diff --git a/buildSrc/private/src/main/kotlin/androidx/build/Ktfmt.kt b/buildSrc/private/src/main/kotlin/androidx/build/Ktfmt.kt
index 48820b4c..79d8dd1 100644
--- a/buildSrc/private/src/main/kotlin/androidx/build/Ktfmt.kt
+++ b/buildSrc/private/src/main/kotlin/androidx/build/Ktfmt.kt
@@ -137,7 +137,17 @@
         // To hack around https://github.com/facebook/ktfmt/issues/406 we rewrite all the
         // @sample tags to ####### so that ktfmt would not move them around. We then
         // rewrite it back when returning the formatted code.
-        val originCode = input.readText().replace(SAMPLE, PLACEHOLDER)
+        // We also want to ensure the class name is always on the same line as the @sample tag, as
+        // otherwise, the class won't be linked to the tag, so make the class name shorter. For now,
+        // we only have to do this for the NavigationSuiteScaffold.kt class
+        val originCode =
+            input
+                .readText()
+                .replace(SAMPLE, PLACEHOLDER)
+                .replace(
+                    "$PLACEHOLDER androidx.compose.material3.adaptive.navigationsuite.samples.",
+                    "$PLACEHOLDER material3.adaptive.navigationsuite.samples."
+                )
         val formattedCode = format(Formatter.KOTLINLANG_FORMAT, originCode)
         return KtfmtResult(
             input = input,
diff --git a/compose/animation/animation-core-lint/src/main/java/androidx/compose/animation/core/lint/AnimationCoreIssueRegistry.kt b/compose/animation/animation-core-lint/src/main/java/androidx/compose/animation/core/lint/AnimationCoreIssueRegistry.kt
index a73e703..98ce6b0 100644
--- a/compose/animation/animation-core-lint/src/main/java/androidx/compose/animation/core/lint/AnimationCoreIssueRegistry.kt
+++ b/compose/animation/animation-core-lint/src/main/java/androidx/compose/animation/core/lint/AnimationCoreIssueRegistry.kt
@@ -20,21 +20,23 @@
 import com.android.tools.lint.client.api.Vendor
 import com.android.tools.lint.detector.api.CURRENT_API
 
-/**
- * [IssueRegistry] containing animation-core specific lint issues.
- */
+/** [IssueRegistry] containing animation-core specific lint issues. */
 class AnimationCoreIssueRegistry : IssueRegistry() {
     // Tests are run with this version. We ensure that with ApiLintVersionsTest
     override val api = 14
     override val minApi = CURRENT_API
-    override val issues get() = listOf(
-        TransitionDetector.UnusedTransitionTargetStateParameter,
-        UnrememberedAnimatableDetector.UnrememberedAnimatable,
-        ArcAnimationSpecTypeDetector.ArcAnimationSpecTypeIssue
-    )
-    override val vendor = Vendor(
-        vendorName = "Jetpack Compose",
-        identifier = "androidx.compose.animation.core",
-        feedbackUrl = "https://issuetracker.google.com/issues/new?component=612128"
-    )
+    override val issues
+        get() =
+            listOf(
+                TransitionDetector.UnusedTransitionTargetStateParameter,
+                UnrememberedAnimatableDetector.UnrememberedAnimatable,
+                ArcAnimationSpecTypeDetector.ArcAnimationSpecTypeIssue
+            )
+
+    override val vendor =
+        Vendor(
+            vendorName = "Jetpack Compose",
+            identifier = "androidx.compose.animation.core",
+            feedbackUrl = "https://issuetracker.google.com/issues/new?component=612128"
+        )
 }
diff --git a/compose/animation/animation-core-lint/src/main/java/androidx/compose/animation/core/lint/ArcAnimationSpecTypeDetector.kt b/compose/animation/animation-core-lint/src/main/java/androidx/compose/animation/core/lint/ArcAnimationSpecTypeDetector.kt
index cfdaf85..dcd22ba 100644
--- a/compose/animation/animation-core-lint/src/main/java/androidx/compose/animation/core/lint/ArcAnimationSpecTypeDetector.kt
+++ b/compose/animation/animation-core-lint/src/main/java/androidx/compose/animation/core/lint/ArcAnimationSpecTypeDetector.kt
@@ -31,6 +31,7 @@
 import java.util.EnumSet
 import org.jetbrains.uast.UCallExpression
 import org.jetbrains.uast.UClass
+
 private const val ANIMATION_CORE_PACKAGE = "androidx.compose.animation.core"
 private const val GEOMETRY_PACKAGE = "androidx.compose.ui.geometry"
 private const val UNIT_PACKAGE = "androidx.compose.ui.unit"
@@ -39,74 +40,76 @@
 private const val OFFSET_NAME = "Offset"
 private const val INT_OFFSET_NAME = "IntOffset"
 private const val DP_OFFSET_NAME = "DpOffset"
-private const val ARC_SPEC_FQ_NAME =
-    "$ANIMATION_CORE_PACKAGE.$ARC_ANIMATION_SPEC_NAME"
-private const val OFFSET_FQ_NAME =
-    "$GEOMETRY_PACKAGE.$OFFSET_NAME"
-private const val INT_OFFSET_FQ_NAME =
-    "$UNIT_PACKAGE.$INT_OFFSET_NAME"
-private const val DP_OFFSET_FQ_NAME =
-    "$UNIT_PACKAGE.$DP_OFFSET_NAME"
-private val preferredArcAnimationTypes by lazy(LazyThreadSafetyMode.NONE) {
-    setOf(
-        OFFSET_FQ_NAME,
-        INT_OFFSET_FQ_NAME,
-        DP_OFFSET_FQ_NAME
-    )
-}
+private const val ARC_SPEC_FQ_NAME = "$ANIMATION_CORE_PACKAGE.$ARC_ANIMATION_SPEC_NAME"
+private const val OFFSET_FQ_NAME = "$GEOMETRY_PACKAGE.$OFFSET_NAME"
+private const val INT_OFFSET_FQ_NAME = "$UNIT_PACKAGE.$INT_OFFSET_NAME"
+private const val DP_OFFSET_FQ_NAME = "$UNIT_PACKAGE.$DP_OFFSET_NAME"
+private val preferredArcAnimationTypes by
+    lazy(LazyThreadSafetyMode.NONE) { setOf(OFFSET_FQ_NAME, INT_OFFSET_FQ_NAME, DP_OFFSET_FQ_NAME) }
+
 /**
  * Lint to inform of the expected usage for `ArcAnimationSpec` (and its derivative)
  * `keyframesWithArcs`.
  */
 class ArcAnimationSpecTypeDetector : Detector(), SourceCodeScanner {
     override fun getApplicableUastTypes() = listOf(UCallExpression::class.java)
-    override fun createUastHandler(context: JavaContext) = object : UElementHandler() {
-        override fun visitCallExpression(node: UCallExpression) {
-            when (node.classReference?.resolvedName) {
-                ARC_ANIMATION_SPEC_NAME -> detectTypeParameterInArcAnimation(node)
+
+    override fun createUastHandler(context: JavaContext) =
+        object : UElementHandler() {
+            override fun visitCallExpression(node: UCallExpression) {
+                when (node.classReference?.resolvedName) {
+                    ARC_ANIMATION_SPEC_NAME -> detectTypeParameterInArcAnimation(node)
+                }
+            }
+
+            private fun detectTypeParameterInArcAnimation(node: UCallExpression) {
+                val typeArg = node.typeArguments.firstOrNull() ?: return
+                val qualifiedTypeName = typeArg.canonicalText
+                // Check that the given type to the call is one of: Offset, IntOffset, DpOffset
+                if (preferredArcAnimationTypes.contains(qualifiedTypeName)) {
+                    return
+                }
+                // Node class resolution might be slower, do last
+                val fqClassName =
+                    (node.classReference?.tryResolveUDeclaration() as? UClass)?.qualifiedName
+                // Verify that the method calls are from the expected animation classes, otherwise,
+                // skip
+                // check
+                if (fqClassName != ARC_SPEC_FQ_NAME) {
+                    return
+                }
+                // Generate Lint
+                context.report(
+                    issue = ArcAnimationSpecTypeIssue,
+                    scope = node,
+                    location = context.getNameLocation(node),
+                    message =
+                        "Arc animation is intended for 2D values such as Offset, IntOffset or " +
+                            "DpOffset.\nOtherwise, the animation might not be what you expect."
+                )
             }
         }
-        private fun detectTypeParameterInArcAnimation(node: UCallExpression) {
-            val typeArg = node.typeArguments.firstOrNull() ?: return
-            val qualifiedTypeName = typeArg.canonicalText
-            // Check that the given type to the call is one of: Offset, IntOffset, DpOffset
-            if (preferredArcAnimationTypes.contains(qualifiedTypeName)) {
-                return
-            }
-            // Node class resolution might be slower, do last
-            val fqClassName =
-                (node.classReference?.tryResolveUDeclaration() as? UClass)?.qualifiedName
-            // Verify that the method calls are from the expected animation classes, otherwise, skip
-            // check
-            if (fqClassName != ARC_SPEC_FQ_NAME) {
-                return
-            }
-            // Generate Lint
-            context.report(
-                issue = ArcAnimationSpecTypeIssue,
-                scope = node,
-                location = context.getNameLocation(node),
-                message = "Arc animation is intended for 2D values such as Offset, IntOffset or " +
-                    "DpOffset.\nOtherwise, the animation might not be what you expect."
-            )
-        }
-    }
+
     companion object {
-        val ArcAnimationSpecTypeIssue = Issue.create(
-            id = "ArcAnimationSpecTypeIssue",
-            briefDescription = "$ARC_ANIMATION_SPEC_NAME is " +
-                "designed for 2D values. Particularly, for positional values such as Offset.",
-            explanation = "$ARC_ANIMATION_SPEC_NAME is designed for" +
-                " 2D values. Particularly, for positional values such as Offset.\nTrying to use " +
-                "it for values of different dimensions (Float, Size, Color, etc.) will result " +
-                "in unpredictable animation behavior.",
-            category = Category.CORRECTNESS,
-            priority = 5,
-            severity = Severity.INFORMATIONAL,
-            implementation = Implementation(
-                ArcAnimationSpecTypeDetector::class.java,
-                EnumSet.of(Scope.JAVA_FILE)
+        val ArcAnimationSpecTypeIssue =
+            Issue.create(
+                id = "ArcAnimationSpecTypeIssue",
+                briefDescription =
+                    "$ARC_ANIMATION_SPEC_NAME is " +
+                        "designed for 2D values. Particularly, for positional values such as Offset.",
+                explanation =
+                    "$ARC_ANIMATION_SPEC_NAME is designed for" +
+                        " 2D values. Particularly, for positional values such as Offset.\nTrying to use " +
+                        "it for values of different dimensions (Float, Size, Color, etc.) will result " +
+                        "in unpredictable animation behavior.",
+                category = Category.CORRECTNESS,
+                priority = 5,
+                severity = Severity.INFORMATIONAL,
+                implementation =
+                    Implementation(
+                        ArcAnimationSpecTypeDetector::class.java,
+                        EnumSet.of(Scope.JAVA_FILE)
+                    )
             )
-        )
     }
 }
diff --git a/compose/animation/animation-core-lint/src/main/java/androidx/compose/animation/core/lint/TransitionDetector.kt b/compose/animation/animation-core-lint/src/main/java/androidx/compose/animation/core/lint/TransitionDetector.kt
index 656461a..0abea67 100644
--- a/compose/animation/animation-core-lint/src/main/java/androidx/compose/animation/core/lint/TransitionDetector.kt
+++ b/compose/animation/animation-core-lint/src/main/java/androidx/compose/animation/core/lint/TransitionDetector.kt
@@ -38,77 +38,80 @@
 
 /**
  * [Detector] that checks `Transition` usages for correctness.
- *
- * - Transition animate functions (such as animateFloat) provide a `targetValueByState` lambda
- * that contains a `state` parameter containing the state to get the value for. It is always an
- * error to not use this parameter, so this detector ensures that the parameter is always at
- * least referenced, preventing common errors such as:
- * `transition.animateFloat { if (someOtherState) 0f else 1f }`
+ * - Transition animate functions (such as animateFloat) provide a `targetValueByState` lambda that
+ *   contains a `state` parameter containing the state to get the value for. It is always an error
+ *   to not use this parameter, so this detector ensures that the parameter is always at least
+ *   referenced, preventing common errors such as: `transition.animateFloat { if (someOtherState) 0f
+ *   else 1f }`
  */
 class TransitionDetector : Detector(), SourceCodeScanner {
     override fun getApplicableUastTypes() = listOf(UCallExpression::class.java)
 
-    override fun createUastHandler(context: JavaContext) = object : UElementHandler() {
-        override fun visitCallExpression(node: UCallExpression) {
-            val method = node.resolve() ?: return
-            // Ignore if this isn't an extension on Transition that starts with `animate`
-            val receiverType = node.receiverType as? PsiClassReferenceType ?: return
-            if (!receiverType.rawType().equalsToText(Transition.javaFqn)) return
-            if (node.methodName?.startsWith("animate") != true) return
+    override fun createUastHandler(context: JavaContext) =
+        object : UElementHandler() {
+            override fun visitCallExpression(node: UCallExpression) {
+                val method = node.resolve() ?: return
+                // Ignore if this isn't an extension on Transition that starts with `animate`
+                val receiverType = node.receiverType as? PsiClassReferenceType ?: return
+                if (!receiverType.rawType().equalsToText(Transition.javaFqn)) return
+                if (node.methodName?.startsWith("animate") != true) return
 
-            // Our heuristic looks for lambda parameters with `(S) -> *`, this should catch all
-            // similar methods with (as of yet) no false positives.
-            val matchingLambdaArguments = node.valueArguments
-                .filterIsInstance<ULambdaExpression>()
-                .filter { argument ->
-                    val parameters = argument.valueParameters
-                    if (parameters.size != 1) return@filter false
-                    val parameter = parameters.first()
-                    // If the type is a primitive, the generic type on Transition will be the
-                    // Boxed version, but the type of the lambda argument is most likely the
-                    // primitive type
-                    val boxedType = when (val type = parameter.type) {
-                        is PsiPrimitiveType -> type.getBoxedType(method)
-                        else -> type
+                // Our heuristic looks for lambda parameters with `(S) -> *`, this should catch all
+                // similar methods with (as of yet) no false positives.
+                val matchingLambdaArguments =
+                    node.valueArguments.filterIsInstance<ULambdaExpression>().filter { argument ->
+                        val parameters = argument.valueParameters
+                        if (parameters.size != 1) return@filter false
+                        val parameter = parameters.first()
+                        // If the type is a primitive, the generic type on Transition will be the
+                        // Boxed version, but the type of the lambda argument is most likely the
+                        // primitive type
+                        val boxedType =
+                            when (val type = parameter.type) {
+                                is PsiPrimitiveType -> type.getBoxedType(method)
+                                else -> type
+                            }
+                        boxedType == receiverType.parameters[0]
                     }
-                    boxedType == receiverType.parameters[0]
-                }
 
-            // Make sure that the parameter (S) is referenced inside the lambda body.
-            matchingLambdaArguments.forEach { lambda ->
-                lambda.findUnreferencedParameters().forEach { unreferencedParameter ->
-                    val location = unreferencedParameter.parameter
-                        ?.let { context.getLocation(it) }
-                        ?: context.getLocation(lambda)
-                    val name = unreferencedParameter.name
-                    context.report(
-                        UnusedTransitionTargetStateParameter,
-                        node,
-                        location,
-                        "Target state parameter `$name` is not used"
-                    )
+                // Make sure that the parameter (S) is referenced inside the lambda body.
+                matchingLambdaArguments.forEach { lambda ->
+                    lambda.findUnreferencedParameters().forEach { unreferencedParameter ->
+                        val location =
+                            unreferencedParameter.parameter?.let { context.getLocation(it) }
+                                ?: context.getLocation(lambda)
+                        val name = unreferencedParameter.name
+                        context.report(
+                            UnusedTransitionTargetStateParameter,
+                            node,
+                            location,
+                            "Target state parameter `$name` is not used"
+                        )
+                    }
                 }
             }
         }
-    }
 
     companion object {
-        val UnusedTransitionTargetStateParameter = Issue.create(
-            "UnusedTransitionTargetStateParameter",
-            "Transition.animate* calls should use the provided targetState when defining values",
-            "Transition.animate* functions provide a target state parameter in the lambda that " +
-                "will be used to calculate the value for a given state. This target state " +
-                "parameter in the lambda may or may not be the same as the actual state, as the" +
-                " animation system occasionally needs to look up target values for other states " +
-                "to do proper seeking/tooling preview. Relying on other state than the provided " +
-                "`targetState` could also result in unnecessary recompositions. Therefore, it is " +
-                "generally considered an error if this `targetState` parameter is not used.",
-            Category.CORRECTNESS, 3, Severity.ERROR,
-            Implementation(
-                TransitionDetector::class.java,
-                EnumSet.of(Scope.JAVA_FILE, Scope.TEST_SOURCES)
+        val UnusedTransitionTargetStateParameter =
+            Issue.create(
+                "UnusedTransitionTargetStateParameter",
+                "Transition.animate* calls should use the provided targetState when defining values",
+                "Transition.animate* functions provide a target state parameter in the lambda that " +
+                    "will be used to calculate the value for a given state. This target state " +
+                    "parameter in the lambda may or may not be the same as the actual state, as the" +
+                    " animation system occasionally needs to look up target values for other states " +
+                    "to do proper seeking/tooling preview. Relying on other state than the provided " +
+                    "`targetState` could also result in unnecessary recompositions. Therefore, it is " +
+                    "generally considered an error if this `targetState` parameter is not used.",
+                Category.CORRECTNESS,
+                3,
+                Severity.ERROR,
+                Implementation(
+                    TransitionDetector::class.java,
+                    EnumSet.of(Scope.JAVA_FILE, Scope.TEST_SOURCES)
+                )
             )
-        )
     }
 }
 
diff --git a/compose/animation/animation-core-lint/src/main/java/androidx/compose/animation/core/lint/UnrememberedAnimatableDetector.kt b/compose/animation/animation-core-lint/src/main/java/androidx/compose/animation/core/lint/UnrememberedAnimatableDetector.kt
index 16dfcd4..2a4f0bc 100644
--- a/compose/animation/animation-core-lint/src/main/java/androidx/compose/animation/core/lint/UnrememberedAnimatableDetector.kt
+++ b/compose/animation/animation-core-lint/src/main/java/androidx/compose/animation/core/lint/UnrememberedAnimatableDetector.kt
@@ -43,49 +43,53 @@
 class UnrememberedAnimatableDetector : Detector(), SourceCodeScanner {
     override fun getApplicableUastTypes() = listOf(UCallExpression::class.java)
 
-    override fun createUastHandler(context: JavaContext) = object : UElementHandler() {
-        override fun visitCallExpression(node: UCallExpression) {
-            val method = node.resolve() ?: return
+    override fun createUastHandler(context: JavaContext) =
+        object : UElementHandler() {
+            override fun visitCallExpression(node: UCallExpression) {
+                val method = node.resolve() ?: return
 
-            // Match calls to constructor, and top level 'factory' functions named Animatable
-            // that return Animatable (this is needed as we have Animatable() factory functions
-            // in separate modules for different types, and developers could create their own as
-            // well).
-            if (node.isConstructorCall()) {
-                if (!method.isInPackageName(Names.AnimationCore.PackageName)) return
-                if (method.containingClass?.name != Animatable.shortName) return
-            } else {
-                if (node.methodName != Animatable.shortName) return
-                val returnType = method.returnType as? PsiClassReferenceType ?: return
-                // Raw type since we want to ignore generic typing
-                if (!returnType.rawType().equalsToText(Animatable.javaFqn)) return
-            }
+                // Match calls to constructor, and top level 'factory' functions named Animatable
+                // that return Animatable (this is needed as we have Animatable() factory functions
+                // in separate modules for different types, and developers could create their own as
+                // well).
+                if (node.isConstructorCall()) {
+                    if (!method.isInPackageName(Names.AnimationCore.PackageName)) return
+                    if (method.containingClass?.name != Animatable.shortName) return
+                } else {
+                    if (node.methodName != Animatable.shortName) return
+                    val returnType = method.returnType as? PsiClassReferenceType ?: return
+                    // Raw type since we want to ignore generic typing
+                    if (!returnType.rawType().equalsToText(Animatable.javaFqn)) return
+                }
 
-            if (node.isNotRemembered()) {
-                context.report(
-                    UnrememberedAnimatable,
-                    node,
-                    context.getNameLocation(node),
-                    "Creating an Animatable during composition without using `remember`"
-                )
+                if (node.isNotRemembered()) {
+                    context.report(
+                        UnrememberedAnimatable,
+                        node,
+                        context.getNameLocation(node),
+                        "Creating an Animatable during composition without using `remember`"
+                    )
+                }
             }
         }
-    }
 
     companion object {
-        val UnrememberedAnimatable = Issue.create(
-            "UnrememberedAnimatable",
-            "Creating an Animatable during composition without using `remember`",
-            "Animatable instances created during composition need to be `remember`ed, " +
-                "otherwise they will be recreated during recomposition, and lose their state. " +
-                "Either hoist the Animatable to an object that is not created during composition," +
-                " or wrap the Animatable in a call to `remember`.",
-            Category.CORRECTNESS, 3, Severity.ERROR,
-            Implementation(
-                UnrememberedAnimatableDetector::class.java,
-                EnumSet.of(Scope.JAVA_FILE, Scope.TEST_SOURCES)
+        val UnrememberedAnimatable =
+            Issue.create(
+                "UnrememberedAnimatable",
+                "Creating an Animatable during composition without using `remember`",
+                "Animatable instances created during composition need to be `remember`ed, " +
+                    "otherwise they will be recreated during recomposition, and lose their state. " +
+                    "Either hoist the Animatable to an object that is not created during composition," +
+                    " or wrap the Animatable in a call to `remember`.",
+                Category.CORRECTNESS,
+                3,
+                Severity.ERROR,
+                Implementation(
+                    UnrememberedAnimatableDetector::class.java,
+                    EnumSet.of(Scope.JAVA_FILE, Scope.TEST_SOURCES)
+                )
             )
-        )
     }
 }
 
diff --git a/compose/animation/animation-core-lint/src/test/java/androidx/compose/animation/core/lint/ArcAnimationSpecTypeDetectorTest.kt b/compose/animation/animation-core-lint/src/test/java/androidx/compose/animation/core/lint/ArcAnimationSpecTypeDetectorTest.kt
index fda5093..f3b993c 100644
--- a/compose/animation/animation-core-lint/src/test/java/androidx/compose/animation/core/lint/ArcAnimationSpecTypeDetectorTest.kt
+++ b/compose/animation/animation-core-lint/src/test/java/androidx/compose/animation/core/lint/ArcAnimationSpecTypeDetectorTest.kt
@@ -39,11 +39,13 @@
         mutableListOf(ArcAnimationSpecTypeDetector.ArcAnimationSpecTypeIssue)
 
     // Simplified version of Arc animation classes in AnimationSpec.kt
-    private val ArcAnimationSpecStub = bytecodeStub(
-        filename = "AnimationSpec.kt",
-        filepath = "androidx/compose/animation/core",
-        checksum = 0x9d0cdf8f,
-        source = """
+    private val ArcAnimationSpecStub =
+        bytecodeStub(
+            filename = "AnimationSpec.kt",
+            filepath = "androidx/compose/animation/core",
+            checksum = 0x9d0cdf8f,
+            source =
+                """
             package androidx.compose.animation.core
 
             class ArcAnimationSpec<T>(val mode: ArcMode, val durationMillis: Int = 400)
@@ -52,12 +54,12 @@
 
             object ArcAbove : ArcMode()
         """,
-        """
+            """
                 META-INF/main.kotlin_module:
                 H4sIAAAAAAAA/2NgYGBmYGBgBGJOBijg4uViTsvPF2ILSS0u8S5RYtBiAACf
                 q36HJwAAAA==
                 """,
-        """
+            """
                 androidx/compose/animation/core/ArcAbove.class:
                 H4sIAAAAAAAA/41SS2/TQBD+1knzhqbllVDe5ZH0gJuKWyukEECylORAqkio
                 p42zwDb2brXeRD3mxA/hH1QcKoGEIrjxoxCzJoUDl9jyzM4333yzM/LPX1++
@@ -72,7 +74,7 @@
                 f4X39hyXP2PjLAU8PEztXTxKf22GK9T06hEyAa4FuB5QaY2OqAe4ia0jsAS3
                 cJvyCcoJ7iTI/QY7flqdFwMAAA==
                 """,
-        """
+            """
                 androidx/compose/animation/core/ArcAnimationSpec.class:
                 H4sIAAAAAAAA/5VSS28TVxT+7vg1HgyMXUKCCRQID8cujONCH5gipSCkkeyA
                 cJRNurkZ35obj2eiudcRqyo/odtuWbMACUTVRRV12R9V9Vx7EvLowt3c87jf
@@ -94,7 +96,7 @@
                 JJ8T5iZhbm0i4+O2jzs+algmFXUfDXy1CaZwF/c2UVJYVPAUmgpFhQsK8xO9
                 oHBDYUnhmsL1fwEMDsmpAwYAAA==
                 """,
-        """
+            """
                 androidx/compose/animation/core/ArcMode.class:
                 H4sIAAAAAAAA/5VRXWsTQRQ9s9lu0jW229aP1O+KYFOx2xbRh4oQK0IgUbCS
                 lzzIZDPqJLszZXY29DH4U/wHfRJ8kNBHf5R4Z5Pia4Xlfpwz596Zs7///PwF
@@ -108,25 +110,27 @@
                 QiBiVF1ZiJ9S9hbi+llpoxPcmINzQVldxUp59EG54A62KL8gZJW4qI9KG2tt
                 rLexgWtU4nqbZtzsg+VoYLMPP0eY41aOIMftv/zlm/jsAgAA
                 """
-    )
+        )
 
     // Simplified version of Offset.kt in geometry package
-    private val GeometryStub = bytecodeStub(
-        filename = "Offset.kt",
-        filepath = "androidx/compose/ui/geometry",
-        checksum = 0x471b639e,
-        source = """
+    private val GeometryStub =
+        bytecodeStub(
+            filename = "Offset.kt",
+            filepath = "androidx/compose/ui/geometry",
+            checksum = 0x471b639e,
+            source =
+                """
             package androidx.compose.ui.geometry
 
             class Offset
         """,
-        """
+            """
                 META-INF/main.kotlin_module:
                 H4sIAAAAAAAA/2NgYGBmYGBgBGIOBijgMuKST8xLKcrPTKnQS87PLcgvTtVL
                 zMvMTSzJzM8DihSlCvE7wvjBBanJ3iVcvFzMafn5QmwhqcUl3iVKDFoMAHnM
                 zO9bAAAA
                 """,
-        """
+            """
                 androidx/compose/ui/geometry/Offset.class:
                 H4sIAAAAAAAA/41RzS5DQRg937S9uIr6r9+NSLBwETsiQSJpUiRIN1bT3sFo
                 74zcmQq7Pos3sJJYSGPpocR3Lw9gc3J+vpk5M/P1/f4BYBdLhBVp4tTq+Clq
@@ -138,27 +142,29 @@
                 MM8XcpzFYv5RhGHOytco1DBSw2gNY6gwxXgNE5i8BjlMYZpzh9BhxiH4AWXo
                 H/7lAQAA
                 """
-    )
+        )
 
     // Simplified classes of ui/unit package
-    private val UnitStub = bytecodeStub(
-        filename = "Units.kt",
-        filepath = "androidx/compose/ui/unit",
-        checksum = 0x137591fb,
-        source = """
+    private val UnitStub =
+        bytecodeStub(
+            filename = "Units.kt",
+            filepath = "androidx/compose/ui/unit",
+            checksum = 0x137591fb,
+            source =
+                """
             package androidx.compose.ui.unit
 
             class IntOffset
 
             class DpOffset
         """,
-        """
+            """
                 META-INF/main.kotlin_module:
                 H4sIAAAAAAAA/2NgYGBmYGBgBGIOBijgMuKST8xLKcrPTKnQS87PLcgvTtVL
                 zMvMTSzJzM8DihSlCvE7wvjBBanJ3iVcvFzMafn5QmwhqcUl3iVKDFoMAHnM
                 zO9bAAAA
                 """,
-        """
+            """
                 androidx/compose/ui/unit/DpOffset.class:
                 H4sIAAAAAAAA/4VRy0oDMRQ9N7VjHavWd32CuFEXjoo7RfCBUKgKPrpxlXZS
                 jW0TaTList/iH7gSXEhx6UeJd0b3bg7ncZOcJF/f7x8AdrFEWJEm7lodP0cN
@@ -170,7 +176,7 @@
                 8oUMZ7GY/RFhmLPiLXIVjFQwWsEYSkwxXsEEJm9BDlOY5twhdJhxCH4AObkh
                 xeABAAA=
                 """,
-        """
+            """
                 androidx/compose/ui/unit/IntOffset.class:
                 H4sIAAAAAAAA/4VRTS9rQRh+3ml71FHUd3FZiAUWDmJHJEhucpIiwe3Gatoz
                 ZbSdkc4csexv8Q+sJBbS3KUfJd5z2Ns8eT7emXlm5uPz7R3APlYIa9IkfauT
@@ -182,12 +188,14 @@
                 RhHm+XKOC/iT/xJhjLPKDQoxxmNMxJhElSmmYkxj5gbkMIs5zh1Ch3mH4Au3
                 DmZN4gEAAA==
                 """
-    )
+        )
 
     @Test
     fun testPreferredTypeIssue() {
-        lint().files(
-            kotlin("""
+        lint()
+            .files(
+                kotlin(
+                    """
 package foo
 
 import androidx.compose.animation.core.ArcAnimationSpec
@@ -203,12 +211,15 @@
     ArcAnimationSpec<Float>(ArcAbove)
     ArcAnimationSpec<String>(ArcAbove)
 }
-            """),
-            ArcAnimationSpecStub,
-            GeometryStub,
-            UnitStub
-        ).run()
-            .expect("""src/foo/test.kt:14: Information: Arc animation is intended for 2D values such as Offset, IntOffset or DpOffset.
+            """
+                ),
+                ArcAnimationSpecStub,
+                GeometryStub,
+                UnitStub
+            )
+            .run()
+            .expect(
+                """src/foo/test.kt:14: Information: Arc animation is intended for 2D values such as Offset, IntOffset or DpOffset.
 Otherwise, the animation might not be what you expect. [ArcAnimationSpecTypeIssue]
     ArcAnimationSpec<Float>(ArcAbove)
     ~~~~~~~~~~~~~~~~
@@ -216,6 +227,7 @@
 Otherwise, the animation might not be what you expect. [ArcAnimationSpecTypeIssue]
     ArcAnimationSpec<String>(ArcAbove)
     ~~~~~~~~~~~~~~~~
-0 errors, 0 warnings""")
+0 errors, 0 warnings"""
+            )
     }
 }
diff --git a/compose/animation/animation-core-lint/src/test/java/androidx/compose/animation/core/lint/TransitionDetectorTest.kt b/compose/animation/animation-core-lint/src/test/java/androidx/compose/animation/core/lint/TransitionDetectorTest.kt
index 7eb3408..1c044dd 100644
--- a/compose/animation/animation-core-lint/src/test/java/androidx/compose/animation/core/lint/TransitionDetectorTest.kt
+++ b/compose/animation/animation-core-lint/src/test/java/androidx/compose/animation/core/lint/TransitionDetectorTest.kt
@@ -30,9 +30,7 @@
 /* ktlint-disable max-line-length */
 @RunWith(JUnit4::class)
 
-/**
- * Test for [TransitionDetector].
- */
+/** Test for [TransitionDetector]. */
 class TransitionDetectorTest : LintDetectorTest() {
     override fun getDetector(): Detector = TransitionDetector()
 
@@ -40,11 +38,12 @@
         mutableListOf(TransitionDetector.UnusedTransitionTargetStateParameter)
 
     // Simplified Transition.kt stubs
-    private val TransitionStub = bytecodeStub(
-        filename = "Transition.kt",
-        filepath = "androidx/compose/animation/core",
-        checksum = 0x7997109d,
-        """
+    private val TransitionStub =
+        bytecodeStub(
+            filename = "Transition.kt",
+            filepath = "androidx/compose/animation/core",
+            checksum = 0x7997109d,
+            """
             package androidx.compose.animation.core
 
             import androidx.compose.runtime.Composable
@@ -60,13 +59,13 @@
                 targetValueByState: @Composable (state: S) -> Float
             ): Float = 5f
         """,
-"""
+            """
         META-INF/main.kotlin_module:
         H4sIAAAAAAAA/2NgYGBmYGBgBGJOBijg0ueST8xLKcrPTKnQS87PLcgvTtVL
         zMvMTSzJzM8DihSlCvGEFCXmFWeCBLxLuHi5mNPy84XYQlKLS7xLlBi0GAD5
         +CagWAAAAA==
         """,
-        """
+            """
         androidx/compose/animation/core/Transition＄Segment.class:
         H4sIAAAAAAAA/5VRTW/TQBB9u3bixnWpW74SvqGVKDngNqqEBFUlqIRkyYCE
         q1xy2sSrdBt7jbybqsf8Fv4BJyQOKOLIj0KMTSQkuMDlzbw3M7tvZ7//+PIV
@@ -80,7 +79,7 @@
         wQ7FZ1QPaGZjBCfGlRibMUJsUYrtGFdxbQRmcB03RnAN1g1uGnQNvJ/VVf1q
         rwIAAA==
         """,
-        """
+            """
         androidx/compose/animation/core/Transition.class:
         H4sIAAAAAAAA/41RTW/TQBB9u3HsxE1bt3wlfEN7KBHCbcQpVJWgEpIlAxKu
         cslpE6/Sbew18m6qHvNb+AeckDigiCM/CjE2kZDgUll6M+/tvNnZ8c9f374D
@@ -94,7 +93,7 @@
         Wsf72KM4pPMOeTbHaETYirAdIcAOpdiNcAM3x2AGt3B7jKbBhsEdg66BZ9D7
         DXTP2E6vAgAA
         """,
-        """
+            """
         androidx/compose/animation/core/TransitionKt＄animateFloat＄1.class:
         H4sIAAAAAAAA/81WX1MbVRT/3U0gyZLyJ6V/AEUssYWAXYLYKkmxkRJZCSk2
         kRmHp5vkNixs7nZ2Nxl846EfwU/gJ2h1xjo64zA++qEcz91sKbHRFnzxIfee
@@ -120,7 +119,7 @@
         xhrBTnBv4Cu6/xdti0cUySqleJu+XGMPERNLJrImlvGRSf9/PjZxB3f3wDx8
         gk/3MOBh1UPOQ97DlEfFrhB+mPBF+nwR6G3+BSprltw9CQAA
         """,
-        """
+            """
         androidx/compose/animation/core/TransitionKt.class:
         H4sIAAAAAAAA/8VWz1PbVhD+nizbsjFgFKDgJG5KnAQIRMZQt40dGkKhqDFO
         pqZcOHQe9sMRyBIjyUxy6dBe+g/0klunhx576CnTQ4ch00v/pk6nK2EbgztD
@@ -149,13 +148,14 @@
         8oe0wSXMj3aQdOlR4GMXn7i44UJ18dBFIVhRXBRdjAbyuItHLpZdfPoPx8wC
         mQAKAAA=
         """
-    )
+        )
 
     @Test
     fun unreferencedParameters() {
-        lint().files(
-            kotlin(
-                """
+        lint()
+            .files(
+                kotlin(
+                    """
                 package foo
 
                 import androidx.compose.animation.core.*
@@ -175,10 +175,10 @@
                     transition.animateFloat(targetValueByState = { _ -> if (foo) 1f else 0f })
                 }
             """
-            ),
-            TransitionStub,
-            Stubs.Composable
-        )
+                ),
+                TransitionStub,
+                Stubs.Composable
+            )
             .run()
             .expect(
                 """
@@ -207,9 +207,10 @@
 
     @Test
     fun unreferencedParameter_shadowedNames() {
-        lint().files(
-            kotlin(
-                """
+        lint()
+            .files(
+                kotlin(
+                    """
                 package foo
 
                 import androidx.compose.animation.core.*
@@ -239,10 +240,10 @@
                     }
                 }
             """
-            ),
-            TransitionStub,
-            Stubs.Composable
-        )
+                ),
+                TransitionStub,
+                Stubs.Composable
+            )
             .run()
             .expect(
                 """
@@ -259,9 +260,10 @@
 
     @Test
     fun noErrors() {
-        lint().files(
-            kotlin(
-                """
+        lint()
+            .files(
+                kotlin(
+                    """
             package foo
 
             import androidx.compose.animation.core.*
@@ -312,10 +314,10 @@
                 }
             }
         """
-            ),
-            TransitionStub,
-            Stubs.Composable
-        )
+                ),
+                TransitionStub,
+                Stubs.Composable
+            )
             .run()
             .expectClean()
     }
diff --git a/compose/animation/animation-core-lint/src/test/java/androidx/compose/animation/core/lint/UnrememberedAnimatableDetectorTest.kt b/compose/animation/animation-core-lint/src/test/java/androidx/compose/animation/core/lint/UnrememberedAnimatableDetectorTest.kt
index e852ff7..715608e 100644
--- a/compose/animation/animation-core-lint/src/test/java/androidx/compose/animation/core/lint/UnrememberedAnimatableDetectorTest.kt
+++ b/compose/animation/animation-core-lint/src/test/java/androidx/compose/animation/core/lint/UnrememberedAnimatableDetectorTest.kt
@@ -31,9 +31,7 @@
 /* ktlint-disable max-line-length */
 @RunWith(JUnit4::class)
 
-/**
- * Test for [UnrememberedAnimatableDetector].
- */
+/** Test for [UnrememberedAnimatableDetector]. */
 class UnrememberedAnimatableDetectorTest : LintDetectorTest() {
     override fun getDetector(): Detector = UnrememberedAnimatableDetector()
 
@@ -41,11 +39,12 @@
         mutableListOf(UnrememberedAnimatableDetector.UnrememberedAnimatable)
 
     // Simplified Animatable Color function stub, from androidx.compose.animation
-    private val AnimatableColorStub = bytecodeStub(
-        filename = "SingleValueAnimation.kt",
-        filepath = "androidx/compose/animation",
-        checksum = 0x98c0a447,
-        """
+    private val AnimatableColorStub =
+        bytecodeStub(
+            filename = "SingleValueAnimation.kt",
+            filepath = "androidx/compose/animation",
+            checksum = 0x98c0a447,
+            """
             package androidx.compose.animation
 
             import androidx.compose.animation.core.Animatable
@@ -53,14 +52,14 @@
 
             fun Animatable(initialValue: Color): Animatable<Color, Any> = Animatable(initialValue)
         """,
-"""
+            """
         META-INF/main.kotlin_module:
         H4sIAAAAAAAA/3XLvQvCQAwF8IiiGEThBhERBBfBoS6Cszh2s+KetqE9uI9y
         TcE/3xN1KgZehsf7AcAQAAYxU/gennBNrgxel8+k8LbxLSfktCXR3qllpl1l
         +EGm48uvTQWPuP2vYhNYzT57yg1HcMZVD4TOibas8MaWbc4hFbXIHDVt7SUT
         kjfc46YHO51UgZpaF62aXL3xUeIcR8KtqPE9/lR2cIAXLlZThPEAAAA=
         """,
-        """
+            """
         androidx/compose/animation/SingleValueAnimationKt.class:
         H4sIAAAAAAAA/5VTXU8TQRQ9s223Za20VFEoigooHwLTEh8wJUSCMSkWTMQ0
         MTyYaTvWabczZHa24ZH4T/QX+CbRxBB880cZZ1sIiSUKD3vn3Dvnzv3cX7+/
@@ -78,13 +77,14 @@
         YGN7iJUxXka+jAncKeMuJsu4h/t7IAEeYGoPyQDTAWYCPAzwKMBogEQA9w+x
         P7r8kQQAAA==
         """
-    )
+        )
 
     @Test
     fun notRemembered() {
-        lint().files(
-            kotlin(
-                """
+        lint()
+            .files(
+                kotlin(
+                    """
                 package test
 
                 import androidx.compose.animation.*
@@ -167,14 +167,14 @@
                     }
                 }
             """
-            ),
-            Stubs.Animatable,
-            AnimatableColorStub,
-            Stubs.Color,
-            Stubs.Composable,
-            Stubs.Remember,
-            Stubs.SnapshotState,
-            Stubs.StateFactoryMarker
+                ),
+                Stubs.Animatable,
+                AnimatableColorStub,
+                Stubs.Color,
+                Stubs.Composable,
+                Stubs.Remember,
+                Stubs.SnapshotState,
+                Stubs.StateFactoryMarker
             )
             .skipTestModes(TestMode.TYPE_ALIAS)
             .run()
@@ -259,9 +259,10 @@
 
     @Test
     fun rememberedInsideComposableBody() {
-        lint().files(
-            kotlin(
-                """
+        lint()
+            .files(
+                kotlin(
+                    """
                 package test
 
                 import androidx.compose.animation.*
@@ -333,24 +334,25 @@
                     }
                 }
             """
-            ),
-            Stubs.Animatable,
-            AnimatableColorStub,
-            Stubs.Color,
-            Stubs.Composable,
-            Stubs.Remember,
-            Stubs.SnapshotState,
-            Stubs.StateFactoryMarker
-        )
+                ),
+                Stubs.Animatable,
+                AnimatableColorStub,
+                Stubs.Color,
+                Stubs.Composable,
+                Stubs.Remember,
+                Stubs.SnapshotState,
+                Stubs.StateFactoryMarker
+            )
             .run()
             .expectClean()
     }
 
     @Test
     fun noErrors() {
-        lint().files(
-            kotlin(
-                """
+        lint()
+            .files(
+                kotlin(
+                    """
                 package test
 
                 import androidx.compose.animation.*
@@ -448,14 +450,14 @@
                     }
                 }
             """
-            ),
-            Stubs.Animatable,
-            AnimatableColorStub,
-            Stubs.Color,
-            Stubs.Composable,
-            Stubs.Remember,
-            Stubs.SnapshotState,
-            Stubs.StateFactoryMarker
+                ),
+                Stubs.Animatable,
+                AnimatableColorStub,
+                Stubs.Color,
+                Stubs.Composable,
+                Stubs.Remember,
+                Stubs.SnapshotState,
+                Stubs.StateFactoryMarker
             )
             .run()
             .expectClean()
diff --git a/compose/animation/animation-core/benchmark/src/androidTest/java/androidx/compose/animation/core/benchmark/AnimationBenchmark.kt b/compose/animation/animation-core/benchmark/src/androidTest/java/androidx/compose/animation/core/benchmark/AnimationBenchmark.kt
index 5f2009a..ecc01b1 100644
--- a/compose/animation/animation-core/benchmark/src/androidTest/java/androidx/compose/animation/core/benchmark/AnimationBenchmark.kt
+++ b/compose/animation/animation-core/benchmark/src/androidTest/java/androidx/compose/animation/core/benchmark/AnimationBenchmark.kt
@@ -40,8 +40,7 @@
 @LargeTest
 @RunWith(AndroidJUnit4::class)
 class AnimationBenchmark {
-    @get:Rule
-    val benchmarkRule = BenchmarkRule()
+    @get:Rule val benchmarkRule = BenchmarkRule()
 
     @Test
     fun animationSpec1D() {
@@ -128,13 +127,16 @@
     fun animationSpec4D() {
         val start = AnimationVector4D(0f, 0f, 0f, 0f)
         val end = AnimationVector4D(120f, -50f, 256f, 0f)
-        val anim = VectorizedKeyframesSpec<AnimationVector4D>(
-            keyframes = mapOf(
-                0 to (start to LinearEasing),
-                900 to (start to FastOutSlowInEasing), 1000 to (end to LinearOutSlowInEasing)
-            ),
-            durationMillis = 1000
-        )
+        val anim =
+            VectorizedKeyframesSpec<AnimationVector4D>(
+                keyframes =
+                    mapOf(
+                        0 to (start to LinearEasing),
+                        900 to (start to FastOutSlowInEasing),
+                        1000 to (end to LinearOutSlowInEasing)
+                    ),
+                durationMillis = 1000
+            )
 
         benchmarkRule.measureRepeated {
             for (time in 0..1000 step 20) {
@@ -147,13 +149,16 @@
     fun animation4D() {
         val start = AnimationVector4D(0f, 0f, 0f, 0f)
         val end = AnimationVector4D(120f, -50f, 256f, 0f)
-        val anim = VectorizedKeyframesSpec<AnimationVector4D>(
-            keyframes = mapOf(
-                0 to (start to LinearEasing),
-                900 to (start to FastOutSlowInEasing), 1000 to (end to LinearOutSlowInEasing)
-            ),
-            durationMillis = 1000
-        )
+        val anim =
+            VectorizedKeyframesSpec<AnimationVector4D>(
+                keyframes =
+                    mapOf(
+                        0 to (start to LinearEasing),
+                        900 to (start to FastOutSlowInEasing),
+                        1000 to (end to LinearOutSlowInEasing)
+                    ),
+                durationMillis = 1000
+            )
         val fixedAnimation = anim.createAnimation(start, end, start)
 
         benchmarkRule.measureRepeated {
diff --git a/compose/animation/animation-core/benchmark/src/androidTest/java/androidx/compose/animation/core/benchmark/KeyframesSpecWithSplineBenchmark.kt b/compose/animation/animation-core/benchmark/src/androidTest/java/androidx/compose/animation/core/benchmark/KeyframesSpecWithSplineBenchmark.kt
index d8e196c..9903e53 100644
--- a/compose/animation/animation-core/benchmark/src/androidTest/java/androidx/compose/animation/core/benchmark/KeyframesSpecWithSplineBenchmark.kt
+++ b/compose/animation/animation-core/benchmark/src/androidTest/java/androidx/compose/animation/core/benchmark/KeyframesSpecWithSplineBenchmark.kt
@@ -40,20 +40,21 @@
     private val durationMillisToTest = 10_000
     private val playTimeNanosToEvaluate = (durationMillisToTest * 0.77f).roundToLong() * 1_000_000
 
-    @get:Rule
-    val benchmarkRule = BenchmarkRule()
+    @get:Rule val benchmarkRule = BenchmarkRule()
 
     @Test
     fun benchmark_firstFrame() {
         benchmarkRule.measureRepeated {
-            val vectorized = keyframesWithSpline {
-                durationMillis = durationMillisToTest
+            val vectorized =
+                keyframesWithSpline {
+                        durationMillis = durationMillisToTest
 
-                Offset(12f, 30f) at 10
-                Offset(-30f, 500f) at 500
-                Offset(8f, 10f) at 600
-                Offset(234f, 543f) at 700
-            }.vectorize(Offset.VectorConverter)
+                        Offset(12f, 30f) at 10
+                        Offset(-30f, 500f) at 500
+                        Offset(8f, 10f) at 600
+                        Offset(234f, 543f) at 700
+                    }
+                    .vectorize(Offset.VectorConverter)
 
             // Get first value to guarantee the spline has been calculated
             vectorized.getValueFromNanos(
@@ -69,26 +70,29 @@
     fun benchmark_vectorized() {
         benchmarkRule.measureRepeated {
             keyframesWithSpline {
-                durationMillis = durationMillisToTest
+                    durationMillis = durationMillisToTest
 
-                Offset(12f, 30f) at 10
-                Offset(-30f, 500f) at 500
-                Offset(8f, 10f) at 600
-                Offset(234f, 543f) at 700
-            }.vectorize(Offset.VectorConverter)
+                    Offset(12f, 30f) at 10
+                    Offset(-30f, 500f) at 500
+                    Offset(8f, 10f) at 600
+                    Offset(234f, 543f) at 700
+                }
+                .vectorize(Offset.VectorConverter)
         }
     }
 
     @Test
     fun benchmark_frameToFrame() {
-        val vectorized = keyframesWithSpline {
-            durationMillis = durationMillisToTest
+        val vectorized =
+            keyframesWithSpline {
+                    durationMillis = durationMillisToTest
 
-            Offset(12f, 30f) at 10
-            Offset(-30f, 500f) at 500
-            Offset(8f, 10f) at 600
-            Offset(234f, 543f) at 700
-        }.vectorize(Offset.VectorConverter)
+                    Offset(12f, 30f) at 10
+                    Offset(-30f, 500f) at 500
+                    Offset(8f, 10f) at 600
+                    Offset(234f, 543f) at 700
+                }
+                .vectorize(Offset.VectorConverter)
 
         // Cal the first frame before measuring, to guarantee the spline interpolation is built
         vectorized.getValueFromNanos(
@@ -120,14 +124,16 @@
 
     @Test
     fun benchmark_invalidated_frameToFrame() {
-        val vectorized = keyframesWithSpline {
-            durationMillis = durationMillisToTest
+        val vectorized =
+            keyframesWithSpline {
+                    durationMillis = durationMillisToTest
 
-            Offset(12f, 30f) at 10
-            Offset(-30f, 500f) at 500
-            Offset(8f, 10f) at 600
-            Offset(234f, 543f) at 700
-        }.vectorize(Offset.VectorConverter)
+                    Offset(12f, 30f) at 10
+                    Offset(-30f, 500f) at 500
+                    Offset(8f, 10f) at 600
+                    Offset(234f, 543f) at 700
+                }
+                .vectorize(Offset.VectorConverter)
 
         // Cal the first frame before measuring, to guarantee the spline interpolation is built
         vectorized.getValueFromNanos(
diff --git a/compose/animation/animation-core/benchmark/src/androidTest/java/androidx/compose/animation/core/benchmark/SpringEstimationBenchmark.kt b/compose/animation/animation-core/benchmark/src/androidTest/java/androidx/compose/animation/core/benchmark/SpringEstimationBenchmark.kt
index e926920..15f917a 100644
--- a/compose/animation/animation-core/benchmark/src/androidTest/java/androidx/compose/animation/core/benchmark/SpringEstimationBenchmark.kt
+++ b/compose/animation/animation-core/benchmark/src/androidTest/java/androidx/compose/animation/core/benchmark/SpringEstimationBenchmark.kt
@@ -29,8 +29,7 @@
 @LargeTest
 @RunWith(AndroidJUnit4::class)
 class SpringEstimationBenchmark {
-    @get:Rule
-    val benchmarkRule = BenchmarkRule()
+    @get:Rule val benchmarkRule = BenchmarkRule()
 
     @Test
     @LargeTest
diff --git a/compose/animation/animation-core/benchmark/src/androidTest/java/androidx/compose/animation/core/benchmark/TransitionBenchmark.kt b/compose/animation/animation-core/benchmark/src/androidTest/java/androidx/compose/animation/core/benchmark/TransitionBenchmark.kt
index 1abe89d..c02ab1f 100644
--- a/compose/animation/animation-core/benchmark/src/androidTest/java/androidx/compose/animation/core/benchmark/TransitionBenchmark.kt
+++ b/compose/animation/animation-core/benchmark/src/androidTest/java/androidx/compose/animation/core/benchmark/TransitionBenchmark.kt
@@ -31,8 +31,7 @@
 @RunWith(AndroidJUnit4::class)
 class TransitionBenchmark {
 
-    @get:Rule
-    val rule = ComposeBenchmarkRule()
+    @get:Rule val rule = ComposeBenchmarkRule()
 
     @Test
     fun createTransitionThroughUpdateTransition() {
diff --git a/compose/animation/animation-core/samples/src/main/java/androidx/compose/animation/core/samples/AnimatableSamples.kt b/compose/animation/animation-core/samples/src/main/java/androidx/compose/animation/core/samples/AnimatableSamples.kt
index 13e6acb..4679aa0 100644
--- a/compose/animation/animation-core/samples/src/main/java/androidx/compose/animation/core/samples/AnimatableSamples.kt
+++ b/compose/animation/animation-core/samples/src/main/java/androidx/compose/animation/core/samples/AnimatableSamples.kt
@@ -82,9 +82,7 @@
         Modifier.fillMaxSize().background(Color(0xffb99aff)).pointerInput(Unit) {
             coroutineScope {
                 while (true) {
-                    val offset = awaitPointerEventScope {
-                        awaitFirstDown().position
-                    }
+                    val offset = awaitPointerEventScope { awaitFirstDown().position }
                     // Launch a new coroutine for animation so the touch detection thread is not
                     // blocked.
                     launch {
@@ -100,8 +98,7 @@
     ) {
         Text("Tap anywhere", Modifier.align(Alignment.Center))
         Box(
-            Modifier
-                .offset {
+            Modifier.offset {
                     // Use the animated offset as the offset of the Box.
                     IntOffset(
                         animatedOffset.value.x.roundToInt(),
@@ -124,58 +121,53 @@
         // Creates a Float type `Animatable` and `remember`s it
         val animatedOffsetY = remember { Animatable(0f) }
         this.pointerInput(Unit) {
-            coroutineScope {
-                while (true) {
-                    val pointerId = awaitPointerEventScope {
-                        awaitFirstDown().id
-                    }
-                    val velocityTracker = VelocityTracker()
-                    awaitPointerEventScope {
-                        verticalDrag(pointerId) {
-                            // Snaps the value by the amount of finger movement
-                            launch {
-                                animatedOffsetY.snapTo(
-                                    animatedOffsetY.value + it.positionChange().y
-                                )
+                coroutineScope {
+                    while (true) {
+                        val pointerId = awaitPointerEventScope { awaitFirstDown().id }
+                        val velocityTracker = VelocityTracker()
+                        awaitPointerEventScope {
+                            verticalDrag(pointerId) {
+                                // Snaps the value by the amount of finger movement
+                                launch {
+                                    animatedOffsetY.snapTo(
+                                        animatedOffsetY.value + it.positionChange().y
+                                    )
+                                }
+                                velocityTracker.addPosition(it.uptimeMillis, it.position)
                             }
-                            velocityTracker.addPosition(
-                                it.uptimeMillis,
-                                it.position
-                            )
                         }
-                    }
-                    // At this point, drag has finished. Now we obtain the velocity at the end of
-                    // the drag, and animate the offset with it as the starting velocity.
-                    val velocity = velocityTracker.calculateVelocity().y
+                        // At this point, drag has finished. Now we obtain the velocity at the end
+                        // of
+                        // the drag, and animate the offset with it as the starting velocity.
+                        val velocity = velocityTracker.calculateVelocity().y
 
-                    // The goal for the animation below is to animate the dismissal if the fling
-                    // velocity is high enough. Otherwise, spring back.
-                    launch {
-                        // Checks where the animation will end using decay
-                        val decay = splineBasedDecay<Float>(this@pointerInput)
+                        // The goal for the animation below is to animate the dismissal if the fling
+                        // velocity is high enough. Otherwise, spring back.
+                        launch {
+                            // Checks where the animation will end using decay
+                            val decay = splineBasedDecay<Float>(this@pointerInput)
 
-                        // If the animation can naturally end outside of visual bounds, we will
-                        // animate with decay.
-                        if (decay.calculateTargetValue(
-                                animatedOffsetY.value,
-                                velocity
-                            ) < -size.height
-                        ) {
-                            // (Optionally) updates lower bounds. This stops the animation as soon
-                            // as bounds are reached.
-                            animatedOffsetY.updateBounds(
-                                lowerBound = -size.height.toFloat()
-                            )
-                            // Animate with the decay animation spec using the fling velocity
-                            animatedOffsetY.animateDecay(velocity, decay)
-                        } else {
-                            // Not enough velocity to be dismissed, spring back to 0f
-                            animatedOffsetY.animateTo(0f, initialVelocity = velocity)
+                            // If the animation can naturally end outside of visual bounds, we will
+                            // animate with decay.
+                            if (
+                                decay.calculateTargetValue(animatedOffsetY.value, velocity) <
+                                    -size.height
+                            ) {
+                                // (Optionally) updates lower bounds. This stops the animation as
+                                // soon
+                                // as bounds are reached.
+                                animatedOffsetY.updateBounds(lowerBound = -size.height.toFloat())
+                                // Animate with the decay animation spec using the fling velocity
+                                animatedOffsetY.animateDecay(velocity, decay)
+                            } else {
+                                // Not enough velocity to be dismissed, spring back to 0f
+                                animatedOffsetY.animateTo(0f, initialVelocity = velocity)
+                            }
                         }
                     }
                 }
             }
-        }.offset { IntOffset(0, animatedOffsetY.value.roundToInt()) }
+            .offset { IntOffset(0, animatedOffsetY.value.roundToInt()) }
     }
 }
 
@@ -251,30 +243,29 @@
     fun Modifier.animateConstraints(
         sizeAnimation: DeferredTargetAnimation<IntSize, AnimationVector2D>,
         coroutineScope: CoroutineScope
-    ) = this.approachLayout(
-        isMeasurementApproachInProgress = { lookaheadSize ->
-            // Update the target of the size animation.
-            sizeAnimation.updateTarget(lookaheadSize, coroutineScope)
-            // Return true if the size animation has pending target change or is currently
-            // running.
-            !sizeAnimation.isIdle
-        }
-    ) { measurable, _ ->
-        // In the measurement approach, the goal is to gradually reach the destination size
-        // (i.e. lookahead size). To achieve that, we use an animation to track the current
-        // size, and animate to the destination size whenever it changes. Once the animation
-        // finishes, the approach is complete.
+    ) =
+        this.approachLayout(
+            isMeasurementApproachInProgress = { lookaheadSize ->
+                // Update the target of the size animation.
+                sizeAnimation.updateTarget(lookaheadSize, coroutineScope)
+                // Return true if the size animation has pending target change or is currently
+                // running.
+                !sizeAnimation.isIdle
+            }
+        ) { measurable, _ ->
+            // In the measurement approach, the goal is to gradually reach the destination size
+            // (i.e. lookahead size). To achieve that, we use an animation to track the current
+            // size, and animate to the destination size whenever it changes. Once the animation
+            // finishes, the approach is complete.
 
-        // First, update the target of the animation, and read the current animated size.
-        val (width, height) = sizeAnimation.updateTarget(lookaheadSize, coroutineScope)
-        // Then create fixed size constraints using the animated size
-        val animatedConstraints = Constraints.fixed(width, height)
-        // Measure child with animated constraints.
-        val placeable = measurable.measure(animatedConstraints)
-        layout(placeable.width, placeable.height) {
-            placeable.place(0, 0)
+            // First, update the target of the animation, and read the current animated size.
+            val (width, height) = sizeAnimation.updateTarget(lookaheadSize, coroutineScope)
+            // Then create fixed size constraints using the animated size
+            val animatedConstraints = Constraints.fixed(width, height)
+            // Measure child with animated constraints.
+            val placeable = measurable.measure(animatedConstraints)
+            layout(placeable.width, placeable.height) { placeable.place(0, 0) }
         }
-    }
 
     var fullWidth by remember { mutableStateOf(false) }
 
@@ -287,18 +278,11 @@
             // Use the custom modifier created above to animate the constraints passed
             // to the child, and therefore resize children in an animation.
             .animateConstraints(sizeAnimation, coroutineScope)
-            .clickable { fullWidth = !fullWidth }) {
+            .clickable { fullWidth = !fullWidth }
+    ) {
         Box(
-            Modifier
-                .weight(1f)
-                .fillMaxHeight()
-                .background(Color(0xffff6f69)),
+            Modifier.weight(1f).fillMaxHeight().background(Color(0xffff6f69)),
         )
-        Box(
-            Modifier
-                .weight(2f)
-                .fillMaxHeight()
-                .background(Color(0xffffcc5c))
-        )
+        Box(Modifier.weight(2f).fillMaxHeight().background(Color(0xffffcc5c)))
     }
 }
diff --git a/compose/animation/animation-core/samples/src/main/java/androidx/compose/animation/core/samples/AnimatedValueSamples.kt b/compose/animation/animation-core/samples/src/main/java/androidx/compose/animation/core/samples/AnimatedValueSamples.kt
index 110f0c6..76e651a 100644
--- a/compose/animation/animation-core/samples/src/main/java/androidx/compose/animation/core/samples/AnimatedValueSamples.kt
+++ b/compose/animation/animation-core/samples/src/main/java/androidx/compose/animation/core/samples/AnimatedValueSamples.kt
@@ -68,24 +68,26 @@
     @Composable
     fun ArbitraryValueTypeAnimation(enabled: Boolean) {
         // Sets up the different animation target values based on the [enabled] flag.
-        val mySize = remember(enabled) {
-            if (enabled) {
-                MySize(500.dp, 500.dp)
-            } else {
-                MySize(100.dp, 100.dp)
+        val mySize =
+            remember(enabled) {
+                if (enabled) {
+                    MySize(500.dp, 500.dp)
+                } else {
+                    MySize(100.dp, 100.dp)
+                }
             }
-        }
 
         // Animates a custom type value to the given target value, using a [TwoWayConverter]. The
         // converter tells the animation system how to convert the custom type from and to
         // [AnimationVector], so that it can be animated.
-        val animSize: MySize by animateValueAsState(
-            mySize,
-            TwoWayConverter<MySize, AnimationVector2D>(
-                convertToVector = { AnimationVector2D(it.width.value, it.height.value) },
-                convertFromVector = { MySize(it.v1.dp, it.v2.dp) }
+        val animSize: MySize by
+            animateValueAsState(
+                mySize,
+                TwoWayConverter<MySize, AnimationVector2D>(
+                    convertToVector = { AnimationVector2D(it.width.value, it.height.value) },
+                    convertFromVector = { MySize(it.v1.dp, it.v2.dp) }
+                )
             )
-        )
         Box(Modifier.size(animSize.width, animSize.height).background(color = Color.Red))
     }
 }
@@ -110,15 +112,13 @@
         // Animates the offset depending on the selected flag.
         // [animateOffsetAsState] returns a State<Offset> object. The value of the State object is
         // updated by the animation. Here we use that State<Offset> as a property delegate.
-        val offset: Offset by animateOffsetAsState(
-            if (selected) Offset(0f, 0f) else Offset(20f, 20f)
-        )
+        val offset: Offset by
+            animateOffsetAsState(if (selected) Offset(0f, 0f) else Offset(20f, 20f))
 
         // In this example, animateIntOffsetAsState returns a State<IntOffset>. The value of the
         // returned
         // State object is updated by the animation.
-        val intOffset: IntOffset by animateIntOffsetAsState(
-            if (selected) IntOffset(0, 0) else IntOffset(50, 50)
-        )
+        val intOffset: IntOffset by
+            animateIntOffsetAsState(if (selected) IntOffset(0, 0) else IntOffset(50, 50))
     }
 }
diff --git a/compose/animation/animation-core/samples/src/main/java/androidx/compose/animation/core/samples/AnimationSpecSamples.kt b/compose/animation/animation-core/samples/src/main/java/androidx/compose/animation/core/samples/AnimationSpecSamples.kt
index 67a0111..0f67758 100644
--- a/compose/animation/animation-core/samples/src/main/java/androidx/compose/animation/core/samples/AnimationSpecSamples.kt
+++ b/compose/animation/animation-core/samples/src/main/java/androidx/compose/animation/core/samples/AnimationSpecSamples.kt
@@ -44,40 +44,48 @@
     @Composable
     fun Dot(scale: State<Float>) {
         Box(
-            Modifier.padding(5.dp).size(20.dp).graphicsLayer {
-                scaleX = scale.value
-                scaleY = scale.value
-            }.background(Color.Gray, shape = CircleShape)
+            Modifier.padding(5.dp)
+                .size(20.dp)
+                .graphicsLayer {
+                    scaleX = scale.value
+                    scaleY = scale.value
+                }
+                .background(Color.Gray, shape = CircleShape)
         )
     }
 
     val infiniteTransition = rememberInfiniteTransition()
-    val scale1 = infiniteTransition.animateFloat(
-        0.2f,
-        1f,
-        // No offset for the 1st animation
-        infiniteRepeatable(tween(600), RepeatMode.Reverse)
-    )
-    val scale2 = infiniteTransition.animateFloat(
-        0.2f,
-        1f,
-        infiniteRepeatable(
-            tween(600), RepeatMode.Reverse,
-            // Offsets the 2nd animation by starting from 150ms of the animation
-            // This offset will not be repeated.
-            initialStartOffset = StartOffset(offsetMillis = 150, StartOffsetType.FastForward)
+    val scale1 =
+        infiniteTransition.animateFloat(
+            0.2f,
+            1f,
+            // No offset for the 1st animation
+            infiniteRepeatable(tween(600), RepeatMode.Reverse)
         )
-    )
-    val scale3 = infiniteTransition.animateFloat(
-        0.2f,
-        1f,
-        infiniteRepeatable(
-            tween(600), RepeatMode.Reverse,
-            // Offsets the 3rd animation by starting from 300ms of the animation. This
-            // offset will be not repeated.
-            initialStartOffset = StartOffset(offsetMillis = 300, StartOffsetType.FastForward)
+    val scale2 =
+        infiniteTransition.animateFloat(
+            0.2f,
+            1f,
+            infiniteRepeatable(
+                tween(600),
+                RepeatMode.Reverse,
+                // Offsets the 2nd animation by starting from 150ms of the animation
+                // This offset will not be repeated.
+                initialStartOffset = StartOffset(offsetMillis = 150, StartOffsetType.FastForward)
+            )
         )
-    )
+    val scale3 =
+        infiniteTransition.animateFloat(
+            0.2f,
+            1f,
+            infiniteRepeatable(
+                tween(600),
+                RepeatMode.Reverse,
+                // Offsets the 3rd animation by starting from 300ms of the animation. This
+                // offset will be not repeated.
+                initialStartOffset = StartOffset(offsetMillis = 300, StartOffsetType.FastForward)
+            )
+        )
     Row {
         Dot(scale1)
         Dot(scale2)
diff --git a/compose/animation/animation-core/samples/src/main/java/androidx/compose/animation/core/samples/InfiniteTransitionSamples.kt b/compose/animation/animation-core/samples/src/main/java/androidx/compose/animation/core/samples/InfiniteTransitionSamples.kt
index 4973e4f..e594ce2 100644
--- a/compose/animation/animation-core/samples/src/main/java/androidx/compose/animation/core/samples/InfiniteTransitionSamples.kt
+++ b/compose/animation/animation-core/samples/src/main/java/androidx/compose/animation/core/samples/InfiniteTransitionSamples.kt
@@ -52,43 +52,47 @@
         val infiniteTransition = rememberInfiniteTransition()
 
         // Creates a child animation of float type as a part of the [InfiniteTransition].
-        val scale by infiniteTransition.animateFloat(
-            initialValue = 3f,
-            targetValue = 6f,
-            animationSpec = infiniteRepeatable(
-                // Infinitely repeating a 1000ms tween animation using default easing curve.
-                animation = tween(1000),
-                // After each iteration of the animation (i.e. every 1000ms), the animation will
-                // start again from the [initialValue] defined above.
-                // This is the default [RepeatMode]. See [RepeatMode.Reverse] below for an
-                // alternative.
-                repeatMode = RepeatMode.Restart
+        val scale by
+            infiniteTransition.animateFloat(
+                initialValue = 3f,
+                targetValue = 6f,
+                animationSpec =
+                    infiniteRepeatable(
+                        // Infinitely repeating a 1000ms tween animation using default easing curve.
+                        animation = tween(1000),
+                        // After each iteration of the animation (i.e. every 1000ms), the animation
+                        // will
+                        // start again from the [initialValue] defined above.
+                        // This is the default [RepeatMode]. See [RepeatMode.Reverse] below for an
+                        // alternative.
+                        repeatMode = RepeatMode.Restart
+                    )
             )
-        )
 
         // Creates a Color animation as a part of the [InfiniteTransition].
-        val color by infiniteTransition.animateColor(
-            initialValue = Color.Red,
-            targetValue = Color(0xff800000), // Dark Red
-            animationSpec = infiniteRepeatable(
-                // Linearly interpolate between initialValue and targetValue every 1000ms.
-                animation = tween(1000, easing = LinearEasing),
-                // Once [TargetValue] is reached, starts the next iteration in reverse (i.e. from
-                // TargetValue to InitialValue). Then again from InitialValue to TargetValue. This
-                // [RepeatMode] ensures that the animation value is *always continuous*.
-                repeatMode = RepeatMode.Reverse
+        val color by
+            infiniteTransition.animateColor(
+                initialValue = Color.Red,
+                targetValue = Color(0xff800000), // Dark Red
+                animationSpec =
+                    infiniteRepeatable(
+                        // Linearly interpolate between initialValue and targetValue every 1000ms.
+                        animation = tween(1000, easing = LinearEasing),
+                        // Once [TargetValue] is reached, starts the next iteration in reverse (i.e.
+                        // from
+                        // TargetValue to InitialValue). Then again from InitialValue to
+                        // TargetValue. This
+                        // [RepeatMode] ensures that the animation value is *always continuous*.
+                        repeatMode = RepeatMode.Reverse
+                    )
             )
-        )
 
         Box(Modifier.fillMaxSize()) {
             Icon(
                 Icons.Filled.Favorite,
                 contentDescription = null,
-                modifier = Modifier.align(Alignment.Center)
-                    .graphicsLayer(
-                        scaleX = scale,
-                        scaleY = scale
-                    ),
+                modifier =
+                    Modifier.align(Alignment.Center).graphicsLayer(scaleX = scale, scaleY = scale),
                 tint = color
             )
         }
@@ -101,19 +105,22 @@
     // Creates an [InfiniteTransition] instance to run child animations.
     val infiniteTransition = rememberInfiniteTransition()
     // Infinitely animate a Dp offset from 0.dp to 100.dp
-    val offsetX by infiniteTransition.animateValue(
-        initialValue = 0.dp,
-        targetValue = 100.dp,
-        typeConverter = Dp.VectorConverter,
-        animationSpec = infiniteRepeatable(
-            animation = keyframes {
-                durationMillis = 500
-                0.dp at 200 // ms
-                80.dp at 300 using FastOutLinearInEasing
-            }
-            // Use the default RepeatMode.Restart to start from 0.dp after each iteration
+    val offsetX by
+        infiniteTransition.animateValue(
+            initialValue = 0.dp,
+            targetValue = 100.dp,
+            typeConverter = Dp.VectorConverter,
+            animationSpec =
+                infiniteRepeatable(
+                    animation =
+                        keyframes {
+                            durationMillis = 500
+                            0.dp at 200 // ms
+                            80.dp at 300 using FastOutLinearInEasing
+                        }
+                    // Use the default RepeatMode.Restart to start from 0.dp after each iteration
+                )
         )
-    )
 
     Box(Modifier.offset(x = offsetX)) {
         // Content goes here
diff --git a/compose/animation/animation-core/samples/src/main/java/androidx/compose/animation/core/samples/KeyframesWithSplineBuilderSample.kt b/compose/animation/animation-core/samples/src/main/java/androidx/compose/animation/core/samples/KeyframesWithSplineBuilderSample.kt
index c69397e..68f1f2f 100644
--- a/compose/animation/animation-core/samples/src/main/java/androidx/compose/animation/core/samples/KeyframesWithSplineBuilderSample.kt
+++ b/compose/animation/animation-core/samples/src/main/java/androidx/compose/animation/core/samples/KeyframesWithSplineBuilderSample.kt
@@ -84,16 +84,19 @@
         animate(
             initialValue = 0f,
             targetValue = 0f,
-            animationSpec = infiniteRepeatable(
-                // With a periodicBias of 0.5f it creates a similar animation to a sinusoidal curve
-                // so the transition as the animation repeats is completely seamless
-                animation = keyframesWithSpline(periodicBias = 0.5f) {
-                    durationMillis = 2000
+            animationSpec =
+                infiniteRepeatable(
+                    // With a periodicBias of 0.5f it creates a similar animation to a sinusoidal
+                    // curve
+                    // so the transition as the animation repeats is completely seamless
+                    animation =
+                        keyframesWithSpline(periodicBias = 0.5f) {
+                            durationMillis = 2000
 
-                    1f at 1000 using LinearEasing
-                },
-                repeatMode = RepeatMode.Restart
-            )
+                            1f at 1000 using LinearEasing
+                        },
+                    repeatMode = RepeatMode.Restart
+                )
         ) { value, _ ->
             alpha = value
         }
@@ -101,9 +104,7 @@
     Image(
         imageVector = Icons.Filled.Favorite,
         contentDescription = null,
-        modifier = Modifier
-            .size(150.dp)
-            .graphicsLayer { this.alpha = alpha },
+        modifier = Modifier.size(150.dp).graphicsLayer { this.alpha = alpha },
         colorFilter = ColorFilter.tint(Color.Red)
     )
 }
diff --git a/compose/animation/animation-core/samples/src/main/java/androidx/compose/animation/core/samples/PathEasingSamples.kt b/compose/animation/animation-core/samples/src/main/java/androidx/compose/animation/core/samples/PathEasingSamples.kt
index 5333694..6b075bc 100644
--- a/compose/animation/animation-core/samples/src/main/java/androidx/compose/animation/core/samples/PathEasingSamples.kt
+++ b/compose/animation/animation-core/samples/src/main/java/androidx/compose/animation/core/samples/PathEasingSamples.kt
@@ -41,9 +41,7 @@
 @Composable
 fun PathEasingSample() {
     // Creates a custom PathEasing curve and applies it to an animation
-    var toggled by remember {
-        mutableStateOf(true)
-    }
+    var toggled by remember { mutableStateOf(true) }
     val pathForAnimation = remember {
         Path().apply {
             moveTo(0f, 0f)
@@ -51,22 +49,13 @@
             cubicTo(0.208333f, 0.82f, 0.25f, 1f, 1f, 1f)
         }
     }
-    val offset by animateIntOffsetAsState(
-        targetValue =
-        if (toggled) IntOffset.Zero else IntOffset(300, 300),
-        label = "offset",
-        animationSpec = tween(durationMillis = 1000, easing = PathEasing(pathForAnimation))
-    )
-    Box(modifier = Modifier
-        .fillMaxSize()
-        .clickable {
-            toggled = !toggled
-        }) {
-        Box(modifier = Modifier
-            .offset {
-                offset
-            }
-            .size(100.dp)
-            .background(Color.Blue))
+    val offset by
+        animateIntOffsetAsState(
+            targetValue = if (toggled) IntOffset.Zero else IntOffset(300, 300),
+            label = "offset",
+            animationSpec = tween(durationMillis = 1000, easing = PathEasing(pathForAnimation))
+        )
+    Box(modifier = Modifier.fillMaxSize().clickable { toggled = !toggled }) {
+        Box(modifier = Modifier.offset { offset }.size(100.dp).background(Color.Blue))
     }
 }
diff --git a/compose/animation/animation-core/samples/src/main/java/androidx/compose/animation/core/samples/SuspendAnimationSamples.kt b/compose/animation/animation-core/samples/src/main/java/androidx/compose/animation/core/samples/SuspendAnimationSamples.kt
index 36b34c8..c8c5669 100644
--- a/compose/animation/animation-core/samples/src/main/java/androidx/compose/animation/core/samples/SuspendAnimationSamples.kt
+++ b/compose/animation/animation-core/samples/src/main/java/androidx/compose/animation/core/samples/SuspendAnimationSamples.kt
@@ -81,10 +81,8 @@
             animate(
                 initialValue = 1f,
                 targetValue = 0f,
-                animationSpec = infiniteRepeatable(
-                    animation = tween(1000),
-                    repeatMode = RepeatMode.Reverse
-                )
+                animationSpec =
+                    infiniteRepeatable(animation = tween(1000), repeatMode = RepeatMode.Reverse)
             ) { value, /* velocity */ _ ->
                 // Update alpha mutable state with the current animation value
                 alpha.value = value
@@ -94,12 +92,9 @@
             Icon(
                 Icons.Filled.Favorite,
                 contentDescription = null,
-                modifier = Modifier.align(Alignment.Center)
-                    .graphicsLayer(
-                        scaleX = 3.0f,
-                        scaleY = 3.0f,
-                        alpha = alpha.value
-                    ),
+                modifier =
+                    Modifier.align(Alignment.Center)
+                        .graphicsLayer(scaleX = 3.0f, scaleY = 3.0f, alpha = alpha.value),
                 tint = Color.Red
             )
         }
diff --git a/compose/animation/animation-core/samples/src/main/java/androidx/compose/animation/core/samples/TransitionSamples.kt b/compose/animation/animation-core/samples/src/main/java/androidx/compose/animation/core/samples/TransitionSamples.kt
index 0fcbf65..436de45 100644
--- a/compose/animation/animation-core/samples/src/main/java/androidx/compose/animation/core/samples/TransitionSamples.kt
+++ b/compose/animation/animation-core/samples/src/main/java/androidx/compose/animation/core/samples/TransitionSamples.kt
@@ -83,15 +83,16 @@
     // enum class ComponentState { Pressed, Released }
     var useRed by remember { mutableStateOf(false) }
     var toState by remember { mutableStateOf(ComponentState.Released) }
-    val modifier = Modifier.pointerInput(Unit) {
-        detectTapGestures(
-            onPress = {
-                toState = ComponentState.Pressed
-                tryAwaitRelease()
-                toState = ComponentState.Released
-            }
-        )
-    }
+    val modifier =
+        Modifier.pointerInput(Unit) {
+            detectTapGestures(
+                onPress = {
+                    toState = ComponentState.Pressed
+                    tryAwaitRelease()
+                    toState = ComponentState.Released
+                }
+            )
+        }
 
     // Defines a transition of `ComponentState`, and updates the transition when the provided
     // [targetState] changes. The transition will run all of the child animations towards the new
@@ -99,45 +100,45 @@
     val transition: Transition<ComponentState> = updateTransition(targetState = toState)
     // Defines a float animation as a child animation the transition. The current animation value
     // can be read from the returned State<Float>.
-    val scale: Float by transition.animateFloat(
-        // Defines a transition spec that uses the same low-stiffness spring for *all*
-        // transitions of this float, no matter what the target is.
-        transitionSpec = { spring(stiffness = 50f) }
-    ) { state ->
-        // This code block declares a mapping from state to value.
-        if (state == ComponentState.Pressed) 3f else 1f
-    }
+    val scale: Float by
+        transition.animateFloat(
+            // Defines a transition spec that uses the same low-stiffness spring for *all*
+            // transitions of this float, no matter what the target is.
+            transitionSpec = { spring(stiffness = 50f) }
+        ) { state ->
+            // This code block declares a mapping from state to value.
+            if (state == ComponentState.Pressed) 3f else 1f
+        }
 
     // Defines a color animation as a child animation of the transition.
-    val color: Color by transition.animateColor(
-        transitionSpec = {
-            when {
-                ComponentState.Pressed isTransitioningTo ComponentState.Released ->
-                    // Uses spring for the transition going from pressed to released
-                    spring(stiffness = 50f)
-                else ->
-                    // Uses tween for all the other transitions. (In this case there is
-                    // only one other transition. i.e. released -> pressed.)
-                    tween(durationMillis = 500)
+    val color: Color by
+        transition.animateColor(
+            transitionSpec = {
+                when {
+                    ComponentState.Pressed isTransitioningTo ComponentState.Released ->
+                        // Uses spring for the transition going from pressed to released
+                        spring(stiffness = 50f)
+                    else ->
+                        // Uses tween for all the other transitions. (In this case there is
+                        // only one other transition. i.e. released -> pressed.)
+                        tween(durationMillis = 500)
+                }
+            }
+        ) { state ->
+            when (state) {
+                // Similar to the float animation, we need to declare the target values
+                // for each state. In this code block we can access theme colors.
+                ComponentState.Pressed -> MaterialTheme.colors.primary
+                // We can also have the target value depend on other mutableStates,
+                // such as `useRed` here. Whenever the target value changes, transition
+                // will automatically animate to the new value even if it has already
+                // arrived at its target state.
+                ComponentState.Released -> if (useRed) Color.Red else MaterialTheme.colors.secondary
             }
         }
-    ) { state ->
-        when (state) {
-            // Similar to the float animation, we need to declare the target values
-            // for each state. In this code block we can access theme colors.
-            ComponentState.Pressed -> MaterialTheme.colors.primary
-            // We can also have the target value depend on other mutableStates,
-            // such as `useRed` here. Whenever the target value changes, transition
-            // will automatically animate to the new value even if it has already
-            // arrived at its target state.
-            ComponentState.Released -> if (useRed) Color.Red else MaterialTheme.colors.secondary
-        }
-    }
     Column {
         Button(
-            modifier = Modifier
-                .padding(10.dp)
-                .align(Alignment.CenterHorizontally),
+            modifier = Modifier.padding(10.dp).align(Alignment.CenterHorizontally),
             onClick = { useRed = !useRed }
         ) {
             Text("Change Color")
@@ -152,53 +153,62 @@
     }
 }
 
-private enum class SquareSize { Small, Large }
-private enum class ComponentState { Pressed, Released }
-private enum class ButtonStatus { Initial, Pressed, Released }
+private enum class SquareSize {
+    Small,
+    Large
+}
+
+private enum class ComponentState {
+    Pressed,
+    Released
+}
+
+private enum class ButtonStatus {
+    Initial,
+    Pressed,
+    Released
+}
 
 @Sampled
 @Composable
 fun AnimateFloatSample() {
     // enum class ButtonStatus {Initial, Pressed, Released}
     @Composable
-    fun AnimateAlphaAndScale(
-        modifier: Modifier,
-        transition: Transition<ButtonStatus>
-    ) {
+    fun AnimateAlphaAndScale(modifier: Modifier, transition: Transition<ButtonStatus>) {
         // Defines a float animation as a child animation of transition. This allows the
         // transition to manage the states of this animation. The returned State<Float> from the
         // [animateFloat] function is used here as a property delegate.
         // This float animation will use the default [spring] for all transition destinations, as
         // specified by the default `transitionSpec`.
-        val scale: Float by transition.animateFloat { state ->
-            if (state == ButtonStatus.Pressed) 1.2f else 1f
-        }
+        val scale: Float by
+            transition.animateFloat { state -> if (state == ButtonStatus.Pressed) 1.2f else 1f }
 
         // Alternatively, we can specify different animation specs based on the initial state and
         // target state of the a transition run using `transitionSpec`.
-        val alpha: Float by transition.animateFloat(
-            transitionSpec = {
-                when {
-                    ButtonStatus.Initial isTransitioningTo ButtonStatus.Pressed -> {
-                        keyframes {
-                            durationMillis = 225
-                            0f at 0 // optional
-                            0.3f at 75
-                            0.2f at 225 // optional
+        val alpha: Float by
+            transition.animateFloat(
+                transitionSpec = {
+                    when {
+                        ButtonStatus.Initial isTransitioningTo ButtonStatus.Pressed -> {
+                            keyframes {
+                                durationMillis = 225
+                                0f at 0 // optional
+                                0.3f at 75
+                                0.2f at 225 // optional
+                            }
+                        }
+                        ButtonStatus.Pressed isTransitioningTo ButtonStatus.Released -> {
+                            tween(durationMillis = 220)
+                        }
+                        else -> {
+                            snap()
                         }
                     }
-                    ButtonStatus.Pressed isTransitioningTo ButtonStatus.Released -> {
-                        tween(durationMillis = 220)
-                    }
-                    else -> {
-                        snap()
-                    }
                 }
+            ) { state ->
+                // Same target value for Initial and Released states
+                if (state == ButtonStatus.Pressed) 0.2f else 0f
             }
-        ) { state ->
-            // Same target value for Initial and Released states
-            if (state == ButtonStatus.Pressed) 0.2f else 0f
-        }
 
         Box(modifier.graphicsLayer(alpha = alpha, scaleX = scale)) {
             // content goes here
@@ -222,31 +232,32 @@
         // Creates a transition with the transition state created above.
         val transition = rememberTransition(visibleState)
         // Adds a scale animation to the transition to scale the card up when transitioning in.
-        val scale by transition.animateFloat(
-            // Uses a custom spring for the transition.
-            transitionSpec = { spring(dampingRatio = Spring.DampingRatioMediumBouncy) }
-        ) { visible ->
-            if (visible) 1f else 0.8f
-        }
-        // Adds an elevation animation that animates the dp value of the animation.
-        val elevation by transition.animateDp(
-            // Uses a tween animation
-            transitionSpec = {
-                // Uses different animations for when animating from visible to not visible, and
-                // the other way around
-                if (false isTransitioningTo true) {
-                    tween(1000)
-                } else {
-                    spring()
-                }
+        val scale by
+            transition.animateFloat(
+                // Uses a custom spring for the transition.
+                transitionSpec = { spring(dampingRatio = Spring.DampingRatioMediumBouncy) }
+            ) { visible ->
+                if (visible) 1f else 0.8f
             }
-        ) { visible ->
-            if (visible) 10.dp else 0.dp
-        }
+        // Adds an elevation animation that animates the dp value of the animation.
+        val elevation by
+            transition.animateDp(
+                // Uses a tween animation
+                transitionSpec = {
+                    // Uses different animations for when animating from visible to not visible, and
+                    // the other way around
+                    if (false isTransitioningTo true) {
+                        tween(1000)
+                    } else {
+                        spring()
+                    }
+                }
+            ) { visible ->
+                if (visible) 10.dp else 0.dp
+            }
 
         Card(
-            Modifier
-                .graphicsLayer(scaleX = scale, scaleY = scale)
+            Modifier.graphicsLayer(scaleX = scale, scaleY = scale)
                 .size(200.dp, 100.dp)
                 .fillMaxWidth(),
             elevation = elevation
@@ -272,21 +283,19 @@
         }
 
         Box(
-            Modifier
-                .fillMaxSize()
-                .pointerInput(Unit) {
-                    detectTapGestures(
-                        onDoubleTap = {
-                            // This creates a new `MutableTransitionState` object. When a new
-                            // `MutableTransitionState` object gets passed to `updateTransition`, a
-                            // new transition will be created. All existing values, velocities will
-                            // be lost as a result. Hence, in most cases, this is not recommended.
-                            // The exception is when it's more important to respond immediately to
-                            // user interaction than preserving continuity.
-                            transitionState = MutableTransitionState(LikedStates.Initial)
-                        }
-                    )
-                }
+            Modifier.fillMaxSize().pointerInput(Unit) {
+                detectTapGestures(
+                    onDoubleTap = {
+                        // This creates a new `MutableTransitionState` object. When a new
+                        // `MutableTransitionState` object gets passed to `updateTransition`, a
+                        // new transition will be created. All existing values, velocities will
+                        // be lost as a result. Hence, in most cases, this is not recommended.
+                        // The exception is when it's more important to respond immediately to
+                        // user interaction than preserving continuity.
+                        transitionState = MutableTransitionState(LikedStates.Initial)
+                    }
+                )
+            }
         ) {
             // This ensures sequential states: Initial -> Liked -> Disappeared
             if (transitionState.currentState == LikedStates.Initial) {
@@ -301,56 +310,55 @@
             // double tap.
             val transition = rememberTransition(transitionState)
             // Creates an alpha animation, as a part of the transition.
-            val alpha by transition.animateFloat(
-                transitionSpec = {
-                    when {
-                        // Uses different animation specs for transitioning from/to different states
-                        LikedStates.Initial isTransitioningTo LikedStates.Liked ->
-                            keyframes {
-                                durationMillis = 500
-                                0f at 0 // optional
-                                0.5f at 100
-                                1f at 225 // optional
-                            }
-                        LikedStates.Liked isTransitioningTo LikedStates.Disappeared ->
-                            tween(durationMillis = 200)
-                        else -> snap()
+            val alpha by
+                transition.animateFloat(
+                    transitionSpec = {
+                        when {
+                            // Uses different animation specs for transitioning from/to different
+                            // states
+                            LikedStates.Initial isTransitioningTo LikedStates.Liked ->
+                                keyframes {
+                                    durationMillis = 500
+                                    0f at 0 // optional
+                                    0.5f at 100
+                                    1f at 225 // optional
+                                }
+                            LikedStates.Liked isTransitioningTo LikedStates.Disappeared ->
+                                tween(durationMillis = 200)
+                            else -> snap()
+                        }
                     }
+                ) {
+                    if (it == LikedStates.Liked) 1f else 0f
                 }
-            ) {
-                if (it == LikedStates.Liked) 1f else 0f
-            }
 
             // Creates a scale animation, as a part of the transition
-            val scale by transition.animateFloat(
-                transitionSpec = {
-                    when {
-                        // Uses different animation specs for transitioning from/to different states
-                        LikedStates.Initial isTransitioningTo LikedStates.Liked ->
-                            spring(dampingRatio = Spring.DampingRatioHighBouncy)
-                        LikedStates.Liked isTransitioningTo LikedStates.Disappeared ->
-                            tween(200)
-                        else -> snap()
+            val scale by
+                transition.animateFloat(
+                    transitionSpec = {
+                        when {
+                            // Uses different animation specs for transitioning from/to different
+                            // states
+                            LikedStates.Initial isTransitioningTo LikedStates.Liked ->
+                                spring(dampingRatio = Spring.DampingRatioHighBouncy)
+                            LikedStates.Liked isTransitioningTo LikedStates.Disappeared ->
+                                tween(200)
+                            else -> snap()
+                        }
+                    }
+                ) {
+                    when (it) {
+                        LikedStates.Initial -> 0f
+                        LikedStates.Liked -> 4f
+                        LikedStates.Disappeared -> 2f
                     }
                 }
-            ) {
-                when (it) {
-                    LikedStates.Initial -> 0f
-                    LikedStates.Liked -> 4f
-                    LikedStates.Disappeared -> 2f
-                }
-            }
 
             Icon(
                 Icons.Filled.Favorite,
                 "Like",
-                Modifier
-                    .align(Alignment.Center)
-                    .graphicsLayer(
-                        alpha = alpha,
-                        scaleX = scale,
-                        scaleY = scale
-                    ),
+                Modifier.align(Alignment.Center)
+                    .graphicsLayer(alpha = alpha, scaleX = scale, scaleY = scale),
                 tint = Color.Red
             )
         }
@@ -365,13 +373,8 @@
     @OptIn(ExperimentalTransitionApi::class)
     @Composable
     fun DialerButton(visibilityTransition: Transition<Boolean>, modifier: Modifier) {
-        val scale by visibilityTransition.animateFloat { visible ->
-            if (visible) 1f else 2f
-        }
-        Box(
-            modifier
-                .scale(scale)
-                .background(Color.Black)) {
+        val scale by visibilityTransition.animateFloat { visible -> if (visible) 1f else 2f }
+        Box(modifier.scale(scale).background(Color.Black)) {
             // Content goes here
         }
     }
@@ -389,13 +392,11 @@
             val parentTransition = updateTransition(dialerState)
 
             // Animate to different corner radius based on target state
-            val cornerRadius by parentTransition.animateDp {
-                if (it == DialerState.NumberPad) 0.dp else 20.dp
-            }
+            val cornerRadius by
+                parentTransition.animateDp { if (it == DialerState.NumberPad) 0.dp else 20.dp }
 
             Box(
-                Modifier
-                    .align(Alignment.BottomCenter)
+                Modifier.align(Alignment.BottomCenter)
                     .widthIn(50.dp)
                     .heightIn(50.dp)
                     .clip(RoundedCornerShape(cornerRadius))
@@ -411,19 +412,21 @@
                     // 2) Separation of concerns. This allows the child composable (i.e.
                     // NumberPad) to only care about its own visibility, rather than knowing about
                     // DialerState.
-                    visibilityTransition = parentTransition.createChildTransition {
-                        // This is the lambda that defines how the parent target state maps to
-                        // child target state.
-                        it == DialerState.NumberPad
-                    }
+                    visibilityTransition =
+                        parentTransition.createChildTransition {
+                            // This is the lambda that defines how the parent target state maps to
+                            // child target state.
+                            it == DialerState.NumberPad
+                        }
                     // Note: If it's not important for the animations within the child composable to
                     // be observable, it's perfectly valid to not hoist the animations through
                     // a Transition object and instead use animate*AsState.
                 )
                 DialerButton(
-                    visibilityTransition = parentTransition.createChildTransition {
-                        it == DialerState.DialerMinimized
-                    },
+                    visibilityTransition =
+                        parentTransition.createChildTransition {
+                            it == DialerState.DialerMinimized
+                        },
                     modifier = Modifier.matchParentSize()
                 )
             }
@@ -444,9 +447,8 @@
     fun SelectableItem(selectedState: MutableTransitionState<Boolean>) {
         val transition = rememberTransition(selectedState)
         val cornerRadius by transition.animateDp { selected -> if (selected) 10.dp else 0.dp }
-        val backgroundColor by transition.animateColor { selected ->
-            if (selected) Color.Red else Color.White
-        }
+        val backgroundColor by
+            transition.animateColor { selected -> if (selected) Color.Red else Color.White }
         Box(Modifier.background(backgroundColor, RoundedCornerShape(cornerRadius))) {
             // Item content goes here
         }
@@ -467,7 +469,8 @@
                     // observe state change.
                     SelectableItem(selectedState)
                     if (selectedState.isIdle && selectedState.targetState) {
-                        // If isIdle == true, it means the transition has arrived at its target state
+                        // If isIdle == true, it means the transition has arrived at its target
+                        // state
                         // and there is no pending animation.
                         // Now we can do something after the selection transition is
                         // finished:
@@ -493,85 +496,71 @@
         val scope = rememberCoroutineScope()
         Column {
             Row {
-                Button(onClick = {
-                    scope.launch { seekingState.animateTo(BoxSize.Small) }
-                },
-                    Modifier
-                        .wrapContentWidth()
-                        .weight(1f)) {
+                Button(
+                    onClick = { scope.launch { seekingState.animateTo(BoxSize.Small) } },
+                    Modifier.wrapContentWidth().weight(1f)
+                ) {
                     Text("Animate Small")
                 }
-                Button(onClick = {
-                    scope.launch { seekingState.seekTo(0f, BoxSize.Small) }
-                },
-                    Modifier
-                        .wrapContentWidth()
-                        .weight(1f)) {
+                Button(
+                    onClick = { scope.launch { seekingState.seekTo(0f, BoxSize.Small) } },
+                    Modifier.wrapContentWidth().weight(1f)
+                ) {
                     Text("Seek Small")
                 }
-                Button(onClick = {
-                    scope.launch { seekingState.seekTo(0f, BoxSize.Medium) }
-                },
-                    Modifier
-                        .wrapContentWidth()
-                        .weight(1f)) {
+                Button(
+                    onClick = { scope.launch { seekingState.seekTo(0f, BoxSize.Medium) } },
+                    Modifier.wrapContentWidth().weight(1f)
+                ) {
                     Text("Seek Medium")
                 }
-                Button(onClick = {
-                    scope.launch { seekingState.seekTo(0f, BoxSize.Large) }
-                },
-                    Modifier
-                        .wrapContentWidth()
-                        .weight(1f)) {
+                Button(
+                    onClick = { scope.launch { seekingState.seekTo(0f, BoxSize.Large) } },
+                    Modifier.wrapContentWidth().weight(1f)
+                ) {
                     Text("Seek Large")
                 }
-                Button(onClick = {
-                    scope.launch { seekingState.animateTo(BoxSize.Large) }
-                },
-                    Modifier
-                        .wrapContentWidth()
-                        .weight(1f)) {
+                Button(
+                    onClick = { scope.launch { seekingState.animateTo(BoxSize.Large) } },
+                    Modifier.wrapContentWidth().weight(1f)
+                ) {
                     Text("Animate Large")
                 }
             }
         }
         Slider(
             value = seekingState.fraction,
-            modifier = Modifier
-                .systemGestureExclusion()
-                .padding(10.dp),
-            onValueChange = { value ->
-                scope.launch { seekingState.seekTo(fraction = value) }
-            }
+            modifier = Modifier.systemGestureExclusion().padding(10.dp),
+            onValueChange = { value -> scope.launch { seekingState.seekTo(fraction = value) } }
         )
         val transition = rememberTransition(seekingState)
 
-        val scale: Float by transition.animateFloat(
-            transitionSpec = { tween(easing = LinearEasing) },
-            label = "Scale"
-        ) { state ->
-            when (state) {
-                BoxSize.Small -> 1f
-                BoxSize.Medium -> 2f
-                BoxSize.Large -> 3f
+        val scale: Float by
+            transition.animateFloat(
+                transitionSpec = { tween(easing = LinearEasing) },
+                label = "Scale"
+            ) { state ->
+                when (state) {
+                    BoxSize.Small -> 1f
+                    BoxSize.Medium -> 2f
+                    BoxSize.Large -> 3f
+                }
             }
-        }
 
-        transition.AnimatedContent(transitionSpec = {
-            fadeIn(tween(easing = LinearEasing)) togetherWith fadeOut(tween(easing = LinearEasing))
-        }) { state ->
+        transition.AnimatedContent(
+            transitionSpec = {
+                fadeIn(tween(easing = LinearEasing)) togetherWith
+                    fadeOut(tween(easing = LinearEasing))
+            }
+        ) { state ->
             if (state == BoxSize.Large) {
-                Box(
-                    Modifier
-                        .size(50.dp)
-                        .background(Color.Magenta))
+                Box(Modifier.size(50.dp).background(Color.Magenta))
             } else {
                 Box(Modifier.size(50.dp))
             }
         }
         Box(
-            Modifier
-                .fillMaxSize()
+            Modifier.fillMaxSize()
                 .wrapContentSize(Alignment.Center)
                 .size(100.dp)
                 .graphicsLayer {
@@ -588,18 +577,12 @@
 @Suppress("UNUSED_VARIABLE")
 fun SeekToSample() {
     val seekingState = remember { SeekableTransitionState(BoxSize.Small) }
-    LaunchedEffect(seekingState.targetState) {
-        seekingState.seekTo(0f, BoxSize.Large)
-    }
+    LaunchedEffect(seekingState.targetState) { seekingState.seekTo(0f, BoxSize.Large) }
     val scope = rememberCoroutineScope()
     Slider(
         value = seekingState.fraction,
-        modifier = Modifier
-            .systemGestureExclusion()
-            .padding(10.dp),
-        onValueChange = { value ->
-            scope.launch { seekingState.seekTo(fraction = value) }
-        }
+        modifier = Modifier.systemGestureExclusion().padding(10.dp),
+        onValueChange = { value -> scope.launch { seekingState.seekTo(fraction = value) } }
     )
     val transition = rememberTransition(seekingState)
     // use the transition
@@ -611,9 +594,7 @@
 fun SnapToSample() {
     val seekingState = remember { SeekableTransitionState(BoxSize.Small) }
     val scope = rememberCoroutineScope()
-    Button(onClick = {
-        scope.launch { seekingState.snapTo(BoxSize.Large) }
-    }) {
+    Button(onClick = { scope.launch { seekingState.snapTo(BoxSize.Large) } }) {
         Text("Snap to the Small state")
     }
     val transition = rememberTransition(seekingState)
diff --git a/compose/animation/animation-core/src/androidInstrumentedTest/kotlin/androidx/compose/animation/core/DurationScaleTransitionTest.kt b/compose/animation/animation-core/src/androidInstrumentedTest/kotlin/androidx/compose/animation/core/DurationScaleTransitionTest.kt
index dcacf9d..9f7b4b1 100644
--- a/compose/animation/animation-core/src/androidInstrumentedTest/kotlin/androidx/compose/animation/core/DurationScaleTransitionTest.kt
+++ b/compose/animation/animation-core/src/androidInstrumentedTest/kotlin/androidx/compose/animation/core/DurationScaleTransitionTest.kt
@@ -34,9 +34,11 @@
     @OptIn(ExperimentalTestApi::class, ExperimentalTransitionApi::class)
     @Test
     fun childTransitionWithDurationScale() {
-        val motionDurationScale = object : MotionDurationScale {
-            override val scaleFactor: Float get() = 4f
-        }
+        val motionDurationScale =
+            object : MotionDurationScale {
+                override val scaleFactor: Float
+                    get() = 4f
+            }
         runComposeUiTest(effectContext = motionDurationScale) {
             mainClock.autoAdvance = false
             val state = MutableTransitionState(0)
@@ -45,17 +47,21 @@
             var withChild by mutableStateOf(false)
             setContent {
                 val transition = rememberTransition(transitionState = state)
-                val animatedValue1 by transition.animateFloat(
-                    { tween(160, easing = LinearEasing) },
-                ) { if (it == 0) 0f else 1000f }
+                val animatedValue1 by
+                    transition.animateFloat(
+                        { tween(160, easing = LinearEasing) },
+                    ) {
+                        if (it == 0) 0f else 1000f
+                    }
                 value1 = animatedValue1
                 if (withChild) {
-                    val child = transition.createChildTransition {
-                        it
-                    }
-                    val animatedValue2 by child.animateFloat(
-                        { tween(160, easing = LinearEasing) },
-                    ) { if (it == 0) 0f else 1000f }
+                    val child = transition.createChildTransition { it }
+                    val animatedValue2 by
+                        child.animateFloat(
+                            { tween(160, easing = LinearEasing) },
+                        ) {
+                            if (it == 0) 0f else 1000f
+                        }
                     value2 = animatedValue2
                 }
             }
@@ -86,9 +92,11 @@
     @OptIn(ExperimentalTestApi::class, ExperimentalTransitionApi::class)
     @Test
     fun childTransitionWithDurationScaleSeekableTransition() {
-        val motionDurationScale = object : MotionDurationScale {
-            override val scaleFactor: Float get() = 4f
-        }
+        val motionDurationScale =
+            object : MotionDurationScale {
+                override val scaleFactor: Float
+                    get() = 4f
+            }
         runComposeUiTest(effectContext = motionDurationScale) {
             mainClock.autoAdvance = false
             val state = SeekableTransitionState(0)
@@ -99,33 +107,33 @@
             setContent {
                 coroutineScope = rememberCoroutineScope()
                 val transition = rememberTransition(transitionState = state)
-                val animatedValue1 by transition.animateFloat(
-                    { tween(160, easing = LinearEasing) },
-                ) { if (it == 0) 0f else 1000f }
+                val animatedValue1 by
+                    transition.animateFloat(
+                        { tween(160, easing = LinearEasing) },
+                    ) {
+                        if (it == 0) 0f else 1000f
+                    }
                 value1 = animatedValue1
                 if (withChild) {
-                    val child = transition.createChildTransition {
-                        it
-                    }
-                    val animatedValue2 by child.animateFloat(
-                        { tween(160, easing = LinearEasing) },
-                    ) { if (it == 0) 0f else 1000f }
+                    val child = transition.createChildTransition { it }
+                    val animatedValue2 by
+                        child.animateFloat(
+                            { tween(160, easing = LinearEasing) },
+                        ) {
+                            if (it == 0) 0f else 1000f
+                        }
                     value2 = animatedValue2
                 }
             }
             mainClock.advanceTimeByFrame() // let everything settle
-            val seekTo = coroutineScope.async {
-                state.seekTo(fraction = 0f, targetState = 1)
-            }
+            val seekTo = coroutineScope.async { state.seekTo(fraction = 0f, targetState = 1) }
             mainClock.advanceTimeByFrame() // recompose
             assertThat(seekTo.isCompleted).isTrue()
 
             assertThat(value1).isEqualTo(0f)
             assertThat(value2).isEqualTo(-1f) // not set until withChild = true
 
-            coroutineScope.launch {
-                state.animateTo(targetState = 1)
-            }
+            coroutineScope.launch { state.animateTo(targetState = 1) }
             mainClock.advanceTimeByFrame() // lock in the animation clock
             mainClock.advanceTimeBy(320) // half way through transition
             assertThat(value1).isWithin(0.1f).of(500f)
@@ -147,9 +155,11 @@
     @OptIn(ExperimentalTestApi::class, ExperimentalTransitionApi::class)
     @Test
     fun childTransitionWithDurationScaleSeekTransition() {
-        val motionDurationScale = object : MotionDurationScale {
-            override val scaleFactor: Float get() = 4f
-        }
+        val motionDurationScale =
+            object : MotionDurationScale {
+                override val scaleFactor: Float
+                    get() = 4f
+            }
         runComposeUiTest(effectContext = motionDurationScale) {
             mainClock.autoAdvance = false
             val state = SeekableTransitionState(0)
@@ -160,24 +170,26 @@
             setContent {
                 coroutineScope = rememberCoroutineScope()
                 val transition = rememberTransition(transitionState = state)
-                val animatedValue1 by transition.animateFloat(
-                    { tween(160, easing = LinearEasing) },
-                ) { if (it == 0) 0f else 1000f }
+                val animatedValue1 by
+                    transition.animateFloat(
+                        { tween(160, easing = LinearEasing) },
+                    ) {
+                        if (it == 0) 0f else 1000f
+                    }
                 value1 = animatedValue1
                 if (withChild) {
-                    val child = transition.createChildTransition {
-                        it
-                    }
-                    val animatedValue2 by child.animateFloat(
-                        { tween(160, easing = LinearEasing) },
-                    ) { if (it == 0) 0f else 1000f }
+                    val child = transition.createChildTransition { it }
+                    val animatedValue2 by
+                        child.animateFloat(
+                            { tween(160, easing = LinearEasing) },
+                        ) {
+                            if (it == 0) 0f else 1000f
+                        }
                     value2 = animatedValue2
                 }
             }
             mainClock.advanceTimeByFrame() // let everything settle
-            val seekTo = coroutineScope.async {
-                state.seekTo(fraction = 0.5f, targetState = 1)
-            }
+            val seekTo = coroutineScope.async { state.seekTo(fraction = 0.5f, targetState = 1) }
             mainClock.advanceTimeByFrame() // recompose
             assertThat(seekTo.isCompleted).isTrue()
 
@@ -200,9 +212,7 @@
             assertThat(value1).isEqualTo(1000f)
             assertThat(value2).isWithin(0.1f).of(625f)
 
-            coroutineScope.launch {
-                state.seekTo(fraction = 1f)
-            }
+            coroutineScope.launch { state.seekTo(fraction = 1f) }
             mainClock.advanceTimeByFrame()
 
             assertThat(value1).isEqualTo(1000f)
diff --git a/compose/animation/animation-core/src/androidInstrumentedTest/kotlin/androidx/compose/animation/core/EasingTest.kt b/compose/animation/animation-core/src/androidInstrumentedTest/kotlin/androidx/compose/animation/core/EasingTest.kt
index 962c6dc..0197626 100644
--- a/compose/animation/animation-core/src/androidInstrumentedTest/kotlin/androidx/compose/animation/core/EasingTest.kt
+++ b/compose/animation/animation-core/src/androidInstrumentedTest/kotlin/androidx/compose/animation/core/EasingTest.kt
@@ -44,11 +44,12 @@
 class EasingTest {
     @Test
     fun easing() {
-        val paint = Paint().apply {
-            style = Paint.Style.STROKE
-            color = Color.RED
-            isAntiAlias = false
-        }
+        val paint =
+            Paint().apply {
+                style = Paint.Style.STROKE
+                color = Color.RED
+                isAntiAlias = false
+            }
 
         // Testing methodology:
         // - Go through a list of Cubic curves with fixed start/end points at 0.0,0.0 and 1.0,1.0
@@ -58,54 +59,52 @@
         //   evaluate the curve to compute the Y coordinate and draw a line
         // - Compare the two bitmaps to validate that our cubic Bézier evaluation matches that
         //   of Skia/Canvas
-        for (cubic in listOf(
-            floatArrayOf(0.40f, 0.00f, 0.20f, 1.0f), // FastOutSlowInEasing
-            floatArrayOf(0.00f, 0.00f, 0.20f, 1.0f), // LinearOutSlowInEasing
-            floatArrayOf(0.40f, 0.00f, 1.00f, 1.0f), // FastOutLinearInEasing
-            floatArrayOf(0.34f, 1.56f, 0.64f, 1.0f), // EaseOutBack (overshoot)
-            floatArrayOf(0.00f, 1.00f, 0.00f, 1.0f),
-        )) {
-            val path = Path().apply {
-                cubicTo(
-                    cubic[0] * BitmapSize,
-                    cubic[1] * BitmapSize,
-                    cubic[2] * BitmapSize,
-                    cubic[3] * BitmapSize,
-                    BitmapSize.toFloat(),
-                    BitmapSize.toFloat()
-                )
-            }
-
-            val reference = createBitmap(
-                BitmapSize + 2 * Margin,
-                BitmapSize + 2 * Margin
-            ).applyCanvas {
-                withTranslation(Margin.toFloat(), Margin.toFloat()) {
-                    drawPath(path.asAndroidPath(), paint)
+        for (cubic in
+            listOf(
+                floatArrayOf(0.40f, 0.00f, 0.20f, 1.0f), // FastOutSlowInEasing
+                floatArrayOf(0.00f, 0.00f, 0.20f, 1.0f), // LinearOutSlowInEasing
+                floatArrayOf(0.40f, 0.00f, 1.00f, 1.0f), // FastOutLinearInEasing
+                floatArrayOf(0.34f, 1.56f, 0.64f, 1.0f), // EaseOutBack (overshoot)
+                floatArrayOf(0.00f, 1.00f, 0.00f, 1.0f),
+            )) {
+            val path =
+                Path().apply {
+                    cubicTo(
+                        cubic[0] * BitmapSize,
+                        cubic[1] * BitmapSize,
+                        cubic[2] * BitmapSize,
+                        cubic[3] * BitmapSize,
+                        BitmapSize.toFloat(),
+                        BitmapSize.toFloat()
+                    )
                 }
-            }
+
+            val reference =
+                createBitmap(BitmapSize + 2 * Margin, BitmapSize + 2 * Margin).applyCanvas {
+                    withTranslation(Margin.toFloat(), Margin.toFloat()) {
+                        drawPath(path.asAndroidPath(), paint)
+                    }
+                }
 
             val easing = CubicBezierEasing(cubic[0], cubic[1], cubic[2], cubic[3])
-            val subject = createBitmap(
-                BitmapSize + 2 * Margin,
-                BitmapSize + 2 * Margin
-            ).applyCanvas {
-                var x0 = 0.0f
-                var y0 = 0.0f
-                for (x in 1 until BitmapSize) {
-                    val x1 = x / BitmapSize.toFloat()
-                    val y1 = easing.transform(x1)
-                    drawLine(
-                        Margin.toFloat() + x0 * BitmapSize,
-                        Margin.toFloat() + y0 * BitmapSize,
-                        Margin.toFloat() + x1 * BitmapSize,
-                        Margin.toFloat() + y1 * BitmapSize,
-                        paint
-                    )
-                    x0 = x1
-                    y0 = y1
+            val subject =
+                createBitmap(BitmapSize + 2 * Margin, BitmapSize + 2 * Margin).applyCanvas {
+                    var x0 = 0.0f
+                    var y0 = 0.0f
+                    for (x in 1 until BitmapSize) {
+                        val x1 = x / BitmapSize.toFloat()
+                        val y1 = easing.transform(x1)
+                        drawLine(
+                            Margin.toFloat() + x0 * BitmapSize,
+                            Margin.toFloat() + y0 * BitmapSize,
+                            Margin.toFloat() + x1 * BitmapSize,
+                            Margin.toFloat() + y1 * BitmapSize,
+                            paint
+                        )
+                        x0 = x1
+                        y0 = y1
+                    }
                 }
-            }
 
             // Allow for up to 32 pixels to be different in a 128x128 image, to
             // account for rasterization differences between the two techniques.
@@ -118,9 +117,9 @@
 }
 
 /**
- * Compares two bitmaps and fails the test if they are different. The two bitmaps
- * are considered different if more than [errorCount] pixels differ by more than
- * [threshold] in any of the RGB channels.
+ * Compares two bitmaps and fails the test if they are different. The two bitmaps are considered
+ * different if more than [errorCount] pixels differ by more than [threshold] in any of the RGB
+ * channels.
  */
 fun compareBitmaps(bitmap1: Bitmap, bitmap2: Bitmap, errorCount: Int, threshold: Int = 1) {
     assertEquals(bitmap1.width, bitmap2.width)
@@ -140,10 +139,7 @@
             val (r1, g1, b1, _) = p1[index]
             val (r2, g2, b2, _) = p2[index]
 
-            if (abs(r1 - r2) > threshold ||
-                abs(g1 - g2) > threshold ||
-                abs(b1 - b2) > threshold
-            ) {
+            if (abs(r1 - r2) > threshold || abs(g1 - g2) > threshold || abs(b1 - b2) > threshold) {
                 count++
             }
         }
diff --git a/compose/animation/animation-core/src/androidInstrumentedTest/kotlin/androidx/compose/animation/core/InfiniteTransitionTest.kt b/compose/animation/animation-core/src/androidInstrumentedTest/kotlin/androidx/compose/animation/core/InfiniteTransitionTest.kt
index acc232c..ca3382b 100644
--- a/compose/animation/animation-core/src/androidInstrumentedTest/kotlin/androidx/compose/animation/core/InfiniteTransitionTest.kt
+++ b/compose/animation/animation-core/src/androidInstrumentedTest/kotlin/androidx/compose/animation/core/InfiniteTransitionTest.kt
@@ -35,56 +35,45 @@
 @LargeTest
 class InfiniteTransitionTest {
 
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
     @Test
     fun transitionTest() {
         // Manually advance the clock to prevent the infinite transition from being cancelled
         rule.mainClock.autoAdvance = false
 
-        val colorAnim = TargetBasedAnimation(
-            tween(1000),
-            Color.VectorConverter(Color.Red.colorSpace),
-            Color.Red,
-            Color.Green
-        )
+        val colorAnim =
+            TargetBasedAnimation(
+                tween(1000),
+                Color.VectorConverter(Color.Red.colorSpace),
+                Color.Red,
+                Color.Green
+            )
 
         // Animate from 0f to 0f for 1000ms
-        val keyframes = keyframes<Float> {
-            durationMillis = 1000
-            0f at 0
-            200f at 400
-            1000f at 1000
-        }
+        val keyframes =
+            keyframes<Float> {
+                durationMillis = 1000
+                0f at 0
+                200f at 400
+                1000f at 1000
+            }
 
-        val keyframesAnim = TargetBasedAnimation(
-            keyframes,
-            Float.VectorConverter,
-            0f,
-            0f
-        )
+        val keyframesAnim = TargetBasedAnimation(keyframes, Float.VectorConverter, 0f, 0f)
 
         val runAnimation = mutableStateOf(true)
         rule.setContent {
             val transition = rememberInfiniteTransition()
             if (runAnimation.value) {
-                val animFloat = transition.animateFloat(
-                    0f,
-                    0f,
-                    infiniteRepeatable(
-                        keyframes,
-                        repeatMode = RepeatMode.Reverse
+                val animFloat =
+                    transition.animateFloat(
+                        0f,
+                        0f,
+                        infiniteRepeatable(keyframes, repeatMode = RepeatMode.Reverse)
                     )
-                )
 
-                val animColor = transition.animateColor(
-                    Color.Red,
-                    Color.Green,
-                    infiniteRepeatable(
-                        tween(1000)
-                    )
-                )
+                val animColor =
+                    transition.animateColor(Color.Red, Color.Green, infiniteRepeatable(tween(1000)))
 
                 LaunchedEffect(Unit) {
                     val startTime = withFrameNanos { it }
@@ -96,9 +85,8 @@
                             iterationTime = 2000L * MillisToNanos - iterationTime
                         }
                         val expectedFloat = keyframesAnim.getValueFromNanos(iterationTime)
-                        val expectedColor = colorAnim.getValueFromNanos(
-                            playTime % (1000 * MillisToNanos)
-                        )
+                        val expectedColor =
+                            colorAnim.getValueFromNanos(playTime % (1000 * MillisToNanos))
                         assertEquals(expectedFloat, animFloat.value, 0.01f)
                         assertEquals(expectedColor, animColor.value)
                     }
diff --git a/compose/animation/animation-core/src/androidInstrumentedTest/kotlin/androidx/compose/animation/core/PathEasingTest.kt b/compose/animation/animation-core/src/androidInstrumentedTest/kotlin/androidx/compose/animation/core/PathEasingTest.kt
index 5d7d570..1566c9e 100644
--- a/compose/animation/animation-core/src/androidInstrumentedTest/kotlin/androidx/compose/animation/core/PathEasingTest.kt
+++ b/compose/animation/animation-core/src/androidInstrumentedTest/kotlin/androidx/compose/animation/core/PathEasingTest.kt
@@ -31,11 +31,12 @@
 class PathEasingTest {
     @Test
     fun pathEasing_Emphasized_BoundsCheck() {
-        val path = Path().apply {
-            moveTo(0f, 0f)
-            cubicTo(0.05f, 0f, 0.133333f, 0.06f, 0.166666f, 0.4f)
-            cubicTo(0.208333f, 0.82f, 0.25f, 1f, 1f, 1f)
-        }
+        val path =
+            Path().apply {
+                moveTo(0f, 0f)
+                cubicTo(0.05f, 0f, 0.133333f, 0.06f, 0.166666f, 0.4f)
+                cubicTo(0.208333f, 0.82f, 0.25f, 1f, 1f, 1f)
+            }
 
         val easing = PathEasing(path)
         assertThat(easing.transform(0f)).isZero()
@@ -54,27 +55,24 @@
 
     @Test(expected = IllegalArgumentException::class)
     fun pathEasing_DoesNotStartAtZero() {
-        val path = Path().apply {
-            moveTo(0.1f, 0.0f)
-            lineTo(1.0f, 1.0f)
-        }
+        val path =
+            Path().apply {
+                moveTo(0.1f, 0.0f)
+                lineTo(1.0f, 1.0f)
+            }
         PathEasing(path).transform(0.5f)
     }
 
     @Test(expected = IllegalArgumentException::class)
     fun pathEasing_DoesNotEndAtOne() {
-        val path = Path().apply {
-            lineTo(0.9f, 1.0f)
-        }
+        val path = Path().apply { lineTo(0.9f, 1.0f) }
         PathEasing(path).transform(0.5f)
     }
 
     @Test
     fun pathEasing_CompareToCubicEasing() {
         val cubicEasing = CubicBezierEasing(0.4f, 0.0f, 0.2f, 1.0f)
-        val path = Path().apply {
-            cubicTo(0.4f, 0.0f, 0.2f, 1.0f, 1.0f, 1.0f)
-        }
+        val path = Path().apply { cubicTo(0.4f, 0.0f, 0.2f, 1.0f, 1.0f, 1.0f) }
 
         val easing = PathEasing(path)
         for (i in 0..256) {
@@ -85,15 +83,16 @@
 
     @Test(expected = IllegalStateException::class)
     fun pathEasing_NonContinuousPath() {
-        val path = Path().apply {
-            moveTo(0.00f, 0.10f)
-            lineTo(0.25f, 0.10f)
-            // Gap from 0.25 to 0.50
-            moveTo(0.50f, 0.40f)
-            lineTo(0.75f, 0.40f)
-            moveTo(0.75f, 1.00f)
-            lineTo(1.00f, 1.00f)
-        }
+        val path =
+            Path().apply {
+                moveTo(0.00f, 0.10f)
+                lineTo(0.25f, 0.10f)
+                // Gap from 0.25 to 0.50
+                moveTo(0.50f, 0.40f)
+                lineTo(0.75f, 0.40f)
+                moveTo(0.75f, 1.00f)
+                lineTo(1.00f, 1.00f)
+            }
 
         val easing = PathEasing(path)
         assertEquals(0.1f, easing.transform(0.2f))
@@ -103,25 +102,24 @@
 
     @Test(expected = IllegalArgumentException::class)
     fun pathEasing_ClosedPath() {
-        val path = Path().apply {
-            addOval(Rect(0f, 0f, 1f, 1f))
-        }
+        val path = Path().apply { addOval(Rect(0f, 0f, 1f, 1f)) }
 
         PathEasing(path).transform(0.5f)
     }
 
     @Test
     fun pathEasing_Overlapping_Curves() {
-        val path = Path().apply {
-            moveTo(0.00f, 0.10f)
-            lineTo(0.25f, 0.10f)
-            moveTo(0.10f, 0.30f) // Overlaps with the previous line
-            lineTo(0.60f, 0.30f) // and the next line
-            moveTo(0.50f, 0.40f)
-            lineTo(0.75f, 0.40f)
-            moveTo(0.75f, 1.00f)
-            lineTo(1.00f, 1.00f)
-        }
+        val path =
+            Path().apply {
+                moveTo(0.00f, 0.10f)
+                lineTo(0.25f, 0.10f)
+                moveTo(0.10f, 0.30f) // Overlaps with the previous line
+                lineTo(0.60f, 0.30f) // and the next line
+                moveTo(0.50f, 0.40f)
+                lineTo(0.75f, 0.40f)
+                moveTo(0.75f, 1.00f)
+                lineTo(1.00f, 1.00f)
+            }
 
         val easing = PathEasing(path)
 
@@ -131,9 +129,7 @@
 
     @Test
     fun pathEasing_QuadTo() {
-        val path = Path().apply {
-            quadraticTo(1.0f, 0.0f, 1.0f, 1.0f)
-        }
+        val path = Path().apply { quadraticTo(1.0f, 0.0f, 1.0f, 1.0f) }
 
         val easing = PathEasing(path)
         var previousFraction = -Float.MAX_VALUE
@@ -150,10 +146,11 @@
 
     @Test
     fun pathEasing_QuadTo_OneToZero() {
-        val path = Path().apply {
-            moveTo(1.0f, 1.0f)
-            quadraticTo(1.0f, 0.0f, 0.0f, 0.0f)
-        }
+        val path =
+            Path().apply {
+                moveTo(1.0f, 1.0f)
+                quadraticTo(1.0f, 0.0f, 0.0f, 0.0f)
+            }
 
         val easing = PathEasing(path)
         var previousFraction = -Float.MAX_VALUE
@@ -170,17 +167,13 @@
 
     @Test
     fun pathEasing_Overshoots() {
-        val path = Path().apply {
-            cubicTo(0.34f, 1.56f, 0.64f, 1.0f, 1.0f, 1.0f)
-        }
+        val path = Path().apply { cubicTo(0.34f, 1.56f, 0.64f, 1.0f, 1.0f, 1.0f) }
         assertThat(PathEasing(path).transform(0.6f)).isGreaterThan(1.0f)
     }
 
     @Test
     fun pathEasing_Undershoots() {
-        val path = Path().apply {
-            cubicTo(0.68f, -0.6f, 0.32f, 1.6f, 1.0f, 1.0f)
-        }
+        val path = Path().apply { cubicTo(0.68f, -0.6f, 0.32f, 1.6f, 1.0f, 1.0f) }
         assertThat(PathEasing(path).transform(0.1f)).isLessThan(0.0f)
     }
 }
diff --git a/compose/animation/animation-core/src/androidInstrumentedTest/kotlin/androidx/compose/animation/core/SeekableTransitionStateTest.kt b/compose/animation/animation-core/src/androidInstrumentedTest/kotlin/androidx/compose/animation/core/SeekableTransitionStateTest.kt
index d5992f9..8939a89 100644
--- a/compose/animation/animation-core/src/androidInstrumentedTest/kotlin/androidx/compose/animation/core/SeekableTransitionStateTest.kt
+++ b/compose/animation/animation-core/src/androidInstrumentedTest/kotlin/androidx/compose/animation/core/SeekableTransitionStateTest.kt
@@ -65,8 +65,7 @@
 @RunWith(AndroidJUnit4::class)
 @MediumTest
 class SeekableTransitionStateTest {
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
     private enum class AnimStates {
         From,
@@ -84,15 +83,18 @@
                 seekableTransitionState.seekTo(0f, targetState = AnimStates.To)
             }
             val transition = rememberTransition(seekableTransitionState, label = "Test")
-            animatedValue = transition.animateInt(
-                label = "Value",
-                transitionSpec = { tween(easing = LinearEasing) }
-            ) { state ->
-                when (state) {
-                    AnimStates.From -> 0
-                    else -> 1000
-                }
-            }.value
+            animatedValue =
+                transition
+                    .animateInt(
+                        label = "Value",
+                        transitionSpec = { tween(easing = LinearEasing) }
+                    ) { state ->
+                        when (state) {
+                            AnimStates.From -> 0
+                            else -> 1000
+                        }
+                    }
+                    .value
         }
         rule.runOnIdle {
             assertEquals(0, animatedValue)
@@ -122,9 +124,7 @@
                 assertEquals(0f, seekableTransitionState.fraction)
             }
         }
-        rule.runOnIdle {
-            assertEquals(0, animatedValue)
-        }
+        rule.runOnIdle { assertEquals(0, animatedValue) }
     }
 
     @Test
@@ -142,22 +142,23 @@
             }
             coroutineScope = rememberCoroutineScope()
             val transition = rememberTransition(seekableTransitionState, label = "Test")
-            animatedValue = transition.animateInt(
-                label = "Value",
-                transitionSpec = { tween(easing = LinearEasing) }
-            ) { state ->
-                when (state) {
-                    AnimStates.From -> 0
-                    else -> 1000
-                }
-            }.value
+            animatedValue =
+                transition
+                    .animateInt(
+                        label = "Value",
+                        transitionSpec = { tween(easing = LinearEasing) }
+                    ) { state ->
+                        when (state) {
+                            AnimStates.From -> 0
+                            else -> 1000
+                        }
+                    }
+                    .value
             duration = transition.totalDurationNanos
         }
 
         rule.mainClock.advanceTimeByFrame() // wait for composition after seekTo()
-        val deferred1 = coroutineScope.async {
-            seekableTransitionState.animateTo()
-        }
+        val deferred1 = coroutineScope.async { seekableTransitionState.animateTo() }
         rule.mainClock.advanceTimeByFrame() // one frame to set the start time
         rule.mainClock.advanceTimeByFrame()
 
@@ -175,9 +176,7 @@
 
         // interrupt the progress
 
-        runBlocking {
-            seekableTransitionState.seekTo(fraction = 0.5f)
-        }
+        runBlocking { seekableTransitionState.seekTo(fraction = 0.5f) }
 
         rule.mainClock.advanceTimeByFrame()
 
@@ -189,9 +188,7 @@
         }
 
         // continue from the same place
-        val deferred2 = coroutineScope.async {
-            seekableTransitionState.animateTo()
-        }
+        val deferred2 = coroutineScope.async { seekableTransitionState.animateTo() }
         rule.waitForIdle() // wait for coroutine to run
         rule.mainClock.advanceTimeByFrame() // one frame to set the start time
         rule.mainClock.advanceTimeByFrame()
@@ -222,19 +219,24 @@
                 seekableTransitionState.seekTo(0f, targetState = AnimStates.To)
             }
             val transition = rememberTransition(seekableTransitionState, label = "Test")
-            animatedValue = transition.animateInt(
-                label = "Value",
-                transitionSpec = { tween(durationMillis = 200, easing = LinearEasing) }
-            ) { state ->
-                when (state) {
-                    AnimStates.From -> 0
-                    else -> 1000
+            animatedValue =
+                transition
+                    .animateInt(
+                        label = "Value",
+                        transitionSpec = { tween(durationMillis = 200, easing = LinearEasing) }
+                    ) { state ->
+                        when (state) {
+                            AnimStates.From -> 0
+                            else -> 1000
+                        }
+                    }
+                    .value
+            transition.AnimatedContent(
+                transitionSpec = {
+                    fadeIn(tween(durationMillis = 1000, easing = LinearEasing)) togetherWith
+                        fadeOut(tween(durationMillis = 1000, easing = LinearEasing))
                 }
-            }.value
-            transition.AnimatedContent(transitionSpec = {
-                fadeIn(tween(durationMillis = 1000, easing = LinearEasing)) togetherWith
-                    fadeOut(tween(durationMillis = 1000, easing = LinearEasing))
-            }) { state ->
+            ) { state ->
                 if (state == AnimStates.To) {
                     Box(Modifier.size(100.dp))
                 }
@@ -289,27 +291,26 @@
         rule.setContent {
             coroutineScope = rememberCoroutineScope()
             val transition = rememberTransition(seekableTransitionState, label = "Test")
-            animatedValue = transition.animateInt(
-                label = "Value",
-                transitionSpec = { tween(easing = LinearEasing) }
-            ) { state ->
-                when (state) {
-                    AnimStates.From -> 0
-                    else -> 1000
-                }
-            }.value
+            animatedValue =
+                transition
+                    .animateInt(
+                        label = "Value",
+                        transitionSpec = { tween(easing = LinearEasing) }
+                    ) { state ->
+                        when (state) {
+                            AnimStates.From -> 0
+                            else -> 1000
+                        }
+                    }
+                    .value
         }
 
-        val deferred1 = coroutineScope.async {
-            seekableTransitionState.animateTo(AnimStates.To)
-        }
+        val deferred1 = coroutineScope.async { seekableTransitionState.animateTo(AnimStates.To) }
         rule.mainClock.advanceTimeByFrame() // one frame to set the start time
         rule.mainClock.advanceTimeByFrame()
 
         // Running the same animation again should cancel the existing one
-        val deferred2 = coroutineScope.async {
-            seekableTransitionState.animateTo()
-        }
+        val deferred2 = coroutineScope.async { seekableTransitionState.animateTo() }
 
         rule.waitForIdle() // wait for coroutine to run
         rule.mainClock.advanceTimeByFrame()
@@ -318,9 +319,7 @@
         assertFalse(deferred2.isCancelled)
 
         // seeking should cancel the animation
-        val deferred3 = coroutineScope.async {
-            seekableTransitionState.seekTo(fraction = 0.25f)
-        }
+        val deferred3 = coroutineScope.async { seekableTransitionState.seekTo(fraction = 0.25f) }
 
         rule.waitForIdle() // wait for coroutine to run
         rule.mainClock.advanceTimeByFrame()
@@ -330,9 +329,7 @@
         assertTrue(deferred3.isCompleted)
 
         // start the animation again
-        val deferred4 = coroutineScope.async {
-            seekableTransitionState.animateTo()
-        }
+        val deferred4 = coroutineScope.async { seekableTransitionState.animateTo() }
 
         rule.waitForIdle() // wait for coroutine to run
         rule.mainClock.advanceTimeByFrame()
@@ -351,21 +348,24 @@
                 seekableTransitionState.seekTo(0f, targetState = AnimStates.To)
             }
             val transition = rememberTransition(seekableTransitionState, label = "Test")
-            animatedValue = transition.animateInt(
-                label = "Value",
-                transitionSpec = {
-                    if (initialState == targetState) {
-                        snap()
-                    } else {
-                        tween(easing = LinearEasing)
+            animatedValue =
+                transition
+                    .animateInt(
+                        label = "Value",
+                        transitionSpec = {
+                            if (initialState == targetState) {
+                                snap()
+                            } else {
+                                tween(easing = LinearEasing)
+                            }
+                        }
+                    ) { state ->
+                        when (state) {
+                            AnimStates.From -> 0
+                            else -> 1000
+                        }
                     }
-                }
-            ) { state ->
-                when (state) {
-                    AnimStates.From -> 0
-                    else -> 1000
-                }
-            }.value
+                    .value
             segment = transition.segment
         }
 
@@ -391,42 +391,44 @@
                 seekableTransitionState.seekTo(0f, targetState = AnimStates.To)
             }
             val transition = rememberTransition(seekableTransitionState, label = "Test")
-            val val1 = transition.animateInt(
-                label = "Value",
-                transitionSpec = { tween(easing = LinearEasing) }
-            ) { state ->
-                when (state) {
-                    AnimStates.From -> 0
-                    else -> 1000
+            val val1 =
+                transition.animateInt(
+                    label = "Value",
+                    transitionSpec = { tween(easing = LinearEasing) }
+                ) { state ->
+                    when (state) {
+                        AnimStates.From -> 0
+                        else -> 1000
+                    }
                 }
-            }
-            val val2 = transition.animateInt(
-                label = "Value",
-                transitionSpec = { tween(easing = LinearEasing) }
-            ) { state ->
-                when (state) {
-                    AnimStates.Other -> 1000
-                    else -> 0
+            val val2 =
+                transition.animateInt(
+                    label = "Value",
+                    transitionSpec = { tween(easing = LinearEasing) }
+                ) { state ->
+                    when (state) {
+                        AnimStates.Other -> 1000
+                        else -> 0
+                    }
                 }
-            }
-            val val3 = transition.animateInt(
-                label = "Value",
-                transitionSpec = { tween(easing = LinearEasing) }
-            ) { state ->
-                when (state) {
-                    AnimStates.From -> 0
-                    AnimStates.To -> 1000
-                    AnimStates.Other -> 2000
+            val val3 =
+                transition.animateInt(
+                    label = "Value",
+                    transitionSpec = { tween(easing = LinearEasing) }
+                ) { state ->
+                    when (state) {
+                        AnimStates.From -> 0
+                        AnimStates.To -> 1000
+                        AnimStates.Other -> 2000
+                    }
                 }
-            }
             Box(
-                Modifier
-                    .fillMaxSize()
-                    .drawBehind {
-                        animatedValue1 = val1.value
-                        animatedValue2 = val2.value
-                        animatedValue3 = val3.value
-                    })
+                Modifier.fillMaxSize().drawBehind {
+                    animatedValue1 = val1.value
+                    animatedValue2 = val2.value
+                    animatedValue3 = val3.value
+                }
+            )
         }
         rule.mainClock.advanceTimeByFrame() // let seekTo() run
         rule.runOnIdle {
@@ -449,9 +451,10 @@
         }
         // Start seek to new state. It won't complete until the initial state is
         // animated to "To"
-        val seekTo = coroutineScope.async {
-            seekableTransitionState.seekTo(0f, targetState = AnimStates.Other)
-        }
+        val seekTo =
+            coroutineScope.async {
+                seekableTransitionState.seekTo(0f, targetState = AnimStates.Other)
+            }
         rule.mainClock.advanceTimeByFrame() // must recompose to Other
         rule.runOnIdle {
             assertEquals(AnimStates.Other, seekableTransitionState.targetState)
@@ -469,10 +472,11 @@
             assertEquals(0, animatedValue2)
             assertEquals(500 + (500f * 80f / 150f), animatedValue3.toFloat(), 1f)
         }
-        val seekToFraction = coroutineScope.async {
-            seekableTransitionState.seekTo(fraction = 0.5f)
-            assertEquals(0.5f, seekableTransitionState.fraction)
-        }
+        val seekToFraction =
+            coroutineScope.async {
+                seekableTransitionState.seekTo(fraction = 0.5f)
+                assertEquals(0.5f, seekableTransitionState.fraction)
+            }
         rule.mainClock.advanceTimeByFrame()
         rule.runOnIdle {
             val expected1Value = 500 + (500f * 96f / 150f)
@@ -496,9 +500,7 @@
             assertEquals(1000, animatedValue1)
             assertEquals(500, animatedValue2)
             assertEquals(1500, animatedValue3)
-            runBlocking {
-                seekableTransitionState.seekTo(fraction = 1f)
-            }
+            runBlocking { seekableTransitionState.seekTo(fraction = 1f) }
         }
         rule.mainClock.advanceTimeByFrame()
         rule.runOnIdle {
@@ -525,42 +527,44 @@
                 seekableTransitionState.animateTo(AnimStates.To)
             }
             val transition = rememberTransition(seekableTransitionState, label = "Test")
-            val val1 = transition.animateInt(
-                label = "Value",
-                transitionSpec = { tween(easing = LinearEasing) }
-            ) { state ->
-                when (state) {
-                    AnimStates.From -> 0
-                    else -> 1000
+            val val1 =
+                transition.animateInt(
+                    label = "Value",
+                    transitionSpec = { tween(easing = LinearEasing) }
+                ) { state ->
+                    when (state) {
+                        AnimStates.From -> 0
+                        else -> 1000
+                    }
                 }
-            }
-            val val2 = transition.animateInt(
-                label = "Value",
-                transitionSpec = { tween(easing = LinearEasing) }
-            ) { state ->
-                when (state) {
-                    AnimStates.Other -> 1000
-                    else -> 0
+            val val2 =
+                transition.animateInt(
+                    label = "Value",
+                    transitionSpec = { tween(easing = LinearEasing) }
+                ) { state ->
+                    when (state) {
+                        AnimStates.Other -> 1000
+                        else -> 0
+                    }
                 }
-            }
-            val val3 = transition.animateInt(
-                label = "Value",
-                transitionSpec = { tween(easing = LinearEasing) }
-            ) { state ->
-                when (state) {
-                    AnimStates.From -> 0
-                    AnimStates.To -> 1000
-                    AnimStates.Other -> 2000
+            val val3 =
+                transition.animateInt(
+                    label = "Value",
+                    transitionSpec = { tween(easing = LinearEasing) }
+                ) { state ->
+                    when (state) {
+                        AnimStates.From -> 0
+                        AnimStates.To -> 1000
+                        AnimStates.Other -> 2000
+                    }
                 }
-            }
             Box(
-                Modifier
-                    .fillMaxSize()
-                    .drawBehind {
-                        animatedValue1 = val1.value
-                        animatedValue2 = val2.value
-                        animatedValue3 = val3.value
-                    })
+                Modifier.fillMaxSize().drawBehind {
+                    animatedValue1 = val1.value
+                    animatedValue2 = val2.value
+                    animatedValue3 = val3.value
+                }
+            )
         }
         rule.mainClock.advanceTimeByFrame() // lock in the animation start time
         rule.runOnIdle {
@@ -582,10 +586,11 @@
             assertEquals(533f, animatedValue3.toFloat(), 1f)
         }
 
-        val seekTo = coroutineScope.async {
-            // seek to Other. This won't finish until the animation finishes
-            seekableTransitionState.seekTo(0f, targetState = AnimStates.Other)
-        }
+        val seekTo =
+            coroutineScope.async {
+                // seek to Other. This won't finish until the animation finishes
+                seekableTransitionState.seekTo(0f, targetState = AnimStates.Other)
+            }
 
         rule.runOnIdle {
             // Nothing will have changed yet. The initial value should continue to animate
@@ -603,13 +608,12 @@
             assertEquals(0, animatedValue2)
             assertEquals(640f, animatedValue3.toFloat(), 1f)
         }
-        val seekToHalf = coroutineScope.async {
-            seekableTransitionState.seekTo(fraction = 0.5f)
-            assertEquals(0.5f, seekableTransitionState.fraction)
-        }
-        rule.runOnIdle {
-            assertEquals(500, animatedValue2)
-        }
+        val seekToHalf =
+            coroutineScope.async {
+                seekableTransitionState.seekTo(fraction = 0.5f)
+                assertEquals(0.5f, seekableTransitionState.fraction)
+            }
+        rule.runOnIdle { assertEquals(500, animatedValue2) }
 
         // Advance to the end of the seekTo() animation
         rule.mainClock.advanceTimeBy(5_000)
@@ -652,42 +656,44 @@
                 seekableTransitionState.animateTo(AnimStates.To)
             }
             val transition = rememberTransition(seekableTransitionState, label = "Test")
-            val val1 = transition.animateInt(
-                label = "Value",
-                transitionSpec = { tween(easing = LinearEasing) }
-            ) { state ->
-                when (state) {
-                    AnimStates.From -> 0
-                    else -> 1000
+            val val1 =
+                transition.animateInt(
+                    label = "Value",
+                    transitionSpec = { tween(easing = LinearEasing) }
+                ) { state ->
+                    when (state) {
+                        AnimStates.From -> 0
+                        else -> 1000
+                    }
                 }
-            }
-            val val2 = transition.animateInt(
-                label = "Value",
-                transitionSpec = { tween(easing = LinearEasing) }
-            ) { state ->
-                when (state) {
-                    AnimStates.Other -> 1000
-                    else -> 0
+            val val2 =
+                transition.animateInt(
+                    label = "Value",
+                    transitionSpec = { tween(easing = LinearEasing) }
+                ) { state ->
+                    when (state) {
+                        AnimStates.Other -> 1000
+                        else -> 0
+                    }
                 }
-            }
-            val val3 = transition.animateInt(
-                label = "Value",
-                transitionSpec = { tween(easing = LinearEasing) }
-            ) { state ->
-                when (state) {
-                    AnimStates.From -> 0
-                    AnimStates.To -> 1000
-                    AnimStates.Other -> 2000
+            val val3 =
+                transition.animateInt(
+                    label = "Value",
+                    transitionSpec = { tween(easing = LinearEasing) }
+                ) { state ->
+                    when (state) {
+                        AnimStates.From -> 0
+                        AnimStates.To -> 1000
+                        AnimStates.Other -> 2000
+                    }
                 }
-            }
             Box(
-                Modifier
-                    .fillMaxSize()
-                    .drawBehind {
-                        animatedValue1 = val1.value
-                        animatedValue2 = val2.value
-                        animatedValue3 = val3.value
-                    })
+                Modifier.fillMaxSize().drawBehind {
+                    animatedValue1 = val1.value
+                    animatedValue2 = val2.value
+                    animatedValue3 = val3.value
+                }
+            )
         }
         rule.mainClock.advanceTimeByFrame() // lock in the animation start time
         rule.runOnIdle {
@@ -708,9 +714,8 @@
             assertEquals(0, animatedValue2)
             assertEquals(533f, animatedValue3.toFloat(), 1f)
         }
-        val animateToOther = coroutineScope.async {
-            seekableTransitionState.animateTo(AnimStates.Other)
-        }
+        val animateToOther =
+            coroutineScope.async { seekableTransitionState.animateTo(AnimStates.Other) }
 
         rule.mainClock.advanceTimeBy(16) // composition after animateTo()
 
@@ -766,42 +771,44 @@
                 seekableTransitionState.animateTo(targetState)
             }
             val transition = rememberTransition(seekableTransitionState, label = "Test")
-            val val1 = transition.animateInt(
-                label = "Value",
-                transitionSpec = { tween(easing = LinearEasing) }
-            ) { state ->
-                when (state) {
-                    AnimStates.From -> 0
-                    else -> 1000
+            val val1 =
+                transition.animateInt(
+                    label = "Value",
+                    transitionSpec = { tween(easing = LinearEasing) }
+                ) { state ->
+                    when (state) {
+                        AnimStates.From -> 0
+                        else -> 1000
+                    }
                 }
-            }
-            val val2 = transition.animateInt(
-                label = "Value",
-                transitionSpec = { tween(easing = LinearEasing) }
-            ) { state ->
-                when (state) {
-                    AnimStates.Other -> 1000
-                    else -> 0
+            val val2 =
+                transition.animateInt(
+                    label = "Value",
+                    transitionSpec = { tween(easing = LinearEasing) }
+                ) { state ->
+                    when (state) {
+                        AnimStates.Other -> 1000
+                        else -> 0
+                    }
                 }
-            }
-            val val3 = transition.animateInt(
-                label = "Value",
-                transitionSpec = { tween(easing = LinearEasing) }
-            ) { state ->
-                when (state) {
-                    AnimStates.From -> 0
-                    AnimStates.To -> 1000
-                    AnimStates.Other -> 2000
+            val val3 =
+                transition.animateInt(
+                    label = "Value",
+                    transitionSpec = { tween(easing = LinearEasing) }
+                ) { state ->
+                    when (state) {
+                        AnimStates.From -> 0
+                        AnimStates.To -> 1000
+                        AnimStates.Other -> 2000
+                    }
                 }
-            }
             Box(
-                Modifier
-                    .fillMaxSize()
-                    .drawBehind {
-                        animatedValue1 = val1.value
-                        animatedValue2 = val2.value
-                        animatedValue3 = val3.value
-                    })
+                Modifier.fillMaxSize().drawBehind {
+                    animatedValue1 = val1.value
+                    animatedValue2 = val2.value
+                    animatedValue3 = val3.value
+                }
+            )
         }
         rule.mainClock.advanceTimeByFrame() // lock in the animation start time
         rule.runOnIdle {
@@ -876,42 +883,44 @@
         rule.setContent {
             coroutineScope = rememberCoroutineScope()
             val transition = rememberTransition(seekableTransitionState, label = "Test")
-            val val1 = transition.animateInt(
-                label = "Value",
-                transitionSpec = { tween(easing = LinearEasing) }
-            ) { state ->
-                when (state) {
-                    AnimStates.From -> 0
-                    else -> 1000
+            val val1 =
+                transition.animateInt(
+                    label = "Value",
+                    transitionSpec = { tween(easing = LinearEasing) }
+                ) { state ->
+                    when (state) {
+                        AnimStates.From -> 0
+                        else -> 1000
+                    }
                 }
-            }
-            val val2 = transition.animateInt(
-                label = "Value",
-                transitionSpec = { tween(easing = LinearEasing) }
-            ) { state ->
-                when (state) {
-                    AnimStates.Other -> 1000
-                    else -> 0
+            val val2 =
+                transition.animateInt(
+                    label = "Value",
+                    transitionSpec = { tween(easing = LinearEasing) }
+                ) { state ->
+                    when (state) {
+                        AnimStates.Other -> 1000
+                        else -> 0
+                    }
                 }
-            }
-            val val3 = transition.animateInt(
-                label = "Value",
-                transitionSpec = { tween(easing = LinearEasing) }
-            ) { state ->
-                when (state) {
-                    AnimStates.From -> 0
-                    AnimStates.To -> 1000
-                    AnimStates.Other -> 2000
+            val val3 =
+                transition.animateInt(
+                    label = "Value",
+                    transitionSpec = { tween(easing = LinearEasing) }
+                ) { state ->
+                    when (state) {
+                        AnimStates.From -> 0
+                        AnimStates.To -> 1000
+                        AnimStates.Other -> 2000
+                    }
                 }
-            }
             Box(
-                Modifier
-                    .fillMaxSize()
-                    .drawBehind {
-                        animatedValue1 = val1.value
-                        animatedValue2 = val2.value
-                        animatedValue3 = val3.value
-                    })
+                Modifier.fillMaxSize().drawBehind {
+                    animatedValue1 = val1.value
+                    animatedValue2 = val2.value
+                    animatedValue3 = val3.value
+                }
+            )
         }
         rule.waitForIdle()
         coroutineScope.launch { seekableTransitionState.seekTo(0f, targetState = AnimStates.To) }
@@ -956,17 +965,11 @@
                 enter = fadeIn(tween(300, 0, LinearEasing)),
                 exit = fadeOut(tween(300, 0, LinearEasing))
             ) {
-                Box(
-                    Modifier
-                        .fillMaxSize()
-                        .drawBehind { drawRect(Color.Red) }
-                )
+                Box(Modifier.fillMaxSize().drawBehind { drawRect(Color.Red) })
             }
         }
         rule.waitForIdle()
-        val seekTo = coroutineScope.async {
-            seekableTransitionState.seekTo(0.5f, AnimStates.To)
-        }
+        val seekTo = coroutineScope.async { seekableTransitionState.seekTo(0.5f, AnimStates.To) }
         rule.mainClock.advanceTimeByFrame()
         rule.runOnIdle {
             assertTrue(seekTo.isCompleted)
@@ -984,21 +987,17 @@
         rule.setContent {
             coroutineScope = rememberCoroutineScope()
             val transition = rememberTransition(seekableTransitionState, label = "Test")
-            val val1 = transition.animateInt(
-                label = "Value",
-                transitionSpec = { tween(easing = LinearEasing) }
-            ) { state ->
-                when (state) {
-                    AnimStates.From -> 0
-                    else -> 1000
+            val val1 =
+                transition.animateInt(
+                    label = "Value",
+                    transitionSpec = { tween(easing = LinearEasing) }
+                ) { state ->
+                    when (state) {
+                        AnimStates.From -> 0
+                        else -> 1000
+                    }
                 }
-            }
-            Box(
-                Modifier
-                    .fillMaxSize()
-                    .drawBehind {
-                        animatedValue1 = val1.value
-                    })
+            Box(Modifier.fillMaxSize().drawBehind { animatedValue1 = val1.value })
         }
         rule.waitForIdle()
         val deferred = coroutineScope.async { seekableTransitionState.animateTo(AnimStates.To) }
@@ -1024,31 +1023,26 @@
         rule.setContent {
             coroutineScope = rememberCoroutineScope()
             val transition = rememberTransition(seekableTransitionState, label = "Test")
-            val val1 = transition.animateInt(
-                label = "Value",
-                transitionSpec = { tween(durationMillis = 100, easing = LinearEasing) }
-            ) { state ->
-                when (state) {
-                    AnimStates.From -> 0
-                    else -> 1000
+            val val1 =
+                transition.animateInt(
+                    label = "Value",
+                    transitionSpec = { tween(durationMillis = 100, easing = LinearEasing) }
+                ) { state ->
+                    when (state) {
+                        AnimStates.From -> 0
+                        else -> 1000
+                    }
                 }
-            }
-            Box(
-                Modifier
-                    .fillMaxSize()
-                    .drawBehind {
-                        animatedValue1 = val1.value
-                    })
+            Box(Modifier.fillMaxSize().drawBehind { animatedValue1 = val1.value })
         }
         rule.waitForIdle()
-        coroutineScope.launch {
-            seekableTransitionState.seekTo(0.5f, AnimStates.To)
-        }
+        coroutineScope.launch { seekableTransitionState.seekTo(0.5f, AnimStates.To) }
         rule.waitForIdle()
         rule.mainClock.advanceTimeByFrame()
-        val deferred = coroutineScope.async {
-            seekableTransitionState.animateTo(animationSpec = tween(1000, 0, LinearEasing))
-        }
+        val deferred =
+            coroutineScope.async {
+                seekableTransitionState.animateTo(animationSpec = tween(1000, 0, LinearEasing))
+            }
         rule.mainClock.advanceTimeByFrame() // lock in the start time
         rule.mainClock.advanceTimeBy(64)
         rule.runOnIdle {
@@ -1082,21 +1076,17 @@
         rule.setContent {
             coroutineScope = rememberCoroutineScope()
             val transition = rememberTransition(seekableTransitionState, label = "Test")
-            val val1 = transition.animateInt(
-                label = "Value",
-                transitionSpec = { tween(durationMillis = 1000, easing = LinearEasing) }
-            ) { state ->
-                when (state) {
-                    AnimStates.From -> 0
-                    else -> 1000
+            val val1 =
+                transition.animateInt(
+                    label = "Value",
+                    transitionSpec = { tween(durationMillis = 1000, easing = LinearEasing) }
+                ) { state ->
+                    when (state) {
+                        AnimStates.From -> 0
+                        else -> 1000
+                    }
                 }
-            }
-            Box(
-                Modifier
-                    .fillMaxSize()
-                    .drawBehind {
-                        animatedValue1 = val1.value
-                    })
+            Box(Modifier.fillMaxSize().drawBehind { animatedValue1 = val1.value })
         }
         rule.waitForIdle()
         coroutineScope.launch {
@@ -1108,21 +1098,13 @@
             assertEquals(1000, animatedValue1)
         }
         rule.mainClock.advanceTimeByFrame() // lock in the animation clock
-        rule.runOnIdle {
-            assertEquals(1000, animatedValue1)
-        }
+        rule.runOnIdle { assertEquals(1000, animatedValue1) }
         rule.mainClock.advanceTimeByFrame()
-        rule.runOnIdle {
-            assertEquals(984, animatedValue1)
-        }
+        rule.runOnIdle { assertEquals(984, animatedValue1) }
         rule.mainClock.advanceTimeByFrame()
-        rule.runOnIdle {
-            assertEquals(968, animatedValue1)
-        }
+        rule.runOnIdle { assertEquals(968, animatedValue1) }
         rule.mainClock.advanceTimeBy(1000)
-        rule.runOnIdle {
-            assertEquals(0, animatedValue1)
-        }
+        rule.runOnIdle { assertEquals(0, animatedValue1) }
     }
 
     @Test
@@ -1135,33 +1117,32 @@
         rule.setContent {
             coroutineScope = rememberCoroutineScope()
             val transition = rememberTransition(seekableTransitionState, label = "Test")
-            val val1 = transition.animateInt(
-                label = "Value",
-                transitionSpec = { tween(durationMillis = 1000, easing = LinearEasing) }
-            ) { state ->
-                val target = when (state) {
-                    AnimStates.From -> 0
-                    AnimStates.Other -> 2000
-                    else -> 1000
+            val val1 =
+                transition.animateInt(
+                    label = "Value",
+                    transitionSpec = { tween(durationMillis = 1000, easing = LinearEasing) }
+                ) { state ->
+                    val target =
+                        when (state) {
+                            AnimStates.From -> 0
+                            AnimStates.Other -> 2000
+                            else -> 1000
+                        }
+                    target
                 }
-                target
-            }
-            Box(
-                Modifier
-                    .fillMaxSize()
-                    .drawBehind {
-                        animatedValue1 = val1.value
-                    })
+            Box(Modifier.fillMaxSize().drawBehind { animatedValue1 = val1.value })
         }
         rule.waitForIdle()
-        val defer1 = coroutineScope.async {
-            seekableTransitionState.seekTo(1f, AnimStates.To)
-            seekableTransitionState.animateTo(AnimStates.From)
-        }
-        val defer2 = coroutineScope.async {
-            seekableTransitionState.seekTo(1f, AnimStates.Other)
-            seekableTransitionState.animateTo(AnimStates.From)
-        }
+        val defer1 =
+            coroutineScope.async {
+                seekableTransitionState.seekTo(1f, AnimStates.To)
+                seekableTransitionState.animateTo(AnimStates.From)
+            }
+        val defer2 =
+            coroutineScope.async {
+                seekableTransitionState.seekTo(1f, AnimStates.Other)
+                seekableTransitionState.animateTo(AnimStates.From)
+            }
         rule.mainClock.advanceTimeByFrame() // let the composition happen after seekTo
         rule.runOnIdle {
             assertTrue(defer1.isCancelled)
@@ -1169,13 +1150,9 @@
             assertEquals(2000, animatedValue1)
         }
         rule.mainClock.advanceTimeByFrame() // lock in the animation clock
-        rule.runOnIdle {
-            assertEquals(2000, animatedValue1)
-        }
+        rule.runOnIdle { assertEquals(2000, animatedValue1) }
         rule.mainClock.advanceTimeByFrame()
-        rule.runOnIdle {
-            assertEquals(1968, animatedValue1)
-        }
+        rule.runOnIdle { assertEquals(1968, animatedValue1) }
         rule.mainClock.advanceTimeBy(1000)
         rule.runOnIdle {
             assertEquals(0, animatedValue1)
@@ -1193,33 +1170,32 @@
         rule.setContent {
             coroutineScope = rememberCoroutineScope()
             val transition = rememberTransition(seekableTransitionState, label = "Test")
-            val val1 = transition.animateInt(
-                label = "Value",
-                transitionSpec = { tween(durationMillis = 1000, easing = LinearEasing) }
-            ) { state ->
-                val target = when (state) {
-                    AnimStates.From -> 0
-                    AnimStates.Other -> 2000
-                    else -> 1000
+            val val1 =
+                transition.animateInt(
+                    label = "Value",
+                    transitionSpec = { tween(durationMillis = 1000, easing = LinearEasing) }
+                ) { state ->
+                    val target =
+                        when (state) {
+                            AnimStates.From -> 0
+                            AnimStates.Other -> 2000
+                            else -> 1000
+                        }
+                    target
                 }
-                target
-            }
-            Box(
-                Modifier
-                    .fillMaxSize()
-                    .drawBehind {
-                        animatedValue1 = val1.value
-                    })
+            Box(Modifier.fillMaxSize().drawBehind { animatedValue1 = val1.value })
         }
         rule.waitForIdle()
-        val defer1 = coroutineScope.async {
-            seekableTransitionState.snapTo(AnimStates.To)
-            seekableTransitionState.animateTo(AnimStates.From)
-        }
-        val defer2 = coroutineScope.async {
-            seekableTransitionState.snapTo(AnimStates.Other)
-            seekableTransitionState.animateTo(AnimStates.From)
-        }
+        val defer1 =
+            coroutineScope.async {
+                seekableTransitionState.snapTo(AnimStates.To)
+                seekableTransitionState.animateTo(AnimStates.From)
+            }
+        val defer2 =
+            coroutineScope.async {
+                seekableTransitionState.snapTo(AnimStates.Other)
+                seekableTransitionState.animateTo(AnimStates.From)
+            }
         rule.mainClock.advanceTimeByFrame() // let the composition happen after seekTo
         rule.runOnIdle {
             assertTrue(defer1.isCancelled)
@@ -1227,13 +1203,9 @@
             assertEquals(2000, animatedValue1)
         }
         rule.mainClock.advanceTimeByFrame() // lock in the animation clock
-        rule.runOnIdle {
-            assertEquals(2000, animatedValue1)
-        }
+        rule.runOnIdle { assertEquals(2000, animatedValue1) }
         rule.mainClock.advanceTimeByFrame()
-        rule.runOnIdle {
-            assertEquals(1968, animatedValue1)
-        }
+        rule.runOnIdle { assertEquals(1968, animatedValue1) }
         rule.mainClock.advanceTimeBy(1000)
         rule.runOnIdle {
             assertEquals(0, animatedValue1)
@@ -1255,23 +1227,20 @@
         rule.setContent {
             coroutineScope = rememberCoroutineScope()
             val transition = rememberTransition(seekableTransitionState, label = "Test")
-            val val1 = transition.animateInt(
-                label = "Value",
-                transitionSpec = { tween(durationMillis = 1000, easing = LinearEasing) }
-            ) { state ->
-                val target = when (state) {
-                    AnimStates.From -> 0
-                    AnimStates.Other -> 2000
-                    else -> 1000
+            val val1 =
+                transition.animateInt(
+                    label = "Value",
+                    transitionSpec = { tween(durationMillis = 1000, easing = LinearEasing) }
+                ) { state ->
+                    val target =
+                        when (state) {
+                            AnimStates.From -> 0
+                            AnimStates.Other -> 2000
+                            else -> 1000
+                        }
+                    target
                 }
-                target
-            }
-            Box(
-                Modifier
-                    .fillMaxSize()
-                    .drawBehind {
-                        animatedValue1 = val1.value
-                    })
+            Box(Modifier.fillMaxSize().drawBehind { animatedValue1 = val1.value })
         }
         rule.waitForIdle()
         coroutineScope.launch {
@@ -1283,21 +1252,13 @@
             seekableTransitionState.animateTo(AnimStates.From)
         }
         rule.mainClock.advanceTimeByFrame() // let the composition happen after seekTo
-        rule.runOnIdle {
-            assertEquals(2000, animatedValue1)
-        }
+        rule.runOnIdle { assertEquals(2000, animatedValue1) }
         rule.mainClock.advanceTimeByFrame() // lock in the animation clock
-        rule.runOnIdle {
-            assertEquals(2000, animatedValue1)
-        }
+        rule.runOnIdle { assertEquals(2000, animatedValue1) }
         rule.mainClock.advanceTimeByFrame()
-        rule.runOnIdle {
-            assertEquals(1968, animatedValue1)
-        }
+        rule.runOnIdle { assertEquals(1968, animatedValue1) }
         rule.mainClock.advanceTimeBy(1000)
-        rule.runOnIdle {
-            assertEquals(0, animatedValue1)
-        }
+        rule.runOnIdle { assertEquals(0, animatedValue1) }
     }
 
     /**
@@ -1314,23 +1275,20 @@
         rule.setContent {
             coroutineScope = rememberCoroutineScope()
             val transition = rememberTransition(seekableTransitionState, label = "Test")
-            val val1 = transition.animateInt(
-                label = "Value",
-                transitionSpec = { tween(durationMillis = 1000, easing = LinearEasing) }
-            ) { state ->
-                val target = when (state) {
-                    AnimStates.From -> 0
-                    AnimStates.Other -> 2000
-                    else -> 1000
+            val val1 =
+                transition.animateInt(
+                    label = "Value",
+                    transitionSpec = { tween(durationMillis = 1000, easing = LinearEasing) }
+                ) { state ->
+                    val target =
+                        when (state) {
+                            AnimStates.From -> 0
+                            AnimStates.Other -> 2000
+                            else -> 1000
+                        }
+                    target
                 }
-                target
-            }
-            Box(
-                Modifier
-                    .fillMaxSize()
-                    .drawBehind {
-                        animatedValue1 = val1.value
-                    })
+            Box(Modifier.fillMaxSize().drawBehind { animatedValue1 = val1.value })
         }
         rule.waitForIdle()
         coroutineScope.launch {
@@ -1342,21 +1300,13 @@
             seekableTransitionState.animateTo(AnimStates.From)
         }
         rule.mainClock.advanceTimeByFrame() // let the composition happen after snapTo
-        rule.runOnIdle {
-            assertEquals(2000, animatedValue1)
-        }
+        rule.runOnIdle { assertEquals(2000, animatedValue1) }
         rule.mainClock.advanceTimeByFrame() // lock in the animation clock
-        rule.runOnIdle {
-            assertEquals(2000, animatedValue1)
-        }
+        rule.runOnIdle { assertEquals(2000, animatedValue1) }
         rule.mainClock.advanceTimeByFrame()
-        rule.runOnIdle {
-            assertEquals(1968, animatedValue1)
-        }
+        rule.runOnIdle { assertEquals(1968, animatedValue1) }
         rule.mainClock.advanceTimeBy(1000)
-        rule.runOnIdle {
-            assertEquals(0, animatedValue1)
-        }
+        rule.runOnIdle { assertEquals(0, animatedValue1) }
     }
 
     @Test
@@ -1369,38 +1319,29 @@
         rule.setContent {
             coroutineScope = rememberCoroutineScope()
             val transition = rememberTransition(seekableTransitionState, label = "Test")
-            val val1 = transition.animateInt(
-                label = "Value",
-                transitionSpec = { tween(durationMillis = 1000, easing = LinearEasing) }
-            ) { state ->
-                val target = when (state) {
-                    AnimStates.From -> 0
-                    AnimStates.Other -> 2000
-                    else -> 1000
+            val val1 =
+                transition.animateInt(
+                    label = "Value",
+                    transitionSpec = { tween(durationMillis = 1000, easing = LinearEasing) }
+                ) { state ->
+                    val target =
+                        when (state) {
+                            AnimStates.From -> 0
+                            AnimStates.Other -> 2000
+                            else -> 1000
+                        }
+                    target
                 }
-                target
-            }
-            Box(
-                Modifier
-                    .fillMaxSize()
-                    .drawBehind {
-                        animatedValue1 = val1.value
-                    })
+            Box(Modifier.fillMaxSize().drawBehind { animatedValue1 = val1.value })
         }
         rule.waitForIdle()
-        coroutineScope.launch {
-            seekableTransitionState.seekTo(1f, AnimStates.To)
-        }
+        coroutineScope.launch { seekableTransitionState.seekTo(1f, AnimStates.To) }
         rule.mainClock.advanceTimeByFrame()
         rule.waitForIdle()
-        val animation = coroutineScope.async {
-            seekableTransitionState.animateTo(AnimStates.Other)
-        }
+        val animation = coroutineScope.async { seekableTransitionState.animateTo(AnimStates.Other) }
         rule.mainClock.advanceTimeByFrame()
         rule.waitForIdle()
-        val snapTo = coroutineScope.async {
-            seekableTransitionState.snapTo(AnimStates.From)
-        }
+        val snapTo = coroutineScope.async { seekableTransitionState.snapTo(AnimStates.From) }
         rule.mainClock.advanceTimeByFrame()
         rule.runOnIdle {
             assertTrue(animation.isCancelled)
@@ -1419,35 +1360,26 @@
         rule.setContent {
             coroutineScope = rememberCoroutineScope()
             val transition = rememberTransition(seekableTransitionState, label = "Test")
-            val val1 = transition.animateInt(
-                label = "Value",
-                transitionSpec = { tween(durationMillis = 1000, easing = LinearEasing) }
-            ) { state ->
-                val target = when (state) {
-                    AnimStates.From -> 0
-                    AnimStates.Other -> 2000
-                    else -> 1000
+            val val1 =
+                transition.animateInt(
+                    label = "Value",
+                    transitionSpec = { tween(durationMillis = 1000, easing = LinearEasing) }
+                ) { state ->
+                    val target =
+                        when (state) {
+                            AnimStates.From -> 0
+                            AnimStates.Other -> 2000
+                            else -> 1000
+                        }
+                    target
                 }
-                target
-            }
-            Box(
-                Modifier
-                    .fillMaxSize()
-                    .drawBehind {
-                        animatedValue1 = val1.value
-                    })
+            Box(Modifier.fillMaxSize().drawBehind { animatedValue1 = val1.value })
         }
         rule.waitForIdle()
-        val seekTo = coroutineScope.async {
-            seekableTransitionState.seekTo(0.5f, AnimStates.To)
-        }
+        val seekTo = coroutineScope.async { seekableTransitionState.seekTo(0.5f, AnimStates.To) }
         rule.mainClock.advanceTimeByFrame()
-        rule.runOnIdle {
-            assertTrue(seekTo.isCompleted)
-        }
-        val snapTo = coroutineScope.async {
-            seekableTransitionState.snapTo(AnimStates.To)
-        }
+        rule.runOnIdle { assertTrue(seekTo.isCompleted) }
+        val snapTo = coroutineScope.async { seekableTransitionState.snapTo(AnimStates.To) }
         rule.mainClock.advanceTimeByFrame()
         rule.runOnIdle {
             assertTrue(snapTo.isCompleted)
@@ -1465,35 +1397,26 @@
         rule.setContent {
             coroutineScope = rememberCoroutineScope()
             val transition = rememberTransition(seekableTransitionState, label = "Test")
-            val val1 = transition.animateInt(
-                label = "Value",
-                transitionSpec = { tween(durationMillis = 1000, easing = LinearEasing) }
-            ) { state ->
-                val target = when (state) {
-                    AnimStates.From -> 0
-                    AnimStates.Other -> 2000
-                    else -> 1000
+            val val1 =
+                transition.animateInt(
+                    label = "Value",
+                    transitionSpec = { tween(durationMillis = 1000, easing = LinearEasing) }
+                ) { state ->
+                    val target =
+                        when (state) {
+                            AnimStates.From -> 0
+                            AnimStates.Other -> 2000
+                            else -> 1000
+                        }
+                    target
                 }
-                target
-            }
-            Box(
-                Modifier
-                    .fillMaxSize()
-                    .drawBehind {
-                        animatedValue1 = val1.value
-                    })
+            Box(Modifier.fillMaxSize().drawBehind { animatedValue1 = val1.value })
         }
         rule.waitForIdle()
-        val seekTo = coroutineScope.async {
-            seekableTransitionState.seekTo(0.5f, AnimStates.To)
-        }
+        val seekTo = coroutineScope.async { seekableTransitionState.seekTo(0.5f, AnimStates.To) }
         rule.mainClock.advanceTimeByFrame()
-        rule.runOnIdle {
-            assertTrue(seekTo.isCompleted)
-        }
-        val snapTo = coroutineScope.async {
-            seekableTransitionState.snapTo(AnimStates.From)
-        }
+        rule.runOnIdle { assertTrue(seekTo.isCompleted) }
+        val snapTo = coroutineScope.async { seekableTransitionState.snapTo(AnimStates.From) }
         rule.mainClock.advanceTimeByFrame()
         rule.runOnIdle {
             assertTrue(snapTo.isCompleted)
@@ -1511,38 +1434,34 @@
         rule.setContent {
             coroutineScope = rememberCoroutineScope()
             val transition = rememberTransition(seekableTransitionState, label = "Test")
-            val val1 = transition.animateInt(
-                label = "Value",
-                transitionSpec = { tween(durationMillis = 1000, easing = LinearEasing) }
-            ) { state ->
-                val target = when (state) {
-                    AnimStates.From -> 0
-                    AnimStates.Other -> 2000
-                    else -> 1000
+            val val1 =
+                transition.animateInt(
+                    label = "Value",
+                    transitionSpec = { tween(durationMillis = 1000, easing = LinearEasing) }
+                ) { state ->
+                    val target =
+                        when (state) {
+                            AnimStates.From -> 0
+                            AnimStates.Other -> 2000
+                            else -> 1000
+                        }
+                    target
                 }
-                target
-            }
-            Box(
-                Modifier
-                    .fillMaxSize()
-                    .drawBehind {
-                        animatedValue1 = val1.value
-                    })
+            Box(Modifier.fillMaxSize().drawBehind { animatedValue1 = val1.value })
         }
         rule.waitForIdle()
-        val snapTo = coroutineScope.async {
-            seekableTransitionState.snapTo(AnimStates.From)
-        }
+        val snapTo = coroutineScope.async { seekableTransitionState.snapTo(AnimStates.From) }
         rule.mainClock.advanceTimeByFrame()
         rule.runOnIdle {
             assertTrue(snapTo.isCompleted)
             assertEquals(0, animatedValue1)
         }
-        val seekAndSnap = coroutineScope.async {
-            seekableTransitionState.seekTo(0.5f, AnimStates.To)
-            seekableTransitionState.snapTo(AnimStates.From)
-            seekableTransitionState.snapTo(AnimStates.From)
-        }
+        val seekAndSnap =
+            coroutineScope.async {
+                seekableTransitionState.seekTo(0.5f, AnimStates.To)
+                seekableTransitionState.snapTo(AnimStates.From)
+                seekableTransitionState.snapTo(AnimStates.From)
+            }
         rule.mainClock.advanceTimeByFrame() // seekTo
         rule.mainClock.advanceTimeByFrame() // snapTo
         rule.runOnIdle {
@@ -1561,54 +1480,40 @@
         rule.setContent {
             coroutineScope = rememberCoroutineScope()
             val transition = rememberTransition(seekableTransitionState, label = "Test")
-            val val1 = transition.animateInt(
-                label = "Value",
-                transitionSpec = { tween(durationMillis = 1000, easing = LinearEasing) }
-            ) { state ->
-                val target = when (state) {
-                    AnimStates.From -> 0
-                    AnimStates.Other -> 2000
-                    else -> 1000
+            val val1 =
+                transition.animateInt(
+                    label = "Value",
+                    transitionSpec = { tween(durationMillis = 1000, easing = LinearEasing) }
+                ) { state ->
+                    val target =
+                        when (state) {
+                            AnimStates.From -> 0
+                            AnimStates.Other -> 2000
+                            else -> 1000
+                        }
+                    target
                 }
-                target
-            }
-            Box(
-                Modifier
-                    .fillMaxSize()
-                    .drawBehind {
-                        animatedValue1 = val1.value
-                    })
+            Box(Modifier.fillMaxSize().drawBehind { animatedValue1 = val1.value })
         }
         rule.waitForIdle()
-        val seekTo = coroutineScope.async {
-            seekableTransitionState.seekTo(fraction = 0f, targetState = AnimStates.To)
-        }
+        val seekTo =
+            coroutineScope.async {
+                seekableTransitionState.seekTo(fraction = 0f, targetState = AnimStates.To)
+            }
         rule.mainClock.advanceTimeByFrame() // wait for composition after seekTo
-        rule.runOnIdle {
-            assertTrue(seekTo.isCompleted)
-        }
-        val animateTo = coroutineScope.async {
-            seekableTransitionState.animateTo()
-        }
+        rule.runOnIdle { assertTrue(seekTo.isCompleted) }
+        val animateTo = coroutineScope.async { seekableTransitionState.animateTo() }
         rule.mainClock.advanceTimeByFrame() // lock animation clock
         rule.mainClock.advanceTimeBy(160)
-        rule.runOnIdle {
-            assertEquals(160, animatedValue1)
-        }
+        rule.runOnIdle { assertEquals(160, animatedValue1) }
 
-        val animateTo2 = coroutineScope.async {
-            seekableTransitionState.animateTo()
-        }
+        val animateTo2 = coroutineScope.async { seekableTransitionState.animateTo() }
 
-        rule.runOnIdle {
-            assertTrue(animateTo.isCancelled)
-        }
+        rule.runOnIdle { assertTrue(animateTo.isCancelled) }
 
         rule.mainClock.advanceTimeByFrame() // continue the animation
 
-        rule.runOnIdle {
-            assertEquals(176, animatedValue1)
-        }
+        rule.runOnIdle { assertEquals(176, animatedValue1) }
 
         rule.mainClock.advanceTimeBy(900)
 
@@ -1628,53 +1533,41 @@
         rule.setContent {
             coroutineScope = rememberCoroutineScope()
             val transition = rememberTransition(seekableTransitionState, label = "Test")
-            val val1 = transition.animateInt(
-                label = "Value",
-                transitionSpec = { tween(durationMillis = 1000, easing = LinearEasing) }
-            ) { state ->
-                val target = when (state) {
-                    AnimStates.From -> 0
-                    AnimStates.Other -> 2000
-                    else -> 1000
+            val val1 =
+                transition.animateInt(
+                    label = "Value",
+                    transitionSpec = { tween(durationMillis = 1000, easing = LinearEasing) }
+                ) { state ->
+                    val target =
+                        when (state) {
+                            AnimStates.From -> 0
+                            AnimStates.Other -> 2000
+                            else -> 1000
+                        }
+                    target
                 }
-                target
-            }
-            Box(
-                Modifier
-                    .fillMaxSize()
-                    .drawBehind {
-                        animatedValue1 = val1.value
-                    })
+            Box(Modifier.fillMaxSize().drawBehind { animatedValue1 = val1.value })
         }
         rule.waitForIdle()
-        val seekTo = coroutineScope.async {
-            seekableTransitionState.seekTo(fraction = 0f, targetState = AnimStates.To)
-        }
+        val seekTo =
+            coroutineScope.async {
+                seekableTransitionState.seekTo(fraction = 0f, targetState = AnimStates.To)
+            }
         rule.mainClock.advanceTimeByFrame() // wait for composition after seekTo
-        rule.runOnIdle {
-            assertTrue(seekTo.isCompleted)
-        }
-        val animateTo = coroutineScope.async {
-            seekableTransitionState.animateTo()
-        }
+        rule.runOnIdle { assertTrue(seekTo.isCompleted) }
+        val animateTo = coroutineScope.async { seekableTransitionState.animateTo() }
         rule.mainClock.advanceTimeByFrame() // lock animation clock
         rule.mainClock.advanceTimeBy(160)
-        rule.runOnIdle {
-            assertEquals(160, animatedValue1)
-        }
+        rule.runOnIdle { assertEquals(160, animatedValue1) }
 
-        val animateTo2 = coroutineScope.async {
-            seekableTransitionState.animateTo(
-                animationSpec = tween(
-                    durationMillis = 200,
-                    easing = LinearEasing
+        val animateTo2 =
+            coroutineScope.async {
+                seekableTransitionState.animateTo(
+                    animationSpec = tween(durationMillis = 200, easing = LinearEasing)
                 )
-            )
-        }
+            }
 
-        rule.runOnIdle {
-            assertTrue(animateTo.isCancelled)
-        }
+        rule.runOnIdle { assertTrue(animateTo.isCancelled) }
 
         rule.mainClock.advanceTimeByFrame() // continue the animation
 
@@ -1701,53 +1594,41 @@
         rule.setContent {
             coroutineScope = rememberCoroutineScope()
             val transition = rememberTransition(seekableTransitionState, label = "Test")
-            val val1 = transition.animateInt(
-                label = "Value",
-                transitionSpec = { tween(durationMillis = 1600, easing = LinearEasing) }
-            ) { state ->
-                val target = when (state) {
-                    AnimStates.From -> 0
-                    AnimStates.Other -> 2000
-                    else -> 1000
+            val val1 =
+                transition.animateInt(
+                    label = "Value",
+                    transitionSpec = { tween(durationMillis = 1600, easing = LinearEasing) }
+                ) { state ->
+                    val target =
+                        when (state) {
+                            AnimStates.From -> 0
+                            AnimStates.Other -> 2000
+                            else -> 1000
+                        }
+                    target
                 }
-                target
-            }
-            Box(
-                Modifier
-                    .fillMaxSize()
-                    .drawBehind {
-                        animatedValue1 = val1.value
-                    })
+            Box(Modifier.fillMaxSize().drawBehind { animatedValue1 = val1.value })
         }
         rule.waitForIdle()
-        val seekTo = coroutineScope.async {
-            seekableTransitionState.seekTo(fraction = 0f, targetState = AnimStates.To)
-        }
+        val seekTo =
+            coroutineScope.async {
+                seekableTransitionState.seekTo(fraction = 0f, targetState = AnimStates.To)
+            }
         rule.mainClock.advanceTimeByFrame() // wait for composition after seekTo
-        rule.runOnIdle {
-            assertTrue(seekTo.isCompleted)
-        }
-        val animateTo = coroutineScope.async {
-            seekableTransitionState.animateTo()
-        }
+        rule.runOnIdle { assertTrue(seekTo.isCompleted) }
+        val animateTo = coroutineScope.async { seekableTransitionState.animateTo() }
         rule.mainClock.advanceTimeByFrame() // lock animation clock
         rule.mainClock.advanceTimeBy(800) // half way
-        rule.runOnIdle {
-            assertEquals(500, animatedValue1)
-        }
+        rule.runOnIdle { assertEquals(500, animatedValue1) }
 
         coroutineScope.launch {
             seekableTransitionState.animateTo(
-                animationSpec = spring(
-                    visibilityThreshold = 0.01f,
-                    stiffness = Spring.StiffnessVeryLow
-                )
+                animationSpec =
+                    spring(visibilityThreshold = 0.01f, stiffness = Spring.StiffnessVeryLow)
             )
         }
 
-        rule.runOnIdle {
-            assertTrue(animateTo.isCancelled)
-        }
+        rule.runOnIdle { assertTrue(animateTo.isCancelled) }
 
         rule.mainClock.advanceTimeByFrame() // continue the animation
 
@@ -1768,83 +1649,81 @@
         rule.setContent {
             coroutineScope = rememberCoroutineScope()
             val transition = rememberTransition(seekableTransitionState, label = "Test")
-            val val1 = transition.animateInt(
-                label = "Value",
-                transitionSpec = { tween(durationMillis = 1000, easing = LinearEasing) }
-            ) { state ->
-                val target = when (state) {
-                    AnimStates.From -> 0
-                    AnimStates.Other -> 2000
-                    else -> 1000
+            val val1 =
+                transition.animateInt(
+                    label = "Value",
+                    transitionSpec = { tween(durationMillis = 1000, easing = LinearEasing) }
+                ) { state ->
+                    val target =
+                        when (state) {
+                            AnimStates.From -> 0
+                            AnimStates.Other -> 2000
+                            else -> 1000
+                        }
+                    target
                 }
-                target
-            }
-            Box(
-                Modifier
-                    .fillMaxSize()
-                    .drawBehind {
-                        animatedValue1 = val1.value
-                    })
+            Box(Modifier.fillMaxSize().drawBehind { animatedValue1 = val1.value })
         }
         rule.waitForIdle()
-        val seekTo = coroutineScope.async {
-            seekableTransitionState.seekTo(fraction = 0f, targetState = AnimStates.To)
-        }
+        val seekTo =
+            coroutineScope.async {
+                seekableTransitionState.seekTo(fraction = 0f, targetState = AnimStates.To)
+            }
         rule.mainClock.advanceTimeByFrame() // wait for composition after seekTo
-        rule.runOnIdle {
-            assertTrue(seekTo.isCompleted)
-        }
+        rule.runOnIdle { assertTrue(seekTo.isCompleted) }
         val springSpec = spring<Float>(dampingRatio = 2f)
         val vecSpringSpec = springSpec.vectorize(Float.VectorConverter)
-        val animateTo = coroutineScope.async {
-            seekableTransitionState.animateTo(animationSpec = springSpec)
-        }
+        val animateTo =
+            coroutineScope.async { seekableTransitionState.animateTo(animationSpec = springSpec) }
         rule.mainClock.advanceTimeByFrame() // lock animation clock
 
         // find how long it takes to get to about half way:
         var halfDuration = 16L
         val zeroVector = AnimationVector1D(0f)
         val oneVector = AnimationVector1D(1f)
-        while (vecSpringSpec.getValueFromMillis(
-                playTimeMillis = halfDuration,
-                start = zeroVector,
-                end = oneVector,
-                startVelocity = zeroVector
-            )[0] < 0.5f
+        while (
+            vecSpringSpec
+                .getValueFromMillis(
+                    playTimeMillis = halfDuration,
+                    start = zeroVector,
+                    end = oneVector,
+                    startVelocity = zeroVector
+                )[0] < 0.5f
         ) {
             halfDuration += 16L
         }
         rule.mainClock.advanceTimeBy(halfDuration) // ~half way
-        val halfValue = vecSpringSpec.getValueFromMillis(
-            playTimeMillis = halfDuration,
-            start = zeroVector,
-            end = oneVector,
-            startVelocity = zeroVector
-        )[0] * 1000
-        rule.runOnIdle {
-            assertEquals(halfValue, animatedValue1.toFloat(), 1f)
-        }
+        val halfValue =
+            vecSpringSpec
+                .getValueFromMillis(
+                    playTimeMillis = halfDuration,
+                    start = zeroVector,
+                    end = oneVector,
+                    startVelocity = zeroVector
+                )[0] * 1000
+        rule.runOnIdle { assertEquals(halfValue, animatedValue1.toFloat(), 1f) }
 
-        val velocityAtHalfWay = vecSpringSpec.getVelocityFromNanos(
-            playTimeNanos = halfDuration * MillisToNanos,
-            initialValue = zeroVector,
-            targetValue = oneVector,
-            initialVelocity = zeroVector
-        )[0]
+        val velocityAtHalfWay =
+            vecSpringSpec
+                .getVelocityFromNanos(
+                    playTimeNanos = halfDuration * MillisToNanos,
+                    initialValue = zeroVector,
+                    targetValue = oneVector,
+                    initialVelocity = zeroVector
+                )[0]
 
         coroutineScope.launch {
             seekableTransitionState.animateTo(
-                animationSpec = spring(
-                    visibilityThreshold = 0.01f,
-                    stiffness = Spring.StiffnessVeryLow,
-                    dampingRatio = Spring.DampingRatioHighBouncy
-                )
+                animationSpec =
+                    spring(
+                        visibilityThreshold = 0.01f,
+                        stiffness = Spring.StiffnessVeryLow,
+                        dampingRatio = Spring.DampingRatioHighBouncy
+                    )
             )
         }
 
-        rule.runOnIdle {
-            assertTrue(animateTo.isCancelled)
-        }
+        rule.runOnIdle { assertTrue(animateTo.isCancelled) }
 
         rule.mainClock.advanceTimeByFrame() // continue the animation
 
@@ -1864,44 +1743,31 @@
         rule.setContent {
             coroutineScope = rememberCoroutineScope()
             val transition = rememberTransition(seekableTransitionState, label = "Test")
-            val val1 = transition.animateInt(
-                label = "Value",
-                transitionSpec = { tween(durationMillis = 1600, easing = LinearEasing) }
-            ) { state ->
-                val target = when (state) {
-                    AnimStates.From -> 0
-                    AnimStates.Other -> 2000
-                    else -> 1000
+            val val1 =
+                transition.animateInt(
+                    label = "Value",
+                    transitionSpec = { tween(durationMillis = 1600, easing = LinearEasing) }
+                ) { state ->
+                    val target =
+                        when (state) {
+                            AnimStates.From -> 0
+                            AnimStates.Other -> 2000
+                            else -> 1000
+                        }
+                    target
                 }
-                target
-            }
-            Box(
-                Modifier
-                    .fillMaxSize()
-                    .drawBehind {
-                        animatedValue1 = val1.value
-                    })
+            Box(Modifier.fillMaxSize().drawBehind { animatedValue1 = val1.value })
         }
         rule.waitForIdle()
-        coroutineScope.launch {
-            seekableTransitionState.animateTo(AnimStates.To)
-        }
+        coroutineScope.launch { seekableTransitionState.animateTo(AnimStates.To) }
         rule.mainClock.advanceTimeBy(1700)
-        coroutineScope.launch {
-            seekableTransitionState.animateTo(AnimStates.From)
-        }
+        coroutineScope.launch { seekableTransitionState.animateTo(AnimStates.From) }
         rule.mainClock.advanceTimeByFrame() // lock in the clock
-        rule.runOnIdle {
-            assertEquals(1000, animatedValue1)
-        }
+        rule.runOnIdle { assertEquals(1000, animatedValue1) }
         rule.mainClock.advanceTimeByFrame()
-        rule.runOnIdle {
-            assertEquals(990, animatedValue1)
-        }
+        rule.runOnIdle { assertEquals(990, animatedValue1) }
         rule.mainClock.advanceTimeByFrame()
-        rule.runOnIdle {
-            assertEquals(980, animatedValue1)
-        }
+        rule.runOnIdle { assertEquals(980, animatedValue1) }
     }
 
     @Test
@@ -1915,32 +1781,33 @@
         rule.setContent {
             coroutineScope = rememberCoroutineScope()
             val transition = rememberTransition(seekableTransitionState, label = "Test")
-            val val1 = transition.animateInt(
-                label = "Value",
-                transitionSpec = { tween(durationMillis = 1600, easing = LinearEasing) }
-            ) { state ->
-                when (state) {
-                    AnimStates.From -> 0
-                    AnimStates.Other -> 2000
-                    else -> 1000
+            val val1 =
+                transition.animateInt(
+                    label = "Value",
+                    transitionSpec = { tween(durationMillis = 1600, easing = LinearEasing) }
+                ) { state ->
+                    when (state) {
+                        AnimStates.From -> 0
+                        AnimStates.Other -> 2000
+                        else -> 1000
+                    }
                 }
-            }
-            val val2 = transition.animateInt(
-                label = "Value2",
-                transitionSpec = { tween(durationMillis = 1600, easing = LinearEasing) }
-            ) { state ->
-                when (state) {
-                    AnimStates.From -> 0
-                    else -> 1000
+            val val2 =
+                transition.animateInt(
+                    label = "Value2",
+                    transitionSpec = { tween(durationMillis = 1600, easing = LinearEasing) }
+                ) { state ->
+                    when (state) {
+                        AnimStates.From -> 0
+                        else -> 1000
+                    }
                 }
-            }
             Box(
-                Modifier
-                    .fillMaxSize()
-                    .drawBehind {
-                        animatedValue1 = val1.value
-                        animatedValue2 = val2.value
-                    })
+                Modifier.fillMaxSize().drawBehind {
+                    animatedValue1 = val1.value
+                    animatedValue2 = val2.value
+                }
+            )
         }
         rule.waitForIdle()
         coroutineScope.launch {
@@ -1950,9 +1817,7 @@
             )
         }
         rule.mainClock.advanceTimeByFrame() // lock in the clock
-        coroutineScope.launch {
-            seekableTransitionState.animateTo(AnimStates.Other)
-        }
+        coroutineScope.launch { seekableTransitionState.animateTo(AnimStates.Other) }
         rule.mainClock.advanceTimeByFrame() // advance one frame toward To and compose to Other
         rule.runOnIdle {
             assertEquals(100, animatedValue1)
@@ -1988,34 +1853,26 @@
         rule.setContent {
             coroutineScope = rememberCoroutineScope()
             val transition = rememberTransition(seekableTransitionState, label = "Test")
-            val val1 = transition.animateInt(
-                label = "Value",
-                transitionSpec = { tween(durationMillis = 1600, easing = LinearEasing) }
-            ) { state ->
-                when (state) {
-                    AnimStates.From -> 0
-                    else -> 1000
+            val val1 =
+                transition.animateInt(
+                    label = "Value",
+                    transitionSpec = { tween(durationMillis = 1600, easing = LinearEasing) }
+                ) { state ->
+                    when (state) {
+                        AnimStates.From -> 0
+                        else -> 1000
+                    }
                 }
-            }
-            Box(
-                Modifier
-                    .fillMaxSize()
-                    .drawBehind {
-                        animatedValue1 = val1.value
-                    })
+            Box(Modifier.fillMaxSize().drawBehind { animatedValue1 = val1.value })
         }
         rule.waitForIdle()
-        val seekTo = coroutineScope.async {
-            seekableTransitionState.seekTo(1f, AnimStates.To)
-        }
+        val seekTo = coroutineScope.async { seekableTransitionState.seekTo(1f, AnimStates.To) }
         rule.mainClock.advanceTimeByFrame() // wait for composition
         rule.runOnIdle {
             assertTrue(seekTo.isCompleted)
             assertEquals(1000, animatedValue1)
         }
-        val anim = coroutineScope.async {
-            seekableTransitionState.animateTo(AnimStates.To)
-        }
+        val anim = coroutineScope.async { seekableTransitionState.animateTo(AnimStates.To) }
         rule.mainClock.advanceTimeByFrame() // compose to current state = target state
         rule.runOnIdle {
             assertTrue(anim.isCompleted)
@@ -2034,26 +1891,20 @@
         rule.setContent {
             coroutineScope = rememberCoroutineScope()
             val transition = rememberTransition(seekableTransitionState, label = "Test")
-            val val1 = transition.animateInt(
-                label = "Value",
-                transitionSpec = { tween(durationMillis = 1600, easing = LinearEasing) }
-            ) { state ->
-                when (state) {
-                    AnimStates.From -> 0
-                    else -> 1000
+            val val1 =
+                transition.animateInt(
+                    label = "Value",
+                    transitionSpec = { tween(durationMillis = 1600, easing = LinearEasing) }
+                ) { state ->
+                    when (state) {
+                        AnimStates.From -> 0
+                        else -> 1000
+                    }
                 }
-            }
-            Box(
-                Modifier
-                    .fillMaxSize()
-                    .drawBehind {
-                        animatedValue1 = val1.value
-                    })
+            Box(Modifier.fillMaxSize().drawBehind { animatedValue1 = val1.value })
         }
         rule.waitForIdle()
-        val seekTo = coroutineScope.async {
-            seekableTransitionState.seekTo(0.5f)
-        }
+        val seekTo = coroutineScope.async { seekableTransitionState.seekTo(0.5f) }
         rule.runOnIdle {
             assertTrue(seekTo.isCompleted)
             assertEquals(0, animatedValue1)
@@ -2071,48 +1922,47 @@
         rule.setContent {
             coroutineScope = rememberCoroutineScope()
             val transition = rememberTransition(seekableTransitionState, label = "Test")
-            val val1 = transition.animateInt(
-                label = "Value",
-                transitionSpec = { tween(durationMillis = 1600, easing = LinearEasing) }
-            ) { state ->
-                when (state) {
-                    AnimStates.From -> 0
-                    AnimStates.To -> 1000
-                    AnimStates.Other -> 2000
+            val val1 =
+                transition.animateInt(
+                    label = "Value",
+                    transitionSpec = { tween(durationMillis = 1600, easing = LinearEasing) }
+                ) { state ->
+                    when (state) {
+                        AnimStates.From -> 0
+                        AnimStates.To -> 1000
+                        AnimStates.Other -> 2000
+                    }
                 }
-            }
-            val val2 = transition.animateInt(
-                label = "Value",
-                transitionSpec = { tween(durationMillis = 1600, easing = LinearEasing) }
-            ) { state ->
-                when (state) {
-                    AnimStates.From -> 0
-                    else -> 1000
+            val val2 =
+                transition.animateInt(
+                    label = "Value",
+                    transitionSpec = { tween(durationMillis = 1600, easing = LinearEasing) }
+                ) { state ->
+                    when (state) {
+                        AnimStates.From -> 0
+                        else -> 1000
+                    }
                 }
-            }
             Box(
-                Modifier
-                    .fillMaxSize()
-                    .drawBehind {
-                        animatedValue1 = val1.value
-                        animatedValue2 = val2.value
-                    })
+                Modifier.fillMaxSize().drawBehind {
+                    animatedValue1 = val1.value
+                    animatedValue2 = val2.value
+                }
+            )
         }
         rule.waitForIdle()
-        val seekTo = coroutineScope.async {
-            seekableTransitionState.seekTo(0f, AnimStates.To)
-        }
+        val seekTo = coroutineScope.async { seekableTransitionState.seekTo(0f, AnimStates.To) }
         rule.mainClock.advanceTimeByFrame() // compose to To
         assertTrue(seekTo.isCompleted)
-        val seekOther = coroutineScope.async {
-            seekableTransitionState.seekTo(1f, AnimStates.Other)
-        }
+        val seekOther =
+            coroutineScope.async { seekableTransitionState.seekTo(1f, AnimStates.Other) }
         rule.mainClock.advanceTimeByFrame() // compose to Other
         assertFalse(seekOther.isCompleted) // should be animating animatedValue2
-        val animateOther = coroutineScope.async {
-            // already at the end (1f), but it should continue the animatedValue2 animation
-            seekableTransitionState.animateTo(AnimStates.Other)
-        }
+        val animateOther =
+            coroutineScope.async {
+                // already at the end (1f), but it should continue the animatedValue2 animation
+                seekableTransitionState.animateTo(AnimStates.Other)
+            }
         assertTrue(seekOther.isCancelled)
         assertTrue(animateOther.isActive)
         rule.mainClock.advanceTimeByFrame() // advance the animation
@@ -2134,40 +1984,39 @@
         rule.setContent {
             coroutineScope = rememberCoroutineScope()
             val transition = rememberTransition(seekableTransitionState, label = "Test")
-            val val1 = transition.animateInt(
-                label = "Value",
-                transitionSpec = { tween(durationMillis = 1600, easing = LinearEasing) }
-            ) { state ->
-                when (state) {
-                    AnimStates.From -> 0
-                    else -> 1000
-                }
-            }
-            val val2 = if (val1.value < 500) {
-                mutableFloatStateOf(0f)
-            } else {
-                transition.animateFloat(
-                    label = "Value2",
-                    transitionSpec = { tween(durationMillis = 3200, easing = LinearEasing) }
+            val val1 =
+                transition.animateInt(
+                    label = "Value",
+                    transitionSpec = { tween(durationMillis = 1600, easing = LinearEasing) }
                 ) { state ->
                     when (state) {
-                        AnimStates.From -> 0f
-                        else -> 1000f
+                        AnimStates.From -> 0
+                        else -> 1000
                     }
                 }
-            }
+            val val2 =
+                if (val1.value < 500) {
+                    mutableFloatStateOf(0f)
+                } else {
+                    transition.animateFloat(
+                        label = "Value2",
+                        transitionSpec = { tween(durationMillis = 3200, easing = LinearEasing) }
+                    ) { state ->
+                        when (state) {
+                            AnimStates.From -> 0f
+                            else -> 1000f
+                        }
+                    }
+                }
             Box(
-                Modifier
-                    .fillMaxSize()
-                    .drawBehind {
-                        animatedValue1 = val1.value
-                        animatedValue2 = val2.value.roundToInt()
-                    })
+                Modifier.fillMaxSize().drawBehind {
+                    animatedValue1 = val1.value
+                    animatedValue2 = val2.value.roundToInt()
+                }
+            )
         }
         rule.waitForIdle()
-        val anim = coroutineScope.async {
-            seekableTransitionState.animateTo(AnimStates.To)
-        }
+        val anim = coroutineScope.async { seekableTransitionState.animateTo(AnimStates.To) }
         rule.mainClock.advanceTimeByFrame() // wait for composition
         rule.mainClock.advanceTimeBy(800) // half way through
         rule.runOnIdle {
@@ -2205,42 +2054,41 @@
         rule.setContent {
             coroutineScope = rememberCoroutineScope()
             val transition = rememberTransition(seekableTransitionState, label = "Test")
-            val val1 = transition.animateInt(
-                label = "Value",
-                transitionSpec = { tween(durationMillis = 1600, easing = LinearEasing) }
-            ) { state ->
-                when (state) {
-                    AnimStates.From -> 0
-                    AnimStates.To -> 1000
-                    else -> 2000
-                }
-            }
-            val val2 = if (val1.value < 500) {
-                mutableFloatStateOf(0f)
-            } else {
-                transition.animateFloat(
-                    label = "Value2",
-                    transitionSpec = { tween(durationMillis = 3200, easing = LinearEasing) }
+            val val1 =
+                transition.animateInt(
+                    label = "Value",
+                    transitionSpec = { tween(durationMillis = 1600, easing = LinearEasing) }
                 ) { state ->
                     when (state) {
-                        AnimStates.From -> 0f
-                        AnimStates.To -> 1000f
-                        else -> 2000f
+                        AnimStates.From -> 0
+                        AnimStates.To -> 1000
+                        else -> 2000
                     }
                 }
-            }
+            val val2 =
+                if (val1.value < 500) {
+                    mutableFloatStateOf(0f)
+                } else {
+                    transition.animateFloat(
+                        label = "Value2",
+                        transitionSpec = { tween(durationMillis = 3200, easing = LinearEasing) }
+                    ) { state ->
+                        when (state) {
+                            AnimStates.From -> 0f
+                            AnimStates.To -> 1000f
+                            else -> 2000f
+                        }
+                    }
+                }
             Box(
-                Modifier
-                    .fillMaxSize()
-                    .drawBehind {
-                        animatedValue1 = val1.value
-                        animatedValue2 = val2.value
-                    })
+                Modifier.fillMaxSize().drawBehind {
+                    animatedValue1 = val1.value
+                    animatedValue2 = val2.value
+                }
+            )
         }
         rule.waitForIdle()
-        val animateTo = coroutineScope.async {
-            seekableTransitionState.animateTo(AnimStates.To)
-        }
+        val animateTo = coroutineScope.async { seekableTransitionState.animateTo(AnimStates.To) }
         rule.mainClock.advanceTimeByFrame() // wait for composition
         rule.mainClock.advanceTimeBy(800) // half way through
 
@@ -2258,9 +2106,8 @@
         }
 
         // now seek to third state
-        val animateOther = coroutineScope.async {
-            seekableTransitionState.animateTo(AnimStates.Other)
-        }
+        val animateOther =
+            coroutineScope.async { seekableTransitionState.animateTo(AnimStates.Other) }
         assertTrue(animateTo.isCancelled)
         rule.mainClock.advanceTimeByFrame() // wait for composition
         rule.runOnIdle {
@@ -2302,9 +2149,7 @@
         }
 
         rule.mainClock.advanceTimeByFrame() // composition after the current value changes
-        rule.runOnIdle {
-            assertTrue(animateOther.isCompleted)
-        }
+        rule.runOnIdle { assertTrue(animateOther.isCompleted) }
     }
 
     @SdkSuppress(minSdkVersion = 26)
@@ -2319,41 +2164,37 @@
         rule.setContent {
             coroutineScope = rememberCoroutineScope()
             val transition = rememberTransition(seekableTransitionState, label = "Test")
-            val val1 = transition.animateInt(
-                label = "Value",
-                transitionSpec = { tween(durationMillis = 1600, easing = LinearEasing) }
-            ) { state ->
-                when (state) {
-                    AnimStates.From -> 0
-                    else -> 1000
+            val val1 =
+                transition.animateInt(
+                    label = "Value",
+                    transitionSpec = { tween(durationMillis = 1600, easing = LinearEasing) }
+                ) { state ->
+                    when (state) {
+                        AnimStates.From -> 0
+                        else -> 1000
+                    }
                 }
-            }
 
             CompositionLocalProvider(LocalDensity provides Density(1f)) {
                 Box(
-                    Modifier
-                        .requiredSize(100.dp)
-                        .testTag("AV_parent")
-                        .drawBehind {
-                            animatedValue1 = val1.value
-                            drawRect(Color.White)
-                        }) {
+                    Modifier.requiredSize(100.dp).testTag("AV_parent").drawBehind {
+                        animatedValue1 = val1.value
+                        drawRect(Color.White)
+                    }
+                ) {
                     transition.AnimatedVisibility({ it == AnimStates.To }) {
-                        Box(
-                            Modifier
-                                .fillMaxSize()
-                                .background(Color.Red)
-                        )
+                        Box(Modifier.fillMaxSize().background(Color.Red))
                     }
                 }
             }
         }
         rule.waitForIdle()
-        val initialAnimateAndSeek = coroutineScope.async {
-            seekableTransitionState.animateTo(AnimStates.To)
-            seekableTransitionState.seekTo(0.5f, targetState = AnimStates.From)
-            seekableTransitionState.seekTo(0f, targetState = AnimStates.From)
-        }
+        val initialAnimateAndSeek =
+            coroutineScope.async {
+                seekableTransitionState.animateTo(AnimStates.To)
+                seekableTransitionState.seekTo(0.5f, targetState = AnimStates.From)
+                seekableTransitionState.seekTo(0f, targetState = AnimStates.From)
+            }
         rule.mainClock.advanceTimeBy(5000)
         rule.runOnIdle {
             assertTrue(initialAnimateAndSeek.isCompleted)
@@ -2364,14 +2205,11 @@
             captureToImage().run {
                 assertEquals(100, width)
                 assertEquals(100, height)
-                assertPixels { _ ->
-                    Color.Red
-                }
+                assertPixels { _ -> Color.Red }
             }
         }
-        val secondAnimate = coroutineScope.async {
-            seekableTransitionState.animateTo(AnimStates.To)
-        }
+        val secondAnimate =
+            coroutineScope.async { seekableTransitionState.animateTo(AnimStates.To) }
         rule.waitForIdle()
         // This waits for the initial state animation to finish, since we changed the initial state
         // when going from seeking to animating.
@@ -2385,9 +2223,7 @@
             captureToImage().run {
                 assertEquals(100, width)
                 assertEquals(100, height)
-                assertPixels { _ ->
-                    Color.Red
-                }
+                assertPixels { _ -> Color.Red }
             }
         }
     }
@@ -2405,15 +2241,18 @@
                 seekableTransitionState.animateTo(AnimStates.To)
             }
             transition = rememberTransition(seekableTransitionState, label = "Test")
-            animatedValue = transition.animateInt(
-                label = "Value",
-                transitionSpec = { tween(easing = LinearEasing) }
-            ) { state ->
-                when (state) {
-                    AnimStates.From -> 0
-                    else -> 1000
-                }
-            }.value
+            animatedValue =
+                transition
+                    .animateInt(
+                        label = "Value",
+                        transitionSpec = { tween(easing = LinearEasing) }
+                    ) { state ->
+                        when (state) {
+                            AnimStates.From -> 0
+                            else -> 1000
+                        }
+                    }
+                    .value
         }
         rule.runOnIdle {
             assertEquals(0, animatedValue)
@@ -2446,15 +2285,18 @@
                 seekableTransitionState.snapTo(AnimStates.To)
             }
             transition = rememberTransition(seekableTransitionState, label = "Test")
-            animatedValue = transition.animateInt(
-                label = "Value",
-                transitionSpec = { tween(easing = LinearEasing) }
-            ) { state ->
-                when (state) {
-                    AnimStates.From -> 0
-                    else -> 1000
-                }
-            }.value
+            animatedValue =
+                transition
+                    .animateInt(
+                        label = "Value",
+                        transitionSpec = { tween(easing = LinearEasing) }
+                    ) { state ->
+                        when (state) {
+                            AnimStates.From -> 0
+                            else -> 1000
+                        }
+                    }
+                    .value
         }
         rule.runOnIdle {
             assertEquals(0, animatedValue)
diff --git a/compose/animation/animation-core/src/androidInstrumentedTest/kotlin/androidx/compose/animation/core/SingleValueAnimationTest.kt b/compose/animation/animation-core/src/androidInstrumentedTest/kotlin/androidx/compose/animation/core/SingleValueAnimationTest.kt
index c491b68..c970337 100644
--- a/compose/animation/animation-core/src/androidInstrumentedTest/kotlin/androidx/compose/animation/core/SingleValueAnimationTest.kt
+++ b/compose/animation/animation-core/src/androidInstrumentedTest/kotlin/androidx/compose/animation/core/SingleValueAnimationTest.kt
@@ -44,24 +44,18 @@
 @MediumTest
 class SingleValueAnimationTest {
 
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
     @Test
     fun animate1DTest() {
         fun <T> myTween(): TweenSpec<T> =
-            TweenSpec(
-                easing = FastOutSlowInEasing,
-                durationMillis = 100
-            )
+            TweenSpec(easing = FastOutSlowInEasing, durationMillis = 100)
 
         var enabled by mutableStateOf(false)
         var expected by mutableStateOf(250f)
         rule.setContent {
             Box {
-                val animationValue by animateDpAsState(
-                    if (enabled) 50.dp else 250.dp, myTween()
-                )
+                val animationValue by animateDpAsState(if (enabled) 50.dp else 250.dp, myTween())
                 // TODO: Properly test this with a deterministic clock when the test framework is
                 // ready
                 if (enabled) {
@@ -71,8 +65,8 @@
                         do {
                             withFrameNanos {
                                 frameTime = it
-                                val playTime = ((frameTime - startTime) / 1_000_000L)
-                                    .coerceIn(0, 100)
+                                val playTime =
+                                    ((frameTime - startTime) / 1_000_000L).coerceIn(0, 100)
                                 val fraction = FastOutSlowInEasing.transform(playTime / 100f)
                                 expected = lerp(250f, 50f, fraction)
                             }
@@ -99,9 +93,11 @@
         rule.setContent {
             Box {
                 // Animate from 250f to 50f when enable flips to true
-                val animationValue by animateFloatAsState(
-                    if (enabled) 50f else 250f, tween(200, easing = FastOutLinearInEasing)
-                )
+                val animationValue by
+                    animateFloatAsState(
+                        if (enabled) 50f else 250f,
+                        tween(200, easing = FastOutLinearInEasing)
+                    )
                 // TODO: Properly test this with a deterministic clock when the test framework is
                 // ready
                 if (enabled) {
@@ -112,8 +108,8 @@
                         do {
                             withFrameNanos {
                                 frameTime = it
-                                val playTime = ((frameTime - startTime) / 1_000_000L)
-                                    .coerceIn(0, 200)
+                                val playTime =
+                                    ((frameTime - startTime) / 1_000_000L).coerceIn(0, 200)
                                 val fraction = FastOutLinearInEasing.transform(playTime / 200f)
                                 expected = lerp(250f, 50f, fraction)
                             }
@@ -137,30 +133,24 @@
         val endVal = AnimationVector(0f, 77f)
         var expected by mutableStateOf(startVal)
 
-        fun <V> tween(): TweenSpec<V> =
-            TweenSpec(
-                easing = LinearEasing,
-                durationMillis = 100
-            )
+        fun <V> tween(): TweenSpec<V> = TweenSpec(easing = LinearEasing, durationMillis = 100)
 
         var enabled by mutableStateOf(false)
         rule.setContent {
             Box {
-                val sizeValue by animateSizeAsState(
-                    if (enabled)
-                        Size.VectorConverter.convertFromVector(endVal)
-                    else
-                        Size.VectorConverter.convertFromVector(startVal),
-                    tween()
-                )
+                val sizeValue by
+                    animateSizeAsState(
+                        if (enabled) Size.VectorConverter.convertFromVector(endVal)
+                        else Size.VectorConverter.convertFromVector(startVal),
+                        tween()
+                    )
 
-                val pxPositionValue by animateOffsetAsState(
-                    if (enabled)
-                        Offset.VectorConverter.convertFromVector(endVal)
-                    else
-                        Offset.VectorConverter.convertFromVector(startVal),
-                    tween()
-                )
+                val pxPositionValue by
+                    animateOffsetAsState(
+                        if (enabled) Offset.VectorConverter.convertFromVector(endVal)
+                        else Offset.VectorConverter.convertFromVector(startVal),
+                        tween()
+                    )
 
                 if (enabled) {
                     LaunchedEffect(Unit) {
@@ -169,12 +159,13 @@
                         do {
                             withFrameNanos {
                                 frameTime = it
-                                val playTime = ((frameTime - startTime) / 1_000_000L)
-                                    .coerceIn(0, 100)
-                                expected = AnimationVector(
-                                    lerp(startVal.v1, endVal.v1, playTime / 100f),
-                                    lerp(startVal.v2, endVal.v2, playTime / 100f)
-                                )
+                                val playTime =
+                                    ((frameTime - startTime) / 1_000_000L).coerceIn(0, 100)
+                                expected =
+                                    AnimationVector(
+                                        lerp(startVal.v1, endVal.v1, playTime / 100f),
+                                        lerp(startVal.v2, endVal.v2, playTime / 100f)
+                                    )
                             }
                         } while (frameTime - startTime <= 100_000_000L)
                         expected = endVal
@@ -182,10 +173,7 @@
                 }
 
                 assertEquals(Size.VectorConverter.convertFromVector(expected), sizeValue)
-                assertEquals(
-                    Offset.VectorConverter.convertFromVector(expected),
-                    pxPositionValue
-                )
+                assertEquals(Offset.VectorConverter.convertFromVector(expected), pxPositionValue)
             }
         }
 
@@ -200,22 +188,18 @@
         val endVal = AnimationVector(-42f, 89f, 77f, 100f)
 
         fun <V> tween(): TweenSpec<V> =
-            TweenSpec(
-                easing = LinearOutSlowInEasing,
-                durationMillis = 100
-            )
+            TweenSpec(easing = LinearOutSlowInEasing, durationMillis = 100)
 
         var enabled by mutableStateOf(false)
         var expected by mutableStateOf(startVal)
         rule.setContent {
             Box {
-                val pxBoundsValue by animateRectAsState(
-                    if (enabled)
-                        Rect.VectorConverter.convertFromVector(endVal)
-                    else
-                        Rect.VectorConverter.convertFromVector(startVal),
-                    tween()
-                )
+                val pxBoundsValue by
+                    animateRectAsState(
+                        if (enabled) Rect.VectorConverter.convertFromVector(endVal)
+                        else Rect.VectorConverter.convertFromVector(startVal),
+                        tween()
+                    )
 
                 if (enabled) {
                     LaunchedEffect(Unit) {
@@ -224,16 +208,17 @@
                         do {
                             withFrameNanos {
                                 frameTime = it
-                                val playTime = ((frameTime - startTime) / 1_000_000L)
-                                    .coerceIn(0, 100)
+                                val playTime =
+                                    ((frameTime - startTime) / 1_000_000L).coerceIn(0, 100)
 
                                 val fraction = LinearOutSlowInEasing.transform(playTime / 100f)
-                                expected = AnimationVector(
-                                    lerp(startVal.v1, endVal.v1, fraction),
-                                    lerp(startVal.v2, endVal.v2, fraction),
-                                    lerp(startVal.v3, endVal.v3, fraction),
-                                    lerp(startVal.v4, endVal.v4, fraction)
-                                )
+                                expected =
+                                    AnimationVector(
+                                        lerp(startVal.v1, endVal.v1, fraction),
+                                        lerp(startVal.v2, endVal.v2, fraction),
+                                        lerp(startVal.v3, endVal.v3, fraction),
+                                        lerp(startVal.v4, endVal.v4, fraction)
+                                    )
                             }
                         } while (frameTime - startTime <= 100_000_000L)
                         expected = endVal
@@ -241,10 +226,7 @@
                 }
 
                 // Check this every frame
-                assertEquals(
-                    Rect.VectorConverter.convertFromVector(expected),
-                    pxBoundsValue
-                )
+                assertEquals(Rect.VectorConverter.convertFromVector(expected), pxBoundsValue)
             }
         }
 
@@ -259,13 +241,11 @@
         var expected by mutableStateOf(Color.Black)
         rule.setContent {
             Box {
-                val value by animateColorAsState(
-                    if (enabled) Color.Cyan else Color.Black,
-                    TweenSpec(
-                        durationMillis = 100,
-                        easing = FastOutLinearInEasing
+                val value by
+                    animateColorAsState(
+                        if (enabled) Color.Cyan else Color.Black,
+                        TweenSpec(durationMillis = 100, easing = FastOutLinearInEasing)
                     )
-                )
                 if (enabled) {
                     LaunchedEffect(Unit) {
                         val startTime = withFrameNanos { it }
@@ -273,8 +253,8 @@
                         do {
                             withFrameNanos {
                                 frameTime = it
-                                val playTime = ((frameTime - startTime) / 1_000_000L)
-                                    .coerceIn(0, 100)
+                                val playTime =
+                                    ((frameTime - startTime) / 1_000_000L).coerceIn(0, 100)
                                 val fraction = FastOutLinearInEasing.transform(playTime / 100f)
                                 expected = lerp(Color.Black, Color.Cyan, fraction)
                             }
@@ -302,12 +282,7 @@
         rule.setContent {
             Box {
                 var destination: Offset by remember { mutableStateOf(Offset(600f, 600f)) }
-                val offsetValue = animateOffsetAsState(
-                    if (enabled)
-                        destination
-                    else
-                        Offset(0f, 0f)
-                )
+                val offsetValue = animateOffsetAsState(if (enabled) destination else Offset(0f, 0f))
                 if (enabled) {
                     LaunchedEffect(enabled) {
                         var startTime = -1L
@@ -338,9 +313,7 @@
             enabled = true
             assertEquals(Offset(-300f, -300f), currentValue)
         }
-        rule.waitUntil(1300) {
-            currentValue.x > 300f && currentValue.y > 300f
-        }
+        rule.waitUntil(1300) { currentValue.x > 300f && currentValue.y > 300f }
     }
 
     @Test
@@ -354,12 +327,8 @@
         var enabled by mutableStateOf(false)
         rule.setContent {
             Box {
-                val offsetValue by animateOffsetAsState(
-                    if (enabled)
-                        Offset(100f, 100f)
-                    else
-                        Offset(0f, 0f)
-                )
+                val offsetValue by
+                    animateOffsetAsState(if (enabled) Offset(100f, 100f) else Offset(0f, 0f))
 
                 val floatValue by animateFloatAsState(if (enabled) 100f else 0f)
 
@@ -374,19 +343,21 @@
                             withFrameNanos {
                                 frameTime = it
                                 val playTime = frameTime - startTime
-                                expectedFloat = if (playTime < durationForFloat) {
-                                    specForFloat.getValueFromNanos(playTime, 0f, 100f, 0f)
-                                } else {
-                                    100f
-                                }
+                                expectedFloat =
+                                    if (playTime < durationForFloat) {
+                                        specForFloat.getValueFromNanos(playTime, 0f, 100f, 0f)
+                                    } else {
+                                        100f
+                                    }
 
-                                expectedOffset = if (playTime < durationForOffset) {
-                                    val offset =
-                                        specForOffset.getValueFromNanos(playTime, 0f, 100f, 0f)
-                                    Offset(offset, offset)
-                                } else {
-                                    Offset(100f, 100f)
-                                }
+                                expectedOffset =
+                                    if (playTime < durationForOffset) {
+                                        val offset =
+                                            specForOffset.getValueFromNanos(playTime, 0f, 100f, 0f)
+                                        Offset(offset, offset)
+                                    } else {
+                                        Offset(100f, 100f)
+                                    }
                             }
                         } while (frameTime - startTime <= durationForFloat)
                         expectedFloat = 100f
@@ -407,18 +378,13 @@
         var duration by mutableStateOf(100)
         var firstRun by mutableStateOf(true)
         fun <T> myTween(): TweenSpec<T> =
-            TweenSpec(
-                easing = FastOutSlowInEasing,
-                durationMillis = duration
-            )
+            TweenSpec(easing = FastOutSlowInEasing, durationMillis = duration)
 
         var enabled by mutableStateOf(false)
         var expected by mutableStateOf(250f)
         rule.setContent {
             Box {
-                val animationValue by animateDpAsState(
-                    if (enabled) 50.dp else 250.dp, myTween()
-                )
+                val animationValue by animateDpAsState(if (enabled) 50.dp else 250.dp, myTween())
                 assertEquals(expected.dp, animationValue)
                 if (!firstRun) {
                     LaunchedEffect(enabled) {
@@ -432,11 +398,13 @@
                         do {
                             withFrameNanos {
                                 frameTime = it
-                                val playTime = ((frameTime - startTime) / 1_000_000L)
-                                    .coerceIn(0, duration.toLong())
-                                val fraction = FastOutSlowInEasing.transform(
-                                    playTime / duration.toFloat()
-                                )
+                                val playTime =
+                                    ((frameTime - startTime) / 1_000_000L).coerceIn(
+                                        0,
+                                        duration.toLong()
+                                    )
+                                val fraction =
+                                    FastOutSlowInEasing.transform(playTime / duration.toFloat())
                                 expected =
                                     if (enabled) {
                                         lerp(250f, 50f, fraction)
diff --git a/compose/animation/animation-core/src/androidInstrumentedTest/kotlin/androidx/compose/animation/core/TransitionTest.kt b/compose/animation/animation-core/src/androidInstrumentedTest/kotlin/androidx/compose/animation/core/TransitionTest.kt
index 340a1c1..de3c720 100644
--- a/compose/animation/animation-core/src/androidInstrumentedTest/kotlin/androidx/compose/animation/core/TransitionTest.kt
+++ b/compose/animation/animation-core/src/androidInstrumentedTest/kotlin/androidx/compose/animation/core/TransitionTest.kt
@@ -44,8 +44,7 @@
 @LargeTest
 class TransitionTest {
 
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
     private enum class AnimStates {
         From,
@@ -56,109 +55,117 @@
     @Test
     fun transitionTest() {
         val target = mutableStateOf(AnimStates.From)
-        val floatAnim1 = TargetBasedAnimation(
-            spring(dampingRatio = Spring.DampingRatioHighBouncy),
-            Float.VectorConverter,
-            0f,
-            1f
-        )
-        val floatAnim2 = TargetBasedAnimation(
-            spring(dampingRatio = Spring.DampingRatioLowBouncy, stiffness = Spring.StiffnessLow),
-            Float.VectorConverter,
-            1f,
-            0f
-        )
+        val floatAnim1 =
+            TargetBasedAnimation(
+                spring(dampingRatio = Spring.DampingRatioHighBouncy),
+                Float.VectorConverter,
+                0f,
+                1f
+            )
+        val floatAnim2 =
+            TargetBasedAnimation(
+                spring(
+                    dampingRatio = Spring.DampingRatioLowBouncy,
+                    stiffness = Spring.StiffnessLow
+                ),
+                Float.VectorConverter,
+                1f,
+                0f
+            )
 
-        val colorAnim1 = TargetBasedAnimation(
-            tween(1000),
-            Color.VectorConverter(Color.Red.colorSpace),
-            Color.Red,
-            Color.Green
-        )
-        val colorAnim2 = TargetBasedAnimation(
-            tween(1000),
-            Color.VectorConverter(Color.Red.colorSpace),
-            Color.Green,
-            Color.Red,
-        )
+        val colorAnim1 =
+            TargetBasedAnimation(
+                tween(1000),
+                Color.VectorConverter(Color.Red.colorSpace),
+                Color.Red,
+                Color.Green
+            )
+        val colorAnim2 =
+            TargetBasedAnimation(
+                tween(1000),
+                Color.VectorConverter(Color.Red.colorSpace),
+                Color.Green,
+                Color.Red,
+            )
 
         // Animate from 0f to 0f for 1000ms
-        val keyframes1 = keyframes<Float> {
-            durationMillis = 1000
-            0f at 0
-            200f at 400
-            1000f at 1000
-        }
+        val keyframes1 =
+            keyframes<Float> {
+                durationMillis = 1000
+                0f at 0
+                200f at 400
+                1000f at 1000
+            }
 
-        val keyframes2 = keyframes<Float> {
-            durationMillis = 800
-            0f at 0
-            -500f at 400
-            -1000f at 800
-        }
+        val keyframes2 =
+            keyframes<Float> {
+                durationMillis = 800
+                0f at 0
+                -500f at 400
+                -1000f at 800
+            }
 
-        val keyframesAnim1 = TargetBasedAnimation(
-            keyframes1,
-            Float.VectorConverter,
-            0f,
-            0f
-        )
-        val keyframesAnim2 = TargetBasedAnimation(
-            keyframes2,
-            Float.VectorConverter,
-            0f,
-            0f
-        )
+        val keyframesAnim1 = TargetBasedAnimation(keyframes1, Float.VectorConverter, 0f, 0f)
+        val keyframesAnim2 = TargetBasedAnimation(keyframes2, Float.VectorConverter, 0f, 0f)
         val animFloat = mutableStateOf(-1f)
         val animColor = mutableStateOf(Color.Gray)
         val animFloatWithKeyframes = mutableStateOf(-1f)
         rule.setContent {
             val transition = updateTransition(target.value)
-            animFloat.value = transition.animateFloat(
-                transitionSpec = {
-                    if (AnimStates.From isTransitioningTo AnimStates.To) {
-                        spring(dampingRatio = Spring.DampingRatioHighBouncy)
-                    } else {
-                        spring(
-                            dampingRatio = Spring.DampingRatioLowBouncy,
-                            stiffness = Spring.StiffnessLow
-                        )
+            animFloat.value =
+                transition
+                    .animateFloat(
+                        transitionSpec = {
+                            if (AnimStates.From isTransitioningTo AnimStates.To) {
+                                spring(dampingRatio = Spring.DampingRatioHighBouncy)
+                            } else {
+                                spring(
+                                    dampingRatio = Spring.DampingRatioLowBouncy,
+                                    stiffness = Spring.StiffnessLow
+                                )
+                            }
+                        }
+                    ) {
+                        when (it) {
+                            AnimStates.From -> 0f
+                            AnimStates.To -> 1f
+                        }
                     }
-                }
-            ) {
-                when (it) {
-                    AnimStates.From -> 0f
-                    AnimStates.To -> 1f
-                }
-            }.value
+                    .value
 
-            animColor.value = transition.animateColor(
-                transitionSpec = { tween(durationMillis = 1000) }
-            ) {
-                when (it) {
-                    AnimStates.From -> Color.Red
-                    AnimStates.To -> Color.Green
-                }
-            }.value
-
-            animFloatWithKeyframes.value = transition.animateFloat(
-                transitionSpec = {
-                    if (AnimStates.From isTransitioningTo AnimStates.To) {
-                        keyframes1
-                    } else {
-                        keyframes2
+            animColor.value =
+                transition
+                    .animateColor(transitionSpec = { tween(durationMillis = 1000) }) {
+                        when (it) {
+                            AnimStates.From -> Color.Red
+                            AnimStates.To -> Color.Green
+                        }
                     }
-                }
-            ) {
-                // Same values for all states, but different transitions from state to state.
-                0f
-            }.value
+                    .value
+
+            animFloatWithKeyframes.value =
+                transition
+                    .animateFloat(
+                        transitionSpec = {
+                            if (AnimStates.From isTransitioningTo AnimStates.To) {
+                                keyframes1
+                            } else {
+                                keyframes2
+                            }
+                        }
+                    ) {
+                        // Same values for all states, but different transitions from state to
+                        // state.
+                        0f
+                    }
+                    .value
 
             if (transition.isRunning) {
                 if (transition.targetState == AnimStates.To) {
                     assertEquals(
                         floatAnim1.getValueFromNanos(transition.playTimeNanos),
-                        animFloat.value, 0.00001f
+                        animFloat.value,
+                        0.00001f
                     )
                     assertEquals(
                         colorAnim1.getValueFromNanos(transition.playTimeNanos),
@@ -166,7 +173,8 @@
                     )
                     assertEquals(
                         keyframesAnim1.getValueFromNanos(transition.playTimeNanos),
-                        animFloatWithKeyframes.value, 0.00001f
+                        animFloatWithKeyframes.value,
+                        0.00001f
                     )
 
                     assertEquals(AnimStates.To, transition.segment.targetState)
@@ -174,7 +182,8 @@
                 } else {
                     assertEquals(
                         floatAnim2.getValueFromNanos(transition.playTimeNanos),
-                        animFloat.value, 0.00001f
+                        animFloat.value,
+                        0.00001f
                     )
                     assertEquals(
                         colorAnim2.getValueFromNanos(transition.playTimeNanos),
@@ -182,7 +191,8 @@
                     )
                     assertEquals(
                         keyframesAnim2.getValueFromNanos(transition.playTimeNanos),
-                        animFloatWithKeyframes.value, 0.00001f
+                        animFloatWithKeyframes.value,
+                        0.00001f
                     )
                     assertEquals(AnimStates.From, transition.segment.targetState)
                     assertEquals(AnimStates.To, transition.segment.initialState)
@@ -192,18 +202,14 @@
 
         assertEquals(0f, animFloat.value)
         assertEquals(Color.Red, animColor.value)
-        rule.runOnIdle {
-            target.value = AnimStates.To
-        }
+        rule.runOnIdle { target.value = AnimStates.To }
         rule.waitForIdle()
 
         assertEquals(1f, animFloat.value)
         assertEquals(Color.Green, animColor.value)
 
         // Animate back to the `from` state
-        rule.runOnIdle {
-            target.value = AnimStates.From
-        }
+        rule.runOnIdle { target.value = AnimStates.From }
         rule.waitForIdle()
 
         assertEquals(0f, animFloat.value)
@@ -216,11 +222,10 @@
         var playTime by mutableStateOf(0L)
         rule.setContent {
             val transition = updateTransition(target.value)
-            val actual = transition.animateFloat(
-                transitionSpec = { tween(200) }
-            ) {
-                if (it == AnimStates.From) 0f else 1000f
-            }
+            val actual =
+                transition.animateFloat(transitionSpec = { tween(200) }) {
+                    if (it == AnimStates.From) 0f else 1000f
+                }
 
             val anim = TargetBasedAnimation(tween(200), Float.VectorConverter, 0f, 1000f)
 
@@ -237,9 +242,7 @@
             }
         }
 
-        rule.runOnIdle {
-            target.value = AnimStates.To
-        }
+        rule.runOnIdle { target.value = AnimStates.To }
         rule.waitForIdle()
         assertTrue(playTime > 200 * MillisToNanos)
     }
@@ -252,28 +255,23 @@
         rule.setContent {
             val transition = updateTransition(target.value)
 
-            transition.animateFloat(
-                transitionSpec = { tween(1000) }
-            ) {
+            transition.animateFloat(transitionSpec = { tween(1000) }) {
                 if (it == AnimStates.From) -100f else 0f
             }
 
             if (transition.playTimeNanos > 0) {
                 val startTime = remember { transition.playTimeNanos }
-                val laterAdded = transition.animateFloat(
-                    transitionSpec = { tween(800) }
-                ) {
-                    if (it == AnimStates.From) 0f else 1000f
-                }
+                val laterAdded =
+                    transition.animateFloat(transitionSpec = { tween(800) }) {
+                        if (it == AnimStates.From) 0f else 1000f
+                    }
                 val anim = TargetBasedAnimation(tween(800), Float.VectorConverter, 0f, 1000f)
                 playTime = transition.playTimeNanos - startTime
                 assertEquals(anim.getValueFromNanos(playTime), laterAdded.value)
             }
         }
 
-        rule.runOnIdle {
-            target.value = AnimStates.To
-        }
+        rule.runOnIdle { target.value = AnimStates.To }
         rule.waitForIdle()
         assertTrue(playTime > 800 * MillisToNanos)
     }
@@ -286,11 +284,10 @@
         var floatAnim: State<Float>? = null
         rule.setContent {
             val transition = rememberTransition(target)
-            floatAnim = transition.animateFloat(
-                transitionSpec = { tween(800) }
-            ) {
-                if (it == AnimStates.From) 0f else 1000f
-            }
+            floatAnim =
+                transition.animateFloat(transitionSpec = { tween(800) }) {
+                    if (it == AnimStates.From) 0f else 1000f
+                }
             // Verify that animation starts right away
             LaunchedEffect(transition) {
                 val startTime = withFrameNanos { it }
@@ -314,11 +311,10 @@
             var target by remember { mutableStateOf(MutableTransitionState(AnimStates.From)) }
             target.targetState = AnimStates.To
             val transition = rememberTransition(target)
-            val floatAnim = transition.animateFloat(
-                transitionSpec = { tween(800) }
-            ) {
-                if (it == AnimStates.From) 0f else 1000f
-            }
+            val floatAnim =
+                transition.animateFloat(transitionSpec = { tween(800) }) {
+                    if (it == AnimStates.From) 0f else 1000f
+                }
             LaunchedEffect(Unit) {
                 delay(100)
                 target = MutableTransitionState(AnimStates.From)
@@ -352,11 +348,10 @@
         val mutableTransitionState = MutableTransitionState(false)
         var transition: Transition<Boolean>? = null
         rule.setContent {
-            transition = rememberTransition(mutableTransitionState).apply {
-                animateFloat {
-                    if (it) 1f else 0f
+            transition =
+                rememberTransition(mutableTransitionState).apply {
+                    animateFloat { if (it) 1f else 0f }
                 }
-            }
         }
         rule.mainClock.autoAdvance = false
         rule.runOnIdle {
@@ -395,19 +390,19 @@
         val childTransitionFloat = mutableStateOf(1f)
         rule.setContent {
             val transition = updateTransition(intState.value)
-            parentTransitionFloat.value = transition.animateFloat({ tween(100) }) {
-                when (it) {
-                    0 -> 0f
-                    1 -> 1f
-                    else -> 2f
-                }
-            }.value
-            val booleanTransition = transition.createChildTransition {
-                it == 1
-            }
-            childTransitionFloat.value = booleanTransition.animateFloat({ tween(500) }) {
-                if (it) 1f else 0f
-            }.value
+            parentTransitionFloat.value =
+                transition
+                    .animateFloat({ tween(100) }) {
+                        when (it) {
+                            0 -> 0f
+                            1 -> 1f
+                            else -> 2f
+                        }
+                    }
+                    .value
+            val booleanTransition = transition.createChildTransition { it == 1 }
+            childTransitionFloat.value =
+                booleanTransition.animateFloat({ tween(500) }) { if (it) 1f else 0f }.value
             LaunchedEffect(intState.value) {
                 while (true) {
                     if (transition.targetState == transition.currentState) {
@@ -463,26 +458,29 @@
         rule.setContent {
             coroutineScope = rememberCoroutineScope()
             val parent = rememberTransition(state)
-            value1 = parent.animateFloat({ tween(1600, easing = LinearEasing) }) {
-                if (it) 1000f else 0f
-            }.value
+            value1 =
+                parent
+                    .animateFloat({ tween(1600, easing = LinearEasing) }) { if (it) 1000f else 0f }
+                    .value
 
             val child = parent.createChildTransition { it }
-            value2 = child.animateFloat({ tween(160, easing = LinearEasing) }) {
-                if (it) 1000f else 0f
-            }.value
+            value2 =
+                child
+                    .animateFloat({ tween(160, easing = LinearEasing) }) { if (it) 1000f else 0f }
+                    .value
 
-            value3 = if (!parent.targetState) {
-                child.animateFloat({ tween(160, easing = LinearEasing) }) {
-                    if (it) 0f else 1000f
-                }.value
-            } else {
-                0f
-            }
+            value3 =
+                if (!parent.targetState) {
+                    child
+                        .animateFloat({ tween(160, easing = LinearEasing) }) {
+                            if (it) 0f else 1000f
+                        }
+                        .value
+                } else {
+                    0f
+                }
         }
-        coroutineScope.launch {
-            state.targetState = true
-        }
+        coroutineScope.launch { state.targetState = true }
         rule.mainClock.advanceTimeByFrame() // wait for composition
         rule.runOnIdle {
             assertEquals(0f, value1, 0f)
@@ -507,9 +505,7 @@
             assertEquals(1000f, value2, 0f)
             assertEquals(0f, value3, 0f) // hasn't started yet
         }
-        coroutineScope.launch {
-            state.targetState = false
-        }
+        coroutineScope.launch { state.targetState = false }
         rule.mainClock.advanceTimeByFrame() // compose the change
         rule.runOnIdle {
             assertEquals(120f, value1, 0.1f)
diff --git a/compose/animation/animation-core/src/androidUnitTest/kotlin/androidx/compose/animation/core/AnimatableTest.kt b/compose/animation/animation-core/src/androidUnitTest/kotlin/androidx/compose/animation/core/AnimatableTest.kt
index 39555aa..c09ec81 100644
--- a/compose/animation/animation-core/src/androidUnitTest/kotlin/androidx/compose/animation/core/AnimatableTest.kt
+++ b/compose/animation/animation-core/src/androidUnitTest/kotlin/androidx/compose/animation/core/AnimatableTest.kt
@@ -45,11 +45,8 @@
             val from = 9f
             val initialVelocity = 20f
             val decaySpec = FloatExponentialDecaySpec()
-            val anim = DecayAnimation(
-                decaySpec,
-                initialValue = from,
-                initialVelocity = initialVelocity
-            )
+            val anim =
+                DecayAnimation(decaySpec, initialValue = from, initialVelocity = initialVelocity)
             val clock = SuspendAnimationTest.TestFrameClock()
             val interval = 50
             withContext(clock) {
@@ -59,19 +56,16 @@
                 }
                 var playTimeMillis = 0L
                 val animatable = Animatable(9f)
-                val result = animatable.animateDecay(20f, animationSpec = exponentialDecay()) {
-                    assertTrue(isRunning)
-                    assertEquals(anim.targetValue, targetValue)
-                    assertEquals(anim.getValueFromMillis(playTimeMillis), value, 0.001f)
-                    assertEquals(
-                        anim.getVelocityFromMillis(playTimeMillis),
-                        velocity,
-                        0.001f
-                    )
-                    playTimeMillis += interval
-                    assertEquals(value, animatable.value, 0.0001f)
-                    assertEquals(velocity, animatable.velocity, 0.0001f)
-                }
+                val result =
+                    animatable.animateDecay(20f, animationSpec = exponentialDecay()) {
+                        assertTrue(isRunning)
+                        assertEquals(anim.targetValue, targetValue)
+                        assertEquals(anim.getValueFromMillis(playTimeMillis), value, 0.001f)
+                        assertEquals(anim.getVelocityFromMillis(playTimeMillis), velocity, 0.001f)
+                        playTimeMillis += interval
+                        assertEquals(value, animatable.value, 0.0001f)
+                        assertEquals(velocity, animatable.velocity, 0.0001f)
+                    }
                 // After animation
                 assertEquals(anim.targetValue, animatable.value)
                 assertEquals(false, animatable.isRunning)
@@ -85,10 +79,13 @@
     @Test
     fun animateToTest() {
         runBlocking {
-            val anim = TargetBasedAnimation(
-                spring(dampingRatio = Spring.DampingRatioMediumBouncy), Float.VectorConverter,
-                initialValue = 0f, targetValue = 1f
-            )
+            val anim =
+                TargetBasedAnimation(
+                    spring(dampingRatio = Spring.DampingRatioMediumBouncy),
+                    Float.VectorConverter,
+                    initialValue = 0f,
+                    targetValue = 1f
+                )
             val clock = SuspendAnimationTest.TestFrameClock()
             val interval = 50
             val animatable = Animatable(0f)
@@ -98,16 +95,17 @@
                     clock.frame(frameTimeMillis * 1_000_000L)
                 }
                 var playTimeMillis = 0L
-                val result = animatable.animateTo(
-                    1f,
-                    spring(dampingRatio = Spring.DampingRatioMediumBouncy)
-                ) {
-                    assertTrue(isRunning)
-                    assertEquals(1f, targetValue)
-                    assertEquals(anim.getValueFromMillis(playTimeMillis), value, 0.001f)
-                    assertEquals(anim.getVelocityFromMillis(playTimeMillis), velocity, 0.001f)
-                    playTimeMillis += interval
-                }
+                val result =
+                    animatable.animateTo(
+                        1f,
+                        spring(dampingRatio = Spring.DampingRatioMediumBouncy)
+                    ) {
+                        assertTrue(isRunning)
+                        assertEquals(1f, targetValue)
+                        assertEquals(anim.getValueFromMillis(playTimeMillis), value, 0.001f)
+                        assertEquals(anim.getVelocityFromMillis(playTimeMillis), velocity, 0.001f)
+                        playTimeMillis += interval
+                    }
                 // After animation
                 assertEquals(anim.targetValue, animatable.value)
                 assertEquals(0f, animatable.velocity)
@@ -127,16 +125,16 @@
                     convertToVector = { AnimationVector2D(it.x, it.y) },
                     convertFromVector = { Offset(it.v1, it.v2) }
                 )
-            val anim = TargetBasedAnimation(
-                tween(500), offsetToVector,
-                initialValue = from, targetValue = to
-            )
+            val anim =
+                TargetBasedAnimation(
+                    tween(500),
+                    offsetToVector,
+                    initialValue = from,
+                    targetValue = to
+                )
             val clock = SuspendAnimationTest.TestFrameClock()
             val interval = 50
-            val animatable = Animatable(
-                initialValue = from,
-                typeConverter = offsetToVector
-            )
+            val animatable = Animatable(initialValue = from, typeConverter = offsetToVector)
             coroutineScope {
                 withContext(clock) {
                     launch {
@@ -149,10 +147,7 @@
                     launch {
                         // The first frame should start at 100ms
                         var playTimeMillis = 0L
-                        animatable.animateTo(
-                            to,
-                            animationSpec = tween(500)
-                        ) {
+                        animatable.animateTo(to, animationSpec = tween(500)) {
                             assertTrue("PlayTime Millis: $playTimeMillis", isRunning)
                             assertEquals(to, targetValue)
                             val expectedValue = anim.getValueFromMillis(playTimeMillis)
@@ -189,12 +184,13 @@
     @Test
     fun animateToWithInterruption() {
         runBlocking {
-            val anim1 = TargetBasedAnimation(
-                tween(200, easing = LinearEasing),
-                Float.VectorConverter,
-                0f,
-                200f
-            )
+            val anim1 =
+                TargetBasedAnimation(
+                    tween(200, easing = LinearEasing),
+                    Float.VectorConverter,
+                    0f,
+                    200f
+                )
             val clock = MyTestFrameClock()
             val interval = 50
             coroutineScope {
@@ -203,37 +199,38 @@
                     var playTimeMillis by mutableStateOf(0L)
 
                     suspend fun createInterruption() {
-                        val anim2 = TargetBasedAnimation(
-                            spring(),
-                            Float.VectorConverter,
-                            animatable.value,
-                            300f,
-                            animatable.velocity
-                        )
+                        val anim2 =
+                            TargetBasedAnimation(
+                                spring(),
+                                Float.VectorConverter,
+                                animatable.value,
+                                300f,
+                                animatable.velocity
+                            )
                         assertEquals(100L, playTimeMillis)
                         var firstFrame = true
-                        val result2 = animatable.animateTo(300f, spring()) {
-                            // First frame will arrive with a timestamp of the time of interruption,
-                            // which is 100ms. The subsequent frames will be consistent with what's
-                            // tracked in `playTimeMillis`.
-                            val playTime = if (firstFrame) 100L else playTimeMillis
-                            assertTrue(isRunning)
-                            assertEquals(300f, targetValue)
-                            assertEquals(
-                                anim2.getValueFromMillis((playTime - 100)),
-                                value
-                            )
-                            assertEquals(
-                                anim2.getVelocityFromMillis((playTime - 100)),
-                                velocity
-                            )
-                            if (!firstFrame) {
-                                playTimeMillis += interval
-                                clock.trySendFrame(playTimeMillis * 1_000_000L)
-                            } else {
-                                firstFrame = false
+                        val result2 =
+                            animatable.animateTo(300f, spring()) {
+                                // First frame will arrive with a timestamp of the time of
+                                // interruption,
+                                // which is 100ms. The subsequent frames will be consistent with
+                                // what's
+                                // tracked in `playTimeMillis`.
+                                val playTime = if (firstFrame) 100L else playTimeMillis
+                                assertTrue(isRunning)
+                                assertEquals(300f, targetValue)
+                                assertEquals(anim2.getValueFromMillis((playTime - 100)), value)
+                                assertEquals(
+                                    anim2.getVelocityFromMillis((playTime - 100)),
+                                    velocity
+                                )
+                                if (!firstFrame) {
+                                    playTimeMillis += interval
+                                    clock.trySendFrame(playTimeMillis * 1_000_000L)
+                                } else {
+                                    firstFrame = false
+                                }
                             }
-                        }
                         assertFalse(animatable.isRunning)
                         assertEquals(AnimationEndReason.Finished, result2.endReason)
                         assertEquals(300f, animatable.targetValue)
@@ -251,15 +248,13 @@
                                 assertTrue(isRunning)
                                 assertEquals(targetValue, 200f)
                                 assertEquals(anim1.getValueFromMillis(playTimeMillis), value)
-                                assertEquals(
-                                    anim1.getVelocityFromMillis(playTimeMillis),
-                                    velocity
-                                )
+                                assertEquals(anim1.getVelocityFromMillis(playTimeMillis), velocity)
 
                                 assertTrue(playTimeMillis <= 100)
                                 if (playTimeMillis == 100L) {
                                     this@withContext.launch {
-                                        // No more new frame until the ongoing animation is canceled.
+                                        // No more new frame until the ongoing animation is
+                                        // canceled.
                                         createInterruption()
                                     }
                                 } else {
@@ -303,19 +298,18 @@
         assertEquals(0f, animatable.value)
 
         // Snap to value out of bounds
-        runBlocking {
-            animatable.snapTo(animatable.lowerBound!! - 100f)
-        }
+        runBlocking { animatable.snapTo(animatable.lowerBound!! - 100f) }
         assertEquals(animatable.lowerBound!!, animatable.value)
     }
 
     @Test
     fun testIntSize_alwaysWithinValidBounds() {
-        val animatable = Animatable(
-            initialValue = IntSize(10, 10),
-            typeConverter = IntSize.VectorConverter,
-            visibilityThreshold = IntSize.VisibilityThreshold
-        )
+        val animatable =
+            Animatable(
+                initialValue = IntSize(10, 10),
+                typeConverter = IntSize.VectorConverter,
+                visibilityThreshold = IntSize.VisibilityThreshold
+            )
 
         val values = mutableListOf<IntSize>()
 
@@ -353,10 +347,8 @@
 
     @Test
     fun animationResult_toString() {
-        val animatable = AnimationResult(
-            endReason = AnimationEndReason.Finished,
-            endState = AnimationState(42f)
-        )
+        val animatable =
+            AnimationResult(endReason = AnimationEndReason.Finished, endState = AnimationState(42f))
         val string = animatable.toString()
         assertThat(string).contains(AnimationResult::class.java.simpleName)
         assertThat(string).contains("endReason=Finished")
@@ -365,13 +357,14 @@
 
     @Test
     fun animationState_toString() {
-        val state = AnimationState(
-            initialValue = 42f,
-            initialVelocity = 2f,
-            lastFrameTimeNanos = 4000L,
-            finishedTimeNanos = 3000L,
-            isRunning = true
-        )
+        val state =
+            AnimationState(
+                initialValue = 42f,
+                initialVelocity = 2f,
+                lastFrameTimeNanos = 4000L,
+                finishedTimeNanos = 3000L,
+                isRunning = true
+            )
         val string = state.toString()
         assertThat(string).contains(AnimationState::class.java.simpleName)
         assertThat(string).contains("value=42.0")
diff --git a/compose/animation/animation-core/src/androidUnitTest/kotlin/androidx/compose/animation/core/AnimationTest.kt b/compose/animation/animation-core/src/androidUnitTest/kotlin/androidx/compose/animation/core/AnimationTest.kt
index a9f239f..b09fcfd 100644
--- a/compose/animation/animation-core/src/androidUnitTest/kotlin/androidx/compose/animation/core/AnimationTest.kt
+++ b/compose/animation/animation-core/src/androidUnitTest/kotlin/androidx/compose/animation/core/AnimationTest.kt
@@ -100,19 +100,17 @@
         val delay = 120
         val startValue = AnimationVector3D(100f, 200f, 300f)
         val endValue = AnimationVector3D(200f, 100f, 0f)
-        val keyframes = VectorizedKeyframesSpec<AnimationVector3D>(
-            mutableMapOf(
-                0 to (startValue to LinearEasing),
-                100 to (startValue to FastOutLinearInEasing)
-            ),
-            200,
-            delay
-        )
+        val keyframes =
+            VectorizedKeyframesSpec<AnimationVector3D>(
+                mutableMapOf(
+                    0 to (startValue to LinearEasing),
+                    100 to (startValue to FastOutLinearInEasing)
+                ),
+                200,
+                delay
+            )
 
-        assertEquals(
-            startValue,
-            keyframes.getValueFromMillis(0L, startValue, endValue, startValue)
-        )
+        assertEquals(startValue, keyframes.getValueFromMillis(0L, startValue, endValue, startValue))
         assertEquals(
             startValue,
             keyframes.getValueFromMillis(delay.toLong(), startValue, endValue, startValue)
@@ -124,25 +122,20 @@
             } else {
                 fraction = FastOutLinearInEasing.transform((i - 100) / 100f)
             }
-            val animValue = AnimationVector(
-                lerp(startValue.v1, endValue.v1, fraction),
-                lerp(startValue.v2, endValue.v2, fraction),
-                lerp(startValue.v3, endValue.v3, fraction)
-            )
+            val animValue =
+                AnimationVector(
+                    lerp(startValue.v1, endValue.v1, fraction),
+                    lerp(startValue.v2, endValue.v2, fraction),
+                    lerp(startValue.v3, endValue.v3, fraction)
+                )
             assertEquals(
                 animValue,
-                keyframes.getValueFromMillis(
-                    delay + i.toLong(),
-                    startValue, endValue, startValue
-                )
+                keyframes.getValueFromMillis(delay + i.toLong(), startValue, endValue, startValue)
             )
         }
 
         // Test playtime > duration + delay
-        assertEquals(
-            endValue,
-            keyframes.getValueFromMillis(500L, startValue, endValue, startValue)
-        )
+        assertEquals(endValue, keyframes.getValueFromMillis(500L, startValue, endValue, startValue))
     }
 
     @Test
@@ -165,12 +158,14 @@
             start1D,
             tween1D.getValueFromMillis(tween1D.delayMillis.toLong(), start1D, end1D, start1D)
         )
-        val animValue1D = AnimationVector(
-            lerp(
-                start1D.value, end1D.value,
-                FastOutSlowInEasing.transform(100f / tween1D.durationMillis)
+        val animValue1D =
+            AnimationVector(
+                lerp(
+                    start1D.value,
+                    end1D.value,
+                    FastOutSlowInEasing.transform(100f / tween1D.durationMillis)
+                )
             )
-        )
         assertEquals(
             animValue1D,
             tween1D.getValueFromMillis(tween1D.delayMillis + 100L, start1D, end1D, start1D)
@@ -188,10 +183,11 @@
             start2D,
             tween2D.getValueFromMillis(tween2D.delayMillis.toLong(), start2D, end2D, start2D)
         )
-        val animValue2D = AnimationVector(
-            lerp(start2D.v1, end2D.v1, 100f / tween2D.durationMillis),
-            lerp(start2D.v2, end2D.v2, 100f / tween2D.durationMillis)
-        )
+        val animValue2D =
+            AnimationVector(
+                lerp(start2D.v1, end2D.v1, 100f / tween2D.durationMillis),
+                lerp(start2D.v2, end2D.v2, 100f / tween2D.durationMillis)
+            )
         assertEquals(
             animValue2D,
             tween2D.getValueFromMillis(tween2D.delayMillis + 100L, start2D, end2D, start2D)
@@ -209,23 +205,24 @@
             start3D,
             tween3D.getValueFromMillis(tween3D.delayMillis.toLong(), start3D, end3D, start3D)
         )
-        val animValue3D = AnimationVector(
-            lerp(
-                start3D.v1,
-                end3D.v1,
-                FastOutLinearInEasing.transform(100f / tween3D.durationMillis)
-            ),
-            lerp(
-                start3D.v2,
-                end3D.v2,
-                FastOutLinearInEasing.transform(100f / tween3D.durationMillis)
-            ),
-            lerp(
-                start3D.v3,
-                end3D.v3,
-                FastOutLinearInEasing.transform(100f / tween3D.durationMillis)
+        val animValue3D =
+            AnimationVector(
+                lerp(
+                    start3D.v1,
+                    end3D.v1,
+                    FastOutLinearInEasing.transform(100f / tween3D.durationMillis)
+                ),
+                lerp(
+                    start3D.v2,
+                    end3D.v2,
+                    FastOutLinearInEasing.transform(100f / tween3D.durationMillis)
+                ),
+                lerp(
+                    start3D.v3,
+                    end3D.v3,
+                    FastOutLinearInEasing.transform(100f / tween3D.durationMillis)
+                )
             )
-        )
         assertEquals(
             animValue3D,
             tween3D.getValueFromMillis(tween3D.delayMillis + 100L, start3D, end3D, start3D)
@@ -243,24 +240,29 @@
             start4D,
             tween4D.getValueFromMillis(tween4D.delayMillis.toLong(), start4D, end4D, start4D)
         )
-        val animValue4D = AnimationVector(
-            lerp(
-                start4D.v1,
-                end4D.v1,
-                FastOutSlowInEasing.transform(100f / tween4D.durationMillis)
-            ),
-            lerp(
-                start4D.v2,
-                end4D.v2,
-                FastOutSlowInEasing.transform(100f / tween4D.durationMillis)
-            ),
-            lerp(
-                start4D.v3,
-                end4D.v3,
-                FastOutSlowInEasing.transform(100f / tween4D.durationMillis)
-            ),
-            lerp(start4D.v4, end4D.v4, FastOutSlowInEasing.transform(100f / tween4D.durationMillis))
-        )
+        val animValue4D =
+            AnimationVector(
+                lerp(
+                    start4D.v1,
+                    end4D.v1,
+                    FastOutSlowInEasing.transform(100f / tween4D.durationMillis)
+                ),
+                lerp(
+                    start4D.v2,
+                    end4D.v2,
+                    FastOutSlowInEasing.transform(100f / tween4D.durationMillis)
+                ),
+                lerp(
+                    start4D.v3,
+                    end4D.v3,
+                    FastOutSlowInEasing.transform(100f / tween4D.durationMillis)
+                ),
+                lerp(
+                    start4D.v4,
+                    end4D.v4,
+                    FastOutSlowInEasing.transform(100f / tween4D.durationMillis)
+                )
+            )
         assertEquals(
             animValue4D,
             tween4D.getValueFromMillis(tween4D.delayMillis + 100L, start4D, end4D, start4D)
@@ -269,26 +271,26 @@
 
     @Test
     fun testSpringAnimation() {
-        val anim3D = VectorizedSpringSpec<AnimationVector3D>(
-            Spring.DampingRatioHighBouncy,
-            Spring.StiffnessMedium, null
-        )
-        val floatAnim = FloatSpringSpec(
-            Spring.DampingRatioHighBouncy,
-            Spring.StiffnessMedium
-        )
+        val anim3D =
+            VectorizedSpringSpec<AnimationVector3D>(
+                Spring.DampingRatioHighBouncy,
+                Spring.StiffnessMedium,
+                null
+            )
+        val floatAnim = FloatSpringSpec(Spring.DampingRatioHighBouncy, Spring.StiffnessMedium)
 
         val start = AnimationVector(75f, 1000f, -256f)
         val end = AnimationVector(1296f, -357f, 500f)
         val startVelocity = AnimationVector(0f, 75f, 5f)
 
-        val duration = max(
-            floatAnim.getDurationMillis(start.v1, end.v1, startVelocity.v1),
+        val duration =
             max(
-                floatAnim.getDurationMillis(start.v2, end.v2, startVelocity.v2),
-                floatAnim.getDurationMillis(start.v3, end.v3, startVelocity.v3)
+                floatAnim.getDurationMillis(start.v1, end.v1, startVelocity.v1),
+                max(
+                    floatAnim.getDurationMillis(start.v2, end.v2, startVelocity.v2),
+                    floatAnim.getDurationMillis(start.v3, end.v3, startVelocity.v3)
+                )
             )
-        )
         assertEquals(duration, anim3D.getDurationMillis(start, end, startVelocity))
 
         for (i in 0..duration step 100) {
@@ -311,36 +313,39 @@
 
         verifyAnimation(
             VectorizedSpringSpec(
-                Spring.DampingRatioLowBouncy, Spring.StiffnessLow,
+                Spring.DampingRatioLowBouncy,
+                Spring.StiffnessLow,
                 AnimationVector(5f, 4f, 0.1f, 20f)
             ),
-            start, end, startVelocity
+            start,
+            end,
+            startVelocity
         )
 
         verifyAnimation(
             VectorizedTweenSpec(1000, easing = FastOutLinearInEasing),
-            start, end, startVelocity
+            start,
+            end,
+            startVelocity
         )
 
         verifyAnimation(VectorizedSnapSpec(200), start, end, startVelocity)
 
         verifyAnimation(
-            VectorizedKeyframesSpec(
-                mutableMapOf(
-                    200 to (start to LinearEasing)
-                ),
-                800
-            ),
-            start, end, startVelocity
+            VectorizedKeyframesSpec(mutableMapOf(200 to (start to LinearEasing)), 800),
+            start,
+            end,
+            startVelocity
         )
     }
 
     @Test
     fun testVectorizedInfiniteRepeatableSpec_velocityOnRepetitions() {
-        val repeatableSpec = VectorizedInfiniteRepeatableSpec(
-            animation = VectorizedAverageVelocitySpec(durationMillis = 1000),
-            repeatMode = RepeatMode.Restart,
-        )
+        val repeatableSpec =
+            VectorizedInfiniteRepeatableSpec(
+                animation = VectorizedAverageVelocitySpec(durationMillis = 1000),
+                repeatMode = RepeatMode.Restart,
+            )
         val playTimeNanosA = 0L
         val playTimeNanosB = 1_000L * 1_000_000 - 1
         val playTimeNanosC = 1_000L * 1_000_000 + 1
@@ -349,26 +354,29 @@
         val vectorEnd = AnimationVector(3f)
         val vectorV0 = AnimationVector(0f)
 
-        val velocityAtA = repeatableSpec.getVelocityFromNanos(
-            playTimeNanos = playTimeNanosA,
-            initialValue = vectorStart,
-            targetValue = vectorEnd,
-            initialVelocity = vectorV0
-        )
+        val velocityAtA =
+            repeatableSpec.getVelocityFromNanos(
+                playTimeNanos = playTimeNanosA,
+                initialValue = vectorStart,
+                targetValue = vectorEnd,
+                initialVelocity = vectorV0
+            )
 
-        val velocityAtB = repeatableSpec.getVelocityFromNanos(
-            playTimeNanos = playTimeNanosB,
-            initialValue = vectorStart,
-            targetValue = vectorEnd,
-            initialVelocity = vectorV0
-        )
+        val velocityAtB =
+            repeatableSpec.getVelocityFromNanos(
+                playTimeNanos = playTimeNanosB,
+                initialValue = vectorStart,
+                targetValue = vectorEnd,
+                initialVelocity = vectorV0
+            )
 
-        val velocityAC = repeatableSpec.getVelocityFromNanos(
-            playTimeNanos = playTimeNanosC,
-            initialValue = vectorStart,
-            targetValue = vectorEnd,
-            initialVelocity = vectorV0
-        )
+        val velocityAC =
+            repeatableSpec.getVelocityFromNanos(
+                playTimeNanos = playTimeNanosC,
+                initialValue = vectorStart,
+                targetValue = vectorEnd,
+                initialVelocity = vectorV0
+            )
 
         assertEquals(vectorV0, velocityAtA)
 
@@ -388,13 +396,8 @@
         end: AnimationVector4D,
         startVelocity: AnimationVector4D
     ) {
-        val fixedAnim = TargetBasedAnimation(
-            anim,
-            TwoWayConverter({ it }, { it }),
-            start,
-            end,
-            startVelocity
-        )
+        val fixedAnim =
+            TargetBasedAnimation(anim, TwoWayConverter({ it }, { it }), start, end, startVelocity)
         for (playtime in 0..fixedAnim.durationMillis step 100) {
             assertEquals(
                 anim.getValueFromMillis(playtime, start, end, startVelocity),
@@ -406,10 +409,7 @@
                 fixedAnim.getVelocityFromMillis(playtime)
             )
         }
-        assertEquals(
-            anim.getDurationMillis(start, end, startVelocity),
-            fixedAnim.durationMillis
-        )
+        assertEquals(anim.getDurationMillis(start, end, startVelocity), fixedAnim.durationMillis)
     }
 
     /**
@@ -431,12 +431,13 @@
             initialVelocity: V
         ): V {
             val playTimeSeconds = (playTimeNanos / 1_000_000).toFloat() / 1_000
-            val velocity = getVelocityFromNanos(
-                playTimeNanos = playTimeNanos,
-                initialValue = initialValue,
-                targetValue = targetValue,
-                initialVelocity = initialVelocity
-            )
+            val velocity =
+                getVelocityFromNanos(
+                    playTimeNanos = playTimeNanos,
+                    initialValue = initialValue,
+                    targetValue = targetValue,
+                    initialVelocity = initialVelocity
+                )
             val valueVector = initialValue.newInstance()
             for (i in 0 until velocity.size) {
                 valueVector[i] = velocity[i] * playTimeSeconds
@@ -462,11 +463,12 @@
             val velocityVector = initialVelocity.newInstance()
 
             for (i in 0 until averageVelocity.size) {
-                velocityVector[i] = lerp(
-                    start = initialVelocity[i],
-                    stop = finalVelocity[i],
-                    fraction = playTimeSeconds / durationSeconds
-                )
+                velocityVector[i] =
+                    lerp(
+                        start = initialVelocity[i],
+                        stop = finalVelocity[i],
+                        fraction = playTimeSeconds / durationSeconds
+                    )
             }
             return velocityVector
         }
diff --git a/compose/animation/animation-core/src/androidUnitTest/kotlin/androidx/compose/animation/core/AnimationTestUtils.kt b/compose/animation/animation-core/src/androidUnitTest/kotlin/androidx/compose/animation/core/AnimationTestUtils.kt
index 41e3cb7..6cfd113 100644
--- a/compose/animation/animation-core/src/androidUnitTest/kotlin/androidx/compose/animation/core/AnimationTestUtils.kt
+++ b/compose/animation/animation-core/src/androidUnitTest/kotlin/androidx/compose/animation/core/AnimationTestUtils.kt
@@ -17,12 +17,8 @@
 package androidx.compose.animation.core
 
 internal fun VectorizedAnimationSpec<AnimationVector1D>.at(time: Long): Float =
-    getValueFromMillis(
-        time,
-        AnimationVector1D(0f),
-        AnimationVector1D(1f),
-        AnimationVector1D(0f)
-    ).value
+    getValueFromMillis(time, AnimationVector1D(0f), AnimationVector1D(1f), AnimationVector1D(0f))
+        .value
 
 internal fun VectorizedAnimationSpec<AnimationVector1D>.at(time: Int): Float = at(time.toLong())
 
@@ -31,24 +27,28 @@
     start: Number,
     end: Number,
     startVelocity: Number
-) = getValueFromMillis(
-    playTime,
-    AnimationVector1D(start.toFloat()),
-    AnimationVector1D(end.toFloat()),
-    AnimationVector1D(startVelocity.toFloat())
-).value
+) =
+    getValueFromMillis(
+            playTime,
+            AnimationVector1D(start.toFloat()),
+            AnimationVector1D(end.toFloat()),
+            AnimationVector1D(startVelocity.toFloat())
+        )
+        .value
 
 internal fun VectorizedAnimationSpec<AnimationVector1D>.getVelocity(
     playTime: Long,
     start: Number,
     end: Number,
     startVelocity: Number
-) = getVelocityFromNanos(
-    playTime * MillisToNanos,
-    AnimationVector1D(start.toFloat()),
-    AnimationVector1D(end.toFloat()),
-    AnimationVector1D(startVelocity.toFloat())
-).value
+) =
+    getVelocityFromNanos(
+            playTime * MillisToNanos,
+            AnimationVector1D(start.toFloat()),
+            AnimationVector1D(end.toFloat()),
+            AnimationVector1D(startVelocity.toFloat())
+        )
+        .value
 
 /**
  * Returns the value of the animation at the given play time.
@@ -87,8 +87,8 @@
 ): Long = getDurationNanos(start, end, startVelocity) / MillisToNanos
 
 /**
- * Calculates the value of the animation at given the playtime, with the provided start/end
- * values, and start velocity.
+ * Calculates the value of the animation at given the playtime, with the provided start/end values,
+ * and start velocity.
  *
  * @param playTimeMillis time since the start of the animation
  * @param start start value of the animation
@@ -120,27 +120,21 @@
     startVelocity: Float
 ): Float = getVelocityFromNanos(playTimeMillis * MillisToNanos, start, end, startVelocity)
 
-/**
- * Creates a TwoWayConverter for FloatArray and the given AnimationVector type.
- */
+/** Creates a TwoWayConverter for FloatArray and the given AnimationVector type. */
 internal inline fun <reified V : AnimationVector> createFloatArrayConverter():
     TwoWayConverter<FloatArray, V> =
     object : TwoWayConverter<FloatArray, V> {
         override val convertToVector: (FloatArray) -> V = {
             when (V::class) {
                 AnimationVector1D::class -> {
-                    AnimationVector(
-                        it.getOrElse(0) { 0f }
-                    )
+                    AnimationVector(it.getOrElse(0) { 0f })
                 }
-
                 AnimationVector2D::class -> {
                     AnimationVector(
                         it.getOrElse(0) { 0f },
                         it.getOrElse(1) { 0f },
                     )
                 }
-
                 AnimationVector3D::class -> {
                     AnimationVector(
                         it.getOrElse(0) { 0f },
@@ -148,7 +142,6 @@
                         it.getOrElse(2) { 0f }
                     )
                 }
-
                 else -> { // 4D
                     AnimationVector(
                         it.getOrElse(0) { 0f },
@@ -157,20 +150,20 @@
                         it.getOrElse(3) { 0f }
                     )
                 }
-            } as V
+            }
+                as V
         }
         override val convertFromVector: (V) -> FloatArray = { vector ->
             FloatArray(vector.size, vector::get)
         }
     }
 
-/**
- * Returns an [AnimationVector] of type [V] filled with the given [value].
- */
+/** Returns an [AnimationVector] of type [V] filled with the given [value]. */
 internal inline fun <reified V : AnimationVector> createFilledVector(value: Float): V =
     when (V::class) {
         AnimationVector1D::class -> AnimationVector1D(value)
         AnimationVector2D::class -> AnimationVector2D(value, value)
         AnimationVector3D::class -> AnimationVector3D(value, value, value)
         else -> AnimationVector4D(value, value, value, value)
-    } as V
+    }
+        as V
diff --git a/compose/animation/animation-core/src/androidUnitTest/kotlin/androidx/compose/animation/core/AnimationVectorTest.kt b/compose/animation/animation-core/src/androidUnitTest/kotlin/androidx/compose/animation/core/AnimationVectorTest.kt
index 3683f26..263ac7b 100644
--- a/compose/animation/animation-core/src/androidUnitTest/kotlin/androidx/compose/animation/core/AnimationVectorTest.kt
+++ b/compose/animation/animation-core/src/androidUnitTest/kotlin/androidx/compose/animation/core/AnimationVectorTest.kt
@@ -28,10 +28,7 @@
     fun testReset() {
         assertEquals(AnimationVector1D(0f), AnimationVector(1f).apply { reset() })
         assertEquals(AnimationVector2D(0f, 0f), AnimationVector(1f, 2f).apply { reset() })
-        assertEquals(
-            AnimationVector3D(0f, 0f, 0f),
-            AnimationVector(1f, 2f, 3f).apply { reset() }
-        )
+        assertEquals(AnimationVector3D(0f, 0f, 0f), AnimationVector(1f, 2f, 3f).apply { reset() })
         assertEquals(
             AnimationVector4D(0f, 0f, 0f, 0f),
             AnimationVector(1f, 2f, 3f, 4f).apply { reset() }
@@ -59,14 +56,8 @@
         )
 
         // Expect *not* equal
-        assertNotEquals(
-            AnimationVector1D(0f).hashCode(),
-            AnimationVector(1f).hashCode()
-        )
-        assertNotEquals(
-            AnimationVector2D(2f, 1f).hashCode(),
-            AnimationVector(1f, 2f).hashCode()
-        )
+        assertNotEquals(AnimationVector1D(0f).hashCode(), AnimationVector(1f).hashCode())
+        assertNotEquals(AnimationVector2D(2f, 1f).hashCode(), AnimationVector(1f, 2f).hashCode())
         assertNotEquals(
             AnimationVector3D(1f, 2f, 3f).hashCode(),
             AnimationVector(1f, 2f, 3f).apply { reset() }.hashCode()
@@ -82,13 +73,7 @@
         assertEquals(AnimationVector1D(200f), AnimationVector(200f))
         assertEquals(AnimationVector2D(7f, 500f), AnimationVector(7f, 500f))
         assertNotEquals(AnimationVector2D(7f, 501f), AnimationVector(7f, 500f))
-        assertEquals(
-            AnimationVector3D(35f, 26f, 50f),
-            AnimationVector(35f, 26f, 50f)
-        )
-        assertEquals(
-            AnimationVector4D(1f, 2f, 3f, 4f),
-            AnimationVector(1f, 2f, 3f, 4f)
-        )
+        assertEquals(AnimationVector3D(35f, 26f, 50f), AnimationVector(35f, 26f, 50f))
+        assertEquals(AnimationVector4D(1f, 2f, 3f, 4f), AnimationVector(1f, 2f, 3f, 4f))
     }
 }
diff --git a/compose/animation/animation-core/src/androidUnitTest/kotlin/androidx/compose/animation/core/ArcAnimationTest.kt b/compose/animation/animation-core/src/androidUnitTest/kotlin/androidx/compose/animation/core/ArcAnimationTest.kt
index d9c38ec..98cfa61 100644
--- a/compose/animation/animation-core/src/androidUnitTest/kotlin/androidx/compose/animation/core/ArcAnimationTest.kt
+++ b/compose/animation/animation-core/src/androidUnitTest/kotlin/androidx/compose/animation/core/ArcAnimationTest.kt
@@ -26,9 +26,7 @@
 import org.junit.runner.RunWith
 import org.junit.runners.JUnit4
 
-/**
- * Mostly tests some mathematical assumptions about arcs.
- */
+/** Mostly tests some mathematical assumptions about arcs. */
 @Suppress("JoinDeclarationAndAssignment") // Looks kinda messy
 @OptIn(ExperimentalAnimationSpecApi::class)
 @RunWith(JUnit4::class)
@@ -165,8 +163,7 @@
     @Test
     fun test2DInterpolation_withEasing() {
         val animation = createArcAnimation<AnimationVector2D>(ArcLinear)
-        val easedAnimation =
-            createArcAnimation<AnimationVector2D>(ArcLinear, FastOutSlowInEasing)
+        val easedAnimation = createArcAnimation<AnimationVector2D>(ArcLinear, FastOutSlowInEasing)
 
         var arcValue: AnimationVector2D
         var easedArcValue: AnimationVector2D
@@ -308,18 +305,20 @@
         assertEquals(animationA, animationB)
 
         // Equals with custom values
-        animationA = ArcAnimationSpec(
-            mode = ArcBelow,
-            durationMillis = 13,
-            delayMillis = 17,
-            easing = EaseInOut
-        )
-        animationB = ArcAnimationSpec(
-            mode = ArcBelow,
-            durationMillis = 13,
-            delayMillis = 17,
-            easing = CubicBezierEasing(0.42f, 0.0f, 0.58f, 1.0f) // Re-declared EasInOut
-        )
+        animationA =
+            ArcAnimationSpec(
+                mode = ArcBelow,
+                durationMillis = 13,
+                delayMillis = 17,
+                easing = EaseInOut
+            )
+        animationB =
+            ArcAnimationSpec(
+                mode = ArcBelow,
+                durationMillis = 13,
+                delayMillis = 17,
+                easing = CubicBezierEasing(0.42f, 0.0f, 0.58f, 1.0f) // Re-declared EasInOut
+            )
         assertEquals(animationA, animationB)
     }
 
@@ -346,8 +345,8 @@
         assertNotEquals(animationA, animationB)
     }
 
-    private inline fun <reified V : AnimationVector>
-        VectorizedDurationBasedAnimationSpec<V>.valueAt(timePercent: Float): V =
+    private inline fun <reified V : AnimationVector> VectorizedDurationBasedAnimationSpec<V>
+        .valueAt(timePercent: Float): V =
         this.getValueFromNanos(
             playTimeNanos = (durationMillis * timePercent).toLong() * 1_000_000,
             initialValue = createFilledVector(initialValue),
@@ -355,8 +354,8 @@
             initialVelocity = createFilledVector(0f)
         )
 
-    private inline fun <reified V : AnimationVector>
-        VectorizedDurationBasedAnimationSpec<V>.velocityAt(timePercent: Float): V =
+    private inline fun <reified V : AnimationVector> VectorizedDurationBasedAnimationSpec<V>
+        .velocityAt(timePercent: Float): V =
         this.getVelocityFromNanos(
             playTimeNanos = (durationMillis * timePercent).toLong() * 1_000_000,
             initialValue = createFilledVector(initialValue),
@@ -369,18 +368,13 @@
         return createFilledVector<V>(value)
     }
 
-    /**
-     * Creates an [ArcAnimationSpec] for the given [AnimationVector] type.
-     */
+    /** Creates an [ArcAnimationSpec] for the given [AnimationVector] type. */
     private inline fun <reified V : AnimationVector> createArcAnimation(
         mode: ArcMode,
         easing: Easing = LinearEasing
     ): VectorizedDurationBasedAnimationSpec<V> {
-        val spec = ArcAnimationSpec<FloatArray>(
-            mode = mode,
-            durationMillis = timeMillis,
-            easing = easing
-        )
+        val spec =
+            ArcAnimationSpec<FloatArray>(mode = mode, durationMillis = timeMillis, easing = easing)
         return spec.vectorize(createFloatArrayConverter())
     }
 }
diff --git a/compose/animation/animation-core/src/androidUnitTest/kotlin/androidx/compose/animation/core/DecayAnimationTest.kt b/compose/animation/animation-core/src/androidUnitTest/kotlin/androidx/compose/animation/core/DecayAnimationTest.kt
index 93c9d99..da144e4f 100644
--- a/compose/animation/animation-core/src/androidUnitTest/kotlin/androidx/compose/animation/core/DecayAnimationTest.kt
+++ b/compose/animation/animation-core/src/androidUnitTest/kotlin/androidx/compose/animation/core/DecayAnimationTest.kt
@@ -80,25 +80,31 @@
 
         val startValue = 2000f
         val startVelocity = 800f
-        val fullAnim = FloatExponentialDecaySpec(absVelocityThreshold = 0f).createAnimation(
-            startValue,
-            startVelocity
-        )
+        val fullAnim =
+            FloatExponentialDecaySpec(absVelocityThreshold = 0f)
+                .createAnimation(startValue, startVelocity)
 
         val finishValue = fullAnim.getValueFromNanos(Int.MAX_VALUE.toLong())
 
-        val finishValue1 = anim1.createAnimation(startValue, startVelocity)
-            .getValueFromNanos(Int.MAX_VALUE.toLong())
+        val finishValue1 =
+            anim1
+                .createAnimation(startValue, startVelocity)
+                .getValueFromNanos(Int.MAX_VALUE.toLong())
 
-        val finishVelocity1 = anim1.createAnimation(startValue, startVelocity)
-            .getVelocityVectorFromNanos(Int.MAX_VALUE.toLong()).value
+        val finishVelocity1 =
+            anim1
+                .createAnimation(startValue, startVelocity)
+                .getVelocityVectorFromNanos(Int.MAX_VALUE.toLong())
+                .value
 
         // Verify that the finish velocity is at the threshold
         assertEquals(threshold, finishVelocity1, epsilon)
 
         // Feed in the finish value from anim1 to anim2
-        val finishValue2 = anim2.createAnimation(finishValue1, finishVelocity1)
-            .getValueFromNanos(Int.MAX_VALUE.toLong())
+        val finishValue2 =
+            anim2
+                .createAnimation(finishValue1, finishVelocity1)
+                .getValueFromNanos(Int.MAX_VALUE.toLong())
 
         assertEquals(finishValue, finishValue2, 2f)
     }
diff --git a/compose/animation/animation-core/src/androidUnitTest/kotlin/androidx/compose/animation/core/DelayedAnimationTest.kt b/compose/animation/animation-core/src/androidUnitTest/kotlin/androidx/compose/animation/core/DelayedAnimationTest.kt
index efabf6c..97feb08 100644
--- a/compose/animation/animation-core/src/androidUnitTest/kotlin/androidx/compose/animation/core/DelayedAnimationTest.kt
+++ b/compose/animation/animation-core/src/androidUnitTest/kotlin/androidx/compose/animation/core/DelayedAnimationTest.kt
@@ -34,11 +34,14 @@
         val targetValue = AnimationVector1D(1000f)
         val initialVelocity = AnimationVector1D(30f)
 
-        assertThat(vectorizedSpec.getDurationNanos(
-            initialValue = initialValue,
-            targetValue = targetValue,
-            initialVelocity = initialVelocity
-        )).isEqualTo(1500L * MillisToNanos)
+        assertThat(
+                vectorizedSpec.getDurationNanos(
+                    initialValue = initialValue,
+                    targetValue = targetValue,
+                    initialVelocity = initialVelocity
+                )
+            )
+            .isEqualTo(1500L * MillisToNanos)
     }
 
     @Test
@@ -53,33 +56,49 @@
         val targetValue = AnimationVector1D(1000f)
         val initialVelocity = AnimationVector1D(30f)
 
-        assertThat(vectorizedSpec.getValueFromNanos(
-            playTimeNanos = 0L,
-            initialValue = initialValue,
-            targetValue = targetValue,
-            initialVelocity = initialVelocity
-        )[0]).isEqualTo(0f)
+        assertThat(
+                vectorizedSpec
+                    .getValueFromNanos(
+                        playTimeNanos = 0L,
+                        initialValue = initialValue,
+                        targetValue = targetValue,
+                        initialVelocity = initialVelocity
+                    )[0]
+            )
+            .isEqualTo(0f)
 
-        assertThat(vectorizedSpec.getValueFromNanos(
-            playTimeNanos = delayNanos,
-            initialValue = initialValue,
-            targetValue = targetValue,
-            initialVelocity = initialVelocity
-        )[0]).isEqualTo(0f)
+        assertThat(
+                vectorizedSpec
+                    .getValueFromNanos(
+                        playTimeNanos = delayNanos,
+                        initialValue = initialValue,
+                        targetValue = targetValue,
+                        initialVelocity = initialVelocity
+                    )[0]
+            )
+            .isEqualTo(0f)
 
-        assertThat(vectorizedSpec.getValueFromNanos(
-            playTimeNanos = 1000L * MillisToNanos,
-            initialValue = initialValue,
-            targetValue = targetValue,
-            initialVelocity = initialVelocity
-        )[0]).isEqualTo(500f)
+        assertThat(
+                vectorizedSpec
+                    .getValueFromNanos(
+                        playTimeNanos = 1000L * MillisToNanos,
+                        initialValue = initialValue,
+                        targetValue = targetValue,
+                        initialVelocity = initialVelocity
+                    )[0]
+            )
+            .isEqualTo(500f)
 
-        assertThat(vectorizedSpec.getValueFromNanos(
-            playTimeNanos = 1500L * MillisToNanos,
-            initialValue = initialValue,
-            targetValue = targetValue,
-            initialVelocity = initialVelocity
-        )[0]).isEqualTo(1000f)
+        assertThat(
+                vectorizedSpec
+                    .getValueFromNanos(
+                        playTimeNanos = 1500L * MillisToNanos,
+                        initialValue = initialValue,
+                        targetValue = targetValue,
+                        initialVelocity = initialVelocity
+                    )[0]
+            )
+            .isEqualTo(1000f)
     }
 
     @Test
@@ -94,69 +113,93 @@
         val targetValue = AnimationVector1D(1000f)
         val initialVelocity = AnimationVector1D(30f)
 
-        assertThat(vectorizedSpec.getVelocityFromNanos(
-            playTimeNanos = 0L,
-            initialValue = initialValue,
-            targetValue = targetValue,
-            initialVelocity = initialVelocity
-        )[0]).isEqualTo(30f)
+        assertThat(
+                vectorizedSpec
+                    .getVelocityFromNanos(
+                        playTimeNanos = 0L,
+                        initialValue = initialValue,
+                        targetValue = targetValue,
+                        initialVelocity = initialVelocity
+                    )[0]
+            )
+            .isEqualTo(30f)
 
-        assertThat(vectorizedSpec.getVelocityFromNanos(
-            playTimeNanos = delayNanos,
-            initialValue = initialValue,
-            targetValue = targetValue,
-            initialVelocity = initialVelocity
-        )[0]).isEqualTo(30f)
+        assertThat(
+                vectorizedSpec
+                    .getVelocityFromNanos(
+                        playTimeNanos = delayNanos,
+                        initialValue = initialValue,
+                        targetValue = targetValue,
+                        initialVelocity = initialVelocity
+                    )[0]
+            )
+            .isEqualTo(30f)
 
         val vectorizedSpringSpec = springSpec.vectorize(Float.VectorConverter)
 
-        val springDuration = vectorizedSpringSpec.getDurationNanos(
-            initialValue = initialValue,
-            targetValue = targetValue,
-            initialVelocity = initialVelocity
-        )
-
-        assertThat(vectorizedSpec.getVelocityFromNanos(
-            playTimeNanos = (delayNanos) + (springDuration / 5),
-            initialValue = initialValue,
-            targetValue = targetValue,
-            initialVelocity = initialVelocity
-        )[0]).isEqualTo(
-            vectorizedSpringSpec.getVelocityFromNanos(
-                playTimeNanos = springDuration / 5,
+        val springDuration =
+            vectorizedSpringSpec.getDurationNanos(
                 initialValue = initialValue,
                 targetValue = targetValue,
                 initialVelocity = initialVelocity
-            )[0]
-        )
+            )
 
-        assertThat(vectorizedSpec.getVelocityFromNanos(
-            playTimeNanos = (delayNanos) + (springDuration / 2),
-            initialValue = initialValue,
-            targetValue = targetValue,
-            initialVelocity = initialVelocity
-        )[0]).isEqualTo(
-            vectorizedSpringSpec.getVelocityFromNanos(
-                playTimeNanos = springDuration / 2,
-                initialValue = initialValue,
-                targetValue = targetValue,
-                initialVelocity = initialVelocity
-            )[0]
-        )
+        assertThat(
+                vectorizedSpec
+                    .getVelocityFromNanos(
+                        playTimeNanos = (delayNanos) + (springDuration / 5),
+                        initialValue = initialValue,
+                        targetValue = targetValue,
+                        initialVelocity = initialVelocity
+                    )[0]
+            )
+            .isEqualTo(
+                vectorizedSpringSpec
+                    .getVelocityFromNanos(
+                        playTimeNanos = springDuration / 5,
+                        initialValue = initialValue,
+                        targetValue = targetValue,
+                        initialVelocity = initialVelocity
+                    )[0]
+            )
 
-        assertThat(vectorizedSpec.getVelocityFromNanos(
-            playTimeNanos = (delayNanos) + springDuration,
-            initialValue = initialValue,
-            targetValue = targetValue,
-            initialVelocity = initialVelocity
-        )[0]).isEqualTo(
-            vectorizedSpringSpec.getVelocityFromNanos(
-                playTimeNanos = springDuration,
-                initialValue = initialValue,
-                targetValue = targetValue,
-                initialVelocity = initialVelocity
-            )[0]
-        )
+        assertThat(
+                vectorizedSpec
+                    .getVelocityFromNanos(
+                        playTimeNanos = (delayNanos) + (springDuration / 2),
+                        initialValue = initialValue,
+                        targetValue = targetValue,
+                        initialVelocity = initialVelocity
+                    )[0]
+            )
+            .isEqualTo(
+                vectorizedSpringSpec
+                    .getVelocityFromNanos(
+                        playTimeNanos = springDuration / 2,
+                        initialValue = initialValue,
+                        targetValue = targetValue,
+                        initialVelocity = initialVelocity
+                    )[0]
+            )
+
+        assertThat(
+                vectorizedSpec
+                    .getVelocityFromNanos(
+                        playTimeNanos = (delayNanos) + springDuration,
+                        initialValue = initialValue,
+                        targetValue = targetValue,
+                        initialVelocity = initialVelocity
+                    )[0]
+            )
+            .isEqualTo(
+                vectorizedSpringSpec
+                    .getVelocityFromNanos(
+                        playTimeNanos = springDuration,
+                        initialValue = initialValue,
+                        targetValue = targetValue,
+                        initialVelocity = initialVelocity
+                    )[0]
+            )
     }
 
     @Test
@@ -170,11 +213,14 @@
         val targetValue = AnimationVector1D(1f)
         val initialVelocity = AnimationVector1D(0f)
 
-        assertThat(vectorizedSpec.getDurationNanos(
-            initialValue = initialValue,
-            targetValue = targetValue,
-            initialVelocity = initialVelocity
-        )).isEqualTo(0L)
+        assertThat(
+                vectorizedSpec.getDurationNanos(
+                    initialValue = initialValue,
+                    targetValue = targetValue,
+                    initialVelocity = initialVelocity
+                )
+            )
+            .isEqualTo(0L)
     }
 
     @Test
diff --git a/compose/animation/animation-core/src/androidUnitTest/kotlin/androidx/compose/animation/core/DurationScaleTest.kt b/compose/animation/animation-core/src/androidUnitTest/kotlin/androidx/compose/animation/core/DurationScaleTest.kt
index ed39954..8e87eb0 100644
--- a/compose/animation/animation-core/src/androidUnitTest/kotlin/androidx/compose/animation/core/DurationScaleTest.kt
+++ b/compose/animation/animation-core/src/androidUnitTest/kotlin/androidx/compose/animation/core/DurationScaleTest.kt
@@ -30,9 +30,12 @@
     @Test
     fun testAnimatable() = runBlocking {
         val clock = SuspendAnimationTest.TestFrameClock()
-        withContext(clock + object : MotionDurationScale {
-            override val scaleFactor: Float = 5f
-        }) {
+        withContext(
+            clock +
+                object : MotionDurationScale {
+                    override val scaleFactor: Float = 5f
+                }
+        ) {
             var playTime = 0
             clock.frame(0L)
             animate(0f, 500f, animationSpec = tween(100, easing = LinearEasing)) { value, _ ->
@@ -44,9 +47,12 @@
             }
         }
 
-        withContext(clock + object : MotionDurationScale {
-            override val scaleFactor: Float = 0f
-        }) {
+        withContext(
+            clock +
+                object : MotionDurationScale {
+                    override val scaleFactor: Float = 0f
+                }
+        ) {
             clock.frame(0L)
             animate(0f, 500f, animationSpec = tween(100, easing = LinearEasing)) { value, _ ->
                 // This should finish right away
diff --git a/compose/animation/animation-core/src/androidUnitTest/kotlin/androidx/compose/animation/core/EasingTest.kt b/compose/animation/animation-core/src/androidUnitTest/kotlin/androidx/compose/animation/core/EasingTest.kt
index beea6db..86ba661 100644
--- a/compose/animation/animation-core/src/androidUnitTest/kotlin/androidx/compose/animation/core/EasingTest.kt
+++ b/compose/animation/animation-core/src/androidUnitTest/kotlin/androidx/compose/animation/core/EasingTest.kt
@@ -84,20 +84,21 @@
     fun canSolveCubicForSmallFractions() {
         val curve = CubicBezierEasing(0.3f, 0.0f, 0.7f, 1.0f)
 
-        val testValues = intArrayOf(
-            0x3e800000, // 0.25f
-            0x3e000000, // 0.125f
-            0x3d800000, // 0.0625f
-            0x3a800000, // 0.0009765625f
-            0x36000000, // 0.0000019073486328125f
-            0x34800000, // 2.384185791015625e-7f
-            // Values from here are below the epsilon we use in our computations
-            0x34000000, // 1.1920928955078125e-7f
-            0x34210fb0, // 1.50000005305628292263e-7f
-            0x33800000, // 5.9604644775390625e-8f
-            0x33000000, // 2.98023223876953125e-8f
-            0x00000000, // 0.0f
-        )
+        val testValues =
+            intArrayOf(
+                0x3e800000, // 0.25f
+                0x3e000000, // 0.125f
+                0x3d800000, // 0.0625f
+                0x3a800000, // 0.0009765625f
+                0x36000000, // 0.0000019073486328125f
+                0x34800000, // 2.384185791015625e-7f
+                // Values from here are below the epsilon we use in our computations
+                0x34000000, // 1.1920928955078125e-7f
+                0x34210fb0, // 1.50000005305628292263e-7f
+                0x33800000, // 5.9604644775390625e-8f
+                0x33000000, // 2.98023223876953125e-8f
+                0x00000000, // 0.0f
+            )
 
         for (i in testValues) {
             val t = curve.transform(floatFromBits(i))
diff --git a/compose/animation/animation-core/src/androidUnitTest/kotlin/androidx/compose/animation/core/IntListExtensionTest.kt b/compose/animation/animation-core/src/androidUnitTest/kotlin/androidx/compose/animation/core/IntListExtensionTest.kt
index ab0487f..a24dda5 100644
--- a/compose/animation/animation-core/src/androidUnitTest/kotlin/androidx/compose/animation/core/IntListExtensionTest.kt
+++ b/compose/animation/animation-core/src/androidUnitTest/kotlin/androidx/compose/animation/core/IntListExtensionTest.kt
@@ -40,23 +40,13 @@
 
         // toIndex is exclusive, fails with size + 1
         assertThrows(IndexOutOfBoundsException::class.java) {
-            l.binarySearch(
-                element = 3,
-                toIndex = l.size + 1
-            )
+            l.binarySearch(element = 3, toIndex = l.size + 1)
         }
         assertThrows(IndexOutOfBoundsException::class.java) {
-            l.binarySearch(
-                element = 3,
-                fromIndex = -1
-            )
+            l.binarySearch(element = 3, fromIndex = -1)
         }
         assertThrows(IllegalArgumentException::class.java) {
-            l.binarySearch(
-                element = 3,
-                fromIndex = 1,
-                toIndex = 0
-            )
+            l.binarySearch(element = 3, fromIndex = 1, toIndex = 0)
         }
     }
 }
diff --git a/compose/animation/animation-core/src/androidUnitTest/kotlin/androidx/compose/animation/core/KeyframeAnimationTest.kt b/compose/animation/animation-core/src/androidUnitTest/kotlin/androidx/compose/animation/core/KeyframeAnimationTest.kt
index 74b0866..9fe726a 100644
--- a/compose/animation/animation-core/src/androidUnitTest/kotlin/androidx/compose/animation/core/KeyframeAnimationTest.kt
+++ b/compose/animation/animation-core/src/androidUnitTest/kotlin/androidx/compose/animation/core/KeyframeAnimationTest.kt
@@ -47,13 +47,15 @@
         val start = 0f
         val end = start // the same
         val fullTime = 400
-        val animation = keyframes<Float> {
-            durationMillis = fullTime
-            start at 100
-            0.5f at 200
-            0.8f at 300
-            end at fullTime
-        }.vectorize(Float.VectorConverter)
+        val animation =
+            keyframes<Float> {
+                    durationMillis = fullTime
+                    start at 100
+                    0.5f at 200
+                    0.8f at 300
+                    end at fullTime
+                }
+                .vectorize(Float.VectorConverter)
 
         assertThat(animation.at(0)).isEqualTo(start)
         assertThat(animation.at(250)).isEqualTo(0.65f)
@@ -63,11 +65,13 @@
     @Test
     fun possibleToOverrideStartAndEndValues() {
         val fullTime = 100
-        val animation = keyframes<Float> {
-            durationMillis = fullTime
-            1f at 0
-            0f at fullTime
-        }.vectorize(Float.VectorConverter)
+        val animation =
+            keyframes<Float> {
+                    durationMillis = fullTime
+                    1f at 0
+                    0f at fullTime
+                }
+                .vectorize(Float.VectorConverter)
 
         assertThat(animation.at(0)).isEqualTo(1f)
         assertThat(animation.at(fullTime.toLong())).isEqualTo(0f)
@@ -76,11 +80,13 @@
     @Test
     fun withEasingOnFullDuration() {
         val easing = FastOutSlowInEasing
-        val animation = keyframes<Float> {
-            durationMillis = 100
-            0f at 0 using easing
-            1f at durationMillis
-        }.vectorize(Float.VectorConverter)
+        val animation =
+            keyframes<Float> {
+                    durationMillis = 100
+                    0f at 0 using easing
+                    1f at durationMillis
+                }
+                .vectorize(Float.VectorConverter)
 
         assertThat(animation.at(31)).isEqualTo(easing.transform(0.31f))
     }
@@ -88,22 +94,26 @@
     @Test
     fun easingOnTheSecondPart() {
         val easing = FastOutSlowInEasing
-        val animation = keyframes<Float> {
-            durationMillis = 200
-            1f at 100 using easing
-            2f at durationMillis
-        }.vectorize(Float.VectorConverter)
+        val animation =
+            keyframes<Float> {
+                    durationMillis = 200
+                    1f at 100 using easing
+                    2f at durationMillis
+                }
+                .vectorize(Float.VectorConverter)
 
         assertThat(animation.at(140)).isEqualTo(1f + easing.transform(0.4f))
     }
 
     @Test
     fun firstPartIsLinearWithEasingOnTheSecondPart() {
-        val animation = keyframes<Float> {
-            durationMillis = 100
-            0.5f at 50 using FastOutSlowInEasing
-            1f at durationMillis
-        }.vectorize(Float.VectorConverter)
+        val animation =
+            keyframes<Float> {
+                    durationMillis = 100
+                    0.5f at 50 using FastOutSlowInEasing
+                    1f at durationMillis
+                }
+                .vectorize(Float.VectorConverter)
 
         assertThat(animation.at(25)).isEqualTo(0.25f)
     }
@@ -111,10 +121,12 @@
     @Test
     fun testMultiDimensKeyframesWithEasing() {
         val easing = FastOutLinearInEasing
-        val animation = keyframes<AnimationVector2D> {
-            durationMillis = 400
-            AnimationVector(200f, 300f) at 200 using easing
-        }.vectorize(TwoWayConverter<AnimationVector2D, AnimationVector2D>({ it }, { it }))
+        val animation =
+            keyframes<AnimationVector2D> {
+                    durationMillis = 400
+                    AnimationVector(200f, 300f) at 200 using easing
+                }
+                .vectorize(TwoWayConverter<AnimationVector2D, AnimationVector2D>({ it }, { it }))
 
         val start = AnimationVector(0f, 0f)
         val end = AnimationVector(200f, 400f)
@@ -131,10 +143,7 @@
             }
             assertEquals(
                 AnimationVector(v1, v2),
-                animation.getValueFromMillis(
-                    time.toLong(), start, end,
-                    AnimationVector(0f, 0f)
-                )
+                animation.getValueFromMillis(time.toLong(), start, end, AnimationVector(0f, 0f))
             )
         }
     }
@@ -153,13 +162,14 @@
 
         val animationReuseConfig = keyframes<Float>(config)
 
-        val animationRedeclareConfig = keyframes<Float> {
-            durationMillis = 500
-            0f at 100
-            0.5f at 200 using FastOutLinearInEasing
-            0.8f at 300
-            1f at durationMillis
-        }
+        val animationRedeclareConfig =
+            keyframes<Float> {
+                durationMillis = 500
+                0f at 100
+                0.5f at 200 using FastOutLinearInEasing
+                0.8f at 300
+                1f at durationMillis
+            }
 
         assertTrue(animation != animationReuseConfig)
         assertTrue(animation != animationRedeclareConfig)
@@ -168,37 +178,41 @@
 
     @Test
     fun testNotEquals1() {
-        val animation = keyframes<Float> {
-            durationMillis = 500
-            0f at 100
-            0.5f at 200 using FastOutLinearInEasing
-            0.8f at 300
-            1f at durationMillis
-        }
+        val animation =
+            keyframes<Float> {
+                durationMillis = 500
+                0f at 100
+                0.5f at 200 using FastOutLinearInEasing
+                0.8f at 300
+                1f at durationMillis
+            }
 
-        val animationAlteredDuration = keyframes<Float> {
-            durationMillis = 700
-            0f at 100
-            0.5f at 200 using FastOutLinearInEasing
-            0.8f at 300
-            1f at durationMillis
-        }
+        val animationAlteredDuration =
+            keyframes<Float> {
+                durationMillis = 700
+                0f at 100
+                0.5f at 200 using FastOutLinearInEasing
+                0.8f at 300
+                1f at durationMillis
+            }
 
-        val animationAlteredEasing = keyframes<Float> {
-            durationMillis = 500
-            0f at 100 using FastOutSlowInEasing
-            0.5f at 200
-            0.8f at 300
-            1f at durationMillis
-        }
+        val animationAlteredEasing =
+            keyframes<Float> {
+                durationMillis = 500
+                0f at 100 using FastOutSlowInEasing
+                0.5f at 200
+                0.8f at 300
+                1f at durationMillis
+            }
 
-        val animationAlteredKeyframes = keyframes<Float> {
-            durationMillis = 500
-            0f at 100
-            0.3f at 200 using FastOutLinearInEasing
-            0.8f at 400
-            1f at durationMillis
-        }
+        val animationAlteredKeyframes =
+            keyframes<Float> {
+                durationMillis = 500
+                0f at 100
+                0.3f at 200 using FastOutLinearInEasing
+                0.8f at 400
+                1f at durationMillis
+            }
 
         assertTrue(animation != animationAlteredDuration)
         assertTrue(animation != animationAlteredEasing)
@@ -210,13 +224,15 @@
         val start = 0f
         val end = start // the same
         val fullTime = 400
-        val animation = keyframes<Float> {
-            durationMillis = fullTime
-            start atFraction 0.25f
-            0.5f atFraction 0.5f
-            0.8f atFraction 0.75f
-            end atFraction 1f
-        }.vectorize(Float.VectorConverter)
+        val animation =
+            keyframes<Float> {
+                    durationMillis = fullTime
+                    start atFraction 0.25f
+                    0.5f atFraction 0.5f
+                    0.8f atFraction 0.75f
+                    end atFraction 1f
+                }
+                .vectorize(Float.VectorConverter)
 
         assertThat(animation.at(0)).isEqualTo(start)
         assertThat(animation.at(250)).isEqualTo(0.65f)
@@ -225,11 +241,13 @@
 
     @Test
     fun percentageBasedKeyframesWithEasing() {
-        val animation = keyframes<Float> {
-            durationMillis = 100
-            0.5f atFraction 0.5f using FastOutSlowInEasing
-            1f atFraction 1f
-        }.vectorize(Float.VectorConverter)
+        val animation =
+            keyframes<Float> {
+                    durationMillis = 100
+                    0.5f atFraction 0.5f using FastOutSlowInEasing
+                    1f atFraction 1f
+                }
+                .vectorize(Float.VectorConverter)
 
         assertThat(animation.at(25)).isEqualTo(0.25f)
     }
@@ -241,14 +259,16 @@
 
         // Out of range values should be effectively ignored.
         // It should interpolate within the expected time range without issues
-        val animation = keyframes<Float> {
-            durationMillis = duration
-            delayMillis = delay
+        val animation =
+            keyframes<Float> {
+                    durationMillis = duration
+                    delayMillis = delay
 
-            -1f at -delay using LinearEasing
-            -2f at -duration using LinearEasing
-            -3f at (duration + 50) using LinearEasing
-        }.vectorize(Float.VectorConverter)
+                    -1f at -delay using LinearEasing
+                    -2f at -duration using LinearEasing
+                    -3f at (duration + 50) using LinearEasing
+                }
+                .vectorize(Float.VectorConverter)
 
         // Within delay, should always return initial value unless it was overwritten
         assertThat(animation.at(0)).isEqualTo(0f)
@@ -273,18 +293,20 @@
 
         // Out of range values should be effectively ignored.
         // It should interpolate within the expected time range without issues
-        val animation = keyframes<Float> {
-            durationMillis = duration
-            delayMillis = delay
+        val animation =
+            keyframes<Float> {
+                    durationMillis = duration
+                    delayMillis = delay
 
-            -1f at -delay using LinearEasing
-            -2f at -duration using LinearEasing
-            -3f at (duration + 50) using LinearEasing
+                    -1f at -delay using LinearEasing
+                    -2f at -duration using LinearEasing
+                    -3f at (duration + 50) using LinearEasing
 
-            // Force initial and target
-            4f at 0 using LinearEasing
-            5f at duration using LinearEasing
-        }.vectorize(Float.VectorConverter)
+                    // Force initial and target
+                    4f at 0 using LinearEasing
+                    5f at duration using LinearEasing
+                }
+                .vectorize(Float.VectorConverter)
 
         // Within delay, should always return initial value unless it was overwritten
         assertThat(animation.at(0)).isEqualTo(4f)
diff --git a/compose/animation/animation-core/src/androidUnitTest/kotlin/androidx/compose/animation/core/KeyframeArcAnimationTest.kt b/compose/animation/animation-core/src/androidUnitTest/kotlin/androidx/compose/animation/core/KeyframeArcAnimationTest.kt
index 1976ee8..97b2ea2 100644
--- a/compose/animation/animation-core/src/androidUnitTest/kotlin/androidx/compose/animation/core/KeyframeArcAnimationTest.kt
+++ b/compose/animation/animation-core/src/androidUnitTest/kotlin/androidx/compose/animation/core/KeyframeArcAnimationTest.kt
@@ -41,40 +41,45 @@
         var linearVector: AnimationVector2D
 
         // Test above, below, linear keyframes
-        val keyframeAnimation = keyframes {
-            durationMillis = timeMillis
+        val keyframeAnimation =
+            keyframes {
+                    durationMillis = timeMillis
 
-            Offset(initialValue, initialValue) at 0 using LinearEasing using ArcAbove
-            Offset(200f, 200f) at 1000 using LinearEasing using ArcBelow
-            Offset(400f, 400f) atFraction 2f / 3f using LinearEasing using ArcLinear
-        }.vectorize(Offset.VectorConverter)
+                    Offset(initialValue, initialValue) at 0 using LinearEasing using ArcAbove
+                    Offset(200f, 200f) at 1000 using LinearEasing using ArcBelow
+                    Offset(400f, 400f) atFraction 2f / 3f using LinearEasing using ArcLinear
+                }
+                .vectorize(Offset.VectorConverter)
 
-        arcVector = keyframeAnimation.getValueFromNanos(
-            (500).toLong() * 1_000_000,
-            createFilledVector(initialValue),
-            createFilledVector(targetValue),
-            createFilledVector(0f)
-        )
+        arcVector =
+            keyframeAnimation.getValueFromNanos(
+                (500).toLong() * 1_000_000,
+                createFilledVector(initialValue),
+                createFilledVector(targetValue),
+                createFilledVector(0f)
+            )
         linearVector = linearValueAt(1f / 6f)
         assertTrue(arcVector[0] > linearVector[0]) // X is higher for ArcAbove (in this scenario)
         assertTrue(arcVector[1] < linearVector[1]) // Y is lower for ArcAbove (in this scenario)
 
-        arcVector = keyframeAnimation.getValueFromNanos(
-            (1500).toLong() * 1_000_000,
-            createFilledVector(initialValue),
-            createFilledVector(targetValue),
-            createFilledVector(0f)
-        )
+        arcVector =
+            keyframeAnimation.getValueFromNanos(
+                (1500).toLong() * 1_000_000,
+                createFilledVector(initialValue),
+                createFilledVector(targetValue),
+                createFilledVector(0f)
+            )
         linearVector = linearValueAt(3f / 6f)
         assertTrue(arcVector[0] < linearVector[0]) // X is lower for ArcBelow
         assertTrue(arcVector[1] > linearVector[1]) // Y is higher for ArcBelow
 
-        arcVector = keyframeAnimation.getValueFromNanos(
-            (2500).toLong() * 1_000_000,
-            createFilledVector(initialValue),
-            createFilledVector(targetValue),
-            createFilledVector(0f)
-        )
+        arcVector =
+            keyframeAnimation.getValueFromNanos(
+                (2500).toLong() * 1_000_000,
+                createFilledVector(initialValue),
+                createFilledVector(targetValue),
+                createFilledVector(0f)
+            )
         linearVector = linearValueAt(5f / 6f)
         assertEquals(linearVector[0], arcVector[0], error) // X is equals for ArcLinear
         assertEquals(linearVector[1], arcVector[1], error) // Y is equals for ArcLinear
@@ -86,44 +91,49 @@
         var linearVector: AnimationVector2D
 
         // We test different Easing curves using Linear arc mode
-        val keyframeAnimation = keyframes {
-            durationMillis = timeMillis
+        val keyframeAnimation =
+            keyframes {
+                    durationMillis = timeMillis
 
-            Offset.Zero at 0 using EaseInCubic using ArcLinear
-            Offset(200f, 200f) at 1000 using LinearEasing using ArcLinear
-            Offset(400f, 400f) atFraction 2f / 3f using EaseOutCubic using ArcLinear
-        }.vectorize(Offset.VectorConverter)
+                    Offset.Zero at 0 using EaseInCubic using ArcLinear
+                    Offset(200f, 200f) at 1000 using LinearEasing using ArcLinear
+                    Offset(400f, 400f) atFraction 2f / 3f using EaseOutCubic using ArcLinear
+                }
+                .vectorize(Offset.VectorConverter)
 
         // Start with EaseInCubic, which is always a lower value
-        arcVector = keyframeAnimation.getValueFromNanos(
-            (500).toLong() * 1_000_000,
-            createFilledVector(initialValue),
-            createFilledVector(targetValue),
-            createFilledVector(0f)
-        )
+        arcVector =
+            keyframeAnimation.getValueFromNanos(
+                (500).toLong() * 1_000_000,
+                createFilledVector(initialValue),
+                createFilledVector(targetValue),
+                createFilledVector(0f)
+            )
         linearVector = linearValueAt(1f / 6f)
         // X & Y are lower for EaseInCubic
         assertTrue(arcVector[0] < linearVector[0])
         assertTrue(arcVector[1] < linearVector[1])
 
         // Then, LinearEasing, which is always equals
-        arcVector = keyframeAnimation.getValueFromNanos(
-            (1500).toLong() * 1_000_000,
-            createFilledVector(initialValue),
-            createFilledVector(targetValue),
-            createFilledVector(0f)
-        )
+        arcVector =
+            keyframeAnimation.getValueFromNanos(
+                (1500).toLong() * 1_000_000,
+                createFilledVector(initialValue),
+                createFilledVector(targetValue),
+                createFilledVector(0f)
+            )
         linearVector = linearValueAt(3f / 6f)
         assertEquals(linearVector[0], arcVector[0], error) // X is equals with LinearEasing
         assertEquals(linearVector[1], arcVector[1], error) // Y is equals with LinearEasing
 
         // Then, EaseOutCubic, which is always a higher value
-        arcVector = keyframeAnimation.getValueFromNanos(
-            (2500).toLong() * 1_000_000,
-            createFilledVector(initialValue),
-            createFilledVector(targetValue),
-            createFilledVector(0f)
-        )
+        arcVector =
+            keyframeAnimation.getValueFromNanos(
+                (2500).toLong() * 1_000_000,
+                createFilledVector(initialValue),
+                createFilledVector(targetValue),
+                createFilledVector(0f)
+            )
         linearVector = linearValueAt(5f / 6f)
         // X & Y are higher for EaseOutCubic
         assertTrue(arcVector[0] > linearVector[0])
diff --git a/compose/animation/animation-core/src/androidUnitTest/kotlin/androidx/compose/animation/core/KeyframeSplineAnimationTest.kt b/compose/animation/animation-core/src/androidUnitTest/kotlin/androidx/compose/animation/core/KeyframeSplineAnimationTest.kt
index 64c1360..fcae260 100644
--- a/compose/animation/animation-core/src/androidUnitTest/kotlin/androidx/compose/animation/core/KeyframeSplineAnimationTest.kt
+++ b/compose/animation/animation-core/src/androidUnitTest/kotlin/androidx/compose/animation/core/KeyframeSplineAnimationTest.kt
@@ -28,17 +28,18 @@
 @RunWith(JUnit4::class)
 class KeyframeSplineAnimationTest {
 
-    /**
-     * See [MonoSplineTest] to test the interpolation curves.
-     */
+    /** See [MonoSplineTest] to test the interpolation curves. */
     @Test
     fun interpolatedValues() {
-        val animation = keyframesWithSpline {
-            durationMillis = 500
+        val animation =
+            keyframesWithSpline {
+                    durationMillis = 500
 
-            // At half the time, reach the final Y value (expected final value is Offset(2f, 2f))
-            Offset(1f, 2f) at 250
-        }.vectorize(Offset.VectorConverter)
+                    // At half the time, reach the final Y value (expected final value is Offset(2f,
+                    // 2f))
+                    Offset(1f, 2f) at 250
+                }
+                .vectorize(Offset.VectorConverter)
 
         // Test at a quarter of the time
         assertEquals(AnimationVector2D(0.5f, 1.25f), animation.valueAt(125))
@@ -68,41 +69,44 @@
         // duration
         // This means that on a linear interpolation, the initial velocity (past 0ms) would be
         // positive and the final velocity would be negative with the same magnitude
-        val sharedConfig = KeyframesWithSplineSpec.KeyframesWithSplineSpecConfig<Float>().apply {
-            durationMillis = 1000
+        val sharedConfig =
+            KeyframesWithSplineSpec.KeyframesWithSplineSpecConfig<Float>().apply {
+                durationMillis = 1000
 
-            1f at 500 using LinearEasing
-        }
+                1f at 500 using LinearEasing
+            }
 
         // We'll compare different periodic bias against the regular spline
-        val splineAnimation = KeyframesWithSplineSpec(sharedConfig, Float.NaN)
-            .vectorize(Float.VectorConverter)
-        val splineAnimationBalancedBias = KeyframesWithSplineSpec(sharedConfig, 0.5f)
-            .vectorize(Float.VectorConverter)
-        val splineAnimationStartBias = KeyframesWithSplineSpec(sharedConfig, 0f)
-            .vectorize(Float.VectorConverter)
-        val splineAnimationEndBias = KeyframesWithSplineSpec(sharedConfig, 1f)
-            .vectorize(Float.VectorConverter)
+        val splineAnimation =
+            KeyframesWithSplineSpec(sharedConfig, Float.NaN).vectorize(Float.VectorConverter)
+        val splineAnimationBalancedBias =
+            KeyframesWithSplineSpec(sharedConfig, 0.5f).vectorize(Float.VectorConverter)
+        val splineAnimationStartBias =
+            KeyframesWithSplineSpec(sharedConfig, 0f).vectorize(Float.VectorConverter)
+        val splineAnimationEndBias =
+            KeyframesWithSplineSpec(sharedConfig, 1f).vectorize(Float.VectorConverter)
 
         // Periodic bias affect the velocity at the start and end of the animation.
         // Note that we don't test at exactly 0 since that would always return the initial velocity
         fun VectorizedDurationBasedAnimationSpec<AnimationVector1D>.startVelocity():
             AnimationVector1D {
             return getVelocityFromNanos(
-                playTimeNanos = 1L,
-                initialValue = AnimationVector1D(0f),
-                targetValue = AnimationVector1D(0f),
-                initialVelocity = AnimationVector1D(0f)
-            ).let { AnimationVector1D(it.value) } // Copy since vector is reused internally
+                    playTimeNanos = 1L,
+                    initialValue = AnimationVector1D(0f),
+                    targetValue = AnimationVector1D(0f),
+                    initialVelocity = AnimationVector1D(0f)
+                )
+                .let { AnimationVector1D(it.value) } // Copy since vector is reused internally
         }
         fun VectorizedDurationBasedAnimationSpec<AnimationVector1D>.endVelocity():
             AnimationVector1D {
             return getVelocityFromNanos(
-                playTimeNanos = 1000 * MillisToNanos,
-                initialValue = AnimationVector1D(0f),
-                targetValue = AnimationVector1D(0f),
-                initialVelocity = AnimationVector1D(0f)
-            ).let { AnimationVector1D(it.value) } // Copy since vector is reused internally
+                    playTimeNanos = 1000 * MillisToNanos,
+                    initialValue = AnimationVector1D(0f),
+                    targetValue = AnimationVector1D(0f),
+                    initialVelocity = AnimationVector1D(0f)
+                )
+                .let { AnimationVector1D(it.value) } // Copy since vector is reused internally
         }
 
         val regularV0 = splineAnimation.startVelocity()
@@ -111,10 +115,8 @@
         val balancedV0 = splineAnimationBalancedBias.startVelocity()
         val balancedV1 = splineAnimationBalancedBias.endVelocity()
 
-        val startBiasV0 =
-            splineAnimationStartBias.startVelocity()
-        val startBiasV1 =
-            splineAnimationStartBias.endVelocity()
+        val startBiasV0 = splineAnimationStartBias.startVelocity()
+        val startBiasV1 = splineAnimationStartBias.endVelocity()
 
         val endBiasV0 = splineAnimationEndBias.startVelocity()
         val endBiasV1 = splineAnimationEndBias.endVelocity()
@@ -139,16 +141,18 @@
 
     @Test
     fun testMultipleEasing() {
-        val animation = keyframesWithSpline {
-            durationMillis = 300
+        val animation =
+            keyframesWithSpline {
+                    durationMillis = 300
 
-            Offset(0f, 0f) at 0 using EaseInCubic
-            Offset(1f, 1f) at 100 using EaseOutCubic
-            Offset(2f, 2f) at 200 using LinearEasing
+                    Offset(0f, 0f) at 0 using EaseInCubic
+                    Offset(1f, 1f) at 100 using EaseOutCubic
+                    Offset(2f, 2f) at 200 using LinearEasing
 
-            // This easing is never applied since it's at the end
-            Offset(3f, 3f) at 300 using LinearOutSlowInEasing
-        }.vectorize(Offset.VectorConverter)
+                    // This easing is never applied since it's at the end
+                    Offset(3f, 3f) at 300 using LinearOutSlowInEasing
+                }
+                .vectorize(Offset.VectorConverter)
 
         // Initial and target values don't matter since they're overwritten
         var valueVector = animation.valueAt(50)
@@ -170,34 +174,40 @@
 
     @Test
     fun possibleToOverrideStartAndEndValues() {
-        val animation = keyframesWithSpline {
-            durationMillis = 500
-            Offset(0f, 0f) at 0 // Forcing start to 0f, 0f
-            Offset(1f, 1f) at 250
-            Offset(2f, 2f) at 500 // Forcing end to 2f, 2f
-        }.vectorize(Offset.VectorConverter)
+        val animation =
+            keyframesWithSpline {
+                    durationMillis = 500
+                    Offset(0f, 0f) at 0 // Forcing start to 0f, 0f
+                    Offset(1f, 1f) at 250
+                    Offset(2f, 2f) at 500 // Forcing end to 2f, 2f
+                }
+                .vectorize(Offset.VectorConverter)
 
-        val startValue = animation.valueAt(
-            playTimeMillis = 0L,
-            start = Offset(-1f, -1f), // Requested start is -1f, -1f
-            end = Offset(-1f, -1f) // Requested end is -1f, -1f
-        )
-        val endValue = animation.valueAt(
-            playTimeMillis = 500L,
-            start = Offset(-1f, -1f),
-            end = Offset(-1f, -1f)
-        )
+        val startValue =
+            animation.valueAt(
+                playTimeMillis = 0L,
+                start = Offset(-1f, -1f), // Requested start is -1f, -1f
+                end = Offset(-1f, -1f) // Requested end is -1f, -1f
+            )
+        val endValue =
+            animation.valueAt(
+                playTimeMillis = 500L,
+                start = Offset(-1f, -1f),
+                end = Offset(-1f, -1f)
+            )
         assertEquals(AnimationVector2D(0f, 0f), startValue)
         assertEquals(AnimationVector2D(2f, 2f), endValue)
     }
 
     @Test
     fun initialVelocityIgnored() {
-        val animation = keyframesWithSpline {
-            durationMillis = 500
+        val animation =
+            keyframesWithSpline {
+                    durationMillis = 500
 
-            Offset(1f, 1f) at 250
-        }.vectorize(Offset.VectorConverter)
+                    Offset(1f, 1f) at 250
+                }
+                .vectorize(Offset.VectorConverter)
 
         // Expected velocity is constant since we are interpolating linearly from 0,0 to 2,2
         val expectedVelocity = AnimationVector2D(4f, 4f)
@@ -215,12 +225,14 @@
 
     @Test
     fun testDelay() {
-        val animation = keyframesWithSpline {
-            durationMillis = 500
-            delayMillis = 100
+        val animation =
+            keyframesWithSpline {
+                    durationMillis = 500
+                    delayMillis = 100
 
-            Offset(1f, 1f) at 250
-        }.vectorize(Offset.VectorConverter)
+                    Offset(1f, 1f) at 250
+                }
+                .vectorize(Offset.VectorConverter)
 
         // Value should always be the initial value during the delay
         assertEquals(AnimationVector2D(0f, 0f), animation.valueAt(0L, start = Offset.Zero))
@@ -273,12 +285,13 @@
         // Test different keyframe declaration order
         assertNotEquals(animationA, animationB)
 
-        val config = KeyframesWithSplineSpec.KeyframesWithSplineSpecConfig<Offset>().apply {
-            durationMillis = 200
+        val config =
+            KeyframesWithSplineSpec.KeyframesWithSplineSpecConfig<Offset>().apply {
+                durationMillis = 200
 
-            Offset(1f, 1f) at 100
-            Offset(2f, 2f) at 200
-        }
+                Offset(1f, 1f) at 100
+                Offset(2f, 2f) at 200
+            }
 
         // Test re-declaring only config
         assertNotEquals(
diff --git a/compose/animation/animation-core/src/androidUnitTest/kotlin/androidx/compose/animation/core/MonoSplineTest.kt b/compose/animation/animation-core/src/androidUnitTest/kotlin/androidx/compose/animation/core/MonoSplineTest.kt
index 96a3ea0..65d9e6f 100644
--- a/compose/animation/animation-core/src/androidUnitTest/kotlin/androidx/compose/animation/core/MonoSplineTest.kt
+++ b/compose/animation/animation-core/src/androidUnitTest/kotlin/androidx/compose/animation/core/MonoSplineTest.kt
@@ -28,9 +28,7 @@
     @Test
     fun testCurveFit01() {
         val points = arrayOf(floatArrayOf(0f, 0f), floatArrayOf(1f, 1f), floatArrayOf(2f, 0f))
-        val time = floatArrayOf(
-            0f, 5f, 10f
-        )
+        val time = floatArrayOf(0f, 5f, 10f)
         val spline = MonoSpline(time, points, Float.NaN)
         var value = spline.getPos(5f, 0).toDouble()
         assertEquals(1.0, value, 0.001)
@@ -42,17 +40,16 @@
 
     @Test
     fun testMonoSpline() {
-        val points = arrayOf(
-            floatArrayOf(0f, 0f),
-            floatArrayOf(1f, 1f),
-            floatArrayOf(1f, 0f),
-            floatArrayOf(2f, 0f),
-            floatArrayOf(2f, 0f),
-            floatArrayOf(3f, 0f)
-        )
-        val time = floatArrayOf(
-            0f, 1f, 2f, 3f, 4f, 5f
-        )
+        val points =
+            arrayOf(
+                floatArrayOf(0f, 0f),
+                floatArrayOf(1f, 1f),
+                floatArrayOf(1f, 0f),
+                floatArrayOf(2f, 0f),
+                floatArrayOf(2f, 0f),
+                floatArrayOf(3f, 0f)
+            )
+        val time = floatArrayOf(0f, 1f, 2f, 3f, 4f, 5f)
         val mspline = MonoSpline(time, points, Float.NaN)
         assertEquals(1.0f, mspline.getPos(1f, 0), 0.001f)
         assertEquals(1.0f, mspline.getPos(1.1f, 0), 0.001f)
@@ -61,7 +58,8 @@
         assertEquals(1.0f, mspline.getPos(1.9f, 0), 0.001f)
         assertEquals(2.0f, mspline.getPos(3.5f, 0), 0.001f)
         val s = plotMonoSpline(mspline, 0, 0f, 5f)
-        val expect = """
+        val expect =
+            """
                 |***                                                         | 0.0
                 |   **                                                       |
                 |     **                                                     |
@@ -78,7 +76,8 @@
                 |                                                         ** |
                 |                                                           *| 3.0
                 0.0                                                        5.0
-                """.trimIndent()
+                """
+                .trimIndent()
         assertEquals(expect, s)
     }
 
@@ -131,17 +130,19 @@
             c[if (flip) dimy - yp - 1 else yp][xp] = '*'
         }
         for (i in c.indices) {
-            var v: Float = if (flip) {
-                (minY - maxY) * (i / (c.size - 1.0f)) + maxY
-            } else {
-                (maxY - minY) * (i / (c.size - 1.0f)) + minY
-            }
+            var v: Float =
+                if (flip) {
+                    (minY - maxY) * (i / (c.size - 1.0f)) + maxY
+                } else {
+                    (maxY - minY) * (i / (c.size - 1.0f)) + minY
+                }
             v = (v * 1000 + 0.5).toInt() / 1000f
-            ret += if (i % 5 == 0 || i == c.size - 1) {
-                "|" + String(c[i]) + "| " + v + "\n"
-            } else {
-                "|" + String(c[i]) + "|\n"
-            }
+            ret +=
+                if (i % 5 == 0 || i == c.size - 1) {
+                    "|" + String(c[i]) + "| " + v + "\n"
+                } else {
+                    "|" + String(c[i]) + "|\n"
+                }
         }
         val minStr = ((minX * 1000 + 0.5).toInt() / 1000f).toString()
         val maxStr = ((maxX * 1000 + 0.5).toInt() / 1000f).toString()
diff --git a/compose/animation/animation-core/src/androidUnitTest/kotlin/androidx/compose/animation/core/PhysicsAnimationTest.kt b/compose/animation/animation-core/src/androidUnitTest/kotlin/androidx/compose/animation/core/PhysicsAnimationTest.kt
index a3afb74..6adbe32 100644
--- a/compose/animation/animation-core/src/androidUnitTest/kotlin/androidx/compose/animation/core/PhysicsAnimationTest.kt
+++ b/compose/animation/animation-core/src/androidUnitTest/kotlin/androidx/compose/animation/core/PhysicsAnimationTest.kt
@@ -46,14 +46,16 @@
         val start = 200
         val end = 500
         val playTime = 150L
-        val animation = TargetBasedAnimation(
-            spring(), Int.VectorConverter, start, end, 0
-        )
+        val animation = TargetBasedAnimation(spring(), Int.VectorConverter, start, end, 0)
 
         val velocity = animation.getVelocityFromMillis(playTime)
 
-        val expectedVelocity = FloatSpringSpec().toSpring(end)
-            .updateValues(start.toFloat(), 0f, playTime).velocity.toInt()
+        val expectedVelocity =
+            FloatSpringSpec()
+                .toSpring(end)
+                .updateValues(start.toFloat(), 0f, playTime)
+                .velocity
+                .toInt()
         assertThat(velocity).isEqualTo(expectedVelocity)
     }
 
@@ -65,9 +67,7 @@
         val end1 = 500f
         val interruptionTime = 150L
 
-        val animation = TargetBasedAnimation(
-            spring(), Float.VectorConverter, start1, end1, 0f
-        )
+        val animation = TargetBasedAnimation(spring(), Float.VectorConverter, start1, end1, 0f)
 
         val interruptionValue = animation.getValueFromMillis(interruptionTime)
         val interruptionVelocity = animation.getVelocityFromMillis(interruptionTime)
@@ -78,19 +78,15 @@
         val end2 = interruptionValue
         val startVelocity2 = interruptionVelocity
 
-        val animation2 = TargetBasedAnimation(
-            spring(), Float.VectorConverter, start2, end2, startVelocity2
-        )
+        val animation2 =
+            TargetBasedAnimation(spring(), Float.VectorConverter, start2, end2, startVelocity2)
         // let's verify values after 15 ms of the second animation
         val playTime = 15L
         val resultValue = animation2.getValueFromMillis(playTime)
         val resultVelocity = animation2.getVelocityFromMillis(playTime)
 
-        val motion = FloatSpringSpec().toSpring(end2).updateValues(
-            start2,
-            interruptionVelocity,
-            playTime
-        )
+        val motion =
+            FloatSpringSpec().toSpring(end2).updateValues(start2, interruptionVelocity, playTime)
         val expectedValue = motion.value
         val expectedVelocity = motion.velocity
 
@@ -106,18 +102,16 @@
         val stiffness = 100f
         val delta = 1.0
 
-        val criticalSpec = FloatSpringSpec(
-            dampingRatio = 1f,
-            stiffness = stiffness,
-            visibilityThreshold = 1f
-        )
-        val criticalWrapper = TargetBasedAnimation(
-            criticalSpec,
-            initialValue = startValue,
-            targetValue = endValue,
-            initialVelocity = startVelocity,
-            typeConverter = Float.VectorConverter
-        )
+        val criticalSpec =
+            FloatSpringSpec(dampingRatio = 1f, stiffness = stiffness, visibilityThreshold = 1f)
+        val criticalWrapper =
+            TargetBasedAnimation(
+                criticalSpec,
+                initialValue = startValue,
+                targetValue = endValue,
+                initialVelocity = startVelocity,
+                typeConverter = Float.VectorConverter
+            )
 
         assertEquals(
             estimateAnimationDurationMillis(
@@ -139,18 +133,16 @@
         val stiffness = 100f
         val delta = 1.0
 
-        val overSpec = FloatSpringSpec(
-            dampingRatio = 5f,
-            stiffness = stiffness,
-            visibilityThreshold = 1f
-        )
-        val overWrapper = TargetBasedAnimation(
-            overSpec,
-            initialValue = startValue,
-            targetValue = endValue,
-            initialVelocity = startVelocity,
-            typeConverter = Float.VectorConverter
-        )
+        val overSpec =
+            FloatSpringSpec(dampingRatio = 5f, stiffness = stiffness, visibilityThreshold = 1f)
+        val overWrapper =
+            TargetBasedAnimation(
+                overSpec,
+                initialValue = startValue,
+                targetValue = endValue,
+                initialVelocity = startVelocity,
+                typeConverter = Float.VectorConverter
+            )
 
         assertEquals(
             estimateAnimationDurationMillis(
@@ -172,18 +164,16 @@
         val stiffness = 100f
         val delta = 1.0
 
-        val underSpec = FloatSpringSpec(
-            dampingRatio = 0.5f,
-            stiffness = stiffness,
-            visibilityThreshold = 1f
-        )
-        val underWrapper = TargetBasedAnimation(
-            underSpec,
-            initialValue = startValue,
-            targetValue = endValue,
-            initialVelocity = startVelocity,
-            typeConverter = Float.VectorConverter
-        )
+        val underSpec =
+            FloatSpringSpec(dampingRatio = 0.5f, stiffness = stiffness, visibilityThreshold = 1f)
+        val underWrapper =
+            TargetBasedAnimation(
+                underSpec,
+                initialValue = startValue,
+                targetValue = endValue,
+                initialVelocity = startVelocity,
+                typeConverter = Float.VectorConverter
+            )
 
         assertEquals(
             estimateAnimationDurationMillis(
@@ -199,13 +189,7 @@
 
     @Test
     fun testEndSnapping() {
-        TargetBasedAnimation(
-            spring(),
-            Float.VectorConverter,
-            0f,
-            100f,
-            0f
-        ).also { animation ->
+        TargetBasedAnimation(spring(), Float.VectorConverter, 0f, 100f, 0f).also { animation ->
             assertEquals(0f, animation.getVelocityVectorFromMillis(animation.durationMillis).value)
             assertEquals(100f, animation.getValueFromMillis(animation.durationMillis))
         }
@@ -217,26 +201,22 @@
 
         val converter =
             TwoWayConverter<ClassToAnimate, AnimationVector3D>(
-                convertToVector = { it ->
-                    AnimationVector(it.one, it.two, it.three)
-                },
-                convertFromVector = { it ->
-                    ClassToAnimate(it.v1, it.v2, it.v3)
-                }
+                convertToVector = { it -> AnimationVector(it.one, it.two, it.three) },
+                convertFromVector = { it -> ClassToAnimate(it.v1, it.v2, it.v3) }
             )
-        val springVectorAnimation = VectorizedSpringSpec(
-            visibilityThreshold = converter.convertToVector(ClassToAnimate(1f, 2f, 3f))
-        )
+        val springVectorAnimation =
+            VectorizedSpringSpec(
+                visibilityThreshold = converter.convertToVector(ClassToAnimate(1f, 2f, 3f))
+            )
         val floatAnimation = FloatSpringSpec(visibilityThreshold = 1f)
 
-        val springVectorDuration = springVectorAnimation.getDurationMillis(
-            AnimationVector(100f, 100f, 100f),
-            AnimationVector(0f, 0f, 0f),
-            AnimationVector(0f, 0f, 0f)
-        )
-        val floatAnimationDuration = floatAnimation.getDurationMillis(
-            100f, 0f, 0f
-        )
+        val springVectorDuration =
+            springVectorAnimation.getDurationMillis(
+                AnimationVector(100f, 100f, 100f),
+                AnimationVector(0f, 0f, 0f),
+                AnimationVector(0f, 0f, 0f)
+            )
+        val floatAnimationDuration = floatAnimation.getDurationMillis(100f, 0f, 0f)
 
         // Vector duration should be the longest of all the sub animations
         // In this case it should be the one with the lowest threshold.
@@ -249,51 +229,53 @@
 
         val converter =
             TwoWayConverter<ClassToAnimate, AnimationVector3D>(
-                convertToVector = { it ->
-                    AnimationVector(it.one, it.two, it.three)
-                },
-                convertFromVector = { it ->
-                    ClassToAnimate(it.v1, it.v2, it.v3)
-                }
+                convertToVector = { it -> AnimationVector(it.one, it.two, it.three) },
+                convertFromVector = { it -> ClassToAnimate(it.v1, it.v2, it.v3) }
             )
-        val springVectorAnimation = VectorizedSpringSpec(
-            visibilityThreshold = converter.convertToVector(ClassToAnimate(1f, 2f, 3f))
-        )
+        val springVectorAnimation =
+            VectorizedSpringSpec(
+                visibilityThreshold = converter.convertToVector(ClassToAnimate(1f, 2f, 3f))
+            )
         val floatAnimation1 = VectorizedSpringSpec(visibilityThreshold = AnimationVector(1f))
         val floatAnimation2 = VectorizedSpringSpec(visibilityThreshold = AnimationVector(2f))
         val floatAnimation3 = VectorizedSpringSpec(visibilityThreshold = AnimationVector(3f))
 
-        val duration = springVectorAnimation.getDurationMillis(
-            AnimationVector(100f, 100f, 100f),
-            AnimationVector(0f, 0f, 0f),
-            AnimationVector(0f, 0f, 0f)
-        )
-
-        for (time in 0L until duration) {
-            val springVector = springVectorAnimation.getValueFromMillis(
-                time,
+        val duration =
+            springVectorAnimation.getDurationMillis(
                 AnimationVector(100f, 100f, 100f),
                 AnimationVector(0f, 0f, 0f),
                 AnimationVector(0f, 0f, 0f)
             )
-            val float1 = floatAnimation1.getValueFromMillis(
-                time,
-                AnimationVector(100f),
-                AnimationVector(0f),
-                AnimationVector(0f)
-            )
-            val float2 = floatAnimation2.getValueFromMillis(
-                time,
-                AnimationVector(100f),
-                AnimationVector(0f),
-                AnimationVector(0f)
-            )
-            val float3 = floatAnimation3.getValueFromMillis(
-                time,
-                AnimationVector(100f),
-                AnimationVector(0f),
-                AnimationVector(0f)
-            )
+
+        for (time in 0L until duration) {
+            val springVector =
+                springVectorAnimation.getValueFromMillis(
+                    time,
+                    AnimationVector(100f, 100f, 100f),
+                    AnimationVector(0f, 0f, 0f),
+                    AnimationVector(0f, 0f, 0f)
+                )
+            val float1 =
+                floatAnimation1.getValueFromMillis(
+                    time,
+                    AnimationVector(100f),
+                    AnimationVector(0f),
+                    AnimationVector(0f)
+                )
+            val float2 =
+                floatAnimation2.getValueFromMillis(
+                    time,
+                    AnimationVector(100f),
+                    AnimationVector(0f),
+                    AnimationVector(0f)
+                )
+            val float3 =
+                floatAnimation3.getValueFromMillis(
+                    time,
+                    AnimationVector(100f),
+                    AnimationVector(0f),
+                    AnimationVector(0f)
+                )
             assertEquals(float1.value, springVector.v1, epsilon)
             assertEquals(float2.value, springVector.v2, epsilon)
             assertEquals(float3.value, springVector.v3, epsilon)
@@ -306,11 +288,12 @@
         val target = AnimationVector1D(0f)
         val velocity = AnimationVector1D(0f)
 
-        val infiniteSpringAnimation = VectorizedSpringSpec(
-            dampingRatio = 0f,
-            stiffness = Spring.StiffnessMedium,
-            visibilityThreshold = AnimationVector1D(1f)
-        )
+        val infiniteSpringAnimation =
+            VectorizedSpringSpec(
+                dampingRatio = 0f,
+                stiffness = Spring.StiffnessMedium,
+                visibilityThreshold = AnimationVector1D(1f)
+            )
 
         val infiniteSpringDurationNanos =
             infiniteSpringAnimation.getDurationNanos(initial, target, velocity)
@@ -328,11 +311,13 @@
         assertEquals(1, infiniteSpringDurationNanos.sign)
 
         // A small but non-zero dampingRatio will also result in a long animation
-        val veryLongSpringAnimationDurationNanos = VectorizedSpringSpec(
-            dampingRatio = 0.001f,
-            stiffness = Spring.StiffnessMedium,
-            visibilityThreshold = AnimationVector1D(1f)
-        ).getDurationNanos(initial, target, velocity)
+        val veryLongSpringAnimationDurationNanos =
+            VectorizedSpringSpec(
+                    dampingRatio = 0.001f,
+                    stiffness = Spring.StiffnessMedium,
+                    visibilityThreshold = AnimationVector1D(1f)
+                )
+                .getDurationNanos(initial, target, velocity)
 
         // Make sure the value is bigger compared to an spring with a long animation
         assertTrue(infiniteSpringDurationNanos > veryLongSpringAnimationDurationNanos)
diff --git a/compose/animation/animation-core/src/androidUnitTest/kotlin/androidx/compose/animation/core/RepeatableAnimationTest.kt b/compose/animation/animation-core/src/androidUnitTest/kotlin/androidx/compose/animation/core/RepeatableAnimationTest.kt
index bb4d20b..4f29357 100644
--- a/compose/animation/animation-core/src/androidUnitTest/kotlin/androidx/compose/animation/core/RepeatableAnimationTest.kt
+++ b/compose/animation/animation-core/src/androidUnitTest/kotlin/androidx/compose/animation/core/RepeatableAnimationTest.kt
@@ -26,24 +26,21 @@
 @RunWith(JUnit4::class)
 class RepeatableAnimationTest {
 
-    private val DelayedAnimation = VectorizedTweenSpec<AnimationVector1D>(
-        delayMillis = DelayDuration,
-        durationMillis = Duration
-    )
+    private val DelayedAnimation =
+        VectorizedTweenSpec<AnimationVector1D>(
+            delayMillis = DelayDuration,
+            durationMillis = Duration
+        )
 
     @Test
     fun twoRepeatsValuesCalculation() {
-        val repeat = VectorizedRepeatableSpec(
-            iterations = 2,
-            animation = VectorizedTweenSpec<AnimationVector1D>(durationMillis = Duration)
-        )
+        val repeat =
+            VectorizedRepeatableSpec(
+                iterations = 2,
+                animation = VectorizedTweenSpec<AnimationVector1D>(durationMillis = Duration)
+            )
 
-        val animationWrapper = TargetBasedAnimation(
-            repeat,
-            Float.VectorConverter,
-            0f,
-            0f
-        )
+        val animationWrapper = TargetBasedAnimation(repeat, Float.VectorConverter, 0f, 0f)
 
         assertThat(repeat.at(0)).isEqualTo(0f)
         assertThat(repeat.at(Duration - 1)).isGreaterThan(0.9f)
@@ -57,36 +54,32 @@
     @Test
     fun testRepeatedAnimationDuration() {
         val iters = 5
-        val repeat = VectorizedRepeatableSpec<AnimationVector1D>(
-            iterations = iters,
-            animation = DelayedAnimation
-        )
+        val repeat =
+            VectorizedRepeatableSpec<AnimationVector1D>(
+                iterations = iters,
+                animation = DelayedAnimation
+            )
 
-        val duration = repeat.getDurationNanos(
-            AnimationVector1D(0f),
-            AnimationVector1D(0f),
-            AnimationVector1D(0f)
-        )
+        val duration =
+            repeat.getDurationNanos(
+                AnimationVector1D(0f),
+                AnimationVector1D(0f),
+                AnimationVector1D(0f)
+            )
 
         assertEquals((DelayDuration + Duration) * iters * MillisToNanos, duration)
     }
 
     @Test
     fun testRepeatModeReverse() {
-        val repeat = repeatable(
-            iterations = 9,
-            animation = TweenSpec<Float>(
-                durationMillis = 100, easing = LinearEasing
-            ),
-            repeatMode = RepeatMode.Reverse
-        )
+        val repeat =
+            repeatable(
+                iterations = 9,
+                animation = TweenSpec<Float>(durationMillis = 100, easing = LinearEasing),
+                repeatMode = RepeatMode.Reverse
+            )
 
-        val repeatAnim = TargetBasedAnimation(
-            repeat,
-            Float.VectorConverter,
-            0f,
-            100f
-        )
+        val repeatAnim = TargetBasedAnimation(repeat, Float.VectorConverter, 0f, 100f)
 
         for (playtime in 0..100L) {
             assertEquals(playtime.toFloat(), repeatAnim.getValueFromMillis(playtime), 0.01f)
@@ -105,55 +98,52 @@
 
     @Test
     fun testInfiniteRepeat() {
-        val repeatShortAnimation = infiniteRepeatable(
-            animation = TweenSpec<Float>(
-                durationMillis = 100, easing = LinearEasing
-            ),
-            repeatMode = RepeatMode.Reverse
-        )
+        val repeatShortAnimation =
+            infiniteRepeatable(
+                animation = TweenSpec<Float>(durationMillis = 100, easing = LinearEasing),
+                repeatMode = RepeatMode.Reverse
+            )
 
         val extraLongDurationNanos = 1000000000
-        val repeatLongAnimation = infiniteRepeatable(
-            animation = TweenSpec<Float>(
-                durationMillis = extraLongDurationNanos, easing = LinearEasing
-            ),
-            repeatMode = RepeatMode.Restart
-        )
+        val repeatLongAnimation =
+            infiniteRepeatable(
+                animation =
+                    TweenSpec<Float>(
+                        durationMillis = extraLongDurationNanos,
+                        easing = LinearEasing
+                    ),
+                repeatMode = RepeatMode.Restart
+            )
         val vectorizedInfiniteRepeatingShort = repeatShortAnimation.vectorize(Float.VectorConverter)
         val vectorizedInfiniteRepeatingLong = repeatLongAnimation.vectorize(Float.VectorConverter)
 
         assertEquals(
             Long.MAX_VALUE,
-            vectorizedInfiniteRepeatingShort
-                .getDurationNanos(
-                    AnimationVector(0f),
-                    AnimationVector(100f),
-                    AnimationVector(0f)
-                )
+            vectorizedInfiniteRepeatingShort.getDurationNanos(
+                AnimationVector(0f),
+                AnimationVector(100f),
+                AnimationVector(0f)
+            )
         )
 
         assertEquals(
             Long.MAX_VALUE,
-            vectorizedInfiniteRepeatingLong
-                .getDurationNanos(
-                    AnimationVector(0f),
-                    AnimationVector(100f),
-                    AnimationVector(0f)
-                )
+            vectorizedInfiniteRepeatingLong.getDurationNanos(
+                AnimationVector(0f),
+                AnimationVector(100f),
+                AnimationVector(0f)
+            )
         )
 
-        val repeatShort = TargetBasedAnimation(
-            repeatShortAnimation,
-            Float.VectorConverter,
-            0f,
-            100f
-        )
-        val repeatLong = TargetBasedAnimation(
-            repeatLongAnimation,
-            Float.VectorConverter,
-            0f,
-            extraLongDurationNanos.toFloat()
-        )
+        val repeatShort =
+            TargetBasedAnimation(repeatShortAnimation, Float.VectorConverter, 0f, 100f)
+        val repeatLong =
+            TargetBasedAnimation(
+                repeatLongAnimation,
+                Float.VectorConverter,
+                0f,
+                extraLongDurationNanos.toFloat()
+            )
 
         assertEquals(repeatShort.durationNanos, Long.MAX_VALUE)
         assertEquals(repeatLong.durationNanos, Long.MAX_VALUE)
@@ -178,38 +168,45 @@
         val duration = 600
         val offset = duration / 2
 
-        val repeatable = TargetBasedAnimation(
-            repeatable<Float>(5, tween(duration, easing = LinearEasing), RepeatMode.Restart),
-            Float.VectorConverter,
-            0f,
-            1000f
-        )
-        val delayedRepeatable = TargetBasedAnimation(
-            repeatable<Float>(
-                5,
-                tween(duration, easing = LinearEasing),
-                RepeatMode.Restart, StartOffset(offset)
-            ),
-            Float.VectorConverter,
-            0f,
-            1000f
-        )
-        val fastForwardedRepeatable = TargetBasedAnimation(
-            repeatable<Float>(
-                5,
-                tween(duration, easing = LinearEasing),
-                RepeatMode.Restart, StartOffset(offset, StartOffsetType.FastForward)
-            ),
-            Float.VectorConverter,
-            0f,
-            1000f
-        )
+        val repeatable =
+            TargetBasedAnimation(
+                repeatable<Float>(5, tween(duration, easing = LinearEasing), RepeatMode.Restart),
+                Float.VectorConverter,
+                0f,
+                1000f
+            )
+        val delayedRepeatable =
+            TargetBasedAnimation(
+                repeatable<Float>(
+                    5,
+                    tween(duration, easing = LinearEasing),
+                    RepeatMode.Restart,
+                    StartOffset(offset)
+                ),
+                Float.VectorConverter,
+                0f,
+                1000f
+            )
+        val fastForwardedRepeatable =
+            TargetBasedAnimation(
+                repeatable<Float>(
+                    5,
+                    tween(duration, easing = LinearEasing),
+                    RepeatMode.Restart,
+                    StartOffset(offset, StartOffsetType.FastForward)
+                ),
+                Float.VectorConverter,
+                0f,
+                1000f
+            )
 
         assertEquals(
-            repeatable.durationNanos, delayedRepeatable.durationNanos - offset * 1_000_000L
+            repeatable.durationNanos,
+            delayedRepeatable.durationNanos - offset * 1_000_000L
         )
         assertEquals(
-            repeatable.durationNanos, fastForwardedRepeatable.durationNanos + offset * 1_000_000L
+            repeatable.durationNanos,
+            fastForwardedRepeatable.durationNanos + offset * 1_000_000L
         )
 
         for (playtimeMillis in 0..duration * 3 step 17) {
@@ -240,27 +237,31 @@
         val duration = 600
         val offset = 31
 
-        val repeatable = TargetBasedAnimation(
-            infiniteRepeatable(tween(duration), RepeatMode.Restart),
-            Float.VectorConverter,
-            0f,
-            1000f
-        )
-        val delayedRepeatable = TargetBasedAnimation(
-            infiniteRepeatable(tween(duration), RepeatMode.Restart, StartOffset(offset)),
-            Float.VectorConverter,
-            0f,
-            1000f
-        )
-        val fastForwardedRepeatable = TargetBasedAnimation(
-            infiniteRepeatable(
-                tween(duration),
-                RepeatMode.Restart, StartOffset(offset, StartOffsetType.FastForward)
-            ),
-            Float.VectorConverter,
-            0f,
-            1000f
-        )
+        val repeatable =
+            TargetBasedAnimation(
+                infiniteRepeatable(tween(duration), RepeatMode.Restart),
+                Float.VectorConverter,
+                0f,
+                1000f
+            )
+        val delayedRepeatable =
+            TargetBasedAnimation(
+                infiniteRepeatable(tween(duration), RepeatMode.Restart, StartOffset(offset)),
+                Float.VectorConverter,
+                0f,
+                1000f
+            )
+        val fastForwardedRepeatable =
+            TargetBasedAnimation(
+                infiniteRepeatable(
+                    tween(duration),
+                    RepeatMode.Restart,
+                    StartOffset(offset, StartOffsetType.FastForward)
+                ),
+                Float.VectorConverter,
+                0f,
+                1000f
+            )
 
         // Duration should be infinite for delay or fast forward
         assertEquals(repeatable.durationNanos, delayedRepeatable.durationNanos)
diff --git a/compose/animation/animation-core/src/androidUnitTest/kotlin/androidx/compose/animation/core/SnapAnimationTest.kt b/compose/animation/animation-core/src/androidUnitTest/kotlin/androidx/compose/animation/core/SnapAnimationTest.kt
index 8c1102e..3ba3606 100644
--- a/compose/animation/animation-core/src/androidUnitTest/kotlin/androidx/compose/animation/core/SnapAnimationTest.kt
+++ b/compose/animation/animation-core/src/androidUnitTest/kotlin/androidx/compose/animation/core/SnapAnimationTest.kt
@@ -27,12 +27,7 @@
     @Test
     fun isFinishedAtTheBeginning() {
         val animation = VectorizedSnapSpec<AnimationVector1D>()
-        val animationWrapper = TargetBasedAnimation(
-            animation,
-            Float.VectorConverter,
-            0f,
-            0f
-        )
+        val animationWrapper = TargetBasedAnimation(animation, Float.VectorConverter, 0f, 0f)
 
         assertThat(animation.at(0)).isEqualTo(1f)
         assertThat(animationWrapper.isFinishedFromMillis(0)).isTrue()
diff --git a/compose/animation/animation-core/src/androidUnitTest/kotlin/androidx/compose/animation/core/SpringEstimationTest.kt b/compose/animation/animation-core/src/androidUnitTest/kotlin/androidx/compose/animation/core/SpringEstimationTest.kt
index 8cc46e2..0bdce2e 100644
--- a/compose/animation/animation-core/src/androidUnitTest/kotlin/androidx/compose/animation/core/SpringEstimationTest.kt
+++ b/compose/animation/animation-core/src/androidUnitTest/kotlin/androidx/compose/animation/core/SpringEstimationTest.kt
@@ -35,11 +35,13 @@
         @Parameterized.Parameters
         fun data(): List<Array<out Any>> {
             return mutableListOf<Array<out Any>>().apply {
-                (1..100 step 2).map { it * it }.forEach { m ->
-                    (1..1000 step 20).map { it * it }.forEach { k ->
-                        add(arrayOf(m.toDouble(), k.toDouble()))
+                (1..100 step 2)
+                    .map { it * it }
+                    .forEach { m ->
+                        (1..1000 step 20)
+                            .map { it * it }
+                            .forEach { k -> add(arrayOf(m.toDouble(), k.toDouble())) }
                     }
-                }
                 // Additional edge cases to test for
                 add(arrayOf(10_000.0, 1.0))
             }
@@ -57,9 +59,7 @@
         testCases.parallelStream().forEach {
             val res = runTestCase(it)
             if (!res.pass) {
-                synchronized(failedTestCaseResults) {
-                    failedTestCaseResults.add(res)
-                }
+                synchronized(failedTestCaseResults) { failedTestCaseResults.add(res) }
             }
         }
 
@@ -81,22 +81,24 @@
         springSimulation.dampingRatio = testCase.dampingRatio.toFloat()
         springSimulation.stiffness = testCase.stiffness.toFloat()
 
-        val endTime = estimateAnimationDurationMillis(
-            mass = testCase.mass,
-            springConstant = testCase.springConstant,
-            dampingCoefficient = testCase.dampingCoefficient,
-            initialDisplacement = testCase.initialDisplacement,
-            initialVelocity = testCase.initialVelocity,
-            delta = 1.0
-        )
+        val endTime =
+            estimateAnimationDurationMillis(
+                mass = testCase.mass,
+                springConstant = testCase.springConstant,
+                dampingCoefficient = testCase.dampingCoefficient,
+                initialDisplacement = testCase.initialDisplacement,
+                initialVelocity = testCase.initialVelocity,
+                delta = 1.0
+            )
 
-        val alternateEndTime = estimateAnimationDurationMillis(
-            stiffness = testCase.stiffness,
-            dampingRatio = testCase.dampingRatio,
-            initialDisplacement = testCase.initialDisplacement,
-            initialVelocity = testCase.initialVelocity,
-            delta = 1.0
-        )
+        val alternateEndTime =
+            estimateAnimationDurationMillis(
+                stiffness = testCase.stiffness,
+                dampingRatio = testCase.dampingRatio,
+                initialDisplacement = testCase.initialDisplacement,
+                initialVelocity = testCase.initialVelocity,
+                delta = 1.0
+            )
 
         // Test that the alternate implementation gives the same answer within 1ms.
         if (abs(endTime - alternateEndTime) > 1) {
@@ -107,47 +109,46 @@
             )
         }
 
-        if (endTime == Long.MAX_VALUE)
-            return TestCaseResult(false, testCase, "End time +infinity")
+        if (endTime == Long.MAX_VALUE) return TestCaseResult(false, testCase, "End time +infinity")
 
-        val simTwoFramesAfter = springSimulation.updateValues(
-            lastDisplacement = testCase.initialDisplacement.toFloat(),
-            lastVelocity = testCase.initialVelocity.toFloat(),
-            timeElapsed = endTime + TwoFrames60fpsMillis
-        )
-        val simTwoFramesBefore = springSimulation.updateValues(
-            lastDisplacement = testCase.initialDisplacement.toFloat(),
-            lastVelocity = testCase.initialVelocity.toFloat(),
-            timeElapsed = max(endTime - TwoFrames60fpsMillis, 0L)
-        )
-        val simAtTime = springSimulation.updateValues(
-            lastDisplacement = testCase.initialDisplacement.toFloat(),
-            lastVelocity = testCase.initialVelocity.toFloat(),
-            timeElapsed = endTime
-        )
+        val simTwoFramesAfter =
+            springSimulation.updateValues(
+                lastDisplacement = testCase.initialDisplacement.toFloat(),
+                lastVelocity = testCase.initialVelocity.toFloat(),
+                timeElapsed = endTime + TwoFrames60fpsMillis
+            )
+        val simTwoFramesBefore =
+            springSimulation.updateValues(
+                lastDisplacement = testCase.initialDisplacement.toFloat(),
+                lastVelocity = testCase.initialVelocity.toFloat(),
+                timeElapsed = max(endTime - TwoFrames60fpsMillis, 0L)
+            )
+        val simAtTime =
+            springSimulation.updateValues(
+                lastDisplacement = testCase.initialDisplacement.toFloat(),
+                lastVelocity = testCase.initialVelocity.toFloat(),
+                timeElapsed = endTime
+            )
 
-        val pass = if (testCase.dampingRatio >= 1.0) {
-            // The primary success criterion is that two frames before the settling time, the
-            // function x(t) is greater than the threshold and two frames after.
+        val pass =
+            if (testCase.dampingRatio >= 1.0) {
+                // The primary success criterion is that two frames before the settling time, the
+                // function x(t) is greater than the threshold and two frames after.
 
-            // A secondary criterion is added to account for scenarios where the settling time is
-            // close to the inflection point in over/critically-damped cases, and therefore the
-            // before and after times are both below the threshold.
-            (
-                (
-                    abs(simTwoFramesBefore.value) >= 0.999 &&
-                        abs(simTwoFramesAfter.value) <= 1.001
-                    ) || (
-                    abs(simAtTime.value) >= 0.999 &&
+                // A secondary criterion is added to account for scenarios where the settling time
+                // is
+                // close to the inflection point in over/critically-damped cases, and therefore the
+                // before and after times are both below the threshold.
+                ((abs(simTwoFramesBefore.value) >= 0.999 &&
+                    abs(simTwoFramesAfter.value) <= 1.001) ||
+                    (abs(simAtTime.value) >= 0.999 &&
                         abs(simTwoFramesBefore.value) < abs(simAtTime.value) &&
-                        abs(simTwoFramesAfter.value) < abs(simAtTime.value)
-                    )
-                )
-        } else {
-            // In the under-damped scenario, x(t) varies heavily due to oscillations, therefore
-            // the over/critically damped conditions may fail erroneously.
-            abs(simTwoFramesAfter.value) < 1.00
-        }
+                        abs(simTwoFramesAfter.value) < abs(simAtTime.value)))
+            } else {
+                // In the under-damped scenario, x(t) varies heavily due to oscillations, therefore
+                // the over/critically damped conditions may fail erroneously.
+                abs(simTwoFramesAfter.value) < 1.00
+            }
 
         return TestCaseResult(pass, testCase)
     }
@@ -160,18 +161,15 @@
             for (v0 in -200_000..200_000 step 100_000) {
                 for (p0 in -10_000..10_000 step 100) {
                     if (!(v0 == 0 && p0 == 0)) {
-                        val testCase = TestCase(
-                            mass = m,
-                            springConstant = k,
-                            dampingCoefficient = c.toDouble(),
-                            initialVelocity = v0.toDouble(),
-                            initialDisplacement = p0.toDouble()
-                        )
-                        synchronized(testCases) {
-                            testCases.add(
-                                testCase
+                        val testCase =
+                            TestCase(
+                                mass = m,
+                                springConstant = k,
+                                dampingCoefficient = c.toDouble(),
+                                initialVelocity = v0.toDouble(),
+                                initialDisplacement = p0.toDouble()
                             )
-                        }
+                        synchronized(testCases) { testCases.add(testCase) }
                     }
                 }
             }
@@ -185,19 +183,16 @@
         for (v0 in -200_000..200_000 step 10_000) {
             for (p0 in -10_000..10_000 step 100) {
                 if (!(v0 == 0 && p0 == 0)) {
-                    val testCase = TestCase(
-                        mass = m,
-                        springConstant = k,
-                        dampingCoefficient = c,
-                        initialVelocity = v0.toDouble(),
-                        initialDisplacement = p0.toDouble()
-                    )
-
-                    synchronized(testCases) {
-                        testCases.add(
-                            testCase
+                    val testCase =
+                        TestCase(
+                            mass = m,
+                            springConstant = k,
+                            dampingCoefficient = c,
+                            initialVelocity = v0.toDouble(),
+                            initialDisplacement = p0.toDouble()
                         )
-                    }
+
+                    synchronized(testCases) { testCases.add(testCase) }
                 }
             }
         }
@@ -216,6 +211,7 @@
                 val criticalDamping = 2.0 * sqrt(springConstant * mass)
                 return dampingCoefficient / criticalDamping
             }
+
         val stiffness: Double
             get() {
                 return springConstant / mass
diff --git a/compose/animation/animation-core/src/androidUnitTest/kotlin/androidx/compose/animation/core/SuspendAnimationTest.kt b/compose/animation/animation-core/src/androidUnitTest/kotlin/androidx/compose/animation/core/SuspendAnimationTest.kt
index 55d263b..b038c33 100644
--- a/compose/animation/animation-core/src/androidUnitTest/kotlin/androidx/compose/animation/core/SuspendAnimationTest.kt
+++ b/compose/animation/animation-core/src/androidUnitTest/kotlin/androidx/compose/animation/core/SuspendAnimationTest.kt
@@ -31,92 +31,87 @@
 @RunWith(JUnit4::class)
 class SuspendAnimationTest {
     @Test
-    fun animateFloatVariantTest() =
-        runBlocking {
-            val anim = TargetBasedAnimation(
-                spring(dampingRatio = Spring.DampingRatioMediumBouncy), Float.VectorConverter,
-                initialValue = 0f, targetValue = 1f
+    fun animateFloatVariantTest() = runBlocking {
+        val anim =
+            TargetBasedAnimation(
+                spring(dampingRatio = Spring.DampingRatioMediumBouncy),
+                Float.VectorConverter,
+                initialValue = 0f,
+                targetValue = 1f
             )
-            val clock = TestFrameClock()
-            val interval = 50
-            withContext(clock) {
-                // Put in a bunch of frames 50 milliseconds apart
-                for (frameTimeMillis in 0..5000 step interval) {
-                    clock.frame(frameTimeMillis * 1_000_000L)
-                }
-                var playTimeMillis = 0L
-                animate(
-                    0f, 1f, 0f,
-                    spring(dampingRatio = Spring.DampingRatioMediumBouncy)
-                ) { value, velocity ->
-                    assertEquals(anim.getValueFromMillis(playTimeMillis), value, 0.001f)
-                    assertEquals(anim.getVelocityFromMillis(playTimeMillis), velocity, 0.001f)
-                    playTimeMillis += interval
-                }
+        val clock = TestFrameClock()
+        val interval = 50
+        withContext(clock) {
+            // Put in a bunch of frames 50 milliseconds apart
+            for (frameTimeMillis in 0..5000 step interval) {
+                clock.frame(frameTimeMillis * 1_000_000L)
+            }
+            var playTimeMillis = 0L
+            animate(0f, 1f, 0f, spring(dampingRatio = Spring.DampingRatioMediumBouncy)) {
+                value,
+                velocity ->
+                assertEquals(anim.getValueFromMillis(playTimeMillis), value, 0.001f)
+                assertEquals(anim.getVelocityFromMillis(playTimeMillis), velocity, 0.001f)
+                playTimeMillis += interval
             }
         }
+    }
 
     @Test
-    fun animateGenericsVariantTest() =
-        runBlocking {
-            val from = Offset(666f, 321f)
-            val to = Offset(919f, 864f)
-            val offsetToVector: TwoWayConverter<Offset, AnimationVector2D> =
-                TwoWayConverter(
-                    convertToVector = { AnimationVector2D(it.x, it.y) },
-                    convertFromVector = { Offset(it.v1, it.v2) }
-                )
-            val anim = TargetBasedAnimation(
-                tween(500), offsetToVector, initialValue = from, targetValue = to
+    fun animateGenericsVariantTest() = runBlocking {
+        val from = Offset(666f, 321f)
+        val to = Offset(919f, 864f)
+        val offsetToVector: TwoWayConverter<Offset, AnimationVector2D> =
+            TwoWayConverter(
+                convertToVector = { AnimationVector2D(it.x, it.y) },
+                convertFromVector = { Offset(it.v1, it.v2) }
             )
-            val clock = TestFrameClock()
-            val interval = 50
-            withContext(clock) {
-                // Put in a bunch of frames 50 milliseconds apart
-                for (frameTimeMillis in 0..500 step interval) {
-                    clock.frame(frameTimeMillis * 1_000_000L)
-                }
-                var playTimeMillis = 0L
-                animate(
-                    offsetToVector,
-                    from, to,
-                    animationSpec = tween(500)
-                ) { value, _ ->
-                    val expectedValue = anim.getValueFromMillis(playTimeMillis)
-                    assertEquals(expectedValue.x, value.x, 0.001f)
-                    assertEquals(expectedValue.y, value.y, 0.001f)
-                    playTimeMillis += interval
-                }
+        val anim =
+            TargetBasedAnimation(tween(500), offsetToVector, initialValue = from, targetValue = to)
+        val clock = TestFrameClock()
+        val interval = 50
+        withContext(clock) {
+            // Put in a bunch of frames 50 milliseconds apart
+            for (frameTimeMillis in 0..500 step interval) {
+                clock.frame(frameTimeMillis * 1_000_000L)
+            }
+            var playTimeMillis = 0L
+            animate(offsetToVector, from, to, animationSpec = tween(500)) { value, _ ->
+                val expectedValue = anim.getValueFromMillis(playTimeMillis)
+                assertEquals(expectedValue.x, value.x, 0.001f)
+                assertEquals(expectedValue.y, value.y, 0.001f)
+                playTimeMillis += interval
             }
         }
+    }
 
     @Test
-    fun animateDecayTest() =
-        runBlocking {
-            val from = 666f
-            val velocity = 999f
-            val anim = DecayAnimation(
+    fun animateDecayTest() = runBlocking {
+        val from = 666f
+        val velocity = 999f
+        val anim =
+            DecayAnimation(
                 FloatExponentialDecaySpec(),
-                initialValue = from, initialVelocity = velocity
+                initialValue = from,
+                initialVelocity = velocity
             )
-            val clock = TestFrameClock()
-            val interval = 50
-            withContext(clock) {
-                // Put in a bunch of frames 50 milliseconds apart
-                for (frameTimeMillis in 0..5000 step interval) {
-                    clock.frame(frameTimeMillis * 1_000_000L)
-                }
-                var playTimeMillis = 0L
-                animateDecay(
-                    from, velocity,
-                    animationSpec = FloatExponentialDecaySpec()
-                ) { value, velocity ->
-                    assertEquals(anim.getValueFromMillis(playTimeMillis), value, 0.001f)
-                    assertEquals(anim.getVelocityFromMillis(playTimeMillis), velocity, 0.001f)
-                    playTimeMillis += interval
-                }
+        val clock = TestFrameClock()
+        val interval = 50
+        withContext(clock) {
+            // Put in a bunch of frames 50 milliseconds apart
+            for (frameTimeMillis in 0..5000 step interval) {
+                clock.frame(frameTimeMillis * 1_000_000L)
+            }
+            var playTimeMillis = 0L
+            animateDecay(from, velocity, animationSpec = FloatExponentialDecaySpec()) {
+                value,
+                velocity ->
+                assertEquals(anim.getValueFromMillis(playTimeMillis), value, 0.001f)
+                assertEquals(anim.getVelocityFromMillis(playTimeMillis), velocity, 0.001f)
+                playTimeMillis += interval
             }
         }
+    }
 
     @Test
     fun animateToTest() {
@@ -128,16 +123,21 @@
                     convertToVector = { AnimationVector2D(it.x, it.y) },
                     convertFromVector = { Offset(it.v1, it.v2) }
                 )
-            val anim = TargetBasedAnimation(
-                tween(500), offsetToVector, initialValue = from, targetValue = to
-            )
+            val anim =
+                TargetBasedAnimation(
+                    tween(500),
+                    offsetToVector,
+                    initialValue = from,
+                    targetValue = to
+                )
             val clock = TestFrameClock()
             val interval = 50
-            val animationState = AnimationState(
-                initialValue = from,
-                typeConverter = offsetToVector,
-                lastFrameTimeNanos = 0
-            )
+            val animationState =
+                AnimationState(
+                    initialValue = from,
+                    typeConverter = offsetToVector,
+                    lastFrameTimeNanos = 0
+                )
             withContext(clock) {
                 // Put in a bunch of frames 50 milliseconds apart
                 for (frameTimeMillis in 100..1000 step interval) {
@@ -179,34 +179,33 @@
     }
 
     @Test
-    fun animateDecayOnAnimationStateTest() =
-        runBlocking {
-            val from = 9f
-            val initialVelocity = 20f
-            val anim = DecayAnimation(
+    fun animateDecayOnAnimationStateTest() = runBlocking {
+        val from = 9f
+        val initialVelocity = 20f
+        val anim =
+            DecayAnimation(
                 FloatExponentialDecaySpec(),
-                initialValue = from, initialVelocity = initialVelocity
+                initialValue = from,
+                initialVelocity = initialVelocity
             )
-            val clock = TestFrameClock()
-            val interval = 50
-            withContext(clock) {
-                // Put in a bunch of frames 50 milliseconds apart
-                for (frameTimeMillis in 0..5000 step interval) {
-                    clock.frame(frameTimeMillis * 1_000_000L)
-                }
-                var playTimeMillis = 0L
-                val state = AnimationState(9f, 20f)
-                state.animateDecay(
-                    FloatExponentialDecaySpec().generateDecayAnimationSpec()
-                ) {
-                    assertEquals(anim.getValueFromMillis(playTimeMillis), value, 0.001f)
-                    assertEquals(anim.getVelocityFromMillis(playTimeMillis), velocity, 0.001f)
-                    playTimeMillis += interval
-                    assertEquals(value, state.value, 0.0001f)
-                    assertEquals(velocity, state.velocity, 0.0001f)
-                }
+        val clock = TestFrameClock()
+        val interval = 50
+        withContext(clock) {
+            // Put in a bunch of frames 50 milliseconds apart
+            for (frameTimeMillis in 0..5000 step interval) {
+                clock.frame(frameTimeMillis * 1_000_000L)
+            }
+            var playTimeMillis = 0L
+            val state = AnimationState(9f, 20f)
+            state.animateDecay(FloatExponentialDecaySpec().generateDecayAnimationSpec()) {
+                assertEquals(anim.getValueFromMillis(playTimeMillis), value, 0.001f)
+                assertEquals(anim.getVelocityFromMillis(playTimeMillis), velocity, 0.001f)
+                playTimeMillis += interval
+                assertEquals(value, state.value, 0.0001f)
+                assertEquals(velocity, state.velocity, 0.0001f)
             }
         }
+    }
 
     internal class TestFrameClock : MonotonicFrameClock {
         // Make the send non-blocking
diff --git a/compose/animation/animation-core/src/androidUnitTest/kotlin/androidx/compose/animation/core/TweenAnimationTest.kt b/compose/animation/animation-core/src/androidUnitTest/kotlin/androidx/compose/animation/core/TweenAnimationTest.kt
index a1666cb..42c9d1e 100644
--- a/compose/animation/animation-core/src/androidUnitTest/kotlin/androidx/compose/animation/core/TweenAnimationTest.kt
+++ b/compose/animation/animation-core/src/androidUnitTest/kotlin/androidx/compose/animation/core/TweenAnimationTest.kt
@@ -31,11 +31,12 @@
         val start = AnimationVector1D(0f)
         val end = AnimationVector1D(1000f)
 
-        val animation = VectorizedTweenSpec<AnimationVector1D>(
-            delayMillis = 100,
-            durationMillis = testDuration,
-            easing = LinearEasing
-        )
+        val animation =
+            VectorizedTweenSpec<AnimationVector1D>(
+                delayMillis = 100,
+                durationMillis = testDuration,
+                easing = LinearEasing
+            )
 
         fun atPlaytime(playTime: Long) =
             animation.getValueFromMillis(playTime, start, end, AnimationVector1D(0f)).value
@@ -50,10 +51,11 @@
     fun easingIsApplied() {
         val totalDuration = 300
         val accelerateEasing: Easing = Easing { fraction -> fraction * 2f }
-        val animation = VectorizedTweenSpec<AnimationVector1D>(
-            durationMillis = totalDuration,
-            easing = accelerateEasing
-        )
+        val animation =
+            VectorizedTweenSpec<AnimationVector1D>(
+                durationMillis = totalDuration,
+                easing = accelerateEasing
+            )
 
         val fraction = 0.3f
         val value = animation.at((totalDuration * fraction).toLong())
@@ -65,9 +67,7 @@
     fun endValueCalculatedForPlaytimeOverDuration() {
         val testDuration = 200
 
-        val animation = VectorizedTweenSpec<AnimationVector1D>(
-            durationMillis = testDuration
-        )
+        val animation = VectorizedTweenSpec<AnimationVector1D>(durationMillis = testDuration)
 
         assertThat(animation.at(testDuration + 10L)).isEqualTo(1f)
     }
diff --git a/compose/animation/animation-core/src/commonMain/kotlin/androidx/compose/animation/core/Animatable.kt b/compose/animation/animation-core/src/commonMain/kotlin/androidx/compose/animation/core/Animatable.kt
index 003f91b..9e7a5c7 100644
--- a/compose/animation/animation-core/src/commonMain/kotlin/androidx/compose/animation/core/Animatable.kt
+++ b/compose/animation/animation-core/src/commonMain/kotlin/androidx/compose/animation/core/Animatable.kt
@@ -25,9 +25,9 @@
 import kotlinx.coroutines.CancellationException
 
 /**
- * [Animatable] is a value holder that automatically animates its value when the value is
- * changed via [animateTo]. If [animateTo] is invoked during an ongoing value change animation,
- * a new animation will transition [Animatable] from its current value (i.e. value at the point of
+ * [Animatable] is a value holder that automatically animates its value when the value is changed
+ * via [animateTo]. If [animateTo] is invoked during an ongoing value change animation, a new
+ * animation will transition [Animatable] from its current value (i.e. value at the point of
  * interruption) to the new [targetValue]. This ensures that the value change is __always__
  * continuous using [animateTo]. If a [spring] animation (e.g. default animation) is used with
  * [animateTo], the velocity change will guarantee to be continuous as well.
@@ -40,11 +40,9 @@
  *
  * @param initialValue initial value of the animatable value holder
  * @param typeConverter A two-way converter that converts the given type [T] from and to
- *                      [AnimationVector]
+ *   [AnimationVector]
  * @param visibilityThreshold Threshold at which the animation may round off to its target value.
- *
  * @param label An optional label for differentiating this animation from others in android studio.
- *
  * @see animateTo
  * @see animateDecay
  */
@@ -58,9 +56,10 @@
 
     @Deprecated(
         "Maintained for binary compatibility",
-        replaceWith = ReplaceWith(
-            "Animatable(initialValue, typeConverter, visibilityThreshold, \"Animatable\")"
-        ),
+        replaceWith =
+            ReplaceWith(
+                "Animatable(initialValue, typeConverter, visibilityThreshold, \"Animatable\")"
+            ),
         DeprecationLevel.HIDDEN
     )
     constructor(
@@ -69,60 +68,50 @@
         visibilityThreshold: T? = null
     ) : this(initialValue, typeConverter, visibilityThreshold, "Animatable")
 
-    internal val internalState = AnimationState(
-        typeConverter = typeConverter,
-        initialValue = initialValue
-    )
+    internal val internalState =
+        AnimationState(typeConverter = typeConverter, initialValue = initialValue)
 
-    /**
-     * Current value of the animation.
-     */
+    /** Current value of the animation. */
     val value: T
         get() = internalState.value
 
-    /**
-     * Velocity vector of the animation (in the form of [AnimationVector].
-     */
+    /** Velocity vector of the animation (in the form of [AnimationVector]. */
     val velocityVector: V
         get() = internalState.velocityVector
 
-    /**
-     * Returns the velocity, converted from [velocityVector].
-     */
+    /** Returns the velocity, converted from [velocityVector]. */
     val velocity: T
         get() = typeConverter.convertFromVector(velocityVector)
 
-    /**
-     * Indicates whether the animation is running.
-     */
+    /** Indicates whether the animation is running. */
     var isRunning: Boolean by mutableStateOf(false)
         private set
 
     /**
-     * The target of the current animation. If the animation finishes un-interrupted, it will
-     * reach this target value.
+     * The target of the current animation. If the animation finishes un-interrupted, it will reach
+     * this target value.
      */
     var targetValue: T by mutableStateOf(initialValue)
         private set
 
     /**
-     * Lower bound of the animation, null by default (meaning no lower bound). Bounds can be
-     * changed using [updateBounds].
+     * Lower bound of the animation, null by default (meaning no lower bound). Bounds can be changed
+     * using [updateBounds].
      *
      * Animation will stop as soon as *any* dimension specified in [lowerBound] is reached. For
-     * example: For an Animatable<Offset> with an [lowerBound] set to Offset(100f, 200f), when
-     * the [value].x drops below 100f *or* [value].y drops below 200f, the animation will stop.
+     * example: For an Animatable<Offset> with an [lowerBound] set to Offset(100f, 200f), when the
+     * [value].x drops below 100f *or* [value].y drops below 200f, the animation will stop.
      */
     var lowerBound: T? = null
         private set
 
     /**
-     * Upper bound of the animation, null by default (meaning no upper bound). Bounds can be
-     * changed using [updateBounds].
+     * Upper bound of the animation, null by default (meaning no upper bound). Bounds can be changed
+     * using [updateBounds].
      *
      * Animation will stop as soon as *any* dimension specified in [upperBound] is reached. For
-     * example: For an Animatable<Offset> with an [upperBound] set to Offset(100f, 200f), when
-     * the [value].x exceeds 100f *or* [value].y exceeds 200f, the animation will stop.
+     * example: For an Animatable<Offset> with an [upperBound] set to Offset(100f, 200f), when the
+     * [value].x exceeds 100f *or* [value].y exceeds 200f, the animation will stop.
      */
     var upperBound: T? = null
         private set
@@ -132,20 +121,24 @@
         SpringSpec(visibilityThreshold = visibilityThreshold)
 
     @Suppress("UNCHECKED_CAST")
-    private val negativeInfinityBounds: V = when (velocityVector) {
-        is AnimationVector1D -> negativeInfinityBounds1D
-        is AnimationVector2D -> negativeInfinityBounds2D
-        is AnimationVector3D -> negativeInfinityBounds3D
-        else -> negativeInfinityBounds4D
-    } as V
+    private val negativeInfinityBounds: V =
+        when (velocityVector) {
+            is AnimationVector1D -> negativeInfinityBounds1D
+            is AnimationVector2D -> negativeInfinityBounds2D
+            is AnimationVector3D -> negativeInfinityBounds3D
+            else -> negativeInfinityBounds4D
+        }
+            as V
 
     @Suppress("UNCHECKED_CAST")
-    private val positiveInfinityBounds = when (velocityVector) {
-        is AnimationVector1D -> positiveInfinityBounds1D
-        is AnimationVector2D -> positiveInfinityBounds2D
-        is AnimationVector3D -> positiveInfinityBounds3D
-        else -> positiveInfinityBounds4D
-    } as V
+    private val positiveInfinityBounds =
+        when (velocityVector) {
+            is AnimationVector1D -> positiveInfinityBounds1D
+            is AnimationVector2D -> positiveInfinityBounds2D
+            is AnimationVector3D -> positiveInfinityBounds3D
+            else -> positiveInfinityBounds4D
+        }
+            as V
 
     private var lowerBoundVector: V = negativeInfinityBounds
     private var upperBoundVector: V = positiveInfinityBounds
@@ -155,24 +148,24 @@
      * [Animatable.lowerBound] and/or [Animatable.upperBound] accordingly after a check to ensure
      * the provided [lowerBound] is no greater than [upperBound] in any dimension.
      *
-     * Setting the bounds will immediate clamp the [value], only if the animation isn't running.
-     * For the on-going animation, the value at the next frame update will be checked against the
-     * bounds. If the value reaches the bound, then the animation will end with [BoundReached]
-     * end reason.
+     * Setting the bounds will immediate clamp the [value], only if the animation isn't running. For
+     * the on-going animation, the value at the next frame update will be checked against the
+     * bounds. If the value reaches the bound, then the animation will end with [BoundReached] end
+     * reason.
      *
-     * @param lowerBound lower bound of the animation. Defaults to the [Animatable.lowerBound]
-     *                   that is currently set.
-     * @param upperBound upper bound of the animation. Defaults to the [Animatable.upperBound]
-     *                   that is currently set.
+     * @param lowerBound lower bound of the animation. Defaults to the [Animatable.lowerBound] that
+     *   is currently set.
+     * @param upperBound upper bound of the animation. Defaults to the [Animatable.upperBound] that
+     *   is currently set.
      * @throws [IllegalStateException] if the [lowerBound] is greater than [upperBound] in any
-     *                                 dimension.
+     *   dimension.
      */
     fun updateBounds(lowerBound: T? = this.lowerBound, upperBound: T? = this.upperBound) {
-        val lowerBoundVector = lowerBound?.run { typeConverter.convertToVector(this) }
-            ?: negativeInfinityBounds
+        val lowerBoundVector =
+            lowerBound?.run { typeConverter.convertToVector(this) } ?: negativeInfinityBounds
 
-        val upperBoundVector = upperBound?.run { typeConverter.convertToVector(this) }
-            ?: positiveInfinityBounds
+        val upperBoundVector =
+            upperBound?.run { typeConverter.convertToVector(this) } ?: positiveInfinityBounds
 
         for (i in 0 until lowerBoundVector.size) {
             // TODO: is this check too aggressive?
@@ -198,33 +191,33 @@
 
     /**
      * Starts an animation to animate from [value] to the provided [targetValue]. If there is
-     * already an animation in-flight, this method will cancel the ongoing animation before
-     * starting a new animation continuing the current [value] and [velocity]. It's recommended to
-     * set the optional [initialVelocity] only when [animateTo] is used immediately after a fling.
-     * In most of the other cases, altering velocity would result in visual discontinuity.
+     * already an animation in-flight, this method will cancel the ongoing animation before starting
+     * a new animation continuing the current [value] and [velocity]. It's recommended to set the
+     * optional [initialVelocity] only when [animateTo] is used immediately after a fling. In most
+     * of the other cases, altering velocity would result in visual discontinuity.
      *
      * The animation will use the provided [animationSpec] to animate the value towards the
-     * [targetValue]. When no [animationSpec] is specified, a [spring] will be used.  [block] will
-     * be invoked on each animation frame.
+     * [targetValue]. When no [animationSpec] is specified, a [spring] will be used. [block] will be
+     * invoked on each animation frame.
      *
      * Returns an [AnimationResult] object. It contains: 1) the reason for ending the animation,
      * and 2) an end state of the animation. The reason for ending the animation can be either of
      * the following two:
-     * -  [Finished], when the animation finishes successfully without any interruption,
-     * -  [BoundReached] If the animation reaches the either [lowerBound] or [upperBound] in any
-     *    dimension, the animation will end with [BoundReached] being the end reason.
+     * - [Finished], when the animation finishes successfully without any interruption,
+     * - [BoundReached] If the animation reaches the either [lowerBound] or [upperBound] in any
+     *   dimension, the animation will end with [BoundReached] being the end reason.
      *
-     * If the animation gets interrupted by 1) another call to start an animation
-     * (i.e. [animateTo]/[animateDecay]), 2) [Animatable.stop], or 3)[Animatable.snapTo], the
-     * canceled animation will throw a [CancellationException] as the job gets canceled. As a
-     * result, all the subsequent work in the caller's coroutine will be canceled. This is often
-     * the desired behavior. If there's any cleanup that needs to be done when an animation gets
-     * canceled, consider starting the animation in a `try-catch` block.
+     * If the animation gets interrupted by 1) another call to start an animation (i.e.
+     * [animateTo]/[animateDecay]), 2) [Animatable.stop], or 3)[Animatable.snapTo], the canceled
+     * animation will throw a [CancellationException] as the job gets canceled. As a result, all the
+     * subsequent work in the caller's coroutine will be canceled. This is often the desired
+     * behavior. If there's any cleanup that needs to be done when an animation gets canceled,
+     * consider starting the animation in a `try-catch` block.
      *
      * __Note__: once the animation ends, its velocity will be reset to 0. The animation state at
-     * the point of interruption/reaching bound is captured in the returned [AnimationResult].
-     * If there's a need to continue the momentum that the animation had before it was interrupted
-     * or reached the bound, it's recommended to use the velocity in the returned
+     * the point of interruption/reaching bound is captured in the returned [AnimationResult]. If
+     * there's a need to continue the momentum that the animation had before it was interrupted or
+     * reached the bound, it's recommended to use the velocity in the returned
      * [AnimationResult.endState] to start another animation.
      *
      * @sample androidx.compose.animation.core.samples.AnimatableFadeIn
@@ -235,44 +228,45 @@
         initialVelocity: T = velocity,
         block: (Animatable<T, V>.() -> Unit)? = null
     ): AnimationResult<T, V> {
-        val anim = TargetBasedAnimation(
-            animationSpec = animationSpec,
-            initialValue = value,
-            targetValue = targetValue,
-            typeConverter = typeConverter,
-            initialVelocity = initialVelocity
-        )
+        val anim =
+            TargetBasedAnimation(
+                animationSpec = animationSpec,
+                initialValue = value,
+                targetValue = targetValue,
+                typeConverter = typeConverter,
+                initialVelocity = initialVelocity
+            )
         return runAnimation(anim, initialVelocity, block)
     }
 
     /**
-     * Start a decay animation (i.e. an animation that *slows down* from the given
-     * [initialVelocity] starting at current [Animatable.value] until the velocity reaches 0.
-     * If there's already an ongoing animation, the animation in-flight will be immediately
-     * cancelled. Decay animation is often used after a fling gesture.
+     * Start a decay animation (i.e. an animation that *slows down* from the given [initialVelocity]
+     * starting at current [Animatable.value] until the velocity reaches 0. If there's already an
+     * ongoing animation, the animation in-flight will be immediately cancelled. Decay animation is
+     * often used after a fling gesture.
      *
      * [animationSpec] defines the decay animation that will be used for this animation. Some
      * options for this [animationSpec] include: [splineBasedDecay][androidx.compose
-     * .animation.splineBasedDecay] and [exponentialDecay]. [block] will be
-     * invoked on each animation frame.
+     * .animation.splineBasedDecay] and [exponentialDecay]. [block] will be invoked on each
+     * animation frame.
      *
      * Returns an [AnimationResult] object, that contains the [reason][AnimationEndReason] for
      * ending the animation, and an end state of the animation. The reason for ending the animation
-     * will be [Finished] if the animation finishes successfully without any interruption.
-     * If the animation reaches the either [lowerBound] or [upperBound] in any dimension, the
-     * animation will end with [BoundReached] being the end reason.
+     * will be [Finished] if the animation finishes successfully without any interruption. If the
+     * animation reaches the either [lowerBound] or [upperBound] in any dimension, the animation
+     * will end with [BoundReached] being the end reason.
      *
-     * If the animation gets interrupted by 1) another call to start an animation
-     * (i.e. [animateTo]/[animateDecay]), 2) [Animatable.stop], or 3)[Animatable.snapTo], the
-     * canceled animation will throw a [CancellationException] as the job gets canceled. As a
-     * result, all the subsequent work in the caller's coroutine will be canceled. This is often
-     * the desired behavior. If there's any cleanup that needs to be done when an animation gets
-     * canceled, consider starting the animation in a `try-catch` block.
+     * If the animation gets interrupted by 1) another call to start an animation (i.e.
+     * [animateTo]/[animateDecay]), 2) [Animatable.stop], or 3)[Animatable.snapTo], the canceled
+     * animation will throw a [CancellationException] as the job gets canceled. As a result, all the
+     * subsequent work in the caller's coroutine will be canceled. This is often the desired
+     * behavior. If there's any cleanup that needs to be done when an animation gets canceled,
+     * consider starting the animation in a `try-catch` block.
      *
      * __Note__, once the animation ends, its velocity will be reset to 0. If there's a need to
      * continue the momentum before the animation gets interrupted or reaches the bound, it's
-     * recommended to use the velocity in the returned [AnimationResult.endState] to start
-     * another animation.
+     * recommended to use the velocity in the returned [AnimationResult.endState] to start another
+     * animation.
      *
      * @sample androidx.compose.animation.core.samples.AnimatableDecayAndAnimateToSample
      */
@@ -281,12 +275,13 @@
         animationSpec: DecayAnimationSpec<T>,
         block: (Animatable<T, V>.() -> Unit)? = null
     ): AnimationResult<T, V> {
-        val anim = DecayAnimation(
-            animationSpec = animationSpec,
-            initialValue = value,
-            initialVelocityVector = typeConverter.convertToVector(initialVelocity),
-            typeConverter = typeConverter
-        )
+        val anim =
+            DecayAnimation(
+                animationSpec = animationSpec,
+                initialValue = value,
+                initialVelocityVector = typeConverter.convertToVector(initialVelocity),
+                typeConverter = typeConverter
+            )
         return runAnimation(anim, initialVelocity, block)
     }
 
@@ -305,14 +300,10 @@
                 targetValue = animation.targetValue
                 isRunning = true
 
-                val endState = internalState.copy(
-                    finishedTimeNanos = AnimationConstants.UnspecifiedTime
-                )
+                val endState =
+                    internalState.copy(finishedTimeNanos = AnimationConstants.UnspecifiedTime)
                 var clampingNeeded = false
-                endState.animate(
-                    animation,
-                    startTime
-                ) {
+                endState.animate(animation, startTime) {
                     updateState(internalState)
                     val clamped = clampToBounds(value)
                     if (clamped != value) {
@@ -338,8 +329,7 @@
 
     private fun clampToBounds(value: T): T {
         if (
-            lowerBoundVector == negativeInfinityBounds &&
-            upperBoundVector == positiveInfinityBounds
+            lowerBoundVector == negativeInfinityBounds && upperBoundVector == positiveInfinityBounds
         ) {
             // Expect this to be the most common use case
             return value
@@ -349,8 +339,7 @@
         for (i in 0 until valueVector.size) {
             if (valueVector[i] < lowerBoundVector[i] || valueVector[i] > upperBoundVector[i]) {
                 clamped = true
-                valueVector[i] =
-                    valueVector[i].coerceIn(lowerBoundVector[i], upperBoundVector[i])
+                valueVector[i] = valueVector[i].coerceIn(lowerBoundVector[i], upperBoundVector[i])
             }
         }
         if (clamped) {
@@ -375,13 +364,12 @@
      * canceling any on-going animation and updating the [Animatable.value] and
      * [Animatable.targetValue] to the provided [targetValue].
      *
-     * __Note__: If the [lowerBound] or [upperBound] is specified, the provided [targetValue]
-     * will be clamped to the bounds to ensure [Animatable.value] is always within bounds.
+     * __Note__: If the [lowerBound] or [upperBound] is specified, the provided [targetValue] will
+     * be clamped to the bounds to ensure [Animatable.value] is always within bounds.
      *
      * See [animateTo] and [animateDecay] for more details about animation being canceled.
      *
      * @param targetValue The new target value to set [value] to.
-     *
      * @see animateTo
      * @see animateDecay
      * @see stop
@@ -398,8 +386,8 @@
     /**
      * Stops any on-going animation with a [CancellationException].
      *
-     * This function will not return until the ongoing animation has been canceled (if any).
-     * Note, [stop] function does **not** skip the animation value to its target value. Rather the
+     * This function will not return until the ongoing animation has been canceled (if any). Note,
+     * [stop] function does **not** skip the animation value to its target value. Rather the
      * animation will be stopped in its track. Consider [snapTo] if it's desired to not only stop
      * the animation but also snap the [value] to a given value.
      *
@@ -410,73 +398,67 @@
      * @see snapTo
      */
     suspend fun stop() {
-        mutatorMutex.mutate {
-            endAnimation()
-        }
+        mutatorMutex.mutate { endAnimation() }
     }
 
     /**
-     * Returns a [State] representing the current [value] of this animation. This allows
-     * hoisting the animation's current value without causing unnecessary recompositions
-     * when the value changes.
+     * Returns a [State] representing the current [value] of this animation. This allows hoisting
+     * the animation's current value without causing unnecessary recompositions when the value
+     * changes.
      */
     fun asState(): State<T> = internalState
 }
 
 /**
- * This [Animatable] function creates a float value holder that automatically
- * animates its value when the value is changed via [animateTo]. [Animatable] supports value
- * change during an ongoing value change animation. When that happens, a new animation will
- * transition [Animatable] from its current value (i.e. value at the point of interruption) to the
- * new target. This ensures that the value change is *always* continuous using [animateTo]. If
- * [spring] animation (i.e. default animation) is used with [animateTo], the velocity change will
- * be guaranteed to be continuous as well.
+ * This [Animatable] function creates a float value holder that automatically animates its value
+ * when the value is changed via [animateTo]. [Animatable] supports value change during an ongoing
+ * value change animation. When that happens, a new animation will transition [Animatable] from its
+ * current value (i.e. value at the point of interruption) to the new target. This ensures that the
+ * value change is *always* continuous using [animateTo]. If [spring] animation (i.e. default
+ * animation) is used with [animateTo], the velocity change will be guaranteed to be continuous as
+ * well.
  *
- * Unlike [AnimationState], [Animatable] ensures mutual exclusiveness on its animation. To
- * do so, when a new animation is started via [animateTo] (or [animateDecay]), any ongoing
- * animation job will be cancelled.
+ * Unlike [AnimationState], [Animatable] ensures mutual exclusiveness on its animation. To do so,
+ * when a new animation is started via [animateTo] (or [animateDecay]), any ongoing animation job
+ * will be cancelled.
  *
  * @sample androidx.compose.animation.core.samples.AnimatableFadeIn
  *
  * @param initialValue initial value of the animatable value holder
  * @param visibilityThreshold Threshold at which the animation may round off to its target value.
- *                            [Spring.DefaultDisplacementThreshold] by default.
+ *   [Spring.DefaultDisplacementThreshold] by default.
  */
 fun Animatable(
     initialValue: Float,
     visibilityThreshold: Float = Spring.DefaultDisplacementThreshold
-) = Animatable(
-    initialValue,
-    Float.VectorConverter,
-    visibilityThreshold
-)
+) = Animatable(initialValue, Float.VectorConverter, visibilityThreshold)
 
 // TODO: Consider some version of @Composable fun<T, V: AnimationVector> Animatable<T, V>.animateTo
 /**
  * AnimationResult contains information about an animation at the end of the animation. [endState]
- * captures the value/velocity/frame time, etc of the animation at its last frame. It can be
- * useful for starting another animation to continue the velocity from the previously interrupted
+ * captures the value/velocity/frame time, etc of the animation at its last frame. It can be useful
+ * for starting another animation to continue the velocity from the previously interrupted
  * animation. [endReason] describes why the animation ended, it could be either of the following:
- * -  [Finished], when the animation finishes successfully without any interruption
- * -  [BoundReached] If the animation reaches the either [lowerBound][Animatable.lowerBound] or
- *    [upperBound][Animatable.upperBound] in any dimension, the animation will end with
- *    [BoundReached] being the end reason.
+ * - [Finished], when the animation finishes successfully without any interruption
+ * - [BoundReached] If the animation reaches the either [lowerBound][Animatable.lowerBound] or
+ *   [upperBound][Animatable.upperBound] in any dimension, the animation will end with
+ *   [BoundReached] being the end reason.
  *
  * @sample androidx.compose.animation.core.samples.AnimatableAnimationResultSample
  */
 class AnimationResult<T, V : AnimationVector>(
     /**
-     * The state of the animation in its last frame before it's canceled or reset. This captures
-     * the animation value/velocity/frame time, etc at the point of interruption, or before the
-     * velocity is reset when the animation finishes successfully.
+     * The state of the animation in its last frame before it's canceled or reset. This captures the
+     * animation value/velocity/frame time, etc at the point of interruption, or before the velocity
+     * is reset when the animation finishes successfully.
      */
     val endState: AnimationState<T, V>,
     /**
      * The reason why the animation has ended. Could be either of the following:
-     * -  [Finished], when the animation finishes successfully without any interruption
-     * -  [BoundReached] If the animation reaches the either [lowerBound][Animatable.lowerBound] or
-     *    [upperBound][Animatable.upperBound] in any dimension, the animation will end with
-     *    [BoundReached] being the end reason.
+     * - [Finished], when the animation finishes successfully without any interruption
+     * - [BoundReached] If the animation reaches the either [lowerBound][Animatable.lowerBound] or
+     *   [upperBound][Animatable.upperBound] in any dimension, the animation will end with
+     *   [BoundReached] being the end reason.
      */
     val endReason: AnimationEndReason
 ) {
@@ -490,8 +472,10 @@
     AnimationVector(Float.POSITIVE_INFINITY, Float.POSITIVE_INFINITY, Float.POSITIVE_INFINITY)
 private val positiveInfinityBounds4D =
     AnimationVector(
-        Float.POSITIVE_INFINITY, Float.POSITIVE_INFINITY,
-        Float.POSITIVE_INFINITY, Float.POSITIVE_INFINITY
+        Float.POSITIVE_INFINITY,
+        Float.POSITIVE_INFINITY,
+        Float.POSITIVE_INFINITY,
+        Float.POSITIVE_INFINITY
     )
 
 private val negativeInfinityBounds1D = AnimationVector(Float.NEGATIVE_INFINITY)
@@ -501,6 +485,8 @@
     AnimationVector(Float.NEGATIVE_INFINITY, Float.NEGATIVE_INFINITY, Float.NEGATIVE_INFINITY)
 private val negativeInfinityBounds4D =
     AnimationVector(
-        Float.NEGATIVE_INFINITY, Float.NEGATIVE_INFINITY,
-        Float.NEGATIVE_INFINITY, Float.NEGATIVE_INFINITY
+        Float.NEGATIVE_INFINITY,
+        Float.NEGATIVE_INFINITY,
+        Float.NEGATIVE_INFINITY,
+        Float.NEGATIVE_INFINITY
     )
diff --git a/compose/animation/animation-core/src/commonMain/kotlin/androidx/compose/animation/core/AnimateAsState.kt b/compose/animation/animation-core/src/commonMain/kotlin/androidx/compose/animation/core/AnimateAsState.kt
index debf3c6..86b5104 100644
--- a/compose/animation/animation-core/src/commonMain/kotlin/androidx/compose/animation/core/AnimateAsState.kt
+++ b/compose/animation/animation-core/src/commonMain/kotlin/androidx/compose/animation/core/AnimateAsState.kt
@@ -52,9 +52,9 @@
  *
  * @param targetValue Target value of the animation
  * @param animationSpec The animation that will be used to change the value through time. [spring]
- *                      will be used by default.
+ *   will be used by default.
  * @param visibilityThreshold An optional threshold for deciding when the animation value is
- *                            considered close enough to the targetValue.
+ *   considered close enough to the targetValue.
  * @param label An optional label to differentiate from other animations in Android Studio.
  * @param finishedListener An optional end listener to get notified when the animation is finished.
  * @return A [State] object, the value of which is updated by animation.
@@ -84,11 +84,11 @@
 }
 
 /**
- * Fire-and-forget animation function for [Dp]. This Composable function is overloaded for
- * different parameter types such as [Float], [Color][androidx.compose.ui.graphics.Color], [Offset],
- * etc. When the provided [targetValue] is changed, the animation will run automatically. If there
- * is already an animation in-flight when [targetValue] changes, the on-going animation will adjust
- * course to animate towards the new target value.
+ * Fire-and-forget animation function for [Dp]. This Composable function is overloaded for different
+ * parameter types such as [Float], [Color][androidx.compose.ui.graphics.Color], [Offset], etc. When
+ * the provided [targetValue] is changed, the animation will run automatically. If there is already
+ * an animation in-flight when [targetValue] changes, the on-going animation will adjust course to
+ * animate towards the new target value.
  *
  * [animateDpAsState] returns a [State] object. The value of the state object will continuously be
  * updated by the animation until the animation finishes.
@@ -100,7 +100,7 @@
  *
  * @param targetValue Target value of the animation
  * @param animationSpec The animation that will be used to change the value through time. Physics
- *                    animation will be used by default.
+ *   animation will be used by default.
  * @param label An optional label to differentiate from other animations in Android Studio.
  * @param finishedListener An optional end listener to get notified when the animation is finished.
  * @return A [State] object, the value of which is updated by animation.
@@ -141,7 +141,7 @@
  *
  * @param targetValue Target value of the animation
  * @param animationSpec The animation that will be used to change the value through time. Physics
- *                    animation will be used by default.
+ *   animation will be used by default.
  * @param label An optional label to differentiate from other animations in Android Studio.
  * @param finishedListener An optional end listener to get notified when the animation is finished.
  * @return A [State] object, the value of which is updated by animation.
@@ -171,8 +171,8 @@
  * is already an animation in-flight when [targetValue] changes, the on-going animation will adjust
  * course to animate towards the new target value.
  *
- * [animateOffsetAsState] returns a [State] object. The value of the state object will
- * continuously be updated by the animation until the animation finishes.
+ * [animateOffsetAsState] returns a [State] object. The value of the state object will continuously
+ * be updated by the animation until the animation finishes.
  *
  * Note, [animateOffsetAsState] cannot be canceled/stopped without removing this composable function
  * from the tree. See [Animatable] for cancelable animations.
@@ -181,7 +181,7 @@
  *
  * @param targetValue Target value of the animation
  * @param animationSpec The animation that will be used to change the value through time. Physics
- *                    animation will be used by default.
+ *   animation will be used by default.
  * @param label An optional label to differentiate from other animations in Android Studio.
  * @param finishedListener An optional end listener to get notified when the animation is finished.
  * @return A [State] object, the value of which is updated by animation.
@@ -217,12 +217,12 @@
  * Note, [animateRectAsState] cannot be canceled/stopped without removing this composable function
  * from the tree. See [Animatable] for cancelable animations.
  *
- *    val bounds: Rect by animateRectAsState(
- *        if (enabled) Rect(0f, 0f, 100f, 100f) else Rect(8f, 8f, 80f, 80f))
+ * val bounds: Rect by animateRectAsState( if (enabled) Rect(0f, 0f, 100f, 100f) else Rect(8f, 8f,
+ * 80f, 80f))
  *
  * @param targetValue Target value of the animation
  * @param animationSpec The animation that will be used to change the value through time. Physics
- *                    animation will be used by default.
+ *   animation will be used by default.
  * @param label An optional label to differentiate from other animations in Android Studio.
  * @param finishedListener An optional end listener to get notified when the animation is finished.
  * @return A [State] object, the value of which is updated by animation.
@@ -260,7 +260,7 @@
  *
  * @param targetValue Target value of the animation
  * @param animationSpec The animation that will be used to change the value through time. Physics
- *                    animation will be used by default.
+ *   animation will be used by default.
  * @param label An optional label to differentiate from other animations in Android Studio.
  * @param finishedListener An optional end listener to get notified when the animation is finished.
  * @return A [State] object, the value of which is updated by animation.
@@ -300,7 +300,7 @@
  *
  * @param targetValue Target value of the animation
  * @param animationSpec The animation that will be used to change the value through time. Physics
- *                    animation will be used by default.
+ *   animation will be used by default.
  * @param label An optional label to differentiate from other animations in Android Studio.
  * @param finishedListener An optional end listener to get notified when the animation is finished.
  * @return A [State] object, the value of which is updated by animation.
@@ -333,12 +333,12 @@
  * [animateIntSizeAsState] returns a [State] object. The value of the state object will continuously
  * be updated by the animation until the animation finishes.
  *
- * Note, [animateIntSizeAsState] cannot be canceled/stopped without removing this composable function
- * from the tree. See [Animatable] for cancelable animations.
+ * Note, [animateIntSizeAsState] cannot be canceled/stopped without removing this composable
+ * function from the tree. See [Animatable] for cancelable animations.
  *
  * @param targetValue Target value of the animation
  * @param animationSpec The animation that will be used to change the value through time. Physics
- *                    animation will be used by default.
+ *   animation will be used by default.
  * @param label An optional label to differentiate from other animations in Android Studio.
  * @param finishedListener An optional end listener to get notified when the animation is finished.
  * @return A [State] object, the value of which is updated by animation.
@@ -368,8 +368,8 @@
  * is already an animation in-flight when [targetValue] changes, the on-going animation will adjust
  * course to animate towards the new target value.
  *
- * [animateValueAsState] returns a [State] object. The value of the state object will continuously be
- * updated by the animation until the animation finishes.
+ * [animateValueAsState] returns a [State] object. The value of the state object will continuously
+ * be updated by the animation until the animation finishes.
  *
  * Note, [animateValueAsState] cannot be canceled/stopped without removing this composable function
  * from the tree. See [Animatable] for cancelable animations.
@@ -380,9 +380,9 @@
  *
  * @param targetValue Target value of the animation
  * @param animationSpec The animation that will be used to change the value through time. Physics
- *                    animation will be used by default.
+ *   animation will be used by default.
  * @param visibilityThreshold An optional threshold to define when the animation value can be
- *                            considered close enough to the targetValue to end the animation.
+ *   considered close enough to the targetValue to end the animation.
  * @param label An optional label to differentiate from other animations in Android Studio.
  * @param finishedListener An optional end listener to get notified when the animation is finished.
  * @return A [State] object, the value of which is updated by animation.
@@ -400,21 +400,22 @@
     val toolingOverride = remember { mutableStateOf<State<T>?>(null) }
     val animatable = remember { Animatable(targetValue, typeConverter, visibilityThreshold, label) }
     val listener by rememberUpdatedState(finishedListener)
-    val animSpec: AnimationSpec<T> by rememberUpdatedState(
-        animationSpec.run {
-            if (visibilityThreshold != null && this is SpringSpec &&
-                this.visibilityThreshold != visibilityThreshold
-            ) {
-                spring(dampingRatio, stiffness, visibilityThreshold)
-            } else {
-                this
+    val animSpec: AnimationSpec<T> by
+        rememberUpdatedState(
+            animationSpec.run {
+                if (
+                    visibilityThreshold != null &&
+                        this is SpringSpec &&
+                        this.visibilityThreshold != visibilityThreshold
+                ) {
+                    spring(dampingRatio, stiffness, visibilityThreshold)
+                } else {
+                    this
+                }
             }
-        }
-    )
+        )
     val channel = remember { Channel<T>(Channel.CONFLATED) }
-    SideEffect {
-        channel.trySend(targetValue)
-    }
+    SideEffect { channel.trySend(targetValue) }
     LaunchedEffect(channel) {
         for (target in channel) {
             // This additional poll is needed because when the channel suspends on receive and
@@ -444,7 +445,8 @@
     animationSpec: AnimationSpec<Float> = defaultAnimation,
     visibilityThreshold: Float = 0.01f,
     finishedListener: ((Float) -> Unit)? = null
-): State<Float> = animateFloatAsState(
+): State<Float> =
+    animateFloatAsState(
         targetValue,
         animationSpec,
         visibilityThreshold,
@@ -498,7 +500,10 @@
     finishedListener: ((Offset) -> Unit)? = null
 ): State<Offset> {
     return animateValueAsState(
-        targetValue, Offset.VectorConverter, animationSpec, finishedListener = finishedListener
+        targetValue,
+        Offset.VectorConverter,
+        animationSpec,
+        finishedListener = finishedListener
     )
 }
 
@@ -513,7 +518,10 @@
     finishedListener: ((Rect) -> Unit)? = null
 ): State<Rect> {
     return animateValueAsState(
-        targetValue, Rect.VectorConverter, animationSpec, finishedListener = finishedListener
+        targetValue,
+        Rect.VectorConverter,
+        animationSpec,
+        finishedListener = finishedListener
     )
 }
 
@@ -528,7 +536,10 @@
     finishedListener: ((Int) -> Unit)? = null
 ): State<Int> {
     return animateValueAsState(
-        targetValue, Int.VectorConverter, animationSpec, finishedListener = finishedListener
+        targetValue,
+        Int.VectorConverter,
+        animationSpec,
+        finishedListener = finishedListener
     )
 }
 
@@ -543,7 +554,10 @@
     finishedListener: ((IntOffset) -> Unit)? = null
 ): State<IntOffset> {
     return animateValueAsState(
-        targetValue, IntOffset.VectorConverter, animationSpec, finishedListener = finishedListener
+        targetValue,
+        IntOffset.VectorConverter,
+        animationSpec,
+        finishedListener = finishedListener
     )
 }
 
@@ -558,7 +572,10 @@
     finishedListener: ((IntSize) -> Unit)? = null
 ): State<IntSize> {
     return animateValueAsState(
-        targetValue, IntSize.VectorConverter, animationSpec, finishedListener = finishedListener
+        targetValue,
+        IntSize.VectorConverter,
+        animationSpec,
+        finishedListener = finishedListener
     )
 }
 
@@ -573,11 +590,12 @@
     animationSpec: AnimationSpec<T> = remember { spring() },
     visibilityThreshold: T? = null,
     finishedListener: ((T) -> Unit)? = null
-): State<T> = animateValueAsState(
-    targetValue = targetValue,
-    typeConverter = typeConverter,
-    animationSpec = animationSpec,
-    visibilityThreshold = visibilityThreshold,
-    label = "ValueAnimation",
-    finishedListener = finishedListener
-)
+): State<T> =
+    animateValueAsState(
+        targetValue = targetValue,
+        typeConverter = typeConverter,
+        animationSpec = animationSpec,
+        visibilityThreshold = visibilityThreshold,
+        label = "ValueAnimation",
+        finishedListener = finishedListener
+    )
diff --git a/compose/animation/animation-core/src/commonMain/kotlin/androidx/compose/animation/core/Animation.kt b/compose/animation/animation-core/src/commonMain/kotlin/androidx/compose/animation/core/Animation.kt
index 58badba..c2d4513 100644
--- a/compose/animation/animation-core/src/commonMain/kotlin/androidx/compose/animation/core/Animation.kt
+++ b/compose/animation/animation-core/src/commonMain/kotlin/androidx/compose/animation/core/Animation.kt
@@ -24,13 +24,13 @@
  * ending condition for each value or velocity query, and instead only requires the play time to be
  * passed for such queries.
  *
- * The implementation of this interface should cache the starting conditions and ending
- * conditions of animations as needed.
+ * The implementation of this interface should cache the starting conditions and ending conditions
+ * of animations as needed.
  *
  * __Note__: [Animation] does not track the lifecycle of an animation. It merely reacts to play time
  * change and returns the new value/velocity as a result. It can be used as a building block for
- * more lifecycle aware animations. In contrast, [Animatable] and [Transition] are
- * stateful and manage their own lifecycles.
+ * more lifecycle aware animations. In contrast, [Animatable] and [Transition] are stateful and
+ * manage their own lifecycles.
  *
  * @see [Animatable]
  * @see [rememberTransition]
@@ -38,28 +38,23 @@
  */
 @JvmDefaultWithCompatibility
 interface Animation<T, V : AnimationVector> {
-    /**
-     * This amount of time in nanoseconds that the animation will run before it finishes
-     */
-    @get:Suppress("MethodNameUnits")
-    val durationNanos: Long
+    /** This amount of time in nanoseconds that the animation will run before it finishes */
+    @get:Suppress("MethodNameUnits") val durationNanos: Long
 
     /**
      * The [TwoWayConverter] that will be used to convert value/velocity from any arbitrary data
-     * type to [AnimationVector]. This makes it possible to animate different dimensions of the
-     * data object independently (e.g. x/y dimensions of the position data).
+     * type to [AnimationVector]. This makes it possible to animate different dimensions of the data
+     * object independently (e.g. x/y dimensions of the position data).
      */
     val typeConverter: TwoWayConverter<T, V>
 
-    /**
-     * This is the value that the [Animation] will reach when it finishes uninterrupted.
-     */
+    /** This is the value that the [Animation] will reach when it finishes uninterrupted. */
     val targetValue: T
 
     /**
-     * Whether or not the [Animation] represents an infinite animation. That is, one that will
-     * not finish by itself, one that needs an external action to stop. For examples, an
-     * indeterminate progress bar, which will only stop when it is removed from the composition.
+     * Whether or not the [Animation] represents an infinite animation. That is, one that will not
+     * finish by itself, one that needs an external action to stop. For examples, an indeterminate
+     * progress bar, which will only stop when it is removed from the composition.
      */
     val isInfinite: Boolean
 
@@ -101,10 +96,11 @@
  */
 fun <T, V : AnimationVector> Animation<T, V>.getVelocityFromNanos(playTimeNanos: Long): T =
     typeConverter.convertFromVector(getVelocityVectorFromNanos(playTimeNanos))
+
 /**
- * Creates a [TargetBasedAnimation] from a given [VectorizedAnimationSpec] of [AnimationVector] type. This
- * convenient method is intended for when the value being animated (i.e. start value, end value,
- * etc) is of [AnimationVector] type.
+ * Creates a [TargetBasedAnimation] from a given [VectorizedAnimationSpec] of [AnimationVector]
+ * type. This convenient method is intended for when the value being animated (i.e. start value, end
+ * value, etc) is of [AnimationVector] type.
  *
  * @param initialValue the value that the animation will start from
  * @param targetValue the value that the animation will end at
@@ -125,19 +121,19 @@
     )
 
 /**
- * Creates a [TargetBasedAnimation] with the given start/end conditions of the animation, and
- * the provided [animationSpec].
+ * Creates a [TargetBasedAnimation] with the given start/end conditions of the animation, and the
+ * provided [animationSpec].
  *
- * The resulting [Animation] assumes that the start value and velocity, as well as end value do
- * not change throughout the animation, and cache these values. This caching enables much more
- * convenient query for animation value and velocity (where only playtime needs to be passed
- * into the methods).
+ * The resulting [Animation] assumes that the start value and velocity, as well as end value do not
+ * change throughout the animation, and cache these values. This caching enables much more
+ * convenient query for animation value and velocity (where only playtime needs to be passed into
+ * the methods).
  *
- * __Note__: When interruptions happen to the [TargetBasedAnimation], a new instance should
- * be created that use the current value and velocity as the starting conditions. This type of
- * interruption handling is the default behavior for both [Animatable] and
- * [Transition]. Consider using those APIs for the interruption handling, as well as
- * built-in animation lifecycle management.
+ * __Note__: When interruptions happen to the [TargetBasedAnimation], a new instance should be
+ * created that use the current value and velocity as the starting conditions. This type of
+ * interruption handling is the default behavior for both [Animatable] and [Transition]. Consider
+ * using those APIs for the interruption handling, as well as built-in animation lifecycle
+ * management.
  *
  * @param animationSpec the [AnimationSpec] that will be used to calculate value/velocity
  * @param initialValue the start value of the animation
@@ -151,13 +147,14 @@
     initialValue: T,
     targetValue: T,
     initialVelocity: T
-) = TargetBasedAnimation(
-    animationSpec,
-    typeConverter,
-    initialValue,
-    targetValue,
-    typeConverter.convertToVector(initialVelocity)
-)
+) =
+    TargetBasedAnimation(
+        animationSpec,
+        typeConverter,
+        initialValue,
+        targetValue,
+        typeConverter.convertToVector(initialVelocity)
+    )
 
 /**
  * This is a convenient animation wrapper class that works for all target based animations, i.e.
@@ -167,24 +164,24 @@
  * the animation, and cache these values. This caching enables much more convenient query for
  * animation value and velocity (where only playtime needs to be passed into the methods).
  *
- * __Note__: When interruptions happen to the [TargetBasedAnimation], a new instance should
- * be created that use the current value and velocity as the starting conditions. This type of
- * interruption handling is the default behavior for both [Animatable] and
- * [Transition]. Consider using those APIs for the interruption handling, as well as
- * built-in animation lifecycle management.
+ * __Note__: When interruptions happen to the [TargetBasedAnimation], a new instance should be
+ * created that use the current value and velocity as the starting conditions. This type of
+ * interruption handling is the default behavior for both [Animatable] and [Transition]. Consider
+ * using those APIs for the interruption handling, as well as built-in animation lifecycle
+ * management.
  *
  * @param animationSpec the [VectorizedAnimationSpec] that will be used to calculate value/velocity
  * @param initialValue the start value of the animation
  * @param targetValue the end value of the animation
  * @param typeConverter the [TwoWayConverter] that is used to convert animation type [T] from/to [V]
  * @param initialVelocityVector the start velocity of the animation in the form of [AnimationVector]
- *
  * @see [Transition]
  * @see [rememberTransition]
  * @see [updateTransition]
  * @see [Animatable]
  */
-class TargetBasedAnimation<T, V : AnimationVector> internal constructor(
+class TargetBasedAnimation<T, V : AnimationVector>
+internal constructor(
     internal val animationSpec: VectorizedAnimationSpec<V>,
     override val typeConverter: TwoWayConverter<T, V>,
     initialValue: T,
@@ -226,14 +223,15 @@
      * convenient query for animation value and velocity (where only playtime needs to be passed
      * into the methods).
      *
-     * __Note__: When interruptions happen to the [TargetBasedAnimation], a new instance should
-     * be created that use the current value and velocity as the starting conditions. This type of
-     * interruption handling is the default behavior for both [Animatable] and
-     * [Transition]. Consider using those APIs for the interruption handling, as well as
-     * built-in animation lifecycle management.
+     * __Note__: When interruptions happen to the [TargetBasedAnimation], a new instance should be
+     * created that use the current value and velocity as the starting conditions. This type of
+     * interruption handling is the default behavior for both [Animatable] and [Transition].
+     * Consider using those APIs for the interruption handling, as well as built-in animation
+     * lifecycle management.
      *
      * @param animationSpec the [AnimationSpec] that will be used to calculate value/velocity
-     * @param typeConverter the [TwoWayConverter] that is used to convert animation type [T] from/to [V]
+     * @param typeConverter the [TwoWayConverter] that is used to convert animation type [T] from/to
+     *   [V]
      * @param initialValue the start value of the animation
      * @param targetValue the end value of the animation
      * @param initialVelocityVector the start velocity vector, null by default (meaning 0 velocity).
@@ -255,25 +253,30 @@
     private var initialValueVector = typeConverter.convertToVector(initialValue)
     private var targetValueVector = typeConverter.convertToVector(targetValue)
     private val initialVelocityVector =
-        initialVelocityVector?.copy() ?: typeConverter.convertToVector(initialValue)
-            .newInstance()
+        initialVelocityVector?.copy() ?: typeConverter.convertToVector(initialValue).newInstance()
 
-    override val isInfinite: Boolean get() = animationSpec.isInfinite
+    override val isInfinite: Boolean
+        get() = animationSpec.isInfinite
+
     override fun getValueFromNanos(playTimeNanos: Long): T {
         return if (!isFinishedFromNanos(playTimeNanos)) {
-            animationSpec.getValueFromNanos(
-                playTimeNanos, initialValueVector,
-                targetValueVector, initialVelocityVector
-            ).let {
-                // TODO: Remove after b/232030217
-                for (i in 0 until it.size) {
-                    checkPrecondition(!it.get(i).isNaN()) {
-                        "AnimationVector cannot contain a NaN. $it. Animation: $this," +
-                            " playTimeNanos: $playTimeNanos"
+            animationSpec
+                .getValueFromNanos(
+                    playTimeNanos,
+                    initialValueVector,
+                    targetValueVector,
+                    initialVelocityVector
+                )
+                .let {
+                    // TODO: Remove after b/232030217
+                    for (i in 0 until it.size) {
+                        checkPrecondition(!it.get(i).isNaN()) {
+                            "AnimationVector cannot contain a NaN. $it. Animation: $this," +
+                                " playTimeNanos: $playTimeNanos"
+                        }
                     }
+                    typeConverter.convertFromVector(it)
                 }
-                typeConverter.convertFromVector(it)
-            }
         } else {
             targetValue
         }
@@ -285,11 +288,12 @@
     override val durationNanos: Long
         get() {
             if (_durationNanos < 0L) {
-                _durationNanos = animationSpec.getDurationNanos(
-                    initialValue = initialValueVector,
-                    targetValue = targetValueVector,
-                    initialVelocity = this.initialVelocityVector
-                )
+                _durationNanos =
+                    animationSpec.getDurationNanos(
+                        initialValue = initialValueVector,
+                        targetValue = targetValueVector,
+                        initialVelocity = this.initialVelocityVector
+                    )
             }
             return _durationNanos
         }
@@ -297,11 +301,15 @@
     private var _endVelocity: V? = null
 
     private val endVelocity
-        get() = _endVelocity ?: animationSpec.getEndVelocity(
-                initialValueVector,
-                targetValueVector,
-                this.initialVelocityVector
-            ).also { _endVelocity = it }
+        get() =
+            _endVelocity
+                ?: animationSpec
+                    .getEndVelocity(
+                        initialValueVector,
+                        targetValueVector,
+                        this.initialVelocityVector
+                    )
+                    .also { _endVelocity = it }
 
     override fun getVelocityVectorFromNanos(playTimeNanos: Long): V {
         return if (!isFinishedFromNanos(playTimeNanos)) {
@@ -324,20 +332,21 @@
 }
 
 /**
- * [DecayAnimation] is an animation that slows down from [initialVelocityVector] as
- * time goes on. [DecayAnimation] is stateless, and it does not have any concept of lifecycle. It
- * serves as an animation calculation engine that supports convenient query of value/velocity
- * given a play time. To achieve that, [DecayAnimation] stores all the animation related
- * information: [initialValue], [initialVelocityVector], decay animation spec, [typeConverter].
+ * [DecayAnimation] is an animation that slows down from [initialVelocityVector] as time goes on.
+ * [DecayAnimation] is stateless, and it does not have any concept of lifecycle. It serves as an
+ * animation calculation engine that supports convenient query of value/velocity given a play time.
+ * To achieve that, [DecayAnimation] stores all the animation related information: [initialValue],
+ * [initialVelocityVector], decay animation spec, [typeConverter].
  *
- * __Note__: Unless there's a need to control the timing manually, it's
- * generally recommended to use higher level animation APIs that build on top [DecayAnimation],
- * such as [Animatable.animateDecay], [AnimationState.animateDecay], etc.
+ * __Note__: Unless there's a need to control the timing manually, it's generally recommended to use
+ * higher level animation APIs that build on top [DecayAnimation], such as
+ * [Animatable.animateDecay], [AnimationState.animateDecay], etc.
  *
  * @see Animatable.animateDecay
  * @see AnimationState.animateDecay
  */
-class DecayAnimation<T, V : AnimationVector> /*@VisibleForTesting*/ constructor(
+class DecayAnimation<T, V : AnimationVector> /*@VisibleForTesting*/
+constructor(
     private val animationSpec: VectorizedDecayAnimationSpec<V>,
     override val typeConverter: TwoWayConverter<T, V>,
     val initialValue: T,
@@ -347,31 +356,30 @@
     val initialVelocityVector: V = initialVelocityVector.copy()
     private val endVelocity: V
 
-    override val targetValue: T = typeConverter.convertFromVector(
-        animationSpec.getTargetValue(initialValueVector, initialVelocityVector)
-    )
-    @get:Suppress("MethodNameUnits")
-    override val durationNanos: Long
+    override val targetValue: T =
+        typeConverter.convertFromVector(
+            animationSpec.getTargetValue(initialValueVector, initialVelocityVector)
+        )
+    @get:Suppress("MethodNameUnits") override val durationNanos: Long
 
     // DecayAnimation finishes by design
     override val isInfinite: Boolean = false
 
     /**
      * [DecayAnimation] is an animation that slows down from [initialVelocityVector] as time goes
-     * on. [DecayAnimation] is stateless, and it does not have any concept of lifecycle. It
-     * serves as an animation calculation engine that supports convenient query of value/velocity
-     * given a play time. To achieve that, [DecayAnimation] stores all the animation related
-     * information: [initialValue], [initialVelocityVector], decay animation spec, [typeConverter].
+     * on. [DecayAnimation] is stateless, and it does not have any concept of lifecycle. It serves
+     * as an animation calculation engine that supports convenient query of value/velocity given a
+     * play time. To achieve that, [DecayAnimation] stores all the animation related information:
+     * [initialValue], [initialVelocityVector], decay animation spec, [typeConverter].
      *
-     * __Note__: Unless there's a need to control the timing manually, it's
-     * generally recommended to use higher level animation APIs that build on top [DecayAnimation],
-     * such as [Animatable.animateDecay], [AnimationState.animateDecay], etc.
+     * __Note__: Unless there's a need to control the timing manually, it's generally recommended to
+     * use higher level animation APIs that build on top [DecayAnimation], such as
+     * [Animatable.animateDecay], [AnimationState.animateDecay], etc.
      *
      * @param animationSpec Decay animation spec that defines the slow-down curve of the animation
      * @param typeConverter Type converter to convert the type [T] from and to [AnimationVector]
      * @param initialValue The starting value of the animation
      * @param initialVelocityVector The starting velocity of the animation in [AnimationVector] form
-     *
      * @see Animatable.animateDecay
      * @see AnimationState.animateDecay
      */
@@ -389,20 +397,19 @@
 
     /**
      * [DecayAnimation] is an animation that slows down from [initialVelocity] as time goes on.
-     * [DecayAnimation] is stateless, and it does not have any concept of lifecycle. It
-     * serves as an animation calculation engine that supports convenient query of value/velocity
-     * given a play time. To achieve that, [DecayAnimation] stores all the animation related
-     * information: [initialValue], [initialVelocity], [animationSpec], [typeConverter].
+     * [DecayAnimation] is stateless, and it does not have any concept of lifecycle. It serves as an
+     * animation calculation engine that supports convenient query of value/velocity given a play
+     * time. To achieve that, [DecayAnimation] stores all the animation related information:
+     * [initialValue], [initialVelocity], [animationSpec], [typeConverter].
      *
-     * __Note__: Unless there's a need to control the timing manually, it's
-     * generally recommended to use higher level animation APIs that build on top [DecayAnimation],
-     * such as [Animatable.animateDecay], [AnimationState.animateDecay], etc.
+     * __Note__: Unless there's a need to control the timing manually, it's generally recommended to
+     * use higher level animation APIs that build on top [DecayAnimation], such as
+     * [Animatable.animateDecay], [AnimationState.animateDecay], etc.
      *
      * @param animationSpec Decay animation spec that defines the slow-down curve of the animation
      * @param typeConverter Type converter to convert the type [T] from and to [AnimationVector]
      * @param initialValue The starting value of the animation
      * @param initialVelocity The starting velocity of the animation
-     *
      * @see Animatable.animateDecay
      * @see AnimationState.animateDecay
      */
@@ -419,19 +426,17 @@
     )
 
     init {
-        durationNanos = animationSpec.getDurationNanos(
-            initialValueVector, initialVelocityVector
-        )
-        endVelocity = animationSpec.getVelocityFromNanos(
-            durationNanos,
-            initialValueVector,
-            initialVelocityVector
-        ).copy()
+        durationNanos = animationSpec.getDurationNanos(initialValueVector, initialVelocityVector)
+        endVelocity =
+            animationSpec
+                .getVelocityFromNanos(durationNanos, initialValueVector, initialVelocityVector)
+                .copy()
         for (i in 0 until endVelocity.size) {
-            endVelocity[i] = endVelocity[i].coerceIn(
-                -animationSpec.absVelocityThreshold,
-                animationSpec.absVelocityThreshold
-            )
+            endVelocity[i] =
+                endVelocity[i].coerceIn(
+                    -animationSpec.absVelocityThreshold,
+                    animationSpec.absVelocityThreshold
+                )
         }
     }
 
@@ -463,15 +468,15 @@
 }
 
 /**
- * [DecayAnimation] is an animation that slows down from [initialVelocity] as
- * time goes on. [DecayAnimation] is stateless, and it does not have any concept of lifecycle. It
- * serves as an animation calculation engine that supports convenient query of value/velocity
- * given a play time. To achieve that, [DecayAnimation] stores all the animation related
- * information: [initialValue], [initialVelocity], decay animation spec.
+ * [DecayAnimation] is an animation that slows down from [initialVelocity] as time goes on.
+ * [DecayAnimation] is stateless, and it does not have any concept of lifecycle. It serves as an
+ * animation calculation engine that supports convenient query of value/velocity given a play time.
+ * To achieve that, [DecayAnimation] stores all the animation related information: [initialValue],
+ * [initialVelocity], decay animation spec.
  *
- * __Note__: Unless there's a need to control the timing manually, it's
- * generally recommended to use higher level animation APIs that build on top [DecayAnimation],
- * such as [Animatable.animateDecay], [animateDecay], etc.
+ * __Note__: Unless there's a need to control the timing manually, it's generally recommended to use
+ * higher level animation APIs that build on top [DecayAnimation], such as
+ * [Animatable.animateDecay], [animateDecay], etc.
  *
  * @param animationSpec decay animation that will be used
  * @param initialValue starting value that will be passed to the decay animation
@@ -481,9 +486,10 @@
     animationSpec: FloatDecayAnimationSpec,
     initialValue: Float,
     initialVelocity: Float = 0f
-) = DecayAnimation(
-    animationSpec.generateDecayAnimationSpec(),
-    Float.VectorConverter,
-    initialValue,
-    AnimationVector(initialVelocity)
-)
+) =
+    DecayAnimation(
+        animationSpec.generateDecayAnimationSpec(),
+        Float.VectorConverter,
+        initialValue,
+        AnimationVector(initialVelocity)
+    )
diff --git a/compose/animation/animation-core/src/commonMain/kotlin/androidx/compose/animation/core/AnimationEndReason.kt b/compose/animation/animation-core/src/commonMain/kotlin/androidx/compose/animation/core/AnimationEndReason.kt
index 0e56e86..1406399 100644
--- a/compose/animation/animation-core/src/commonMain/kotlin/androidx/compose/animation/core/AnimationEndReason.kt
+++ b/compose/animation/animation-core/src/commonMain/kotlin/androidx/compose/animation/core/AnimationEndReason.kt
@@ -16,21 +16,17 @@
 
 package androidx.compose.animation.core
 
-/**
- * Possible reasons for [Animatable]s to end.
- */
+/** Possible reasons for [Animatable]s to end. */
 enum class AnimationEndReason {
     /**
-     * Animation will be forced to end when its value reaches upper/lower bound (if they have
-     * been defined, e.g. via [Animatable.updateBounds])
+     * Animation will be forced to end when its value reaches upper/lower bound (if they have been
+     * defined, e.g. via [Animatable.updateBounds])
      *
-     * Unlike [Finished], when an animation ends due to [BoundReached], it often falls short
-     * from its initial target, and the remaining velocity is often non-zero. Both the end value
-     * and the remaining velocity can be obtained via [AnimationResult].
+     * Unlike [Finished], when an animation ends due to [BoundReached], it often falls short from
+     * its initial target, and the remaining velocity is often non-zero. Both the end value and the
+     * remaining velocity can be obtained via [AnimationResult].
      */
     BoundReached,
-    /**
-     * Animation has finished successfully without any interruption.
-     */
+    /** Animation has finished successfully without any interruption. */
     Finished
 }
diff --git a/compose/animation/animation-core/src/commonMain/kotlin/androidx/compose/animation/core/AnimationSpec.kt b/compose/animation/animation-core/src/commonMain/kotlin/androidx/compose/animation/core/AnimationSpec.kt
index 8833cf2..9ff3c19 100644
--- a/compose/animation/animation-core/src/commonMain/kotlin/androidx/compose/animation/core/AnimationSpec.kt
+++ b/compose/animation/animation-core/src/commonMain/kotlin/androidx/compose/animation/core/AnimationSpec.kt
@@ -35,14 +35,10 @@
 import kotlin.math.abs
 
 object AnimationConstants {
-    /**
-     * The default duration used in [VectorizedAnimationSpec]s and [AnimationSpec].
-     */
+    /** The default duration used in [VectorizedAnimationSpec]s and [AnimationSpec]. */
     const val DefaultDurationMillis: Int = 300
 
-    /**
-     * The value that is used when the animation time is not yet set.
-     */
+    /** The value that is used when the animation time is not yet set. */
     const val UnspecifiedTime: Long = Long.MIN_VALUE
 }
 
@@ -52,9 +48,9 @@
  * once the data (of type [T]) has been converted to [AnimationVector].
  *
  * Any type [T] can be animated by the system as long as a [TwoWayConverter] is supplied to convert
- * the data type [T] from and to an [AnimationVector]. There are a number of converters
- * available out of the box. For example, to animate [androidx.compose.ui.unit.IntOffset] the system
- * uses [IntOffset.VectorConverter][IntOffset.Companion.VectorConverter] to convert the object to
+ * the data type [T] from and to an [AnimationVector]. There are a number of converters available
+ * out of the box. For example, to animate [androidx.compose.ui.unit.IntOffset] the system uses
+ * [IntOffset.VectorConverter][IntOffset.Companion.VectorConverter] to convert the object to
  * [AnimationVector2D], so that both x and y dimensions are animated independently with separate
  * velocity tracking. This enables multidimensional objects to be animated in a true
  * multi-dimensional way. It is particularly useful for smoothly handling animation interruptions
@@ -65,10 +61,10 @@
      * Creates a [VectorizedAnimationSpec] with the given [TwoWayConverter].
      *
      * The underlying animation system operates on [AnimationVector]s. [T] will be converted to
-     * [AnimationVector] to animate. [VectorizedAnimationSpec] describes how the
-     * converted [AnimationVector] should be animated. E.g. The animation could simply
-     * interpolate between the start and end values (i.e.[TweenSpec]), or apply spring physics
-     * to produce the motion (i.e. [SpringSpec]), etc)
+     * [AnimationVector] to animate. [VectorizedAnimationSpec] describes how the converted
+     * [AnimationVector] should be animated. E.g. The animation could simply interpolate between the
+     * start and end values (i.e.[TweenSpec]), or apply spring physics to produce the motion (i.e.
+     * [SpringSpec]), etc)
      *
      * @param converter converts the type [T] from and to [AnimationVector] type
      */
@@ -122,19 +118,20 @@
 }
 
 /**
- *  This describes [AnimationSpec]s that are based on a fixed duration, such as [KeyframesSpec],
- *  [TweenSpec], and [SnapSpec]. These duration based specs can repeated when put into a
- *  [RepeatableSpec].
+ * This describes [AnimationSpec]s that are based on a fixed duration, such as [KeyframesSpec],
+ * [TweenSpec], and [SnapSpec]. These duration based specs can repeated when put into a
+ * [RepeatableSpec].
  */
 interface DurationBasedAnimationSpec<T> : FiniteAnimationSpec<T> {
-    override fun <V : AnimationVector> vectorize(converter: TwoWayConverter<T, V>):
-        VectorizedDurationBasedAnimationSpec<V>
+    override fun <V : AnimationVector> vectorize(
+        converter: TwoWayConverter<T, V>
+    ): VectorizedDurationBasedAnimationSpec<V>
 }
 
 /**
- * Creates a [SpringSpec] that uses the given spring constants (i.e. [dampingRatio] and
- * [stiffness]. The optional [visibilityThreshold] defines when the animation
- * should be considered to be visually close enough to round off to its target.
+ * Creates a [SpringSpec] that uses the given spring constants (i.e. [dampingRatio] and [stiffness].
+ * The optional [visibilityThreshold] defines when the animation should be considered to be visually
+ * close enough to round off to its target.
  *
  * @param dampingRatio damping ratio of the spring. [Spring.DampingRatioNoBouncy] by default.
  * @param stiffness stiffness of the spring. [Spring.StiffnessMedium] by default.
@@ -196,7 +193,6 @@
  * @param durationMillis Duration of the animation. [DefaultDurationMillis] by default.
  * @param delayMillis Time the animation waits before starting. 0 by default.
  * @param easing [Easing] applied on the animation curve. [FastOutSlowInEasing] by default.
- *
  * @see ArcMode
  * @see keyframes
  *
@@ -243,9 +239,9 @@
 
 /**
  * This class defines the two types of [StartOffset]: [StartOffsetType.Delay] and
- * [StartOffsetType.FastForward].
- * [StartOffsetType.Delay] delays the start of the animation, whereas [StartOffsetType.FastForward]
- * starts the animation right away from a given play time in the animation.
+ * [StartOffsetType.FastForward]. [StartOffsetType.Delay] delays the start of the animation, whereas
+ * [StartOffsetType.FastForward] starts the animation right away from a given play time in the
+ * animation.
  *
  * @see repeatable
  * @see infiniteRepeatable
@@ -254,14 +250,10 @@
 @kotlin.jvm.JvmInline
 value class StartOffsetType private constructor(internal val value: Int) {
     companion object {
-        /**
-         * Delays the start of the animation.
-         */
+        /** Delays the start of the animation. */
         val Delay = StartOffsetType(-1)
 
-        /**
-         * Fast forwards the animation to a given play time, and starts it immediately.
-         */
+        /** Fast forwards the animation to a given play time, and starts it immediately. */
         val FastForward = StartOffsetType(1)
     }
 }
@@ -287,24 +279,22 @@
      * [StartOffsetType.FastForward] starts the animation right away from [offsetMillis] in the
      * animation.
      */
-    constructor(offsetMillis: Int, offsetType: StartOffsetType = StartOffsetType.Delay) : this(
-        (offsetMillis * offsetType.value).toLong()
-    )
+    constructor(
+        offsetMillis: Int,
+        offsetType: StartOffsetType = StartOffsetType.Delay
+    ) : this((offsetMillis * offsetType.value).toLong())
 
-    /**
-     * Returns the number of milliseconds to offset the start of the animation.
-     */
+    /** Returns the number of milliseconds to offset the start of the animation. */
     val offsetMillis: Int
         get() = abs(this.value.toInt())
 
-    /**
-     * Returns the offset type of the provided [StartOffset].
-     */
+    /** Returns the offset type of the provided [StartOffset]. */
     val offsetType: StartOffsetType
-        get() = when (this.value > 0) {
-            true -> StartOffsetType.FastForward
-            false -> StartOffsetType.Delay
-        }
+        get() =
+            when (this.value > 0) {
+                true -> StartOffsetType.FastForward
+                false -> StartOffsetType.Delay
+            }
 }
 
 /**
@@ -319,15 +309,14 @@
  * the animation to a given play time. This start offset will **not** be repeated, whereas the delay
  * in the [animation] (if any) will be repeated. By default, the amount of offset is 0.
  *
- * @see repeatable
- * @see InfiniteRepeatableSpec
- * @see infiniteRepeatable
- *
  * @param iterations the count of iterations. Should be at least 1.
  * @param animation the [AnimationSpec] to be repeated
  * @param repeatMode whether animation should repeat by starting from the beginning (i.e.
- *                  [RepeatMode.Restart]) or from the end (i.e. [RepeatMode.Reverse])
+ *   [RepeatMode.Restart]) or from the end (i.e. [RepeatMode.Reverse])
  * @param initialStartOffset offsets the start of the animation
+ * @see repeatable
+ * @see InfiniteRepeatableSpec
+ * @see infiniteRepeatable
  */
 @Immutable
 class RepeatableSpec<T>(
@@ -337,10 +326,7 @@
     val initialStartOffset: StartOffset = StartOffset(0)
 ) : FiniteAnimationSpec<T> {
 
-    @Deprecated(
-        level = DeprecationLevel.HIDDEN,
-        message = "This constructor has been deprecated"
-    )
+    @Deprecated(level = DeprecationLevel.HIDDEN, message = "This constructor has been deprecated")
     constructor(
         iterations: Int,
         animation: DurationBasedAnimationSpec<T>,
@@ -351,7 +337,10 @@
         converter: TwoWayConverter<T, V>
     ): VectorizedFiniteAnimationSpec<V> {
         return VectorizedRepeatableSpec(
-            iterations, animation.vectorize(converter), repeatMode, initialStartOffset
+            iterations,
+            animation.vectorize(converter),
+            repeatMode,
+            initialStartOffset
         )
     }
 
@@ -372,8 +361,8 @@
 }
 
 /**
- * [InfiniteRepeatableSpec] repeats the provided [animation] infinite amount of times. It will
- * never naturally finish. This means the animation will only be stopped via some form of manual
+ * [InfiniteRepeatableSpec] repeats the provided [animation] infinite amount of times. It will never
+ * naturally finish. This means the animation will only be stopped via some form of manual
  * cancellation. When used with transition or other animation composables, the infinite animations
  * will stop when the composable is removed from the compose tree.
  *
@@ -387,7 +376,7 @@
  *
  * @param animation the [AnimationSpec] to be repeated
  * @param repeatMode whether animation should repeat by starting from the beginning (i.e.
- *                  [RepeatMode.Restart]) or from the end (i.e. [RepeatMode.Reverse])
+ *   [RepeatMode.Restart]) or from the end (i.e. [RepeatMode.Reverse])
  * @param initialStartOffset offsets the start of the animation
  * @see infiniteRepeatable
  */
@@ -398,10 +387,7 @@
     val initialStartOffset: StartOffset = StartOffset(0)
 ) : AnimationSpec<T> {
 
-    @Deprecated(
-        level = DeprecationLevel.HIDDEN,
-        message = "This constructor has been deprecated"
-    )
+    @Deprecated(level = DeprecationLevel.HIDDEN, message = "This constructor has been deprecated")
     constructor(
         animation: DurationBasedAnimationSpec<T>,
         repeatMode: RepeatMode = RepeatMode.Restart
@@ -411,13 +397,16 @@
         converter: TwoWayConverter<T, V>
     ): VectorizedAnimationSpec<V> {
         return VectorizedInfiniteRepeatableSpec(
-            animation.vectorize(converter), repeatMode, initialStartOffset
+            animation.vectorize(converter),
+            repeatMode,
+            initialStartOffset
         )
     }
 
     override fun equals(other: Any?): Boolean =
         if (other is InfiniteRepeatableSpec<*>) {
-            other.animation == this.animation && other.repeatMode == this.repeatMode &&
+            other.animation == this.animation &&
+                other.repeatMode == this.repeatMode &&
                 other.initialStartOffset == this.initialStartOffset
         } else {
             false
@@ -429,18 +418,12 @@
     }
 }
 
-/**
- * Repeat mode for [RepeatableSpec] and [VectorizedRepeatableSpec].
- */
+/** Repeat mode for [RepeatableSpec] and [VectorizedRepeatableSpec]. */
 enum class RepeatMode {
-    /**
-     * [Restart] will restart the animation and animate from the start value to the end value.
-     */
+    /** [Restart] will restart the animation and animate from the start value to the end value. */
     Restart,
 
-    /**
-     * [Reverse] will reverse the last iteration as the animation repeats.
-     */
+    /** [Reverse] will reverse the last iteration as the animation repeats. */
     Reverse
 }
 
@@ -449,7 +432,7 @@
  * the end value.
  *
  * @param delay the amount of time (in milliseconds) that the animation should wait before it
- *              starts. Defaults to 0.
+ *   starts. Defaults to 0.
  */
 @Immutable
 class SnapSpec<T>(val delay: Int = 0) : DurationBasedAnimationSpec<T> {
@@ -469,9 +452,7 @@
     }
 }
 
-/**
- * Shared configuration class used as DSL for keyframe based animations.
- */
+/** Shared configuration class used as DSL for keyframe based animations. */
 sealed class KeyframesSpecBaseConfig<T, E : KeyframeBaseEntity<T>> {
     /**
      * Duration of the animation in milliseconds. The minimum is `0` and defaults to
@@ -485,15 +466,11 @@
      * The amount of time that the animation should be delayed. The minimum is `0` and defaults
      * to 0.
      */
-    @get:IntRange(from = 0L)
-    @setparam:IntRange(from = 0L)
-    var delayMillis: Int = 0
+    @get:IntRange(from = 0L) @setparam:IntRange(from = 0L) var delayMillis: Int = 0
 
     internal val keyframes = mutableIntObjectMapOf<E>()
 
-    /**
-     * Method used to delegate instantiation of [E] to implementing classes.
-     */
+    /** Method used to delegate instantiation of [E] to implementing classes. */
     internal abstract fun createEntityFor(value: T): E
 
     /**
@@ -501,8 +478,8 @@
      *
      * @sample androidx.compose.animation.core.samples.floatAtSample
      *
-     * @param timeStamp The time in the during when animation should reach value: [this], with
-     * a minimum value of `0`.
+     * @param timeStamp The time in the during when animation should reach value: [this], with a
+     *   minimum value of `0`.
      * @return an instance of [E] so a custom [Easing] can be added by the [using] method.
      */
     // needed as `open` to guarantee binary compatibility in KeyframesSpecConfig
@@ -519,8 +496,8 @@
      *
      * @sample androidx.compose.animation.core.samples.floatAtFractionSample
      *
-     *  @param fraction The fraction when the animation should reach specified value.
-     *  @return an instance of [E] so a custom [Easing] can be added by the [using] method
+     * @param fraction The fraction when the animation should reach specified value.
+     * @return an instance of [E] so a custom [Easing] can be added by the [using] method
      */
     // needed as `open` to guarantee binary compatibility in KeyframesSpecConfig
     open infix fun T.atFraction(@FloatRange(from = 0.0, to = 1.0) fraction: Float): E {
@@ -528,10 +505,11 @@
     }
 
     /**
-     * Adds an [Easing] for the interval started with the just provided timestamp. For example:
-     *     0f at 50 using LinearEasing
+     * Adds an [Easing] for the interval started with the just provided timestamp. For example: 0f
+     * at 50 using LinearEasing
      *
      * @sample androidx.compose.animation.core.samples.KeyframesBuilderWithEasing
+     *
      * @param easing [Easing] to be used for the next interval.
      * @return the same [E] instance so that other implementations can expand on the builder pattern
      */
@@ -541,13 +519,8 @@
     }
 }
 
-/**
- * Base holder class for building a keyframes animation.
- */
-sealed class KeyframeBaseEntity<T>(
-    internal val value: T,
-    internal var easing: Easing
-) {
+/** Base holder class for building a keyframes animation. */
+sealed class KeyframeBaseEntity<T>(internal val value: T, internal var easing: Easing) {
     internal fun <V : AnimationVector> toPair(convertToVector: (T) -> V) =
         convertToVector.invoke(value) to easing
 }
@@ -555,15 +528,16 @@
 /**
  * [KeyframesSpec] creates a [VectorizedKeyframesSpec] animation.
  *
- * [VectorizedKeyframesSpec] animates based on the values defined at different timestamps in
- * the duration of the animation (i.e. different keyframes). Each keyframe can be defined using
+ * [VectorizedKeyframesSpec] animates based on the values defined at different timestamps in the
+ * duration of the animation (i.e. different keyframes). Each keyframe can be defined using
  * [KeyframesSpecConfig.at]. [VectorizedKeyframesSpec] allows very specific animation definitions
  * with a precision to millisecond.
  *
  * @sample androidx.compose.animation.core.samples.FloatKeyframesBuilder
  *
- * You can also provide a custom [Easing] for the interval with use of [with] function applied
- * for the interval starting keyframe.
+ * You can also provide a custom [Easing] for the interval with use of [with] function applied for
+ * the interval starting keyframe.
+ *
  * @sample androidx.compose.animation.core.samples.KeyframesBuilderWithEasing
  *
  * Values can be animated using arcs of quarter of an Ellipse with [KeyframesSpecConfig.using] and
@@ -574,12 +548,13 @@
 @Immutable
 class KeyframesSpec<T>(val config: KeyframesSpecConfig<T>) : DurationBasedAnimationSpec<T> {
     /**
-     * [KeyframesSpecConfig] stores a mutable configuration of the key frames, including [durationMillis],
-     * [delayMillis], and all the key frames. Each key frame defines what the animation value should be
-     * at a particular time. Once the key frames are fully configured, the [KeyframesSpecConfig]
-     * can be used to create a [KeyframesSpec].
+     * [KeyframesSpecConfig] stores a mutable configuration of the key frames, including
+     * [durationMillis], [delayMillis], and all the key frames. Each key frame defines what the
+     * animation value should be at a particular time. Once the key frames are fully configured, the
+     * [KeyframesSpecConfig] can be used to create a [KeyframesSpec].
      *
      * @sample androidx.compose.animation.core.samples.KeyframesBuilderForPosition
+     *
      * @see keyframes
      */
     class KeyframesSpecConfig<T> : KeyframesSpecBaseConfig<T, KeyframeEntity<T>>() {
@@ -588,29 +563,29 @@
 
         /**
          * Adds a keyframe so that animation value will be [this] at time: [timeStamp]. For example:
-         *     0.8f at 150 // ms
+         * 0.8f at 150 // ms
          *
-         * @param timeStamp The time in the during when animation should reach value: [this], with
-         * a minimum value of `0`.
+         * @param timeStamp The time in the during when animation should reach value: [this], with a
+         *   minimum value of `0`.
          * @return an [KeyframeEntity] so a custom [Easing] can be added by [with] method.
          */
         // TODO: Need a IntRange equivalent annotation
         // overrides `at` for binary compatibility. It should explicitly return KeyframeEntity.
         override infix fun T.at(@IntRange(from = 0) timeStamp: Int): KeyframeEntity<T> {
             @OptIn(ExperimentalAnimationSpecApi::class)
-            return KeyframeEntity(this).also {
-                keyframes[timeStamp] = it
-            }
+            return KeyframeEntity(this).also { keyframes[timeStamp] = it }
         }
 
         /**
-         * Adds a keyframe so that the animation value will be the value specified at a fraction of the total
-         * [durationMillis] set. For example:
-         *      0.8f atFraction 0.50f // half of the overall duration set
-         *  @param fraction The fraction when the animation should reach specified value.
-         *  @return an [KeyframeEntity] so a custom [Easing] can be added by [with] method
+         * Adds a keyframe so that the animation value will be the value specified at a fraction of
+         * the total [durationMillis] set. For example: 0.8f atFraction 0.50f // half of the overall
+         * duration set
+         *
+         * @param fraction The fraction when the animation should reach specified value.
+         * @return an [KeyframeEntity] so a custom [Easing] can be added by [with] method
          */
-        // overrides `atFraction` for binary compatibility. It should explicitly return KeyframeEntity.
+        // overrides `atFraction` for binary compatibility. It should explicitly return
+        // KeyframeEntity.
         override infix fun T.atFraction(
             @FloatRange(from = 0.0, to = 1.0) fraction: Float
         ): KeyframeEntity<T> {
@@ -619,16 +594,18 @@
 
         /**
          * Adds an [Easing] for the interval started with the just provided timestamp. For example:
-         *     0f at 50 with LinearEasing
+         * 0f at 50 with LinearEasing
          *
          * @sample androidx.compose.animation.core.samples.KeyframesBuilderWithEasing
+         *
          * @param easing [Easing] to be used for the next interval.
          * @return the same [KeyframeEntity] instance so that other implementations can expand on
-         * the builder pattern
+         *   the builder pattern
          */
         @Deprecated(
-            message = "Use version that returns an instance of the entity so it can be re-used" +
-                " in other keyframe builders.",
+            message =
+                "Use version that returns an instance of the entity so it can be re-used" +
+                    " in other keyframe builders.",
             replaceWith = ReplaceWith("this using easing") // Expected usage pattern
         )
         infix fun KeyframeEntity<T>.with(easing: Easing) {
@@ -667,11 +644,12 @@
             MutableIntObjectMap<VectorizedKeyframeSpecElementInfo<V>>(config.keyframes.size)
         config.keyframes.forEach { key, value ->
             timestamps.add(key)
-            timeToInfoMap[key] = VectorizedKeyframeSpecElementInfo(
-                vectorValue = converter.convertToVector(value.value),
-                easing = value.easing,
-                arcMode = value.arcMode
-            )
+            timeToInfoMap[key] =
+                VectorizedKeyframeSpecElementInfo(
+                    vectorValue = converter.convertToVector(value.value),
+                    easing = value.easing,
+                    arcMode = value.arcMode
+                )
         }
 
         if (!config.keyframes.contains(0)) {
@@ -692,11 +670,10 @@
         )
     }
 
-    /**
-     * Holder class for building a keyframes animation.
-     */
+    /** Holder class for building a keyframes animation. */
     @OptIn(ExperimentalAnimationSpecApi::class)
-    class KeyframeEntity<T> internal constructor(
+    class KeyframeEntity<T>
+    internal constructor(
         value: T,
         easing: Easing = LinearEasing,
         internal var arcMode: ArcMode = ArcMode.Companion.ArcLinear
@@ -723,11 +700,12 @@
  * Monotone cubic Hermite spline to interpolate between the values in [config].
  *
  * [KeyframesWithSplineSpec] is best used with 2D values such as [Offset]. For example:
+ *
  * @sample androidx.compose.animation.core.samples.KeyframesBuilderForOffsetWithSplines
  *
  * You may however, provide a [periodicBias] value (between 0f and 1f) to make a periodic spline.
- * Periodic splines adjust the initial and final velocity to be the same. This is useful to
- * create smooth repeatable animations. Such as an infinite pulsating animation:
+ * Periodic splines adjust the initial and final velocity to be the same. This is useful to create
+ * smooth repeatable animations. Such as an infinite pulsating animation:
  *
  * @sample androidx.compose.animation.core.samples.PeriodicKeyframesWithSplines
  *
@@ -738,7 +716,9 @@
  * - 0.5f: Modifies both velocities equally, picking the average between the two
  *
  * @see keyframesWithSpline
+ *
  * @sample androidx.compose.animation.core.samples.KeyframesBuilderForIntOffsetWithSplines
+ *
  * @sample androidx.compose.animation.core.samples.KeyframesBuilderForDpOffsetWithSplines
  */
 @ExperimentalAnimationSpecApi
@@ -753,9 +733,9 @@
      * Constructor that returns a periodic spline implementation.
      *
      * @param config Keyframe configuration of the spline, should contain the set of values,
-     * timestamps and easing curves to animate through.
+     *   timestamps and easing curves to animate through.
      * @param periodicBias A value from 0f to 1f, indicating how much the starting or ending
-     * velocities are modified respectively to achieve periodicity.
+     *   velocities are modified respectively to achieve periodicity.
      */
     constructor(
         config: KeyframesWithSplineSpecConfig<T>,
@@ -772,15 +752,15 @@
             KeyframesSpec.KeyframeEntity(value)
     }
 
-    override fun <V : AnimationVector> vectorize(converter: TwoWayConverter<T, V>):
-        VectorizedDurationBasedAnimationSpec<V> {
+    override fun <V : AnimationVector> vectorize(
+        converter: TwoWayConverter<T, V>
+    ): VectorizedDurationBasedAnimationSpec<V> {
         // Allocate so that we don't resize the list even if the initial/last timestamps are missing
         val timestamps = MutableIntList(config.keyframes.size + 2)
         val timeToVectorMap = MutableIntObjectMap<Pair<V, Easing>>(config.keyframes.size)
         config.keyframes.forEach { key, value ->
             timestamps.add(key)
-            timeToVectorMap[key] =
-                Pair(converter.convertToVector(value.value), value.easing)
+            timeToVectorMap[key] = Pair(converter.convertToVector(value.value), value.easing)
         }
         if (!config.keyframes.contains(0)) {
             timestamps.add(0, 0)
@@ -814,9 +794,9 @@
 ): TweenSpec<T> = TweenSpec(durationMillis, delayMillis, easing)
 
 /**
- * Creates a [SpringSpec] that uses the given spring constants (i.e. [dampingRatio] and
- * [stiffness]. The optional [visibilityThreshold] defines when the animation
- * should be considered to be visually close enough to round off to its target.
+ * Creates a [SpringSpec] that uses the given spring constants (i.e. [dampingRatio] and [stiffness].
+ * The optional [visibilityThreshold] defines when the animation should be considered to be visually
+ * close enough to round off to its target.
  *
  * @param dampingRatio damping ratio of the spring. [Spring.DampingRatioNoBouncy] by default.
  * @param stiffness stiffness of the spring. [Spring.StiffnessMedium] by default.
@@ -827,8 +807,7 @@
     dampingRatio: Float = Spring.DampingRatioNoBouncy,
     stiffness: Float = Spring.StiffnessMedium,
     visibilityThreshold: T? = null
-): SpringSpec<T> =
-    SpringSpec(dampingRatio, stiffness, visibilityThreshold)
+): SpringSpec<T> = SpringSpec(dampingRatio, stiffness, visibilityThreshold)
 
 /**
  * Creates a [KeyframesSpec] animation, initialized with [init]. For example:
@@ -848,9 +827,7 @@
  * @see KeyframesSpec.KeyframesSpecConfig
  */
 @Stable
-fun <T> keyframes(
-    init: KeyframesSpec.KeyframesSpecConfig<T>.() -> Unit
-): KeyframesSpec<T> {
+fun <T> keyframes(init: KeyframesSpec.KeyframesSpecConfig<T>.() -> Unit): KeyframesSpec<T> {
     return KeyframesSpec(KeyframesSpec.KeyframesSpecConfig<T>().apply(init))
 }
 
@@ -861,7 +838,9 @@
  *
  * @param init Initialization function for the [KeyframesWithSplineSpec] animation
  * @see KeyframesWithSplineSpec.KeyframesWithSplineSpecConfig
+ *
  * @sample androidx.compose.animation.core.samples.KeyframesBuilderForIntOffsetWithSplines
+ *
  * @sample androidx.compose.animation.core.samples.KeyframesBuilderForDpOffsetWithSplines
  */
 @ExperimentalAnimationSpecApi
@@ -889,7 +868,7 @@
  * - 0.5f: Modifies both velocities equally, picking the average between the two
  *
  * @param periodicBias A value from 0f to 1f, indicating how much the starting or ending velocities
- * are modified respectively to achieve periodicity.
+ *   are modified respectively to achieve periodicity.
  * @param init Initialization function for the [KeyframesWithSplineSpec] animation
  * @see KeyframesWithSplineSpec.KeyframesWithSplineSpecConfig
  */
@@ -904,11 +883,11 @@
     )
 
 /**
- * Creates a [RepeatableSpec] that plays a [DurationBasedAnimationSpec] (e.g.
- * [TweenSpec], [KeyframesSpec]) the amount of iterations specified by [iterations].
+ * Creates a [RepeatableSpec] that plays a [DurationBasedAnimationSpec] (e.g. [TweenSpec],
+ * [KeyframesSpec]) the amount of iterations specified by [iterations].
  *
- * The iteration count describes the amount of times the animation will run.
- * 1 means no repeat. Recommend [infiniteRepeatable] for creating an infinity repeating animation.
+ * The iteration count describes the amount of times the animation will run. 1 means no repeat.
+ * Recommend [infiniteRepeatable] for creating an infinity repeating animation.
  *
  * __Note__: When repeating in the [RepeatMode.Reverse] mode, it's highly recommended to have an
  * __odd__ number of iterations. Otherwise, the animation may jump to the end value when it finishes
@@ -921,7 +900,7 @@
  * @param iterations the total count of iterations, should be greater than 1 to repeat.
  * @param animation animation that will be repeated
  * @param repeatMode whether animation should repeat by starting from the beginning (i.e.
- *                  [RepeatMode.Restart]) or from the end (i.e. [RepeatMode.Reverse])
+ *   [RepeatMode.Restart]) or from the end (i.e. [RepeatMode.Reverse])
  * @param initialStartOffset offsets the start of the animation
  */
 @Stable
@@ -930,14 +909,14 @@
     animation: DurationBasedAnimationSpec<T>,
     repeatMode: RepeatMode = RepeatMode.Restart,
     initialStartOffset: StartOffset = StartOffset(0)
-): RepeatableSpec<T> =
-    RepeatableSpec(iterations, animation, repeatMode, initialStartOffset)
+): RepeatableSpec<T> = RepeatableSpec(iterations, animation, repeatMode, initialStartOffset)
 
 @Stable
 @Deprecated(
     level = DeprecationLevel.HIDDEN,
-    message = "This method has been deprecated in favor of the repeatable function that accepts" +
-        " start offset."
+    message =
+        "This method has been deprecated in favor of the repeatable function that accepts" +
+            " start offset."
 )
 fun <T> repeatable(
     iterations: Int,
@@ -946,8 +925,8 @@
 ) = RepeatableSpec(iterations, animation, repeatMode, StartOffset(0))
 
 /**
- * Creates a [InfiniteRepeatableSpec] that plays a [DurationBasedAnimationSpec] (e.g.
- * [TweenSpec], [KeyframesSpec]) infinite amount of iterations.
+ * Creates a [InfiniteRepeatableSpec] that plays a [DurationBasedAnimationSpec] (e.g. [TweenSpec],
+ * [KeyframesSpec]) infinite amount of iterations.
  *
  * For non-infinitely repeating animations, consider [repeatable].
  *
@@ -959,7 +938,7 @@
  *
  * @param animation animation that will be repeated
  * @param repeatMode whether animation should repeat by starting from the beginning (i.e.
- *                  [RepeatMode.Restart]) or from the end (i.e. [RepeatMode.Reverse])
+ *   [RepeatMode.Restart]) or from the end (i.e. [RepeatMode.Reverse])
  * @param initialStartOffset offsets the start of the animation
  */
 @Stable
@@ -967,14 +946,14 @@
     animation: DurationBasedAnimationSpec<T>,
     repeatMode: RepeatMode = RepeatMode.Restart,
     initialStartOffset: StartOffset = StartOffset(0)
-): InfiniteRepeatableSpec<T> =
-    InfiniteRepeatableSpec(animation, repeatMode, initialStartOffset)
+): InfiniteRepeatableSpec<T> = InfiniteRepeatableSpec(animation, repeatMode, initialStartOffset)
 
 @Stable
 @Deprecated(
     level = DeprecationLevel.HIDDEN,
-    message = "This method has been deprecated in favor of the infinite repeatable function that" +
-        " accepts start offset."
+    message =
+        "This method has been deprecated in favor of the infinite repeatable function that" +
+            " accepts start offset."
 )
 fun <T> infiniteRepeatable(
     animation: DurationBasedAnimationSpec<T>,
@@ -986,21 +965,18 @@
  *
  * @param delayMillis the number of milliseconds to wait before the animation runs. 0 by default.
  */
-@Stable
-fun <T> snap(delayMillis: Int = 0) = SnapSpec<T>(delayMillis)
+@Stable fun <T> snap(delayMillis: Int = 0) = SnapSpec<T>(delayMillis)
 
 /**
  * Returns an [AnimationSpec] that is the same as [animationSpec] with a delay of [startDelayNanos].
  */
 @Stable
-internal fun <T> delayed(
-    animationSpec: AnimationSpec<T>,
-    startDelayNanos: Long
-): AnimationSpec<T> = StartDelayAnimationSpec(animationSpec, startDelayNanos)
+internal fun <T> delayed(animationSpec: AnimationSpec<T>, startDelayNanos: Long): AnimationSpec<T> =
+    StartDelayAnimationSpec(animationSpec, startDelayNanos)
 
 /**
- * A [VectorizedAnimationSpec] that wraps [vectorizedAnimationSpec], giving it a start delay
- * of [startDelayNanos].
+ * A [VectorizedAnimationSpec] that wraps [vectorizedAnimationSpec], giving it a start delay of
+ * [startDelayNanos].
  */
 @Immutable
 private class StartDelayVectorizedAnimationSpec<V : AnimationVector>(
@@ -1010,47 +986,46 @@
     override val isInfinite: Boolean
         get() = vectorizedAnimationSpec.isInfinite
 
-    override fun getDurationNanos(
-        initialValue: V,
-        targetValue: V,
-        initialVelocity: V
-    ): Long = vectorizedAnimationSpec.getDurationNanos(
-        initialValue = initialValue,
-        targetValue = targetValue,
-        initialVelocity = initialVelocity
-    ) + startDelayNanos
+    override fun getDurationNanos(initialValue: V, targetValue: V, initialVelocity: V): Long =
+        vectorizedAnimationSpec.getDurationNanos(
+            initialValue = initialValue,
+            targetValue = targetValue,
+            initialVelocity = initialVelocity
+        ) + startDelayNanos
 
     override fun getVelocityFromNanos(
         playTimeNanos: Long,
         initialValue: V,
         targetValue: V,
         initialVelocity: V
-    ): V = if (playTimeNanos < startDelayNanos) {
-        initialVelocity
-    } else {
-        vectorizedAnimationSpec.getVelocityFromNanos(
-            playTimeNanos = playTimeNanos - startDelayNanos,
-            initialValue = initialValue,
-            targetValue = targetValue,
-            initialVelocity = initialVelocity
-        )
-    }
+    ): V =
+        if (playTimeNanos < startDelayNanos) {
+            initialVelocity
+        } else {
+            vectorizedAnimationSpec.getVelocityFromNanos(
+                playTimeNanos = playTimeNanos - startDelayNanos,
+                initialValue = initialValue,
+                targetValue = targetValue,
+                initialVelocity = initialVelocity
+            )
+        }
 
     override fun getValueFromNanos(
         playTimeNanos: Long,
         initialValue: V,
         targetValue: V,
         initialVelocity: V
-    ): V = if (playTimeNanos < startDelayNanos) {
-        initialValue
-    } else {
-        vectorizedAnimationSpec.getValueFromNanos(
-            playTimeNanos = playTimeNanos - startDelayNanos,
-            initialValue = initialValue,
-            targetValue = targetValue,
-            initialVelocity = initialVelocity
-        )
-    }
+    ): V =
+        if (playTimeNanos < startDelayNanos) {
+            initialValue
+        } else {
+            vectorizedAnimationSpec.getValueFromNanos(
+                playTimeNanos = playTimeNanos - startDelayNanos,
+                initialValue = initialValue,
+                targetValue = targetValue,
+                initialVelocity = initialVelocity
+            )
+        }
 
     override fun hashCode(): Int {
         return 31 * vectorizedAnimationSpec.hashCode() + startDelayNanos.hashCode()
@@ -1065,9 +1040,7 @@
     }
 }
 
-/**
- * An [AnimationSpec] that wraps [animationSpec], giving it a start delay of [startDelayNanos].
- */
+/** An [AnimationSpec] that wraps [animationSpec], giving it a start delay of [startDelayNanos]. */
 @Immutable
 private class StartDelayAnimationSpec<T>(
     val animationSpec: AnimationSpec<T>,
@@ -1088,7 +1061,6 @@
         if (other !is StartDelayAnimationSpec<*>) {
             return false
         }
-        return other.startDelayNanos == startDelayNanos &&
-            other.animationSpec == animationSpec
+        return other.startDelayNanos == startDelayNanos && other.animationSpec == animationSpec
     }
 }
diff --git a/compose/animation/animation-core/src/commonMain/kotlin/androidx/compose/animation/core/AnimationState.kt b/compose/animation/animation-core/src/commonMain/kotlin/androidx/compose/animation/core/AnimationState.kt
index 0959cbc..508db27 100644
--- a/compose/animation/animation-core/src/commonMain/kotlin/androidx/compose/animation/core/AnimationState.kt
+++ b/compose/animation/animation-core/src/commonMain/kotlin/androidx/compose/animation/core/AnimationState.kt
@@ -22,22 +22,20 @@
 import androidx.compose.runtime.setValue
 
 /**
- * [AnimationState] contains the necessary information to indicate the state of an animation.
- * Once an [AnimationState] is constructed, it can only be updated/mutated by animations. If
- * there's a need to mutate some of the fields of an [AnimationState], consider using [copy]
- * functions.
+ * [AnimationState] contains the necessary information to indicate the state of an animation. Once
+ * an [AnimationState] is constructed, it can only be updated/mutated by animations. If there's a
+ * need to mutate some of the fields of an [AnimationState], consider using [copy] functions.
  *
  * @param typeConverter [TwoWayConverter] to convert type [T] from and to [AnimationVector]
  * @param initialValue initial value of the [AnimationState]
- * @param initialVelocityVector initial velocity of the [AnimationState], null (i.e. no velocity)
- *                              by default.
+ * @param initialVelocityVector initial velocity of the [AnimationState], null (i.e. no velocity) by
+ *   default.
  * @param lastFrameTimeNanos last frame time of the animation, [AnimationConstants.UnspecifiedTime]
- *                           by default
+ *   by default
  * @param finishedTimeNanos the time that the animation finished successfully,
- *                          [AnimationConstants.UnspecifiedTime] until then
- *
- * @param isRunning whether the [AnimationState] is currently being updated by an animation.
- *                  False by default
+ *   [AnimationConstants.UnspecifiedTime] until then
+ * @param isRunning whether the [AnimationState] is currently being updated by an animation. False
+ *   by default
  */
 class AnimationState<T, V : AnimationVector>(
     val typeConverter: TwoWayConverter<T, V>,
@@ -47,15 +45,11 @@
     finishedTimeNanos: Long = AnimationConstants.UnspecifiedTime,
     isRunning: Boolean = false
 ) : State<T> {
-    /**
-     * Current value of the [AnimationState].
-     */
+    /** Current value of the [AnimationState]. */
     override var value: T by mutableStateOf(initialValue)
         internal set
 
-    /**
-     * Current velocity vector of the [AnimationState].
-     */
+    /** Current velocity vector of the [AnimationState]. */
     var velocityVector: V =
         initialVelocityVector?.copy() ?: typeConverter.createZeroVectorFrom(initialValue)
         internal set
@@ -84,15 +78,11 @@
     var finishedTimeNanos: Long = finishedTimeNanos
         internal set
 
-    /**
-     * Indicates whether the animation is currently running.
-     */
+    /** Indicates whether the animation is currently running. */
     var isRunning: Boolean = isRunning
         internal set
 
-    /**
-     * Velocity of type [T], converted from [velocityVector].
-     */
+    /** Velocity of type [T], converted from [velocityVector]. */
     val velocity: T
         get() = typeConverter.convertFromVector(velocityVector)
 
@@ -120,35 +110,26 @@
  *
  * @see [AnimationState.animateTo]
  */
-class AnimationScope<T, V : AnimationVector> internal constructor(
+class AnimationScope<T, V : AnimationVector>
+internal constructor(
     initialValue: T,
-    /**
-     * [TwoWayConverter] to convert type [T] from and to [AnimationVector].
-     */
+    /** [TwoWayConverter] to convert type [T] from and to [AnimationVector]. */
     val typeConverter: TwoWayConverter<T, V>,
     initialVelocityVector: V,
     lastFrameTimeNanos: Long,
-    /**
-     * Target value of the animation.
-     */
+    /** Target value of the animation. */
     val targetValue: T,
-    /**
-     * Start time of the animation in the [System.nanoTime] timebase.
-     */
-    @get:Suppress("MethodNameUnits")
-    val startTimeNanos: Long,
+    /** Start time of the animation in the [System.nanoTime] timebase. */
+    @get:Suppress("MethodNameUnits") val startTimeNanos: Long,
     isRunning: Boolean,
     private val onCancel: () -> Unit
 ) {
     // Externally immutable fields
-    /**
-     * Current value of the [AnimationScope].
-     */
+    /** Current value of the [AnimationScope]. */
     var value: T by mutableStateOf(initialValue)
         internal set
-    /**
-     * Current velocity vector of the [AnimationScope].
-     */
+
+    /** Current velocity vector of the [AnimationScope]. */
     var velocityVector: V = initialVelocityVector.copy()
         internal set
 
@@ -175,15 +156,12 @@
     @get:Suppress("MethodNameUnits")
     var finishedTimeNanos: Long = AnimationConstants.UnspecifiedTime
         internal set
-    /**
-     * Indicates whether the animation is currently running.
-     */
+
+    /** Indicates whether the animation is currently running. */
     var isRunning: Boolean by mutableStateOf(isRunning)
         internal set
 
-    /**
-     * Velocity of type [T], converted from [velocityVector].
-     */
+    /** Velocity of type [T], converted from [velocityVector]. */
     val velocity
         get() = typeConverter.convertFromVector(velocityVector)
 
@@ -200,9 +178,15 @@
      * Creates an [AnimationState] that populates all the fields in [AnimationState] from
      * [AnimationScope].
      */
-    fun toAnimationState() = AnimationState(
-        typeConverter, value, velocityVector, lastFrameTimeNanos, finishedTimeNanos, isRunning
-    )
+    fun toAnimationState() =
+        AnimationState(
+            typeConverter,
+            value,
+            velocityVector,
+            lastFrameTimeNanos,
+            finishedTimeNanos,
+            isRunning
+        )
 }
 
 /**
@@ -210,19 +194,18 @@
  * fields to be different in the new [AnimationState].
  *
  * @param value value of the [AnimationState], using the value of the given [AnimationState] by
- *              default
+ *   default
  * @param velocityVector velocity of the [AnimationState], using the velocity of the given
- *                       [AnimationState] by default.
+ *   [AnimationState] by default.
  * @param lastFrameTimeNanos last frame time of the animation, same as the given [AnimationState] by
- *                           default
+ *   default
  * @param finishedTimeNanos the time that the animation finished successfully,
- *                          [AnimationConstants.UnspecifiedTime] until then. Default value is the
- *                          same as the given [AnimationState].
- * @param isRunning whether the [AnimationState] is currently being updated by an animation.
- *                  Same as the given [AnimationState] by default
- *
+ *   [AnimationConstants.UnspecifiedTime] until then. Default value is the same as the given
+ *   [AnimationState].
+ * @param isRunning whether the [AnimationState] is currently being updated by an animation. Same as
+ *   the given [AnimationState] by default
  * @return A new [AnimationState] instance copied from the given instance, with some fields
- *         optionally altered
+ *   optionally altered
  */
 fun <T, V : AnimationVector> AnimationState<T, V>.copy(
     value: T = this.value,
@@ -232,7 +215,12 @@
     isRunning: Boolean = this.isRunning
 ): AnimationState<T, V> =
     AnimationState(
-        this.typeConverter, value, velocityVector, lastFrameTimeNanos, finishedTimeNanos, isRunning
+        this.typeConverter,
+        value,
+        velocityVector,
+        lastFrameTimeNanos,
+        finishedTimeNanos,
+        isRunning
     )
 
 /**
@@ -240,18 +228,17 @@
  * type. This function allows some of the fields to be different in the new [AnimationState].
  *
  * @param value value of the [AnimationState], using the value of the given [AnimationState] by
- *              default
+ *   default
  * @param velocity velocity of the [AnimationState], using the velocity of the given
- *                 [AnimationState] by default.
+ *   [AnimationState] by default.
  * @param lastFrameTimeNanos last frame time of the animation, same as the given [AnimationState] by
- *                      default
+ *   default
  * @param finishedTimeNanos the time that the animation finished successfully, same as the given
- *                     [AnimationState] by default.
- * @param isRunning whether the [AnimationState] is currently being updated by an animation.
- *                  Same as the given [AnimationState] by default
- *
+ *   [AnimationState] by default.
+ * @param isRunning whether the [AnimationState] is currently being updated by an animation. Same as
+ *   the given [AnimationState] by default
  * @return A new [AnimationState] instance copied from the given instance, with some fields
- *         optionally altered
+ *   optionally altered
  */
 fun AnimationState<Float, AnimationVector1D>.copy(
     value: Float = this.value,
@@ -275,12 +262,11 @@
  * @param initialValue initial value of the [AnimationState]
  * @param initialVelocity initial velocity of the [AnimationState], 0 (i.e. no velocity) by default
  * @param lastFrameTimeNanos last frame time of the animation, [AnimationConstants.UnspecifiedTime]
- *                           by default
+ *   by default
  * @param finishedTimeNanos the time that the animation finished successfully,
- *                          [AnimationConstants.UnspecifiedTime] by default.
- * @param isRunning whether the [AnimationState] is currently being updated by an animation.
- *                  False by default
- *
+ *   [AnimationConstants.UnspecifiedTime] by default.
+ * @param isRunning whether the [AnimationState] is currently being updated by an animation. False
+ *   by default
  * @return A new [AnimationState] instance
  */
 fun AnimationState(
@@ -306,12 +292,12 @@
  * @param typeConverter [TwoWayConverter] to convert type [T] from and to [AnimationVector]
  * @param initialValue initial value of the [AnimationState]
  * @param initialVelocity initial velocity of the [AnimationState]
- * @param lastFrameTimeNanos last frame time of the animation, [AnimationConstants.UnspecifiedTime] by default
- * @param finishedTimeNanos the time that the animation finished successfully, [AnimationConstants.UnspecifiedTime] by
- *                     default.
- * @param isRunning whether the [AnimationState] is currently being updated by an animation.
- *                  False by default
- *
+ * @param lastFrameTimeNanos last frame time of the animation, [AnimationConstants.UnspecifiedTime]
+ *   by default
+ * @param finishedTimeNanos the time that the animation finished successfully,
+ *   [AnimationConstants.UnspecifiedTime] by default.
+ * @param isRunning whether the [AnimationState] is currently being updated by an animation. False
+ *   by default
  * @return A new [AnimationState] instance
  */
 fun <T, V : AnimationVector> AnimationState(
@@ -333,8 +319,8 @@
 }
 
 /**
- * Creates an AnimationVector with all the values set to 0 using the provided [TwoWayConverter]
- * and the [value].
+ * Creates an AnimationVector with all the values set to 0 using the provided [TwoWayConverter] and
+ * the [value].
  *
  * @return a new AnimationVector instance of type [V].
  */
diff --git a/compose/animation/animation-core/src/commonMain/kotlin/androidx/compose/animation/core/AnimationVectors.kt b/compose/animation/animation-core/src/commonMain/kotlin/androidx/compose/animation/core/AnimationVectors.kt
index b04031a3..5d574f1 100644
--- a/compose/animation/animation-core/src/commonMain/kotlin/androidx/compose/animation/core/AnimationVectors.kt
+++ b/compose/animation/animation-core/src/commonMain/kotlin/androidx/compose/animation/core/AnimationVectors.kt
@@ -27,10 +27,13 @@
  */
 sealed class AnimationVector {
     internal abstract fun reset()
+
     internal abstract fun newVector(): AnimationVector
 
     internal abstract operator fun get(index: Int): Float
+
     internal abstract operator fun set(index: Int, value: Float)
+
     internal abstract val size: Int
 }
 
@@ -66,16 +69,10 @@
  * @param v3 value to set on the third dimension
  * @param v4 value to set on the fourth dimension
  */
-fun AnimationVector(
-    v1: Float,
-    v2: Float,
-    v3: Float,
-    v4: Float
-) = AnimationVector4D(v1, v2, v3, v4)
+fun AnimationVector(v1: Float, v2: Float, v3: Float, v4: Float) = AnimationVector4D(v1, v2, v3, v4)
 
 internal fun <T : AnimationVector> T.newInstance(): T {
-    @Suppress("UNCHECKED_CAST")
-    return this.newVector() as T
+    @Suppress("UNCHECKED_CAST") return this.newVector() as T
 }
 
 internal fun <T : AnimationVector> T.copy(): T {
@@ -99,9 +96,7 @@
  * @param initVal initial value to set the [value] field to.
  */
 class AnimationVector1D(initVal: Float) : AnimationVector() {
-    /**
-     * This field holds the only Float value in this [AnimationVector1D] object.
-     */
+    /** This field holds the only Float value in this [AnimationVector1D] object. */
     var value: Float = initVal
         internal set
 
@@ -111,6 +106,7 @@
     }
 
     override fun newVector(): AnimationVector1D = AnimationVector1D(0f)
+
     override fun get(index: Int): Float {
         if (index == 0) {
             return value
@@ -131,8 +127,7 @@
         return "AnimationVector1D: value = $value"
     }
 
-    override fun equals(other: Any?): Boolean =
-        other is AnimationVector1D && other.value == value
+    override fun equals(other: Any?): Boolean = other is AnimationVector1D && other.value == value
 
     override fun hashCode(): Int = value.hashCode()
 }
@@ -144,15 +139,11 @@
  * @param v2 initial value to set on the second dimension
  */
 class AnimationVector2D(v1: Float, v2: Float) : AnimationVector() {
-    /**
-     * Float value field for the first dimension of the 2D vector.
-     */
+    /** Float value field for the first dimension of the 2D vector. */
     var v1: Float = v1
         internal set
 
-    /**
-     * Float value field for the second dimension of the 2D vector.
-     */
+    /** Float value field for the second dimension of the 2D vector. */
     var v2: Float = v2
         internal set
 
@@ -163,6 +154,7 @@
     }
 
     override fun newVector(): AnimationVector2D = AnimationVector2D(0f, 0f)
+
     override fun get(index: Int): Float {
         return when (index) {
             0 -> v1
@@ -199,21 +191,15 @@
  */
 class AnimationVector3D(v1: Float, v2: Float, v3: Float) : AnimationVector() {
     // Internally mutable, so we don't have to create a number of small objects per anim frame
-    /**
-     * Float value field for the first dimension of the 3D vector.
-     */
+    /** Float value field for the first dimension of the 3D vector. */
     var v1: Float = v1
         internal set
 
-    /**
-     * Float value field for the second dimension of the 3D vector.
-     */
+    /** Float value field for the second dimension of the 3D vector. */
     var v2: Float = v2
         internal set
 
-    /**
-     * Float value field for the third dimension of the 3D vector.
-     */
+    /** Float value field for the third dimension of the 3D vector. */
     var v3: Float = v3
         internal set
 
@@ -265,27 +251,19 @@
  */
 class AnimationVector4D(v1: Float, v2: Float, v3: Float, v4: Float) : AnimationVector() {
     // Internally mutable, so we don't have to create a number of small objects per anim frame
-    /**
-     * Float value field for the first dimension of the 4D vector.
-     */
+    /** Float value field for the first dimension of the 4D vector. */
     var v1: Float = v1
         internal set
 
-    /**
-     * Float value field for the second dimension of the 4D vector.
-     */
+    /** Float value field for the second dimension of the 4D vector. */
     var v2: Float = v2
         internal set
 
-    /**
-     * Float value field for the third dimension of the 4D vector.
-     */
+    /** Float value field for the third dimension of the 4D vector. */
     var v3: Float = v3
         internal set
 
-    /**
-     * Float value field for the fourth dimension of the 4D vector.
-     */
+    /** Float value field for the fourth dimension of the 4D vector. */
     var v4: Float = v4
         internal set
 
diff --git a/compose/animation/animation-core/src/commonMain/kotlin/androidx/compose/animation/core/ArcSpline.kt b/compose/animation/animation-core/src/commonMain/kotlin/androidx/compose/animation/core/ArcSpline.kt
index 1ede230..bc934c3 100644
--- a/compose/animation/animation-core/src/commonMain/kotlin/androidx/compose/animation/core/ArcSpline.kt
+++ b/compose/animation/animation-core/src/commonMain/kotlin/androidx/compose/animation/core/ArcSpline.kt
@@ -22,20 +22,15 @@
 import kotlin.math.sin
 
 /**
- * This provides a curve fit system that stitches the x,y path together with
- * quarter ellipses.
+ * This provides a curve fit system that stitches the x,y path together with quarter ellipses.
  *
  * @param arcModes Array of arc mode values. Expected to be of size n - 1.
  * @param timePoints Array of timestamps. Expected to be of size n. Seconds preferred.
  * @param y Array of values (of size n), where each value is spread on a [FloatArray] for each of
- * its dimensions, expected to be of even size since two values are needed to interpolate arcs.
+ *   its dimensions, expected to be of even size since two values are needed to interpolate arcs.
  */
 @ExperimentalAnimationSpecApi
-internal class ArcSpline(
-    arcModes: IntArray,
-    timePoints: FloatArray,
-    y: Array<FloatArray>
-) {
+internal class ArcSpline(arcModes: IntArray, timePoints: FloatArray, y: Array<FloatArray>) {
     private val arcs: Array<Array<Arc>>
     private val isExtrapolate = true
 
@@ -43,46 +38,42 @@
         var mode = StartVertical
         var last = StartVertical
 
-        arcs = Array(timePoints.size - 1) { i ->
-            when (arcModes[i]) {
-                ArcStartVertical -> {
-                    mode = StartVertical
-                    last = mode
+        arcs =
+            Array(timePoints.size - 1) { i ->
+                when (arcModes[i]) {
+                    ArcStartVertical -> {
+                        mode = StartVertical
+                        last = mode
+                    }
+                    ArcStartHorizontal -> {
+                        mode = StartHorizontal
+                        last = mode
+                    }
+                    ArcStartFlip -> {
+                        mode = if (last == StartVertical) StartHorizontal else StartVertical
+                        last = mode
+                    }
+                    ArcStartLinear -> mode = StartLinear
+                    ArcAbove -> mode = UpArc
+                    ArcBelow -> mode = DownArc
                 }
-
-                ArcStartHorizontal -> {
-                    mode = StartHorizontal
-                    last = mode
+                val dim = y[i].size / 2 + y[i].size % 2
+                Array(dim) { j ->
+                    val k = j * 2
+                    Arc(
+                        mode = mode,
+                        time1 = timePoints[i],
+                        time2 = timePoints[i + 1],
+                        x1 = y[i][k],
+                        y1 = y[i][k + 1],
+                        x2 = y[i + 1][k],
+                        y2 = y[i + 1][k + 1]
+                    )
                 }
-
-                ArcStartFlip -> {
-                    mode = if (last == StartVertical) StartHorizontal else StartVertical
-                    last = mode
-                }
-
-                ArcStartLinear -> mode = StartLinear
-                ArcAbove -> mode = UpArc
-                ArcBelow -> mode = DownArc
             }
-            val dim = y[i].size / 2 + y[i].size % 2
-            Array(dim) { j ->
-                val k = j * 2
-                Arc(
-                    mode = mode,
-                    time1 = timePoints[i],
-                    time2 = timePoints[i + 1],
-                    x1 = y[i][k],
-                    y1 = y[i][k + 1],
-                    x2 = y[i + 1][k],
-                    y2 = y[i + 1][k + 1]
-                )
-            }
-        }
     }
 
-    /**
-     * get the values of the at t point in time.
-     */
+    /** get the values of the at t point in time. */
     fun getPos(time: Float, v: FloatArray) {
         var t = time
         if (isExtrapolate) {
@@ -150,9 +141,7 @@
         }
     }
 
-    /**
-     * Get the differential which of the curves at point t
-     */
+    /** Get the differential which of the curves at point t */
     fun getSlope(time: Float, v: FloatArray) {
         var t = time
         if (t < arcs[0][0].time1) {
@@ -187,7 +176,8 @@
         }
     }
 
-    class Arc internal constructor(
+    class Arc
+    internal constructor(
         mode: Int,
         val time1: Float,
         val time2: Float,
@@ -214,12 +204,13 @@
         init {
             val dx = x2 - x1
             val dy = y2 - y1
-            isVertical = when (mode) {
-                StartVertical -> true
-                UpArc -> dy < 0
-                DownArc -> dy > 0
-                else -> false
-            }
+            isVertical =
+                when (mode) {
+                    StartVertical -> true
+                    UpArc -> dy < 0
+                    DownArc -> dy > 0
+                    else -> false
+                }
             oneOverDeltaTime = 1 / (this.time2 - this.time1)
 
             var isLinear = false
@@ -362,6 +353,7 @@
                     _ourPercent = FloatArray(91)
                     return _ourPercent!!
                 }
+
             private const val Epsilon = 0.001f
         }
     }
diff --git a/compose/animation/animation-core/src/commonMain/kotlin/androidx/compose/animation/core/ComplexDouble.kt b/compose/animation/animation-core/src/commonMain/kotlin/androidx/compose/animation/core/ComplexDouble.kt
index 50e8854..0a2ceb2 100644
--- a/compose/animation/animation-core/src/commonMain/kotlin/androidx/compose/animation/core/ComplexDouble.kt
+++ b/compose/animation/animation-core/src/commonMain/kotlin/androidx/compose/animation/core/ComplexDouble.kt
@@ -26,6 +26,7 @@
         get() {
             return _real
         }
+
     val imaginary: Double
         get() {
             return _imaginary
@@ -75,9 +76,7 @@
     }
 }
 
-/**
- * Returns the roots of the polynomial [a]x^2+[b]x+[c]=0 which may be complex.
- */
+/** Returns the roots of the polynomial [a]x^2+[b]x+[c]=0 which may be complex. */
 internal fun complexQuadraticFormula(
     a: Double,
     b: Double,
@@ -90,14 +89,13 @@
     return firstRoot to secondRoot
 }
 
-/**
- * Returns the square root of [num] which may be imaginary.
- */
-internal fun complexSqrt(num: Double): ComplexDouble = if (num < 0.0) {
-    ComplexDouble(0.0, sqrt(abs(num)))
-} else {
-    ComplexDouble(sqrt(num), 0.0)
-}
+/** Returns the square root of [num] which may be imaginary. */
+internal fun complexSqrt(num: Double): ComplexDouble =
+    if (num < 0.0) {
+        ComplexDouble(0.0, sqrt(abs(num)))
+    } else {
+        ComplexDouble(sqrt(num), 0.0)
+    }
 
 internal inline operator fun Double.plus(other: ComplexDouble): ComplexDouble {
     return other + this
diff --git a/compose/animation/animation-core/src/commonMain/kotlin/androidx/compose/animation/core/DecayAnimationSpec.kt b/compose/animation/animation-core/src/commonMain/kotlin/androidx/compose/animation/core/DecayAnimationSpec.kt
index 58a3561..964a3c0 100644
--- a/compose/animation/animation-core/src/commonMain/kotlin/androidx/compose/animation/core/DecayAnimationSpec.kt
+++ b/compose/animation/animation-core/src/commonMain/kotlin/androidx/compose/animation/core/DecayAnimationSpec.kt
@@ -25,9 +25,9 @@
  * used once the data (of type [T]) has been converted to [AnimationVector].
  *
  * Any type [T] can be animated by the system as long as a [TwoWayConverter] is supplied to convert
- * the data type [T] from and to an [AnimationVector]. There are a number of converters
- * available out of the box. For example, to animate [androidx.compose.ui.unit.IntOffset] the system
- * uses [IntOffset.VectorConverter][IntOffset.Companion.VectorConverter] to convert the object to
+ * the data type [T] from and to an [AnimationVector]. There are a number of converters available
+ * out of the box. For example, to animate [androidx.compose.ui.unit.IntOffset] the system uses
+ * [IntOffset.VectorConverter][IntOffset.Companion.VectorConverter] to convert the object to
  * [AnimationVector2D], so that both x and y dimensions are animated independently with separate
  * velocity tracking. This enables multidimensional objects to be animated in a true
  * multi-dimensional way. It is particularly useful for smoothly handling animation interruptions
@@ -39,8 +39,8 @@
      * Creates a [VectorizedDecayAnimationSpec] with the given [TwoWayConverter].
      *
      * The underlying animation system operates on [AnimationVector]s. [T] will be converted to
-     * [AnimationVector] to animate. [VectorizedDecayAnimationSpec] describes how the
-     * converted [AnimationVector] should be animated.
+     * [AnimationVector] to animate. [VectorizedDecayAnimationSpec] describes how the converted
+     * [AnimationVector] should be animated.
      *
      * @param typeConverter converts the type [T] from and to [AnimationVector] type
      */
@@ -61,10 +61,11 @@
     initialVelocity: T
 ): T {
     val vectorizedSpec = vectorize(typeConverter)
-    val targetVector = vectorizedSpec.getTargetValue(
-        typeConverter.convertToVector(initialValue),
-        typeConverter.convertToVector(initialVelocity)
-    )
+    val targetVector =
+        vectorizedSpec.getTargetValue(
+            typeConverter.convertToVector(initialValue),
+            typeConverter.convertToVector(initialVelocity)
+        )
     return typeConverter.convertFromVector(targetVector)
 }
 
@@ -79,10 +80,11 @@
     initialVelocity: Float
 ): Float {
     val vectorizedSpec = vectorize(Float.VectorConverter)
-    val targetVector = vectorizedSpec.getTargetValue(
-        AnimationVector(initialValue),
-        AnimationVector(initialVelocity)
-    )
+    val targetVector =
+        vectorizedSpec.getTargetValue(
+            AnimationVector(initialValue),
+            AnimationVector(initialVelocity)
+        )
     return targetVector.value
 }
 
@@ -97,19 +99,11 @@
  *
  * @param frictionMultiplier The decay friction multiplier. This must be greater than `0`.
  * @param absVelocityThreshold The minimum speed, below which the animation is considered finished.
- * Must be greater than `0`.
+ *   Must be greater than `0`.
  */
 fun <T> exponentialDecay(
-    @FloatRange(
-        from = 0.0,
-        fromInclusive = false
-    )
-    frictionMultiplier: Float = 1f,
-    @FloatRange(
-        from = 0.0,
-        fromInclusive = false
-    )
-    absVelocityThreshold: Float = 0.1f
+    @FloatRange(from = 0.0, fromInclusive = false) frictionMultiplier: Float = 1f,
+    @FloatRange(from = 0.0, fromInclusive = false) absVelocityThreshold: Float = 0.1f
 ): DecayAnimationSpec<T> =
     FloatExponentialDecaySpec(frictionMultiplier, absVelocityThreshold).generateDecayAnimationSpec()
 
@@ -121,9 +115,8 @@
     return DecayAnimationSpecImpl(this)
 }
 
-private class DecayAnimationSpecImpl<T>(
-    private val floatDecaySpec: FloatDecayAnimationSpec
-) : DecayAnimationSpec<T> {
+private class DecayAnimationSpecImpl<T>(private val floatDecaySpec: FloatDecayAnimationSpec) :
+    DecayAnimationSpec<T> {
     override fun <V : AnimationVector> vectorize(
         typeConverter: TwoWayConverter<T, V>
     ): VectorizedDecayAnimationSpec<V> = VectorizedFloatDecaySpec(floatDecaySpec)
@@ -142,11 +135,8 @@
             valueVector = initialValue.newInstance()
         }
         for (i in 0 until valueVector.size) {
-            valueVector[i] = floatDecaySpec.getValueFromNanos(
-                playTimeNanos,
-                initialValue[i],
-                initialVelocity[i]
-            )
+            valueVector[i] =
+                floatDecaySpec.getValueFromNanos(playTimeNanos, initialValue[i], initialVelocity[i])
         }
         return valueVector
     }
@@ -157,10 +147,11 @@
             velocityVector = initialValue.newInstance()
         }
         for (i in 0 until velocityVector.size) {
-            maxDuration = maxOf(
-                maxDuration,
-                floatDecaySpec.getDurationNanos(initialValue[i], initialVelocity[i])
-            )
+            maxDuration =
+                maxOf(
+                    maxDuration,
+                    floatDecaySpec.getDurationNanos(initialValue[i], initialVelocity[i])
+                )
         }
         return maxDuration
     }
@@ -170,11 +161,12 @@
             velocityVector = initialValue.newInstance()
         }
         for (i in 0 until velocityVector.size) {
-            velocityVector[i] = floatDecaySpec.getVelocityFromNanos(
-                playTimeNanos,
-                initialValue[i],
-                initialVelocity[i]
-            )
+            velocityVector[i] =
+                floatDecaySpec.getVelocityFromNanos(
+                    playTimeNanos,
+                    initialValue[i],
+                    initialVelocity[i]
+                )
         }
         return velocityVector
     }
@@ -184,10 +176,7 @@
             targetVector = initialValue.newInstance()
         }
         for (i in 0 until targetVector.size) {
-            targetVector[i] = floatDecaySpec.getTargetValue(
-                initialValue[i],
-                initialVelocity[i]
-            )
+            targetVector[i] = floatDecaySpec.getTargetValue(initialValue[i], initialVelocity[i])
         }
         return targetVector
     }
diff --git a/compose/animation/animation-core/src/commonMain/kotlin/androidx/compose/animation/core/DeferredTargetAnimation.kt b/compose/animation/animation-core/src/commonMain/kotlin/androidx/compose/animation/core/DeferredTargetAnimation.kt
index 1844447..3b59987 100644
--- a/compose/animation/animation-core/src/commonMain/kotlin/androidx/compose/animation/core/DeferredTargetAnimation.kt
+++ b/compose/animation/animation-core/src/commonMain/kotlin/androidx/compose/animation/core/DeferredTargetAnimation.kt
@@ -29,14 +29,14 @@
 annotation class ExperimentalAnimatableApi
 
 /**
- * [DeferredTargetAnimation] is intended for animations where the target is unknown at the time
- * of instantiation. Such use cases include, but are not limited to, size or position animations
+ * [DeferredTargetAnimation] is intended for animations where the target is unknown at the time of
+ * instantiation. Such use cases include, but are not limited to, size or position animations
  * created during composition or the initialization of a Modifier.Node, yet the target size or
  * position stays unknown until the later measure and placement phase.
  *
- * [DeferredTargetAnimation] offers a declarative [updateTarget] function, which requires a
- * target to either set up the animation or update the animation, and to read the current value
- * of the animation.
+ * [DeferredTargetAnimation] offers a declarative [updateTarget] function, which requires a target
+ * to either set up the animation or update the animation, and to read the current value of the
+ * animation.
  *
  * @sample androidx.compose.animation.core.samples.DeferredTargetAnimationSample
  */
@@ -44,15 +44,14 @@
 class DeferredTargetAnimation<T, V : AnimationVector>(
     private val vectorConverter: TwoWayConverter<T, V>
 ) {
-    /**
-     * Returns the target value from the most recent [updateTarget] call.
-     */
+    /** Returns the target value from the most recent [updateTarget] call. */
     val pendingTarget: T?
         get() = _pendingTarget
 
     private var _pendingTarget: T? by mutableStateOf(null)
     private val target: T?
         get() = animatable?.targetValue
+
     private var animatable: Animatable<T, V>? = null
 
     /**
diff --git a/compose/animation/animation-core/src/commonMain/kotlin/androidx/compose/animation/core/Easing.kt b/compose/animation/animation-core/src/commonMain/kotlin/androidx/compose/animation/core/Easing.kt
index f69cb99..ceea13f 100644
--- a/compose/animation/animation-core/src/commonMain/kotlin/androidx/compose/animation/core/Easing.kt
+++ b/compose/animation/animation-core/src/commonMain/kotlin/androidx/compose/animation/core/Easing.kt
@@ -24,11 +24,11 @@
 import androidx.compose.ui.util.fastCoerceIn
 
 /**
- * Easing is a way to adjust an animation’s fraction. Easing allows transitioning
- * elements to speed up and slow down, rather than moving at a constant rate.
+ * Easing is a way to adjust an animation’s fraction. Easing allows transitioning elements to speed
+ * up and slow down, rather than moving at a constant rate.
  *
- * Fraction is a value between 0 and 1.0 indicating our current point in
- * the animation where 0 represents the start and 1.0 represents the end.
+ * Fraction is a value between 0 and 1.0 indicating our current point in the animation where 0
+ * represents the start and 1.0 represents the end.
  *
  * An [Easing] must map fraction=0.0 to 0.0 and fraction=1.0 to 1.0.
  */
@@ -38,35 +38,35 @@
 }
 
 /**
- * Elements that begin and end at rest use this standard easing. They speed up quickly
- * and slow down gradually, in order to emphasize the end of the transition.
+ * Elements that begin and end at rest use this standard easing. They speed up quickly and slow down
+ * gradually, in order to emphasize the end of the transition.
  *
- * Standard easing puts subtle attention at the end of an animation, by giving more
- * time to deceleration than acceleration. It is the most common form of easing.
+ * Standard easing puts subtle attention at the end of an animation, by giving more time to
+ * deceleration than acceleration. It is the most common form of easing.
  *
  * This is equivalent to the Android `FastOutSlowInInterpolator`
  */
 val FastOutSlowInEasing: Easing = CubicBezierEasing(0.4f, 0.0f, 0.2f, 1.0f)
 
 /**
- * Incoming elements are animated using deceleration easing, which starts a transition
- * at peak velocity (the fastest point of an element’s movement) and ends at rest.
+ * Incoming elements are animated using deceleration easing, which starts a transition at peak
+ * velocity (the fastest point of an element’s movement) and ends at rest.
  *
  * This is equivalent to the Android `LinearOutSlowInInterpolator`
  */
 val LinearOutSlowInEasing: Easing = CubicBezierEasing(0.0f, 0.0f, 0.2f, 1.0f)
 
 /**
- * Elements exiting a screen use acceleration easing, where they start at rest and
- * end at peak velocity.
+ * Elements exiting a screen use acceleration easing, where they start at rest and end at peak
+ * velocity.
  *
  * This is equivalent to the Android `FastOutLinearInInterpolator`
  */
 val FastOutLinearInEasing: Easing = CubicBezierEasing(0.4f, 0.0f, 1.0f, 1.0f)
 
 /**
- * It returns fraction unmodified. This is useful as a default value for
- * cases where a [Easing] is required but no actual easing is desired.
+ * It returns fraction unmodified. This is useful as a default value for cases where a [Easing] is
+ * required but no actual easing is desired.
  */
 val LinearEasing: Easing = Easing { fraction -> fraction }
 
@@ -75,31 +75,25 @@
  *
  * The [CubicBezierEasing] class implements third-order Bézier curves.
  *
- * This is equivalent to the Android `PathInterpolator` when a single cubic Bézier
- * curve is specified.
+ * This is equivalent to the Android `PathInterpolator` when a single cubic Bézier curve is
+ * specified.
  *
- * Note: [CubicBezierEasing] instances are stateless and can be used concurrently
- * from multiple threads.
+ * Note: [CubicBezierEasing] instances are stateless and can be used concurrently from multiple
+ * threads.
  *
- * Rather than creating a new instance, consider using one of the common
- * cubic [Easing]s:
+ * Rather than creating a new instance, consider using one of the common cubic [Easing]s:
  *
+ * @param a The x coordinate of the first control point. The line through the point (0, 0) and the
+ *   first control point is tangent to the easing at the point (0, 0).
+ * @param b The y coordinate of the first control point. The line through the point (0, 0) and the
+ *   first control point is tangent to the easing at the point (0, 0).
+ * @param c The x coordinate of the second control point. The line through the point (1, 1) and the
+ *   second control point is tangent to the easing at the point (1, 1).
+ * @param d The y coordinate of the second control point. The line through the point (1, 1) and the
+ *   second control point is tangent to the easing at the point (1, 1).
  * @see FastOutSlowInEasing
  * @see LinearOutSlowInEasing
  * @see FastOutLinearInEasing
- *
- * @param a The x coordinate of the first control point.
- *          The line through the point (0, 0) and the first control point is tangent
- *          to the easing at the point (0, 0).
- * @param b The y coordinate of the first control point.
- *          The line through the point (0, 0) and the first control point is tangent
- *          to the easing at the point (0, 0).
- * @param c The x coordinate of the second control point.
- *          The line through the point (1, 1) and the second control point is tangent
- *          to the easing at the point (1, 1).
- * @param d The y coordinate of the second control point.
- *          The line through the point (1, 1) and the second control point is tangent
- *          to the easing at the point (1, 1).
  */
 @Immutable
 class CubicBezierEasing(
@@ -122,21 +116,22 @@
     }
 
     /**
-     * Transforms the specified [fraction] in the range 0..1 by this cubic Bézier curve.
-     * To solve the curve, [fraction] is used as the x coordinate along the curve, and
-     * the corresponding y coordinate on the curve is returned. If no solution exists,
-     * this method throws an [IllegalArgumentException].
+     * Transforms the specified [fraction] in the range 0..1 by this cubic Bézier curve. To solve
+     * the curve, [fraction] is used as the x coordinate along the curve, and the corresponding y
+     * coordinate on the curve is returned. If no solution exists, this method throws an
+     * [IllegalArgumentException].
      *
      * @throws IllegalArgumentException If the cubic Bézier curve cannot be solved
      */
     override fun transform(fraction: Float): Float {
         return if (fraction > 0f && fraction < 1f) {
-            val t = findFirstCubicRoot(
-                0.0f - fraction,
-                a - fraction,
-                c - fraction,
-                1.0f - fraction,
-            )
+            val t =
+                findFirstCubicRoot(
+                    0.0f - fraction,
+                    a - fraction,
+                    c - fraction,
+                    1.0f - fraction,
+                )
 
             // No root, the cubic curve has no solution
             if (t.isNaN()) {
@@ -159,7 +154,10 @@
     }
 
     override fun equals(other: Any?): Boolean {
-        return other is CubicBezierEasing && a == other.a && b == other.b && c == other.c &&
+        return other is CubicBezierEasing &&
+            a == other.a &&
+            b == other.b &&
+            c == other.c &&
             d == other.d
     }
 
diff --git a/compose/animation/animation-core/src/commonMain/kotlin/androidx/compose/animation/core/EasingFunctions.kt b/compose/animation/animation-core/src/commonMain/kotlin/androidx/compose/animation/core/EasingFunctions.kt
index 1b89b4f..edfc39c 100644
--- a/compose/animation/animation-core/src/commonMain/kotlin/androidx/compose/animation/core/EasingFunctions.kt
+++ b/compose/animation/animation-core/src/commonMain/kotlin/androidx/compose/animation/core/EasingFunctions.kt
@@ -23,155 +23,185 @@
 /**
  * Easing Curve that speeds up quickly and ends slowly.
  *
- * ![Ease Curve](https://developer.android.com/images/reference/androidx/compose/animation-core/ease.gif)
+ * ![Ease
+ * Curve](https://developer.android.com/images/reference/androidx/compose/animation-core/ease.gif)
  */
 val Ease: Easing = CubicBezierEasing(0.25f, 0.1f, 0.25f, 1.0f)
 
 /**
  * Easing Curve that starts quickly and ends slowly.
  *
- * ![EaseOut Curve](https://developer.android.com/images/reference/androidx/compose/animation-core/ease_out.gif)
+ * ![EaseOut
+ * Curve](https://developer.android.com/images/reference/androidx/compose/animation-core/ease_out.gif)
  */
 val EaseOut: Easing = CubicBezierEasing(0f, 0f, 0.58f, 1f)
 
 /**
  * Easing Curve that starts slowly and ends quickly.
  *
- * ![EaseIn Curve](https://developer.android.com/images/reference/androidx/compose/animation-core/ease_in.gif)
+ * ![EaseIn
+ * Curve](https://developer.android.com/images/reference/androidx/compose/animation-core/ease_in.gif)
  */
 val EaseIn: Easing = CubicBezierEasing(0.42f, 0f, 1f, 1f)
 
 /**
  * Easing Curve that starts slowly, speeds up and then ends slowly.
  *
- * ![EaseInOut Curve](https://developer.android.com/images/reference/androidx/compose/animation-core/ease_in_out.gif)
+ * ![EaseInOut
+ * Curve](https://developer.android.com/images/reference/androidx/compose/animation-core/ease_in_out.gif)
  */
 val EaseInOut: Easing = CubicBezierEasing(0.42f, 0.0f, 0.58f, 1.0f)
 
 /**
- * Easing Curve that starts slowly and ends quickly. Similar to EaseIn, but with slightly less abrupt beginning
+ * Easing Curve that starts slowly and ends quickly. Similar to EaseIn, but with slightly less
+ * abrupt beginning
  *
- *  ![EaseInSine Curve](https://developer.android.com/images/reference/androidx/compose/animation-core/ease_in_sine.gif)
+ * ![EaseInSine
+ * Curve](https://developer.android.com/images/reference/androidx/compose/animation-core/ease_in_sine.gif)
  */
 val EaseInSine: Easing = CubicBezierEasing(0.12f, 0f, 0.39f, 0f)
 
 /**
- *  ![EaseOutSine Curve](https://developer.android.com/images/reference/androidx/compose/animation-core/ease_out_sine.gif)
+ * ![EaseOutSine
+ * Curve](https://developer.android.com/images/reference/androidx/compose/animation-core/ease_out_sine.gif)
  */
 val EaseOutSine: Easing = CubicBezierEasing(0.61f, 1f, 0.88f, 1f)
 
 /**
- *  ![EaseInOutSine Curve](https://developer.android.com/images/reference/androidx/compose/animation-core/ease_in_out_sine.gif)
+ * ![EaseInOutSine
+ * Curve](https://developer.android.com/images/reference/androidx/compose/animation-core/ease_in_out_sine.gif)
  */
 val EaseInOutSine: Easing = CubicBezierEasing(0.37f, 0f, 0.63f, 1f)
 
 /**
- *  ![EaseInCubic Curve](https://developer.android.com/images/reference/androidx/compose/animation-core/ease_in_cubic.gif)
+ * ![EaseInCubic
+ * Curve](https://developer.android.com/images/reference/androidx/compose/animation-core/ease_in_cubic.gif)
  */
 val EaseInCubic: Easing = CubicBezierEasing(0.32f, 0f, 0.67f, 0f)
 
 /**
- *  ![EaseOutCubic Curve](https://developer.android.com/images/reference/androidx/compose/animation-core/ease_out_cubic.gif)
+ * ![EaseOutCubic
+ * Curve](https://developer.android.com/images/reference/androidx/compose/animation-core/ease_out_cubic.gif)
  */
 val EaseOutCubic: Easing = CubicBezierEasing(0.33f, 1f, 0.68f, 1f)
 
 /**
- *  ![EaseInOutCubic Curve](https://developer.android.com/images/reference/androidx/compose/animation-core/ease_in_out_cubic.gif)
+ * ![EaseInOutCubic
+ * Curve](https://developer.android.com/images/reference/androidx/compose/animation-core/ease_in_out_cubic.gif)
  */
 val EaseInOutCubic: Easing = CubicBezierEasing(0.65f, 0f, 0.35f, 1f)
 
 /**
- *  ![EaseInQuint Curve](https://developer.android.com/images/reference/androidx/compose/animation-core/ease_in_quint.gif)
+ * ![EaseInQuint
+ * Curve](https://developer.android.com/images/reference/androidx/compose/animation-core/ease_in_quint.gif)
  */
 val EaseInQuint: Easing = CubicBezierEasing(0.64f, 0f, 0.78f, 0f)
 
 /**
- *  ![EaseOutQuint Curve](https://developer.android.com/images/reference/androidx/compose/animation-core/ease_out_quint.gif)
+ * ![EaseOutQuint
+ * Curve](https://developer.android.com/images/reference/androidx/compose/animation-core/ease_out_quint.gif)
  */
 val EaseOutQuint: Easing = CubicBezierEasing(0.22f, 1f, 0.36f, 1f)
 
 /**
- *  ![EaseInOutQuint Curve](https://developer.android.com/images/reference/androidx/compose/animation-core/ease_in_out_quint.gif)
+ * ![EaseInOutQuint
+ * Curve](https://developer.android.com/images/reference/androidx/compose/animation-core/ease_in_out_quint.gif)
  */
 val EaseInOutQuint: Easing = CubicBezierEasing(0.83f, 0f, 0.17f, 1f)
 
 /**
- *  ![EaseInCirc Curve](https://developer.android.com/images/reference/androidx/compose/animation-core/ease_in_circ.gif)
+ * ![EaseInCirc
+ * Curve](https://developer.android.com/images/reference/androidx/compose/animation-core/ease_in_circ.gif)
  */
 val EaseInCirc: Easing = CubicBezierEasing(0.55f, 0f, 1f, 0.45f)
 
 /**
- *  ![EaseOutCirc Curve](https://developer.android.com/images/reference/androidx/compose/animation-core/ease_out_circ.gif)
+ * ![EaseOutCirc
+ * Curve](https://developer.android.com/images/reference/androidx/compose/animation-core/ease_out_circ.gif)
  */
 val EaseOutCirc: Easing = CubicBezierEasing(0f, 0.55f, 0.45f, 1f)
 
 /**
- *  ![EaseInOutCirc Curve](https://developer.android.com/images/reference/androidx/compose/animation-core/ease_in_out_circ.gif)
+ * ![EaseInOutCirc
+ * Curve](https://developer.android.com/images/reference/androidx/compose/animation-core/ease_in_out_circ.gif)
  */
 val EaseInOutCirc: Easing = CubicBezierEasing(0.85f, 0f, 0.15f, 1f)
 
 /**
- *  ![EaseInQuad Curve](https://developer.android.com/images/reference/androidx/compose/animation-core/ease_in_quad.gif)
+ * ![EaseInQuad
+ * Curve](https://developer.android.com/images/reference/androidx/compose/animation-core/ease_in_quad.gif)
  */
 val EaseInQuad: Easing = CubicBezierEasing(0.11f, 0f, 0.5f, 0f)
 
 /**
- *  ![EaseOutQuad Curve](https://developer.android.com/images/reference/androidx/compose/animation-core/ease_out_quad.gif)
+ * ![EaseOutQuad
+ * Curve](https://developer.android.com/images/reference/androidx/compose/animation-core/ease_out_quad.gif)
  */
 val EaseOutQuad: Easing = CubicBezierEasing(0.5f, 1f, 0.89f, 1f)
 
 /**
- *  ![EaseInOutQuad Curve](https://developer.android.com/images/reference/androidx/compose/animation-core/ease_in_out_quad.gif)
+ * ![EaseInOutQuad
+ * Curve](https://developer.android.com/images/reference/androidx/compose/animation-core/ease_in_out_quad.gif)
  */
 val EaseInOutQuad: Easing = CubicBezierEasing(0.45f, 0f, 0.55f, 1f)
 
 /**
- *  ![EaseInQuart Curve](https://developer.android.com/images/reference/androidx/compose/animation-core/ease_in_quart.gif)
+ * ![EaseInQuart
+ * Curve](https://developer.android.com/images/reference/androidx/compose/animation-core/ease_in_quart.gif)
  */
 val EaseInQuart: Easing = CubicBezierEasing(0.5f, 0f, 0.75f, 0f)
 
 /**
- *  ![EaseOutQuart Curve](https://developer.android.com/images/reference/androidx/compose/animation-core/ease_out_quart.gif)
+ * ![EaseOutQuart
+ * Curve](https://developer.android.com/images/reference/androidx/compose/animation-core/ease_out_quart.gif)
  */
 val EaseOutQuart: Easing = CubicBezierEasing(0.25f, 1f, 0.5f, 1f)
 
 /**
- *  ![EaseInOutQuart Curve](https://developer.android.com/images/reference/androidx/compose/animation-core/ease_in_out_quart.gif)
+ * ![EaseInOutQuart
+ * Curve](https://developer.android.com/images/reference/androidx/compose/animation-core/ease_in_out_quart.gif)
  */
 val EaseInOutQuart: Easing = CubicBezierEasing(0.76f, 0f, 0.24f, 1f)
 
 /**
- *  ![EaseInExpo Curve](https://developer.android.com/images/reference/androidx/compose/animation-core/ease_in_expo.gif)
+ * ![EaseInExpo
+ * Curve](https://developer.android.com/images/reference/androidx/compose/animation-core/ease_in_expo.gif)
  */
 val EaseInExpo: Easing = CubicBezierEasing(0.7f, 0f, 0.84f, 0f)
 
 /**
- *  ![EaseOutExpo Curve](https://developer.android.com/images/reference/androidx/compose/animation-core/ease_out_expo.gif)
+ * ![EaseOutExpo
+ * Curve](https://developer.android.com/images/reference/androidx/compose/animation-core/ease_out_expo.gif)
  */
 val EaseOutExpo: Easing = CubicBezierEasing(0.16f, 1f, 0.3f, 1f)
 
 /**
- *  ![EaseInOutExpo Curve](https://developer.android.com/images/reference/androidx/compose/animation-core/ease_in_out_expo.gif)
+ * ![EaseInOutExpo
+ * Curve](https://developer.android.com/images/reference/androidx/compose/animation-core/ease_in_out_expo.gif)
  */
 val EaseInOutExpo: Easing = CubicBezierEasing(0.87f, 0f, 0.13f, 1f)
 
 /**
- *  ![EaseInBack Curve](https://developer.android.com/images/reference/androidx/compose/animation-core/ease_in_back.gif)
+ * ![EaseInBack
+ * Curve](https://developer.android.com/images/reference/androidx/compose/animation-core/ease_in_back.gif)
  */
 val EaseInBack: Easing = CubicBezierEasing(0.36f, 0f, 0.66f, -0.56f)
 
 /**
- *  ![EaseOutBack Curve](https://developer.android.com/images/reference/androidx/compose/animation-core/ease_out_back.gif)
+ * ![EaseOutBack
+ * Curve](https://developer.android.com/images/reference/androidx/compose/animation-core/ease_out_back.gif)
  */
 val EaseOutBack: Easing = CubicBezierEasing(0.34f, 1.56f, 0.64f, 1f)
 
 /**
- *  ![EaseInOutBack Curve](https://developer.android.com/images/reference/androidx/compose/animation-core/ease_in_out_back.gif)
+ * ![EaseInOutBack
+ * Curve](https://developer.android.com/images/reference/androidx/compose/animation-core/ease_in_out_back.gif)
  */
 val EaseInOutBack: Easing = CubicBezierEasing(0.68f, -0.6f, 0.32f, 1.6f)
 
 /**
- *  ![EaseInElastic Curve](https://developer.android.com/images/reference/androidx/compose/animation-core/ease_in_elastic.gif)
+ * ![EaseInElastic
+ * Curve](https://developer.android.com/images/reference/androidx/compose/animation-core/ease_in_elastic.gif)
  */
 val EaseInElastic: Easing = Easing { fraction: Float ->
     val c4 = (2f * PI) / 3f
@@ -180,13 +210,13 @@
         0f -> 0f
         1f -> 1f
         else ->
-            (-(2.0f).pow(10f * fraction - 10.0f) *
-                sin((fraction * 10f - 10.75f) * c4)).toFloat()
+            (-(2.0f).pow(10f * fraction - 10.0f) * sin((fraction * 10f - 10.75f) * c4)).toFloat()
     }
 }
 
 /**
- *  ![EaseOutElastic Curve](https://developer.android.com/images/reference/androidx/compose/animation-core/ease_out_elastic.gif)
+ * ![EaseOutElastic
+ * Curve](https://developer.android.com/images/reference/androidx/compose/animation-core/ease_out_elastic.gif)
  */
 val EaseOutElastic: Easing = Easing { fraction ->
     val c4 = (2f * PI) / 3f
@@ -194,14 +224,13 @@
     return@Easing when (fraction) {
         0f -> 0f
         1f -> 1f
-        else ->
-            ((2.0f).pow(-10.0f * fraction) *
-                sin((fraction * 10f - 0.75f) * c4) + 1f).toFloat()
+        else -> ((2.0f).pow(-10.0f * fraction) * sin((fraction * 10f - 0.75f) * c4) + 1f).toFloat()
     }
 }
 
 /**
- *  ![EaseInOutElastic Curve](https://developer.android.com/images/reference/androidx/compose/animation-core/ease_in_out_elastic.gif)
+ * ![EaseInOutElastic
+ * Curve](https://developer.android.com/images/reference/androidx/compose/animation-core/ease_in_out_elastic.gif)
  */
 val EaseInOutElastic: Easing = Easing { fraction ->
     val c5 = (2f * PI) / 4.5f
@@ -209,16 +238,17 @@
         0f -> 0f
         1f -> 1f
         in 0f..0.5f ->
-            (-(2.0f.pow(20.0f * fraction - 10.0f) *
-                sin((20.0f * fraction - 11.125f) * c5)) / 2.0f).toFloat()
+            (-(2.0f.pow(20.0f * fraction - 10.0f) * sin((20.0f * fraction - 11.125f) * c5)) / 2.0f)
+                .toFloat()
         else ->
-            ((2.0f.pow(-20.0f * fraction + 10.0f) *
-                sin((fraction * 20f - 11.125f) * c5)) / 2f).toFloat() + 1f
+            ((2.0f.pow(-20.0f * fraction + 10.0f) * sin((fraction * 20f - 11.125f) * c5)) / 2f)
+                .toFloat() + 1f
     }
 }
 
 /**
- *  ![EaseOutBounce Curve](https://developer.android.com/images/reference/androidx/compose/animation-core/ease_out_bounce.gif)
+ * ![EaseOutBounce
+ * Curve](https://developer.android.com/images/reference/androidx/compose/animation-core/ease_out_bounce.gif)
  */
 val EaseOutBounce: Easing = Easing { fraction ->
     val n1 = 7.5625f
@@ -240,14 +270,16 @@
 }
 
 /**
- *  ![EaseInBounce Curve](https://developer.android.com/images/reference/androidx/compose/animation-core/ease_in_bounce.gif)
+ * ![EaseInBounce
+ * Curve](https://developer.android.com/images/reference/androidx/compose/animation-core/ease_in_bounce.gif)
  */
 val EaseInBounce: Easing = Easing { fraction ->
     return@Easing 1 - EaseOutBounce.transform(1f - fraction)
 }
 
 /**
- *  ![EaseInOutBounce Curve](https://developer.android.com/images/reference/androidx/compose/animation-core/ease_in_out_bounce.gif)
+ * ![EaseInOutBounce
+ * Curve](https://developer.android.com/images/reference/androidx/compose/animation-core/ease_in_out_bounce.gif)
  */
 val EaseInOutBounce: Easing = Easing { fraction ->
     return@Easing if (fraction < 0.5) {
diff --git a/compose/animation/animation-core/src/commonMain/kotlin/androidx/compose/animation/core/Expect.kt b/compose/animation/animation-core/src/commonMain/kotlin/androidx/compose/animation/core/Expect.kt
index 16812a7..41ea1da 100644
--- a/compose/animation/animation-core/src/commonMain/kotlin/androidx/compose/animation/core/Expect.kt
+++ b/compose/animation/animation-core/src/commonMain/kotlin/androidx/compose/animation/core/Expect.kt
@@ -20,7 +20,10 @@
 
 internal expect class AtomicReference<V>(value: V) {
     fun get(): V
+
     fun set(value: V)
+
     fun getAndSet(value: V): V
+
     fun compareAndSet(expect: V, newValue: V): Boolean
 }
diff --git a/compose/animation/animation-core/src/commonMain/kotlin/androidx/compose/animation/core/ExperimentalAnimationSpecApi.kt b/compose/animation/animation-core/src/commonMain/kotlin/androidx/compose/animation/core/ExperimentalAnimationSpecApi.kt
index 6a8ad4e..ff85445 100644
--- a/compose/animation/animation-core/src/commonMain/kotlin/androidx/compose/animation/core/ExperimentalAnimationSpecApi.kt
+++ b/compose/animation/animation-core/src/commonMain/kotlin/androidx/compose/animation/core/ExperimentalAnimationSpecApi.kt
@@ -17,8 +17,8 @@
 package androidx.compose.animation.core
 
 @RequiresOptIn(
-    message = "This is an experimental animation API for AnimationSpec. " +
-        "It may change in the future."
+    message =
+        "This is an experimental animation API for AnimationSpec. " + "It may change in the future."
 )
 @Retention(AnnotationRetention.BINARY)
 annotation class ExperimentalAnimationSpecApi
diff --git a/compose/animation/animation-core/src/commonMain/kotlin/androidx/compose/animation/core/FloatAnimationSpec.kt b/compose/animation/animation-core/src/commonMain/kotlin/androidx/compose/animation/core/FloatAnimationSpec.kt
index 975d020..553ef30 100644
--- a/compose/animation/animation-core/src/commonMain/kotlin/androidx/compose/animation/core/FloatAnimationSpec.kt
+++ b/compose/animation/animation-core/src/commonMain/kotlin/androidx/compose/animation/core/FloatAnimationSpec.kt
@@ -27,8 +27,7 @@
  * Like [VectorizedAnimationSpec], [FloatAnimationSpec] is entirely stateless as well. It requires
  * start/end values and start velocity to be passed in for the query of velocity and value of the
  * animation. The [FloatAnimationSpec] itself stores only the animation configuration (such as the
- * delay, duration and easing curve for [FloatTweenSpec], or spring constants for
- * [FloatSpringSpec].
+ * delay, duration and easing curve for [FloatTweenSpec], or spring constants for [FloatSpringSpec].
  *
  * A [FloatAnimationSpec] can be converted to an [VectorizedAnimationSpec] using [vectorize].
  *
@@ -70,19 +69,15 @@
 
     /**
      * Calculates the end velocity of the animation with the provided start/end values, and start
-     * velocity. For duration-based animations, end velocity will be the velocity of the
-     * animation at the duration time. This is also the default assumption. However, for
-     * spring animations, the transient trailing velocity will be snapped to zero.
+     * velocity. For duration-based animations, end velocity will be the velocity of the animation
+     * at the duration time. This is also the default assumption. However, for spring animations,
+     * the transient trailing velocity will be snapped to zero.
      *
      * @param initialValue start value of the animation
      * @param targetValue end value of the animation
      * @param initialVelocity start velocity of the animation
      */
-    fun getEndVelocity(
-        initialValue: Float,
-        targetValue: Float,
-        initialVelocity: Float
-    ): Float =
+    fun getEndVelocity(initialValue: Float, targetValue: Float, initialVelocity: Float): Float =
         getVelocityFromNanos(
             getDurationNanos(initialValue, targetValue, initialVelocity),
             initialValue,
@@ -93,8 +88,8 @@
     /**
      * Calculates the duration of an animation. For duration-based animations, this will return the
      * pre-defined duration. For physics-based animations, the duration will be estimated based on
-     * the physics configuration (such as spring stiffness, damping ratio, visibility threshold)
-     * as well as the [initialValue], [targetValue] values, and [initialVelocity].
+     * the physics configuration (such as spring stiffness, damping ratio, visibility threshold) as
+     * well as the [initialValue], [targetValue] values, and [initialVelocity].
      *
      * __Note__: this may be a computation that is expensive - especially with spring based
      * animations
@@ -104,30 +99,25 @@
      * @param initialVelocity start velocity of the animation
      */
     @Suppress("MethodNameUnits")
-    fun getDurationNanos(
-        initialValue: Float,
-        targetValue: Float,
-        initialVelocity: Float
-    ): Long
+    fun getDurationNanos(initialValue: Float, targetValue: Float, initialVelocity: Float): Long
 
     /**
-     * Create an [VectorizedAnimationSpec] that animates [AnimationVector] from a [FloatAnimationSpec]. Every
-     * dimension of the [AnimationVector] will be animated using the given [FloatAnimationSpec].
+     * Create an [VectorizedAnimationSpec] that animates [AnimationVector] from a
+     * [FloatAnimationSpec]. Every dimension of the [AnimationVector] will be animated using the
+     * given [FloatAnimationSpec].
      */
     override fun <V : AnimationVector> vectorize(converter: TwoWayConverter<Float, V>) =
         VectorizedFloatAnimationSpec<V>(this)
 }
 
 /**
- * [FloatSpringSpec] animation uses a spring animation to animate a [Float] value. Its
- * configuration can be tuned via adjusting the spring parameters, namely damping ratio and
- * stiffness.
+ * [FloatSpringSpec] animation uses a spring animation to animate a [Float] value. Its configuration
+ * can be tuned via adjusting the spring parameters, namely damping ratio and stiffness.
  *
  * @param dampingRatio damping ratio of the spring. Defaults to [Spring.DampingRatioNoBouncy]
  * @param stiffness Stiffness of the spring. Defaults to [Spring.StiffnessMedium]
- * @param visibilityThreshold The value threshold such that the animation is no longer
- *                              significant. e.g. 1px for translation animations. Defaults to
- *                              [Spring.DefaultDisplacementThreshold]
+ * @param visibilityThreshold The value threshold such that the animation is no longer significant.
+ *   e.g. 1px for translation animations. Defaults to [Spring.DefaultDisplacementThreshold]
  */
 class FloatSpringSpec(
     val dampingRatio: Float = Spring.DampingRatioNoBouncy,
@@ -135,10 +125,11 @@
     private val visibilityThreshold: Float = Spring.DefaultDisplacementThreshold
 ) : FloatAnimationSpec {
 
-    private val spring = SpringSimulation(1f).also {
-        it.dampingRatio = dampingRatio
-        it.stiffness = stiffness
-    }
+    private val spring =
+        SpringSimulation(1f).also {
+            it.dampingRatio = dampingRatio
+            it.stiffness = stiffness
+        }
 
     override fun getValueFromNanos(
         playTimeNanos: Long,
@@ -192,11 +183,11 @@
  * [easing] function. The animation will finish within the [duration] time. Unless a [delay] is
  * specified, the animation will start right away.
  *
- * @param duration the amount of time (in milliseconds) the animation will take to finish.
- *                     Defaults to [DefaultDuration]
+ * @param duration the amount of time (in milliseconds) the animation will take to finish. Defaults
+ *   to [DefaultDuration]
  * @param delay the amount of time the animation will wait before it starts running. Defaults to 0.
  * @param easing the easing function that will be used to interoplate between the start and end
- *               value of the animation. Defaults to [FastOutSlowInEasing].
+ *   value of the animation. Defaults to [FastOutSlowInEasing].
  */
 class FloatTweenSpec(
     val duration: Int = DefaultDurationMillis,
@@ -247,18 +238,15 @@
         } else if (clampedPlayTimeNanos == 0L) {
             return initialVelocity
         }
-        val startNum = getValueFromNanos(
-            clampedPlayTimeNanos - MillisToNanos,
-            initialValue,
-            targetValue,
-            initialVelocity
-        )
-        val endNum = getValueFromNanos(
-            clampedPlayTimeNanos,
-            initialValue,
-            targetValue,
-            initialVelocity
-        )
+        val startNum =
+            getValueFromNanos(
+                clampedPlayTimeNanos - MillisToNanos,
+                initialValue,
+                targetValue,
+                initialVelocity
+            )
+        val endNum =
+            getValueFromNanos(clampedPlayTimeNanos, initialValue, targetValue, initialVelocity)
         return (endNum - startNum) * 1000f
     }
 }
diff --git a/compose/animation/animation-core/src/commonMain/kotlin/androidx/compose/animation/core/FloatDecayAnimationSpec.kt b/compose/animation/animation-core/src/commonMain/kotlin/androidx/compose/animation/core/FloatDecayAnimationSpec.kt
index 8790428..cc1989c 100644
--- a/compose/animation/animation-core/src/commonMain/kotlin/androidx/compose/animation/core/FloatDecayAnimationSpec.kt
+++ b/compose/animation/animation-core/src/commonMain/kotlin/androidx/compose/animation/core/FloatDecayAnimationSpec.kt
@@ -24,8 +24,8 @@
 
 /**
  * This animation interface is intended to be stateless, just like Animation<T>. But unlike
- * Animation<T>, DecayAnimation does not have an end value defined. The end value is a
- * result of the animation rather than an input.
+ * Animation<T>, DecayAnimation does not have an end value defined. The end value is a result of the
+ * animation rather than an input.
  */
 interface FloatDecayAnimationSpec {
     /**
@@ -41,11 +41,7 @@
      * @param initialValue The start value of the animation
      * @param initialVelocity The start velocity of the animation
      */
-    fun getValueFromNanos(
-        playTimeNanos: Long,
-        initialValue: Float,
-        initialVelocity: Float
-    ): Float
+    fun getValueFromNanos(playTimeNanos: Long, initialValue: Float, initialVelocity: Float): Float
 
     /**
      * Returns the duration of the decay animation, in nanoseconds.
@@ -54,10 +50,7 @@
      * @param initialVelocity start velocity of the animation
      */
     @Suppress("MethodNameUnits")
-    fun getDurationNanos(
-        initialValue: Float,
-        initialVelocity: Float
-    ): Long
+    fun getDurationNanos(initialValue: Float, initialVelocity: Float): Long
 
     /**
      * Returns the velocity of the animation at the given time.
@@ -79,10 +72,7 @@
      * @param initialValue The start value of the animation
      * @param initialVelocity The start velocity of the animation
      */
-    fun getTargetValue(
-        initialValue: Float,
-        initialVelocity: Float
-    ): Float
+    fun getTargetValue(initialValue: Float, initialVelocity: Float): Float
 }
 
 private const val ExponentialDecayFriction = -4.2f
@@ -91,25 +81,17 @@
  * This is a decay animation where the friction/deceleration is always proportional to the velocity.
  * As a result, the velocity goes under an exponential decay. The constructor parameter,
  * `frictionMultiplier`, can be tuned to adjust the amount of friction applied in the decay. The
- * higher the
- * multiplier, the higher the friction, the sooner the animation will stop, and the shorter distance
- * the animation will travel with the same starting condition.
+ * higher the multiplier, the higher the friction, the sooner the animation will stop, and the
+ * shorter distance the animation will travel with the same starting condition.
+ *
  * @param frictionMultiplier The friction multiplier, indicating how quickly the animation should
- * stop. This should be greater than `0`, with a default value of `1.0`.
- * @param absVelocityThreshold The speed at which the animation is considered close enough to
- * rest for the animation to finish.
+ *   stop. This should be greater than `0`, with a default value of `1.0`.
+ * @param absVelocityThreshold The speed at which the animation is considered close enough to rest
+ *   for the animation to finish.
  */
 class FloatExponentialDecaySpec(
-    @FloatRange(
-        from = 0.0,
-        fromInclusive = false
-    )
-    frictionMultiplier: Float = 1f,
-    @FloatRange(
-        from = 0.0,
-        fromInclusive = false
-    )
-    absVelocityThreshold: Float = 0.1f
+    @FloatRange(from = 0.0, fromInclusive = false) frictionMultiplier: Float = 1f,
+    @FloatRange(from = 0.0, fromInclusive = false) absVelocityThreshold: Float = 0.1f
 ) : FloatDecayAnimationSpec {
 
     override val absVelocityThreshold: Float = max(0.0000001f, abs(absVelocityThreshold))
@@ -139,14 +121,11 @@
     @Suppress("MethodNameUnits")
     override fun getDurationNanos(initialValue: Float, initialVelocity: Float): Long {
         // Inverse of getVelocity
-        return (1000f * ln(absVelocityThreshold / abs(initialVelocity)) / friction)
-            .toLong() * MillisToNanos
+        return (1000f * ln(absVelocityThreshold / abs(initialVelocity)) / friction).toLong() *
+            MillisToNanos
     }
 
-    override fun getTargetValue(
-        initialValue: Float,
-        initialVelocity: Float
-    ): Float {
+    override fun getTargetValue(initialValue: Float, initialVelocity: Float): Float {
         if (abs(initialVelocity) <= absVelocityThreshold) {
             return initialValue
         }
@@ -159,8 +138,8 @@
 }
 
 /**
- * Creates a [Animation] (with a fixed start value and start velocity) that decays over time
- * based on the given [FloatDecayAnimationSpec].
+ * Creates a [Animation] (with a fixed start value and start velocity) that decays over time based
+ * on the given [FloatDecayAnimationSpec].
  *
  * @param startValue the starting value of the fixed animation.
  * @param startVelocity the starting velocity of the fixed animation.
diff --git a/compose/animation/animation-core/src/commonMain/kotlin/androidx/compose/animation/core/InfiniteAnimationPolicy.kt b/compose/animation/animation-core/src/commonMain/kotlin/androidx/compose/animation/core/InfiniteAnimationPolicy.kt
index 930a05b..819d5b9 100644
--- a/compose/animation/animation-core/src/commonMain/kotlin/androidx/compose/animation/core/InfiniteAnimationPolicy.kt
+++ b/compose/animation/animation-core/src/commonMain/kotlin/androidx/compose/animation/core/InfiniteAnimationPolicy.kt
@@ -21,6 +21,7 @@
 import androidx.compose.ui.platform.InfiniteAnimationPolicy
 import kotlin.coroutines.CoroutineContext
 import kotlin.coroutines.coroutineContext
+
 /**
  * Like [withFrameNanos], but applies the [InfiniteAnimationPolicy] from the calling
  * [CoroutineContext] if there is one.
diff --git a/compose/animation/animation-core/src/commonMain/kotlin/androidx/compose/animation/core/InfiniteTransition.kt b/compose/animation/animation-core/src/commonMain/kotlin/androidx/compose/animation/core/InfiniteTransition.kt
index 7855edf..d5f3266 100644
--- a/compose/animation/animation-core/src/commonMain/kotlin/androidx/compose/animation/core/InfiniteTransition.kt
+++ b/compose/animation/animation-core/src/commonMain/kotlin/androidx/compose/animation/core/InfiniteTransition.kt
@@ -32,13 +32,14 @@
 import kotlinx.coroutines.flow.first
 
 /**
- * Creates a [InfiniteTransition] that runs infinite child animations. Child animations can be
- * added using [InfiniteTransition.animateColor][androidx.compose.animation.animateColor],
+ * Creates a [InfiniteTransition] that runs infinite child animations. Child animations can be added
+ * using [InfiniteTransition.animateColor][androidx.compose.animation.animateColor],
  * [InfiniteTransition.animateFloat], or [InfiniteTransition.animateValue]. Child animations will
  * start running as soon as they enter the composition, and will not stop until they are removed
  * from the composition.
  *
  * @param label A label for differentiating this animation from others in android studio.
+ *
  * @sample androidx.compose.animation.core.samples.InfiniteTransitionSample
  */
 @Composable
@@ -49,24 +50,28 @@
 }
 
 /**
- * [InfiniteTransition] is responsible for running child animations. Child animations can be
- * added using [InfiniteTransition.animateColor][androidx.compose.animation.animateColor],
+ * [InfiniteTransition] is responsible for running child animations. Child animations can be added
+ * using [InfiniteTransition.animateColor][androidx.compose.animation.animateColor],
  * [InfiniteTransition.animateFloat], or [InfiniteTransition.animateValue]. Child animations will
  * start running as soon as they enter the composition, and will not stop until they are removed
  * from the composition.
  *
  * @param label A label for differentiating this animation from others in android studio.
+ *
  * @sample androidx.compose.animation.core.samples.InfiniteTransitionSample
  */
 class InfiniteTransition internal constructor(val label: String) {
 
     /**
-     * Each animation created using [InfiniteTransition.animateColor][androidx.compose.animation.animateColor],
+     * Each animation created using
+     * [InfiniteTransition.animateColor][androidx.compose.animation.animateColor],
      * [InfiniteTransition.animateFloat], or [InfiniteTransition.animateValue] is represented as a
      * [TransitionAnimationState] in [InfiniteTransition]. [typeConverter] converts the animation
-     * value from/to an [AnimationVector]. [label] differentiates this animation from others in android studio.
+     * value from/to an [AnimationVector]. [label] differentiates this animation from others in
+     * android studio.
      */
-    inner class TransitionAnimationState<T, V : AnimationVector> internal constructor(
+    inner class TransitionAnimationState<T, V : AnimationVector>
+    internal constructor(
         internal var initialValue: T,
         internal var targetValue: T,
         val typeConverter: TwoWayConverter<T, V>,
@@ -84,12 +89,8 @@
          * All the animation configurations including initial value/velocity & target value for
          * animating from [initialValue] to [targetValue] are captured in [animation].
          */
-        var animation = TargetBasedAnimation(
-            this.animationSpec,
-            typeConverter,
-            initialValue,
-            targetValue
-        )
+        var animation =
+            TargetBasedAnimation(this.animationSpec, typeConverter, initialValue, targetValue)
             internal set
 
         // This is used to signal parent for less work in a normal running mode, but in seeking
@@ -114,12 +115,8 @@
             this.animationSpec = animationSpec
             // Create a new animation if anything (i.e. initial/target) has changed
             // TODO: Consider providing some continuity maybe?
-            animation = TargetBasedAnimation(
-                animationSpec,
-                typeConverter,
-                initialValue,
-                targetValue
-            )
+            animation =
+                TargetBasedAnimation(animationSpec, typeConverter, initialValue, targetValue)
             refreshChildNeeded = true
             isFinished = false
             startOnTheNextFrame = true
@@ -152,9 +149,7 @@
     private var startTimeNanos = AnimationConstants.UnspecifiedTime
     private var isRunning by mutableStateOf(true)
 
-    /**
-     * List of [TransitionAnimationState]s that are in a [InfiniteTransition].
-     */
+    /** List of [TransitionAnimationState]s that are in a [InfiniteTransition]. */
     val animations: List<TransitionAnimationState<*, *>>
         get() = _animations.asMutableList()
 
@@ -170,9 +165,7 @@
     @Suppress("ComposableNaming")
     @Composable
     internal fun run() {
-        val toolingOverride = remember {
-            mutableStateOf<State<Long>?>(null)
-        }
+        val toolingOverride = remember { mutableStateOf<State<Long>?>(null) }
         if (isRunning || refreshChildNeeded) {
             LaunchedEffect(this) {
                 var durationScale = 1f
@@ -180,31 +173,26 @@
                 while (true) {
                     withInfiniteAnimationFrameNanos {
                         val currentTimeNanos = toolingOverride.value?.value ?: it
-                        if (startTimeNanos == AnimationConstants.UnspecifiedTime ||
-                            durationScale != coroutineContext.durationScale
+                        if (
+                            startTimeNanos == AnimationConstants.UnspecifiedTime ||
+                                durationScale != coroutineContext.durationScale
                         ) {
                             startTimeNanos = it
-                            _animations.forEach {
-                                it.reset()
-                            }
+                            _animations.forEach { it.reset() }
                             durationScale = coroutineContext.durationScale
                         }
                         if (durationScale == 0f) {
                             // Finish right away
-                            _animations.forEach {
-                                it.skipToEnd()
-                            }
+                            _animations.forEach { it.skipToEnd() }
                         } else {
-                            val playTimeNanos = ((currentTimeNanos - startTimeNanos) /
-                                durationScale).toLong()
+                            val playTimeNanos =
+                                ((currentTimeNanos - startTimeNanos) / durationScale).toLong()
                             onFrame(playTimeNanos)
                         }
                     }
                     // Suspend until duration scale is non-zero
                     if (durationScale == 0f) {
-                        snapshotFlow { coroutineContext.durationScale }.first {
-                            it > 0f
-                        }
+                        snapshotFlow { coroutineContext.durationScale }.first { it > 0f }
                     }
                 }
             }
@@ -229,20 +217,20 @@
 
 /**
  * Creates an animation of type [T] that runs infinitely as a part of the given
- * [InfiniteTransition]. Any data type can be animated so long as it can be converted from and to
- * an [AnimationVector]. This conversion needs to be provided as a [typeConverter]. Some examples
- * of such [TwoWayConverter] are: [Int.VectorConverter][Int.Companion.VectorConverter],
+ * [InfiniteTransition]. Any data type can be animated so long as it can be converted from and to an
+ * [AnimationVector]. This conversion needs to be provided as a [typeConverter]. Some examples of
+ * such [TwoWayConverter] are: [Int.VectorConverter][Int.Companion.VectorConverter],
  * [Dp.VectorConverter][Dp.Companion.VectorConverter],
  * [Size.VectorConverter][Size.Companion.VectorConverter], etc
  *
  * Once the animation is created, it will run from [initialValue] to [targetValue] and repeat.
- * Depending on the [RepeatMode] of the provided [animationSpec], the animation could either
- * restart after each iteration (i.e. [RepeatMode.Restart]), or reverse after each iteration (i.e
- * . [RepeatMode.Reverse]).
+ * Depending on the [RepeatMode] of the provided [animationSpec], the animation could either restart
+ * after each iteration (i.e. [RepeatMode.Restart]), or reverse after each iteration (i.e .
+ * [RepeatMode.Reverse]).
  *
  * If [initialValue] or [targetValue] is changed at any point during the animation, the animation
- * will be restarted with the new [initialValue] and [targetValue]. __Note__: this means
- * continuity will *not* be preserved.
+ * will be restarted with the new [initialValue] and [targetValue]. __Note__: this means continuity
+ * will *not* be preserved.
  *
  * A [label] for differentiating this animation from others in android studio.
  *
@@ -259,16 +247,14 @@
     animationSpec: InfiniteRepeatableSpec<T>,
     label: String = "ValueAnimation"
 ): State<T> {
-    val transitionAnimation =
-        remember {
-            TransitionAnimationState(
-                initialValue, targetValue, typeConverter, animationSpec, label
-            )
-        }
+    val transitionAnimation = remember {
+        TransitionAnimationState(initialValue, targetValue, typeConverter, animationSpec, label)
+    }
 
     SideEffect {
-        if (initialValue != transitionAnimation.initialValue ||
-            targetValue != transitionAnimation.targetValue
+        if (
+            initialValue != transitionAnimation.initialValue ||
+                targetValue != transitionAnimation.targetValue
         ) {
             transitionAnimation.updateValues(
                 initialValue = initialValue,
@@ -280,9 +266,7 @@
 
     DisposableEffect(transitionAnimation) {
         addAnimation(transitionAnimation)
-        onDispose {
-            removeAnimation(transitionAnimation)
-        }
+        onDispose { removeAnimation(transitionAnimation) }
     }
     return transitionAnimation
 }
@@ -292,13 +276,13 @@
  * [InfiniteTransition].
  *
  * Once the animation is created, it will run from [initialValue] to [targetValue] and repeat.
- * Depending on the [RepeatMode] of the provided [animationSpec], the animation could either
- * restart after each iteration (i.e. [RepeatMode.Restart]), or reverse after each iteration (i.e
- * . [RepeatMode.Reverse]).
+ * Depending on the [RepeatMode] of the provided [animationSpec], the animation could either restart
+ * after each iteration (i.e. [RepeatMode.Restart]), or reverse after each iteration (i.e .
+ * [RepeatMode.Reverse]).
  *
  * If [initialValue] or [targetValue] is changed at any point during the animation, the animation
- * will be restarted with the new [initialValue] and [targetValue]. __Note__: this means
- * continuity will *not* be preserved.
+ * will be restarted with the new [initialValue] and [targetValue]. __Note__: this means continuity
+ * will *not* be preserved.
  *
  * A [label] for differentiating this animation from others in android studio.
  *
@@ -358,6 +342,7 @@
     return animateFloat(
         initialValue = initialValue,
         targetValue = targetValue,
-        animationSpec = animationSpec, label = "FloatAnimation"
+        animationSpec = animationSpec,
+        label = "FloatAnimation"
     )
 }
diff --git a/compose/animation/animation-core/src/commonMain/kotlin/androidx/compose/animation/core/IntListExtension.kt b/compose/animation/animation-core/src/commonMain/kotlin/androidx/compose/animation/core/IntListExtension.kt
index 65476cc..95e59a1 100644
--- a/compose/animation/animation-core/src/commonMain/kotlin/androidx/compose/animation/core/IntListExtension.kt
+++ b/compose/animation/animation-core/src/commonMain/kotlin/androidx/compose/animation/core/IntListExtension.kt
@@ -25,23 +25,20 @@
  * [IntArray.binarySearch] For original documentation.
  *
  * Searches the list or the range of the list for the provided [element] using the binary search
- * algorithm.
- * The list is expected to be sorted, otherwise the result is undefined.
+ * algorithm. The list is expected to be sorted, otherwise the result is undefined.
  *
- * If the list contains multiple elements equal to the specified [element], there is no
- * guarantee which one will be found.
+ * If the list contains multiple elements equal to the specified [element], there is no guarantee
+ * which one will be found.
  *
  * @param element the to search for.
  * @param fromIndex the start of the range (inclusive) to search in, 0 by default.
  * @param toIndex the end of the range (exclusive) to search in, size of this list by default.
- *
  * @return the index of the element, if it is contained in the list within the specified range;
- * otherwise, the inverted insertion point `(-insertion point - 1)`.
- * The insertion point is defined as the index at which the element should be inserted,
- * so that the list (or the specified subrange of list) still remains sorted.
- *
- * @throws IndexOutOfBoundsException if [fromIndex] is less than zero or [toIndex] is greater
- * than the size of this list.
+ *   otherwise, the inverted insertion point `(-insertion point - 1)`. The insertion point is
+ *   defined as the index at which the element should be inserted, so that the list (or the
+ *   specified subrange of list) still remains sorted.
+ * @throws IndexOutOfBoundsException if [fromIndex] is less than zero or [toIndex] is greater than
+ *   the size of this list.
  * @throws IllegalArgumentException if [fromIndex] is greater than [toIndex].
  */
 @JvmOverloads
@@ -63,8 +60,7 @@
         if (midVal < element) {
             low = mid + 1
         } else if (midVal > element) {
-            high =
-                mid - 1
+            high = mid - 1
         } else {
             return mid // key found
         }
diff --git a/compose/animation/animation-core/src/commonMain/kotlin/androidx/compose/animation/core/InternalAnimationApi.kt b/compose/animation/animation-core/src/commonMain/kotlin/androidx/compose/animation/core/InternalAnimationApi.kt
index eb2cf15..4eec185 100644
--- a/compose/animation/animation-core/src/commonMain/kotlin/androidx/compose/animation/core/InternalAnimationApi.kt
+++ b/compose/animation/animation-core/src/commonMain/kotlin/androidx/compose/animation/core/InternalAnimationApi.kt
@@ -18,8 +18,11 @@
 
 @RequiresOptIn(message = "This API is internal to library.")
 @Target(
-    AnnotationTarget.CLASS, AnnotationTarget.FUNCTION, AnnotationTarget.PROPERTY,
-    AnnotationTarget.FIELD, AnnotationTarget.PROPERTY_GETTER
+    AnnotationTarget.CLASS,
+    AnnotationTarget.FUNCTION,
+    AnnotationTarget.PROPERTY,
+    AnnotationTarget.FIELD,
+    AnnotationTarget.PROPERTY_GETTER
 )
 @Retention(AnnotationRetention.BINARY)
 annotation class InternalAnimationApi
diff --git a/compose/animation/animation-core/src/commonMain/kotlin/androidx/compose/animation/core/InternalMutatorMutex.kt b/compose/animation/animation-core/src/commonMain/kotlin/androidx/compose/animation/core/InternalMutatorMutex.kt
index f0eff2f..3d93081 100644
--- a/compose/animation/animation-core/src/commonMain/kotlin/androidx/compose/animation/core/InternalMutatorMutex.kt
+++ b/compose/animation/animation-core/src/commonMain/kotlin/androidx/compose/animation/core/InternalMutatorMutex.kt
@@ -23,26 +23,25 @@
 import kotlinx.coroutines.sync.Mutex
 import kotlinx.coroutines.sync.withLock
 
-/*** This is an internal copy of androidx.compose.foundation.MutatorMutex. Do not modify. ***/
+/** * This is an internal copy of androidx.compose.foundation.MutatorMutex. Do not modify. ** */
 /**
  * Priorities for performing mutation on state.
  *
- * [MutatePriority] values follow the natural ordering of `enum class` values; a value that
- * compares as `>` to another has a higher priority. A mutation of equal or greater priority will
- * interrupt the current mutation in progress.
+ * [MutatePriority] values follow the natural ordering of `enum class` values; a value that compares
+ * as `>` to another has a higher priority. A mutation of equal or greater priority will interrupt
+ * the current mutation in progress.
  */
 internal enum class MutatePriority {
     /**
      * The default priority for mutations. Can be interrupted by other [Default], [UserInput] or
-     * [PreventUserInput] priority operations.
-     * [Default] priority should be used for programmatic animations or changes that should not
-     * interrupt user input.
+     * [PreventUserInput] priority operations. [Default] priority should be used for programmatic
+     * animations or changes that should not interrupt user input.
      */
     Default,
 
     /**
-     * An elevated priority for mutations meant for implementing direct user interactions.
-     * Can be interrupted by other [UserInput] or [PreventUserInput] priority operations.
+     * An elevated priority for mutations meant for implementing direct user interactions. Can be
+     * interrupted by other [UserInput] or [PreventUserInput] priority operations.
      */
     UserInput,
 
@@ -55,9 +54,9 @@
 }
 
 /**
- * Used in place of the standard Job cancellation pathway to avoid reflective
- * javaClass.simpleName lookups to build the exception message and stack trace collection.
- * Remove if these are changed in kotlinx.coroutines.
+ * Used in place of the standard Job cancellation pathway to avoid reflective javaClass.simpleName
+ * lookups to build the exception message and stack trace collection. Remove if these are changed in
+ * kotlinx.coroutines.
  */
 private class MutationInterruptedException : CancellationException("Mutation interrupted") {
     override fun fillInStackTrace(): Throwable {
@@ -70,16 +69,15 @@
 /**
  * Mutual exclusion for UI state mutation over time.
  *
- * [mutate] permits interruptible state mutation over time using a standard [MutatePriority].
- * A [MutatorMutex] enforces that only a single writer can be active at a time for a particular
- * state resource. Instead of queueing callers that would acquire the lock like a traditional
- * [Mutex], new attempts to [mutate] the guarded state will either cancel the current mutator or
- * if the current mutator has a higher priority, the new caller will throw [CancellationException].
+ * [mutate] permits interruptible state mutation over time using a standard [MutatePriority]. A
+ * [MutatorMutex] enforces that only a single writer can be active at a time for a particular state
+ * resource. Instead of queueing callers that would acquire the lock like a traditional [Mutex], new
+ * attempts to [mutate] the guarded state will either cancel the current mutator or if the current
+ * mutator has a higher priority, the new caller will throw [CancellationException].
  *
- * [MutatorMutex] should be used for implementing hoisted state objects that many mutators may
- * want to manipulate over time such that those mutators can coordinate with one another. The
+ * [MutatorMutex] should be used for implementing hoisted state objects that many mutators may want
+ * to manipulate over time such that those mutators can coordinate with one another. The
  * [MutatorMutex] instance should be hidden as an implementation detail. For example:
- *
  */
 @Stable
 internal class MutatorMutex {
@@ -110,14 +108,14 @@
      * If [mutate] is called while another call to [mutate] or [mutateWith] is in progress, their
      * [priority] values are compared. If the new caller has a [priority] equal to or higher than
      * the call in progress, the call in progress will be cancelled, throwing
-     * [CancellationException] and the new caller's [block] will be invoked. If the call in
-     * progress had a higher [priority] than the new caller, the new caller will throw
+     * [CancellationException] and the new caller's [block] will be invoked. If the call in progress
+     * had a higher [priority] than the new caller, the new caller will throw
      * [CancellationException] without invoking [block].
      *
      * @param priority the priority of this mutation; [MutatePriority.Default] by default. Higher
-     * priority mutations will interrupt lower priority mutations.
+     *   priority mutations will interrupt lower priority mutations.
      * @param block mutation code to run mutually exclusive with any other call to [mutate] or
-     * [mutateWith].
+     *   [mutateWith].
      */
     suspend fun <R> mutate(
         priority: MutatePriority = MutatePriority.Default,
@@ -140,22 +138,22 @@
      * Enforce that only a single caller may be active at a time.
      *
      * If [mutateWith] is called while another call to [mutate] or [mutateWith] is in progress,
-     * their [priority] values are compared. If the new caller has a [priority] equal to or
-     * higher than the call in progress, the call in progress will be cancelled, throwing
-     * [CancellationException] and the new caller's [block] will be invoked. If the call in
-     * progress had a higher [priority] than the new caller, the new caller will throw
+     * their [priority] values are compared. If the new caller has a [priority] equal to or higher
+     * than the call in progress, the call in progress will be cancelled, throwing
+     * [CancellationException] and the new caller's [block] will be invoked. If the call in progress
+     * had a higher [priority] than the new caller, the new caller will throw
      * [CancellationException] without invoking [block].
      *
-     * This variant of [mutate] calls its [block] with a [receiver], removing the need to create
-     * an additional capturing lambda to invoke it with a receiver object. This can be used to
-     * expose a mutable scope to the provided [block] while leaving the rest of the state object
-     * read-only. For example:
+     * This variant of [mutate] calls its [block] with a [receiver], removing the need to create an
+     * additional capturing lambda to invoke it with a receiver object. This can be used to expose a
+     * mutable scope to the provided [block] while leaving the rest of the state object read-only.
+     * For example:
      *
      * @param receiver the receiver `this` that [block] will be called with
      * @param priority the priority of this mutation; [MutatePriority.Default] by default. Higher
-     * priority mutations will interrupt lower priority mutations.
+     *   priority mutations will interrupt lower priority mutations.
      * @param block mutation code to run mutually exclusive with any other call to [mutate] or
-     * [mutateWith].
+     *   [mutateWith].
      */
     suspend fun <T, R> mutateWith(
         receiver: T,
diff --git a/compose/animation/animation-core/src/commonMain/kotlin/androidx/compose/animation/core/MonoSpline.kt b/compose/animation/animation-core/src/commonMain/kotlin/androidx/compose/animation/core/MonoSpline.kt
index 3dd88e4..00d0577 100644
--- a/compose/animation/animation-core/src/commonMain/kotlin/androidx/compose/animation/core/MonoSpline.kt
+++ b/compose/animation/animation-core/src/commonMain/kotlin/androidx/compose/animation/core/MonoSpline.kt
@@ -19,8 +19,8 @@
 import kotlin.math.hypot
 
 /**
- * This performs a spline interpolation in multiple dimensions
- * time is an array of all positions and y is a list of arrays each with the values at each point
+ * This performs a spline interpolation in multiple dimensions time is an array of all positions and
+ * y is a list of arrays each with the values at each point
  */
 @ExperimentalAnimationSpecApi
 internal class MonoSpline(time: FloatArray, y: Array<FloatArray>, periodicBias: Float) {
@@ -87,9 +87,7 @@
      */
     private fun makeFloatArray(a: Int, b: Int): Array<FloatArray> = Array(a) { FloatArray(b) }
 
-    /**
-     * get the value of the j'th spline at time t
-     */
+    /** get the value of the j'th spline at time t */
     fun getPos(t: Float, j: Int): Float {
         val n = timePoints.size
         if (isExtrapolate) {
@@ -182,10 +180,7 @@
         }
     }
 
-    /**
-     * Get the differential of the value at time
-     * fill an array of slopes for each spline
-     */
+    /** Get the differential of the value at time fill an array of slopes for each spline */
     fun getSlope(time: Float, v: FloatArray) {
         var t = time
         val n = timePoints.size
@@ -276,42 +271,21 @@
         return 0.0f // should never reach here
     }
 
-    /**
-     * Cubic Hermite spline
-     */
-    private fun interpolate(
-        h: Float,
-        x: Float,
-        y1: Float,
-        y2: Float,
-        t1: Float,
-        t2: Float
-    ): Float {
+    /** Cubic Hermite spline */
+    private fun interpolate(h: Float, x: Float, y1: Float, y2: Float, t1: Float, t2: Float): Float {
         val x2 = x * x
         val x3 = x2 * x
-        return (-2 * x3 * y2 +
-            3 * x2 * y2 +
-            2 * x3 * y1 -
-            3 * x2 * y1 +
-            y1 + h * t2 * x3 +
-            h * t1 * x3 -
-            h * t2 * x2 -
-            2 * h * t1 * x2 +
-            h * t1 * x)
+        return (-2 * x3 * y2 + 3 * x2 * y2 + 2 * x3 * y1 - 3 * x2 * y1 +
+            y1 +
+            h * t2 * x3 +
+            h * t1 * x3 - h * t2 * x2 - 2 * h * t1 * x2 + h * t1 * x)
     }
 
-    /**
-     * Cubic Hermite spline slope differentiated
-     */
+    /** Cubic Hermite spline slope differentiated */
     private fun diff(h: Float, x: Float, y1: Float, y2: Float, t1: Float, t2: Float): Float {
         val x2 = x * x
-        return (-6 * x2 * y2 +
-            6 * x * y2 +
-            6 * x2 * y1 -
-            6 * x * y1 +
+        return (-6 * x2 * y2 + 6 * x * y2 + 6 * x2 * y1 - 6 * x * y1 +
             3 * h * t2 * x2 +
-            3 * h * t1 * x2 -
-            2 * h * t2 * x -
-            4 * h * t1 * x + h * t1)
+            3 * h * t1 * x2 - 2 * h * t2 * x - 4 * h * t1 * x + h * t1)
     }
 }
diff --git a/compose/animation/animation-core/src/commonMain/kotlin/androidx/compose/animation/core/PathEasing.kt b/compose/animation/animation-core/src/commonMain/kotlin/androidx/compose/animation/core/PathEasing.kt
index 9aac1bb..c9b471f 100644
--- a/compose/animation/animation-core/src/commonMain/kotlin/androidx/compose/animation/core/PathEasing.kt
+++ b/compose/animation/animation-core/src/commonMain/kotlin/androidx/compose/animation/core/PathEasing.kt
@@ -28,30 +28,27 @@
 /**
  * An easing function for an arbitrary [Path].
  *
- * The [Path] must begin at `(0, 0)` and end at `(1, 1)`. The x-coordinate along the
- * [Path] is the input value and the output is the y coordinate of the line at that
- * point. This means that the Path must conform to a function `y = f(x)`.
+ * The [Path] must begin at `(0, 0)` and end at `(1, 1)`. The x-coordinate along the [Path] is the
+ * input value and the output is the y coordinate of the line at that point. This means that the
+ * Path must conform to a function `y = f(x)`.
  *
- * The [Path] must be continuous along the x axis. The [Path] should also be
- * monotonically increasing along the x axis. If the [Path] is not monotonic and
- * there are multiple y values for a given x, the chosen y value is implementation
- * dependent and may vary.
+ * The [Path] must be continuous along the x axis. The [Path] should also be monotonically
+ * increasing along the x axis. If the [Path] is not monotonic and there are multiple y values for a
+ * given x, the chosen y value is implementation dependent and may vary.
  *
- * The [Path] must not contain any [Path.close] command as it would force the path
- * to restart from the beginning.
+ * The [Path] must not contain any [Path.close] command as it would force the path to restart from
+ * the beginning.
  *
  * This is equivalent to the Android `PathInterpolator`.
  *
- * [CubicBezierEasing] should be used if a single bezier curve is required as it
- * performs fewer allocations. [PathEasing] should be used when creating an
- * arbitrary path.
+ * [CubicBezierEasing] should be used if a single bezier curve is required as it performs fewer
+ * allocations. [PathEasing] should be used when creating an arbitrary path.
  *
  * Note: a [PathEasing] instance can be used from any thread, but not concurrently.
  *
  * @sample androidx.compose.animation.core.samples.PathEasingSample
  *
  * @param path The [Path] to use to make the curve representing the easing curve.
- *
  */
 @Immutable
 class PathEasing(private val path: Path) : Easing {
@@ -69,9 +66,10 @@
         }
 
         val result = intervals.findFirstOverlap(fraction)
-        val segment = checkPreconditionNotNull(result.data) {
-            "The easing path is invalid. Make sure it is continuous on the x axis."
-        }
+        val segment =
+            checkPreconditionNotNull(result.data) {
+                "The easing path is invalid. Make sure it is continuous on the x axis."
+            }
 
         val t = findFirstRoot(segment, fraction)
         checkPrecondition(!t.isNaN()) {
@@ -88,27 +86,26 @@
         // easing curves, we don't expect many segments, and therefore few allocations.
         // The interval tree allows us to quickly query for the correct segment inside
         // the transform() function.
-        val segmentIntervals = IntervalTree<PathSegment>().apply {
-            // A path easing curve is defined in the domain 0..1, use an error
-            // appropriate for this domain (the default is 0.25). Conic segments
-            // should be unlikely in path easing curves, but just in case...
-            val iterator = path.iterator(
-                PathIterator.ConicEvaluation.AsQuadratics,
-                2e-4f
-            )
-            while (iterator.hasNext()) {
-                val segment = iterator.next()
-                requirePrecondition(segment.type != PathSegment.Type.Close) {
-                    "The path cannot contain a close() command."
-                }
-                if (segment.type != PathSegment.Type.Move &&
-                    segment.type != PathSegment.Type.Done
-                ) {
-                    val bounds = computeHorizontalBounds(segment, roots)
-                    addInterval(bounds.first, bounds.second, segment)
+        val segmentIntervals =
+            IntervalTree<PathSegment>().apply {
+                // A path easing curve is defined in the domain 0..1, use an error
+                // appropriate for this domain (the default is 0.25). Conic segments
+                // should be unlikely in path easing curves, but just in case...
+                val iterator = path.iterator(PathIterator.ConicEvaluation.AsQuadratics, 2e-4f)
+                while (iterator.hasNext()) {
+                    val segment = iterator.next()
+                    requirePrecondition(segment.type != PathSegment.Type.Close) {
+                        "The path cannot contain a close() command."
+                    }
+                    if (
+                        segment.type != PathSegment.Type.Move &&
+                            segment.type != PathSegment.Type.Done
+                    ) {
+                        val bounds = computeHorizontalBounds(segment, roots)
+                        addInterval(bounds.first, bounds.second, segment)
+                    }
                 }
             }
-        }
 
         requirePrecondition(0.0f in segmentIntervals && 1.0f in segmentIntervals) {
             "The easing path must start at 0.0f and end at 1.0f."
diff --git a/compose/animation/animation-core/src/commonMain/kotlin/androidx/compose/animation/core/Preconditions.kt b/compose/animation/animation-core/src/commonMain/kotlin/androidx/compose/animation/core/Preconditions.kt
index a6e01cd..0bea1d3 100644
--- a/compose/animation/animation-core/src/commonMain/kotlin/androidx/compose/animation/core/Preconditions.kt
+++ b/compose/animation/animation-core/src/commonMain/kotlin/androidx/compose/animation/core/Preconditions.kt
@@ -30,9 +30,7 @@
 @Suppress("BanInlineOptIn") // same opt-in as using Kotlin's require()
 @OptIn(ExperimentalContracts::class)
 internal inline fun requirePrecondition(value: Boolean, lazyMessage: () -> String) {
-    contract {
-        returns() implies value
-    }
+    contract { returns() implies value }
     if (!value) {
         throwIllegalArgumentException(lazyMessage())
     }
@@ -51,9 +49,7 @@
 @Suppress("BanInlineOptIn") // same opt-in as using Kotlin's check()
 @OptIn(ExperimentalContracts::class)
 internal inline fun checkPrecondition(value: Boolean, lazyMessage: () -> String) {
-    contract {
-        returns() implies value
-    }
+    contract { returns() implies value }
     if (!value) {
         throwIllegalStateException(lazyMessage())
     }
@@ -63,9 +59,7 @@
 @Suppress("BanInlineOptIn") // same opt-in as using Kotlin's check()
 @OptIn(ExperimentalContracts::class)
 internal inline fun <T : Any> checkPreconditionNotNull(value: T?, lazyMessage: () -> String): T {
-    contract {
-        returns() implies (value != null)
-    }
+    contract { returns() implies (value != null) }
 
     if (value == null) {
         throwIllegalStateExceptionForNullCheck(lazyMessage())
diff --git a/compose/animation/animation-core/src/commonMain/kotlin/androidx/compose/animation/core/SpringEstimation.kt b/compose/animation/animation-core/src/commonMain/kotlin/androidx/compose/animation/core/SpringEstimation.kt
index d0e40c0..4f8007f 100644
--- a/compose/animation/animation-core/src/commonMain/kotlin/androidx/compose/animation/core/SpringEstimation.kt
+++ b/compose/animation/animation-core/src/commonMain/kotlin/androidx/compose/animation/core/SpringEstimation.kt
@@ -30,9 +30,7 @@
  */
 private const val MAX_LONG_MILLIS: Long = Long.MAX_VALUE / 1_000_000
 
-/**
- * Returns the estimated time that the spring will last be at [delta]
- */
+/** Returns the estimated time that the spring will last be at [delta] */
 @RestrictTo(RestrictTo.Scope.LIBRARY)
 fun estimateAnimationDurationMillis(
     stiffness: Float,
@@ -55,9 +53,7 @@
     )
 }
 
-/**
- * Returns the estimated time that the spring will last be at [delta]
- */
+/** Returns the estimated time that the spring will last be at [delta] */
 @RestrictTo(RestrictTo.Scope.LIBRARY)
 fun estimateAnimationDurationMillis(
     stiffness: Double,
@@ -84,9 +80,7 @@
     )
 }
 
-/**
- * Returns the estimated time that the spring will last be at [delta]
- */
+/** Returns the estimated time that the spring will last be at [delta] */
 @RestrictTo(RestrictTo.Scope.LIBRARY)
 fun estimateAnimationDurationMillis(
     springConstant: Double,
@@ -116,9 +110,9 @@
 }
 
 /**
- * In the under-damped case we simply calculate the envelope of the function.
- * The general solution is of the form x(t) = c_1*e^(r*t)*cos(...) + c_2*e^(r*t)sin(...)
- * which simplifies to x(t) = c*e^(r*t)*cos(...) where c*e^(r*t) is the envelope of x(t)
+ * In the under-damped case we simply calculate the envelope of the function. The general solution
+ * is of the form x(t) = c_1*e^(r*t)*cos(...) + c_2*e^(r*t)sin(...) which simplifies to x(t) =
+ * c*e^(r*t)*cos(...) where c*e^(r*t) is the envelope of x(t)
  */
 private fun estimateUnderDamped(
     firstRoot: ComplexDouble,
@@ -135,8 +129,8 @@
 }
 
 /**
- * In the critically-damped case we apply Newton-Raphson's iterative numerical method of solving
- * the equation x(t) = c_1*e^(r*t) + c_2*t*e^(r*t)
+ * In the critically-damped case we apply Newton-Raphson's iterative numerical method of solving the
+ * equation x(t) = c_1*e^(r*t) + c_2*t*e^(r*t)
  */
 private fun estimateCriticallyDamped(
     firstRoot: ComplexDouble,
@@ -151,20 +145,22 @@
     // For our initial guess, determine the max t of c_1*e^(r*t) = delta and
     // c_2*t*e^(r*t) = delta
     val t1 = ln(abs(delta / c1)) / r
-    val t2 = run {
-        // Application of Lambert's W function to solve te^t
-        val guess = ln(abs(delta / c2))
-        var t = guess
-        for (i in 0..5) {
-            t = (guess - ln(abs(t / r)))
+    val t2 =
+        run {
+            // Application of Lambert's W function to solve te^t
+            val guess = ln(abs(delta / c2))
+            var t = guess
+            for (i in 0..5) {
+                t = (guess - ln(abs(t / r)))
+            }
+            t
+        } / r
+    var tCurr =
+        when {
+            t1.isNotFinite() -> t2
+            t2.isNotFinite() -> t1
+            else -> max(t1, t2)
         }
-        t
-    } / r
-    var tCurr = when {
-        t1.isNotFinite() -> t2
-        t2.isNotFinite() -> t1
-        else -> max(t1, t2)
-    }
 
     // Calculate the inflection time. This is important if the inflection is in t > 0
     val tInflection = -(r * c1 + c2) / (r * c2)
@@ -172,39 +168,41 @@
 
     // For inflection that does not exist in real time, we always solve for x(t)=delta. Note
     // the system is manipulated such that p0 is always positive.
-    val signedDelta = if (tInflection.isNaN() || tInflection <= 0.0) {
-        -delta
-    } else if (tInflection > 0.0 && -xInflection < delta) {
-        // In this scenario the first crossing with the threshold is to be found. Note that
-        // the inflection does not exceed delta. As such, we search from the left.
-        if (c2 < 0 && c1 > 0) {
-            tCurr = 0.0
+    val signedDelta =
+        if (tInflection.isNaN() || tInflection <= 0.0) {
+            -delta
+        } else if (tInflection > 0.0 && -xInflection < delta) {
+            // In this scenario the first crossing with the threshold is to be found. Note that
+            // the inflection does not exceed delta. As such, we search from the left.
+            if (c2 < 0 && c1 > 0) {
+                tCurr = 0.0
+            }
+            -delta
+        } else {
+            // In this scenario there are three total crossings of the threshold, once from
+            // above, and then once when the inflection exceeds the threshold and then one last
+            // one when x(t) finally decays to zero. The point of determining concavity is to
+            // find the final crossing.
+            //
+            // By finding a point between when concavity changes, and when the inflection point is,
+            // Newton's method will always converge onto the rightmost point (in this case),
+            // the one that we are interested in.
+            val tConcavChange = -(2.0 / r) - (c1 / c2)
+            tCurr = tConcavChange
+            delta
         }
-        -delta
-    } else {
-        // In this scenario there are three total crossings of the threshold, once from
-        // above, and then once when the inflection exceeds the threshold and then one last
-        // one when x(t) finally decays to zero. The point of determining concavity is to
-        // find the final crossing.
-        //
-        // By finding a point between when concavity changes, and when the inflection point is,
-        // Newton's method will always converge onto the rightmost point (in this case),
-        // the one that we are interested in.
-        val tConcavChange = -(2.0 / r) - (c1 / c2)
-        tCurr = tConcavChange
-        delta
-    }
 
     var tDelta = Double.MAX_VALUE
     var iterations = 0
     while (tDelta > 0.001 && iterations < 100) {
         iterations++
         val tLast = tCurr
-        tCurr = iterateNewtonsMethod(
-            tCurr,
-            { t -> (c1 + c2 * t) * exp(r * t) + signedDelta },
-            { t -> (c2 * (r * t + 1) + c1 * r) * exp(r * t) }
-        )
+        tCurr =
+            iterateNewtonsMethod(
+                tCurr,
+                { t -> (c1 + c2 * t) * exp(r * t) + signedDelta },
+                { t -> (c2 * (r * t + 1) + c1 * r) * exp(r * t) }
+            )
         tDelta = abs(tLast - tCurr)
     }
 
@@ -212,8 +210,8 @@
 }
 
 /**
- * In the over-damped case we apply Newton-Raphson's iterative numerical method of solving
- * the equation x(t) = c_1*e^(r_1*t) + c_2*e^(r_2*t)
+ * In the over-damped case we apply Newton-Raphson's iterative numerical method of solving the
+ * equation x(t) = c_1*e^(r_1*t) + c_2*e^(r_2*t)
  */
 private fun estimateOverDamped(
     firstRoot: ComplexDouble,
@@ -232,11 +230,12 @@
     val t1 = ln(abs(delta / c1)) / r1
     val t2 = ln(abs(delta / c2)) / r2
 
-    var tCurr = when {
-        t1.isNotFinite() -> t2
-        t2.isNotFinite() -> t1
-        else -> max(t1, t2)
-    }
+    var tCurr =
+        when {
+            t1.isNotFinite() -> t2
+            t2.isNotFinite() -> t1
+            else -> max(t1, t2)
+        }
 
     // Calculate the inflection time. This is important if the inflection is in t > 0
     val tInflection = ln((c1 * r1) / (-c2 * r2)) / (r2 - r1)
@@ -244,28 +243,29 @@
 
     // For inflection that does not exist in real time, we always solve for x(t)=delta. Note
     // the system is manipulated such that p0 is always positive.
-    val signedDelta = if (tInflection.isNaN() || tInflection <= 0.0) {
-        -delta
-    } else if (tInflection > 0.0 && -xInflection() < delta) {
-        // In this scenario the first crossing with the threshold is to be found. Note that
-        // the inflection does not exceed delta. As such, we search from the left.
-        if (c2 > 0.0 && c1 < 0.0) {
-            tCurr = 0.0
+    val signedDelta =
+        if (tInflection.isNaN() || tInflection <= 0.0) {
+            -delta
+        } else if (tInflection > 0.0 && -xInflection() < delta) {
+            // In this scenario the first crossing with the threshold is to be found. Note that
+            // the inflection does not exceed delta. As such, we search from the left.
+            if (c2 > 0.0 && c1 < 0.0) {
+                tCurr = 0.0
+            }
+            -delta
+        } else {
+            // In this scenario there are three total crossings of the threshold, once from
+            // above, and then once when the inflection exceeds the threshold and then one last
+            // one when x(t) finally decays to zero. The point of determining concavity is to
+            // find the final crossing.
+            //
+            // By finding a point between when concavity changes, and when the inflection point is,
+            // Newton's method will always converge onto the rightmost point (in this case),
+            // the one that we are interested in.
+            val tConcavChange = ln(-(c2 * r2 * r2) / (c1 * r1 * r1)) / (r1 - r2)
+            tCurr = tConcavChange
+            delta
         }
-        -delta
-    } else {
-        // In this scenario there are three total crossings of the threshold, once from
-        // above, and then once when the inflection exceeds the threshold and then one last
-        // one when x(t) finally decays to zero. The point of determining concavity is to
-        // find the final crossing.
-        //
-        // By finding a point between when concavity changes, and when the inflection point is,
-        // Newton's method will always converge onto the rightmost point (in this case),
-        // the one that we are interested in.
-        val tConcavChange = ln(-(c2 * r2 * r2) / (c1 * r1 * r1)) / (r1 - r2)
-        tCurr = tConcavChange
-        delta
-    }
 
     // For a good initial guess, simply return
     if (abs(c1 * r1 * exp(r1 * tCurr) + c2 * r2 * exp(r2 * tCurr)) < 0.0001) {
@@ -278,11 +278,12 @@
     while (tDelta > 0.001 && iterations < 100) {
         iterations++
         val tLast = tCurr
-        tCurr = iterateNewtonsMethod(
-            tCurr,
-            { t -> c1 * exp(r1 * t) + c2 * exp(r2 * t) + signedDelta },
-            { t -> c1 * r1 * exp(r1 * t) + c2 * r2 * exp(r2 * t) }
-        )
+        tCurr =
+            iterateNewtonsMethod(
+                tCurr,
+                { t -> c1 * exp(r1 * t) + c2 * exp(r2 * t) + signedDelta },
+                { t -> c1 * r1 * exp(r1 * t) + c2 * r2 * exp(r2 * t) }
+            )
         tDelta = abs(tLast - tCurr)
     }
 
@@ -306,29 +307,20 @@
     val v0 = if (initialPosition < 0) -initialVelocity else initialVelocity
     val p0 = abs(initialPosition)
 
-    return (
-        when {
-            dampingRatio > 1.0 -> estimateOverDamped(
-                firstRoot = firstRoot,
-                secondRoot = secondRoot,
-                v0 = v0,
-                p0 = p0,
-                delta = delta
-            )
-            dampingRatio < 1.0 -> estimateUnderDamped(
-                firstRoot = firstRoot,
-                v0 = v0,
-                p0 = p0,
-                delta = delta
-            )
-            else -> estimateCriticallyDamped(
-                firstRoot = firstRoot,
-                v0 = v0,
-                p0 = p0,
-                delta = delta
-            )
-        } * 1000.0
-    ).toLong()
+    return (when {
+            dampingRatio > 1.0 ->
+                estimateOverDamped(
+                    firstRoot = firstRoot,
+                    secondRoot = secondRoot,
+                    v0 = v0,
+                    p0 = p0,
+                    delta = delta
+                )
+            dampingRatio < 1.0 ->
+                estimateUnderDamped(firstRoot = firstRoot, v0 = v0, p0 = p0, delta = delta)
+            else -> estimateCriticallyDamped(firstRoot = firstRoot, v0 = v0, p0 = p0, delta = delta)
+        } * 1000.0)
+        .toLong()
 }
 
 private inline fun iterateNewtonsMethod(
@@ -339,5 +331,4 @@
     return x - fn(x) / fnPrime(x)
 }
 
-@Suppress("NOTHING_TO_INLINE")
-private inline fun Double.isNotFinite() = !isFinite()
+@Suppress("NOTHING_TO_INLINE") private inline fun Double.isNotFinite() = !isFinite()
diff --git a/compose/animation/animation-core/src/commonMain/kotlin/androidx/compose/animation/core/SpringSimulation.kt b/compose/animation/animation-core/src/commonMain/kotlin/androidx/compose/animation/core/SpringSimulation.kt
index 23f1cce..f97c75f 100644
--- a/compose/animation/animation-core/src/commonMain/kotlin/androidx/compose/animation/core/SpringSimulation.kt
+++ b/compose/animation/animation-core/src/commonMain/kotlin/androidx/compose/animation/core/SpringSimulation.kt
@@ -32,25 +32,23 @@
  * feel suits their use case. Stiffness corresponds to the spring constant. The stiffer the spring
  * is, the harder it is to stretch it, the faster it undergoes dampening.
  *
- *
- * Spring damping ratio describes how oscillations in a system decay after a disturbance.
- * When damping ratio > 1* (i.e. over-damped), the object will quickly return to the rest position
+ * Spring damping ratio describes how oscillations in a system decay after a disturbance. When
+ * damping ratio > 1* (i.e. over-damped), the object will quickly return to the rest position
  * without overshooting. If damping ratio equals to 1 (i.e. critically damped), the object will
- * return to equilibrium within the shortest amount of time. When damping ratio is less than 1
- * (i.e. under-damped), the mass tends to overshoot, and return, and overshoot again. Without any
- * damping (i.e. damping ratio = 0), the mass will oscillate forever.
+ * return to equilibrium within the shortest amount of time. When damping ratio is less than 1 (i.e.
+ * under-damped), the mass tends to overshoot, and return, and overshoot again. Without any damping
+ * (i.e. damping ratio = 0), the mass will oscillate forever.
  */
-
 @kotlin.jvm.JvmInline
 internal value class Motion(val packedValue: Long) {
     val value: Float
         get() = unpackFloat1(packedValue)
+
     val velocity: Float
         get() = unpackFloat2(packedValue)
 
     /**
-     * Returns a copy of this Motion instance optionally overriding the
-     * value or velocity parameters
+     * Returns a copy of this Motion instance optionally overriding the value or velocity parameters
      */
     fun copy(value: Float = this.value, velocity: Float = this.velocity) = Motion(value, velocity)
 }
@@ -78,9 +76,7 @@
     private var gammaMinus: Double = 0.0
     private var dampedFreq: Double = 0.0
 
-    /**
-     * Stiffness of the spring.
-     */
+    /** Stiffness of the spring. */
     var stiffness: Float
         set(value) {
             if (stiffness <= 0) {
@@ -109,8 +105,7 @@
             initialized = false
         }
 
-    /*********************** Below are private APIs  */
-
+    /** ********************* Below are private APIs */
     fun getAcceleration(lastDisplacement: Float, lastVelocity: Float): Float {
         val adjustedDisplacement = lastDisplacement - finalPosition
 
@@ -125,7 +120,7 @@
      * on the setup.
      *
      * @throws IllegalStateException if the final position is not yet set by the time the spring
-     * animation has started
+     *   animation has started
      */
     private fun init() {
         if (initialized) {
@@ -141,10 +136,8 @@
         val dampingRatioSquared = dampingRatio * dampingRatio.toDouble()
         if (dampingRatio > 1) {
             // Over damping
-            gammaPlus =
-                (-dampingRatio * naturalFreq + naturalFreq * sqrt(dampingRatioSquared - 1))
-            gammaMinus =
-                (-dampingRatio * naturalFreq - naturalFreq * sqrt(dampingRatioSquared - 1))
+            gammaPlus = (-dampingRatio * naturalFreq + naturalFreq * sqrt(dampingRatioSquared - 1))
+            gammaMinus = (-dampingRatio * naturalFreq - naturalFreq * sqrt(dampingRatioSquared - 1))
         } else if (dampingRatio >= 0 && dampingRatio < 1) {
             // Under damping
             dampedFreq = naturalFreq * sqrt(1 - dampingRatioSquared)
@@ -154,89 +147,58 @@
     }
 
     /**
-     * Internal only call for Spring to calculate the spring position/velocity using
-     * an analytical approach.
+     * Internal only call for Spring to calculate the spring position/velocity using an analytical
+     * approach.
      */
-    internal fun updateValues(lastDisplacement: Float, lastVelocity: Float, timeElapsed: Long):
-        Motion {
-            init()
+    internal fun updateValues(
+        lastDisplacement: Float,
+        lastVelocity: Float,
+        timeElapsed: Long
+    ): Motion {
+        init()
 
-            val adjustedDisplacement = lastDisplacement - finalPosition
-            val deltaT = timeElapsed / 1000.0 // unit: seconds
-            val displacement: Double
-            val currentVelocity: Double
-            if (dampingRatio > 1) {
-                // Overdamped
-                val coeffA =
-                    (
-                        adjustedDisplacement - (
-                            (gammaMinus * adjustedDisplacement - lastVelocity) /
-                                (gammaMinus - gammaPlus)
-                            )
-                        )
-                val coeffB = (
-                    (gammaMinus * adjustedDisplacement - lastVelocity) /
-                        (gammaMinus - gammaPlus)
-                    )
-                displacement = (
-                    coeffA * exp(gammaMinus * deltaT) +
-                        coeffB * exp(gammaPlus * deltaT)
-                    )
-                currentVelocity = (
-                    coeffA * gammaMinus * exp(gammaMinus * deltaT) +
-                        coeffB * gammaPlus * exp(gammaPlus * deltaT)
-                    )
-            } else if (dampingRatio == 1.0f) {
-                // Critically damped
-                val coeffA = adjustedDisplacement
-                val coeffB = lastVelocity + naturalFreq * adjustedDisplacement
-                displacement = (coeffA + coeffB * deltaT) * exp(-naturalFreq * deltaT)
-                currentVelocity =
-                    (
-                        (
-                            (coeffA + coeffB * deltaT) * exp(-naturalFreq * deltaT) *
-                                (-naturalFreq)
-                            ) + coeffB * exp(-naturalFreq * deltaT)
-                        )
-            } else {
-                // Underdamped
-                val cosCoeff = adjustedDisplacement
-                val sinCoeff =
-                    (
-                        (1 / dampedFreq) * (
-                            (
-                                (dampingRatio * naturalFreq * adjustedDisplacement) +
-                                    lastVelocity
-                                )
-                            )
-                        )
-                displacement = (
-                    exp(-dampingRatio * naturalFreq * deltaT) *
-                        (
-                            (
-                                cosCoeff * cos(dampedFreq * deltaT) +
-                                    sinCoeff * sin(dampedFreq * deltaT)
-                                )
-                            )
-                    )
-                currentVelocity = (
-                    displacement * (-naturalFreq) * dampingRatio + (
-                        exp(
-                            -dampingRatio * naturalFreq * deltaT
-                        ) * (
-                            (
-                                -dampedFreq * cosCoeff *
-                                    sin(dampedFreq * deltaT) + dampedFreq * sinCoeff *
-                                    cos(dampedFreq * deltaT)
-                                )
-                            )
-                        )
-                    )
-            }
-
-            val newValue = (displacement + finalPosition).toFloat()
-            val newVelocity = currentVelocity.toFloat()
-
-            return Motion(newValue, newVelocity)
+        val adjustedDisplacement = lastDisplacement - finalPosition
+        val deltaT = timeElapsed / 1000.0 // unit: seconds
+        val displacement: Double
+        val currentVelocity: Double
+        if (dampingRatio > 1) {
+            // Overdamped
+            val coeffA =
+                (adjustedDisplacement -
+                    ((gammaMinus * adjustedDisplacement - lastVelocity) / (gammaMinus - gammaPlus)))
+            val coeffB =
+                ((gammaMinus * adjustedDisplacement - lastVelocity) / (gammaMinus - gammaPlus))
+            displacement = (coeffA * exp(gammaMinus * deltaT) + coeffB * exp(gammaPlus * deltaT))
+            currentVelocity =
+                (coeffA * gammaMinus * exp(gammaMinus * deltaT) +
+                    coeffB * gammaPlus * exp(gammaPlus * deltaT))
+        } else if (dampingRatio == 1.0f) {
+            // Critically damped
+            val coeffA = adjustedDisplacement
+            val coeffB = lastVelocity + naturalFreq * adjustedDisplacement
+            displacement = (coeffA + coeffB * deltaT) * exp(-naturalFreq * deltaT)
+            currentVelocity =
+                (((coeffA + coeffB * deltaT) * exp(-naturalFreq * deltaT) * (-naturalFreq)) +
+                    coeffB * exp(-naturalFreq * deltaT))
+        } else {
+            // Underdamped
+            val cosCoeff = adjustedDisplacement
+            val sinCoeff =
+                ((1 / dampedFreq) *
+                    (((dampingRatio * naturalFreq * adjustedDisplacement) + lastVelocity)))
+            displacement =
+                (exp(-dampingRatio * naturalFreq * deltaT) *
+                    ((cosCoeff * cos(dampedFreq * deltaT) + sinCoeff * sin(dampedFreq * deltaT))))
+            currentVelocity =
+                (displacement * (-naturalFreq) * dampingRatio +
+                    (exp(-dampingRatio * naturalFreq * deltaT) *
+                        ((-dampedFreq * cosCoeff * sin(dampedFreq * deltaT) +
+                            dampedFreq * sinCoeff * cos(dampedFreq * deltaT)))))
         }
+
+        val newValue = (displacement + finalPosition).toFloat()
+        val newVelocity = currentVelocity.toFloat()
+
+        return Motion(newValue, newVelocity)
+    }
 }
diff --git a/compose/animation/animation-core/src/commonMain/kotlin/androidx/compose/animation/core/SuspendAnimation.kt b/compose/animation/animation-core/src/commonMain/kotlin/androidx/compose/animation/core/SuspendAnimation.kt
index 56ae35c..cc9b205 100644
--- a/compose/animation/animation-core/src/commonMain/kotlin/androidx/compose/animation/core/SuspendAnimation.kt
+++ b/compose/animation/animation-core/src/commonMain/kotlin/androidx/compose/animation/core/SuspendAnimation.kt
@@ -28,15 +28,16 @@
  * alternative [animationSpec] can be provided to replace the default [spring].
  *
  * This is a convenient method for Float animation. If there's a need to access more info related to
- * the animation such as start time, target, etc, consider using [AnimationState.animateTo].
- * To animate non-[Float] data types, consider the [animate] overload/variant for generic types.
+ * the animation such as start time, target, etc, consider using [AnimationState.animateTo]. To
+ * animate non-[Float] data types, consider the [animate] overload/variant for generic types.
  *
  * @param initialVelocity The velocity to use for the animation. 0f by default.
  * @param animationSpec The animation configuration that will be used. [spring] by default.
  * @param block Will be invoked on every frame with the current value and velocity of the animation
- * for that frame.
+ *   for that frame.
  *
  * @sample androidx.compose.animation.core.samples.suspendAnimateFloatVariant
+ *
  * @see AnimationState.animateTo
  */
 suspend fun animate(
@@ -46,14 +47,7 @@
     animationSpec: AnimationSpec<Float> = spring(),
     block: (value: Float, velocity: Float) -> Unit
 ) {
-    animate(
-        Float.VectorConverter,
-        initialValue,
-        targetValue,
-        initialVelocity,
-        animationSpec,
-        block
-    )
+    animate(Float.VectorConverter, initialValue, targetValue, initialVelocity, animationSpec, block)
 }
 
 /**
@@ -64,11 +58,9 @@
  * the animation such as start time, target, etc, consider using [AnimationState.animateDecay].
  *
  * @param animationSpec Defines the decay animation that will be used for this animation. Some
- * options for this [animationSpec] include:
- * [splineBasedDecay][androidx.compose.animation.splineBasedDecay] and [exponentialDecay].
- *
+ *   options for this [animationSpec] include:
+ *   [splineBasedDecay][androidx.compose.animation.splineBasedDecay] and [exponentialDecay].
  * @param block Will be invoked on each animation frame with up-to-date value and velocity.
- *
  * @see AnimationState.animateDecay
  */
 suspend fun animateDecay(
@@ -104,15 +96,17 @@
     animationSpec: AnimationSpec<T> = spring(),
     block: (value: T, velocity: T) -> Unit
 ) {
-    val initialVelocityVector = initialVelocity?.let { typeConverter.convertToVector(it) }
-        ?: typeConverter.convertToVector(initialValue).newInstance()
-    val anim = TargetBasedAnimation(
-        animationSpec = animationSpec,
-        initialValue = initialValue,
-        targetValue = targetValue,
-        typeConverter = typeConverter,
-        initialVelocityVector = initialVelocityVector
-    )
+    val initialVelocityVector =
+        initialVelocity?.let { typeConverter.convertToVector(it) }
+            ?: typeConverter.convertToVector(initialValue).newInstance()
+    val anim =
+        TargetBasedAnimation(
+            animationSpec = animationSpec,
+            initialValue = initialValue,
+            targetValue = targetValue,
+            typeConverter = typeConverter,
+            initialVelocityVector = initialVelocityVector
+        )
     AnimationState(typeConverter, initialValue, initialVelocityVector).animate(anim) {
         block(value, typeConverter.convertFromVector(velocityVector))
     }
@@ -121,25 +115,22 @@
 /**
  * Target based animation that takes the value and velocity from the [AnimationState] as the
  * starting condition, and animate to the [targetValue], using the [animationSpec]. During the
- * animation, the given [AnimationState] will be updated with the up-to-date value/velocity,
- * frame time, etc.
+ * animation, the given [AnimationState] will be updated with the up-to-date value/velocity, frame
+ * time, etc.
  *
  * @param targetValue The target value that the animation will animate to.
- *
  * @param animationSpec The animation configuration that will be used. [spring] by default.
- *
  * @param sequentialAnimation Indicates whether the animation should use the
- * [AnimationState.lastFrameTimeNanos] as the starting time (if true), or start in a new frame. By
- * default, [sequentialAnimation] is false, to start the animation in a few frame. In cases where
- * an on-going animation is interrupted and a new animation is started to carry over the
- * momentum, using the interruption time (captured in [AnimationState.lastFrameTimeNanos]) creates
- * a smoother animation.
- *
+ *   [AnimationState.lastFrameTimeNanos] as the starting time (if true), or start in a new frame. By
+ *   default, [sequentialAnimation] is false, to start the animation in a few frame. In cases where
+ *   an on-going animation is interrupted and a new animation is started to carry over the momentum,
+ *   using the interruption time (captured in [AnimationState.lastFrameTimeNanos]) creates a
+ *   smoother animation.
  * @param block Will be invoked on every frame, and the [AnimationScope] will be checked against
- * cancellation before the animation continues. To cancel the animation from the [block], simply
- * call [AnimationScope.cancelAnimation].  After [AnimationScope.cancelAnimation] is called, [block]
- * will not be invoked again. The animation loop will exit after the [block] returns. All the
- * animation related info can be accessed via [AnimationScope].
+ *   cancellation before the animation continues. To cancel the animation from the [block], simply
+ *   call [AnimationScope.cancelAnimation]. After [AnimationScope.cancelAnimation] is called,
+ *   [block] will not be invoked again. The animation loop will exit after the [block] returns. All
+ *   the animation related info can be accessed via [AnimationScope].
  *
  * @sample androidx.compose.animation.core.samples.animateToOnAnimationState
  */
@@ -149,13 +140,14 @@
     sequentialAnimation: Boolean = false,
     block: AnimationScope<T, V>.() -> Unit = {}
 ) {
-    val anim = TargetBasedAnimation(
-        animationSpec = animationSpec,
-        initialValue = value,
-        targetValue = targetValue,
-        typeConverter = typeConverter,
-        initialVelocityVector = velocityVector
-    )
+    val anim =
+        TargetBasedAnimation(
+            animationSpec = animationSpec,
+            initialValue = value,
+            targetValue = targetValue,
+            typeConverter = typeConverter,
+            initialVelocityVector = velocityVector
+        )
     animate(
         anim,
         if (sequentialAnimation) lastFrameTimeNanos else AnimationConstants.UnspecifiedTime,
@@ -166,37 +158,37 @@
 /**
  * Decay animation that slows down from the current velocity and value captured in [AnimationState]
  * until the velocity reaches 0. During the animation, the given [AnimationState] will be updated
- * with the up-to-date value/velocity, frame time, etc. This is often used to animate the result
- * of a fling gesture.
+ * with the up-to-date value/velocity, frame time, etc. This is often used to animate the result of
+ * a fling gesture.
  *
  * @param animationSpec Defines the decay animation that will be used for this animation. Some
- * options for [animationSpec] include:
- * [splineBasedDecay][androidx.compose.animation.splineBasedDecay] and [exponentialDecay].
- *
+ *   options for [animationSpec] include:
+ *   [splineBasedDecay][androidx.compose.animation.splineBasedDecay] and [exponentialDecay].
  * @param sequentialAnimation Indicates whether the animation should use the
- * [AnimationState.lastFrameTimeNanos] as the starting time (if true), or start in a new frame. By
- * default, [sequentialAnimation] is false, to start the animation in a few frame. In cases where
- * an on-going animation is interrupted and a new animation is started to carry over the
- * momentum, using the interruption time (captured in [AnimationState.lastFrameTimeNanos]) creates
- * a smoother animation.
- *
+ *   [AnimationState.lastFrameTimeNanos] as the starting time (if true), or start in a new frame. By
+ *   default, [sequentialAnimation] is false, to start the animation in a few frame. In cases where
+ *   an on-going animation is interrupted and a new animation is started to carry over the momentum,
+ *   using the interruption time (captured in [AnimationState.lastFrameTimeNanos]) creates a
+ *   smoother animation.
  * @param block will be invoked on every frame during the animation, and the [AnimationScope] will
- * be checked against cancellation before the animation continues. To cancel the animation from the
- * [block], simply call [AnimationScope.cancelAnimation].  After [AnimationScope.cancelAnimation] is
- * called, [block] will not be invoked again. The animation loop will exit after the [block]
- * returns. All the animation related info can be accessed via [AnimationScope].
+ *   be checked against cancellation before the animation continues. To cancel the animation from
+ *   the [block], simply call [AnimationScope.cancelAnimation]. After
+ *   [AnimationScope.cancelAnimation] is called, [block] will not be invoked again. The animation
+ *   loop will exit after the [block] returns. All the animation related info can be accessed via
+ *   [AnimationScope].
  */
 suspend fun <T, V : AnimationVector> AnimationState<T, V>.animateDecay(
     animationSpec: DecayAnimationSpec<T>,
     sequentialAnimation: Boolean = false,
     block: AnimationScope<T, V>.() -> Unit = {}
 ) {
-    val anim = DecayAnimation<T, V>(
-        animationSpec = animationSpec,
-        initialValue = value,
-        initialVelocityVector = velocityVector,
-        typeConverter = typeConverter
-    )
+    val anim =
+        DecayAnimation<T, V>(
+            animationSpec = animationSpec,
+            initialValue = value,
+            initialVelocityVector = velocityVector,
+            typeConverter = typeConverter
+        )
     animate(
         anim,
         if (sequentialAnimation) lastFrameTimeNanos else AnimationConstants.UnspecifiedTime,
@@ -205,22 +197,21 @@
 }
 
 /**
- * This animation function runs the animation defined in the given [animation] from start to
- * finish. During the animation, the [AnimationState] will be updated with the up-to-date
- * value/velocity, frame time, etc.
+ * This animation function runs the animation defined in the given [animation] from start to finish.
+ * During the animation, the [AnimationState] will be updated with the up-to-date value/velocity,
+ * frame time, etc.
  *
- * For [Animation]s that use [AnimationSpec], consider using these more convenient APIs:
- * [animate], [AnimationState.animateTo], [animateDecay], [AnimationState.animateDecay].
+ * For [Animation]s that use [AnimationSpec], consider using these more convenient APIs: [animate],
+ * [AnimationState.animateTo], [animateDecay], [AnimationState.animateDecay].
  *
  * @param startTimeNanos If provided, it will be used as the time that the animation was started. By
- * default, [startTimeNanos] is [AnimationConstants.UnspecifiedTime], meaning the animation will
- * start in the next frame.
- *
+ *   default, [startTimeNanos] is [AnimationConstants.UnspecifiedTime], meaning the animation will
+ *   start in the next frame.
  * @param block Will be invoked on every frame, and the [AnimationScope] will be checked against
- * cancellation before the animation continues. To cancel the animation from the [block], simply
- * call [AnimationScope.cancelAnimation].  After [AnimationScope.cancelAnimation] is called, [block]
- * will not be invoked again. The animation loop will exit after the [block] returns. All the
- * animation related info can be accessed via [AnimationScope].
+ *   cancellation before the animation continues. To cancel the animation from the [block], simply
+ *   call [AnimationScope.cancelAnimation]. After [AnimationScope.cancelAnimation] is called,
+ *   [block] will not be invoked again. The animation loop will exit after the [block] returns. All
+ *   the animation related info can be accessed via [AnimationScope].
  */
 // TODO: This method uses AnimationState and Animation at the same time, it's potentially confusing
 //  as to which is the source of truth for initial value/velocity. Consider letting [Animation] have
@@ -237,40 +228,50 @@
         if (startTimeNanos == AnimationConstants.UnspecifiedTime) {
             val durationScale = coroutineContext.durationScale
             animation.callWithFrameNanos {
-                lateInitScope = AnimationScope(
-                    initialValue = initialValue,
-                    typeConverter = animation.typeConverter,
-                    initialVelocityVector = initialVelocityVector,
-                    lastFrameTimeNanos = it,
-                    targetValue = animation.targetValue,
-                    startTimeNanos = it,
-                    isRunning = true,
-                    onCancel = { isRunning = false }
-                ).apply {
-                    // First frame
-                    doAnimationFrameWithScale(it, durationScale, animation, this@animate, block)
-                }
+                lateInitScope =
+                    AnimationScope(
+                            initialValue = initialValue,
+                            typeConverter = animation.typeConverter,
+                            initialVelocityVector = initialVelocityVector,
+                            lastFrameTimeNanos = it,
+                            targetValue = animation.targetValue,
+                            startTimeNanos = it,
+                            isRunning = true,
+                            onCancel = { isRunning = false }
+                        )
+                        .apply {
+                            // First frame
+                            doAnimationFrameWithScale(
+                                it,
+                                durationScale,
+                                animation,
+                                this@animate,
+                                block
+                            )
+                        }
             }
         } else {
-            lateInitScope = AnimationScope(
-                initialValue = initialValue,
-                typeConverter = animation.typeConverter,
-                initialVelocityVector = initialVelocityVector,
-                lastFrameTimeNanos = startTimeNanos,
-                targetValue = animation.targetValue,
-                startTimeNanos = startTimeNanos,
-                isRunning = true,
-                onCancel = { isRunning = false }
-            ).apply {
-                // First frame
-                doAnimationFrameWithScale(
-                    startTimeNanos,
-                    coroutineContext.durationScale,
-                    animation,
-                    this@animate,
-                    block
-                )
-            }
+            lateInitScope =
+                AnimationScope(
+                        initialValue = initialValue,
+                        typeConverter = animation.typeConverter,
+                        initialVelocityVector = initialVelocityVector,
+                        lastFrameTimeNanos = startTimeNanos,
+                        targetValue = animation.targetValue,
+                        startTimeNanos = startTimeNanos,
+                        isRunning = true,
+                        onCancel = { isRunning = false }
+                    )
+                    .apply {
+                        // First frame
+                        doAnimationFrameWithScale(
+                            startTimeNanos,
+                            coroutineContext.durationScale,
+                            animation,
+                            this@animate,
+                            block
+                        )
+                    }
         }
         // Subsequent frames
         while (lateInitScope!!.isRunning) {
@@ -291,8 +292,8 @@
 }
 
 /**
- * Calls the [finite][withFrameNanos] or [infinite][withInfiniteAnimationFrameNanos]
- * variant of `withFrameNanos`, depending on the value of [Animation.isInfinite].
+ * Calls the [finite][withFrameNanos] or [infinite][withInfiniteAnimationFrameNanos] variant of
+ * `withFrameNanos`, depending on the value of [Animation.isInfinite].
  */
 private suspend fun <R, T, V : AnimationVector> Animation<T, V>.callWithFrameNanos(
     onFrame: (frameTimeNanos: Long) -> R
@@ -300,9 +301,7 @@
     return if (isInfinite) {
         withInfiniteAnimationFrameNanos(onFrame)
     } else {
-        withFrameNanos {
-            onFrame.invoke(it / AnimationDebugDurationScale)
-        }
+        withFrameNanos { onFrame.invoke(it / AnimationDebugDurationScale) }
     }
 }
 
diff --git a/compose/animation/animation-core/src/commonMain/kotlin/androidx/compose/animation/core/Transition.kt b/compose/animation/animation-core/src/commonMain/kotlin/androidx/compose/animation/core/Transition.kt
index ba2fc7d..4502dc2 100644
--- a/compose/animation/animation-core/src/commonMain/kotlin/androidx/compose/animation/core/Transition.kt
+++ b/compose/animation/animation-core/src/commonMain/kotlin/androidx/compose/animation/core/Transition.kt
@@ -62,18 +62,17 @@
 
 /**
  * This sets up a [Transition], and updates it with the target provided by [targetState]. When
- * [targetState] changes, [Transition] will run all of its child animations towards their
- * target values specified for the new [targetState]. Child animations can be dynamically added
- * using [Transition.animateFloat], [animateColor][ androidx.compose.animation.animateColor],
+ * [targetState] changes, [Transition] will run all of its child animations towards their target
+ * values specified for the new [targetState]. Child animations can be dynamically added using
+ * [Transition.animateFloat], [animateColor][ androidx.compose.animation.animateColor],
  * [Transition.animateValue], etc.
  *
  * [label] is used to differentiate different transitions in Android Studio.
  *
  * __Note__: There is another [rememberTransition] overload that accepts a [MutableTransitionState].
  * The difference between the two is that the [MutableTransitionState] variant: 1) supports a
- * different initial state than target state (This would allow a transition to start as soon as
- * it enters composition.) 2) can be recreated to intentionally trigger a re-start of the
- * transition.
+ * different initial state than target state (This would allow a transition to start as soon as it
+ * enters composition.) 2) can be recreated to intentionally trigger a re-start of the transition.
  *
  * @sample androidx.compose.animation.core.samples.GestureAnimationSample
  *
@@ -83,10 +82,7 @@
  * @see Transition.animateValue
  */
 @Composable
-fun <T> updateTransition(
-    targetState: T,
-    label: String? = null
-): Transition<T> {
+fun <T> updateTransition(targetState: T, label: String? = null): Transition<T> {
     val transition = remember { Transition(targetState, label = label) }
     transition.animateTo(targetState)
     DisposableEffect(transition) {
@@ -102,8 +98,8 @@
 internal const val AnimationDebugDurationScale = 1
 
 /**
- * Use with [rememberTransition] to create a [Transition] that can be dynamically
- * targeted with [MutableTransitionState] or seekable with [SeekableTransitionState].
+ * Use with [rememberTransition] to create a [Transition] that can be dynamically targeted with
+ * [MutableTransitionState] or seekable with [SeekableTransitionState].
  */
 sealed class TransitionState<S> {
     /**
@@ -122,6 +118,7 @@
 
     // Updated from Transition
     internal var isRunning: Boolean by mutableStateOf(false)
+
     internal abstract fun transitionConfigured(transition: Transition<S>)
 
     internal abstract fun transitionRemoved()
@@ -129,9 +126,9 @@
 
 /**
  * This is used to prevent exhaustive `when` from limiting the use of [TransitionState] to only
- * [MutableState] and [SeekableTransitionState]. The developer must always have an `else`.
- * It is unlikely to be a concern, but this will alleviate any worries about expanding the
- * subclasses of [TransitionState].
+ * [MutableState] and [SeekableTransitionState]. The developer must always have an `else`. It is
+ * unlikely to be a concern, but this will alleviate any worries about expanding the subclasses of
+ * [TransitionState].
  */
 private class PreventExhaustiveWhenTransitionState : TransitionState<Any?>() {
     override var currentState: Any?
@@ -142,21 +139,20 @@
         get() = null
         set(_) {}
 
-    override fun transitionConfigured(transition: Transition<Any?>) {
-    }
+    override fun transitionConfigured(transition: Transition<Any?>) {}
 
-    override fun transitionRemoved() {
-    }
+    override fun transitionRemoved() {}
 }
 
 /**
  * MutableTransitionState contains two fields: [currentState] and [targetState]. [currentState] is
  * initialized to the provided initialState, and can only be mutated by a [Transition].
  * [targetState] is also initialized to initialState. It can be mutated to alter the course of a
- * transition animation that is created with the [MutableTransitionState] using [rememberTransition].
- * Both [currentState] and [targetState] are backed by a [State] object.
+ * transition animation that is created with the [MutableTransitionState] using
+ * [rememberTransition]. Both [currentState] and [targetState] are backed by a [State] object.
  *
  * @sample androidx.compose.animation.core.samples.InitialStateSample
+ *
  * @see rememberTransition
  */
 class MutableTransitionState<S>(initialState: S) : TransitionState<S>() {
@@ -164,8 +160,8 @@
      * Current state of the transition. [currentState] is initialized to the initialState that the
      * [MutableTransitionState] is constructed with.
      *
-     * It will be updated by the Transition that is created with this [MutableTransitionState]
-     * when the transition arrives at a new state.
+     * It will be updated by the Transition that is created with this [MutableTransitionState] when
+     * the transition arrives at a new state.
      */
     override var currentState: S by mutableStateOf(initialState)
         internal set
@@ -175,27 +171,25 @@
      * [MutableTransitionState] is constructed with.
      *
      * It can be updated to a new state at any time. When that happens, the [Transition] that is
-     * created with this [MutableTransitionState] will update its
-     * [Transition.targetState] to the same and subsequently starts a transition animation to
-     * animate from the current values to the new target.
+     * created with this [MutableTransitionState] will update its [Transition.targetState] to the
+     * same and subsequently starts a transition animation to animate from the current values to the
+     * new target.
      */
     override var targetState: S by mutableStateOf(initialState)
         public set
 
     /**
-     * [isIdle] returns whether the transition has finished running. This will return false once
-     * the [targetState] has been set to a different value than [currentState].
+     * [isIdle] returns whether the transition has finished running. This will return false once the
+     * [targetState] has been set to a different value than [currentState].
      *
      * @sample androidx.compose.animation.core.samples.TransitionStateIsIdleSample
      */
     val isIdle: Boolean
         get() = (currentState == targetState) && !isRunning
 
-    override fun transitionConfigured(transition: Transition<S>) {
-    }
+    override fun transitionConfigured(transition: Transition<S>) {}
 
-    override fun transitionRemoved() {
-    }
+    override fun transitionRemoved() {}
 }
 
 /**
@@ -206,25 +200,22 @@
     it.onTotalDurationChanged()
 }
 
-private val SeekableStateObserver: SnapshotStateObserver by lazy(LazyThreadSafetyMode.NONE) {
-    SnapshotStateObserver { it() }.apply {
-        start()
-    }
-}
+private val SeekableStateObserver: SnapshotStateObserver by
+    lazy(LazyThreadSafetyMode.NONE) { SnapshotStateObserver { it() }.apply { start() } }
 
 /**
- * A [TransitionState] that can manipulate the progress of the [Transition] by seeking
- * with [seekTo] or animating with [animateTo].
+ * A [TransitionState] that can manipulate the progress of the [Transition] by seeking with [seekTo]
+ * or animating with [animateTo].
  *
- * A [SeekableTransitionState] can only be used with one [Transition] instance. Once assigned,
- * it cannot be reassigned to a different [Transition] instance.
+ * A [SeekableTransitionState] can only be used with one [Transition] instance. Once assigned, it
+ * cannot be reassigned to a different [Transition] instance.
+ *
  * @sample androidx.compose.animation.core.samples.SeekingAnimationSample
  */
-class SeekableTransitionState<S>(
-    initialState: S
-) : TransitionState<S>() {
+class SeekableTransitionState<S>(initialState: S) : TransitionState<S>() {
     override var targetState: S by mutableStateOf(initialState)
         internal set
+
     override var currentState: S by mutableStateOf(initialState)
         internal set
 
@@ -235,8 +226,8 @@
     internal var composedTargetState = initialState
 
     /**
-     * The Transition that this is associated with. SeekableTransitionState can only be used
-     * with one Transition.
+     * The Transition that this is associated with. SeekableTransitionState can only be used with
+     * one Transition.
      */
     private var transition: Transition<S>? = null
 
@@ -248,8 +239,8 @@
     }
 
     /**
-     * The progress of the transition from [currentState] to [targetState] as a fraction
-     * of the entire duration.
+     * The progress of the transition from [currentState] to [targetState] as a fraction of the
+     * entire duration.
      *
      * If [targetState] and [currentState] are the same, [fraction] will be 0.
      */
@@ -257,56 +248,48 @@
     var fraction: Float by mutableFloatStateOf(0f)
         private set
 
-    /**
-     * The continuation used when waiting for a composition.
-     */
+    /** The continuation used when waiting for a composition. */
     internal var compositionContinuation: CancellableContinuation<S>? = null
 
     /**
-     * Used to lock the [compositionContinuation] while modifying or checking its value.
-     * Also used for locking the [composedTargetState].
+     * Used to lock the [compositionContinuation] while modifying or checking its value. Also used
+     * for locking the [composedTargetState].
      */
     internal val compositionContinuationMutex = Mutex()
 
-    /**
-     * Used to prevent [snapTo], [seekTo], and [animateTo] from running simultaneously.
-     */
+    /** Used to prevent [snapTo], [seekTo], and [animateTo] from running simultaneously. */
     private val mutatorMutex = MutatorMutex()
 
     /**
-     * When the animation is running, this contains the most recent frame time. When the
-     * animation has stopped, this is [AnimationConstants.UnspecifiedTime].
+     * When the animation is running, this contains the most recent frame time. When the animation
+     * has stopped, this is [AnimationConstants.UnspecifiedTime].
      */
     private var lastFrameTimeNanos: Long = AnimationConstants.UnspecifiedTime
 
     /**
-     * List of animation of initial values. The list should be empty when [seekTo],
-     * [snapTo], or [animateTo] completes successfully.
+     * List of animation of initial values. The list should be empty when [seekTo], [snapTo], or
+     * [animateTo] completes successfully.
      */
     private val initialValueAnimations = MutableObjectList<SeekingAnimationState>()
 
     /**
-     * When [animateTo] is executing, this is non-null, providing the information being
-     * used to animate its value. This will be null while seeking or after [snapTo].
+     * When [animateTo] is executing, this is non-null, providing the information being used to
+     * animate its value. This will be null while seeking or after [snapTo].
      */
     private var currentAnimation: SeekingAnimationState? = null
 
-    /**
-     * Lambda instance used for capturing the first frame of an animation.
-     */
+    /** Lambda instance used for capturing the first frame of an animation. */
     private val firstFrameLambda: (Long) -> Unit = { frameTimeNanos ->
         lastFrameTimeNanos = frameTimeNanos
     }
 
     /**
-     * Used in [animateOneFrameLambda], the duration scale must be set immediately
-     * prior to invoking [withFrameNanos] with [animateOneFrameLambda].
+     * Used in [animateOneFrameLambda], the duration scale must be set immediately prior to invoking
+     * [withFrameNanos] with [animateOneFrameLambda].
      */
     private var durationScale: Float = 0f
 
-    /**
-     * Lambda instance used for animating a single frame within [withFrameNanos].
-     */
+    /** Lambda instance used for animating a single frame within [withFrameNanos]. */
     private val animateOneFrameLambda: (Long) -> Unit = { frameTimeNanos ->
         val delta = frameTimeNanos - lastFrameTimeNanos
         lastFrameTimeNanos = frameTimeNanos
@@ -334,8 +317,7 @@
     }
 
     /**
-     * Stops all animations, including the initial value animations and sets the [fraction]
-     * to `1`.
+     * Stops all animations, including the initial value animations and sets the [fraction] to `1`.
      */
     private fun endAllAnimations() {
         transition?.clearInitialAnimations()
@@ -349,10 +331,10 @@
     }
 
     /**
-     * Starts the animation. It will advance both the currently-running animation and
-     * initial value animations. If the previous animation was stopped ([seekTo] or [snapTo] or
-     * no previous animation was running), then it will require one frame to capture the
-     * frame time before the animation starts.
+     * Starts the animation. It will advance both the currently-running animation and initial value
+     * animations. If the previous animation was stopped ([seekTo] or [snapTo] or no previous
+     * animation was running), then it will require one frame to capture the frame time before the
+     * animation starts.
      */
     private suspend fun runAnimations() {
         if (initialValueAnimations.isEmpty() && currentAnimation == null) {
@@ -387,9 +369,7 @@
         }
     }
 
-    /**
-     * Advances all animations by one frame.
-     */
+    /** Advances all animations by one frame. */
     private suspend fun animateOneFrame() {
         val durationScale = coroutineContext.durationScale
         if (durationScale <= 0f) {
@@ -401,9 +381,9 @@
     }
 
     /**
-     * Calculates the [SeekingAnimationState.value] based on the [deltaPlayTimeNanos]. It uses
-     * the animation spec if one is provided, or the progress of the total duration if not. This
-     * method does not account for duration scale.
+     * Calculates the [SeekingAnimationState.value] based on the [deltaPlayTimeNanos]. It uses the
+     * animation spec if one is provided, or the progress of the total duration if not. This method
+     * does not account for duration scale.
      */
     private fun recalculateAnimationValue(
         animation: SeekingAnimationState,
@@ -417,32 +397,31 @@
         } else {
             val animationSpec = animation.animationSpec
             if (animationSpec != null) {
-                animation.value = animationSpec.getValueFromNanos(
-                    playTimeNanos,
-                    animation.start,
-                    Target1,
-                    animation.initialVelocity ?: ZeroVelocity
-                )[0].coerceIn(0f, 1f)
+                animation.value =
+                    animationSpec
+                        .getValueFromNanos(
+                            playTimeNanos,
+                            animation.start,
+                            Target1,
+                            animation.initialVelocity ?: ZeroVelocity
+                        )[0]
+                        .coerceIn(0f, 1f)
             } else {
-                animation.value = lerp(
-                    animation.start[0],
-                    1f,
-                    playTimeNanos.toFloat() / durationNanos
-                )
+                animation.value =
+                    lerp(animation.start[0], 1f, playTimeNanos.toFloat() / durationNanos)
             }
         }
     }
 
     /**
-     * Sets [currentState] and [targetState] to `targetState` and snaps all values to those
-     * at that state. The transition will not have any animations running after running
-     * [snapTo].
+     * Sets [currentState] and [targetState] to `targetState` and snaps all values to those at that
+     * state. The transition will not have any animations running after running [snapTo].
      *
-     * This can have a similar effect as [seekTo]. However, [seekTo] moves the [currentState]
-     * to the former [targetState] and animates the initial values of the animations from the
-     * current values to those at [currentState]. [seekTo] also allows the developer to move
-     * the state between any fraction between [currentState] and [targetState], while
-     * [snapTo] moves all state to [targetState] without any further seeking allowed.
+     * This can have a similar effect as [seekTo]. However, [seekTo] moves the [currentState] to the
+     * former [targetState] and animates the initial values of the animations from the current
+     * values to those at [currentState]. [seekTo] also allows the developer to move the state
+     * between any fraction between [currentState] and [targetState], while [snapTo] moves all state
+     * to [targetState] without any further seeking allowed.
      *
      * @sample androidx.compose.animation.core.samples.SnapToSample
      *
@@ -450,8 +429,8 @@
      */
     suspend fun snapTo(targetState: S) {
         val transition = transition ?: return
-        if (currentState == targetState &&
-            this@SeekableTransitionState.targetState == targetState
+        if (
+            currentState == targetState && this@SeekableTransitionState.targetState == targetState
         ) {
             return // nothing to change
         }
@@ -459,11 +438,12 @@
             endAllAnimations()
             lastFrameTimeNanos = AnimationConstants.UnspecifiedTime
             fraction = 0f
-            val fraction = when (targetState) {
-                currentState -> ResetAnimationSnapCurrent
-                this@SeekableTransitionState.targetState -> ResetAnimationSnapTarget
-                else -> ResetAnimationSnap
-            }
+            val fraction =
+                when (targetState) {
+                    currentState -> ResetAnimationSnapCurrent
+                    this@SeekableTransitionState.targetState -> ResetAnimationSnapTarget
+                    else -> ResetAnimationSnap
+                }
             transition.updateTarget(targetState)
             transition.playTimeNanos = 0L
             this@SeekableTransitionState.targetState = targetState
@@ -481,12 +461,12 @@
 
     /**
      * Starts seeking the transition to [targetState] with [fraction] used to indicate the progress
-     * towards [targetState]. If the previous `targetState` was already
-     * [targetState] then [seekTo] only stops any current animation towards that state and snaps
-     * the fraction to the new value. Otherwise, the [currentState] is changed to the former
-     * `targetState` and `targetState` is changed to [targetState] and an animation is started,
-     * moving the start values towards the former `targetState`. This will return when the
-     * initial values have reached `currentState` and the [fraction] has been reached.
+     * towards [targetState]. If the previous `targetState` was already [targetState] then [seekTo]
+     * only stops any current animation towards that state and snaps the fraction to the new value.
+     * Otherwise, the [currentState] is changed to the former `targetState` and `targetState` is
+     * changed to [targetState] and an animation is started, moving the start values towards the
+     * former `targetState`. This will return when the initial values have reached `currentState`
+     * and the [fraction] has been reached.
      *
      * [snapTo] also allows the developer to change the state, but does not animate any values.
      * Instead, it instantly moves all values to those at the new [targetState].
@@ -533,9 +513,7 @@
         }
     }
 
-    /**
-     * Wait for composition to set up the target values
-     */
+    /** Wait for composition to set up the target values */
     private suspend fun waitForCompositionAfterTargetStateChange() {
         val expectedState = targetState
         compositionContinuationMutex.lock()
@@ -557,8 +535,8 @@
     }
 
     /**
-     * Waits for composition, irrespective of whether the target state has changed or not.
-     * This is important for when we're waiting for the currentState to change.
+     * Waits for composition, irrespective of whether the target state has changed or not. This is
+     * important for when we're waiting for the currentState to change.
      */
     private suspend fun waitForComposition() {
         val expectedState = targetState
@@ -573,24 +551,23 @@
         }
     }
 
-    /**
-     * Change the animatedInitialFraction to use the animatedFraction, if it needs to be used.
-     */
+    /** Change the animatedInitialFraction to use the animatedFraction, if it needs to be used. */
     private fun moveAnimationToInitialState() {
         val transition = transition ?: return
-        val animation = currentAnimation ?: if (totalDurationNanos <= 0 || fraction == 1f ||
-            currentState == targetState
-        ) {
-            null
-        } else {
-            SeekingAnimationState().also {
-                it.value = fraction
-                val totalDurationNanos = totalDurationNanos
-                it.durationNanos = totalDurationNanos
-                it.animationSpecDuration = (totalDurationNanos * (1.0 - fraction)).roundToLong()
-                it.start[0] = fraction
-            }
-        }
+        val animation =
+            currentAnimation
+                ?: if (totalDurationNanos <= 0 || fraction == 1f || currentState == targetState) {
+                    null
+                } else {
+                    SeekingAnimationState().also {
+                        it.value = fraction
+                        val totalDurationNanos = totalDurationNanos
+                        it.durationNanos = totalDurationNanos
+                        it.animationSpecDuration =
+                            (totalDurationNanos * (1.0 - fraction)).roundToLong()
+                        it.start[0] = fraction
+                    }
+                }
         if (animation != null) {
             animation.durationNanos = totalDurationNanos
             initialValueAnimations += animation
@@ -601,16 +578,16 @@
 
     /**
      * Updates the current `targetState` to [targetState] and begins an animation to the new state.
-     * If the current `targetState` is the same as [targetState] then the
-     * current transition animation is continued. If a previous transition
-     * was interrupted, [currentState] is changed to the former `targetState` and the start values
-     * are animated toward the former `targetState`.
+     * If the current `targetState` is the same as [targetState] then the current transition
+     * animation is continued. If a previous transition was interrupted, [currentState] is changed
+     * to the former `targetState` and the start values are animated toward the former
+     * `targetState`.
      *
      * Upon completion of the animation, [currentState] will be changed to [targetState].
      *
      * @param targetState The state to animate towards.
-     * @param animationSpec If provided, is used to animate the animation fraction. If `null`,
-     * the transition is linearly traversed based on the duration of the transition.
+     * @param animationSpec If provided, is used to animate the animation fraction. If `null`, the
+     *   transition is linearly traversed based on the duration of the transition.
      */
     @Suppress("DocumentExceptions")
     suspend fun animateTo(
@@ -645,15 +622,16 @@
                             val oldSpec = runningAnimation?.animationSpec
                             val oldVelocity: AnimationVector1D
                             if (oldSpec != null) {
-                                oldVelocity = oldSpec.getVelocityFromNanos(
-                                    playTimeNanos = runningAnimation.progressNanos,
-                                    initialValue = runningAnimation.start,
-                                    targetValue = Target1,
-                                    initialVelocity =
-                                    runningAnimation.initialVelocity ?: ZeroVelocity
-                                )
-                            } else if (runningAnimation == null ||
-                                runningAnimation.progressNanos == 0L
+                                oldVelocity =
+                                    oldSpec.getVelocityFromNanos(
+                                        playTimeNanos = runningAnimation.progressNanos,
+                                        initialValue = runningAnimation.start,
+                                        targetValue = Target1,
+                                        initialVelocity =
+                                            runningAnimation.initialVelocity ?: ZeroVelocity
+                                    )
+                            } else if (
+                                runningAnimation == null || runningAnimation.progressNanos == 0L
                             ) {
                                 oldVelocity = ZeroVelocity
                             } else {
@@ -678,11 +656,12 @@
                             newAnimation.durationNanos = totalDurationNanos
                             newAnimation.progressNanos = 0L
                             newAnimation.initialVelocity = oldVelocity
-                            newAnimation.animationSpecDuration = newSpec?.getDurationNanos(
-                                initialValue = newAnimation.start,
-                                targetValue = Target1,
-                                initialVelocity = oldVelocity
-                            ) ?: (totalDurationNanos * (1.0 - fraction)).roundToLong()
+                            newAnimation.animationSpecDuration =
+                                newSpec?.getDurationNanos(
+                                    initialValue = newAnimation.start,
+                                    targetValue = Target1,
+                                    initialVelocity = oldVelocity
+                                ) ?: (totalDurationNanos * (1.0 - fraction)).roundToLong()
                             currentAnimation = newAnimation
                         }
                     }
@@ -795,22 +774,23 @@
 }
 
 /**
- * Creates a [Transition] and puts it in the [currentState][TransitionState.currentState] of
- * the provided [transitionState]. If the [TransitionState.targetState] changes, the [Transition]
- * will change where it will animate to.
+ * Creates a [Transition] and puts it in the [currentState][TransitionState.currentState] of the
+ * provided [transitionState]. If the [TransitionState.targetState] changes, the [Transition] will
+ * change where it will animate to.
  *
  * __Remember__: The provided [transitionState] needs to be [remember]ed.
  *
- * Compared to [updateTransition] that takes a targetState, this function supports a
- * different initial state than the first targetState. Here is an example:
+ * Compared to [updateTransition] that takes a targetState, this function supports a different
+ * initial state than the first targetState. Here is an example:
  *
  * @sample androidx.compose.animation.core.samples.InitialStateSample
  *
  * In most cases, it is recommended to reuse the same [transitionState] that is [remember]ed, such
  * that [Transition] preserves continuity when [targetState][MutableTransitionState.targetState] is
- * changed. However, in some rare cases it is more critical to immediately *snap* to a state
- * change (e.g. in response to a user interaction). This can be achieved by creating a new
+ * changed. However, in some rare cases it is more critical to immediately *snap* to a state change
+ * (e.g. in response to a user interaction). This can be achieved by creating a new
  * [transitionState]:
+ *
  * @sample androidx.compose.animation.core.samples.DoubleTapToLikeSample
  */
 @Composable
@@ -818,9 +798,8 @@
     transitionState: TransitionState<T>,
     label: String? = null
 ): Transition<T> {
-    val transition = remember(transitionState) {
-        Transition(transitionState = transitionState, label)
-    }
+    val transition =
+        remember(transitionState) { Transition(transitionState = transitionState, label) }
     if (transitionState is SeekableTransitionState) {
         LaunchedEffect(transitionState.currentState, transitionState.targetState) {
             transitionState.observeTotalDuration()
@@ -857,9 +836,10 @@
  *
  * In most cases, it is recommended to reuse the same [transitionState] that is [remember]ed, such
  * that [Transition] preserves continuity when [targetState][MutableTransitionState.targetState] is
- * changed. However, in some rare cases it is more critical to immediately *snap* to a state
- * change (e.g. in response to a user interaction). This can be achieved by creating a new
+ * changed. However, in some rare cases it is more critical to immediately *snap* to a state change
+ * (e.g. in response to a user interaction). This can be achieved by creating a new
  * [transitionState]:
+ *
  * @sample androidx.compose.animation.core.samples.DoubleTapToLikeSample
  */
 @Deprecated(
@@ -876,11 +856,11 @@
 }
 
 /**
- * [Transition] manages all the child animations on a state level. Child animations
- * can be created in a declarative way using [Transition.animateFloat], [Transition.animateValue],
+ * [Transition] manages all the child animations on a state level. Child animations can be created
+ * in a declarative way using [Transition.animateFloat], [Transition.animateValue],
  * [animateColor][androidx.compose.animation.animateColor] etc. When the [targetState] changes,
- * [Transition] will automatically start or adjust course for all its child animations to animate
- * to the new target values defined for each animation.
+ * [Transition] will automatically start or adjust course for all its child animations to animate to
+ * the new target values defined for each animation.
  *
  * After arriving at [targetState], [Transition] will be triggered to run if any child animation
  * changes its target value (due to their dynamic target calculation logic, such as theme-dependent
@@ -895,10 +875,10 @@
  */
 // TODO: Support creating Transition outside of composition and support imperative use of Transition
 @Stable
-class Transition<S> internal constructor(
+class Transition<S>
+internal constructor(
     private val transitionState: TransitionState<S>,
-    @get:RestrictTo(RestrictTo.Scope.LIBRARY)
-    val parentTransition: Transition<*>?,
+    @get:RestrictTo(RestrictTo.Scope.LIBRARY) val parentTransition: Transition<*>?,
     val label: String? = null
 ) {
     @PublishedApi
@@ -919,9 +899,9 @@
     ) : this(transitionState as TransitionState<S>, null, label)
 
     /**
-     * Current state of the transition. This will always be the initialState of the transition
-     * until the transition is finished. Once the transition is finished, [currentState] will be
-     * set to [targetState]. [currentState] is backed by a [MutableState].
+     * Current state of the transition. This will always be the initialState of the transition until
+     * the transition is finished. Once the transition is finished, [currentState] will be set to
+     * [targetState]. [currentState] is backed by a [MutableState].
      */
     val currentState: S
         get() = transitionState.currentState
@@ -940,9 +920,7 @@
     var segment: Segment<S> by mutableStateOf(SegmentImpl(currentState, currentState))
         private set
 
-    /**
-     * Indicates whether there is any animation running in the transition.
-     */
+    /** Indicates whether there is any animation running in the transition. */
     val isRunning: Boolean
         get() = startTimeNanos != AnimationConstants.UnspecifiedTime
 
@@ -974,15 +952,11 @@
     private val _animations = mutableStateListOf<TransitionAnimationState<*, *>>()
     private val _transitions = mutableStateListOf<Transition<*>>()
 
-    /**
-     * List of child transitions in a [Transition].
-     */
+    /** List of child transitions in a [Transition]. */
     val transitions: List<Transition<*>>
         get() = _transitions
 
-    /**
-     * List of [TransitionAnimationState]s that are in a [Transition].
-     */
+    /** List of [TransitionAnimationState]s that are in a [Transition]. */
     val animations: List<TransitionAnimationState<*, *>>
         get() = _animations
 
@@ -991,22 +965,24 @@
     @set:RestrictTo(RestrictTo.Scope.LIBRARY)
     var isSeeking: Boolean by mutableStateOf(false)
         internal set
+
     internal var lastSeekedTimeNanos = 0L
 
     /**
-     * Used internally to know when a [SeekableTransitionState] is animating initial values
-     * after [SeekableTransitionState.animateTo] or [SeekableTransitionState.seekTo] has
-     * redirected a transition prior to it completing. This is important for knowing when
-     * child transitions must be maintained after a parent target state has changed, but
-     * the child target state hasn't changed.
+     * Used internally to know when a [SeekableTransitionState] is animating initial values after
+     * [SeekableTransitionState.animateTo] or [SeekableTransitionState.seekTo] has redirected a
+     * transition prior to it completing. This is important for knowing when child transitions must
+     * be maintained after a parent target state has changed, but the child target state hasn't
+     * changed.
      */
     @Suppress("OPT_IN_MARKER_ON_WRONG_TARGET")
     @get:Suppress("GetterSetterNames") // Don't care about Java name for this property
     @InternalAnimationApi
     @get:InternalAnimationApi
     val hasInitialValueAnimations: Boolean
-        get() = _animations.fastAny { it.initialValueState != null } ||
-            _transitions.fastAny { it.hasInitialValueAnimations }
+        get() =
+            _animations.fastAny { it.initialValueState != null } ||
+                _transitions.fastAny { it.hasInitialValueAnimations }
 
     /**
      * Total duration of the [Transition], accounting for all the animations and child transitions
@@ -1021,14 +997,9 @@
 
     private fun calculateTotalDurationNanos(): Long {
         var maxDurationNanos = 0L
-        _animations.fastForEach {
-            maxDurationNanos = max(maxDurationNanos, it.durationNanos)
-        }
+        _animations.fastForEach { maxDurationNanos = max(maxDurationNanos, it.durationNanos) }
         _transitions.fastForEach {
-            maxDurationNanos = max(
-                maxDurationNanos,
-                it.calculateTotalDurationNanos()
-            )
+            maxDurationNanos = max(maxDurationNanos, it.calculateTotalDurationNanos())
         }
         return maxDurationNanos
     }
@@ -1040,11 +1011,12 @@
         }
 
         val deltaT = frameTimeNanos - startTimeNanos
-        val scaledPlayTimeNanos = if (durationScale == 0f) {
-            deltaT
-        } else {
-            (deltaT / durationScale.toDouble()).roundToLong()
-        }
+        val scaledPlayTimeNanos =
+            if (durationScale == 0f) {
+                deltaT
+            } else {
+                (deltaT / durationScale.toDouble()).roundToLong()
+            }
         playTimeNanos = scaledPlayTimeNanos
         onFrame(scaledPlayTimeNanos, durationScale == 0f)
     }
@@ -1114,9 +1086,9 @@
      *
      * Note: This function is intended for tooling use only.
      *
-     * __Caveat:__  Once [initialState] or [targetState] changes, it needs to take a whole
-     * composition pass for all the animations and child transitions to recompose with the
-     * new [initialState] and [targetState]. Subsequently all the animations will be updated to the
+     * __Caveat:__ Once [initialState] or [targetState] changes, it needs to take a whole
+     * composition pass for all the animations and child transitions to recompose with the new
+     * [initialState] and [targetState]. Subsequently all the animations will be updated to the
      * given play time.
      *
      * __Caveat:__ This function puts [Transition] in a manual playtime setting mode. From then on
@@ -1156,22 +1128,18 @@
             }
         }
 
-        _animations.fastForEach {
-            it.seekTo(playTimeNanos)
-        }
+        _animations.fastForEach { it.seekTo(playTimeNanos) }
         lastSeekedTimeNanos = playTimeNanos
     }
 
     internal fun addTransition(transition: Transition<*>) = _transitions.add(transition)
+
     internal fun removeTransition(transition: Transition<*>) = _transitions.remove(transition)
 
-    internal fun addAnimation(
-        animation: TransitionAnimationState<*, *>
-    ) = _animations.add(animation)
+    internal fun addAnimation(animation: TransitionAnimationState<*, *>) =
+        _animations.add(animation)
 
-    internal fun removeAnimation(
-        animation: TransitionAnimationState<*, *>
-    ) {
+    internal fun removeAnimation(animation: TransitionAnimationState<*, *>) {
         _animations.remove(animation)
     }
 
@@ -1233,7 +1201,7 @@
                             }
                         }
                     }
-                    onDispose { }
+                    onDispose {}
                 }
             }
         }
@@ -1251,9 +1219,7 @@
         updateChildrenNeeded = false
 
         // Pulse new playtime
-        _animations.fastForEach {
-            it.seekTo(playTimeNanos)
-        }
+        _animations.fastForEach { it.seekTo(playTimeNanos) }
         _transitions.fastForEach {
             if (it.targetState != it.currentState) {
                 it.seekAnimations(playTimeNanos)
@@ -1262,48 +1228,37 @@
     }
 
     /**
-     * Changes the existing animations to be initial value animations. An existing animation
-     * was interrupted, so the current animation is used only for the initial values. The
-     * current animation is then changed to an unchanging animation that is only moved by
-     * the initial value.
+     * Changes the existing animations to be initial value animations. An existing animation was
+     * interrupted, so the current animation is used only for the initial values. The current
+     * animation is then changed to an unchanging animation that is only moved by the initial value.
      */
     internal fun setInitialAnimations(
         animationState: SeekableTransitionState.SeekingAnimationState
     ) {
-        _animations.fastForEach {
-            it.setInitialValueAnimation(animationState)
-        }
-        _transitions.fastForEach {
-            it.setInitialAnimations(animationState)
-        }
+        _animations.fastForEach { it.setInitialValueAnimation(animationState) }
+        _transitions.fastForEach { it.setInitialAnimations(animationState) }
     }
 
     /**
-     * Clears all animations. The state has been forced directly to a new value and the
-     * animations are no longer valid.
+     * Clears all animations. The state has been forced directly to a new value and the animations
+     * are no longer valid.
      */
     internal fun resetAnimationFraction(fraction: Float) {
         _animations.fastForEach { it.resetAnimationValue(fraction) }
         _transitions.fastForEach { it.resetAnimationFraction(fraction) }
     }
 
-    /**
-     * Clears all initial value animations.
-     */
+    /** Clears all initial value animations. */
     internal fun clearInitialAnimations() {
-        _animations.fastForEach {
-            it.clearInitialAnimation()
-        }
-        _transitions.fastForEach {
-            it.clearInitialAnimations()
-        }
+        _animations.fastForEach { it.clearInitialAnimation() }
+        _transitions.fastForEach { it.clearInitialAnimations() }
     }
 
     /**
      * Changes the progress of the initial value.
      *
-     * @return true if the animationState is animating anything or false if it isn't
-     * animating anything.
+     * @return true if the animationState is animating anything or false if it isn't animating
+     *   anything.
      */
     internal fun updateInitialValues() {
         _animations.fastForEach { it.updateInitialValue() }
@@ -1335,7 +1290,8 @@
      * [TransitionAnimationState] in [Transition].
      */
     @Stable
-    inner class TransitionAnimationState<T, V : AnimationVector> internal constructor(
+    inner class TransitionAnimationState<T, V : AnimationVector>
+    internal constructor(
         initialValue: T,
         initialVelocityVector: V,
         val typeConverter: TwoWayConverter<T, V>,
@@ -1358,12 +1314,16 @@
          * All the animation configurations including initial value/velocity & target value for
          * animating from [currentState] to [targetState] are captured in [animation].
          */
-        var animation: TargetBasedAnimation<T, V> by mutableStateOf(
-            TargetBasedAnimation(
-                animationSpec, typeConverter, initialValue, targetValue,
-                initialVelocityVector
+        var animation: TargetBasedAnimation<T, V> by
+            mutableStateOf(
+                TargetBasedAnimation(
+                    animationSpec,
+                    typeConverter,
+                    initialValue,
+                    targetValue,
+                    initialVelocityVector
+                )
             )
-        )
             private set
 
         internal var initialValueState: SeekableTransitionState.SeekingAnimationState? = null
@@ -1373,18 +1333,18 @@
         internal var resetSnapValue by mutableFloatStateOf(NoReset)
 
         /**
-         * When the target state has changed, but the target value remains the same,
-         * the initial value animation completely controls the animated value. When
-         * this flag is `true`, the [animation] can be ignored and only the [initialValueState]
-         * is needed to determine the value. When this is `false`, if there is
-         * an [initialValueState], it is used only for adjusting the initial value
-         * of [animation].
+         * When the target state has changed, but the target value remains the same, the initial
+         * value animation completely controls the animated value. When this flag is `true`, the
+         * [animation] can be ignored and only the [initialValueState] is needed to determine the
+         * value. When this is `false`, if there is an [initialValueState], it is used only for
+         * adjusting the initial value of [animation].
          */
         private var useOnlyInitialValue = false
 
         // Changed during animation, no concerns of rolling back
         override var value by mutableStateOf(initialValue)
             internal set
+
         private var velocityVector: V = initialVelocityVector
         internal val durationNanos: Long
             get() {
@@ -1393,6 +1353,7 @@
                 _durationNanos = animation.durationNanos
                 return _durationNanos
             }
+
         private var _durationNanos by mutableLongStateOf(animation.durationNanos)
         private var isSeeking = false
 
@@ -1426,19 +1387,20 @@
         /**
          * Updates the initial value animation. When a SeekableTransitionState transition is
          * interrupted, the ongoing animation is moved to changing the initial value. The starting
-         * point of the animation is then animated toward the value that would be set at the
-         * target state, while the current value is controlled by seeking or animation.
+         * point of the animation is then animated toward the value that would be set at the target
+         * state, while the current value is controlled by seeking or animation.
          */
         internal fun updateInitialValue() {
             val animState = initialValueState ?: return
             val animation = initialValueAnimation ?: return
 
-            val initialPlayTimeNanos = (
-                // Single-precision floating point is not sufficient here as it only has about 7
-                // decimal digits of precision. We are dealing with nanos which has at least 9
-                // decimal digits in most cases.
-                animState.durationNanos * animState.value.toDouble()
-                ).roundToLong()
+            val initialPlayTimeNanos =
+                (
+                    // Single-precision floating point is not sufficient here as it only has about 7
+                    // decimal digits of precision. We are dealing with nanos which has at least 9
+                    // decimal digits in most cases.
+                    animState.durationNanos * animState.value.toDouble())
+                    .roundToLong()
             val initialValue = animation.getValueFromNanos(initialPlayTimeNanos)
             if (useOnlyInitialValue) {
                 this.animation.mutableTargetValue = initialValue
@@ -1460,13 +1422,14 @@
         private val interruptionSpec: FiniteAnimationSpec<T>
 
         init {
-            val visibilityThreshold: T? = visibilityThresholdMap.get(typeConverter)?.let {
-                val vector = typeConverter.convertToVector(initialValue)
-                for (id in 0 until vector.size) {
-                    vector[id] = it
+            val visibilityThreshold: T? =
+                visibilityThresholdMap.get(typeConverter)?.let {
+                    val vector = typeConverter.convertToVector(initialValue)
+                    for (id in 0 until vector.size) {
+                        vector[id] = it
+                    }
+                    typeConverter.convertFromVector(vector)
                 }
-                typeConverter.convertFromVector(vector)
-            }
             interruptionSpec = spring(visibilityThreshold = visibilityThreshold)
         }
 
@@ -1477,34 +1440,32 @@
             if (initialValueAnimation?.targetValue == targetValue) {
                 // This animation didn't change the target value, so let the initial value animation
                 // take care of it.
-                animation = TargetBasedAnimation(
-                    interruptionSpec,
-                    typeConverter,
-                    initialValue,
-                    initialValue,
-                    velocityVector.newInstance() // 0 velocity
-                )
+                animation =
+                    TargetBasedAnimation(
+                        interruptionSpec,
+                        typeConverter,
+                        initialValue,
+                        initialValue,
+                        velocityVector.newInstance() // 0 velocity
+                    )
                 useOnlyInitialValue = true
                 return
             }
-            val specWithoutDelay = if (isInterrupted && !isSeeking) {
-                // When interrupted, use the default spring, unless the spec is also a spring.
-                if (animationSpec is SpringSpec<*>) animationSpec else interruptionSpec
-            } else {
-                animationSpec
-            }
-            val spec = if (playTimeNanos <= 0L) {
-                specWithoutDelay
-            } else {
-                delayed(specWithoutDelay, playTimeNanos)
-            }
-            animation = TargetBasedAnimation(
-                spec,
-                typeConverter,
-                initialValue,
-                targetValue,
-                velocityVector
-            )
+            val specWithoutDelay =
+                if (isInterrupted && !isSeeking) {
+                    // When interrupted, use the default spring, unless the spec is also a spring.
+                    if (animationSpec is SpringSpec<*>) animationSpec else interruptionSpec
+                } else {
+                    animationSpec
+                }
+            val spec =
+                if (playTimeNanos <= 0L) {
+                    specWithoutDelay
+                } else {
+                    delayed(specWithoutDelay, playTimeNanos)
+                }
+            animation =
+                TargetBasedAnimation(spec, typeConverter, initialValue, targetValue, velocityVector)
             useOnlyInitialValue = false
             onChildAnimationUpdated()
         }
@@ -1515,8 +1476,8 @@
 
         /**
          * Forces the value to the given fraction or reset value. If [fraction] is
-         * [ResetAnimationSnapCurrent] or [ResetAnimationSnapTarget], the animated values
-         * are directly moved to the start or end of the animation.
+         * [ResetAnimationSnapCurrent] or [ResetAnimationSnapTarget], the animated values are
+         * directly moved to the start or end of the animation.
          */
         internal fun resetAnimationValue(fraction: Float) {
             if (fraction == ResetAnimationSnapCurrent || fraction == ResetAnimationSnapTarget) {
@@ -1527,11 +1488,12 @@
                     initialValueAnimation = null
                 }
 
-                val animationValue = if (fraction == ResetAnimationSnapCurrent) {
-                    animation.initialValue
-                } else {
-                    animation.targetValue
-                }
+                val animationValue =
+                    if (fraction == ResetAnimationSnapCurrent) {
+                        animation.initialValue
+                    } else {
+                        animation.targetValue
+                    }
                 animation.mutableInitialValue = animationValue
                 animation.mutableTargetValue = animationValue
                 value = animationValue
@@ -1548,13 +1510,14 @@
                 initialValueAnimation = animation
                 initialValueState = animationState
             }
-            animation = TargetBasedAnimation(
-                interruptionSpec,
-                typeConverter,
-                value,
-                value,
-                velocityVector.newInstance() // 0 velocity
-            )
+            animation =
+                TargetBasedAnimation(
+                    interruptionSpec,
+                    typeConverter,
+                    value,
+                    value,
+                    velocityVector.newInstance() // 0 velocity
+                )
             useOnlyInitialValue = true
         }
 
@@ -1570,10 +1533,7 @@
 
         // This gets called *during* composition
         @OptIn(InternalAnimationApi::class)
-        internal fun updateTargetValue(
-            targetValue: T,
-            animationSpec: FiniteAnimationSpec<T>
-        ) {
+        internal fun updateTargetValue(targetValue: T, animationSpec: FiniteAnimationSpec<T>) {
             if (useOnlyInitialValue && targetValue == initialValueAnimation?.targetValue) {
                 return // we're already animating to the target value through the initial value
             }
@@ -1604,22 +1564,18 @@
         ) {
             this.targetValue = targetValue
             this.animationSpec = animationSpec
-            if (
-                animation.initialValue == initialValue &&
-                animation.targetValue == targetValue
-            ) {
+            if (animation.initialValue == initialValue && animation.targetValue == targetValue) {
                 return
             }
             updateAnimation(initialValue)
         }
     }
 
-    private class SegmentImpl<S>(
-        override val initialState: S,
-        override val targetState: S
-    ) : Segment<S> {
+    private class SegmentImpl<S>(override val initialState: S, override val targetState: S) :
+        Segment<S> {
         override fun equals(other: Any?): Boolean {
-            return other is Segment<*> && initialState == other.initialState &&
+            return other is Segment<*> &&
+                initialState == other.initialState &&
                 targetState == other.targetState
         }
 
@@ -1635,14 +1591,10 @@
      */
     @JvmDefaultWithCompatibility
     interface Segment<S> {
-        /**
-         * Initial state of a Transition Segment. This is the state that transition starts from.
-         */
+        /** Initial state of a Transition Segment. This is the state that transition starts from. */
         val initialState: S
 
-        /**
-         * Target state of a Transition Segment. This is the state that transition will end on.
-         */
+        /** Target state of a Transition Segment. This is the state that transition will end on. */
         val targetState: S
 
         /**
@@ -1656,18 +1608,15 @@
 
     /**
      * [DeferredAnimation] can be constructed using [Transition.createDeferredAnimation] during
-     * composition and initialized later. It is useful for animations, the target values for
-     * which are unknown at composition time (e.g. layout size/position, etc).
+     * composition and initialized later. It is useful for animations, the target values for which
+     * are unknown at composition time (e.g. layout size/position, etc).
      *
      * Once a [DeferredAnimation] is created, it can be configured and updated as needed using
      * [DeferredAnimation.animate] method.
-     *
      */
     @RestrictTo(RestrictTo.Scope.LIBRARY)
-    inner class DeferredAnimation<T, V : AnimationVector> internal constructor(
-        val typeConverter: TwoWayConverter<T, V>,
-        val label: String
-    ) {
+    inner class DeferredAnimation<T, V : AnimationVector>
+    internal constructor(val typeConverter: TwoWayConverter<T, V>, val label: String) {
         internal var data: DeferredAnimationData<T, V>? by mutableStateOf(null)
 
         internal inner class DeferredAnimationData<T, V : AnimationVector>(
@@ -1699,28 +1648,33 @@
 
         /**
          * [DeferredAnimation] allows the animation setup to be deferred until a later time after
-         * composition. [animate] can be used to set up a [DeferredAnimation]. Like other
-         * Transition animations such as [Transition.animateFloat], [DeferredAnimation] also
-         * expects [transitionSpec] and [targetValueByState] for the mapping from target state
-         * to animation spec and target value, respectively.
+         * composition. [animate] can be used to set up a [DeferredAnimation]. Like other Transition
+         * animations such as [Transition.animateFloat], [DeferredAnimation] also expects
+         * [transitionSpec] and [targetValueByState] for the mapping from target state to animation
+         * spec and target value, respectively.
          */
         fun animate(
             transitionSpec: Segment<S>.() -> FiniteAnimationSpec<T>,
             targetValueByState: (state: S) -> T
         ): State<T> {
-            val animData: DeferredAnimationData<T, V> = data ?: DeferredAnimationData(
-                TransitionAnimationState(
-                    targetValueByState(currentState),
-                    typeConverter.createZeroVectorFrom(targetValueByState(currentState)),
-                    typeConverter,
-                    label
-                ),
-                transitionSpec,
-                targetValueByState
-            ).apply {
-                data = this
-                addAnimation(this.animation)
-            }
+            val animData: DeferredAnimationData<T, V> =
+                data
+                    ?: DeferredAnimationData(
+                            TransitionAnimationState(
+                                targetValueByState(currentState),
+                                typeConverter.createZeroVectorFrom(
+                                    targetValueByState(currentState)
+                                ),
+                                typeConverter,
+                                label
+                            ),
+                            transitionSpec,
+                            targetValueByState
+                        )
+                        .apply {
+                            data = this
+                            addAnimation(this.animation)
+                        }
             return animData.apply {
                 // Update animtion data with the latest mapping
                 this.targetValueByState = targetValueByState
@@ -1742,9 +1696,7 @@
     }
 
     internal fun removeAnimation(deferredAnimation: DeferredAnimation<*, *>) {
-        deferredAnimation.data?.animation?.let {
-            removeAnimation(it)
-        }
+        deferredAnimation.data?.animation?.let { removeAnimation(it) }
     }
 }
 
@@ -1772,7 +1724,6 @@
  *
  * @param typeConverter A converter to convert any value of type [T] from/to an [AnimationVector]
  * @param label A label for differentiating this animation from others in android studio.
- *
  */
 @RestrictTo(RestrictTo.Scope.LIBRARY)
 @Composable
@@ -1781,11 +1732,7 @@
     label: String = "DeferredAnimation"
 ): Transition<S>.DeferredAnimation<T, V> {
     val lazyAnim = remember(this) { DeferredAnimation(typeConverter, label) }
-    DisposableEffect(lazyAnim) {
-        onDispose {
-            removeAnimation(lazyAnim)
-        }
-    }
+    DisposableEffect(lazyAnim) { onDispose { removeAnimation(lazyAnim) } }
     if (isSeeking) {
         lazyAnim.setupSeeking()
     }
@@ -1795,13 +1742,13 @@
 /**
  * [createChildTransition] creates a child Transition based on the mapping between parent state to
  * child state provided in [transformToChildState]. This serves the following purposes:
- * 1) Hoist the child transition state into parent transition. Therefore the parent Transition
- * will be aware of whether there's any on-going animation due to the same target state change.
- * This will further allow sequential animation to be set up when all animations have finished.
+ * 1) Hoist the child transition state into parent transition. Therefore the parent Transition will
+ *    be aware of whether there's any on-going animation due to the same target state change. This
+ *    will further allow sequential animation to be set up when all animations have finished.
  * 2) Separation of concerns. The child transition can respresent a much more simplified state
- * transition when, for example, mapping from an enum parent state to a Boolean visible state for
- * passing further down the compose tree. The child composables hence can be designed around
- * handling a more simple and a more relevant state change.
+ *    transition when, for example, mapping from an enum parent state to a Boolean visible state for
+ *    passing further down the compose tree. The child composables hence can be designed around
+ *    handling a more simple and a more relevant state change.
  *
  * [label] is used to differentiate from other animations in the same transition in Android Studio.
  *
@@ -1826,15 +1773,14 @@
     targetState: T,
     childLabel: String,
 ): Transition<T> {
-    val transition = remember(this) {
-        Transition(MutableTransitionState(initialState), this, "${this.label} > $childLabel")
-    }
+    val transition =
+        remember(this) {
+            Transition(MutableTransitionState(initialState), this, "${this.label} > $childLabel")
+        }
 
     DisposableEffect(transition) {
         addTransition(transition)
-        onDispose {
-            removeTransition(transition)
-        }
+        onDispose { removeTransition(transition) }
     }
 
     if (isSeeking) {
@@ -1851,8 +1797,8 @@
 }
 
 /**
- * Creates an animation of type [T] as a part of the given [Transition]. This means the states
- * of this animation will be managed by the [Transition]. [typeConverter] will be used to convert
+ * Creates an animation of type [T] as a part of the given [Transition]. This means the states of
+ * this animation will be managed by the [Transition]. [typeConverter] will be used to convert
  * between type [T] and [AnimationVector] so that the animation system knows how to animate it.
  *
  * [targetValueByState] is used as a mapping from a target state to the target value of this
@@ -1879,8 +1825,9 @@
 @Composable
 inline fun <S, T, V : AnimationVector> Transition<S>.animateValue(
     typeConverter: TwoWayConverter<T, V>,
-    noinline transitionSpec: @Composable Transition.Segment<S>.() -> FiniteAnimationSpec<T> =
-        { spring() },
+    noinline transitionSpec: @Composable Transition.Segment<S>.() -> FiniteAnimationSpec<T> = {
+        spring()
+    },
     label: String = "ValueAnimation",
     targetValueByState: @Composable (state: S) -> T
 ): State<T> {
@@ -1901,42 +1848,37 @@
     typeConverter: TwoWayConverter<T, V>,
     label: String
 ): State<T> {
-    val transitionAnimation = remember(this) {
-        // Initialize the animation state to initialState value, so if it's added during a
-        // transition run, it'll participate in the animation.
-        // This is preferred because it's easy to opt out - Simply adding new animation once
-        // currentState == targetState would opt out.
-        TransitionAnimationState(
-            initialValue,
-            typeConverter.createZeroVectorFrom(targetValue),
-            typeConverter,
-            label
-        )
-    }
+    val transitionAnimation =
+        remember(this) {
+            // Initialize the animation state to initialState value, so if it's added during a
+            // transition run, it'll participate in the animation.
+            // This is preferred because it's easy to opt out - Simply adding new animation once
+            // currentState == targetState would opt out.
+            TransitionAnimationState(
+                initialValue,
+                typeConverter.createZeroVectorFrom(targetValue),
+                typeConverter,
+                label
+            )
+        }
     if (isSeeking) {
         // In the case of seeking, we also need to update initial value as needed
-        transitionAnimation.updateInitialAndTargetValue(
-            initialValue,
-            targetValue,
-            animationSpec
-        )
+        transitionAnimation.updateInitialAndTargetValue(initialValue, targetValue, animationSpec)
     } else {
         transitionAnimation.updateTargetValue(targetValue, animationSpec)
     }
 
     DisposableEffect(transitionAnimation) {
         addAnimation(transitionAnimation)
-        onDispose {
-            removeAnimation(transitionAnimation)
-        }
+        onDispose { removeAnimation(transitionAnimation) }
     }
     return transitionAnimation
 }
 
 // TODO: Remove noinline when b/174814083 is fixed.
 /**
- * Creates a Float animation as a part of the given [Transition]. This means the states
- * of this animation will be managed by the [Transition].
+ * Creates a Float animation as a part of the given [Transition]. This means the states of this
+ * animation will be managed by the [Transition].
  *
  * [targetValueByState] is used as a mapping from a target state to the target value of this
  * animation. [Transition] will be using this mapping to determine what value to target this
@@ -1963,16 +1905,16 @@
  */
 @Composable
 inline fun <S> Transition<S>.animateFloat(
-    noinline transitionSpec:
-    @Composable Transition.Segment<S>.() -> FiniteAnimationSpec<Float> = { spring() },
+    noinline transitionSpec: @Composable Transition.Segment<S>.() -> FiniteAnimationSpec<Float> = {
+        spring()
+    },
     label: String = "FloatAnimation",
     targetValueByState: @Composable (state: S) -> Float
-): State<Float> =
-    animateValue(Float.VectorConverter, transitionSpec, label, targetValueByState)
+): State<Float> = animateValue(Float.VectorConverter, transitionSpec, label, targetValueByState)
 
 /**
- * Creates a [Dp] animation as a part of the given [Transition]. This means the states
- * of this animation will be managed by the [Transition].
+ * Creates a [Dp] animation as a part of the given [Transition]. This means the states of this
+ * animation will be managed by the [Transition].
  *
  * [targetValueByState] is used as a mapping from a target state to the target value of this
  * animation. [Transition] will be using this mapping to determine what value to target this
@@ -1998,12 +1940,11 @@
     },
     label: String = "DpAnimation",
     targetValueByState: @Composable (state: S) -> Dp
-): State<Dp> =
-    animateValue(Dp.VectorConverter, transitionSpec, label, targetValueByState)
+): State<Dp> = animateValue(Dp.VectorConverter, transitionSpec, label, targetValueByState)
 
 /**
- * Creates an [Offset] animation as a part of the given [Transition]. This means the states
- * of this animation will be managed by the [Transition].
+ * Creates an [Offset] animation as a part of the given [Transition]. This means the states of this
+ * animation will be managed by the [Transition].
  *
  * [targetValueByState] is used as a mapping from a target state to the target value of this
  * animation. [Transition] will be using this mapping to determine what value to target this
@@ -2029,12 +1970,11 @@
     },
     label: String = "OffsetAnimation",
     targetValueByState: @Composable (state: S) -> Offset
-): State<Offset> =
-    animateValue(Offset.VectorConverter, transitionSpec, label, targetValueByState)
+): State<Offset> = animateValue(Offset.VectorConverter, transitionSpec, label, targetValueByState)
 
 /**
- * Creates a [Size] animation as a part of the given [Transition]. This means the states
- * of this animation will be managed by the [Transition].
+ * Creates a [Size] animation as a part of the given [Transition]. This means the states of this
+ * animation will be managed by the [Transition].
  *
  * [targetValueByState] is used as a mapping from a target state to the target value of this
  * animation. [Transition] will be using this mapping to determine what value to target this
@@ -2060,12 +2000,11 @@
     },
     label: String = "SizeAnimation",
     targetValueByState: @Composable (state: S) -> Size
-): State<Size> =
-    animateValue(Size.VectorConverter, transitionSpec, label, targetValueByState)
+): State<Size> = animateValue(Size.VectorConverter, transitionSpec, label, targetValueByState)
 
 /**
- * Creates a [IntOffset] animation as a part of the given [Transition]. This means the states
- * of this animation will be managed by the [Transition].
+ * Creates a [IntOffset] animation as a part of the given [Transition]. This means the states of
+ * this animation will be managed by the [Transition].
  *
  * [targetValueByState] is used as a mapping from a target state to the target value of this
  * animation. [Transition] will be using this mapping to determine what value to target this
@@ -2087,16 +2026,19 @@
 @Composable
 inline fun <S> Transition<S>.animateIntOffset(
     noinline transitionSpec:
-    @Composable Transition.Segment<S>.() -> FiniteAnimationSpec<IntOffset> =
-        { spring(visibilityThreshold = IntOffset(1, 1)) },
+        @Composable
+        Transition.Segment<S>.() -> FiniteAnimationSpec<IntOffset> =
+        {
+            spring(visibilityThreshold = IntOffset(1, 1))
+        },
     label: String = "IntOffsetAnimation",
     targetValueByState: @Composable (state: S) -> IntOffset
 ): State<IntOffset> =
     animateValue(IntOffset.VectorConverter, transitionSpec, label, targetValueByState)
 
 /**
- * Creates a [Int] animation as a part of the given [Transition]. This means the states
- * of this animation will be managed by the [Transition].
+ * Creates a [Int] animation as a part of the given [Transition]. This means the states of this
+ * animation will be managed by the [Transition].
  *
  * [targetValueByState] is used as a mapping from a target state to the target value of this
  * animation. [Transition] will be using this mapping to determine what value to target this
@@ -2122,12 +2064,11 @@
     },
     label: String = "IntAnimation",
     targetValueByState: @Composable (state: S) -> Int
-): State<Int> =
-    animateValue(Int.VectorConverter, transitionSpec, label, targetValueByState)
+): State<Int> = animateValue(Int.VectorConverter, transitionSpec, label, targetValueByState)
 
 /**
- * Creates a [IntSize] animation as a part of the given [Transition]. This means the states
- * of this animation will be managed by the [Transition].
+ * Creates a [IntSize] animation as a part of the given [Transition]. This means the states of this
+ * animation will be managed by the [Transition].
  *
  * [targetValueByState] is used as a mapping from a target state to the target value of this
  * animation. [Transition] will be using this mapping to determine what value to target this
@@ -2149,15 +2090,16 @@
 @Composable
 inline fun <S> Transition<S>.animateIntSize(
     noinline transitionSpec: @Composable Transition.Segment<S>.() -> FiniteAnimationSpec<IntSize> =
-        { spring(visibilityThreshold = IntSize(1, 1)) },
+        {
+            spring(visibilityThreshold = IntSize(1, 1))
+        },
     label: String = "IntSizeAnimation",
     targetValueByState: @Composable (state: S) -> IntSize
-): State<IntSize> =
-    animateValue(IntSize.VectorConverter, transitionSpec, label, targetValueByState)
+): State<IntSize> = animateValue(IntSize.VectorConverter, transitionSpec, label, targetValueByState)
 
 /**
- * Creates a [Rect] animation as a part of the given [Transition]. This means the states
- * of this animation will be managed by the [Transition].
+ * Creates a [Rect] animation as a part of the given [Transition]. This means the states of this
+ * animation will be managed by the [Transition].
  *
  * [targetValueByState] is used as a mapping from a target state to the target value of this
  * animation. [Transition] will be using this mapping to determine what value to target this
@@ -2178,9 +2120,9 @@
  */
 @Composable
 inline fun <S> Transition<S>.animateRect(
-    noinline transitionSpec: @Composable Transition.Segment<S>.() -> FiniteAnimationSpec<Rect> =
-        { spring(visibilityThreshold = Rect.VisibilityThreshold) },
+    noinline transitionSpec: @Composable Transition.Segment<S>.() -> FiniteAnimationSpec<Rect> = {
+        spring(visibilityThreshold = Rect.VisibilityThreshold)
+    },
     label: String = "RectAnimation",
     targetValueByState: @Composable (state: S) -> Rect
-): State<Rect> =
-    animateValue(Rect.VectorConverter, transitionSpec, label, targetValueByState)
+): State<Rect> = animateValue(Rect.VectorConverter, transitionSpec, label, targetValueByState)
diff --git a/compose/animation/animation-core/src/commonMain/kotlin/androidx/compose/animation/core/VectorConverters.kt b/compose/animation/animation-core/src/commonMain/kotlin/androidx/compose/animation/core/VectorConverters.kt
index d197dc0..6e5f1ec 100644
--- a/compose/animation/animation-core/src/commonMain/kotlin/androidx/compose/animation/core/VectorConverters.kt
+++ b/compose/animation/animation-core/src/commonMain/kotlin/androidx/compose/animation/core/VectorConverters.kt
@@ -27,9 +27,9 @@
 import androidx.compose.ui.util.fastRoundToInt
 
 /**
- * [TwoWayConverter] class contains the definition on how to convert from an arbitrary type [T]
- * to a [AnimationVector], and convert the [AnimationVector] back to the type [T]. This allows
- * animations to run on any type of objects, e.g. position, rectangle, color, etc.
+ * [TwoWayConverter] class contains the definition on how to convert from an arbitrary type [T] to a
+ * [AnimationVector], and convert the [AnimationVector] back to the type [T]. This allows animations
+ * to run on any type of objects, e.g. position, rectangle, color, etc.
  */
 interface TwoWayConverter<T, V : AnimationVector> {
     /**
@@ -58,9 +58,7 @@
     convertFromVector: (V) -> T
 ): TwoWayConverter<T, V> = TwoWayConverterImpl(convertToVector, convertFromVector)
 
-/**
- * Type converter to convert type [T] to and from a [AnimationVector1D].
- */
+/** Type converter to convert type [T] to and from a [AnimationVector1D]. */
 private class TwoWayConverterImpl<T, V : AnimationVector>(
     override val convertToVector: (T) -> V,
     override val convertFromVector: (V) -> T
@@ -69,15 +67,11 @@
 internal fun lerp(start: Float, stop: Float, fraction: Float) =
     (start * (1 - fraction) + stop * fraction)
 
-/**
- * A [TwoWayConverter] that converts [Float] from and to [AnimationVector1D]
- */
+/** A [TwoWayConverter] that converts [Float] from and to [AnimationVector1D] */
 val Float.Companion.VectorConverter: TwoWayConverter<Float, AnimationVector1D>
     get() = FloatToVector
 
-/**
- * A [TwoWayConverter] that converts [Int] from and to [AnimationVector1D]
- */
+/** A [TwoWayConverter] that converts [Int] from and to [AnimationVector1D] */
 val Int.Companion.VectorConverter: TwoWayConverter<Int, AnimationVector1D>
     get() = IntToVector
 
@@ -86,39 +80,27 @@
 
 private val IntToVector: TwoWayConverter<Int, AnimationVector1D> =
     TwoWayConverter({ AnimationVector1D(it.toFloat()) }, { it.value.toInt() })
-/**
- * A type converter that converts a [Rect] to a [AnimationVector4D], and vice versa.
- */
+/** A type converter that converts a [Rect] to a [AnimationVector4D], and vice versa. */
 val Rect.Companion.VectorConverter: TwoWayConverter<Rect, AnimationVector4D>
     get() = RectToVector
 
-/**
- * A type converter that converts a [Dp] to a [AnimationVector1D], and vice versa.
- */
+/** A type converter that converts a [Dp] to a [AnimationVector1D], and vice versa. */
 val Dp.Companion.VectorConverter: TwoWayConverter<Dp, AnimationVector1D>
     get() = DpToVector
 
-/**
- * A type converter that converts a [DpOffset] to a [AnimationVector2D], and vice versa.
- */
+/** A type converter that converts a [DpOffset] to a [AnimationVector2D], and vice versa. */
 val DpOffset.Companion.VectorConverter: TwoWayConverter<DpOffset, AnimationVector2D>
     get() = DpOffsetToVector
 
-/**
- * A type converter that converts a [Size] to a [AnimationVector2D], and vice versa.
- */
+/** A type converter that converts a [Size] to a [AnimationVector2D], and vice versa. */
 val Size.Companion.VectorConverter: TwoWayConverter<Size, AnimationVector2D>
     get() = SizeToVector
 
-/**
- * A type converter that converts a [Offset] to a [AnimationVector2D], and vice versa.
- */
+/** A type converter that converts a [Offset] to a [AnimationVector2D], and vice versa. */
 val Offset.Companion.VectorConverter: TwoWayConverter<Offset, AnimationVector2D>
     get() = OffsetToVector
 
-/**
- * A type converter that converts a [IntOffset] to a [AnimationVector2D], and vice versa.
- */
+/** A type converter that converts a [IntOffset] to a [AnimationVector2D], and vice versa. */
 val IntOffset.Companion.VectorConverter: TwoWayConverter<IntOffset, AnimationVector2D>
     get() = IntOffsetToVector
 
@@ -130,44 +112,35 @@
 val IntSize.Companion.VectorConverter: TwoWayConverter<IntSize, AnimationVector2D>
     get() = IntSizeToVector
 
-/**
- * A type converter that converts a [Dp] to a [AnimationVector1D], and vice versa.
- */
-private val DpToVector: TwoWayConverter<Dp, AnimationVector1D> = TwoWayConverter(
-    convertToVector = { AnimationVector1D(it.value) },
-    convertFromVector = { Dp(it.value) }
-)
+/** A type converter that converts a [Dp] to a [AnimationVector1D], and vice versa. */
+private val DpToVector: TwoWayConverter<Dp, AnimationVector1D> =
+    TwoWayConverter(
+        convertToVector = { AnimationVector1D(it.value) },
+        convertFromVector = { Dp(it.value) }
+    )
 
-/**
- * A type converter that converts a [DpOffset] to a [AnimationVector2D], and vice versa.
- */
+/** A type converter that converts a [DpOffset] to a [AnimationVector2D], and vice versa. */
 private val DpOffsetToVector: TwoWayConverter<DpOffset, AnimationVector2D> =
     TwoWayConverter(
         convertToVector = { AnimationVector2D(it.x.value, it.y.value) },
         convertFromVector = { DpOffset(it.v1.dp, it.v2.dp) }
     )
 
-/**
- * A type converter that converts a [Size] to a [AnimationVector2D], and vice versa.
- */
+/** A type converter that converts a [Size] to a [AnimationVector2D], and vice versa. */
 private val SizeToVector: TwoWayConverter<Size, AnimationVector2D> =
     TwoWayConverter(
         convertToVector = { AnimationVector2D(it.width, it.height) },
         convertFromVector = { Size(it.v1, it.v2) }
     )
 
-/**
- * A type converter that converts a [Offset] to a [AnimationVector2D], and vice versa.
- */
+/** A type converter that converts a [Offset] to a [AnimationVector2D], and vice versa. */
 private val OffsetToVector: TwoWayConverter<Offset, AnimationVector2D> =
     TwoWayConverter(
         convertToVector = { AnimationVector2D(it.x, it.y) },
         convertFromVector = { Offset(it.v1, it.v2) }
     )
 
-/**
- * A type converter that converts a [IntOffset] to a [AnimationVector2D], and vice versa.
- */
+/** A type converter that converts a [IntOffset] to a [AnimationVector2D], and vice versa. */
 private val IntOffsetToVector: TwoWayConverter<IntOffset, AnimationVector2D> =
     TwoWayConverter(
         convertToVector = { AnimationVector2D(it.x.toFloat(), it.y.toFloat()) },
@@ -190,15 +163,9 @@
         }
     )
 
-/**
- * A type converter that converts a [Rect] to a [AnimationVector4D], and vice versa.
- */
+/** A type converter that converts a [Rect] to a [AnimationVector4D], and vice versa. */
 private val RectToVector: TwoWayConverter<Rect, AnimationVector4D> =
     TwoWayConverter(
-        convertToVector = {
-            AnimationVector4D(it.left, it.top, it.right, it.bottom)
-        },
-        convertFromVector = {
-            Rect(it.v1, it.v2, it.v3, it.v4)
-        }
+        convertToVector = { AnimationVector4D(it.left, it.top, it.right, it.bottom) },
+        convertFromVector = { Rect(it.v1, it.v2, it.v3, it.v4) }
     )
diff --git a/compose/animation/animation-core/src/commonMain/kotlin/androidx/compose/animation/core/VectorizedAnimationSpec.kt b/compose/animation/animation-core/src/commonMain/kotlin/androidx/compose/animation/core/VectorizedAnimationSpec.kt
index 07d9fb2..f937784 100644
--- a/compose/animation/animation-core/src/commonMain/kotlin/androidx/compose/animation/core/VectorizedAnimationSpec.kt
+++ b/compose/animation/animation-core/src/commonMain/kotlin/androidx/compose/animation/core/VectorizedAnimationSpec.kt
@@ -24,22 +24,22 @@
 import kotlin.math.min
 
 /**
- * [VectorizedAnimationSpec]s are stateless vector based animation specifications. They do
- * not assume any starting/ending conditions. Nor do they manage a lifecycle. All it stores is the
+ * [VectorizedAnimationSpec]s are stateless vector based animation specifications. They do not
+ * assume any starting/ending conditions. Nor do they manage a lifecycle. All it stores is the
  * configuration that is particular to the type of the animation. easing and duration for
  * [VectorizedTweenSpec]s, or spring constants for [VectorizedSpringSpec]s. Its stateless nature
- * allows the same [VectorizedAnimationSpec] to be reused by a few different running animations
- * with different starting and ending values. More importantly, it allows the system to reuse the
- * same animation spec when the animation target changes in-flight.
+ * allows the same [VectorizedAnimationSpec] to be reused by a few different running animations with
+ * different starting and ending values. More importantly, it allows the system to reuse the same
+ * animation spec when the animation target changes in-flight.
  *
  * Since [VectorizedAnimationSpec]s are stateless, it requires starting value/velocity and ending
  * value to be passed in, along with playtime, to calculate the value or velocity at that time. Play
- * time here is the progress of the animation in terms of milliseconds, where 0 means the start
- * of the animation and [getDurationNanos] returns the play time for the end of the animation.
+ * time here is the progress of the animation in terms of milliseconds, where 0 means the start of
+ * the animation and [getDurationNanos] returns the play time for the end of the animation.
  *
- * __Note__: For use cases where the starting values/velocity and ending values aren't expected
- * to change, it is recommended to use [Animation] that caches these static values and hence
- * does not require them to be supplied in the value/velocity calculation.
+ * __Note__: For use cases where the starting values/velocity and ending values aren't expected to
+ * change, it is recommended to use [Animation] that caches these static values and hence does not
+ * require them to be supplied in the value/velocity calculation.
  *
  * @see Animation
  */
@@ -87,47 +87,40 @@
     /**
      * Calculates the duration of an animation. For duration-based animations, this will return the
      * pre-defined duration. For physics-based animations, the duration will be estimated based on
-     * the physics configuration (such as spring stiffness, damping ratio, visibility threshold)
-     * as well as the [initialValue], [targetValue] values, and [initialVelocity].
+     * the physics configuration (such as spring stiffness, damping ratio, visibility threshold) as
+     * well as the [initialValue], [targetValue] values, and [initialVelocity].
      *
      * @param initialValue start value of the animation
      * @param targetValue end value of the animation
      * @param initialVelocity start velocity of the animation
      */
     @Suppress("MethodNameUnits")
-    fun getDurationNanos(
-        initialValue: V,
-        targetValue: V,
-        initialVelocity: V
-    ): Long
+    fun getDurationNanos(initialValue: V, targetValue: V, initialVelocity: V): Long
 
     /**
      * Calculates the end velocity of the animation with the provided start/end values, and start
-     * velocity. For duration-based animations, end velocity will be the velocity of the
-     * animation at the duration time. This is also the default assumption. However, for
-     * physics-based animations, end velocity is an [AnimationVector] of 0s.
+     * velocity. For duration-based animations, end velocity will be the velocity of the animation
+     * at the duration time. This is also the default assumption. However, for physics-based
+     * animations, end velocity is an [AnimationVector] of 0s.
      *
      * @param initialValue start value of the animation
      * @param targetValue end value of the animation
      * @param initialVelocity start velocity of the animation
      */
-    fun getEndVelocity(
-        initialValue: V,
-        targetValue: V,
-        initialVelocity: V
-    ): V = getVelocityFromNanos(
-        getDurationNanos(initialValue, targetValue, initialVelocity),
-        initialValue,
-        targetValue,
-        initialVelocity
-    )
+    fun getEndVelocity(initialValue: V, targetValue: V, initialVelocity: V): V =
+        getVelocityFromNanos(
+            getDurationNanos(initialValue, targetValue, initialVelocity),
+            initialValue,
+            targetValue,
+            initialVelocity
+        )
 }
 
 /**
  * Calculates the duration of an animation. For duration-based animations, this will return the
- * pre-defined duration. For physics-based animations, the duration will be estimated based on
- * the physics configuration (such as spring stiffness, damping ratio, visibility threshold)
- * as well as the [initialValue], [targetValue] values, and [initialVelocity].
+ * pre-defined duration. For physics-based animations, the duration will be estimated based on the
+ * physics configuration (such as spring stiffness, damping ratio, visibility threshold) as well as
+ * the [initialValue], [targetValue] values, and [initialVelocity].
  *
  * @param initialValue start value of the animation
  * @param targetValue end value of the animation
@@ -140,8 +133,8 @@
 ): Long = getDurationNanos(initialValue, targetValue, initialVelocity) / MillisToNanos
 
 /**
- * Calculates the value of the animation at given the playtime, with the provided start/end
- * values, and start velocity.
+ * Calculates the value of the animation at given the playtime, with the provided start/end values,
+ * and start velocity.
  *
  * @param playTimeMillis time since the start of the animation
  * @param start start value of the animation
@@ -164,23 +157,18 @@
  */
 @JvmDefaultWithCompatibility
 interface VectorizedFiniteAnimationSpec<V : AnimationVector> : VectorizedAnimationSpec<V> {
-    override val isInfinite: Boolean get() = false
+    override val isInfinite: Boolean
+        get() = false
 }
 
-/**
- * Base class for [VectorizedAnimationSpec]s that are based on a fixed [durationMillis].
- */
+/** Base class for [VectorizedAnimationSpec]s that are based on a fixed [durationMillis]. */
 @JvmDefaultWithCompatibility
 interface VectorizedDurationBasedAnimationSpec<V : AnimationVector> :
     VectorizedFiniteAnimationSpec<V> {
-    /**
-     * duration is the amount of time while animation is not yet finished.
-     */
+    /** duration is the amount of time while animation is not yet finished. */
     val durationMillis: Int
 
-    /**
-     * delay defines the amount of time that animation can be delayed.
-     */
+    /** delay defines the amount of time that animation can be delayed. */
     val delayMillis: Int
 
     @Suppress("MethodNameUnits")
@@ -217,13 +205,14 @@
  *          delayMillis = delay
  *     )
  *
- * The interpolation between each value is dictated by [VectorizedKeyframeSpecElementInfo.arcMode] on each
- * keyframe. If no keyframe information is provided, [initialArcMode] is used.
+ * The interpolation between each value is dictated by [VectorizedKeyframeSpecElementInfo.arcMode]
+ * on each keyframe. If no keyframe information is provided, [initialArcMode] is used.
  *
  * @see [KeyframesSpec]
  */
 @OptIn(ExperimentalAnimationSpecApi::class)
-class VectorizedKeyframesSpec<V : AnimationVector> internal constructor(
+class VectorizedKeyframesSpec<V : AnimationVector>
+internal constructor(
     // List of all timestamps. Must include start (time = 0), end (time = durationMillis) and all
     // other timestamps found in [keyframes].
     private val timestamps: IntList,
@@ -238,43 +227,44 @@
 ) : VectorizedDurationBasedAnimationSpec<V> {
     /**
      * @param keyframes a map from time to a value/easing function pair. The value in each entry
-     *                  defines the animation value at that time, and the easing curve is used in
-     *                  the interval starting from that time.
+     *   defines the animation value at that time, and the easing curve is used in the interval
+     *   starting from that time.
      * @param durationMillis total duration of the animation
      * @param delayMillis the amount of the time the animation should wait before it starts.
-     *                    Defaults to 0.
+     *   Defaults to 0.
      */
     constructor(
         keyframes: Map<Int, Pair<V, Easing>>,
         durationMillis: Int,
         delayMillis: Int = 0
     ) : this(
-        timestamps = kotlin.run {
-            val times = MutableIntList(keyframes.size + 2)
-            keyframes.forEach { (t, _) ->
-                times.add(t)
-            }
-            if (!keyframes.containsKey(0)) {
-                times.add(0, 0)
-            }
-            if (!keyframes.containsKey(durationMillis)) {
-                times.add(durationMillis)
-            }
-            times.sort()
-            return@run times
-        },
-        keyframes = kotlin.run {
-            val timeToInfoMap = MutableIntObjectMap<VectorizedKeyframeSpecElementInfo<V>>()
-            keyframes.forEach { (time, valueEasing) ->
-                timeToInfoMap[time] = VectorizedKeyframeSpecElementInfo(
-                    vectorValue = valueEasing.first,
-                    easing = valueEasing.second,
-                    arcMode = ArcMode.Companion.ArcLinear
-                )
-            }
+        timestamps =
+            kotlin.run {
+                val times = MutableIntList(keyframes.size + 2)
+                keyframes.forEach { (t, _) -> times.add(t) }
+                if (!keyframes.containsKey(0)) {
+                    times.add(0, 0)
+                }
+                if (!keyframes.containsKey(durationMillis)) {
+                    times.add(durationMillis)
+                }
+                times.sort()
+                return@run times
+            },
+        keyframes =
+            kotlin.run {
+                val timeToInfoMap = MutableIntObjectMap<VectorizedKeyframeSpecElementInfo<V>>()
+                keyframes.forEach { (time, valueEasing) ->
+                    timeToInfoMap[time] =
+                        VectorizedKeyframeSpecElementInfo(
+                            vectorValue = valueEasing.first,
+                            easing = valueEasing.second,
+                            arcMode = ArcMode.Companion.ArcLinear
+                        )
+                }
 
-            return@run timeToInfoMap
-        },
+                return@run timeToInfoMap
+            },
         durationMillis = durationMillis,
         delayMillis = delayMillis,
         defaultEasing = LinearEasing,
@@ -306,18 +296,17 @@
             valueVector = initialValue.newInstance()
             velocityVector = initialVelocity.newInstance()
 
-            times = FloatArray(timestamps.size) {
-                timestamps[it].toFloat() / SecondsToMillis
-            }
+            times = FloatArray(timestamps.size) { timestamps[it].toFloat() / SecondsToMillis }
 
-            modes = IntArray(timestamps.size) {
-                val mode = (keyframes[timestamps[it]]?.arcMode ?: initialArcMode)
-                if (mode != ArcMode.Companion.ArcLinear) {
-                    requiresArcSpline = true
+            modes =
+                IntArray(timestamps.size) {
+                    val mode = (keyframes[timestamps[it]]?.arcMode ?: initialArcMode)
+                    if (mode != ArcMode.Companion.ArcLinear) {
+                        requiresArcSpline = true
+                    }
+
+                    mode.value
                 }
-
-                mode.value
-            }
         }
 
         if (!requiresArcSpline) {
@@ -325,8 +314,10 @@
         }
 
         // Initialize variables dependent on initial and/or target value
-        if (!::arcSpline.isInitialized ||
-            lastInitialValue != initialValue || lastTargetValue != targetValue
+        if (
+            !::arcSpline.isInitialized ||
+                lastInitialValue != initialValue ||
+                lastTargetValue != targetValue
         ) {
             lastInitialValue = initialValue
             lastTargetValue = targetValue
@@ -338,40 +329,37 @@
 
             // TODO(b/299477780): Re-use objects, after the first pass, only the initial and target
             //  may change, and only if the keyframes does not overwrite it
-            val values = Array(timestamps.size) {
-                when (val timestamp = timestamps[it]) {
-                    // Start (zero) and end (durationMillis) may not have been declared in keyframes
-                    0 -> {
-                        if (!keyframes.contains(timestamp)) {
-                            FloatArray(dimensionCount, initialValue::get)
-                        } else {
-                            FloatArray(dimensionCount, keyframes[timestamp]!!.vectorValue::get)
+            val values =
+                Array(timestamps.size) {
+                    when (val timestamp = timestamps[it]) {
+                        // Start (zero) and end (durationMillis) may not have been declared in
+                        // keyframes
+                        0 -> {
+                            if (!keyframes.contains(timestamp)) {
+                                FloatArray(dimensionCount, initialValue::get)
+                            } else {
+                                FloatArray(dimensionCount, keyframes[timestamp]!!.vectorValue::get)
+                            }
                         }
-                    }
-
-                    durationMillis -> {
-                        if (!keyframes.contains(timestamp)) {
-                            FloatArray(dimensionCount, targetValue::get)
-                        } else {
-                            FloatArray(dimensionCount, keyframes[timestamp]!!.vectorValue::get)
+                        durationMillis -> {
+                            if (!keyframes.contains(timestamp)) {
+                                FloatArray(dimensionCount, targetValue::get)
+                            } else {
+                                FloatArray(dimensionCount, keyframes[timestamp]!!.vectorValue::get)
+                            }
                         }
-                    }
 
-                    // All other values are guaranteed to exist
-                    else -> FloatArray(dimensionCount, keyframes[timestamp]!!.vectorValue::get)
+                        // All other values are guaranteed to exist
+                        else -> FloatArray(dimensionCount, keyframes[timestamp]!!.vectorValue::get)
+                    }
                 }
-            }
-            arcSpline = ArcSpline(
-                arcModes = modes,
-                timePoints = times,
-                y = values
-            )
+            arcSpline = ArcSpline(arcModes = modes, timePoints = times, y = values)
         }
     }
 
     /**
      * @Throws IllegalStateException When the initial or final value to animate within a keyframe is
-     * missing.
+     *   missing.
      */
     override fun getValueFromNanos(
         playTimeNanos: Long,
@@ -398,10 +386,7 @@
             // ArcSpline requires eased play time in seconds
             val easedTime = getEasedTime(clampedPlayTime)
 
-            arcSpline.getPos(
-                time = easedTime,
-                v = posArray
-            )
+            arcSpline.getPos(time = easedTime, v = posArray)
             for (i in posArray.indices) {
                 valueVector[i] = posArray[i]
             }
@@ -415,24 +400,28 @@
         val easedTime = getEasedTimeFromIndex(index, clampedPlayTime, true)
 
         val timestampStart = timestamps[index]
-        val startValue: V = if (keyframes.contains(timestampStart)) {
-            keyframes[timestampStart]!!.vectorValue
-        } else {
-            // Use initial value if it wasn't overwritten by the user
-            // This is always the correct fallback assuming timestamps and keyframes were populated
-            // as expected
-            initialValue
-        }
+        val startValue: V =
+            if (keyframes.contains(timestampStart)) {
+                keyframes[timestampStart]!!.vectorValue
+            } else {
+                // Use initial value if it wasn't overwritten by the user
+                // This is always the correct fallback assuming timestamps and keyframes were
+                // populated
+                // as expected
+                initialValue
+            }
 
         val timestampEnd = timestamps[index + 1]
-        val endValue = if (keyframes.contains(timestampEnd)) {
-            keyframes[timestampEnd]!!.vectorValue
-        } else {
-            // Use target value if it wasn't overwritten by the user
-            // This is always the correct fallback assuming timestamps and keyframes were populated
-            // as expected
-            targetValue
-        }
+        val endValue =
+            if (keyframes.contains(timestampEnd)) {
+                keyframes[timestampEnd]!!.vectorValue
+            } else {
+                // Use target value if it wasn't overwritten by the user
+                // This is always the correct fallback assuming timestamps and keyframes were
+                // populated
+                // as expected
+                targetValue
+            }
 
         for (i in 0 until valueVector.size) {
             valueVector[i] = lerp(startValue[i], endValue[i], easedTime)
@@ -457,10 +446,7 @@
         // ArcSpline is only initialized when necessary
         if (::arcSpline.isInitialized) {
             val easedTime = getEasedTime(clampedPlayTime.toInt())
-            arcSpline.getSlope(
-                time = easedTime,
-                v = slopeArray
-            )
+            arcSpline.getSlope(time = easedTime, v = slopeArray)
             for (i in slopeArray.indices) {
                 velocityVector[i] = slopeArray[i]
             }
@@ -468,18 +454,9 @@
         }
 
         // Velocity calculation when ArcSpline is not used
-        val startNum = getValueFromMillis(
-            clampedPlayTime - 1,
-            initialValue,
-            targetValue,
-            initialVelocity
-        )
-        val endNum = getValueFromMillis(
-            clampedPlayTime,
-            initialValue,
-            targetValue,
-            initialVelocity
-        )
+        val startNum =
+            getValueFromMillis(clampedPlayTime - 1, initialValue, targetValue, initialVelocity)
+        val endNum = getValueFromMillis(clampedPlayTime, initialValue, targetValue, initialVelocity)
         for (i in 0 until startNum.size) {
             velocityVector[i] = (startNum[i] - endNum[i]) * 1000f
         }
@@ -493,11 +470,7 @@
         return getEasedTimeFromIndex(index, timeMillis, false)
     }
 
-    private fun getEasedTimeFromIndex(
-        index: Int,
-        timeMillis: Int,
-        asFraction: Boolean
-    ): Float {
+    private fun getEasedTimeFromIndex(index: Int, timeMillis: Int, asFraction: Boolean): Float {
         if (index >= timestamps.lastIndex) {
             // Return the same value. This may only happen at the end of the animation.
             return timeMillis.toFloat() / SecondsToMillis
@@ -544,7 +517,6 @@
  * @see ArcAbove
  * @see ArcBelow
  * @see ArcLinear
- *
  * @see ArcAnimationSpec
  */
 @ExperimentalAnimationSpecApi
@@ -577,11 +549,10 @@
  * [VectorizedSnapSpec] immediately snaps the animating value to the end value.
  *
  * @param delayMillis the amount of time (in milliseconds) that the animation should wait before it
- *              starts. Defaults to 0.
+ *   starts. Defaults to 0.
  */
-class VectorizedSnapSpec<V : AnimationVector>(
-    override val delayMillis: Int = 0
-) : VectorizedDurationBasedAnimationSpec<V> {
+class VectorizedSnapSpec<V : AnimationVector>(override val delayMillis: Int = 0) :
+    VectorizedDurationBasedAnimationSpec<V> {
 
     override fun getValueFromNanos(
         playTimeNanos: Long,
@@ -612,16 +583,16 @@
 private const val InfiniteIterations: Int = Int.MAX_VALUE
 
 /**
- * This animation takes another [VectorizedDurationBasedAnimationSpec] and plays it
- * __infinite__ times.
+ * This animation takes another [VectorizedDurationBasedAnimationSpec] and plays it __infinite__
+ * times.
  *
- * initialStartOffset can be used to either delay the start of the animation or to fast forward
- * the animation to a given play time. This start offset will **not** be repeated, whereas the delay
- * in the [animation] (if any) will be repeated. By default, the amount of offset is 0.
+ * initialStartOffset can be used to either delay the start of the animation or to fast forward the
+ * animation to a given play time. This start offset will **not** be repeated, whereas the delay in
+ * the [animation] (if any) will be repeated. By default, the amount of offset is 0.
  *
  * @param animation the [VectorizedAnimationSpec] describing each repetition iteration.
  * @param repeatMode whether animation should repeat by starting from the beginning (i.e.
- *                  [RepeatMode.Restart]) or from the end (i.e. [RepeatMode.Reverse])
+ *   [RepeatMode.Restart]) or from the end (i.e. [RepeatMode.Reverse])
  * @param initialStartOffset offsets the start of the animation
  */
 class VectorizedInfiniteRepeatableSpec<V : AnimationVector>(
@@ -631,19 +602,19 @@
 ) : VectorizedAnimationSpec<V> {
     @Deprecated(
         level = DeprecationLevel.HIDDEN,
-        message = "This method has been deprecated in favor of the constructor that" +
-            " accepts start offset."
+        message =
+            "This method has been deprecated in favor of the constructor that" +
+                " accepts start offset."
     )
     constructor(
         animation: VectorizedDurationBasedAnimationSpec<V>,
         repeatMode: RepeatMode = RepeatMode.Restart
     ) : this(animation, repeatMode, StartOffset(0))
 
-    override val isInfinite: Boolean get() = true
+    override val isInfinite: Boolean
+        get() = true
 
-    /**
-     * Single iteration duration
-     */
+    /** Single iteration duration */
     internal val durationNanos: Long =
         (animation.delayMillis + animation.durationMillis) * MillisToNanos
 
@@ -668,18 +639,19 @@
         start: V,
         startVelocity: V,
         end: V
-    ): V = if (playTimeNanos + initialOffsetNanos > durationNanos) {
-        // Start velocity of the 2nd and subsequent iteration will be the velocity at the end
-        // of the first iteration, instead of the initial velocity.
-        animation.getVelocityFromNanos(
-            playTimeNanos = durationNanos - initialOffsetNanos,
-            initialValue = start,
-            targetValue = end,
-            initialVelocity = startVelocity
-        )
-    } else {
-        startVelocity
-    }
+    ): V =
+        if (playTimeNanos + initialOffsetNanos > durationNanos) {
+            // Start velocity of the 2nd and subsequent iteration will be the velocity at the end
+            // of the first iteration, instead of the initial velocity.
+            animation.getVelocityFromNanos(
+                playTimeNanos = durationNanos - initialOffsetNanos,
+                initialValue = start,
+                targetValue = end,
+                initialVelocity = startVelocity
+            )
+        } else {
+            startVelocity
+        }
 
     override fun getValueFromNanos(
         playTimeNanos: Long,
@@ -715,23 +687,22 @@
 }
 
 /**
- * This animation takes another [VectorizedDurationBasedAnimationSpec] and plays it
- * [iterations] times. For infinitely repeating animation spec, [VectorizedInfiniteRepeatableSpec]
- * is recommended.
+ * This animation takes another [VectorizedDurationBasedAnimationSpec] and plays it [iterations]
+ * times. For infinitely repeating animation spec, [VectorizedInfiniteRepeatableSpec] is
+ * recommended.
  *
  * __Note__: When repeating in the [RepeatMode.Reverse] mode, it's highly recommended to have an
  * __odd__ number of iterations. Otherwise, the animation may jump to the end value when it finishes
  * the last iteration.
  *
- * initialStartOffset can be used to either delay the start of the animation or to fast forward
- * the animation to a given play time. This start offset will **not** be repeated, whereas the delay
- * in the [animation] (if any) will be repeated. By default, the amount of offset is 0.
- *
+ * initialStartOffset can be used to either delay the start of the animation or to fast forward the
+ * animation to a given play time. This start offset will **not** be repeated, whereas the delay in
+ * the [animation] (if any) will be repeated. By default, the amount of offset is 0.
  *
  * @param iterations the count of iterations. Should be at least 1.
  * @param animation the [VectorizedAnimationSpec] describing each repetition iteration.
  * @param repeatMode whether animation should repeat by starting from the beginning (i.e.
- *                  [RepeatMode.Restart]) or from the end (i.e. [RepeatMode.Reverse])
+ *   [RepeatMode.Restart]) or from the end (i.e. [RepeatMode.Reverse])
  * @param initialStartOffset offsets the start of the animation
  */
 class VectorizedRepeatableSpec<V : AnimationVector>(
@@ -742,8 +713,9 @@
 ) : VectorizedFiniteAnimationSpec<V> {
     @Deprecated(
         level = DeprecationLevel.HIDDEN,
-        message = "This method has been deprecated in favor of the constructor that accepts" +
-            " start offset."
+        message =
+            "This method has been deprecated in favor of the constructor that accepts" +
+                " start offset."
     )
     constructor(
         iterations: Int,
@@ -783,12 +755,12 @@
         start: V,
         startVelocity: V,
         end: V
-    ): V = if (playTimeNanos + initialOffsetNanos > durationNanos) {
-        // Start velocity of the 2nd and subsequent iteration will be the velocity at the end
-        // of the first iteration, instead of the initial velocity.
-        getVelocityFromNanos(durationNanos - initialOffsetNanos, start, startVelocity, end)
-    } else
-        startVelocity
+    ): V =
+        if (playTimeNanos + initialOffsetNanos > durationNanos) {
+            // Start velocity of the 2nd and subsequent iteration will be the velocity at the end
+            // of the first iteration, instead of the initial velocity.
+            getVelocityFromNanos(durationNanos - initialOffsetNanos, start, startVelocity, end)
+        } else startVelocity
 
     override fun getValueFromNanos(
         playTimeNanos: Long,
@@ -824,18 +796,13 @@
     }
 }
 
-/**
- * Physics class contains a number of recommended configurations for physics animations.
- */
+/** Physics class contains a number of recommended configurations for physics animations. */
 object Spring {
-    /**
-     * Stiffness constant for extremely stiff spring
-     */
+    /** Stiffness constant for extremely stiff spring */
     const val StiffnessHigh = 10_000f
 
     /**
-     * Stiffness constant for medium stiff spring. This is the default stiffness for spring
-     * force.
+     * Stiffness constant for medium stiff spring. This is the default stiffness for spring force.
      */
     const val StiffnessMedium = 1500f
 
@@ -845,51 +812,43 @@
      */
     const val StiffnessMediumLow = 400f
 
-    /**
-     * Stiffness constant for a spring with low stiffness.
-     */
+    /** Stiffness constant for a spring with low stiffness. */
     const val StiffnessLow = 200f
 
-    /**
-     * Stiffness constant for a spring with very low stiffness.
-     */
+    /** Stiffness constant for a spring with very low stiffness. */
     const val StiffnessVeryLow = 50f
 
     /**
-     * Damping ratio for a very bouncy spring. Note for under-damped springs
-     * (i.e. damping ratio < 1), the lower the damping ratio, the more bouncy the spring.
+     * Damping ratio for a very bouncy spring. Note for under-damped springs (i.e. damping ratio <
+     * 1), the lower the damping ratio, the more bouncy the spring.
      */
     const val DampingRatioHighBouncy = 0.2f
 
     /**
-     * Damping ratio for a medium bouncy spring. This is also the default damping ratio for
-     * spring force. Note for under-damped springs (i.e. damping ratio < 1), the lower the
-     * damping ratio, the more bouncy the spring.
+     * Damping ratio for a medium bouncy spring. This is also the default damping ratio for spring
+     * force. Note for under-damped springs (i.e. damping ratio < 1), the lower the damping ratio,
+     * the more bouncy the spring.
      */
     const val DampingRatioMediumBouncy = 0.5f
 
     /**
-     * Damping ratio for a spring with low bounciness. Note for under-damped springs
-     * (i.e. damping ratio < 1), the lower the damping ratio, the higher the bounciness.
+     * Damping ratio for a spring with low bounciness. Note for under-damped springs (i.e. damping
+     * ratio < 1), the lower the damping ratio, the higher the bounciness.
      */
     const val DampingRatioLowBouncy = 0.75f
 
     /**
-     * Damping ratio for a spring with no bounciness. This damping ratio will create a
-     * critically damped spring that returns to equilibrium within the shortest amount of time
-     * without oscillating.
+     * Damping ratio for a spring with no bounciness. This damping ratio will create a critically
+     * damped spring that returns to equilibrium within the shortest amount of time without
+     * oscillating.
      */
     const val DampingRatioNoBouncy = 1f
 
-    /**
-     * Default cutoff for rounding off physics based animations
-     */
+    /** Default cutoff for rounding off physics based animations */
     const val DefaultDisplacementThreshold = 0.01f
 }
 
-/**
- * Internal data structure for storing different FloatAnimations for different dimensions.
- */
+/** Internal data structure for storing different FloatAnimations for different dimensions. */
 internal interface Animations {
     operator fun get(index: Int): FloatAnimationSpec
 }
@@ -897,18 +856,15 @@
 /**
  * [VectorizedSpringSpec] uses spring animations to animate (each dimension of) [AnimationVector]s.
  */
-class VectorizedSpringSpec<V : AnimationVector> private constructor(
-    val dampingRatio: Float,
-    val stiffness: Float,
-    anims: Animations
-) : VectorizedFiniteAnimationSpec<V> by VectorizedFloatAnimationSpec<V>(anims) {
+class VectorizedSpringSpec<V : AnimationVector>
+private constructor(val dampingRatio: Float, val stiffness: Float, anims: Animations) :
+    VectorizedFiniteAnimationSpec<V> by VectorizedFloatAnimationSpec<V>(anims) {
 
     /**
      * Creates a [VectorizedSpringSpec] that uses the same spring constants (i.e. [dampingRatio] and
      * [stiffness] on all dimensions. The optional [visibilityThreshold] defines when the animation
      * should be considered to be visually close enough to target to stop. By default,
-     * [Spring.DefaultDisplacementThreshold] is used on all dimensions of the
-     * [AnimationVector].
+     * [Spring.DefaultDisplacementThreshold] is used on all dimensions of the [AnimationVector].
      *
      * @param dampingRatio damping ratio of the spring. [Spring.DampingRatioNoBouncy] by default.
      * @param stiffness stiffness of the spring. [Spring.StiffnessMedium] by default.
@@ -919,7 +875,8 @@
         stiffness: Float = Spring.StiffnessMedium,
         visibilityThreshold: V? = null
     ) : this(
-        dampingRatio, stiffness,
+        dampingRatio,
+        stiffness,
         createSpringAnimations(visibilityThreshold, dampingRatio, stiffness)
     )
 }
@@ -931,15 +888,17 @@
 ): Animations {
     if (visibilityThreshold != null) {
         return object : Animations {
-            private val anims = (0 until visibilityThreshold.size).map { index ->
-                FloatSpringSpec(dampingRatio, stiffness, visibilityThreshold[index])
-            }
+            private val anims =
+                (0 until visibilityThreshold.size).map { index ->
+                    FloatSpringSpec(dampingRatio, stiffness, visibilityThreshold[index])
+                }
 
             override fun get(index: Int): FloatSpringSpec = anims[index]
         }
     } else {
         return object : Animations {
             private val anim = FloatSpringSpec(dampingRatio, stiffness)
+
             override fun get(index: Int): FloatSpringSpec = anim
         }
     }
@@ -950,9 +909,9 @@
  * value, in the given [durationMillis] using the given [easing] curve.
  *
  * @param durationMillis duration of the [VectorizedTweenSpec] animation. Defaults to
- *                       [DefaultDurationMillis].
- * @param delayMillis the amount of time the animation should wait before it starts running,
- *                    0 by default.
+ *   [DefaultDurationMillis].
+ * @param delayMillis the amount of time the animation should wait before it starts running, 0 by
+ *   default.
  * @param easing the easing curve used by the animation. [FastOutSlowInEasing] by default.
  */
 // TODO: Support different tween on different dimens
@@ -962,9 +921,8 @@
     val easing: Easing = FastOutSlowInEasing
 ) : VectorizedDurationBasedAnimationSpec<V> {
 
-    private val anim = VectorizedFloatAnimationSpec<V>(
-        FloatTweenSpec(durationMillis, delayMillis, easing)
-    )
+    private val anim =
+        VectorizedFloatAnimationSpec<V>(FloatTweenSpec(durationMillis, delayMillis, easing))
 
     override fun getValueFromNanos(
         playTimeNanos: Long,
@@ -990,9 +948,8 @@
  * into a multi-dimensional [VectorizedFloatAnimationSpec], by using the same [FloatAnimationSpec]
  * on each dimension of the [AnimationVector] that is being animated.
  */
-class VectorizedFloatAnimationSpec<V : AnimationVector> internal constructor(
-    private val anims: Animations
-) : VectorizedFiniteAnimationSpec<V> {
+class VectorizedFloatAnimationSpec<V : AnimationVector>
+internal constructor(private val anims: Animations) : VectorizedFiniteAnimationSpec<V> {
     private lateinit var valueVector: V
     private lateinit var velocityVector: V
     private lateinit var endVelocityVector: V
@@ -1003,11 +960,15 @@
      *
      * @param anim the animation spec for animating each dimension of the [AnimationVector]
      */
-    constructor(anim: FloatAnimationSpec) : this(object : Animations {
-        override fun get(index: Int): FloatAnimationSpec {
-            return anim
+    constructor(
+        anim: FloatAnimationSpec
+    ) : this(
+        object : Animations {
+            override fun get(index: Int): FloatAnimationSpec {
+                return anim
+            }
         }
-    })
+    )
 
     override fun getValueFromNanos(
         playTimeNanos: Long,
@@ -1019,12 +980,13 @@
             valueVector = initialValue.newInstance()
         }
         for (i in 0 until valueVector.size) {
-            valueVector[i] = anims[i].getValueFromNanos(
-                playTimeNanos,
-                initialValue[i],
-                targetValue[i],
-                initialVelocity[i]
-            )
+            valueVector[i] =
+                anims[i].getValueFromNanos(
+                    playTimeNanos,
+                    initialValue[i],
+                    targetValue[i],
+                    initialVelocity[i]
+                )
         }
         return valueVector
     }
@@ -1065,10 +1027,15 @@
     override fun getDurationNanos(initialValue: V, targetValue: V, initialVelocity: V): Long {
         var maxDuration = 0L
         (0 until initialValue.size).forEach {
-            maxDuration = maxOf(
-                maxDuration,
-                anims[it].getDurationNanos(initialValue[it], targetValue[it], initialVelocity[it])
-            )
+            maxDuration =
+                maxOf(
+                    maxDuration,
+                    anims[it].getDurationNanos(
+                        initialValue[it],
+                        targetValue[it],
+                        initialVelocity[it]
+                    )
+                )
         }
         return maxDuration
     }
diff --git a/compose/animation/animation-core/src/commonMain/kotlin/androidx/compose/animation/core/VectorizedDecayAnimationSpec.kt b/compose/animation/animation-core/src/commonMain/kotlin/androidx/compose/animation/core/VectorizedDecayAnimationSpec.kt
index e893ad2..1fab462 100644
--- a/compose/animation/animation-core/src/commonMain/kotlin/androidx/compose/animation/core/VectorizedDecayAnimationSpec.kt
+++ b/compose/animation/animation-core/src/commonMain/kotlin/androidx/compose/animation/core/VectorizedDecayAnimationSpec.kt
@@ -17,21 +17,20 @@
 package androidx.compose.animation.core
 
 /**
- * [VectorizedDecayAnimationSpec]s are stateless vector based decay animation specifications.
- * They do not assume any starting/ending conditions. Nor do they manage a lifecycle. All it stores
- * is the configuration that is particular to the type of the decay animation: friction multiplier
- * for [exponentialDecay]. Its stateless nature allows the same [VectorizedDecayAnimationSpec] to
- * be reused by a few different running animations with different starting and ending values.
+ * [VectorizedDecayAnimationSpec]s are stateless vector based decay animation specifications. They
+ * do not assume any starting/ending conditions. Nor do they manage a lifecycle. All it stores is
+ * the configuration that is particular to the type of the decay animation: friction multiplier for
+ * [exponentialDecay]. Its stateless nature allows the same [VectorizedDecayAnimationSpec] to be
+ * reused by a few different running animations with different starting and ending values.
  *
  * Since [VectorizedDecayAnimationSpec]s are stateless, it requires starting value/velocity and
  * ending value to be passed in, along with playtime, to calculate the value or velocity at that
  * time. Play time here is the progress of the animation in terms of milliseconds, where 0 means the
- * start of the animation and [getDurationNanos] returns the play time for the end of the
- * animation.
+ * start of the animation and [getDurationNanos] returns the play time for the end of the animation.
  *
- * __Note__: For use cases where the starting values/velocity and ending values aren't expected
- * to change, it is recommended to use [DecayAnimation] that caches these static values and hence
- * does not require them to be supplied in the value/velocity calculation.
+ * __Note__: For use cases where the starting values/velocity and ending values aren't expected to
+ * change, it is recommended to use [DecayAnimation] that caches these static values and hence does
+ * not require them to be supplied in the value/velocity calculation.
  *
  * @see DecayAnimation
  */
@@ -49,11 +48,7 @@
      * @param initialValue The initialValue value of the animation
      * @param initialVelocity The initialValue velocity of the animation
      */
-    fun getValueFromNanos(
-        playTimeNanos: Long,
-        initialValue: V,
-        initialVelocity: V
-    ): V
+    fun getValueFromNanos(playTimeNanos: Long, initialValue: V, initialVelocity: V): V
 
     /**
      * Returns the duration of the decay animation, in nanoseconds.
@@ -61,11 +56,7 @@
      * @param initialValue initialValue value of the animation
      * @param initialVelocity initialValue velocity of the animation
      */
-    @Suppress("MethodNameUnits")
-    fun getDurationNanos(
-        initialValue: V,
-        initialVelocity: V
-    ): Long
+    @Suppress("MethodNameUnits") fun getDurationNanos(initialValue: V, initialVelocity: V): Long
 
     /**
      * Returns the velocity of the animation at the given time.
@@ -74,11 +65,7 @@
      * @param initialValue The initialValue value of the animation
      * @param initialVelocity The initialValue velocity of the animation
      */
-    fun getVelocityFromNanos(
-        playTimeNanos: Long,
-        initialValue: V,
-        initialVelocity: V
-    ): V
+    fun getVelocityFromNanos(playTimeNanos: Long, initialValue: V, initialVelocity: V): V
 
     /**
      * Returns the target value of the animation based on the initial condition of the animation (
@@ -87,8 +74,5 @@
      * @param initialValue The initial value of the animation
      * @param initialVelocity The initial velocity of the animation
      */
-    fun getTargetValue(
-        initialValue: V,
-        initialVelocity: V
-    ): V
+    fun getTargetValue(initialValue: V, initialVelocity: V): V
 }
diff --git a/compose/animation/animation-core/src/commonMain/kotlin/androidx/compose/animation/core/VectorizedMonoSplineKeyframesSpec.kt b/compose/animation/animation-core/src/commonMain/kotlin/androidx/compose/animation/core/VectorizedMonoSplineKeyframesSpec.kt
index 2673945..89d9ab6 100644
--- a/compose/animation/animation-core/src/commonMain/kotlin/androidx/compose/animation/core/VectorizedMonoSplineKeyframesSpec.kt
+++ b/compose/animation/animation-core/src/commonMain/kotlin/androidx/compose/animation/core/VectorizedMonoSplineKeyframesSpec.kt
@@ -19,9 +19,7 @@
 import androidx.collection.IntList
 import androidx.collection.IntObjectMap
 
-/**
- * Implementation of [VectorizedMonoSplineKeyframesSpec] using [MonoSpline].
- */
+/** Implementation of [VectorizedMonoSplineKeyframesSpec] using [MonoSpline]. */
 @ExperimentalAnimationSpecApi
 internal class VectorizedMonoSplineKeyframesSpec<V : AnimationVector>(
     private val timestamps: IntList,
@@ -50,14 +48,14 @@
             valueVector = initialValue.newInstance()
             velocityVector = initialVelocity.newInstance()
 
-            times = FloatArray(timestamps.size) {
-                timestamps[it].toFloat() / SecondsToMillis
-            }
+            times = FloatArray(timestamps.size) { timestamps[it].toFloat() / SecondsToMillis }
         }
 
         // Need to re-initialize based on initial/target values
-        if (!::monoSpline.isInitialized ||
-            lastInitialValue != initialValue || lastTargetValue != targetValue
+        if (
+            !::monoSpline.isInitialized ||
+                lastInitialValue != initialValue ||
+                lastTargetValue != targetValue
         ) {
             val initialChanged = lastInitialValue != initialValue
             val targetChanged = lastTargetValue != targetValue
@@ -67,29 +65,30 @@
             val dimension = initialValue.size
 
             if (!::values.isInitialized) {
-                values = Array(timestamps.size) {
-                    when (val timestamp = timestamps[it]) {
-                        // Start (zero) and end (durationMillis) may not have been declared in keyframes
-                        0 -> {
-                            if (!keyframes.contains(timestamp)) {
-                                FloatArray(dimension, initialValue::get)
-                            } else {
-                                FloatArray(dimension, keyframes[timestamp]!!.first::get)
+                values =
+                    Array(timestamps.size) {
+                        when (val timestamp = timestamps[it]) {
+                            // Start (zero) and end (durationMillis) may not have been declared in
+                            // keyframes
+                            0 -> {
+                                if (!keyframes.contains(timestamp)) {
+                                    FloatArray(dimension, initialValue::get)
+                                } else {
+                                    FloatArray(dimension, keyframes[timestamp]!!.first::get)
+                                }
                             }
-                        }
-
-                        durationMillis -> {
-                            if (!keyframes.contains(timestamp)) {
-                                FloatArray(dimension, targetValue::get)
-                            } else {
-                                FloatArray(dimension, keyframes[timestamp]!!.first::get)
+                            durationMillis -> {
+                                if (!keyframes.contains(timestamp)) {
+                                    FloatArray(dimension, targetValue::get)
+                                } else {
+                                    FloatArray(dimension, keyframes[timestamp]!!.first::get)
+                                }
                             }
-                        }
 
-                        // All other values are guaranteed to exist
-                        else -> FloatArray(dimension, keyframes[timestamp]!!.first::get)
+                            // All other values are guaranteed to exist
+                            else -> FloatArray(dimension, keyframes[timestamp]!!.first::get)
+                        }
                     }
-                }
             } else {
                 // We can re-use most of the objects. Only the start and end may need to be replaced
                 if (initialChanged && !keyframes.contains(0)) {
@@ -167,10 +166,7 @@
         return keyframes[timestamp]?.second ?: LinearEasing
     }
 
-    private fun getEasedTimeFromIndex(
-        index: Int,
-        timeMillis: Int
-    ): Float {
+    private fun getEasedTimeFromIndex(index: Int, timeMillis: Int): Float {
         if (index >= timestamps.lastIndex) {
             // Return the same value. This may only happen at the end of the animation.
             return timeMillis.toFloat() / SecondsToMillis
diff --git a/compose/animation/animation-core/src/commonMain/kotlin/androidx/compose/animation/core/VisibilityThresholds.kt b/compose/animation/animation-core/src/commonMain/kotlin/androidx/compose/animation/core/VisibilityThresholds.kt
index 89aaa6e..c14d8be 100644
--- a/compose/animation/animation-core/src/commonMain/kotlin/androidx/compose/animation/core/VisibilityThresholds.kt
+++ b/compose/animation/animation-core/src/commonMain/kotlin/androidx/compose/animation/core/VisibilityThresholds.kt
@@ -28,87 +28,84 @@
 private const val DpVisibilityThreshold = 0.1f
 private const val PxVisibilityThreshold = 0.5f
 
-private val rectVisibilityThreshold = Rect(
-    PxVisibilityThreshold,
-    PxVisibilityThreshold,
-    PxVisibilityThreshold,
-    PxVisibilityThreshold
-)
+private val rectVisibilityThreshold =
+    Rect(PxVisibilityThreshold, PxVisibilityThreshold, PxVisibilityThreshold, PxVisibilityThreshold)
 
 /**
- * Visibility threshold for [IntOffset]. This defines the amount of value change that is
- * considered to be no longer visible. The animation system uses this to signal to some default
- * [spring] animations to stop when the value is close enough to the target.
+ * Visibility threshold for [IntOffset]. This defines the amount of value change that is considered
+ * to be no longer visible. The animation system uses this to signal to some default [spring]
+ * animations to stop when the value is close enough to the target.
  */
 val IntOffset.Companion.VisibilityThreshold: IntOffset
     get() = IntOffset(1, 1)
 
 /**
- * Visibility threshold for [Offset]. This defines the amount of value change that is
- * considered to be no longer visible. The animation system uses this to signal to some default
- * [spring] animations to stop when the value is close enough to the target.
+ * Visibility threshold for [Offset]. This defines the amount of value change that is considered to
+ * be no longer visible. The animation system uses this to signal to some default [spring]
+ * animations to stop when the value is close enough to the target.
  */
 val Offset.Companion.VisibilityThreshold: Offset
     get() = Offset(PxVisibilityThreshold, PxVisibilityThreshold)
 
 /**
- * Visibility threshold for [Int]. This defines the amount of value change that is
- * considered to be no longer visible. The animation system uses this to signal to some default
- * [spring] animations to stop when the value is close enough to the target.
+ * Visibility threshold for [Int]. This defines the amount of value change that is considered to be
+ * no longer visible. The animation system uses this to signal to some default [spring] animations
+ * to stop when the value is close enough to the target.
  */
 val Int.Companion.VisibilityThreshold: Int
     get() = 1
 
 /**
- * Visibility threshold for [Dp]. This defines the amount of value change that is
- * considered to be no longer visible. The animation system uses this to signal to some default
- * [spring] animations to stop when the value is close enough to the target.
+ * Visibility threshold for [Dp]. This defines the amount of value change that is considered to be
+ * no longer visible. The animation system uses this to signal to some default [spring] animations
+ * to stop when the value is close enough to the target.
  */
 val Dp.Companion.VisibilityThreshold: Dp
     get() = DpVisibilityThreshold.dp
 
 /**
- * Visibility threshold for [DpOffset]. This defines the amount of value change that is
- * considered to be no longer visible. The animation system uses this to signal to some default
- * [spring] animations to stop when the value is close enough to the target.
+ * Visibility threshold for [DpOffset]. This defines the amount of value change that is considered
+ * to be no longer visible. The animation system uses this to signal to some default [spring]
+ * animations to stop when the value is close enough to the target.
  */
 val DpOffset.Companion.VisibilityThreshold: DpOffset
     get() = DpOffset(Dp.VisibilityThreshold, Dp.VisibilityThreshold)
 
 /**
- * Visibility threshold for [Size]. This defines the amount of value change that is
- * considered to be no longer visible. The animation system uses this to signal to some default
- * [spring] animations to stop when the value is close enough to the target.
+ * Visibility threshold for [Size]. This defines the amount of value change that is considered to be
+ * no longer visible. The animation system uses this to signal to some default [spring] animations
+ * to stop when the value is close enough to the target.
  */
 val Size.Companion.VisibilityThreshold: Size
     get() = Size(PxVisibilityThreshold, PxVisibilityThreshold)
 
 /**
- * Visibility threshold for [IntSize]. This defines the amount of value change that is
- * considered to be no longer visible. The animation system uses this to signal to some default
- * [spring] animations to stop when the value is close enough to the target.
+ * Visibility threshold for [IntSize]. This defines the amount of value change that is considered to
+ * be no longer visible. The animation system uses this to signal to some default [spring]
+ * animations to stop when the value is close enough to the target.
  */
 val IntSize.Companion.VisibilityThreshold: IntSize
     get() = IntSize(1, 1)
 
 /**
- * Visibility threshold for [Rect]. This defines the amount of value change that is
- * considered to be no longer visible. The animation system uses this to signal to some default
- * [spring] animations to stop when the value is close enough to the target.
+ * Visibility threshold for [Rect]. This defines the amount of value change that is considered to be
+ * no longer visible. The animation system uses this to signal to some default [spring] animations
+ * to stop when the value is close enough to the target.
  */
 val Rect.Companion.VisibilityThreshold: Rect
     get() = rectVisibilityThreshold
 
 // TODO: Add Dp.DefaultAnimation = spring<Dp>(visibilityThreshold = Dp.VisibilityThreshold)
 
-internal val visibilityThresholdMap: Map<TwoWayConverter<*, *>, Float> = mapOf(
-    Int.VectorConverter to 1f,
-    IntSize.VectorConverter to 1f,
-    IntOffset.VectorConverter to 1f,
-    Float.VectorConverter to 0.01f,
-    Rect.VectorConverter to PxVisibilityThreshold,
-    Size.VectorConverter to PxVisibilityThreshold,
-    Offset.VectorConverter to PxVisibilityThreshold,
-    Dp.VectorConverter to DpVisibilityThreshold,
-    DpOffset.VectorConverter to DpVisibilityThreshold
-)
+internal val visibilityThresholdMap: Map<TwoWayConverter<*, *>, Float> =
+    mapOf(
+        Int.VectorConverter to 1f,
+        IntSize.VectorConverter to 1f,
+        IntOffset.VectorConverter to 1f,
+        Float.VectorConverter to 0.01f,
+        Rect.VectorConverter to PxVisibilityThreshold,
+        Size.VectorConverter to PxVisibilityThreshold,
+        Offset.VectorConverter to PxVisibilityThreshold,
+        Dp.VectorConverter to DpVisibilityThreshold,
+        DpOffset.VectorConverter to DpVisibilityThreshold
+    )
diff --git a/compose/animation/animation-graphics/samples/src/main/java/androidx/compose/animation/graphics/samples/AnimatedVectorSample.kt b/compose/animation/animation-graphics/samples/src/main/java/androidx/compose/animation/graphics/samples/AnimatedVectorSample.kt
index 722c4b2..a4c769e 100644
--- a/compose/animation/animation-graphics/samples/src/main/java/androidx/compose/animation/graphics/samples/AnimatedVectorSample.kt
+++ b/compose/animation/animation-graphics/samples/src/main/java/androidx/compose/animation/graphics/samples/AnimatedVectorSample.kt
@@ -45,9 +45,7 @@
         Image(
             painter = rememberAnimatedVectorPainter(image, atEnd),
             contentDescription = "Your content description",
-            modifier = Modifier.size(64.dp).clickable {
-                atEnd = !atEnd
-            }
+            modifier = Modifier.size(64.dp).clickable { atEnd = !atEnd }
         )
     }
 }
diff --git a/compose/animation/animation-graphics/src/androidInstrumentedTest/kotlin/androidx/compose/animation/graphics/res/AnimatedVectorPainterResourcesTest.kt b/compose/animation/animation-graphics/src/androidInstrumentedTest/kotlin/androidx/compose/animation/graphics/res/AnimatedVectorPainterResourcesTest.kt
index 2f4bbd2..d79ed7c 100644
--- a/compose/animation/animation-graphics/src/androidInstrumentedTest/kotlin/androidx/compose/animation/graphics/res/AnimatedVectorPainterResourcesTest.kt
+++ b/compose/animation/animation-graphics/src/androidInstrumentedTest/kotlin/androidx/compose/animation/graphics/res/AnimatedVectorPainterResourcesTest.kt
@@ -35,8 +35,7 @@
 @RunWith(AndroidJUnit4::class)
 class AnimatedVectorPainterResourcesTest {
 
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
     @Test
     fun vectorConfig() {
@@ -44,10 +43,8 @@
         var checked = false
         rule.setContent {
             val avd = AnimatedImageVector.animatedVectorResource(R.drawable.avd_complex)
-            rememberAnimatedVectorPainter(
-                animatedImageVector = avd,
-                atEnd = isAtEnd.value
-            ) { _, map ->
+            rememberAnimatedVectorPainter(animatedImageVector = avd, atEnd = isAtEnd.value) { _, map
+                ->
                 if (!checked) {
                     assertThat(map).containsKey("background")
                     val config = map["background"] as VectorConfig
@@ -70,10 +67,8 @@
         var checked = false
         rule.setContent {
             val avd = AnimatedImageVector.animatedVectorResource(R.drawable.target_duplicated)
-            rememberAnimatedVectorPainter(
-                animatedImageVector = avd,
-                atEnd = isAtEnd.value
-            ) { _, map ->
+            rememberAnimatedVectorPainter(animatedImageVector = avd, atEnd = isAtEnd.value) { _, map
+                ->
                 if (!checked) {
                     assertThat(map).containsKey("line_01")
                     val config = map["line_01"] as VectorConfig
diff --git a/compose/animation/animation-graphics/src/androidInstrumentedTest/kotlin/androidx/compose/animation/graphics/vector/AnimatorAnimationSpecsTest.kt b/compose/animation/animation-graphics/src/androidInstrumentedTest/kotlin/androidx/compose/animation/graphics/vector/AnimatorAnimationSpecsTest.kt
index f77439a..0c44e7a 100644
--- a/compose/animation/animation-graphics/src/androidInstrumentedTest/kotlin/androidx/compose/animation/graphics/vector/AnimatorAnimationSpecsTest.kt
+++ b/compose/animation/animation-graphics/src/androidInstrumentedTest/kotlin/androidx/compose/animation/graphics/vector/AnimatorAnimationSpecsTest.kt
@@ -35,8 +35,7 @@
 @RunWith(AndroidJUnit4::class)
 class AnimatorAnimationSpecsTest {
 
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
     private val tolerance = 0.01f
 
@@ -46,22 +45,26 @@
         val isAtEnd = mutableStateOf(false)
         rule.setContent {
             val transition = updateTransition(targetState = isAtEnd.value, label = "test")
-            val control = transition.animateFloat(
-                label = "control",
-                transitionSpec = { tween(durationMillis = 1000, easing = LinearEasing) }
-            ) {
-                if (it) 1000f else 0f
-            }
-            val reversed = transition.animateFloat(
-                label = "reversed",
-                transitionSpec = {
-                    tween<Float>(durationMillis = 1000, easing = LinearEasing).reversed(1000)
+            val control =
+                transition.animateFloat(
+                    label = "control",
+                    transitionSpec = { tween(durationMillis = 1000, easing = LinearEasing) }
+                ) {
+                    if (it) 1000f else 0f
                 }
-            ) {
-                if (it) 1000f else 0f
-            }
+            val reversed =
+                transition.animateFloat(
+                    label = "reversed",
+                    transitionSpec = {
+                        tween<Float>(durationMillis = 1000, easing = LinearEasing).reversed(1000)
+                    }
+                ) {
+                    if (it) 1000f else 0f
+                }
             assertWithMessage("at playTimeNanos: ${transition.playTimeNanos}")
-                .that(reversed.value).isWithin(tolerance).of(control.value)
+                .that(reversed.value)
+                .isWithin(tolerance)
+                .of(control.value)
         }
         rule.runOnIdle { isAtEnd.value = true }
         rule.waitForIdle()
@@ -73,34 +76,39 @@
         val isAtEnd = mutableStateOf(false)
         rule.setContent {
             val transition = updateTransition(targetState = isAtEnd.value, label = "test")
-            val control = transition.animateFloat(
-                label = "control",
-                transitionSpec = {
-                    keyframes {
-                        durationMillis = 1000
-                        0f at 0 using LinearEasing
-                        100f at 100 using LinearEasing
-                        1000f at 1000 using LinearEasing
+            val control =
+                transition.animateFloat(
+                    label = "control",
+                    transitionSpec = {
+                        keyframes {
+                            durationMillis = 1000
+                            0f at 0 using LinearEasing
+                            100f at 100 using LinearEasing
+                            1000f at 1000 using LinearEasing
+                        }
                     }
+                ) {
+                    if (it) 1000f else 0f
                 }
-            ) {
-                if (it) 1000f else 0f
-            }
-            val reversed = transition.animateFloat(
-                label = "reversed",
-                transitionSpec = {
-                    keyframes<Float> {
-                        durationMillis = 1000
-                        1000f at 0 using LinearEasing
-                        100f at 900 using LinearEasing
-                        0f at 1000 using LinearEasing
-                    }.reversed(1000)
+            val reversed =
+                transition.animateFloat(
+                    label = "reversed",
+                    transitionSpec = {
+                        keyframes<Float> {
+                                durationMillis = 1000
+                                1000f at 0 using LinearEasing
+                                100f at 900 using LinearEasing
+                                0f at 1000 using LinearEasing
+                            }
+                            .reversed(1000)
+                    }
+                ) {
+                    if (it) 1000f else 0f
                 }
-            ) {
-                if (it) 1000f else 0f
-            }
             assertWithMessage("at playTimeNanos: ${transition.playTimeNanos}")
-                .that(reversed.value).isWithin(tolerance).of(control.value)
+                .that(reversed.value)
+                .isWithin(tolerance)
+                .of(control.value)
         }
         rule.runOnIdle { isAtEnd.value = true }
         rule.waitForIdle()
@@ -112,33 +120,38 @@
         val isAtEnd = mutableStateOf(false)
         rule.setContent {
             val transition = updateTransition(targetState = isAtEnd.value, label = "test")
-            val control = transition.animateFloat(
-                label = "control",
-                transitionSpec = {
-                    keyframes {
-                        durationMillis = 1000
-                        0f at 0 using LinearEasing
-                        1000f at 500 using LinearEasing
+            val control =
+                transition.animateFloat(
+                    label = "control",
+                    transitionSpec = {
+                        keyframes {
+                            durationMillis = 1000
+                            0f at 0 using LinearEasing
+                            1000f at 500 using LinearEasing
+                        }
                     }
+                ) {
+                    if (it) 1000f else 0f
                 }
-            ) {
-                if (it) 1000f else 0f
-            }
-            val reversed = transition.animateFloat(
-                label = "reversed",
-                transitionSpec = {
-                    keyframes<Float> {
-                        durationMillis = 1000
-                        1000f at 0 using LinearEasing
-                        1000f at 500 using LinearEasing
-                        0f at 1000 using LinearEasing
-                    }.reversed(1000)
+            val reversed =
+                transition.animateFloat(
+                    label = "reversed",
+                    transitionSpec = {
+                        keyframes<Float> {
+                                durationMillis = 1000
+                                1000f at 0 using LinearEasing
+                                1000f at 500 using LinearEasing
+                                0f at 1000 using LinearEasing
+                            }
+                            .reversed(1000)
+                    }
+                ) {
+                    if (it) 1000f else 0f
                 }
-            ) {
-                if (it) 1000f else 0f
-            }
             assertWithMessage("at playTimeNanos: ${transition.playTimeNanos}")
-                .that(reversed.value).isWithin(tolerance).of(control.value)
+                .that(reversed.value)
+                .isWithin(tolerance)
+                .of(control.value)
         }
         rule.runOnIdle { isAtEnd.value = true }
         rule.waitForIdle()
@@ -150,26 +163,26 @@
         val isAtEnd = mutableStateOf(false)
         rule.setContent {
             val transition = updateTransition(targetState = isAtEnd.value, label = "test")
-            val control = transition.animateFloat(
-                label = "control",
-                transitionSpec = { tween(durationMillis = 1000, easing = LinearEasing) }
-            ) {
-                if (it) 1000f else 0f
-            }
-            val combined = transition.animateFloat(
-                label = "combined",
-                transitionSpec = {
-                    combined(
-                        listOf(
-                            0 to tween(durationMillis = 1000, easing = LinearEasing)
-                        )
-                    )
+            val control =
+                transition.animateFloat(
+                    label = "control",
+                    transitionSpec = { tween(durationMillis = 1000, easing = LinearEasing) }
+                ) {
+                    if (it) 1000f else 0f
                 }
-            ) {
-                if (it) 1000f else 0f
-            }
+            val combined =
+                transition.animateFloat(
+                    label = "combined",
+                    transitionSpec = {
+                        combined(listOf(0 to tween(durationMillis = 1000, easing = LinearEasing)))
+                    }
+                ) {
+                    if (it) 1000f else 0f
+                }
             assertWithMessage("at playTimeNanos: ${transition.playTimeNanos}")
-                .that(combined.value).isWithin(tolerance).of(control.value)
+                .that(combined.value)
+                .isWithin(tolerance)
+                .of(control.value)
         }
         rule.runOnIdle { isAtEnd.value = true }
         rule.waitForIdle()
@@ -181,41 +194,47 @@
         val isAtEnd = mutableStateOf(false)
         rule.setContent {
             val transition = updateTransition(targetState = isAtEnd.value, label = "test")
-            val control = transition.animateFloat(
-                label = "control",
-                transitionSpec = {
-                    keyframes {
-                        durationMillis = 1000
-                        0f at 0 using LinearEasing
-                        1000f at 1000 using LinearEasing
+            val control =
+                transition.animateFloat(
+                    label = "control",
+                    transitionSpec = {
+                        keyframes {
+                            durationMillis = 1000
+                            0f at 0 using LinearEasing
+                            1000f at 1000 using LinearEasing
+                        }
                     }
+                ) {
+                    if (it) 1000f else 0f
                 }
-            ) {
-                if (it) 1000f else 0f
-            }
-            val combined = transition.animateFloat(
-                label = "combined",
-                transitionSpec = {
-                    combined(
-                        listOf(
-                            0 to keyframes {
-                                durationMillis = 300
-                                0f at 0 using LinearEasing
-                                300f at 300 using LinearEasing
-                            },
-                            300 to keyframes {
-                                durationMillis = 700
-                                300f at 0 using LinearEasing
-                                1000f at 700 using LinearEasing
-                            }
+            val combined =
+                transition.animateFloat(
+                    label = "combined",
+                    transitionSpec = {
+                        combined(
+                            listOf(
+                                0 to
+                                    keyframes {
+                                        durationMillis = 300
+                                        0f at 0 using LinearEasing
+                                        300f at 300 using LinearEasing
+                                    },
+                                300 to
+                                    keyframes {
+                                        durationMillis = 700
+                                        300f at 0 using LinearEasing
+                                        1000f at 700 using LinearEasing
+                                    }
+                            )
                         )
-                    )
+                    }
+                ) {
+                    if (it) 1000f else 0f
                 }
-            ) {
-                if (it) 1000f else 0f
-            }
             assertWithMessage("at playTimeNanos: ${transition.playTimeNanos}")
-                .that(combined.value).isWithin(tolerance).of(control.value)
+                .that(combined.value)
+                .isWithin(tolerance)
+                .of(control.value)
         }
         rule.runOnIdle { isAtEnd.value = true }
         rule.waitForIdle()
diff --git a/compose/animation/animation-graphics/src/androidInstrumentedTest/kotlin/androidx/compose/animation/graphics/vector/AnimatorTest.kt b/compose/animation/animation-graphics/src/androidInstrumentedTest/kotlin/androidx/compose/animation/graphics/vector/AnimatorTest.kt
index 0ee480d..120db61 100644
--- a/compose/animation/animation-graphics/src/androidInstrumentedTest/kotlin/androidx/compose/animation/graphics/vector/AnimatorTest.kt
+++ b/compose/animation/animation-graphics/src/androidInstrumentedTest/kotlin/androidx/compose/animation/graphics/vector/AnimatorTest.kt
@@ -39,8 +39,7 @@
 @RunWith(AndroidJUnit4::class)
 class AnimatorTest {
 
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
     private val tolerance = 0.01f
 
@@ -98,10 +97,7 @@
             objectAnimator(
                 "translateX",
                 1000,
-                listOf(
-                    Keyframe(0f, 0f, LinearEasing),
-                    Keyframe(1f, 1000f, LinearEasing)
-                )
+                listOf(Keyframe(0f, 0f, LinearEasing), Keyframe(1f, 1000f, LinearEasing))
             )
         )
     }
@@ -139,25 +135,28 @@
     fun offsetAnimators() {
         verifyAnimatorIsLinear(
             AnimatorSet(
-                animators = listOf(
-                    objectAnimator(
-                        propertyName = "translateX",
-                        duration = 500,
-                        keyframes = listOf(
-                            Keyframe(0f, 0f, LinearEasing),
-                            Keyframe(1f, 500f, LinearEasing),
+                animators =
+                    listOf(
+                        objectAnimator(
+                            propertyName = "translateX",
+                            duration = 500,
+                            keyframes =
+                                listOf(
+                                    Keyframe(0f, 0f, LinearEasing),
+                                    Keyframe(1f, 500f, LinearEasing),
+                                )
+                        ),
+                        objectAnimator(
+                            propertyName = "translateX",
+                            duration = 500,
+                            startDelay = 500,
+                            keyframes =
+                                listOf(
+                                    Keyframe(0f, 500f, LinearEasing),
+                                    Keyframe(1f, 1000f, LinearEasing),
+                                )
                         )
                     ),
-                    objectAnimator(
-                        propertyName = "translateX",
-                        duration = 500,
-                        startDelay = 500,
-                        keyframes = listOf(
-                            Keyframe(0f, 500f, LinearEasing),
-                            Keyframe(1f, 1000f, LinearEasing),
-                        )
-                    )
-                ),
                 ordering = Ordering.Together
             )
         )
@@ -182,9 +181,7 @@
                     )
             }
         }
-        assertThat(config.getOrDefault(VectorProperty.TranslateX, -1f))
-            .isWithin(tolerance)
-            .of(0f)
+        assertThat(config.getOrDefault(VectorProperty.TranslateX, -1f)).isWithin(tolerance).of(0f)
         // Start to end
         rule.runOnIdle { isAtEnd.value = true }
         rule.waitForIdle()
@@ -194,37 +191,36 @@
         // End to start
         rule.runOnIdle { isAtEnd.value = false }
         rule.waitForIdle()
-        assertThat(config.getOrDefault(VectorProperty.TranslateX, -1f))
-            .isWithin(tolerance)
-            .of(0f)
+        assertThat(config.getOrDefault(VectorProperty.TranslateX, -1f)).isWithin(tolerance).of(0f)
     }
 
     @OptIn(InternalAnimationApi::class)
     @Test
     fun pathData() {
-        val a = ObjectAnimator(
-            duration = 1000,
-            startDelay = 0,
-            repeatCount = 0,
-            repeatMode = RepeatMode.Restart,
-            listOf(
-                PropertyValuesHolderPath(
-                    propertyName = "pathData",
-                    listOf(
-                        Keyframe(
-                            fraction = 0f,
-                            value = addPathNodes("M 0 0 L 1000 0 L 1000 1000 L 0 1000 Z"),
-                            interpolator = LinearEasing
-                        ),
-                        Keyframe(
-                            fraction = 1f,
-                            value = addPathNodes("M 1000 0 L 1000 0 L 1000 1000 L 0 1000 Z"),
-                            interpolator = LinearEasing
+        val a =
+            ObjectAnimator(
+                duration = 1000,
+                startDelay = 0,
+                repeatCount = 0,
+                repeatMode = RepeatMode.Restart,
+                listOf(
+                    PropertyValuesHolderPath(
+                        propertyName = "pathData",
+                        listOf(
+                            Keyframe(
+                                fraction = 0f,
+                                value = addPathNodes("M 0 0 L 1000 0 L 1000 1000 L 0 1000 Z"),
+                                interpolator = LinearEasing
+                            ),
+                            Keyframe(
+                                fraction = 1f,
+                                value = addPathNodes("M 1000 0 L 1000 0 L 1000 1000 L 0 1000 Z"),
+                                interpolator = LinearEasing
+                            )
                         )
                     )
                 )
             )
-        )
         val isAtEnd = mutableStateOf(false)
         val config = StateVectorConfig()
         rule.setContent {
@@ -255,29 +251,30 @@
     @OptIn(InternalAnimationApi::class)
     @Test
     fun pathData_repeat() {
-        val a = ObjectAnimator(
-            duration = 1000,
-            startDelay = 0,
-            repeatCount = 2,
-            repeatMode = RepeatMode.Restart,
-            listOf(
-                PropertyValuesHolderPath(
-                    propertyName = "pathData",
-                    listOf(
-                        Keyframe(
-                            fraction = 0f,
-                            value = addPathNodes("M 0 0 L 1000 0 L 1000 1000 L 0 1000 Z"),
-                            interpolator = LinearEasing
-                        ),
-                        Keyframe(
-                            fraction = 1f,
-                            value = addPathNodes("M 1000 0 L 1000 0 L 1000 1000 L 0 1000 Z"),
-                            interpolator = LinearEasing
+        val a =
+            ObjectAnimator(
+                duration = 1000,
+                startDelay = 0,
+                repeatCount = 2,
+                repeatMode = RepeatMode.Restart,
+                listOf(
+                    PropertyValuesHolderPath(
+                        propertyName = "pathData",
+                        listOf(
+                            Keyframe(
+                                fraction = 0f,
+                                value = addPathNodes("M 0 0 L 1000 0 L 1000 1000 L 0 1000 Z"),
+                                interpolator = LinearEasing
+                            ),
+                            Keyframe(
+                                fraction = 1f,
+                                value = addPathNodes("M 1000 0 L 1000 0 L 1000 1000 L 0 1000 Z"),
+                                interpolator = LinearEasing
+                            )
                         )
                     )
                 )
             )
-        )
         assertThat(a.totalDuration).isEqualTo(3000)
         val isAtEnd = mutableStateOf(false)
         val config = StateVectorConfig()
@@ -316,29 +313,34 @@
 
     @Test
     fun startDelay() {
-        val a = objectAnimator(
-            propertyName = "trimPathEnd",
-            duration = 400,
-            keyframes = listOf(
-                Keyframe(fraction = 0f, value = 0f, interpolator = LinearEasing),
-                Keyframe(fraction = 1f, value = 1f, interpolator = LinearEasing),
-            ),
-            startDelay = 100
-        )
+        val a =
+            objectAnimator(
+                propertyName = "trimPathEnd",
+                duration = 400,
+                keyframes =
+                    listOf(
+                        Keyframe(fraction = 0f, value = 0f, interpolator = LinearEasing),
+                        Keyframe(fraction = 1f, value = 1f, interpolator = LinearEasing),
+                    ),
+                startDelay = 100
+            )
         val isAtEnd = mutableStateOf(false)
         val config = StateVectorConfig()
         rule.setContent {
             val transition = updateTransition(isAtEnd.value, label = "startDelay")
-            val control = transition.animateFloat(
-                label = "control",
-                transitionSpec = {
-                    if (targetState) {
-                        tween(durationMillis = 400, delayMillis = 100, easing = LinearEasing)
-                    } else {
-                        tween(durationMillis = 400, easing = LinearEasing)
+            val control =
+                transition.animateFloat(
+                    label = "control",
+                    transitionSpec = {
+                        if (targetState) {
+                            tween(durationMillis = 400, delayMillis = 100, easing = LinearEasing)
+                        } else {
+                            tween(durationMillis = 400, easing = LinearEasing)
+                        }
                     }
+                ) {
+                    if (it) 1f else 0f
                 }
-            ) { if (it) 1f else 0f }
             a.Configure(transition, config, 500)
             if (transition.isRunning) {
                 val trimPathEnd = config.getOrDefault(VectorProperty.TrimPathEnd, -1f)
@@ -356,28 +358,34 @@
 
     @Test
     fun repeat_restart() {
-        val a = objectAnimator(
-            propertyName = "translateX",
-            duration = 500,
-            keyframes = listOf(
-                Keyframe(fraction = 0f, value = 0f, interpolator = LinearEasing),
-                Keyframe(fraction = 1f, value = 500f, interpolator = LinearEasing),
-            ),
-            repeatCount = 3
-        )
+        val a =
+            objectAnimator(
+                propertyName = "translateX",
+                duration = 500,
+                keyframes =
+                    listOf(
+                        Keyframe(fraction = 0f, value = 0f, interpolator = LinearEasing),
+                        Keyframe(fraction = 1f, value = 500f, interpolator = LinearEasing),
+                    ),
+                repeatCount = 3
+            )
         assertThat(a.totalDuration).isEqualTo(2000)
         val isAtEnd = mutableStateOf(false)
         val config = StateVectorConfig()
         rule.setContent {
             val transition = updateTransition(isAtEnd.value, label = "translateX")
-            val control = transition.animateFloat(
-                label = "control",
-                transitionSpec = {
-                    repeatable(iterations = 4, tween(durationMillis = 500, easing = LinearEasing))
+            val control =
+                transition.animateFloat(
+                    label = "control",
+                    transitionSpec = {
+                        repeatable(
+                            iterations = 4,
+                            tween(durationMillis = 500, easing = LinearEasing)
+                        )
+                    }
+                ) {
+                    if (it) 500f else 0f
                 }
-            ) {
-                if (it) 500f else 0f
-            }
             a.Configure(transition, config, overallDuration = a.totalDuration)
             if (transition.isRunning) {
                 val translateX = config.getOrDefault(VectorProperty.TranslateX, -1f)
@@ -392,33 +400,36 @@
 
     @Test
     fun repeat_reverse() {
-        val a = objectAnimator(
-            propertyName = "translateX",
-            duration = 500,
-            keyframes = listOf(
-                Keyframe(fraction = 0f, value = 0f, interpolator = LinearEasing),
-                Keyframe(fraction = 1f, value = 500f, interpolator = LinearEasing),
-            ),
-            repeatCount = 3,
-            repeatMode = RepeatMode.Reverse
-        )
+        val a =
+            objectAnimator(
+                propertyName = "translateX",
+                duration = 500,
+                keyframes =
+                    listOf(
+                        Keyframe(fraction = 0f, value = 0f, interpolator = LinearEasing),
+                        Keyframe(fraction = 1f, value = 500f, interpolator = LinearEasing),
+                    ),
+                repeatCount = 3,
+                repeatMode = RepeatMode.Reverse
+            )
         assertThat(a.totalDuration).isEqualTo(2000)
         val isAtEnd = mutableStateOf(false)
         val config = StateVectorConfig()
         rule.setContent {
             val transition = updateTransition(isAtEnd.value, label = "translateX")
-            val control = transition.animateFloat(
-                label = "control",
-                transitionSpec = {
-                    repeatable(
-                        iterations = 4,
-                        animation = tween(durationMillis = 500, easing = LinearEasing),
-                        repeatMode = RepeatMode.Reverse
-                    )
+            val control =
+                transition.animateFloat(
+                    label = "control",
+                    transitionSpec = {
+                        repeatable(
+                            iterations = 4,
+                            animation = tween(durationMillis = 500, easing = LinearEasing),
+                            repeatMode = RepeatMode.Reverse
+                        )
+                    }
+                ) {
+                    if (it) 500f else 0f
                 }
-            ) {
-                if (it) 500f else 0f
-            }
             a.Configure(transition, config, overallDuration = a.totalDuration)
             if (transition.isRunning) {
                 val translateX = config.getOrDefault(VectorProperty.TranslateX, -1f)
@@ -433,33 +444,36 @@
 
     @Test
     fun repeat_infinite() {
-        val a = objectAnimator(
-            propertyName = "translateX",
-            duration = 500,
-            keyframes = listOf(
-                Keyframe(fraction = 0f, value = 0f, interpolator = LinearEasing),
-                Keyframe(fraction = 1f, value = 500f, interpolator = LinearEasing),
-            ),
-            repeatCount = RepeatCountInfinite,
-            repeatMode = RepeatMode.Reverse
-        )
+        val a =
+            objectAnimator(
+                propertyName = "translateX",
+                duration = 500,
+                keyframes =
+                    listOf(
+                        Keyframe(fraction = 0f, value = 0f, interpolator = LinearEasing),
+                        Keyframe(fraction = 1f, value = 500f, interpolator = LinearEasing),
+                    ),
+                repeatCount = RepeatCountInfinite,
+                repeatMode = RepeatMode.Reverse
+            )
         assertThat(a.totalDuration).isEqualTo(Int.MAX_VALUE)
         val isAtEnd = mutableStateOf(false)
         val config = StateVectorConfig()
         rule.setContent {
             val transition = updateTransition(isAtEnd.value, label = "translateX")
-            val control = transition.animateFloat(
-                label = "control",
-                transitionSpec = {
-                    repeatable(
-                        iterations = Int.MAX_VALUE,
-                        animation = tween(durationMillis = 500, easing = LinearEasing),
-                        repeatMode = RepeatMode.Reverse
-                    )
+            val control =
+                transition.animateFloat(
+                    label = "control",
+                    transitionSpec = {
+                        repeatable(
+                            iterations = Int.MAX_VALUE,
+                            animation = tween(durationMillis = 500, easing = LinearEasing),
+                            repeatMode = RepeatMode.Reverse
+                        )
+                    }
+                ) {
+                    if (it) 500f else 0f
                 }
-            ) {
-                if (it) 500f else 0f
-            }
             a.Configure(transition, config, overallDuration = a.totalDuration)
             if (transition.isRunning) {
                 val translateX = config.getOrDefault(VectorProperty.TranslateX, -1f)
@@ -469,8 +483,6 @@
         assertThat(config.getOrDefault(VectorProperty.TranslateX, -1f)).isEqualTo(0f)
         rule.runOnIdle { isAtEnd.value = true }
         // Run for 300 frames.
-        repeat(300) {
-            rule.mainClock.advanceTimeBy(16)
-        }
+        repeat(300) { rule.mainClock.advanceTimeBy(16) }
     }
 }
diff --git a/compose/animation/animation-graphics/src/androidInstrumentedTest/kotlin/androidx/compose/animation/graphics/vector/compat/XmlAnimatedVectorParserTest.kt b/compose/animation/animation-graphics/src/androidInstrumentedTest/kotlin/androidx/compose/animation/graphics/vector/compat/XmlAnimatedVectorParserTest.kt
index bc16e765..7e7d478 100644
--- a/compose/animation/animation-graphics/src/androidInstrumentedTest/kotlin/androidx/compose/animation/graphics/vector/compat/XmlAnimatedVectorParserTest.kt
+++ b/compose/animation/animation-graphics/src/androidInstrumentedTest/kotlin/androidx/compose/animation/graphics/vector/compat/XmlAnimatedVectorParserTest.kt
@@ -39,11 +39,7 @@
     fun load() {
         val context = InstrumentationRegistry.getInstrumentation().targetContext
         val resources = context.resources
-        val avd = loadAnimatedVectorResource(
-            context.theme,
-            resources,
-            R.drawable.avd_complex
-        )
+        val avd = loadAnimatedVectorResource(context.theme, resources, R.drawable.avd_complex)
 
         val delta = 0.001f
         assertThat(avd.imageVector.defaultWidth).isEqualTo(24.dp)
diff --git a/compose/animation/animation-graphics/src/androidInstrumentedTest/kotlin/androidx/compose/animation/graphics/vector/compat/XmlAnimatorParserTest.kt b/compose/animation/animation-graphics/src/androidInstrumentedTest/kotlin/androidx/compose/animation/graphics/vector/compat/XmlAnimatorParserTest.kt
index e4cbe31..7cb2037 100644
--- a/compose/animation/animation-graphics/src/androidInstrumentedTest/kotlin/androidx/compose/animation/graphics/vector/compat/XmlAnimatorParserTest.kt
+++ b/compose/animation/animation-graphics/src/androidInstrumentedTest/kotlin/androidx/compose/animation/graphics/vector/compat/XmlAnimatorParserTest.kt
@@ -48,11 +48,7 @@
         val context = InstrumentationRegistry.getInstrumentation().targetContext
         val resources = context.resources
         val delta = 0.001f
-        val a = loadAnimatorResource(
-            context.theme,
-            resources,
-            R.animator.object_animator_1d
-        )
+        val a = loadAnimatorResource(context.theme, resources, R.animator.object_animator_1d)
         assertThat(a).isInstanceOf(ObjectAnimator::class.java)
         val oa = a as ObjectAnimator
         assertThat(oa.duration).isEqualTo(333)
@@ -72,11 +68,7 @@
     fun objectAnimator2D() {
         val context = InstrumentationRegistry.getInstrumentation().targetContext
         val resources = context.resources
-        val a = loadAnimatorResource(
-            context.theme,
-            resources,
-            R.animator.object_animator_2d
-        )
+        val a = loadAnimatorResource(context.theme, resources, R.animator.object_animator_2d)
         assertThat(a).isInstanceOf(ObjectAnimator::class.java)
         val oa = a as ObjectAnimator
         assertThat(oa.duration).isEqualTo(333)
@@ -94,11 +86,7 @@
         val context = InstrumentationRegistry.getInstrumentation().targetContext
         val resources = context.resources
         val delta = 0.001f
-        val a = loadAnimatorResource(
-            context.theme,
-            resources,
-            R.animator.property_values_holders
-        )
+        val a = loadAnimatorResource(context.theme, resources, R.animator.property_values_holders)
         assertThat(a).isInstanceOf(ObjectAnimator::class.java)
         val oa = a as ObjectAnimator
         assertThat(oa.duration).isEqualTo(333)
@@ -159,11 +147,7 @@
     fun set() {
         val context = InstrumentationRegistry.getInstrumentation().targetContext
         val resources = context.resources
-        val anim = loadAnimatorResource(
-            context.theme,
-            resources,
-            R.animator.set
-        )
+        val anim = loadAnimatorResource(context.theme, resources, R.animator.set)
         assertThat(anim).isInstanceOf(AnimatorSet::class.java)
         val set = anim as AnimatorSet
         assertThat(set.ordering).isEqualTo(Ordering.Together)
diff --git a/compose/animation/animation-graphics/src/androidMain/kotlin/androidx/compose/animation/graphics/res/AnimatedVectorPainterResources.android.kt b/compose/animation/animation-graphics/src/androidMain/kotlin/androidx/compose/animation/graphics/res/AnimatedVectorPainterResources.android.kt
index 0cd641d..a86cc63 100644
--- a/compose/animation/animation-graphics/src/androidMain/kotlin/androidx/compose/animation/graphics/res/AnimatedVectorPainterResources.android.kt
+++ b/compose/animation/animation-graphics/src/androidMain/kotlin/androidx/compose/animation/graphics/res/AnimatedVectorPainterResources.android.kt
@@ -31,9 +31,9 @@
 import androidx.compose.ui.util.fastForEach
 
 /**
- * Creates and remembers a [Painter] to render an [AnimatedImageVector]. It renders the image
- * either at the start or the end of all the animations depending on the [atEnd]. Changes to
- * [atEnd] are animated.
+ * Creates and remembers a [Painter] to render an [AnimatedImageVector]. It renders the image either
+ * at the start or the end of all the animations depending on the [atEnd]. Changes to [atEnd] are
+ * animated.
  *
  * @param atEnd Whether the animated vector should be rendered at the end of all its animations.
  *
@@ -71,10 +71,8 @@
         val transition = updateTransition(atEnd, label = animatedImageVector.imageVector.name)
         val map = mutableMapOf<String, StateVectorConfig>()
         animatedImageVector.targets.fastForEach { target ->
-            val config = target.animator.createVectorConfig(
-                transition,
-                animatedImageVector.totalDuration
-            )
+            val config =
+                target.animator.createVectorConfig(transition, animatedImageVector.totalDuration)
             val currentConfig = map[target.name]
             if (currentConfig != null) {
                 currentConfig.merge(config)
diff --git a/compose/animation/animation-graphics/src/androidMain/kotlin/androidx/compose/animation/graphics/res/AnimatedVectorResources.android.kt b/compose/animation/animation-graphics/src/androidMain/kotlin/androidx/compose/animation/graphics/res/AnimatedVectorResources.android.kt
index 64f61c3..c4c24cb 100644
--- a/compose/animation/animation-graphics/src/androidMain/kotlin/androidx/compose/animation/graphics/res/AnimatedVectorResources.android.kt
+++ b/compose/animation/animation-graphics/src/androidMain/kotlin/androidx/compose/animation/graphics/res/AnimatedVectorResources.android.kt
@@ -44,9 +44,7 @@
     val context = LocalContext.current
     val res = context.resources
     val theme = context.theme
-    return remember(id) {
-        loadAnimatedVectorResource(theme, res, id)
-    }
+    return remember(id) { loadAnimatedVectorResource(theme, res, id) }
 }
 
 @ExperimentalAnimationGraphicsApi
diff --git a/compose/animation/animation-graphics/src/androidMain/kotlin/androidx/compose/animation/graphics/res/AnimatorResources.android.kt b/compose/animation/animation-graphics/src/androidMain/kotlin/androidx/compose/animation/graphics/res/AnimatorResources.android.kt
index 7c51152..d5995bd 100644
--- a/compose/animation/animation-graphics/src/androidMain/kotlin/androidx/compose/animation/graphics/res/AnimatorResources.android.kt
+++ b/compose/animation/animation-graphics/src/androidMain/kotlin/androidx/compose/animation/graphics/res/AnimatorResources.android.kt
@@ -40,9 +40,7 @@
 import kotlin.math.sin
 import org.xmlpull.v1.XmlPullParserException
 
-/**
- * Synchronously loads an [Animator] resource.
- */
+/** Synchronously loads an [Animator] resource. */
 @Throws(XmlPullParserException::class)
 internal fun loadAnimatorResource(
     theme: Resources.Theme? = null,
@@ -73,10 +71,12 @@
 }
 
 internal val AccelerateEasing = Easing { x -> x * x }
+
 internal fun AccelerateEasing(factor: Float) = Easing { x -> x.pow(factor * 2) }
 
-internal fun AnticipateEasing(tension: Float) =
-    Easing { x -> x * x * ((tension + 1) * x - tension) }
+internal fun AnticipateEasing(tension: Float) = Easing { x ->
+    x * x * ((tension + 1) * x - tension)
+}
 
 internal fun AnticipateOvershootEasing(tension: Float, extraTension: Float): Easing =
     AnticipateOvershootInterpolator(tension, extraTension).toEasing()
@@ -86,25 +86,26 @@
 internal fun CycleEasing(cycle: Float) = Easing { x -> sin(2 * cycle * PI * x).toFloat() }
 
 internal val DecelerateEasing = Easing { x -> 1.0f - (1.0f - x) * (1.0f - x) }
+
 internal fun DecelerateEasing(factor: Float) = Easing { x -> 1.0f - (1.0f - x).pow(2 * factor) }
 
-internal fun OvershootEasing(tension: Float) =
-    Easing { x -> (x - 1f).let { t -> t * t * ((tension + 1f) * t + tension) + 1f } }
+internal fun OvershootEasing(tension: Float) = Easing { x ->
+    (x - 1f).let { t -> t * t * ((tension + 1f) * t + tension) + 1f }
+}
 
-private val builtinInterpolators = hashMapOf(
-    android.R.anim.linear_interpolator to LinearEasing,
-    android.R.interpolator.fast_out_linear_in to FastOutLinearInEasing,
-    android.R.interpolator.fast_out_slow_in to FastOutSlowInEasing,
-    android.R.interpolator.linear to LinearEasing,
-    android.R.interpolator.linear_out_slow_in to LinearOutSlowInEasing,
-    AndroidVectorResources.FAST_OUT_LINEAR_IN to FastOutLinearInEasing,
-    AndroidVectorResources.FAST_OUT_SLOW_IN to FastOutSlowInEasing,
-    AndroidVectorResources.LINEAR_OUT_SLOW_IN to LinearOutSlowInEasing
-)
+private val builtinInterpolators =
+    hashMapOf(
+        android.R.anim.linear_interpolator to LinearEasing,
+        android.R.interpolator.fast_out_linear_in to FastOutLinearInEasing,
+        android.R.interpolator.fast_out_slow_in to FastOutSlowInEasing,
+        android.R.interpolator.linear to LinearEasing,
+        android.R.interpolator.linear_out_slow_in to LinearOutSlowInEasing,
+        AndroidVectorResources.FAST_OUT_LINEAR_IN to FastOutLinearInEasing,
+        AndroidVectorResources.FAST_OUT_SLOW_IN to FastOutSlowInEasing,
+        AndroidVectorResources.LINEAR_OUT_SLOW_IN to LinearOutSlowInEasing
+    )
 
-/**
- * Synchronously loads an interpolator resource as an [Easing].
- */
+/** Synchronously loads an interpolator resource as an [Easing]. */
 @Throws(XmlPullParserException::class)
 internal fun loadInterpolatorResource(
     theme: Resources.Theme? = null,
diff --git a/compose/animation/animation-graphics/src/androidMain/kotlin/androidx/compose/animation/graphics/vector/compat/AndroidVectorResources.android.kt b/compose/animation/animation-graphics/src/androidMain/kotlin/androidx/compose/animation/graphics/vector/compat/AndroidVectorResources.android.kt
index b2b4521..8af0c15c 100644
--- a/compose/animation/animation-graphics/src/androidMain/kotlin/androidx/compose/animation/graphics/vector/compat/AndroidVectorResources.android.kt
+++ b/compose/animation/animation-graphics/src/androidMain/kotlin/androidx/compose/animation/graphics/vector/compat/AndroidVectorResources.android.kt
@@ -16,9 +16,7 @@
 
 package androidx.compose.animation.graphics.vector.compat
 
-/**
- * Constants used to resolve AnimatedVectorDrawable attributes during xml inflation
- */
+/** Constants used to resolve AnimatedVectorDrawable attributes during xml inflation */
 internal object AndroidVectorResources {
 
     val STYLEABLE_ANIMATED_VECTOR_DRAWABLE = intArrayOf(android.R.attr.drawable)
@@ -29,16 +27,17 @@
     const val STYLEABLE_ANIMATED_VECTOR_DRAWABLE_TARGET_ANIMATION = 1
     const val STYLEABLE_ANIMATED_VECTOR_DRAWABLE_TARGET_NAME = 0
 
-    val STYLEABLE_ANIMATOR = intArrayOf(
-        0x01010141,
-        0x01010198,
-        0x010101be,
-        0x010101bf,
-        0x010101c0,
-        0x010102de,
-        0x010102df,
-        0x010102e0
-    )
+    val STYLEABLE_ANIMATOR =
+        intArrayOf(
+            0x01010141,
+            0x01010198,
+            0x010101be,
+            0x010101bf,
+            0x010101c0,
+            0x010102de,
+            0x010102df,
+            0x010102e0
+        )
     const val STYLEABLE_ANIMATOR_INTERPOLATOR = 0
     const val STYLEABLE_ANIMATOR_DURATION = 1
     const val STYLEABLE_ANIMATOR_START_OFFSET = 2
@@ -70,10 +69,8 @@
     const val STYLEABLE_PROPERTY_ANIMATOR_PROPERTY_X_NAME = 2
     const val STYLEABLE_PROPERTY_ANIMATOR_PROPERTY_Y_NAME = 3
 
-    val STYLEABLE_ANTICIPATEOVERSHOOT_INTERPOLATOR = intArrayOf(
-        android.R.attr.tension,
-        android.R.attr.extraTension
-    )
+    val STYLEABLE_ANTICIPATEOVERSHOOT_INTERPOLATOR =
+        intArrayOf(android.R.attr.tension, android.R.attr.extraTension)
     const val STYLEABLE_ANTICIPATEOVERSHOOT_INTERPOLATOR_TENSION = 0
     const val STYLEABLE_ANTICIPATEOVERSHOOT_INTERPOLATOR_EXTRA_TENSION = 1
 
diff --git a/compose/animation/animation-graphics/src/androidMain/kotlin/androidx/compose/animation/graphics/vector/compat/XmlAnimatedVectorParser.android.kt b/compose/animation/animation-graphics/src/androidMain/kotlin/androidx/compose/animation/graphics/vector/compat/XmlAnimatedVectorParser.android.kt
index e1cc77e..10f8123 100644
--- a/compose/animation/animation-graphics/src/androidMain/kotlin/androidx/compose/animation/graphics/vector/compat/XmlAnimatedVectorParser.android.kt
+++ b/compose/animation/animation-graphics/src/androidMain/kotlin/androidx/compose/animation/graphics/vector/compat/XmlAnimatedVectorParser.android.kt
@@ -35,12 +35,13 @@
     attrs: AttributeSet
 ): AnimatedVectorTarget {
     return attrs.attrs(
-        res, theme, AndroidVectorResources.STYLEABLE_ANIMATED_VECTOR_DRAWABLE_TARGET
+        res,
+        theme,
+        AndroidVectorResources.STYLEABLE_ANIMATED_VECTOR_DRAWABLE_TARGET
     ) { a ->
         AnimatedVectorTarget(
-            a.getString(
-                AndroidVectorResources.STYLEABLE_ANIMATED_VECTOR_DRAWABLE_TARGET_NAME
-            ) ?: "",
+            a.getString(AndroidVectorResources.STYLEABLE_ANIMATED_VECTOR_DRAWABLE_TARGET_NAME)
+                ?: "",
             loadAnimatorResource(
                 theme,
                 res,
@@ -60,19 +61,14 @@
     attrs: AttributeSet
 ): AnimatedImageVector {
     return attrs.attrs(res, theme, AndroidVectorResources.STYLEABLE_ANIMATED_VECTOR_DRAWABLE) { a ->
-        val drawableId = a.getResourceId(
-            AndroidVectorResources.STYLEABLE_ANIMATED_VECTOR_DRAWABLE_DRAWABLE,
-            0
-        )
+        val drawableId =
+            a.getResourceId(AndroidVectorResources.STYLEABLE_ANIMATED_VECTOR_DRAWABLE_DRAWABLE, 0)
         val targets = mutableListOf<AnimatedVectorTarget>()
         forEachChildOf(TagAnimatedVector) {
             if (eventType == XmlPullParser.START_TAG && name == TagAnimatedVectorTarget) {
                 targets.add(parseAnimatedVectorTarget(res, theme, attrs))
             }
         }
-        AnimatedImageVector(
-            ImageVector.vectorResource(theme, res, drawableId),
-            targets
-        )
+        AnimatedImageVector(ImageVector.vectorResource(theme, res, drawableId), targets)
     }
 }
diff --git a/compose/animation/animation-graphics/src/androidMain/kotlin/androidx/compose/animation/graphics/vector/compat/XmlAnimatorParser.android.kt b/compose/animation/animation-graphics/src/androidMain/kotlin/androidx/compose/animation/graphics/vector/compat/XmlAnimatorParser.android.kt
index 405c28c..ea7431c 100644
--- a/compose/animation/animation-graphics/src/androidMain/kotlin/androidx/compose/animation/graphics/vector/compat/XmlAnimatorParser.android.kt
+++ b/compose/animation/animation-graphics/src/androidMain/kotlin/androidx/compose/animation/graphics/vector/compat/XmlAnimatorParser.android.kt
@@ -134,26 +134,10 @@
     valueIndex: Int
 ): Keyframe<Any> {
     return when (valueType) {
-        ValueType.Float -> Keyframe(
-            fraction,
-            getFloat(valueIndex, 0f),
-            interpolator
-        )
-        ValueType.Int -> Keyframe(
-            fraction,
-            getInt(valueIndex, 0),
-            interpolator
-        )
-        ValueType.Color -> Keyframe(
-            fraction,
-            Color(getColor(valueIndex, 0)),
-            interpolator
-        )
-        ValueType.Path -> Keyframe(
-            fraction,
-            addPathNodes(getString(valueIndex)),
-            interpolator
-        )
+        ValueType.Float -> Keyframe(fraction, getFloat(valueIndex, 0f), interpolator)
+        ValueType.Int -> Keyframe(fraction, getInt(valueIndex, 0), interpolator)
+        ValueType.Color -> Keyframe(fraction, Color(getColor(valueIndex, 0)), interpolator)
+        ValueType.Path -> Keyframe(fraction, addPathNodes(getString(valueIndex)), interpolator)
     }
 }
 
@@ -163,15 +147,9 @@
     attrs: AttributeSet,
     interpolator: Easing
 ): PropertyValuesHolder<*> {
-    return attrs.attrs(
-        res,
-        theme,
-        AndroidVectorResources.STYLEABLE_PROPERTY_VALUES_HOLDER
-    ) { a ->
+    return attrs.attrs(res, theme, AndroidVectorResources.STYLEABLE_PROPERTY_VALUES_HOLDER) { a ->
         a.getPropertyValuesHolder1D(
-            a.getString(
-                AndroidVectorResources.STYLEABLE_PROPERTY_VALUES_HOLDER_PROPERTY_NAME
-            )!!,
+            a.getString(AndroidVectorResources.STYLEABLE_PROPERTY_VALUES_HOLDER_PROPERTY_NAME)!!,
             AndroidVectorResources.STYLEABLE_PROPERTY_VALUES_HOLDER_VALUE_TYPE,
             AndroidVectorResources.STYLEABLE_PROPERTY_VALUES_HOLDER_VALUE_FROM,
             AndroidVectorResources.STYLEABLE_PROPERTY_VALUES_HOLDER_VALUE_TO,
@@ -207,10 +185,9 @@
         ValueTypePath -> ValueType.Path
         else ->
             if (
-                typedValueTypes
-                    .all {
-                        it in TypedValue.TYPE_FIRST_COLOR_INT..TypedValue.TYPE_LAST_COLOR_INT
-                    }
+                typedValueTypes.all {
+                    it in TypedValue.TYPE_FIRST_COLOR_INT..TypedValue.TYPE_LAST_COLOR_INT
+                }
             ) {
                 ValueType.Color
             } else {
@@ -224,9 +201,9 @@
  * either `<objectAnimator>` or `<propertyValuesHolder>`.
  *
  * @param parseKeyframes The caller should parse `<keyframe>`s inside of this
- * `<propertyValuesHolder>` and store them in the `keyframes` [MutableList]. The lambda receives
- * a [ValueType] if it has been identified so far. The lambda has to return [ValueType] in case it
- * is first identified while parsing keyframes.
+ *   `<propertyValuesHolder>` and store them in the `keyframes` [MutableList]. The lambda receives a
+ *   [ValueType] if it has been identified so far. The lambda has to return [ValueType] in case it
+ *   is first identified while parsing keyframes.
  */
 private fun TypedArray.getPropertyValuesHolder1D(
     propertyName: String,
@@ -234,15 +211,12 @@
     valueFromIndex: Int,
     valueToIndex: Int,
     interpolator: Easing,
-    parseKeyframes: (
-        valueType: ValueType?,
-        keyframes: MutableList<Keyframe<Any>>
-    ) -> ValueType = { vt, _ -> vt ?: FallbackValueType }
+    parseKeyframes: (valueType: ValueType?, keyframes: MutableList<Keyframe<Any>>) -> ValueType =
+        { vt, _ ->
+            vt ?: FallbackValueType
+        }
 ): PropertyValuesHolder1D<*> {
-    val valueType = getInt(
-        valueTypeIndex,
-        ValueTypeUndefined
-    )
+    val valueType = getInt(valueTypeIndex, ValueTypeUndefined)
 
     val valueFrom = peekValue(valueFromIndex)
     val hasFrom = valueFrom != null
@@ -252,16 +226,10 @@
     val hasTo = valueTo != null
     val typeTo = valueTo?.type ?: ValueTypeUndefined
 
-    var inferredValueType =
-        inferValueType(
-            valueType,
-            typeFrom,
-            typeTo
-        )
+    var inferredValueType = inferValueType(valueType, typeFrom, typeTo)
     val keyframes = mutableListOf<Keyframe<Any>>()
     if (inferredValueType == null && (hasFrom || hasTo)) {
-        inferredValueType =
-            ValueType.Float
+        inferredValueType = ValueType.Float
     }
     if (hasFrom) {
         keyframes.add(getKeyframe(0f, interpolator, inferredValueType!!, valueFromIndex))
@@ -273,29 +241,21 @@
     keyframes.sortBy { it.fraction }
     @Suppress("UNCHECKED_CAST")
     return when (inferredValueType) {
-        ValueType.Float -> PropertyValuesHolderFloat(
-            propertyName,
-            keyframes as List<Keyframe<Float>>
-        )
-        ValueType.Int -> PropertyValuesHolderInt(
-            propertyName,
-            keyframes as List<Keyframe<Int>>
-        )
-        ValueType.Color -> PropertyValuesHolderColor(
-            propertyName,
-            keyframes as List<Keyframe<Color>>
-        )
-        ValueType.Path -> PropertyValuesHolderPath(
-            propertyName,
-            keyframes as List<Keyframe<List<PathNode>>>
-        )
+        ValueType.Float ->
+            PropertyValuesHolderFloat(propertyName, keyframes as List<Keyframe<Float>>)
+        ValueType.Int -> PropertyValuesHolderInt(propertyName, keyframes as List<Keyframe<Int>>)
+        ValueType.Color ->
+            PropertyValuesHolderColor(propertyName, keyframes as List<Keyframe<Color>>)
+        ValueType.Path ->
+            PropertyValuesHolderPath(propertyName, keyframes as List<Keyframe<List<PathNode>>>)
     }
 }
 
-private fun convertRepeatMode(repeatMode: Int) = when (repeatMode) {
-    RepeatModeReverse -> RepeatMode.Reverse
-    else -> RepeatMode.Restart
-}
+private fun convertRepeatMode(repeatMode: Int) =
+    when (repeatMode) {
+        RepeatModeReverse -> RepeatMode.Reverse
+        else -> RepeatMode.Restart
+    }
 
 internal fun XmlPullParser.parseObjectAnimator(
     res: Resources,
@@ -304,16 +264,16 @@
 ): ObjectAnimator {
     return attrs.attrs(res, theme, AndroidVectorResources.STYLEABLE_ANIMATOR) { a ->
         attrs.attrs(res, theme, AndroidVectorResources.STYLEABLE_PROPERTY_ANIMATOR) { oa ->
-            val interpolator = a.getInterpolator(
-                res,
-                theme,
-                AndroidVectorResources.STYLEABLE_ANIMATOR_INTERPOLATOR,
-                AccelerateDecelerateEasing
-            )
+            val interpolator =
+                a.getInterpolator(
+                    res,
+                    theme,
+                    AndroidVectorResources.STYLEABLE_ANIMATOR_INTERPOLATOR,
+                    AccelerateDecelerateEasing
+                )
             val holders = mutableListOf<PropertyValuesHolder<*>>()
-            val pathData = oa.getString(
-                AndroidVectorResources.STYLEABLE_PROPERTY_ANIMATOR_PATH_DATA
-            )
+            val pathData =
+                oa.getString(AndroidVectorResources.STYLEABLE_PROPERTY_ANIMATOR_PATH_DATA)
             if (pathData != null) {
                 // 2D; This <objectAnimator> has `pathData`. It should also have `propertyXName`
                 // and `propertyYName`.
@@ -331,19 +291,18 @@
                 )
             } else {
                 // 1D; This <objectAnimator> has `propertyName`, `valueFrom`, and `valueTo`.
-                oa.getString(
-                    AndroidVectorResources.STYLEABLE_PROPERTY_ANIMATOR_PROPERTY_NAME
-                )?.let { propertyName ->
-                    holders.add(
-                        a.getPropertyValuesHolder1D(
-                            propertyName,
-                            AndroidVectorResources.STYLEABLE_ANIMATOR_VALUE_TYPE,
-                            AndroidVectorResources.STYLEABLE_ANIMATOR_VALUE_FROM,
-                            AndroidVectorResources.STYLEABLE_ANIMATOR_VALUE_TO,
-                            interpolator
+                oa.getString(AndroidVectorResources.STYLEABLE_PROPERTY_ANIMATOR_PROPERTY_NAME)
+                    ?.let { propertyName ->
+                        holders.add(
+                            a.getPropertyValuesHolder1D(
+                                propertyName,
+                                AndroidVectorResources.STYLEABLE_ANIMATOR_VALUE_TYPE,
+                                AndroidVectorResources.STYLEABLE_ANIMATOR_VALUE_FROM,
+                                AndroidVectorResources.STYLEABLE_ANIMATOR_VALUE_TO,
+                                interpolator
+                            )
                         )
-                    )
-                }
+                    }
                 // This <objectAnimator> has <propertyValuesHolder> inside.
                 forEachChildOf(TagObjectAnimator) {
                     if (eventType == XmlPullParser.START_TAG && name == TagPropertyValuesHolder) {
@@ -353,21 +312,13 @@
             }
 
             ObjectAnimator(
-                duration = a.getInt(
-                    AndroidVectorResources.STYLEABLE_ANIMATOR_DURATION,
-                    300
-                ),
-                startDelay = a.getInt(
-                    AndroidVectorResources.STYLEABLE_ANIMATOR_START_OFFSET,
-                    0
-                ),
-                repeatCount = a.getInt(
-                    AndroidVectorResources.STYLEABLE_ANIMATOR_REPEAT_COUNT,
-                    0
-                ),
-                repeatMode = convertRepeatMode(
-                    a.getInt(AndroidVectorResources.STYLEABLE_ANIMATOR_REPEAT_MODE, 0)
-                ),
+                duration = a.getInt(AndroidVectorResources.STYLEABLE_ANIMATOR_DURATION, 300),
+                startDelay = a.getInt(AndroidVectorResources.STYLEABLE_ANIMATOR_START_OFFSET, 0),
+                repeatCount = a.getInt(AndroidVectorResources.STYLEABLE_ANIMATOR_REPEAT_COUNT, 0),
+                repeatMode =
+                    convertRepeatMode(
+                        a.getInt(AndroidVectorResources.STYLEABLE_ANIMATOR_REPEAT_MODE, 0)
+                    ),
                 holders = holders
             )
         }
@@ -390,10 +341,7 @@
                 }
             }
         }
-        AnimatorSet(
-            animators,
-            if (ordering != 0) Ordering.Sequentially else Ordering.Together
-        )
+        AnimatorSet(animators, if (ordering != 0) Ordering.Sequentially else Ordering.Together)
     }
 }
 
@@ -405,32 +353,28 @@
     return when (name) {
         "linearInterpolator" -> LinearEasing
         "accelerateInterpolator" ->
-            attrs.attrs(
-                res, theme, AndroidVectorResources.STYLEABLE_ACCELERATE_INTERPOLATOR
-            ) { a ->
-                val factor = a.getFloat(
-                    AndroidVectorResources.STYLEABLE_ACCELERATE_INTERPOLATOR_FACTOR, 1.0f
-                )
+            attrs.attrs(res, theme, AndroidVectorResources.STYLEABLE_ACCELERATE_INTERPOLATOR) { a ->
+                val factor =
+                    a.getFloat(
+                        AndroidVectorResources.STYLEABLE_ACCELERATE_INTERPOLATOR_FACTOR,
+                        1.0f
+                    )
                 if (factor == 1.0f) AccelerateEasing else AccelerateEasing(factor)
             }
         "decelerateInterpolator" ->
-            attrs.attrs(
-                res, theme, AndroidVectorResources.STYLEABLE_DECELERATE_INTERPOLATOR
-            ) { a ->
-                val factor = a.getFloat(
-                    AndroidVectorResources.STYLEABLE_DECELERATE_INTERPOLATOR_FACTOR, 1.0f
-                )
+            attrs.attrs(res, theme, AndroidVectorResources.STYLEABLE_DECELERATE_INTERPOLATOR) { a ->
+                val factor =
+                    a.getFloat(
+                        AndroidVectorResources.STYLEABLE_DECELERATE_INTERPOLATOR_FACTOR,
+                        1.0f
+                    )
                 if (factor == 1.0f) DecelerateEasing else DecelerateEasing(factor)
             }
         "accelerateDecelerateInterpolator" -> AccelerateDecelerateEasing
         "cycleInterpolator" ->
-            attrs.attrs(
-                res, theme, AndroidVectorResources.STYLEABLE_CYCLE_INTERPOLATOR
-            ) { a ->
+            attrs.attrs(res, theme, AndroidVectorResources.STYLEABLE_CYCLE_INTERPOLATOR) { a ->
                 CycleEasing(
-                    a.getFloat(
-                        AndroidVectorResources.STYLEABLE_CYCLE_INTERPOLATOR_CYCLES, 1.0f
-                    )
+                    a.getFloat(AndroidVectorResources.STYLEABLE_CYCLE_INTERPOLATOR_CYCLES, 1.0f)
                 )
             }
         "anticipateInterpolator" ->
@@ -447,9 +391,7 @@
                 )
             }
         "overshootInterpolator" ->
-            attrs.attrs(
-                res, theme, AndroidVectorResources.STYLEABLE_OVERSHOOT_INTERPOLATOR
-            ) { a ->
+            attrs.attrs(res, theme, AndroidVectorResources.STYLEABLE_OVERSHOOT_INTERPOLATOR) { a ->
                 OvershootEasing(
                     a.getFloat(
                         AndroidVectorResources.STYLEABLE_OVERSHOOT_INTERPOLATOR_TENSION,
@@ -477,27 +419,26 @@
             }
         "bounceInterpolator" -> BounceEasing
         "pathInterpolator" ->
-            attrs.attrs(
-                res, theme, AndroidVectorResources.STYLEABLE_PATH_INTERPOLATOR
-            ) { a ->
+            attrs.attrs(res, theme, AndroidVectorResources.STYLEABLE_PATH_INTERPOLATOR) { a ->
                 val pathData =
                     a.getString(AndroidVectorResources.STYLEABLE_PATH_INTERPOLATOR_PATH_DATA)
                 if (pathData != null) {
                     PathInterpolator(PathParser.createPathFromPathData(pathData)).toEasing()
                 } else if (
                     !a.hasValue(AndroidVectorResources.STYLEABLE_PATH_INTERPOLATOR_CONTROL_X_2) ||
-                    !a.hasValue(AndroidVectorResources.STYLEABLE_PATH_INTERPOLATOR_CONTROL_Y_2)
+                        !a.hasValue(AndroidVectorResources.STYLEABLE_PATH_INTERPOLATOR_CONTROL_Y_2)
                 ) {
                     PathInterpolator(
-                        a.getFloat(
-                            AndroidVectorResources.STYLEABLE_PATH_INTERPOLATOR_CONTROL_X_1,
-                            0f
-                        ),
-                        a.getFloat(
-                            AndroidVectorResources.STYLEABLE_PATH_INTERPOLATOR_CONTROL_Y_1,
-                            0f
+                            a.getFloat(
+                                AndroidVectorResources.STYLEABLE_PATH_INTERPOLATOR_CONTROL_X_1,
+                                0f
+                            ),
+                            a.getFloat(
+                                AndroidVectorResources.STYLEABLE_PATH_INTERPOLATOR_CONTROL_Y_1,
+                                0f
+                            )
                         )
-                    ).toEasing()
+                        .toEasing()
                 } else {
                     CubicBezierEasing(
                         a.getFloat(
diff --git a/compose/animation/animation-graphics/src/androidMain/kotlin/androidx/compose/animation/graphics/vector/compat/XmlPullParserUtils.android.kt b/compose/animation/animation-graphics/src/androidMain/kotlin/androidx/compose/animation/graphics/vector/compat/XmlPullParserUtils.android.kt
index ab35418..d664e1d 100644
--- a/compose/animation/animation-graphics/src/androidMain/kotlin/androidx/compose/animation/graphics/vector/compat/XmlPullParserUtils.android.kt
+++ b/compose/animation/animation-graphics/src/androidMain/kotlin/androidx/compose/animation/graphics/vector/compat/XmlPullParserUtils.android.kt
@@ -23,12 +23,9 @@
 import org.xmlpull.v1.XmlPullParserException
 
 internal fun XmlPullParser.isAtEnd(): Boolean =
-    eventType == XmlPullParser.END_DOCUMENT ||
-        (depth < 1 && eventType == XmlPullParser.END_TAG)
+    eventType == XmlPullParser.END_DOCUMENT || (depth < 1 && eventType == XmlPullParser.END_TAG)
 
-/**
- * Helper method to seek to the first tag within the VectorDrawable xml asset
- */
+/** Helper method to seek to the first tag within the VectorDrawable xml asset */
 @Throws(XmlPullParserException::class)
 internal fun XmlPullParser.seekToStartTag(): XmlPullParser {
     var type = next()
@@ -46,10 +43,7 @@
  * Assuming that we are at the [XmlPullParser.START_TAG start] of the specified [tag], iterates
  * though the events until we see a corresponding [XmlPullParser.END_TAG].
  */
-internal inline fun XmlPullParser.forEachChildOf(
-    tag: String,
-    action: XmlPullParser.() -> Unit
-) {
+internal inline fun XmlPullParser.forEachChildOf(tag: String, action: XmlPullParser.() -> Unit) {
     next()
     while (!isAtEnd()) {
         if (eventType == XmlPullParser.END_TAG && name == tag) {
@@ -66,8 +60,9 @@
     styleable: IntArray,
     body: (a: TypedArray) -> T
 ): T {
-    val a = theme?.obtainStyledAttributes(this, styleable, 0, 0)
-        ?: res.obtainAttributes(this, styleable)
+    val a =
+        theme?.obtainStyledAttributes(this, styleable, 0, 0)
+            ?: res.obtainAttributes(this, styleable)
     try {
         return body(a)
     } finally {
diff --git a/compose/animation/animation-graphics/src/commonMain/kotlin/androidx/compose/animation/graphics/vector/AnimatedImageVector.kt b/compose/animation/animation-graphics/src/commonMain/kotlin/androidx/compose/animation/graphics/vector/AnimatedImageVector.kt
index 4567ab8..4556658 100644
--- a/compose/animation/animation-graphics/src/commonMain/kotlin/androidx/compose/animation/graphics/vector/AnimatedImageVector.kt
+++ b/compose/animation/animation-graphics/src/commonMain/kotlin/androidx/compose/animation/graphics/vector/AnimatedImageVector.kt
@@ -23,15 +23,16 @@
 
 /**
  * Animated vector graphics object that is generated as a result of
- * [androidx.compose.animation.graphics.res.loadAnimatedVectorResource].
- * It can be composed and rendered by `rememberAnimatedVectorPainter`.
+ * [androidx.compose.animation.graphics.res.loadAnimatedVectorResource]. It can be composed and
+ * rendered by `rememberAnimatedVectorPainter`.
  *
  * @param imageVector The [ImageVector] to be animated. This is represented with the
- * `android:drawable` parameter of an `<animated-vector>` element.
+ *   `android:drawable` parameter of an `<animated-vector>` element.
  */
 @ExperimentalAnimationGraphicsApi
 @Immutable
-class AnimatedImageVector internal constructor(
+class AnimatedImageVector
+internal constructor(
     val imageVector: ImageVector,
     // The list of [AnimatedVectorTarget]s that specify animations for each of the elements in the
     // drawable. This is represented with `<target>` elements in `<animated-vector>`. This list is
@@ -42,21 +43,12 @@
     /**
      * The total duration of all the animations in this image, including start delays and repeats.
      */
-    val totalDuration = targets.fastMaxBy {
-        it.animator.totalDuration
-    }?.animator?.totalDuration ?: 0
+    val totalDuration =
+        targets.fastMaxBy { it.animator.totalDuration }?.animator?.totalDuration ?: 0
 
-    /**
-     * Provide an empty companion object to hang platform-specific companion extensions onto.
-     */
+    /** Provide an empty companion object to hang platform-specific companion extensions onto. */
     companion object {} // ktlint-disable no-empty-class-body
 }
 
-/**
- * Definition of animation to one of the elements in a [AnimatedImageVector].
- */
-@Immutable
-internal class AnimatedVectorTarget(
-    val name: String,
-    val animator: Animator
-)
+/** Definition of animation to one of the elements in a [AnimatedImageVector]. */
+@Immutable internal class AnimatedVectorTarget(val name: String, val animator: Animator)
diff --git a/compose/animation/animation-graphics/src/commonMain/kotlin/androidx/compose/animation/graphics/vector/Animator.kt b/compose/animation/animation-graphics/src/commonMain/kotlin/androidx/compose/animation/graphics/vector/Animator.kt
index a2612d9..ea5538c 100644
--- a/compose/animation/animation-graphics/src/commonMain/kotlin/androidx/compose/animation/graphics/vector/Animator.kt
+++ b/compose/animation/animation-graphics/src/commonMain/kotlin/androidx/compose/animation/graphics/vector/Animator.kt
@@ -56,9 +56,8 @@
         transition: Transition<Boolean>,
         overallDuration: Int
     ): StateVectorConfig {
-        return remember { StateVectorConfig() }.also { config ->
-            Configure(transition, config, overallDuration)
-        }
+        return remember { StateVectorConfig() }
+            .also { config -> Configure(transition, config, overallDuration) }
     }
 
     @Composable
@@ -67,11 +66,12 @@
         config: StateVectorConfig,
         overallDuration: Int
     ) {
-        val propertyValuesMap = remember(overallDuration) {
-            mutableScatterMapOf<String, PropertyValues<*>>().also {
-                collectPropertyValues(it, overallDuration, 0)
+        val propertyValuesMap =
+            remember(overallDuration) {
+                mutableScatterMapOf<String, PropertyValues<*>>().also {
+                    collectPropertyValues(it, overallDuration, 0)
+                }
             }
-        }
         propertyValuesMap.forEach { propertyName, values ->
             values.timestamps.sortBy { it.timeMillis }
             val state = values.createState(transition, propertyName, overallDuration)
@@ -114,20 +114,23 @@
 ) {
     fun asAnimationSpec(): FiniteAnimationSpec<T> {
         @Suppress("UNCHECKED_CAST")
-        val spec = when (holder) {
-            is PropertyValuesHolderFloat -> holder.asKeyframeSpec(durationMillis)
-            is PropertyValuesHolderColor -> holder.asKeyframeSpec(durationMillis)
-            else -> throw RuntimeException("Unexpected value type: $holder")
-        } as KeyframesSpec<T>
+        val spec =
+            when (holder) {
+                is PropertyValuesHolderFloat -> holder.asKeyframeSpec(durationMillis)
+                is PropertyValuesHolderColor -> holder.asKeyframeSpec(durationMillis)
+                else -> throw RuntimeException("Unexpected value type: $holder")
+            }
+                as KeyframesSpec<T>
         return if (repeatCount == 0) {
             spec
         } else {
             repeatable(
-                iterations = if (repeatCount == RepeatCountInfinite) {
-                    Int.MAX_VALUE
-                } else {
-                    repeatCount + 1
-                },
+                iterations =
+                    if (repeatCount == RepeatCountInfinite) {
+                        Int.MAX_VALUE
+                    } else {
+                        repeatCount + 1
+                    },
                 animation = spec,
                 repeatMode = repeatMode
             )
@@ -149,9 +152,12 @@
         overallDuration: Int
     ): @Composable Transition.Segment<Boolean>.() -> FiniteAnimationSpec<T> {
         return {
-            val spec = combined(timestamps.fastMap { timestamp ->
-                timestamp.timeMillis to timestamp.asAnimationSpec()
-            })
+            val spec =
+                combined(
+                    timestamps.fastMap { timestamp ->
+                        timestamp.timeMillis to timestamp.asAnimationSpec()
+                    }
+                )
             if (targetState) spec else spec.reversed(overallDuration)
         }
     }
@@ -171,10 +177,14 @@
             targetValueByState = { atEnd ->
                 if (atEnd) {
                     (timestamps.last().holder as PropertyValuesHolderFloat)
-                        .animatorKeyframes.last().value
+                        .animatorKeyframes
+                        .last()
+                        .value
                 } else {
                     (timestamps.first().holder as PropertyValuesHolderFloat)
-                        .animatorKeyframes.first().value
+                        .animatorKeyframes
+                        .first()
+                        .value
                 }
             }
         )
@@ -195,10 +205,14 @@
             targetValueByState = { atEnd ->
                 if (atEnd) {
                     (timestamps.last().holder as PropertyValuesHolderColor)
-                        .animatorKeyframes.last().value
+                        .animatorKeyframes
+                        .last()
+                        .value
                 } else {
                     (timestamps.first().holder as PropertyValuesHolderColor)
-                        .animatorKeyframes.first().value
+                        .animatorKeyframes
+                        .first()
+                        .value
                 }
             }
         )
@@ -213,15 +227,16 @@
         propertyName: String,
         overallDuration: Int
     ): State<List<PathNode>> {
-        val timeState = transition.animateFloat(
-            transitionSpec = {
-                val spec = tween<Float>(durationMillis = overallDuration, easing = LinearEasing)
-                if (targetState) spec else spec.reversed(overallDuration)
-            },
-            label = propertyName
-        ) { atEnd ->
-            if (atEnd) overallDuration.toFloat() else 0f
-        }
+        val timeState =
+            transition.animateFloat(
+                transitionSpec = {
+                    val spec = tween<Float>(durationMillis = overallDuration, easing = LinearEasing)
+                    if (targetState) spec else spec.reversed(overallDuration)
+                },
+                label = propertyName
+            ) { atEnd ->
+                if (atEnd) overallDuration.toFloat() else 0f
+            }
         @Suppress("UnrememberedMutableState") // b/279909531
         return derivedStateOf { interpolate(timeState.value) }
     }
@@ -251,11 +266,12 @@
     val holders: List<PropertyValuesHolder<*>>
 ) : Animator() {
 
-    override val totalDuration = if (repeatCount == RepeatCountInfinite) {
-        Int.MAX_VALUE
-    } else {
-        startDelay + duration * (repeatCount + 1)
-    }
+    override val totalDuration =
+        if (repeatCount == RepeatCountInfinite) {
+            Int.MAX_VALUE
+        } else {
+            startDelay + duration * (repeatCount + 1)
+        }
 
     override fun collectPropertyValues(
         propertyValuesMap: MutableScatterMap<String, PropertyValues<*>>,
@@ -320,15 +336,14 @@
     }
 }
 
-internal data class AnimatorSet(
-    val animators: List<Animator>,
-    val ordering: Ordering
-) : Animator() {
+internal data class AnimatorSet(val animators: List<Animator>, val ordering: Ordering) :
+    Animator() {
 
-    override val totalDuration = when (ordering) {
-        Ordering.Together -> animators.fastMaxBy { it.totalDuration }?.totalDuration ?: 0
-        Ordering.Sequentially -> animators.fastSumBy { it.totalDuration }
-    }
+    override val totalDuration =
+        when (ordering) {
+            Ordering.Together -> animators.fastMaxBy { it.totalDuration }?.totalDuration ?: 0
+            Ordering.Sequentially -> animators.fastSumBy { it.totalDuration }
+        }
 
     override fun collectPropertyValues(
         propertyValuesMap: MutableScatterMap<String, PropertyValues<*>>,
@@ -338,11 +353,7 @@
         when (ordering) {
             Ordering.Together -> {
                 animators.fastForEach { animator ->
-                    animator.collectPropertyValues(
-                        propertyValuesMap,
-                        overallDuration,
-                        parentDelay
-                    )
+                    animator.collectPropertyValues(propertyValuesMap, overallDuration, parentDelay)
                 }
             }
             Ordering.Sequentially -> {
@@ -369,9 +380,8 @@
     val interpolator: Easing
 ) : PropertyValuesHolder<Pair<Float, Float>>()
 
-internal sealed class PropertyValuesHolder1D<T>(
-    val propertyName: String
-) : PropertyValuesHolder<T>() {
+internal sealed class PropertyValuesHolder1D<T>(val propertyName: String) :
+    PropertyValuesHolder<T>() {
 
     abstract val animatorKeyframes: List<Keyframe<T>>
 }
@@ -417,14 +427,15 @@
 ) : PropertyValuesHolder1D<List<PathNode>>(propertyName) {
 
     fun interpolate(fraction: Float): List<PathNode> {
-        val index = (animatorKeyframes.indexOfFirst { it.fraction >= fraction } - 1)
-            .coerceAtLeast(0)
+        val index =
+            (animatorKeyframes.indexOfFirst { it.fraction >= fraction } - 1).coerceAtLeast(0)
         val easing = animatorKeyframes[index + 1].interpolator
-        val innerFraction = easing.transform(
-            ((fraction - animatorKeyframes[index].fraction) /
-                (animatorKeyframes[index + 1].fraction - animatorKeyframes[index].fraction))
-                .fastCoerceIn(0f, 1f)
-        )
+        val innerFraction =
+            easing.transform(
+                ((fraction - animatorKeyframes[index].fraction) /
+                        (animatorKeyframes[index + 1].fraction - animatorKeyframes[index].fraction))
+                    .fastCoerceIn(0f, 1f)
+            )
         return lerp(
             animatorKeyframes[index].value,
             animatorKeyframes[index + 1].value,
@@ -433,11 +444,7 @@
     }
 }
 
-internal data class Keyframe<T>(
-    val fraction: Float,
-    val value: T,
-    val interpolator: Easing
-)
+internal data class Keyframe<T>(val fraction: Float, val value: T, val interpolator: Easing)
 
 internal enum class Ordering {
     Together,
@@ -474,19 +481,18 @@
             is VectorProperty.TranslateX -> translateXState?.value ?: defaultValue
             is VectorProperty.TranslateY -> translateYState?.value ?: defaultValue
             is VectorProperty.PathData -> pathDataState?.value ?: defaultValue
-            is VectorProperty.Fill -> fillColorState?.let { state ->
-                SolidColor(state.value)
-            } ?: defaultValue
+            is VectorProperty.Fill ->
+                fillColorState?.let { state -> SolidColor(state.value) } ?: defaultValue
             is VectorProperty.FillAlpha -> fillAlphaState?.value ?: defaultValue
-            is VectorProperty.Stroke -> strokeColorState?.let { state ->
-                SolidColor(state.value)
-            } ?: defaultValue
+            is VectorProperty.Stroke ->
+                strokeColorState?.let { state -> SolidColor(state.value) } ?: defaultValue
             is VectorProperty.StrokeLineWidth -> strokeWidthState?.value ?: defaultValue
             is VectorProperty.StrokeAlpha -> strokeAlphaState?.value ?: defaultValue
             is VectorProperty.TrimPathStart -> trimPathStartState?.value ?: defaultValue
             is VectorProperty.TrimPathEnd -> trimPathEndState?.value ?: defaultValue
             is VectorProperty.TrimPathOffset -> trimPathOffsetState?.value ?: defaultValue
-        } as T
+        }
+            as T
     }
 
     fun merge(config: StateVectorConfig) {
@@ -515,9 +521,7 @@
 
 private const val DifferentStartAndStopPathNodes = "start and stop path nodes have different types"
 
-/**
- * Linearly interpolate between [start] and [stop] with [fraction] fraction between them.
- */
+/** Linearly interpolate between [start] and [stop] with [fraction] fraction between them. */
 private fun lerp(start: PathNode, stop: PathNode, fraction: Float): PathNode {
     return when (start) {
         is PathNode.RelativeMoveTo -> {
@@ -529,10 +533,7 @@
         }
         is PathNode.MoveTo -> {
             require(stop is PathNode.MoveTo) { DifferentStartAndStopPathNodes }
-            PathNode.MoveTo(
-                lerp(start.x, stop.x, fraction),
-                lerp(start.y, stop.y, fraction)
-            )
+            PathNode.MoveTo(lerp(start.x, stop.x, fraction), lerp(start.y, stop.y, fraction))
         }
         is PathNode.RelativeLineTo -> {
             require(stop is PathNode.RelativeLineTo) { DifferentStartAndStopPathNodes }
@@ -543,34 +544,23 @@
         }
         is PathNode.LineTo -> {
             require(stop is PathNode.LineTo) { DifferentStartAndStopPathNodes }
-            PathNode.LineTo(
-                lerp(start.x, stop.x, fraction),
-                lerp(start.y, stop.y, fraction)
-            )
+            PathNode.LineTo(lerp(start.x, stop.x, fraction), lerp(start.y, stop.y, fraction))
         }
         is PathNode.RelativeHorizontalTo -> {
             require(stop is PathNode.RelativeHorizontalTo) { DifferentStartAndStopPathNodes }
-            PathNode.RelativeHorizontalTo(
-                lerp(start.dx, stop.dx, fraction)
-            )
+            PathNode.RelativeHorizontalTo(lerp(start.dx, stop.dx, fraction))
         }
         is PathNode.HorizontalTo -> {
             require(stop is PathNode.HorizontalTo) { DifferentStartAndStopPathNodes }
-            PathNode.HorizontalTo(
-                lerp(start.x, stop.x, fraction)
-            )
+            PathNode.HorizontalTo(lerp(start.x, stop.x, fraction))
         }
         is PathNode.RelativeVerticalTo -> {
             require(stop is PathNode.RelativeVerticalTo) { DifferentStartAndStopPathNodes }
-            PathNode.RelativeVerticalTo(
-                lerp(start.dy, stop.dy, fraction)
-            )
+            PathNode.RelativeVerticalTo(lerp(start.dy, stop.dy, fraction))
         }
         is PathNode.VerticalTo -> {
             require(stop is PathNode.VerticalTo) { DifferentStartAndStopPathNodes }
-            PathNode.VerticalTo(
-                lerp(start.y, stop.y, fraction)
-            )
+            PathNode.VerticalTo(lerp(start.y, stop.y, fraction))
         }
         is PathNode.RelativeCurveTo -> {
             require(stop is PathNode.RelativeCurveTo) { DifferentStartAndStopPathNodes }
diff --git a/compose/animation/animation-graphics/src/commonMain/kotlin/androidx/compose/animation/graphics/vector/AnimatorAnimationSpecs.kt b/compose/animation/animation-graphics/src/commonMain/kotlin/androidx/compose/animation/graphics/vector/AnimatorAnimationSpecs.kt
index 7d9ef65..eece6fd 100644
--- a/compose/animation/animation-graphics/src/commonMain/kotlin/androidx/compose/animation/graphics/vector/AnimatorAnimationSpecs.kt
+++ b/compose/animation/animation-graphics/src/commonMain/kotlin/androidx/compose/animation/graphics/vector/AnimatorAnimationSpecs.kt
@@ -28,9 +28,7 @@
 
 private const val MillisToNanos = 1_000_000L
 
-/**
- * Returns this [FiniteAnimationSpec] reversed.
- */
+/** Returns this [FiniteAnimationSpec] reversed. */
 internal fun <T> FiniteAnimationSpec<T>.reversed(durationMillis: Int): FiniteAnimationSpec<T> {
     return ReversedSpec(this, durationMillis)
 }
@@ -71,12 +69,14 @@
         targetValue: V,
         initialVelocity: V
     ): V {
-        return animation.getVelocityFromNanos(
-            durationNanos - playTimeNanos,
-            targetValue,
-            initialValue,
-            initialVelocity
-        ).reversed()
+        return animation
+            .getVelocityFromNanos(
+                durationNanos - playTimeNanos,
+                targetValue,
+                initialValue,
+                initialVelocity
+            )
+            .reversed()
     }
 
     override fun getDurationNanos(initialValue: V, targetValue: V, initialVelocity: V): Long {
@@ -85,18 +85,15 @@
 }
 
 /**
- * Creates a [FiniteAnimationSpec] that combine and run multiple [specs] based on the start time
- * (in milliseconds) specified as the first half of the pairs.
+ * Creates a [FiniteAnimationSpec] that combine and run multiple [specs] based on the start time (in
+ * milliseconds) specified as the first half of the pairs.
  */
-internal fun <T> combined(
-    specs: List<Pair<Int, FiniteAnimationSpec<T>>>
-): FiniteAnimationSpec<T> {
+internal fun <T> combined(specs: List<Pair<Int, FiniteAnimationSpec<T>>>): FiniteAnimationSpec<T> {
     return CombinedSpec(specs)
 }
 
-private class CombinedSpec<T>(
-    private val specs: List<Pair<Int, FiniteAnimationSpec<T>>>
-) : FiniteAnimationSpec<T> {
+private class CombinedSpec<T>(private val specs: List<Pair<Int, FiniteAnimationSpec<T>>>) :
+    FiniteAnimationSpec<T> {
 
     override fun <V : AnimationVector> vectorize(
         converter: TwoWayConverter<T, V>
@@ -114,9 +111,8 @@
 ) : VectorizedFiniteAnimationSpec<V> {
 
     private fun chooseAnimation(playTimeNanos: Long): Pair<Long, VectorizedFiniteAnimationSpec<V>> {
-        return animations.lastOrNull { (timeNanos, _) ->
-            timeNanos <= playTimeNanos
-        } ?: animations.first()
+        return animations.lastOrNull { (timeNanos, _) -> timeNanos <= playTimeNanos }
+            ?: animations.first()
     }
 
     override fun getValueFromNanos(
diff --git a/compose/animation/animation-lint/src/main/java/androidx/compose/animation/lint/AnimatedContentDetector.kt b/compose/animation/animation-lint/src/main/java/androidx/compose/animation/lint/AnimatedContentDetector.kt
index 0c37391..ee510c1 100644
--- a/compose/animation/animation-lint/src/main/java/androidx/compose/animation/lint/AnimatedContentDetector.kt
+++ b/compose/animation/animation-lint/src/main/java/androidx/compose/animation/lint/AnimatedContentDetector.kt
@@ -47,14 +47,18 @@
 
     override fun visitMethodCall(context: JavaContext, node: UCallExpression, method: PsiMethod) {
         if (method.isInPackageName(Names.Animation.PackageName)) {
-            val lambdaArgument = computeKotlinArgumentMapping(node, method)
-                .orEmpty().filter { (_, param) -> param.name == "content" }
-                .keys.filterIsInstance<ULambdaExpression>().firstOrNull() ?: return
+            val lambdaArgument =
+                computeKotlinArgumentMapping(node, method)
+                    .orEmpty()
+                    .filter { (_, param) -> param.name == "content" }
+                    .keys
+                    .filterIsInstance<ULambdaExpression>()
+                    .firstOrNull() ?: return
 
             lambdaArgument.findUnreferencedParameters().forEach { unreferencedParameter ->
-                val location = unreferencedParameter.parameter
-                    ?.let { context.getLocation(it) }
-                    ?: context.getLocation(lambdaArgument)
+                val location =
+                    unreferencedParameter.parameter?.let { context.getLocation(it) }
+                        ?: context.getLocation(lambdaArgument)
                 val name = unreferencedParameter.name
                 context.report(
                     UnusedContentLambdaTargetStateParameter,
@@ -67,22 +71,25 @@
     }
 
     companion object {
-        val UnusedContentLambdaTargetStateParameter = Issue.create(
-            "UnusedContentLambdaTargetStateParameter",
-            "AnimatedContent calls should use the provided `T` parameter in the content lambda",
-            "`content` lambda in AnimatedContent works as a lookup function that returns the " +
-                "corresponding content based on the parameter (a state of type `T`). It is " +
-                "important for this lambda to return content *specific* to the input parameter, " +
-                "so that the different contents can be properly animated. Not using the input " +
-                "parameter to the content lambda will result in the same content for different " +
-                "input (i.e. target state) and therefore an erroneous transition between the " +
-                "exact same content.`",
-            Category.CORRECTNESS, 3, Severity.ERROR,
-            Implementation(
-                AnimatedContentDetector::class.java,
-                EnumSet.of(Scope.JAVA_FILE, Scope.TEST_SOURCES)
+        val UnusedContentLambdaTargetStateParameter =
+            Issue.create(
+                "UnusedContentLambdaTargetStateParameter",
+                "AnimatedContent calls should use the provided `T` parameter in the content lambda",
+                "`content` lambda in AnimatedContent works as a lookup function that returns the " +
+                    "corresponding content based on the parameter (a state of type `T`). It is " +
+                    "important for this lambda to return content *specific* to the input parameter, " +
+                    "so that the different contents can be properly animated. Not using the input " +
+                    "parameter to the content lambda will result in the same content for different " +
+                    "input (i.e. target state) and therefore an erroneous transition between the " +
+                    "exact same content.`",
+                Category.CORRECTNESS,
+                3,
+                Severity.ERROR,
+                Implementation(
+                    AnimatedContentDetector::class.java,
+                    EnumSet.of(Scope.JAVA_FILE, Scope.TEST_SOURCES)
+                )
             )
-        )
     }
 }
 
diff --git a/compose/animation/animation-lint/src/main/java/androidx/compose/animation/lint/AnimationIssueRegistry.kt b/compose/animation/animation-lint/src/main/java/androidx/compose/animation/lint/AnimationIssueRegistry.kt
index 78f3a74..90942ed 100644
--- a/compose/animation/animation-lint/src/main/java/androidx/compose/animation/lint/AnimationIssueRegistry.kt
+++ b/compose/animation/animation-lint/src/main/java/androidx/compose/animation/lint/AnimationIssueRegistry.kt
@@ -22,21 +22,22 @@
 import com.android.tools.lint.client.api.Vendor
 import com.android.tools.lint.detector.api.CURRENT_API
 
-/**
- * [IssueRegistry] containing animation specific lint issues.
- */
+/** [IssueRegistry] containing animation specific lint issues. */
 class AnimationIssueRegistry : IssueRegistry() {
     // Tests are run with this version. We ensure that with ApiLintVersionsTest
     override val api = 14
     override val minApi = CURRENT_API
     override val issues
-        get() = listOf(
-            CrossfadeDetector.UnusedCrossfadeTargetStateParameter,
-            AnimatedContentDetector.UnusedContentLambdaTargetStateParameter
+        get() =
+            listOf(
+                CrossfadeDetector.UnusedCrossfadeTargetStateParameter,
+                AnimatedContentDetector.UnusedContentLambdaTargetStateParameter
+            )
+
+    override val vendor =
+        Vendor(
+            vendorName = "Jetpack Compose",
+            identifier = "androidx.compose.animation",
+            feedbackUrl = "https://issuetracker.google.com/issues/new?component=612128"
         )
-    override val vendor = Vendor(
-        vendorName = "Jetpack Compose",
-        identifier = "androidx.compose.animation",
-        feedbackUrl = "https://issuetracker.google.com/issues/new?component=612128"
-    )
 }
diff --git a/compose/animation/animation-lint/src/main/java/androidx/compose/animation/lint/CrossfadeDetector.kt b/compose/animation/animation-lint/src/main/java/androidx/compose/animation/lint/CrossfadeDetector.kt
index fbef2b9..129213d 100644
--- a/compose/animation/animation-lint/src/main/java/androidx/compose/animation/lint/CrossfadeDetector.kt
+++ b/compose/animation/animation-lint/src/main/java/androidx/compose/animation/lint/CrossfadeDetector.kt
@@ -38,23 +38,23 @@
 /**
  * [Detector] that checks `Crossfade` usages for correctness.
  *
- * Crossfade provides a value for targetState (`T`) in the `content` lambda. It is always an
- * error to not use this value, as Crossfade works by emitting content with a value corresponding
- * to the `from` and `to` states - if this value is not read, then `Crossfade` will end up
- * animating in and out the same content on top of each other.
+ * Crossfade provides a value for targetState (`T`) in the `content` lambda. It is always an error
+ * to not use this value, as Crossfade works by emitting content with a value corresponding to the
+ * `from` and `to` states - if this value is not read, then `Crossfade` will end up animating in and
+ * out the same content on top of each other.
  */
 class CrossfadeDetector : Detector(), SourceCodeScanner {
     override fun getApplicableMethodNames(): List<String> = listOf(Crossfade.shortName)
 
     override fun visitMethodCall(context: JavaContext, node: UCallExpression, method: PsiMethod) {
         if (method.isInPackageName(Names.Animation.PackageName)) {
-            val lambdaArgument = node.valueArguments.filterIsInstance<ULambdaExpression>()
-                .firstOrNull() ?: return
+            val lambdaArgument =
+                node.valueArguments.filterIsInstance<ULambdaExpression>().firstOrNull() ?: return
 
             lambdaArgument.findUnreferencedParameters().forEach { unreferencedParameter ->
-                val location = unreferencedParameter.parameter
-                    ?.let { context.getLocation(it) }
-                    ?: context.getLocation(lambdaArgument)
+                val location =
+                    unreferencedParameter.parameter?.let { context.getLocation(it) }
+                        ?: context.getLocation(lambdaArgument)
                 val name = unreferencedParameter.name
                 context.report(
                     UnusedCrossfadeTargetStateParameter,
@@ -67,22 +67,25 @@
     }
 
     companion object {
-        val UnusedCrossfadeTargetStateParameter = Issue.create(
-            "UnusedCrossfadeTargetStateParameter",
-            "Crossfade calls should use the provided `T` parameter in the content lambda",
-            "`content` lambda in Crossfade works as a lookup function that returns the " +
-                "corresponding content based on the parameter (a state of type `T`). It is " +
-                "important for this lambda to return content *specific* to the input parameter, " +
-                "so that the different contents can be properly crossfaded. Not using the input " +
-                "parameter to the content lambda will result in the same content for different " +
-                "input (i.e. target state) and therefore an erroneous crossfade between the " +
-                "exact same content.`",
-            Category.CORRECTNESS, 3, Severity.ERROR,
-            Implementation(
-                CrossfadeDetector::class.java,
-                EnumSet.of(Scope.JAVA_FILE, Scope.TEST_SOURCES)
+        val UnusedCrossfadeTargetStateParameter =
+            Issue.create(
+                "UnusedCrossfadeTargetStateParameter",
+                "Crossfade calls should use the provided `T` parameter in the content lambda",
+                "`content` lambda in Crossfade works as a lookup function that returns the " +
+                    "corresponding content based on the parameter (a state of type `T`). It is " +
+                    "important for this lambda to return content *specific* to the input parameter, " +
+                    "so that the different contents can be properly crossfaded. Not using the input " +
+                    "parameter to the content lambda will result in the same content for different " +
+                    "input (i.e. target state) and therefore an erroneous crossfade between the " +
+                    "exact same content.`",
+                Category.CORRECTNESS,
+                3,
+                Severity.ERROR,
+                Implementation(
+                    CrossfadeDetector::class.java,
+                    EnumSet.of(Scope.JAVA_FILE, Scope.TEST_SOURCES)
+                )
             )
-        )
     }
 }
 
diff --git a/compose/animation/animation-lint/src/test/java/androidx/compose/animation/lint/AnimatedContentDetectorTest.kt b/compose/animation/animation-lint/src/test/java/androidx/compose/animation/lint/AnimatedContentDetectorTest.kt
index 6149723..e84a340 100644
--- a/compose/animation/animation-lint/src/test/java/androidx/compose/animation/lint/AnimatedContentDetectorTest.kt
+++ b/compose/animation/animation-lint/src/test/java/androidx/compose/animation/lint/AnimatedContentDetectorTest.kt
@@ -30,9 +30,7 @@
 /* ktlint-disable max-line-length */
 @RunWith(JUnit4::class)
 
-/**
- * Test for [AnimatedContentDetector].
- */
+/** Test for [AnimatedContentDetector]. */
 class AnimatedContentDetectorTest : LintDetectorTest() {
     override fun getDetector(): Detector = AnimatedContentDetector()
 
@@ -40,11 +38,12 @@
         mutableListOf(AnimatedContentDetector.UnusedContentLambdaTargetStateParameter)
 
     // Simplified AnimatedContent.kt stubs
-    private val AnimatedContentStub = bytecodeStub(
-        filename = "AnimatedContent.kt",
-        filepath = "androidx/compose/animation",
-        checksum = 0x36ddd76f,
-        """
+    private val AnimatedContentStub =
+        bytecodeStub(
+            filename = "AnimatedContent.kt",
+            filepath = "androidx/compose/animation",
+            checksum = 0x36ddd76f,
+            """
             package androidx.compose.animation
 
             import androidx.compose.runtime.Composable
@@ -73,13 +72,13 @@
                 content: @Composable AnimatedContentScope.(T) -> Unit
             ) {}
         """,
-"""
+            """
         META-INF/main.kotlin_module:
         H4sIAAAAAAAA/2NgYGBmYGBgBGJOBijg0ueSSsxLKcrPTKnQS87PLcgvTtVL
         zMvMTSzJzM8TEnQEM1NTnPPzSlLzSrxLuHi5mNPy84XYQlKLgVwlBi0GADRx
         8BlYAAAA
         """,
-        """
+            """
         androidx/compose/animation/AnimatedContentKt＄AnimatedContent＄1.class:
         H4sIAAAAAAAA/6VVW28bRRT+Zu34sjG5QZsbBNqa1k7arBPKpXUaakxCF4xB
         OIqE8jReb5Kxd2ei3bVV3vJHeOGBZyokiqiEIh75Uahn1ia3pimmDztz5ty+
@@ -103,7 +102,7 @@
         srq9g4SNOzaWbVgo2VjBqo0PcHcHLMSH+GgHIyE+DvFJiHshFkKMPwc4Eluy
         /wcAAA==
         """,
-        """
+            """
         androidx/compose/animation/AnimatedContentKt＄AnimatedContent＄2.class:
         H4sIAAAAAAAA/6VUW08TQRT+Zru9Um1B5aaiIkILyEJVHmxDJBXCxoqJNE0M
         T9PuAkN3Z01n2+Abf8QXf4HEBxJNDPHRH2U8s1RjUDGGZOecb79zmZlzzu7X
@@ -122,7 +121,7 @@
         0vo+HpF+TJ7jFHV9GzEbN2zctDGBWzZu446NSdzdBlN02XvbiCtMK8woDCnk
         FPLfAe45AxX0BAAA
         """,
-        """
+            """
         androidx/compose/animation/AnimatedContentKt＄AnimatedContent＄3.class:
         H4sIAAAAAAAA/6VVW3PbVBD+juz4opjcoM0NArSmtZM2ctJyae2GGpNQgTEM
         zmSGydOxfJIcWzrKSLKnvOWR38EDz3SYoQydYTI88qOY7pFNmqQhYPqgs3v2
@@ -146,7 +145,7 @@
         u0jYuG1j1YaFko01rNu4g7u7YCHexwe7GAvxYYiPQtwLsRRi8jmnoznY6gcA
         AA==
         """,
-        """
+            """
         androidx/compose/animation/AnimatedContentKt＄AnimatedContent＄4.class:
         H4sIAAAAAAAA/6VUW08TQRT+Zru9Um1B5eYdEVpAFiryYBsiqRA2VkykaWJ4
         mnYXGLo7Y7rbBt949Hf4CyQ+kGhiiI/+KOOZpRqDqDEkO+d8+53LzJxzdr9+
@@ -165,7 +164,7 @@
         jlPU9W3EbNywcdPGLdy2cQd3bUzg3jZYQJe9v414gKkA0wGGAuQC5L8D/xWd
         4d8EAAA=
         """,
-        """
+            """
         androidx/compose/animation/AnimatedContentKt.class:
         H4sIAAAAAAAA/+1WS1MbRxD+ZiWklRAgVhYgOTEOlmPMwxKCJA4ixIRAUAyy
         Y8nkQR41SAtekHapnRWFLy5yS+Uf5JBL/kFycuWQonzMj0qlZ7W8JJ5Fxckh
@@ -197,7 +196,7 @@
         fgUxgTaBTwUeCqQFNIFFgSWBgsAjgWsCjwU+cwN6BJ4IFAVUgVGBxN8a7RIf
         yw8AAA==
         """,
-        """
+            """
         androidx/compose/animation/AnimatedContentScope.class:
         H4sIAAAAAAAA/5VRu04CQRQ9d5BFV1TEF/iq1cIVY6cxURMTEtREDA3VsDvR
         AXbGsIOx5Fv8AysTC0Ms/Sjj3ZXKzubkPO7kPubr+/0DwBG2CIE00cDq6DkI
@@ -209,7 +208,7 @@
         AWbgZ/lGhmvYzH6SMMtZsY1cHXN1zNexgBJTLNZRxlIblGAZK5wn8BOsJvB+
         APKoOCQGAgAA
         """,
-        """
+            """
         androidx/compose/animation/AnimatedContentTransitionScope.class:
         H4sIAAAAAAAA/51Ru04bQRQ9d4zXsDFgHB4mCakTChasNAiEBEhIlhyQAnJD
         Nd4dwdjeGbQzRi79LfxBKqQUkZWSj0LcWahS0hydxx3dxzw9//kL4Ae2CPvS
@@ -221,7 +220,7 @@
         NxOBTcaoNGv4xFh/LcAC4jL/XOIGvpS/S/jAWf0alQ4WO1jqYBkNpljpoImP
         1yCHVaxx7hA7rDtEL0Tug+oaAgAA
         """,
-        """
+            """
         androidx/compose/animation/ContentTransform.class:
         H4sIAAAAAAAA/5VRy04bMRQ910kmYUibBy0N0HbNQzCA2BUhBaRKkQJIgLJh
         5WQMOMnYaOwglvkW/oAVEgsUsexHVb0z5Ae6OToPW/f4+s/f1zcAB/hB2JIm
@@ -233,7 +232,7 @@
         CmOQmxWsMlY/DmABYZ6v5fgN3/MfJCxyVr1GoYNPHXzuoIY6UzQ6aGLpGuTw
         BV85dwgdlh2Cf9GA1Gv+AQAA
         """,
-        """
+            """
         androidx/compose/animation/Transition.class:
         H4sIAAAAAAAA/41SXU8TQRQ9s7vdtmuhSwEFxC8U2RZ1gfhgkGCQhKRJ1YQ2
         jQlPQ7vBgXbW7EwJj33yh/gLNNGY+GAaHv1RxjvLBomQ6Mu95545c+beu/vz
@@ -250,13 +249,14 @@
         wa5jro6bdczjFkHcruMO7u6BKdzDwh79dZhQuK/wQKGkkFeoKEwqTCuM/QaR
         /XoCyAMAAA==
         """
-    )
+        )
 
     @Test
     fun unreferencedParameters() {
-        lint().files(
-            kotlin(
-                """
+        lint()
+            .files(
+                kotlin(
+                    """
                 package foo
 
                 import androidx.compose.animation.*
@@ -280,10 +280,10 @@
                     Transition(foo).AnimatedContent(content = { _ -> if (foo) { /**/ } else { /**/ } })
                 }
             """
-            ),
-            AnimatedContentStub,
-            Stubs.Composable
-        )
+                ),
+                AnimatedContentStub,
+                Stubs.Composable
+            )
             .run()
             .expect(
                 """
@@ -330,9 +330,10 @@
 
     @Test
     fun unreferencedParameter_shadowedNames() {
-        lint().files(
-            kotlin(
-                """
+        lint()
+            .files(
+                kotlin(
+                    """
                 package foo
 
                 import androidx.compose.animation.*
@@ -378,10 +379,10 @@
                     }
                 }
             """
-            ),
-            AnimatedContentStub,
-            Stubs.Composable
-        )
+                ),
+                AnimatedContentStub,
+                Stubs.Composable
+            )
             .run()
             .expect(
                 """
@@ -404,9 +405,10 @@
 
     @Test
     fun noErrors() {
-        lint().files(
-            kotlin(
-                """
+        lint()
+            .files(
+                kotlin(
+                    """
             package foo
 
             import androidx.compose.animation.*
@@ -485,10 +487,10 @@
                 )
             }
         """
-            ),
-            AnimatedContentStub,
-            Stubs.Composable
-        )
+                ),
+                AnimatedContentStub,
+                Stubs.Composable
+            )
             .run()
             .expectClean()
     }
diff --git a/compose/animation/animation-lint/src/test/java/androidx/compose/animation/lint/CrossfadeDetectorTest.kt b/compose/animation/animation-lint/src/test/java/androidx/compose/animation/lint/CrossfadeDetectorTest.kt
index 8454999..acb3ff3 100644
--- a/compose/animation/animation-lint/src/test/java/androidx/compose/animation/lint/CrossfadeDetectorTest.kt
+++ b/compose/animation/animation-lint/src/test/java/androidx/compose/animation/lint/CrossfadeDetectorTest.kt
@@ -30,9 +30,7 @@
 /* ktlint-disable max-line-length */
 @RunWith(JUnit4::class)
 
-/**
- * Test for [CrossfadeDetector].
- */
+/** Test for [CrossfadeDetector]. */
 class CrossfadeDetectorTest : LintDetectorTest() {
     override fun getDetector(): Detector = CrossfadeDetector()
 
@@ -40,11 +38,12 @@
         mutableListOf(CrossfadeDetector.UnusedCrossfadeTargetStateParameter)
 
     // Simplified Transition.kt stubs
-    private val CrossfadeStub = bytecodeStub(
-        filename = "Transition.kt",
-        filepath = "androidx/compose/animation",
-        checksum = 0x15a87088,
-        """
+    private val CrossfadeStub =
+        bytecodeStub(
+            filename = "Transition.kt",
+            filepath = "androidx/compose/animation",
+            checksum = 0x15a87088,
+            """
             package androidx.compose.animation
 
             import androidx.compose.runtime.Composable
@@ -55,13 +54,13 @@
                 content: @Composable (T) -> Unit
             ) {}
         """,
-"""
+            """
         META-INF/main.kotlin_module:
         H4sIAAAAAAAA/2NgYGBmYGBgBGJOBijg0uKSSsxLKcrPTKnQS87PLcgvTtVL
         zMvMTSzJzM8T4gkpSswrzgSxvUu4eLmY0/LzhdhCUotLvEuUGLQYAEjDUx5T
         AAAA
         """,
-        """
+            """
         androidx/compose/animation/TransitionKt.class:
         H4sIAAAAAAAA/4VSW08TQRT+Zlq67QKylHvxglwERNxC8MUSE9OE0FjB2MoL
         T9PtUqeXWbM7bXjsb/Ef+GZ8MI2P/ijjmW0VBBMe5syZ73znmzPnzM9f374D
@@ -79,13 +78,14 @@
         nyNRwkIJiyWqJlfCMu6X8AAPz8EiPMLKOdIRxiI8jrAaIRvBjrAWGTD1G1Xc
         nh8uBAAA
         """
-    )
+        )
 
     @Test
     fun unreferencedParameters() {
-        lint().files(
-            kotlin(
-                """
+        lint()
+            .files(
+                kotlin(
+                    """
                 package foo
 
                 import androidx.compose.animation.*
@@ -103,10 +103,10 @@
                     Crossfade(foo, content = { _ -> if (foo) { /**/ } else { /**/ } })
                 }
             """
-            ),
-            CrossfadeStub,
-            Stubs.Composable
-        )
+                ),
+                CrossfadeStub,
+                Stubs.Composable
+            )
             .run()
             .expect(
                 """
@@ -135,9 +135,10 @@
 
     @Test
     fun unreferencedParameter_shadowedNames() {
-        lint().files(
-            kotlin(
-                """
+        lint()
+            .files(
+                kotlin(
+                    """
                 package foo
 
                 import androidx.compose.animation.*
@@ -165,10 +166,10 @@
                     }
                 }
             """
-            ),
-            CrossfadeStub,
-            Stubs.Composable
-        )
+                ),
+                CrossfadeStub,
+                Stubs.Composable
+            )
             .run()
             .expect(
                 """
@@ -185,9 +186,10 @@
 
     @Test
     fun noErrors() {
-        lint().files(
-            kotlin(
-                """
+        lint()
+            .files(
+                kotlin(
+                    """
             package foo
 
             import androidx.compose.animation.*
@@ -240,10 +242,10 @@
                 }
             }
         """
-            ),
-            CrossfadeStub,
-            Stubs.Composable
-        )
+                ),
+                CrossfadeStub,
+                Stubs.Composable
+            )
             .run()
             .expectClean()
     }
diff --git a/compose/animation/animation-tooling-internal/src/main/java/androidx/compose/animation/tooling/ComposeAnimation.kt b/compose/animation/animation-tooling-internal/src/main/java/androidx/compose/animation/tooling/ComposeAnimation.kt
index 59b8371..d57704f 100644
--- a/compose/animation/animation-tooling-internal/src/main/java/androidx/compose/animation/tooling/ComposeAnimation.kt
+++ b/compose/animation/animation-tooling-internal/src/main/java/androidx/compose/animation/tooling/ComposeAnimation.kt
@@ -20,18 +20,20 @@
 
 /**
  * Type of the animation. Different types might have different properties, for example a
- * `TransitionAnimation` (represented by [TRANSITION_ANIMATION]) has a set of states associated
- * with it.
+ * `TransitionAnimation` (represented by [TRANSITION_ANIMATION]) has a set of states associated with
+ * it.
  */
 public enum class ComposeAnimationType {
-    TRANSITION_ANIMATION, ANIMATED_VALUE, ANIMATED_VISIBILITY,
+    TRANSITION_ANIMATION,
+    ANIMATED_VALUE,
+    ANIMATED_VISIBILITY,
     /** `Animatable` compose animation. */
     ANIMATABLE,
     /** `animateContentSize` compose animation. */
     ANIMATE_CONTENT_SIZE,
     /**
-     * `animateXAsState` animations, for example `animateDpAsState`, `animateIntAsState`.
-     * Includes `animateValueAsState`.
+     * `animateXAsState` animations, for example `animateDpAsState`, `animateIntAsState`. Includes
+     * `animateValueAsState`.
      */
     ANIMATE_X_AS_STATE,
     /** `AnimatedContent` animation. */
@@ -58,14 +60,12 @@
 public interface ComposeAnimation {
 
     /**
-     * The animation type. Ideally, the type should be checked before accessing properties
-     * specific to a certain type, e.g. [states].
+     * The animation type. Ideally, the type should be checked before accessing properties specific
+     * to a certain type, e.g. [states].
      */
     public val type: ComposeAnimationType
 
-    /**
-     * The actual animation object.
-     */
+    /** The actual animation object. */
     public val animationObject: Any
 
     /**
@@ -81,8 +81,8 @@
             )
 
     /**
-     * A label which can be used to represent the animation as text in Android Studio.
-     * Null if the label is not set or if it can't be inferred from the animation states.
+     * A label which can be used to represent the animation as text in Android Studio. Null if the
+     * label is not set or if it can't be inferred from the animation states.
      */
     public val label: String?
         get() = null
diff --git a/compose/animation/animation-tooling-internal/src/main/java/androidx/compose/animation/tooling/TransitionInfo.kt b/compose/animation/animation-tooling-internal/src/main/java/androidx/compose/animation/tooling/TransitionInfo.kt
index ce658de..5dc5bfa 100644
--- a/compose/animation/animation-tooling-internal/src/main/java/androidx/compose/animation/tooling/TransitionInfo.kt
+++ b/compose/animation/animation-tooling-internal/src/main/java/androidx/compose/animation/tooling/TransitionInfo.kt
@@ -18,11 +18,13 @@
 
 /**
  * Represents a transition of the Compose animation.
+ *
  * @property label The label of the animation.
  * @property specType The java class name of the spec.
  * @property startTimeMillis The animation delay if it has one.
  * @property endTimeMillis The animation duration including the delay.
- * @property values Animation values at given times from [startTimeMillis] to [endTimeMillis] with a step.
+ * @property values Animation values at given times from [startTimeMillis] to [endTimeMillis] with a
+ *   step.
  */
 public class TransitionInfo(
     public val label: String,
diff --git a/compose/animation/animation/integration-tests/animation-demos/src/main/java/androidx/compose/animation/demos/AnimationDemos.kt b/compose/animation/animation/integration-tests/animation-demos/src/main/java/androidx/compose/animation/demos/AnimationDemos.kt
index 6885430..c8b339c 100644
--- a/compose/animation/animation/integration-tests/animation-demos/src/main/java/androidx/compose/animation/demos/AnimationDemos.kt
+++ b/compose/animation/animation/integration-tests/animation-demos/src/main/java/androidx/compose/animation/demos/AnimationDemos.kt
@@ -78,142 +78,132 @@
 import androidx.compose.integration.demos.common.ComposableDemo
 import androidx.compose.integration.demos.common.DemoCategory
 
-val AnimationDemos = DemoCategory(
-    "Animation",
-    listOf(
-        DemoCategory(
-            "State Transition Demos",
-            listOf(
-                ComposableDemo("Double tap to like") { DoubleTapToLikeDemo() },
-                ComposableDemo("Gesture based animation") { GestureBasedAnimationDemo() },
-                ComposableDemo("Seeking animation") { SeekingAnimationSample() },
-                ComposableDemo("Infinite transition") { InfiniteTransitionDemo() },
-                ComposableDemo("Multi-dimensional prop") { MultiDimensionalAnimationDemo() },
-                ComposableDemo("Repeating rotation") { RepeatedRotationDemo() },
-            )
-        ),
-        DemoCategory(
-            "Layout Animation Demos",
-            listOf(
-                ComposableDemo("Animate Content Size") { AnimateContentSizeDemo() },
-                ComposableDemo("Animate Increment/Decrement") { AnimateIncrementDecrementDemo() },
-                ComposableDemo("Animate Placement") { AnimatedPlacementDemo() },
-                ComposableDemo("Animate Visibility Demo") { AnimatedVisibilityDemo() },
-                ComposableDemo("Animate Visibility Lazy Column Demo") {
-                    AnimatedVisibilityLazyColumnDemo()
-                },
-                ComposableDemo("Cross Fade") { CrossfadeDemo() },
-                ComposableDemo("Modifier.animateEnterExit Demo") { AnimateEnterExitDemo() },
-                ComposableDemo("Nested Menu") { NestedMenuDemo() },
-                ComposableDemo("Save/Restore in AnimatedContent") {
-                    AnimatedContentWithContentKeyDemo()
-                },
-                ComposableDemo("Scaled Enter/Exit") { ScaleEnterExitDemo() },
-                ComposableDemo("Shrine Cart") { ShrineCartDemo() },
-                ComposableDemo("Screen Transition") { ScreenTransitionDemo() },
-            )
-        ),
-        DemoCategory(
-            "\uD83E\uDD7C\uD83E\uDDD1\u200D\uD83D\uDD2C Lookahead Animation Demos",
-            listOf(
-                ComposableDemo("AnimateBoundsModifier") {
-                    AnimateBoundsModifierDemo()
-                },
-                ComposableDemo("Crane Nested Shared Element") { CraneDemo() },
-                ComposableDemo("Screen Size Change Demo") { ScreenSizeChangeDemo() },
-                ComposableDemo("LookaheadWithAnimatedContentSize") {
-                    LookaheadWithAnimatedContentSize()
-                },
-                ComposableDemo("Lookahead Samples Demo") {
-                    LookaheadSamplesDemo()
-                },
-                ComposableDemo("Lookahead With Alignment Lines") {
-                    LookaheadLayoutWithAlignmentLinesDemo()
-                },
-                ComposableDemo("Lookahead With BoxWithConstraints") {
-                    LookaheadWithBoxWithConstraints()
-                },
-                ComposableDemo("Lookahead With Subcompose") { LookaheadWithSubcompose() },
-                ComposableDemo("Lookahead With LazyColumn") { LookaheadWithLazyColumn() },
-                ComposableDemo("Lookahead With Flow Row") { LookaheadWithFlowRowDemo() },
-                ComposableDemo("Lookahead With Intrinsics") {
-                    LookaheadWithIntrinsicsDemo()
-                },
-                ComposableDemo("Lookahead With Movable Content") {
-                    LookaheadWithMovableContentDemo()
-                },
-                ComposableDemo("Lookahead With Disappearing Movable Content") {
-                    LookaheadWithDisappearingMovableContentDemo()
-                },
-                ComposableDemo("Lookahead With Tab Row") {
-                    LookaheadWithTabRowDemo()
-                },
-                ComposableDemo("Lookahead With Scaffold") {
-                    LookaheadWithScaffold()
-                },
-            )
-        ),
-        DemoCategory(
-            "Suspend Animation Demos",
-            listOf(
-                ComposableDemo("Animated scrolling") { FancyScrollingDemo() },
-                ComposableDemo("animateColorAsState") { SingleValueAnimationDemo() },
-                ComposableDemo("Double Tap To Like") { SuspendDoubleTapToLikeDemo() },
-                ComposableDemo("Follow the tap") { SuspendAnimationDemo() },
-                ComposableDemo("Infinitely Animating") { InfiniteAnimationDemo() },
-                ComposableDemo("Loading Animation Demo") { LoadingAnimationDemo() },
-                ComposableDemo("Spring back scrolling") { SpringBackScrollingDemo() },
-                ComposableDemo("Swipe to dismiss") { SwipeToDismissDemo() },
-                ComposableDemo("Offset w/ Spline keyFrame") { OffsetKeyframeWithSplineDemo() },
-                ComposableDemo("Spline Keyframes Playground") {
-                    OffsetKeyframeSplinePlaygroundDemo()
-                },
-                ComposableDemo("Arc Offset Demo") { ArcOffsetDemo() },
-                ComposableDemo("Periodic Spline Demo") { PeriodicMonoSplineDemo() },
-            )
-        ),
-        DemoCategory(
-            "Graphics Animation Demos",
-            listOf(
-                ComposableDemo("Animated Vector Graphics") { AnimatedVectorGraphicsDemo() },
-            )
-        ),
-
-        DemoCategory(
-            "⛔ DO NOT ENTER ⛔",
-            listOf(
-                ComposableDemo("AnimatedContent alignment/slideInto") {
-                    SlideInContentVariedSizes()
-                },
-                ComposableDemo("AnimatedContent with interruptions") {
-                    AnimatedContentWithInterruptions()
-                },
-                ComposableDemo("Enter/ExitTransition Combo") { EnterExitCombination() },
-                ComposableDemo("AnimatedVisibility with Content Size Change") {
-                    AnimatedVisibilityContentSizeChange()
-                },
-            )
-        ),
-
-        DemoCategory(
-            "Visual Aid \uD83D\uDC40 \uD83D\uDC40",
-            listOf(
-                ComposableDemo("Column Arrangements Demo") { ColumnConfigurationDemo() },
-                ComposableDemo("Row Arrangements Demo (Landscape)") { RowConfigurationDemo() },
-                ComposableDemo("Easing Functions Demo") { EasingInfoDemo() },
-                ComposableDemo("Path Easing Function Demo") { PathEasingSample() },
-            )
-        ),
-
-        DemoCategory(
-            "\uD83C\uDF89 Fun Demos",
-            listOf(
-                ComposableDemo("Animated clock") { AnimatedClockDemo() },
-                ComposableDemo("Animated dots") { AnimatedDotsDemo() },
-                ComposableDemo("Chat screen") { ChatScreen() },
-                ComposableDemo("Game of fling") { FlingGameDemo() },
-                ComposableDemo("Spring chain") { SpringChainDemo() },
+val AnimationDemos =
+    DemoCategory(
+        "Animation",
+        listOf(
+            DemoCategory(
+                "State Transition Demos",
+                listOf(
+                    ComposableDemo("Double tap to like") { DoubleTapToLikeDemo() },
+                    ComposableDemo("Gesture based animation") { GestureBasedAnimationDemo() },
+                    ComposableDemo("Seeking animation") { SeekingAnimationSample() },
+                    ComposableDemo("Infinite transition") { InfiniteTransitionDemo() },
+                    ComposableDemo("Multi-dimensional prop") { MultiDimensionalAnimationDemo() },
+                    ComposableDemo("Repeating rotation") { RepeatedRotationDemo() },
+                )
+            ),
+            DemoCategory(
+                "Layout Animation Demos",
+                listOf(
+                    ComposableDemo("Animate Content Size") { AnimateContentSizeDemo() },
+                    ComposableDemo("Animate Increment/Decrement") {
+                        AnimateIncrementDecrementDemo()
+                    },
+                    ComposableDemo("Animate Placement") { AnimatedPlacementDemo() },
+                    ComposableDemo("Animate Visibility Demo") { AnimatedVisibilityDemo() },
+                    ComposableDemo("Animate Visibility Lazy Column Demo") {
+                        AnimatedVisibilityLazyColumnDemo()
+                    },
+                    ComposableDemo("Cross Fade") { CrossfadeDemo() },
+                    ComposableDemo("Modifier.animateEnterExit Demo") { AnimateEnterExitDemo() },
+                    ComposableDemo("Nested Menu") { NestedMenuDemo() },
+                    ComposableDemo("Save/Restore in AnimatedContent") {
+                        AnimatedContentWithContentKeyDemo()
+                    },
+                    ComposableDemo("Scaled Enter/Exit") { ScaleEnterExitDemo() },
+                    ComposableDemo("Shrine Cart") { ShrineCartDemo() },
+                    ComposableDemo("Screen Transition") { ScreenTransitionDemo() },
+                )
+            ),
+            DemoCategory(
+                "\uD83E\uDD7C\uD83E\uDDD1\u200D\uD83D\uDD2C Lookahead Animation Demos",
+                listOf(
+                    ComposableDemo("AnimateBoundsModifier") { AnimateBoundsModifierDemo() },
+                    ComposableDemo("Crane Nested Shared Element") { CraneDemo() },
+                    ComposableDemo("Screen Size Change Demo") { ScreenSizeChangeDemo() },
+                    ComposableDemo("LookaheadWithAnimatedContentSize") {
+                        LookaheadWithAnimatedContentSize()
+                    },
+                    ComposableDemo("Lookahead Samples Demo") { LookaheadSamplesDemo() },
+                    ComposableDemo("Lookahead With Alignment Lines") {
+                        LookaheadLayoutWithAlignmentLinesDemo()
+                    },
+                    ComposableDemo("Lookahead With BoxWithConstraints") {
+                        LookaheadWithBoxWithConstraints()
+                    },
+                    ComposableDemo("Lookahead With Subcompose") { LookaheadWithSubcompose() },
+                    ComposableDemo("Lookahead With LazyColumn") { LookaheadWithLazyColumn() },
+                    ComposableDemo("Lookahead With Flow Row") { LookaheadWithFlowRowDemo() },
+                    ComposableDemo("Lookahead With Intrinsics") { LookaheadWithIntrinsicsDemo() },
+                    ComposableDemo("Lookahead With Movable Content") {
+                        LookaheadWithMovableContentDemo()
+                    },
+                    ComposableDemo("Lookahead With Disappearing Movable Content") {
+                        LookaheadWithDisappearingMovableContentDemo()
+                    },
+                    ComposableDemo("Lookahead With Tab Row") { LookaheadWithTabRowDemo() },
+                    ComposableDemo("Lookahead With Scaffold") { LookaheadWithScaffold() },
+                )
+            ),
+            DemoCategory(
+                "Suspend Animation Demos",
+                listOf(
+                    ComposableDemo("Animated scrolling") { FancyScrollingDemo() },
+                    ComposableDemo("animateColorAsState") { SingleValueAnimationDemo() },
+                    ComposableDemo("Double Tap To Like") { SuspendDoubleTapToLikeDemo() },
+                    ComposableDemo("Follow the tap") { SuspendAnimationDemo() },
+                    ComposableDemo("Infinitely Animating") { InfiniteAnimationDemo() },
+                    ComposableDemo("Loading Animation Demo") { LoadingAnimationDemo() },
+                    ComposableDemo("Spring back scrolling") { SpringBackScrollingDemo() },
+                    ComposableDemo("Swipe to dismiss") { SwipeToDismissDemo() },
+                    ComposableDemo("Offset w/ Spline keyFrame") { OffsetKeyframeWithSplineDemo() },
+                    ComposableDemo("Spline Keyframes Playground") {
+                        OffsetKeyframeSplinePlaygroundDemo()
+                    },
+                    ComposableDemo("Arc Offset Demo") { ArcOffsetDemo() },
+                    ComposableDemo("Periodic Spline Demo") { PeriodicMonoSplineDemo() },
+                )
+            ),
+            DemoCategory(
+                "Graphics Animation Demos",
+                listOf(
+                    ComposableDemo("Animated Vector Graphics") { AnimatedVectorGraphicsDemo() },
+                )
+            ),
+            DemoCategory(
+                "⛔ DO NOT ENTER ⛔",
+                listOf(
+                    ComposableDemo("AnimatedContent alignment/slideInto") {
+                        SlideInContentVariedSizes()
+                    },
+                    ComposableDemo("AnimatedContent with interruptions") {
+                        AnimatedContentWithInterruptions()
+                    },
+                    ComposableDemo("Enter/ExitTransition Combo") { EnterExitCombination() },
+                    ComposableDemo("AnimatedVisibility with Content Size Change") {
+                        AnimatedVisibilityContentSizeChange()
+                    },
+                )
+            ),
+            DemoCategory(
+                "Visual Aid \uD83D\uDC40 \uD83D\uDC40",
+                listOf(
+                    ComposableDemo("Column Arrangements Demo") { ColumnConfigurationDemo() },
+                    ComposableDemo("Row Arrangements Demo (Landscape)") { RowConfigurationDemo() },
+                    ComposableDemo("Easing Functions Demo") { EasingInfoDemo() },
+                    ComposableDemo("Path Easing Function Demo") { PathEasingSample() },
+                )
+            ),
+            DemoCategory(
+                "\uD83C\uDF89 Fun Demos",
+                listOf(
+                    ComposableDemo("Animated clock") { AnimatedClockDemo() },
+                    ComposableDemo("Animated dots") { AnimatedDotsDemo() },
+                    ComposableDemo("Chat screen") { ChatScreen() },
+                    ComposableDemo("Game of fling") { FlingGameDemo() },
+                    ComposableDemo("Spring chain") { SpringChainDemo() },
+                )
             )
         )
     )
-)
diff --git a/compose/animation/animation/integration-tests/animation-demos/src/main/java/androidx/compose/animation/demos/fancy/AnimatedClockDemo.kt b/compose/animation/animation/integration-tests/animation-demos/src/main/java/androidx/compose/animation/demos/fancy/AnimatedClockDemo.kt
index 7bc053f..63d0bad 100644
--- a/compose/animation/animation/integration-tests/animation-demos/src/main/java/androidx/compose/animation/demos/fancy/AnimatedClockDemo.kt
+++ b/compose/animation/animation/integration-tests/animation-demos/src/main/java/androidx/compose/animation/demos/fancy/AnimatedClockDemo.kt
@@ -107,45 +107,49 @@
 
 @Composable
 private fun NumberColumn(maxDigit: Int, digit: Int) {
-    val offsetY: Dp = animateDpAsState(
-        targetValue = ((9 - digit) * digitHeight).dp,
-        animationSpec = tween(moveDuration),
-    ).value
+    val offsetY: Dp =
+        animateDpAsState(
+                targetValue = ((9 - digit) * digitHeight).dp,
+                animationSpec = tween(moveDuration),
+            )
+            .value
     var circleOffset by remember { mutableFloatStateOf(0f) }
     LaunchedEffect(digit) {
         if (digit == 0) return@LaunchedEffect // Don't animate for 0 as direction is reversed
-        animate(
-            initialValue = 0f,
-            targetValue = -1f,
-            animationSpec = tween(moveDuration)
-        ) { animationValue, _ -> circleOffset = animationValue }
+        animate(initialValue = 0f, targetValue = -1f, animationSpec = tween(moveDuration)) {
+            animationValue,
+            _ ->
+            circleOffset = animationValue
+        }
         animate(
             initialValue = -1f,
             targetValue = 0f,
             animationSpec = spring(dampingRatio = 0.6f)
-        ) { animationValue, _ -> circleOffset = animationValue }
+        ) { animationValue, _ ->
+            circleOffset = animationValue
+        }
     }
     var circleStretch by remember { mutableFloatStateOf(1f) }
     LaunchedEffect(digit) {
         if (digit == 0) return@LaunchedEffect // Don't animate for 0 as direction is reversed
-        animate(
-            initialValue = 1f,
-            targetValue = 2f,
-            animationSpec = tween(moveDuration)
-        ) { animationValue, _ -> circleStretch = animationValue }
-        animate(
-            initialValue = 2f,
-            targetValue = 1f,
-            animationSpec = spring(dampingRatio = 0.6f)
-        ) { animationValue, _ -> circleStretch = animationValue }
+        animate(initialValue = 1f, targetValue = 2f, animationSpec = tween(moveDuration)) {
+            animationValue,
+            _ ->
+            circleStretch = animationValue
+        }
+        animate(initialValue = 2f, targetValue = 1f, animationSpec = spring(dampingRatio = 0.6f)) {
+            animationValue,
+            _ ->
+            circleStretch = animationValue
+        }
     }
     Box(modifier = Modifier.padding(4.dp)) {
         // Draw an elevation shadow for the rounded column
         Surface(
             shape = RoundedCornerShape((digitHeight / 2).dp),
-            modifier = Modifier
-                .offset(y = offsetY)
-                .size(digitHeight.dp, ((maxDigit + 1) * digitHeight).dp),
+            modifier =
+                Modifier.offset(y = offsetY)
+                    .size(digitHeight.dp, ((maxDigit + 1) * digitHeight).dp),
             elevation = 12.dp
         ) {}
         // Draw circle that follows focused digit
@@ -154,10 +158,8 @@
                 color = Color(0xffd2e7d6),
                 size = Size(24.dp.toPx(), (digitHeight * circleStretch).dp.toPx()),
                 topLeft = Offset(0f, ((9f + circleOffset) * digitHeight).dp.toPx()),
-                cornerRadius = CornerRadius(
-                    (digitHeight / 2).dp.toPx(),
-                    (digitHeight / 2).dp.toPx()
-                )
+                cornerRadius =
+                    CornerRadius((digitHeight / 2).dp.toPx(), (digitHeight / 2).dp.toPx())
             )
         }
         // Draw all the digits up to count
diff --git a/compose/animation/animation/integration-tests/animation-demos/src/main/java/androidx/compose/animation/demos/fancy/AnimatedDotsDemo.kt b/compose/animation/animation/integration-tests/animation-demos/src/main/java/androidx/compose/animation/demos/fancy/AnimatedDotsDemo.kt
index 80cd52c..26a0579 100644
--- a/compose/animation/animation/integration-tests/animation-demos/src/main/java/androidx/compose/animation/demos/fancy/AnimatedDotsDemo.kt
+++ b/compose/animation/animation/integration-tests/animation-demos/src/main/java/androidx/compose/animation/demos/fancy/AnimatedDotsDemo.kt
@@ -39,14 +39,13 @@
 @Composable
 fun AnimatedDotsDemo() {
     val infiniteTransition = rememberInfiniteTransition()
-    val position by infiniteTransition.animateFloat(
-        initialValue = 1f,
-        targetValue = totalDotCount.toFloat(),
-        animationSpec = infiniteRepeatable(
-            animation = tween(2000),
-            repeatMode = RepeatMode.Reverse
+    val position by
+        infiniteTransition.animateFloat(
+            initialValue = 1f,
+            targetValue = totalDotCount.toFloat(),
+            animationSpec =
+                infiniteRepeatable(animation = tween(2000), repeatMode = RepeatMode.Reverse)
         )
-    )
     Dots(position)
 }
 
@@ -66,10 +65,11 @@
                 val nextDotSize = getDotSizeForPosition(position, nextDotPosition)
                 // Pick a direction to draw bridge from the smaller dot to the larger dot
                 val shouldFlip = nextDotSize > dotSize
-                val nextPositionDelta = -min(
-                    1f,
-                    abs(position - if (shouldFlip) nextDotPosition else currentDotPosition)
-                )
+                val nextPositionDelta =
+                    -min(
+                        1f,
+                        abs(position - if (shouldFlip) nextDotPosition else currentDotPosition)
+                    )
                 // Calculate the top-most and the bottom-most coordinates of current dot
                 val leftX = (currentDotPosition * dotSpacing).dp.toPx()
                 val leftYTop = (centerY - dotSize).dp.toPx()
@@ -81,23 +81,41 @@
                 // Calculate the middle Y coordinate between two dots
                 val midX = ((currentDotPosition + 0.5) * dotSpacing).dp.toPx()
 
-                val path = if (shouldFlip) {
-                    // Calculate control point Y coordinates a bit inside the current dot
-                    val bezierYTop = (centerY - dotSize - 5f * nextPositionDelta).dp.toPx()
-                    val bezierYBottom = (centerY + dotSize + 5f * nextPositionDelta).dp.toPx()
-                    getBridgePath(
-                        rightX, rightYTop, rightYBottom, leftX, leftYTop, leftYBottom,
-                        midX, bezierYTop, bezierYBottom, centerY.dp.toPx()
-                    )
-                } else {
-                    // Calculate control point Y coordinates a bit inside the next dot
-                    val bezierYTop = (centerY - nextDotSize - 5f * nextPositionDelta).dp.toPx()
-                    val bezierYBottom = (centerY + nextDotSize + 5f * nextPositionDelta).dp.toPx()
-                    getBridgePath(
-                        leftX, leftYTop, leftYBottom, rightX, rightYTop, rightYBottom,
-                        midX, bezierYTop, bezierYBottom, centerY.dp.toPx()
-                    )
-                }
+                val path =
+                    if (shouldFlip) {
+                        // Calculate control point Y coordinates a bit inside the current dot
+                        val bezierYTop = (centerY - dotSize - 5f * nextPositionDelta).dp.toPx()
+                        val bezierYBottom = (centerY + dotSize + 5f * nextPositionDelta).dp.toPx()
+                        getBridgePath(
+                            rightX,
+                            rightYTop,
+                            rightYBottom,
+                            leftX,
+                            leftYTop,
+                            leftYBottom,
+                            midX,
+                            bezierYTop,
+                            bezierYBottom,
+                            centerY.dp.toPx()
+                        )
+                    } else {
+                        // Calculate control point Y coordinates a bit inside the next dot
+                        val bezierYTop = (centerY - nextDotSize - 5f * nextPositionDelta).dp.toPx()
+                        val bezierYBottom =
+                            (centerY + nextDotSize + 5f * nextPositionDelta).dp.toPx()
+                        getBridgePath(
+                            leftX,
+                            leftYTop,
+                            leftYBottom,
+                            rightX,
+                            rightYTop,
+                            rightYBottom,
+                            midX,
+                            bezierYTop,
+                            bezierYBottom,
+                            centerY.dp.toPx()
+                        )
+                    }
                 drawPath(path, Color(0xff8eb4e6))
             }
             // Draw the current dot
@@ -113,10 +131,9 @@
 /**
  * Returns a path for a bridge between two dots drawn using two quadratic beziers.
  *
- * First bezier is drawn between (startX, startYTop) and (endX, endYTop) coordinates using
- * (bezierX, bezierYTop) as control point.
- * Second bezier is drawn between (startX, startYBottom) and (endX, endYBottom) coordinates using
- * (bezierX, bezierYBottom) as control point.
+ * First bezier is drawn between (startX, startYTop) and (endX, endYTop) coordinates using (bezierX,
+ * bezierYTop) as control point. Second bezier is drawn between (startX, startYBottom) and (endX,
+ * endYBottom) coordinates using (bezierX, bezierYBottom) as control point.
  *
  * Then additional lines are drawn to make this a filled path.
  */
diff --git a/compose/animation/animation/integration-tests/animation-demos/src/main/java/androidx/compose/animation/demos/fancy/ChatScreenDemo.kt b/compose/animation/animation/integration-tests/animation-demos/src/main/java/androidx/compose/animation/demos/fancy/ChatScreenDemo.kt
index 8fe01ca..c17fa55 100644
--- a/compose/animation/animation/integration-tests/animation-demos/src/main/java/androidx/compose/animation/demos/fancy/ChatScreenDemo.kt
+++ b/compose/animation/animation/integration-tests/animation-demos/src/main/java/androidx/compose/animation/demos/fancy/ChatScreenDemo.kt
@@ -119,7 +119,9 @@
             initialValue = state.floatValue,
             targetValue = if (hasSharpCorner) 2f else roundCornerSize,
             animationSpec = spring(stiffness = 50f, dampingRatio = 0.6f)
-        ) { animationValue, _ -> state.floatValue = animationValue }
+        ) { animationValue, _ ->
+            state.floatValue = animationValue
+        }
     }
     return state
 }
@@ -136,12 +138,13 @@
         text = text,
         textColor = myMessageTextColor,
         backgroundColor = myMessageBgColor,
-        shape = RoundedCornerShape(
-            topStart = roundCornerSize.dp,
-            topEnd = topCorner.dp,
-            bottomStart = roundCornerSize.dp,
-            bottomEnd = bottomCorner.dp
-        ),
+        shape =
+            RoundedCornerShape(
+                topStart = roundCornerSize.dp,
+                topEnd = topCorner.dp,
+                bottomStart = roundCornerSize.dp,
+                bottomEnd = bottomCorner.dp
+            ),
         alignment = Alignment.End
     )
 }
@@ -158,12 +161,13 @@
         text = text,
         textColor = theirMessageTextColor,
         backgroundColor = theirMessageBgColor,
-        shape = RoundedCornerShape(
-            topStart = topCorner.dp,
-            topEnd = roundCornerSize.dp,
-            bottomStart = bottomCorner.dp,
-            bottomEnd = roundCornerSize.dp
-        ),
+        shape =
+            RoundedCornerShape(
+                topStart = topCorner.dp,
+                topEnd = roundCornerSize.dp,
+                bottomStart = bottomCorner.dp,
+                bottomEnd = roundCornerSize.dp
+            ),
         alignment = Alignment.Start
     )
 }
@@ -179,10 +183,12 @@
 ) {
     AnimatedVisibility(
         visibleState = remember { MutableTransitionState(false).apply { targetState = true } },
-        enter = fadeIn() + slideInVertically(
-            initialOffsetY = { it / 2 },
-            animationSpec = spring(stiffness = 50f, dampingRatio = 0.6f)
-        ),
+        enter =
+            fadeIn() +
+                slideInVertically(
+                    initialOffsetY = { it / 2 },
+                    animationSpec = spring(stiffness = 50f, dampingRatio = 0.6f)
+                ),
         modifier = Modifier.align(alignment)
     ) {
         Card(
@@ -190,11 +196,7 @@
             shape = shape,
             modifier = Modifier.padding(bottom = 4.dp)
         ) {
-            Text(
-                modifier = Modifier.padding(8.dp),
-                color = textColor,
-                text = text
-            )
+            Text(modifier = Modifier.padding(8.dp), color = textColor, text = text)
         }
     }
 }
diff --git a/compose/animation/animation/integration-tests/animation-demos/src/main/java/androidx/compose/animation/demos/fancy/FlingGameDemo.kt b/compose/animation/animation/integration-tests/animation-demos/src/main/java/androidx/compose/animation/demos/fancy/FlingGameDemo.kt
index 2728451..64087eb 100644
--- a/compose/animation/animation/integration-tests/animation-demos/src/main/java/androidx/compose/animation/demos/fancy/FlingGameDemo.kt
+++ b/compose/animation/animation/integration-tests/animation-demos/src/main/java/androidx/compose/animation/demos/fancy/FlingGameDemo.kt
@@ -46,57 +46,52 @@
         Text("Throw me around, see what happens", Modifier.align(Alignment.Center))
         val anim = remember { Animatable(Offset(100f, 100f), Offset.VectorConverter) }
         Box(
-            Modifier.fillMaxSize().pointerInput(Unit) {
-                coroutineScope {
-                    while (true) {
-                        val velocityTracker = VelocityTracker()
-                        awaitPointerEventScope {
-                           val pointerId = awaitFirstDown().run {
-                                launch {
-                                    anim.snapTo(position)
+            Modifier.fillMaxSize()
+                .pointerInput(Unit) {
+                    coroutineScope {
+                        while (true) {
+                            val velocityTracker = VelocityTracker()
+                            awaitPointerEventScope {
+                                val pointerId =
+                                    awaitFirstDown().run {
+                                        launch { anim.snapTo(position) }
+                                        id
+                                    }
+
+                                drag(pointerId) {
+                                    launch { anim.snapTo(anim.value + it.positionChange()) }
+                                    velocityTracker.addPosition(it.uptimeMillis, it.position)
                                 }
-                                id
                             }
 
-                            drag(pointerId) {
-                                launch {
-                                    anim.snapTo(anim.value + it.positionChange())
-                                }
-                                velocityTracker.addPosition(
-                                    it.uptimeMillis,
-                                    it.position
-                                )
+                            val (x, y) = velocityTracker.calculateVelocity()
+                            anim.updateBounds(
+                                Offset(100f, 100f),
+                                Offset(size.width.toFloat() - 100f, size.height.toFloat() - 100f)
+                            )
+                            launch {
+                                var startVelocity = Offset(x, y)
+                                do {
+                                    val result =
+                                        anim.animateDecay(startVelocity, exponentialDecay())
+                                    startVelocity = result.endState.velocity
+
+                                    with(anim) {
+                                        if (value.x == upperBound?.x || value.x == lowerBound?.x) {
+                                            // x dimension hits bounds
+                                            startVelocity = startVelocity.copy(x = -startVelocity.x)
+                                        }
+                                        if (value.y == upperBound?.y || value.y == lowerBound?.y) {
+                                            // y dimension hits bounds
+                                            startVelocity = startVelocity.copy(y = -startVelocity.y)
+                                        }
+                                    }
+                                } while (result.endReason == AnimationEndReason.BoundReached)
                             }
                         }
-
-                        val (x, y) = velocityTracker.calculateVelocity()
-                        anim.updateBounds(
-                            Offset(100f, 100f),
-                            Offset(size.width.toFloat() - 100f, size.height.toFloat() - 100f)
-                        )
-                        launch {
-                            var startVelocity = Offset(x, y)
-                            do {
-                                val result = anim.animateDecay(startVelocity, exponentialDecay())
-                                startVelocity = result.endState.velocity
-
-                                with(anim) {
-                                    if (value.x == upperBound?.x || value.x == lowerBound?.x) {
-                                        // x dimension hits bounds
-                                        startVelocity = startVelocity.copy(x = -startVelocity.x)
-                                    }
-                                    if (value.y == upperBound?.y || value.y == lowerBound?.y) {
-                                        // y dimension hits bounds
-                                        startVelocity = startVelocity.copy(y = -startVelocity.y)
-                                    }
-                                }
-                            } while (result.endReason == AnimationEndReason.BoundReached)
-                        }
                     }
                 }
-            }.drawWithContent {
-                drawCircle(Color(0xff3c1361), 100f, anim.value)
-            }
+                .drawWithContent { drawCircle(Color(0xff3c1361), 100f, anim.value) }
         )
     }
 }
diff --git a/compose/animation/animation/integration-tests/animation-demos/src/main/java/androidx/compose/animation/demos/fancy/SpringChainDemo.kt b/compose/animation/animation/integration-tests/animation-demos/src/main/java/androidx/compose/animation/demos/fancy/SpringChainDemo.kt
index e1f0049..965de21 100644
--- a/compose/animation/animation/integration-tests/animation-demos/src/main/java/androidx/compose/animation/demos/fancy/SpringChainDemo.kt
+++ b/compose/animation/animation/integration-tests/animation-demos/src/main/java/androidx/compose/animation/demos/fancy/SpringChainDemo.kt
@@ -56,9 +56,7 @@
     var leader by remember { mutableStateOf(Offset(200f, 200f)) }
     Box(
         Modifier.fillMaxSize().pointerInput(Unit) {
-            detectDragGestures { _, dragAmount ->
-                leader += dragAmount
-            }
+            detectDragGestures { _, dragAmount -> leader += dragAmount }
         }
     ) {
         Text(
@@ -79,8 +77,7 @@
         // Followers stacked in reverse orders
         for (i in followers.size - 1 downTo 0) {
             Box(
-                Modifier
-                    .offset { followers[i].value.round() }
+                Modifier.offset { followers[i].value.round() }
                     .offset { IntOffset(0, spacing * (i + 1)) }
                     .size(circleSize)
                     .background(vibrantColors[i], CircleShape)
@@ -89,11 +86,14 @@
 
         // Leader
         Box(
-            Modifier.offset { leader.round() }.size(circleSize)
+            Modifier.offset { leader.round() }
+                .size(circleSize)
                 .clickable(
                     indication = null,
                     interactionSource = remember { MutableInteractionSource() }
-                ) { expanded = !expanded }
+                ) {
+                    expanded = !expanded
+                }
                 .background(Color(0xFFfff8ad), CircleShape)
         ) {
             // Rotate icon when expanded / collapsed
@@ -101,8 +101,10 @@
             Icon(
                 Icons.Filled.KeyboardArrowDown,
                 contentDescription = "Expand or Collapse",
-                modifier = Modifier.size(30.dp).align(Alignment.Center)
-                    .graphicsLayer { this.rotationZ = rotation },
+                modifier =
+                    Modifier.size(30.dp).align(Alignment.Center).graphicsLayer {
+                        this.rotationZ = rotation
+                    },
                 tint = Color.Gray
             )
         }
@@ -111,10 +113,11 @@
 
 val circleSize = 60.dp
 
-private val vibrantColors = listOf(
-    Color(0xffbfbdff),
-    Color(0xffffc7ed),
-    Color(0xffffdcab),
-    Color(0xffd5ffb0),
-    Color(0xffbaefff)
-)
+private val vibrantColors =
+    listOf(
+        Color(0xffbfbdff),
+        Color(0xffffc7ed),
+        Color(0xffffdcab),
+        Color(0xffd5ffb0),
+        Color(0xffbaefff)
+    )
diff --git a/compose/animation/animation/integration-tests/animation-demos/src/main/java/androidx/compose/animation/demos/gesture/FancyScrollingDemo.kt b/compose/animation/animation/integration-tests/animation-demos/src/main/java/androidx/compose/animation/demos/gesture/FancyScrollingDemo.kt
index 78804eb..934d225 100644
--- a/compose/animation/animation/integration-tests/animation-demos/src/main/java/androidx/compose/animation/demos/gesture/FancyScrollingDemo.kt
+++ b/compose/animation/animation/integration-tests/animation-demos/src/main/java/androidx/compose/animation/demos/gesture/FancyScrollingDemo.kt
@@ -51,66 +51,53 @@
 @Composable
 fun FancyScrollingDemo() {
     Column {
-        Text(
-            "<== Scroll horizontally ==>",
-            fontSize = 20.sp,
-            modifier = Modifier.padding(40.dp)
-        )
+        Text("<== Scroll horizontally ==>", fontSize = 20.sp, modifier = Modifier.padding(40.dp))
         val animScroll = remember { Animatable(0f) }
         val itemWidth = remember { mutableFloatStateOf(0f) }
         val scope = rememberCoroutineScope()
-        val modifier = Modifier.draggable(
-            orientation = Orientation.Horizontal,
-            state = rememberDraggableState { delta ->
-                // Snap to new drag position
-                scope.launch {
-                    animScroll.snapTo(animScroll.value + delta)
-                }
-            },
+        val modifier =
+            Modifier.draggable(
+                orientation = Orientation.Horizontal,
+                state =
+                    rememberDraggableState { delta ->
+                        // Snap to new drag position
+                        scope.launch { animScroll.snapTo(animScroll.value + delta) }
+                    },
+                onDragStopped = { velocity: Float ->
 
-            onDragStopped = { velocity: Float ->
-
-                // Uses default decay animation to calculate where the fling will settle,
-                // and adjust that position as needed. The target animation will be used for
-                // animating to the adjusted target.
-                scope.launch {
-                    val decay = exponentialDecay<Float>()
-                    val target = decay.calculateTargetValue(animScroll.value, velocity)
-                    // Adjust the target position to center align the item
-                    var rem = target % itemWidth.floatValue
-                    if (rem < 0) {
-                        rem += itemWidth.floatValue
+                    // Uses default decay animation to calculate where the fling will settle,
+                    // and adjust that position as needed. The target animation will be used for
+                    // animating to the adjusted target.
+                    scope.launch {
+                        val decay = exponentialDecay<Float>()
+                        val target = decay.calculateTargetValue(animScroll.value, velocity)
+                        // Adjust the target position to center align the item
+                        var rem = target % itemWidth.floatValue
+                        if (rem < 0) {
+                            rem += itemWidth.floatValue
+                        }
+                        animScroll.animateTo(
+                            targetValue = target - rem,
+                            initialVelocity = velocity,
+                            animationSpec = SpringSpec(dampingRatio = 2.0f, stiffness = 100f)
+                        )
                     }
-                    animScroll.animateTo(
-                        targetValue = target - rem,
-                        initialVelocity = velocity,
-                        animationSpec = SpringSpec(dampingRatio = 2.0f, stiffness = 100f)
-                    )
                 }
-            }
-        )
+            )
 
         Canvas(modifier.fillMaxWidth().height(400.dp)) {
             val width = size.width / 2f
             val scroll = animScroll.value + width / 2
             itemWidth.floatValue = width
             if (DEBUG) {
-                Log.w(
-                    "Anim",
-                    "Drawing items with updated" +
-                        " Scroll: ${animScroll.value}"
-                )
+                Log.w("Anim", "Drawing items with updated" + " Scroll: ${animScroll.value}")
             }
             drawItems(scroll, width, size.height)
         }
     }
 }
 
-private fun DrawScope.drawItems(
-    scrollPosition: Float,
-    width: Float,
-    height: Float
-) {
+private fun DrawScope.drawItems(scrollPosition: Float, width: Float, height: Float) {
     var startingPos = scrollPosition % width
     if (startingPos > 0) {
         startingPos -= width
@@ -122,11 +109,7 @@
     }
 
     val size = Size(width - 20, height)
-    drawRect(
-        pastelColors[startingColorIndex],
-        topLeft = Offset(startingPos + 10, 0f),
-        size = size
-    )
+    drawRect(pastelColors[startingColorIndex], topLeft = Offset(startingPos + 10, 0f), size = size)
 
     drawRect(
         pastelColors[(startingColorIndex + pastelColors.size - 1) % pastelColors.size],
@@ -141,13 +124,14 @@
     )
 }
 
-private val colors = listOf(
-    Color(0xFFffd9d9),
-    Color(0xFFffa3a3),
-    Color(0xFFff7373),
-    Color(0xFFff3b3b),
-    Color(0xFFce0000),
-    Color(0xFFff3b3b),
-    Color(0xFFff7373),
-    Color(0xFFffa3a3)
-)
+private val colors =
+    listOf(
+        Color(0xFFffd9d9),
+        Color(0xFFffa3a3),
+        Color(0xFFff7373),
+        Color(0xFFff3b3b),
+        Color(0xFFce0000),
+        Color(0xFFff3b3b),
+        Color(0xFFff7373),
+        Color(0xFFffa3a3)
+    )
diff --git a/compose/animation/animation/integration-tests/animation-demos/src/main/java/androidx/compose/animation/demos/gesture/SpringBackScrollingDemo.kt b/compose/animation/animation/integration-tests/animation-demos/src/main/java/androidx/compose/animation/demos/gesture/SpringBackScrollingDemo.kt
index 4f02955..96738710 100644
--- a/compose/animation/animation/integration-tests/animation-demos/src/main/java/androidx/compose/animation/demos/gesture/SpringBackScrollingDemo.kt
+++ b/compose/animation/animation/integration-tests/animation-demos/src/main/java/androidx/compose/animation/demos/gesture/SpringBackScrollingDemo.kt
@@ -59,76 +59,66 @@
 @Composable
 fun SpringBackScrollingDemo() {
     Column(Modifier.fillMaxHeight()) {
-        Text(
-            "<== Scroll horizontally ==>",
-            modifier = Modifier.padding(40.dp),
-            fontSize = 20.sp
-        )
+        Text("<== Scroll horizontally ==>", modifier = Modifier.padding(40.dp), fontSize = 20.sp)
 
         var scrollPosition by remember { mutableFloatStateOf(0f) }
         var itemWidth by remember { mutableFloatStateOf(0f) }
         val mutatorMutex = remember { MutatorMutex() }
         var animation by remember { mutableStateOf(AnimationState(scrollPosition)) }
 
-        val gesture = Modifier.pointerInput(Unit) {
-            coroutineScope {
-                while (true) {
-                    val velocityTracker = VelocityTracker()
-                    var latestVelocityX = 0f
-                    mutatorMutex.mutate(MutatePriority.UserInput) {
-                        awaitPointerEventScope {
-                            val pointerId = awaitFirstDown().id
-                            horizontalDrag(pointerId) {
-                                scrollPosition += it.positionChange().x
-                                velocityTracker.addPosition(
-                                    it.uptimeMillis,
-                                    it.position
-                                )
-                            }
-                        }
-                        latestVelocityX = velocityTracker.calculateVelocity().x
-                    }
-                    // Now finger lifted, get fling going
-                    launch {
-                        mutatorMutex.mutate {
-                            animation = AnimationState(scrollPosition, latestVelocityX)
-                            val target = exponentialDecay<Float>()
-                                .calculateTargetValue(scrollPosition, latestVelocityX)
-                            val springBackTarget: Float = calculateSpringBackTarget(
-                                target,
-                                latestVelocityX,
-                                itemWidth
-                            )
-
-                            animation.animateDecay(exponentialDecay()) {
-                                scrollPosition = this.value
-                                // Spring back as soon as the target position is crossed.
-                                if ((this.velocity > 0 && value > springBackTarget) ||
-                                    (this.velocity < 0 && value < springBackTarget)
-                                ) {
-                                    cancelAnimation()
+        val gesture =
+            Modifier.pointerInput(Unit) {
+                coroutineScope {
+                    while (true) {
+                        val velocityTracker = VelocityTracker()
+                        var latestVelocityX = 0f
+                        mutatorMutex.mutate(MutatePriority.UserInput) {
+                            awaitPointerEventScope {
+                                val pointerId = awaitFirstDown().id
+                                horizontalDrag(pointerId) {
+                                    scrollPosition += it.positionChange().x
+                                    velocityTracker.addPosition(it.uptimeMillis, it.position)
                                 }
                             }
+                            latestVelocityX = velocityTracker.calculateVelocity().x
+                        }
+                        // Now finger lifted, get fling going
+                        launch {
+                            mutatorMutex.mutate {
+                                animation = AnimationState(scrollPosition, latestVelocityX)
+                                val target =
+                                    exponentialDecay<Float>()
+                                        .calculateTargetValue(scrollPosition, latestVelocityX)
+                                val springBackTarget: Float =
+                                    calculateSpringBackTarget(target, latestVelocityX, itemWidth)
 
-                            // The previous animation is either finished or interrupted (via
-                            // cancelAnimation(). If interrupted, spring back.
-                            if (!animation.isFinished) {
-                                animation.animateTo(
-                                    springBackTarget,
-                                    SpringSpec(
-                                        dampingRatio = 0.8f,
-                                        stiffness = 200f
-                                    ),
-                                    sequentialAnimation = true
-                                ) {
+                                animation.animateDecay(exponentialDecay()) {
                                     scrollPosition = this.value
+                                    // Spring back as soon as the target position is crossed.
+                                    if (
+                                        (this.velocity > 0 && value > springBackTarget) ||
+                                            (this.velocity < 0 && value < springBackTarget)
+                                    ) {
+                                        cancelAnimation()
+                                    }
+                                }
+
+                                // The previous animation is either finished or interrupted (via
+                                // cancelAnimation(). If interrupted, spring back.
+                                if (!animation.isFinished) {
+                                    animation.animateTo(
+                                        springBackTarget,
+                                        SpringSpec(dampingRatio = 0.8f, stiffness = 200f),
+                                        sequentialAnimation = true
+                                    ) {
+                                        scrollPosition = this.value
+                                    }
                                 }
                             }
                         }
                     }
                 }
             }
-        }
         Canvas(gesture.fillMaxWidth().height(400.dp)) {
             itemWidth = size.width / 2f
             if (DEBUG) {
@@ -189,13 +179,14 @@
     )
 }
 
-private val colors = listOf(
-    Color(0xFFdaf8e3),
-    Color(0xFF97ebdb),
-    Color(0xFF00c2c7),
-    Color(0xFF0086ad),
-    Color(0xFF005582),
-    Color(0xFF0086ad),
-    Color(0xFF00c2c7),
-    Color(0xFF97ebdb)
-)
+private val colors =
+    listOf(
+        Color(0xFFdaf8e3),
+        Color(0xFF97ebdb),
+        Color(0xFF00c2c7),
+        Color(0xFF0086ad),
+        Color(0xFF005582),
+        Color(0xFF0086ad),
+        Color(0xFF00c2c7),
+        Color(0xFF97ebdb)
+    )
diff --git a/compose/animation/animation/integration-tests/animation-demos/src/main/java/androidx/compose/animation/demos/gesture/SwipeToDismissDemo.kt b/compose/animation/animation/integration-tests/animation-demos/src/main/java/androidx/compose/animation/demos/gesture/SwipeToDismissDemo.kt
index 5853da2..fda5a8f 100644
--- a/compose/animation/animation/integration-tests/animation-demos/src/main/java/androidx/compose/animation/demos/gesture/SwipeToDismissDemo.kt
+++ b/compose/animation/animation/integration-tests/animation-demos/src/main/java/androidx/compose/animation/demos/gesture/SwipeToDismissDemo.kt
@@ -60,7 +60,9 @@
         var index by remember { mutableIntStateOf(0) }
         Box(Modifier.requiredHeight(300.dp).fillMaxWidth()) {
             Box(
-                Modifier.swipeToDismiss(index).align(Alignment.BottomCenter).requiredSize(150.dp)
+                Modifier.swipeToDismiss(index)
+                    .align(Alignment.BottomCenter)
+                    .requiredSize(150.dp)
                     .background(pastelColors[index])
             )
         }
@@ -70,9 +72,7 @@
             modifier = Modifier.padding(40.dp).align(Alignment.CenterHorizontally)
         )
         Button(
-            onClick = {
-                index = (index + 1) % pastelColors.size
-            },
+            onClick = { index = (index + 1) % pastelColors.size },
             modifier = Modifier.align(Alignment.CenterHorizontally)
         ) {
             Text("New Card")
@@ -83,49 +83,40 @@
 private fun Modifier.swipeToDismiss(index: Int): Modifier = composed {
     val animatedOffset = remember { Animatable(0f) }
     val height = remember { mutableIntStateOf(0) }
-    LaunchedEffect(index) {
-        animatedOffset.snapTo(0f)
-    }
+    LaunchedEffect(index) { animatedOffset.snapTo(0f) }
     this.pointerInput(Unit) {
-        coroutineScope {
-            while (true) {
-                height.intValue = size.height
-                val velocityTracker = VelocityTracker()
-                awaitPointerEventScope {
-                    val pointerId = awaitFirstDown().id
-                    verticalDrag(pointerId) {
-                        launch {
-                            animatedOffset.snapTo(
-                                animatedOffset.value + it.positionChange().y
-                            )
+            coroutineScope {
+                while (true) {
+                    height.intValue = size.height
+                    val velocityTracker = VelocityTracker()
+                    awaitPointerEventScope {
+                        val pointerId = awaitFirstDown().id
+                        verticalDrag(pointerId) {
+                            launch {
+                                animatedOffset.snapTo(animatedOffset.value + it.positionChange().y)
+                            }
+                            velocityTracker.addPosition(it.uptimeMillis, it.position)
                         }
-                        velocityTracker.addPosition(
-                            it.uptimeMillis,
-                            it.position
-                        )
                     }
-                }
-                val velocity = velocityTracker.calculateVelocity().y
-                launch {
-                    // Either fling out of the sight, or snap back
-                    val decay = splineBasedDecay<Float>(this@pointerInput)
-                    if (decay.calculateTargetValue(
-                            animatedOffset.value,
-                            velocity
-                        ) >= -size.height
-                    ) {
-                        // Not enough velocity to be dismissed
-                        animatedOffset.animateTo(0f, initialVelocity = velocity)
-                    } else {
-                        animatedOffset.updateBounds(
-                            lowerBound = -size.height.toFloat()
-                        )
-                        animatedOffset.animateDecay(velocity, decay)
+                    val velocity = velocityTracker.calculateVelocity().y
+                    launch {
+                        // Either fling out of the sight, or snap back
+                        val decay = splineBasedDecay<Float>(this@pointerInput)
+                        if (
+                            decay.calculateTargetValue(animatedOffset.value, velocity) >=
+                                -size.height
+                        ) {
+                            // Not enough velocity to be dismissed
+                            animatedOffset.animateTo(0f, initialVelocity = velocity)
+                        } else {
+                            animatedOffset.updateBounds(lowerBound = -size.height.toFloat())
+                            animatedOffset.animateDecay(velocity, decay)
+                        }
                     }
                 }
             }
         }
-    }.offset { IntOffset(0, animatedOffset.value.roundToInt()) }
+        .offset { IntOffset(0, animatedOffset.value.roundToInt()) }
         .graphicsLayer(alpha = calculateAlpha(animatedOffset.value, height.intValue))
 }
 
@@ -135,10 +126,11 @@
     return alpha.coerceIn(0f, 1f)
 }
 
-internal val pastelColors = listOf(
-    Color(0xFFffd7d7),
-    Color(0xFFffe9d6),
-    Color(0xFFfffbd0),
-    Color(0xFFe3ffd9),
-    Color(0xFFd0fff8)
-)
+internal val pastelColors =
+    listOf(
+        Color(0xFFffd7d7),
+        Color(0xFFffe9d6),
+        Color(0xFFfffbd0),
+        Color(0xFFe3ffd9),
+        Color(0xFFd0fff8)
+    )
diff --git a/compose/animation/animation/integration-tests/animation-demos/src/main/java/androidx/compose/animation/demos/layoutanimation/AnimateContentSizeDemo.kt b/compose/animation/animation/integration-tests/animation-demos/src/main/java/androidx/compose/animation/demos/layoutanimation/AnimateContentSizeDemo.kt
index 15b8a2f..001fa91 100644
--- a/compose/animation/animation/integration-tests/animation-demos/src/main/java/androidx/compose/animation/demos/layoutanimation/AnimateContentSizeDemo.kt
+++ b/compose/animation/animation/integration-tests/animation-demos/src/main/java/androidx/compose/animation/demos/layoutanimation/AnimateContentSizeDemo.kt
@@ -68,15 +68,12 @@
     val longText = "Very long text\nthat spans across\nmultiple lines"
     var short by remember { mutableStateOf(true) }
     Box(
-        modifier = Modifier
-            .background(
-                Color.Blue,
-                RoundedCornerShape(15.dp)
-            )
-            .clickable { short = !short }
-            .padding(20.dp)
-            .wrapContentSize()
-            .animateContentSize { startSize, endSize -> println("$startSize -> $endSize") }
+        modifier =
+            Modifier.background(Color.Blue, RoundedCornerShape(15.dp))
+                .clickable { short = !short }
+                .padding(20.dp)
+                .wrapContentSize()
+                .animateContentSize { startSize, endSize -> println("$startSize -> $endSize") }
     ) {
         Text(
             if (short) {
@@ -94,9 +91,7 @@
     val shortText = "Short"
     val longText = "Very loooooong text"
     var short by remember { mutableStateOf(true) }
-    Button(
-        { short = !short }
-    ) {
+    Button({ short = !short }) {
         Text(
             if (short) {
                 shortText
diff --git a/compose/animation/animation/integration-tests/animation-demos/src/main/java/androidx/compose/animation/demos/layoutanimation/AnimateEnterExitDemo.kt b/compose/animation/animation/integration-tests/animation-demos/src/main/java/androidx/compose/animation/demos/layoutanimation/AnimateEnterExitDemo.kt
index 7ee51ee..cc8730e 100644
--- a/compose/animation/animation/integration-tests/animation-demos/src/main/java/androidx/compose/animation/demos/layoutanimation/AnimateEnterExitDemo.kt
+++ b/compose/animation/animation/integration-tests/animation-demos/src/main/java/androidx/compose/animation/demos/layoutanimation/AnimateEnterExitDemo.kt
@@ -93,34 +93,43 @@
                         summerColors.forEachIndexed { index, color ->
                             // Creates a custom enter/exit animation on scale using
                             // `AnimatedVisibilityScope.transition`
-                            val scale by transition.animateFloat { enterExitState ->
-                                when (enterExitState) {
-                                    EnterExitState.PreEnter -> 0.9f
-                                    EnterExitState.Visible -> 1.0f
-                                    EnterExitState.PostExit -> 0.5f
+                            val scale by
+                                transition.animateFloat { enterExitState ->
+                                    when (enterExitState) {
+                                        EnterExitState.PreEnter -> 0.9f
+                                        EnterExitState.Visible -> 1.0f
+                                        EnterExitState.PostExit -> 0.5f
+                                    }
                                 }
-                            }
                             val staggeredSpring = remember {
                                 spring<IntOffset>(
                                     stiffness = Spring.StiffnessLow * (1f - index * 0.2f)
                                 )
                             }
                             Box(
-                                Modifier.weight(1f).animateEnterExit(
-                                    // Staggered slide-in from bottom, while the parent
-                                    // AnimatedVisibility fades in everything (including this child)
-                                    enter = slideInVertically(
-                                        initialOffsetY = { it },
-                                        animationSpec = staggeredSpring
-                                    ),
-                                    // No built-in exit transition will be applied. It'll be
-                                    // faded out by parent AnimatedVisibility while scaling down
-                                    // by the scale animation.
-                                    exit = ExitTransition.None
-                                ).fillMaxWidth().padding(5.dp).graphicsLayer {
-                                    scaleX = scale
-                                    scaleY = scale
-                                }.clip(RoundedCornerShape(20.dp)).background(color)
+                                Modifier.weight(1f)
+                                    .animateEnterExit(
+                                        // Staggered slide-in from bottom, while the parent
+                                        // AnimatedVisibility fades in everything (including this
+                                        // child)
+                                        enter =
+                                            slideInVertically(
+                                                initialOffsetY = { it },
+                                                animationSpec = staggeredSpring
+                                            ),
+                                        // No built-in exit transition will be applied. It'll be
+                                        // faded out by parent AnimatedVisibility while scaling down
+                                        // by the scale animation.
+                                        exit = ExitTransition.None
+                                    )
+                                    .fillMaxWidth()
+                                    .padding(5.dp)
+                                    .graphicsLayer {
+                                        scaleX = scale
+                                        scaleY = scale
+                                    }
+                                    .clip(RoundedCornerShape(20.dp))
+                                    .background(color)
                             ) {}
                         }
                     }
@@ -139,9 +148,5 @@
 }
 
 @Suppress("PrimitiveInCollection")
-internal val summerColors = listOf(
-    Color(0xffff6f69),
-    Color(0xffffcc5c),
-    Color(0xff2a9d84),
-    Color(0xff264653)
-)
+internal val summerColors =
+    listOf(Color(0xffff6f69), Color(0xffffcc5c), Color(0xff2a9d84), Color(0xff264653))
diff --git a/compose/animation/animation/integration-tests/animation-demos/src/main/java/androidx/compose/animation/demos/layoutanimation/AnimatedContentWithContentKeyDemo.kt b/compose/animation/animation/integration-tests/animation-demos/src/main/java/androidx/compose/animation/demos/layoutanimation/AnimatedContentWithContentKeyDemo.kt
index a54c2a9..63a5fdd 100644
--- a/compose/animation/animation/integration-tests/animation-demos/src/main/java/androidx/compose/animation/demos/layoutanimation/AnimatedContentWithContentKeyDemo.kt
+++ b/compose/animation/animation/integration-tests/animation-demos/src/main/java/androidx/compose/animation/demos/layoutanimation/AnimatedContentWithContentKeyDemo.kt
@@ -65,9 +65,7 @@
                         Arrangement.Center,
                         Alignment.CenterHorizontally
                     ) {
-                        Button(onClick = { count++ }) {
-                            Text("+1")
-                        }
+                        Button(onClick = { count++ }) { Text("+1") }
                         Spacer(Modifier.size(20.dp))
                         Text("Count: $count", fontSize = 20.sp)
                     }
@@ -84,7 +82,10 @@
 }
 
 sealed class MyScreen {
-    enum class Type { Count, Blank }
+    enum class Type {
+        Count,
+        Blank
+    }
 
     abstract val type: Type
 }
diff --git a/compose/animation/animation/integration-tests/animation-demos/src/main/java/androidx/compose/animation/demos/layoutanimation/AnimatedPlacementDemo.kt b/compose/animation/animation/integration-tests/animation-demos/src/main/java/androidx/compose/animation/demos/layoutanimation/AnimatedPlacementDemo.kt
index 7f2bfcc..e50c9e6 100644
--- a/compose/animation/animation/integration-tests/animation-demos/src/main/java/androidx/compose/animation/demos/layoutanimation/AnimatedPlacementDemo.kt
+++ b/compose/animation/animation/integration-tests/animation-demos/src/main/java/androidx/compose/animation/demos/layoutanimation/AnimatedPlacementDemo.kt
@@ -66,37 +66,19 @@
     var alignment by remember { mutableStateOf(Alignment.TopStart) }
     Column {
         Row(Modifier.fillMaxWidth(), horizontalArrangement = Arrangement.SpaceBetween) {
-            Button(onClick = { alignment = Alignment.TopStart }) {
-                Text("TopStart")
-            }
-            Button(onClick = { alignment = Alignment.TopCenter }) {
-                Text("TopCenter")
-            }
-            Button(onClick = { alignment = Alignment.TopEnd }) {
-                Text("TopEnd")
-            }
+            Button(onClick = { alignment = Alignment.TopStart }) { Text("TopStart") }
+            Button(onClick = { alignment = Alignment.TopCenter }) { Text("TopCenter") }
+            Button(onClick = { alignment = Alignment.TopEnd }) { Text("TopEnd") }
         }
         Row(Modifier.fillMaxWidth(), horizontalArrangement = Arrangement.SpaceBetween) {
-            Button(onClick = { alignment = Alignment.CenterStart }) {
-                Text("CenterStart")
-            }
-            Button(onClick = { alignment = Alignment.Center }) {
-                Text("Center")
-            }
-            Button(onClick = { alignment = Alignment.CenterEnd }) {
-                Text("CenterEnd")
-            }
+            Button(onClick = { alignment = Alignment.CenterStart }) { Text("CenterStart") }
+            Button(onClick = { alignment = Alignment.Center }) { Text("Center") }
+            Button(onClick = { alignment = Alignment.CenterEnd }) { Text("CenterEnd") }
         }
         Row(Modifier.fillMaxWidth(), horizontalArrangement = Arrangement.SpaceBetween) {
-            Button(onClick = { alignment = Alignment.BottomStart }) {
-                Text("BottomStart")
-            }
-            Button(onClick = { alignment = Alignment.BottomCenter }) {
-                Text("BottomCenter")
-            }
-            Button(onClick = { alignment = Alignment.BottomEnd }) {
-                Text("BottomEnd")
-            }
+            Button(onClick = { alignment = Alignment.BottomStart }) { Text("BottomStart") }
+            Button(onClick = { alignment = Alignment.BottomCenter }) { Text("BottomCenter") }
+            Button(onClick = { alignment = Alignment.BottomEnd }) { Text("BottomEnd") }
         }
         AnimatedChildAlignment(alignment)
     }
@@ -112,23 +94,22 @@
 class AnimatedPlacementModifier(val scope: CoroutineScope) : OnPlacedModifier, LayoutModifier {
     var targetOffset by mutableStateOf(Offset.Zero)
     var animatable by mutableStateOf<Animatable<Offset, AnimationVector2D>?>(null)
+
     override fun MeasureScope.measure(
         measurable: Measurable,
         constraints: Constraints
     ): MeasureResult {
         val placeable = measurable.measure(constraints)
         return layout(placeable.width, placeable.height) {
-            placeable.place(
-                animatable?.let { (it.value - targetOffset).round() } ?: IntOffset.Zero
-            )
+            placeable.place(animatable?.let { (it.value - targetOffset).round() } ?: IntOffset.Zero)
         }
     }
 
     override fun onPlaced(coordinates: LayoutCoordinates) {
         targetOffset = coordinates.positionInParent()
         // Animate to the new target offset when alignment changes.
-        val anim = animatable ?: Animatable(targetOffset, Offset.VectorConverter)
-            .also { animatable = it }
+        val anim =
+            animatable ?: Animatable(targetOffset, Offset.VectorConverter).also { animatable = it }
         if (anim.targetValue != targetOffset) {
             scope.launch {
                 anim.animateTo(targetOffset, spring(stiffness = Spring.StiffnessMediumLow))
@@ -141,8 +122,8 @@
 fun AnimatedChildAlignment(alignment: Alignment) {
     Box(Modifier.fillMaxSize().padding(4.dp).border(1.dp, Color.Red)) {
         Box(
-            modifier = Modifier.animatePlacement().align(alignment).size(100.dp)
-                .background(Color.Red)
+            modifier =
+                Modifier.animatePlacement().align(alignment).size(100.dp).background(Color.Red)
         )
     }
 }
diff --git a/compose/animation/animation/integration-tests/animation-demos/src/main/java/androidx/compose/animation/demos/layoutanimation/AnimatedVisibilityDemo.kt b/compose/animation/animation/integration-tests/animation-demos/src/main/java/androidx/compose/animation/demos/layoutanimation/AnimatedVisibilityDemo.kt
index efb8e8f..69262a1 100644
--- a/compose/animation/animation/integration-tests/animation-demos/src/main/java/androidx/compose/animation/demos/layoutanimation/AnimatedVisibilityDemo.kt
+++ b/compose/animation/animation/integration-tests/animation-demos/src/main/java/androidx/compose/animation/demos/layoutanimation/AnimatedVisibilityDemo.kt
@@ -80,25 +80,13 @@
             Modifier.fillMaxWidth().padding(20.dp),
             horizontalArrangement = Arrangement.SpaceBetween
         ) {
-            Button(onClick = { itemNum = min((itemNum + 1), 6) }) {
-                Text("Add")
-            }
-            Button(onClick = { itemNum = max((itemNum - 1), 0) }) {
-                Text("Remove")
-            }
+            Button(onClick = { itemNum = min((itemNum + 1), 6) }) { Text("Add") }
+            Button(onClick = { itemNum = max((itemNum - 1), 0) }) { Text("Remove") }
         }
-        Box(
-            Modifier.padding(bottom = 20.dp)
-        ) {
-
+        Box(Modifier.padding(bottom = 20.dp)) {
             val modifier = if (animateContentSize) Modifier.animateContentSize() else Modifier
-            Column(
-                Modifier.background(Color.LightGray).fillMaxWidth().then(modifier)
-            ) {
-
-                Column(
-                    Modifier.background(Color.LightGray).fillMaxWidth().then(modifier)
-                ) {
+            Column(Modifier.background(Color.LightGray).fillMaxWidth().then(modifier)) {
+                Column(Modifier.background(Color.LightGray).fillMaxWidth().then(modifier)) {
                     AnimatedVisibility(visible = itemNum > 0) {
                         Item(
                             pastelColors[0],
@@ -142,10 +130,7 @@
 @Composable
 fun Item(color: Color, text: String = "") {
     Box(Modifier.requiredHeight(80.dp).fillMaxWidth().background(color)) {
-        Text(
-            text,
-            modifier = Modifier.align(Alignment.CenterStart).padding(start = 10.dp)
-        )
+        Text(text, modifier = Modifier.align(Alignment.CenterStart).padding(start = 10.dp))
     }
 }
 
@@ -165,19 +150,21 @@
 fun HorizontalTransition(visible: Boolean, content: @Composable () -> Unit) {
     AnimatedVisibility(
         visible = visible,
-        enter = expandHorizontally(
-            // Set the start width to 20 (pixels), 0 by default
-            initialWidth = { 20 }
-        ),
-        exit = shrinkHorizontally(
-            // Shrink towards the end (i.e. right edge for LTR, left edge for RTL). The default
-            // direction for the shrink is towards [Alignment.Start]
-            shrinkTowards = Alignment.End,
-            // Set the end width for the shrink animation to a quarter of the full width.
-            targetWidth = { fullWidth -> fullWidth / 10 },
-            // Overwrites the default animation with tween for this shrink animation.
-            animationSpec = tween(durationMillis = 400)
-        ) + fadeOut()
+        enter =
+            expandHorizontally(
+                // Set the start width to 20 (pixels), 0 by default
+                initialWidth = { 20 }
+            ),
+        exit =
+            shrinkHorizontally(
+                // Shrink towards the end (i.e. right edge for LTR, left edge for RTL). The default
+                // direction for the shrink is towards [Alignment.Start]
+                shrinkTowards = Alignment.End,
+                // Set the end width for the shrink animation to a quarter of the full width.
+                targetWidth = { fullWidth -> fullWidth / 10 },
+                // Overwrites the default animation with tween for this shrink animation.
+                animationSpec = tween(durationMillis = 400)
+            ) + fadeOut()
     ) {
         content()
     }
@@ -188,20 +175,23 @@
 fun SlideTransition(visible: Boolean, content: @Composable () -> Unit) {
     AnimatedVisibility(
         visible = visible,
-        enter = slideInHorizontally(
-            // Offsets the content by 1/3 of its width to the left, and slide towards right
-            initialOffsetX = { fullWidth -> -fullWidth / 3 },
-            // Overwrites the default animation with tween for this slide animation.
-            animationSpec = tween(durationMillis = 200)
-        ) + fadeIn(
-            // Overwrites the default animation with tween
-            animationSpec = tween(durationMillis = 200)
-        ),
-        exit = slideOutHorizontally(
-            // Overwrites the ending position of the slide-out to 200 (pixels) to the right
-            targetOffsetX = { 200 },
-            animationSpec = spring(stiffness = Spring.StiffnessHigh)
-        ) + fadeOut()
+        enter =
+            slideInHorizontally(
+                // Offsets the content by 1/3 of its width to the left, and slide towards right
+                initialOffsetX = { fullWidth -> -fullWidth / 3 },
+                // Overwrites the default animation with tween for this slide animation.
+                animationSpec = tween(durationMillis = 200)
+            ) +
+                fadeIn(
+                    // Overwrites the default animation with tween
+                    animationSpec = tween(durationMillis = 200)
+                ),
+        exit =
+            slideOutHorizontally(
+                // Overwrites the ending position of the slide-out to 200 (pixels) to the right
+                targetOffsetX = { 200 },
+                animationSpec = spring(stiffness = Spring.StiffnessHigh)
+            ) + fadeOut()
     ) {
         content()
     }
@@ -212,14 +202,16 @@
 fun FadeTransition(visible: Boolean, content: @Composable () -> Unit) {
     AnimatedVisibility(
         visible = visible,
-        enter = fadeIn(
-            // Overwrites the initial value of alpha to 0.4f for fade in, 0 by default
-            initialAlpha = 0.4f
-        ),
-        exit = fadeOut(
-            // Overwrites the default animation with tween
-            animationSpec = tween(durationMillis = 250)
-        )
+        enter =
+            fadeIn(
+                // Overwrites the initial value of alpha to 0.4f for fade in, 0 by default
+                initialAlpha = 0.4f
+            ),
+        exit =
+            fadeOut(
+                // Overwrites the default animation with tween
+                animationSpec = tween(durationMillis = 250)
+            )
     ) {
         content()
     }
@@ -229,13 +221,12 @@
 fun FullyLoadedTransition(visible: Boolean, content: @Composable () -> Unit) {
     AnimatedVisibility(
         visible = visible,
-        enter = slideInVertically(
-            // Start the slide from 40 (pixels) above where the content is supposed to go, to
-            // produce a parallax effect
-            initialOffsetY = { -40 }
-        ) + expandVertically(
-            expandFrom = Alignment.Top
-        ) + fadeIn(initialAlpha = 0.3f),
+        enter =
+            slideInVertically(
+                // Start the slide from 40 (pixels) above where the content is supposed to go, to
+                // produce a parallax effect
+                initialOffsetY = { -40 }
+            ) + expandVertically(expandFrom = Alignment.Top) + fadeIn(initialAlpha = 0.3f),
         exit = slideOutVertically() + shrinkVertically() + fadeOut()
     ) {
         content()
diff --git a/compose/animation/animation/integration-tests/animation-demos/src/main/java/androidx/compose/animation/demos/layoutanimation/AnimatedVisiblilityLazyColumnDemo.kt b/compose/animation/animation/integration-tests/animation-demos/src/main/java/androidx/compose/animation/demos/layoutanimation/AnimatedVisiblilityLazyColumnDemo.kt
index ab7f879..9291045 100644
--- a/compose/animation/animation/integration-tests/animation-demos/src/main/java/androidx/compose/animation/demos/layoutanimation/AnimatedVisiblilityLazyColumnDemo.kt
+++ b/compose/animation/animation/integration-tests/animation-demos/src/main/java/androidx/compose/animation/demos/layoutanimation/AnimatedVisiblilityLazyColumnDemo.kt
@@ -50,22 +50,20 @@
     Column {
         val model = remember { MyModel() }
         Row(Modifier.fillMaxWidth()) {
-            Button(
-                { model.addNewItem() },
-                modifier = Modifier.padding(15.dp).weight(1f)
-            ) {
+            Button({ model.addNewItem() }, modifier = Modifier.padding(15.dp).weight(1f)) {
                 Text("Add")
             }
         }
 
         LaunchedEffect(model) {
             snapshotFlow {
-                model.items.firstOrNull { it.visible.isIdle && !it.visible.targetState }
-            }.collect {
-                if (it != null) {
-                    model.pruneItems()
+                    model.items.firstOrNull { it.visible.isIdle && !it.visible.targetState }
                 }
-            }
+                .collect {
+                    if (it != null) {
+                        model.pruneItems()
+                    }
+                }
         }
         LazyColumn {
             items(model.items, key = { it.itemId }) { item ->
@@ -86,10 +84,7 @@
             }
         }
 
-        Button(
-            { model.removeAll() },
-            modifier = Modifier.align(End).padding(15.dp)
-        ) {
+        Button({ model.removeAll() }, modifier = Modifier.align(End).padding(15.dp)) {
             Text("Clear All")
         }
     }
@@ -102,18 +97,13 @@
 
     class ColoredItem(val visible: MutableTransitionState<Boolean>, val itemId: Int) {
         val color: Color
-            get() = turquoiseColors.let {
-                it[itemId % it.size]
-            }
+            get() = turquoiseColors.let { it[itemId % it.size] }
     }
 
     fun addNewItem() {
         lastItemId++
         _items.add(
-            ColoredItem(
-                MutableTransitionState(false).apply { targetState = true },
-                lastItemId
-            )
+            ColoredItem(MutableTransitionState(false).apply { targetState = true }, lastItemId)
         )
     }
 
@@ -127,17 +117,16 @@
     }
 
     fun removeAll() {
-        _items.forEach {
-            it.visible.targetState = false
-        }
+        _items.forEach { it.visible.targetState = false }
     }
 }
 
-internal val turquoiseColors = listOf(
-    Color(0xff07688C),
-    Color(0xff1986AF),
-    Color(0xff50B6CD),
-    Color(0xffBCF8FF),
-    Color(0xff8AEAE9),
-    Color(0xff46CECA)
-)
+internal val turquoiseColors =
+    listOf(
+        Color(0xff07688C),
+        Color(0xff1986AF),
+        Color(0xff50B6CD),
+        Color(0xffBCF8FF),
+        Color(0xff8AEAE9),
+        Color(0xff46CECA)
+    )
diff --git a/compose/animation/animation/integration-tests/animation-demos/src/main/java/androidx/compose/animation/demos/layoutanimation/NestedMenuDemo.kt b/compose/animation/animation/integration-tests/animation-demos/src/main/java/androidx/compose/animation/demos/layoutanimation/NestedMenuDemo.kt
index 85cce43..1053ff99 100644
--- a/compose/animation/animation/integration-tests/animation-demos/src/main/java/androidx/compose/animation/demos/layoutanimation/NestedMenuDemo.kt
+++ b/compose/animation/animation/integration-tests/animation-demos/src/main/java/androidx/compose/animation/demos/layoutanimation/NestedMenuDemo.kt
@@ -73,23 +73,24 @@
             modifier = Modifier.background(menuColor),
             transitionSpec = {
                 if (initialState < targetState) {
-                    // Going from parent menu to child menu, slide towards left
-                    slideIntoContainer(towards = SlideDirection.Left) togetherWith
-                        ExitTransition.KeepUntilTransitionsFinished
-                } else {
-                    // Going from child menu to parent menu, slide towards right
-                    slideIntoContainer(
-                        towards = SlideDirection.Right,
-                        initialOffset = { offsetForFullSlide -> offsetForFullSlide / 2 }
-                    ) togetherWith
-                        slideOutOfContainer(towards = SlideDirection.Right)
-                }.apply {
-                    targetContentZIndex = when (targetState) {
-                        NestedMenuState.Level1 -> 1f
-                        NestedMenuState.Level2 -> 2f
-                        NestedMenuState.Level3 -> 3f
+                        // Going from parent menu to child menu, slide towards left
+                        slideIntoContainer(towards = SlideDirection.Left) togetherWith
+                            ExitTransition.KeepUntilTransitionsFinished
+                    } else {
+                        // Going from child menu to parent menu, slide towards right
+                        slideIntoContainer(
+                            towards = SlideDirection.Right,
+                            initialOffset = { offsetForFullSlide -> offsetForFullSlide / 2 }
+                        ) togetherWith slideOutOfContainer(towards = SlideDirection.Right)
                     }
-                }
+                    .apply {
+                        targetContentZIndex =
+                            when (targetState) {
+                                NestedMenuState.Level1 -> 1f
+                                NestedMenuState.Level2 -> 2f
+                                NestedMenuState.Level3 -> 3f
+                            }
+                    }
             }
         ) {
             when (it) {
@@ -101,7 +102,11 @@
     }
 }
 
-private enum class NestedMenuState { Level1, Level2, Level3 }
+private enum class NestedMenuState {
+    Level1,
+    Level2,
+    Level3
+}
 
 private fun NestedMenuState.next(): NestedMenuState =
     NestedMenuState.values()[min(this.ordinal + 1, 2)]
diff --git a/compose/animation/animation/integration-tests/animation-demos/src/main/java/androidx/compose/animation/demos/layoutanimation/ScaleEnterExitDemo.kt b/compose/animation/animation/integration-tests/animation-demos/src/main/java/androidx/compose/animation/demos/layoutanimation/ScaleEnterExitDemo.kt
index 59b60ea..96ce6ab 100644
--- a/compose/animation/animation/integration-tests/animation-demos/src/main/java/androidx/compose/animation/demos/layoutanimation/ScaleEnterExitDemo.kt
+++ b/compose/animation/animation/integration-tests/animation-demos/src/main/java/androidx/compose/animation/demos/layoutanimation/ScaleEnterExitDemo.kt
@@ -67,13 +67,17 @@
             // Scale up from the TopLeft by setting TransformOrigin to (0f, 0f), while expanding the
             // layout size from Top start and fading. This will create a coherent look as if the
             // scale is impacting the size.
-            enter = scaleIn(transformOrigin = TransformOrigin(0f, 0f)) + fadeIn() +
-                expandIn(expandFrom = Alignment.TopStart),
+            enter =
+                scaleIn(transformOrigin = TransformOrigin(0f, 0f)) +
+                    fadeIn() +
+                    expandIn(expandFrom = Alignment.TopStart),
             // Scale down from the TopLeft by setting TransformOrigin to (0f, 0f), while shrinking
             // the layout towards Top start and fading. This will create a coherent look as if the
             // scale is impacting the layout size.
-            exit = scaleOut(transformOrigin = TransformOrigin(0f, 0f)) + fadeOut() +
-                shrinkOut(shrinkTowards = Alignment.TopStart)
+            exit =
+                scaleOut(transformOrigin = TransformOrigin(0f, 0f)) +
+                    fadeOut() +
+                    shrinkOut(shrinkTowards = Alignment.TopStart)
         ) {
             Box(Modifier.size(100.dp).background(Color.Red, shape = RoundedCornerShape(20.dp)))
         }
@@ -99,10 +103,10 @@
         }
         AnimatedVisibility(
             visible = showBlue,
-            enter = scaleIn(initialScale = 1.2f) +
-                slideInHorizontally(initialOffsetX = { (-it * 1.2f).toInt() }),
-            exit = scaleOut(targetScale = 2f) +
-                slideOutHorizontally(targetOffsetX = { -2 * it })
+            enter =
+                scaleIn(initialScale = 1.2f) +
+                    slideInHorizontally(initialOffsetX = { (-it * 1.2f).toInt() }),
+            exit = scaleOut(targetScale = 2f) + slideOutHorizontally(targetOffsetX = { -2 * it })
         ) {
             Box(Modifier.size(100.dp).background(Color.Blue, shape = RoundedCornerShape(20.dp)))
         }
diff --git a/compose/animation/animation/integration-tests/animation-demos/src/main/java/androidx/compose/animation/demos/layoutanimation/ScreenTransitionDemo.kt b/compose/animation/animation/integration-tests/animation-demos/src/main/java/androidx/compose/animation/demos/layoutanimation/ScreenTransitionDemo.kt
index cbea6e6..263a84a 100644
--- a/compose/animation/animation/integration-tests/animation-demos/src/main/java/androidx/compose/animation/demos/layoutanimation/ScreenTransitionDemo.kt
+++ b/compose/animation/animation/integration-tests/animation-demos/src/main/java/androidx/compose/animation/demos/layoutanimation/ScreenTransitionDemo.kt
@@ -60,29 +60,27 @@
         Row(Modifier.fillMaxWidth(), horizontalArrangement = Arrangement.SpaceEvenly) {
             Button(
                 onClick = {
-                    targetScreen = when ((targetScreen.ordinal + 2) % 3) {
-                        1 -> TestScreens.Screen2
-                        2 -> TestScreens.Screen3
-                        else -> TestScreens.Screen1
-                    }
+                    targetScreen =
+                        when ((targetScreen.ordinal + 2) % 3) {
+                            1 -> TestScreens.Screen2
+                            2 -> TestScreens.Screen3
+                            else -> TestScreens.Screen1
+                        }
                 },
-                modifier = Modifier
-                    .align(Alignment.CenterVertically)
-                    .padding(10.dp)
+                modifier = Modifier.align(Alignment.CenterVertically).padding(10.dp)
             ) {
                 Text("Previous screen")
             }
             Button(
                 onClick = {
-                    targetScreen = when (targetScreen.ordinal + 1) {
-                        1 -> TestScreens.Screen2
-                        2 -> TestScreens.Screen3
-                        else -> TestScreens.Screen1
-                    }
+                    targetScreen =
+                        when (targetScreen.ordinal + 1) {
+                            1 -> TestScreens.Screen2
+                            2 -> TestScreens.Screen3
+                            else -> TestScreens.Screen1
+                        }
                 },
-                modifier = Modifier
-                    .align(Alignment.CenterVertically)
-                    .padding(10.dp)
+                modifier = Modifier.align(Alignment.CenterVertically).padding(10.dp)
             ) {
                 Text("Next screen")
             }
@@ -97,24 +95,21 @@
                             shrinkVertically(animationSpec = tween(500)) +
                                 fadeOut(animationSpec = tween(500))
                         )
-
                     TestScreens.Screen2 isTransitioningTo TestScreens.Screen3 ->
                         slideIntoContainer(towards = SlideDirection.Left) togetherWith
                             slideOutOfContainer(towards = SlideDirection.Left)
-
                     TestScreens.Screen3 isTransitioningTo TestScreens.Screen2 ->
                         slideIntoContainer(towards = SlideDirection.Right) togetherWith
                             slideOutOfContainer(towards = SlideDirection.Right)
-
                     TestScreens.Screen3 isTransitioningTo TestScreens.Screen1 ->
                         slideIntoContainer(towards = SlideDirection.Right) togetherWith
                             ExitTransition.KeepUntilTransitionsFinished
-
                     else ->
                         // Material fade through
                         fadeIn(animationSpec = tween(220, delayMillis = 90)) +
                             scaleIn(
-                                initialScale = 0.92f, animationSpec = tween(220, delayMillis = 90)
+                                initialScale = 0.92f,
+                                animationSpec = tween(220, delayMillis = 90)
                             ) togetherWith fadeOut(animationSpec = tween(90))
                 }
             }
@@ -136,30 +131,21 @@
 
 @Composable
 fun Screen1() {
-    Box(modifier = Modifier
-        .fillMaxSize()
-        .padding(30.dp)
-        .background(Color(0xffff6f69))) {
+    Box(modifier = Modifier.fillMaxSize().padding(30.dp).background(Color(0xffff6f69))) {
         Text("Screen 1", modifier = Modifier.align(Center))
     }
 }
 
 @Composable
 fun Screen2() {
-    Box(modifier = Modifier
-        .fillMaxSize()
-        .padding(30.dp)
-        .background(Color(0xffffcc5c))) {
+    Box(modifier = Modifier.fillMaxSize().padding(30.dp).background(Color(0xffffcc5c))) {
         Text("Screen 2", modifier = Modifier.align(Center))
     }
 }
 
 @Composable
 fun Screen3() {
-    Box(modifier = Modifier
-        .fillMaxSize()
-        .padding(30.dp)
-        .background(Color(0xff2a9d84))) {
+    Box(modifier = Modifier.fillMaxSize().padding(30.dp).background(Color(0xff2a9d84))) {
         Text("Screen 3", modifier = Modifier.align(Center))
     }
 }
diff --git a/compose/animation/animation/integration-tests/animation-demos/src/main/java/androidx/compose/animation/demos/layoutanimation/ShrineCartDemo.kt b/compose/animation/animation/integration-tests/animation-demos/src/main/java/androidx/compose/animation/demos/layoutanimation/ShrineCartDemo.kt
index 4b5c059..96f11b6 100644
--- a/compose/animation/animation/integration-tests/animation-demos/src/main/java/androidx/compose/animation/demos/layoutanimation/ShrineCartDemo.kt
+++ b/compose/animation/animation/integration-tests/animation-demos/src/main/java/androidx/compose/animation/demos/layoutanimation/ShrineCartDemo.kt
@@ -62,19 +62,19 @@
         var cartState by remember { mutableStateOf(CartState.Collapsed) }
         // Creates a transition here to animate the corner shape and content.
         val cartOpenTransition = updateTransition(cartState, "CartOpenTransition")
-        val cornerSize by cartOpenTransition.animateDp(
-            label = "cartCornerSize",
-            transitionSpec = {
-                when {
-                    CartState.Expanded isTransitioningTo CartState.Collapsed ->
-                        tween(durationMillis = 433, delayMillis = 67)
-                    else ->
-                        tween(durationMillis = 150)
+        val cornerSize by
+            cartOpenTransition.animateDp(
+                label = "cartCornerSize",
+                transitionSpec = {
+                    when {
+                        CartState.Expanded isTransitioningTo CartState.Collapsed ->
+                            tween(durationMillis = 433, delayMillis = 67)
+                        else -> tween(durationMillis = 150)
+                    }
                 }
+            ) {
+                if (it == CartState.Expanded) 0.dp else 24.dp
             }
-        ) {
-            if (it == CartState.Expanded) 0.dp else 24.dp
-        }
 
         Surface(
             Modifier.shadow(8.dp, CutCornerShape(topStart = cornerSize))
@@ -106,11 +106,13 @@
                                     }
                                 }
                             }
-                        ).apply {
-                            targetContentZIndex = when (targetState) {
-                                CartState.Collapsed -> 2f
-                                CartState.Expanded -> 1f
-                            }
+                        )
+                        .apply {
+                            targetContentZIndex =
+                                when (targetState) {
+                                    CartState.Collapsed -> 2f
+                                    CartState.Expanded -> 1f
+                                }
                         }
                 }
             ) {
@@ -123,9 +125,11 @@
         }
         Box(
             Modifier.clickable {
-                cartState =
-                    if (cartState == CartState.Expanded) CartState.Collapsed else CartState.Expanded
-            }.fillMaxSize()
+                    cartState =
+                        if (cartState == CartState.Expanded) CartState.Collapsed
+                        else CartState.Expanded
+                }
+                .fillMaxSize()
         )
     }
 }
@@ -137,10 +141,7 @@
         verticalAlignment = Alignment.CenterVertically,
         horizontalArrangement = Arrangement.spacedBy(16.dp)
     ) {
-        Box(
-            Modifier.size(40.dp),
-            contentAlignment = Alignment.Center
-        ) {
+        Box(Modifier.size(40.dp), contentAlignment = Alignment.Center) {
             Icon(
                 imageVector = Icons.Default.ShoppingCart,
                 contentDescription = "Shopping cart icon",
@@ -148,9 +149,8 @@
         }
         for (i in 0 until 3) {
             Box(
-                modifier = Modifier
-                    .size(40.dp)
-                    .clip(RoundedCornerShape(10.dp)).background(ShrinePink10)
+                modifier =
+                    Modifier.size(40.dp).clip(RoundedCornerShape(10.dp)).background(ShrinePink10)
             )
         }
     }
diff --git a/compose/animation/animation/integration-tests/animation-demos/src/main/java/androidx/compose/animation/demos/lookahead/AnimateBoundsModifier.kt b/compose/animation/animation/integration-tests/animation-demos/src/main/java/androidx/compose/animation/demos/lookahead/AnimateBoundsModifier.kt
index ef1708d..7c9e86f 100644
--- a/compose/animation/animation/integration-tests/animation-demos/src/main/java/androidx/compose/animation/demos/lookahead/AnimateBoundsModifier.kt
+++ b/compose/animation/animation/integration-tests/animation-demos/src/main/java/androidx/compose/animation/demos/lookahead/AnimateBoundsModifier.kt
@@ -45,17 +45,12 @@
 @OptIn(ExperimentalAnimatableApi::class)
 fun Modifier.animateBounds(
     modifier: Modifier = Modifier,
-    sizeAnimationSpec: FiniteAnimationSpec<IntSize> = spring(
-        Spring.DampingRatioNoBouncy,
-        Spring.StiffnessMediumLow
-    ),
-    positionAnimationSpec: FiniteAnimationSpec<IntOffset> = spring(
-        Spring.DampingRatioNoBouncy,
-        Spring.StiffnessMediumLow
-    ),
+    sizeAnimationSpec: FiniteAnimationSpec<IntSize> =
+        spring(Spring.DampingRatioNoBouncy, Spring.StiffnessMediumLow),
+    positionAnimationSpec: FiniteAnimationSpec<IntOffset> =
+        spring(Spring.DampingRatioNoBouncy, Spring.StiffnessMediumLow),
     debug: Boolean = false,
 ) = composed {
-
     val outerOffsetAnimation = remember { DeferredTargetAnimation(IntOffset.VectorConverter) }
     val outerSizeAnimation = remember { DeferredTargetAnimation(IntSize.VectorConverter) }
 
@@ -68,16 +63,16 @@
     // approachLayout is expected to produce intermediate stages of a layout transform.
     // When the measure block is invoked after lookahead pass, the lookahead size of the
     // child will be accessible as a parameter to the measure block.
-    this
-        .drawWithContent {
+    this.drawWithContent {
             drawContent()
             if (debug) {
-//                val offset = outerOffsetAnimation.pendingTarget!! - outerOffsetAnimation.value!!
-//                translate(
-//                    offset.x.toFloat(), offset.y.toFloat()
-//                ) {
-//                    drawRect(Color.Black.copy(alpha = 0.5f), style = Stroke(10f))
-//                }
+                //                val offset = outerOffsetAnimation.pendingTarget!! -
+                // outerOffsetAnimation.value!!
+                //                translate(
+                //                    offset.x.toFloat(), offset.y.toFloat()
+                //                ) {
+                //                    drawRect(Color.Black.copy(alpha = 0.5f), style = Stroke(10f))
+                //                }
             }
         }
         .approachLayout(
@@ -95,34 +90,35 @@
                 !outerOffsetAnimation.isIdle
             }
         ) { measurable, constraints ->
-            val (w, h) = outerSizeAnimation.updateTarget(
-                lookaheadSize,
-                coroutineScope,
-                sizeAnimationSpec,
-            )
-            measurable
-                .measure(constraints)
-                .run {
-                    layout(w, h) {
-                        with(coroutineScope) {
-                            val (x, y) = outerOffsetAnimation.updateTargetBasedOnCoordinates(
+            val (w, h) =
+                outerSizeAnimation.updateTarget(
+                    lookaheadSize,
+                    coroutineScope,
+                    sizeAnimationSpec,
+                )
+            measurable.measure(constraints).run {
+                layout(w, h) {
+                    with(coroutineScope) {
+                        val (x, y) =
+                            outerOffsetAnimation.updateTargetBasedOnCoordinates(
                                 positionAnimationSpec
                             )
-                            place(x, y)
-                        }
+                        place(x, y)
                     }
                 }
+            }
         }
         .then(modifier)
         .drawWithContent {
             drawContent()
             if (debug) {
-//                val offset = offsetAnimation.pendingTarget!! - offsetAnimation.value!!
-//                translate(
-//                    offset.x.toFloat(), offset.y.toFloat()
-//                ) {
-//                    drawRect(Color.Green.copy(alpha = 0.5f), style = Stroke(10f))
-//                }
+                //                val offset = offsetAnimation.pendingTarget!! -
+                // offsetAnimation.value!!
+                //                translate(
+                //                    offset.x.toFloat(), offset.y.toFloat()
+                //                ) {
+                //                    drawRect(Color.Green.copy(alpha = 0.5f), style = Stroke(10f))
+                //                }
             }
         }
         .approachLayout(
@@ -132,11 +128,7 @@
             },
             isPlacementApproachInProgress = {
                 val target = lookaheadScopeCoordinates.localLookaheadPositionOf(it)
-                offsetAnimation.updateTarget(
-                    target.round(),
-                    coroutineScope,
-                    positionAnimationSpec
-                )
+                offsetAnimation.updateTarget(target.round(), coroutineScope, positionAnimationSpec)
                 !offsetAnimation.isIdle
             }
         ) { measurable, _ ->
@@ -144,21 +136,23 @@
             // child modifier. This lookahead size can be used to animate the size
             // change, such that the animation starts from the current size and gradually
             // change towards `lookaheadSize`.
-            val (width, height) = sizeAnimation.updateTarget(
-                lookaheadSize,
-                coroutineScope,
-                sizeAnimationSpec,
-            )
+            val (width, height) =
+                sizeAnimation.updateTarget(
+                    lookaheadSize,
+                    coroutineScope,
+                    sizeAnimationSpec,
+                )
             // Creates a fixed set of constraints using the animated size
             val animatedConstraints = Constraints.fixed(width, height)
             // Measure child/children with animated constraints.
             val placeable = measurable.measure(animatedConstraints)
             layout(placeable.width, placeable.height) {
-                val (x, y) = with(coroutineScope) {
-                    offsetAnimation.updateTargetBasedOnCoordinates(
-                        positionAnimationSpec,
-                    )
-                }
+                val (x, y) =
+                    with(coroutineScope) {
+                        offsetAnimation.updateTargetBasedOnCoordinates(
+                            positionAnimationSpec,
+                        )
+                    }
                 placeable.place(x, y)
             }
         }
@@ -172,15 +166,14 @@
     coordinates?.let { coordinates ->
         with(this@PlacementScope) {
             val targetOffset = lookaheadScopeCoordinates.localLookaheadPositionOf(coordinates)
-            val animOffset = updateTarget(
-                targetOffset.round(),
-                this@CoroutineScope,
-                animationSpec,
-            )
-            val current = lookaheadScopeCoordinates.localPositionOf(
-                coordinates,
-                Offset.Zero
-            ).round()
+            val animOffset =
+                updateTarget(
+                    targetOffset.round(),
+                    this@CoroutineScope,
+                    animationSpec,
+                )
+            val current =
+                lookaheadScopeCoordinates.localPositionOf(coordinates, Offset.Zero).round()
             return (animOffset - current)
         }
     }
diff --git a/compose/animation/animation/integration-tests/animation-demos/src/main/java/androidx/compose/animation/demos/lookahead/AnimateBoundsModifierDemo.kt b/compose/animation/animation/integration-tests/animation-demos/src/main/java/androidx/compose/animation/demos/lookahead/AnimateBoundsModifierDemo.kt
index 331ba4f..960d5f7 100644
--- a/compose/animation/animation/integration-tests/animation-demos/src/main/java/androidx/compose/animation/demos/lookahead/AnimateBoundsModifierDemo.kt
+++ b/compose/animation/animation/integration-tests/animation-demos/src/main/java/androidx/compose/animation/demos/lookahead/AnimateBoundsModifierDemo.kt
@@ -43,73 +43,40 @@
 @OptIn(ExperimentalComposeUiApi::class)
 @Composable
 fun AnimateBoundsModifierDemo() {
-    var height by remember {
-        mutableIntStateOf(200)
-    }
-    var left by remember {
-        mutableIntStateOf(0)
-    }
-    var top by remember {
-        mutableIntStateOf(0)
-    }
-    var right by remember {
-        mutableIntStateOf(0)
-    }
-    var bottom by remember {
-        mutableIntStateOf(0)
-    }
-    var weight by remember {
-        mutableFloatStateOf(2f)
-    }
+    var height by remember { mutableIntStateOf(200) }
+    var left by remember { mutableIntStateOf(0) }
+    var top by remember { mutableIntStateOf(0) }
+    var right by remember { mutableIntStateOf(0) }
+    var bottom by remember { mutableIntStateOf(0) }
+    var weight by remember { mutableFloatStateOf(2f) }
 
     LookaheadScope {
         Column(
-            Modifier
-                .fillMaxSize()
-                .clickable {
-                    height = Random.nextInt(10, 300)
-                    weight = Random
-                        .nextDouble(0.5, 4.5)
-                        .toFloat()
+            Modifier.fillMaxSize().clickable {
+                height = Random.nextInt(10, 300)
+                weight = Random.nextDouble(0.5, 4.5).toFloat()
 
-                    left = Random.nextInt(0, 200)
-                    top = Random.nextInt(0, 100)
-                    right = Random.nextInt(0, 200)
-                    bottom = Random.nextInt(0, 100)
-                }
+                left = Random.nextInt(0, 200)
+                top = Random.nextInt(0, 100)
+                right = Random.nextInt(0, 200)
+                bottom = Random.nextInt(0, 100)
+            }
         ) {
-            Box(
-                Modifier
-                    .fillMaxHeight(0.5f)
-                    .fillMaxSize()
-            ) {
+            Box(Modifier.fillMaxHeight(0.5f).fillMaxSize()) {
                 Box(
-                    Modifier
-                        .background(Color.Gray)
-                        .animateBounds(
-                            Modifier.padding(left.dp, top.dp, right.dp, bottom.dp)
-                        )
+                    Modifier.background(Color.Gray)
+                        .animateBounds(Modifier.padding(left.dp, top.dp, right.dp, bottom.dp))
                         .background(Color.Red)
                         .fillMaxSize()
                 )
             }
             Row(Modifier.fillMaxSize(), verticalAlignment = Alignment.CenterVertically) {
                 Box(
-                    Modifier
-                        .animateBounds(
-                            Modifier
-                                .weight(weight)
-                                .height(height.dp)
-                        )
+                    Modifier.animateBounds(Modifier.weight(weight).height(height.dp))
                         .background(Color(0xffa2d2ff), RoundedCornerShape(5.dp))
                 )
                 Box(
-                    Modifier
-                        .animateBounds(
-                            Modifier
-                                .weight(1f)
-                                .height(height.dp)
-                        )
+                    Modifier.animateBounds(Modifier.weight(1f).height(height.dp))
                         .background(Color(0xfffff3b0))
                 )
             }
diff --git a/compose/animation/animation/integration-tests/animation-demos/src/main/java/androidx/compose/animation/demos/lookahead/CraneDemo.kt b/compose/animation/animation/integration-tests/animation-demos/src/main/java/androidx/compose/animation/demos/lookahead/CraneDemo.kt
index ea680e2..821709b 100644
--- a/compose/animation/animation/integration-tests/animation-demos/src/main/java/androidx/compose/animation/demos/lookahead/CraneDemo.kt
+++ b/compose/animation/animation/integration-tests/animation-demos/src/main/java/androidx/compose/animation/demos/lookahead/CraneDemo.kt
@@ -71,8 +71,7 @@
     val avatar = remember {
         movableContentWithReceiverOf<SceneScope> {
             Box(
-                Modifier
-                    .sharedElementBasedOnProgress(progressProvider)
+                Modifier.sharedElementBasedOnProgress(progressProvider)
                     .background(Color(0xffff6f69), RoundedCornerShape(20))
                     .fillMaxSize()
             )
@@ -82,9 +81,9 @@
     val parent = remember {
         movableContentWithReceiverOf<SceneScope, @Composable () -> Unit> { child ->
             Surface(
-                modifier = Modifier
-                    .sharedElementBasedOnProgress(progressProvider)
-                    .background(Color(0xfffdedac)),
+                modifier =
+                    Modifier.sharedElementBasedOnProgress(progressProvider)
+                        .background(Color(0xfffdedac)),
                 color = Color(0xfffdedac),
                 shape = RoundedCornerShape(10.dp)
             ) {
@@ -93,22 +92,12 @@
         }
     }
 
-    Box(
-        Modifier
-            .fillMaxSize()
-            .padding(10.dp),
-        contentAlignment = Alignment.Center
-    ) {
+    Box(Modifier.fillMaxSize().padding(10.dp), contentAlignment = Alignment.Center) {
         SceneHost(Modifier.fillMaxSize()) {
             if (progressProvider.targetState) {
                 Box(Modifier.offset(100.dp, 150.dp)) {
                     parent {
-                        Box(
-                            Modifier
-                                .padding(10.dp)
-                                .wrapContentSize(Alignment.Center)
-                                .size(50.dp)
-                        ) {
+                        Box(Modifier.padding(10.dp).wrapContentSize(Alignment.Center).size(50.dp)) {
                             avatar()
                         }
                     }
@@ -116,42 +105,36 @@
             } else {
                 parent {
                     Column(Modifier.fillMaxSize()) {
-                        val alpha = produceState(0f) {
-                            animate(0f, 1f, animationSpec = tween(2000)) { value, _ ->
-                                this.value = value
-                            }
-                        }
-                        Box(
-                            Modifier
-                                .fillMaxWidth()
-                                .height(300.dp)
-                                .graphicsLayer {
-                                    this.alpha = alpha.value
+                        val alpha =
+                            produceState(0f) {
+                                animate(0f, 1f, animationSpec = tween(2000)) { value, _ ->
+                                    this.value = value
                                 }
-                                .background(Color.DarkGray)
-                                .animateContentSize())
+                            }
                         Box(
-                            Modifier
-                                .padding(10.dp)
-                                .size(60.dp)
-                        ) {
-                            avatar()
-                        }
+                            Modifier.fillMaxWidth()
+                                .height(300.dp)
+                                .graphicsLayer { this.alpha = alpha.value }
+                                .background(Color.DarkGray)
+                                .animateContentSize()
+                        )
+                        Box(Modifier.padding(10.dp).size(60.dp)) { avatar() }
                     }
                 }
             }
         }
         Box(
-            Modifier
-                .fillMaxHeight()
+            Modifier.fillMaxHeight()
                 .width(96.dp)
                 .background(Color(0x88CCCCCC))
                 .align(Alignment.CenterEnd)
                 .draggable(
-                    rememberDraggableState(onDelta = {
-                        progressProvider.progress =
-                            (-it / 300f + progressProvider.progress).coerceIn(0f, 1f)
-                    }),
+                    rememberDraggableState(
+                        onDelta = {
+                            progressProvider.progress =
+                                (-it / 300f + progressProvider.progress).coerceIn(0f, 1f)
+                        }
+                    ),
                     onDragStarted = {
                         progressProvider.targetState = !progressProvider.targetState
                         progressProvider.progress = 0f
@@ -190,28 +173,28 @@
 fun <T> Modifier.sharedElementBasedOnProgress(provider: ProgressProvider<T>) = composed {
     val sizeMap = remember { mutableMapOf<T, IntSize>() }
     val offsetMap = remember { mutableMapOf<T, Offset>() }
-    val calculateSize: (IntSize) -> IntSize =
-        {
-            sizeMap[provider.targetState] = it
-            val (width, height) = lerp(
+    val calculateSize: (IntSize) -> IntSize = {
+        sizeMap[provider.targetState] = it
+        val (width, height) =
+            lerp(
                 sizeMap[provider.initialState]!!.toSize(),
-                sizeMap[provider.targetState]!!.toSize(), provider.progress
+                sizeMap[provider.targetState]!!.toSize(),
+                provider.progress
             )
-            IntSize(width.roundToInt(), height.roundToInt())
-        }
+        IntSize(width.roundToInt(), height.roundToInt())
+    }
 
     val calculateOffset: Placeable.PlacementScope.(ApproachMeasureScope) -> IntOffset = {
         with(it) {
             coordinates?.let {
                 offsetMap[provider.targetState] =
-                    lookaheadScopeCoordinates.localLookaheadPositionOf(
-                        it
+                    lookaheadScopeCoordinates.localLookaheadPositionOf(it)
+                val lerpedOffset =
+                    lerp(
+                        offsetMap[provider.initialState]!!,
+                        offsetMap[provider.targetState]!!,
+                        provider.progress
                     )
-                val lerpedOffset = lerp(
-                    offsetMap[provider.initialState]!!,
-                    offsetMap[provider.targetState]!!,
-                    provider.progress
-                )
                 val currentOffset = lookaheadScopeCoordinates.localPositionOf(it, Offset.Zero)
                 (lerpedOffset - currentOffset).round()
             } ?: IntOffset(0, 0)
diff --git a/compose/animation/animation/integration-tests/animation-demos/src/main/java/androidx/compose/animation/demos/lookahead/LookaheadLayoutWithAlignmentLinesDemo.kt b/compose/animation/animation/integration-tests/animation-demos/src/main/java/androidx/compose/animation/demos/lookahead/LookaheadLayoutWithAlignmentLinesDemo.kt
index e4f7044..77e11ab 100644
--- a/compose/animation/animation/integration-tests/animation-demos/src/main/java/androidx/compose/animation/demos/lookahead/LookaheadLayoutWithAlignmentLinesDemo.kt
+++ b/compose/animation/animation/integration-tests/animation-demos/src/main/java/androidx/compose/animation/demos/lookahead/LookaheadLayoutWithAlignmentLinesDemo.kt
@@ -54,17 +54,10 @@
         horizontalAlignment = Alignment.CenterHorizontally
     ) {
         var horizontal by remember { mutableStateOf(true) }
-        Button({ horizontal = !horizontal }) {
-            Text("Toggle Layout")
-        }
+        Button({ horizontal = !horizontal }) { Text("Toggle Layout") }
         Spacer(Modifier.size(80.dp))
-        SceneHost(Modifier.padding(2.dp)
-            .drawBehind {
-                drawRect(
-                    color = Color.Red,
-                    style = Stroke(5f)
-                )
-            }
+        SceneHost(
+            Modifier.padding(2.dp).drawBehind { drawRect(color = Color.Red, style = Stroke(5f)) }
         ) {
             if (horizontal) {
                 Layout({
@@ -79,16 +72,15 @@
                             text = "!!",
                             fontSize = 50.sp,
                             color = Color.White,
-                            modifier = Modifier.alignByBaseline()
-                                .sharedElement()
-                                .background(color = Color(0xffffb900), RoundedCornerShape(10))
+                            modifier =
+                                Modifier.alignByBaseline()
+                                    .sharedElement()
+                                    .background(color = Color(0xffffb900), RoundedCornerShape(10))
                         )
                     }
                     Spacer(Modifier.fillMaxWidth().requiredHeight(1.dp).background(Color.Black))
                 }) { measurables, constraints ->
-                    val placeables = measurables.map {
-                        it.measure(constraints)
-                    }
+                    val placeables = measurables.map { it.measure(constraints) }
                     val row = placeables.first()
                     val position = row[FirstBaseline]
                     layout(row.width, row.height) {
@@ -115,8 +107,7 @@
         text = "Hello",
         fontSize = 80.sp,
         color = Color.White,
-        modifier = modifier
-            .background(color = Color(0xfff3722c), RoundedCornerShape(10))
+        modifier = modifier.background(color = Color(0xfff3722c), RoundedCornerShape(10))
     )
 }
 
@@ -126,8 +117,7 @@
         text = "World",
         color = Color.White,
         fontSize = 30.sp,
-        modifier = modifier
-            .background(color = Color(0xff90be6d), RoundedCornerShape(10))
+        modifier = modifier.background(color = Color(0xff90be6d), RoundedCornerShape(10))
     )
 }
 
@@ -139,18 +129,20 @@
                 text = "Hello",
                 fontSize = 80.sp,
                 color = Color.White,
-                modifier = modifier
-                    .sharedElement()
-                    .background(color = Color(0xfff3722c), RoundedCornerShape(10))
+                modifier =
+                    modifier
+                        .sharedElement()
+                        .background(color = Color(0xfff3722c), RoundedCornerShape(10))
             )
             Spacer(Modifier.size(10.dp))
             Text(
                 text = "World",
                 color = Color.White,
                 fontSize = 30.sp,
-                modifier = modifier
-                    .sharedElement()
-                    .background(color = Color(0xff90be6d), RoundedCornerShape(10))
+                modifier =
+                    modifier
+                        .sharedElement()
+                        .background(color = Color(0xff90be6d), RoundedCornerShape(10))
             )
         }
     }
diff --git a/compose/animation/animation/integration-tests/animation-demos/src/main/java/androidx/compose/animation/demos/lookahead/LookaheadWithAnimateItemPlacement.kt b/compose/animation/animation/integration-tests/animation-demos/src/main/java/androidx/compose/animation/demos/lookahead/LookaheadWithAnimateItemPlacement.kt
index 9e06d34..497d3ca 100644
--- a/compose/animation/animation/integration-tests/animation-demos/src/main/java/androidx/compose/animation/demos/lookahead/LookaheadWithAnimateItemPlacement.kt
+++ b/compose/animation/animation/integration-tests/animation-demos/src/main/java/androidx/compose/animation/demos/lookahead/LookaheadWithAnimateItemPlacement.kt
@@ -43,31 +43,25 @@
 @Preview
 @Composable
 fun LookaheadWithAnimateItem() {
-    val visible by produceState(true) {
-        while (true) {
-            delay(2000)
-            value = !value
+    val visible by
+        produceState(true) {
+            while (true) {
+                delay(2000)
+                value = !value
+            }
         }
-    }
     LookaheadScope {
         LazyColumn(Modifier.padding(20.dp)) {
             items(3, key = { it }) {
                 Column(
-                    Modifier
-                        .animateItem()
+                    Modifier.animateItem()
                         .clip(RoundedCornerShape(15.dp))
                         .background(turquoiseColors[it])
-
                 ) {
-                    Box(
-                        Modifier
-                            .requiredHeight(ItemSize.dp)
-                            .fillMaxWidth()
-                    )
+                    Box(Modifier.requiredHeight(ItemSize.dp).fillMaxWidth())
                     AnimatedVisibility(visible = visible) {
                         Box(
-                            Modifier
-                                .requiredHeight(ItemSize.dp)
+                            Modifier.requiredHeight(ItemSize.dp)
                                 .fillMaxWidth()
                                 .background(Color.White)
                         )
@@ -78,5 +72,4 @@
     }
 }
 
-@Suppress("ConstPropertyName")
-private const val ItemSize = 100
+@Suppress("ConstPropertyName") private const val ItemSize = 100
diff --git a/compose/animation/animation/integration-tests/animation-demos/src/main/java/androidx/compose/animation/demos/lookahead/LookaheadWithAnimatedContentSize.kt b/compose/animation/animation/integration-tests/animation-demos/src/main/java/androidx/compose/animation/demos/lookahead/LookaheadWithAnimatedContentSize.kt
index b245565..7d58661 100644
--- a/compose/animation/animation/integration-tests/animation-demos/src/main/java/androidx/compose/animation/demos/lookahead/LookaheadWithAnimatedContentSize.kt
+++ b/compose/animation/animation/integration-tests/animation-demos/src/main/java/androidx/compose/animation/demos/lookahead/LookaheadWithAnimatedContentSize.kt
@@ -39,44 +39,26 @@
 @OptIn(ExperimentalComposeUiApi::class)
 @Composable
 fun LookaheadWithAnimatedContentSize() {
-    val expanded by produceState(initialValue = true) {
-        while (true) {
-            delay(3000)
-            value = !value
+    val expanded by
+        produceState(initialValue = true) {
+            while (true) {
+                delay(3000)
+                value = !value
+            }
         }
-    }
     LookaheadScope {
         Column {
             Column(
-                Modifier
-                    .then(
-                        if (expanded) Modifier.fillMaxWidth() else Modifier
-                    )
+                Modifier.then(if (expanded) Modifier.fillMaxWidth() else Modifier)
                     .animateContentSize()
                     .zIndex(2f)
             ) {
-                Box(
-                    Modifier
-                        .fillMaxWidth()
-                        .height(100.dp)
-                        .background(pastelColors[0])
-                )
+                Box(Modifier.fillMaxWidth().height(100.dp).background(pastelColors[0]))
                 if (expanded) {
-                    Box(
-                        Modifier
-                            .fillMaxWidth()
-                            .height(200.dp)
-                            .background(Color.White)
-                    )
+                    Box(Modifier.fillMaxWidth().height(200.dp).background(Color.White))
                 }
             }
-            Box(
-                Modifier
-                    .animateBounds()
-                    .fillMaxWidth()
-                    .height(100.dp)
-                    .background(pastelColors[1])
-            )
+            Box(Modifier.animateBounds().fillMaxWidth().height(100.dp).background(pastelColors[1]))
         }
     }
 }
diff --git a/compose/animation/animation/integration-tests/animation-demos/src/main/java/androidx/compose/animation/demos/lookahead/LookaheadWithBoxWithConstraints.kt b/compose/animation/animation/integration-tests/animation-demos/src/main/java/androidx/compose/animation/demos/lookahead/LookaheadWithBoxWithConstraints.kt
index 22289de..26f68f2 100644
--- a/compose/animation/animation/integration-tests/animation-demos/src/main/java/androidx/compose/animation/demos/lookahead/LookaheadWithBoxWithConstraints.kt
+++ b/compose/animation/animation/integration-tests/animation-demos/src/main/java/androidx/compose/animation/demos/lookahead/LookaheadWithBoxWithConstraints.kt
@@ -56,19 +56,11 @@
         LookaheadScope {
             Column {
                 var halfSize by remember { mutableStateOf(false) }
-                Button(
-                    onClick = { halfSize = !halfSize },
-                    Modifier
-                        .padding(20.dp)
-                        .fillMaxWidth()
-                ) {
-                    Text(
-                        if (halfSize) "Full Size" else "Half Size"
-                    )
+                Button(onClick = { halfSize = !halfSize }, Modifier.padding(20.dp).fillMaxWidth()) {
+                    Text(if (halfSize) "Full Size" else "Half Size")
                 }
                 Column(
-                    Modifier
-                        .fillMaxHeight()
+                    Modifier.fillMaxHeight()
                         .animateBounds(
                             if (halfSize) Modifier.fillMaxSize(0.5f) else Modifier.fillMaxWidth()
                         )
@@ -76,8 +68,7 @@
                     verticalArrangement = Arrangement.SpaceEvenly
                 ) {
                     Column(
-                        Modifier
-                            .border(1.dp, Color.Black, RoundedCornerShape(5.dp))
+                        Modifier.border(1.dp, Color.Black, RoundedCornerShape(5.dp))
                             .padding(top = 20.dp, bottom = 20.dp)
                     ) {
                         Text("Regular Row: ")
@@ -91,7 +82,8 @@
                     }
                     Column {
                         var animate by remember { mutableStateOf(false) }
-                        Row(verticalAlignment = Alignment.CenterVertically,
+                        Row(
+                            verticalAlignment = Alignment.CenterVertically,
                             modifier = Modifier.clickable { animate = true }
                         ) {
                             RadioButton(selected = animate, onClick = { animate = true })
@@ -107,14 +99,14 @@
                         BoxWithConstraints {
                             Column(
                                 if (animate) {
-                                    Modifier.animateBounds(Modifier.fillMaxWidth())
-                                } else {
-                                    Modifier.fillMaxWidth()
-                                }.then(
-                                    Modifier
-                                        .border(1.dp, Color.Black, RoundedCornerShape(5.dp))
-                                        .padding(top = 20.dp, bottom = 20.dp)
-                                ),
+                                        Modifier.animateBounds(Modifier.fillMaxWidth())
+                                    } else {
+                                        Modifier.fillMaxWidth()
+                                    }
+                                    .then(
+                                        Modifier.border(1.dp, Color.Black, RoundedCornerShape(5.dp))
+                                            .padding(top = 20.dp, bottom = 20.dp)
+                                    ),
                             ) {
                                 Text("SubcomposeLayout: ")
                                 Row(
@@ -153,11 +145,11 @@
 @Composable
 fun RowScope.MyButton() {
     Box(
-        modifier = Modifier
-            .weight(1f)
-            .padding(5.dp)
-            .height(40.dp)
-            .background(pastelColors[0], RoundedCornerShape(50)),
+        modifier =
+            Modifier.weight(1f)
+                .padding(5.dp)
+                .height(40.dp)
+                .background(pastelColors[0], RoundedCornerShape(50)),
         contentAlignment = Alignment.Center
     ) {
         Text("Button")
@@ -167,11 +159,11 @@
 @Composable
 fun MyButton() {
     Box(
-        modifier = Modifier
-            .fillMaxWidth(0.5f)
-            .padding(5.dp)
-            .height(40.dp)
-            .background(pastelColors[0], RoundedCornerShape(50)),
+        modifier =
+            Modifier.fillMaxWidth(0.5f)
+                .padding(5.dp)
+                .height(40.dp)
+                .background(pastelColors[0], RoundedCornerShape(50)),
         contentAlignment = Alignment.Center
     ) {
         Text("Button")
diff --git a/compose/animation/animation/integration-tests/animation-demos/src/main/java/androidx/compose/animation/demos/lookahead/LookaheadWithDisappearingMoveableContentDemo.kt b/compose/animation/animation/integration-tests/animation-demos/src/main/java/androidx/compose/animation/demos/lookahead/LookaheadWithDisappearingMoveableContentDemo.kt
index db9f9b9..6aa4a50 100644
--- a/compose/animation/animation/integration-tests/animation-demos/src/main/java/androidx/compose/animation/demos/lookahead/LookaheadWithDisappearingMoveableContentDemo.kt
+++ b/compose/animation/animation/integration-tests/animation-demos/src/main/java/androidx/compose/animation/demos/lookahead/LookaheadWithDisappearingMoveableContentDemo.kt
@@ -63,38 +63,24 @@
 @Composable
 fun LookaheadWithDisappearingMovableContentDemo() {
     LookaheadScope {
-        val isCompact by produceState(initialValue = false) {
-            while (true) {
-                delay(3000)
-                value = !value
+        val isCompact by
+            produceState(initialValue = false) {
+                while (true) {
+                    delay(3000)
+                    value = !value
+                }
             }
-        }
         Column {
-
-            Box(
-                Modifier
-                    .padding(start = 50.dp, top = 200.dp, bottom = 100.dp)
-            ) {
-                val icon = remember {
-                    movableContentOf<Boolean> {
-                        MyIcon(it)
-                    }
-                }
+            Box(Modifier.padding(start = 50.dp, top = 200.dp, bottom = 100.dp)) {
+                val icon = remember { movableContentOf<Boolean> { MyIcon(it) } }
                 val title = remember {
-                    movableContentOf<Boolean> {
-                        Title(visible = it, Modifier.animatePosition())
-                    }
+                    movableContentOf<Boolean> { Title(visible = it, Modifier.animatePosition()) }
                 }
-                val details = remember {
-                    movableContentOf<Boolean> {
-                        Details(visible = it)
-                    }
-                }
+                val details = remember { movableContentOf<Boolean> { Details(visible = it) } }
 
                 Row(
-                    Modifier
-                        .background(Color.Yellow)
-                        .animateContentSize(), verticalAlignment = Alignment.CenterVertically
+                    Modifier.background(Color.Yellow).animateContentSize(),
+                    verticalAlignment = Alignment.CenterVertically
                 ) {
                     if (isCompact) {
                         icon(true)
@@ -123,11 +109,7 @@
         exit = fadeOut() + slideOutHorizontally { -it },
         modifier = modifier
     ) {
-        Box(
-            modifier
-                .size(40.dp)
-                .background(color = Color.Red, CircleShape)
-        )
+        Box(modifier.size(40.dp).background(color = Color.Red, CircleShape))
     }
 }
 
@@ -141,7 +123,8 @@
 @Composable
 fun Details(visible: Boolean, modifier: Modifier = Modifier) {
     AnimatedVisibility(
-        visible, enter = fadeIn(),
+        visible,
+        enter = fadeIn(),
         exit = fadeOut() + slideOutVertically { it },
         modifier = modifier
     ) {
@@ -153,16 +136,13 @@
 @OptIn(ExperimentalAnimatableApi::class)
 @SuppressLint("UnnecessaryComposedModifier")
 fun Modifier.animatePosition(): Modifier = composed {
-    val offsetAnimation = remember {
-        DeferredTargetAnimation(IntOffset.VectorConverter)
-    }
+    val offsetAnimation = remember { DeferredTargetAnimation(IntOffset.VectorConverter) }
     val coroutineScope = rememberCoroutineScope()
-    this.approachLayout(isMeasurementApproachInProgress = { false },
+    this.approachLayout(
+        isMeasurementApproachInProgress = { false },
         isPlacementApproachInProgress = {
             offsetAnimation.updateTarget(
-                lookaheadScopeCoordinates.localLookaheadPositionOf(
-                    it
-                ).round(),
+                lookaheadScopeCoordinates.localLookaheadPositionOf(it).round(),
                 coroutineScope,
                 spring(stiffness = Spring.StiffnessMediumLow)
             )
@@ -174,18 +154,13 @@
                 val (x, y) =
                     coordinates?.let { coordinates ->
                         val origin = this.lookaheadScopeCoordinates
-                        val animOffset = offsetAnimation.updateTarget(
-                            origin.localLookaheadPositionOf(
-                                coordinates
-                            ).round(),
-                            coroutineScope,
-                            spring(stiffness = Spring.StiffnessMediumLow),
-                        )
-                        val currentOffset =
-                            origin.localPositionOf(
-                                coordinates,
-                                Offset.Zero
+                        val animOffset =
+                            offsetAnimation.updateTarget(
+                                origin.localLookaheadPositionOf(coordinates).round(),
+                                coroutineScope,
+                                spring(stiffness = Spring.StiffnessMediumLow),
                             )
+                        val currentOffset = origin.localPositionOf(coordinates, Offset.Zero)
                         animOffset - currentOffset.round()
                     } ?: IntOffset.Zero
                 place(x, y)
diff --git a/compose/animation/animation/integration-tests/animation-demos/src/main/java/androidx/compose/animation/demos/lookahead/LookaheadWithFlowRowDemo.kt b/compose/animation/animation/integration-tests/animation-demos/src/main/java/androidx/compose/animation/demos/lookahead/LookaheadWithFlowRowDemo.kt
index 484f77a..f48eb8b 100644
--- a/compose/animation/animation/integration-tests/animation-demos/src/main/java/androidx/compose/animation/demos/lookahead/LookaheadWithFlowRowDemo.kt
+++ b/compose/animation/animation/integration-tests/animation-demos/src/main/java/androidx/compose/animation/demos/lookahead/LookaheadWithFlowRowDemo.kt
@@ -57,51 +57,37 @@
 @OptIn(ExperimentalComposeUiApi::class, ExperimentalLayoutApi::class)
 @Composable
 fun LookaheadWithFlowRowDemo() {
-    Column(
-        modifier = Modifier.padding(10.dp),
-        horizontalAlignment = Alignment.CenterHorizontally
-    ) {
+    Column(modifier = Modifier.padding(10.dp), horizontalAlignment = Alignment.CenterHorizontally) {
         var isHorizontal by remember { mutableStateOf(true) }
 
-        Button(modifier = Modifier.padding(top = 20.dp, bottom = 20.dp),
-            onClick = { isHorizontal = !isHorizontal }) {
+        Button(
+            modifier = Modifier.padding(top = 20.dp, bottom = 20.dp),
+            onClick = { isHorizontal = !isHorizontal }
+        ) {
             Text("Toggle")
         }
-        Column(
-            Modifier
-                .background(Color(0xfffdedac), RoundedCornerShape(10))
-                .padding(10.dp)
-        ) {
+        Column(Modifier.background(Color(0xfffdedac), RoundedCornerShape(10)).padding(10.dp)) {
             Text("LookaheadScope + Modifier.animateBounds")
             LookaheadScope {
                 FlowRow(
-                    modifier = Modifier
-                        .height(200.dp)
-                        .fillMaxWidth()
-                        .wrapContentSize(Alignment.CenterStart)
+                    modifier =
+                        Modifier.height(200.dp)
+                            .fillMaxWidth()
+                            .wrapContentSize(Alignment.CenterStart)
                 ) {
                     Box(
-                        Modifier
-                            .height(50.dp)
-                            .animateBounds(
-                                Modifier.fillMaxWidth(if (isHorizontal) 0.4f else 1f)
-                            )
+                        Modifier.height(50.dp)
+                            .animateBounds(Modifier.fillMaxWidth(if (isHorizontal) 0.4f else 1f))
                             .background(colors[0], RoundedCornerShape(10))
                     )
                     Box(
-                        Modifier
-                            .height(50.dp)
-                            .animateBounds(
-                                Modifier.fillMaxWidth(if (isHorizontal) 0.2f else 0.4f)
-                            )
+                        Modifier.height(50.dp)
+                            .animateBounds(Modifier.fillMaxWidth(if (isHorizontal) 0.2f else 0.4f))
                             .background(colors[1], RoundedCornerShape(10))
                     )
                     Box(
-                        Modifier
-                            .height(50.dp)
-                            .animateBounds(
-                                Modifier.fillMaxWidth(if (isHorizontal) 0.2f else 0.4f)
-                            )
+                        Modifier.height(50.dp)
+                            .animateBounds(Modifier.fillMaxWidth(if (isHorizontal) 0.2f else 0.4f))
                             .background(colors[2], RoundedCornerShape(10))
                     )
                 }
@@ -111,33 +97,24 @@
 
         Spacer(Modifier.size(50.dp))
 
-        Column(
-            Modifier
-                .background(Color(0xfffdedac), RoundedCornerShape(10))
-                .padding(10.dp)
-        ) {
+        Column(Modifier.background(Color(0xfffdedac), RoundedCornerShape(10)).padding(10.dp)) {
             Text("Animating Width")
             FlowRow(
-                modifier = Modifier
-                    .height(200.dp)
-                    .fillMaxWidth()
-                    .wrapContentSize(Alignment.CenterStart)
+                modifier =
+                    Modifier.height(200.dp).fillMaxWidth().wrapContentSize(Alignment.CenterStart)
             ) {
                 Box(
-                    Modifier
-                        .height(50.dp)
+                    Modifier.height(50.dp)
                         .fillMaxWidth(animateFloatAsState(if (isHorizontal) 0.4f else 1f).value)
                         .background(colors[0], RoundedCornerShape(10))
                 )
                 Box(
-                    Modifier
-                        .height(50.dp)
+                    Modifier.height(50.dp)
                         .fillMaxWidth(animateFloatAsState(if (isHorizontal) 0.2f else 0.4f).value)
                         .background(colors[1], RoundedCornerShape(10))
                 )
                 Box(
-                    Modifier
-                        .height(50.dp)
+                    Modifier.height(50.dp)
                         .fillMaxWidth(animateFloatAsState(if (isHorizontal) 0.2f else 0.4f).value)
                         .background(colors[2], RoundedCornerShape(10))
                 )
@@ -157,58 +134,43 @@
             verticalArrangement = Arrangement.Center,
             maxItemsInEachRow = 3
         ) {
-            var expanded by remember {
-                mutableStateOf(false)
-            }
+            var expanded by remember { mutableStateOf(false) }
             Box(
-                modifier = Modifier
-                    .animateBounds(Modifier.widthIn(max = 600.dp))
-                    .background(Color.Red)
+                modifier =
+                    Modifier.animateBounds(Modifier.widthIn(max = 600.dp)).background(Color.Red)
             ) {
                 val height = animateDpAsState(targetValue = if (expanded) 500.dp else 300.dp)
                 Box(
-                    modifier = Modifier
-                        .animateBounds(
-                            Modifier
-                                .fillMaxWidth()
-                                .height(height.value)
-                        )
-                        .clickable {
-                            expanded = !expanded
-                        })
+                    modifier =
+                        Modifier.animateBounds(Modifier.fillMaxWidth().height(height.value))
+                            .clickable { expanded = !expanded }
+                )
             }
 
-            FlowColumn(Modifier.layout { measurable, constraints ->
-                measurable.measure(constraints).run {
-                    layout(width, height) {
-                        place(0, 0)
-                    }
+            FlowColumn(
+                Modifier.layout { measurable, constraints ->
+                    measurable.measure(constraints).run { layout(width, height) { place(0, 0) } }
                 }
-            }) {
+            ) {
                 Box(
-                    modifier = Modifier
-                        .size(200.dp)
-                        .animateBounds(
-                            Modifier
-                                .wrapContentWidth()
-                                .heightIn(min = 156.dp),
-                            debug = true
-
-                        )
-                        .background(Color.Blue)
+                    modifier =
+                        Modifier.size(200.dp)
+                            .animateBounds(
+                                Modifier.wrapContentWidth().heightIn(min = 156.dp),
+                                debug = true
+                            )
+                            .background(Color.Blue)
                 ) {
                     Box(modifier = Modifier.size(200.dp))
                 }
                 Box(
-                    modifier = Modifier
-                        .size(200.dp)
-                        .animateBounds(
-                            Modifier
-                                .wrapContentWidth()
-                                .heightIn(min = 156.dp),
-                            debug = true
-                        )
-                        .background(Color.Yellow)
+                    modifier =
+                        Modifier.size(200.dp)
+                            .animateBounds(
+                                Modifier.wrapContentWidth().heightIn(min = 156.dp),
+                                debug = true
+                            )
+                            .background(Color.Yellow)
                 ) {
                     Box(modifier = Modifier.size(200.dp))
                 }
@@ -217,9 +179,5 @@
     }
 }
 
-private val colors = listOf(
-    Color(0xffff6f69),
-    Color(0xffffcc5c),
-    Color(0xff2a9d84),
-    Color(0xff264653)
-)
+private val colors =
+    listOf(Color(0xffff6f69), Color(0xffffcc5c), Color(0xff2a9d84), Color(0xff264653))
diff --git a/compose/animation/animation/integration-tests/animation-demos/src/main/java/androidx/compose/animation/demos/lookahead/LookaheadWithIntrinsicsDemo.kt b/compose/animation/animation/integration-tests/animation-demos/src/main/java/androidx/compose/animation/demos/lookahead/LookaheadWithIntrinsicsDemo.kt
index c5069be..133b93a5 100644
--- a/compose/animation/animation/integration-tests/animation-demos/src/main/java/androidx/compose/animation/demos/lookahead/LookaheadWithIntrinsicsDemo.kt
+++ b/compose/animation/animation/integration-tests/animation-demos/src/main/java/androidx/compose/animation/demos/lookahead/LookaheadWithIntrinsicsDemo.kt
@@ -51,21 +51,21 @@
         LookaheadScope {
             var isWide by remember { mutableStateOf(true) }
             Column {
-                Button(modifier = Modifier.padding(top = 20.dp, bottom = 20.dp),
-                    onClick = { isWide = !isWide }) {
+                Button(
+                    modifier = Modifier.padding(top = 20.dp, bottom = 20.dp),
+                    onClick = { isWide = !isWide }
+                ) {
                     Text("Toggle")
                 }
                 Text("IntrinsicSize.Min Column")
                 Spacer(Modifier.size(5.dp))
                 Column(
-                    Modifier
-                        .background(Color(0xfffdedac), RoundedCornerShape(10))
+                    Modifier.background(Color(0xfffdedac), RoundedCornerShape(10))
                         .padding(20.dp)
                         .width(IntrinsicSize.Min)
                 ) {
                     Box(
-                        Modifier
-                            .animateBounds(
+                        Modifier.animateBounds(
                                 if (isWide) Modifier.width(300.dp) else Modifier.width(150.dp)
                             )
                             .height(50.dp)
@@ -73,20 +73,10 @@
                     ) {
                         Text("Width: ${if (isWide) 300 else 150}.dp")
                     }
-                    Box(
-                        modifier = Modifier
-                            .fillMaxWidth()
-                            .height(50.dp)
-                            .background(colors[2])
-                    ) {
+                    Box(modifier = Modifier.fillMaxWidth().height(50.dp).background(colors[2])) {
                         Text("Match parent")
                     }
-                    Box(
-                        modifier = Modifier
-                            .fillMaxWidth()
-                            .height(50.dp)
-                            .background(colors[3])
-                    ) {
+                    Box(modifier = Modifier.fillMaxWidth().height(50.dp).background(colors[3])) {
                         Text("Match parent", color = Color.White)
                     }
                 }
@@ -107,21 +97,13 @@
     // the divider to use the same height.
     Box {
         Row(Modifier.height(IntrinsicSize.Min)) {
+            Text(text = "This is a really short text", modifier = Modifier.fillMaxHeight())
+            Box(Modifier.width(1.dp).fillMaxHeight().background(Color.Black))
             Text(
-                text = "This is a really short text",
-                modifier = Modifier
-                    .fillMaxHeight()
-            )
-            Box(
-                Modifier
-                    .width(1.dp)
-                    .fillMaxHeight()
-                    .background(Color.Black))
-            Text(
-                text = "This is a much much much much much much much much much much" +
-                    " much much much much much much longer text",
-                modifier = Modifier
-                    .fillMaxHeight()
+                text =
+                    "This is a much much much much much much much much much much" +
+                        " much much much much much much longer text",
+                modifier = Modifier.fillMaxHeight()
             )
         }
     }
@@ -138,28 +120,12 @@
     // force the Boxs to use the same width.
 
     Box {
-        Column(
-            Modifier
-                .width(IntrinsicSize.Min)
-                .fillMaxHeight()) {
-            Box(
-                Modifier
-                    .fillMaxWidth()
-                    .background(Color.Gray)) {
-                Text("Short text")
-            }
-            Box(
-                Modifier
-                    .fillMaxWidth()
-                    .background(Color.Blue)) {
+        Column(Modifier.width(IntrinsicSize.Min).fillMaxHeight()) {
+            Box(Modifier.fillMaxWidth().background(Color.Gray)) { Text("Short text") }
+            Box(Modifier.fillMaxWidth().background(Color.Blue)) {
                 Text("Extremely long text giving the width of its siblings")
             }
-            Box(
-                Modifier
-                    .fillMaxWidth()
-                    .background(Color.Magenta)) {
-                Text("Medium length text")
-            }
+            Box(Modifier.fillMaxWidth().background(Color.Magenta)) { Text("Medium length text") }
         }
     }
 }
@@ -176,33 +142,14 @@
     // will force the aspectRatios and the divider to use the same height.
     //
     Box {
-        Row(
-            Modifier
-                .fillMaxWidth()
-                .height(IntrinsicSize.Max)) {
+        Row(Modifier.fillMaxWidth().height(IntrinsicSize.Max)) {
             val modifier = Modifier
-            Box(
-                modifier
-                    .width(160.dp)
-                    .aspectRatio(2f)
-                    .background(Color.Gray))
-            Box(
-                Modifier
-                    .width(1.dp)
-                    .fillMaxHeight()
-                    .background(Color.Black))
-            Box(
-                modifier
-                    .widthIn(120.dp, 200.dp)
-                    .aspectRatio(1f)
-                    .background(Color.Blue))
+            Box(modifier.width(160.dp).aspectRatio(2f).background(Color.Gray))
+            Box(Modifier.width(1.dp).fillMaxHeight().background(Color.Black))
+            Box(modifier.widthIn(120.dp, 200.dp).aspectRatio(1f).background(Color.Blue))
         }
     }
 }
 
-private val colors = listOf(
-    Color(0xffff6f69),
-    Color(0xffffcc5c),
-    Color(0xff2a9d84),
-    Color(0xff264653)
-)
+private val colors =
+    listOf(Color(0xffff6f69), Color(0xffffcc5c), Color(0xff2a9d84), Color(0xff264653))
diff --git a/compose/animation/animation/integration-tests/animation-demos/src/main/java/androidx/compose/animation/demos/lookahead/LookaheadWithLazyColumn.kt b/compose/animation/animation/integration-tests/animation-demos/src/main/java/androidx/compose/animation/demos/lookahead/LookaheadWithLazyColumn.kt
index 8fdbd52..19508e3 100644
--- a/compose/animation/animation/integration-tests/animation-demos/src/main/java/androidx/compose/animation/demos/lookahead/LookaheadWithLazyColumn.kt
+++ b/compose/animation/animation/integration-tests/animation-demos/src/main/java/androidx/compose/animation/demos/lookahead/LookaheadWithLazyColumn.kt
@@ -66,25 +66,20 @@
                 val index = it % 4
                 var expanded by rememberSaveable { mutableStateOf(false) }
                 AnimatedVisibility(
-                    remember { MutableTransitionState(false) }
-                        .apply { targetState = true },
+                    remember { MutableTransitionState(false) }.apply { targetState = true },
                     enter = slideInHorizontally { 20 } + fadeIn()
                 ) {
-                    Surface(shape = RoundedCornerShape(10.dp),
+                    Surface(
+                        shape = RoundedCornerShape(10.dp),
                         color = pastelColors[index],
-                        modifier = Modifier
-                            .fillMaxWidth()
-                            .clickable {
-                                expanded = !expanded
-                            }) {
+                        modifier = Modifier.fillMaxWidth().clickable { expanded = !expanded }
+                    ) {
                         LookaheadScope {
                             val title = remember {
                                 movableContentOf {
                                     Text(
                                         names[index],
-                                        Modifier
-                                            .padding(20.dp)
-                                            .animateBounds(Modifier)
+                                        Modifier.padding(20.dp).animateBounds(Modifier)
                                     )
                                 }
                             }
@@ -94,38 +89,37 @@
                                         Image(
                                             painter = painterResource(res[index]),
                                             contentDescription = null,
-                                            modifier = Modifier
-                                                .padding(10.dp)
-                                                .animateBounds(
-                                                    if (expanded)
-                                                        Modifier.fillMaxWidth()
-                                                    else
-                                                        Modifier.size(80.dp),
-                                                    spring(stiffness = Spring.StiffnessLow)
-                                                )
-                                                .clip(RoundedCornerShape(5.dp)),
-                                            contentScale = if (expanded) {
-                                                ContentScale.FillWidth
-                                            } else {
-                                                ContentScale.Crop
-                                            }
+                                            modifier =
+                                                Modifier.padding(10.dp)
+                                                    .animateBounds(
+                                                        if (expanded) Modifier.fillMaxWidth()
+                                                        else Modifier.size(80.dp),
+                                                        spring(stiffness = Spring.StiffnessLow)
+                                                    )
+                                                    .clip(RoundedCornerShape(5.dp)),
+                                            contentScale =
+                                                if (expanded) {
+                                                    ContentScale.FillWidth
+                                                } else {
+                                                    ContentScale.Crop
+                                                }
                                         )
                                     }
                                 } else {
                                     movableContentOf {
                                         Box(
-                                            modifier = Modifier
-                                                .padding(10.dp)
-                                                .animateBounds(
-                                                    if (expanded) Modifier
-                                                        .fillMaxWidth()
-                                                        .aspectRatio(1f)
-                                                    else Modifier.size(80.dp),
-                                                    spring(stiffness = Spring.StiffnessLow)
-                                                )
-                                                .background(
-                                                    Color.LightGray, RoundedCornerShape(5.dp)
-                                                ),
+                                            modifier =
+                                                Modifier.padding(10.dp)
+                                                    .animateBounds(
+                                                        if (expanded)
+                                                            Modifier.fillMaxWidth().aspectRatio(1f)
+                                                        else Modifier.size(80.dp),
+                                                        spring(stiffness = Spring.StiffnessLow)
+                                                    )
+                                                    .background(
+                                                        Color.LightGray,
+                                                        RoundedCornerShape(5.dp)
+                                                    ),
                                         )
                                     }
                                 }
@@ -150,8 +144,9 @@
 }
 
 val names = listOf("YT", "Pepper", "Waffle", "Who?")
-val res = listOf(
-    R.drawable.yt_profile,
-    R.drawable.pepper,
-    R.drawable.waffle,
-)
+val res =
+    listOf(
+        R.drawable.yt_profile,
+        R.drawable.pepper,
+        R.drawable.waffle,
+    )
diff --git a/compose/animation/animation/integration-tests/animation-demos/src/main/java/androidx/compose/animation/demos/lookahead/LookaheadWithMovableContentDemo.kt b/compose/animation/animation/integration-tests/animation-demos/src/main/java/androidx/compose/animation/demos/lookahead/LookaheadWithMovableContentDemo.kt
index 3a06425..f38e700 100644
--- a/compose/animation/animation/integration-tests/animation-demos/src/main/java/androidx/compose/animation/demos/lookahead/LookaheadWithMovableContentDemo.kt
+++ b/compose/animation/animation/integration-tests/animation-demos/src/main/java/androidx/compose/animation/demos/lookahead/LookaheadWithMovableContentDemo.kt
@@ -64,26 +64,24 @@
 @Preview
 @Composable
 fun LookaheadWithMovableContentDemo() {
-    Column(
-        horizontalAlignment = Alignment.CenterHorizontally
-    ) {
+    Column(horizontalAlignment = Alignment.CenterHorizontally) {
         var isSingleColumn by remember { mutableStateOf(true) }
 
         Column(
-            Modifier
-                .padding(100.dp)
-                .fillMaxWidth(),
+            Modifier.padding(100.dp).fillMaxWidth(),
             horizontalAlignment = Alignment.CenterHorizontally
         ) {
-            Row(modifier = Modifier.clickable {
-                isSingleColumn = true
-            }, verticalAlignment = Alignment.CenterVertically) {
+            Row(
+                modifier = Modifier.clickable { isSingleColumn = true },
+                verticalAlignment = Alignment.CenterVertically
+            ) {
                 RadioButton(isSingleColumn, { isSingleColumn = true })
                 Text("Single Column")
             }
-            Row(modifier = Modifier.clickable {
-                isSingleColumn = false
-            }, verticalAlignment = Alignment.CenterVertically) {
+            Row(
+                modifier = Modifier.clickable { isSingleColumn = false },
+                verticalAlignment = Alignment.CenterVertically
+            ) {
                 RadioButton(!isSingleColumn, { isSingleColumn = false })
                 Text("Double Column")
             }
@@ -93,8 +91,7 @@
             colors.mapIndexed { id, color ->
                 movableContentWithReceiverOf<LookaheadScope, Float> { weight ->
                     Box(
-                        Modifier
-                            .padding(15.dp)
+                        Modifier.padding(15.dp)
                             .height(80.dp)
                             .fillMaxWidth(weight)
                             .animateBoundsInScope()
@@ -103,19 +100,25 @@
                     ) {
                         when (id) {
                             0 -> CircularProgressIndicator(color = Color.White)
-                            1 -> Box(Modifier.graphicsLayer {
-                                scaleX = 0.5f
-                                scaleY = 0.5f
-                                translationX = 100f
-                            }) {
-                                AnimatedDotsDemo()
-                            }
-
-                            2 -> Box(Modifier.graphicsLayer {
-                                scaleX = 0.5f
-                                scaleY = 0.5f
-                            }) { InfinitePulsingHeart() }
-
+                            1 ->
+                                Box(
+                                    Modifier.graphicsLayer {
+                                        scaleX = 0.5f
+                                        scaleY = 0.5f
+                                        translationX = 100f
+                                    }
+                                ) {
+                                    AnimatedDotsDemo()
+                                }
+                            2 ->
+                                Box(
+                                    Modifier.graphicsLayer {
+                                        scaleX = 0.5f
+                                        scaleY = 0.5f
+                                    }
+                                ) {
+                                    InfinitePulsingHeart()
+                                }
                             else -> InfiniteProgress()
                         }
                     }
@@ -129,9 +132,7 @@
                         Modifier.fillMaxSize(),
                         horizontalAlignment = Alignment.CenterHorizontally
                     ) {
-                        items.forEach {
-                            it(0.8f)
-                        }
+                        items.forEach { it(0.8f) }
                     }
                 } else {
                     Row {
@@ -156,7 +157,7 @@
     }
 }
 
-context (LookaheadScope)
+context(LookaheadScope)
 @OptIn(ExperimentalAnimatableApi::class)
 fun Modifier.animateBoundsInScope(): Modifier = composed {
     val sizeAnim = remember { DeferredTargetAnimation(IntSize.VectorConverter) }
@@ -173,34 +174,20 @@
             !offsetAnim.isIdle
         }
     ) { measurable, _ ->
-        val (animWidth, animHeight) = sizeAnim.updateTarget(
-            lookaheadSize,
-            scope,
-            spring()
-        )
-        measurable.measure(Constraints.fixed(animWidth, animHeight))
-            .run {
-                layout(width, height) {
-                    coordinates?.let {
-                        val target =
-                            lookaheadScopeCoordinates.localLookaheadPositionOf(it)
-                                .round()
-                        val animOffset = offsetAnim.updateTarget(target, scope, spring())
-                        val current = lookaheadScopeCoordinates.localPositionOf(
-                            it,
-                            Offset.Zero
-                        ).round()
-                        val (x, y) = animOffset - current
-                        place(x, y)
-                    } ?: place(0, 0)
-                }
+        val (animWidth, animHeight) = sizeAnim.updateTarget(lookaheadSize, scope, spring())
+        measurable.measure(Constraints.fixed(animWidth, animHeight)).run {
+            layout(width, height) {
+                coordinates?.let {
+                    val target = lookaheadScopeCoordinates.localLookaheadPositionOf(it).round()
+                    val animOffset = offsetAnim.updateTarget(target, scope, spring())
+                    val current = lookaheadScopeCoordinates.localPositionOf(it, Offset.Zero).round()
+                    val (x, y) = animOffset - current
+                    place(x, y)
+                } ?: place(0, 0)
             }
+        }
     }
 }
 
-private val colors = listOf(
-    Color(0xffff6f69),
-    Color(0xffffcc5c),
-    Color(0xff264653),
-    Color(0xff2a9d84)
-)
+private val colors =
+    listOf(Color(0xffff6f69), Color(0xffffcc5c), Color(0xff264653), Color(0xff2a9d84))
diff --git a/compose/animation/animation/integration-tests/animation-demos/src/main/java/androidx/compose/animation/demos/lookahead/LookaheadWithPopularBoxWithConstraintsUsage.kt b/compose/animation/animation/integration-tests/animation-demos/src/main/java/androidx/compose/animation/demos/lookahead/LookaheadWithPopularBoxWithConstraintsUsage.kt
index 859dcde..6310779 100644
--- a/compose/animation/animation/integration-tests/animation-demos/src/main/java/androidx/compose/animation/demos/lookahead/LookaheadWithPopularBoxWithConstraintsUsage.kt
+++ b/compose/animation/animation/integration-tests/animation-demos/src/main/java/androidx/compose/animation/demos/lookahead/LookaheadWithPopularBoxWithConstraintsUsage.kt
@@ -56,20 +56,20 @@
 @Preview
 @Composable
 fun LookaheadWithPopularBoxWithConstraintsUsage() {
-    val padding by produceState(initialValue = 0.dp) {
-        while (true) {
-            delay(2000)
-            if (value == 0.dp) {
-                value = 100.dp
-            } else {
-                value = 0.dp
+    val padding by
+        produceState(initialValue = 0.dp) {
+            while (true) {
+                delay(2000)
+                if (value == 0.dp) {
+                    value = 100.dp
+                } else {
+                    value = 0.dp
+                }
             }
         }
-    }
     LookaheadScope {
         Box(
-            Modifier
-                .fillMaxSize()
+            Modifier.fillMaxSize()
                 .animateBounds(Modifier.padding(padding))
                 .background(pastelColors[3])
         ) {
@@ -85,9 +85,7 @@
         BoxWithConstraints {
             Surface {
                 Column(
-                    modifier = Modifier
-                        .fillMaxSize()
-                        .verticalScroll(scrollState),
+                    modifier = Modifier.fillMaxSize().verticalScroll(scrollState),
                 ) {
                     Header(this@BoxWithConstraints.maxHeight)
                     Content(this@BoxWithConstraints.maxHeight)
@@ -134,9 +132,7 @@
 fun Header(containerHeight: Dp) {
     val height by animateDpAsState(containerHeight)
     Image(
-        modifier = Modifier
-            .heightIn(max = height / 2)
-            .fillMaxWidth(),
+        modifier = Modifier.heightIn(max = height / 2).fillMaxWidth(),
         painter = painterResource(id = R.drawable.android),
         contentScale = ContentScale.Crop,
         contentDescription = null
diff --git a/compose/animation/animation/integration-tests/animation-demos/src/main/java/androidx/compose/animation/demos/lookahead/LookaheadWithScaffold.kt b/compose/animation/animation/integration-tests/animation-demos/src/main/java/androidx/compose/animation/demos/lookahead/LookaheadWithScaffold.kt
index 36d5ffd..cd86a40 100644
--- a/compose/animation/animation/integration-tests/animation-demos/src/main/java/androidx/compose/animation/demos/lookahead/LookaheadWithScaffold.kt
+++ b/compose/animation/animation/integration-tests/animation-demos/src/main/java/androidx/compose/animation/demos/lookahead/LookaheadWithScaffold.kt
@@ -75,33 +75,29 @@
 import kotlinx.coroutines.delay
 import kotlinx.coroutines.launch
 
-private val colors = listOf(
-    Color(0xffff6f69), Color(0xffffcc5c), Color(0xff264653), Color(0xff2a9d84)
-)
+private val colors =
+    listOf(Color(0xffff6f69), Color(0xffffcc5c), Color(0xff264653), Color(0xff2a9d84))
 
 @OptIn(ExperimentalComposeUiApi::class)
 @Preview
 @Composable
 fun LookaheadWithScaffold() {
-    val hasPadding by produceState(initialValue = true) {
-        while (true) {
-            delay(3000)
-            value = !value
+    val hasPadding by
+        produceState(initialValue = true) {
+            while (true) {
+                delay(3000)
+                value = !value
+            }
         }
-    }
     LookaheadScope {
         Box(
-            Modifier
-                .fillMaxHeight()
+            Modifier.fillMaxHeight()
                 .background(Color.Gray)
-                .animateBounds(
-                    if (hasPadding) Modifier.padding(bottom = 300.dp) else Modifier
-                )
+                .animateBounds(if (hasPadding) Modifier.padding(bottom = 300.dp) else Modifier)
         ) {
             var state by remember { mutableIntStateOf(0) }
-            val titles = listOf(
-                "SimpleScaffold", "W/Cutout", "SimpleSnackbar", "CustomSnackbar", "Backdrop"
-            )
+            val titles =
+                listOf("SimpleScaffold", "W/Cutout", "SimpleSnackbar", "CustomSnackbar", "Backdrop")
             Column {
                 ScrollableTabRow(
                     selectedTabIndex = state,
@@ -138,11 +134,7 @@
             TopAppBar(
                 title = { Text("Simple Scaffold Screen") },
                 navigationIcon = {
-                    IconButton(
-                        onClick = {
-                            scope.launch { scaffoldState.drawerState.open() }
-                        }
-                    ) {
+                    IconButton(onClick = { scope.launch { scaffoldState.drawerState.open() } }) {
                         Icon(Icons.Filled.Menu, contentDescription = "Localized description")
                     }
                 }
@@ -156,19 +148,10 @@
             )
         },
         content = { innerPadding ->
-            Box(
-                Modifier
-                    .fillMaxSize()
-                    .background(Color.White)
-            )
+            Box(Modifier.fillMaxSize().background(Color.White))
             LazyColumn(contentPadding = innerPadding) {
                 items(count = 20) {
-                    Box(
-                        Modifier
-                            .fillMaxWidth()
-                            .height(150.dp)
-                            .background(colors[it % colors.size])
-                    )
+                    Box(Modifier.fillMaxWidth().height(150.dp).background(colors[it % colors.size]))
                 }
             }
         }
@@ -191,13 +174,14 @@
 
     // When progress is 0, there is no modification to the edges so we are just drawing a rectangle.
     // This allows for a smooth transition between cut corners and round corners.
-    val fabShape = if (progress < 0) {
-        CutCornerShape(abs(progress))
-    } else if (progress == roundEdgePercent.toInt()) {
-        CircleShape
-    } else {
-        RoundedCornerShape(progress)
-    }
+    val fabShape =
+        if (progress < 0) {
+            CutCornerShape(abs(progress))
+        } else if (progress == roundEdgePercent.toInt()) {
+            CircleShape
+        } else {
+            RoundedCornerShape(progress)
+        }
     // lambda to call to trigger shape animation
     val changeShape: () -> Unit = {
         val target = animatedProgress.targetValue
@@ -217,9 +201,7 @@
         bottomBar = {
             BottomAppBar(cutoutShape = fabShape) {
                 IconButton(
-                    onClick = {
-                        coroutineScope.launch { scaffoldState.drawerState.open() }
-                    }
+                    onClick = { coroutineScope.launch { scaffoldState.drawerState.open() } }
                 ) {
                     Icon(Icons.Filled.Menu, contentDescription = "Localized description")
                 }
@@ -237,12 +219,7 @@
         content = { innerPadding ->
             LazyColumn(contentPadding = innerPadding) {
                 items(count = 100) {
-                    Box(
-                        Modifier
-                            .fillMaxWidth()
-                            .height(50.dp)
-                            .background(colors[it % colors.size])
-                    )
+                    Box(Modifier.fillMaxWidth().height(50.dp).background(colors[it % colors.size]))
                 }
             }
         }
@@ -270,10 +247,7 @@
         content = { innerPadding ->
             Text(
                 text = "Body content",
-                modifier = Modifier
-                    .padding(innerPadding)
-                    .fillMaxSize()
-                    .wrapContentSize()
+                modifier = Modifier.padding(innerPadding).fillMaxSize().wrapContentSize()
             )
         }
     )
@@ -309,10 +283,7 @@
         content = { innerPadding ->
             Text(
                 text = "Custom Snackbar Demo",
-                modifier = Modifier
-                    .padding(innerPadding)
-                    .fillMaxSize()
-                    .wrapContentSize()
+                modifier = Modifier.padding(innerPadding).fillMaxSize().wrapContentSize()
             )
         }
     )
@@ -325,9 +296,7 @@
     val scope = rememberCoroutineScope()
     var selection by remember { mutableIntStateOf(1) }
     val scaffoldState = rememberBackdropScaffoldState(BackdropValue.Concealed)
-    LaunchedEffect(scaffoldState) {
-        scaffoldState.reveal()
-    }
+    LaunchedEffect(scaffoldState) { scaffoldState.reveal() }
     BackdropScaffold(
         scaffoldState = scaffoldState,
         appBar = {
@@ -350,8 +319,9 @@
                         onClick = {
                             // show snackbar as a suspend function
                             scope.launch {
-                                scaffoldState.snackbarHostState
-                                    .showSnackbar("Snackbar #${++clickCount}")
+                                scaffoldState.snackbarHostState.showSnackbar(
+                                    "Snackbar #${++clickCount}"
+                                )
                             }
                         }
                     ) {
diff --git a/compose/animation/animation/integration-tests/animation-demos/src/main/java/androidx/compose/animation/demos/lookahead/LookaheadWithSubcompose.kt b/compose/animation/animation/integration-tests/animation-demos/src/main/java/androidx/compose/animation/demos/lookahead/LookaheadWithSubcompose.kt
index 15260bb..17b8009 100644
--- a/compose/animation/animation/integration-tests/animation-demos/src/main/java/androidx/compose/animation/demos/lookahead/LookaheadWithSubcompose.kt
+++ b/compose/animation/animation/integration-tests/animation-demos/src/main/java/androidx/compose/animation/demos/lookahead/LookaheadWithSubcompose.kt
@@ -43,63 +43,61 @@
 fun LookaheadWithSubcompose() {
     Column {
         LookaheadScope {
-            val isWide by produceState(initialValue = true) {
-                while (true) {
-                    delay(1000)
-                    value = !value
+            val isWide by
+                produceState(initialValue = true) {
+                    while (true) {
+                        delay(1000)
+                        value = !value
+                    }
                 }
-            }
-            var shouldAnimate by remember {
-                mutableStateOf(false)
-            }
+            var shouldAnimate by remember { mutableStateOf(false) }
             Button(onClick = { shouldAnimate = !shouldAnimate }) {
                 Text(if (shouldAnimate) "Stop animating bounds" else "Animate bounds")
             }
             SubcomposeLayout(
-                Modifier
-                    .background(colors[3])
-                    .conditionallyAnimateBounds(shouldAnimate)
+                Modifier.background(colors[3]).conditionallyAnimateBounds(shouldAnimate)
             ) {
                 val constraints = it.copy(minWidth = 0)
-                val placeable = subcompose(0) {
-                    Box(
-                        Modifier
-                            .conditionallyAnimateBounds(
-                                shouldAnimate,
-                                Modifier
-                                    .width(if (isWide) 150.dp else 70.dp)
-                                    .requiredHeight(400.dp)
+                val placeable =
+                    subcompose(0) {
+                            Box(
+                                Modifier.conditionallyAnimateBounds(
+                                        shouldAnimate,
+                                        Modifier.width(if (isWide) 150.dp else 70.dp)
+                                            .requiredHeight(400.dp)
+                                    )
+                                    .background(colors[0])
                             )
-                            .background(colors[0])
-                    )
-                }[0].measure(constraints)
+                        }[0]
+                        .measure(constraints)
 
-                val rightPlaceable = subcompose(1) {
-                    Box(
-                        Modifier
-                            .conditionallyAnimateBounds(
-                                shouldAnimate,
-                                Modifier
-                                    .width(if (isWide) 150.dp else 70.dp)
-                                    .requiredHeight(400.dp)
+                val rightPlaceable =
+                    subcompose(1) {
+                            Box(
+                                Modifier.conditionallyAnimateBounds(
+                                        shouldAnimate,
+                                        Modifier.width(if (isWide) 150.dp else 70.dp)
+                                            .requiredHeight(400.dp)
+                                    )
+                                    .background(colors[1])
                             )
-                            .background(colors[1])
-                    )
-                }[0].measure(constraints)
+                        }[0]
+                        .measure(constraints)
 
                 val totalWidth = placeable.width + rightPlaceable.width + 150
                 layout(totalWidth, placeable.height) {
-                    val bottomPlaceable = subcompose(2) {
-                        Box(
-                            Modifier
-                                .width(totalWidth.toDp())
-                                .conditionallyAnimateBounds(
-                                    shouldAnimate,
-                                    Modifier.height(if (isWide) 150.dp else 70.dp)
+                    val bottomPlaceable =
+                        subcompose(2) {
+                                Box(
+                                    Modifier.width(totalWidth.toDp())
+                                        .conditionallyAnimateBounds(
+                                            shouldAnimate,
+                                            Modifier.height(if (isWide) 150.dp else 70.dp)
+                                        )
+                                        .background(colors[2])
                                 )
-                                .background(colors[2])
-                        )
-                    }[0].measure(constraints)
+                            }[0]
+                            .measure(constraints)
 
                     placeable.place(50, 0)
                     bottomPlaceable.place(0, placeable.height - bottomPlaceable.height - 50)
@@ -117,9 +115,5 @@
     modifier: Modifier = Modifier
 ) = if (shouldAnimate) this.animateBounds(modifier) else this.then(modifier)
 
-private val colors = listOf(
-    Color(0xffff6f69),
-    Color(0xffffcc5c),
-    Color(0xff2a9d84),
-    Color(0xff264653)
-)
+private val colors =
+    listOf(Color(0xffff6f69), Color(0xffffcc5c), Color(0xff2a9d84), Color(0xff264653))
diff --git a/compose/animation/animation/integration-tests/animation-demos/src/main/java/androidx/compose/animation/demos/lookahead/LookaheadWithTabRowDemo.kt b/compose/animation/animation/integration-tests/animation-demos/src/main/java/androidx/compose/animation/demos/lookahead/LookaheadWithTabRowDemo.kt
index b49e42f..48e9d74 100644
--- a/compose/animation/animation/integration-tests/animation-demos/src/main/java/androidx/compose/animation/demos/lookahead/LookaheadWithTabRowDemo.kt
+++ b/compose/animation/animation/integration-tests/animation-demos/src/main/java/androidx/compose/animation/demos/lookahead/LookaheadWithTabRowDemo.kt
@@ -56,17 +56,16 @@
 @Composable
 fun LookaheadWithTabRowDemo() {
     LookaheadScope {
-        val isWide by produceState(false) {
-            while (true) {
-                delay(5000)
-                value = !value
+        val isWide by
+            produceState(false) {
+                while (true) {
+                    delay(5000)
+                    value = !value
+                }
             }
-        }
         Column(
             Modifier.fillMaxWidth()
-                .animateBounds(
-                    if (isWide) Modifier else Modifier.padding(end = 100.dp)
-                )
+                .animateBounds(if (isWide) Modifier else Modifier.padding(end = 100.dp))
                 .fillMaxHeight()
                 .background(Color(0xFFfffbd0))
         ) {
@@ -101,14 +100,11 @@
 fun FancyTab(title: String, onClick: () -> Unit, selected: Boolean) {
     Tab(selected, onClick) {
         Column(
-            Modifier
-                .padding(10.dp)
-                .height(50.dp),
+            Modifier.padding(10.dp).height(50.dp),
             verticalArrangement = Arrangement.SpaceBetween
         ) {
             Box(
-                Modifier
-                    .size(10.dp)
+                Modifier.size(10.dp)
                     .align(Alignment.CenterHorizontally)
                     .background(color = if (selected) Color.Red else Color.White)
             )
@@ -125,18 +121,19 @@
 @Composable
 fun ScrollingTextTabs() {
     var state by remember { mutableIntStateOf(0) }
-    val titles = listOf(
-        "Tab 1",
-        "Tab 2",
-        "Tab 3 with lots of text",
-        "Tab 4",
-        "Tab 5",
-        "Tab 6 with lots of text",
-        "Tab 7",
-        "Tab 8",
-        "Tab 9 with lots of text",
-        "Tab 10"
-    )
+    val titles =
+        listOf(
+            "Tab 1",
+            "Tab 2",
+            "Tab 3 with lots of text",
+            "Tab 4",
+            "Tab 5",
+            "Tab 6 with lots of text",
+            "Tab 7",
+            "Tab 8",
+            "Tab 9 with lots of text",
+            "Tab 10"
+        )
     Column {
         ScrollableTabRow(selectedTabIndex = state) {
             LookaheadScope {
@@ -160,35 +157,30 @@
 @Composable
 fun ScrollingFancyIndicatorContainerTabs() {
     var state by remember { mutableIntStateOf(0) }
-    val titles = listOf(
-        "Tab 1",
-        "Tab 2",
-        "Tab 3 with lots of text",
-        "Tab 4",
-        "Tab 5",
-        "Tab 6 with lots of text",
-        "Tab 7",
-        "Tab 8",
-        "Tab 9 with lots of text",
-        "Tab 10"
-    )
+    val titles =
+        listOf(
+            "Tab 1",
+            "Tab 2",
+            "Tab 3 with lots of text",
+            "Tab 4",
+            "Tab 5",
+            "Tab 6 with lots of text",
+            "Tab 7",
+            "Tab 8",
+            "Tab 9 with lots of text",
+            "Tab 10"
+        )
 
     // Reuse the default offset animation modifier, but use our own indicator
-    val indicator = @Composable { tabPositions: List<TabPosition> ->
-        FancyIndicator(Color.White, Modifier.tabIndicatorOffset(tabPositions[state]))
-    }
+    val indicator =
+        @Composable { tabPositions: List<TabPosition> ->
+            FancyIndicator(Color.White, Modifier.tabIndicatorOffset(tabPositions[state]))
+        }
 
     Column {
-        ScrollableTabRow(
-            selectedTabIndex = state,
-            indicator = indicator
-        ) {
+        ScrollableTabRow(selectedTabIndex = state, indicator = indicator) {
             titles.forEachIndexed { index, title ->
-                Tab(
-                    selected = state == index,
-                    onClick = { state = index },
-                    text = { Text(title) }
-                )
+                Tab(selected = state == index, onClick = { state = index }, text = { Text(title) })
             }
         }
         Text(
diff --git a/compose/animation/animation/integration-tests/animation-demos/src/main/java/androidx/compose/animation/demos/lookahead/SceneHostExperiment.kt b/compose/animation/animation/integration-tests/animation-demos/src/main/java/androidx/compose/animation/demos/lookahead/SceneHostExperiment.kt
index 4ba36700..570ae9e 100644
--- a/compose/animation/animation/integration-tests/animation-demos/src/main/java/androidx/compose/animation/demos/lookahead/SceneHostExperiment.kt
+++ b/compose/animation/animation/integration-tests/animation-demos/src/main/java/androidx/compose/animation/demos/lookahead/SceneHostExperiment.kt
@@ -59,23 +59,21 @@
 
 private const val debugSharedElement = true
 
-class SceneScope internal constructor(
-    lookaheadScope: LookaheadScope
-) : LookaheadScope by lookaheadScope {
+class SceneScope internal constructor(lookaheadScope: LookaheadScope) :
+    LookaheadScope by lookaheadScope {
     @OptIn(ExperimentalAnimatableApi::class)
     fun Modifier.sharedElement(): Modifier = composed {
-        val offsetAnimation: DeferredTargetAnimation<IntOffset, AnimationVector2D> =
-            remember {
-                DeferredTargetAnimation(IntOffset.VectorConverter)
-            }
-        val sizeAnimation: DeferredTargetAnimation<IntSize, AnimationVector2D> =
-            remember { DeferredTargetAnimation(IntSize.VectorConverter) }
+        val offsetAnimation: DeferredTargetAnimation<IntOffset, AnimationVector2D> = remember {
+            DeferredTargetAnimation(IntOffset.VectorConverter)
+        }
+        val sizeAnimation: DeferredTargetAnimation<IntSize, AnimationVector2D> = remember {
+            DeferredTargetAnimation(IntSize.VectorConverter)
+        }
 
         var placementOffset: IntOffset by remember { mutableStateOf(IntOffset.Zero) }
         val coroutineScope = rememberCoroutineScope()
 
-        this
-            .drawBehind {
+        this.drawBehind {
                 if (debugSharedElement) {
                     drawRect(
                         color = Color.Black,
@@ -97,21 +95,22 @@
                 }
             ) { measurable, _ ->
                 with(coroutineScope) {
-                    val (width, height) = sizeAnimation.updateTarget(
-                        lookaheadSize, coroutineScope, spring(stiffness = Spring.StiffnessMediumLow)
-                    )
+                    val (width, height) =
+                        sizeAnimation.updateTarget(
+                            lookaheadSize,
+                            coroutineScope,
+                            spring(stiffness = Spring.StiffnessMediumLow)
+                        )
                     val animatedConstraints = Constraints.fixed(width, height)
                     val placeable = measurable.measure(animatedConstraints)
                     layout(placeable.width, placeable.height) {
-                        val (x, y) = offsetAnimation.updateTargetBasedOnCoordinates(
-                            spring(stiffness = Spring.StiffnessMediumLow),
-                        )
+                        val (x, y) =
+                            offsetAnimation.updateTargetBasedOnCoordinates(
+                                spring(stiffness = Spring.StiffnessMediumLow),
+                            )
                         coordinates?.let {
-                            placementOffset = lookaheadScopeCoordinates
-                                .localPositionOf(
-                                    it, Offset.Zero
-                                )
-                                .round()
+                            placementOffset =
+                                lookaheadScopeCoordinates.localPositionOf(it, Offset.Zero).round()
                         }
                         placeable.place(x, y)
                     }
@@ -122,13 +121,10 @@
 
 @OptIn(ExperimentalAnimatableApi::class)
 fun Modifier.animateSizeAndSkipToFinalLayout() = composed {
-    val sizeAnimation = remember {
-        DeferredTargetAnimation(IntSize.VectorConverter)
-    }
+    val sizeAnimation = remember { DeferredTargetAnimation(IntSize.VectorConverter) }
     var targetSize: IntSize? by remember { mutableStateOf(null) }
     val scope = rememberCoroutineScope()
-    this
-        .drawBehind {
+    this.drawBehind {
             if (debugSharedElement) {
                 drawRect(
                     color = Color.Black,
@@ -146,13 +142,11 @@
         ) { measurable, constraints ->
             targetSize = lookaheadSize
             val (width, height) = sizeAnimation.updateTarget(lookaheadSize, scope)
-            val placeable = measurable.measure(
-                Constraints.fixed(lookaheadSize.width, lookaheadSize.height)
-            )
+            val placeable =
+                measurable.measure(Constraints.fixed(lookaheadSize.width, lookaheadSize.height))
             // Make sure the content is aligned to topStart
             val wrapperWidth = width.coerceIn(constraints.minWidth, constraints.maxWidth)
-            val wrapperHeight =
-                height.coerceIn(constraints.minHeight, constraints.maxHeight)
+            val wrapperHeight = height.coerceIn(constraints.minHeight, constraints.maxHeight)
             layout(width, height) {
                 placeable.place(-(wrapperWidth - width) / 2, -(wrapperHeight - height) / 2)
             }
diff --git a/compose/animation/animation/integration-tests/animation-demos/src/main/java/androidx/compose/animation/demos/lookahead/ScreenSizeChangeDemo.kt b/compose/animation/animation/integration-tests/animation-demos/src/main/java/androidx/compose/animation/demos/lookahead/ScreenSizeChangeDemo.kt
index b0e17b7..88eeae61 100644
--- a/compose/animation/animation/integration-tests/animation-demos/src/main/java/androidx/compose/animation/demos/lookahead/ScreenSizeChangeDemo.kt
+++ b/compose/animation/animation/integration-tests/animation-demos/src/main/java/androidx/compose/animation/demos/lookahead/ScreenSizeChangeDemo.kt
@@ -72,10 +72,8 @@
     // A surface container using the 'background' color from the theme
     var state by remember { mutableStateOf(DisplayState.Tablet) }
     Box(
-        modifier = Modifier
-            .fillMaxSize()
-            .background(Color.Black)
-            .clickable(
+        modifier =
+            Modifier.fillMaxSize().background(Color.Black).clickable(
                 interactionSource = remember { MutableInteractionSource() },
                 indication = null
             ) {
@@ -109,10 +107,7 @@
     Surface(shape = RoundedCornerShape(5.dp), modifier = modifier, color = Color(0xfff7f2fa)) {
         Column {
             Row(
-                Modifier
-                    .fillMaxWidth()
-                    .height(80.dp)
-                    .padding(10.dp),
+                Modifier.fillMaxWidth().height(80.dp).padding(10.dp),
                 verticalAlignment = Alignment.CenterVertically,
             ) {
                 Column {
@@ -122,18 +117,18 @@
                 Spacer(Modifier.weight(1f))
                 Icon(
                     Icons.Default.Delete,
-                    modifier = Modifier
-                        .padding(2.dp)
-                        .background(Color.White, RoundedCornerShape(3.dp))
-                        .padding(6.dp),
+                    modifier =
+                        Modifier.padding(2.dp)
+                            .background(Color.White, RoundedCornerShape(3.dp))
+                            .padding(6.dp),
                     contentDescription = null
                 )
                 Icon(
                     Icons.Default.Menu,
-                    modifier = Modifier
-                        .padding(2.dp)
-                        .background(Color.White, RoundedCornerShape(3.dp))
-                        .padding(6.dp),
+                    modifier =
+                        Modifier.padding(2.dp)
+                            .background(Color.White, RoundedCornerShape(3.dp))
+                            .padding(6.dp),
                     contentDescription = null
                 )
             }
@@ -148,11 +143,9 @@
 fun Root(state: DisplayState) {
     SceneHost {
         Row(
-            Modifier
-                .animateBounds(
+            Modifier.animateBounds(
                     if (state == DisplayState.Compact) {
-                        Modifier
-                            .wrapContentSize(align = Alignment.TopStart, unbounded = true)
+                        Modifier.wrapContentSize(align = Alignment.TopStart, unbounded = true)
                             .requiredWidth(800.dp)
                             .fillMaxHeight()
                     } else {
@@ -183,59 +176,55 @@
     val addressing: String
 )
 
-val MessageList = listOf<MessageData>(
-    MessageData(
-        "老强",
-        "10 mins ago",
-        "豆花鱼",
-        "最近忙吗？昨晚我去了你最爱的那家饭馆，点了他们特色的豆花鱼，吃着吃着就想你了。有空咱们视频？",
-        ""
-    ),
-    MessageData(
-        "So Duri",
-        "20 mins ago",
-        "Dinner Club",
-        "I think it's time for us to finally try that new noodle shop downtown that doesn't use" +
-            " menus. Anyone else have other suggestions for dinner club this week? I'm so" +
-            "intrigued by this idea of a noodle restaurant where no one gets to order for" +
-            "themselves - could be fun, or terrible, or both: :) \n\n" +
-            "So ",
-        "To me, Ziad and Lily"
-    ),
-    MessageData(
-        "Lily",
-        "2 hours ago",
-        "This food show is made for you",
-        "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor" +
-            " incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam," +
-            " quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo" +
-            " consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse" +
-            " cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non" +
-            " proident, sunt in culpa qui officia deserunt mollit anim id est laborum.",
-        ""
-    ),
-    MessageData(
-        "Me",
-        "4 mins ago",
-        "",
-        "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor" +
-            " incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam," +
-            " quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo" +
-            " consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse" +
-            " cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non" +
-            " proident, sunt in culpa qui officia deserunt mollit anim id est laborum.",
-        "To me, Ziad and Lily"
+val MessageList =
+    listOf<MessageData>(
+        MessageData(
+            "老强",
+            "10 mins ago",
+            "豆花鱼",
+            "最近忙吗？昨晚我去了你最爱的那家饭馆，点了他们特色的豆花鱼，吃着吃着就想你了。有空咱们视频？",
+            ""
+        ),
+        MessageData(
+            "So Duri",
+            "20 mins ago",
+            "Dinner Club",
+            "I think it's time for us to finally try that new noodle shop downtown that doesn't use" +
+                " menus. Anyone else have other suggestions for dinner club this week? I'm so" +
+                "intrigued by this idea of a noodle restaurant where no one gets to order for" +
+                "themselves - could be fun, or terrible, or both: :) \n\n" +
+                "So ",
+            "To me, Ziad and Lily"
+        ),
+        MessageData(
+            "Lily",
+            "2 hours ago",
+            "This food show is made for you",
+            "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor" +
+                " incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam," +
+                " quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo" +
+                " consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse" +
+                " cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non" +
+                " proident, sunt in culpa qui officia deserunt mollit anim id est laborum.",
+            ""
+        ),
+        MessageData(
+            "Me",
+            "4 mins ago",
+            "",
+            "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor" +
+                " incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam," +
+                " quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo" +
+                " consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse" +
+                " cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non" +
+                " proident, sunt in culpa qui officia deserunt mollit anim id est laborum.",
+            "To me, Ziad and Lily"
+        )
     )
-)
 
 @Composable
 fun SearchBar() {
-    Surface(
-        shape = RoundedCornerShape(40),
-        modifier = Modifier
-            .fillMaxWidth()
-            .height(50.dp)
-    ) {
+    Surface(shape = RoundedCornerShape(40), modifier = Modifier.fillMaxWidth().height(50.dp)) {
         Row(Modifier.fillMaxWidth(), verticalAlignment = Alignment.CenterVertically) {
             Icon(
                 imageVector = Icons.Default.Search,
@@ -245,10 +234,7 @@
             )
             Text("Search", color = Color.LightGray, modifier = Modifier.weight(1f))
             Box(
-                Modifier
-                    .padding(end = 10.dp)
-                    .size(35.dp)
-                    .background(Color(0xffecddff), CircleShape)
+                Modifier.padding(end = 10.dp).size(35.dp).background(Color(0xffecddff), CircleShape)
             )
         }
     }
@@ -256,18 +242,8 @@
 
 @Composable
 fun Header(data: MessageData) {
-    Row(
-        Modifier
-            .height(60.dp)
-            .fillMaxWidth(),
-        verticalAlignment = Alignment.CenterVertically
-    ) {
-        Box(
-            Modifier
-                .padding(10.dp)
-                .size(35.dp)
-                .background(Color(0xffffddee), CircleShape)
-        )
+    Row(Modifier.height(60.dp).fillMaxWidth(), verticalAlignment = Alignment.CenterVertically) {
+        Box(Modifier.padding(10.dp).size(35.dp).background(Color(0xffffddee), CircleShape))
         Column(Modifier.weight(1f)) {
             Text(data.name, color = Color.Gray, fontWeight = FontWeight.Black, fontSize = 10.sp)
             Text(data.time, color = Color.Gray, fontWeight = FontWeight.Black, fontSize = 10.sp)
@@ -275,9 +251,7 @@
         Icon(
             Icons.Outlined.Star,
             contentDescription = null,
-            Modifier
-                .background(Color.White, CircleShape)
-                .padding(10.dp)
+            Modifier.background(Color.White, CircleShape).padding(10.dp)
         )
     }
 }
@@ -291,19 +265,13 @@
     ) {
         Column(Modifier.padding(10.dp)) {
             Header(data = cardData)
-            Text(
-                cardData.subject,
-                fontSize = 19.sp,
-                modifier = Modifier.padding(start = 10.dp)
-            )
+            Text(cardData.subject, fontSize = 19.sp, modifier = Modifier.padding(start = 10.dp))
             Spacer(Modifier.size(10.dp))
             Text(
                 cardData.content,
                 fontSize = 13.sp,
                 color = Color.Gray,
-                modifier = Modifier
-                    .padding(start = 10.dp)
-                    .animateSizeAndSkipToFinalLayout()
+                modifier = Modifier.padding(start = 10.dp).animateSizeAndSkipToFinalLayout()
             )
         }
     }
@@ -312,8 +280,7 @@
 @Composable
 fun SceneScope.Message(messageData: MessageData) {
     Column(
-        Modifier
-            .padding(5.dp)
+        Modifier.padding(5.dp)
             .background(Color(0xfffffbfe), RoundedCornerShape(5.dp))
             .padding(10.dp)
     ) {
@@ -329,28 +296,26 @@
             messageData.content,
             fontSize = 13.sp,
             color = Color.Gray,
-            modifier = Modifier
-                .padding(start = 10.dp)
-                .animateSizeAndSkipToFinalLayout()
+            modifier = Modifier.padding(start = 10.dp).animateSizeAndSkipToFinalLayout()
         )
         Spacer(Modifier.size(10.dp))
         Row(modifier = Modifier.fillMaxWidth()) {
             Box(
-                modifier = Modifier
-                    .weight(1f)
-                    .padding(5.dp)
-                    .height(40.dp)
-                    .background(Color(0xfff2ecf6), RoundedCornerShape(50)),
+                modifier =
+                    Modifier.weight(1f)
+                        .padding(5.dp)
+                        .height(40.dp)
+                        .background(Color(0xfff2ecf6), RoundedCornerShape(50)),
                 contentAlignment = Alignment.Center
             ) {
                 Text("Reply")
             }
             Box(
-                modifier = Modifier
-                    .weight(1f)
-                    .padding(5.dp)
-                    .height(40.dp)
-                    .background(Color(0xfff2ecf6), RoundedCornerShape(50)),
+                modifier =
+                    Modifier.weight(1f)
+                        .padding(5.dp)
+                        .height(40.dp)
+                        .background(Color(0xfff2ecf6), RoundedCornerShape(50)),
                 contentAlignment = Alignment.Center
             ) {
                 Text("Reply All")
@@ -363,20 +328,15 @@
 @Composable
 fun SceneScope.NavRail(state: DisplayState) {
     Column(
-        Modifier
-            .animateBounds(
-                if (state == DisplayState.Tablet)
-                    Modifier.width(200.dp)
-                else
-                    Modifier.width(IntrinsicSize.Min)
+        Modifier.animateBounds(
+                if (state == DisplayState.Tablet) Modifier.width(200.dp)
+                else Modifier.width(IntrinsicSize.Min)
             )
             .padding(top = 20.dp, end = 5.dp)
     ) {
         Row(
-            Modifier
-                .fillMaxWidth()
-                .animateSizeAndSkipToFinalLayout()
-                .padding(5.dp), horizontalArrangement = Arrangement.SpaceBetween
+            Modifier.fillMaxWidth().animateSizeAndSkipToFinalLayout().padding(5.dp),
+            horizontalArrangement = Arrangement.SpaceBetween
         ) {
             if (state == DisplayState.Tablet) {
                 Text("REPLY", color = Color(0xffa493c5), fontSize = 15.sp, letterSpacing = 0.12.em)
@@ -385,15 +345,12 @@
                 imageVector = Icons.Outlined.Menu,
                 contentDescription = null,
                 tint = Color.Gray,
-                modifier = Modifier
-                    .width(40.dp)
-                    .sharedElement()
+                modifier = Modifier.width(40.dp).sharedElement()
             )
         }
         Spacer(modifier = Modifier.size(10.dp))
         Row(
-            Modifier
-                .height(50.dp)
+            Modifier.height(50.dp)
                 .fillMaxWidth()
                 .background(Color(0xffffddee), RoundedCornerShape(8.dp))
                 .padding(5.dp),
@@ -408,8 +365,7 @@
             if (state == DisplayState.Tablet) {
                 Text(
                     "Compose",
-                    Modifier
-                        .padding(start = 30.dp)
+                    Modifier.padding(start = 30.dp)
                         .clipToBounds()
                         .wrapContentWidth(align = Alignment.CenterHorizontally, unbounded = true),
                     color = Color.Gray,
@@ -428,22 +384,22 @@
 @Composable
 fun Item(state: DisplayState, icon: ImageVector, text: String, color: Color = Color.Transparent) {
     Row(
-        Modifier
-            .height(50.dp)
+        Modifier.height(50.dp)
             .fillMaxWidth()
             .background(color, RoundedCornerShape(50))
             .padding(5.dp),
         verticalAlignment = Alignment.CenterVertically
     ) {
         Icon(
-            imageVector = icon, contentDescription = null, tint = Color.Gray,
+            imageVector = icon,
+            contentDescription = null,
+            tint = Color.Gray,
             modifier = Modifier.width(40.dp)
         )
         if (state == DisplayState.Tablet) {
             Text(
                 text,
-                Modifier
-                    .weight(1f)
+                Modifier.weight(1f)
                     .clipToBounds()
                     .wrapContentWidth(align = Alignment.Start, unbounded = true)
                     .padding(start = 15.dp),
diff --git a/compose/animation/animation/integration-tests/animation-demos/src/main/java/androidx/compose/animation/demos/lookahead/SharedElementExplorationDemo.kt b/compose/animation/animation/integration-tests/animation-demos/src/main/java/androidx/compose/animation/demos/lookahead/SharedElementExplorationDemo.kt
index 343c269..974b018 100644
--- a/compose/animation/animation/integration-tests/animation-demos/src/main/java/androidx/compose/animation/demos/lookahead/SharedElementExplorationDemo.kt
+++ b/compose/animation/animation/integration-tests/animation-demos/src/main/java/androidx/compose/animation/demos/lookahead/SharedElementExplorationDemo.kt
@@ -41,27 +41,27 @@
     val A = remember {
         movableContentWithReceiverOf<SceneScope, Modifier> { modifier ->
             Box(
-                modifier = Modifier
-                    .sharedElement().then(modifier)
-                    .background(color = Color(0xfff3722c), RoundedCornerShape(10))
+                modifier =
+                    Modifier.sharedElement()
+                        .then(modifier)
+                        .background(color = Color(0xfff3722c), RoundedCornerShape(10))
             )
         }
     }
     val B = remember {
         movableContentWithReceiverOf<SceneScope, Modifier> { modifier ->
             Box(
-                modifier = Modifier
-                    .sharedElement().then(modifier)
-                    .background(color = Color(0xff90be6d), RoundedCornerShape(10))
+                modifier =
+                    Modifier.sharedElement()
+                        .then(modifier)
+                        .background(color = Color(0xff90be6d), RoundedCornerShape(10))
             )
         }
     }
 
     val C = remember {
         movableContentWithReceiverOf<SceneScope, @Composable () -> Unit> { content ->
-            Box(Modifier.sharedElement().background(Color(0xfff9c74f)).padding(20.dp)) {
-                content()
-            }
+            Box(Modifier.sharedElement().background(Color(0xfff9c74f)).padding(20.dp)) { content() }
         }
     }
 
diff --git a/compose/animation/animation/integration-tests/animation-demos/src/main/java/androidx/compose/animation/demos/sharedelement/CallerManagedVisibilityDemo.kt b/compose/animation/animation/integration-tests/animation-demos/src/main/java/androidx/compose/animation/demos/sharedelement/CallerManagedVisibilityDemo.kt
index 625fd06..069f985 100644
--- a/compose/animation/animation/integration-tests/animation-demos/src/main/java/androidx/compose/animation/demos/sharedelement/CallerManagedVisibilityDemo.kt
+++ b/compose/animation/animation/integration-tests/animation-demos/src/main/java/androidx/compose/animation/demos/sharedelement/CallerManagedVisibilityDemo.kt
@@ -48,16 +48,10 @@
     var selectFirst by remember { mutableStateOf(true) }
     val key = remember { Any() }
     SharedTransitionLayout(
-        Modifier
-            .fillMaxSize()
-            .padding(10.dp)
-            .clickable {
-                selectFirst = !selectFirst
-            }
+        Modifier.fillMaxSize().padding(10.dp).clickable { selectFirst = !selectFirst }
     ) {
         Box(
-            Modifier
-                .sharedElementWithCallerManagedVisibility(
+            Modifier.sharedElementWithCallerManagedVisibility(
                     rememberSharedContentState(key = key),
                     !selectFirst,
                     boundsTransform = boundsTransform
@@ -70,8 +64,7 @@
         // TODO: Check isTransitionActive is false in the end. Why are the shared bounds not
         // two separate entities when transition is finished?
         Box(
-            Modifier
-                .offset(180.dp, 180.dp)
+            Modifier.offset(180.dp, 180.dp)
                 .sharedElementWithCallerManagedVisibility(
                     rememberSharedContentState(
                         key = key,
diff --git a/compose/animation/animation/integration-tests/animation-demos/src/main/java/androidx/compose/animation/demos/sharedelement/ContainerTransformDemo.kt b/compose/animation/animation/integration-tests/animation-demos/src/main/java/androidx/compose/animation/demos/sharedelement/ContainerTransformDemo.kt
index 859d40d..25b32da 100644
--- a/compose/animation/animation/integration-tests/animation-demos/src/main/java/androidx/compose/animation/demos/sharedelement/ContainerTransformDemo.kt
+++ b/compose/animation/animation/integration-tests/animation-demos/src/main/java/androidx/compose/animation/demos/sharedelement/ContainerTransformDemo.kt
@@ -77,17 +77,14 @@
 @Preview
 @Composable
 fun ContainerTransformDemo(model: MyModel = remember { MyModel().apply { selected = items[1] } }) {
-    BackHandler {
-        model.selected = null
-    }
+    BackHandler { model.selected = null }
     SharedTransitionLayout {
         AnimatedContent(
             model.selected,
             transitionSpec = {
                 fadeIn(tween(600)) togetherWith
-                    fadeOut(tween(600)) using SizeTransform { _, _ ->
-                    spring()
-                }
+                    fadeOut(tween(600)) using
+                    SizeTransform { _, _ -> spring() }
             },
             label = ""
         ) {
@@ -105,8 +102,7 @@
 @Composable
 fun Details(kitty: Kitty) {
     Column(
-        Modifier
-            .padding(start = 10.dp, end = 10.dp, top = 10.dp)
+        Modifier.padding(start = 10.dp, end = 10.dp, top = 10.dp)
             .fillMaxHeight()
             .wrapContentHeight(Alignment.Top)
             .fillMaxWidth()
@@ -119,23 +115,23 @@
                 Text(
                     kitty.name,
                     fontSize = 25.sp,
-                    modifier = Modifier
-                        .padding(start = 10.dp)
-                        .sharedBounds(
-                            rememberSharedContentState(key = kitty.name + kitty.id),
-                            this@AnimatedVisibilityScope
-                        )
+                    modifier =
+                        Modifier.padding(start = 10.dp)
+                            .sharedBounds(
+                                rememberSharedContentState(key = kitty.name + kitty.id),
+                                this@AnimatedVisibilityScope
+                            )
                 )
                 Text(
                     kitty.breed,
                     fontSize = 22.sp,
                     color = Color.Gray,
-                    modifier = Modifier
-                        .padding(start = 10.dp)
-                        .sharedBounds(
-                            rememberSharedContentState(key = kitty.breed + kitty.id),
-                            this@AnimatedVisibilityScope
-                        )
+                    modifier =
+                        Modifier.padding(start = 10.dp)
+                            .sharedBounds(
+                                rememberSharedContentState(key = kitty.breed + kitty.id),
+                                this@AnimatedVisibilityScope
+                            )
                 )
                 Spacer(Modifier.size(10.dp))
             }
@@ -143,55 +139,53 @@
             Icon(
                 Icons.Outlined.Favorite,
                 contentDescription = null,
-                Modifier
-                    .background(Color(0xffffddee), CircleShape)
-                    .padding(10.dp)
+                Modifier.background(Color(0xffffddee), CircleShape).padding(10.dp)
             )
             Spacer(Modifier.size(10.dp))
         }
         Box(
-            modifier = Modifier
-                .padding(bottom = 10.dp)
-                .height(2.dp)
-                .fillMaxWidth()
-                .background(Color(0xffeeeeee))
+            modifier =
+                Modifier.padding(bottom = 10.dp)
+                    .height(2.dp)
+                    .fillMaxWidth()
+                    .background(Color(0xffeeeeee))
         )
         Text(
             text =
-            "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Praesent fringilla" +
-                " mollis efficitur. Maecenas sit amet urna eu urna blandit suscipit efficitur" +
-                " eget mauris. Nullam eget aliquet ligula. Nunc id euismod elit. Morbi aliquam" +
-                " enim eros, eget consequat dolor consequat id. Quisque elementum faucibus" +
-                " congue. Curabitur mollis aliquet turpis, ut pellentesque justo eleifend nec.\n" +
-                "\n" +
-                "Suspendisse ac consequat turpis, euismod lacinia quam. Nulla lacinia tellus" +
-                " eu felis tristique ultricies. Vivamus et ultricies dolor. Orci varius" +
-                " natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus." +
-                " Ut gravida porttitor arcu elementum elementum. Phasellus ultrices vel turpis" +
-                " volutpat mollis. Vivamus leo diam, placerat quis leo efficitur, ultrices" +
-                " placerat ex. Nullam mollis et metus ac ultricies. Ut ligula metus, congue" +
-                " gravida metus in, vestibulum posuere velit. Sed et ex nisl. Fusce tempor" +
-                " odio eget sapien pellentesque, sed cursus velit fringilla. Nullam odio" +
-                " ipsum, eleifend non consectetur vitae, congue id libero. Etiam tincidunt" +
-                " mauris at urna dictum ornare.\n" +
-                "\n" +
-                "Etiam at facilisis ex. Sed quis arcu diam. Quisque semper pharetra leo eget" +
-                " fermentum. Nulla dapibus eget mi id porta. Nunc quis sodales nulla, eget" +
-                " commodo sem. Donec lacus enim, pharetra non risus nec, eleifend ultrices" +
-                " augue. Donec sit amet orci porttitor, auctor mauris et, facilisis dolor." +
-                " Nullam mattis luctus orci at pulvinar.\n" +
-                "\n" +
-                "Sed accumsan est massa, ut aliquam nulla dignissim id. Suspendisse in urna" +
-                " condimentum, convallis purus at, molestie nisi. In hac habitasse platea" +
-                " dictumst. Pellentesque id justo quam. Cras iaculis tellus libero, eu" +
-                " feugiat ex pharetra eget. Nunc ultrices, magna ut gravida egestas, mauris" +
-                " justo blandit sapien, eget congue nisi felis congue diam. Mauris at felis" +
-                " vitae erat porta auctor. Pellentesque iaculis sem metus. Phasellus quam" +
-                " neque, congue at est eget, sodales interdum justo. Aenean a pharetra dui." +
-                " Morbi odio nibh, hendrerit vulputate odio eget, sollicitudin egestas ex." +
-                " Fusce nisl ex, fermentum a ultrices id, rhoncus vitae urna. Aliquam quis" +
-                " lobortis turpis.\n" +
-                "\n",
+                "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Praesent fringilla" +
+                    " mollis efficitur. Maecenas sit amet urna eu urna blandit suscipit efficitur" +
+                    " eget mauris. Nullam eget aliquet ligula. Nunc id euismod elit. Morbi aliquam" +
+                    " enim eros, eget consequat dolor consequat id. Quisque elementum faucibus" +
+                    " congue. Curabitur mollis aliquet turpis, ut pellentesque justo eleifend nec.\n" +
+                    "\n" +
+                    "Suspendisse ac consequat turpis, euismod lacinia quam. Nulla lacinia tellus" +
+                    " eu felis tristique ultricies. Vivamus et ultricies dolor. Orci varius" +
+                    " natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus." +
+                    " Ut gravida porttitor arcu elementum elementum. Phasellus ultrices vel turpis" +
+                    " volutpat mollis. Vivamus leo diam, placerat quis leo efficitur, ultrices" +
+                    " placerat ex. Nullam mollis et metus ac ultricies. Ut ligula metus, congue" +
+                    " gravida metus in, vestibulum posuere velit. Sed et ex nisl. Fusce tempor" +
+                    " odio eget sapien pellentesque, sed cursus velit fringilla. Nullam odio" +
+                    " ipsum, eleifend non consectetur vitae, congue id libero. Etiam tincidunt" +
+                    " mauris at urna dictum ornare.\n" +
+                    "\n" +
+                    "Etiam at facilisis ex. Sed quis arcu diam. Quisque semper pharetra leo eget" +
+                    " fermentum. Nulla dapibus eget mi id porta. Nunc quis sodales nulla, eget" +
+                    " commodo sem. Donec lacus enim, pharetra non risus nec, eleifend ultrices" +
+                    " augue. Donec sit amet orci porttitor, auctor mauris et, facilisis dolor." +
+                    " Nullam mattis luctus orci at pulvinar.\n" +
+                    "\n" +
+                    "Sed accumsan est massa, ut aliquam nulla dignissim id. Suspendisse in urna" +
+                    " condimentum, convallis purus at, molestie nisi. In hac habitasse platea" +
+                    " dictumst. Pellentesque id justo quam. Cras iaculis tellus libero, eu" +
+                    " feugiat ex pharetra eget. Nunc ultrices, magna ut gravida egestas, mauris" +
+                    " justo blandit sapien, eget congue nisi felis congue diam. Mauris at felis" +
+                    " vitae erat porta auctor. Pellentesque iaculis sem metus. Phasellus quam" +
+                    " neque, congue at est eget, sodales interdum justo. Aenean a pharetra dui." +
+                    " Morbi odio nibh, hendrerit vulputate odio eget, sollicitudin egestas ex." +
+                    " Fusce nisl ex, fermentum a ultrices id, rhoncus vitae urna. Aliquam quis" +
+                    " lobortis turpis.\n" +
+                    "\n",
             color = Color.Gray,
             fontSize = 15.sp,
         )
@@ -201,25 +195,16 @@
 context(AnimatedVisibilityScope, SharedTransitionScope)
 @Suppress("UNUSED_PARAMETER")
 @Composable
-fun DetailView(
-    model: MyModel,
-    selected: Kitty,
-    next: Kitty?
-) {
+fun DetailView(model: MyModel, selected: Kitty, next: Kitty?) {
     Column(
-        Modifier
-            .clickable(
-                interactionSource = remember {
-                    MutableInteractionSource()
-                },
+        Modifier.clickable(
+                interactionSource = remember { MutableInteractionSource() },
                 indication = null
             ) {
                 model.selected = null
             }
             .sharedBounds(
-                rememberSharedContentState(
-                    key = "container + ${selected.id}"
-                ),
+                rememberSharedContentState(key = "container + ${selected.id}"),
                 this@AnimatedVisibilityScope,
                 fadeIn(),
                 fadeOut(),
@@ -232,28 +217,28 @@
                 painter = painterResource(selected.photoResId),
                 contentDescription = null,
                 contentScale = ContentScale.Crop,
-                modifier = Modifier
-                    .padding(10.dp)
-                    .sharedElement(
-                        rememberSharedContentState(key = selected.id),
-                        this@AnimatedVisibilityScope,
-                        placeHolderSize = animatedSize
-                    )
-                    .fillMaxHeight()
-                    .aspectRatio(1f)
-                    .clip(RoundedCornerShape(20.dp))
+                modifier =
+                    Modifier.padding(10.dp)
+                        .sharedElement(
+                            rememberSharedContentState(key = selected.id),
+                            this@AnimatedVisibilityScope,
+                            placeHolderSize = animatedSize
+                        )
+                        .fillMaxHeight()
+                        .aspectRatio(1f)
+                        .clip(RoundedCornerShape(20.dp))
             )
             if (next != null) {
                 Image(
                     painter = painterResource(next.photoResId),
                     contentDescription = null,
                     contentScale = ContentScale.Crop,
-                    modifier = Modifier
-                        .padding(top = 10.dp, bottom = 10.dp, end = 10.dp)
-                        .fillMaxWidth()
-                        .fillMaxHeight()
-                        .clip(RoundedCornerShape(20.dp))
-                        .blur(10.dp)
+                    modifier =
+                        Modifier.padding(top = 10.dp, bottom = 10.dp, end = 10.dp)
+                            .fillMaxWidth()
+                            .fillMaxHeight()
+                            .clip(RoundedCornerShape(20.dp))
+                            .blur(10.dp)
                 )
             }
         }
@@ -266,8 +251,7 @@
 fun GridView(model: MyModel) {
     Box(Modifier.background(lessVibrantPurple)) {
         Box(
-            Modifier
-                .padding(20.dp)
+            Modifier.padding(20.dp)
                 .renderInSharedTransitionScopeOverlay(zIndexInOverlay = 2f)
                 .animateEnterExit(fadeIn(), fadeOut())
         ) {
@@ -278,9 +262,7 @@
             contentPadding = PaddingValues(top = 90.dp)
         ) {
             items(6) {
-                Box(modifier = Modifier.clickable {
-                    model.selected = model.items[it]
-                }) {
+                Box(modifier = Modifier.clickable { model.selected = model.items[it] }) {
                     KittyItem(model.items[it])
                 }
             }
@@ -289,15 +271,16 @@
 }
 
 class MyModel {
-    val items = mutableListOf(
-        Kitty("Waffle", R.drawable.waffle, "American Short Hair", 0),
-        Kitty("油条", R.drawable.yt_profile, "Tabby", 1),
-        Kitty("Cowboy", R.drawable.cowboy, "American Short Hair", 2),
-        Kitty("Pepper", R.drawable.pepper, "Tabby", 3),
-        Kitty("Unknown", R.drawable.question_mark, "Unknown Breed", 4),
-        Kitty("Unknown", R.drawable.question_mark, "Unknown Breed", 5),
-        Kitty("YT", R.drawable.yt_profile2, "Tabby", 6),
-    )
+    val items =
+        mutableListOf(
+            Kitty("Waffle", R.drawable.waffle, "American Short Hair", 0),
+            Kitty("油条", R.drawable.yt_profile, "Tabby", 1),
+            Kitty("Cowboy", R.drawable.cowboy, "American Short Hair", 2),
+            Kitty("Pepper", R.drawable.pepper, "Tabby", 3),
+            Kitty("Unknown", R.drawable.question_mark, "Unknown Breed", 4),
+            Kitty("Unknown", R.drawable.question_mark, "Unknown Breed", 5),
+            Kitty("YT", R.drawable.yt_profile2, "Tabby", 6),
+        )
     var selected: Kitty? by mutableStateOf(null)
 }
 
@@ -305,8 +288,7 @@
 @Composable
 fun KittyItem(kitty: Kitty) {
     Column(
-        Modifier
-            .padding(start = 10.dp, end = 10.dp, bottom = 10.dp)
+        Modifier.padding(start = 10.dp, end = 10.dp, bottom = 10.dp)
             .sharedBounds(
                 rememberSharedContentState(key = "container + ${kitty.id}"),
                 this@AnimatedVisibilityScope,
@@ -317,37 +299,37 @@
             painter = painterResource(kitty.photoResId),
             contentDescription = null,
             contentScale = ContentScale.Crop,
-            modifier = Modifier
-                .sharedElement(
-                    rememberSharedContentState(key = kitty.id),
-                    this@AnimatedVisibilityScope,
-                    placeHolderSize = animatedSize
-                )
-                .aspectRatio(1f)
-                .clip(RoundedCornerShape(20.dp))
+            modifier =
+                Modifier.sharedElement(
+                        rememberSharedContentState(key = kitty.id),
+                        this@AnimatedVisibilityScope,
+                        placeHolderSize = animatedSize
+                    )
+                    .aspectRatio(1f)
+                    .clip(RoundedCornerShape(20.dp))
         )
         Spacer(Modifier.size(10.dp))
         Text(
             kitty.name,
             fontSize = 18.sp,
-            modifier = Modifier
-                .padding(start = 10.dp)
-                .sharedBounds(
-                    rememberSharedContentState(key = kitty.name + kitty.id),
-                    this@AnimatedVisibilityScope
-                )
+            modifier =
+                Modifier.padding(start = 10.dp)
+                    .sharedBounds(
+                        rememberSharedContentState(key = kitty.name + kitty.id),
+                        this@AnimatedVisibilityScope
+                    )
         )
         Spacer(Modifier.size(5.dp))
         Text(
             kitty.breed,
             fontSize = 15.sp,
             color = Color.Gray,
-            modifier = Modifier
-                .padding(start = 10.dp)
-                .sharedBounds(
-                    rememberSharedContentState(key = kitty.breed + kitty.id),
-                    this@AnimatedVisibilityScope
-                )
+            modifier =
+                Modifier.padding(start = 10.dp)
+                    .sharedBounds(
+                        rememberSharedContentState(key = kitty.breed + kitty.id),
+                        this@AnimatedVisibilityScope
+                    )
         )
         Spacer(Modifier.size(10.dp))
     }
diff --git a/compose/animation/animation/integration-tests/animation-demos/src/main/java/androidx/compose/animation/demos/sharedelement/ListToDetailsDemo.kt b/compose/animation/animation/integration-tests/animation-demos/src/main/java/androidx/compose/animation/demos/sharedelement/ListToDetailsDemo.kt
index e3c93c7..146ea3a 100644
--- a/compose/animation/animation/integration-tests/animation-demos/src/main/java/androidx/compose/animation/demos/sharedelement/ListToDetailsDemo.kt
+++ b/compose/animation/animation/integration-tests/animation-demos/src/main/java/androidx/compose/animation/demos/sharedelement/ListToDetailsDemo.kt
@@ -53,6 +53,7 @@
 
 sealed class Screen {
     object List : Screen()
+
     data class Details(val item: Int) : Screen()
 }
 
@@ -60,16 +61,13 @@
 @Composable
 @Preview
 fun ListToDetailsDemo() {
-    var state by remember {
-        mutableStateOf<Screen>(Screen.List)
-    }
-    val images = listOf(
-        R.drawable.pepper,
-        R.drawable.waffle,
-        R.drawable.yt_profile
-    )
+    var state by remember { mutableStateOf<Screen>(Screen.List) }
+    val images = listOf(R.drawable.pepper, R.drawable.waffle, R.drawable.yt_profile)
     SharedTransitionLayout(modifier = Modifier.fillMaxSize()) {
-        AnimatedContent(state, label = "", contentKey = { it.javaClass },
+        AnimatedContent(
+            state,
+            label = "",
+            contentKey = { it.javaClass },
             transitionSpec = {
                 if (initialState == Screen.List) {
                     slideInHorizontally { -it } + fadeIn() togetherWith
@@ -78,33 +76,37 @@
                     slideInHorizontally { it } + fadeIn() togetherWith
                         slideOutHorizontally { -it } + fadeOut()
                 }
-            }) {
+            }
+        ) {
             when (it) {
                 Screen.List -> {
                     LazyColumn {
                         items(50) { item ->
-                            Row(modifier = Modifier
-                                .clickable(
-                                    interactionSource = remember { MutableInteractionSource() },
-                                    indication = null
-                                ) {
-                                    state = Screen.Details(item)
-                                }
-                                .fillMaxWidth()) {
+                            Row(
+                                modifier =
+                                    Modifier.clickable(
+                                            interactionSource =
+                                                remember { MutableInteractionSource() },
+                                            indication = null
+                                        ) {
+                                            state = Screen.Details(item)
+                                        }
+                                        .fillMaxWidth()
+                            ) {
                                 Image(
                                     painter = painterResource(images[item % 3]),
-                                    modifier = Modifier
-                                        .size(100.dp)
-                                        .then(
-                                            if (item % 3 < 2) {
-                                                Modifier.sharedElement(
-                                                    rememberSharedContentState(
-                                                        key = "item-image$item"
-                                                    ),
-                                                    this@AnimatedContent,
-                                                )
-                                            } else Modifier
-                                        ),
+                                    modifier =
+                                        Modifier.size(100.dp)
+                                            .then(
+                                                if (item % 3 < 2) {
+                                                    Modifier.sharedElement(
+                                                        rememberSharedContentState(
+                                                            key = "item-image$item"
+                                                        ),
+                                                        this@AnimatedContent,
+                                                    )
+                                                } else Modifier
+                                            ),
                                     contentScale = ContentScale.Crop,
                                     contentDescription = null
                                 )
@@ -114,36 +116,33 @@
                         }
                     }
                 }
-
                 is Screen.Details -> {
                     val item = it.item
-                    Column(modifier = Modifier
-                        .fillMaxSize()
-                        .clickable(
-                            interactionSource = remember { MutableInteractionSource() },
-                            indication = null
-                        ) {
-                            state = Screen.List
-                        }) {
+                    Column(
+                        modifier =
+                            Modifier.fillMaxSize().clickable(
+                                interactionSource = remember { MutableInteractionSource() },
+                                indication = null
+                            ) {
+                                state = Screen.List
+                            }
+                    ) {
                         Image(
                             painter = painterResource(images[item % 3]),
-                            modifier = Modifier
-                                .then(
-                                    if (item % 3 < 2) {
-                                        Modifier.sharedElement(
-                                            rememberSharedContentState(key = "item-image$item"),
-                                            this@AnimatedContent,
-                                        )
-                                    } else Modifier
-                                )
-                                .fillMaxWidth(),
+                            modifier =
+                                Modifier.then(
+                                        if (item % 3 < 2) {
+                                            Modifier.sharedElement(
+                                                rememberSharedContentState(key = "item-image$item"),
+                                                this@AnimatedContent,
+                                            )
+                                        } else Modifier
+                                    )
+                                    .fillMaxWidth(),
                             contentScale = ContentScale.Crop,
                             contentDescription = null
                         )
-                        Text(
-                            "Item $item",
-                            fontSize = 23.sp
-                        )
+                        Text("Item $item", fontSize = 23.sp)
                     }
                 }
             }
diff --git a/compose/animation/animation/integration-tests/animation-demos/src/main/java/androidx/compose/animation/demos/sharedelement/NavigationWithSharedToolBarDemo.kt b/compose/animation/animation/integration-tests/animation-demos/src/main/java/androidx/compose/animation/demos/sharedelement/NavigationWithSharedToolBarDemo.kt
index 5ca54f2..2d006a8 100644
--- a/compose/animation/animation/integration-tests/animation-demos/src/main/java/androidx/compose/animation/demos/sharedelement/NavigationWithSharedToolBarDemo.kt
+++ b/compose/animation/animation/integration-tests/animation-demos/src/main/java/androidx/compose/animation/demos/sharedelement/NavigationWithSharedToolBarDemo.kt
@@ -49,17 +49,19 @@
     val navController = rememberNavController()
     SharedTransitionLayout {
         NavHost(navController, startDestination = "first") {
-            composable("first",
+            composable(
+                "first",
                 enterTransition = { slideInHorizontally(initialOffsetX = { -it }) },
                 exitTransition = { slideOutHorizontally(targetOffsetX = { it }) }
             ) {
                 Column {
                     TopAppBar(
                         title = { Text("Text") },
-                        modifier = Modifier.sharedElement(
-                            rememberSharedContentState(key = "appBar"),
-                            this@composable,
-                        )
+                        modifier =
+                            Modifier.sharedElement(
+                                rememberSharedContentState(key = "appBar"),
+                                this@composable,
+                            )
                     )
                     Text(
                         "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Praesent" +
@@ -74,17 +76,19 @@
                     }
                 }
             }
-            composable("second",
+            composable(
+                "second",
                 enterTransition = { slideInHorizontally(initialOffsetX = { -it }) },
                 exitTransition = { slideOutHorizontally(targetOffsetX = { it }) }
             ) {
                 Column {
                     TopAppBar(
                         title = { Text("Cat") },
-                        modifier = Modifier.sharedElement(
-                            rememberSharedContentState(key = "appBar"),
-                            this@composable,
-                        )
+                        modifier =
+                            Modifier.sharedElement(
+                                rememberSharedContentState(key = "appBar"),
+                                this@composable,
+                            )
                     )
                     Image(
                         painterResource(id = R.drawable.yt_profile),
@@ -92,14 +96,13 @@
                         contentScale = ContentScale.FillHeight,
                         modifier = Modifier.clip(shape = RoundedCornerShape(20.dp))
                     )
-                    Button(onClick = {
-                        navController.navigate("third")
-                    }) {
+                    Button(onClick = { navController.navigate("third") }) {
                         Text("Navigate to Empty Page")
                     }
                 }
             }
-            composable("third",
+            composable(
+                "third",
                 enterTransition = { slideInHorizontally(initialOffsetX = { -it }) },
                 exitTransition = { slideOutHorizontally(targetOffsetX = { it }) }
             ) {
diff --git a/compose/animation/animation/integration-tests/animation-demos/src/main/java/androidx/compose/animation/demos/sharedelement/SharedTransitionScopeDemo.kt b/compose/animation/animation/integration-tests/animation-demos/src/main/java/androidx/compose/animation/demos/sharedelement/SharedTransitionScopeDemo.kt
index 75338dd..2093f52 100644
--- a/compose/animation/animation/integration-tests/animation-demos/src/main/java/androidx/compose/animation/demos/sharedelement/SharedTransitionScopeDemo.kt
+++ b/compose/animation/animation/integration-tests/animation-demos/src/main/java/androidx/compose/animation/demos/sharedelement/SharedTransitionScopeDemo.kt
@@ -58,17 +58,18 @@
 @Composable
 fun SharedElementDemos() {
     var selectedTab by remember { mutableIntStateOf(0) }
-    val list = listOf<Pair<String, @Composable () -> Unit>>(
-        "AnimContent\n List To Details" to { ListToDetailsDemo() },
-        "Nested" to { NestedSharedElementDemo() },
-        "Expanded Card" to { SwitchBetweenCollapsedAndExpanded() },
-        "Container Transform" to { ContainerTransformDemo() },
-        "Shared Element\n Caller Managed Vis" to { SharedElementWithCallerManagedVisibility() },
-        "FABInOverlay" to { SharedElementWithFABInOverlaySample() },
-        "AnimatedContent" to { SharedElementInAnimatedContentSample() },
-        "Text transform" to { TextSharedBoundsExperiments() },
-        "Nav Shared Tool Bar" to { NavigationWithSharedToolBarDemo() },
-    )
+    val list =
+        listOf<Pair<String, @Composable () -> Unit>>(
+            "AnimContent\n List To Details" to { ListToDetailsDemo() },
+            "Nested" to { NestedSharedElementDemo() },
+            "Expanded Card" to { SwitchBetweenCollapsedAndExpanded() },
+            "Container Transform" to { ContainerTransformDemo() },
+            "Shared Element\n Caller Managed Vis" to { SharedElementWithCallerManagedVisibility() },
+            "FABInOverlay" to { SharedElementWithFABInOverlaySample() },
+            "AnimatedContent" to { SharedElementInAnimatedContentSample() },
+            "Text transform" to { TextSharedBoundsExperiments() },
+            "Nav Shared Tool Bar" to { NavigationWithSharedToolBarDemo() },
+        )
 
     Column {
         ScrollableTabRow(selectedTab) {
@@ -137,31 +138,31 @@
                 Text(
                     text = someText,
                     fontSize = 20.sp,
-                    modifier = Modifier
-                        .padding(20.dp)
-                        .sharedBounds(
-                            rememberSharedContentState(key = rememberSharedKey),
-                            this,
-                            EnterTransition.None,
-                            ExitTransition.None,
-                            resizeMode = ScaleToBounds(contentScale = ContentScale.Crop),
-                        )
+                    modifier =
+                        Modifier.padding(20.dp)
+                            .sharedBounds(
+                                rememberSharedContentState(key = rememberSharedKey),
+                                this,
+                                EnterTransition.None,
+                                ExitTransition.None,
+                                resizeMode = ScaleToBounds(contentScale = ContentScale.Crop),
+                            )
                 )
             } else {
                 Image(
                     painterResource(id = R.drawable.yt_profile),
                     contentDescription = "cute cat",
-                    modifier = Modifier
-                        .wrapContentSize()
-                        .sharedBounds(
-                            rememberSharedContentState(key = rememberSharedKey),
-                            this,
-                            EnterTransition.None,
-                            ExitTransition.None,
-                            resizeMode = ScaleToBounds(contentScale = ContentScale.Crop),
-                        )
-                        .requiredSize(200.dp)
-                        .clip(shape = RoundedCornerShape(10))
+                    modifier =
+                        Modifier.wrapContentSize()
+                            .sharedBounds(
+                                rememberSharedContentState(key = rememberSharedKey),
+                                this,
+                                EnterTransition.None,
+                                ExitTransition.None,
+                                resizeMode = ScaleToBounds(contentScale = ContentScale.Crop),
+                            )
+                            .requiredSize(200.dp)
+                            .clip(shape = RoundedCornerShape(10))
                 )
             }
         }
diff --git a/compose/animation/animation/integration-tests/animation-demos/src/main/java/androidx/compose/animation/demos/sharedelement/SwitchBetweenCollapsedAndExpanded.kt b/compose/animation/animation/integration-tests/animation-demos/src/main/java/androidx/compose/animation/demos/sharedelement/SwitchBetweenCollapsedAndExpanded.kt
index 4aad5fa..9a3c30d 100644
--- a/compose/animation/animation/integration-tests/animation-demos/src/main/java/androidx/compose/animation/demos/sharedelement/SwitchBetweenCollapsedAndExpanded.kt
+++ b/compose/animation/animation/integration-tests/animation-demos/src/main/java/androidx/compose/animation/demos/sharedelement/SwitchBetweenCollapsedAndExpanded.kt
@@ -76,12 +76,12 @@
 fun SwitchBetweenCollapsedAndExpanded() {
     var showExpandedCard by remember { mutableStateOf(false) }
     Box(
-        Modifier.clickable(onClick = {
-            showExpandedCard = !showExpandedCard
-        },
+        Modifier.clickable(
+            onClick = { showExpandedCard = !showExpandedCard },
             indication = null,
             interactionSource = remember { MutableInteractionSource() }
-        )) {
+        )
+    ) {
         SharedTransitionLayout {
             HomePage(!showExpandedCard)
             ExpandedCard(showExpandedCard)
@@ -92,28 +92,18 @@
 context(SharedTransitionScope)
 @Composable
 fun HomePage(showCard: Boolean) {
-    Box(
-        Modifier
-            .fillMaxSize()
-            .background(Color.White)
-    ) {
+    Box(Modifier.fillMaxSize().background(Color.White)) {
         Column {
             SearchBarAndTabs()
-            Box(
-                Modifier
-                    .fillMaxWidth()
-                    .aspectRatio(1.1f)
-            ) {
+            Box(Modifier.fillMaxWidth().aspectRatio(1.1f)) {
                 androidx.compose.animation.AnimatedVisibility(visible = showCard) {
                     Column(
-                        Modifier
-                            .padding(top = 10.dp, start = 10.dp, end = 10.dp)
+                        Modifier.padding(top = 10.dp, start = 10.dp, end = 10.dp)
                             .sharedBounds(
                                 rememberSharedContentState(key = "container"),
                                 this@AnimatedVisibility,
-                                clipInOverlayDuringTransition = OverlayClip(
-                                    RoundedCornerShape(20.dp)
-                                )
+                                clipInOverlayDuringTransition =
+                                    OverlayClip(RoundedCornerShape(20.dp))
                             )
                             .clip(shape = RoundedCornerShape(20.dp))
                             .background(color = cardBackgroundColor),
@@ -124,30 +114,32 @@
                                     painterResource(R.drawable.quiet_night),
                                     contentDescription = null,
                                     modifier =
-                                    Modifier
-                                        .fillMaxWidth()
-                                        .sharedElement(
-                                            rememberSharedContentState(key = "quiet_night"),
-                                            this@AnimatedVisibility,
-                                            zIndexInOverlay = 0.5f,
-                                        ),
+                                        Modifier.fillMaxWidth()
+                                            .sharedElement(
+                                                rememberSharedContentState(key = "quiet_night"),
+                                                this@AnimatedVisibility,
+                                                zIndexInOverlay = 0.5f,
+                                            ),
                                     contentScale = ContentScale.FillWidth
                                 )
                                 Text(
                                     text = longText,
                                     color = Color.Gray,
                                     fontSize = 15.sp,
-                                    modifier = Modifier
-                                        .fillMaxWidth()
-                                        .padding(start = 20.dp, end = 20.dp, top = 20.dp)
-                                        .height(14.dp)
-                                        .sharedElement(
-                                            rememberSharedContentState(key = "longText"),
-                                            this@AnimatedVisibility,
-                                        )
-                                        .clipToBounds()
-                                        .wrapContentHeight(align = Alignment.Top, unbounded = true)
-                                        .skipToLookaheadSize(),
+                                    modifier =
+                                        Modifier.fillMaxWidth()
+                                            .padding(start = 20.dp, end = 20.dp, top = 20.dp)
+                                            .height(14.dp)
+                                            .sharedElement(
+                                                rememberSharedContentState(key = "longText"),
+                                                this@AnimatedVisibility,
+                                            )
+                                            .clipToBounds()
+                                            .wrapContentHeight(
+                                                align = Alignment.Top,
+                                                unbounded = true
+                                            )
+                                            .skipToLookaheadSize(),
                                 )
                             }
 
@@ -156,32 +148,29 @@
                                 fontFamily = FontFamily.Default,
                                 color = Color.White,
                                 fontSize = 20.sp,
-                                modifier = Modifier
-                                    .fillMaxWidth()
-                                    .align(Alignment.BottomCenter)
-                                    .renderInSharedTransitionScopeOverlay(
-                                        zIndexInOverlay = 1f
-                                    )
-                                    .animateEnterExit(
-                                        fadeIn(tween(1000)) + slideInVertically { -it / 3 },
-                                        fadeOut(tween(50)) + slideOutVertically { -it / 3 }
-                                    )
-                                    .skipToLookaheadSize()
-                                    .background(
-                                        Brush.verticalGradient(
-                                            listOf(
-                                                Color.Transparent,
-                                                Color.Black,
-                                                Color.Transparent
+                                modifier =
+                                    Modifier.fillMaxWidth()
+                                        .align(Alignment.BottomCenter)
+                                        .renderInSharedTransitionScopeOverlay(zIndexInOverlay = 1f)
+                                        .animateEnterExit(
+                                            fadeIn(tween(1000)) + slideInVertically { -it / 3 },
+                                            fadeOut(tween(50)) + slideOutVertically { -it / 3 }
+                                        )
+                                        .skipToLookaheadSize()
+                                        .background(
+                                            Brush.verticalGradient(
+                                                listOf(
+                                                    Color.Transparent,
+                                                    Color.Black,
+                                                    Color.Transparent
+                                                )
                                             )
                                         )
-                                    )
-                                    .padding(20.dp),
+                                        .padding(20.dp),
                             )
                         }
                         InstallBar(
-                            Modifier
-                                .fillMaxWidth()
+                            Modifier.fillMaxWidth()
                                 .zIndex(1f)
                                 .sharedElementWithCallerManagedVisibility(
                                     rememberSharedContentState(key = "install_bar"),
@@ -194,10 +183,9 @@
             Cluster()
         }
         Image(
-            painterResource(R.drawable.navigation_bar), contentDescription = null,
-            Modifier
-                .fillMaxWidth()
-                .align(Alignment.BottomCenter),
+            painterResource(R.drawable.navigation_bar),
+            contentDescription = null,
+            Modifier.fillMaxWidth().align(Alignment.BottomCenter),
             contentScale = ContentScale.FillWidth
         )
     }
@@ -213,24 +201,21 @@
         fontWeight = FontWeight.W500,
         fontSize = 25.sp
     )
-    Row(
-        Modifier
-            .wrapContentWidth(align = Alignment.Start, unbounded = true)
-    ) {
+    Row(Modifier.wrapContentWidth(align = Alignment.Start, unbounded = true)) {
         Image(
-            painterResource(R.drawable.item0), contentDescription = null,
-            modifier = Modifier
-                .requiredHeight(200.dp)
-                .padding(start = 10.dp, top = 10.dp, bottom = 10.dp)
-                .clip(RoundedCornerShape(10.dp)),
+            painterResource(R.drawable.item0),
+            contentDescription = null,
+            modifier =
+                Modifier.requiredHeight(200.dp)
+                    .padding(start = 10.dp, top = 10.dp, bottom = 10.dp)
+                    .clip(RoundedCornerShape(10.dp)),
             contentScale = ContentScale.FillHeight
         )
         Image(
-            painterResource(R.drawable.item1), contentDescription = null,
-            modifier = Modifier
-                .requiredHeight(200.dp)
-                .padding(10.dp)
-                .clip(RoundedCornerShape(10.dp)),
+            painterResource(R.drawable.item1),
+            contentDescription = null,
+            modifier =
+                Modifier.requiredHeight(200.dp).padding(10.dp).clip(RoundedCornerShape(10.dp)),
             contentScale = ContentScale.FillHeight
         )
     }
@@ -240,18 +225,14 @@
 @Composable
 fun ExpandedCard(visible: Boolean) {
     AnimatedVisibility(
-        visible = visible, Modifier.fillMaxSize(),
+        visible = visible,
+        Modifier.fillMaxSize(),
         enter = fadeIn(),
         exit = fadeOut()
     ) {
-        Box(
-            Modifier
-                .fillMaxSize()
-                .background(Color(0x55000000))
-        ) {
+        Box(Modifier.fillMaxSize().background(Color(0x55000000))) {
             Column(
-                Modifier
-                    .align(Alignment.Center)
+                Modifier.align(Alignment.Center)
                     .padding(20.dp)
                     .sharedBounds(
                         rememberSharedContentState(key = "container"),
@@ -264,10 +245,7 @@
                     .background(cardBackgroundColor)
             ) {
                 Column(
-                    Modifier
-                        .renderInSharedTransitionScopeOverlay(
-                            zIndexInOverlay = 1f
-                        )
+                    Modifier.renderInSharedTransitionScopeOverlay(zIndexInOverlay = 1f)
                         .animateEnterExit(
                             fadeIn() + slideInVertically { it / 3 },
                             fadeOut() + slideOutVertically { it / 3 }
@@ -282,8 +260,7 @@
                 ) {
                     Text(
                         text = "Lorem ipsum",
-                        Modifier
-                            .padding(top = 20.dp, bottom = 10.dp)
+                        Modifier.padding(top = 20.dp, bottom = 10.dp)
                             .background(Color.LightGray, shape = RoundedCornerShape(15.dp))
                             .padding(top = 8.dp, bottom = 8.dp, start = 15.dp, end = 15.dp),
                         color = Color.Black,
@@ -295,20 +272,18 @@
                         text = title,
                         color = Color.White,
                         fontSize = 30.sp,
-                        modifier = Modifier
-                            .fillMaxWidth()
-                            .padding(bottom = 20.dp)
+                        modifier = Modifier.fillMaxWidth().padding(bottom = 20.dp)
                     )
                 }
                 Image(
-                    painterResource(R.drawable.quiet_night), contentDescription = null,
+                    painterResource(R.drawable.quiet_night),
+                    contentDescription = null,
                     modifier =
-                    Modifier
-                        .fillMaxWidth()
-                        .sharedElement(
-                            rememberSharedContentState("quiet_night"),
-                            this@AnimatedVisibility,
-                        ),
+                        Modifier.fillMaxWidth()
+                            .sharedElement(
+                                rememberSharedContentState("quiet_night"),
+                                this@AnimatedVisibility,
+                            ),
                     contentScale = ContentScale.FillWidth
                 )
 
@@ -316,22 +291,21 @@
                     text = longText,
                     color = Color.Gray,
                     fontSize = 15.sp,
-                    modifier = Modifier
-                        .fillMaxWidth()
-                        .padding(start = 15.dp, end = 10.dp, top = 10.dp)
-                        .height(50.dp)
-                        .sharedElement(
-                            rememberSharedContentState("longText"),
-                            this@AnimatedVisibility,
-                        )
-                        .clipToBounds()
-                        .wrapContentHeight(align = Alignment.Top, unbounded = true)
-                        .skipToLookaheadSize(),
+                    modifier =
+                        Modifier.fillMaxWidth()
+                            .padding(start = 15.dp, end = 10.dp, top = 10.dp)
+                            .height(50.dp)
+                            .sharedElement(
+                                rememberSharedContentState("longText"),
+                                this@AnimatedVisibility,
+                            )
+                            .clipToBounds()
+                            .wrapContentHeight(align = Alignment.Top, unbounded = true)
+                            .skipToLookaheadSize(),
                 )
 
                 InstallBar(
-                    Modifier
-                        .fillMaxWidth()
+                    Modifier.fillMaxWidth()
                         .zIndex(1f)
                         .sharedElement(
                             rememberSharedContentState("install_bar"),
@@ -346,17 +320,15 @@
 @Composable
 private fun SearchBarAndTabs() {
     Image(
-        painterResource(R.drawable.search_bar), contentDescription = null,
-        modifier =
-        Modifier
-            .fillMaxWidth(),
+        painterResource(R.drawable.search_bar),
+        contentDescription = null,
+        modifier = Modifier.fillMaxWidth(),
         contentScale = ContentScale.FillWidth
     )
     Image(
-        painterResource(R.drawable.tabs), contentDescription = null,
-        modifier =
-        Modifier
-            .fillMaxWidth(),
+        painterResource(R.drawable.tabs),
+        contentDescription = null,
+        modifier = Modifier.fillMaxWidth(),
         contentScale = ContentScale.FillWidth
     )
 }
@@ -371,18 +343,14 @@
             .requiredHeight(60.dp)
     ) {
         Image(
-            painterResource(R.drawable.quiet_night_thumb), contentDescription = null,
-            Modifier
-                .padding(10.dp)
-                .requiredSize(40.dp)
-                .clip(RoundedCornerShape(10.dp)),
+            painterResource(R.drawable.quiet_night_thumb),
+            contentDescription = null,
+            Modifier.padding(10.dp).requiredSize(40.dp).clip(RoundedCornerShape(10.dp)),
             contentScale = ContentScale.Crop
         )
 
         Column(
-            Modifier
-                .fillMaxHeight()
-                .padding(top = 10.dp, bottom = 10.dp),
+            Modifier.fillMaxHeight().padding(top = 10.dp, bottom = 10.dp),
             verticalArrangement = Arrangement.SpaceAround
         ) {
             Text("Lorem ipsum dolor", color = Color.LightGray, fontSize = 15.sp)
@@ -391,8 +359,7 @@
         Spacer(Modifier.weight(1f))
         Text(
             text = "Lorem",
-            Modifier
-                .background(Color.Gray, shape = RoundedCornerShape(25.dp))
+            Modifier.background(Color.Gray, shape = RoundedCornerShape(25.dp))
                 .align(Alignment.CenterVertically)
                 .padding(top = 8.dp, bottom = 8.dp, start = 25.dp, end = 25.dp),
             color = Color.White,
diff --git a/compose/animation/animation/integration-tests/animation-demos/src/main/java/androidx/compose/animation/demos/sharedelement/TextSharedBoundsExperiments.kt b/compose/animation/animation/integration-tests/animation-demos/src/main/java/androidx/compose/animation/demos/sharedelement/TextSharedBoundsExperiments.kt
index e7df728..f31964f 100644
--- a/compose/animation/animation/integration-tests/animation-demos/src/main/java/androidx/compose/animation/demos/sharedelement/TextSharedBoundsExperiments.kt
+++ b/compose/animation/animation/integration-tests/animation-demos/src/main/java/androidx/compose/animation/demos/sharedelement/TextSharedBoundsExperiments.kt
@@ -51,29 +51,27 @@
 import androidx.compose.ui.unit.sp
 
 /**
- * Experimenting with sharedBounds default transition for texts of different sizes, colors and
- * font styles, using the default scaleToBounds resize mode and fadeIn/Out
- * // TODO: A demo to compare different contentScale (i.e. Fill, Crop) for texts
- * // TODO: Play with scale in sharedElement
+ * Experimenting with sharedBounds default transition for texts of different sizes, colors and font
+ * styles, using the default scaleToBounds resize mode and fadeIn/Out // TODO: A demo to compare
+ * different contentScale (i.e. Fill, Crop) for texts // TODO: Play with scale in sharedElement
  */
 @Preview
 @Composable
 fun TextSharedBoundsExperiments() {
-    var isHorizontal by remember {
-        mutableStateOf(true)
-    }
+    var isHorizontal by remember { mutableStateOf(true) }
     SharedTransitionLayout(
-        Modifier
-            .clickable(
+        Modifier.clickable(
                 interactionSource = remember { MutableInteractionSource() },
                 indication = null
-            ) { isHorizontal = !isHorizontal }
+            ) {
+                isHorizontal = !isHorizontal
+            }
             .fillMaxSize()
-            .padding(20.dp)) {
+            .padding(20.dp)
+    ) {
         AnimatedContent(
             isHorizontal,
-            Modifier
-                .fillMaxSize()
+            Modifier.fillMaxSize()
                 .aspectRatio(1f)
                 .shadow(10.dp, RoundedCornerShape(10), clip = false)
                 .background(color = Color.White, shape = RoundedCornerShape(10))
@@ -86,9 +84,10 @@
                     horizontalArrangement = Arrangement.SpaceAround
                 ) {
                     Text(
-                        "Bold", fontSize = 30.sp,
-                        modifier = Modifier
-                            .sharedBounds(
+                        "Bold",
+                        fontSize = 30.sp,
+                        modifier =
+                            Modifier.sharedBounds(
                                 rememberSharedContentState(key = "Bold"),
                                 this@AnimatedContent
                             ),
@@ -96,9 +95,10 @@
                         color = Color(0xff4f6d7a)
                     )
                     Text(
-                        "Italic", fontSize = 30.sp,
-                        modifier = Modifier
-                            .sharedBounds(
+                        "Italic",
+                        fontSize = 30.sp,
+                        modifier =
+                            Modifier.sharedBounds(
                                 rememberSharedContentState(key = "Italic"),
                                 this@AnimatedContent
                             ),
@@ -106,10 +106,11 @@
                         color = Color.Gray
                     )
                     Text(
-                        "Normal", fontSize = 30.sp,
+                        "Normal",
+                        fontSize = 30.sp,
                         color = Color(0xff56a3a6),
-                        modifier = Modifier
-                            .sharedBounds(
+                        modifier =
+                            Modifier.sharedBounds(
                                 rememberSharedContentState(key = "Normal"),
                                 this@AnimatedContent
                             )
@@ -117,41 +118,41 @@
                 }
             } else {
                 Column(
-                    modifier = Modifier
-                        .fillMaxSize()
-                        .padding(20.dp),
+                    modifier = Modifier.fillMaxSize().padding(20.dp),
                     horizontalAlignment = Alignment.CenterHorizontally,
                     verticalArrangement = Arrangement.SpaceAround
                 ) {
                     Text(
-                        "Normal", fontSize = 50.sp,
-                        modifier = Modifier
-                            .fillMaxWidth()
-                            .wrapContentWidth(align = Alignment.CenterHorizontally)
-                            .sharedBounds(
-                                rememberSharedContentState(key = "Normal"),
-                                this@AnimatedContent,
-                            ),
+                        "Normal",
+                        fontSize = 50.sp,
+                        modifier =
+                            Modifier.fillMaxWidth()
+                                .wrapContentWidth(align = Alignment.CenterHorizontally)
+                                .sharedBounds(
+                                    rememberSharedContentState(key = "Normal"),
+                                    this@AnimatedContent,
+                                ),
                         color = Color(0xffE85D04)
                     )
                     Text(
-                        "Bold", fontSize = 70.sp,
+                        "Bold",
+                        fontSize = 70.sp,
                         fontWeight = FontWeight.Bold,
                         color = Color(0xffF48C06),
-                        modifier = Modifier
-                            .fillMaxWidth()
-                            .wrapContentWidth(align = Alignment.CenterHorizontally)
-                            .sharedBounds(
-                                rememberSharedContentState(key = "Bold"),
-                                this@AnimatedContent
-                            )
+                        modifier =
+                            Modifier.fillMaxWidth()
+                                .wrapContentWidth(align = Alignment.CenterHorizontally)
+                                .sharedBounds(
+                                    rememberSharedContentState(key = "Bold"),
+                                    this@AnimatedContent
+                                )
                     )
                     Text(
                         "Italic",
                         fontSize = 50.sp,
                         fontStyle = FontStyle.Italic,
-                        modifier = Modifier
-                            .sharedBounds(
+                        modifier =
+                            Modifier.sharedBounds(
                                 rememberSharedContentState(key = "Italic"),
                                 this@AnimatedContent
                             ),
diff --git a/compose/animation/animation/integration-tests/animation-demos/src/main/java/androidx/compose/animation/demos/singlevalue/SingleValueAnimationDemo.kt b/compose/animation/animation/integration-tests/animation-demos/src/main/java/androidx/compose/animation/demos/singlevalue/SingleValueAnimationDemo.kt
index 37d1c78..344c768 100644
--- a/compose/animation/animation/integration-tests/animation-demos/src/main/java/androidx/compose/animation/demos/singlevalue/SingleValueAnimationDemo.kt
+++ b/compose/animation/animation/integration-tests/animation-demos/src/main/java/androidx/compose/animation/demos/singlevalue/SingleValueAnimationDemo.kt
@@ -38,22 +38,17 @@
 fun SingleValueAnimationDemo() {
     val enabled = remember { mutableStateOf(true) }
     val alpha: Float by animateFloatAsState(if (enabled.value) 1f else 0.5f)
-    val color by animateColorAsState(
-        if (enabled.value) Color.Green else Color.Magenta,
-        spring()
-    ) {
-        println("Finished at color $it")
-    }
+    val color by
+        animateColorAsState(if (enabled.value) Color.Green else Color.Magenta, spring()) {
+            println("Finished at color $it")
+        }
     Box(
-        Modifier
-            .fillMaxSize()
+        Modifier.fillMaxSize()
             .clickable(
                 indication = null,
                 interactionSource = remember { MutableInteractionSource() }
             ) {
-                enabled
-                    .value = !enabled
-                    .value
+                enabled.value = !enabled.value
             }
             .graphicsLayer { this.alpha = alpha }
             .background(color)
diff --git a/compose/animation/animation/integration-tests/animation-demos/src/main/java/androidx/compose/animation/demos/statetransition/CrossfadeDemo.kt b/compose/animation/animation/integration-tests/animation-demos/src/main/java/androidx/compose/animation/demos/statetransition/CrossfadeDemo.kt
index 2fa45b8..3d8ca78 100644
--- a/compose/animation/animation/integration-tests/animation-demos/src/main/java/androidx/compose/animation/demos/statetransition/CrossfadeDemo.kt
+++ b/compose/animation/animation/integration-tests/animation-demos/src/main/java/androidx/compose/animation/demos/statetransition/CrossfadeDemo.kt
@@ -46,11 +46,7 @@
         Row {
             tabs.forEachIndexed { index, tab ->
                 Box(
-                    Modifier.pointerInput(Unit) {
-                        detectTapGestures {
-                            current = index
-                        }
-                    }
+                    Modifier.pointerInput(Unit) { detectTapGestures { current = index } }
                         .weight(1f, true)
                         .height(48.dp)
                         .background(tab.color)
@@ -69,11 +65,7 @@
     }
 }
 
-private val tabs = listOf(
-    Tab(Color(1f, 0f, 0f)),
-    Tab(Color(0f, 1f, 0f)),
-    Tab(Color(0f, 0f, 1f))
-)
+private val tabs = listOf(Tab(Color(1f, 0f, 0f)), Tab(Color(0f, 1f, 0f)), Tab(Color(0f, 0f, 1f)))
 
 private data class Tab(val color: Color) {
     var lastInt: Int = 0
diff --git a/compose/animation/animation/integration-tests/animation-demos/src/main/java/androidx/compose/animation/demos/statetransition/DoubleTapToLikeDemo.kt b/compose/animation/animation/integration-tests/animation-demos/src/main/java/androidx/compose/animation/demos/statetransition/DoubleTapToLikeDemo.kt
index 7001051..c11279e 100644
--- a/compose/animation/animation/integration-tests/animation-demos/src/main/java/androidx/compose/animation/demos/statetransition/DoubleTapToLikeDemo.kt
+++ b/compose/animation/animation/integration-tests/animation-demos/src/main/java/androidx/compose/animation/demos/statetransition/DoubleTapToLikeDemo.kt
@@ -82,52 +82,49 @@
         }
 
         val transition = rememberTransition(transitionState)
-        val alpha by transition.animateFloat(
-            transitionSpec = {
-                when {
-                    LikedStates.Initial isTransitioningTo LikedStates.Liked ->
-                        keyframes {
-                            durationMillis = 500
-                            0f at 0 // optional
-                            0.5f at 100
-                            1f at 225 // optional
-                        }
-                    LikedStates.Liked isTransitioningTo LikedStates.Disappeared ->
-                        tween(durationMillis = 200)
-                    else -> snap()
+        val alpha by
+            transition.animateFloat(
+                transitionSpec = {
+                    when {
+                        LikedStates.Initial isTransitioningTo LikedStates.Liked ->
+                            keyframes {
+                                durationMillis = 500
+                                0f at 0 // optional
+                                0.5f at 100
+                                1f at 225 // optional
+                            }
+                        LikedStates.Liked isTransitioningTo LikedStates.Disappeared ->
+                            tween(durationMillis = 200)
+                        else -> snap()
+                    }
                 }
+            ) {
+                if (it == LikedStates.Liked) 1f else 0f
             }
-        ) {
-            if (it == LikedStates.Liked) 1f else 0f
-        }
 
-        val scale by transition.animateFloat(
-            transitionSpec = {
-                when {
-                    LikedStates.Initial isTransitioningTo LikedStates.Liked ->
-                        spring(dampingRatio = Spring.DampingRatioHighBouncy)
-                    LikedStates.Liked isTransitioningTo LikedStates.Disappeared ->
-                        tween(200)
-                    else -> snap()
+        val scale by
+            transition.animateFloat(
+                transitionSpec = {
+                    when {
+                        LikedStates.Initial isTransitioningTo LikedStates.Liked ->
+                            spring(dampingRatio = Spring.DampingRatioHighBouncy)
+                        LikedStates.Liked isTransitioningTo LikedStates.Disappeared -> tween(200)
+                        else -> snap()
+                    }
+                }
+            ) {
+                when (it) {
+                    LikedStates.Initial -> 0f
+                    LikedStates.Liked -> 4f
+                    LikedStates.Disappeared -> 2f
                 }
             }
-        ) {
-            when (it) {
-                LikedStates.Initial -> 0f
-                LikedStates.Liked -> 4f
-                LikedStates.Disappeared -> 2f
-            }
-        }
 
         Icon(
             Icons.Filled.Favorite,
             "Like",
             Modifier.align(Alignment.Center)
-                .graphicsLayer(
-                    alpha = alpha,
-                    scaleX = scale,
-                    scaleY = scale
-                ),
+                .graphicsLayer(alpha = alpha, scaleX = scale, scaleY = scale),
             tint = Color.Red
         )
     }
diff --git a/compose/animation/animation/integration-tests/animation-demos/src/main/java/androidx/compose/animation/demos/statetransition/InfiniteTransitionDemo.kt b/compose/animation/animation/integration-tests/animation-demos/src/main/java/androidx/compose/animation/demos/statetransition/InfiniteTransitionDemo.kt
index 0f11385..aefd05d 100644
--- a/compose/animation/animation/integration-tests/animation-demos/src/main/java/androidx/compose/animation/demos/statetransition/InfiniteTransitionDemo.kt
+++ b/compose/animation/animation/integration-tests/animation-demos/src/main/java/androidx/compose/animation/demos/statetransition/InfiniteTransitionDemo.kt
@@ -64,31 +64,29 @@
 fun InfinitePulsingHeart() {
     val infiniteTransition = rememberInfiniteTransition()
 
-    val scale by infiniteTransition.animateFloat(
-        initialValue = 3f,
-        targetValue = 6f,
-        animationSpec = infiniteRepeatable(
-            animation = tween(1000),
-            repeatMode = RepeatMode.Restart
+    val scale by
+        infiniteTransition.animateFloat(
+            initialValue = 3f,
+            targetValue = 6f,
+            animationSpec =
+                infiniteRepeatable(animation = tween(1000), repeatMode = RepeatMode.Restart)
         )
-    )
 
-    val color by infiniteTransition.animateColor(
-        initialValue = Color.Red,
-        targetValue = Color(0xff800000), // Dark Red
-        animationSpec = infiniteRepeatable(
-            animation = tween(1000, easing = LinearEasing),
-            repeatMode = RepeatMode.Reverse
+    val color by
+        infiniteTransition.animateColor(
+            initialValue = Color.Red,
+            targetValue = Color(0xff800000), // Dark Red
+            animationSpec =
+                infiniteRepeatable(
+                    animation = tween(1000, easing = LinearEasing),
+                    repeatMode = RepeatMode.Reverse
+                )
         )
-    )
 
     Icon(
         Icons.Filled.Favorite,
         null,
-        Modifier.graphicsLayer(
-            scaleX = scale,
-            scaleY = scale
-        ),
+        Modifier.graphicsLayer(scaleX = scale, scaleY = scale),
         tint = color
     )
 }
@@ -105,15 +103,19 @@
 
 @Composable
 fun InfiniteTransition.PulsingDot(startOffset: StartOffset) {
-    val scale by animateFloat(
-        0.2f,
-        1f,
-        infiniteRepeatable(tween(600), RepeatMode.Reverse, initialStartOffset = startOffset)
-    )
+    val scale by
+        animateFloat(
+            0.2f,
+            1f,
+            infiniteRepeatable(tween(600), RepeatMode.Reverse, initialStartOffset = startOffset)
+        )
     Box(
-        Modifier.padding(5.dp).size(20.dp).graphicsLayer {
-            scaleX = scale
-            scaleY = scale
-        }.background(Color.Gray, shape = CircleShape)
+        Modifier.padding(5.dp)
+            .size(20.dp)
+            .graphicsLayer {
+                scaleX = scale
+                scaleY = scale
+            }
+            .background(Color.Gray, shape = CircleShape)
     )
 }
diff --git a/compose/animation/animation/integration-tests/animation-demos/src/main/java/androidx/compose/animation/demos/statetransition/LoadingAnimationDemo.kt b/compose/animation/animation/integration-tests/animation-demos/src/main/java/androidx/compose/animation/demos/statetransition/LoadingAnimationDemo.kt
index ea8a81f..6698f90 100644
--- a/compose/animation/animation/integration-tests/animation-demos/src/main/java/androidx/compose/animation/demos/statetransition/LoadingAnimationDemo.kt
+++ b/compose/animation/animation/integration-tests/animation-demos/src/main/java/androidx/compose/animation/demos/statetransition/LoadingAnimationDemo.kt
@@ -56,9 +56,7 @@
 @Composable
 fun LoadingAnimationDemo() {
     val isLoading = remember { mutableStateOf(true) }
-    Box(Modifier.fillMaxSize().background(BackgroundColor).clickable {
-        isLoading.value = false
-    }) {
+    Box(Modifier.fillMaxSize().background(BackgroundColor).clickable { isLoading.value = false }) {
         ActualContent()
         LoadingOverlay(isLoading = isLoading)
     }
@@ -86,23 +84,15 @@
             fontFamily = FontFamily(typeface = Typeface.SANS_SERIF),
             fontSize = 40.sp,
             color = Color(0xff173d6e),
-            modifier = Modifier.align(Alignment.CenterHorizontally)
-                .padding(top = 10.dp, bottom = 5.dp)
+            modifier =
+                Modifier.align(Alignment.CenterHorizontally).padding(top = 10.dp, bottom = 5.dp)
         )
         Row {
-            Text(
-                "Age:",
-                fontWeight = FontWeight.Bold,
-                modifier = Modifier.width(80.dp)
-            )
+            Text("Age:", fontWeight = FontWeight.Bold, modifier = Modifier.width(80.dp))
             Text("10")
         }
         Row {
-            Text(
-                "Breed:",
-                fontWeight = FontWeight.Bold,
-                modifier = Modifier.width(80.dp)
-            )
+            Text("Breed:", fontWeight = FontWeight.Bold, modifier = Modifier.width(80.dp))
             Text("Tabby")
         }
         Text(
@@ -125,9 +115,7 @@
 val BackgroundColor: Color = Color(0xffdbe5ef)
 
 @Composable
-fun LoadingOverlay(
-    isLoading: State<Boolean>
-) {
+fun LoadingOverlay(isLoading: State<Boolean>) {
     val fraction = remember { Animatable(0f) }
     var reveal by remember { mutableStateOf(false) }
     LaunchedEffect(Unit) {
@@ -150,21 +138,14 @@
 
     // Draw gradient..
     Box(
-        Modifier
-            .fillMaxSize()
-            .drawWithCache {
-                val gradient = Brush.verticalGradient(
-                    listOf(
-                        Color.Transparent,
-                        GradientColor.copy(alpha = 0.2f),
-                        BackgroundColor
-                    ),
+        Modifier.fillMaxSize().drawWithCache {
+            val gradient =
+                Brush.verticalGradient(
+                    listOf(Color.Transparent, GradientColor.copy(alpha = 0.2f), BackgroundColor),
                     startY = size.height * (fraction.value - 0.1f),
                     endY = size.height * (fraction.value + 0.1f)
                 )
-                onDrawWithContent {
-                    drawRect(gradient)
-                }
-            }
+            onDrawWithContent { drawRect(gradient) }
+        }
     )
 }
diff --git a/compose/animation/animation/integration-tests/animation-demos/src/main/java/androidx/compose/animation/demos/statetransition/MultiDimensionalAnimationDemo.kt b/compose/animation/animation/integration-tests/animation-demos/src/main/java/androidx/compose/animation/demos/statetransition/MultiDimensionalAnimationDemo.kt
index 6f90300..15b332f 100644
--- a/compose/animation/animation/integration-tests/animation-demos/src/main/java/androidx/compose/animation/demos/statetransition/MultiDimensionalAnimationDemo.kt
+++ b/compose/animation/animation/integration-tests/animation-demos/src/main/java/androidx/compose/animation/demos/statetransition/MultiDimensionalAnimationDemo.kt
@@ -44,46 +44,47 @@
     var currentState by remember { mutableStateOf(AnimState.Collapsed) }
     val onClick = {
         // Cycle through states when clicked.
-        currentState = when (currentState) {
-            AnimState.Collapsed -> AnimState.Expanded
-            AnimState.Expanded -> AnimState.PutAway
-            AnimState.PutAway -> AnimState.Collapsed
-        }
+        currentState =
+            when (currentState) {
+                AnimState.Collapsed -> AnimState.Expanded
+                AnimState.Expanded -> AnimState.PutAway
+                AnimState.PutAway -> AnimState.Collapsed
+            }
     }
 
     var width by remember { mutableFloatStateOf(0f) }
     var height by remember { mutableFloatStateOf(0f) }
     val transition = updateTransition(currentState)
-    val rect by transition.animateRect(transitionSpec = { spring(stiffness = 100f) }) {
-        when (it) {
-            AnimState.Collapsed -> Rect(600f, 600f, 900f, 900f)
-            AnimState.Expanded -> Rect(0f, 400f, width, height - 400f)
-            AnimState.PutAway -> Rect(width - 300f, height - 300f, width, height)
+    val rect by
+        transition.animateRect(transitionSpec = { spring(stiffness = 100f) }) {
+            when (it) {
+                AnimState.Collapsed -> Rect(600f, 600f, 900f, 900f)
+                AnimState.Expanded -> Rect(0f, 400f, width, height - 400f)
+                AnimState.PutAway -> Rect(width - 300f, height - 300f, width, height)
+            }
         }
-    }
 
-    val color by transition.animateColor(transitionSpec = { tween(durationMillis = 500) }) {
-        when (it) {
-            AnimState.Collapsed -> Color.LightGray
-            AnimState.Expanded -> Color(0xFFd0fff8)
-            AnimState.PutAway -> Color(0xFFe3ffd9)
+    val color by
+        transition.animateColor(transitionSpec = { tween(durationMillis = 500) }) {
+            when (it) {
+                AnimState.Collapsed -> Color.LightGray
+                AnimState.Expanded -> Color(0xFFd0fff8)
+                AnimState.PutAway -> Color(0xFFe3ffd9)
+            }
         }
-    }
     Canvas(
-        modifier = Modifier.fillMaxSize().clickable(
-            onClick = onClick,
-            indication = null,
-            interactionSource = remember { MutableInteractionSource() }
-        )
+        modifier =
+            Modifier.fillMaxSize()
+                .clickable(
+                    onClick = onClick,
+                    indication = null,
+                    interactionSource = remember { MutableInteractionSource() }
+                )
     ) {
         width = size.width
         height = size.height
 
-        drawRect(
-            color,
-            topLeft = Offset(rect.left, rect.top),
-            size = Size(rect.width, rect.height)
-        )
+        drawRect(color, topLeft = Offset(rect.left, rect.top), size = Size(rect.width, rect.height))
     }
 }
 
diff --git a/compose/animation/animation/integration-tests/animation-demos/src/main/java/androidx/compose/animation/demos/statetransition/RepeatedRotationDemo.kt b/compose/animation/animation/integration-tests/animation-demos/src/main/java/androidx/compose/animation/demos/statetransition/RepeatedRotationDemo.kt
index 96a75fd..b2643d8 100644
--- a/compose/animation/animation/integration-tests/animation-demos/src/main/java/androidx/compose/animation/demos/statetransition/RepeatedRotationDemo.kt
+++ b/compose/animation/animation/integration-tests/animation-demos/src/main/java/androidx/compose/animation/demos/statetransition/RepeatedRotationDemo.kt
@@ -49,46 +49,37 @@
 fun RepeatedRotationDemo() {
     val state = remember { mutableStateOf(RotationStates.Original) }
     Column(
-        Modifier.fillMaxSize()
-            .wrapContentSize(Alignment.Center),
+        Modifier.fillMaxSize().wrapContentSize(Alignment.Center),
         verticalArrangement = Arrangement.SpaceEvenly
     ) {
-        Button(
-            { state.value = RotationStates.Rotated }
-        ) {
-            Text(text = "Rotate 10 times")
-        }
+        Button({ state.value = RotationStates.Rotated }) { Text(text = "Rotate 10 times") }
         Spacer(Modifier.requiredHeight(10.dp))
-        Button(
-            { state.value = RotationStates.Original }
-        ) {
-            Text(text = "Reset")
-        }
+        Button({ state.value = RotationStates.Original }) { Text(text = "Reset") }
         Spacer(Modifier.requiredHeight(10.dp))
         val transition = updateTransition(state.value)
         @Suppress("UnusedTransitionTargetStateParameter")
-        val rotation by transition.animateFloat(
-            transitionSpec = {
-                if (initialState == RotationStates.Original) {
-                    repeatable(
-                        iterations = 10,
-                        animation = keyframes {
-                            durationMillis = 1000
-                            0f at 0 using LinearEasing
-                            360f at 1000
-                        }
-                    )
-                } else {
-                    tween(durationMillis = 300)
+        val rotation by
+            transition.animateFloat(
+                transitionSpec = {
+                    if (initialState == RotationStates.Original) {
+                        repeatable(
+                            iterations = 10,
+                            animation =
+                                keyframes {
+                                    durationMillis = 1000
+                                    0f at 0 using LinearEasing
+                                    360f at 1000
+                                }
+                        )
+                    } else {
+                        tween(durationMillis = 300)
+                    }
                 }
+            ) {
+                0f
             }
-        ) {
-            0f
-        }
         Canvas(Modifier.size(100.dp)) {
-            rotate(rotation, Offset.Zero) {
-                drawRect(Color(0xFF00FF00))
-            }
+            rotate(rotation, Offset.Zero) { drawRect(Color(0xFF00FF00)) }
         }
     }
 }
diff --git a/compose/animation/animation/integration-tests/animation-demos/src/main/java/androidx/compose/animation/demos/suspendfun/ArcOffsetDemo.kt b/compose/animation/animation/integration-tests/animation-demos/src/main/java/androidx/compose/animation/demos/suspendfun/ArcOffsetDemo.kt
index ea765b4..65493c5 100644
--- a/compose/animation/animation/integration-tests/animation-demos/src/main/java/androidx/compose/animation/demos/suspendfun/ArcOffsetDemo.kt
+++ b/compose/animation/animation/integration-tests/animation-demos/src/main/java/androidx/compose/animation/demos/suspendfun/ArcOffsetDemo.kt
@@ -63,15 +63,11 @@
     val points = remember { mutableStateListOf<Offset>() }
     val target = remember { MutableStateFlow(Offset.Unspecified) }
     Box(
-        Modifier
-            .fillMaxSize()
+        Modifier.fillMaxSize()
             .pointerInput(Unit) {
                 val halfSize = size.toSize() * 0.5f
                 detectTapGestures {
-                    target.value = Offset(
-                        x = it.x - halfSize.width,
-                        y = it.y - halfSize.height
-                    )
+                    target.value = Offset(x = it.x - halfSize.width, y = it.y - halfSize.height)
                 }
             }
             .drawBehind {
@@ -90,12 +86,9 @@
     ) {
         Text("Tap anywhere to animate")
         Box(
-            Modifier
-                .size(50.dp)
+            Modifier.size(50.dp)
                 .align(Alignment.Center)
-                .offset {
-                    animOffset.value.round()
-                }
+                .offset { animOffset.value.round() }
                 .background(Color.Red, RoundedCornerShape(50))
         )
     }
@@ -111,12 +104,13 @@
                 val mode = if (diffOff.y > 0f) ArcBelow else ArcAbove
                 animOffset.animateTo(
                     targetValue = target,
-                    animationSpec = keyframes {
-                        durationMillis = 1400
+                    animationSpec =
+                        keyframes {
+                            durationMillis = 1400
 
-                        current atFraction 0f using LinearEasing using ArcLinear
-                        midOffset atFraction 0.5f using FastOutSlowInEasing using mode
-                    }
+                            current atFraction 0f using LinearEasing using ArcLinear
+                            midOffset atFraction 0.5f using FastOutSlowInEasing using mode
+                        }
                 ) {
                     points.add(value)
                 }
diff --git a/compose/animation/animation/integration-tests/animation-demos/src/main/java/androidx/compose/animation/demos/suspendfun/InfiniteAnimationDemo.kt b/compose/animation/animation/integration-tests/animation-demos/src/main/java/androidx/compose/animation/demos/suspendfun/InfiniteAnimationDemo.kt
index f16a41d..b27e257 100644
--- a/compose/animation/animation/integration-tests/animation-demos/src/main/java/androidx/compose/animation/demos/suspendfun/InfiniteAnimationDemo.kt
+++ b/compose/animation/animation/integration-tests/animation-demos/src/main/java/androidx/compose/animation/demos/suspendfun/InfiniteAnimationDemo.kt
@@ -45,10 +45,8 @@
         animate(
             initialValue = 1f,
             targetValue = 0f,
-            animationSpec = infiniteRepeatable(
-                animation = tween(1000),
-                repeatMode = RepeatMode.Reverse
-            )
+            animationSpec =
+                infiniteRepeatable(animation = tween(1000), repeatMode = RepeatMode.Reverse)
         ) { value, _ ->
             alpha = value
         }
@@ -57,12 +55,9 @@
         Icon(
             Icons.Filled.Favorite,
             contentDescription = null,
-            modifier = Modifier.align(Alignment.Center)
-                .graphicsLayer(
-                    scaleX = 3.0f,
-                    scaleY = 3.0f,
-                    alpha = alpha
-                ),
+            modifier =
+                Modifier.align(Alignment.Center)
+                    .graphicsLayer(scaleX = 3.0f, scaleY = 3.0f, alpha = alpha),
             tint = Color.Red
         )
     }
diff --git a/compose/animation/animation/integration-tests/animation-demos/src/main/java/androidx/compose/animation/demos/suspendfun/OffsetKeyframeSplinePlaygroundDemo.kt b/compose/animation/animation/integration-tests/animation-demos/src/main/java/androidx/compose/animation/demos/suspendfun/OffsetKeyframeSplinePlaygroundDemo.kt
index 6356b68..7534afc 100644
--- a/compose/animation/animation/integration-tests/animation-demos/src/main/java/androidx/compose/animation/demos/suspendfun/OffsetKeyframeSplinePlaygroundDemo.kt
+++ b/compose/animation/animation/integration-tests/animation-demos/src/main/java/androidx/compose/animation/demos/suspendfun/OffsetKeyframeSplinePlaygroundDemo.kt
@@ -98,47 +98,28 @@
 
     Column(Modifier.fillMaxSize()) {
         Text(text = "Touch and drag to move anchors. DSL is printed in Logcat.")
-        Box(
-            Modifier
-                .fillMaxWidth()
-                .weight(1f, true)
-        ) {
+        Box(Modifier.fillMaxWidth().weight(1f, true)) {
             dslText.value?.let {
-                Popup(
-                    alignment = Alignment.Center,
-                    onDismissRequest = { dslText.value = null }
-                ) {
+                Popup(alignment = Alignment.Center, onDismissRequest = { dslText.value = null }) {
                     Text(text = it)
                 }
-            } ?: kotlin.run {
-                playgroundModel.DrawContent(Modifier.fillMaxSize())
-            }
+            } ?: kotlin.run { playgroundModel.DrawContent(Modifier.fillMaxSize()) }
         }
         Column(Modifier.padding(start = 12.dp, end = 12.dp)) {
             Row(
                 horizontalArrangement = Arrangement.SpaceBetween,
                 modifier = Modifier.fillMaxWidth()
             ) {
-                Button(onClick = playgroundModel::onRun) {
-                    Text(text = "Run")
-                }
+                Button(onClick = playgroundModel::onRun) { Text(text = "Run") }
                 Button(
-                    onClick = {
-                        dslText.value = playgroundModel.getDslText()
-                    },
+                    onClick = { dslText.value = playgroundModel.getDslText() },
                     enabled = dslText.value == null
                 ) {
                     Text(text = "DSL")
                 }
                 Row(horizontalArrangement = Arrangement.spacedBy(8.dp)) {
-                    Button(onClick = {
-                        playgroundModel.addAnchor(density)
-                    }) {
-                        Text(text = "Add")
-                    }
-                    Button(onClick = playgroundModel::removeAnchor) {
-                        Text(text = "Remove")
-                    }
+                    Button(onClick = { playgroundModel.addAnchor(density) }) { Text(text = "Add") }
+                    Button(onClick = playgroundModel::removeAnchor) { Text(text = "Remove") }
                 }
             }
             Text("Duration: ${playgroundModel.totalDuration.roundToInt()}ms")
@@ -153,9 +134,7 @@
 
 @Suppress("PrimitiveInCollection")
 @OptIn(ExperimentalAnimationSpecApi::class)
-private class SplineKeyframesPlaygroundModel(
-    private val scope: CoroutineScope
-) {
+private class SplineKeyframesPlaygroundModel(private val scope: CoroutineScope) {
     private val zero2DVector = AnimationVector2D(0f, 0f)
 
     // TODO: This is extremely hacky, find a way to improve
@@ -177,6 +156,7 @@
     val totalDuration by derivedStateOf { anchors.size * durationPerAnchor.floatValue }
 
     private var isInit = false
+
     private fun init(density: Density) {
         if (!isInit) {
             repeat((pointCount.toFloat() / 2f).roundToInt()) {
@@ -241,19 +221,13 @@
                     if (anchors.isEmpty()) {
                         return@drawBehind
                     }
-                    val textOffsetPx = with(this) {
-                        Offset(textOffset.toPx(), textOffset.toPx())
-                    }
+                    val textOffsetPx = with(this) { Offset(textOffset.toPx(), textOffset.toPx()) }
 
                     // Draw anchors
                     translate(center.x, center.y) {
                         anchors.forEachIndexed { index, anchorPosition ->
                             translate(anchorPosition.x, anchorPosition.y) {
-                                drawPath(
-                                    path = diamondPath,
-                                    color = diamondColor,
-                                    style = Fill
-                                )
+                                drawPath(path = diamondPath, color = diamondColor, style = Fill)
                                 val text = getTextForAnchor(index)
                                 drawText(
                                     textLayoutResult = textMeasurer.measure(text),
@@ -266,9 +240,7 @@
                 }
                 .pointerInput(Unit) {
                     detectDragGestures(
-                        onDragStart = {
-                            onDragStart(it, size)
-                        },
+                        onDragStart = { onDragStart(it, size) },
                         onDragEnd = this@SplineKeyframesPlaygroundModel::onDragEnd,
                         onDragCancel = this@SplineKeyframesPlaygroundModel::onDragEnd,
                         onDrag = this@SplineKeyframesPlaygroundModel::onDrag
@@ -278,16 +250,14 @@
             Text(
                 text = "✈",
                 fontSize = 42.sp,
-                modifier = Modifier
-                    .align(Alignment.Center)
-                    .graphicsLayer {
-                        translationX = -13f
-                        translationY = 5f
-                    }
-                    .offset {
-                        animatedOffset.value.round()
-                    }
-                    .graphicsLayer { rotationZ = angle.floatValue - 90f }
+                modifier =
+                    Modifier.align(Alignment.Center)
+                        .graphicsLayer {
+                            translationX = -13f
+                            translationY = 5f
+                        }
+                        .offset { animatedOffset.value.round() }
+                        .graphicsLayer { rotationZ = angle.floatValue - 90f }
             )
         }
 
@@ -295,24 +265,27 @@
         LaunchedEffect(modificationIndicator) {
             samplePoints.clear()
             var i = 0
-            val vectorized = keyframesWithSpline(0.5f) {
-                durationMillis = totalDuration.roundToInt()
+            val vectorized =
+                keyframesWithSpline(0.5f) {
+                        durationMillis = totalDuration.roundToInt()
 
-                anchors.forEachIndexed { index, offset ->
-                    val fraction = (index + 1f) / (anchorCount + 1)
-                    offset atFraction fraction
-                }
-            }.vectorize(Offset.VectorConverter)
+                        anchors.forEachIndexed { index, offset ->
+                            val fraction = (index + 1f) / (anchorCount + 1)
+                            offset atFraction fraction
+                        }
+                    }
+                    .vectorize(Offset.VectorConverter)
 
             var timeMillis = 0f
             val step = vectorized.durationMillis.toFloat() / sampleCount
             while (isActive && i < sampleCount) {
-                val vectorValue = vectorized.getValueFromNanos(
-                    playTimeNanos = timeMillis.roundToLong() * 1_000_000,
-                    initialValue = zero2DVector,
-                    targetValue = zero2DVector,
-                    initialVelocity = zero2DVector
-                )
+                val vectorValue =
+                    vectorized.getValueFromNanos(
+                        playTimeNanos = timeMillis.roundToLong() * 1_000_000,
+                        initialValue = zero2DVector,
+                        targetValue = zero2DVector,
+                        initialVelocity = zero2DVector
+                    )
                 samplePoints.add(Offset(vectorValue.v1, vectorValue.v2))
                 timeMillis += step
                 i++
@@ -364,17 +337,18 @@
             animatedOffset.snapTo(Offset.Zero)
             animatedOffset.animateTo(
                 targetValue = Offset.Zero,
-                animationSpec = InfiniteRepeatableSpec(
-                    keyframesWithSpline(0.5f) {
-                        durationMillis = totalDuration.roundToInt()
+                animationSpec =
+                    InfiniteRepeatableSpec(
+                        keyframesWithSpline(0.5f) {
+                            durationMillis = totalDuration.roundToInt()
 
-                        anchors.forEachIndexed { index, offset ->
-                            val fraction = (index + 1f) / (anchorCount + 1)
-                            offset atFraction fraction
-                        }
-                    },
-                    RepeatMode.Restart
-                )
+                            anchors.forEachIndexed { index, offset ->
+                                val fraction = (index + 1f) / (anchorCount + 1)
+                                offset atFraction fraction
+                            }
+                        },
+                        RepeatMode.Restart
+                    )
             ) {
                 angle.floatValue =
                     Math.toDegrees(atan2(y = velocity.y, x = velocity.x).toDouble()).toFloat() + 90f
@@ -387,16 +361,18 @@
     private val last = 90
     private val length = last - first + 1 // inclusive
     private val textCache = mutableMapOf<Int, String>()
+
     private fun getTextForAnchor(anchorIndex: Int): String {
         if (textCache.containsKey(anchorIndex)) {
             return textCache[anchorIndex]!!
         }
         var text = ""
-        val textLength = if (anchorIndex == 0) {
-            1
-        } else {
-            log(anchorIndex.toFloat(), length.toFloat()).toInt() + 1
-        }
+        val textLength =
+            if (anchorIndex == 0) {
+                1
+            } else {
+                log(anchorIndex.toFloat(), length.toFloat()).toInt() + 1
+            }
         var value = anchorIndex
         for (i in 0 until textLength) {
             val codeOffset = value % length
@@ -413,9 +389,7 @@
     private val angleStep = 1f / pointCount
     private val angleInitialOff = angleStep / 2f // Offset to visually center the angles
 
-    /**
-     * Get the next offset, relative to the center of the layout.
-     */
+    /** Get the next offset, relative to the center of the layout. */
     private fun getNextPosition(density: Density): Offset {
         val nextPointIndex = anchors.size
         val posInAngle = nextPointIndex % pointCount
@@ -438,10 +412,8 @@
     //   private val diffThreshold = 10 * 10 * 2
     private fun onDragStart(position: Offset, size: IntSize) {
         scope.launch { animatedOffset.snapTo(Offset.Zero) }
-        val relPosition = Offset(
-            position.x - (size.width * 0.5f),
-            position.y - (size.height * 0.5f)
-        )
+        val relPosition =
+            Offset(position.x - (size.width * 0.5f), position.y - (size.height * 0.5f))
         var closestIndex = -1
         var smallestDiff = Long.MAX_VALUE
 
diff --git a/compose/animation/animation/integration-tests/animation-demos/src/main/java/androidx/compose/animation/demos/suspendfun/OffsetKeyframeWithSplineDemo.kt b/compose/animation/animation/integration-tests/animation-demos/src/main/java/androidx/compose/animation/demos/suspendfun/OffsetKeyframeWithSplineDemo.kt
index 490fa95..7f4c391 100644
--- a/compose/animation/animation/integration-tests/animation-demos/src/main/java/androidx/compose/animation/demos/suspendfun/OffsetKeyframeWithSplineDemo.kt
+++ b/compose/animation/animation/integration-tests/animation-demos/src/main/java/androidx/compose/animation/demos/suspendfun/OffsetKeyframeWithSplineDemo.kt
@@ -56,17 +56,15 @@
     val density = LocalDensity.current
 
     BoxWithConstraints(
-        Modifier
-            .fillMaxSize()
-            .drawBehind {
-                drawPoints(
-                    points = points,
-                    pointMode = PointMode.Lines,
-                    color = Color.LightGray,
-                    strokeWidth = 4f,
-                    pathEffect = PathEffect.dashPathEffect(floatArrayOf(30f, 20f))
-                )
-            }
+        Modifier.fillMaxSize().drawBehind {
+            drawPoints(
+                points = points,
+                pointMode = PointMode.Lines,
+                color = Color.LightGray,
+                strokeWidth = 4f,
+                pathEffect = PathEffect.dashPathEffect(floatArrayOf(30f, 20f))
+            )
+        }
     ) {
         val minDimension = minOf(maxWidth, maxHeight)
         val size = minDimension / 4
@@ -79,16 +77,11 @@
         val maxYOff = heightPx - (sizePx / 2f)
 
         Box(
-            Modifier
-                .align(Alignment.TopCenter)
-                .offset {
-                    offsetAnim.value.round()
-                }
+            Modifier.align(Alignment.TopCenter)
+                .offset { offsetAnim.value.round() }
                 .size(size)
                 .background(Color.Red, RoundedCornerShape(50))
-                .onPlaced {
-                    points.add(it.boundsInParent().center)
-                }
+                .onPlaced { points.add(it.boundsInParent().center) }
         )
 
         LaunchedEffect(Unit) {
@@ -96,32 +89,33 @@
             while (isActive) {
                 offsetAnim.animateTo(
                     targetValue = Offset.Zero,
-                    animationSpec = keyframesWithSpline {
-                        durationMillis = 2400
+                    animationSpec =
+                        keyframesWithSpline {
+                            durationMillis = 2400
 
-                        // Increasingly approach the halfway point moving from side to side
-                        repeat(4) {
-                            val i = it + 1
-                            val sign = if (i % 2 == 0) 1 else -1
-                            Offset(
-                                x = maxXOff * (i.toFloat() / 5f) * sign,
-                                y = (maxYOff) * (i.toFloat() / 5f)
-                            ) atFraction (0.1f * i)
+                            // Increasingly approach the halfway point moving from side to side
+                            repeat(4) {
+                                val i = it + 1
+                                val sign = if (i % 2 == 0) 1 else -1
+                                Offset(
+                                    x = maxXOff * (i.toFloat() / 5f) * sign,
+                                    y = (maxYOff) * (i.toFloat() / 5f)
+                                ) atFraction (0.1f * i)
+                            }
+
+                            // Halfway point (at bottom of the screen)
+                            Offset(0f, maxYOff) atFraction 0.5f
+
+                            // Return with mirrored movement
+                            repeat(4) {
+                                val i = it + 1
+                                val sign = if (i % 2 == 0) 1 else -1
+                                Offset(
+                                    x = maxXOff * (1f - i.toFloat() / 5f) * sign,
+                                    y = (maxYOff) * (1f - i.toFloat() / 5f)
+                                ) atFraction ((0.1f * i) + 0.5f)
+                            }
                         }
-
-                        // Halfway point (at bottom of the screen)
-                        Offset(0f, maxYOff) atFraction 0.5f
-
-                        // Return with mirrored movement
-                        repeat(4) {
-                            val i = it + 1
-                            val sign = if (i % 2 == 0) 1 else -1
-                            Offset(
-                                x = maxXOff * (1f - i.toFloat() / 5f) * sign,
-                                y = (maxYOff) * (1f - i.toFloat() / 5f)
-                            ) atFraction ((0.1f * i) + 0.5f)
-                        }
-                    }
                 )
                 points.clear()
             }
diff --git a/compose/animation/animation/integration-tests/animation-demos/src/main/java/androidx/compose/animation/demos/suspendfun/PeriodicMonoSplineDemo.kt b/compose/animation/animation/integration-tests/animation-demos/src/main/java/androidx/compose/animation/demos/suspendfun/PeriodicMonoSplineDemo.kt
index e7f44d3..752e2e3 100644
--- a/compose/animation/animation/integration-tests/animation-demos/src/main/java/androidx/compose/animation/demos/suspendfun/PeriodicMonoSplineDemo.kt
+++ b/compose/animation/animation/integration-tests/animation-demos/src/main/java/androidx/compose/animation/demos/suspendfun/PeriodicMonoSplineDemo.kt
@@ -68,33 +68,23 @@
 fun PeriodicMonoSplineDemo() {
     Column(
         verticalArrangement = Arrangement.spacedBy(8.dp),
-        modifier = Modifier
-            .fillMaxWidth()
-            .verticalScroll(rememberScrollState())
+        modifier = Modifier.fillMaxWidth().verticalScroll(rememberScrollState())
     ) {
         MonoSplineCurve(
             periodicBias = Float.NaN,
-            modifier = Modifier
-                .height(300.dp)
-                .background(Color.LightGray)
+            modifier = Modifier.height(300.dp).background(Color.LightGray)
         )
         MonoSplineCurve(
             periodicBias = 0f,
-            modifier = Modifier
-                .height(300.dp)
-                .background(Color.LightGray)
+            modifier = Modifier.height(300.dp).background(Color.LightGray)
         )
         MonoSplineCurve(
             periodicBias = 0.5f,
-            modifier = Modifier
-                .height(300.dp)
-                .background(Color.LightGray)
+            modifier = Modifier.height(300.dp).background(Color.LightGray)
         )
         MonoSplineCurve(
             periodicBias = 1f,
-            modifier = Modifier
-                .height(300.dp)
-                .background(Color.LightGray)
+            modifier = Modifier.height(300.dp).background(Color.LightGray)
         )
     }
 }
@@ -112,10 +102,7 @@
 private val indicatorSize = 4.dp
 
 @Composable
-private fun MonoSplineCurve(
-    periodicBias: Float,
-    modifier: Modifier = Modifier
-) {
+private fun MonoSplineCurve(periodicBias: Float, modifier: Modifier = Modifier) {
     val sampleSize = 1_000
     val density = LocalDensity.current
     val keyframesSpec = remember(periodicBias) { periodicKeyframes(periodicBias) }
@@ -124,45 +111,41 @@
     var isDraw by remember { mutableStateOf(false) }
 
     val infiniteAnimation = rememberInfiniteTransition()
-    val animatedValue = infiniteAnimation.animateValue(
-        initialValue = Offset.Zero,
-        targetValue = Offset(1f, 0f),
-        typeConverter = Offset.VectorConverter,
-        animationSpec = InfiniteRepeatableSpec(
-            animation = keyframesSpec,
-            repeatMode = RepeatMode.Restart
+    val animatedValue =
+        infiniteAnimation.animateValue(
+            initialValue = Offset.Zero,
+            targetValue = Offset(1f, 0f),
+            typeConverter = Offset.VectorConverter,
+            animationSpec =
+                InfiniteRepeatableSpec(animation = keyframesSpec, repeatMode = RepeatMode.Restart)
         )
-    )
 
-    val text = remember(periodicBias) {
-        if (periodicBias.isNaN()) {
-            "Normal Monotonic Spline"
-        } else {
-            "Periodic with bias: $periodicBias"
+    val text =
+        remember(periodicBias) {
+            if (periodicBias.isNaN()) {
+                "Normal Monotonic Spline"
+            } else {
+                "Periodic with bias: $periodicBias"
+            }
         }
-    }
 
     val indicatorSizePx = with(density) { indicatorSize.toPx() }
-    val indicatorPath = remember(indicatorSizePx) {
-        Path().apply {
-            moveTo(0f, -indicatorSizePx)
-            lineTo(indicatorSizePx, 0f)
-            lineTo(0f, indicatorSizePx)
-            lineTo(-indicatorSizePx, 0f)
-            close()
+    val indicatorPath =
+        remember(indicatorSizePx) {
+            Path().apply {
+                moveTo(0f, -indicatorSizePx)
+                lineTo(indicatorSizePx, 0f)
+                lineTo(0f, indicatorSizePx)
+                lineTo(-indicatorSizePx, 0f)
+                close()
+            }
         }
-    }
 
     Row(modifier) {
-        Box(
-            Modifier
-                .fillMaxHeight()
-                .weight(1f, true)
-        ) {
+        Box(Modifier.fillMaxHeight().weight(1f, true)) {
             Text(text = text)
             Box(
-                Modifier
-                    .fillMaxSize()
+                Modifier.fillMaxSize()
                     .padding(padding)
                     .drawWithCache {
                         if (isDraw) {
@@ -192,33 +175,23 @@
                         scale(1f, -1f) {
                             val currValue = animatedValue.value
                             translate(size.width * currValue.x, size.height * currValue.y) {
-                                drawPath(
-                                    path = indicatorPath,
-                                    color = Color.Red,
-                                    style = Fill
-                                )
+                                drawPath(path = indicatorPath, color = Color.Red, style = Fill)
                             }
                         }
                     }
             )
         }
         Box(
-            Modifier
-                .fillMaxHeight()
-                .width(40.dp)
-                .padding(vertical = padding)
-                .drawBehind {
-                    scale(1f, -1f) {
-                        drawCircle(
-                            color = Color.Red,
-                            radius = size.width * 0.5f,
-                            center = Offset(
-                                x = size.width * 0.5f,
-                                y = size.height * animatedValue.value.y
-                            )
-                        )
-                    }
+            Modifier.fillMaxHeight().width(40.dp).padding(vertical = padding).drawBehind {
+                scale(1f, -1f) {
+                    drawCircle(
+                        color = Color.Red,
+                        radius = size.width * 0.5f,
+                        center =
+                            Offset(x = size.width * 0.5f, y = size.height * animatedValue.value.y)
+                    )
                 }
+            }
         )
     }
 
@@ -229,12 +202,13 @@
         val step = vectorized.durationMillis.toFloat() / sampleSize
         var count = 0
         while (count < sampleSize) {
-            val vectorValue = vectorized.getValueFromNanos(
-                playTimeNanos = timeMillis.roundToLong() * 1_000_000,
-                initialValue = zeroVector,
-                targetValue = zeroVector,
-                initialVelocity = zeroVector
-            )
+            val vectorValue =
+                vectorized.getValueFromNanos(
+                    playTimeNanos = timeMillis.roundToLong() * 1_000_000,
+                    initialValue = zeroVector,
+                    targetValue = zeroVector,
+                    initialVelocity = zeroVector
+                )
             points[count] = vectorValue.v2
             timeMillis += step
             count++
diff --git a/compose/animation/animation/integration-tests/animation-demos/src/main/java/androidx/compose/animation/demos/suspendfun/SuspendDoubleTapToLikeDemo.kt b/compose/animation/animation/integration-tests/animation-demos/src/main/java/androidx/compose/animation/demos/suspendfun/SuspendDoubleTapToLikeDemo.kt
index b3691cc..7095efa 100644
--- a/compose/animation/animation/integration-tests/animation-demos/src/main/java/androidx/compose/animation/demos/suspendfun/SuspendDoubleTapToLikeDemo.kt
+++ b/compose/animation/animation/integration-tests/animation-demos/src/main/java/androidx/compose/animation/demos/suspendfun/SuspendDoubleTapToLikeDemo.kt
@@ -60,31 +60,15 @@
                             coroutineScope {
                                 // `launch` creates a new coroutine without blocking. This allows
                                 // the two animations in this CoroutineScope to run together.
-                                launch {
-                                    animate(0f, 1f) { value, _ ->
-                                        alpha = value
-                                    }
-                                }
-                                launch {
-                                    animate(0f, 2f) { value, _ ->
-                                        scale = value
-                                    }
-                                }
+                                launch { animate(0f, 1f) { value, _ -> alpha = value } }
+                                launch { animate(0f, 2f) { value, _ -> scale = value } }
                             }
                             // CoroutineScope doesn't return until all animations in the scope
                             // finish. So by the time we get here, the enter animations from the
                             // previous CoroutineScope have all finished.
                             coroutineScope {
-                                launch {
-                                    animate(alpha, 0f) { value, _ ->
-                                        alpha = value
-                                    }
-                                }
-                                launch {
-                                    animate(scale, 4f) { value, _ ->
-                                        scale = value
-                                    }
-                                }
+                                launch { animate(alpha, 0f) { value, _ -> alpha = value } }
+                                launch { animate(scale, 4f) { value, _ -> scale = value } }
                             }
                         }
                     }
@@ -96,11 +80,7 @@
             Icons.Filled.Favorite,
             "Like",
             Modifier.align(Alignment.Center)
-                .graphicsLayer(
-                    alpha = alpha,
-                    scaleX = scale,
-                    scaleY = scale
-                ),
+                .graphicsLayer(alpha = alpha, scaleX = scale, scaleY = scale),
             tint = Color.Red
         )
     }
diff --git a/compose/animation/animation/integration-tests/animation-demos/src/main/java/androidx/compose/animation/demos/vectorgraphics/AnimatedVectorGraphicsDemo.kt b/compose/animation/animation/integration-tests/animation-demos/src/main/java/androidx/compose/animation/demos/vectorgraphics/AnimatedVectorGraphicsDemo.kt
index 8e59114..f0f7a8d 100644
--- a/compose/animation/animation/integration-tests/animation-demos/src/main/java/androidx/compose/animation/demos/vectorgraphics/AnimatedVectorGraphicsDemo.kt
+++ b/compose/animation/animation/integration-tests/animation-demos/src/main/java/androidx/compose/animation/demos/vectorgraphics/AnimatedVectorGraphicsDemo.kt
@@ -66,9 +66,7 @@
         Image(
             painter = rememberAnimatedVectorPainter(image, atEnd),
             contentDescription = "AnimatedImageVector",
-            modifier = Modifier.size(200.dp).clickable {
-                atEnd = !atEnd
-            },
+            modifier = Modifier.size(200.dp).clickable { atEnd = !atEnd },
             contentScale = ContentScale.Crop
         )
 
@@ -76,9 +74,7 @@
         Image(
             painter = createSampleVectorPainter(toggle),
             contentDescription = "Transition with vector graphics",
-            modifier = Modifier.size(200.dp).clickable {
-                toggle = !toggle
-            },
+            modifier = Modifier.size(200.dp).clickable { toggle = !toggle },
             contentScale = ContentScale.Crop
         )
     }
@@ -97,70 +93,78 @@
         val transition = updateTransition(targetState = toggle, label = "sample")
         val duration = 3000
         Path(
-            pathData = PathData {
-                horizontalLineTo(24f)
-                verticalLineTo(24f)
-                horizontalLineTo(0f)
-                close()
-            },
+            pathData =
+                PathData {
+                    horizontalLineTo(24f)
+                    verticalLineTo(24f)
+                    horizontalLineTo(0f)
+                    close()
+                },
             fill = SolidColor(Color.Cyan)
         )
-        val rotation by transition.animateFloat(
-            transitionSpec = {
-                if (targetState) {
-                    keyframes {
-                        durationMillis = duration
-                        0f at 0
-                        360f at duration using LinearEasing
+        val rotation by
+            transition.animateFloat(
+                transitionSpec = {
+                    if (targetState) {
+                        keyframes {
+                            durationMillis = duration
+                            0f at 0
+                            360f at duration using LinearEasing
+                        }
+                    } else {
+                        spring(
+                            dampingRatio = Spring.DampingRatioMediumBouncy,
+                            stiffness = Spring.StiffnessVeryLow
+                        )
                     }
-                } else {
-                    spring(
-                        dampingRatio = Spring.DampingRatioMediumBouncy,
-                        stiffness = Spring.StiffnessVeryLow
-                    )
-                }
-            },
-            label = "rotation"
-        ) { state ->
-            if (state) 360f else 0f
-        }
+                },
+                label = "rotation"
+            ) { state ->
+                if (state) 360f else 0f
+            }
 
         @Suppress("UnusedTransitionTargetStateParameter")
-        val translationX by transition.animateFloat(
-            transitionSpec = {
-                if (targetState) {
-                    keyframes {
-                        durationMillis = duration
-                        -6f at 500
-                        6f at 1500
-                        -6f at 2000
-                        6f at 2500
+        val translationX by
+            transition.animateFloat(
+                transitionSpec = {
+                    if (targetState) {
+                        keyframes {
+                            durationMillis = duration
+                            -6f at 500
+                            6f at 1500
+                            -6f at 2000
+                            6f at 2500
+                        }
+                    } else {
+                        spring(
+                            dampingRatio = Spring.DampingRatioHighBouncy,
+                            stiffness = Spring.StiffnessLow
+                        )
                     }
-                } else {
-                    spring(
-                        dampingRatio = Spring.DampingRatioHighBouncy,
-                        stiffness = Spring.StiffnessLow
-                    )
-                }
-            },
-            label = "translationX"
-        ) { 0f }
+                },
+                label = "translationX"
+            ) {
+                0f
+            }
 
         @Suppress("UnusedTransitionTargetStateParameter")
-        val translationY by transition.animateFloat(
-            transitionSpec = {
-                if (targetState) {
-                    keyframes {
-                        durationMillis = duration
-                        -6f at 1000
-                        6f at 2000
+        val translationY by
+            transition.animateFloat(
+                transitionSpec = {
+                    if (targetState) {
+                        keyframes {
+                            durationMillis = duration
+                            -6f at 1000
+                            6f at 2000
+                        }
+                    } else {
+                        spring()
                     }
-                } else {
-                    spring()
-                }
-            },
-            label = "translationY"
-        ) { 0f }
+                },
+                label = "translationY"
+            ) {
+                0f
+            }
         Group(
             name = "rectangle",
             rotation = rotation,
@@ -169,30 +173,32 @@
             pivotX = 12f,
             pivotY = 12f
         ) {
-            val fillColor by transition.animateColor(
-                transitionSpec = {
-                    if (targetState) {
-                        keyframes {
-                            durationMillis = duration
-                            Color.Red at 0
-                            Color.Blue at duration using LinearEasing
+            val fillColor by
+                transition.animateColor(
+                    transitionSpec = {
+                        if (targetState) {
+                            keyframes {
+                                durationMillis = duration
+                                Color.Red at 0
+                                Color.Blue at duration using LinearEasing
+                            }
+                        } else {
+                            spring()
                         }
-                    } else {
-                        spring()
-                    }
-                },
-                label = "fillColor"
-            ) { state ->
-                if (state) Color.Blue else Color.Red
-            }
+                    },
+                    label = "fillColor"
+                ) { state ->
+                    if (state) Color.Blue else Color.Red
+                }
             Path(
-                pathData = PathData {
-                    moveTo(8f, 8f)
-                    lineTo(16f, 8f)
-                    lineTo(16f, 16f)
-                    lineTo(8f, 16f)
-                    close()
-                },
+                pathData =
+                    PathData {
+                        moveTo(8f, 8f)
+                        lineTo(16f, 8f)
+                        lineTo(16f, 16f)
+                        lineTo(8f, 16f)
+                        close()
+                    },
                 fill = SolidColor(fillColor)
             )
         }
diff --git a/compose/animation/animation/integration-tests/animation-demos/src/main/java/androidx/compose/animation/demos/visualaid/ColumnConfigurationDemo.kt b/compose/animation/animation/integration-tests/animation-demos/src/main/java/androidx/compose/animation/demos/visualaid/ColumnConfigurationDemo.kt
index 493dc79..f9598b3 100644
--- a/compose/animation/animation/integration-tests/animation-demos/src/main/java/androidx/compose/animation/demos/visualaid/ColumnConfigurationDemo.kt
+++ b/compose/animation/animation/integration-tests/animation-demos/src/main/java/androidx/compose/animation/demos/visualaid/ColumnConfigurationDemo.kt
@@ -53,25 +53,26 @@
 @Preview
 @Composable
 fun ColumnConfigurationDemo() {
-    val height by produceState(250.dp) {
-        // Skip the animations in tests.
-        while (coroutineContext[InfiniteAnimationPolicy] == null) {
-            animate(
-                Dp.VectorConverter, 250.dp, 520.dp,
-                animationSpec = spring(Spring.DampingRatioMediumBouncy, Spring.StiffnessLow)
-            ) { value, _ ->
-                this.value = value
+    val height by
+        produceState(250.dp) {
+            // Skip the animations in tests.
+            while (coroutineContext[InfiniteAnimationPolicy] == null) {
+                animate(
+                    Dp.VectorConverter,
+                    250.dp,
+                    520.dp,
+                    animationSpec = spring(Spring.DampingRatioMediumBouncy, Spring.StiffnessLow)
+                ) { value, _ ->
+                    this.value = value
+                }
+                delay(1000)
+                animate(Dp.VectorConverter, 520.dp, 250.dp, animationSpec = tween(520)) { value, _
+                    ->
+                    this.value = value
+                }
+                delay(1000)
             }
-            delay(1000)
-            animate(
-                Dp.VectorConverter, 520.dp, 250.dp,
-                animationSpec = tween(520)
-            ) { value, _ ->
-                this.value = value
-            }
-            delay(1000)
         }
-    }
     ResizableColumn(height)
 }
 
@@ -89,7 +90,8 @@
             Text(
                 text = "Equal\nWeight",
                 modifier = Modifier.width(50.dp).padding(2.dp),
-                fontSize = 12.sp, textAlign = TextAlign.Center
+                fontSize = 12.sp,
+                textAlign = TextAlign.Center
             )
             Text(
                 text = "Space\nBetween",
@@ -169,15 +171,20 @@
 }
 
 private fun Modifier.default(backgroundColor: Color) =
-    this.width(50.dp).padding(2.dp)
-        .background(backgroundColor, RoundedCornerShape(5.dp)).padding(top = 3.dp, bottom = 3.dp)
+    this.width(50.dp)
+        .padding(2.dp)
+        .background(backgroundColor, RoundedCornerShape(5.dp))
+        .padding(top = 3.dp, bottom = 3.dp)
         .fillMaxHeight()
 
 @Composable
 fun ColumnScope.ColumnItem(text: String, fixedSize: Boolean = true) {
     val modifier = if (fixedSize) Modifier.height(80.dp) else Modifier.weight(1f)
     Box(
-        modifier.width(50.dp).padding(5.dp).shadow(10.dp)
+        modifier
+            .width(50.dp)
+            .padding(5.dp)
+            .shadow(10.dp)
             .background(Color.White, shape = RoundedCornerShape(5.dp))
             .padding(top = 5.dp, bottom = 5.dp)
     ) {
diff --git a/compose/animation/animation/integration-tests/animation-demos/src/main/java/androidx/compose/animation/demos/visualaid/EasingFunctionDemo.kt b/compose/animation/animation/integration-tests/animation-demos/src/main/java/androidx/compose/animation/demos/visualaid/EasingFunctionDemo.kt
index de22e70..cb539fb 100644
--- a/compose/animation/animation/integration-tests/animation-demos/src/main/java/androidx/compose/animation/demos/visualaid/EasingFunctionDemo.kt
+++ b/compose/animation/animation/integration-tests/animation-demos/src/main/java/androidx/compose/animation/demos/visualaid/EasingFunctionDemo.kt
@@ -60,15 +60,11 @@
 @Composable
 fun EasingInfoDemo() {
     val coroutineScope = rememberCoroutineScope()
-    LazyColumn {
-        bezierCurveList(coroutineScope)
-    }
+    LazyColumn { bezierCurveList(coroutineScope) }
 }
 
 fun LazyListScope.bezierCurveList(coroutineScope: CoroutineScope) {
-    val graphModifier = Modifier
-        .height(200.dp)
-        .fillMaxWidth()
+    val graphModifier = Modifier.height(200.dp).fillMaxWidth()
 
     items(EasingItemDemo.values()) { item: EasingItemDemo ->
         EasingInfo(easing = item, modifier = graphModifier, coroutineScope = coroutineScope)
@@ -85,9 +81,7 @@
     Column(modifier = modifier.padding(16.dp)) {
         Text(easing.description)
         Spacer(modifier = Modifier.height(16.dp))
-        Box {
-            EasingGraph(easing = easing.function, coroutineScope = coroutineScope)
-        }
+        Box { EasingGraph(easing = easing.function, coroutineScope = coroutineScope) }
     }
 }
 
@@ -97,17 +91,14 @@
     modifier: Modifier = Modifier,
     coroutineScope: CoroutineScope = rememberCoroutineScope(),
 ) {
-    val path = remember(easing) {
-        val path = Path()
-        path
-    }
+    val path =
+        remember(easing) {
+            val path = Path()
+            path
+        }
 
-    val time = remember(easing) {
-        Animatable(0f)
-    }
-    val easedValue = remember(easing) {
-        Animatable(0f)
-    }
+    val time = remember(easing) { Animatable(0f) }
+    val easedValue = remember(easing) { Animatable(0f) }
     val listPoints = remember {
         val list = mutableStateListOf<Animatable<Float, AnimationVector1D>>()
         for (i in 0..NUMBER_SAMPLES) {
@@ -129,22 +120,18 @@
     Row(modifier = modifier.fillMaxWidth()) {
         Box {
             Text("y", modifier = Modifier.align(Alignment.TopStart), fontSize = 12.sp)
-            Canvas(modifier = modifier
-                .aspectRatio(1f)
-                .padding(16.dp)
-                .pointerInput(Any()) {
-                    detectTapGestures {
-                        runAnimation(coroutineScope, time, easedValue, easing)
-                    }
-                },
+            Canvas(
+                modifier =
+                    modifier.aspectRatio(1f).padding(16.dp).pointerInput(Any()) {
+                        detectTapGestures { runAnimation(coroutineScope, time, easedValue, easing) }
+                    },
                 onDraw = {
                     drawGraphAxis()
                     updateGraphPath(easing, path, listPoints)
                     drawEasingPath(path, easing, time)
-                })
-            Text("time",
-                modifier = Modifier.align(Alignment.BottomEnd),
-                fontSize = 12.sp)
+                }
+            )
+            Text("time", modifier = Modifier.align(Alignment.BottomEnd), fontSize = 12.sp)
         }
         ExtraEasingSamples(easedValue)
     }
@@ -162,9 +149,9 @@
         val transformedYValue = easing.transform(time.value)
         // animated circle on graph
         drawCircle(
-            androidGreen, 8.dp.toPx(), center = Offset(
-                time.value * this.size.width, -transformedYValue * this.size.height
-            )
+            androidGreen,
+            8.dp.toPx(),
+            center = Offset(time.value * this.size.width, -transformedYValue * this.size.height)
         )
     }
 }
@@ -179,11 +166,7 @@
     path.moveTo(0f, -initialPoint)
     for (i in 0..NUMBER_SAMPLES) {
         val point = listPoints[i]
-        path.lineTo(
-            i / NUMBER_SAMPLES.toFloat() * this.size.width, -point.value * this
-                .size
-                .height
-        )
+        path.lineTo(i / NUMBER_SAMPLES.toFloat() * this.size.width, -point.value * this.size.height)
     }
 }
 
@@ -214,22 +197,19 @@
     coroutineScope.launch {
         time.snapTo(0f)
         time.animateTo(
-            1f, animationSpec = tween(
-                easing = LinearEasing,
-                durationMillis = EASING_DURATION_MILLIS
-            )
+            1f,
+            animationSpec = tween(easing = LinearEasing, durationMillis = EASING_DURATION_MILLIS)
         )
     }
     coroutineScope.launch {
         easedValue.snapTo(0f)
         easedValue.animateTo(
-            1f, animationSpec = tween(
-                easing = easing,
-                durationMillis = EASING_DURATION_MILLIS
-            )
+            1f,
+            animationSpec = tween(easing = easing, durationMillis = EASING_DURATION_MILLIS)
         )
     }
 }
+
 private const val EASING_DURATION_MILLIS = 3000
 
 private fun DrawScope.drawGraphAxis() {
diff --git a/compose/animation/animation/integration-tests/animation-demos/src/main/java/androidx/compose/animation/demos/visualaid/EasingItemDemo.kt b/compose/animation/animation/integration-tests/animation-demos/src/main/java/androidx/compose/animation/demos/visualaid/EasingItemDemo.kt
index 45ea8d9..eca58ee 100644
--- a/compose/animation/animation/integration-tests/animation-demos/src/main/java/androidx/compose/animation/demos/visualaid/EasingItemDemo.kt
+++ b/compose/animation/animation/integration-tests/animation-demos/src/main/java/androidx/compose/animation/demos/visualaid/EasingItemDemo.kt
@@ -27,129 +27,48 @@
     EaseIn("EaseIn", function = androidx.compose.animation.core.EaseIn),
     EaseInOut("EaseInOut", function = androidx.compose.animation.core.EaseInOut),
     EaseInSine("EaseInSine", function = androidx.compose.animation.core.EaseInSine),
-    EaseOutSine(
-        "EaseOutSine",
-        function = androidx.compose.animation.core.EaseOutSine
-    ),
-    EaseInOutSine(
-        "EaseInOutSine",
-        function = androidx.compose.animation.core.EaseInOutSine
-    ),
-    EaseInCubic(
-        "EaseInCubic",
-        function = androidx.compose.animation.core.EaseInCubic
-    ),
-    EaseOutCubic(
-        "EaseOutCubic",
-        function = androidx.compose.animation.core.EaseOutCubic
-    ),
-    EaseInOutCubic(
-        "EaseInOutCubic",
-        function = androidx.compose.animation.core.EaseInOutCubic
-    ),
-
-    EaseInQuint(
-        "EaseInQuint",
-        function = androidx.compose.animation.core.EaseInQuint
-    ),
-    EaseOutQuint(
-        "EaseOutQuint",
-        function = androidx.compose.animation.core.EaseOutQuint
-    ),
-    EaseInOutQuint(
-        "EaseInOutQuint",
-        function = androidx.compose.animation.core.EaseInOutQuint
-    ),
-
+    EaseOutSine("EaseOutSine", function = androidx.compose.animation.core.EaseOutSine),
+    EaseInOutSine("EaseInOutSine", function = androidx.compose.animation.core.EaseInOutSine),
+    EaseInCubic("EaseInCubic", function = androidx.compose.animation.core.EaseInCubic),
+    EaseOutCubic("EaseOutCubic", function = androidx.compose.animation.core.EaseOutCubic),
+    EaseInOutCubic("EaseInOutCubic", function = androidx.compose.animation.core.EaseInOutCubic),
+    EaseInQuint("EaseInQuint", function = androidx.compose.animation.core.EaseInQuint),
+    EaseOutQuint("EaseOutQuint", function = androidx.compose.animation.core.EaseOutQuint),
+    EaseInOutQuint("EaseInOutQuint", function = androidx.compose.animation.core.EaseInOutQuint),
     EaseInCirc("EaseInCirc", function = androidx.compose.animation.core.EaseInCirc),
-    EaseOutCirc(
-        "EaseOutCirc",
-        function = androidx.compose.animation.core.EaseOutCirc
-    ),
-    EaseInOutCirc(
-        "EaseInOutCirc",
-        function = androidx.compose.animation.core.EaseInOutCirc
-    ),
-
+    EaseOutCirc("EaseOutCirc", function = androidx.compose.animation.core.EaseOutCirc),
+    EaseInOutCirc("EaseInOutCirc", function = androidx.compose.animation.core.EaseInOutCirc),
     EaseInQuad("EaseInQuad", function = androidx.compose.animation.core.EaseInQuad),
-    EaseOutQuad(
-        "EaseOutQuad",
-        function = androidx.compose.animation.core.EaseOutQuad
-    ),
-    EaseInOutQuad(
-        "EaseInOutQuad",
-        function = androidx.compose.animation.core.EaseInOutQuad
-    ),
-
-    EaseInQuart(
-        "EaseInQuart",
-        function = androidx.compose.animation.core.EaseInQuart
-    ),
-    EaseOutQuart(
-        "EaseOutQuart",
-        function = androidx.compose.animation.core.EaseOutQuart
-    ),
-    EaseInOutQuart(
-        "EaseInOutQuart",
-        function = androidx.compose.animation.core.EaseInOutQuart
-    ),
-
+    EaseOutQuad("EaseOutQuad", function = androidx.compose.animation.core.EaseOutQuad),
+    EaseInOutQuad("EaseInOutQuad", function = androidx.compose.animation.core.EaseInOutQuad),
+    EaseInQuart("EaseInQuart", function = androidx.compose.animation.core.EaseInQuart),
+    EaseOutQuart("EaseOutQuart", function = androidx.compose.animation.core.EaseOutQuart),
+    EaseInOutQuart("EaseInOutQuart", function = androidx.compose.animation.core.EaseInOutQuart),
     EaseInExpo("EaseInExpo", function = androidx.compose.animation.core.EaseInExpo),
-    EaseOutExpo(
-        "EaseOutExpo",
-        function = androidx.compose.animation.core.EaseOutExpo
-    ),
-    EaseInOutExpo(
-        "EaseInOutExpo",
-        function = androidx.compose.animation.core.EaseInOutExpo
-    ),
-
+    EaseOutExpo("EaseOutExpo", function = androidx.compose.animation.core.EaseOutExpo),
+    EaseInOutExpo("EaseInOutExpo", function = androidx.compose.animation.core.EaseInOutExpo),
     EaseInBack("EaseInBack", function = androidx.compose.animation.core.EaseInBack),
-    EaseOutBack(
-        "EaseOutBack",
-        function = androidx.compose.animation.core.EaseOutBack
-    ),
-    EaseInOutBack(
-        "EaseInOutBack",
-        function = androidx.compose.animation.core.EaseInOutBack
-    ),
-
-    EaseInElastic(
-        "EaseInElastic",
-        function = androidx.compose.animation.core.EaseInElastic
-    ),
-    EaseOutElastic(
-        "EaseOutElastic",
-        function = androidx.compose.animation.core.EaseOutElastic
-    ),
+    EaseOutBack("EaseOutBack", function = androidx.compose.animation.core.EaseOutBack),
+    EaseInOutBack("EaseInOutBack", function = androidx.compose.animation.core.EaseInOutBack),
+    EaseInElastic("EaseInElastic", function = androidx.compose.animation.core.EaseInElastic),
+    EaseOutElastic("EaseOutElastic", function = androidx.compose.animation.core.EaseOutElastic),
     EaseInOutElastic(
         "EaseInOutElastic",
         function = androidx.compose.animation.core.EaseInOutElastic
     ),
-
-    EaseOutBounce(
-        "EaseOutBounce",
-        function = androidx.compose.animation.core.EaseOutBounce
-    ),
-    EaseInBounce(
-        "EaseInBounce",
-        function = androidx.compose.animation.core.EaseInBounce
-    ),
-    EaseInOutBounce(
-        "EaseInOutBounce",
-        function = androidx.compose.animation.core.EaseInOutBounce
-    ),
-
+    EaseOutBounce("EaseOutBounce", function = androidx.compose.animation.core.EaseOutBounce),
+    EaseInBounce("EaseInBounce", function = androidx.compose.animation.core.EaseInBounce),
+    EaseInOutBounce("EaseInOutBounce", function = androidx.compose.animation.core.EaseInOutBounce),
     Linear("Linear", function = androidx.compose.animation.core.LinearEasing),
-
     EmphasizedEasing("EmphasizedEasing", function = EmphasizedEasingCurve),
 }
 
-/**
- * Emphasized Easing Curve (Material Spec)
- */
-private val EmphasizedEasingCurve: Easing = PathEasing(Path().apply {
-    moveTo(0f, 0f)
-    cubicTo(0.05f, 0f, 0.133333f, 0.06f, 0.166666f, 0.4f)
-    cubicTo(0.208333f, 0.82f, 0.25f, 1f, 1f, 1f)
-})
+/** Emphasized Easing Curve (Material Spec) */
+private val EmphasizedEasingCurve: Easing =
+    PathEasing(
+        Path().apply {
+            moveTo(0f, 0f)
+            cubicTo(0.05f, 0f, 0.133333f, 0.06f, 0.166666f, 0.4f)
+            cubicTo(0.208333f, 0.82f, 0.25f, 1f, 1f, 1f)
+        }
+    )
diff --git a/compose/animation/animation/integration-tests/animation-demos/src/main/java/androidx/compose/animation/demos/visualaid/EasingTransformationDemo.kt b/compose/animation/animation/integration-tests/animation-demos/src/main/java/androidx/compose/animation/demos/visualaid/EasingTransformationDemo.kt
index 49a0cb8..da516e1 100644
--- a/compose/animation/animation/integration-tests/animation-demos/src/main/java/androidx/compose/animation/demos/visualaid/EasingTransformationDemo.kt
+++ b/compose/animation/animation/integration-tests/animation-demos/src/main/java/androidx/compose/animation/demos/visualaid/EasingTransformationDemo.kt
@@ -52,19 +52,23 @@
 internal fun TranslationBoxDemo(animatedFloat: Float) {
     Box(modifier = Modifier.height(100.dp).width(50.dp)) {
         OutlinedSquare(modifier = Modifier.fillMaxSize())
-        Canvas(modifier = Modifier.fillMaxSize(), onDraw = {
-            val sizePx = 16.dp.toPx()
-            val strokeThickness = 1.dp.toPx()
-            val size = Size(sizePx, sizePx)
-            drawRect(
-                androidGreen,
-                topLeft = Offset(
-                    this.size.width / 2f - sizePx / 2f,
-                    animatedFloat * (this.size.height - sizePx - strokeThickness)
-                ),
-                size = size
-            )
-        })
+        Canvas(
+            modifier = Modifier.fillMaxSize(),
+            onDraw = {
+                val sizePx = 16.dp.toPx()
+                val strokeThickness = 1.dp.toPx()
+                val size = Size(sizePx, sizePx)
+                drawRect(
+                    androidGreen,
+                    topLeft =
+                        Offset(
+                            this.size.width / 2f - sizePx / 2f,
+                            animatedFloat * (this.size.height - sizePx - strokeThickness)
+                        ),
+                    size = size
+                )
+            }
+        )
     }
 }
 
@@ -74,32 +78,31 @@
 }
 
 @Composable
-internal fun Rect(
-    modifier: Modifier = Modifier,
-    color: Color = androidGreen
-) {
+internal fun Rect(modifier: Modifier = Modifier, color: Color = androidGreen) {
     Box {
         OutlinedSquare(boxSize)
-        Canvas(modifier = modifier.then(boxSize), onDraw = {
-            val sizePx = 16.dp.toPx()
-            val size = Size(sizePx, sizePx)
-            drawRect(
-                color,
-                topLeft = Offset(
-                    this.size.width / 2f - sizePx / 2f,
-                    this.size.height / 2f - sizePx / 2f
-                ),
-                size = size
-            )
-        })
+        Canvas(
+            modifier = modifier.then(boxSize),
+            onDraw = {
+                val sizePx = 16.dp.toPx()
+                val size = Size(sizePx, sizePx)
+                drawRect(
+                    color,
+                    topLeft =
+                        Offset(
+                            this.size.width / 2f - sizePx / 2f,
+                            this.size.height / 2f - sizePx / 2f
+                        ),
+                    size = size
+                )
+            }
+        )
     }
 }
 
 @Composable
 internal fun OutlinedSquare(modifier: Modifier = Modifier) {
-    Canvas(modifier = modifier) {
-        drawRect(AndroidNavy, style = Stroke(1.dp.toPx()))
-    }
+    Canvas(modifier = modifier) { drawRect(AndroidNavy, style = Stroke(1.dp.toPx())) }
 }
 
 private val boxSize = Modifier.size(50.dp)
diff --git a/compose/animation/animation/integration-tests/animation-demos/src/main/java/androidx/compose/animation/demos/visualaid/RowConfigurationDemo.kt b/compose/animation/animation/integration-tests/animation-demos/src/main/java/androidx/compose/animation/demos/visualaid/RowConfigurationDemo.kt
index c73e7e1..c0a1abd 100644
--- a/compose/animation/animation/integration-tests/animation-demos/src/main/java/androidx/compose/animation/demos/visualaid/RowConfigurationDemo.kt
+++ b/compose/animation/animation/integration-tests/animation-demos/src/main/java/androidx/compose/animation/demos/visualaid/RowConfigurationDemo.kt
@@ -50,25 +50,26 @@
 @Preview
 @Composable
 fun RowConfigurationDemo() {
-    val width by produceState(250.dp) {
-        // Skip the animations in tests.
-        while (coroutineContext[InfiniteAnimationPolicy] == null) {
-            animate(
-                Dp.VectorConverter, 250.dp, 520.dp,
-                animationSpec = spring(Spring.DampingRatioMediumBouncy, Spring.StiffnessLow)
-            ) { value, _ ->
-                this.value = value
+    val width by
+        produceState(250.dp) {
+            // Skip the animations in tests.
+            while (coroutineContext[InfiniteAnimationPolicy] == null) {
+                animate(
+                    Dp.VectorConverter,
+                    250.dp,
+                    520.dp,
+                    animationSpec = spring(Spring.DampingRatioMediumBouncy, Spring.StiffnessLow)
+                ) { value, _ ->
+                    this.value = value
+                }
+                delay(1000)
+                animate(Dp.VectorConverter, 520.dp, 250.dp, animationSpec = tween(520)) { value, _
+                    ->
+                    this.value = value
+                }
+                delay(1000)
             }
-            delay(1000)
-            animate(
-                Dp.VectorConverter, 520.dp, 250.dp,
-                animationSpec = tween(520)
-            ) { value, _ ->
-                this.value = value
-            }
-            delay(1000)
         }
-    }
     ResizableLayout(width)
 }
 
@@ -127,15 +128,19 @@
     }
 }
 
-private fun Modifier.default(background: Color) = this.padding(2.dp)
-    .background(background, RoundedCornerShape(5.dp)).padding(start = 3.dp, end = 3.dp)
-    .fillMaxWidth()
+private fun Modifier.default(background: Color) =
+    this.padding(2.dp)
+        .background(background, RoundedCornerShape(5.dp))
+        .padding(start = 3.dp, end = 3.dp)
+        .fillMaxWidth()
 
 @Composable
 fun RowScope.RowItem(text: String, fixedSize: Boolean = true) {
     val modifier = if (fixedSize) Modifier.width(80.dp) else Modifier.weight(1f)
     Box(
-        modifier.padding(5.dp).shadow(10.dp)
+        modifier
+            .padding(5.dp)
+            .shadow(10.dp)
             .background(Color.White, shape = RoundedCornerShape(5.dp))
             .padding(top = 5.dp, bottom = 5.dp)
     ) {
diff --git a/compose/animation/animation/integration-tests/animation-demos/src/main/java/androidx/compose/animation/demos/visualinspection/AnimatedContentWithInterruptions.kt b/compose/animation/animation/integration-tests/animation-demos/src/main/java/androidx/compose/animation/demos/visualinspection/AnimatedContentWithInterruptions.kt
index b266714..233e72c 100644
--- a/compose/animation/animation/integration-tests/animation-demos/src/main/java/androidx/compose/animation/demos/visualinspection/AnimatedContentWithInterruptions.kt
+++ b/compose/animation/animation/integration-tests/animation-demos/src/main/java/androidx/compose/animation/demos/visualinspection/AnimatedContentWithInterruptions.kt
@@ -48,28 +48,24 @@
 @Composable
 fun AnimatedContentWithInterruptions() {
     var count by remember { mutableIntStateOf(0) }
-    AnimatedContent(targetState = count, transitionSpec = {
-        if (targetState == 0) {
-            (slideInVertically { it } togetherWith fadeOut(targetAlpha = 0.88f))
-                .apply { targetContentZIndex = 1f }
-        } else {
-            (fadeIn(initialAlpha = 0.88f) togetherWith slideOutVertically { it } +
-                fadeOut(targetAlpha = 0.88f))
-                .apply { targetContentZIndex = -1f }
+    AnimatedContent(
+        targetState = count,
+        transitionSpec = {
+            if (targetState == 0) {
+                (slideInVertically { it } togetherWith fadeOut(targetAlpha = 0.88f)).apply {
+                    targetContentZIndex = 1f
+                }
+            } else {
+                (fadeIn(initialAlpha = 0.88f) togetherWith
+                        slideOutVertically { it } + fadeOut(targetAlpha = 0.88f))
+                    .apply { targetContentZIndex = -1f }
+            }
         }
-    }) { state ->
+    ) { state ->
         if (state == 0) {
-            Box(
-                modifier = Modifier
-                    .fillMaxSize()
-                    .background(Color.Green)
-            )
+            Box(modifier = Modifier.fillMaxSize().background(Color.Green))
         } else if (state == 1) {
-            Box(
-                modifier = Modifier
-                    .fillMaxSize()
-                    .background(Color.Red)
-            )
+            Box(modifier = Modifier.fillMaxSize().background(Color.Red))
         }
     }
     LaunchedEffect(Unit) {
@@ -80,14 +76,8 @@
     }
 
     Row {
-        Text("Red",
-            Modifier
-                .clickable { if (count < 1) count++ }
-                .padding(50.dp))
+        Text("Red", Modifier.clickable { if (count < 1) count++ }.padding(50.dp))
         Spacer(Modifier.width(60.dp))
-        Text("Green",
-            Modifier
-                .clickable { if (count > 0) count-- }
-                .padding(50.dp))
+        Text("Green", Modifier.clickable { if (count > 0) count-- }.padding(50.dp))
     }
 }
diff --git a/compose/animation/animation/integration-tests/animation-demos/src/main/java/androidx/compose/animation/demos/visualinspection/AnimatedVisibilityContentSizeChange.kt b/compose/animation/animation/integration-tests/animation-demos/src/main/java/androidx/compose/animation/demos/visualinspection/AnimatedVisibilityContentSizeChange.kt
index 52a57e6..b465365 100644
--- a/compose/animation/animation/integration-tests/animation-demos/src/main/java/androidx/compose/animation/demos/visualinspection/AnimatedVisibilityContentSizeChange.kt
+++ b/compose/animation/animation/integration-tests/animation-demos/src/main/java/androidx/compose/animation/demos/visualinspection/AnimatedVisibilityContentSizeChange.kt
@@ -74,12 +74,11 @@
 
         AnimatedVisibility(visible = isOpen.value) {
             Column(
-                Modifier.background(pastelColors[2]).fillMaxWidth()
+                Modifier.background(pastelColors[2])
+                    .fillMaxWidth()
                     .then(if (checked) Modifier.animateContentSize() else Modifier)
             ) {
-                itemList.map {
-                    Text("Item #$it", Modifier.align(Alignment.CenterHorizontally))
-                }
+                itemList.map { Text("Item #$it", Modifier.align(Alignment.CenterHorizontally)) }
             }
         }
     }
diff --git a/compose/animation/animation/integration-tests/animation-demos/src/main/java/androidx/compose/animation/demos/visualinspection/EnterExitCombination.kt b/compose/animation/animation/integration-tests/animation-demos/src/main/java/androidx/compose/animation/demos/visualinspection/EnterExitCombination.kt
index 9267c8f..a5526b7 100644
--- a/compose/animation/animation/integration-tests/animation-demos/src/main/java/androidx/compose/animation/demos/visualinspection/EnterExitCombination.kt
+++ b/compose/animation/animation/integration-tests/animation-demos/src/main/java/androidx/compose/animation/demos/visualinspection/EnterExitCombination.kt
@@ -205,65 +205,70 @@
     visible: Boolean
 ) {
     Box(modifier.fillMaxHeight()) {
-
         val animationAlignment = if (oppositeDirection) opposite(alignment) else alignment
-        val expand = when (animationAlignment) {
-            TopCenter -> expandVertically(expandFrom = Top)
-            BottomCenter -> expandVertically(expandFrom = Bottom)
-            CenterStart -> expandHorizontally(expandFrom = Start)
-            CenterEnd -> expandHorizontally(expandFrom = End)
-            else -> expandIn(expandFrom = animationAlignment)
-        }
+        val expand =
+            when (animationAlignment) {
+                TopCenter -> expandVertically(expandFrom = Top)
+                BottomCenter -> expandVertically(expandFrom = Bottom)
+                CenterStart -> expandHorizontally(expandFrom = Start)
+                CenterEnd -> expandHorizontally(expandFrom = End)
+                else -> expandIn(expandFrom = animationAlignment)
+            }
 
-        val shrink = when (animationAlignment) {
-            TopCenter -> shrinkVertically(shrinkTowards = Top)
-            BottomCenter -> shrinkVertically(shrinkTowards = Bottom)
-            CenterStart -> shrinkHorizontally(shrinkTowards = Start)
-            CenterEnd -> shrinkHorizontally(shrinkTowards = End)
-            else -> shrinkOut(shrinkTowards = animationAlignment)
-        }
+        val shrink =
+            when (animationAlignment) {
+                TopCenter -> shrinkVertically(shrinkTowards = Top)
+                BottomCenter -> shrinkVertically(shrinkTowards = Bottom)
+                CenterStart -> shrinkHorizontally(shrinkTowards = Start)
+                CenterEnd -> shrinkHorizontally(shrinkTowards = End)
+                else -> shrinkOut(shrinkTowards = animationAlignment)
+            }
 
-        val slideIn = when (alignment) {
-            TopCenter -> slideInVertically { -it }
-            BottomCenter -> slideInVertically { it }
-            CenterStart -> slideInHorizontally { -it }
-            CenterEnd -> slideInHorizontally { it }
-            TopStart -> slideIn { IntOffset(-it.width, -it.height) }
-            BottomStart -> slideIn { IntOffset(-it.width, it.height) }
-            TopEnd -> slideIn { IntOffset(it.width, -it.height) }
-            BottomEnd -> slideIn { IntOffset(it.width, it.height) }
-            else -> slideIn { alignment.align(it, IntSize.Zero, LayoutDirection.Ltr) }
-        }
-        val slideOut = when (alignment) {
-            TopCenter -> slideOutVertically { -it }
-            BottomCenter -> slideOutVertically { it }
-            CenterStart -> slideOutHorizontally { -it }
-            CenterEnd -> slideOutHorizontally { it }
-            TopStart -> slideOut { IntOffset(-it.width, -it.height) }
-            BottomStart -> slideOut { IntOffset(-it.width, it.height) }
-            TopEnd -> slideOut { IntOffset(it.width, -it.height) }
-            BottomEnd -> slideOut { IntOffset(it.width, it.height) }
-            else -> slideOut { alignment.align(IntSize.Zero, it, LayoutDirection.Ltr) }
-        }
+        val slideIn =
+            when (alignment) {
+                TopCenter -> slideInVertically { -it }
+                BottomCenter -> slideInVertically { it }
+                CenterStart -> slideInHorizontally { -it }
+                CenterEnd -> slideInHorizontally { it }
+                TopStart -> slideIn { IntOffset(-it.width, -it.height) }
+                BottomStart -> slideIn { IntOffset(-it.width, it.height) }
+                TopEnd -> slideIn { IntOffset(it.width, -it.height) }
+                BottomEnd -> slideIn { IntOffset(it.width, it.height) }
+                else -> slideIn { alignment.align(it, IntSize.Zero, LayoutDirection.Ltr) }
+            }
+        val slideOut =
+            when (alignment) {
+                TopCenter -> slideOutVertically { -it }
+                BottomCenter -> slideOutVertically { it }
+                CenterStart -> slideOutHorizontally { -it }
+                CenterEnd -> slideOutHorizontally { it }
+                TopStart -> slideOut { IntOffset(-it.width, -it.height) }
+                BottomStart -> slideOut { IntOffset(-it.width, it.height) }
+                TopEnd -> slideOut { IntOffset(it.width, -it.height) }
+                BottomEnd -> slideOut { IntOffset(it.width, it.height) }
+                else -> slideOut { alignment.align(IntSize.Zero, it, LayoutDirection.Ltr) }
+            }
 
         var enter: EnterTransition? = null
         selectedOptions.forEachIndexed { index: Int, selected: Boolean ->
             if (selected) {
-                enter = when (index) {
-                    0 -> enter?.plus(fadeIn()) ?: fadeIn()
-                    1 -> enter?.plus(expand) ?: expand
-                    else -> enter?.plus(slideIn) ?: slideIn
-                }
+                enter =
+                    when (index) {
+                        0 -> enter?.plus(fadeIn()) ?: fadeIn()
+                        1 -> enter?.plus(expand) ?: expand
+                        else -> enter?.plus(slideIn) ?: slideIn
+                    }
             }
         }
         var exit: ExitTransition? = null
         selectedOptions.forEachIndexed { index: Int, selected: Boolean ->
             if (selected) {
-                exit = when (index) {
-                    0 -> exit?.plus(fadeOut()) ?: fadeOut()
-                    1 -> exit?.plus(shrink) ?: shrink
-                    else -> exit?.plus(slideOut) ?: slideOut
-                }
+                exit =
+                    when (index) {
+                        0 -> exit?.plus(fadeOut()) ?: fadeOut()
+                        1 -> exit?.plus(shrink) ?: shrink
+                        else -> exit?.plus(slideOut) ?: slideOut
+                    }
             }
         }
 
@@ -281,9 +286,7 @@
                 }
             }
             LazyColumn(Modifier.fillMaxSize().background(Color(0xFFd8c7ff))) {
-                items(menuText) {
-                    Text(it, Modifier.padding(5.dp))
-                }
+                items(menuText) { Text(it, Modifier.padding(5.dp)) }
             }
         }
     }
@@ -292,28 +295,17 @@
 @Composable
 fun TransitionOptions(selectedOptions: List<Boolean>, onOptionSelected: (Int) -> Unit) {
     Column {
-        val radioOptions =
-            listOf("Fade", "Expand/Shrink", "Slide")
+        val radioOptions = listOf("Fade", "Expand/Shrink", "Slide")
         radioOptions.forEachIndexed { i, text ->
             Row(
-                Modifier
-                    .fillMaxWidth()
+                Modifier.fillMaxWidth()
                     .height(30.dp)
-                    .selectable(
-                        selected = selectedOptions[i],
-                        onClick = { onOptionSelected(i) }
-                    )
+                    .selectable(selected = selectedOptions[i], onClick = { onOptionSelected(i) })
                     .padding(horizontal = 16.dp),
                 verticalAlignment = Alignment.CenterVertically
             ) {
-                Checkbox(
-                    checked = selectedOptions[i],
-                    onCheckedChange = { onOptionSelected(i) }
-                )
-                Text(
-                    text = text,
-                    modifier = Modifier.padding(start = 16.dp)
-                )
+                Checkbox(checked = selectedOptions[i], onCheckedChange = { onOptionSelected(i) })
+                Text(text = text, modifier = Modifier.padding(start = 16.dp))
             }
         }
     }
diff --git a/compose/animation/animation/integration-tests/animation-demos/src/main/java/androidx/compose/animation/demos/visualinspection/SeekingDebugging.kt b/compose/animation/animation/integration-tests/animation-demos/src/main/java/androidx/compose/animation/demos/visualinspection/SeekingDebugging.kt
index 21756cd..690f56f 100644
--- a/compose/animation/animation/integration-tests/animation-demos/src/main/java/androidx/compose/animation/demos/visualinspection/SeekingDebugging.kt
+++ b/compose/animation/animation/integration-tests/animation-demos/src/main/java/androidx/compose/animation/demos/visualinspection/SeekingDebugging.kt
@@ -75,10 +75,7 @@
         Modifier.fillMaxSize().padding(10.dp),
         verticalArrangement = Arrangement.spacedBy(20.dp)
     ) {
-        Row(
-            Modifier.fillMaxWidth(),
-            horizontalArrangement = Arrangement.SpaceEvenly
-        ) {
+        Row(Modifier.fillMaxWidth(), horizontalArrangement = Arrangement.SpaceEvenly) {
             Row(Modifier.clickable { entering = true }.padding(10.dp)) {
                 RadioButton(entering, { entering = true })
                 Text("Entering")
@@ -94,20 +91,23 @@
     }
 
     LaunchedEffect(Unit) {
-        snapshotFlow {
-            progress * if (entering) 1f else -1f
-        }.collect {
-            val totalDuration = transition.totalDurationNanos
-            if (entering) {
-                transition.setPlaytimeAfterInitialAndTargetStateEstablished(
-                    false, true, (abs(it) * totalDuration).toLong()
-                )
-            } else {
-                transition.setPlaytimeAfterInitialAndTargetStateEstablished(
-                    true, false, (abs(it) * totalDuration).toLong()
-                )
+        snapshotFlow { progress * if (entering) 1f else -1f }
+            .collect {
+                val totalDuration = transition.totalDurationNanos
+                if (entering) {
+                    transition.setPlaytimeAfterInitialAndTargetStateEstablished(
+                        false,
+                        true,
+                        (abs(it) * totalDuration).toLong()
+                    )
+                } else {
+                    transition.setPlaytimeAfterInitialAndTargetStateEstablished(
+                        true,
+                        false,
+                        (abs(it) * totalDuration).toLong()
+                    )
+                }
             }
-        }
     }
 }
 
@@ -125,34 +125,40 @@
                 colors.forEachIndexed { index, color ->
                     // Creates a custom enter/exit animation on scale using
                     // `AnimatedVisibilityScope.transition`
-                    val scale by transition.animateFloat { enterExitState ->
-                        when (enterExitState) {
-                            EnterExitState.PreEnter -> 0.9f
-                            EnterExitState.Visible -> 1.0f
-                            EnterExitState.PostExit -> 0.5f
+                    val scale by
+                        transition.animateFloat { enterExitState ->
+                            when (enterExitState) {
+                                EnterExitState.PreEnter -> 0.9f
+                                EnterExitState.Visible -> 1.0f
+                                EnterExitState.PostExit -> 0.5f
+                            }
                         }
-                    }
                     val staggeredSpring = remember {
-                        spring<IntOffset>(
-                            stiffness = Spring.StiffnessLow * (1f - index * 0.2f)
-                        )
+                        spring<IntOffset>(stiffness = Spring.StiffnessLow * (1f - index * 0.2f))
                     }
                     Box(
-                        Modifier.weight(1f).animateEnterExit(
-                            // Staggered slide-in from bottom, while the parent
-                            // AnimatedVisibility fades in everything (including this child)
-                            enter = slideInVertically(
-                                initialOffsetY = { it },
-                                animationSpec = staggeredSpring
-                            ),
-                            // No built-in exit transition will be applied. It'll be
-                            // faded out by parent AnimatedVisibility while scaling down
-                            // by the scale animation.
-                            exit = ExitTransition.None
-                        ).fillMaxWidth().padding(5.dp).graphicsLayer {
-                            scaleX = scale
-                            scaleY = scale
-                        }.clip(RoundedCornerShape(20.dp)).background(color)
+                        Modifier.weight(1f)
+                            .animateEnterExit(
+                                // Staggered slide-in from bottom, while the parent
+                                // AnimatedVisibility fades in everything (including this child)
+                                enter =
+                                    slideInVertically(
+                                        initialOffsetY = { it },
+                                        animationSpec = staggeredSpring
+                                    ),
+                                // No built-in exit transition will be applied. It'll be
+                                // faded out by parent AnimatedVisibility while scaling down
+                                // by the scale animation.
+                                exit = ExitTransition.None
+                            )
+                            .fillMaxWidth()
+                            .padding(5.dp)
+                            .graphicsLayer {
+                                scaleX = scale
+                                scaleY = scale
+                            }
+                            .clip(RoundedCornerShape(20.dp))
+                            .background(color)
                     ) {}
                 }
             }
@@ -168,9 +174,5 @@
     }
 }
 
-private val colors = listOf(
-    Color(0xffff6f69),
-    Color(0xffffcc5c),
-    Color(0xff2a9d84),
-    Color(0xff264653)
-)
+private val colors =
+    listOf(Color(0xffff6f69), Color(0xffffcc5c), Color(0xff2a9d84), Color(0xff264653))
diff --git a/compose/animation/animation/integration-tests/animation-demos/src/main/java/androidx/compose/animation/demos/visualinspection/SlideInContentVariedSizes.kt b/compose/animation/animation/integration-tests/animation-demos/src/main/java/androidx/compose/animation/demos/visualinspection/SlideInContentVariedSizes.kt
index 81858c2..47ae026 100644
--- a/compose/animation/animation/integration-tests/animation-demos/src/main/java/androidx/compose/animation/demos/visualinspection/SlideInContentVariedSizes.kt
+++ b/compose/animation/animation/integration-tests/animation-demos/src/main/java/androidx/compose/animation/demos/visualinspection/SlideInContentVariedSizes.kt
@@ -79,37 +79,36 @@
         Box(Modifier.fillMaxSize()) {
             AnimatedContent(
                 contentState,
-                modifier = Modifier.padding(top = 120.dp, start = 100.dp)
-                    .border(3.dp, Color(0xff79e9de)),
+                modifier =
+                    Modifier.padding(top = 120.dp, start = 100.dp).border(3.dp, Color(0xff79e9de)),
                 contentAlignment = contentAlignment,
                 transitionSpec = {
                     if (targetState < initialState) {
-                        if (horizontal) {
-                            slideIntoContainer(towards = Right) togetherWith slideOutOfContainer(
-                                towards = Right
-                            )
+                            if (horizontal) {
+                                slideIntoContainer(towards = Right) togetherWith
+                                    slideOutOfContainer(towards = Right)
+                            } else {
+                                slideIntoContainer(towards = Down) togetherWith
+                                    slideOutOfContainer(towards = Down)
+                            }
                         } else {
-                            slideIntoContainer(towards = Down) togetherWith slideOutOfContainer(
-                                towards = Down
-                            )
+                            if (horizontal) {
+                                slideIntoContainer(towards = Left)
+                                    .togetherWith(slideOutOfContainer(towards = Left))
+                            } else {
+                                slideIntoContainer(towards = Up)
+                                    .togetherWith(slideOutOfContainer(towards = Up))
+                            }
                         }
-                    } else {
-                        if (horizontal) {
-                            slideIntoContainer(towards = Left).togetherWith(
-                                slideOutOfContainer(towards = Left)
-                            )
-                        } else {
-                            slideIntoContainer(towards = Up).togetherWith(
-                                slideOutOfContainer(towards = Up)
-                            )
+                        .using(SizeTransform(clip = clip))
+                        .apply {
+                            targetContentZIndex =
+                                when (targetState) {
+                                    PaneState.Pane1 -> 1f
+                                    PaneState.Pane2 -> 2f
+                                    PaneState.Pane3 -> 3f
+                                }
                         }
-                    }.using(SizeTransform(clip = clip)).apply {
-                        targetContentZIndex = when (targetState) {
-                            PaneState.Pane1 -> 1f
-                            PaneState.Pane2 -> 2f
-                            PaneState.Pane3 -> 3f
-                        }
-                    }
                 }
             ) {
                 when (it) {
@@ -118,21 +117,22 @@
                     PaneState.Pane3 -> Pane3()
                 }
             }
-            Row(
-                Modifier.matchParentSize(),
-                horizontalArrangement = Arrangement.SpaceBetween
-            ) {
+            Row(Modifier.matchParentSize(), horizontalArrangement = Arrangement.SpaceBetween) {
                 Icon(
-                    Icons.AutoMirrored.Default.ArrowBack, contentDescription = null,
+                    Icons.AutoMirrored.Default.ArrowBack,
+                    contentDescription = null,
                     Modifier.clickable {
-                        contentState = PaneState.values()[max(0, contentState.ordinal - 1)]
-                    }.padding(top = 300.dp, bottom = 300.dp, end = 60.dp)
+                            contentState = PaneState.values()[max(0, contentState.ordinal - 1)]
+                        }
+                        .padding(top = 300.dp, bottom = 300.dp, end = 60.dp)
                 )
                 Icon(
-                    Icons.AutoMirrored.Default.ArrowForward, contentDescription = null,
+                    Icons.AutoMirrored.Default.ArrowForward,
+                    contentDescription = null,
                     Modifier.clickable {
-                        contentState = PaneState.values()[min(2, contentState.ordinal + 1)]
-                    }.padding(top = 300.dp, bottom = 300.dp, start = 60.dp)
+                            contentState = PaneState.values()[min(2, contentState.ordinal + 1)]
+                        }
+                        .padding(top = 300.dp, bottom = 300.dp, start = 60.dp)
                 )
             }
         }
@@ -143,28 +143,19 @@
 fun AlignmentMenu(contentAlignment: Alignment, onAlignmentChanged: (alignment: Alignment) -> Unit) {
     var expanded by remember { mutableStateOf(false) }
     Box {
-        Button(onClick = { expanded = true }) {
-            Text("Current alignment: $contentAlignment")
-        }
-        DropdownMenu(
-            expanded = expanded,
-            onDismissRequest = { expanded = false }
-        ) {
+        Button(onClick = { expanded = true }) { Text("Current alignment: $contentAlignment") }
+        DropdownMenu(expanded = expanded, onDismissRequest = { expanded = false }) {
             DropdownMenuItem(onClick = { onAlignmentChanged(Alignment.TopStart) }) {
                 Text("TopStart")
             }
-            DropdownMenuItem(onClick = { onAlignmentChanged(Alignment.TopEnd) }) {
-                Text("TopEnd")
-            }
+            DropdownMenuItem(onClick = { onAlignmentChanged(Alignment.TopEnd) }) { Text("TopEnd") }
             DropdownMenuItem(onClick = { onAlignmentChanged(Alignment.BottomStart) }) {
                 Text("BottomStart")
             }
             DropdownMenuItem(onClick = { onAlignmentChanged(Alignment.BottomEnd) }) {
                 Text("BottomEnd")
             }
-            DropdownMenuItem(onClick = { onAlignmentChanged(Alignment.Center) }) {
-                Text("Center")
-            }
+            DropdownMenuItem(onClick = { onAlignmentChanged(Alignment.Center) }) { Text("Center") }
             DropdownMenuItem(onClick = { onAlignmentChanged(Alignment.TopCenter) }) {
                 Text("TopCenter")
             }
@@ -208,5 +199,7 @@
 }
 
 private enum class PaneState {
-    Pane1, Pane2, Pane3
+    Pane1,
+    Pane2,
+    Pane3
 }
diff --git a/compose/animation/animation/samples/src/main/java/androidx/compose/animation/samples/AnimatedContentSamples.kt b/compose/animation/animation/samples/src/main/java/androidx/compose/animation/samples/AnimatedContentSamples.kt
index b9eeaff..97bf328 100644
--- a/compose/animation/animation/samples/src/main/java/androidx/compose/animation/samples/AnimatedContentSamples.kt
+++ b/compose/animation/animation/samples/src/main/java/androidx/compose/animation/samples/AnimatedContentSamples.kt
@@ -74,18 +74,20 @@
                 // different numbers have a spatial relationship - larger numbers are
                 // positioned (vertically) below smaller numbers.
                 if (targetState > initialState) {
-                    // If the incoming number is larger, new number slides up and fades in while
-                    // the previous (smaller) number slides up to make room and fades out.
-                    slideInVertically { it } + fadeIn() togetherWith
-                        slideOutVertically { -it } + fadeOut()
-                } else {
-                    // If the incoming number is smaller, new number slides down and fades in while
-                    // the previous number slides down and fades out.
-                    slideInVertically { -it } + fadeIn() togetherWith
-                        slideOutVertically { it } + fadeOut()
-                    // Disable clipping since the faded slide-out is desired out of bounds, but
-                    // the size transform is still needed from number getting longer
-                }.using(SizeTransform(clip = false)) // Using default spring for the size change.
+                        // If the incoming number is larger, new number slides up and fades in while
+                        // the previous (smaller) number slides up to make room and fades out.
+                        slideInVertically { it } + fadeIn() togetherWith
+                            slideOutVertically { -it } + fadeOut()
+                    } else {
+                        // If the incoming number is smaller, new number slides down and fades in
+                        // while
+                        // the previous number slides down and fades out.
+                        slideInVertically { -it } + fadeIn() togetherWith
+                            slideOutVertically { it } + fadeOut()
+                        // Disable clipping since the faded slide-out is desired out of bounds, but
+                        // the size transform is still needed from number getting longer
+                    }
+                    .using(SizeTransform(clip = false)) // Using default spring for the size change.
             }
         ) { targetCount ->
             // This establishes a mapping between the target state and the content in the form of a
@@ -113,29 +115,17 @@
     // enum class ContentState { Foo, Bar, Baz }
     @Composable
     fun Foo() {
-        Box(
-            Modifier
-                .size(200.dp)
-                .background(Color(0xffffdb00))
-        )
+        Box(Modifier.size(200.dp).background(Color(0xffffdb00)))
     }
 
     @Composable
     fun Bar() {
-        Box(
-            Modifier
-                .size(40.dp)
-                .background(Color(0xffff8100))
-        )
+        Box(Modifier.size(40.dp).background(Color(0xffff8100)))
     }
 
     @Composable
     fun Baz() {
-        Box(
-            Modifier
-                .size(80.dp, 20.dp)
-                .background(Color(0xffff4400))
-        )
+        Box(Modifier.size(80.dp, 20.dp).background(Color(0xffff4400)))
     }
 
     var contentState: ContentState by remember { mutableStateOf(ContentState.Foo) }
@@ -149,74 +139,79 @@
     }
 }
 
-private enum class ContentState { Foo, Bar, Baz }
+private enum class ContentState {
+    Foo,
+    Bar,
+    Baz
+}
 
 @Suppress("UNUSED_VARIABLE")
 @Sampled
 fun AnimatedContentTransitionSpecSample() {
     // enum class CartState { Expanded, Collapsed }
-    val transitionSpec: AnimatedContentTransitionScope<CartState>.() -> ContentTransform =
-        {
-            // Fade in with a delay so that it starts after fade out
-            fadeIn(animationSpec = tween(150, delayMillis = 150))
-                .togetherWith(fadeOut(animationSpec = tween(150)))
-                .using(
-                    SizeTransform { initialSize, targetSize ->
-                        // Using different SizeTransform for different state change
-                        if (CartState.Collapsed isTransitioningTo CartState.Expanded) {
-                            keyframes {
-                                durationMillis = 500
-                                // Animate to full target width and by 200px in height at 150ms
-                                IntSize(targetSize.width, initialSize.height + 200) at 150
-                            }
-                        } else {
-                            keyframes {
-                                durationMillis = 500
-                                // Animate 1/2 the height without changing the width at 150ms.
-                                // The width and rest of the height will be animated in the
-                                // timeframe between 150ms and duration (i.e. 500ms)
-                                IntSize(
-                                    initialSize.width,
-                                    (initialSize.height + targetSize.height) / 2
-                                ) at 150
-                            }
+    val transitionSpec: AnimatedContentTransitionScope<CartState>.() -> ContentTransform = {
+        // Fade in with a delay so that it starts after fade out
+        fadeIn(animationSpec = tween(150, delayMillis = 150))
+            .togetherWith(fadeOut(animationSpec = tween(150)))
+            .using(
+                SizeTransform { initialSize, targetSize ->
+                    // Using different SizeTransform for different state change
+                    if (CartState.Collapsed isTransitioningTo CartState.Expanded) {
+                        keyframes {
+                            durationMillis = 500
+                            // Animate to full target width and by 200px in height at 150ms
+                            IntSize(targetSize.width, initialSize.height + 200) at 150
+                        }
+                    } else {
+                        keyframes {
+                            durationMillis = 500
+                            // Animate 1/2 the height without changing the width at 150ms.
+                            // The width and rest of the height will be animated in the
+                            // timeframe between 150ms and duration (i.e. 500ms)
+                            IntSize(
+                                initialSize.width,
+                                (initialSize.height + targetSize.height) / 2
+                            ) at 150
                         }
                     }
-                )
-        }
+                }
+            )
+    }
 }
 
 @Sampled
 @Composable
 fun TransitionExtensionAnimatedContentSample() {
     @Composable
-    fun CollapsedCart() { /* Some content here */
+    fun CollapsedCart() {
+        /* Some content here */
     }
 
     @Composable
-    fun ExpandedCart() { /* Some content here */
+    fun ExpandedCart() {
+        /* Some content here */
     }
 
     // enum class CartState { Expanded, Collapsed }
     var cartState by remember { mutableStateOf(CartState.Collapsed) }
     // Creates a transition here to animate the corner shape and content.
     val cartOpenTransition = updateTransition(cartState, "CartOpenTransition")
-    val cornerSize by cartOpenTransition.animateDp(
-        label = "cartCornerSize",
-        transitionSpec = {
-            when {
-                CartState.Expanded isTransitioningTo CartState.Collapsed ->
-                    tween(durationMillis = 433, delayMillis = 67)
-
-                else ->
-                    tween(durationMillis = 150)
+    val cornerSize by
+        cartOpenTransition.animateDp(
+            label = "cartCornerSize",
+            transitionSpec = {
+                when {
+                    CartState.Expanded isTransitioningTo CartState.Collapsed ->
+                        tween(durationMillis = 433, delayMillis = 67)
+                    else -> tween(durationMillis = 150)
+                }
             }
+        ) {
+            if (it == CartState.Expanded) 0.dp else 24.dp
         }
-    ) { if (it == CartState.Expanded) 0.dp else 24.dp }
 
     Surface(
-        Modifier
-            .shadow(8.dp, CutCornerShape(topStart = cornerSize))
+        Modifier.shadow(8.dp, CutCornerShape(topStart = cornerSize))
             .clip(CutCornerShape(topStart = cornerSize)),
         color = Color(0xfffff0ea),
     ) {
@@ -250,16 +245,18 @@
                                 }
                             }
                         }
-                    ).apply {
-                        targetContentZIndex = when (targetState) {
-                            // This defines a relationship along z-axis during the momentary
-                            // overlap as both incoming and outgoing content is on screen. This
-                            // fixed zOrder will ensure that collapsed content will always be on
-                            // top of the expanded content - it will come in on top, and
-                            // disappear over the expanded content as well.
-                            CartState.Expanded -> 1f
-                            CartState.Collapsed -> 2f
-                        }
+                    )
+                    .apply {
+                        targetContentZIndex =
+                            when (targetState) {
+                                // This defines a relationship along z-axis during the momentary
+                                // overlap as both incoming and outgoing content is on screen. This
+                                // fixed zOrder will ensure that collapsed content will always be on
+                                // top of the expanded content - it will come in on top, and
+                                // disappear over the expanded content as well.
+                                CartState.Expanded -> 1f
+                                CartState.Collapsed -> 2f
+                            }
                     }
             }
         ) {
@@ -285,25 +282,27 @@
     // parent menu. See the demos directory of the source code for a full demo.
     val transitionSpec: AnimatedContentTransitionScope<NestedMenuState>.() -> ContentTransform = {
         if (initialState < targetState) {
-            // Going from parent menu to child menu, slide towards left
-            slideIntoContainer(towards = SlideDirection.Left) togetherWith
-                // Keep exiting content in place while sliding in the incoming content.
-                ExitTransition.KeepUntilTransitionsFinished
-        } else {
-            // Going from child menu to parent menu, slide towards right.
-            // Slide parent by half amount compared to child menu to create an interesting
-            // parallax visual effect.
-            slideIntoContainer(towards = SlideDirection.Right) { offsetForFullSlide ->
-                offsetForFullSlide / 2
-            } togetherWith slideOutOfContainer(towards = SlideDirection.Right)
-        }.apply {
-            // Here we can specify the zIndex for the target (i.e. incoming) content.
-            targetContentZIndex = when (targetState) {
-                NestedMenuState.Level1 -> 1f
-                NestedMenuState.Level2 -> 2f
-                NestedMenuState.Level3 -> 3f
+                // Going from parent menu to child menu, slide towards left
+                slideIntoContainer(towards = SlideDirection.Left) togetherWith
+                    // Keep exiting content in place while sliding in the incoming content.
+                    ExitTransition.KeepUntilTransitionsFinished
+            } else {
+                // Going from child menu to parent menu, slide towards right.
+                // Slide parent by half amount compared to child menu to create an interesting
+                // parallax visual effect.
+                slideIntoContainer(towards = SlideDirection.Right) { offsetForFullSlide ->
+                    offsetForFullSlide / 2
+                } togetherWith slideOutOfContainer(towards = SlideDirection.Right)
             }
-        }
+            .apply {
+                // Here we can specify the zIndex for the target (i.e. incoming) content.
+                targetContentZIndex =
+                    when (targetState) {
+                        NestedMenuState.Level1 -> 1f
+                        NestedMenuState.Level2 -> 2f
+                        NestedMenuState.Level3 -> 3f
+                    }
+            }
     }
 }
 
@@ -312,4 +311,8 @@
     Collapsed
 }
 
-private enum class NestedMenuState { Level1, Level2, Level3 }
+private enum class NestedMenuState {
+    Level1,
+    Level2,
+    Level3
+}
diff --git a/compose/animation/animation/samples/src/main/java/androidx/compose/animation/samples/AnimatedValueSamples.kt b/compose/animation/animation/samples/src/main/java/androidx/compose/animation/samples/AnimatedValueSamples.kt
index 042824a..b6de648 100644
--- a/compose/animation/animation/samples/src/main/java/androidx/compose/animation/samples/AnimatedValueSamples.kt
+++ b/compose/animation/animation/samples/src/main/java/androidx/compose/animation/samples/AnimatedValueSamples.kt
@@ -39,9 +39,10 @@
         // Animates to primary or secondary color, depending on whether [primary] is true
         // [animateState] returns the current animation value in a State<Color> in this example. We
         // use the State<Color> object as a property delegate here.
-        val color: Color by animateColorAsState(
-            if (primary) MaterialTheme.colors.primary else MaterialTheme.colors.secondary
-        )
+        val color: Color by
+            animateColorAsState(
+                if (primary) MaterialTheme.colors.primary else MaterialTheme.colors.secondary
+            )
         Box(modifier = Modifier.background(color))
     }
 }
diff --git a/compose/animation/animation/samples/src/main/java/androidx/compose/animation/samples/AnimatedVisibilitySamples.kt b/compose/animation/animation/samples/src/main/java/androidx/compose/animation/samples/AnimatedVisibilitySamples.kt
index cce61a4..cb0d0b7 100644
--- a/compose/animation/animation/samples/src/main/java/androidx/compose/animation/samples/AnimatedVisibilitySamples.kt
+++ b/compose/animation/animation/samples/src/main/java/androidx/compose/animation/samples/AnimatedVisibilitySamples.kt
@@ -103,16 +103,17 @@
         visible = visible,
         // Set the start width to 20 (pixels), 0 by default
         enter = expandHorizontally { 20 },
-        exit = shrinkHorizontally(
-            // Overwrites the default animation with tween for this shrink animation.
-            animationSpec = tween(),
-            // Shrink towards the end (i.e. right edge for LTR, left edge for RTL). The default
-            // direction for the shrink is towards [Alignment.Start]
-            shrinkTowards = Alignment.End,
-        ) { fullWidth ->
-            // Set the end width for the shrink animation to a quarter of the full width.
-            fullWidth / 4
-        }
+        exit =
+            shrinkHorizontally(
+                // Overwrites the default animation with tween for this shrink animation.
+                animationSpec = tween(),
+                // Shrink towards the end (i.e. right edge for LTR, left edge for RTL). The default
+                // direction for the shrink is towards [Alignment.Start]
+                shrinkTowards = Alignment.End,
+            ) { fullWidth ->
+                // Set the end width for the shrink animation to a quarter of the full width.
+                fullWidth / 4
+            }
     ) {
         // Content that needs to appear/disappear goes here:
         Box(Modifier.fillMaxWidth().requiredHeight(200.dp))
@@ -125,18 +126,21 @@
     var visible by remember { mutableStateOf(true) }
     AnimatedVisibility(
         visible = visible,
-        enter = slideInHorizontally(animationSpec = tween(durationMillis = 200)) { fullWidth ->
-            // Offsets the content by 1/3 of its width to the left, and slide towards right
-            // Overwrites the default animation with tween for this slide animation.
-            -fullWidth / 3
-        } + fadeIn(
-            // Overwrites the default animation with tween
-            animationSpec = tween(durationMillis = 200)
-        ),
-        exit = slideOutHorizontally(animationSpec = spring(stiffness = Spring.StiffnessHigh)) {
-            // Overwrites the ending position of the slide-out to 200 (pixels) to the right
-            200
-        } + fadeOut()
+        enter =
+            slideInHorizontally(animationSpec = tween(durationMillis = 200)) { fullWidth ->
+                // Offsets the content by 1/3 of its width to the left, and slide towards right
+                // Overwrites the default animation with tween for this slide animation.
+                -fullWidth / 3
+            } +
+                fadeIn(
+                    // Overwrites the default animation with tween
+                    animationSpec = tween(durationMillis = 200)
+                ),
+        exit =
+            slideOutHorizontally(animationSpec = spring(stiffness = Spring.StiffnessHigh)) {
+                // Overwrites the ending position of the slide-out to 200 (pixels) to the right
+                200
+            } + fadeOut()
     ) {
         // Content that needs to appear/disappear goes here:
         Box(Modifier.fillMaxWidth().requiredHeight(200.dp)) {}
@@ -149,14 +153,16 @@
     var visible by remember { mutableStateOf(true) }
     AnimatedVisibility(
         visible = visible,
-        enter = fadeIn(
-            // Overwrites the initial value of alpha to 0.4f for fade in, 0 by default
-            initialAlpha = 0.4f
-        ),
-        exit = fadeOut(
-            // Overwrites the default animation with tween
-            animationSpec = tween(durationMillis = 250)
-        )
+        enter =
+            fadeIn(
+                // Overwrites the initial value of alpha to 0.4f for fade in, 0 by default
+                initialAlpha = 0.4f
+            ),
+        exit =
+            fadeOut(
+                // Overwrites the default animation with tween
+                animationSpec = tween(durationMillis = 250)
+            )
     ) {
         // Content that needs to appear/disappear goes here:
         Text("Content to appear/disappear", Modifier.fillMaxWidth().requiredHeight(200.dp))
@@ -170,16 +176,18 @@
     var visible by remember { mutableStateOf(true) }
     AnimatedVisibility(
         visible = visible,
-        enter = slideInVertically(
-            // Start the slide from 40 (pixels) above where the content is supposed to go, to
-            // produce a parallax effect
-            initialOffsetY = { -40 }
-        ) + expandVertically(
-            expandFrom = Alignment.Top
-        ) + scaleIn(
-            // Animate scale from 0f to 1f using the top center as the pivot point.
-            transformOrigin = TransformOrigin(0.5f, 0f)
-        ) + fadeIn(initialAlpha = 0.3f),
+        enter =
+            slideInVertically(
+                // Start the slide from 40 (pixels) above where the content is supposed to go, to
+                // produce a parallax effect
+                initialOffsetY = { -40 }
+            ) +
+                expandVertically(expandFrom = Alignment.Top) +
+                scaleIn(
+                    // Animate scale from 0f to 1f using the top center as the pivot point.
+                    transformOrigin = TransformOrigin(0.5f, 0f)
+                ) +
+                fadeIn(initialAlpha = 0.3f),
         exit = slideOutVertically() + shrinkVertically() + fadeOut() + scaleOut(targetScale = 1.2f)
     ) {
         // Content that needs to appear/disappear goes here:
@@ -202,18 +210,21 @@
             // Here we can optionally define a custom enter/exit animation by creating an animation
             // using the Transition<EnterExitState> object from AnimatedVisibilityScope:
 
-            // As a part of the enter transition, the corner radius will be animated from 0.dp to 50.dp.
-            val cornerRadius by transition.animateDp {
-                when (it) {
-                    EnterExitState.PreEnter -> 0.dp
-                    EnterExitState.Visible -> 50.dp
-                    // No corner radius change when exiting.
-                    EnterExitState.PostExit -> 50.dp
+            // As a part of the enter transition, the corner radius will be animated from 0.dp to
+            // 50.dp.
+            val cornerRadius by
+                transition.animateDp {
+                    when (it) {
+                        EnterExitState.PreEnter -> 0.dp
+                        EnterExitState.Visible -> 50.dp
+                        // No corner radius change when exiting.
+                        EnterExitState.PostExit -> 50.dp
+                    }
                 }
-            }
             Box(
                 Modifier.background(Color.Red, shape = RoundedCornerShape(cornerRadius))
-                    .height(100.dp).fillMaxWidth()
+                    .height(100.dp)
+                    .fillMaxWidth()
             )
         }
     }
@@ -234,10 +245,7 @@
                 contentDescription = "Favorite",
                 modifier = Modifier.align(Alignment.CenterVertically)
             )
-            AnimatedVisibility(
-                expanded,
-                modifier = Modifier.align(Alignment.CenterVertically)
-            ) {
+            AnimatedVisibility(expanded, modifier = Modifier.align(Alignment.CenterVertically)) {
                 Text(modifier = Modifier.padding(start = 12.dp), text = "Favorite")
             }
         }
@@ -251,18 +259,22 @@
     var visible by remember { mutableStateOf(true) }
     AnimatedVisibility(
         visible,
-        enter = slideIn(tween(100, easing = LinearOutSlowInEasing)) { fullSize ->
-            // Specifies the starting offset of the slide-in to be 1/4 of the width to the right,
-            // 100 (pixels) below the content position, which results in a simultaneous slide up
-            // and slide left.
-            IntOffset(fullSize.width / 4, 100)
-        },
-        exit = slideOut(tween(100, easing = FastOutSlowInEasing)) {
-            // The offset can be entirely independent of the size of the content. This specifies
-            // a target offset 180 pixels to the left of the content, and 50 pixels below. This will
-            // produce a slide-left combined with a slide-down.
-            IntOffset(-180, 50)
-        },
+        enter =
+            slideIn(tween(100, easing = LinearOutSlowInEasing)) { fullSize ->
+                // Specifies the starting offset of the slide-in to be 1/4 of the width to the
+                // right,
+                // 100 (pixels) below the content position, which results in a simultaneous slide up
+                // and slide left.
+                IntOffset(fullSize.width / 4, 100)
+            },
+        exit =
+            slideOut(tween(100, easing = FastOutSlowInEasing)) {
+                // The offset can be entirely independent of the size of the content. This specifies
+                // a target offset 180 pixels to the left of the content, and 50 pixels below. This
+                // will
+                // produce a slide-left combined with a slide-down.
+                IntOffset(-180, 50)
+            },
     ) {
         // Content that needs to appear/disappear goes here:
         Text("Content to appear/disappear", Modifier.fillMaxWidth().requiredHeight(200.dp))
@@ -280,9 +292,7 @@
         // the beginning of the expanding animation.
         enter = expandVertically(expandFrom = Alignment.Top) { 20 },
         // Shrinks the content to half of its full height via an animation.
-        exit = shrinkVertically(animationSpec = tween()) { fullHeight ->
-            fullHeight / 2
-        },
+        exit = shrinkVertically(animationSpec = tween()) { fullHeight -> fullHeight / 2 },
     ) {
         // Content that needs to appear/disappear goes here:
         Text("Content to appear/disappear", Modifier.fillMaxWidth().requiredHeight(200.dp))
@@ -296,26 +306,30 @@
 
     AnimatedVisibility(
         visible,
-        enter = expandIn(
-            // Overwrites the default spring animation with tween
-            animationSpec = tween(100, easing = LinearOutSlowInEasing),
-            // Overwrites the corner of the content that is first revealed
-            expandFrom = Alignment.BottomStart
-        ) {
-            // Overwrites the initial size to 50 pixels by 50 pixels
-            IntSize(50, 50)
-        },
-        exit = shrinkOut(
-            tween(100, easing = FastOutSlowInEasing),
-            // Overwrites the area of the content that the shrink animation will end on. The
-            // following parameters will shrink the content's clip bounds from the full size of the
-            // content to 1/10 of the width and 1/5 of the height. The shrinking clip bounds will
-            // always be aligned to the CenterStart of the full-content bounds.
-            shrinkTowards = Alignment.CenterStart
-        ) { fullSize ->
-            // Overwrites the target size of the shrinking animation.
-            IntSize(fullSize.width / 10, fullSize.height / 5)
-        }
+        enter =
+            expandIn(
+                // Overwrites the default spring animation with tween
+                animationSpec = tween(100, easing = LinearOutSlowInEasing),
+                // Overwrites the corner of the content that is first revealed
+                expandFrom = Alignment.BottomStart
+            ) {
+                // Overwrites the initial size to 50 pixels by 50 pixels
+                IntSize(50, 50)
+            },
+        exit =
+            shrinkOut(
+                tween(100, easing = FastOutSlowInEasing),
+                // Overwrites the area of the content that the shrink animation will end on. The
+                // following parameters will shrink the content's clip bounds from the full size of
+                // the
+                // content to 1/10 of the width and 1/5 of the height. The shrinking clip bounds
+                // will
+                // always be aligned to the CenterStart of the full-content bounds.
+                shrinkTowards = Alignment.CenterStart
+            ) { fullSize ->
+                // Overwrites the target size of the shrinking animation.
+                IntSize(fullSize.width / 10, fullSize.height / 5)
+            }
     ) {
         // Content that needs to appear/disappear goes here:
         Text("Content to appear/disappear", Modifier.fillMaxWidth().requiredHeight(200.dp))
@@ -327,11 +341,7 @@
 fun ColumnAnimatedVisibilitySample() {
     var itemIndex by remember { mutableStateOf(0) }
     val colors = listOf(Color.Red, Color.Green, Color.Blue)
-    Column(
-        Modifier.fillMaxWidth().clickable {
-            itemIndex = (itemIndex + 1) % colors.size
-        }
-    ) {
+    Column(Modifier.fillMaxWidth().clickable { itemIndex = (itemIndex + 1) % colors.size }) {
         colors.forEachIndexed { i, color ->
             // By default ColumnScope.AnimatedVisibility expands and shrinks new content while
             // fading.
@@ -347,36 +357,41 @@
 fun AVScopeAnimateEnterExit() {
     @OptIn(ExperimentalAnimationApi::class)
     @Composable
-    fun AnimatedVisibilityScope.Item(
-        modifier: Modifier,
-        backgroundColor: Color
-    ) {
+    fun AnimatedVisibilityScope.Item(modifier: Modifier, backgroundColor: Color) {
         // Creates a custom enter/exit animation for scale property.
-        val scale by transition.animateFloat { enterExitState ->
-            // Enter transition will be animating the scale from 0.9f to 1.0f
-            // (i.e. PreEnter -> Visible). Exit transition will be from 1.0f to
-            // 0.5f (i.e. Visible -> PostExit)
-            when (enterExitState) {
-                EnterExitState.PreEnter -> 0.9f
-                EnterExitState.Visible -> 1.0f
-                EnterExitState.PostExit -> 0.5f
+        val scale by
+            transition.animateFloat { enterExitState ->
+                // Enter transition will be animating the scale from 0.9f to 1.0f
+                // (i.e. PreEnter -> Visible). Exit transition will be from 1.0f to
+                // 0.5f (i.e. Visible -> PostExit)
+                when (enterExitState) {
+                    EnterExitState.PreEnter -> 0.9f
+                    EnterExitState.Visible -> 1.0f
+                    EnterExitState.PostExit -> 0.5f
+                }
             }
-        }
 
         // Since we defined `Item` as an extension function on AnimatedVisibilityScope, we can use
         // the `animateEnterExit` modifier to produce an enter/exit animation for it. This will
         // run simultaneously with the `AnimatedVisibility`'s enter/exit.
         Box(
-            modifier.fillMaxWidth().padding(5.dp).animateEnterExit(
-                // Slide in from below,
-                enter = slideInVertically(initialOffsetY = { it }),
-                // No slide on the way out. So the exit animation will be scale (from the custom
-                // scale animation defined above) and fade (from AnimatedVisibility)
-                exit = ExitTransition.None
-            ).graphicsLayer {
-                scaleX = scale
-                scaleY = scale
-            }.clip(RoundedCornerShape(20.dp)).background(backgroundColor).fillMaxSize()
+            modifier
+                .fillMaxWidth()
+                .padding(5.dp)
+                .animateEnterExit(
+                    // Slide in from below,
+                    enter = slideInVertically(initialOffsetY = { it }),
+                    // No slide on the way out. So the exit animation will be scale (from the custom
+                    // scale animation defined above) and fade (from AnimatedVisibility)
+                    exit = ExitTransition.None
+                )
+                .graphicsLayer {
+                    scaleX = scale
+                    scaleY = scale
+                }
+                .clip(RoundedCornerShape(20.dp))
+                .background(backgroundColor)
+                .fillMaxSize()
         ) {
             // Content of the item goes here...
         }
@@ -407,7 +422,9 @@
                         onClick = {},
                         modifier = Modifier.align(Alignment.BottomEnd).padding(20.dp),
                         backgroundColor = MaterialTheme.colors.primary
-                    ) { Icon(Icons.Default.Favorite, contentDescription = null) }
+                    ) {
+                        Icon(Icons.Default.Favorite, contentDescription = null)
+                    }
                 }
             }
 
@@ -436,18 +453,13 @@
     fun ItemMainContent() {
         Row(Modifier.height(100.dp).fillMaxWidth(), Arrangement.SpaceEvenly) {
             Box(
-                Modifier.size(60.dp).align(Alignment.CenterVertically)
+                Modifier.size(60.dp)
+                    .align(Alignment.CenterVertically)
                     .background(Color(0xffcdb7f6), CircleShape)
             )
             Column(Modifier.align(Alignment.CenterVertically)) {
-                Box(
-                    Modifier.height(30.dp).width(300.dp).padding(5.dp)
-                        .background(Color.LightGray)
-                )
-                Box(
-                    Modifier.height(30.dp).width(300.dp).padding(5.dp)
-                        .background(Color.LightGray)
-                )
+                Box(Modifier.height(30.dp).width(300.dp).padding(5.dp).background(Color.LightGray))
+                Box(Modifier.height(30.dp).width(300.dp).padding(5.dp).background(Color.LightGray))
             }
         }
     }
@@ -462,17 +474,18 @@
             // Creates a transition to animate visual changes when `selected` is changed.
             val selectionTransition = updateTransition(selected)
             // Animates the border color as a part of the transition
-            val borderColor by selectionTransition.animateColor { isSelected ->
-                if (isSelected) Color(0xff03a9f4) else Color.White
-            }
+            val borderColor by
+                selectionTransition.animateColor { isSelected ->
+                    if (isSelected) Color(0xff03a9f4) else Color.White
+                }
             // Animates the background color when selected state changes
-            val contentBackground by selectionTransition.animateColor { isSelected ->
-                if (isSelected) Color(0xffdbf0fe) else Color.White
-            }
+            val contentBackground by
+                selectionTransition.animateColor { isSelected ->
+                    if (isSelected) Color(0xffdbf0fe) else Color.White
+                }
             // Animates elevation as a part of the transition
-            val elevation by selectionTransition.animateDp { isSelected ->
-                if (isSelected) 10.dp else 2.dp
-            }
+            val elevation by
+                selectionTransition.animateDp { isSelected -> if (isSelected) 10.dp else 2.dp }
             Surface(
                 shape = RoundedCornerShape(10.dp),
                 border = BorderStroke(2.dp, borderColor),
@@ -511,14 +524,15 @@
 @Sampled
 @Composable
 fun AnimatedVisibilityLazyColumnSample() {
-    val turquoiseColors = listOf(
-        Color(0xff07688C),
-        Color(0xff1986AF),
-        Color(0xff50B6CD),
-        Color(0xffBCF8FF),
-        Color(0xff8AEAE9),
-        Color(0xff46CECA)
-    )
+    val turquoiseColors =
+        listOf(
+            Color(0xff07688C),
+            Color(0xff1986AF),
+            Color(0xff50B6CD),
+            Color(0xffBCF8FF),
+            Color(0xff8AEAE9),
+            Color(0xff46CECA)
+        )
 
     // MyModel class handles the data change of the items that are displayed in LazyColumn.
     class MyModel {
@@ -530,14 +544,9 @@
         // visibility. When the MutableTransitionState's targetState changes, corresponding
         // transition will be fired. MutableTransitionState allows animation lifecycle to be
         // observed through it's [currentState] and [isIdle]. See below for details.
-        inner class ColoredItem(
-            val visible: MutableTransitionState<Boolean>,
-            val itemId: Int
-        ) {
+        inner class ColoredItem(val visible: MutableTransitionState<Boolean>, val itemId: Int) {
             val color: Color
-                get() = turquoiseColors.let {
-                    it[itemId % it.size]
-                }
+                get() = turquoiseColors.let { it[itemId % it.size] }
         }
 
         fun addNewItem() {
@@ -572,9 +581,7 @@
         }
 
         fun removeAll() {
-            _items.forEach {
-                it.visible.targetState = false
-            }
+            _items.forEach { it.visible.targetState = false }
         }
     }
 
@@ -583,10 +590,7 @@
         Column {
             val model = remember { MyModel() }
             Row(Modifier.fillMaxWidth()) {
-                Button(
-                    { model.addNewItem() },
-                    modifier = Modifier.padding(15.dp).weight(1f)
-                ) {
+                Button({ model.addNewItem() }, modifier = Modifier.padding(15.dp).weight(1f)) {
                     Text("Add")
                 }
             }
@@ -595,12 +599,13 @@
             // notify the model to prune the list.
             LaunchedEffect(model) {
                 snapshotFlow {
-                    model.items.firstOrNull { it.visible.isIdle && !it.visible.targetState }
-                }.collect {
-                    if (it != null) {
-                        model.pruneItems()
+                        model.items.firstOrNull { it.visible.isIdle && !it.visible.targetState }
                     }
-                }
+                    .collect {
+                        if (it != null) {
+                            model.pruneItems()
+                        }
+                    }
             }
             LazyColumn {
                 items(model.items, key = { it.itemId }) { item ->
@@ -609,14 +614,10 @@
                         enter = expandVertically(),
                         exit = shrinkVertically()
                     ) {
-                        Box(
-                            Modifier.fillMaxWidth().requiredHeight(90.dp)
-                                .background(item.color)
-                        ) {
+                        Box(Modifier.fillMaxWidth().requiredHeight(90.dp).background(item.color)) {
                             Button(
                                 { model.removeItem(item) },
-                                modifier = Modifier.align(Alignment.CenterEnd)
-                                    .padding(15.dp)
+                                modifier = Modifier.align(Alignment.CenterEnd).padding(15.dp)
                             ) {
                                 Text("Remove")
                             }
@@ -625,10 +626,7 @@
                 }
             }
 
-            Button(
-                { model.removeAll() },
-                modifier = Modifier.align(Alignment.End).padding(15.dp)
-            ) {
+            Button({ model.removeAll() }, modifier = Modifier.align(Alignment.End).padding(15.dp)) {
                 Text("Clear All")
             }
         }
@@ -639,22 +637,25 @@
 @Composable
 fun AVColumnScopeWithMutableTransitionState() {
     var visible by remember { mutableStateOf(true) }
-    val colors =
-        remember { listOf(Color(0xff2a9d8f), Color(0xffe9c46a), Color(0xfff4a261)) }
+    val colors = remember { listOf(Color(0xff2a9d8f), Color(0xffe9c46a), Color(0xfff4a261)) }
     Column {
         repeat(3) {
             AnimatedVisibility(
-                visibleState = remember {
-                    // This sets up the initial state of the AnimatedVisibility to false to
-                    // guarantee an initial enter transition. In contrast, initializing this as
-                    // `MutableTransitionState(visible)` would result in no initial enter
-                    // transition.
-                    MutableTransitionState(initialState = false)
-                }.apply {
-                    // This changes the target state of the visible state. If it's different than
-                    // the initial state, an enter/exit transition will be triggered.
-                    targetState = visible
-                },
+                visibleState =
+                    remember {
+                            // This sets up the initial state of the AnimatedVisibility to false to
+                            // guarantee an initial enter transition. In contrast, initializing this
+                            // as
+                            // `MutableTransitionState(visible)` would result in no initial enter
+                            // transition.
+                            MutableTransitionState(initialState = false)
+                        }
+                        .apply {
+                            // This changes the target state of the visible state. If it's different
+                            // than
+                            // the initial state, an enter/exit transition will be triggered.
+                            targetState = visible
+                        },
             ) { // Content that needs to appear/disappear goes here:
                 Box(Modifier.fillMaxWidth().height(100.dp).background(colors[it]))
             }
@@ -668,19 +669,20 @@
     @OptIn(ExperimentalAnimationApi::class)
     @Composable
     fun FullScreenNotification(visible: Boolean) {
-        AnimatedVisibility(
-            visible = visible,
-            enter = fadeIn(), exit = fadeOut()
-        ) {
+        AnimatedVisibility(visible = visible, enter = fadeIn(), exit = fadeOut()) {
             // Fade in/out the background and foreground
             Box(Modifier.fillMaxSize().background(Color(0x88000000))) {
                 Box(
-                    Modifier.align(Alignment.TopStart).animateEnterExit(
-                        // Slide in/out the rounded rect
-                        enter = slideInVertically(),
-                        exit = slideOutVertically()
-                    ).clip(RoundedCornerShape(10.dp)).requiredHeight(100.dp)
-                        .fillMaxWidth().background(Color.White)
+                    Modifier.align(Alignment.TopStart)
+                        .animateEnterExit(
+                            // Slide in/out the rounded rect
+                            enter = slideInVertically(),
+                            exit = slideOutVertically()
+                        )
+                        .clip(RoundedCornerShape(10.dp))
+                        .requiredHeight(100.dp)
+                        .fillMaxWidth()
+                        .background(Color.White)
                 ) {
                     // Content of the notification goes here
                 }
@@ -719,13 +721,17 @@
             // Scale up from the TopLeft by setting TransformOrigin to (0f, 0f), while expanding the
             // layout size from Top start and fading. This will create a coherent look as if the
             // scale is impacting the size.
-            enter = scaleIn(transformOrigin = TransformOrigin(0f, 0f)) +
-                fadeIn() + expandIn(expandFrom = Alignment.TopStart),
+            enter =
+                scaleIn(transformOrigin = TransformOrigin(0f, 0f)) +
+                    fadeIn() +
+                    expandIn(expandFrom = Alignment.TopStart),
             // Scale down from the TopLeft by setting TransformOrigin to (0f, 0f), while shrinking
             // the layout towards Top start and fading. This will create a coherent look as if the
             // scale is impacting the layout size.
-            exit = scaleOut(transformOrigin = TransformOrigin(0f, 0f)) +
-                fadeOut() + shrinkOut(shrinkTowards = Alignment.TopStart)
+            exit =
+                scaleOut(transformOrigin = TransformOrigin(0f, 0f)) +
+                    fadeOut() +
+                    shrinkOut(shrinkTowards = Alignment.TopStart)
         ) {
             Box(
                 Modifier.size(100.dp)
diff --git a/compose/animation/animation/samples/src/main/java/androidx/compose/animation/samples/AnimationModifierSample.kt b/compose/animation/animation/samples/src/main/java/androidx/compose/animation/samples/AnimationModifierSample.kt
index ba7059e..2e6057c 100644
--- a/compose/animation/animation/samples/src/main/java/androidx/compose/animation/samples/AnimationModifierSample.kt
+++ b/compose/animation/animation/samples/src/main/java/androidx/compose/animation/samples/AnimationModifierSample.kt
@@ -42,15 +42,12 @@
     val longText = "Very long text\nthat spans across\nmultiple lines"
     var short by remember { mutableStateOf(true) }
     Box(
-        modifier = Modifier
-            .background(
-                Color.Blue,
-                RoundedCornerShape(15.dp)
-            )
-            .clickable { short = !short }
-            .padding(20.dp)
-            .wrapContentSize()
-            .animateContentSize()
+        modifier =
+            Modifier.background(Color.Blue, RoundedCornerShape(15.dp))
+                .clickable { short = !short }
+                .padding(20.dp)
+                .wrapContentSize()
+                .animateContentSize()
     ) {
         Text(
             if (short) {
diff --git a/compose/animation/animation/samples/src/main/java/androidx/compose/animation/samples/SharedTransitionSamples.kt b/compose/animation/animation/samples/src/main/java/androidx/compose/animation/samples/SharedTransitionSamples.kt
index 0bae894..c3d18dd 100644
--- a/compose/animation/animation/samples/src/main/java/androidx/compose/animation/samples/SharedTransitionSamples.kt
+++ b/compose/animation/animation/samples/src/main/java/androidx/compose/animation/samples/SharedTransitionSamples.kt
@@ -71,12 +71,7 @@
     val selectionColor = Color(0xff3367ba)
     var expanded by remember { mutableStateOf(true) }
     SharedTransitionLayout(
-        Modifier
-            .fillMaxSize()
-            .clickable {
-                expanded = !expanded
-            }
-            .background(Color(0x88000000))
+        Modifier.fillMaxSize().clickable { expanded = !expanded }.background(Color(0x88000000))
     ) {
         AnimatedVisibility(
             visible = expanded,
@@ -85,8 +80,7 @@
         ) {
             Box(modifier = Modifier.fillMaxSize()) {
                 Surface(
-                    Modifier
-                        .align(Alignment.BottomCenter)
+                    Modifier.align(Alignment.BottomCenter)
                         .padding(20.dp)
                         .sharedBounds(
                             rememberSharedContentState(key = "container"),
@@ -96,8 +90,7 @@
                     shape = RoundedCornerShape(50),
                 ) {
                     Row(
-                        Modifier
-                            .padding(10.dp)
+                        Modifier.padding(10.dp)
                             // By using Modifier.skipToLookaheadSize(), we are telling the layout
                             // system to layout the children of this node as if the animations had
                             // all finished. This avoid re-laying out the Row with animated width,
@@ -108,43 +101,45 @@
                         Icon(
                             Icons.Outlined.Share,
                             contentDescription = "Share",
-                            modifier = Modifier.padding(
-                                top = 10.dp,
-                                bottom = 10.dp,
-                                start = 10.dp,
-                                end = 20.dp
-                            )
+                            modifier =
+                                Modifier.padding(
+                                    top = 10.dp,
+                                    bottom = 10.dp,
+                                    start = 10.dp,
+                                    end = 20.dp
+                                )
                         )
                         Icon(
                             Icons.Outlined.Favorite,
                             contentDescription = "Favorite",
-                            modifier = Modifier.padding(
-                                top = 10.dp,
-                                bottom = 10.dp,
-                                start = 10.dp,
-                                end = 20.dp
-                            )
+                            modifier =
+                                Modifier.padding(
+                                    top = 10.dp,
+                                    bottom = 10.dp,
+                                    start = 10.dp,
+                                    end = 20.dp
+                                )
                         )
                         Icon(
                             Icons.Outlined.Create,
                             contentDescription = "Create",
                             tint = Color.White,
-                            modifier = Modifier
-                                .sharedBounds(
-                                    rememberSharedContentState(key = "icon_background"),
-                                    this@AnimatedVisibility
-                                )
-                                .background(selectionColor, RoundedCornerShape(50))
-                                .padding(
-                                    top = 10.dp,
-                                    bottom = 10.dp,
-                                    start = 20.dp,
-                                    end = 20.dp
-                                )
-                                .sharedElement(
-                                    rememberSharedContentState(key = "icon"),
-                                    this@AnimatedVisibility
-                                )
+                            modifier =
+                                Modifier.sharedBounds(
+                                        rememberSharedContentState(key = "icon_background"),
+                                        this@AnimatedVisibility
+                                    )
+                                    .background(selectionColor, RoundedCornerShape(50))
+                                    .padding(
+                                        top = 10.dp,
+                                        bottom = 10.dp,
+                                        start = 20.dp,
+                                        end = 20.dp
+                                    )
+                                    .sharedElement(
+                                        rememberSharedContentState(key = "icon"),
+                                        this@AnimatedVisibility
+                                    )
                         )
                     }
                 }
@@ -157,8 +152,7 @@
         ) {
             Box(modifier = Modifier.fillMaxSize()) {
                 Surface(
-                    Modifier
-                        .align(Alignment.BottomEnd)
+                    Modifier.align(Alignment.BottomEnd)
                         .padding(30.dp)
                         .sharedBounds(
                             rememberSharedContentState(key = "container"),
@@ -178,13 +172,13 @@
                         Icons.Outlined.Create,
                         contentDescription = "Create",
                         tint = Color.White,
-                        modifier = Modifier
-                            .padding(30.dp)
-                            .size(40.dp)
-                            .sharedElement(
-                                rememberSharedContentState(key = "icon"),
-                                this@AnimatedVisibility
-                            )
+                        modifier =
+                            Modifier.padding(30.dp)
+                                .size(40.dp)
+                                .sharedElement(
+                                    rememberSharedContentState(key = "icon"),
+                                    this@AnimatedVisibility
+                                )
                     )
                 }
             }
@@ -196,9 +190,7 @@
 @Sampled
 @Composable
 fun SharedElementWithMovableContentSample() {
-    var showThumbnail by remember {
-        mutableStateOf(true)
-    }
+    var showThumbnail by remember { mutableStateOf(true) }
     val movableContent = remember {
         movableContentOf {
             val cornerRadius = animateDpAsState(targetValue = if (!showThumbnail) 20.dp else 5.dp)
@@ -211,18 +203,15 @@
         }
     }
     SharedTransitionLayout(
-        Modifier
-            .clickable { showThumbnail = !showThumbnail }
-            .fillMaxSize()
-            .padding(10.dp)) {
+        Modifier.clickable { showThumbnail = !showThumbnail }.fillMaxSize().padding(10.dp)
+    ) {
         Column {
             Box(
                 // When using Modifier.sharedElementWithCallerManagedVisibility(), even when
                 // visible == false, the layout will continue to occupy space in its parent layout.
                 // The content will continue to be composed, unless the content is [MovableContent]
                 // like in this example below.
-                Modifier
-                    .sharedElementWithCallerManagedVisibility(
+                Modifier.sharedElementWithCallerManagedVisibility(
                         rememberSharedContentState(key = "YT"),
                         showThumbnail,
                     )
@@ -233,21 +222,18 @@
                 }
             }
             Box(
-                Modifier
-                    .fillMaxWidth()
+                Modifier.fillMaxWidth()
                     .height(100.dp)
                     .background(Color(0xffffcc5c), RoundedCornerShape(5.dp))
             )
             Box(
-                Modifier
-                    .fillMaxWidth()
+                Modifier.fillMaxWidth()
                     .height(100.dp)
                     .background(Color(0xff2a9d84), RoundedCornerShape(5.dp))
             )
         }
         Box(
-            Modifier
-                .fillMaxSize()
+            Modifier.fillMaxSize()
                 .aspectRatio(1f)
                 .sharedElementWithCallerManagedVisibility(
                     rememberSharedContentState(key = "YT"),
@@ -272,26 +258,20 @@
             painterResource(id = R.drawable.yt_profile),
             contentDescription = "cute cat",
             contentScale = ContentScale.FillHeight,
-            modifier = modifier
-                .clip(shape = RoundedCornerShape(10))
+            modifier = modifier.clip(shape = RoundedCornerShape(10))
         )
     }
 
-    var showThumbnail by remember {
-        mutableStateOf(true)
-    }
+    var showThumbnail by remember { mutableStateOf(true) }
     SharedTransitionLayout(
-        Modifier
-            .clickable { showThumbnail = !showThumbnail }
-            .fillMaxSize()
-            .padding(10.dp)) {
+        Modifier.clickable { showThumbnail = !showThumbnail }.fillMaxSize().padding(10.dp)
+    ) {
         Column(Modifier.padding(10.dp)) {
             // Create an AnimatedVisibility for the shared element, so that the layout siblings
             // (i.e. the two boxes below) will move in to fill the space during the exit transition.
             AnimatedVisibility(visible = showThumbnail) {
                 Cat(
-                    Modifier
-                        .size(100.dp)
+                    Modifier.size(100.dp)
                         // Create a shared element, using string as the key
                         .sharedElement(
                             rememberSharedContentState(key = "YT"),
@@ -300,14 +280,12 @@
                 )
             }
             Box(
-                Modifier
-                    .fillMaxWidth()
+                Modifier.fillMaxWidth()
                     .height(100.dp)
                     .background(Color(0xffffcc5c), RoundedCornerShape(5.dp))
             )
             Box(
-                Modifier
-                    .fillMaxWidth()
+                Modifier.fillMaxWidth()
                     .height(100.dp)
                     .background(Color(0xff2a9d84), RoundedCornerShape(5.dp))
             )
@@ -315,8 +293,7 @@
         Box(modifier = Modifier.fillMaxSize()) {
             AnimatedVisibility(!showThumbnail) {
                 Cat(
-                    Modifier
-                        .fillMaxSize()
+                    Modifier.fillMaxSize()
                         // Create another shared element, and make sure the string key matches
                         // the other shared element.
                         .sharedElement(
@@ -326,25 +303,26 @@
                 )
             }
             FloatingActionButton(
-                modifier = Modifier
-                    .padding(20.dp)
-                    .align(Alignment.BottomEnd)
-                    // During shared element transition, shared elements will be rendered in
-                    // overlay to escape any clipping or layer transform from parents. It also
-                    // means they will render over on top of UI elements such as Floating Action
-                    // Button. Once the transition is finished, they will be dropped from the
-                    // overlay to their own DrawScopes. To help support keeping specific UI
-                    // elements always on top, Modifier.renderInSharedTransitionScopeOverlay
-                    // will temporarily elevate them into the overlay as well. By default,
-                    // this modifier keeps content in overlay during the time when the
-                    // shared transition is active (i.e. SharedTransitionScope#isTransitionActive).
-                    // The duration can be customize via `renderInOverlay` parameter.
-                    .renderInSharedTransitionScopeOverlay(
-                        // zIndexInOverlay by default is 0f for this modifier and for shared
-                        // elements. By overwriting zIndexInOverlay to 1f, we can ensure this
-                        // FAB is rendered on top of the shared elements.
-                        zIndexInOverlay = 1f
-                    ),
+                modifier =
+                    Modifier.padding(20.dp)
+                        .align(Alignment.BottomEnd)
+                        // During shared element transition, shared elements will be rendered in
+                        // overlay to escape any clipping or layer transform from parents. It also
+                        // means they will render over on top of UI elements such as Floating Action
+                        // Button. Once the transition is finished, they will be dropped from the
+                        // overlay to their own DrawScopes. To help support keeping specific UI
+                        // elements always on top, Modifier.renderInSharedTransitionScopeOverlay
+                        // will temporarily elevate them into the overlay as well. By default,
+                        // this modifier keeps content in overlay during the time when the
+                        // shared transition is active (i.e.
+                        // SharedTransitionScope#isTransitionActive).
+                        // The duration can be customize via `renderInOverlay` parameter.
+                        .renderInSharedTransitionScopeOverlay(
+                            // zIndexInOverlay by default is 0f for this modifier and for shared
+                            // elements. By overwriting zIndexInOverlay to 1f, we can ensure this
+                            // FAB is rendered on top of the shared elements.
+                            zIndexInOverlay = 1f
+                        ),
                 onClick = {}
             ) {
                 Icon(Icons.Default.Favorite, contentDescription = "favorite")
@@ -368,8 +346,7 @@
             painterResource(id = R.drawable.yt_profile),
             contentDescription = "cute cat",
             contentScale = ContentScale.FillHeight,
-            modifier = modifier
-                .clip(shape = RoundedCornerShape(10))
+            modifier = modifier.clip(shape = RoundedCornerShape(10))
         )
     }
 
@@ -377,26 +354,21 @@
     // requirement for the key is that it should be the same for shared elements that you intend
     // to match. Here we use the image resource id as the key.
     val sharedElementKey = R.drawable.yt_profile
-    var showLargeImage by remember {
-        mutableStateOf(true)
-    }
+    var showLargeImage by remember { mutableStateOf(true) }
 
     // First, we need to create a SharedTransitionLayout, this Layout will provide the coordinator
     // space for shared element position animation, as well as an overlay for shared elements to
     // render in. Children content in this Layout will be able to create shared element transition
     // using the receiver scope: SharedTransitionScope
     SharedTransitionLayout(
-        Modifier
-            .clickable { showLargeImage = !showLargeImage }
-            .fillMaxSize()
-            .padding(10.dp)) {
+        Modifier.clickable { showLargeImage = !showLargeImage }.fillMaxSize().padding(10.dp)
+    ) {
         // In the SharedTransitionLayout, we will be able to access the receiver scope (i.e.
         // SharedTransitionScope) in order to create shared element transition.
         AnimatedContent(targetState = showLargeImage) { showLargeImageMode ->
             if (showLargeImageMode) {
                 Cat(
-                    Modifier
-                        .fillMaxSize()
+                    Modifier.fillMaxSize()
                         .aspectRatio(1f)
                         // Creating a shared element. Note that this modifier is *after*
                         // the size modifier and aspectRatio modifier, because those size specs
@@ -415,23 +387,23 @@
                     // Prefer Modifier.sharedBounds for text, unless the texts in both initial
                     // content and target content are exactly the same (i.e. same
                     // size/font/color)
-                    modifier = Modifier
-                        .fillMaxWidth()
-                        // IMPORTANT: Prefer using wrapContentWidth/wrapContentSize over textAlign
-                        // for shared text transition. This allows the layout system sees actual
-                        // position and size of the text to facilitate bounds animation.
-                        .wrapContentWidth(Alignment.CenterHorizontally)
-                        .sharedBounds(
-                            rememberSharedContentState(key = "text"),
-                            this@AnimatedContent
-                        )
+                    modifier =
+                        Modifier.fillMaxWidth()
+                            // IMPORTANT: Prefer using wrapContentWidth/wrapContentSize over
+                            // textAlign
+                            // for shared text transition. This allows the layout system sees actual
+                            // position and size of the text to facilitate bounds animation.
+                            .wrapContentWidth(Alignment.CenterHorizontally)
+                            .sharedBounds(
+                                rememberSharedContentState(key = "text"),
+                                this@AnimatedContent
+                            )
                 )
             } else {
                 Column {
                     Row(verticalAlignment = Alignment.CenterVertically) {
                         Cat(
-                            Modifier
-                                .size(100.dp)
+                            Modifier.size(100.dp)
                                 // Creating another shared element with the same key.
                                 // Note that this modifier is *after* the size modifier,
                                 // The size changes between these two shared elements, i.e. the size
@@ -449,27 +421,28 @@
                             // Prefer Modifier.sharedBounds for text, unless the texts in both
                             // initial content and target content are exactly the same (i.e. same
                             // size/font/color)
-                            modifier = Modifier
-                                // The modifier that is not a part of the shared content, but rather
-                                // for positioning and sizes should be on the *left* side of
-                                // sharedBounds/sharedElement.
-                                .padding(start = 20.dp)
-                                .sharedBounds(
-                                // Here we use a string-based key, in contrast to the key above.
-                                rememberSharedContentState(key = "text"),
-                                this@AnimatedContent
-                            )
+                            modifier =
+                                Modifier
+                                    // The modifier that is not a part of the shared content, but
+                                    // rather
+                                    // for positioning and sizes should be on the *left* side of
+                                    // sharedBounds/sharedElement.
+                                    .padding(start = 20.dp)
+                                    .sharedBounds(
+                                        // Here we use a string-based key, in contrast to the key
+                                        // above.
+                                        rememberSharedContentState(key = "text"),
+                                        this@AnimatedContent
+                                    )
                         )
                     }
                     Box(
-                        Modifier
-                            .fillMaxWidth()
+                        Modifier.fillMaxWidth()
                             .height(100.dp)
                             .background(Color(0xffffcc5c), RoundedCornerShape(5.dp))
                     )
                     Box(
-                        Modifier
-                            .fillMaxWidth()
+                        Modifier.fillMaxWidth()
                             .height(100.dp)
                             .background(Color(0xff2a9d84), RoundedCornerShape(5.dp))
                     )
diff --git a/compose/animation/animation/samples/src/main/java/androidx/compose/animation/samples/TransitionSamples.kt b/compose/animation/animation/samples/src/main/java/androidx/compose/animation/samples/TransitionSamples.kt
index 7f71599..2ba4290 100644
--- a/compose/animation/animation/samples/src/main/java/androidx/compose/animation/samples/TransitionSamples.kt
+++ b/compose/animation/animation/samples/src/main/java/androidx/compose/animation/samples/TransitionSamples.kt
@@ -53,7 +53,10 @@
 import androidx.compose.ui.input.pointer.pointerInput
 import androidx.compose.ui.unit.dp
 
-private enum class ComponentState { Pressed, Released }
+private enum class ComponentState {
+    Pressed,
+    Released
+}
 
 @Sampled
 @Composable
@@ -61,15 +64,16 @@
     // enum class ComponentState { Pressed, Released }
     var useRed by remember { mutableStateOf(false) }
     var toState by remember { mutableStateOf(ComponentState.Released) }
-    val modifier = Modifier.pointerInput(Unit) {
-        detectTapGestures(
-            onPress = {
-                toState = ComponentState.Pressed
-                tryAwaitRelease()
-                toState = ComponentState.Released
-            }
-        )
-    }
+    val modifier =
+        Modifier.pointerInput(Unit) {
+            detectTapGestures(
+                onPress = {
+                    toState = ComponentState.Pressed
+                    tryAwaitRelease()
+                    toState = ComponentState.Released
+                }
+            )
+        }
 
     // Defines a transition of `ComponentState`, and updates the transition when the provided
     // [targetState] changes. The tran
@@ -78,40 +82,42 @@
     val transition: Transition<ComponentState> = updateTransition(targetState = toState)
     // Defines a float animation as a child animation the transition. The current animation value
     // can be read from the returned State<Float>.
-    val scale: Float by transition.animateFloat(
-        // Defines a transition spec that uses the same low-stiffness spring for *all*
-        // transitions of this float, no matter what the target is.
-        transitionSpec = { spring(stiffness = 50f) }
-    ) { state ->
-        // This code block declares a mapping from state to value.
-        if (state == ComponentState.Pressed) 3f else 1f
-    }
+    val scale: Float by
+        transition.animateFloat(
+            // Defines a transition spec that uses the same low-stiffness spring for *all*
+            // transitions of this float, no matter what the target is.
+            transitionSpec = { spring(stiffness = 50f) }
+        ) { state ->
+            // This code block declares a mapping from state to value.
+            if (state == ComponentState.Pressed) 3f else 1f
+        }
 
     // Defines a color animation as a child animation of the transition.
-    val color: Color by transition.animateColor(
-        transitionSpec = {
-            when {
-                ComponentState.Pressed isTransitioningTo ComponentState.Released ->
-                    // Uses spring for the transition going from pressed to released
-                    spring(stiffness = 50f)
-                else ->
-                    // Uses tween for all the other transitions. (In this case there is
-                    // only one other transition. i.e. released -> pressed.)
-                    tween(durationMillis = 500)
+    val color: Color by
+        transition.animateColor(
+            transitionSpec = {
+                when {
+                    ComponentState.Pressed isTransitioningTo ComponentState.Released ->
+                        // Uses spring for the transition going from pressed to released
+                        spring(stiffness = 50f)
+                    else ->
+                        // Uses tween for all the other transitions. (In this case there is
+                        // only one other transition. i.e. released -> pressed.)
+                        tween(durationMillis = 500)
+                }
+            }
+        ) { state ->
+            when (state) {
+                // Similar to the float animation, we need to declare the target values
+                // for each state. In this code block we can access theme colors.
+                ComponentState.Pressed -> MaterialTheme.colors.primary
+                // We can also have the target value depend on other mutableStates,
+                // such as `useRed` here. Whenever the target value changes, transition
+                // will automatically animate to the new value even if it has already
+                // arrived at its target state.
+                ComponentState.Released -> if (useRed) Color.Red else MaterialTheme.colors.secondary
             }
         }
-    ) { state ->
-        when (state) {
-            // Similar to the float animation, we need to declare the target values
-            // for each state. In this code block we can access theme colors.
-            ComponentState.Pressed -> MaterialTheme.colors.primary
-            // We can also have the target value depend on other mutableStates,
-            // such as `useRed` here. Whenever the target value changes, transition
-            // will automatically animate to the new value even if it has already
-            // arrived at its target state.
-            ComponentState.Released -> if (useRed) Color.Red else MaterialTheme.colors.secondary
-        }
-    }
     Column {
         Button(
             modifier = Modifier.padding(10.dp).align(Alignment.CenterHorizontally),
@@ -120,8 +126,11 @@
             Text("Change Color")
         }
         Box(
-            modifier.fillMaxSize().wrapContentSize(Alignment.Center)
-                .size((100 * scale).dp).background(color)
+            modifier
+                .fillMaxSize()
+                .wrapContentSize(Alignment.Center)
+                .size((100 * scale).dp)
+                .background(color)
         )
     }
 }
@@ -135,43 +144,47 @@
         val infiniteTransition = rememberInfiniteTransition()
 
         // Creates a child animation of float type as a part of the [InfiniteTransition].
-        val scale by infiniteTransition.animateFloat(
-            initialValue = 3f,
-            targetValue = 6f,
-            animationSpec = infiniteRepeatable(
-                // Infinitely repeating a 1000ms tween animation using default easing curve.
-                animation = tween(1000),
-                // After each iteration of the animation (i.e. every 1000ms), the animation will
-                // start again from the [initialValue] defined above.
-                // This is the default [RepeatMode]. See [RepeatMode.Reverse] below for an
-                // alternative.
-                repeatMode = RepeatMode.Restart
+        val scale by
+            infiniteTransition.animateFloat(
+                initialValue = 3f,
+                targetValue = 6f,
+                animationSpec =
+                    infiniteRepeatable(
+                        // Infinitely repeating a 1000ms tween animation using default easing curve.
+                        animation = tween(1000),
+                        // After each iteration of the animation (i.e. every 1000ms), the animation
+                        // will
+                        // start again from the [initialValue] defined above.
+                        // This is the default [RepeatMode]. See [RepeatMode.Reverse] below for an
+                        // alternative.
+                        repeatMode = RepeatMode.Restart
+                    )
             )
-        )
 
         // Creates a Color animation as a part of the [InfiniteTransition].
-        val color by infiniteTransition.animateColor(
-            initialValue = Color.Red,
-            targetValue = Color(0xff800000), // Dark Red
-            animationSpec = infiniteRepeatable(
-                // Linearly interpolate between initialValue and targetValue every 1000ms.
-                animation = tween(1000, easing = LinearEasing),
-                // Once [TargetValue] is reached, starts the next iteration in reverse (i.e. from
-                // TargetValue to InitialValue). Then again from InitialValue to TargetValue. This
-                // [RepeatMode] ensures that the animation value is *always continuous*.
-                repeatMode = RepeatMode.Reverse
+        val color by
+            infiniteTransition.animateColor(
+                initialValue = Color.Red,
+                targetValue = Color(0xff800000), // Dark Red
+                animationSpec =
+                    infiniteRepeatable(
+                        // Linearly interpolate between initialValue and targetValue every 1000ms.
+                        animation = tween(1000, easing = LinearEasing),
+                        // Once [TargetValue] is reached, starts the next iteration in reverse (i.e.
+                        // from
+                        // TargetValue to InitialValue). Then again from InitialValue to
+                        // TargetValue. This
+                        // [RepeatMode] ensures that the animation value is *always continuous*.
+                        repeatMode = RepeatMode.Reverse
+                    )
             )
-        )
 
         Box(Modifier.fillMaxSize()) {
             Icon(
                 Icons.Filled.Favorite,
                 contentDescription = null,
-                modifier = Modifier.align(Alignment.Center)
-                    .graphicsLayer(
-                        scaleX = scale,
-                        scaleY = scale
-                    ),
+                modifier =
+                    Modifier.align(Alignment.Center).graphicsLayer(scaleX = scale, scaleY = scale),
                 tint = color
             )
         }
diff --git a/compose/animation/animation/src/androidInstrumentedTest/kotlin/androidx/compose/animation/AnimatedContentTest.kt b/compose/animation/animation/src/androidInstrumentedTest/kotlin/androidx/compose/animation/AnimatedContentTest.kt
index 4cae1c4..6acefef 100644
--- a/compose/animation/animation/src/androidInstrumentedTest/kotlin/androidx/compose/animation/AnimatedContentTest.kt
+++ b/compose/animation/animation/src/androidInstrumentedTest/kotlin/androidx/compose/animation/AnimatedContentTest.kt
@@ -88,8 +88,7 @@
 @LargeTest
 class AnimatedContentTest {
 
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
     @OptIn(InternalAnimationApi::class)
     @Test
@@ -108,19 +107,23 @@
                     testModifier,
                     transitionSpec = {
                         if (true isTransitioningTo false) {
-                            fadeIn() togetherWith fadeOut() using
+                            fadeIn() togetherWith
+                                fadeOut() using
                                 SizeTransform { initialSize, targetSize ->
                                     keyframes {
                                         durationMillis = 320
-                                        IntSize(targetSize.width, initialSize.height) at 160 using
+                                        IntSize(targetSize.width, initialSize.height) at
+                                            160 using
                                             LinearEasing
                                         targetSize at 320 using LinearEasing
                                     }
                                 }
                         } else {
-                            fadeIn() togetherWith fadeOut() using SizeTransform { _, _ ->
-                                tween(durationMillis = 80, easing = LinearEasing)
-                            }
+                            fadeIn() togetherWith
+                                fadeOut() using
+                                SizeTransform { _, _ ->
+                                    tween(durationMillis = 80, easing = LinearEasing)
+                                }
                         }
                     }
                 ) {
@@ -187,7 +190,8 @@
                 transition.AnimatedContent(
                     testModifier,
                     transitionSpec = {
-                        EnterTransition.None togetherWith ExitTransition.None using
+                        EnterTransition.None togetherWith
+                            ExitTransition.None using
                             SizeTransform { _, _ ->
                                 tween(durationMillis = 160, easing = LinearEasing)
                             }
@@ -244,10 +248,14 @@
         var offset2 by mutableStateOf(Offset.Zero)
         var playTimeMillis by mutableStateOf(0)
         val transitionState = MutableTransitionState(true)
-        val alignment = listOf(
-            Alignment.TopStart, Alignment.BottomStart, Alignment.Center,
-            Alignment.BottomEnd, Alignment.TopEnd
-        )
+        val alignment =
+            listOf(
+                Alignment.TopStart,
+                Alignment.BottomStart,
+                Alignment.Center,
+                Alignment.BottomEnd,
+                Alignment.TopEnd
+            )
         var contentAlignment by mutableStateOf(Alignment.TopStart)
         rule.setContent {
             CompositionLocalProvider(LocalDensity provides Density(1f)) {
@@ -257,28 +265,24 @@
                     testModifier,
                     contentAlignment = contentAlignment,
                     transitionSpec = {
-                        fadeIn(animationSpec = tween(durationMillis = 80)) togetherWith fadeOut(
-                            animationSpec = tween(durationMillis = 80)
-                        ) using SizeTransform { _, _ ->
-                            tween(durationMillis = 80, easing = LinearEasing)
-                        }
+                        fadeIn(animationSpec = tween(durationMillis = 80)) togetherWith
+                            fadeOut(animationSpec = tween(durationMillis = 80)) using
+                            SizeTransform { _, _ ->
+                                tween(durationMillis = 80, easing = LinearEasing)
+                            }
                     }
                 ) {
                     if (it) {
                         Box(
-                            modifier = Modifier
-                                .onGloballyPositioned {
-                                    offset1 = it.positionInRoot()
-                                }
-                                .size(size1.width.dp, size1.height.dp)
+                            modifier =
+                                Modifier.onGloballyPositioned { offset1 = it.positionInRoot() }
+                                    .size(size1.width.dp, size1.height.dp)
                         )
                     } else {
                         Box(
-                            modifier = Modifier
-                                .onGloballyPositioned {
-                                    offset2 = it.positionInRoot()
-                                }
-                                .size(size2.width.dp, size2.height.dp)
+                            modifier =
+                                Modifier.onGloballyPositioned { offset2 = it.positionInRoot() }
+                                    .size(size2.width.dp, size2.height.dp)
                         )
                     }
                 }
@@ -380,14 +384,17 @@
                     transitionSpec = {
                         if (true isTransitioningTo false) {
                             slideIntoContainer(
-                                AnimatedContentTransitionScope.SlideDirection.Start, animSpec
+                                AnimatedContentTransitionScope.SlideDirection.Start,
+                                animSpec
                             ) togetherWith
                                 slideOutOfContainer(
-                                    AnimatedContentTransitionScope.SlideDirection.Start, animSpec
+                                    AnimatedContentTransitionScope.SlideDirection.Start,
+                                    animSpec
                                 )
                         } else {
                             slideIntoContainer(
-                                AnimatedContentTransitionScope.SlideDirection.End, animSpec
+                                AnimatedContentTransitionScope.SlideDirection.End,
+                                animSpec
                             ) togetherWith
                                 slideOutOfContainer(
                                     towards = AnimatedContentTransitionScope.SlideDirection.End,
@@ -401,11 +408,7 @@
                     } else {
                         falseTransition = transition
                     }
-                    Box(
-                        Modifier
-                            .requiredSize(200.dp)
-                            .testTag(target.toString())
-                    )
+                    Box(Modifier.requiredSize(200.dp).testTag(target.toString()))
                 }
             }
         }
@@ -465,25 +468,24 @@
         var targetPosition: Offset? = null
         rule.setContent {
             CompositionLocalProvider(LocalDensity provides Density(1f)) {
-                AnimatedContent(targetState,
-                    Modifier.onGloballyPositioned {
-                        targetPosition = it.positionInRoot()
-                    },
+                AnimatedContent(
+                    targetState,
+                    Modifier.onGloballyPositioned { targetPosition = it.positionInRoot() },
                     transitionSpec = {
                         slideInHorizontally { -200 } togetherWith
                             slideOutHorizontally(snap()) { 200 } + fadeOut(tween(200))
                     },
-                    contentKey = { it > 3 }) { target ->
+                    contentKey = { it > 3 }
+                ) { target ->
                     Box(
-                        Modifier
-                            .requiredSize(200.dp)
-                            .onGloballyPositioned {
-                                if (target == targetState) {
-                                    actualIncomingPosition = it.localToRoot(Offset.Zero)
-                                } else {
-                                    actualOutgoingPosition = it.localToRoot(Offset.Zero)
-                                }
-                            })
+                        Modifier.requiredSize(200.dp).onGloballyPositioned {
+                            if (target == targetState) {
+                                actualIncomingPosition = it.localToRoot(Offset.Zero)
+                            } else {
+                                actualOutgoingPosition = it.localToRoot(Offset.Zero)
+                            }
+                        }
+                    )
                 }
             }
         }
@@ -515,46 +517,46 @@
         rule.setContent {
             LookaheadScope {
                 Scaffold(
-                    Modifier
-                        .fillMaxSize()
-                        .testTag(""),
+                    Modifier.fillMaxSize().testTag(""),
                     topBar = {},
                     floatingActionButton = {}
                 ) {
                     Surface() {
                         SubcomposeLayout(Modifier.fillMaxWidth()) { constraints ->
                             val tabRowWidth = constraints.maxWidth
-                            val tabMeasurables = subcompose("Tabs") {
-                                repeat(15) {
-                                    Text(it.toString(), Modifier.width(100.dp))
+                            val tabMeasurables =
+                                subcompose("Tabs") {
+                                    repeat(15) { Text(it.toString(), Modifier.width(100.dp)) }
                                 }
-                            }
                             val tabCount = tabMeasurables.size
                             var tabWidth = 0
                             if (tabCount > 0) {
                                 tabWidth = (tabRowWidth / tabCount)
                             }
-                            val tabRowHeight = tabMeasurables.fold(initial = 0) { max, curr ->
-                                maxOf(curr.maxIntrinsicHeight(tabWidth), max)
-                            }
+                            val tabRowHeight =
+                                tabMeasurables.fold(initial = 0) { max, curr ->
+                                    maxOf(curr.maxIntrinsicHeight(tabWidth), max)
+                                }
 
-                            val tabPlaceables = tabMeasurables.map {
-                                it.measure(
-                                    constraints.copy(
-                                        minWidth = tabWidth,
-                                        maxWidth = tabWidth,
-                                        minHeight = tabRowHeight,
-                                        maxHeight = tabRowHeight,
+                            val tabPlaceables =
+                                tabMeasurables.map {
+                                    it.measure(
+                                        constraints.copy(
+                                            minWidth = tabWidth,
+                                            maxWidth = tabWidth,
+                                            minHeight = tabRowHeight,
+                                            maxHeight = tabRowHeight,
+                                        )
                                     )
-                                )
-                            }
+                                }
 
                             repeat(tabCount) { index ->
                                 var contentWidth =
                                     minOf(
-                                        tabMeasurables[index].maxIntrinsicWidth(tabRowHeight),
-                                        tabWidth
-                                    ).toDp()
+                                            tabMeasurables[index].maxIntrinsicWidth(tabRowHeight),
+                                            tabWidth
+                                        )
+                                        .toDp()
                                 contentWidth -= 32.dp
                             }
 
@@ -566,13 +568,7 @@
                         }
                     }
                 }
-                Box(
-                    Modifier
-                        .fillMaxSize()
-                        .background(Color.Blue)
-                ) {
-                    Text(text = "test")
-                }
+                Box(Modifier.fillMaxSize().background(Color.Blue)) { Text(text = "test") }
             }
         }
         rule.waitForIdle()
@@ -588,38 +584,24 @@
             AnimatedContent(target) {
                 if (it) {
                     Scaffold(
-                        Modifier
-                            .fillMaxSize()
-                            .testTag(""),
+                        Modifier.fillMaxSize().testTag(""),
                         topBar = {},
                         floatingActionButton = {}
                     ) {
                         TabRow(selectedTabIndex = 0) {
-                            repeat(15) {
-                                Text(it.toString(), Modifier.width(100.dp))
-                            }
+                            repeat(15) { Text(it.toString(), Modifier.width(100.dp)) }
                         }
                     }
-                    Box(
-                        Modifier
-                            .fillMaxSize()
-                            .background(Color.Blue)
-                    ) {
-                        Text(text = "test")
-                    }
+                    Box(Modifier.fillMaxSize().background(Color.Blue)) { Text(text = "test") }
                 } else {
                     Box(Modifier.size(200.dp))
                 }
             }
         }
 
-        rule.runOnIdle {
-            target = !target
-        }
+        rule.runOnIdle { target = !target }
         rule.waitForIdle()
-        rule.runOnIdle {
-            target = !target
-        }
+        rule.runOnIdle { target = !target }
         rule.waitForIdle()
     }
 
@@ -634,9 +616,7 @@
                 if (it <= 2) {
                     holder.SaveableStateProvider(11) {
                         var count by rememberSaveable { mutableStateOf(0) }
-                        LaunchedEffect(Unit) {
-                            list.add(++count)
-                        }
+                        LaunchedEffect(Unit) { list.add(++count) }
                     }
                 }
                 Box(Modifier.requiredSize(200.dp))
@@ -652,9 +632,7 @@
                     // This state change should now cause an animation
                     targetState = 3
                 }
-                withFrameMillis {
-                    assertTrue(transition.isRunning)
-                }
+                withFrameMillis { assertTrue(transition.isRunning) }
             }
         }
         rule.waitForIdle()
@@ -678,31 +656,31 @@
         var flag by mutableStateOf(true)
         var rootCoords: LayoutCoordinates? = null
         rule.setContent {
-            AnimatedContent(targetState = flag,
+            AnimatedContent(
+                targetState = flag,
                 modifier = Modifier.onGloballyPositioned { rootCoords = it },
                 transitionSpec = {
                     if (targetState) {
-                        fadeIn(tween(2000)) togetherWith slideOut(
-                            tween(2000)
-                        ) { fullSize ->
-                            IntOffset(0, fullSize.height / 2)
-                        } + fadeOut(
-                            tween(2000)
-                        )
+                        fadeIn(tween(2000)) togetherWith
+                            slideOut(tween(2000)) { fullSize ->
+                                IntOffset(0, fullSize.height / 2)
+                            } + fadeOut(tween(2000))
                     } else {
                         fadeIn(tween(2000)) togetherWith fadeOut(tween(2000))
                     }
-                }) { state ->
+                }
+            ) { state ->
                 if (state) {
-                    Box(modifier = Modifier
-                        .onGloballyPositioned {
-                            assertEquals(
-                                Offset.Zero,
-                                rootCoords!!.localPositionOf(it, Offset.Zero)
-                            )
-                        }
-                        .fillMaxSize()
-                        .background(Color.Green)
+                    Box(
+                        modifier =
+                            Modifier.onGloballyPositioned {
+                                    assertEquals(
+                                        Offset.Zero,
+                                        rootCoords!!.localPositionOf(it, Offset.Zero)
+                                    )
+                                }
+                                .fillMaxSize()
+                                .background(Color.Green)
                     )
                 } else {
                     LaunchedEffect(key1 = Unit) {
@@ -712,22 +690,21 @@
                         // Interrupt
                         flag = true
                     }
-                    Box(modifier = Modifier
-                        .onGloballyPositioned {
-                            assertEquals(
-                                Offset.Zero,
-                                rootCoords!!.localPositionOf(it, Offset.Zero)
-                            )
-                        }
-                        .fillMaxSize()
-                        .background(Color.Red)
+                    Box(
+                        modifier =
+                            Modifier.onGloballyPositioned {
+                                    assertEquals(
+                                        Offset.Zero,
+                                        rootCoords!!.localPositionOf(it, Offset.Zero)
+                                    )
+                                }
+                                .fillMaxSize()
+                                .background(Color.Red)
                     )
                 }
             }
         }
-        rule.runOnIdle {
-            flag = false
-        }
+        rule.runOnIdle { flag = false }
     }
 
     @OptIn(ExperimentalAnimationApi::class)
@@ -746,11 +723,7 @@
             ) {
                 if (it) {
                     Box(Modifier.size(200.dp)) {
-                        DisposableEffect(key1 = Unit) {
-                            onDispose {
-                                box1Disposed = true
-                            }
-                        }
+                        DisposableEffect(key1 = Unit) { onDispose { box1Disposed = true } }
                     }
                 } else {
                     Box(Modifier.size(200.dp)) {
@@ -764,9 +737,7 @@
 
         rule.waitForIdle()
         rule.mainClock.autoAdvance = false
-        rule.runOnIdle {
-            target = !target
-        }
+        rule.runOnIdle { target = !target }
 
         rule.waitForIdle()
         repeat(10) {
@@ -798,18 +769,20 @@
                     if (false isTransitioningTo true) {
                         ContentTransform(
                             targetContentEnter = EnterTransition.None,
-                            initialContentExit = slideOutOfContainer(
-                                AnimatedContentTransitionScope.SlideDirection.Start,
-                                animationSpec = tween(durationMillis = 500)
-                            ),
+                            initialContentExit =
+                                slideOutOfContainer(
+                                    AnimatedContentTransitionScope.SlideDirection.Start,
+                                    animationSpec = tween(durationMillis = 500)
+                                ),
                             targetContentZIndex = -1.0f,
                             sizeTransform = SizeTransform(clip = false)
                         )
                     } else {
                         ContentTransform(
-                            targetContentEnter = slideIntoContainer(
-                                AnimatedContentTransitionScope.SlideDirection.End
-                            ),
+                            targetContentEnter =
+                                slideIntoContainer(
+                                    AnimatedContentTransitionScope.SlideDirection.End
+                                ),
                             initialContentExit = ExitTransition.KeepUntilTransitionsFinished,
                             targetContentZIndex = 0.0f,
                             sizeTransform = SizeTransform(clip = false)
@@ -819,23 +792,21 @@
                 modifier = Modifier.fillMaxSize()
             ) { flag ->
                 Spacer(
-                    modifier = Modifier
-                        .wrapContentSize(Alignment.Center)
-                        .size(256.dp)
-                        .onGloballyPositioned {
-                            if (flag) {
-                                fixedPosition = it.positionInRoot()
-                            } else {
-                                slidePosition = it.positionInRoot()
+                    modifier =
+                        Modifier.wrapContentSize(Alignment.Center)
+                            .size(256.dp)
+                            .onGloballyPositioned {
+                                if (flag) {
+                                    fixedPosition = it.positionInRoot()
+                                } else {
+                                    slidePosition = it.positionInRoot()
+                                }
                             }
-                        }
                 )
             }
         }
 
-        rule.runOnIdle {
-            flag = true
-        }
+        rule.runOnIdle { flag = true }
         rule.waitUntil { fixedPosition != null }
         val initialFixedPosition = fixedPosition
         // Advance 10 frames
@@ -870,18 +841,12 @@
                 transitionSpec = {
                     fadeIn(tween(160)) togetherWith
                         fadeOut(tween(5)) + ExitTransition.KeepUntilTransitionsFinished using
-                        SizeTransform { _, _ ->
-                            tween(300)
-                        }
+                        SizeTransform { _, _ -> tween(300) }
                 }
             ) {
                 if (it) {
                     Box(Modifier.size(200.dp)) {
-                        DisposableEffect(key1 = Unit) {
-                            onDispose {
-                                box1Disposed = true
-                            }
-                        }
+                        DisposableEffect(key1 = Unit) { onDispose { box1Disposed = true } }
                     }
                 } else {
                     Box(Modifier.size(400.dp)) {
@@ -895,9 +860,7 @@
 
         rule.waitForIdle()
         rule.mainClock.autoAdvance = false
-        rule.runOnIdle {
-            target = !target
-        }
+        rule.runOnIdle { target = !target }
 
         rule.waitForIdle()
         rule.mainClock.advanceTimeByFrame()
@@ -952,13 +915,17 @@
                         transition.AnimatedContent(
                             transitionSpec = {
                                 if (true isTransitioningTo false) {
-                                    fadeIn() togetherWith fadeOut() using SizeTransform { _, _ ->
-                                        tween(durationMillis = 80, easing = LinearEasing)
-                                    }
+                                    fadeIn() togetherWith
+                                        fadeOut() using
+                                        SizeTransform { _, _ ->
+                                            tween(durationMillis = 80, easing = LinearEasing)
+                                        }
                                 } else {
-                                    fadeIn() togetherWith fadeOut() using SizeTransform { _, _ ->
-                                        tween(durationMillis = 80, easing = LinearEasing)
-                                    }
+                                    fadeIn() togetherWith
+                                        fadeOut() using
+                                        SizeTransform { _, _ ->
+                                            tween(durationMillis = 80, easing = LinearEasing)
+                                        }
                                 }
                             },
                             contentAlignment = Alignment.Center
@@ -966,32 +933,33 @@
                             if (it) {
                                 Box(modifier = Modifier.size(size = size1.dp))
                             } else {
-                                Box(modifier = Modifier
-                                    .layout { m, c ->
-                                        m
-                                            .measure(c)
-                                            .run {
-                                                layout(width, height) {
-                                                    if (isLookingAhead) {
-                                                        with(this@LookaheadScope) {
-                                                            lookaheadPosition =
+                                Box(
+                                    modifier =
+                                        Modifier.layout { m, c ->
+                                                m.measure(c).run {
+                                                    layout(width, height) {
+                                                        if (isLookingAhead) {
+                                                            with(this@LookaheadScope) {
+                                                                lookaheadPosition =
+                                                                    lookaheadScopeCoordinates
+                                                                        .localLookaheadPositionOf(
+                                                                            coordinates!!
+                                                                        )
+                                                            }
+                                                        } else {
+                                                            approachPosition =
                                                                 lookaheadScopeCoordinates
-                                                                    .localLookaheadPositionOf(
-                                                                        coordinates!!
+                                                                    .localPositionOf(
+                                                                        coordinates!!,
+                                                                        Offset.Zero
                                                                     )
                                                         }
-                                                    } else {
-                                                        approachPosition = lookaheadScopeCoordinates
-                                                            .localPositionOf(
-                                                                coordinates!!,
-                                                                Offset.Zero
-                                                            )
+                                                        place(0, 0)
                                                     }
-                                                    place(0, 0)
                                                 }
                                             }
-                                    }
-                                    .size(size = size2.dp))
+                                            .size(size = size2.dp)
+                                )
                             }
                         }
                     }
@@ -1037,36 +1005,32 @@
                 ) {
                     if (it) {
                         Box(
-                            Modifier
-                                .layout { measurable, constraints ->
-                                    measurable
-                                        .measure(constraints)
-                                        .run {
-                                            layout(width, height) {
-                                                if (isLookingAhead) {
-                                                    lookaheadPosition1 = lookaheadScopeCoordinates
+                            Modifier.layout { measurable, constraints ->
+                                    measurable.measure(constraints).run {
+                                        layout(width, height) {
+                                            if (isLookingAhead) {
+                                                lookaheadPosition1 =
+                                                    lookaheadScopeCoordinates
                                                         .localLookaheadPositionOf(coordinates!!)
-                                                }
                                             }
                                         }
+                                    }
                                 }
                                 .fillMaxSize()
                                 .background(Color.Blue)
                         )
                     } else {
                         Box(
-                            Modifier
-                                .layout { measurable, constraints ->
-                                    measurable
-                                        .measure(constraints)
-                                        .run {
-                                            layout(width, height) {
-                                                if (isLookingAhead) {
-                                                    lookaheadPosition2 = lookaheadScopeCoordinates
+                            Modifier.layout { measurable, constraints ->
+                                    measurable.measure(constraints).run {
+                                        layout(width, height) {
+                                            if (isLookingAhead) {
+                                                lookaheadPosition2 =
+                                                    lookaheadScopeCoordinates
                                                         .localLookaheadPositionOf(coordinates!!)
-                                                }
                                             }
                                         }
+                                    }
                                 }
                                 .size(100.dp)
                                 .background(Color.Red)
@@ -1123,5 +1087,6 @@
     }
 
     @OptIn(InternalAnimationApi::class)
-    private val Transition<*>.playTimeMillis get() = (playTimeNanos / 1_000_000L).toInt()
+    private val Transition<*>.playTimeMillis
+        get() = (playTimeNanos / 1_000_000L).toInt()
 }
diff --git a/compose/animation/animation/src/androidInstrumentedTest/kotlin/androidx/compose/animation/AnimatedVisibilityTest.kt b/compose/animation/animation/src/androidInstrumentedTest/kotlin/androidx/compose/animation/AnimatedVisibilityTest.kt
index 9d40cbe..641ec06 100644
--- a/compose/animation/animation/src/androidInstrumentedTest/kotlin/androidx/compose/animation/AnimatedVisibilityTest.kt
+++ b/compose/animation/animation/src/androidInstrumentedTest/kotlin/androidx/compose/animation/AnimatedVisibilityTest.kt
@@ -72,8 +72,7 @@
 @OptIn(InternalAnimationApi::class)
 class AnimatedVisibilityTest {
 
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
     private val frameDuration = 16
 
@@ -88,39 +87,33 @@
         rule.setContent {
             CompositionLocalProvider(LocalDensity provides Density(1f)) {
                 AnimatedVisibility(
-                    visible, testModifier,
-                    enter = expandIn(
-                        tween(160, easing = LinearOutSlowInEasing),
-                        Alignment.BottomEnd
-                    ) { fullSize ->
-                        IntSize(fullSize.width / 4, fullSize.height / 2)
-                    },
-
-                    exit = shrinkOut(
-                        tween(160, easing = FastOutSlowInEasing),
-                        Alignment.CenterStart
-                    ) { fullSize -> IntSize(fullSize.width / 10, fullSize.height / 5) },
+                    visible,
+                    testModifier,
+                    enter =
+                        expandIn(tween(160, easing = LinearOutSlowInEasing), Alignment.BottomEnd) {
+                            fullSize ->
+                            IntSize(fullSize.width / 4, fullSize.height / 2)
+                        },
+                    exit =
+                        shrinkOut(
+                            tween(160, easing = FastOutSlowInEasing),
+                            Alignment.CenterStart
+                        ) { fullSize ->
+                            IntSize(fullSize.width / 10, fullSize.height / 5)
+                        },
                 ) {
                     Box(
-                        Modifier
-                            .requiredSize(100.dp, 100.dp)
-                            .onGloballyPositioned {
-                                offset = it.localToRoot(Offset.Zero)
-                            }
-                    ) {
-                        DisposableEffect(Unit) {
-                            onDispose {
-                                disposed = true
-                            }
+                        Modifier.requiredSize(100.dp, 100.dp).onGloballyPositioned {
+                            offset = it.localToRoot(Offset.Zero)
                         }
+                    ) {
+                        DisposableEffect(Unit) { onDispose { disposed = true } }
                     }
                 }
             }
         }
 
-        rule.runOnIdle {
-            visible = true
-        }
+        rule.runOnIdle { visible = true }
         rule.mainClock.advanceTimeByFrame()
         rule.mainClock.advanceTimeByFrame()
 
@@ -143,9 +136,7 @@
             rule.waitForIdle()
         }
 
-        rule.runOnIdle {
-            visible = false
-        }
+        rule.runOnIdle { visible = false }
         rule.mainClock.advanceTimeByFrame()
         rule.mainClock.advanceTimeByFrame()
 
@@ -171,9 +162,7 @@
         rule.mainClock.autoAdvance = false
 
         // Make it visible again, and test that it behaves the same as before
-        rule.runOnIdle {
-            visible = true
-        }
+        rule.runOnIdle { visible = true }
         rule.mainClock.advanceTimeByFrame()
         rule.mainClock.advanceTimeByFrame()
 
@@ -203,34 +192,29 @@
         rule.mainClock.autoAdvance = false
         rule.setContent {
             AnimatedVisibility(
-                visible, testModifier,
-                enter = slideIn(
-                    tween(160, easing = LinearOutSlowInEasing)
-                ) { fullSize -> IntOffset(fullSize.width / 4, -fullSize.height / 2) },
-                exit = slideOut(
-                    tween(160, easing = FastOutSlowInEasing)
-                ) { fullSize -> IntOffset(-fullSize.width / 10, fullSize.height / 5) },
+                visible,
+                testModifier,
+                enter =
+                    slideIn(tween(160, easing = LinearOutSlowInEasing)) { fullSize ->
+                        IntOffset(fullSize.width / 4, -fullSize.height / 2)
+                    },
+                exit =
+                    slideOut(tween(160, easing = FastOutSlowInEasing)) { fullSize ->
+                        IntOffset(-fullSize.width / 10, fullSize.height / 5)
+                    },
             ) {
                 Box(
-                    Modifier
-                        .requiredSize(100.dp, 100.dp)
-                        .onGloballyPositioned {
-                            offset = it.localToRoot(Offset.Zero)
-                        }
-                ) {
-                    DisposableEffect(Unit) {
-                        onDispose {
-                            disposed = true
-                        }
+                    Modifier.requiredSize(100.dp, 100.dp).onGloballyPositioned {
+                        offset = it.localToRoot(Offset.Zero)
                     }
+                ) {
+                    DisposableEffect(Unit) { onDispose { disposed = true } }
                 }
             }
             density = LocalDensity.current.density
         }
 
-        rule.runOnIdle {
-            visible = true
-        }
+        rule.runOnIdle { visible = true }
         rule.mainClock.advanceTimeByFrame()
         rule.mainClock.advanceTimeByFrame()
 
@@ -253,9 +237,7 @@
             rule.waitForIdle()
         }
 
-        rule.runOnIdle {
-            visible = false
-        }
+        rule.runOnIdle { visible = false }
         rule.mainClock.advanceTimeByFrame()
         rule.mainClock.advanceTimeByFrame()
 
@@ -281,9 +263,7 @@
         rule.mainClock.autoAdvance = false
 
         // Make it visible again, and test that it behaves the same as before
-        rule.runOnIdle {
-            visible = true
-        }
+        rule.runOnIdle { visible = true }
         rule.mainClock.advanceTimeByFrame()
         rule.mainClock.advanceTimeByFrame()
 
@@ -324,12 +304,8 @@
             assertEquals(60, testModifier.height)
             assertEquals(60, testModifier.width)
         }
-        rule.runOnIdle {
-            visible = false
-        }
-        rule.runOnIdle {
-            visible = true
-        }
+        rule.runOnIdle { visible = false }
+        rule.runOnIdle { visible = true }
         rule.runOnIdle {
             assertEquals(60, testModifier.height)
             assertEquals(60, testModifier.width)
@@ -355,22 +331,18 @@
                 enter = fadeIn(animationSpec = tween(500, easing = easing)),
                 exit = fadeOut(animationSpec = tween(300, easing = easingOut)),
             ) {
-                Box(
-                    modifier = Modifier
-                        .size(size = 20.dp)
-                        .background(Color.White)
-                )
+                Box(modifier = Modifier.size(size = 20.dp).background(Color.White))
                 LaunchedEffect(visible) {
                     var exit = false
                     val enterExit = transition
                     while (true) {
                         withFrameNanos {
                             if (enterExit.targetState == Visible) {
-                                alpha = enterExit.animations.firstOrNull {
-                                    it.label.contains("alpha", true)
-                                }?.value as Float
-                                val fraction =
-                                    (enterExit.playTimeNanos / 1_000_000) / 500f
+                                alpha =
+                                    enterExit.animations
+                                        .firstOrNull { it.label.contains("alpha", true) }
+                                        ?.value as Float
+                                val fraction = (enterExit.playTimeNanos / 1_000_000) / 500f
                                 if (enterExit.currentState != Visible) {
                                     assertEquals(easing.transform(fraction), alpha, 0.01f)
                                 } else {
@@ -380,17 +352,13 @@
                                     exit = true
                                 }
                             } else if (enterExit.targetState == PostExit) {
-                                alpha = enterExit.animations.firstOrNull {
-                                    it.label.contains("alpha", true)
-                                }?.value as Float
-                                val fraction =
-                                    (enterExit.playTimeNanos / 1_000_000) / 300f
+                                alpha =
+                                    enterExit.animations
+                                        .firstOrNull { it.label.contains("alpha", true) }
+                                        ?.value as Float
+                                val fraction = (enterExit.playTimeNanos / 1_000_000) / 300f
                                 if (enterExit.currentState != PostExit) {
-                                    assertEquals(
-                                        1f - easingOut.transform(fraction),
-                                        alpha,
-                                        0.01f
-                                    )
+                                    assertEquals(1f - easingOut.transform(fraction), alpha, 0.01f)
                                 } else {
                                     // When currentState = targetState, the playTime will be reset
                                     // to 0. So compare alpha against expected invisible value.
@@ -406,9 +374,7 @@
                 }
             }
         }
-        rule.runOnIdle {
-            visible = true
-        }
+        rule.runOnIdle { visible = true }
         rule.runOnIdle {
             // At this point fade in has finished, expect alpha = 1
             assertEquals(1f, alpha)
@@ -434,22 +400,18 @@
                 enter = scaleIn(animationSpec = tween(500, easing = easing)),
                 exit = scaleOut(animationSpec = tween(300, easing = easingOut)),
             ) {
-                Box(
-                    modifier = Modifier
-                        .size(size = 20.dp)
-                        .background(Color.White)
-                )
+                Box(modifier = Modifier.size(size = 20.dp).background(Color.White))
                 LaunchedEffect(visible) {
                     var exit = false
                     val enterExit = transition
                     while (true) {
                         withFrameNanos {
                             if (enterExit.targetState == Visible) {
-                                scale = enterExit.animations.firstOrNull {
-                                    it.label.contains("scale", true)
-                                }?.value as Float
-                                val fraction =
-                                    (enterExit.playTimeNanos / 1_000_000) / 500f
+                                scale =
+                                    enterExit.animations
+                                        .firstOrNull { it.label.contains("scale", true) }
+                                        ?.value as Float
+                                val fraction = (enterExit.playTimeNanos / 1_000_000) / 500f
                                 if (enterExit.currentState != Visible) {
                                     assertEquals(easing.transform(fraction), scale, 0.01f)
                                 } else {
@@ -459,17 +421,13 @@
                                     exit = true
                                 }
                             } else if (enterExit.targetState == PostExit) {
-                                scale = enterExit.animations.firstOrNull {
-                                    it.label.contains("scale", true)
-                                }?.value as Float
-                                val fraction =
-                                    (enterExit.playTimeNanos / 1_000_000) / 300f
+                                scale =
+                                    enterExit.animations
+                                        .firstOrNull { it.label.contains("scale", true) }
+                                        ?.value as Float
+                                val fraction = (enterExit.playTimeNanos / 1_000_000) / 300f
                                 if (enterExit.currentState != PostExit) {
-                                    assertEquals(
-                                        1f - easingOut.transform(fraction),
-                                        scale,
-                                        0.01f
-                                    )
+                                    assertEquals(1f - easingOut.transform(fraction), scale, 0.01f)
                                 } else {
                                     // When currentState = targetState, the playTime will be reset
                                     // to 0. So compare scale against expected invisible value.
@@ -485,9 +443,7 @@
                 }
             }
         }
-        rule.runOnIdle {
-            visible = true
-        }
+        rule.runOnIdle { visible = true }
         rule.runOnIdle {
             // At this point fade in has finished, expect alpha = 1
             assertEquals(1f, scale)
@@ -508,16 +464,13 @@
         rule.setContent {
             CompositionLocalProvider(LocalDensity provides Density(1f)) {
                 AnimatedVisibility(
-                    visible, testModifier,
+                    visible,
+                    testModifier,
                     enter = EnterTransition.None,
                     exit = ExitTransition.None
                 ) {
                     Box(Modifier.requiredSize(100.dp, 100.dp)) {
-                        DisposableEffect(Unit) {
-                            onDispose {
-                                disposed = true
-                            }
-                        }
+                        DisposableEffect(Unit) { onDispose { disposed = true } }
                     }
                 }
             }
@@ -538,12 +491,14 @@
         }
         rule.mainClock.advanceTimeByFrame()
         rule.mainClock.advanceTimeByFrame()
-        rule.runOnIdle {
-            assertTrue(disposed)
-        }
+        rule.runOnIdle { assertTrue(disposed) }
     }
 
-    private enum class TestState { State1, State2, State3 }
+    private enum class TestState {
+        State1,
+        State2,
+        State3
+    }
 
     @OptIn(ExperimentalAnimationApi::class)
     @Test
@@ -567,11 +522,7 @@
                     exit = shrinkOut(animationSpec = tween(100, easing = LinearEasing))
                 ) {
                     Box(Modifier.requiredSize(100.dp, 100.dp)) {
-                        DisposableEffect(Unit) {
-                            onDispose {
-                                disposed = true
-                            }
-                        }
+                        DisposableEffect(Unit) { onDispose { disposed = true } }
                     }
                 }
             }
@@ -599,9 +550,7 @@
         // When the hide animation finishes, it will never get measured with size 0 because the
         // animation will remove it from the composition instead.
         rule.onNodeWithTag("content").assertDoesNotExist()
-        rule.runOnIdle {
-            assertThat(disposed).isTrue()
-        }
+        rule.runOnIdle { assertThat(disposed).isTrue() }
     }
 
     @OptIn(ExperimentalAnimationApi::class)
@@ -611,17 +560,19 @@
         var rootTransition: Transition<Boolean>? = null
         rule.setContent {
             CompositionLocalProvider(LocalDensity provides Density(1f)) {
-                updateTransition(false, label = "test").apply {
-                    rootTransition = this
-                }.AnimatedVisibility(
-                    { it },
-                    enter = fadeIn(animationSpec = spec()) +
-                        slideInVertically(animationSpec = spec()) { 200 },
-                    exit = scaleOut(animationSpec = spec()) +
-                        shrinkHorizontally(animationSpec = spec())
-                ) {
-                    Box(Modifier.size(200.dp))
-                }
+                updateTransition(false, label = "test")
+                    .apply { rootTransition = this }
+                    .AnimatedVisibility(
+                        { it },
+                        enter =
+                            fadeIn(animationSpec = spec()) +
+                                slideInVertically(animationSpec = spec()) { 200 },
+                        exit =
+                            scaleOut(animationSpec = spec()) +
+                                shrinkHorizontally(animationSpec = spec())
+                    ) {
+                        Box(Modifier.size(200.dp))
+                    }
             }
         }
         rule.waitForIdle()
@@ -631,17 +582,23 @@
         while (true) {
             // Seeking the enter transition, and check alpha & slide
             transition.setPlaytimeAfterInitialAndTargetStateEstablished(
-                false, true, playTimeMs * 1_000_000L
+                false,
+                true,
+                playTimeMs * 1_000_000L
             )
             rule.waitForIdle()
             assertEquals(200_000_000L, transition.totalDurationNanos)
 
-            val alpha = transition.transitions[0].animations.firstOrNull {
-                it.label.contains("alpha")
-            }?.value
-            val slide = transition.transitions[0].animations.firstOrNull {
-                it.label.contains("slide")
-            }?.value
+            val alpha =
+                transition.transitions[0]
+                    .animations
+                    .firstOrNull { it.label.contains("alpha") }
+                    ?.value
+            val slide =
+                transition.transitions[0]
+                    .animations
+                    .firstOrNull { it.label.contains("slide") }
+                    ?.value
             if (playTimeMs * 1_000_000L > transition.totalDurationNanos) {
                 // Finished. Check some end condition
                 assertEquals(1f, alpha)
@@ -659,17 +616,23 @@
         while (true) {
             // Seeking the exit transition, and check scale & shrink
             transition.setPlaytimeAfterInitialAndTargetStateEstablished(
-                true, false, playTimeMs * 1_000_000L
+                true,
+                false,
+                playTimeMs * 1_000_000L
             )
             rule.waitForIdle()
             assertEquals(200_000_000L, transition.totalDurationNanos)
 
-            val scale = transition.transitions[0].animations.firstOrNull {
-                it.label.contains("scale")
-            }?.value
-            val shrink = transition.transitions[0].animations.firstOrNull {
-                it.label.contains("shrink")
-            }?.value
+            val scale =
+                transition.transitions[0]
+                    .animations
+                    .firstOrNull { it.label.contains("scale") }
+                    ?.value
+            val shrink =
+                transition.transitions[0]
+                    .animations
+                    .firstOrNull { it.label.contains("shrink") }
+                    ?.value
             if (playTimeMs * 1_000_000L > transition.totalDurationNanos) {
                 // Finished. Check some end condition
                 assertEquals(0f, scale)
@@ -691,17 +654,17 @@
         rule.setContent {
             CompositionLocalProvider(LocalDensity provides Density(1f)) {
                 LookaheadScope {
-                    Box(Modifier.layout { measurable, constraints ->
-                        measurable.measure(constraints).run {
-                            if (isLookingAhead) {
-                                lookaheadSizes.add(IntSize(width, height))
+                    Box(
+                        Modifier.layout { measurable, constraints ->
+                            measurable.measure(constraints).run {
+                                if (isLookingAhead) {
+                                    lookaheadSizes.add(IntSize(width, height))
+                                }
+                                layout(width, height) { place(0, 0) }
                             }
-                            layout(width, height) { place(0, 0) }
                         }
-                    }) {
-                        AnimatedVisibility(visible = visible) {
-                            Box(Modifier.size(200.dp, 100.dp))
-                        }
+                    ) {
+                        AnimatedVisibility(visible = visible) { Box(Modifier.size(200.dp, 100.dp)) }
                     }
                 }
             }
@@ -709,91 +672,84 @@
         rule.runOnIdle {
             assertTrue(visible)
             assertTrue(lookaheadSizes.isNotEmpty())
-            lookaheadSizes.forEach {
-                assertEquals(IntSize(200, 100), it)
-            }
+            lookaheadSizes.forEach { assertEquals(IntSize(200, 100), it) }
             lookaheadSizes.clear()
             visible = !visible
         }
         rule.runOnIdle {
             assertFalse(visible)
             assertTrue(lookaheadSizes.isNotEmpty())
-            lookaheadSizes.forEach {
-                assertEquals(IntSize.Zero, it)
-            }
+            lookaheadSizes.forEach { assertEquals(IntSize.Zero, it) }
             lookaheadSizes.clear()
         }
     }
 
     @Test
-    fun interruptedExitAnimationUsesCorrectTransition() = with(rule.density) {
-        var visible by mutableStateOf(false)
+    fun interruptedExitAnimationUsesCorrectTransition() =
+        with(rule.density) {
+            var visible by mutableStateOf(false)
 
-        val duration = 16 * 20 // 20 frames
-        val animation = { tween<IntOffset>(duration, easing = LinearEasing) }
+            val duration = 16 * 20 // 20 frames
+            val animation = { tween<IntOffset>(duration, easing = LinearEasing) }
 
-        val boxSizePx = 100
-        val enterDistance = 180
-        val undesiredExitDistance = -200
-        val expectedExitDistance = 200
+            val boxSizePx = 100
+            val enterDistance = 180
+            val undesiredExitDistance = -200
+            val expectedExitDistance = 200
 
-        var boxPosition = IntOffset.Zero
+            var boxPosition = IntOffset.Zero
 
-        rule.setContent {
-            AnimatedVisibility(
-                visible = visible,
-                enter = slideInHorizontally(animation()) { enterDistance },
-                exit = if (visible) {
-                    slideOutHorizontally(animation()) { undesiredExitDistance }
-                } else {
-                    // Only this transition should apply
-                    slideOutHorizontally(animation()) { expectedExitDistance }
-                }
-            ) {
-                Box(
-                    Modifier
-                        .requiredSize(boxSizePx.toDp())
-                        .background(Color.Red)
-                        .onGloballyPositioned {
-                            boxPosition = it
-                                .positionInRoot()
-                                .round()
+            rule.setContent {
+                AnimatedVisibility(
+                    visible = visible,
+                    enter = slideInHorizontally(animation()) { enterDistance },
+                    exit =
+                        if (visible) {
+                            slideOutHorizontally(animation()) { undesiredExitDistance }
+                        } else {
+                            // Only this transition should apply
+                            slideOutHorizontally(animation()) { expectedExitDistance }
                         }
-                )
+                ) {
+                    Box(
+                        Modifier.requiredSize(boxSizePx.toDp())
+                            .background(Color.Red)
+                            .onGloballyPositioned { boxPosition = it.positionInRoot().round() }
+                    )
+                }
             }
-        }
-        rule.waitForIdle()
-
-        rule.mainClock.autoAdvance = false
-        rule.runOnIdle {
-            visible = true
-        }
-        rule.mainClock.advanceTimeByFrame()
-        rule.mainClock.advanceTimeByFrame()
-
-        // Animate towards half of the transition and interrupt it by toggling the state
-        rule.mainClock.advanceTimeBy(duration / 2L)
-        rule.runOnIdle {
-            // Verify the position corresponds to half of the animation
-            assertEquals(IntOffset(enterDistance / 2, 0), boxPosition)
-            visible = false
-        }
-        val positionAtInterruption = boxPosition
-
-        // Run the animation for a few steps/frames to guarantee each frame is rendered, since a
-        // spring is used after interruption it's unknown how many more frames we need till the end
-        // of the animation, but we don't need to run the entire animation.
-        // We also need to run more than one step, since springs keep their initial momentum (in
-        // this case, momentum towards the left), so the next frame might still move the box towards
-        // the left.
-        repeat(3) {
-            rule.mainClock.advanceTimeByFrame()
             rule.waitForIdle()
-        }
 
-        // After a few frames, we can check the position of the box. If it used the expected
-        // transition, its current position should be offset to the right.
-        assertEquals(0, boxPosition.y)
-        assertThat(boxPosition.x).isGreaterThan(positionAtInterruption.x)
-    }
+            rule.mainClock.autoAdvance = false
+            rule.runOnIdle { visible = true }
+            rule.mainClock.advanceTimeByFrame()
+            rule.mainClock.advanceTimeByFrame()
+
+            // Animate towards half of the transition and interrupt it by toggling the state
+            rule.mainClock.advanceTimeBy(duration / 2L)
+            rule.runOnIdle {
+                // Verify the position corresponds to half of the animation
+                assertEquals(IntOffset(enterDistance / 2, 0), boxPosition)
+                visible = false
+            }
+            val positionAtInterruption = boxPosition
+
+            // Run the animation for a few steps/frames to guarantee each frame is rendered, since a
+            // spring is used after interruption it's unknown how many more frames we need till the
+            // end
+            // of the animation, but we don't need to run the entire animation.
+            // We also need to run more than one step, since springs keep their initial momentum (in
+            // this case, momentum towards the left), so the next frame might still move the box
+            // towards
+            // the left.
+            repeat(3) {
+                rule.mainClock.advanceTimeByFrame()
+                rule.waitForIdle()
+            }
+
+            // After a few frames, we can check the position of the box. If it used the expected
+            // transition, its current position should be offset to the right.
+            assertEquals(0, boxPosition.y)
+            assertThat(boxPosition.x).isGreaterThan(positionAtInterruption.x)
+        }
 }
diff --git a/compose/animation/animation/src/androidInstrumentedTest/kotlin/androidx/compose/animation/AnimationModifierTest.kt b/compose/animation/animation/src/androidInstrumentedTest/kotlin/androidx/compose/animation/AnimationModifierTest.kt
index 9d8173b..67294c8 100644
--- a/compose/animation/animation/src/androidInstrumentedTest/kotlin/androidx/compose/animation/AnimationModifierTest.kt
+++ b/compose/animation/animation/src/androidInstrumentedTest/kotlin/androidx/compose/animation/AnimationModifierTest.kt
@@ -75,8 +75,7 @@
 @LargeTest
 class AnimationModifierTest {
 
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
     @Before
     fun before() {
@@ -109,12 +108,9 @@
         rule.setContent {
             Box(
                 testModifier
-                    .animateContentSize(
-                        tween(
-                            animDuration,
-                            easing = LinearOutSlowInEasing
-                        )
-                    ) { startSize, endSize ->
+                    .animateContentSize(tween(animDuration, easing = LinearOutSlowInEasing)) {
+                        startSize,
+                        endSize ->
                         animationStartSize = startSize
                         animationEndSize = endSize
                     }
@@ -135,24 +131,20 @@
             val fraction = LinearOutSlowInEasing.transform(i / animDuration.toFloat())
             assertEquals(
                 density * (startWidth * (1 - fraction) + endWidth * fraction),
-                testModifier.width.toFloat(), 1f
+                testModifier.width.toFloat(),
+                1f
             )
 
             assertEquals(
                 density * (startHeight * (1 - fraction) + endHeight * fraction),
-                testModifier.height.toFloat(), 1f
+                testModifier.height.toFloat(),
+                1f
             )
 
             if (i == animDuration) {
                 assertNotNull(animationStartSize)
-                assertEquals(
-                    animationStartSize!!.width.toFloat(),
-                    startWidth * density, 1f
-                )
-                assertEquals(
-                    animationStartSize!!.height.toFloat(),
-                    startHeight * density, 1f
-                )
+                assertEquals(animationStartSize!!.width.toFloat(), startWidth * density, 1f)
+                assertEquals(animationStartSize!!.height.toFloat(), startHeight * density, 1f)
             } else {
                 assertNull(animationEndSize)
             }
@@ -183,17 +175,11 @@
         @Composable
         fun AnimateBoxSizeWithAlignment(alignment: Alignment, index: Int) {
             Box(
-                Modifier
-                    .animateContentSize(
-                        animationSpec = tween(
-                            animDuration,
-                            easing = LinearOutSlowInEasing
-                        ),
+                Modifier.animateContentSize(
+                        animationSpec = tween(animDuration, easing = LinearOutSlowInEasing),
                         alignment = alignment
                     )
-                    .onPlaced {
-                        positionInRootByBoxIndex[index] = it.positionInRoot()
-                    }
+                    .onPlaced { positionInRootByBoxIndex[index] = it.positionInRoot() }
                     .requiredSize(width.dp, height.dp)
             )
         }
@@ -213,9 +199,7 @@
         rule.mainClock.advanceTimeByFrame()
         rule.waitForIdle()
 
-        val size = with(rule.density) {
-            IntSize(endWidth.dp.roundToPx(), endHeight.dp.roundToPx())
-        }
+        val size = with(rule.density) { IntSize(endWidth.dp.roundToPx(), endHeight.dp.roundToPx()) }
 
         for (i in 0..animDuration step frameDuration) {
             val fraction = LinearOutSlowInEasing.transform(i / animDuration.toFloat())
@@ -245,19 +229,18 @@
         rule.setContent {
             CompositionLocalProvider(LocalDensity provides Density(1f)) {
                 LookaheadScope {
-                    Box(Modifier
-                        .layout { measurable, constraints ->
-                            measurable
-                                .measure(constraints)
-                                .run {
+                    Box(
+                        Modifier.layout { measurable, constraints ->
+                                measurable.measure(constraints).run {
                                     if (isLookingAhead) {
                                         lookaheadSizes.add(IntSize(width, height))
                                     }
                                     layout(width, height) { place(0, 0) }
                                 }
-                        }
-                        .animateContentSize()
-                        .size(size.width.dp, size.height.dp)) {
+                            }
+                            .animateContentSize()
+                            .size(size.width.dp, size.height.dp)
+                    ) {
                         Box(Modifier.size(20.dp))
                     }
                 }
@@ -265,16 +248,11 @@
         }
 
         repeat(8) {
-            size = IntSize(
-                Random.nextInt(200, 600),
-                Random.nextInt(100, 800)
-            )
+            size = IntSize(Random.nextInt(200, 600), Random.nextInt(100, 800))
             lookaheadSizes.clear()
             rule.runOnIdle {
                 assertTrue(lookaheadSizes.isNotEmpty())
-                lookaheadSizes.forEach {
-                    assertEquals(size, it)
-                }
+                lookaheadSizes.forEach { assertEquals(size, it) }
             }
         }
     }
@@ -282,101 +260,109 @@
     @Test
     fun testInspectorValue() {
         rule.setContent {
-            Modifier.animateContentSize().any {
-                it as InspectableValue
-                if (it.nameFallback == "animateContentSize") {
-                    assertThat(it.valueOverride, nullValue())
-                    assertThat(
-                        it.inspectableElements.map { it.name }.toList(),
-                        `is`(listOf("animationSpec", "alignment", "finishedListener"))
-                    )
-                    true
-                } else {
-                    false
+            Modifier.animateContentSize()
+                .any {
+                    it as InspectableValue
+                    if (it.nameFallback == "animateContentSize") {
+                        assertThat(it.valueOverride, nullValue())
+                        assertThat(
+                            it.inspectableElements.map { it.name }.toList(),
+                            `is`(listOf("animationSpec", "alignment", "finishedListener"))
+                        )
+                        true
+                    } else {
+                        false
+                    }
                 }
-            }.also { assertTrue(it) }
+                .also { assertTrue(it) }
         }
     }
 
     @Test
-    fun properFinalStateAfterReAttach() = with(rule.density) {
-        // Tests that animateContentSize is able to recover (end at its proper target size) after
-        // being interrupted with movableContent
-        val totalSizePx = 300
+    fun properFinalStateAfterReAttach() =
+        with(rule.density) {
+            // Tests that animateContentSize is able to recover (end at its proper target size)
+            // after
+            // being interrupted with movableContent
+            val totalSizePx = 300
 
-        val smallSizePx = 100
-        val largeSizePx = 200
-        val isExpanded = mutableStateOf(false)
+            val smallSizePx = 100
+            val largeSizePx = 200
+            val isExpanded = mutableStateOf(false)
 
-        val containerAOffset = Offset.Zero
-        val containerBOffset = Offset(100f, 100f)
-        val isAtContainerA = mutableStateOf(true)
+            val containerAOffset = Offset.Zero
+            val containerBOffset = Offset(100f, 100f)
+            val isAtContainerA = mutableStateOf(true)
 
-        val frameDuration = 16
-        val animDuration = 10 * frameDuration
+            val frameDuration = 16
+            val animDuration = 10 * frameDuration
 
-        val testModifier by mutableStateOf(TestModifier())
+            val testModifier by mutableStateOf(TestModifier())
 
-        rule.setContent {
-            val animatedBox = remember {
-                movableContentOf {
-                    Box(
-                        modifier = Modifier
-                            .wrapContentSize()
-                            .then(testModifier)
-                            .animateContentSize(tween(animDuration, easing = LinearEasing))
-                    ) {
-                        val size = if (isExpanded.value) {
-                            largeSizePx.toDp()
-                        } else {
-                            smallSizePx.toDp()
+            rule.setContent {
+                val animatedBox = remember {
+                    movableContentOf {
+                        Box(
+                            modifier =
+                                Modifier.wrapContentSize()
+                                    .then(testModifier)
+                                    .animateContentSize(tween(animDuration, easing = LinearEasing))
+                        ) {
+                            val size =
+                                if (isExpanded.value) {
+                                    largeSizePx.toDp()
+                                } else {
+                                    smallSizePx.toDp()
+                                }
+                            Box(Modifier.requiredSize(size))
                         }
-                        Box(Modifier.requiredSize(size))
+                    }
+                }
+
+                Box(Modifier.size(totalSizePx.toDp())) {
+                    Box(Modifier.offset { containerAOffset.round() }) {
+                        if (isAtContainerA.value) {
+                            animatedBox()
+                        }
+                    }
+                    Box(Modifier.offset { containerBOffset.round() }) {
+                        if (!isAtContainerA.value) {
+                            animatedBox()
+                        }
                     }
                 }
             }
 
-            Box(Modifier.size(totalSizePx.toDp())) {
-                Box(Modifier.offset { containerAOffset.round() }) {
-                    if (isAtContainerA.value) {
-                        animatedBox()
-                    }
-                }
-                Box(Modifier.offset { containerBOffset.round() }) {
-                    if (!isAtContainerA.value) {
-                        animatedBox()
-                    }
-                }
-            }
+            rule.waitForIdle()
+            rule.mainClock.autoAdvance = false
+
+            isExpanded.value = true
+            rule.mainClock.advanceTimeByFrame()
+            rule.mainClock.advanceTimeByFrame()
+            rule.waitForIdle()
+
+            // Animate towards halfway the animation
+            rule.mainClock.advanceTimeBy(animDuration / 2L)
+            rule.waitForIdle()
+
+            assertEquals(150, testModifier.width)
+            assertEquals(150, testModifier.height)
+
+            // Move container, this should cause a re-attach in `animateContentSize` node, after
+            // this,
+            // if we let the animation run until it finishes, the final size should match the
+            // expected
+            // size.
+            // Note that this test intentionally doesn't cover the behavior of the remaining
+            // animation
+            // as this change does not address that.
+            isAtContainerA.value = !isAtContainerA.value
+            rule.mainClock.autoAdvance = true
+            rule.waitForIdle()
+
+            assertEquals(largeSizePx, testModifier.width)
+            assertEquals(largeSizePx, testModifier.height)
         }
-
-        rule.waitForIdle()
-        rule.mainClock.autoAdvance = false
-
-        isExpanded.value = true
-        rule.mainClock.advanceTimeByFrame()
-        rule.mainClock.advanceTimeByFrame()
-        rule.waitForIdle()
-
-        // Animate towards halfway the animation
-        rule.mainClock.advanceTimeBy(animDuration / 2L)
-        rule.waitForIdle()
-
-        assertEquals(150, testModifier.width)
-        assertEquals(150, testModifier.height)
-
-        // Move container, this should cause a re-attach in `animateContentSize` node, after this,
-        // if we let the animation run until it finishes, the final size should match the expected
-        // size.
-        // Note that this test intentionally doesn't cover the behavior of the remaining animation
-        // as this change does not address that.
-        isAtContainerA.value = !isAtContainerA.value
-        rule.mainClock.autoAdvance = true
-        rule.waitForIdle()
-
-        assertEquals(largeSizePx, testModifier.width)
-        assertEquals(largeSizePx, testModifier.height)
-    }
 }
 
 internal class TestModifier : LayoutModifier {
@@ -384,6 +370,7 @@
     var height: Int = 0
     var lookaheadSize: IntSize? = null
         private set
+
     override fun MeasureScope.measure(
         measurable: Measurable,
         constraints: Constraints
@@ -392,8 +379,6 @@
         if (isLookingAhead) lookaheadSize = IntSize(placeable.width, placeable.height)
         width = placeable.width
         height = placeable.height
-        return layout(width, height) {
-            placeable.place(0, 0)
-        }
+        return layout(width, height) { placeable.place(0, 0) }
     }
 }
diff --git a/compose/animation/animation/src/androidInstrumentedTest/kotlin/androidx/compose/animation/CrossfadeTest.kt b/compose/animation/animation/src/androidInstrumentedTest/kotlin/androidx/compose/animation/CrossfadeTest.kt
index 21e8dfe..d09b4a4 100644
--- a/compose/animation/animation/src/androidInstrumentedTest/kotlin/androidx/compose/animation/CrossfadeTest.kt
+++ b/compose/animation/animation/src/androidInstrumentedTest/kotlin/androidx/compose/animation/CrossfadeTest.kt
@@ -47,8 +47,7 @@
 @MediumTest
 class CrossfadeTest {
 
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
     @Test
     fun crossfadeTest_showsContent() {
@@ -56,9 +55,7 @@
 
         rule.setContent {
             val showFirst by remember { mutableStateOf(true) }
-            Crossfade(showFirst) {
-                BasicText(if (it) First else Second)
-            }
+            Crossfade(showFirst) { BasicText(if (it) First else Second) }
         }
         rule.mainClock.advanceTimeBy(DefaultDurationMillis.toLong())
 
@@ -74,20 +71,14 @@
         rule.setContent {
             Crossfade(showFirst) {
                 BasicText(if (it) First else Second)
-                DisposableEffect(Unit) {
-                    onDispose {
-                        disposed = true
-                    }
-                }
+                DisposableEffect(Unit) { onDispose { disposed = true } }
             }
         }
 
         rule.mainClock.advanceTimeByFrame() // Kick off the animation
         rule.mainClock.advanceTimeBy(DefaultDurationMillis.toLong())
 
-        rule.runOnUiThread {
-            showFirst = false
-        }
+        rule.runOnUiThread { showFirst = false }
 
         // Wait for content to be disposed
         rule.mainClock.advanceTimeUntil { disposed }
@@ -104,25 +95,16 @@
         var showFirst by mutableStateOf(true)
         var disposed = false
         rule.setContent {
-            Crossfade(
-                showFirst,
-                animationSpec = TweenSpec(durationMillis = duration)
-            ) {
+            Crossfade(showFirst, animationSpec = TweenSpec(durationMillis = duration)) {
                 BasicText(if (it) First else Second)
-                DisposableEffect(Unit) {
-                    onDispose {
-                        disposed = true
-                    }
-                }
+                DisposableEffect(Unit) { onDispose { disposed = true } }
             }
         }
 
         rule.mainClock.advanceTimeByFrame() // Kick off the animation
         rule.mainClock.advanceTimeBy(duration.toLong())
 
-        rule.runOnUiThread {
-            showFirst = false
-        }
+        rule.runOnUiThread { showFirst = false }
 
         rule.mainClock.advanceTimeBy(duration.toLong())
         rule.mainClock.advanceTimeByFrame()
@@ -137,9 +119,7 @@
         var current by mutableStateOf<String?>(null)
 
         rule.setContent {
-            Crossfade(current) { value ->
-                BasicText(if (value == null) First else Second)
-            }
+            Crossfade(current) { value -> BasicText(if (value == null) First else Second) }
         }
 
         rule.mainClock.advanceTimeByFrame() // Kick off the animation
@@ -148,9 +128,7 @@
         rule.onNodeWithText(First).assertExists()
         rule.onNodeWithText(Second).assertDoesNotExist()
 
-        rule.runOnUiThread {
-            current = "other"
-        }
+        rule.runOnUiThread { current = "other" }
 
         rule.mainClock.advanceTimeBy(DefaultDurationMillis.toLong())
         rule.mainClock.advanceTimeByFrame()
@@ -171,10 +149,7 @@
         var counter2 = 0
         rule.setContent {
             val saveableStateHolder = rememberSaveableStateHolder()
-            Crossfade(
-                showFirst,
-                animationSpec = TweenSpec(durationMillis = duration)
-            ) {
+            Crossfade(showFirst, animationSpec = TweenSpec(durationMillis = duration)) {
                 saveableStateHolder.SaveableStateProvider(it) {
                     if (it) {
                         counter1 = rememberSaveable { counter++ }
@@ -188,9 +163,7 @@
         rule.mainClock.advanceTimeByFrame() // Kick off the animation
         rule.mainClock.advanceTimeBy(duration.toLong())
 
-        rule.runOnUiThread {
-            showFirst = false
-        }
+        rule.runOnUiThread { showFirst = false }
 
         rule.mainClock.advanceTimeBy(duration.toLong())
         rule.mainClock.advanceTimeByFrame()
@@ -198,9 +171,7 @@
 
         // and go back to the second screen
 
-        rule.runOnUiThread {
-            showFirst = true
-        }
+        rule.runOnUiThread { showFirst = true }
 
         rule.mainClock.advanceTimeBy(duration.toLong())
         rule.mainClock.advanceTimeByFrame()
@@ -222,9 +193,7 @@
                 if (it > 0) {
                     holder.SaveableStateProvider(true) {
                         var count by rememberSaveable { mutableStateOf(0) }
-                        LaunchedEffect(Unit) {
-                            list.add(++count)
-                        }
+                        LaunchedEffect(Unit) { list.add(++count) }
                     }
                 }
                 Box(Modifier.requiredSize(200.dp))
@@ -237,12 +206,11 @@
                 withFrameMillis {
                     assertFalse(transition.isRunning)
                     assertEquals(transition.currentState, transition.targetState)
-                    // This state change should now change the contentKey & hence trigger an animation
+                    // This state change should now change the contentKey & hence trigger an
+                    // animation
                     targetState = -1
                 }
-                withFrameMillis {
-                    assertTrue(transition.isRunning)
-                }
+                withFrameMillis { assertTrue(transition.isRunning) }
             }
         }
         rule.waitForIdle()
diff --git a/compose/animation/animation/src/androidInstrumentedTest/kotlin/androidx/compose/animation/SharedTransitionTest.kt b/compose/animation/animation/src/androidInstrumentedTest/kotlin/androidx/compose/animation/SharedTransitionTest.kt
index e12e0c0..5088ff8 100644
--- a/compose/animation/animation/src/androidInstrumentedTest/kotlin/androidx/compose/animation/SharedTransitionTest.kt
+++ b/compose/animation/animation/src/androidInstrumentedTest/kotlin/androidx/compose/animation/SharedTransitionTest.kt
@@ -107,19 +107,14 @@
 @LargeTest
 class SharedTransitionTest {
 
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
     @Test
     fun transitionInterruption() {
         var visible by mutableStateOf(true)
         val boundsTransform = BoundsTransform { _, _ -> tween(500, easing = LinearEasing) }
-        val positions = mutableListOf(
-            Offset.Zero, Offset.Zero, Offset.Zero, Offset.Zero
-        )
-        val sizes = mutableListOf(
-            IntSize(-1, -1), IntSize(-1, -1), IntSize.Zero, IntSize.Zero
-        )
+        val positions = mutableListOf(Offset.Zero, Offset.Zero, Offset.Zero, Offset.Zero)
+        val sizes = mutableListOf(IntSize(-1, -1), IntSize(-1, -1), IntSize.Zero, IntSize.Zero)
         var transitionScope: SharedTransitionScope? = null
         rule.setContent {
             CompositionLocalProvider(LocalDensity provides Density(1f)) {
@@ -127,54 +122,62 @@
                     transitionScope = this@SharedTransitionLayout as SharedTransitionScopeImpl
                     AnimatedVisibility(visible = visible) {
                         Column {
-                            Box(Modifier
-                                .sharedElement(
-                                    rememberSharedContentState(key = "cat"),
-                                    this@AnimatedVisibility,
-                                    boundsTransform = boundsTransform
-                                )
-                                .onGloballyPositioned {
-                                    positions[0] = lookaheadRoot.localPositionOf(it, Offset.Zero)
-                                    sizes[0] = it.size
-                                }
-                                .size(200.dp))
-                            Box(Modifier
-                                .sharedBounds(
-                                    rememberSharedContentState(key = "dog"),
-                                    this@AnimatedVisibility,
-                                    boundsTransform = boundsTransform
-                                )
-                                .onGloballyPositioned {
-                                    positions[1] = lookaheadRoot.localPositionOf(it, Offset.Zero)
-                                    sizes[1] = it.size
-                                }
-                                .size(50.dp))
+                            Box(
+                                Modifier.sharedElement(
+                                        rememberSharedContentState(key = "cat"),
+                                        this@AnimatedVisibility,
+                                        boundsTransform = boundsTransform
+                                    )
+                                    .onGloballyPositioned {
+                                        positions[0] =
+                                            lookaheadRoot.localPositionOf(it, Offset.Zero)
+                                        sizes[0] = it.size
+                                    }
+                                    .size(200.dp)
+                            )
+                            Box(
+                                Modifier.sharedBounds(
+                                        rememberSharedContentState(key = "dog"),
+                                        this@AnimatedVisibility,
+                                        boundsTransform = boundsTransform
+                                    )
+                                    .onGloballyPositioned {
+                                        positions[1] =
+                                            lookaheadRoot.localPositionOf(it, Offset.Zero)
+                                        sizes[1] = it.size
+                                    }
+                                    .size(50.dp)
+                            )
                         }
                     }
                     AnimatedVisibility(visible = !visible) {
                         Row {
-                            Box(Modifier
-                                .sharedElement(
-                                    rememberSharedContentState(key = "dog"),
-                                    this@AnimatedVisibility,
-                                    boundsTransform = boundsTransform
-                                )
-                                .onGloballyPositioned {
-                                    positions[2] = lookaheadRoot.localPositionOf(it, Offset.Zero)
-                                    sizes[2] = it.size
-                                }
-                                .size(50.dp))
-                            Box(Modifier
-                                .sharedBounds(
-                                    rememberSharedContentState(key = "cat"),
-                                    this@AnimatedVisibility,
-                                    boundsTransform = boundsTransform
-                                )
-                                .onGloballyPositioned {
-                                    positions[3] = lookaheadRoot.localPositionOf(it, Offset.Zero)
-                                    sizes[3] = it.size
-                                }
-                                .size(200.dp))
+                            Box(
+                                Modifier.sharedElement(
+                                        rememberSharedContentState(key = "dog"),
+                                        this@AnimatedVisibility,
+                                        boundsTransform = boundsTransform
+                                    )
+                                    .onGloballyPositioned {
+                                        positions[2] =
+                                            lookaheadRoot.localPositionOf(it, Offset.Zero)
+                                        sizes[2] = it.size
+                                    }
+                                    .size(50.dp)
+                            )
+                            Box(
+                                Modifier.sharedBounds(
+                                        rememberSharedContentState(key = "cat"),
+                                        this@AnimatedVisibility,
+                                        boundsTransform = boundsTransform
+                                    )
+                                    .onGloballyPositioned {
+                                        positions[3] =
+                                            lookaheadRoot.localPositionOf(it, Offset.Zero)
+                                        sizes[3] = it.size
+                                    }
+                                    .size(200.dp)
+                            )
                         }
                     }
                 }
@@ -258,9 +261,7 @@
     fun transitionInterruptionSelfManagedVisibility() {
         var visible by mutableStateOf(true)
         val boundsTransform = BoundsTransform { _, _ -> tween(500, easing = LinearEasing) }
-        val positions = mutableListOf(
-            Offset.Zero, Offset.Zero, Offset.Zero, Offset.Zero
-        )
+        val positions = mutableListOf(Offset.Zero, Offset.Zero, Offset.Zero, Offset.Zero)
         val sizes = mutableListOf(IntSize(-1, -1), IntSize(-1, -1), IntSize.Zero, IntSize.Zero)
         var transitionScope: SharedTransitionScopeImpl? = null
         rule.setContent {
@@ -268,52 +269,56 @@
                 SharedTransitionLayout {
                     transitionScope = this@SharedTransitionLayout as SharedTransitionScopeImpl
                     Column {
-                        Box(Modifier
-                            .sharedElementWithCallerManagedVisibility(
-                                rememberSharedContentState(key = "cat"),
-                                visible = visible,
-                                boundsTransform = boundsTransform
-                            )
-                            .onGloballyPositioned {
-                                positions[0] = lookaheadRoot.localPositionOf(it, Offset.Zero)
-                                sizes[0] = it.size
-                            }
-                            .size(200.dp))
-                        Box(Modifier
-                            .sharedBoundsWithCallerManagedVisibility(
-                                rememberSharedContentState(key = "dog"),
-                                visible = visible,
-                                boundsTransform = boundsTransform
-                            )
-                            .onGloballyPositioned {
-                                positions[1] = lookaheadRoot.localPositionOf(it, Offset.Zero)
-                                sizes[1] = it.size
-                            }
-                            .size(50.dp))
+                        Box(
+                            Modifier.sharedElementWithCallerManagedVisibility(
+                                    rememberSharedContentState(key = "cat"),
+                                    visible = visible,
+                                    boundsTransform = boundsTransform
+                                )
+                                .onGloballyPositioned {
+                                    positions[0] = lookaheadRoot.localPositionOf(it, Offset.Zero)
+                                    sizes[0] = it.size
+                                }
+                                .size(200.dp)
+                        )
+                        Box(
+                            Modifier.sharedBoundsWithCallerManagedVisibility(
+                                    rememberSharedContentState(key = "dog"),
+                                    visible = visible,
+                                    boundsTransform = boundsTransform
+                                )
+                                .onGloballyPositioned {
+                                    positions[1] = lookaheadRoot.localPositionOf(it, Offset.Zero)
+                                    sizes[1] = it.size
+                                }
+                                .size(50.dp)
+                        )
                     }
                     Row {
-                        Box(Modifier
-                            .sharedElementWithCallerManagedVisibility(
-                                rememberSharedContentState(key = "dog"),
-                                visible = !visible,
-                                boundsTransform = boundsTransform
-                            )
-                            .onGloballyPositioned {
-                                positions[2] = lookaheadRoot.localPositionOf(it, Offset.Zero)
-                                sizes[2] = it.size
-                            }
-                            .size(50.dp))
-                        Box(Modifier
-                            .sharedBoundsWithCallerManagedVisibility(
-                                rememberSharedContentState(key = "cat"),
-                                visible = !visible,
-                                boundsTransform = boundsTransform
-                            )
-                            .onGloballyPositioned {
-                                positions[3] = lookaheadRoot.localPositionOf(it, Offset.Zero)
-                                sizes[3] = it.size
-                            }
-                            .size(200.dp))
+                        Box(
+                            Modifier.sharedElementWithCallerManagedVisibility(
+                                    rememberSharedContentState(key = "dog"),
+                                    visible = !visible,
+                                    boundsTransform = boundsTransform
+                                )
+                                .onGloballyPositioned {
+                                    positions[2] = lookaheadRoot.localPositionOf(it, Offset.Zero)
+                                    sizes[2] = it.size
+                                }
+                                .size(50.dp)
+                        )
+                        Box(
+                            Modifier.sharedBoundsWithCallerManagedVisibility(
+                                    rememberSharedContentState(key = "cat"),
+                                    visible = !visible,
+                                    boundsTransform = boundsTransform
+                                )
+                                .onGloballyPositioned {
+                                    positions[3] = lookaheadRoot.localPositionOf(it, Offset.Zero)
+                                    sizes[3] = it.size
+                                }
+                                .size(200.dp)
+                        )
                     }
                 }
             }
@@ -404,41 +409,29 @@
                 this@SharedTransitionLayout as SharedTransitionScopeImpl
                 Column {
                     Box(
-                        Modifier
-                            .sharedElementWithCallerManagedVisibility(
-                                rememberSharedContentState(key = key1).also {
-                                    set.add(it)
-                                },
+                        Modifier.sharedElementWithCallerManagedVisibility(
+                                rememberSharedContentState(key = key1).also { set.add(it) },
                                 visible = visible,
                             )
                             .size(200.dp)
                     )
                     Box(
-                        Modifier
-                            .sharedElementWithCallerManagedVisibility(
-                                rememberSharedContentState(key = 2).also {
-                                    set.add(it)
-                                },
+                        Modifier.sharedElementWithCallerManagedVisibility(
+                                rememberSharedContentState(key = 2).also { set.add(it) },
                                 visible = visible,
                             )
                             .size(200.dp)
                     )
                     Box(
-                        Modifier
-                            .sharedBoundsWithCallerManagedVisibility(
-                                rememberSharedContentState(key = "cat").also {
-                                    set.add(it)
-                                },
+                        Modifier.sharedBoundsWithCallerManagedVisibility(
+                                rememberSharedContentState(key = "cat").also { set.add(it) },
                                 visible = visible,
                             )
                             .size(200.dp)
                     )
                     Box(
-                        Modifier
-                            .sharedBoundsWithCallerManagedVisibility(
-                                rememberSharedContentState(key = Unit).also {
-                                    set.add(it)
-                                },
+                        Modifier.sharedBoundsWithCallerManagedVisibility(
+                                rememberSharedContentState(key = Unit).also { set.add(it) },
                                 visible = visible,
                             )
                             .size(200.dp)
@@ -447,41 +440,29 @@
                 if (showRow) {
                     Row {
                         Box(
-                            Modifier
-                                .sharedElementWithCallerManagedVisibility(
-                                    rememberSharedContentState(key = key1).also {
-                                        set.add(it)
-                                    },
+                            Modifier.sharedElementWithCallerManagedVisibility(
+                                    rememberSharedContentState(key = key1).also { set.add(it) },
                                     visible = !visible,
                                 )
                                 .size(50.dp)
                         )
                         Box(
-                            Modifier
-                                .sharedElementWithCallerManagedVisibility(
-                                    rememberSharedContentState(key = 2).also {
-                                        set.add(it)
-                                    },
+                            Modifier.sharedElementWithCallerManagedVisibility(
+                                    rememberSharedContentState(key = 2).also { set.add(it) },
                                     visible = !visible,
                                 )
                                 .size(50.dp)
                         )
                         Box(
-                            Modifier
-                                .sharedBoundsWithCallerManagedVisibility(
-                                    rememberSharedContentState(key = "cat").also {
-                                        set.add(it)
-                                    },
+                            Modifier.sharedBoundsWithCallerManagedVisibility(
+                                    rememberSharedContentState(key = "cat").also { set.add(it) },
                                     visible = !visible,
                                 )
                                 .size(50.dp)
                         )
                         Box(
-                            Modifier
-                                .sharedBoundsWithCallerManagedVisibility(
-                                    rememberSharedContentState(key = Unit).also {
-                                        set.add(it)
-                                    },
+                            Modifier.sharedBoundsWithCallerManagedVisibility(
+                                    rememberSharedContentState(key = Unit).also { set.add(it) },
                                     visible = !visible,
                                 )
                                 .size(50.dp)
@@ -492,34 +473,20 @@
         }
         rule.waitForIdle()
         assertEquals(4, set.size)
-        set.forEach {
-            assertFalse(it.isMatchFound)
-        }
+        set.forEach { assertFalse(it.isMatchFound) }
 
         // Show row to add matched shared elements into composition
         showRow = true
         rule.runOnIdle {
             assertEquals(8, set.size)
-            set.forEach {
-                assertTrue(it.isMatchFound)
-            }
+            set.forEach { assertTrue(it.isMatchFound) }
         }
         visible = false
-        rule.runOnIdle {
-            set.forEach {
-                assertTrue(it.isMatchFound)
-            }
-        }
+        rule.runOnIdle { set.forEach { assertTrue(it.isMatchFound) } }
         set.clear()
         showRow = false
-        rule.runOnIdle {
-            assertEquals(4, set.size)
-        }
-        rule.runOnIdle {
-            set.forEach {
-                assertFalse(it.isMatchFound)
-            }
-        }
+        rule.runOnIdle { assertEquals(4, set.size) }
+        rule.runOnIdle { set.forEach { assertFalse(it.isMatchFound) } }
     }
 
     @Test
@@ -537,74 +504,47 @@
             }
             val transition = rememberTransition(transitionState = seekableTransition)
             SharedTransitionLayout {
-
                 val state1 = rememberSharedContentState(key = key1)
                 val state2 = rememberSharedContentState(key = key1)
                 transition.AnimatedContent {
                     when (it) {
-                        1 -> Box(
-                            Modifier
-                                .sharedElement(
-                                    state1, this
-                                )
-                                .size(200.dp)
-                        ) {
-                            DisposableEffect(key1 = Unit) {
-                                set.add(state1)
-                                onDispose {
-                                    set.remove(state1)
+                        1 ->
+                            Box(Modifier.sharedElement(state1, this).size(200.dp)) {
+                                DisposableEffect(key1 = Unit) {
+                                    set.add(state1)
+                                    onDispose { set.remove(state1) }
                                 }
                             }
-                        }
-
-                        2 -> Box(
-                            Modifier
-                                .sharedElement(
-                                    state2,
-                                    this
-                                )
-                                .size(600.dp)
-                        ) {
-                            DisposableEffect(key1 = Unit) {
-                                set.add(state2)
-                                onDispose {
-                                    set.remove(state2)
+                        2 ->
+                            Box(Modifier.sharedElement(state2, this).size(600.dp)) {
+                                DisposableEffect(key1 = Unit) {
+                                    set.add(state2)
+                                    onDispose { set.remove(state2) }
                                 }
                             }
-                        }
-
-                        else -> Box(Modifier.size(200.dp)) {
-                            if (firstFrame) {
-                                firstFrame = false
+                        else ->
+                            Box(Modifier.size(200.dp)) {
+                                if (firstFrame) {
+                                    firstFrame = false
+                                }
                             }
-                        }
                     }
                 }
             }
         }
         rule.waitForIdle()
         assertEquals(1, set.size)
-        set.forEach {
-            assertFalse(it.isMatchFound)
-        }
+        set.forEach { assertFalse(it.isMatchFound) }
 
         // Show row to add matched shared elements into composition
-        rule.runOnIdle {
-            target = 2
-        }
-        rule.waitUntil {
-            set.size == 2
-        }
+        rule.runOnIdle { target = 2 }
+        rule.waitUntil { set.size == 2 }
 
-        repeat(5) {
-            rule.mainClock.advanceTimeByFrame()
-        }
+        repeat(5) { rule.mainClock.advanceTimeByFrame() }
         assertEquals(2, set.size)
 
         // Now we expect two shared elements to be matched
-        set.forEach {
-            assertTrue(it.isMatchFound)
-        }
+        set.forEach { assertTrue(it.isMatchFound) }
         target = 3
 
         rule.waitUntil { !firstFrame }
@@ -627,10 +567,7 @@
         rule.setContent {
             CompositionLocalProvider(LocalDensity provides Density(1f)) {
                 SharedTransitionLayout(
-                    Modifier
-                        .requiredSize(100.dp)
-                        .testTag("scope")
-                        .background(Color.White)
+                    Modifier.requiredSize(100.dp).testTag("scope").background(Color.White)
                 ) {
                     transitionScope = this
                     AnimatedVisibility(
@@ -640,8 +577,7 @@
                     ) {
                         enterTransition = transition
                         Box(
-                            Modifier
-                                .sharedBounds(
+                            Modifier.sharedBounds(
                                     rememberSharedContentState(key = "test"),
                                     this@AnimatedVisibility,
                                     fadeIn(tween),
@@ -650,8 +586,7 @@
                                 .fillMaxSize()
                         ) {
                             Box(
-                                Modifier
-                                    .fillMaxHeight()
+                                Modifier.fillMaxHeight()
                                     .fillMaxWidth(0.5f)
                                     .background(Color.Red)
                                     .align(Alignment.CenterStart)
@@ -665,8 +600,7 @@
                     ) {
                         exitTransition = transition
                         Box(
-                            Modifier
-                                .sharedBounds(
+                            Modifier.sharedBounds(
                                     rememberSharedContentState(key = "test"),
                                     this@AnimatedVisibility,
                                     fadeIn(tween),
@@ -675,8 +609,7 @@
                                 .fillMaxSize()
                         ) {
                             Box(
-                                Modifier
-                                    .fillMaxHeight()
+                                Modifier.fillMaxHeight()
                                     .fillMaxWidth(0.5f)
                                     .background(Color.Blue)
                                     .align(Alignment.CenterEnd)
@@ -731,26 +664,23 @@
         rule.setContent {
             CompositionLocalProvider(LocalDensity provides Density(1f)) {
                 SharedTransitionLayout(
-                    Modifier
-                        .requiredSize(100.dp)
-                        .testTag("scope")
-                        .background(Color.White)
+                    Modifier.requiredSize(100.dp).testTag("scope").background(Color.White)
                 ) {
                     transitionScope = this
                     AnimatedVisibility(
-                        visible = visible, enter = fadeIn(tween), exit = fadeOut(tween)
+                        visible = visible,
+                        enter = fadeIn(tween),
+                        exit = fadeOut(tween)
                     ) {
                         Box(
-                            Modifier
-                                .sharedElement(
+                            Modifier.sharedElement(
                                     rememberSharedContentState(key = "test"),
                                     this@AnimatedVisibility,
                                 )
                                 .fillMaxSize()
                         ) {
                             Box(
-                                Modifier
-                                    .fillMaxHeight()
+                                Modifier.fillMaxHeight()
                                     .fillMaxWidth(0.5f)
                                     .background(Color.Red)
                                     .align(Alignment.CenterStart)
@@ -763,16 +693,14 @@
                         exit = ExitTransition.None
                     ) {
                         Box(
-                            Modifier
-                                .sharedElement(
+                            Modifier.sharedElement(
                                     rememberSharedContentState(key = "test"),
                                     this@AnimatedVisibility,
                                 )
                                 .fillMaxSize()
                         ) {
                             Box(
-                                Modifier
-                                    .fillMaxHeight()
+                                Modifier.fillMaxHeight()
                                     .fillMaxWidth(0.5f)
                                     .background(Color.Blue)
                                     .align(Alignment.CenterEnd)
@@ -836,10 +764,7 @@
         rule.setContent {
             CompositionLocalProvider(LocalDensity provides Density(1f)) {
                 SharedTransitionLayout(
-                    Modifier
-                        .requiredSize(100.dp)
-                        .testTag("scope")
-                        .background(Color.White)
+                    Modifier.requiredSize(100.dp).testTag("scope").background(Color.White)
                 ) {
                     transitionScope = this
                     AnimatedVisibility(
@@ -848,12 +773,14 @@
                         exit = ExitTransition.None
                     ) {
                         Box(
-                            Modifier
-                                .sharedElement(rememberSharedContentState(key = "child"),
+                            Modifier.sharedElement(
+                                    rememberSharedContentState(key = "child"),
                                     this@AnimatedVisibility,
-                                    boundsTransform = BoundsTransform { _, _ ->
-                                        tween(100, easing = LinearEasing)
-                                    })
+                                    boundsTransform =
+                                        BoundsTransform { _, _ ->
+                                            tween(100, easing = LinearEasing)
+                                        }
+                                )
                                 .fillMaxSize()
                         )
                     }
@@ -863,18 +790,20 @@
                         enter = fadeIn(tween(100)),
                         exit = ExitTransition.None
                     ) {
-                        Box(Modifier
-                            .fillMaxSize(0.5f)
-                            .sharedElement(rememberSharedContentState(key = "child"),
-                                this@AnimatedVisibility,
-                                clipInOverlayDuringTransition = OverlayClip(CircleShape),
-                                boundsTransform = BoundsTransform { _, _ ->
-                                    tween(100, easing = LinearEasing)
-                                })
-                            .onGloballyPositioned {
-                                size = it.size
-                            }
-                            .background(Color.Blue))
+                        Box(
+                            Modifier.fillMaxSize(0.5f)
+                                .sharedElement(
+                                    rememberSharedContentState(key = "child"),
+                                    this@AnimatedVisibility,
+                                    clipInOverlayDuringTransition = OverlayClip(CircleShape),
+                                    boundsTransform =
+                                        BoundsTransform { _, _ ->
+                                            tween(100, easing = LinearEasing)
+                                        }
+                                )
+                                .onGloballyPositioned { size = it.size }
+                                .background(Color.Blue)
+                        )
                     }
                 }
             }
@@ -884,11 +813,7 @@
         assertFalse(transitionScope!!.isTransitionActive)
         rule.onNodeWithTag("scope").run {
             assertExists("Error: Node doesn't exist")
-            captureToImage().run {
-                assertPixels {
-                    Color.White
-                }
-            }
+            captureToImage().run { assertPixels { Color.White } }
         }
 
         rule.mainClock.autoAdvance = false
@@ -908,12 +833,13 @@
                 captureToImage().run {
                     // Check clipping
                     assertPixels {
-                        val distanceToCenter = sqrt(
-                            (it.x - width / 2) * (it.x - width / 2).toFloat() +
-                                (it.y - height / 2) * (it.y - height / 2)
-                        )
-                        if (it.x < width / 2 &&
-                            distanceToCenter < size!!.width / 2 - widthTolerance
+                        val distanceToCenter =
+                            sqrt(
+                                (it.x - width / 2) * (it.x - width / 2).toFloat() +
+                                    (it.y - height / 2) * (it.y - height / 2)
+                            )
+                        if (
+                            it.x < width / 2 && distanceToCenter < size!!.width / 2 - widthTolerance
                         ) {
                             Color.Blue
                         } else if (distanceToCenter > size!!.width / 2 + widthTolerance) {
@@ -935,10 +861,7 @@
         rule.setContent {
             CompositionLocalProvider(LocalDensity provides Density(1f)) {
                 SharedTransitionLayout(
-                    Modifier
-                        .requiredSize(100.dp)
-                        .testTag("scope")
-                        .background(Color.White)
+                    Modifier.requiredSize(100.dp).testTag("scope").background(Color.White)
                 ) {
                     transitionScope = this
                     AnimatedVisibility(
@@ -947,16 +870,14 @@
                         exit = ExitTransition.None
                     ) {
                         Box(
-                            Modifier
-                                .sharedBounds(
+                            Modifier.sharedBounds(
                                     rememberSharedContentState(key = "test"),
                                     this@AnimatedVisibility,
                                 )
                                 .fillMaxSize()
                         ) {
                             Box(
-                                Modifier
-                                    .sharedElement(
+                                Modifier.sharedElement(
                                         rememberSharedContentState(key = "child"),
                                         this@AnimatedVisibility
                                     )
@@ -972,19 +893,16 @@
                         exit = ExitTransition.None
                     ) {
                         Box(
-                            Modifier
-                                .sharedBounds(
+                            Modifier.sharedBounds(
                                     rememberSharedContentState(key = "test"),
                                     this@AnimatedVisibility,
-                                    clipInOverlayDuringTransition = OverlayClip(
-                                        clipShape = CircleShape
-                                    )
+                                    clipInOverlayDuringTransition =
+                                        OverlayClip(clipShape = CircleShape)
                                 )
                                 .fillMaxSize()
                         ) {
                             Box(
-                                Modifier
-                                    .sharedElement(
+                                Modifier.sharedElement(
                                         rememberSharedContentState(key = "child"),
                                         this@AnimatedVisibility
                                     )
@@ -1003,11 +921,7 @@
         assertFalse(transitionScope!!.isTransitionActive)
         rule.onNodeWithTag("scope").run {
             assertExists("Error: Node doesn't exist")
-            captureToImage().run {
-                assertPixels {
-                    Color.White
-                }
-            }
+            captureToImage().run { assertPixels { Color.White } }
         }
 
         rule.mainClock.autoAdvance = false
@@ -1027,10 +941,11 @@
                 captureToImage().run {
                     // Check clipping
                     assertPixels {
-                        val distanceToCenter = sqrt(
-                            (it.x - width / 2) * (it.x - width / 2).toFloat() +
-                                (it.y - height / 2) * (it.y - height / 2)
-                        )
+                        val distanceToCenter =
+                            sqrt(
+                                (it.x - width / 2) * (it.x - width / 2).toFloat() +
+                                    (it.y - height / 2) * (it.y - height / 2)
+                            )
                         if (it.x < width / 2 && distanceToCenter < width / 2 - widthTolerance) {
                             Color.Blue
                         } else if (
@@ -1059,11 +974,7 @@
 
         rule.setContent {
             CompositionLocalProvider(LocalDensity provides Density(1f)) {
-                SharedTransitionLayout(
-                    Modifier
-                        .requiredSize(100.dp)
-                        .background(Color.White)
-                ) {
+                SharedTransitionLayout(Modifier.requiredSize(100.dp).background(Color.White)) {
                     transitionScope = this@SharedTransitionLayout as SharedTransitionScopeImpl
                     AnimatedVisibility(
                         visible = visible,
@@ -1071,8 +982,7 @@
                         exit = ExitTransition.None
                     ) {
                         Box(
-                            Modifier
-                                .sharedBounds(
+                            Modifier.sharedBounds(
                                     rememberSharedContentState(key = "test"),
                                     this@AnimatedVisibility,
                                 )
@@ -1080,8 +990,7 @@
                             contentAlignment = Alignment.Center
                         ) {
                             Box(
-                                Modifier
-                                    .fillMaxSize(0.5f)
+                                Modifier.fillMaxSize(0.5f)
                                     .sharedElement(
                                         rememberSharedContentState(key = "child"),
                                         this@AnimatedVisibility
@@ -1090,49 +999,48 @@
                         }
                     }
                     AnimatedVisibility(
-                        modifier = Modifier
-                            .fillMaxSize(0.5f)
-                            .offset(x = 25.dp, y = 25.dp),
+                        modifier = Modifier.fillMaxSize(0.5f).offset(x = 25.dp, y = 25.dp),
                         visible = !visible,
                         enter = fadeIn(tween(100)),
                         exit = ExitTransition.None
                     ) {
                         exitTransition = this.transition
                         Box(
-                            Modifier
-                                .offset(20.dp)
+                            Modifier.offset(20.dp)
                                 .sharedBounds(
                                     rememberSharedContentState(key = "test"),
                                     this@AnimatedVisibility,
                                     fadeIn(),
                                     fadeOut(),
-                                    boundsTransform = BoundsTransform { _, _ ->
-                                        tween(100, easing = LinearEasing)
-                                    },
+                                    boundsTransform =
+                                        BoundsTransform { _, _ ->
+                                            tween(100, easing = LinearEasing)
+                                        },
                                     resizeMode = RemeasureToBounds
                                 )
                                 .onGloballyPositioned {
-                                    parentPosition =
-                                        lookaheadRoot.localPositionOf(it, Offset.Zero)
+                                    parentPosition = lookaheadRoot.localPositionOf(it, Offset.Zero)
                                     parentSize = it.size
-                                }) {
-                            Box(Modifier
-                                .offset(-20.dp)
-                                .sharedElement(
-                                    rememberSharedContentState(key = "child"),
-                                    this@AnimatedVisibility,
-                                    boundsTransform = { initialBounds, targetBounds ->
-                                        assertEquals(initialBounds, targetBounds)
-                                        spring()
-                                    }
-                                )
-                                .onGloballyPositioned {
-                                    childPosition =
-                                        lookaheadRoot.localPositionOf(it, Offset.Zero)
-                                    childSize = it.size
                                 }
-                                .fillMaxSize()
-                                .background(Color.Blue))
+                        ) {
+                            Box(
+                                Modifier.offset(-20.dp)
+                                    .sharedElement(
+                                        rememberSharedContentState(key = "child"),
+                                        this@AnimatedVisibility,
+                                        boundsTransform = { initialBounds, targetBounds ->
+                                            assertEquals(initialBounds, targetBounds)
+                                            spring()
+                                        }
+                                    )
+                                    .onGloballyPositioned {
+                                        childPosition =
+                                            lookaheadRoot.localPositionOf(it, Offset.Zero)
+                                        childSize = it.size
+                                    }
+                                    .fillMaxSize()
+                                    .background(Color.Blue)
+                            )
                         }
                     }
                 }
@@ -1153,11 +1061,9 @@
         // Now shared bounds transition started
         while (transitionScope?.isTransitionActive != false) {
             // Expect size (100, 100) -> (50, 50), position -> (0, 0) -> (45, 45)
-            val fraction =
-                ((exitTransition!!.playTimeNanos / 1000_000L) / 100f).coerceIn(0f, 1f)
-            val expectedSize = (50 * fraction + 100 * (1 - fraction)).roundToInt().let {
-                IntSize(it, it)
-            }
+            val fraction = ((exitTransition!!.playTimeNanos / 1000_000L) / 100f).coerceIn(0f, 1f)
+            val expectedSize =
+                (50 * fraction + 100 * (1 - fraction)).roundToInt().let { IntSize(it, it) }
             val expectedPosition = Offset(45f * fraction, 25f * fraction)
             assertEquals(expectedSize, parentSize!!, IntSize(3, 3))
             assertEquals(expectedPosition, parentPosition!!, Offset(3f, 3f))
@@ -1180,11 +1086,7 @@
 
         rule.setContent {
             CompositionLocalProvider(LocalDensity provides Density(1f)) {
-                SharedTransitionLayout(
-                    Modifier
-                        .requiredSize(100.dp)
-                        .background(Color.White)
-                ) {
+                SharedTransitionLayout(Modifier.requiredSize(100.dp).background(Color.White)) {
                     transitionScope = this
                     AnimatedVisibility(
                         visible = visible,
@@ -1192,17 +1094,13 @@
                         exit = ExitTransition.None
                     ) {
                         Box(
-                            Modifier
-                                .fillMaxSize()
-                                .wrapContentSize()
-                                .onGloballyPositioned {
-                                    parent1Size = it.size
-                                },
+                            Modifier.fillMaxSize().wrapContentSize().onGloballyPositioned {
+                                parent1Size = it.size
+                            },
                             contentAlignment = Alignment.Center
                         ) {
                             Box(
-                                Modifier
-                                    .sharedElement(
+                                Modifier.sharedElement(
                                         rememberSharedContentState(key = "child"),
                                         this@AnimatedVisibility
                                     )
@@ -1215,21 +1113,20 @@
                         enter = fadeIn(tween(100)),
                         exit = ExitTransition.None
                     ) {
-                        Box(Modifier
-                            .onGloballyPositioned {
-                                parent2Size = it.size
-                            }
-                            .offset(-20.dp)
-                            .sharedElement(
-                                rememberSharedContentState(key = "child"),
-                                this@AnimatedVisibility,
-                                placeHolderSize = SharedTransitionScope
-                                    .PlaceHolderSize { _, _ ->
-                                        expectedSize
-                                    }
-                            )
-                            .fillMaxSize()
-                            .background(Color.Blue))
+                        Box(
+                            Modifier.onGloballyPositioned { parent2Size = it.size }
+                                .offset(-20.dp)
+                                .sharedElement(
+                                    rememberSharedContentState(key = "child"),
+                                    this@AnimatedVisibility,
+                                    placeHolderSize =
+                                        SharedTransitionScope.PlaceHolderSize { _, _ ->
+                                            expectedSize
+                                        }
+                                )
+                                .fillMaxSize()
+                                .background(Color.Blue)
+                        )
                     }
                 }
             }
@@ -1268,10 +1165,7 @@
         rule.setContent {
             CompositionLocalProvider(LocalDensity provides Density(1f)) {
                 SharedTransitionLayout(
-                    Modifier
-                        .testTag("scope")
-                        .requiredSize(100.dp)
-                        .background(Color.White)
+                    Modifier.testTag("scope").requiredSize(100.dp).background(Color.White)
                 ) {
                     transitionScope = this
 
@@ -1281,8 +1175,7 @@
                         exit = ExitTransition.None
                     ) {
                         Box(
-                            Modifier
-                                .sharedElement(
+                            Modifier.sharedElement(
                                     rememberSharedContentState(key = "child"),
                                     this@AnimatedVisibility
                                 )
@@ -1297,8 +1190,7 @@
                     ) {
                         exit = transition
                         Box(
-                            Modifier
-                                .sharedElement(
+                            Modifier.sharedElement(
                                     rememberSharedContentState(key = "child"),
                                     this@AnimatedVisibility,
                                     renderInOverlayDuringTransition = false
@@ -1314,11 +1206,7 @@
         assertFalse(transitionScope!!.isTransitionActive)
         rule.onNodeWithTag("scope").run {
             assertExists("Error: Node doesn't exist")
-            captureToImage().run {
-                assertPixels {
-                    Color.Red
-                }
-            }
+            captureToImage().run { assertPixels { Color.Red } }
         }
 
         rule.mainClock.autoAdvance = false
@@ -1335,9 +1223,7 @@
             rule.onNodeWithTag("scope").run {
                 assertExists("Error: Node doesn't exist")
                 captureToImage().run {
-                    assertPixels {
-                        Color.Blue.copy(alpha = fraction).compositeOver(Color.White)
-                    }
+                    assertPixels { Color.Blue.copy(alpha = fraction).compositeOver(Color.White) }
                 }
             }
             rule.waitForIdle()
@@ -1357,18 +1243,12 @@
         rule.setContent {
             CompositionLocalProvider(LocalDensity provides Density(1f)) {
                 SharedTransitionLayout(
-                    Modifier
-                        .testTag("scope")
-                        .requiredSize(100.dp)
-                        .background(Color.White)
+                    Modifier.testTag("scope").requiredSize(100.dp).background(Color.White)
                 ) {
                     transitionScope = this
 
                     Box(
-                        Modifier
-                            .renderInSharedTransitionScopeOverlay(
-                                zIndexInOverlay = greenZIndex
-                            )
+                        Modifier.renderInSharedTransitionScopeOverlay(zIndexInOverlay = greenZIndex)
                             .background(Color.Green)
                             .fillMaxSize()
                     )
@@ -1379,8 +1259,7 @@
                         exit = fadeOut(tween(100, easing = LinearEasing)),
                     ) {
                         Box(
-                            Modifier
-                                .sharedBounds(
+                            Modifier.sharedBounds(
                                     rememberSharedContentState(key = "child"),
                                     this@AnimatedVisibility,
                                     enter = EnterTransition.None,
@@ -1397,8 +1276,7 @@
                         exit = ExitTransition.None
                     ) {
                         Box(
-                            Modifier
-                                .sharedBounds(
+                            Modifier.sharedBounds(
                                     rememberSharedContentState(key = "child"),
                                     this@AnimatedVisibility,
                                     enter = EnterTransition.None,
@@ -1416,11 +1294,7 @@
         assertFalse(transitionScope!!.isTransitionActive)
         rule.onNodeWithTag("scope").run {
             assertExists("Error: Node doesn't exist")
-            captureToImage().run {
-                assertPixels {
-                    Color.Red
-                }
-            }
+            captureToImage().run { assertPixels { Color.Red } }
         }
 
         rule.mainClock.autoAdvance = false
@@ -1440,11 +1314,7 @@
         while (transitionScope?.isTransitionActive != false) {
             rule.onNodeWithTag("scope").run {
                 assertExists("Error: Node doesn't exist")
-                captureToImage().run {
-                    assertPixels {
-                        expectedTopColor
-                    }
-                }
+                captureToImage().run { assertPixels { expectedTopColor } }
             }
 
             greenZIndex = i.toFloat()
@@ -1455,12 +1325,10 @@
                     redZIndex++
                     expectedTopColor = Color.Red
                 }
-
                 1 -> {
                     greenZIndex++
                     expectedTopColor = Color.Green
                 }
-
                 2 -> {
                     blueZIndex++
                     expectedTopColor = Color.Blue
@@ -1483,10 +1351,7 @@
         rule.setContent {
             CompositionLocalProvider(LocalDensity provides Density(1f)) {
                 SharedTransitionLayout(
-                    Modifier
-                        .requiredSize(100.dp)
-                        .testTag("scope")
-                        .background(Color.White)
+                    Modifier.requiredSize(100.dp).testTag("scope").background(Color.White)
                 ) {
                     transitionScope = this
                     AnimatedVisibility(
@@ -1495,12 +1360,14 @@
                         exit = ExitTransition.None
                     ) {
                         Box(
-                            Modifier
-                                .sharedElement(rememberSharedContentState(key = "child"),
+                            Modifier.sharedElement(
+                                    rememberSharedContentState(key = "child"),
                                     this@AnimatedVisibility,
-                                    boundsTransform = BoundsTransform { _, _ ->
-                                        tween(100, easing = LinearEasing)
-                                    })
+                                    boundsTransform =
+                                        BoundsTransform { _, _ ->
+                                            tween(100, easing = LinearEasing)
+                                        }
+                                )
                                 .fillMaxSize()
                         )
                     }
@@ -1510,19 +1377,21 @@
                         enter = fadeIn(tween(100)),
                         exit = ExitTransition.None
                     ) {
-                        Box(Modifier
-                            .padding(25.dp)
-                            .sharedElement(rememberSharedContentState(key = "child"),
-                                this@AnimatedVisibility,
-                                clipInOverlayDuringTransition = OverlayClip(CircleShape),
-                                boundsTransform = BoundsTransform { _, _ ->
-                                    tween(100, easing = LinearEasing)
-                                })
-                            .skipToLookaheadSize()
-                            .onGloballyPositioned {
-                                size = it.size
-                            }
-                            .background(Color.Blue))
+                        Box(
+                            Modifier.padding(25.dp)
+                                .sharedElement(
+                                    rememberSharedContentState(key = "child"),
+                                    this@AnimatedVisibility,
+                                    clipInOverlayDuringTransition = OverlayClip(CircleShape),
+                                    boundsTransform =
+                                        BoundsTransform { _, _ ->
+                                            tween(100, easing = LinearEasing)
+                                        }
+                                )
+                                .skipToLookaheadSize()
+                                .onGloballyPositioned { size = it.size }
+                                .background(Color.Blue)
+                        )
                     }
                 }
             }
@@ -1558,17 +1427,11 @@
         rule.setContent {
             CompositionLocalProvider(LocalDensity provides Density(1f)) {
                 SharedTransitionLayout(
-                    Modifier
-                        .testTag("scope")
-                        .requiredSize(100.dp)
-                        .background(Color.White)
+                    Modifier.testTag("scope").requiredSize(100.dp).background(Color.White)
                 ) {
                     transitionScope = this
                     Box(
-                        Modifier
-                            .renderInSharedTransitionScopeOverlay(
-                                zIndexInOverlay = 1f
-                            )
+                        Modifier.renderInSharedTransitionScopeOverlay(zIndexInOverlay = 1f)
                             .background(Color.Green)
                             .fillMaxSize()
                     )
@@ -1579,13 +1442,10 @@
                         exit = ExitTransition.None
                     ) {
                         Box(
-                            Modifier
-                                .fillMaxSize()
-                                .wrapContentSize(align = Alignment.BottomEnd),
+                            Modifier.fillMaxSize().wrapContentSize(align = Alignment.BottomEnd),
                         ) {
                             Box(
-                                Modifier
-                                    .sharedBounds(
+                                Modifier.sharedBounds(
                                         rememberSharedContentState(key = "child"),
                                         this@AnimatedVisibility
                                     )
@@ -1600,8 +1460,7 @@
                         exit = ExitTransition.None
                     ) {
                         Box(
-                            Modifier
-                                .sharedBounds(
+                            Modifier.sharedBounds(
                                     rememberSharedContentState(key = "child"),
                                     this@AnimatedVisibility,
                                 )
@@ -1643,9 +1502,7 @@
                 assertExists("Error: Node doesn't exist")
                 captureToImage().run {
                     // Check clipping
-                    assertPixels {
-                        Color.Green
-                    }
+                    assertPixels { Color.Green }
                 }
             }
             rule.waitForIdle()
@@ -1662,17 +1519,11 @@
 
         var clippedParentSharedContentState: SharedTransitionScope.SharedContentState? = null
         var clippedChildSharedContentState: SharedTransitionScope.SharedContentState? = null
-        val predefinedPath = Path().apply {
-            addRect(Rect(5f, 5f, 6f, 6f))
-        }
+        val predefinedPath = Path().apply { addRect(Rect(5f, 5f, 6f, 6f)) }
 
         rule.setContent {
             CompositionLocalProvider(LocalDensity provides Density(1f)) {
-                SharedTransitionLayout(
-                    Modifier
-                        .requiredSize(100.dp)
-                        .background(Color.White)
-                ) {
+                SharedTransitionLayout(Modifier.requiredSize(100.dp).background(Color.White)) {
                     transitionScope = this
                     AnimatedVisibility(
                         visible = visible,
@@ -1680,8 +1531,7 @@
                         exit = ExitTransition.None
                     ) {
                         Box(
-                            Modifier
-                                .sharedBounds(
+                            Modifier.sharedBounds(
                                     rememberSharedContentState(key = "parent").also {
                                         parentSharedContentState = it
                                     },
@@ -1691,8 +1541,7 @@
                             contentAlignment = Alignment.Center
                         ) {
                             Box(
-                                Modifier
-                                    .fillMaxSize(0.5f)
+                                Modifier.fillMaxSize(0.5f)
                                     .sharedElement(
                                         rememberSharedContentState(key = "child").also {
                                             childSharedContentState = it
@@ -1703,36 +1552,33 @@
                         }
                     }
                     AnimatedVisibility(
-                        modifier = Modifier
-                            .fillMaxSize(0.5f)
-                            .offset(x = 25.dp, y = 25.dp),
+                        modifier = Modifier.fillMaxSize(0.5f).offset(x = 25.dp, y = 25.dp),
                         visible = !visible,
                         enter = fadeIn(tween(100)),
                         exit = ExitTransition.None
                     ) {
                         Box(
-                            Modifier
-                                .offset(20.dp)
+                            Modifier.offset(20.dp)
                                 .sharedBounds(
                                     rememberSharedContentState(key = "parent").also {
                                         clippedParentSharedContentState = it
                                     },
                                     this@AnimatedVisibility,
-                                    clipInOverlayDuringTransition = object :
-                                        SharedTransitionScope.OverlayClip {
-                                        override fun getClipPath(
-                                            state: SharedTransitionScope.SharedContentState,
-                                            bounds: Rect,
-                                            layoutDirection: LayoutDirection,
-                                            density: Density
-                                        ): Path? {
-                                            return predefinedPath
+                                    clipInOverlayDuringTransition =
+                                        object : SharedTransitionScope.OverlayClip {
+                                            override fun getClipPath(
+                                                state: SharedTransitionScope.SharedContentState,
+                                                bounds: Rect,
+                                                layoutDirection: LayoutDirection,
+                                                density: Density
+                                            ): Path? {
+                                                return predefinedPath
+                                            }
                                         }
-                                    }
-                                )) {
+                                )
+                        ) {
                             Box(
-                                Modifier
-                                    .offset(-20.dp)
+                                Modifier.offset(-20.dp)
                                     .sharedElement(
                                         rememberSharedContentState(key = "child").also {
                                             clippedChildSharedContentState = it
@@ -1785,11 +1631,7 @@
 
         rule.setContent {
             CompositionLocalProvider(LocalDensity provides Density(1f)) {
-                SharedTransitionLayout(
-                    Modifier
-                        .requiredSize(100.dp)
-                        .background(Color.White)
-                ) {
+                SharedTransitionLayout(Modifier.requiredSize(100.dp).background(Color.White)) {
                     transitionScope = this
                     AnimatedVisibility(
                         visible = visible,
@@ -1797,8 +1639,7 @@
                         exit = ExitTransition.None
                     ) {
                         Box(
-                            Modifier
-                                .sharedBounds(
+                            Modifier.sharedBounds(
                                     rememberSharedContentState(key = "parent").also {
                                         parentSharedContentState = it
                                     },
@@ -1808,8 +1649,7 @@
                             contentAlignment = Alignment.Center
                         ) {
                             Box(
-                                Modifier
-                                    .fillMaxSize(0.5f)
+                                Modifier.fillMaxSize(0.5f)
                                     .sharedElement(
                                         rememberSharedContentState(key = "child").also {
                                             childSharedContentState = it
@@ -1820,16 +1660,13 @@
                         }
                     }
                     AnimatedVisibility(
-                        modifier = Modifier
-                            .fillMaxSize(0.5f)
-                            .offset(x = 25.dp, y = 25.dp),
+                        modifier = Modifier.fillMaxSize(0.5f).offset(x = 25.dp, y = 25.dp),
                         visible = !visible,
                         enter = fadeIn(tween(100)),
                         exit = ExitTransition.None
                     ) {
                         Box(
-                            Modifier
-                                .offset(20.dp)
+                            Modifier.offset(20.dp)
                                 .sharedBounds(
                                     rememberSharedContentState(key = "parent").also {
                                         clippedParentSharedContentState = it
@@ -1838,8 +1675,7 @@
                                 )
                         ) {
                             Box(
-                                Modifier
-                                    .offset(-20.dp)
+                                Modifier.offset(-20.dp)
                                     .sharedElement(
                                         rememberSharedContentState(key = "child").also {
                                             clippedChildSharedContentState = it
@@ -1899,23 +1735,20 @@
         var transition: Transition<*>? = null
 
         rule.setContent {
-            SharedTransitionLayout(
-                Modifier
-                    .testTag("scope")
-                    .background(Color.White)
-            ) {
+            SharedTransitionLayout(Modifier.testTag("scope").background(Color.White)) {
                 CompositionLocalProvider(LocalDensity provides Density(1f)) {
-                    AnimatedContent(isSquare,
-                        transitionSpec =
-                        { EnterTransition.None togetherWith ExitTransition.None using null }
+                    AnimatedContent(
+                        isSquare,
+                        transitionSpec = {
+                            EnterTransition.None togetherWith ExitTransition.None using null
+                        }
                     ) { isSquare ->
                         if (this.transition.targetState == EnterExitState.Visible) {
                             transition = this.transition
                         }
                         if (isSquare) {
                             Box(
-                                Modifier
-                                    .sharedBounds(
+                                Modifier.sharedBounds(
                                         rememberSharedContentState(key = "test"),
                                         this,
                                         enter = EnterTransition.None,
@@ -1929,8 +1762,7 @@
                             )
                         } else {
                             Box(
-                                Modifier
-                                    .sharedBounds(
+                                Modifier.sharedBounds(
                                         rememberSharedContentState(key = "test"),
                                         this,
                                         enter = EnterTransition.None,
@@ -1951,11 +1783,7 @@
         rule.waitForIdle()
         rule.onNodeWithTag("scope").run {
             assertExists("Error: Node doesn't exist")
-            captureToImage().run {
-                assertPixels {
-                    Color.Red
-                }
-            }
+            captureToImage().run { assertPixels { Color.Red } }
         }
         rule.mainClock.autoAdvance = false
         isSquare = false
@@ -1982,16 +1810,13 @@
                         assertPixels { (x, y) ->
                             val greyMin = width / 2 - height / 8
                             val greyMax = width / 2 + height / 8
-                            if (x > greyMin + tolerance &&
-                                x < greyMax - tolerance
-                            ) {
+                            if (x > greyMin + tolerance && x < greyMax - tolerance) {
                                 Color.Gray
-                            } else if (x < greyMin - tolerance ||
-                                x > greyMax + tolerance
-                            ) {
+                            } else if (x < greyMin - tolerance || x > greyMax + tolerance) {
                                 // This should be either red or white depending on height
-                                if (y > height / 2f - width / 2f + tolerance &&
-                                    y < height / 2f + width / 2f - tolerance
+                                if (
+                                    y > height / 2f - width / 2f + tolerance &&
+                                        y < height / 2f + width / 2f - tolerance
                                 ) {
                                     Color.Red
                                 } else null
@@ -2012,23 +1837,20 @@
         var transition: Transition<*>? = null
 
         rule.setContent {
-            SharedTransitionLayout(
-                Modifier
-                    .testTag("scope")
-                    .background(Color.White)
-            ) {
+            SharedTransitionLayout(Modifier.testTag("scope").background(Color.White)) {
                 CompositionLocalProvider(LocalDensity provides Density(1f)) {
-                    AnimatedContent(isSquare,
-                        transitionSpec =
-                        { EnterTransition.None togetherWith ExitTransition.None using null }
+                    AnimatedContent(
+                        isSquare,
+                        transitionSpec = {
+                            EnterTransition.None togetherWith ExitTransition.None using null
+                        }
                     ) { isSquare ->
                         if (this.transition.targetState == EnterExitState.Visible) {
                             transition = this.transition
                         }
                         if (isSquare) {
                             Box(
-                                Modifier
-                                    .sharedBounds(
+                                Modifier.sharedBounds(
                                         rememberSharedContentState(key = "test"),
                                         this,
                                         EnterTransition.None,
@@ -2042,8 +1864,7 @@
                             )
                         } else {
                             Box(
-                                Modifier
-                                    .sharedBounds(
+                                Modifier.sharedBounds(
                                         rememberSharedContentState(key = "test"),
                                         this,
                                         EnterTransition.None,
@@ -2064,11 +1885,7 @@
         rule.waitForIdle()
         rule.onNodeWithTag("scope").run {
             assertExists("Error: Node doesn't exist")
-            captureToImage().run {
-                assertPixels {
-                    Color.Red
-                }
-            }
+            captureToImage().run { assertPixels { Color.Red } }
         }
         rule.mainClock.autoAdvance = false
         isSquare = false
@@ -2089,9 +1906,7 @@
                     captureToImage().run {
                         assertEquals(expectedBoundsWidth.roundToInt(), width)
                         assertEquals(expectedBoundsHeight.roundToInt(), height)
-                        assertPixels {
-                            Color.Gray
-                        }
+                        assertPixels { Color.Gray }
                     }
                 }
                 rule.mainClock.advanceTimeByFrame()
@@ -2118,9 +1933,7 @@
                     captureToImage().run {
                         assertEquals(expectedBoundsWidth.roundToInt(), width)
                         assertEquals(expectedBoundsHeight.roundToInt(), height)
-                        assertPixels {
-                            Color.Red
-                        }
+                        assertPixels { Color.Red }
                     }
                 }
                 rule.mainClock.advanceTimeByFrame()
@@ -2136,30 +1949,26 @@
         var transition: Transition<*>? = null
 
         rule.setContent {
-            SharedTransitionLayout(
-                Modifier
-                    .testTag("scope")
-                    .background(Color.White)
-            ) {
+            SharedTransitionLayout(Modifier.testTag("scope").background(Color.White)) {
                 CompositionLocalProvider(LocalDensity provides Density(1f)) {
-                    AnimatedContent(isSquare,
-                        transitionSpec =
-                        { EnterTransition.None togetherWith ExitTransition.None using null }
+                    AnimatedContent(
+                        isSquare,
+                        transitionSpec = {
+                            EnterTransition.None togetherWith ExitTransition.None using null
+                        }
                     ) { isSquare ->
                         if (this.transition.targetState == EnterExitState.Visible) {
                             transition = this.transition
                         }
                         if (isSquare) {
                             Box(
-                                Modifier
-                                    .sharedBounds(
+                                Modifier.sharedBounds(
                                         rememberSharedContentState(key = "test"),
                                         this,
                                         EnterTransition.None,
                                         ExitTransition.None,
-                                        resizeMode = ScaleToBounds(
-                                            ContentScale.Fit, Alignment.TopStart
-                                        ),
+                                        resizeMode =
+                                            ScaleToBounds(ContentScale.Fit, Alignment.TopStart),
                                         boundsTransform = boundsTransform,
                                         placeHolderSize = animatedSize
                                     )
@@ -2168,15 +1977,13 @@
                             )
                         } else {
                             Box(
-                                Modifier
-                                    .sharedBounds(
+                                Modifier.sharedBounds(
                                         rememberSharedContentState(key = "test"),
                                         this,
                                         EnterTransition.None,
                                         ExitTransition.None,
-                                        resizeMode = ScaleToBounds(
-                                            ContentScale.Fit, Alignment.BottomStart
-                                        ),
+                                        resizeMode =
+                                            ScaleToBounds(ContentScale.Fit, Alignment.BottomStart),
                                         boundsTransform = boundsTransform,
                                         placeHolderSize = animatedSize
                                     )
@@ -2192,11 +1999,7 @@
         rule.waitForIdle()
         rule.onNodeWithTag("scope").run {
             assertExists("Error: Node doesn't exist")
-            captureToImage().run {
-                assertPixels {
-                    Color.Red
-                }
-            }
+            captureToImage().run { assertPixels { Color.Red } }
         }
         rule.mainClock.autoAdvance = false
         isSquare = false
@@ -2222,15 +2025,11 @@
                         assertEquals(expectedBoundsHeight.roundToInt(), height)
                         assertPixels { (x, y) ->
                             val greyMax = height / 4
-                            if (x >= 0 &&
-                                x < greyMax - tolerance
-                            ) {
+                            if (x >= 0 && x < greyMax - tolerance) {
                                 Color.Gray
                             } else if (x > greyMax + tolerance) {
                                 // This should be either red or white depending on height
-                                if (y > 0 + tolerance &&
-                                    y < width - tolerance
-                                ) {
+                                if (y > 0 + tolerance && y < width - tolerance) {
                                     Color.Red
                                 } else if (y > width + tolerance) {
                                     Color.White
@@ -2254,22 +2053,20 @@
         rule.setContent {
             CompositionLocalProvider(LocalDensity provides Density(1f)) {
                 SharedTransitionLayout(
-                    Modifier
-                        .testTag("scope")
-                        .background(Color.White)
-                        .padding(20.dp)
+                    Modifier.testTag("scope").background(Color.White).padding(20.dp)
                 ) {
-                    AnimatedContent(isSquare,
-                        transitionSpec =
-                        { EnterTransition.None togetherWith ExitTransition.None using null }
+                    AnimatedContent(
+                        isSquare,
+                        transitionSpec = {
+                            EnterTransition.None togetherWith ExitTransition.None using null
+                        }
                     ) { isSquare ->
                         if (this.transition.targetState == EnterExitState.Visible) {
                             transition = this.transition
                         }
                         if (isSquare) {
                             Box(
-                                Modifier
-                                    .sharedBounds(
+                                Modifier.sharedBounds(
                                         rememberSharedContentState(key = "test"),
                                         this,
                                         EnterTransition.None,
@@ -2283,8 +2080,7 @@
                             )
                         } else {
                             Box(
-                                Modifier
-                                    .sharedBounds(
+                                Modifier.sharedBounds(
                                         rememberSharedContentState(key = "test"),
                                         this,
                                         EnterTransition.None,
@@ -2311,8 +2107,7 @@
                         Color.Red
                     } else if (x < 20 || x > width - 20 || y < 20 && y > height - 20) {
                         Color.White
-                    } else
-                        null
+                    } else null
                 }
             }
         }
@@ -2414,20 +2209,17 @@
         val boundsTransform = BoundsTransform { _, _ -> tween(160, easing = LinearEasing) }
         rule.setContent {
             SharedTransitionLayout {
-                AnimatedContent(targetState = showList,
+                AnimatedContent(
+                    targetState = showList,
                     transitionSpec = { fadeIn() togetherWith fadeOut() using null }
                 ) {
                     if (it) {
                         LazyColumn {
                             repeat(5) { id ->
                                 item {
-                                    Box(
-                                        Modifier
-                                            .fillMaxWidth()
-                                    ) {
+                                    Box(Modifier.fillMaxWidth()) {
                                         Box(
-                                            Modifier
-                                                .sharedBounds(
+                                            Modifier.sharedBounds(
                                                     rememberSharedContentState(key = id),
                                                     this@AnimatedContent,
                                                     boundsTransform = boundsTransform,
@@ -2454,8 +2246,7 @@
                     } else {
                         Box(Modifier.fillMaxSize()) {
                             Box(
-                                Modifier
-                                    .sharedBounds(
+                                Modifier.sharedBounds(
                                         rememberSharedContentState(key = selected),
                                         this@AnimatedContent,
                                         boundsTransform = boundsTransform,
@@ -2464,10 +2255,7 @@
                                     .size(100.dp)
                                     .onPlaced {
                                         val matrix = Matrix()
-                                        it.transformFrom(
-                                            it.parentLayoutCoordinates!!,
-                                            matrix
-                                        )
+                                        it.transformFrom(it.parentLayoutCoordinates!!, matrix)
                                         detailScaleX = matrix.values[Matrix.ScaleX]
                                         detailScaleY = matrix.values[Matrix.ScaleY]
                                     }
@@ -2549,19 +2337,17 @@
         var box2Composed: Boolean = false
         rule.setContent {
             SharedTransitionLayout(
-                Modifier
-                    .testTag("scope")
-                    .background(Color.White)
-                    .padding(20.dp)
+                Modifier.testTag("scope").background(Color.White).padding(20.dp)
             ) {
-                AnimatedContent(isSquare,
-                    transitionSpec =
-                    { EnterTransition.None togetherWith ExitTransition.None using null }
+                AnimatedContent(
+                    isSquare,
+                    transitionSpec = {
+                        EnterTransition.None togetherWith ExitTransition.None using null
+                    }
                 ) { isSquare ->
                     if (isSquare) {
                         Box(
-                            Modifier
-                                .sharedBounds(
+                            Modifier.sharedBounds(
                                     rememberSharedContentState(key = "test").also {
                                         if (transition.currentState == transition.targetState) {
                                             assertFalse(it.isMatchFound)
@@ -2582,8 +2368,7 @@
                         }
                         box2Composed = true
                         Box(
-                            Modifier
-                                .sharedBounds(key, this)
+                            Modifier.sharedBounds(key, this)
                                 .size(40.dp, 160.dp)
                                 .background(Color.Gray)
                         )
@@ -2611,21 +2396,16 @@
     @Test
     fun testRandomScrollingWithInterruption() {
         @Suppress("PrimitiveInCollection")
-        val colors = listOf(
-            Color(0xffff6f69),
-            Color(0xffffcc5c),
-            Color(0xff2a9d84),
-            Color(0xff264653)
-        )
+        val colors =
+            listOf(Color(0xffff6f69), Color(0xffffcc5c), Color(0xff2a9d84), Color(0xff264653))
         var state by mutableStateOf<Screen>(Screen.List)
         val lazyListState = LazyListState()
         rule.setContent {
-            SharedTransitionLayout(
-                modifier = Modifier
-                    .fillMaxWidth()
-                    .height(800.dp)
-            ) {
-                AnimatedContent(state, label = "", contentKey = { it.key },
+            SharedTransitionLayout(modifier = Modifier.fillMaxWidth().height(800.dp)) {
+                AnimatedContent(
+                    state,
+                    label = "",
+                    contentKey = { it.key },
                     transitionSpec = {
                         if (initialState == Screen.List) {
                             slideInHorizontally { -it } + fadeIn() togetherWith
@@ -2634,42 +2414,42 @@
                             slideInHorizontally { it } + fadeIn() togetherWith
                                 slideOutHorizontally { -it } + fadeOut()
                         }
-                    }) {
+                    }
+                ) {
                     when (it) {
                         Screen.List -> {
                             LazyColumn(state = lazyListState) {
                                 items(50) { item ->
                                     Row(modifier = Modifier.fillMaxWidth()) {
                                         Box(
-                                            modifier = Modifier
-                                                .size(100.dp)
-                                                .then(
-                                                    Modifier.sharedElement(
-                                                        rememberSharedContentState(
-                                                            key = "item-image$item"
-                                                        ),
-                                                        this@AnimatedContent,
+                                            modifier =
+                                                Modifier.size(100.dp)
+                                                    .then(
+                                                        Modifier.sharedElement(
+                                                            rememberSharedContentState(
+                                                                key = "item-image$item"
+                                                            ),
+                                                            this@AnimatedContent,
+                                                        )
                                                     )
-                                                )
-                                                .background(colors[item % 4]),
+                                                    .background(colors[item % 4]),
                                         )
                                         Spacer(Modifier.size(15.dp))
                                     }
                                 }
                             }
                         }
-
                         is Screen.Details -> {
                             val item = it.item
                             Column(modifier = Modifier.fillMaxSize()) {
                                 Box(
-                                    modifier = Modifier
-                                        .sharedElement(
-                                            rememberSharedContentState(key = "item-image$item"),
-                                            this@AnimatedContent,
-                                        )
-                                        .background(colors[item % 4])
-                                        .fillMaxWidth(),
+                                    modifier =
+                                        Modifier.sharedElement(
+                                                rememberSharedContentState(key = "item-image$item"),
+                                                this@AnimatedContent,
+                                            )
+                                            .background(colors[item % 4])
+                                            .fillMaxWidth(),
                                 )
                             }
                         }
@@ -2690,26 +2470,12 @@
 
         repeat(3) {
             repeat(5) {
-                rule.runOnIdle {
-                    runBlocking {
-                        lazyListState.scrollToItem(40 - it * 10)
-                    }
-                }
+                rule.runOnIdle { runBlocking { lazyListState.scrollToItem(40 - it * 10) } }
             }
             rule.mainClock.advanceTimeByFrame()
-            repeat(10) {
-                rule.runOnIdle {
-                    runBlocking {
-                        lazyListState.scrollToItem(it * 5)
-                    }
-                }
-            }
+            repeat(10) { rule.runOnIdle { runBlocking { lazyListState.scrollToItem(it * 5) } } }
             rule.mainClock.advanceTimeByFrame()
-            rule.runOnIdle {
-                runBlocking {
-                    lazyListState.scrollToItem(0)
-                }
-            }
+            rule.runOnIdle { runBlocking { lazyListState.scrollToItem(0) } }
         }
         rule.mainClock.autoAdvance = false
     }
@@ -2720,12 +2486,8 @@
         val lazyListState = LazyListState()
 
         @Suppress("PrimitiveInCollection")
-        val colors = listOf(
-            Color(0xffff6f69),
-            Color(0xffffcc5c),
-            Color(0xff2a9d84),
-            Color(0xff264653)
-        )
+        val colors =
+            listOf(Color(0xffff6f69), Color(0xffffcc5c), Color(0xff2a9d84), Color(0xff264653))
         rule.setContent {
             SharedTransitionLayout(modifier = Modifier.fillMaxSize()) {
                 LazyColumn(state = lazyListState) {
@@ -2733,17 +2495,17 @@
                         AnimatedVisibility(visible = (state as? Screen.Details)?.item != item) {
                             Row(modifier = Modifier.fillMaxWidth()) {
                                 Box(
-                                    modifier = Modifier
-                                        .size(100.dp)
-                                        .then(
-                                            Modifier.sharedElement(
-                                                rememberSharedContentState(
-                                                    key = "item-image$item"
-                                                ),
-                                                this@AnimatedVisibility,
+                                    modifier =
+                                        Modifier.size(100.dp)
+                                            .then(
+                                                Modifier.sharedElement(
+                                                    rememberSharedContentState(
+                                                        key = "item-image$item"
+                                                    ),
+                                                    this@AnimatedVisibility,
+                                                )
                                             )
-                                        )
-                                        .background(colors[item % 4]),
+                                            .background(colors[item % 4]),
                                 )
                                 Spacer(Modifier.size(15.dp))
                             }
@@ -2756,18 +2518,15 @@
                     if (state is Screen.Details) {
                         item = (state as Screen.Details).item
                     }
-                    Column(
-                        modifier = Modifier
-                            .fillMaxSize()
-                    ) {
+                    Column(modifier = Modifier.fillMaxSize()) {
                         Box(
-                            modifier = Modifier
-                                .sharedElement(
-                                    rememberSharedContentState(key = "item-image$item"),
-                                    this@AnimatedVisibility,
-                                )
-                                .fillMaxWidth()
-                                .background(colors[item!! % 4])
+                            modifier =
+                                Modifier.sharedElement(
+                                        rememberSharedContentState(key = "item-image$item"),
+                                        this@AnimatedVisibility,
+                                    )
+                                    .fillMaxWidth()
+                                    .background(colors[item!! % 4])
                         )
                     }
                 }
@@ -2788,19 +2547,13 @@
         }
 
         repeat(5) {
-            rule.runOnIdle {
-                runBlocking {
-                    lazyListState.scrollToItem(it + 1)
-                }
-            }
+            rule.runOnIdle { runBlocking { lazyListState.scrollToItem(it + 1) } }
             rule.mainClock.advanceTimeByFrame()
         }
         repeat(20) {
             rule.runOnIdle {
                 val id = Random.nextInt(0, 20)
-                runBlocking {
-                    lazyListState.scrollToItem(id)
-                }
+                runBlocking { lazyListState.scrollToItem(id) }
             }
             rule.mainClock.advanceTimeByFrame()
         }
@@ -2823,56 +2576,58 @@
 
     @Test
     fun testScaleToBoundsCaching() {
-        val alignments = listOf(
-            TopStart,
-            TopCenter,
-            TopEnd,
-            CenterStart,
-            Center,
-            CenterEnd,
-            BottomStart,
-            BottomCenter,
-            BottomEnd
-        )
+        val alignments =
+            listOf(
+                TopStart,
+                TopCenter,
+                TopEnd,
+                CenterStart,
+                Center,
+                CenterEnd,
+                BottomStart,
+                BottomCenter,
+                BottomEnd
+            )
 
-        val contentScales = listOf(
-            ContentScale.FillWidth,
-            ContentScale.FillHeight,
-            ContentScale.FillBounds,
-            ContentScale.Fit,
-            ContentScale.Crop,
-            ContentScale.None,
-            ContentScale.Inside
-        )
+        val contentScales =
+            listOf(
+                ContentScale.FillWidth,
+                ContentScale.FillHeight,
+                ContentScale.FillBounds,
+                ContentScale.Fit,
+                ContentScale.Crop,
+                ContentScale.None,
+                ContentScale.Inside
+            )
         var prev: SharedTransitionScope.ResizeMode? = null
         alignments.forEach { alignment ->
             contentScales.forEach { contentScale ->
                 assertTrue(
-                    ScaleToBounds(contentScale, alignment) === ScaleToBounds(
-                        contentScale,
-                        alignment
-                    )
+                    ScaleToBounds(contentScale, alignment) ===
+                        ScaleToBounds(contentScale, alignment)
                 )
                 assertFalse(prev === ScaleToBounds(contentScale, alignment))
                 prev = ScaleToBounds(contentScale, alignment)
             }
         }
 
-        val customAlignment = object : Alignment {
-            override fun align(
-                size: IntSize,
-                space: IntSize,
-                layoutDirection: LayoutDirection
-            ): IntOffset {
-                return Alignment.Center.align(size, space, layoutDirection)
+        val customAlignment =
+            object : Alignment {
+                override fun align(
+                    size: IntSize,
+                    space: IntSize,
+                    layoutDirection: LayoutDirection
+                ): IntOffset {
+                    return Alignment.Center.align(size, space, layoutDirection)
+                }
             }
-        }
 
-        val customContentScale = object : ContentScale {
-            override fun computeScaleFactor(srcSize: Size, dstSize: Size): ScaleFactor {
-                return ContentScale.Crop.computeScaleFactor(srcSize, dstSize)
+        val customContentScale =
+            object : ContentScale {
+                override fun computeScaleFactor(srcSize: Size, dstSize: Size): ScaleFactor {
+                    return ContentScale.Crop.computeScaleFactor(srcSize, dstSize)
+                }
             }
-        }
 
         assertFalse(ScaleToBounds(customContentScale) === ScaleToBounds(customContentScale))
         assertFalse(
diff --git a/compose/animation/animation/src/androidUnitTest/kotlin/androidx/compose/animation/ConverterTest.kt b/compose/animation/animation/src/androidUnitTest/kotlin/androidx/compose/animation/ConverterTest.kt
index 9b384dd..9fb10d5 100644
--- a/compose/animation/animation/src/androidUnitTest/kotlin/androidx/compose/animation/ConverterTest.kt
+++ b/compose/animation/animation/src/androidUnitTest/kotlin/androidx/compose/animation/ConverterTest.kt
@@ -50,16 +50,11 @@
         val converter = (Color.VectorConverter)(ColorSpaces.Srgb)
 
         // Alpha channel above 1.0f clamps to 1.0f and result is red
-        assertEquals(
-            1f,
-            converter.convertFromVector(AnimationVector4D(1.1f, 1f, 0f, 0f)).alpha,
-            0f
-        )
+        assertEquals(1f, converter.convertFromVector(AnimationVector4D(1.1f, 1f, 0f, 0f)).alpha, 0f)
         // Alpha channel below 0.0f clamps to 0.0f and the result is transparent red
         assertEquals(
             0f,
-            converter.convertFromVector(AnimationVector4D(-0.1f, 1f, 0f, 0f))
-                .alpha,
+            converter.convertFromVector(AnimationVector4D(-0.1f, 1f, 0f, 0f)).alpha,
             0f
         )
 
@@ -87,20 +82,17 @@
         val minOkLab = Color(0.0f, -0.5f, -0.5f, 1.0f, ColorSpaces.Oklab).convert(ColorSpaces.Srgb)
         assertEquals(
             minOkLab.red,
-            converter.convertFromVector(AnimationVector4D(1.0f, -3f, -3f, -3f))
-                .red,
+            converter.convertFromVector(AnimationVector4D(1.0f, -3f, -3f, -3f)).red,
             0f
         )
         assertEquals(
             minOkLab.green,
-            converter.convertFromVector(AnimationVector4D(1.0f, -3f, -3f, -3f))
-                .green,
+            converter.convertFromVector(AnimationVector4D(1.0f, -3f, -3f, -3f)).green,
             0f
         )
         assertEquals(
             minOkLab.blue,
-            converter.convertFromVector(AnimationVector4D(1.0f, -3f, -3f, -3f))
-                .blue,
+            converter.convertFromVector(AnimationVector4D(1.0f, -3f, -3f, -3f)).blue,
             0f
         )
     }
@@ -112,9 +104,7 @@
             AnimationVector4D(1f, 2f, 3f, 4f)
         )
         assertEquals(
-            Rect.VectorConverter.convertFromVector(
-                AnimationVector4D(-400f, -300f, -200f, -100f)
-            ),
+            Rect.VectorConverter.convertFromVector(AnimationVector4D(-400f, -300f, -200f, -100f)),
             Rect(-400f, -300f, -200f, -100f)
         )
     }
@@ -136,9 +126,6 @@
             Offset(x, y),
             Offset.VectorConverter.convertFromVector(AnimationVector2D(x, y))
         )
-        assertEquals(
-            AnimationVector2D(x, y),
-            Offset.VectorConverter.convertToVector(Offset(x, y))
-        )
+        assertEquals(AnimationVector2D(x, y), Offset.VectorConverter.convertToVector(Offset(x, y)))
     }
 }
diff --git a/compose/animation/animation/src/commonMain/kotlin/androidx/compose/animation/AnimatedContent.kt b/compose/animation/animation/src/commonMain/kotlin/androidx/compose/animation/AnimatedContent.kt
index e4cfdf2..20a68d3 100644
--- a/compose/animation/animation/src/commonMain/kotlin/androidx/compose/animation/AnimatedContent.kt
+++ b/compose/animation/animation/src/commonMain/kotlin/androidx/compose/animation/AnimatedContent.kt
@@ -72,53 +72,52 @@
 
 /**
  * [AnimatedContent] is a container that automatically animates its content when [targetState]
- * changes. Its [content] for different target states is defined in a mapping between a target
- * state and a composable function.
+ * changes. Its [content] for different target states is defined in a mapping between a target state
+ * and a composable function.
  *
- * **IMPORTANT**: The targetState parameter for the [content] lambda should *always* be
- * taken into account in deciding what composable function to return as the content for that state.
- * This is critical to ensure a successful lookup of all the incoming and outgoing content during
- * content transform.
+ * **IMPORTANT**: The targetState parameter for the [content] lambda should *always* be taken into
+ * account in deciding what composable function to return as the content for that state. This is
+ * critical to ensure a successful lookup of all the incoming and outgoing content during content
+ * transform.
  *
- * When [targetState] changes, content for both new and previous targetState will be
- * looked up through the [content] lambda. They will go through a [ContentTransform] so that
- * the new target content can be animated in while the initial content animates out. Meanwhile the
- * container will animate its size as needed to accommodate the new content, unless
- * [SizeTransform] is set to `null`. Once the [ContentTransform] is finished, the
- * outgoing content will be disposed.
+ * When [targetState] changes, content for both new and previous targetState will be looked up
+ * through the [content] lambda. They will go through a [ContentTransform] so that the new target
+ * content can be animated in while the initial content animates out. Meanwhile the container will
+ * animate its size as needed to accommodate the new content, unless [SizeTransform] is set to
+ * `null`. Once the [ContentTransform] is finished, the outgoing content will be disposed.
  *
  * If [targetState] is expected to mutate frequently and not all mutations should be treated as
  * target state change, consider defining a mapping between [targetState] and a key in [contentKey].
- * As a result, transitions will be triggered when the resulting key changes. In other words,
- * there will be no animation when switching between [targetState]s that share the same same key.
- * By default, the key will be the same as the targetState object.
+ * As a result, transitions will be triggered when the resulting key changes. In other words, there
+ * will be no animation when switching between [targetState]s that share the same same key. By
+ * default, the key will be the same as the targetState object.
  *
  * By default, the [ContentTransform] will be a delayed [fadeIn] of the target content and a delayed
- * [scaleIn] [togetherWith] a [fadeOut] of the initial content, using a [SizeTransform] to
- * animate any size change of the content. This behavior can be customized using [transitionSpec].
- * If desired, different [ContentTransform]s can be defined for different pairs of initial content
- * and target content.
+ * [scaleIn] [togetherWith] a [fadeOut] of the initial content, using a [SizeTransform] to animate
+ * any size change of the content. This behavior can be customized using [transitionSpec]. If
+ * desired, different [ContentTransform]s can be defined for different pairs of initial content and
+ * target content.
  *
- * [AnimatedContent] displays only the content for [targetState] when not animating. However,
- * during the transient content transform, there will be more than one set of content present in
- * the [AnimatedContent] container. It may be sometimes desired to define the positional
- * relationship among the different content and the overlap. This can be achieved by defining
- * [contentAlignment] and [zOrder][ContentTransform.targetContentZIndex]. By default,
- * [contentAlignment] aligns all content to [Alignment.TopStart], and the `zIndex` for all
- * the content is 0f. __Note__: The target content will always be placed last, therefore it will be
- * on top of all the other content unless zIndex is specified.
+ * [AnimatedContent] displays only the content for [targetState] when not animating. However, during
+ * the transient content transform, there will be more than one set of content present in the
+ * [AnimatedContent] container. It may be sometimes desired to define the positional relationship
+ * among the different content and the overlap. This can be achieved by defining [contentAlignment]
+ * and [zOrder][ContentTransform.targetContentZIndex]. By default, [contentAlignment] aligns all
+ * content to [Alignment.TopStart], and the `zIndex` for all the content is 0f. __Note__: The target
+ * content will always be placed last, therefore it will be on top of all the other content unless
+ * zIndex is specified.
  *
- * Different content in [AnimatedContent] will have access to their own
- * [AnimatedContentScope]. This allows content to define more local enter/exit transitions
- * via [AnimatedContentScope.animateEnterExit] and [AnimatedContentScope.transition]. These
- * custom enter/exit animations will be triggered as the content enters/leaves the container.
+ * Different content in [AnimatedContent] will have access to their own [AnimatedContentScope]. This
+ * allows content to define more local enter/exit transitions via
+ * [AnimatedContentScope.animateEnterExit] and [AnimatedContentScope.transition]. These custom
+ * enter/exit animations will be triggered as the content enters/leaves the container.
  *
  * [label] is an optional parameter to differentiate from other animations in Android Studio.
  *
  * @sample androidx.compose.animation.samples.SimpleAnimatedContentSample
  *
- * Below is an example of customizing [transitionSpec] to imply a spatial relationship between
- * the content for different states:
+ * Below is an example of customizing [transitionSpec] to imply a spatial relationship between the
+ * content for different states:
  *
  * @sample androidx.compose.animation.samples.AnimateIncrementDecrementSample
  *
@@ -131,7 +130,7 @@
     modifier: Modifier = Modifier,
     transitionSpec: AnimatedContentTransitionScope<S>.() -> ContentTransform = {
         (fadeIn(animationSpec = tween(220, delayMillis = 90)) +
-            scaleIn(initialScale = 0.92f, animationSpec = tween(220, delayMillis = 90)))
+                scaleIn(initialScale = 0.92f, animationSpec = tween(220, delayMillis = 90)))
             .togetherWith(fadeOut(animationSpec = tween(90)))
     },
     contentAlignment: Alignment = Alignment.TopStart,
@@ -153,32 +152,29 @@
  * [ContentTransform] defines how the target content (i.e. content associated with target state)
  * enters [AnimatedContent] and how the initial content disappears.
  *
- * [targetContentEnter] defines the enter transition for the content associated with the new
- * target state. It can be a combination of [fadeIn], [slideIn]/[slideInHorizontally]
+ * [targetContentEnter] defines the enter transition for the content associated with the new target
+ * state. It can be a combination of [fadeIn], [slideIn]/[slideInHorizontally]
  * /[slideInVertically]/[AnimatedContentTransitionScope.slideIntoContainer], and expand. Similarly,
  * [initialContentExit] supports a combination of [ExitTransition] for animating out the initial
- * content (i.e. outgoing content). If the initial content and target content are of different
- * size, the [sizeTransform] will be triggered unless it's explicitly set to `null`.
+ * content (i.e. outgoing content). If the initial content and target content are of different size,
+ * the [sizeTransform] will be triggered unless it's explicitly set to `null`.
  * [AnimatedContentTransitionScope.slideIntoContainer] and
- * [AnimatedContentTransitionScope.slideOutOfContainer] can
- * provide container-size-aware sliding in from the edge of the container, or sliding out to the
- * edge of the container.
+ * [AnimatedContentTransitionScope.slideOutOfContainer] can provide container-size-aware sliding in
+ * from the edge of the container, or sliding out to the edge of the container.
  *
- * [ContentTransform] supports the zIndex definition when the content enters the
- * [AnimatedContent] container via [targetContentZIndex]. By default, all content has a `0f`
- * zIndex. Among content with the same zIndex, the incoming target content will be on top, as it
- * will be placed last. However, this may not always be desired. zIndex can be specified to change
- * that order. The content with higher zIndex guarantee to be placed on top of content with lower
- * zIndex.
+ * [ContentTransform] supports the zIndex definition when the content enters the [AnimatedContent]
+ * container via [targetContentZIndex]. By default, all content has a `0f` zIndex. Among content
+ * with the same zIndex, the incoming target content will be on top, as it will be placed last.
+ * However, this may not always be desired. zIndex can be specified to change that order. The
+ * content with higher zIndex guarantee to be placed on top of content with lower zIndex.
  *
- * [sizeTransform] manages the expanding and shrinking of the container if there is any size
- * change as new content enters the [AnimatedContent] and old content leaves. Unlike
- * [AnimatedVisibility], for [AnimatedContent] it is generally
- * more predictable to manage the size of the container using [SizeTransform] than influencing the
- * size using [expandIn]/[expandHorizontally]/[shrinkOut], etc for each content.
- * By default, [spring] will be used to animate any size change, and [AnimatedContent] will be
- * clipped to the animated size. Both can be customized by supplying a different [SizeTransform].
- * If no size animation is desired, [sizeTransform] can be set to `null`.
+ * [sizeTransform] manages the expanding and shrinking of the container if there is any size change
+ * as new content enters the [AnimatedContent] and old content leaves. Unlike [AnimatedVisibility],
+ * for [AnimatedContent] it is generally more predictable to manage the size of the container using
+ * [SizeTransform] than influencing the size using [expandIn]/[expandHorizontally]/[shrinkOut], etc
+ * for each content. By default, [spring] will be used to animate any size change, and
+ * [AnimatedContent] will be clipped to the animated size. Both can be customized by supplying a
+ * different [SizeTransform]. If no size animation is desired, [sizeTransform] can be set to `null`.
  *
  * @sample androidx.compose.animation.samples.AnimatedContentTransitionSpecSample
  *
@@ -195,17 +191,17 @@
 ) {
     /**
      * This describes the zIndex of the new target content as it enters the container. It defaults
-     * to 0f. Content with higher zIndex will be drawn over lower `zIndex`ed content. Among
-     * content with the same index, the target content will be placed on top.
+     * to 0f. Content with higher zIndex will be drawn over lower `zIndex`ed content. Among content
+     * with the same index, the target content will be placed on top.
      */
     var targetContentZIndex by mutableFloatStateOf(targetContentZIndex)
 
     /**
      * [sizeTransform] manages the expanding and shrinking of the container if there is any size
-     * change as new content enters the [AnimatedContent] and old content leaves.
-     * By default, [spring] will be used to animate any size change, and [AnimatedContent] will be
-     * clipped to the animated size. Both can be customized by supplying a different [SizeTransform].
-     * If no size animation is desired, [sizeTransform] can be set to `null`.
+     * change as new content enters the [AnimatedContent] and old content leaves. By default,
+     * [spring] will be used to animate any size change, and [AnimatedContent] will be clipped to
+     * the animated size. Both can be customized by supplying a different [SizeTransform]. If no
+     * size animation is desired, [sizeTransform] can be set to `null`.
      */
     var sizeTransform: SizeTransform? = sizeTransform
         internal set
@@ -238,9 +234,7 @@
  * @sample androidx.compose.animation.samples.AnimatedContentTransitionSpecSample
  */
 interface SizeTransform {
-    /**
-     * Whether the content should be clipped using the animated size.
-     */
+    /** Whether the content should be clipped using the animated size. */
     val clip: Boolean
 
     /**
@@ -250,9 +244,7 @@
     fun createAnimationSpec(initialSize: IntSize, targetSize: IntSize): FiniteAnimationSpec<IntSize>
 }
 
-/**
- * Private implementation of SizeTransform interface.
- */
+/** Private implementation of SizeTransform interface. */
 private class SizeTransformImpl(
     override val clip: Boolean = true,
     val sizeAnimationSpec:
@@ -266,8 +258,7 @@
 
 /**
  * This creates a [ContentTransform] using the provided [EnterTransition] and [exit], where the
- * enter and exit transition will be running simultaneously.
- * For example:
+ * enter and exit transition will be running simultaneously. For example:
  *
  * @sample androidx.compose.animation.samples.AnimatedContentTransitionSpecSample
  */
@@ -275,14 +266,14 @@
 
 @ExperimentalAnimationApi
 @Deprecated(
-    "Infix fun EnterTransition.with(ExitTransition) has been renamed to" +
-        " togetherWith", ReplaceWith("togetherWith(exit)")
+    "Infix fun EnterTransition.with(ExitTransition) has been renamed to" + " togetherWith",
+    ReplaceWith("togetherWith(exit)")
 )
 infix fun EnterTransition.with(exit: ExitTransition) = ContentTransform(this, exit)
 
 /**
- * [AnimatedContentTransitionScope] provides functions that are convenient and only applicable in the
- * context of [AnimatedContent], such as [slideIntoContainer] and [slideOutOfContainer].
+ * [AnimatedContentTransitionScope] provides functions that are convenient and only applicable in
+ * the context of [AnimatedContent], such as [slideIntoContainer] and [slideOutOfContainer].
  */
 sealed interface AnimatedContentTransitionScope<S> : Transition.Segment<S> {
     /**
@@ -323,14 +314,14 @@
 
     /**
      * This defines a horizontal/vertical slide-in that is specific to [AnimatedContent] from the
-     * edge of the container. The offset amount is dynamically calculated based on the current
-     * size of the [AnimatedContent] and its content alignment. This offset (may be positive or
-     * negative based on the direction of the slide) is then passed to [initialOffset]. By default,
+     * edge of the container. The offset amount is dynamically calculated based on the current size
+     * of the [AnimatedContent] and its content alignment. This offset (may be positive or negative
+     * based on the direction of the slide) is then passed to [initialOffset]. By default,
      * [initialOffset] will be using the offset calculated from the system to slide the content in.
      * [slideIntoContainer] is a convenient alternative to [slideInHorizontally] and
-     * [slideInVertically] when the incoming and outgoing content
-     * differ in size. Otherwise, it would be equivalent to [slideInHorizontally] and
-     * [slideInVertically] with an offset of the full width/height.
+     * [slideInVertically] when the incoming and outgoing content differ in size. Otherwise, it
+     * would be equivalent to [slideInHorizontally] and [slideInVertically] with an offset of the
+     * full width/height.
      *
      * [towards] specifies the slide direction. Content can be slided into the container towards
      * [SlideDirection.Left], [SlideDirection.Right], [SlideDirection.Up] and [SlideDirection.Down].
@@ -345,21 +336,20 @@
      */
     fun slideIntoContainer(
         towards: SlideDirection,
-        animationSpec: FiniteAnimationSpec<IntOffset> = spring(
-            visibilityThreshold = IntOffset.VisibilityThreshold
-        ),
+        animationSpec: FiniteAnimationSpec<IntOffset> =
+            spring(visibilityThreshold = IntOffset.VisibilityThreshold),
         initialOffset: (offsetForFullSlide: Int) -> Int = { it }
     ): EnterTransition
 
     /**
      * This defines a horizontal/vertical exit transition to completely slide out of the
      * [AnimatedContent] container. The offset amount is dynamically calculated based on the current
-     * size of the [AnimatedContent] and the new target size. This offset gets passed
-     * to [targetOffset] lambda. By default, [targetOffset] uses this offset as is, but it can be
-     * customized to slide a distance based on the offset. [slideOutOfContainer] is a
-     * convenient alternative to [slideOutHorizontally] and [slideOutVertically] when the incoming
-     * and outgoing content differ in size. Otherwise, it would be equivalent to
-     * [slideOutHorizontally] and [slideOutVertically] with an offset of the full width/height.
+     * size of the [AnimatedContent] and the new target size. This offset gets passed to
+     * [targetOffset] lambda. By default, [targetOffset] uses this offset as is, but it can be
+     * customized to slide a distance based on the offset. [slideOutOfContainer] is a convenient
+     * alternative to [slideOutHorizontally] and [slideOutVertically] when the incoming and outgoing
+     * content differ in size. Otherwise, it would be equivalent to [slideOutHorizontally] and
+     * [slideOutVertically] with an offset of the full width/height.
      *
      * [towards] specifies the slide direction. Content can be slided out of the container towards
      * [SlideDirection.Left], [SlideDirection.Right], [SlideDirection.Up] and [SlideDirection.Down].
@@ -374,9 +364,8 @@
      */
     fun slideOutOfContainer(
         towards: SlideDirection,
-        animationSpec: FiniteAnimationSpec<IntOffset> = spring(
-            visibilityThreshold = IntOffset.VisibilityThreshold
-        ),
+        animationSpec: FiniteAnimationSpec<IntOffset> =
+            spring(visibilityThreshold = IntOffset.VisibilityThreshold),
         targetOffset: (offsetForFullSlide: Int) -> Int = { it }
     ): ExitTransition
 
@@ -396,56 +385,48 @@
     val ExitTransition.Companion.KeepUntilTransitionsFinished: ExitTransition
         get() = KeepUntilTransitionsFinished
 
-    /**
-     * This returns the [Alignment] specified on [AnimatedContent].
-     */
+    /** This returns the [Alignment] specified on [AnimatedContent]. */
     val contentAlignment: Alignment
 }
 
-internal class AnimatedContentTransitionScopeImpl<S> internal constructor(
+internal class AnimatedContentTransitionScopeImpl<S>
+internal constructor(
     internal val transition: Transition<S>,
     override var contentAlignment: Alignment,
     internal var layoutDirection: LayoutDirection
 ) : AnimatedContentTransitionScope<S> {
-    /**
-     * Initial state of a Transition Segment. This is the state that transition starts from.
-     */
+    /** Initial state of a Transition Segment. This is the state that transition starts from. */
     override val initialState: S
-        @Suppress("UnknownNullness")
-        get() = transition.segment.initialState
+        @Suppress("UnknownNullness") get() = transition.segment.initialState
 
-    /**
-     * Target state of a Transition Segment. This is the state that transition will end on.
-     */
+    /** Target state of a Transition Segment. This is the state that transition will end on. */
     override val targetState: S
-        @Suppress("UnknownNullness")
-        get() = transition.segment.targetState
+        @Suppress("UnknownNullness") get() = transition.segment.targetState
 
     /**
      * Customizes the [SizeTransform] of a given [ContentTransform]. For example:
      *
      * @sample androidx.compose.animation.samples.AnimatedContentTransitionSpecSample
      */
-    override infix fun ContentTransform.using(sizeTransform: SizeTransform?) = this.apply {
-        this.sizeTransform = sizeTransform
-    }
+    override infix fun ContentTransform.using(sizeTransform: SizeTransform?) =
+        this.apply { this.sizeTransform = sizeTransform }
 
     /**
      * This defines a horizontal/vertical slide-in that is specific to [AnimatedContent] from the
-     * edge of the container. The offset amount is dynamically calculated based on the current
-     * size of the [AnimatedContent] and its content alignment. This offset (may be positive or
-     * negative based on the direction of the slide) is then passed to [initialOffset]. By default,
+     * edge of the container. The offset amount is dynamically calculated based on the current size
+     * of the [AnimatedContent] and its content alignment. This offset (may be positive or negative
+     * based on the direction of the slide) is then passed to [initialOffset]. By default,
      * [initialOffset] will be using the offset calculated from the system to slide the content in.
      * [slideIntoContainer] is a convenient alternative to [slideInHorizontally] and
-     * [slideInVertically] when the incoming and outgoing content
-     * differ in size. Otherwise, it would be equivalent to [slideInHorizontally] and
-     * [slideInVertically] with an offset of the full width/height.
+     * [slideInVertically] when the incoming and outgoing content differ in size. Otherwise, it
+     * would be equivalent to [slideInHorizontally] and [slideInVertically] with an offset of the
+     * full width/height.
      *
      * [towards] specifies the slide direction. Content can be slided into the container towards
      * [AnimatedContentTransitionScope.SlideDirection.Left],
      * [AnimatedContentTransitionScope.SlideDirection.Right],
-     * [AnimatedContentTransitionScope.SlideDirection.Up]
-     * and [AnimatedContentTransitionScope.SlideDirection.Down].
+     * [AnimatedContentTransitionScope.SlideDirection.Up] and
+     * [AnimatedContentTransitionScope.SlideDirection.Down].
      *
      * [animationSpec] defines the animation that will be used to animate the slide-in.
      *
@@ -461,37 +442,40 @@
         initialOffset: (offsetForFullSlide: Int) -> Int
     ): EnterTransition =
         when {
-            towards.isLeft -> slideInHorizontally(animationSpec) {
-                initialOffset.invoke(
-                    currentSize.width - calculateOffset(IntSize(it, it), currentSize).x
-                )
-            }
-
-            towards.isRight -> slideInHorizontally(animationSpec) {
-                initialOffset.invoke(-calculateOffset(IntSize(it, it), currentSize).x - it)
-            }
-
-            towards == Up -> slideInVertically(animationSpec) {
-                initialOffset.invoke(
-                    currentSize.height - calculateOffset(IntSize(it, it), currentSize).y
-                )
-            }
-
-            towards == Down -> slideInVertically(animationSpec) {
-                initialOffset.invoke(-calculateOffset(IntSize(it, it), currentSize).y - it)
-            }
-
+            towards.isLeft ->
+                slideInHorizontally(animationSpec) {
+                    initialOffset.invoke(
+                        currentSize.width - calculateOffset(IntSize(it, it), currentSize).x
+                    )
+                }
+            towards.isRight ->
+                slideInHorizontally(animationSpec) {
+                    initialOffset.invoke(-calculateOffset(IntSize(it, it), currentSize).x - it)
+                }
+            towards == Up ->
+                slideInVertically(animationSpec) {
+                    initialOffset.invoke(
+                        currentSize.height - calculateOffset(IntSize(it, it), currentSize).y
+                    )
+                }
+            towards == Down ->
+                slideInVertically(animationSpec) {
+                    initialOffset.invoke(-calculateOffset(IntSize(it, it), currentSize).y - it)
+                }
             else -> EnterTransition.None
         }
 
     private val AnimatedContentTransitionScope.SlideDirection.isLeft: Boolean
         get() {
-            return this == Left || this == Start && layoutDirection == LayoutDirection.Ltr ||
+            return this == Left ||
+                this == Start && layoutDirection == LayoutDirection.Ltr ||
                 this == End && layoutDirection == LayoutDirection.Rtl
         }
+
     private val AnimatedContentTransitionScope.SlideDirection.isRight: Boolean
         get() {
-            return this == Right || this == Start && layoutDirection == LayoutDirection.Rtl ||
+            return this == Right ||
+                this == Start && layoutDirection == LayoutDirection.Rtl ||
                 this == End && layoutDirection == LayoutDirection.Ltr
         }
 
@@ -502,18 +486,18 @@
     /**
      * This defines a horizontal/vertical exit transition to completely slide out of the
      * [AnimatedContent] container. The offset amount is dynamically calculated based on the current
-     * size of the [AnimatedContent] and the new target size. This offset gets passed
-     * to [targetOffset] lambda. By default, [targetOffset] uses this offset as is, but it can be
-     * customized to slide a distance based on the offset. [slideOutOfContainer] is a
-     * convenient alternative to [slideOutHorizontally] and [slideOutVertically] when the incoming
-     * and outgoing content differ in size. Otherwise, it would be equivalent to
-     * [slideOutHorizontally] and [slideOutVertically] with an offset of the full width/height.
+     * size of the [AnimatedContent] and the new target size. This offset gets passed to
+     * [targetOffset] lambda. By default, [targetOffset] uses this offset as is, but it can be
+     * customized to slide a distance based on the offset. [slideOutOfContainer] is a convenient
+     * alternative to [slideOutHorizontally] and [slideOutVertically] when the incoming and outgoing
+     * content differ in size. Otherwise, it would be equivalent to [slideOutHorizontally] and
+     * [slideOutVertically] with an offset of the full width/height.
      *
      * [towards] specifies the slide direction. Content can be slided out of the container towards
      * [AnimatedContentTransitionScope.SlideDirection.Left],
      * [AnimatedContentTransitionScope.SlideDirection.Right],
-     * [AnimatedContentTransitionScope.SlideDirection.Up]
-     * and [AnimatedContentTransitionScope.SlideDirection.Down].
+     * [AnimatedContentTransitionScope.SlideDirection.Up] and
+     * [AnimatedContentTransitionScope.SlideDirection.Down].
      *
      * [animationSpec] defines the animation that will be used to animate the slide-out.
      *
@@ -530,30 +514,30 @@
     ): ExitTransition {
         return when {
             // Note: targetSize could be 0 for empty composables
-            towards.isLeft -> slideOutHorizontally(animationSpec) {
-                val targetSize = targetSizeMap[transition.targetState]?.value ?: IntSize.Zero
-                targetOffset.invoke(-calculateOffset(IntSize(it, it), targetSize).x - it)
-            }
-
-            towards.isRight -> slideOutHorizontally(animationSpec) {
-                val targetSize = targetSizeMap[transition.targetState]?.value ?: IntSize.Zero
-                targetOffset.invoke(
-                    -calculateOffset(IntSize(it, it), targetSize).x + targetSize.width
-                )
-            }
-
-            towards == Up -> slideOutVertically(animationSpec) {
-                val targetSize = targetSizeMap[transition.targetState]?.value ?: IntSize.Zero
-                targetOffset.invoke(-calculateOffset(IntSize(it, it), targetSize).y - it)
-            }
-
-            towards == Down -> slideOutVertically(animationSpec) {
-                val targetSize = targetSizeMap[transition.targetState]?.value ?: IntSize.Zero
-                targetOffset.invoke(
-                    -calculateOffset(IntSize(it, it), targetSize).y + targetSize.height
-                )
-            }
-
+            towards.isLeft ->
+                slideOutHorizontally(animationSpec) {
+                    val targetSize = targetSizeMap[transition.targetState]?.value ?: IntSize.Zero
+                    targetOffset.invoke(-calculateOffset(IntSize(it, it), targetSize).x - it)
+                }
+            towards.isRight ->
+                slideOutHorizontally(animationSpec) {
+                    val targetSize = targetSizeMap[transition.targetState]?.value ?: IntSize.Zero
+                    targetOffset.invoke(
+                        -calculateOffset(IntSize(it, it), targetSize).x + targetSize.width
+                    )
+                }
+            towards == Up ->
+                slideOutVertically(animationSpec) {
+                    val targetSize = targetSizeMap[transition.targetState]?.value ?: IntSize.Zero
+                    targetOffset.invoke(-calculateOffset(IntSize(it, it), targetSize).y - it)
+                }
+            towards == Down ->
+                slideOutVertically(animationSpec) {
+                    val targetSize = targetSizeMap[transition.targetState]?.value ?: IntSize.Zero
+                    targetOffset.invoke(
+                        -calculateOffset(IntSize(it, it), targetSize).y + targetSize.height
+                    )
+                }
             else -> ExitTransition.None
         }
     }
@@ -569,9 +553,7 @@
 
     @Suppress("ComposableModifierFactory", "ModifierFactoryExtensionFunction")
     @Composable
-    internal fun createSizeAnimationModifier(
-        contentTransform: ContentTransform
-    ): Modifier {
+    internal fun createSizeAnimationModifier(contentTransform: ContentTransform): Modifier {
         var shouldAnimateSize by remember(this) { mutableStateOf(false) }
         val sizeTransform = rememberUpdatedState(contentTransform.sizeTransform)
         if (transition.currentState == transition.targetState) {
@@ -600,6 +582,7 @@
         // isTarget is read during measure. It is necessary to make this a MutableState
         // such that when the target changes, measure is triggered
         var isTarget by mutableStateOf(isTarget)
+
         override fun Density.modifyParentData(parentData: Any?): Any {
             return this@ChildData
         }
@@ -614,15 +597,16 @@
             constraints: Constraints
         ): MeasureResult {
             val placeable = measurable.measure(constraints)
-            val size = sizeAnimation.animate(
-                transitionSpec = {
-                    val initial = targetSizeMap[initialState]?.value ?: IntSize.Zero
-                    val target = targetSizeMap[targetState]?.value ?: IntSize.Zero
-                    sizeTransform.value?.createAnimationSpec(initial, target) ?: spring()
+            val size =
+                sizeAnimation.animate(
+                    transitionSpec = {
+                        val initial = targetSizeMap[initialState]?.value ?: IntSize.Zero
+                        val target = targetSizeMap[targetState]?.value ?: IntSize.Zero
+                        sizeTransform.value?.createAnimationSpec(initial, target) ?: spring()
+                    }
+                ) {
+                    targetSizeMap[it]?.value ?: IntSize.Zero
                 }
-            ) {
-                targetSizeMap[it]?.value ?: IntSize.Zero
-            }
             animatedSize = size
             val measuredSize: IntSize
             if (isLookingAhead) {
@@ -631,9 +615,12 @@
                 measuredSize = size.value
             }
             return layout(measuredSize.width, measuredSize.height) {
-                val offset = contentAlignment.align(
-                    IntSize(placeable.width, placeable.height), measuredSize, LayoutDirection.Ltr
-                )
+                val offset =
+                    contentAlignment.align(
+                        IntSize(placeable.width, placeable.height),
+                        measuredSize,
+                        LayoutDirection.Ltr
+                    )
                 placeable.place(offset)
             }
         }
@@ -646,53 +633,52 @@
  * transition, or to add more enter/exit transition for the content.
  */
 sealed interface AnimatedContentScope : AnimatedVisibilityScope
-private class AnimatedContentScopeImpl internal constructor(
-    animatedVisibilityScope: AnimatedVisibilityScope
-) : AnimatedContentScope, AnimatedVisibilityScope by animatedVisibilityScope
+
+private class AnimatedContentScopeImpl
+internal constructor(animatedVisibilityScope: AnimatedVisibilityScope) :
+    AnimatedContentScope, AnimatedVisibilityScope by animatedVisibilityScope
 
 /**
  * [AnimatedContent] is a container that automatically animates its content when
  * [Transition.targetState] changes. Its [content] for different target states is defined in a
  * mapping between a target state and a composable function.
  *
- * **IMPORTANT**: The targetState parameter for the [content] lambda should *always* be
- * taken into account in deciding what composable function to return as the content for that state.
- * This is critical to ensure a successful lookup of all the incoming and outgoing content during
- * content transform.
+ * **IMPORTANT**: The targetState parameter for the [content] lambda should *always* be taken into
+ * account in deciding what composable function to return as the content for that state. This is
+ * critical to ensure a successful lookup of all the incoming and outgoing content during content
+ * transform.
  *
  * When [Transition.targetState] changes, content for both new and previous targetState will be
- * looked up through the [content] lambda. They will go through a [ContentTransform] so that
- * the new target content can be animated in while the initial content animates out. Meanwhile the
- * container will animate its size as needed to accommodate the new content, unless
- * [SizeTransform] is set to `null`. Once the [ContentTransform] is finished, the
- * outgoing content will be disposed.
+ * looked up through the [content] lambda. They will go through a [ContentTransform] so that the new
+ * target content can be animated in while the initial content animates out. Meanwhile the container
+ * will animate its size as needed to accommodate the new content, unless [SizeTransform] is set to
+ * `null`. Once the [ContentTransform] is finished, the outgoing content will be disposed.
  *
  * If [Transition.targetState] is expected to mutate frequently and not all mutations should be
- * treated as target state change, consider defining a mapping between [Transition.targetState]
- * and a key in [contentKey]. As a result, transitions will be triggered when the resulting key
- * changes. In other words, there will be no animation when switching between
- * [Transition.targetState]s that share the same same key. By default, the key will be the same as
- * the targetState object.
+ * treated as target state change, consider defining a mapping between [Transition.targetState] and
+ * a key in [contentKey]. As a result, transitions will be triggered when the resulting key changes.
+ * In other words, there will be no animation when switching between [Transition.targetState]s that
+ * share the same same key. By default, the key will be the same as the targetState object.
  *
  * By default, the [ContentTransform] will be a delayed [fadeIn] of the target content and a delayed
- * [scaleIn] [togetherWith] a [fadeOut] of the initial content, using a [SizeTransform] to
- * animate any size change of the content. This behavior can be customized using [transitionSpec].
- * If desired, different [ContentTransform]s can be defined for different pairs of initial content
- * and target content.
+ * [scaleIn] [togetherWith] a [fadeOut] of the initial content, using a [SizeTransform] to animate
+ * any size change of the content. This behavior can be customized using [transitionSpec]. If
+ * desired, different [ContentTransform]s can be defined for different pairs of initial content and
+ * target content.
  *
  * [AnimatedContent] displays only the content for [Transition.targetState] when not animating.
  * However, during the transient content transform, there will be more than one sets of content
  * present in the [AnimatedContent] container. It may be sometimes desired to define the positional
  * relationship among different content and the style of overlap. This can be achieved by defining
  * [contentAlignment] and [zOrder][ContentTransform.targetContentZIndex]. By default,
- * [contentAlignment] aligns all content to [Alignment.TopStart], and the `zIndex` for all
- * the content is 0f. __Note__: The target content will always be placed last, therefore it will be
- * on top of all the other content unless zIndex is specified.
+ * [contentAlignment] aligns all content to [Alignment.TopStart], and the `zIndex` for all the
+ * content is 0f. __Note__: The target content will always be placed last, therefore it will be on
+ * top of all the other content unless zIndex is specified.
  *
- * Different content in [AnimatedContent] will have access to their own
- * [AnimatedContentScope]. This allows content to define more local enter/exit transitions
- * via [AnimatedContentScope.animateEnterExit] and [AnimatedContentScope.transition]. These
- * custom enter/exit animations will be triggered as the content enters/leaves the container.
+ * Different content in [AnimatedContent] will have access to their own [AnimatedContentScope]. This
+ * allows content to define more local enter/exit transitions via
+ * [AnimatedContentScope.animateEnterExit] and [AnimatedContentScope.transition]. These custom
+ * enter/exit animations will be triggered as the content enters/leaves the container.
  *
  * @sample androidx.compose.animation.samples.TransitionExtensionAnimatedContentSample
  *
@@ -705,7 +691,7 @@
     modifier: Modifier = Modifier,
     transitionSpec: AnimatedContentTransitionScope<S>.() -> ContentTransform = {
         (fadeIn(animationSpec = tween(220, delayMillis = 90)) +
-            scaleIn(initialScale = 0.92f, animationSpec = tween(220, delayMillis = 90)))
+                scaleIn(initialScale = 0.92f, animationSpec = tween(220, delayMillis = 90)))
             .togetherWith(fadeOut(animationSpec = tween(90)))
     },
     contentAlignment: Alignment = Alignment.TopStart,
@@ -713,9 +699,10 @@
     content: @Composable() AnimatedContentScope.(targetState: S) -> Unit
 ) {
     val layoutDirection = LocalLayoutDirection.current
-    val rootScope = remember(this) {
-        AnimatedContentTransitionScopeImpl(this, contentAlignment, layoutDirection)
-    }
+    val rootScope =
+        remember(this) {
+            AnimatedContentTransitionScopeImpl(this, contentAlignment, layoutDirection)
+        }
     // TODO: remove screen as soon as they are animated out
     val currentlyVisible = remember(this) { mutableStateListOf(currentState) }
     val contentMap = remember(this) { mutableScatterMapOf<S, @Composable() () -> Unit>() }
@@ -776,14 +763,14 @@
                     { it == stateForContent },
                     enter = specOnEnter.targetContentEnter,
                     exit = exit,
-                    modifier = Modifier
-                        .layout { measurable, constraints ->
-                            val placeable = measurable.measure(constraints)
-                            layout(placeable.width, placeable.height) {
-                                placeable.place(0, 0, zIndex = specOnEnter.targetContentZIndex)
+                    modifier =
+                        Modifier.layout { measurable, constraints ->
+                                val placeable = measurable.measure(constraints)
+                                layout(placeable.width, placeable.height) {
+                                    placeable.place(0, 0, zIndex = specOnEnter.targetContentZIndex)
+                                }
                             }
-                        }
-                        .then(childData.apply { isTarget = stateForContent == targetState }),
+                            .then(childData.apply { isTarget = stateForContent == targetState }),
                     shouldDisposeBlock = { currentState, targetState ->
                         currentState == EnterExitState.PostExit &&
                             targetState == EnterExitState.PostExit &&
@@ -799,9 +786,7 @@
                     }
                     rootScope.targetSizeMap[stateForContent] =
                         (this as AnimatedVisibilityScopeImpl).targetSize
-                    with(remember { AnimatedContentScopeImpl(this) }) {
-                        content(stateForContent)
-                    }
+                    with(remember { AnimatedContentScopeImpl(this) }) { content(stateForContent) }
                 }
             }
         }
@@ -811,11 +796,7 @@
     Layout(
         modifier = modifier.then(sizeModifier),
         content = {
-            currentlyVisible.fastForEach {
-                key(contentKey(it)) {
-                    contentMap[it]?.invoke()
-                }
-            }
+            currentlyVisible.fastForEach { key(contentKey(it)) { contentMap[it]?.invoke() } }
         },
         measurePolicy = remember { AnimatedContentMeasurePolicy(rootScope) }
     )
@@ -831,12 +812,14 @@
         var targetSize = IntSize.Zero
         // Measure the target composable first (but place it on top unless zIndex is specified)
         measurables.fastForEachIndexed { index, measurable ->
-            if ((measurable.parentData as? AnimatedContentTransitionScopeImpl.ChildData)
+            if (
+                (measurable.parentData as? AnimatedContentTransitionScopeImpl.ChildData)
                     ?.isTarget == true
             ) {
-                placeables[index] = measurable.measure(constraints).also {
-                    targetSize = IntSize(it.width, it.height)
-                }
+                placeables[index] =
+                    measurable.measure(constraints).also {
+                        targetSize = IntSize(it.width, it.height)
+                    }
             }
         }
         // Measure the non-target composables after target, since these have no impact on
@@ -846,16 +829,18 @@
                 placeables[index] = measurable.measure(constraints)
             }
         }
-        val maxWidth: Int = if (isLookingAhead) {
-            targetSize.width
-        } else {
-            placeables.maxByOrNull { it?.width ?: 0 }?.width ?: 0
-        }
-        val maxHeight = if (isLookingAhead) {
-            targetSize.height
-        } else {
-            placeables.maxByOrNull { it?.height ?: 0 }?.height ?: 0
-        }
+        val maxWidth: Int =
+            if (isLookingAhead) {
+                targetSize.width
+            } else {
+                placeables.maxByOrNull { it?.width ?: 0 }?.width ?: 0
+            }
+        val maxHeight =
+            if (isLookingAhead) {
+                targetSize.height
+            } else {
+                placeables.maxByOrNull { it?.height ?: 0 }?.height ?: 0
+            }
         if (!isLookingAhead) {
             // update currently measured size only during approach
             rootScope.measuredSize = IntSize(maxWidth, maxHeight)
@@ -865,11 +850,12 @@
         return layout(maxWidth, maxHeight) {
             placeables.forEach { placeable ->
                 placeable?.let {
-                    val offset = rootScope.contentAlignment.align(
-                        IntSize(it.width, it.height),
-                        IntSize(maxWidth, maxHeight),
-                        LayoutDirection.Ltr
-                    )
+                    val offset =
+                        rootScope.contentAlignment.align(
+                            IntSize(it.width, it.height),
+                            IntSize(maxWidth, maxHeight),
+                            LayoutDirection.Ltr
+                        )
                     it.place(offset.x, offset.y)
                 }
             }
diff --git a/compose/animation/animation/src/commonMain/kotlin/androidx/compose/animation/AnimatedVisibility.kt b/compose/animation/animation/src/commonMain/kotlin/androidx/compose/animation/AnimatedVisibility.kt
index 16d9ae7..bf673b2 100644
--- a/compose/animation/animation/src/commonMain/kotlin/androidx/compose/animation/AnimatedVisibility.kt
+++ b/compose/animation/animation/src/commonMain/kotlin/androidx/compose/animation/AnimatedVisibility.kt
@@ -66,34 +66,34 @@
  * does not matter, as the transition animations will start simultaneously. See [EnterTransition]
  * and [ExitTransition] for details on the three types of transition.
  *
- * Aside from these three types of [EnterTransition] and [ExitTransition], [AnimatedVisibility]
- * also supports custom enter/exit animations. Some use cases may benefit from custom enter/exit
+ * Aside from these three types of [EnterTransition] and [ExitTransition], [AnimatedVisibility] also
+ * supports custom enter/exit animations. Some use cases may benefit from custom enter/exit
  * animations on shape, scale, color, etc. Custom enter/exit animations can be created using the
  * `Transition<EnterExitState>` object from the [AnimatedVisibilityScope] (i.e.
  * [AnimatedVisibilityScope.transition]). See the second sample code snippet below for example.
- * These custom animations will be running alongside of the built-in animations specified in
- * [enter] and [exit]. In cases where the enter/exit animation needs to be completely customized,
- * [enter] and/or [exit] can be specified as [EnterTransition.None] and/or [ExitTransition.None]
- * as needed. [AnimatedVisibility] will wait until *all* of enter/exit animations to finish before
- * it considers itself idle. [content] will only be removed after all the (built-in and custom)
- * exit animations have finished.
+ * These custom animations will be running alongside of the built-in animations specified in [enter]
+ * and [exit]. In cases where the enter/exit animation needs to be completely customized, [enter]
+ * and/or [exit] can be specified as [EnterTransition.None] and/or [ExitTransition.None] as needed.
+ * [AnimatedVisibility] will wait until *all* of enter/exit animations to finish before it considers
+ * itself idle. [content] will only be removed after all the (built-in and custom) exit animations
+ * have finished.
  *
- * [AnimatedVisibility] creates a custom [Layout] for its content. The size of the custom
- * layout is determined by the largest width and largest height of the children. All children
- * will be aligned to the top start of the [Layout].
+ * [AnimatedVisibility] creates a custom [Layout] for its content. The size of the custom layout is
+ * determined by the largest width and largest height of the children. All children will be aligned
+ * to the top start of the [Layout].
  *
- * __Note__: Once the exit transition is finished, the [content] composable will be removed
- * from the tree, and disposed. If there's a need to observe the state change of the enter/exit
- * transition and follow up additional action (e.g. remove data, sequential animation, etc),
- * consider the AnimatedVisibility API variant that takes a [MutableTransitionState] parameter.
+ * __Note__: Once the exit transition is finished, the [content] composable will be removed from the
+ * tree, and disposed. If there's a need to observe the state change of the enter/exit transition
+ * and follow up additional action (e.g. remove data, sequential animation, etc), consider the
+ * AnimatedVisibility API variant that takes a [MutableTransitionState] parameter.
  *
- * By default, the enter transition will be a combination of [fadeIn] and [expandIn] of the
- * content from the bottom end. And the exit transition will be shrinking the content towards the
- * bottom end while fading out (i.e. [fadeOut] + [shrinkOut]). The expanding and shrinking will
- * likely also animate the parent and siblings if they rely on the size of appearing/disappearing
- * content. When the [AnimatedVisibility] composable is put in a [Row] or a [Column], the default
- * enter and exit transitions are tailored to that particular container. See
- * [RowScope.AnimatedVisibility] and [ColumnScope.AnimatedVisibility] for details.
+ * By default, the enter transition will be a combination of [fadeIn] and [expandIn] of the content
+ * from the bottom end. And the exit transition will be shrinking the content towards the bottom end
+ * while fading out (i.e. [fadeOut] + [shrinkOut]). The expanding and shrinking will likely also
+ * animate the parent and siblings if they rely on the size of appearing/disappearing content. When
+ * the [AnimatedVisibility] composable is put in a [Row] or a [Column], the default enter and exit
+ * transitions are tailored to that particular container. See [RowScope.AnimatedVisibility] and
+ * [ColumnScope.AnimatedVisibility] for details.
  *
  * Here are two examples of [AnimatedVisibility]: one using the built-in enter/exit transition, the
  * other using a custom enter/exit animation.
@@ -108,11 +108,10 @@
  * @param visible defines whether the content should be visible
  * @param modifier modifier for the [Layout] created to contain the [content]
  * @param enter EnterTransition(s) used for the appearing animation, fading in while expanding by
- *              default
- * @param exit ExitTransition(s) used for the disappearing animation, fading out while
- *             shrinking by default
+ *   default
+ * @param exit ExitTransition(s) used for the disappearing animation, fading out while shrinking by
+ *   default
  * @param content Content to appear or disappear based on the value of [visible]
- *
  * @see EnterTransition
  * @see ExitTransition
  * @see fadeIn
@@ -135,57 +134,56 @@
 }
 
 /**
- * [RowScope.AnimatedVisibility] composable animates the appearance and disappearance of its
- * content when the [AnimatedVisibility] is in a [Row]. The default animations are tailored
- * specific to the [Row] layout. See more details below.
+ * [RowScope.AnimatedVisibility] composable animates the appearance and disappearance of its content
+ * when the [AnimatedVisibility] is in a [Row]. The default animations are tailored specific to the
+ * [Row] layout. See more details below.
  *
- * Different [EnterTransition]s and [ExitTransition]s can be defined in
- * [enter] and [exit] for the appearance and disappearance animation. There are 4 types of
- * [EnterTransition] and [ExitTransition]: Fade, Expand/Shrink, Scale, and Slide. The enter
- * transitions can be combined using `+`. Same for exit transitions. The order of the combination
- * does not matter, as the transition animations will start simultaneously. See [EnterTransition]
- * and [ExitTransition] for details on the three types of transition.
+ * Different [EnterTransition]s and [ExitTransition]s can be defined in [enter] and [exit] for the
+ * appearance and disappearance animation. There are 4 types of [EnterTransition] and
+ * [ExitTransition]: Fade, Expand/Shrink, Scale, and Slide. The enter transitions can be combined
+ * using `+`. Same for exit transitions. The order of the combination does not matter, as the
+ * transition animations will start simultaneously. See [EnterTransition] and [ExitTransition] for
+ * details on the three types of transition.
  *
  * The default [enter] and [exit] transition is configured based on the horizontal layout of a
  * [Row]. [enter] defaults to a combination of fading in and expanding the content horizontally.
- * (The end of the content will be the leading edge as the content expands to its
- * full width.) And [exit] defaults to shrinking the content horizontally with the end of the
- * content being the leading edge while fading out. The expanding and shrinking will likely also
- * animate the parent and siblings in the row since they rely on the size of appearing/disappearing
- * content.
+ * (The end of the content will be the leading edge as the content expands to its full width.) And
+ * [exit] defaults to shrinking the content horizontally with the end of the content being the
+ * leading edge while fading out. The expanding and shrinking will likely also animate the parent
+ * and siblings in the row since they rely on the size of appearing/disappearing content.
  *
- * Aside from these three types of [EnterTransition] and [ExitTransition], [AnimatedVisibility]
- * also supports custom enter/exit animations. Some use cases may benefit from custom enter/exit
+ * Aside from these three types of [EnterTransition] and [ExitTransition], [AnimatedVisibility] also
+ * supports custom enter/exit animations. Some use cases may benefit from custom enter/exit
  * animations on shape, scale, color, etc. Custom enter/exit animations can be created using the
  * `Transition<EnterExitState>` object from the [AnimatedVisibilityScope] (i.e.
  * [AnimatedVisibilityScope.transition]). See [EnterExitState] for an example of custom animations.
  * These custom animations will be running along side of the built-in animations specified in
  * [enter] and [exit]. In cases where the enter/exit animation needs to be completely customized,
- * [enter] and/or [exit] can be specified as [EnterTransition.None] and/or [ExitTransition.None]
- * as needed. [AnimatedVisibility] will wait until *all* of enter/exit animations to finish
- * before it considers itself idle. [content] will only be removed after all the (built-in and
- * custom) exit animations have finished.
+ * [enter] and/or [exit] can be specified as [EnterTransition.None] and/or [ExitTransition.None] as
+ * needed. [AnimatedVisibility] will wait until *all* of enter/exit animations to finish before it
+ * considers itself idle. [content] will only be removed after all the (built-in and custom) exit
+ * animations have finished.
  *
- * [AnimatedVisibility] creates a custom [Layout] for its content. The size of the custom
- * layout is determined by the largest width and largest height of the children. All children
- * will be aligned to the top start of the [Layout].
+ * [AnimatedVisibility] creates a custom [Layout] for its content. The size of the custom layout is
+ * determined by the largest width and largest height of the children. All children will be aligned
+ * to the top start of the [Layout].
  *
- * __Note__: Once the exit transition is finished, the [content] composable will be removed
- * from the tree, and disposed. If there's a need to observe the state change of the enter/exit
- * transition and follow up additional action (e.g. remove data, sequential animation, etc),
- * consider the AnimatedVisibility API variant that takes a [MutableTransitionState] parameter.
+ * __Note__: Once the exit transition is finished, the [content] composable will be removed from the
+ * tree, and disposed. If there's a need to observe the state change of the enter/exit transition
+ * and follow up additional action (e.g. remove data, sequential animation, etc), consider the
+ * AnimatedVisibility API variant that takes a [MutableTransitionState] parameter.
  *
  * Here's an example of using [RowScope.AnimatedVisibility] in a [Row]:
+ *
  * @sample androidx.compose.animation.samples.AnimatedFloatingActionButton
  *
  * @param visible defines whether the content should be visible
  * @param modifier modifier for the [Layout] created to contain the [content]
  * @param enter EnterTransition(s) used for the appearing animation, fading in while expanding
- *              horizontally by default
- * @param exit ExitTransition(s) used for the disappearing animation, fading out while
- *             shrinking horizontally by default
+ *   horizontally by default
+ * @param exit ExitTransition(s) used for the disappearing animation, fading out while shrinking
+ *   horizontally by default
  * @param content Content to appear or disappear based on the value of [visible]
- *
  * @see EnterTransition
  * @see ExitTransition
  * @see fadeIn
@@ -214,12 +212,12 @@
  * content when the [AnimatedVisibility] is in a [Column]. The default animations are tailored
  * specific to the [Column] layout. See more details below.
  *
- * Different [EnterTransition]s and [ExitTransition]s can be defined in
- * [enter] and [exit] for the appearance and disappearance animation. There are 4 types of
- * [EnterTransition] and [ExitTransition]: Fade, Expand/Shrink, Scale and Slide. The enter
- * transitions can be combined using `+`. Same for exit transitions. The order of the combination
- * does not matter, as the transition animations will start simultaneously. See [EnterTransition]
- * and [ExitTransition] for details on the three types of transition.
+ * Different [EnterTransition]s and [ExitTransition]s can be defined in [enter] and [exit] for the
+ * appearance and disappearance animation. There are 4 types of [EnterTransition] and
+ * [ExitTransition]: Fade, Expand/Shrink, Scale and Slide. The enter transitions can be combined
+ * using `+`. Same for exit transitions. The order of the combination does not matter, as the
+ * transition animations will start simultaneously. See [EnterTransition] and [ExitTransition] for
+ * details on the three types of transition.
  *
  * The default [enter] and [exit] transition is configured based on the vertical layout of a
  * [Column]. [enter] defaults to a combination of fading in and expanding the content vertically.
@@ -228,38 +226,38 @@
  * the leading edge while fading out. The expanding and shrinking will likely also animate the
  * parent and siblings in the column since they rely on the size of appearing/disappearing content.
  *
- * Aside from these three types of [EnterTransition] and [ExitTransition], [AnimatedVisibility]
- * also supports custom enter/exit animations. Some use cases may benefit from custom enter/exit
+ * Aside from these three types of [EnterTransition] and [ExitTransition], [AnimatedVisibility] also
+ * supports custom enter/exit animations. Some use cases may benefit from custom enter/exit
  * animations on shape, scale, color, etc. Custom enter/exit animations can be created using the
  * `Transition<EnterExitState>` object from the [AnimatedVisibilityScope] (i.e.
  * [AnimatedVisibilityScope.transition]). See [EnterExitState] for an example of custom animations.
  * These custom animations will be running along side of the built-in animations specified in
  * [enter] and [exit]. In cases where the enter/exit animation needs to be completely customized,
- * [enter] and/or [exit] can be specified as [EnterTransition.None] and/or [ExitTransition.None]
- * as needed. [AnimatedVisibility] will wait until *all* of enter/exit animations to finish
- * before it considers itself idle. [content] will only be removed after all the (built-in and
- * custom) exit animations have finished.
+ * [enter] and/or [exit] can be specified as [EnterTransition.None] and/or [ExitTransition.None] as
+ * needed. [AnimatedVisibility] will wait until *all* of enter/exit animations to finish before it
+ * considers itself idle. [content] will only be removed after all the (built-in and custom) exit
+ * animations have finished.
  *
- * [AnimatedVisibility] creates a custom [Layout] for its content. The size of the custom
- * layout is determined by the largest width and largest height of the children. All children
- * will be aligned to the top start of the [Layout].
+ * [AnimatedVisibility] creates a custom [Layout] for its content. The size of the custom layout is
+ * determined by the largest width and largest height of the children. All children will be aligned
+ * to the top start of the [Layout].
  *
- * __Note__: Once the exit transition is finished, the [content] composable will be removed
- * from the tree, and disposed. If there's a need to observe the state change of the enter/exit
- * transition and follow up additional action (e.g. remove data, sequential animation, etc),
- * consider the AnimatedVisibility API variant that takes a [MutableTransitionState] parameter.
+ * __Note__: Once the exit transition is finished, the [content] composable will be removed from the
+ * tree, and disposed. If there's a need to observe the state change of the enter/exit transition
+ * and follow up additional action (e.g. remove data, sequential animation, etc), consider the
+ * AnimatedVisibility API variant that takes a [MutableTransitionState] parameter.
  *
  * Here's an example of using [ColumnScope.AnimatedVisibility] in a [Column]:
+ *
  * @sample androidx.compose.animation.samples.ColumnAnimatedVisibilitySample
  *
  * @param visible defines whether the content should be visible
  * @param modifier modifier for the [Layout] created to contain the [content]
  * @param enter EnterTransition(s) used for the appearing animation, fading in while expanding
- *              vertically by default
- * @param exit ExitTransition(s) used for the disappearing animation, fading out while
- *             shrinking vertically by default
+ *   vertically by default
+ * @param exit ExitTransition(s) used for the disappearing animation, fading out while shrinking
+ *   vertically by default
  * @param content Content to appear or disappear based on the value of [visible]
- *
  * @see EnterTransition
  * @see ExitTransition
  * @see fadeIn
@@ -283,87 +281,82 @@
 }
 
 /**
- * [EnterExitState] contains the three states that are involved in the enter and exit transition
- * of [AnimatedVisibility]. More specifically, [PreEnter] and [Visible] defines the initial and
- * target state of an *enter* transition, whereas [Visible] and [PostExit] are the initial and
- * target state of an *exit* transition.
+ * [EnterExitState] contains the three states that are involved in the enter and exit transition of
+ * [AnimatedVisibility]. More specifically, [PreEnter] and [Visible] defines the initial and target
+ * state of an *enter* transition, whereas [Visible] and [PostExit] are the initial and target state
+ * of an *exit* transition.
  *
  * See blow for an example of custom enter/exit animation in [AnimatedVisibility] using
  * `Transition<EnterExitState>` (i.e. [AnimatedVisibilityScope.transition]):
  *
  * @sample androidx.compose.animation.samples.AnimatedVisibilityWithBooleanVisibleParamNoReceiver
+ *
  * @see AnimatedVisibility
  */
 enum class EnterExitState {
-    /**
-     * The initial state of a custom enter animation in [AnimatedVisibility]..
-     */
+    /** The initial state of a custom enter animation in [AnimatedVisibility].. */
     PreEnter,
 
     /**
-     * The `Visible` state is the target state of a custom *enter* animation, also the initial
-     * state of a custom *exit* animation in [AnimatedVisibility].
+     * The `Visible` state is the target state of a custom *enter* animation, also the initial state
+     * of a custom *exit* animation in [AnimatedVisibility].
      */
     Visible,
 
-    /**
-     * Target state of a custom *exit* animation in [AnimatedVisibility].
-     */
+    /** Target state of a custom *exit* animation in [AnimatedVisibility]. */
     PostExit
 }
 
 /**
  * [AnimatedVisibility] composable animates the appearance and disappearance of its content, as
  * [visibleState]'s [targetState][MutableTransitionState.targetState] changes. The [visibleState]
- * can also be used to observe the state of [AnimatedVisibility]. For example:
- * `visibleState.isIdle` indicates whether all the animations have finished in [AnimatedVisibility],
- * and `visibleState.currentState` returns the initial state of the current animations.
+ * can also be used to observe the state of [AnimatedVisibility]. For example: `visibleState.isIdle`
+ * indicates whether all the animations have finished in [AnimatedVisibility], and
+ * `visibleState.currentState` returns the initial state of the current animations.
  *
- * Different [EnterTransition]s and [ExitTransition]s can be defined in
- * [enter] and [exit] for the appearance and disappearance animation. There are 4 types of
- * [EnterTransition] and [ExitTransition]: Fade, Expand/Shrink, Scale and Slide. The enter
- * transitions can be combined using `+`. Same for exit transitions. The order of the combination
- * does not matter, as the transition animations will start simultaneously. See [EnterTransition]
- * and [ExitTransition] for details on the three types of transition.
+ * Different [EnterTransition]s and [ExitTransition]s can be defined in [enter] and [exit] for the
+ * appearance and disappearance animation. There are 4 types of [EnterTransition] and
+ * [ExitTransition]: Fade, Expand/Shrink, Scale and Slide. The enter transitions can be combined
+ * using `+`. Same for exit transitions. The order of the combination does not matter, as the
+ * transition animations will start simultaneously. See [EnterTransition] and [ExitTransition] for
+ * details on the three types of transition.
  *
- * Aside from these three types of [EnterTransition] and [ExitTransition], [AnimatedVisibility]
- * also supports custom enter/exit animations. Some use cases may benefit from custom enter/exit
+ * Aside from these three types of [EnterTransition] and [ExitTransition], [AnimatedVisibility] also
+ * supports custom enter/exit animations. Some use cases may benefit from custom enter/exit
  * animations on shape, scale, color, etc. Custom enter/exit animations can be created using the
  * `Transition<EnterExitState>` object from the [AnimatedVisibilityScope] (i.e.
  * [AnimatedVisibilityScope.transition]). See [EnterExitState] for an example of custom animations.
  * These custom animations will be running along side of the built-in animations specified in
  * [enter] and [exit]. In cases where the enter/exit animation needs to be completely customized,
- * [enter] and/or [exit] can be specified as [EnterTransition.None] and/or [ExitTransition.None]
- * as needed. [AnimatedVisibility] will wait until *all* of enter/exit animations to finish
- * before it considers itself idle. [content] will only be removed after all the (built-in and
- * custom) exit animations have finished.
+ * [enter] and/or [exit] can be specified as [EnterTransition.None] and/or [ExitTransition.None] as
+ * needed. [AnimatedVisibility] will wait until *all* of enter/exit animations to finish before it
+ * considers itself idle. [content] will only be removed after all the (built-in and custom) exit
+ * animations have finished.
  *
- * [AnimatedVisibility] creates a custom [Layout] for its content. The size of the custom
- * layout is determined by the largest width and largest height of the children. All children
- * will be aligned to the top start of the [Layout].
+ * [AnimatedVisibility] creates a custom [Layout] for its content. The size of the custom layout is
+ * determined by the largest width and largest height of the children. All children will be aligned
+ * to the top start of the [Layout].
  *
- * __Note__: Once the exit transition is finished, the [content] composable will be removed
- * from the tree, and disposed. Both `currentState` and `targetState` will be `false` for
- * [visibleState].
+ * __Note__: Once the exit transition is finished, the [content] composable will be removed from the
+ * tree, and disposed. Both `currentState` and `targetState` will be `false` for [visibleState].
  *
- * By default, the enter transition will be a combination of [fadeIn] and [expandIn] of the
- * content from the bottom end. And the exit transition will be shrinking the content towards the
- * bottom end while fading out (i.e. [fadeOut] + [shrinkOut]). The expanding and shrinking will
- * likely also animate the parent and siblings if they rely on the size of appearing/disappearing
- * content. When the [AnimatedVisibility] composable is put in a [Row] or a [Column], the default
- * enter and exit transitions are tailored to that particular container. See
- * [RowScope.AnimatedVisibility] and [ColumnScope.AnimatedVisibility] for details.
+ * By default, the enter transition will be a combination of [fadeIn] and [expandIn] of the content
+ * from the bottom end. And the exit transition will be shrinking the content towards the bottom end
+ * while fading out (i.e. [fadeOut] + [shrinkOut]). The expanding and shrinking will likely also
+ * animate the parent and siblings if they rely on the size of appearing/disappearing content. When
+ * the [AnimatedVisibility] composable is put in a [Row] or a [Column], the default enter and exit
+ * transitions are tailored to that particular container. See [RowScope.AnimatedVisibility] and
+ * [ColumnScope.AnimatedVisibility] for details.
  *
  * @sample androidx.compose.animation.samples.AnimatedVisibilityLazyColumnSample
  *
  * @param visibleState defines whether the content should be visible
  * @param modifier modifier for the [Layout] created to contain the [content]
  * @param enter EnterTransition(s) used for the appearing animation, fading in while expanding by
- *              default
- * @param exit ExitTransition(s) used for the disappearing animation, fading out while
- *             shrinking by default
+ *   default
+ * @param exit ExitTransition(s) used for the disappearing animation, fading out while shrinking by
+ *   default
  * @param content Content to appear or disappear based on the value of [visibleState]
- *
  * @see EnterTransition
  * @see ExitTransition
  * @see fadeIn
@@ -388,57 +381,53 @@
 }
 
 /**
- * [RowScope.AnimatedVisibility] composable animates the appearance and disappearance of its
- * content as [visibleState]'s [targetState][MutableTransitionState.targetState] changes. The
- * default [enter] and [exit] transitions are tailored specific to the [Row] layout. See more
- * details below. The [visibleState] can also be used to observe the state of [AnimatedVisibility].
- * For example: `visibleState.isIdle` indicates whether all the animations have finished in
- * [AnimatedVisibility], and `visibleState.currentState` returns the initial state of the current
- * animations.
+ * [RowScope.AnimatedVisibility] composable animates the appearance and disappearance of its content
+ * as [visibleState]'s [targetState][MutableTransitionState.targetState] changes. The default
+ * [enter] and [exit] transitions are tailored specific to the [Row] layout. See more details below.
+ * The [visibleState] can also be used to observe the state of [AnimatedVisibility]. For example:
+ * `visibleState.isIdle` indicates whether all the animations have finished in [AnimatedVisibility],
+ * and `visibleState.currentState` returns the initial state of the current animations.
  *
- * Different [EnterTransition]s and [ExitTransition]s can be defined in
- * [enter] and [exit] for the appearance and disappearance animation. There are 4 types of
- * [EnterTransition] and [ExitTransition]: Fade, Expand/Shrink, Scale and Slide. The enter
- * transitions can be combined using `+`. Same for exit transitions. The order of the combination
- * does not matter, as the transition animations will start simultaneously. See [EnterTransition]
- * and [ExitTransition] for details on the three types of transition.
+ * Different [EnterTransition]s and [ExitTransition]s can be defined in [enter] and [exit] for the
+ * appearance and disappearance animation. There are 4 types of [EnterTransition] and
+ * [ExitTransition]: Fade, Expand/Shrink, Scale and Slide. The enter transitions can be combined
+ * using `+`. Same for exit transitions. The order of the combination does not matter, as the
+ * transition animations will start simultaneously. See [EnterTransition] and [ExitTransition] for
+ * details on the three types of transition.
  *
  * The default [enter] and [exit] transition is configured based on the horizontal layout of a
  * [Row]. [enter] defaults to a combination of fading in and expanding the content horizontally.
- * (The end of the content will be the leading edge as the content expands to its
- * full width.) And [exit] defaults to shrinking the content horizontally with the end of the
- * content being the leading edge while fading out. The expanding and shrinking will likely also
- * animate the parent and siblings in the row since they rely on the size of appearing/disappearing
- * content.
+ * (The end of the content will be the leading edge as the content expands to its full width.) And
+ * [exit] defaults to shrinking the content horizontally with the end of the content being the
+ * leading edge while fading out. The expanding and shrinking will likely also animate the parent
+ * and siblings in the row since they rely on the size of appearing/disappearing content.
  *
- * Aside from these three types of [EnterTransition] and [ExitTransition], [AnimatedVisibility]
- * also supports custom enter/exit animations. Some use cases may benefit from custom enter/exit
+ * Aside from these three types of [EnterTransition] and [ExitTransition], [AnimatedVisibility] also
+ * supports custom enter/exit animations. Some use cases may benefit from custom enter/exit
  * animations on shape, scale, color, etc. Custom enter/exit animations can be created using the
  * `Transition<EnterExitState>` object from the [AnimatedVisibilityScope] (i.e.
  * [AnimatedVisibilityScope.transition]). See [EnterExitState] for an example of custom animations.
  * These custom animations will be running along side of the built-in animations specified in
  * [enter] and [exit]. In cases where the enter/exit animation needs to be completely customized,
- * [enter] and/or [exit] can be specified as [EnterTransition.None] and/or [ExitTransition.None]
- * as needed. [AnimatedVisibility] will wait until *all* of enter/exit animations to finish
- * before it considers itself idle. [content] will only be removed after all the (built-in and
- * custom) exit animations have finished.
+ * [enter] and/or [exit] can be specified as [EnterTransition.None] and/or [ExitTransition.None] as
+ * needed. [AnimatedVisibility] will wait until *all* of enter/exit animations to finish before it
+ * considers itself idle. [content] will only be removed after all the (built-in and custom) exit
+ * animations have finished.
  *
- * [AnimatedVisibility] creates a custom [Layout] for its content. The size of the custom
- * layout is determined by the largest width and largest height of the children. All children
- * will be aligned to the top start of the [Layout].
+ * [AnimatedVisibility] creates a custom [Layout] for its content. The size of the custom layout is
+ * determined by the largest width and largest height of the children. All children will be aligned
+ * to the top start of the [Layout].
  *
- * __Note__: Once the exit transition is finished, the [content] composable will be removed
- * from the tree, and disposed. Both `currentState` and `targetState` will be `false` for
- * [visibleState].
+ * __Note__: Once the exit transition is finished, the [content] composable will be removed from the
+ * tree, and disposed. Both `currentState` and `targetState` will be `false` for [visibleState].
  *
  * @param visibleState defines whether the content should be visible
  * @param modifier modifier for the [Layout] created to contain the [content]
  * @param enter EnterTransition(s) used for the appearing animation, fading in while expanding
- *              vertically by default
- * @param exit ExitTransition(s) used for the disappearing animation, fading out while
- *             shrinking vertically by default
+ *   vertically by default
+ * @param exit ExitTransition(s) used for the disappearing animation, fading out while shrinking
+ *   vertically by default
  * @param content Content to appear or disappear based on the value of [visibleState]
- *
  * @see EnterTransition
  * @see ExitTransition
  * @see fadeIn
@@ -471,12 +460,12 @@
  * [AnimatedVisibility], and `visibleState.currentState` returns the initial state of the current
  * animations.
  *
- * Different [EnterTransition]s and [ExitTransition]s can be defined in
- * [enter] and [exit] for the appearance and disappearance animation. There are 4 types of
- * [EnterTransition] and [ExitTransition]: Fade, Expand/Shrink, Scale and Slide. The enter
- * transitions can be combined using `+`. Same for exit transitions. The order of the combination
- * does not matter, as the transition animations will start simultaneously. See [EnterTransition]
- * and [ExitTransition] for details on the three types of transition.
+ * Different [EnterTransition]s and [ExitTransition]s can be defined in [enter] and [exit] for the
+ * appearance and disappearance animation. There are 4 types of [EnterTransition] and
+ * [ExitTransition]: Fade, Expand/Shrink, Scale and Slide. The enter transitions can be combined
+ * using `+`. Same for exit transitions. The order of the combination does not matter, as the
+ * transition animations will start simultaneously. See [EnterTransition] and [ExitTransition] for
+ * details on the three types of transition.
  *
  * The default [enter] and [exit] transition is configured based on the vertical layout of a
  * [Column]. [enter] defaults to a combination of fading in and expanding the content vertically.
@@ -485,36 +474,34 @@
  * the leading edge while fading out. The expanding and shrinking will likely also animate the
  * parent and siblings in the column since they rely on the size of appearing/disappearing content.
  *
- * Aside from these three types of [EnterTransition] and [ExitTransition], [AnimatedVisibility]
- * also supports custom enter/exit animations. Some use cases may benefit from custom enter/exit
+ * Aside from these three types of [EnterTransition] and [ExitTransition], [AnimatedVisibility] also
+ * supports custom enter/exit animations. Some use cases may benefit from custom enter/exit
  * animations on shape, scale, color, etc. Custom enter/exit animations can be created using the
  * `Transition<EnterExitState>` object from the [AnimatedVisibilityScope] (i.e.
  * [AnimatedVisibilityScope.transition]). See [EnterExitState] for an example of custom animations.
  * These custom animations will be running along side of the built-in animations specified in
  * [enter] and [exit]. In cases where the enter/exit animation needs to be completely customized,
- * [enter] and/or [exit] can be specified as [EnterTransition.None] and/or [ExitTransition.None]
- * as needed. [AnimatedVisibility] will wait until *all* of enter/exit animations to finish
- * before it considers itself idle. [content] will only be removed after all the (built-in and
- * custom) exit animations have finished.
+ * [enter] and/or [exit] can be specified as [EnterTransition.None] and/or [ExitTransition.None] as
+ * needed. [AnimatedVisibility] will wait until *all* of enter/exit animations to finish before it
+ * considers itself idle. [content] will only be removed after all the (built-in and custom) exit
+ * animations have finished.
  *
- * [AnimatedVisibility] creates a custom [Layout] for its content. The size of the custom
- * layout is determined by the largest width and largest height of the children. All children
- * will be aligned to the top start of the [Layout].
+ * [AnimatedVisibility] creates a custom [Layout] for its content. The size of the custom layout is
+ * determined by the largest width and largest height of the children. All children will be aligned
+ * to the top start of the [Layout].
  *
- * __Note__: Once the exit transition is finished, the [content] composable will be removed
- * from the tree, and disposed. Both `currentState` and `targetState` will be `false` for
- * [visibleState].
+ * __Note__: Once the exit transition is finished, the [content] composable will be removed from the
+ * tree, and disposed. Both `currentState` and `targetState` will be `false` for [visibleState].
  *
  * @sample androidx.compose.animation.samples.AVColumnScopeWithMutableTransitionState
  *
  * @param visibleState defines whether the content should be visible
  * @param modifier modifier for the [Layout] created to contain the [content]
  * @param enter EnterTransition(s) used for the appearing animation, fading in while expanding
- *              vertically by default
- * @param exit ExitTransition(s) used for the disappearing animation, fading out while
- *             shrinking vertically by default
+ *   vertically by default
+ * @param exit ExitTransition(s) used for the disappearing animation, fading out while shrinking
+ *   vertically by default
  * @param content Content to appear or disappear based on of [visibleState]
- *
  * @see EnterTransition
  * @see ExitTransition
  * @see fadeIn
@@ -539,58 +526,56 @@
 }
 
 /**
- * This extension function creates an [AnimatedVisibility] composable as a child Transition of
- * the given Transition. This means: 1) the enter/exit transition is now triggered by the provided
+ * This extension function creates an [AnimatedVisibility] composable as a child Transition of the
+ * given Transition. This means: 1) the enter/exit transition is now triggered by the provided
  * [Transition]'s [targetState][Transition.targetState] change. When the targetState changes, the
- * visibility will be derived using the [visible] lambda and [Transition.targetState]. 2)
- * The enter/exit transitions, as well as any custom enter/exit animations defined in
+ * visibility will be derived using the [visible] lambda and [Transition.targetState]. 2) The
+ * enter/exit transitions, as well as any custom enter/exit animations defined in
  * [AnimatedVisibility] are now hoisted to the parent Transition. The parent Transition will wait
- * for all of them to finish before it considers itself finished (i.e. [Transition.currentState]
- * = [Transition.targetState]), and subsequently removes the content in the exit case.
+ * for all of them to finish before it considers itself finished (i.e. [Transition.currentState] =
+ * [Transition.targetState]), and subsequently removes the content in the exit case.
  *
- * Different [EnterTransition]s and [ExitTransition]s can be defined in
- * [enter] and [exit] for the appearance and disappearance animation. There are 4 types of
- * [EnterTransition] and [ExitTransition]: Fade, Expand/Shrink, Scale and Slide. The enter
- * transitions can be combined using `+`. Same for exit transitions. The order of the combination
- * does not matter, as the transition animations will start simultaneously. See [EnterTransition]
- * and [ExitTransition] for details on the three types of transition.
+ * Different [EnterTransition]s and [ExitTransition]s can be defined in [enter] and [exit] for the
+ * appearance and disappearance animation. There are 4 types of [EnterTransition] and
+ * [ExitTransition]: Fade, Expand/Shrink, Scale and Slide. The enter transitions can be combined
+ * using `+`. Same for exit transitions. The order of the combination does not matter, as the
+ * transition animations will start simultaneously. See [EnterTransition] and [ExitTransition] for
+ * details on the three types of transition.
  *
- * Aside from these three types of [EnterTransition] and [ExitTransition], [AnimatedVisibility]
- * also supports custom enter/exit animations. Some use cases may benefit from custom enter/exit
+ * Aside from these three types of [EnterTransition] and [ExitTransition], [AnimatedVisibility] also
+ * supports custom enter/exit animations. Some use cases may benefit from custom enter/exit
  * animations on shape, scale, color, etc. Custom enter/exit animations can be created using the
  * `Transition<EnterExitState>` object from the [AnimatedVisibilityScope] (i.e.
  * [AnimatedVisibilityScope.transition]). See [EnterExitState] for an example of custom animations.
  * These custom animations will be running along side of the built-in animations specified in
  * [enter] and [exit]. In cases where the enter/exit animation needs to be completely customized,
- * [enter] and/or [exit] can be specified as [EnterTransition.None] and/or [ExitTransition.None]
- * as needed. [AnimatedVisibility] will wait until *all* of enter/exit animations to finish
- * before it considers itself idle. [content] will only be removed after all the (built-in and
- * custom) exit animations have finished.
+ * [enter] and/or [exit] can be specified as [EnterTransition.None] and/or [ExitTransition.None] as
+ * needed. [AnimatedVisibility] will wait until *all* of enter/exit animations to finish before it
+ * considers itself idle. [content] will only be removed after all the (built-in and custom) exit
+ * animations have finished.
  *
- * [AnimatedVisibility] creates a custom [Layout] for its content. The size of the custom
- * layout is determined by the largest width and largest height of the children. All children
- * will be aligned to the top start of the [Layout].
+ * [AnimatedVisibility] creates a custom [Layout] for its content. The size of the custom layout is
+ * determined by the largest width and largest height of the children. All children will be aligned
+ * to the top start of the [Layout].
  *
- * __Note__: Once the exit transition is finished, the [content] composable will be removed
- * from the tree, and disposed.
+ * __Note__: Once the exit transition is finished, the [content] composable will be removed from the
+ * tree, and disposed.
  *
- * By default, the enter transition will be a combination of [fadeIn] and [expandIn] of the
- * content from the bottom end. And the exit transition will be shrinking the content towards the
- * bottom end while fading out (i.e. [fadeOut] + [shrinkOut]). The expanding and shrinking will
- * likely also animate the parent and siblings if they rely on the size of appearing/disappearing
- * content.
+ * By default, the enter transition will be a combination of [fadeIn] and [expandIn] of the content
+ * from the bottom end. And the exit transition will be shrinking the content towards the bottom end
+ * while fading out (i.e. [fadeOut] + [shrinkOut]). The expanding and shrinking will likely also
+ * animate the parent and siblings if they rely on the size of appearing/disappearing content.
  *
  * @sample androidx.compose.animation.samples.AddAnimatedVisibilityToGenericTransitionSample
  *
  * @param visible defines whether the content should be visible based on transition state T
  * @param modifier modifier for the [Layout] created to contain the [content]
  * @param enter EnterTransition(s) used for the appearing animation, fading in while expanding
- *              vertically by default
- * @param exit ExitTransition(s) used for the disappearing animation, fading out while
- *             shrinking vertically by default
+ *   vertically by default
+ * @param exit ExitTransition(s) used for the disappearing animation, fading out while shrinking
+ *   vertically by default
  * @param content Content to appear or disappear based on the visibility derived from the
- *                [Transition.targetState] and the provided [visible] lambda
- *
+ *   [Transition.targetState] and the provided [visible] lambda
  * @see EnterTransition
  * @see ExitTransition
  * @see fadeIn
@@ -610,16 +595,16 @@
 ) = AnimatedVisibilityImpl(this, visible, modifier, enter, exit, content = content)
 
 /**
- * This is the scope for the content of [AnimatedVisibility]. In this scope, direct and
- * indirect children of [AnimatedVisibility] will be able to define their own enter/exit
- * transitions using the built-in options via [Modifier.animateEnterExit]. They will also be able
- * define custom enter/exit animations using the [transition] object. [AnimatedVisibility] will
- * ensure both custom and built-in enter/exit animations finish before it considers itself idle,
- * and subsequently removes its content in the case of exit.
+ * This is the scope for the content of [AnimatedVisibility]. In this scope, direct and indirect
+ * children of [AnimatedVisibility] will be able to define their own enter/exit transitions using
+ * the built-in options via [Modifier.animateEnterExit]. They will also be able define custom
+ * enter/exit animations using the [transition] object. [AnimatedVisibility] will ensure both custom
+ * and built-in enter/exit animations finish before it considers itself idle, and subsequently
+ * removes its content in the case of exit.
  *
  * __Note:__ Custom enter/exit animations that are created *independent* of the
- * [AnimatedVisibilityScope.transition] will have no guarantee to finish when
- * exiting, as [AnimatedVisibility] would have no visibility of such animations.
+ * [AnimatedVisibilityScope.transition] will have no guarantee to finish when exiting, as
+ * [AnimatedVisibility] would have no visibility of such animations.
  *
  * @sample androidx.compose.animation.samples.AVScopeAnimateEnterExit
  */
@@ -638,19 +623,19 @@
      * [AnimatedVisibility]'s animation and their own enter/exit animations.
      *
      * [enter] and [exit] defines different [EnterTransition]s and [ExitTransition]s that will be
-     * used for the appearance and disappearance animation. There are 4 types of
-     * [EnterTransition] and [ExitTransition]: Fade, Expand/Shrink, Scale and Slide. The enter
-     * transitions can be combined using `+`. Same for exit transitions. The order of the combination
-     * does not matter, as the transition animations will start simultaneously. See [EnterTransition]
-     * and [ExitTransition] for details on the three types of transition.
+     * used for the appearance and disappearance animation. There are 4 types of [EnterTransition]
+     * and [ExitTransition]: Fade, Expand/Shrink, Scale and Slide. The enter transitions can be
+     * combined using `+`. Same for exit transitions. The order of the combination does not matter,
+     * as the transition animations will start simultaneously. See [EnterTransition] and
+     * [ExitTransition] for details on the three types of transition.
      *
      * By default, the enter transition will be a [fadeIn] of the content. And the exit transition
      * will be fading out the content using [fadeOut].
      *
      * In some cases it may be desirable to have [AnimatedVisibility] apply no animation at all for
      * enter and/or exit, such that children of [AnimatedVisibility] can each have their distinct
-     * animations. To achieve this, [EnterTransition.None] and/or [ExitTransition.None] can be
-     * used for [AnimatedVisibility].
+     * animations. To achieve this, [EnterTransition.None] and/or [ExitTransition.None] can be used
+     * for [AnimatedVisibility].
      *
      * @sample androidx.compose.animation.samples.AnimateEnterExitPartialContent
      */
@@ -658,30 +643,30 @@
         enter: EnterTransition = fadeIn(),
         exit: ExitTransition = fadeOut(),
         label: String = "animateEnterExit"
-    ): Modifier = composed(
-        inspectorInfo = debugInspectorInfo {
-            name = "animateEnterExit"
-            properties["enter"] = enter
-            properties["exit"] = exit
-            properties["label"] = label
+    ): Modifier =
+        composed(
+            inspectorInfo =
+                debugInspectorInfo {
+                    name = "animateEnterExit"
+                    properties["enter"] = enter
+                    properties["exit"] = exit
+                    properties["label"] = label
+                }
+        ) {
+            this.then(transition.createModifier(enter, exit, label = label))
         }
-    ) {
-        this.then(transition.createModifier(enter, exit, label = label))
-    }
 }
 
-internal class AnimatedVisibilityScopeImpl internal constructor(
-    transition: Transition<EnterExitState>
-) : AnimatedVisibilityScope {
+internal class AnimatedVisibilityScopeImpl
+internal constructor(transition: Transition<EnterExitState>) : AnimatedVisibilityScope {
     override var transition = transition
     internal val targetSize = mutableStateOf(IntSize.Zero)
 }
 
 /**
  * RowScope and ColumnScope AnimatedVisibility extensions and AnimatedVisibility without a receiver
- * converge here.
- * AnimatedVisibilityImpl sets up 2 things: 1) It adds a modifier to report 0 size in lookahead
- * when animating out. 2) It sets up a criteria for when content should be disposed.
+ * converge here. AnimatedVisibilityImpl sets up 2 things: 1) It adds a modifier to report 0 size in
+ * lookahead when animating out. 2) It sets up a criteria for when content should be disposed.
  */
 @Composable
 internal fun <T> AnimatedVisibilityImpl(
@@ -695,18 +680,17 @@
     AnimatedEnterExitImpl(
         transition = transition,
         visible = visible,
-        modifier = modifier.layout { measurable, constraints ->
-            val placeable = measurable.measure(constraints)
-            val (w, h) =
-                if (isLookingAhead && !visible(transition.targetState)) {
-                    IntSize.Zero
-                } else {
-                    IntSize(placeable.width, placeable.height)
-                }
-            layout(w, h) {
-                placeable.place(0, 0)
-            }
-        },
+        modifier =
+            modifier.layout { measurable, constraints ->
+                val placeable = measurable.measure(constraints)
+                val (w, h) =
+                    if (isLookingAhead && !visible(transition.targetState)) {
+                        IntSize.Zero
+                    } else {
+                        IntSize(placeable.width, placeable.height)
+                    }
+                layout(w, h) { placeable.place(0, 0) }
+            },
         enter = enter,
         exit = exit,
         shouldDisposeBlock = { current, target -> current == target && target == PostExit },
@@ -714,9 +698,7 @@
     )
 }
 
-/**
- * Observes lookahead size.
- */
+/** Observes lookahead size. */
 internal fun interface OnLookaheadMeasured {
     fun invoke(size: IntSize)
 }
@@ -736,61 +718,58 @@
     onLookaheadMeasured: OnLookaheadMeasured? = null,
     content: @Composable() AnimatedVisibilityScope.() -> Unit
 ) {
-    if (visible(transition.targetState) || visible(transition.currentState) ||
-        transition.isSeeking || transition.hasInitialValueAnimations
+    if (
+        visible(transition.targetState) ||
+            visible(transition.currentState) ||
+            transition.isSeeking ||
+            transition.hasInitialValueAnimations
     ) {
-        val childTransition = transition.createChildTransition(label = "EnterExitTransition") {
-            transition.targetEnterExit(visible, it)
-        }
+        val childTransition =
+            transition.createChildTransition(label = "EnterExitTransition") {
+                transition.targetEnterExit(visible, it)
+            }
 
         val shouldDisposeBlockUpdated by rememberUpdatedState(shouldDisposeBlock)
 
-        val shouldDisposeAfterExit by produceState(
-            initialValue = shouldDisposeBlock(
-                childTransition.currentState,
-                childTransition.targetState
-            )
-        ) {
-            snapshotFlow {
-                childTransition.exitFinished
-            }.collect {
-                value = if (it) {
-                    shouldDisposeBlockUpdated(
-                        childTransition.currentState,
-                        childTransition.targetState
-                    )
-                } else {
-                    false
-                }
+        val shouldDisposeAfterExit by
+            produceState(
+                initialValue =
+                    shouldDisposeBlock(childTransition.currentState, childTransition.targetState)
+            ) {
+                snapshotFlow { childTransition.exitFinished }
+                    .collect {
+                        value =
+                            if (it) {
+                                shouldDisposeBlockUpdated(
+                                    childTransition.currentState,
+                                    childTransition.targetState
+                                )
+                            } else {
+                                false
+                            }
+                    }
             }
-        }
 
         if (!childTransition.exitFinished || !shouldDisposeAfterExit) {
             val scope = remember(transition) { AnimatedVisibilityScopeImpl(childTransition) }
             Layout(
                 content = { scope.content() },
-                modifier = modifier
-                    .then(childTransition
-                        .createModifier(enter, exit, label = "Built-in")
-                        .then(if (onLookaheadMeasured != null) {
-                            Modifier.layout { measurable, constraints ->
-                                measurable
-                                    .measure(constraints)
-                                    .run {
-                                        if (isLookingAhead) {
-                                            onLookaheadMeasured.invoke(
-                                                IntSize(
-                                                    width,
-                                                    height
-                                                )
-                                            )
-                                        }
-                                        layout(width, height) {
-                                            place(0, 0)
+                modifier =
+                    modifier.then(
+                        childTransition
+                            .createModifier(enter, exit, label = "Built-in")
+                            .then(
+                                if (onLookaheadMeasured != null) {
+                                    Modifier.layout { measurable, constraints ->
+                                        measurable.measure(constraints).run {
+                                            if (isLookingAhead) {
+                                                onLookaheadMeasured.invoke(IntSize(width, height))
+                                            }
+                                            layout(width, height) { place(0, 0) }
                                         }
                                     }
-                            }
-                        } else Modifier)
+                                } else Modifier
+                            )
                     ),
                 measurePolicy = remember { AnimatedEnterExitMeasurePolicy(scope) }
             )
@@ -801,10 +780,10 @@
 private val Transition<EnterExitState>.exitFinished
     get() = currentState == PostExit && targetState == PostExit
 
-private class AnimatedEnterExitMeasurePolicy(
-    val scope: AnimatedVisibilityScopeImpl
-) : MeasurePolicy {
+private class AnimatedEnterExitMeasurePolicy(val scope: AnimatedVisibilityScopeImpl) :
+    MeasurePolicy {
     var hasLookaheadOccurred = false
+
     override fun MeasureScope.measure(
         measurables: List<Measurable>,
         constraints: Constraints
@@ -820,11 +799,7 @@
             // Not in lookahead scope.
             scope.targetSize.value = IntSize(maxWidth, maxHeight)
         }
-        return layout(maxWidth, maxHeight) {
-            placeables.fastForEach {
-                it.place(0, 0)
-            }
-        }
+        return layout(maxWidth, maxHeight) { placeables.fastForEach { it.place(0, 0) } }
     }
 
     override fun IntrinsicMeasureScope.minIntrinsicWidth(
@@ -853,32 +828,32 @@
 private fun <T> Transition<T>.targetEnterExit(
     visible: (T) -> Boolean,
     targetState: T
-): EnterExitState = key(this) {
-
-    if (this.isSeeking) {
-        if (visible(targetState)) {
-            Visible
-        } else {
-            if (visible(this.currentState)) {
-                PostExit
+): EnterExitState =
+    key(this) {
+        if (this.isSeeking) {
+            if (visible(targetState)) {
+                Visible
             } else {
-                PreEnter
+                if (visible(this.currentState)) {
+                    PostExit
+                } else {
+                    PreEnter
+                }
             }
-        }
-    } else {
-        val hasBeenVisible = remember { mutableStateOf(false) }
-        if (visible(currentState)) {
-            hasBeenVisible.value = true
-        }
-        if (visible(targetState)) {
-            EnterExitState.Visible
         } else {
-            // If never been visible, visible = false means PreEnter, otherwise PostExit
-            if (hasBeenVisible.value) {
-                EnterExitState.PostExit
+            val hasBeenVisible = remember { mutableStateOf(false) }
+            if (visible(currentState)) {
+                hasBeenVisible.value = true
+            }
+            if (visible(targetState)) {
+                EnterExitState.Visible
             } else {
-                EnterExitState.PreEnter
+                // If never been visible, visible = false means PreEnter, otherwise PostExit
+                if (hasBeenVisible.value) {
+                    EnterExitState.PostExit
+                } else {
+                    EnterExitState.PreEnter
+                }
             }
         }
     }
-}
diff --git a/compose/animation/animation/src/commonMain/kotlin/androidx/compose/animation/AnimationModifier.kt b/compose/animation/animation/src/commonMain/kotlin/androidx/compose/animation/AnimationModifier.kt
index 7de6b63..43469a7 100644
--- a/compose/animation/animation/src/commonMain/kotlin/androidx/compose/animation/AnimationModifier.kt
+++ b/compose/animation/animation/src/commonMain/kotlin/androidx/compose/animation/AnimationModifier.kt
@@ -46,9 +46,9 @@
 import kotlinx.coroutines.launch
 
 /**
- * This modifier animates its own size when its child modifier (or the child composable if it
- * is already at the tail of the chain) changes size. This allows the parent modifier to observe
- * a smooth size change, resulting in an overall continuous visual change.
+ * This modifier animates its own size when its child modifier (or the child composable if it is
+ * already at the tail of the chain) changes size. This allows the parent modifier to observe a
+ * smooth size change, resulting in an overall continuous visual change.
  *
  * A [FiniteAnimationSpec] can be optionally specified for the size change animation. By default,
  * [spring] will be used.
@@ -63,24 +63,25 @@
  * @sample androidx.compose.animation.samples.AnimateContent
  *
  * @param animationSpec a finite animation that will be used to animate size change, [spring] by
- *                      default
+ *   default
  * @param finishedListener an optional listener to be called when the content change animation is
- *                         completed.
+ *   completed.
  */
 fun Modifier.animateContentSize(
-    animationSpec: FiniteAnimationSpec<IntSize> = spring(
-        stiffness = Spring.StiffnessMediumLow,
-        visibilityThreshold = IntSize.VisibilityThreshold
-    ),
+    animationSpec: FiniteAnimationSpec<IntSize> =
+        spring(
+            stiffness = Spring.StiffnessMediumLow,
+            visibilityThreshold = IntSize.VisibilityThreshold
+        ),
     finishedListener: ((initialValue: IntSize, targetValue: IntSize) -> Unit)? = null
 ): Modifier =
     this.clipToBounds() then
         SizeAnimationModifierElement(animationSpec, Alignment.TopStart, finishedListener)
 
 /**
- * This modifier animates its own size when its child modifier (or the child composable if it
- * is already at the tail of the chain) changes size. This allows the parent modifier to observe
- * a smooth size change, resulting in an overall continuous visual change.
+ * This modifier animates its own size when its child modifier (or the child composable if it is
+ * already at the tail of the chain) changes size. This allows the parent modifier to observe a
+ * smooth size change, resulting in an overall continuous visual change.
  *
  * A [FiniteAnimationSpec] can be optionally specified for the size change animation. By default,
  * [spring] will be used.
@@ -95,17 +96,18 @@
  * @sample androidx.compose.animation.samples.AnimateContent
  *
  * @param animationSpec a finite animation that will be used to animate size change, [spring] by
- *                      default
+ *   default
  * @param alignment sets the alignment of the content during the animation. [Alignment.TopStart] by
- *                  default.
+ *   default.
  * @param finishedListener an optional listener to be called when the content change animation is
- *                         completed.
+ *   completed.
  */
 fun Modifier.animateContentSize(
-    animationSpec: FiniteAnimationSpec<IntSize> = spring(
-        stiffness = Spring.StiffnessMediumLow,
-        visibilityThreshold = IntSize.VisibilityThreshold
-    ),
+    animationSpec: FiniteAnimationSpec<IntSize> =
+        spring(
+            stiffness = Spring.StiffnessMediumLow,
+            visibilityThreshold = IntSize.VisibilityThreshold
+        ),
     alignment: Alignment = Alignment.TopStart,
     finishedListener: ((initialValue: IntSize, targetValue: IntSize) -> Unit)? = null,
 ): Modifier =
@@ -153,6 +155,7 @@
             field = value
             lookaheadConstraintsAvailable = true
         }
+
     private var lookaheadConstraintsAvailable: Boolean = false
 
     private fun targetConstraints(default: Constraints) =
@@ -162,10 +165,7 @@
             default
         }
 
-    data class AnimData(
-        val anim: Animatable<IntSize, AnimationVector2D>,
-        var startSize: IntSize
-    )
+    data class AnimData(val anim: Animatable<IntSize, AnimationVector2D>, var startSize: IntSize)
 
     var animData: AnimData? by mutableStateOf(null)
 
@@ -186,56 +186,60 @@
         measurable: Measurable,
         constraints: Constraints
     ): MeasureResult {
-        val placeable = if (isLookingAhead) {
-            lookaheadConstraints = constraints
-            measurable.measure(constraints)
-        } else {
-            // Measure with lookahead constraints when available, to avoid unnecessary relayout
-            // in child during the lookahead animation.
-            measurable.measure(targetConstraints(constraints))
-        }
-        val measuredSize = IntSize(placeable.width, placeable.height)
-        val (width, height) = if (isLookingAhead) {
-            lookaheadSize = measuredSize
-            measuredSize
-        } else {
-            animateTo(if (lookaheadSize.isValid) lookaheadSize else measuredSize).let {
-                // Constrain the measure result to incoming constraints, so that parent doesn't
-                // force center this layout.
-                constraints.constrain(it)
+        val placeable =
+            if (isLookingAhead) {
+                lookaheadConstraints = constraints
+                measurable.measure(constraints)
+            } else {
+                // Measure with lookahead constraints when available, to avoid unnecessary relayout
+                // in child during the lookahead animation.
+                measurable.measure(targetConstraints(constraints))
             }
-        }
+        val measuredSize = IntSize(placeable.width, placeable.height)
+        val (width, height) =
+            if (isLookingAhead) {
+                lookaheadSize = measuredSize
+                measuredSize
+            } else {
+                animateTo(if (lookaheadSize.isValid) lookaheadSize else measuredSize).let {
+                    // Constrain the measure result to incoming constraints, so that parent doesn't
+                    // force center this layout.
+                    constraints.constrain(it)
+                }
+            }
         return layout(width, height) {
-            val offset = alignment.align(
-                size = measuredSize,
-                space = IntSize(width, height),
-                layoutDirection = this@measure.layoutDirection
-            )
+            val offset =
+                alignment.align(
+                    size = measuredSize,
+                    space = IntSize(width, height),
+                    layoutDirection = this@measure.layoutDirection
+                )
             placeable.placeRelative(offset)
         }
     }
 
     fun animateTo(targetSize: IntSize): IntSize {
-        val data = animData?.apply {
-            // TODO(b/322878517): Figure out a way to seamlessly continue the animation after
-            //  re-attach. Note that in some cases restarting the animation is the correct behavior.
-            val wasInterrupted = (targetSize != anim.value && !anim.isRunning)
+        val data =
+            animData?.apply {
+                // TODO(b/322878517): Figure out a way to seamlessly continue the animation after
+                //  re-attach. Note that in some cases restarting the animation is the correct
+                // behavior.
+                val wasInterrupted = (targetSize != anim.value && !anim.isRunning)
 
-            if (targetSize != anim.targetValue || wasInterrupted) {
-                startSize = anim.value
-                coroutineScope.launch {
-                    val result = anim.animateTo(targetSize, animationSpec)
-                    if (result.endReason == AnimationEndReason.Finished) {
-                        listener?.invoke(startSize, result.endState.value)
+                if (targetSize != anim.targetValue || wasInterrupted) {
+                    startSize = anim.value
+                    coroutineScope.launch {
+                        val result = anim.animateTo(targetSize, animationSpec)
+                        if (result.endReason == AnimationEndReason.Finished) {
+                            listener?.invoke(startSize, result.endState.value)
+                        }
                     }
                 }
             }
-        } ?: AnimData(
-            Animatable(
-                targetSize, IntSize.VectorConverter, IntSize(1, 1)
-            ),
-            targetSize
-        )
+                ?: AnimData(
+                    Animatable(targetSize, IntSize.VectorConverter, IntSize(1, 1)),
+                    targetSize
+                )
 
         animData = data
         return data.anim.value
diff --git a/compose/animation/animation/src/commonMain/kotlin/androidx/compose/animation/BoundsAnimation.kt b/compose/animation/animation/src/commonMain/kotlin/androidx/compose/animation/BoundsAnimation.kt
index 42017bc..4be7476 100644
--- a/compose/animation/animation/src/commonMain/kotlin/androidx/compose/animation/BoundsAnimation.kt
+++ b/compose/animation/animation/src/commonMain/kotlin/androidx/compose/animation/BoundsAnimation.kt
@@ -35,8 +35,8 @@
     animation: Transition<Boolean>.DeferredAnimation<Rect, AnimationVector4D>,
     boundsTransform: BoundsTransform
 ) {
-    var animation: Transition<Boolean>.DeferredAnimation<Rect, AnimationVector4D>
-        by mutableStateOf(animation)
+    var animation: Transition<Boolean>.DeferredAnimation<Rect, AnimationVector4D> by
+        mutableStateOf(animation)
         private set
 
     fun updateAnimation(
@@ -68,11 +68,12 @@
     // it was null will get an invalidation when it's set.
     var animationState: State<Rect>? by mutableStateOf(null)
     val value: Rect?
-        get() = if (transitionScope.isTransitionActive) {
-            animationState?.value
-        } else {
-            null
-        }
+        get() =
+            if (transitionScope.isTransitionActive) {
+                animationState?.value
+            } else {
+                null
+            }
 
     fun animate(currentBounds: Rect, targetBounds: Rect) {
         if (transitionScope.isTransitionActive) {
@@ -81,21 +82,21 @@
                 // boundsTransform will not participate in interruption-handling animations.
                 animationSpec = boundsTransform.transform(currentBounds, targetBounds)
             }
-            animationState = animation.animate(transitionSpec = { animationSpec }) {
-                if (it == transition.targetState) {
-                    // its own bounds
-                    targetBounds
-                } else {
-                    currentBounds
+            animationState =
+                animation.animate(transitionSpec = { animationSpec }) {
+                    if (it == transition.targetState) {
+                        // its own bounds
+                        targetBounds
+                    } else {
+                        currentBounds
+                    }
                 }
-            }
         }
     }
 
-    val target: Boolean get() = transition.targetState
+    val target: Boolean
+        get() = transition.targetState
 }
 
-private val DefaultBoundsAnimation = spring(
-    stiffness = Spring.StiffnessMediumLow,
-    visibilityThreshold = Rect.VisibilityThreshold
-)
+private val DefaultBoundsAnimation =
+    spring(stiffness = Spring.StiffnessMediumLow, visibilityThreshold = Rect.VisibilityThreshold)
diff --git a/compose/animation/animation/src/commonMain/kotlin/androidx/compose/animation/ColorVectorConverter.kt b/compose/animation/animation/src/commonMain/kotlin/androidx/compose/animation/ColorVectorConverter.kt
index 1d3c909..cfe379b 100644
--- a/compose/animation/animation/src/commonMain/kotlin/androidx/compose/animation/ColorVectorConverter.kt
+++ b/compose/animation/animation/src/commonMain/kotlin/androidx/compose/animation/ColorVectorConverter.kt
@@ -24,8 +24,8 @@
 import androidx.compose.ui.util.fastCoerceIn
 
 /**
- * A lambda that takes a [ColorSpace] and returns a converter that can both convert a [Color] to
- * a [AnimationVector4D], and convert a [AnimationVector4D]) back to a [Color] in the given
+ * A lambda that takes a [ColorSpace] and returns a converter that can both convert a [Color] to a
+ * [AnimationVector4D], and convert a [AnimationVector4D]) back to a [Color] in the given
  * [ColorSpace].
  */
 private val ColorToVector: (colorSpace: ColorSpace) -> TwoWayConverter<Color, AnimationVector4D> =
@@ -37,21 +37,22 @@
             },
             convertFromVector = { vector ->
                 Color(
-                    vector.v2.fastCoerceIn(0f, 1f), // L (red)
-                    vector.v3.fastCoerceIn(-0.5f, 0.5f), // a (blue)
-                    vector.v4.fastCoerceIn(-0.5f, 0.5f), // b (green)
-                    vector.v1.fastCoerceIn(0f, 1f), // alpha
-                    ColorSpaces.Oklab
-                ).convert(colorSpace)
+                        vector.v2.fastCoerceIn(0f, 1f), // L (red)
+                        vector.v3.fastCoerceIn(-0.5f, 0.5f), // a (blue)
+                        vector.v4.fastCoerceIn(-0.5f, 0.5f), // b (green)
+                        vector.v1.fastCoerceIn(0f, 1f), // alpha
+                        ColorSpaces.Oklab
+                    )
+                    .convert(colorSpace)
             }
         )
     }
 
 /**
- * A lambda that takes a [ColorSpace] and returns a converter that can both convert a [Color] to
- * a [AnimationVector4D], and convert a [AnimationVector4D]) back to a [Color] in the given
+ * A lambda that takes a [ColorSpace] and returns a converter that can both convert a [Color] to a
+ * [AnimationVector4D], and convert a [AnimationVector4D]) back to a [Color] in the given
  * [ColorSpace].
  */
 val Color.Companion.VectorConverter:
-        (colorSpace: ColorSpace) -> TwoWayConverter<Color, AnimationVector4D>
+    (colorSpace: ColorSpace) -> TwoWayConverter<Color, AnimationVector4D>
     get() = ColorToVector
diff --git a/compose/animation/animation/src/commonMain/kotlin/androidx/compose/animation/Crossfade.kt b/compose/animation/animation/src/commonMain/kotlin/androidx/compose/animation/Crossfade.kt
index 56c9fcb..959edd2 100644
--- a/compose/animation/animation/src/commonMain/kotlin/androidx/compose/animation/Crossfade.kt
+++ b/compose/animation/animation/src/commonMain/kotlin/androidx/compose/animation/Crossfade.kt
@@ -39,8 +39,8 @@
  * @sample androidx.compose.animation.samples.CrossfadeSample
  *
  * @param targetState is a key representing your target layout state. Every time you change a key
- * the animation will be triggered. The [content] called with the old key will be faded out while
- * the [content] called with the new key will be faded in.
+ *   the animation will be triggered. The [content] called with the old key will be faded out while
+ *   the [content] called with the new key will be faded in.
  * @param modifier Modifier to be applied to the animation container.
  * @param animationSpec the [AnimationSpec] to configure the animation.
  * @param label An optional label to differentiate from other animations in Android Studio.
@@ -58,10 +58,7 @@
     transition.Crossfade(modifier, animationSpec, content = content)
 }
 
-@Deprecated(
-    "Crossfade API now has a new label parameter added.",
-    level = DeprecationLevel.HIDDEN
-)
+@Deprecated("Crossfade API now has a new label parameter added.", level = DeprecationLevel.HIDDEN)
 @OptIn(ExperimentalAnimationApi::class)
 @Composable
 fun <T> Crossfade(
@@ -76,20 +73,20 @@
 
 /**
  * [Crossfade] allows to switch between two layouts with a crossfade animation. The target state of
- * this Crossfade will be the target state of the given Transition object. In other words, when
- * the Transition changes target, the [Crossfade] will fade in the target content while fading out
- * the current content.
+ * this Crossfade will be the target state of the given Transition object. In other words, when the
+ * Transition changes target, the [Crossfade] will fade in the target content while fading out the
+ * current content.
  *
- * [content] is a mapping between the state and the composable function for the content of
- * that state. During the crossfade, [content] lambda will be invoked multiple times with different
- * state parameter such that content associated with different states will be fading in/out at the
- * same time.
+ * [content] is a mapping between the state and the composable function for the content of that
+ * state. During the crossfade, [content] lambda will be invoked multiple times with different state
+ * parameter such that content associated with different states will be fading in/out at the same
+ * time.
  *
  * [contentKey] will be used to perform equality check for different states. For example, when two
- * states resolve to the same content key, there will be no animation for that state change.
- * By default, [contentKey] is the same as the state object. [contentKey] can be particularly useful
- * if target state object gets recreated across save & restore while a more persistent key is needed
- * to properly restore the internal states of the content.
+ * states resolve to the same content key, there will be no animation for that state change. By
+ * default, [contentKey] is the same as the state object. [contentKey] can be particularly useful if
+ * target state object gets recreated across save & restore while a more persistent key is needed to
+ * properly restore the internal states of the content.
  *
  * @param modifier Modifier to be applied to the animation container.
  * @param animationSpec the [AnimationSpec] to configure the animation.
@@ -114,9 +111,8 @@
     }
     if (targetState !in contentMap) {
         // Replace target with the same key if any
-        val replacementId = currentlyVisible.indexOfFirst {
-            contentKey(it) == contentKey(targetState)
-        }
+        val replacementId =
+            currentlyVisible.indexOfFirst { contentKey(it) == contentKey(targetState) }
         if (replacementId == -1) {
             currentlyVisible.add(targetState)
         } else {
@@ -125,21 +121,16 @@
         contentMap.clear()
         currentlyVisible.fastForEach { stateForContent ->
             contentMap[stateForContent] = {
-                val alpha by animateFloat(
-                    transitionSpec = { animationSpec }
-                ) { if (it == stateForContent) 1f else 0f }
-                Box(Modifier.graphicsLayer { this.alpha = alpha }) {
-                    content(stateForContent)
-                }
+                val alpha by
+                    animateFloat(transitionSpec = { animationSpec }) {
+                        if (it == stateForContent) 1f else 0f
+                    }
+                Box(Modifier.graphicsLayer { this.alpha = alpha }) { content(stateForContent) }
             }
         }
     }
 
     Box(modifier) {
-        currentlyVisible.fastForEach {
-            key(contentKey(it)) {
-                contentMap[it]?.invoke()
-            }
-        }
+        currentlyVisible.fastForEach { key(contentKey(it)) { contentMap[it]?.invoke() } }
     }
 }
diff --git a/compose/animation/animation/src/commonMain/kotlin/androidx/compose/animation/DefaultDecayAnimationSpec.kt b/compose/animation/animation/src/commonMain/kotlin/androidx/compose/animation/DefaultDecayAnimationSpec.kt
index 6dcda11..204fabb 100644
--- a/compose/animation/animation/src/commonMain/kotlin/androidx/compose/animation/DefaultDecayAnimationSpec.kt
+++ b/compose/animation/animation/src/commonMain/kotlin/androidx/compose/animation/DefaultDecayAnimationSpec.kt
@@ -19,11 +19,9 @@
 import androidx.compose.animation.core.DecayAnimationSpec
 import androidx.compose.runtime.Composable
 
-/**
- * Create default [DecayAnimationSpec] representing a default fling curve for a platform.
- */
+/** Create default [DecayAnimationSpec] representing a default fling curve for a platform. */
 @Composable
 @Deprecated("Replace with rememberSplineBasedDecay<Float>")
 expect fun defaultDecayAnimationSpec(): DecayAnimationSpec<Float>
-@Composable
-expect fun <T> rememberSplineBasedDecay(): DecayAnimationSpec<T>
+
+@Composable expect fun <T> rememberSplineBasedDecay(): DecayAnimationSpec<T>
diff --git a/compose/animation/animation/src/commonMain/kotlin/androidx/compose/animation/EnterExitTransition.kt b/compose/animation/animation/src/commonMain/kotlin/androidx/compose/animation/EnterExitTransition.kt
index c4d5cea..387aeeb 100644
--- a/compose/animation/animation/src/commonMain/kotlin/androidx/compose/animation/EnterExitTransition.kt
+++ b/compose/animation/animation/src/commonMain/kotlin/androidx/compose/animation/EnterExitTransition.kt
@@ -63,15 +63,15 @@
 annotation class ExperimentalAnimationApi
 
 /**
- * [EnterTransition] defines how an [AnimatedVisibility] Composable appears on screen as it
- * becomes visible. The 4 categories of EnterTransitions available are:
+ * [EnterTransition] defines how an [AnimatedVisibility] Composable appears on screen as it becomes
+ * visible. The 4 categories of EnterTransitions available are:
  * 1. fade: [fadeIn]
  * 2. scale: [scaleIn]
  * 3. slide: [slideIn], [slideInHorizontally], [slideInVertically]
  * 4. expand: [expandIn], [expandHorizontally], [expandVertically]
  *
- * [EnterTransition.None] can be used when no enter transition is desired.
- * Different [EnterTransition]s can be combined using plus operator,  for example:
+ * [EnterTransition.None] can be used when no enter transition is desired. Different
+ * [EnterTransition]s can be combined using plus operator, for example:
  *
  * @sample androidx.compose.animation.samples.SlideTransition
  *
@@ -94,10 +94,10 @@
     internal abstract val data: TransitionData
 
     /**
-     * Combines different enter transitions. The order of the [EnterTransition]s being combined
-     * does not matter, as these [EnterTransition]s will start simultaneously. The order of
-     * applying transforms from these enter transitions (if defined) is: alpha and scale first,
-     * shrink or expand, then slide.
+     * Combines different enter transitions. The order of the [EnterTransition]s being combined does
+     * not matter, as these [EnterTransition]s will start simultaneously. The order of applying
+     * transforms from these enter transitions (if defined) is: alpha and scale first, shrink or
+     * expand, then slide.
      *
      * @sample androidx.compose.animation.samples.FullyLoadedTransition
      *
@@ -122,9 +122,15 @@
             "EnterTransition.None"
         } else {
             data.run {
-                "EnterTransition: \n" + "Fade - " + fade?.toString() + ",\nSlide - " +
-                    slide?.toString() + ",\nShrink - " + changeSize?.toString() +
-                    ",\nScale - " + scale?.toString()
+                "EnterTransition: \n" +
+                    "Fade - " +
+                    fade?.toString() +
+                    ",\nSlide - " +
+                    slide?.toString() +
+                    ",\nShrink - " +
+                    changeSize?.toString() +
+                    ",\nScale - " +
+                    scale?.toString()
             }
         }
 
@@ -137,9 +143,9 @@
     companion object {
         /**
          * This can be used when no enter transition is desired. It can be useful in cases where
-         * there are other forms of enter animation defined indirectly for an
-         * [AnimatedVisibility]. e.g.The children of the [AnimatedVisibility] have all defined
-         * their own [EnterTransition], or when the parent is fading in, etc.
+         * there are other forms of enter animation defined indirectly for an [AnimatedVisibility].
+         * e.g.The children of the [AnimatedVisibility] have all defined their own
+         * [EnterTransition], or when the parent is fading in, etc.
          *
          * @see [ExitTransition.None]
          */
@@ -155,15 +161,15 @@
  * 3. slide: [slideOut], [slideOutHorizontally], [slideOutVertically]
  * 4. shrink: [shrinkOut], [shrinkHorizontally], [shrinkVertically]
  *
- * [ExitTransition.None] can be used when no exit transition is desired.
- * Different [ExitTransition]s can be combined using plus operator, for example:
+ * [ExitTransition.None] can be used when no exit transition is desired. Different [ExitTransition]s
+ * can be combined using plus operator, for example:
  *
  * @sample androidx.compose.animation.samples.SlideTransition
  *
- * __Note__: [fadeOut] and [slideOut] do not affect the size of the [AnimatedVisibility]
- * composable. In contrast, [shrinkOut] (and [shrinkHorizontally], [shrinkVertically]) will shrink
- * the clip bounds to reveal less and less of the content.  This will automatically animate other
- * layouts to fill in the space, very much like [animateContentSize].
+ * __Note__: [fadeOut] and [slideOut] do not affect the size of the [AnimatedVisibility] composable.
+ * In contrast, [shrinkOut] (and [shrinkHorizontally], [shrinkVertically]) will shrink the clip
+ * bounds to reveal less and less of the content. This will automatically animate other layouts to
+ * fill in the space, very much like [animateContentSize].
  *
  * @see fadeOut
  * @see scaleOut
@@ -180,10 +186,10 @@
     internal abstract val data: TransitionData
 
     /**
-     * Combines different exit transitions. The order of the [ExitTransition]s being combined
-     * does not matter, as these [ExitTransition]s will start simultaneously. The order of
-     * applying transforms from these exit transitions (if defined) is: alpha and scale first,
-     * shrink or expand, then slide.
+     * Combines different exit transitions. The order of the [ExitTransition]s being combined does
+     * not matter, as these [ExitTransition]s will start simultaneously. The order of applying
+     * transforms from these exit transitions (if defined) is: alpha and scale first, shrink or
+     * expand, then slide.
      *
      * @sample androidx.compose.animation.samples.FullyLoadedTransition
      *
@@ -212,12 +218,20 @@
         when (this) {
             None -> "ExitTransition.None"
             KeepUntilTransitionsFinished -> "ExitTransition.KeepUntilTransitionsFinished"
-            else -> data.run {
-                "ExitTransition: \n" + "Fade - " + fade?.toString() + ",\nSlide - " +
-                    slide?.toString() + ",\nShrink - " + changeSize?.toString() +
-                    ",\nScale - " + scale?.toString() +
-                    ",\nKeepUntilTransitionsFinished - " + hold
-            }
+            else ->
+                data.run {
+                    "ExitTransition: \n" +
+                        "Fade - " +
+                        fade?.toString() +
+                        ",\nSlide - " +
+                        slide?.toString() +
+                        ",\nShrink - " +
+                        changeSize?.toString() +
+                        ",\nScale - " +
+                        scale?.toString() +
+                        ",\nKeepUntilTransitionsFinished - " +
+                        hold
+                }
         }
 
     override fun hashCode(): Int = data.hashCode()
@@ -225,8 +239,8 @@
     companion object {
         /**
          * This can be used when no built-in [ExitTransition] (i.e. fade/slide, etc) is desired for
-         * the [AnimatedVisibility], but rather the children are defining their own exit
-         * animation using the [Transition] scope.
+         * the [AnimatedVisibility], but rather the children are defining their own exit animation
+         * using the [Transition] scope.
          *
          * __Note:__ If [None] is used, and nothing is animating in the Transition<EnterExitState>
          * scope that [AnimatedVisibility] provided, the content will be removed from
@@ -257,8 +271,7 @@
     val contentScale: ContentScale,
     val alignment: Alignment,
 ) : TransitionEffect() {
-    companion object Key :
-        TransitionEffectKey<ContentScaleTransitionEffect>
+    companion object Key : TransitionEffectKey<ContentScaleTransitionEffect>
 
     override val key: TransitionEffectKey<*>
         get() = Key
@@ -272,8 +285,8 @@
 
 /**
  * This fades in the content of the transition, from the specified starting alpha (i.e.
- * [initialAlpha]) to 1f, using the supplied [animationSpec]. [initialAlpha] defaults to 0f,
- * and [spring] is used by default.
+ * [initialAlpha]) to 1f, using the supplied [animationSpec]. [initialAlpha] defaults to 0f, and
+ * [spring] is used by default.
  *
  * @sample androidx.compose.animation.samples.FadeTransition
  *
@@ -291,8 +304,8 @@
 /**
  * This fades out the content of the transition, from full opacity to the specified target alpha
  * (i.e. [targetAlpha]), using the supplied [animationSpec]. By default, the content will be faded
- * out to fully transparent (i.e. [targetAlpha] defaults to 0), and [animationSpec] uses
- * [spring] by default.
+ * out to fully transparent (i.e. [targetAlpha] defaults to 0), and [animationSpec] uses [spring] by
+ * default.
  *
  * @sample androidx.compose.animation.samples.FadeTransition
  *
@@ -310,21 +323,21 @@
 /**
  * This slides in the content of the transition, from a starting offset defined in [initialOffset]
  * to `IntOffset(0, 0)`. The direction of the slide can be controlled by configuring the
- * [initialOffset]. A positive x value means sliding from right to left, whereas a negative x
- * value will slide the content to the right. Similarly positive and negative y values
- * correspond to sliding up and down, respectively.
+ * [initialOffset]. A positive x value means sliding from right to left, whereas a negative x value
+ * will slide the content to the right. Similarly positive and negative y values correspond to
+ * sliding up and down, respectively.
  *
  * If the sliding is only desired horizontally or vertically, instead of along both axis, consider
  * using [slideInHorizontally] or [slideInVertically].
  *
- * [initialOffset] is a lambda that takes the full size of the content and returns an offset.
- * This allows the offset to be defined proportional to the full size, or as an absolute value.
+ * [initialOffset] is a lambda that takes the full size of the content and returns an offset. This
+ * allows the offset to be defined proportional to the full size, or as an absolute value.
  *
  * @sample androidx.compose.animation.samples.SlideInOutSample
  *
  * @param animationSpec the animation used for the slide-in, [spring] by default.
  * @param initialOffset a lambda that takes the full size of the content and returns the initial
- *                        offset for the slide-in
+ *   offset for the slide-in
  */
 @Stable
 fun slideIn(
@@ -339,23 +352,23 @@
 }
 
 /**
- * This slides out the content of the transition, from an offset of `IntOffset(0, 0)` to the
- * target offset defined in [targetOffset]. The direction of the slide can be controlled by
- * configuring the [targetOffset]. A positive x value means sliding from left to right, whereas a
- * negative x value would slide the content from right to left. Similarly,  positive and negative y
- * values correspond to sliding down and up, respectively.
+ * This slides out the content of the transition, from an offset of `IntOffset(0, 0)` to the target
+ * offset defined in [targetOffset]. The direction of the slide can be controlled by configuring the
+ * [targetOffset]. A positive x value means sliding from left to right, whereas a negative x value
+ * would slide the content from right to left. Similarly, positive and negative y values correspond
+ * to sliding down and up, respectively.
  *
  * If the sliding is only desired horizontally or vertically, instead of along both axis, consider
  * using [slideOutHorizontally] or [slideOutVertically].
  *
- * [targetOffset] is a lambda that takes the full size of the content and returns an offset.
- * This allows the offset to be defined proportional to the full size, or as an absolute value.
+ * [targetOffset] is a lambda that takes the full size of the content and returns an offset. This
+ * allows the offset to be defined proportional to the full size, or as an absolute value.
  *
  * @sample androidx.compose.animation.samples.SlideInOutSample
  *
  * @param animationSpec the animation used for the slide-out, [spring] by default.
  * @param targetOffset a lambda that takes the full size of the content and returns the target
- *                     offset for the slide-out
+ *   offset for the slide-out
  */
 @Stable
 fun slideOut(
@@ -372,8 +385,8 @@
 /**
  * This scales the content as it appears, from an initial scale (defined in [initialScale]) to 1f.
  * [transformOrigin] defines the pivot point in terms of fraction of the overall size.
- * [TransformOrigin.Center] by default. [scaleIn] can be used in combination with any other type
- * of [EnterTransition] using the plus operator (e.g. `scaleIn() + slideInHorizontally()`)
+ * [TransformOrigin.Center] by default. [scaleIn] can be used in combination with any other type of
+ * [EnterTransition] using the plus operator (e.g. `scaleIn() + slideInHorizontally()`)
  *
  * Note: Scale is applied __before__ slide. This means when using [slideIn]/[slideOut] with
  * [scaleIn]/[scaleOut], the amount of scaling needs to be taken into account when sliding.
@@ -381,12 +394,13 @@
  * The scaling will change the visual of the content, but will __not__ affect the layout size.
  * [scaleIn] can be combined with [expandIn]/[expandHorizontally]/[expandVertically] to coordinate
  * layout size change while scaling. For example:
+ *
  * @sample androidx.compose.animation.samples.ScaledEnterExit
  *
  * @param animationSpec the animation used for the scale-out, [spring] by default.
  * @param initialScale the initial scale for the enter transition, 0 by default.
  * @param transformOrigin the pivot point in terms of fraction of the overall size. By default it's
- *                        [TransformOrigin.Center].
+ *   [TransformOrigin.Center].
  */
 @Stable
 fun scaleIn(
@@ -411,12 +425,13 @@
  * The scaling will change the visual of the content, but will __not__ affect the layout size.
  * [scaleOut] can be combined with [shrinkOut]/[shrinkHorizontally]/[shrinkVertically] for
  * coordinated layout size change animation. For example:
+ *
  * @sample androidx.compose.animation.samples.ScaledEnterExit
  *
  * @param animationSpec the animation used for the slide-out, [spring] by default.
  * @param targetScale the target scale for the exit transition, 0 by default.
  * @param transformOrigin the pivot point in terms of fraction of the overall size. By default it's
- *                        [TransformOrigin.Center].
+ *   [TransformOrigin.Center].
  */
 @Stable
 fun scaleOut(
@@ -433,18 +448,18 @@
  * This expands the clip bounds of the appearing content from the size returned from [initialSize]
  * to the full size. [expandFrom] controls which part of the content gets revealed first. By
  * default, the clip bounds animates from `IntSize(0, 0)` to full size, starting from revealing the
- * bottom right corner (or bottom left corner in RTL layouts) of the content, to fully revealing
- * the entire content as the size expands.
+ * bottom right corner (or bottom left corner in RTL layouts) of the content, to fully revealing the
+ * entire content as the size expands.
  *
- * __Note__: [expandIn] animates the bounds of the content. This bounds change will also result
- * in the animation of other layouts that are dependent on this size.
+ * __Note__: [expandIn] animates the bounds of the content. This bounds change will also result in
+ * the animation of other layouts that are dependent on this size.
  *
  * [initialSize] is a lambda that takes the full size of the content and returns an initial size of
- * the bounds of the content. This allows not only absolute size, but also an initial size that
- * is proportional to the content size.
+ * the bounds of the content. This allows not only absolute size, but also an initial size that is
+ * proportional to the content size.
  *
- * [clip] defines whether the content outside of the animated bounds should be clipped. By
- * default, clip is set to true, which only shows content in the animated bounds.
+ * [clip] defines whether the content outside of the animated bounds should be clipped. By default,
+ * clip is set to true, which only shows content in the animated bounds.
  *
  * For expanding only horizontally or vertically, consider [expandHorizontally], [expandVertically].
  *
@@ -467,27 +482,25 @@
     initialSize: (fullSize: IntSize) -> IntSize = { IntSize(0, 0) },
 ): EnterTransition {
     return EnterTransitionImpl(
-        TransitionData(
-            changeSize = ChangeSize(expandFrom, initialSize, animationSpec, clip)
-        )
+        TransitionData(changeSize = ChangeSize(expandFrom, initialSize, animationSpec, clip))
     )
 }
 
 /**
  * This shrinks the clip bounds of the disappearing content from the full size to the size returned
  * from [targetSize]. [shrinkTowards] controls the direction of the bounds shrink animation. By
- * default, the clip bounds animates from  full size to `IntSize(0, 0)`, shrinking towards the
- * the bottom right corner (or bottom left corner in RTL layouts) of the content.
+ * default, the clip bounds animates from full size to `IntSize(0, 0)`, shrinking towards the the
+ * bottom right corner (or bottom left corner in RTL layouts) of the content.
  *
- * __Note__: [shrinkOut] animates the bounds of the content. This bounds change will also result
- * in the animation of other layouts that are dependent on this size.
+ * __Note__: [shrinkOut] animates the bounds of the content. This bounds change will also result in
+ * the animation of other layouts that are dependent on this size.
  *
- * [targetSize] is a lambda that takes the full size of the content and returns a target size of
- * the bounds of the content. This allows not only absolute size, but also a target size that
- * is proportional to the content size.
+ * [targetSize] is a lambda that takes the full size of the content and returns a target size of the
+ * bounds of the content. This allows not only absolute size, but also a target size that is
+ * proportional to the content size.
  *
- * [clip] defines whether the content outside of the animated bounds should be clipped. By
- * default, clip is set to true, which only shows content in the animated bounds.
+ * [clip] defines whether the content outside of the animated bounds should be clipped. By default,
+ * clip is set to true, which only shows content in the animated bounds.
  *
  * For shrinking only horizontally or vertically, consider [shrinkHorizontally], [shrinkVertically].
  *
@@ -510,17 +523,15 @@
     targetSize: (fullSize: IntSize) -> IntSize = { IntSize(0, 0) },
 ): ExitTransition {
     return ExitTransitionImpl(
-        TransitionData(
-            changeSize = ChangeSize(shrinkTowards, targetSize, animationSpec, clip)
-        )
+        TransitionData(changeSize = ChangeSize(shrinkTowards, targetSize, animationSpec, clip))
     )
 }
 
 /**
  * This expands the clip bounds of the appearing content horizontally, from the width returned from
  * [initialWidth] to the full width. [expandFrom] controls which part of the content gets revealed
- * first. By default, the clip bounds animates from 0 to full width, starting from the end
- * of the content, and expand to fully revealing the whole content.
+ * first. By default, the clip bounds animates from 0 to full width, starting from the end of the
+ * content, and expand to fully revealing the whole content.
  *
  * __Note__: [expandHorizontally] animates the bounds of the content. This bounds change will also
  * result in the animation of other layouts that are dependent on this size.
@@ -529,8 +540,8 @@
  * of the bounds of the content. This allows not only an absolute width, but also an initial width
  * that is proportional to the content width.
  *
- * [clip] defines whether the content outside of the animated bounds should be clipped. By
- * default, clip is set to true, which only shows content in the animated bounds.
+ * [clip] defines whether the content outside of the animated bounds should be clipped. By default,
+ * clip is set to true, which only shows content in the animated bounds.
  *
  * @sample androidx.compose.animation.samples.HorizontalTransitionSample
  *
@@ -568,8 +579,8 @@
  * height of the bounds of the content. This allows not only an absolute height, but also an initial
  * height that is proportional to the content height.
  *
- * [clip] defines whether the content outside of the animated bounds should be clipped. By
- * default, clip is set to true, which only shows content in the animated bounds.
+ * [clip] defines whether the content outside of the animated bounds should be clipped. By default,
+ * clip is set to true, which only shows content in the animated bounds.
  *
  * @sample androidx.compose.animation.samples.ExpandShrinkVerticallySample
  *
@@ -595,20 +606,20 @@
 }
 
 /**
- * This shrinks the clip bounds of the disappearing content horizontally, from the full width to
- * the width returned from [targetWidth]. [shrinkTowards] controls the direction of the bounds
- * shrink animation. By default, the clip bounds animates from full width to 0, shrinking towards
- * the end of the content.
+ * This shrinks the clip bounds of the disappearing content horizontally, from the full width to the
+ * width returned from [targetWidth]. [shrinkTowards] controls the direction of the bounds shrink
+ * animation. By default, the clip bounds animates from full width to 0, shrinking towards the end
+ * of the content.
  *
  * __Note__: [shrinkHorizontally] animates the bounds of the content. This bounds change will also
  * result in the animation of other layouts that are dependent on this size.
  *
  * [targetWidth] is a lambda that takes the full width of the content and returns a target width of
- * the content. This allows not only absolute width, but also a target width that is proportional
- * to the content width.
+ * the content. This allows not only absolute width, but also a target width that is proportional to
+ * the content width.
  *
- * [clip] defines whether the content outside of the animated bounds should be clipped. By
- * default, clip is set to true, which only shows content in the animated bounds.
+ * [clip] defines whether the content outside of the animated bounds should be clipped. By default,
+ * clip is set to true, which only shows content in the animated bounds.
  *
  * @sample androidx.compose.animation.samples.HorizontalTransitionSample
  *
@@ -635,10 +646,10 @@
 }
 
 /**
- * This shrinks the clip bounds of the disappearing content vertically, from the full height to
- * the height returned from [targetHeight]. [shrinkTowards] controls the direction of the bounds
- * shrink animation. By default, the clip bounds animates from full height to 0, shrinking towards
- * the bottom of the content.
+ * This shrinks the clip bounds of the disappearing content vertically, from the full height to the
+ * height returned from [targetHeight]. [shrinkTowards] controls the direction of the bounds shrink
+ * animation. By default, the clip bounds animates from full height to 0, shrinking towards the
+ * bottom of the content.
  *
  * __Note__: [shrinkVertically] animates the bounds of the content. This bounds change will also
  * result in the animation of other layouts that are dependent on this size.
@@ -647,8 +658,8 @@
  * of the content. This allows not only absolute height, but also a target height that is
  * proportional to the content height.
  *
- * [clip] defines whether the content outside of the animated bounds should be clipped. By
- * default, clip is set to true, which only shows content in the animated bounds.
+ * [clip] defines whether the content outside of the animated bounds should be clipped. By default,
+ * clip is set to true, which only shows content in the animated bounds.
  *
  * @sample androidx.compose.animation.samples.ExpandShrinkVerticallySample
  *
@@ -676,20 +687,20 @@
 
 /**
  * This slides in the content horizontally, from a starting offset defined in [initialOffsetX] to
- * `0` **pixels**. The direction of the slide can be controlled by configuring the
- * [initialOffsetX]. A positive value means sliding from right to left, whereas a negative
- * value would slide the content from left to right.
+ * `0` **pixels**. The direction of the slide can be controlled by configuring the [initialOffsetX].
+ * A positive value means sliding from right to left, whereas a negative value would slide the
+ * content from left to right.
  *
- * [initialOffsetX] is a lambda that takes the full width of the content and returns an
- * offset. This allows the starting offset to be defined proportional to the full size, or as an
- * absolute value. It defaults to return half of negative width, which would offset the content
- * to the left by half of its width, and slide towards the right.
+ * [initialOffsetX] is a lambda that takes the full width of the content and returns an offset. This
+ * allows the starting offset to be defined proportional to the full size, or as an absolute value.
+ * It defaults to return half of negative width, which would offset the content to the left by half
+ * of its width, and slide towards the right.
  *
  * @sample androidx.compose.animation.samples.SlideTransition
  *
  * @param animationSpec the animation used for the slide-in, [spring] by default.
  * @param initialOffsetX a lambda that takes the full width of the content in pixels and returns the
- *                             initial offset for the slide-in, by default it returns `-fullWidth/2`
+ *   initial offset for the slide-in, by default it returns `-fullWidth/2`
  */
 @Stable
 fun slideInHorizontally(
@@ -707,20 +718,20 @@
 
 /**
  * This slides in the content vertically, from a starting offset defined in [initialOffsetY] to `0`
- * in **pixels**. The direction of the slide can be controlled by configuring the
- * [initialOffsetY]. A positive initial offset means sliding up, whereas a negative value would
- * slide the content down.
+ * in **pixels**. The direction of the slide can be controlled by configuring the [initialOffsetY].
+ * A positive initial offset means sliding up, whereas a negative value would slide the content
+ * down.
  *
- * [initialOffsetY] is a lambda that takes the full Height of the content and returns an
- * offset. This allows the starting offset to be defined proportional to the full height, or as an
- * absolute value. It defaults to return half of negative height, which would offset the content
- * up by half of its Height, and slide down.
+ * [initialOffsetY] is a lambda that takes the full Height of the content and returns an offset.
+ * This allows the starting offset to be defined proportional to the full height, or as an absolute
+ * value. It defaults to return half of negative height, which would offset the content up by half
+ * of its Height, and slide down.
  *
  * @sample androidx.compose.animation.samples.FullyLoadedTransition
  *
  * @param animationSpec the animation used for the slide-in, [spring] by default.
- * @param initialOffsetY a lambda that takes the full Height of the content and returns the
- *                           initial offset for the slide-in, by default it returns `-fullHeight/2`
+ * @param initialOffsetY a lambda that takes the full Height of the content and returns the initial
+ *   offset for the slide-in, by default it returns `-fullHeight/2`
  */
 @Stable
 fun slideInVertically(
@@ -737,21 +748,21 @@
     )
 
 /**
- * This slides out the content horizontally, from 0 to a target offset defined in [targetOffsetX]
- * in **pixels**. The direction of the slide can be controlled by configuring the
- * [targetOffsetX]. A positive value means sliding to the right, whereas a negative
- * value would slide the content towards the left.
+ * This slides out the content horizontally, from 0 to a target offset defined in [targetOffsetX] in
+ * **pixels**. The direction of the slide can be controlled by configuring the [targetOffsetX]. A
+ * positive value means sliding to the right, whereas a negative value would slide the content
+ * towards the left.
  *
- * [targetOffsetX] is a lambda that takes the full width of the content and returns an
- * offset. This allows the target offset to be defined proportional to the full size, or as an
- * absolute value. It defaults to return half of negative width, which would slide the content to
- * the left by half of its width.
+ * [targetOffsetX] is a lambda that takes the full width of the content and returns an offset. This
+ * allows the target offset to be defined proportional to the full size, or as an absolute value. It
+ * defaults to return half of negative width, which would slide the content to the left by half of
+ * its width.
  *
  * @sample androidx.compose.animation.samples.SlideTransition
  *
  * @param animationSpec the animation used for the slide-out, [spring] by default.
- * @param targetOffsetX a lambda that takes the full width of the content and returns the
- *                             initial offset for the slide-in, by default it returns `fullWidth/2`
+ * @param targetOffsetX a lambda that takes the full width of the content and returns the initial
+ *   offset for the slide-in, by default it returns `fullWidth/2`
  */
 @Stable
 fun slideOutHorizontally(
@@ -768,19 +779,18 @@
     )
 
 /**
- * This slides out the content vertically, from 0 to a target offset defined in [targetOffsetY]
- * in **pixels**. The direction of the slide-out can be controlled by configuring the
- * [targetOffsetY]. A positive target offset means sliding down, whereas a negative value would
- * slide the content up.
+ * This slides out the content vertically, from 0 to a target offset defined in [targetOffsetY] in
+ * **pixels**. The direction of the slide-out can be controlled by configuring the [targetOffsetY].
+ * A positive target offset means sliding down, whereas a negative value would slide the content up.
  *
- * [targetOffsetY] is a lambda that takes the full Height of the content and returns an
- * offset. This allows the target offset to be defined proportional to the full height, or as an
- * absolute value. It defaults to return half of the negative height, which would slide the content
- * up by half of its Height.
+ * [targetOffsetY] is a lambda that takes the full Height of the content and returns an offset. This
+ * allows the target offset to be defined proportional to the full height, or as an absolute value.
+ * It defaults to return half of the negative height, which would slide the content up by half of
+ * its Height.
  *
  * @param animationSpec the animation used for the slide-out, [spring] by default.
- * @param targetOffsetY a lambda that takes the full Height of the content and returns the
- *                         target offset for the slide-out, by default it returns `fullHeight/2`
+ * @param targetOffsetY a lambda that takes the full Height of the content and returns the target
+ *   offset for the slide-out, by default it returns `fullHeight/2`
  */
 @Stable
 fun slideOutVertically(
@@ -796,7 +806,7 @@
         animationSpec = animationSpec
     )
 
-/*********************** Below are internal classes and methods ******************/
+/** ********************* Below are internal classes and methods ***************** */
 @Immutable
 internal data class Fade(val alpha: Float, val animationSpec: FiniteAnimationSpec<Float>)
 
@@ -821,11 +831,9 @@
     val animationSpec: FiniteAnimationSpec<Float>
 )
 
-@Immutable
-private class EnterTransitionImpl(override val data: TransitionData) : EnterTransition()
+@Immutable private class EnterTransitionImpl(override val data: TransitionData) : EnterTransition()
 
-@Immutable
-private class ExitTransitionImpl(override val data: TransitionData) : ExitTransition()
+@Immutable private class ExitTransitionImpl(override val data: TransitionData) : ExitTransition()
 
 private fun Alignment.Horizontal.toAlignment() =
     when (this) {
@@ -875,34 +883,41 @@
     val shouldAnimateSizeChange =
         activeEnter.data.changeSize != null || activeExit.data.changeSize != null
 
-    val slideAnimation = if (shouldAnimateSlide) {
-        createDeferredAnimation(IntOffset.VectorConverter, remember { "$label slide" })
-    } else {
-        null
-    }
-    val sizeAnimation = if (shouldAnimateSizeChange) {
-        createDeferredAnimation(IntSize.VectorConverter, remember { "$label shrink/expand" })
-    } else null
+    val slideAnimation =
+        if (shouldAnimateSlide) {
+            createDeferredAnimation(IntOffset.VectorConverter, remember { "$label slide" })
+        } else {
+            null
+        }
+    val sizeAnimation =
+        if (shouldAnimateSizeChange) {
+            createDeferredAnimation(IntSize.VectorConverter, remember { "$label shrink/expand" })
+        } else null
 
-    val offsetAnimation = if (shouldAnimateSizeChange) {
-        createDeferredAnimation(
-            IntOffset.VectorConverter,
-            remember { "$label InterruptionHandlingOffset" }
-        )
-    } else null
+    val offsetAnimation =
+        if (shouldAnimateSizeChange) {
+            createDeferredAnimation(
+                IntOffset.VectorConverter,
+                remember { "$label InterruptionHandlingOffset" }
+            )
+        } else null
 
-    val disableClip = (activeEnter.data.changeSize?.clip == false ||
-        activeExit.data.changeSize?.clip == false) || !shouldAnimateSizeChange
+    val disableClip =
+        (activeEnter.data.changeSize?.clip == false || activeExit.data.changeSize?.clip == false) ||
+            !shouldAnimateSizeChange
 
     val graphicsLayerBlock = createGraphicsLayerBlock(activeEnter, activeExit, label)
-    return Modifier
-        .graphicsLayer {
-            clip = !disableClip && isEnabled()
-        }
+    return Modifier.graphicsLayer { clip = !disableClip && isEnabled() }
         .then(
             EnterExitTransitionElement(
-                this, sizeAnimation, offsetAnimation, slideAnimation,
-                activeEnter, activeExit, isEnabled, graphicsLayerBlock
+                this,
+                sizeAnimation,
+                offsetAnimation,
+                slideAnimation,
+                activeEnter,
+                activeExit,
+                isEnabled,
+                graphicsLayerBlock
             )
         )
 }
@@ -964,65 +979,68 @@
     // Fade - it's important to put fade in the end. Otherwise fade will clip slide.
     // We'll animate if at any point during the transition fadeIn/fadeOut becomes non-null. This
     // would ensure the removal of fadeIn/Out amid a fade animation doesn't result in a jump.
-    val alphaAnimation = if (shouldAnimateAlpha) {
-        createDeferredAnimation(typeConverter = Float.VectorConverter,
-            label = remember { "$label alpha" }
-        )
-    } else null
+    val alphaAnimation =
+        if (shouldAnimateAlpha) {
+            createDeferredAnimation(
+                typeConverter = Float.VectorConverter,
+                label = remember { "$label alpha" }
+            )
+        } else null
 
-    val scaleAnimation = if (shouldAnimateScale) {
-        createDeferredAnimation(typeConverter = Float.VectorConverter,
-            label = remember { "$label scale" }
-        )
-    } else null
+    val scaleAnimation =
+        if (shouldAnimateScale) {
+            createDeferredAnimation(
+                typeConverter = Float.VectorConverter,
+                label = remember { "$label scale" }
+            )
+        } else null
 
-    val transformOriginAnimation = if (shouldAnimateScale) {
-        createDeferredAnimation(
-            TransformOriginVectorConverter,
-            label = "TransformOriginInterruptionHandling"
-        )
-    } else null
+    val transformOriginAnimation =
+        if (shouldAnimateScale) {
+            createDeferredAnimation(
+                TransformOriginVectorConverter,
+                label = "TransformOriginInterruptionHandling"
+            )
+        } else null
 
     return GraphicsLayerBlockForEnterExit {
-        val alpha = alphaAnimation?.animate(
-            transitionSpec = {
-                when {
-                    EnterExitState.PreEnter isTransitioningTo EnterExitState.Visible ->
-                        enter.data.fade?.animationSpec ?: DefaultAlphaAndScaleSpring
-
-                    EnterExitState.Visible isTransitioningTo EnterExitState.PostExit ->
-                        exit.data.fade?.animationSpec ?: DefaultAlphaAndScaleSpring
-
-                    else -> DefaultAlphaAndScaleSpring
-                }
-            },
-        ) {
-            when (it) {
-                EnterExitState.Visible -> 1f
-                EnterExitState.PreEnter -> enter.data.fade?.alpha ?: 1f
-                EnterExitState.PostExit -> exit.data.fade?.alpha ?: 1f
-            }
-        }
-
-        val scale = scaleAnimation?.animate(
-            transitionSpec = {
-                when {
-                    EnterExitState.PreEnter isTransitioningTo EnterExitState.Visible ->
-                        enter.data.scale?.animationSpec ?: DefaultAlphaAndScaleSpring
-
-                    EnterExitState.Visible isTransitioningTo EnterExitState.PostExit ->
-                        exit.data.scale?.animationSpec ?: DefaultAlphaAndScaleSpring
-
-                    else -> DefaultAlphaAndScaleSpring
+        val alpha =
+            alphaAnimation?.animate(
+                transitionSpec = {
+                    when {
+                        EnterExitState.PreEnter isTransitioningTo EnterExitState.Visible ->
+                            enter.data.fade?.animationSpec ?: DefaultAlphaAndScaleSpring
+                        EnterExitState.Visible isTransitioningTo EnterExitState.PostExit ->
+                            exit.data.fade?.animationSpec ?: DefaultAlphaAndScaleSpring
+                        else -> DefaultAlphaAndScaleSpring
+                    }
+                },
+            ) {
+                when (it) {
+                    EnterExitState.Visible -> 1f
+                    EnterExitState.PreEnter -> enter.data.fade?.alpha ?: 1f
+                    EnterExitState.PostExit -> exit.data.fade?.alpha ?: 1f
                 }
             }
-        ) {
-            when (it) {
-                EnterExitState.Visible -> 1f
-                EnterExitState.PreEnter -> enter.data.scale?.scale ?: 1f
-                EnterExitState.PostExit -> exit.data.scale?.scale ?: 1f
+
+        val scale =
+            scaleAnimation?.animate(
+                transitionSpec = {
+                    when {
+                        EnterExitState.PreEnter isTransitioningTo EnterExitState.Visible ->
+                            enter.data.scale?.animationSpec ?: DefaultAlphaAndScaleSpring
+                        EnterExitState.Visible isTransitioningTo EnterExitState.PostExit ->
+                            exit.data.scale?.animationSpec ?: DefaultAlphaAndScaleSpring
+                        else -> DefaultAlphaAndScaleSpring
+                    }
+                }
+            ) {
+                when (it) {
+                    EnterExitState.Visible -> 1f
+                    EnterExitState.PreEnter -> enter.data.scale?.scale ?: 1f
+                    EnterExitState.PostExit -> exit.data.scale?.scale ?: 1f
+                }
             }
-        }
         val transformOriginWhenVisible =
             if (currentState == EnterExitState.PreEnter) {
                 enter.data.scale?.transformOrigin ?: exit.data.scale?.transformOrigin
@@ -1031,16 +1049,16 @@
             }
         // Animate transform origin if there's any change. If scale is only defined for enter or
         // exit, use the same transform origin for both.
-        val transformOrigin = transformOriginAnimation?.animate({ spring() }) {
-            when (it) {
-                EnterExitState.Visible -> transformOriginWhenVisible
-                EnterExitState.PreEnter ->
-                    enter.data.scale?.transformOrigin ?: exit.data.scale?.transformOrigin
-
-                EnterExitState.PostExit ->
-                    exit.data.scale?.transformOrigin ?: enter.data.scale?.transformOrigin
-            } ?: TransformOrigin.Center
-        }
+        val transformOrigin =
+            transformOriginAnimation?.animate({ spring() }) {
+                when (it) {
+                    EnterExitState.Visible -> transformOriginWhenVisible
+                    EnterExitState.PreEnter ->
+                        enter.data.scale?.transformOrigin ?: exit.data.scale?.transformOrigin
+                    EnterExitState.PostExit ->
+                        exit.data.scale?.transformOrigin ?: enter.data.scale?.transformOrigin
+                } ?: TransformOrigin.Center
+            }
 
         val block: GraphicsLayerScope.() -> Unit = {
             this.alpha = alpha?.value ?: 1f
@@ -1060,15 +1078,17 @@
 
 private val DefaultAlphaAndScaleSpring = spring<Float>(stiffness = Spring.StiffnessMediumLow)
 
-private val DefaultOffsetAnimationSpec = spring(
-    stiffness = Spring.StiffnessMediumLow, visibilityThreshold = IntOffset.VisibilityThreshold
-)
+private val DefaultOffsetAnimationSpec =
+    spring(
+        stiffness = Spring.StiffnessMediumLow,
+        visibilityThreshold = IntOffset.VisibilityThreshold
+    )
 
 private class EnterExitTransitionModifierNode(
     var transition: Transition<EnterExitState>,
     var sizeAnimation: Transition<EnterExitState>.DeferredAnimation<IntSize, AnimationVector2D>?,
     var offsetAnimation:
-    Transition<EnterExitState>.DeferredAnimation<IntOffset, AnimationVector2D>?,
+        Transition<EnterExitState>.DeferredAnimation<IntOffset, AnimationVector2D>?,
     var slideAnimation: Transition<EnterExitState>.DeferredAnimation<IntOffset, AnimationVector2D>?,
     var enter: EnterTransition,
     var exit: ExitTransition,
@@ -1083,34 +1103,35 @@
             lookaheadConstraintsAvailable = true
             field = value
         }
+
     var currentAlignment: Alignment? = null
     val alignment: Alignment?
-        get() = with(transition.segment) {
-            if (EnterExitState.PreEnter isTransitioningTo EnterExitState.Visible) {
-                enter.data.changeSize?.alignment ?: exit.data.changeSize?.alignment
-            } else {
-                exit.data.changeSize?.alignment ?: enter.data.changeSize?.alignment
+        get() =
+            with(transition.segment) {
+                if (EnterExitState.PreEnter isTransitioningTo EnterExitState.Visible) {
+                    enter.data.changeSize?.alignment ?: exit.data.changeSize?.alignment
+                } else {
+                    exit.data.changeSize?.alignment ?: enter.data.changeSize?.alignment
+                }
             }
-        }
 
     val sizeTransitionSpec: Transition.Segment<EnterExitState>.() -> FiniteAnimationSpec<IntSize> =
         {
             when {
                 EnterExitState.PreEnter isTransitioningTo EnterExitState.Visible ->
                     enter.data.changeSize?.animationSpec
-
                 EnterExitState.Visible isTransitioningTo EnterExitState.PostExit ->
                     exit.data.changeSize?.animationSpec
-
                 else -> DefaultSizeAnimationSpec
             } ?: DefaultSizeAnimationSpec
         }
 
-    fun sizeByState(targetState: EnterExitState, fullSize: IntSize): IntSize = when (targetState) {
-        EnterExitState.Visible -> fullSize
-        EnterExitState.PreEnter -> enter.data.changeSize?.size?.invoke(fullSize) ?: fullSize
-        EnterExitState.PostExit -> exit.data.changeSize?.size?.invoke(fullSize) ?: fullSize
-    }
+    fun sizeByState(targetState: EnterExitState, fullSize: IntSize): IntSize =
+        when (targetState) {
+            EnterExitState.Visible -> fullSize
+            EnterExitState.PreEnter -> enter.data.changeSize?.size?.invoke(fullSize) ?: fullSize
+            EnterExitState.PostExit -> exit.data.changeSize?.size?.invoke(fullSize) ?: fullSize
+        }
 
     override fun onAttach() {
         super.onAttach()
@@ -1127,24 +1148,20 @@
             currentAlignment == null -> IntOffset.Zero
             alignment == null -> IntOffset.Zero
             currentAlignment == alignment -> IntOffset.Zero
-            else -> when (targetState) {
-                EnterExitState.Visible -> IntOffset.Zero
-                EnterExitState.PreEnter -> IntOffset.Zero
-                EnterExitState.PostExit -> exit.data.changeSize?.let {
-                    val endSize = it.size(fullSize)
-                    val targetOffset = alignment!!.align(
-                        fullSize,
-                        endSize,
-                        LayoutDirection.Ltr
-                    )
-                    val currentOffset = currentAlignment!!.align(
-                        fullSize,
-                        endSize,
-                        LayoutDirection.Ltr
-                    )
-                    targetOffset - currentOffset
-                } ?: IntOffset.Zero
-            }
+            else ->
+                when (targetState) {
+                    EnterExitState.Visible -> IntOffset.Zero
+                    EnterExitState.PreEnter -> IntOffset.Zero
+                    EnterExitState.PostExit ->
+                        exit.data.changeSize?.let {
+                            val endSize = it.size(fullSize)
+                            val targetOffset =
+                                alignment!!.align(fullSize, endSize, LayoutDirection.Ltr)
+                            val currentOffset =
+                                currentAlignment!!.align(fullSize, endSize, LayoutDirection.Ltr)
+                            targetOffset - currentOffset
+                        } ?: IntOffset.Zero
+                }
         }
 
     override fun MeasureScope.measure(
@@ -1161,9 +1178,7 @@
             val measuredSize = IntSize(placeable.width, placeable.height)
             lookaheadSize = measuredSize
             lookaheadConstraints = constraints
-            return layout(measuredSize.width, measuredSize.height) {
-                placeable.place(0, 0)
-            }
+            return layout(measuredSize.width, measuredSize.height) { placeable.place(0, 0) }
         } else if (isEnabled()) {
             val layerBlock = graphicsLayerBlock.init()
             // Measure the content based on the current constraints passed down from parent.
@@ -1178,26 +1193,27 @@
             // be constrained by incoming constraints so that we know how to position content
             // in the constrained rect based on alignment.
             val currentSize = constraints.constrain(animSize?.value ?: measuredSize)
-            val offsetDelta = offsetAnimation?.animate({ DefaultOffsetAnimationSpec }) {
-                targetOffsetByState(it, target)
-            }?.value ?: IntOffset.Zero
-            val slideOffset = slideAnimation?.animate(slideSpec) {
-                slideTargetValueByState(it, target)
-            }?.value ?: IntOffset.Zero
-            val offset = (currentAlignment?.align(target, currentSize, LayoutDirection.Ltr)
-                ?: IntOffset.Zero) + slideOffset
+            val offsetDelta =
+                offsetAnimation
+                    ?.animate({ DefaultOffsetAnimationSpec }) { targetOffsetByState(it, target) }
+                    ?.value ?: IntOffset.Zero
+            val slideOffset =
+                slideAnimation?.animate(slideSpec) { slideTargetValueByState(it, target) }?.value
+                    ?: IntOffset.Zero
+            val offset =
+                (currentAlignment?.align(target, currentSize, LayoutDirection.Ltr)
+                    ?: IntOffset.Zero) + slideOffset
             return layout(currentSize.width, currentSize.height) {
                 placeable.placeWithLayer(
-                    offset.x + offsetDelta.x, offset.y + offsetDelta.y, 0f, layerBlock
+                    offset.x + offsetDelta.x,
+                    offset.y + offsetDelta.y,
+                    0f,
+                    layerBlock
                 )
             }
         } else {
             // If not enabled, skip all animations
-            return measurable.measure(constraints).run {
-                layout(width, height) {
-                    place(0, 0)
-                }
-            }
+            return measurable.measure(constraints).run { layout(width, height) { place(0, 0) } }
         }
     }
 
@@ -1206,11 +1222,9 @@
             EnterExitState.PreEnter isTransitioningTo EnterExitState.Visible -> {
                 enter.data.slide?.animationSpec ?: DefaultOffsetAnimationSpec
             }
-
             EnterExitState.Visible isTransitioningTo EnterExitState.PostExit -> {
                 exit.data.slide?.animationSpec ?: DefaultOffsetAnimationSpec
             }
-
             else -> DefaultOffsetAnimationSpec
         }
     }
@@ -1226,15 +1240,14 @@
     }
 }
 
-private val DefaultSizeAnimationSpec = spring(
-    stiffness = Spring.StiffnessMediumLow, visibilityThreshold = IntSize.VisibilityThreshold
-)
+private val DefaultSizeAnimationSpec =
+    spring(stiffness = Spring.StiffnessMediumLow, visibilityThreshold = IntSize.VisibilityThreshold)
 
 private data class EnterExitTransitionElement(
     val transition: Transition<EnterExitState>,
     var sizeAnimation: Transition<EnterExitState>.DeferredAnimation<IntSize, AnimationVector2D>?,
     var offsetAnimation:
-    Transition<EnterExitState>.DeferredAnimation<IntOffset, AnimationVector2D>?,
+        Transition<EnterExitState>.DeferredAnimation<IntOffset, AnimationVector2D>?,
     var slideAnimation: Transition<EnterExitState>.DeferredAnimation<IntOffset, AnimationVector2D>?,
     var enter: EnterTransition,
     var exit: ExitTransition,
@@ -1243,8 +1256,14 @@
 ) : ModifierNodeElement<EnterExitTransitionModifierNode>() {
     override fun create(): EnterExitTransitionModifierNode =
         EnterExitTransitionModifierNode(
-            transition, sizeAnimation, offsetAnimation, slideAnimation, enter, exit,
-            isEnabled, graphicsLayerBlock
+            transition,
+            sizeAnimation,
+            offsetAnimation,
+            slideAnimation,
+            enter,
+            exit,
+            isEnabled,
+            graphicsLayerBlock
         )
 
     override fun update(node: EnterExitTransitionModifierNode) {
diff --git a/compose/animation/animation/src/commonMain/kotlin/androidx/compose/animation/FlingCalculator.kt b/compose/animation/animation/src/commonMain/kotlin/androidx/compose/animation/FlingCalculator.kt
index d972db9..ae64d53 100644
--- a/compose/animation/animation/src/commonMain/kotlin/androidx/compose/animation/FlingCalculator.kt
+++ b/compose/animation/animation/src/commonMain/kotlin/androidx/compose/animation/FlingCalculator.kt
@@ -21,21 +21,19 @@
 import kotlin.math.ln
 import kotlin.math.sign
 
-/**
- * Earth's gravity in SI units (m/s^2); used to compute deceleration based on friction.
- */
+/** Earth's gravity in SI units (m/s^2); used to compute deceleration based on friction. */
 private const val GravityEarth = 9.80665f
 private const val InchesPerMeter = 39.37f
 
 /**
- * The default rate of deceleration for a fling if not specified in the
- * [FlingCalculator] constructor.
+ * The default rate of deceleration for a fling if not specified in the [FlingCalculator]
+ * constructor.
  */
 private val DecelerationRate = (ln(0.78) / ln(0.9)).toFloat()
 
 /**
- * Compute the rate of deceleration based on pixel density, physical gravity
- * and a [coefficient of friction][friction].
+ * Compute the rate of deceleration based on pixel density, physical gravity and a
+ * [coefficient of friction][friction].
  */
 private fun computeDeceleration(friction: Float, density: Float): Float =
     GravityEarth * InchesPerMeter * density * 160f * friction
@@ -46,84 +44,62 @@
  * @param friction scroll friction.
  * @param density density of the screen. Use LocalDensity to get current density in composition.
  */
-internal class FlingCalculator(
-    private val friction: Float,
-    val density: Density
-) {
+internal class FlingCalculator(private val friction: Float, val density: Density) {
 
-    /**
-     * A density-specific coefficient adjusted to physical values.
-     */
+    /** A density-specific coefficient adjusted to physical values. */
     private val magicPhysicalCoefficient: Float = computeDeceleration(density)
 
-    /**
-     * Computes the rate of deceleration in pixels based on
-     * the given [density].
-     */
-    private fun computeDeceleration(density: Density) =
-        computeDeceleration(0.84f, density.density)
+    /** Computes the rate of deceleration in pixels based on the given [density]. */
+    private fun computeDeceleration(density: Density) = computeDeceleration(0.84f, density.density)
 
-    private fun getSplineDeceleration(velocity: Float): Double = AndroidFlingSpline.deceleration(
-        velocity,
-        friction * magicPhysicalCoefficient
-    )
+    private fun getSplineDeceleration(velocity: Float): Double =
+        AndroidFlingSpline.deceleration(velocity, friction * magicPhysicalCoefficient)
 
-    /**
-     * Compute the duration in milliseconds of a fling with an initial velocity of [velocity]
-     */
+    /** Compute the duration in milliseconds of a fling with an initial velocity of [velocity] */
     fun flingDuration(velocity: Float): Long {
         val l = getSplineDeceleration(velocity)
         val decelMinusOne = DecelerationRate - 1.0
         return (1000.0 * exp(l / decelMinusOne)).toLong()
     }
 
-    /**
-     * Compute the distance of a fling in units given an initial [velocity] of units/second
-     */
+    /** Compute the distance of a fling in units given an initial [velocity] of units/second */
     fun flingDistance(velocity: Float): Float {
         val l = getSplineDeceleration(velocity)
         val decelMinusOne = DecelerationRate - 1.0
-        return (
-            friction * magicPhysicalCoefficient
-                * exp(DecelerationRate / decelMinusOne * l)
-            ).toFloat()
+        return (friction * magicPhysicalCoefficient * exp(DecelerationRate / decelMinusOne * l))
+            .toFloat()
     }
 
-    /**
-     * Compute all interesting information about a fling of initial velocity [velocity].
-     */
+    /** Compute all interesting information about a fling of initial velocity [velocity]. */
     fun flingInfo(velocity: Float): FlingInfo {
         val l = getSplineDeceleration(velocity)
         val decelMinusOne = DecelerationRate - 1.0
         return FlingInfo(
             initialVelocity = velocity,
-            distance = (
-                friction * magicPhysicalCoefficient
-                    * exp(DecelerationRate / decelMinusOne * l)
-                ).toFloat(),
+            distance =
+                (friction * magicPhysicalCoefficient * exp(DecelerationRate / decelMinusOne * l))
+                    .toFloat(),
             duration = (1000.0 * exp(l / decelMinusOne)).toLong()
         )
     }
 
     /**
-     * Info about a fling started with [initialVelocity]. The units of [initialVelocity]
-     * determine the distance units of [distance] and the time units of [duration].
+     * Info about a fling started with [initialVelocity]. The units of [initialVelocity] determine
+     * the distance units of [distance] and the time units of [duration].
      */
-    data class FlingInfo(
-        val initialVelocity: Float,
-        val distance: Float,
-        val duration: Long
-    ) {
+    data class FlingInfo(val initialVelocity: Float, val distance: Float, val duration: Long) {
         fun position(time: Long): Float {
             val splinePos = if (duration > 0) time / duration.toFloat() else 1f
-            return distance * sign(initialVelocity) *
+            return distance *
+                sign(initialVelocity) *
                 AndroidFlingSpline.flingPosition(splinePos).distanceCoefficient
         }
 
         fun velocity(time: Long): Float {
             val splinePos = if (duration > 0) time / duration.toFloat() else 1f
             return AndroidFlingSpline.flingPosition(splinePos).velocityCoefficient *
-                sign(initialVelocity) * distance / duration * 1000.0f
+                sign(initialVelocity) *
+                distance / duration * 1000.0f
         }
     }
 }
diff --git a/compose/animation/animation/src/commonMain/kotlin/androidx/compose/animation/RenderInTransitionOverlayNodeElement.kt b/compose/animation/animation/src/commonMain/kotlin/androidx/compose/animation/RenderInTransitionOverlayNodeElement.kt
index 4f4d6d9..64025fa 100644
--- a/compose/animation/animation/src/commonMain/kotlin/androidx/compose/animation/RenderInTransitionOverlayNodeElement.kt
+++ b/compose/animation/animation/src/commonMain/kotlin/androidx/compose/animation/RenderInTransitionOverlayNodeElement.kt
@@ -48,7 +48,10 @@
 ) : ModifierNodeElement<RenderInTransitionOverlayNode>() {
     override fun create(): RenderInTransitionOverlayNode {
         return RenderInTransitionOverlayNode(
-            sharedTransitionScope, renderInOverlay, zIndexInOverlay, clipInOverlay
+            sharedTransitionScope,
+            renderInOverlay,
+            zIndexInOverlay,
+            clipInOverlay
         )
     }
 
@@ -103,20 +106,16 @@
         override fun drawInOverlay(drawScope: DrawScope) {
             if (renderInOverlay()) {
                 with(drawScope) {
-                    val (x, y) = sharedScope.root.localPositionOf(
-                        this@RenderInTransitionOverlayNode.requireLayoutCoordinates(), Offset.Zero
-                    )
+                    val (x, y) =
+                        sharedScope.root.localPositionOf(
+                            this@RenderInTransitionOverlayNode.requireLayoutCoordinates(),
+                            Offset.Zero
+                        )
                     val clipPath = clipInOverlay(layoutDirection, requireDensity())
                     if (clipPath != null) {
-                        clipPath(clipPath) {
-                            translate(x, y) {
-                                drawLayer(layer)
-                            }
-                        }
+                        clipPath(clipPath) { translate(x, y) { drawLayer(layer) } }
                     } else {
-                        translate(x, y) {
-                            drawLayer(layer)
-                        }
+                        translate(x, y) { drawLayer(layer) }
                     }
                 }
             }
@@ -126,12 +125,8 @@
     // Render in-place logic. Depending on the result of `renderInOverlay()`, the content will
     // either render in-place or in the overlay, but never in both places.
     override fun ContentDrawScope.draw() {
-        val layer = requireNotNull(layer) {
-            "Error: layer never initialized"
-        }
-        layer.record {
-            this@draw.drawContent()
-        }
+        val layer = requireNotNull(layer) { "Error: layer never initialized" }
+        layer.record { this@draw.drawContent() }
         if (!renderInOverlay()) {
             drawLayer(layer)
         }
@@ -139,7 +134,9 @@
 
     val layer: GraphicsLayer?
         get() = layerWithRenderer?.layer
+
     private var layerWithRenderer: LayerWithRenderer? = null
+
     override fun onAttach() {
         LayerWithRenderer(requireGraphicsContext().createGraphicsLayer()).let {
             sharedScope.onLayerRendererCreated(it)
diff --git a/compose/animation/animation/src/commonMain/kotlin/androidx/compose/animation/SharedContentNode.kt b/compose/animation/animation/src/commonMain/kotlin/androidx/compose/animation/SharedContentNode.kt
index ce64e2e..2a3de05 100644
--- a/compose/animation/animation/src/commonMain/kotlin/androidx/compose/animation/SharedContentNode.kt
+++ b/compose/animation/animation/src/commonMain/kotlin/androidx/compose/animation/SharedContentNode.kt
@@ -48,11 +48,9 @@
 import androidx.compose.ui.unit.roundToIntSize
 import androidx.compose.ui.util.fastRoundToInt
 
-internal data class SharedBoundsNodeElement(
-    val sharedElementState: SharedElementInternalState
-) : ModifierNodeElement<SharedBoundsNode>() {
-    override fun create(): SharedBoundsNode =
-        SharedBoundsNode(sharedElementState)
+internal data class SharedBoundsNodeElement(val sharedElementState: SharedElementInternalState) :
+    ModifierNodeElement<SharedBoundsNode>() {
+    override fun create(): SharedBoundsNode = SharedBoundsNode(sharedElementState)
 
     override fun update(node: SharedBoundsNode) {
         node.state = sharedElementState
@@ -75,8 +73,11 @@
 internal class SharedBoundsNode(
     state: SharedElementInternalState,
 ) : ApproachLayoutModifierNode, Modifier.Node(), DrawModifierNode, ModifierLocalModifierNode {
-    private val rootCoords: LayoutCoordinates get() = sharedElement.scope.root
-    private val rootLookaheadCoords: LayoutCoordinates get() = sharedElement.scope.lookaheadRoot
+    private val rootCoords: LayoutCoordinates
+        get() = sharedElement.scope.root
+
+    private val rootLookaheadCoords: LayoutCoordinates
+        get() = sharedElement.scope.lookaheadRoot
 
     var state: SharedElementInternalState = state
         internal set(value) {
@@ -93,25 +94,24 @@
         }
 
     private fun requireLookaheadLayoutCoordinates(): LayoutCoordinates =
-        with(state.sharedElement.scope) {
-            requireLayoutCoordinates().toLookaheadCoordinates()
-        }
+        with(state.sharedElement.scope) { requireLayoutCoordinates().toLookaheadCoordinates() }
 
-    private val boundsAnimation: BoundsAnimation get() = state.boundsAnimation
+    private val boundsAnimation: BoundsAnimation
+        get() = state.boundsAnimation
 
     private var layer: GraphicsLayer? = state.layer
         set(value) {
             if (value == null) {
-                field?.let {
-                    requireGraphicsContext().releaseGraphicsLayer(it)
-                }
+                field?.let { requireGraphicsContext().releaseGraphicsLayer(it) }
             } else {
                 state.layer = value
             }
             field = value
         }
 
-    private val sharedElement: SharedElement get() = state.sharedElement
+    private val sharedElement: SharedElement
+        get() = state.sharedElement
+
     override val providedValues =
         modifierLocalMapOf(ModifierLocalSharedElementInternalState to state)
 
@@ -145,30 +145,27 @@
         val placeable = measurable.measure(constraints)
         val lookaheadSize = Size(placeable.width.toFloat(), placeable.height.toFloat())
         return layout(placeable.width, placeable.height) {
-            val topLeft = coordinates?.let {
-                rootLookaheadCoords.localPositionOf(it, Offset.Zero).also { topLeft ->
-                    if (sharedElement.currentBounds == null) {
-                        sharedElement.currentBounds = Rect(
-                            topLeft,
-                            lookaheadSize
-                        )
+            val topLeft =
+                coordinates?.let {
+                    rootLookaheadCoords.localPositionOf(it, Offset.Zero).also { topLeft ->
+                        if (sharedElement.currentBounds == null) {
+                            sharedElement.currentBounds = Rect(topLeft, lookaheadSize)
+                        }
                     }
                 }
-            }
             placeable.place(0, 0)
             // Update the lookahead result after child placement, so that child has an
             // opportunity to use its placement to influence the bounds animation.
-            topLeft?.let {
-                sharedElement.onLookaheadResult(state, lookaheadSize, it)
-            }
+            topLeft?.let { sharedElement.onLookaheadResult(state, lookaheadSize, it) }
         }
     }
 
     private fun MeasureScope.place(placeable: Placeable): MeasureResult {
-        val (w, h) = state.placeHolderSize.calculateSize(
-            requireLookaheadLayoutCoordinates().size,
-            IntSize(placeable.width, placeable.height)
-        )
+        val (w, h) =
+            state.placeHolderSize.calculateSize(
+                requireLookaheadLayoutCoordinates().size,
+                IntSize(placeable.width, placeable.height)
+            )
         return layout(w, h) {
             // No match
             if (!sharedElement.foundMatch) {
@@ -217,22 +214,20 @@
     ): MeasureResult {
         // Approach pass. Animation may not have started, or if the animation isn't
         // running, we'll measure with current bounds.
-        val resolvedConstraints = if (!sharedElement.foundMatch) {
-            constraints
-        } else {
-            (boundsAnimation.value ?: sharedElement.currentBounds)?.let {
-                val (width, height) = it.size.roundToIntSize()
-                require(
-                    width != Constraints.Infinity &&
-                        height != Constraints.Infinity
-                ) {
-                    "Error: Infinite width/height is invalid. " +
-                        "animated bounds: ${boundsAnimation.value}," +
-                        " current bounds: ${sharedElement.currentBounds}"
-                }
-                Constraints.fixed(width.coerceAtLeast(0), height.coerceAtLeast(0))
-            } ?: constraints
-        }
+        val resolvedConstraints =
+            if (!sharedElement.foundMatch) {
+                constraints
+            } else {
+                (boundsAnimation.value ?: sharedElement.currentBounds)?.let {
+                    val (width, height) = it.size.roundToIntSize()
+                    require(width != Constraints.Infinity && height != Constraints.Infinity) {
+                        "Error: Infinite width/height is invalid. " +
+                            "animated bounds: ${boundsAnimation.value}," +
+                            " current bounds: ${sharedElement.currentBounds}"
+                    }
+                    Constraints.fixed(width.coerceAtLeast(0), height.coerceAtLeast(0))
+                } ?: constraints
+            }
         val placeable = measurable.measure(resolvedConstraints)
         return place(placeable)
     }
@@ -247,16 +242,18 @@
 
     override fun ContentDrawScope.draw() {
         // Update clipPath
-        state.clipPathInOverlay = state.overlayClip.getClipPath(
-            state.userState,
-            sharedElement.currentBounds!!,
-            layoutDirection,
-            requireDensity()
-        )
-        val layer = requireNotNull(state.layer) {
-            "Error: Layer is null when accessed for shared bounds/element : ${sharedElement.key}," +
-                "target: ${state.boundsAnimation.target}, is attached: $isAttached"
-        }
+        state.clipPathInOverlay =
+            state.overlayClip.getClipPath(
+                state.userState,
+                sharedElement.currentBounds!!,
+                layoutDirection,
+                requireDensity()
+            )
+        val layer =
+            requireNotNull(state.layer) {
+                "Error: Layer is null when accessed for shared bounds/element : ${sharedElement.key}," +
+                    "target: ${state.boundsAnimation.target}, is attached: $isAttached"
+            }
 
         layer.record {
             this@draw.drawContent()
diff --git a/compose/animation/animation/src/commonMain/kotlin/androidx/compose/animation/SharedElement.kt b/compose/animation/animation/src/commonMain/kotlin/androidx/compose/animation/SharedElement.kt
index 1096ba1..aa2ae23 100644
--- a/compose/animation/animation/src/commonMain/kotlin/androidx/compose/animation/SharedElement.kt
+++ b/compose/animation/animation/src/commonMain/kotlin/androidx/compose/animation/SharedElement.kt
@@ -46,14 +46,13 @@
 
     /**
      * This should be only read only in the post-lookahead placement pass. It returns null when
-     * there's no shared element/bounds becoming visible (i.e. when only exiting shared elements
-     * are defined, which is an incorrect state).
+     * there's no shared element/bounds becoming visible (i.e. when only exiting shared elements are
+     * defined, which is an incorrect state).
      */
     val targetBounds: Rect?
         get() {
-            _targetBounds = targetBoundsProvider?.run {
-                Rect(calculateLookaheadOffset(), nonNullLookaheadSize)
-            }
+            _targetBounds =
+                targetBoundsProvider?.run { Rect(calculateLookaheadOffset(), nonNullLookaheadSize) }
             return _targetBounds
         }
 
@@ -94,9 +93,7 @@
             if (_targetBounds?.topLeft != topLeft || _targetBounds?.size != lookaheadSize) {
                 val target = Rect(topLeft, lookaheadSize)
                 _targetBounds = target
-                states.fastForEach {
-                    it.boundsAnimation.animate(currentBounds!!, target)
-                }
+                states.fastForEach { it.boundsAnimation.animate(currentBounds!!, target) }
             }
         }
     }
@@ -104,10 +101,10 @@
     /**
      * Each state comes from a call site of sharedElement/sharedBounds of the same key. In most
      * cases there will be 1 (i.e. no match) or 2 (i.e. match found) states. In the interrupted
-     * cases, there may be multiple scenes showing simultaneously, resulting in more than 2
-     * shared element states for the same key to be present. In those cases, we expect there to be
-     * only 1 state that is becoming visible, which we will use to derive target bounds. If none
-     * is becoming visible, then we consider this an error case for the lack of target, and
+     * cases, there may be multiple scenes showing simultaneously, resulting in more than 2 shared
+     * element states for the same key to be present. In those cases, we expect there to be only 1
+     * state that is becoming visible, which we will use to derive target bounds. If none is
+     * becoming visible, then we consider this an error case for the lack of target, and
      * consequently animate none of them.
      */
     val states = mutableStateListOf<SharedElementInternalState>()
@@ -116,8 +113,8 @@
 
     /**
      * This gets called to update the target bounds. The 3 scenarios where
-     * [updateTargetBoundsProvider] is needed
-     * are: when a shared element is 1) added,  2) removed, or 3) getting a target state change.
+     * [updateTargetBoundsProvider] is needed are: when a shared element is 1) added, 2) removed,
+     * or 3) getting a target state change.
      *
      * This is always called from an effect. Assume all compositional changes have been made in this
      * call.
@@ -142,13 +139,9 @@
         _targetBounds = null
     }
 
-    private val updateMatch: (SharedElement) -> Unit = {
-        updateMatch()
-    }
+    private val updateMatch: (SharedElement) -> Unit = { updateMatch() }
 
-    private val observingVisibilityChange: () -> Unit = {
-        hasVisibleContent()
-    }
+    private val observingVisibilityChange: () -> Unit = { hasVisibleContent() }
 
     fun addState(sharedElementState: SharedElementInternalState) {
         states.add(sharedElementState)
@@ -193,37 +186,33 @@
         val layer = layer ?: return
         if (shouldRenderInOverlay) {
             with(drawScope) {
-                requireNotNull(sharedElement.currentBounds) {
-                    "Error: current bounds not set yet."
-                }
+                requireNotNull(sharedElement.currentBounds) { "Error: current bounds not set yet." }
                 val (x, y) = sharedElement.currentBounds?.topLeft!!
-                clipPathInOverlay?.let {
-                    clipPath(it) {
-                        translate(x, y) {
-                            drawLayer(layer)
-                        }
-                    }
-                } ?: translate(x, y) { drawLayer(layer) }
+                clipPathInOverlay?.let { clipPath(it) { translate(x, y) { drawLayer(layer) } } }
+                    ?: translate(x, y) { drawLayer(layer) }
             }
         }
     }
 
     val nonNullLookaheadSize: Size
-        get() = requireNotNull(lookaheadCoords()) {
-            "Error: lookahead coordinates is null for ${sharedElement.key}."
-        }.size.toSize()
+        get() =
+            requireNotNull(lookaheadCoords()) {
+                    "Error: lookahead coordinates is null for ${sharedElement.key}."
+                }
+                .size
+                .toSize()
+
     var lookaheadCoords: () -> LayoutCoordinates? = { null }
     override var parentState: SharedElementInternalState? = null
 
     // This can only be accessed during placement
     fun calculateLookaheadOffset(): Offset {
-        val c = requireNotNull(lookaheadCoords()) {
-            "Error: lookahead coordinates is null."
-        }
+        val c = requireNotNull(lookaheadCoords()) { "Error: lookahead coordinates is null." }
         return sharedElement.scope.lookaheadRoot.localPositionOf(c, Offset.Zero)
     }
 
-    val target: Boolean get() = boundsAnimation.target
+    val target: Boolean
+        get() = boundsAnimation.target
 
     // Delegate the property to a mutable state, so that when layer is updated, the rendering
     // gets invalidated.
@@ -233,8 +222,8 @@
         get() = sharedElement.targetBoundsProvider == this || !renderOnlyWhenVisible
 
     internal val shouldRenderInOverlay: Boolean
-        get() = shouldRenderBasedOnTarget && sharedElement.foundMatch &&
-            renderInOverlayDuringTransition
+        get() =
+            shouldRenderBasedOnTarget && sharedElement.foundMatch && renderInOverlayDuringTransition
 
     val shouldRenderInPlace: Boolean
         get() = !sharedElement.foundMatch || (!shouldRenderInOverlay && shouldRenderBasedOnTarget)
diff --git a/compose/animation/animation/src/commonMain/kotlin/androidx/compose/animation/SharedTransitionScope.kt b/compose/animation/animation/src/commonMain/kotlin/androidx/compose/animation/SharedTransitionScope.kt
index 7106ccb5..1eeead7f 100644
--- a/compose/animation/animation/src/commonMain/kotlin/androidx/compose/animation/SharedTransitionScope.kt
+++ b/compose/animation/animation/src/commonMain/kotlin/androidx/compose/animation/SharedTransitionScope.kt
@@ -92,12 +92,12 @@
 import kotlinx.coroutines.launch
 
 /**
- * [SharedTransitionLayout] creates a layout and a [SharedTransitionScope] for the child layouts
- * in [content]. Any child (direct or indirect) of the [SharedTransitionLayout] can use the
- * receiver scope [SharedTransitionScope] to create shared element or shared bounds transitions.
+ * [SharedTransitionLayout] creates a layout and a [SharedTransitionScope] for the child layouts in
+ * [content]. Any child (direct or indirect) of the [SharedTransitionLayout] can use the receiver
+ * scope [SharedTransitionScope] to create shared element or shared bounds transitions.
  *
- * **Note**: [SharedTransitionLayout] creates a new Layout. For use cases where it's preferable
- * to not introduce a new layout between [content] and the parent layout, consider using
+ * **Note**: [SharedTransitionLayout] creates a new Layout. For use cases where it's preferable to
+ * not introduce a new layout between [content] and the parent layout, consider using
  * [SharedTransitionScope] instead.
  *
  * @param modifier Modifiers to be applied to the layout.
@@ -112,36 +112,31 @@
     SharedTransitionScope { sharedTransitionModifier ->
         // Put shared transition modifier *after* user provided modifier to support user provided
         // modifiers to influence the overlay's size, position, clipping, etc.
-        Box(modifier.then(sharedTransitionModifier)) {
-            content()
-        }
+        Box(modifier.then(sharedTransitionModifier)) { content() }
     }
 }
 
 /**
- * [SharedTransitionScope] creates a [SharedTransitionScope] for the child layouts
- * in [content]. Any child (direct or indirect) of the [SharedTransitionLayout] can use the
- * receiver scope [SharedTransitionScope] to create shared element or shared bounds transitions.
+ * [SharedTransitionScope] creates a [SharedTransitionScope] for the child layouts in [content]. Any
+ * child (direct or indirect) of the [SharedTransitionLayout] can use the receiver scope
+ * [SharedTransitionScope] to create shared element or shared bounds transitions.
  * [SharedTransitionScope] will not creates a new Layout.
  *
  * **IMPORTANT**: It is important to set the [Modifier] provided to the [content] on the first and
- * top-most child, as the [Modifier] both obtains the root coordinates and creates an overlay.
- * If the first child layout in [content] isn't the child with the highest zIndex, consider using
+ * top-most child, as the [Modifier] both obtains the root coordinates and creates an overlay. If
+ * the first child layout in [content] isn't the child with the highest zIndex, consider using
  * [SharedTransitionLayout] instead.
  *
  * @param content The children composable to be laid out.
  */
 @ExperimentalSharedTransitionApi
 @Composable
-fun SharedTransitionScope(
-    content: @Composable SharedTransitionScope.(Modifier) -> Unit
-) {
+fun SharedTransitionScope(content: @Composable SharedTransitionScope.(Modifier) -> Unit) {
     LookaheadScope {
         val coroutineScope = rememberCoroutineScope()
         val sharedScope = remember { SharedTransitionScopeImpl(this, coroutineScope) }
         sharedScope.content(
-            Modifier
-                .layout { measurable, constraints ->
+            Modifier.layout { measurable, constraints ->
                     val p = measurable.measure(constraints)
                     layout(p.width, p.height) {
                         val coords = coordinates
@@ -160,17 +155,13 @@
                     sharedScope.drawInOverlay(this)
                 }
         )
-        DisposableEffect(Unit) {
-            onDispose {
-                SharedTransitionObserver.clear(sharedScope)
-            }
-        }
+        DisposableEffect(Unit) { onDispose { SharedTransitionObserver.clear(sharedScope) } }
     }
 }
 
 /**
- * [BoundsTransform] defines the animation spec used to animate from initial bounds to the
- * target bounds.
+ * [BoundsTransform] defines the animation spec used to animate from initial bounds to the target
+ * bounds.
  */
 @ExperimentalSharedTransitionApi
 fun interface BoundsTransform {
@@ -190,23 +181,23 @@
  * are rendered by default, so that they are not subject to their parent's fading or clipping, and
  * can therefore transform the bounds without alpha jumps or being unintentionally clipped.
  *
- * It is also [SharedTransitionScope]'s responsibility to do the [SharedContentState] key match
- * for all the [sharedElement] or [sharedBounds] defined in this scope. Note: key match will not
- * work for [SharedContentState] created in different [SharedTransitionScope]s.
+ * It is also [SharedTransitionScope]'s responsibility to do the [SharedContentState] key match for
+ * all the [sharedElement] or [sharedBounds] defined in this scope. Note: key match will not work
+ * for [SharedContentState] created in different [SharedTransitionScope]s.
  *
  * [SharedTransitionScope] oversees all the animations in its scope. When any of the animations is
- * active, [isTransitionActive] will be true. Once a bounds transform starts, by default the
- * shared element or shared bounds will render the content in the overlay. The rendering will remain
- * in the overlay until all other animations in the [SharedTransitionScope] are finished (i.e.
- * when [isTransitionActive] == false).
+ * active, [isTransitionActive] will be true. Once a bounds transform starts, by default the shared
+ * element or shared bounds will render the content in the overlay. The rendering will remain in the
+ * overlay until all other animations in the [SharedTransitionScope] are finished (i.e. when
+ * [isTransitionActive] == false).
  */
 @Stable
 @ExperimentalSharedTransitionApi
 interface SharedTransitionScope : LookaheadScope {
 
     /**
-     * PlaceHolderSize defines the size of the space that was or will be occupied by the exiting
-     * or entering [sharedElement]/[sharedBounds].
+     * PlaceHolderSize defines the size of the space that was or will be occupied by the exiting or
+     * entering [sharedElement]/[sharedBounds].
      */
     fun interface PlaceHolderSize {
         companion object {
@@ -227,11 +218,11 @@
              * shared content during an active shared transition. For outgoing content, this
              * [contentSize] is the initial size before the animation, whereas for incoming content
              * [contentSize] will return the lookahead/target size of the content. This is the
-             * default value for shared elements and shared bounds. The effect is
-             * that the parent layout does not resize during the shared element transition, hence
-             * giving a sense of stability, rather than dynamic motion. If it's preferred to have
-             * parent layout dynamically adjust its layout based on the shared element's animated
-             * size, consider using [animatedSize].
+             * default value for shared elements and shared bounds. The effect is that the parent
+             * layout does not resize during the shared element transition, hence giving a sense of
+             * stability, rather than dynamic motion. If it's preferred to have parent layout
+             * dynamically adjust its layout based on the shared element's animated size, consider
+             * using [animatedSize].
              *
              * @see [contentSize]
              * @see [SharedTransitionScope.PlaceHolderSize]
@@ -240,10 +231,10 @@
         }
 
         /**
-         * Returns the size of the place holder based on [contentSize] and [animatedSize].
-         * Note: [contentSize] for exiting content is the size before it starts exiting.
-         * For entering content, [contentSize] is the lookahead size of the content (i.e. target
-         * size of the shared transition).
+         * Returns the size of the place holder based on [contentSize] and [animatedSize]. Note:
+         * [contentSize] for exiting content is the size before it starts exiting. For entering
+         * content, [contentSize] is the lookahead size of the content (i.e. target size of the
+         * shared transition).
          */
         fun calculateSize(contentSize: IntSize, animatedSize: IntSize): IntSize
     }
@@ -252,54 +243,53 @@
      * There are two different modes to resize child layout of [sharedBounds] during bounds
      * transform: 1) [ScaleToBounds] and 2) [RemeasureToBounds].
      *
-     * [ScaleToBounds] first measures the child layout with the lookahead constraints, similar
-     * to [skipToLookaheadSize]. Then the child's stable layout will be scaled to fit in the
-     * shared bounds.
+     * [ScaleToBounds] first measures the child layout with the lookahead constraints, similar to
+     * [skipToLookaheadSize]. Then the child's stable layout will be scaled to fit in the shared
+     * bounds.
      *
      * In contrast, [RemeasureToBounds] will remeasure and relayout the child layout of
-     * [sharedBounds] with animated fixed constraints based on the size of the bounds transform.
-     * The re-measurement is triggered by the bounds size change,
-     * which could potentially be every frame.
+     * [sharedBounds] with animated fixed constraints based on the size of the bounds transform. The
+     * re-measurement is triggered by the bounds size change, which could potentially be every
+     * frame.
      *
      * [ScaleToBounds] works best for Texts and bespoke layouts that don't respond well to
-     * constraints change. [RemeasureToBounds] works best for background, shared images of
-     * different aspect ratios, and other layouts that adjust themselves visually nicely and
-     * efficiently to size changes.
+     * constraints change. [RemeasureToBounds] works best for background, shared images of different
+     * aspect ratios, and other layouts that adjust themselves visually nicely and efficiently to
+     * size changes.
      */
     sealed interface ResizeMode {
         companion object {
             /**
-             * In contrast to [ScaleToBounds], [RemeasureToBounds] is a [ResizeMode] that
-             * remeasures and relayouts its child whenever bounds change during the bounds
-             * transform. More specifically, when the [sharedBounds] size changes,
-             * it creates fixed constraints based on the animated size, and uses the fixed
-             * constraints to remeasure the child. Therefore, the child layout of [sharedBounds]
-             * will likely change its layout to fit in the animated constraints.
+             * In contrast to [ScaleToBounds], [RemeasureToBounds] is a [ResizeMode] that remeasures
+             * and relayouts its child whenever bounds change during the bounds transform. More
+             * specifically, when the [sharedBounds] size changes, it creates fixed constraints
+             * based on the animated size, and uses the fixed constraints to remeasure the child.
+             * Therefore, the child layout of [sharedBounds] will likely change its layout to fit in
+             * the animated constraints.
              *
-             * [RemeasureToBounds] mode works well for layouts that respond well to
-             * constraints change, such as background and Images. It does not work well for layouts
-             * with specific size requirements. Such layouts include Text, and bespoke layouts
-             * that could result in overlapping children
-             * when constrained to too small of a size. In these cases, it's recommended to use
-             * [ScaleToBounds] instead.
+             * [RemeasureToBounds] mode works well for layouts that respond well to constraints
+             * change, such as background and Images. It does not work well for layouts with
+             * specific size requirements. Such layouts include Text, and bespoke layouts that could
+             * result in overlapping children when constrained to too small of a size. In these
+             * cases, it's recommended to use [ScaleToBounds] instead.
              */
             val RemeasureToBounds: ResizeMode = RemeasureImpl
 
             /**
              * [ScaleToBounds] as a type of [ResizeMode] will measure the child layout with
              * lookahead constraints to obtain the size of the stable layout. This stable layout is
-             * the post-animation layout of the child. Then based on the stable size of the
-             * child and the animated size of the [sharedBounds], the provided [contentScale] will
-             * be used to calculate a scale for both width and height. The resulting
-             * effect is that the child layout does not re-layout during the bounds transform,
-             * contrary to [RemeasureToBounds] mode. Instead, it will scale
-             * the stable layout based on the animated size of the [sharedBounds].
+             * the post-animation layout of the child. Then based on the stable size of the child
+             * and the animated size of the [sharedBounds], the provided [contentScale] will be used
+             * to calculate a scale for both width and height. The resulting effect is that the
+             * child layout does not re-layout during the bounds transform, contrary to
+             * [RemeasureToBounds] mode. Instead, it will scale the stable layout based on the
+             * animated size of the [sharedBounds].
              *
              * [ScaleToBounds] works best for [sharedBounds] when used to animate shared Text.
              *
-             * [ContentScale.FillWidth] is the default value for [contentScale].
-             * [alignment] will be used to calculate the placement of the scaled content. It is
-             * [Alignment.Center] by default.
+             * [ContentScale.FillWidth] is the default value for [contentScale]. [alignment] will be
+             * used to calculate the placement of the scaled content. It is [Alignment.Center] by
+             * default.
              */
             fun ScaleToBounds(
                 contentScale: ContentScale = ContentScale.FillWidth,
@@ -342,6 +332,7 @@
      *
      * In the sample below, try remove the [skipToLookaheadSize] modifier and observe the
      * difference:
+     *
      * @sample androidx.compose.animation.samples.NestedSharedBoundsSample
      */
     fun Modifier.skipToLookaheadSize(): Modifier
@@ -354,8 +345,8 @@
      *
      * [renderInOverlay] dynamically controls whether the content should be rendered in the
      * [SharedTransitionScope]'s overlay. By default, it returns the same value as
-     * [SharedTransitionScope.isTransitionActive]. This means the default behavior is to render
-     * the child layout of this modifier in the overlay only when the transition is active.
+     * [SharedTransitionScope.isTransitionActive]. This means the default behavior is to render the
+     * child layout of this modifier in the overlay only when the transition is active.
      *
      * **IMPORTANT:** When elevating layouts into the overlay, the layout is no longer subjected
      * to 1) its parent's clipping, and 2) parent's layer transform (e.g. alpha, scale, etc).
@@ -363,9 +354,10 @@
      * [AnimatedVisibilityScope.animateEnterExit]) for the child layout to avoid any abrupt visual
      * changes.
      *
-     * [clipInOverlayDuringTransition] supports a custom clip path if clipping is desired. By default,
-     * no clipping is applied. Manual management of clipping can often be avoided by putting layouts
-     * with clipping as children of this modifier (i.e. to the right side of this modifier).
+     * [clipInOverlayDuringTransition] supports a custom clip path if clipping is desired. By
+     * default, no clipping is applied. Manual management of clipping can often be avoided by
+     * putting layouts with clipping as children of this modifier (i.e. to the right side of this
+     * modifier).
      *
      * @sample androidx.compose.animation.samples.SharedElementWithFABInOverlaySample
      */
@@ -377,19 +369,19 @@
     ): Modifier
 
     /**
-     * [OverlayClip] defines a specific clipping that should be applied to a [sharedBounds]
-     * or [sharedElement] in the overlay.
+     * [OverlayClip] defines a specific clipping that should be applied to a [sharedBounds] or
+     * [sharedElement] in the overlay.
      */
     interface OverlayClip {
         /**
          * Creates a clip path based using current animated [bounds] of the [sharedBounds] or
          * [sharedElement], their [state] (to query parent state's bounds if needed), and
-         * [layoutDirection] and [density]. The topLeft of the [bounds] is the local position
-         * of the sharedElement/sharedBounds in the [SharedTransitionScope].
+         * [layoutDirection] and [density]. The topLeft of the [bounds] is the local position of the
+         * sharedElement/sharedBounds in the [SharedTransitionScope].
          *
          * **Important**: The returned [Path] needs to be offset-ed as needed such that it is in
-         * [SharedTransitionScope.lookaheadScopeCoordinates]'s coordinate space. For example,
-         * if the path is created using [bounds], it needs to be offset-ed by [bounds].topLeft.
+         * [SharedTransitionScope.lookaheadScopeCoordinates]'s coordinate space. For example, if the
+         * path is created using [bounds], it needs to be offset-ed by [bounds].topLeft.
          *
          * It is recommended to modify the same [Path] object and return it here, instead of
          * creating new [Path]s.
@@ -405,36 +397,35 @@
     /**
      * [sharedElement] is a modifier that tags a layout with a [SharedContentState.key], such that
      * entering and exiting shared elements of the same key share the animated and continuously
-     * changing bounds during the layout change. The bounds will be animated from the initial
-     * bounds defined by the exiting shared element to the target bounds calculated based on the
-     * incoming shared element. The animation for the bounds can be customized using
-     * [boundsTransform]. During the bounds transform, [sharedElement] will re-measure and relayout
-     * its child layout using fixed constraints derived from its animated size, similar to
-     * [RemeasureToBounds] resizeMode in [sharedBounds].
+     * changing bounds during the layout change. The bounds will be animated from the initial bounds
+     * defined by the exiting shared element to the target bounds calculated based on the incoming
+     * shared element. The animation for the bounds can be customized using [boundsTransform].
+     * During the bounds transform, [sharedElement] will re-measure and relayout its child layout
+     * using fixed constraints derived from its animated size, similar to [RemeasureToBounds]
+     * resizeMode in [sharedBounds].
      *
      * In contrast to [sharedBounds], [sharedElement] is designed for shared content that has the
      * exact match in terms of visual content and layout when the measure constraints are the same.
      * Such examples include image assets, icons,
-     * [MovableContent][androidx.compose.runtime.MovableContent] etc.
-     * Only the shared element that is becoming visible will be rendered during the
-     * transition. The bounds for shared element are determined by the bounds of the shared element
-     * becoming visible based on the target state of [animatedVisibilityScope].
+     * [MovableContent][androidx.compose.runtime.MovableContent] etc. Only the shared element that
+     * is becoming visible will be rendered during the transition. The bounds for shared element are
+     * determined by the bounds of the shared element becoming visible based on the target state of
+     * [animatedVisibilityScope].
      *
-     * **Important**:
-     * When a shared element finds its match and starts a transition, it will be rendered into
-     * the overlay of the [SharedTransitionScope] in order to avoid being faded in/out along with
-     * its parents or clipped by its parent as it transforms to the target size and position. This
-     * also means that any clipping or fading for the shared elements will need to be applied
-     * _explicitly_ as the child of [sharedElement] (i.e. after [sharedElement] modifier in the
-     * modifier chain). For example:
-     * `Modifier.sharedElement(...).clip(shape = RoundedCornerShape(20.dp)).animateEnterExit(...)`
+     * **Important**: When a shared element finds its match and starts a transition, it will be
+     * rendered into the overlay of the [SharedTransitionScope] in order to avoid being faded in/out
+     * along with its parents or clipped by its parent as it transforms to the target size and
+     * position. This also means that any clipping or fading for the shared elements will need to be
+     * applied _explicitly_ as the child of [sharedElement] (i.e. after [sharedElement] modifier in
+     * the modifier chain). For example: `Modifier.sharedElement(...).clip(shape =
+     * RoundedCornerShape(20.dp)).animateEnterExit(...)`
      *
      * By default, the [sharedElement] is clipped by the [clipInOverlayDuringTransition] of its
      * parent [sharedBounds]. If the [sharedElement] has no parent [sharedBounds] or if the parent
      * [sharedBounds] has no clipping defined, it'll not be clipped. If additional clipping is
      * desired to ensure [sharedElement] doesn't move outside of a visual bounds,
-     * [clipInOverlayDuringTransition] can be used to specify the clipping for when the shared element
-     * is going through an active transition towards a new target bounds.
+     * [clipInOverlayDuringTransition] can be used to specify the clipping for when the shared
+     * element is going through an active transition towards a new target bounds.
      *
      * While the shared elements are rendered in overlay during the transition, its
      * [zIndexInOverlay] can be specified to allow shared elements to render in a different order
@@ -444,24 +435,22 @@
      * indicate significance or a point of interest. [zIndexInOverlay] can be used to facilitate
      * such use cases. [zIndexInOverlay] is 0f by default.
      *
-     * [renderInOverlayDuringTransition] is true by default. In some rare use cases, there may
-     * be no clipping or layer transform (fade, scale, etc) in the application that prevents
-     * shared elements from transitioning from one bounds to another without any clipping or
-     * sudden alpha change. In such cases, [renderInOverlayDuringTransition] could be specified
-     * to false.
+     * [renderInOverlayDuringTransition] is true by default. In some rare use cases, there may be no
+     * clipping or layer transform (fade, scale, etc) in the application that prevents shared
+     * elements from transitioning from one bounds to another without any clipping or sudden alpha
+     * change. In such cases, [renderInOverlayDuringTransition] could be specified to false.
      *
-     * During a shared element transition, the space that was occupied by the exiting shared
-     * element and the space that the entering shared element will take up are considered place
-     * holders. Their sizes during the shared element transition can be configured through
-     * [placeHolderSize]. By default, it will be the same as the content size of the respective
-     * shared element. It can also be set to [animatedSize] or any other [PlaceHolderSize] to
-     * report to their parent layout an animated size to create a visual effect where the parent
-     * layout dynamically adjusts the layout to accommodate the animated size of the shared
-     * elements.
+     * During a shared element transition, the space that was occupied by the exiting shared element
+     * and the space that the entering shared element will take up are considered place holders.
+     * Their sizes during the shared element transition can be configured through [placeHolderSize].
+     * By default, it will be the same as the content size of the respective shared element. It can
+     * also be set to [animatedSize] or any other [PlaceHolderSize] to report to their parent layout
+     * an animated size to create a visual effect where the parent layout dynamically adjusts the
+     * layout to accommodate the animated size of the shared elements.
      *
      * @sample androidx.compose.animation.samples.SharedElementInAnimatedContentSample
      *
-     *  @see [sharedBounds]
+     * @see [sharedBounds]
      */
     @OptIn(ExperimentalAnimationApi::class)
     fun Modifier.sharedElement(
@@ -477,35 +466,33 @@
     /**
      * [sharedBounds] is a modifier that tags a layout with a [SharedContentState.key], such that
      * entering and exiting shared bounds of the same key share the animated and continuously
-     * changing bounds during the layout change. The bounds will be animated from the initial
-     * bounds defined by the exiting shared bounds to the target bounds calculated based on the
-     * incoming shared shared bounds. The animation for the bounds can be customized using
-     * [boundsTransform]. The target bounds for [sharedBounds] are determined by the
-     * bounds of the [sharedBounds] becoming visible based on the target state of
-     * [animatedVisibilityScope].
+     * changing bounds during the layout change. The bounds will be animated from the initial bounds
+     * defined by the exiting shared bounds to the target bounds calculated based on the incoming
+     * shared shared bounds. The animation for the bounds can be customized using [boundsTransform].
+     * The target bounds for [sharedBounds] are determined by the bounds of the [sharedBounds]
+     * becoming visible based on the target state of [animatedVisibilityScope].
      *
      * In contrast to [sharedElement], [sharedBounds] is designed for shared content that has the
-     * visually different content. While the [sharedBounds] keeps the continuity of the bounds,
-     * the incoming and outgoing content within the [sharedBounds] will enter and exit in an
-     * enter/exit transition using [enter]/[exit]. By default,
-     * [fadeIn] and [fadeOut] are used to fade the content in or out.
+     * visually different content. While the [sharedBounds] keeps the continuity of the bounds, the
+     * incoming and outgoing content within the [sharedBounds] will enter and exit in an enter/exit
+     * transition using [enter]/[exit]. By default, [fadeIn] and [fadeOut] are used to fade the
+     * content in or out.
      *
      * [resizeMode] defines how the child layout of [sharedBounds] should be resized during
-     * [boundsTransform]. By default, [ScaleToBounds] will be used to measure the child content
-     * with lookahead constraints to arrive at the stable layout. Then the stable layout will
-     * be scaled to fit or fill (depending on the content scale used) the transforming bounds of
-     * [sharedBounds]. If there's a need to relayout content (rather than scaling)
-     * based on the animated bounds size (e.g. dynamically resizing a Row), it's recommended
-     * to use [RemeasureToBounds] as the [resizeMode].
+     * [boundsTransform]. By default, [ScaleToBounds] will be used to measure the child content with
+     * lookahead constraints to arrive at the stable layout. Then the stable layout will be scaled
+     * to fit or fill (depending on the content scale used) the transforming bounds of
+     * [sharedBounds]. If there's a need to relayout content (rather than scaling) based on the
+     * animated bounds size (e.g. dynamically resizing a Row), it's recommended to use
+     * [RemeasureToBounds] as the [resizeMode].
      *
-     * **Important**:
-     * When a shared bounds finds its match and starts a transition, it will be rendered into
-     * the overlay of the [SharedTransitionScope] in order to avoid being faded in/out along with
-     * its parents or clipped by its parent as it transforms to the target size and position. This
-     * also means that any clipping or fading for the shared elements will need to be applied
-     * _explicitly_ as the child of [sharedBounds] (i.e. after [sharedBounds] modifier in the
-     * modifier chain). For example:
-     * `Modifier.sharedBounds(...).clip(shape = RoundedCornerShape(20.dp))`
+     * **Important**: When a shared bounds finds its match and starts a transition, it will be
+     * rendered into the overlay of the [SharedTransitionScope] in order to avoid being faded in/out
+     * along with its parents or clipped by its parent as it transforms to the target size and
+     * position. This also means that any clipping or fading for the shared elements will need to be
+     * applied _explicitly_ as the child of [sharedBounds] (i.e. after [sharedBounds] modifier in
+     * the modifier chain). For example: `Modifier.sharedBounds(...).clip(shape =
+     * RoundedCornerShape(20.dp))`
      *
      * By default, the [sharedBounds] is clipped by the [clipInOverlayDuringTransition] of its
      * parent [sharedBounds] in the layout tree. If the [sharedBounds] has no parent [sharedBounds]
@@ -514,37 +501,36 @@
      * outside of the this [sharedBounds]'s visual bounds in the overlay,
      * [clipInOverlayDuringTransition] can be used to specify the clipping.
      *
-     * While the shared bounds are rendered in overlay during the transition, its
-     * [zIndexInOverlay] can be specified to allow them to render in a different order
-     * than their placement/zOrder when not in the overlay. For example, the title of a page is
-     * typically placed and rendered before the content below. During the transition, it may be
-     * desired to animate the title over on top of the other shared elements on that page to
-     * indicate significance or a point of interest. [zIndexInOverlay] can be used to facilitate
-     * such use cases. [zIndexInOverlay] is 0f by default.
+     * While the shared bounds are rendered in overlay during the transition, its [zIndexInOverlay]
+     * can be specified to allow them to render in a different order than their placement/zOrder
+     * when not in the overlay. For example, the title of a page is typically placed and rendered
+     * before the content below. During the transition, it may be desired to animate the title over
+     * on top of the other shared elements on that page to indicate significance or a point of
+     * interest. [zIndexInOverlay] can be used to facilitate such use cases. [zIndexInOverlay] is 0f
+     * by default.
      *
-     * [renderInOverlayDuringTransition] is true by default. In some rare use cases, there may
-     * be no clipping or layer transform (fade, scale, etc) in the application that prevents
-     * shared elements from transitioning from one bounds to another without any clipping or
-     * sudden alpha change. In such cases, [renderInOverlayDuringTransition] could be specified
-     * to false.
+     * [renderInOverlayDuringTransition] is true by default. In some rare use cases, there may be no
+     * clipping or layer transform (fade, scale, etc) in the application that prevents shared
+     * elements from transitioning from one bounds to another without any clipping or sudden alpha
+     * change. In such cases, [renderInOverlayDuringTransition] could be specified to false.
      *
-     * During a shared bounds transition, the space that was occupied by the exiting shared
-     * bounds and the space that the entering shared bounds will take up are considered place
-     * holders. Their sizes during the shared element transition can be configured through
-     * [placeHolderSize]. By default, it will be the same as the content size of the respective
-     * shared bounds. It can also be set to [animatedSize] or any other [PlaceHolderSize] to
-     * report to their parent layout an animated size to create a visual effect where the parent
-     * layout dynamically adjusts the layout to accommodate the animated size of the shared
-     * elements.
+     * During a shared bounds transition, the space that was occupied by the exiting shared bounds
+     * and the space that the entering shared bounds will take up are considered place holders.
+     * Their sizes during the shared element transition can be configured through [placeHolderSize].
+     * By default, it will be the same as the content size of the respective shared bounds. It can
+     * also be set to [animatedSize] or any other [PlaceHolderSize] to report to their parent layout
+     * an animated size to create a visual effect where the parent layout dynamically adjusts the
+     * layout to accommodate the animated size of the shared elements.
      *
      * @sample androidx.compose.animation.samples.SharedElementInAnimatedContentSample
      *
      * Since [sharedBounds] show both incoming and outgoing content in its bounds, it affords
      * opportunities to do interesting transitions where additional [sharedElement] and
-     * [sharedBounds] can be nested in a parent [sharedBounds]. See the sample code below
-     * for a more complex example with nested shared bounds/elements.
+     * [sharedBounds] can be nested in a parent [sharedBounds]. See the sample code below for a more
+     * complex example with nested shared bounds/elements.
      *
      * @sample androidx.compose.animation.samples.NestedSharedBoundsSample
+     *
      * @see [sharedBounds]
      */
     @OptIn(ExperimentalAnimationApi::class)
@@ -563,49 +549,44 @@
 
     /**
      * [sharedElementWithCallerManagedVisibility] is a modifier that tags a layout with a
-     * [SharedContentState.key], such that
-     * entering and exiting shared elements of the same key share the animated and continuously
-     * changing bounds during the layout change. The bounds will be animated from the initial
-     * bounds defined by the exiting shared element to the target bounds calculated based on the
-     * incoming shared element. The animation for the bounds can be customized using
-     * [boundsTransform].
+     * [SharedContentState.key], such that entering and exiting shared elements of the same key
+     * share the animated and continuously changing bounds during the layout change. The bounds will
+     * be animated from the initial bounds defined by the exiting shared element to the target
+     * bounds calculated based on the incoming shared element. The animation for the bounds can be
+     * customized using [boundsTransform].
      *
-     * Compared to [sharedElement], [sharedElementWithCallerManagedVisibility] is designed
-     * for shared element transitions where the shared element is not a part of the content that
-     * is being animated out by [AnimatedVisibility]. Therefore, it is the caller's responsibility
-     * to explicitly remove the exiting shared element (i.e. shared elements where
-     * [visible] == false) from the tree as appropriate. Typically this is when the transition is
-     * finished (i.e. [SharedTransitionScope.isTransitionActive] == false). The target bounds is
-     * derived from the [sharedElementWithCallerManagedVisibility] with [visible] being true.
+     * Compared to [sharedElement], [sharedElementWithCallerManagedVisibility] is designed for
+     * shared element transitions where the shared element is not a part of the content that is
+     * being animated out by [AnimatedVisibility]. Therefore, it is the caller's responsibility to
+     * explicitly remove the exiting shared element (i.e. shared elements where [visible] == false)
+     * from the tree as appropriate. Typically this is when the transition is finished (i.e.
+     * [SharedTransitionScope.isTransitionActive] == false). The target bounds is derived from the
+     * [sharedElementWithCallerManagedVisibility] with [visible] being true.
      *
      * In contrast to [sharedBounds], this modifier is intended for shared content that has the
      * exact match in terms of visual content and layout when the measure constraints are the same.
      * Such examples include image assets, icons,
-     * [MovableContent][androidx.compose.runtime.MovableContent] etc.
-     * Only the shared element that is becoming visible will be rendered during the
-     * transition.
+     * [MovableContent][androidx.compose.runtime.MovableContent] etc. Only the shared element that
+     * is becoming visible will be rendered during the transition.
      *
-     * **Important**:
-     * When a shared element finds its match and starts a transition, it will be rendered into
-     * the overlay of the [SharedTransitionScope] in order to avoid being faded in/out along with
-     * its parents or clipped by its parent as it transforms to the target size and position. This
-     * also means that any clipping or fading for the shared elements will need to be applied
-     * _explicitly_ as the child of [sharedElementWithCallerManagedVisibility]
-     * (i.e. after [sharedElementWithCallerManagedVisibility] modifier in the
-     * modifier chain). For example:
+     * **Important**: When a shared element finds its match and starts a transition, it will be
+     * rendered into the overlay of the [SharedTransitionScope] in order to avoid being faded in/out
+     * along with its parents or clipped by its parent as it transforms to the target size and
+     * position. This also means that any clipping or fading for the shared elements will need to be
+     * applied _explicitly_ as the child of [sharedElementWithCallerManagedVisibility] (i.e. after
+     * [sharedElementWithCallerManagedVisibility] modifier in the modifier chain). For example:
      * ```
      * Modifier.sharedElementWithCallerManagedVisibility(...)
      *         .clip(shape = RoundedCornerShape(20.dp))
      * ```
      *
      * By default, the [sharedElementWithCallerManagedVisibility] is clipped by the
-     * [clipInOverlayDuringTransition] of its
-     * parent [sharedBounds]. If the [sharedElementWithCallerManagedVisibility] has no parent
-     * [sharedBounds] or if the parent [sharedBounds] has no clipping defined, it'll not be
-     * clipped. If additional clipping is desired to ensure
-     * [sharedElementWithCallerManagedVisibility] doesn't move outside of a visual bounds,
-     * [clipInOverlayDuringTransition] can be used to specify the clipping for when the shared
-     * element is going through an active transition towards a new target bounds.
+     * [clipInOverlayDuringTransition] of its parent [sharedBounds]. If the
+     * [sharedElementWithCallerManagedVisibility] has no parent [sharedBounds] or if the parent
+     * [sharedBounds] has no clipping defined, it'll not be clipped. If additional clipping is
+     * desired to ensure [sharedElementWithCallerManagedVisibility] doesn't move outside of a visual
+     * bounds, [clipInOverlayDuringTransition] can be used to specify the clipping for when the
+     * shared element is going through an active transition towards a new target bounds.
      *
      * While the shared elements are rendered in overlay during the transition, its
      * [zIndexInOverlay] can be specified to allow shared elements to render in a different order
@@ -615,20 +596,18 @@
      * indicate significance or a point of interest. [zIndexInOverlay] can be used to facilitate
      * such use cases. [zIndexInOverlay] is 0f by default.
      *
-     * [renderInOverlayDuringTransition] is true by default. In some rare use cases, there may
-     * be no clipping or layer transform (fade, scale, etc) in the application that prevents
-     * shared elements from transitioning from one bounds to another without any clipping or
-     * sudden alpha change. In such cases, [renderInOverlayDuringTransition] could be specified
-     * to false.
+     * [renderInOverlayDuringTransition] is true by default. In some rare use cases, there may be no
+     * clipping or layer transform (fade, scale, etc) in the application that prevents shared
+     * elements from transitioning from one bounds to another without any clipping or sudden alpha
+     * change. In such cases, [renderInOverlayDuringTransition] could be specified to false.
      *
-     * During a shared element transition, the space that was occupied by the exiting shared
-     * element and the space that the entering shared element will take up are considered place
-     * holders. Their sizes during the shared element transition can be configured through
-     * [placeHolderSize]. By default, it will be the same as the content size of the respective
-     * shared element. It can also be set to [animatedSize] or any other [PlaceHolderSize] to
-     * report to their parent layout an animated size to create a visual effect where the parent
-     * layout dynamically adjusts the layout to accommodate the animated size of the shared
-     * elements.
+     * During a shared element transition, the space that was occupied by the exiting shared element
+     * and the space that the entering shared element will take up are considered place holders.
+     * Their sizes during the shared element transition can be configured through [placeHolderSize].
+     * By default, it will be the same as the content size of the respective shared element. It can
+     * also be set to [animatedSize] or any other [PlaceHolderSize] to report to their parent layout
+     * an animated size to create a visual effect where the parent layout dynamically adjusts the
+     * layout to accommodate the animated size of the shared elements.
      *
      * @sample androidx.compose.animation.samples.SharedElementWithMovableContentSample
      */
@@ -642,16 +621,11 @@
         clipInOverlayDuringTransition: OverlayClip = ParentClip
     ): Modifier
 
-    /**
-     * Creates an [OverlayClip] based on a specific [clipShape].
-     */
+    /** Creates an [OverlayClip] based on a specific [clipShape]. */
     fun OverlayClip(clipShape: Shape): OverlayClip
 
-    /**
-     * Creates and remembers a [SharedContentState] with a given [key].
-     */
-    @Composable
-    fun rememberSharedContentState(key: Any): SharedContentState
+    /** Creates and remembers a [SharedContentState] with a given [key]. */
+    @Composable fun rememberSharedContentState(key: Any): SharedContentState
 
     /**
      * [SharedContentState] is designed to allow access of the properties of
@@ -661,8 +635,8 @@
      */
     class SharedContentState internal constructor(val key: Any) {
         /**
-         * Indicates whether a match of the same [key] has been found. [sharedElement]
-         * or [sharedBounds] will not have any animation unless a match has been found.
+         * Indicates whether a match of the same [key] has been found. [sharedElement] or
+         * [sharedBounds] will not have any animation unless a match has been found.
          *
          * _Caveat_: [isMatchFound] is only set to true _after_ a new [sharedElement]/[sharedBounds]
          * of the same [key] has been composed. If the new [sharedBounds]/[sharedElement] is
@@ -675,32 +649,31 @@
         /**
          * The resolved clip path in overlay based on the [OverlayClip] defined for the shared
          * content. [clipPathInOverlay] is set during Draw phase, before children are drawn. This
-         * means it is safe to query [parentSharedContentState]'s [clipPathInOverlay] when
-         * the shared content is drawn.
+         * means it is safe to query [parentSharedContentState]'s [clipPathInOverlay] when the
+         * shared content is drawn.
          */
         val clipPathInOverlay: Path?
             get() = nonNullInternalState.clipPathInOverlay
 
-        /**
-         * Returns the [SharedContentState] of a parent [sharedBounds], if any.
-         */
+        /** Returns the [SharedContentState] of a parent [sharedBounds], if any. */
         val parentSharedContentState: SharedContentState?
             get() = nonNullInternalState.parentState?.userState
+
         internal var internalState: SharedElementInternalState? by mutableStateOf(null)
         private val nonNullInternalState: SharedElementInternalState
-            get() = requireNotNull(internalState) {
-                "Error: SharedContentState has not been added to a sharedElement/sharedBounds" +
-                    "modifier yet. Therefore the internal state has not bee initialized."
-            }
+            get() =
+                requireNotNull(internalState) {
+                    "Error: SharedContentState has not been added to a sharedElement/sharedBounds" +
+                        "modifier yet. Therefore the internal state has not bee initialized."
+                }
     }
 }
 
 @ExperimentalSharedTransitionApi
 @Stable
-internal class SharedTransitionScopeImpl internal constructor(
-    lookaheadScope: LookaheadScope,
-    val coroutineScope: CoroutineScope
-) : SharedTransitionScope, LookaheadScope by lookaheadScope {
+internal class SharedTransitionScopeImpl
+internal constructor(lookaheadScope: LookaheadScope, val coroutineScope: CoroutineScope) :
+    SharedTransitionScope, LookaheadScope by lookaheadScope {
 
     override var isTransitionActive: Boolean by mutableStateOf(false)
         private set
@@ -729,17 +702,18 @@
         renderInOverlayDuringTransition: Boolean,
         zIndexInOverlay: Float,
         clipInOverlayDuringTransition: OverlayClip
-    ) = this.sharedBoundsImpl(
-        state,
-        parentTransition = animatedVisibilityScope.transition,
-        visible = { it == EnterExitState.Visible },
-        boundsTransform = boundsTransform,
-        placeHolderSize = placeHolderSize,
-        renderOnlyWhenVisible = true,
-        renderInOverlayDuringTransition = renderInOverlayDuringTransition,
-        zIndexInOverlay = zIndexInOverlay,
-        clipInOverlayDuringTransition = clipInOverlayDuringTransition
-    )
+    ) =
+        this.sharedBoundsImpl(
+            state,
+            parentTransition = animatedVisibilityScope.transition,
+            visible = { it == EnterExitState.Visible },
+            boundsTransform = boundsTransform,
+            placeHolderSize = placeHolderSize,
+            renderOnlyWhenVisible = true,
+            renderInOverlayDuringTransition = renderInOverlayDuringTransition,
+            zIndexInOverlay = zIndexInOverlay,
+            clipInOverlayDuringTransition = clipInOverlayDuringTransition
+        )
 
     @OptIn(ExperimentalAnimationApi::class)
     override fun Modifier.sharedBounds(
@@ -754,8 +728,7 @@
         zIndexInOverlay: Float,
         clipInOverlayDuringTransition: OverlayClip
     ) =
-        this
-            .sharedBoundsImpl(
+        this.sharedBoundsImpl(
                 sharedContentState,
                 animatedVisibilityScope.transition,
                 visible = { it == EnterExitState.Visible },
@@ -803,86 +776,80 @@
         renderInOverlayDuringTransition: Boolean,
         zIndexInOverlay: Float,
         clipInOverlayDuringTransition: OverlayClip
-    ) = this.sharedBoundsImpl<Unit>(
-        sharedContentState,
-        null,
-        { visible },
-        boundsTransform,
-        placeHolderSize,
-        renderOnlyWhenVisible = true,
-        renderInOverlayDuringTransition = renderInOverlayDuringTransition,
-        zIndexInOverlay = zIndexInOverlay,
-        clipInOverlayDuringTransition = clipInOverlayDuringTransition
-    )
+    ) =
+        this.sharedBoundsImpl<Unit>(
+            sharedContentState,
+            null,
+            { visible },
+            boundsTransform,
+            placeHolderSize,
+            renderOnlyWhenVisible = true,
+            renderInOverlayDuringTransition = renderInOverlayDuringTransition,
+            zIndexInOverlay = zIndexInOverlay,
+            clipInOverlayDuringTransition = clipInOverlayDuringTransition
+        )
 
     /**
      * [sharedBoundsWithCallerManagedVisibility] is a modifier that tags a layout with a
-     * [SharedContentState.key], such that
-     * entering and exiting shared bounds of the same key share the animated and continuously
-     * changing bounds during the layout change. The bounds will be animated from the initial
-     * bounds defined by the exiting shared bounds to the target bounds calculated based on the
-     * incoming shared bounds. The animation for the bounds can be customized using
-     * [boundsTransform].
+     * [SharedContentState.key], such that entering and exiting shared bounds of the same key share
+     * the animated and continuously changing bounds during the layout change. The bounds will be
+     * animated from the initial bounds defined by the exiting shared bounds to the target bounds
+     * calculated based on the incoming shared bounds. The animation for the bounds can be
+     * customized using [boundsTransform].
      *
-     * Compared to [sharedBounds], [sharedBoundsWithCallerManagedVisibility] is designed
-     * for shared bounds transitions where the shared bounds is not a part of the content that
-     * is being animated out by [AnimatedVisibility]. Therefore, it is the caller's responsibility
-     * to explicitly remove the exiting shared bounds (i.e. shared bounds where
-     * [visible] == false) from the tree as appropriate. Typically this is when the transition is
-     * finished (i.e. [SharedTransitionScope.isTransitionActive] == false). The target bounds is
-     * derived from the [sharedBoundsWithCallerManagedVisibility] with [visible] being true.
+     * Compared to [sharedBounds], [sharedBoundsWithCallerManagedVisibility] is designed for shared
+     * bounds transitions where the shared bounds is not a part of the content that is being
+     * animated out by [AnimatedVisibility]. Therefore, it is the caller's responsibility to
+     * explicitly remove the exiting shared bounds (i.e. shared bounds where [visible] == false)
+     * from the tree as appropriate. Typically this is when the transition is finished (i.e.
+     * [SharedTransitionScope.isTransitionActive] == false). The target bounds is derived from the
+     * [sharedBoundsWithCallerManagedVisibility] with [visible] being true.
      *
-     * Similar to [sharedBounds], [sharedBoundsWithCallerManagedVisibility] is designed for
-     * shared content that has the visually different content. It keeps the
-     * continuity of the bounds. Unlike [sharedBounds], [sharedBoundsWithCallerManagedVisibility]
-     * will not apply any enter transition or exit transition for the incoming and outgoing content
-     * within the bounds. Such enter and exit animation will need to be added by the caller
-     * of this API.
+     * Similar to [sharedBounds], [sharedBoundsWithCallerManagedVisibility] is designed for shared
+     * content that has the visually different content. It keeps the continuity of the bounds.
+     * Unlike [sharedBounds], [sharedBoundsWithCallerManagedVisibility] will not apply any enter
+     * transition or exit transition for the incoming and outgoing content within the bounds. Such
+     * enter and exit animation will need to be added by the caller of this API.
      *
-     * **Important**:
-     * When a shared bounds finds its match and starts a transition, it will be rendered into
-     * the overlay of the [SharedTransitionScope] in order to avoid being faded in/out along with
-     * its parents or clipped by its parent as it transforms to the target size and position. This
-     * also means that any clipping or fading for the shared elements will need to be applied
-     * _explicitly_ as the child of [sharedBoundsWithCallerManagedVisibility]
-     * (i.e. after [sharedBoundsWithCallerManagedVisibility] modifier in the
-     * modifier chain). For example:
+     * **Important**: When a shared bounds finds its match and starts a transition, it will be
+     * rendered into the overlay of the [SharedTransitionScope] in order to avoid being faded in/out
+     * along with its parents or clipped by its parent as it transforms to the target size and
+     * position. This also means that any clipping or fading for the shared elements will need to be
+     * applied _explicitly_ as the child of [sharedBoundsWithCallerManagedVisibility] (i.e. after
+     * [sharedBoundsWithCallerManagedVisibility] modifier in the modifier chain). For example:
      * ```
      * Modifier.sharedBoundsWithCallerManagedVisibility(...)
      *         .clip(shape = RoundedCornerShape(20.dp))
      * ```
      *
      * By default, the [sharedBoundsWithCallerManagedVisibility] is clipped by the
-     * [clipInOverlayDuringTransition] of its
-     * parent [sharedBounds]. If the [sharedBoundsWithCallerManagedVisibility] has no parent
-     * [sharedBounds] or if the parent [sharedBounds] has no clipping defined, it'll not be
-     * clipped. If additional clipping is desired to ensure
-     * [sharedBoundsWithCallerManagedVisibility] doesn't move outside of a visual bounds,
-     * [clipInOverlayDuringTransition] can be used to specify the clipping for when the shared
-     * bounds is going through an active transition towards a new target bounds.
+     * [clipInOverlayDuringTransition] of its parent [sharedBounds]. If the
+     * [sharedBoundsWithCallerManagedVisibility] has no parent [sharedBounds] or if the parent
+     * [sharedBounds] has no clipping defined, it'll not be clipped. If additional clipping is
+     * desired to ensure [sharedBoundsWithCallerManagedVisibility] doesn't move outside of a visual
+     * bounds, [clipInOverlayDuringTransition] can be used to specify the clipping for when the
+     * shared bounds is going through an active transition towards a new target bounds.
      *
-     * While the shared bounds are rendered in overlay during the transition, its
-     * [zIndexInOverlay] can be specified to allow shared bounds to render in a different order
-     * than their placement/zOrder when not in the overlay. For example, the title of a page is
-     * typically placed and rendered before other layouts. During the transition, it may be
-     * desired to animate the title over on top of the other shared elements on that page to
-     * indicate significance or a point of interest. [zIndexInOverlay] can be used to facilitate
-     * such use cases. [zIndexInOverlay] is 0f by default.
+     * While the shared bounds are rendered in overlay during the transition, its [zIndexInOverlay]
+     * can be specified to allow shared bounds to render in a different order than their
+     * placement/zOrder when not in the overlay. For example, the title of a page is typically
+     * placed and rendered before other layouts. During the transition, it may be desired to animate
+     * the title over on top of the other shared elements on that page to indicate significance or a
+     * point of interest. [zIndexInOverlay] can be used to facilitate such use cases.
+     * [zIndexInOverlay] is 0f by default.
      *
-     * [renderInOverlayDuringTransition] is true by default. In some rare use cases, there may
-     * be no clipping or layer transform (fade, scale, etc) in the application that prevents
-     * shared bounds from transitioning from one bounds to another without any clipping or
-     * sudden alpha change. In such cases, [renderInOverlayDuringTransition] could be specified
-     * to false.
+     * [renderInOverlayDuringTransition] is true by default. In some rare use cases, there may be no
+     * clipping or layer transform (fade, scale, etc) in the application that prevents shared bounds
+     * from transitioning from one bounds to another without any clipping or sudden alpha change. In
+     * such cases, [renderInOverlayDuringTransition] could be specified to false.
      *
-     * During a shared bounds transition, the space that was occupied by the exiting shared
-     * bounds and the space that the entering shared bounds will take up are considered place
-     * holders. Their sizes during the shared bounds transition can be configured through
-     * [placeHolderSize]. By default, it will be the same as the content size of the respective
-     * shared bounds. It can also be set to [animatedSize] or any other [PlaceHolderSize] to
-     * report to their parent layout an animated size to create a visual effect where the parent
-     * layout dynamically adjusts the layout to accommodate the animated size of the shared
-     * bounds.
+     * During a shared bounds transition, the space that was occupied by the exiting shared bounds
+     * and the space that the entering shared bounds will take up are considered place holders.
+     * Their sizes during the shared bounds transition can be configured through [placeHolderSize].
+     * By default, it will be the same as the content size of the respective shared bounds. It can
+     * also be set to [animatedSize] or any other [PlaceHolderSize] to report to their parent layout
+     * an animated size to create a visual effect where the parent layout dynamically adjusts the
+     * layout to accommodate the animated size of the shared bounds.
      *
      * // TODO: Evaluate whether this could become a public API
      */
@@ -894,30 +861,28 @@
         renderInOverlayDuringTransition: Boolean = true,
         zIndexInOverlay: Float = 0f,
         clipInOverlayDuringTransition: OverlayClip = ParentClip
-    ) = this.sharedBoundsImpl<Unit>(
-        sharedContentState,
-        null,
-        { visible },
-        boundsTransform,
-        placeHolderSize,
-        renderOnlyWhenVisible = false,
-        renderInOverlayDuringTransition = renderInOverlayDuringTransition,
-        zIndexInOverlay = zIndexInOverlay,
-        clipInOverlayDuringTransition = clipInOverlayDuringTransition
-    )
+    ) =
+        this.sharedBoundsImpl<Unit>(
+            sharedContentState,
+            null,
+            { visible },
+            boundsTransform,
+            placeHolderSize,
+            renderOnlyWhenVisible = false,
+            renderInOverlayDuringTransition = renderInOverlayDuringTransition,
+            zIndexInOverlay = zIndexInOverlay,
+            clipInOverlayDuringTransition = clipInOverlayDuringTransition
+        )
 
     override fun OverlayClip(clipShape: Shape): OverlayClip = ShapeBasedClip(clipShape)
 
     @Composable
-    override fun rememberSharedContentState(key: Any): SharedContentState = remember(key) {
-        SharedContentState(key)
-    }
+    override fun rememberSharedContentState(key: Any): SharedContentState =
+        remember(key) { SharedContentState(key) }
 
-    /**********  Impl details below *****************/
+    /** ******** Impl details below **************** */
     private val observeAnimatingBlock: () -> Unit = {
-        sharedElements.any { _, element ->
-            element.isAnimating()
-        }
+        sharedElements.any { _, element -> element.isAnimating() }
     }
 
     private val updateTransitionActiveness: (SharedTransitionScope) -> Unit = {
@@ -925,20 +890,14 @@
     }
 
     private fun updateTransitionActiveness() {
-        val isActive = sharedElements.any { _, element ->
-            element.isAnimating()
-        }
+        val isActive = sharedElements.any { _, element -> element.isAnimating() }
         if (isActive != isTransitionActive) {
             isTransitionActive = isActive
             if (!isActive) {
-                sharedElements.forEach { _, element ->
-                    element.onSharedTransitionFinished()
-                }
+                sharedElements.forEach { _, element -> element.onSharedTransitionFinished() }
             }
         }
-        sharedElements.forEach { _, element ->
-            element.updateMatch()
-        }
+        sharedElements.forEach { _, element -> element.updateMatch() }
         SharedTransitionObserver.observeReads(
             this@SharedTransitionScopeImpl,
             updateTransitionActiveness,
@@ -947,11 +906,10 @@
     }
 
     /**
-     * sharedBoundsImpl is the implementation for creating animations for shared element
-     * or shared bounds transition. [parentTransition] defines the parent Transition that
-     * the shared element will add its animations to. When [parentTransition] is null,
-     * [visible] will be cast to (Unit) -> Boolean, since we have no parent state to use
-     * for the query.
+     * sharedBoundsImpl is the implementation for creating animations for shared element or shared
+     * bounds transition. [parentTransition] defines the parent Transition that the shared element
+     * will add its animations to. When [parentTransition] is null, [visible] will be cast to (Unit)
+     * -> Boolean, since we have no parent state to use for the query.
      */
     @OptIn(ExperimentalTransitionApi::class)
     private fun <T> Modifier.sharedBoundsImpl(
@@ -966,54 +924,66 @@
         clipInOverlayDuringTransition: OverlayClip,
     ) = composed {
         val key = sharedContentState.key
-        val sharedElementState = key(key) {
-            val sharedElement = remember { sharedElementsFor(key) }
+        val sharedElementState =
+            key(key) {
+                val sharedElement = remember { sharedElementsFor(key) }
 
-            val boundsAnimation = key(parentTransition) {
-                val boundsTransition = if (parentTransition != null) {
-                    parentTransition.createChildTransition(key.toString()) { visible(it) }
-                } else {
-                    @Suppress("UNCHECKED_CAST")
-                    val targetState =
-                        (visible as (Unit) -> Boolean).invoke(Unit)
-                    val transitionState = remember {
-                        MutableTransitionState(
-                            initialState = if (sharedElement.currentBounds != null) {
-                                // In the transition that we completely own, we could make the
-                                // assumption that if a new shared element is added, it'll
-                                // always animate from current bounds to target bounds. This ensures
-                                // continuity of shared element bounds.
-                                !targetState
+                val boundsAnimation =
+                    key(parentTransition) {
+                        val boundsTransition =
+                            if (parentTransition != null) {
+                                parentTransition.createChildTransition(key.toString()) {
+                                    visible(it)
+                                }
                             } else {
-                                targetState
+                                @Suppress("UNCHECKED_CAST")
+                                val targetState = (visible as (Unit) -> Boolean).invoke(Unit)
+                                val transitionState =
+                                    remember {
+                                            MutableTransitionState(
+                                                initialState =
+                                                    if (sharedElement.currentBounds != null) {
+                                                        // In the transition that we completely own,
+                                                        // we could make the
+                                                        // assumption that if a new shared element
+                                                        // is added, it'll
+                                                        // always animate from current bounds to
+                                                        // target bounds. This ensures
+                                                        // continuity of shared element bounds.
+                                                        !targetState
+                                                    } else {
+                                                        targetState
+                                                    }
+                                            )
+                                        }
+                                        .also { it.targetState = targetState }
+                                rememberTransition(transitionState)
                             }
-                        )
-                    }.also { it.targetState = targetState }
-                    rememberTransition(transitionState)
-                }
-                val animation = key(isTransitionActive) {
-                    boundsTransition.createDeferredAnimation(Rect.VectorConverter)
-                }
-                remember(boundsTransition) {
-                    BoundsAnimation(
-                        this@SharedTransitionScopeImpl,
-                        boundsTransition,
-                        animation,
-                        boundsTransform
-                    )
-                }.also { it.updateAnimation(animation, boundsTransform) }
+                        val animation =
+                            key(isTransitionActive) {
+                                boundsTransition.createDeferredAnimation(Rect.VectorConverter)
+                            }
+                        remember(boundsTransition) {
+                                BoundsAnimation(
+                                    this@SharedTransitionScopeImpl,
+                                    boundsTransition,
+                                    animation,
+                                    boundsTransform
+                                )
+                            }
+                            .also { it.updateAnimation(animation, boundsTransform) }
+                    }
+                rememberSharedElementState(
+                    sharedElement = sharedElement,
+                    boundsAnimation = boundsAnimation,
+                    placeHolderSize = placeHolderSize,
+                    renderOnlyWhenVisible = renderOnlyWhenVisible,
+                    sharedContentState = sharedContentState,
+                    clipInOverlayDuringTransition = clipInOverlayDuringTransition,
+                    zIndexInOverlay = zIndexInOverlay,
+                    renderInOverlayDuringTransition = renderInOverlayDuringTransition
+                )
             }
-            rememberSharedElementState(
-                sharedElement = sharedElement,
-                boundsAnimation = boundsAnimation,
-                placeHolderSize = placeHolderSize,
-                renderOnlyWhenVisible = renderOnlyWhenVisible,
-                sharedContentState = sharedContentState,
-                clipInOverlayDuringTransition = clipInOverlayDuringTransition,
-                zIndexInOverlay = zIndexInOverlay,
-                renderInOverlayDuringTransition = renderInOverlayDuringTransition
-            )
-        }
 
         this then SharedBoundsNodeElement(sharedElementState)
     }
@@ -1030,37 +1000,40 @@
         renderInOverlayDuringTransition: Boolean
     ): SharedElementInternalState =
         remember {
-            SharedElementInternalState(
-                sharedElement,
-                boundsAnimation,
-                placeHolderSize,
-                renderOnlyWhenVisible = renderOnlyWhenVisible,
-                userState = sharedContentState,
-                overlayClip = clipInOverlayDuringTransition,
-                zIndex = zIndexInOverlay,
-                renderInOverlayDuringTransition = renderInOverlayDuringTransition
-            )
-        }.also {
-            sharedContentState.internalState = it
-            // Update the properties if any of them changes
-            it.sharedElement = sharedElement
-            it.renderOnlyWhenVisible = renderOnlyWhenVisible
-            it.boundsAnimation = boundsAnimation
-            it.placeHolderSize = placeHolderSize
-            it.overlayClip = clipInOverlayDuringTransition
-            it.zIndex = zIndexInOverlay
-            it.renderInOverlayDuringTransition = renderInOverlayDuringTransition
-            it.userState = sharedContentState
-        }
+                SharedElementInternalState(
+                    sharedElement,
+                    boundsAnimation,
+                    placeHolderSize,
+                    renderOnlyWhenVisible = renderOnlyWhenVisible,
+                    userState = sharedContentState,
+                    overlayClip = clipInOverlayDuringTransition,
+                    zIndex = zIndexInOverlay,
+                    renderInOverlayDuringTransition = renderInOverlayDuringTransition
+                )
+            }
+            .also {
+                sharedContentState.internalState = it
+                // Update the properties if any of them changes
+                it.sharedElement = sharedElement
+                it.renderOnlyWhenVisible = renderOnlyWhenVisible
+                it.boundsAnimation = boundsAnimation
+                it.placeHolderSize = placeHolderSize
+                it.overlayClip = clipInOverlayDuringTransition
+                it.zIndex = zIndexInOverlay
+                it.renderInOverlayDuringTransition = renderInOverlayDuringTransition
+                it.userState = sharedContentState
+            }
 
     internal lateinit var root: LayoutCoordinates
     internal val lookaheadRoot: LayoutCoordinates
-        get() = requireNotNull(nullableLookaheadRoot) {
-            "Error: Uninitialized LayoutCoordinates." +
-                " Please make sure when using the SharedTransitionScope composable function," +
-                " the modifier passed to the child content is being used, or use" +
-                " SharedTransitionLayout instead."
-        }
+        get() =
+            requireNotNull(nullableLookaheadRoot) {
+                "Error: Uninitialized LayoutCoordinates." +
+                    " Please make sure when using the SharedTransitionScope composable function," +
+                    " the modifier passed to the child content is being used, or use" +
+                    " SharedTransitionLayout instead."
+            }
+
     internal var nullableLookaheadRoot: LayoutCoordinates? = null
 
     // TODO: Use MutableObjectList and impl sort
@@ -1069,9 +1042,7 @@
     private val sharedElements = MutableScatterMap<Any, SharedElement>()
 
     private fun sharedElementsFor(key: Any): SharedElement {
-        return sharedElements[key] ?: SharedElement(key, this).also {
-            sharedElements[key] = it
-        }
+        return sharedElements[key] ?: SharedElement(key, this).also { sharedElements[key] = it }
     }
 
     internal fun drawInOverlay(scope: ContentDrawScope) {
@@ -1081,9 +1052,7 @@
                 -1f
             } else it.zIndex
         }
-        renderers.fastForEach {
-            it.drawInOverlay(drawScope = scope)
-        }
+        renderers.fastForEach { it.drawInOverlay(drawScope = scope) }
     }
 
     internal fun onStateRemoved(sharedElementState: SharedElementInternalState) {
@@ -1115,10 +1084,11 @@
                 updateTransitionActiveness,
                 observeAnimatingBlock
             )
-            val id = renderers.indexOfFirst {
-                (it as? SharedElementInternalState)?.sharedElement ==
-                    sharedElementState.sharedElement
-            }
+            val id =
+                renderers.indexOfFirst {
+                    (it as? SharedElementInternalState)?.sharedElement ==
+                        sharedElementState.sharedElement
+                }
             if (id == renderers.size - 1 || id == -1) {
                 renderers.add(sharedElementState)
             } else {
@@ -1135,9 +1105,7 @@
         renderers.remove(renderer)
     }
 
-    private class ShapeBasedClip(
-        val clipShape: Shape
-    ) : OverlayClip {
+    private class ShapeBasedClip(val clipShape: Shape) : OverlayClip {
         private val path = Path()
 
         override fun getClipPath(
@@ -1147,13 +1115,7 @@
             density: Density
         ): Path {
             path.reset()
-            path.addOutline(
-                clipShape.createOutline(
-                    bounds.size,
-                    layoutDirection,
-                    density
-                )
-            )
+            path.addOutline(clipShape.createOutline(bounds.size, layoutDirection, density))
             path.translate(bounds.topLeft)
             return path
         }
@@ -1169,19 +1131,15 @@
 ): Modifier =
     this.then(
         if (scaleToBounds.contentScale == ContentScale.Crop) {
-            Modifier.graphicsLayer {
-                clip = isEnabled()
-            }
-        } else
-            Modifier
+            Modifier.graphicsLayer { clip = isEnabled() }
+        } else Modifier
     ) then SkipToLookaheadElement(scaleToBounds, isEnabled)
 
 @OptIn(ExperimentalSharedTransitionApi::class)
 private data class SkipToLookaheadElement(
     val scaleToBounds: ScaleToBoundsImpl? = null,
     val isEnabled: () -> Boolean = DefaultEnabled,
-
-    ) : ModifierNodeElement<SkipToLookaheadNode>() {
+) : ModifierNodeElement<SkipToLookaheadNode>() {
     override fun create(): SkipToLookaheadNode {
         return SkipToLookaheadNode(scaleToBounds, isEnabled)
     }
@@ -1199,15 +1157,10 @@
 }
 
 @OptIn(ExperimentalSharedTransitionApi::class)
-private class SkipToLookaheadNode(
-    scaleToBounds: ScaleToBoundsImpl?,
-    isEnabled: () -> Boolean
-) : LayoutModifierNode,
-    Modifier.Node() {
+private class SkipToLookaheadNode(scaleToBounds: ScaleToBoundsImpl?, isEnabled: () -> Boolean) :
+    LayoutModifierNode, Modifier.Node() {
     var lookaheadConstraints: Constraints? = null
-    var scaleToBounds: ScaleToBoundsImpl? by mutableStateOf(
-        scaleToBounds
-    )
+    var scaleToBounds: ScaleToBoundsImpl? by mutableStateOf(scaleToBounds)
     var isEnabled: () -> Boolean by mutableStateOf(isEnabled)
 
     override fun MeasureScope.measure(
@@ -1235,14 +1188,15 @@
                             constrainedSize.toSize()
                         )
 
-                val (x, y) = scaleToBounds.alignment.align(
-                    IntSize(
-                        (contentSize.width * resolvedScale.scaleX).roundToInt(),
-                        (contentSize.height * resolvedScale.scaleY).roundToInt()
-                    ),
-                    constrainedSize,
-                    layoutDirection
-                )
+                val (x, y) =
+                    scaleToBounds.alignment.align(
+                        IntSize(
+                            (contentSize.width * resolvedScale.scaleX).roundToInt(),
+                            (contentSize.height * resolvedScale.scaleY).roundToInt()
+                        ),
+                        constrainedSize,
+                        layoutDirection
+                    )
                 p.placeWithLayer(x, y) {
                     scaleX = resolvedScale.scaleX
                     scaleY = resolvedScale.scaleY
@@ -1255,14 +1209,14 @@
 
 internal interface LayerRenderer {
     val parentState: SharedElementInternalState?
+
     fun drawInOverlay(drawScope: DrawScope)
+
     val zIndex: Float
 }
 
-private val DefaultSpring = spring(
-    stiffness = StiffnessMediumLow,
-    visibilityThreshold = Rect.VisibilityThreshold
-)
+private val DefaultSpring =
+    spring(stiffness = StiffnessMediumLow, visibilityThreshold = Rect.VisibilityThreshold)
 
 @ExperimentalSharedTransitionApi
 private val ParentClip: OverlayClip =
@@ -1277,21 +1231,19 @@
         }
     }
 
-private val DefaultClipInOverlayDuringTransition: (LayoutDirection, Density) -> Path? =
-    { _, _ -> null }
+private val DefaultClipInOverlayDuringTransition: (LayoutDirection, Density) -> Path? = { _, _ ->
+    null
+}
 
 @ExperimentalSharedTransitionApi
 private val DefaultBoundsTransform = BoundsTransform { _, _ -> DefaultSpring }
 
 internal const val VisualDebugging = false
 
-internal val SharedTransitionObserver by lazy(LazyThreadSafetyMode.NONE) {
-    SnapshotStateObserver { it() }.also { it.start() }
-}
+internal val SharedTransitionObserver by
+    lazy(LazyThreadSafetyMode.NONE) { SnapshotStateObserver { it() }.also { it.start() } }
 
-/**
- * Caching immutable ScaleToBoundsImpl objects to avoid extra allocation
- */
+/** Caching immutable ScaleToBoundsImpl objects to avoid extra allocation */
 @ExperimentalSharedTransitionApi
 private fun ScaleToBoundsCached(
     contentScale: ContentScale,
@@ -1299,9 +1251,7 @@
 ): ScaleToBoundsImpl {
     if (contentScale.shouldCache && alignment.shouldCache) {
         val map = cachedScaleToBoundsImplMap.getOrPut(contentScale) { MutableScatterMap() }
-        return map.getOrPut(alignment) {
-            ScaleToBoundsImpl(contentScale, alignment)
-        }
+        return map.getOrPut(alignment) { ScaleToBoundsImpl(contentScale, alignment) }
     } else {
         // Custom contentScale or alignment. No caching to avoid memory leak. This should be the
         // rare case
@@ -1310,15 +1260,26 @@
 }
 
 private val Alignment.shouldCache: Boolean
-    get() = this === TopStart || this === TopCenter || this === TopEnd ||
-        this === CenterStart || this === Center || this === CenterEnd ||
-        this === BottomStart || this === BottomCenter || this === BottomEnd
+    get() =
+        this === TopStart ||
+            this === TopCenter ||
+            this === TopEnd ||
+            this === CenterStart ||
+            this === Center ||
+            this === CenterEnd ||
+            this === BottomStart ||
+            this === BottomCenter ||
+            this === BottomEnd
 
 private val ContentScale.shouldCache: Boolean
-    get() = this === ContentScale.FillWidth || this === ContentScale.FillHeight ||
-        this === ContentScale.FillBounds || this === ContentScale.Fit ||
-        this === ContentScale.Crop || this === ContentScale.None ||
-        this === ContentScale.Inside
+    get() =
+        this === ContentScale.FillWidth ||
+            this === ContentScale.FillHeight ||
+            this === ContentScale.FillBounds ||
+            this === ContentScale.Fit ||
+            this === ContentScale.Crop ||
+            this === ContentScale.None ||
+            this === ContentScale.Inside
 
 @ExperimentalSharedTransitionApi
 private val cachedScaleToBoundsImplMap =
@@ -1326,10 +1287,7 @@
 
 @Immutable
 @ExperimentalSharedTransitionApi
-private class ScaleToBoundsImpl(
-    val contentScale: ContentScale,
-    val alignment: Alignment
-) : ResizeMode
+private class ScaleToBoundsImpl(val contentScale: ContentScale, val alignment: Alignment) :
+    ResizeMode
 
-@ExperimentalSharedTransitionApi
-private object RemeasureImpl : ResizeMode
+@ExperimentalSharedTransitionApi private object RemeasureImpl : ResizeMode
diff --git a/compose/animation/animation/src/commonMain/kotlin/androidx/compose/animation/SingleValueAnimation.kt b/compose/animation/animation/src/commonMain/kotlin/androidx/compose/animation/SingleValueAnimation.kt
index fcf0fc5..6d1e48d 100644
--- a/compose/animation/animation/src/commonMain/kotlin/androidx/compose/animation/SingleValueAnimation.kt
+++ b/compose/animation/animation/src/commonMain/kotlin/androidx/compose/animation/SingleValueAnimation.kt
@@ -34,13 +34,13 @@
 
 /**
  * Fire-and-forget animation function for [Color]. This Composable function is overloaded for
- * different parameter types such as [Dp], [Float], [Int], [Size], [Offset],
- * etc. When the provided [targetValue] is changed, the animation will run automatically. If there
- * is already an animation in-flight when [targetValue] changes, the on-going animation will adjust
- * course to animate towards the new target value.
+ * different parameter types such as [Dp], [Float], [Int], [Size], [Offset], etc. When the provided
+ * [targetValue] is changed, the animation will run automatically. If there is already an animation
+ * in-flight when [targetValue] changes, the on-going animation will adjust course to animate
+ * towards the new target value.
  *
- * [animateColorAsState] returns a [State] object. The value of the state object will
- * continuously be updated by the animation until the animation finishes.
+ * [animateColorAsState] returns a [State] object. The value of the state object will continuously
+ * be updated by the animation until the animation finishes.
  *
  * Note, [animateColorAsState] cannot be canceled/stopped without removing this composable function
  * from the tree. See [Animatable][androidx.compose.animation.Animatable] for cancelable animations.
@@ -48,8 +48,8 @@
  * @sample androidx.compose.animation.samples.ColorAnimationSample
  *
  * @param targetValue Target value of the animation
- * @param animationSpec The animation that will be used to change the value through time,
- *                      [spring] by default
+ * @param animationSpec The animation that will be used to change the value through time, [spring]
+ *   by default
  * @param label An optional label to differentiate from other animations in Android Studio.
  * @param finishedListener An optional listener to get notified when the animation is finished.
  */
@@ -60,11 +60,14 @@
     label: String = "ColorAnimation",
     finishedListener: ((Color) -> Unit)? = null
 ): State<Color> {
-    val converter = remember(targetValue.colorSpace) {
-        (Color.VectorConverter)(targetValue.colorSpace)
-    }
+    val converter =
+        remember(targetValue.colorSpace) { (Color.VectorConverter)(targetValue.colorSpace) }
     return animateValueAsState(
-        targetValue, converter, animationSpec, label = label, finishedListener = finishedListener
+        targetValue,
+        converter,
+        animationSpec,
+        label = label,
+        finishedListener = finishedListener
     )
 }
 
@@ -78,26 +81,23 @@
     animationSpec: AnimationSpec<Color> = colorDefaultSpring,
     finishedListener: ((Color) -> Unit)? = null
 ): State<Color> {
-    return animateColorAsState(
-        targetValue, animationSpec, finishedListener = finishedListener
-    )
+    return animateColorAsState(targetValue, animationSpec, finishedListener = finishedListener)
 }
 
 private val colorDefaultSpring = spring<Color>()
 
 /**
- * This [Animatable] function creates a Color value holder that automatically
- * animates its value when the value is changed via [animateTo]. [Animatable] supports value
- * change during an ongoing value change animation. When that happens, a new animation will
- * transition [Animatable] from its current value (i.e. value at the point of interruption) to the
- * new target. This ensures that the value change is *always* continuous using [animateTo]. If
- * [spring] animation (i.e. default animation) is used with [animateTo], the velocity change will
- * be guaranteed to be continuous as well.
+ * This [Animatable] function creates a Color value holder that automatically animates its value
+ * when the value is changed via [animateTo]. [Animatable] supports value change during an ongoing
+ * value change animation. When that happens, a new animation will transition [Animatable] from its
+ * current value (i.e. value at the point of interruption) to the new target. This ensures that the
+ * value change is *always* continuous using [animateTo]. If [spring] animation (i.e. default
+ * animation) is used with [animateTo], the velocity change will be guaranteed to be continuous as
+ * well.
  *
- * Unlike [AnimationState], [Animatable] ensures mutual exclusiveness on its animation. To
- * do so, when a new animation is started via [animateTo] (or [animateDecay]), any ongoing
- * animation job will be cancelled via a
- * [CancellationException][kotlinx.coroutines.CancellationException].
+ * Unlike [AnimationState], [Animatable] ensures mutual exclusiveness on its animation. To do so,
+ * when a new animation is started via [animateTo] (or [animateDecay]), any ongoing animation job
+ * will be cancelled via a [CancellationException][kotlinx.coroutines.CancellationException].
  *
  * [Animatable] also supports animating data types other than [Color], such as Floats and generic
  * types. See [androidx.compose.animation.core.Animatable] for other variants.
diff --git a/compose/animation/animation/src/commonMain/kotlin/androidx/compose/animation/SplineBasedDecay.kt b/compose/animation/animation/src/commonMain/kotlin/androidx/compose/animation/SplineBasedDecay.kt
index bebcc8f..8461157 100644
--- a/compose/animation/animation/src/commonMain/kotlin/androidx/compose/animation/SplineBasedDecay.kt
+++ b/compose/animation/animation/src/commonMain/kotlin/androidx/compose/animation/SplineBasedDecay.kt
@@ -98,30 +98,21 @@
             velocityCoef = (dSup - dInf) / (tSup - tInf)
             distanceCoef = dInf + (time - tInf) * velocityCoef
         }
-        return FlingResult(
-            distanceCoefficient = distanceCoef,
-            velocityCoefficient = velocityCoef
-        )
+        return FlingResult(distanceCoefficient = distanceCoef, velocityCoefficient = velocityCoef)
     }
 
-    /**
-     * The rate of deceleration along the spline motion given [velocity] and [friction].
-     */
+    /** The rate of deceleration along the spline motion given [velocity] and [friction]. */
     fun deceleration(velocity: Float, friction: Float): Double =
         ln(Inflection * abs(velocity) / friction.toDouble())
 
-    /**
-     * Result coefficients of a scroll computation
-     */
+    /** Result coefficients of a scroll computation */
     // TODO: pack this into an inline class
     data class FlingResult(
-        /**
-         * Linear distance traveled from 0-1, from source (0) to destination (1)
-         */
+        /** Linear distance traveled from 0-1, from source (0) to destination (1) */
         val distanceCoefficient: Float,
         /**
-         * Instantaneous velocity coefficient at this point in the fling expressed in
-         * total distance per unit time
+         * Instantaneous velocity coefficient at this point in the fling expressed in total distance
+         * per unit time
          */
         val velocityCoefficient: Float
     )
diff --git a/compose/animation/animation/src/commonMain/kotlin/androidx/compose/animation/SplineBasedFloatDecayAnimationSpec.kt b/compose/animation/animation/src/commonMain/kotlin/androidx/compose/animation/SplineBasedFloatDecayAnimationSpec.kt
index 68e3c8c..686d2fc 100644
--- a/compose/animation/animation/src/commonMain/kotlin/androidx/compose/animation/SplineBasedFloatDecayAnimationSpec.kt
+++ b/compose/animation/animation/src/commonMain/kotlin/androidx/compose/animation/SplineBasedFloatDecayAnimationSpec.kt
@@ -25,15 +25,13 @@
  *
  * @param density density of the display
  */
-class SplineBasedFloatDecayAnimationSpec(density: Density) :
-    FloatDecayAnimationSpec {
+class SplineBasedFloatDecayAnimationSpec(density: Density) : FloatDecayAnimationSpec {
 
-    private val flingCalculator = FlingCalculator(
-        friction = platformFlingScrollFriction,
-        density = density
-    )
+    private val flingCalculator =
+        FlingCalculator(friction = platformFlingScrollFriction, density = density)
 
-    override val absVelocityThreshold: Float get() = 0f
+    override val absVelocityThreshold: Float
+        get() = 0f
 
     private fun flingDistance(startVelocity: Float): Float =
         flingCalculator.flingDistance(startVelocity) * sign(startVelocity)
diff --git a/compose/animation/animation/src/commonMain/kotlin/androidx/compose/animation/Transition.kt b/compose/animation/animation/src/commonMain/kotlin/androidx/compose/animation/Transition.kt
index 0641c57..7acc04e 100644
--- a/compose/animation/animation/src/commonMain/kotlin/androidx/compose/animation/Transition.kt
+++ b/compose/animation/animation/src/commonMain/kotlin/androidx/compose/animation/Transition.kt
@@ -33,15 +33,15 @@
 import androidx.compose.ui.graphics.Color
 
 /**
- * Creates a [Color] animation as a part of the given [Transition]. This means the lifecycle
- * of this animation will be managed by the [Transition].
+ * Creates a [Color] animation as a part of the given [Transition]. This means the lifecycle of this
+ * animation will be managed by the [Transition].
  *
  * [targetValueByState] is used as a mapping from a target state to the target value of this
  * animation. [Transition] will be using this mapping to determine what value to target this
  * animation towards. __Note__ that [targetValueByState] is a composable function. This means the
  * mapping function could access states, CompositionLocals, themes, etc. If the target value changes
- * when the [Transition] already reached its [targetState][Transition.targetState],
- * the [Transition] will run an animation to ensure the new target value is reached smoothly.
+ * when the [Transition] already reached its [targetState][Transition.targetState], the [Transition]
+ * will run an animation to ensure the new target value is reached smoothly.
  *
  * An optional [transitionSpec] can be provided to specify (potentially different) animations for
  * each pair of initialState and targetState. [FiniteAnimationSpec] can be used to describe such
@@ -61,15 +61,14 @@
  */
 @Composable
 inline fun <S> Transition<S>.animateColor(
-    noinline transitionSpec:
-    @Composable Transition.Segment<S>.() -> FiniteAnimationSpec<Color> = { spring() },
+    noinline transitionSpec: @Composable Transition.Segment<S>.() -> FiniteAnimationSpec<Color> = {
+        spring()
+    },
     label: String = "ColorAnimation",
     targetValueByState: @Composable() (state: S) -> Color
 ): State<Color> {
     val colorSpace = targetValueByState(targetState).colorSpace
-    val typeConverter = remember(colorSpace) {
-        Color.VectorConverter(colorSpace)
-    }
+    val typeConverter = remember(colorSpace) { Color.VectorConverter(colorSpace) }
 
     return animateValue(typeConverter, transitionSpec, label, targetValueByState)
 }
@@ -78,9 +77,9 @@
  * Creates a Color animation that runs infinitely as a part of the given [InfiniteTransition].
  *
  * Once the animation is created, it will run from [initialValue] to [targetValue] and repeat.
- * Depending on the [RepeatMode] of the provided [animationSpec], the animation could either
- * restart after each iteration (i.e. [RepeatMode.Restart]), or reverse after each iteration (i.e
- * . [RepeatMode.Reverse]).
+ * Depending on the [RepeatMode] of the provided [animationSpec], the animation could either restart
+ * after each iteration (i.e. [RepeatMode.Restart]), or reverse after each iteration (i.e .
+ * [RepeatMode.Reverse]).
  *
  * If [initialValue] or [targetValue] is changed at any point during the animation, the animation
  * will be restarted with the new initial/targetValue. __Note__: this means animation continuity
@@ -100,9 +99,7 @@
     animationSpec: InfiniteRepeatableSpec<Color>,
     label: String = "ColorAnimation"
 ): State<Color> {
-    val converter = remember {
-        (Color.VectorConverter)(targetValue.colorSpace)
-    }
+    val converter = remember { (Color.VectorConverter)(targetValue.colorSpace) }
     return animateValue(initialValue, targetValue, converter, animationSpec, label)
 }
 
@@ -115,9 +112,10 @@
     initialValue: Color,
     targetValue: Color,
     animationSpec: InfiniteRepeatableSpec<Color>
-): State<Color> = this.animateColor(
-    initialValue = initialValue,
-    targetValue = targetValue,
-    animationSpec = animationSpec,
-    label = "ColorAnimation"
-)
+): State<Color> =
+    this.animateColor(
+        initialValue = initialValue,
+        targetValue = targetValue,
+        animationSpec = animationSpec,
+        label = "ColorAnimation"
+    )
diff --git a/compose/benchmark-utils/src/main/java/androidx/compose/testutils/benchmark/AndroidBenchmarkRule.kt b/compose/benchmark-utils/src/main/java/androidx/compose/testutils/benchmark/AndroidBenchmarkRule.kt
index 51c42fa..189a0bc 100644
--- a/compose/benchmark-utils/src/main/java/androidx/compose/testutils/benchmark/AndroidBenchmarkRule.kt
+++ b/compose/benchmark-utils/src/main/java/androidx/compose/testutils/benchmark/AndroidBenchmarkRule.kt
@@ -29,9 +29,7 @@
 import org.junit.runner.Description
 import org.junit.runners.model.Statement
 
-/**
- * Rule to be used to run Android benchmarks.
- */
+/** Rule to be used to run Android benchmarks. */
 class AndroidBenchmarkRule : TestRule {
 
     @Suppress("DEPRECATION")
@@ -41,9 +39,7 @@
     val benchmarkRule = BenchmarkRule()
 
     override fun apply(base: Statement, description: Description?): Statement {
-        return benchmarkRule.apply(
-            activityTestRule.apply(base, description), description!!
-        )
+        return benchmarkRule.apply(activityTestRule.apply(base, description), description!!)
     }
 
     /**
@@ -57,8 +53,7 @@
      */
     fun <T : AndroidTestCase> runBenchmarkFor(
         givenTestCase: () -> T,
-        @WorkerThread
-        block: AndroidTestCaseRunner<T>.() -> Unit
+        @WorkerThread block: AndroidTestCaseRunner<T>.() -> Unit
     ) {
         check(Looper.myLooper() != Looper.getMainLooper()) {
             "Cannot invoke runBenchmarkFor from the main thread"
@@ -67,30 +62,18 @@
             "Expected ${AndroidTestCase::class.simpleName}!"
         }
         lateinit var runner: AndroidTestCaseRunner<T>
-        runOnUiThread {
-            runner = AndroidTestCaseRunner(
-                givenTestCase,
-                activityTestRule.activity
-            )
-        }
+        runOnUiThread { runner = AndroidTestCaseRunner(givenTestCase, activityTestRule.activity) }
 
         block(runner)
     }
 
-    /**
-     * Convenience proxy for [BenchmarkRule.measureRepeatedOnMainThread].
-     */
+    /** Convenience proxy for [BenchmarkRule.measureRepeatedOnMainThread]. */
     @WorkerThread
-    fun measureRepeatedOnUiThread(
-        @UiThread
-        block: BenchmarkRule.Scope.() -> Unit
-    ) {
+    fun measureRepeatedOnUiThread(@UiThread block: BenchmarkRule.Scope.() -> Unit) {
         benchmarkRule.measureRepeatedOnMainThread(block)
     }
 
-    /**
-     * Convenience proxy for `ActivityTestRule.runOnUiThread`
-     */
+    /** Convenience proxy for `ActivityTestRule.runOnUiThread` */
     fun runOnUiThread(block: () -> Unit) {
         activityTestRule.runOnUiThread(block)
     }
diff --git a/compose/benchmark-utils/src/main/java/androidx/compose/testutils/benchmark/BenchmarkFirstExtensions.kt b/compose/benchmark-utils/src/main/java/androidx/compose/testutils/benchmark/BenchmarkFirstExtensions.kt
index 215d0db..108d8f4 100644
--- a/compose/benchmark-utils/src/main/java/androidx/compose/testutils/benchmark/BenchmarkFirstExtensions.kt
+++ b/compose/benchmark-utils/src/main/java/androidx/compose/testutils/benchmark/BenchmarkFirstExtensions.kt
@@ -29,8 +29,8 @@
 import org.junit.Assert.assertTrue
 
 /**
- * Measures the time to draw the first pixel right after the given test case is added to an
- * already existing hierarchy. This benchmarks the full compose -> measure -> layout -> draw cycle.
+ * Measures the time to draw the first pixel right after the given test case is added to an already
+ * existing hierarchy. This benchmarks the full compose -> measure -> layout -> draw cycle.
  */
 fun ComposeBenchmarkRule.benchmarkToFirstPixel(caseFactory: () -> LayeredComposeTestCase) {
     runBenchmarkFor(LayeredCaseAdapter.of(caseFactory)) {
@@ -58,8 +58,8 @@
 }
 
 /**
- * Measures the time of the first composition right after the given test case is added to an
- * already existing hierarchy.
+ * Measures the time of the first composition right after the given test case is added to an already
+ * existing hierarchy.
  */
 fun ComposeBenchmarkRule.benchmarkFirstCompose(caseFactory: () -> LayeredComposeTestCase) {
     runBenchmarkFor(LayeredCaseAdapter.of(caseFactory)) {
@@ -72,9 +72,7 @@
 
             recomposeUntilNoChangesPending()
 
-            runWithTimingDisabled {
-                disposeContent()
-            }
+            runWithTimingDisabled { disposeContent() }
         }
     }
 }
@@ -159,23 +157,17 @@
     }
 }
 
-/**
- * Measures the time of the first set content of the given Android test case.
- */
+/** Measures the time of the first set content of the given Android test case. */
 fun AndroidBenchmarkRule.benchmarkFirstSetContent(caseFactory: () -> AndroidTestCase) {
     runBenchmarkFor(caseFactory) {
         measureRepeatedOnUiThread {
             setupContent()
-            runWithTimingDisabled {
-                disposeContent()
-            }
+            runWithTimingDisabled { disposeContent() }
         }
     }
 }
 
-/**
- * Measures the time of the first measure of the given test case.
- */
+/** Measures the time of the first measure of the given test case. */
 fun AndroidBenchmarkRule.benchmarkFirstMeasure(caseFactory: () -> AndroidTestCase) {
     runBenchmarkFor(caseFactory) {
         measureRepeatedOnUiThread {
@@ -186,16 +178,12 @@
 
             measure()
 
-            runWithTimingDisabled {
-                disposeContent()
-            }
+            runWithTimingDisabled { disposeContent() }
         }
     }
 }
 
-/**
- * Measures the time of the first layout of the given test case.
- */
+/** Measures the time of the first layout of the given test case. */
 fun AndroidBenchmarkRule.benchmarkFirstLayout(caseFactory: () -> AndroidTestCase) {
     runBenchmarkFor(caseFactory) {
         measureRepeatedOnUiThread {
@@ -207,16 +195,12 @@
 
             layout()
 
-            runWithTimingDisabled {
-                disposeContent()
-            }
+            runWithTimingDisabled { disposeContent() }
         }
     }
 }
 
-/**
- * Measures the time of the first draw of the given test case.
- */
+/** Measures the time of the first draw of the given test case. */
 fun AndroidBenchmarkRule.benchmarkFirstDraw(caseFactory: () -> AndroidTestCase) {
     runBenchmarkFor(caseFactory) {
         measureRepeatedOnUiThread {
@@ -242,7 +226,7 @@
  * Runs recompositions until there are no changes pending.
  *
  * @param maxAmountOfStep Max amount of recomposition to perform before giving up and throwing
- * exception.
+ *   exception.
  * @throws AssertionError if there are still pending changes after [maxAmountOfStep] executed.
  */
 fun ComposeExecutionControl.recomposeUntilNoChangesPending(maxAmountOfStep: Int = 10): Int {
@@ -257,10 +241,7 @@
     }
 
     // Still not stable
-    throw AssertionError(
-        "Changes are still pending after '$maxAmountOfStep' " +
-            "frames."
-    )
+    throw AssertionError("Changes are still pending after '$maxAmountOfStep' " + "frames.")
 }
 
 private class LayeredCaseAdapter(private val innerCase: LayeredComposeTestCase) : ComposeTestCase {
diff --git a/compose/benchmark-utils/src/main/java/androidx/compose/testutils/benchmark/BenchmarkHelpers.kt b/compose/benchmark-utils/src/main/java/androidx/compose/testutils/benchmark/BenchmarkHelpers.kt
index d313d54..1c0568b 100644
--- a/compose/benchmark-utils/src/main/java/androidx/compose/testutils/benchmark/BenchmarkHelpers.kt
+++ b/compose/benchmark-utils/src/main/java/androidx/compose/testutils/benchmark/BenchmarkHelpers.kt
@@ -27,6 +27,7 @@
 // potentially unloaded class, RenderNodeCapture.
 interface DrawCapture {
     fun beginRecording(width: Int, height: Int): Canvas
+
     fun endRecording()
 }
 
diff --git a/compose/benchmark-utils/src/main/java/androidx/compose/testutils/benchmark/BenchmarksExtensions.kt b/compose/benchmark-utils/src/main/java/androidx/compose/testutils/benchmark/BenchmarksExtensions.kt
index ec87d57..46a3dd5 100644
--- a/compose/benchmark-utils/src/main/java/androidx/compose/testutils/benchmark/BenchmarksExtensions.kt
+++ b/compose/benchmark-utils/src/main/java/androidx/compose/testutils/benchmark/BenchmarksExtensions.kt
@@ -106,14 +106,10 @@
     }
 }
 
-/**
- * Measures draw performance of the given test case by invalidating the view hierarchy.
- */
+/** Measures draw performance of the given test case by invalidating the view hierarchy. */
 fun AndroidBenchmarkRule.benchmarkDrawPerf(caseFactory: () -> AndroidTestCase) {
     runBenchmarkFor(caseFactory) {
-        runOnUiThread {
-            doFrame()
-        }
+        runOnUiThread { doFrame() }
 
         measureRepeatedOnUiThread {
             runWithTimingDisabled {
@@ -121,21 +117,15 @@
                 drawPrepare()
             }
             draw()
-            runWithTimingDisabled {
-                drawFinish()
-            }
+            runWithTimingDisabled { drawFinish() }
         }
     }
 }
 
-/**
- * Measures draw performance of the given test case by invalidating the view hierarchy.
- */
+/** Measures draw performance of the given test case by invalidating the view hierarchy. */
 fun ComposeBenchmarkRule.benchmarkDrawPerf(caseFactory: () -> ComposeTestCase) {
     runBenchmarkFor(caseFactory) {
-        runOnUiThread {
-            doFramesUntilNoChangesPending()
-        }
+        runOnUiThread { doFramesUntilNoChangesPending() }
 
         measureRepeatedOnUiThread {
             runWithTimingDisabled {
@@ -143,20 +133,18 @@
                 drawPrepare()
             }
             draw()
-            runWithTimingDisabled {
-                drawFinish()
-            }
+            runWithTimingDisabled { drawFinish() }
         }
     }
 }
 
 /**
- *  Measures recomposition time of the hierarchy after changing a state.
+ * Measures recomposition time of the hierarchy after changing a state.
  *
- * @param assertOneRecomposition whether the benchmark will fail if there are pending
- * recompositions after the first recomposition. By default this is true to enforce correctness in
- * the benchmark, but for components that have animations after being recomposed this can
- * be turned off to benchmark just the first recomposition without any pending animations.
+ * @param assertOneRecomposition whether the benchmark will fail if there are pending recompositions
+ *   after the first recomposition. By default this is true to enforce correctness in the benchmark,
+ *   but for components that have animations after being recomposed this can be turned off to
+ *   benchmark just the first recomposition without any pending animations.
  */
 fun <T> ComposeBenchmarkRule.toggleStateBenchmarkRecompose(
     caseFactory: () -> T,
@@ -164,13 +152,9 @@
     requireRecomposition: Boolean = true,
 ) where T : ComposeTestCase, T : ToggleableTestCase {
     runBenchmarkFor(caseFactory) {
-        runOnUiThread {
-            doFramesUntilNoChangesPending()
-        }
+        runOnUiThread { doFramesUntilNoChangesPending() }
         measureRepeatedOnUiThread {
-            runWithTimingDisabled {
-                getTestCase().toggleState()
-            }
+            runWithTimingDisabled { getTestCase().toggleState() }
             if (requireRecomposition) {
                 recomposeAssertHadChanges()
             } else {
@@ -184,12 +168,12 @@
 }
 
 /**
- *  Measures measure time of the hierarchy after changing a state.
+ * Measures measure time of the hierarchy after changing a state.
  *
- * @param assertOneRecomposition whether the benchmark will fail if there are pending
- * recompositions after the first recomposition. By default this is true to enforce correctness in
- * the benchmark, but for components that have animations after being recomposed this can
- * be turned off to benchmark just the first remeasure without any pending animations.
+ * @param assertOneRecomposition whether the benchmark will fail if there are pending recompositions
+ *   after the first recomposition. By default this is true to enforce correctness in the benchmark,
+ *   but for components that have animations after being recomposed this can be turned off to
+ *   benchmark just the first remeasure without any pending animations.
  */
 fun <T> ComposeBenchmarkRule.toggleStateBenchmarkMeasure(
     caseFactory: () -> T,
@@ -197,9 +181,7 @@
     assertOneRecomposition: Boolean = true
 ) where T : ComposeTestCase, T : ToggleableTestCase {
     runBenchmarkFor(caseFactory) {
-        runOnUiThread {
-            doFramesUntilNoChangesPending()
-        }
+        runOnUiThread { doFramesUntilNoChangesPending() }
         measureRepeatedOnUiThread {
             runWithTimingDisabled {
                 getTestCase().toggleState()
@@ -220,12 +202,12 @@
 }
 
 /**
- *  Measures layout time of the hierarchy after changing a state.
+ * Measures layout time of the hierarchy after changing a state.
  *
- * @param assertOneRecomposition whether the benchmark will fail if there are pending
- * recompositions after the first recomposition. By default this is true to enforce correctness in
- * the benchmark, but for components that have animations after being recomposed this can
- * be turned off to benchmark just the first relayout without any pending animations.
+ * @param assertOneRecomposition whether the benchmark will fail if there are pending recompositions
+ *   after the first recomposition. By default this is true to enforce correctness in the benchmark,
+ *   but for components that have animations after being recomposed this can be turned off to
+ *   benchmark just the first relayout without any pending animations.
  */
 fun <T> ComposeBenchmarkRule.toggleStateBenchmarkLayout(
     caseFactory: () -> T,
@@ -233,9 +215,7 @@
     assertOneRecomposition: Boolean = true
 ) where T : ComposeTestCase, T : ToggleableTestCase {
     runBenchmarkFor(caseFactory) {
-        runOnUiThread {
-            doFramesUntilNoChangesPending()
-        }
+        runOnUiThread { doFramesUntilNoChangesPending() }
 
         measureRepeatedOnUiThread {
             runWithTimingDisabled {
@@ -258,12 +238,12 @@
 }
 
 /**
- *  Measures draw time of the hierarchy after changing a state.
+ * Measures draw time of the hierarchy after changing a state.
  *
- * @param assertOneRecomposition whether the benchmark will fail if there are pending
- * recompositions after the first recomposition. By default this is true to enforce correctness in
- * the benchmark, but for components that have animations after being recomposed this can
- * be turned off to benchmark just the first redraw without any pending animations.
+ * @param assertOneRecomposition whether the benchmark will fail if there are pending recompositions
+ *   after the first recomposition. By default this is true to enforce correctness in the benchmark,
+ *   but for components that have animations after being recomposed this can be turned off to
+ *   benchmark just the first redraw without any pending animations.
  */
 fun <T> ComposeBenchmarkRule.toggleStateBenchmarkDraw(
     caseFactory: () -> T,
@@ -271,9 +251,7 @@
     assertOneRecomposition: Boolean = true
 ) where T : ComposeTestCase, T : ToggleableTestCase {
     runBenchmarkFor(caseFactory) {
-        runOnUiThread {
-            doFramesUntilNoChangesPending()
-        }
+        runOnUiThread { doFramesUntilNoChangesPending() }
 
         measureRepeatedOnUiThread {
             runWithTimingDisabled {
@@ -290,43 +268,31 @@
                 drawPrepare()
             }
             draw()
-            runWithTimingDisabled {
-                drawFinish()
-            }
+            runWithTimingDisabled { drawFinish() }
         }
     }
 }
 
-/**
- *  Measures measure time of the hierarchy after changing a state.
- */
-fun <T> AndroidBenchmarkRule.toggleStateBenchmarkMeasure(
-    caseFactory: () -> T
-) where T : AndroidTestCase, T : ToggleableTestCase {
+/** Measures measure time of the hierarchy after changing a state. */
+fun <T> AndroidBenchmarkRule.toggleStateBenchmarkMeasure(caseFactory: () -> T) where
+T : AndroidTestCase,
+T : ToggleableTestCase {
     runBenchmarkFor(caseFactory) {
-        runOnUiThread {
-            doFrame()
-        }
+        runOnUiThread { doFrame() }
 
         measureRepeatedOnUiThread {
-            runWithTimingDisabled {
-                getTestCase().toggleState()
-            }
+            runWithTimingDisabled { getTestCase().toggleState() }
             measure()
         }
     }
 }
 
-/**
- *  Measures layout time of the hierarchy after changing a state.
- */
-fun <T> AndroidBenchmarkRule.toggleStateBenchmarkLayout(
-    caseFactory: () -> T
-) where T : AndroidTestCase, T : ToggleableTestCase {
+/** Measures layout time of the hierarchy after changing a state. */
+fun <T> AndroidBenchmarkRule.toggleStateBenchmarkLayout(caseFactory: () -> T) where
+T : AndroidTestCase,
+T : ToggleableTestCase {
     runBenchmarkFor(caseFactory) {
-        runOnUiThread {
-            doFrame()
-        }
+        runOnUiThread { doFrame() }
 
         measureRepeatedOnUiThread {
             runWithTimingDisabled {
@@ -338,16 +304,12 @@
     }
 }
 
-/**
- *  Measures draw time of the hierarchy after changing a state.
- */
-fun <T> AndroidBenchmarkRule.toggleStateBenchmarkDraw(
-    caseFactory: () -> T
-) where T : AndroidTestCase, T : ToggleableTestCase {
+/** Measures draw time of the hierarchy after changing a state. */
+fun <T> AndroidBenchmarkRule.toggleStateBenchmarkDraw(caseFactory: () -> T) where
+T : AndroidTestCase,
+T : ToggleableTestCase {
     runBenchmarkFor(caseFactory) {
-        runOnUiThread {
-            doFrame()
-        }
+        runOnUiThread { doFrame() }
 
         measureRepeatedOnUiThread {
             runWithTimingDisabled {
@@ -357,21 +319,18 @@
                 drawPrepare()
             }
             draw()
-            runWithTimingDisabled {
-                drawFinish()
-            }
+            runWithTimingDisabled { drawFinish() }
         }
     }
 }
 
 /**
- *  Measures recompose, measure and layout time after changing a state.
+ * Measures recompose, measure and layout time after changing a state.
  *
- * @param assertOneRecomposition whether the benchmark will fail if there are pending
- * recompositions after the first recomposition. By default this is true to enforce correctness in
- * the benchmark, but for components that have animations after being recomposed this can
- * be turned off to benchmark just the first recompose, remeasure and relayout without any pending
- * animations.
+ * @param assertOneRecomposition whether the benchmark will fail if there are pending recompositions
+ *   after the first recomposition. By default this is true to enforce correctness in the benchmark,
+ *   but for components that have animations after being recomposed this can be turned off to
+ *   benchmark just the first recompose, remeasure and relayout without any pending animations.
  */
 fun <T> ComposeBenchmarkRule.toggleStateBenchmarkComposeMeasureLayout(
     caseFactory: () -> T,
@@ -379,9 +338,7 @@
     requireRecomposition: Boolean = true
 ) where T : ComposeTestCase, T : ToggleableTestCase {
     runBenchmarkFor(caseFactory) {
-        runOnUiThread {
-            doFramesUntilNoChangesPending()
-        }
+        runOnUiThread { doFramesUntilNoChangesPending() }
         measureRepeatedOnUiThread {
             getTestCase().toggleState()
             if (requireRecomposition) {
@@ -404,21 +361,19 @@
 }
 
 /**
- *  Measures measure and layout time after changing a state.
+ * Measures measure and layout time after changing a state.
  *
- * @param assertOneRecomposition whether the benchmark will fail if there are pending
- * recompositions after the first recomposition. By default this is true to enforce correctness in
- * the benchmark, but for components that have animations after being recomposed this can
- * be turned off to benchmark just the first remeasure and relayout without any pending animations.
+ * @param assertOneRecomposition whether the benchmark will fail if there are pending recompositions
+ *   after the first recomposition. By default this is true to enforce correctness in the benchmark,
+ *   but for components that have animations after being recomposed this can be turned off to
+ *   benchmark just the first remeasure and relayout without any pending animations.
  */
 fun <T> ComposeBenchmarkRule.toggleStateBenchmarkMeasureLayout(
     caseFactory: () -> T,
     assertOneRecomposition: Boolean = true
 ) where T : ComposeTestCase, T : ToggleableTestCase {
     runBenchmarkFor(caseFactory) {
-        runOnUiThread {
-            doFramesUntilNoChangesPending()
-        }
+        runOnUiThread { doFramesUntilNoChangesPending() }
 
         measureRepeatedOnUiThread {
             runWithTimingDisabled {
@@ -437,11 +392,10 @@
 
 /**
  * Runs a reuse benchmark for the given [content].
+ *
  * @param content The Content to be benchmarked.
  */
-fun ComposeBenchmarkRule.benchmarkReuseFor(
-    content: @Composable () -> Unit
-) {
+fun ComposeBenchmarkRule.benchmarkReuseFor(content: @Composable () -> Unit) {
     val testCase = { SubcomposeLayoutReuseTestCase(reusableSlots = 1, content) }
     runBenchmarkFor(testCase) {
         runOnUiThread {
@@ -473,7 +427,7 @@
  * A [ComposeTestCase] to emulate content reuse.
  *
  * @param reusableSlots The max number of slots that will be kept for use. For instance, if
- * reusableSlots=0 the content will be always disposed.
+ *   reusableSlots=0 the content will be always disposed.
  * @param content The composable content that will be benchmarked
  */
 class SubcomposeLayoutReuseTestCase(
@@ -484,14 +438,14 @@
 
     @Composable
     override fun Content() {
-        SubcomposeLayout(
-            SubcomposeLayoutState(SubcomposeSlotReusePolicy(reusableSlots))
-        ) { constraints ->
-            val measurables = if (active) {
-                subcompose(Unit) { content() }
-            } else {
-                null
-            }
+        SubcomposeLayout(SubcomposeLayoutState(SubcomposeSlotReusePolicy(reusableSlots))) {
+            constraints ->
+            val measurables =
+                if (active) {
+                    subcompose(Unit) { content() }
+                } else {
+                    null
+                }
 
             val placeable = measurables?.single()?.measure(constraints)
             layout(placeable?.width ?: 0, placeable?.height ?: 0) {
diff --git a/compose/benchmark-utils/src/main/java/androidx/compose/testutils/benchmark/ComposeBenchmarkRule.kt b/compose/benchmark-utils/src/main/java/androidx/compose/testutils/benchmark/ComposeBenchmarkRule.kt
index 975dd9f..4fc18af 100644
--- a/compose/benchmark-utils/src/main/java/androidx/compose/testutils/benchmark/ComposeBenchmarkRule.kt
+++ b/compose/benchmark-utils/src/main/java/androidx/compose/testutils/benchmark/ComposeBenchmarkRule.kt
@@ -35,11 +35,10 @@
 import org.junit.runner.Description
 import org.junit.runners.model.Statement
 
-/**
- * Rule to be used to run Compose / Android benchmarks.
- */
+/** Rule to be used to run Compose / Android benchmarks. */
 @OptIn(ExperimentalBenchmarkConfigApi::class)
-class ComposeBenchmarkRule internal constructor(
+class ComposeBenchmarkRule
+internal constructor(
     // this is a hack to avoid exposing the config param to all callers,
     // can change to optional when MicrobenchmarkConfig is non-experimental
     internalConfig: MicrobenchmarkConfig? = null,
@@ -58,18 +57,16 @@
 
     // We don't use the config default constructor as a default, as it overrides values from
     // instrumentation args, which may be surprising
-    val benchmarkRule = if (internalConfig == null) {
-        BenchmarkRule()
-    } else {
-        BenchmarkRule(internalConfig)
-    }
+    val benchmarkRule =
+        if (internalConfig == null) {
+            BenchmarkRule()
+        } else {
+            BenchmarkRule(internalConfig)
+        }
 
     override fun apply(base: Statement, description: Description?): Statement {
         @OptIn(InternalTestApi::class)
-        return RuleChain
-            .outerRule(benchmarkRule)
-            .around(activityTestRule)
-            .apply(base, description)
+        return RuleChain.outerRule(benchmarkRule).around(activityTestRule).apply(base, description)
     }
 
     /**
@@ -83,8 +80,7 @@
      */
     fun <T : ComposeTestCase> runBenchmarkFor(
         givenTestCase: () -> T,
-        @WorkerThread
-        block: ComposeBenchmarkScope<T>.() -> Unit
+        @WorkerThread block: ComposeBenchmarkScope<T>.() -> Unit
     ) {
         check(Looper.myLooper() != Looper.getMainLooper()) {
             "Cannot invoke runBenchmarkFor from the main thread"
@@ -95,10 +91,7 @@
 
         lateinit var runner: ComposeBenchmarkScope<T>
         runOnUiThread {
-            runner = createAndroidComposeBenchmarkRunner(
-                givenTestCase,
-                activityTestRule.activity
-            )
+            runner = createAndroidComposeBenchmarkRunner(givenTestCase, activityTestRule.activity)
         }
 
         try {
@@ -116,27 +109,17 @@
      *
      * Should not be used for UI work.
      */
-    fun measureRepeated(
-        @WorkerThread
-        block: BenchmarkRule.Scope.() -> Unit
-    ) {
+    fun measureRepeated(@WorkerThread block: BenchmarkRule.Scope.() -> Unit) {
         benchmarkRule.measureRepeated(block)
     }
 
-    /**
-     * Convenience proxy for [BenchmarkRule.measureRepeatedOnMainThread].
-     */
+    /** Convenience proxy for [BenchmarkRule.measureRepeatedOnMainThread]. */
     @WorkerThread
-    fun measureRepeatedOnUiThread(
-        @UiThread
-        block: BenchmarkRule.Scope.() -> Unit
-    ) {
+    fun measureRepeatedOnUiThread(@UiThread block: BenchmarkRule.Scope.() -> Unit) {
         benchmarkRule.measureRepeatedOnMainThread(block)
     }
 
-    /**
-     * Convenience proxy for `ActivityTestRule.runOnUiThread`
-     */
+    /** Convenience proxy for `ActivityTestRule.runOnUiThread` */
     fun runOnUiThread(block: () -> Unit) {
         activityTestRule.runOnUiThread(block)
     }
diff --git a/compose/benchmark-utils/src/main/java/androidx/compose/testutils/benchmark/android/AndroidTestCase.kt b/compose/benchmark-utils/src/main/java/androidx/compose/testutils/benchmark/android/AndroidTestCase.kt
index 772d621..be69af3 100644
--- a/compose/benchmark-utils/src/main/java/androidx/compose/testutils/benchmark/android/AndroidTestCase.kt
+++ b/compose/benchmark-utils/src/main/java/androidx/compose/testutils/benchmark/android/AndroidTestCase.kt
@@ -19,9 +19,7 @@
 import android.app.Activity
 import android.view.ViewGroup
 
-/**
- * To be implemented to provide a test case that can be executed in benchmarks.
- */
+/** To be implemented to provide a test case that can be executed in benchmarks. */
 interface AndroidTestCase {
     fun getContent(activity: Activity): ViewGroup
 }
diff --git a/compose/benchmark-utils/src/main/java/androidx/compose/testutils/benchmark/android/AndroidTestCaseRunner.kt b/compose/benchmark-utils/src/main/java/androidx/compose/testutils/benchmark/android/AndroidTestCaseRunner.kt
index f874219..aca596f 100644
--- a/compose/benchmark-utils/src/main/java/androidx/compose/testutils/benchmark/android/AndroidTestCaseRunner.kt
+++ b/compose/benchmark-utils/src/main/java/androidx/compose/testutils/benchmark/android/AndroidTestCaseRunner.kt
@@ -36,6 +36,7 @@
 
     val measuredWidth: Int
         get() = view!!.measuredWidth
+
     val measuredHeight: Int
         get() = view!!.measuredHeight
 
@@ -153,6 +154,7 @@
 // potentially unloaded class, RenderNodeCapture.
 private interface DrawCapture {
     fun beginRecording(width: Int, height: Int): Canvas
+
     fun endRecording()
 }
 
diff --git a/compose/compiler/compiler-hosted/integration-tests/src/desktopTest/kotlin/androidx/compose/compiler/plugins/kotlin/debug/AbstractDebuggerTest.kt b/compose/compiler/compiler-hosted/integration-tests/src/desktopTest/kotlin/androidx/compose/compiler/plugins/kotlin/debug/AbstractDebuggerTest.kt
index 24f5778..6a71962 100644
--- a/compose/compiler/compiler-hosted/integration-tests/src/desktopTest/kotlin/androidx/compose/compiler/plugins/kotlin/debug/AbstractDebuggerTest.kt
+++ b/compose/compiler/compiler-hosted/integration-tests/src/desktopTest/kotlin/androidx/compose/compiler/plugins/kotlin/debug/AbstractDebuggerTest.kt
@@ -15,6 +15,7 @@
  */
 
 @file:Suppress("JAVA_MODULE_DOES_NOT_EXPORT_PACKAGE")
+
 package androidx.compose.compiler.plugins.kotlin.debug
 
 import androidx.compose.compiler.plugins.kotlin.AbstractCodegenTest
@@ -69,12 +70,13 @@
         @BeforeClass
         fun startDebugProcess() {
             testServerProcess = startTestProcessServer()
-            val (debuggerPort, _proxyPort) = testServerProcess.inputStream.bufferedReader().use {
-                val debuggerPort = it.readLine().split("address:").last().trim().toInt()
-                it.readLine()
-                val proxyPort = it.readLine().split("port ").last().trim().toInt()
-                (debuggerPort to proxyPort)
-            }
+            val (debuggerPort, _proxyPort) =
+                testServerProcess.inputStream.bufferedReader().use {
+                    val debuggerPort = it.readLine().split("address:").last().trim().toInt()
+                    it.readLine()
+                    val proxyPort = it.readLine().split("port ").last().trim().toInt()
+                    (debuggerPort to proxyPort)
+                }
             virtualMachine = attachDebugger(debuggerPort)
             proxyPort = _proxyPort
         }
@@ -86,22 +88,25 @@
         }
 
         private fun startTestProcessServer(): Process {
-            val classpath = listOf(
-                PathUtil.getJarPathForClass(TestProcessServer::class.java),
-                PathUtil.getJarPathForClass(Delegates::class.java) // Add Kotlin runtime JAR
-            )
+            val classpath =
+                listOf(
+                    PathUtil.getJarPathForClass(TestProcessServer::class.java),
+                    PathUtil.getJarPathForClass(Delegates::class.java) // Add Kotlin runtime JAR
+                )
 
             val javaExec = File(File(SystemProperties.getJavaHome(), "bin"), "java")
             assert(javaExec.exists())
 
-            val command = listOf(
-                javaExec.absolutePath,
-                "-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=127.0.0.1:0",
-                "-ea",
-                "-classpath", classpath.joinToString(File.pathSeparator),
-                TestProcessServer::class.qualifiedName,
-                TestProcessServer.DEBUG_TEST
-            )
+            val command =
+                listOf(
+                    javaExec.absolutePath,
+                    "-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=127.0.0.1:0",
+                    "-ea",
+                    "-classpath",
+                    classpath.joinToString(File.pathSeparator),
+                    TestProcessServer::class.qualifiedName,
+                    TestProcessServer.DEBUG_TEST
+                )
 
             return ProcessBuilder(command).start()
         }
@@ -139,18 +144,14 @@
 
     @After
     fun deleteEventRequests() {
-        virtualMachine.eventRequestManager()
+        virtualMachine
+            .eventRequestManager()
             .deleteEventRequests(listOf(methodEntryRequest, methodExitRequest))
     }
 
-    @JvmField
-    @Rule
-    val outDirectory = TemporaryFolder()
+    @JvmField @Rule val outDirectory = TemporaryFolder()
 
-    private fun invokeRunnerMainInSeparateProcess(
-        classLoader: URLClassLoader,
-        port: Int
-    ) {
+    private fun invokeRunnerMainInSeparateProcess(classLoader: URLClassLoader, port: Int) {
         val classPath = classLoader.extractUrls().toMutableList()
         if (classLoader is GeneratedClassLoader) {
             val outDir = outDirectory.root
@@ -162,12 +163,10 @@
     }
 
     fun collectDebugEvents(@Language("kotlin") source: String): List<LocatableEvent> {
-        val classLoader = createClassLoader(
-            listOf(
-                SourceFile("Runner.kt", RUNNER_SOURCES),
-                SourceFile("Test.kt", source)
+        val classLoader =
+            createClassLoader(
+                listOf(SourceFile("Runner.kt", RUNNER_SOURCES), SourceFile("Test.kt", source))
             )
-        )
         val testClass = classLoader.loadClass(TEST_CLASS)
         assert(testClass.declaredMethods.any { it.name == CONTENT_METHOD }) {
             "Test method $CONTENT_METHOD not present on test class $TEST_CLASS"
@@ -181,28 +180,30 @@
 
         val loggedItems = mutableListOf<LocatableEvent>()
         var inContentMethod = false
-        vmLoop@
-        while (true) {
+        vmLoop@ while (true) {
             val eventSet = virtualMachine.eventQueue().remove(1000) ?: continue
             for (event in eventSet) {
                 when (event) {
-                    is VMDeathEvent, is VMDisconnectEvent -> {
+                    is VMDeathEvent,
+                    is VMDisconnectEvent -> {
                         break@vmLoop
                     }
-                    // We start VM with option 'suspend=n', in case VMStartEvent is still received, discard.
-                    is VMStartEvent -> {
-                    }
+                    // We start VM with option 'suspend=n', in case VMStartEvent is still received,
+                    // discard.
+                    is VMStartEvent -> {}
                     is MethodEntryEvent -> {
-                        if (!inContentMethod &&
-                            event.location().method().name() == CONTENT_METHOD
+                        if (
+                            !inContentMethod && event.location().method().name() == CONTENT_METHOD
                         ) {
                             if (manager.stepRequests().isEmpty()) {
-                                // Create line stepping request to get all normal line steps starting now.
-                                val stepReq = manager.createStepRequest(
-                                    event.thread(),
-                                    StepRequest.STEP_LINE,
-                                    StepRequest.STEP_INTO
-                                )
+                                // Create line stepping request to get all normal line steps
+                                // starting now.
+                                val stepReq =
+                                    manager.createStepRequest(
+                                        event.thread(),
+                                        StepRequest.STEP_LINE,
+                                        StepRequest.STEP_INTO
+                                    )
                                 stepReq.setSuspendPolicy(SUSPEND_ALL)
                                 stepReq.addClassExclusionFilter("java.*")
                                 stepReq.addClassExclusionFilter("sun.*")
@@ -211,8 +212,10 @@
                                 stepReq.addClassExclusionFilter("androidx.compose.runtime.*")
                                 stepReq.addClassExclusionFilter("jdk.internal.*")
 
-                                // Create class prepare request to be able to set breakpoints on class initializer lines.
-                                // There are no line stepping events for class initializers, so we depend on breakpoints.
+                                // Create class prepare request to be able to set breakpoints on
+                                // class initializer lines.
+                                // There are no line stepping events for class initializers, so we
+                                // depend on breakpoints.
                                 val prepareReq = manager.createClassPrepareRequest()
                                 prepareReq.setSuspendPolicy(SUSPEND_ALL)
                                 prepareReq.addClassExclusionFilter("java.*")
@@ -228,7 +231,8 @@
                         }
                     }
                     is StepEvent -> {
-                        // Handle the case where an Exception causing program to exit without MethodExitEvent.
+                        // Handle the case where an Exception causing program to exit without
+                        // MethodExitEvent.
                         if (inContentMethod && event.location().method().name() == "run") {
                             manager.stepRequests().map { it.disable() }
                             manager.classPrepareRequests().map { it.disable() }
@@ -279,13 +283,13 @@
 }
 
 private fun ClassLoader?.extractUrls(): List<URL> {
-    return (this as? URLClassLoader)?.let {
-        it.urLs.toList() + it.parent.extractUrls()
-    } ?: emptyList()
+    return (this as? URLClassLoader)?.let { it.urLs.toList() + it.parent.extractUrls() }
+        ?: emptyList()
 }
 
 @Language("kotlin")
-private val RUNNER_SOURCES = """
+private val RUNNER_SOURCES =
+    """
             import androidx.compose.runtime.*
             import kotlinx.coroutines.*
             fun main() {
@@ -313,4 +317,5 @@
                 }
                 override fun clear() {}
             }
-""".trimIndent()
+"""
+        .trimIndent()
diff --git a/compose/compiler/compiler-hosted/integration-tests/src/desktopTest/kotlin/androidx/compose/compiler/plugins/kotlin/debug/LocatableEventExtensions.kt b/compose/compiler/compiler-hosted/integration-tests/src/desktopTest/kotlin/androidx/compose/compiler/plugins/kotlin/debug/LocatableEventExtensions.kt
index b4ba080..1274d64 100644
--- a/compose/compiler/compiler-hosted/integration-tests/src/desktopTest/kotlin/androidx/compose/compiler/plugins/kotlin/debug/LocatableEventExtensions.kt
+++ b/compose/compiler/compiler-hosted/integration-tests/src/desktopTest/kotlin/androidx/compose/compiler/plugins/kotlin/debug/LocatableEventExtensions.kt
@@ -21,9 +21,10 @@
 import junit.framework.TestCase
 
 fun List<LocatableEvent>.assertTrace(expected: String) {
-    val actual = compressRunsWithoutLinenumber(this)
-        .filter { (!it.location().method().isSynthetic) }
-        .map { it.location().formatAsExpectation() }
+    val actual =
+        compressRunsWithoutLinenumber(this)
+            .filter { (!it.location().method().isSynthetic) }
+            .map { it.location().formatAsExpectation() }
 
     expected.lines().forEachIndexed { index, expectedLine ->
         TestCase.assertEquals(expectedLine, actual[index])
@@ -31,11 +32,11 @@
 }
 
 /*
-   Compresses runs of the same, linenumber-less location in the log:
-   specifically removes locations without linenumber, that would otherwise
-   print as byte offsets. This avoids overspecifying code generation
-   strategy in debug tests.
- */
+  Compresses runs of the same, linenumber-less location in the log:
+  specifically removes locations without linenumber, that would otherwise
+  print as byte offsets. This avoids overspecifying code generation
+  strategy in debug tests.
+*/
 fun compressRunsWithoutLinenumber(
     loggedItems: List<LocatableEvent>,
 ): List<LocatableEvent> {
diff --git a/compose/compiler/compiler-hosted/integration-tests/src/desktopTest/kotlin/androidx/compose/compiler/plugins/kotlin/debug/StepTest.kt b/compose/compiler/compiler-hosted/integration-tests/src/desktopTest/kotlin/androidx/compose/compiler/plugins/kotlin/debug/StepTest.kt
index 36f013a..a78f2d4 100644
--- a/compose/compiler/compiler-hosted/integration-tests/src/desktopTest/kotlin/androidx/compose/compiler/plugins/kotlin/debug/StepTest.kt
+++ b/compose/compiler/compiler-hosted/integration-tests/src/desktopTest/kotlin/androidx/compose/compiler/plugins/kotlin/debug/StepTest.kt
@@ -22,7 +22,7 @@
     @Test
     fun testSteppingIntoIf() {
         collectDebugEvents(
-            """
+                """
             import androidx.compose.runtime.*
             @Composable
             fun content() {
@@ -35,9 +35,11 @@
             fun computeIt(): Boolean = false
             @Composable
             fun anotherComposable() { }
-            """.trimIndent()
-        ).assertTrace(
             """
+                    .trimIndent()
+            )
+            .assertTrace(
+                """
             Test.kt:3 content
             Test.kt:4 content
             Test.kt:10 computeIt
@@ -45,7 +47,8 @@
             Test.kt:5 content
             Test.kt:8 content
             Test.kt:9 content
-            """.trimIndent()
-        )
+            """
+                    .trimIndent()
+            )
     }
 }
diff --git a/compose/compiler/compiler-hosted/integration-tests/src/desktopTest/kotlin/androidx/compose/compiler/plugins/kotlin/debug/clientserver/TestProcessServer.kt b/compose/compiler/compiler-hosted/integration-tests/src/desktopTest/kotlin/androidx/compose/compiler/plugins/kotlin/debug/clientserver/TestProcessServer.kt
index 31c4740..f884346 100644
--- a/compose/compiler/compiler-hosted/integration-tests/src/desktopTest/kotlin/androidx/compose/compiler/plugins/kotlin/debug/clientserver/TestProcessServer.kt
+++ b/compose/compiler/compiler-hosted/integration-tests/src/desktopTest/kotlin/androidx/compose/compiler/plugins/kotlin/debug/clientserver/TestProcessServer.kt
@@ -50,11 +50,9 @@
 
     private val executor = Executors.newFixedThreadPool(1)!!
 
-    @Volatile
-    private var isProcessingTask = true
+    @Volatile private var isProcessingTask = true
 
-    @Volatile
-    private var lastTime = System.currentTimeMillis()
+    @Volatile private var lastTime = System.currentTimeMillis()
 
     private val scheduler = Executors.newScheduledThreadPool(1)
 
@@ -96,15 +94,18 @@
     }
 
     private fun scheduleShutdownProcess() {
-        handler = scheduler.scheduleAtFixedRate(
-            {
-                if (!isProcessingTask && (System.currentTimeMillis() - lastTime) >= 60 * 1000) {
-                    println("Stopping server...")
-                    serverSocket.close()
-                }
-            },
-            60, 60, TimeUnit.SECONDS
-        )
+        handler =
+            scheduler.scheduleAtFixedRate(
+                {
+                    if (!isProcessingTask && (System.currentTimeMillis() - lastTime) >= 60 * 1000) {
+                        println("Stopping server...")
+                        serverSocket.close()
+                    }
+                },
+                60,
+                60,
+                TimeUnit.SECONDS
+            )
     }
 }
 
@@ -129,8 +130,7 @@
             assert(message == MessageHeader.CLASS_PATH) {
                 "Class path marker missed, but $message received"
             }
-            @Suppress("UNCHECKED_CAST")
-            val classPath = input.readObject() as Array<URL>
+            @Suppress("UNCHECKED_CAST") val classPath = input.readObject() as Array<URL>
 
             executeTest(URLClassLoader(classPath))
             output?.writeObject(MessageHeader.RESULT)
@@ -146,8 +146,7 @@
 
     fun executeTest(classLoader: ClassLoader) {
         val clazz = getGeneratedClass(classLoader, className)
-        @Suppress("BanUncheckedReflection")
-        clazz.getMethodOrNull(testMethod)!!.invoke(null)
+        @Suppress("BanUncheckedReflection") clazz.getMethodOrNull(testMethod)!!.invoke(null)
     }
 }
 
diff --git a/compose/compiler/compiler-hosted/integration-tests/src/desktopTest/kotlin/androidx/compose/compiler/plugins/kotlin/debug/clientserver/TestProxy.kt b/compose/compiler/compiler-hosted/integration-tests/src/desktopTest/kotlin/androidx/compose/compiler/plugins/kotlin/debug/clientserver/TestProxy.kt
index 60052fe..7ab7425 100644
--- a/compose/compiler/compiler-hosted/integration-tests/src/desktopTest/kotlin/androidx/compose/compiler/plugins/kotlin/debug/clientserver/TestProxy.kt
+++ b/compose/compiler/compiler-hosted/integration-tests/src/desktopTest/kotlin/androidx/compose/compiler/plugins/kotlin/debug/clientserver/TestProxy.kt
@@ -46,8 +46,6 @@
     private fun filterOutJdkJars(classPath: List<URL>): List<URL> {
         val javaHome = System.getProperty("java.home") ?: error("java.home is not")
         val javaFolder = File(javaHome)
-        return classPath.filterNot {
-            File(it.file).startsWith(javaFolder)
-        }
+        return classPath.filterNot { File(it.file).startsWith(javaFolder) }
     }
 }
diff --git a/compose/compiler/compiler-hosted/integration-tests/src/jvmTest/kotlin/androidx/compose/compiler/plugins/kotlin/AbstractCodegenSignatureTest.kt b/compose/compiler/compiler-hosted/integration-tests/src/jvmTest/kotlin/androidx/compose/compiler/plugins/kotlin/AbstractCodegenSignatureTest.kt
index 1bb7e42..9b39ea7 100644
--- a/compose/compiler/compiler-hosted/integration-tests/src/jvmTest/kotlin/androidx/compose/compiler/plugins/kotlin/AbstractCodegenSignatureTest.kt
+++ b/compose/compiler/compiler-hosted/integration-tests/src/jvmTest/kotlin/androidx/compose/compiler/plugins/kotlin/AbstractCodegenSignatureTest.kt
@@ -25,44 +25,35 @@
         return printPublicApi(asText(), relativePath)
     }
 
-    @JvmField
-    @Rule
-    val goldenTransformRule = GoldenTransformRule()
+    @JvmField @Rule val goldenTransformRule = GoldenTransformRule()
 
-    protected fun checkApi(
-        @Language("kotlin") src: String,
-        dumpClasses: Boolean = false
-    ) {
+    protected fun checkApi(@Language("kotlin") src: String, dumpClasses: Boolean = false) {
         val className = "Test_REPLACEME_${uniqueNumber++}"
         val fileName = "$className.kt"
 
-        val loader = classLoader(
-            """
+        val loader =
+            classLoader(
+                """
            import androidx.compose.runtime.*
 
            $src
         """,
-            fileName, dumpClasses
-        )
+                fileName,
+                dumpClasses
+            )
 
-        val apiString = loader
-            .allGeneratedFiles
-            .filter { it.relativePath.endsWith(".class") }
-            .joinToString(separator = "\n") { it.printApi() }
-            .replace(className, "Test")
+        val apiString =
+            loader.allGeneratedFiles
+                .filter { it.relativePath.endsWith(".class") }
+                .joinToString(separator = "\n") { it.printApi() }
+                .replace(className, "Test")
 
         goldenTransformRule.verifyGolden(
-            GoldenTransformTestInfo(
-                src.trimIndent().trim(),
-                apiString.trimIndent().trim()
-            )
+            GoldenTransformTestInfo(src.trimIndent().trim(), apiString.trimIndent().trim())
         )
     }
 
-    protected fun codegen(
-        @Language("kotlin") text: String,
-        dumpClasses: Boolean = false
-    ) {
+    protected fun codegen(@Language("kotlin") text: String, dumpClasses: Boolean = false) {
         codegenNoImports(
             """
            import androidx.compose.runtime.*
@@ -75,10 +66,7 @@
         )
     }
 
-    private fun codegenNoImports(
-        @Language("kotlin") text: String,
-        dumpClasses: Boolean = false
-    ) {
+    private fun codegenNoImports(@Language("kotlin") text: String, dumpClasses: Boolean = false) {
         val className = "Test_${uniqueNumber++}"
         val fileName = "$className.kt"
 
diff --git a/compose/compiler/compiler-hosted/integration-tests/src/jvmTest/kotlin/androidx/compose/compiler/plugins/kotlin/AbstractCodegenTest.kt b/compose/compiler/compiler-hosted/integration-tests/src/jvmTest/kotlin/androidx/compose/compiler/plugins/kotlin/AbstractCodegenTest.kt
index 681e348..1543782 100644
--- a/compose/compiler/compiler-hosted/integration-tests/src/jvmTest/kotlin/androidx/compose/compiler/plugins/kotlin/AbstractCodegenTest.kt
+++ b/compose/compiler/compiler-hosted/integration-tests/src/jvmTest/kotlin/androidx/compose/compiler/plugins/kotlin/AbstractCodegenTest.kt
@@ -20,31 +20,28 @@
 import java.io.File
 import org.intellij.lang.annotations.Language
 import org.jetbrains.kotlin.codegen.GeneratedClassLoader
+
 var uniqueNumber = 0
 
 abstract class AbstractCodegenTest(useFir: Boolean) : AbstractCompilerTest(useFir) {
     private fun dumpClasses(loader: GeneratedClassLoader) {
-        for (
-            file in loader.allGeneratedFiles.filter {
-                it.relativePath.endsWith(".class")
-            }
-        ) {
+        for (file in loader.allGeneratedFiles.filter { it.relativePath.endsWith(".class") }) {
             println("------\nFILE: ${file.relativePath}\n------")
             println(file.asText())
         }
     }
 
     protected fun validateBytecode(
-        @Language("kotlin")
-        src: String,
+        @Language("kotlin") src: String,
         dumpClasses: Boolean = false,
         validate: (String) -> Unit
     ) {
         val className = "Test_REPLACEME_${uniqueNumber++}"
         val fileName = "$className.kt"
 
-        val loader = classLoader(
-            """
+        val loader =
+            classLoader(
+                """
            @file:OptIn(
              InternalComposeApi::class,
            )
@@ -56,21 +53,20 @@
 
             fun used(x: Any?) {}
         """,
-            fileName, dumpClasses
-        )
+                fileName,
+                dumpClasses
+            )
 
-        val apiString = loader
-            .allGeneratedFiles
-            .filter { it.relativePath.endsWith(".class") }.joinToString("\n") {
-                it.asText().replace('$', '%').replace(className, "Test")
-            }
+        val apiString =
+            loader.allGeneratedFiles
+                .filter { it.relativePath.endsWith(".class") }
+                .joinToString("\n") { it.asText().replace('$', '%').replace(className, "Test") }
 
         validate(apiString)
     }
 
     protected fun classLoader(
-        @Language("kotlin")
-        source: String,
+        @Language("kotlin") source: String,
         fileName: String,
         dumpClasses: Boolean = false
     ): GeneratedClassLoader {
@@ -83,9 +79,8 @@
         sources: Map<String, String>,
         dumpClasses: Boolean = false
     ): GeneratedClassLoader {
-        val loader = createClassLoader(
-            sources.map { (fileName, source) -> SourceFile(fileName, source) }
-        )
+        val loader =
+            createClassLoader(sources.map { (fileName, source) -> SourceFile(fileName, source) })
         if (dumpClasses) dumpClasses(loader)
         return loader
     }
@@ -95,10 +90,11 @@
         commonSources: Map<String, String>,
         dumpClasses: Boolean = false
     ): GeneratedClassLoader {
-        val loader = createClassLoader(
-            platformSources.map { (fileName, source) -> SourceFile(fileName, source) },
-            commonSources.map { (fileName, source) -> SourceFile(fileName, source) }
-        )
+        val loader =
+            createClassLoader(
+                platformSources.map { (fileName, source) -> SourceFile(fileName, source) },
+                commonSources.map { (fileName, source) -> SourceFile(fileName, source) }
+            )
         if (dumpClasses) dumpClasses(loader)
         return loader
     }
@@ -109,11 +105,12 @@
         dumpClasses: Boolean = false,
         forcedFirSetting: Boolean? = null
     ): GeneratedClassLoader {
-        val loader = createClassLoader(
-            sources.map { (fileName, source) -> SourceFile(fileName, source) },
-            additionalPaths = additionalPaths,
-            forcedFirSetting = forcedFirSetting
-        )
+        val loader =
+            createClassLoader(
+                sources.map { (fileName, source) -> SourceFile(fileName, source) },
+                additionalPaths = additionalPaths,
+                forcedFirSetting = forcedFirSetting
+            )
         if (dumpClasses) dumpClasses(loader)
         return loader
     }
diff --git a/compose/compiler/compiler-hosted/integration-tests/src/jvmTest/kotlin/androidx/compose/compiler/plugins/kotlin/AbstractCompilerTest.kt b/compose/compiler/compiler-hosted/integration-tests/src/jvmTest/kotlin/androidx/compose/compiler/plugins/kotlin/AbstractCompilerTest.kt
index d9f347f..1aed51e 100644
--- a/compose/compiler/compiler-hosted/integration-tests/src/jvmTest/kotlin/androidx/compose/compiler/plugins/kotlin/AbstractCompilerTest.kt
+++ b/compose/compiler/compiler-hosted/integration-tests/src/jvmTest/kotlin/androidx/compose/compiler/plugins/kotlin/AbstractCompilerTest.kt
@@ -89,15 +89,14 @@
         }
 
         val defaultClassPath by lazy {
-            System.getProperty("java.class.path")!!.split(
-                System.getProperty("path.separator")!!
-            ).map { File(it) }
+            System.getProperty("java.class.path")!!.split(System.getProperty("path.separator")!!)
+                .map { File(it) }
         }
 
         val defaultClassPathRoots by lazy {
-            defaultClassPath.filter {
-                !it.path.contains("robolectric") && it.extension != "xml"
-            }.toList()
+            defaultClassPath
+                .filter { !it.path.contains("robolectric") && it.extension != "xml" }
+                .toList()
         }
     }
 
@@ -114,51 +113,57 @@
         additionalPaths: List<File> = listOf(),
         forcedFirSetting: Boolean? = null,
         registerExtensions: (Project.(CompilerConfiguration) -> Unit)? = null
-    ) = KotlinCompilerFacade.create(
-        testRootDisposable,
-        updateConfiguration = {
-            val enableFir = if (forcedFirSetting != null) forcedFirSetting else useFir
-            val languageVersion =
-                if (enableFir) {
-                    LanguageVersion.KOTLIN_2_0
-                } else {
-                    LanguageVersion.KOTLIN_1_9
+    ) =
+        KotlinCompilerFacade.create(
+            testRootDisposable,
+            updateConfiguration = {
+                val enableFir = if (forcedFirSetting != null) forcedFirSetting else useFir
+                val languageVersion =
+                    if (enableFir) {
+                        LanguageVersion.KOTLIN_2_0
+                    } else {
+                        LanguageVersion.KOTLIN_1_9
+                    }
+                // For tests, allow unstable artifacts compiled with a pre-release compiler
+                // as input to stable compilations.
+                val analysisFlags: Map<AnalysisFlag<*>, Any?> =
+                    mapOf(
+                        AnalysisFlags.allowUnstableDependencies to true,
+                        AnalysisFlags.skipPrereleaseCheck to true
+                    )
+                languageVersionSettings =
+                    LanguageVersionSettingsImpl(
+                        languageVersion,
+                        ApiVersion.createByLanguageVersion(languageVersion),
+                        analysisFlags
+                    )
+                updateConfiguration()
+                addJvmClasspathRoots(additionalPaths)
+                addJvmClasspathRoots(defaultClassPathRoots)
+                if (
+                    !getBoolean(JVMConfigurationKeys.NO_JDK) &&
+                        get(JVMConfigurationKeys.JDK_HOME) == null
+                ) {
+                    // We need to set `JDK_HOME` explicitly to use JDK 17
+                    put(JVMConfigurationKeys.JDK_HOME, File(System.getProperty("java.home")!!))
                 }
-            // For tests, allow unstable artifacts compiled with a pre-release compiler
-            // as input to stable compilations.
-            val analysisFlags: Map<AnalysisFlag<*>, Any?> = mapOf(
-                AnalysisFlags.allowUnstableDependencies to true,
-                AnalysisFlags.skipPrereleaseCheck to true
-            )
-            languageVersionSettings = LanguageVersionSettingsImpl(
-                languageVersion,
-                ApiVersion.createByLanguageVersion(languageVersion),
-                analysisFlags
-            )
-            updateConfiguration()
-            addJvmClasspathRoots(additionalPaths)
-            addJvmClasspathRoots(defaultClassPathRoots)
-            if (!getBoolean(JVMConfigurationKeys.NO_JDK) &&
-                get(JVMConfigurationKeys.JDK_HOME) == null) {
-                // We need to set `JDK_HOME` explicitly to use JDK 17
-                put(JVMConfigurationKeys.JDK_HOME, File(System.getProperty("java.home")!!))
-            }
-            configureJdkClasspathRoots()
-        },
-        registerExtensions = registerExtensions ?: { configuration ->
-            ComposePluginRegistrar.registerCommonExtensions(this)
-            IrGenerationExtension.registerExtension(
-                this,
-                ComposePluginRegistrar.createComposeIrExtension(configuration)
-            )
-        }
-    )
+                configureJdkClasspathRoots()
+            },
+            registerExtensions =
+                registerExtensions
+                    ?: { configuration ->
+                        ComposePluginRegistrar.registerCommonExtensions(this)
+                        IrGenerationExtension.registerExtension(
+                            this,
+                            ComposePluginRegistrar.createComposeIrExtension(configuration)
+                        )
+                    }
+        )
 
     protected fun analyze(
         platformSources: List<SourceFile>,
         commonSources: List<SourceFile> = listOf()
-    ): AnalysisResult =
-        createCompilerFacade().analyze(platformSources, commonSources)
+    ): AnalysisResult = createCompilerFacade().analyze(platformSources, commonSources)
 
     protected fun compileToIr(
         sourceFiles: List<SourceFile>,
@@ -174,15 +179,15 @@
         additionalPaths: List<File> = listOf(),
         forcedFirSetting: Boolean? = null
     ): GeneratedClassLoader {
-        val classLoader = URLClassLoader(
-            (additionalPaths + defaultClassPath).map {
-                it.toURI().toURL()
-            }.toTypedArray(),
-            this.javaClass.classLoader
-        )
+        val classLoader =
+            URLClassLoader(
+                (additionalPaths + defaultClassPath).map { it.toURI().toURL() }.toTypedArray(),
+                this.javaClass.classLoader
+            )
         return GeneratedClassLoader(
             createCompilerFacade(additionalPaths, forcedFirSetting)
-                .compile(platformSourceFiles, commonSourceFiles).factory,
+                .compile(platformSourceFiles, commonSourceFiles)
+                .factory,
             classLoader
         )
     }
@@ -212,8 +217,7 @@
                 )
             }
             if (it.startsWith("  ")) {
-                if (it.startsWith("   ")) false
-                else it[2] != '/' && it[2] != '@'
+                if (it.startsWith("   ")) false else it[2] != '/' && it[2] != '@'
             } else {
                 it == "}" || it.endsWith("{")
             }
diff --git a/compose/compiler/compiler-hosted/integration-tests/src/jvmTest/kotlin/androidx/compose/compiler/plugins/kotlin/AbstractComposeDiagnosticsTest.kt b/compose/compiler/compiler-hosted/integration-tests/src/jvmTest/kotlin/androidx/compose/compiler/plugins/kotlin/AbstractComposeDiagnosticsTest.kt
index 84ac5fd..8ddaf32 100644
--- a/compose/compiler/compiler-hosted/integration-tests/src/jvmTest/kotlin/androidx/compose/compiler/plugins/kotlin/AbstractComposeDiagnosticsTest.kt
+++ b/compose/compiler/compiler-hosted/integration-tests/src/jvmTest/kotlin/androidx/compose/compiler/plugins/kotlin/AbstractComposeDiagnosticsTest.kt
@@ -30,14 +30,17 @@
         ignoreParseErrors: Boolean = false
     ) {
         val clearText = CheckerTestUtil.parseDiagnosedRanges(expectedText, mutableListOf())
-        val clearCommonText = commonText?.let {
-            CheckerTestUtil.parseDiagnosedRanges(commonText, mutableListOf())
-        }
+        val clearCommonText =
+            commonText?.let { CheckerTestUtil.parseDiagnosedRanges(commonText, mutableListOf()) }
 
-        val errors = analyze(
-            listOf(SourceFile("test.kt", clearText, ignoreParseErrors)),
-            listOfNotNull(clearCommonText?.let { SourceFile("common.kt", it, ignoreParseErrors) }),
-        ).diagnostics
+        val errors =
+            analyze(
+                    listOf(SourceFile("test.kt", clearText, ignoreParseErrors)),
+                    listOfNotNull(
+                        clearCommonText?.let { SourceFile("common.kt", it, ignoreParseErrors) }
+                    ),
+                )
+                .diagnostics
 
         checkDiagnostics(expectedText, clearText, errors["test.kt"])
         if (clearCommonText != null) {
@@ -50,44 +53,44 @@
         clearText: String,
         allDiagnostics: List<AnalysisResult.Diagnostic>?
     ) {
-        val annotatedText = if (allDiagnostics != null) {
-            val rangeToDiagnostics = allDiagnostics
-                .flatGroupBy { it.textRanges }
-                .mapValues { entry ->
-                    entry.value.map { it.factoryName }.toSet()
-                }
-            val startOffsetToGroups = rangeToDiagnostics.entries.groupBy(
-                keySelector = { it.key.startOffset },
-                valueTransform = { it.value }
-            )
-            val endOffsetsToGroups = rangeToDiagnostics.entries.groupBy(
-                keySelector = { it.key.endOffset },
-                valueTransform = { it.value }
-            )
+        val annotatedText =
+            if (allDiagnostics != null) {
+                val rangeToDiagnostics =
+                    allDiagnostics
+                        .flatGroupBy { it.textRanges }
+                        .mapValues { entry -> entry.value.map { it.factoryName }.toSet() }
+                val startOffsetToGroups =
+                    rangeToDiagnostics.entries.groupBy(
+                        keySelector = { it.key.startOffset },
+                        valueTransform = { it.value }
+                    )
+                val endOffsetsToGroups =
+                    rangeToDiagnostics.entries.groupBy(
+                        keySelector = { it.key.endOffset },
+                        valueTransform = { it.value }
+                    )
 
-            buildString {
-                for ((i, c) in clearText.withIndex()) {
-                    endOffsetsToGroups[i]?.let { groups ->
-                        repeat(groups.size) { append("<!>") }
-                    }
-                    startOffsetToGroups[i]?.let { groups ->
-                        for (diagnostics in groups) {
-                            append("<!${diagnostics.joinToString(",")}!>")
+                buildString {
+                    for ((i, c) in clearText.withIndex()) {
+                        endOffsetsToGroups[i]?.let { groups ->
+                            repeat(groups.size) { append("<!>") }
                         }
+                        startOffsetToGroups[i]?.let { groups ->
+                            for (diagnostics in groups) {
+                                append("<!${diagnostics.joinToString(",")}!>")
+                            }
+                        }
+                        append(c)
                     }
-                    append(c)
                 }
+            } else {
+                clearText
             }
-        } else {
-            clearText
-        }
 
         assertEquals(expectedText, annotatedText)
     }
 
     protected fun checkFail(expectedText: String) {
-        assertThrows(AssertionError::class.java) {
-            check(expectedText)
-        }
+        assertThrows(AssertionError::class.java) { check(expectedText) }
     }
 }
diff --git a/compose/compiler/compiler-hosted/integration-tests/src/jvmTest/kotlin/androidx/compose/compiler/plugins/kotlin/AbstractControlFlowTransformTests.kt b/compose/compiler/compiler-hosted/integration-tests/src/jvmTest/kotlin/androidx/compose/compiler/plugins/kotlin/AbstractControlFlowTransformTests.kt
index cb09bc4..c7fd502 100644
--- a/compose/compiler/compiler-hosted/integration-tests/src/jvmTest/kotlin/androidx/compose/compiler/plugins/kotlin/AbstractControlFlowTransformTests.kt
+++ b/compose/compiler/compiler-hosted/integration-tests/src/jvmTest/kotlin/androidx/compose/compiler/plugins/kotlin/AbstractControlFlowTransformTests.kt
@@ -18,23 +18,23 @@
 
 import org.intellij.lang.annotations.Language
 
-abstract class AbstractControlFlowTransformTests(
-    useFir: Boolean
-) : AbstractIrTransformTest(useFir) {
+abstract class AbstractControlFlowTransformTests(useFir: Boolean) :
+    AbstractIrTransformTest(useFir) {
     protected fun controlFlow(
-        @Language("kotlin")
-        source: String,
+        @Language("kotlin") source: String,
         dumpTree: Boolean = false,
-    ) = verifyGoldenComposeIrTransform(
-        """
+    ) =
+        verifyGoldenComposeIrTransform(
+            """
             import androidx.compose.runtime.Composable
             import androidx.compose.runtime.ReadOnlyComposable
             import androidx.compose.runtime.key
             import androidx.compose.runtime.NonRestartableComposable
 
             $source
-        """.trimIndent(),
         """
+                .trimIndent(),
+            """
             import androidx.compose.runtime.Composable
 
             inline class InlineClass(val value: Int)
@@ -57,7 +57,8 @@
             var a = 1
             var b = 2
             var c = 3
-        """.trimIndent(),
-        dumpTree = dumpTree,
-    )
+        """
+                .trimIndent(),
+            dumpTree = dumpTree,
+        )
 }
diff --git a/compose/compiler/compiler-hosted/integration-tests/src/jvmTest/kotlin/androidx/compose/compiler/plugins/kotlin/AbstractIrTransformTest.kt b/compose/compiler/compiler-hosted/integration-tests/src/jvmTest/kotlin/androidx/compose/compiler/plugins/kotlin/AbstractIrTransformTest.kt
index 16a3ab7..5286341 100644
--- a/compose/compiler/compiler-hosted/integration-tests/src/jvmTest/kotlin/androidx/compose/compiler/plugins/kotlin/AbstractIrTransformTest.kt
+++ b/compose/compiler/compiler-hosted/integration-tests/src/jvmTest/kotlin/androidx/compose/compiler/plugins/kotlin/AbstractIrTransformTest.kt
@@ -28,28 +28,26 @@
 import org.junit.rules.TemporaryFolder
 
 internal const val TEST_RESOURCES_ROOT = "src/test/resources"
+
 abstract class AbstractIrTransformTest(useFir: Boolean) : AbstractCodegenTest(useFir) {
     override fun CompilerConfiguration.updateConfiguration() {
         put(ComposeConfiguration.SOURCE_INFORMATION_ENABLED_KEY, true)
-        put(ComposeConfiguration.FEATURE_FLAGS, listOf(
-            FeatureFlag.StrongSkipping.featureName,
-            FeatureFlag.OptimizeNonSkippingGroups.featureName,
-        ))
+        put(
+            ComposeConfiguration.FEATURE_FLAGS,
+            listOf(
+                FeatureFlag.StrongSkipping.featureName,
+                FeatureFlag.OptimizeNonSkippingGroups.featureName,
+            )
+        )
     }
 
-    @JvmField
-    @Rule
-    val classesDirectory = TemporaryFolder()
+    @JvmField @Rule val classesDirectory = TemporaryFolder()
 
-    @JvmField
-    @Rule
-    val goldenTransformRule = GoldenTransformRule()
+    @JvmField @Rule val goldenTransformRule = GoldenTransformRule()
 
     fun verifyCrossModuleComposeIrTransform(
-        @Language("kotlin")
-        dependencySource: String,
-        @Language("kotlin")
-        source: String,
+        @Language("kotlin") dependencySource: String,
+        @Language("kotlin") source: String,
         expectedTransformed: String,
         dumpTree: Boolean = false,
         dumpClasses: Boolean = false,
@@ -57,13 +55,11 @@
     ) {
         val dependencyFileName = "Test_REPLACEME_${uniqueNumber++}"
 
-        classLoader(dependencySource, dependencyFileName, dumpClasses)
-            .allGeneratedFiles
-            .also {
-                // Write the files to the class directory so they can be used by the next module
-                // and the application
-                it.writeToDir(classesDirectory.root)
-            }
+        classLoader(dependencySource, dependencyFileName, dumpClasses).allGeneratedFiles.also {
+            // Write the files to the class directory so they can be used by the next module
+            // and the application
+            it.writeToDir(classesDirectory.root)
+        }
 
         verifyComposeIrTransform(
             source,
@@ -76,23 +72,19 @@
     }
 
     fun verifyGoldenCrossModuleComposeIrTransform(
-        @Language("kotlin")
-        dependencySource: String,
-        @Language("kotlin")
-        source: String,
+        @Language("kotlin") dependencySource: String,
+        @Language("kotlin") source: String,
         dumpTree: Boolean = false,
         dumpClasses: Boolean = false,
         validator: (element: IrElement) -> Unit = {},
     ) {
         val dependencyFileName = "Test_REPLACEME_${uniqueNumber++}"
 
-        classLoader(dependencySource, dependencyFileName, dumpClasses)
-            .allGeneratedFiles
-            .also {
-                // Write the files to the class directory so they can be used by the next module
-                // and the application
-                it.writeToDir(classesDirectory.root)
-            }
+        classLoader(dependencySource, dependencyFileName, dumpClasses).allGeneratedFiles.also {
+            // Write the files to the class directory so they can be used by the next module
+            // and the application
+            it.writeToDir(classesDirectory.root)
+        }
 
         verifyGoldenComposeIrTransform(
             source,
@@ -104,10 +96,8 @@
     }
 
     fun transform(
-        @Language("kotlin")
-        source: String,
-        @Language("kotlin")
-        extra: String = "",
+        @Language("kotlin") source: String,
+        @Language("kotlin") extra: String = "",
         validator: (element: IrElement) -> Unit = {},
         dumpTree: Boolean = false,
         truncateTracingInfoMode: TruncateTracingInfoMode = TruncateTracingInfoMode.TRUNCATE_KEY,
@@ -117,106 +107,79 @@
         val irModule = compileToIr(files, additionalPaths)
         val keySet = mutableListOf<Int>()
         fun IrElement.validate(): IrElement = this.also { validator(it) }
-        val actualTransformed = irModule
-            .files[0]
-            .validate()
-            .dumpSrc(useFir)
-            .replace('$', '%')
-            // replace source keys for start group calls
-            .replace(
-                Regex(
-                    "(%composer\\.start(Restart|Movable|Replaceable|Replace)" +
-                        "Group\\()-?((0b)?[-\\d]+)"
-                )
-            ) {
-                val stringKey = it.groupValues[3]
-                val key = if (stringKey.startsWith("0b"))
-                    Integer.parseInt(stringKey.drop(2), 2)
-                else
-                    stringKey.toInt()
-                if (key in keySet) {
-                    "${it.groupValues[1]}<!DUPLICATE KEY: $key!>"
-                } else {
-                    keySet.add(key)
+        val actualTransformed =
+            irModule.files[0]
+                .validate()
+                .dumpSrc(useFir)
+                .replace('$', '%')
+                // replace source keys for start group calls
+                .replace(
+                    Regex(
+                        "(%composer\\.start(Restart|Movable|Replaceable|Replace)" +
+                            "Group\\()-?((0b)?[-\\d]+)"
+                    )
+                ) {
+                    val stringKey = it.groupValues[3]
+                    val key =
+                        if (stringKey.startsWith("0b")) Integer.parseInt(stringKey.drop(2), 2)
+                        else stringKey.toInt()
+                    if (key in keySet) {
+                        "${it.groupValues[1]}<!DUPLICATE KEY: $key!>"
+                    } else {
+                        keySet.add(key)
+                        "${it.groupValues[1]}<>"
+                    }
+                }
+                .replace(Regex("(sourceInformationMarkerStart\\(%composer, )([-\\d]+)")) {
                     "${it.groupValues[1]}<>"
                 }
-            }
-            .replace(
-                Regex("(sourceInformationMarkerStart\\(%composer, )([-\\d]+)")
-            ) {
-                "${it.groupValues[1]}<>"
-            }
-            // replace traceEventStart values with a token
-            // TODO(174715171): capture actual values for testing
-            .replace(
-                Regex(
-                    "traceEventStart\\(-?\\d+, (%dirty|%changed|-1), (%dirty1|%changed1|-1), (.*)"
-                )
-            ) {
-                when (truncateTracingInfoMode) {
-                    TruncateTracingInfoMode.TRUNCATE_KEY ->
-                        "traceEventStart(<>, ${it.groupValues[1]}, ${it.groupValues[2]}, <>)"
-
-                    TruncateTracingInfoMode.KEEP_INFO_STRING ->
-                        "traceEventStart(<>, ${it.groupValues[1]}, ${it.groupValues[2]}, " +
-                            it.groupValues[3]
+                // replace traceEventStart values with a token
+                // TODO(174715171): capture actual values for testing
+                .replace(
+                    Regex(
+                        "traceEventStart\\(-?\\d+, (%dirty|%changed|-1), (%dirty1|%changed1|-1), (.*)"
+                    )
+                ) {
+                    when (truncateTracingInfoMode) {
+                        TruncateTracingInfoMode.TRUNCATE_KEY ->
+                            "traceEventStart(<>, ${it.groupValues[1]}, ${it.groupValues[2]}, <>)"
+                        TruncateTracingInfoMode.KEEP_INFO_STRING ->
+                            "traceEventStart(<>, ${it.groupValues[1]}, ${it.groupValues[2]}, " +
+                                it.groupValues[3]
+                    }
                 }
-            }
-            // replace source information with source it references
-            .replace(
-                Regex(
-                    "(%composer\\.start(Restart|Movable|Replaceable|Replace)Group\\" +
-                        "([^\"\\n]*)\"(.*)\"\\)"
-                )
-            ) {
-                "${it.groupValues[1]}\"${generateSourceInfo(it.groupValues[4], source)}\")"
-            }
-            .replace(
-                Regex("(sourceInformation(MarkerStart)?\\(.*)\"(.*)\"\\)")
-            ) {
-                "${it.groupValues[1]}\"${generateSourceInfo(it.groupValues[3], source)}\")"
-            }
-            .replace(
-                Regex(
-                    "(composableLambda[N]?\\" +
-                        "([^\"\\n]*)\"(.*)\"\\)"
-                )
-            ) {
-                "${it.groupValues[1]}\"${generateSourceInfo(it.groupValues[2], source)}\")"
-            }
-            .replace(
-                Regex("(rememberComposableLambda[N]?)\\((-?\\d+)")
-            ) {
-                "${it.groupValues[1]}(<>"
-            }
-            // replace source keys for joinKey calls
-            .replace(
-                Regex(
-                    "(%composer\\.joinKey\\()([-\\d]+)"
-                )
-            ) {
-                "${it.groupValues[1]}<>"
-            }
-            // composableLambdaInstance(<>, true)
-            .replace(
-                Regex(
-                    "(composableLambdaInstance\\()([-\\d]+, (true|false))"
-                )
-            ) {
-                val callStart = it.groupValues[1]
-                val tracked = it.groupValues[3]
-                "$callStart<>, $tracked"
-            }
-            // composableLambda(%composer, <>, true)
-            .replace(
-                Regex(
-                    "(composableLambda\\(%composer,\\s)([-\\d]+)"
-                )
-            ) {
-                "${it.groupValues[1]}<>"
-            }
-            .trimIndent()
-            .trimTrailingWhitespacesAndAddNewlineAtEOF()
+                // replace source information with source it references
+                .replace(
+                    Regex(
+                        "(%composer\\.start(Restart|Movable|Replaceable|Replace)Group\\" +
+                            "([^\"\\n]*)\"(.*)\"\\)"
+                    )
+                ) {
+                    "${it.groupValues[1]}\"${generateSourceInfo(it.groupValues[4], source)}\")"
+                }
+                .replace(Regex("(sourceInformation(MarkerStart)?\\(.*)\"(.*)\"\\)")) {
+                    "${it.groupValues[1]}\"${generateSourceInfo(it.groupValues[3], source)}\")"
+                }
+                .replace(Regex("(composableLambda[N]?\\" + "([^\"\\n]*)\"(.*)\"\\)")) {
+                    "${it.groupValues[1]}\"${generateSourceInfo(it.groupValues[2], source)}\")"
+                }
+                .replace(Regex("(rememberComposableLambda[N]?)\\((-?\\d+)")) {
+                    "${it.groupValues[1]}(<>"
+                }
+                // replace source keys for joinKey calls
+                .replace(Regex("(%composer\\.joinKey\\()([-\\d]+)")) { "${it.groupValues[1]}<>" }
+                // composableLambdaInstance(<>, true)
+                .replace(Regex("(composableLambdaInstance\\()([-\\d]+, (true|false))")) {
+                    val callStart = it.groupValues[1]
+                    val tracked = it.groupValues[3]
+                    "$callStart<>, $tracked"
+                }
+                // composableLambda(%composer, <>, true)
+                .replace(Regex("(composableLambda\\(%composer,\\s)([-\\d]+)")) {
+                    "${it.groupValues[1]}<>"
+                }
+                .trimIndent()
+                .trimTrailingWhitespacesAndAddNewlineAtEOF()
 
         if (dumpTree) {
             println(irModule.dump())
@@ -226,11 +189,9 @@
     }
 
     fun verifyComposeIrTransform(
-        @Language("kotlin")
-        source: String,
+        @Language("kotlin") source: String,
         expectedTransformed: String,
-        @Language("kotlin")
-        extra: String = "",
+        @Language("kotlin") extra: String = "",
         validator: (element: IrElement) -> Unit = {},
         dumpTree: Boolean = false,
         truncateTracingInfoMode: TruncateTracingInfoMode = TruncateTracingInfoMode.TRUNCATE_KEY,
@@ -239,18 +200,14 @@
         val actualTransformed =
             transform(source, extra, validator, dumpTree, truncateTracingInfoMode, additionalPaths)
         assertEquals(
-            expectedTransformed
-                .trimIndent()
-                .trimTrailingWhitespacesAndAddNewlineAtEOF(),
+            expectedTransformed.trimIndent().trimTrailingWhitespacesAndAddNewlineAtEOF(),
             actualTransformed
         )
     }
 
     fun verifyGoldenComposeIrTransform(
-        @Language("kotlin")
-        source: String,
-        @Language("kotlin")
-        extra: String = "",
+        @Language("kotlin") source: String,
+        @Language("kotlin") extra: String = "",
         validator: (element: IrElement) -> Unit = {},
         dumpTree: Boolean = false,
         truncateTracingInfoMode: TruncateTracingInfoMode = TruncateTracingInfoMode.TRUNCATE_KEY,
@@ -267,9 +224,14 @@
     }
 
     private fun MatchResult.isNumber() = groupValues[1].isNotEmpty()
+
     private fun MatchResult.number() = groupValues[1].toInt()
-    private val MatchResult.text get() = groupValues[0]
+
+    private val MatchResult.text
+        get() = groupValues[0]
+
     private fun MatchResult.isChar(c: String) = text == c
+
     private fun MatchResult.isFileName() = groups[4] != null
 
     private fun generateSourceInfo(sourceInfo: String, source: String): String {
@@ -304,21 +266,18 @@
                 mr = next()
                 var ellipsis = ""
                 val maxFragment = 6
-                val rawLength = if (mr != null && mr.isChar("L")) {
-                    mr = next()
-                    if (mr == null || !mr.isNumber()) {
-                        return null
+                val rawLength =
+                    if (mr != null && mr.isChar("L")) {
+                        mr = next()
+                        if (mr == null || !mr.isNumber()) {
+                            return null
+                        }
+                        mr.number().also { next() }
+                    } else {
+                        maxFragment
                     }
-                    mr.number().also { next() }
-                } else {
-                    maxFragment
-                }
-                val eol = source.indexOf('\n', offset).let {
-                    if (it < 0) source.length else it
-                }
-                val space = source.indexOf(' ', offset).let {
-                    if (it < 0) source.length else it
-                }
+                val eol = source.indexOf('\n', offset).let { if (it < 0) source.length else it }
+                val space = source.indexOf(' ', offset).let { if (it < 0) source.length else it }
                 val maxEnd = offset + maxFragment
                 if (eol > maxEnd && space > maxEnd) ellipsis = "..."
                 val length = minOf(maxEnd, minOf(offset + rawLength, space, eol)) - offset
@@ -334,15 +293,13 @@
             }
             when {
                 mr.isNumber() || mr.isChar("@") -> {
-                    val fragment = parseLocation()
-                        ?: return "invalid source info at $current: '$sourceInfo'"
+                    val fragment =
+                        parseLocation() ?: return "invalid source info at $current: '$sourceInfo'"
                     result += fragment
                 }
-
                 mr.isFileName() -> {
                     return result + ":" + sourceInfo.substring(mr.range.last + 1)
                 }
-
                 else -> {
                     result += mr.text
                     next()
@@ -350,8 +307,7 @@
             }
             require(mr != currentResult) { "regex didn't advance" }
         }
-        if (current != sourceInfo.length)
-            return "invalid source info at $current: '$sourceInfo'"
+        if (current != sourceInfo.length) return "invalid source info at $current: '$sourceInfo'"
         return result
     }
 
diff --git a/compose/compiler/compiler-hosted/integration-tests/src/jvmTest/kotlin/androidx/compose/compiler/plugins/kotlin/AbstractLiveLiteralTransformTests.kt b/compose/compiler/compiler-hosted/integration-tests/src/jvmTest/kotlin/androidx/compose/compiler/plugins/kotlin/AbstractLiveLiteralTransformTests.kt
index 3540874..b6b1229 100644
--- a/compose/compiler/compiler-hosted/integration-tests/src/jvmTest/kotlin/androidx/compose/compiler/plugins/kotlin/AbstractLiveLiteralTransformTests.kt
+++ b/compose/compiler/compiler-hosted/integration-tests/src/jvmTest/kotlin/androidx/compose/compiler/plugins/kotlin/AbstractLiveLiteralTransformTests.kt
@@ -27,20 +27,17 @@
 import org.jetbrains.kotlin.ir.util.DeepCopySymbolRemapper
 import org.junit.Assert.assertEquals
 
-abstract class AbstractLiveLiteralTransformTests(
-    useFir: Boolean
-) : AbstractIrTransformTest(useFir) {
+abstract class AbstractLiveLiteralTransformTests(useFir: Boolean) :
+    AbstractIrTransformTest(useFir) {
     private fun computeKeys(files: List<SourceFile>): List<String> {
         var builtKeys = mutableSetOf<String>()
         compileToIr(
             files,
             registerExtensions = { configuration ->
-                val liveLiteralsEnabled = configuration.getBoolean(
-                    ComposeConfiguration.LIVE_LITERALS_ENABLED_KEY
-                )
-                val liveLiteralsV2Enabled = configuration.getBoolean(
-                    ComposeConfiguration.LIVE_LITERALS_V2_ENABLED_KEY
-                )
+                val liveLiteralsEnabled =
+                    configuration.getBoolean(ComposeConfiguration.LIVE_LITERALS_ENABLED_KEY)
+                val liveLiteralsV2Enabled =
+                    configuration.getBoolean(ComposeConfiguration.LIVE_LITERALS_V2_ENABLED_KEY)
 
                 ComposePluginRegistrar.registerCommonExtensions(this)
                 IrGenerationExtension.registerExtension(
@@ -52,24 +49,26 @@
                         ) {
                             val symbolRemapper = DeepCopySymbolRemapper()
                             val keyVisitor = DurableKeyVisitor(builtKeys)
-                            val stabilityInferencer = StabilityInferencer(
-                                pluginContext.moduleDescriptor,
-                                emptySet()
-                            )
-                            val transformer = object : LiveLiteralTransformer(
-                                liveLiteralsEnabled || liveLiteralsV2Enabled,
-                                liveLiteralsV2Enabled,
-                                keyVisitor,
-                                pluginContext,
-                                symbolRemapper,
-                                ModuleMetricsImpl("temp") { stabilityInferencer.stabilityOf(it) },
-                                stabilityInferencer,
-                                FeatureFlags()
-                            ) {
-                                override fun makeKeySet(): MutableSet<String> {
-                                    return super.makeKeySet().also { builtKeys = it }
+                            val stabilityInferencer =
+                                StabilityInferencer(pluginContext.moduleDescriptor, emptySet())
+                            val transformer =
+                                object :
+                                    LiveLiteralTransformer(
+                                        liveLiteralsEnabled || liveLiteralsV2Enabled,
+                                        liveLiteralsV2Enabled,
+                                        keyVisitor,
+                                        pluginContext,
+                                        symbolRemapper,
+                                        ModuleMetricsImpl("temp") {
+                                            stabilityInferencer.stabilityOf(it)
+                                        },
+                                        stabilityInferencer,
+                                        FeatureFlags()
+                                    ) {
+                                    override fun makeKeySet(): MutableSet<String> {
+                                        return super.makeKeySet().also { builtKeys = it }
+                                    }
                                 }
-                            }
                             transformer.lower(moduleFragment)
                         }
                     }
@@ -98,7 +97,8 @@
         )
     }
 
-    // test: have two src strings (before/after) and assert that the keys of the params didn't change
+    // test: have two src strings (before/after) and assert that the keys of the params didn't
+    // change
     protected fun assertDurableChange(before: String, after: String) {
         val beforeKeys = computeKeys(listOf(SourceFile("Test.kt", before)))
         val afterKeys = computeKeys(listOf(SourceFile("Test.kt", after)))
@@ -109,19 +109,18 @@
         )
     }
 
-    protected fun assertTransform(
-        unchecked: String,
-        checked: String,
-        dumpTree: Boolean = false
-    ) = verifyGoldenComposeIrTransform(
-        """
+    protected fun assertTransform(unchecked: String, checked: String, dumpTree: Boolean = false) =
+        verifyGoldenComposeIrTransform(
+            """
             import androidx.compose.runtime.Composable
             $checked
-        """.trimIndent(),
         """
+                .trimIndent(),
+            """
             import androidx.compose.runtime.Composable
             $unchecked
-        """.trimIndent(),
-        dumpTree = dumpTree
-    )
+        """
+                .trimIndent(),
+            dumpTree = dumpTree
+        )
 }
diff --git a/compose/compiler/compiler-hosted/integration-tests/src/jvmTest/kotlin/androidx/compose/compiler/plugins/kotlin/AbstractMetricsTransformTest.kt b/compose/compiler/compiler-hosted/integration-tests/src/jvmTest/kotlin/androidx/compose/compiler/plugins/kotlin/AbstractMetricsTransformTest.kt
index 7189caa..88e3904 100644
--- a/compose/compiler/compiler-hosted/integration-tests/src/jvmTest/kotlin/androidx/compose/compiler/plugins/kotlin/AbstractMetricsTransformTest.kt
+++ b/compose/compiler/compiler-hosted/integration-tests/src/jvmTest/kotlin/androidx/compose/compiler/plugins/kotlin/AbstractMetricsTransformTest.kt
@@ -22,10 +22,7 @@
 import org.junit.Assert.assertEquals
 
 abstract class AbstractMetricsTransformTest(useFir: Boolean) : AbstractIrTransformTest(useFir) {
-    private fun verifyMetrics(
-        source: String,
-        verify: ModuleMetrics.() -> Unit
-    ) {
+    private fun verifyMetrics(source: String, verify: ModuleMetrics.() -> Unit) {
         val files = listOf(SourceFile("Test.kt", source))
         lateinit var extension: ComposeIrGenerationExtension
         compileToIr(
@@ -47,60 +44,48 @@
     fun assertClasses(
         source: String,
         expected: String,
-    ) = verifyMetrics(source) {
-        val actual = buildString { appendClassesTxt() }
-        assertEquals(
-            expected
-                .trimIndent()
-                .trimTrailingWhitespacesAndAddNewlineAtEOF(),
-            actual
-                .trimIndent()
-                .trimTrailingWhitespacesAndAddNewlineAtEOF(),
-        )
-    }
+    ) =
+        verifyMetrics(source) {
+            val actual = buildString { appendClassesTxt() }
+            assertEquals(
+                expected.trimIndent().trimTrailingWhitespacesAndAddNewlineAtEOF(),
+                actual.trimIndent().trimTrailingWhitespacesAndAddNewlineAtEOF(),
+            )
+        }
 
     fun assertComposables(
         source: String,
         expected: String,
-    ) = verifyMetrics(source) {
-        val actual = buildString { appendComposablesTxt() }
-        assertEquals(
-            expected
-                .trimIndent()
-                .trimTrailingWhitespacesAndAddNewlineAtEOF(),
-            actual
-                .trimIndent()
-                .trimTrailingWhitespacesAndAddNewlineAtEOF(),
-        )
-    }
+    ) =
+        verifyMetrics(source) {
+            val actual = buildString { appendComposablesTxt() }
+            assertEquals(
+                expected.trimIndent().trimTrailingWhitespacesAndAddNewlineAtEOF(),
+                actual.trimIndent().trimTrailingWhitespacesAndAddNewlineAtEOF(),
+            )
+        }
 
     fun assertModuleJson(
         source: String,
         expected: String,
-    ) = verifyMetrics(source) {
-        val actual = buildString { appendModuleJson() }
-        assertEquals(
-            expected
-                .trimIndent()
-                .trimTrailingWhitespacesAndAddNewlineAtEOF(),
-            actual
-                .trimIndent()
-                .trimTrailingWhitespacesAndAddNewlineAtEOF(),
-        )
-    }
+    ) =
+        verifyMetrics(source) {
+            val actual = buildString { appendModuleJson() }
+            assertEquals(
+                expected.trimIndent().trimTrailingWhitespacesAndAddNewlineAtEOF(),
+                actual.trimIndent().trimTrailingWhitespacesAndAddNewlineAtEOF(),
+            )
+        }
 
     fun assertComposablesCsv(
         source: String,
         expected: String,
-    ) = verifyMetrics(source) {
-        val actual = buildString { appendComposablesCsv() }
-        assertEquals(
-            expected
-                .trimIndent()
-                .trimTrailingWhitespacesAndAddNewlineAtEOF(),
-            actual
-                .trimIndent()
-                .trimTrailingWhitespacesAndAddNewlineAtEOF(),
-        )
-    }
+    ) =
+        verifyMetrics(source) {
+            val actual = buildString { appendComposablesCsv() }
+            assertEquals(
+                expected.trimIndent().trimTrailingWhitespacesAndAddNewlineAtEOF(),
+                actual.trimIndent().trimTrailingWhitespacesAndAddNewlineAtEOF(),
+            )
+        }
 }
diff --git a/compose/compiler/compiler-hosted/integration-tests/src/jvmTest/kotlin/androidx/compose/compiler/plugins/kotlin/AbstractMultiPlatformIntegrationTest.kt b/compose/compiler/compiler-hosted/integration-tests/src/jvmTest/kotlin/androidx/compose/compiler/plugins/kotlin/AbstractMultiPlatformIntegrationTest.kt
index 8bc508c..46782b1 100644
--- a/compose/compiler/compiler-hosted/integration-tests/src/jvmTest/kotlin/androidx/compose/compiler/plugins/kotlin/AbstractMultiPlatformIntegrationTest.kt
+++ b/compose/compiler/compiler-hosted/integration-tests/src/jvmTest/kotlin/androidx/compose/compiler/plugins/kotlin/AbstractMultiPlatformIntegrationTest.kt
@@ -57,6 +57,7 @@
 
     return Pair(output.toString(), ExitCode.OK)
 }
+
 // CompilerTestUtil
 private fun executeCompiler(compiler: CLITool<*>, args: List<String>): Pair<String, ExitCode> {
     val bytes = ByteArrayOutputStream()
@@ -69,43 +70,41 @@
         System.setErr(origErr)
     }
 }
+
 // jetTestUtils
 fun String.trimTrailingWhitespaces(): String =
     this.split('\n').joinToString(separator = "\n") { it.trimEnd() }
+
 // jetTestUtils
 fun String.trimTrailingWhitespacesAndAddNewlineAtEOF(): String =
-    this.trimTrailingWhitespaces().let {
-        result ->
+    this.trimTrailingWhitespaces().let { result ->
         if (result.endsWith("\n")) result else result + "\n"
     }
 
 @RunWith(JUnit4::class)
 abstract class AbstractMultiPlatformIntegrationTest : AbstractCompilerTest(useFir = false) {
-    @JvmField
-    @Rule
-    val sourceDirectory = TemporaryFolder()
+    @JvmField @Rule val sourceDirectory = TemporaryFolder()
 
     protected fun multiplatform(
-        @Language("kotlin")
-        common: String,
-        @Language("kotlin")
-        jvm: String,
+        @Language("kotlin") common: String,
+        @Language("kotlin") jvm: String,
         output: String
     ) {
         assert(composePluginJar.exists()) {
             "Compiler plugin jar does not exist: $composePluginJar"
         }
 
-        val optionalArgs = arrayOf(
-            "-cp",
-            defaultClassPath
-                .filter { it.exists() }
-                .joinToString(File.pathSeparator) { it.absolutePath },
-            "-kotlin-home",
-            kotlinHome.absolutePath,
-            "-Xplugin=${composePluginJar.absolutePath}",
-            "-Xuse-ir"
-        )
+        val optionalArgs =
+            arrayOf(
+                "-cp",
+                defaultClassPath
+                    .filter { it.exists() }
+                    .joinToString(File.pathSeparator) { it.absolutePath },
+                "-kotlin-home",
+                kotlinHome.absolutePath,
+                "-Xplugin=${composePluginJar.absolutePath}",
+                "-Xuse-ir"
+            )
 
         val jvmOnlyArgs = arrayOf("-no-stdlib")
 
@@ -118,13 +117,8 @@
 
         val jvmDest = sourceDirectory.newFolder("jvm").absolutePath
 
-        val result = K2JVMCompiler().compile(
-            jvmSrc,
-            commonSrc,
-            "-d", jvmDest,
-            *optionalArgs,
-            *jvmOnlyArgs
-        )
+        val result =
+            K2JVMCompiler().compile(jvmSrc, commonSrc, "-d", jvmDest, *optionalArgs, *jvmOnlyArgs)
 
         val files = File(jvmDest).listFiles()
 
@@ -159,19 +153,23 @@
         sources: File,
         commonSources: File?,
         vararg mainArguments: String
-    ): String = buildString {
-        val (output, exitCode) = executeCompilerGrabOutput(
-            this@compile,
-            listOfNotNull(
-                sources.absolutePath,
-                commonSources?.absolutePath,
-                commonSources?.absolutePath?.let("-Xcommon-sources="::plus),
-                "-Xmulti-platform",
-                "-Xexpect-actual-classes"
-            ) + mainArguments
-        )
-        appendLine("Exit code: $exitCode")
-        appendLine("Output:")
-        appendLine(output)
-    }.trimTrailingWhitespacesAndAddNewlineAtEOF().trimEnd('\r', '\n')
+    ): String =
+        buildString {
+                val (output, exitCode) =
+                    executeCompilerGrabOutput(
+                        this@compile,
+                        listOfNotNull(
+                            sources.absolutePath,
+                            commonSources?.absolutePath,
+                            commonSources?.absolutePath?.let("-Xcommon-sources="::plus),
+                            "-Xmulti-platform",
+                            "-Xexpect-actual-classes"
+                        ) + mainArguments
+                    )
+                appendLine("Exit code: $exitCode")
+                appendLine("Output:")
+                appendLine(output)
+            }
+            .trimTrailingWhitespacesAndAddNewlineAtEOF()
+            .trimEnd('\r', '\n')
 }
diff --git a/compose/compiler/compiler-hosted/integration-tests/src/jvmTest/kotlin/androidx/compose/compiler/plugins/kotlin/ClassStabilityTransformTests.kt b/compose/compiler/compiler-hosted/integration-tests/src/jvmTest/kotlin/androidx/compose/compiler/plugins/kotlin/ClassStabilityTransformTests.kt
index 20227ea..9cf7034 100644
--- a/compose/compiler/compiler-hosted/integration-tests/src/jvmTest/kotlin/androidx/compose/compiler/plugins/kotlin/ClassStabilityTransformTests.kt
+++ b/compose/compiler/compiler-hosted/integration-tests/src/jvmTest/kotlin/androidx/compose/compiler/plugins/kotlin/ClassStabilityTransformTests.kt
@@ -32,33 +32,24 @@
 import org.junit.Test
 
 class ClassStabilityTransformTests(useFir: Boolean) : AbstractIrTransformTest(useFir) {
-    @Test
-    fun testEmptyClassIsStable() = assertStability(
-        "class Foo",
-        "Stable"
-    )
+    @Test fun testEmptyClassIsStable() = assertStability("class Foo", "Stable")
 
     @Test
-    fun testSingleValPrimitivePropIsStable() = assertStability(
-        "class Foo(val value: Int)",
-        "Stable"
-    )
+    fun testSingleValPrimitivePropIsStable() =
+        assertStability("class Foo(val value: Int)", "Stable")
 
     @Test
-    fun testSingleVarPrimitivePropIsUnstable() = assertStability(
-        "class Foo(var value: Int)",
-        "Unstable"
-    )
+    fun testSingleVarPrimitivePropIsUnstable() =
+        assertStability("class Foo(var value: Int)", "Unstable")
 
     @Test
-    fun testSingleValTypeParamIsStableIfParamIs() = assertStability(
-        "class Foo<T>(val value: T)",
-        "Parameter(T)"
-    )
+    fun testSingleValTypeParamIsStableIfParamIs() =
+        assertStability("class Foo<T>(val value: T)", "Parameter(T)")
 
     @Test
-    fun testValTypeParam33Types() = assertStability(
-        """
+    fun testValTypeParam33Types() =
+        assertStability(
+            """
             class Foo<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30, T31, T32, T33>(
                 val t1: T1,
                 val t2: T2,
@@ -95,418 +86,440 @@
                 val t33: T33,
             )
         """,
-        """
+            """
             Parameter(T1),Parameter(T2),Parameter(T3),Parameter(T4),Parameter(T5),Parameter(T6),Parameter(T7),Parameter(T8),Parameter(T9),Parameter(T10),Parameter(T11),Parameter(T12),Parameter(T13),Parameter(T14),Parameter(T15),Parameter(T16),Parameter(T17),Parameter(T18),Parameter(T19),Parameter(T20),Parameter(T21),Parameter(T22),Parameter(T23),Parameter(T24),Parameter(T25),Parameter(T26),Parameter(T27),Parameter(T28),Parameter(T29),Parameter(T30),Parameter(T31),Parameter(T32),Parameter(T33)
-        """.trimIndent()
-    )
-
-    @Test
-    fun testSingleVarTypeParamIsUnstable() = assertStability(
-        "class Foo<T>(var value: T)",
-        "Unstable"
-    )
-
-    @Test
-    fun testNonCtorVarIsUnstable() = assertStability(
-        "class Foo(value: Int) { var value: Int = value }",
-        "Unstable"
-    )
-
-    @Test
-    fun testNonCtorValIsStable() = assertStability(
-        "class Foo(value: Int) { val value: Int = value }",
-        "Stable"
-    )
-
-    @Test
-    fun testMutableStateDelegateVarIsStable() = assertStability(
-        "class Foo(value: Int) { var value by mutableStateOf(value) }",
-        "Stable"
-    )
-
-    @Test
-    fun testLazyValIsUnstable() = assertStability(
-        "class Foo(value: Int) { val square by lazy { value * value } }",
-        "Unstable"
-    )
-
-    @Test
-    fun testNonFieldCtorParamDoesNotImpactStability() = assertStability(
-        "class Foo<T>(val a: Int, b: T) { val c: Int = b.hashCode() }",
-        "Stable"
-    )
-
-    @Test
-    fun testNonBackingFieldUnstableVarIsStable() = assertStability(
         """
+                .trimIndent()
+        )
+
+    @Test
+    fun testSingleVarTypeParamIsUnstable() =
+        assertStability("class Foo<T>(var value: T)", "Unstable")
+
+    @Test
+    fun testNonCtorVarIsUnstable() =
+        assertStability("class Foo(value: Int) { var value: Int = value }", "Unstable")
+
+    @Test
+    fun testNonCtorValIsStable() =
+        assertStability("class Foo(value: Int) { val value: Int = value }", "Stable")
+
+    @Test
+    fun testMutableStateDelegateVarIsStable() =
+        assertStability("class Foo(value: Int) { var value by mutableStateOf(value) }", "Stable")
+
+    @Test
+    fun testLazyValIsUnstable() =
+        assertStability(
+            "class Foo(value: Int) { val square by lazy { value * value } }",
+            "Unstable"
+        )
+
+    @Test
+    fun testNonFieldCtorParamDoesNotImpactStability() =
+        assertStability("class Foo<T>(val a: Int, b: T) { val c: Int = b.hashCode() }", "Stable")
+
+    @Test
+    fun testNonBackingFieldUnstableVarIsStable() =
+        assertStability(
+            """
             class Foo {
                 var p1: Unstable
                     get() { TODO() }
                     set(value) { }
             }
         """,
-        "Stable"
-    )
+            "Stable"
+        )
 
     @Test
-    fun testNonBackingFieldUnstableValIsStable() = assertStability(
-        """
+    fun testNonBackingFieldUnstableValIsStable() =
+        assertStability(
+            """
             class Foo {
                 val p1: Unstable
                     get() { return Unstable() }
             }
         """,
-        "Stable"
-    )
+            "Stable"
+        )
 
     @Test
-    fun testTypeParameterWithNonExactBackingFieldType() = assertStability(
-        "class Foo<T>(val a: List<T>)",
-        "Unstable"
-    )
+    fun testTypeParameterWithNonExactBackingFieldType() =
+        assertStability("class Foo<T>(val a: List<T>)", "Unstable")
 
     @Test
-    fun testTypeParamNonExactCtorParamExactBackingFields() = assertStability(
-        "class Foo<T>(a: List<T>) { val b = a.first(); val c = a.last() }",
-        "Parameter(T),Parameter(T)"
-    )
+    fun testTypeParamNonExactCtorParamExactBackingFields() =
+        assertStability(
+            "class Foo<T>(a: List<T>) { val b = a.first(); val c = a.last() }",
+            "Parameter(T),Parameter(T)"
+        )
+
+    @Test fun testInterfacesAreUncertain() = assertStability("interface Foo", "Uncertain(Foo)")
 
     @Test
-    fun testInterfacesAreUncertain() = assertStability(
-        "interface Foo",
-        "Uncertain(Foo)"
-    )
+    fun testInterfaceWithStableValAreUncertain() =
+        assertStability("interface Foo { val value: Int }", "Uncertain(Foo)")
 
     @Test
-    fun testInterfaceWithStableValAreUncertain() = assertStability(
-        "interface Foo { val value: Int }",
-        "Uncertain(Foo)"
-    )
-
-    @Test
-    fun testCrossModuleTypesResultInRuntimeStability() = assertStability(
-        """
+    fun testCrossModuleTypesResultInRuntimeStability() =
+        assertStability(
+            """
             class A
             class B
             class C
         """,
-        "class D(val a: A, val v: B, val C: C)",
-        "Runtime(A),Runtime(B),Runtime(C)"
-    )
+            "class D(val a: A, val v: B, val C: C)",
+            "Runtime(A),Runtime(B),Runtime(C)"
+        )
 
     @Test
-    fun testStable17() = assertStability(
-        """
+    fun testStable17() =
+        assertStability(
+            """
             class Counter {
                 private var count: Int = 0
                 fun getCount(): Int = count
                 fun increment() { count++ }
             }
         """,
-        "Unstable"
-    )
+            "Unstable"
+        )
 
     @Test
-    fun testValueClassIsStableIfItsValueIsStable() = assertStability(
-        """
+    fun testValueClassIsStableIfItsValueIsStable() =
+        assertStability(
+            """
             @JvmInline value class Px(val pixels: Int)
         """,
-        "Stable"
-    )
+            "Stable"
+        )
 
     @Test
-    fun testValueClassIsUnstableIfItsValueIsUnstable() = assertStability(
-        """
+    fun testValueClassIsUnstableIfItsValueIsUnstable() =
+        assertStability(
+            """
             @JvmInline value class UnstableWrapper(val backingValue: Unstable)
         """,
-        "Unstable"
-    )
+            "Unstable"
+        )
 
     @Test
-    fun testValueClassIsStableIfAnnotatedAsStableRegardlessOfWrappedValue() = assertStability(
-        """
+    fun testValueClassIsStableIfAnnotatedAsStableRegardlessOfWrappedValue() =
+        assertStability(
+            """
             @Stable @JvmInline value class StableWrapper(val backingValue: Unstable)
         """,
-        "Stable"
-    )
+            "Stable"
+        )
 
     @Test
-    fun testGenericValueClassIsStableIfTypeIsStable() = assertStability(
-        """
+    fun testGenericValueClassIsStableIfTypeIsStable() =
+        assertStability(
+            """
             @JvmInline value class PairWrapper<T, U>(val pair: Pair<T, U>)
         """,
-        "Parameter(T),Parameter(U)"
-    )
+            "Parameter(T),Parameter(U)"
+        )
 
     @Test
-    fun testDeeplyNestedValueClassIsTreatedAsStable() = assertStability(
-        """
+    fun testDeeplyNestedValueClassIsTreatedAsStable() =
+        assertStability(
+            """
             @Stable @JvmInline value class UnsafeStableList(val list: MutableList<Int>)
 
             @JvmInline value class StableWrapper(val backingValue: UnsafeStableList)
         """,
-        """
+            """
             @JvmInline value class InferredStable(val backingValue: StableWrapper)
         """,
-        "Stable"
-    )
+            "Stable"
+        )
 
     @Test
-    fun testProtobufLiteTypesAreStable() = assertStability(
-        """
+    fun testProtobufLiteTypesAreStable() =
+        assertStability(
+            """
             class Foo(val x: androidx.compose.compiler.plugins.StabilityTestProtos.SampleProto)
         """,
-        "Stable"
-    )
+            "Stable"
+        )
 
     @Test
-    fun testPairIsStableIfItsTypesAre() = assertStability(
-        """
+    fun testPairIsStableIfItsTypesAre() =
+        assertStability(
+            """
             class Foo<T, V>(val x: Pair<T, V>)
         """,
-        "Parameter(T),Parameter(V)"
-    )
+            "Parameter(T),Parameter(V)"
+        )
 
     @Test
-    fun testPairOfCrossModuleTypesAreRuntimeStable() = assertStability(
-        """
+    fun testPairOfCrossModuleTypesAreRuntimeStable() =
+        assertStability(
+            """
             class A
             class B
         """,
-        "class Foo(val x: Pair<A, B>)",
-        "Runtime(A),Runtime(B)"
-    )
+            "class Foo(val x: Pair<A, B>)",
+            "Runtime(A),Runtime(B)"
+        )
 
     @Test
-    fun testGuavaImmutableListIsStableIfItsTypesAre() = assertStability(
-        """
+    fun testGuavaImmutableListIsStableIfItsTypesAre() =
+        assertStability(
+            """
             class Foo<T>(val x: com.google.common.collect.ImmutableList<T>)
         """,
-        "Parameter(T)"
-    )
+            "Parameter(T)"
+        )
 
     @Test
-    fun testGuavaImmutableListCrossModuleTypesAreRuntimeStable() = assertStability(
-        """
+    fun testGuavaImmutableListCrossModuleTypesAreRuntimeStable() =
+        assertStability(
+            """
             class A
         """,
-        """
+            """
             class Foo(val x: com.google.common.collect.ImmutableList<A>)
         """,
-        "Runtime(A)"
-    )
+            "Runtime(A)"
+        )
 
     @Test
-    fun testGuavaImmutableSetIsStableIfItsTypesAre() = assertStability(
-        """
+    fun testGuavaImmutableSetIsStableIfItsTypesAre() =
+        assertStability(
+            """
             class Foo<T>(val x: com.google.common.collect.ImmutableSet<T>)
         """,
-        "Parameter(T)"
-    )
+            "Parameter(T)"
+        )
 
     @Test
-    fun testGuavaImmutableSetCrossModuleTypesAreRuntimeStable() = assertStability(
-        """
+    fun testGuavaImmutableSetCrossModuleTypesAreRuntimeStable() =
+        assertStability(
+            """
             class A
         """,
-        """
+            """
             class Foo(val x: com.google.common.collect.ImmutableSet<A>)
         """,
-        "Runtime(A)"
-    )
+            "Runtime(A)"
+        )
 
     @Test
-    fun testGuavaImmutableMapIsStableIfItsTypesAre() = assertStability(
-        """
+    fun testGuavaImmutableMapIsStableIfItsTypesAre() =
+        assertStability(
+            """
             class Foo<K, V>(val x: com.google.common.collect.ImmutableMap<K, V>)
         """,
-        "Parameter(K),Parameter(V)"
-    )
+            "Parameter(K),Parameter(V)"
+        )
 
     @Test
-    fun testGuavaImmutableMapCrossModuleTypesAreRuntimeStable() = assertStability(
-        """
+    fun testGuavaImmutableMapCrossModuleTypesAreRuntimeStable() =
+        assertStability(
+            """
             class A
             class B
         """,
-        """
+            """
             class Foo(val x: com.google.common.collect.ImmutableMap<A, B>)
         """,
-        "Runtime(A),Runtime(B)"
-    )
+            "Runtime(A),Runtime(B)"
+        )
 
     @Test
-    fun testKotlinxImmutableCollectionIsStableIfItsTypesAre() = assertStability(
-        """
+    fun testKotlinxImmutableCollectionIsStableIfItsTypesAre() =
+        assertStability(
+            """
             class Foo<T>(val x: kotlinx.collections.immutable.ImmutableCollection<T>)
         """,
-        "Parameter(T)"
-    )
+            "Parameter(T)"
+        )
 
     @Test
-    fun testKotlinxImmutableCollectionCrossModuleTypesAreRuntimeStable() = assertStability(
-        """
+    fun testKotlinxImmutableCollectionCrossModuleTypesAreRuntimeStable() =
+        assertStability(
+            """
             class A
         """,
-        """
+            """
             class Foo(val x: kotlinx.collections.immutable.ImmutableCollection<A>)
         """,
-        "Runtime(A)"
-    )
+            "Runtime(A)"
+        )
 
     @Test
-    fun testKotlinxImmutableListIsStableIfItsTypesAre() = assertStability(
-        """
+    fun testKotlinxImmutableListIsStableIfItsTypesAre() =
+        assertStability(
+            """
             class Foo<T>(val x: kotlinx.collections.immutable.ImmutableList<T>)
         """,
-        "Parameter(T)"
-    )
+            "Parameter(T)"
+        )
 
     @Test
-    fun testKotlinxImmutableListCrossModuleTypesAreRuntimeStable() = assertStability(
-        """
+    fun testKotlinxImmutableListCrossModuleTypesAreRuntimeStable() =
+        assertStability(
+            """
             class A
         """,
-        """
+            """
             class Foo(val x: kotlinx.collections.immutable.ImmutableList<A>)
         """,
-        "Runtime(A)"
-    )
+            "Runtime(A)"
+        )
 
     @Test
-    fun testKotlinxImmutableSetIsStableIfItsTypesAre() = assertStability(
-        """
+    fun testKotlinxImmutableSetIsStableIfItsTypesAre() =
+        assertStability(
+            """
             class Foo<T>(val x: kotlinx.collections.immutable.ImmutableSet<T>)
         """,
-        "Parameter(T)"
-    )
+            "Parameter(T)"
+        )
 
     @Test
-    fun testKotlinxImmutableSetCrossModuleTypesAreRuntimeStable() = assertStability(
-        """
+    fun testKotlinxImmutableSetCrossModuleTypesAreRuntimeStable() =
+        assertStability(
+            """
             class A
         """,
-        """
+            """
             class Foo(val x: kotlinx.collections.immutable.ImmutableSet<A>)
         """,
-        "Runtime(A)"
-    )
+            "Runtime(A)"
+        )
 
     @Test
-    fun testKotlinxImmutableMapIsStableIfItsTypesAre() = assertStability(
-        """
+    fun testKotlinxImmutableMapIsStableIfItsTypesAre() =
+        assertStability(
+            """
             class Foo<K, V>(val x: kotlinx.collections.immutable.ImmutableMap<K, V>)
         """,
-        "Parameter(K),Parameter(V)"
-    )
+            "Parameter(K),Parameter(V)"
+        )
 
     @Test
-    fun testKotlinxImmutableMapCrossModuleTypesAreRuntimeStable() = assertStability(
-        """
+    fun testKotlinxImmutableMapCrossModuleTypesAreRuntimeStable() =
+        assertStability(
+            """
             class A
             class B
         """,
-        """
+            """
             class Foo(val x: kotlinx.collections.immutable.ImmutableMap<A, B>)
         """,
-        "Runtime(A),Runtime(B)"
-    )
+            "Runtime(A),Runtime(B)"
+        )
 
     @Test
-    fun testKotlinxPersistentCollectionIsStableIfItsTypesAre() = assertStability(
-        """
+    fun testKotlinxPersistentCollectionIsStableIfItsTypesAre() =
+        assertStability(
+            """
             class Foo<T>(val x: kotlinx.collections.immutable.PersistentCollection<T>)
         """,
-        "Parameter(T)"
-    )
+            "Parameter(T)"
+        )
 
     @Test
-    fun testKotlinxPersistentCollectionCrossModuleTypesAreRuntimeStable() = assertStability(
-        """
+    fun testKotlinxPersistentCollectionCrossModuleTypesAreRuntimeStable() =
+        assertStability(
+            """
             class A
         """,
-        """
+            """
             class Foo(val x: kotlinx.collections.immutable.PersistentCollection<A>)
         """,
-        "Runtime(A)"
-    )
+            "Runtime(A)"
+        )
 
     @Test
-    fun testKotlinxPersistentListIsStableIfItsTypesAre() = assertStability(
-        """
+    fun testKotlinxPersistentListIsStableIfItsTypesAre() =
+        assertStability(
+            """
             class Foo<T>(val x: kotlinx.collections.immutable.PersistentList<T>)
         """,
-        "Parameter(T)"
-    )
+            "Parameter(T)"
+        )
 
     @Test
-    fun testKotlinxPersistentListCrossModuleTypesAreRuntimeStable() = assertStability(
-        """
+    fun testKotlinxPersistentListCrossModuleTypesAreRuntimeStable() =
+        assertStability(
+            """
             class A
         """,
-        """
+            """
             class Foo(val x: kotlinx.collections.immutable.PersistentList<A>)
         """,
-        "Runtime(A)"
-    )
+            "Runtime(A)"
+        )
 
     @Test
-    fun testKotlinxPersistentSetIsStableIfItsTypesAre() = assertStability(
-        """
+    fun testKotlinxPersistentSetIsStableIfItsTypesAre() =
+        assertStability(
+            """
             class Foo<T>(val x: kotlinx.collections.immutable.PersistentSet<T>)
         """,
-        "Parameter(T)"
-    )
+            "Parameter(T)"
+        )
 
     @Test
-    fun testKotlinxPersistentSetCrossModuleTypesAreRuntimeStable() = assertStability(
-        """
+    fun testKotlinxPersistentSetCrossModuleTypesAreRuntimeStable() =
+        assertStability(
+            """
             class A
         """,
-        """
+            """
             class Foo(val x: kotlinx.collections.immutable.PersistentSet<A>)
         """,
-        "Runtime(A)"
-    )
+            "Runtime(A)"
+        )
 
     @Test
-    fun testKotlinxPersistentMapIsStableIfItsTypesAre() = assertStability(
-        """
+    fun testKotlinxPersistentMapIsStableIfItsTypesAre() =
+        assertStability(
+            """
             class Foo<K, V>(val x: kotlinx.collections.immutable.PersistentMap<K, V>)""",
-        "Parameter(K),Parameter(V)"
-    )
+            "Parameter(K),Parameter(V)"
+        )
 
     @Test
-    fun testKotlinxPersistentMapCrossModuleTypesAreRuntimeStable() = assertStability(
-        """
+    fun testKotlinxPersistentMapCrossModuleTypesAreRuntimeStable() =
+        assertStability(
+            """
             class A
             class B
         """,
-        """
+            """
             class Foo(val x: kotlinx.collections.immutable.PersistentMap<A, B>)""",
-        "Runtime(A),Runtime(B)"
-    )
+            "Runtime(A),Runtime(B)"
+        )
 
     @Test
-    fun testDaggerLazyIsStableIfItsTypeIs() = assertStability(
-        """
+    fun testDaggerLazyIsStableIfItsTypeIs() =
+        assertStability(
+            """
             class Foo<T>(val x: dagger.Lazy<T>)
         """,
-        "Parameter(T)"
-    )
+            "Parameter(T)"
+        )
 
     @Test
-    fun testDaggerLazyOfCrossModuleTypeIsRuntimeStable() = assertStability(
-        """
+    fun testDaggerLazyOfCrossModuleTypeIsRuntimeStable() =
+        assertStability(
+            """
             class A
         """,
-        "class Foo(val x: dagger.Lazy<A>)",
-        "Runtime(A)"
-    )
+            "class Foo(val x: dagger.Lazy<A>)",
+            "Runtime(A)"
+        )
 
     @Test
-    fun testVarPropDelegateWithCrossModuleStableDelegateTypeIsStable() = assertStability(
-        """
+    fun testVarPropDelegateWithCrossModuleStableDelegateTypeIsStable() =
+        assertStability(
+            """
             @Stable
             class StableDelegate {
                 operator fun setValue(thisObj: Any?, property: KProperty<*>, value: Int) {
@@ -516,13 +529,14 @@
                 }
             }
         """,
-        "class Foo { var p1 by StableDelegate() }",
-        "Stable"
-    )
+            "class Foo { var p1 by StableDelegate() }",
+            "Stable"
+        )
 
     @Test
-    fun testVarPropDelegateWithStableDelegateTypeIsStable() = assertStability(
-        """
+    fun testVarPropDelegateWithStableDelegateTypeIsStable() =
+        assertStability(
+            """
         @Stable
         class StableDelegate {
             operator fun setValue(thisObj: Any?, property: KProperty<*>, value: Int) {
@@ -533,12 +547,13 @@
         }
         class Foo { var p1 by StableDelegate() }
         """,
-        "Stable"
-    )
+            "Stable"
+        )
 
     @Test
-    fun testVarPropDelegateOfInferredStableDelegate() = assertStability(
-        """
+    fun testVarPropDelegateOfInferredStableDelegate() =
+        assertStability(
+            """
         class StableDelegate {
             operator fun setValue(thisObj: Any?, property: KProperty<*>, value: Int) {
             }
@@ -548,12 +563,13 @@
         }
         class Foo { var p1 by StableDelegate() }
         """,
-        "Stable"
-    )
+            "Stable"
+        )
 
     @Test
-    fun testVarPropDelegateOfCrossModuleInferredStableDelegate() = assertStability(
-        """
+    fun testVarPropDelegateOfCrossModuleInferredStableDelegate() =
+        assertStability(
+            """
             class StableDelegate {
                 operator fun setValue(thisObj: Any?, property: KProperty<*>, value: Int) {
                 }
@@ -562,9 +578,9 @@
                 }
             }
         """,
-        "class Foo { var p1 by StableDelegate() }",
-        "Runtime(StableDelegate)"
-    )
+            "class Foo { var p1 by StableDelegate() }",
+            "Runtime(StableDelegate)"
+        )
 
     @Test
     fun testStableDelegateWithTypeParamButNoBackingFieldDoesntDependOnReturnType() =
@@ -584,121 +600,143 @@
         )
 
     @Test
-    fun testStable26() = assertStability(
-        """
+    fun testStable26() =
+        assertStability(
+            """
             class A
             class B
             class C
         """,
-        """
+            """
             class Foo(a: A, b: B, c: C) {
                 var a by mutableStateOf(a)
                 var b by mutableStateOf(b)
                 var c by mutableStateOf(c)
             }
         """,
-        "Stable"
-    )
+            "Stable"
+        )
 
     @Test
-    fun testExplicitlyMarkedStableTypesAreStable() = assertStability(
-        """
+    fun testExplicitlyMarkedStableTypesAreStable() =
+        assertStability(
+            """
             @Stable
             class A
         """,
-        """
+            """
             class Foo(val a: A)
         """,
-        "Stable"
-    )
+            "Stable"
+        )
 
     @Test
-    fun testExternalStableTypesFieldsAreStable() = assertStability(
-        externalSrc = """
+    fun testExternalStableTypesFieldsAreStable() =
+        assertStability(
+            externalSrc =
+                """
             class A 
         """,
-        classDefSrc = """
+            classDefSrc =
+                """
             class Foo(val a: A)
         """,
-        stability = "Stable",
-        externalTypes = setOf("dependency.A")
-    )
+            stability = "Stable",
+            externalTypes = setOf("dependency.A")
+        )
 
     @Test
-    fun testClassesExtendingExternalStableInterfacesAreStable() = assertStability(
-        externalSrc = """
+    fun testClassesExtendingExternalStableInterfacesAreStable() =
+        assertStability(
+            externalSrc =
+                """
             interface A 
         """,
-        classDefSrc = """
+            classDefSrc =
+                """
             class Foo : A
         """,
-        stability = "Stable",
-        externalTypes = setOf("dependency.A")
-    )
+            stability = "Stable",
+            externalTypes = setOf("dependency.A")
+        )
 
     @Test
-    fun testExternalWildcardTypesAreStable() = assertStability(
-        externalSrc = """
+    fun testExternalWildcardTypesAreStable() =
+        assertStability(
+            externalSrc =
+                """
             class A
         """,
-        classDefSrc = """
+            classDefSrc =
+                """
             class Foo(val a: A)
         """,
-        stability = "Stable",
-        externalTypes = setOf("dependency.*")
-    )
+            stability = "Stable",
+            externalTypes = setOf("dependency.*")
+        )
 
     @Test
-    fun testExternalOnlySingleWildcardTypesAreStable() = assertStability(
-        externalSrc = """
+    fun testExternalOnlySingleWildcardTypesAreStable() =
+        assertStability(
+            externalSrc =
+                """
             class A
 
             class B {
                 class C
             }
         """,
-        classDefSrc = """
+            classDefSrc =
+                """
             class Foo(val a: A, val b: B, val c: B.C)
         """,
-        stability = "Runtime(B)",
-        externalTypes = setOf("dependency.A", "dependency.B.*")
-    )
+            stability = "Runtime(B)",
+            externalTypes = setOf("dependency.A", "dependency.B.*")
+        )
 
     @Test
-    fun testExternalDoubleWildcardTypesAreStable() = assertStability(
-        externalSrc = """
+    fun testExternalDoubleWildcardTypesAreStable() =
+        assertStability(
+            externalSrc =
+                """
             class A {
                 class B {
                     class C
                 }
             }
         """,
-        classDefSrc = """
+            classDefSrc =
+                """
             class Foo(val a: A, val b: A.B, val c: A.B.C)
         """,
-        stability = "Stable",
-        externalTypes = setOf("dependency.**")
-    )
+            stability = "Stable",
+            externalTypes = setOf("dependency.**")
+        )
 
     @Test
-    fun testExternalDoubleWildcardInMiddleTypesAreStable() = assertStability(
-        externalSrc = """
+    fun testExternalDoubleWildcardInMiddleTypesAreStable() =
+        assertStability(
+            externalSrc =
+                """
             class A {
                 class B {
                     class C
                 }
             }
         """,
-        classDefSrc = """
+            classDefSrc =
+                """
             class Foo(val a: A, val b: A.B, val c: A.B.C)
         """,
-        stability = "Runtime(A),Runtime(B)",
-        externalTypes = setOf("dependency.**.C")
-    )
+            stability = "Runtime(A),Runtime(B)",
+            externalTypes = setOf("dependency.**.C")
+        )
 
     @Test
-    fun testExternalDoubleWildcardWithPrefixInMiddleTypesAreStable() = assertStability(
-        externalSrc = """
+    fun testExternalDoubleWildcardWithPrefixInMiddleTypesAreStable() =
+        assertStability(
+            externalSrc =
+                """
             class A {
                 class Ba {
                     class C
@@ -708,60 +746,72 @@
                 }
             }
         """,
-        classDefSrc = """
+            classDefSrc =
+                """
             class Foo(val a: A, val ba: A.Ba, val bb: A.Bb, val ca: A.Ba.C, val cb: A.Bb.C)
         """,
-        stability = "Runtime(A)",
-        externalTypes = setOf("dependency.A.B**")
-    )
+            stability = "Runtime(A)",
+            externalTypes = setOf("dependency.A.B**")
+        )
 
     @Test
-    fun testExternalMixedWildcardsTypesAreStable() = assertStability(
-        externalSrc = """
+    fun testExternalMixedWildcardsTypesAreStable() =
+        assertStability(
+            externalSrc =
+                """
             class A {
                 class B {
                     class C
                 }
             }
         """,
-        classDefSrc = """
+            classDefSrc =
+                """
             class Foo(val a: A, val b: A.B, val c: A.B.C)
         """,
-        stability = "Runtime(A)",
-        externalTypes = setOf("dependency.**.*")
-    )
+            stability = "Runtime(A)",
+            externalTypes = setOf("dependency.**.*")
+        )
 
     @Test
-    fun testExternalMultiWildcardFirstTypesAreStable() = assertStability(
-        externalSrc = """
+    fun testExternalMultiWildcardFirstTypesAreStable() =
+        assertStability(
+            externalSrc =
+                """
             class A {
                 class B {
                     class C
                 }
             }
         """,
-        classDefSrc = """
+            classDefSrc =
+                """
             class Foo(val a: A, val b: A.B, val c: A.B.C)
         """,
-        stability = "Stable",
-        externalTypes = setOf("**")
-    )
+            stability = "Stable",
+            externalTypes = setOf("**")
+        )
 
     @Test
-    fun testExternalWildcardFirstTypesAreStable() = assertStability(
-        externalSrc = """
+    fun testExternalWildcardFirstTypesAreStable() =
+        assertStability(
+            externalSrc =
+                """
             class A
         """,
-        classDefSrc = """
+            classDefSrc =
+                """
             class Foo(val a: A)
         """,
-        stability = "Stable",
-        externalTypes = setOf("*.A")
-    )
+            stability = "Stable",
+            externalTypes = setOf("*.A")
+        )
 
     @Test
-    fun testExternalMultipleSingleWildcardsTypesAreStable() = assertStability(
-        externalSrc = """
+    fun testExternalMultipleSingleWildcardsTypesAreStable() =
+        assertStability(
+            externalSrc =
+                """
             class A {
                 class B {
                     class C
@@ -771,367 +821,374 @@
                 }
             }
         """,
-        classDefSrc = """
+            classDefSrc =
+                """
             class Foo(val c: A.B.C, val e: A.D.E)
         """,
-        stability = "Stable",
-        externalTypes = setOf("dependency.*.B.*", "dependency.A.D.E")
-    )
+            stability = "Stable",
+            externalTypes = setOf("dependency.*.B.*", "dependency.A.D.E")
+        )
 
     @Test
-    fun testExternalGenericTypesAreParameterDependent() = assertStability(
-        externalSrc = """
+    fun testExternalGenericTypesAreParameterDependent() =
+        assertStability(
+            externalSrc =
+                """
             class Foo<T>(val x: T)
         """,
-        classDefSrc = """
+            classDefSrc =
+                """
             class Test<T>(val foo: Foo<T>)
         """,
-        stability = "Parameter(T)",
-        externalTypes = setOf("dependency.Foo")
-    )
+            stability = "Parameter(T)",
+            externalTypes = setOf("dependency.Foo")
+        )
 
     @Test
-    fun testExternalGenericTypesAreCanIgnoreParameters() = assertStability(
-        externalSrc = """
+    fun testExternalGenericTypesAreCanIgnoreParameters() =
+        assertStability(
+            externalSrc =
+                """
             class Foo<X, Y>(val x: X, val y: Y)
         """,
-        classDefSrc = """
+            classDefSrc =
+                """
             class Test<X, Y>(val foo: Foo<X, Y>)
         """,
-        stability = "Parameter(X)",
-        externalTypes = setOf("dependency.Foo<*,_>")
-    )
+            stability = "Parameter(X)",
+            externalTypes = setOf("dependency.Foo<*,_>")
+        )
 
     @Test
-    fun testExternalGenericTypesAreCanBeRuntimeStable() = assertStability(
-        externalSrc = """
+    fun testExternalGenericTypesAreCanBeRuntimeStable() =
+        assertStability(
+            externalSrc =
+                """
             class A
             class B
             class Foo<X, Y>(val x: X, val y: Y)
         """,
-        classDefSrc = """
+            classDefSrc =
+                """
             class Test(val foo: Foo<A, B>)
         """,
-        stability = "Runtime(B)",
-        externalTypes = setOf("dependency.Foo<_,*>")
-    )
+            stability = "Runtime(B)",
+            externalTypes = setOf("dependency.Foo<_,*>")
+        )
 
     @Test
-    fun testExternalGenericDefinedTypesAreStable() = assertStability(
-        externalSrc = """
+    fun testExternalGenericDefinedTypesAreStable() =
+        assertStability(
+            externalSrc =
+                """
             class A
             class Foo<T>(val x: T)
         """,
-        classDefSrc = """
+            classDefSrc =
+                """
             class Test(val foo: Foo<A>)
         """,
-        stability = "Stable",
-        externalTypes = setOf("dependency.Foo", "dependency.A")
-    )
+            stability = "Stable",
+            externalTypes = setOf("dependency.Foo", "dependency.A")
+        )
 
     @Test
-    fun testExternalDeepPackageNameIsStable() = assertStability(
-        externalSrc = """
+    fun testExternalDeepPackageNameIsStable() =
+        assertStability(
+            externalSrc =
+                """
             class A
         """,
-        classDefSrc = """
+            classDefSrc =
+                """
             class Test(val foo: A)
         """,
-        stability = "Stable",
-        externalTypes = setOf("dependency.b.c.d.A"),
-        packageName = "dependency.b.c.d"
-    )
+            stability = "Stable",
+            externalTypes = setOf("dependency.b.c.d.A"),
+            packageName = "dependency.b.c.d"
+        )
 
     @Test
-    fun testListOfCallWithPrimitiveTypeIsStable() = assertStability(
-        "",
-        "",
-        "listOf(1)",
-        "Stable"
-    )
+    fun testListOfCallWithPrimitiveTypeIsStable() = assertStability("", "", "listOf(1)", "Stable")
 
     @Test
-    fun testListOfCallWithLocalInferredStableTypeIsStable() = assertStability(
-        "",
-        "class Foo",
-        "listOf(Foo())",
-        "Stable"
-    )
+    fun testListOfCallWithLocalInferredStableTypeIsStable() =
+        assertStability("", "class Foo", "listOf(Foo())", "Stable")
 
     @Test
-    fun testListOfCallWithExternalInferredStableTypeIsRuntimeStable() = assertStability(
-        "class Foo",
-        "",
-        "listOf(Foo())",
-        "Runtime(Foo)"
-    )
+    fun testListOfCallWithExternalInferredStableTypeIsRuntimeStable() =
+        assertStability("class Foo", "", "listOf(Foo())", "Runtime(Foo)")
 
     @Test
-    fun testMapOfCallWithPrimitiveTypesIsStable() = assertStability(
-        "",
-        "",
-        "mapOf(1 to 1)",
-        "Stable,Stable"
-    )
+    fun testMapOfCallWithPrimitiveTypesIsStable() =
+        assertStability("", "", "mapOf(1 to 1)", "Stable,Stable")
 
     @Test
-    fun testMapOfCallWithStableTypeIsStable() = assertStability(
-        "",
-        """
+    fun testMapOfCallWithStableTypeIsStable() =
+        assertStability(
+            "",
+            """
             class A
             class B
         """,
-        "mapOf(A() to B())",
-        "Stable,Stable"
-    )
+            "mapOf(A() to B())",
+            "Stable,Stable"
+        )
 
     @Test
-    fun testMapOfCallWithExternalInferredStableTypeIsRuntimeStable() = assertStability(
-        """
+    fun testMapOfCallWithExternalInferredStableTypeIsRuntimeStable() =
+        assertStability(
+            """
             class A
             class B
         """,
-        "",
-        "mapOf(A() to B())",
-        "Runtime(A),Runtime(B)"
-    )
+            "",
+            "mapOf(A() to B())",
+            "Runtime(A),Runtime(B)"
+        )
 
     @Test
-    fun testSetOfCallWithPrimitiveTypesIsStable() = assertStability(
-        "",
-        "",
-        "setOf(1)",
-        "Stable"
-    )
+    fun testSetOfCallWithPrimitiveTypesIsStable() = assertStability("", "", "setOf(1)", "Stable")
 
     @Test
-    fun testSetOfCallWithStableTypeIsStable() = assertStability(
-        "",
-        """
+    fun testSetOfCallWithStableTypeIsStable() =
+        assertStability(
+            "",
+            """
             class A
         """,
-        "setOf(A())",
-        "Stable"
-    )
+            "setOf(A())",
+            "Stable"
+        )
 
     @Test
-    fun testSetOfCallWithExternalInferredStableTypeIsRuntimeStable() = assertStability(
-        """
+    fun testSetOfCallWithExternalInferredStableTypeIsRuntimeStable() =
+        assertStability(
+            """
             class A
         """,
-        "",
-        "setOf(A())",
-        "Runtime(A)"
-    )
+            "",
+            "setOf(A())",
+            "Runtime(A)"
+        )
 
     @Test
-    fun testImmutableListOfCallWithPrimitiveTypeIsStable() = assertStability(
-        "",
-        "",
-        "kotlinx.collections.immutable.immutableListOf(1)",
-        "Stable"
-    )
+    fun testImmutableListOfCallWithPrimitiveTypeIsStable() =
+        assertStability("", "", "kotlinx.collections.immutable.immutableListOf(1)", "Stable")
 
     @Test
-    fun testImmutableListOfCallWithLocalInferredStableTypeIsStable() = assertStability(
-        "",
-        "class Foo",
-        "kotlinx.collections.immutable.immutableListOf(Foo())",
-        "Stable"
-    )
+    fun testImmutableListOfCallWithLocalInferredStableTypeIsStable() =
+        assertStability(
+            "",
+            "class Foo",
+            "kotlinx.collections.immutable.immutableListOf(Foo())",
+            "Stable"
+        )
 
     @Test
-    fun testImmutableListOfCallWithExternalInferredStableTypeIsRuntimeStable() = assertStability(
-        "class Foo",
-        "",
-        "kotlinx.collections.immutable.immutableListOf(Foo())",
-        "Runtime(Foo)"
-    )
+    fun testImmutableListOfCallWithExternalInferredStableTypeIsRuntimeStable() =
+        assertStability(
+            "class Foo",
+            "",
+            "kotlinx.collections.immutable.immutableListOf(Foo())",
+            "Runtime(Foo)"
+        )
 
     @Test
-    fun testImmutableMapOfCallWithPrimitiveTypesIsStable() = assertStability(
-        "",
-        "",
-        "kotlinx.collections.immutable.immutableMapOf(1 to 1)",
-        "Stable,Stable"
-    )
+    fun testImmutableMapOfCallWithPrimitiveTypesIsStable() =
+        assertStability(
+            "",
+            "",
+            "kotlinx.collections.immutable.immutableMapOf(1 to 1)",
+            "Stable,Stable"
+        )
 
     @Test
-    fun testImmutableMapOfCallWithStableTypeIsStable() = assertStability(
-        "",
-        """
+    fun testImmutableMapOfCallWithStableTypeIsStable() =
+        assertStability(
+            "",
+            """
             class A
             class B
         """,
-        "kotlinx.collections.immutable.immutableMapOf(A() to B())",
-        "Stable,Stable"
-    )
+            "kotlinx.collections.immutable.immutableMapOf(A() to B())",
+            "Stable,Stable"
+        )
 
     @Test
-    fun testImmutableMapOfCallWithExternalInferredStableTypeIsRuntimeStable() = assertStability(
-        """
+    fun testImmutableMapOfCallWithExternalInferredStableTypeIsRuntimeStable() =
+        assertStability(
+            """
             class A
             class B
         """,
-        "",
-        "kotlinx.collections.immutable.immutableMapOf(A() to B())",
-        "Runtime(A),Runtime(B)"
-    )
+            "",
+            "kotlinx.collections.immutable.immutableMapOf(A() to B())",
+            "Runtime(A),Runtime(B)"
+        )
 
     @Test
-    fun testImmutableSetOfCallWithPrimitiveTypesIsStable() = assertStability(
-        "",
-        "",
-        "kotlinx.collections.immutable.immutableSetOf(1)",
-        "Stable"
-    )
+    fun testImmutableSetOfCallWithPrimitiveTypesIsStable() =
+        assertStability("", "", "kotlinx.collections.immutable.immutableSetOf(1)", "Stable")
 
     @Test
-    fun testImmutableSetOfCallWithStableTypeIsStable() = assertStability(
-        "",
-        """
+    fun testImmutableSetOfCallWithStableTypeIsStable() =
+        assertStability(
+            "",
+            """
             class A
         """,
-        "kotlinx.collections.immutable.immutableSetOf(A())",
-        "Stable"
-    )
+            "kotlinx.collections.immutable.immutableSetOf(A())",
+            "Stable"
+        )
 
     @Test
-    fun testImmutableSetOfCallWithExternalInferredStableTypeIsRuntimeStable() = assertStability(
-        """
+    fun testImmutableSetOfCallWithExternalInferredStableTypeIsRuntimeStable() =
+        assertStability(
+            """
             class A
         """,
-        "",
-        "kotlinx.collections.immutable.immutableSetOf(A())",
-        "Runtime(A)"
-    )
+            "",
+            "kotlinx.collections.immutable.immutableSetOf(A())",
+            "Runtime(A)"
+        )
 
     @Test
-    fun testPersistentListOfCallWithPrimitiveTypeIsStable() = assertStability(
-        "",
-        "",
-        "kotlinx.collections.immutable.persistentListOf(1)",
-        "Stable"
-    )
+    fun testPersistentListOfCallWithPrimitiveTypeIsStable() =
+        assertStability("", "", "kotlinx.collections.immutable.persistentListOf(1)", "Stable")
 
     @Test
-    fun testPersistentListOfCallWithLocalInferredStableTypeIsStable() = assertStability(
-        "",
-        "class Foo",
-        "kotlinx.collections.immutable.persistentListOf(Foo())",
-        "Stable"
-    )
+    fun testPersistentListOfCallWithLocalInferredStableTypeIsStable() =
+        assertStability(
+            "",
+            "class Foo",
+            "kotlinx.collections.immutable.persistentListOf(Foo())",
+            "Stable"
+        )
 
     @Test
-    fun testPersistentListOfCallWithExternalInferredStableTypeIsRuntimeStable() = assertStability(
-        "class Foo",
-        "",
-        "kotlinx.collections.immutable.persistentListOf(Foo())",
-        "Runtime(Foo)"
-    )
+    fun testPersistentListOfCallWithExternalInferredStableTypeIsRuntimeStable() =
+        assertStability(
+            "class Foo",
+            "",
+            "kotlinx.collections.immutable.persistentListOf(Foo())",
+            "Runtime(Foo)"
+        )
 
     @Test
-    fun testPersistentMapOfCallWithPrimitiveTypesIsStable() = assertStability(
-        "",
-        "",
-        "kotlinx.collections.immutable.persistentMapOf(1 to 1)",
-        "Stable,Stable"
-    )
+    fun testPersistentMapOfCallWithPrimitiveTypesIsStable() =
+        assertStability(
+            "",
+            "",
+            "kotlinx.collections.immutable.persistentMapOf(1 to 1)",
+            "Stable,Stable"
+        )
 
     @Test
-    fun testPersistentMapOfCallWithStableTypeIsStable() = assertStability(
-        "",
-        """
+    fun testPersistentMapOfCallWithStableTypeIsStable() =
+        assertStability(
+            "",
+            """
             class A
             class B
         """,
-        "kotlinx.collections.immutable.persistentMapOf(A() to B())",
-        "Stable,Stable"
-    )
+            "kotlinx.collections.immutable.persistentMapOf(A() to B())",
+            "Stable,Stable"
+        )
 
     @Test
-    fun testPersistentMapOfCallWithExternalInferredStableTypeIsRuntimeStable() = assertStability(
-        """
+    fun testPersistentMapOfCallWithExternalInferredStableTypeIsRuntimeStable() =
+        assertStability(
+            """
             class A
             class B
         """,
-        "",
-        "kotlinx.collections.immutable.persistentMapOf(A() to B())",
-        "Runtime(A),Runtime(B)"
-    )
+            "",
+            "kotlinx.collections.immutable.persistentMapOf(A() to B())",
+            "Runtime(A),Runtime(B)"
+        )
 
     @Test
-    fun testPersistentSetOfCallWithPrimitiveTypesIsStable() = assertStability(
-        "",
-        "",
-        "kotlinx.collections.immutable.persistentSetOf(1)",
-        "Stable"
-    )
+    fun testPersistentSetOfCallWithPrimitiveTypesIsStable() =
+        assertStability("", "", "kotlinx.collections.immutable.persistentSetOf(1)", "Stable")
 
     @Test
-    fun testPersistentSetOfCallWithStableTypeIsStable() = assertStability(
-        "",
-        """
+    fun testPersistentSetOfCallWithStableTypeIsStable() =
+        assertStability(
+            "",
+            """
             class A
         """,
-        "kotlinx.collections.immutable.persistentSetOf(A())",
-        "Stable"
-    )
+            "kotlinx.collections.immutable.persistentSetOf(A())",
+            "Stable"
+        )
 
     @Test
-    fun testPersistentSetOfCallWithExternalInferredStableTypeIsRuntimeStable() = assertStability(
-        """
+    fun testPersistentSetOfCallWithExternalInferredStableTypeIsRuntimeStable() =
+        assertStability(
+            """
             class A
         """,
-        "",
-        "kotlinx.collections.immutable.persistentSetOf(A())",
-        "Runtime(A)"
-    )
+            "",
+            "kotlinx.collections.immutable.persistentSetOf(A())",
+            "Runtime(A)"
+        )
 
     // b/327643787
     @Test
-    fun testNestedExternalTypesAreStable() = assertStability(
-        externalSrc = "",
-        localSrc = """
+    fun testNestedExternalTypesAreStable() =
+        assertStability(
+            externalSrc = "",
+            localSrc =
+                """
             data class B(val list: List<Int>)
             data class A(val list: List<B>)
-        """.trimIndent(),
-        expression = "A(listOf())",
-        externalTypes = setOf("kotlin.collections.List"),
-        stability = "Stable"
-    )
-
-    @Test
-    fun testNestedGenericsAreRuntimeStable() = assertStability(
-        externalSrc = "",
-        localSrc = """
-            class A(val child: List<A>?)
-        """.trimIndent(),
-        expression = "A(null)",
-        externalTypes = setOf("kotlin.collections.List"),
-        stability = "Unstable"
-    )
-
-    @Test
-    fun testNestedEqualTypesAreUnstable() = assertStability(
-        externalSrc = "",
-        localSrc = """
-            class A(val child: A?)
-        """.trimIndent(),
-        expression = "A(A(null))",
-        stability = "Unstable"
-    )
-
-    @Test
-    fun testEmptyClass() = assertTransform(
         """
+                    .trimIndent(),
+            expression = "A(listOf())",
+            externalTypes = setOf("kotlin.collections.List"),
+            stability = "Stable"
+        )
+
+    @Test
+    fun testNestedGenericsAreRuntimeStable() =
+        assertStability(
+            externalSrc = "",
+            localSrc =
+                """
+            class A(val child: List<A>?)
+        """
+                    .trimIndent(),
+            expression = "A(null)",
+            externalTypes = setOf("kotlin.collections.List"),
+            stability = "Unstable"
+        )
+
+    @Test
+    fun testNestedEqualTypesAreUnstable() =
+        assertStability(
+            externalSrc = "",
+            localSrc =
+                """
+            class A(val child: A?)
+        """
+                    .trimIndent(),
+            expression = "A(A(null))",
+            stability = "Unstable"
+        )
+
+    @Test
+    fun testEmptyClass() =
+        assertTransform(
+            """
             class Foo
         """
-    )
+        )
 
     @Test
-    fun testStabilityTransformOfVariousTypes() = assertTransform(
-        """
+    fun testStabilityTransformOfVariousTypes() =
+        assertTransform(
+            """
             import androidx.compose.runtime.Stable
             import kotlin.reflect.KProperty
 
@@ -1175,11 +1232,12 @@
                 var p1 by UnstableDelegate()
             }
         """
-    )
+        )
 
     @Test
-    fun testStabilityPropagationOfVariousTypes() = verifyGoldenCrossModuleComposeIrTransform(
-        """
+    fun testStabilityPropagationOfVariousTypes() =
+        verifyGoldenCrossModuleComposeIrTransform(
+            """
             package a
             import androidx.compose.runtime.Stable
             import kotlin.reflect.KProperty
@@ -1230,7 +1288,7 @@
             }
             fun used(x: Any?) {}
         """,
-        """
+            """
             import a.*
             import androidx.compose.runtime.Composable
 
@@ -1256,11 +1314,12 @@
                 A(UnstableDelegateProp())
             }
         """
-    )
+        )
 
     @Test
-    fun testStabilityPropagationTooManyTypeParams() = verifyGoldenCrossModuleComposeIrTransform(
-        """
+    fun testStabilityPropagationTooManyTypeParams() =
+        verifyGoldenCrossModuleComposeIrTransform(
+            """
             package a
 
             class Foo<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30, T31, T32, T33>(
@@ -1300,7 +1359,7 @@
             )
             fun used(any: Any? = null) {}
         """,
-        """
+            """
             import a.*
             import androidx.compose.runtime.Composable
 
@@ -1346,11 +1405,12 @@
                 )
             }
         """
-    )
+        )
 
     @Test
-    fun testStabilityPropagationTooManyTypeParamsSameModule() = verifyGoldenComposeIrTransform(
-        """
+    fun testStabilityPropagationTooManyTypeParamsSameModule() =
+        verifyGoldenComposeIrTransform(
+            """
             package a
 
             import androidx.compose.runtime.Composable
@@ -1434,7 +1494,7 @@
                 )
             }
         """
-    )
+        )
 
     @Test
     fun testStabilityPropagationOfVariousTypesInSameModule() =
@@ -1507,8 +1567,9 @@
         )
 
     @Test
-    fun testEmptyClassAcrossModules() = verifyGoldenCrossModuleComposeIrTransform(
-        """
+    fun testEmptyClassAcrossModules() =
+        verifyGoldenCrossModuleComposeIrTransform(
+            """
             package a
             class Wrapper<T>(value: T) {
               fun make(): T = error("")
@@ -1516,7 +1577,7 @@
             class Foo
             fun used(x: Any?) {}
         """,
-        """
+            """
             import a.*
             import androidx.compose.runtime.Composable
 
@@ -1525,7 +1586,7 @@
                 A(Wrapper(Foo()))
             }
         """
-    )
+        )
 
     @Test
     fun testLocalParameterBasedTypeParameterSubstitution() =
@@ -1553,19 +1614,21 @@
                 }
             }
         """
-    )
+        )
 
     @Test
-    fun testSingleVarVersusValProperty() = assertTransform(
-        """
+    fun testSingleVarVersusValProperty() =
+        assertTransform(
+            """
             class Stable(val bar: Int)
             class Unstable(var bar: Int)
         """
-    )
+        )
 
     @Test
-    fun testComposableCall() = assertTransform(
-        """
+    fun testComposableCall() =
+        assertTransform(
+            """
             import androidx.compose.runtime.Composable
 
             class Foo
@@ -1577,11 +1640,12 @@
                 used(x)
             }
         """
-    )
+        )
 
     @Test
-    fun testComposableCallWithUnstableFinalClassInSameModule() = assertTransform(
-        """
+    fun testComposableCallWithUnstableFinalClassInSameModule() =
+        assertTransform(
+            """
             import androidx.compose.runtime.Composable
 
             class Foo(var bar: Int = 0)
@@ -1593,7 +1657,7 @@
                 used(x)
             }
         """
-    )
+        )
 
     @Test
     fun testTransformInternalClasses() {
@@ -1607,12 +1671,12 @@
     }
 
     private fun assertStability(
-        @Language("kotlin")
-        classDefSrc: String,
+        @Language("kotlin") classDefSrc: String,
         stability: String,
         externalTypes: Set<String> = emptySet(),
     ) {
-        val source = """
+        val source =
+            """
             import androidx.compose.runtime.mutableStateOf
             import androidx.compose.runtime.getValue
             import androidx.compose.runtime.setValue
@@ -1624,63 +1688,64 @@
             $classDefSrc
 
             class Unstable { var value: Int = 0 }
-        """.trimIndent()
+        """
+                .trimIndent()
 
         val files = listOf(SourceFile("Test.kt", source))
-        val irModule = compileToIr(files, registerExtensions = {
-            it.put(ComposeConfiguration.TEST_STABILITY_CONFIG_KEY, externalTypes)
-        })
+        val irModule =
+            compileToIr(
+                files,
+                registerExtensions = {
+                    it.put(ComposeConfiguration.TEST_STABILITY_CONFIG_KEY, externalTypes)
+                }
+            )
         val irClass = irModule.files.last().declarations.first() as IrClass
         val externalTypeMatchers = externalTypes.map { FqNameMatcher(it) }.toSet()
         val stabilityInferencer = StabilityInferencer(irModule.descriptor, externalTypeMatchers)
         val classStability = stabilityInferencer.stabilityOf(irClass.defaultType as IrType)
 
-        assertEquals(
-            stability,
-            classStability.toString()
-        )
+        assertEquals(stability, classStability.toString())
     }
 
     private fun assertStability(
-        @Language("kotlin")
-        externalSrc: String,
-        @Language("kotlin")
-        classDefSrc: String,
+        @Language("kotlin") externalSrc: String,
+        @Language("kotlin") classDefSrc: String,
         stability: String,
         dumpClasses: Boolean = false,
         externalTypes: Set<String> = emptySet(),
         packageName: String = "dependency"
     ) {
-        val irModule = buildModule(
-            externalSrc,
-            classDefSrc,
-            dumpClasses,
-            packageName,
-            externalTypes = externalTypes
-        )
+        val irModule =
+            buildModule(
+                externalSrc,
+                classDefSrc,
+                dumpClasses,
+                packageName,
+                externalTypes = externalTypes
+            )
         val irClass = irModule.files.last().declarations.first() as IrClass
         val externalTypeMatchers = externalTypes.map { FqNameMatcher(it) }.toSet()
         val classStability =
             StabilityInferencer(irModule.descriptor, externalTypeMatchers)
                 .stabilityOf(irClass.defaultType as IrType)
 
-        assertEquals(
-            stability,
-            classStability.toString()
-        )
+        assertEquals(stability, classStability.toString())
     }
 
     @Test
     fun testTransformCombinedClassWithUnstableParametrizedClass() {
         verifyCrossModuleComposeIrTransform(
-            dependencySource = """
+            dependencySource =
+                """
                 class SomeFoo(val value: Int)
                 class ParametrizedFoo<K>(var value: K)
             """,
-            source = """
+            source =
+                """
                 class CombinedUnstable<T>(val first: T, val second: ParametrizedFoo<SomeFoo>)
             """,
-            expectedTransformed = """
+            expectedTransformed =
+                """
                 @StabilityInferred(parameters = 1)
                 class CombinedUnstable<T> (val first: T, val second: ParametrizedFoo<SomeFoo>) {
                   static val %stable: Int = ParametrizedFoo.%stable
@@ -1692,14 +1757,17 @@
     @Test
     fun testTransformCombinedClassWithRuntimeStableParametrizedClass() {
         verifyCrossModuleComposeIrTransform(
-            dependencySource = """
+            dependencySource =
+                """
             class SomeFoo(val value: Int)
             class ParametrizedFoo<K>(val value: K)
         """,
-            source = """
+            source =
+                """
             class CombinedStable<T>(val first: T, val second: ParametrizedFoo<SomeFoo>)
         """,
-            expectedTransformed = """
+            expectedTransformed =
+                """
             @StabilityInferred(parameters = 1)
             class CombinedStable<T> (val first: T, val second: ParametrizedFoo<SomeFoo>) {
               static val %stable: Int = SomeFoo.%stable or ParametrizedFoo.%stable
@@ -1711,14 +1779,17 @@
     @Test
     fun testTransformCombinedClassWithMultiplyTypeParameters() {
         verifyCrossModuleComposeIrTransform(
-            dependencySource = """
+            dependencySource =
+                """
             class SomeFoo(val value: Int)
             class ParametrizedFoo<K>(val value: K)
         """,
-            source = """
+            source =
+                """
             class CombinedStable<T, K>(val first: T, val second: ParametrizedFoo<K>)
         """,
-            expectedTransformed = """
+            expectedTransformed =
+                """
             @StabilityInferred(parameters = 3)
             class CombinedStable<T, K> (val first: T, val second: ParametrizedFoo<K>) {
               static val %stable: Int = ParametrizedFoo.%stable
@@ -1735,50 +1806,47 @@
         dumpClasses: Boolean = false,
         externalTypes: Set<String> = emptySet()
     ) {
-        val irModule = buildModule(
-            externalSrc,
-            """
+        val irModule =
+            buildModule(
+                externalSrc,
+                """
                 $localSrc
 
                 fun TestFunction() = $expression
-            """.trimIndent(),
-            dumpClasses,
-            externalTypes = externalTypes
-        )
-        val irTestFn = irModule
-            .files
-            .last()
-            .declarations
-            .filterIsInstance<IrSimpleFunction>()
-            .first { it.name.asString() == "TestFunction" }
+            """
+                    .trimIndent(),
+                dumpClasses,
+                externalTypes = externalTypes
+            )
+        val irTestFn =
+            irModule.files.last().declarations.filterIsInstance<IrSimpleFunction>().first {
+                it.name.asString() == "TestFunction"
+            }
 
         val lastStatement = irTestFn.body!!.statements.last()
-        val irExpr = when (lastStatement) {
-            is IrReturn -> lastStatement.value
-            is IrExpression -> lastStatement
-            else -> error("unexpected statement: $lastStatement")
-        }
+        val irExpr =
+            when (lastStatement) {
+                is IrReturn -> lastStatement.value
+                is IrExpression -> lastStatement
+                else -> error("unexpected statement: $lastStatement")
+            }
         val externalTypeMatchers = externalTypes.map { FqNameMatcher(it) }.toSet()
         val exprStability =
             StabilityInferencer(irModule.descriptor, externalTypeMatchers).stabilityOf(irExpr)
 
-        assertEquals(
-            stability,
-            exprStability.toString()
-        )
+        assertEquals(stability, exprStability.toString())
     }
 
     private fun buildModule(
-        @Language("kotlin")
-        externalSrc: String,
-        @Language("kotlin")
-        localSrc: String,
+        @Language("kotlin") externalSrc: String,
+        @Language("kotlin") localSrc: String,
         dumpClasses: Boolean = false,
         packageName: String = "dependency",
         externalTypes: Set<String>
     ): IrModuleFragment {
         val dependencyFileName = "Test_REPLACEME_${uniqueNumber++}"
-        val dependencySrc = """
+        val dependencySrc =
+            """
             package $packageName
             import androidx.compose.runtime.mutableStateOf
             import androidx.compose.runtime.getValue
@@ -1791,17 +1859,17 @@
             class UnusedClassToEnsurePackageGetsGenerated
 
             $externalSrc
-        """.trimIndent()
+        """
+                .trimIndent()
 
-        classLoader(dependencySrc, dependencyFileName, dumpClasses)
-            .allGeneratedFiles
-            .also {
-                // Write the files to the class directory so they can be used by the next module
-                // and the application
-                it.writeToDir(classesDirectory.root)
-            }
+        classLoader(dependencySrc, dependencyFileName, dumpClasses).allGeneratedFiles.also {
+            // Write the files to the class directory so they can be used by the next module
+            // and the application
+            it.writeToDir(classesDirectory.root)
+        }
 
-        val source = """
+        val source =
+            """
             import $packageName.*
             import androidx.compose.runtime.mutableStateOf
             import androidx.compose.runtime.getValue
@@ -1812,26 +1880,31 @@
             import kotlin.reflect.KProperty
 
             $localSrc
-        """.trimIndent()
+        """
+                .trimIndent()
 
         val files = listOf(SourceFile("Test.kt", source))
-        return compileToIr(files, listOf(classesDirectory.root), registerExtensions = {
-            it.put(ComposeConfiguration.TEST_STABILITY_CONFIG_KEY, externalTypes)
-            it.updateConfiguration()
-        })
+        return compileToIr(
+            files,
+            listOf(classesDirectory.root),
+            registerExtensions = {
+                it.put(ComposeConfiguration.TEST_STABILITY_CONFIG_KEY, externalTypes)
+                it.updateConfiguration()
+            }
+        )
     }
 
     private fun assertTransform(
-        @Language("kotlin")
-        checked: String,
+        @Language("kotlin") checked: String,
         unchecked: String = "",
         dumpTree: Boolean = false
-    ) = verifyGoldenComposeIrTransform(
-        checked,
-        """
+    ) =
+        verifyGoldenComposeIrTransform(
+            checked,
+            """
             $unchecked
             fun used(x: Any?) {}
         """,
-        dumpTree = dumpTree
-    )
+            dumpTree = dumpTree
+        )
 }
diff --git a/compose/compiler/compiler-hosted/integration-tests/src/jvmTest/kotlin/androidx/compose/compiler/plugins/kotlin/CodegenMetadataTests.kt b/compose/compiler/compiler-hosted/integration-tests/src/jvmTest/kotlin/androidx/compose/compiler/plugins/kotlin/CodegenMetadataTests.kt
index 4c66774..6ccdf53 100644
--- a/compose/compiler/compiler-hosted/integration-tests/src/jvmTest/kotlin/androidx/compose/compiler/plugins/kotlin/CodegenMetadataTests.kt
+++ b/compose/compiler/compiler-hosted/integration-tests/src/jvmTest/kotlin/androidx/compose/compiler/plugins/kotlin/CodegenMetadataTests.kt
@@ -29,16 +29,17 @@
     fun testBasicFunctionality() {
         val className = "Test_${uniqueNumber++}"
         val fileName = "$className.kt"
-        val loader = classLoader(
-            """
+        val loader =
+            classLoader(
+                """
             import kotlin.reflect.full.primaryConstructor
             import kotlin.reflect.jvm.isAccessible
             data class MyClass(val someBoolean: Boolean? = false)
             object Main { @JvmStatic fun main() { MyClass::class.java.kotlin.primaryConstructor!!.isAccessible = true } }
             """,
-            fileName,
-            false
-        )
+                fileName,
+                false
+            )
         val main = loader.loadClass("Main").methods.single { it.name == "main" }
         main.invoke(null)
     }
@@ -47,8 +48,9 @@
     fun testDelegatedProperties() {
         val className = "Test_${uniqueNumber++}"
         val fileName = "$className.kt"
-        val loader = classLoader(
-            """
+        val loader =
+            classLoader(
+                """
             import androidx.compose.runtime.Composable
             import kotlin.reflect.KProperty
             import kotlinx.metadata.jvm.KotlinClassMetadata
@@ -84,9 +86,9 @@
                 }
             }
             """,
-            fileName,
-            false
-        )
+                fileName,
+                false
+            )
         val main = loader.loadClass("Main").methods.single { it.name == "main" }
         val delegates = main.invoke(null)
 
diff --git a/compose/compiler/compiler-hosted/integration-tests/src/jvmTest/kotlin/androidx/compose/compiler/plugins/kotlin/ComposeBytecodeCodegenTest.kt b/compose/compiler/compiler-hosted/integration-tests/src/jvmTest/kotlin/androidx/compose/compiler/plugins/kotlin/ComposeBytecodeCodegenTest.kt
index 62534ea..27f1995 100644
--- a/compose/compiler/compiler-hosted/integration-tests/src/jvmTest/kotlin/androidx/compose/compiler/plugins/kotlin/ComposeBytecodeCodegenTest.kt
+++ b/compose/compiler/compiler-hosted/integration-tests/src/jvmTest/kotlin/androidx/compose/compiler/plugins/kotlin/ComposeBytecodeCodegenTest.kt
@@ -512,8 +512,9 @@
     }
 
     @Test
-    fun testRecursiveLocalFunction() = validateBytecode(
-        """
+    fun testRecursiveLocalFunction() =
+        validateBytecode(
+            """
             import androidx.compose.runtime.*
 
             @Composable fun Surface(content: @Composable () -> Unit) {}
@@ -526,18 +527,19 @@
                 }
             }
         """,
-        validate = {
-            assertFalse(
-                it.contains("ComposableSingletons"),
-                message = "ComposableSingletons class should not be generated"
-            )
-        }
-    )
+            validate = {
+                assertFalse(
+                    it.contains("ComposableSingletons"),
+                    message = "ComposableSingletons class should not be generated"
+                )
+            }
+        )
 
     // regression test for https://youtrack.jetbrains.com/issue/KT-65791
     @Test
-    fun testCrossinlineCapture() = testCompile(
-        """
+    fun testCrossinlineCapture() =
+        testCompile(
+            """
             import androidx.compose.runtime.*
 
             @Composable
@@ -570,7 +572,7 @@
                 )
             }
         """
-    )
+        )
 
     @Test
     fun composeValueClassDefaultParameter() =
@@ -587,15 +589,15 @@
             """,
             validate = {
                 // select Example function body
-                val func = Regex("public final static Example[\\s\\S]*?LOCALVARIABLE")
-                    .findAll(it)
-                    .single()
+                val func =
+                    Regex("public final static Example[\\s\\S]*?LOCALVARIABLE").findAll(it).single()
                 assertFalse(message = "Function body should not contain a not-null check.") {
                     func.value.contains("Intrinsics.checkNotNullParameter")
                 }
-                val stub = Regex("public final static synthetic Example[\\s\\S]*?LOCALVARIABLE")
-                    .findAll(it)
-                    .single()
+                val stub =
+                    Regex("public final static synthetic Example[\\s\\S]*?LOCALVARIABLE")
+                        .findAll(it)
+                        .single()
                 assertTrue(message = "Function stub should contain a not-null check.") {
                     stub.value.contains("Intrinsics.checkNotNullParameter")
                 }
@@ -603,8 +605,10 @@
         )
 
     @Test // regression test for 336571300
-    fun test_groupAroundIfComposeCallInIfConditionWithShortCircuit() = testCompile(
-        source = """
+    fun test_groupAroundIfComposeCallInIfConditionWithShortCircuit() =
+        testCompile(
+            source =
+                """
             import androidx.compose.runtime.*
 
             @Composable
@@ -620,11 +624,12 @@
             @Composable
             fun ReceiveValue(value: Int) { }
         """
-    )
+        )
 
     @Test
-    fun testDefaultParametersInVirtualFunctions() = validateBytecode(
-        """
+    fun testDefaultParametersInVirtualFunctions() =
+        validateBytecode(
+            """
             import androidx.compose.runtime.*
 
             interface Test {
@@ -646,13 +651,13 @@
                 test.bar(0)
             }
         """,
-        validate = {
-            assertTrue(
-                it.contains(
-                    "INVOKESTATIC test/Test%ComposeDefaultImpls.foo%default (ILtest/Test;Landroidx/compose/runtime/Composer;II)V"
-                ),
-                "default static functions should be generated in ComposeDefaultsImpl class"
-            )
-        }
-    )
+            validate = {
+                assertTrue(
+                    it.contains(
+                        "INVOKESTATIC test/Test%ComposeDefaultImpls.foo%default (ILtest/Test;Landroidx/compose/runtime/Composer;II)V"
+                    ),
+                    "default static functions should be generated in ComposeDefaultsImpl class"
+                )
+            }
+        )
 }
diff --git a/compose/compiler/compiler-hosted/integration-tests/src/jvmTest/kotlin/androidx/compose/compiler/plugins/kotlin/ComposeCallLoweringTests.kt b/compose/compiler/compiler-hosted/integration-tests/src/jvmTest/kotlin/androidx/compose/compiler/plugins/kotlin/ComposeCallLoweringTests.kt
index e1e4dd3..64151b3 100644
--- a/compose/compiler/compiler-hosted/integration-tests/src/jvmTest/kotlin/androidx/compose/compiler/plugins/kotlin/ComposeCallLoweringTests.kt
+++ b/compose/compiler/compiler-hosted/integration-tests/src/jvmTest/kotlin/androidx/compose/compiler/plugins/kotlin/ComposeCallLoweringTests.kt
@@ -259,7 +259,8 @@
 
         @Composable
         fun Bar() {}
-            """.trimIndent()
+            """
+                .trimIndent()
         )
     }
 
@@ -282,7 +283,8 @@
                 content()
             }
         }
-            """.trimIndent()
+            """
+                .trimIndent()
         )
     }
 
diff --git a/compose/compiler/compiler-hosted/integration-tests/src/jvmTest/kotlin/androidx/compose/compiler/plugins/kotlin/ComposeCallResolverTests.kt b/compose/compiler/compiler-hosted/integration-tests/src/jvmTest/kotlin/androidx/compose/compiler/plugins/kotlin/ComposeCallResolverTests.kt
index 77dc7a3..b6f392f 100644
--- a/compose/compiler/compiler-hosted/integration-tests/src/jvmTest/kotlin/androidx/compose/compiler/plugins/kotlin/ComposeCallResolverTests.kt
+++ b/compose/compiler/compiler-hosted/integration-tests/src/jvmTest/kotlin/androidx/compose/compiler/plugins/kotlin/ComposeCallResolverTests.kt
@@ -34,8 +34,9 @@
 @RunWith(JUnit4::class)
 class ComposeCallResolverTests : AbstractCodegenTest(useFir = false) {
     @Test
-    fun testProperties() = assertInterceptions(
-        """
+    fun testProperties() =
+        assertInterceptions(
+            """
             import androidx.compose.runtime.*
 
             val foo @Composable get() = 123
@@ -54,11 +55,12 @@
                 a.<call>bam
             }
         """
-    )
+        )
 
     @Test
-    fun testBasicCallTypes() = assertInterceptions(
-        """
+    fun testBasicCallTypes() =
+        assertInterceptions(
+            """
             import androidx.compose.runtime.*
             import android.widget.TextView
 
@@ -72,11 +74,12 @@
                 <normal>Bar()
             }
         """
-    )
+        )
 
     @Test
-    fun testReceiverScopeCall() = assertInterceptions(
-        """
+    fun testReceiverScopeCall() =
+        assertInterceptions(
+            """
             import androidx.compose.runtime.*
 
             @Composable fun Int.Foo() {}
@@ -91,11 +94,12 @@
                 }
             }
         """
-    )
+        )
 
     @Test
-    fun testInvokeOperatorCall() = assertInterceptions(
-        """
+    fun testInvokeOperatorCall() =
+        assertInterceptions(
+            """
             import androidx.compose.runtime.*
 
             @Composable operator fun Int.invoke(y: Int) {}
@@ -106,11 +110,12 @@
                 <call>x(y=10)
             }
         """
-    )
+        )
 
     @Test
-    fun testComposableLambdaCall() = assertInterceptions(
-        """
+    fun testComposableLambdaCall() =
+        assertInterceptions(
+            """
             import androidx.compose.runtime.*
 
             @Composable
@@ -118,11 +123,12 @@
                 <call>content()
             }
         """
-    )
+        )
 
     @Test
-    fun testComposableLambdaCallWithGenerics() = assertInterceptions(
-        """
+    fun testComposableLambdaCallWithGenerics() =
+        assertInterceptions(
+            """
             import androidx.compose.runtime.*
 
             @Composable fun <T> A(value: T, block: @Composable (T) -> Unit) {
@@ -146,11 +152,12 @@
                 }
             }
         """
-    )
+        )
 
     // TODO(chuckj): Replace with another nested function call.
-    fun xtestMethodInvocations() = assertInterceptions(
-        """
+    fun xtestMethodInvocations() =
+        assertInterceptions(
+            """
             import androidx.compose.runtime.*
 
             val x = CompositionLocal.of<Int> { 123 }
@@ -162,11 +169,12 @@
                 }
             }
         """
-    )
+        )
 
     @Test
-    fun testReceiverLambdaInvocation() = assertInterceptions(
-        """
+    fun testReceiverLambdaInvocation() =
+        assertInterceptions(
+            """
             import androidx.compose.runtime.*
 
             class TextSpanScope
@@ -180,11 +188,12 @@
                 }
             }
         """
-    )
+        )
 
     @Test
-    fun testReceiverLambda2() = assertInterceptions(
-        """
+    fun testReceiverLambda2() =
+        assertInterceptions(
+            """
             import androidx.compose.runtime.*
 
             class DensityScope(val density: Density)
@@ -201,11 +210,12 @@
                 DensityScope(compositionLocalDensity()).<call>block()
             }
         """
-    )
+        )
 
     @Test
-    fun testInlineContent() = assertInterceptions(
-        """
+    fun testInlineContent() =
+        assertInterceptions(
+            """
             import androidx.compose.runtime.*
             import android.widget.LinearLayout
 
@@ -221,7 +231,7 @@
                 }
             }
         """
-    )
+        )
 
     private fun assertInterceptions(srcText: String) {
         val (text, carets) = extractCarets(srcText)
@@ -231,11 +241,12 @@
         val ktFile = analysisResult.files.single()
 
         carets.forEachIndexed { index, (offset, calltype) ->
-            val resolvedCall = ktFile.findElementAt(offset)?.getNearestResolvedCall(bindingContext)
-                ?: error(
-                    "No resolved call found at index: $index, offset: $offset. Expected " +
-                        "$calltype."
-                )
+            val resolvedCall =
+                ktFile.findElementAt(offset)?.getNearestResolvedCall(bindingContext)
+                    ?: error(
+                        "No resolved call found at index: $index, offset: $offset. Expected " +
+                            "$calltype."
+                    )
 
             when (calltype) {
                 "<normal>" -> assert(!resolvedCall.isComposableInvocation())
@@ -246,14 +257,16 @@
     }
 
     private val callPattern = Regex("(<normal>)|(<call>)")
+
     private fun extractCarets(text: String): Pair<String, List<Pair<Int, String>>> {
         val indices = mutableListOf<Pair<Int, String>>()
         var offset = 0
-        val src = callPattern.replace(text) {
-            indices.add(it.range.first - offset to it.value)
-            offset += it.range.last - it.range.first + 1
-            ""
-        }
+        val src =
+            callPattern.replace(text) {
+                indices.add(it.range.first - offset to it.value)
+                offset += it.range.last - it.range.first + 1
+                ""
+            }
         return src to indices
     }
 }
diff --git a/compose/compiler/compiler-hosted/integration-tests/src/jvmTest/kotlin/androidx/compose/compiler/plugins/kotlin/ComposeCrossModuleTests.kt b/compose/compiler/compiler-hosted/integration-tests/src/jvmTest/kotlin/androidx/compose/compiler/plugins/kotlin/ComposeCrossModuleTests.kt
index 8e95869..ddb4cf7 100644
--- a/compose/compiler/compiler-hosted/integration-tests/src/jvmTest/kotlin/androidx/compose/compiler/plugins/kotlin/ComposeCrossModuleTests.kt
+++ b/compose/compiler/compiler-hosted/integration-tests/src/jvmTest/kotlin/androidx/compose/compiler/plugins/kotlin/ComposeCrossModuleTests.kt
@@ -38,8 +38,10 @@
     fun testInlineFunctionDefaultArgument() {
         compile(
             mapOf(
-                "library module" to mapOf(
-                    "x/library.kt" to """
+                "library module" to
+                    mapOf(
+                        "x/library.kt" to
+                            """
                     package x
 
                     import androidx.compose.runtime.Composable
@@ -48,10 +50,13 @@
                     inline fun f(x: () -> Unit = { println("default") }) {
                       x()
                     }
-                    """.trimIndent()
-                ),
-                "Main" to mapOf(
-                    "y/User.kt" to """
+                    """
+                                .trimIndent()
+                    ),
+                "Main" to
+                    mapOf(
+                        "y/User.kt" to
+                            """
                     package y
 
                     import x.f
@@ -63,8 +68,9 @@
                         println("non-default")
                       }
                     }
-                    """.trimIndent()
-                )
+                    """
+                                .trimIndent()
+                    )
             )
         )
     }
@@ -73,8 +79,10 @@
     fun testInlineFunctionDefaultArgument2() {
         compile(
             mapOf(
-                "library module" to mapOf(
-                    "x/library.kt" to """
+                "library module" to
+                    mapOf(
+                        "x/library.kt" to
+                            """
                     package x
 
                     import androidx.compose.runtime.Composable
@@ -83,10 +91,13 @@
                     inline fun f(x: () -> Unit = { println("default") }) {
                       x()
                     }
-                    """.trimIndent()
-                ),
-                "Main" to mapOf(
-                    "y/User.kt" to """
+                    """
+                                .trimIndent()
+                    ),
+                "Main" to
+                    mapOf(
+                        "y/User.kt" to
+                            """
                     package y
 
                     import x.f
@@ -96,8 +107,9 @@
                     fun g() {
                       f()
                     }
-                    """.trimIndent()
-                )
+                    """
+                                .trimIndent()
+                    )
             )
         )
     }
@@ -106,8 +118,10 @@
     fun testAccessibilityBridgeGeneration() {
         compile(
             mapOf(
-                "library module" to mapOf(
-                    "x/I.kt" to """
+                "library module" to
+                    mapOf(
+                        "x/I.kt" to
+                            """
                       package x
 
                       import androidx.compose.runtime.Composable
@@ -115,10 +129,13 @@
                       @Composable fun bar(arg: @Composable () -> Unit) {
                           arg()
                       }
-                    """.trimIndent()
-                ),
-                "Main" to mapOf(
-                    "y/User.kt" to """
+                    """
+                                .trimIndent()
+                    ),
+                "Main" to
+                    mapOf(
+                        "y/User.kt" to
+                            """
                       package y
 
                       import x.bar
@@ -130,8 +147,9 @@
                           }
                       }
                       @Composable private fun foo() { }
-                    """.trimIndent()
-                )
+                    """
+                                .trimIndent()
+                    )
             )
         ) {
             // Check that there is only one method declaration for access$foo.
@@ -139,12 +157,11 @@
             // to multiple identical methods in the output.
             // In the dump, $ is mapped to %.
             val declaration = "synthetic access%foo"
-            val occurrences = it.windowed(declaration.length) { candidate ->
-                if (candidate == declaration)
-                    1
-                else
-                    0
-            }.sum()
+            val occurrences =
+                it.windowed(declaration.length) { candidate ->
+                        if (candidate == declaration) 1 else 0
+                    }
+                    .sum()
             assert(occurrences == 1)
         }
     }
@@ -153,23 +170,29 @@
     fun testInlineClassCrossModule() {
         compile(
             mapOf(
-                "library module" to mapOf(
-                    "x/I.kt" to """
+                "library module" to
+                    mapOf(
+                        "x/I.kt" to
+                            """
                       package x
                       inline class I(val i: Int) {
                         val prop
                           get() = i + 1
                       }
-                    """.trimIndent()
-                ),
-                "Main" to mapOf(
-                    "y/User.kt" to """
+                    """
+                                .trimIndent()
+                    ),
+                "Main" to
+                    mapOf(
+                        "y/User.kt" to
+                            """
                       package y
                       import x.I
                       inline class J(val j: Int)
                       fun foo(): Int = I(42).i + J(23).j + I(1).prop
-                    """.trimIndent()
-                )
+                    """
+                                .trimIndent()
+                    )
             )
         ) {
             // If the output contains getI-impl, the cross-module inline class
@@ -189,16 +212,21 @@
     fun testNonComposableWithComposableReturnTypeCrossModule() {
         compile(
             mapOf(
-                "library module" to mapOf(
-                    "x/MakeComposable.kt" to """
+                "library module" to
+                    mapOf(
+                        "x/MakeComposable.kt" to
+                            """
                       package x
                       import androidx.compose.runtime.Composable
 
                       fun makeComposable(): @Composable () -> Unit = @Composable {}
-                    """.trimIndent()
-                ),
-                "Main" to mapOf(
-                    "y/User.kt" to """
+                    """
+                                .trimIndent()
+                    ),
+                "Main" to
+                    mapOf(
+                        "y/User.kt" to
+                            """
                       package y
                       import x.makeComposable
                       import androidx.compose.runtime.Composable
@@ -210,8 +238,9 @@
                       fun test() {
                         acceptComposable(makeComposable())
                       }
-                    """.trimIndent()
-                )
+                    """
+                                .trimIndent()
+                    )
             ),
         ) {
             assert(
@@ -219,12 +248,12 @@
             )
             assert(
                 !it.contains(
-                "INVOKESTATIC x/MakeComposableKt.makeComposable ()Lkotlin/jvm/functions/Function0;"
+                    "INVOKESTATIC x/MakeComposableKt.makeComposable ()Lkotlin/jvm/functions/Function0;"
                 )
             )
             assert(
                 it.contains(
-                "INVOKESTATIC x/MakeComposableKt.makeComposable ()Lkotlin/jvm/functions/Function2;"
+                    "INVOKESTATIC x/MakeComposableKt.makeComposable ()Lkotlin/jvm/functions/Function2;"
                 )
             )
         }
@@ -234,16 +263,21 @@
     fun testNonComposableWithNestedComposableReturnTypeCrossModule() {
         compile(
             mapOf(
-                "library module" to mapOf(
-                    "x/MakeComposable.kt" to """
+                "library module" to
+                    mapOf(
+                        "x/MakeComposable.kt" to
+                            """
                       package x
                       import androidx.compose.runtime.Composable
 
                       fun makeComposable(): List<@Composable () -> Unit> = listOf(@Composable {})
-                    """.trimIndent()
-                ),
-                "Main" to mapOf(
-                    "y/User.kt" to """
+                    """
+                                .trimIndent()
+                    ),
+                "Main" to
+                    mapOf(
+                        "y/User.kt" to
+                            """
                       package y
                       import x.makeComposable
                       import androidx.compose.runtime.Composable
@@ -255,13 +289,12 @@
                       fun test() {
                         acceptComposable(makeComposable().single())
                       }
-                    """.trimIndent()
-                )
+                    """
+                                .trimIndent()
+                    )
             ),
         ) {
-            assert(
-                it.contains("INVOKESTATIC x/MakeComposableKt.makeComposable ()Ljava/util/List;")
-            )
+            assert(it.contains("INVOKESTATIC x/MakeComposableKt.makeComposable ()Ljava/util/List;"))
             assert(!it.contains("CHECKCAST kotlin/jvm/functions/Function0"))
             assert(it.contains("CHECKCAST kotlin/jvm/functions/Function2"))
         }
@@ -271,8 +304,10 @@
     fun testInlineClassOverloading() {
         compile(
             mapOf(
-                "library module" to mapOf(
-                    "x/A.kt" to """
+                "library module" to
+                    mapOf(
+                        "x/A.kt" to
+                            """
                         package x
 
                         import androidx.compose.runtime.Composable
@@ -282,10 +317,13 @@
 
                         @Composable fun foo(i: I) { }
                         @Composable fun foo(j: J) { }
-                    """.trimIndent()
-                ),
-                "Main" to mapOf(
-                    "y/B.kt" to """
+                    """
+                                .trimIndent()
+                    ),
+                "Main" to
+                    mapOf(
+                        "y/B.kt" to
+                            """
                         package y
 
                         import androidx.compose.runtime.Composable
@@ -296,7 +334,7 @@
                             foo(J(k))
                         }
                     """
-                )
+                    )
             )
         ) {
             // Check that the composable functions were properly mangled
@@ -320,25 +358,30 @@
     fun testFunInterfaceWithInlineClass() {
         compile(
             mapOf(
-                "library module" to mapOf(
-                    "x/A.kt" to """
+                "library module" to
+                    mapOf(
+                        "x/A.kt" to
+                            """
                         package x
 
                         inline class A(val value: Int)
                         fun interface B {
                           fun method(a: A)
                         }
-                    """.trimIndent()
-                ),
-                "Main" to mapOf(
-                    "y/B.kt" to """
+                    """
+                                .trimIndent()
+                    ),
+                "Main" to
+                    mapOf(
+                        "y/B.kt" to
+                            """
                         package y
 
                         import x.*
 
                         val b = B { }
                     """
-                )
+                    )
             )
         ) {
             assert(it.contains("public abstract method-C8LvVsQ(I)V"))
@@ -351,8 +394,10 @@
     fun testParentNotInitializedBug() {
         compile(
             mapOf(
-                "library module" to mapOf(
-                    "x/Base.kt" to """
+                "library module" to
+                    mapOf(
+                        "x/Base.kt" to
+                            """
                     package x
 
                     import androidx.compose.runtime.Composable
@@ -363,9 +408,11 @@
                         @Composable abstract fun content(a: Foo)
                     }
                  """
-                ),
-                "Main" to mapOf(
-                    "b/Extends.kt" to """
+                    ),
+                "Main" to
+                    mapOf(
+                        "b/Extends.kt" to
+                            """
                     package b
 
                     import androidx.compose.runtime.Composable
@@ -378,7 +425,7 @@
                         }
                     }
                 """
-                )
+                    )
             )
         )
     }
@@ -387,15 +434,19 @@
     fun testConstCrossModule() {
         compile(
             mapOf(
-                "library module" to mapOf(
-                    "x/A.kt" to """
+                "library module" to
+                    mapOf(
+                        "x/A.kt" to
+                            """
                     package x
 
                     const val MyConstant: String = ""
                  """
-                ),
-                "Main" to mapOf(
-                    "b/B.kt" to """
+                    ),
+                "Main" to
+                    mapOf(
+                        "b/B.kt" to
+                            """
                     package b
 
                     import x.MyConstant
@@ -404,7 +455,7 @@
                         print(foo)
                     }
                 """
-                )
+                    )
             )
         ) {
             assert(it.contains("LDC \"\""))
@@ -416,8 +467,10 @@
     fun testNonCrossinlineComposable() {
         compile(
             mapOf(
-                "library module" to mapOf(
-                    "x/A.kt" to """
+                "library module" to
+                    mapOf(
+                        "x/A.kt" to
+                            """
                     package x
 
                     import androidx.compose.runtime.Composable
@@ -427,9 +480,11 @@
                         block: @Composable () -> T
                     ): T = block()
                  """
-                ),
-                "Main" to mapOf(
-                    "b/B.kt" to """
+                    ),
+                "Main" to
+                    mapOf(
+                        "b/B.kt" to
+                            """
                     package b
 
                     import androidx.compose.runtime.Composable
@@ -439,7 +494,7 @@
                         key { }
                     }
                 """
-                )
+                    )
             )
         )
     }
@@ -448,8 +503,10 @@
     fun testNonCrossinlineComposableNoGenerics() {
         compile(
             mapOf(
-                "library module" to mapOf(
-                    "x/A.kt" to """
+                "library module" to
+                    mapOf(
+                        "x/A.kt" to
+                            """
                     package x
 
                     import androidx.compose.runtime.Composable
@@ -461,9 +518,11 @@
                         block: @Composable () -> Int
                     ): Int = block()
                  """
-                ),
-                "Main" to mapOf(
-                    "b/B.kt" to """
+                    ),
+                "Main" to
+                    mapOf(
+                        "b/B.kt" to
+                            """
                     package b
 
                     import androidx.compose.runtime.Composable
@@ -473,7 +532,7 @@
                         key(123) { 456 }
                     }
                 """
-                )
+                    )
             )
         )
     }
@@ -482,8 +541,10 @@
     fun testRemappedTypes() {
         compile(
             mapOf(
-                "library module" to mapOf(
-                    "x/A.kt" to """
+                "library module" to
+                    mapOf(
+                        "x/A.kt" to
+                            """
                     package x
 
                     class A {
@@ -493,9 +554,11 @@
                         }
                     }
                  """
-                ),
-                "Main" to mapOf(
-                    "b/B.kt" to """
+                    ),
+                "Main" to
+                    mapOf(
+                        "b/B.kt" to
+                            """
                     package b
 
                     import x.A
@@ -509,7 +572,7 @@
                         }
                     }
                 """
-                )
+                    )
             )
         )
     }
@@ -518,27 +581,33 @@
     fun testInlineIssue() {
         compile(
             mapOf(
-                "library module" to mapOf(
-                    "x/C.kt" to """
+                "library module" to
+                    mapOf(
+                        "x/C.kt" to
+                            """
                     fun ghi() {
                         abc {}
                     }
                     """,
-                    "x/A.kt" to """
+                        "x/A.kt" to
+                            """
                     inline fun abc(fn: () -> Unit) {
                         fn()
                     }
                     """,
-                    "x/B.kt" to """
+                        "x/B.kt" to
+                            """
                     fun def() {
                         abc {}
                     }
                     """
-                ),
-                "Main" to mapOf(
-                    "b/B.kt" to """
+                    ),
+                "Main" to
+                    mapOf(
+                        "b/B.kt" to
+                            """
                 """
-                )
+                    )
             )
         )
     }
@@ -547,8 +616,10 @@
     fun testInlineComposableProperty() {
         compile(
             mapOf(
-                "library module" to mapOf(
-                    "x/A.kt" to """
+                "library module" to
+                    mapOf(
+                        "x/A.kt" to
+                            """
                     package x
 
                     import androidx.compose.runtime.Composable
@@ -557,9 +628,11 @@
                       val value: Int @Composable get() = 123
                     }
                  """
-                ),
-                "Main" to mapOf(
-                    "b/B.kt" to """
+                    ),
+                "Main" to
+                    mapOf(
+                        "b/B.kt" to
+                            """
                     package b
 
                     import androidx.compose.runtime.Composable
@@ -571,7 +644,7 @@
                         print(foo.value)
                     }
                 """
-                )
+                    )
             )
         )
     }
@@ -580,8 +653,10 @@
     fun testNestedInlineIssue() {
         compile(
             mapOf(
-                "library module" to mapOf(
-                    "x/C.kt" to """
+                "library module" to
+                    mapOf(
+                        "x/C.kt" to
+                            """
                     fun ghi() {
                         abc {
                             abc {
@@ -590,12 +665,14 @@
                         }
                     }
                     """,
-                    "x/A.kt" to """
+                        "x/A.kt" to
+                            """
                     inline fun abc(fn: () -> Unit) {
                         fn()
                     }
                     """,
-                    "x/B.kt" to """
+                        "x/B.kt" to
+                            """
                     fun def() {
                         abc {
                             abc {
@@ -604,11 +681,13 @@
                         }
                     }
                     """
-                ),
-                "Main" to mapOf(
-                    "b/B.kt" to """
+                    ),
+                "Main" to
+                    mapOf(
+                        "b/B.kt" to
+                            """
                 """
-                )
+                    )
             )
         )
     }
@@ -617,8 +696,10 @@
     fun testComposerIntrinsicInline() {
         compile(
             mapOf(
-                "library module" to mapOf(
-                    "x/C.kt" to """
+                "library module" to
+                    mapOf(
+                        "x/C.kt" to
+                            """
                     import androidx.compose.runtime.Composable
 
                     @Composable
@@ -627,7 +708,8 @@
                         print(x)
                     }
                     """,
-                    "x/A.kt" to """
+                        "x/A.kt" to
+                            """
                     import androidx.compose.runtime.Composable
                     import androidx.compose.runtime.currentComposer
 
@@ -636,7 +718,8 @@
                         return currentComposer
                     }
                     """,
-                    "x/B.kt" to """
+                        "x/B.kt" to
+                            """
                     import androidx.compose.runtime.Composable
 
                     @Composable
@@ -645,11 +728,13 @@
                         print(x)
                     }
                     """
-                ),
-                "Main" to mapOf(
-                    "b/B.kt" to """
+                    ),
+                "Main" to
+                    mapOf(
+                        "b/B.kt" to
+                            """
                 """
-                )
+                    )
             )
         )
     }
@@ -658,8 +743,10 @@
     fun testComposableOrderIssue() {
         compile(
             mapOf(
-                "library module" to mapOf(
-                    "C.kt" to """
+                "library module" to
+                    mapOf(
+                        "C.kt" to
+                            """
                     import androidx.compose.runtime.*
 
                     @Composable
@@ -667,7 +754,8 @@
                         a()
                     }
                     """,
-                    "A.kt" to """
+                        "A.kt" to
+                            """
                     import androidx.compose.runtime.*
 
                     @Composable
@@ -675,7 +763,8 @@
 
                     }
                     """,
-                    "B.kt" to """
+                        "B.kt" to
+                            """
                     import androidx.compose.runtime.*
 
                     @Composable
@@ -684,11 +773,13 @@
                     }
 
                     """
-                ),
-                "Main" to mapOf(
-                    "b/B.kt" to """
+                    ),
+                "Main" to
+                    mapOf(
+                        "b/B.kt" to
+                            """
                 """
-                )
+                    )
             )
         )
     }
@@ -697,8 +788,10 @@
     fun testSimpleXModuleCall() {
         compile(
             mapOf(
-                "library module" to mapOf(
-                    "a/A.kt" to """
+                "library module" to
+                    mapOf(
+                        "a/A.kt" to
+                            """
                     package a
 
                     import androidx.compose.runtime.*
@@ -706,9 +799,11 @@
                     @Composable
                     fun FromA() {}
                  """
-                ),
-                "Main" to mapOf(
-                    "b/B.kt" to """
+                    ),
+                "Main" to
+                    mapOf(
+                        "b/B.kt" to
+                            """
                     package b
 
                     import a.FromA
@@ -719,7 +814,7 @@
                         FromA()
                     }
                 """
-                )
+                    )
             )
         )
     }
@@ -728,27 +823,33 @@
     fun testJvmFieldIssue() {
         compile(
             mapOf(
-                "library module" to mapOf(
-                    "x/C.kt" to """
+                "library module" to
+                    mapOf(
+                        "x/C.kt" to
+                            """
                     fun Test2() {
                       bar = 10
                       print(bar)
                     }
                     """,
-                    "x/A.kt" to """
+                        "x/A.kt" to
+                            """
                       @JvmField var bar: Int = 0
                     """,
-                    "x/B.kt" to """
+                        "x/B.kt" to
+                            """
                     fun Test() {
                       bar = 10
                       print(bar)
                     }
                     """
-                ),
-                "Main" to mapOf(
-                    "b/B.kt" to """
+                    ),
+                "Main" to
+                    mapOf(
+                        "b/B.kt" to
+                            """
                 """
-                )
+                    )
             )
         )
     }
@@ -757,8 +858,10 @@
     fun testInstanceXModuleCall() {
         compile(
             mapOf(
-                "library module" to mapOf(
-                    "a/Foo.kt" to """
+                "library module" to
+                    mapOf(
+                        "a/Foo.kt" to
+                            """
                     package a
 
                     import androidx.compose.runtime.*
@@ -768,9 +871,11 @@
                         fun FromA() {}
                     }
                  """
-                ),
-                "Main" to mapOf(
-                    "B.kt" to """
+                    ),
+                "Main" to
+                    mapOf(
+                        "B.kt" to
+                            """
                     import a.Foo
                     import androidx.compose.runtime.*
 
@@ -779,7 +884,7 @@
                         Foo().FromA()
                     }
                 """
-                )
+                    )
             )
         )
     }
@@ -788,17 +893,21 @@
     fun testXModuleProperty() {
         compile(
             mapOf(
-                "library module" to mapOf(
-                    "a/Foo.kt" to """
+                "library module" to
+                    mapOf(
+                        "a/Foo.kt" to
+                            """
                     package a
 
                     import androidx.compose.runtime.*
 
                     val foo: Int @Composable get() { return 123 }
                  """
-                ),
-                "Main" to mapOf(
-                    "B.kt" to """
+                    ),
+                "Main" to
+                    mapOf(
+                        "B.kt" to
+                            """
                     import a.foo
                     import androidx.compose.runtime.*
 
@@ -807,7 +916,7 @@
                         foo
                     }
                 """
-                )
+                    )
             )
         )
     }
@@ -816,8 +925,10 @@
     fun testXModuleInterface() {
         compile(
             mapOf(
-                "library module" to mapOf(
-                    "a/Foo.kt" to """
+                "library module" to
+                    mapOf(
+                        "a/Foo.kt" to
+                            """
                     package a
 
                     import androidx.compose.runtime.*
@@ -826,9 +937,11 @@
                         @Composable fun foo()
                     }
                  """
-                ),
-                "Main" to mapOf(
-                    "B.kt" to """
+                    ),
+                "Main" to
+                    mapOf(
+                        "B.kt" to
+                            """
                     import a.Foo
                     import androidx.compose.runtime.*
 
@@ -841,7 +954,7 @@
                         inst.foo()
                     }
                 """
-                )
+                    )
             )
         )
     }
@@ -850,8 +963,10 @@
     fun testXModuleComposableProperty() {
         compile(
             mapOf(
-                "library module" to mapOf(
-                    "a/Foo.kt" to """
+                "library module" to
+                    mapOf(
+                        "a/Foo.kt" to
+                            """
                     package a
 
                     import androidx.compose.runtime.*
@@ -859,9 +974,11 @@
                     val foo: () -> Unit
                         @Composable get() = {}
                  """
-                ),
-                "Main" to mapOf(
-                    "B.kt" to """
+                    ),
+                "Main" to
+                    mapOf(
+                        "B.kt" to
+                            """
                     import a.foo
                     import androidx.compose.runtime.*
 
@@ -870,7 +987,7 @@
                         bar()
                     }
                 """
-                )
+                    )
             )
         )
     }
@@ -879,17 +996,21 @@
     fun testXModuleCtorComposableParam() {
         compile(
             mapOf(
-                "library module" to mapOf(
-                    "a/Foo.kt" to """
+                "library module" to
+                    mapOf(
+                        "a/Foo.kt" to
+                            """
                     package a
 
                     import androidx.compose.runtime.*
 
                     class Foo(val bar: @Composable () -> Unit)
                  """
-                ),
-                "Main" to mapOf(
-                    "B.kt" to """
+                    ),
+                "Main" to
+                    mapOf(
+                        "B.kt" to
+                            """
                     import a.Foo
                     import androidx.compose.runtime.*
 
@@ -897,20 +1018,20 @@
                         val foo = Foo(bar)
                     }
                 """
-                )
+                    )
             )
         )
     }
 
-    /**
-     * Test for b/169071070
-     */
+    /** Test for b/169071070 */
     @Test
     fun testCrossModule_ComposableInterfaceFunctionWithInlineClasses() {
         compile(
             mapOf(
-                "library module" to mapOf(
-                    "x/Library.kt" to """
+                "library module" to
+                    mapOf(
+                        "x/Library.kt" to
+                            """
                     package x
 
                     import androidx.compose.runtime.Composable
@@ -921,10 +1042,13 @@
                         @Composable
                         fun apply(value: InlineClass)
                     }
-                    """.trimIndent()
-                ),
-                "Main" to mapOf(
-                    "y/Impl.kt" to """
+                    """
+                                .trimIndent()
+                    ),
+                "Main" to
+                    mapOf(
+                        "y/Impl.kt" to
+                            """
                     package y
 
                     import androidx.compose.runtime.Composable
@@ -935,8 +1059,9 @@
                         @Composable
                         override fun apply(value: InlineClass) {}
                     }
-                    """.trimIndent()
-                )
+                    """
+                                .trimIndent()
+                    )
             )
         )
     }
@@ -945,8 +1070,10 @@
     fun testAnnotationInferenceAcrossModules() {
         compile(
             mapOf(
-                "Base" to mapOf(
-                    "base/Library.kt" to """
+                "Base" to
+                    mapOf(
+                        "base/Library.kt" to
+                            """
                     package base
 
                     import androidx.compose.runtime.*
@@ -961,9 +1088,11 @@
                       content()
                     }
                     """
-                ),
-                "Client" to mapOf(
-                    "client/Library.kt" to """
+                    ),
+                "Client" to
+                    mapOf(
+                        "client/Library.kt" to
+                            """
                     package client
 
                     import androidx.compose.runtime.*
@@ -975,9 +1104,11 @@
                       Row { content() }
                     }
                     """
-                ),
-                "Main" to mapOf(
-                    "Main.kt" to """
+                    ),
+                "Main" to
+                    mapOf(
+                        "Main.kt" to
+                            """
                     package main
 
                     import androidx.compose.runtime.*
@@ -988,7 +1119,7 @@
                       Labeled("test") { }
                     }
                     """
-                )
+                    )
             )
         ) {
             assert(it.contains("[UI[UI]]", false)) {
@@ -997,15 +1128,15 @@
         }
     }
 
-    /**
-     * Test for b/221280935
-     */
+    /** Test for b/221280935 */
     @Test
     fun testOverriddenSymbolParentsInDefaultParameters() {
         compile(
             mapOf(
-                "Base" to mapOf(
-                    "base/Base.kt" to """
+                "Base" to
+                    mapOf(
+                        "base/Base.kt" to
+                            """
                     package base
 
                     import androidx.compose.runtime.Composable
@@ -1014,9 +1145,11 @@
                       fun f(block: (@Composable () -> Unit)? = null) {}
                     }
                     """
-                ),
-                "Main" to mapOf(
-                    "Main.kt" to """
+                    ),
+                "Main" to
+                    mapOf(
+                        "Main.kt" to
+                            """
                     package main
 
                     import androidx.compose.runtime.Composable
@@ -1026,7 +1159,7 @@
                       init { f {} }
                     }
                     """
-                )
+                    )
             )
         )
     }
@@ -1035,8 +1168,10 @@
     fun testComposableFunctionProperty() {
         compile(
             mapOf(
-                "Base" to mapOf(
-                    "base/Base.kt" to """
+                "Base" to
+                    mapOf(
+                        "base/Base.kt" to
+                            """
                     package base
 
                     import androidx.compose.runtime.Composable
@@ -1045,9 +1180,11 @@
                         val content: @Composable () -> Unit
                     )
                     """
-                ),
-                "Main" to mapOf(
-                    "Main.kt" to """
+                    ),
+                "Main" to
+                    mapOf(
+                        "Main.kt" to
+                            """
                     package main
 
                     import androidx.compose.runtime.Composable
@@ -1063,12 +1200,12 @@
                         a.content()
                     }
                     """
-                )
+                    )
             ),
             validate = {
                 assertFalse(
-                   it.contains("setContent"),
-                   message = "Property getter was resolved to a setter name"
+                    it.contains("setContent"),
+                    message = "Property getter was resolved to a setter name"
                 )
                 assertFalse(
                     it.contains("Lkotlin/jvm/functions/Function0"),
@@ -1082,8 +1219,10 @@
     fun testFunctionInterfaceReturningComposable() {
         compile(
             mapOf(
-                "Base" to mapOf(
-                    "base/Base.kt" to """
+                "Base" to
+                    mapOf(
+                        "base/Base.kt" to
+                            """
                     package base
 
                     import androidx.compose.runtime.Composable
@@ -1092,9 +1231,11 @@
                         fun getContent(b: @Composable () -> Unit): @Composable () -> Unit
                     }
                     """
-                ),
-                "Main" to mapOf(
-                    "Main.kt" to """
+                    ),
+                "Main" to
+                    mapOf(
+                        "Main.kt" to
+                            """
                     package main
 
                     import base.Base
@@ -1107,16 +1248,13 @@
                        funInterfaceReturnComposable.getContent {}
                     }
                     """
-                )
+                    )
             ),
             validate = {
                 val indyExpr = Regex("INVOKEDYNAMIC.*?\\[([\\w\\W]*?)]").find(it)
                 val indyParams = indyExpr?.groupValues?.first()
 
-                assertTrue(
-                    "Could not find INVOKEDYNAMIC call",
-                    indyParams != null
-                )
+                assertTrue("Could not find INVOKEDYNAMIC call", indyParams != null)
                 assertEquals(
                     indyParams!!.lines().joinToString("\n") { it.trimEnd() },
                     """
@@ -1129,7 +1267,8 @@
                               main/MainKt.funInterfaceReturnComposable%lambda%0(Lkotlin/jvm/functions/Function2;)Lkotlin/jvm/functions/Function2;,
                               (Lkotlin/jvm/functions/Function2;)Lkotlin/jvm/functions/Function2;
                             ]
-                    """.trimIndent()
+                    """
+                        .trimIndent()
                 )
             },
         )
@@ -1144,9 +1283,12 @@
     fun testCompatibilityK1andK2() {
         compile(
             flipLibraryFirSetting = true,
-            modules = mapOf(
-                "Base" to mapOf(
-                    "base/Base.kt" to """
+            modules =
+                mapOf(
+                    "Base" to
+                        mapOf(
+                            "base/Base.kt" to
+                                """
                     package base
 
                     import androidx.compose.runtime.Composable
@@ -1156,9 +1298,11 @@
                       body()
                     }
                     """
-                ),
-                "Main" to mapOf(
-                    "Main.kt" to """
+                        ),
+                    "Main" to
+                        mapOf(
+                            "Main.kt" to
+                                """
                     package main
 
                     import androidx.compose.runtime.Composable
@@ -1170,8 +1314,8 @@
                       }
                     }
                     """
+                        )
                 )
-            )
         )
     }
 
@@ -1180,8 +1324,10 @@
     fun callingFakeOverriddenFunctionFromAnotherModule() {
         compile(
             mapOf(
-                "Base" to mapOf(
-                    "base/Base.kt" to """
+                "Base" to
+                    mapOf(
+                        "base/Base.kt" to
+                            """
                     package base
 
                     import androidx.compose.runtime.Composable
@@ -1190,9 +1336,11 @@
                         fun runTest(content: @Composable () -> Unit) {}
                     }
                     """
-                ),
-                "Intermediate" to mapOf(
-                    "intermediate/Intermediate.kt" to """
+                    ),
+                "Intermediate" to
+                    mapOf(
+                        "intermediate/Intermediate.kt" to
+                            """
                     package intermediate
 
                     import androidx.compose.runtime.Composable
@@ -1200,9 +1348,11 @@
 
                     open class DeviceTest : Test()
                     """
-                ),
-                "Main" to mapOf(
-                    "Main.kt" to """
+                    ),
+                "Main" to
+                    mapOf(
+                        "Main.kt" to
+                            """
                     package main
 
                     import intermediate.DeviceTest
@@ -1213,7 +1363,7 @@
                         }
                     }
                     """
-                )
+                    )
             ),
             validate = {
                 assertFalse(
@@ -1228,8 +1378,10 @@
     fun defaultParametersInFakeOverrideVirtualComposableFunctions() {
         compile(
             mapOf(
-                "Base" to mapOf(
-                    "base/Base.kt" to """
+                "Base" to
+                    mapOf(
+                        "base/Base.kt" to
+                            """
                     package base
 
                     import androidx.compose.runtime.Composable
@@ -1239,9 +1391,11 @@
                         open fun runTest(content: @Composable () -> Unit = {}) {}
                     }
                     """
-                ),
-                "Intermediate" to mapOf(
-                    "intermediate/Intermediate.kt" to """
+                    ),
+                "Intermediate" to
+                    mapOf(
+                        "intermediate/Intermediate.kt" to
+                            """
                     package intermediate
 
                     import androidx.compose.runtime.Composable
@@ -1251,9 +1405,11 @@
                         @Composable open fun DeviceTest(content: @Composable () -> Unit = {}) = content()
                     }
                     """
-                ),
-                "Main" to mapOf(
-                    "Main.kt" to """
+                    ),
+                "Main" to
+                    mapOf(
+                        "Main.kt" to
+                            """
                     package main
 
                     import base.Test
@@ -1273,7 +1429,7 @@
                         }
                     }
                     """
-                )
+                    )
             )
         )
     }
@@ -1284,31 +1440,37 @@
         flipLibraryFirSetting: Boolean = false, // compiles deps with k2 for k1 test and vice versa
         validate: ((String) -> Unit)? = null
     ): List<OutputFile> {
-        val libraryClasses = modules.filter { it.key != "Main" }.flatMap {
-            classLoader(
-                it.value,
-                listOf(classesDirectory.root),
-                dumpClasses,
-                if (flipLibraryFirSetting) !useFir else useFir
-            ).allGeneratedFiles.also { outputFiles ->
-                // Write the files to the class directory so they can be used by the next module
-                // and the application
-                outputFiles.writeToDir(classesDirectory.root)
-            }
-        }
+        val libraryClasses =
+            modules
+                .filter { it.key != "Main" }
+                .flatMap {
+                    classLoader(
+                            it.value,
+                            listOf(classesDirectory.root),
+                            dumpClasses,
+                            if (flipLibraryFirSetting) !useFir else useFir
+                        )
+                        .allGeneratedFiles
+                        .also { outputFiles ->
+                            // Write the files to the class directory so they can be used by the
+                            // next module
+                            // and the application
+                            outputFiles.writeToDir(classesDirectory.root)
+                        }
+                }
 
         // compile the next one
-        val appClasses = classLoader(
-            modules["Main"]
-                ?: error("No Main module specified"),
-            listOf(classesDirectory.root),
-            dumpClasses
-        ).allGeneratedFiles
+        val appClasses =
+            classLoader(
+                    modules["Main"] ?: error("No Main module specified"),
+                    listOf(classesDirectory.root),
+                    dumpClasses
+                )
+                .allGeneratedFiles
 
         // Load the files looking for mainClassName
-        val outputFiles = (libraryClasses + appClasses).filter {
-            it.relativePath.endsWith(".class")
-        }
+        val outputFiles =
+            (libraryClasses + appClasses).filter { it.relativePath.endsWith(".class") }
 
         if (validate != null) {
             validate(outputFiles.joinToString("\n") { it.asText().replace('$', '%') })
@@ -1317,7 +1479,5 @@
         return outputFiles
     }
 
-    @JvmField
-    @Rule
-    val classesDirectory = TemporaryFolder()
+    @JvmField @Rule val classesDirectory = TemporaryFolder()
 }
diff --git a/compose/compiler/compiler-hosted/integration-tests/src/jvmTest/kotlin/androidx/compose/compiler/plugins/kotlin/ComposeModuleMetricsTests.kt b/compose/compiler/compiler-hosted/integration-tests/src/jvmTest/kotlin/androidx/compose/compiler/plugins/kotlin/ComposeModuleMetricsTests.kt
index a409059..818c29d 100644
--- a/compose/compiler/compiler-hosted/integration-tests/src/jvmTest/kotlin/androidx/compose/compiler/plugins/kotlin/ComposeModuleMetricsTests.kt
+++ b/compose/compiler/compiler-hosted/integration-tests/src/jvmTest/kotlin/androidx/compose/compiler/plugins/kotlin/ComposeModuleMetricsTests.kt
@@ -22,19 +22,17 @@
 class ComposeModuleMetricsTests(useFir: Boolean) : AbstractMetricsTransformTest(useFir) {
     override fun CompilerConfiguration.updateConfiguration() {
         // Tests in this file are about testing the output, so we want non-skippable composables
-        put(
-            ComposeConfiguration.FEATURE_FLAGS,
-            listOf(FeatureFlag.StrongSkipping.disabledName)
-        )
+        put(ComposeConfiguration.FEATURE_FLAGS, listOf(FeatureFlag.StrongSkipping.disabledName))
     }
 
     @Test
-    fun testStableAndUnstableClassesTxt() = assertClasses(
-        """
+    fun testStableAndUnstableClassesTxt() =
+        assertClasses(
+            """
             class Foo { var x: Int = 0 }
             class Bar(val x: Int = 0)
         """,
-        """
+            """
             unstable class Foo {
               stable var x: Int
               <runtime stability> = Unstable
@@ -44,11 +42,12 @@
               <runtime stability> = Stable
             }
         """
-    )
+        )
 
     @Test
-    fun testComposablesTxt() = assertComposables(
-        """
+    fun testComposablesTxt() =
+        assertComposables(
+            """
             import androidx.compose.runtime.*
 
             fun makeInt(): Int = 0
@@ -62,7 +61,7 @@
             @Composable fun E(e: Unstable) { used(e)}
             @Composable fun F(f: Unstable? = null) { used(f) }
         """,
-        """
+            """
             restartable skippable fun A()
             restartable skippable fun B(
               stable b: Int
@@ -80,11 +79,12 @@
               unstable f: Unstable? = @static null
             )
         """
-    )
+        )
 
     @Test
-    fun testComposablesCsv() = assertComposablesCsv(
-        """
+    fun testComposablesCsv() =
+        assertComposablesCsv(
+            """
             import androidx.compose.runtime.*
 
             fun makeInt(): Int = 0
@@ -98,7 +98,7 @@
             @Composable fun E(e: Unstable) { used(e)}
             @Composable fun F(f: Unstable? = null) { used(f) }
         """,
-        """
+            """
             package,name,composable,skippable,restartable,readonly,inline,isLambda,hasDefaults,defaultsGroup,groups,calls,
             A,A,1,1,1,0,0,0,0,0,1,0,
             B,B,1,1,1,0,0,0,0,0,1,0,
@@ -107,11 +107,12 @@
             E,E,1,0,1,0,0,0,0,0,1,0,
             F,F,1,1,1,0,0,0,0,0,1,0,
         """
-    )
+        )
 
     @Test
-    fun testModuleJson() = assertModuleJson(
-        """
+    fun testModuleJson() =
+        assertModuleJson(
+            """
             import androidx.compose.runtime.*
 
             @Composable fun A() {}
@@ -123,7 +124,7 @@
                 }
             }
         """,
-        """
+            """
             {
              "skippableComposables": 2,
              "restartableComposables": 2,
@@ -150,5 +151,5 @@
              "totalLambdas": 0
             }
         """
-    )
+        )
 }
diff --git a/compose/compiler/compiler-hosted/integration-tests/src/jvmTest/kotlin/androidx/compose/compiler/plugins/kotlin/ComposeMultiPlatformTests.kt b/compose/compiler/compiler-hosted/integration-tests/src/jvmTest/kotlin/androidx/compose/compiler/plugins/kotlin/ComposeMultiPlatformTests.kt
index c9b2e80..486840b 100644
--- a/compose/compiler/compiler-hosted/integration-tests/src/jvmTest/kotlin/androidx/compose/compiler/plugins/kotlin/ComposeMultiPlatformTests.kt
+++ b/compose/compiler/compiler-hosted/integration-tests/src/jvmTest/kotlin/androidx/compose/compiler/plugins/kotlin/ComposeMultiPlatformTests.kt
@@ -100,7 +100,8 @@
                   final static INNERCLASS JvmKt%One%1 null null
                   public final static One(ILandroidx/compose/runtime/Composer;II)V
                 }
-            """.trimIndent()
+            """
+                .trimIndent()
         )
     }
 }
diff --git a/compose/compiler/compiler-hosted/integration-tests/src/jvmTest/kotlin/androidx/compose/compiler/plugins/kotlin/ComposerParamSignatureTests.kt b/compose/compiler/compiler-hosted/integration-tests/src/jvmTest/kotlin/androidx/compose/compiler/plugins/kotlin/ComposerParamSignatureTests.kt
index 670830f..d977e73 100644
--- a/compose/compiler/compiler-hosted/integration-tests/src/jvmTest/kotlin/androidx/compose/compiler/plugins/kotlin/ComposerParamSignatureTests.kt
+++ b/compose/compiler/compiler-hosted/integration-tests/src/jvmTest/kotlin/androidx/compose/compiler/plugins/kotlin/ComposerParamSignatureTests.kt
@@ -23,43 +23,53 @@
 /* ktlint-disable max-line-length */
 class ComposerParamSignatureTests(useFir: Boolean) : AbstractCodegenSignatureTest(useFir) {
     @Test
-    fun testParameterlessChildrenLambdasReused() = checkApi(
-        """
+    fun testParameterlessChildrenLambdasReused() =
+        checkApi(
+            """
             @Composable fun Foo(content: @Composable () -> Unit) {
             }
             @Composable fun Bar() {
                 Foo {}
             }
         """
-    )
+        )
 
     @Test
-    fun testNoComposerNullCheck() = validateBytecode(
-        """
+    fun testNoComposerNullCheck() =
+        validateBytecode(
+            """
         @Composable fun Foo() {}
         """
-    ) {
-        assert(!it.contains("INVOKESTATIC kotlin/jvm/internal/Intrinsics.checkParameterIsNotNull"))
-    }
+        ) {
+            assert(
+                !it.contains("INVOKESTATIC kotlin/jvm/internal/Intrinsics.checkParameterIsNotNull")
+            )
+        }
 
     @Test
-    fun testComposableLambdaCall() = validateBytecode(
-        """
+    fun testComposableLambdaCall() =
+        validateBytecode(
+            """
             @Composable
             fun Foo(f: @Composable () -> Unit) {
               f()
             }
         """
-    ) {
-        // Calls to a composable lambda needs to invoke the `Function2.invoke` interface method
-        // taking two objects and *not* directly the `invoke` method that takes a Composer and
-        // an unboxed int.
-        assertTrue(it.contains("INVOKEINTERFACE kotlin/jvm/functions/Function2.invoke (Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; (itf)"))
-    }
+        ) {
+            // Calls to a composable lambda needs to invoke the `Function2.invoke` interface method
+            // taking two objects and *not* directly the `invoke` method that takes a Composer and
+            // an unboxed int.
+            assertTrue(
+                it.contains(
+                    "INVOKEINTERFACE kotlin/jvm/functions/Function2.invoke (Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; (itf)"
+                )
+            )
+        }
 
     @Test
-    fun testStrangeReceiverIssue() = codegen(
-        """
+    fun testStrangeReceiverIssue() =
+        codegen(
+            """
         import androidx.compose.runtime.ExplicitGroupsComposable
         import androidx.compose.runtime.NonRestartableComposable
         class Foo
@@ -82,24 +92,26 @@
             used(label)
         }
         """
-    )
+        )
 
     @Test
-    fun testArrayListSizeOverride() = validateBytecode(
-        """
+    fun testArrayListSizeOverride() =
+        validateBytecode(
+            """
         class CustomList : ArrayList<Any>() {
             override val size: Int
                 get() = super.size
         }
         """
-    ) {
-        assertTrue(it.contains("INVOKESPECIAL java/util/ArrayList.size ()I"))
-        assertFalse(it.contains("INVOKESPECIAL java/util/ArrayList.getSize ()I"))
-    }
+        ) {
+            assertTrue(it.contains("INVOKESPECIAL java/util/ArrayList.size ()I"))
+            assertFalse(it.contains("INVOKESPECIAL java/util/ArrayList.getSize ()I"))
+        }
 
     @Test
-    fun testForLoopIssue1() = codegen(
-        """
+    fun testForLoopIssue1() =
+        codegen(
+            """
             @Composable
             fun Test(text: String, callback: @Composable () -> Unit) {
                 for (char in text) {
@@ -110,28 +122,30 @@
                 }
             }
         """
-    )
+        )
 
     @Test
-    fun testConstantReturn() = validateBytecode(
-        """
+    fun testConstantReturn() =
+        validateBytecode(
+            """
             @Composable
             fun Test(): Int {
                 return 123 // line 12
             }
         """
-    ) {
-        val lines = it.split("\n").map { it.trim() }
-        val lineNumberIndex = lines.indexOfFirst { it.startsWith("LINENUMBER 12") }
-        // Line 12, which has the return statement, needs to be present in the bytecode
-        assert(lineNumberIndex >= 0)
-        // The return statement should be right after this
-        assert(lines[lineNumberIndex + 1] == "IRETURN")
-    }
+        ) {
+            val lines = it.split("\n").map { it.trim() }
+            val lineNumberIndex = lines.indexOfFirst { it.startsWith("LINENUMBER 12") }
+            // Line 12, which has the return statement, needs to be present in the bytecode
+            assert(lineNumberIndex >= 0)
+            // The return statement should be right after this
+            assert(lines[lineNumberIndex + 1] == "IRETURN")
+        }
 
     @Test
-    fun testForLoopIssue2() = codegen(
-        """
+    fun testForLoopIssue2() =
+        codegen(
+            """
             @Composable
             fun Test(text: List<String>, callback: @Composable () -> Unit) {
                 for ((i, value) in text.withIndex()) {
@@ -142,11 +156,12 @@
                 }
             }
         """
-    )
+        )
 
     @Test
-    fun testCaptureIssue23() = codegen(
-        """
+    fun testCaptureIssue23() =
+        codegen(
+            """
             import androidx.compose.animation.AnimatedContent
             import androidx.compose.animation.ExperimentalAnimationApi
             import androidx.compose.runtime.Composable
@@ -161,11 +176,12 @@
                 }
             }
         """
-    )
+        )
 
     @Test
-    fun test32Params() = codegen(
-        """
+    fun test32Params() =
+        codegen(
+            """
         @Composable
         fun <T> TooVerbose(
             v00: T, v01: T, v02: T, v03: T, v04: T, v05: T, v06: T, v07: T, v08: T, v09: T,
@@ -186,11 +202,12 @@
         }
 
         """
-    )
+        )
 
     @Test
-    fun testInterfaceMethodWithComposableParameter() = validateBytecode(
-        """
+    fun testInterfaceMethodWithComposableParameter() =
+        validateBytecode(
+            """
             @Composable
             fun test1(cc: ControlledComposition) {
                 cc.setContent {}
@@ -199,13 +216,18 @@
                 cc.setContent {}
             }
         """
-    ) {
-        assert(!it.contains("INVOKEINTERFACE androidx/compose/runtime/ControlledComposition.setContent (Lkotlin/jvm/functions/Function0;)V"))
-    }
+        ) {
+            assert(
+                !it.contains(
+                    "INVOKEINTERFACE androidx/compose/runtime/ControlledComposition.setContent (Lkotlin/jvm/functions/Function0;)V"
+                )
+            )
+        }
 
     @Test
-    fun testFakeOverrideFromSameModuleButLaterTraversal() = validateBytecode(
-        """
+    fun testFakeOverrideFromSameModuleButLaterTraversal() =
+        validateBytecode(
+            """
             class B : A() {
                 fun test() {
                     show {}
@@ -215,13 +237,18 @@
                 fun show(content: @Composable () -> Unit) {}
             }
         """
-    ) {
-        assert(!it.contains("INVOKEINTERFACE androidx/compose/runtime/ControlledComposition.setContent (Lkotlin/jvm/functions/Function0;)V"))
-    }
+        ) {
+            assert(
+                !it.contains(
+                    "INVOKEINTERFACE androidx/compose/runtime/ControlledComposition.setContent (Lkotlin/jvm/functions/Function0;)V"
+                )
+            )
+        }
 
     @Test
-    fun testPrimitiveChangedCalls() = validateBytecode(
-        """
+    fun testPrimitiveChangedCalls() =
+        validateBytecode(
+            """
         @Composable fun Foo(
             a: Boolean,
             b: Char,
@@ -242,21 +269,26 @@
             used(h)
         }
         """
-    ) {
-        assert(it.contains("INVOKEINTERFACE androidx/compose/runtime/Composer.changed (Z)Z"))
-        assert(it.contains("INVOKEINTERFACE androidx/compose/runtime/Composer.changed (C)Z"))
-        assert(it.contains("INVOKEINTERFACE androidx/compose/runtime/Composer.changed (B)Z"))
-        assert(it.contains("INVOKEINTERFACE androidx/compose/runtime/Composer.changed (S)Z"))
-        assert(it.contains("INVOKEINTERFACE androidx/compose/runtime/Composer.changed (I)Z"))
-        assert(it.contains("INVOKEINTERFACE androidx/compose/runtime/Composer.changed (F)Z"))
-        assert(it.contains("INVOKEINTERFACE androidx/compose/runtime/Composer.changed (J)Z"))
-        assert(it.contains("INVOKEINTERFACE androidx/compose/runtime/Composer.changed (D)Z"))
-        assert(!it.contains("INVOKEINTERFACE androidx/compose/runtime/Composer.changed (Ljava/lang/Object;)Z"))
-    }
+        ) {
+            assert(it.contains("INVOKEINTERFACE androidx/compose/runtime/Composer.changed (Z)Z"))
+            assert(it.contains("INVOKEINTERFACE androidx/compose/runtime/Composer.changed (C)Z"))
+            assert(it.contains("INVOKEINTERFACE androidx/compose/runtime/Composer.changed (B)Z"))
+            assert(it.contains("INVOKEINTERFACE androidx/compose/runtime/Composer.changed (S)Z"))
+            assert(it.contains("INVOKEINTERFACE androidx/compose/runtime/Composer.changed (I)Z"))
+            assert(it.contains("INVOKEINTERFACE androidx/compose/runtime/Composer.changed (F)Z"))
+            assert(it.contains("INVOKEINTERFACE androidx/compose/runtime/Composer.changed (J)Z"))
+            assert(it.contains("INVOKEINTERFACE androidx/compose/runtime/Composer.changed (D)Z"))
+            assert(
+                !it.contains(
+                    "INVOKEINTERFACE androidx/compose/runtime/Composer.changed (Ljava/lang/Object;)Z"
+                )
+            )
+        }
 
     @Test
-    fun testNonPrimitiveChangedCalls() = validateBytecode(
-        """
+    fun testNonPrimitiveChangedCalls() =
+        validateBytecode(
+            """
         import androidx.compose.runtime.Stable
 
         @Stable class Bar
@@ -264,87 +296,98 @@
             used(a)
         }
         """
-    ) {
-        assert(!it.contains("INVOKEINTERFACE androidx/compose/runtime/Composer.changed (Z)Z"))
-        assert(!it.contains("INVOKEINTERFACE androidx/compose/runtime/Composer.changed (C)Z"))
-        assert(!it.contains("INVOKEINTERFACE androidx/compose/runtime/Composer.changed (B)Z"))
-        assert(!it.contains("INVOKEINTERFACE androidx/compose/runtime/Composer.changed (S)Z"))
-        assert(!it.contains("INVOKEINTERFACE androidx/compose/runtime/Composer.changed (I)Z"))
-        assert(!it.contains("INVOKEINTERFACE androidx/compose/runtime/Composer.changed (F)Z"))
-        assert(!it.contains("INVOKEINTERFACE androidx/compose/runtime/Composer.changed (J)Z"))
-        assert(!it.contains("INVOKEINTERFACE androidx/compose/runtime/Composer.changed (D)Z"))
-        assert(it.contains("INVOKEINTERFACE androidx/compose/runtime/Composer.changed (Ljava/lang/Object;)Z"))
-    }
+        ) {
+            assert(!it.contains("INVOKEINTERFACE androidx/compose/runtime/Composer.changed (Z)Z"))
+            assert(!it.contains("INVOKEINTERFACE androidx/compose/runtime/Composer.changed (C)Z"))
+            assert(!it.contains("INVOKEINTERFACE androidx/compose/runtime/Composer.changed (B)Z"))
+            assert(!it.contains("INVOKEINTERFACE androidx/compose/runtime/Composer.changed (S)Z"))
+            assert(!it.contains("INVOKEINTERFACE androidx/compose/runtime/Composer.changed (I)Z"))
+            assert(!it.contains("INVOKEINTERFACE androidx/compose/runtime/Composer.changed (F)Z"))
+            assert(!it.contains("INVOKEINTERFACE androidx/compose/runtime/Composer.changed (J)Z"))
+            assert(!it.contains("INVOKEINTERFACE androidx/compose/runtime/Composer.changed (D)Z"))
+            assert(
+                it.contains(
+                    "INVOKEINTERFACE androidx/compose/runtime/Composer.changed (Ljava/lang/Object;)Z"
+                )
+            )
+        }
 
     @Test
-    fun testInlineClassChangedCalls() = validateBytecode(
-        """
+    fun testInlineClassChangedCalls() =
+        validateBytecode(
+            """
         inline class Bar(val value: Int)
         @Composable fun Foo(a: Bar) {
             used(a)
         }
         """
-    ) {
-        assert(!it.contains("INVOKESTATIC Bar.box-impl (I)LBar;"))
-        assert(it.contains("INVOKEINTERFACE androidx/compose/runtime/Composer.changed (I)Z"))
-        assert(
-            !it.contains("INVOKEINTERFACE androidx/compose/runtime/Composer.changed (Ljava/lang/Object;)Z")
-        )
-    }
+        ) {
+            assert(!it.contains("INVOKESTATIC Bar.box-impl (I)LBar;"))
+            assert(it.contains("INVOKEINTERFACE androidx/compose/runtime/Composer.changed (I)Z"))
+            assert(
+                !it.contains(
+                    "INVOKEINTERFACE androidx/compose/runtime/Composer.changed (Ljava/lang/Object;)Z"
+                )
+            )
+        }
 
     @Test
-    fun testNullableInlineClassChangedCalls() = validateBytecode(
-        """
+    fun testNullableInlineClassChangedCalls() =
+        validateBytecode(
+            """
         inline class Bar(val value: Int)
         @Composable fun Foo(a: Bar?) {
             used(a)
         }
         """
-    ) {
-        val testClass = it.split("public final class ").single { it.startsWith("test/TestKt") }
-        assert(
-            !testClass.contains(
-                "INVOKEVIRTUAL Bar.unbox-impl ()I"
+        ) {
+            val testClass = it.split("public final class ").single { it.startsWith("test/TestKt") }
+            assert(!testClass.contains("INVOKEVIRTUAL Bar.unbox-impl ()I"))
+            assert(
+                !testClass.contains("INVOKESTATIC java/lang/Integer.valueOf (I)Ljava/lang/Integer;")
             )
-        )
-        assert(
-            !testClass.contains(
-                "INVOKESTATIC java/lang/Integer.valueOf (I)Ljava/lang/Integer;"
+            assert(
+                testClass.contains(
+                    "INVOKEINTERFACE androidx/compose/runtime/Composer.changed (Ljava/lang/Object;)Z"
+                )
             )
-        )
-        assert(
-            testClass.contains(
-                "INVOKEINTERFACE androidx/compose/runtime/Composer.changed (Ljava/lang/Object;)Z"
-            )
-        )
-    }
+        }
 
     @Test
-    fun testNoNullCheckForPassedParameters() = validateBytecode(
-        """
+    fun testNoNullCheckForPassedParameters() =
+        validateBytecode(
+            """
         inline class Bar(val value: Int)
         fun nonNull(bar: Bar) {}
         @NonRestartableComposable @Composable fun Foo(bar: Bar = Bar(123)) {
             nonNull(bar)
         }
         """
-    ) {
-        assert(it.contains("public final static Foo-9N9I_pQ(ILandroidx/compose/runtime/Composer;II)V"))
-    }
+        ) {
+            assert(
+                it.contains(
+                    "public final static Foo-9N9I_pQ(ILandroidx/compose/runtime/Composer;II)V"
+                )
+            )
+        }
 
     @Test
-    fun testNoComposerNullCheck2() = validateBytecode(
-        """
+    fun testNoComposerNullCheck2() =
+        validateBytecode(
+            """
         val foo = @Composable {}
         val bar = @Composable { x: Int -> }
         """
-    ) {
-        assert(!it.contains("INVOKESTATIC kotlin/jvm/internal/Intrinsics.checkParameterIsNotNull"))
-    }
+        ) {
+            assert(
+                !it.contains("INVOKESTATIC kotlin/jvm/internal/Intrinsics.checkParameterIsNotNull")
+            )
+        }
 
     @Test
-    fun testComposableLambdaInvoke() = validateBytecode(
-        """
+    fun testComposableLambdaInvoke() =
+        validateBytecode(
+            """
         @Composable fun NonNull(content: @Composable() () -> Unit) {
             content.invoke()
         }
@@ -352,17 +395,18 @@
             content?.invoke()
         }
         """
-    ) {
-        assert(
-            !it.contains(
-                "INVOKEINTERFACE kotlin/jvm/functions/Function0.invoke ()Ljava/lang/Object; (itf)"
+        ) {
+            assert(
+                !it.contains(
+                    "INVOKEINTERFACE kotlin/jvm/functions/Function0.invoke ()Ljava/lang/Object; (itf)"
+                )
             )
-        )
-    }
+        }
 
     @Test
-    fun testAnonymousParamNaming() = validateBytecode(
-        """
+    fun testAnonymousParamNaming() =
+        validateBytecode(
+            """
         @Composable
         fun Foo(content: @Composable (a: Int, b: Int) -> Unit) {}
         @Composable
@@ -370,41 +414,45 @@
             Foo { _, _ -> }
         }
         """
-    ) {
-        assert(!it.contains("%anonymous parameter 0%"))
-    }
+        ) {
+            assert(!it.contains("%anonymous parameter 0%"))
+        }
 
     @Test
-    fun testBasicClassStaticTransform() = checkApi(
-        """
+    fun testBasicClassStaticTransform() =
+        checkApi(
+            """
             class Foo
         """,
-    )
+        )
 
     @Test
-    fun testLambdaReorderedParameter() = checkApi(
-        """
+    fun testLambdaReorderedParameter() =
+        checkApi(
+            """
             @Composable fun Foo(a: String, b: () -> Unit) { }
             @Composable fun Example() {
                 Foo(b={}, a="Hello, world!")
             }
         """,
-    )
+        )
 
     @Test
-    fun testCompositionLocalCurrent() = checkApi(
-        """
+    fun testCompositionLocalCurrent() =
+        checkApi(
+            """
             val a = compositionLocalOf { 123 }
             @Composable fun Foo() {
                 val b = a.current
                 print(b)
             }
         """,
-    )
+        )
 
     @Test
-    fun testRemappedTypes() = checkApi(
-        """
+    fun testRemappedTypes() =
+        checkApi(
+            """
             class A {
                 fun makeA(): A { return A() }
                 fun makeB(): B { return B() }
@@ -420,31 +468,34 @@
                 }
             }
         """,
-    )
+        )
 
     @Test
-    fun testDataClassHashCode() = validateBytecode(
-        """
+    fun testDataClassHashCode() =
+        validateBytecode(
+            """
         data class Foo(
             val bar: @Composable () -> Unit
         )
         """
-    ) {
-        assert(!it.contains("CHECKCAST kotlin/jvm/functions/Function0"))
-    }
+        ) {
+            assert(!it.contains("CHECKCAST kotlin/jvm/functions/Function0"))
+        }
 
     @Test
-    fun testDefaultParameters() = checkApi(
-        """
+    fun testDefaultParameters() =
+        checkApi(
+            """
             @Composable fun Foo(x: Int = 0) {
 
             }
         """,
-    )
+        )
 
     @Test
-    fun testDefaultExpressionsWithComposableCall() = checkApi(
-        """
+    fun testDefaultExpressionsWithComposableCall() =
+        checkApi(
+            """
             @Composable fun <T> identity(value: T): T = value
             @Composable fun Foo(x: Int = identity(20)) {
 
@@ -454,11 +505,12 @@
                 Foo(10)
             }
         """,
-    )
+        )
 
     @Test
-    fun testBasicCallAndParameterUsage() = checkApi(
-        """
+    fun testBasicCallAndParameterUsage() =
+        checkApi(
+            """
             @Composable fun Foo(a: Int, b: String) {
                 print(a)
                 print(b)
@@ -470,43 +522,47 @@
                 print(b)
             }
         """,
-    )
+        )
 
     @Test
-    fun testCallFromInlinedLambda() = checkApi(
-        """
+    fun testCallFromInlinedLambda() =
+        checkApi(
+            """
             @Composable fun Foo() {
                 listOf(1, 2, 3).forEach { Bar(it) }
             }
 
             @Composable fun Bar(a: Int) {}
         """,
-    )
+        )
 
     @Test
-    fun testBasicLambda() = checkApi(
-        """
+    fun testBasicLambda() =
+        checkApi(
+            """
             val foo = @Composable { x: Int -> print(x)  }
             @Composable fun Bar() {
               foo(123)
             }
         """,
-    )
+        )
 
     @Test
-    fun testLocalLambda() = checkApi(
-        """
+    fun testLocalLambda() =
+        checkApi(
+            """
             @Composable fun Bar(content: @Composable () -> Unit) {
                 val foo = @Composable { x: Int -> print(x)  }
                 foo(123)
                 content()
             }
         """,
-    )
+        )
 
     @Test
-    fun testNesting() = checkApi(
-        """
+    fun testNesting() =
+        checkApi(
+            """
             @Composable fun Wrap(content: @Composable (x: Int) -> Unit) {
                 content(123)
             }
@@ -523,11 +579,12 @@
                 }
             }
         """,
-    )
+        )
 
     @Test
-    fun testComposableInterface() = checkApi(
-        """
+    fun testComposableInterface() =
+        checkApi(
+            """
             interface Foo {
                 @Composable fun bar()
             }
@@ -536,11 +593,12 @@
                 @Composable override fun bar() {}
             }
         """,
-    )
+        )
 
     @Test
-    fun testSealedClassEtc() = checkApi(
-        """
+    fun testSealedClassEtc() =
+        checkApi(
+            """
             sealed class CompositionLocal2<T> {
                 inline val current: T
                     @Composable
@@ -552,27 +610,30 @@
             class DynamicProvidableCompositionLocal2<T> : ProvidableCompositionLocal2<T>() {}
             class StaticProvidableCompositionLocal2<T> : ProvidableCompositionLocal2<T>() {}
         """,
-    )
+        )
 
     @Test
-    fun testComposableTopLevelProperty() = checkApi(
-        """
+    fun testComposableTopLevelProperty() =
+        checkApi(
+            """
             val foo: Int @Composable get() { return 123 }
         """,
-    )
+        )
 
     @Test
-    fun testComposableProperty() = checkApi(
-        """
+    fun testComposableProperty() =
+        checkApi(
+            """
             class Foo {
                 val foo: Int @Composable get() { return 123 }
             }
         """,
-    )
+        )
 
     @Test
-    fun testTableLambdaThing() = validateBytecode(
-        """
+    fun testTableLambdaThing() =
+        validateBytecode(
+            """
         @Composable
         fun Foo() {
             val c: @Composable () -> Unit = with(123) {
@@ -581,36 +642,39 @@
             }
         }
         """
-    ) {
-        // TODO(lmr): test
-    }
+        ) {
+            // TODO(lmr): test
+        }
 
     @Test
-    fun testDefaultArgs() = validateBytecode(
-        """
+    fun testDefaultArgs() =
+        validateBytecode(
+            """
         @Composable
         fun Scaffold(
             topAppBar: @Composable (() -> Unit)? = null
         ) {}
         """
-    ) {
-        // TODO(lmr): test
-    }
+        ) {
+            // TODO(lmr): test
+        }
 
     @Test
-    fun testSyntheticAccessFunctions() = validateBytecode(
-        """
+    fun testSyntheticAccessFunctions() =
+        validateBytecode(
+            """
         class Foo {
             @Composable private fun Bar() {}
         }
         """
-    ) {
-        // TODO(lmr): test
-    }
+        ) {
+            // TODO(lmr): test
+        }
 
     @Test
-    fun testLambdaMemoization() = validateBytecode(
-        """
+    fun testLambdaMemoization() =
+        validateBytecode(
+            """
         fun subcompose(block: @Composable () -> Unit) {}
         private class Foo {
             var content: @Composable (Double) -> Unit = {}
@@ -622,24 +686,26 @@
             }
         }
         """
-    ) {
-        // TODO(lmr): test
-    }
+        ) {
+            // TODO(lmr): test
+        }
 
     @Test
-    fun testCallingProperties() = checkApi(
-        """
+    fun testCallingProperties() =
+        checkApi(
+            """
             val bar: Int @Composable get() { return 123 }
 
             @Composable fun Example() {
                 bar
             }
         """,
-    )
+        )
 
     @Test
-    fun testAbstractComposable() = checkApi(
-        """
+    fun testAbstractComposable() =
+        checkApi(
+            """
             abstract class BaseFoo {
                 @Composable abstract fun bar()
             }
@@ -648,11 +714,12 @@
                 @Composable override fun bar() {}
             }
         """,
-    )
+        )
 
     @Test
-    fun testLocalClassAndObjectLiterals() = checkApi(
-        """
+    fun testLocalClassAndObjectLiterals() =
+        checkApi(
+            """
             @Composable
             fun Wat() {}
 
@@ -667,11 +734,12 @@
                 Bar().baz()
             }
         """,
-    )
+        )
 
     @Test
-    fun testNonComposableCode() = checkApi(
-        """
+    fun testNonComposableCode() =
+        checkApi(
+            """
             fun A() {}
             val b: Int get() = 123
             fun C(x: Int) {
@@ -693,20 +761,22 @@
                 }
             }
         """,
-    )
+        )
 
     @Test
-    fun testCircularCall() = checkApi(
-        """
+    fun testCircularCall() =
+        checkApi(
+            """
             @Composable fun Example() {
                 Example()
             }
         """,
-    )
+        )
 
     @Test
-    fun testInlineCall() = checkApi(
-        """
+    fun testInlineCall() =
+        checkApi(
+            """
             @Composable inline fun Example(content: @Composable () -> Unit) {
                 content()
             }
@@ -715,20 +785,22 @@
                 Example {}
             }
         """,
-    )
+        )
 
     @Test
-    fun testDexNaming() = checkApi(
-        """
+    fun testDexNaming() =
+        checkApi(
+            """
             val myProperty: () -> Unit @Composable get() {
                 return {  }
             }
         """,
-    )
+        )
 
     @Test
-    fun testInnerClass() = checkApi(
-        """
+    fun testInnerClass() =
+        checkApi(
+            """
             interface A {
                 fun b() {}
             }
@@ -741,11 +813,12 @@
                 }
             }
         """,
-    )
+        )
 
     @Test
-    fun testFunInterfaces() = checkApi(
-        """
+    fun testFunInterfaces() =
+        checkApi(
+            """
             fun interface A {
                 fun compute(value: Int): Unit
             }
@@ -756,11 +829,12 @@
                 Example { it -> it + 1 }
             }
         """,
-    )
+        )
 
     @Test
-    fun testComposableFunInterfaces() = checkApi(
-        """
+    fun testComposableFunInterfaces() =
+        checkApi(
+            """
             fun interface A {
                 @Composable fun compute(value: Int): Unit
             }
@@ -768,11 +842,12 @@
                 Example { it -> a.compute(it) }
             }
         """,
-    )
+        )
 
     @Test
-    fun testFunInterfacesInComposableCall() = checkApi(
-        """
+    fun testFunInterfacesInComposableCall() =
+        checkApi(
+            """
             fun interface MeasurePolicy {
                 fun compute(value: Int): Unit
             }
@@ -788,11 +863,12 @@
                 policy.compute(0)
             }
         """,
-    )
+        )
 
     @Test
-    fun testComposableFunInterfacesInVariance() = checkApi(
-        """
+    fun testComposableFunInterfacesInVariance() =
+        checkApi(
+            """
            import androidx.compose.runtime.*
 
             fun interface Consumer<T> {
@@ -809,11 +885,12 @@
                 }
             }
         """,
-    )
+        )
 
     @Test
-    fun testFunInterfaceWithInlineReturnType() = checkApi(
-        """
+    fun testFunInterfaceWithInlineReturnType() =
+        checkApi(
+            """
             inline class Color(val value: Int)
             fun interface A {
                 fun compute(value: Int): Color
@@ -822,11 +899,12 @@
                 Example { it -> Color(it) }
             }
         """,
-    )
+        )
 
     @Test
-    fun testComposableFunInterfaceWithInlineReturnType() = checkApi(
-        """
+    fun testComposableFunInterfaceWithInlineReturnType() =
+        checkApi(
+            """
             inline class Color(val value: Int)
             fun interface A {
                 @Composable fun compute(value: Int): Color
@@ -835,11 +913,12 @@
                 Example { it -> Color(it) }
             }
         """,
-    )
+        )
 
     @Test
-    fun testComposableMap() = codegen(
-        """
+    fun testComposableMap() =
+        codegen(
+            """
             class Repro {
                 private val composables = linkedMapOf<String, @Composable () -> Unit>()
 
@@ -848,11 +927,12 @@
                 }
             }
         """
-    )
+        )
 
     @Test
-    fun testComposableColorFunInterfaceExample() = checkApi(
-        """
+    fun testComposableColorFunInterfaceExample() =
+        checkApi(
+            """
             import androidx.compose.ui.graphics.Color
             import java.lang.UnsupportedOperationException
 
@@ -887,11 +967,12 @@
                 }
             }
         """
-    )
+        )
 
     @Test
-    fun testComposableInlineFieldDelegate_noPropertyRefInit() = validateBytecode(
-        """
+    fun testComposableInlineFieldDelegate_noPropertyRefInit() =
+        validateBytecode(
+            """
             import kotlin.reflect.KProperty
 
             class FooInline
@@ -904,13 +985,18 @@
                 return value
             }
         """,
-    ) {
-        assertFalse(it.contains("INVOKESTATIC kotlin/jvm/internal/Reflection.property0 (Lkotlin/jvm/internal/PropertyReference0;)Lkotlin/reflect/KProperty0;"))
-    }
+        ) {
+            assertFalse(
+                it.contains(
+                    "INVOKESTATIC kotlin/jvm/internal/Reflection.property0 (Lkotlin/jvm/internal/PropertyReference0;)Lkotlin/reflect/KProperty0;"
+                )
+            )
+        }
 
     @Test
-    fun testComposableAdaptedFunctionReference() = validateBytecode(
-        """
+    fun testComposableAdaptedFunctionReference() =
+        validateBytecode(
+            """
             class ScrollState {
                 fun test(index: Int, default: Int = 0): Int = 0
                 fun testExact(index: Int): Int = 0
@@ -928,20 +1014,25 @@
             @Composable
             fun foo(block: (Int) -> Int) = block(0)
         """,
-        validate = {
-            // Validate that function references in inline calls are actually getting inlined
-            assertFalse(
-                it.contains("""INVOKESPECIAL Test_0Kt${'$'}rememberFooInline$1$1.<init> (Ljava/lang/Object;)V""")
-            )
-            assertFalse(
-                it.contains("""INVOKESPECIAL Test_0Kt${'$'}rememberFooExactInline$1$1.<init> (Ljava/lang/Object;)V""")
-            )
-        }
-    )
+            validate = {
+                // Validate that function references in inline calls are actually getting inlined
+                assertFalse(
+                    it.contains(
+                        """INVOKESPECIAL Test_0Kt${'$'}rememberFooInline$1$1.<init> (Ljava/lang/Object;)V"""
+                    )
+                )
+                assertFalse(
+                    it.contains(
+                        """INVOKESPECIAL Test_0Kt${'$'}rememberFooExactInline$1$1.<init> (Ljava/lang/Object;)V"""
+                    )
+                )
+            }
+        )
 
     @Test
-    fun testDefaultParamInlineClassRefType() = checkApi(
-        """
+    fun testDefaultParamInlineClassRefType() =
+        checkApi(
+            """
             @JvmInline
             value class Data(val string: String)
             @JvmInline
@@ -960,5 +1051,5 @@
                 @Composable protected fun ProtectedExample(data: Data = Data("")) {}
             }
         """
-    )
+        )
 }
diff --git a/compose/compiler/compiler-hosted/integration-tests/src/jvmTest/kotlin/androidx/compose/compiler/plugins/kotlin/ComposerParamTransformTests.kt b/compose/compiler/compiler-hosted/integration-tests/src/jvmTest/kotlin/androidx/compose/compiler/plugins/kotlin/ComposerParamTransformTests.kt
index 074b91a..31b36a4e 100644
--- a/compose/compiler/compiler-hosted/integration-tests/src/jvmTest/kotlin/androidx/compose/compiler/plugins/kotlin/ComposerParamTransformTests.kt
+++ b/compose/compiler/compiler-hosted/integration-tests/src/jvmTest/kotlin/androidx/compose/compiler/plugins/kotlin/ComposerParamTransformTests.kt
@@ -31,12 +31,12 @@
 
 class ComposerParamTransformTests(useFir: Boolean) : AbstractIrTransformTest(useFir) {
     private fun composerParam(
-        @Language("kotlin")
-        source: String,
-        validator: (element: IrElement) -> Unit = { },
+        @Language("kotlin") source: String,
+        validator: (element: IrElement) -> Unit = {},
         dumpTree: Boolean = false
-    ) = verifyGoldenComposeIrTransform(
-        """
+    ) =
+        verifyGoldenComposeIrTransform(
+            """
             @file:OptIn(
               InternalComposeApi::class,
             )
@@ -48,29 +48,32 @@
             import androidx.compose.runtime.NonRestartableComposable
 
             $source
-        """.trimIndent(),
         """
+                .trimIndent(),
+            """
             package test
             fun used(x: Any?) {}
         """,
-        validator,
-        dumpTree
-    )
+            validator,
+            dumpTree
+        )
 
     @Test
-    fun testCallingProperties(): Unit = composerParam(
-        """
+    fun testCallingProperties(): Unit =
+        composerParam(
+            """
             val bar: Int @Composable get() { return 123 }
 
             @NonRestartableComposable @Composable fun Example() {
                 bar
             }
         """
-    )
+        )
 
     @Test
-    fun testAbstractComposable(): Unit = composerParam(
-        """
+    fun testAbstractComposable(): Unit =
+        composerParam(
+            """
             abstract class BaseFoo {
                 @NonRestartableComposable
                 @Composable
@@ -83,11 +86,12 @@
                 override fun bar() {}
             }
         """
-    )
+        )
 
     @Test
-    fun testLocalClassAndObjectLiterals(): Unit = composerParam(
-        """
+    fun testLocalClassAndObjectLiterals(): Unit =
+        composerParam(
+            """
             @NonRestartableComposable
             @Composable
             fun Wat() {}
@@ -106,11 +110,12 @@
                 Bar().baz()
             }
         """
-    )
+        )
 
     @Test
-    fun testVarargWithNoArgs(): Unit = composerParam(
-        """
+    fun testVarargWithNoArgs(): Unit =
+        composerParam(
+            """
             @Composable
             fun VarArgsFirst(vararg foo: Any?) {
                 println(foo)
@@ -121,12 +126,13 @@
                 VarArgsFirst()
             }
             """
-    )
+        )
 
     // Regression test for b/286132194
     @Test
-    fun testStableVarargParams(): Unit = composerParam(
-        """
+    fun testStableVarargParams(): Unit =
+        composerParam(
+            """
             @Composable
             fun B(vararg values: Int) {
                 print(values)
@@ -138,11 +144,12 @@
                 B(0, 1, 2, 3)
             }
         """
-    )
+        )
 
     @Test
-    fun testNonComposableCode(): Unit = composerParam(
-        """
+    fun testNonComposableCode(): Unit =
+        composerParam(
+            """
             fun A() {}
             val b: Int get() = 123
             fun C(x: Int) {
@@ -164,21 +171,23 @@
                 }
             }
         """
-    )
+        )
 
     @Test
-    fun testCircularCall(): Unit = composerParam(
-        """
+    fun testCircularCall(): Unit =
+        composerParam(
+            """
             @NonRestartableComposable
             @Composable fun Example() {
                 Example()
             }
         """
-    )
+        )
 
     @Test
-    fun testInlineCall(): Unit = composerParam(
-        """
+    fun testInlineCall(): Unit =
+        composerParam(
+            """
             @Composable inline fun Example(content: @Composable () -> Unit) {
                 content()
             }
@@ -188,20 +197,22 @@
                 Example {}
             }
         """
-    )
+        )
 
     @Test
-    fun testDexNaming(): Unit = composerParam(
-        """
+    fun testDexNaming(): Unit =
+        composerParam(
+            """
             val myProperty: () -> Unit @Composable get() {
                 return {  }
             }
         """
-    )
+        )
 
     @Test
-    fun testInnerClass(): Unit = composerParam(
-        """
+    fun testInnerClass(): Unit =
+        composerParam(
+            """
             interface A {
                 fun b() {}
             }
@@ -214,7 +225,7 @@
                 }
             }
         """
-    )
+        )
 
     @Test
     fun testKeyCall() {
@@ -247,9 +258,10 @@
                 element.accept(
                     object : IrElementVisitorVoid {
                         override fun visitSimpleFunction(declaration: IrSimpleFunction) {
-                            val composer = declaration.valueParameters.firstOrNull {
-                                it.name == ComposeNames.COMPOSER_PARAMETER
-                            }
+                            val composer =
+                                declaration.valueParameters.firstOrNull {
+                                    it.name == ComposeNames.COMPOSER_PARAMETER
+                                }
                             val oldComposer = currentComposer
                             if (composer != null) currentComposer = composer
                             super.visitSimpleFunction(declaration)
@@ -264,8 +276,8 @@
                             super.visitGetValue(expression)
                             val value = expression.symbol.owner
                             if (
-                                value is IrValueParameter && value.name ==
-                                ComposeNames.COMPOSER_PARAMETER
+                                value is IrValueParameter &&
+                                    value.name == ComposeNames.COMPOSER_PARAMETER
                             ) {
                                 assertEquals(
                                     "Composer unexpectedly captured",
@@ -337,8 +349,9 @@
     }
 
     @Test
-    fun testUnstableDelegateCall() = composerParam(
-        """
+    fun testUnstableDelegateCall() =
+        composerParam(
+            """
                 import kotlin.reflect.KProperty
 
                 class Foo {
@@ -354,11 +367,12 @@
                     println(foo)
                 }
             """
-    )
+        )
 
     @Test
-    fun testStableDelegateCall() = composerParam(
-        """
+    fun testStableDelegateCall() =
+        composerParam(
+            """
             import kotlin.reflect.KProperty
 
             class Foo
@@ -372,11 +386,13 @@
                 used(delegated)
             }
         """
-    )
+        )
 
     @Test
-    fun validateNoComposableFunctionSymbolCalls() = composerParam(
-        source = """
+    fun validateNoComposableFunctionSymbolCalls() =
+        composerParam(
+            source =
+                """
             fun abc0(l: @Composable () -> Unit) {
                 val hc = l.hashCode()
             }
@@ -391,31 +407,36 @@
             ) {
                 val hc = l.hashCode()
             }
-        """.trimIndent(),
-        validator = {
-            val expectedArity = listOf(2, 3, 4, 15)
-            var i = 0 // to iterate over `hashCode` calls
-            it.acceptChildrenVoid(object : IrElementVisitorVoid {
-                override fun visitElement(element: IrElement) {
-                    element.acceptChildrenVoid(this)
-                }
+        """
+                    .trimIndent(),
+            validator = {
+                val expectedArity = listOf(2, 3, 4, 15)
+                var i = 0 // to iterate over `hashCode` calls
+                it.acceptChildrenVoid(
+                    object : IrElementVisitorVoid {
+                        override fun visitElement(element: IrElement) {
+                            element.acceptChildrenVoid(this)
+                        }
 
-                override fun visitCall(expression: IrCall) {
-                    if (expression.symbol.owner.name.asString() == "hashCode") {
-                        assertEquals(
-                            "kotlin.Function${expectedArity[i]}.hashCode",
-                            expression.symbol.owner.fqNameForIrSerialization.asString())
-                        i++
+                        override fun visitCall(expression: IrCall) {
+                            if (expression.symbol.owner.name.asString() == "hashCode") {
+                                assertEquals(
+                                    "kotlin.Function${expectedArity[i]}.hashCode",
+                                    expression.symbol.owner.fqNameForIrSerialization.asString()
+                                )
+                                i++
+                            }
+                        }
                     }
-                }
-            })
-        }
-    )
+                )
+            }
+        )
 
     @Test
     fun validateNoComposableFunctionReferencesInOverriddenSymbols() =
         verifyGoldenCrossModuleComposeIrTransform(
-            dependencySource = """
+            dependencySource =
+                """
             package dependency
 
             import androidx.compose.runtime.Composable
@@ -423,8 +444,10 @@
             interface Content {
                 fun setContent(c: @Composable () -> Unit)
             }
-        """.trimIndent(),
-            source = """
+        """
+                    .trimIndent(),
+            source =
+                """
             package test
 
             import androidx.compose.runtime.Composable
@@ -433,35 +456,43 @@
             class ContentImpl : Content {
                 override fun setContent(c: @Composable () -> Unit) {}
             }
-        """.trimIndent(),
+        """
+                    .trimIndent(),
             validator = {
-                it.acceptChildrenVoid(object : IrElementVisitorVoid {
-                    override fun visitElement(element: IrElement) {
-                        element.acceptChildrenVoid(this)
-                    }
+                it.acceptChildrenVoid(
+                    object : IrElementVisitorVoid {
+                        override fun visitElement(element: IrElement) {
+                            element.acceptChildrenVoid(this)
+                        }
 
-                    private val targetFqName = "test.ContentImpl.setContent"
+                        private val targetFqName = "test.ContentImpl.setContent"
 
-                    override fun visitSimpleFunction(declaration: IrSimpleFunction) {
-                        if (declaration.fqNameForIrSerialization.asString() == targetFqName) {
-                            assertEquals(1, declaration.overriddenSymbols.size)
-                            val firstParameterOfOverridden =
-                                declaration.overriddenSymbols.first().owner.valueParameters.first()
-                                    .takeIf { it.name.asString() == "c" }!!
-                            assertEquals(
-                                "kotlin.Function2",
-                                firstParameterOfOverridden.type.classFqName?.asString()
-                            )
+                        override fun visitSimpleFunction(declaration: IrSimpleFunction) {
+                            if (declaration.fqNameForIrSerialization.asString() == targetFqName) {
+                                assertEquals(1, declaration.overriddenSymbols.size)
+                                val firstParameterOfOverridden =
+                                    declaration.overriddenSymbols
+                                        .first()
+                                        .owner
+                                        .valueParameters
+                                        .first()
+                                        .takeIf { it.name.asString() == "c" }!!
+                                assertEquals(
+                                    "kotlin.Function2",
+                                    firstParameterOfOverridden.type.classFqName?.asString()
+                                )
+                            }
                         }
                     }
-                })
+                )
             }
         )
 
     @Test
     fun validateNoComposableFunctionReferencesInCalleeOverriddenSymbols() =
         verifyGoldenCrossModuleComposeIrTransform(
-            dependencySource = """
+            dependencySource =
+                """
             package dependency
 
             import androidx.compose.runtime.Composable
@@ -472,8 +503,10 @@
             class ContentImpl : Content {
                 override fun setContent(c: @Composable () -> Unit) {}
             }
-        """.trimIndent(),
-            source = """
+        """
+                    .trimIndent(),
+            source =
+                """
             package test
 
             import androidx.compose.runtime.Composable
@@ -485,41 +518,50 @@
             fun Foo() {
                 ContentImpl().setContent()
             }
-        """.trimIndent(),
+        """
+                    .trimIndent(),
             validator = {
-                it.acceptChildrenVoid(object : IrElementVisitorVoid {
-                    override fun visitElement(element: IrElement) {
-                        element.acceptChildrenVoid(this)
-                    }
-
-                    private val targetFqName = "dependency.ContentImpl.setContent"
-
-                    override fun visitCall(expression: IrCall) {
-                        val callee = expression.symbol.owner
-                        if (callee.fqNameForIrSerialization.asString() == targetFqName) {
-                            val firstParameterOfOverridden =
-                                callee.overriddenSymbols.first().owner.valueParameters.first()
-                                    .takeIf { it.name.asString() == "c" }!!
-                            assertEquals(
-                                "kotlin.Function2",
-                                firstParameterOfOverridden.type.classFqName?.asString()
-                            )
+                it.acceptChildrenVoid(
+                    object : IrElementVisitorVoid {
+                        override fun visitElement(element: IrElement) {
+                            element.acceptChildrenVoid(this)
                         }
-                        super.visitCall(expression)
+
+                        private val targetFqName = "dependency.ContentImpl.setContent"
+
+                        override fun visitCall(expression: IrCall) {
+                            val callee = expression.symbol.owner
+                            if (callee.fqNameForIrSerialization.asString() == targetFqName) {
+                                val firstParameterOfOverridden =
+                                    callee.overriddenSymbols
+                                        .first()
+                                        .owner
+                                        .valueParameters
+                                        .first()
+                                        .takeIf { it.name.asString() == "c" }!!
+                                assertEquals(
+                                    "kotlin.Function2",
+                                    firstParameterOfOverridden.type.classFqName?.asString()
+                                )
+                            }
+                            super.visitCall(expression)
+                        }
                     }
-                })
+                )
             }
         )
 
     @Test
     fun composableCallInAnonymousObjectInitializer() =
         verifyGoldenComposeIrTransform(
-            extra = """
+            extra =
+                """
                 import androidx.compose.runtime.*
 
                 @Composable fun Foo(): State<Int> = TODO()
             """,
-            source = """
+            source =
+                """
                 import androidx.compose.runtime.*
 
                 @Composable fun Test(inputs: List<Int>) {
@@ -544,7 +586,8 @@
     @Test
     fun composableLocalFunctionInsideLocalClass() =
         verifyGoldenComposeIrTransform(
-            extra = """
+            extra =
+                """
                 import androidx.compose.runtime.*
 
                 abstract class C {
@@ -554,7 +597,8 @@
 
                 @Composable fun Button(onClick: () -> Unit, content: @Composable () -> Unit) {}
             """,
-            source = """
+            source =
+                """
                 import androidx.compose.runtime.*
 
                 fun test() {
@@ -576,7 +620,8 @@
     @Test
     fun composeValueClassDefaultParameter() =
         verifyGoldenComposeIrTransform(
-            extra = """
+            extra =
+                """
                 @JvmInline
                 value class Data(val string: String)
                 @JvmInline
@@ -584,7 +629,8 @@
                 @JvmInline
                 value class IntData(val value: Int)
             """,
-            source = """
+            source =
+                """
                 import androidx.compose.runtime.*
 
                 @Composable fun Example(data: Data = Data(""), intData: IntData = IntData(0)) {}
diff --git a/compose/compiler/compiler-hosted/integration-tests/src/jvmTest/kotlin/androidx/compose/compiler/plugins/kotlin/ContextReceiversTransformTests.kt b/compose/compiler/compiler-hosted/integration-tests/src/jvmTest/kotlin/androidx/compose/compiler/plugins/kotlin/ContextReceiversTransformTests.kt
index 634e8de..b91d194 100644
--- a/compose/compiler/compiler-hosted/integration-tests/src/jvmTest/kotlin/androidx/compose/compiler/plugins/kotlin/ContextReceiversTransformTests.kt
+++ b/compose/compiler/compiler-hosted/integration-tests/src/jvmTest/kotlin/androidx/compose/compiler/plugins/kotlin/ContextReceiversTransformTests.kt
@@ -26,55 +26,60 @@
 class ContextReceiversTransformTests(useFir: Boolean) : AbstractIrTransformTest(useFir) {
     override fun CompilerConfiguration.updateConfiguration() {
         put(ComposeConfiguration.SOURCE_INFORMATION_ENABLED_KEY, true)
-        languageVersionSettings = LanguageVersionSettingsImpl(
-            languageVersion = languageVersionSettings.languageVersion,
-            apiVersion = languageVersionSettings.apiVersion,
-            specificFeatures = mapOf(
-                LanguageFeature.ContextReceivers to LanguageFeature.State.ENABLED
+        languageVersionSettings =
+            LanguageVersionSettingsImpl(
+                languageVersion = languageVersionSettings.languageVersion,
+                apiVersion = languageVersionSettings.apiVersion,
+                specificFeatures =
+                    mapOf(LanguageFeature.ContextReceivers to LanguageFeature.State.ENABLED)
             )
-        )
     }
 
     private fun contextReceivers(
-        @Language("kotlin")
-        unchecked: String,
-        @Language("kotlin")
-        checked: String,
-    ) = verifyGoldenComposeIrTransform(
-        source = """
+        @Language("kotlin") unchecked: String,
+        @Language("kotlin") checked: String,
+    ) =
+        verifyGoldenComposeIrTransform(
+            source =
+                """
             import androidx.compose.runtime.Composable
 
             $checked
-        """.trimIndent(),
-        extra = """
+        """
+                    .trimIndent(),
+            extra =
+                """
             import androidx.compose.runtime.Composable
 
             $unchecked
 
             fun used(x: Any?) {}
-        """.trimIndent(),
-    )
+        """
+                    .trimIndent(),
+        )
 
     @Test
-    fun testTrivialContextReceivers(): Unit = contextReceivers(
-        """
+    fun testTrivialContextReceivers(): Unit =
+        contextReceivers(
+            """
             class Foo { }
         """,
-        """
+            """
             context(Foo)
             @Composable
             fun Test() { }
         """
-    )
+        )
 
     @Test
-    fun testMultipleContextReceivers(): Unit = contextReceivers(
-        """
+    fun testMultipleContextReceivers(): Unit =
+        contextReceivers(
+            """
             class Foo { }
             class Bar { }
             class FooBar { }
         """,
-        """
+            """
             context(Foo, Bar)
             @Composable
             fun A() { }
@@ -83,16 +88,17 @@
             @Composable
             fun B() { }
         """
-    )
+        )
 
     @Test
-    fun testContextReceiversAndExtensionReceiver(): Unit = contextReceivers(
-        """
+    fun testContextReceiversAndExtensionReceiver(): Unit =
+        contextReceivers(
+            """
             class Foo { }
             class Bar { }
             class FooBar { }
         """,
-        """
+            """
             context(Foo, Bar)
             @Composable
             fun String.A() { }
@@ -101,16 +107,17 @@
             @Composable
             fun String.B() { }
         """
-    )
+        )
 
     @Test
-    fun testContextReceiversAndDefaultParams(): Unit = contextReceivers(
-        """
+    fun testContextReceiversAndDefaultParams(): Unit =
+        contextReceivers(
+            """
             class Foo { }
             class Bar { }
             class FooBar { }
         """,
-        """
+            """
             context(Foo, Bar)
             @Composable
             fun A(a: Int = 1) { }
@@ -123,32 +130,34 @@
             @Composable
             fun C(a: Int, bar: Bar = Bar()) { }
         """
-    )
+        )
 
     @Test
-    fun testContextReceiversAndExtensionReceiverAndDefaultParams(): Unit = contextReceivers(
-        """
+    fun testContextReceiversAndExtensionReceiverAndDefaultParams(): Unit =
+        contextReceivers(
+            """
             class Foo { }
             class Bar { }
             class FooBar { }
         """,
-        """
+            """
             context(Foo, Bar, FooBar)
             @Composable
             fun String.B(a: Int, b: String = "", c: Int = 1) { }
         """
-    )
+        )
 
     @Test
-    fun testContextReceiversWith(): Unit = contextReceivers(
-        """
+    fun testContextReceiversWith(): Unit =
+        contextReceivers(
+            """
             context(Foo)
             @Composable
             fun A() { }
 
             class Foo { }
         """,
-        """
+            """
 
             @Composable
             fun Test(foo: Foo) {
@@ -157,11 +166,12 @@
                 }
             }
         """
-    )
+        )
 
     @Test
-    fun testContextReceiversNestedWith(): Unit = contextReceivers(
-        """
+    fun testContextReceiversNestedWith(): Unit =
+        contextReceivers(
+            """
             context(Foo)
             @Composable
             fun A() { }
@@ -173,7 +183,7 @@
             class Foo { }
             class Bar { }
         """,
-        """
+            """
             @Composable
             fun Test(foo: Foo) {
                 with(foo) {
@@ -184,18 +194,19 @@
                 }
             }
         """
-    )
+        )
 
     @Test
-    fun testContextReceiversWithAndDefaultParam(): Unit = contextReceivers(
-        """
+    fun testContextReceiversWithAndDefaultParam(): Unit =
+        contextReceivers(
+            """
             context(Foo)
             @Composable
             fun String.A(param1: Int, param2: String = "") { }
 
             class Foo { }
         """,
-        """
+            """
             @Composable
             fun Test(foo: Foo) {
                 with(foo) {
@@ -203,11 +214,12 @@
                 }
             }
         """
-    )
+        )
 
     @Test
-    fun testLotsOfContextReceivers(): Unit = contextReceivers(
-        """
+    fun testLotsOfContextReceivers(): Unit =
+        contextReceivers(
+            """
             class A { }
             class B { }
             class C { }
@@ -221,13 +233,13 @@
             class K { }
             class L { }
         """,
-        """
+            """
             context(A, B, C, D, E, F, G, H, I, J, K, L)
             @Composable
             fun Test() {
             }
         """
-    )
+        )
 
     @Test
     fun testContextReceiverAndComposableLambdaParam() {
@@ -246,13 +258,14 @@
     }
 
     @Test
-    fun testContextReceiverAndDefaultParamsUsage(): Unit = contextReceivers(
-        """
+    fun testContextReceiverAndDefaultParamsUsage(): Unit =
+        contextReceivers(
+            """
             class Foo {
                 val someString = "Some String"
             }
         """,
-        """
+            """
             @Composable
             fun Parent() {
                 with(Foo()) {
@@ -272,5 +285,5 @@
                 }
             }
         """
-    )
+        )
 }
diff --git a/compose/compiler/compiler-hosted/integration-tests/src/jvmTest/kotlin/androidx/compose/compiler/plugins/kotlin/ControlFlowTransformTests.kt b/compose/compiler/compiler-hosted/integration-tests/src/jvmTest/kotlin/androidx/compose/compiler/plugins/kotlin/ControlFlowTransformTests.kt
index 604cae1..119da8a 100644
--- a/compose/compiler/compiler-hosted/integration-tests/src/jvmTest/kotlin/androidx/compose/compiler/plugins/kotlin/ControlFlowTransformTests.kt
+++ b/compose/compiler/compiler-hosted/integration-tests/src/jvmTest/kotlin/androidx/compose/compiler/plugins/kotlin/ControlFlowTransformTests.kt
@@ -21,8 +21,9 @@
 
 class ControlFlowTransformTests(useFir: Boolean) : AbstractControlFlowTransformTests(useFir) {
     @Test
-    fun testIfNonComposable(): Unit = controlFlow(
-        """
+    fun testIfNonComposable(): Unit =
+        controlFlow(
+            """
             @NonRestartableComposable @Composable
             fun Example(x: Int) {
                 // No composable calls, so no group generated except for at function boundary
@@ -31,33 +32,36 @@
                 }
             }
         """
-    )
+        )
 
     @Test
-    fun testAND(): Unit = controlFlow(
-        """
+    fun testAND(): Unit =
+        controlFlow(
+            """
             @NonRestartableComposable
             @Composable
             fun Example() {
                 B() && B()
             }
         """
-    )
+        )
 
     @Test
-    fun testOR(): Unit = controlFlow(
-        """
+    fun testOR(): Unit =
+        controlFlow(
+            """
             @NonRestartableComposable
             @Composable
             fun Example() {
                 B() || B()
             }
         """
-    )
+        )
 
     @Test
-    fun testIfWithCallsInBranch(): Unit = controlFlow(
-        """
+    fun testIfWithCallsInBranch(): Unit =
+        controlFlow(
+            """
             @NonRestartableComposable @Composable
             fun Example(x: Int) {
                 // Only one composable call in the result blocks, so we can just generate
@@ -67,11 +71,12 @@
                 }
             }
         """
-    )
+        )
 
     @Test
-    fun testIfElseWithCallsInBranch(): Unit = controlFlow(
-        """
+    fun testIfElseWithCallsInBranch(): Unit =
+        controlFlow(
+            """
             @NonRestartableComposable @Composable
             fun Example(x: Int) {
                 // Composable calls in the result blocks, so we can determine static number of
@@ -84,11 +89,12 @@
                 }
             }
         """
-    )
+        )
 
     @Test
-    fun testIfWithCallInCondition(): Unit = controlFlow(
-        """
+    fun testIfWithCallInCondition(): Unit =
+        controlFlow(
+            """
             @NonRestartableComposable @Composable
             fun Example(x: Int) {
                 // Since the first condition of an if/else is unconditionally executed, it does not
@@ -101,17 +107,17 @@
                 }
             }
         """
-    )
+        )
 
     private fun verifyInlineReturn(
-        @Language("kotlin")
-        source: String,
-    ) = verifyGoldenComposeIrTransform(
-        """
+        @Language("kotlin") source: String,
+    ) =
+        verifyGoldenComposeIrTransform(
+            """
             import androidx.compose.runtime.Composable
             $source
         """,
-        """
+            """
             import androidx.compose.runtime.Composable
 
             @Composable
@@ -149,11 +155,12 @@
             @Composable
             fun Stack(content: @Composable () -> Unit) = content()
         """
-    )
+        )
 
     @Test
-    fun testInline_CM3_RFun() = verifyInlineReturn(
-        """
+    fun testInline_CM3_RFun() =
+        verifyInlineReturn(
+            """
             @Composable
             fun Test(condition: Boolean) {
                 A()
@@ -167,11 +174,12 @@
                 A()
             }
         """
-    )
+        )
 
     @Test
-    fun testInline_CM3_RFun_CM3_RFun() = verifyInlineReturn(
-        """
+    fun testInline_CM3_RFun_CM3_RFun() =
+        verifyInlineReturn(
+            """
             @Composable
             fun Test(a: Boolean, b: Boolean) {
                 A()
@@ -192,11 +200,12 @@
                 A()
             }
         """
-    )
+        )
 
     @Test
-    fun testInline_CM3_RM3() = verifyInlineReturn(
-        """
+    fun testInline_CM3_RM3() =
+        verifyInlineReturn(
+            """
             @Composable
             fun Test(condition: Boolean) {
                 A()
@@ -210,11 +219,12 @@
                 A()
             }
         """
-    )
+        )
 
     @Test
-    fun testInline_Lambda() = verifyGoldenComposeIrTransform(
-        """
+    fun testInline_Lambda() =
+        verifyGoldenComposeIrTransform(
+            """
             fun Test(condition: Boolean) {
                 T {
                     compose {
@@ -225,7 +235,7 @@
                 }
             }
         """,
-        """
+            """
             import androidx.compose.runtime.*
 
             class Scope {
@@ -240,11 +250,12 @@
             @Composable
             fun Text(text: String) { }
         """
-    )
+        )
 
     @Test
-    fun testInline_M3_M1_Return_M1() = verifyInlineReturn(
-        """
+    fun testInline_M3_M1_Return_M1() =
+        verifyInlineReturn(
+            """
             @Composable
             fun Test_M3_M1_Return_M1(condition: Boolean) {
                 A()
@@ -260,11 +271,12 @@
                 A()
             }
         """
-    )
+        )
 
     @Test
-    fun testInline_M3_M1_Return_M3() = verifyInlineReturn(
-        """
+    fun testInline_M3_M1_Return_M3() =
+        verifyInlineReturn(
+            """
             @Composable
             fun Test_M3_M1_Return_M3(condition: Boolean) {
                 A()
@@ -280,11 +292,12 @@
                 A()
             }
         """
-    )
+        )
 
     @Test
-    fun testInline_M1_W_Return_Func() = verifyInlineReturn(
-        """
+    fun testInline_M1_W_Return_Func() =
+        verifyInlineReturn(
+            """
             @Composable
             fun testInline_M1_W_Return_Func(condition: Boolean) {
                 A()
@@ -302,11 +315,12 @@
                 A()
             }
         """
-    )
+        )
 
     @Test
-    fun testInline_CM3_Return_M3_CM3_Return_M3() = verifyInlineReturn(
-        """
+    fun testInline_CM3_Return_M3_CM3_Return_M3() =
+        verifyInlineReturn(
+            """
             @Composable
             fun testInline_M1_W_Return_Func(condition: Boolean) {
                 A()
@@ -327,11 +341,12 @@
                 A()
             }
         """
-    )
+        )
 
     @Test
-    fun test_CM1_CCM1_RetFun(): Unit = verifyInlineReturn(
-        """
+    fun test_CM1_CCM1_RetFun(): Unit =
+        verifyInlineReturn(
+            """
             @Composable
             fun test_CM1_CCM1_RetFun(condition: Boolean) {
                 Text("Root - before")
@@ -349,11 +364,12 @@
                 Text("Root - end")
             }
         """
-    )
+        )
 
     @Test
-    fun testInlineReturnLabel(): Unit = controlFlow(
-        """
+    fun testInlineReturnLabel(): Unit =
+        controlFlow(
+            """
             @Composable
             @NonRestartableComposable
             fun CustomTextBroken(condition: Boolean) {
@@ -369,11 +385,12 @@
                 content()
             }
         """
-    )
+        )
 
     @Test // regression 255350755
-    fun testEnsureEarlyExitInNonInline_NormalComposable() = controlFlow(
-        """
+    fun testEnsureEarlyExitInNonInline_NormalComposable() =
+        controlFlow(
+            """
             object obj {
                 val condition = true
             }
@@ -387,11 +404,12 @@
                 A()
             }
         """
-    )
+        )
 
     @Test // regression 255350755
-    fun testEnsureEarlyExitInNonInline_ReadOnlyComposable() = controlFlow(
-        """
+    fun testEnsureEarlyExitInNonInline_ReadOnlyComposable() =
+        controlFlow(
+            """
             import androidx.compose.runtime.currentComposer
 
             object obj {
@@ -409,11 +427,12 @@
                 }
             }
         """
-    )
+        )
 
     @Test // regression 255350755
-    fun testEnsureEarlyExitInInline_Labeled() = controlFlow(
-        """
+    fun testEnsureEarlyExitInInline_Labeled() =
+        controlFlow(
+            """
             @Composable
             fun Test(condition: Boolean) {
                 IW iw@ {
@@ -422,11 +441,13 @@
                 }
             }
         """
-    )
+        )
 
     @Test
-    fun testVerifyEarlyExitFromNonComposable() = verifyInlineReturn(
-        source = """
+    fun testVerifyEarlyExitFromNonComposable() =
+        verifyInlineReturn(
+            source =
+                """
             @Composable
             fun Test(condition: Boolean) {
                 Text("Some text")
@@ -436,11 +457,13 @@
                 Text("Some more text")
             }
         """
-    )
+        )
 
     @Test
-    fun testVerifyEarlyExitFromNonComposable_M1() = verifyInlineReturn(
-        source = """
+    fun testVerifyEarlyExitFromNonComposable_M1() =
+        verifyInlineReturn(
+            source =
+                """
             @Composable
             fun Test(condition: Boolean) {
                 Text("Some text")
@@ -452,11 +475,13 @@
                 Text("Some more text")
             }
         """
-    )
+        )
 
     @Test
-    fun testVerifyEarlyExitFromNonComposable_M1_RM1() = verifyInlineReturn(
-        source = """
+    fun testVerifyEarlyExitFromNonComposable_M1_RM1() =
+        verifyInlineReturn(
+            source =
+                """
             @Composable
             fun Test(condition: Boolean) {
                 Text("Some text")
@@ -468,11 +493,13 @@
                 Text("Some more text")
             }
         """
-    )
+        )
 
     @Test
-    fun verifyEarlyExitFromNestedInlineFunction() = verifyGoldenComposeIrTransform(
-        source = """
+    fun verifyEarlyExitFromNestedInlineFunction() =
+        verifyGoldenComposeIrTransform(
+            source =
+                """
             import androidx.compose.runtime.*
 
             @Composable
@@ -491,7 +518,8 @@
                 Text("Before outer")
             }
         """,
-        extra = """
+            extra =
+                """
             import androidx.compose.runtime.*
 
             @Composable
@@ -507,11 +535,13 @@
                 content()
             }
         """
-    )
+        )
 
     @Test
-    fun verifyEarlyExitFromMultiLevelNestedInlineFunction() = verifyGoldenComposeIrTransform(
-        source = """
+    fun verifyEarlyExitFromMultiLevelNestedInlineFunction() =
+        verifyGoldenComposeIrTransform(
+            source =
+                """
             import androidx.compose.runtime.*
 
             @Composable
@@ -530,7 +560,8 @@
                 Text("Before outer")
             }
         """,
-        extra = """
+            extra =
+                """
             import androidx.compose.runtime.*
 
             @Composable
@@ -546,7 +577,7 @@
                 content()
             }
         """
-    )
+        )
 
     @Test
     fun testEnsureRuntimeTestWillCompile_CL() {
@@ -578,8 +609,9 @@
     }
 
     @Test // regression 255350755
-    fun testEnsureRuntimeTestWillCompile_CG() = verifyGoldenComposeIrTransform(
-        """
+    fun testEnsureRuntimeTestWillCompile_CG() =
+        verifyGoldenComposeIrTransform(
+            """
             import androidx.compose.runtime.Composable
 
             @Composable
@@ -594,7 +626,8 @@
             }
 
         """,
-        extra = """
+            extra =
+                """
             import androidx.compose.runtime.Composable
             import androidx.compose.runtime.NonRestartableComposable
 
@@ -607,11 +640,12 @@
             @Composable @NonRestartableComposable
             fun Text(value: String) { }
         """
-    )
+        )
 
     @Test
-    fun testIfElseWithCallsInConditions(): Unit = controlFlow(
-        """
+    fun testIfElseWithCallsInConditions(): Unit =
+        controlFlow(
+            """
             @NonRestartableComposable @Composable
             fun Example(x: Int) {
                 // Since the condition in the else-if is conditionally executed, it means we have
@@ -628,11 +662,12 @@
                 }
             }
         """
-    )
+        )
 
     @Test
-    fun testWhenWithSubjectAndNoCalls(): Unit = controlFlow(
-        """
+    fun testWhenWithSubjectAndNoCalls(): Unit =
+        controlFlow(
+            """
             @NonRestartableComposable @Composable
             fun Example(x: Int) {
                 // nothing needed except for the function boundary group
@@ -643,11 +678,12 @@
                 }
             }
         """
-    )
+        )
 
     @Test
-    fun testWhenWithSubjectAndCalls(): Unit = controlFlow(
-        """
+    fun testWhenWithSubjectAndCalls(): Unit =
+        controlFlow(
+            """
             @NonRestartableComposable @Composable
             fun Example(x: Int) {
                 // calls only in the result block, which means we can statically guarantee the
@@ -660,11 +696,12 @@
                 }
             }
         """
-    )
+        )
 
     @Test
-    fun testWhenWithSubjectAndCallsWithResult(): Unit = controlFlow(
-        """
+    fun testWhenWithSubjectAndCallsWithResult(): Unit =
+        controlFlow(
+            """
             @NonRestartableComposable @Composable
             fun Example(x: Int) {
                 // no need for a group around the when expression overall, but since the result
@@ -677,11 +714,12 @@
                 }
             }
         """
-    )
+        )
 
     @Test
-    fun testWhenWithCalls(): Unit = controlFlow(
-        """
+    fun testWhenWithCalls(): Unit =
+        controlFlow(
+            """
             @NonRestartableComposable @Composable
             fun Example(x: Int) {
                 // result blocks have composable calls, so we generate groups round them. It's a
@@ -694,11 +732,12 @@
                 }
             }
         """
-    )
+        )
 
     @Test
-    fun testWhenWithCallsInSomeResults(): Unit = controlFlow(
-        """
+    fun testWhenWithCallsInSomeResults(): Unit =
+        controlFlow(
+            """
             @NonRestartableComposable @Composable
             fun Example(x: Int) {
                 // result blocks have composable calls, so we generate groups round them. It's a
@@ -711,11 +750,12 @@
                 }
             }
         """
-    )
+        )
 
     @Test
-    fun testWhenWithCallsInConditions(): Unit = controlFlow(
-        """
+    fun testWhenWithCallsInConditions(): Unit =
+        controlFlow(
+            """
             @NonRestartableComposable @Composable
             fun Example(x: Int) {
                 // composable calls are in the condition blocks of the when statement. Since these
@@ -729,11 +769,12 @@
                 }
             }
         """
-    )
+        )
 
     @Test
-    fun testWhenWithCallsInConditionsAndCallAfter(): Unit = controlFlow(
-        """
+    fun testWhenWithCallsInConditionsAndCallAfter(): Unit =
+        controlFlow(
+            """
             @NonRestartableComposable @Composable
             fun Example(x: Int) {
                 // composable calls are in the condition blocks of the when statement. Since these
@@ -747,11 +788,12 @@
                 A()
             }
         """
-    )
+        )
 
     @Test
-    fun testSafeCall(): Unit = controlFlow(
-        """
+    fun testSafeCall(): Unit =
+        controlFlow(
+            """
             @NonRestartableComposable @Composable
             fun Example(x: Int?) {
                 // The composable call is made conditionally, which means it is like an if with
@@ -760,11 +802,12 @@
                 x?.A()
             }
         """
-    )
+        )
 
     @Test
-    fun testElvis(): Unit = controlFlow(
-        """
+    fun testElvis(): Unit =
+        controlFlow(
+            """
             @NonRestartableComposable @Composable
             fun Example(x: Int?) {
                 // The composable call is made conditionally, which means it is like an if, but with
@@ -773,11 +816,12 @@
                 val y = x ?: R()
             }
         """
-    )
+        )
 
     @Test
-    fun testForLoopWithCallsInBody(): Unit = controlFlow(
-        """
+    fun testForLoopWithCallsInBody(): Unit =
+        controlFlow(
+            """
             @NonRestartableComposable @Composable
             fun Example(items: List<Int>) {
                 // The composable call is made a conditional number of times, so we need to wrap
@@ -788,11 +832,12 @@
                 }
             }
         """
-    )
+        )
 
     @Test
-    fun testForLoopWithCallsInBodyAndCallsAfter(): Unit = controlFlow(
-        """
+    fun testForLoopWithCallsInBodyAndCallsAfter(): Unit =
+        controlFlow(
+            """
             @NonRestartableComposable @Composable
             fun Example(items: List<Int>) {
                 // The composable call is made a conditional number of times, so we need to wrap
@@ -803,11 +848,12 @@
                 A()
             }
         """
-    )
+        )
 
     @Test
-    fun testForLoopWithCallsInSubject(): Unit = controlFlow(
-        """
+    fun testForLoopWithCallsInSubject(): Unit =
+        controlFlow(
+            """
             @NonRestartableComposable @Composable
             fun Example() {
                 // The for loop's subject expression is only executed once, so we don't need any
@@ -817,11 +863,12 @@
                 }
             }
         """
-    )
+        )
 
     @Test
-    fun testWhileLoopWithCallsInBody(): Unit = controlFlow(
-        """
+    fun testWhileLoopWithCallsInBody(): Unit =
+        controlFlow(
+            """
             @NonRestartableComposable @Composable
             fun Example(items: MutableList<Int>) {
                 // since we have a composable call which is called a conditional number of times,
@@ -834,11 +881,12 @@
                 }
             }
         """
-    )
+        )
 
     @Test
-    fun testWhileLoopWithCallsInBodyAndCallsAfter(): Unit = controlFlow(
-        """
+    fun testWhileLoopWithCallsInBodyAndCallsAfter(): Unit =
+        controlFlow(
+            """
             @NonRestartableComposable @Composable
             fun Example(items: MutableList<Int>) {
                 // since we have a composable call which is called a conditional number of times,
@@ -851,11 +899,12 @@
                 A()
             }
         """
-    )
+        )
 
     @Test
-    fun testWhileLoopWithCallsInCondition(): Unit = controlFlow(
-        """
+    fun testWhileLoopWithCallsInCondition(): Unit =
+        controlFlow(
+            """
             @NonRestartableComposable @Composable
             fun Example() {
                 // A while loop's condition block gets executed a conditional number of times, so
@@ -866,11 +915,12 @@
                 }
             }
         """
-    )
+        )
 
     @Test
-    fun testWhileLoopWithCallsInConditionAndCallsAfter(): Unit = controlFlow(
-        """
+    fun testWhileLoopWithCallsInConditionAndCallsAfter(): Unit =
+        controlFlow(
+            """
             @NonRestartableComposable @Composable
             fun Example() {
                 // A while loop's condition block gets executed a conditional number of times, so
@@ -881,11 +931,12 @@
                 A()
             }
         """
-    )
+        )
 
     @Test
-    fun testWhileLoopWithCallsInConditionAndBody(): Unit = controlFlow(
-        """
+    fun testWhileLoopWithCallsInConditionAndBody(): Unit =
+        controlFlow(
+            """
             @NonRestartableComposable @Composable
             fun Example() {
                 // Both the condition and the body of the loop get groups because they have
@@ -896,11 +947,12 @@
                 }
             }
         """
-    )
+        )
 
     @Test
-    fun testWhileLoopWithCallsInConditionAndBodyAndCallsAfter(): Unit = controlFlow(
-        """
+    fun testWhileLoopWithCallsInConditionAndBodyAndCallsAfter(): Unit =
+        controlFlow(
+            """
             @NonRestartableComposable @Composable
             fun Example() {
                 // Both the condition and the body of the loop get groups because they have
@@ -912,11 +964,12 @@
                 A(b)
             }
         """
-    )
+        )
 
     @Test
-    fun testEarlyReturnWithCallsBeforeButNotAfter(): Unit = controlFlow(
-        """
+    fun testEarlyReturnWithCallsBeforeButNotAfter(): Unit =
+        controlFlow(
+            """
             @NonRestartableComposable @Composable
             fun Example(x: Int) {
                 // in the early return path, we need only close out the opened groups
@@ -927,11 +980,12 @@
                 print("hello")
             }
         """
-    )
+        )
 
     @Test
-    fun testEarlyReturnWithCallsAfterButNotBefore(): Unit = controlFlow(
-        """
+    fun testEarlyReturnWithCallsAfterButNotBefore(): Unit =
+        controlFlow(
+            """
             @NonRestartableComposable @Composable
             fun Example(x: Int) {
                 // we can just close out the open groups at the return.
@@ -941,11 +995,12 @@
                 A()
             }
         """
-    )
+        )
 
     @Test
-    fun testEarlyReturnValue(): Unit = controlFlow(
-        """
+    fun testEarlyReturnValue(): Unit =
+        controlFlow(
+            """
             @NonRestartableComposable @Composable
             fun Example(x: Int): Int {
                 if (x > 0) {
@@ -955,11 +1010,12 @@
                 return 2
             }
         """
-    )
+        )
 
     @Test
-    fun testEarlyReturnValueWithCallsAfter(): Unit = controlFlow(
-        """
+    fun testEarlyReturnValueWithCallsAfter(): Unit =
+        controlFlow(
+            """
             @NonRestartableComposable @Composable
             fun Example(x: Int): Int {
                 if (x > 0) {
@@ -969,11 +1025,12 @@
                 return 2
             }
         """
-    )
+        )
 
     @Test
-    fun testReturnCallValue(): Unit = controlFlow(
-        """
+    fun testReturnCallValue(): Unit =
+        controlFlow(
+            """
             @NonRestartableComposable @Composable
             fun Example(): Int {
                 // since the return expression is a composable call, we need to generate a
@@ -982,11 +1039,12 @@
                 return R()
             }
         """
-    )
+        )
 
     @Test
-    fun testEarlyReturnCallValue(): Unit = controlFlow(
-        """
+    fun testEarlyReturnCallValue(): Unit =
+        controlFlow(
+            """
             @NonRestartableComposable @Composable
             fun Example(x: Int): Int {
                 if (x > 0) {
@@ -995,11 +1053,12 @@
                 return R()
             }
         """
-    )
+        )
 
     @Test
-    fun testReturnFromLoop(): Unit = controlFlow(
-        """
+    fun testReturnFromLoop(): Unit =
+        controlFlow(
+            """
             @NonRestartableComposable @Composable
             fun Example(items: Iterator<Int>) {
                 while (items.hasNext()) {
@@ -1018,11 +1077,12 @@
                 }
             }
         """
-    )
+        )
 
     @Test
-    fun testOrderingOfPushedEndCallsWithEarlyReturns(): Unit = controlFlow(
-        """
+    fun testOrderingOfPushedEndCallsWithEarlyReturns(): Unit =
+        controlFlow(
+            """
             @Composable
             fun Example(items: Iterator<Int>) {
                 while (items.hasNext()) {
@@ -1041,11 +1101,12 @@
                 }
             }
         """
-    )
+        )
 
     @Test
-    fun testBreakWithCallsAfter(): Unit = controlFlow(
-        """
+    fun testBreakWithCallsAfter(): Unit =
+        controlFlow(
+            """
             @NonRestartableComposable @Composable
             fun Example(items: Iterator<Int>) {
                 while (items.hasNext()) {
@@ -1057,11 +1118,12 @@
                 }
             }
         """
-    )
+        )
 
     @Test
-    fun testBreakWithCallsBefore(): Unit = controlFlow(
-        """
+    fun testBreakWithCallsBefore(): Unit =
+        controlFlow(
+            """
             @NonRestartableComposable @Composable
             fun Example(items: Iterator<Int>) {
                 while (items.hasNext()) {
@@ -1073,11 +1135,12 @@
                 }
             }
         """
-    )
+        )
 
     @Test
-    fun testBreakWithCallsBeforeAndAfter(): Unit = controlFlow(
-        """
+    fun testBreakWithCallsBeforeAndAfter(): Unit =
+        controlFlow(
+            """
             @NonRestartableComposable @Composable
             fun Example(items: Iterator<Int>) {
                 // a group around while is needed here, but the function body group will suffice
@@ -1092,11 +1155,12 @@
                 }
             }
         """
-    )
+        )
 
     @Test
-    fun testBreakWithCallsBeforeAndAfterAndCallAfter(): Unit = controlFlow(
-        """
+    fun testBreakWithCallsBeforeAndAfterAndCallAfter(): Unit =
+        controlFlow(
+            """
             @NonRestartableComposable @Composable
             fun Example(items: Iterator<Int>) {
                 // a group around while is needed here
@@ -1111,11 +1175,12 @@
                 A()
             }
         """
-    )
+        )
 
     @Test
-    fun testContinueWithCallsAfter(): Unit = controlFlow(
-        """
+    fun testContinueWithCallsAfter(): Unit =
+        controlFlow(
+            """
             @NonRestartableComposable @Composable
             fun Example(items: Iterator<Int>) {
                 while (items.hasNext()) {
@@ -1127,11 +1192,12 @@
                 }
             }
         """
-    )
+        )
 
     @Test
-    fun testContinueWithCallsBefore(): Unit = controlFlow(
-        """
+    fun testContinueWithCallsBefore(): Unit =
+        controlFlow(
+            """
             @NonRestartableComposable @Composable
             fun Example(items: Iterator<Int>) {
                 while (items.hasNext()) {
@@ -1144,11 +1210,12 @@
                 }
             }
         """
-    )
+        )
 
     @Test
-    fun testContinueWithCallsBeforeAndAfter(): Unit = controlFlow(
-        """
+    fun testContinueWithCallsBeforeAndAfter(): Unit =
+        controlFlow(
+            """
             @NonRestartableComposable @Composable
             fun Example(items: Iterator<Int>) {
                 while (items.hasNext()) {
@@ -1161,11 +1228,12 @@
                 }
             }
         """
-    )
+        )
 
     @Test
-    fun testLoopWithReturn(): Unit = controlFlow(
-        """
+    fun testLoopWithReturn(): Unit =
+        controlFlow(
+            """
             @NonRestartableComposable @Composable
             fun Example(a: Iterator<Int>, b: Iterator<Int>) {
                 while (a.hasNext()) {
@@ -1177,11 +1245,12 @@
                 }
             }
         """
-    )
+        )
 
     @Test
-    fun testLoopWithBreak(): Unit = controlFlow(
-        """
+    fun testLoopWithBreak(): Unit =
+        controlFlow(
+            """
             @NonRestartableComposable @Composable
             fun Example(a: Iterator<Int>, b: Iterator<Int>) {
                 a@while (a.hasNext()) {
@@ -1197,11 +1266,12 @@
                 }
             }
         """
-    )
+        )
 
     @Test
-    fun testNestedLoopsAndBreak(): Unit = controlFlow(
-        """
+    fun testNestedLoopsAndBreak(): Unit =
+        controlFlow(
+            """
             @NonRestartableComposable @Composable
             fun Example(a: Iterator<Int>, b: Iterator<Int>) {
                 a@while (a.hasNext()) {
@@ -1226,11 +1296,12 @@
                 }
             }
         """
-    )
+        )
 
     @Test
-    fun testNestedLoops(): Unit = controlFlow(
-        """
+    fun testNestedLoops(): Unit =
+        controlFlow(
+            """
             @NonRestartableComposable @Composable
             fun Example(a: Iterator<Int>, b: Iterator<Int>) {
                 a@while (a.hasNext()) {
@@ -1242,11 +1313,12 @@
                 A()
             }
         """
-    )
+        )
 
     @Test
-    fun testWhileInsideIfAndCallAfter(): Unit = controlFlow(
-        """
+    fun testWhileInsideIfAndCallAfter(): Unit =
+        controlFlow(
+            """
             @NonRestartableComposable @Composable
             fun Example(x: Int) {
                 if (x > 0) {
@@ -1257,11 +1329,12 @@
                 }
             }
         """
-    )
+        )
 
     @Test
-    fun testWhileInsideIfAndCallBefore(): Unit = controlFlow(
-        """
+    fun testWhileInsideIfAndCallBefore(): Unit =
+        controlFlow(
+            """
             @NonRestartableComposable @Composable
             fun Example(x: Int) {
                 if (x > 0) {
@@ -1272,11 +1345,12 @@
                 }
             }
         """
-    )
+        )
 
     @Test
-    fun testWhileInsideIf(): Unit = controlFlow(
-        """
+    fun testWhileInsideIf(): Unit =
+        controlFlow(
+            """
             @NonRestartableComposable @Composable
             fun Example(x: Int) {
                 if (x > 0) {
@@ -1286,11 +1360,12 @@
                 }
             }
         """
-    )
+        )
 
     @Test
-    fun testWhileWithKey(): Unit = controlFlow(
-        """
+    fun testWhileWithKey(): Unit =
+        controlFlow(
+            """
             @NonRestartableComposable @Composable
             fun Example(x: Int) {
                 while (x > 0) {
@@ -1300,11 +1375,12 @@
                 }
             }
         """
-    )
+        )
 
     @Test
-    fun testWhileWithTwoKeys(): Unit = controlFlow(
-        """
+    fun testWhileWithTwoKeys(): Unit =
+        controlFlow(
+            """
             @NonRestartableComposable @Composable
             fun Example(x: Int) {
                 while (x > 0) {
@@ -1317,11 +1393,12 @@
                 }
             }
         """
-    )
+        )
 
     @Test
-    fun testWhileWithKeyAndCallAfter(): Unit = controlFlow(
-        """
+    fun testWhileWithKeyAndCallAfter(): Unit =
+        controlFlow(
+            """
             @NonRestartableComposable @Composable
             fun Example(x: Int) {
                 while (x > 0) {
@@ -1332,11 +1409,12 @@
                 }
             }
         """
-    )
+        )
 
     @Test
-    fun testWhileWithKeyAndCallBefore(): Unit = controlFlow(
-        """
+    fun testWhileWithKeyAndCallBefore(): Unit =
+        controlFlow(
+            """
             @NonRestartableComposable @Composable
             fun Example(x: Int) {
                 while (x > 0) {
@@ -1347,11 +1425,12 @@
                 }
             }
         """
-    )
+        )
 
     @Test
-    fun testWhileWithKeyAndCallBeforeAndAfter(): Unit = controlFlow(
-        """
+    fun testWhileWithKeyAndCallBeforeAndAfter(): Unit =
+        controlFlow(
+            """
             @NonRestartableComposable @Composable
             fun Example(x: Int) {
                 while (x > 0) {
@@ -1363,11 +1442,12 @@
                 }
             }
         """
-    )
+        )
 
     @Test
-    fun testKeyAtRootLevel(): Unit = controlFlow(
-        """
+    fun testKeyAtRootLevel(): Unit =
+        controlFlow(
+            """
             @NonRestartableComposable @Composable
             fun Example(x: Int) {
                 key(x) {
@@ -1375,11 +1455,12 @@
                 }
             }
         """
-    )
+        )
 
     @Test
-    fun testKeyAtRootLevelAndCallsAfter(): Unit = controlFlow(
-        """
+    fun testKeyAtRootLevelAndCallsAfter(): Unit =
+        controlFlow(
+            """
             @NonRestartableComposable @Composable
             fun Example(x: Int) {
                 key(x) {
@@ -1388,11 +1469,12 @@
                 A(b)
             }
         """
-    )
+        )
 
     @Test
-    fun testKeyAtRootLevelAndCallsBefore(): Unit = controlFlow(
-        """
+    fun testKeyAtRootLevelAndCallsBefore(): Unit =
+        controlFlow(
+            """
             @NonRestartableComposable @Composable
             fun Example(x: Int) {
                 A(a)
@@ -1401,11 +1483,12 @@
                 }
             }
         """
-    )
+        )
 
     @Test
-    fun testKeyInIf(): Unit = controlFlow(
-        """
+    fun testKeyInIf(): Unit =
+        controlFlow(
+            """
             @NonRestartableComposable @Composable
             fun Example(x: Int) {
                 if (x > 0) {
@@ -1415,11 +1498,12 @@
                 }
             }
         """
-    )
+        )
 
     @Test
-    fun testKeyInIfAndCallsAfter(): Unit = controlFlow(
-        """
+    fun testKeyInIfAndCallsAfter(): Unit =
+        controlFlow(
+            """
             @NonRestartableComposable @Composable
             fun Example(x: Int) {
                 if (x > 0) {
@@ -1430,11 +1514,12 @@
                 }
             }
         """
-    )
+        )
 
     @Test
-    fun testKeyInIfAndCallsBefore(): Unit = controlFlow(
-        """
+    fun testKeyInIfAndCallsBefore(): Unit =
+        controlFlow(
+            """
             @NonRestartableComposable @Composable
             fun Example(x: Int) {
                 if (x > 0) {
@@ -1445,11 +1530,12 @@
                 }
             }
         """
-    )
+        )
 
     @Test
-    fun testKeyWithLotsOfValues(): Unit = controlFlow(
-        """
+    fun testKeyWithLotsOfValues(): Unit =
+        controlFlow(
+            """
             @NonRestartableComposable @Composable
             fun Example(a: Int, b: Int, c: Int, d: Int) {
                 key(a, b, c, d) {
@@ -1457,11 +1543,12 @@
                 }
             }
         """
-    )
+        )
 
     @Test
-    fun testKeyWithComposableValue(): Unit = controlFlow(
-        """
+    fun testKeyWithComposableValue(): Unit =
+        controlFlow(
+            """
             @NonRestartableComposable @Composable
             fun Example(x: Int) {
                 while(x > 0) {
@@ -1471,22 +1558,24 @@
                 }
             }
         """
-    )
+        )
 
     @Test
-    fun testKeyAsAValue(): Unit = controlFlow(
-        """
+    fun testKeyAsAValue(): Unit =
+        controlFlow(
+            """
             @NonRestartableComposable @Composable
             fun Example(x: Int) {
                 val y = key(x) { R() }
                 P(y)
             }
         """
-    )
+        )
 
     @Test
-    fun testDynamicWrappingGroupWithReturnValue(): Unit = controlFlow(
-        """
+    fun testDynamicWrappingGroupWithReturnValue(): Unit =
+        controlFlow(
+            """
             @NonRestartableComposable @Composable
             fun Example(x: Int): Int {
                 return if (x > 0) {
@@ -1496,11 +1585,12 @@
                 } else 4
             }
         """
-    )
+        )
 
     @Test
-    fun testTheThing(): Unit = controlFlow(
-        """
+    fun testTheThing(): Unit =
+        controlFlow(
+            """
             @NonRestartableComposable
             @Composable
             fun Simple() {
@@ -1543,11 +1633,12 @@
               }
             }
         """
-    )
+        )
 
     @Test
-    fun testLetWithComposableCalls(): Unit = controlFlow(
-        """
+    fun testLetWithComposableCalls(): Unit =
+        controlFlow(
+            """
             @Composable
             fun Example(x: Int?) {
               x?.let {
@@ -1559,11 +1650,12 @@
               A(c)
             }
         """
-    )
+        )
 
     @Test
-    fun testLetWithoutComposableCalls(): Unit = controlFlow(
-        """
+    fun testLetWithoutComposableCalls(): Unit =
+        controlFlow(
+            """
             @Composable
             fun Example(x: Int?) {
               x?.let {
@@ -1575,11 +1667,12 @@
               A()
             }
         """
-    )
+        )
 
     @Test
-    fun testApplyOnComposableCallResult(): Unit = controlFlow(
-        """
+    fun testApplyOnComposableCallResult(): Unit =
+        controlFlow(
+            """
             import androidx.compose.runtime.mutableStateOf
             import androidx.compose.runtime.remember
             import androidx.compose.runtime.State
@@ -1589,11 +1682,12 @@
                 this.value = value
             }
         """
-    )
+        )
 
     @Test
-    fun testReturnInlinedExpressionWithCall(): Unit = controlFlow(
-        """
+    fun testReturnInlinedExpressionWithCall(): Unit =
+        controlFlow(
+            """
             import androidx.compose.runtime.mutableStateOf
             import androidx.compose.runtime.remember
             import androidx.compose.runtime.State
@@ -1606,11 +1700,12 @@
                 }
             }
         """
-    )
+        )
 
     @Test
-    fun testCallingAWrapperComposable(): Unit = controlFlow(
-        """
+    fun testCallingAWrapperComposable(): Unit =
+        controlFlow(
+            """
             @Composable
             fun Test() {
               W {
@@ -1618,11 +1713,12 @@
               }
             }
         """
-    )
+        )
 
     @Test
-    fun testCallingAnInlineWrapperComposable(): Unit = controlFlow(
-        """
+    fun testCallingAnInlineWrapperComposable(): Unit =
+        controlFlow(
+            """
             @Composable
             fun Test() {
               IW {
@@ -1630,11 +1726,12 @@
               }
             }
         """
-    )
+        )
 
     @Test
-    fun testRepeatedCallsToEffects(): Unit = verifyGoldenComposeIrTransform(
-        """
+    fun testRepeatedCallsToEffects(): Unit =
+        verifyGoldenComposeIrTransform(
+            """
             import androidx.compose.runtime.Composable
 
             @Composable
@@ -1647,7 +1744,7 @@
                 }
             }
         """,
-        """
+            """
             import androidx.compose.runtime.Composable
 
             var effects = mutableListOf<Any>()
@@ -1657,23 +1754,24 @@
             @Composable fun Wrap(block: @Composable () -> Unit) =  block()
             @Composable fun <T> effect(block: () -> T): T = block()
         """
-
-    )
+        )
 
     @Test
-    fun testComposableWithInlineClass(): Unit = controlFlow(
-        """
+    fun testComposableWithInlineClass(): Unit =
+        controlFlow(
+            """
             @Composable
             fun Test(value: InlineClass) {
                 used(value)
                 A()
             }
         """
-    )
+        )
 
     @Test
-    fun testParameterOrderInformation(): Unit = controlFlow(
-        """
+    fun testParameterOrderInformation(): Unit =
+        controlFlow(
+            """
             @Composable fun Test01(p0: Int, p1: Int, p2: Int, p3: Int) {
                 used(p0)
                 used(p1)
@@ -1819,11 +1917,13 @@
                 used(p3)
             }
         """
-    )
+        )
 
     @Test
-    fun testSourceInformationWithPackageName(): Unit = verifyGoldenComposeIrTransform(
-        source = """
+    fun testSourceInformationWithPackageName(): Unit =
+        verifyGoldenComposeIrTransform(
+            source =
+                """
             package androidx.compose.runtime.tests
 
             import androidx.compose.runtime.Composable
@@ -1833,18 +1933,21 @@
                 used(value)
             }
         """,
-        extra = """
+            extra =
+                """
             package androidx.compose.runtime.tests
 
             inline class LocalInlineClass(val value: Int)
             fun used(x: Any?) {}
         """,
-        truncateTracingInfoMode = TruncateTracingInfoMode.KEEP_INFO_STRING
-    )
+            truncateTracingInfoMode = TruncateTracingInfoMode.KEEP_INFO_STRING
+        )
 
     @Test
-    fun testSourceOffsetOrderForParameterExpressions(): Unit = verifyGoldenComposeIrTransform(
-        source = """
+    fun testSourceOffsetOrderForParameterExpressions(): Unit =
+        verifyGoldenComposeIrTransform(
+            source =
+                """
             import androidx.compose.runtime.Composable
 
             @Composable
@@ -1853,7 +1956,8 @@
                 B()
             }
         """,
-        extra = """
+            extra =
+                """
             import androidx.compose.runtime.Composable
 
             @Composable fun A(a: Int, b: Int, c: Int) { }
@@ -1862,12 +1966,14 @@
             @Composable fun c(): Int = 1
             @Composable fun d(): Int = 1
         """,
-        truncateTracingInfoMode = TruncateTracingInfoMode.KEEP_INFO_STRING
-    )
+            truncateTracingInfoMode = TruncateTracingInfoMode.KEEP_INFO_STRING
+        )
 
     @Test
-    fun testSourceLocationOfCapturingComposableLambdas(): Unit = verifyGoldenComposeIrTransform(
-        source = """
+    fun testSourceLocationOfCapturingComposableLambdas(): Unit =
+        verifyGoldenComposeIrTransform(
+            source =
+                """
             import androidx.compose.runtime.Composable
 
             class SomeClass {
@@ -1888,18 +1994,21 @@
                 }
             }
         """,
-        extra = """
+            extra =
+                """
             import androidx.compose.runtime.Composable
 
             fun setContent(block: @Composable () -> Unit) { }
             @Composable fun B(value: String) { }
         """,
-        truncateTracingInfoMode = TruncateTracingInfoMode.KEEP_INFO_STRING
-    )
+            truncateTracingInfoMode = TruncateTracingInfoMode.KEEP_INFO_STRING
+        )
 
     @Test
-    fun testSourceLineInformationForNormalInline(): Unit = verifyGoldenComposeIrTransform(
-        source = """
+    fun testSourceLineInformationForNormalInline(): Unit =
+        verifyGoldenComposeIrTransform(
+            source =
+                """
             import androidx.compose.runtime.Composable
 
             @Composable
@@ -1915,19 +2024,21 @@
               }
             }
         """,
-        extra = """
+            extra =
+                """
             import androidx.compose.runtime.Composable
 
             @Composable fun W(block: @Composable () -> Unit) = block()
             @Composable inline fun IW(block: @Composable () -> Unit) = block()
             @Composable fun T(value: Int) { }
         """,
-        truncateTracingInfoMode = TruncateTracingInfoMode.KEEP_INFO_STRING
-    )
+            truncateTracingInfoMode = TruncateTracingInfoMode.KEEP_INFO_STRING
+        )
 
     @Test
-    fun testInlineReadOnlySourceLocations() = verifyGoldenComposeIrTransform(
-        """
+    fun testInlineReadOnlySourceLocations() =
+        verifyGoldenComposeIrTransform(
+            """
             import androidx.compose.runtime.Composable
             import androidx.compose.runtime.ReadOnlyComposable
 
@@ -1951,7 +2062,7 @@
                 }
             }
         """,
-        """
+            """
             import androidx.compose.runtime.Composable
 
             @Composable
@@ -1960,12 +2071,13 @@
             @Composable
             fun Text(text: String) { }
         """,
-        truncateTracingInfoMode = TruncateTracingInfoMode.KEEP_INFO_STRING
-    )
+            truncateTracingInfoMode = TruncateTracingInfoMode.KEEP_INFO_STRING
+        )
 
     @Test
-    fun testReadOnlyInlineValSourceLocations() = verifyGoldenComposeIrTransform(
-        """
+    fun testReadOnlyInlineValSourceLocations() =
+        verifyGoldenComposeIrTransform(
+            """
             import androidx.compose.runtime.Composable
             import androidx.compose.runtime.ReadOnlyComposable
 
@@ -2001,7 +2113,7 @@
                 }
             }
         """,
-        """
+            """
             import androidx.compose.runtime.Composable
 
             @Composable
@@ -2010,12 +2122,14 @@
             @Composable
             fun Text(text: String) { }
         """,
-        truncateTracingInfoMode = TruncateTracingInfoMode.KEEP_INFO_STRING
-    )
+            truncateTracingInfoMode = TruncateTracingInfoMode.KEEP_INFO_STRING
+        )
 
     @Test
-    fun testReadOnlyComposableWithEarlyReturn() = controlFlow(
-        source = """
+    fun testReadOnlyComposableWithEarlyReturn() =
+        controlFlow(
+            source =
+                """
             @ReadOnlyComposable
             @Composable
             fun getSomeValue(a: Int): Int {
@@ -2023,11 +2137,13 @@
                 return 1
             }
         """
-    )
+        )
 
     @Test
-    fun testMultipleNestedInlines() = verifyGoldenComposeIrTransform(
-        source = """
+    fun testMultipleNestedInlines() =
+        verifyGoldenComposeIrTransform(
+            source =
+                """
             import androidx.compose.runtime.Composable
 
             @Composable
@@ -2042,7 +2158,8 @@
                 }
             }
         """,
-        extra = """
+            extra =
+                """
             import androidx.compose.runtime.Composable
 
             @Composable
@@ -2051,11 +2168,13 @@
             @Composable
             fun Leaf(default: Int = 0) {}
         """
-    )
+        )
 
     @Test // Regression test for 205590513
-    fun testGroupAroundExtensionFunctions() = verifyGoldenComposeIrTransform(
-        source = """
+    fun testGroupAroundExtensionFunctions() =
+        verifyGoldenComposeIrTransform(
+            source =
+                """
             import androidx.compose.runtime.*
 
             @Composable
@@ -2069,7 +2188,8 @@
                 }
             }
         """,
-        extra = """
+            extra =
+                """
             import androidx.compose.runtime.*
 
             class A
@@ -2084,13 +2204,14 @@
             @Composable
             fun <T> A.get(block: () -> T) = block()
         """
-    )
+        )
 
     // There are a number of "inline constructors" in the Kotlin standard library for Array types.
     // These are special cases, since normal constructors cannot be inlined.
     @Test
-    fun testInlineArrayConstructor() = verifyGoldenComposeIrTransform(
-        """
+    fun testInlineArrayConstructor() =
+        verifyGoldenComposeIrTransform(
+            """
             import androidx.compose.runtime.*
 
             @Composable
@@ -2106,11 +2227,12 @@
                 BooleanArray(n) { remember { false } }
             }
         """
-    )
+        )
 
     @Test
-    fun testComposeIrSkippingWithDefaultsRelease() = verifyGoldenComposeIrTransform(
-        """
+    fun testComposeIrSkippingWithDefaultsRelease() =
+        verifyGoldenComposeIrTransform(
+            """
             import androidx.compose.ui.text.input.TextFieldValue
             import androidx.compose.runtime.*
             import androidx.compose.foundation.layout.*
@@ -2130,8 +2252,10 @@
                     Text("${'$'}keyboardActions2")
                 }
             }
-        """.trimIndent(),
-        extra = """
+        """
+                .trimIndent(),
+            extra =
+                """
             import androidx.compose.runtime.Composable
 
             @Composable
@@ -2141,12 +2265,15 @@
                 maxLines: Int = Int.MAX_VALUE,
                 minLines: Int = 1,
             ) {}
-        """.trimIndent()
-    )
+        """
+                    .trimIndent()
+        )
 
     @Test
-    fun testRememberInConditionalCallArgument() = verifyGoldenComposeIrTransform(
-        source = """
+    fun testRememberInConditionalCallArgument() =
+        verifyGoldenComposeIrTransform(
+            source =
+                """
             import androidx.compose.runtime.*
 
             @Composable
@@ -2160,11 +2287,13 @@
                 )
             }
         """
-    )
+        )
 
     @Test
-    fun testRememberInNestedConditionalCallArgument() = verifyGoldenComposeIrTransform(
-        source = """
+    fun testRememberInNestedConditionalCallArgument() =
+        verifyGoldenComposeIrTransform(
+            source =
+                """
             import androidx.compose.runtime.*
 
             @Composable
@@ -2184,11 +2313,13 @@
                 )
             }
         """
-    )
+        )
 
     @Test
-    fun testInlineLambdaBeforeACall() = verifyGoldenComposeIrTransform(
-        source = """
+    fun testInlineLambdaBeforeACall() =
+        verifyGoldenComposeIrTransform(
+            source =
+                """
             import androidx.compose.runtime.*
 
             @Composable
@@ -2201,16 +2332,19 @@
                 return Test("AfterInline")
             }
         """,
-        extra = """
+            extra =
+                """
             import androidx.compose.runtime.*
 
             inline fun InlineNonComposable(block: () -> Unit) {}
         """
-    )
+        )
 
     @Test
-    fun testInlineLambda_nonLocalReturn() = verifyGoldenComposeIrTransform(
-        source = """
+    fun testInlineLambda_nonLocalReturn() =
+        verifyGoldenComposeIrTransform(
+            source =
+                """
             import androidx.compose.runtime.*
 
             @Composable
@@ -2222,7 +2356,8 @@
                 }
             }
         """,
-        extra = """
+            extra =
+                """
             import androidx.compose.runtime.*
 
             @Composable
@@ -2235,11 +2370,13 @@
                 block()
             }
         """
-    )
+        )
 
     @Test
-    fun testNothingBody() = verifyGoldenComposeIrTransform(
-        source = """
+    fun testNothingBody() =
+        verifyGoldenComposeIrTransform(
+            source =
+                """
         import androidx.compose.runtime.*
 
         val test1: @Composable () -> Unit = TODO()
@@ -2254,17 +2391,20 @@
             }
         }
         """,
-        extra = """
+            extra =
+                """
         import androidx.compose.runtime.*
 
         @Composable
         fun Wrapper(content: @Composable () -> Unit) = content()
         """
-    )
+        )
 
     @Test
-    fun testEarlyReturnFromCrossInlinedLambda() = verifyGoldenComposeIrTransform(
-        source = """
+    fun testEarlyReturnFromCrossInlinedLambda() =
+        verifyGoldenComposeIrTransform(
+            source =
+                """
             import androidx.compose.runtime.*
 
             @Composable
@@ -2274,17 +2414,21 @@
                 }
             }
         """,
-        extra = """
+            extra =
+                """
             import androidx.compose.runtime.*
 
             @Composable
             internal inline fun Dialog(crossinline block: @Composable () -> Unit) {}
-        """.trimIndent(),
-    )
+        """
+                    .trimIndent(),
+        )
 
     @Test
-    fun testEarlyReturnFromWhenStatement() = verifyGoldenComposeIrTransform(
-        source = """
+    fun testEarlyReturnFromWhenStatement() =
+        verifyGoldenComposeIrTransform(
+            source =
+                """
             import androidx.compose.runtime.*
 
             @Composable
@@ -2296,16 +2440,18 @@
                 }
             }
         """,
-        extra = """
+            extra =
+                """
             import androidx.compose.runtime.*
 
             @Composable fun Text(text: String) {}
         """
-    )
+        )
 
     @Test
-    fun testComposableInAnonymousObjectDelegate() = verifyGoldenComposeIrTransform(
-        """
+    fun testComposableInAnonymousObjectDelegate() =
+        verifyGoldenComposeIrTransform(
+            """
             import androidx.compose.runtime.Composable
 
                 interface A
@@ -2319,11 +2465,13 @@
                     println(a)
                 }
         """
-    )
+        )
 
     @Test
-    fun testReturnNull() = verifyGoldenComposeIrTransform(
-        source = """
+    fun testReturnNull() =
+        verifyGoldenComposeIrTransform(
+            source =
+                """
             import androidx.compose.runtime.*
 
             @Composable
@@ -2384,12 +2532,14 @@
                 Test6()
                 return Unit
             }
-        """.trimIndent()
-    )
+        """
+                    .trimIndent()
+        )
 
     @Test
-    fun testGroupsInLoops() = verifyGoldenComposeIrTransform(
-        """
+    fun testGroupsInLoops() =
+        verifyGoldenComposeIrTransform(
+            """
             import androidx.compose.runtime.*
 
             @Composable
@@ -2418,11 +2568,12 @@
                 }
             }
         """
-    )
+        )
 
     @Test
-    fun testIfWithEarlyReturnInsideInlineLambda() = verifyGoldenComposeIrTransform(
-        """
+    fun testIfWithEarlyReturnInsideInlineLambda() =
+        verifyGoldenComposeIrTransform(
+            """
             import androidx.compose.runtime.Composable
 
             @Composable fun Test() {
@@ -2436,11 +2587,12 @@
                 }
             }
         """
-    )
+        )
 
     @Test
-    fun testLambdaWithNonUnitResult() = verifyGoldenComposeIrTransform(
-        """
+    fun testLambdaWithNonUnitResult() =
+        verifyGoldenComposeIrTransform(
+            """
             import androidx.compose.runtime.*
 
             @Composable
@@ -2451,16 +2603,18 @@
                 factory()
             }
         """,
-        extra = """
+            extra =
+                """
             import androidx.compose.runtime.*
 
             fun createFactory(factory: @Composable () -> Int) = factory
         """
-    )
+        )
 
     @Test
-    fun testOverrideWithNonUnitResult() = verifyGoldenComposeIrTransform(
-        """
+    fun testOverrideWithNonUnitResult() =
+        verifyGoldenComposeIrTransform(
+            """
             import androidx.compose.runtime.*
 
             class SomeClassImpl: SomeClass() {
@@ -2468,7 +2622,7 @@
                 override fun SomeFunction(): Int = 10
             }
         """,
-        """
+            """
             import androidx.compose.runtime.*
 
             abstract class SomeClass {
@@ -2476,18 +2630,21 @@
                 abstract fun SomeFunction(): Int
             }
         """
-    )
+        )
 
     @Test
-    fun testConditionalReturnFromInline() = verifyGoldenComposeIrTransform(
-        extra = """
+    fun testConditionalReturnFromInline() =
+        verifyGoldenComposeIrTransform(
+            extra =
+                """
             import androidx.compose.runtime.*
 
             @Composable inline fun Column(content: @Composable () -> Unit) {}
             inline fun NonComposable(content: () -> Unit) {}
             @Composable fun Text(text: String) {}
         """,
-        source = """
+            source =
+                """
             import androidx.compose.runtime.*
 
             @Composable fun Test(test: Boolean) {
@@ -2508,11 +2665,13 @@
                 }
             }
         """
-    )
+        )
 
     @Test
-    fun ifInsideInlineComposableFunction() = verifyGoldenComposeIrTransform(
-        extra = """
+    fun ifInsideInlineComposableFunction() =
+        verifyGoldenComposeIrTransform(
+            extra =
+                """
             import androidx.compose.runtime.*
 
             fun interface MeasurePolicy {
@@ -2521,7 +2680,8 @@
             @Composable inline fun Layout(content: @Composable () -> Unit) {}
             @Composable fun Box() {}
         """,
-        source = """
+            source =
+                """
             import androidx.compose.runtime.*
 
             @Composable
@@ -2536,5 +2696,5 @@
                 )
             }
         """
-    )
+        )
 }
diff --git a/compose/compiler/compiler-hosted/integration-tests/src/jvmTest/kotlin/androidx/compose/compiler/plugins/kotlin/ControlFlowTransformTestsNoSource.kt b/compose/compiler/compiler-hosted/integration-tests/src/jvmTest/kotlin/androidx/compose/compiler/plugins/kotlin/ControlFlowTransformTestsNoSource.kt
index 57a4b23..25405ca 100644
--- a/compose/compiler/compiler-hosted/integration-tests/src/jvmTest/kotlin/androidx/compose/compiler/plugins/kotlin/ControlFlowTransformTestsNoSource.kt
+++ b/compose/compiler/compiler-hosted/integration-tests/src/jvmTest/kotlin/androidx/compose/compiler/plugins/kotlin/ControlFlowTransformTestsNoSource.kt
@@ -19,9 +19,8 @@
 import org.jetbrains.kotlin.config.CompilerConfiguration
 import org.junit.Test
 
-class ControlFlowTransformTestsNoSource(
-    useFir: Boolean
-) : AbstractControlFlowTransformTests(useFir) {
+class ControlFlowTransformTestsNoSource(useFir: Boolean) :
+    AbstractControlFlowTransformTests(useFir) {
     override fun CompilerConfiguration.updateConfiguration() {
         put(ComposeConfiguration.SOURCE_INFORMATION_ENABLED_KEY, false)
         put(
@@ -32,30 +31,33 @@
     }
 
     @Test
-    fun testPublicFunctionAlwaysMarkedAsCall(): Unit = controlFlow(
-        """
+    fun testPublicFunctionAlwaysMarkedAsCall(): Unit =
+        controlFlow(
+            """
             @Composable
             fun Test() {
               A(a)
               A(b)
             }
         """
-    )
+        )
 
     @Test
-    fun testPrivateFunctionDoNotGetMarkedAsCall(): Unit = controlFlow(
-        """
+    fun testPrivateFunctionDoNotGetMarkedAsCall(): Unit =
+        controlFlow(
+            """
             @Composable
             private fun Test() {
               A(a)
               A(b)
             }
         """
-    )
+        )
 
     @Test
-    fun testCallingAWrapperComposable(): Unit = controlFlow(
-        """
+    fun testCallingAWrapperComposable(): Unit =
+        controlFlow(
+            """
             @Composable
             fun Test() {
               W {
@@ -63,11 +65,12 @@
               }
             }
         """
-    )
+        )
 
     @Test
-    fun testCallingAnInlineWrapperComposable(): Unit = controlFlow(
-        """
+    fun testCallingAnInlineWrapperComposable(): Unit =
+        controlFlow(
+            """
             @Composable
             fun Test() {
               IW {
@@ -75,11 +78,13 @@
               }
             }
         """
-    )
+        )
 
     @Test
-    fun verifyEarlyExitFromMultiLevelNestedInlineFunction() = verifyGoldenComposeIrTransform(
-        source = """
+    fun verifyEarlyExitFromMultiLevelNestedInlineFunction() =
+        verifyGoldenComposeIrTransform(
+            source =
+                """
             import androidx.compose.runtime.*
 
             @Composable
@@ -98,7 +103,8 @@
                 Text("Before outer")
             }
         """,
-        extra = """
+            extra =
+                """
             import androidx.compose.runtime.*
 
             @Composable
@@ -114,5 +120,5 @@
                 content()
             }
         """
-    )
+        )
 }
diff --git a/compose/compiler/compiler-hosted/integration-tests/src/jvmTest/kotlin/androidx/compose/compiler/plugins/kotlin/DefaultParamTransformTests.kt b/compose/compiler/compiler-hosted/integration-tests/src/jvmTest/kotlin/androidx/compose/compiler/plugins/kotlin/DefaultParamTransformTests.kt
index 4ce52b2..4ffbb5a 100644
--- a/compose/compiler/compiler-hosted/integration-tests/src/jvmTest/kotlin/androidx/compose/compiler/plugins/kotlin/DefaultParamTransformTests.kt
+++ b/compose/compiler/compiler-hosted/integration-tests/src/jvmTest/kotlin/androidx/compose/compiler/plugins/kotlin/DefaultParamTransformTests.kt
@@ -21,34 +21,36 @@
 
 class DefaultParamTransformTests(useFir: Boolean) : AbstractIrTransformTest(useFir) {
     private fun defaultParams(
-        @Language("kotlin")
-        unchecked: String,
-        @Language("kotlin")
-        checked: String,
+        @Language("kotlin") unchecked: String,
+        @Language("kotlin") checked: String,
         dumpTree: Boolean = false
-    ) = verifyGoldenComposeIrTransform(
-        """
+    ) =
+        verifyGoldenComposeIrTransform(
+            """
             import androidx.compose.runtime.*
 
             $checked
-        """.trimIndent(),
         """
+                .trimIndent(),
+            """
             import androidx.compose.runtime.*
 
             $unchecked
 
             fun used(x: Any?) {}
-        """.trimIndent(),
-        dumpTree = dumpTree
-    )
+        """
+                .trimIndent(),
+            dumpTree = dumpTree
+        )
 
     @Test
-    fun testComposableWithAndWithoutDefaultParams(): Unit = defaultParams(
-        """
+    fun testComposableWithAndWithoutDefaultParams(): Unit =
+        defaultParams(
+            """
             @Composable fun A(x: Int) { }
             @Composable fun B(x: Int = 1) { }
         """,
-        """
+            """
             @Composable
             fun Test() {
                 A(1)
@@ -56,14 +58,15 @@
                 B(2)
             }
         """
-    )
+        )
 
     @Test
-    fun testInlineClassDefaultParameter(): Unit = defaultParams(
-        """
+    fun testInlineClassDefaultParameter(): Unit =
+        defaultParams(
+            """
             inline class Foo(val value: Int)
         """,
-        """
+            """
             @Composable
             fun Example(foo: Foo = Foo(0)) {
                 print(foo)
@@ -73,63 +76,68 @@
                 Example()
             }
         """
-    )
+        )
 
     @Test
-    fun testParameterHoles(): Unit = defaultParams(
-        """
+    fun testParameterHoles(): Unit =
+        defaultParams(
+            """
             @Composable fun A(a: Int = 0, b: Int = 1, c: Int = 2, d: Int = 3, e: Int = 4) { }
         """,
-        """
+            """
             @Composable
             fun Test() {
                 A(0, 1, 2)
                 A(a = 0, c = 2)
             }
         """
-    )
+        )
 
     @Test
-    fun testUnusedDefaultComposableLambda(): Unit = defaultParams(
-        """
+    fun testUnusedDefaultComposableLambda(): Unit =
+        defaultParams(
+            """
         """,
-        """
+            """
             inline fun Bar(unused: @Composable () -> Unit = { }) {}
             fun Foo() { Bar() }
         """
-    )
+        )
 
     @Test
-    fun testNonStaticDefaultExpressions(): Unit = defaultParams(
-        """
+    fun testNonStaticDefaultExpressions(): Unit =
+        defaultParams(
+            """
             fun makeInt(): Int = 123
         """,
-        """
+            """
             @Composable
             fun Test(x: Int = makeInt()) {
                 used(x)
             }
         """
-    )
+        )
 
     @Test
-    fun testEarlierParameterReferences(): Unit = defaultParams(
-        """
+    fun testEarlierParameterReferences(): Unit =
+        defaultParams(
+            """
         """,
-        """
+            """
             @Composable
             fun A(a: Int = 0, b: Int = a + 1) {
                 print(a)
                 print(b)
             }
         """
-    )
+        )
 
     @Test
-    fun test30Parameters(): Unit = defaultParams(
-        """
+    fun test30Parameters(): Unit =
+        defaultParams(
+            """
         """,
-        """
+            """
             @Composable
             fun Example(
                 a00: Int = 0,
@@ -197,13 +205,14 @@
                 used(a30)
             }
         """
-    )
+        )
 
     @Test
-    fun test31Parameters(): Unit = defaultParams(
-        """
+    fun test31Parameters(): Unit =
+        defaultParams(
+            """
         """,
-        """
+            """
             @Composable
             fun Example(
                 a00: Int = 0,
@@ -273,14 +282,15 @@
                 used(a31)
             }
         """
-    )
+        )
 
     @Test
-    fun test31ParametersWithSomeUnstable(): Unit = defaultParams(
-        """
+    fun test31ParametersWithSomeUnstable(): Unit =
+        defaultParams(
+            """
             class Foo
         """,
-        """
+            """
             @Composable
             fun Example(
                 a00: Int = 0,
@@ -350,13 +360,14 @@
                 used(a31)
             }
         """
-    )
+        )
 
     @Test
-    fun testDefaultArgsForFakeOverridesSuperMethods(): Unit = defaultParams(
-        """
+    fun testDefaultArgsForFakeOverridesSuperMethods(): Unit =
+        defaultParams(
+            """
         """,
-        """
+            """
             open class Foo {
                 @NonRestartableComposable @Composable fun foo(x: Int = 0) {}
             }
@@ -366,11 +377,12 @@
                 }
             }
         """
-    )
+        )
 
     @Test
-    fun testDefaultArgsOnInvoke() = defaultParams(
-        """
+    fun testDefaultArgsOnInvoke() =
+        defaultParams(
+            """
             object HasDefault {
                 @Composable
                 operator fun invoke(text: String = "SomeText"){
@@ -393,7 +405,7 @@
                 }
             }
         """,
-        """
+            """
             @NonRestartableComposable
             @Composable
             fun Bar() {
@@ -402,12 +414,14 @@
                 MultipleDefault()
             }
         """
-    )
+        )
 
     @Test
-    fun testDefaultParamOnInterface() = defaultParams(
-        unchecked = """""",
-        checked = """
+    fun testDefaultParamOnInterface() =
+        defaultParams(
+            unchecked = """""",
+            checked =
+                """
             interface Test {
                 @Composable fun foo(param: Int = remember { 0 })
                 @Composable fun bar(param: Int = remember { 0 }): Int = param
@@ -456,12 +470,14 @@
                 testImpl.betweenBar(0)
             }
         """
-    )
+        )
 
     @Test
-    fun testDefaultParamOverrideOpenFunction() = defaultParams(
-        unchecked = """""",
-        checked = """
+    fun testDefaultParamOverrideOpenFunction() =
+        defaultParams(
+            unchecked = """""",
+            checked =
+                """
             @Composable fun CallWithDefaults(test: Test) {
                 test.foo()
                 test.foo(0)
@@ -481,12 +497,14 @@
                 }
             }
         """
-    )
+        )
 
     @Test
-    fun testDefaultParamOverrideExtensionReceiver() = defaultParams(
-        unchecked = "",
-        checked = """
+    fun testDefaultParamOverrideExtensionReceiver() =
+        defaultParams(
+            unchecked = "",
+            checked =
+                """
             interface Test {
                 @Composable fun Int.foo(param: Int = remember { 0 })
                 @Composable fun Int.bar(param: Int = remember { 0 }): Int = param
@@ -506,12 +524,14 @@
                 }
             }
         """
-    )
+        )
 
     @Test
-    fun testDefaultParamFakeOverride() = defaultParams(
-        unchecked = "",
-        checked = """
+    fun testDefaultParamFakeOverride() =
+        defaultParams(
+            unchecked = "",
+            checked =
+                """
             open class Test {
                 @Composable open fun foo(param: Int = remember { 0 }) {}
                 @Composable open fun bar(param: Int = remember { 0 }): Int = param
@@ -528,14 +548,17 @@
                 test.bar(0)
             }
         """
-    )
+        )
 
     @Test
-    fun testDefaultParamComposableLambda() = defaultParams(
-        unchecked = """
+    fun testDefaultParamComposableLambda() =
+        defaultParams(
+            unchecked =
+                """
             @Composable fun Text(value: String) {}
         """,
-        checked = """
+            checked =
+                """
             private interface DefaultParamInterface {
                 @Composable fun Content(
                     content: @Composable () -> Unit = @Composable { ComposedContent { Text("default") } }
@@ -547,5 +570,5 @@
                 }
             }
         """,
-    )
+        )
 }
diff --git a/compose/compiler/compiler-hosted/integration-tests/src/jvmTest/kotlin/androidx/compose/compiler/plugins/kotlin/DurableFunctionKeyCodegenTests.kt b/compose/compiler/compiler-hosted/integration-tests/src/jvmTest/kotlin/androidx/compose/compiler/plugins/kotlin/DurableFunctionKeyCodegenTests.kt
index b2775e5..85eec69 100644
--- a/compose/compiler/compiler-hosted/integration-tests/src/jvmTest/kotlin/androidx/compose/compiler/plugins/kotlin/DurableFunctionKeyCodegenTests.kt
+++ b/compose/compiler/compiler-hosted/integration-tests/src/jvmTest/kotlin/androidx/compose/compiler/plugins/kotlin/DurableFunctionKeyCodegenTests.kt
@@ -28,52 +28,55 @@
     }
 
     @Test
-    fun testSimpleComposable(): Unit = validateBytecode(
-        """
+    fun testSimpleComposable(): Unit =
+        validateBytecode(
+            """
             @Composable fun Example() {}
         """
-    ) { bytecode ->
-        bytecode.assertKeyMetaClass(1)
-        bytecode.assertFunctionKeyMetaClassAnnotationCount(1)
-        bytecode.assertFunctionKeyMetaAnnotationCount(1)
-    }
+        ) { bytecode ->
+            bytecode.assertKeyMetaClass(1)
+            bytecode.assertFunctionKeyMetaClassAnnotationCount(1)
+            bytecode.assertFunctionKeyMetaAnnotationCount(1)
+        }
 
     @Test
-    fun testMultipleComposables(): Unit = validateBytecode(
-        """
+    fun testMultipleComposables(): Unit =
+        validateBytecode(
+            """
             @Composable fun Example1() {}
             @Composable fun Example2() {}
         """
-    ) { bytecode ->
-        bytecode.assertKeyMetaClass(1)
-        bytecode.assertFunctionKeyMetaClassAnnotationCount(1)
-        bytecode.assertFunctionKeyMetaAnnotationCount(2)
-    }
+        ) { bytecode ->
+            bytecode.assertKeyMetaClass(1)
+            bytecode.assertFunctionKeyMetaClassAnnotationCount(1)
+            bytecode.assertFunctionKeyMetaAnnotationCount(2)
+        }
 
     @Test
-    fun testComposableLambdas(): Unit = validateBytecode(
-        """
+    fun testComposableLambdas(): Unit =
+        validateBytecode(
+            """
             @Composable fun Row(content: @Composable () -> Unit) { content() }
             @Composable fun Example2() {
                 Row {}
             }
         """
-    ) { bytecode ->
-        bytecode.assertKeyMetaClass(1)
-        bytecode.assertFunctionKeyMetaClassAnnotationCount(1)
-        bytecode.assertFunctionKeyMetaAnnotationCount(3)
-    }
+        ) { bytecode ->
+            bytecode.assertKeyMetaClass(1)
+            bytecode.assertFunctionKeyMetaClassAnnotationCount(1)
+            bytecode.assertFunctionKeyMetaAnnotationCount(3)
+        }
 
     private fun String.assertKeyMetaClass(expected: Int) {
-        assertEquals(expected,
-            lines().count {
-                it.contains("final class") && it.endsWith("%KeyMeta {")
-            }
+        assertEquals(
+            expected,
+            lines().count { it.contains("final class") && it.endsWith("%KeyMeta {") }
         )
     }
 
     private fun String.assertFunctionKeyMetaClassAnnotationCount(expected: Int) {
-        assertEquals(expected,
+        assertEquals(
+            expected,
             lines().count {
                 it.contains("@Landroidx/compose/runtime/internal/FunctionKeyMetaClass;")
             }
@@ -81,10 +84,13 @@
     }
 
     private fun String.assertFunctionKeyMetaAnnotationCount(expected: Int) {
-        assertEquals(expected,
+        assertEquals(
+            expected,
             lines().sumOf {
                 when {
-                    it.contains("@Landroidx/compose/runtime/internal/FunctionKeyMeta%Container;") -> {
+                    it.contains(
+                        "@Landroidx/compose/runtime/internal/FunctionKeyMeta%Container;"
+                    ) -> {
                         it.occurrences("@Landroidx/compose/runtime/internal/FunctionKeyMeta;")
                     }
                     it.contains("@Landroidx/compose/runtime/internal/FunctionKeyMeta;") -> 1
@@ -94,7 +100,6 @@
         )
     }
 
-    private fun String.occurrences(substring: String): Int = split(substring)
-        .dropLastWhile { it.isEmpty() }
-        .count() - 1
+    private fun String.occurrences(substring: String): Int =
+        split(substring).dropLastWhile { it.isEmpty() }.count() - 1
 }
diff --git a/compose/compiler/compiler-hosted/integration-tests/src/jvmTest/kotlin/androidx/compose/compiler/plugins/kotlin/DurableKeyTests.kt b/compose/compiler/compiler-hosted/integration-tests/src/jvmTest/kotlin/androidx/compose/compiler/plugins/kotlin/DurableKeyTests.kt
index 610920b..bbff1f4 100644
--- a/compose/compiler/compiler-hosted/integration-tests/src/jvmTest/kotlin/androidx/compose/compiler/plugins/kotlin/DurableKeyTests.kt
+++ b/compose/compiler/compiler-hosted/integration-tests/src/jvmTest/kotlin/androidx/compose/compiler/plugins/kotlin/DurableKeyTests.kt
@@ -34,11 +34,7 @@
         assert(!success) { "Expected duplicate, but wasn't: $key" }
     }
 
-    fun testBasic() = visit {
-        enter("a") {
-            assertKey("b", "b/a")
-        }
-    }
+    fun testBasic() = visit { enter("a") { assertKey("b", "b/a") } }
 
     fun testBasicNonSiblings() = visit {
         enter("a") {
@@ -58,9 +54,7 @@
 
     fun testNestedSiblings() = visit {
         siblings("a") {
-            siblings {
-                enter("b") { assertKey("i", "i/b/a") }
-            }
+            siblings { enter("b") { assertKey("i", "i/b/a") } }
             enter("b") { assertKey("i", "i/b:1/a") }
         }
     }
diff --git a/compose/compiler/compiler-hosted/integration-tests/src/jvmTest/kotlin/androidx/compose/compiler/plugins/kotlin/FunctionBodySkippingTransformTests.kt b/compose/compiler/compiler-hosted/integration-tests/src/jvmTest/kotlin/androidx/compose/compiler/plugins/kotlin/FunctionBodySkippingTransformTests.kt
index f6aa766..8294d49 100644
--- a/compose/compiler/compiler-hosted/integration-tests/src/jvmTest/kotlin/androidx/compose/compiler/plugins/kotlin/FunctionBodySkippingTransformTests.kt
+++ b/compose/compiler/compiler-hosted/integration-tests/src/jvmTest/kotlin/androidx/compose/compiler/plugins/kotlin/FunctionBodySkippingTransformTests.kt
@@ -20,45 +20,45 @@
 import org.jetbrains.kotlin.config.CompilerConfiguration
 import org.junit.Test
 
-abstract class FunctionBodySkippingTransformTestsBase(
-    useFir: Boolean
-) : AbstractIrTransformTest(useFir) {
+abstract class FunctionBodySkippingTransformTestsBase(useFir: Boolean) :
+    AbstractIrTransformTest(useFir) {
     protected fun comparisonPropagation(
-        @Language("kotlin")
-        unchecked: String,
-        @Language("kotlin")
-        checked: String,
+        @Language("kotlin") unchecked: String,
+        @Language("kotlin") checked: String,
         dumpTree: Boolean = false
-    ) = verifyGoldenComposeIrTransform(
-        """
+    ) =
+        verifyGoldenComposeIrTransform(
+            """
             import androidx.compose.runtime.Composable
             import androidx.compose.runtime.NonRestartableComposable
             import androidx.compose.runtime.ReadOnlyComposable
 
             $checked
-        """.trimIndent(),
         """
+                .trimIndent(),
+            """
             import androidx.compose.runtime.Composable
 
             $unchecked
             fun used(x: Any?) {}
-        """.trimIndent(),
-        dumpTree = dumpTree
-    )
+        """
+                .trimIndent(),
+            dumpTree = dumpTree
+        )
 }
 
-class FunctionBodySkippingTransformTests(
-    useFir: Boolean
-) : FunctionBodySkippingTransformTestsBase(useFir) {
+class FunctionBodySkippingTransformTests(useFir: Boolean) :
+    FunctionBodySkippingTransformTestsBase(useFir) {
     @Test
-    fun testIfInLambda(): Unit = comparisonPropagation(
-        """
+    fun testIfInLambda(): Unit =
+        comparisonPropagation(
+            """
             @Composable fun A(x: Int = 0, y: Int = 0) {}
             @Composable fun Wrap(content: @Composable () -> Unit) {
                 content()
             }
         """,
-        """
+            """
             @Composable
             fun Test(x: Int = 0, y: Int = 0) {
                 used(y)
@@ -71,13 +71,14 @@
                 }
             }
         """
-    )
+        )
 
     @Test
-    fun testBasicText(): Unit = comparisonPropagation(
-        """
+    fun testBasicText(): Unit =
+        comparisonPropagation(
+            """
         """,
-        """
+            """
             import androidx.compose.ui.text.style.TextOverflow
             import androidx.compose.ui.text.TextStyle
             import androidx.compose.ui.text.TextLayoutResult
@@ -93,13 +94,14 @@
                 used(overflow)
             }
         """
-    )
+        )
 
     @Test
-    fun testArrangement(): Unit = comparisonPropagation(
-        """
+    fun testArrangement(): Unit =
+        comparisonPropagation(
+            """
         """,
-        """
+            """
             import androidx.compose.foundation.layout.Arrangement
             import androidx.compose.foundation.layout.Arrangement.Vertical
 
@@ -110,13 +112,14 @@
                 used(arrangement)
             }
         """
-    )
+        )
 
     @Test
-    fun testComposableSingletonsAreStatic(): Unit = comparisonPropagation(
-        """
+    fun testComposableSingletonsAreStatic(): Unit =
+        comparisonPropagation(
+            """
         """,
-        """
+            """
             @Composable
             fun Example(
                 content: @Composable () -> Unit = {}
@@ -124,26 +127,28 @@
                 content()
             }
         """
-    )
+        )
 
     @Test
-    fun testFunInterfaces(): Unit = comparisonPropagation(
-        """
+    fun testFunInterfaces(): Unit =
+        comparisonPropagation(
+            """
             fun interface A {
                 @Composable fun compute(value: Int): Unit
             }
         """,
-        """
+            """
             fun Example(a: A) {
                 used(a)
                 Example { it -> a.compute(it) }
             }
         """
-    )
+        )
 
     @Test
-    fun testFunInterfaces2(): Unit = comparisonPropagation(
-        """
+    fun testFunInterfaces2(): Unit =
+        comparisonPropagation(
+            """
             import androidx.compose.runtime.Immutable
             import androidx.compose.runtime.Stable
 
@@ -180,7 +185,7 @@
                 @Composable fun getColor(): Color
             }
         """,
-        """
+            """
             @Composable
             fun Button(colors: ButtonColors) {
                 Text("hello world", color = colors.getColor())
@@ -192,11 +197,12 @@
                 }
             }
         """
-    )
+        )
 
     @Test
-    fun testSimpleColumn(): Unit = comparisonPropagation(
-        """
+    fun testSimpleColumn(): Unit =
+        comparisonPropagation(
+            """
             import androidx.compose.runtime.Stable
             import androidx.compose.runtime.Immutable
 
@@ -236,7 +242,7 @@
                 }
             }
         """,
-        """
+            """
             @Composable
             fun RowColumnImpl(
               orientation: LayoutOrientation,
@@ -271,11 +277,12 @@
               )
             }
         """
-    )
+        )
 
     @Test
-    fun testSimplerBox(): Unit = comparisonPropagation(
-        """
+    fun testSimplerBox(): Unit =
+        comparisonPropagation(
+            """
             import androidx.compose.runtime.Stable
 
             @Stable
@@ -283,33 +290,35 @@
               companion object : Modifier { }
             }
         """,
-        """
+            """
             @Composable
             fun SimpleBox(modifier: Modifier = Modifier) {
                used(modifier)
             }
         """
-    )
+        )
 
     @Test
-    fun testDefaultSkipping(): Unit = comparisonPropagation(
-        """
+    fun testDefaultSkipping(): Unit =
+        comparisonPropagation(
+            """
             fun newInt(): Int = 123
         """,
-        """
+            """
             @Composable
             fun Example(a: Int = newInt()) {
                print(a)
             }
         """
-    )
+        )
 
     @Test
-    fun testLocalComposableFunctions(): Unit = comparisonPropagation(
-        """
+    fun testLocalComposableFunctions(): Unit =
+        comparisonPropagation(
+            """
             @Composable fun A(a: Int) {}
         """,
-        """
+            """
             @Composable
             fun Example(a: Int) {
                 @Composable fun Inner() {
@@ -318,15 +327,16 @@
                 Inner()
             }
         """
-    )
+        )
 
     @Test
-    fun testLoopWithContinueAndCallAfter(): Unit = comparisonPropagation(
-        """
+    fun testLoopWithContinueAndCallAfter(): Unit =
+        comparisonPropagation(
+            """
             @Composable fun Call() {}
             fun condition(): Boolean = true
         """,
-        """
+            """
             @Composable
             @NonRestartableComposable
             fun Example() {
@@ -339,11 +349,12 @@
                 }
             }
         """
-    )
+        )
 
     @Test
-    fun testSimpleBoxWithShape(): Unit = comparisonPropagation(
-        """
+    fun testSimpleBoxWithShape(): Unit =
+        comparisonPropagation(
+            """
             import androidx.compose.runtime.Stable
 
             @Stable
@@ -356,18 +367,19 @@
 
             val RectangleShape = object : Shape { }
         """,
-        """
+            """
             @Composable
             fun SimpleBox(modifier: Modifier = Modifier, shape: Shape = RectangleShape) {
                 used(modifier)
                 used(shape)
             }
         """
-    )
+        )
 
     @Test
-    fun testSimpleBox(): Unit = comparisonPropagation(
-        """
+    fun testSimpleBox(): Unit =
+        comparisonPropagation(
+            """
             import androidx.compose.runtime.Stable
 
             @Stable
@@ -375,52 +387,55 @@
               companion object : Modifier { }
             }
         """,
-        """
+            """
             @Composable
             fun SimpleBox(modifier: Modifier = Modifier, content: @Composable() () -> Unit = {}) {
                 used(modifier)
                 content()
             }
         """
-    )
+        )
 
     @Test
-    fun testComposableLambdaWithStableParams(): Unit = comparisonPropagation(
-        """
+    fun testComposableLambdaWithStableParams(): Unit =
+        comparisonPropagation(
+            """
             import androidx.compose.runtime.Immutable
 
             @Immutable class Foo
             @Composable fun A(x: Int) {}
             @Composable fun B(y: Foo) {}
         """,
-        """
+            """
             val foo = @Composable { x: Int, y: Foo ->
                 A(x)
                 B(y)
             }
         """
-    )
+        )
 
     @Test
-    fun testComposableLambdaWithUnstableParams(): Unit = comparisonPropagation(
-        """
+    fun testComposableLambdaWithUnstableParams(): Unit =
+        comparisonPropagation(
+            """
             class Foo(var value: Int = 0)
             @Composable fun A(x: Int) {}
             @Composable fun B(y: Foo) {}
         """,
-        """
+            """
             val foo = @Composable { x: Int, y: Foo ->
                 A(x)
                 B(y)
             }
         """
-    )
+        )
 
     @Test
-    fun testComposableLambdaWithStableParamsAndReturnValue(): Unit = comparisonPropagation(
-        """
+    fun testComposableLambdaWithStableParamsAndReturnValue(): Unit =
+        comparisonPropagation(
+            """
         """,
-        """
+            """
             @Composable fun SomeThing(content: @Composable() () -> Unit) { content() }
 
             @Composable
@@ -430,52 +445,56 @@
                 }
             }
         """
-    )
+        )
 
     @Test
-    fun testPrimitiveVarargParams(): Unit = comparisonPropagation(
-        """
+    fun testPrimitiveVarargParams(): Unit =
+        comparisonPropagation(
+            """
         """,
-        """
+            """
             @Composable
             fun B(vararg values: Int) {
                 print(values)
             }
         """
-    )
+        )
 
     @Test
-    fun testStableVarargParams(): Unit = comparisonPropagation(
-        """
+    fun testStableVarargParams(): Unit =
+        comparisonPropagation(
+            """
             import androidx.compose.runtime.Immutable
             @Immutable class Foo
         """,
-        """
+            """
             @Composable
             fun B(vararg values: Foo) {
                 print(values)
             }
         """
-    )
+        )
 
     @Test
-    fun testUnstableVarargParams(): Unit = comparisonPropagation(
-        """
+    fun testUnstableVarargParams(): Unit =
+        comparisonPropagation(
+            """
             class Foo(var value: Int = 0)
         """,
-        """
+            """
             @Composable
             fun B(vararg values: Foo) {
                 print(values)
             }
         """
-    )
+        )
 
     @Test
-    fun testReceiverParamSkippability(): Unit = comparisonPropagation(
-        """
+    fun testReceiverParamSkippability(): Unit =
+        comparisonPropagation(
+            """
         """,
-        """
+            """
             class Foo {
              var counter: Int = 0
              @Composable fun A() {
@@ -486,14 +505,15 @@
              }
             }
         """
-    )
+        )
 
     @Test
-    fun testComposableParameter(): Unit = comparisonPropagation(
-        """
+    fun testComposableParameter(): Unit =
+        comparisonPropagation(
+            """
             @Composable fun makeInt(): Int = 10
         """,
-        """
+            """
             @Composable
             fun Example(a: Int = 0, b: Int = makeInt(), c: Int = 0) {
                 used(a)
@@ -501,14 +521,15 @@
                 used(c)
             }
         """
-    )
+        )
 
     @Test
-    fun testComposableWithAndWithoutDefaultParams(): Unit = comparisonPropagation(
-        """
+    fun testComposableWithAndWithoutDefaultParams(): Unit =
+        comparisonPropagation(
+            """
             @Composable fun A(x: Int = 0, y: Int = 0) {}
         """,
-        """
+            """
             @Composable fun Wrap(y: Int, content: @Composable (x: Int) -> Unit) {
                 content(y)
             }
@@ -521,63 +542,68 @@
                 }
             }
         """
-    )
+        )
 
     @Test
-    fun testComposableWithReturnValue(): Unit = comparisonPropagation(
-        """
+    fun testComposableWithReturnValue(): Unit =
+        comparisonPropagation(
+            """
             @Composable fun A(x: Int = 0, y: Int = 0) {}
         """,
-        """
+            """
             @Composable
             fun Test(x: Int = 0, y: Int = 0): Int {
                 A(x, y)
                 return x + y
             }
         """
-    )
+        )
 
     @Test
-    fun testComposableLambda(): Unit = comparisonPropagation(
-        """
+    fun testComposableLambda(): Unit =
+        comparisonPropagation(
+            """
             @Composable fun A(x: Int = 0, y: Int = 0) {}
         """,
-        """
+            """
             val test = @Composable { x: Int ->
                 A(x)
             }
         """
-    )
+        )
 
     @Test
-    fun testComposableFunExprBody(): Unit = comparisonPropagation(
-        """
+    fun testComposableFunExprBody(): Unit =
+        comparisonPropagation(
+            """
             @Composable fun A(x: Int = 0, y: Int = 0): Int { return 10 }
         """,
-        """
+            """
             @Composable fun Test(x: Int) = A()
         """
-    )
+        )
 
     @Test
-    fun testParamReordering(): Unit = comparisonPropagation(
-        """
+    fun testParamReordering(): Unit =
+        comparisonPropagation(
+            """
             @Composable fun A(x: Int = 0, y: Int = 0): Int { return 10 }
         """,
-        """
+            """
             @Composable fun Test(x: Int, y: Int) {
                 A(y = y, x = x)
             }
         """
-    )
+        )
 
     @Test
-    fun testStableUnstableParams(): Unit = comparisonPropagation(
-        """
+    fun testStableUnstableParams(): Unit =
+        comparisonPropagation(
+            """
             @Composable fun A(x: Int = 0, y: Int = 0): Int { return 10 }
             class Foo(var value: Int = 0)
         """,
-        """
+            """
             @Composable fun CanSkip(a: Int = 0, b: Foo = Foo()) {
                 used(a)
                 used(b)
@@ -591,57 +617,61 @@
                 print("Hello World")
             }
         """
-    )
+        )
 
     @Test
-    fun testOptionalUnstableWithStableExtensionReceiver(): Unit = comparisonPropagation(
-        """
+    fun testOptionalUnstableWithStableExtensionReceiver(): Unit =
+        comparisonPropagation(
+            """
             class Foo(var value: Int = 0)
             class Bar
         """,
-        """
+            """
             @Composable fun Bar.CanSkip(b: Foo = Foo()) {
                 print("Hello World")
             }
         """
-    )
+        )
 
     @Test
-    fun testNoParams(): Unit = comparisonPropagation(
-        """
+    fun testNoParams(): Unit =
+        comparisonPropagation(
+            """
             @Composable fun A() {}
         """,
-        """
+            """
             @Composable
             fun Test() {
                 A()
             }
         """
-    )
+        )
 
     @Test
-    fun testSingleStableParam(): Unit = comparisonPropagation(
-        """
+    fun testSingleStableParam(): Unit =
+        comparisonPropagation(
+            """
             @Composable fun A(x: Int) {}
         """,
-        """
+            """
             @Composable
             fun Test(x: Int) {
                 A(x)
             }
         """
-    )
+        )
 
     @Test
-    fun testInlineClassDefaultParameter(): Unit = comparisonPropagation(
-        """
+    fun testInlineClassDefaultParameter(): Unit =
+        comparisonPropagation(
+            """
             inline class Color(val value: Int) {
                 companion object {
                     val Unset = Color(0)
                 }
             }
         """,
-        """
+            """
             @Composable
             fun A(text: String) {
                 B(text)
@@ -653,11 +683,12 @@
                 used(color)
             }
         """
-    )
+        )
 
     @Test
-    fun testStaticDetection(): Unit = comparisonPropagation(
-        """
+    fun testStaticDetection(): Unit =
+        comparisonPropagation(
+            """
             import androidx.compose.runtime.Stable
 
             enum class Foo {
@@ -681,7 +712,7 @@
             val Int.dp: Dp get() = Dp(this)
             @Composable fun D(content: @Composable() () -> Unit) {}
         """,
-        """
+            """
             // all of these should result in 0b0110
             @Composable fun A() {
                 val x = 123
@@ -708,105 +739,113 @@
                 C(Math.random() / 100f)
             }
         """
-    )
+        )
 
     @Test
-    fun testAnnotationChecker(): Unit = comparisonPropagation(
-        """
+    fun testAnnotationChecker(): Unit =
+        comparisonPropagation(
+            """
             @Composable fun D(content: @Composable() () -> Unit) {}
         """,
-        """
+            """
             @Composable fun Example() {
                 D {}
             }
         """
-    )
+        )
 
     @Test
-    fun testSingleStableParamWithDefault(): Unit = comparisonPropagation(
-        """
+    fun testSingleStableParamWithDefault(): Unit =
+        comparisonPropagation(
+            """
             @Composable fun A(x: Int) {}
         """,
-        """
+            """
             @Composable
             fun Test(x: Int = 0) {
                 A(x)
             }
         """
-    )
+        )
 
     @Test
-    fun testSingleStableParamWithComposableDefault(): Unit = comparisonPropagation(
-        """
+    fun testSingleStableParamWithComposableDefault(): Unit =
+        comparisonPropagation(
+            """
             @Composable fun A(x: Int) {}
             @Composable fun I(): Int { return 10 }
         """,
-        """
+            """
             @Composable
             fun Test(x: Int = I()) {
                 A(x)
             }
         """
-    )
+        )
 
     @Test
-    fun testSingleUnstableParam(): Unit = comparisonPropagation(
-        """
+    fun testSingleUnstableParam(): Unit =
+        comparisonPropagation(
+            """
             @Composable fun A(x: Foo) {}
             class Foo(var value: Int = 0)
         """,
-        """
+            """
             @Composable
             fun Test(x: Foo) {
                 A(x)
             }
         """
-    )
+        )
 
     @Test
-    fun testSingleUnstableParamWithDefault(): Unit = comparisonPropagation(
-        """
+    fun testSingleUnstableParamWithDefault(): Unit =
+        comparisonPropagation(
+            """
             @Composable fun A(x: Foo) {}
             class Foo
         """,
-        """
+            """
             @Composable
             fun Test(x: Foo = Foo()) {
                 A(x)
             }
         """
-    )
+        )
 
     @Test
-    fun testManyNonOptionalParams(): Unit = comparisonPropagation(
-        """
+    fun testManyNonOptionalParams(): Unit =
+        comparisonPropagation(
+            """
             @Composable fun A(a: Int, b: Boolean, c: Int, d: Foo, e: List<Int>) {}
             class Foo
         """,
-        """
+            """
             @Composable
             fun Test(a: Int, b: Boolean, c: Int = 0, d: Foo = Foo(), e: List<Int> = emptyList()) {
                 A(a, b, c, d, e)
             }
         """
-    )
+        )
 
     @Test
-    fun testRecursiveCall(): Unit = comparisonPropagation(
-        """
+    fun testRecursiveCall(): Unit =
+        comparisonPropagation(
+            """
         """,
-        """
+            """
             @Composable
             fun X(x: Int) {
                 X(x + 1)
                 X(x)
             }
         """
-    )
+        )
 
     @Test
-    fun testLambdaSkipping(): Unit = comparisonPropagation(
-        """
+    fun testLambdaSkipping(): Unit =
+        comparisonPropagation(
+            """
         import androidx.compose.runtime.*
 
         data class User(
@@ -835,35 +874,37 @@
             }
         }
         """,
-        """
+            """
             fun LazyListScope.Example(items: LazyPagingItems<User>) {
                 itemsIndexed(items) { index, user ->
                     print("Hello World")
                 }
             }
         """
-    )
+        )
 
     @Test
-    fun testPassedExtensionWhenExtensionIsPotentiallyUnstable(): Unit = comparisonPropagation(
-        """
+    fun testPassedExtensionWhenExtensionIsPotentiallyUnstable(): Unit =
+        comparisonPropagation(
+            """
             interface Unstable
         """,
-        """
+            """
             @Composable fun Unstable.Test() {
                 doSomething(this) // does this reference %dirty without %dirty
             }
 
             @Composable fun doSomething(x: Unstable) {}
         """
-    )
+        )
 
     @Test
-    fun testReceiverIssue(): Unit = comparisonPropagation(
-        """
+    fun testReceiverIssue(): Unit =
+        comparisonPropagation(
+            """
             class Foo
         """,
-        """
+            """
             import androidx.compose.runtime.ExplicitGroupsComposable
 
             @Composable
@@ -884,15 +925,16 @@
                 print(label)
             }
         """
-    )
+        )
 
     @Test
-    fun testDifferentParameters(): Unit = comparisonPropagation(
-        """
+    fun testDifferentParameters(): Unit =
+        comparisonPropagation(
+            """
             @Composable fun B(a: Int, b: Int, c: Int, d: Int) {}
             val fooGlobal = 10
         """,
-        """
+            """
             @Composable
             fun A(x: Int) {
                 B(
@@ -907,18 +949,19 @@
                 )
             }
         """
-    )
+        )
 
     @Test
-    fun testReceiverLambdaCall(): Unit = comparisonPropagation(
-        """
+    fun testReceiverLambdaCall(): Unit =
+        comparisonPropagation(
+            """
             import androidx.compose.runtime.Stable
 
             interface Foo { val x: Int }
             @Stable
             interface StableFoo { val x: Int }
         """,
-        """
+            """
             val unstableUnused: @Composable Foo.() -> Unit = {
             }
             val unstableUsed: @Composable Foo.() -> Unit = {
@@ -930,15 +973,16 @@
                 used(x)
             }
         """
-    )
+        )
 
     @Test
-    fun testNestedCalls(): Unit = comparisonPropagation(
-        """
+    fun testNestedCalls(): Unit =
+        comparisonPropagation(
+            """
             @Composable fun B(a: Int = 0, b: Int = 0, c: Int = 0) {}
             @Composable fun Provide(content: @Composable (Int) -> Unit) {}
         """,
-        """
+            """
             @Composable
             fun A(x: Int) {
                 Provide { y ->
@@ -950,14 +994,15 @@
                 B(x)
             }
         """
-    )
+        )
 
     @Test
-    fun testLocalFunction(): Unit = comparisonPropagation(
-        """
+    fun testLocalFunction(): Unit =
+        comparisonPropagation(
+            """
             @Composable fun B(a: Int, b: Int) {}
         """,
-        """
+            """
             @Composable
             fun A(x: Int) {
                 @Composable fun foo(y: Int) {
@@ -966,13 +1011,14 @@
                 foo(x)
             }
         """
-    )
+        )
 
     @Test
-    fun test15Parameters(): Unit = comparisonPropagation(
-        """
+    fun test15Parameters(): Unit =
+        comparisonPropagation(
+            """
         """,
-        """
+            """
             @Composable
             fun Example(
                 a00: Int = 0,
@@ -1029,13 +1075,14 @@
                 )
             }
         """
-    )
+        )
 
     @Test
-    fun test16Parameters(): Unit = comparisonPropagation(
-        """
+    fun test16Parameters(): Unit =
+        comparisonPropagation(
+            """
         """,
-        """
+            """
             @Composable
             fun Example(
                 a00: Int = 0,
@@ -1095,13 +1142,14 @@
                 )
             }
         """
-    )
+        )
 
     @Test
-    fun testGrouplessProperty(): Unit = comparisonPropagation(
-        """
+    fun testGrouplessProperty(): Unit =
+        comparisonPropagation(
+            """
         """,
-        """
+            """
             import androidx.compose.runtime.currentComposer
 
             open class Foo {
@@ -1118,17 +1166,18 @@
             @Composable
             fun getHashCode(): Int = currentComposer.hashCode()
         """
-    )
+        )
 
     @Test
-    fun testStaticAndNonStaticDefaultValueSkipping(): Unit = comparisonPropagation(
-        """
+    fun testStaticAndNonStaticDefaultValueSkipping(): Unit =
+        comparisonPropagation(
+            """
             import androidx.compose.runtime.compositionLocalOf
 
             val LocalColor = compositionLocalOf { 123 }
             @Composable fun A(a: Int) {}
         """,
-        """
+            """
             @Composable
             fun Example(
                 wontChange: Int = 123,
@@ -1138,34 +1187,37 @@
                 A(mightChange)
             }
         """
-    )
+        )
 
     @Test
-    fun testComposableLambdaInvoke(): Unit = comparisonPropagation(
-        """
+    fun testComposableLambdaInvoke(): Unit =
+        comparisonPropagation(
+            """
         """,
-        """
+            """
             @Composable fun Example(content: @Composable() () -> Unit) {
                 content.invoke()
             }
         """
-    )
+        )
 
     @Test
-    fun testComposableLambdasWithReturnGetGroups(): Unit = comparisonPropagation(
-        """
+    fun testComposableLambdasWithReturnGetGroups(): Unit =
+        comparisonPropagation(
+            """
         """,
-        """
+            """
             fun A(factory: @Composable () -> Int): Unit {}
             fun B() = A { 123 }
         """
-    )
+        )
 
     @Test
-    fun testDefaultsIssue(): Unit = comparisonPropagation(
-        """
+    fun testDefaultsIssue(): Unit =
+        comparisonPropagation(
+            """
         """,
-        """
+            """
             import androidx.compose.ui.Modifier
             import androidx.compose.ui.unit.Dp
 
@@ -1180,15 +1232,16 @@
                 content()
             }
         """
-    )
+        )
 
     @Test
-    fun testSiblingIfsWithoutElseHaveUniqueKeys(): Unit = comparisonPropagation(
-        """
+    fun testSiblingIfsWithoutElseHaveUniqueKeys(): Unit =
+        comparisonPropagation(
+            """
             @Composable fun A(){}
             @Composable fun B(){}
         """,
-        """
+            """
             @Composable
             fun Test(cond: Boolean) {
                 if (cond) {
@@ -1199,16 +1252,17 @@
                 }
             }
         """
-    )
+        )
 
     @Test
-    fun testUnusedParameters(): Unit = comparisonPropagation(
-        """
+    fun testUnusedParameters(): Unit =
+        comparisonPropagation(
+            """
             class Unstable(var count: Int)
             class Stable(val count: Int)
             interface MaybeStable
         """,
-        """
+            """
             @Composable
             fun Unskippable(a: Unstable, b: Stable, c: MaybeStable) {
                 used(a)
@@ -1224,14 +1278,15 @@
             @Composable
             fun Skippable3(a: Unstable, b: Stable, c: MaybeStable) { }
         """
-    )
+        )
 
     @Test
-    fun testExtensionReceiver(): Unit = comparisonPropagation(
-        """
+    fun testExtensionReceiver(): Unit =
+        comparisonPropagation(
+            """
             interface MaybeStable
         """,
-        """
+            """
             @Composable fun MaybeStable.example(x: Int) {
                 used(this)
                 used(x)
@@ -1241,13 +1296,14 @@
                 used(it)
             }
         """
-    )
+        )
 
     @Test
-    fun testArrayDefaultArgWithState(): Unit = comparisonPropagation(
-        """
+    fun testArrayDefaultArgWithState(): Unit =
+        comparisonPropagation(
+            """
         """,
-        """
+            """
             import androidx.compose.runtime.MutableState
 
             @Composable
@@ -1255,11 +1311,13 @@
                 state.value
             }
         """
-    )
+        )
 
     @Test // regression test for 204897513
-    fun test_InlineForLoop() = verifyGoldenComposeIrTransform(
-        source = """
+    fun test_InlineForLoop() =
+        verifyGoldenComposeIrTransform(
+            source =
+                """
             import androidx.compose.runtime.*
 
             @Composable
@@ -1274,18 +1332,20 @@
                 for (item in items) content(item)
             }
         """,
-        extra = """
+            extra =
+                """
             import androidx.compose.runtime.*
 
             @Composable
             fun Text(value: String) {}
         """
-    )
+        )
 
     @Test // regression test for 336571300
     fun test_groupAroundIfComposeCallInIfConditionWithShortCircuit() =
         verifyGoldenComposeIrTransform(
-            source = """
+            source =
+                """
                 import androidx.compose.runtime.*
 
                 @Composable
@@ -1307,19 +1367,19 @@
         )
 }
 
-class FunctionBodySkippingTransformTestsNoSource(
-    useFir: Boolean
-) : FunctionBodySkippingTransformTestsBase(useFir) {
+class FunctionBodySkippingTransformTestsNoSource(useFir: Boolean) :
+    FunctionBodySkippingTransformTestsBase(useFir) {
     override fun CompilerConfiguration.updateConfiguration() {
         put(ComposeConfiguration.SOURCE_INFORMATION_ENABLED_KEY, false)
         put(ComposeConfiguration.TRACE_MARKERS_ENABLED_KEY, false)
     }
 
     @Test
-    fun testGrouplessProperty(): Unit = comparisonPropagation(
-        """
+    fun testGrouplessProperty(): Unit =
+        comparisonPropagation(
+            """
         """,
-        """
+            """
             import androidx.compose.runtime.currentComposer
 
             open class Foo {
@@ -1336,11 +1396,13 @@
             @Composable
             fun getHashCode(): Int = currentComposer.hashCode()
         """
-    )
+        )
 
     @Test // regression test for 204897513
-    fun test_InlineForLoop_no_source_info() = verifyGoldenComposeIrTransform(
-        source = """
+    fun test_InlineForLoop_no_source_info() =
+        verifyGoldenComposeIrTransform(
+            source =
+                """
             import androidx.compose.runtime.*
 
             @Composable
@@ -1355,17 +1417,20 @@
                 for (item in items) content(item)
             }
         """,
-        extra = """
+            extra =
+                """
             import androidx.compose.runtime.*
 
             @Composable
             fun Text(value: String) {}
         """
-    )
+        )
 
     @Test
-    fun test_InlineSkipping() = verifyGoldenComposeIrTransform(
-        source = """
+    fun test_InlineSkipping() =
+        verifyGoldenComposeIrTransform(
+            source =
+                """
             import androidx.compose.runtime.*
 
             @Composable
@@ -1375,7 +1440,8 @@
                 }
             }
         """,
-        extra = """
+            extra =
+                """
             import androidx.compose.runtime.*
 
             @Composable
@@ -1386,28 +1452,32 @@
             @Composable
             fun Text(text: String) { }
         """
-    )
+        )
 
     @Test
-    fun test_ComposableLambdaWithUnusedParameter() = verifyGoldenComposeIrTransform(
-        source = """
+    fun test_ComposableLambdaWithUnusedParameter() =
+        verifyGoldenComposeIrTransform(
+            source =
+                """
             import androidx.compose.runtime.*
 
             val layoutLambda = @Composable { _: Int ->
                 Layout()
             }
         """,
-        extra = """
+            extra =
+                """
             import androidx.compose.runtime.*
 
             @Composable inline fun Layout() {}
         """
-    )
+        )
 
     @Test
-    fun testNonSkippableComposable() = comparisonPropagation(
-        "",
-        """
+    fun testNonSkippableComposable() =
+        comparisonPropagation(
+            "",
+            """
             import androidx.compose.runtime.NonSkippableComposable
 
             @Composable
@@ -1415,12 +1485,15 @@
             fun Test(i: Int) {
                 used(i)
             }
-        """.trimIndent()
-    )
+        """
+                .trimIndent()
+        )
 
     @Test
-    fun testComposable() = verifyGoldenComposeIrTransform(
-        source = """
+    fun testComposable() =
+        verifyGoldenComposeIrTransform(
+            source =
+                """
             interface NewProfileOBViewModel {
                 fun overrideMe(): @Type () -> Unit
             }
@@ -1432,11 +1505,13 @@
             @Target(AnnotationTarget.TYPE)
             annotation class Type
         """
-    )
+        )
 
     @Test
-    fun testInlineCallInsideComposableInlineFunction() = verifyGoldenComposeIrTransform(
-        source = """
+    fun testInlineCallInsideComposableInlineFunction() =
+        verifyGoldenComposeIrTransform(
+            source =
+                """
             import androidx.compose.runtime.*
             import androidx.compose.foundation.layout.*
 
@@ -1449,11 +1524,12 @@
                 }
             }
         """,
-        extra = """
+            extra =
+                """
             import androidx.compose.runtime.*
 
             @Composable
             fun Text(value: String) {}
         """
-    )
+        )
 }
diff --git a/compose/compiler/compiler-hosted/integration-tests/src/jvmTest/kotlin/androidx/compose/compiler/plugins/kotlin/FunctionalInterfaceTransformTests.kt b/compose/compiler/compiler-hosted/integration-tests/src/jvmTest/kotlin/androidx/compose/compiler/plugins/kotlin/FunctionalInterfaceTransformTests.kt
index f55811a..9fe2adf 100644
--- a/compose/compiler/compiler-hosted/integration-tests/src/jvmTest/kotlin/androidx/compose/compiler/plugins/kotlin/FunctionalInterfaceTransformTests.kt
+++ b/compose/compiler/compiler-hosted/integration-tests/src/jvmTest/kotlin/androidx/compose/compiler/plugins/kotlin/FunctionalInterfaceTransformTests.kt
@@ -18,13 +18,13 @@
 
 import org.junit.Test
 
-class FunctionalInterfaceTransformTests(
-    useFir: Boolean
-) : AbstractControlFlowTransformTests(useFir) {
+class FunctionalInterfaceTransformTests(useFir: Boolean) :
+    AbstractControlFlowTransformTests(useFir) {
     @Test
     fun testFunctionalInterfaceWithExtensionReceiverTransformation() {
         verifyGoldenComposeIrTransform(
-            source = """
+            source =
+                """
                 import androidx.compose.runtime.*
                 fun interface TestContent {
                     @Composable
@@ -41,13 +41,15 @@
                 fun CallTest() {
                     Test { this.length }
                 }
-            """.trimIndent()
+            """
+                    .trimIndent()
         )
     }
 
     @Test
-    fun testFunInterfaces() = verifyGoldenComposeIrTransform(
-        """
+    fun testFunInterfaces() =
+        verifyGoldenComposeIrTransform(
+            """
             import androidx.compose.runtime.*
 
             fun interface A {
@@ -59,11 +61,12 @@
                 Example { it -> a.compute(it) }
             }
         """
-    )
+        )
 
     @Test
-    fun testComposableFunInterfaces() = verifyGoldenComposeIrTransform(
-        """
+    fun testComposableFunInterfaces() =
+        verifyGoldenComposeIrTransform(
+            """
             import androidx.compose.runtime.*
 
             fun interface A {
@@ -73,11 +76,12 @@
                 Example { it -> a.compute(it) }
             }
         """
-    )
+        )
 
     @Test
-    fun testComposableFunInterfacesInVariance() = verifyGoldenComposeIrTransform(
-        """
+    fun testComposableFunInterfacesInVariance() =
+        verifyGoldenComposeIrTransform(
+            """
             import androidx.compose.runtime.*
 
             fun interface Consumer<T> {
@@ -94,11 +98,12 @@
                 }
             }
         """
-    )
+        )
 
     @Test
-    fun testCaptureStableFunInterface() = verifyGoldenComposeIrTransform(
-        """
+    fun testCaptureStableFunInterface() =
+        verifyGoldenComposeIrTransform(
+            """
             import androidx.compose.runtime.*
 
             fun interface Consumer {
@@ -114,11 +119,12 @@
             @Composable inline fun Example(consumer: Consumer) {
             }
             """
-    )
+        )
 
     @Test
-    fun testNoCaptureFunInterface() = verifyGoldenComposeIrTransform(
-        """
+    fun testNoCaptureFunInterface() =
+        verifyGoldenComposeIrTransform(
+            """
             import androidx.compose.runtime.*
 
             fun interface Consumer {
@@ -134,11 +140,12 @@
             @Composable inline fun Example(consumer: Consumer) {
             }
         """
-    )
+        )
 
     @Test
-    fun testComposableFunInterfaceWAnonymousParam() = verifyGoldenComposeIrTransform(
-        """
+    fun testComposableFunInterfaceWAnonymousParam() =
+        verifyGoldenComposeIrTransform(
+            """
             import androidx.compose.runtime.*
 
             fun interface Consumer {
@@ -153,11 +160,12 @@
             @Composable fun Example(consumer: Consumer) {
             }
         """
-    )
+        )
 
     @Test
-    fun testComposableFunInterfaceWComposableLambda() = verifyGoldenComposeIrTransform(
-        """
+    fun testComposableFunInterfaceWComposableLambda() =
+        verifyGoldenComposeIrTransform(
+            """
             import androidx.compose.runtime.*
 
             @Composable
@@ -179,10 +187,10 @@
                 @Composable fun Decoration(content: @Composable () -> Unit)
             }
         """,
-        """
+            """
             fun used(any: Any?) {}
         """
-    )
+        )
 
     @Test
     fun testComposableFunInterfaceWComposableLambdaCaptureVariable() =
diff --git a/compose/compiler/compiler-hosted/integration-tests/src/jvmTest/kotlin/androidx/compose/compiler/plugins/kotlin/GoldenTransformRule.kt b/compose/compiler/compiler-hosted/integration-tests/src/jvmTest/kotlin/androidx/compose/compiler/plugins/kotlin/GoldenTransformRule.kt
index 2aab077..5b9723b 100644
--- a/compose/compiler/compiler-hosted/integration-tests/src/jvmTest/kotlin/androidx/compose/compiler/plugins/kotlin/GoldenTransformRule.kt
+++ b/compose/compiler/compiler-hosted/integration-tests/src/jvmTest/kotlin/androidx/compose/compiler/plugins/kotlin/GoldenTransformRule.kt
@@ -27,22 +27,24 @@
 
 private const val ENV_GENERATE_GOLDEN = "GENERATE_GOLDEN"
 private const val GOLDEN_FILE_TYPE = "txt"
+
 private fun env(name: String): Boolean = (System.getenv(name) ?: "false").toBoolean()
+
 private fun envList(name: String): List<String> = (System.getenv(name) ?: "").quotedSplit()
 
 /**
  * GoldenTransformRule
  *
  * Compare transformed IR source to a golden test file. Golden files contain both the
- * pre-transformed and post-transformed source for easier review.
- * To regenerate the set of golden tests, pass GENERATE_GOLDEN=true as an environment variable.
+ * pre-transformed and post-transformed source for easier review. To regenerate the set of golden
+ * tests, pass GENERATE_GOLDEN=true as an environment variable.
  *
  * @param pathToGoldens: Path to golden files
  * @param generateGoldens: When true, will generate the golden test file and replace any existing
  * @param generateGoldenFiles: Generate the golden file if the name (without extension, is in the
- *          list.
+ *   list.
  * @param generateMissingGoldens: When true, will generate a golden file for any that are not found.
- **/
+ */
 class GoldenTransformRule(
     private val pathToGoldens: String = "$TEST_RESOURCES_ROOT/golden",
     private val generateGoldens: Boolean = env(ENV_GENERATE_GOLDEN),
@@ -52,33 +54,32 @@
     private lateinit var goldenFile: File
     private lateinit var testIdentifier: String
 
-    private val testWatcher = object : TestWatcher() {
-        override fun starting(description: Description) {
-            val goldenFilePath = getGoldenFilePath(description.className, description.methodName)
-            goldenFile = File(goldenFilePath)
-            testIdentifier = "${description.className}_${description.methodName}"
+    private val testWatcher =
+        object : TestWatcher() {
+            override fun starting(description: Description) {
+                val goldenFilePath =
+                    getGoldenFilePath(description.className, description.methodName)
+                goldenFile = File(goldenFilePath)
+                testIdentifier = "${description.className}_${description.methodName}"
+            }
         }
-    }
 
-    private fun getGoldenFilePath(
-        className: String,
-        methodName: String
-    ) = "$pathToGoldens/$className/$methodName.$GOLDEN_FILE_TYPE"
+    private fun getGoldenFilePath(className: String, methodName: String) =
+        "$pathToGoldens/$className/$methodName.$GOLDEN_FILE_TYPE"
 
     override fun apply(base: Statement, description: Description): Statement {
-        return base.run {
-            testWatcher.apply(this, description)
-        }
+        return base.run { testWatcher.apply(this, description) }
     }
 
     /**
-     * Verify the current test against the matching golden file.
-     * If generateGoldens is true, the golden file will first be generated.
+     * Verify the current test against the matching golden file. If generateGoldens is true, the
+     * golden file will first be generated.
      */
     fun verifyGolden(testInfo: GoldenTransformTestInfo) {
         if (
-            generateGoldens || (!goldenFile.exists() && generateMissingGoldens) ||
-            goldenFile.nameWithoutExtension in generateGoldenFiles
+            generateGoldens ||
+                (!goldenFile.exists() && generateMissingGoldens) ||
+                goldenFile.nameWithoutExtension in generateGoldenFiles
         ) {
             saveGolden(testInfo)
         }
@@ -87,11 +88,12 @@
             throw FileNotFoundException("Could not find golden file: ${goldenFile.absolutePath}")
         }
 
-        val loadedTestInfo = try {
-            GoldenTransformTestInfo.fromEncodedString(goldenFile.readText())
-        } catch (e: IllegalStateException) {
-            error("Golden ${goldenFile.absolutePath} file could not be parsed.\n${e.message}")
-        }
+        val loadedTestInfo =
+            try {
+                GoldenTransformTestInfo.fromEncodedString(goldenFile.readText())
+            } catch (e: IllegalStateException) {
+                error("Golden ${goldenFile.absolutePath} file could not be parsed.\n${e.message}")
+            }
 
         // Use absolute path in the assert error so studio shows it as a link
         Assert.assertEquals(
@@ -118,45 +120,48 @@
 
 /**
  * GoldenTransformTestInfo
+ *
  * @param source The pre-transformed source code.
  * @param transformed Post transformed IR tree source.
  */
-data class GoldenTransformTestInfo(
-    val source: String,
-    val transformed: String
-) {
-    fun encodeToString(): String =
-        buildString {
-            append(SOURCE_HEADER)
-            appendLine()
-            appendLine()
-            append(source)
-            appendLine()
-            appendLine()
-            append(TRANSFORM_HEADER)
-            appendLine()
-            appendLine()
-            append(transformed)
-            appendLine()
-        }
+data class GoldenTransformTestInfo(val source: String, val transformed: String) {
+    fun encodeToString(): String = buildString {
+        append(SOURCE_HEADER)
+        appendLine()
+        appendLine()
+        append(source)
+        appendLine()
+        appendLine()
+        append(TRANSFORM_HEADER)
+        appendLine()
+        appendLine()
+        append(transformed)
+        appendLine()
+    }
 
     companion object {
-        val SOURCE_HEADER = """
+        val SOURCE_HEADER =
+            """
             //
             // Source
             // ------------------------------------------
-        """.trimIndent()
-        val TRANSFORM_HEADER = """
+        """
+                .trimIndent()
+        val TRANSFORM_HEADER =
+            """
             //
             // Transformed IR
             // ------------------------------------------
-        """.trimIndent()
+        """
+                .trimIndent()
 
         fun fromEncodedString(encoded: String): GoldenTransformTestInfo {
             val split = encoded.removePrefix(SOURCE_HEADER).split(TRANSFORM_HEADER)
             if (split.size != 2) {
-                error("Could not parse encoded golden string. " +
-                    "Expected 2 sections but was ${split.size}.")
+                error(
+                    "Could not parse encoded golden string. " +
+                        "Expected 2 sections but was ${split.size}."
+                )
             }
             return GoldenTransformTestInfo(split[0].trim(), split[1].trim())
         }
@@ -171,7 +176,10 @@
         var start = current
         var end: Int
         when (get(current)) {
-            ' ', '\n', '\r', ',' -> {
+            ' ',
+            '\n',
+            '\r',
+            ',' -> {
                 current++
                 continue
             }
diff --git a/compose/compiler/compiler-hosted/integration-tests/src/jvmTest/kotlin/androidx/compose/compiler/plugins/kotlin/LambdaMemoizationRegressionTests.kt b/compose/compiler/compiler-hosted/integration-tests/src/jvmTest/kotlin/androidx/compose/compiler/plugins/kotlin/LambdaMemoizationRegressionTests.kt
index e718729..c9845ef 100644
--- a/compose/compiler/compiler-hosted/integration-tests/src/jvmTest/kotlin/androidx/compose/compiler/plugins/kotlin/LambdaMemoizationRegressionTests.kt
+++ b/compose/compiler/compiler-hosted/integration-tests/src/jvmTest/kotlin/androidx/compose/compiler/plugins/kotlin/LambdaMemoizationRegressionTests.kt
@@ -19,28 +19,29 @@
 import org.junit.Test
 
 /**
- * This test merely ensures that code gen changes are evaluated against potentially
- * breaking Android Studio compose debugger integration, see change id
- * I63ce10791fc3795a568f5f09ca6a24e801f5e3da
+ * This test merely ensures that code gen changes are evaluated against potentially breaking Android
+ * Studio compose debugger integration, see change id I63ce10791fc3795a568f5f09ca6a24e801f5e3da
  *
- * The Android Studio debugger searches for `ComposableSingletons` classes by name.
- * Any changes to the naming scheme have to be reflected in the Android Studio code.
+ * The Android Studio debugger searches for `ComposableSingletons` classes by name. Any changes to
+ * the naming scheme have to be reflected in the Android Studio code.
  */
 class LambdaMemoizationRegressionTests(useFir: Boolean) : AbstractIrTransformTest(useFir) {
     @Test
-    fun testNestedComposableSingletonsClass() = verifyGoldenComposeIrTransform(
-        """
+    fun testNestedComposableSingletonsClass() =
+        verifyGoldenComposeIrTransform(
+            """
             import androidx.compose.runtime.Composable
 
             class A {
                 val x = @Composable {}
             }
         """
-    )
+        )
 
     @Test
-    fun testNestedComposableSingletonsClass2() = verifyGoldenComposeIrTransform(
-        """
+    fun testNestedComposableSingletonsClass2() =
+        verifyGoldenComposeIrTransform(
+            """
             import androidx.compose.runtime.Composable
 
             class A {
@@ -49,22 +50,24 @@
                 }
             }
         """
-    )
+        )
 
     @Test
-    fun testJvmNameComposableSingletons() = verifyGoldenComposeIrTransform(
-        """
+    fun testJvmNameComposableSingletons() =
+        verifyGoldenComposeIrTransform(
+            """
             @file:JvmName("A")
             import androidx.compose.runtime.Composable
 
             val x = @Composable {}
         """
-    )
+        )
 
     // regression test for b/340606661
     @Test
-    fun testMemoizationInInlineFunction() = verifyGoldenComposeIrTransform(
-        """
+    fun testMemoizationInInlineFunction() =
+        verifyGoldenComposeIrTransform(
+            """
             import androidx.compose.runtime.*
 
             @Composable
@@ -76,5 +79,5 @@
                 println(lambda.hashCode())
             }
         """
-    )
+        )
 }
diff --git a/compose/compiler/compiler-hosted/integration-tests/src/jvmTest/kotlin/androidx/compose/compiler/plugins/kotlin/LambdaMemoizationTransformTests.kt b/compose/compiler/compiler-hosted/integration-tests/src/jvmTest/kotlin/androidx/compose/compiler/plugins/kotlin/LambdaMemoizationTransformTests.kt
index a879c13..1cc9ea9 100644
--- a/compose/compiler/compiler-hosted/integration-tests/src/jvmTest/kotlin/androidx/compose/compiler/plugins/kotlin/LambdaMemoizationTransformTests.kt
+++ b/compose/compiler/compiler-hosted/integration-tests/src/jvmTest/kotlin/androidx/compose/compiler/plugins/kotlin/LambdaMemoizationTransformTests.kt
@@ -29,18 +29,19 @@
             ComposeConfiguration.FEATURE_FLAGS,
             listOf(FeatureFlag.OptimizeNonSkippingGroups.featureName)
         )
-        languageVersionSettings = LanguageVersionSettingsImpl(
-            languageVersion = languageVersionSettings.languageVersion,
-            apiVersion = languageVersionSettings.apiVersion,
-            specificFeatures = mapOf(
-                LanguageFeature.ContextReceivers to LanguageFeature.State.ENABLED
+        languageVersionSettings =
+            LanguageVersionSettingsImpl(
+                languageVersion = languageVersionSettings.languageVersion,
+                apiVersion = languageVersionSettings.apiVersion,
+                specificFeatures =
+                    mapOf(LanguageFeature.ContextReceivers to LanguageFeature.State.ENABLED)
             )
-        )
     }
 
     @Test
-    fun testCapturedThisFromFieldInitializer() = verifyGoldenComposeIrTransform(
-        """
+    fun testCapturedThisFromFieldInitializer() =
+        verifyGoldenComposeIrTransform(
+            """
             import androidx.compose.runtime.Composable
 
             class A {
@@ -50,13 +51,14 @@
                 }
             }
         """,
+            """
         """
-        """
-    )
+        )
 
     @Test
-    fun testLocalInALocal() = verifyGoldenComposeIrTransform(
-        """
+    fun testLocalInALocal() =
+        verifyGoldenComposeIrTransform(
+            """
             import androidx.compose.runtime.Composable
 
             @Composable fun Example() {
@@ -67,14 +69,15 @@
                 }
             }
         """,
+            """
         """
-        """
-    )
+        )
 
     // Fixes b/201252574
     @Test
-    fun testLocalFunCaptures() = verifyGoldenComposeIrTransform(
-        """
+    fun testLocalFunCaptures() =
+        verifyGoldenComposeIrTransform(
+            """
             import androidx.compose.runtime.NonRestartableComposable
             import androidx.compose.runtime.Composable
 
@@ -91,13 +94,14 @@
                 }
             }
         """,
+            """
         """
-        """
-    )
+        )
 
     @Test
-    fun testLocalClassCaptures1() = verifyGoldenComposeIrTransform(
-        """
+    fun testLocalClassCaptures1() =
+        verifyGoldenComposeIrTransform(
+            """
             import androidx.compose.runtime.NonRestartableComposable
             import androidx.compose.runtime.Composable
 
@@ -113,11 +117,12 @@
                 }
             }
         """
-    )
+        )
 
     @Test
-    fun testLocalClassCaptures2() = verifyGoldenComposeIrTransform(
-        """
+    fun testLocalClassCaptures2() =
+        verifyGoldenComposeIrTransform(
+            """
             import androidx.compose.runtime.Composable
             import androidx.compose.runtime.NonRestartableComposable
 
@@ -130,11 +135,12 @@
                 }
             }
         """
-    )
+        )
 
     @Test
-    fun testLocalFunCaptures3() = verifyGoldenComposeIrTransform(
-        """
+    fun testLocalFunCaptures3() =
+        verifyGoldenComposeIrTransform(
+            """
             import androidx.compose.runtime.Composable
 
             @Composable
@@ -146,7 +152,7 @@
                 }
             }
         """,
-        """
+            """
             import androidx.compose.runtime.Composable
             import androidx.compose.animation.AnimatedVisibilityScope
 
@@ -156,11 +162,12 @@
                 content: @Composable AnimatedVisibilityScope.(targetState: S) -> Unit
             ) { }
         """
-    )
+        )
 
     @Test
-    fun testStateDelegateCapture() = verifyGoldenComposeIrTransform(
-        """
+    fun testStateDelegateCapture() =
+        verifyGoldenComposeIrTransform(
+            """
             import androidx.compose.runtime.Composable
             import androidx.compose.runtime.mutableStateOf
             import androidx.compose.runtime.getValue
@@ -172,28 +179,30 @@
                 }
             }
         """,
-        """
+            """
             import androidx.compose.runtime.Composable
 
             @Composable fun B(content: @Composable () -> Unit) {}
         """
-    )
+        )
 
     @Test
-    fun testTopLevelComposableLambdaProperties() = verifyGoldenComposeIrTransform(
-        """
+    fun testTopLevelComposableLambdaProperties() =
+        verifyGoldenComposeIrTransform(
+            """
             import androidx.compose.runtime.Composable
 
             val foo = @Composable {}
             val bar: @Composable () -> Unit = {}
         """,
+            """
         """
-        """
-    )
+        )
 
     @Test
-    fun testLocalVariableComposableLambdas() = verifyGoldenComposeIrTransform(
-        """
+    fun testLocalVariableComposableLambdas() =
+        verifyGoldenComposeIrTransform(
+            """
             import androidx.compose.runtime.Composable
 
             @Composable fun A() {
@@ -203,30 +212,32 @@
                 B(bar)
             }
         """,
-        """
+            """
             import androidx.compose.runtime.Composable
             @Composable fun B(content: @Composable () -> Unit) {}
         """
-    )
+        )
 
     @Test
-    fun testParameterComposableLambdas() = verifyGoldenComposeIrTransform(
-        """
+    fun testParameterComposableLambdas() =
+        verifyGoldenComposeIrTransform(
+            """
             import androidx.compose.runtime.Composable
 
             @Composable fun A() {
                 B {}
             }
         """,
-        """
+            """
             import androidx.compose.runtime.Composable
             @Composable fun B(content: @Composable () -> Unit) {}
         """
-    )
+        )
 
     @Test // Regression test for b/180168881
-    fun testFunctionReferenceWithinInferredComposableLambda() = verifyGoldenComposeIrTransform(
-        """
+    fun testFunctionReferenceWithinInferredComposableLambda() =
+        verifyGoldenComposeIrTransform(
+            """
             import androidx.compose.runtime.Composable
 
             fun Problem() {
@@ -236,25 +247,27 @@
                 }
             }
         """
-    )
+        )
 
     @Test
-    fun testFunctionReferenceNonComposableMemoization() = verifyGoldenComposeIrTransform(
-        """
+    fun testFunctionReferenceNonComposableMemoization() =
+        verifyGoldenComposeIrTransform(
+            """
             import androidx.compose.runtime.Composable
             @Composable fun Example(x: Int) {
                 fun foo() { use(x) }
                 val shouldMemoize: ()->(()->Unit) = { ::foo }
             }
         """,
-        """
+            """
             fun use(x: Any) = println(x)
         """
-    )
+        )
 
     @Test // regression of b/162575428
-    fun testComposableInAFunctionParameter() = verifyGoldenComposeIrTransform(
-        """
+    fun testComposableInAFunctionParameter() =
+        verifyGoldenComposeIrTransform(
+            """
             import androidx.compose.runtime.Composable
 
             @Composable
@@ -264,18 +277,20 @@
             ) {
                 Wrap(content)
             }
-        """.replace('%', '$'),
         """
+                .replace('%', '$'),
+            """
             import androidx.compose.runtime.Composable
 
             @Composable fun Display(text: String) { }
             @Composable fun Wrap(content: @Composable () -> Unit) { }
         """
-    )
+        )
 
     @Test
-    fun testComposabableLambdaInLocalDeclaration() = verifyGoldenComposeIrTransform(
-        """
+    fun testComposabableLambdaInLocalDeclaration() =
+        verifyGoldenComposeIrTransform(
+            """
             import androidx.compose.runtime.Composable
 
             @Composable
@@ -285,19 +300,21 @@
                 }
                 Wrap(content)
             }
-        """.replace('%', '$'),
         """
+                .replace('%', '$'),
+            """
             import androidx.compose.runtime.Composable
 
             @Composable fun Display(text: String) { }
             @Composable fun Wrap(content: @Composable () -> Unit) { }
         """
-    )
+        )
 
     // Ensure we don't remember lambdas that do not capture variables.
     @Test
-    fun testLambdaNoCapture() = verifyGoldenComposeIrTransform(
-        """
+    fun testLambdaNoCapture() =
+        verifyGoldenComposeIrTransform(
+            """
             import androidx.compose.runtime.Composable
 
             @Composable
@@ -312,12 +329,13 @@
               }
             }
         """
-    )
+        )
 
     // Ensure the above test is valid as this should remember the lambda
     @Test
-    fun testLambdaDoesCapture() = verifyGoldenComposeIrTransform(
-        """
+    fun testLambdaDoesCapture() =
+        verifyGoldenComposeIrTransform(
+            """
             import androidx.compose.runtime.Composable
 
             @Composable
@@ -332,13 +350,14 @@
               }
             }
         """
-    )
+        )
 
     // We have to use composableLambdaInstance in crossinline lambdas, since they may be captured
     // in anonymous objects and called in a context with a different composer.
     @Test
-    fun testCrossinlineLambda() = verifyGoldenComposeIrTransform(
-        """
+    fun testCrossinlineLambda() =
+        verifyGoldenComposeIrTransform(
+            """
             import androidx.compose.runtime.Composable
 
             @Composable
@@ -348,18 +367,19 @@
               lambda?.let { it() }
             }
         """,
-        """
+            """
             import androidx.compose.runtime.Composable
             @Composable fun Text(s: String) {}
             inline fun f(crossinline block: (String) -> Unit) = block("")
         """
-    )
+        )
 
     // The lambda argument to remember and cache should not contain composable calls so
     // we have to use composableLambdaInstance.
     @Test
-    fun testRememberComposableLambda() = verifyGoldenComposeIrTransform(
-        """
+    fun testRememberComposableLambda() =
+        verifyGoldenComposeIrTransform(
+            """
             import androidx.compose.runtime.*
 
             @Composable
@@ -368,22 +388,23 @@
               currentComposer.cache<@Composable () -> Unit>(false) { { Text(s) } }()
             }
         """,
-        """
+            """
             import androidx.compose.runtime.Composable
             @Composable fun Text(s: String) {}
         """
-    )
+        )
 
     @Test
-    fun memoizeLambdaInsideFunctionReturningValue() = verifyGoldenComposeIrTransform(
-        """
+    fun memoizeLambdaInsideFunctionReturningValue() =
+        verifyGoldenComposeIrTransform(
+            """
             import androidx.compose.runtime.Composable
 
             @Composable
             fun Test(foo: Foo): Int =
               Consume { foo.value }
         """,
-        """
+            """
             import androidx.compose.runtime.Composable
             import androidx.compose.runtime.Stable
 
@@ -395,7 +416,7 @@
                 val value: Int = 0
             }
         """
-    )
+        )
 
     @Test
     fun testComposableCaptureInDelegates() {
@@ -422,11 +443,13 @@
     @Test
     fun testNonComposableFunctionReferenceWithStableExtensionReceiverMemoization() =
         verifyGoldenComposeIrTransform(
-            extra = """
+            extra =
+                """
             class Stable
             fun Stable.foo() {}
         """,
-            source = """
+            source =
+                """
             import androidx.compose.runtime.Composable
             import androidx.compose.runtime.NonRestartableComposable
             import androidx.compose.runtime.remember
@@ -443,13 +466,15 @@
     @Test
     fun testNonComposableFunctionReferenceWithUnstableExtensionReceiverMemoization() =
         verifyGoldenComposeIrTransform(
-            extra = """
+            extra =
+                """
             class Unstable {
                 var value: Int = 0
             }
             fun Unstable.foo() = {}
         """,
-            source = """
+            source =
+                """
             import androidx.compose.runtime.Composable
             import androidx.compose.runtime.NonRestartableComposable
             import androidx.compose.runtime.remember
@@ -518,7 +543,8 @@
     @Test
     fun testNonComposableFunctionReferenceWithNoArgumentsMemoization() {
         verifyGoldenComposeIrTransform(
-            source = """
+            source =
+                """
                 import androidx.compose.runtime.Composable
                 import androidx.compose.runtime.remember
 
@@ -537,7 +563,8 @@
     @Test
     fun testNonComposableFunctionReferenceWithArgumentsMemoization() {
         verifyGoldenComposeIrTransform(
-            source = """
+            source =
+                """
                 import androidx.compose.runtime.Composable
                 import androidx.compose.runtime.remember
 
@@ -556,7 +583,8 @@
     @Test
     fun testNonComposableFunctionReferenceWithStableContextReceiverNotMemoized() {
         verifyGoldenComposeIrTransform(
-            source = """
+            source =
+                """
                 import androidx.compose.runtime.Composable
                 import androidx.compose.runtime.remember
 
@@ -576,8 +604,9 @@
     }
 
     @Test
-    fun testUnstableReceiverFunctionReferenceNotMemoized() = verifyGoldenComposeIrTransform(
-        """
+    fun testUnstableReceiverFunctionReferenceNotMemoized() =
+        verifyGoldenComposeIrTransform(
+            """
             import androidx.compose.runtime.Composable
 
             @Composable
@@ -585,11 +614,11 @@
                 val x = unstable::method
             }
         """,
-        """
+            """
             class Unstable(var qux: Int = 0) { fun method(arg1: Int) {} }
             val unstable = Unstable()
         """
-    )
+        )
 
     @Test
     fun testUnstableExtensionReceiverFunctionReferenceNotMemoized() =
@@ -610,8 +639,9 @@
         )
 
     @Test
-    fun testLocalFunctionReference() = verifyGoldenComposeIrTransform(
-        """
+    fun testLocalFunctionReference() =
+        verifyGoldenComposeIrTransform(
+            """
             import androidx.compose.runtime.Composable
 
             @Composable
@@ -622,11 +652,12 @@
                 val x = ::method
             }
         """
-    )
+        )
 
     @Test
-    fun testLocalFunctionReferenceWReceiver() = verifyGoldenComposeIrTransform(
-        """
+    fun testLocalFunctionReferenceWReceiver() =
+        verifyGoldenComposeIrTransform(
+            """
             import androidx.compose.runtime.Composable
 
             @Composable
@@ -637,11 +668,12 @@
                 val x = rcvr::method
             }
         """
-    )
+        )
 
     @Test
-    fun testMemoizingFunctionInIf() = verifyGoldenComposeIrTransform(
-        """
+    fun testMemoizingFunctionInIf() =
+        verifyGoldenComposeIrTransform(
+            """
             import androidx.compose.runtime.Composable
 
             @Composable
@@ -655,11 +687,12 @@
                 )
             }
         """
-    )
+        )
 
     @Test
-    fun testAdaptedFunctionRef() = verifyGoldenComposeIrTransform(
-        """
+    fun testAdaptedFunctionRef() =
+        verifyGoldenComposeIrTransform(
+            """
             import androidx.compose.runtime.Composable
 
             class ScrollState {
@@ -679,17 +712,20 @@
             @Composable
             fun foo(block: (Int) -> Int) = block(0)
         """,
-    )
+        )
 
     @Test
-    fun testCrossinlineCapture() = verifyGoldenComposeIrTransform(
-        extra = """
+    fun testCrossinlineCapture() =
+        verifyGoldenComposeIrTransform(
+            extra =
+                """
             import androidx.compose.runtime.Composable
 
             @Composable fun Lazy(content: () -> Unit) {}
             @Composable inline fun Box(content: () -> Unit) {}
         """,
-        source = """
+            source =
+                """
             import androidx.compose.runtime.Composable
 
             @Composable inline fun Test(crossinline content: () -> Unit) {
@@ -716,17 +752,19 @@
                 }
             }
         """
-    )
+        )
 
     @Test
     fun memoizeFunctionReferenceFromLocalClass() =
         verifyGoldenComposeIrTransform(
-            extra = """
+            extra =
+                """
                   interface Test {
                     fun go()
                   }
             """,
-            source = """
+            source =
+                """
                 import androidx.compose.runtime.Composable
 
                 class MainActivity {
diff --git a/compose/compiler/compiler-hosted/integration-tests/src/jvmTest/kotlin/androidx/compose/compiler/plugins/kotlin/LiveLiteralTransformTests.kt b/compose/compiler/compiler-hosted/integration-tests/src/jvmTest/kotlin/androidx/compose/compiler/plugins/kotlin/LiveLiteralTransformTests.kt
index 3dca4d2..4b199e9 100644
--- a/compose/compiler/compiler-hosted/integration-tests/src/jvmTest/kotlin/androidx/compose/compiler/plugins/kotlin/LiveLiteralTransformTests.kt
+++ b/compose/compiler/compiler-hosted/integration-tests/src/jvmTest/kotlin/androidx/compose/compiler/plugins/kotlin/LiveLiteralTransformTests.kt
@@ -27,27 +27,26 @@
     }
 
     @Test
-    fun testSiblingCallArgs() = assertNoDuplicateKeys(
-        """
+    fun testSiblingCallArgs() =
+        assertNoDuplicateKeys(
+            """
         fun Test() {
             print(1)
             print(1)
         }
         """
-    )
+        )
 
     @Test
-    fun testFunctionCallWithConstArg() = assertKeys(
-        "Int%arg-0%call-print%fun-Test",
-        "Int%arg-0%call-print-1%fun-Test"
-    ) {
-        """
+    fun testFunctionCallWithConstArg() =
+        assertKeys("Int%arg-0%call-print%fun-Test", "Int%arg-0%call-print-1%fun-Test") {
+            """
         fun Test() {
             print(1)
             print(1)
         }
         """
-    }
+        }
 
     @Test
     fun testDispatchReceiver() {
@@ -65,13 +64,12 @@
     }
 
     @Test
-    fun testInsidePropertyGetter() = assertKeys(
-        "Int%fun-%get-foo%%get%val-foo"
-    ) {
-        """
+    fun testInsidePropertyGetter() =
+        assertKeys("Int%fun-%get-foo%%get%val-foo") {
+            """
         val foo: Int get() = 1
         """
-    }
+        }
 
     // NOTE(lmr): For static initializer expressions we can/should do more.
     @Test
@@ -82,13 +80,12 @@
     }
 
     @Test
-    fun testValueParameter() = assertKeys(
-        "Int%param-x%fun-Foo"
-    ) {
-        """
+    fun testValueParameter() =
+        assertKeys("Int%param-x%fun-Foo") {
+            """
         fun Foo(x: Int = 1) { print(x) }
         """
-    }
+        }
 
     @Test
     fun testAnnotation() = assertKeys {
@@ -112,11 +109,12 @@
     }
 
     @Test
-    fun testWhileTrue() = assertKeys(
-        "Double%arg-1%call-greater%cond%if%body%loop%fun-Foo",
-        "Int%arg-0%call-print%body%loop%fun-Foo"
-    ) {
-        """
+    fun testWhileTrue() =
+        assertKeys(
+            "Double%arg-1%call-greater%cond%if%body%loop%fun-Foo",
+            "Int%arg-0%call-print%body%loop%fun-Foo"
+        ) {
+            """
         fun Foo() {
             while (true) {
                 print(1)
@@ -124,26 +122,24 @@
             }
         }
         """
-    }
+        }
 
     @Test
-    fun testWhileCondition() = assertKeys(
-        "Int%arg-0%call-print%body%loop%fun-Foo"
-    ) {
-        """
+    fun testWhileCondition() =
+        assertKeys("Int%arg-0%call-print%body%loop%fun-Foo") {
+            """
         fun Foo() {
             while (Math.random() > 0.5) {
                 print(1)
             }
         }
         """
-    }
+        }
 
     @Test
-    fun testForInCollection() = assertKeys(
-        "Int%arg-0%call-print-1%body%loop%fun-Foo"
-    ) {
-        """
+    fun testForInCollection() =
+        assertKeys("Int%arg-0%call-print-1%body%loop%fun-Foo") {
+            """
         fun Foo(items: List<Int>) {
             for (item in items) {
                 print(item)
@@ -151,7 +147,7 @@
             }
         }
         """
-    }
+        }
 
     // NOTE(lmr): we should deal with this in some cases, but leaving untouched for now
     @Test
@@ -162,35 +158,36 @@
     }
 
     @Test
-    fun testSafeCall() = assertKeys(
-        "Boolean%arg-1%call-EQEQ%fun-Foo",
-        "String%arg-0%call-contains%else%when%arg-0%call-EQEQ%fun-Foo"
-    ) {
-        """
+    fun testSafeCall() =
+        assertKeys(
+            "Boolean%arg-1%call-EQEQ%fun-Foo",
+            "String%arg-0%call-contains%else%when%arg-0%call-EQEQ%fun-Foo"
+        ) {
+            """
         fun Foo(bar: String?): Boolean {
             return bar?.contains("foo") == true
         }
         """
-    }
+        }
 
     @Test
-    fun testElvis() = assertKeys(
-        "String%branch%when%fun-Foo"
-    ) {
-        """
+    fun testElvis() =
+        assertKeys("String%branch%when%fun-Foo") {
+            """
         fun Foo(bar: String?): String {
             return bar ?: "Hello World"
         }
         """
-    }
+        }
 
     @Test
-    fun testTryCatch() = assertKeys(
-        "Int%arg-0%call-invoke%catch%fun-Foo",
-        "Int%arg-0%call-invoke%finally%fun-Foo",
-        "Int%arg-0%call-invoke%try%fun-Foo"
-    ) {
-        """
+    fun testTryCatch() =
+        assertKeys(
+            "Int%arg-0%call-invoke%catch%fun-Foo",
+            "Int%arg-0%call-invoke%finally%fun-Foo",
+            "Int%arg-0%call-invoke%try%fun-Foo"
+        ) {
+            """
         fun Foo(block: (Int) -> Unit) {
             try {
                 block(1)
@@ -201,17 +198,18 @@
             }
         }
         """
-    }
+        }
 
     @Test
-    fun testWhen() = assertKeys(
-        "Double%arg-1%call-greater%cond%when%fun-Foo",
-        "Double%arg-1%call-greater%cond-1%when%fun-Foo",
-        "Int%arg-0%call-print%branch%when%fun-Foo",
-        "Int%arg-0%call-print%branch-1%when%fun-Foo",
-        "Int%arg-0%call-print%else%when%fun-Foo"
-    ) {
-        """
+    fun testWhen() =
+        assertKeys(
+            "Double%arg-1%call-greater%cond%when%fun-Foo",
+            "Double%arg-1%call-greater%cond-1%when%fun-Foo",
+            "Int%arg-0%call-print%branch%when%fun-Foo",
+            "Int%arg-0%call-print%branch-1%when%fun-Foo",
+            "Int%arg-0%call-print%else%when%fun-Foo"
+        ) {
+            """
         fun Foo() {
             when {
                 Math.random() > 0.5 -> print(1)
@@ -220,19 +218,20 @@
             }
         }
         """
-    }
+        }
 
     @Test
-    fun testWhenWithSubject() = assertKeys(
-        "Double%%%this%call-rangeTo%%this%call-contains%cond%when%fun-Foo",
-        "Double%%%this%call-rangeTo%%this%call-contains%cond-1%when%fun-Foo",
-        "Double%arg-0%call-rangeTo%%this%call-contains%cond%when%fun-Foo",
-        "Double%arg-0%call-rangeTo%%this%call-contains%cond-1%when%fun-Foo",
-        "Int%arg-0%call-print%branch%when%fun-Foo",
-        "Int%arg-0%call-print%branch-1%when%fun-Foo",
-        "Int%arg-0%call-print%else%when%fun-Foo"
-    ) {
-        """
+    fun testWhenWithSubject() =
+        assertKeys(
+            "Double%%%this%call-rangeTo%%this%call-contains%cond%when%fun-Foo",
+            "Double%%%this%call-rangeTo%%this%call-contains%cond-1%when%fun-Foo",
+            "Double%arg-0%call-rangeTo%%this%call-contains%cond%when%fun-Foo",
+            "Double%arg-0%call-rangeTo%%this%call-contains%cond-1%when%fun-Foo",
+            "Int%arg-0%call-print%branch%when%fun-Foo",
+            "Int%arg-0%call-print%branch-1%when%fun-Foo",
+            "Int%arg-0%call-print%else%when%fun-Foo"
+        ) {
+            """
         fun Foo() {
             when (val x = Math.random()) {
                 in 0.0..0.5 -> print(1)
@@ -241,15 +240,16 @@
             }
         }
         """
-    }
+        }
 
     @Test
-    fun testWhenWithSubject2() = assertKeys(
-        "Int%arg-0%call-print%branch-1%when%fun-Foo",
-        "Int%arg-0%call-print%else%when%fun-Foo",
-        "String%arg-0%call-print%branch%when%fun-Foo"
-    ) {
-        """
+    fun testWhenWithSubject2() =
+        assertKeys(
+            "Int%arg-0%call-print%branch-1%when%fun-Foo",
+            "Int%arg-0%call-print%else%when%fun-Foo",
+            "String%arg-0%call-print%branch%when%fun-Foo"
+        ) {
+            """
         fun Foo(foo: Any) {
             when (foo) {
                 is String -> print("Hello World")
@@ -258,115 +258,121 @@
             }
         }
         """
-    }
+        }
 
     @Test
-    fun testDelegatingCtor() = assertKeys(
-        "Int%arg-0%call-%init%%class-Bar"
-    ) {
-        """
+    fun testDelegatingCtor() =
+        assertKeys("Int%arg-0%call-%init%%class-Bar") {
+            """
         open class Foo(val x: Int)
         class Bar() : Foo(123)
         """
-    }
+        }
 
     @Test
-    fun testLocalVal() = assertKeys(
-        "Int%arg-0%call-plus%set-y%fun-Foo",
-        "Int%val-x%fun-Foo",
-        "Int%val-y%fun-Foo"
-    ) {
-        """
+    fun testLocalVal() =
+        assertKeys("Int%arg-0%call-plus%set-y%fun-Foo", "Int%val-x%fun-Foo", "Int%val-y%fun-Foo") {
+            """
         fun Foo() {
             val x = 1
             var y = 2
             y += 10
         }
         """
-    }
+        }
 
     @Test
-    fun testCapturedVar() = assertKeys(
-        "Int%val-a%fun-Example",
-        "String%0%str%fun-Example",
-        "String%2%str%fun-Example"
-    ) {
-        """
+    fun testCapturedVar() =
+        assertKeys(
+            "Int%val-a%fun-Example",
+            "String%0%str%fun-Example",
+            "String%2%str%fun-Example"
+        ) {
+            """
         fun Example(): String {
                 val a = 123
                 return "foo ${"$"}a bar"
             }
         """
-    }
+        }
 
     @Test
-    fun testStringTemplate(): Unit = assertKeys(
-        "Int%val-a%fun-Example",
-        "String%0%str%fun-Example",
-        "String%2%str%fun-Example"
-    ) {
-        """
+    fun testStringTemplate(): Unit =
+        assertKeys(
+            "Int%val-a%fun-Example",
+            "String%0%str%fun-Example",
+            "String%2%str%fun-Example"
+        ) {
+            """
         fun Example(): String {
             val a = 123
             return "foo ${"$"}a bar"
         }
         """
-    }
+        }
 
     @Test
-    fun testEnumEntryMultipleArgs(): Unit = assertKeys(
-        "Int%arg-0%call-%init%%entry-Bar%class-A",
-        "Int%arg-0%call-%init%%entry-Baz%class-A",
-        "Int%arg-0%call-%init%%entry-Foo%class-A",
-        "Int%arg-1%call-%init%%entry-Bar%class-A",
-        "Int%arg-1%call-%init%%entry-Baz%class-A",
-        "Int%arg-1%call-%init%%entry-Foo%class-A"
-    ) {
-        """
+    fun testEnumEntryMultipleArgs(): Unit =
+        assertKeys(
+            "Int%arg-0%call-%init%%entry-Bar%class-A",
+            "Int%arg-0%call-%init%%entry-Baz%class-A",
+            "Int%arg-0%call-%init%%entry-Foo%class-A",
+            "Int%arg-1%call-%init%%entry-Bar%class-A",
+            "Int%arg-1%call-%init%%entry-Baz%class-A",
+            "Int%arg-1%call-%init%%entry-Foo%class-A"
+        ) {
+            """
         enum class A(val x: Int, val y: Int) {
             Foo(1, 2),
             Bar(2, 3),
             Baz(3, 4)
         }
         """
-    }
+        }
 
     @Test
-    fun testCommentsAbove() = assertDurableChange(
-        """
+    fun testCommentsAbove() =
+        assertDurableChange(
+            """
             fun Test() {
                 print(1)
             }
-        """.trimIndent(),
         """
+                .trimIndent(),
+            """
             fun Test() {
                 // this is a comment
                 print(1)
             }
-        """.trimIndent()
-    )
+        """
+                .trimIndent()
+        )
 
     @Test
-    fun testValsAndStructureAbove() = assertDurableChange(
-        """
+    fun testValsAndStructureAbove() =
+        assertDurableChange(
+            """
             fun Test() {
                 print(1)
             }
-        """.trimIndent(),
         """
+                .trimIndent(),
+            """
             fun Test() {
                 val x = Math.random()
                 println(x)
                 print(1)
             }
-        """.trimIndent()
-    )
+        """
+                .trimIndent()
+        )
 
     @Test
-    fun testAnonymousClass(): Unit = assertTransform(
-        """
+    fun testAnonymousClass(): Unit =
+        assertTransform(
+            """
         """,
-        """
+            """
             interface Foo { fun bar(): Int }
             fun a(): Foo {
                 return object : Foo {
@@ -374,7 +380,7 @@
                 }
             }
         """
-    )
+        )
 
     @Test
     fun testBasicTransform() {
@@ -428,8 +434,9 @@
     }
 
     @Test
-    fun testComposeIrSkippingWithDefaultsRelease() = verifyGoldenComposeIrTransform(
-        """
+    fun testComposeIrSkippingWithDefaultsRelease() =
+        verifyGoldenComposeIrTransform(
+            """
             import androidx.compose.ui.text.input.TextFieldValue
             import androidx.compose.runtime.*
             import androidx.compose.foundation.layout.*
@@ -449,8 +456,10 @@
                     Text("${'$'}keyboardActions2")
                 }
             }
-        """.trimIndent(),
-        extra = """
+        """
+                .trimIndent(),
+            extra =
+                """
             import androidx.compose.runtime.Composable
 
             @Composable
@@ -460,6 +469,7 @@
                 maxLines: Int = Int.MAX_VALUE,
                 minLines: Int = 1,
             ) {}
-        """.trimIndent()
-    )
+        """
+                    .trimIndent()
+        )
 }
diff --git a/compose/compiler/compiler-hosted/integration-tests/src/jvmTest/kotlin/androidx/compose/compiler/plugins/kotlin/LiveLiteralV2TransformTests.kt b/compose/compiler/compiler-hosted/integration-tests/src/jvmTest/kotlin/androidx/compose/compiler/plugins/kotlin/LiveLiteralV2TransformTests.kt
index bd64209..88ac80e 100644
--- a/compose/compiler/compiler-hosted/integration-tests/src/jvmTest/kotlin/androidx/compose/compiler/plugins/kotlin/LiveLiteralV2TransformTests.kt
+++ b/compose/compiler/compiler-hosted/integration-tests/src/jvmTest/kotlin/androidx/compose/compiler/plugins/kotlin/LiveLiteralV2TransformTests.kt
@@ -27,27 +27,26 @@
     }
 
     @Test
-    fun testSiblingCallArgs() = assertNoDuplicateKeys(
-        """
+    fun testSiblingCallArgs() =
+        assertNoDuplicateKeys(
+            """
         fun Test() {
             print(1)
             print(1)
         }
         """
-    )
+        )
 
     @Test
-    fun testFunctionCallWithConstArg() = assertKeys(
-        "Int%arg-0%call-print%fun-Test",
-        "Int%arg-0%call-print-1%fun-Test"
-    ) {
-        """
+    fun testFunctionCallWithConstArg() =
+        assertKeys("Int%arg-0%call-print%fun-Test", "Int%arg-0%call-print-1%fun-Test") {
+            """
         fun Test() {
             print(1)
             print(1)
         }
         """
-    }
+        }
 
     @Test
     fun testDispatchReceiver() {
@@ -65,13 +64,12 @@
     }
 
     @Test
-    fun testInsidePropertyGetter() = assertKeys(
-        "Int%fun-%get-foo%%get%val-foo"
-    ) {
-        """
+    fun testInsidePropertyGetter() =
+        assertKeys("Int%fun-%get-foo%%get%val-foo") {
+            """
         val foo: Int get() = 1
         """
-    }
+        }
 
     // NOTE(lmr): For static initializer expressions we can/should do more.
     @Test
@@ -82,13 +80,12 @@
     }
 
     @Test
-    fun testValueParameter() = assertKeys(
-        "Int%param-x%fun-Foo"
-    ) {
-        """
+    fun testValueParameter() =
+        assertKeys("Int%param-x%fun-Foo") {
+            """
         fun Foo(x: Int = 1) { print(x) }
         """
-    }
+        }
 
     @Test
     fun testAnnotation() = assertKeys {
@@ -112,11 +109,12 @@
     }
 
     @Test
-    fun testWhileTrue() = assertKeys(
-        "Double%arg-1%call-greater%cond%if%body%loop%fun-Foo",
-        "Int%arg-0%call-print%body%loop%fun-Foo"
-    ) {
-        """
+    fun testWhileTrue() =
+        assertKeys(
+            "Double%arg-1%call-greater%cond%if%body%loop%fun-Foo",
+            "Int%arg-0%call-print%body%loop%fun-Foo"
+        ) {
+            """
         fun Foo() {
             while (true) {
                 print(1)
@@ -124,26 +122,24 @@
             }
         }
         """
-    }
+        }
 
     @Test
-    fun testWhileCondition() = assertKeys(
-        "Int%arg-0%call-print%body%loop%fun-Foo"
-    ) {
-        """
+    fun testWhileCondition() =
+        assertKeys("Int%arg-0%call-print%body%loop%fun-Foo") {
+            """
         fun Foo() {
             while (Math.random() > 0.5) {
                 print(1)
             }
         }
         """
-    }
+        }
 
     @Test
-    fun testForInCollection() = assertKeys(
-        "Int%arg-0%call-print-1%body%loop%fun-Foo"
-    ) {
-        """
+    fun testForInCollection() =
+        assertKeys("Int%arg-0%call-print-1%body%loop%fun-Foo") {
+            """
         fun Foo(items: List<Int>) {
             for (item in items) {
                 print(item)
@@ -151,7 +147,7 @@
             }
         }
         """
-    }
+        }
 
     // NOTE(lmr): we should deal with this in some cases, but leaving untouched for now
     @Test
@@ -162,35 +158,36 @@
     }
 
     @Test
-    fun testSafeCall() = assertKeys(
-        "Boolean%arg-1%call-EQEQ%fun-Foo",
-        "String%arg-0%call-contains%else%when%arg-0%call-EQEQ%fun-Foo"
-    ) {
-        """
+    fun testSafeCall() =
+        assertKeys(
+            "Boolean%arg-1%call-EQEQ%fun-Foo",
+            "String%arg-0%call-contains%else%when%arg-0%call-EQEQ%fun-Foo"
+        ) {
+            """
         fun Foo(bar: String?): Boolean {
             return bar?.contains("foo") == true
         }
         """
-    }
+        }
 
     @Test
-    fun testElvis() = assertKeys(
-        "String%branch%when%fun-Foo"
-    ) {
-        """
+    fun testElvis() =
+        assertKeys("String%branch%when%fun-Foo") {
+            """
         fun Foo(bar: String?): String {
             return bar ?: "Hello World"
         }
         """
-    }
+        }
 
     @Test
-    fun testTryCatch() = assertKeys(
-        "Int%arg-0%call-invoke%catch%fun-Foo",
-        "Int%arg-0%call-invoke%finally%fun-Foo",
-        "Int%arg-0%call-invoke%try%fun-Foo"
-    ) {
-        """
+    fun testTryCatch() =
+        assertKeys(
+            "Int%arg-0%call-invoke%catch%fun-Foo",
+            "Int%arg-0%call-invoke%finally%fun-Foo",
+            "Int%arg-0%call-invoke%try%fun-Foo"
+        ) {
+            """
         fun Foo(block: (Int) -> Unit) {
             try {
                 block(1)
@@ -201,17 +198,18 @@
             }
         }
         """
-    }
+        }
 
     @Test
-    fun testWhen() = assertKeys(
-        "Double%arg-1%call-greater%cond%when%fun-Foo",
-        "Double%arg-1%call-greater%cond-1%when%fun-Foo",
-        "Int%arg-0%call-print%branch%when%fun-Foo",
-        "Int%arg-0%call-print%branch-1%when%fun-Foo",
-        "Int%arg-0%call-print%else%when%fun-Foo"
-    ) {
-        """
+    fun testWhen() =
+        assertKeys(
+            "Double%arg-1%call-greater%cond%when%fun-Foo",
+            "Double%arg-1%call-greater%cond-1%when%fun-Foo",
+            "Int%arg-0%call-print%branch%when%fun-Foo",
+            "Int%arg-0%call-print%branch-1%when%fun-Foo",
+            "Int%arg-0%call-print%else%when%fun-Foo"
+        ) {
+            """
         fun Foo() {
             when {
                 Math.random() > 0.5 -> print(1)
@@ -220,19 +218,20 @@
             }
         }
         """
-    }
+        }
 
     @Test
-    fun testWhenWithSubject() = assertKeys(
-        "Double%%%this%call-rangeTo%%this%call-contains%cond%when%fun-Foo",
-        "Double%%%this%call-rangeTo%%this%call-contains%cond-1%when%fun-Foo",
-        "Double%arg-0%call-rangeTo%%this%call-contains%cond%when%fun-Foo",
-        "Double%arg-0%call-rangeTo%%this%call-contains%cond-1%when%fun-Foo",
-        "Int%arg-0%call-print%branch%when%fun-Foo",
-        "Int%arg-0%call-print%branch-1%when%fun-Foo",
-        "Int%arg-0%call-print%else%when%fun-Foo"
-    ) {
-        """
+    fun testWhenWithSubject() =
+        assertKeys(
+            "Double%%%this%call-rangeTo%%this%call-contains%cond%when%fun-Foo",
+            "Double%%%this%call-rangeTo%%this%call-contains%cond-1%when%fun-Foo",
+            "Double%arg-0%call-rangeTo%%this%call-contains%cond%when%fun-Foo",
+            "Double%arg-0%call-rangeTo%%this%call-contains%cond-1%when%fun-Foo",
+            "Int%arg-0%call-print%branch%when%fun-Foo",
+            "Int%arg-0%call-print%branch-1%when%fun-Foo",
+            "Int%arg-0%call-print%else%when%fun-Foo"
+        ) {
+            """
         fun Foo() {
             when (val x = Math.random()) {
                 in 0.0..0.5 -> print(1)
@@ -241,15 +240,16 @@
             }
         }
         """
-    }
+        }
 
     @Test
-    fun testWhenWithSubject2() = assertKeys(
-        "Int%arg-0%call-print%branch-1%when%fun-Foo",
-        "Int%arg-0%call-print%else%when%fun-Foo",
-        "String%arg-0%call-print%branch%when%fun-Foo"
-    ) {
-        """
+    fun testWhenWithSubject2() =
+        assertKeys(
+            "Int%arg-0%call-print%branch-1%when%fun-Foo",
+            "Int%arg-0%call-print%else%when%fun-Foo",
+            "String%arg-0%call-print%branch%when%fun-Foo"
+        ) {
+            """
         fun Foo(foo: Any) {
             when (foo) {
                 is String -> print("Hello World")
@@ -258,115 +258,121 @@
             }
         }
         """
-    }
+        }
 
     @Test
-    fun testDelegatingCtor() = assertKeys(
-        "Int%arg-0%call-%init%%class-Bar"
-    ) {
-        """
+    fun testDelegatingCtor() =
+        assertKeys("Int%arg-0%call-%init%%class-Bar") {
+            """
         open class Foo(val x: Int)
         class Bar() : Foo(123)
         """
-    }
+        }
 
     @Test
-    fun testLocalVal() = assertKeys(
-        "Int%arg-0%call-plus%set-y%fun-Foo",
-        "Int%val-x%fun-Foo",
-        "Int%val-y%fun-Foo"
-    ) {
-        """
+    fun testLocalVal() =
+        assertKeys("Int%arg-0%call-plus%set-y%fun-Foo", "Int%val-x%fun-Foo", "Int%val-y%fun-Foo") {
+            """
         fun Foo() {
             val x = 1
             var y = 2
             y += 10
         }
         """
-    }
+        }
 
     @Test
-    fun testCapturedVar() = assertKeys(
-        "Int%val-a%fun-Example",
-        "String%0%str%fun-Example",
-        "String%2%str%fun-Example"
-    ) {
-        """
+    fun testCapturedVar() =
+        assertKeys(
+            "Int%val-a%fun-Example",
+            "String%0%str%fun-Example",
+            "String%2%str%fun-Example"
+        ) {
+            """
         fun Example(): String {
                 val a = 123
                 return "foo ${"$"}a bar"
             }
         """
-    }
+        }
 
     @Test
-    fun testStringTemplate(): Unit = assertKeys(
-        "Int%val-a%fun-Example",
-        "String%0%str%fun-Example",
-        "String%2%str%fun-Example"
-    ) {
-        """
+    fun testStringTemplate(): Unit =
+        assertKeys(
+            "Int%val-a%fun-Example",
+            "String%0%str%fun-Example",
+            "String%2%str%fun-Example"
+        ) {
+            """
         fun Example(): String {
             val a = 123
             return "foo ${"$"}a bar"
         }
         """
-    }
+        }
 
     @Test
-    fun testEnumEntryMultipleArgs(): Unit = assertKeys(
-        "Int%arg-0%call-%init%%entry-Bar%class-A",
-        "Int%arg-0%call-%init%%entry-Baz%class-A",
-        "Int%arg-0%call-%init%%entry-Foo%class-A",
-        "Int%arg-1%call-%init%%entry-Bar%class-A",
-        "Int%arg-1%call-%init%%entry-Baz%class-A",
-        "Int%arg-1%call-%init%%entry-Foo%class-A"
-    ) {
-        """
+    fun testEnumEntryMultipleArgs(): Unit =
+        assertKeys(
+            "Int%arg-0%call-%init%%entry-Bar%class-A",
+            "Int%arg-0%call-%init%%entry-Baz%class-A",
+            "Int%arg-0%call-%init%%entry-Foo%class-A",
+            "Int%arg-1%call-%init%%entry-Bar%class-A",
+            "Int%arg-1%call-%init%%entry-Baz%class-A",
+            "Int%arg-1%call-%init%%entry-Foo%class-A"
+        ) {
+            """
         enum class A(val x: Int, val y: Int) {
             Foo(1, 2),
             Bar(2, 3),
             Baz(3, 4)
         }
         """
-    }
+        }
 
     @Test
-    fun testCommentsAbove() = assertDurableChange(
-        """
+    fun testCommentsAbove() =
+        assertDurableChange(
+            """
             fun Test() {
                 print(1)
             }
-        """.trimIndent(),
         """
+                .trimIndent(),
+            """
             fun Test() {
                 // this is a comment
                 print(1)
             }
-        """.trimIndent()
-    )
+        """
+                .trimIndent()
+        )
 
     @Test
-    fun testValsAndStructureAbove() = assertDurableChange(
-        """
+    fun testValsAndStructureAbove() =
+        assertDurableChange(
+            """
             fun Test() {
                 print(1)
             }
-        """.trimIndent(),
         """
+                .trimIndent(),
+            """
             fun Test() {
                 val x = Math.random()
                 println(x)
                 print(1)
             }
-        """.trimIndent()
-    )
+        """
+                .trimIndent()
+        )
 
     @Test
-    fun testAnonymousClass(): Unit = assertTransform(
-        """
+    fun testAnonymousClass(): Unit =
+        assertTransform(
+            """
         """,
-        """
+            """
             interface Foo { fun bar(): Int }
             fun a(): Foo {
                 return object : Foo {
@@ -374,7 +380,7 @@
                 }
             }
         """
-    )
+        )
 
     @Test
     fun testBasicTransform() {
@@ -428,8 +434,9 @@
     }
 
     @Test
-    fun testComposeIrSkippingWithDefaultsRelease() = verifyGoldenComposeIrTransform(
-        """
+    fun testComposeIrSkippingWithDefaultsRelease() =
+        verifyGoldenComposeIrTransform(
+            """
             import androidx.compose.ui.text.input.TextFieldValue
             import androidx.compose.runtime.*
             import androidx.compose.foundation.layout.*
@@ -449,8 +456,10 @@
                     Text("${'$'}keyboardActions2")
                 }
             }
-        """.trimIndent(),
-        extra = """
+        """
+                .trimIndent(),
+            extra =
+                """
             import androidx.compose.runtime.Composable
 
             @Composable
@@ -460,8 +469,9 @@
                 maxLines: Int = Int.MAX_VALUE,
                 minLines: Int = 1,
             ) {}
-        """.trimIndent()
-    )
+        """
+                    .trimIndent()
+        )
 
     @Test
     fun verifyInitInClass() {
diff --git a/compose/compiler/compiler-hosted/integration-tests/src/jvmTest/kotlin/androidx/compose/compiler/plugins/kotlin/RememberIntrinsicTransformTests.kt b/compose/compiler/compiler-hosted/integration-tests/src/jvmTest/kotlin/androidx/compose/compiler/plugins/kotlin/RememberIntrinsicTransformTests.kt
index 721f513..ef1960d 100644
--- a/compose/compiler/compiler-hosted/integration-tests/src/jvmTest/kotlin/androidx/compose/compiler/plugins/kotlin/RememberIntrinsicTransformTests.kt
+++ b/compose/compiler/compiler-hosted/integration-tests/src/jvmTest/kotlin/androidx/compose/compiler/plugins/kotlin/RememberIntrinsicTransformTests.kt
@@ -33,26 +33,27 @@
     }
 
     private fun comparisonPropagation(
-        @Language("kotlin")
-        unchecked: String,
-        @Language("kotlin")
-        checked: String,
+        @Language("kotlin") unchecked: String,
+        @Language("kotlin") checked: String,
         dumpTree: Boolean = false
-    ) = verifyGoldenComposeIrTransform(
-        """
+    ) =
+        verifyGoldenComposeIrTransform(
+            """
             import androidx.compose.runtime.Composable
             import androidx.compose.runtime.remember
 
             $checked
-        """.trimIndent(),
         """
+                .trimIndent(),
+            """
             import androidx.compose.runtime.Composable
 
             $unchecked
             fun used(x: Any?) {}
-        """.trimIndent(),
-        dumpTree = dumpTree
-    )
+        """
+                .trimIndent(),
+            dumpTree = dumpTree
+        )
 
     @Test
     // The intent of this test is incorrect. If a slot is conditional it requires a group
@@ -69,9 +70,10 @@
     //
     // Without intrinsic remember, the slots are deleted from the slot table when
     // the "remember" group is removed but at the cost of a group to track the slot.
-    fun testElidedRememberInsideIfDeoptsRememberAfterIf(): Unit = comparisonPropagation(
-        "",
-        """
+    fun testElidedRememberInsideIfDeoptsRememberAfterIf(): Unit =
+        comparisonPropagation(
+            "",
+            """
             import androidx.compose.runtime.NonRestartableComposable
 
             @Composable
@@ -81,13 +83,14 @@
                 val b = remember { 2 }
             }
         """
-    )
+        )
 
     @Test
-    fun testMultipleParamInputs(): Unit = comparisonPropagation(
-        """
+    fun testMultipleParamInputs(): Unit =
+        comparisonPropagation(
+            """
         """,
-        """
+            """
             @Composable
             fun <T> loadResourceInternal(
                 key: String,
@@ -100,16 +103,17 @@
                 return deferred > 10
             }
         """
-    )
+        )
 
     @Test
-    fun testRestartableParameterInputsStableUnstableUncertain(): Unit = comparisonPropagation(
-        """
+    fun testRestartableParameterInputsStableUnstableUncertain(): Unit =
+        comparisonPropagation(
+            """
             class KnownStable
             class KnownUnstable(var x: Int)
             interface Uncertain
         """,
-        """
+            """
             @Composable
             fun test1(x: KnownStable) {
                 remember(x) { 1 }
@@ -123,16 +127,17 @@
                 remember(x) { 1 }
             }
         """
-    )
+        )
 
     @Test
-    fun testNonRestartableParameterInputsStableUnstableUncertain(): Unit = comparisonPropagation(
-        """
+    fun testNonRestartableParameterInputsStableUnstableUncertain(): Unit =
+        comparisonPropagation(
+            """
             class KnownStable
             class KnownUnstable(var x: Int)
             interface Uncertain
         """,
-        """
+            """
             import androidx.compose.runtime.NonRestartableComposable
 
             @Composable
@@ -151,26 +156,28 @@
                 remember(x) { 1 }
             }
         """
-    )
+        )
 
     @Test
-    fun testPassedArgs(): Unit = comparisonPropagation(
-        """
+    fun testPassedArgs(): Unit =
+        comparisonPropagation(
+            """
             class Foo(val a: Int, val b: Int)
         """,
-        """
+            """
             @Composable
             fun rememberFoo(a: Int, b: Int) = remember(a, b) { Foo(a, b) }
         """
-    )
+        )
 
     @Test
-    fun testNoArgs(): Unit = comparisonPropagation(
-        """
+    fun testNoArgs(): Unit =
+        comparisonPropagation(
+            """
             class Foo
             @Composable fun A(){}
         """,
-        """
+            """
             @Composable
             fun Test() {
                 val foo = remember { Foo() }
@@ -179,15 +186,16 @@
                 val bam = remember { Foo() }
             }
         """
-    )
+        )
 
     @Test
-    fun testNonArgs(): Unit = comparisonPropagation(
-        """
+    fun testNonArgs(): Unit =
+        comparisonPropagation(
+            """
             class Foo(val a: Int, val b: Int)
             fun someInt(): Int = 123
         """,
-        """
+            """
             @Composable
             fun Test() {
                 val a = someInt()
@@ -195,79 +203,84 @@
                 val foo = remember(a, b) { Foo(a, b) }
             }
         """
-    )
+        )
 
     @Test
-    fun testComposableCallInArgument(): Unit = comparisonPropagation(
-        """
+    fun testComposableCallInArgument(): Unit =
+        comparisonPropagation(
+            """
             class Foo
             @Composable fun CInt(): Int { return 123 }
         """,
-        """
+            """
             @Composable
             fun Test() {
                 val foo = remember(CInt()) { Foo() }
             }
         """
-    )
+        )
 
     @Test
-    fun testCompositionLocalCallBeforeRemember(): Unit = comparisonPropagation(
-        """
+    fun testCompositionLocalCallBeforeRemember(): Unit =
+        comparisonPropagation(
+            """
             import androidx.compose.runtime.compositionLocalOf
 
             class Foo
             class Bar
             val compositionLocalBar = compositionLocalOf<Bar> { Bar() }
         """,
-        """
+            """
             @Composable
             fun Test() {
                 val bar = compositionLocalBar.current
                 val foo = remember(bar) { Foo() }
             }
         """
-    )
+        )
 
     @Test
-    fun testCompositionLocalCallAsInput(): Unit = comparisonPropagation(
-        """
+    fun testCompositionLocalCallAsInput(): Unit =
+        comparisonPropagation(
+            """
             import androidx.compose.runtime.compositionLocalOf
 
             class Foo
             class Bar
             val compositionLocalBar = compositionLocalOf<Bar> { Bar() }
         """,
-        """
+            """
             @Composable
             fun Test() {
                 val foo = remember(compositionLocalBar.current) { Foo() }
             }
         """
-    )
+        )
 
     @Test
-    fun testComposableCallBeforeRemember(): Unit = comparisonPropagation(
-        """
+    fun testComposableCallBeforeRemember(): Unit =
+        comparisonPropagation(
+            """
             class Foo
             @Composable fun A() { }
         """,
-        """
+            """
             @Composable
             fun Test() {
                 A()
                 val foo = remember { Foo() }
             }
         """
-    )
+        )
 
     @Test
-    fun testRememberInsideOfIf(): Unit = comparisonPropagation(
-        """
+    fun testRememberInsideOfIf(): Unit =
+        comparisonPropagation(
+            """
             class Foo
             @Composable fun A() {}
         """,
-        """
+            """
             @Composable
             fun Test(condition: Boolean) {
                 A()
@@ -276,15 +289,16 @@
                 }
             }
         """
-    )
+        )
 
     @Test
-    fun testRememberInsideOfIfWithComposableCallBefore(): Unit = comparisonPropagation(
-        """
+    fun testRememberInsideOfIfWithComposableCallBefore(): Unit =
+        comparisonPropagation(
+            """
             class Foo
             @Composable fun A() {}
         """,
-        """
+            """
             @Composable
             fun Test(condition: Boolean) {
                 if (condition) {
@@ -293,14 +307,15 @@
                 }
             }
         """
-    )
+        )
 
     @Test
-    fun testRememberInsideOfWhileWithOnlyRemembers(): Unit = comparisonPropagation(
-        """
+    fun testRememberInsideOfWhileWithOnlyRemembers(): Unit =
+        comparisonPropagation(
+            """
             class Foo
         """,
-        """
+            """
             @Composable
             fun Test(items: List<Int>) {
                 for (item in items) {
@@ -310,15 +325,16 @@
                 }
             }
         """
-    )
+        )
 
     @Test
-    fun testRememberInsideOfWhileWithCallsAfter(): Unit = comparisonPropagation(
-        """
+    fun testRememberInsideOfWhileWithCallsAfter(): Unit =
+        comparisonPropagation(
+            """
             class Foo
             @Composable fun A() {}
         """,
-        """
+            """
             @Composable
             fun Test(items: List<Int>) {
                 for (item in items) {
@@ -329,72 +345,77 @@
                 }
             }
         """
-    )
+        )
 
     @Test
-    fun testZeroArgRemember(): Unit = comparisonPropagation(
-        """
+    fun testZeroArgRemember(): Unit =
+        comparisonPropagation(
+            """
             class Foo
         """,
-        """
+            """
             @Composable
             fun Test(items: List<Int>) {
                 val foo = remember { Foo() }
                 used(items)
             }
         """
-    )
+        )
 
     @Test
-    fun testRememberWithNArgs(): Unit = comparisonPropagation(
-        """
+    fun testRememberWithNArgs(): Unit =
+        comparisonPropagation(
+            """
             class Foo
             class Bar
         """,
-        """
+            """
             @Composable
             fun Test(a: Int, b: Int, c: Bar, d: Boolean) {
                 val foo = remember(a, b, c, d) { Foo() }
             }
         """
-    )
+        )
 
     @Test
-    fun testVarargWithSpread(): Unit = comparisonPropagation(
-        """
+    fun testVarargWithSpread(): Unit =
+        comparisonPropagation(
+            """
             class Foo
             class Bar
         """,
-        """
+            """
             @Composable
             fun Test(items: Array<Bar>) {
                 val foo = remember(*items) { Foo() }
             }
         """
-    )
+        )
 
     @Test
-    fun testRememberWithInlineClassInput(): Unit = comparisonPropagation(
-        """
+    fun testRememberWithInlineClassInput(): Unit =
+        comparisonPropagation(
+            """
             class Foo
             inline class InlineInt(val value: Int)
         """,
-        """
+            """
             @Composable
             fun Test(inlineInt: InlineInt) {
                 val a = InlineInt(123)
                 val foo = remember(inlineInt, a) { Foo() }
             }
         """
-    )
+        )
 
     @Test
-    fun testMultipleRememberCallsInARow(): Unit = comparisonPropagation(
-        """
+    fun testMultipleRememberCallsInARow(): Unit =
+        comparisonPropagation(
+            """
             class Foo(val a: Int, val b: Int)
             fun someInt(): Int = 123
         """,
-        """
+            """
             @Composable
             fun Test() {
                 val a = someInt()
@@ -405,95 +426,103 @@
                 val bar = remember(c, d) { Foo(c, d) }
             }
         """
-    )
+        )
 
     @Test
-    fun testParamAndNonParamInputsInRestartableFunction(): Unit = comparisonPropagation(
-        """
+    fun testParamAndNonParamInputsInRestartableFunction(): Unit =
+        comparisonPropagation(
+            """
             class Foo(val a: Int, val b: Int)
             fun someInt(): Int = 123
         """,
-        """
+            """
             @Composable
             fun Test(a: Int) {
                 val b = someInt()
                 val foo = remember(a, b) { Foo(a, b) }
             }
         """
-    )
+        )
 
     @Test
-    fun testParamAndNonParamInputsInDirectFunction(): Unit = comparisonPropagation(
-        """
+    fun testParamAndNonParamInputsInDirectFunction(): Unit =
+        comparisonPropagation(
+            """
             class Foo(val a: Int, val b: Int)
             fun someInt(): Int = 123
         """,
-        """
+            """
             @Composable
             fun Test(a: Int): Foo {
                 val b = someInt()
                 return remember(a, b) { Foo(a, b) }
             }
         """
-    )
+        )
 
     @Test
-    fun testRememberMemoizedLambda(): Unit = comparisonPropagation(
-        "",
-        """
+    fun testRememberMemoizedLambda(): Unit =
+        comparisonPropagation(
+            "",
+            """
             @Composable
             fun Test(a: Int) {
                 used { a }
             }
         """
-    )
+        )
 
     @Test
-    fun testRememberFunctionReference(): Unit = comparisonPropagation(
-        """
+    fun testRememberFunctionReference(): Unit =
+        comparisonPropagation(
+            """
             fun effect(): Int = 0
         """,
-        """
+            """
             @Composable
             fun Test(a: Int) {
                 used(remember(a, ::effect))
             }
         """
-    )
+        )
 
     @Test
-    fun testRememberAdaptedFunctionReference(): Unit = comparisonPropagation(
-        """
+    fun testRememberAdaptedFunctionReference(): Unit =
+        comparisonPropagation(
+            """
             fun effect(a: Int = 0): Int = a
         """,
-        """
+            """
             @Composable
             fun Test(a: Int) {
                 used(remember(a, ::effect))
             }
         """
-    )
+        )
 
     @Test
-    fun testRememberPropertyReference(): Unit = comparisonPropagation(
-        """
+    fun testRememberPropertyReference(): Unit =
+        comparisonPropagation(
+            """
             class A(val value: Int)
-        """.trimIndent(),
         """
+                .trimIndent(),
+            """
             @Composable
             fun Test(a: A) {
                 used(remember(a, a::value))
             }
         """
-    )
+        )
 
     @Test
-    fun testOptimizationFailsIfDefaultsGroupIsUsed(): Unit = comparisonPropagation(
-        """
+    fun testOptimizationFailsIfDefaultsGroupIsUsed(): Unit =
+        comparisonPropagation(
+            """
             class Foo
             fun someInt(): Int = 123
         """,
-        """
+            """
             @Composable
             fun Test(a: Int = someInt()) {
                 val foo = remember { Foo() }
@@ -501,26 +530,28 @@
                 used(a)
             }
         """
-    )
+        )
 
     @Test
-    fun testIntrinsicRememberOfDefaultParameters_Simple() = comparisonPropagation(
-        """""",
-        """
+    fun testIntrinsicRememberOfDefaultParameters_Simple() =
+        comparisonPropagation(
+            """""",
+            """
             @Composable
             fun Test(a: Int = remember { 0 }) {
                 used(a)
             }
         """
-    )
+        )
 
     @Test
-    fun testIntrinsicRememberOfDefaultParameters_AfterComposable() = comparisonPropagation(
-        """
+    fun testIntrinsicRememberOfDefaultParameters_AfterComposable() =
+        comparisonPropagation(
+            """
             @Composable
             fun SomeComposable() = 0
         """,
-        """
+            """
             @Composable
             fun Test(a: Int = remember { 0 }, b: Int = SomeComposable(), c: Int = remember { 0 }) {
                 used(a)
@@ -528,18 +559,19 @@
                 used(c)
             }
         """
-    )
+        )
 
     @Test
-    fun testIntrinsicRememberOfLambdaInIfBlock() = comparisonPropagation(
-        // Simulation of Scrim in BackdropScaffold
-        """
+    fun testIntrinsicRememberOfLambdaInIfBlock() =
+        comparisonPropagation(
+            // Simulation of Scrim in BackdropScaffold
+            """
             class Modifier
             fun Modifier.pointerInput(key1: Any?, block: () -> Unit) = this
             fun detectTapGestures(block: () -> Unit) {}
             @Composable fun someComposableValue(): Int = 1
         """,
-        """
+            """
         @Composable
         fun Test(a: Boolean, visible: Boolean, onDismiss: () -> Unit) {
             if (a) {
@@ -555,11 +587,13 @@
             }
         }
         """
-    )
+        )
 
     @Test
-    fun testRememberAfterStaticDefaultParameters() = comparisonPropagation(
-        unchecked = """
+    fun testRememberAfterStaticDefaultParameters() =
+        comparisonPropagation(
+            unchecked =
+                """
             import androidx.compose.runtime.*
 
             enum class Foo {
@@ -574,18 +608,21 @@
             @Composable
             fun used(a: Any) { }
             """,
-        checked = """
+            checked =
+                """
             @Composable
             fun Test(a: Int = 1, b: Foo = Foo.B, c: Int = swizzle(1, 2) ) {
                 val s = remember(a, b, c) { Any() }
                 used(s)
             }
         """
-    )
+        )
 
     @Test
-    fun testRememberAfterNonStaticDefaultParameters() = comparisonPropagation(
-        unchecked = """
+    fun testRememberAfterNonStaticDefaultParameters() =
+        comparisonPropagation(
+            unchecked =
+                """
             import androidx.compose.runtime.*
 
             enum class Foo {
@@ -599,18 +636,21 @@
             @Composable
             fun used(a: Any) { }
             """,
-        checked = """
+            checked =
+                """
             @Composable
             fun Test(a: Int = 1, b: Foo = Foo.B, c: Int = swizzle(1, 2) ) {
                 val s = remember(a, b, c) { Any() }
                 used(s)
             }
         """
-    )
+        )
 
     @Test
-    fun testForEarlyExit() = verifyGoldenComposeIrTransform(
-        source = """
+    fun testForEarlyExit() =
+        verifyGoldenComposeIrTransform(
+            source =
+                """
             import androidx.compose.runtime.*
 
             @Composable
@@ -621,17 +661,20 @@
                 Text("Text ${'$'}{value.value}, ${'$'}{value2.value}")
             }
         """,
-        extra = """
+            extra =
+                """
             import androidx.compose.runtime.*
 
             @Composable
             fun Text(value: String) { }
         """
-    )
+        )
 
     @Test
-    fun testVarargsIntrinsicRemember() = verifyGoldenComposeIrTransform(
-        source = """
+    fun testVarargsIntrinsicRemember() =
+        verifyGoldenComposeIrTransform(
+            source =
+                """
             import androidx.compose.runtime.*
 
             @Composable
@@ -642,17 +685,20 @@
                 }
             }
         """,
-        extra = """
+            extra =
+                """
             import androidx.compose.runtime.*
 
             @Composable
             fun Text(value: String) { }
         """
-    )
+        )
 
     @Test // regression test for b/267586102
-    fun testRememberInALoop() = verifyGoldenComposeIrTransform(
-        source = """
+    fun testRememberInALoop() =
+        verifyGoldenComposeIrTransform(
+            source =
+                """
             import androidx.compose.runtime.*
 
             val content: @Composable (a: SomeUnstableClass) -> Unit = {
@@ -662,17 +708,20 @@
                 val a = remember { 1 }
             }
         """,
-        extra = """
+            extra =
+                """
             import androidx.compose.runtime.*
 
             val count = 0
             class SomeUnstableClass(val a: Any = "abc")
         """
-    )
+        )
 
     @Test // Regression test for b/267586102 to ensure the fix doesn't insert unnecessary groups
-    fun testRememberInALoop_NoTrailingRemember() = verifyGoldenComposeIrTransform(
-        source = """
+    fun testRememberInALoop_NoTrailingRemember() =
+        verifyGoldenComposeIrTransform(
+            source =
+                """
             import androidx.compose.runtime.*
 
             val content: @Composable (a: SomeUnstableClass) -> Unit = {
@@ -681,17 +730,20 @@
                 }
             }
         """,
-        extra = """
+            extra =
+                """
                 import androidx.compose.runtime.*
 
                 val count = 0
                 class SomeUnstableClass(val a: Any = "abc")
             """
-    )
+        )
 
     @Test
-    fun testRememberWithUnstableUnused_InInlineLambda() = verifyGoldenComposeIrTransform(
-        source = """
+    fun testRememberWithUnstableUnused_InInlineLambda() =
+        verifyGoldenComposeIrTransform(
+            source =
+                """
             import androidx.compose.runtime.*
 
             @Composable fun Test(param: String, unstable: List<*>) {
@@ -700,16 +752,19 @@
                 }
             }
         """,
-        extra = """
+            extra =
+                """
                 import androidx.compose.runtime.*
 
                 @Composable inline fun InlineWrapper(block: @Composable () -> Unit) {}
             """,
-    )
+        )
 
     @Test
-    fun testRememberWithUnstable_InInlineLambda() = verifyGoldenComposeIrTransform(
-        source = """
+    fun testRememberWithUnstable_InInlineLambda() =
+        verifyGoldenComposeIrTransform(
+            source =
+                """
             import androidx.compose.runtime.*
 
             @Composable fun Test(param: String, unstable: List<*>) {
@@ -719,16 +774,19 @@
                 }
             }
         """,
-        extra = """
+            extra =
+                """
                 import androidx.compose.runtime.*
 
                 @Composable inline fun InlineWrapper(block: @Composable () -> Unit) {}
             """,
-    )
+        )
 
     @Test
-    fun testRememberWithUnstable_inLambda() = verifyGoldenComposeIrTransform(
-        source = """
+    fun testRememberWithUnstable_inLambda() =
+        verifyGoldenComposeIrTransform(
+            source =
+                """
             import androidx.compose.runtime.*
 
             @Composable fun Test(param: String, unstable: List<*>) {
@@ -737,16 +795,19 @@
                 }
             }
         """,
-        extra = """
+            extra =
+                """
                 import androidx.compose.runtime.*
 
                 @Composable fun Wrapper(block: @Composable () -> Unit) {}
             """,
-    )
+        )
 
     @Test
-    fun testRememberExpressionMeta() = verifyGoldenComposeIrTransform(
-        source = """
+    fun testRememberExpressionMeta() =
+        verifyGoldenComposeIrTransform(
+            source =
+                """
             import androidx.compose.runtime.*
 
             @Composable fun Test(param: String) {
@@ -754,11 +815,13 @@
                 Test(a)
             }
         """,
-    )
+        )
 
     @Test
-    fun testMemoizationWStableCapture() = verifyGoldenComposeIrTransform(
-        source = """
+    fun testMemoizationWStableCapture() =
+        verifyGoldenComposeIrTransform(
+            source =
+                """
             import androidx.compose.runtime.*
 
             @Composable fun Test(param: String, unstable: List<*>) {
@@ -767,16 +830,19 @@
                 }
             }
         """,
-        extra = """
+            extra =
+                """
                 import androidx.compose.runtime.*
 
                 @Composable fun Wrapper(block: () -> Unit) {}
             """,
-    )
+        )
 
     @Test
-    fun testMemoizationWUnstableCapture() = verifyGoldenComposeIrTransform(
-        source = """
+    fun testMemoizationWUnstableCapture() =
+        verifyGoldenComposeIrTransform(
+            source =
+                """
             import androidx.compose.runtime.*
 
             @Composable fun Test(param: String, unstable: List<*>) {
@@ -785,17 +851,17 @@
                 }
             }
         """,
-        extra = """
+            extra =
+                """
                 import androidx.compose.runtime.*
 
                 @Composable fun Wrapper(block: () -> Unit) {}
             """,
-    )
+        )
 }
 
-class RememberIntrinsicTransformTestsStrongSkipping(
-    useFir: Boolean
-) : AbstractIrTransformTest(useFir) {
+class RememberIntrinsicTransformTestsStrongSkipping(useFir: Boolean) :
+    AbstractIrTransformTest(useFir) {
     override fun CompilerConfiguration.updateConfiguration() {
         put(ComposeConfiguration.SOURCE_INFORMATION_ENABLED_KEY, true)
         put(
@@ -809,8 +875,10 @@
     }
 
     @Test
-    fun testMemoizationWStableCapture() = verifyGoldenComposeIrTransform(
-        source = """
+    fun testMemoizationWStableCapture() =
+        verifyGoldenComposeIrTransform(
+            source =
+                """
             import androidx.compose.runtime.*
 
             @Composable fun Test(param: String, unstable: List<*>) {
@@ -819,16 +887,19 @@
                 }
             }
         """,
-        extra = """
+            extra =
+                """
                 import androidx.compose.runtime.*
 
                 @Composable fun Wrapper(block: () -> Unit) {}
             """,
-    )
+        )
 
     @Test
-    fun testMemoizationWUnstableCapture() = verifyGoldenComposeIrTransform(
-        source = """
+    fun testMemoizationWUnstableCapture() =
+        verifyGoldenComposeIrTransform(
+            source =
+                """
             import androidx.compose.runtime.*
 
             @Composable fun Test(param: String, unstable: List<*>) {
@@ -837,16 +908,19 @@
                 }
             }
         """,
-        extra = """
+            extra =
+                """
                 import androidx.compose.runtime.*
 
                 @Composable fun Wrapper(block: () -> Unit) {}
             """,
-    )
+        )
 
     @Test
-    fun testRememberWithUnstableParam() = verifyGoldenComposeIrTransform(
-        source = """
+    fun testRememberWithUnstableParam() =
+        verifyGoldenComposeIrTransform(
+            source =
+                """
             import androidx.compose.runtime.*
 
             @Composable fun Test(param: String, unstable: List<*>) {
@@ -855,16 +929,19 @@
                 }
             }
         """,
-    )
+        )
 
     @Test
-    fun testRememberWithDefaultParams() = verifyGoldenComposeIrTransform(
-        extra = """
+    fun testRememberWithDefaultParams() =
+        verifyGoldenComposeIrTransform(
+            extra =
+                """
             import androidx.compose.runtime.*
 
             val LocalColor = compositionLocalOf { 0 }
         """,
-        source = """
+            source =
+                """
             import androidx.compose.runtime.*
 
             @Composable fun Icon(
@@ -874,11 +951,13 @@
                 val remembered = remember(param, defaultParam) { TODO() }
             }
         """
-    )
+        )
 
     @Test
-    fun testRememberMethodReference() = verifyGoldenComposeIrTransform(
-        source = """
+    fun testRememberMethodReference() =
+        verifyGoldenComposeIrTransform(
+            source =
+                """
             import androidx.compose.runtime.*
 
             @Composable fun Icon(
@@ -887,5 +966,5 @@
                 val remembered = remember(param::toString) { TODO() }
             }
         """
-    )
+        )
 }
diff --git a/compose/compiler/compiler-hosted/integration-tests/src/jvmTest/kotlin/androidx/compose/compiler/plugins/kotlin/RunComposableTests.kt b/compose/compiler/compiler-hosted/integration-tests/src/jvmTest/kotlin/androidx/compose/compiler/plugins/kotlin/RunComposableTests.kt
index d324b21..ef6fdb9 100644
--- a/compose/compiler/compiler-hosted/integration-tests/src/jvmTest/kotlin/androidx/compose/compiler/plugins/kotlin/RunComposableTests.kt
+++ b/compose/compiler/compiler-hosted/integration-tests/src/jvmTest/kotlin/androidx/compose/compiler/plugins/kotlin/RunComposableTests.kt
@@ -36,16 +36,19 @@
 
 class RunComposableTests(useFir: Boolean) : AbstractCodegenTest(useFir) {
     override fun CompilerConfiguration.updateConfiguration() {
-        setupLanguageVersionSettings(K2JVMCompilerArguments().apply {
-            // enabling multiPlatform to use expect/actual declarations
-            multiPlatform = true
-        })
+        setupLanguageVersionSettings(
+            K2JVMCompilerArguments().apply {
+                // enabling multiPlatform to use expect/actual declarations
+                multiPlatform = true
+            }
+        )
     }
 
     @Test // Bug report: https://github.com/JetBrains/compose-jb/issues/1407
     fun testSimpleDefaultInComposable() {
         runCompose(
-            testFunBody = """
+            testFunBody =
+                """
                 results["defaultValue"] = ExpectComposable()
                 results["anotherValue"] = ExpectComposable("anotherValue")
                 results["defaultValueDefaultTransform"] = ExpectComposableWithNonComposableLambda()
@@ -53,9 +56,12 @@
                     ExpectComposableWithNonComposableLambda("anotherValue") {
                         it + "OtherTransform"
                     }
-            """.trimIndent(),
-            commonFiles = mapOf(
-                "Expect.kt" to """
+            """
+                    .trimIndent(),
+            commonFiles =
+                mapOf(
+                    "Expect.kt" to
+                        """
                     import androidx.compose.runtime.*
 
                     @Composable
@@ -68,9 +74,13 @@
                         value: String = "defaultValue",
                         transform: (String) -> String = { it + "DefaultTransform" }
                     ): String
-                """.trimIndent()
-            ),
-            platformFiles = mapOf("Actual.kt" to """
+                """
+                            .trimIndent()
+                ),
+            platformFiles =
+                mapOf(
+                    "Actual.kt" to
+                        """
                     import androidx.compose.runtime.*
 
                     @Composable
@@ -83,8 +93,9 @@
                         value: String,
                         transform: (String) -> String
                     ) = transform(value)
-                """.trimIndent()
-            )
+                """
+                            .trimIndent()
+                )
         ) { results ->
             assertEquals("defaultValue", results["defaultValue"])
             assertEquals("anotherValue", results["anotherValue"])
@@ -96,7 +107,8 @@
     @Test // Bug report: https://github.com/JetBrains/compose-jb/issues/1407
     fun testDefaultValuesFromExpectComposableFunctions() {
         runCompose(
-            testFunBody = """
+            testFunBody =
+                """
                 ExpectComposable { value ->
                     results["defaultValue"] = value
                 }
@@ -105,9 +117,12 @@
                 }
                 results["returnDefaultValue"] = ExpectComposableWithReturn()
                 results["returnAnotherValue"] = ExpectComposableWithReturn("returnAnotherValue")
-            """.trimIndent(),
-            commonFiles = mapOf(
-                "Expect.kt" to """
+            """
+                    .trimIndent(),
+            commonFiles =
+                mapOf(
+                    "Expect.kt" to
+                        """
                     import androidx.compose.runtime.*
 
                     @Composable
@@ -119,9 +134,13 @@
                     expect fun ExpectComposableWithReturn(
                         value: String = "returnDefaultValue"
                     ): String
-                """.trimIndent()
-            ),
-            platformFiles = mapOf("Actual.kt" to """
+                """
+                            .trimIndent()
+                ),
+            platformFiles =
+                mapOf(
+                    "Actual.kt" to
+                        """
                     import androidx.compose.runtime.*
 
                     @Composable
@@ -135,8 +154,9 @@
                     actual fun ExpectComposableWithReturn(
                         value: String
                     ): String = value
-                """.trimIndent()
-            )
+                """
+                            .trimIndent()
+                )
         ) { results ->
             assertEquals("defaultValue", results["defaultValue"])
             assertEquals("anotherValue", results["anotherValue"])
@@ -148,16 +168,20 @@
     @Test
     fun testExpectWithGetExpectedPropertyInDefaultValueExpression() {
         runCompose(
-            testFunBody = """
+            testFunBody =
+                """
                 ExpectComposable { value ->
                     results["defaultValue"] = value
                 }
                 ExpectComposable({ expectedProperty + expectedProperty.reversed() }) { value ->
                     results["anotherValue"] = value
                 }
-            """.trimIndent(),
-            commonFiles = mapOf(
-                "Expect.kt" to """
+            """
+                    .trimIndent(),
+            commonFiles =
+                mapOf(
+                    "Expect.kt" to
+                        """
                     import androidx.compose.runtime.*
 
                     expect val expectedProperty: String
@@ -167,9 +191,13 @@
                         value: () -> String = { expectedProperty },
                         content: @Composable (v: String) -> Unit
                     )
-                """.trimIndent()),
-            platformFiles = mapOf(
-                "Actual.kt" to """
+                """
+                            .trimIndent()
+                ),
+            platformFiles =
+                mapOf(
+                    "Actual.kt" to
+                        """
                     import androidx.compose.runtime.*
 
                     actual val expectedProperty = "actualExpectedProperty"
@@ -181,8 +209,9 @@
                     ) {
                         content(value())
                     }
-                """.trimIndent()
-            )
+                """
+                            .trimIndent()
+                )
         ) { results ->
             assertEquals("actualExpectedProperty", results["defaultValue"])
             assertEquals(
@@ -195,16 +224,20 @@
     @Test
     fun testExpectWithComposableExpressionInDefaultValue() {
         runCompose(
-            testFunBody = """
+            testFunBody =
+                """
                 ExpectComposable { value ->
                     results["defaultValue"] = value
                 }
                 ExpectComposable("anotherValue") { value ->
                     results["anotherValue"] = value
                 }
-            """.trimIndent(),
-            commonFiles = mapOf(
-                "Expect.kt" to """
+            """
+                    .trimIndent(),
+            commonFiles =
+                mapOf(
+                    "Expect.kt" to
+                        """
                     import androidx.compose.runtime.*
 
                     @Composable
@@ -217,9 +250,13 @@
                         value: String = defaultValueComposable(),
                         content: @Composable (v: String) -> Unit
                     )
-                """.trimIndent()),
-            platformFiles = mapOf(
-                "Actual.kt" to """
+                """
+                            .trimIndent()
+                ),
+            platformFiles =
+                mapOf(
+                    "Actual.kt" to
+                        """
                     import androidx.compose.runtime.*
 
                     @Composable
@@ -229,8 +266,9 @@
                     ) {
                         content(value)
                     }
-                """.trimIndent()
-            )
+                """
+                            .trimIndent()
+                )
         ) { results ->
             assertEquals("defaultValueComposable", results["defaultValue"])
             assertEquals("anotherValue", results["anotherValue"])
@@ -240,16 +278,20 @@
     @Test
     fun testExpectWithTypedParameter() {
         runCompose(
-            testFunBody = """
+            testFunBody =
+                """
                 ExpectComposable<String>("aeiouy") { value ->
                     results["defaultValue"] = value
                 }
                 ExpectComposable<String>("aeiouy", { "anotherValue" }) { value ->
                     results["anotherValue"] = value
                 }
-            """.trimIndent(),
-            commonFiles = mapOf(
-                "Expect.kt" to """
+            """
+                    .trimIndent(),
+            commonFiles =
+                mapOf(
+                    "Expect.kt" to
+                        """
                     import androidx.compose.runtime.*
 
                     @Composable
@@ -258,9 +300,13 @@
                         composeValue: @Composable () -> T = { value },
                         content: @Composable (T) -> Unit
                     )
-                """.trimIndent()),
-            platformFiles = mapOf(
-                "Actual.kt" to """
+                """
+                            .trimIndent()
+                ),
+            platformFiles =
+                mapOf(
+                    "Actual.kt" to
+                        """
                     import androidx.compose.runtime.*
 
                     @Composable
@@ -271,8 +317,9 @@
                     ) {
                         content(composeValue())
                     }
-                """.trimIndent()
-            )
+                """
+                            .trimIndent()
+                )
         ) { results ->
             assertEquals("aeiouy", results["defaultValue"])
             assertEquals("anotherValue", results["anotherValue"])
@@ -282,16 +329,20 @@
     @Test
     fun testExpectWithRememberInDefaultValueExpression() {
         runCompose(
-            testFunBody = """
+            testFunBody =
+                """
                 ExpectComposable { value ->
                     results["defaultValue"] = value
                 }
                 ExpectComposable(remember { "anotherRememberedValue" }) { value ->
                     results["anotherValue"] = value
                 }
-            """.trimIndent(),
-            commonFiles = mapOf(
-                "Expect.kt" to """
+            """
+                    .trimIndent(),
+            commonFiles =
+                mapOf(
+                    "Expect.kt" to
+                        """
                     import androidx.compose.runtime.*
 
                     @Composable
@@ -299,9 +350,13 @@
                         value: String = remember { "rememberedDefaultValue" },
                         content: @Composable (v: String) -> Unit
                     )
-                """.trimIndent()),
-            platformFiles = mapOf(
-                "Actual.kt" to """
+                """
+                            .trimIndent()
+                ),
+            platformFiles =
+                mapOf(
+                    "Actual.kt" to
+                        """
                     import androidx.compose.runtime.*
 
                     @Composable
@@ -311,8 +366,9 @@
                     ) {
                         content(value)
                     }
-                """.trimIndent()
-            )
+                """
+                            .trimIndent()
+                )
         ) { results ->
             assertEquals("rememberedDefaultValue", results["defaultValue"])
             assertEquals("anotherRememberedValue", results["anotherValue"])
@@ -322,16 +378,20 @@
     @Test
     fun testExpectWithDefaultValueUsingAnotherArgument() {
         runCompose(
-            testFunBody = """
+            testFunBody =
+                """
                 ExpectComposable("AbccbA") { value ->
                     results["defaultValue"] = value
                 }
                 ExpectComposable("123", { s -> s + s.reversed() }) { value ->
                     results["anotherValue"] = value
                 }
-            """.trimIndent(),
-            commonFiles = mapOf(
-                "Expect.kt" to """
+            """
+                    .trimIndent(),
+            commonFiles =
+                mapOf(
+                    "Expect.kt" to
+                        """
                     import androidx.compose.runtime.*
 
                     @Composable
@@ -340,9 +400,13 @@
                         composeText: (String) -> String = { value },
                         content: @Composable (v: String) -> Unit
                     )
-                """.trimIndent()),
-            platformFiles = mapOf(
-                "Actual.kt" to """
+                """
+                            .trimIndent()
+                ),
+            platformFiles =
+                mapOf(
+                    "Actual.kt" to
+                        """
                     import androidx.compose.runtime.*
 
                     @Composable
@@ -353,8 +417,9 @@
                     ) {
                         content(composeText(value))
                     }
-                """.trimIndent()
-            )
+                """
+                            .trimIndent()
+                )
         ) { results ->
             assertEquals("AbccbA", results["defaultValue"])
             assertEquals("123321", results["anotherValue"])
@@ -364,7 +429,8 @@
     @Test
     fun testNonComposableFunWithComposableParam() {
         runCompose(
-            testFunBody = """
+            testFunBody =
+                """
                 savedContentLambda = null
                 ExpectFunWithComposableParam { value ->
                     results["defaultValue"] = value
@@ -376,9 +442,12 @@
                     results["anotherValue"] = value
                 }
                 savedContentLambda!!.invoke()
-            """.trimIndent(),
-            commonFiles = mapOf(
-                "Expect.kt" to """
+            """
+                    .trimIndent(),
+            commonFiles =
+                mapOf(
+                    "Expect.kt" to
+                        """
                     import androidx.compose.runtime.*
 
                     var savedContentLambda: (@Composable () -> Unit)? = null
@@ -387,9 +456,13 @@
                         value: String = "000",
                         content: @Composable (v: String) -> Unit
                     )
-                """.trimIndent()),
-            platformFiles = mapOf(
-                "Actual.kt" to """
+                """
+                            .trimIndent()
+                ),
+            platformFiles =
+                mapOf(
+                    "Actual.kt" to
+                        """
                     import androidx.compose.runtime.*
 
                     actual fun ExpectFunWithComposableParam(
@@ -400,8 +473,9 @@
                             content(value)
                         }
                     }
-                """.trimIndent()
-            )
+                """
+                            .trimIndent()
+                )
         ) { results ->
             assertEquals("000", results["defaultValue"])
             assertEquals("3.14", results["anotherValue"])
@@ -411,17 +485,18 @@
     // This method was partially borrowed/copy-pasted from RobolectricComposeTester
     // where some of the code was commented out. Those commented out parts are needed here.
     private fun runCompose(
-        @Language("kotlin")
-        mainImports: String = "",
-        @Language("kotlin")
-        testFunBody: String,
+        @Language("kotlin") mainImports: String = "",
+        @Language("kotlin") testFunBody: String,
         commonFiles: Map<String, String>, // name to source code
         platformFiles: Map<String, String>, // name to source code
         accessResults: (results: HashMap<*, *>) -> Unit
     ) {
         val className = "TestFCS_${uniqueNumber++}"
 
-        val allCommonSources = commonFiles + ("Main.kt" to """
+        val allCommonSources =
+            commonFiles +
+                ("Main.kt" to
+                    """
             import androidx.compose.runtime.*
             $mainImports
 
@@ -434,17 +509,14 @@
                 }
             }
 
-        """.trimIndent())
+        """
+                        .trimIndent())
 
         val compiledClassesLoader = classLoader(platformFiles, allCommonSources)
         val instanceClass = compiledClassesLoader.loadClass(className)
 
         val instanceOfClass = instanceClass.getDeclaredConstructor().newInstance()
-        val testMethod = instanceClass.getMethod(
-            "test",
-            Composer::class.java,
-            Int::class.java
-        )
+        val testMethod = instanceClass.getMethod("test", Composer::class.java, Int::class.java)
         val getResultsMethod = instanceClass.getMethod("getResults")
 
         val setContentMethod = Composition::class.java.methods.first { it.name == "setContent" }
@@ -466,29 +538,32 @@
             get() = Unit
 
         override fun down(node: Unit) {}
+
         override fun up() {}
+
         override fun insertTopDown(index: Int, instance: Unit) {}
+
         override fun insertBottomUp(index: Int, instance: Unit) {}
+
         override fun remove(index: Int, count: Int) {}
+
         override fun move(from: Int, to: Int, count: Int) {}
+
         override fun clear() {}
     }
 
     private object SixtyFpsMonotonicFrameClock : MonotonicFrameClock {
         private const val fps = 60
 
-        override suspend fun <R> withFrameNanos(
-            onFrame: (Long) -> R
-        ): R {
+        override suspend fun <R> withFrameNanos(onFrame: (Long) -> R): R {
             delay(1000L / fps)
             return onFrame(System.nanoTime())
         }
     }
 
     private fun createRecomposer(): Recomposer {
-        val mainScope = CoroutineScope(
-            NonCancellable + Dispatchers.Main + SixtyFpsMonotonicFrameClock
-        )
+        val mainScope =
+            CoroutineScope(NonCancellable + Dispatchers.Main + SixtyFpsMonotonicFrameClock)
 
         return Recomposer(mainScope.coroutineContext).also {
             mainScope.launch(start = CoroutineStart.UNDISPATCHED) {
diff --git a/compose/compiler/compiler-hosted/integration-tests/src/jvmTest/kotlin/androidx/compose/compiler/plugins/kotlin/ScopeComposabilityTests.kt b/compose/compiler/compiler-hosted/integration-tests/src/jvmTest/kotlin/androidx/compose/compiler/plugins/kotlin/ScopeComposabilityTests.kt
index 6af9824..5b1c6f8 100644
--- a/compose/compiler/compiler-hosted/integration-tests/src/jvmTest/kotlin/androidx/compose/compiler/plugins/kotlin/ScopeComposabilityTests.kt
+++ b/compose/compiler/compiler-hosted/integration-tests/src/jvmTest/kotlin/androidx/compose/compiler/plugins/kotlin/ScopeComposabilityTests.kt
@@ -36,8 +36,9 @@
 @RunWith(JUnit4::class)
 class ScopeComposabilityTests : AbstractCodegenTest(useFir = false) {
     @Test
-    fun testNormalFunctions() = assertComposability(
-        """
+    fun testNormalFunctions() =
+        assertComposability(
+            """
             import androidx.compose.runtime.*
 
             fun Foo() {
@@ -48,20 +49,22 @@
                 val baz: Int get() { <normal>return 123 }
             }
         """
-    )
+        )
 
     @Test
-    fun testPropGetter() = assertComposability(
-        """
+    fun testPropGetter() =
+        assertComposability(
+            """
             import androidx.compose.runtime.*
 
             val baz: Int get() { <normal>return 123 }
         """
-    )
+        )
 
     @Test
-    fun testBasicComposable() = assertComposability(
-        """
+    fun testBasicComposable() =
+        assertComposability(
+            """
             import androidx.compose.runtime.*
 
             @Composable
@@ -69,11 +72,12 @@
                 <composable>
             }
         """
-    )
+        )
 
     @Test
-    fun testBasicComposable2() = assertComposability(
-        """
+    fun testBasicComposable2() =
+        assertComposability(
+            """
             import androidx.compose.runtime.*
 
             val foo = @Composable { <composable> }
@@ -87,13 +91,14 @@
                 @Composable fun z() { <composable> }
             }
         """
-    )
+        )
 
     // We only analyze scopes that contain composable calls, so this test fails without the
     // nested call to `Bar`. This is why this test was originally muted (b/147250515).
     @Test
-    fun testBasicComposable3() = assertComposability(
-        """
+    fun testBasicComposable3() =
+        assertComposability(
+            """
             import androidx.compose.runtime.*
 
             @Composable
@@ -104,11 +109,12 @@
                 }
             }
         """
-    )
+        )
 
     @Test
-    fun testBasicComposable4() = assertComposability(
-        """
+    fun testBasicComposable4() =
+        assertComposability(
+            """
             import androidx.compose.runtime.*
 
             @Composable fun Wrap(block: @Composable () -> Unit) { block() }
@@ -124,11 +130,12 @@
                 }
             }
         """
-    )
+        )
 
     @Test
-    fun testBasicComposable5() = assertComposability(
-        """
+    fun testBasicComposable5() =
+        assertComposability(
+            """
             import androidx.compose.runtime.*
 
             @Composable fun Callback(block: () -> Unit) { block() }
@@ -141,11 +148,12 @@
                 }
             }
         """
-    )
+        )
 
     @Test
-    fun testBasicComposable6() = assertComposability(
-        """
+    fun testBasicComposable6() =
+        assertComposability(
+            """
             import androidx.compose.runtime.*
 
             fun kickOff(block: @Composable () -> Unit) {  }
@@ -157,7 +165,7 @@
                 }
             }
         """
-    )
+        )
 
     private fun assertComposability(srcText: String) {
         val (text, carets) = extractCarets(srcText)
@@ -171,31 +179,28 @@
 
             when (marking) {
                 "<composable>" -> assertTrue("index: $index", composable)
-                "<normal>" -> assertTrue(
-                    "index: $index",
-                    !composable
-                )
+                "<normal>" -> assertTrue("index: $index", !composable)
                 else -> error("Composability of $marking not recognized.")
             }
         }
     }
 
     private val callPattern = Regex("(<composable>)|(<normal>)")
+
     private fun extractCarets(text: String): Pair<String, List<Pair<Int, String>>> {
         val indices = mutableListOf<Pair<Int, String>>()
         var offset = 0
-        val src = callPattern.replace(text) {
-            indices.add(it.range.first - offset to it.value)
-            offset += it.range.last - it.range.first + 1
-            ""
-        }
+        val src =
+            callPattern.replace(text) {
+                indices.add(it.range.first - offset to it.value)
+                offset += it.range.last - it.range.first + 1
+                ""
+            }
         return src to indices
     }
 }
 
-fun PsiElement?.getNearestComposability(
-    bindingContext: BindingContext
-): Boolean {
+fun PsiElement?.getNearestComposability(bindingContext: BindingContext): Boolean {
     var node: PsiElement? = this
     while (node != null) {
         when (node) {
@@ -204,8 +209,8 @@
                 // KtLambdaExpression
             }
             is KtLambdaExpression -> {
-                val descriptor = bindingContext[BindingContext.FUNCTION, node.functionLiteral]
-                    ?: return false
+                val descriptor =
+                    bindingContext[BindingContext.FUNCTION, node.functionLiteral] ?: return false
                 return descriptor.allowsComposableCalls(bindingContext)
             }
             is KtFunction,
diff --git a/compose/compiler/compiler-hosted/integration-tests/src/jvmTest/kotlin/androidx/compose/compiler/plugins/kotlin/StabilityConfigurationParserTests.kt b/compose/compiler/compiler-hosted/integration-tests/src/jvmTest/kotlin/androidx/compose/compiler/plugins/kotlin/StabilityConfigurationParserTests.kt
index 9a65db7..7675139 100644
--- a/compose/compiler/compiler-hosted/integration-tests/src/jvmTest/kotlin/androidx/compose/compiler/plugins/kotlin/StabilityConfigurationParserTests.kt
+++ b/compose/compiler/compiler-hosted/integration-tests/src/jvmTest/kotlin/androidx/compose/compiler/plugins/kotlin/StabilityConfigurationParserTests.kt
@@ -35,110 +35,136 @@
     }
 
     @Test
-    fun testSingleLineClassName() = testConfigParsing(
-        """
+    fun testSingleLineClassName() =
+        testConfigParsing(
+            """
             com.foo.bar
-        """.trimIndent(),
-        setOf("com.foo.bar")
-    )
+        """
+                .trimIndent(),
+            setOf("com.foo.bar")
+        )
 
     @Test
-    fun testSingleLineClassNameWithNonAlphaCharacters() = testConfigParsing(
-        """
+    fun testSingleLineClassNameWithNonAlphaCharacters() =
+        testConfigParsing(
+            """
             com.foo_1.bar
-        """.trimIndent(),
-        setOf("com.foo_1.bar")
-    )
+        """
+                .trimIndent(),
+            setOf("com.foo_1.bar")
+        )
 
     @Test
-    fun testMultipleClassNames() = testConfigParsing(
-        """
+    fun testMultipleClassNames() =
+        testConfigParsing(
+            """
             com.foo.bar
             com.bar.foo
-        """.trimIndent(),
-        setOf("com.foo.bar", "com.bar.foo")
-    )
+        """
+                .trimIndent(),
+            setOf("com.foo.bar", "com.bar.foo")
+        )
 
     @Test
-    fun testCommentsAreIgnored() = testConfigParsing(
-        """
+    fun testCommentsAreIgnored() =
+        testConfigParsing(
+            """
             // Comment first line
             com.foo.bar
             // Comment last line
-        """.trimIndent(),
-        setOf("com.foo.bar")
-    )
+        """
+                .trimIndent(),
+            setOf("com.foo.bar")
+        )
 
     @Test
-    fun whitespaceIgnored() = testConfigParsing(
-        """
+    fun whitespaceIgnored() =
+        testConfigParsing(
+            """
 
                com.foo.bar
 
-        """.trimIndent(),
-        setOf("com.foo.bar")
-    )
+        """
+                .trimIndent(),
+            setOf("com.foo.bar")
+        )
 
     @Test
-    fun testWildcardsAreParsed() = testConfigParsing(
-        """
+    fun testWildcardsAreParsed() =
+        testConfigParsing(
+            """
             // Comment first line
             com.*
             // Comment last line
-        """.trimIndent(),
-        setOf("com.*")
-    )
+        """
+                .trimIndent(),
+            setOf("com.*")
+        )
 
     @Test
-    fun testWildcardInMiddle() = testConfigParsing(
-        """
+    fun testWildcardInMiddle() =
+        testConfigParsing(
+            """
             com.*.bar
-        """.trimIndent(),
-        setOf("com.*.bar")
-    )
+        """
+                .trimIndent(),
+            setOf("com.*.bar")
+        )
 
     @Test
-    fun testMultipleWildcardInMiddle() = testConfigParsing(
-        """
+    fun testMultipleWildcardInMiddle() =
+        testConfigParsing(
+            """
             com.*.bar.*
-        """.trimIndent(),
-        setOf("com.*.bar.*")
-    )
+        """
+                .trimIndent(),
+            setOf("com.*.bar.*")
+        )
 
     @Test
-    fun testWhitespaceThrows() = testConfigParsingThrows(
-        """
+    fun testWhitespaceThrows() =
+        testConfigParsingThrows(
+            """
             com. ab.*
-        """.trimIndent()
-    )
+        """
+                .trimIndent()
+        )
 
     @Test
-    fun testInlineCommentThrows() = testConfigParsingThrows(
-        """
+    fun testInlineCommentThrows() =
+        testConfigParsingThrows(
+            """
             com.foo.* //comment
-        """.trimIndent()
-    )
+        """
+                .trimIndent()
+        )
 
     @Test
-    fun testIllegalCharacterThrows() = testConfigParsingThrows(
-        """
+    fun testIllegalCharacterThrows() =
+        testConfigParsingThrows(
+            """
             com.foo!.bar //comment
-        """.trimIndent()
-    )
+        """
+                .trimIndent()
+        )
 }
 
 private const val PATH_TO_CONFIG_FILES = "src/test/resources/testStabilityConfigFiles"
+
 class SingleStabilityConfigurationTest(useFir: Boolean) : AbstractIrTransformTest(useFir) {
     override fun CompilerConfiguration.updateConfiguration() {
-        put(ComposeConfiguration.STABILITY_CONFIG_PATH_KEY,
+        put(
+            ComposeConfiguration.STABILITY_CONFIG_PATH_KEY,
             listOf("$PATH_TO_CONFIG_FILES/config1.conf")
         )
         put(ComposeConfiguration.STRONG_SKIPPING_ENABLED_KEY, false)
     }
 
     @Test
-    fun testExternalTypeStable() = verifyGoldenComposeIrTransform(
-        source = """
+    fun testExternalTypeStable() =
+        verifyGoldenComposeIrTransform(
+            source =
+                """
             import androidx.compose.runtime.Composable
             import java.time.Instant
 
@@ -151,20 +177,21 @@
             fun UnskippableComposable(instant: Instant) {
                 use(instant)
             }
-        """.trimIndent(),
-        extra = """
+        """
+                    .trimIndent(),
+            extra =
+                """
             fun use(foo: Any) {}
-        """.trimIndent()
-    )
+        """
+                    .trimIndent()
+        )
 }
 
 class MultipleStabilityConfigurationTest(useFir: Boolean) : AbstractIrTransformTest(useFir) {
     override fun CompilerConfiguration.updateConfiguration() {
-        put(ComposeConfiguration.STABILITY_CONFIG_PATH_KEY,
-            listOf(
-                "$PATH_TO_CONFIG_FILES/config1.conf",
-                "$PATH_TO_CONFIG_FILES/config2.conf"
-            )
+        put(
+            ComposeConfiguration.STABILITY_CONFIG_PATH_KEY,
+            listOf("$PATH_TO_CONFIG_FILES/config1.conf", "$PATH_TO_CONFIG_FILES/config2.conf")
         )
         put(
             ComposeConfiguration.FEATURE_FLAGS,
@@ -173,8 +200,10 @@
     }
 
     @Test
-    fun testExternalTypeStable() = verifyGoldenComposeIrTransform(
-        source = """
+    fun testExternalTypeStable() =
+        verifyGoldenComposeIrTransform(
+            source =
+                """
             import androidx.compose.runtime.Composable
             import java.time.Instant
 
@@ -183,9 +212,12 @@
                 use(list)
                 use(instant)
             }
-        """.trimIndent(),
-        extra = """
+        """
+                    .trimIndent(),
+            extra =
+                """
             fun use(foo: Any) {}
-        """.trimIndent()
-    )
+        """
+                    .trimIndent()
+        )
 }
diff --git a/compose/compiler/compiler-hosted/integration-tests/src/jvmTest/kotlin/androidx/compose/compiler/plugins/kotlin/StabilityPropagationTransformTests.kt b/compose/compiler/compiler-hosted/integration-tests/src/jvmTest/kotlin/androidx/compose/compiler/plugins/kotlin/StabilityPropagationTransformTests.kt
index ef74a86..c04b606 100644
--- a/compose/compiler/compiler-hosted/integration-tests/src/jvmTest/kotlin/androidx/compose/compiler/plugins/kotlin/StabilityPropagationTransformTests.kt
+++ b/compose/compiler/compiler-hosted/integration-tests/src/jvmTest/kotlin/androidx/compose/compiler/plugins/kotlin/StabilityPropagationTransformTests.kt
@@ -21,32 +21,34 @@
 
 class StabilityPropagationTransformTests(useFir: Boolean) : AbstractIrTransformTest(useFir) {
     private fun stabilityPropagation(
-        @Language("kotlin")
-        unchecked: String,
-        @Language("kotlin")
-        checked: String,
+        @Language("kotlin") unchecked: String,
+        @Language("kotlin") checked: String,
         dumpTree: Boolean = false
-    ) = verifyGoldenComposeIrTransform(
-        """
+    ) =
+        verifyGoldenComposeIrTransform(
+            """
             import androidx.compose.runtime.Composable
 
             $checked
-        """.trimIndent(),
         """
+                .trimIndent(),
+            """
             import androidx.compose.runtime.Composable
 
             $unchecked
-        """.trimIndent(),
-        dumpTree = dumpTree
-    )
+        """
+                .trimIndent(),
+            dumpTree = dumpTree
+        )
 
     @Test
-    fun testPassingLocalKnownStable(): Unit = stabilityPropagation(
-        """
+    fun testPassingLocalKnownStable(): Unit =
+        stabilityPropagation(
+            """
             class Foo(val foo: Int)
             @Composable fun A(x: Any) {}
         """,
-        """
+            """
             import androidx.compose.runtime.remember
 
             @Composable
@@ -56,15 +58,16 @@
                 A(remember { Foo(0) })
             }
         """
-    )
+        )
 
     @Test
-    fun testPassingLocalKnownUnstable(): Unit = stabilityPropagation(
-        """
+    fun testPassingLocalKnownUnstable(): Unit =
+        stabilityPropagation(
+            """
             class Foo(var foo: Int)
             @Composable fun A(x: Any) {}
         """,
-        """
+            """
             import androidx.compose.runtime.remember
 
             @Composable
@@ -74,18 +77,19 @@
                 A(remember { Foo(0) })
             }
         """
-    )
+        )
 
     @Test
-    fun testListOfMarkedAsStable(): Unit = stabilityPropagation(
-        """
+    fun testListOfMarkedAsStable(): Unit =
+        stabilityPropagation(
+            """
             @Composable fun A(x: Any) {}
         """,
-        """
+            """
             @Composable
             fun Example() {
                 A(listOf("a"))
             }
         """
-    )
+        )
 }
diff --git a/compose/compiler/compiler-hosted/integration-tests/src/jvmTest/kotlin/androidx/compose/compiler/plugins/kotlin/StaticExpressionDetectionTests.kt b/compose/compiler/compiler-hosted/integration-tests/src/jvmTest/kotlin/androidx/compose/compiler/plugins/kotlin/StaticExpressionDetectionTests.kt
index 4913143..9cafec3 100644
--- a/compose/compiler/compiler-hosted/integration-tests/src/jvmTest/kotlin/androidx/compose/compiler/plugins/kotlin/StaticExpressionDetectionTests.kt
+++ b/compose/compiler/compiler-hosted/integration-tests/src/jvmTest/kotlin/androidx/compose/compiler/plugins/kotlin/StaticExpressionDetectionTests.kt
@@ -25,188 +25,140 @@
 import org.junit.Test
 
 class StaticExpressionDetectionTests(useFir: Boolean) : AbstractIrTransformTest(useFir) {
-    @Test
-    fun testUnstableTypesAreNeverStatic() = assertUncertain(
-        expression = "Any()"
-    )
+    @Test fun testUnstableTypesAreNeverStatic() = assertUncertain(expression = "Any()")
+
+    @Test fun testPrimitiveLiteralsAreStatic() = assertStatic(expression = "4")
+
+    @Test fun testKotlinArithmeticOperationsAreStatic() = assertStatic(expression = "(1f + 3f) / 2")
 
     @Test
-    fun testPrimitiveLiteralsAreStatic() = assertStatic(
-        expression = "4"
-    )
-
-    @Test
-    fun testKotlinArithmeticOperationsAreStatic() = assertStatic(
-        expression = "(1f + 3f) / 2"
-    )
-
-    @Test
-    fun testConstValReferencesAreStatic() = assertStatic(
-        expression = "Constant",
-        extraSrc = """
+    fun testConstValReferencesAreStatic() =
+        assertStatic(
+            expression = "Constant",
+            extraSrc =
+                """
             const val Constant = "Hello world!"
         """
-    )
+        )
 
     @Test
-    fun testComputedValReferencesAreNotStatic() = assertUncertain(
-        expression = "computedProperty",
-        extraSrc = """
+    fun testComputedValReferencesAreNotStatic() =
+        assertUncertain(
+            expression = "computedProperty",
+            extraSrc =
+                """
             val computedProperty get() = 42
         """
-    )
+        )
 
     @Test
-    fun testVarReferencesAreNotStatic() = assertUncertain(
-        expression = "mutableProperty",
-        extraSrc = """
+    fun testVarReferencesAreNotStatic() =
+        assertUncertain(
+            expression = "mutableProperty",
+            extraSrc =
+                """
             var mutableProperty = 42
         """
-    )
+        )
 
     @Test
-    fun testObjectReferencesAreStatic() = assertStatic(
-        expression = "Singleton",
-        extraSrc = """
+    fun testObjectReferencesAreStatic() =
+        assertStatic(
+            expression = "Singleton",
+            extraSrc =
+                """
             object Singleton
         """
-    )
+        )
 
     @Test
-    fun testStableFunctionCallsWithStaticParametersAreStatic() = assertStatic(
-        expression = "stableFunction(42)",
-        extraSrc = """
+    fun testStableFunctionCallsWithStaticParametersAreStatic() =
+        assertStatic(
+            expression = "stableFunction(42)",
+            extraSrc =
+                """
             import androidx.compose.runtime.Stable
 
             @Stable
             fun stableFunction(x: Int) = x.toString()
         """
-    )
+        )
 
     @Test
-    fun testListOfWithStaticParametersIsStatic() = assertStatic(
-        expression = "listOf('a', 'b', 'c')"
-    )
+    fun testListOfWithStaticParametersIsStatic() =
+        assertStatic(expression = "listOf('a', 'b', 'c')")
+
+    @Test fun testEmptyListIsStatic() = assertStatic(expression = "emptyList<Any?>()")
 
     @Test
-    fun testEmptyListIsStatic() = assertStatic(
-        expression = "emptyList<Any?>()"
-    )
-
-    @Test
-    fun testMapOfWithStaticParametersIsStatic() = assertStatic(
-        expression = "mapOf(pair)",
-        extraSrc = """
+    fun testMapOfWithStaticParametersIsStatic() =
+        assertStatic(
+            expression = "mapOf(pair)",
+            extraSrc =
+                """
             val pair = "answerToUltimateQuestion" to 42
         """
-    )
+        )
+
+    @Test fun testEmptyMapIsStatic() = assertStatic(expression = "emptyMap<Any, Any?>()")
+
+    @Test fun testPairsAreStatic() = assertStatic(expression = "'a' to 1")
 
     @Test
-    fun testEmptyMapIsStatic() = assertStatic(
-        expression = "emptyMap<Any, Any?>()"
-    )
-
-    @Test
-    fun testPairsAreStatic() = assertStatic(
-        expression = "'a' to 1"
-    )
-
-    @Test
-    fun testEnumReferencesAreStatic() = assertStatic(
-        expression = "Foo.Bar",
-        extraSrc = """
+    fun testEnumReferencesAreStatic() =
+        assertStatic(
+            expression = "Foo.Bar",
+            extraSrc =
+                """
             enum class Foo {
                 Bar,
                 Bam
             }
         """
-    )
+        )
+
+    @Test fun testDpLiteralsAreStatic() = assertStatic(expression = "Dp(4f)")
+
+    @Test fun testDpArithmeticIsStatic() = assertStatic(expression = "2 * 4.dp")
+
+    @Test fun testModifierReferenceIsStatic() = assertStatic(expression = "Modifier")
+
+    @Test fun testAlignmentReferenceIsStatic() = assertStatic(expression = "Alignment.Center")
+
+    @Test fun testContentScaleReferenceIsStatic() = assertStatic(expression = "ContentScale.Fit")
 
     @Test
-    fun testDpLiteralsAreStatic() = assertStatic(
-        expression = "Dp(4f)"
-    )
+    fun testDefaultTextStyleReferenceIsStatic() = assertStatic(expression = "TextStyle.Default")
 
     @Test
-    fun testDpArithmeticIsStatic() = assertStatic(
-        expression = "2 * 4.dp"
-    )
+    fun testTextVisualTransformationNoneReferenceIsStatic() =
+        assertStatic(expression = "VisualTransformation.None")
 
     @Test
-    fun testModifierReferenceIsStatic() = assertStatic(
-        expression = "Modifier"
-    )
+    fun testDefaultKeyboardActionsIsStatic() = assertStatic(expression = "KeyboardActions.Default")
 
     @Test
-    fun testAlignmentReferenceIsStatic() = assertStatic(
-        expression = "Alignment.Center"
-    )
+    fun testDefaultKeyboardOptionsIsStatic() = assertStatic(expression = "KeyboardOptions.Default")
 
     @Test
-    fun testContentScaleReferenceIsStatic() = assertStatic(
-        expression = "ContentScale.Fit"
-    )
+    fun testKeyboardOptionsWithLiteralsIsStatic() =
+        assertStatic(expression = "KeyboardOptions(autoCorrect = false)")
+
+    @Test fun testUnspecifiedColorIsStatic() = assertStatic(expression = "Color.Unspecified")
+
+    @Test fun testUnspecifiedDpIsStatic() = assertStatic(expression = "Dp.Unspecified")
+
+    @Test fun testUnspecifiedTextUnitIsStatic() = assertStatic(expression = "TextUnit.Unspecified")
+
+    @Test fun testPaddingValuesZeroIsStatic() = assertStatic(expression = "PaddingValues()")
 
     @Test
-    fun testDefaultTextStyleReferenceIsStatic() = assertStatic(
-        expression = "TextStyle.Default"
-    )
+    fun testPaddingValuesAllIsStatic() = assertStatic(expression = "PaddingValues(all = 16.dp)")
 
     @Test
-    fun testTextVisualTransformationNoneReferenceIsStatic() = assertStatic(
-        expression = "VisualTransformation.None"
-    )
+    fun testEmptyCoroutineContextIsStatic() = assertStatic(expression = "EmptyCoroutineContext")
 
-    @Test
-    fun testDefaultKeyboardActionsIsStatic() = assertStatic(
-        expression = "KeyboardActions.Default"
-    )
-
-    @Test
-    fun testDefaultKeyboardOptionsIsStatic() = assertStatic(
-        expression = "KeyboardOptions.Default"
-    )
-
-    @Test
-    fun testKeyboardOptionsWithLiteralsIsStatic() = assertStatic(
-        expression = "KeyboardOptions(autoCorrect = false)"
-    )
-
-    @Test
-    fun testUnspecifiedColorIsStatic() = assertStatic(
-        expression = "Color.Unspecified"
-    )
-
-    @Test
-    fun testUnspecifiedDpIsStatic() = assertStatic(
-        expression = "Dp.Unspecified"
-    )
-
-    @Test
-    fun testUnspecifiedTextUnitIsStatic() = assertStatic(
-        expression = "TextUnit.Unspecified"
-    )
-
-    @Test
-    fun testPaddingValuesZeroIsStatic() = assertStatic(
-        expression = "PaddingValues()"
-    )
-
-    @Test
-    fun testPaddingValuesAllIsStatic() = assertStatic(
-        expression = "PaddingValues(all = 16.dp)"
-    )
-
-    @Test
-    fun testEmptyCoroutineContextIsStatic() = assertStatic(
-        expression = "EmptyCoroutineContext"
-    )
-
-    private fun assertStatic(
-        expression: String,
-        @Language("kotlin")
-        extraSrc: String = ""
-    ) {
+    private fun assertStatic(expression: String, @Language("kotlin") extraSrc: String = "") {
         assertParameterChangeBitsForExpression(
             message = "Expression `$expression` did not compile with the correct %changed flags",
             expression = expression,
@@ -215,11 +167,7 @@
         )
     }
 
-    private fun assertUncertain(
-        expression: String,
-        @Language("kotlin")
-        extraSrc: String = ""
-    ) {
+    private fun assertUncertain(expression: String, @Language("kotlin") extraSrc: String = "") {
         assertParameterChangeBitsForExpression(
             message = "Expression `$expression` did not compile with the correct %changed flags",
             expression = expression,
@@ -232,11 +180,11 @@
         message: String,
         expression: String,
         expectedEncodedChangedParameter: ChangedParameterEncoding,
-        @Language("kotlin")
-        extraSrc: String = ""
+        @Language("kotlin") extraSrc: String = ""
     ) {
         @Language("kotlin")
-        val source = """
+        val source =
+            """
             import androidx.compose.runtime.Composable
             import androidx.compose.ui.unit.Dp
             import androidx.compose.ui.unit.dp
@@ -258,34 +206,44 @@
             @Composable fun CompositionContext() {
                 Receiver(value = $expression)
             }
-        """.trimIndent()
+        """
+                .trimIndent()
 
-        val files = listOf(
-            SourceFile("ExtraSrc.kt", extraSrc),
-            SourceFile("Test.kt", source),
-        )
+        val files =
+            listOf(
+                SourceFile("ExtraSrc.kt", extraSrc),
+                SourceFile("Test.kt", source),
+            )
         val irModule = compileToIr(files)
 
-        val changeFlagsMatcher = Regex(
-            pattern = """Receiver\(.+, %composer, (0b)?([01]+)\)""",
-            option = RegexOption.DOT_MATCHES_ALL
-        )
-        val compositionContextBody = irModule.files.last().declarations
-            .filterIsInstance<IrFunction>()
-            .first { it.name.identifier == "CompositionContext" }
-            .dumpSrc(useFir)
-            .replace('$', '%')
+        val changeFlagsMatcher =
+            Regex(
+                pattern = """Receiver\(.+, %composer, (0b)?([01]+)\)""",
+                option = RegexOption.DOT_MATCHES_ALL
+            )
+        val compositionContextBody =
+            irModule.files
+                .last()
+                .declarations
+                .filterIsInstance<IrFunction>()
+                .first { it.name.identifier == "CompositionContext" }
+                .dumpSrc(useFir)
+                .replace('$', '%')
 
         assertChangedBits(
             message = message,
             expected = expectedEncodedChangedParameter,
-            actual = checkNotNull(
-                changeFlagsMatcher.find(compositionContextBody)?.groupValues?.last()
-                    ?.toInt(radix = 2)
-                    ?.let { (it shr 1) and ChangedParameterEncoding.Mask }
-            ) {
-                "Failed to resolve %changed flags for expression `$expression`."
-            }
+            actual =
+                checkNotNull(
+                    changeFlagsMatcher
+                        .find(compositionContextBody)
+                        ?.groupValues
+                        ?.last()
+                        ?.toInt(radix = 2)
+                        ?.let { (it shr 1) and ChangedParameterEncoding.Mask }
+                ) {
+                    "Failed to resolve %changed flags for expression `$expression`."
+                }
         )
     }
 
@@ -296,8 +254,10 @@
     ) {
         val maskedActual = actual and ChangedParameterEncoding.Mask
         if (ChangedParameterEncoding.values().none { it.bits == maskedActual }) {
-            fail("$message\nThe actual %changed flags contained an illegal encoding: " +
-                "0b${maskedActual.toString(radix = 2)}")
+            fail(
+                "$message\nThe actual %changed flags contained an illegal encoding: " +
+                    "0b${maskedActual.toString(radix = 2)}"
+            )
         }
 
         assertEquals(
diff --git a/compose/compiler/compiler-hosted/integration-tests/src/jvmTest/kotlin/androidx/compose/compiler/plugins/kotlin/StrongSkippingModeTransformTests.kt b/compose/compiler/compiler-hosted/integration-tests/src/jvmTest/kotlin/androidx/compose/compiler/plugins/kotlin/StrongSkippingModeTransformTests.kt
index 2c03a8b..28ad328 100644
--- a/compose/compiler/compiler-hosted/integration-tests/src/jvmTest/kotlin/androidx/compose/compiler/plugins/kotlin/StrongSkippingModeTransformTests.kt
+++ b/compose/compiler/compiler-hosted/integration-tests/src/jvmTest/kotlin/androidx/compose/compiler/plugins/kotlin/StrongSkippingModeTransformTests.kt
@@ -33,12 +33,13 @@
     companion object {
         @JvmStatic
         @Parameterized.Parameters(name = "useFir = {0}, intrinsicRemember = {1}")
-        fun data() = arrayOf<Any>(
-            arrayOf(false, false),
-            arrayOf(false, true),
-            arrayOf(true, false),
-            arrayOf(true, true)
-        )
+        fun data() =
+            arrayOf<Any>(
+                arrayOf(false, false),
+                arrayOf(false, true),
+                arrayOf(true, false),
+                arrayOf(true, true)
+            )
     }
 
     override fun CompilerConfiguration.updateConfiguration() {
@@ -53,67 +54,72 @@
     }
 
     @Test
-    fun testSingleStableParam(): Unit = verifyMemoization(
-        """
+    fun testSingleStableParam(): Unit =
+        verifyMemoization(
+            """
             class Foo(val value: Int = 0)
             @Composable fun A(x: Foo) {}
         """,
-        """
+            """
             @Composable
             fun Test(x: Foo) {
                 A(x)
             }
         """
-    )
+        )
 
     @Test
-    fun testSingleUnstableParam(): Unit = verifyMemoization(
-        """
+    fun testSingleUnstableParam(): Unit =
+        verifyMemoization(
+            """
             @Composable fun A(x: Foo) {}
             class Foo(var value: Int = 0)
         """,
-        """
+            """
             @Composable
             fun Test(x: Foo) {
                 A(x)
             }
         """
-    )
+        )
 
     @Test
-    fun testSingleNullableUnstableParam(): Unit = verifyMemoization(
-        """
+    fun testSingleNullableUnstableParam(): Unit =
+        verifyMemoization(
+            """
             @Composable fun A(x: Foo?) {}
             class Foo(var value: Int = 0)
         """,
-        """
+            """
             @Composable
             fun Test(x: Foo?) {
                 A(x)
             }
         """
-    )
+        )
 
     @Test
-    fun testSingleOptionalUnstableParam(): Unit = verifyMemoization(
-        """
+    fun testSingleOptionalUnstableParam(): Unit =
+        verifyMemoization(
+            """
             @Composable fun A(x: Foo?) {}
             class Foo(var value: Int = 0)
         """,
-        """
+            """
             @Composable
             fun Test(x: Foo? = Foo()) {
                 A(x)
             }
         """
-    )
+        )
 
     @Test
-    fun testRuntimeStableParam(): Unit = verifyMemoization(
-        """
+    fun testRuntimeStableParam(): Unit =
+        verifyMemoization(
+            """
             @Composable fun A(x: Int) {}
         """,
-        """
+            """
             class Holder<T> {
                 @Composable
                 fun Test(x: T) {
@@ -121,15 +127,16 @@
                 }
             }
         """
-    )
+        )
 
     @Test
-    fun testStableUnstableParams(): Unit = verifyMemoization(
-        """
+    fun testStableUnstableParams(): Unit =
+        verifyMemoization(
+            """
             @Composable fun A(x: Int = 0, y: Int = 0): Int { return 10 }
             class Foo(var value: Int = 0)
         """,
-        """
+            """
             @Composable fun CanSkip(a: Int = 0, b: Foo = Foo()) {
                 used(a)
                 used(b)
@@ -143,45 +150,48 @@
                 print("Hello World")
             }
         """
-    )
+        )
 
     @Test
-    fun testStaticDefaultParam() = verifyMemoization(
-        """
+    fun testStaticDefaultParam() =
+        verifyMemoization(
+            """
             @Composable
             fun A(i: Int, list: List<Int>? = null, set: Set<Int> = emptySet()) {}
         """,
-        """
+            """
             @Composable
             fun Test(i: Int) {
                 A(i)
             }
         """
-    )
+        )
 
     @Test
-    fun testMemoizingUnstableCapturesInLambda() = verifyMemoization(
-        """
+    fun testMemoizingUnstableCapturesInLambda() =
+        verifyMemoization(
+            """
             @Composable fun A(x: Int = 0, y: Int = 0): Int { return 10 }
             class Foo(var value: Int = 0)
         """,
-        """
+            """
             @Composable
             fun Test() {
                 val foo = Foo(0)
                 val lambda = { foo }
             }
         """
-    )
+        )
 
     @Test
-    fun testDontMemoizeLambda() = verifyMemoization(
-        """
+    fun testDontMemoizeLambda() =
+        verifyMemoization(
+            """
             @Composable fun A(x: Int = 0, y: Int = 0): Int { return 10 }
             class Foo(var value: Int = 0)
             fun Lam(x: ()->Unit) { x() }
         """,
-        """
+            """
             import androidx.compose.runtime.DontMemoize
 
             @Composable
@@ -191,16 +201,17 @@
                 Lam @DontMemoize { foo }
             }
         """
-    )
+        )
 
     @Test
-    fun testMemoizingUnstableFunctionParameterInLambda() = verifyMemoization(
-        """
+    fun testMemoizingUnstableFunctionParameterInLambda() =
+        verifyMemoization(
+            """
             @Composable fun A(x: Int = 0, y: Int = 0): Int { return 10 }
             class Foo(var value: Int = 0)
             class Bar(val value: Int = 0)
         """,
-        """
+            """
             @Composable
             fun Test(foo: Foo, bar: Bar) {
                 val lambda: ()->Unit = { 
@@ -209,16 +220,17 @@
                 }
             }
         """
-    )
+        )
 
     @Test
-    fun testMemoizingComposableLambda() = verifyMemoization(
-        """
+    fun testMemoizingComposableLambda() =
+        verifyMemoization(
+            """
             @Composable fun A(x: Int = 0, y: Int = 0): Int { return 10 }
             class Foo(var value: Int = 0)
             class Bar(val value: Int = 0)
         """,
-        """
+            """
             @Composable
             fun Test(foo: Foo, bar: Bar) {
                 val lambda: @Composable ()->Unit = {
@@ -227,16 +239,17 @@
                 }
             }
         """
-    )
+        )
 
     @Test
-    fun testMemoizingStableAndUnstableCapturesInLambda() = verifyMemoization(
-        """
+    fun testMemoizingStableAndUnstableCapturesInLambda() =
+        verifyMemoization(
+            """
             @Composable fun A(x: Int = 0, y: Int = 0): Int { return 10 }
             class Foo(var value: Int = 0)
             class Bar(val value: Int = 0)
         """,
-        """
+            """
             @Composable
             fun Test() {
                 val foo = Foo(0)
@@ -247,17 +260,18 @@
                 }
             }
         """
-    )
+        )
 
     @Test
-    fun testFunctionInterfaceMemorized() = verifyMemoization(
-        """
+    fun testFunctionInterfaceMemorized() =
+        verifyMemoization(
+            """
             fun interface TestFunInterface {
                 fun compute(value: Int)
             }
             fun use(@Suppress("UNUSED_PARAMETER") v: Int) {}
         """,
-        """
+            """
             @Composable fun TestMemoizedFun(compute: TestFunInterface) {}
             @Composable fun Test() {
                 val capture = 0
@@ -271,26 +285,28 @@
                 }
             }
         """
-    )
+        )
 
     @Test
-    fun testVarArgs() = verifyMemoization(
-        "",
-        """
+    fun testVarArgs() =
+        verifyMemoization(
+            "",
+            """
             @Composable fun Varargs(vararg ints: Int) {
             }
             @Composable fun Test() {
                 Varargs(1, 2, 3)
             }
         """
-    )
+        )
 
     @Test
-    fun testRuntimeStableVarArgs() = verifyMemoization(
-        """
+    fun testRuntimeStableVarArgs() =
+        verifyMemoization(
+            """
             @Composable fun A(x: Int) {}
         """,
-        """
+            """
             class Holder<T> {
                 @Composable
                 fun Test(vararg x: T) {
@@ -298,45 +314,46 @@
                 }
             }
         """
-    )
+        )
 
     @Test
-    fun testUnstableReceiverFunctionReferenceMemoized() = verifyMemoization(
-        """
+    fun testUnstableReceiverFunctionReferenceMemoized() =
+        verifyMemoization(
+            """
             class Unstable(var qux: Int = 0) { fun method(arg1: Int) {} }
             val unstable = Unstable()
         """,
-        """
+            """
             @Composable
             fun Something() {
                 val x = unstable::method
             }
         """
-    )
+        )
 
     @Test
-    fun testUnstableExtensionReceiverFunctionReferenceMemoized() = verifyMemoization(
-        """
+    fun testUnstableExtensionReceiverFunctionReferenceMemoized() =
+        verifyMemoization(
+            """
             class Unstable(var foo: Int = 0)
             fun Unstable.method(arg1: Int) {}
             val unstable = Unstable()
         """,
-        """
+            """
             @Composable
             fun Something() {
                 val x = unstable::method
             }
         """
-    )
+        )
 
     private fun verifyMemoization(
-        @Language("kotlin")
-        unchecked: String,
-        @Language("kotlin")
-        checked: String,
+        @Language("kotlin") unchecked: String,
+        @Language("kotlin") checked: String,
         dumpTree: Boolean = false
     ) {
-        val source = """
+        val source =
+            """
             import androidx.compose.runtime.Composable
             import androidx.compose.runtime.NonRestartableComposable
             import androidx.compose.runtime.ReadOnlyComposable
@@ -344,7 +361,8 @@
             $checked
         """
 
-        val extra = """
+        val extra =
+            """
              import androidx.compose.runtime.Composable
 
             $unchecked
@@ -357,11 +375,7 @@
 
         assertEquals(module1, module2)
 
-        verifyGoldenComposeIrTransform(
-            source,
-            extra,
-            dumpTree = dumpTree
-        )
+        verifyGoldenComposeIrTransform(source, extra, dumpTree = dumpTree)
     }
 
     private fun dumpIrWithPath(
diff --git a/compose/compiler/compiler-hosted/integration-tests/src/jvmTest/kotlin/androidx/compose/compiler/plugins/kotlin/TargetAnnotationsTransformTests.kt b/compose/compiler/compiler-hosted/integration-tests/src/jvmTest/kotlin/androidx/compose/compiler/plugins/kotlin/TargetAnnotationsTransformTests.kt
index 97b1d27..97c2c9e 100644
--- a/compose/compiler/compiler-hosted/integration-tests/src/jvmTest/kotlin/androidx/compose/compiler/plugins/kotlin/TargetAnnotationsTransformTests.kt
+++ b/compose/compiler/compiler-hosted/integration-tests/src/jvmTest/kotlin/androidx/compose/compiler/plugins/kotlin/TargetAnnotationsTransformTests.kt
@@ -21,8 +21,9 @@
 @Suppress("SpellCheckingInspection") // Expected strings can have partial words
 class TargetAnnotationsTransformTests(useFir: Boolean) : AbstractIrTransformTest(useFir) {
     @Test
-    fun testInferUIFromCall() = verify(
-        """
+    fun testInferUIFromCall() =
+        verify(
+            """
         import androidx.compose.runtime.Composable
 
         @Composable
@@ -30,11 +31,12 @@
             Text("Hello")
         }
         """
-    )
+        )
 
     @Test
-    fun testInferVectorFromCall() = verify(
-        """
+    fun testInferVectorFromCall() =
+        verify(
+            """
         import androidx.compose.runtime.Composable
 
         @Composable
@@ -42,22 +44,24 @@
             Circle()
         }
         """
-    )
+        )
 
     // No annotations is the same as leaving the applier open.
     @Test
-    fun testInferSimpleOpen() = verify(
-        """
+    fun testInferSimpleOpen() =
+        verify(
+            """
         import androidx.compose.runtime.Composable
 
         @Composable
         fun Test() { }
         """
-    )
+        )
 
     @Test
-    fun testInferUnifiedParameters() = verify(
-        """
+    fun testInferUnifiedParameters() =
+        verify(
+            """
         import androidx.compose.runtime.Composable
 
         @Composable
@@ -65,11 +69,12 @@
           content()
         }
         """
-    )
+        )
 
     @Test
-    fun testInferLambdaParameter() = verify(
-        """
+    fun testInferLambdaParameter() =
+        verify(
+            """
         import androidx.compose.runtime.Composable
 
         @Composable
@@ -79,11 +84,12 @@
           }
         }
         """
-    )
+        )
 
     @Test
-    fun testInferInlineLambdaParameter() = verify(
-        """
+    fun testInferInlineLambdaParameter() =
+        verify(
+            """
         import androidx.compose.runtime.Composable
 
         @Composable
@@ -93,11 +99,12 @@
           }
         }
         """
-    )
+        )
 
     @Test
-    fun testCanInferWithGeneric() = verify(
-        """
+    fun testCanInferWithGeneric() =
+        verify(
+            """
         import androidx.compose.runtime.Composable
 
         @Composable
@@ -107,11 +114,12 @@
           }
         }
         """
-    )
+        )
 
     @Test
-    fun testCompositionLocalsProvider() = verify(
-        """
+    fun testCompositionLocalsProvider() =
+        verify(
+            """
         import androidx.compose.runtime.Composable
         import androidx.compose.runtime.CompositionLocalProvider
 
@@ -122,11 +130,12 @@
           }
         }
         """
-    )
+        )
 
     @Test
-    fun testInferringFunInterfaceParameterAnnotations() = verify(
-        """
+    fun testInferringFunInterfaceParameterAnnotations() =
+        verify(
+            """
         import androidx.compose.runtime.Composable
 
         fun interface CustomComposable {
@@ -155,11 +164,12 @@
             }
         }
         """
-    )
+        )
 
     @Test
-    fun testLetIt() = verifyGoldenComposeIrTransform(
-        """
+    fun testLetIt() =
+        verifyGoldenComposeIrTransform(
+            """
         import androidx.compose.runtime.*
 
         @Composable
@@ -167,11 +177,12 @@
             content?.let { it() }
         }
         """
-    )
+        )
 
     @Test
-    fun testOptionalParameters() = verifyGoldenComposeIrTransform(
-        """
+    fun testOptionalParameters() =
+        verifyGoldenComposeIrTransform(
+            """
         import androidx.compose.runtime.*
 
         @Composable
@@ -219,11 +230,12 @@
             }
         }
         """
-    )
+        )
 
     @Test
-    fun testReceiverScope() = verifyGoldenComposeIrTransform(
-        """
+    fun testReceiverScope() =
+        verifyGoldenComposeIrTransform(
+            """
         import androidx.compose.runtime.*
         import androidx.compose.ui.layout.*
         import androidx.compose.foundation.text.*
@@ -260,11 +272,12 @@
             )
         }
         """
-    )
+        )
 
     @Test
-    fun testCallingLayout() = verifyGoldenComposeIrTransform(
-        """
+    fun testCallingLayout() =
+        verifyGoldenComposeIrTransform(
+            """
         import androidx.compose.runtime.*
         import androidx.compose.ui.layout.*
         import androidx.compose.foundation.text.*
@@ -312,11 +325,12 @@
         @Composable
         fun T(value: String) { }
         """
-    )
+        )
 
     @Suppress("unused")
-    fun testCollectAsState() = verifyGoldenComposeIrTransform(
-        """
+    fun testCollectAsState() =
+        verifyGoldenComposeIrTransform(
+            """
             import kotlin.coroutines.*
             import kotlinx.coroutines.flow.*
             import androidx.compose.runtime.*
@@ -332,11 +346,13 @@
                 context: CoroutineContext = EmptyCoroutineContext
             ): State<R> = mutableStateOf(initial)
         """
-    )
+        )
 
     @Test
-    fun testRememberUpdatedState() = verifyGoldenComposeIrTransform(
-        source = """
+    fun testRememberUpdatedState() =
+        verifyGoldenComposeIrTransform(
+            source =
+                """
         import androidx.compose.runtime.*
 
         @Composable
@@ -349,18 +365,20 @@
             }
         }
         """,
-        extra = """
+            extra =
+                """
         import androidx.compose.runtime.*
 
         fun Defer(content: @Composable () -> Unit) { }
 
         fun UiContent(content: @Composable @ComposableTarget("UI") () -> Unit) { }
         """
-    )
+        )
 
     @Test
-    fun testAddingComposablesToAList() = verifyGoldenComposeIrTransform(
-        """
+    fun testAddingComposablesToAList() =
+        verifyGoldenComposeIrTransform(
+            """
         import androidx.compose.runtime.*
 
         class Scope {
@@ -370,16 +388,18 @@
             }
         }
         """,
-        extra = """
+            extra =
+                """
         class IntervalList<T> {
             fun add(size: Int, content: T) { }
         }
         """
-    )
+        )
 
     @Test
-    fun testCallingNullableComposableWithNull() = verifyGoldenComposeIrTransform(
-        """
+    fun testCallingNullableComposableWithNull() =
+        verifyGoldenComposeIrTransform(
+            """
         import androidx.compose.runtime.*
 
         @Composable
@@ -387,7 +407,8 @@
             Widget(null)
         }
         """,
-        extra = """
+            extra =
+                """
         import androidx.compose.runtime.*
 
         @Composable
@@ -395,11 +416,12 @@
             if (content != null) content()
         }
         """
-    )
+        )
 
     @Test
-    fun testCallingComposableParameterWithComposableParameter() = verify(
-        """
+    fun testCallingComposableParameterWithComposableParameter() =
+        verify(
+            """
         import androidx.compose.runtime.*
 
         @Composable
@@ -409,11 +431,13 @@
             }
         }
         """
-    )
+        )
 
     @Test
-    fun testFileScoped() = verifyGoldenComposeIrTransform(
-        source = """
+    fun testFileScoped() =
+        verifyGoldenComposeIrTransform(
+            source =
+                """
             @file:NComposable
 
             import androidx.compose.runtime.*
@@ -429,7 +453,8 @@
             }
 
         """,
-        extra = """
+            extra =
+                """
             import androidx.compose.runtime.*
 
             @ComposableTargetMarker(description = "An N Composable")
@@ -444,18 +469,22 @@
 
             @Composable @ComposableOpenTarget(0) fun Open() { }
             @Composable @NComposable fun N() { }
-        """.trimIndent()
-    )
+        """
+                    .trimIndent()
+        )
 
     @Test
-    fun testCrossfileFileScope() = verifyGoldenComposeIrTransform(
-        source = """
+    fun testCrossfileFileScope() =
+        verifyGoldenComposeIrTransform(
+            source =
+                """
             import androidx.compose.runtime.*
 
             @Composable
             fun InferN() { N() }
         """,
-        extra = """
+            extra =
+                """
             @file:NComposable
 
             import androidx.compose.runtime.*
@@ -472,11 +501,13 @@
 
             @Composable fun N() { }
         """
-    )
+        )
 
     @Test
-    fun testInferringTargetFromAncestorMethod() = verifyGoldenComposeIrTransform(
-        source = """
+    fun testInferringTargetFromAncestorMethod() =
+        verifyGoldenComposeIrTransform(
+            source =
+                """
             import androidx.compose.runtime.Composable
             import androidx.compose.runtime.ComposableTarget
             import androidx.compose.runtime.ComposableOpenTarget
@@ -493,12 +524,12 @@
               }
             }
         """
-    )
+        )
 
-    private fun verify(source: String) =
-        verifyGoldenComposeIrTransform(source, baseDefinition)
+    private fun verify(source: String) = verifyGoldenComposeIrTransform(source, baseDefinition)
 
-    private val baseDefinition = """
+    private val baseDefinition =
+        """
         import androidx.compose.runtime.Composable
         import androidx.compose.runtime.ComposableTarget
         import androidx.compose.runtime.ComposableOpenTarget
diff --git a/compose/compiler/compiler-hosted/integration-tests/src/jvmTest/kotlin/androidx/compose/compiler/plugins/kotlin/TraceInformationTest.kt b/compose/compiler/compiler-hosted/integration-tests/src/jvmTest/kotlin/androidx/compose/compiler/plugins/kotlin/TraceInformationTest.kt
index ca33b01..2021fd0 100644
--- a/compose/compiler/compiler-hosted/integration-tests/src/jvmTest/kotlin/androidx/compose/compiler/plugins/kotlin/TraceInformationTest.kt
+++ b/compose/compiler/compiler-hosted/integration-tests/src/jvmTest/kotlin/androidx/compose/compiler/plugins/kotlin/TraceInformationTest.kt
@@ -23,13 +23,14 @@
  * Verifies trace data passed to tracing. Relies on [TruncateTracingInfoMode.KEEP_INFO_STRING] to
  * leave most of the trace information in the test output.
  *
- * More complex cases tested in other IrTransform tests that use
- * the [TruncateTracingInfoMode.KEEP_INFO_STRING].
+ * More complex cases tested in other IrTransform tests that use the
+ * [TruncateTracingInfoMode.KEEP_INFO_STRING].
  */
 class TraceInformationTest(useFir: Boolean) : AbstractIrTransformTest(useFir) {
     @Test
-    fun testBasicComposableFunctions() = verifyGoldenComposeIrTransform(
-        """
+    fun testBasicComposableFunctions() =
+        verifyGoldenComposeIrTransform(
+            """
             import androidx.compose.runtime.Composable
 
             class A {
@@ -39,12 +40,13 @@
             @Composable
             fun C() { A().B(1337) }
         """,
-        truncateTracingInfoMode = TruncateTracingInfoMode.TRUNCATE_KEY
-    )
+            truncateTracingInfoMode = TruncateTracingInfoMode.TRUNCATE_KEY
+        )
 
     @Test
-    fun testReadOnlyComposable() = verifyGoldenComposeIrTransform(
-        """
+    fun testReadOnlyComposable() =
+        verifyGoldenComposeIrTransform(
+            """
             import androidx.compose.runtime.*
 
             @Composable
@@ -57,11 +59,12 @@
                 }
             }
         """
-    )
+        )
 
     @Test
-    fun testInlineFunctionsDonotGenerateTraceMarkers() = verifyGoldenComposeIrTransform(
-        """
+    fun testInlineFunctionsDonotGenerateTraceMarkers() =
+        verifyGoldenComposeIrTransform(
+            """
             import androidx.compose.runtime.*
 
             @Composable
@@ -78,11 +81,11 @@
                 A()
             }
         """,
-        """
+            """
             import androidx.compose.runtime.*
 
             @Composable
             fun A() { }
         """
-    )
+        )
 }
diff --git a/compose/compiler/compiler-hosted/integration-tests/src/jvmTest/kotlin/androidx/compose/compiler/plugins/kotlin/analysis/ComposableCheckerTests.kt b/compose/compiler/compiler-hosted/integration-tests/src/jvmTest/kotlin/androidx/compose/compiler/plugins/kotlin/analysis/ComposableCheckerTests.kt
index 8cb5eba..a21286e 100644
--- a/compose/compiler/compiler-hosted/integration-tests/src/jvmTest/kotlin/androidx/compose/compiler/plugins/kotlin/analysis/ComposableCheckerTests.kt
+++ b/compose/compiler/compiler-hosted/integration-tests/src/jvmTest/kotlin/androidx/compose/compiler/plugins/kotlin/analysis/ComposableCheckerTests.kt
@@ -6,38 +6,42 @@
 
 class ComposableCheckerTests(useFir: Boolean) : AbstractComposeDiagnosticsTest(useFir) {
     @Test
-    fun testCfromNC() = check(
-        """
+    fun testCfromNC() =
+        check(
+            """
         import androidx.compose.runtime.*
 
         @Composable fun C() {}
         fun <!COMPOSABLE_EXPECTED!>NC<!>() { <!COMPOSABLE_INVOCATION!>C<!>() }
     """
-    )
+        )
 
     @Test
-    fun testNCfromC() = check(
-        """
+    fun testNCfromC() =
+        check(
+            """
         import androidx.compose.runtime.*
 
         fun NC() {}
         @Composable fun C() { NC() }
     """
-    )
+        )
 
     @Test
-    fun testCfromC() = check(
-        """
+    fun testCfromC() =
+        check(
+            """
         import androidx.compose.runtime.*
 
         @Composable fun C() {}
         @Composable fun C2() { C() }
     """
-    )
+        )
 
     @Test
-    fun testCinCLambdaArg() = check(
-        """
+    fun testCinCLambdaArg() =
+        check(
+            """
         import androidx.compose.runtime.*
         @Composable fun C() { }
         @Composable fun C2(lambda: @Composable () -> Unit) { lambda() }
@@ -47,11 +51,12 @@
             }
         }
     """
-    )
+        )
 
     @Test
-    fun testCinInlinedNCLambdaArg() = check(
-        """
+    fun testCinInlinedNCLambdaArg() =
+        check(
+            """
         import androidx.compose.runtime.*
         @Composable fun C() { }
         inline fun InlineNC(lambda: () -> Unit) { lambda() }
@@ -61,11 +66,12 @@
             }
         }
     """
-    )
+        )
 
     @Test
-    fun testCinNoinlineNCLambdaArg() = check(
-        """
+    fun testCinNoinlineNCLambdaArg() =
+        check(
+            """
         import androidx.compose.runtime.*
         @Composable fun C() { }
         <!NOTHING_TO_INLINE!>inline<!> fun NoinlineNC(noinline lambda: () -> Unit) { lambda() }
@@ -75,11 +81,12 @@
             }
         }
     """
-    )
+        )
 
     @Test
-    fun testCinCrossinlineNCLambdaArg() = check(
-        """
+    fun testCinCrossinlineNCLambdaArg() =
+        check(
+            """
         import androidx.compose.runtime.*
         @Composable fun C() { }
         inline fun CrossinlineNC(crossinline lambda: () -> Unit) { lambda() }
@@ -89,11 +96,12 @@
             }
         }
     """
-    )
+        )
 
     @Test
-    fun testCinNestedInlinedNCLambdaArg() = check(
-        """
+    fun testCinNestedInlinedNCLambdaArg() =
+        check(
+            """
         import androidx.compose.runtime.*
         @Composable fun C() { }
         inline fun InlineNC(lambda: () -> Unit) { lambda() }
@@ -105,11 +113,12 @@
             }
         }
     """
-    )
+        )
 
     @Test
-    fun testCinLambdaArgOfNC() = check(
-        """
+    fun testCinLambdaArgOfNC() =
+        check(
+            """
         import androidx.compose.runtime.*
         @Composable fun C() { }
         fun NC(lambda: () -> Unit) { lambda() }
@@ -119,11 +128,12 @@
             }
         }
     """
-    )
+        )
 
     @Test
-    fun testCinLambdaArgOfC() = check(
-        """
+    fun testCinLambdaArgOfC() =
+        check(
+            """
         import androidx.compose.runtime.*
         @Composable fun C() { }
         @Composable fun C2(lambda: () -> Unit) { lambda() }
@@ -133,38 +143,42 @@
             }
         }
     """
-    )
+        )
 
     @Test
-    fun testCinCPropGetter() = check(
-        """
+    fun testCinCPropGetter() =
+        check(
+            """
         import androidx.compose.runtime.*
         @Composable fun C(): Int { return 123 }
         val cProp: Int @Composable get() = C()
     """
-    )
+        )
 
     @Test
-    fun testCinNCPropGetter() = check(
-        """
+    fun testCinNCPropGetter() =
+        check(
+            """
         import androidx.compose.runtime.*
         @Composable fun C(): Int { return 123 }
         val <!COMPOSABLE_EXPECTED!>ncProp<!>: Int get() = <!COMPOSABLE_INVOCATION!>C<!>()
     """
-    )
+        )
 
     @Test
-    fun testCinTopLevelInitializer() = check(
-        """
+    fun testCinTopLevelInitializer() =
+        check(
+            """
         import androidx.compose.runtime.*
         @Composable fun C(): Int { return 123 }
         val ncProp: Int = <!COMPOSABLE_INVOCATION!>C<!>()
     """
-    )
+        )
 
     @Test
-    fun testCTypeAlias() = check(
-        """
+    fun testCTypeAlias() =
+        check(
+            """
         import androidx.compose.runtime.*
         typealias Content = @Composable () -> Unit
         @Composable fun C() {}
@@ -175,22 +189,24 @@
             C2 { inner() }
         }
     """
-    )
+        )
 
     @Test
-    fun testCfromComposableFunInterface() = check(
-        """
+    fun testCfromComposableFunInterface() =
+        check(
+            """
         import androidx.compose.runtime.Composable
 
         fun interface A { @Composable fun f() }
         @Composable fun B() { A { B() } }
     """
-    )
+        )
 
     @Test
     fun testGenericComposableInference1() {
         assumeTrue(useFir)
-        check("""
+        check(
+            """
         import androidx.compose.runtime.Composable
 
         fun <T> identity(value: T): T = value
@@ -198,13 +214,15 @@
         // We should infer `ComposableFunction0<Unit>` for `T`
         val cl = identity(@Composable {})
         val l: () -> Unit = <!INITIALIZER_TYPE_MISMATCH!>cl<!>
-        """)
+        """
+        )
     }
 
     @Test
     fun testGenericComposableInference2() {
         assumeTrue(useFir)
-        check("""
+        check(
+            """
         import androidx.compose.runtime.Composable
 
         @Composable fun A() {}
@@ -213,13 +231,15 @@
         // Explicitly instantiate `T` with `ComposableFunction0<Unit>`
         val cl = identity<@Composable () -> Unit> { A() }
         val l: () -> Unit = <!INITIALIZER_TYPE_MISMATCH!>cl<!>
-        """)
+        """
+        )
     }
 
     @Test
     fun testGenericComposableInference3() {
         assumeTrue(useFir)
-        check("""
+        check(
+            """
         import androidx.compose.runtime.Composable
 
         @Composable fun A() {}
@@ -228,13 +248,15 @@
         // We should infer `T` as `ComposableFunction0<Unit>` from the context and then
         // infer that the argument to `identity` is a composable lambda.
         val cl: @Composable () -> Unit = identity { A() }
-        """)
+        """
+        )
     }
 
     @Test
     fun testGenericComposableInference4() {
         assumeTrue(useFir)
-        check("""
+        check(
+            """
         import androidx.compose.runtime.Composable
 
         fun <T> identity(value: T): T = value
@@ -242,25 +264,29 @@
         // We should infer `T` as `Function0<Unit>` from the context and
         // reject the lambda which is explicitly typed as `ComposableFunction...`.
         val cl: () -> Unit = identity(@Composable <!ARGUMENT_TYPE_MISMATCH!>{}<!>)
-        """)
+        """
+        )
     }
 
     @Test
     fun testGenericComposableInference5() {
         assumeTrue(useFir)
-        check("""
+        check(
+            """
         import androidx.compose.runtime.Composable
 
         fun <T> identity(value: T): T = value
 
         // We should infer `Function0<Unit>` for `T`
         val lambda = identity<() -> Unit>(@Composable <!ARGUMENT_TYPE_MISMATCH!>{}<!>)
-        """)
+        """
+        )
     }
 
     @Test
-    fun testCfromAnnotatedComposableFunInterface() = check(
-        """
+    fun testCfromAnnotatedComposableFunInterface() =
+        check(
+            """
         import androidx.compose.runtime.Composable
 
         fun interface A { @Composable fun f() }
@@ -269,22 +295,24 @@
           A(f)
         }
     """
-    )
+        )
 
     @Test
-    fun testCfromComposableFunInterfaceArgument() = check(
-        """
+    fun testCfromComposableFunInterfaceArgument() =
+        check(
+            """
         import androidx.compose.runtime.Composable
 
         fun interface A { @Composable fun f() }
 
         @Composable fun B(a: (A) -> Unit) { a { B(a) } }
     """
-    )
+        )
 
     @Test
-    fun testCfromComposableTypeAliasFunInterface() = check(
-        """
+    fun testCfromComposableTypeAliasFunInterface() =
+        check(
+            """
         import androidx.compose.runtime.Composable
 
         fun interface A { @Composable fun f() }
@@ -292,11 +320,12 @@
 
         @Composable fun C() { A { C() } }
     """
-    )
+        )
 
     @Test
-    fun testCfromNonComposableFunInterface() = check(
-        """
+    fun testCfromNonComposableFunInterface() =
+        check(
+            """
         import androidx.compose.runtime.Composable
 
         fun interface A { fun f() }
@@ -306,11 +335,12 @@
           }
         }
     """
-    )
+        )
 
     @Test
-    fun testCfromNonComposableFunInterfaceArgument() = check(
-        """
+    fun testCfromNonComposableFunInterfaceArgument() =
+        check(
+            """
         import androidx.compose.runtime.Composable
 
         fun interface A { fun f() }
@@ -321,11 +351,12 @@
           }
         }
     """
-    )
+        )
 
     @Test
-    fun testPreventedCaptureOnInlineLambda() = check(
-        """
+    fun testPreventedCaptureOnInlineLambda() =
+        check(
+            """
         import androidx.compose.runtime.*
 
         @Composable inline fun A(
@@ -337,7 +368,7 @@
             A { <!CAPTURED_COMPOSABLE_INVOCATION!>B<!>() }
         }
     """
-    )
+        )
 
     @Test
     fun testComposableReporting001() {
@@ -1278,8 +1309,9 @@
     }
 
     @Test
-    fun testDisallowComposableCallPropagation() = check(
-        """
+    fun testDisallowComposableCallPropagation() =
+        check(
+            """
         import androidx.compose.runtime.*
         class Foo
         @Composable inline fun a(block1: @DisallowComposableCalls () -> Foo): Foo {
@@ -1292,7 +1324,7 @@
           return a { block2() }
         }
     """
-    )
+        )
 
     @Test
     fun testDisallowComposableCallPropagationWithInvoke() {
@@ -1317,8 +1349,9 @@
     }
 
     @Test
-    fun testComposableLambdaToAll() = check(
-        """
+    fun testComposableLambdaToAll() =
+        check(
+            """
         import androidx.compose.runtime.*
 
         fun foo() {
@@ -1326,11 +1359,12 @@
             println(lambda)  // println accepts Any, verify no type mismatach.
         }
     """
-    )
+        )
 
     @Test
-    fun testReadOnlyComposablePropagation() = check(
-        """
+    fun testReadOnlyComposablePropagation() =
+        check(
+            """
         import androidx.compose.runtime.*
 
         @Composable @ReadOnlyComposable
@@ -1407,10 +1441,12 @@
                 return 10
             }
     """
-    )
+        )
 
     @Test
-    fun testNothingAsAValidComposableFunctionBody() = check("""
+    fun testNothingAsAValidComposableFunctionBody() =
+        check(
+            """
         import androidx.compose.runtime.*
 
         val test1: @Composable () -> Unit = TODO()
@@ -1427,7 +1463,8 @@
                 TODO()
             }
         }
-    """)
+    """
+        )
 
     @Test
     fun testComposableValueOperator() {
diff --git a/compose/compiler/compiler-hosted/integration-tests/src/jvmTest/kotlin/androidx/compose/compiler/plugins/kotlin/analysis/ComposableDeclarationCheckerTests.kt b/compose/compiler/compiler-hosted/integration-tests/src/jvmTest/kotlin/androidx/compose/compiler/plugins/kotlin/analysis/ComposableDeclarationCheckerTests.kt
index 7652f0c..56cb3706 100644
--- a/compose/compiler/compiler-hosted/integration-tests/src/jvmTest/kotlin/androidx/compose/compiler/plugins/kotlin/analysis/ComposableDeclarationCheckerTests.kt
+++ b/compose/compiler/compiler-hosted/integration-tests/src/jvmTest/kotlin/androidx/compose/compiler/plugins/kotlin/analysis/ComposableDeclarationCheckerTests.kt
@@ -34,8 +34,9 @@
 
     @Test
     fun testComposableFunctionReferences() {
-        check(if (!useFir) {
-            """
+        check(
+            if (!useFir) {
+                """
             import androidx.compose.runtime.Composable
 
             @Composable fun A() {}
@@ -49,12 +50,13 @@
                 B(<!COMPOSABLE_FUNCTION_REFERENCE,TYPE_MISMATCH!>::A<!>)
             }
         """
-        } else {
-            // In K2, we are taking composability into account when resolving function references,
-            // so trying to resolve `::A` in a context where we expect a non-composable function
-            // type fails with an `UNRESOLVED_REFERENCE` error, instead of a
-            // `COMPOSABLE_FUNCTION_REFERENCE` error in the plugin..
-            """
+            } else {
+                // In K2, we are taking composability into account when resolving function
+                // references,
+                // so trying to resolve `::A` in a context where we expect a non-composable function
+                // type fails with an `UNRESOLVED_REFERENCE` error, instead of a
+                // `COMPOSABLE_FUNCTION_REFERENCE` error in the plugin..
+                """
             import androidx.compose.runtime.Composable
 
             @Composable fun A() {}
@@ -68,7 +70,8 @@
                 B(<!COMPOSABLE_FUNCTION_REFERENCE!>::A<!>)
             }
         """
-        })
+            }
+        )
     }
 
     @Test
@@ -137,8 +140,9 @@
 
     @Test
     fun testSuspendComposable() {
-        check(if (!useFir) {
-            """
+        check(
+            if (!useFir) {
+                """
             import androidx.compose.runtime.Composable
 
             @Composable suspend fun <!COMPOSABLE_SUSPEND_FUN!>Foo<!>() {}
@@ -156,11 +160,11 @@
                 acceptSuspend(<!COMPOSABLE_SUSPEND_FUN,TYPE_MISMATCH!>@Composable suspend fun() { }<!>)
             }
         """
-        } else {
-            // In K2, the frontend forbids function types with multiple kinds, so
-            // `@Composable suspend` function types get turned into error types. This is the
-            // reason for the additional ARGUMENT_TYPE_MISMATCH errors.
-            """
+            } else {
+                // In K2, the frontend forbids function types with multiple kinds, so
+                // `@Composable suspend` function types get turned into error types. This is the
+                // reason for the additional ARGUMENT_TYPE_MISMATCH errors.
+                """
             import androidx.compose.runtime.Composable
 
             @Composable suspend fun <!COMPOSABLE_SUSPEND_FUN!>Foo<!>() {}
@@ -178,7 +182,8 @@
                 acceptSuspend(<!COMPOSABLE_SUSPEND_FUN!><!ARGUMENT_TYPE_MISMATCH!>@Composable suspend fun()<!> { }<!>)
             }
         """
-        })
+            }
+        )
     }
 
     @Test
@@ -346,8 +351,9 @@
 
     @Test
     fun testOverrideWithoutComposeAnnotation() {
-        check(if (!useFir) {
-            """
+        check(
+            if (!useFir) {
+                """
                 import androidx.compose.runtime.Composable
                 interface Base {
                     fun compose(content: () -> Unit)
@@ -357,10 +363,11 @@
                     <!CONFLICTING_OVERLOADS!>override fun compose(content: @Composable () -> Unit)<!> {}
                 }
             """
-        } else {
-            // In K2, the `@Composable` type is part of the function signature, so the `override`
-            // does not match the `compose` function in `Base`.
-            """
+            } else {
+                // In K2, the `@Composable` type is part of the function signature, so the
+                // `override`
+                // does not match the `compose` function in `Base`.
+                """
                 import androidx.compose.runtime.Composable
                 interface Base {
                     fun compose(content: () -> Unit)
@@ -370,7 +377,8 @@
                     <!NOTHING_TO_OVERRIDE!>override<!> fun compose(content: @Composable () -> Unit) {}
                 }
             """
-        })
+            }
+        )
     }
 
     @Test
diff --git a/compose/compiler/compiler-hosted/integration-tests/src/jvmTest/kotlin/androidx/compose/compiler/plugins/kotlin/analysis/ComposableTargetCheckerTests.kt b/compose/compiler/compiler-hosted/integration-tests/src/jvmTest/kotlin/androidx/compose/compiler/plugins/kotlin/analysis/ComposableTargetCheckerTests.kt
index 0c62d13..c2a2734 100644
--- a/compose/compiler/compiler-hosted/integration-tests/src/jvmTest/kotlin/androidx/compose/compiler/plugins/kotlin/analysis/ComposableTargetCheckerTests.kt
+++ b/compose/compiler/compiler-hosted/integration-tests/src/jvmTest/kotlin/androidx/compose/compiler/plugins/kotlin/analysis/ComposableTargetCheckerTests.kt
@@ -24,8 +24,9 @@
 @RunWith(JUnit4::class)
 class ComposableTargetCheckerTests : AbstractComposeDiagnosticsTest(useFir = false) {
     @Test
-    fun testExplicitTargetAnnotations() = check(
-        """
+    fun testExplicitTargetAnnotations() =
+        check(
+            """
         import androidx.compose.runtime.*
 
         @Composable
@@ -44,11 +45,12 @@
           B()
         }
         """
-    )
+        )
 
     @Test
-    fun testInferredTargets() = check(
-        """
+    fun testInferredTargets() =
+        check(
+            """
         import androidx.compose.runtime.*
 
         @Composable
@@ -71,11 +73,12 @@
         @ComposableTarget("N")
         fun N() { }
         """
-    )
+        )
 
     @Test
-    fun testInferBoundContainer() = check(
-        """
+    fun testInferBoundContainer() =
+        check(
+            """
         import androidx.compose.runtime.*
 
         @Composable
@@ -100,11 +103,12 @@
         @ComposableTarget("N")
         fun N() {}
         """
-    )
+        )
 
     @Test
-    fun testInferGenericContainer() = check(
-        """
+    fun testInferGenericContainer() =
+        check(
+            """
         import androidx.compose.runtime.*
 
         @Composable
@@ -163,11 +167,12 @@
         @ComposableTarget("M")
         fun M() {}
         """
-    )
+        )
 
     @Test
-    fun testReportExplicitFailure() = check(
-        """
+    fun testReportExplicitFailure() =
+        check(
+            """
         import androidx.compose.runtime.*
 
         @Composable
@@ -180,11 +185,12 @@
         @ComposableTarget("M")
         fun M() {}
         """
-    )
+        )
 
     @Test
-    fun testReportDisagreementFailure() = check(
-        """
+    fun testReportDisagreementFailure() =
+        check(
+            """
         import androidx.compose.runtime.*
 
         @Composable
@@ -201,11 +207,12 @@
         @ComposableTarget("M")
         fun M() {}
         """
-    )
+        )
 
     @Test
-    fun testGenericDisagreement() = check(
-        """
+    fun testGenericDisagreement() =
+        check(
+            """
         import androidx.compose.runtime.*
 
         @Composable
@@ -229,11 +236,12 @@
             }
         }
         """
-    )
+        )
 
     @Test
-    fun testFunInterfaceInference() = check(
-        """
+    fun testFunInterfaceInference() =
+        check(
+            """
         import androidx.compose.runtime.*
 
         @Composable
@@ -296,11 +304,12 @@
           <!COMPOSE_APPLIER_CALL_MISMATCH!>M<!>()
         }
         """
-    )
+        )
 
     @Test
-    fun testFileScopeTargetDeclaration() = check(
-        """
+    fun testFileScopeTargetDeclaration() =
+        check(
+            """
         @file:ComposableTarget("N")
 
         import androidx.compose.runtime.Composable
@@ -314,11 +323,12 @@
             <!COMPOSE_APPLIER_CALL_MISMATCH!>M<!>()
         }
         """
-    )
+        )
 
     @Test
-    fun testTargetMarker() = check(
-        """
+    fun testTargetMarker() =
+        check(
+            """
         import androidx.compose.runtime.Composable
         import androidx.compose.runtime.ComposableTarget
         import androidx.compose.runtime.ComposableTargetMarker
@@ -342,11 +352,12 @@
             <!COMPOSE_APPLIER_CALL_MISMATCH!>M<!>()
         }
         """
-    )
+        )
 
     @Test
-    fun testFileScopeTargetMarker() = check(
-        """
+    fun testFileScopeTargetMarker() =
+        check(
+            """
         @file: NComposable
 
         import androidx.compose.runtime.Composable
@@ -371,11 +382,12 @@
             <!COMPOSE_APPLIER_CALL_MISMATCH!>M<!>()
         }
         """
-    )
+        )
 
     @Test
-    fun testUiTextAndInvalid() = check(
-        """
+    fun testUiTextAndInvalid() =
+        check(
+            """
         import androidx.compose.runtime.Composable
         import androidx.compose.runtime.ComposableTarget
         import androidx.compose.foundation.text.BasicText
@@ -389,11 +401,12 @@
            <!COMPOSE_APPLIER_CALL_MISMATCH!>Invalid<!>()
         }
         """
-    )
+        )
 
     @Test
-    fun testOpenOverrideAttributesInheritTarget() = check(
-        """
+    fun testOpenOverrideAttributesInheritTarget() =
+        check(
+            """
         import androidx.compose.runtime.Composable
         import androidx.compose.runtime.ComposableTarget
 
@@ -416,11 +429,12 @@
           }
         }
         """
-    )
+        )
 
     @Test
-    fun testOpenOverrideTargetsMustAgree() = check(
-        """
+    fun testOpenOverrideTargetsMustAgree() =
+        check(
+            """
         import androidx.compose.runtime.Composable
         import androidx.compose.runtime.ComposableTarget
 
@@ -441,11 +455,12 @@
           }
         }
         """
-    )
+        )
 
     @Test
-    fun testOpenOverrideInferredToAgree() = check(
-        """
+    fun testOpenOverrideInferredToAgree() =
+        check(
+            """
         import androidx.compose.runtime.Composable
         import androidx.compose.runtime.ComposableTarget
 
@@ -461,5 +476,6 @@
             N()
           }
         }
-        """)
+        """
+        )
 }
diff --git a/compose/compiler/compiler-hosted/integration-tests/src/jvmTest/kotlin/androidx/compose/compiler/plugins/kotlin/analysis/ComposeMultiplatformCheckerTests.kt b/compose/compiler/compiler-hosted/integration-tests/src/jvmTest/kotlin/androidx/compose/compiler/plugins/kotlin/analysis/ComposeMultiplatformCheckerTests.kt
index 1716534..9a0c892 100644
--- a/compose/compiler/compiler-hosted/integration-tests/src/jvmTest/kotlin/androidx/compose/compiler/plugins/kotlin/analysis/ComposeMultiplatformCheckerTests.kt
+++ b/compose/compiler/compiler-hosted/integration-tests/src/jvmTest/kotlin/androidx/compose/compiler/plugins/kotlin/analysis/ComposeMultiplatformCheckerTests.kt
@@ -25,13 +25,15 @@
 
 class ComposeMultiplatformCheckerTests(useFir: Boolean) : AbstractComposeDiagnosticsTest(useFir) {
     override fun CompilerConfiguration.updateConfiguration() {
-        languageVersionSettings = LanguageVersionSettingsImpl(
-            languageVersionSettings.languageVersion,
-            languageVersionSettings.apiVersion,
-            specificFeatures = hashMapOf(
-                LanguageFeature.MultiPlatformProjects to LanguageFeature.State.ENABLED
+        languageVersionSettings =
+            LanguageVersionSettingsImpl(
+                languageVersionSettings.languageVersion,
+                languageVersionSettings.apiVersion,
+                specificFeatures =
+                    hashMapOf(
+                        LanguageFeature.MultiPlatformProjects to LanguageFeature.State.ENABLED
+                    )
             )
-        )
     }
 
     @Test
diff --git a/compose/compiler/compiler-hosted/integration-tests/src/jvmTest/kotlin/androidx/compose/compiler/plugins/kotlin/analysis/FcsTypeResolutionTests.kt b/compose/compiler/compiler-hosted/integration-tests/src/jvmTest/kotlin/androidx/compose/compiler/plugins/kotlin/analysis/FcsTypeResolutionTests.kt
index b01b783..cd96dfa 100644
--- a/compose/compiler/compiler-hosted/integration-tests/src/jvmTest/kotlin/androidx/compose/compiler/plugins/kotlin/analysis/FcsTypeResolutionTests.kt
+++ b/compose/compiler/compiler-hosted/integration-tests/src/jvmTest/kotlin/androidx/compose/compiler/plugins/kotlin/analysis/FcsTypeResolutionTests.kt
@@ -22,8 +22,9 @@
 
 class FcsTypeResolutionTests(useFir: Boolean) : AbstractComposeDiagnosticsTest(useFir) {
     @Test
-    fun testImplicitlyPassedReceiverScope1() = check(
-        """
+    fun testImplicitlyPassedReceiverScope1() =
+        check(
+            """
             import androidx.compose.runtime.*
 
             @Composable
@@ -31,11 +32,12 @@
                 content()
             }
         """
-    )
+        )
 
     @Test
-    fun testImplicitlyPassedReceiverScope2() = check(
-        """
+    fun testImplicitlyPassedReceiverScope2() =
+        check(
+            """
             import androidx.compose.runtime.*
 
             @Composable
@@ -48,7 +50,7 @@
                 content<!NO_VALUE_FOR_PARAMETER!>()<!>
             }
         """
-    )
+        )
 
     @Test
     fun testSmartCastsAndPunning() {
@@ -73,8 +75,9 @@
     }
 
     @Test
-    fun testExtensionInvoke() = check(
-        """
+    fun testExtensionInvoke() =
+        check(
+            """
             import androidx.compose.runtime.*
 
             class Foo {}
@@ -84,11 +87,12 @@
                 Foo()
             }
         """
-    )
+        )
 
     @Test
-    fun testResolutionInsideWhenExpression() = check(
-        """
+    fun testResolutionInsideWhenExpression() =
+        check(
+            """
             import androidx.compose.runtime.*
             
             @Composable fun TextView(text: String) { print(text) }
@@ -100,11 +104,12 @@
                 }
             }
         """
-    )
+        )
 
     @Test
-    fun testUsedParameters() = check(
-        """
+    fun testUsedParameters() =
+        check(
+            """
             import androidx.compose.runtime.*
 
             @Composable fun Foo(x: Int, composeItem: @Composable () -> Unit = {}) {
@@ -143,11 +148,12 @@
                 })
             }
         """
-    )
+        )
 
     @Test
-    fun testDispatchInvoke() = check(
-        """
+    fun testDispatchInvoke() =
+        check(
+            """
             import androidx.compose.runtime.*
 
             class Bam {
@@ -160,11 +166,12 @@
                 }
             }
         """
-    )
+        )
 
     @Test
-    fun testDispatchAndExtensionReceiver() = check(
-        """
+    fun testDispatchAndExtensionReceiver() =
+        check(
+            """
             import androidx.compose.runtime.*
 
             class Bam {
@@ -179,11 +186,12 @@
                 }
             }
         """
-    )
+        )
 
     @Test
-    fun testDispatchAndExtensionReceiverLocal() = check(
-        """
+    fun testDispatchAndExtensionReceiverLocal() =
+        check(
+            """
             import androidx.compose.runtime.*
 
             class Foo {}
@@ -196,7 +204,7 @@
             }
 
         """
-    )
+        )
 
     @Test
     fun testMissingAttributes() {
@@ -229,13 +237,15 @@
                 F(<!NAMED_ARGUMENTS_NOT_ALLOWED!>x<!>=x)
             }
 
-            """.trimIndent()
+            """
+                .trimIndent()
         )
     }
 
     @Test
-    fun testDuplicateAttributes() = check(
-        """
+    fun testDuplicateAttributes() =
+        check(
+            """
             import androidx.compose.runtime.*
 
             data class Foo(val value: Int)
@@ -250,12 +260,14 @@
                 A(x=x, <!ARGUMENT_PASSED_TWICE!>x<!>=x)
             }
 
-        """.trimIndent()
-    )
+        """
+                .trimIndent()
+        )
 
     @Test
-    fun testChildrenNamedAndBodyDuplicate() = check(
-        """
+    fun testChildrenNamedAndBodyDuplicate() =
+        check(
+            """
             import androidx.compose.runtime.*
 
             @Composable fun A(content: @Composable () -> Unit) { content() }
@@ -264,12 +276,14 @@
                 A(content={}) <!TOO_MANY_ARGUMENTS!>{ }<!>
             }
 
-        """.trimIndent()
-    )
+        """
+                .trimIndent()
+        )
 
     @Test
-    fun testAbstractClassTags() = check(
-        """
+    fun testAbstractClassTags() =
+        check(
+            """
             import androidx.compose.runtime.*
 
             class Context
@@ -284,8 +298,9 @@
                 <!CREATING_AN_INSTANCE_OF_ABSTRACT_CLASS!>Bar<!NO_VALUE_FOR_PARAMETER!>()<!><!>
             }
 
-        """.trimIndent()
-    )
+        """
+                .trimIndent()
+        )
 
     @Test
     fun testGenerics() {
@@ -322,7 +337,8 @@
                     )
                 }
 
-            """.trimIndent()
+            """
+                .trimIndent()
         )
     }
 
@@ -358,14 +374,16 @@
                     )
                 }
 
-            """.trimIndent()
+            """
+                .trimIndent()
         )
     }
 
     // TODO(lmr): this triggers an exception!
     @Test
-    fun testEmptyAttributeValue() = check(
-        """
+    fun testEmptyAttributeValue() =
+        check(
+            """
             import androidx.compose.runtime.*
 
             @Composable fun Foo(abc: Int, xyz: Int) {
@@ -382,18 +400,20 @@
                 Foo(abc=123, xyz=)
             }
 
-        """.trimIndent(),
-        ignoreParseErrors = true
-    )
+        """
+                .trimIndent(),
+            ignoreParseErrors = true
+        )
 
     @Test
     fun testMismatchedAttributes() {
         val typeMismatch = if (useFir) "ARGUMENT_TYPE_MISMATCH" else "TYPE_MISMATCH"
-        val constantTypeMismatch = if (useFir) {
-            "ARGUMENT_TYPE_MISMATCH"
-        } else {
-            "CONSTANT_EXPECTED_TYPE_MISMATCH"
-        }
+        val constantTypeMismatch =
+            if (useFir) {
+                "ARGUMENT_TYPE_MISMATCH"
+            } else {
+                "CONSTANT_EXPECTED_TYPE_MISMATCH"
+            }
         check(
             """
                 import androidx.compose.runtime.*
@@ -425,13 +445,15 @@
                     )
                 }
 
-            """.trimIndent()
+            """
+                .trimIndent()
         )
     }
 
     @Test
-    fun testErrorAttributeValue() = check(
-        """
+    fun testErrorAttributeValue() =
+        check(
+            """
             import androidx.compose.runtime.*
 
             @Composable fun Foo(x: Int = 1) { print(x) }
@@ -443,16 +465,18 @@
                 )
             }
 
-        """.trimIndent()
-    )
+        """
+                .trimIndent()
+        )
 
     @Test
     fun testUnresolvedQualifiedTag() {
-        val functionExpected = if (useFir) {
-            "FUNCTION_EXPECTED"
-        } else {
-            "UNRESOLVED_REFERENCE_WRONG_RECEIVER"
-        }
+        val functionExpected =
+            if (useFir) {
+                "FUNCTION_EXPECTED"
+            } else {
+                "UNRESOLVED_REFERENCE_WRONG_RECEIVER"
+            }
         check(
             """
                 import androidx.compose.runtime.*
@@ -507,14 +531,16 @@
 
                 }
 
-            """.trimIndent()
+            """
+                .trimIndent()
         )
     }
 
     // TODO(lmr): overloads creates resolution exception
     @Test
     fun testChildren() {
-        val declarations = """
+        val declarations =
+            """
                 import androidx.compose.runtime.*
 
                 @Composable fun ChildrenRequired2(content: @Composable () -> Unit) { content() }
@@ -528,7 +554,8 @@
 
                 @Composable
                 fun MultiChildren(c: @Composable (x: Int, y: Int) -> Unit = { x, y ->println(x + y) }) { c(1,1) }
-        """.trimIndent()
+        """
+                .trimIndent()
         if (!useFir) {
             check(
                 """
@@ -556,7 +583,9 @@
                         println(x + y + z)
                     }
                 }
-            """.trimIndent())
+            """
+                    .trimIndent()
+            )
         } else {
             check(
                 """
@@ -586,7 +615,9 @@
                         <!OVERLOAD_RESOLUTION_AMBIGUITY!>println<!>(x <!OVERLOAD_RESOLUTION_AMBIGUITY!>+<!> y <!OVERLOAD_RESOLUTION_AMBIGUITY!>+<!> z)
                     }
                 }
-            """.trimIndent())
+            """
+                    .trimIndent()
+            )
         }
     }
 }
diff --git a/compose/compiler/compiler-hosted/integration-tests/src/jvmTest/kotlin/androidx/compose/compiler/plugins/kotlin/analysis/TryCatchComposableCheckerTests.kt b/compose/compiler/compiler-hosted/integration-tests/src/jvmTest/kotlin/androidx/compose/compiler/plugins/kotlin/analysis/TryCatchComposableCheckerTests.kt
index 86ec57c..8d42a6b 100644
--- a/compose/compiler/compiler-hosted/integration-tests/src/jvmTest/kotlin/androidx/compose/compiler/plugins/kotlin/analysis/TryCatchComposableCheckerTests.kt
+++ b/compose/compiler/compiler-hosted/integration-tests/src/jvmTest/kotlin/androidx/compose/compiler/plugins/kotlin/analysis/TryCatchComposableCheckerTests.kt
@@ -20,8 +20,8 @@
 import org.junit.Test
 
 /**
- * We're strongly considering supporting try-catch-finally blocks in the future.
- * If/when we do support them, these tests should be deleted.
+ * We're strongly considering supporting try-catch-finally blocks in the future. If/when we do
+ * support them, these tests should be deleted.
  */
 class TryCatchComposableCheckerTests(useFir: Boolean) : AbstractComposeDiagnosticsTest(useFir) {
     @Test
diff --git a/compose/compiler/compiler-hosted/integration-tests/src/jvmTest/kotlin/androidx/compose/compiler/plugins/kotlin/facade/K1CompilerFacade.kt b/compose/compiler/compiler-hosted/integration-tests/src/jvmTest/kotlin/androidx/compose/compiler/plugins/kotlin/facade/K1CompilerFacade.kt
index b9e35de..e1574b3 100644
--- a/compose/compiler/compiler-hosted/integration-tests/src/jvmTest/kotlin/androidx/compose/compiler/plugins/kotlin/facade/K1CompilerFacade.kt
+++ b/compose/compiler/compiler-hosted/integration-tests/src/jvmTest/kotlin/androidx/compose/compiler/plugins/kotlin/facade/K1CompilerFacade.kt
@@ -38,10 +38,13 @@
     val bindingContext: BindingContext
 ) : AnalysisResult {
     override val diagnostics: Map<String, List<AnalysisResult.Diagnostic>>
-        get() = bindingContext.diagnostics.all().groupBy(
-            keySelector = { it.psiFile.name },
-            valueTransform = { AnalysisResult.Diagnostic(it.factoryName, it.textRanges) }
-        )
+        get() =
+            bindingContext.diagnostics
+                .all()
+                .groupBy(
+                    keySelector = { it.psiFile.name },
+                    valueTransform = { AnalysisResult.Diagnostic(it.factoryName, it.textRanges) }
+                )
 }
 
 private class K1FrontendResult(
@@ -55,20 +58,20 @@
         platformFiles: List<SourceFile>,
         commonFiles: List<SourceFile>
     ): K1AnalysisResult {
-        val allKtFiles = platformFiles.map { it.toKtFile(environment.project) } +
-            commonFiles.map {
-                it.toKtFile(environment.project).also { ktFile ->
-                    ktFile.isCommonSource = true
+        val allKtFiles =
+            platformFiles.map { it.toKtFile(environment.project) } +
+                commonFiles.map {
+                    it.toKtFile(environment.project).also { ktFile -> ktFile.isCommonSource = true }
                 }
-            }
 
-        val result = TopDownAnalyzerFacadeForJVM.analyzeFilesWithJavaIntegration(
-            environment.project,
-            allKtFiles,
-            CliBindingTrace(),
-            environment.configuration,
-            environment::createPackagePartProvider
-        )
+        val result =
+            TopDownAnalyzerFacadeForJVM.analyzeFilesWithJavaIntegration(
+                environment.project,
+                allKtFiles,
+                CliBindingTrace(),
+                environment.configuration,
+                environment::createPackagePartProvider
+            )
 
         try {
             result.throwIfError()
@@ -93,26 +96,32 @@
             throw TestsCompilerError(e)
         }
 
-        val codegenFactory = JvmIrCodegenFactory(
-            environment.configuration,
-            environment.configuration.get(CLIConfigurationKeys.PHASE_CONFIG)
-        )
+        val codegenFactory =
+            JvmIrCodegenFactory(
+                environment.configuration,
+                environment.configuration.get(CLIConfigurationKeys.PHASE_CONFIG)
+            )
 
-        val state = GenerationState.Builder(
-            environment.project,
-            ClassBuilderFactories.TEST,
-            analysisResult.moduleDescriptor,
-            analysisResult.bindingContext,
-            analysisResult.files,
-            environment.configuration
-        ).isIrBackend(true).codegenFactory(codegenFactory).build()
+        val state =
+            GenerationState.Builder(
+                    environment.project,
+                    ClassBuilderFactories.TEST,
+                    analysisResult.moduleDescriptor,
+                    analysisResult.bindingContext,
+                    analysisResult.files,
+                    environment.configuration
+                )
+                .isIrBackend(true)
+                .codegenFactory(codegenFactory)
+                .build()
 
         state.beforeCompile()
 
-        val psi2irInput = CodegenFactory.IrConversionInput.fromGenerationStateAndFiles(
-            state,
-            analysisResult.files
-        )
+        val psi2irInput =
+            CodegenFactory.IrConversionInput.fromGenerationStateAndFiles(
+                state,
+                analysisResult.files
+            )
         val backendInput = codegenFactory.convertToIr(psi2irInput)
 
         // For JVM-specific errors
@@ -122,11 +131,7 @@
             throw TestsCompilerError(e)
         }
 
-        return K1FrontendResult(
-            state,
-            backendInput,
-            codegenFactory
-        )
+        return K1FrontendResult(state, backendInput, codegenFactory)
     }
 
     override fun compileToIr(files: List<SourceFile>): IrModuleFragment =
@@ -135,12 +140,15 @@
     override fun compile(
         platformFiles: List<SourceFile>,
         commonFiles: List<SourceFile>
-    ): GenerationState = try {
-        frontend(platformFiles, commonFiles).apply {
-            codegenFactory.generateModule(state, backendInput)
-            state.factory.done()
-        }.state
-    } catch (e: Exception) {
-        throw TestsCompilerError(e)
-    }
+    ): GenerationState =
+        try {
+            frontend(platformFiles, commonFiles)
+                .apply {
+                    codegenFactory.generateModule(state, backendInput)
+                    state.factory.done()
+                }
+                .state
+        } catch (e: Exception) {
+            throw TestsCompilerError(e)
+        }
 }
diff --git a/compose/compiler/compiler-hosted/integration-tests/src/jvmTest/kotlin/androidx/compose/compiler/plugins/kotlin/facade/K2CompilerFacade.kt b/compose/compiler/compiler-hosted/integration-tests/src/jvmTest/kotlin/androidx/compose/compiler/plugins/kotlin/facade/K2CompilerFacade.kt
index ff32894..d982685 100644
--- a/compose/compiler/compiler-hosted/integration-tests/src/jvmTest/kotlin/androidx/compose/compiler/plugins/kotlin/facade/K2CompilerFacade.kt
+++ b/compose/compiler/compiler-hosted/integration-tests/src/jvmTest/kotlin/androidx/compose/compiler/plugins/kotlin/facade/K2CompilerFacade.kt
@@ -73,10 +73,11 @@
     val reporter: BaseDiagnosticsCollector
 ) : AnalysisResult {
     override val diagnostics: Map<String, List<AnalysisResult.Diagnostic>>
-        get() = reporter.diagnostics.groupBy(
-            keySelector = { it.psiElement.containingFile.name },
-            valueTransform = { AnalysisResult.Diagnostic(it.factoryName, it.textRanges) }
-        )
+        get() =
+            reporter.diagnostics.groupBy(
+                keySelector = { it.psiElement.containingFile.name },
+                valueTransform = { AnalysisResult.Diagnostic(it.factoryName, it.textRanges) }
+            )
 }
 
 private class FirFrontendResult(
@@ -100,9 +101,7 @@
             moduleData,
             projectSessionProvider,
             PsiBasedProjectFileSearchScope(
-                TopDownAnalyzerFacadeForJVM.AllJavaSourcesInProjectScope(
-                    project
-                )
+                TopDownAnalyzerFacadeForJVM.AllJavaSourcesInProjectScope(project)
             ),
             projectEnvironment,
             null,
@@ -121,17 +120,19 @@
         val rootModuleName = configuration.get(CommonConfigurationKeys.MODULE_NAME, "main")
 
         val projectSessionProvider = FirProjectSessionProvider()
-        val binaryModuleData = BinaryModuleData.initialize(
-            Name.identifier(rootModuleName),
-            CommonPlatforms.defaultCommonPlatform,
-            CommonPlatformAnalyzerServices
-        )
+        val binaryModuleData =
+            BinaryModuleData.initialize(
+                Name.identifier(rootModuleName),
+                CommonPlatforms.defaultCommonPlatform,
+                CommonPlatformAnalyzerServices
+            )
         val dependencyList = DependencyListForCliModule.build(binaryModuleData)
-        val projectEnvironment = VfsBasedProjectEnvironment(
-            project,
-            VirtualFileManager.getInstance().getFileSystem(StandardFileSystems.FILE_PROTOCOL),
-            environment::createPackagePartProvider
-        )
+        val projectEnvironment =
+            VfsBasedProjectEnvironment(
+                project,
+                VirtualFileManager.getInstance().getFileSystem(StandardFileSystems.FILE_PROTOCOL),
+                environment::createPackagePartProvider
+            )
         val librariesScope = PsiBasedProjectFileSearchScope(ProjectScope.getLibrariesScope(project))
 
         FirJvmSessionFactory.createLibrarySession(
@@ -146,34 +147,30 @@
             registerExtraComponents = {}
         )
 
-        val commonModuleData = FirModuleDataImpl(
-            Name.identifier("$rootModuleName-common"),
-            dependencyList.regularDependencies,
-            dependencyList.dependsOnDependencies,
-            dependencyList.friendsDependencies,
-            CommonPlatforms.defaultCommonPlatform,
-            CommonPlatformAnalyzerServices
-        )
+        val commonModuleData =
+            FirModuleDataImpl(
+                Name.identifier("$rootModuleName-common"),
+                dependencyList.regularDependencies,
+                dependencyList.dependsOnDependencies,
+                dependencyList.friendsDependencies,
+                CommonPlatforms.defaultCommonPlatform,
+                CommonPlatformAnalyzerServices
+            )
 
-        val platformModuleData = FirModuleDataImpl(
-            Name.identifier(rootModuleName),
-            dependencyList.regularDependencies,
-            dependencyList.dependsOnDependencies + commonModuleData,
-            dependencyList.friendsDependencies,
-            JvmPlatforms.jvm8,
-            JvmPlatformAnalyzerServices
-        )
+        val platformModuleData =
+            FirModuleDataImpl(
+                Name.identifier(rootModuleName),
+                dependencyList.regularDependencies,
+                dependencyList.dependsOnDependencies + commonModuleData,
+                dependencyList.friendsDependencies,
+                JvmPlatforms.jvm8,
+                JvmPlatformAnalyzerServices
+            )
 
-        val commonSession = createSourceSession(
-            commonModuleData,
-            projectSessionProvider,
-            projectEnvironment
-        )
-        val platformSession = createSourceSession(
-            platformModuleData,
-            projectSessionProvider,
-            projectEnvironment
-        )
+        val commonSession =
+            createSourceSession(commonModuleData, projectSessionProvider, projectEnvironment)
+        val platformSession =
+            createSourceSession(platformModuleData, projectSessionProvider, projectEnvironment)
 
         val commonKtFiles = commonFiles.map { it.toKtFile(project) }
         val platformKtFiles = platformFiles.map { it.toKtFile(project) }
@@ -202,25 +199,23 @@
             MessageRenderer.PLAIN_FULL_PATHS
         )
 
-        val fir2IrExtensions = JvmFir2IrExtensions(
-            configuration,
-            JvmIrDeserializerImpl(),
-            JvmIrMangler
-        )
+        val fir2IrExtensions =
+            JvmFir2IrExtensions(configuration, JvmIrDeserializerImpl(), JvmIrMangler)
 
-        val fir2IrResult = analysisResult.firResult.convertToIrAndActualizeForJvm(
-            fir2IrExtensions,
-            Fir2IrConfiguration(
-                configuration.languageVersionSettings,
-                analysisResult.reporter,
-                configuration.getBoolean(JVMConfigurationKeys.LINK_VIA_SIGNATURES),
-                EvaluatedConstTracker.create(),
-                configuration[CommonConfigurationKeys.INLINE_CONST_TRACKER],
-                configuration[CommonConfigurationKeys.EXPECT_ACTUAL_TRACKER],
-                allowNonCachedDeclarations = false
-            ),
-            IrGenerationExtension.getInstances(project),
-        )
+        val fir2IrResult =
+            analysisResult.firResult.convertToIrAndActualizeForJvm(
+                fir2IrExtensions,
+                Fir2IrConfiguration(
+                    configuration.languageVersionSettings,
+                    analysisResult.reporter,
+                    configuration.getBoolean(JVMConfigurationKeys.LINK_VIA_SIGNATURES),
+                    EvaluatedConstTracker.create(),
+                    configuration[CommonConfigurationKeys.INLINE_CONST_TRACKER],
+                    configuration[CommonConfigurationKeys.EXPECT_ACTUAL_TRACKER],
+                    allowNonCachedDeclarations = false
+                ),
+                IrGenerationExtension.getInstances(project),
+            )
 
         return FirFrontendResult(fir2IrResult, fir2IrExtensions)
     }
@@ -236,25 +231,26 @@
         val irModuleFragment = frontendResult.firResult.irModuleFragment
         val components = frontendResult.firResult.components
 
-        val generationState = GenerationState.Builder(
-            project,
-            ClassBuilderFactories.TEST,
-            irModuleFragment.descriptor,
-            NoScopeRecordCliBindingTrace().bindingContext,
-            configuration
-        ).isIrBackend(
-            true
-        ).jvmBackendClassResolver(
-            FirJvmBackendClassResolver(components)
-        ).build()
+        val generationState =
+            GenerationState.Builder(
+                    project,
+                    ClassBuilderFactories.TEST,
+                    irModuleFragment.descriptor,
+                    NoScopeRecordCliBindingTrace().bindingContext,
+                    configuration
+                )
+                .isIrBackend(true)
+                .jvmBackendClassResolver(FirJvmBackendClassResolver(components))
+                .build()
 
         generationState.beforeCompile()
-        val codegenFactory = JvmIrCodegenFactory(
-            configuration,
-            configuration.get(CLIConfigurationKeys.PHASE_CONFIG)
-        )
+        val codegenFactory =
+            JvmIrCodegenFactory(configuration, configuration.get(CLIConfigurationKeys.PHASE_CONFIG))
         codegenFactory.generateModuleInFrontendIRMode(
-            generationState, irModuleFragment, components.symbolTable, components.irProviders,
+            generationState,
+            irModuleFragment,
+            components.symbolTable,
+            components.irProviders,
             frontendResult.generatorExtensions,
             FirJvmBackendExtension(components, frontendResult.firResult.irActualizedResult),
             frontendResult.firResult.pluginContext
diff --git a/compose/compiler/compiler-hosted/integration-tests/src/jvmTest/kotlin/androidx/compose/compiler/plugins/kotlin/facade/KotlinCompilerFacade.kt b/compose/compiler/compiler-hosted/integration-tests/src/jvmTest/kotlin/androidx/compose/compiler/plugins/kotlin/facade/KotlinCompilerFacade.kt
index d3c67fb..24728a2 100644
--- a/compose/compiler/compiler-hosted/integration-tests/src/jvmTest/kotlin/androidx/compose/compiler/plugins/kotlin/facade/KotlinCompilerFacade.kt
+++ b/compose/compiler/compiler-hosted/integration-tests/src/jvmTest/kotlin/androidx/compose/compiler/plugins/kotlin/facade/KotlinCompilerFacade.kt
@@ -52,23 +52,23 @@
     val path: String = ""
 ) {
     fun toKtFile(project: Project): KtFile {
-        val shortName = name.substring(name.lastIndexOf('/') + 1).let {
-            it.substring(it.lastIndexOf('\\') + 1)
-        }
+        val shortName =
+            name.substring(name.lastIndexOf('/') + 1).let { it.substring(it.lastIndexOf('\\') + 1) }
 
-        val virtualFile = object : LightVirtualFile(
-            shortName,
-            KotlinLanguage.INSTANCE,
-            StringUtilRt.convertLineSeparators(source)
-        ) {
-            override fun getPath(): String = "${this@SourceFile.path}/$name"
-        }
+        val virtualFile =
+            object :
+                LightVirtualFile(
+                    shortName,
+                    KotlinLanguage.INSTANCE,
+                    StringUtilRt.convertLineSeparators(source)
+                ) {
+                override fun getPath(): String = "${this@SourceFile.path}/$name"
+            }
 
         virtualFile.charset = StandardCharsets.UTF_8
         val factory = PsiFileFactory.getInstance(project) as PsiFileFactoryImpl
-        val ktFile = factory.trySetupPsiForFile(
-            virtualFile, KotlinLanguage.INSTANCE, true, false
-        ) as KtFile
+        val ktFile =
+            factory.trySetupPsiForFile(virtualFile, KotlinLanguage.INSTANCE, true, false) as KtFile
 
         if (!ignoreParseErrors) {
             try {
@@ -82,10 +82,7 @@
 }
 
 interface AnalysisResult {
-    data class Diagnostic(
-        val factoryName: String,
-        val textRanges: List<TextRange>
-    )
+    data class Diagnostic(val factoryName: String, val textRanges: List<TextRange>)
 
     val files: List<KtFile>
     val diagnostics: Map<String, List<Diagnostic>>
@@ -96,7 +93,9 @@
         platformFiles: List<SourceFile>,
         commonFiles: List<SourceFile>
     ): AnalysisResult
+
     abstract fun compileToIr(files: List<SourceFile>): IrModuleFragment
+
     abstract fun compile(
         platformFiles: List<SourceFile>,
         commonFiles: List<SourceFile>
@@ -110,20 +109,27 @@
             updateConfiguration: CompilerConfiguration.() -> Unit,
             registerExtensions: Project.(CompilerConfiguration) -> Unit,
         ): KotlinCompilerFacade {
-            val configuration = CompilerConfiguration().apply {
-                put(CommonConfigurationKeys.MODULE_NAME, TEST_MODULE_NAME)
-                put(JVMConfigurationKeys.IR, true)
-                put(JVMConfigurationKeys.VALIDATE_IR, true)
-                put(JVMConfigurationKeys.JVM_TARGET, JvmTarget.JVM_17)
-                put(CLIConfigurationKeys.MESSAGE_COLLECTOR_KEY, TestMessageCollector)
-                put(IrMessageLogger.IR_MESSAGE_LOGGER, IrMessageCollector(TestMessageCollector))
-                updateConfiguration()
-                put(CommonConfigurationKeys.USE_FIR, languageVersionSettings.languageVersion.usesK2)
-            }
+            val configuration =
+                CompilerConfiguration().apply {
+                    put(CommonConfigurationKeys.MODULE_NAME, TEST_MODULE_NAME)
+                    put(JVMConfigurationKeys.IR, true)
+                    put(JVMConfigurationKeys.VALIDATE_IR, true)
+                    put(JVMConfigurationKeys.JVM_TARGET, JvmTarget.JVM_17)
+                    put(CLIConfigurationKeys.MESSAGE_COLLECTOR_KEY, TestMessageCollector)
+                    put(IrMessageLogger.IR_MESSAGE_LOGGER, IrMessageCollector(TestMessageCollector))
+                    updateConfiguration()
+                    put(
+                        CommonConfigurationKeys.USE_FIR,
+                        languageVersionSettings.languageVersion.usesK2
+                    )
+                }
 
-            val environment = KotlinCoreEnvironment.createForTests(
-                disposable, configuration, EnvironmentConfigFiles.JVM_CONFIG_FILES
-            )
+            val environment =
+                KotlinCoreEnvironment.createForTests(
+                    disposable,
+                    configuration,
+                    EnvironmentConfigFiles.JVM_CONFIG_FILES
+                )
 
             ComposePluginRegistrar.checkCompilerVersion(configuration)
 
@@ -148,10 +154,8 @@
     ) {
         if (severity === CompilerMessageSeverity.ERROR) {
             throw AssertionError(
-                if (location == null)
-                    message
-                else
-                    "(${location.path}:${location.line}:${location.column}) $message"
+                if (location == null) message
+                else "(${location.path}:${location.line}:${location.column}) $message"
             )
         }
     }
diff --git a/compose/compiler/compiler-hosted/runtime-tests/src/commonTest/kotlin/androidx/compose/compiler/test/CompositionTests.kt b/compose/compiler/compiler-hosted/runtime-tests/src/commonTest/kotlin/androidx/compose/compiler/test/CompositionTests.kt
index 6b854da..0d7c110 100644
--- a/compose/compiler/compiler-hosted/runtime-tests/src/commonTest/kotlin/androidx/compose/compiler/test/CompositionTests.kt
+++ b/compose/compiler/compiler-hosted/runtime-tests/src/commonTest/kotlin/androidx/compose/compiler/test/CompositionTests.kt
@@ -35,53 +35,40 @@
         val list = listOf("a", "b")
         compose {
             list.forEach { s ->
-                val obj = object {
-                    val value by rememberUpdatedState(s)
-                }
+                val obj =
+                    object {
+                        val value by rememberUpdatedState(s)
+                    }
                 Text(obj.value)
             }
         }
 
-        validate {
-            list.forEach {
-                Text(it)
-            }
-        }
+        validate { list.forEach { Text(it) } }
     }
 
     @Test
     fun test_crossinline_indirect() = compositionTest {
         val state = CrossInlineState()
 
-        compose {
-            state.place()
-        }
+        compose { state.place() }
 
         state.show {
             val s = remember { "string" }
             Text(s)
         }
         advance()
-        validate {
-            Text("string")
-        }
+        validate { Text("string") }
 
         state.show {
             val i = remember { 1 }
             Text("$i")
         }
         advance()
-        validate {
-            Text("1")
-        }
+        validate { Text("1") }
     }
 
     @Test
-    fun composeValueClassDefaultParameter() = compositionTest {
-        compose {
-            DefaultValueClass()
-        }
-    }
+    fun composeValueClassDefaultParameter() = compositionTest { compose { DefaultValueClass() } }
 
     @Test
     fun groupAroundIfComposeCallInIfConditionWithShortCircuit() = compositionTest {
@@ -91,10 +78,11 @@
 
             ReceiveValue(
                 when {
-                    state -> when {
-                        state -> getCondition()
-                        else -> false
-                    }.let { if (it) 0 else 1 }
+                    state ->
+                        when {
+                            state -> getCondition()
+                            else -> false
+                        }.let { if (it) 0 else 1 }
                     else -> 1
                 }
             )
@@ -105,8 +93,7 @@
     }
 }
 
-@Composable
-fun getCondition() = remember { false }
+@Composable fun getCondition() = remember { false }
 
 @NonRestartableComposable
 @Composable
@@ -115,24 +102,22 @@
     assertEquals(1, string.length)
 }
 
-class CrossInlineState(content: @Composable () -> Unit = { }) {
-    @PublishedApi
-    internal var content by mutableStateOf(content)
+class CrossInlineState(content: @Composable () -> Unit = {}) {
+    @PublishedApi internal var content by mutableStateOf(content)
 
     inline fun show(crossinline content: @Composable () -> Unit) {
         this.content = { content() }
     }
 
     @Composable
-    fun place() { content() }
+    fun place() {
+        content()
+    }
 }
 
-@JvmInline
-value class Data(val string: String)
+@JvmInline value class Data(val string: String)
 
 @Composable
-fun DefaultValueClass(
-    data: Data = Data("Hello")
-) {
+fun DefaultValueClass(data: Data = Data("Hello")) {
     println(data)
 }
diff --git a/compose/compiler/compiler-hosted/runtime-tests/src/commonTest/kotlin/androidx/compose/compiler/test/DefaultParamCompositionTests.kt b/compose/compiler/compiler-hosted/runtime-tests/src/commonTest/kotlin/androidx/compose/compiler/test/DefaultParamCompositionTests.kt
index 76b557b..b880759 100644
--- a/compose/compiler/compiler-hosted/runtime-tests/src/commonTest/kotlin/androidx/compose/compiler/test/DefaultParamCompositionTests.kt
+++ b/compose/compiler/compiler-hosted/runtime-tests/src/commonTest/kotlin/androidx/compose/compiler/test/DefaultParamCompositionTests.kt
@@ -61,41 +61,44 @@
 }
 
 private interface DefaultParamInterface {
-    @Composable fun Content(
-        content: @Composable () -> Unit = @Composable { ComposedContent() }
-    )
-    @Composable fun ComposedContent(
-        content: @Composable () -> Unit = @Composable { Text("default") }
-    ) {
+    @Composable fun Content(content: @Composable () -> Unit = @Composable { ComposedContent() })
+
+    @Composable
+    fun ComposedContent(content: @Composable () -> Unit = @Composable { Text("default") }) {
         content()
     }
 }
 
 private class DefaultParamInterfaceImpl : DefaultParamInterface {
-    @Composable override fun Content(content: @Composable () -> Unit) {
+    @Composable
+    override fun Content(content: @Composable () -> Unit) {
         content()
     }
-    @Composable override fun ComposedContent(content: @Composable () -> Unit) {
+
+    @Composable
+    override fun ComposedContent(content: @Composable () -> Unit) {
         super.ComposedContent(content)
     }
 }
 
 private abstract class DefaultParamAbstract {
-    @Composable abstract fun Content(
-        content: @Composable () -> Unit = @Composable { ComposedContent() }
-    )
-    @Composable open fun ComposedContent(
-        content: @Composable () -> Unit = @Composable { Text("default") }
-    ) {
+    @Composable
+    abstract fun Content(content: @Composable () -> Unit = @Composable { ComposedContent() })
+
+    @Composable
+    open fun ComposedContent(content: @Composable () -> Unit = @Composable { Text("default") }) {
         content()
     }
 }
 
 private class DefaultParamAbstractImpl : DefaultParamAbstract() {
-    @Composable override fun Content(content: @Composable () -> Unit) {
+    @Composable
+    override fun Content(content: @Composable () -> Unit) {
         content()
     }
-    @Composable override fun ComposedContent(content: @Composable () -> Unit) {
+
+    @Composable
+    override fun ComposedContent(content: @Composable () -> Unit) {
         super.ComposedContent(content)
     }
 }
diff --git a/compose/compiler/compiler-hosted/src/main/java/androidx/compose/compiler/plugins/kotlin/BuildMetrics.kt b/compose/compiler/compiler-hosted/src/main/java/androidx/compose/compiler/plugins/kotlin/BuildMetrics.kt
index 43b7431..139f64e 100644
--- a/compose/compiler/compiler-hosted/src/main/java/androidx/compose/compiler/plugins/kotlin/BuildMetrics.kt
+++ b/compose/compiler/compiler-hosted/src/main/java/androidx/compose/compiler/plugins/kotlin/BuildMetrics.kt
@@ -39,7 +39,9 @@
 
 @JvmDefaultWithCompatibility
 interface FunctionMetrics {
-    val isEmpty: Boolean get() = false
+    val isEmpty: Boolean
+        get() = false
+
     val packageName: FqName
     val name: String
     val composable: Boolean
@@ -53,11 +55,14 @@
     val groups: Int
     val calls: Int
     val scheme: String?
+
     fun recordGroup()
+
     fun recordComposableCall(
         expression: IrCall,
         paramMeta: List<ComposableFunctionBodyTransformer.CallArgumentMeta>
     )
+
     fun recordParameter(
         declaration: IrValueParameter,
         type: IrType,
@@ -66,6 +71,7 @@
         defaultStatic: Boolean,
         used: Boolean,
     )
+
     fun recordFunction(
         composable: Boolean,
         restartable: Boolean,
@@ -75,98 +81,141 @@
         hasDefaults: Boolean,
         readonly: Boolean
     )
-    fun recordScheme(
-        scheme: String
-    )
+
+    fun recordScheme(scheme: String)
+
     fun print(out: Appendable, src: IrSourcePrinterVisitor)
 }
 
 @JvmDefaultWithCompatibility
 interface ModuleMetrics {
-    val isEmpty get() = false
+    val isEmpty
+        get() = false
 
     fun recordFunction(
         function: FunctionMetrics,
     )
+
     fun recordClass(
         declaration: IrClass,
         marked: Boolean,
         stability: Stability,
     )
+
     fun recordLambda(
         composable: Boolean,
         memoized: Boolean,
         singleton: Boolean,
     )
+
     fun recordComposableCall(
         expression: IrCall,
         paramMeta: List<ComposableFunctionBodyTransformer.CallArgumentMeta>
     )
+
     fun log(message: String)
+
     fun Appendable.appendModuleJson()
+
     fun Appendable.appendComposablesCsv()
+
     fun Appendable.appendComposablesTxt()
+
     fun Appendable.appendClassesTxt()
+
     fun saveMetricsTo(directory: String)
+
     fun saveReportsTo(directory: String)
+
     fun makeFunctionMetrics(function: IrFunction): FunctionMetrics
 }
 
 object EmptyModuleMetrics : ModuleMetrics {
-    override val isEmpty: Boolean get() = true
+    override val isEmpty: Boolean
+        get() = true
+
     override fun recordFunction(function: FunctionMetrics) {}
+
     override fun recordClass(declaration: IrClass, marked: Boolean, stability: Stability) {}
+
     override fun recordLambda(composable: Boolean, memoized: Boolean, singleton: Boolean) {}
+
     override fun recordComposableCall(
         expression: IrCall,
         paramMeta: List<ComposableFunctionBodyTransformer.CallArgumentMeta>
     ) {}
+
     override fun log(message: String) {
         println(message)
     }
+
     override fun Appendable.appendModuleJson() {}
+
     override fun Appendable.appendComposablesCsv() {}
+
     override fun Appendable.appendComposablesTxt() {}
+
     override fun Appendable.appendClassesTxt() {}
+
     override fun saveMetricsTo(directory: String) {}
+
     override fun saveReportsTo(directory: String) {}
+
     override fun makeFunctionMetrics(function: IrFunction): FunctionMetrics = EmptyFunctionMetrics
 }
 
 object EmptyFunctionMetrics : FunctionMetrics {
     private fun emptyMetricsAccessed(): Nothing = error("Empty metrics accessed")
-    override val isEmpty: Boolean get() = true
+
+    override val isEmpty: Boolean
+        get() = true
+
     override val packageName: FqName
         get() = emptyMetricsAccessed()
+
     override val name: String
         get() = emptyMetricsAccessed()
+
     override val composable: Boolean
         get() = emptyMetricsAccessed()
+
     override val skippable: Boolean
         get() = emptyMetricsAccessed()
+
     override val restartable: Boolean
         get() = emptyMetricsAccessed()
+
     override val readonly: Boolean
         get() = emptyMetricsAccessed()
+
     override val inline: Boolean
         get() = emptyMetricsAccessed()
+
     override val isLambda: Boolean
         get() = emptyMetricsAccessed()
+
     override val hasDefaults: Boolean
         get() = emptyMetricsAccessed()
+
     override val defaultsGroup: Boolean
         get() = emptyMetricsAccessed()
+
     override val groups: Int
         get() = emptyMetricsAccessed()
+
     override val calls: Int
         get() = emptyMetricsAccessed()
+
     override val scheme: String
         get() = emptyMetricsAccessed()
+
     override fun recordGroup() {}
+
     override fun recordComposableCall(
         expression: IrCall,
         paramMeta: List<ComposableFunctionBodyTransformer.CallArgumentMeta>
     ) {}
+
     override fun recordParameter(
         declaration: IrValueParameter,
         type: IrType,
@@ -175,6 +224,7 @@
         defaultStatic: Boolean,
         used: Boolean
     ) {}
+
     override fun recordFunction(
         composable: Boolean,
         restartable: Boolean,
@@ -184,14 +234,13 @@
         hasDefaults: Boolean,
         readonly: Boolean
     ) {}
+
     override fun recordScheme(scheme: String) {}
+
     override fun print(out: Appendable, src: IrSourcePrinterVisitor) {}
 }
 
-class ModuleMetricsImpl(
-    var name: String,
-    val stabilityOf: (IrType) -> Stability
-) : ModuleMetrics {
+class ModuleMetricsImpl(var name: String, val stabilityOf: (IrType) -> Stability) : ModuleMetrics {
     private var skippableComposables = 0
     private var restartableComposables = 0
     private var readonlyComposables = 0
@@ -226,42 +275,47 @@
         val stability: Stability
     ) {
 
-        private fun Stability.simpleHumanReadable() = when {
-            knownStable() -> "stable"
-            knownUnstable() -> "unstable"
-            else -> "runtime"
-        }
-        fun print(out: Appendable, src: IrSourcePrinterVisitor) = with(out) {
-            append("${stability.simpleHumanReadable()} ")
-            append("class ")
-            append(declaration.name.asString())
-            appendLine(" {")
-            for (decl in declaration.declarations) {
-                val isVar = when (decl) {
-                    is IrProperty -> decl.isVar
-                    is IrField -> true
-                    else -> false
-                }
-                val field = when (decl) {
-                    is IrProperty -> decl.backingField ?: continue
-                    is IrField -> decl
-                    else -> continue
-                }
-                if (field.name == ComposeNames.STABILITY_FLAG) continue
-                append("  ")
-                val fieldStability = stabilityOf(field.type)
-                append("${fieldStability.simpleHumanReadable()} ")
-                append(if (isVar) "var " else "val ")
-                append(field.name.asString())
-                append(": ")
-                append(src.printType(field.type))
-                appendLine()
+        private fun Stability.simpleHumanReadable() =
+            when {
+                knownStable() -> "stable"
+                knownUnstable() -> "unstable"
+                else -> "runtime"
             }
-            if (!marked) {
-                appendLine("  <runtime stability> = $stability")
+
+        fun print(out: Appendable, src: IrSourcePrinterVisitor) =
+            with(out) {
+                append("${stability.simpleHumanReadable()} ")
+                append("class ")
+                append(declaration.name.asString())
+                appendLine(" {")
+                for (decl in declaration.declarations) {
+                    val isVar =
+                        when (decl) {
+                            is IrProperty -> decl.isVar
+                            is IrField -> true
+                            else -> false
+                        }
+                    val field =
+                        when (decl) {
+                            is IrProperty -> decl.backingField ?: continue
+                            is IrField -> decl
+                            else -> continue
+                        }
+                    if (field.name == ComposeNames.STABILITY_FLAG) continue
+                    append("  ")
+                    val fieldStability = stabilityOf(field.type)
+                    append("${fieldStability.simpleHumanReadable()} ")
+                    append(if (isVar) "var " else "val ")
+                    append(field.name.asString())
+                    append(": ")
+                    append(src.printType(field.type))
+                    appendLine()
+                }
+                if (!marked) {
+                    appendLine("  <runtime stability> = $stability")
+                }
+                appendLine("}")
             }
-            appendLine("}")
-        }
     }
 
     override fun recordFunction(function: FunctionMetrics) {
@@ -277,18 +331,8 @@
         totalGroups += function.groups
     }
 
-    override fun recordClass(
-        declaration: IrClass,
-        marked: Boolean,
-        stability: Stability
-    ) {
-        classes.add(
-            ClassMetrics(
-                declaration,
-                marked,
-                stability
-            )
-        )
+    override fun recordClass(declaration: IrClass, marked: Boolean, stability: Stability) {
+        classes.add(ClassMetrics(declaration, marked, stability))
         totalClasses++
         when {
             marked -> {
@@ -415,28 +459,16 @@
 
     override fun saveMetricsTo(directory: String) {
         val dir = File(directory)
-        val prefix = name
-            .replace('.', '_')
-            .replace("<", "")
-            .replace(">", "")
-        File(dir, "$prefix-module.json").write {
-            appendModuleJson()
-        }
+        val prefix = name.replace('.', '_').replace("<", "").replace(">", "")
+        File(dir, "$prefix-module.json").write { appendModuleJson() }
     }
 
     override fun saveReportsTo(directory: String) {
         val dir = File(directory)
-        val prefix = name
-            .replace('.', '_')
-            .replace("<", "")
-            .replace(">", "")
-        File(dir, "$prefix-composables.csv").write {
-            appendComposablesCsv()
-        }
+        val prefix = name.replace('.', '_').replace("<", "").replace(">", "")
+        File(dir, "$prefix-composables.csv").write { appendComposablesCsv() }
 
-        File(dir, "$prefix-composables.txt").write {
-            appendComposablesTxt()
-        }
+        File(dir, "$prefix-composables.txt").write { appendComposablesTxt() }
 
         if (logMessages.isNotEmpty()) {
             File(dir, "$prefix-composables.log").write {
@@ -444,18 +476,14 @@
             }
         }
 
-        File(dir, "$prefix-classes.txt").write {
-            appendClassesTxt()
-        }
+        File(dir, "$prefix-classes.txt").write { appendClassesTxt() }
     }
 
     override fun makeFunctionMetrics(function: IrFunction): FunctionMetrics =
         FunctionMetricsImpl(function)
 }
 
-class FunctionMetricsImpl(
-    val function: IrFunction
-) : FunctionMetrics {
+class FunctionMetricsImpl(val function: IrFunction) : FunctionMetrics {
     override var packageName: FqName = function.fqNameForIrSerialization
     override var name: String = function.name.asString()
     override var composable: Boolean = false
@@ -469,6 +497,7 @@
     override var groups: Int = 0
     override var calls: Int = 0
     override var scheme: String? = null
+
     private class Param(
         val declaration: IrValueParameter,
         val type: IrType,
@@ -478,28 +507,28 @@
         val used: Boolean
     ) {
         @OptIn(ObsoleteDescriptorBasedAPI::class)
-        fun print(out: Appendable, src: IrSourcePrinterVisitor) = with(out) {
-            if (!used) append("unused ")
-            when {
-                stability.knownStable() -> append("stable ")
-                stability.knownUnstable() -> append("unstable ")
-            }
-            append(declaration.name.asString())
-            append(": ")
-            append(src.printType(type))
-            if (default != null) {
-                append(" = ")
-                if (defaultStatic) append("@static ")
-                else append("@dynamic ")
-                val psi = declaration.symbol.descriptor.findPsi() as? KtParameter
-                val str = psi?.defaultValue?.text
-                if (str != null) {
-                    append(str)
-                } else {
-                    default.accept(src, null)
+        fun print(out: Appendable, src: IrSourcePrinterVisitor) =
+            with(out) {
+                if (!used) append("unused ")
+                when {
+                    stability.knownStable() -> append("stable ")
+                    stability.knownUnstable() -> append("unstable ")
+                }
+                append(declaration.name.asString())
+                append(": ")
+                append(src.printType(type))
+                if (default != null) {
+                    append(" = ")
+                    if (defaultStatic) append("@static ") else append("@dynamic ")
+                    val psi = declaration.symbol.descriptor.findPsi() as? KtParameter
+                    val str = psi?.defaultValue?.text
+                    if (str != null) {
+                        append(str)
+                    } else {
+                        default.accept(src, null)
+                    }
                 }
             }
-        }
     }
 
     private val parameters = mutableListOf<Param>()
@@ -557,29 +586,30 @@
         this.scheme = scheme
     }
 
-    override fun print(out: Appendable, src: IrSourcePrinterVisitor): Unit = with(out) {
-        if (restartable) append("restartable ")
-        if (skippable) append("skippable ")
-        if (readonly) append("readonly ")
-        if (inline) append("inline ")
-        scheme?.let { append("scheme(\"$it\") ") }
-        append("fun ")
-        append(name)
-        if (parameters.isEmpty()) {
-            appendLine("()")
-        } else {
-            appendLine("(")
-            for (param in parameters) {
-                append("  ")
-                param.print(out, src)
+    override fun print(out: Appendable, src: IrSourcePrinterVisitor): Unit =
+        with(out) {
+            if (restartable) append("restartable ")
+            if (skippable) append("skippable ")
+            if (readonly) append("readonly ")
+            if (inline) append("inline ")
+            scheme?.let { append("scheme(\"$it\") ") }
+            append("fun ")
+            append(name)
+            if (parameters.isEmpty()) {
+                appendLine("()")
+            } else {
+                appendLine("(")
+                for (param in parameters) {
+                    append("  ")
+                    param.print(out, src)
+                    appendLine()
+                }
+                append(")")
+                if (!function.returnType.isUnitOrNullableUnit()) {
+                    append(": ")
+                    append(src.printType(function.returnType))
+                }
                 appendLine()
             }
-            append(")")
-            if (!function.returnType.isUnitOrNullableUnit()) {
-                append(": ")
-                append(src.printType(function.returnType))
-            }
-            appendLine()
         }
-    }
 }
diff --git a/compose/compiler/compiler-hosted/src/main/java/androidx/compose/compiler/plugins/kotlin/ComposeFqNames.kt b/compose/compiler/compiler-hosted/src/main/java/androidx/compose/compiler/plugins/kotlin/ComposeFqNames.kt
index 4b290b8..f336d78 100644
--- a/compose/compiler/compiler-hosted/src/main/java/androidx/compose/compiler/plugins/kotlin/ComposeFqNames.kt
+++ b/compose/compiler/compiler-hosted/src/main/java/androidx/compose/compiler/plugins/kotlin/ComposeFqNames.kt
@@ -33,8 +33,8 @@
 private val internalRootFqName = FqName(internalRoot)
 
 object ComposeClassIds {
-    private fun classIdFor(cname: String) =
-        ClassId(rootFqName, Name.identifier(cname))
+    private fun classIdFor(cname: String) = ClassId(rootFqName, Name.identifier(cname))
+
     internal fun internalClassIdFor(cname: String) =
         ClassId(internalRootFqName, Name.identifier(cname))
 
@@ -57,31 +57,24 @@
 }
 
 object ComposeCallableIds {
-    private fun topLevelCallableId(name: String) =
-        CallableId(rootFqName, Name.identifier(name))
+    private fun topLevelCallableId(name: String) = CallableId(rootFqName, Name.identifier(name))
+
     internal fun internalTopLevelCallableId(name: String) =
         CallableId(internalRootFqName, Name.identifier(name))
 
     val cache = topLevelCallableId("cache")
     val composableLambda = internalTopLevelCallableId("composableLambda")
-    val composableLambdaInstance =
-        internalTopLevelCallableId("composableLambdaInstance")
+    val composableLambdaInstance = internalTopLevelCallableId("composableLambdaInstance")
     val composableLambdaN = internalTopLevelCallableId("composableLambdaN")
-    val composableLambdaNInstance =
-        internalTopLevelCallableId("composableLambdaNInstance")
+    val composableLambdaNInstance = internalTopLevelCallableId("composableLambdaNInstance")
     val currentComposer = topLevelCallableId("currentComposer")
-    val isLiveLiteralsEnabled =
-        internalTopLevelCallableId("isLiveLiteralsEnabled")
-    val isTraceInProgress =
-        topLevelCallableId(ComposeNames.IS_TRACE_IN_PROGRESS)
+    val isLiveLiteralsEnabled = internalTopLevelCallableId("isLiveLiteralsEnabled")
+    val isTraceInProgress = topLevelCallableId(ComposeNames.IS_TRACE_IN_PROGRESS)
     val liveLiteral = internalTopLevelCallableId("liveLiteral")
     val remember = topLevelCallableId("remember")
-    val sourceInformation =
-        topLevelCallableId(ComposeNames.SOURCEINFORMATION)
-    val sourceInformationMarkerEnd =
-        topLevelCallableId(ComposeNames.SOURCEINFORMATIONMARKEREND)
-    val sourceInformationMarkerStart =
-        topLevelCallableId(ComposeNames.SOURCEINFORMATIONMARKERSTART)
+    val sourceInformation = topLevelCallableId(ComposeNames.SOURCEINFORMATION)
+    val sourceInformationMarkerEnd = topLevelCallableId(ComposeNames.SOURCEINFORMATIONMARKEREND)
+    val sourceInformationMarkerStart = topLevelCallableId(ComposeNames.SOURCEINFORMATIONMARKERSTART)
     val traceEventEnd = topLevelCallableId(ComposeNames.TRACE_EVENT_END)
     val traceEventStart = topLevelCallableId(ComposeNames.TRACE_EVENT_START)
     val updateChangedFlags = topLevelCallableId(ComposeNames.UPDATE_CHANGED_FLAGS)
@@ -93,7 +86,9 @@
 
 object ComposeFqNames {
     internal fun fqNameFor(cname: String) = FqName("$root.$cname")
+
     private fun internalFqNameFor(cname: String) = FqName("$internalRoot.$cname")
+
     private fun composablesFqNameFor(cname: String) = fqNameFor("ComposablesKt.$cname")
 
     val InternalPackage = internalRootFqName
@@ -117,8 +112,7 @@
     val composableLambdaType = ComposeClassIds.ComposableLambda.asSingleFqName()
     val composableLambda = ComposeCallableIds.composableLambda.asSingleFqName()
     val rememberComposableLambda = ComposeCallableIds.rememberComposableLambda.asSingleFqName()
-    val composableLambdaFullName =
-        internalFqNameFor("ComposableLambdaKt.composableLambda")
+    val composableLambdaFullName = internalFqNameFor("ComposableLambdaKt.composableLambda")
     val remember = ComposeCallableIds.remember.asSingleFqName()
     val cache = ComposeCallableIds.cache.asSingleFqName()
     val key = fqNameFor("key")
@@ -129,8 +123,7 @@
     val StabilityInferred = ComposeClassIds.StabilityInferred.asSingleFqName()
 }
 
-fun IrType.hasComposableAnnotation(): Boolean =
-    hasAnnotation(ComposeFqNames.Composable)
+fun IrType.hasComposableAnnotation(): Boolean = hasAnnotation(ComposeFqNames.Composable)
 
 fun IrAnnotationContainer.hasComposableAnnotation(): Boolean =
     hasAnnotation(ComposeFqNames.Composable)
diff --git a/compose/compiler/compiler-hosted/src/main/java/androidx/compose/compiler/plugins/kotlin/ComposeIrGenerationExtension.kt b/compose/compiler/compiler-hosted/src/main/java/androidx/compose/compiler/plugins/kotlin/ComposeIrGenerationExtension.kt
index 28bc215..61dbf50 100644
--- a/compose/compiler/compiler-hosted/src/main/java/androidx/compose/compiler/plugins/kotlin/ComposeIrGenerationExtension.kt
+++ b/compose/compiler/compiler-hosted/src/main/java/androidx/compose/compiler/plugins/kotlin/ComposeIrGenerationExtension.kt
@@ -72,22 +72,19 @@
     var metrics: ModuleMetrics = EmptyModuleMetrics
         private set
 
-    override fun generate(
-        moduleFragment: IrModuleFragment,
-        pluginContext: IrPluginContext
-    ) {
+    override fun generate(moduleFragment: IrModuleFragment, pluginContext: IrPluginContext) {
         val isKlibTarget = !pluginContext.platform.isJvm()
         VersionChecker(pluginContext).check()
 
-        val stabilityInferencer = StabilityInferencer(
-            pluginContext.moduleDescriptor,
-            stableTypeMatchers,
-        )
+        val stabilityInferencer =
+            StabilityInferencer(
+                pluginContext.moduleDescriptor,
+                stableTypeMatchers,
+            )
 
         // Input check.  This should always pass, else something is horribly wrong upstream.
         // Necessary because oftentimes the issue is upstream (compiler bug, prior plugin, etc)
-        if (validateIr)
-            validateIr(moduleFragment, pluginContext.irBuiltIns)
+        if (validateIr) validateIr(moduleFragment, pluginContext.irBuiltIns)
 
         // create a symbol remapper to be used across all transforms
         val symbolRemapper = ComposableSymbolRemapper()
@@ -99,55 +96,60 @@
         if (moduleMetricsFactory != null) {
             metrics = moduleMetricsFactory.invoke(stabilityInferencer)
         } else if (metricsDestination != null || reportsDestination != null) {
-            metrics = ModuleMetricsImpl(moduleFragment.name.asString()) {
-                stabilityInferencer.stabilityOf(it)
-            }
+            metrics =
+                ModuleMetricsImpl(moduleFragment.name.asString()) {
+                    stabilityInferencer.stabilityOf(it)
+                }
         }
 
         if (pluginContext.platform.isNative()) {
             AddHiddenFromObjCLowering(
-                pluginContext,
-                symbolRemapper,
-                metrics,
-                descriptorSerializerContext?.hideFromObjCDeclarationsSet,
-                stabilityInferencer,
-                featureFlags,
-            ).lower(moduleFragment)
+                    pluginContext,
+                    symbolRemapper,
+                    metrics,
+                    descriptorSerializerContext?.hideFromObjCDeclarationsSet,
+                    stabilityInferencer,
+                    featureFlags,
+                )
+                .lower(moduleFragment)
         }
 
         ClassStabilityTransformer(
-            useK2,
-            pluginContext,
-            symbolRemapper,
-            metrics,
-            stabilityInferencer,
-            classStabilityInferredCollection = descriptorSerializerContext
-                ?.classStabilityInferredCollection?.takeIf {
-                    !pluginContext.platform.isJvm()
-                },
-            featureFlags,
-        ).lower(moduleFragment)
+                useK2,
+                pluginContext,
+                symbolRemapper,
+                metrics,
+                stabilityInferencer,
+                classStabilityInferredCollection =
+                    descriptorSerializerContext?.classStabilityInferredCollection?.takeIf {
+                        !pluginContext.platform.isJvm()
+                    },
+                featureFlags,
+            )
+            .lower(moduleFragment)
 
         LiveLiteralTransformer(
-            liveLiteralsEnabled || liveLiteralsV2Enabled,
-            liveLiteralsV2Enabled,
-            DurableKeyVisitor(),
-            pluginContext,
-            symbolRemapper,
-            metrics,
-            stabilityInferencer,
-            featureFlags,
-        ).lower(moduleFragment)
+                liveLiteralsEnabled || liveLiteralsV2Enabled,
+                liveLiteralsV2Enabled,
+                DurableKeyVisitor(),
+                pluginContext,
+                symbolRemapper,
+                metrics,
+                stabilityInferencer,
+                featureFlags,
+            )
+            .lower(moduleFragment)
 
         ComposableFunInterfaceLowering(pluginContext).lower(moduleFragment)
 
-        val functionKeyTransformer = DurableFunctionKeyTransformer(
-            pluginContext,
-            symbolRemapper,
-            metrics,
-            stabilityInferencer,
-            featureFlags,
-        )
+        val functionKeyTransformer =
+            DurableFunctionKeyTransformer(
+                pluginContext,
+                symbolRemapper,
+                metrics,
+                stabilityInferencer,
+                featureFlags,
+            )
 
         functionKeyTransformer.lower(moduleFragment)
 
@@ -157,91 +159,101 @@
 
         // Generate default wrappers for virtual functions
         ComposableDefaultParamLowering(
-            pluginContext,
-            symbolRemapper,
-            metrics,
-            stabilityInferencer,
-            featureFlags
-        ).lower(moduleFragment)
+                pluginContext,
+                symbolRemapper,
+                metrics,
+                stabilityInferencer,
+                featureFlags
+            )
+            .lower(moduleFragment)
 
         // Memoize normal lambdas and wrap composable lambdas
         ComposerLambdaMemoization(
-            pluginContext,
-            symbolRemapper,
-            metrics,
-            stabilityInferencer,
-            featureFlags,
-        ).lower(moduleFragment)
-
-        val mangler = when {
-            pluginContext.platform.isJs() -> JsManglerIr
-            else -> null
-        }
-
-        val idSignatureBuilder = when {
-            pluginContext.platform.isJs() -> IdSignatureSerializer(
-                PublicIdSignatureComputer(mangler!!),
-                DeclarationTable(JsGlobalDeclarationTable(pluginContext.irBuiltIns))
+                pluginContext,
+                symbolRemapper,
+                metrics,
+                stabilityInferencer,
+                featureFlags,
             )
-            else -> null
-        }
+            .lower(moduleFragment)
+
+        val mangler =
+            when {
+                pluginContext.platform.isJs() -> JsManglerIr
+                else -> null
+            }
+
+        val idSignatureBuilder =
+            when {
+                pluginContext.platform.isJs() ->
+                    IdSignatureSerializer(
+                        PublicIdSignatureComputer(mangler!!),
+                        DeclarationTable(JsGlobalDeclarationTable(pluginContext.irBuiltIns))
+                    )
+                else -> null
+            }
         if (decoysEnabled) {
             require(idSignatureBuilder != null) {
                 "decoys are not supported for ${pluginContext.platform}"
             }
 
             CreateDecoysTransformer(
-                pluginContext,
-                symbolRemapper,
-                idSignatureBuilder,
-                stabilityInferencer,
-                metrics,
-                featureFlags,
-            ).lower(moduleFragment)
+                    pluginContext,
+                    symbolRemapper,
+                    idSignatureBuilder,
+                    stabilityInferencer,
+                    metrics,
+                    featureFlags,
+                )
+                .lower(moduleFragment)
 
             SubstituteDecoyCallsTransformer(
-                pluginContext,
-                symbolRemapper,
-                idSignatureBuilder,
-                stabilityInferencer,
-                metrics,
-                featureFlags,
-            ).lower(moduleFragment)
+                    pluginContext,
+                    symbolRemapper,
+                    idSignatureBuilder,
+                    stabilityInferencer,
+                    metrics,
+                    featureFlags,
+                )
+                .lower(moduleFragment)
         }
 
         // transform all composable functions to have an extra synthetic composer
         // parameter. this will also transform all types and calls to include the extra
         // parameter.
         ComposerParamTransformer(
-            pluginContext,
-            symbolRemapper,
-            stabilityInferencer,
-            decoysEnabled,
-            metrics,
-            featureFlags,
-        ).lower(moduleFragment)
+                pluginContext,
+                symbolRemapper,
+                stabilityInferencer,
+                decoysEnabled,
+                metrics,
+                featureFlags,
+            )
+            .lower(moduleFragment)
 
         ComposableTargetAnnotationsTransformer(
-            pluginContext,
-            symbolRemapper,
-            metrics,
-            stabilityInferencer,
-            featureFlags,
-        ).lower(moduleFragment)
+                pluginContext,
+                symbolRemapper,
+                metrics,
+                stabilityInferencer,
+                featureFlags,
+            )
+            .lower(moduleFragment)
 
         // transform calls to the currentComposer to just use the local parameter from the
         // previous transform
         ComposerIntrinsicTransformer(pluginContext, decoysEnabled).lower(moduleFragment)
 
         ComposableFunctionBodyTransformer(
-            pluginContext,
-            symbolRemapper,
-            metrics,
-            stabilityInferencer,
-            sourceInformationEnabled,
-            traceMarkersEnabled,
-            featureFlags,
-        ).lower(moduleFragment)
+                pluginContext,
+                symbolRemapper,
+                metrics,
+                stabilityInferencer,
+                sourceInformationEnabled,
+                traceMarkersEnabled,
+                featureFlags,
+            )
+            .lower(moduleFragment)
 
         if (decoysEnabled) {
             require(idSignatureBuilder != null) {
@@ -249,36 +261,39 @@
             }
 
             RecordDecoySignaturesTransformer(
-                pluginContext,
-                symbolRemapper,
-                idSignatureBuilder,
-                metrics,
-                mangler!!,
-                stabilityInferencer,
-                featureFlags,
-            ).lower(moduleFragment)
+                    pluginContext,
+                    symbolRemapper,
+                    idSignatureBuilder,
+                    metrics,
+                    mangler!!,
+                    stabilityInferencer,
+                    featureFlags,
+                )
+                .lower(moduleFragment)
         }
 
         if (isKlibTarget) {
             KlibAssignableParamTransformer(
-                pluginContext,
-                symbolRemapper,
-                metrics,
-                stabilityInferencer,
-                featureFlags,
-            ).lower(moduleFragment)
+                    pluginContext,
+                    symbolRemapper,
+                    metrics,
+                    stabilityInferencer,
+                    featureFlags,
+                )
+                .lower(moduleFragment)
         }
 
         if (pluginContext.platform.isJs() || pluginContext.platform.isWasm()) {
             WrapJsComposableLambdaLowering(
-                pluginContext,
-                symbolRemapper,
-                metrics,
-                idSignatureBuilder,
-                stabilityInferencer,
-                decoysEnabled,
-                featureFlags,
-            ).lower(moduleFragment)
+                    pluginContext,
+                    symbolRemapper,
+                    metrics,
+                    idSignatureBuilder,
+                    stabilityInferencer,
+                    decoysEnabled,
+                    featureFlags,
+                )
+                .lower(moduleFragment)
         }
 
         if (generateFunctionKeyMetaClasses) {
@@ -295,7 +310,6 @@
         }
 
         // Verify that our transformations didn't break something
-        if (validateIr)
-            validateIr(moduleFragment, pluginContext.irBuiltIns)
+        if (validateIr) validateIr(moduleFragment, pluginContext.irBuiltIns)
     }
 }
diff --git a/compose/compiler/compiler-hosted/src/main/java/androidx/compose/compiler/plugins/kotlin/ComposePlugin.kt b/compose/compiler/compiler-hosted/src/main/java/androidx/compose/compiler/plugins/kotlin/ComposePlugin.kt
index d2ead6e..e5cefaf 100644
--- a/compose/compiler/compiler-hosted/src/main/java/androidx/compose/compiler/plugins/kotlin/ComposePlugin.kt
+++ b/compose/compiler/compiler-hosted/src/main/java/androidx/compose/compiler/plugins/kotlin/ComposePlugin.kt
@@ -56,9 +56,7 @@
             "Enable Live Literals code generation (with per-file enabled flags)"
         )
     val GENERATE_FUNCTION_KEY_META_CLASSES_KEY =
-        CompilerConfigurationKey<Boolean>(
-            "Generate function key meta classes"
-        )
+        CompilerConfigurationKey<Boolean>("Generate function key meta classes")
     val SOURCE_INFORMATION_ENABLED_KEY =
         CompilerConfigurationKey<Boolean>("Include source information in generated code")
     val METRICS_DESTINATION_KEY =
@@ -71,266 +69,263 @@
         CompilerConfigurationKey<Boolean>(
             "Enabled optimization to remove groups around non-skipping functions"
         )
-    val SUPPRESS_KOTLIN_VERSION_COMPATIBILITY_CHECK = CompilerConfigurationKey<String?>(
-        "Version of Kotlin for which version compatibility check should be suppressed"
-    )
+    val SUPPRESS_KOTLIN_VERSION_COMPATIBILITY_CHECK =
+        CompilerConfigurationKey<String?>(
+            "Version of Kotlin for which version compatibility check should be suppressed"
+        )
     val DECOYS_ENABLED_KEY =
         CompilerConfigurationKey<Boolean>("Generate decoy methods in IR transform")
     val STRONG_SKIPPING_ENABLED_KEY =
         CompilerConfigurationKey<Boolean>("Enable strong skipping mode")
     val STABILITY_CONFIG_PATH_KEY =
-        CompilerConfigurationKey<List<String>>(
-            "Path to stability configuration file"
-        )
+        CompilerConfigurationKey<List<String>>("Path to stability configuration file")
     val TEST_STABILITY_CONFIG_KEY =
         CompilerConfigurationKey<Set<String>>(
             "Set of stable classes to be merged with configuration file, used for testing."
         )
     val TRACE_MARKERS_ENABLED_KEY =
         CompilerConfigurationKey<Boolean>("Include composition trace markers in generated code")
-    val FEATURE_FLAGS =
-        CompilerConfigurationKey<List<String>>(
-            "A list of features to enable."
-        )
+    val FEATURE_FLAGS = CompilerConfigurationKey<List<String>>("A list of features to enable.")
 }
 
 @OptIn(ExperimentalCompilerApi::class)
 class ComposeCommandLineProcessor : CommandLineProcessor {
     companion object {
         val PLUGIN_ID = "androidx.compose.compiler.plugins.kotlin"
-        val LIVE_LITERALS_ENABLED_OPTION = CliOption(
-            "liveLiterals",
-            "<true|false>",
-            "Enable Live Literals code generation",
-            required = false,
-            allowMultipleOccurrences = false
-        )
-        val LIVE_LITERALS_V2_ENABLED_OPTION = CliOption(
-            "liveLiteralsEnabled",
-            "<true|false>",
-            "Enable Live Literals code generation (with per-file enabled flags)",
-            required = false,
-            allowMultipleOccurrences = false
-        )
-        val GENERATE_FUNCTION_KEY_META_CLASSES_OPTION = CliOption(
-            "generateFunctionKeyMetaClasses",
-            "<true|false>",
-            "Generate function key meta classes with annotations indicating the " +
-                "functions and their group keys. Generally used for tooling.",
-            required = false,
-            allowMultipleOccurrences = false
-        )
-        val SOURCE_INFORMATION_ENABLED_OPTION = CliOption(
-            "sourceInformation",
-            "<true|false>",
-            "Include source information in generated code",
-            required = false,
-            allowMultipleOccurrences = false
-        )
-        val METRICS_DESTINATION_OPTION = CliOption(
-            "metricsDestination",
-            "<path>",
-            "Save compose build metrics to this folder",
-            required = false,
-            allowMultipleOccurrences = false
-        )
-        val REPORTS_DESTINATION_OPTION = CliOption(
-            "reportsDestination",
-            "<path>",
-            "Save compose build reports to this folder",
-            required = false,
-            allowMultipleOccurrences = false
-        )
-        val FEATURE_FLAG_OPTION = CliOption(
-            "featureFlag",
-            "<feature name>",
-            "The name of the feature to enable",
-            required = false,
-            allowMultipleOccurrences = true
-        )
-        val INTRINSIC_REMEMBER_OPTIMIZATION_ENABLED_OPTION = CliOption(
-            "intrinsicRemember",
-            "<true|false>",
-            "Include source information in generated code. Deprecated. Use ${
+        val LIVE_LITERALS_ENABLED_OPTION =
+            CliOption(
+                "liveLiterals",
+                "<true|false>",
+                "Enable Live Literals code generation",
+                required = false,
+                allowMultipleOccurrences = false
+            )
+        val LIVE_LITERALS_V2_ENABLED_OPTION =
+            CliOption(
+                "liveLiteralsEnabled",
+                "<true|false>",
+                "Enable Live Literals code generation (with per-file enabled flags)",
+                required = false,
+                allowMultipleOccurrences = false
+            )
+        val GENERATE_FUNCTION_KEY_META_CLASSES_OPTION =
+            CliOption(
+                "generateFunctionKeyMetaClasses",
+                "<true|false>",
+                "Generate function key meta classes with annotations indicating the " +
+                    "functions and their group keys. Generally used for tooling.",
+                required = false,
+                allowMultipleOccurrences = false
+            )
+        val SOURCE_INFORMATION_ENABLED_OPTION =
+            CliOption(
+                "sourceInformation",
+                "<true|false>",
+                "Include source information in generated code",
+                required = false,
+                allowMultipleOccurrences = false
+            )
+        val METRICS_DESTINATION_OPTION =
+            CliOption(
+                "metricsDestination",
+                "<path>",
+                "Save compose build metrics to this folder",
+                required = false,
+                allowMultipleOccurrences = false
+            )
+        val REPORTS_DESTINATION_OPTION =
+            CliOption(
+                "reportsDestination",
+                "<path>",
+                "Save compose build reports to this folder",
+                required = false,
+                allowMultipleOccurrences = false
+            )
+        val FEATURE_FLAG_OPTION =
+            CliOption(
+                "featureFlag",
+                "<feature name>",
+                "The name of the feature to enable",
+                required = false,
+                allowMultipleOccurrences = true
+            )
+        val INTRINSIC_REMEMBER_OPTIMIZATION_ENABLED_OPTION =
+            CliOption(
+                "intrinsicRemember",
+                "<true|false>",
+                "Include source information in generated code. Deprecated. Use ${
                 useFeatureFlagInsteadMessage(FeatureFlag.IntrinsicRemember)
             }",
-            required = false,
-            allowMultipleOccurrences = false
-        )
-        val NON_SKIPPING_GROUP_OPTIMIZATION_ENABLED_OPTION = CliOption(
-            optionName = "nonSkippingGroupOptimization",
-            valueDescription = "<true|false>",
-            description = "Remove groups around non-skipping composable functions. " +
-                "Deprecated. ${
+                required = false,
+                allowMultipleOccurrences = false
+            )
+        val NON_SKIPPING_GROUP_OPTIMIZATION_ENABLED_OPTION =
+            CliOption(
+                optionName = "nonSkippingGroupOptimization",
+                valueDescription = "<true|false>",
+                description =
+                    "Remove groups around non-skipping composable functions. " +
+                        "Deprecated. ${
                     useFeatureFlagInsteadMessage(FeatureFlag.OptimizeNonSkippingGroups)
                 }",
-            required = false,
-            allowMultipleOccurrences = false
-        )
-        val SUPPRESS_KOTLIN_VERSION_CHECK_ENABLED_OPTION = CliOption(
-            "suppressKotlinVersionCompatibilityCheck",
-            "<kotlin_version>",
-            "Suppress Kotlin version compatibility check",
-            required = false,
-            allowMultipleOccurrences = false
-        )
-        val DECOYS_ENABLED_OPTION = CliOption(
-            "generateDecoys",
-            "<true|false>",
-            "Generate decoy methods in IR transform",
-            required = false,
-            allowMultipleOccurrences = false
-        )
-        val STRONG_SKIPPING_OPTION = CliOption(
-            "strongSkipping",
-            "<true|false>",
-            "Enable strong skipping mode. " +
-                "Deprecated. ${useFeatureFlagInsteadMessage(FeatureFlag.StrongSkipping)}",
-            required = false,
-            allowMultipleOccurrences = false
-        )
-        val EXPERIMENTAL_STRONG_SKIPPING_OPTION = CliOption(
-            "experimentalStrongSkipping",
-            "<true|false>",
-            "Deprecated. ${
+                required = false,
+                allowMultipleOccurrences = false
+            )
+        val SUPPRESS_KOTLIN_VERSION_CHECK_ENABLED_OPTION =
+            CliOption(
+                "suppressKotlinVersionCompatibilityCheck",
+                "<kotlin_version>",
+                "Suppress Kotlin version compatibility check",
+                required = false,
+                allowMultipleOccurrences = false
+            )
+        val DECOYS_ENABLED_OPTION =
+            CliOption(
+                "generateDecoys",
+                "<true|false>",
+                "Generate decoy methods in IR transform",
+                required = false,
+                allowMultipleOccurrences = false
+            )
+        val STRONG_SKIPPING_OPTION =
+            CliOption(
+                "strongSkipping",
+                "<true|false>",
+                "Enable strong skipping mode. " +
+                    "Deprecated. ${useFeatureFlagInsteadMessage(FeatureFlag.StrongSkipping)}",
+                required = false,
+                allowMultipleOccurrences = false
+            )
+        val EXPERIMENTAL_STRONG_SKIPPING_OPTION =
+            CliOption(
+                "experimentalStrongSkipping",
+                "<true|false>",
+                "Deprecated. ${
                 useFeatureFlagInsteadMessage(FeatureFlag.StrongSkipping)
             }",
-            required = false,
-            allowMultipleOccurrences = false
-        )
-        val STABLE_CONFIG_PATH_OPTION = CliOption(
-            "stabilityConfigurationPath",
-            "<path>",
-            "Path to stability configuration file",
-            required = false,
-            allowMultipleOccurrences = true
-        )
-        val TRACE_MARKERS_OPTION = CliOption(
-            "traceMarkersEnabled",
-            "<true|false>",
-            "Include composition trace markers in generate code",
-            required = false,
-            allowMultipleOccurrences = false
-        )
+                required = false,
+                allowMultipleOccurrences = false
+            )
+        val STABLE_CONFIG_PATH_OPTION =
+            CliOption(
+                "stabilityConfigurationPath",
+                "<path>",
+                "Path to stability configuration file",
+                required = false,
+                allowMultipleOccurrences = true
+            )
+        val TRACE_MARKERS_OPTION =
+            CliOption(
+                "traceMarkersEnabled",
+                "<true|false>",
+                "Include composition trace markers in generate code",
+                required = false,
+                allowMultipleOccurrences = false
+            )
     }
 
     override val pluginId = PLUGIN_ID
-    override val pluginOptions = listOf(
-        LIVE_LITERALS_ENABLED_OPTION,
-        LIVE_LITERALS_V2_ENABLED_OPTION,
-        GENERATE_FUNCTION_KEY_META_CLASSES_OPTION,
-        SOURCE_INFORMATION_ENABLED_OPTION,
-        METRICS_DESTINATION_OPTION,
-        REPORTS_DESTINATION_OPTION,
-        INTRINSIC_REMEMBER_OPTIMIZATION_ENABLED_OPTION,
-        NON_SKIPPING_GROUP_OPTIMIZATION_ENABLED_OPTION,
-        SUPPRESS_KOTLIN_VERSION_CHECK_ENABLED_OPTION,
-        DECOYS_ENABLED_OPTION,
-        EXPERIMENTAL_STRONG_SKIPPING_OPTION,
-        STRONG_SKIPPING_OPTION,
-        STABLE_CONFIG_PATH_OPTION,
-        TRACE_MARKERS_OPTION,
-        FEATURE_FLAG_OPTION,
-    )
+    override val pluginOptions =
+        listOf(
+            LIVE_LITERALS_ENABLED_OPTION,
+            LIVE_LITERALS_V2_ENABLED_OPTION,
+            GENERATE_FUNCTION_KEY_META_CLASSES_OPTION,
+            SOURCE_INFORMATION_ENABLED_OPTION,
+            METRICS_DESTINATION_OPTION,
+            REPORTS_DESTINATION_OPTION,
+            INTRINSIC_REMEMBER_OPTIMIZATION_ENABLED_OPTION,
+            NON_SKIPPING_GROUP_OPTIMIZATION_ENABLED_OPTION,
+            SUPPRESS_KOTLIN_VERSION_CHECK_ENABLED_OPTION,
+            DECOYS_ENABLED_OPTION,
+            EXPERIMENTAL_STRONG_SKIPPING_OPTION,
+            STRONG_SKIPPING_OPTION,
+            STABLE_CONFIG_PATH_OPTION,
+            TRACE_MARKERS_OPTION,
+            FEATURE_FLAG_OPTION,
+        )
 
     override fun processOption(
         option: AbstractCliOption,
         value: String,
         configuration: CompilerConfiguration
-    ) = when (option) {
-        LIVE_LITERALS_ENABLED_OPTION -> configuration.put(
-            ComposeConfiguration.LIVE_LITERALS_ENABLED_KEY,
-            value == "true"
-        )
-        LIVE_LITERALS_V2_ENABLED_OPTION -> configuration.put(
-            ComposeConfiguration.LIVE_LITERALS_V2_ENABLED_KEY,
-            value == "true"
-        )
-        GENERATE_FUNCTION_KEY_META_CLASSES_OPTION -> configuration.put(
-            ComposeConfiguration.GENERATE_FUNCTION_KEY_META_CLASSES_KEY,
-            value == "true"
-        )
-        SOURCE_INFORMATION_ENABLED_OPTION -> configuration.put(
-            ComposeConfiguration.SOURCE_INFORMATION_ENABLED_KEY,
-            value == "true"
-        )
-        METRICS_DESTINATION_OPTION -> configuration.put(
-            ComposeConfiguration.METRICS_DESTINATION_KEY,
-            value
-        )
-        REPORTS_DESTINATION_OPTION -> configuration.put(
-            ComposeConfiguration.REPORTS_DESTINATION_KEY,
-            value
-        )
-        INTRINSIC_REMEMBER_OPTIMIZATION_ENABLED_OPTION -> {
-            oldOptionDeprecationWarning(
-                configuration,
-                INTRINSIC_REMEMBER_OPTIMIZATION_ENABLED_OPTION,
-                FeatureFlag.IntrinsicRemember
-            )
-            configuration.put(
-                ComposeConfiguration.INTRINSIC_REMEMBER_OPTIMIZATION_ENABLED_KEY,
-                value == "true"
-            )
+    ) =
+        when (option) {
+            LIVE_LITERALS_ENABLED_OPTION ->
+                configuration.put(ComposeConfiguration.LIVE_LITERALS_ENABLED_KEY, value == "true")
+            LIVE_LITERALS_V2_ENABLED_OPTION ->
+                configuration.put(
+                    ComposeConfiguration.LIVE_LITERALS_V2_ENABLED_KEY,
+                    value == "true"
+                )
+            GENERATE_FUNCTION_KEY_META_CLASSES_OPTION ->
+                configuration.put(
+                    ComposeConfiguration.GENERATE_FUNCTION_KEY_META_CLASSES_KEY,
+                    value == "true"
+                )
+            SOURCE_INFORMATION_ENABLED_OPTION ->
+                configuration.put(
+                    ComposeConfiguration.SOURCE_INFORMATION_ENABLED_KEY,
+                    value == "true"
+                )
+            METRICS_DESTINATION_OPTION ->
+                configuration.put(ComposeConfiguration.METRICS_DESTINATION_KEY, value)
+            REPORTS_DESTINATION_OPTION ->
+                configuration.put(ComposeConfiguration.REPORTS_DESTINATION_KEY, value)
+            INTRINSIC_REMEMBER_OPTIMIZATION_ENABLED_OPTION -> {
+                oldOptionDeprecationWarning(
+                    configuration,
+                    INTRINSIC_REMEMBER_OPTIMIZATION_ENABLED_OPTION,
+                    FeatureFlag.IntrinsicRemember
+                )
+                configuration.put(
+                    ComposeConfiguration.INTRINSIC_REMEMBER_OPTIMIZATION_ENABLED_KEY,
+                    value == "true"
+                )
+            }
+            NON_SKIPPING_GROUP_OPTIMIZATION_ENABLED_OPTION -> {
+                oldOptionDeprecationWarning(
+                    configuration,
+                    NON_SKIPPING_GROUP_OPTIMIZATION_ENABLED_OPTION,
+                    FeatureFlag.OptimizeNonSkippingGroups
+                )
+                configuration.put(
+                    ComposeConfiguration.NON_SKIPPING_GROUP_OPTIMIZATION_ENABLED_KEY,
+                    value == "true"
+                )
+            }
+            SUPPRESS_KOTLIN_VERSION_CHECK_ENABLED_OPTION ->
+                configuration.put(
+                    ComposeConfiguration.SUPPRESS_KOTLIN_VERSION_COMPATIBILITY_CHECK,
+                    value
+                )
+            DECOYS_ENABLED_OPTION ->
+                configuration.put(ComposeConfiguration.DECOYS_ENABLED_KEY, value == "true")
+            EXPERIMENTAL_STRONG_SKIPPING_OPTION -> {
+                oldOptionDeprecationWarning(
+                    configuration,
+                    EXPERIMENTAL_STRONG_SKIPPING_OPTION,
+                    FeatureFlag.StrongSkipping
+                )
+                configuration.put(ComposeConfiguration.STRONG_SKIPPING_ENABLED_KEY, value == "true")
+            }
+            STRONG_SKIPPING_OPTION -> {
+                oldOptionDeprecationWarning(
+                    configuration,
+                    EXPERIMENTAL_STRONG_SKIPPING_OPTION,
+                    FeatureFlag.StrongSkipping
+                )
+                configuration.put(ComposeConfiguration.STRONG_SKIPPING_ENABLED_KEY, value == "true")
+            }
+            STABLE_CONFIG_PATH_OPTION ->
+                configuration.appendList(ComposeConfiguration.STABILITY_CONFIG_PATH_KEY, value)
+            TRACE_MARKERS_OPTION ->
+                configuration.put(ComposeConfiguration.TRACE_MARKERS_ENABLED_KEY, value == "true")
+            FEATURE_FLAG_OPTION -> {
+                validateFeatureFlag(configuration, value)
+                configuration.appendList(ComposeConfiguration.FEATURE_FLAGS, value)
+            }
+            else -> throw CliOptionProcessingException("Unknown option: ${option.optionName}")
         }
-        NON_SKIPPING_GROUP_OPTIMIZATION_ENABLED_OPTION -> {
-            oldOptionDeprecationWarning(
-                configuration,
-                NON_SKIPPING_GROUP_OPTIMIZATION_ENABLED_OPTION,
-                FeatureFlag.OptimizeNonSkippingGroups
-            )
-            configuration.put(
-                ComposeConfiguration.NON_SKIPPING_GROUP_OPTIMIZATION_ENABLED_KEY,
-                value == "true"
-            )
-        }
-        SUPPRESS_KOTLIN_VERSION_CHECK_ENABLED_OPTION -> configuration.put(
-            ComposeConfiguration.SUPPRESS_KOTLIN_VERSION_COMPATIBILITY_CHECK,
-            value
-        )
-        DECOYS_ENABLED_OPTION -> configuration.put(
-            ComposeConfiguration.DECOYS_ENABLED_KEY,
-            value == "true"
-        )
-        EXPERIMENTAL_STRONG_SKIPPING_OPTION -> {
-            oldOptionDeprecationWarning(
-                configuration,
-                EXPERIMENTAL_STRONG_SKIPPING_OPTION,
-                FeatureFlag.StrongSkipping
-            )
-            configuration.put(
-                ComposeConfiguration.STRONG_SKIPPING_ENABLED_KEY,
-                value == "true"
-            )
-        }
-        STRONG_SKIPPING_OPTION -> {
-            oldOptionDeprecationWarning(
-                configuration,
-                EXPERIMENTAL_STRONG_SKIPPING_OPTION,
-                FeatureFlag.StrongSkipping
-            )
-            configuration.put(
-                ComposeConfiguration.STRONG_SKIPPING_ENABLED_KEY,
-                value == "true"
-            )
-        }
-        STABLE_CONFIG_PATH_OPTION -> configuration.appendList(
-            ComposeConfiguration.STABILITY_CONFIG_PATH_KEY,
-            value
-        )
-        TRACE_MARKERS_OPTION -> configuration.put(
-            ComposeConfiguration.TRACE_MARKERS_ENABLED_KEY,
-            value == "true"
-        )
-        FEATURE_FLAG_OPTION -> {
-            validateFeatureFlag(configuration, value)
-            configuration.appendList(
-                ComposeConfiguration.FEATURE_FLAGS,
-                value
-            )
-        }
-        else -> throw CliOptionProcessingException("Unknown option: ${option.optionName}")
-    }
 }
 
 /**
@@ -338,30 +333,30 @@
  *
  * Features should be added to this list if they are intended to eventually become the default
  * behavior of the compiler. This is intended to allow progressive roll-out of a feature to
- * facilitate coordinating the runtime and compiler changes. New features should be disabled
- * by default until it is validated to be ready for production after testing with the corresponding
+ * facilitate coordinating the runtime and compiler changes. New features should be disabled by
+ * default until it is validated to be ready for production after testing with the corresponding
  * changes needed in the runtime. Using this technique does not remove the need to feature detect
  * for the version of runtime and is only intended to disable the feature even if the feature is
  * detected in the runtime.
  *
- * If a feature default is `true` the feature is reported as known by the command-line processor
- * but will generate a warning that the option is no longer necessary as it is the default. If
- * the feature is not in this list a warning is produced instead of an error to facilitate moving
+ * If a feature default is `true` the feature is reported as known by the command-line processor but
+ * will generate a warning that the option is no longer necessary as it is the default. If the
+ * feature is not in this list a warning is produced instead of an error to facilitate moving
  * compiler versions without having to always remove features unknown to older versions of the
  * plugin.
  *
  * A feature flag enum value can be used in the transformers that derive from
- * AbstractComposeLowering by using the FeatureFlag.enabled extension property. For example
- * testing if StrongSkipping is enabled can be checked by checking
+ * AbstractComposeLowering by using the FeatureFlag.enabled extension property. For example testing
+ * if StrongSkipping is enabled can be checked by checking
  *
- *   FeatureFlag.StrongSkipping.enabled
+ * FeatureFlag.StrongSkipping.enabled
  *
- * The `default` field is the source of truth for the default of the property. Turning it
- * to `true` here will make it default on even if the value was previous enabled through
- * a deprecated explicit option.
+ * The `default` field is the source of truth for the default of the property. Turning it to `true`
+ * here will make it default on even if the value was previous enabled through a deprecated explicit
+ * option.
  *
- * A feature can be explicitly disabled by prefixing the feature name with "-" even if
- * the feature is enabled by default.
+ * A feature can be explicitly disabled by prefixing the feature name with "-" even if the feature
+ * is enabled by default.
  *
  * @param featureName The name of the feature that is used with featureFlags to enable or disable
  *   the feature.
@@ -372,16 +367,19 @@
     IntrinsicRemember("IntrinsicRemember", default = true),
     OptimizeNonSkippingGroups("OptimizeNonSkippingGroups", default = false);
 
-    val disabledName get() = "-$featureName"
+    val disabledName
+        get() = "-$featureName"
+
     fun name(enabled: Boolean) = if (enabled) featureName else disabledName
 
     companion object {
         fun fromString(featureName: String): Pair<FeatureFlag?, Boolean> {
-            val (featureToSearch, enabled) = when {
-                featureName.startsWith("+") -> featureName.substring(1) to true
-                featureName.startsWith("-") -> featureName.substring(1) to false
-                else -> featureName to true
-            }
+            val (featureToSearch, enabled) =
+                when {
+                    featureName.startsWith("+") -> featureName.substring(1) to true
+                    featureName.startsWith("-") -> featureName.substring(1) to false
+                    else -> featureName to true
+                }
             return FeatureFlag.values().firstOrNull {
                 featureToSearch.trim().compareTo(it.featureName, ignoreCase = true) == 0
             } to enabled
@@ -422,8 +420,8 @@
         }
     }
 
-    fun isEnabled(feature: FeatureFlag) = feature in enabledFeatures || (feature.default &&
-        feature !in disabledFeatures)
+    fun isEnabled(feature: FeatureFlag) =
+        feature in enabledFeatures || (feature.default && feature !in disabledFeatures)
 
     private fun processConfigurationList(featuresNames: List<String>) {
         for (featureName in featuresNames) {
@@ -441,10 +439,7 @@
             fun report(feature: FeatureFlag, message: String) {
                 if (feature !in reported) {
                     reported.add(feature)
-                    msgCollector.report(
-                        CompilerMessageSeverity.WARNING,
-                        message
-                    )
+                    msgCollector.report(CompilerMessageSeverity.WARNING, message)
                 }
             }
             val configured = enabledFeatures + disabledFeatures
@@ -471,7 +466,7 @@
                     report(
                         feature,
                         "The feature ${featureFlagName()}=${feature.featureName} is disabled " +
-                        "by default and specifying this option explicitly is not necessary."
+                            "by default and specifying this option explicitly is not necessary."
                     )
                 }
             }
@@ -480,7 +475,7 @@
                     report(
                         feature,
                         "The feature ${featureFlagName()}=${feature.featureName} is enabled " +
-                        "by default and specifying this option explicitly is not necessary."
+                            "by default and specifying this option explicitly is not necessary."
                     )
                 }
             }
@@ -498,8 +493,8 @@
         ComposeCommandLineProcessor.FEATURE_FLAG_OPTION.optionName
     }"
 
-fun useFeatureFlagInsteadMessage(feature: FeatureFlag) = "Use " +
-    "${featureFlagName()}=${feature.featureName} instead"
+fun useFeatureFlagInsteadMessage(feature: FeatureFlag) =
+    "Use " + "${featureFlagName()}=${feature.featureName} instead"
 
 fun oldOptionDeprecationWarning(
     configuration: CompilerConfiguration,
@@ -513,10 +508,7 @@
     )
 }
 
-fun validateFeatureFlag(
-    configuration: CompilerConfiguration,
-    value: String
-) {
+fun validateFeatureFlag(configuration: CompilerConfiguration, value: String) {
     val (feature, enabled) = FeatureFlag.fromString(value)
     if (feature == null || (feature.default == enabled)) {
         val msgCollector = configuration.get(CLIConfigurationKeys.MESSAGE_COLLECTOR_KEY)
@@ -532,7 +524,7 @@
 }
 
 @Suppress("DEPRECATION") // CompilerPluginRegistrar does not expose project (or disposable) causing
-                         // memory leaks, see: https://youtrack.jetbrains.com/issue/KT-60952
+// memory leaks, see: https://youtrack.jetbrains.com/issue/KT-60952
 @OptIn(ExperimentalCompilerApi::class)
 class ComposePluginRegistrar : org.jetbrains.kotlin.compiler.plugin.ComponentRegistrar {
     override val supportsK2: Boolean
@@ -545,17 +537,13 @@
         if (checkCompilerVersion(configuration)) {
             val usesK2 = configuration.languageVersionSettings.languageVersion.usesK2
             val descriptorSerializerContext =
-                if (usesK2) null
-                else ComposeDescriptorSerializerContext()
+                if (usesK2) null else ComposeDescriptorSerializerContext()
 
             registerCommonExtensions(project, descriptorSerializerContext)
 
             IrGenerationExtension.registerExtension(
                 project,
-                createComposeIrExtension(
-                    configuration,
-                    descriptorSerializerContext
-                )
+                createComposeIrExtension(configuration, descriptorSerializerContext)
             )
 
             if (!usesK2) {
@@ -570,9 +558,10 @@
                 val KOTLIN_VERSION_EXPECTATION = "1.9.24"
                 KotlinCompilerVersion.getVersion()?.let { version ->
                     val msgCollector = configuration.get(CLIConfigurationKeys.MESSAGE_COLLECTOR_KEY)
-                    val suppressKotlinVersionCheck = configuration.get(
-                        ComposeConfiguration.SUPPRESS_KOTLIN_VERSION_COMPATIBILITY_CHECK
-                    )
+                    val suppressKotlinVersionCheck =
+                        configuration.get(
+                            ComposeConfiguration.SUPPRESS_KOTLIN_VERSION_COMPATIBILITY_CHECK
+                        )
 
                     val decoysEnabled =
                         configuration.get(ComposeConfiguration.DECOYS_ENABLED_KEY, false)
@@ -586,8 +575,7 @@
                     }
 
                     if (
-                        suppressKotlinVersionCheck != null &&
-                        suppressKotlinVersionCheck != version
+                        suppressKotlinVersionCheck != null && suppressKotlinVersionCheck != version
                     ) {
                         if (suppressKotlinVersionCheck == "true") {
                             msgCollector?.report(
@@ -616,9 +604,10 @@
                                 " no effect and should be removed."
                         )
                     }
-                    if (suppressKotlinVersionCheck != "true" &&
-                        version != KOTLIN_VERSION_EXPECTATION &&
-                        version != suppressKotlinVersionCheck
+                    if (
+                        suppressKotlinVersionCheck != "true" &&
+                            version != KOTLIN_VERSION_EXPECTATION &&
+                            version != suppressKotlinVersionCheck
                     ) {
                         msgCollector?.report(
                             CompilerMessageSeverity.ERROR,
@@ -658,10 +647,7 @@
             project: Project,
             composeDescriptorSerializerContext: ComposeDescriptorSerializerContext? = null
         ) {
-            StorageComponentContainerContributor.registerExtension(
-                project,
-                ComposableCallChecker()
-            )
+            StorageComponentContainerContributor.registerExtension(project, ComposableCallChecker())
             StorageComponentContainerContributor.registerExtension(
                 project,
                 ComposableDeclarationChecker()
@@ -702,61 +688,57 @@
             descriptorSerializerContext: ComposeDescriptorSerializerContext? = null,
             moduleMetricsFactory: ((StabilityInferencer) -> ModuleMetrics)? = null
         ): ComposeIrGenerationExtension {
-            val liveLiteralsEnabled = configuration.getBoolean(
-                ComposeConfiguration.LIVE_LITERALS_ENABLED_KEY,
-            )
-            val liveLiteralsV2Enabled = configuration.getBoolean(
-                ComposeConfiguration.LIVE_LITERALS_V2_ENABLED_KEY,
-            )
-            val generateFunctionKeyMetaClasses = configuration.getBoolean(
-                ComposeConfiguration.GENERATE_FUNCTION_KEY_META_CLASSES_KEY,
-            )
-            val sourceInformationEnabled = configuration.getBoolean(
-                ComposeConfiguration.SOURCE_INFORMATION_ENABLED_KEY,
-            )
-            val intrinsicRememberEnabled = configuration.get(
-                ComposeConfiguration.INTRINSIC_REMEMBER_OPTIMIZATION_ENABLED_KEY,
-                FeatureFlag.IntrinsicRemember.default
-            )
-            val nonSkippingGroupOptimizationEnabled = configuration.get(
-                ComposeConfiguration.NON_SKIPPING_GROUP_OPTIMIZATION_ENABLED_KEY,
-                FeatureFlag.OptimizeNonSkippingGroups.default
-            )
-            val decoysEnabled = configuration.getBoolean(
-                ComposeConfiguration.DECOYS_ENABLED_KEY,
-            )
-            val metricsDestination = configuration.get(
-                ComposeConfiguration.METRICS_DESTINATION_KEY,
-                ""
-            ).ifBlank { null }
-            val reportsDestination = configuration.get(
-                ComposeConfiguration.REPORTS_DESTINATION_KEY,
-                ""
-            ).ifBlank { null }
-            val validateIr = configuration.getBoolean(
-                JVMConfigurationKeys.VALIDATE_IR
-            )
+            val liveLiteralsEnabled =
+                configuration.getBoolean(
+                    ComposeConfiguration.LIVE_LITERALS_ENABLED_KEY,
+                )
+            val liveLiteralsV2Enabled =
+                configuration.getBoolean(
+                    ComposeConfiguration.LIVE_LITERALS_V2_ENABLED_KEY,
+                )
+            val generateFunctionKeyMetaClasses =
+                configuration.getBoolean(
+                    ComposeConfiguration.GENERATE_FUNCTION_KEY_META_CLASSES_KEY,
+                )
+            val sourceInformationEnabled =
+                configuration.getBoolean(
+                    ComposeConfiguration.SOURCE_INFORMATION_ENABLED_KEY,
+                )
+            val intrinsicRememberEnabled =
+                configuration.get(
+                    ComposeConfiguration.INTRINSIC_REMEMBER_OPTIMIZATION_ENABLED_KEY,
+                    FeatureFlag.IntrinsicRemember.default
+                )
+            val nonSkippingGroupOptimizationEnabled =
+                configuration.get(
+                    ComposeConfiguration.NON_SKIPPING_GROUP_OPTIMIZATION_ENABLED_KEY,
+                    FeatureFlag.OptimizeNonSkippingGroups.default
+                )
+            val decoysEnabled =
+                configuration.getBoolean(
+                    ComposeConfiguration.DECOYS_ENABLED_KEY,
+                )
+            val metricsDestination =
+                configuration.get(ComposeConfiguration.METRICS_DESTINATION_KEY, "").ifBlank { null }
+            val reportsDestination =
+                configuration.get(ComposeConfiguration.REPORTS_DESTINATION_KEY, "").ifBlank { null }
+            val validateIr = configuration.getBoolean(JVMConfigurationKeys.VALIDATE_IR)
 
             val useK2 = configuration.languageVersionSettings.languageVersion.usesK2
 
-            val strongSkippingEnabled = configuration.get(
-                ComposeConfiguration.STRONG_SKIPPING_ENABLED_KEY,
-                FeatureFlag.StrongSkipping.default
-            )
-
-            val stabilityConfigPaths = configuration.getList(
-                ComposeConfiguration.STABILITY_CONFIG_PATH_KEY
-            )
-            val traceMarkersEnabled = configuration.get(
-                ComposeConfiguration.TRACE_MARKERS_ENABLED_KEY,
-                true
-            )
-
-            val featureFlags = FeatureFlags(
+            val strongSkippingEnabled =
                 configuration.get(
-                    ComposeConfiguration.FEATURE_FLAGS, emptyList()
+                    ComposeConfiguration.STRONG_SKIPPING_ENABLED_KEY,
+                    FeatureFlag.StrongSkipping.default
                 )
-            )
+
+            val stabilityConfigPaths =
+                configuration.getList(ComposeConfiguration.STABILITY_CONFIG_PATH_KEY)
+            val traceMarkersEnabled =
+                configuration.get(ComposeConfiguration.TRACE_MARKERS_ENABLED_KEY, true)
+
+            val featureFlags =
+                FeatureFlags(configuration.get(ComposeConfiguration.FEATURE_FLAGS, emptyList()))
             featureFlags.validateFeatureFlags(configuration)
 
             // Compatibility with older features configuration options
@@ -773,20 +755,22 @@
             val stableTypeMatchers = mutableSetOf<FqNameMatcher>()
             for (i in stabilityConfigPaths.indices) {
                 val path = stabilityConfigPaths[i]
-                val matchers = try {
-                    StabilityConfigParser.fromFile(path).stableTypeMatchers
-                } catch (e: Exception) {
-                    msgCollector?.report(
-                        CompilerMessageSeverity.ERROR,
-                        e.message ?: "Error parsing stability configuration at $path"
-                    )
-                    emptySet()
-                }
+                val matchers =
+                    try {
+                        StabilityConfigParser.fromFile(path).stableTypeMatchers
+                    } catch (e: Exception) {
+                        msgCollector?.report(
+                            CompilerMessageSeverity.ERROR,
+                            e.message ?: "Error parsing stability configuration at $path"
+                        )
+                        emptySet()
+                    }
                 stableTypeMatchers.addAll(matchers)
             }
-            val testingMatchers = configuration.get(ComposeConfiguration.TEST_STABILITY_CONFIG_KEY)
-                ?.map { FqNameMatcher(it) }
-                ?: emptySet()
+            val testingMatchers =
+                configuration.get(ComposeConfiguration.TEST_STABILITY_CONFIG_KEY)?.map {
+                    FqNameMatcher(it)
+                } ?: emptySet()
             stableTypeMatchers.addAll(testingMatchers)
 
             return ComposeIrGenerationExtension(
diff --git a/compose/compiler/compiler-hosted/src/main/java/androidx/compose/compiler/plugins/kotlin/IrValidator.kt b/compose/compiler/compiler-hosted/src/main/java/androidx/compose/compiler/plugins/kotlin/IrValidator.kt
index 797c82d..21c640d 100644
--- a/compose/compiler/compiler-hosted/src/main/java/androidx/compose/compiler/plugins/kotlin/IrValidator.kt
+++ b/compose/compiler/compiler-hosted/src/main/java/androidx/compose/compiler/plugins/kotlin/IrValidator.kt
@@ -32,14 +32,16 @@
 import org.jetbrains.kotlin.ir.visitors.acceptVoid
 
 fun validateIr(fragment: IrModuleFragment, irBuiltIns: IrBuiltIns) {
-    val validatorConfig = IrValidatorConfig(
-        abortOnError = true,
-        ensureAllNodesAreDifferent = true,
-        checkTypes = false, // This should be enabled, the fact this doesn't work is a Compose bug.
-        checkDescriptors = false,
-        checkProperties = true,
-        checkScopes = false
-    )
+    val validatorConfig =
+        IrValidatorConfig(
+            abortOnError = true,
+            ensureAllNodesAreDifferent = true,
+            checkTypes =
+                false, // This should be enabled, the fact this doesn't work is a Compose bug.
+            checkDescriptors = false,
+            checkProperties = true,
+            checkScopes = false
+        )
     fragment.accept(IrValidator(irBuiltIns, validatorConfig), null)
     fragment.checkDeclarationParents()
 }
diff --git a/compose/compiler/compiler-hosted/src/main/java/androidx/compose/compiler/plugins/kotlin/JsonBuilder.kt b/compose/compiler/compiler-hosted/src/main/java/androidx/compose/compiler/plugins/kotlin/JsonBuilder.kt
index f0f20ce..7cf1c21 100644
--- a/compose/compiler/compiler-hosted/src/main/java/androidx/compose/compiler/plugins/kotlin/JsonBuilder.kt
+++ b/compose/compiler/compiler-hosted/src/main/java/androidx/compose/compiler/plugins/kotlin/JsonBuilder.kt
@@ -21,11 +21,11 @@
 import java.lang.Appendable
 
 /**
- * This class is a very rudimentary json serializer. It is not fully featured, and does not
- * properly handle escaping strings, among other things. This is being used because the actual
- * needs for json serialization we have are extremely minimal, and I don't want to introduce a
- * library dependency unnecessarily, however if we start serializing more objects into JSON we
- * should probably go down that path. Please use this class with caution.
+ * This class is a very rudimentary json serializer. It is not fully featured, and does not properly
+ * handle escaping strings, among other things. This is being used because the actual needs for json
+ * serialization we have are extremely minimal, and I don't want to introduce a library dependency
+ * unnecessarily, however if we start serializing more objects into JSON we should probably go down
+ * that path. Please use this class with caution.
  */
 class JsonBuilder(private val sb: Appendable, private val indent: Int = 0) {
     var hasEntry = false
@@ -44,12 +44,11 @@
         }
         hasEntry = true
     }
+
     fun entry(key: String, value: Int) = entryLiteral(key, "$value")
 
-    fun entry(key: String, fn: JsonBuilder.() -> Unit) = entryLiteral(
-        key,
-        buildString { JsonBuilder(this, indent + 1).with(fn) }
-    )
+    fun entry(key: String, fn: JsonBuilder.() -> Unit) =
+        entryLiteral(key, buildString { JsonBuilder(this, indent + 1).with(fn) })
 
     fun with(fn: JsonBuilder.() -> Unit) {
         with(sb) {
@@ -66,23 +65,30 @@
 }
 
 class CsvBuilder(private val writer: Appendable) {
-    fun row(fn: CsvBuilder.() -> Unit): Unit = with(writer) {
-        fn()
-        appendLine()
-    }
-    fun col(value: String): Unit = with(writer) {
-        require(!value.contains(',')) { "Illegal character ',' found: $value" }
-        append(value)
-        append(",")
-    }
-    fun col(value: Int): Unit = with(writer) {
-        append("$value")
-        append(",")
-    }
-    fun col(value: Boolean): Unit = with(writer) {
-        append(if (value) "1" else "0")
-        append(",")
-    }
+    fun row(fn: CsvBuilder.() -> Unit): Unit =
+        with(writer) {
+            fn()
+            appendLine()
+        }
+
+    fun col(value: String): Unit =
+        with(writer) {
+            require(!value.contains(',')) { "Illegal character ',' found: $value" }
+            append(value)
+            append(",")
+        }
+
+    fun col(value: Int): Unit =
+        with(writer) {
+            append("$value")
+            append(",")
+        }
+
+    fun col(value: Boolean): Unit =
+        with(writer) {
+            append(if (value) "1" else "0")
+            append(",")
+        }
 }
 
 fun File.write(fn: OutputStreamWriter.() -> Unit) {
@@ -90,9 +96,7 @@
         parentFile.mkdirs()
         createNewFile()
     }
-    writer().use {
-        it.fn()
-    }
+    writer().use { it.fn() }
 }
 
 fun Appendable.appendCsv(fn: CsvBuilder.() -> Unit) {
diff --git a/compose/compiler/compiler-hosted/src/main/java/androidx/compose/compiler/plugins/kotlin/VersionChecker.kt b/compose/compiler/compiler-hosted/src/main/java/androidx/compose/compiler/plugins/kotlin/VersionChecker.kt
index 0b4fc5f..846fbfe 100644
--- a/compose/compiler/compiler-hosted/src/main/java/androidx/compose/compiler/plugins/kotlin/VersionChecker.kt
+++ b/compose/compiler/compiler-hosted/src/main/java/androidx/compose/compiler/plugins/kotlin/VersionChecker.kt
@@ -26,121 +26,122 @@
 
     companion object {
         /**
-         * A table of runtime version ints to version strings for compose-runtime.
-         * This should be updated every time a new version of the Compose Runtime is released.
-         * Typically updated via update_versions_for_release.py
+         * A table of runtime version ints to version strings for compose-runtime. This should be
+         * updated every time a new version of the Compose Runtime is released. Typically updated
+         * via update_versions_for_release.py
          */
-        private val runtimeVersionToMavenVersionTable = mapOf(
-            1600 to "0.1.0-dev16",
-            1700 to "1.0.0-alpha06",
-            1800 to "1.0.0-alpha07",
-            1900 to "1.0.0-alpha08",
-            2000 to "1.0.0-alpha09",
-            2100 to "1.0.0-alpha10",
-            2200 to "1.0.0-alpha11",
-            2300 to "1.0.0-alpha12",
-            2400 to "1.0.0-alpha13",
-            2500 to "1.0.0-beta04",
-            2600 to "1.0.0-beta05",
-            2700 to "1.0.0-beta06",
-            2800 to "1.0.0-beta07",
-            2900 to "1.0.0-beta08",
-            3000 to "1.0.0-beta09",
-            3100 to "1.0.0-rc01",
-            3200 to "1.0.0-rc02",
-            3300 to "1.0.0",
-            3301 to "1.0.1",
-            3302 to "1.0.2",
-            3303 to "1.0.3",
-            3304 to "1.0.4",
-            3305 to "1.0.5",
-            4000 to "1.1.0-alpha01",
-            4100 to "1.1.0-alpha02",
-            4200 to "1.1.0-alpha03",
-            4300 to "1.1.0-alpha04",
-            4400 to "1.1.0-alpha05",
-            4500 to "1.1.0-alpha06",
-            4600 to "1.1.0-beta01",
-            4700 to "1.1.0-beta02",
-            4800 to "1.1.0-beta03",
-            4900 to "1.1.0-beta04",
-            5000 to "1.1.0-rc01",
-            5001 to "1.1.0-rc02",
-            5002 to "1.1.0-rc03",
-            5003 to "1.1.0",
-            5004 to "1.1.1",
-            6000 to "1.2.0-alpha01",
-            6100 to "1.2.0-alpha02",
-            6200 to "1.2.0-alpha03",
-            6300 to "1.2.0-alpha04",
-            6400 to "1.2.0-alpha05",
-            6500 to "1.2.0-alpha06",
-            6600 to "1.2.0-alpha07",
-            6700 to "1.2.0-alpha08",
-            6800 to "1.2.0-beta01",
-            6900 to "1.2.0-beta02",
-            7000 to "1.2.0-beta03",
-            7100 to "1.2.0-rc01",
-            7101 to "1.2.0-rc02",
-            7102 to "1.2.0-rc03",
-            7103 to "1.2.0",
-            7104 to "1.2.1",
-            7105 to "1.2.2",
-            8000 to "1.3.0-alpha01",
-            8100 to "1.3.0-alpha02",
-            8200 to "1.3.0-alpha03",
-            8300 to "1.3.0-beta01",
-            8400 to "1.3.0-beta02",
-            8500 to "1.3.0-beta03",
-            8600 to "1.3.0-rc01",
-            8601 to "1.3.0-rc02",
-            8602 to "1.3.0",
-            8603 to "1.3.1",
-            8604 to "1.3.2",
-            8605 to "1.3.3",
-            8606 to "1.3.4",
-            9000 to "1.4.0-alpha01",
-            9001 to "1.4.0-alpha02",
-            9100 to "1.4.0-alpha03",
-            9200 to "1.4.0-alpha04",
-            9300 to "1.4.0-alpha05",
-            9400 to "1.4.0-alpha06",
-            9500 to "1.4.0-beta01",
-            9600 to "1.4.0-beta02",
-            9700 to "1.4.0-rc01",
-            9701 to "1.4.0-rc02",
-            9701 to "1.5.0-alpha01",
-            9801 to "1.5.0-alpha02",
-            9901 to "1.5.0-alpha03",
-            10000 to "1.5.0-alpha04",
-            10100 to "1.5.0-alpha05",
-            10200 to "1.5.0-beta01",
-            10300 to "1.5.0-beta02",
-            10400 to "1.5.0-beta03",
-            10401 to "1.5.0-rc01",
-            10402 to "1.5.0",
-            10403 to "1.5.1",
-            11000 to "1.6.0-alpha01",
-            11100 to "1.6.0-alpha02",
-            11200 to "1.6.0-alpha03",
-            11300 to "1.6.0-alpha04",
-            11400 to "1.6.0-alpha05",
-            11500 to "1.6.0-alpha06",
-            11600 to "1.6.0-alpha07",
-            11700 to "1.6.0-alpha08",
-            11800 to "1.6.0-beta01",
-            12000 to "1.7.0-alpha01",
-            12100 to "1.7.0-alpha02",
-            12200 to "1.7.0-alpha03",
-            12300 to "1.7.0-alpha04",
-            12400 to "1.7.0-alpha05",
-            12500 to "1.7.0-alpha06",
-            12600 to "1.7.0-alpha07",
-            12700 to "1.7.0-alpha08",
-            12800 to "1.7.0-beta01",
-            12900 to "1.7.0-beta02",
-            13000 to "1.8.0-alpha01",
-        )
+        private val runtimeVersionToMavenVersionTable =
+            mapOf(
+                1600 to "0.1.0-dev16",
+                1700 to "1.0.0-alpha06",
+                1800 to "1.0.0-alpha07",
+                1900 to "1.0.0-alpha08",
+                2000 to "1.0.0-alpha09",
+                2100 to "1.0.0-alpha10",
+                2200 to "1.0.0-alpha11",
+                2300 to "1.0.0-alpha12",
+                2400 to "1.0.0-alpha13",
+                2500 to "1.0.0-beta04",
+                2600 to "1.0.0-beta05",
+                2700 to "1.0.0-beta06",
+                2800 to "1.0.0-beta07",
+                2900 to "1.0.0-beta08",
+                3000 to "1.0.0-beta09",
+                3100 to "1.0.0-rc01",
+                3200 to "1.0.0-rc02",
+                3300 to "1.0.0",
+                3301 to "1.0.1",
+                3302 to "1.0.2",
+                3303 to "1.0.3",
+                3304 to "1.0.4",
+                3305 to "1.0.5",
+                4000 to "1.1.0-alpha01",
+                4100 to "1.1.0-alpha02",
+                4200 to "1.1.0-alpha03",
+                4300 to "1.1.0-alpha04",
+                4400 to "1.1.0-alpha05",
+                4500 to "1.1.0-alpha06",
+                4600 to "1.1.0-beta01",
+                4700 to "1.1.0-beta02",
+                4800 to "1.1.0-beta03",
+                4900 to "1.1.0-beta04",
+                5000 to "1.1.0-rc01",
+                5001 to "1.1.0-rc02",
+                5002 to "1.1.0-rc03",
+                5003 to "1.1.0",
+                5004 to "1.1.1",
+                6000 to "1.2.0-alpha01",
+                6100 to "1.2.0-alpha02",
+                6200 to "1.2.0-alpha03",
+                6300 to "1.2.0-alpha04",
+                6400 to "1.2.0-alpha05",
+                6500 to "1.2.0-alpha06",
+                6600 to "1.2.0-alpha07",
+                6700 to "1.2.0-alpha08",
+                6800 to "1.2.0-beta01",
+                6900 to "1.2.0-beta02",
+                7000 to "1.2.0-beta03",
+                7100 to "1.2.0-rc01",
+                7101 to "1.2.0-rc02",
+                7102 to "1.2.0-rc03",
+                7103 to "1.2.0",
+                7104 to "1.2.1",
+                7105 to "1.2.2",
+                8000 to "1.3.0-alpha01",
+                8100 to "1.3.0-alpha02",
+                8200 to "1.3.0-alpha03",
+                8300 to "1.3.0-beta01",
+                8400 to "1.3.0-beta02",
+                8500 to "1.3.0-beta03",
+                8600 to "1.3.0-rc01",
+                8601 to "1.3.0-rc02",
+                8602 to "1.3.0",
+                8603 to "1.3.1",
+                8604 to "1.3.2",
+                8605 to "1.3.3",
+                8606 to "1.3.4",
+                9000 to "1.4.0-alpha01",
+                9001 to "1.4.0-alpha02",
+                9100 to "1.4.0-alpha03",
+                9200 to "1.4.0-alpha04",
+                9300 to "1.4.0-alpha05",
+                9400 to "1.4.0-alpha06",
+                9500 to "1.4.0-beta01",
+                9600 to "1.4.0-beta02",
+                9700 to "1.4.0-rc01",
+                9701 to "1.4.0-rc02",
+                9701 to "1.5.0-alpha01",
+                9801 to "1.5.0-alpha02",
+                9901 to "1.5.0-alpha03",
+                10000 to "1.5.0-alpha04",
+                10100 to "1.5.0-alpha05",
+                10200 to "1.5.0-beta01",
+                10300 to "1.5.0-beta02",
+                10400 to "1.5.0-beta03",
+                10401 to "1.5.0-rc01",
+                10402 to "1.5.0",
+                10403 to "1.5.1",
+                11000 to "1.6.0-alpha01",
+                11100 to "1.6.0-alpha02",
+                11200 to "1.6.0-alpha03",
+                11300 to "1.6.0-alpha04",
+                11400 to "1.6.0-alpha05",
+                11500 to "1.6.0-alpha06",
+                11600 to "1.6.0-alpha07",
+                11700 to "1.6.0-alpha08",
+                11800 to "1.6.0-beta01",
+                12000 to "1.7.0-alpha01",
+                12100 to "1.7.0-alpha02",
+                12200 to "1.7.0-alpha03",
+                12300 to "1.7.0-alpha04",
+                12400 to "1.7.0-alpha05",
+                12500 to "1.7.0-alpha06",
+                12600 to "1.7.0-alpha07",
+                12700 to "1.7.0-alpha08",
+                12800 to "1.7.0-beta01",
+                12900 to "1.7.0-beta02",
+                13000 to "1.8.0-alpha01",
+            )
 
         /**
          * The minimum version int that this compiler is guaranteed to be compatible with. Typically
@@ -149,8 +150,8 @@
         private const val minimumRuntimeVersionInt: Int = 3300
 
         /**
-         * The maven version string of this compiler. This string should be updated before/after every
-         * release.
+         * The maven version string of this compiler. This string should be updated before/after
+         * every release.
          */
         const val compilerVersion: String = "1.5.14"
         private val minimumRuntimeVersion: String
@@ -175,15 +176,13 @@
         // The check accesses bodies of the functions that are not deserialized in KLIB
         if (!context.platform.isJvm()) return
 
-        val versionExpr = versionClass
-            .owner
-            .declarations
-            .mapNotNull { it as? IrProperty }
-            .firstOrNull { it.name.asString() == "version" }
-            ?.backingField
-            ?.initializer
-            ?.expression
-            as? IrConst<*>
+        val versionExpr =
+            versionClass.owner.declarations
+                .mapNotNull { it as? IrProperty }
+                .firstOrNull { it.name.asString() == "version" }
+                ?.backingField
+                ?.initializer
+                ?.expression as? IrConst<*>
         if (versionExpr == null || versionExpr.kind != IrConstKind.Int) {
             outdatedRuntimeWithUnknownVersionNumber()
         }
@@ -200,7 +199,9 @@
                 The Compose Compiler requires the Compose Runtime to be on the class path, but
                 none could be found. The compose compiler plugin you are using (version
                 $compilerVersion) expects a minimum runtime version of $minimumRuntimeVersion.
-            """.trimIndent().replace('\n', ' ')
+            """
+                .trimIndent()
+                .replace('\n', ' ')
         )
     }
 
@@ -211,7 +212,9 @@
                 the version of the Compose Compiler plugin you have installed. The compose
                 compiler plugin you are using (version $compilerVersion) expects a minimum runtime
                 version of $minimumRuntimeVersion.
-            """.trimIndent().replace('\n', ' ')
+            """
+                .trimIndent()
+                .replace('\n', ' ')
         )
     }
 
@@ -223,7 +226,9 @@
                 compiler plugin you are using (version $compilerVersion) expects a minimum runtime
                 version of $minimumRuntimeVersion. The version of the runtime on the classpath
                 currently is $actualVersion.
-            """.trimIndent().replace('\n', ' ')
+            """
+                .trimIndent()
+                .replace('\n', ' ')
         )
     }
 }
diff --git a/compose/compiler/compiler-hosted/src/main/java/androidx/compose/compiler/plugins/kotlin/WeakBindingTrace.kt b/compose/compiler/compiler-hosted/src/main/java/androidx/compose/compiler/plugins/kotlin/WeakBindingTrace.kt
index bc0b920..6b6a8cb 100644
--- a/compose/compiler/compiler-hosted/src/main/java/androidx/compose/compiler/plugins/kotlin/WeakBindingTrace.kt
+++ b/compose/compiler/compiler-hosted/src/main/java/androidx/compose/compiler/plugins/kotlin/WeakBindingTrace.kt
@@ -24,10 +24,10 @@
 import org.jetbrains.kotlin.util.slicedMap.WritableSlice
 
 /**
- * This class is meant to have the shape of a BindingTrace object that could exist and flow
- * through the Psi2Ir -> Ir phase, but doesn't currently exist. Ideally, this gets replaced in
- * the future by a trace that handles this use case in upstream. For now, we are okay with this
- * because the combination of IrAttributeContainer and WeakHashMap makes this relatively safe.
+ * This class is meant to have the shape of a BindingTrace object that could exist and flow through
+ * the Psi2Ir -> Ir phase, but doesn't currently exist. Ideally, this gets replaced in the future by
+ * a trace that handles this use case in upstream. For now, we are okay with this because the
+ * combination of IrAttributeContainer and WeakHashMap makes this relatively safe.
  */
 class WeakBindingTrace {
     private val map = WeakHashMap<Any, KeyFMap>()
@@ -50,4 +50,5 @@
 private val ComposeTemporaryGlobalBindingTrace = WeakBindingTrace()
 
 @Suppress("unused")
-val IrPluginContext.irTrace: WeakBindingTrace get() = ComposeTemporaryGlobalBindingTrace
+val IrPluginContext.irTrace: WeakBindingTrace
+    get() = ComposeTemporaryGlobalBindingTrace
diff --git a/compose/compiler/compiler-hosted/src/main/java/androidx/compose/compiler/plugins/kotlin/analysis/KnownStableConstructs.kt b/compose/compiler/compiler-hosted/src/main/java/androidx/compose/compiler/plugins/kotlin/analysis/KnownStableConstructs.kt
index e28a628..df1b4a6 100644
--- a/compose/compiler/compiler-hosted/src/main/java/androidx/compose/compiler/plugins/kotlin/analysis/KnownStableConstructs.kt
+++ b/compose/compiler/compiler-hosted/src/main/java/androidx/compose/compiler/plugins/kotlin/analysis/KnownStableConstructs.kt
@@ -24,8 +24,8 @@
  *
  * For all of the functions and types listed in these collections, we associate them with a bitmask.
  * This mask corresponds to the bitmask returned by
- * [androidx.compose.compiler.plugins.kotlin.analysis.stabilityParamBitmask] for general classes.
- * It defines how the generic parameters of a class/function influence its stability.
+ * [androidx.compose.compiler.plugins.kotlin.analysis.stabilityParamBitmask] for general classes. It
+ * defines how the generic parameters of a class/function influence its stability.
  *
  * A bit set to `1` in this mask indicates that the construct cannot be considered stable unless the
  * generic type at that position is also a stable type. If a bit is set to `0`, it indicates that
@@ -37,50 +37,52 @@
  */
 object KnownStableConstructs {
 
-    val stableTypes = mapOf(
-        Pair::class.qualifiedName!! to 0b11,
-        Triple::class.qualifiedName!! to 0b111,
-        Comparator::class.qualifiedName!! to 0,
-        Result::class.qualifiedName!! to 0b1,
-        ClosedRange::class.qualifiedName!! to 0b1,
-        ClosedFloatingPointRange::class.qualifiedName!! to 0b1,
-        // Guava
-        "com.google.common.collect.ImmutableList" to 0b1,
-        "com.google.common.collect.ImmutableEnumMap" to 0b11,
-        "com.google.common.collect.ImmutableMap" to 0b11,
-        "com.google.common.collect.ImmutableEnumSet" to 0b1,
-        "com.google.common.collect.ImmutableSet" to 0b1,
-        // Kotlinx immutable
-        "kotlinx.collections.immutable.ImmutableCollection" to 0b1,
-        "kotlinx.collections.immutable.ImmutableList" to 0b1,
-        "kotlinx.collections.immutable.ImmutableSet" to 0b1,
-        "kotlinx.collections.immutable.ImmutableMap" to 0b11,
-        "kotlinx.collections.immutable.PersistentCollection" to 0b1,
-        "kotlinx.collections.immutable.PersistentList" to 0b1,
-        "kotlinx.collections.immutable.PersistentSet" to 0b1,
-        "kotlinx.collections.immutable.PersistentMap" to 0b11,
-        // Dagger
-        "dagger.Lazy" to 0b1,
-        // Coroutines
-        EmptyCoroutineContext::class.qualifiedName!! to 0,
-    )
+    val stableTypes =
+        mapOf(
+            Pair::class.qualifiedName!! to 0b11,
+            Triple::class.qualifiedName!! to 0b111,
+            Comparator::class.qualifiedName!! to 0,
+            Result::class.qualifiedName!! to 0b1,
+            ClosedRange::class.qualifiedName!! to 0b1,
+            ClosedFloatingPointRange::class.qualifiedName!! to 0b1,
+            // Guava
+            "com.google.common.collect.ImmutableList" to 0b1,
+            "com.google.common.collect.ImmutableEnumMap" to 0b11,
+            "com.google.common.collect.ImmutableMap" to 0b11,
+            "com.google.common.collect.ImmutableEnumSet" to 0b1,
+            "com.google.common.collect.ImmutableSet" to 0b1,
+            // Kotlinx immutable
+            "kotlinx.collections.immutable.ImmutableCollection" to 0b1,
+            "kotlinx.collections.immutable.ImmutableList" to 0b1,
+            "kotlinx.collections.immutable.ImmutableSet" to 0b1,
+            "kotlinx.collections.immutable.ImmutableMap" to 0b11,
+            "kotlinx.collections.immutable.PersistentCollection" to 0b1,
+            "kotlinx.collections.immutable.PersistentList" to 0b1,
+            "kotlinx.collections.immutable.PersistentSet" to 0b1,
+            "kotlinx.collections.immutable.PersistentMap" to 0b11,
+            // Dagger
+            "dagger.Lazy" to 0b1,
+            // Coroutines
+            EmptyCoroutineContext::class.qualifiedName!! to 0,
+        )
 
     // TODO: buildList, buildMap, buildSet, etc.
-    val stableFunctions = mapOf(
-        "kotlin.collections.emptyList" to 0,
-        "kotlin.collections.listOf" to 0b1,
-        "kotlin.collections.listOfNotNull" to 0b1,
-        "kotlin.collections.mapOf" to 0b11,
-        "kotlin.collections.emptyMap" to 0,
-        "kotlin.collections.setOf" to 0b1,
-        "kotlin.collections.emptySet" to 0,
-        "kotlin.to" to 0b11,
-        // Kotlinx immutable
-        "kotlinx.collections.immutable.immutableListOf" to 0b1,
-        "kotlinx.collections.immutable.immutableSetOf" to 0b1,
-        "kotlinx.collections.immutable.immutableMapOf" to 0b11,
-        "kotlinx.collections.immutable.persistentListOf" to 0b1,
-        "kotlinx.collections.immutable.persistentSetOf" to 0b1,
-        "kotlinx.collections.immutable.persistentMapOf" to 0b11,
-    )
+    val stableFunctions =
+        mapOf(
+            "kotlin.collections.emptyList" to 0,
+            "kotlin.collections.listOf" to 0b1,
+            "kotlin.collections.listOfNotNull" to 0b1,
+            "kotlin.collections.mapOf" to 0b11,
+            "kotlin.collections.emptyMap" to 0,
+            "kotlin.collections.setOf" to 0b1,
+            "kotlin.collections.emptySet" to 0,
+            "kotlin.to" to 0b11,
+            // Kotlinx immutable
+            "kotlinx.collections.immutable.immutableListOf" to 0b1,
+            "kotlinx.collections.immutable.immutableSetOf" to 0b1,
+            "kotlinx.collections.immutable.immutableMapOf" to 0b11,
+            "kotlinx.collections.immutable.persistentListOf" to 0b1,
+            "kotlinx.collections.immutable.persistentSetOf" to 0b1,
+            "kotlinx.collections.immutable.persistentMapOf" to 0b11,
+        )
 }
diff --git a/compose/compiler/compiler-hosted/src/main/java/androidx/compose/compiler/plugins/kotlin/analysis/Stability.kt b/compose/compiler/compiler-hosted/src/main/java/androidx/compose/compiler/plugins/kotlin/analysis/Stability.kt
index ba9179e..d40e82e 100644
--- a/compose/compiler/compiler-hosted/src/main/java/androidx/compose/compiler/plugins/kotlin/analysis/Stability.kt
+++ b/compose/compiler/compiler-hosted/src/main/java/androidx/compose/compiler/plugins/kotlin/analysis/Stability.kt
@@ -107,11 +107,12 @@
         }
     }
 
-    operator fun plus(other: Stability): Stability = when {
-        other is Certain -> if (other.stable) this else other
-        this is Certain -> if (stable) other else this
-        else -> Combined(listOf(this, other))
-    }
+    operator fun plus(other: Stability): Stability =
+        when {
+            other is Certain -> if (other.stable) this else other
+            this is Certain -> if (stable) other else this
+            else -> Combined(listOf(this, other))
+        }
 
     operator fun plus(other: List<Stability>): Stability {
         var stability = this
@@ -127,37 +128,41 @@
     }
 }
 
-fun Stability.knownUnstable(): Boolean = when (this) {
-    is Stability.Certain -> !stable
-    is Stability.Runtime -> false
-    is Stability.Unknown -> false
-    is Stability.Parameter -> false
-    is Stability.Combined -> elements.any { it.knownUnstable() }
-}
+fun Stability.knownUnstable(): Boolean =
+    when (this) {
+        is Stability.Certain -> !stable
+        is Stability.Runtime -> false
+        is Stability.Unknown -> false
+        is Stability.Parameter -> false
+        is Stability.Combined -> elements.any { it.knownUnstable() }
+    }
 
-fun Stability.knownStable(): Boolean = when (this) {
-    is Stability.Certain -> stable
-    is Stability.Runtime -> false
-    is Stability.Unknown -> false
-    is Stability.Parameter -> false
-    is Stability.Combined -> elements.all { it.knownStable() }
-}
+fun Stability.knownStable(): Boolean =
+    when (this) {
+        is Stability.Certain -> stable
+        is Stability.Runtime -> false
+        is Stability.Unknown -> false
+        is Stability.Parameter -> false
+        is Stability.Combined -> elements.all { it.knownStable() }
+    }
 
-fun Stability.isUncertain(): Boolean = when (this) {
-    is Stability.Certain -> false
-    is Stability.Runtime -> true
-    is Stability.Unknown -> true
-    is Stability.Parameter -> true
-    is Stability.Combined -> elements.any { it.isUncertain() }
-}
+fun Stability.isUncertain(): Boolean =
+    when (this) {
+        is Stability.Certain -> false
+        is Stability.Runtime -> true
+        is Stability.Unknown -> true
+        is Stability.Parameter -> true
+        is Stability.Combined -> elements.any { it.isUncertain() }
+    }
 
-fun Stability.isExpressible(): Boolean = when (this) {
-    is Stability.Certain -> true
-    is Stability.Runtime -> true
-    is Stability.Unknown -> false
-    is Stability.Parameter -> true
-    is Stability.Combined -> elements.all { it.isExpressible() }
-}
+fun Stability.isExpressible(): Boolean =
+    when (this) {
+        is Stability.Certain -> true
+        is Stability.Runtime -> true
+        is Stability.Unknown -> false
+        is Stability.Parameter -> true
+        is Stability.Combined -> elements.all { it.isExpressible() }
+    }
 
 fun Stability.normalize(): Stability {
     when (this) {
@@ -166,7 +171,6 @@
         is Stability.Parameter,
         is Stability.Runtime,
         is Stability.Unknown -> return this
-
         is Stability.Combined -> {
             // if combined, we perform the more expensive normalization process
         }
@@ -179,19 +183,15 @@
             is Stability.Combined -> {
                 stack.addAll(stability.elements)
             }
-
             is Stability.Certain -> {
-                if (!stability.stable)
-                    return Stability.Unstable
+                if (!stability.stable) return Stability.Unstable
             }
-
             is Stability.Parameter -> {
                 if (stability.parameter.symbol !in parameters) {
                     parameters.add(stability.parameter.symbol)
                     parts.add(stability)
                 }
             }
-
             is Stability.Runtime -> parts.add(stability)
             is Stability.Unknown -> {
                 /* do nothing */
@@ -209,8 +209,7 @@
     }
 }
 
-fun IrAnnotationContainer.hasStableMarker(): Boolean =
-    annotations.any { it.isStableMarker() }
+fun IrAnnotationContainer.hasStableMarker(): Boolean = annotations.any { it.isStableMarker() }
 
 private fun IrConstructorCall.isStableMarker(): Boolean =
     annotationClass?.owner?.hasAnnotation(ComposeFqNames.StableMarker) == true
@@ -223,9 +222,9 @@
 }
 
 private fun IrAnnotationContainer.stabilityParamBitmask(): Int? =
-    (annotations.findAnnotation(ComposeFqNames.StabilityInferred)
-        ?.getValueArgument(0) as? IrConst<*>
-        )?.value as? Int
+    (annotations.findAnnotation(ComposeFqNames.StabilityInferred)?.getValueArgument(0)
+            as? IrConst<*>)
+        ?.value as? Int
 
 private data class SymbolForAnalysis(
     val symbol: IrClassifierSymbol,
@@ -238,8 +237,7 @@
 ) {
     private val externalTypeMatcherCollection = FqNameMatcherCollection(externalStableTypeMatchers)
 
-    fun stabilityOf(irType: IrType): Stability =
-        stabilityOf(irType, emptyMap(), emptySet())
+    fun stabilityOf(irType: IrType): Stability = stabilityOf(irType, emptyMap(), emptySet())
 
     private fun stabilityOf(
         declaration: IrClass,
@@ -271,8 +269,8 @@
                 mask = KnownStableConstructs.stableTypes[fqName] ?: 0
                 stability = Stability.Stable
             } else if (declaration.isExternalStableType()) {
-                mask = externalTypeMatcherCollection
-                    .maskForName(declaration.fqNameWhenAvailable) ?: 0
+                mask =
+                    externalTypeMatcherCollection.maskForName(declaration.fqNameWhenAvailable) ?: 0
                 stability = Stability.Stable
             } else {
                 val bitmask = declaration.stabilityParamBitmask() ?: return Stability.Unstable
@@ -284,26 +282,27 @@
 
                 // supporting incremental compilation, where declaration stubs can be
                 // in the same module, so we need to use already inferred values
-                stability = if (isKnownStable && declaration.isInCurrentModule()) {
-                    Stability.Stable
-                } else {
-                    Stability.Runtime(declaration)
-                }
+                stability =
+                    if (isKnownStable && declaration.isInCurrentModule()) {
+                        Stability.Stable
+                    } else {
+                        Stability.Runtime(declaration)
+                    }
             }
             return when {
                 mask == 0 || typeParameters.isEmpty() -> stability
-                else -> stability + Stability.Combined(
-                    typeParameters.mapIndexedNotNull { index, irTypeParameter ->
-                        if (index >= 32) return@mapIndexedNotNull null
-                        if (mask and (0b1 shl index) != 0) {
-                            val sub = substitutions[irTypeParameter.symbol]
-                            if (sub != null)
-                                stabilityOf(sub, substitutions, analyzing)
-                            else
-                                Stability.Parameter(irTypeParameter)
-                        } else null
-                    }
-                )
+                else ->
+                    stability +
+                        Stability.Combined(
+                            typeParameters.mapIndexedNotNull { index, irTypeParameter ->
+                                if (index >= 32) return@mapIndexedNotNull null
+                                if (mask and (0b1 shl index) != 0) {
+                                    val sub = substitutions[irTypeParameter.symbol]
+                                    if (sub != null) stabilityOf(sub, substitutions, analyzing)
+                                    else Stability.Parameter(irTypeParameter)
+                                } else null
+                            }
+                        )
             }
         } else if (declaration.origin == IrDeclarationOrigin.IR_EXTERNAL_JAVA_DECLARATION_STUB) {
             return Stability.Unstable
@@ -323,7 +322,6 @@
                         stability += stabilityOf(it.type, substitutions, analyzing)
                     }
                 }
-
                 is IrField -> {
                     stability += stabilityOf(member.type, substitutions, analyzing)
                 }
@@ -334,15 +332,18 @@
     }
 
     @OptIn(ObsoleteDescriptorBasedAPI::class)
-    private fun IrDeclaration.isInCurrentModule() =
-        module == currentModule
+    private fun IrDeclaration.isInCurrentModule() = module == currentModule
 
     private fun IrClass.isProtobufType(): Boolean {
         // Quick exit as all protos are final
         if (!isFinalClass) return false
         val directParentClassName =
-            superTypes.lastOrNull { !it.isInterface() }
-                ?.classOrNull?.owner?.fqNameWhenAvailable?.toString()
+            superTypes
+                .lastOrNull { !it.isInterface() }
+                ?.classOrNull
+                ?.owner
+                ?.fqNameWhenAvailable
+                ?.toString()
         return directParentClassName == "com.google.protobuf.GeneratedMessageLite" ||
             directParentClassName == "com.google.protobuf.GeneratedMessage"
     }
@@ -391,33 +392,24 @@
         return when {
             type is IrErrorType -> Stability.Unstable
             type is IrDynamicType -> Stability.Unstable
-
             type.isUnit() ||
                 type.isPrimitiveType() ||
                 type.isFunctionOrKFunction() ||
                 type.isSyntheticComposableFunction() ||
                 type.isString() -> Stability.Stable
-
             type.isTypeParameter() -> {
                 val arg = substitutions[type.classifierOrNull as IrTypeParameterSymbol]
                 if (arg != null) {
                     stabilityOf(arg, substitutions, currentlyAnalyzing)
                 } else {
-                    Stability.Parameter(
-                        type.classifierOrFail.owner as IrTypeParameter
-                    )
+                    Stability.Parameter(type.classifierOrFail.owner as IrTypeParameter)
                 }
             }
-
-            type.isNullable() -> stabilityOf(
-                type.makeNotNull(),
-                substitutions,
-                currentlyAnalyzing
-            )
-
+            type.isNullable() -> stabilityOf(type.makeNotNull(), substitutions, currentlyAnalyzing)
             type.isInlineClassType() -> {
-                val inlineClassDeclaration = type.getClass()
-                    ?: error("Failed to resolve the class definition of inline type $type")
+                val inlineClassDeclaration =
+                    type.getClass()
+                        ?: error("Failed to resolve the class definition of inline type $type")
 
                 if (inlineClassDeclaration.hasStableMarker()) {
                     Stability.Stable
@@ -429,7 +421,6 @@
                     )
                 }
             }
-
             type is IrSimpleType -> {
                 stabilityOf(
                     type.classifier,
@@ -437,13 +428,11 @@
                     currentlyAnalyzing
                 )
             }
-
             type is IrTypeAbbreviation -> {
                 val aliased = type.typeAlias.owner.expandedType
                 // TODO(lmr): figure out how type.arguments plays in here
                 stabilityOf(aliased, substitutions, currentlyAnalyzing)
             }
-
             else -> error("Unexpected IrType: $type")
         }
     }
@@ -452,9 +441,10 @@
         val cls = classOrNull ?: return emptyMap()
         val params = cls.owner.typeParameters.map { it.symbol }
         val args = arguments
-        return params.zip(args).filter { (param, arg) ->
-            param != (arg as? IrSimpleType)?.classifier
-        }.toMap()
+        return params
+            .zip(args)
+            .filter { (param, arg) -> param != (arg as? IrSimpleType)?.classifier }
+            .toMap()
     }
 
     private fun stabilityOf(expr: IrCall, baseStability: Stability): Stability {
@@ -464,17 +454,15 @@
         return when (val mask = KnownStableConstructs.stableFunctions[fqName.asString()]) {
             null -> baseStability
             0 -> Stability.Stable
-            else -> Stability.Combined(
-                (0 until expr.typeArgumentsCount).mapNotNull { index ->
-                    if (mask and (0b1 shl index) != 0) {
-                        val sub = expr.getTypeArgument(index)
-                        if (sub != null)
-                            stabilityOf(sub)
-                        else
-                            Stability.Unstable
-                    } else null
-                }
-            )
+            else ->
+                Stability.Combined(
+                    (0 until expr.typeArgumentsCount).mapNotNull { index ->
+                        if (mask and (0b1 shl index) != 0) {
+                            val sub = expr.getTypeArgument(index)
+                            if (sub != null) stabilityOf(sub) else Stability.Unstable
+                        } else null
+                    }
+                )
         }
     }
 
@@ -493,7 +481,6 @@
                     stability
                 }
             }
-
             is IrLocalDelegatedPropertyReference -> Stability.Stable
             // some default parameters and consts can be wrapped in composite
             is IrComposite -> {
@@ -503,7 +490,6 @@
                     stability
                 }
             }
-
             else -> stability
         }
     }
diff --git a/compose/compiler/compiler-hosted/src/main/java/androidx/compose/compiler/plugins/kotlin/analysis/StabilityConfigParser.kt b/compose/compiler/compiler-hosted/src/main/java/androidx/compose/compiler/plugins/kotlin/analysis/StabilityConfigParser.kt
index e8d4a2a..71778fb 100644
--- a/compose/compiler/compiler-hosted/src/main/java/androidx/compose/compiler/plugins/kotlin/analysis/StabilityConfigParser.kt
+++ b/compose/compiler/compiler-hosted/src/main/java/androidx/compose/compiler/plugins/kotlin/analysis/StabilityConfigParser.kt
@@ -37,9 +37,7 @@
 
 private const val COMMENT_DELIMITER = "//"
 
-private class StabilityConfigParserImpl(
-    lines: List<String>
-) : StabilityConfigParser {
+private class StabilityConfigParserImpl(lines: List<String>) : StabilityConfigParser {
     override val stableTypeMatchers: Set<FqNameMatcher>
 
     init {
@@ -60,9 +58,7 @@
                 try {
                     matchers.add(FqNameMatcher(l))
                 } catch (exception: IllegalStateException) {
-                    error(
-                        errorMessage(line, index, exception.message ?: "")
-                    )
+                    error(errorMessage(line, index, exception.message ?: ""))
                 }
             }
         }
@@ -75,6 +71,7 @@
             Error parsing stability configuration file on line $lineNumber.
             $message
             $line
-        """.trimIndent()
+        """
+            .trimIndent()
     }
 }
diff --git a/compose/compiler/compiler-hosted/src/main/java/androidx/compose/compiler/plugins/kotlin/analysis/StabilityExternalClassNameMatching.kt b/compose/compiler/compiler-hosted/src/main/java/androidx/compose/compiler/plugins/kotlin/analysis/StabilityExternalClassNameMatching.kt
index 6c1ca64..8b50e1f 100644
--- a/compose/compiler/compiler-hosted/src/main/java/androidx/compose/compiler/plugins/kotlin/analysis/StabilityExternalClassNameMatching.kt
+++ b/compose/compiler/compiler-hosted/src/main/java/androidx/compose/compiler/plugins/kotlin/analysis/StabilityExternalClassNameMatching.kt
@@ -28,6 +28,7 @@
 internal const val STABILITY_GENERIC_EXCLUDE = "_"
 internal const val STABILITY_GENERIC_SEPARATOR = ","
 internal const val STABILITY_PACKAGE_SEPARATOR = '.'
+
 class FqNameMatcherCollection(private val matchers: Set<FqNameMatcher>) {
     // Cache of external types already matched
     private val externalTypesMatched: MutableMap<FqName, Boolean> = mutableMapOf()
@@ -53,21 +54,18 @@
 
         val superTypeNames = superTypes.mapNotNull { it.classFqName }
         return (matcherTree.findFirstPositiveMatcher(name) != null ||
-            superTypeNames.any { superName ->
-                matcherTree.findFirstPositiveMatcher(superName) != null
-            })
-            .also {
-                externalTypesMatched[name] = it
-            }
+                superTypeNames.any { superName ->
+                    matcherTree.findFirstPositiveMatcher(superName) != null
+                })
+            .also { externalTypesMatched[name] = it }
     }
 }
 
 /**
- * A tree of matchers for faster lookup.
- * The tree is structured around package segments. e.g. com.google.foo = com -> google -> foo
- * Because multiple matchers could match the same fqName due to wildcards, matchers are
- * stored in the tree at the point of their first wildcard. In the case of no wildcards,
- * matchers are stored at the end of the branch.
+ * A tree of matchers for faster lookup. The tree is structured around package segments. e.g.
+ * com.google.foo = com -> google -> foo Because multiple matchers could match the same fqName due
+ * to wildcards, matchers are stored in the tree at the point of their first wildcard. In the case
+ * of no wildcards, matchers are stored at the end of the branch.
  */
 private class MutableMatcherTree {
     private val root = Node()
@@ -115,20 +113,16 @@
 }
 
 class FqNameMatcher(val pattern: String) {
-    /**
-     * A key for storing this matcher.
-     */
+    /** A key for storing this matcher. */
     val key: String
-    /**
-     * Mask for generic type inclusion in stability calculation
-     */
+    /** Mask for generic type inclusion in stability calculation */
     val mask: Int
 
     private val regex: Regex?
 
     init {
-        val matchResult = validPatternMatcher.matchEntire(pattern)
-            ?: error("$pattern is not a valid pattern")
+        val matchResult =
+            validPatternMatcher.matchEntire(pattern) ?: error("$pattern is not a valid pattern")
 
         val regexPatternBuilder = StringBuilder()
         val keyBuilder = StringBuilder()
@@ -142,7 +136,7 @@
                     hasWildcard = true
                     if (pattern.getOrNull(index + 1) == STABILITY_WILDCARD_SINGLE) {
                         regexPatternBuilder.append(PATTERN_MULTI_WILD)
-                        index ++ // Skip a char to take the multi
+                        index++ // Skip a char to take the multi
                     } else {
                         regexPatternBuilder.append(PATTERN_SINGLE_WILD)
                     }
@@ -171,27 +165,27 @@
 
         // Pre-alloc regex for pattern having a wildcard at the end of the string
         // because it should be common.
-        regex = if (regexPatternBuilder.isNotEmpty()) {
-            when (val regexPattern = regexPatternBuilder.toString()) {
-                singleWildcardSuffix.pattern -> singleWildcardSuffix
-                multiWildcardSuffix.pattern -> multiWildcardSuffix
-                else -> Regex(regexPattern)
+        regex =
+            if (regexPatternBuilder.isNotEmpty()) {
+                when (val regexPattern = regexPatternBuilder.toString()) {
+                    singleWildcardSuffix.pattern -> singleWildcardSuffix
+                    multiWildcardSuffix.pattern -> multiWildcardSuffix
+                    else -> Regex(regexPattern)
+                }
+            } else {
+                null
             }
-        } else {
-            null
-        }
 
         val genericMask = matchResult.groups["genericmask"]
         if (genericMask == null) {
             key = keyBuilder.toString()
             mask = 0.inv()
         } else {
-            mask = genericMask.value
-                .split(STABILITY_GENERIC_SEPARATOR)
-                .map { if (it == STABILITY_GENERIC_INCLUDE) 1 else 0 }
-                .reduceIndexed { i, acc, flag ->
-                    acc or (flag shl i)
-                }
+            mask =
+                genericMask.value
+                    .split(STABILITY_GENERIC_SEPARATOR)
+                    .map { if (it == STABILITY_GENERIC_INCLUDE) 1 else 0 }
+                    .reduceIndexed { i, acc, flag -> acc or (flag shl i) }
 
             key = keyBuilder.subSequence(0, genericMask.range.first - 1).toString()
         }
@@ -223,8 +217,10 @@
         private const val PATTERN_PACKAGE_SEGMENT = "\\."
 
         private val validPatternMatcher =
-            Regex("((\\w+\\*{0,2}|\\*{1,2})\\.)*" +
-                "((\\w+(<?(?<genericmask>([*|_],)*[*|_])>)+)|(\\w+\\*{0,2}|\\*{1,2}))")
+            Regex(
+                "((\\w+\\*{0,2}|\\*{1,2})\\.)*" +
+                    "((\\w+(<?(?<genericmask>([*|_],)*[*|_])>)+)|(\\w+\\*{0,2}|\\*{1,2}))"
+            )
         private val singleWildcardSuffix = Regex(PATTERN_SINGLE_WILD)
         private val multiWildcardSuffix = Regex(PATTERN_MULTI_WILD)
     }
diff --git a/compose/compiler/compiler-hosted/src/main/java/androidx/compose/compiler/plugins/kotlin/inference/ApplierInferencer.kt b/compose/compiler/compiler-hosted/src/main/java/androidx/compose/compiler/plugins/kotlin/inference/ApplierInferencer.kt
index 4253afb..ffd113c 100644
--- a/compose/compiler/compiler-hosted/src/main/java/androidx/compose/compiler/plugins/kotlin/inference/ApplierInferencer.kt
+++ b/compose/compiler/compiler-hosted/src/main/java/androidx/compose/compiler/plugins/kotlin/inference/ApplierInferencer.kt
@@ -16,34 +16,26 @@
 
 package androidx.compose.compiler.plugins.kotlin.inference
 
-/**
- * An adapter that allows [ApplierInferencer] to determine the declared scheme for a type.
- */
+/** An adapter that allows [ApplierInferencer] to determine the declared scheme for a type. */
 interface TypeAdapter<Type> {
-    /**
-     * Given a type, return the declared scheme for the type.
-     */
+    /** Given a type, return the declared scheme for the type. */
     fun declaredSchemaOf(type: Type): Scheme
 
     /**
-     * Given a type, return the last updated scheme. This is used to reduce the number of times
-     * that [updatedInferredScheme] is called. Returning `null` will prevent
-     * [updatedInferredScheme] from being called at all (for example, from the front-end which
-     * ignores updates). If not caching to prevent [updatedInferredScheme] from being called too
-     * often, return [declaredSchemaOf] instead. This will then call [updatedInferredScheme]
-     * whenever it is different from what was declared.
+     * Given a type, return the last updated scheme. This is used to reduce the number of times that
+     * [updatedInferredScheme] is called. Returning `null` will prevent [updatedInferredScheme] from
+     * being called at all (for example, from the front-end which ignores updates). If not caching
+     * to prevent [updatedInferredScheme] from being called too often, return [declaredSchemaOf]
+     * instead. This will then call [updatedInferredScheme] whenever it is different from what was
+     * declared.
      */
     fun currentInferredSchemeOf(type: Type): Scheme?
 
-    /**
-     * Called when the inferencer determines
-     */
+    /** Called when the inferencer determines */
     fun updatedInferredScheme(type: Type, scheme: Scheme)
 }
 
-/**
- * The kind of node tells the inferencer how treat the node.
- */
+/** The kind of node tells the inferencer how treat the node. */
 enum class NodeKind {
     // The node is a function declaration
     Function,
@@ -61,9 +53,7 @@
     Expression,
 }
 
-/**
- * An adapter that allows getting information about a node.
- */
+/** An adapter that allows getting information about a node. */
 interface NodeAdapter<Type, Node> {
     /**
      * Return the container of the node. A container is the function or lambda the node is part of.
@@ -76,8 +66,8 @@
     fun kindOf(node: Node): NodeKind
 
     /**
-     * Return which parameter index this parameter references. The [node] passed in will only be
-     * one for [kindOf] returns [NodeKind.ParameterReference].
+     * Return which parameter index this parameter references. The [node] passed in will only be one
+     * for [kindOf] returns [NodeKind.ParameterReference].
      *
      * For parameter nodes the inferencer needs to determine which parameter of the scheme of the
      * node is being referenced to allow the scheme determined for the usage of the parameter to
@@ -99,41 +89,34 @@
 }
 
 /**
- * An adapter that can be used to adjust where temporary information about function types are stored.
+ * An adapter that can be used to adjust where temporary information about function types are
+ * stored.
  */
 interface LazySchemeStorage<Node> {
-    /**
-     * Retrieve a lazy scheme from the store (such as a mutableMapOf<Node, LazyScheme>().
-     */
+    /** Retrieve a lazy scheme from the store (such as a mutableMapOf<Node, LazyScheme>(). */
     fun getLazyScheme(node: Node): LazyScheme?
 
-    /**
-     * Store the lazy scheme [value] for [node].
-     */
+    /** Store the lazy scheme [value] for [node]. */
     fun storeLazyScheme(node: Node, value: LazyScheme)
 }
 
 private inline fun <Node> LazySchemeStorage<Node>.getOrPut(
     node: Node,
     value: () -> LazyScheme
-): LazyScheme = getLazyScheme(node) ?: run {
-    val result = value()
-    storeLazyScheme(node, result)
-    result
-}
+): LazyScheme =
+    getLazyScheme(node)
+        ?: run {
+            val result = value()
+            storeLazyScheme(node, result)
+            result
+        }
 
-/**
- * An adapter that is used to report errors detected during applier inference.
- */
+/** An adapter that is used to report errors detected during applier inference. */
 interface ErrorReporter<Node> {
-    /**
-     * Report a call node applier is not correct.
-     */
+    /** Report a call node applier is not correct. */
     fun reportCallError(node: Node, expected: String, received: String)
 
-    /**
-     * Report that the value or lambda passed to a parameter to a call was not correct.
-     */
+    /** Report that the value or lambda passed to a parameter to a call was not correct. */
     fun reportParameterError(node: Node, index: Int, expected: String, received: String)
 
     /**
@@ -145,20 +128,20 @@
 }
 
 /**
- * The applier inference. This class can infer the token of the applier from the information
- * passed to [visitCall] and [visitVariable] given the adapters provided in the constructor.
+ * The applier inference. This class can infer the token of the applier from the information passed
+ * to [visitCall] and [visitVariable] given the adapters provided in the constructor.
  *
  * The inferencer uses [unification][https://en.wikipedia.org/wiki/Unification_(computer_science)]
  * to infer the applier token similar to how type inference uses unification to infer types in a
  * functional programming language (e.g. ML or Haskell).
  *
  * Only calls and variables are required as operators and property references can be treated as
- * calls (as Kotlin does). Control flow (other than the functions and calls themselves) are not
- * used to determine the applier as the applier can only be supplied as a parameter to a call and
- * cannot be influenced by control-flow other than a call. The inferencer does not need to be
- * informed about control-flow directly, just the informed of the variables and calls they
- * contain. If necessary, even control flow can be reduced to function calls (such as is done in
- * lambda calculus) but, this is not necessary for Kotlin.
+ * calls (as Kotlin does). Control flow (other than the functions and calls themselves) are not used
+ * to determine the applier as the applier can only be supplied as a parameter to a call and cannot
+ * be influenced by control-flow other than a call. The inferencer does not need to be informed
+ * about control-flow directly, just the informed of the variables and calls they contain. If
+ * necessary, even control flow can be reduced to function calls (such as is done in lambda
+ * calculus) but, this is not necessary for Kotlin.
  *
  * [ApplierInferencer] is open to allow it to infer appliers using either the front-end AST or
  * back-end IR nodes as well as allows for easier testing and debugging of the itself algorithm
@@ -221,15 +204,16 @@
         )
 
     // Produce a token that can be used in error messages.
-    private val Binding.safeToken: String get() = token ?: "unbound"
+    private val Binding.safeToken: String
+        get() = token ?: "unbound"
 
     /**
      * Perform structural unification of two call bindings. All bindings that are in the same
      * structural place must unify or there is an error in the source. That is the targets are
-     * unified and the parameter call bindings are unified recursively as well as the call
-     * binding of the result. If [call] is `null` then the error is reported by the caller
-     * instead. For example, failing to unify the parameters of a call binding should be
-     * considered a failure to unify the entire binding not just the parameter.
+     * unified and the parameter call bindings are unified recursively as well as the call binding
+     * of the result. If [call] is `null` then the error is reported by the caller instead. For
+     * example, failing to unify the parameters of a call binding should be considered a failure to
+     * unify the entire binding not just the parameter.
      */
     private fun Bindings.unify(call: Node?, a: CallBindings, b: CallBindings): Boolean {
         if (!unify(a.target, b.target)) {
@@ -241,11 +225,11 @@
             return false
         }
 
-        val count = if (a.parameters.size != b.parameters.size) {
-            if (call != null)
-                errorReporter.log(call, "Type disagreement $a <=> $b")
-            if (a.parameters.size > b.parameters.size) b.parameters.size else a.parameters.size
-        } else a.parameters.size
+        val count =
+            if (a.parameters.size != b.parameters.size) {
+                if (call != null) errorReporter.log(call, "Type disagreement $a <=> $b")
+                if (a.parameters.size > b.parameters.size) b.parameters.size else a.parameters.size
+            } else a.parameters.size
 
         for (i in 0 until count) {
             val ap = a.parameters[i]
@@ -278,17 +262,13 @@
     }
 
     /**
-     * Restart [block] if a [LazyScheme] used to produce a [CallBindings] changes. This also
-     * informs the [TypeAdapter] when the inferencer infers a refinement of the scheme for the type
-     * of the container of [node].
+     * Restart [block] if a [LazyScheme] used to produce a [CallBindings] changes. This also informs
+     * the [TypeAdapter] when the inferencer infers a refinement of the scheme for the type of the
+     * container of [node].
      */
     private fun restartable(
         node: Node,
-        block: (
-            Bindings,
-            Binding,
-            (Node) -> CallBindings?
-        ) -> Unit
+        block: (Bindings, Binding, (Node) -> CallBindings?) -> Unit
     ): Boolean {
         if (node in inProgress) return false
         inProgress.add(node)
@@ -300,7 +280,7 @@
                 if (lazyScheme.bindings != bindings && !lazyScheme.closed) {
                     // This scheme might change as more calls are processed so observe the changes
                     // that could cause this call's result to change
-                    var remove = { }
+                    var remove = {}
                     val result: () -> Unit = {
                         if (node !in inProgress) {
                             remove()
@@ -313,8 +293,7 @@
                 return lazyScheme
             }
 
-            fun schemeOf(node: Node): Scheme =
-                observed(node.toLazyScheme()).toScheme()
+            fun schemeOf(node: Node): Scheme = observed(node.toLazyScheme()).toScheme()
 
             fun callBindingsOf(node: Node): CallBindings? {
                 return when (nodeAdapter.kindOf(node)) {
@@ -327,15 +306,16 @@
                             nodeAdapter.schemeParameterIndexOf(node, parameterContainer)
                         if (
                             parameterContainerScheme !in
-                            parameterContainerLazyScheme.parameters.indices
+                                parameterContainerLazyScheme.parameters.indices
                         ) {
                             return null
                         }
-                        parameterContainerLazyScheme
-                            .parameters[parameterContainerScheme]
+                        parameterContainerLazyScheme.parameters[parameterContainerScheme]
                             .toCallBindings()
                     }
-                    NodeKind.Lambda, NodeKind.Variable, NodeKind.Expression ->
+                    NodeKind.Lambda,
+                    NodeKind.Variable,
+                    NodeKind.Expression ->
                         // Lambdas, variables and expression all bind in the current
                         // binding context. That is, all uses of these nodes must agree on
                         // a token scheme.
@@ -370,9 +350,7 @@
         return true
     }
 
-    /**
-     * Infer the scheme of the variable from the scheme of the initializer.
-     */
+    /** Infer the scheme of the variable from the scheme of the initializer. */
     fun visitVariable(variable: Node, initializer: Node) =
         restartable(variable) { bindings, _, callBindingsOf ->
             val initializerBinding = callBindingsOf(initializer) ?: return@restartable
@@ -390,10 +368,12 @@
     fun visitCall(call: Node, target: Node, arguments: List<Node>) =
         restartable(call) { bindings, currentApplier, callBindingsOf ->
             // Produce the call bindings implied by the target of the call.
-            val targetCallBindings = callBindingsOf(target) ?: run {
-                errorReporter.log(call, "Cannot find target")
-                return@restartable
-            }
+            val targetCallBindings =
+                callBindingsOf(target)
+                    ?: run {
+                        errorReporter.log(call, "Cannot find target")
+                        return@restartable
+                    }
 
             // Produce the call bindings implied by the call and its arguments
             val parameters = arguments.map { callBindingsOf(it) }
@@ -402,16 +382,18 @@
                 return@restartable
             }
 
-            val result = if (targetCallBindings.result != null) {
-                callBindingsOf(call)
-            } else null
+            val result =
+                if (targetCallBindings.result != null) {
+                    callBindingsOf(call)
+                } else null
 
-            val callBinding = CallBindings(
-                currentApplier,
-                parameters = parameters.filterNotNull(),
-                result,
-                anyParameters = false
-            )
+            val callBinding =
+                CallBindings(
+                    currentApplier,
+                    parameters = parameters.filterNotNull(),
+                    result,
+                    anyParameters = false
+                )
 
             // Unify the call bindings. They should unify to the same bindings or there is an
             // error in the source.
@@ -438,7 +420,7 @@
             for ((parameterBinding, argument) in callBinding.parameters.zip(arguments)) {
                 if (
                     nodeAdapter.kindOf(argument) == NodeKind.Lambda &&
-                    parameterBinding.target.token != null
+                        parameterBinding.target.token != null
                 ) {
                     val lambdaScheme = argument.toLazyScheme()
                     if (lambdaScheme.target.token == null) {
@@ -448,8 +430,6 @@
             }
         }
 
-    /**
-     * For testing, produce the scheme inferred or the scheme from the declaration.
-     */
+    /** For testing, produce the scheme inferred or the scheme from the declaration. */
     fun toFinalScheme(node: Node) = node.toLazyScheme().toScheme()
 }
diff --git a/compose/compiler/compiler-hosted/src/main/java/androidx/compose/compiler/plugins/kotlin/inference/Bindings.kt b/compose/compiler/compiler-hosted/src/main/java/androidx/compose/compiler/plugins/kotlin/inference/Bindings.kt
index 3214bf8..12d276e 100644
--- a/compose/compiler/compiler-hosted/src/main/java/androidx/compose/compiler/plugins/kotlin/inference/Bindings.kt
+++ b/compose/compiler/compiler-hosted/src/main/java/androidx/compose/compiler/plugins/kotlin/inference/Bindings.kt
@@ -30,8 +30,8 @@
 
 /**
  * A binding that is either closed (with a non-null [token]) or open. Unified bindings are linked
- * together in a circular list by [Bindings]. All linked bindings are all closed simultaneously
- * when anyone of them is unified to a closed binding.
+ * together in a circular list by [Bindings]. All linked bindings are all closed simultaneously when
+ * anyone of them is unified to a closed binding.
  *
  * @param token the applier token the binding is bound to if it is closed.
  */
@@ -39,18 +39,19 @@
     /**
      * The token that is bound to this binding. If [token] is null then the binding is still open.
      */
-    val token: String? get() = value.token
+    val token: String?
+        get() = value.token
 
     /**
-     * The value of the binding. All linked bindings share the same value which also maintains
-     * the count of linked bindings.
+     * The value of the binding. All linked bindings share the same value which also maintains the
+     * count of linked bindings.
      */
     var value: Value = Value(token, observers)
 
     /**
      * The linked list next pointer. The list is circular an always non-empty as a binding will
-     * always at least contain itself in its own list. All linked [Binding] are in the same
-     * circular list. Open bindings that are unified together are linked.
+     * always at least contain itself in its own list. All linked [Binding] are in the same circular
+     * list. Open bindings that are unified together are linked.
      */
     var next = this
 
@@ -64,38 +65,30 @@
  * either bound to an applier token or it is open. All open bindings of the same value are linked
  * together in a circular list. When variables from different groups are unified, their lists are
  * merged and they are all given the lower of the two group's value. Bindings of different values
- * with the same token are considered unified but there is no need to link them as neither will
- * ever change.
+ * with the same token are considered unified but there is no need to link them as neither will ever
+ * change.
  */
 class Bindings {
     private val listeners = mutableListOf<() -> Unit>()
 
-    /**
-     * Create a fresh open applier binding variable
-     */
+    /** Create a fresh open applier binding variable */
     fun open() = Binding(observers = setOf(this))
 
-    /**
-     * Create a closed applier binding variable
-     */
+    /** Create a closed applier binding variable */
     fun closed(target: String) = Binding(token = target, emptySet())
 
-    /**
-     * Listen for when a unification closed a binding or bound two binding groups together.
-     */
+    /** Listen for when a unification closed a binding or bound two binding groups together. */
     fun onChange(callback: () -> Unit): () -> Unit {
         listeners.add(callback)
-        return {
-            listeners.remove(callback)
-        }
+        return { listeners.remove(callback) }
     }
 
     /**
      * Unify a and b; returns true if the unification succeeded. If both a and b are unbound they
-     * will be bound together and will simultaneously be bound if either is later bound. If only
-     * one is bound the other will be bound to the bound token. If a and b are bound already,
-     * unify() returns true if they are bound to the same token or false if they are not. Binding
-     * two open bindings that are already bound together is a noop and succeeds.
+     * will be bound together and will simultaneously be bound if either is later bound. If only one
+     * is bound the other will be bound to the bound token. If a and b are bound already, unify()
+     * returns true if they are bound to the same token or false if they are not. Binding two open
+     * bindings that are already bound together is a noop and succeeds.
      *
      * @param a an applier binding variable
      * @param b an applier binding variable
@@ -175,8 +168,7 @@
     private fun changed() {
         if (listeners.isNotEmpty()) {
             // Enumerate a copy of the list to allow listeners to delete themselves from the list.
-            for (listener in listeners.toMutableList())
-                listener()
+            for (listener in listeners.toMutableList()) listener()
         }
     }
 }
diff --git a/compose/compiler/compiler-hosted/src/main/java/androidx/compose/compiler/plugins/kotlin/inference/CallBindings.kt b/compose/compiler/compiler-hosted/src/main/java/androidx/compose/compiler/plugins/kotlin/inference/CallBindings.kt
index f0c20a1..a571287 100644
--- a/compose/compiler/compiler-hosted/src/main/java/androidx/compose/compiler/plugins/kotlin/inference/CallBindings.kt
+++ b/compose/compiler/compiler-hosted/src/main/java/androidx/compose/compiler/plugins/kotlin/inference/CallBindings.kt
@@ -31,7 +31,10 @@
     val anyParameters: Boolean
 ) {
     override fun toString(): String {
-        val paramsString = if (parameters.isEmpty()) "" else ", ${
+        val paramsString =
+            if (parameters.isEmpty()) ""
+            else
+                ", ${
             parameters.joinToString(", ") { it.toString() }
         }"
         val anyParametersStr = if (anyParameters) "*" else ""
diff --git a/compose/compiler/compiler-hosted/src/main/java/androidx/compose/compiler/plugins/kotlin/inference/LazyScheme.kt b/compose/compiler/compiler-hosted/src/main/java/androidx/compose/compiler/plugins/kotlin/inference/LazyScheme.kt
index 8d447d8..70b9342 100644
--- a/compose/compiler/compiler-hosted/src/main/java/androidx/compose/compiler/plugins/kotlin/inference/LazyScheme.kt
+++ b/compose/compiler/compiler-hosted/src/main/java/androidx/compose/compiler/plugins/kotlin/inference/LazyScheme.kt
@@ -31,12 +31,13 @@
     val anyParameters = scheme.anyParameters
     val parameters = scheme.parameters.map { LazyScheme(it, context, bindings) }
     val result = scheme.result?.let { LazyScheme(it, context, bindings) }
-    val closed: Boolean get() = target.token != null &&
-        (result == null || result.closed) && parameters.all { it.closed }
+    val closed: Boolean
+        get() =
+            target.token != null &&
+                (result == null || result.closed) &&
+                parameters.all { it.closed }
 
-    /**
-     * Create a [Scheme] from the current state of this.
-     */
+    /** Create a [Scheme] from the current state of this. */
     fun toScheme(): Scheme {
         val context: MutableMap<Value, Int> = mutableMapOf()
         var uniqueNumber = 0
@@ -54,14 +55,15 @@
             scheme.parameters.forEach { mapValues(it) }
             scheme.result?.let { mapValues(it) }
         }
-        fun itemOf(binding: Binding) = binding.token?.let { Token(it) }
-            ?: context[binding.value]?.let { Open(it) } ?: Open(-1)
-        fun schemeOf(lazyScheme: LazyScheme): Scheme = Scheme(
-            itemOf(lazyScheme.target),
-            lazyScheme.parameters.map { schemeOf(it) },
-            lazyScheme.result?.let { schemeOf(it) },
-            lazyScheme.anyParameters
-        )
+        fun itemOf(binding: Binding) =
+            binding.token?.let { Token(it) } ?: context[binding.value]?.let { Open(it) } ?: Open(-1)
+        fun schemeOf(lazyScheme: LazyScheme): Scheme =
+            Scheme(
+                itemOf(lazyScheme.target),
+                lazyScheme.parameters.map { schemeOf(it) },
+                lazyScheme.result?.let { schemeOf(it) },
+                lazyScheme.anyParameters
+            )
         mapValues(this)
         return schemeOf(this)
     }
@@ -69,16 +71,15 @@
     /**
      * Create a call binding for use when validating a call to the function this lazy scheme is for.
      */
-    fun toCallBindings(): CallBindings = CallBindings(
-        target,
-        parameters.map { it.toCallBindings() },
-        result = result?.toCallBindings(),
-        anyParameters
-    )
+    fun toCallBindings(): CallBindings =
+        CallBindings(
+            target,
+            parameters.map { it.toCallBindings() },
+            result = result?.toCallBindings(),
+            anyParameters
+        )
 
-    /**
-     * Call [callback] whenever the lazy changes.
-     */
+    /** Call [callback] whenever the lazy changes. */
     fun onChange(callback: () -> Unit): () -> Unit {
         var previousScheme = toScheme()
         return bindings.onChange {
@@ -90,26 +91,19 @@
         }
     }
 
-    override fun toString(): String =
-        "[$targetStr$parametersStr$resultStr]"
+    override fun toString(): String = "[$targetStr$parametersStr$resultStr]"
 
-    private val targetStr get() =
-        target.token ?: target.value.index.toString()
+    private val targetStr
+        get() = target.token ?: target.value.index.toString()
 
-    private val parametersStr get() =
-        if (parameters.isNotEmpty()) ", ${parameters.joinToString(", ")}"
-        else ""
+    private val parametersStr
+        get() = if (parameters.isNotEmpty()) ", ${parameters.joinToString(", ")}" else ""
 
-    private val resultStr get() = result?.let { ":$it" } ?: ""
+    private val resultStr
+        get() = result?.let { ":$it" } ?: ""
 
     companion object {
-        fun open() = Open(-1).let { target ->
-            LazyScheme(
-                Scheme(
-                    target = target,
-                    result = Scheme(target)
-                )
-            )
-        }
+        fun open() =
+            Open(-1).let { target -> LazyScheme(Scheme(target = target, result = Scheme(target))) }
     }
 }
diff --git a/compose/compiler/compiler-hosted/src/main/java/androidx/compose/compiler/plugins/kotlin/inference/Scheme.kt b/compose/compiler/compiler-hosted/src/main/java/androidx/compose/compiler/plugins/kotlin/inference/Scheme.kt
index 5c4bf94..edf8d38 100644
--- a/compose/compiler/compiler-hosted/src/main/java/androidx/compose/compiler/plugins/kotlin/inference/Scheme.kt
+++ b/compose/compiler/compiler-hosted/src/main/java/androidx/compose/compiler/plugins/kotlin/inference/Scheme.kt
@@ -18,36 +18,45 @@
 
 import java.lang.NumberFormatException
 
-/**
- * A part of a [Scheme].
- */
+/** A part of a [Scheme]. */
 sealed class Item {
     internal abstract val isAnonymous: Boolean
-    internal open val isUnspecified: Boolean get() = false
+    internal open val isUnspecified: Boolean
+        get() = false
+
     internal abstract fun toBinding(bindings: Bindings, context: MutableList<Binding>): Binding
+
     internal abstract fun serializeTo(writer: SchemeStringSerializationWriter)
 }
 
-/**
- * A bound part of a [Scheme] that is bound to [value].
- */
+/** A bound part of a [Scheme] that is bound to [value]. */
 class Token(val value: String) : Item() {
-    override val isAnonymous: Boolean get() = false
+    override val isAnonymous: Boolean
+        get() = false
+
     override fun toBinding(bindings: Bindings, context: MutableList<Binding>): Binding =
         bindings.closed(value)
+
     override fun toString() = value
+
     override fun equals(other: Any?) = other is Token && other.value == value
+
     override fun hashCode(): Int = value.hashCode() * 31
-    override fun serializeTo(writer: SchemeStringSerializationWriter) { writer.writeToken(value) }
+
+    override fun serializeTo(writer: SchemeStringSerializationWriter) {
+        writer.writeToken(value)
+    }
 }
 
 /**
  * An open part of a [Scheme]. All [Open] items with the same non-negative index should be bound
- * together to the  same applier. [Open] items with a negative index are considered anonymous and
- * are treated as independent.
+ * together to the same applier. [Open] items with a negative index are considered anonymous and are
+ * treated as independent.
  */
 class Open(val index: Int, override val isUnspecified: Boolean = false) : Item() {
-    override val isAnonymous: Boolean get() = index < 0
+    override val isAnonymous: Boolean
+        get() = index < 0
+
     override fun toBinding(bindings: Bindings, context: MutableList<Binding>): Binding {
         if (index < 0) return bindings.open()
         while (index >= context.size) {
@@ -57,23 +66,28 @@
     }
 
     override fun toString() = if (index < 0) "_" else "$index"
+
     override fun equals(other: Any?) =
         other is Open && (other.index == index || (other.index < 0 && index < 0))
+
     override fun hashCode(): Int = if (index < 0) -31 else index * 31
-    override fun serializeTo(writer: SchemeStringSerializationWriter) { writer.writeNumber(index) }
+
+    override fun serializeTo(writer: SchemeStringSerializationWriter) {
+        writer.writeNumber(index)
+    }
 }
 
 /**
- * A [Scheme] declares the applier the type expects and which appliers are expected of the
- * lambda parameters of a function or bound callable types of a generic type. The applier can be
- * open but all open appliers of the same non-negative index must be bound to the same applier.
+ * A [Scheme] declares the applier the type expects and which appliers are expected of the lambda
+ * parameters of a function or bound callable types of a generic type. The applier can be open but
+ * all open appliers of the same non-negative index must be bound to the same applier.
  *
- * All non-composable lambda parameters of a function type are ignored and skipped when producing
- * or interpreting a scheme. Also if the result is not a composable lambda the result is `null`.
- * This is because inference is only inferring what applier is being used by the `$composer`
- * passed as a parameter of a function. Note that a lambda that captures a `$composer` in context
- * (such as the lambda passed to [forEach] in a composable function) has a scheme as if the
- * `$composer` captured was passed in as a parameter just like it was a composable lambda.
+ * All non-composable lambda parameters of a function type are ignored and skipped when producing or
+ * interpreting a scheme. Also if the result is not a composable lambda the result is `null`. This
+ * is because inference is only inferring what applier is being used by the `$composer` passed as a
+ * parameter of a function. Note that a lambda that captures a `$composer` in context (such as the
+ * lambda passed to [forEach] in a composable function) has a scheme as if the `$composer` captured
+ * was passed in as a parameter just like it was a composable lambda.
  */
 class Scheme(
     val target: Item,
@@ -95,17 +109,18 @@
 
     override fun toString(): String = "[$target$parametersStr$resultStr]"
 
-    private val parametersStr get() =
-        if (parameters.isEmpty()) ""
-        else ", ${parameters.joinToString(", ") { it.toString() }}"
+    private val parametersStr
+        get() =
+            if (parameters.isEmpty()) "" else ", ${parameters.joinToString(", ") { it.toString() }}"
 
-    private val resultStr get() = result?.let { ": $it" } ?: ""
+    private val resultStr
+        get() = result?.let { ": $it" } ?: ""
 
     /**
      * Compare to [Scheme] instances for equality. Two [Scheme]s are considered equal if they are
-     * [alpha equivalent][https://en.wikipedia.org/wiki/Lambda_calculus#%CE%B1-conversion]. This
-     * is accomplished by normalizing both schemes and then comparing them simply for equality.
-     * See [alphaRename] for details.
+     * [alpha equivalent][https://en.wikipedia.org/wiki/Lambda_calculus#%CE%B1-conversion]. This is
+     * accomplished by normalizing both schemes and then comparing them simply for equality. See
+     * [alphaRename] for details.
      */
     override fun equals(other: Any?): Boolean {
         val o = other as? Scheme ?: return false
@@ -121,22 +136,22 @@
             target is Open && other.target.index == target.index
         } else {
             target.isUnspecified || target == other.target
-        } && parameters.zip(other.parameters).all { (a, b) -> a.simpleCanOverride(b) } &&
-            (
-                result == other.result ||
-                    (other.result != null && result != null && result.canOverride((other.result)))
-            )
+        } &&
+            parameters.zip(other.parameters).all { (a, b) -> a.simpleCanOverride(b) } &&
+            (result == other.result ||
+                (other.result != null && result != null && result.canOverride((other.result))))
     }
 
     private fun simpleEquals(other: Scheme) =
-        target == other.target && parameters.zip(other.parameters).all { (a, b) -> a == b } &&
+        target == other.target &&
+            parameters.zip(other.parameters).all { (a, b) -> a == b } &&
             result == result
 
     private fun simpleHashCode(): Int =
         target.hashCode() * 31 + parameters.hashOfElements() + (result?.hashCode() ?: 0)
 
-    private fun List<Scheme>.hashOfElements() = if (isEmpty()) 0 else
-        map { it.simpleHashCode() }.reduceRight { h, acc -> h + acc * 31 }
+    private fun List<Scheme>.hashOfElements() =
+        if (isEmpty()) 0 else map { it.simpleHashCode() }.reduceRight { h, acc -> h + acc * 31 }
 
     private fun serializeTo(writer: SchemeStringSerializationWriter) {
         writer.writeOpen()
@@ -156,10 +171,9 @@
     /**
      * Both hashCode and equals are in terms of alpha rename equivalents. That means that the scheme
      * [0, [0]] and [2, [2]] should be treated as equal even though they have different indexes
-     * because they are alpha rename equivalent. This method will rename all variables
-     * consistently so that if they are alpha equivalent then they will have the same open
-     * indexes in the same location. If the scheme is already alpha rename consistent then this is
-     * returned.
+     * because they are alpha rename equivalent. This method will rename all variables consistently
+     * so that if they are alpha equivalent then they will have the same open indexes in the same
+     * location. If the scheme is already alpha rename consistent then this is returned.
      */
     private fun alphaRename(): Scheme {
         // Special case where the scheme would always be renamed to itself.
@@ -175,8 +189,7 @@
             if (target is Open) {
                 val index = target.index
                 if (index in alphaRenameMap) {
-                    if (index >= 0 && alphaRenameMap[index] == -1)
-                        alphaRenameMap[index] = next++
+                    if (index >= 0 && alphaRenameMap[index] == -1) alphaRenameMap[index] = next++
                 } else alphaRenameMap[index] = -1
             }
             parameters.forEach { scan(it) }
@@ -191,16 +204,18 @@
             val target = scheme.target
             val parameters = scheme.parameters
             val result = scheme.result
-            val newTarget = if (target is Open && target.index != alphaRenameMap[target.index])
-                Open(alphaRenameMap[target.index]!!)
-            else target
+            val newTarget =
+                if (target is Open && target.index != alphaRenameMap[target.index])
+                    Open(alphaRenameMap[target.index]!!)
+                else target
             val newParameters = parameters.map { rename(it) }
             val newResult = result?.let { rename(it) }
             return if (
-                target !== newTarget || newParameters.zip(parameters).any { (a, b) ->
-                    a !== b
-                } || newResult != result
-            ) Scheme(newTarget, newParameters, newResult)
+                target !== newTarget ||
+                    newParameters.zip(parameters).any { (a, b) -> a !== b } ||
+                    newResult != result
+            )
+                Scheme(newTarget, newParameters, newResult)
             else scheme
         }
         return rename(this)
@@ -209,7 +224,9 @@
 
 private class SchemeParseError : Exception("Internal scheme parse error")
 
-private fun schemeParseError(): Nothing { throw SchemeParseError() }
+private fun schemeParseError(): Nothing {
+    throw SchemeParseError()
+}
 
 /**
  * Given a string produce a [Scheme] if the string is a valid serialization of a [Scheme] or null
@@ -218,11 +235,12 @@
 fun deserializeScheme(value: String): Scheme? {
     val reader = SchemeStringSerializationReader(value)
 
-    fun item(): Item = when (reader.kind) {
-        ItemKind.Token -> Token(reader.token())
-        ItemKind.Number -> Open(reader.number())
-        else -> schemeParseError()
-    }
+    fun item(): Item =
+        when (reader.kind) {
+            ItemKind.Token -> Token(reader.token())
+            ItemKind.Number -> Open(reader.number())
+            else -> schemeParseError()
+        }
 
     fun <T> list(content: () -> T): List<T> {
         if (reader.kind != ItemKind.Open) return emptyList()
@@ -233,22 +251,12 @@
         return result
     }
 
-    fun <T> delimited(
-        prefix: ItemKind,
-        postfix: ItemKind,
-        content: () -> T
-    ) = run {
+    fun <T> delimited(prefix: ItemKind, postfix: ItemKind, content: () -> T) = run {
         reader.expect(prefix)
-        content().also {
-            reader.expect(postfix)
-        }
+        content().also { reader.expect(postfix) }
     }
 
-    fun <T> optional(
-        prefix: ItemKind,
-        postfix: ItemKind = ItemKind.Invalid,
-        content: () -> T
-    ): T? =
+    fun <T> optional(prefix: ItemKind, postfix: ItemKind = ItemKind.Invalid, content: () -> T): T? =
         if (reader.kind == prefix) {
             delimited(prefix, postfix, content)
         } else null
@@ -295,10 +303,21 @@
         }
     }
 
-    fun writeOpen() { builder.append('[') }
-    fun writeClose() { builder.append(']') }
-    fun writeResultPrefix() { builder.append(':') }
-    fun writeAnyParameters() { builder.append('*') }
+    fun writeOpen() {
+        builder.append('[')
+    }
+
+    fun writeClose() {
+        builder.append(']')
+    }
+
+    fun writeResultPrefix() {
+        builder.append(':')
+    }
+
+    fun writeAnyParameters() {
+        builder.append('*')
+    }
 
     override fun toString(): String = builder.toString()
 
@@ -321,27 +340,27 @@
 private class SchemeStringSerializationReader(private val value: String) {
     private var current = 0
 
-    val kind: ItemKind get() =
-        when (val ch = ch) {
-            '_' -> ItemKind.Number
-            '[' -> ItemKind.Open
-            ']' -> ItemKind.Close
-            ':' -> ItemKind.ResultPrefix
-            '*' -> ItemKind.AnyParameters
-            '"' -> ItemKind.Token
-            else -> {
-                when {
-                    ch.isLetter() -> ItemKind.Token
-                    ch.isDigit() -> ItemKind.Number
-                    ch == eos -> ItemKind.End
-                    else -> ItemKind.Invalid
+    val kind: ItemKind
+        get() =
+            when (val ch = ch) {
+                '_' -> ItemKind.Number
+                '[' -> ItemKind.Open
+                ']' -> ItemKind.Close
+                ':' -> ItemKind.ResultPrefix
+                '*' -> ItemKind.AnyParameters
+                '"' -> ItemKind.Token
+                else -> {
+                    when {
+                        ch.isLetter() -> ItemKind.Token
+                        ch.isDigit() -> ItemKind.Number
+                        ch == eos -> ItemKind.End
+                        else -> ItemKind.Invalid
+                    }
                 }
             }
-        }
 
     fun end() {
-        if (kind != ItemKind.End)
-            schemeParseError()
+        if (kind != ItemKind.End) schemeParseError()
     }
 
     fun number(): Int {
@@ -350,8 +369,7 @@
             return -1
         }
         val start = current
-        while (ch.isDigit())
-            current++
+        while (ch.isDigit()) current++
         return try {
             Integer.parseUnsignedInt(value, start, current, 10)
         } catch (_: NumberFormatException) {
@@ -383,7 +401,12 @@
             end = current
             current++
         } else {
-            while (run { val ch = ch; ch == '.' || ch.isLetter() }) current++
+            while (
+                run {
+                    val ch = ch
+                    ch == '.' || ch.isLetter()
+                }
+            ) current++
             end = current
         }
         return prefix + value.subSequence(start, end).toString()
@@ -407,7 +430,8 @@
         }
     }
 
-    private val ch: Char get() = if (current < value.length) value[current] else eos
+    private val ch: Char
+        get() = if (current < value.length) value[current] else eos
 
     private fun expect(ch: Char) {
         if (current < value.length && value[current] == ch) {
diff --git a/compose/compiler/compiler-hosted/src/main/java/androidx/compose/compiler/plugins/kotlin/k1/AnnotationUtils.kt b/compose/compiler/compiler-hosted/src/main/java/androidx/compose/compiler/plugins/kotlin/k1/AnnotationUtils.kt
index 3f01555..dcb8fdb 100644
--- a/compose/compiler/compiler-hosted/src/main/java/androidx/compose/compiler/plugins/kotlin/k1/AnnotationUtils.kt
+++ b/compose/compiler/compiler-hosted/src/main/java/androidx/compose/compiler/plugins/kotlin/k1/AnnotationUtils.kt
@@ -35,11 +35,15 @@
 private fun makeComposableAnnotation(module: ModuleDescriptor): AnnotationDescriptor =
     object : AnnotationDescriptor {
         override val type: KotlinType
-            get() = module.findClassAcrossModuleDependencies(
-                ComposeClassIds.Composable
-            )!!.defaultType
-        override val allValueArguments: Map<Name, ConstantValue<*>> get() = emptyMap()
-        override val source: SourceElement get() = SourceElement.NO_SOURCE
+            get() =
+                module.findClassAcrossModuleDependencies(ComposeClassIds.Composable)!!.defaultType
+
+        override val allValueArguments: Map<Name, ConstantValue<*>>
+            get() = emptyMap()
+
+        override val source: SourceElement
+            get() = SourceElement.NO_SOURCE
+
         override fun toString() = "[@Composable]"
     }
 
@@ -60,19 +64,21 @@
 
 fun KotlinType.hasComposableAnnotation(): Boolean =
     !isSpecialType && annotations.findAnnotation(ComposeFqNames.Composable) != null
+
 fun Annotated.hasComposableAnnotation(): Boolean =
     annotations.findAnnotation(ComposeFqNames.Composable) != null
+
 fun Annotated.hasReadonlyComposableAnnotation(): Boolean =
     annotations.findAnnotation(ComposeFqNames.ReadOnlyComposable) != null
+
 fun Annotated.hasDisallowComposableCallsAnnotation(): Boolean =
     annotations.findAnnotation(ComposeFqNames.DisallowComposableCalls) != null
+
 fun Annotated.compositionTarget(): String? =
     annotations.map { it.compositionTarget() }.firstOrNull { it != null }
 
 fun Annotated.hasCompositionTargetMarker(): Boolean =
-    annotations.findAnnotation(
-        ComposeFqNames.ComposableTargetMarker
-    ) != null
+    annotations.findAnnotation(ComposeFqNames.ComposableTargetMarker) != null
 
 fun AnnotationDescriptor.compositionTarget(): String? =
     if (fqName == ComposeFqNames.ComposableTarget)
@@ -80,20 +86,17 @@
     else if (annotationClass?.hasCompositionTargetMarker() == true) this.fqName.toString() else null
 
 fun Annotated.compositionScheme(): String? =
-    annotations.findAnnotation(
-        ComposeFqNames.ComposableInferredTarget
-    )?.allValueArguments?.let {
+    annotations.findAnnotation(ComposeFqNames.ComposableInferredTarget)?.allValueArguments?.let {
         it[ComposeFqNames.ComposableInferredTargetSchemeArgument]?.value as? String
     }
 
 fun Annotated.compositionOpenTarget(): Int? =
-    annotations.findAnnotation(
-        ComposeFqNames.ComposableOpenTarget
-    )?.allValueArguments?.let {
+    annotations.findAnnotation(ComposeFqNames.ComposableOpenTarget)?.allValueArguments?.let {
         it[ComposeFqNames.ComposableOpenTargetIndexArgument]?.value as Int
     }
 
-internal val KotlinType.isSpecialType: Boolean get() =
-    this === TypeUtils.NO_EXPECTED_TYPE || this === TypeUtils.UNIT_EXPECTED_TYPE
+internal val KotlinType.isSpecialType: Boolean
+    get() = this === TypeUtils.NO_EXPECTED_TYPE || this === TypeUtils.UNIT_EXPECTED_TYPE
 
-val AnnotationDescriptor.isComposableAnnotation: Boolean get() = fqName == ComposeFqNames.Composable
+val AnnotationDescriptor.isComposableAnnotation: Boolean
+    get() = fqName == ComposeFqNames.Composable
diff --git a/compose/compiler/compiler-hosted/src/main/java/androidx/compose/compiler/plugins/kotlin/k1/ComposableCallChecker.kt b/compose/compiler/compiler-hosted/src/main/java/androidx/compose/compiler/plugins/kotlin/k1/ComposableCallChecker.kt
index a776a4d..1f8bb47 100644
--- a/compose/compiler/compiler-hosted/src/main/java/androidx/compose/compiler/plugins/kotlin/k1/ComposableCallChecker.kt
+++ b/compose/compiler/compiler-hosted/src/main/java/androidx/compose/compiler/plugins/kotlin/k1/ComposableCallChecker.kt
@@ -73,9 +73,7 @@
 import org.jetbrains.kotlin.util.OperatorNameConventions
 
 open class ComposableCallChecker :
-    CallChecker,
-    AdditionalTypeChecker,
-    StorageComponentContainerContributor {
+    CallChecker, AdditionalTypeChecker, StorageComponentContainerContributor {
     override fun registerModuleComponents(
         container: StorageComponentContainer,
         platform: TargetPlatform,
@@ -95,13 +93,11 @@
         if (descriptor.type.hasDisallowComposableCallsAnnotation()) return
         val function = descriptor.containingDeclaration
         if (
-            function is FunctionDescriptor &&
-            function.isInline &&
-            function.isMarkedAsComposable()
+            function is FunctionDescriptor && function.isInline && function.isMarkedAsComposable()
         ) {
             val bindingContext = context.trace.bindingContext
             var node: PsiElement? = reportOn
-            loop@while (node != null) {
+            loop@ while (node != null) {
                 when (node) {
                     is KtLambdaExpression -> {
                         val arg = getArgumentDescriptor(node.functionLiteral, bindingContext)
@@ -146,7 +142,7 @@
         warnOnUnstableNamedArguments(resolvedCall, context)
 
         var node: PsiElement? = reportOn
-        loop@while (node != null) {
+        loop@ while (node != null) {
             when (node) {
                 is KtFunctionLiteral -> {
                     // keep going, as this is a "KtFunction", but we actually want the
@@ -177,15 +173,14 @@
                         return
                     }
 
-                    val isResolvedInline = bindingContext.get(
-                        BindingContext.NEW_INFERENCE_IS_LAMBDA_FOR_OVERLOAD_RESOLUTION_INLINE,
-                        node.functionLiteral
-                    ) == true
-                    val isInlined = isResolvedInline || isInlinedArgument(
-                        node.functionLiteral,
-                        bindingContext,
-                        true
-                    )
+                    val isResolvedInline =
+                        bindingContext.get(
+                            BindingContext.NEW_INFERENCE_IS_LAMBDA_FOR_OVERLOAD_RESOLUTION_INLINE,
+                            node.functionLiteral
+                        ) == true
+                    val isInlined =
+                        isResolvedInline ||
+                            isInlinedArgument(node.functionLiteral, bindingContext, true)
                     if (!isInlined) {
                         illegalCall(context, reportOn)
                         return
@@ -202,8 +197,7 @@
                 is KtTryExpression -> {
                     val tryKeyword = node.tryKeyword
                     if (
-                        node.tryBlock.textRange.contains(reportOn.textRange) &&
-                        tryKeyword != null
+                        node.tryBlock.textRange.contains(reportOn.textRange) && tryKeyword != null
                     ) {
                         context.trace.report(
                             ComposeErrors.ILLEGAL_TRY_CATCH_AROUND_COMPOSABLE.on(tryKeyword)
@@ -223,10 +217,7 @@
                     if (descriptor.hasReadonlyComposableAnnotation()) {
                         // enforce that the original call was readonly
                         if (!resolvedCall.isReadOnlyComposableInvocation()) {
-                            illegalCallMustBeReadonly(
-                                context,
-                                reportOn
-                            )
+                            illegalCallMustBeReadonly(context, reportOn)
                         }
                     }
                     return
@@ -238,19 +229,21 @@
                     val descriptor = bindingContext[BindingContext.DECLARATION_TO_DESCRIPTOR, node]
 
                     if (resolvedCall.isComposableDelegateOperator()) {
-                        // The call is initializer for fields like `val foo by composableDelegate()`.
+                        // The call is initializer for fields like `val foo by
+                        // composableDelegate()`.
                         // Creating the property doesn't have any requirements from Compose side,
                         // we will recheck on the property call site instead.
                         if (
-                            descriptor is VariableDescriptorWithAccessors &&
-                                descriptor.isDelegated
+                            descriptor is VariableDescriptorWithAccessors && descriptor.isDelegated
                         ) {
                             if (descriptor.isVar) {
                                 // setValue delegate is not allowed for now.
                                 illegalComposableDelegate(context, reportOn)
                             }
-                            if (descriptor is PropertyDescriptor &&
-                                descriptor.getter?.hasComposableAnnotation() != true) {
+                            if (
+                                descriptor is PropertyDescriptor &&
+                                    descriptor.getter?.hasComposableAnnotation() != true
+                            ) {
                                 composableExpected(context, node.nameIdentifier ?: node)
                             }
                             return
@@ -259,7 +252,7 @@
 
                     if (
                         descriptor !is LocalVariableDescriptor &&
-                        node.annotationEntries.hasComposableAnnotation(bindingContext)
+                            node.annotationEntries.hasComposableAnnotation(bindingContext)
                     ) {
                         // composables shouldn't have initializers in the first place
                         illegalCall(context, reportOn)
@@ -268,20 +261,17 @@
                 }
                 is KtPropertyAccessor -> {
                     val property = node.property
-                    val isComposable = node
-                        .annotationEntries.hasComposableAnnotation(bindingContext)
+                    val isComposable =
+                        node.annotationEntries.hasComposableAnnotation(bindingContext)
                     if (!isComposable) {
                         illegalCall(context, reportOn, property.nameIdentifier ?: property)
                     }
-                    val descriptor = bindingContext[BindingContext.PROPERTY_ACCESSOR, node]
-                        ?: return
+                    val descriptor =
+                        bindingContext[BindingContext.PROPERTY_ACCESSOR, node] ?: return
                     if (descriptor.hasReadonlyComposableAnnotation()) {
                         // enforce that the original call was readonly
                         if (!resolvedCall.isReadOnlyComposableInvocation()) {
-                            illegalCallMustBeReadonly(
-                                context,
-                                reportOn
-                            )
+                            illegalCallMustBeReadonly(context, reportOn)
                         }
                     }
                     return
@@ -311,11 +301,8 @@
     ) {
         if (resolvedCall.candidateDescriptor?.hasStableParameterNames() != true) {
             for (valueArgument in resolvedCall.call.valueArguments) {
-                val nameReference = valueArgument.getArgumentName()?.referenceExpression
-                    ?: continue
-                context.trace.report(
-                    ComposeErrors.NAMED_ARGUMENTS_NOT_ALLOWED.on(nameReference)
-                )
+                val nameReference = valueArgument.getArgumentName()?.referenceExpression ?: continue
+                context.trace.report(ComposeErrors.NAMED_ARGUMENTS_NOT_ALLOWED.on(nameReference))
             }
         }
     }
@@ -347,17 +334,11 @@
         }
     }
 
-    private fun composableExpected(
-        context: CallCheckerContext,
-        functionEl: PsiElement
-    ) {
+    private fun composableExpected(context: CallCheckerContext, functionEl: PsiElement) {
         context.trace.report(ComposeErrors.COMPOSABLE_EXPECTED.on(functionEl))
     }
 
-    private fun illegalCallMustBeReadonly(
-        context: CallCheckerContext,
-        callEl: PsiElement
-    ) {
+    private fun illegalCallMustBeReadonly(context: CallCheckerContext, callEl: PsiElement) {
         context.trace.report(ComposeErrors.NONREADONLY_CALL_IN_READONLY_COMPOSABLE.on(callEl))
     }
 
@@ -368,10 +349,7 @@
         context.trace.report(ComposeErrors.COMPOSABLE_FUNCTION_REFERENCE.on(refExpr))
     }
 
-    private fun illegalComposableDelegate(
-        context: CallCheckerContext,
-        reportOn: PsiElement
-    ) {
+    private fun illegalComposableDelegate(context: CallCheckerContext, reportOn: PsiElement) {
         context.trace.report(ComposeErrors.COMPOSE_INVALID_DELEGATE.on(reportOn))
     }
 
@@ -389,34 +367,29 @@
         if (expectedType.isAnyOrNullableAny()) return
         val expectedComposable = c.hasComposableExpectedType(expression)
         if (expression is KtLambdaExpression) {
-            val descriptor = bindingContext[BindingContext.FUNCTION, expression.functionLiteral]
-                ?: return
+            val descriptor =
+                bindingContext[BindingContext.FUNCTION, expression.functionLiteral] ?: return
             val isComposable = descriptor.isComposableCallable(bindingContext)
             if (expectedComposable != isComposable) {
-                val isInlineable = isInlinedArgument(
-                    expression.functionLiteral,
-                    c.trace.bindingContext,
-                    true
-                )
+                val isInlineable =
+                    isInlinedArgument(expression.functionLiteral, c.trace.bindingContext, true)
                 if (isInlineable) {
                     if (!expectedComposable && descriptor.isMarkedAsComposable()) {
-                        val reportOn = (descriptor
-                            .annotations
-                            .findAnnotation(ComposeFqNames.Composable)
-                            ?.source as? PsiSourceElement)
-                            ?.psi ?: expression
-                        c.trace.report(
-                            ComposeErrors.REDUNDANT_COMPOSABLE_ANNOTATION.on(reportOn)
-                        )
+                        val reportOn =
+                            (descriptor.annotations
+                                    .findAnnotation(ComposeFqNames.Composable)
+                                    ?.source as? PsiSourceElement)
+                                ?.psi ?: expression
+                        c.trace.report(ComposeErrors.REDUNDANT_COMPOSABLE_ANNOTATION.on(reportOn))
                     }
                     return
                 }
 
                 if (!expectedComposable && isComposable) {
-                    val inferred = c.trace.bindingContext[
-                        FrontendWritableSlices.INFERRED_COMPOSABLE_DESCRIPTOR,
-                        descriptor
-                    ] == true
+                    val inferred =
+                        c.trace.bindingContext[
+                                FrontendWritableSlices.INFERRED_COMPOSABLE_DESCRIPTOR,
+                                descriptor] == true
                     if (inferred) {
                         return
                     }
@@ -439,16 +412,17 @@
             val nullableAnyType = expectedType.builtIns.nullableAnyType
             val anyType = expectedType.builtIns.anyType
 
-            if (anyType == expectedType.lowerIfFlexible() &&
-                nullableAnyType == expectedType.upperIfFlexible()
-            ) return
+            if (
+                anyType == expectedType.lowerIfFlexible() &&
+                    nullableAnyType == expectedType.upperIfFlexible()
+            )
+                return
 
             val nullableNothingType = expectedType.builtIns.nullableNothingType
 
             // Handle assigning null to a nullable composable type
-            if (expectedType.isMarkedNullable &&
-                expressionTypeWithSmartCast == nullableNothingType
-            ) return
+            if (expectedType.isMarkedNullable && expressionTypeWithSmartCast == nullableNothingType)
+                return
             val isComposable = expressionType.hasComposableAnnotation()
 
             if (expectedComposable != isComposable) {
@@ -509,15 +483,15 @@
 
 fun ResolvedCall<*>.isComposableInvocation(): Boolean {
     if (this is VariableAsFunctionResolvedCall) {
-        if (variableCall.candidateDescriptor.type.hasComposableAnnotation())
-            return true
+        if (variableCall.candidateDescriptor.type.hasComposableAnnotation()) return true
         if (functionCall.resultingDescriptor.hasComposableAnnotation()) return true
         return false
     }
     val candidateDescriptor = candidateDescriptor
     if (candidateDescriptor is FunctionDescriptor) {
-        if (candidateDescriptor.isOperator &&
-            candidateDescriptor.name == OperatorNameConventions.INVOKE
+        if (
+            candidateDescriptor.isOperator &&
+                candidateDescriptor.name == OperatorNameConventions.INVOKE
         ) {
             if (dispatchReceiver?.type?.hasComposableAnnotation() == true) {
                 return true
@@ -557,16 +531,17 @@
     if (isMarkedAsComposable()) return true
     if (
         this is FunctionDescriptor &&
-        bindingContext[FrontendWritableSlices.INFERRED_COMPOSABLE_DESCRIPTOR, this] == true
+            bindingContext[FrontendWritableSlices.INFERRED_COMPOSABLE_DESCRIPTOR, this] == true
     ) {
         // even though it's not marked, it is inferred as so by the type system (by being passed
         // into a parameter marked as composable or a variable typed as one. This isn't much
         // different than being marked explicitly.
         return true
     }
-    val functionLiteral = findPsi() as? KtFunctionLiteral
-        // if it isn't a function literal then we are out of things to try.
-        ?: return false
+    val functionLiteral =
+        findPsi() as? KtFunctionLiteral
+            // if it isn't a function literal then we are out of things to try.
+            ?: return false
 
     if (functionLiteral.annotationEntries.hasComposableAnnotation(bindingContext)) {
         // in this case the function literal itself is being annotated as composable but the
@@ -576,7 +551,7 @@
     val lambdaExpr = functionLiteral.parent as? KtLambdaExpression
     if (
         lambdaExpr != null &&
-        bindingContext[FrontendWritableSlices.INFERRED_COMPOSABLE_LITERAL, lambdaExpr] == true
+            bindingContext[FrontendWritableSlices.INFERRED_COMPOSABLE_LITERAL, lambdaExpr] == true
     ) {
         // this lambda was marked as inferred to be composable
         return true
@@ -591,10 +566,7 @@
     if (isComposableCallable(bindingContext)) return true
     // otherwise, this is only true if it is a lambda which can be capable of composer
     // capture
-    return bindingContext[
-        FrontendWritableSlices.LAMBDA_CAPABLE_OF_COMPOSER_CAPTURE,
-        this
-    ] == true
+    return bindingContext[FrontendWritableSlices.LAMBDA_CAPABLE_OF_COMPOSER_CAPTURE, this] == true
 }
 
 // The resolution context usually contains a call position, which records
@@ -610,30 +582,22 @@
     expression: KtExpression
 ): CallPosition.ValueArgumentPosition? =
     when (val position = callPosition) {
-        is CallPosition.ValueArgumentPosition ->
-            position
-
-        is CallPosition.Unknown ->
-            getValueArgumentPositionFromPsi(expression, trace.bindingContext)
-
-        else ->
-            null
+        is CallPosition.ValueArgumentPosition -> position
+        is CallPosition.Unknown -> getValueArgumentPositionFromPsi(expression, trace.bindingContext)
+        else -> null
     }
 
 private fun getValueArgumentPositionFromPsi(
     expression: KtExpression,
     context: BindingContext,
 ): CallPosition.ValueArgumentPosition? {
-    val resolvedCall = KtPsiUtil
-        .getParentCallIfPresent(expression)
-        .getResolvedCall(context)
-        ?: return null
+    val resolvedCall =
+        KtPsiUtil.getParentCallIfPresent(expression).getResolvedCall(context) ?: return null
 
-    val valueArgument = resolvedCall.call.getValueArgumentForExpression(expression)
-        ?: return null
+    val valueArgument = resolvedCall.call.getValueArgumentForExpression(expression) ?: return null
 
-    val argumentMatch = resolvedCall.getArgumentMapping(valueArgument) as? ArgumentMatch
-        ?: return null
+    val argumentMatch =
+        resolvedCall.getArgumentMapping(valueArgument) as? ArgumentMatch ?: return null
 
     return CallPosition.ValueArgumentPosition(
         resolvedCall,
@@ -645,22 +609,18 @@
 private fun getArgumentDescriptor(
     expression: KtExpression,
     context: BindingContext
-): ValueParameterDescriptor? =
-    getValueArgumentPositionFromPsi(expression, context)?.valueParameter
+): ValueParameterDescriptor? = getValueArgumentPositionFromPsi(expression, context)?.valueParameter
 
 internal fun ResolutionContext<*>.hasComposableExpectedType(expression: KtExpression): Boolean {
-    if (expectedType.hasComposableAnnotation())
-        return true
+    if (expectedType.hasComposableAnnotation()) return true
 
     // The Kotlin frontend discards all annotations when computing function
     // types for fun interfaces. As a workaround we retrieve the fun interface
     // from the current value argument position and check the annotations on the
     // underlying method.
-    if (expectedType.isSpecialType || !expectedType.isBuiltinFunctionalType)
-        return false
+    if (expectedType.isSpecialType || !expectedType.isBuiltinFunctionalType) return false
 
-    val position = getValueArgumentPosition(expression)
-        ?: return false
+    val position = getValueArgumentPosition(expression) ?: return false
 
     // There are two kinds of SAM conversions in Kotlin.
     //
@@ -672,12 +632,13 @@
     // For explicit SAM conversion we check for the presence of a synthetic call,
     // otherwise we check the type of the value parameter descriptor.
     val callDescriptor = position.resolvedCall.resultingDescriptor.original
-    val samDescriptor = if (callDescriptor is FunctionInterfaceConstructorDescriptor) {
-        callDescriptor.baseDescriptorForSynthetic
-    } else {
-        position.valueParameter.type.constructor.declarationDescriptor as? ClassDescriptor
-            ?: return false
-    }
+    val samDescriptor =
+        if (callDescriptor is FunctionInterfaceConstructorDescriptor) {
+            callDescriptor.baseDescriptorForSynthetic
+        } else {
+            position.valueParameter.type.constructor.declarationDescriptor as? ClassDescriptor
+                ?: return false
+        }
 
     return getSingleAbstractMethodOrNull(samDescriptor)?.hasComposableAnnotation() == true
 }
diff --git a/compose/compiler/compiler-hosted/src/main/java/androidx/compose/compiler/plugins/kotlin/k1/ComposableDeclarationChecker.kt b/compose/compiler/compiler-hosted/src/main/java/androidx/compose/compiler/plugins/kotlin/k1/ComposableDeclarationChecker.kt
index 7145d1e..26f8072 100644
--- a/compose/compiler/compiler-hosted/src/main/java/androidx/compose/compiler/plugins/kotlin/k1/ComposableDeclarationChecker.kt
+++ b/compose/compiler/compiler-hosted/src/main/java/androidx/compose/compiler/plugins/kotlin/k1/ComposableDeclarationChecker.kt
@@ -56,16 +56,12 @@
         context: DeclarationCheckerContext
     ) {
         when {
-            declaration is KtProperty &&
-                descriptor is PropertyDescriptor -> checkProperty(declaration, descriptor, context)
-            declaration is KtPropertyAccessor &&
-                descriptor is PropertyAccessorDescriptor -> checkPropertyAccessor(
-                declaration,
-                descriptor,
-                context
-            )
-            declaration is KtFunction &&
-                descriptor is FunctionDescriptor -> checkFunction(declaration, descriptor, context)
+            declaration is KtProperty && descriptor is PropertyDescriptor ->
+                checkProperty(declaration, descriptor, context)
+            declaration is KtPropertyAccessor && descriptor is PropertyAccessorDescriptor ->
+                checkPropertyAccessor(declaration, descriptor, context)
+            declaration is KtFunction && descriptor is FunctionDescriptor ->
+                checkFunction(declaration, descriptor, context)
         }
     }
 
@@ -79,16 +75,17 @@
             val override = descriptor.overriddenDescriptors.first()
             val overrideFunctionIsComposable =
                 if (descriptor.isOperator && descriptor.name == OperatorNameConventions.INVOKE) {
-                    override.hasComposableAnnotation() || descriptor.let {
-                        val cls = descriptor.containingDeclaration as? ClassDescriptor
-                        cls?.run {
-                            defaultType.supertypes().any {
-                                it.isFunctionType &&
-                                    it.arguments.size == descriptor.arity + 1 &&
-                                    it.hasComposableAnnotation()
-                            }
-                        } ?: false
-                    }
+                    override.hasComposableAnnotation() ||
+                        descriptor.let {
+                            val cls = descriptor.containingDeclaration as? ClassDescriptor
+                            cls?.run {
+                                defaultType.supertypes().any {
+                                    it.isFunctionType &&
+                                        it.arguments.size == descriptor.arity + 1 &&
+                                        it.hasComposableAnnotation()
+                                }
+                            } ?: false
+                        }
                 } else {
                     override.hasComposableAnnotation()
                 }
@@ -122,16 +119,16 @@
         }
         if (descriptor.isSuspend && hasComposableAnnotation) {
             context.trace.report(
-                ComposeErrors.COMPOSABLE_SUSPEND_FUN.on(
-                    declaration.nameIdentifier ?: declaration
-                )
+                ComposeErrors.COMPOSABLE_SUSPEND_FUN.on(declaration.nameIdentifier ?: declaration)
             )
         }
 
         if (descriptor.isActual) {
             val expectDescriptor = descriptor.findCompatibleExpectsForActual().singleOrNull()
-            if (expectDescriptor != null &&
-                expectDescriptor.hasComposableAnnotation() != hasComposableAnnotation) {
+            if (
+                expectDescriptor != null &&
+                    expectDescriptor.hasComposableAnnotation() != hasComposableAnnotation
+            ) {
                 context.trace.report(
                     ComposeErrors.MISMATCHED_COMPOSABLE_IN_EXPECT_ACTUAL.on(
                         declaration.nameIdentifier ?: declaration
@@ -152,29 +149,24 @@
         }
         // NOTE: only use the MainFunctionDetector if the descriptor name is main, to avoid
         // unnecessarily allocating this class
-        if (hasComposableAnnotation &&
-            descriptor.name.asString() == "main" &&
-            MainFunctionDetector(
-                    context.trace.bindingContext,
-                    context.languageVersionSettings
-                ).isMain(descriptor)
+        if (
+            hasComposableAnnotation &&
+                descriptor.name.asString() == "main" &&
+                MainFunctionDetector(context.trace.bindingContext, context.languageVersionSettings)
+                    .isMain(descriptor)
         ) {
             context.trace.report(
-                ComposeErrors.COMPOSABLE_FUN_MAIN.on(
-                    declaration.nameIdentifier ?: declaration
-                )
+                ComposeErrors.COMPOSABLE_FUN_MAIN.on(declaration.nameIdentifier ?: declaration)
             )
         }
 
         if (
             hasComposableAnnotation &&
-            descriptor.isOperator &&
-            descriptor.name == OperatorNameConventions.SET_VALUE
+                descriptor.isOperator &&
+                descriptor.name == OperatorNameConventions.SET_VALUE
         ) {
             context.trace.report(
-                ComposeErrors.COMPOSE_INVALID_DELEGATE.on(
-                    declaration.nameIdentifier ?: declaration
-                )
+                ComposeErrors.COMPOSE_INVALID_DELEGATE.on(declaration.nameIdentifier ?: declaration)
             )
         }
     }
@@ -185,9 +177,7 @@
         context: DeclarationCheckerContext
     ) {
         if (type.hasComposableAnnotation() && type.isSuspendFunctionType) {
-            context.trace.report(
-                ComposeErrors.COMPOSABLE_SUSPEND_FUN.on(element)
-            )
+            context.trace.report(ComposeErrors.COMPOSABLE_SUSPEND_FUN.on(element))
         }
     }
 
@@ -196,13 +186,12 @@
         descriptor: PropertyDescriptor,
         context: DeclarationCheckerContext
     ) {
-        val hasComposableAnnotation = descriptor
-            .getter
-            ?.hasComposableAnnotation() == true
+        val hasComposableAnnotation = descriptor.getter?.hasComposableAnnotation() == true
         if (descriptor.overriddenDescriptors.isNotEmpty()) {
             val override = descriptor.overriddenDescriptors.first()
-            val overrideIsComposable = override.hasComposableAnnotation() ||
-                override.getter?.hasComposableAnnotation() == true
+            val overrideIsComposable =
+                override.hasComposableAnnotation() ||
+                    override.getter?.hasComposableAnnotation() == true
             if (overrideIsComposable != hasComposableAnnotation) {
                 context.trace.report(
                     ComposeErrors.CONFLICTING_OVERLOADS.on(
@@ -254,8 +243,8 @@
         }
     }
 
-    private val FunctionDescriptor.arity get(): Int =
-        if (extensionReceiverParameter != null) 1 else 0 +
-            contextReceiverParameters.size +
-            valueParameters.size
+    private val FunctionDescriptor.arity
+        get(): Int =
+            if (extensionReceiverParameter != null) 1
+            else 0 + contextReceiverParameters.size + valueParameters.size
 }
diff --git a/compose/compiler/compiler-hosted/src/main/java/androidx/compose/compiler/plugins/kotlin/k1/ComposableTargetChecker.kt b/compose/compiler/compiler-hosted/src/main/java/androidx/compose/compiler/plugins/kotlin/k1/ComposableTargetChecker.kt
index f39b525..cf5eb10 100644
--- a/compose/compiler/compiler-hosted/src/main/java/androidx/compose/compiler/plugins/kotlin/k1/ComposableTargetChecker.kt
+++ b/compose/compiler/compiler-hosted/src/main/java/androidx/compose/compiler/plugins/kotlin/k1/ComposableTargetChecker.kt
@@ -70,71 +70,84 @@
 import org.jetbrains.kotlin.types.KotlinType
 
 private sealed class InferenceNode(val element: PsiElement) {
-    open val kind: NodeKind get() = when (element) {
-        is KtLambdaExpression, is KtFunctionLiteral -> NodeKind.Lambda
-        is KtFunction -> NodeKind.Function
-        else -> NodeKind.Expression
-    }
+    open val kind: NodeKind
+        get() =
+            when (element) {
+                is KtLambdaExpression,
+                is KtFunctionLiteral -> NodeKind.Lambda
+                is KtFunction -> NodeKind.Function
+                else -> NodeKind.Expression
+            }
+
     abstract val type: InferenceNodeType
 }
 
 private sealed class InferenceNodeType {
     abstract fun toScheme(callContext: CallCheckerContext): Scheme
+
     abstract fun isTypeFor(descriptor: CallableDescriptor): Boolean
 }
 
 private class InferenceDescriptorType(val descriptor: CallableDescriptor) : InferenceNodeType() {
     override fun toScheme(callContext: CallCheckerContext): Scheme =
         descriptor.toScheme(callContext)
+
     override fun isTypeFor(descriptor: CallableDescriptor) = this.descriptor == descriptor
+
     override fun hashCode(): Int = 31 * descriptor.original.hashCode()
+
     override fun equals(other: Any?): Boolean =
         other is InferenceDescriptorType && other.descriptor.original == descriptor.original
 }
 
 private class InferenceKotlinType(val type: KotlinType) : InferenceNodeType() {
     override fun toScheme(callContext: CallCheckerContext): Scheme = type.toScheme()
+
     override fun isTypeFor(descriptor: CallableDescriptor): Boolean = false
+
     override fun hashCode(): Int = 31 * type.hashCode()
-    override fun equals(other: Any?): Boolean =
-        other is InferenceKotlinType && other.type == type
+
+    override fun equals(other: Any?): Boolean = other is InferenceKotlinType && other.type == type
 }
 
 private class InferenceUnknownType : InferenceNodeType() {
     override fun toScheme(callContext: CallCheckerContext): Scheme = Scheme(Open(-1))
+
     override fun isTypeFor(descriptor: CallableDescriptor): Boolean = false
+
     override fun hashCode(): Int = System.identityHashCode(this)
+
     override fun equals(other: Any?): Boolean = other === this
 }
 
-private class PsiElementNode(
-    element: PsiElement,
-    val bindingContext: BindingContext
-) : InferenceNode(element) {
-    override val type: InferenceNodeType = when (element) {
-        is KtLambdaExpression -> descriptorTypeOf(element.functionLiteral)
-        is KtFunctionLiteral, is KtFunction -> descriptorTypeOf(element)
-        is KtProperty -> kotlinTypeOf(element)
-        is KtPropertyAccessor -> kotlinTypeOf(element)
-        is KtExpression -> kotlinTypeOf(element)
-        else -> descriptorTypeOf(element)
-    }
+private class PsiElementNode(element: PsiElement, val bindingContext: BindingContext) :
+    InferenceNode(element) {
+    override val type: InferenceNodeType =
+        when (element) {
+            is KtLambdaExpression -> descriptorTypeOf(element.functionLiteral)
+            is KtFunctionLiteral,
+            is KtFunction -> descriptorTypeOf(element)
+            is KtProperty -> kotlinTypeOf(element)
+            is KtPropertyAccessor -> kotlinTypeOf(element)
+            is KtExpression -> kotlinTypeOf(element)
+            else -> descriptorTypeOf(element)
+        }
 
     private fun descriptorTypeOf(element: PsiElement): InferenceNodeType =
-        bindingContext[BindingContext.FUNCTION, element]?.let {
-            InferenceDescriptorType(it)
-        } ?: InferenceUnknownType()
+        bindingContext[BindingContext.FUNCTION, element]?.let { InferenceDescriptorType(it) }
+            ?: InferenceUnknownType()
 
-    private fun kotlinTypeOf(element: KtExpression) = element.kotlinType(bindingContext)?.let {
-        InferenceKotlinType(it)
-    } ?: InferenceUnknownType()
+    private fun kotlinTypeOf(element: KtExpression) =
+        element.kotlinType(bindingContext)?.let { InferenceKotlinType(it) }
+            ?: InferenceUnknownType()
 }
 
 private class ResolvedPsiElementNode(
     element: PsiElement,
     override val type: InferenceNodeType,
 ) : InferenceNode(element) {
-    override val kind: NodeKind get() = NodeKind.Function
+    override val kind: NodeKind
+        get() = NodeKind.Function
 }
 
 private class ResolvedPsiParameterReference(
@@ -143,7 +156,8 @@
     val index: Int,
     val container: PsiElement
 ) : InferenceNode(element) {
-    override val kind: NodeKind get() = NodeKind.ParameterReference
+    override val kind: NodeKind
+        get() = NodeKind.ParameterReference
 }
 
 class ComposableTargetChecker : CallChecker, StorageComponentContainerContributor {
@@ -154,9 +168,12 @@
         var current: PsiElement? = element.parent
         while (current != null) {
             when (current) {
-                is KtLambdaExpression, is KtFunction, is KtProperty, is KtPropertyAccessor ->
-                    return current
-                is KtClass, is KtFile -> break
+                is KtLambdaExpression,
+                is KtFunction,
+                is KtProperty,
+                is KtPropertyAccessor -> return current
+                is KtClass,
+                is KtFile -> break
             }
             current = current.parent as? KtElement
         }
@@ -164,119 +181,131 @@
     }
 
     private fun containerNodeOf(element: PsiElement) =
-        containerOf(element)?.let {
-            PsiElementNode(it, callContext.trace.bindingContext)
-        }
+        containerOf(element)?.let { PsiElementNode(it, callContext.trace.bindingContext) }
 
     // Create an InferApplier instance with adapters for the Psi front-end
-    private val infer = ApplierInferencer(
-        typeAdapter = object : TypeAdapter<InferenceNodeType> {
-            override fun declaredSchemaOf(type: InferenceNodeType): Scheme =
-                type.toScheme(callContext)
-            override fun currentInferredSchemeOf(type: InferenceNodeType): Scheme? = null
-            override fun updatedInferredScheme(type: InferenceNodeType, scheme: Scheme) { }
-        },
-        nodeAdapter = object : NodeAdapter<InferenceNodeType, InferenceNode> {
-            override fun containerOf(node: InferenceNode): InferenceNode =
-                containerNodeOf(node.element) ?: node
+    private val infer =
+        ApplierInferencer(
+            typeAdapter =
+                object : TypeAdapter<InferenceNodeType> {
+                    override fun declaredSchemaOf(type: InferenceNodeType): Scheme =
+                        type.toScheme(callContext)
 
-            override fun kindOf(node: InferenceNode) = node.kind
+                    override fun currentInferredSchemeOf(type: InferenceNodeType): Scheme? = null
 
-            override fun schemeParameterIndexOf(
-                node: InferenceNode,
-                container: InferenceNode
-            ): Int = (node as? ResolvedPsiParameterReference)?.let {
-                if (it.container == container.element) it.index else -1
-            } ?: -1
+                    override fun updatedInferredScheme(type: InferenceNodeType, scheme: Scheme) {}
+                },
+            nodeAdapter =
+                object : NodeAdapter<InferenceNodeType, InferenceNode> {
+                    override fun containerOf(node: InferenceNode): InferenceNode =
+                        containerNodeOf(node.element) ?: node
 
-            override fun typeOf(node: InferenceNode): InferenceNodeType = node.type
+                    override fun kindOf(node: InferenceNode) = node.kind
 
-            override fun referencedContainerOf(node: InferenceNode): InferenceNode? {
-                return null
-            }
-        },
+                    override fun schemeParameterIndexOf(
+                        node: InferenceNode,
+                        container: InferenceNode
+                    ): Int =
+                        (node as? ResolvedPsiParameterReference)?.let {
+                            if (it.container == container.element) it.index else -1
+                        } ?: -1
 
-        errorReporter = object : ErrorReporter<InferenceNode> {
+                    override fun typeOf(node: InferenceNode): InferenceNodeType = node.type
 
-            /**
-             * Find the `description` value from ComposableTargetMarker if the token refers to an
-             * annotation with the marker or just return [token] if it cannot be found.
-             */
-            private fun descriptionFrom(token: String): String {
-                val fqName = FqName(token)
-                val cls = callContext.moduleDescriptor.findClassAcrossModuleDependencies(
-                    ClassId.topLevel(fqName)
-                )
-                return cls?.let {
-                    it.annotations.findAnnotation(
-                        ComposeFqNames.ComposableTargetMarker
-                    )?.let { marker ->
-                      marker.allValueArguments.firstNotNullOfOrNull { entry ->
-                          val name = entry.key
-                          if (
-                              !name.isSpecial &&
-                              name.identifier == ComposeFqNames.ComposableTargetMarkerDescription
-                          ) {
-                              (entry.value as? StringValue)?.value
-                          } else null
-                      }
+                    override fun referencedContainerOf(node: InferenceNode): InferenceNode? {
+                        return null
                     }
-                } ?: token
-            }
+                },
+            errorReporter =
+                object : ErrorReporter<InferenceNode> {
 
-            override fun reportCallError(node: InferenceNode, expected: String, received: String) {
-                if (expected != received) {
-                    val expectedDescription = descriptionFrom(expected)
-                    val receivedDescription = descriptionFrom(received)
-                    callContext.trace.report(
-                        ComposeErrors.COMPOSE_APPLIER_CALL_MISMATCH.on(
-                            node.element,
-                            expectedDescription,
-                            receivedDescription
+                    /**
+                     * Find the `description` value from ComposableTargetMarker if the token refers
+                     * to an annotation with the marker or just return [token] if it cannot be
+                     * found.
+                     */
+                    private fun descriptionFrom(token: String): String {
+                        val fqName = FqName(token)
+                        val cls =
+                            callContext.moduleDescriptor.findClassAcrossModuleDependencies(
+                                ClassId.topLevel(fqName)
+                            )
+                        return cls?.let {
+                            it.annotations
+                                .findAnnotation(ComposeFqNames.ComposableTargetMarker)
+                                ?.let { marker ->
+                                    marker.allValueArguments.firstNotNullOfOrNull { entry ->
+                                        val name = entry.key
+                                        if (
+                                            !name.isSpecial &&
+                                                name.identifier ==
+                                                    ComposeFqNames.ComposableTargetMarkerDescription
+                                        ) {
+                                            (entry.value as? StringValue)?.value
+                                        } else null
+                                    }
+                                }
+                        } ?: token
+                    }
+
+                    override fun reportCallError(
+                        node: InferenceNode,
+                        expected: String,
+                        received: String
+                    ) {
+                        if (expected != received) {
+                            val expectedDescription = descriptionFrom(expected)
+                            val receivedDescription = descriptionFrom(received)
+                            callContext.trace.report(
+                                ComposeErrors.COMPOSE_APPLIER_CALL_MISMATCH.on(
+                                    node.element,
+                                    expectedDescription,
+                                    receivedDescription
+                                )
+                            )
+                        }
+                    }
+
+                    override fun reportParameterError(
+                        node: InferenceNode,
+                        index: Int,
+                        expected: String,
+                        received: String
+                    ) {
+                        if (expected != received) {
+                            val expectedDescription = descriptionFrom(expected)
+                            val receivedDescription = descriptionFrom(received)
+                            callContext.trace.report(
+                                ComposeErrors.COMPOSE_APPLIER_PARAMETER_MISMATCH.on(
+                                    node.element,
+                                    expectedDescription,
+                                    receivedDescription
+                                )
+                            )
+                        }
+                    }
+
+                    override fun log(node: InferenceNode?, message: String) {
+                        // ignore log messages in the front-end
+                    }
+                },
+            lazySchemeStorage =
+                object : LazySchemeStorage<InferenceNode> {
+                    override fun getLazyScheme(node: InferenceNode): LazyScheme? =
+                        callContext.trace.bindingContext.get(
+                            FrontendWritableSlices.COMPOSE_LAZY_SCHEME,
+                            node.type
                         )
-                    )
-                }
-            }
 
-            override fun reportParameterError(
-                node: InferenceNode,
-                index: Int,
-                expected: String,
-                received: String
-            ) {
-                if (expected != received) {
-                    val expectedDescription = descriptionFrom(expected)
-                    val receivedDescription = descriptionFrom(received)
-                    callContext.trace.report(
-                        ComposeErrors.COMPOSE_APPLIER_PARAMETER_MISMATCH.on(
-                            node.element,
-                            expectedDescription,
-                            receivedDescription
+                    override fun storeLazyScheme(node: InferenceNode, value: LazyScheme) {
+                        callContext.trace.record(
+                            FrontendWritableSlices.COMPOSE_LAZY_SCHEME,
+                            node.type,
+                            value
                         )
-                    )
+                    }
                 }
-            }
-
-            override fun log(node: InferenceNode?, message: String) {
-                // ignore log messages in the front-end
-            }
-        },
-        lazySchemeStorage = object : LazySchemeStorage<InferenceNode> {
-            override fun getLazyScheme(node: InferenceNode): LazyScheme? =
-                callContext.trace.bindingContext.get(
-                    FrontendWritableSlices.COMPOSE_LAZY_SCHEME,
-                    node.type
-                )
-
-            override fun storeLazyScheme(node: InferenceNode, value: LazyScheme) {
-                callContext.trace.record(
-                    FrontendWritableSlices.COMPOSE_LAZY_SCHEME,
-                    node.type,
-                    value
-                )
-            }
-        }
-    )
+        )
 
     override fun registerModuleComponents(
         container: StorageComponentContainer,
@@ -294,21 +323,25 @@
         if (!resolvedCall.isComposableInvocation()) return
         callContext = context
         val bindingContext = callContext.trace.bindingContext
-        val parameters = resolvedCall.candidateDescriptor.valueParameters.filter {
-            (it.type.isFunctionType && it.type.hasComposableAnnotation()) || it.isSamComposable()
-        }
-        val arguments = parameters.map {
-            val argument = resolvedCall.valueArguments.entries.firstOrNull { entry ->
-                entry.key.original == it
-            }?.value
-
-            if (argument is ExpressionValueArgument) {
-                argumentToInferenceNode(it, argument.valueArgument?.asElement() ?: reportOn)
-            } else {
-                // Generate a node that is ignored
-                PsiElementNode(reportOn, bindingContext)
+        val parameters =
+            resolvedCall.candidateDescriptor.valueParameters.filter {
+                (it.type.isFunctionType && it.type.hasComposableAnnotation()) ||
+                    it.isSamComposable()
             }
-        }
+        val arguments =
+            parameters.map {
+                val argument =
+                    resolvedCall.valueArguments.entries
+                        .firstOrNull { entry -> entry.key.original == it }
+                        ?.value
+
+                if (argument is ExpressionValueArgument) {
+                    argumentToInferenceNode(it, argument.valueArgument?.asElement() ?: reportOn)
+                } else {
+                    // Generate a node that is ignored
+                    PsiElementNode(reportOn, bindingContext)
+                }
+            }
         infer.visitCall(
             call = PsiElementNode(reportOn, bindingContext),
             target = resolvedCallToInferenceNode(resolvedCall),
@@ -327,18 +360,20 @@
                 val receiver = resolvedCall.dispatchReceiver
                 val expression = (receiver as? ExpressionReceiver)?.expression
                 val referenceExpression = expression as? KtReferenceExpression
-                val candidate = referenceExpression?.let { r ->
-                    val callableReference =
-                        callContext.trace[BindingContext.REFERENCE_TARGET, r] as?
-                            CallableDescriptor
-                    callableReference?.let { reference ->
-                        descriptorToInferenceNode(reference, resolvedCall.call.callElement)
+                val candidate =
+                    referenceExpression?.let { r ->
+                        val callableReference =
+                            callContext.trace[BindingContext.REFERENCE_TARGET, r]
+                                as? CallableDescriptor
+                        callableReference?.let { reference ->
+                            descriptorToInferenceNode(reference, resolvedCall.call.callElement)
+                        }
                     }
-                }
-                candidate ?: descriptorToInferenceNode(
-                    resolvedCall.resultingDescriptor,
-                    resolvedCall.call.callElement
-                )
+                candidate
+                    ?: descriptorToInferenceNode(
+                        resolvedCall.resultingDescriptor,
+                        resolvedCall.call.callElement
+                    )
             }
         }
 
@@ -357,29 +392,31 @@
     private fun lambdaOrNull(element: PsiElement): KtFunctionLiteral? {
         var container = (element as? KtLambdaArgument)?.children?.singleOrNull()
         while (true) {
-            container = when (container) {
-                null -> return null
-                is KtLabeledExpression -> container.lastChild
-                is KtFunctionLiteral -> return container
-                is KtLambdaExpression -> container.children.single()
-                else -> throw Error("Unknown type: ${container.javaClass}")
-            }
+            container =
+                when (container) {
+                    null -> return null
+                    is KtLabeledExpression -> container.lastChild
+                    is KtFunctionLiteral -> return container
+                    is KtLambdaExpression -> container.children.single()
+                    else -> throw Error("Unknown type: ${container.javaClass}")
+                }
         }
     }
 
     private fun descriptorToInferenceNode(
         descriptor: CallableDescriptor,
         element: PsiElement
-    ): InferenceNode = when (descriptor) {
-        is ValueParameterDescriptor -> parameterDescriptorToInferenceNode(descriptor, element)
-        else -> {
-            // If this is a call to the accessor of the variable find the original descriptor
-            val original = descriptor.original
-            if (original is ValueParameterDescriptor)
-                parameterDescriptorToInferenceNode(original, element)
-            else ResolvedPsiElementNode(element, InferenceDescriptorType(descriptor))
+    ): InferenceNode =
+        when (descriptor) {
+            is ValueParameterDescriptor -> parameterDescriptorToInferenceNode(descriptor, element)
+            else -> {
+                // If this is a call to the accessor of the variable find the original descriptor
+                val original = descriptor.original
+                if (original is ValueParameterDescriptor)
+                    parameterDescriptorToInferenceNode(original, element)
+                else ResolvedPsiElementNode(element, InferenceDescriptorType(descriptor))
+            }
         }
-    }
 
     private fun parameterDescriptorToInferenceNode(
         descriptor: ValueParameterDescriptor,
@@ -400,10 +437,9 @@
             val type = currentContainer.type
             if (type.isTypeFor(declaration)) {
                 val index =
-                    declaration.valueParameters.filter {
-                        it.isComposableCallable(bindingContext) ||
-                            it.isSamComposable()
-                    }.indexOf(descriptor)
+                    declaration.valueParameters
+                        .filter { it.isComposableCallable(bindingContext) || it.isSamComposable() }
+                        .indexOf(descriptor)
                 return ResolvedPsiParameterReference(
                     element,
                     InferenceDescriptorType(descriptor),
@@ -432,20 +468,24 @@
 internal fun CallableDescriptor.toScheme(callContext: CallCheckerContext?): Scheme =
     scheme()
         ?: Scheme(
-            target = schemeItem().let {
-                // The item is unspecified see if the containing has an annotation we can use
-                if (it.isUnspecified) {
-                    val target = callContext?.let { context -> fileScopeTarget(context) }
-                    if (target != null) return@let target
-                }
-                it
-            },
-            parameters = valueParameters.filter {
-                it.type.hasComposableAnnotation() || it.isSamComposable()
-            }.map {
-                it.samComposableOrNull()?.toScheme(callContext) ?: it.type.toScheme()
-            }
-        ).mergeWith(overriddenDescriptors.map { it.toScheme(null) })
+                target =
+                    schemeItem().let {
+                        // The item is unspecified see if the containing has an annotation we can
+                        // use
+                        if (it.isUnspecified) {
+                            val target = callContext?.let { context -> fileScopeTarget(context) }
+                            if (target != null) return@let target
+                        }
+                        it
+                    },
+                parameters =
+                    valueParameters
+                        .filter { it.type.hasComposableAnnotation() || it.isSamComposable() }
+                        .map {
+                            it.samComposableOrNull()?.toScheme(callContext) ?: it.type.toScheme()
+                        }
+            )
+            .mergeWith(overriddenDescriptors.map { it.toScheme(null) })
 
 private fun CallableDescriptor.fileScopeTarget(callContext: CallCheckerContext): Item? =
     (psiElement?.containingFile as? KtFile)?.let {
@@ -459,10 +499,12 @@
         null
     }
 
-private fun KotlinType.toScheme(): Scheme = Scheme(
-    target = schemeItem(),
-    parameters = arguments.filter { it.type.hasComposableAnnotation() }.map { it.type.toScheme() }
-)
+private fun KotlinType.toScheme(): Scheme =
+    Scheme(
+        target = schemeItem(),
+        parameters =
+            arguments.filter { it.type.hasComposableAnnotation() }.map { it.type.toScheme() }
+    )
 
 private fun ValueParameterDescriptor.samComposableOrNull() =
     (type.constructor.declarationDescriptor as? ClassDescriptor)?.let {
diff --git a/compose/compiler/compiler-hosted/src/main/java/androidx/compose/compiler/plugins/kotlin/k1/ComposeDiagnosticSuppressor.kt b/compose/compiler/compiler-hosted/src/main/java/androidx/compose/compiler/plugins/kotlin/k1/ComposeDiagnosticSuppressor.kt
index fc11167..56ca5d1 100644
--- a/compose/compiler/compiler-hosted/src/main/java/androidx/compose/compiler/plugins/kotlin/k1/ComposeDiagnosticSuppressor.kt
+++ b/compose/compiler/compiler-hosted/src/main/java/androidx/compose/compiler/plugins/kotlin/k1/ComposeDiagnosticSuppressor.kt
@@ -30,12 +30,10 @@
 open class ComposeDiagnosticSuppressor : DiagnosticSuppressor {
 
     companion object {
-        fun registerExtension(
-            project: Project,
-            extension: DiagnosticSuppressor
-        ) {
+        fun registerExtension(project: Project, extension: DiagnosticSuppressor) {
             @Suppress("DEPRECATION")
-            Extensions.getRootArea().getExtensionPoint(DiagnosticSuppressor.EP_NAME)
+            Extensions.getRootArea()
+                .getExtensionPoint(DiagnosticSuppressor.EP_NAME)
                 .registerExtension(extension, project)
         }
     }
@@ -46,11 +44,8 @@
 
     override fun isSuppressed(diagnostic: Diagnostic, bindingContext: BindingContext?): Boolean {
         if (diagnostic.factory == Errors.NON_SOURCE_ANNOTATION_ON_INLINED_LAMBDA_EXPRESSION) {
-            for (
-                entry in (
-                    diagnostic.psiElement.parent as KtAnnotatedExpression
-                    ).annotationEntries
-            ) {
+            for (entry in
+                (diagnostic.psiElement.parent as KtAnnotatedExpression).annotationEntries) {
                 if (bindingContext != null) {
                     val annotation = bindingContext.get(BindingContext.ANNOTATION, entry)
                     if (annotation != null && annotation.isComposableAnnotation) return true
@@ -61,8 +56,10 @@
         }
         if (diagnostic.factory == Errors.NAMED_ARGUMENTS_NOT_ALLOWED) {
             if (bindingContext != null) {
-                val call = (diagnostic.psiElement.parent.parent.parent.parent as KtCallExpression)
-                    .getCall(bindingContext).getResolvedCall(bindingContext)
+                val call =
+                    (diagnostic.psiElement.parent.parent.parent.parent as KtCallExpression)
+                        .getCall(bindingContext)
+                        .getResolvedCall(bindingContext)
                 if (call != null) {
                     return call.isComposableInvocation()
                 }
diff --git a/compose/compiler/compiler-hosted/src/main/java/androidx/compose/compiler/plugins/kotlin/k1/ComposeErrorMessages.kt b/compose/compiler/compiler-hosted/src/main/java/androidx/compose/compiler/plugins/kotlin/k1/ComposeErrorMessages.kt
index a031d53..3de8907 100644
--- a/compose/compiler/compiler-hosted/src/main/java/androidx/compose/compiler/plugins/kotlin/k1/ComposeErrorMessages.kt
+++ b/compose/compiler/compiler-hosted/src/main/java/androidx/compose/compiler/plugins/kotlin/k1/ComposeErrorMessages.kt
@@ -23,10 +23,8 @@
 import org.jetbrains.kotlin.diagnostics.rendering.Renderers.RENDER_TYPE_WITH_ANNOTATIONS
 
 class ComposeErrorMessages : DefaultErrorMessages.Extension {
-    private val MAP =
-        DiagnosticFactoryToRendererMap(
-            "Compose"
-        )
+    private val MAP = DiagnosticFactoryToRendererMap("Compose")
+
     override fun getMap() = MAP
 
     init {
@@ -76,9 +74,7 @@
         MAP.put(
             ComposeErrors.CONFLICTING_OVERLOADS,
             "@Composable annotation mismatch with overridden function: {0}",
-            CommonRenderers.commaSeparated(
-                Renderers.FQ_NAMES_IN_TYPES_WITH_ANNOTATIONS
-            )
+            CommonRenderers.commaSeparated(Renderers.FQ_NAMES_IN_TYPES_WITH_ANNOTATIONS)
         )
 
         MAP.put(
@@ -136,7 +132,7 @@
         MAP.put(
             ComposeErrors.NAMED_ARGUMENTS_NOT_ALLOWED,
             "Named arguments in composable function types are deprecated." +
-            " This will become an error in Kotlin 2.0"
+                " This will become an error in Kotlin 2.0"
         )
     }
 }
diff --git a/compose/compiler/compiler-hosted/src/main/java/androidx/compose/compiler/plugins/kotlin/k1/ComposeErrors.kt b/compose/compiler/compiler-hosted/src/main/java/androidx/compose/compiler/plugins/kotlin/k1/ComposeErrors.kt
index 127ec56..d6b2e60 100644
--- a/compose/compiler/compiler-hosted/src/main/java/androidx/compose/compiler/plugins/kotlin/k1/ComposeErrors.kt
+++ b/compose/compiler/compiler-hosted/src/main/java/androidx/compose/compiler/plugins/kotlin/k1/ComposeErrors.kt
@@ -34,48 +34,23 @@
 object ComposeErrors {
 
     // error goes on the composable call in a non-composable function
-    @JvmField
-    val COMPOSABLE_INVOCATION =
-        DiagnosticFactory0.create<PsiElement>(
-            Severity.ERROR
-        )
+    @JvmField val COMPOSABLE_INVOCATION = DiagnosticFactory0.create<PsiElement>(Severity.ERROR)
 
     // error goes on the non-composable function with composable calls
-    @JvmField
-    val COMPOSABLE_EXPECTED =
-        DiagnosticFactory0.create<PsiElement>(
-            Severity.ERROR
-        )
+    @JvmField val COMPOSABLE_EXPECTED = DiagnosticFactory0.create<PsiElement>(Severity.ERROR)
 
     @JvmField
     val COMPOSABLE_FUNCTION_REFERENCE =
-        DiagnosticFactory0.create<KtCallableReferenceExpression>(
-            Severity.ERROR
-        )
+        DiagnosticFactory0.create<KtCallableReferenceExpression>(Severity.ERROR)
 
     @JvmField
-    val COMPOSABLE_PROPERTY_BACKING_FIELD =
-        DiagnosticFactory0.create<PsiElement>(
-            Severity.ERROR
-        )
+    val COMPOSABLE_PROPERTY_BACKING_FIELD = DiagnosticFactory0.create<PsiElement>(Severity.ERROR)
 
-    @JvmField
-    val COMPOSABLE_VAR =
-        DiagnosticFactory0.create<PsiElement>(
-            Severity.ERROR
-        )
+    @JvmField val COMPOSABLE_VAR = DiagnosticFactory0.create<PsiElement>(Severity.ERROR)
 
-    @JvmField
-    val COMPOSABLE_SUSPEND_FUN =
-        DiagnosticFactory0.create<PsiElement>(
-            Severity.ERROR
-        )
+    @JvmField val COMPOSABLE_SUSPEND_FUN = DiagnosticFactory0.create<PsiElement>(Severity.ERROR)
 
-    @JvmField
-    val COMPOSABLE_FUN_MAIN =
-        DiagnosticFactory0.create<PsiElement>(
-            Severity.ERROR
-        )
+    @JvmField val COMPOSABLE_FUN_MAIN = DiagnosticFactory0.create<PsiElement>(Severity.ERROR)
 
     @JvmField
     val CAPTURED_COMPOSABLE_INVOCATION =
@@ -90,72 +65,51 @@
             ValueParameterDescriptor, // unmarked
             ValueParameterDescriptor, // marked
             CallableDescriptor
-            >(
+        >(
             Severity.ERROR
         )
 
     @JvmField
-    val NONREADONLY_CALL_IN_READONLY_COMPOSABLE = DiagnosticFactory0.create<PsiElement>(
-        Severity.ERROR
-    )
+    val NONREADONLY_CALL_IN_READONLY_COMPOSABLE =
+        DiagnosticFactory0.create<PsiElement>(Severity.ERROR)
 
     // This error matches Kotlin's CONFLICTING_OVERLOADS error, except that it renders the
     // annotations with the descriptor. This is important to use for errors where the
     // only difference is whether or not it is annotated with @Composable or not.
     @JvmField
     val CONFLICTING_OVERLOADS: DiagnosticFactory1<PsiElement, Collection<DeclarationDescriptor>> =
-        DiagnosticFactory1.create(
-            Severity.ERROR,
-            DECLARATION_SIGNATURE_OR_DEFAULT
-        )
+        DiagnosticFactory1.create(Severity.ERROR, DECLARATION_SIGNATURE_OR_DEFAULT)
 
     @JvmField
-    val ILLEGAL_TRY_CATCH_AROUND_COMPOSABLE =
-        DiagnosticFactory0.create<PsiElement>(
-            Severity.ERROR
-        )
+    val ILLEGAL_TRY_CATCH_AROUND_COMPOSABLE = DiagnosticFactory0.create<PsiElement>(Severity.ERROR)
 
     // This error matches Kotlin's TYPE_MISMATCH error, except that it renders the annotations
     // with the types. This is important to use for type mismatch errors where the only
     // difference is whether or not it is annotated with @Composable or not.
     @JvmField
     val TYPE_MISMATCH =
-        DiagnosticFactory2.create<KtExpression, KotlinType, KotlinType>(
-            Severity.ERROR
-        )
+        DiagnosticFactory2.create<KtExpression, KotlinType, KotlinType>(Severity.ERROR)
 
     @JvmField
     val COMPOSE_APPLIER_CALL_MISMATCH =
-        DiagnosticFactory2.create<PsiElement, String, String>(
-            Severity.WARNING
-        )
+        DiagnosticFactory2.create<PsiElement, String, String>(Severity.WARNING)
 
     @JvmField
     val COMPOSE_APPLIER_PARAMETER_MISMATCH =
-        DiagnosticFactory2.create<PsiElement, String, String>(
-            Severity.WARNING
-        )
+        DiagnosticFactory2.create<PsiElement, String, String>(Severity.WARNING)
 
     @JvmField
     val COMPOSE_APPLIER_DECLARATION_MISMATCH =
-        DiagnosticFactory0.create<PsiElement>(
-            Severity.WARNING
-        )
+        DiagnosticFactory0.create<PsiElement>(Severity.WARNING)
 
-    @JvmField
-    val COMPOSE_INVALID_DELEGATE =
-        DiagnosticFactory0.create<PsiElement>(
-            Severity.ERROR
-        )
+    @JvmField val COMPOSE_INVALID_DELEGATE = DiagnosticFactory0.create<PsiElement>(Severity.ERROR)
 
     @JvmField
     val NAMED_ARGUMENTS_NOT_ALLOWED = DiagnosticFactory0.create<PsiElement>(Severity.WARNING)
 
     @JvmField
     val MISMATCHED_COMPOSABLE_IN_EXPECT_ACTUAL =
-        DiagnosticFactory0.create<PsiElement>(
-            Severity.ERROR
-        )
+        DiagnosticFactory0.create<PsiElement>(Severity.ERROR)
 
     @JvmField
     val REDUNDANT_COMPOSABLE_ANNOTATION = DiagnosticFactory0.create<PsiElement>(Severity.WARNING)
diff --git a/compose/compiler/compiler-hosted/src/main/java/androidx/compose/compiler/plugins/kotlin/k1/ComposeTypeResolutionInterceptorExtension.kt b/compose/compiler/compiler-hosted/src/main/java/androidx/compose/compiler/plugins/kotlin/k1/ComposeTypeResolutionInterceptorExtension.kt
index 3b11e81..be181c6 100644
--- a/compose/compiler/compiler-hosted/src/main/java/androidx/compose/compiler/plugins/kotlin/k1/ComposeTypeResolutionInterceptorExtension.kt
+++ b/compose/compiler/compiler-hosted/src/main/java/androidx/compose/compiler/plugins/kotlin/k1/ComposeTypeResolutionInterceptorExtension.kt
@@ -26,9 +26,7 @@
 import org.jetbrains.kotlin.types.TypeUtils
 import org.jetbrains.kotlin.types.expressions.ExpressionTypingContext
 
-/**
- * If a lambda is marked as `@Composable`, then the inferred type should become `@Composable`
- */
+/** If a lambda is marked as `@Composable`, then the inferred type should become `@Composable` */
 @Suppress("INVISIBLE_REFERENCE", "EXPERIMENTAL_IS_NOT_ENABLED")
 @OptIn(org.jetbrains.kotlin.extensions.internal.InternalNonStableExtensionPoints::class)
 open class ComposeTypeResolutionInterceptorExtension : TypeResolutionInterceptorExtension {
@@ -40,8 +38,8 @@
     ): AnonymousFunctionDescriptor =
         if (
             !descriptor.isSuspend &&
-            !descriptor.hasComposableAnnotation() &&
-            context.hasComposableExpectedType(expression)
+                !descriptor.hasComposableAnnotation() &&
+                context.hasComposableExpectedType(expression)
         ) {
             // If the expected type has an @Composable annotation then the literal function
             // expression should infer a an @Composable annotation
@@ -67,7 +65,7 @@
 
         if (
             element.getAnnotationEntries().hasComposableAnnotation(context.trace.bindingContext) ||
-            context.hasComposableExpectedType(element)
+                context.hasComposableExpectedType(element)
         ) {
             context.trace.record(FrontendWritableSlices.INFERRED_COMPOSABLE_LITERAL, element, true)
             return resultType.makeComposable(context.scope.ownerDescriptor.module)
diff --git a/compose/compiler/compiler-hosted/src/main/java/androidx/compose/compiler/plugins/kotlin/k2/ComposableCallChecker.kt b/compose/compiler/compiler-hosted/src/main/java/androidx/compose/compiler/plugins/kotlin/k2/ComposableCallChecker.kt
index 4465723..12adb6b 100644
--- a/compose/compiler/compiler-hosted/src/main/java/androidx/compose/compiler/plugins/kotlin/k2/ComposableCallChecker.kt
+++ b/compose/compiler/compiler-hosted/src/main/java/androidx/compose/compiler/plugins/kotlin/k2/ComposableCallChecker.kt
@@ -59,8 +59,7 @@
         context: CheckerContext,
         reporter: DiagnosticReporter
     ) {
-        val calleeFunction = expression.calleeReference.toResolvedCallableSymbol()
-            ?: return
+        val calleeFunction = expression.calleeReference.toResolvedCallableSymbol() ?: return
         if (calleeFunction.isComposable(context.session)) {
             checkComposableCall(expression, calleeFunction, context, reporter)
         }
@@ -73,8 +72,7 @@
         context: CheckerContext,
         reporter: DiagnosticReporter
     ) {
-        val calleeFunction = expression.calleeReference.toResolvedCallableSymbol()
-            ?: return
+        val calleeFunction = expression.calleeReference.toResolvedCallableSymbol() ?: return
 
         // K2 propagates annotation from the fun interface method to the constructor.
         // https://youtrack.jetbrains.com/issue/KT-47708.
@@ -89,14 +87,13 @@
 }
 
 /**
- * Check if `expression` - a call to a composable function or access to a composable property -
- * is allowed in the current context. It is allowed if:
- *
+ * Check if `expression` - a call to a composable function or access to a composable property - is
+ * allowed in the current context. It is allowed if:
  * - It is executed as part of the body of a composable function.
  * - It is not executed as part of the body of a lambda annotated with `@DisallowComposableCalls`.
  * - It is not inside of a `try` block.
- * - It is a call to a readonly composable function if it is executed in the body of a function
- *   that is annotated with `@ReadOnlyComposable`.
+ * - It is a call to a readonly composable function if it is executed in the body of a function that
+ *   is annotated with `@ReadOnlyComposable`.
  *
  * A function is composable if:
  * - It is annotated with `@Composable`.
@@ -125,8 +122,10 @@
             if (function.typeRef.coneType.functionTypeKind(context.session) === ComposableFunction)
                 return
             val functionPsi = function.psi
-            if (functionPsi is KtFunctionLiteral || functionPsi is KtLambdaExpression ||
-                functionPsi !is KtFunction
+            if (
+                functionPsi is KtFunctionLiteral ||
+                    functionPsi is KtLambdaExpression ||
+                    functionPsi !is KtFunction
             ) {
                 return@visitCurrentScope
             }
@@ -136,7 +135,8 @@
                 } else {
                     null
                 }
-            if (checkComposableFunction(
+            if (
+                checkComposableFunction(
                     function,
                     nonReadOnlyCalleeReference,
                     context,
@@ -153,7 +153,8 @@
                 } else {
                     null
                 }
-            if (checkComposableFunction(
+            if (
+                checkComposableFunction(
                     function,
                     nonReadOnlyCalleeReference,
                     context,
@@ -188,9 +189,9 @@
 }
 
 /**
- * This function will be called by [visitCurrentScope], and this function determines
- * whether it will continue the composable element check for the scope or not
- * by returning [ComposableCheckForScopeStatus].
+ * This function will be called by [visitCurrentScope], and this function determines whether it will
+ * continue the composable element check for the scope or not by returning
+ * [ComposableCheckForScopeStatus].
  */
 private fun checkComposableFunction(
     function: FirFunction,
@@ -204,7 +205,7 @@
     if (function.hasComposableAnnotation(context.session)) {
         if (
             function.hasReadOnlyComposableAnnotation(context.session) &&
-            nonReadOnlyCallInsideFunction != null
+                nonReadOnlyCallInsideFunction != null
         ) {
             reporter.reportOn(
                 nonReadOnlyCallInsideFunction,
@@ -218,11 +219,7 @@
     // The only call this could be is a getValue/setValue in the synthesized getter/setter.
     if (function is FirPropertyAccessor && function.propertySymbol.hasDelegate) {
         if (function.propertySymbol.isVar) {
-            reporter.reportOn(
-                function.source,
-                ComposeErrors.COMPOSE_INVALID_DELEGATE,
-                context
-            )
+            reporter.reportOn(function.source, ComposeErrors.COMPOSE_INVALID_DELEGATE, context)
         }
         // Only local variables can be implicitly composable, for top-level or class-level
         // declarations we require an explicit annotation.
@@ -236,19 +233,20 @@
         return ComposableCheckForScopeStatus.STOP
     }
     // We've found a non-composable function which contains a composable call.
-    val source = if (function is FirPropertyAccessor) {
-        function.propertySymbol.source
-    } else {
-        function.source
-    }
+    val source =
+        if (function is FirPropertyAccessor) {
+            function.propertySymbol.source
+        } else {
+            function.source
+        }
     reporter.reportOn(source, ComposeErrors.COMPOSABLE_EXPECTED, context)
     return ComposableCheckForScopeStatus.CONTINUE
 }
 
 /**
- * Reports an error if we are invoking a lambda parameter of an inline function in a context
- * where composable calls are not allowed, unless the lambda parameter is itself annotated
- * with `@DisallowComposableCalls`.
+ * Reports an error if we are invoking a lambda parameter of an inline function in a context where
+ * composable calls are not allowed, unless the lambda parameter is itself annotated with
+ * `@DisallowComposableCalls`.
  */
 private fun checkInvoke(
     expression: FirQualifiedAccessExpression,
@@ -256,12 +254,14 @@
     reporter: DiagnosticReporter
 ) {
     // Check that we're invoking a value parameter of an inline function
-    val param = (expression.dispatchReceiver as? FirPropertyAccessExpression)
-        ?.calleeReference
-        ?.toResolvedValueParameterSymbol()
-        ?: return
-    if (param.resolvedReturnTypeRef.hasDisallowComposableCallsAnnotation(context.session) ||
-        !param.containingFunctionSymbol.isInline) {
+    val param =
+        (expression.dispatchReceiver as? FirPropertyAccessExpression)
+            ?.calleeReference
+            ?.toResolvedValueParameterSymbol() ?: return
+    if (
+        param.resolvedReturnTypeRef.hasDisallowComposableCallsAnnotation(context.session) ||
+            !param.containingFunctionSymbol.isInline
+    ) {
         return
     }
 
@@ -282,8 +282,8 @@
 }
 
 /**
- * Visits all (Anonymous)Functions and `try` expressions in the current scope until it finds
- * a declaration that introduces a new scope. Elements are visited from innermost to outermost.
+ * Visits all (Anonymous)Functions and `try` expressions in the current scope until it finds a
+ * declaration that introduces a new scope. Elements are visited from innermost to outermost.
  */
 private inline fun CheckerContext.visitCurrentScope(
     visitInlineLambdaParameter: (FirValueParameter) -> Unit,
@@ -309,8 +309,7 @@
                 return
             }
             is FirTryExpression -> {
-                val container = containingElements.getOrNull(elementIndex + 1)
-                    ?: continue
+                val container = containingElements.getOrNull(elementIndex + 1) ?: continue
                 visitTryExpression(element, container)
             }
             is FirProperty -> {
@@ -321,7 +320,8 @@
                 // We're coming from a default value in a function declaration, we need to
                 // look at the enclosing function.
             }
-            is FirAnonymousObject, is FirAnonymousInitializer -> {
+            is FirAnonymousObject,
+            is FirAnonymousInitializer -> {
                 // Anonymous objects don't change the current scope, continue.
             }
             is FirField -> {
@@ -342,9 +342,10 @@
 private fun CheckerContext.findValueParameterForLambdaAtIndex(
     elementIndex: Int
 ): FirValueParameter? {
-    val argument = containingElements.getOrNull(elementIndex - 1) as? FirLambdaArgumentExpression
-        ?: return null
-    val argumentList = containingElements.getOrNull(elementIndex - 2) as? FirResolvedArgumentList
-        ?: return null
+    val argument =
+        containingElements.getOrNull(elementIndex - 1) as? FirLambdaArgumentExpression
+            ?: return null
+    val argumentList =
+        containingElements.getOrNull(elementIndex - 2) as? FirResolvedArgumentList ?: return null
     return argumentList.mapping[argument]
 }
diff --git a/compose/compiler/compiler-hosted/src/main/java/androidx/compose/compiler/plugins/kotlin/k2/ComposableCallableReferenceChecker.kt b/compose/compiler/compiler-hosted/src/main/java/androidx/compose/compiler/plugins/kotlin/k2/ComposableCallableReferenceChecker.kt
index f7aa35c..366f0ec 100644
--- a/compose/compiler/compiler-hosted/src/main/java/androidx/compose/compiler/plugins/kotlin/k2/ComposableCallableReferenceChecker.kt
+++ b/compose/compiler/compiler-hosted/src/main/java/androidx/compose/compiler/plugins/kotlin/k2/ComposableCallableReferenceChecker.kt
@@ -28,9 +28,9 @@
  * Report an error on composable function references.
  *
  * `FirFunctionTypeKindExtension` has very limited support for custom function references and
- * basically requires implementations to distinguish between reflective and non-reflective
- * function types. Since there are no reflective composable function types we cannot support
- * composable function references yet.
+ * basically requires implementations to distinguish between reflective and non-reflective function
+ * types. Since there are no reflective composable function types we cannot support composable
+ * function references yet.
  */
 object ComposableCallableReferenceChecker : FirCallableReferenceAccessChecker() {
     override fun check(
diff --git a/compose/compiler/compiler-hosted/src/main/java/androidx/compose/compiler/plugins/kotlin/k2/ComposableFunctionChecker.kt b/compose/compiler/compiler-hosted/src/main/java/androidx/compose/compiler/plugins/kotlin/k2/ComposableFunctionChecker.kt
index 2d4c3998c..11ebd02 100644
--- a/compose/compiler/compiler-hosted/src/main/java/androidx/compose/compiler/plugins/kotlin/k2/ComposableFunctionChecker.kt
+++ b/compose/compiler/compiler-hosted/src/main/java/androidx/compose/compiler/plugins/kotlin/k2/ComposableFunctionChecker.kt
@@ -74,8 +74,9 @@
         }
 
         // Disallow composable setValue operators
-        if (declaration.isOperator &&
-            declaration.nameOrSpecialName == OperatorNameConventions.SET_VALUE
+        if (
+            declaration.isOperator &&
+                declaration.nameOrSpecialName == OperatorNameConventions.SET_VALUE
         ) {
             reporter.reportOn(declaration.source, ComposeErrors.COMPOSE_INVALID_DELEGATE, context)
         }
diff --git a/compose/compiler/compiler-hosted/src/main/java/androidx/compose/compiler/plugins/kotlin/k2/ComposablePropertyChecker.kt b/compose/compiler/compiler-hosted/src/main/java/androidx/compose/compiler/plugins/kotlin/k2/ComposablePropertyChecker.kt
index eb11c28..bed40a4 100644
--- a/compose/compiler/compiler-hosted/src/main/java/androidx/compose/compiler/plugins/kotlin/k2/ComposablePropertyChecker.kt
+++ b/compose/compiler/compiler-hosted/src/main/java/androidx/compose/compiler/plugins/kotlin/k2/ComposablePropertyChecker.kt
@@ -31,8 +31,10 @@
     ) {
         // `@Composable` is only applicable to property getters, but in K1 we were also checking
         // properties with the annotation on the setter.
-        if (declaration.getter?.hasComposableAnnotation(context.session) != true &&
-            declaration.setter?.hasComposableAnnotation(context.session) != true) {
+        if (
+            declaration.getter?.hasComposableAnnotation(context.session) != true &&
+                declaration.setter?.hasComposableAnnotation(context.session) != true
+        ) {
             return
         }
 
diff --git a/compose/compiler/compiler-hosted/src/main/java/androidx/compose/compiler/plugins/kotlin/k2/ComposeErrorMessages.kt b/compose/compiler/compiler-hosted/src/main/java/androidx/compose/compiler/plugins/kotlin/k2/ComposeErrorMessages.kt
index 0a9b030..1f5e9c4 100644
--- a/compose/compiler/compiler-hosted/src/main/java/androidx/compose/compiler/plugins/kotlin/k2/ComposeErrorMessages.kt
+++ b/compose/compiler/compiler-hosted/src/main/java/androidx/compose/compiler/plugins/kotlin/k2/ComposeErrorMessages.kt
@@ -21,78 +21,79 @@
 import org.jetbrains.kotlin.fir.analysis.diagnostics.FirDiagnosticRenderers
 
 object ComposeErrorMessages : BaseDiagnosticRendererFactory() {
-    override val MAP = KtDiagnosticFactoryToRendererMap("Compose").also { map ->
-        map.put(
-            ComposeErrors.COMPOSABLE_INVOCATION,
-            "@Composable invocations can only happen from the context of a @Composable function"
-        )
+    override val MAP =
+        KtDiagnosticFactoryToRendererMap("Compose").also { map ->
+            map.put(
+                ComposeErrors.COMPOSABLE_INVOCATION,
+                "@Composable invocations can only happen from the context of a @Composable function"
+            )
 
-        map.put(
-            ComposeErrors.COMPOSABLE_EXPECTED,
-            "Functions which invoke @Composable functions must be marked with the @Composable " +
-                "annotation"
-        )
+            map.put(
+                ComposeErrors.COMPOSABLE_EXPECTED,
+                "Functions which invoke @Composable functions must be marked with the @Composable " +
+                    "annotation"
+            )
 
-        map.put(
-            ComposeErrors.NONREADONLY_CALL_IN_READONLY_COMPOSABLE,
-            "Composables marked with @ReadOnlyComposable can only call other @ReadOnlyComposable " +
-                "composables"
-        )
+            map.put(
+                ComposeErrors.NONREADONLY_CALL_IN_READONLY_COMPOSABLE,
+                "Composables marked with @ReadOnlyComposable can only call other @ReadOnlyComposable " +
+                    "composables"
+            )
 
-        map.put(
-            ComposeErrors.CAPTURED_COMPOSABLE_INVOCATION,
-            "Composable calls are not allowed inside the {0} parameter of {1}",
-            FirDiagnosticRenderers.VARIABLE_NAME,
-            FirDiagnosticRenderers.DECLARATION_NAME
-        )
+            map.put(
+                ComposeErrors.CAPTURED_COMPOSABLE_INVOCATION,
+                "Composable calls are not allowed inside the {0} parameter of {1}",
+                FirDiagnosticRenderers.VARIABLE_NAME,
+                FirDiagnosticRenderers.DECLARATION_NAME
+            )
 
-        map.put(
-            ComposeErrors.ILLEGAL_TRY_CATCH_AROUND_COMPOSABLE,
-            "Try catch is not supported around composable function invocations."
-        )
+            map.put(
+                ComposeErrors.ILLEGAL_TRY_CATCH_AROUND_COMPOSABLE,
+                "Try catch is not supported around composable function invocations."
+            )
 
-        map.put(
-            ComposeErrors.MISSING_DISALLOW_COMPOSABLE_CALLS_ANNOTATION,
-            "Parameter {0} cannot be inlined inside of lambda argument {1} of {2} " +
-                "without also being annotated with @DisallowComposableCalls",
-            FirDiagnosticRenderers.VARIABLE_NAME,
-            FirDiagnosticRenderers.VARIABLE_NAME,
-            FirDiagnosticRenderers.DECLARATION_NAME,
-        )
+            map.put(
+                ComposeErrors.MISSING_DISALLOW_COMPOSABLE_CALLS_ANNOTATION,
+                "Parameter {0} cannot be inlined inside of lambda argument {1} of {2} " +
+                    "without also being annotated with @DisallowComposableCalls",
+                FirDiagnosticRenderers.VARIABLE_NAME,
+                FirDiagnosticRenderers.VARIABLE_NAME,
+                FirDiagnosticRenderers.DECLARATION_NAME,
+            )
 
-        map.put(
-            ComposeErrors.COMPOSABLE_SUSPEND_FUN,
-            "Composable function cannot be annotated as suspend"
-        )
+            map.put(
+                ComposeErrors.COMPOSABLE_SUSPEND_FUN,
+                "Composable function cannot be annotated as suspend"
+            )
 
-        map.put(
-            ComposeErrors.COMPOSABLE_FUN_MAIN,
-            "Composable main functions are not currently supported"
-        )
+            map.put(
+                ComposeErrors.COMPOSABLE_FUN_MAIN,
+                "Composable main functions are not currently supported"
+            )
 
-        map.put(
-            ComposeErrors.COMPOSABLE_FUNCTION_REFERENCE,
-            "Function References of @Composable functions are not currently supported"
-        )
+            map.put(
+                ComposeErrors.COMPOSABLE_FUNCTION_REFERENCE,
+                "Function References of @Composable functions are not currently supported"
+            )
 
-        map.put(
-            ComposeErrors.COMPOSABLE_PROPERTY_BACKING_FIELD,
-            "Composable properties are not able to have backing fields"
-        )
+            map.put(
+                ComposeErrors.COMPOSABLE_PROPERTY_BACKING_FIELD,
+                "Composable properties are not able to have backing fields"
+            )
 
-        map.put(
-            ComposeErrors.COMPOSABLE_VAR,
-            "Composable properties are not able to have backing fields"
-        )
+            map.put(
+                ComposeErrors.COMPOSABLE_VAR,
+                "Composable properties are not able to have backing fields"
+            )
 
-        map.put(
-            ComposeErrors.COMPOSE_INVALID_DELEGATE,
-            "Composable setValue operator is not currently supported."
-        )
+            map.put(
+                ComposeErrors.COMPOSE_INVALID_DELEGATE,
+                "Composable setValue operator is not currently supported."
+            )
 
-        map.put(
-            ComposeErrors.MISMATCHED_COMPOSABLE_IN_EXPECT_ACTUAL,
-            "Mismatched @Composable annotation between expect and actual declaration"
-        )
-    }
+            map.put(
+                ComposeErrors.MISMATCHED_COMPOSABLE_IN_EXPECT_ACTUAL,
+                "Mismatched @Composable annotation between expect and actual declaration"
+            )
+        }
 }
diff --git a/compose/compiler/compiler-hosted/src/main/java/androidx/compose/compiler/plugins/kotlin/k2/ComposeErrors.kt b/compose/compiler/compiler-hosted/src/main/java/androidx/compose/compiler/plugins/kotlin/k2/ComposeErrors.kt
index 4da5a19..2b48bd7 100644
--- a/compose/compiler/compiler-hosted/src/main/java/androidx/compose/compiler/plugins/kotlin/k2/ComposeErrors.kt
+++ b/compose/compiler/compiler-hosted/src/main/java/androidx/compose/compiler/plugins/kotlin/k2/ComposeErrors.kt
@@ -44,9 +44,8 @@
     val COMPOSABLE_INVOCATION by error0<PsiElement>()
 
     // error goes on the non-composable function with composable calls
-    val COMPOSABLE_EXPECTED by error0<PsiElement>(
-        SourceElementPositioningStrategies.DECLARATION_NAME
-    )
+    val COMPOSABLE_EXPECTED by
+        error0<PsiElement>(SourceElementPositioningStrategies.DECLARATION_NAME)
 
     val NONREADONLY_CALL_IN_READONLY_COMPOSABLE by error0<PsiElement>()
 
@@ -55,39 +54,35 @@
 
     // composable calls are not allowed in try expressions
     // error goes on the `try` keyword
-    val ILLEGAL_TRY_CATCH_AROUND_COMPOSABLE by error0<KtTryExpression>(
-        ComposeSourceElementPositioningStrategies.TRY_KEYWORD
-    )
+    val ILLEGAL_TRY_CATCH_AROUND_COMPOSABLE by
+        error0<KtTryExpression>(ComposeSourceElementPositioningStrategies.TRY_KEYWORD)
 
-    val MISSING_DISALLOW_COMPOSABLE_CALLS_ANNOTATION by error3<
-        PsiElement,
-        FirValueParameterSymbol, // unmarked
-        FirValueParameterSymbol, // marked
-        FirCallableSymbol<*>>()
+    val MISSING_DISALLOW_COMPOSABLE_CALLS_ANNOTATION by
+        error3<
+            PsiElement,
+            FirValueParameterSymbol, // unmarked
+            FirValueParameterSymbol, // marked
+            FirCallableSymbol<*>
+        >()
 
-    val COMPOSABLE_SUSPEND_FUN by error0<PsiElement>(
-        SourceElementPositioningStrategies.DECLARATION_NAME
-    )
+    val COMPOSABLE_SUSPEND_FUN by
+        error0<PsiElement>(SourceElementPositioningStrategies.DECLARATION_NAME)
 
-    val COMPOSABLE_FUN_MAIN by error0<PsiElement>(
-        SourceElementPositioningStrategies.DECLARATION_NAME
-    )
+    val COMPOSABLE_FUN_MAIN by
+        error0<PsiElement>(SourceElementPositioningStrategies.DECLARATION_NAME)
 
     val COMPOSABLE_FUNCTION_REFERENCE by error0<PsiElement>()
 
-    val COMPOSABLE_PROPERTY_BACKING_FIELD by error0<PsiElement>(
-        SourceElementPositioningStrategies.DECLARATION_NAME
-    )
+    val COMPOSABLE_PROPERTY_BACKING_FIELD by
+        error0<PsiElement>(SourceElementPositioningStrategies.DECLARATION_NAME)
 
     val COMPOSABLE_VAR by error0<PsiElement>(SourceElementPositioningStrategies.DECLARATION_NAME)
 
-    val COMPOSE_INVALID_DELEGATE by error0<PsiElement>(
-        ComposeSourceElementPositioningStrategies.DECLARATION_NAME_OR_DEFAULT
-    )
+    val COMPOSE_INVALID_DELEGATE by
+        error0<PsiElement>(ComposeSourceElementPositioningStrategies.DECLARATION_NAME_OR_DEFAULT)
 
-    val MISMATCHED_COMPOSABLE_IN_EXPECT_ACTUAL by error0<PsiElement>(
-        SourceElementPositioningStrategies.DECLARATION_NAME
-    )
+    val MISMATCHED_COMPOSABLE_IN_EXPECT_ACTUAL by
+        error0<PsiElement>(SourceElementPositioningStrategies.DECLARATION_NAME)
 
     init {
         RootDiagnosticRendererFactory.registerFactory(ComposeErrorMessages)
@@ -103,20 +98,20 @@
                 }
                 return PositioningStrategies.DEFAULT.mark(element)
             }
-    }
+        }
 
     private val LIGHT_TREE_TRY_KEYWORD: LightTreePositioningStrategy =
         object : LightTreePositioningStrategy() {
-        override fun mark(
-            node: LighterASTNode,
-            startOffset: Int,
-            endOffset: Int,
-            tree: FlyweightCapableTreeStructure<LighterASTNode>
-        ): List<TextRange> {
-            val target = tree.findChildByType(node, KtTokens.TRY_KEYWORD) ?: node
-            return markElement(target, startOffset, endOffset, tree, node)
+            override fun mark(
+                node: LighterASTNode,
+                startOffset: Int,
+                endOffset: Int,
+                tree: FlyweightCapableTreeStructure<LighterASTNode>
+            ): List<TextRange> {
+                val target = tree.findChildByType(node, KtTokens.TRY_KEYWORD) ?: node
+                return markElement(target, startOffset, endOffset, tree, node)
+            }
         }
-    }
 
     private val PSI_DECLARATION_NAME_OR_DEFAULT: PositioningStrategy<PsiElement> =
         object : PositioningStrategy<PsiElement>() {
@@ -128,13 +123,11 @@
             }
         }
 
-    val TRY_KEYWORD = SourceElementPositioningStrategy(
-        LIGHT_TREE_TRY_KEYWORD,
-        PSI_TRY_KEYWORD
-    )
+    val TRY_KEYWORD = SourceElementPositioningStrategy(LIGHT_TREE_TRY_KEYWORD, PSI_TRY_KEYWORD)
 
-    val DECLARATION_NAME_OR_DEFAULT = SourceElementPositioningStrategy(
-        LightTreePositioningStrategies.DECLARATION_NAME,
-        PSI_DECLARATION_NAME_OR_DEFAULT
-    )
+    val DECLARATION_NAME_OR_DEFAULT =
+        SourceElementPositioningStrategy(
+            LightTreePositioningStrategies.DECLARATION_NAME,
+            PSI_DECLARATION_NAME_OR_DEFAULT
+        )
 }
diff --git a/compose/compiler/compiler-hosted/src/main/java/androidx/compose/compiler/plugins/kotlin/k2/ComposeFirExtensions.kt b/compose/compiler/compiler-hosted/src/main/java/androidx/compose/compiler/plugins/kotlin/k2/ComposeFirExtensions.kt
index 7d26d89..48e199b 100644
--- a/compose/compiler/compiler-hosted/src/main/java/androidx/compose/compiler/plugins/kotlin/k2/ComposeFirExtensions.kt
+++ b/compose/compiler/compiler-hosted/src/main/java/androidx/compose/compiler/plugins/kotlin/k2/ComposeFirExtensions.kt
@@ -40,9 +40,8 @@
     }
 }
 
-class ComposableFunctionTypeKindExtension(
-    session: FirSession
-) : FirFunctionTypeKindExtension(session) {
+class ComposableFunctionTypeKindExtension(session: FirSession) :
+    FirFunctionTypeKindExtension(session) {
     override fun FunctionTypeKindRegistrar.registerKinds() {
         registerKind(ComposableFunction, KComposableFunction)
     }
@@ -65,12 +64,13 @@
         return LanguageVersion.values().last().versionString
     }
 
-object ComposableFunction : FunctionTypeKind(
-    FqName.topLevel(Name.identifier("androidx.compose.runtime.internal")),
-    "ComposableFunction",
-    ComposeClassIds.Composable,
-    isReflectType = false
-) {
+object ComposableFunction :
+    FunctionTypeKind(
+        FqName.topLevel(Name.identifier("androidx.compose.runtime.internal")),
+        "ComposableFunction",
+        ComposeClassIds.Composable,
+        isReflectType = false
+    ) {
     override val prefixForTypeRender: String
         get() = "@Composable"
 
@@ -80,12 +80,13 @@
     override fun reflectKind(): FunctionTypeKind = KComposableFunction
 }
 
-object KComposableFunction : FunctionTypeKind(
-    FqName.topLevel(Name.identifier("androidx.compose.runtime.internal")),
-    "KComposableFunction",
-    ComposeClassIds.Composable,
-    isReflectType = true
-) {
+object KComposableFunction :
+    FunctionTypeKind(
+        FqName.topLevel(Name.identifier("androidx.compose.runtime.internal")),
+        "KComposableFunction",
+        ComposeClassIds.Composable,
+        isReflectType = true
+    ) {
     override val serializeAsFunctionWithAnnotationUntil: String
         get() = useLegacyCustomFunctionTypeSerializationUntil
 
@@ -93,22 +94,24 @@
 }
 
 class ComposeFirCheckersExtension(session: FirSession) : FirAdditionalCheckersExtension(session) {
-    override val declarationCheckers: DeclarationCheckers = object : DeclarationCheckers() {
-        override val functionCheckers: Set<FirFunctionChecker> =
-            setOf(ComposableFunctionChecker)
+    override val declarationCheckers: DeclarationCheckers =
+        object : DeclarationCheckers() {
+            override val functionCheckers: Set<FirFunctionChecker> =
+                setOf(ComposableFunctionChecker)
 
-        override val propertyCheckers: Set<FirPropertyChecker> =
-            setOf(ComposablePropertyChecker)
-    }
+            override val propertyCheckers: Set<FirPropertyChecker> =
+                setOf(ComposablePropertyChecker)
+        }
 
-    override val expressionCheckers: ExpressionCheckers = object : ExpressionCheckers() {
-        override val functionCallCheckers: Set<FirFunctionCallChecker> =
-            setOf(ComposableFunctionCallChecker)
+    override val expressionCheckers: ExpressionCheckers =
+        object : ExpressionCheckers() {
+            override val functionCallCheckers: Set<FirFunctionCallChecker> =
+                setOf(ComposableFunctionCallChecker)
 
-        override val propertyAccessExpressionCheckers: Set<FirPropertyAccessExpressionChecker> =
-            setOf(ComposablePropertyAccessExpressionChecker)
+            override val propertyAccessExpressionCheckers: Set<FirPropertyAccessExpressionChecker> =
+                setOf(ComposablePropertyAccessExpressionChecker)
 
-        override val callableReferenceAccessCheckers: Set<FirCallableReferenceAccessChecker> =
-            setOf(ComposableCallableReferenceChecker)
-    }
+            override val callableReferenceAccessCheckers: Set<FirCallableReferenceAccessChecker> =
+                setOf(ComposableCallableReferenceChecker)
+        }
 }
diff --git a/compose/compiler/compiler-hosted/src/main/java/androidx/compose/compiler/plugins/kotlin/k2/FirUtils.kt b/compose/compiler/compiler-hosted/src/main/java/androidx/compose/compiler/plugins/kotlin/k2/FirUtils.kt
index a844125..025c9572 100644
--- a/compose/compiler/compiler-hosted/src/main/java/androidx/compose/compiler/plugins/kotlin/k2/FirUtils.kt
+++ b/compose/compiler/compiler-hosted/src/main/java/androidx/compose/compiler/plugins/kotlin/k2/FirUtils.kt
@@ -67,8 +67,7 @@
 
 fun FirCallableSymbol<*>.isComposable(session: FirSession): Boolean =
     when (this) {
-        is FirFunctionSymbol<*> ->
-            hasComposableAnnotation(session)
+        is FirFunctionSymbol<*> -> hasComposableAnnotation(session)
         is FirPropertySymbol ->
             getterSymbol?.let {
                 it.hasComposableAnnotation(session) || it.isComposableDelegate(session)
@@ -78,37 +77,28 @@
 
 fun FirCallableSymbol<*>.isReadOnlyComposable(session: FirSession): Boolean =
     when (this) {
-        is FirFunctionSymbol<*> ->
-            hasReadOnlyComposableAnnotation(session)
-        is FirPropertySymbol ->
-            getterSymbol?.hasReadOnlyComposableAnnotation(session) ?: false
+        is FirFunctionSymbol<*> -> hasReadOnlyComposableAnnotation(session)
+        is FirPropertySymbol -> getterSymbol?.hasReadOnlyComposableAnnotation(session) ?: false
         else -> false
     }
 
 @OptIn(SymbolInternals::class)
 private fun FirPropertyAccessorSymbol.isComposableDelegate(session: FirSession): Boolean {
     if (!propertySymbol.hasDelegate) return false
-    return ((fir
-        .body
-        ?.statements
-        ?.singleOrNull() as? FirReturnExpression)
-        ?.result as? FirFunctionCall)
+    return ((fir.body?.statements?.singleOrNull() as? FirReturnExpression)?.result
+            as? FirFunctionCall)
         ?.calleeReference
         ?.toResolvedCallableSymbol()
-        ?.isComposable(session)
-        ?: false
+        ?.isComposable(session) ?: false
 }
 
-fun FirFunction.getDirectOverriddenFunctions(
-    context: CheckerContext
-): List<FirFunctionSymbol<*>> {
+fun FirFunction.getDirectOverriddenFunctions(context: CheckerContext): List<FirFunctionSymbol<*>> {
     if (!isOverride && (this as? FirPropertyAccessor)?.propertySymbol?.isOverride != true)
         return listOf()
 
-    val scope = (containingClassLookupTag()
-        ?.toSymbol(context.session) as? FirClassSymbol<*>)
-        ?.unsubstitutedScope(context)
-        ?: return listOf()
+    val scope =
+        (containingClassLookupTag()?.toSymbol(context.session) as? FirClassSymbol<*>)
+            ?.unsubstitutedScope(context) ?: return listOf()
 
     return when (val symbol = symbol) {
         is FirNamedFunctionSymbol -> {
@@ -147,8 +137,8 @@
         1 -> {
             val type = parameterTypes.single()
             if (!type.isArrayType || type.typeArguments.size != 1) return false
-            val elementType = type.typeArguments[0].takeIf { it.kind != ProjectionKind.IN }?.type
-                ?: return false
+            val elementType =
+                type.typeArguments[0].takeIf { it.kind != ProjectionKind.IN }?.type ?: return false
             if (!elementType.isString) return false
         }
         else -> return false
@@ -165,10 +155,10 @@
 }
 
 private fun FirNamedFunctionSymbol.jvmNameAsString(session: FirSession): String =
-    getAnnotationStringParameter(StandardClassIds.Annotations.JvmName, session)
-        ?: name.asString()
+    getAnnotationStringParameter(StandardClassIds.Annotations.JvmName, session) ?: name.asString()
 
 private val FirFunctionSymbol<*>.explicitParameterTypes: List<ConeKotlinType>
-    get() = resolvedContextReceivers.map { it.typeRef.coneType } +
-        listOfNotNull(receiverParameter?.typeRef?.coneType) +
-        valueParameterSymbols.map { it.resolvedReturnType }
+    get() =
+        resolvedContextReceivers.map { it.typeRef.coneType } +
+            listOfNotNull(receiverParameter?.typeRef?.coneType) +
+            valueParameterSymbols.map { it.resolvedReturnType }
diff --git a/compose/compiler/compiler-hosted/src/main/java/androidx/compose/compiler/plugins/kotlin/lower/AbstractComposeLowering.kt b/compose/compiler/compiler-hosted/src/main/java/androidx/compose/compiler/plugins/kotlin/lower/AbstractComposeLowering.kt
index 00b809e..c89f47f 100644
--- a/compose/compiler/compiler-hosted/src/main/java/androidx/compose/compiler/plugins/kotlin/lower/AbstractComposeLowering.kt
+++ b/compose/compiler/compiler-hosted/src/main/java/androidx/compose/compiler/plugins/kotlin/lower/AbstractComposeLowering.kt
@@ -188,9 +188,11 @@
         get() = symbolRemapper.getReferencedClass(_composableIrClass.symbol).owner
 
     protected val jvmSyntheticIrClass by guardedLazy {
-        context.referenceClass(
-            ClassId(StandardClassIds.BASE_JVM_PACKAGE, Name.identifier("JvmSynthetic"))
-        )!!.owner
+        context
+            .referenceClass(
+                ClassId(StandardClassIds.BASE_JVM_PACKAGE, Name.identifier("JvmSynthetic"))
+            )!!
+            .owner
     }
 
     fun referenceFunction(symbol: IrFunctionSymbol): IrFunctionSymbol {
@@ -228,36 +230,37 @@
     }
 
     fun getTopLevelPropertyGetter(callableId: CallableId): IrFunctionSymbol {
-        val propertySymbol = context.referenceProperties(callableId).firstOrNull()
-            ?: error("Property was not found ${callableId.asSingleFqName()}")
-        return symbolRemapper.getReferencedFunction(
-            propertySymbol.owner.getter!!.symbol
-        )
+        val propertySymbol =
+            context.referenceProperties(callableId).firstOrNull()
+                ?: error("Property was not found ${callableId.asSingleFqName()}")
+        return symbolRemapper.getReferencedFunction(propertySymbol.owner.getter!!.symbol)
     }
 
-    val FeatureFlag.enabled get() = featureFlags.isEnabled(this)
+    val FeatureFlag.enabled
+        get() = featureFlags.isEnabled(this)
 
     fun metricsFor(function: IrFunction): FunctionMetrics =
         (function as? IrAttributeContainer)?.let {
-            context.irTrace[ComposeWritableSlices.FUNCTION_METRICS, it] ?: run {
-                val metrics = metrics.makeFunctionMetrics(function)
-                context.irTrace.record(ComposeWritableSlices.FUNCTION_METRICS, it, metrics)
-                metrics
-            }
+            context.irTrace[ComposeWritableSlices.FUNCTION_METRICS, it]
+                ?: run {
+                    val metrics = metrics.makeFunctionMetrics(function)
+                    context.irTrace.record(ComposeWritableSlices.FUNCTION_METRICS, it, metrics)
+                    metrics
+                }
         } ?: metrics.makeFunctionMetrics(function)
 
     fun IrType.unboxInlineClass() = unboxType() ?: this
 
     fun IrType.replaceArgumentsWithStarProjections(): IrType =
         when (this) {
-            is IrSimpleType -> IrSimpleTypeImpl(
-                classifier,
-                isMarkedNullable(),
-                List(arguments.size) { IrStarProjectionImpl },
-                annotations,
-                abbreviation
-            )
-
+            is IrSimpleType ->
+                IrSimpleTypeImpl(
+                    classifier,
+                    isMarkedNullable(),
+                    List(arguments.size) { IrStarProjectionImpl },
+                    annotations,
+                    abbreviation
+                )
             else -> this
         }
 
@@ -265,17 +268,16 @@
     // function itself. This normally isn't a problem because nothing in the IR lowerings ask for
     // the parent of the parameters, but we do. I believe this should be considered a bug in
     // kotlin proper, but this works around it.
-    fun IrValueParameter.hasDefaultValueSafe(): Boolean = DFS.ifAny(
-        listOf(this),
-        { current ->
-            (current.parent as? IrSimpleFunction)?.overriddenSymbols?.map { fn ->
-                fn.owner.valueParameters[current.index].also { p ->
-                    p.parent = fn.owner
-                }
-            } ?: listOf()
-        },
-        { current -> current.defaultValue != null }
-    )
+    fun IrValueParameter.hasDefaultValueSafe(): Boolean =
+        DFS.ifAny(
+            listOf(this),
+            { current ->
+                (current.parent as? IrSimpleFunction)?.overriddenSymbols?.map { fn ->
+                    fn.owner.valueParameters[current.index].also { p -> p.parent = fn.owner }
+                } ?: listOf()
+            },
+            { current -> current.defaultValue != null }
+        )
 
     // NOTE(lmr): This implementation mimics the kotlin-provided unboxInlineClass method, except
     // this one makes sure to bind the symbol if it is unbound, so is a bit safer to use.
@@ -287,8 +289,7 @@
         // TODO: Apply type substitutions
         val underlyingType = representation.underlyingType.unboxInlineClass()
         if (!isNullable()) return underlyingType
-        if (underlyingType.isNullable() || underlyingType.isPrimitiveType())
-            return null
+        if (underlyingType.isNullable() || underlyingType.isPrimitiveType()) return null
         return underlyingType.makeNullable()
     }
 
@@ -298,27 +299,23 @@
         val klass = classSymbol.owner
         if (type.isInlineClassType()) {
             if (context.platform.isJvm()) {
-                return coerceInlineClasses(
-                    this,
-                    type,
-                    type.unboxInlineClass()
-                ).unboxValueIfInline()
+                return coerceInlineClasses(this, type, type.unboxInlineClass()).unboxValueIfInline()
             } else {
                 val primaryValueParameter = klass.primaryConstructor?.valueParameters?.get(0)
-                val cantUnbox = primaryValueParameter == null || klass.properties.none {
-                    it.name == primaryValueParameter.name && it.getter != null
-                }
+                val cantUnbox =
+                    primaryValueParameter == null ||
+                        klass.properties.none {
+                            it.name == primaryValueParameter.name && it.getter != null
+                        }
                 if (cantUnbox) {
                     // LazyIr (external module) doesn't show a getter of a private property.
                     // So we can't unbox the value
                     return this
                 }
-                val fieldGetter = klass.getPropertyGetter(primaryValueParameter!!.name.identifier)
-                    ?: error("Expected a getter")
-                return irCall(
-                    symbol = fieldGetter,
-                    dispatchReceiver = this
-                ).unboxValueIfInline()
+                val fieldGetter =
+                    klass.getPropertyGetter(primaryValueParameter!!.name.identifier)
+                        ?: error("Expected a getter")
+                return irCall(symbol = fieldGetter, dispatchReceiver = this).unboxValueIfInline()
             }
         }
         return this
@@ -329,8 +326,7 @@
     }
 
     fun IrCall.isInvoke(): Boolean {
-        if (origin == IrStatementOrigin.INVOKE)
-            return true
+        if (origin == IrStatementOrigin.INVOKE) return true
         val function = symbol.owner
         return function.name == OperatorNameConventions.INVOKE &&
             function.parentClassOrNull?.defaultType?.let {
@@ -368,39 +364,32 @@
 
     fun Stability.irStableExpression(
         resolve: (IrTypeParameter) -> IrExpression? = { null }
-    ): IrExpression? = when (this) {
-        is Stability.Combined -> {
-            val exprs = elements.mapNotNull { it.irStableExpression(resolve) }
-            when {
-                exprs.size != elements.size -> null
-                exprs.isEmpty() -> irConst(StabilityBits.STABLE.bitsForSlot(0))
-                exprs.size == 1 -> exprs.first()
-                else -> exprs.reduce { a, b ->
-                    irOr(a, b)
+    ): IrExpression? =
+        when (this) {
+            is Stability.Combined -> {
+                val exprs = elements.mapNotNull { it.irStableExpression(resolve) }
+                when {
+                    exprs.size != elements.size -> null
+                    exprs.isEmpty() -> irConst(StabilityBits.STABLE.bitsForSlot(0))
+                    exprs.size == 1 -> exprs.first()
+                    else -> exprs.reduce { a, b -> irOr(a, b) }
                 }
             }
+            is Stability.Certain ->
+                if (stable) irConst(StabilityBits.STABLE.bitsForSlot(0)) else null
+            is Stability.Parameter -> resolve(parameter)
+            is Stability.Runtime -> {
+                val stableField = declaration.makeStabilityField()
+                IrGetFieldImpl(
+                    UNDEFINED_OFFSET,
+                    UNDEFINED_OFFSET,
+                    stableField.symbol,
+                    stableField.type
+                )
+            }
+            is Stability.Unknown -> null
         }
 
-        is Stability.Certain ->
-            if (stable)
-                irConst(StabilityBits.STABLE.bitsForSlot(0))
-            else
-                null
-
-        is Stability.Parameter -> resolve(parameter)
-        is Stability.Runtime -> {
-            val stableField = declaration.makeStabilityField()
-            IrGetFieldImpl(
-                UNDEFINED_OFFSET,
-                UNDEFINED_OFFSET,
-                stableField.symbol,
-                stableField.type
-            )
-        }
-
-        is Stability.Unknown -> null
-    }
-
     // set the bit at a certain index
     private fun Int.withBit(index: Int, value: Boolean): Int {
         return if (value) {
@@ -415,16 +404,12 @@
     }
 
     // create a bitmask with the following bits
-    protected fun bitMask(vararg values: Boolean): Int = values.foldIndexed(0) { i, mask, bit ->
-        mask.withBit(i, bit)
-    }
+    protected fun bitMask(vararg values: Boolean): Int =
+        values.foldIndexed(0) { i, mask, bit -> mask.withBit(i, bit) }
 
     protected fun irGetBit(param: IrDefaultBitMaskValue, index: Int): IrExpression {
         // value and (1 shl index) != 0
-        return irNotEqual(
-            param.irIsolateBitAtIndex(index),
-            irConst(0)
-        )
+        return irNotEqual(param.irIsolateBitAtIndex(index), irConst(0))
     }
 
     protected fun irSet(variable: IrValueDeclaration, value: IrExpression): IrExpression {
@@ -446,20 +431,19 @@
         vararg args: IrExpression
     ): IrCallImpl {
         return IrCallImpl(
-            UNDEFINED_OFFSET,
-            UNDEFINED_OFFSET,
-            symbol.owner.returnType,
-            symbol as IrSimpleFunctionSymbol,
-            symbol.owner.typeParameters.size,
-            symbol.owner.valueParameters.size,
-            origin
-        ).also {
-            if (dispatchReceiver != null) it.dispatchReceiver = dispatchReceiver
-            if (extensionReceiver != null) it.extensionReceiver = extensionReceiver
-            args.forEachIndexed { index, arg ->
-                it.putValueArgument(index, arg)
+                UNDEFINED_OFFSET,
+                UNDEFINED_OFFSET,
+                symbol.owner.returnType,
+                symbol as IrSimpleFunctionSymbol,
+                symbol.owner.typeParameters.size,
+                symbol.owner.valueParameters.size,
+                origin
+            )
+            .also {
+                if (dispatchReceiver != null) it.dispatchReceiver = dispatchReceiver
+                if (extensionReceiver != null) it.extensionReceiver = extensionReceiver
+                args.forEachIndexed { index, arg -> it.putValueArgument(index, arg) }
             }
-        }
     }
 
     protected fun IrType.binaryOperator(name: Name, paramType: IrType): IrFunctionSymbol =
@@ -479,13 +463,7 @@
         if (rhs is IrConst<*> && rhs.value == 0) return lhs
         if (lhs is IrConst<*> && lhs.value == 0) return rhs
         val int = context.irBuiltIns.intType
-        return irCall(
-            int.binaryOperator(OperatorNameConventions.OR, int),
-            null,
-            lhs,
-            null,
-            rhs
-        )
+        return irCall(int.binaryOperator(OperatorNameConventions.OR, int), null, lhs, null, rhs)
     }
 
     protected fun irBooleanOr(lhs: IrExpression, rhs: IrExpression): IrCallImpl {
@@ -505,20 +483,21 @@
             UNDEFINED_OFFSET,
             origin = IrStatementOrigin.OROR,
             type = context.irBuiltIns.booleanType,
-            branches = listOf(
-                IrBranchImpl(
-                    UNDEFINED_OFFSET,
-                    UNDEFINED_OFFSET,
-                    condition = lhs,
-                    result = irConst(true)
-                ),
-                IrElseBranchImpl(
-                    UNDEFINED_OFFSET,
-                    UNDEFINED_OFFSET,
-                    condition = irConst(true),
-                    result = rhs
+            branches =
+                listOf(
+                    IrBranchImpl(
+                        UNDEFINED_OFFSET,
+                        UNDEFINED_OFFSET,
+                        condition = lhs,
+                        result = irConst(true)
+                    ),
+                    IrElseBranchImpl(
+                        UNDEFINED_OFFSET,
+                        UNDEFINED_OFFSET,
+                        condition = irConst(true),
+                        result = rhs
+                    )
                 )
-            )
         )
     }
 
@@ -528,45 +507,28 @@
             UNDEFINED_OFFSET,
             origin = IrStatementOrigin.ANDAND,
             type = context.irBuiltIns.booleanType,
-            branches = listOf(
-                IrBranchImpl(
-                    UNDEFINED_OFFSET,
-                    UNDEFINED_OFFSET,
-                    condition = lhs,
-                    result = rhs
-                ),
-                IrElseBranchImpl(
-                    UNDEFINED_OFFSET,
-                    UNDEFINED_OFFSET,
-                    condition = irConst(true),
-                    result = irConst(false)
+            branches =
+                listOf(
+                    IrBranchImpl(UNDEFINED_OFFSET, UNDEFINED_OFFSET, condition = lhs, result = rhs),
+                    IrElseBranchImpl(
+                        UNDEFINED_OFFSET,
+                        UNDEFINED_OFFSET,
+                        condition = irConst(true),
+                        result = irConst(false)
+                    )
                 )
-            )
         )
     }
 
     protected fun irXor(lhs: IrExpression, rhs: IrExpression): IrCallImpl {
         val int = context.irBuiltIns.intType
-        return irCall(
-            int.binaryOperator(OperatorNameConventions.XOR, int),
-            null,
-            lhs,
-            null,
-            rhs
-        )
+        return irCall(int.binaryOperator(OperatorNameConventions.XOR, int), null, lhs, null, rhs)
     }
 
     protected fun irGreater(lhs: IrExpression, rhs: IrExpression): IrCallImpl {
         val int = context.irBuiltIns.intType
         val gt = context.irBuiltIns.greaterFunByOperandType[int.classifierOrFail]
-        return irCall(
-            gt!!,
-            IrStatementOrigin.GT,
-            null,
-            null,
-            lhs,
-            rhs
-        )
+        return irCall(gt!!, IrStatementOrigin.GT, null, null, lhs, rhs)
     }
 
     protected fun irReturn(
@@ -574,13 +536,7 @@
         value: IrExpression,
         type: IrType = value.type
     ): IrExpression {
-        return IrReturnImpl(
-            UNDEFINED_OFFSET,
-            UNDEFINED_OFFSET,
-            type,
-            target,
-            value
-        )
+        return IrReturnImpl(UNDEFINED_OFFSET, UNDEFINED_OFFSET, type, target, value)
     }
 
     protected fun irReturnVar(
@@ -598,21 +554,11 @@
 
     /** Compare [lhs] and [rhs] using structural equality (`==`). */
     protected fun irEqual(lhs: IrExpression, rhs: IrExpression): IrExpression {
-        return irCall(
-            context.irBuiltIns.eqeqSymbol,
-            null,
-            null,
-            null,
-            lhs,
-            rhs
-        )
+        return irCall(context.irBuiltIns.eqeqSymbol, null, null, null, lhs, rhs)
     }
 
     protected fun irNot(value: IrExpression): IrExpression {
-        return irCall(
-            context.irBuiltIns.booleanNotSymbol,
-            dispatchReceiver = value
-        )
+        return irCall(context.irBuiltIns.booleanNotSymbol, dispatchReceiver = value)
     }
 
     /** Compare [lhs] and [rhs] using structural inequality (`!=`). */
@@ -620,135 +566,145 @@
         return irNot(irEqual(lhs, rhs))
     }
 
-//        context.irIntrinsics.symbols.intAnd
-//        context.irIntrinsics.symbols.getBinaryOperator(name, lhs, rhs)
-//        context.irBuiltIns.booleanNotSymbol
-//        context.irBuiltIns.eqeqeqSymbol
-//        context.irBuiltIns.eqeqSymbol
-//        context.irBuiltIns.greaterFunByOperandType
+    //        context.irIntrinsics.symbols.intAnd
+    //        context.irIntrinsics.symbols.getBinaryOperator(name, lhs, rhs)
+    //        context.irBuiltIns.booleanNotSymbol
+    //        context.irBuiltIns.eqeqeqSymbol
+    //        context.irBuiltIns.eqeqSymbol
+    //        context.irBuiltIns.greaterFunByOperandType
 
-    protected fun irConst(value: Int): IrConst<Int> = IrConstImpl(
-        UNDEFINED_OFFSET,
-        UNDEFINED_OFFSET,
-        context.irBuiltIns.intType,
-        IrConstKind.Int,
-        value
-    )
+    protected fun irConst(value: Int): IrConst<Int> =
+        IrConstImpl(
+            UNDEFINED_OFFSET,
+            UNDEFINED_OFFSET,
+            context.irBuiltIns.intType,
+            IrConstKind.Int,
+            value
+        )
 
-    protected fun irConst(value: Long): IrConst<Long> = IrConstImpl(
-        UNDEFINED_OFFSET,
-        UNDEFINED_OFFSET,
-        context.irBuiltIns.longType,
-        IrConstKind.Long,
-        value
-    )
+    protected fun irConst(value: Long): IrConst<Long> =
+        IrConstImpl(
+            UNDEFINED_OFFSET,
+            UNDEFINED_OFFSET,
+            context.irBuiltIns.longType,
+            IrConstKind.Long,
+            value
+        )
 
-    protected fun irConst(value: String): IrConst<String> = IrConstImpl(
-        UNDEFINED_OFFSET,
-        UNDEFINED_OFFSET,
-        context.irBuiltIns.stringType,
-        IrConstKind.String,
-        value
-    )
+    protected fun irConst(value: String): IrConst<String> =
+        IrConstImpl(
+            UNDEFINED_OFFSET,
+            UNDEFINED_OFFSET,
+            context.irBuiltIns.stringType,
+            IrConstKind.String,
+            value
+        )
 
-    protected fun irConst(value: Boolean) = IrConstImpl(
-        UNDEFINED_OFFSET,
-        UNDEFINED_OFFSET,
-        context.irBuiltIns.booleanType,
-        IrConstKind.Boolean,
-        value
-    )
+    protected fun irConst(value: Boolean) =
+        IrConstImpl(
+            UNDEFINED_OFFSET,
+            UNDEFINED_OFFSET,
+            context.irBuiltIns.booleanType,
+            IrConstKind.Boolean,
+            value
+        )
 
-    protected fun irNull() = IrConstImpl(
-        UNDEFINED_OFFSET,
-        UNDEFINED_OFFSET,
-        context.irBuiltIns.anyNType,
-        IrConstKind.Null,
-        null
-    )
+    protected fun irNull() =
+        IrConstImpl(
+            UNDEFINED_OFFSET,
+            UNDEFINED_OFFSET,
+            context.irBuiltIns.anyNType,
+            IrConstKind.Null,
+            null
+        )
 
     protected fun irForLoop(
         elementType: IrType,
         subject: IrExpression,
         loopBody: (IrValueDeclaration) -> IrExpression
     ): IrStatement {
-        val getIteratorFunction = subject.type.classOrNull!!.owner.functions
-            .single { it.name.asString() == "iterator" }
+        val getIteratorFunction =
+            subject.type.classOrNull!!.owner.functions.single { it.name.asString() == "iterator" }
 
         val iteratorSymbol = getIteratorFunction.returnType.classOrNull!!
-        val iteratorType = if (iteratorSymbol.owner.typeParameters.isNotEmpty()) {
-            iteratorSymbol.typeWith(elementType)
-        } else {
-            iteratorSymbol.defaultType
-        }
+        val iteratorType =
+            if (iteratorSymbol.owner.typeParameters.isNotEmpty()) {
+                iteratorSymbol.typeWith(elementType)
+            } else {
+                iteratorSymbol.defaultType
+            }
 
-        val nextSymbol = iteratorSymbol.owner.functions
-            .single { it.name.asString() == "next" }
-        val hasNextSymbol = iteratorSymbol.owner.functions
-            .single { it.name.asString() == "hasNext" }
+        val nextSymbol = iteratorSymbol.owner.functions.single { it.name.asString() == "next" }
+        val hasNextSymbol =
+            iteratorSymbol.owner.functions.single { it.name.asString() == "hasNext" }
 
-        val call = IrCallImpl(
-            UNDEFINED_OFFSET,
-            UNDEFINED_OFFSET,
-            iteratorType,
-            getIteratorFunction.symbol,
-            getIteratorFunction.symbol.owner.typeParameters.size,
-            getIteratorFunction.symbol.owner.valueParameters.size,
-            IrStatementOrigin.FOR_LOOP_ITERATOR
-        ).also {
-            it.dispatchReceiver = subject
-        }
+        val call =
+            IrCallImpl(
+                    UNDEFINED_OFFSET,
+                    UNDEFINED_OFFSET,
+                    iteratorType,
+                    getIteratorFunction.symbol,
+                    getIteratorFunction.symbol.owner.typeParameters.size,
+                    getIteratorFunction.symbol.owner.valueParameters.size,
+                    IrStatementOrigin.FOR_LOOP_ITERATOR
+                )
+                .also { it.dispatchReceiver = subject }
 
-        val iteratorVar = irTemporary(
-            value = call,
-            isVar = false,
-            name = "tmp0_iterator",
-            irType = iteratorType,
-            origin = IrDeclarationOrigin.FOR_LOOP_ITERATOR
-        )
+        val iteratorVar =
+            irTemporary(
+                value = call,
+                isVar = false,
+                name = "tmp0_iterator",
+                irType = iteratorType,
+                origin = IrDeclarationOrigin.FOR_LOOP_ITERATOR
+            )
         return irBlock(
             type = builtIns.unitType,
             origin = IrStatementOrigin.FOR_LOOP,
-            statements = listOf(
-                iteratorVar,
-                IrWhileLoopImpl(
-                    UNDEFINED_OFFSET,
-                    UNDEFINED_OFFSET,
-                    builtIns.unitType,
-                    IrStatementOrigin.FOR_LOOP_INNER_WHILE
-                ).apply {
-                    val loopVar = irTemporary(
-                        value = IrCallImpl(
-                            symbol = nextSymbol.symbol,
-                            origin = IrStatementOrigin.FOR_LOOP_NEXT,
-                            startOffset = UNDEFINED_OFFSET,
-                            endOffset = UNDEFINED_OFFSET,
-                            typeArgumentsCount = nextSymbol.symbol.owner.typeParameters.size,
-                            valueArgumentsCount = nextSymbol.symbol.owner.valueParameters.size,
-                            type = elementType
-                        ).also {
-                            it.dispatchReceiver = irGet(iteratorVar)
-                        },
-                        origin = IrDeclarationOrigin.FOR_LOOP_VARIABLE,
-                        isVar = false,
-                        name = "value",
-                        irType = elementType
-                    )
-                    condition = irCall(
-                        symbol = hasNextSymbol.symbol,
-                        origin = IrStatementOrigin.FOR_LOOP_HAS_NEXT,
-                        dispatchReceiver = irGet(iteratorVar)
-                    )
-                    body = irBlock(
-                        type = builtIns.unitType,
-                        origin = IrStatementOrigin.FOR_LOOP_INNER_WHILE,
-                        statements = listOf(
-                            loopVar,
-                            loopBody(loopVar)
+            statements =
+                listOf(
+                    iteratorVar,
+                    IrWhileLoopImpl(
+                            UNDEFINED_OFFSET,
+                            UNDEFINED_OFFSET,
+                            builtIns.unitType,
+                            IrStatementOrigin.FOR_LOOP_INNER_WHILE
                         )
-                    )
-                }
-            )
+                        .apply {
+                            val loopVar =
+                                irTemporary(
+                                    value =
+                                        IrCallImpl(
+                                                symbol = nextSymbol.symbol,
+                                                origin = IrStatementOrigin.FOR_LOOP_NEXT,
+                                                startOffset = UNDEFINED_OFFSET,
+                                                endOffset = UNDEFINED_OFFSET,
+                                                typeArgumentsCount =
+                                                    nextSymbol.symbol.owner.typeParameters.size,
+                                                valueArgumentsCount =
+                                                    nextSymbol.symbol.owner.valueParameters.size,
+                                                type = elementType
+                                            )
+                                            .also { it.dispatchReceiver = irGet(iteratorVar) },
+                                    origin = IrDeclarationOrigin.FOR_LOOP_VARIABLE,
+                                    isVar = false,
+                                    name = "value",
+                                    irType = elementType
+                                )
+                            condition =
+                                irCall(
+                                    symbol = hasNextSymbol.symbol,
+                                    origin = IrStatementOrigin.FOR_LOOP_HAS_NEXT,
+                                    dispatchReceiver = irGet(iteratorVar)
+                                )
+                            body =
+                                irBlock(
+                                    type = builtIns.unitType,
+                                    origin = IrStatementOrigin.FOR_LOOP_INNER_WHILE,
+                                    statements = listOf(loopVar, loopBody(loopVar))
+                                )
+                        }
+                )
         )
     }
 
@@ -760,27 +716,21 @@
         origin: IrDeclarationOrigin = IrDeclarationOrigin.IR_TEMPORARY_VARIABLE
     ): IrVariableImpl {
         return IrVariableImpl(
-            value.startOffset,
-            value.endOffset,
-            origin,
-            IrVariableSymbolImpl(),
-            Name.identifier(name),
-            irType,
-            isVar,
-            isConst = false,
-            isLateinit = false
-        ).apply {
-            initializer = value
-        }
+                value.startOffset,
+                value.endOffset,
+                origin,
+                IrVariableSymbolImpl(),
+                Name.identifier(name),
+                irType,
+                isVar,
+                isConst = false,
+                isLateinit = false
+            )
+            .apply { initializer = value }
     }
 
     protected fun irGet(type: IrType, symbol: IrValueSymbol): IrExpression {
-        return IrGetValueImpl(
-            UNDEFINED_OFFSET,
-            UNDEFINED_OFFSET,
-            type,
-            symbol
-        )
+        return IrGetValueImpl(UNDEFINED_OFFSET, UNDEFINED_OFFSET, type, symbol)
     }
 
     protected fun irGet(variable: IrValueDeclaration): IrExpression {
@@ -789,15 +739,12 @@
 
     protected fun irIf(condition: IrExpression, body: IrExpression): IrExpression {
         return IrIfThenElseImpl(
-            UNDEFINED_OFFSET,
-            UNDEFINED_OFFSET,
-            context.irBuiltIns.unitType,
-            origin = IrStatementOrigin.IF
-        ).also {
-            it.branches.add(
-                IrBranchImpl(condition, body)
+                UNDEFINED_OFFSET,
+                UNDEFINED_OFFSET,
+                context.irBuiltIns.unitType,
+                origin = IrStatementOrigin.IF
             )
-        }
+            .also { it.branches.add(IrBranchImpl(condition, body)) }
     }
 
     protected fun irIfThenElse(
@@ -809,14 +756,7 @@
         endOffset: Int = UNDEFINED_OFFSET
     ) =
         IrIfThenElseImpl(startOffset, endOffset, type, IrStatementOrigin.IF).apply {
-            branches.add(
-                IrBranchImpl(
-                    startOffset,
-                    endOffset,
-                    condition,
-                    thenPart
-                )
-            )
+            branches.add(IrBranchImpl(startOffset, endOffset, condition, thenPart))
             branches.add(irElseBranch(elsePart, startOffset, endOffset))
         }
 
@@ -824,18 +764,9 @@
         type: IrType = context.irBuiltIns.unitType,
         origin: IrStatementOrigin? = null,
         branches: List<IrBranch>
-    ) = IrWhenImpl(
-        UNDEFINED_OFFSET,
-        UNDEFINED_OFFSET,
-        type,
-        origin,
-        branches
-    )
+    ) = IrWhenImpl(UNDEFINED_OFFSET, UNDEFINED_OFFSET, type, origin, branches)
 
-    protected fun irBranch(
-        condition: IrExpression,
-        result: IrExpression
-    ): IrBranch {
+    protected fun irBranch(condition: IrExpression, result: IrExpression): IrBranch {
         return IrBranchImpl(condition, result)
     }
 
@@ -850,13 +781,7 @@
         origin: IrStatementOrigin? = null,
         statements: List<IrStatement>
     ): IrExpression {
-        return IrBlockImpl(
-            UNDEFINED_OFFSET,
-            UNDEFINED_OFFSET,
-            type,
-            origin,
-            statements
-        )
+        return IrBlockImpl(UNDEFINED_OFFSET, UNDEFINED_OFFSET, type, origin, statements)
     }
 
     protected fun irComposite(
@@ -864,13 +789,7 @@
         origin: IrStatementOrigin? = null,
         statements: List<IrStatement>
     ): IrExpression {
-        return IrCompositeImpl(
-            UNDEFINED_OFFSET,
-            UNDEFINED_OFFSET,
-            type,
-            origin,
-            statements
-        )
+        return IrCompositeImpl(UNDEFINED_OFFSET, UNDEFINED_OFFSET, type, origin, statements)
     }
 
     protected fun irLambdaExpression(
@@ -879,33 +798,39 @@
         returnType: IrType,
         body: (IrSimpleFunction) -> Unit
     ): IrExpression {
-        val function = context.irFactory.buildFun {
-            this.startOffset = SYNTHETIC_OFFSET
-            this.endOffset = SYNTHETIC_OFFSET
-            this.returnType = returnType
-            origin = IrDeclarationOrigin.LOCAL_FUNCTION_FOR_LAMBDA
-            name = SpecialNames.ANONYMOUS
-            visibility = DescriptorVisibilities.LOCAL
-        }.also(body)
+        val function =
+            context.irFactory
+                .buildFun {
+                    this.startOffset = SYNTHETIC_OFFSET
+                    this.endOffset = SYNTHETIC_OFFSET
+                    this.returnType = returnType
+                    origin = IrDeclarationOrigin.LOCAL_FUNCTION_FOR_LAMBDA
+                    name = SpecialNames.ANONYMOUS
+                    visibility = DescriptorVisibilities.LOCAL
+                }
+                .also(body)
 
         return IrFunctionExpressionImpl(
             startOffset = startOffset,
             endOffset = endOffset,
-            type = context.function(function.valueParameters.size).typeWith(
-                function.valueParameters.map { it.type } + listOf(function.returnType)
-            ),
+            type =
+                context
+                    .function(function.valueParameters.size)
+                    .typeWith(
+                        function.valueParameters.map { it.type } + listOf(function.returnType)
+                    ),
             origin = IrStatementOrigin.LAMBDA,
             function = function
         )
     }
 
-    private fun IrClass.uniqueStabilityFieldName(): Name = Name.identifier(
-        kotlinFqName.asString().replace(".", "_") + ComposeNames.STABILITY_FLAG
-    )
+    private fun IrClass.uniqueStabilityFieldName(): Name =
+        Name.identifier(kotlinFqName.asString().replace(".", "_") + ComposeNames.STABILITY_FLAG)
 
-    private fun IrClass.uniqueStabilityPropertyName(): Name = Name.identifier(
-        kotlinFqName.asString().replace(".", "_") + ComposeNames.STABILITY_PROP_FLAG
-    )
+    private fun IrClass.uniqueStabilityPropertyName(): Name =
+        Name.identifier(
+            kotlinFqName.asString().replace(".", "_") + ComposeNames.STABILITY_PROP_FLAG
+        )
 
     fun IrClass.makeStabilityField(): IrField {
         return if (context.platform.isJvm()) {
@@ -916,52 +841,56 @@
     }
 
     private fun IrClass.makeStabilityFieldJvm(): IrField {
-        return context.irFactory.buildField {
-            startOffset = SYNTHETIC_OFFSET
-            endOffset = SYNTHETIC_OFFSET
-            name = ComposeNames.STABILITY_FLAG
-            isStatic = true
-            isFinal = true
-            type = context.irBuiltIns.intType
-            visibility = DescriptorVisibilities.PUBLIC
-        }.also { stabilityField ->
-            stabilityField.parent = this@makeStabilityFieldJvm
-        }
+        return context.irFactory
+            .buildField {
+                startOffset = SYNTHETIC_OFFSET
+                endOffset = SYNTHETIC_OFFSET
+                name = ComposeNames.STABILITY_FLAG
+                isStatic = true
+                isFinal = true
+                type = context.irBuiltIns.intType
+                visibility = DescriptorVisibilities.PUBLIC
+            }
+            .also { stabilityField -> stabilityField.parent = this@makeStabilityFieldJvm }
     }
 
     private fun IrClass.makeStabilityFieldNonJvm(): IrField {
         val stabilityFieldName = this.uniqueStabilityFieldName()
         val fieldParent = this.getPackageFragment()
 
-        return context.irFactory.buildField {
-            startOffset = SYNTHETIC_OFFSET
-            endOffset = SYNTHETIC_OFFSET
-            name = stabilityFieldName
-            isStatic = true
-            isFinal = true
-            type = context.irBuiltIns.intType
-            visibility = DescriptorVisibilities.PUBLIC
-        }.also { stabilityField ->
-            stabilityField.parent = fieldParent
-            makeStabilityProp(stabilityField, fieldParent)
-        }
+        return context.irFactory
+            .buildField {
+                startOffset = SYNTHETIC_OFFSET
+                endOffset = SYNTHETIC_OFFSET
+                name = stabilityFieldName
+                isStatic = true
+                isFinal = true
+                type = context.irBuiltIns.intType
+                visibility = DescriptorVisibilities.PUBLIC
+            }
+            .also { stabilityField ->
+                stabilityField.parent = fieldParent
+                makeStabilityProp(stabilityField, fieldParent)
+            }
     }
 
     private fun IrClass.makeStabilityProp(
         stabilityField: IrField,
         fieldParent: IrDeclarationContainer
     ): IrProperty {
-        return context.irFactory.buildProperty {
-            startOffset = SYNTHETIC_OFFSET
-            endOffset = SYNTHETIC_OFFSET
-            name = this@makeStabilityProp.uniqueStabilityPropertyName()
-            visibility = DescriptorVisibilities.PUBLIC
-        }.also { property ->
-            property.parent = fieldParent
-            stabilityField.correspondingPropertySymbol = property.symbol
-            property.backingField = stabilityField
-            fieldParent.addChild(property)
-        }
+        return context.irFactory
+            .buildProperty {
+                startOffset = SYNTHETIC_OFFSET
+                endOffset = SYNTHETIC_OFFSET
+                name = this@makeStabilityProp.uniqueStabilityPropertyName()
+                visibility = DescriptorVisibilities.PUBLIC
+            }
+            .also { property ->
+                property.parent = fieldParent
+                stabilityField.correspondingPropertySymbol = property.symbol
+                property.backingField = stabilityField
+                fieldParent.addChild(property)
+            }
     }
 
     fun IrExpression.isStatic(): Boolean {
@@ -976,7 +905,6 @@
                 if (symbol.owner.isCompanion) true
                 else stabilityInferencer.stabilityOf(type).knownStable()
             }
-
             is IrConstructorCall -> isStatic()
             is IrCall -> isStatic()
             is IrGetValue -> {
@@ -986,19 +914,15 @@
                         // then we can determine that the variable reference is also static.
                         !owner.isVar && owner.initializer?.isStatic() == true
                     }
-
                     else -> false
                 }
             }
-
             is IrFunctionExpression,
             is IrTypeOperatorCall ->
                 context.irTrace[ComposeWritableSlices.IS_STATIC_FUNCTION_EXPRESSION, this] ?: false
-
             is IrGetField ->
                 // K2 sometimes produces `IrGetField` for reads from constant properties
                 symbol.owner.correspondingPropertySymbol?.owner?.isConst == true
-
             is IrBlock -> {
                 // Check the slice in case the block was generated as expression
                 // (e.g. inlined intrinsic remember call)
@@ -1031,8 +955,9 @@
             is IrStatementOrigin.GET_PROPERTY -> {
                 // If we are in a GET_PROPERTY call, then this should usually resolve to
                 // non-null, but in case it doesn't, just return false
-                val prop = (function as? IrSimpleFunction)
-                    ?.correspondingPropertySymbol?.owner ?: return false
+                val prop =
+                    (function as? IrSimpleFunction)?.correspondingPropertySymbol?.owner
+                        ?: return false
 
                 // if the property is a top level constant, then it is static.
                 if (prop.isConst) return true
@@ -1044,29 +969,31 @@
                 // if we see that the property is read-only with a default getter and a
                 // stable return type , then reading the property can also be considered
                 // static if this is a top level property or the subject is also static.
-                if (!prop.isVar &&
-                    prop.getter?.origin == IrDeclarationOrigin.DEFAULT_PROPERTY_ACCESSOR &&
-                    typeIsStable &&
-                    dispatchReceiverIsStatic && extensionReceiverIsStatic
+                if (
+                    !prop.isVar &&
+                        prop.getter?.origin == IrDeclarationOrigin.DEFAULT_PROPERTY_ACCESSOR &&
+                        typeIsStable &&
+                        dispatchReceiverIsStatic &&
+                        extensionReceiverIsStatic
                 ) {
                     return true
                 }
 
-                val getterIsStable = prop.hasAnnotation(ComposeFqNames.Stable) ||
-                    function.hasAnnotation(ComposeFqNames.Stable)
+                val getterIsStable =
+                    prop.hasAnnotation(ComposeFqNames.Stable) ||
+                        function.hasAnnotation(ComposeFqNames.Stable)
 
                 if (
                     getterIsStable &&
-                    typeIsStable &&
-                    dispatchReceiverIsStatic &&
-                    extensionReceiverIsStatic
+                        typeIsStable &&
+                        dispatchReceiverIsStatic &&
+                        extensionReceiverIsStatic
                 ) {
                     return true
                 }
 
                 false
             }
-
             is IrStatementOrigin.PLUS,
             is IrStatementOrigin.MUL,
             is IrStatementOrigin.MINUS,
@@ -1083,8 +1010,9 @@
                 // special case mathematical operators that are in the stdlib. These are
                 // immutable operations so the overall result is static if the operands are
                 // also static
-                val isStableOperator = fqName.topLevelName() == "kotlin" ||
-                    function.hasAnnotation(ComposeFqNames.Stable)
+                val isStableOperator =
+                    fqName.topLevelName() == "kotlin" ||
+                        function.hasAnnotation(ComposeFqNames.Stable)
 
                 val typeIsStable = stabilityInferencer.stabilityOf(type).knownStable()
                 if (!typeIsStable) return false
@@ -1095,23 +1023,23 @@
 
                 getArgumentsWithIr().all { it.second.isStatic() }
             }
-
             null -> {
                 if (fqName == ComposeFqNames.remember) {
                     // if it is a call to remember with 0 input arguments, then we can
                     // consider the value static if the result type of the lambda is stable
-                    val syntheticRememberParams = 1 + // composer param
-                        1 // changed param
+                    val syntheticRememberParams =
+                        1 + // composer param
+                            1 // changed param
                     val expectedArgumentsCount = 1 + syntheticRememberParams // 1 for lambda
                     if (
                         valueArgumentsCount == expectedArgumentsCount &&
-                        stabilityInferencer.stabilityOf(type).knownStable()
+                            stabilityInferencer.stabilityOf(type).knownStable()
                     ) {
                         return true
                     }
                 } else if (
                     fqName == ComposeFqNames.composableLambda ||
-                    fqName == ComposeFqNames.rememberComposableLambda
+                        fqName == ComposeFqNames.rememberComposableLambda
                 ) {
                     // calls to this function are generated by the compiler, and this
                     // function behaves similar to a remember call in that the result will
@@ -1137,7 +1065,6 @@
 
                 areAllArgumentsStatic()
             }
-
             else -> false
         }
     }
@@ -1153,37 +1080,29 @@
                 // stable and capable of being static. So in this case, we're able to ignore the
                 // array implementation detail and check whether all of the parameters sent in the
                 // varargs are static on their own.
-                is IrVararg -> argExpression.elements.all { varargElement ->
-                    (varargElement as? IrExpression)?.isStatic() ?: false
-                }
-
+                is IrVararg ->
+                    argExpression.elements.all { varargElement ->
+                        (varargElement as? IrExpression)?.isStatic() ?: false
+                    }
                 else -> argExpression.isStatic()
             }
         }
     }
 
     protected fun dexSafeName(name: Name): Name {
-        return if (
-            name.isSpecial || name.asString().contains(unsafeSymbolsRegex)
-        ) {
-            val sanitized = name
-                .asString()
-                .replace(unsafeSymbolsRegex, "\\$")
+        return if (name.isSpecial || name.asString().contains(unsafeSymbolsRegex)) {
+            val sanitized = name.asString().replace(unsafeSymbolsRegex, "\\$")
             Name.identifier(sanitized)
         } else name
     }
 
     fun coerceInlineClasses(argument: IrExpression, from: IrType, to: IrType) =
-        IrCallImpl.fromSymbolOwner(
-            UNDEFINED_OFFSET,
-            UNDEFINED_OFFSET,
-            to,
-            unsafeCoerceIntrinsic!!
-        ).apply {
-            putTypeArgument(0, from)
-            putTypeArgument(1, to)
-            putValueArgument(0, argument)
-        }
+        IrCallImpl.fromSymbolOwner(UNDEFINED_OFFSET, UNDEFINED_OFFSET, to, unsafeCoerceIntrinsic!!)
+            .apply {
+                putTypeArgument(0, from)
+                putTypeArgument(1, to)
+                putValueArgument(0, argument)
+            }
 
     fun IrExpression.coerceToUnboxed() =
         coerceInlineClasses(this, this.type, this.type.unboxInlineClass())
@@ -1193,19 +1112,23 @@
     @OptIn(ObsoleteDescriptorBasedAPI::class)
     private val unsafeCoerceIntrinsic: IrSimpleFunctionSymbol? by lazy {
         if (context.platform.isJvm()) {
-            context.irFactory.buildFun {
-                name = Name.special("<unsafe-coerce>")
-                origin = IrDeclarationOrigin.IR_BUILTINS_STUB
-            }.apply {
-                parent = IrExternalPackageFragmentImpl.createEmptyExternalPackageFragment(
-                    context.moduleDescriptor,
-                    FqName("kotlin.jvm.internal")
-                )
-                val src = addTypeParameter("T", context.irBuiltIns.anyNType)
-                val dst = addTypeParameter("R", context.irBuiltIns.anyNType)
-                addValueParameter("v", src.defaultType)
-                returnType = dst.defaultType
-            }.symbol
+            context.irFactory
+                .buildFun {
+                    name = Name.special("<unsafe-coerce>")
+                    origin = IrDeclarationOrigin.IR_BUILTINS_STUB
+                }
+                .apply {
+                    parent =
+                        IrExternalPackageFragmentImpl.createEmptyExternalPackageFragment(
+                            context.moduleDescriptor,
+                            FqName("kotlin.jvm.internal")
+                        )
+                    val src = addTypeParameter("T", context.irBuiltIns.anyNType)
+                    val dst = addTypeParameter("R", context.irBuiltIns.anyNType)
+                    addValueParameter("v", src.defaultType)
+                    returnType = dst.defaultType
+                }
+                .symbol
         } else {
             null
         }
@@ -1213,10 +1136,7 @@
 
     @OptIn(ObsoleteDescriptorBasedAPI::class)
     fun IrSimpleFunction.sourceKey(): Int {
-        val info = context.irTrace[
-            ComposeWritableSlices.DURABLE_FUNCTION_KEY,
-            this
-        ]
+        val info = context.irTrace[ComposeWritableSlices.DURABLE_FUNCTION_KEY, this]
         if (info != null) {
             info.used = true
             return info.key
@@ -1242,9 +1162,11 @@
             } == true
 
     private val cacheFunction by guardedLazy {
-        getTopLevelFunctions(ComposeCallableIds.cache).first {
-            it.owner.valueParameters.size == 2 && it.owner.extensionReceiverParameter != null
-        }.owner
+        getTopLevelFunctions(ComposeCallableIds.cache)
+            .first {
+                it.owner.valueParameters.size == 2 && it.owner.extensionReceiverParameter != null
+            }
+            .owner
     }
 
     fun irCache(
@@ -1257,18 +1179,19 @@
     ): IrCall {
         val symbol = referenceFunction(cacheFunction.symbol)
         return IrCallImpl(
-            startOffset,
-            endOffset,
-            returnType,
-            symbol as IrSimpleFunctionSymbol,
-            symbol.owner.typeParameters.size,
-            symbol.owner.valueParameters.size
-        ).apply {
-            extensionReceiver = currentComposer
-            putValueArgument(0, invalid)
-            putValueArgument(1, calculation)
-            putTypeArgument(0, returnType)
-        }
+                startOffset,
+                endOffset,
+                returnType,
+                symbol as IrSimpleFunctionSymbol,
+                symbol.owner.typeParameters.size,
+                symbol.owner.valueParameters.size
+            )
+            .apply {
+                extensionReceiver = currentComposer
+                putValueArgument(0, invalid)
+                putValueArgument(1, calculation)
+                putTypeArgument(0, returnType)
+            }
     }
 
     fun irChanged(
@@ -1291,32 +1214,29 @@
         val type = expr.type
         val stability = stabilityInferencer.stabilityOf(value)
 
-        val primitiveDescriptor = type.toPrimitiveType()
-            .let { changedPrimitiveFunctions[it] }
+        val primitiveDescriptor = type.toPrimitiveType().let { changedPrimitiveFunctions[it] }
 
         return if (!compareInstanceForUnstableValues) {
-            val descriptor = primitiveDescriptor
-                ?: if (type.isFunction() && compareInstanceForFunctionTypes) {
-                    changedInstanceFunction
-                } else {
-                    changedFunction
-                }
-            irMethodCall(currentComposer, descriptor).also {
-                it.putValueArgument(0, expr)
-            }
+            val descriptor =
+                primitiveDescriptor
+                    ?: if (type.isFunction() && compareInstanceForFunctionTypes) {
+                        changedInstanceFunction
+                    } else {
+                        changedFunction
+                    }
+            irMethodCall(currentComposer, descriptor).also { it.putValueArgument(0, expr) }
         } else {
-            val descriptor = when {
-                primitiveDescriptor != null -> primitiveDescriptor
-                compareInstanceForFunctionTypes && type.isFunction() -> changedInstanceFunction
-                stability.knownStable() -> changedFunction
-                inferredStable -> changedFunction
-                stability.knownUnstable() -> changedInstanceFunction
-                stability.isUncertain() -> changedInstanceFunction
-                else -> error("Cannot determine descriptor for irChanged")
-            }
-            irMethodCall(currentComposer, descriptor).also {
-                it.putValueArgument(0, expr)
-            }
+            val descriptor =
+                when {
+                    primitiveDescriptor != null -> primitiveDescriptor
+                    compareInstanceForFunctionTypes && type.isFunction() -> changedInstanceFunction
+                    stability.knownStable() -> changedFunction
+                    inferredStable -> changedFunction
+                    stability.knownUnstable() -> changedInstanceFunction
+                    stability.isUncertain() -> changedInstanceFunction
+                    else -> error("Cannot determine descriptor for irChanged")
+                }
+            irMethodCall(currentComposer, descriptor).also { it.putValueArgument(0, expr) }
         }
     }
 
@@ -1326,12 +1246,7 @@
         startOffset: Int = UNDEFINED_OFFSET,
         endOffset: Int = UNDEFINED_OFFSET
     ): IrExpression {
-        return irMethodCall(
-            currentComposer,
-            startReplaceFunction,
-            startOffset,
-            endOffset
-        ).also {
+        return irMethodCall(currentComposer, startReplaceFunction, startOffset, endOffset).also {
             it.putValueArgument(0, key)
         }
     }
@@ -1341,12 +1256,7 @@
         startOffset: Int = UNDEFINED_OFFSET,
         endOffset: Int = UNDEFINED_OFFSET,
     ): IrExpression {
-        return irMethodCall(
-            currentComposer,
-            endReplaceFunction,
-            startOffset,
-            endOffset
-        )
+        return irMethodCall(currentComposer, endReplaceFunction, startOffset, endOffset)
     }
 
     fun IrStatement.wrap(
@@ -1356,22 +1266,16 @@
         before: List<IrStatement> = emptyList(),
         after: List<IrStatement> = emptyList()
     ): IrContainerExpression {
-        return IrBlockImpl(
-            startOffset,
-            endOffset,
-            type,
-            null,
-            before + this + after
-        )
+        return IrBlockImpl(startOffset, endOffset, type, null, before + this + after)
     }
 
-    private val changedFunction = composerIrClass.functions
-        .first {
+    private val changedFunction =
+        composerIrClass.functions.first {
             it.name.identifier == "changed" && it.valueParameters.first().type.isNullableAny()
         }
 
-    private val changedInstanceFunction = composerIrClass.functions
-        .firstOrNull {
+    private val changedInstanceFunction =
+        composerIrClass.functions.firstOrNull {
             it.name.identifier == "changedInstance" &&
                 it.valueParameters.first().type.isNullableAny()
         } ?: changedFunction
@@ -1379,8 +1283,8 @@
     private val startReplaceFunction by guardedLazy {
         composerIrClass.functions.firstOrNull {
             it.name.identifier == "startReplaceGroup" && it.valueParameters.size == 1
-        } ?: composerIrClass.functions
-            .first {
+        }
+            ?: composerIrClass.functions.first {
                 it.name.identifier == "startReplaceableGroup" && it.valueParameters.size == 1
             }
     }
@@ -1388,27 +1292,27 @@
     private val endReplaceFunction by guardedLazy {
         composerIrClass.functions.firstOrNull {
             it.name.identifier == "endReplaceGroup" && it.valueParameters.isEmpty()
-        } ?: composerIrClass.functions
-            .first {
+        }
+            ?: composerIrClass.functions.first {
                 it.name.identifier == "endReplaceableGroup" && it.valueParameters.isEmpty()
             }
     }
 
-    private fun IrType.toPrimitiveType(): PrimitiveType? = when {
-        isInt() -> PrimitiveType.INT
-        isBoolean() -> PrimitiveType.BOOLEAN
-        isFloat() -> PrimitiveType.FLOAT
-        isLong() -> PrimitiveType.LONG
-        isDouble() -> PrimitiveType.DOUBLE
-        isByte() -> PrimitiveType.BYTE
-        isChar() -> PrimitiveType.CHAR
-        isShort() -> PrimitiveType.SHORT
-        else -> null
-    }
+    private fun IrType.toPrimitiveType(): PrimitiveType? =
+        when {
+            isInt() -> PrimitiveType.INT
+            isBoolean() -> PrimitiveType.BOOLEAN
+            isFloat() -> PrimitiveType.FLOAT
+            isLong() -> PrimitiveType.LONG
+            isDouble() -> PrimitiveType.DOUBLE
+            isByte() -> PrimitiveType.BYTE
+            isChar() -> PrimitiveType.CHAR
+            isShort() -> PrimitiveType.SHORT
+            else -> null
+        }
 
     private val changedPrimitiveFunctions by guardedLazy {
-        composerIrClass
-            .functions
+        composerIrClass.functions
             .filter { it.name.identifier == "changed" }
             .mapNotNull { f ->
                 f.valueParameters.first().type.toPrimitiveType()?.let { primitive ->
@@ -1424,9 +1328,7 @@
         startOffset: Int = UNDEFINED_OFFSET,
         endOffset: Int = UNDEFINED_OFFSET
     ): IrCall {
-        return irCall(function, startOffset, endOffset).apply {
-            dispatchReceiver = target
-        }
+        return irCall(function, startOffset, endOffset).apply { dispatchReceiver = target }
     }
 
     fun irCall(
@@ -1452,20 +1354,19 @@
         newFunction.copyTypeParametersFrom(original)
 
         // ..but we need to remap the return type as well
-        newFunction.returnType = newFunction.returnType.remapTypeParameters(
-            source = original,
-            target = newFunction
-        )
-        newFunction.valueParameters = original.valueParameters.map {
-            val name = dexSafeName(it.name)
-            it.copyTo(
-                newFunction,
-                name = name,
-                type = it.type.remapTypeParameters(original, newFunction),
-                // remapping the type parameters explicitly
-                defaultValue = it.defaultValue?.copyWithNewTypeParams(original, newFunction)
-            )
-        }
+        newFunction.returnType =
+            newFunction.returnType.remapTypeParameters(source = original, target = newFunction)
+        newFunction.valueParameters =
+            original.valueParameters.map {
+                val name = dexSafeName(it.name)
+                it.copyTo(
+                    newFunction,
+                    name = name,
+                    type = it.type.remapTypeParameters(original, newFunction),
+                    // remapping the type parameters explicitly
+                    defaultValue = it.defaultValue?.copyWithNewTypeParams(original, newFunction)
+                )
+            }
         newFunction.dispatchReceiverParameter =
             original.dispatchReceiverParameter?.copyTo(newFunction)
         newFunction.extensionReceiverParameter =
@@ -1480,58 +1381,58 @@
     }
 
     /**
-     *  Expressions for default values can use other parameters.
-     *  In such cases we need to ensure that default values expressions use parameters of the new
-     *  function (new/copied value parameters).
+     * Expressions for default values can use other parameters. In such cases we need to ensure that
+     * default values expressions use parameters of the new function (new/copied value parameters).
      *
-     *  Example:
-     *  fun Foo(a: String, b: String = a) {...}
+     * Example: fun Foo(a: String, b: String = a) {...}
      */
     private fun IrExpressionBody.transformDefaultValue(
         originalFunction: IrFunction,
         newFunction: IrFunction
     ) {
-        transformChildrenVoid(object : IrElementTransformerVoid() {
-            override fun visitGetValue(expression: IrGetValue): IrExpression {
-                val original = super.visitGetValue(expression)
-                val valueParameter =
-                    (expression.symbol.owner as? IrValueParameter) ?: return original
+        transformChildrenVoid(
+            object : IrElementTransformerVoid() {
+                override fun visitGetValue(expression: IrGetValue): IrExpression {
+                    val original = super.visitGetValue(expression)
+                    val valueParameter =
+                        (expression.symbol.owner as? IrValueParameter) ?: return original
 
-                val parameterIndex = valueParameter.index
-                if (valueParameter.parent != originalFunction) {
-                    return super.visitGetValue(expression)
-                }
-                if (parameterIndex < 0) {
-                    when (valueParameter) {
-                        originalFunction.dispatchReceiverParameter -> {
-                            return IrGetValueImpl(
-                                expression.startOffset,
-                                expression.endOffset,
-                                newFunction.dispatchReceiverParameter!!.symbol,
-                                expression.origin
-                            )
-                        }
-                        originalFunction.extensionReceiverParameter -> {
-                            return IrGetValueImpl(
-                                expression.startOffset,
-                                expression.endOffset,
-                                newFunction.extensionReceiverParameter!!.symbol,
-                                expression.origin
-                            )
-                        }
-                        else -> {
-                            error("Cannot copy parameter: ${valueParameter.dump()}")
+                    val parameterIndex = valueParameter.index
+                    if (valueParameter.parent != originalFunction) {
+                        return super.visitGetValue(expression)
+                    }
+                    if (parameterIndex < 0) {
+                        when (valueParameter) {
+                            originalFunction.dispatchReceiverParameter -> {
+                                return IrGetValueImpl(
+                                    expression.startOffset,
+                                    expression.endOffset,
+                                    newFunction.dispatchReceiverParameter!!.symbol,
+                                    expression.origin
+                                )
+                            }
+                            originalFunction.extensionReceiverParameter -> {
+                                return IrGetValueImpl(
+                                    expression.startOffset,
+                                    expression.endOffset,
+                                    newFunction.extensionReceiverParameter!!.symbol,
+                                    expression.origin
+                                )
+                            }
+                            else -> {
+                                error("Cannot copy parameter: ${valueParameter.dump()}")
+                            }
                         }
                     }
+                    return IrGetValueImpl(
+                        expression.startOffset,
+                        expression.endOffset,
+                        newFunction.valueParameters[parameterIndex].symbol,
+                        expression.origin
+                    )
                 }
-                return IrGetValueImpl(
-                    expression.startOffset,
-                    expression.endOffset,
-                    newFunction.valueParameters[parameterIndex].symbol,
-                    expression.origin
-                )
             }
-        })
+        )
     }
 }
 
@@ -1575,5 +1476,4 @@
     }
 }
 
-fun FqName.topLevelName() =
-    asString().substringBefore(".")
+fun FqName.topLevelName() = asString().substringBefore(".")
diff --git a/compose/compiler/compiler-hosted/src/main/java/androidx/compose/compiler/plugins/kotlin/lower/ClassStabilityFieldSerializationPlugin.kt b/compose/compiler/compiler-hosted/src/main/java/androidx/compose/compiler/plugins/kotlin/lower/ClassStabilityFieldSerializationPlugin.kt
index 0f1de84..fef825c 100644
--- a/compose/compiler/compiler-hosted/src/main/java/androidx/compose/compiler/plugins/kotlin/lower/ClassStabilityFieldSerializationPlugin.kt
+++ b/compose/compiler/compiler-hosted/src/main/java/androidx/compose/compiler/plugins/kotlin/lower/ClassStabilityFieldSerializationPlugin.kt
@@ -33,10 +33,10 @@
  * determined at runtime. We need to know from other modules whether or not this field got
  * synthesized or not though, and to do that, we also synthesize an annotation on the class.
  *
- * The kotlin metadata has a flag to indicate whether or not there are any annotations on the
- * class or not. If the flag is false, then a synthesized annotation will never be seen from
- * another module, so we have to use this plugin to flip the flag for all classes that we
- * synthesize the annotation on, even if the source of the class didn't have any annotations.
+ * The kotlin metadata has a flag to indicate whether or not there are any annotations on the class
+ * or not. If the flag is false, then a synthesized annotation will never be seen from another
+ * module, so we have to use this plugin to flip the flag for all classes that we synthesize the
+ * annotation on, even if the source of the class didn't have any annotations.
  */
 class ClassStabilityFieldSerializationPlugin(
     val classStabilityInferredCollection: ClassStabilityInferredCollection? = null
@@ -47,19 +47,23 @@
         extension: SerializerExtension,
         value: Int
     ): ProtoBuf.Annotation {
-        return ProtoBuf.Annotation.newBuilder().apply {
-            id = extension.stringTable.getQualifiedClassNameIndex(StabilityInferred)
-            // Same as in StabilityInferred definition
-            val ix = extension.stringTable.getStringIndex("parameters")
-            addArgument(ProtoBuf.Annotation.Argument.newBuilder().apply {
-                setNameId(ix)
-                setValue(
-                    ProtoBuf.Annotation.Argument.Value.newBuilder()
-                        .setIntValue(value.toLong())
-                        .setType(ProtoBuf.Annotation.Argument.Value.Type.INT)
+        return ProtoBuf.Annotation.newBuilder()
+            .apply {
+                id = extension.stringTable.getQualifiedClassNameIndex(StabilityInferred)
+                // Same as in StabilityInferred definition
+                val ix = extension.stringTable.getStringIndex("parameters")
+                addArgument(
+                    ProtoBuf.Annotation.Argument.newBuilder().apply {
+                        setNameId(ix)
+                        setValue(
+                            ProtoBuf.Annotation.Argument.Value.newBuilder()
+                                .setIntValue(value.toLong())
+                                .setType(ProtoBuf.Annotation.Argument.Value.Type.INT)
+                        )
+                    }
                 )
-            })
-        }.build()
+            }
+            .build()
     }
 
     override fun afterClass(
@@ -71,15 +75,16 @@
     ) {
         if (
             descriptor.visibility != DescriptorVisibilities.PUBLIC ||
-            descriptor.kind == ClassKind.ENUM_CLASS ||
-            descriptor.kind == ClassKind.ENUM_ENTRY ||
-            descriptor.kind == ClassKind.INTERFACE ||
-            descriptor.kind == ClassKind.ANNOTATION_CLASS ||
-            descriptor.isExpect ||
-            descriptor.isInner ||
-            descriptor.isCompanionObject ||
-            descriptor.isInline
-        ) return
+                descriptor.kind == ClassKind.ENUM_CLASS ||
+                descriptor.kind == ClassKind.ENUM_ENTRY ||
+                descriptor.kind == ClassKind.INTERFACE ||
+                descriptor.kind == ClassKind.ANNOTATION_CLASS ||
+                descriptor.isExpect ||
+                descriptor.isInner ||
+                descriptor.isCompanionObject ||
+                descriptor.isInline
+        )
+            return
 
         if (proto.flags and hasAnnotationFlag == 0) {
             proto.flags = proto.flags or hasAnnotationFlag
diff --git a/compose/compiler/compiler-hosted/src/main/java/androidx/compose/compiler/plugins/kotlin/lower/ClassStabilityInferredCollection.kt b/compose/compiler/compiler-hosted/src/main/java/androidx/compose/compiler/plugins/kotlin/lower/ClassStabilityInferredCollection.kt
index 11a1b69..6fa60cb 100644
--- a/compose/compiler/compiler-hosted/src/main/java/androidx/compose/compiler/plugins/kotlin/lower/ClassStabilityInferredCollection.kt
+++ b/compose/compiler/compiler-hosted/src/main/java/androidx/compose/compiler/plugins/kotlin/lower/ClassStabilityInferredCollection.kt
@@ -20,9 +20,7 @@
 import org.jetbrains.kotlin.ir.ObsoleteDescriptorBasedAPI
 import org.jetbrains.kotlin.ir.declarations.IrClass
 
-/**
- * Used with K1 only.
- */
+/** Used with K1 only. */
 class ClassStabilityInferredCollection {
 
     private val classesToValues = mutableMapOf<ClassDescriptor, Int>()
diff --git a/compose/compiler/compiler-hosted/src/main/java/androidx/compose/compiler/plugins/kotlin/lower/ClassStabilityTransformer.kt b/compose/compiler/compiler-hosted/src/main/java/androidx/compose/compiler/plugins/kotlin/lower/ClassStabilityTransformer.kt
index 9cd186c..3b84dab 100644
--- a/compose/compiler/compiler-hosted/src/main/java/androidx/compose/compiler/plugins/kotlin/lower/ClassStabilityTransformer.kt
+++ b/compose/compiler/compiler-hosted/src/main/java/androidx/compose/compiler/plugins/kotlin/lower/ClassStabilityTransformer.kt
@@ -53,6 +53,7 @@
 enum class StabilityBits(val bits: Int) {
     UNSTABLE(0b100),
     STABLE(0b000);
+
     fun bitsForSlot(slot: Int): Int = bits shl (1 + slot * 3)
 }
 
@@ -68,7 +69,8 @@
     stabilityInferencer: StabilityInferencer,
     private val classStabilityInferredCollection: ClassStabilityInferredCollection? = null,
     featureFlags: FeatureFlags,
-) : AbstractComposeLowering(context, symbolRemapper, metrics, stabilityInferencer, featureFlags),
+) :
+    AbstractComposeLowering(context, symbolRemapper, metrics, stabilityInferencer, featureFlags),
     ClassLoweringPass,
     ModuleLoweringPass {
 
@@ -80,8 +82,7 @@
         module.transformChildrenVoid(this)
     }
 
-    override fun lower(irClass: IrClass) {
-    }
+    override fun lower(irClass: IrClass) {}
 
     override fun lower(irFile: IrFile) {
         irFile.transformChildrenVoid(this)
@@ -93,22 +94,22 @@
 
         if (
             (
-                // Including public AND internal to support incremental compilation, which
-                // is separated by file.
-                cls.visibility != DescriptorVisibilities.PUBLIC &&
-                    cls.visibility != DescriptorVisibilities.INTERNAL
-            ) ||
-            cls.isEnumClass ||
-            cls.isEnumEntry ||
-            cls.isInterface ||
-            cls.isAnnotationClass ||
-            cls.isAnonymousObject ||
-            cls.isExpect ||
-            cls.isInner ||
-            cls.isFileClass ||
-            cls.isCompanion ||
-            cls.defaultType.isInlineClassType()
-        ) return cls
+            // Including public AND internal to support incremental compilation, which
+            // is separated by file.
+            cls.visibility != DescriptorVisibilities.PUBLIC &&
+                cls.visibility != DescriptorVisibilities.INTERNAL) ||
+                cls.isEnumClass ||
+                cls.isEnumEntry ||
+                cls.isInterface ||
+                cls.isAnnotationClass ||
+                cls.isAnonymousObject ||
+                cls.isExpect ||
+                cls.isInner ||
+                cls.isFileClass ||
+                cls.isCompanion ||
+                cls.defaultType.isInlineClassType()
+        )
+            return cls
 
         if (declaration.hasStableMarker()) {
             metrics.recordClass(
@@ -143,7 +144,6 @@
                             externalParameters = true
                         }
                     }
-
                     else -> {
                         /* No action necessary */
                     }
@@ -152,33 +152,28 @@
             if (stability.knownStable() && symbols.size < 32) {
                 parameterMask = parameterMask or (0b1 shl symbols.size)
             }
-            stableExpr = if (externalParameters)
-                irConst(UNSTABLE)
-            else
-                stability.irStableExpression { irConst(STABLE) } ?: irConst(UNSTABLE)
+            stableExpr =
+                if (externalParameters) irConst(UNSTABLE)
+                else stability.irStableExpression { irConst(STABLE) } ?: irConst(UNSTABLE)
         } else {
             stableExpr = stability.irStableExpression() ?: irConst(UNSTABLE)
             if (stability.knownStable()) {
                 parameterMask = 0b1
             }
         }
-        metrics.recordClass(
-            declaration,
-            marked = false,
-            stability = stability
-        )
-        val annotation = IrConstructorCallImpl(
-            UNDEFINED_OFFSET,
-            UNDEFINED_OFFSET,
-            StabilityInferredClass.defaultType,
-            StabilityInferredClass.constructors.first(),
-            0,
-            0,
-            1,
-            null
-        ).also {
-            it.putValueArgument(0, irConst(parameterMask))
-        }
+        metrics.recordClass(declaration, marked = false, stability = stability)
+        val annotation =
+            IrConstructorCallImpl(
+                    UNDEFINED_OFFSET,
+                    UNDEFINED_OFFSET,
+                    StabilityInferredClass.defaultType,
+                    StabilityInferredClass.constructors.first(),
+                    0,
+                    0,
+                    1,
+                    null
+                )
+                .also { it.putValueArgument(0, irConst(parameterMask)) }
 
         if (useK2) {
             context.annotationsRegistrar.addMetadataVisibleAnnotationsToElement(cls, annotation)
@@ -192,13 +187,11 @@
     }
 
     private fun IrClass.addStabilityMarkerField(stabilityExpression: IrExpression) {
-        val stabilityField = this.makeStabilityField().apply {
-            initializer = IrExpressionBodyImpl(
-                UNDEFINED_OFFSET,
-                UNDEFINED_OFFSET,
-                stabilityExpression
-            )
-        }
+        val stabilityField =
+            this.makeStabilityField().apply {
+                initializer =
+                    IrExpressionBodyImpl(UNDEFINED_OFFSET, UNDEFINED_OFFSET, stabilityExpression)
+            }
 
         if (context.platform.isJvm()) {
             declarations += stabilityField
diff --git a/compose/compiler/compiler-hosted/src/main/java/androidx/compose/compiler/plugins/kotlin/lower/ComposableDefaultParamLowering.kt b/compose/compiler/compiler-hosted/src/main/java/androidx/compose/compiler/plugins/kotlin/lower/ComposableDefaultParamLowering.kt
index beb7621..4d8dc1b 100644
--- a/compose/compiler/compiler-hosted/src/main/java/androidx/compose/compiler/plugins/kotlin/lower/ComposableDefaultParamLowering.kt
+++ b/compose/compiler/compiler-hosted/src/main/java/androidx/compose/compiler/plugins/kotlin/lower/ComposableDefaultParamLowering.kt
@@ -81,7 +81,7 @@
  *     Test$DefaultsImpl.doSomething(instance)
  *     Test$DefaultsImpl.doSomething(instance, 0)
  * }
- *```
+ * ```
  */
 class ComposableDefaultParamLowering(
     context: IrPluginContext,
@@ -126,22 +126,19 @@
             return super.visitCall(expression)
         }
 
-        val newCall = irCall(
-            wrapper,
-            expression.startOffset,
-            expression.endOffset
-        ).also { newCall ->
-            var argCount = expression.valueArgumentsCount
-            for (i in 0 until argCount) {
-                newCall.putValueArgument(i, expression.getValueArgument(i))
+        val newCall =
+            irCall(wrapper, expression.startOffset, expression.endOffset).also { newCall ->
+                var argCount = expression.valueArgumentsCount
+                for (i in 0 until argCount) {
+                    newCall.putValueArgument(i, expression.getValueArgument(i))
+                }
+                if (expression.dispatchReceiver != null) {
+                    newCall.putValueArgument(argCount++, expression.dispatchReceiver)
+                }
+                if (expression.extensionReceiver != null) {
+                    newCall.putValueArgument(argCount, expression.extensionReceiver)
+                }
             }
-            if (expression.dispatchReceiver != null) {
-                newCall.putValueArgument(argCount++, expression.dispatchReceiver)
-            }
-            if (expression.extensionReceiver != null) {
-                newCall.putValueArgument(argCount, expression.extensionReceiver)
-            }
-        }
 
         return super.visitCall(newCall)
     }
@@ -158,15 +155,9 @@
             else -> error("Cannot add wrapper function to $parent")
         }
 
-        context.irTrace.record(
-            ComposeWritableSlices.IS_VIRTUAL_WITH_DEFAULT_PARAM,
-            this,
-            true
-        )
+        context.irTrace.record(ComposeWritableSlices.IS_VIRTUAL_WITH_DEFAULT_PARAM, this, true)
 
-        valueParameters.forEach {
-            it.defaultValue = null
-        }
+        valueParameters.forEach { it.defaultValue = null }
 
         return wrapper
     }
@@ -197,30 +188,27 @@
             overriddenSymbols.isEmpty() && // first in the chain of overrides
             valueParameters.any { it.defaultValue != null } // has a default parameter
 
-    private fun makeDefaultParameterWrapper(
-        source: IrSimpleFunction
-    ): IrSimpleFunction {
-        val wrapper = context.irFactory.createSimpleFunction(
-            startOffset = source.startOffset,
-            endOffset = source.endOffset,
-            origin = IrDeclarationOrigin.DEFINED,
-            name = Name.identifier("${source.name.asString()}\$default"),
-            visibility = source.visibility,
-            isInline = false,
-            isExpect = false,
-            returnType = source.returnType,
-            modality = Modality.FINAL,
-            symbol = IrSimpleFunctionSymbolImpl(),
-            isTailrec = source.isTailrec,
-            isSuspend = false,
-            isOperator = false,
-            isInfix = false,
-        )
+    private fun makeDefaultParameterWrapper(source: IrSimpleFunction): IrSimpleFunction {
+        val wrapper =
+            context.irFactory.createSimpleFunction(
+                startOffset = source.startOffset,
+                endOffset = source.endOffset,
+                origin = IrDeclarationOrigin.DEFINED,
+                name = Name.identifier("${source.name.asString()}\$default"),
+                visibility = source.visibility,
+                isInline = false,
+                isExpect = false,
+                returnType = source.returnType,
+                modality = Modality.FINAL,
+                symbol = IrSimpleFunctionSymbolImpl(),
+                isTailrec = source.isTailrec,
+                isSuspend = false,
+                isOperator = false,
+                isInfix = false,
+            )
         wrapper.copyAnnotationsFrom(source)
         wrapper.copyParametersFrom(source)
-        wrapper.valueParameters.forEach {
-            it.defaultValue?.transformChildrenVoid()
-        }
+        wrapper.valueParameters.forEach { it.defaultValue?.transformChildrenVoid() }
         // move receiver parameters to value parameters
         val dispatcherReceiver = wrapper.dispatchReceiverParameter
         var index = wrapper.valueParameters.size
@@ -236,35 +224,34 @@
             wrapper.extensionReceiverParameter = null
         }
 
-        wrapper.body = DeclarationIrBuilder(
-            context,
-            wrapper.symbol
-        ).irBlockBody {
-            +irCall(
-                source.symbol,
-                dispatchReceiver = dispatcherReceiver?.let(::irGet),
-                extensionReceiver = extensionReceiver?.let(::irGet),
-                args = Array(source.valueParameters.size) {
-                    irGet(wrapper.valueParameters[it])
-                }
-            )
-        }
+        wrapper.body =
+            DeclarationIrBuilder(context, wrapper.symbol).irBlockBody {
+                +irCall(
+                    source.symbol,
+                    dispatchReceiver = dispatcherReceiver?.let(::irGet),
+                    extensionReceiver = extensionReceiver?.let(::irGet),
+                    args = Array(source.valueParameters.size) { irGet(wrapper.valueParameters[it]) }
+                )
+            }
 
         return wrapper
     }
 
     private fun getOrCreateDefaultImpls(parent: IrClass): IrClass {
-        val cls = parent.declarations.find {
-            it is IrClass && it.name == ComposeNames.DEFAULT_IMPLS
-        } as? IrClass
+        val cls =
+            parent.declarations.find { it is IrClass && it.name == ComposeNames.DEFAULT_IMPLS }
+                as? IrClass
 
-        return cls ?: context.irFactory.buildClass {
-            startOffset = parent.startOffset
-            endOffset = parent.endOffset
-            name = ComposeNames.DEFAULT_IMPLS
-        }.apply {
-            parent.addChild(this)
-            createImplicitParameterDeclarationWithWrappedDescriptor()
-        }
+        return cls
+            ?: context.irFactory
+                .buildClass {
+                    startOffset = parent.startOffset
+                    endOffset = parent.endOffset
+                    name = ComposeNames.DEFAULT_IMPLS
+                }
+                .apply {
+                    parent.addChild(this)
+                    createImplicitParameterDeclarationWithWrappedDescriptor()
+                }
     }
 }
diff --git a/compose/compiler/compiler-hosted/src/main/java/androidx/compose/compiler/plugins/kotlin/lower/ComposableFunInterfaceLowering.kt b/compose/compiler/compiler-hosted/src/main/java/androidx/compose/compiler/plugins/kotlin/lower/ComposableFunInterfaceLowering.kt
index 9bacca8..8cec4d0 100644
--- a/compose/compiler/compiler-hosted/src/main/java/androidx/compose/compiler/plugins/kotlin/lower/ComposableFunInterfaceLowering.kt
+++ b/compose/compiler/compiler-hosted/src/main/java/androidx/compose/compiler/plugins/kotlin/lower/ComposableFunInterfaceLowering.kt
@@ -36,8 +36,7 @@
 
 @Suppress("PRE_RELEASE_CLASS")
 class ComposableFunInterfaceLowering(private val context: IrPluginContext) :
-    IrElementTransformerVoidWithContext(),
-    ModuleLoweringPass {
+    IrElementTransformerVoidWithContext(), ModuleLoweringPass {
 
     override fun lower(module: IrModuleFragment) {
         if (context.platform.isJvm()) {
@@ -52,14 +51,15 @@
             val superType = expression.typeOperand
             val superClass = superType.classOrNull ?: error("Expected non-null class")
             return FunctionReferenceBuilder(
-                argument,
-                superClass,
-                superType,
-                currentDeclarationParent!!,
-                context,
-                currentScope!!.scope.scopeOwnerSymbol,
-                IrTypeSystemContextImpl(context.irBuiltIns)
-            ).build()
+                    argument,
+                    superClass,
+                    superType,
+                    currentDeclarationParent!!,
+                    context,
+                    currentScope!!.scope.scopeOwnerSymbol,
+                    IrTypeSystemContextImpl(context.irBuiltIns)
+                )
+                .build()
         }
         return super.visitTypeOperator(expression)
     }
@@ -78,9 +78,8 @@
     val type = typeOperand
     val functionClass = type.classOrNull
 
-    val isFunInterfaceConversion = operator == SAM_CONVERSION &&
-        functionClass != null &&
-        functionClass.owner.isFun
+    val isFunInterfaceConversion =
+        operator == SAM_CONVERSION && functionClass != null && functionClass.owner.isFun
 
     return if (isFunInterfaceConversion) {
         // if you modify this logic, make sure to update wrapping of type operators
diff --git a/compose/compiler/compiler-hosted/src/main/java/androidx/compose/compiler/plugins/kotlin/lower/ComposableFunctionBodyTransformer.kt b/compose/compiler/compiler-hosted/src/main/java/androidx/compose/compiler/plugins/kotlin/lower/ComposableFunctionBodyTransformer.kt
index 333f631..bad2dcf 100644
--- a/compose/compiler/compiler-hosted/src/main/java/androidx/compose/compiler/plugins/kotlin/lower/ComposableFunctionBodyTransformer.kt
+++ b/compose/compiler/compiler-hosted/src/main/java/androidx/compose/compiler/plugins/kotlin/lower/ComposableFunctionBodyTransformer.kt
@@ -155,24 +155,23 @@
 enum class ParamState(val bits: Int) {
     /**
      * Indicates that nothing is certain about the current state of the parameter. It could be
-     * different than it was during the last execution, or it could be the same, but it is not
-     * known so the current function looking at it must call equals on it in order to find out.
-     * This is the only state that can cause the function to spend slot table space in order to
-     * look at it.
+     * different than it was during the last execution, or it could be the same, but it is not known
+     * so the current function looking at it must call equals on it in order to find out. This is
+     * the only state that can cause the function to spend slot table space in order to look at it.
      */
     Uncertain(0b000),
     /**
      * This indicates that the value is known to be the same since the last time the function was
      * executed. There is no need to store the value in the slot table in this case because the
-     * calling function will *always* know whether the value was the same or different as it was
-     * in the previous execution.
+     * calling function will *always* know whether the value was the same or different as it was in
+     * the previous execution.
      */
     Same(0b001),
     /**
-     * This indicates that the value is known to be different since the last time the function
-     * was executed. There is no need to store the value in the slot table in this case because
-     * the calling function will *always* know whether the value was the same or different as it
-     * was in the previous execution.
+     * This indicates that the value is known to be different since the last time the function was
+     * executed. There is no need to store the value in the slot table in this case because the
+     * calling function will *always* know whether the value was the same or different as it was in
+     * the previous execution.
      */
     Different(0b010),
     /**
@@ -196,6 +195,7 @@
 }
 
 fun defaultsParamIndex(index: Int): Int = index / BITS_PER_INT
+
 fun defaultsBitIndex(index: Int): Int = index.rem(BITS_PER_INT)
 
 /**
@@ -205,23 +205,22 @@
  * but context receiver parameter ([IrFunction.contextReceiverParametersCount]) will.
  */
 val IrFunction.thisParamCount
-    get() = contextReceiverParametersCount +
-        (if (dispatchReceiverParameter != null) 1 else 0) +
-        (if (extensionReceiverParameter != null) 1 else 0)
+    get() =
+        contextReceiverParametersCount +
+            (if (dispatchReceiverParameter != null) 1 else 0) +
+            (if (extensionReceiverParameter != null) 1 else 0)
 
 /**
  * Calculates the number of 'changed' params needed based on the function's parameters.
  *
- * @param realValueParams The number of params defined by the user, those that are not implicit
- * (no extension or context receivers) or synthetic (no %composer, %changed or %defaults).
+ * @param realValueParams The number of params defined by the user, those that are not implicit (no
+ *   extension or context receivers) or synthetic (no %composer, %changed or %defaults).
  * @param thisParams The number of implicit params, i.e. [IrFunction.thisParamCount]
  */
 fun changedParamCount(realValueParams: Int, thisParams: Int): Int {
     val totalParams = realValueParams + thisParams
     if (totalParams == 0) return 1 // There is always at least 1 changed param
-    return ceil(
-        totalParams.toDouble() / SLOTS_PER_INT.toDouble()
-    ).toInt()
+    return ceil(totalParams.toDouble() / SLOTS_PER_INT.toDouble()).toInt()
 }
 
 /**
@@ -229,7 +228,7 @@
  * parameters.
  *
  * @param totalParamsIncludingThisParams The total number of parameter including implicit and
- * synthetic ones.
+ *   synthetic ones.
  */
 fun changedParamCountFromTotal(totalParamsIncludingThisParams: Int): Int {
     var realParams = totalParamsIncludingThisParams
@@ -246,13 +245,11 @@
 /**
  * Calculates the number of 'defaults' params needed based on the function's parameters.
  *
- * @param valueParams The numbers of params, usually the size of [IrFunction.valueParameters].
- * Which includes context receivers params, but not extension param nor synthetic params.
+ * @param valueParams The numbers of params, usually the size of [IrFunction.valueParameters]. Which
+ *   includes context receivers params, but not extension param nor synthetic params.
  */
 fun defaultParamCount(valueParams: Int): Int {
-    return ceil(
-        valueParams.toDouble() / BITS_PER_INT.toDouble()
-    ).toInt()
+    return ceil(valueParams.toDouble() / BITS_PER_INT.toDouble()).toInt()
 }
 
 fun composeSyntheticParamCount(
@@ -267,41 +264,52 @@
 interface IrChangedBitMaskValue {
     val used: Boolean
     val declarations: List<IrValueDeclaration>
+
     fun irLowBit(): IrExpression
+
     fun irIsolateBitsAtSlot(slot: Int, includeStableBit: Boolean): IrExpression
+
     fun irSlotAnd(slot: Int, bits: Int): IrExpression
+
     fun irHasDifferences(usedParams: BooleanArray): IrExpression
+
     fun irCopyToTemporary(
         nameHint: String? = null,
         isVar: Boolean = false,
         exactName: Boolean = false
     ): IrChangedBitMaskVariable
+
     fun putAsValueArgumentInWithLowBit(
         fn: IrFunctionAccessExpression,
         startIndex: Int,
         lowBit: Boolean
     )
+
     fun irShiftBits(fromSlot: Int, toSlot: Int): IrExpression
+
     fun irStableBitAtSlot(slot: Int): IrExpression
 }
 
 interface IrDefaultBitMaskValue {
     fun irIsolateBitAtIndex(index: Int): IrExpression
+
     fun irHasAnyProvidedAndUnstable(unstable: BooleanArray): IrExpression
+
     fun putAsValueArgumentIn(fn: IrFunctionAccessExpression, startIndex: Int)
 }
 
 @JvmDefaultWithCompatibility
 interface IrChangedBitMaskVariable : IrChangedBitMaskValue {
     fun asStatements(): List<IrStatement>
+
     fun irOrSetBitsAtSlot(slot: Int, value: IrExpression): IrExpression
+
     fun irSetSlotUncertain(slot: Int): IrExpression
 }
 
 /**
  * This IR Transform is responsible for the main transformations of the body of a composable
  * function.
- *
  * 1. Control-Flow Group Generation
  * 2. Default arguments
  * 3. Composable Function Skipping
@@ -312,36 +320,34 @@
  * Control-Flow Group Generation
  * =============================
  *
- * This transform will insert groups inside of the bodies of Composable functions
- * depending on the control-flow structures that exist inside of them.
+ * This transform will insert groups inside of the bodies of Composable functions depending on the
+ * control-flow structures that exist inside of them.
  *
  * There are 3 types of groups in Compose:
- *
  * 1. Replace Groups
  * 2. Movable Groups
  * 3. Restart Groups
  *
- * Generally speaking, every composable function *must* emit a single group when it executes.
- * Every group can have any number of children groups. Additionally, we analyze each executable
- * block and apply the following rules:
- *
+ * Generally speaking, every composable function *must* emit a single group when it executes. Every
+ * group can have any number of children groups. Additionally, we analyze each executable block and
+ * apply the following rules:
  * 1. If a block executes exactly 1 time always, no groups are needed
  * 2. If a set of blocks are such that exactly one of them is executed exactly once (for example,
- * the result blocks of a when clause), then we insert a replace group around each block.
+ *    the result blocks of a when clause), then we insert a replace group around each block.
  * 3. A movable group is only needed if the immediate composable call in the group has a Pivotal
- * property.
+ *    property.
  *
  * Default Arguments
  * =================
  *
  * Composable functions need to have the default expressions executed inside of the group of the
- * function. In order to accomplish this, composable functions handle default arguments
- * themselves, instead of using the default handling of kotlin. This is also a win because we can
- * handle the default arguments without generating an additional function since we do not need to
- * worry about callers from java. Generally speaking though, compose handles default arguments
- * similarly to kotlin in that we generate a $default bitmask parameter which maps each parameter
- * index to a bit on the int. A value of "1" for a given parameter index indicated that that
- * value was *not* provided at the callsite, and the default expression should be used instead.
+ * function. In order to accomplish this, composable functions handle default arguments themselves,
+ * instead of using the default handling of kotlin. This is also a win because we can handle the
+ * default arguments without generating an additional function since we do not need to worry about
+ * callers from java. Generally speaking though, compose handles default arguments similarly to
+ * kotlin in that we generate a $default bitmask parameter which maps each parameter index to a bit
+ * on the int. A value of "1" for a given parameter index indicated that that value was *not*
+ * provided at the callsite, and the default expression should be used instead.
  *
  *     @Composable fun A(x: Int = 0) {
  *       f(x)
@@ -361,8 +367,8 @@
  * ============================
  *
  * Composable functions can "skip" their execution if certain conditions are met. This is done by
- * appealing to the composer and storing previous values of functions and determining if we can
- * skip based on whether or not they have changed.
+ * appealing to the composer and storing previous values of functions and determining if we can skip
+ * based on whether or not they have changed.
  *
  *     @Composable fun A(x: Int) {
  *       f(x)
@@ -382,24 +388,23 @@
  *      }
  *     }
  *
- * Note that this makes use of bitmasks for the $changed and $dirty values. These bitmasks work
- * in a different bit-space than the $default bitmask because three bits are needed to hold the
- * six different possible states of each parameter. Additionally, the lowest bit of the bitmask
- * is a special bit which forces execution of the function.
+ * Note that this makes use of bitmasks for the $changed and $dirty values. These bitmasks work in a
+ * different bit-space than the $default bitmask because three bits are needed to hold the six
+ * different possible states of each parameter. Additionally, the lowest bit of the bitmask is a
+ * special bit which forces execution of the function.
  *
- * This means that for the ith parameter of a composable function, the bit range of i*3 + 1 to
- * i*3 + 3 are used to store the state of the parameter.
+ * This means that for the ith parameter of a composable function, the bit range of i*3 + 1 to i*3 +
+ * 3 are used to store the state of the parameter.
  *
  * The states are outlines by the [ParamState] class.
  *
  * Comparison Propagation
  * ======================
  *
- * Because we detect changes in parameters of composable functions and have that data available
- * in the body of a composable function, if we pass values to another composable function, it
- * makes sense for us to pass on whatever information about that value we can determine at the
- * time. This type of propagation of information through composable functions is called
- * Comparison Propagation.
+ * Because we detect changes in parameters of composable functions and have that data available in
+ * the body of a composable function, if we pass values to another composable function, it makes
+ * sense for us to pass on whatever information about that value we can determine at the time. This
+ * type of propagation of information through composable functions is called Comparison Propagation.
  *
  * Essentially, this comes down to us passing in useful values into the `$changed` parameter of
  * composable functions.
@@ -429,11 +434,11 @@
  * Recomposability
  * ===============
  *
- * Restartable composable functions get wrapped with "restart groups". Restart groups are like
- * other groups except the end call is more complicated, as it returns a null value if and
- * only if a subscription to that scope could not have occurred. If the value returned is
- * non-null, we generate a lambda that teaches the runtime how to "restart" that group. At a high
- * level, this transform comes down to:
+ * Restartable composable functions get wrapped with "restart groups". Restart groups are like other
+ * groups except the end call is more complicated, as it returns a null value if and only if a
+ * subscription to that scope could not have occurred. If the value returned is non-null, we
+ * generate a lambda that teaches the runtime how to "restart" that group. At a high level, this
+ * transform comes down to:
  *
  *     @Composable fun A(x: Int) {
  *       f(x)
@@ -451,9 +456,9 @@
  * Source information
  * ==================
  * To enable Android Studio and similar tools to inspect a composition, source information is
- * optionally generated into the source to indicate where call occur in a block. The first group
- * of every function is also marked to correspond to indicate that the group corresponds to a call
- * and the source location of the caller can be determined from the containing group.
+ * optionally generated into the source to indicate where call occur in a block. The first group of
+ * every function is also marked to correspond to indicate that the group corresponds to a call and
+ * the source location of the caller can be determined from the containing group.
  */
 class ComposableFunctionBodyTransformer(
     context: IrPluginContext,
@@ -483,80 +488,64 @@
     }
 
     private val skipToGroupEndFunction by guardedLazy {
-        composerIrClass.functions
-            .first {
-                it.name.identifier == "skipToGroupEnd" && it.valueParameters.size == 0
-            }
+        composerIrClass.functions.first {
+            it.name.identifier == "skipToGroupEnd" && it.valueParameters.size == 0
+        }
     }
 
     private val skipCurrentGroupFunction by guardedLazy {
-        composerIrClass
-            .functions
-            .first {
-                it.name.identifier == "skipCurrentGroup" && it.valueParameters.size == 0
-            }
+        composerIrClass.functions.first {
+            it.name.identifier == "skipCurrentGroup" && it.valueParameters.size == 0
+        }
     }
 
     private val startDefaultsFunction by guardedLazy {
-        composerIrClass.functions
-            .first {
-                it.name.identifier == "startDefaults" && it.valueParameters.size == 0
-            }
+        composerIrClass.functions.first {
+            it.name.identifier == "startDefaults" && it.valueParameters.size == 0
+        }
     }
 
     private val endDefaultsFunction by guardedLazy {
-        composerIrClass.functions
-            .first {
-                it.name.identifier == "endDefaults" && it.valueParameters.size == 0
-            }
+        composerIrClass.functions.first {
+            it.name.identifier == "endDefaults" && it.valueParameters.size == 0
+        }
     }
 
     private val startMovableFunction by guardedLazy {
-        composerIrClass.functions
-            .first {
-                it.name.identifier == "startMovableGroup" && it.valueParameters.size == 2
-            }
+        composerIrClass.functions.first {
+            it.name.identifier == "startMovableGroup" && it.valueParameters.size == 2
+        }
     }
 
     private val endMovableFunction by guardedLazy {
-        composerIrClass.functions
-            .first {
-                it.name.identifier == "endMovableGroup" && it.valueParameters.size == 0
-            }
+        composerIrClass.functions.first {
+            it.name.identifier == "endMovableGroup" && it.valueParameters.size == 0
+        }
     }
 
     private val startRestartGroupFunction by guardedLazy {
-        composerIrClass
-            .functions
-            .first {
-                it.name == ComposeNames.STARTRESTARTGROUP && it.valueParameters.size == 1
-            }
+        composerIrClass.functions.first {
+            it.name == ComposeNames.STARTRESTARTGROUP && it.valueParameters.size == 1
+        }
     }
 
     private val currentMarkerProperty: IrProperty? by guardedLazy {
-        composerIrClass.properties
-            .firstOrNull {
-                it.name == ComposeNames.CURRENTMARKER
-            }
+        composerIrClass.properties.firstOrNull { it.name == ComposeNames.CURRENTMARKER }
     }
 
     private val endToMarkerFunction: IrSimpleFunction? by guardedLazy {
-        composerIrClass
-            .functions
-            .firstOrNull {
-                it.name == ComposeNames.ENDTOMARKER && it.valueParameters.size == 1
-            }
+        composerIrClass.functions.firstOrNull {
+            it.name == ComposeNames.ENDTOMARKER && it.valueParameters.size == 1
+        }
     }
 
-    private val rollbackGroupMarkerEnabled get() =
-        currentMarkerProperty != null && endToMarkerFunction != null
+    private val rollbackGroupMarkerEnabled
+        get() = currentMarkerProperty != null && endToMarkerFunction != null
 
     private val endRestartGroupFunction by guardedLazy {
-        composerIrClass
-            .functions
-            .first {
-                it.name == ComposeNames.ENDRESTARTGROUP && it.valueParameters.size == 0
-            }
+        composerIrClass.functions.first {
+            it.name == ComposeNames.ENDRESTARTGROUP && it.valueParameters.size == 0
+        }
     }
 
     private val sourceInformationFunction by guardedLazy {
@@ -568,39 +557,40 @@
     }
 
     private val updateChangedFlagsFunction: IrSimpleFunction? by guardedLazy {
-        getTopLevelFunctionOrNull(
-            ComposeCallableIds.updateChangedFlags
-        )?.let {
+        getTopLevelFunctionOrNull(ComposeCallableIds.updateChangedFlags)?.let {
             val owner = it.owner
             if (owner.valueParameters.size == 1) owner else null
         }
     }
 
     private val isTraceInProgressFunction by guardedLazy {
-        getTopLevelFunctions(ComposeCallableIds.isTraceInProgress).singleOrNull {
-            it.owner.valueParameters.isEmpty()
-        }?.owner
+        getTopLevelFunctions(ComposeCallableIds.isTraceInProgress)
+            .singleOrNull { it.owner.valueParameters.isEmpty() }
+            ?.owner
     }
 
     private val traceEventStartFunction by guardedLazy {
-        getTopLevelFunctions(ComposeCallableIds.traceEventStart).singleOrNull {
-            it.owner.valueParameters.map { p -> p.type } == listOf(
-                context.irBuiltIns.intType,
-                context.irBuiltIns.intType,
-                context.irBuiltIns.intType,
-                context.irBuiltIns.stringType
-            )
-        }?.owner
+        getTopLevelFunctions(ComposeCallableIds.traceEventStart)
+            .singleOrNull {
+                it.owner.valueParameters.map { p -> p.type } ==
+                    listOf(
+                        context.irBuiltIns.intType,
+                        context.irBuiltIns.intType,
+                        context.irBuiltIns.intType,
+                        context.irBuiltIns.stringType
+                    )
+            }
+            ?.owner
     }
 
     private val traceEventEndFunction by guardedLazy {
-        getTopLevelFunctions(ComposeCallableIds.traceEventEnd).singleOrNull {
-            it.owner.valueParameters.isEmpty()
-        }?.owner
+        getTopLevelFunctions(ComposeCallableIds.traceEventEnd)
+            .singleOrNull { it.owner.valueParameters.isEmpty() }
+            ?.owner
     }
 
-    private val traceEventMarkersEnabled get() =
-        traceMarkersEnabled && traceEventEndFunction != null
+    private val traceEventMarkersEnabled
+        get() = traceMarkersEnabled && traceEventEndFunction != null
 
     private val sourceInformationMarkerEndFunction by guardedLazy {
         getTopLevelFunction(ComposeCallableIds.sourceInformationMarkerEnd).owner
@@ -621,78 +611,63 @@
         get() = (this as? IrSimpleType)?.arguments.orEmpty()
 
     private val updateScopeFunction by guardedLazy {
-        endRestartGroupFunction.returnType
-            .classOrNull
-            ?.owner
-            ?.functions
-            ?.singleOrNull {
-                it.name == ComposeNames.UPDATE_SCOPE &&
-                    it.valueParameters.first().type.arguments.size == 3
-            }
-            ?: error("new updateScope not found in result type of endRestartGroup")
+        endRestartGroupFunction.returnType.classOrNull?.owner?.functions?.singleOrNull {
+            it.name == ComposeNames.UPDATE_SCOPE &&
+                it.valueParameters.first().type.arguments.size == 3
+        } ?: error("new updateScope not found in result type of endRestartGroup")
     }
 
     private val isSkippingFunction by guardedLazy {
-        composerIrClass.properties
-            .first {
-                it.name.asString() == "skipping"
-            }
+        composerIrClass.properties.first { it.name.asString() == "skipping" }
     }
 
     private val defaultsInvalidFunction by guardedLazy {
-        composerIrClass
-            .properties
-            .first {
-                it.name.asString() == "defaultsInvalid"
-            }
+        composerIrClass.properties.first { it.name.asString() == "defaultsInvalid" }
     }
 
     private val joinKeyFunction by guardedLazy {
-        composerIrClass.functions
-            .first {
-                it.name == ComposeNames.JOINKEY && it.valueParameters.size == 2
-            }
+        composerIrClass.functions.first {
+            it.name == ComposeNames.JOINKEY && it.valueParameters.size == 2
+        }
     }
 
     private var currentScope: Scope = Scope.RootScope()
 
     private fun printScopeStack(): String {
-        return buildString {
-            currentScope.forEach {
-                appendLine(it.name)
-            }
-        }
+        return buildString { currentScope.forEach { appendLine(it.name) } }
     }
 
     private val isInComposableScope: Boolean
         get() = currentScope.isInComposable
 
     private val currentFunctionScope
-        get() = currentScope.functionScope
-            ?: error("Expected a FunctionScope but none exist. \n${printScopeStack()}")
+        get() =
+            currentScope.functionScope
+                ?: error("Expected a FunctionScope but none exist. \n${printScopeStack()}")
 
     override fun visitClass(declaration: IrClass): IrStatement {
         if (declaration.isComposableSingletonClass()) {
             return declaration
         }
-        return inScope(Scope.ClassScope(declaration.name)) {
-            super.visitDeclaration(declaration)
-        }
+        return inScope(Scope.ClassScope(declaration.name)) { super.visitDeclaration(declaration) }
     }
 
     override fun visitFunction(declaration: IrFunction): IrStatement {
         val scope = Scope.FunctionScope(declaration, this)
-        return inScope(scope) {
-            visitFunctionInScope(declaration)
-        }.also {
-            if (scope.isInlinedLambda && !scope.isComposable && scope.hasComposableCalls) {
-                encounteredCapturedComposableCall()
+        return inScope(scope) { visitFunctionInScope(declaration) }
+            .also {
+                if (scope.isInlinedLambda && !scope.isComposable && scope.hasComposableCalls) {
+                    encounteredCapturedComposableCall()
+                }
+                metrics.recordFunction(scope.metrics)
+                (declaration as? IrAttributeContainer)?.let {
+                    context.irTrace.record(
+                        ComposeWritableSlices.FUNCTION_METRICS,
+                        it,
+                        scope.metrics
+                    )
+                }
             }
-            metrics.recordFunction(scope.metrics)
-            (declaration as? IrAttributeContainer)?.let {
-                context.irTrace.record(ComposeWritableSlices.FUNCTION_METRICS, it, scope.metrics)
-            }
-        }
     }
 
     private fun visitFunctionInScope(declaration: IrFunction): IrStatement {
@@ -718,23 +693,16 @@
         // restartable functions get extra logic and different types of groups from
         // non-restartable functions, and lambdas get no groups at all.
         return when {
-            isLambda && isTracked -> visitComposableLambda(
-                declaration,
-                scope,
-                changedParam
-            )
-            restartable && isTracked -> visitRestartableComposableFunction(
-                declaration,
-                scope,
-                changedParam,
-                defaultParam
-            )
-            else -> visitNonRestartableComposableFunction(
-                declaration,
-                scope,
-                changedParam,
-                defaultParam
-            )
+            isLambda && isTracked -> visitComposableLambda(declaration, scope, changedParam)
+            restartable && isTracked ->
+                visitRestartableComposableFunction(declaration, scope, changedParam, defaultParam)
+            else ->
+                visitNonRestartableComposableFunction(
+                    declaration,
+                    scope,
+                    changedParam,
+                    defaultParam
+                )
         }
     }
 
@@ -745,32 +713,26 @@
     // 4. They are annotated as @NonRestartableComposable
     private fun IrFunction.shouldBeRestartable(): Boolean {
         // Only insert observe scopes in non-empty composable function
-        if (body == null || this !is IrSimpleFunction)
-            return false
+        if (body == null || this !is IrSimpleFunction) return false
 
         if (isLocal && parentClassOrNull?.origin != JvmLoweredDeclarationOrigin.LAMBDA_IMPL) {
             return false
         }
 
         // Do not insert observe scope in an inline function
-        if (isInline)
-            return false
+        if (isInline) return false
 
-        if (hasNonRestartableAnnotation)
-            return false
+        if (hasNonRestartableAnnotation) return false
 
-        if (hasExplicitGroups)
-            return false
+        if (hasExplicitGroups) return false
 
         // Do not insert an observe scope in an inline composable lambda
         if (inlineLambdaInfo.isInlineLambda(this)) return false
 
         // Do not insert an observe scope if the function has a return result
-        if (!returnType.isUnit())
-            return false
+        if (!returnType.isUnit()) return false
 
-        if (isComposableDelegatedAccessor())
-            return false
+        if (isComposableDelegatedAccessor()) return false
 
         // Do not insert an observe scope if the function hasn't been transformed by the
         // ComposerParamTransformer and has a synthetic "composer param" as its last parameter
@@ -828,8 +790,8 @@
         val body = declaration.body!!
 
         val hasExplicitGroups = declaration.hasExplicitGroups
-        val isReadOnly = declaration.hasReadOnlyAnnotation ||
-            declaration.isComposableDelegatedAccessor()
+        val isReadOnly =
+            declaration.hasReadOnlyAnnotation || declaration.isComposableDelegatedAccessor()
 
         // An outer group is required if we are a lambda or dynamic method or the runtime doesn't
         // support remember after call. A outer group is explicitly elided by readonly and has
@@ -851,9 +813,7 @@
 
         val emitTraceMarkers = traceEventMarkersEnabled && !scope.function.isInline
 
-        transformed = transformed.apply {
-            transformChildrenVoid()
-        }
+        transformed = transformed.apply { transformChildrenVoid() }
 
         // If we get an early return from this function then the function itself acts like
         // an if statement and the outer group is required if the functions is not readonly or has
@@ -880,56 +840,52 @@
 
         if (outerGroupRequired) {
             scope.realizeGroup {
-                irComposite(statements = listOfNotNull(
-                    if (emitTraceMarkers) irTraceEventEnd() else null,
-                    irEndReplaceGroup(scope = scope)
-                ))
+                irComposite(
+                    statements =
+                        listOfNotNull(
+                            if (emitTraceMarkers) irTraceEventEnd() else null,
+                            irEndReplaceGroup(scope = scope)
+                        )
+                )
             }
         } else if (useNonSkippingGroupOptimization) {
             scope.realizeAllDirectChildren()
             scope.realizeCoalescableGroup()
         }
 
-        declaration.body = IrBlockBodyImpl(
-            body.startOffset,
-            body.endOffset,
-            listOfNotNull(
-                when {
-                    outerGroupRequired ->
-                        irStartReplaceGroup(
-                            body,
-                            scope,
-                            irFunctionSourceKey()
-                        )
-                    collectSourceInformation && !hasExplicitGroups ->
-                        irSourceInformationMarkerStart(
-                            body,
-                            scope,
-                            irFunctionSourceKey()
-                        )
-                    else -> null
-                },
-                *scope.markerPreamble.statements.toTypedArray(),
-                *bodyPreamble.statements.toTypedArray(),
-                *transformed.statements.toTypedArray(),
-                when {
-                    outerGroupRequired -> irEndReplaceGroup(scope = scope)
-                    collectSourceInformation && !hasExplicitGroups ->
-                        irSourceInformationMarkerEnd(body, scope)
-                    else -> null
-                },
-                returnVar?.let { irReturnVar(declaration.symbol, it) }
+        declaration.body =
+            IrBlockBodyImpl(
+                body.startOffset,
+                body.endOffset,
+                listOfNotNull(
+                    when {
+                        outerGroupRequired ->
+                            irStartReplaceGroup(body, scope, irFunctionSourceKey())
+                        collectSourceInformation && !hasExplicitGroups ->
+                            irSourceInformationMarkerStart(body, scope, irFunctionSourceKey())
+                        else -> null
+                    },
+                    *scope.markerPreamble.statements.toTypedArray(),
+                    *bodyPreamble.statements.toTypedArray(),
+                    *transformed.statements.toTypedArray(),
+                    when {
+                        outerGroupRequired -> irEndReplaceGroup(scope = scope)
+                        collectSourceInformation && !hasExplicitGroups ->
+                            irSourceInformationMarkerEnd(body, scope)
+                        else -> null
+                    },
+                    returnVar?.let { irReturnVar(declaration.symbol, it) }
+                )
             )
-        )
         if (!outerGroupRequired && !hasExplicitGroups) {
             scope.realizeEndCalls {
                 irComposite(
-                    statements = listOfNotNull(
-                        if (emitTraceMarkers) irTraceEventEnd() else null,
-                        if (collectSourceInformation)
-                            irSourceInformationMarkerEnd(body, scope)
-                        else null
-                    )
+                    statements =
+                        listOfNotNull(
+                            if (emitTraceMarkers) irTraceEventEnd() else null,
+                            if (collectSourceInformation) irSourceInformationMarkerEnd(body, scope)
+                            else null
+                        )
                 )
             }
         }
@@ -974,26 +930,29 @@
         }
 
         // we start off assuming that we *can* skip execution of the function
-        var canSkipExecution = declaration.returnType.isUnit() &&
-            !isInlineLambda &&
-            scope.allTrackedParams.none { stabilityInferencer.stabilityOf(it.type).knownUnstable() }
+        var canSkipExecution =
+            declaration.returnType.isUnit() &&
+                !isInlineLambda &&
+                scope.allTrackedParams.none {
+                    stabilityInferencer.stabilityOf(it.type).knownUnstable()
+                }
 
         // if the function can never skip, or there are no parameters to test, then we
         // don't need to have the dirty parameter locally since it will never be different from
         // the passed in `changed` parameter.
-        val dirty = if (canSkipExecution && scope.allTrackedParams.isNotEmpty())
-        // NOTE(lmr): Technically, dirty is a mutable variable, but we don't want to mark it
-        // as one since that will cause a `Ref<Int>` to get created if it is captured. Since
-        // we know we will never be mutating this variable _after_ it gets captured, we can
-        // safely mark this as `isVar = false`.
+        val dirty =
+            if (canSkipExecution && scope.allTrackedParams.isNotEmpty())
+            // NOTE(lmr): Technically, dirty is a mutable variable, but we don't want to mark it
+            // as one since that will cause a `Ref<Int>` to get created if it is captured. Since
+            // we know we will never be mutating this variable _after_ it gets captured, we can
+            // safely mark this as `isVar = false`.
             changedParam.irCopyToTemporary(
-                // LLVM validation doesn't allow us to have val here.
-                isVar = !context.platform.isJvm() && !context.platform.isJs(),
-                nameHint = "\$dirty",
-                exactName = true
-            )
-        else
-            changedParam
+                    // LLVM validation doesn't allow us to have val here.
+                    isVar = !context.platform.isJvm() && !context.platform.isJs(),
+                    nameHint = "\$dirty",
+                    exactName = true
+                )
+            else changedParam
 
         scope.dirty = dirty
 
@@ -1003,31 +962,34 @@
 
         // we must transform the body first, since that will allow us to see whether or not we
         // are using the dispatchReceiverParameter or the extensionReceiverParameter
-        val transformed = nonReturningBody.apply {
-            transformChildrenVoid()
-        }.let {
-            // Ensure that all group children of composable inline lambda are realized, since the inline
-            // lambda doesn't require a group on its own.
-            if (scope.isInlinedLambda && scope.isComposable) {
-                scope.realizeAllDirectChildren()
-            }
+        val transformed =
+            nonReturningBody
+                .apply { transformChildrenVoid() }
+                .let {
+                    // Ensure that all group children of composable inline lambda are realized,
+                    // since the inline
+                    // lambda doesn't require a group on its own.
+                    if (scope.isInlinedLambda && scope.isComposable) {
+                        scope.realizeAllDirectChildren()
+                    }
 
-            if (isInlineLambda) {
-                it.asSourceOrEarlyExitGroup(scope)
-            } else it
-        }
+                    if (isInlineLambda) {
+                        it.asSourceOrEarlyExitGroup(scope)
+                    } else it
+                }
 
-        canSkipExecution = buildPreambleStatementsAndReturnIfSkippingPossible(
-            body,
-            skipPreamble,
-            bodyPreamble,
-            canSkipExecution,
-            scope,
-            dirty,
-            changedParam,
-            null,
-            Scope.ParametersScope(),
-        )
+        canSkipExecution =
+            buildPreambleStatementsAndReturnIfSkippingPossible(
+                body,
+                skipPreamble,
+                bodyPreamble,
+                canSkipExecution,
+                scope,
+                dirty,
+                changedParam,
+                null,
+                Scope.ParametersScope(),
+            )
 
         // NOTE: It's important to do this _after_ the above call since it can change the
         // value of `dirty.used`.
@@ -1035,15 +997,14 @@
             transformed.wrapWithTraceEvents(irFunctionSourceKey(), scope)
         }
 
-        val dirtyForSkipping = if (dirty.used && dirty is IrChangedBitMaskVariable) {
-            skipPreamble.statements.addAll(0, dirty.asStatements())
-            dirty
-        } else changedParam
+        val dirtyForSkipping =
+            if (dirty.used && dirty is IrChangedBitMaskVariable) {
+                skipPreamble.statements.addAll(0, dirty.asStatements())
+                dirty
+            } else changedParam
 
         if (emitTraceMarkers) {
-            scope.realizeEndCalls {
-                irTraceEventEnd()!!
-            }
+            scope.realizeEndCalls { irTraceEventEnd()!! }
         }
 
         scope.applyIntrinsicRememberFixups { isMemoizedLambda, args, metas ->
@@ -1064,51 +1025,53 @@
             // 1. if any of the stable parameters have *differences* from last execution.
             // 2. if the composer.skipping call returns false
             // 3. function is inline
-            val shouldExecute = irOrOr(
-                dirtyForSkipping.irHasDifferences(scope.usedParams),
-                irNot(irIsSkipping())
-            )
+            val shouldExecute =
+                irOrOr(dirtyForSkipping.irHasDifferences(scope.usedParams), irNot(irIsSkipping()))
 
-            val transformedBody = irIfThenElse(
-                condition = shouldExecute,
-                thenPart = irBlock(
-                    type = context.irBuiltIns.unitType,
-                    statements = transformed.statements
-                ),
-                // Use end offsets so that stepping out of the composable function
-                // does not step back to the start line for the function.
-                elsePart = irSkipToGroupEnd(body.endOffset, body.endOffset),
-                startOffset = body.startOffset,
-                endOffset = body.endOffset
-            )
-            scope.realizeCoalescableGroup()
-            declaration.body = IrBlockBodyImpl(
-                body.startOffset,
-                body.endOffset,
-                listOfNotNull(
-                    *sourceInformationPreamble.statements.toTypedArray(),
-                    *scope.markerPreamble.statements.toTypedArray(),
-                    *skipPreamble.statements.toTypedArray(),
-                    *bodyPreamble.statements.toTypedArray(),
-                    transformedBody,
-                    returnVar?.let { irReturnVar(declaration.symbol, it) }
+            val transformedBody =
+                irIfThenElse(
+                    condition = shouldExecute,
+                    thenPart =
+                        irBlock(
+                            type = context.irBuiltIns.unitType,
+                            statements = transformed.statements
+                        ),
+                    // Use end offsets so that stepping out of the composable function
+                    // does not step back to the start line for the function.
+                    elsePart = irSkipToGroupEnd(body.endOffset, body.endOffset),
+                    startOffset = body.startOffset,
+                    endOffset = body.endOffset
                 )
-            )
+            scope.realizeCoalescableGroup()
+            declaration.body =
+                IrBlockBodyImpl(
+                    body.startOffset,
+                    body.endOffset,
+                    listOfNotNull(
+                        *sourceInformationPreamble.statements.toTypedArray(),
+                        *scope.markerPreamble.statements.toTypedArray(),
+                        *skipPreamble.statements.toTypedArray(),
+                        *bodyPreamble.statements.toTypedArray(),
+                        transformedBody,
+                        returnVar?.let { irReturnVar(declaration.symbol, it) }
+                    )
+                )
         } else {
             scope.realizeCoalescableGroup()
-            declaration.body = IrBlockBodyImpl(
-                body.startOffset,
-                body.endOffset,
-                listOfNotNull(
-                    *scope.markerPreamble.statements.toTypedArray(),
-                    *sourceInformationPreamble.statements.toTypedArray(),
-                    *skipPreamble.statements.toTypedArray(),
-                    *bodyPreamble.statements.toTypedArray(),
-                    transformed,
-                    *bodyEpilogue.statements.toTypedArray(),
-                    returnVar?.let { irReturnVar(declaration.symbol, it) }
+            declaration.body =
+                IrBlockBodyImpl(
+                    body.startOffset,
+                    body.endOffset,
+                    listOfNotNull(
+                        *scope.markerPreamble.statements.toTypedArray(),
+                        *sourceInformationPreamble.statements.toTypedArray(),
+                        *skipPreamble.statements.toTypedArray(),
+                        *bodyPreamble.statements.toTypedArray(),
+                        transformed,
+                        *bodyEpilogue.statements.toTypedArray(),
+                        returnVar?.let { irReturnVar(declaration.symbol, it) }
+                    )
                 )
-            )
         }
         scope.metrics.recordFunction(
             composable = true,
@@ -1147,15 +1110,15 @@
         // as one since that will cause a `Ref<Int>` to get created if it is captured. Since
         // we know we will never be mutating this variable _after_ it gets captured, we can
         // safely mark this as `isVar = false`.
-        val dirty = if (scope.allTrackedParams.isNotEmpty())
-            changedParam.irCopyToTemporary(
-                // LLVM validation doesn't allow us to have val here.
-                isVar = !context.platform.isJvm() && !context.platform.isJs(),
-                nameHint = "\$dirty",
-                exactName = true
-            )
-        else
-            changedParam
+        val dirty =
+            if (scope.allTrackedParams.isNotEmpty())
+                changedParam.irCopyToTemporary(
+                    // LLVM validation doesn't allow us to have val here.
+                    isVar = !context.platform.isJvm() && !context.platform.isJs(),
+                    nameHint = "\$dirty",
+                    exactName = true
+                )
+            else changedParam
 
         scope.dirty = dirty
 
@@ -1171,32 +1134,31 @@
         }
 
         val endWithTraceEventEnd = {
-            irComposite(statements = listOfNotNull(
-                if (traceEventMarkersEnabled) irTraceEventEnd() else null,
-                end()
-            ))
+            irComposite(
+                statements =
+                    listOfNotNull(if (traceEventMarkersEnabled) irTraceEventEnd() else null, end())
+            )
         }
 
         val defaultScope = transformDefaults(scope)
 
         // we must transform the body first, since that will allow us to see whether or not we
         // are using the dispatchReceiverParameter or the extensionReceiverParameter
-        val transformed = nonReturningBody.apply {
-            transformChildrenVoid()
-        }
+        val transformed = nonReturningBody.apply { transformChildrenVoid() }
 
-        val canSkipExecution = buildPreambleStatementsAndReturnIfSkippingPossible(
-            body,
-            skipPreamble,
-            bodyPreamble,
-            // we start off assuming that we *can* skip execution of the function
-            !declaration.hasNonSkippableAnnotation,
-            scope,
-            dirty,
-            changedParam,
-            defaultParam,
-            defaultScope,
-        )
+        val canSkipExecution =
+            buildPreambleStatementsAndReturnIfSkippingPossible(
+                body,
+                skipPreamble,
+                bodyPreamble,
+                // we start off assuming that we *can* skip execution of the function
+                !declaration.hasNonSkippableAnnotation,
+                scope,
+                dirty,
+                changedParam,
+                defaultParam,
+                defaultScope,
+            )
 
         // NOTE: It's important to do this _after_ the above call since it can change the
         // value of `dirty.used`.
@@ -1207,10 +1169,11 @@
         // if it has non-optional unstable params, the function can never skip, so we always
         // execute the body. Otherwise, we wrap the body in an if and only skip when certain
         // conditions are met.
-        val dirtyForSkipping = if (dirty.used && dirty is IrChangedBitMaskVariable) {
-            skipPreamble.statements.addAll(0, dirty.asStatements())
-            dirty
-        } else changedParam
+        val dirtyForSkipping =
+            if (dirty.used && dirty is IrChangedBitMaskVariable) {
+                skipPreamble.statements.addAll(0, dirty.asStatements())
+                dirty
+            } else changedParam
 
         scope.applyIntrinsicRememberFixups { isMemoizedLambda, args, metas ->
             // replace dirty with changed param in meta used for inference, as we are not
@@ -1225,79 +1188,83 @@
             irIntrinsicRememberInvalid(isMemoizedLambda, args, metas, ::irIntrinsicChanged)
         }
 
-        val transformedBody = if (canSkipExecution) {
-            // We CANNOT skip if any of the following conditions are met
-            // 1. if any of the stable parameters have *differences* from last execution.
-            // 2. if the composer.skipping call returns false
-            // 3. if any of the provided parameters to the function were unstable
+        val transformedBody =
+            if (canSkipExecution) {
+                // We CANNOT skip if any of the following conditions are met
+                // 1. if any of the stable parameters have *differences* from last execution.
+                // 2. if the composer.skipping call returns false
+                // 3. if any of the provided parameters to the function were unstable
 
-            // (3) is only necessary to check if we actually have unstable params, so we only
-            // generate that check if we need to.
-            var shouldExecute = irOrOr(
-                dirtyForSkipping.irHasDifferences(scope.usedParams),
-                irNot(irIsSkipping())
-            )
+                // (3) is only necessary to check if we actually have unstable params, so we only
+                // generate that check if we need to.
+                var shouldExecute =
+                    irOrOr(
+                        dirtyForSkipping.irHasDifferences(scope.usedParams),
+                        irNot(irIsSkipping())
+                    )
 
-            // boolean array mapped to parameters. true indicates that the type is unstable
-            // NOTE: the unstable mask is indexed by valueParameter index, which is different
-            // than the slotIndex but that is OKAY because we only care about defaults, which
-            // also use the value parameter index.
-            val realParams = declaration.valueParameters.take(
-                declaration.contextReceiverParametersCount + scope.realValueParamCount
-            )
-            val unstableMask = realParams.map {
-                stabilityInferencer.stabilityOf((it.varargElementType ?: it.type)).knownUnstable()
-            }.toBooleanArray()
+                // boolean array mapped to parameters. true indicates that the type is unstable
+                // NOTE: the unstable mask is indexed by valueParameter index, which is different
+                // than the slotIndex but that is OKAY because we only care about defaults, which
+                // also use the value parameter index.
+                val realParams =
+                    declaration.valueParameters.take(
+                        declaration.contextReceiverParametersCount + scope.realValueParamCount
+                    )
+                val unstableMask =
+                    realParams
+                        .map {
+                            stabilityInferencer
+                                .stabilityOf((it.varargElementType ?: it.type))
+                                .knownUnstable()
+                        }
+                        .toBooleanArray()
 
-            val hasAnyUnstableParams = unstableMask.any { it }
+                val hasAnyUnstableParams = unstableMask.any { it }
 
-            // If we aren't in strong skipping mode and
-            // if there are unstable params, then we fence the whole expression with a check to
-            // see if any of the unstable params were the ones that were provided to the
-            // function. If they were, then we short-circuit and always execute
-            if (
-                !FeatureFlag.StrongSkipping.enabled &&
-                hasAnyUnstableParams && defaultParam != null
-            ) {
-                shouldExecute = irOrOr(
-                    defaultParam.irHasAnyProvidedAndUnstable(unstableMask),
-                    shouldExecute
+                // If we aren't in strong skipping mode and
+                // if there are unstable params, then we fence the whole expression with a check to
+                // see if any of the unstable params were the ones that were provided to the
+                // function. If they were, then we short-circuit and always execute
+                if (
+                    !FeatureFlag.StrongSkipping.enabled &&
+                        hasAnyUnstableParams &&
+                        defaultParam != null
+                ) {
+                    shouldExecute =
+                        irOrOr(
+                            defaultParam.irHasAnyProvidedAndUnstable(unstableMask),
+                            shouldExecute
+                        )
+                }
+
+                irIfThenElse(
+                    condition = shouldExecute,
+                    thenPart =
+                        irBlock(statements = bodyPreamble.statements + transformed.statements),
+                    // Use end offsets so that stepping out of the composable function
+                    // does not step back to the start line for the function.
+                    elsePart = irSkipToGroupEnd(body.endOffset, body.endOffset),
+                    startOffset = body.startOffset,
+                    endOffset = body.endOffset
                 )
-            }
-
-            irIfThenElse(
-                condition = shouldExecute,
-                thenPart = irBlock(
-                    statements = bodyPreamble.statements + transformed.statements
-                ),
-                // Use end offsets so that stepping out of the composable function
-                // does not step back to the start line for the function.
-                elsePart = irSkipToGroupEnd(body.endOffset, body.endOffset),
-                startOffset = body.startOffset,
-                endOffset = body.endOffset
-            )
-        } else irComposite(
-            statements = bodyPreamble.statements + transformed.statements
-        )
+            } else irComposite(statements = bodyPreamble.statements + transformed.statements)
 
         scope.realizeGroup(endWithTraceEventEnd)
 
-        declaration.body = IrBlockBodyImpl(
-            body.startOffset,
-            body.endOffset,
-            listOfNotNull(
-                irStartRestartGroup(
-                    body,
-                    scope,
-                    irFunctionSourceKey()
-                ),
-                *scope.markerPreamble.statements.toTypedArray(),
-                *skipPreamble.statements.toTypedArray(),
-                transformedBody,
-                if (returnVar == null) end() else null,
-                returnVar?.let { irReturnVar(declaration.symbol, it) }
+        declaration.body =
+            IrBlockBodyImpl(
+                body.startOffset,
+                body.endOffset,
+                listOfNotNull(
+                    irStartRestartGroup(body, scope, irFunctionSourceKey()),
+                    *scope.markerPreamble.statements.toTypedArray(),
+                    *skipPreamble.statements.toTypedArray(),
+                    transformedBody,
+                    if (returnVar == null) end() else null,
+                    returnVar?.let { irReturnVar(declaration.symbol, it) }
+                )
             )
-        )
         scope.metrics.recordFunction(
             composable = true,
             restartable = true,
@@ -1314,23 +1281,22 @@
     }
 
     private class SourceInfoFixup(val call: IrCall, val index: Int, val scope: Scope.BlockScope)
+
     private val sourceFixups = mutableListOf<SourceInfoFixup>()
 
     private fun recordSourceParameter(call: IrCall, index: Int, scope: Scope.BlockScope) {
         sourceFixups.add(SourceInfoFixup(call, index, scope))
     }
 
-    private val (Scope.BlockScope).hasSourceInformation get() =
-        calculateHasSourceInformation(collectSourceInformation)
+    private val (Scope.BlockScope).hasSourceInformation
+        get() = calculateHasSourceInformation(collectSourceInformation)
 
-    private val (Scope.BlockScope).sourceInformation get() =
-        calculateSourceInfo(collectSourceInformation)
+    private val (Scope.BlockScope).sourceInformation
+        get() = calculateSourceInfo(collectSourceInformation)
 
     private fun applySourceFixups() {
         // Apply the fix-ups lowest scope to highest.
-        sourceFixups.sortBy {
-            -it.scope.level
-        }
+        sourceFixups.sortBy { -it.scope.level }
         for (sourceFixup in sourceFixups) {
             sourceFixup.call.putValueArgument(
                 sourceFixup.index,
@@ -1346,9 +1312,8 @@
         parameters.fastForEach { param ->
             val defaultValue = param.defaultValue
             if (defaultValue != null) {
-                defaultValue.expression = inScope(parametersScope) {
-                    defaultValue.expression.transform(this, null)
-                }
+                defaultValue.expression =
+                    inScope(parametersScope) { defaultValue.expression.transform(this, null) }
             }
         }
         return parametersScope
@@ -1375,21 +1340,22 @@
 
         val setDefaults = mutableStatementContainer()
         val skipDefaults = mutableStatementContainer()
-//        val parametersScope = Scope.ParametersScope()
+        //        val parametersScope = Scope.ParametersScope()
         parameters.fastForEachIndexed { slotIndex, param ->
             val defaultIndex = scope.defaultIndexForSlotIndex(slotIndex)
             val defaultValue = param.defaultValue?.expression
             if (defaultParam != null && defaultValue != null) {
-//                val transformedDefault = inScope(parametersScope) {
-//                    defaultValue.expression.transform(this, null)
-//                }
+                //                val transformedDefault = inScope(parametersScope) {
+                //                    defaultValue.expression.transform(this, null)
+                //                }
 
                 // we want to call this on the transformed version.
                 defaultExprIsStatic[slotIndex] = defaultValue.isStatic()
                 defaultExpr[slotIndex] = defaultValue
                 val hasStaticDefaultExpr = defaultExprIsStatic[slotIndex]
                 when {
-                    isSkippableDeclaration && !hasStaticDefaultExpr &&
+                    isSkippableDeclaration &&
+                        !hasStaticDefaultExpr &&
                         dirty is IrChangedBitMaskVariable -> {
                         // If we are setting the parameter to the default expression and
                         // running the default expression again, and the expression isn't
@@ -1401,12 +1367,14 @@
                         setDefaults.statements.add(
                             irIf(
                                 condition = irGetBit(defaultParam, defaultIndex),
-                                body = irBlock(
-                                    statements = listOf(
-                                        irSet(param, defaultValue),
-                                        dirty.irSetSlotUncertain(slotIndex)
+                                body =
+                                    irBlock(
+                                        statements =
+                                            listOf(
+                                                irSet(param, defaultValue),
+                                                dirty.irSetSlotUncertain(slotIndex)
+                                            )
                                     )
-                                )
                             )
                         )
                         skipDefaults.statements.add(
@@ -1446,12 +1414,7 @@
                 used = isUsed
             )
 
-            if (
-                !FeatureFlag.StrongSkipping.enabled &&
-                isUsed &&
-                isUnstable &&
-                isRequired
-            ) {
+            if (!FeatureFlag.StrongSkipping.enabled && isUsed && isUnstable && isRequired) {
                 // if it is a used + unstable parameter with no default expression and we are
                 // not in strong skipping mode, the fn will _never_ skip
                 mightSkip = false
@@ -1479,16 +1442,19 @@
                     // this will only ever be true when mightSkip is false, but we put this
                     // branch here so that `dirty` gets smart cast in later branches
                 }
-                !FeatureFlag.StrongSkipping.enabled && isUnstable && defaultParam != null &&
+                !FeatureFlag.StrongSkipping.enabled &&
+                    isUnstable &&
+                    defaultParam != null &&
                     defaultValue != null -> {
                     // if it has a default parameter then the function can still potentially skip
                     skipPreamble.statements.add(
                         irIf(
                             condition = irGetBit(defaultParam, defaultIndex),
-                            body = dirty.irOrSetBitsAtSlot(
-                                slotIndex,
-                                irConst(ParamState.Same.bitsForSlot(slotIndex))
-                            )
+                            body =
+                                dirty.irOrSetBitsAtSlot(
+                                    slotIndex,
+                                    irConst(ParamState.Same.bitsForSlot(slotIndex))
+                                )
                         )
                     )
                 }
@@ -1496,57 +1462,63 @@
                     val defaultValueIsStatic = defaultExprIsStatic[slotIndex]
                     val callChanged = irCallChanged(stability, changedParam, slotIndex, param)
 
-                    val isChanged = if (defaultParam != null && !defaultValueIsStatic)
-                        irAndAnd(irIsProvided(defaultParam, defaultIndex), callChanged)
-                    else
-                        callChanged
-                    val modifyDirtyFromChangedResult = dirty.irOrSetBitsAtSlot(
-                        slotIndex,
-                        irIfThenElse(
-                            context.irBuiltIns.intType,
-                            isChanged,
-                            // if the value has changed, update the bits in the slot to be
-                            // "Different"
-                            thenPart = irConst(ParamState.Different.bitsForSlot(slotIndex)),
-                            // if the value has not changed, update the bits in the slot to
-                            // be "Same"
-                            elsePart = irConst(ParamState.Same.bitsForSlot(slotIndex))
-                        )
-                    )
-
-                    val skipCondition = if (FeatureFlag.StrongSkipping.enabled)
-                        irIsUncertain(changedParam, slotIndex)
-                    else
-                        irIsUncertainAndStable(changedParam, slotIndex)
-                    val stmt = if (defaultParam != null && defaultValueIsStatic) {
-                        // if the default expression is "static", then we know that if we are using the
-                        // default expression, the parameter can be considered "static".
-                        irWhen(
-                            origin = IrStatementOrigin.IF,
-                            branches = listOf(
-                                irBranch(
-                                    condition = irGetBit(defaultParam, defaultIndex),
-                                    result = dirty.irOrSetBitsAtSlot(
-                                        slotIndex,
-                                        irConst(ParamState.Static.bitsForSlot(slotIndex))
-                                    )
-                                ),
-                                irBranch(
-                                    condition = skipCondition,
-                                    result = modifyDirtyFromChangedResult
-                                )
+                    val isChanged =
+                        if (defaultParam != null && !defaultValueIsStatic)
+                            irAndAnd(irIsProvided(defaultParam, defaultIndex), callChanged)
+                        else callChanged
+                    val modifyDirtyFromChangedResult =
+                        dirty.irOrSetBitsAtSlot(
+                            slotIndex,
+                            irIfThenElse(
+                                context.irBuiltIns.intType,
+                                isChanged,
+                                // if the value has changed, update the bits in the slot to be
+                                // "Different"
+                                thenPart = irConst(ParamState.Different.bitsForSlot(slotIndex)),
+                                // if the value has not changed, update the bits in the slot to
+                                // be "Same"
+                                elsePart = irConst(ParamState.Same.bitsForSlot(slotIndex))
                             )
                         )
-                    } else {
-                        // we only call `$composer.changed(...)` on a parameter if the value came in
-                        // with an "Uncertain" state AND the value was provided. This is safe to do
-                        // because this will remain true or false for *every* execution of the
-                        // function, so we will never get a slot table misalignment as a result.
-                        irIf(
-                            condition = skipCondition,
-                            body = modifyDirtyFromChangedResult
-                        )
-                    }
+
+                    val skipCondition =
+                        if (FeatureFlag.StrongSkipping.enabled)
+                            irIsUncertain(changedParam, slotIndex)
+                        else irIsUncertainAndStable(changedParam, slotIndex)
+                    val stmt =
+                        if (defaultParam != null && defaultValueIsStatic) {
+                            // if the default expression is "static", then we know that if we are
+                            // using the
+                            // default expression, the parameter can be considered "static".
+                            irWhen(
+                                origin = IrStatementOrigin.IF,
+                                branches =
+                                    listOf(
+                                        irBranch(
+                                            condition = irGetBit(defaultParam, defaultIndex),
+                                            result =
+                                                dirty.irOrSetBitsAtSlot(
+                                                    slotIndex,
+                                                    irConst(
+                                                        ParamState.Static.bitsForSlot(slotIndex)
+                                                    )
+                                                )
+                                        ),
+                                        irBranch(
+                                            condition = skipCondition,
+                                            result = modifyDirtyFromChangedResult
+                                        )
+                                    )
+                            )
+                        } else {
+                            // we only call `$composer.changed(...)` on a parameter if the value
+                            // came in
+                            // with an "Uncertain" state AND the value was provided. This is safe to
+                            // do
+                            // because this will remain true or false for *every* execution of the
+                            // function, so we will never get a slot table misalignment as a result.
+                            irIf(condition = skipCondition, body = modifyDirtyFromChangedResult)
+                        }
                     skipPreamble.statements.add(stmt)
                 }
             }
@@ -1562,10 +1534,11 @@
                 // not the call site had a spread or not and only create groups if it did.
 
                 // composer.startMovableGroup(<>, values.size)
-                val irGetParamSize = irMethodCall(
-                    irGet(param),
-                    param.type.classOrNull!!.getPropertyGetter("size")!!.owner
-                )
+                val irGetParamSize =
+                    irMethodCall(
+                        irGet(param),
+                        param.type.classOrNull!!.getPropertyGetter("size")!!.owner
+                    )
 
                 // TODO(lmr): verify this works with default vararg expressions!
                 skipPreamble.statements.add(
@@ -1580,16 +1553,14 @@
                 //     dirty = dirty or if (composer.changed(value)) 0b0100 else 0b0000
                 // }
                 skipPreamble.statements.add(
-                    irForLoop(
-                        varargElementType,
-                        irGet(param)
-                    ) { loopVar ->
-                        val changedCall = irCallChanged(
-                            stabilityInferencer.stabilityOf(varargElementType),
-                            changedParam,
-                            slotIndex,
-                            loopVar
-                        )
+                    irForLoop(varargElementType, irGet(param)) { loopVar ->
+                        val changedCall =
+                            irCallChanged(
+                                stabilityInferencer.stabilityOf(varargElementType),
+                                changedParam,
+                                slotIndex,
+                                loopVar
+                            )
 
                         dirty.irOrSetBitsAtSlot(
                             slotIndex,
@@ -1599,7 +1570,8 @@
                                 // if the value has changed, update the bits in the slot to be
                                 // "Different".
                                 thenPart = irConst(ParamState.Different.bitsForSlot(slotIndex)),
-                                // if the value has not changed, we are still uncertain if the entire
+                                // if the value has not changed, we are still uncertain if the
+                                // entire
                                 // list of values has gone unchanged or not, so we use Uncertain
                                 elsePart = irConst(ParamState.Uncertain.bitsForSlot(slotIndex))
                             )
@@ -1616,10 +1588,11 @@
                 skipPreamble.statements.add(
                     irIf(
                         condition = irIsUncertainAndStable(dirty, slotIndex),
-                        body = dirty.irOrSetBitsAtSlot(
-                            slotIndex,
-                            irConst(ParamState.Same.bitsForSlot(slotIndex))
-                        )
+                        body =
+                            dirty.irOrSetBitsAtSlot(
+                                slotIndex,
+                                irConst(ParamState.Same.bitsForSlot(slotIndex))
+                            )
                     )
                 )
             }
@@ -1647,19 +1620,19 @@
                     // this prevents us from re-executing the defaults if this function is getting
                     // executed from a recomposition
                     // if (%changed and 0b0001 == 0 || %composer.defaultsInvalid) {
-                    condition = irOrOr(
-                        irEqual(changedParam.irLowBit(), irConst(0)),
-                        irDefaultsInvalid()
-                    ),
+                    condition =
+                        irOrOr(irEqual(changedParam.irLowBit(), irConst(0)), irDefaultsInvalid()),
                     // set all of the default temp vars
                     thenPart = setDefaults,
                     // composer.skipCurrentGroup()
-                    elsePart = irBlock(
-                        statements = listOf(
-                            irSkipToGroupEnd(UNDEFINED_OFFSET, UNDEFINED_OFFSET),
-                            *skipDefaults.statements.toTypedArray()
+                    elsePart =
+                        irBlock(
+                            statements =
+                                listOf(
+                                    irSkipToGroupEnd(UNDEFINED_OFFSET, UNDEFINED_OFFSET),
+                                    *skipDefaults.statements.toTypedArray()
+                                )
                         )
-                    )
                 )
             )
             bodyPreamble.statements.add(irEndDefaults())
@@ -1673,31 +1646,31 @@
         changedParam: IrChangedBitMaskValue,
         slotIndex: Int,
         param: IrValueDeclaration
-    ) = if (FeatureFlag.StrongSkipping.enabled && stability.isUncertain()) {
-        irIfThenElse(
-            type = context.irBuiltIns.booleanType,
-            condition = irIsStable(changedParam, slotIndex),
-            thenPart = irChanged(
-                irCurrentComposer(),
-                irGet(param),
-                inferredStable = true,
-                compareInstanceForFunctionTypes = true,
-                compareInstanceForUnstableValues = true
-            ),
-            elsePart = irChanged(
-                irCurrentComposer(),
-                irGet(param),
-                inferredStable = false,
-                compareInstanceForFunctionTypes = true,
-                compareInstanceForUnstableValues = true
+    ) =
+        if (FeatureFlag.StrongSkipping.enabled && stability.isUncertain()) {
+            irIfThenElse(
+                type = context.irBuiltIns.booleanType,
+                condition = irIsStable(changedParam, slotIndex),
+                thenPart =
+                    irChanged(
+                        irCurrentComposer(),
+                        irGet(param),
+                        inferredStable = true,
+                        compareInstanceForFunctionTypes = true,
+                        compareInstanceForUnstableValues = true
+                    ),
+                elsePart =
+                    irChanged(
+                        irCurrentComposer(),
+                        irGet(param),
+                        inferredStable = false,
+                        compareInstanceForFunctionTypes = true,
+                        compareInstanceForUnstableValues = true
+                    )
             )
-        )
-    } else {
-        irChanged(
-            irGet(param),
-            compareInstanceForFunctionTypes = true
-        )
-    }
+        } else {
+            irChanged(irGet(param), compareInstanceForFunctionTypes = true)
+        }
 
     private fun irEndRestartGroupAndUpdateScope(
         scope: Scope.FunctionScope,
@@ -1712,20 +1685,18 @@
         // receiver sometimes cause an invalid name, "$<this>", to
         // be generated.
         val dispatchReceiverParameter = function.dispatchReceiverParameter
-        val outerReceiver = if (dispatchReceiverParameter != null) irTemporary(
-            value = irGet(dispatchReceiverParameter),
-            nameHint = "rcvr"
-        ) else null
+        val outerReceiver =
+            if (dispatchReceiverParameter != null)
+                irTemporary(value = irGet(dispatchReceiverParameter), nameHint = "rcvr")
+            else null
 
         // Create self-invoke lambda
         val parameterCount = function.valueParameters.size
         val contextParameterCount = function.contextReceiverParametersCount
         val composerIndex = contextParameterCount + numRealValueParameters
         val changedIndex = composerIndex + 1
-        val defaultIndex = changedIndex + changedParamCount(
-            numRealValueParameters,
-            function.thisParamCount
-        )
+        val defaultIndex =
+            changedIndex + changedParamCount(numRealValueParameters, function.thisParamCount)
 
         if (defaultParam == null) {
             // param count is 1-based, index is 0-based
@@ -1734,99 +1705,93 @@
                     "found $parameterCount"
             }
         } else {
-            val expectedParamCount = defaultIndex +
-                defaultParamCount(contextParameterCount + numRealValueParameters)
-            require(
-                parameterCount == expectedParamCount
-            ) {
+            val expectedParamCount =
+                defaultIndex + defaultParamCount(contextParameterCount + numRealValueParameters)
+            require(parameterCount == expectedParamCount) {
                 "Expected $expectedParamCount params for ${function.fqNameWhenAvailable}, " +
                     "found $parameterCount"
             }
         }
 
-        val lambda = irLambdaExpression(
-            startOffset = UNDEFINED_OFFSET,
-            endOffset = UNDEFINED_OFFSET,
-            returnType = builtIns.unitType
-        ) { fn ->
-            fn.parent = function
-            val newComposer = fn.addValueParameter(
-                ComposeNames.COMPOSER_PARAMETER.identifier,
-                composerIrClass.defaultType
-                    .replaceArgumentsWithStarProjections()
-                    .makeNullable()
-            )
-            fn.addValueParameter(
-                ComposeNames.FORCE_PARAMETER,
-                builtIns.intType
-            )
-            fn.body = DeclarationIrBuilder(context, fn.symbol).irBlockBody {
-                // Call the function again with the same parameters
-                +irReturn(
-                    irCall(function.symbol).apply {
-                        symbol.owner
-                            .valueParameters
-                            .fastForEachIndexed { index, param ->
-                                if (param.isVararg) {
-                                    putValueArgument(
-                                        index,
-                                        IrVarargImpl(
-                                            UNDEFINED_OFFSET,
-                                            UNDEFINED_OFFSET,
-                                            param.type,
-                                            param.varargElementType!!,
-                                            elements = listOf(
-                                                IrSpreadElementImpl(
-                                                    UNDEFINED_OFFSET,
-                                                    UNDEFINED_OFFSET,
-                                                    irGet(param)
-                                                )
+        val lambda =
+            irLambdaExpression(
+                startOffset = UNDEFINED_OFFSET,
+                endOffset = UNDEFINED_OFFSET,
+                returnType = builtIns.unitType
+            ) { fn ->
+                fn.parent = function
+                val newComposer =
+                    fn.addValueParameter(
+                        ComposeNames.COMPOSER_PARAMETER.identifier,
+                        composerIrClass.defaultType
+                            .replaceArgumentsWithStarProjections()
+                            .makeNullable()
+                    )
+                fn.addValueParameter(ComposeNames.FORCE_PARAMETER, builtIns.intType)
+                fn.body =
+                    DeclarationIrBuilder(context, fn.symbol).irBlockBody {
+                        // Call the function again with the same parameters
+                        +irReturn(
+                            irCall(function.symbol).apply {
+                                symbol.owner.valueParameters.fastForEachIndexed { index, param ->
+                                    if (param.isVararg) {
+                                        putValueArgument(
+                                            index,
+                                            IrVarargImpl(
+                                                UNDEFINED_OFFSET,
+                                                UNDEFINED_OFFSET,
+                                                param.type,
+                                                param.varargElementType!!,
+                                                elements =
+                                                    listOf(
+                                                        IrSpreadElementImpl(
+                                                            UNDEFINED_OFFSET,
+                                                            UNDEFINED_OFFSET,
+                                                            irGet(param)
+                                                        )
+                                                    )
                                             )
                                         )
-                                    )
-                                } else {
-                                    // NOTE(lmr): should we be using the parameter here, or the temporary
-                                    // with the default value?
-                                    putValueArgument(index, irGet(param))
+                                    } else {
+                                        // NOTE(lmr): should we be using the parameter here, or the
+                                        // temporary
+                                        // with the default value?
+                                        putValueArgument(index, irGet(param))
+                                    }
+                                }
+
+                                // new composer
+                                putValueArgument(composerIndex, irGet(newComposer))
+
+                                // the call in updateScope needs to *always* have the low bit set to
+                                // 1.
+                                // This ensures that the body of the function is actually executed.
+                                changedParam.putAsValueArgumentInWithLowBit(
+                                    this,
+                                    changedIndex,
+                                    lowBit = true
+                                )
+
+                                defaultParam?.putAsValueArgumentIn(this, defaultIndex)
+
+                                extensionReceiver =
+                                    function.extensionReceiverParameter?.let { irGet(it) }
+                                dispatchReceiver = outerReceiver?.let { irGet(it) }
+                                function.typeParameters.fastForEachIndexed { index, parameter ->
+                                    putTypeArgument(index, parameter.defaultType)
                                 }
                             }
-
-                        // new composer
-                        putValueArgument(
-                            composerIndex,
-                            irGet(newComposer)
                         )
-
-                        // the call in updateScope needs to *always* have the low bit set to 1.
-                        // This ensures that the body of the function is actually executed.
-                        changedParam.putAsValueArgumentInWithLowBit(
-                            this,
-                            changedIndex,
-                            lowBit = true
-                        )
-
-                        defaultParam?.putAsValueArgumentIn(this, defaultIndex)
-
-                        extensionReceiver = function.extensionReceiverParameter?.let { irGet(it) }
-                        dispatchReceiver = outerReceiver?.let { irGet(it) }
-                        function.typeParameters.fastForEachIndexed { index, parameter ->
-                            putTypeArgument(index, parameter.defaultType)
-                        }
                     }
-                )
             }
-        }
 
         // $composer.endRestartGroup()?.updateScope { next, _ -> TheFunction(..., next) }
         return irBlock(
-            statements = listOfNotNull(
-                outerReceiver,
-                irSafeCall(
-                    irEndRestartGroup(scope),
-                    updateScopeFunction.symbol,
-                    lambda
-                ),
-            )
+            statements =
+                listOfNotNull(
+                    outerReceiver,
+                    irSafeCall(irEndRestartGroup(scope), updateScopeFunction.symbol, lambda),
+                )
         )
     }
 
@@ -1836,8 +1801,8 @@
             currentMarkerProperty!!.getter!!
         )
 
-    private fun irIsSkipping() =
-        irMethodCall(irCurrentComposer(), isSkippingFunction.getter!!)
+    private fun irIsSkipping() = irMethodCall(irCurrentComposer(), isSkippingFunction.getter!!)
+
     private fun irDefaultsInvalid() =
         irMethodCall(irCurrentComposer(), defaultsInvalidFunction.getter!!)
 
@@ -1845,20 +1810,14 @@
         irEqual(default.irIsolateBitAtIndex(slot), irConst(0))
 
     // %changed and 0b111 == 0
-    private fun irIsUncertainAndStable(changed: IrChangedBitMaskValue, slot: Int) = irEqual(
-        changed.irIsolateBitsAtSlot(slot, includeStableBit = true),
-        irConst(0)
-    )
+    private fun irIsUncertainAndStable(changed: IrChangedBitMaskValue, slot: Int) =
+        irEqual(changed.irIsolateBitsAtSlot(slot, includeStableBit = true), irConst(0))
 
-    private fun irIsStable(changed: IrChangedBitMaskValue, slot: Int) = irEqual(
-        changed.irStableBitAtSlot(slot),
-        irConst(0)
-    )
+    private fun irIsStable(changed: IrChangedBitMaskValue, slot: Int) =
+        irEqual(changed.irStableBitAtSlot(slot), irConst(0))
 
-    private fun irIsUncertain(changed: IrChangedBitMaskValue, slot: Int) = irEqual(
-        changed.irIsolateBitsAtSlot(slot, includeStableBit = false),
-        irConst(0)
-    )
+    private fun irIsUncertain(changed: IrChangedBitMaskValue, slot: Int) =
+        irEqual(changed.irIsolateBitsAtSlot(slot, includeStableBit = false), irConst(0))
 
     @Suppress("SameParameterValue")
     private fun irBitsForSlot(bits: Int, slot: Int): IrExpression {
@@ -1891,24 +1850,19 @@
     private fun IrBody.asBodyAndResultVar(
         expectedTarget: IrFunction? = null
     ): Pair<IrContainerExpression, IrVariable?> {
-        val original = IrCompositeImpl(
-            startOffset,
-            endOffset,
-            context.irBuiltIns.unitType,
-            null,
-            statements
-        )
+        val original =
+            IrCompositeImpl(startOffset, endOffset, context.irBuiltIns.unitType, null, statements)
         var block: IrStatementContainer? = original
         var expr: IrStatement? = block?.statements?.lastOrNull()
         while (expr != null && block != null) {
             if (
                 expr is IrReturn &&
-                (expectedTarget == null || expectedTarget == expr.returnTargetSymbol.owner)
+                    (expectedTarget == null || expectedTarget == expr.returnTargetSymbol.owner)
             ) {
                 block.statements.pop()
                 val valueType = expr.value.type
-                val returnType = (expr.returnTargetSymbol as? IrFunctionSymbol)?.owner?.returnType
-                    ?: valueType
+                val returnType =
+                    (expr.returnTargetSymbol as? IrFunctionSymbol)?.owner?.returnType ?: valueType
                 return if (returnType.isUnit() || returnType.isNothing() || valueType.isNothing()) {
                     block.statements.add(expr.value)
                     original to null
@@ -1918,8 +1872,7 @@
                     original to temp
                 }
             }
-            if (expr !is IrBlock)
-                return original to null
+            if (expr !is IrBlock) return original to null
             block = expr
             expr = block.statements.lastOrNull()
         }
@@ -1927,20 +1880,14 @@
     }
 
     override fun visitProperty(declaration: IrProperty): IrStatement =
-        inScope(Scope.PropertyScope(declaration.name)) {
-            super.visitProperty(declaration)
-        }
+        inScope(Scope.PropertyScope(declaration.name)) { super.visitProperty(declaration) }
 
     override fun visitField(declaration: IrField): IrStatement =
-        inScope(Scope.FieldScope(declaration.name)) {
-            super.visitField(declaration)
-        }
+        inScope(Scope.FieldScope(declaration.name)) { super.visitField(declaration) }
 
     override fun visitFile(declaration: IrFile): IrFile =
         includeFileNameInExceptionTrace(declaration) {
-            inScope(Scope.FileScope(declaration)) {
-                super.visitFile(declaration)
-            }
+            inScope(Scope.FileScope(declaration)) { super.visitFile(declaration) }
         }
 
     override fun visitDeclaration(declaration: IrDeclarationBase): IrStatement {
@@ -1973,11 +1920,7 @@
         endOffset: Int = UNDEFINED_OFFSET,
         composerParameter: IrValueParameter = nearestComposer()
     ): IrExpression {
-        return IrGetValueImpl(
-            startOffset,
-            endOffset,
-            composerParameter.symbol
-        )
+        return IrGetValueImpl(startOffset, endOffset, composerParameter.symbol)
     }
 
     private fun Scope.BlockScope.irCurrentComposer(
@@ -1987,11 +1930,7 @@
         irCurrentComposer(startOffset, endOffset, nearestComposer ?: nearestComposer())
 
     private fun IrElement.sourceKey(): Int {
-        var hash = currentFunctionScope
-            .function
-            .kotlinFqName
-            .asString()
-            .hashCode()
+        var hash = currentFunctionScope.function.kotlinFqName.asString().hashCode()
         hash = 31 * hash + startOffset
         hash = 31 * hash + endOffset
 
@@ -2023,12 +1962,7 @@
     }
 
     private fun IrElement.irSourceKey(): IrConst<Int> =
-        IrConstImpl.int(
-            UNDEFINED_OFFSET,
-            UNDEFINED_OFFSET,
-            context.irBuiltIns.intType,
-            sourceKey()
-        )
+        IrConstImpl.int(UNDEFINED_OFFSET, UNDEFINED_OFFSET, context.irBuiltIns.intType, sourceKey())
 
     private fun irFunctionSourceKey(): IrConst<Int> =
         IrConstImpl.int(
@@ -2066,11 +2000,10 @@
     }
 
     private fun irSourceInformation(scope: Scope.BlockScope): IrExpression {
-        val sourceInformation = irCall(
-            sourceInformationFunction
-        ).also {
-            it.putValueArgument(0, scope.irCurrentComposer())
-        }
+        val sourceInformation =
+            irCall(sourceInformationFunction).also {
+                it.putValueArgument(0, scope.irCurrentComposer())
+            }
         recordSourceParameter(sourceInformation, 1, scope)
         return sourceInformation
     }
@@ -2080,50 +2013,38 @@
         scope: Scope.BlockScope,
         key: IrExpression = element.irSourceKey(),
     ): IrExpression {
-        return irCall(
-            sourceInformationMarkerStartFunction,
-            element.startOffset,
-            element.endOffset
-        ).also {
-            it.putValueArgument(0, scope.irCurrentComposer())
-            it.putValueArgument(1, key)
-            recordSourceParameter(it, 2, scope)
-        }
+        return irCall(sourceInformationMarkerStartFunction, element.startOffset, element.endOffset)
+            .also {
+                it.putValueArgument(0, scope.irCurrentComposer())
+                it.putValueArgument(1, key)
+                recordSourceParameter(it, 2, scope)
+            }
     }
 
     private fun irSourceInformationMarkerEnd(
         element: IrElement,
         scope: Scope.BlockScope
     ): IrExpression {
-        return irCall(
-            sourceInformationMarkerEndFunction,
-            element.startOffset,
-            element.endOffset
-        ).also {
-            it.putValueArgument(0, scope.irCurrentComposer())
-        }
+        return irCall(sourceInformationMarkerEndFunction, element.startOffset, element.endOffset)
+            .also { it.putValueArgument(0, scope.irCurrentComposer()) }
     }
 
     private fun irWithSourceInformationMarker(
         expression: IrExpression,
         scope: Scope.BlockScope,
         before: List<IrStatement>
-    ): IrExpression = if (collectSourceInformation && scope.hasSourceInformation) {
-        expression.wrap(
-            before = before + listOf(irSourceInformationMarkerStart(expression, scope)),
-            after = listOf(irSourceInformationMarkerEnd(expression, scope))
-        )
-    } else if (before.isNotEmpty())
-        expression.wrap(before = before)
-    else expression
+    ): IrExpression =
+        if (collectSourceInformation && scope.hasSourceInformation) {
+            expression.wrap(
+                before = before + listOf(irSourceInformationMarkerStart(expression, scope)),
+                after = listOf(irSourceInformationMarkerEnd(expression, scope))
+            )
+        } else if (before.isNotEmpty()) expression.wrap(before = before) else expression
 
-    private fun irIsTraceInProgress(): IrExpression? =
-        isTraceInProgressFunction?.let { irCall(it) }
+    private fun irIsTraceInProgress(): IrExpression? = isTraceInProgressFunction?.let { irCall(it) }
 
     private fun irIfTraceInProgress(body: IrExpression): IrExpression? =
-        irIsTraceInProgress()?.let { isTraceInProgress ->
-            irIf(isTraceInProgress, body)
-        }
+        irIsTraceInProgress()?.let { isTraceInProgress -> irIf(isTraceInProgress, body) }
 
     private fun irTraceEventStart(key: IrExpression, scope: Scope.FunctionScope): IrExpression? =
         traceEventStartFunction?.let { traceEventStart ->
@@ -2140,10 +2061,8 @@
             val traceInfo = "$name ($file:$line)" // TODO(174715171) decide on what to log
             val dirty = scope.dirty
             val changed = scope.changedParameter
-            val params = if (dirty != null && dirty.used)
-                dirty.declarations
-            else
-                changed?.declarations
+            val params =
+                if (dirty != null && dirty.used) dirty.declarations else changed?.declarations
             val dirty1 = params?.getOrNull(0)?.let { irGet(it) } ?: irConst(-1)
             val dirty2 = params?.getOrNull(1)?.let { irGet(it) } ?: irConst(-1)
 
@@ -2158,9 +2077,7 @@
         }
 
     private fun irTraceEventEnd(): IrExpression? =
-        traceEventEndFunction?.let {
-            irIfTraceInProgress(irCall(it))
-        }
+        traceEventEndFunction?.let { irIfTraceInProgress(irCall(it)) }
 
     private fun irStartDefaults(element: IrElement): IrExpression {
         return irMethodCall(
@@ -2180,13 +2097,12 @@
             irSet(
                 nearestComposer(),
                 irMethodCall(
-                    scope.irCurrentComposer(),
-                    startRestartGroupFunction,
-                    element.startOffset,
-                    element.endOffset
-                ).also {
-                    it.putValueArgument(0, key)
-                }
+                        scope.irCurrentComposer(),
+                        startRestartGroupFunction,
+                        element.startOffset,
+                        element.endOffset
+                    )
+                    .also { it.putValueArgument(0, key) }
             ),
             scope
         )
@@ -2200,13 +2116,14 @@
         value: IrExpression,
         compareInstanceForFunctionTypes: Boolean,
         compareInstanceForUnstableValues: Boolean = FeatureFlag.StrongSkipping.enabled
-    ): IrExpression = irChanged(
-        irCurrentComposer(),
-        value,
-        inferredStable = false,
-        compareInstanceForFunctionTypes = compareInstanceForFunctionTypes,
-        compareInstanceForUnstableValues = compareInstanceForUnstableValues
-    )
+    ): IrExpression =
+        irChanged(
+            irCurrentComposer(),
+            value,
+            inferredStable = false,
+            compareInstanceForFunctionTypes = compareInstanceForFunctionTypes,
+            compareInstanceForUnstableValues = compareInstanceForUnstableValues
+        )
 
     private fun irSkipToGroupEnd(startOffset: Int, endOffset: Int): IrExpression {
         return irMethodCall(
@@ -2240,14 +2157,15 @@
     ): IrExpression {
         return irWithSourceInformation(
             irMethodCall(
-                scope.irCurrentComposer(),
-                startMovableFunction,
-                element.startOffset,
-                element.endOffset
-            ).also {
-                it.putValueArgument(0, element.irSourceKey())
-                it.putValueArgument(1, joinedData)
-            },
+                    scope.irCurrentComposer(),
+                    startMovableFunction,
+                    element.startOffset,
+                    element.endOffset
+                )
+                .also {
+                    it.putValueArgument(0, element.irSourceKey())
+                    it.putValueArgument(1, joinedData)
+                },
             scope
         )
     }
@@ -2279,19 +2197,19 @@
         val tmpVal = irTemporary(target, nameHint = "safe_receiver")
         return irBlock(
             origin = IrStatementOrigin.SAFE_CALL,
-            statements = listOf(
-                tmpVal,
-                irIfThenElse(
-                    condition = irEqual(irGet(tmpVal), irNull()),
-                    thenPart = irNull(),
-                    elsePart = irCall(symbol).apply {
-                        dispatchReceiver = irGet(tmpVal)
-                        args.fastForEachIndexed { i, arg ->
-                            putValueArgument(i, arg)
-                        }
-                    }
+            statements =
+                listOf(
+                    tmpVal,
+                    irIfThenElse(
+                        condition = irEqual(irGet(tmpVal), irNull()),
+                        thenPart = irNull(),
+                        elsePart =
+                            irCall(symbol).apply {
+                                dispatchReceiver = irGet(tmpVal)
+                                args.fastForEachIndexed { i, arg -> putValueArgument(i, arg) }
+                            }
+                    )
                 )
-            )
         )
     }
 
@@ -2303,16 +2221,9 @@
         exactName: Boolean = false
     ): IrVariableImpl {
         val scope = currentFunctionScope
-        val name = if (exactName && nameHint != null)
-            nameHint
-        else
-            scope.getNameForTemporary(nameHint)
-        return irTemporary(
-            value,
-            name,
-            irType,
-            isVar
-        ).also {
+        val name =
+            if (exactName && nameHint != null) nameHint else scope.getNameForTemporary(nameHint)
+        return irTemporary(value, name, irType, isVar).also {
             it.parent = currentFunctionScope.function.parent
         }
     }
@@ -2322,9 +2233,7 @@
         insertAt: Int = 0
     ): IrExpression {
         currentFunctionScope.metrics.recordGroup()
-        scope.realizeGroup {
-            irEndReplaceGroup(scope = scope)
-        }
+        scope.realizeGroup { irEndReplaceGroup(scope = scope) }
 
         val prefix = statements.subList(0, insertAt)
         val suffix = statements.subList(insertAt, statements.size)
@@ -2332,29 +2241,34 @@
             // if the scope ends with a return call, then it will get properly ended if we
             // just push the end call on the scope because of the way returns get transformed in
             // this class. As a result, here we can safely just "prepend" the start call
-            endsWithReturnOrJump() -> IrBlockImpl(
-                startOffset,
-                endOffset,
-                type,
-                origin,
-                prefix + listOf(irStartReplaceGroup(this, scope)) + suffix
-            )
+            endsWithReturnOrJump() ->
+                IrBlockImpl(
+                    startOffset,
+                    endOffset,
+                    type,
+                    origin,
+                    prefix + listOf(irStartReplaceGroup(this, scope)) + suffix
+                )
             // otherwise, we want to push an end call for any early returns/jumps, but also add
             // an end call to the end of the group
-            else -> IrBlockImpl(
-                startOffset,
-                endOffset,
-                type,
-                origin,
-                prefix + listOf(
-                    irStartReplaceGroup(
-                        this,
-                        scope,
-                        startOffset = startOffset,
-                        endOffset = endOffset
-                    )
-                ) + suffix + listOf(irEndReplaceGroup(startOffset, endOffset, scope))
-            )
+            else ->
+                IrBlockImpl(
+                    startOffset,
+                    endOffset,
+                    type,
+                    origin,
+                    prefix +
+                        listOf(
+                            irStartReplaceGroup(
+                                this,
+                                scope,
+                                startOffset = startOffset,
+                                endOffset = endOffset
+                            )
+                        ) +
+                        suffix +
+                        listOf(irEndReplaceGroup(startOffset, endOffset, scope))
+                )
         }
     }
 
@@ -2366,20 +2280,19 @@
         // could be inside of the block
         if (!scope.hasComposableCalls && !scope.hasReturn && !scope.hasJump) {
             return wrap(
-                before = listOf(
-                    irStartReplaceGroup(
-                        this,
-                        scope,
-                        startOffset = startOffset,
-                        endOffset = endOffset,
-                    ),
-                    irEndReplaceGroup(startOffset, endOffset, scope)
-                )
+                before =
+                    listOf(
+                        irStartReplaceGroup(
+                            this,
+                            scope,
+                            startOffset = startOffset,
+                            endOffset = endOffset,
+                        ),
+                        irEndReplaceGroup(startOffset, endOffset, scope)
+                    )
             )
         }
-        scope.realizeGroup {
-            irEndReplaceGroup(scope = scope)
-        }
+        scope.realizeGroup { irEndReplaceGroup(scope = scope) }
         return when {
             // if the scope ends with a return call, then it will get properly ended if we
             // just push the end call on the scope because of the way returns get transformed in
@@ -2391,14 +2304,15 @@
             // an end call to the end of the group
             else -> {
                 wrap(
-                    before = listOf(
-                        irStartReplaceGroup(
-                            this,
-                            scope,
-                            startOffset = startOffset,
-                            endOffset = endOffset
-                        )
-                    ),
+                    before =
+                        listOf(
+                            irStartReplaceGroup(
+                                this,
+                                scope,
+                                startOffset = startOffset,
+                                endOffset = endOffset
+                            )
+                        ),
                     after = listOf(irEndReplaceGroup(startOffset, endOffset, scope))
                 )
             }
@@ -2406,13 +2320,7 @@
     }
 
     private fun IrExpression.variablePrefix(variable: IrVariable) =
-        IrBlockImpl(
-            startOffset,
-            endOffset,
-            type,
-            null,
-            listOf(variable, this)
-        )
+        IrBlockImpl(startOffset, endOffset, type, null, listOf(variable, this))
 
     fun IrExpression.wrap(
         before: List<IrStatement> = emptyList(),
@@ -2422,13 +2330,7 @@
             wrap(startOffset, endOffset, type, before, after)
         } else {
             val tmpVar = irTemporary(this, nameHint = "group")
-            tmpVar.wrap(
-                startOffset,
-                endOffset,
-                type,
-                before,
-                after + irGet(tmpVar)
-            )
+            tmpVar.wrap(startOffset, endOffset, type, before, after + irGet(tmpVar))
         }
     }
 
@@ -2449,14 +2351,9 @@
                     after.statements.add(irEndReplaceGroup(scope = scope))
                 }
             },
-            makeEnd = {
-                irEndReplaceGroup(scope = scope)
-            }
+            makeEnd = { irEndReplaceGroup(scope = scope) }
         )
-        return wrap(
-            listOf(before),
-            listOf(after)
-        )
+        return wrap(listOf(before), listOf(after))
     }
 
     private fun IrContainerExpression.asSourceOrEarlyExitGroup(
@@ -2475,12 +2372,8 @@
         // the group, and we don't have to deal with any of the complicated jump logic that
         // could be inside of the block
         val makeStart = {
-            if (needsGroup) irStartReplaceGroup(
-                this,
-                scope,
-                startOffset = startOffset,
-                endOffset = endOffset
-            )
+            if (needsGroup)
+                irStartReplaceGroup(this, scope, startOffset = startOffset, endOffset = endOffset)
             else irSourceInformationMarkerStart(this, scope)
         }
         val makeEnd = {
@@ -2555,8 +2448,7 @@
                 is Scope.BlockScope -> {
                     location = scope.recordSourceLocation(call, location)
                 }
-                is Scope.ClassScope ->
-                    break@loop
+                is Scope.ClassScope -> break@loop
                 else -> {
                     /* Do nothing, continue traversing */
                 }
@@ -2622,9 +2514,7 @@
                     if (scope.function == symbol.owner) {
                         scope.hasAnyEarlyReturn = true
                         if (!leavingInlinedLambda || !rollbackGroupMarkerEnabled) {
-                            blockScopeMarks.fastForEach {
-                                it.markReturn(extraEndLocation)
-                            }
+                            blockScopeMarks.fastForEach { it.markReturn(extraEndLocation) }
                             scope.markReturn(extraEndLocation)
                             if (scope.isInlinedLambda && scope.inComposableCall) {
                                 scope.hasInlineEarlyReturn = true
@@ -2733,9 +2623,7 @@
         }
     }
 
-    /**
-     * Argument information extracted from the call site and argument expression itself.
-     */
+    /** Argument information extracted from the call site and argument expression itself. */
     data class CallArgumentMeta(
         /** stability of argument expression */
         var stability: Stability = Stability.Unstable,
@@ -2748,12 +2636,13 @@
         /** metadata from enclosing function parameters (NOT the function being called) */
         var paramRef: ParamMeta? = null
     ) {
-        val isCertain get() = paramRef != null
+        val isCertain
+            get() = paramRef != null
     }
 
     /**
-     * Composable call information extracted from composable function parameters referenced
-     * in a call argument.
+     * Composable call information extracted from composable function parameters referenced in a
+     * call argument.
      */
     data class ParamMeta(
         /** Slot index in maskParam */
@@ -2807,12 +2696,13 @@
                                 return ParamMeta(
                                     maskSlot = slotIndex,
                                     maskParam = scope.dirty,
-                                    hasNonStaticDefault = if (param is IrValueParameter) {
-                                        param.defaultValue?.expression?.isStatic() == false
-                                    } else {
-                                        // No default for this parameter
-                                        false
-                                    }
+                                    hasNonStaticDefault =
+                                        if (param is IrValueParameter) {
+                                            param.defaultValue?.expression?.isStatic() == false
+                                        } else {
+                                            // No default for this parameter
+                                            false
+                                        }
                                 )
                             }
                         }
@@ -2856,9 +2746,7 @@
                 // shape in tact so that we don't ruin some of these optimizations.
                 val statements = expression.statements
 
-                require(statements.size == 2) {
-                    "Expected 2 statements in for-loop block"
-                }
+                require(statements.size == 2) { "Expected 2 statements in for-loop block" }
                 val oldVar = statements[0] as IrVariable
                 require(oldVar.origin == IrDeclarationOrigin.FOR_LOOP_ITERATOR) {
                     "Expected FOR_LOOP_ITERATOR origin for iterator variable"
@@ -2872,8 +2760,7 @@
 
                 val newLoop = oldLoop.transform(this, null)
 
-                if (newVar == oldVar && newLoop == oldLoop)
-                    expression
+                if (newVar == oldVar && newLoop == oldLoop) expression
                 else if (newLoop is IrBlock) {
                     require(newLoop.statements.size == 3)
                     val before = newLoop.statements[0] as IrContainerExpression
@@ -2887,10 +2774,7 @@
                             irBlock(
                                 type = expression.type,
                                 origin = IrStatementOrigin.FOR_LOOP,
-                                statements = listOf(
-                                    newVar,
-                                    loop
-                                )
+                                statements = listOf(newVar, loop)
                             ),
                             after
                         )
@@ -2919,9 +2803,8 @@
                 // some control flow analysis to handle there as well. We wrap the call in a
                 // CaptureScope and coalescable group if the call has any composable invocations
                 // inside of it.
-                val captureScope = withScope(Scope.CaptureScope()) {
-                    expression.transformChildrenVoid()
-                }
+                val captureScope =
+                    withScope(Scope.CaptureScope()) { expression.transformChildrenVoid() }
                 return if (captureScope.hasCapturedComposableCall) {
                     // if the inlined lambda has composable calls, realize its coalescable groups
                     // in the body to ensure that repeated invocations are not colliding.
@@ -2965,9 +2848,7 @@
 
         // it's important that we transform all of the parameters here since this will cause the
         // IrGetValue's of remapped default parameters to point to the right variable.
-        inScope(callScope) {
-            expression.transformChildrenVoid()
-        }
+        inScope(callScope) { expression.transformChildrenVoid() }
 
         encounteredComposableCall(
             withGroups = !expression.symbol.owner.hasReadOnlyAnnotation,
@@ -2980,9 +2861,7 @@
         val numChanged: Int
         val numRealValueParams: Int
 
-        val hasDefaults = ownerFn.valueParameters.any {
-            it.name == ComposeNames.DEFAULT_PARAMETER
-        }
+        val hasDefaults = ownerFn.valueParameters.any { it.name == ComposeNames.DEFAULT_PARAMETER }
         if (!hasDefaults && expression.isInvoke()) {
             // in the case of an invoke without any defaults, all of the parameters are going to
             // be type parameter args which won't have special names.
@@ -2990,39 +2869,43 @@
             // be defaulted though, so we can calculate the number of real parameters based on
             // the total number of parameters
             numDefaults = 0
-            numChanged = changedParamCountFromTotal(
-                // Subtracting context params from total since they are included in thisParams
-                numValueParams - numContextParams + ownerFn.thisParamCount
-            )
-            numRealValueParams = numValueParams -
-                numContextParams -
-                1 - // composer param
-                numChanged
+            numChanged =
+                changedParamCountFromTotal(
+                    // Subtracting context params from total since they are included in thisParams
+                    numValueParams - numContextParams + ownerFn.thisParamCount
+                )
+            numRealValueParams =
+                numValueParams -
+                    numContextParams -
+                    1 - // composer param
+                    numChanged
         } else {
             // Context receiver params are value parameters and will precede real params, calculate
             // the amount of real params by finding the index off the last real param (if any) and
             // offsetting it by the amount of context receiver params.
-            val composerParamIndex = ownerFn.valueParameters.indexOfFirst {
-                it.name == ComposeNames.COMPOSER_PARAMETER
-            }
-            numRealValueParams = if (composerParamIndex != -1) {
-                composerParamIndex - numContextParams
-            } else {
-                0
-            }
-            numDefaults = if (hasDefaults) {
-                defaultParamCount(numContextParams + numRealValueParams)
-            } else {
-                0
-            }
+            val composerParamIndex =
+                ownerFn.valueParameters.indexOfFirst { it.name == ComposeNames.COMPOSER_PARAMETER }
+            numRealValueParams =
+                if (composerParamIndex != -1) {
+                    composerParamIndex - numContextParams
+                } else {
+                    0
+                }
+            numDefaults =
+                if (hasDefaults) {
+                    defaultParamCount(numContextParams + numRealValueParams)
+                } else {
+                    0
+                }
             numChanged = changedParamCount(numRealValueParams, ownerFn.thisParamCount)
         }
 
-        val expectedNumParams = numContextParams +
-            numRealValueParams +
-            1 + // composer param
-            numChanged +
-            numDefaults
+        val expectedNumParams =
+            numContextParams +
+                numRealValueParams +
+                1 + // composer param
+                numChanged +
+                numDefaults
         require(numValueParams == expectedNumParams) {
             "Expected $expectedNumParams params for ${ownerFn.name}, but got $numValueParams"
         }
@@ -3030,17 +2913,17 @@
         val composerIndex = numContextParams + numRealValueParams
         val changedArgIndex = composerIndex + 1
         val defaultArgIndex = changedArgIndex + numChanged
-        val defaultArgs = (defaultArgIndex until numValueParams).map {
-            expression.getValueArgument(it)
-        }
+        val defaultArgs =
+            (defaultArgIndex until numValueParams).map { expression.getValueArgument(it) }
         val hasDefaultArgs = defaultArgs.isNotEmpty()
 
-        val defaultMasks = defaultArgs.map {
-            when (it) {
-                !is IrConst<*> -> error("Expected default mask to be a const")
-                else -> it.value as? Int ?: error("Expected default mask to be an Int")
+        val defaultMasks =
+            defaultArgs.map {
+                when (it) {
+                    !is IrConst<*> -> error("Expected default mask to be a const")
+                    else -> it.value as? Int ?: error("Expected default mask to be an Int")
+                }
             }
-        }
 
         val contextMeta = mutableListOf<CallArgumentMeta>()
         val paramMeta = mutableListOf<CallArgumentMeta>()
@@ -3050,7 +2933,8 @@
             if (arg == null) {
                 val param = expression.symbol.owner.valueParameters[index]
                 if (param.varargElementType == null) {
-                    // ComposerParamTransformer should not allow for any null arguments on a composable
+                    // ComposerParamTransformer should not allow for any null arguments on a
+                    // composable
                     // invocation unless the parameter is vararg. If this is null here, we have
                     // missed something.
                     error("Unexpected null argument for composable call")
@@ -3070,37 +2954,28 @@
             }
         }
 
-        val extensionMeta = expression.extensionReceiver?.let {
-            argumentMetaOf(it, isProvided = true)
-        }
-        val dispatchMeta = expression.dispatchReceiver?.let {
-            argumentMetaOf(it, isProvided = true)
-        }
+        val extensionMeta =
+            expression.extensionReceiver?.let { argumentMetaOf(it, isProvided = true) }
+        val dispatchMeta =
+            expression.dispatchReceiver?.let { argumentMetaOf(it, isProvided = true) }
 
-        val changedParams = buildChangedArgumentsForCall(
-            contextArgs = contextMeta,
-            valueArgs = paramMeta,
-            extensionArg = extensionMeta,
-            dispatchArg = dispatchMeta
-        )
+        val changedParams =
+            buildChangedArgumentsForCall(
+                contextArgs = contextMeta,
+                valueArgs = paramMeta,
+                extensionArg = extensionMeta,
+                dispatchArg = dispatchMeta
+            )
 
         changedParams.fastForEachIndexed { i, param ->
             expression.putValueArgument(changedArgIndex + i, param)
         }
 
-        currentFunctionScope.metrics.recordComposableCall(
-            expression,
-            paramMeta
-        )
-        metrics.recordComposableCall(
-            expression,
-            paramMeta
-        )
+        currentFunctionScope.metrics.recordComposableCall(expression, paramMeta)
+        metrics.recordComposableCall(expression, paramMeta)
         recordCallInSource(call = expression)
 
-        return callScope.marker?.let {
-            expression.variablePrefix(it)
-        } ?: expression
+        return callScope.marker?.let { expression.variablePrefix(it) } ?: expression
     }
 
     private fun visitRememberCall(expression: IrCall): IrExpression {
@@ -3109,18 +2984,19 @@
         var calculationArg: IrExpression? = null
         for (i in 0 until expression.valueArgumentsCount) {
             val param = expression.symbol.owner.valueParameters[i]
-            val arg = expression.getValueArgument(i)
-                ?: error("Unexpected null argument found on key call")
-            if (param.name.asString().startsWith('$'))
-            // we are done. synthetic args go at
-            // the end
+            val arg =
+                expression.getValueArgument(i)
+                    ?: error("Unexpected null argument found on key call")
+            if (param.name.asString().startsWith('$')) {
+                // we are done. synthetic args go at
+                // the end
                 break
+            }
 
             when {
                 param.name.identifier == "calculation" -> {
                     calculationArg = arg
                 }
-
                 arg is IrVararg -> {
                     inputArgs.addAll(
                         arg.elements.mapNotNull {
@@ -3133,7 +3009,6 @@
                         }
                     )
                 }
-
                 else -> {
                     inputArgs.add(arg)
                 }
@@ -3157,14 +3032,17 @@
 
         // Build the change parameters as if this was a call to remember to ensure the
         // use of the $dirty flags are calculated correctly.
-        val inputArgMetas = inputArgs.map { argumentMetaOf(it, isProvided = true) }.also {
-            buildChangedArgumentsForCall(
-                contextArgs = emptyList(),
-                valueArgs = it,
-                extensionArg = null,
-                dispatchArg = null
-            )
-        }
+        val inputArgMetas =
+            inputArgs
+                .map { argumentMetaOf(it, isProvided = true) }
+                .also {
+                    buildChangedArgumentsForCall(
+                        contextArgs = emptyList(),
+                        valueArgs = it,
+                        extensionArg = null,
+                        dispatchArg = null
+                    )
+                }
 
         // If intrinsic remember uses $dirty, we are not sure if it is going to be populated,
         // so we have to apply fixups after function body is transformed
@@ -3207,35 +3085,34 @@
 
         // Hoist execution of input params outside of the remember group, similar to how it is
         // handled with inlining.
-        val inputVals = inputArgs.mapIndexed { index, expr ->
-            val meta = inputArgMetas[index]
+        val inputVals =
+            inputArgs.mapIndexed { index, expr ->
+                val meta = inputArgMetas[index]
 
-            // Only create variables when reads introduce side effects
-            val trivialExpression = meta.isCertain || expr is IrGetValue || expr is IrConst<*>
-            if (!trivialExpression) {
-                irTemporary(expr, nameHint = "remember\$arg\$$index")
-            } else {
-                null
+                // Only create variables when reads introduce side effects
+                val trivialExpression = meta.isCertain || expr is IrGetValue || expr is IrConst<*>
+                if (!trivialExpression) {
+                    irTemporary(expr, nameHint = "remember\$arg\$$index")
+                } else {
+                    null
+                }
             }
-        }
-        val inputExprs = inputVals.mapIndexed { index, variable ->
-            variable?.let { irGet(it) } ?: inputArgs[index]
-        }
-        val invalidExpr = irIntrinsicRememberInvalid(
-            isMemoizedLambda,
-            inputExprs,
-            inputArgMetas,
-            changedFunction
-        )
+        val inputExprs =
+            inputVals.mapIndexed { index, variable ->
+                variable?.let { irGet(it) } ?: inputArgs[index]
+            }
+        val invalidExpr =
+            irIntrinsicRememberInvalid(isMemoizedLambda, inputExprs, inputArgMetas, changedFunction)
         val functionScope = currentFunctionScope
-        val cacheCall = irCache(
-            irCurrentComposer(),
-            expression.startOffset,
-            expression.endOffset,
-            expression.type,
-            invalidExpr,
-            calculationArg.transform(this, null)
-        )
+        val cacheCall =
+            irCache(
+                irCurrentComposer(),
+                expression.startOffset,
+                expression.endOffset,
+                expression.type,
+                invalidExpr,
+                calculationArg.transform(this, null)
+            )
         if (usesDirty && metaMaskConsistent) {
             functionScope.recordIntrinsicRememberFixUp(
                 isMemoizedLambda,
@@ -3247,57 +3124,58 @@
 
         val blockScope = intrinsicRememberScope(expression)
         return inScope(blockScope) {
-            val nonNullInputValues = inputVals.filterNotNull()
-            if (useNonSkippingGroupOptimization)
-                irWithSourceInformationMarker(
-                    before = nonNullInputValues,
-                    expression = cacheCall,
-                    scope = blockScope,
-                )
-            else
-                cacheCall.wrap(
-                    before = inputVals.filterNotNull() + listOf(
-                        irStartReplaceGroup(expression, blockScope)
-                    ),
-                    after = listOf(irEndReplaceGroup(scope = blockScope))
-                )
-        }.also { block ->
-            if (
-                stabilityInferencer.stabilityOf(block.type).knownStable() &&
-                    inputArgMetas.all { it.isStatic }
-            ) {
-                context.irTrace.record(ComposeWritableSlices.IS_STATIC_EXPRESSION, block, true)
+                val nonNullInputValues = inputVals.filterNotNull()
+                if (useNonSkippingGroupOptimization)
+                    irWithSourceInformationMarker(
+                        before = nonNullInputValues,
+                        expression = cacheCall,
+                        scope = blockScope,
+                    )
+                else
+                    cacheCall.wrap(
+                        before =
+                            inputVals.filterNotNull() +
+                                listOf(irStartReplaceGroup(expression, blockScope)),
+                        after = listOf(irEndReplaceGroup(scope = blockScope))
+                    )
             }
-        }
+            .also { block ->
+                if (
+                    stabilityInferencer.stabilityOf(block.type).knownStable() &&
+                        inputArgMetas.all { it.isStatic }
+                ) {
+                    context.irTrace.record(ComposeWritableSlices.IS_STATIC_EXPRESSION, block, true)
+                }
+            }
     }
 
     private fun intrinsicRememberScope(
         rememberCall: IrCall,
-    ) = object : Scope.BlockScope("<intrinsic-remember>") {
-        val rememberFunction = rememberCall.symbol.owner
-        val currentFunction = currentFunctionScope.function
-        override fun calculateHasSourceInformation(sourceInformationEnabled: Boolean) =
-            sourceInformationEnabled
+    ) =
+        object : Scope.BlockScope("<intrinsic-remember>") {
+            val rememberFunction = rememberCall.symbol.owner
+            val currentFunction = currentFunctionScope.function
 
-        override fun calculateSourceInfo(sourceInformationEnabled: Boolean): String? =
-        // forge a source information call to fake remember function with current file
-            // location to make sure tooling can identify the following group as remember.
-            if (sourceInformationEnabled) {
-                buildString {
-                    append(rememberFunction.callInformation())
-                    super.calculateSourceInfo(true)?.also {
-                        append(it)
+            override fun calculateHasSourceInformation(sourceInformationEnabled: Boolean) =
+                sourceInformationEnabled
+
+            override fun calculateSourceInfo(sourceInformationEnabled: Boolean): String? =
+                // forge a source information call to fake remember function with current file
+                // location to make sure tooling can identify the following group as remember.
+                if (sourceInformationEnabled) {
+                    buildString {
+                        append(rememberFunction.callInformation())
+                        super.calculateSourceInfo(true)?.also { append(it) }
+                        append(":")
+                        append(currentFunction.file.name)
+                        append("#")
+                        // Use runtime package hash to make sure tooling can identify it as such
+                        append(rememberFunction.packageHash().toString(36))
                     }
-                    append(":")
-                    append(currentFunction.file.name)
-                    append("#")
-                    // Use runtime package hash to make sure tooling can identify it as such
-                    append(rememberFunction.packageHash().toString(36))
+                } else {
+                    null
                 }
-            } else {
-                null
-            }
-    }
+        }
 
     private fun irIntrinsicRememberInvalid(
         isMemoizedLambda: Boolean,
@@ -3307,8 +3185,7 @@
     ): IrExpression =
         args
             .mapIndexedNotNull { i, arg -> changedExpr(isMemoizedLambda, arg, metas[i]) }
-            .reduceOrNull { acc, changed -> irBooleanOr(acc, changed) }
-            ?: irConst(false)
+            .reduceOrNull { acc, changed -> irBooleanOr(acc, changed) } ?: irConst(false)
 
     private fun irIntrinsicChanged(
         isMemoizedLambda: Boolean,
@@ -3323,7 +3200,8 @@
                 argInfo.stability.knownStable() &&
                 param is IrChangedBitMaskVariable &&
                 !meta.hasNonStaticDefault -> {
-                // if it's a dirty flag, and the parameter doesn't have a default value and is _known_
+                // if it's a dirty flag, and the parameter doesn't have a default value and is
+                // _known_
                 // to be stable, then we know that the value is now CERTAIN, thus we can avoid
                 // calling changed completely
                 //
@@ -3343,27 +3221,24 @@
                 //
                 // invalid = invalid or (stable && mask == different || unstable && changed)
 
-                val maskIsStableAndDifferent = irEqual(
-                    param.irIsolateBitsAtSlot(meta.maskSlot, includeStableBit = true),
-                    irConst(ParamState.Different.bitsForSlot(meta.maskSlot))
-                )
-                val stableBits = param.irSlotAnd(meta.maskSlot, StabilityBits.UNSTABLE.bits)
-                val maskIsUnstableAndChanged = irAndAnd(
-                    irNotEqual(stableBits, irConst(0)),
-                    irChanged(
-                        arg,
-                        compareInstanceForFunctionTypes = false,
-                        compareInstanceForUnstableValues = isMemoizedLambda
+                val maskIsStableAndDifferent =
+                    irEqual(
+                        param.irIsolateBitsAtSlot(meta.maskSlot, includeStableBit = true),
+                        irConst(ParamState.Different.bitsForSlot(meta.maskSlot))
                     )
-                )
-                irOrOr(
-                    maskIsStableAndDifferent,
-                    maskIsUnstableAndChanged
-                )
+                val stableBits = param.irSlotAnd(meta.maskSlot, StabilityBits.UNSTABLE.bits)
+                val maskIsUnstableAndChanged =
+                    irAndAnd(
+                        irNotEqual(stableBits, irConst(0)),
+                        irChanged(
+                            arg,
+                            compareInstanceForFunctionTypes = false,
+                            compareInstanceForUnstableValues = isMemoizedLambda
+                        )
+                    )
+                irOrOr(maskIsStableAndDifferent, maskIsUnstableAndChanged)
             }
-            argInfo.isCertain &&
-                !argInfo.stability.knownUnstable() &&
-                param != null -> {
+            argInfo.isCertain && !argInfo.stability.knownUnstable() && param != null -> {
                 // if it's a changed flag or parameter with a default expression then uncertain is a
                 // possible value. If  it is uncertain OR unstable, then we need to call changed.
                 // If it is uncertain or unstable here it will _always_ be uncertain or unstable
@@ -3371,7 +3246,8 @@
                 // see if its different
 
                 //     unstableOrUncertain = mask xor 011 > 010
-                //     invalid = invalid or ((unstableOrUncertain && changed()) || mask == different)
+                //     invalid = invalid or ((unstableOrUncertain && changed()) || mask ==
+                // different)
 
                 val maskIsUnstableOrUncertain =
                     irGreater(
@@ -3396,11 +3272,12 @@
                     )
                 )
             }
-            else -> irChanged(
-                arg,
-                compareInstanceForFunctionTypes = false,
-                compareInstanceForUnstableValues = isMemoizedLambda
-            )
+            else ->
+                irChanged(
+                    arg,
+                    compareInstanceForFunctionTypes = false,
+                    compareInstanceForUnstableValues = isMemoizedLambda
+                )
         }
     }
 
@@ -3410,12 +3287,14 @@
         var blockArg: IrExpression? = null
         for (i in 0 until expression.valueArgumentsCount) {
             val param = expression.symbol.owner.valueParameters[i]
-            val arg = expression.getValueArgument(i)
-                ?: error("Unexpected null argument found on key call")
-            if (param.name.asString().startsWith('$'))
-            // we are done. synthetic args go at
-            // the end
+            val arg =
+                expression.getValueArgument(i)
+                    ?: error("Unexpected null argument found on key call")
+            if (param.name.asString().startsWith('$')) {
+                // we are done. synthetic args go at
+                // the end
                 break
+            }
 
             when {
                 param.name.identifier == "block" -> {
@@ -3439,48 +3318,50 @@
 
         var transformed: IrExpression = block
 
-        val scope = withScope(Scope.BranchScope()) {
-            transformed = transformed.transform(this, null)
-        }
+        val scope =
+            withScope(Scope.BranchScope()) { transformed = transformed.transform(this, null) }
 
         // now after the inner block is extracted, the $composer parameter used in the block needs
         // to be remapped to the outer composer instead for the expression and any inlined lambdas.
-        block.transformChildrenVoid(object : IrElementTransformerVoid() {
-            override fun visitFunction(declaration: IrFunction): IrStatement =
-                if (inlineLambdaInfo.isInlineLambda(declaration)) {
-                    super.visitFunction(declaration)
-                } else {
-                    declaration
-                }
+        block.transformChildrenVoid(
+            object : IrElementTransformerVoid() {
+                override fun visitFunction(declaration: IrFunction): IrStatement =
+                    if (inlineLambdaInfo.isInlineLambda(declaration)) {
+                        super.visitFunction(declaration)
+                    } else {
+                        declaration
+                    }
 
-            override fun visitGetValue(expression: IrGetValue): IrExpression {
-                super.visitGetValue(expression)
+                override fun visitGetValue(expression: IrGetValue): IrExpression {
+                    super.visitGetValue(expression)
 
-                val value = expression.symbol.owner
-                return if (
-                    value is IrValueParameter && value.name == ComposeNames.COMPOSER_PARAMETER
-                ) {
-                    irCurrentComposer()
-                } else {
-                    expression
+                    val value = expression.symbol.owner
+                    return if (
+                        value is IrValueParameter && value.name == ComposeNames.COMPOSER_PARAMETER
+                    ) {
+                        irCurrentComposer()
+                    } else {
+                        expression
+                    }
                 }
             }
-        })
+        )
 
         return irBlock(
             type = expression.type,
-            statements = listOfNotNull(
-                before,
-                irStartMovableGroup(
-                    expression,
-                    irJoinKeyChain(keyArgs.map { it.transform(this, null) }),
-                    scope
-                ),
-                block,
-                irEndMovableGroup(scope),
-                after,
-                resultVar?.let { irGet(resultVar) }
-            )
+            statements =
+                listOfNotNull(
+                    before,
+                    irStartMovableGroup(
+                        expression,
+                        irJoinKeyChain(keyArgs.map { it.transform(this, null) }),
+                        scope
+                    ),
+                    block,
+                    irEndMovableGroup(scope),
+                    after,
+                    resultVar?.let { irGet(resultVar) }
+                )
         )
     }
 
@@ -3490,10 +3371,8 @@
         extensionArg: CallArgumentMeta?,
         dispatchArg: CallArgumentMeta?
     ): List<IrExpression> {
-        val allArgs = listOfNotNull(extensionArg) +
-            contextArgs +
-            valueArgs +
-            listOfNotNull(dispatchArg)
+        val allArgs =
+            listOfNotNull(extensionArg) + contextArgs + valueArgs + listOfNotNull(dispatchArg)
         // passing in 0 for thisParams since they should be included in the params list
         val changedCount = changedParamCount(allArgs.size, 0)
         val result = mutableListOf<IrExpression>()
@@ -3545,28 +3424,22 @@
                     bitMaskConstant = bitMaskConstant or StabilityBits.STABLE.bitsForSlot(slot)
                 }
                 else -> {
-                    stability.irStableExpression(
-                        resolve = {
-                            irTypeParameterStability(it)
-                        }
-                    )?.let {
-                        val expr = if (slot == 0) {
-                            it
-                        } else {
-                            val int = context.irBuiltIns.intType
-                            val bitsToShiftLeft = slot * BITS_PER_SLOT
+                    stability.irStableExpression(resolve = { irTypeParameterStability(it) })?.let {
+                        val expr =
+                            if (slot == 0) {
+                                it
+                            } else {
+                                val int = context.irBuiltIns.intType
+                                val bitsToShiftLeft = slot * BITS_PER_SLOT
 
-                            irCall(
-                                int.binaryOperator(
-                                    OperatorNameConventions.SHL,
-                                    int
-                                ),
-                                null,
-                                it,
-                                null,
-                                irConst(bitsToShiftLeft)
-                            )
-                        }
+                                irCall(
+                                    int.binaryOperator(OperatorNameConventions.SHL, int),
+                                    null,
+                                    it,
+                                    null,
+                                    irConst(bitsToShiftLeft)
+                                )
+                            }
                         orExprs.add(expr)
                     }
                 }
@@ -3599,13 +3472,12 @@
             orExprs.isEmpty() -> irConst(bitMaskConstant)
             // if the constant is still 0, then we can just use the or expressions. This is safe
             // because the low bit will still be 0 regardless of the result of the or expressions.
-            bitMaskConstant == 0 -> orExprs.reduce { lhs, rhs ->
-                irOr(lhs, rhs)
-            }
+            bitMaskConstant == 0 -> orExprs.reduce { lhs, rhs -> irOr(lhs, rhs) }
             // otherwise, we do (bitMaskConstant or a or b ... or z)
-            else -> orExprs.fold<IrExpression, IrExpression>(irConst(bitMaskConstant)) { lhs, rhs ->
-                irOr(lhs, rhs)
-            }
+            else ->
+                orExprs.fold<IrExpression, IrExpression>(irConst(bitMaskConstant)) { lhs, rhs ->
+                    irOr(lhs, rhs)
+                }
         }
     }
 
@@ -3670,14 +3542,10 @@
     override fun visitReturn(expression: IrReturn): IrExpression {
         if (!isInComposableScope) return super.visitReturn(expression)
         val scope = Scope.ReturnScope(expression)
-        withScope(scope) {
-            expression.transformChildrenVoid()
-        }
+        withScope(scope) { expression.transformChildrenVoid() }
         val endBlock = mutableStatementContainer()
         encounteredReturn(expression.returnTargetSymbol) { endBlock.statements.add(it) }
-        return if (
-            !scope.hasComposableCalls && expression.value.type.isUnitOrNullableUnit()
-        ) {
+        return if (!scope.hasComposableCalls && expression.value.type.isUnitOrNullableUnit()) {
             expression.wrap(listOf(endBlock))
         } else {
             val tempVar = irTemporary(expression.value, nameHint = "return")
@@ -3685,16 +3553,17 @@
                 expression.startOffset,
                 expression.endOffset,
                 expression.type,
-                after = listOf(
-                    endBlock,
-                    IrReturnImpl(
-                        expression.startOffset,
-                        expression.endOffset,
-                        expression.type,
-                        expression.returnTargetSymbol,
-                        irGet(tempVar)
+                after =
+                    listOf(
+                        endBlock,
+                        IrReturnImpl(
+                            expression.startOffset,
+                            expression.endOffset,
+                            expression.type,
+                            expression.returnTargetSymbol,
+                            irGet(tempVar)
+                        )
                     )
-                )
             )
         }
     }
@@ -3742,25 +3611,28 @@
                      * We need to generate groups inside the "body", otherwise the behavior is
                      * undefined, so we find the loopVar and insert groups after it.
                      */
-                    val forLoopVariableIndex = current.statements.indexOfFirst {
-                        (it as? IrVariable)?.origin == IrDeclarationOrigin.FOR_LOOP_VARIABLE
-                    }
-                    loop.body = current.withReplaceGroupStatements(
-                        loopScope,
-                        insertAt = forLoopVariableIndex + 1
-                    )
+                    val forLoopVariableIndex =
+                        current.statements.indexOfFirst {
+                            (it as? IrVariable)?.origin == IrDeclarationOrigin.FOR_LOOP_VARIABLE
+                        }
+                    loop.body =
+                        current.withReplaceGroupStatements(
+                            loopScope,
+                            insertAt = forLoopVariableIndex + 1
+                        )
                 } else {
                     loop.body = current?.asReplaceGroup(loopScope)
                 }
             }
         }
-        return if ((!loopScope.needsGroupPerIteration || (
-                !currentFunctionScope.outerGroupRequired &&
-                // if we end up getting an early return this group will come back
-                // However this might generate less efficient (but still correct code) if the
-                // early return is encountered after the loop.
-                !currentFunctionScope.hasAnyEarlyReturn)
-            ) && loopScope.hasComposableCalls) {
+        return if (
+            (!loopScope.needsGroupPerIteration ||
+                (!currentFunctionScope.outerGroupRequired &&
+                    // if we end up getting an early return this group will come back
+                    // However this might generate less efficient (but still correct code) if the
+                    // early return is encountered after the loop.
+                    !currentFunctionScope.hasAnyEarlyReturn)) && loopScope.hasComposableCalls
+        ) {
             // If a loop contains composable calls but not a otherwise need a group per iteration
             // group, none of the children can be coalesced and must be realized as the second
             // iteration as composable calls at the end might end of overlapping slots with the
@@ -3789,63 +3661,53 @@
         var resultsWithCalls = 0
         var hasElseBranch = false
 
-        val transformed = IrWhenImpl(
-            expression.startOffset,
-            expression.endOffset,
-            expression.type,
-            expression.origin
-        )
+        val transformed =
+            IrWhenImpl(
+                expression.startOffset,
+                expression.endOffset,
+                expression.type,
+                expression.origin
+            )
         val resultScopes = mutableListOf<Scope.BranchScope>()
         val condScopes = mutableListOf<Scope.BranchScope>()
-        val whenScope = withScope(Scope.WhenScope()) {
-            expression.branches.fastForEachIndexed { index, it ->
-                if (it is IrElseBranch) {
-                    hasElseBranch = true
-                    val (resultScope, result) = it.result.transformWithScope(Scope.BranchScope())
+        val whenScope =
+            withScope(Scope.WhenScope()) {
+                expression.branches.fastForEachIndexed { index, it ->
+                    if (it is IrElseBranch) {
+                        hasElseBranch = true
+                        val (resultScope, result) =
+                            it.result.transformWithScope(Scope.BranchScope())
 
-                    condScopes.add(Scope.BranchScope())
-                    resultScopes.add(resultScope)
+                        condScopes.add(Scope.BranchScope())
+                        resultScopes.add(resultScope)
 
-                    if (resultScope.hasComposableCalls)
-                        resultsWithCalls++
+                        if (resultScope.hasComposableCalls) resultsWithCalls++
 
-                    transformed.branches.add(
-                        IrElseBranchImpl(
-                            it.startOffset,
-                            it.endOffset,
-                            it.condition,
-                            result
+                        transformed.branches.add(
+                            IrElseBranchImpl(it.startOffset, it.endOffset, it.condition, result)
                         )
-                    )
-                } else {
-                    val (condScope, condition) = it
-                        .condition
-                        .transformWithScope(Scope.BranchScope())
-                    val (resultScope, result) = it
-                        .result
-                        .transformWithScope(Scope.BranchScope())
+                    } else {
+                        val (condScope, condition) =
+                            it.condition.transformWithScope(Scope.BranchScope())
+                        val (resultScope, result) =
+                            it.result.transformWithScope(Scope.BranchScope())
 
-                    condScopes.add(condScope)
-                    resultScopes.add(resultScope)
+                        condScopes.add(condScope)
+                        resultScopes.add(resultScope)
 
-                    // the first condition is always executed so if it has a composable call in it,
-                    // it doesn't necessitate a group
-                    needsWrappingGroup =
-                        needsWrappingGroup || (index != 0 && condScope.hasComposableCalls)
-                    if (resultScope.hasComposableCalls)
-                        resultsWithCalls++
+                        // the first condition is always executed so if it has a composable call in
+                        // it,
+                        // it doesn't necessitate a group
+                        needsWrappingGroup =
+                            needsWrappingGroup || (index != 0 && condScope.hasComposableCalls)
+                        if (resultScope.hasComposableCalls) resultsWithCalls++
 
-                    transformed.branches.add(
-                        IrBranchImpl(
-                            it.startOffset,
-                            it.endOffset,
-                            condition,
-                            result
+                        transformed.branches.add(
+                            IrBranchImpl(it.startOffset, it.endOffset, condition, result)
                         )
-                    )
+                    }
                 }
             }
-        }
 
         // If we are putting groups around the result branches, we need to guarantee that exactly
         // one result branch is executed. We do this by adding an else branch if it there is not
@@ -3860,20 +3722,22 @@
                 IrElseBranchImpl(
                     expression.endOffset,
                     expression.endOffset,
-                    condition = IrConstImpl(
-                        expression.endOffset,
-                        expression.endOffset,
-                        context.irBuiltIns.booleanType,
-                        IrConstKind.Boolean,
-                        true
-                    ),
-                    result = IrBlockImpl(
-                        expression.endOffset,
-                        expression.endOffset,
-                        context.irBuiltIns.unitType,
-                        null,
-                        emptyList()
-                    )
+                    condition =
+                        IrConstImpl(
+                            expression.endOffset,
+                            expression.endOffset,
+                            context.irBuiltIns.booleanType,
+                            IrConstKind.Boolean,
+                            true
+                        ),
+                    result =
+                        IrBlockImpl(
+                            expression.endOffset,
+                            expression.endOffset,
+                            context.irBuiltIns.unitType,
+                            null,
+                            emptyList()
+                        )
                 )
             )
         }
@@ -3896,9 +3760,9 @@
                 // if no wrapping group but more than one result have calls, we have to have every
                 // result be a group so that we have a consistent number of groups during execution
                 (resultsWithCalls > 1 && !needsWrappingGroup) ||
-                // if we are wrapping the if with a group, then we only need to add a group when
-                // the block has composable calls
-                (needsWrappingGroup && resultScope.hasComposableCalls)
+                    // if we are wrapping the if with a group, then we only need to add a group when
+                    // the block has composable calls
+                    (needsWrappingGroup && resultScope.hasComposableCalls)
             ) {
                 it.result = it.result.asReplaceGroup(resultScope)
             }
@@ -3920,38 +3784,52 @@
         var parent: Scope? = null
         var level: Int = 0
 
-        open val isInComposable get() = false
-        open val functionScope: FunctionScope? get() = parent?.functionScope
-        open val fileScope: FileScope? get() = parent?.fileScope
-        open val nearestComposer: IrValueParameter? get() = parent?.nearestComposer
+        open val isInComposable
+            get() = false
 
-        val myComposer: IrValueParameter get() = nearestComposer
-            ?: error("Not in a composable function")
+        open val functionScope: FunctionScope?
+            get() = parent?.functionScope
+
+        open val fileScope: FileScope?
+            get() = parent?.fileScope
+
+        open val nearestComposer: IrValueParameter?
+            get() = parent?.nearestComposer
+
+        val myComposer: IrValueParameter
+            get() = nearestComposer ?: error("Not in a composable function")
 
         open class SourceLocation(val element: IrElement) {
             open val repeatable: Boolean
                 get() = false
+
             var used = false
                 private set
-            fun markUsed() { used = true }
+
+            fun markUsed() {
+                used = true
+            }
         }
 
         class RootScope : Scope("<root>")
+
         class FunctionScope(
             val function: IrFunction,
             private val transformer: ComposableFunctionBodyTransformer
         ) : BlockScope("fun ${function.name.asString()}") {
             val isInlinedLambda: Boolean
                 get() = transformer.inlineLambdaInfo.isInlineLambda(function)
+
             val isCrossinlineLambda: Boolean
                 get() = transformer.inlineLambdaInfo.isCrossinlineLambda(function)
 
             val inComposableCall: Boolean
-                get() = (parent as? Scope.CallScope)?.expression?.let { call ->
-                    with(transformer) {
-                        call.isComposableCall() || call.isSyntheticComposableCall()
-                    }
-                } == true
+                get() =
+                    (parent as? Scope.CallScope)?.expression?.let { call ->
+                        with(transformer) {
+                            call.isComposableCall() || call.isSyntheticComposableCall()
+                        }
+                    } == true
 
             val metrics: FunctionMetrics = transformer.metricsFor(function)
 
@@ -3963,11 +3841,14 @@
             private fun nextTemporaryIndex(): Int = lastTemporaryIndex++
 
             override val isInComposable: Boolean
-                get() = isComposable ||
-                    transformer.inlineLambdaInfo.preservesComposableScope(function) &&
-                    parent?.isInComposable == true
+                get() =
+                    isComposable ||
+                        transformer.inlineLambdaInfo.preservesComposableScope(function) &&
+                            parent?.isInComposable == true
 
-            override val functionScope: FunctionScope get() = this
+            override val functionScope: FunctionScope
+                get() = this
+
             override val nearestComposer: IrValueParameter?
                 get() = composerParameter ?: super.nearestComposer
 
@@ -3994,43 +3875,42 @@
             val markerPreamble = mutableStatementContainer(transformer.context)
             private var marker: IrVariable? = null
 
-            fun allocateMarker(): IrVariable = marker ?: run {
-                val parent = parent
-                return when {
-                    isInlinedLambda && !isComposable && parent is CallScope -> {
-                        parent.allocateMarker()
+            fun allocateMarker(): IrVariable =
+                marker
+                    ?: run {
+                        val parent = parent
+                        return when {
+                            isInlinedLambda && !isComposable && parent is CallScope -> {
+                                parent.allocateMarker()
+                            }
+                            else -> {
+                                val newMarker =
+                                    transformer.irTemporary(
+                                        transformer.irCurrentMarker(myComposer),
+                                        getNameForTemporary("marker")
+                                    )
+                                markerPreamble.statements.add(newMarker)
+                                marker = newMarker
+                                newMarker
+                            }
+                        }
                     }
-                    else -> {
-                        val newMarker = transformer.irTemporary(
-                            transformer.irCurrentMarker(myComposer),
-                            getNameForTemporary("marker")
-                        )
-                        markerPreamble.statements.add(newMarker)
-                        marker = newMarker
-                        newMarker
-                    }
-                }
-            }
 
-            private fun parameterInformation(): String =
-                function.parameterInformation()
+            private fun parameterInformation(): String = function.parameterInformation()
 
             override fun sourceLocationOf(call: IrElement): SourceLocation {
                 val parent = parent
-                return if (isInlinedLambda && parent is BlockScope)
-                    parent.sourceLocationOf(call)
+                return if (isInlinedLambda && parent is BlockScope) parent.sourceLocationOf(call)
                 else super.sourceLocationOf(call)
             }
 
-            private fun callInformation(): String =
-                function.callInformation()
+            private fun callInformation(): String = function.callInformation()
 
             override fun calculateHasSourceInformation(sourceInformationEnabled: Boolean): Boolean {
                 return if (sourceInformationEnabled) {
                     if (function.isLambda() && !isInlinedLambda)
                         super.calculateHasSourceInformation(sourceInformationEnabled)
-                    else
-                        true
+                    else true
                 } else function.visibility.isPublicAPI
             }
 
@@ -4060,9 +3940,9 @@
                         paramName.startsWith(ComposeNames.CHANGED_PARAMETER.identifier) ->
                             changedParams += param
                         paramName.startsWith("\$context_receiver_") ||
-                        paramName.startsWith("\$name\$for\$destructuring") ||
-                        paramName.startsWith("\$noName_") ||
-                        paramName == "\$this" -> Unit
+                            paramName.startsWith("\$name\$for\$destructuring") ||
+                            paramName.startsWith("\$noName_") ||
+                            paramName == "\$this" -> Unit
                         else -> realValueParamCount++
                     }
                 }
@@ -4074,31 +3954,31 @@
                 } else if (function.origin == IrDeclarationOrigin.LOCAL_FUNCTION_FOR_LAMBDA) {
                     slotCount++
                 }
-                changedParameter = if (composerParameter != null) {
-                    transformer.IrChangedBitMaskValueImpl(
-                        changedParams,
-                        slotCount
-                    )
-                } else {
-                    null
-                }
-                defaultParameter = if (defaultParams.isNotEmpty()) {
-                    transformer.IrDefaultBitMaskValueImpl(
-                        defaultParams,
-                        function.contextReceiverParametersCount + realValueParamCount,
-                    )
-                } else {
-                    null
-                }
+                changedParameter =
+                    if (composerParameter != null) {
+                        transformer.IrChangedBitMaskValueImpl(changedParams, slotCount)
+                    } else {
+                        null
+                    }
+                defaultParameter =
+                    if (defaultParams.isNotEmpty()) {
+                        transformer.IrDefaultBitMaskValueImpl(
+                            defaultParams,
+                            function.contextReceiverParametersCount + realValueParamCount,
+                        )
+                    } else {
+                        null
+                    }
             }
 
             val isComposable = composerParameter != null
 
-            val allTrackedParams = listOfNotNull(function.extensionReceiverParameter) +
-                function.valueParameters.take(
-                    function.contextReceiverParametersCount + realValueParamCount
-                ) +
-                listOfNotNull(function.dispatchReceiverParameter)
+            val allTrackedParams =
+                listOfNotNull(function.extensionReceiverParameter) +
+                    function.valueParameters.take(
+                        function.contextReceiverParametersCount + realValueParamCount
+                    ) +
+                    listOfNotNull(function.dispatchReceiverParameter)
 
             fun defaultIndexForSlotIndex(index: Int): Int {
                 return if (function.extensionReceiverParameter != null) index - 1 else index
@@ -4109,7 +3989,7 @@
             init {
                 if (
                     isComposable &&
-                    (
+                        (
                         // We are interested in any object which has skippable function body and
                         // is being able to capture values from outside scope. Technically, that
                         // means we almost never skip in capture-less objects, but it is still more
@@ -4117,12 +3997,8 @@
                         // cases, we memoize these objects too (e.g fun interface) so the receiver
                         // should === with the previous instances most of time.
                         function.origin == IrDeclarationOrigin.LOCAL_FUNCTION_FOR_LAMBDA ||
-                            function.dispatchReceiverParameter
-                                ?.type
-                                ?.classOrNull
-                                ?.owner
-                                ?.isLocal == true
-                    )
+                            function.dispatchReceiverParameter?.type?.classOrNull?.owner?.isLocal ==
+                                true)
                 ) {
                     // in the case of a composable lambda/anonymous object, we want to make sure
                     // the dispatch receiver is always marked as "used"
@@ -4153,6 +4029,7 @@
                 val metas: List<CallArgumentMeta>,
                 val call: IrCall
             )
+
             private val intrinsicRememberFixups = mutableListOf<IntrinsicRememberFixup>()
 
             fun recordIntrinsicRememberFixUp(
@@ -4178,11 +4055,10 @@
             }
 
             fun applyIntrinsicRememberFixups(
-                invalidExpr: (
-                    isMemoizedLambda: Boolean,
-                    List<IrExpression>,
-                    List<CallArgumentMeta>
-                ) -> IrExpression
+                invalidExpr:
+                    (
+                        isMemoizedLambda: Boolean, List<IrExpression>, List<CallArgumentMeta>
+                    ) -> IrExpression
             ) {
                 intrinsicRememberFixups.fastForEach {
                     val invalid = invalidExpr(it.isMemoizedLambda, it.args, it.metas)
@@ -4196,7 +4072,8 @@
             private val extraEndLocations = mutableListOf<(IrExpression) -> Unit>()
             private val sourceLocations = mutableListOf<SourceLocation>()
 
-            override val isInComposable: Boolean get() = parent?.isInComposable ?: false
+            override val isInComposable: Boolean
+                get() = parent?.isInComposable ?: false
 
             fun realizeGroup(makeEnd: (() -> IrExpression)?) {
                 realizeCoalescableGroup()
@@ -4217,9 +4094,7 @@
 
             fun realizeAllDirectChildren() {
                 if (coalescableChildren.isNotEmpty()) {
-                    coalescableChildren.fastForEach {
-                        it.shouldRealize = true
-                    }
+                    coalescableChildren.fastForEach { it.shouldRealize = true }
                 }
             }
 
@@ -4243,11 +4118,7 @@
                 makeEnd: () -> IrExpression
             ) {
                 addProvisionalSourceLocations(scope.sourceLocations)
-                val groupInfo = CoalescableGroupInfo(
-                    scope,
-                    realizeGroup,
-                    makeEnd
-                )
+                val groupInfo = CoalescableGroupInfo(scope, realizeGroup, makeEnd)
                 coalescableChildren.add(groupInfo)
             }
 
@@ -4256,31 +4127,34 @@
 
             open fun calculateSourceInfo(sourceInformationEnabled: Boolean): String? {
                 return if (sourceInformationEnabled && sourceLocations.isNotEmpty()) {
-                    val locations = sourceLocations
-                        .filter {
-                            !it.used &&
-                                it.element.startOffset != UNDEFINED_OFFSET &&
-                                it.element.endOffset != UNDEFINED_OFFSET
-                        }
-                        .distinct()
+                    val locations =
+                        sourceLocations
+                            .filter {
+                                !it.used &&
+                                    it.element.startOffset != UNDEFINED_OFFSET &&
+                                    it.element.endOffset != UNDEFINED_OFFSET
+                            }
+                            .distinct()
                     var markedRepeatable = false
                     val fileEntry = fileScope?.declaration?.fileEntry
                     if (locations.isEmpty()) null
-                    else locations.joinToString(",") {
-                        it.markUsed()
-                        val lineNumber = fileEntry?.getLineNumber(it.element.startOffset) ?: ""
-                        val offset = if (it.element.startOffset < it.element.endOffset) {
-                            "@${it.element.startOffset}L${
+                    else
+                        locations.joinToString(",") {
+                            it.markUsed()
+                            val lineNumber = fileEntry?.getLineNumber(it.element.startOffset) ?: ""
+                            val offset =
+                                if (it.element.startOffset < it.element.endOffset) {
+                                    "@${it.element.startOffset}L${
                             it.element.endOffset - it.element.startOffset
                             }"
-                        } else "@${it.element.startOffset}"
-                        if (it.repeatable && !markedRepeatable) {
-                            markedRepeatable = true
-                            "*$lineNumber$offset"
-                        } else {
-                            "$lineNumber$offset"
+                                } else "@${it.element.startOffset}"
+                            if (it.repeatable && !markedRepeatable) {
+                                markedRepeatable = true
+                                "*$lineNumber$offset"
+                            } else {
+                                "$lineNumber$offset"
+                            }
                         }
-                    }
                 } else null
             }
 
@@ -4295,26 +4169,26 @@
             }
 
             fun realizeCoalescableGroup() {
-                coalescableChildren.fastForEach {
-                    it.realize()
-                }
+                coalescableChildren.fastForEach { it.realize() }
             }
 
             open fun realizeEndCalls(makeEnd: () -> IrExpression) {
-                extraEndLocations.fastForEach {
-                    it(makeEnd())
-                }
+                extraEndLocations.fastForEach { it(makeEnd()) }
             }
 
             var hasDefaultsGroup = false
             var hasComposableCallsWithGroups = false
                 private set
+
             var hasComposableCalls = false
                 private set
+
             var hasReturn = false
                 private set
+
             var hasJump = false
                 protected set
+
             private val coalescableChildren = mutableListOf<CoalescableGroupInfo>()
 
             class CoalescableGroupInfo(
@@ -4324,6 +4198,7 @@
             ) {
                 var shouldRealize = false
                 private var realized = false
+
                 fun realize() {
                     if (realized) return
                     realized = true
@@ -4338,11 +4213,16 @@
         }
 
         class ClassScope(name: Name) : Scope("class ${name.asString()}")
+
         class PropertyScope(name: Name) : Scope("val ${name.asString()}")
+
         class FieldScope(name: Name) : Scope("field ${name.asString()}")
+
         class FileScope(val declaration: IrFile) : Scope("file ${declaration.name}") {
-            override val fileScope: FileScope get() = this
+            override val fileScope: FileScope
+                get() = this
         }
+
         class LoopScope(val loop: IrLoop) : BlockScope("loop") {
             private val jumpEndLocations = mutableListOf<(IrExpression) -> Unit>()
             var needsGroupPerIteration = false
@@ -4374,15 +4254,16 @@
             override fun realizeEndCalls(makeEnd: () -> IrExpression) {
                 super.realizeEndCalls(makeEnd)
                 if (needsGroupPerIteration) {
-                    jumpEndLocations.fastForEach {
-                        it(makeEnd())
-                    }
+                    jumpEndLocations.fastForEach { it(makeEnd()) }
                     jumpEndLocations.clear()
                 }
             }
         }
+
         class WhenScope : BlockScope("when")
+
         class BranchScope : BlockScope("branch")
+
         class CaptureScope : BlockScope("capture") {
             var hasCapturedComposableCall = false
                 private set
@@ -4397,6 +4278,7 @@
                         get() = true
                 }
         }
+
         class ParametersScope : BlockScope("parameters")
 
         class CallScope(
@@ -4409,20 +4291,21 @@
             var marker: IrVariable? = null
                 private set
 
-            fun allocateMarker(): IrVariable = marker
-                ?: transformer.irTemporary(
-                    transformer.irCurrentMarker(myComposer),
-                    getNameForTemporary("marker")
-                ).also { marker = it }
+            fun allocateMarker(): IrVariable =
+                marker
+                    ?: transformer
+                        .irTemporary(
+                            transformer.irCurrentMarker(myComposer),
+                            getNameForTemporary("marker")
+                        )
+                        .also { marker = it }
 
             private fun getNameForTemporary(nameHint: String?) =
                 functionScope?.getNameForTemporary(nameHint)
                     ?: error("Expected to be in a function")
         }
 
-        class ReturnScope(
-            val expression: IrReturn
-        ) : BlockScope("return") {
+        class ReturnScope(val expression: IrReturn) : BlockScope("return") {
             override fun sourceLocationOf(call: IrElement): SourceLocation =
                 when (val parent = parent) {
                     is BlockScope -> parent.sourceLocationOf(call)
@@ -4456,32 +4339,25 @@
 
         override fun irHasAnyProvidedAndUnstable(unstable: BooleanArray): IrExpression {
             require(count == unstable.size)
-            val expressions = params.mapIndexed { index, param ->
-                val start = index * BITS_PER_INT
-                val end = min(start + BITS_PER_INT, count)
-                val unstableMask = bitMask(*unstable.sliceArray(start until end))
-                irNotEqual(
-                    // $default and unstableMask will be different from unstableMask
-                    // iff any parameters were *provided* AND *unstable*
-                    irAnd(
-                        irGet(param),
+            val expressions =
+                params.mapIndexed { index, param ->
+                    val start = index * BITS_PER_INT
+                    val end = min(start + BITS_PER_INT, count)
+                    val unstableMask = bitMask(*unstable.sliceArray(start until end))
+                    irNotEqual(
+                        // $default and unstableMask will be different from unstableMask
+                        // iff any parameters were *provided* AND *unstable*
+                        irAnd(irGet(param), irConst(unstableMask)),
                         irConst(unstableMask)
-                    ),
-                    irConst(unstableMask)
-                )
-            }
-            return if (expressions.size == 1)
-                expressions.single()
-            else
-                expressions.reduce { lhs, rhs -> irOrOr(lhs, rhs) }
+                    )
+                }
+            return if (expressions.size == 1) expressions.single()
+            else expressions.reduce { lhs, rhs -> irOrOr(lhs, rhs) }
         }
 
         override fun putAsValueArgumentIn(fn: IrFunctionAccessExpression, startIndex: Int) {
             params.fastForEachIndexed { i, param ->
-                fn.putValueArgument(
-                    startIndex + i,
-                    irGet(param)
-                )
+                fn.putValueArgument(startIndex + i, irGet(param))
             }
         }
     }
@@ -4508,10 +4384,7 @@
 
         override fun irLowBit(): IrExpression {
             used = true
-            return irAnd(
-                irGet(params[0]),
-                irConst(0b1)
-            )
+            return irAnd(irGet(params[0]), irConst(0b1))
         }
 
         override fun irIsolateBitsAtSlot(slot: Int, includeStableBit: Boolean): IrExpression {
@@ -4520,10 +4393,7 @@
             return irAnd(
                 irGet(params[paramIndexForSlot(slot)]),
                 irBitsForSlot(
-                    if (includeStableBit)
-                        ParamState.Mask.bits
-                    else
-                        ParamState.Static.bits,
+                    if (includeStableBit) ParamState.Mask.bits else ParamState.Static.bits,
                     slot
                 )
             )
@@ -4532,91 +4402,74 @@
         override fun irStableBitAtSlot(slot: Int): IrExpression {
             used = true
             // %changed and 0b100
-            return irAnd(
-                irGet(params[paramIndexForSlot(slot)]),
-                irBitsForSlot(0b100, slot)
-            )
+            return irAnd(irGet(params[paramIndexForSlot(slot)]), irBitsForSlot(0b100, slot))
         }
 
         override fun irSlotAnd(slot: Int, bits: Int): IrExpression {
             used = true
             // %changed and 0b11
-            return irAnd(
-                irGet(params[paramIndexForSlot(slot)]),
-                irBitsForSlot(bits, slot)
-            )
+            return irAnd(irGet(params[paramIndexForSlot(slot)]), irBitsForSlot(bits, slot))
         }
 
-        override fun irHasDifferences(
-            usedParams: BooleanArray
-        ): IrExpression {
+        override fun irHasDifferences(usedParams: BooleanArray): IrExpression {
             used = true
             require(usedParams.size == count)
             if (count == 0) {
                 // for 0 slots (no params), we can create a shortcut expression of just checking the
                 // low-bit for non-zero. Since all of the higher bits will also be 0, we can just
                 // simplify this to check if dirty is non-zero
-                return irNotEqual(
-                    irGet(params[0]),
-                    irConst(0)
-                )
+                return irNotEqual(irGet(params[0]), irConst(0))
             }
 
-            val expressions = params.mapIndexed { index, param ->
-                val start = index * SLOTS_PER_INT
-                val end = min(start + SLOTS_PER_INT, count)
+            val expressions =
+                params.mapIndexed { index, param ->
+                    val start = index * SLOTS_PER_INT
+                    val end = min(start + SLOTS_PER_INT, count)
 
-                // makes an int with each slot having 0b101 mask and the low bit being 0.
-                // so for 3 slots, we would get 0b 101 101 101 0.
-                // This pattern is useful because we can and + xor it with our $changed bitmask and it
-                // will only be non-zero if any of the slots were DIFFERENT or UNCERTAIN or
-                // UNSTABLE.
-                // we _only_ use this pattern for the slots where the body of the function
-                // actually uses that parameter, otherwise we pass in 0b000 which will transfer
-                // none of the bits to the rhs
-                val lhsMask = if (FeatureFlag.StrongSkipping.enabled) 0b001 else 0b101
-                val lhs = (start until end).fold(0) { mask, slot ->
-                    if (usedParams[slot]) mask or bitsForSlot(lhsMask, slot) else mask
+                    // makes an int with each slot having 0b101 mask and the low bit being 0.
+                    // so for 3 slots, we would get 0b 101 101 101 0.
+                    // This pattern is useful because we can and + xor it with our $changed bitmask
+                    // and it
+                    // will only be non-zero if any of the slots were DIFFERENT or UNCERTAIN or
+                    // UNSTABLE.
+                    // we _only_ use this pattern for the slots where the body of the function
+                    // actually uses that parameter, otherwise we pass in 0b000 which will transfer
+                    // none of the bits to the rhs
+                    val lhsMask = if (FeatureFlag.StrongSkipping.enabled) 0b001 else 0b101
+                    val lhs =
+                        (start until end).fold(0) { mask, slot ->
+                            if (usedParams[slot]) mask or bitsForSlot(lhsMask, slot) else mask
+                        }
+
+                    // we _only_ use this pattern for the slots where the body of the function
+                    // actually uses that parametser, otherwise we pass in 0b000 which will transfer
+                    // none of the bits to the rhs
+                    val rhs =
+                        (start until end).fold(0) { mask, slot ->
+                            if (usedParams[slot]) mask or bitsForSlot(0b001, slot) else mask
+                        }
+
+                    // we use this pattern with the low bit set to 1 in the "and", and the low bit
+                    // set to 0
+                    // for the "xor". This means that if the low bit was set, we will get 1 in the
+                    // resulting
+                    // low bit. Since we use this calculation to determine if we need to run the
+                    // body of the
+                    // function, this is exactly what we want.
+
+                    // if the rhs is 0, that means that none of the parameters ended up getting used
+                    // in the body of the function which means we can simplify the expression quite
+                    // a
+                    // bit. In this case we just care about if the low bit is non-zero
+                    if (rhs == 0) {
+                        irNotEqual(irAnd(irGet(param), irConst(1)), irConst(0))
+                    } else {
+                        // $dirty and (0b 101 ... 101 1) != (0b 001 ... 001 0)
+                        irNotEqual(irAnd(irGet(param), irConst(lhs or 0b1)), irConst(rhs or 0b0))
+                    }
                 }
-
-                // we _only_ use this pattern for the slots where the body of the function
-                // actually uses that parametser, otherwise we pass in 0b000 which will transfer
-                // none of the bits to the rhs
-                val rhs = (start until end).fold(0) { mask, slot ->
-                    if (usedParams[slot]) mask or bitsForSlot(0b001, slot) else mask
-                }
-
-                // we use this pattern with the low bit set to 1 in the "and", and the low bit set to 0
-                // for the "xor". This means that if the low bit was set, we will get 1 in the resulting
-                // low bit. Since we use this calculation to determine if we need to run the body of the
-                // function, this is exactly what we want.
-
-                // if the rhs is 0, that means that none of the parameters ended up getting used
-                // in the body of the function which means we can simplify the expression quite a
-                // bit. In this case we just care about if the low bit is non-zero
-                if (rhs == 0) {
-                    irNotEqual(
-                        irAnd(
-                            irGet(param),
-                            irConst(1)
-                        ),
-                        irConst(0)
-                    )
-                } else {
-                    // $dirty and (0b 101 ... 101 1) != (0b 001 ... 001 0)
-                    irNotEqual(
-                        irAnd(
-                            irGet(param),
-                            irConst(lhs or 0b1)
-                        ),
-                        irConst(rhs or 0b0)
-                    )
-                }
-            }
-            return if (expressions.size == 1)
-                expressions.single()
-            else
-                expressions.reduce { lhs, rhs -> irOrOr(lhs, rhs) }
+            return if (expressions.size == 1) expressions.single()
+            else expressions.reduce { lhs, rhs -> irOrOr(lhs, rhs) }
         }
 
         override fun irCopyToTemporary(
@@ -4625,26 +4478,31 @@
             exactName: Boolean
         ): IrChangedBitMaskVariable {
             used = true
-            val temps = params.mapIndexed { index, param ->
-                IrVariableImpl(
-                    UNDEFINED_OFFSET,
-                    UNDEFINED_OFFSET,
-                    // We label "dirty" as a defined variable instead of a temporary, so that it
-                    // is properly stored in the locals table and discoverable by debuggers. The
-                    // dirty variable encodes information that could be useful for tooling to
-                    // interpret.
-                    IrDeclarationOrigin.DEFINED,
-                    IrVariableSymbolImpl(),
-                    Name.identifier(if (index == 0) "\$dirty" else "\$dirty$index"),
-                    param.type,
-                    isVar,
-                    isConst = false,
-                    isLateinit = false
-                ).apply {
-                    parent = currentFunctionScope.function.parent
-                    initializer = irGet(param)
+            val temps =
+                params.mapIndexed { index, param ->
+                    IrVariableImpl(
+                            UNDEFINED_OFFSET,
+                            UNDEFINED_OFFSET,
+                            // We label "dirty" as a defined variable instead of a temporary, so
+                            // that it
+                            // is properly stored in the locals table and discoverable by debuggers.
+                            // The
+                            // dirty variable encodes information that could be useful for tooling
+                            // to
+                            // interpret.
+                            IrDeclarationOrigin.DEFINED,
+                            IrVariableSymbolImpl(),
+                            Name.identifier(if (index == 0) "\$dirty" else "\$dirty$index"),
+                            param.type,
+                            isVar,
+                            isConst = false,
+                            isLateinit = false
+                        )
+                        .apply {
+                            parent = currentFunctionScope.function.parent
+                            initializer = irGet(param)
+                        }
                 }
-            }
             return IrChangedBitMaskVariableImpl(temps, count)
         }
 
@@ -4668,9 +4526,7 @@
 
         private fun irUpdateChangedFlags(expression: IrExpression): IrExpression {
             return updateChangedFlagsFunction?.let {
-                irCall(it).also {
-                    it.putValueArgument(0, expression)
-                }
+                irCall(it).also { it.putValueArgument(0, expression) }
             } ?: expression
         }
 
@@ -4683,14 +4539,8 @@
 
             if (bitsToShiftLeft == 0) return value
             val int = context.irBuiltIns.intType
-            val shiftLeft = int.binaryOperator(
-                OperatorNameConventions.SHL,
-                int
-            )
-            val shiftRight = int.binaryOperator(
-                OperatorNameConventions.SHR,
-                int
-            )
+            val shiftLeft = int.binaryOperator(OperatorNameConventions.SHL, int)
+            val shiftRight = int.binaryOperator(OperatorNameConventions.SHR, int)
 
             return irCall(
                 if (bitsToShiftLeft > 0) shiftLeft else shiftRight,
@@ -4702,10 +4552,8 @@
         }
     }
 
-    inner class IrChangedBitMaskVariableImpl(
-        private val temps: List<IrVariable>,
-        count: Int
-    ) : IrChangedBitMaskVariable, IrChangedBitMaskValueImpl(temps, count) {
+    inner class IrChangedBitMaskVariableImpl(private val temps: List<IrVariable>, count: Int) :
+        IrChangedBitMaskVariable, IrChangedBitMaskValueImpl(temps, count) {
         override fun asStatements(): List<IrStatement> {
             return temps
         }
@@ -4713,25 +4561,13 @@
         override fun irOrSetBitsAtSlot(slot: Int, value: IrExpression): IrExpression {
             used = true
             val temp = temps[paramIndexForSlot(slot)]
-            return irSet(
-                temp,
-                irOr(
-                    irGet(temp),
-                    value
-                )
-            )
+            return irSet(temp, irOr(irGet(temp), value))
         }
 
         override fun irSetSlotUncertain(slot: Int): IrExpression {
             used = true
             val temp = temps[paramIndexForSlot(slot)]
-            return irSet(
-                temp,
-                irAnd(
-                    irGet(temp),
-                    irConst(ParamState.Mask.bitsForSlot(slot).inv())
-                )
-            )
+            return irSet(temp, irAnd(irGet(temp), irConst(ParamState.Mask.bitsForSlot(slot).inv())))
         }
     }
 }
@@ -4776,11 +4612,15 @@
     if (hasQuestionMark != null && this.isMarkedNullable() == hasQuestionMark) return false
     return classifier.isClassWithFqName(fqName)
 }
+
 private fun IrType.isNotNullClassType(fqName: FqNameUnsafe) =
     isClassType(fqName, hasQuestionMark = false)
+
 private fun IrType.isNullableClassType(fqName: FqNameUnsafe) =
     isClassType(fqName, hasQuestionMark = true)
+
 fun IrType.isNullableUnit() = isNullableClassType(StandardNames.FqNames.unit)
+
 fun IrType.isUnitOrNullableUnit() = this.isUnit() || this.isNullableUnit()
 
 internal object UNINITIALIZED_VALUE
@@ -4788,18 +4628,12 @@
 private fun mutableStatementContainer(context: IrPluginContext): IrContainerExpression {
     // NOTE(lmr): It's important to use IrComposite here so that we don't introduce any new
     // scopes
-    return IrCompositeImpl(
-        UNDEFINED_OFFSET,
-        UNDEFINED_OFFSET,
-        context.irBuiltIns.unitType
-    )
+    return IrCompositeImpl(UNDEFINED_OFFSET, UNDEFINED_OFFSET, context.irBuiltIns.unitType)
 }
 
 private fun IrFunction.callInformation(): String {
     val inlineMarker = if (isInline) "C" else ""
-    return if (!name.isSpecial)
-        "${inlineMarker}C(${name.asString()})"
-    else "${inlineMarker}C"
+    return if (!name.isSpecial) "${inlineMarker}C(${name.asString()})" else "${inlineMarker}C"
 }
 
 // Parameter information is an index from the sorted order of the parameters to the
@@ -4835,17 +4669,15 @@
 // parameters are in sorted order.
 private fun IrFunction.parameterInformation(): String {
     val builder = StringBuilder("P(")
-    val parameters = valueParameters.filter {
-        !it.name.asString().startsWith("$")
-    }
-    val sortIndex = mapOf(
-        *parameters.mapIndexed { index, parameter ->
-            Pair(index, parameter)
-        }.sortedBy { it.second.name.asString() }
-            .mapIndexed { sortIndex, originalIndex ->
-                Pair(originalIndex.first, sortIndex)
-            }.toTypedArray()
-    )
+    val parameters = valueParameters.filter { !it.name.asString().startsWith("$") }
+    val sortIndex =
+        mapOf(
+            *parameters
+                .mapIndexed { index, parameter -> Pair(index, parameter) }
+                .sortedBy { it.second.name.asString() }
+                .mapIndexed { sortIndex, originalIndex -> Pair(originalIndex.first, sortIndex) }
+                .toTypedArray()
+        )
 
     val expectedIndexes = Array(parameters.size) { it }.toMutableList()
     var run = 0
@@ -4862,25 +4694,22 @@
     }
 
     parameters.fastForEachIndexed { originalIndex, parameter ->
-        if (expectedIndexes.first() == sortIndex[originalIndex] &&
-            !parameter.type.isInlineClassType()
+        if (
+            expectedIndexes.first() == sortIndex[originalIndex] &&
+                !parameter.type.isInlineClassType()
         ) {
             run++
             expectedIndexes.removeAt(0)
         } else {
             emitRun(originalIndex)
             if (originalIndex > 0) builder.append(',')
-            val index = sortIndex[originalIndex]
-                ?: error("missing index $originalIndex")
+            val index = sortIndex[originalIndex] ?: error("missing index $originalIndex")
             builder.append(index)
             expectedIndexes.remove(index)
             if (parameter.type.isInlineClassType()) {
                 parameter.type.getClass()?.fqNameWhenAvailable?.let {
                     builder.append(':')
-                    builder.append(
-                        it.asString()
-                            .replacePrefix("androidx.compose.", "c#")
-                    )
+                    builder.append(it.asString().replacePrefix("androidx.compose.", "c#"))
                 }
             }
             parameterEmitted = true
@@ -4903,13 +4732,10 @@
 }
 
 private fun IrFunction.packageHash(): Int =
-    packageName()?.fold(0) { hash, current ->
-        hash * 31 + current.code
-    }?.absoluteValue ?: 0
+    packageName()?.fold(0) { hash, current -> hash * 31 + current.code }?.absoluteValue ?: 0
 
 private fun IrFunction.sourceFileInformation(): String {
     val hash = packageHash()
-    if (hash != 0)
-        return "${file.name}#${hash.toString(36)}"
+    if (hash != 0) return "${file.name}#${hash.toString(36)}"
     return file.name
 }
diff --git a/compose/compiler/compiler-hosted/src/main/java/androidx/compose/compiler/plugins/kotlin/lower/ComposableLambdaAnnotator.kt b/compose/compiler/compiler-hosted/src/main/java/androidx/compose/compiler/plugins/kotlin/lower/ComposableLambdaAnnotator.kt
index f05b363..6878854 100644
--- a/compose/compiler/compiler-hosted/src/main/java/androidx/compose/compiler/plugins/kotlin/lower/ComposableLambdaAnnotator.kt
+++ b/compose/compiler/compiler-hosted/src/main/java/androidx/compose/compiler/plugins/kotlin/lower/ComposableLambdaAnnotator.kt
@@ -30,9 +30,9 @@
 import org.jetbrains.kotlin.ir.visitors.acceptChildrenVoid
 
 /**
- * In K1, the frontend used to annotate inferred composable lambdas with `@Composable`.
- * The K2 frontend instead uses a different type for composable lambdas. This pass adds
- * the annotation, since the backend expects it.
+ * In K1, the frontend used to annotate inferred composable lambdas with `@Composable`. The K2
+ * frontend instead uses a different type for composable lambdas. This pass adds the annotation,
+ * since the backend expects it.
  */
 class ComposableLambdaAnnotator(context: IrPluginContext) : IrElementVisitorVoid {
     override fun visitElement(element: IrElement) {
@@ -57,10 +57,12 @@
 
     private fun IrFunction.mark() {
         if (!hasComposableAnnotation()) {
-            annotations = annotations + IrConstructorCallImpl.fromSymbolOwner(
-                composableSymbol.owner.defaultType,
-                composableSymbol.constructors.single(),
-            )
+            annotations =
+                annotations +
+                    IrConstructorCallImpl.fromSymbolOwner(
+                        composableSymbol.owner.defaultType,
+                        composableSymbol.constructors.single(),
+                    )
         }
     }
 }
diff --git a/compose/compiler/compiler-hosted/src/main/java/androidx/compose/compiler/plugins/kotlin/lower/ComposableSymbolRemapper.kt b/compose/compiler/compiler-hosted/src/main/java/androidx/compose/compiler/plugins/kotlin/lower/ComposableSymbolRemapper.kt
index 2675833..ae2f06f 100644
--- a/compose/compiler/compiler-hosted/src/main/java/androidx/compose/compiler/plugins/kotlin/lower/ComposableSymbolRemapper.kt
+++ b/compose/compiler/compiler-hosted/src/main/java/androidx/compose/compiler/plugins/kotlin/lower/ComposableSymbolRemapper.kt
@@ -28,68 +28,67 @@
 import org.jetbrains.kotlin.types.StarProjectionImpl
 
 /**
- * This symbol remapper is aware of possible descriptor signature change to align
- * function signature and descriptor signature in cases of composable value parameters.
- * It removes descriptors whenever the signature changes, forcing it to be generated from IR.
+ * This symbol remapper is aware of possible descriptor signature change to align function signature
+ * and descriptor signature in cases of composable value parameters. It removes descriptors whenever
+ * the signature changes, forcing it to be generated from IR.
  *
  * E.g. when function has a signature of:
  * ```
  * fun A(@Composable f: () -> Unit)
  * ```
+ *
  * it is going to be converted to incompatible signature of:
  * ```
  * fun A(f: (Composer<*>, Int) -> Unit)
  * ```
+ *
  * Same applies for receiver and return types.
  *
  * This conversion is only required with decoys, but can be applied to the JVM as well for
  * consistency.
  *
- * This is K1 specific. In K2, descriptors are only there for backwards compatibility and
- * always reflect the IR.
+ * This is K1 specific. In K2, descriptors are only there for backwards compatibility and always
+ * reflect the IR.
  */
-class ComposableSymbolRemapper : DeepCopySymbolRemapper(
-    object : DescriptorsRemapper {
-        override fun remapDeclaredConstructor(
-            descriptor: ClassConstructorDescriptor
-        ): ClassConstructorDescriptor? =
-            descriptor.takeUnless { it.isTransformed() }
+class ComposableSymbolRemapper :
+    DeepCopySymbolRemapper(
+        object : DescriptorsRemapper {
+            override fun remapDeclaredConstructor(
+                descriptor: ClassConstructorDescriptor
+            ): ClassConstructorDescriptor? = descriptor.takeUnless { it.isTransformed() }
 
-        override fun remapDeclaredSimpleFunction(
-            descriptor: FunctionDescriptor
-        ): FunctionDescriptor? =
-            descriptor.takeUnless { it.isTransformed() }
+            override fun remapDeclaredSimpleFunction(
+                descriptor: FunctionDescriptor
+            ): FunctionDescriptor? = descriptor.takeUnless { it.isTransformed() }
 
-        override fun remapDeclaredValueParameter(
-            descriptor: ParameterDescriptor
-        ): ParameterDescriptor? =
-            descriptor.takeUnless { it.isTransformed() }
+            override fun remapDeclaredValueParameter(
+                descriptor: ParameterDescriptor
+            ): ParameterDescriptor? = descriptor.takeUnless { it.isTransformed() }
 
-        override fun remapDeclaredTypeParameter(
-            descriptor: TypeParameterDescriptor
-        ): TypeParameterDescriptor? =
-            descriptor.takeUnless { it.isTransformed() }
+            override fun remapDeclaredTypeParameter(
+                descriptor: TypeParameterDescriptor
+            ): TypeParameterDescriptor? = descriptor.takeUnless { it.isTransformed() }
 
-        private fun ClassConstructorDescriptor.isTransformed(): Boolean =
-            this is IrBasedDeclarationDescriptor<*> ||
-                valueParameters.any { it.type.containsComposable() }
+            private fun ClassConstructorDescriptor.isTransformed(): Boolean =
+                this is IrBasedDeclarationDescriptor<*> ||
+                    valueParameters.any { it.type.containsComposable() }
 
-        private fun FunctionDescriptor.isTransformed(): Boolean =
-            this is IrBasedDeclarationDescriptor<*> ||
-                valueParameters.any { it.type.containsComposable() } ||
-                returnType?.containsComposable() == true
+            private fun FunctionDescriptor.isTransformed(): Boolean =
+                this is IrBasedDeclarationDescriptor<*> ||
+                    valueParameters.any { it.type.containsComposable() } ||
+                    returnType?.containsComposable() == true
 
-        private fun ParameterDescriptor.isTransformed(): Boolean =
-            this is IrBasedDeclarationDescriptor<*> ||
-                type.containsComposable() ||
-                containingDeclaration.let { it is FunctionDescriptor && it.isTransformed() }
+            private fun ParameterDescriptor.isTransformed(): Boolean =
+                this is IrBasedDeclarationDescriptor<*> ||
+                    type.containsComposable() ||
+                    containingDeclaration.let { it is FunctionDescriptor && it.isTransformed() }
 
-        private fun TypeParameterDescriptor.isTransformed(): Boolean =
-            this is IrBasedDeclarationDescriptor<*> ||
-                containingDeclaration.let { it is FunctionDescriptor && it.isTransformed() }
+            private fun TypeParameterDescriptor.isTransformed(): Boolean =
+                this is IrBasedDeclarationDescriptor<*> ||
+                    containingDeclaration.let { it is FunctionDescriptor && it.isTransformed() }
 
-        private fun KotlinType.containsComposable(): Boolean =
-            hasComposableAnnotation() ||
-                arguments.any { it !is StarProjectionImpl && it.type.containsComposable() }
-    }
-)
+            private fun KotlinType.containsComposable(): Boolean =
+                hasComposableAnnotation() ||
+                    arguments.any { it !is StarProjectionImpl && it.type.containsComposable() }
+        }
+    )
diff --git a/compose/compiler/compiler-hosted/src/main/java/androidx/compose/compiler/plugins/kotlin/lower/ComposableTargetAnnotationsTransformer.kt b/compose/compiler/compiler-hosted/src/main/java/androidx/compose/compiler/plugins/kotlin/lower/ComposableTargetAnnotationsTransformer.kt
index 3acf39b..ed9b262 100644
--- a/compose/compiler/compiler-hosted/src/main/java/androidx/compose/compiler/plugins/kotlin/lower/ComposableTargetAnnotationsTransformer.kt
+++ b/compose/compiler/compiler-hosted/src/main/java/androidx/compose/compiler/plugins/kotlin/lower/ComposableTargetAnnotationsTransformer.kt
@@ -105,42 +105,41 @@
     metrics: ModuleMetrics,
     stabilityInferencer: StabilityInferencer,
     featureFlags: FeatureFlags,
-) : AbstractComposeLowering(
-    context,
-    symbolRemapper,
-    metrics,
-    stabilityInferencer,
-    featureFlags,
-) {
-    private val ComposableTargetClass = symbolRemapper.getReferencedClassOrNull(
-        getTopLevelClassOrNull(ComposeClassIds.ComposableTarget)
-    )
-    private val ComposableOpenTargetClass = symbolRemapper.getReferencedClassOrNull(
-        getTopLevelClassOrNull(ComposeClassIds.ComposableOpenTarget)
-    )
-    private val ComposableInferredTargetClass = symbolRemapper.getReferencedClassOrNull(
-        getTopLevelClassOrNull(ComposeClassIds.ComposableInferredTarget)
-    )
+) :
+    AbstractComposeLowering(
+        context,
+        symbolRemapper,
+        metrics,
+        stabilityInferencer,
+        featureFlags,
+    ) {
+    private val ComposableTargetClass =
+        symbolRemapper.getReferencedClassOrNull(
+            getTopLevelClassOrNull(ComposeClassIds.ComposableTarget)
+        )
+    private val ComposableOpenTargetClass =
+        symbolRemapper.getReferencedClassOrNull(
+            getTopLevelClassOrNull(ComposeClassIds.ComposableOpenTarget)
+        )
+    private val ComposableInferredTargetClass =
+        symbolRemapper.getReferencedClassOrNull(
+            getTopLevelClassOrNull(ComposeClassIds.ComposableInferredTarget)
+        )
 
-    /**
-     * A map of element to the owning function of the element.
-     */
+    /** A map of element to the owning function of the element. */
     private val ownerMap = mutableMapOf<IrElement, IrFunction>()
 
-    /**
-     * Map of a parameter symbol to its function and parameter index.
-     */
+    /** Map of a parameter symbol to its function and parameter index. */
     private val parameterOwners = mutableMapOf<IrSymbol, Pair<IrFunction, Int>>()
 
-    /**
-     * A map of variables to their corresponding inference node.
-     */
+    /** A map of variables to their corresponding inference node. */
     private val variableDeclarations = mutableMapOf<IrSymbol, InferenceVariable>()
 
     private var currentOwner: IrFunction? = null
     private var currentFile: IrFile? = null
 
-    private val transformer get() = this
+    private val transformer
+        get() = this
 
     private fun lineInfoOf(element: IrElement?): String {
         val file = currentFile
@@ -154,77 +153,88 @@
         return ""
     }
 
-    private val infer = ApplierInferencer(
-        typeAdapter = object : TypeAdapter<InferenceFunction> {
-            val current = mutableMapOf<InferenceFunction, Scheme>()
-            override fun declaredSchemaOf(type: InferenceFunction): Scheme =
-                type.toDeclaredScheme().also {
-                    type.recordScheme(it)
+    private val infer =
+        ApplierInferencer(
+            typeAdapter =
+                object : TypeAdapter<InferenceFunction> {
+                    val current = mutableMapOf<InferenceFunction, Scheme>()
+
+                    override fun declaredSchemaOf(type: InferenceFunction): Scheme =
+                        type.toDeclaredScheme().also { type.recordScheme(it) }
+
+                    override fun currentInferredSchemeOf(type: InferenceFunction): Scheme? =
+                        if (type.schemeIsUpdatable) current[type] ?: declaredSchemaOf(type)
+                        else null
+
+                    override fun updatedInferredScheme(type: InferenceFunction, scheme: Scheme) {
+                        type.recordScheme(scheme)
+                        type.updateScheme(scheme)
+                        current[type] = scheme
+                    }
+                },
+            nodeAdapter =
+                object : NodeAdapter<InferenceFunction, InferenceNode> {
+                    override fun containerOf(node: InferenceNode): InferenceNode =
+                        ownerMap[node.element]?.let { inferenceNodeOf(it, transformer) }
+                            ?: (node as? InferenceResolvedParameter)?.referenceContainer
+                            ?: node
+
+                    override fun kindOf(node: InferenceNode): NodeKind = node.kind
+
+                    override fun schemeParameterIndexOf(
+                        node: InferenceNode,
+                        container: InferenceNode
+                    ): Int = node.parameterIndex(container)
+
+                    override fun typeOf(node: InferenceNode): InferenceFunction? = node.function
+
+                    override fun referencedContainerOf(node: InferenceNode): InferenceNode? =
+                        node.referenceContainer
+                },
+            lazySchemeStorage =
+                object : LazySchemeStorage<InferenceNode> {
+                    // The transformer is transitory so we can just store this in a map.
+                    val map = mutableMapOf<InferenceNode, LazyScheme>()
+
+                    override fun getLazyScheme(node: InferenceNode): LazyScheme? = map[node]
+
+                    override fun storeLazyScheme(node: InferenceNode, value: LazyScheme) {
+                        map[node] = value
+                    }
+                },
+            errorReporter =
+                object : ErrorReporter<InferenceNode> {
+                    override fun reportCallError(
+                        node: InferenceNode,
+                        expected: String,
+                        received: String
+                    ) {
+                        // Ignored, should be reported by the front-end
+                    }
+
+                    override fun reportParameterError(
+                        node: InferenceNode,
+                        index: Int,
+                        expected: String,
+                        received: String
+                    ) {
+                        // Ignored, should be reported by the front-end
+                    }
+
+                    override fun log(node: InferenceNode?, message: String) {
+                        val element = node?.element
+                        if (!metrics.isEmpty)
+                            metrics.log("applier inference${lineInfoOf(element)}: $message")
+                    }
                 }
-
-            override fun currentInferredSchemeOf(type: InferenceFunction): Scheme? =
-                if (type.schemeIsUpdatable) current[type] ?: declaredSchemaOf(type) else null
-
-            override fun updatedInferredScheme(type: InferenceFunction, scheme: Scheme) {
-                type.recordScheme(scheme)
-                type.updateScheme(scheme)
-                current[type] = scheme
-            }
-        },
-        nodeAdapter = object : NodeAdapter<InferenceFunction, InferenceNode> {
-            override fun containerOf(node: InferenceNode): InferenceNode =
-                ownerMap[node.element]?.let {
-                    inferenceNodeOf(it, transformer)
-                } ?: (node as? InferenceResolvedParameter)?.referenceContainer ?: node
-
-            override fun kindOf(node: InferenceNode): NodeKind = node.kind
-
-            override fun schemeParameterIndexOf(
-                node: InferenceNode,
-                container: InferenceNode
-            ): Int = node.parameterIndex(container)
-
-            override fun typeOf(node: InferenceNode): InferenceFunction? = node.function
-
-            override fun referencedContainerOf(node: InferenceNode): InferenceNode? =
-                node.referenceContainer
-        },
-        lazySchemeStorage = object : LazySchemeStorage<InferenceNode> {
-            // The transformer is transitory so we can just store this in a map.
-            val map = mutableMapOf<InferenceNode, LazyScheme>()
-            override fun getLazyScheme(node: InferenceNode): LazyScheme? = map[node]
-            override fun storeLazyScheme(node: InferenceNode, value: LazyScheme) {
-                map[node] = value
-            }
-        },
-        errorReporter = object : ErrorReporter<InferenceNode> {
-            override fun reportCallError(node: InferenceNode, expected: String, received: String) {
-                // Ignored, should be reported by the front-end
-            }
-
-            override fun reportParameterError(
-                node: InferenceNode,
-                index: Int,
-                expected: String,
-                received: String
-            ) {
-                // Ignored, should be reported by the front-end
-            }
-
-            override fun log(node: InferenceNode?, message: String) {
-                val element = node?.element
-                if (!metrics.isEmpty)
-                    metrics.log("applier inference${lineInfoOf(element)}: $message")
-            }
-        }
-    )
+        )
 
     override fun lower(module: IrModuleFragment) {
         // Only transform if the attributes being inferred are in the runtime
         if (
             ComposableTargetClass != null &&
-            ComposableInferredTargetClass != null &&
-            ComposableOpenTargetClass != null
+                ComposableInferredTargetClass != null &&
+                ComposableOpenTargetClass != null
         ) {
             module.transformChildrenVoid(this)
         }
@@ -240,9 +250,9 @@
     override fun visitFunction(declaration: IrFunction): IrStatement {
         if (
             declaration.hasSchemeSpecified() ||
-            (!declaration.isComposable && !declaration.hasComposableParameter()) ||
-            declaration.hasOverlyWideParameters() ||
-            declaration.hasOpenTypeParameters()
+                (!declaration.isComposable && !declaration.hasComposableParameter()) ||
+                declaration.hasOverlyWideParameters() ||
+                declaration.hasOpenTypeParameters()
         ) {
             return super.visitFunction(declaration)
         }
@@ -268,8 +278,9 @@
 
             val initializerNode = declaration.initializer
             if (initializerNode != null) {
-                val initializer = resolveExpressionOrNull(initializerNode)
-                    ?: InferenceElementExpression(transformer, initializerNode)
+                val initializer =
+                    resolveExpressionOrNull(initializerNode)
+                        ?: InferenceElementExpression(transformer, initializerNode)
                 val variable = InferenceVariable(this, declaration)
                 variableDeclarations[declaration.symbol] = variable
                 infer.visitVariable(variable, initializer)
@@ -296,66 +307,67 @@
     override fun visitCall(expression: IrCall): IrExpression {
         val owner = currentOwner
         if (
-            owner == null || (
-                    !expression.isComposableCall() &&
-                    !expression.hasComposableArguments()
-                ) || when (expression.symbol.owner.fqNameWhenAvailable) {
+            owner == null ||
+                (!expression.isComposableCall() && !expression.hasComposableArguments()) ||
+                when (expression.symbol.owner.fqNameWhenAvailable) {
                     ComposeFqNames.getCurrentComposerFullName,
                     ComposeFqNames.composableLambdaFullName -> true
                     else -> false
                 }
-
         ) {
             return super.visitCall(expression)
         }
         ownerMap[expression] = owner
         val result = super.visitCall(expression)
 
-        val target = (
-            if (
-                expression.isInvoke() ||
-                expression.dispatchReceiver?.type?.isSamComposable == true
+        val target =
+            (if (
+                expression.isInvoke() || expression.dispatchReceiver?.type?.isSamComposable == true
             ) {
-                expression.dispatchReceiver?.let {
-                    resolveExpressionOrNull(it)
-                }
-            } else resolveExpressionOrNull(expression)
-            ) ?: InferenceCallTargetNode(this, expression)
+                expression.dispatchReceiver?.let { resolveExpressionOrNull(it) }
+            } else resolveExpressionOrNull(expression)) ?: InferenceCallTargetNode(this, expression)
         if (target.isOverlyWide()) return result
 
-        val arguments = expression.arguments.filterIndexed { index, argument ->
-            argument?.let {
-                it.isComposableLambda || it.isComposableParameter || (
-                    if (
-                    // There are three cases where the expression type is not good enough here,
-                    // one, the type is a default parameter and there is no actual expression
-                    // and, two, when the expression is a SAM conversion where the type is
-                    // too specific (it is the class) and we need the SAM interface, and three
-                    // the value is null for a nullable type.
-                    (
-                        argument is IrContainerExpression &&
-                            argument.origin == IrStatementOrigin.DEFAULT_VALUE
-                        ) || (
-                            argument is IrBlock
-                        ) || (
-                            argument.isNullConst()
-                        )
-                ) {
-                    // If the parameter is a default value, grab the type from the function
-                    // being called.
-                    expression.symbol.owner.valueParameters.let { parameters ->
-                        if (index < parameters.size) parameters[index].type else null
-                    }
-                } else it.type)?.isOrHasComposableLambda == true
-            } == true
-        }.filterNotNull().toMutableList()
+        val arguments =
+            expression.arguments
+                .filterIndexed { index, argument ->
+                    argument?.let {
+                        it.isComposableLambda ||
+                            it.isComposableParameter ||
+                            (if (
+                                    // There are three cases where the expression type is not good
+                                    // enough here,
+                                    // one, the type is a default parameter and there is no actual
+                                    // expression
+                                    // and, two, when the expression is a SAM conversion where the
+                                    // type is
+                                    // too specific (it is the class) and we need the SAM interface,
+                                    // and three
+                                    // the value is null for a nullable type.
+                                    (argument is IrContainerExpression &&
+                                        argument.origin == IrStatementOrigin.DEFAULT_VALUE) ||
+                                        (argument is IrBlock) ||
+                                        (argument.isNullConst())
+                                ) {
+                                    // If the parameter is a default value, grab the type from the
+                                    // function
+                                    // being called.
+                                    expression.symbol.owner.valueParameters.let { parameters ->
+                                        if (index < parameters.size) parameters[index].type
+                                        else null
+                                    }
+                                } else it.type)
+                                ?.isOrHasComposableLambda == true
+                    } == true
+                }
+                .filterNotNull()
+                .toMutableList()
         fun recordArgument(argument: IrExpression?) {
             if (
-                argument != null && (
-                    argument.isComposableLambda ||
-                    argument.isComposableParameter ||
-                    argument.type.isOrHasComposableLambda
-                )
+                argument != null &&
+                    (argument.isComposableLambda ||
+                        argument.isComposableParameter ||
+                        argument.type.isOrHasComposableLambda)
             ) {
                 arguments.add(argument)
             }
@@ -366,9 +378,8 @@
         infer.visitCall(
             call = inferenceNodeOf(expression, transformer),
             target = target,
-            arguments = arguments.map {
-                resolveExpressionOrNull(it) ?: inferenceNodeOf(it, transformer)
-            }
+            arguments =
+                arguments.map { resolveExpressionOrNull(it) ?: inferenceNodeOf(it, transformer) }
         )
 
         return result
@@ -384,9 +395,7 @@
             )
         }
 
-    /**
-     * Resolve references to local variables and parameters.
-     */
+    /** Resolve references to local variables and parameters. */
     private fun resolveExpressionOrNull(expression: IrElement?): InferenceNode? =
         when (expression) {
             is IrGetValue ->
@@ -400,28 +409,36 @@
             else -> null
         }
 
-    val List<IrConstructorCall>.target: Item get() =
-        firstOrNull { it.isComposableTarget }?.let { constructor ->
-            constructor.firstParameterOrNull<String>()?.let { Token(it) }
-        } ?: firstOrNull { it.isComposableOpenTarget }?.let { constructor ->
-            constructor.firstParameterOrNull<Int>()?.let { Open(it) }
-        } ?: firstOrNull { it.isComposableTargetMarked }?.let { constructor ->
-            val fqName = constructor.symbol.owner.parentAsClass.fqNameWhenAvailable
-            fqName?.let {
-                Token(it.asString())
-            }
-        } ?: Open(-1, isUnspecified = true)
+    val List<IrConstructorCall>.target: Item
+        get() =
+            firstOrNull { it.isComposableTarget }
+                ?.let { constructor ->
+                    constructor.firstParameterOrNull<String>()?.let { Token(it) }
+                }
+                ?: firstOrNull { it.isComposableOpenTarget }
+                    ?.let { constructor ->
+                        constructor.firstParameterOrNull<Int>()?.let { Open(it) }
+                    }
+                ?: firstOrNull { it.isComposableTargetMarked }
+                    ?.let { constructor ->
+                        val fqName = constructor.symbol.owner.parentAsClass.fqNameWhenAvailable
+                        fqName?.let { Token(it.asString()) }
+                    }
+                ?: Open(-1, isUnspecified = true)
 
-    val IrFunction.scheme: Scheme? get() =
-        annotations.firstOrNull { it.isComposableInferredTarget }?.let { constructor ->
-            constructor.firstParameterOrNull<String>()?.let {
-                deserializeScheme(it)
-            }
-        }
+    val IrFunction.scheme: Scheme?
+        get() =
+            annotations
+                .firstOrNull { it.isComposableInferredTarget }
+                ?.let { constructor ->
+                    constructor.firstParameterOrNull<String>()?.let { deserializeScheme(it) }
+                }
 
     fun IrFunction.hasSchemeSpecified(): Boolean =
         annotations.any {
-            it.isComposableTarget || it.isComposableOpenTarget || it.isComposableInferredTarget ||
+            it.isComposableTarget ||
+                it.isComposableOpenTarget ||
+                it.isComposableInferredTarget ||
                 it.isComposableTargetMarked
         }
 
@@ -430,37 +447,38 @@
             this is IrSimpleType && isFunction() -> arguments
             else -> emptyList()
         }.let { typeArguments ->
-            val target = annotations.target.let {
-                if (it.isUnspecified) defaultTarget else it
-            }
+            val target = annotations.target.let { if (it.isUnspecified) defaultTarget else it }
 
             fun toScheme(argument: IrTypeArgument): Scheme? =
                 if (argument is IrTypeProjection && argument.type.isOrHasComposableLambda)
                     argument.type.toScheme(defaultTarget)
                 else null
 
-            val parameters = typeArguments.takeUpTo(typeArguments.size - 1).mapNotNull { argument ->
-                toScheme(argument)
-            }
+            val parameters =
+                typeArguments.takeUpTo(typeArguments.size - 1).mapNotNull { argument ->
+                    toScheme(argument)
+                }
 
-            val result = typeArguments.lastOrNull()?.let { argument ->
-                toScheme(argument)
-            }
+            val result = typeArguments.lastOrNull()?.let { argument -> toScheme(argument) }
 
             Scheme(target, parameters, result)
         }
 
-    private val IrElement?.isComposableLambda: Boolean get() = when (this) {
-        is IrFunctionExpression -> function.isComposable
-        is IrCall -> isComposableSingletonGetter() || hasTransformedLambda()
-        is IrGetField -> symbol.owner.initializer?.findTransformedLambda() != null
-        else -> false
-    }
+    private val IrElement?.isComposableLambda: Boolean
+        get() =
+            when (this) {
+                is IrFunctionExpression -> function.isComposable
+                is IrCall -> isComposableSingletonGetter() || hasTransformedLambda()
+                is IrGetField -> symbol.owner.initializer?.findTransformedLambda() != null
+                else -> false
+            }
 
-    private val IrElement?.isComposableParameter: Boolean get() = when (this) {
-        is IrGetValue -> parameterOwners[symbol] != null && type.isComposable
-        else -> false
-    }
+    private val IrElement?.isComposableParameter: Boolean
+        get() =
+            when (this) {
+                is IrGetValue -> parameterOwners[symbol] != null && type.isComposable
+                else -> false
+            }
 
     internal fun IrCall.hasTransformedLambda() =
         context.irTrace[ComposeWritableSlices.HAS_TRANSFORMED_LAMBDA, this] == true
@@ -490,15 +508,16 @@
     private fun Item.toAnnotation(): IrConstructorCall? =
         if (ComposableTargetClass != null && ComposableOpenTargetClass != null) {
             when (this) {
-                is Token -> annotation(ComposableTargetClass).also {
-                    it.putValueArgument(0, irConst(value))
-                }
-                is Open ->
-                    if (index < 0) null else annotation(
-                        ComposableOpenTargetClass
-                    ).also {
-                        it.putValueArgument(0, irConst(index))
+                is Token ->
+                    annotation(ComposableTargetClass).also {
+                        it.putValueArgument(0, irConst(value))
                     }
+                is Open ->
+                    if (index < 0) null
+                    else
+                        annotation(ComposableOpenTargetClass).also {
+                            it.putValueArgument(0, irConst(index))
+                        }
             }
         } else null
 
@@ -526,11 +545,9 @@
             null
         )
 
-    private fun filteredAnnotations(annotations: List<IrConstructorCall>) = annotations
-        .filter {
-            !it.isComposableTarget &&
-                !it.isComposableOpenTarget &&
-                !it.isComposableInferredTarget
+    private fun filteredAnnotations(annotations: List<IrConstructorCall>) =
+        annotations.filter {
+            !it.isComposableTarget && !it.isComposableOpenTarget && !it.isComposableInferredTarget
         }
 
     fun updatedAnnotations(annotations: List<IrConstructorCall>, target: Item) =
@@ -539,44 +556,43 @@
     fun updatedAnnotations(annotations: List<IrConstructorCall>, scheme: Scheme) =
         filteredAnnotations(annotations) + scheme.toAnnotations()
 
-    fun inferenceFunctionOf(function: IrFunction) =
-        InferenceFunctionDeclaration(this, function)
+    fun inferenceFunctionOf(function: IrFunction) = InferenceFunctionDeclaration(this, function)
 
-    fun inferenceFunctionTypeOf(type: IrType) =
-        InferenceFunctionType(this, type)
+    fun inferenceFunctionTypeOf(type: IrType) = InferenceFunctionType(this, type)
 
     /**
      * A function is composable if it has a composer parameter added by the
-     * [ComposerParamTransformer] or it still has the @Composable annotation which
-     * can be because it is external and hasn't been transformed as the symbol remapper
-     * only remaps what is referenced as a symbol this method might not have been
-     * referenced directly in this module.
+     * [ComposerParamTransformer] or it still has the @Composable annotation which can be because it
+     * is external and hasn't been transformed as the symbol remapper only remaps what is referenced
+     * as a symbol this method might not have been referenced directly in this module.
      */
-    private val IrFunction.isComposable get() =
-        valueParameters.any { it.name == ComposeNames.COMPOSER_PARAMETER } ||
-            annotations.hasAnnotation(ComposeFqNames.Composable)
+    private val IrFunction.isComposable
+        get() =
+            valueParameters.any { it.name == ComposeNames.COMPOSER_PARAMETER } ||
+                annotations.hasAnnotation(ComposeFqNames.Composable)
 
-    private val IrType.isSamComposable get() =
-        samOwnerOrNull()?.isComposable == true
+    private val IrType.isSamComposable
+        get() = samOwnerOrNull()?.isComposable == true
 
-    private val IrType.isComposableLambda get() =
-        (this.classFqName == ComposeFqNames.composableLambdaType) ||
-        (this as? IrSimpleType)
-        ?.arguments
-        ?.any {
-            it.typeOrNull?.classFqName == ComposeFqNames.Composer
-        } == true
+    private val IrType.isComposableLambda
+        get() =
+            (this.classFqName == ComposeFqNames.composableLambdaType) ||
+                (this as? IrSimpleType)?.arguments?.any {
+                    it.typeOrNull?.classFqName == ComposeFqNames.Composer
+                } == true
 
-    internal val IrType.isOrHasComposableLambda: Boolean get() =
-        isComposableLambda || isSamComposable ||
-            (this as? IrSimpleType)?.arguments?.any {
-                it.typeOrNull?.isOrHasComposableLambda == true
-            } == true
+    internal val IrType.isOrHasComposableLambda: Boolean
+        get() =
+            isComposableLambda ||
+                isSamComposable ||
+                (this as? IrSimpleType)?.arguments?.any {
+                    it.typeOrNull?.isOrHasComposableLambda == true
+                } == true
 
-    private val IrType.isComposable get() = isComposableLambda || isSamComposable
+    private val IrType.isComposable
+        get() = isComposableLambda || isSamComposable
 
-    private fun IrFunction.hasComposableParameter() =
-        valueParameters.any { it.type.isComposable }
+    private fun IrFunction.hasComposableParameter() = valueParameters.any { it.type.isComposable }
 
     private fun IrCall.hasComposableArguments() =
         arguments.any { argument ->
@@ -587,53 +603,39 @@
 }
 
 /**
- * An [InferenceFunction] is an abstraction to allow inference to translate a type into a scheme
- * and update the declaration of a type if inference determines a more accurate scheme.
+ * An [InferenceFunction] is an abstraction to allow inference to translate a type into a scheme and
+ * update the declaration of a type if inference determines a more accurate scheme.
  */
-sealed class InferenceFunction(
-    val transformer: ComposableTargetAnnotationsTransformer
-) {
-    /**
-     * The name of the function. This is only supplied for debugging.
-     */
+sealed class InferenceFunction(val transformer: ComposableTargetAnnotationsTransformer) {
+    /** The name of the function. This is only supplied for debugging. */
     abstract val name: String
 
-    /**
-     * Can the scheme be updated. If not, tell inference not to track it.
-     */
+    /** Can the scheme be updated. If not, tell inference not to track it. */
     abstract val schemeIsUpdatable: Boolean
 
-    /**
-     * Record a scheme for the function in metrics (if applicable).
-     */
-    open fun recordScheme(scheme: Scheme) { }
+    /** Record a scheme for the function in metrics (if applicable). */
+    open fun recordScheme(scheme: Scheme) {}
 
     /**
-     * The scheme has changed so the corresponding attributes should be updated to match the
-     * scheme provided.
+     * The scheme has changed so the corresponding attributes should be updated to match the scheme
+     * provided.
      */
     abstract fun updateScheme(scheme: Scheme)
 
-    /**
-     * Return a declared scheme for the function.
-     */
+    /** Return a declared scheme for the function. */
     abstract fun toDeclaredScheme(defaultTarget: Item = Open(0)): Scheme
 
     /**
-     * Return true if this is a type with overly wide parameter types such as Any or
-     * unconstrained or insufficiently constrained type parameters.
+     * Return true if this is a type with overly wide parameter types such as Any or unconstrained
+     * or insufficiently constrained type parameters.
      */
     open fun isOverlyWide(): Boolean = false
 
-    /**
-     * Helper routine to produce an updated annotations list.
-     */
+    /** Helper routine to produce an updated annotations list. */
     fun updatedAnnotations(annotations: List<IrConstructorCall>, target: Item) =
         transformer.updatedAnnotations(annotations, target)
 
-    /**
-     * Helper routine to produce an updated annotations list.
-     */
+    /** Helper routine to produce an updated annotations list. */
     fun updatedAnnotations(annotations: List<IrConstructorCall>, scheme: Scheme) =
         transformer.updatedAnnotations(annotations, scheme)
 }
@@ -642,23 +644,23 @@
  * An [InferenceFunctionDeclaration] refers to the type implied by a function declaration.
  *
  * Storing [Scheme] information is complicated by the current IR transformer limitation that
- * annotations added to types are not serialized. Instead of updating the parameter types
- * directly (for example adding a annotation to the IrType of the parameter declaration) the
- * [Scheme] is serialized into a string and stored on the function declaration.
+ * annotations added to types are not serialized. Instead of updating the parameter types directly
+ * (for example adding a annotation to the IrType of the parameter declaration) the [Scheme] is
+ * serialized into a string and stored on the function declaration.
  */
 class InferenceFunctionDeclaration(
     transformer: ComposableTargetAnnotationsTransformer,
     val function: IrFunction
 ) : InferenceFunction(transformer) {
-    override val name: String get() = function.name.toString()
+    override val name: String
+        get() = function.name.toString()
 
-    override val schemeIsUpdatable: Boolean get() = true
+    override val schemeIsUpdatable: Boolean
+        get() = true
 
     override fun recordScheme(scheme: Scheme) {
         if (!scheme.allAnonymous()) {
-            with(transformer) {
-                metricsFor(function).recordScheme(scheme.toString())
-            }
+            with(transformer) { metricsFor(function).recordScheme(scheme.toString()) }
         }
     }
 
@@ -673,36 +675,33 @@
         }
     }
 
-    override fun toDeclaredScheme(defaultTarget: Item): Scheme = with(transformer) {
-        function.scheme ?: function.toScheme(defaultTarget)
-    }
+    override fun toDeclaredScheme(defaultTarget: Item): Scheme =
+        with(transformer) { function.scheme ?: function.toScheme(defaultTarget) }
 
-    private fun IrFunction.toScheme(defaultTarget: Item): Scheme = with(transformer) {
-        val target = function.annotations.target.let { target ->
-            if (target.isUnspecified && function.body == null) {
-                defaultTarget
-            } else if (target.isUnspecified) {
-                // Default to the target specified at the file scope, if one.
-                function.file.annotations.target
-            } else target
-        }
-        val effectiveDefault =
-            if (function.body == null) defaultTarget
-            else Open(-1, isUnspecified = true)
-        val result = function.returnType.let { resultType ->
-            if (resultType.isOrHasComposableLambda)
-                resultType.toScheme(effectiveDefault)
-            else null
-        }
+    private fun IrFunction.toScheme(defaultTarget: Item): Scheme =
+        with(transformer) {
+            val target =
+                function.annotations.target.let { target ->
+                    if (target.isUnspecified && function.body == null) {
+                        defaultTarget
+                    } else if (target.isUnspecified) {
+                        // Default to the target specified at the file scope, if one.
+                        function.file.annotations.target
+                    } else target
+                }
+            val effectiveDefault =
+                if (function.body == null) defaultTarget else Open(-1, isUnspecified = true)
+            val result =
+                function.returnType.let { resultType ->
+                    if (resultType.isOrHasComposableLambda) resultType.toScheme(effectiveDefault)
+                    else null
+                }
 
-        Scheme(
-            target,
-            parameters().map { it.toDeclaredScheme(effectiveDefault) },
-            result
-        ).let { scheme ->
-            ancestorScheme(defaultTarget)?.let { scheme.mergeWith(listOf(it)) } ?: scheme
+            Scheme(target, parameters().map { it.toDeclaredScheme(effectiveDefault) }, result)
+                .let { scheme ->
+                    ancestorScheme(defaultTarget)?.let { scheme.mergeWith(listOf(it)) } ?: scheme
+                }
         }
-    }
 
     private fun IrFunction.ancestorScheme(defaultTarget: Item): Scheme? =
         if (this is IrSimpleFunction && this.overriddenSymbols.isNotEmpty()) {
@@ -710,86 +709,94 @@
         } else null
 
     override fun hashCode(): Int = function.hashCode() * 31
+
     override fun equals(other: Any?) =
         other is InferenceFunctionDeclaration && other.function == function
 
     private fun parameters(): List<InferenceFunction> =
         with(transformer) {
-            function.valueParameters.filter { it.type.isOrHasComposableLambda }.map { parameter ->
-                InferenceFunctionParameter(transformer, parameter)
-            }.let { parameters ->
-                function.extensionReceiverParameter?.let {
-                    if (it.type.isOrHasComposableLambda) {
-                        parameters + listOf(InferenceFunctionParameter(transformer, it))
-                    } else parameters
-                } ?: parameters
-            }
+            function.valueParameters
+                .filter { it.type.isOrHasComposableLambda }
+                .map { parameter -> InferenceFunctionParameter(transformer, parameter) }
+                .let { parameters ->
+                    function.extensionReceiverParameter?.let {
+                        if (it.type.isOrHasComposableLambda) {
+                            parameters + listOf(InferenceFunctionParameter(transformer, it))
+                        } else parameters
+                    } ?: parameters
+                }
         }
 
-    private val Scheme.shouldSerialize get(): Boolean = parameters.isNotEmpty()
-    private fun Scheme.allAnonymous(): Boolean = target.isAnonymous &&
-        (result == null || result.allAnonymous()) &&
-        parameters.all { it.allAnonymous() }
+    private val Scheme.shouldSerialize
+        get(): Boolean = parameters.isNotEmpty()
+
+    private fun Scheme.allAnonymous(): Boolean =
+        target.isAnonymous &&
+            (result == null || result.allAnonymous()) &&
+            parameters.all { it.allAnonymous() }
 }
 
 /**
  * An [InferenceFunctionCallType] is the type abstraction for a call. This is used for [IrCall]
  * because it has the substituted types for generic types and the function's symbol has the original
- * unsubstituted types. It is important, for example for calls to [let], that the arguments
- * and result are after generic resolution so calls like `content?.let { it.invoke() }` correctly
- * infer that the scheme is `[0[0]]` if `content` is a of type `(@Composable () -> Unit)?. This
- * can only be determined after the generic parameters have been substituted.
+ * unsubstituted types. It is important, for example for calls to [let], that the arguments and
+ * result are after generic resolution so calls like `content?.let { it.invoke() }` correctly infer
+ * that the scheme is `[0[0]]` if `content` is a of type `(@Composable () -> Unit)?. This can only
+ * be determined after the generic parameters have been substituted.
  */
 class InferenceFunctionCallType(
     transformer: ComposableTargetAnnotationsTransformer,
     private val call: IrCall
 ) : InferenceFunction(transformer) {
-    override val name: String get() = "Call(${call.symbol.owner.name})"
+    override val name: String
+        get() = "Call(${call.symbol.owner.name})"
 
-    override val schemeIsUpdatable: Boolean get() = false
+    override val schemeIsUpdatable: Boolean
+        get() = false
 
     override fun toDeclaredScheme(defaultTarget: Item): Scheme =
         with(transformer) {
-            val target = call.symbol.owner.annotations.target.let { target ->
-                if (target.isUnspecified) defaultTarget else target
-            }
-            val parameters = call.arguments.filterNotNull().filter {
-                 it.type.isOrHasComposableLambda
-            }.map {
-                it.type.toScheme(defaultTarget)
-            }.toMutableList()
+            val target =
+                call.symbol.owner.annotations.target.let { target ->
+                    if (target.isUnspecified) defaultTarget else target
+                }
+            val parameters =
+                call.arguments
+                    .filterNotNull()
+                    .filter { it.type.isOrHasComposableLambda }
+                    .map { it.type.toScheme(defaultTarget) }
+                    .toMutableList()
             fun recordParameter(expression: IrExpression?) {
                 if (expression != null && expression.type.isOrHasComposableLambda) {
                     parameters.add(expression.type.toScheme(defaultTarget))
                 }
             }
             recordParameter(call.extensionReceiver)
-            val result = if (call.type.isOrHasComposableLambda)
-                call.type.toScheme(defaultTarget)
-            else null
+            val result =
+                if (call.type.isOrHasComposableLambda) call.type.toScheme(defaultTarget) else null
             Scheme(target, parameters, result)
         }
 
-    override fun isOverlyWide(): Boolean =
-        call.symbol.owner.hasOverlyWideParameters()
+    override fun isOverlyWide(): Boolean = call.symbol.owner.hasOverlyWideParameters()
 
     override fun updateScheme(scheme: Scheme) {
         // Ignore the updated scheme for the call as it can always be re-inferred.
     }
 }
 
-/**
- * Produce the scheme from a function type.
- */
+/** Produce the scheme from a function type. */
 class InferenceFunctionType(
     transformer: ComposableTargetAnnotationsTransformer,
     private val type: IrType
 ) : InferenceFunction(transformer) {
-    override val name: String get() = "<type>"
-    override val schemeIsUpdatable: Boolean get() = false
-    override fun toDeclaredScheme(defaultTarget: Item): Scheme = with(transformer) {
-        type.toScheme(defaultTarget)
-    }
+    override val name: String
+        get() = "<type>"
+
+    override val schemeIsUpdatable: Boolean
+        get() = false
+
+    override fun toDeclaredScheme(defaultTarget: Item): Scheme =
+        with(transformer) { type.toScheme(defaultTarget) }
 
     override fun updateScheme(scheme: Scheme) {
         // Cannot update the scheme of a type yet. This is worked around for parameters by recording
@@ -805,19 +812,24 @@
     transformer: ComposableTargetAnnotationsTransformer,
     val parameter: IrValueParameter
 ) : InferenceFunction(transformer) {
-    override val name: String get() = "<parameter>"
+    override val name: String
+        get() = "<parameter>"
+
     override fun hashCode(): Int = parameter.hashCode() * 31
+
     override fun equals(other: Any?) =
         other is InferenceFunctionParameter && other.parameter == parameter
 
-    override val schemeIsUpdatable: Boolean get() = false
+    override val schemeIsUpdatable: Boolean
+        get() = false
 
-    override fun toDeclaredScheme(defaultTarget: Item): Scheme = with(transformer) {
-        val samAnnotations = parameter.type.samOwnerOrNull()?.annotations ?: emptyList()
-        val annotations = parameter.type.annotations + samAnnotations
-        val target = annotations.target.let { if (it.isUnspecified) defaultTarget else it }
-        parameter.type.toScheme(target)
-    }
+    override fun toDeclaredScheme(defaultTarget: Item): Scheme =
+        with(transformer) {
+            val samAnnotations = parameter.type.samOwnerOrNull()?.annotations ?: emptyList()
+            val annotations = parameter.type.annotations + samAnnotations
+            val target = annotations.target.let { if (it.isUnspecified) defaultTarget else it }
+            parameter.type.toScheme(target)
+        }
 
     override fun updateScheme(scheme: Scheme) {
         // Note that this is currently not called. Type annotations are serialized into an
@@ -825,31 +837,25 @@
         // be updated once such a modification is correctly serialized by Kotlin.
         val type = parameter.type
         if (type is IrSimpleType) {
-            val newType = type.toBuilder().apply {
-                annotations = updatedAnnotations(annotations, scheme.target)
-            }.buildSimpleType()
+            val newType =
+                type
+                    .toBuilder()
+                    .apply { annotations = updatedAnnotations(annotations, scheme.target) }
+                    .buildSimpleType()
             parameter.type = newType
         }
     }
 }
 
-/**
- * A wrapper around IrElement to return the information requested by inference.
- */
+/** A wrapper around IrElement to return the information requested by inference. */
 sealed class InferenceNode {
-    /**
-     * The element being wrapped
-     */
+    /** The element being wrapped */
     abstract val element: IrElement
 
-    /**
-     * The node kind of the node
-     */
+    /** The node kind of the node */
     abstract val kind: NodeKind
 
-    /**
-     * The function type abstraction used by inference
-     */
+    /** The function type abstraction used by inference */
     abstract val function: InferenceFunction?
 
     /**
@@ -873,18 +879,21 @@
     open fun isOverlyWide(): Boolean = function?.isOverlyWide() == true
 
     override fun hashCode() = element.hashCode() * 31
+
     override fun equals(other: Any?) = other is InferenceNode && other.element == element
 }
 
-val IrSimpleFunctionSymbol.isGenericFunction get(): Boolean =
-    owner.typeParameters.isNotEmpty() || owner.dispatchReceiverParameter?.type?.let {
-        it is IrSimpleType && it.arguments.isNotEmpty()
-    } == true
+val IrSimpleFunctionSymbol.isGenericFunction
+    get(): Boolean =
+        owner.typeParameters.isNotEmpty() ||
+            owner.dispatchReceiverParameter?.type?.let {
+                it is IrSimpleType && it.arguments.isNotEmpty()
+            } == true
 
 /**
- * An [InferenceCallTargetNode] is a wrapper around an [IrCall] which represents the target of
- * the call, not the call itself. That its type is the type of the target of the call not the
- * result of the call.
+ * An [InferenceCallTargetNode] is a wrapper around an [IrCall] which represents the target of the
+ * call, not the call itself. That its type is the type of the target of the call not the result of
+ * the call.
  */
 class InferenceCallTargetNode(
     private val transformer: ComposableTargetAnnotationsTransformer,
@@ -892,50 +901,65 @@
 ) : InferenceNode() {
     override fun equals(other: Any?): Boolean =
         other is InferenceCallTargetNode && super.equals(other)
+
     override fun hashCode(): Int = super.hashCode() * 31
-    override val kind: NodeKind get() = NodeKind.Function
-    override val function = with(transformer) {
-        if (element.symbol.owner.hasSchemeSpecified())
-            InferenceFunctionDeclaration(transformer, element.symbol.owner)
-        else InferenceFunctionCallType(transformer, element)
-    }
+
+    override val kind: NodeKind
+        get() = NodeKind.Function
+
+    override val function =
+        with(transformer) {
+            if (element.symbol.owner.hasSchemeSpecified())
+                InferenceFunctionDeclaration(transformer, element.symbol.owner)
+            else InferenceFunctionCallType(transformer, element)
+        }
 
     override val referenceContainer: InferenceNode? =
         // If this is a generic function then don't redirect the scheme to the declaration
-        if (element.symbol.isGenericFunction) null else
-        with(transformer) {
-            val function = when {
-                element.isComposableSingletonGetter() ->
-                    // If this was a lambda transformed into a singleton, find the singleton function
-                    element.singletonFunctionExpression().function
-                element.hasTransformedLambda() ->
-                    // If this is a normal lambda, find the lambda's IrFunction
-                    element.transformedLambda().function
-                else -> element.symbol.owner
+        if (element.symbol.isGenericFunction) null
+        else
+            with(transformer) {
+                val function =
+                    when {
+                        element.isComposableSingletonGetter() ->
+                            // If this was a lambda transformed into a singleton, find the singleton
+                            // function
+                            element.singletonFunctionExpression().function
+                        element.hasTransformedLambda() ->
+                            // If this is a normal lambda, find the lambda's IrFunction
+                            element.transformedLambda().function
+                        else -> element.symbol.owner
+                    }
+                // If this is a call to a non-generic function with a body (e.g. non-abstract),
+                // return its
+                // function. Generic or abstract functions (interface members, lambdas, open
+                // methods, etc.)
+                // do not contain a body to infer anything from so we just use the declared scheme
+                // if
+                // there is one. Returning null from this function cause the scheme to be determined
+                // from
+                // the target expression (using, for example, the substituted type parameters)
+                // instead of
+                // the definition.
+                function
+                    .takeIf { it.body != null && it.typeParameters.isEmpty() }
+                    ?.let { inferenceNodeOf(function, transformer) }
             }
-            // If this is a call to a non-generic function with a body (e.g. non-abstract), return its
-            // function. Generic or abstract functions (interface members, lambdas, open methods, etc.)
-            // do not contain a body to infer anything from so we just use the declared scheme if
-            // there is one. Returning null from this function cause the scheme to be determined from
-            // the target expression (using, for example, the substituted type parameters) instead of
-            // the definition.
-            function.takeIf { it.body != null && it.typeParameters.isEmpty() }?.let {
-                inferenceNodeOf(function, transformer)
-            }
-        }
 }
 
-/**
- * A node representing a variable declaration.
- */
+/** A node representing a variable declaration. */
 class InferenceVariable(
     private val transformer: ComposableTargetAnnotationsTransformer,
     override val element: IrVariable,
 ) : InferenceNode() {
-    override val kind: NodeKind get() = NodeKind.Variable
-    override val function: InferenceFunction get() =
-        transformer.inferenceFunctionTypeOf(element.type)
-    override val referenceContainer: InferenceNode? get() = null
+    override val kind: NodeKind
+        get() = NodeKind.Variable
+
+    override val function: InferenceFunction
+        get() = transformer.inferenceFunctionTypeOf(element.type)
+
+    override val referenceContainer: InferenceNode?
+        get() = null
 }
 
 fun inferenceNodeOf(
@@ -951,35 +975,35 @@
         else -> InferenceUnknownElement(element)
     }
 
-/**
- * A node wrapper for function declarations.
- */
+/** A node wrapper for function declarations. */
 class InferenceFunctionDeclarationNode(
     transformer: ComposableTargetAnnotationsTransformer,
     override val element: IrFunction
 ) : InferenceNode() {
-    override val kind: NodeKind get() = NodeKind.Function
+    override val kind: NodeKind
+        get() = NodeKind.Function
+
     override val function: InferenceFunction = transformer.inferenceFunctionOf(element)
     override val referenceContainer: InferenceNode?
         get() = this.takeIf { element.body != null }
 }
 
-/**
- * A node wrapper for function expressions (i.e. lambdas).
- */
+/** A node wrapper for function expressions (i.e. lambdas). */
 class InferenceFunctionExpressionNode(
     private val transformer: ComposableTargetAnnotationsTransformer,
     override val element: IrFunctionExpression
 ) : InferenceNode() {
-    override val kind: NodeKind get() = NodeKind.Lambda
+    override val kind: NodeKind
+        get() = NodeKind.Lambda
+
     override val function: InferenceFunction = transformer.inferenceFunctionOf(element.function)
     override val referenceContainer: InferenceNode
         get() = inferenceNodeOf(element.function, transformer)
 }
 
 /**
- * A node wrapper for a call. This represents the result of a call. Use [InferenceCallTargetNode]
- * to represent the target of a call.
+ * A node wrapper for a call. This represents the result of a call. Use [InferenceCallTargetNode] to
+ * represent the target of a call.
  */
 class InferenceCallExpression(
     private val transformer: ComposableTargetAnnotationsTransformer,
@@ -987,51 +1011,56 @@
 ) : InferenceNode() {
     private val isSingletonLambda = with(transformer) { element.isComposableSingletonGetter() }
     private val isTransformedLambda = with(transformer) { element.hasTransformedLambda() }
-    override val kind: NodeKind get() =
-        if (isSingletonLambda || isTransformedLambda) NodeKind.Lambda else NodeKind.Expression
+    override val kind: NodeKind
+        get() =
+            if (isSingletonLambda || isTransformedLambda) NodeKind.Lambda else NodeKind.Expression
 
-    override val function: InferenceFunction = with(transformer) {
-        when {
-            isSingletonLambda ->
-                inferenceFunctionOf(element.singletonFunctionExpression().function)
-            isTransformedLambda ->
-                inferenceFunctionOf(element.transformedLambda().function)
-            else -> transformer.inferenceFunctionTypeOf(element.type)
-        }
-    }
-
-    override val referenceContainer: InferenceNode?
-        get() = with(transformer) {
+    override val function: InferenceFunction =
+        with(transformer) {
             when {
                 isSingletonLambda ->
-                    inferenceNodeOf(element.singletonFunctionExpression().function, transformer)
-                isTransformedLambda ->
-                    inferenceNodeOf(element.transformedLambda().function, transformer)
-                else -> null
+                    inferenceFunctionOf(element.singletonFunctionExpression().function)
+                isTransformedLambda -> inferenceFunctionOf(element.transformedLambda().function)
+                else -> transformer.inferenceFunctionTypeOf(element.type)
             }
         }
+
+    override val referenceContainer: InferenceNode?
+        get() =
+            with(transformer) {
+                when {
+                    isSingletonLambda ->
+                        inferenceNodeOf(element.singletonFunctionExpression().function, transformer)
+                    isTransformedLambda ->
+                        inferenceNodeOf(element.transformedLambda().function, transformer)
+                    else -> null
+                }
+            }
 }
 
-/**
- * An expression node whose scheme is determined by the type of the node.
- */
+/** An expression node whose scheme is determined by the type of the node. */
 class InferenceElementExpression(
     transformer: ComposableTargetAnnotationsTransformer,
     override val element: IrExpression,
 ) : InferenceNode() {
-    override val kind: NodeKind get() = NodeKind.Expression
+    override val kind: NodeKind
+        get() = NodeKind.Expression
+
     override val function: InferenceFunction = transformer.inferenceFunctionTypeOf(element.type)
 }
 
-/**
- * An [InferenceUnknownElement] is a general wrapper around function declarations and lambda.
- */
+/** An [InferenceUnknownElement] is a general wrapper around function declarations and lambda. */
 class InferenceUnknownElement(
     override val element: IrElement,
 ) : InferenceNode() {
-    override val kind: NodeKind get() = NodeKind.Expression
-    override val function: InferenceFunction? get() = null
-    override val referenceContainer: InferenceNode? get() = null
+    override val kind: NodeKind
+        get() = NodeKind.Expression
+
+    override val function: InferenceFunction?
+        get() = null
+
+    override val referenceContainer: InferenceNode?
+        get() = null
 }
 
 /**
@@ -1045,11 +1074,14 @@
     val container: InferenceNode,
     val index: Int
 ) : InferenceNode() {
-    override val kind: NodeKind get() = NodeKind.ParameterReference
+    override val kind: NodeKind
+        get() = NodeKind.ParameterReference
+
     override fun parameterIndex(node: InferenceNode): Int =
         if (node.function == function) index else -1
 
-    override val referenceContainer: InferenceNode get() = container
+    override val referenceContainer: InferenceNode
+        get() = container
 
     override fun equals(other: Any?): Boolean =
         other is InferenceResolvedParameter && other.element == element
@@ -1062,50 +1094,41 @@
         (getValueArgument(0) as? IrConst<*>)?.value as? T
     } else null
 
-private val IrConstructorCall.isComposableTarget get() =
-    annotationClass?.isClassWithFqName(
-        ComposeFqNames.ComposableTarget.toUnsafe()
-    ) == true
+private val IrConstructorCall.isComposableTarget
+    get() = annotationClass?.isClassWithFqName(ComposeFqNames.ComposableTarget.toUnsafe()) == true
 
-private val IrConstructorCall.isComposableTargetMarked: Boolean get() =
-    annotationClass?.owner?.annotations?.hasAnnotation(
-        ComposeFqNames.ComposableTargetMarker
-    ) == true
+private val IrConstructorCall.isComposableTargetMarked: Boolean
+    get() =
+        annotationClass?.owner?.annotations?.hasAnnotation(ComposeFqNames.ComposableTargetMarker) ==
+            true
 
-private val IrConstructorCall.isComposableInferredTarget get() =
-    annotationClass?.isClassWithFqName(
-        ComposeFqNames.ComposableInferredTarget.toUnsafe()
-    ) == true
+private val IrConstructorCall.isComposableInferredTarget
+    get() =
+        annotationClass?.isClassWithFqName(ComposeFqNames.ComposableInferredTarget.toUnsafe()) ==
+            true
 
-private val IrConstructorCall.isComposableOpenTarget get() =
-    annotationClass?.isClassWithFqName(
-        ComposeFqNames.ComposableOpenTarget.toUnsafe()
-    ) == true
+private val IrConstructorCall.isComposableOpenTarget
+    get() =
+        annotationClass?.isClassWithFqName(ComposeFqNames.ComposableOpenTarget.toUnsafe()) == true
 
 private fun IrType.samOwnerOrNull() =
     classOrNull?.let { cls ->
         if (cls.owner.kind == ClassKind.INTERFACE) {
-            cls.functions.singleOrNull {
-                it.owner.modality == Modality.ABSTRACT
-            }?.owner
+            cls.functions.singleOrNull { it.owner.modality == Modality.ABSTRACT }?.owner
         } else null
     }
 
-private val IrCall.arguments get() = Array(valueArgumentsCount) {
-    getValueArgument(it)
-}.toList()
+private val IrCall.arguments
+    get() = Array(valueArgumentsCount) { getValueArgument(it) }.toList()
 
-private fun <T> Iterable<T>.takeUpTo(n: Int): List<T> =
-    if (n <= 0) emptyList() else take(n)
+private fun <T> Iterable<T>.takeUpTo(n: Int): List<T> = if (n <= 0) emptyList() else take(n)
 
 /**
- * A function with overly wide parameters should be ignored for traversal as well as when
- * it is called.
+ * A function with overly wide parameters should be ignored for traversal as well as when it is
+ * called.
  */
 private fun IrFunction.hasOverlyWideParameters(): Boolean =
-    valueParameters.any {
-        it.type.isAny() || it.type.isNullableAny()
-    }
+    valueParameters.any { it.type.isAny() || it.type.isNullableAny() }
 
 private fun IrFunction.hasOpenTypeParameters(): Boolean =
     valueParameters.any { it.type.isTypeParameter() } ||
diff --git a/compose/compiler/compiler-hosted/src/main/java/androidx/compose/compiler/plugins/kotlin/lower/ComposableTypeRemapper.kt b/compose/compiler/compiler-hosted/src/main/java/androidx/compose/compiler/plugins/kotlin/lower/ComposableTypeRemapper.kt
index d9f37c7..0110f75 100644
--- a/compose/compiler/compiler-hosted/src/main/java/androidx/compose/compiler/plugins/kotlin/lower/ComposableTypeRemapper.kt
+++ b/compose/compiler/compiler-hosted/src/main/java/androidx/compose/compiler/plugins/kotlin/lower/ComposableTypeRemapper.kt
@@ -72,9 +72,10 @@
 internal fun IrFunction.needsComposableRemapping(): Boolean {
     if (
         dispatchReceiverParameter?.type.containsComposableAnnotation() ||
-        extensionReceiverParameter?.type.containsComposableAnnotation() ||
-        returnType.containsComposableAnnotation()
-    ) return true
+            extensionReceiverParameter?.type.containsComposableAnnotation() ||
+            returnType.containsComposableAnnotation()
+    )
+        return true
 
     for (param in valueParameters) {
         if (param.type.containsComposableAnnotation()) return true
@@ -135,9 +136,7 @@
     }
 
     override fun visitProperty(declaration: IrProperty): IrProperty {
-        return super.visitProperty(declaration).also {
-            it.copyAttributes(declaration)
-        }
+        return super.visitProperty(declaration).also { it.copyAttributes(declaration) }
     }
 
     override fun visitFile(declaration: IrFile): IrFile {
@@ -149,15 +148,13 @@
     override fun visitWhen(expression: IrWhen): IrWhen {
         if (expression is IrIfThenElseImpl) {
             return IrIfThenElseImpl(
-                expression.startOffset,
-                expression.endOffset,
-                expression.type.remapType(),
-                mapStatementOrigin(expression.origin),
-            ).also {
-                expression.branches.mapTo(it.branches) { branch ->
-                    branch.transform()
-                }
-            }.copyAttributes(expression)
+                    expression.startOffset,
+                    expression.endOffset,
+                    expression.type.remapType(),
+                    mapStatementOrigin(expression.origin),
+                )
+                .also { expression.branches.mapTo(it.branches) { branch -> branch.transform() } }
+                .copyAttributes(expression)
         }
         return super.visitWhen(expression)
     }
@@ -172,31 +169,32 @@
         // do it ourself here.
         if (
             ownerFn != null &&
-            ownerFn.origin == IrDeclarationOrigin.IR_EXTERNAL_DECLARATION_STUB &&
-            ownerFn.needsComposableRemapping()
+                ownerFn.origin == IrDeclarationOrigin.IR_EXTERNAL_DECLARATION_STUB &&
+                ownerFn.needsComposableRemapping()
         ) {
             if (symbolRemapper.getReferencedConstructor(ownerFn.symbol) == ownerFn.symbol) {
                 // Not remapped yet, so remap now.
                 // Remap only once to avoid IdSignature clash (on k/js 1.7.20).
                 symbolRemapper.visitConstructor(ownerFn)
-                super.visitConstructor(ownerFn).also {
-                    it.patchDeclarationParents(ownerFn.parent)
-                }
+                super.visitConstructor(ownerFn).also { it.patchDeclarationParents(ownerFn.parent) }
             }
             val newCallee = symbolRemapper.getReferencedConstructor(ownerFn.symbol)
 
             return IrConstructorCallImpl(
-                expression.startOffset, expression.endOffset,
-                expression.type.remapType(),
-                newCallee,
-                expression.typeArgumentsCount,
-                expression.constructorTypeArgumentsCount,
-                expression.valueArgumentsCount,
-                mapStatementOrigin(expression.origin)
-            ).apply {
-                copyRemappedTypeArgumentsFrom(expression)
-                transformValueArguments(expression)
-            }.copyAttributes(expression)
+                    expression.startOffset,
+                    expression.endOffset,
+                    expression.type.remapType(),
+                    newCallee,
+                    expression.typeArgumentsCount,
+                    expression.constructorTypeArgumentsCount,
+                    expression.valueArgumentsCount,
+                    mapStatementOrigin(expression.origin)
+                )
+                .apply {
+                    copyRemappedTypeArgumentsFrom(expression)
+                    transformValueArguments(expression)
+                }
+                .copyAttributes(expression)
         }
         return super.visitConstructorCall(expression)
     }
@@ -269,38 +267,36 @@
         // case, we want to update those calls as well.
         if (
             containingClass != null &&
-            ownerFn.origin == IrDeclarationOrigin.FAKE_OVERRIDE && (
+                ownerFn.origin == IrDeclarationOrigin.FAKE_OVERRIDE &&
+                (
                 // Fake override refers to composable if container is synthetic composable (K2)
                 // or function type is composable (K1)
-                containingClass.defaultType.isSyntheticComposableFunction() || (
-                    containingClass.defaultType.isFunction() &&
-                        expression.dispatchReceiver?.type?.hasComposableAnnotation() == true
-                )
-            )
+                containingClass.defaultType.isSyntheticComposableFunction() ||
+                    (containingClass.defaultType.isFunction() &&
+                        expression.dispatchReceiver?.type?.hasComposableAnnotation() == true))
         ) {
             val realParams = containingClass.typeParameters.size - 1
             // with composer and changed
             val newArgsSize = realParams + 1 + changedParamCount(realParams, 0)
             val newFnClass = context.function(newArgsSize).owner
 
-            var newFn = newFnClass
-                .functions
-                .first { it.name == ownerFn.name }
+            var newFn = newFnClass.functions.first { it.name == ownerFn.name }
 
             if (symbolRemapper.getReferencedSimpleFunction(newFn.symbol) == newFn.symbol) {
                 // Not remapped yet, so remap now.
                 // Remap only once to avoid IdSignature clash (on k/js 1.7.20).
                 symbolRemapper.visitSimpleFunction(newFn)
-                newFn = super.visitSimpleFunction(newFn).also { fn ->
-                    fn.overriddenSymbols = ownerFn.overriddenSymbols.map { it }
-                    fn.dispatchReceiverParameter = ownerFn.dispatchReceiverParameter
-                    fn.extensionReceiverParameter = ownerFn.extensionReceiverParameter
-                    newFn.valueParameters.forEach { p ->
-                        fn.addValueParameter(p.name.identifier, p.type)
+                newFn =
+                    super.visitSimpleFunction(newFn).also { fn ->
+                        fn.overriddenSymbols = ownerFn.overriddenSymbols.map { it }
+                        fn.dispatchReceiverParameter = ownerFn.dispatchReceiverParameter
+                        fn.extensionReceiverParameter = ownerFn.extensionReceiverParameter
+                        newFn.valueParameters.forEach { p ->
+                            fn.addValueParameter(p.name.identifier, p.type)
+                        }
+                        fn.patchDeclarationParents(newFnClass)
+                        assert(fn.body == null) { "expected body to be null" }
                     }
-                    fn.patchDeclarationParents(newFnClass)
-                    assert(fn.body == null) { "expected body to be null" }
-                }
             }
 
             val newCallee = symbolRemapper.getReferencedSimpleFunction(newFn.symbol)
@@ -319,16 +315,14 @@
         // also transform the corresponding property so that we maintain the relationship
         // `getterFun.correspondingPropertySymbol.owner.getter == getterFun`. If we do not
         // maintain this relationship inline class getters will be incorrectly compiled.
-        if (
-            ownerFn != null &&
-            ownerFn.origin == IrDeclarationOrigin.IR_EXTERNAL_DECLARATION_STUB
-        ) {
+        if (ownerFn != null && ownerFn.origin == IrDeclarationOrigin.IR_EXTERNAL_DECLARATION_STUB) {
             if (ownerFn.correspondingPropertySymbol != null) {
                 val property = ownerFn.correspondingPropertySymbol!!.owner
                 // avoid java properties since they go through a different lowering and it is
                 // also impossible for them to have composable types
-                if (property.origin != IrDeclarationOrigin.IR_EXTERNAL_JAVA_DECLARATION_STUB &&
-                    property.getter?.needsComposableRemapping() == true
+                if (
+                    property.origin != IrDeclarationOrigin.IR_EXTERNAL_JAVA_DECLARATION_STUB &&
+                        property.getter?.needsComposableRemapping() == true
                 ) {
                     if (symbolRemapper.getReferencedProperty(property.symbol) == property.symbol) {
                         // Not remapped yet, so remap now.
@@ -360,21 +354,19 @@
             }
         }
 
-        if (
-            ownerFn != null &&
-            ownerFn.needsComposableRemapping()
-        ) {
+        if (ownerFn != null && ownerFn.needsComposableRemapping()) {
             if (symbolRemapper.getReferencedSimpleFunction(ownerFn.symbol) == ownerFn.symbol) {
                 visitSimpleFunction(ownerFn).also {
-                    it.overriddenSymbols = ownerFn.overriddenSymbols.map { override ->
-                        if (override.isBound) {
-                            visitSimpleFunction(override.owner).apply {
-                                patchDeclarationParents(override.owner.parent)
-                            }.symbol
-                        } else {
-                            override
+                    it.overriddenSymbols =
+                        ownerFn.overriddenSymbols.map { override ->
+                            if (override.isBound) {
+                                visitSimpleFunction(override.owner)
+                                    .apply { patchDeclarationParents(override.owner.parent) }
+                                    .symbol
+                            } else {
+                                override
+                            }
                         }
-                    }
                     it.patchDeclarationParents(ownerFn.parent)
                 }
             }
@@ -400,16 +392,17 @@
     /* copied verbatim from DeepCopyIrTreeWithSymbols, except with newCallee as a parameter */
     private fun shallowCopyCall(expression: IrCall, newCallee: IrSimpleFunctionSymbol): IrCall {
         return IrCallImpl(
-            expression.startOffset, expression.endOffset,
-            expression.type.remapType(),
-            newCallee,
-            expression.typeArgumentsCount,
-            expression.valueArgumentsCount,
-            mapStatementOrigin(expression.origin),
-            symbolRemapper.getReferencedClassOrNull(expression.superQualifierSymbol)
-        ).apply {
-            copyRemappedTypeArgumentsFrom(expression)
-        }.copyAttributes(expression)
+                expression.startOffset,
+                expression.endOffset,
+                expression.type.remapType(),
+                newCallee,
+                expression.typeArgumentsCount,
+                expression.valueArgumentsCount,
+                mapStatementOrigin(expression.origin),
+                symbolRemapper.getReferencedClassOrNull(expression.superQualifierSymbol)
+            )
+            .apply { copyRemappedTypeArgumentsFrom(expression) }
+            .copyAttributes(expression)
     }
 
     /* copied verbatim from DeepCopyIrTreeWithSymbols */
@@ -481,21 +474,19 @@
 
         val oldIrArguments = type.arguments
         val realParams = oldIrArguments.size - 1
-        var extraArgs = listOf(
-            // composer param
-            makeTypeProjection(
-                composerType,
-                Variance.INVARIANT
+        var extraArgs =
+            listOf(
+                // composer param
+                makeTypeProjection(composerType, Variance.INVARIANT)
             )
-        )
         val changedParams = changedParamCount(realParams, 1)
-        extraArgs = extraArgs + (0 until changedParams).map {
-            makeTypeProjection(context.irBuiltIns.intType, Variance.INVARIANT)
-        }
+        extraArgs =
+            extraArgs +
+                (0 until changedParams).map {
+                    makeTypeProjection(context.irBuiltIns.intType, Variance.INVARIANT)
+                }
         val newIrArguments =
-            oldIrArguments.subList(0, oldIrArguments.size - 1) +
-                extraArgs +
-                oldIrArguments.last()
+            oldIrArguments.subList(0, oldIrArguments.size - 1) + extraArgs + oldIrArguments.last()
 
         val newArgSize = oldIrArguments.size - 1 + extraArgs.size
         val functionCls = context.function(newArgSize)
@@ -505,9 +496,9 @@
             functionCls,
             type.nullability,
             newIrArguments.map { remapTypeArgument(it) },
-            type.annotations.filter { !it.isComposableAnnotation() }.map {
-                it.transform(deepCopy, null) as IrConstructorCall
-            },
+            type.annotations
+                .filter { !it.isComposableAnnotation() }
+                .map { it.transform(deepCopy, null) as IrConstructorCall },
             null
         )
     }
@@ -526,8 +517,7 @@
     private fun remapTypeArgument(typeArgument: IrTypeArgument): IrTypeArgument =
         if (typeArgument is IrTypeProjection)
             makeTypeProjection(this.remapType(typeArgument.type), typeArgument.variance)
-        else
-            typeArgument
+        else typeArgument
 
     private fun IrTypeAbbreviation.remapTypeAbbreviation() =
         IrTypeAbbreviationImpl(
@@ -538,6 +528,6 @@
         )
 }
 
-private val KotlinFunctionsBuiltInsPackageFqName = StandardNames.BUILT_INS_PACKAGE_FQ_NAME
-    .child(Name.identifier("jvm"))
-    .child(Name.identifier("functions"))
+private val KotlinFunctionsBuiltInsPackageFqName =
+    StandardNames.BUILT_INS_PACKAGE_FQ_NAME.child(Name.identifier("jvm"))
+        .child(Name.identifier("functions"))
diff --git a/compose/compiler/compiler-hosted/src/main/java/androidx/compose/compiler/plugins/kotlin/lower/ComposerIntrinsicTransformer.kt b/compose/compiler/compiler-hosted/src/main/java/androidx/compose/compiler/plugins/kotlin/lower/ComposerIntrinsicTransformer.kt
index 2863dcb..3ff6d0d8 100644
--- a/compose/compiler/compiler-hosted/src/main/java/androidx/compose/compiler/plugins/kotlin/lower/ComposerIntrinsicTransformer.kt
+++ b/compose/compiler/compiler-hosted/src/main/java/androidx/compose/compiler/plugins/kotlin/lower/ComposerIntrinsicTransformer.kt
@@ -33,10 +33,7 @@
 class ComposerIntrinsicTransformer(
     val context: IrPluginContext,
     private val decoysEnabled: Boolean
-) :
-    IrElementTransformerVoid(),
-    FileLoweringPass,
-    ModuleLoweringPass {
+) : IrElementTransformerVoid(), FileLoweringPass, ModuleLoweringPass {
 
     private val currentComposerIntrinsic = currentComposerFqName()
 
@@ -61,18 +58,19 @@
             // since this call was transformed by the ComposerParamTransformer, the first argument
             // to this call is the composer itself. We just replace this expression with the
             // argument expression and we are good.
-            val expectedArgumentsCount = 1 + // composer parameter
-                1 // changed parameter
+            val expectedArgumentsCount =
+                1 + // composer parameter
+                    1 // changed parameter
             assert(expression.valueArgumentsCount == expectedArgumentsCount) {
                 """
                     Composer call doesn't match expected argument count:
                         expected: $expectedArgumentsCount,
                         actual: ${expression.valueArgumentsCount},
                         expression: ${expression.dump()}
-                """.trimIndent()
+                """
+                    .trimIndent()
             }
-            return expression.getValueArgument(0)
-                ?: error("Expected non-null composer argument")
+            return expression.getValueArgument(0) ?: error("Expected non-null composer argument")
         }
         return super.visitCall(expression)
     }
diff --git a/compose/compiler/compiler-hosted/src/main/java/androidx/compose/compiler/plugins/kotlin/lower/ComposerLambdaMemoization.kt b/compose/compiler/compiler-hosted/src/main/java/androidx/compose/compiler/plugins/kotlin/lower/ComposerLambdaMemoization.kt
index 93a1b79..4f3dc6c5 100644
--- a/compose/compiler/compiler-hosted/src/main/java/androidx/compose/compiler/plugins/kotlin/lower/ComposerLambdaMemoization.kt
+++ b/compose/compiler/compiler-hosted/src/main/java/androidx/compose/compiler/plugins/kotlin/lower/ComposerLambdaMemoization.kt
@@ -106,7 +106,8 @@
 private class CaptureCollector {
     val captures = mutableSetOf<IrValueDeclaration>()
     val capturedDeclarations = mutableSetOf<IrSymbolOwner>()
-    val hasCaptures: Boolean get() = captures.isNotEmpty() || capturedDeclarations.isNotEmpty()
+    val hasCaptures: Boolean
+        get() = captures.isNotEmpty() || capturedDeclarations.isNotEmpty()
 
     fun recordCapture(local: IrValueDeclaration) {
         captures.add(local)
@@ -119,6 +120,7 @@
 
 private abstract class DeclarationContext {
     val localDeclarationCaptures = mutableMapOf<IrSymbolOwner, Set<IrValueDeclaration>>()
+
     fun recordLocalDeclaration(local: DeclarationContext) {
         localDeclarationCaptures[local.declaration] = local.captures
     }
@@ -128,10 +130,15 @@
     abstract val declaration: IrSymbolOwner
     abstract val captures: Set<IrValueDeclaration>
     abstract val functionContext: FunctionContext?
+
     abstract fun declareLocal(local: IrValueDeclaration?)
+
     abstract fun recordCapture(local: IrValueDeclaration?): Boolean
+
     abstract fun recordCapture(local: IrSymbolOwner?)
+
     abstract fun pushCollector(collector: CaptureCollector)
+
     abstract fun popCollector(collector: CaptureCollector)
 }
 
@@ -167,17 +174,28 @@
 }
 
 private class SymbolOwnerContext(override val declaration: IrSymbolOwner) : DeclarationContext() {
-    override val composable get() = false
-    override val functionContext: FunctionContext? get() = null
-    override val symbol get() = declaration.symbol
-    override val captures: Set<IrValueDeclaration> get() = emptySet()
+    override val composable
+        get() = false
+
+    override val functionContext: FunctionContext?
+        get() = null
+
+    override val symbol
+        get() = declaration.symbol
+
+    override val captures: Set<IrValueDeclaration>
+        get() = emptySet()
+
     override fun declareLocal(local: IrValueDeclaration?) {}
+
     override fun recordCapture(local: IrValueDeclaration?): Boolean {
         return false
     }
 
     override fun recordCapture(local: IrSymbolOwner?) {}
+
     override fun pushCollector(collector: CaptureCollector) {}
+
     override fun popCollector(collector: CaptureCollector) {}
 }
 
@@ -185,34 +203,45 @@
     override val declaration: IrSymbolOwner,
     override val functionContext: FunctionContext
 ) : DeclarationContext() {
-    override val composable: Boolean get() = functionContext.composable
-    override val symbol: IrSymbol get() = declaration.symbol
-    override val captures: Set<IrValueDeclaration> get() = functionContext.captures
+    override val composable: Boolean
+        get() = functionContext.composable
+
+    override val symbol: IrSymbol
+        get() = declaration.symbol
+
+    override val captures: Set<IrValueDeclaration>
+        get() = functionContext.captures
+
     override fun declareLocal(local: IrValueDeclaration?) = functionContext.declareLocal(local)
+
     override fun recordCapture(local: IrValueDeclaration?) = functionContext.recordCapture(local)
+
     override fun recordCapture(local: IrSymbolOwner?) = functionContext.recordCapture(local)
+
     override fun pushCollector(collector: CaptureCollector) =
         functionContext.pushCollector(collector)
 
-    override fun popCollector(collector: CaptureCollector) =
-        functionContext.popCollector(collector)
+    override fun popCollector(collector: CaptureCollector) = functionContext.popCollector(collector)
 }
 
 private class FunctionContext(
     override val declaration: IrFunction,
     override val composable: Boolean,
 ) : DeclarationContext() {
-    override val symbol get() = declaration.symbol
-    override val functionContext: FunctionContext get() = this
+    override val symbol
+        get() = declaration.symbol
+
+    override val functionContext: FunctionContext
+        get() = this
+
     val locals = mutableSetOf<IrValueDeclaration>()
     override val captures: MutableSet<IrValueDeclaration> = mutableSetOf()
     var collectors = mutableListOf<CaptureCollector>()
-    val canRemember: Boolean get() = composable
+    val canRemember: Boolean
+        get() = composable
 
     init {
-        declaration.valueParameters.forEach {
-            declareLocal(it)
-        }
+        declaration.valueParameters.forEach { declareLocal(it) }
         declaration.dispatchReceiverParameter?.let { declareLocal(it) }
         declaration.extensionReceiverParameter?.let { declareLocal(it) }
     }
@@ -262,12 +291,16 @@
 
 private class ClassContext(override val declaration: IrClass) : DeclarationContext() {
     override val composable: Boolean = false
-    override val symbol get() = declaration.symbol
+    override val symbol
+        get() = declaration.symbol
+
     override val functionContext: FunctionContext? = null
     override val captures: MutableSet<IrValueDeclaration> = mutableSetOf()
     val thisParam: IrValueDeclaration? = declaration.thisReceiver!!
     var collectors = mutableListOf<CaptureCollector>()
+
     override fun declareLocal(local: IrValueDeclaration?) {}
+
     override fun recordCapture(local: IrValueDeclaration?): Boolean {
         val isThis = local == thisParam
         val isConstructorParam = (local?.parent as? IrConstructor)?.parent === declaration
@@ -284,6 +317,7 @@
     }
 
     override fun recordCapture(local: IrSymbolOwner?) {}
+
     override fun pushCollector(collector: CaptureCollector) {
         collectors.add(collector)
     }
@@ -300,15 +334,14 @@
     metrics: ModuleMetrics,
     stabilityInferencer: StabilityInferencer,
     featureFlags: FeatureFlags,
-) : AbstractComposeLowering(context, symbolRemapper, metrics, stabilityInferencer, featureFlags),
-
+) :
+    AbstractComposeLowering(context, symbolRemapper, metrics, stabilityInferencer, featureFlags),
     ModuleLoweringPass {
 
     private val declarationContextStack = mutableListOf<DeclarationContext>()
 
     private val currentFunctionContext: FunctionContext?
-        get() =
-            declarationContextStack.peek()?.functionContext
+        get() = declarationContextStack.peek()?.functionContext
 
     private var composableSingletonsClass: IrClass? = null
     private var currentFile: IrFile? = null
@@ -354,41 +387,41 @@
         val declaration = currentFile!!
         val filePath = declaration.fileEntry.name
         val fileName = filePath.split('/').last()
-        val current = context.irFactory.buildClass {
-            startOffset = SYNTHETIC_OFFSET
-            endOffset = SYNTHETIC_OFFSET
-            kind = ClassKind.OBJECT
-            visibility = DescriptorVisibilities.INTERNAL
-            val shortName = PackagePartClassUtils.getFilePartShortName(fileName)
-            // the name of the LiveLiterals class is per-file, so we use the same name that
-            // the kotlin file class lowering produces, prefixed with `LiveLiterals$`.
-            name = Name.identifier("ComposableSingletons${"$"}$shortName")
-        }.also {
-            it.createParameterDeclarations()
-
-            // store the full file path to the file that this class is associated with in an
-            // annotation on the class. This will be used by tooling to associate the keys
-            // inside of this class with actual PSI in the editor.
-            it.addConstructor {
-                isPrimary = true
-            }.also { constructor ->
-                constructor.body = DeclarationIrBuilder(context, it.symbol).irBlockBody {
-                    +irDelegatingConstructorCall(
-                        context
-                            .irBuiltIns
-                            .anyClass
-                            .owner
-                            .primaryConstructor!!
-                    )
-                    +IrInstanceInitializerCallImpl(
-                        startOffset = this.startOffset,
-                        endOffset = this.endOffset,
-                        classSymbol = it.symbol,
-                        type = it.defaultType
-                    )
+        val current =
+            context.irFactory
+                .buildClass {
+                    startOffset = SYNTHETIC_OFFSET
+                    endOffset = SYNTHETIC_OFFSET
+                    kind = ClassKind.OBJECT
+                    visibility = DescriptorVisibilities.INTERNAL
+                    val shortName = PackagePartClassUtils.getFilePartShortName(fileName)
+                    // the name of the LiveLiterals class is per-file, so we use the same name that
+                    // the kotlin file class lowering produces, prefixed with `LiveLiterals$`.
+                    name = Name.identifier("ComposableSingletons${"$"}$shortName")
                 }
-            }
-        }.markAsComposableSingletonClass()
+                .also {
+                    it.createParameterDeclarations()
+
+                    // store the full file path to the file that this class is associated with in an
+                    // annotation on the class. This will be used by tooling to associate the keys
+                    // inside of this class with actual PSI in the editor.
+                    it.addConstructor { isPrimary = true }
+                        .also { constructor ->
+                            constructor.body =
+                                DeclarationIrBuilder(context, it.symbol).irBlockBody {
+                                    +irDelegatingConstructorCall(
+                                        context.irBuiltIns.anyClass.owner.primaryConstructor!!
+                                    )
+                                    +IrInstanceInitializerCallImpl(
+                                        startOffset = this.startOffset,
+                                        endOffset = this.endOffset,
+                                        classSymbol = it.symbol,
+                                        type = it.defaultType
+                                    )
+                                }
+                        }
+                }
+                .markAsComposableSingletonClass()
         composableSingletonsClass = current
         return current
     }
@@ -421,8 +454,7 @@
     }
 
     override fun visitDeclaration(declaration: IrDeclarationBase): IrStatement {
-        if (declaration is IrFunction)
-            return super.visitDeclaration(declaration)
+        if (declaration is IrFunction) return super.visitDeclaration(declaration)
 
         val functionContext = currentFunctionContext
         if (functionContext != null) {
@@ -450,9 +482,10 @@
     }
 
     private val IrFunction.allowsComposableCalls: Boolean
-        get() = hasComposableAnnotation() ||
-            inlineLambdaInfo.preservesComposableScope(this) &&
-            declarationContextStack.peek()?.composable == true
+        get() =
+            hasComposableAnnotation() ||
+                inlineLambdaInfo.preservesComposableScope(this) &&
+                    declarationContextStack.peek()?.composable == true
 
     override fun visitFunction(declaration: IrFunction): IrStatement {
         val composable = declaration.allowsComposableCalls
@@ -539,11 +572,12 @@
     ): IrExpression {
         // Get the local captures for local function ref, to make sure we invalidate memoized
         // reference if its capture is different.
-        val localCaptures = if (reference.symbol.owner.visibility == DescriptorVisibilities.LOCAL) {
-            declarationContextStack.recordLocalCapture(reference.symbol.owner)
-        } else {
-            null
-        }
+        val localCaptures =
+            if (reference.symbol.owner.visibility == DescriptorVisibilities.LOCAL) {
+                declarationContextStack.recordLocalCapture(reference.symbol.owner)
+            } else {
+                null
+            }
         val functionContext = currentFunctionContext ?: return expression
 
         // The syntax <expr>::<method>(<params>) and ::<function>(<params>) is reserved for
@@ -571,8 +605,7 @@
 
             val hasReceiver = dispatchReceiver != null || extensionReceiver != null
             val receiverIsStable =
-                dispatchReceiver.isNullOrStable() &&
-                    extensionReceiver.isNullOrStable()
+                dispatchReceiver.isNullOrStable() && extensionReceiver.isNullOrStable()
 
             val captures = mutableListOf<IrValueDeclaration>()
             if (localCaptures != null) {
@@ -582,35 +615,32 @@
             if (hasReceiver && (FeatureFlag.StrongSkipping.enabled || receiverIsStable)) {
                 // Save the receivers into a temporaries and memoize the function reference using
                 // the resulting temporaries
-                val builder = DeclarationIrBuilder(
-                    generatorContext = context,
-                    symbol = functionContext.symbol,
-                    startOffset = expression.startOffset,
-                    endOffset = expression.endOffset
-                )
-                return builder.irBlock(
-                    resultType = expression.type
-                ) {
-                    val tempDispatchReceiver = dispatchReceiver?.let {
-                        val tmp = irTemporary(it)
-                        captures.add(tmp)
-                        tmp
-                    }
-                    val tempExtensionReceiver = extensionReceiver?.let {
-                        val tmp = irTemporary(it)
-                        captures.add(tmp)
-                        tmp
-                    }
+                val builder =
+                    DeclarationIrBuilder(
+                        generatorContext = context,
+                        symbol = functionContext.symbol,
+                        startOffset = expression.startOffset,
+                        endOffset = expression.endOffset
+                    )
+                return builder.irBlock(resultType = expression.type) {
+                    val tempDispatchReceiver =
+                        dispatchReceiver?.let {
+                            val tmp = irTemporary(it)
+                            captures.add(tmp)
+                            tmp
+                        }
+                    val tempExtensionReceiver =
+                        extensionReceiver?.let {
+                            val tmp = irTemporary(it)
+                            captures.add(tmp)
+                            tmp
+                        }
 
                     // Patch reference receiver in place
                     reference.dispatchReceiver = tempDispatchReceiver?.let { irGet(it) }
                     reference.extensionReceiver = tempExtensionReceiver?.let { irGet(it) }
 
-                    +rememberExpression(
-                        functionContext,
-                        expression,
-                        captures
-                    )
+                    +rememberExpression(functionContext, expression, captures)
                 }
             } else if (dispatchReceiver == null && extensionReceiver == null) {
                 return rememberExpression(functionContext, expression, captures)
@@ -625,7 +655,7 @@
         // We only need to make sure that remember is handled correctly around type operator
         if (
             expression.operator != IrTypeOperator.SAM_CONVERSION ||
-            currentFunctionContext?.canRemember != true
+                currentFunctionContext?.canRemember != true
         ) {
             return super.visitTypeOperator(expression)
         }
@@ -645,28 +675,28 @@
         val newFunctionExpression = result as? IrFunctionExpression ?: return result
 
         // Construct new type operator call to wrap remember around.
-        val newArgument = when (val argument = expression.argument) {
-            is IrFunctionExpression -> newFunctionExpression
-            is IrTypeOperatorCall -> {
-                require(
-                    argument.operator == IrTypeOperator.IMPLICIT_CAST &&
-                        argument.argument == originalFunctionExpression
-                ) {
-                    "Only implicit cast is supported inside SAM conversion"
+        val newArgument =
+            when (val argument = expression.argument) {
+                is IrFunctionExpression -> newFunctionExpression
+                is IrTypeOperatorCall -> {
+                    require(
+                        argument.operator == IrTypeOperator.IMPLICIT_CAST &&
+                            argument.argument == originalFunctionExpression
+                    ) {
+                        "Only implicit cast is supported inside SAM conversion"
+                    }
+                    IrTypeOperatorCallImpl(
+                        argument.startOffset,
+                        argument.endOffset,
+                        argument.type,
+                        argument.operator,
+                        argument.typeOperand,
+                        newFunctionExpression
+                    )
                 }
-                IrTypeOperatorCallImpl(
-                    argument.startOffset,
-                    argument.endOffset,
-                    argument.type,
-                    argument.operator,
-                    argument.typeOperand,
-                    newFunctionExpression
-                )
+                else -> error("Unknown ")
             }
 
-            else -> error("Unknown ")
-        }
-
         val expressionToRemember =
             IrTypeOperatorCallImpl(
                 expression.startOffset,
@@ -686,14 +716,14 @@
     private fun visitNonComposableFunctionExpression(
         expression: IrFunctionExpression,
     ): IrExpression {
-        val functionContext = currentFunctionContext
-            ?: return super.visitFunctionExpression(expression)
+        val functionContext =
+            currentFunctionContext ?: return super.visitFunctionExpression(expression)
 
         if (
-        // Only memoize non-composable lambdas in a context we can use remember
+            // Only memoize non-composable lambdas in a context we can use remember
             !functionContext.canRemember ||
-            // Don't memoize inlined lambdas
-            inlineLambdaInfo.isInlineLambda(expression.function)
+                // Don't memoize inlined lambdas
+                inlineLambdaInfo.isInlineLambda(expression.function)
         ) {
             return super.visitFunctionExpression(expression)
         }
@@ -708,11 +738,7 @@
         // If the ancestor converted this then return
         val functionExpression = result as? IrFunctionExpression ?: return result
 
-        return rememberExpression(
-            functionContext,
-            functionExpression,
-            collector.captures.toList()
-        )
+        return rememberExpression(functionContext, functionExpression, collector.captures.toList())
     }
 
     override fun visitCall(expression: IrCall): IrExpression {
@@ -761,11 +787,7 @@
 
         val wrapped = wrapFunctionExpression(declarationContext, functionExpression, collector)
 
-        metrics.recordLambda(
-            composable = true,
-            memoized = true,
-            singleton = !collector.hasCaptures
-        )
+        metrics.recordLambda(composable = true, memoized = true, singleton = !collector.hasCaptures)
 
         if (!collector.hasCaptures) {
             if (!context.platform.isJvm() && hasTypeParameter(expression.type)) {
@@ -796,54 +818,64 @@
     ): IrExpression {
         val clazz = getOrCreateComposableSingletonsClass()
         val lambdaName = "lambda-${clazz.declarations.size}"
-        val lambdaProp = clazz.addProperty {
-            name = Name.identifier(lambdaName)
-            visibility = DescriptorVisibilities.INTERNAL
-        }.also { p ->
-            p.backingField = context.irFactory.buildField {
-                startOffset = SYNTHETIC_OFFSET
-                endOffset = SYNTHETIC_OFFSET
-                name = Name.identifier(lambdaName)
-                type = lambdaType
-                visibility = DescriptorVisibilities.INTERNAL
-                isStatic = context.platform.isJvm()
-            }.also { f ->
-                f.correspondingPropertySymbol = p.symbol
-                f.parent = clazz
-                f.initializer = DeclarationIrBuilder(context, clazz.symbol)
-                    .irExprBody(lambdaExpression.markIsTransformedLambda())
-            }
-            p.addGetter {
-                returnType = lambdaType
-                visibility = DescriptorVisibilities.INTERNAL
-                origin = IrDeclarationOrigin.DEFAULT_PROPERTY_ACCESSOR
-            }.also { fn ->
-                val thisParam = clazz.thisReceiver!!.copyTo(fn)
-                fn.parent = clazz
-                fn.dispatchReceiverParameter = thisParam
-                fn.body = DeclarationIrBuilder(context, fn.symbol).irBlockBody {
-                    +irReturn(irGetField(irGet(thisParam), p.backingField!!))
+        val lambdaProp =
+            clazz
+                .addProperty {
+                    name = Name.identifier(lambdaName)
+                    visibility = DescriptorVisibilities.INTERNAL
                 }
-            }
-        }
+                .also { p ->
+                    p.backingField =
+                        context.irFactory
+                            .buildField {
+                                startOffset = SYNTHETIC_OFFSET
+                                endOffset = SYNTHETIC_OFFSET
+                                name = Name.identifier(lambdaName)
+                                type = lambdaType
+                                visibility = DescriptorVisibilities.INTERNAL
+                                isStatic = context.platform.isJvm()
+                            }
+                            .also { f ->
+                                f.correspondingPropertySymbol = p.symbol
+                                f.parent = clazz
+                                f.initializer =
+                                    DeclarationIrBuilder(context, clazz.symbol)
+                                        .irExprBody(lambdaExpression.markIsTransformedLambda())
+                            }
+                    p.addGetter {
+                            returnType = lambdaType
+                            visibility = DescriptorVisibilities.INTERNAL
+                            origin = IrDeclarationOrigin.DEFAULT_PROPERTY_ACCESSOR
+                        }
+                        .also { fn ->
+                            val thisParam = clazz.thisReceiver!!.copyTo(fn)
+                            fn.parent = clazz
+                            fn.dispatchReceiverParameter = thisParam
+                            fn.body =
+                                DeclarationIrBuilder(context, fn.symbol).irBlockBody {
+                                    +irReturn(irGetField(irGet(thisParam), p.backingField!!))
+                                }
+                        }
+                }
         return irCall(
-            lambdaProp.getter!!.symbol,
-            dispatchReceiver = IrGetObjectValueImpl(
-                startOffset = UNDEFINED_OFFSET,
-                endOffset = UNDEFINED_OFFSET,
-                type = clazz.defaultType,
-                symbol = clazz.symbol
+                lambdaProp.getter!!.symbol,
+                dispatchReceiver =
+                    IrGetObjectValueImpl(
+                        startOffset = UNDEFINED_OFFSET,
+                        endOffset = UNDEFINED_OFFSET,
+                        type = clazz.defaultType,
+                        symbol = clazz.symbol
+                    )
             )
-        ).markAsComposableSingleton()
+            .markAsComposableSingleton()
     }
 
     override fun visitFunctionExpression(expression: IrFunctionExpression): IrExpression {
-        val declarationContext = declarationContextStack.peek()
-            ?: return super.visitFunctionExpression(expression)
+        val declarationContext =
+            declarationContextStack.peek() ?: return super.visitFunctionExpression(expression)
         return if (expression.function.allowsComposableCalls)
             visitComposableFunctionExpression(expression, declarationContext)
-        else
-            visitNonComposableFunctionExpression(expression)
+        else visitNonComposableFunctionExpression(expression)
     }
 
     private fun startCollector(collector: CaptureCollector) {
@@ -877,66 +909,62 @@
         val useComposableLambdaN = argumentCount > MAX_RESTART_ARGUMENT_COUNT
         val useComposableFactory = collector.hasCaptures && declarationContext.composable
         val rememberComposable = rememberComposableLambdaFunction ?: composableLambdaFunction
-        val requiresExplicitComposerParameter = useComposableFactory &&
-            rememberComposableLambdaFunction == null
+        val requiresExplicitComposerParameter =
+            useComposableFactory && rememberComposableLambdaFunction == null
         val restartFactorySymbol =
             if (useComposableFactory)
                 if (useComposableLambdaN)
                     rememberComposableLambdaNFunction ?: composableLambdaNFunction
                 else rememberComposable
-            else if (useComposableLambdaN)
-                composableLambdaInstanceNFunction
+            else if (useComposableLambdaN) composableLambdaInstanceNFunction
             else composableLambdaInstanceFunction
-        val irBuilder = DeclarationIrBuilder(
-            context,
-            symbol = declarationContext.symbol,
-            startOffset = expression.startOffset,
-            endOffset = expression.endOffset
-        )
+        val irBuilder =
+            DeclarationIrBuilder(
+                context,
+                symbol = declarationContext.symbol,
+                startOffset = expression.startOffset,
+                endOffset = expression.endOffset
+            )
 
         // FIXME: We should remove this call once we are sure that there is nothing relying on it.
         //        `IrPluginContextImpl` is K1 specific and `getDeclaration` doesn't do anything on
         //        the JVM backend where we produce lazy declarations for unbound symbols.
         (context as? IrPluginContextImpl)?.linker?.getDeclaration(restartFactorySymbol)
-        val composableLambdaExpression = irBuilder.irCall(restartFactorySymbol).apply {
-            var index = 0
+        val composableLambdaExpression =
+            irBuilder.irCall(restartFactorySymbol).apply {
+                var index = 0
 
-            // first parameter is the composer parameter if we are using the composable factory
-            if (requiresExplicitComposerParameter) {
-                putValueArgument(
-                    index++,
-                    irCurrentComposer()
-                )
-            }
+                // first parameter is the composer parameter if we are using the composable factory
+                if (requiresExplicitComposerParameter) {
+                    putValueArgument(index++, irCurrentComposer())
+                }
 
-            // key parameter
-            putValueArgument(
-                index++,
-                irBuilder.irInt(expression.function.sourceKey())
-            )
+                // key parameter
+                putValueArgument(index++, irBuilder.irInt(expression.function.sourceKey()))
 
-            // tracked parameter
-            // If the lambda has no captures, then kotlin will turn it into a singleton instance,
-            // which means that it will never change, thus does not need to be tracked.
-            val shouldBeTracked = collector.captures.isNotEmpty()
-            putValueArgument(index++, irBuilder.irBoolean(shouldBeTracked))
+                // tracked parameter
+                // If the lambda has no captures, then kotlin will turn it into a singleton
+                // instance,
+                // which means that it will never change, thus does not need to be tracked.
+                val shouldBeTracked = collector.captures.isNotEmpty()
+                putValueArgument(index++, irBuilder.irBoolean(shouldBeTracked))
 
-            // ComposableLambdaN requires the arity
-            if (useComposableLambdaN) {
-                // arity parameter
-                putValueArgument(index++, irBuilder.irInt(argumentCount))
-            }
-            if (index >= valueArgumentsCount) {
-                error(
-                    "function = ${
+                // ComposableLambdaN requires the arity
+                if (useComposableLambdaN) {
+                    // arity parameter
+                    putValueArgument(index++, irBuilder.irInt(argumentCount))
+                }
+                if (index >= valueArgumentsCount) {
+                    error(
+                        "function = ${
                         function.name.asString()
                     }, count = $valueArgumentsCount, index = $index"
-                )
-            }
+                    )
+                }
 
-            // block parameter
-            putValueArgument(index, expression.markIsTransformedLambda())
-        }
+                // block parameter
+                putValueArgument(index, expression.markIsTransformedLambda())
+            }
 
         return composableLambdaExpression.markHasTransformedLambda()
     }
@@ -949,21 +977,16 @@
         val memoizeLambdasWithoutCaptures =
             // Kotlin/JS doesn't have an optimization for non-capturing lambdas
             // https://youtrack.jetbrains.com/issue/KT-49923
-            context.platform.isJs() || context.platform.isWasm() ||
+            context.platform.isJs() ||
+                context.platform.isWasm() ||
                 (
-                    // K2 uses invokedynamic for lambdas, which doesn't perform lambda optimization
-                    // on Android.
-                    context.platform.isJvm() &&
-                        context.languageVersionSettings.languageVersion.usesK2
-                )
+                // K2 uses invokedynamic for lambdas, which doesn't perform lambda optimization
+                // on Android.
+                context.platform.isJvm() && context.languageVersionSettings.languageVersion.usesK2)
 
         // If the function doesn't capture, Kotlin's default optimization is sufficient
         if (!memoizeLambdasWithoutCaptures && captures.isEmpty()) {
-            metrics.recordLambda(
-                composable = false,
-                memoized = true,
-                singleton = true
-            )
+            metrics.recordLambda(composable = false, memoized = true, singleton = true)
             return expression.markAsStatic(true)
         }
 
@@ -972,64 +995,58 @@
         // or inlined lambdas.
         if (
             functionContext.declaration.hasAnnotation(ComposeFqNames.DontMemoize) ||
-            expression.hasDontMemoizeAnnotation ||
-            captures.any {
-                it.isVar() ||
-                    (!it.isStable() && !FeatureFlag.StrongSkipping.enabled) ||
-                    it.isInlinedLambda()
-            }
+                expression.hasDontMemoizeAnnotation ||
+                captures.any {
+                    it.isVar() ||
+                        (!it.isStable() && !FeatureFlag.StrongSkipping.enabled) ||
+                        it.isInlinedLambda()
+                }
         ) {
-            metrics.recordLambda(
-                composable = false,
-                memoized = false,
-                singleton = false
-            )
+            metrics.recordLambda(composable = false, memoized = false, singleton = false)
             return expression
         }
 
         val captureExpressions = captures.map { irGet(it) }
-        metrics.recordLambda(
-            composable = false,
-            memoized = true,
-            singleton = false
-        )
+        metrics.recordLambda(composable = false, memoized = true, singleton = false)
 
         return if (!FeatureFlag.IntrinsicRemember.enabled) {
-            // generate cache directly only if strong skipping is enabled without intrinsic remember
-            // otherwise, generated memoization won't benefit from capturing changed values
-            irCache(captureExpressions, expression)
-        } else {
-            irRemember(captureExpressions, expression)
-        }.patchDeclarationParents(functionContext.declaration)
+                // generate cache directly only if strong skipping is enabled without intrinsic
+                // remember
+                // otherwise, generated memoization won't benefit from capturing changed values
+                irCache(captureExpressions, expression)
+            } else {
+                irRemember(captureExpressions, expression)
+            }
+            .patchDeclarationParents(functionContext.declaration)
     }
 
     private fun irCache(
         captures: List<IrExpression>,
         expression: IrExpression,
     ): IrExpression {
-        val invalidExpr = captures
-            .map(::irChanged)
-            .reduceOrNull { acc, changed -> irBooleanOr(acc, changed) }
-            ?: irConst(false)
+        val invalidExpr =
+            captures.map(::irChanged).reduceOrNull { acc, changed -> irBooleanOr(acc, changed) }
+                ?: irConst(false)
 
-        val calculation = irLambdaExpression(
-            startOffset = UNDEFINED_OFFSET,
-            endOffset = UNDEFINED_OFFSET,
-            returnType = expression.type
-        ) { fn ->
-            fn.body = DeclarationIrBuilder(context, fn.symbol).irBlockBody {
-                +irReturn(expression)
+        val calculation =
+            irLambdaExpression(
+                startOffset = UNDEFINED_OFFSET,
+                endOffset = UNDEFINED_OFFSET,
+                returnType = expression.type
+            ) { fn ->
+                fn.body =
+                    DeclarationIrBuilder(context, fn.symbol).irBlockBody { +irReturn(expression) }
             }
-        }
 
-        val cache = irCache(
-            irCurrentComposer(),
-            expression.startOffset,
-            expression.endOffset,
-            expression.type,
-            invalidExpr,
-            calculation
-        )
+        val cache =
+            irCache(
+                irCurrentComposer(),
+                expression.startOffset,
+                expression.endOffset,
+                expression.type,
+                invalidExpr,
+                calculation
+            )
 
         return if (useNonSkippingGroupOptimization) {
             cache
@@ -1042,18 +1059,12 @@
             cacheTmpVar.wrap(
                 type = expression.type,
                 before = listOf(irStartReplaceGroup(irCurrentComposer(), irConst(key))),
-                after = listOf(
-                    irEndReplaceGroup(irCurrentComposer()),
-                    irGet(cacheTmpVar)
-                )
+                after = listOf(irEndReplaceGroup(irCurrentComposer()), irGet(cacheTmpVar))
             )
         }
     }
 
-    private fun irRemember(
-        captures: List<IrExpression>,
-        expression: IrExpression
-    ): IrExpression {
+    private fun irRemember(captures: List<IrExpression>, expression: IrExpression): IrExpression {
         val directRememberFunction = // Exclude the varargs version
             rememberFunctions.singleOrNull {
                 // captures + calculation arg
@@ -1061,75 +1072,82 @@
                     // Exclude the varargs version
                     it.valueParameters.firstOrNull()?.varargElementType == null
             }
-        val rememberFunction = directRememberFunction
-            ?: rememberFunctions.single {
-                // Use the varargs version
-                it.valueParameters.firstOrNull()?.varargElementType != null
-            }
+        val rememberFunction =
+            directRememberFunction
+                ?: rememberFunctions.single {
+                    // Use the varargs version
+                    it.valueParameters.firstOrNull()?.varargElementType != null
+                }
 
         val rememberFunctionSymbol = referenceSimpleFunction(rememberFunction.symbol)
-        val irBuilder = DeclarationIrBuilder(
-            generatorContext = context,
-            symbol = currentFunctionContext!!.symbol,
-            startOffset = expression.startOffset,
-            endOffset = expression.endOffset
-        )
-
-        return irBuilder.irCall(
-            callee = rememberFunctionSymbol,
-            type = expression.type,
-            origin = ComposeMemoizedLambdaOrigin
-        ).apply {
-            // The result type type parameter is first, followed by the argument types
-            putTypeArgument(0, expression.type)
-            val lambdaArgumentIndex = if (directRememberFunction != null) {
-                // condition arguments are the first `arg.size` arguments
-                for (i in captures.indices) {
-                    putValueArgument(i, captures[i])
-                }
-                // The lambda is the last parameter
-                captures.size
-            } else {
-                val parameterType = rememberFunction.valueParameters[0].type
-                // Call to the vararg version
-                putValueArgument(
-                    0,
-                    IrVarargImpl(
-                        startOffset = UNDEFINED_OFFSET,
-                        endOffset = UNDEFINED_OFFSET,
-                        type = parameterType,
-                        varargElementType = context.irBuiltIns.anyType,
-                        elements = captures
-                    )
-                )
-                1
-            }
-
-            putValueArgument(
-                index = lambdaArgumentIndex,
-                valueArgument = irLambdaExpression(
-                    startOffset = expression.startOffset,
-                    endOffset = expression.endOffset,
-                    returnType = expression.type
-                ) { fn ->
-                    fn.body = DeclarationIrBuilder(context, fn.symbol).irBlockBody {
-                        +irReturn(expression)
-                    }
-                }
+        val irBuilder =
+            DeclarationIrBuilder(
+                generatorContext = context,
+                symbol = currentFunctionContext!!.symbol,
+                startOffset = expression.startOffset,
+                endOffset = expression.endOffset
             )
-        }
+
+        return irBuilder
+            .irCall(
+                callee = rememberFunctionSymbol,
+                type = expression.type,
+                origin = ComposeMemoizedLambdaOrigin
+            )
+            .apply {
+                // The result type type parameter is first, followed by the argument types
+                putTypeArgument(0, expression.type)
+                val lambdaArgumentIndex =
+                    if (directRememberFunction != null) {
+                        // condition arguments are the first `arg.size` arguments
+                        for (i in captures.indices) {
+                            putValueArgument(i, captures[i])
+                        }
+                        // The lambda is the last parameter
+                        captures.size
+                    } else {
+                        val parameterType = rememberFunction.valueParameters[0].type
+                        // Call to the vararg version
+                        putValueArgument(
+                            0,
+                            IrVarargImpl(
+                                startOffset = UNDEFINED_OFFSET,
+                                endOffset = UNDEFINED_OFFSET,
+                                type = parameterType,
+                                varargElementType = context.irBuiltIns.anyType,
+                                elements = captures
+                            )
+                        )
+                        1
+                    }
+
+                putValueArgument(
+                    index = lambdaArgumentIndex,
+                    valueArgument =
+                        irLambdaExpression(
+                            startOffset = expression.startOffset,
+                            endOffset = expression.endOffset,
+                            returnType = expression.type
+                        ) { fn ->
+                            fn.body =
+                                DeclarationIrBuilder(context, fn.symbol).irBlockBody {
+                                    +irReturn(expression)
+                                }
+                        }
+                )
+            }
     }
 
-    private fun irChanged(value: IrExpression): IrExpression = irChanged(
-        irCurrentComposer(),
-        value,
-        inferredStable = false,
-        compareInstanceForFunctionTypes = false,
-        compareInstanceForUnstableValues = FeatureFlag.StrongSkipping.enabled
-    )
+    private fun irChanged(value: IrExpression): IrExpression =
+        irChanged(
+            irCurrentComposer(),
+            value,
+            inferredStable = false,
+            compareInstanceForFunctionTypes = false,
+            compareInstanceForUnstableValues = FeatureFlag.StrongSkipping.enabled
+        )
 
-    private fun IrValueDeclaration.isVar(): Boolean =
-        (this as? IrVariable)?.isVar == true
+    private fun IrValueDeclaration.isVar(): Boolean = (this as? IrVariable)?.isVar == true
 
     private fun IrValueDeclaration.isStable(): Boolean =
         stabilityInferencer.stabilityOf(type).knownStable()
@@ -1149,11 +1167,7 @@
         if (mark) {
             // Mark it so the ComposableCallTransformer will insert the correct code around this
             // call
-            context.irTrace.record(
-                ComposeWritableSlices.IS_STATIC_FUNCTION_EXPRESSION,
-                this,
-                true
-            )
+            context.irTrace.record(ComposeWritableSlices.IS_STATIC_FUNCTION_EXPRESSION, this, true)
         }
         return this
     }
@@ -1161,51 +1175,35 @@
     private fun <T : IrAttributeContainer> T.markAsComposableSingleton(): T {
         // Mark it so the ComposableCallTransformer can insert the correct source information
         // around this call
-        context.irTrace.record(
-            ComposeWritableSlices.IS_COMPOSABLE_SINGLETON,
-            this,
-            true
-        )
+        context.irTrace.record(ComposeWritableSlices.IS_COMPOSABLE_SINGLETON, this, true)
         return this
     }
 
     private fun <T : IrAttributeContainer> T.markAsComposableSingletonClass(): T {
         // Mark it so the ComposableCallTransformer can insert the correct source information
         // around this call
-        context.irTrace.record(
-            ComposeWritableSlices.IS_COMPOSABLE_SINGLETON_CLASS,
-            this,
-            true
-        )
+        context.irTrace.record(ComposeWritableSlices.IS_COMPOSABLE_SINGLETON_CLASS, this, true)
         return this
     }
 
     private fun <T : IrAttributeContainer> T.markHasTransformedLambda(): T {
         // Mark so that the target annotation transformer can find the original lambda
-        context.irTrace.record(
-            ComposeWritableSlices.HAS_TRANSFORMED_LAMBDA,
-            this,
-            true
-        )
+        context.irTrace.record(ComposeWritableSlices.HAS_TRANSFORMED_LAMBDA, this, true)
         return this
     }
 
     private fun <T : IrAttributeContainer> T.markIsTransformedLambda(): T {
-        context.irTrace.record(
-            ComposeWritableSlices.IS_TRANSFORMED_LAMBDA,
-            this,
-            true
-        )
+        context.irTrace.record(ComposeWritableSlices.IS_TRANSFORMED_LAMBDA, this, true)
         return this
     }
 
     private val IrExpression.hasDontMemoizeAnnotation: Boolean
-        get() = (this as? IrFunctionExpression)?.function?.hasAnnotation(ComposeFqNames.DontMemoize)
-            ?: false
+        get() =
+            (this as? IrFunctionExpression)?.function?.hasAnnotation(ComposeFqNames.DontMemoize)
+                ?: false
 
     private fun IrExpression?.isNullOrStable() =
-        this == null ||
-            stabilityInferencer.stabilityOf(this).knownStable()
+        this == null || stabilityInferencer.stabilityOf(this).knownStable()
 }
 
 // This must match the highest value of FunctionXX which is current Function22
diff --git a/compose/compiler/compiler-hosted/src/main/java/androidx/compose/compiler/plugins/kotlin/lower/ComposerParamTransformer.kt b/compose/compiler/compiler-hosted/src/main/java/androidx/compose/compiler/plugins/kotlin/lower/ComposerParamTransformer.kt
index 5acd183..769c332 100644
--- a/compose/compiler/compiler-hosted/src/main/java/androidx/compose/compiler/plugins/kotlin/lower/ComposerParamTransformer.kt
+++ b/compose/compiler/compiler-hosted/src/main/java/androidx/compose/compiler/plugins/kotlin/lower/ComposerParamTransformer.kt
@@ -107,8 +107,8 @@
     ModuleLoweringPass {
 
     /**
-     * Used to identify module fragment in case of incremental compilation
-     * see [externallyTransformed]
+     * Used to identify module fragment in case of incremental compilation see
+     * [externallyTransformed]
      */
     private var currentModule: IrModuleFragment? = null
 
@@ -123,23 +123,15 @@
 
         module.acceptVoid(symbolRemapper)
 
-        val typeRemapper = ComposerTypeRemapper(
-            context,
-            symbolRemapper,
-            composerType
-        )
+        val typeRemapper = ComposerTypeRemapper(context, symbolRemapper, composerType)
         // for each declaration, we create a deepCopy transformer It is important here that we
         // use the "preserving metadata" variant since we are using this copy to *replace* the
         // originals, or else the module we would produce wouldn't have any metadata in it.
-        val transformer = DeepCopyIrTreeWithRemappedComposableTypes(
-            context,
-            symbolRemapper,
-            typeRemapper
-        ).also { typeRemapper.deepCopy = it }
-        module.transformChildren(
-            transformer,
-            null
-        )
+        val transformer =
+            DeepCopyIrTreeWithRemappedComposableTypes(context, symbolRemapper, typeRemapper).also {
+                typeRemapper.deepCopy = it
+            }
+        module.transformChildren(transformer, null)
         // just go through and patch all of the parents to make sure things are properly wired
         // up.
         module.patchDeclarationParents()
@@ -197,90 +189,78 @@
         )
 
     fun IrCall.withComposerParamIfNeeded(composerParam: IrValueParameter): IrCall {
-        val ownerFn = when {
-            symbol.owner.isComposableDelegatedAccessor() -> {
-                if (!symbol.owner.hasComposableAnnotation()) {
-                    symbol.owner.annotations += createComposableAnnotation()
+        val ownerFn =
+            when {
+                symbol.owner.isComposableDelegatedAccessor() -> {
+                    if (!symbol.owner.hasComposableAnnotation()) {
+                        symbol.owner.annotations += createComposableAnnotation()
+                    }
+                    symbol.owner.withComposerParamIfNeeded()
                 }
-                symbol.owner.withComposerParamIfNeeded()
+                isComposableLambdaInvoke() -> symbol.owner.lambdaInvokeWithComposerParam()
+                symbol.owner.hasComposableAnnotation() -> symbol.owner.withComposerParamIfNeeded()
+                // Not a composable call
+                else -> return this
             }
-            isComposableLambdaInvoke() ->
-                symbol.owner.lambdaInvokeWithComposerParam()
-            symbol.owner.hasComposableAnnotation() ->
-                symbol.owner.withComposerParamIfNeeded()
-            // Not a composable call
-            else -> return this
-        }
 
         return IrCallImpl(
-            startOffset,
-            endOffset,
-            type,
-            ownerFn.symbol,
-            typeArgumentsCount,
-            ownerFn.valueParameters.size,
-            origin,
-            superQualifierSymbol
-        ).also {
-            it.copyAttributes(this)
-            it.copyTypeArgumentsFrom(this)
-            it.dispatchReceiver = dispatchReceiver
-            it.extensionReceiver = extensionReceiver
-            val argumentsMissing = mutableListOf<Boolean>()
-            for (i in 0 until valueArgumentsCount) {
-                val arg = getValueArgument(i)
-                val param = ownerFn.valueParameters[i]
-                val hasDefault = ownerFn.hasDefaultExpressionDefinedForValueParameter(i)
-                argumentsMissing.add(arg == null && hasDefault)
-                if (arg != null) {
-                    it.putValueArgument(i, arg)
-                } else if (param.isVararg) {
-                    // do nothing
-                } else {
-                    it.putValueArgument(i, defaultArgumentFor(param))
-                }
-            }
-            val valueParams = valueArgumentsCount
-            val realValueParams = valueParams - ownerFn.contextReceiverParametersCount
-            var argIndex = valueArgumentsCount
-            it.putValueArgument(
-                argIndex++,
-                IrGetValueImpl(
-                    UNDEFINED_OFFSET,
-                    UNDEFINED_OFFSET,
-                    composerParam.symbol
-                )
+                startOffset,
+                endOffset,
+                type,
+                ownerFn.symbol,
+                typeArgumentsCount,
+                ownerFn.valueParameters.size,
+                origin,
+                superQualifierSymbol
             )
+            .also {
+                it.copyAttributes(this)
+                it.copyTypeArgumentsFrom(this)
+                it.dispatchReceiver = dispatchReceiver
+                it.extensionReceiver = extensionReceiver
+                val argumentsMissing = mutableListOf<Boolean>()
+                for (i in 0 until valueArgumentsCount) {
+                    val arg = getValueArgument(i)
+                    val param = ownerFn.valueParameters[i]
+                    val hasDefault = ownerFn.hasDefaultExpressionDefinedForValueParameter(i)
+                    argumentsMissing.add(arg == null && hasDefault)
+                    if (arg != null) {
+                        it.putValueArgument(i, arg)
+                    } else if (param.isVararg) {
+                        // do nothing
+                    } else {
+                        it.putValueArgument(i, defaultArgumentFor(param))
+                    }
+                }
+                val valueParams = valueArgumentsCount
+                val realValueParams = valueParams - ownerFn.contextReceiverParametersCount
+                var argIndex = valueArgumentsCount
+                it.putValueArgument(
+                    argIndex++,
+                    IrGetValueImpl(UNDEFINED_OFFSET, UNDEFINED_OFFSET, composerParam.symbol)
+                )
 
-            // $changed[n]
-            for (i in 0 until changedParamCount(realValueParams, ownerFn.thisParamCount)) {
-                if (argIndex < ownerFn.valueParameters.size) {
-                    it.putValueArgument(
-                        argIndex++,
-                        irConst(0)
-                    )
-                } else {
-                    error("1. expected value parameter count to be higher: ${this.dumpSrc()}")
+                // $changed[n]
+                for (i in 0 until changedParamCount(realValueParams, ownerFn.thisParamCount)) {
+                    if (argIndex < ownerFn.valueParameters.size) {
+                        it.putValueArgument(argIndex++, irConst(0))
+                    } else {
+                        error("1. expected value parameter count to be higher: ${this.dumpSrc()}")
+                    }
+                }
+
+                // $default[n]
+                for (i in 0 until defaultParamCount(valueParams)) {
+                    val start = i * BITS_PER_INT
+                    val end = min(start + BITS_PER_INT, valueParams)
+                    if (argIndex < ownerFn.valueParameters.size) {
+                        val bits = argumentsMissing.toBooleanArray().sliceArray(start until end)
+                        it.putValueArgument(argIndex++, irConst(bitMask(*bits)))
+                    } else if (argumentsMissing.any { it }) {
+                        error("2. expected value parameter count to be higher: ${this.dumpSrc()}")
+                    }
                 }
             }
-
-            // $default[n]
-            for (i in 0 until defaultParamCount(valueParams)) {
-                val start = i * BITS_PER_INT
-                val end = min(start + BITS_PER_INT, valueParams)
-                if (argIndex < ownerFn.valueParameters.size) {
-                    val bits = argumentsMissing
-                        .toBooleanArray()
-                        .sliceArray(start until end)
-                    it.putValueArgument(
-                        argIndex++,
-                        irConst(bitMask(*bits))
-                    )
-                } else if (argumentsMissing.any { it }) {
-                    error("2. expected value parameter count to be higher: ${this.dumpSrc()}")
-                }
-            }
-        }
     }
 
     private fun defaultArgumentFor(param: IrValueParameter): IrExpression? {
@@ -328,21 +308,23 @@
             // TODO(lmr): We should not be calling the constructor here, but this seems like a
             //  reasonable interim solution.
             return IrConstructorCallImpl(
-                startOffset,
-                endOffset,
-                this,
-                ctor,
-                typeArgumentsCount = 0,
-                constructorTypeArgumentsCount = 0,
-                valueArgumentsCount = 1,
-                origin = null
-            ).also {
-                it.putValueArgument(0, underlyingType.defaultValue(startOffset, endOffset))
-            }
+                    startOffset,
+                    endOffset,
+                    this,
+                    ctor,
+                    typeArgumentsCount = 0,
+                    constructorTypeArgumentsCount = 0,
+                    valueArgumentsCount = 1,
+                    origin = null
+                )
+                .also {
+                    it.putValueArgument(0, underlyingType.defaultValue(startOffset, endOffset))
+                }
         }
     }
 
-    // Transform `@Composable fun foo(params): RetType` into `fun foo(params, $composer: Composer): RetType`
+    // Transform `@Composable fun foo(params): RetType` into `fun foo(params, $composer: Composer):
+    // RetType`
     private fun IrSimpleFunction.withComposerParamIfNeeded(): IrSimpleFunction {
         // don't transform functions that themselves were produced by this function. (ie, if we
         // call this with a function that has the synthetic composer parameter, we don't want to
@@ -374,98 +356,93 @@
         val argCount = valueParameters.size
         val extraParams = composeSyntheticParamCount(argCount)
         val newFnClass = context.function(argCount + extraParams).owner
-        val newInvoke = newFnClass.functions.first {
-            it.name == OperatorNameConventions.INVOKE
-        }
+        val newInvoke = newFnClass.functions.first { it.name == OperatorNameConventions.INVOKE }
         return newInvoke
     }
 
     private fun IrSimpleFunction.copy(): IrSimpleFunction {
         // TODO(lmr): use deepCopy instead?
-        return context.irFactory.createSimpleFunction(
-            startOffset = startOffset,
-            endOffset = endOffset,
-            origin = origin,
-            name = name,
-            visibility = visibility,
-            isInline = isInline,
-            isExpect = isExpect,
-            returnType = returnType,
-            modality = modality,
-            symbol = IrSimpleFunctionSymbolImpl(),
-            isTailrec = isTailrec,
-            isSuspend = isSuspend,
-            isOperator = isOperator,
-            isInfix = isInfix,
-            isExternal = isExternal,
-            containerSource = containerSource
-        ).also { fn ->
-            fn.copyAttributes(this)
-            val propertySymbol = correspondingPropertySymbol
-            if (propertySymbol != null) {
-                fn.correspondingPropertySymbol = propertySymbol
-                if (propertySymbol.owner.getter == this) {
-                    propertySymbol.owner.getter = fn
+        return context.irFactory
+            .createSimpleFunction(
+                startOffset = startOffset,
+                endOffset = endOffset,
+                origin = origin,
+                name = name,
+                visibility = visibility,
+                isInline = isInline,
+                isExpect = isExpect,
+                returnType = returnType,
+                modality = modality,
+                symbol = IrSimpleFunctionSymbolImpl(),
+                isTailrec = isTailrec,
+                isSuspend = isSuspend,
+                isOperator = isOperator,
+                isInfix = isInfix,
+                isExternal = isExternal,
+                containerSource = containerSource
+            )
+            .also { fn ->
+                fn.copyAttributes(this)
+                val propertySymbol = correspondingPropertySymbol
+                if (propertySymbol != null) {
+                    fn.correspondingPropertySymbol = propertySymbol
+                    if (propertySymbol.owner.getter == this) {
+                        propertySymbol.owner.getter = fn
+                    }
+                    if (propertySymbol.owner.setter == this) {
+                        propertySymbol.owner.setter = fn
+                    }
                 }
-                if (propertySymbol.owner.setter == this) {
-                    propertySymbol.owner.setter = fn
-                }
+                fn.parent = parent
+                fn.copyTypeParametersFrom(this)
+
+                fun IrType.remapTypeParameters(): IrType = remapTypeParameters(this@copy, fn)
+
+                fn.returnType = returnType.remapTypeParameters()
+
+                fn.dispatchReceiverParameter = dispatchReceiverParameter?.copyTo(fn)
+                fn.extensionReceiverParameter = extensionReceiverParameter?.copyTo(fn)
+                fn.valueParameters =
+                    valueParameters.map { param ->
+                        // Composable lambdas will always have `IrGet`s of all of their parameters
+                        // generated, since they are passed into the restart lambda. This causes an
+                        // interesting corner case with "anonymous parameters" of composable
+                        // functions.
+                        // If a parameter is anonymous (using the name `_`) in user code, you can
+                        // usually
+                        // make the assumption that it is never used, but this is technically not
+                        // the
+                        // case in composable lambdas. The synthetic name that kotlin generates for
+                        // anonymous parameters has an issue where it is not safe to dex, so we
+                        // sanitize
+                        // the names here to ensure that dex is always safe.
+                        val newName = dexSafeName(param.name)
+                        param.copyTo(
+                            fn,
+                            name = newName,
+                            isAssignable = param.defaultValue != null,
+                            defaultValue =
+                                param.defaultValue?.copyWithNewTypeParams(
+                                    source = this,
+                                    target = fn
+                                )
+                        )
+                    }
+                fn.contextReceiverParametersCount = contextReceiverParametersCount
+                fn.annotations = annotations.toList()
+                fn.metadata = metadata
+                fn.body = moveBodyTo(fn)?.copyWithNewTypeParams(this, fn)
             }
-            fn.parent = parent
-            fn.copyTypeParametersFrom(this)
-
-            fun IrType.remapTypeParameters(): IrType =
-                remapTypeParameters(this@copy, fn)
-
-            fn.returnType = returnType.remapTypeParameters()
-
-            fn.dispatchReceiverParameter = dispatchReceiverParameter?.copyTo(fn)
-            fn.extensionReceiverParameter = extensionReceiverParameter?.copyTo(fn)
-            fn.valueParameters = valueParameters.map { param ->
-                // Composable lambdas will always have `IrGet`s of all of their parameters
-                // generated, since they are passed into the restart lambda. This causes an
-                // interesting corner case with "anonymous parameters" of composable functions.
-                // If a parameter is anonymous (using the name `_`) in user code, you can usually
-                // make the assumption that it is never used, but this is technically not the
-                // case in composable lambdas. The synthetic name that kotlin generates for
-                // anonymous parameters has an issue where it is not safe to dex, so we sanitize
-                // the names here to ensure that dex is always safe.
-                val newName = dexSafeName(param.name)
-                param.copyTo(
-                    fn,
-                    name = newName,
-                    isAssignable = param.defaultValue != null,
-                    defaultValue = param.defaultValue?.copyWithNewTypeParams(
-                        source = this, target = fn
-                    )
-                )
-            }
-            fn.contextReceiverParametersCount = contextReceiverParametersCount
-            fn.annotations = annotations.toList()
-            fn.metadata = metadata
-            fn.body = moveBodyTo(fn)?.copyWithNewTypeParams(this, fn)
-        }
     }
 
     private fun jvmNameAnnotation(name: String): IrConstructorCall {
         val jvmName = getTopLevelClass(StandardClassIds.Annotations.JvmName)
         val ctor = jvmName.constructors.first { it.owner.isPrimary }
         val type = jvmName.createType(false, emptyList())
-        return IrConstructorCallImpl(
-            UNDEFINED_OFFSET,
-            UNDEFINED_OFFSET,
-            type,
-            ctor,
-            0, 0, 1
-        ).also {
+        return IrConstructorCallImpl(UNDEFINED_OFFSET, UNDEFINED_OFFSET, type, ctor, 0, 0, 1).also {
             it.putValueArgument(
                 0,
-                IrConstImpl.string(
-                    UNDEFINED_OFFSET,
-                    UNDEFINED_OFFSET,
-                    builtIns.stringType,
-                    name
-                )
+                IrConstImpl.string(UNDEFINED_OFFSET, UNDEFINED_OFFSET, builtIns.stringType, name)
             )
         }
     }
@@ -509,9 +486,8 @@
 
             // The overridden symbols might also be composable functions, so we want to make sure
             // and transform them as well
-            fn.overriddenSymbols = overriddenSymbols.map {
-                it.owner.withComposerParamIfNeeded().symbol
-            }
+            fn.overriddenSymbols =
+                overriddenSymbols.map { it.owner.withComposerParamIfNeeded().symbol }
 
             // if we are transforming a composable property, the jvm signature of the
             // corresponding getters and setters have a composer parameter. Since Kotlin uses the
@@ -522,29 +498,29 @@
             fn.correspondingPropertySymbol?.let { propertySymbol ->
                 if (!fn.hasAnnotation(DescriptorUtils.JVM_NAME)) {
                     val propertyName = propertySymbol.owner.name.identifier
-                    val name = if (fn.isGetter) {
-                        JvmAbi.getterName(propertyName)
-                    } else {
-                        JvmAbi.setterName(propertyName)
-                    }
+                    val name =
+                        if (fn.isGetter) {
+                            JvmAbi.getterName(propertyName)
+                        } else {
+                            JvmAbi.setterName(propertyName)
+                        }
                     fn.annotations += jvmNameAnnotation(name)
                 }
             }
 
-            val valueParametersMapping = explicitParameters
-                .zip(fn.explicitParameters)
-                .toMap()
+            val valueParametersMapping = explicitParameters.zip(fn.explicitParameters).toMap()
 
             val currentParams = fn.valueParameters.size
             val realParams = currentParams - fn.contextReceiverParametersCount
 
             // $composer
-            val composerParam = fn.addValueParameter {
-                name = ComposeNames.COMPOSER_PARAMETER
-                type = composerType.makeNullable()
-                origin = IrDeclarationOrigin.DEFINED
-                isAssignable = true
-            }
+            val composerParam =
+                fn.addValueParameter {
+                    name = ComposeNames.COMPOSER_PARAMETER
+                    type = composerType.makeNullable()
+                    origin = IrDeclarationOrigin.DEFINED
+                    isAssignable = true
+                }
 
             // $changed[n]
             val changed = ComposeNames.CHANGED_PARAMETER.identifier
@@ -579,94 +555,98 @@
 
             // update parameter types so they are ready to accept the default values
             fn.valueParameters.fastForEach { param ->
-                val newType = defaultParameterType(
-                    param,
-                    fn.hasDefaultExpressionDefinedForValueParameter(param.index)
-                )
+                val newType =
+                    defaultParameterType(
+                        param,
+                        fn.hasDefaultExpressionDefinedForValueParameter(param.index)
+                    )
                 param.type = newType
             }
 
             inlineLambdaInfo.scan(fn)
 
-            fn.transformChildrenVoid(object : IrElementTransformerVoid() {
-                var isNestedScope = false
-                override fun visitGetValue(expression: IrGetValue): IrGetValue {
-                    val newParam = valueParametersMapping[expression.symbol.owner]
-                    return if (newParam != null) {
-                        IrGetValueImpl(
-                            expression.startOffset,
-                            expression.endOffset,
-                            expression.type,
-                            newParam.symbol,
-                            expression.origin
-                        )
-                    } else expression
-                }
+            fn.transformChildrenVoid(
+                object : IrElementTransformerVoid() {
+                    var isNestedScope = false
 
-                override fun visitReturn(expression: IrReturn): IrExpression {
-                    if (expression.returnTargetSymbol == oldFn.symbol) {
-                        // update the return statement to point to the new function, or else
-                        // it will be interpreted as a non-local return
-                        return super.visitReturn(
-                            IrReturnImpl(
+                    override fun visitGetValue(expression: IrGetValue): IrGetValue {
+                        val newParam = valueParametersMapping[expression.symbol.owner]
+                        return if (newParam != null) {
+                            IrGetValueImpl(
                                 expression.startOffset,
                                 expression.endOffset,
                                 expression.type,
-                                fn.symbol,
-                                expression.value
+                                newParam.symbol,
+                                expression.origin
                             )
-                        )
+                        } else expression
                     }
-                    return super.visitReturn(expression)
-                }
 
-                override fun visitFunction(declaration: IrFunction): IrStatement {
-                    val wasNested = isNestedScope
-                    try {
-                        // we don't want to pass the composer parameter in to composable calls
-                        // inside of nested scopes.... *unless* the scope was inlined.
-                        isNestedScope = wasNested ||
-                            !inlineLambdaInfo.isInlineLambda(declaration) ||
-                            declaration.hasComposableAnnotation()
-                        return super.visitFunction(declaration)
-                    } finally {
-                        isNestedScope = wasNested
+                    override fun visitReturn(expression: IrReturn): IrExpression {
+                        if (expression.returnTargetSymbol == oldFn.symbol) {
+                            // update the return statement to point to the new function, or else
+                            // it will be interpreted as a non-local return
+                            return super.visitReturn(
+                                IrReturnImpl(
+                                    expression.startOffset,
+                                    expression.endOffset,
+                                    expression.type,
+                                    fn.symbol,
+                                    expression.value
+                                )
+                            )
+                        }
+                        return super.visitReturn(expression)
+                    }
+
+                    override fun visitFunction(declaration: IrFunction): IrStatement {
+                        val wasNested = isNestedScope
+                        try {
+                            // we don't want to pass the composer parameter in to composable calls
+                            // inside of nested scopes.... *unless* the scope was inlined.
+                            isNestedScope =
+                                wasNested ||
+                                    !inlineLambdaInfo.isInlineLambda(declaration) ||
+                                    declaration.hasComposableAnnotation()
+                            return super.visitFunction(declaration)
+                        } finally {
+                            isNestedScope = wasNested
+                        }
+                    }
+
+                    override fun visitCall(expression: IrCall): IrExpression {
+                        val expr =
+                            if (!isNestedScope) {
+                                expression.withComposerParamIfNeeded(composerParam)
+                            } else expression
+                        return super.visitCall(expr)
                     }
                 }
-
-                override fun visitCall(expression: IrCall): IrExpression {
-                    val expr = if (!isNestedScope) {
-                        expression.withComposerParamIfNeeded(composerParam)
-                    } else
-                        expression
-                    return super.visitCall(expr)
-                }
-            })
+            )
         }
     }
 
-    private fun defaultParameterType(
-        param: IrValueParameter,
-        hasDefaultValue: Boolean
-    ): IrType {
+    private fun defaultParameterType(param: IrValueParameter, hasDefaultValue: Boolean): IrType {
         val type = param.type
         if (!hasDefaultValue) return type
-        val constructorAccessible = !type.isPrimitiveType() &&
-            type.classOrNull?.owner?.primaryConstructor != null
+        val constructorAccessible =
+            !type.isPrimitiveType() && type.classOrNull?.owner?.primaryConstructor != null
         return when {
             type.isPrimitiveType() -> type
-            type.isInlineClassType() -> if (context.platform.isJvm() || constructorAccessible) {
-                if (type.unboxInlineClass().isPrimitiveType()) {
-                    type
+            type.isInlineClassType() ->
+                if (context.platform.isJvm() || constructorAccessible) {
+                    if (type.unboxInlineClass().isPrimitiveType()) {
+                        type
+                    } else {
+                        type.makeNullable()
+                    }
                 } else {
+                    // k/js and k/native: private constructors of value classes can be not
+                    // accessible.
+                    // Therefore it won't be possible to create a "fake" default argument for calls.
+                    // Making it nullable allows to pass null.
                     type.makeNullable()
                 }
-            } else {
-                // k/js and k/native: private constructors of value classes can be not accessible.
-                // Therefore it won't be possible to create a "fake" default argument for calls.
-                // Making it nullable allows to pass null.
-                type.makeNullable()
-            }
             else -> type.makeNullable()
         }
     }
@@ -679,19 +659,18 @@
      * before, so if the function comes from other [IrModuleFragment], we must skip it.
      *
      * NOTE: [ModuleDescriptor] will not work here, as incremental compilation of the same module
-     * can contain some functions that were transformed during previous compilation in a
-     * different module fragment with the same [ModuleDescriptor]
+     * can contain some functions that were transformed during previous compilation in a different
+     * module fragment with the same [ModuleDescriptor]
      */
     private fun IrFunction.externallyTransformed(): Boolean =
-        decoysEnabled && valueParameters.firstOrNull {
-            it.name == ComposeNames.COMPOSER_PARAMETER
-        } != null
+        decoysEnabled &&
+            valueParameters.firstOrNull { it.name == ComposeNames.COMPOSER_PARAMETER } != null
 
     /**
      * Creates stubs for @Composable function with value class parameters that have a default and
-     * are wrapping a non-primitive instance.
-     * Before Compose compiler 1.5.12, not specifying such parameter resulted in a nullptr exception
-     * (b/330655412) at runtime, caused by Kotlin compiler inserting checkParameterNotNull.
+     * are wrapping a non-primitive instance. Before Compose compiler 1.5.12, not specifying such
+     * parameter resulted in a nullptr exception (b/330655412) at runtime, caused by Kotlin compiler
+     * inserting checkParameterNotNull.
      *
      * Converting such parameters to be nullable caused a binary compatibility issue because
      * nullability changed the value class mangle on a function signature. This stub creates a
@@ -713,9 +692,7 @@
                 hasDefaultExpressionDefinedForValueParameter(i) &&
                     param.type.isInlineClassType() &&
                     !param.type.isNullable() &&
-                    param.type.unboxInlineClass().let {
-                        !it.isPrimitiveType() && !it.isNullable()
-                    }
+                    param.type.unboxInlineClass().let { !it.isPrimitiveType() && !it.isNullable() }
             ) {
                 makeStub = true
                 break
@@ -728,39 +705,39 @@
 
         val source = this
         val copy = source.deepCopyWithSymbols(parent)
-        copy.valueParameters.fastForEach {
-            it.defaultValue = null
-        }
+        copy.valueParameters.fastForEach { it.defaultValue = null }
         copy.origin = ComposeDefaultValueStubOrigin
-        copy.annotations += IrConstructorCallImpl(
-            UNDEFINED_OFFSET,
-            UNDEFINED_OFFSET,
-            jvmSyntheticIrClass.defaultType,
-            jvmSyntheticIrClass.primaryConstructor!!.symbol,
-            0,
-            0,
-            0,
-        )
-        copy.body = context.irFactory.createBlockBody(UNDEFINED_OFFSET, UNDEFINED_OFFSET) {
-            statements.add(
-                IrReturnImpl(
-                    UNDEFINED_OFFSET,
-                    UNDEFINED_OFFSET,
-                    copy.returnType,
-                    copy.symbol,
-                    irCall(source).apply {
-                        dispatchReceiver = copy.dispatchReceiverParameter?.let { irGet(it) }
-                        extensionReceiver = copy.extensionReceiverParameter?.let { irGet(it) }
-                        copy.typeParameters.fastForEachIndexed { index, param ->
-                            putTypeArgument(index, param.defaultType)
-                        }
-                        copy.valueParameters.fastForEachIndexed { index, param ->
-                            putValueArgument(index, irGet(param))
-                        }
-                    }
-                )
+        copy.annotations +=
+            IrConstructorCallImpl(
+                UNDEFINED_OFFSET,
+                UNDEFINED_OFFSET,
+                jvmSyntheticIrClass.defaultType,
+                jvmSyntheticIrClass.primaryConstructor!!.symbol,
+                0,
+                0,
+                0,
             )
-        }
+        copy.body =
+            context.irFactory.createBlockBody(UNDEFINED_OFFSET, UNDEFINED_OFFSET) {
+                statements.add(
+                    IrReturnImpl(
+                        UNDEFINED_OFFSET,
+                        UNDEFINED_OFFSET,
+                        copy.returnType,
+                        copy.symbol,
+                        irCall(source).apply {
+                            dispatchReceiver = copy.dispatchReceiverParameter?.let { irGet(it) }
+                            extensionReceiver = copy.extensionReceiverParameter?.let { irGet(it) }
+                            copy.typeParameters.fastForEachIndexed { index, param ->
+                                putTypeArgument(index, param.defaultType)
+                            }
+                            copy.valueParameters.fastForEachIndexed { index, param ->
+                                putValueArgument(index, irGet(param))
+                            }
+                        }
+                    )
+                )
+            }
 
         transformedFunctions[copy] = copy
         transformedFunctionSet += copy
@@ -769,8 +746,7 @@
     }
 
     private val PublishedApiFqName = StandardClassIds.Annotations.PublishedApi.asSingleFqName()
-    object ComposeDefaultValueStubOrigin : IrDeclarationOriginImpl(
-        name = "ComposeDefaultValueStubOrigin",
-        isSynthetic = true
-    )
+
+    object ComposeDefaultValueStubOrigin :
+        IrDeclarationOriginImpl(name = "ComposeDefaultValueStubOrigin", isSynthetic = true)
 }
diff --git a/compose/compiler/compiler-hosted/src/main/java/androidx/compose/compiler/plugins/kotlin/lower/CopyDefaultValuesFromExpectLowering.kt b/compose/compiler/compiler-hosted/src/main/java/androidx/compose/compiler/plugins/kotlin/lower/CopyDefaultValuesFromExpectLowering.kt
index 9b8f956..80710d7 100644
--- a/compose/compiler/compiler-hosted/src/main/java/androidx/compose/compiler/plugins/kotlin/lower/CopyDefaultValuesFromExpectLowering.kt
+++ b/compose/compiler/compiler-hosted/src/main/java/androidx/compose/compiler/plugins/kotlin/lower/CopyDefaultValuesFromExpectLowering.kt
@@ -55,42 +55,35 @@
 import org.jetbrains.kotlin.resolve.multiplatform.findCompatibleActualsForExpected
 
 /**
- * [ComposableFunctionBodyTransformer] relies on presence of default values in
- * Composable functions' parameters.
- * If Composable function is declared as `expect fun` with default value parameter, then
+ * [ComposableFunctionBodyTransformer] relies on presence of default values in Composable functions'
+ * parameters. If Composable function is declared as `expect fun` with default value parameter, then
  * [ComposableFunctionBodyTransformer] will not find any default value in `actual fun` - IrFunction.
  *
  * [CopyDefaultValuesFromExpectLowering] sets default values to parameters of actual functions by
- * taking them from their corresponding `expect fun` declarations.
- * This lowering needs to run before [ComposableFunctionBodyTransformer] and
- * before [ComposerParamTransformer].
+ * taking them from their corresponding `expect fun` declarations. This lowering needs to run before
+ * [ComposableFunctionBodyTransformer] and before [ComposerParamTransformer].
  *
- * Fixes:
- * https://github.com/JetBrains/compose-jb/issues/1407
+ * Fixes: https://github.com/JetBrains/compose-jb/issues/1407
  * https://github.com/JetBrains/compose-multiplatform/issues/2816
  * https://github.com/JetBrains/compose-multiplatform/issues/2806
  *
- * This implementation is borrowed from Kotlin's ExpectToActualDefaultValueCopier.
- * Currently, it heavily relies on descriptors to find expect for actuals or vice versa:
- * findCompatibleActualsForExpected.
- * Unlike ExpectToActualDefaultValueCopier, this lowering performs its transformations
- * only for functions marked with @Composable annotation or
- * for functions with @Composable lambdas in parameters.
+ * This implementation is borrowed from Kotlin's ExpectToActualDefaultValueCopier. Currently, it
+ * heavily relies on descriptors to find expect for actuals or vice versa:
+ * findCompatibleActualsForExpected. Unlike ExpectToActualDefaultValueCopier, this lowering performs
+ * its transformations only for functions marked with @Composable annotation or for functions
+ * with @Composable lambdas in parameters.
  *
  * This lowering is K1 specific and should not be run in K2.
  */
 @OptIn(ObsoleteDescriptorBasedAPI::class)
-class CopyDefaultValuesFromExpectLowering(
-    private val pluginContext: IrPluginContext
-) : ModuleLoweringPass, IrElementTransformerVoid() {
+class CopyDefaultValuesFromExpectLowering(private val pluginContext: IrPluginContext) :
+    ModuleLoweringPass, IrElementTransformerVoid() {
 
     private val symbolTable = pluginContext.symbolTable
 
     private fun isApplicable(declaration: IrFunction): Boolean {
         return declaration.hasComposableAnnotation() ||
-            declaration.valueParameters.any {
-                it.type.hasAnnotation(ComposeFqNames.Composable)
-            }
+            declaration.valueParameters.any { it.type.hasAnnotation(ComposeFqNames.Composable) }
     }
 
     override fun visitFunction(declaration: IrFunction): IrStatement {
@@ -106,9 +99,10 @@
             val actualValueParameter = actualForExpected.valueParameters[index]
             val expectDefaultValue = expectValueParameter.defaultValue
             if (expectDefaultValue != null) {
-                actualValueParameter.defaultValue = expectDefaultValue
-                    .remapExpectValueSymbols()
-                    .patchDeclarationParents(actualForExpected)
+                actualValueParameter.defaultValue =
+                    expectDefaultValue
+                        .remapExpectValueSymbols()
+                        .patchDeclarationParents(actualForExpected)
 
                 // Remove a default value in the expect fun in order to prevent
                 // Kotlin expect/actual-related lowerings trying to copy the default values again
@@ -133,19 +127,13 @@
     }
 
     private fun IrProperty.findActualForExpected(): IrProperty =
-        symbolTable.descriptorExtension.referenceProperty(
-            descriptor.findActualForExpect()
-        ).owner
+        symbolTable.descriptorExtension.referenceProperty(descriptor.findActualForExpect()).owner
 
     private fun IrClass.findActualForExpected(): IrClass =
-        symbolTable.descriptorExtension.referenceClass(
-            descriptor.findActualForExpect()
-        ).owner
+        symbolTable.descriptorExtension.referenceClass(descriptor.findActualForExpect()).owner
 
     private fun IrEnumEntry.findActualForExpected(): IrEnumEntry =
-        symbolTable.descriptorExtension.referenceEnumEntry(
-            descriptor.findActualForExpect()
-        ).owner
+        symbolTable.descriptorExtension.referenceEnumEntry(descriptor.findActualForExpect()).owner
 
     private inline fun <reified T : MemberDescriptor> T.findActualForExpect(): T {
         if (!this.isExpect) error(this)
@@ -155,8 +143,7 @@
     private fun IrExpressionBody.remapExpectValueSymbols(): IrExpressionBody {
         class SymbolRemapper : DeepCopySymbolRemapper() {
             override fun getReferencedClass(symbol: IrClassSymbol) =
-                if (symbol.descriptor.isExpect)
-                    symbol.owner.findActualForExpected().symbol
+                if (symbol.descriptor.isExpect) symbol.owner.findActualForExpected().symbol
                 else super.getReferencedClass(symbol)
 
             override fun getReferencedClassOrNull(symbol: IrClassSymbol?) =
@@ -170,8 +157,7 @@
                 }
 
             override fun getReferencedConstructor(symbol: IrConstructorSymbol) =
-                if (symbol.descriptor.isExpect)
-                    symbol.owner.findActualForExpected().symbol
+                if (symbol.descriptor.isExpect) symbol.owner.findActualForExpected().symbol
                 else super.getReferencedConstructor(symbol)
 
             override fun getReferencedFunction(symbol: IrFunctionSymbol): IrFunctionSymbol =
@@ -181,34 +167,30 @@
                     else -> error("Unexpected symbol $symbol ${symbol.descriptor}")
                 }
 
-            override fun getReferencedSimpleFunction(symbol: IrSimpleFunctionSymbol) = when {
-                symbol.descriptor.isExpect -> symbol.owner.findActualForExpected().symbol
-
-                symbol.descriptor.propertyIfAccessor.isExpect -> {
-                    val property = symbol.owner.correspondingPropertySymbol!!.owner
-                    val actualPropertyDescriptor = property.descriptor.findActualForExpect()
-                    val accessorDescriptor = when (symbol.owner) {
-                        property.getter -> actualPropertyDescriptor.getter!!
-                        property.setter -> actualPropertyDescriptor.setter!!
-                        else -> error("Unexpected accessor of $symbol ${symbol.descriptor}")
+            override fun getReferencedSimpleFunction(symbol: IrSimpleFunctionSymbol) =
+                when {
+                    symbol.descriptor.isExpect -> symbol.owner.findActualForExpected().symbol
+                    symbol.descriptor.propertyIfAccessor.isExpect -> {
+                        val property = symbol.owner.correspondingPropertySymbol!!.owner
+                        val actualPropertyDescriptor = property.descriptor.findActualForExpect()
+                        val accessorDescriptor =
+                            when (symbol.owner) {
+                                property.getter -> actualPropertyDescriptor.getter!!
+                                property.setter -> actualPropertyDescriptor.setter!!
+                                else -> error("Unexpected accessor of $symbol ${symbol.descriptor}")
+                            }
+                        symbolTable.referenceFunction(accessorDescriptor) as IrSimpleFunctionSymbol
                     }
-                    symbolTable.referenceFunction(accessorDescriptor) as IrSimpleFunctionSymbol
+                    else -> super.getReferencedSimpleFunction(symbol)
                 }
 
-                else -> super.getReferencedSimpleFunction(symbol)
-            }
-
             override fun getReferencedProperty(symbol: IrPropertySymbol) =
-                if (symbol.descriptor.isExpect)
-                    symbol.owner.findActualForExpected().symbol
-                else
-                    super.getReferencedProperty(symbol)
+                if (symbol.descriptor.isExpect) symbol.owner.findActualForExpected().symbol
+                else super.getReferencedProperty(symbol)
 
             override fun getReferencedEnumEntry(symbol: IrEnumEntrySymbol): IrEnumEntrySymbol =
-                if (symbol.descriptor.isExpect)
-                    symbol.owner.findActualForExpected().symbol
-                else
-                    super.getReferencedEnumEntry(symbol)
+                if (symbol.descriptor.isExpect) symbol.owner.findActualForExpected().symbol
+                else super.getReferencedEnumEntry(symbol)
 
             override fun getReferencedValue(symbol: IrValueSymbol) =
                 remapExpectValue(symbol)?.symbol ?: super.getReferencedValue(symbol)
@@ -218,9 +200,8 @@
         acceptVoid(symbolRemapper)
 
         return transform(
-            transformer = DeepCopyIrTreeWithSymbols(
-                symbolRemapper, DeepCopyTypeRemapper(symbolRemapper)
-            ),
+            transformer =
+                DeepCopyIrTreeWithSymbols(symbolRemapper, DeepCopyTypeRemapper(symbolRemapper)),
             data = null
         )
     }
@@ -231,15 +212,11 @@
 
         return when (parent) {
             is IrClass ->
-                if (!parent.descriptor.isExpect)
-                    parameter
+                if (!parent.descriptor.isExpect) parameter
                 else parent.findActualForExpected().typeParameters[parameter.index]
-
             is IrFunction ->
-                if (!parent.descriptor.isExpect)
-                    parameter
+                if (!parent.descriptor.isExpect) parameter
                 else parent.findActualForExpected().typeParameters[parameter.index]
-
             else -> error(parent)
         }
     }
@@ -254,29 +231,24 @@
 
         return when (parent) {
             is IrClass ->
-                if (!parent.descriptor.isExpect)
-                    null
+                if (!parent.descriptor.isExpect) null
                 else {
                     assert(parameter == parent.thisReceiver)
                     parent.findActualForExpected().thisReceiver!!
                 }
-
             is IrFunction ->
-                if (!parent.descriptor.isExpect)
-                    null
-                else when (parameter) {
-                    parent.dispatchReceiverParameter ->
-                        parent.findActualForExpected().dispatchReceiverParameter!!
-
-                    parent.extensionReceiverParameter ->
-                        parent.findActualForExpected().extensionReceiverParameter!!
-
-                    else -> {
-                        assert(parent.valueParameters[parameter.index] == parameter)
-                        parent.findActualForExpected().valueParameters[parameter.index]
+                if (!parent.descriptor.isExpect) null
+                else
+                    when (parameter) {
+                        parent.dispatchReceiverParameter ->
+                            parent.findActualForExpected().dispatchReceiverParameter!!
+                        parent.extensionReceiverParameter ->
+                            parent.findActualForExpected().extensionReceiverParameter!!
+                        else -> {
+                            assert(parent.valueParameters[parameter.index] == parameter)
+                            parent.findActualForExpected().valueParameters[parameter.index]
+                        }
                     }
-                }
-
             else -> error(parent)
         }
     }
diff --git a/compose/compiler/compiler-hosted/src/main/java/androidx/compose/compiler/plugins/kotlin/lower/DeepCopyPreservingMetadata.kt b/compose/compiler/compiler-hosted/src/main/java/androidx/compose/compiler/plugins/kotlin/lower/DeepCopyPreservingMetadata.kt
index 033b426..6660476 100644
--- a/compose/compiler/compiler-hosted/src/main/java/androidx/compose/compiler/plugins/kotlin/lower/DeepCopyPreservingMetadata.kt
+++ b/compose/compiler/compiler-hosted/src/main/java/androidx/compose/compiler/plugins/kotlin/lower/DeepCopyPreservingMetadata.kt
@@ -34,39 +34,25 @@
     symbolRenamer: SymbolRenamer
 ) : DeepCopyIrTreeWithSymbols(symbolRemapper, typeRemapper, symbolRenamer) {
     override fun visitFile(declaration: IrFile): IrFile =
-        super.visitFile(declaration).apply {
-            metadata = declaration.metadata
-        }
+        super.visitFile(declaration).apply { metadata = declaration.metadata }
 
     override fun visitClass(declaration: IrClass): IrClass =
-        super.visitClass(declaration).apply {
-            metadata = declaration.metadata
-        }
+        super.visitClass(declaration).apply { metadata = declaration.metadata }
 
     override fun visitConstructor(declaration: IrConstructor): IrConstructor =
-        super.visitConstructor(declaration).apply {
-            metadata = declaration.metadata
-        }
+        super.visitConstructor(declaration).apply { metadata = declaration.metadata }
 
     override fun visitSimpleFunction(declaration: IrSimpleFunction): IrSimpleFunction =
-        super.visitSimpleFunction(declaration).apply {
-            metadata = declaration.metadata
-        }
+        super.visitSimpleFunction(declaration).apply { metadata = declaration.metadata }
 
     override fun visitProperty(declaration: IrProperty): IrProperty =
-        super.visitProperty(declaration).apply {
-            metadata = declaration.metadata
-        }
+        super.visitProperty(declaration).apply { metadata = declaration.metadata }
 
     override fun visitField(declaration: IrField): IrField =
-        super.visitField(declaration).apply {
-            metadata = declaration.metadata
-        }
+        super.visitField(declaration).apply { metadata = declaration.metadata }
 
     override fun visitLocalDelegatedProperty(
         declaration: IrLocalDelegatedProperty
     ): IrLocalDelegatedProperty =
-        super.visitLocalDelegatedProperty(declaration).apply {
-            metadata = declaration.metadata
-        }
+        super.visitLocalDelegatedProperty(declaration).apply { metadata = declaration.metadata }
 }
diff --git a/compose/compiler/compiler-hosted/src/main/java/androidx/compose/compiler/plugins/kotlin/lower/DurableFunctionKeyTransformer.kt b/compose/compiler/compiler-hosted/src/main/java/androidx/compose/compiler/plugins/kotlin/lower/DurableFunctionKeyTransformer.kt
index 75c3505..d4f189f 100644
--- a/compose/compiler/compiler-hosted/src/main/java/androidx/compose/compiler/plugins/kotlin/lower/DurableFunctionKeyTransformer.kt
+++ b/compose/compiler/compiler-hosted/src/main/java/androidx/compose/compiler/plugins/kotlin/lower/DurableFunctionKeyTransformer.kt
@@ -57,7 +57,8 @@
     val hasDuplicates: Boolean,
 ) {
     var used: Boolean = false
-    val key: Int get() = name.hashCode()
+    val key: Int
+        get() = name.hashCode()
 }
 
 /**
@@ -93,7 +94,6 @@
  *       }
  *       endGroup()
  *     }
- *
  *     @FunctionKeyMetaClass
  *     @FunctionKeyMeta(key=123, startOffset=24, endOffset=56)
  *     @FunctionKeyMeta(key=345, startOffset=32, endOffset=43)
@@ -107,122 +107,121 @@
     metrics: ModuleMetrics,
     stabilityInferencer: StabilityInferencer,
     featureFlags: FeatureFlags,
-) : DurableKeyTransformer(
-    DurableKeyVisitor(),
-    context,
-    symbolRemapper,
-    stabilityInferencer,
-    metrics,
-    featureFlags,
-) {
+) :
+    DurableKeyTransformer(
+        DurableKeyVisitor(),
+        context,
+        symbolRemapper,
+        stabilityInferencer,
+        metrics,
+        featureFlags,
+    ) {
     fun removeKeyMetaClasses(moduleFragment: IrModuleFragment) {
-        moduleFragment.transformChildrenVoid(object : IrElementTransformerVoid() {
-            override fun visitFile(declaration: IrFile): IrFile {
-                includeFileNameInExceptionTrace(declaration) {
-                    val children = declaration.declarations.toList().filterIsInstance<IrClass>()
-                    for (child in children) {
-                        val keys = context.irTrace[DURABLE_FUNCTION_KEYS, child]
-                        if (keys != null) {
-                            declaration.declarations.remove(child)
-                        }
-                    }
-                    return declaration
-                }
-            }
-        })
-    }
-
-    fun realizeKeyMetaAnnotations(moduleFragment: IrModuleFragment) {
-        moduleFragment.transformChildrenVoid(object : IrElementTransformerVoid() {
-            override fun visitFile(declaration: IrFile): IrFile {
-                includeFileNameInExceptionTrace(declaration) {
-                    val children = declaration.declarations.toList().filterIsInstance<IrClass>()
-                    for (child in children) {
-                        val keys = context.irTrace[DURABLE_FUNCTION_KEYS, child]
-                        if (keys != null) {
-                            val usedKeys = keys.filter { it.used }
-                            if (usedKeys.isNotEmpty()) {
-                                child.annotations += usedKeys.map { irKeyMetaAnnotation(it) }
-                            } else {
+        moduleFragment.transformChildrenVoid(
+            object : IrElementTransformerVoid() {
+                override fun visitFile(declaration: IrFile): IrFile {
+                    includeFileNameInExceptionTrace(declaration) {
+                        val children = declaration.declarations.toList().filterIsInstance<IrClass>()
+                        for (child in children) {
+                            val keys = context.irTrace[DURABLE_FUNCTION_KEYS, child]
+                            if (keys != null) {
                                 declaration.declarations.remove(child)
                             }
                         }
+                        return declaration
                     }
-                    return declaration
                 }
             }
-        })
+        )
+    }
+
+    fun realizeKeyMetaAnnotations(moduleFragment: IrModuleFragment) {
+        moduleFragment.transformChildrenVoid(
+            object : IrElementTransformerVoid() {
+                override fun visitFile(declaration: IrFile): IrFile {
+                    includeFileNameInExceptionTrace(declaration) {
+                        val children = declaration.declarations.toList().filterIsInstance<IrClass>()
+                        for (child in children) {
+                            val keys = context.irTrace[DURABLE_FUNCTION_KEYS, child]
+                            if (keys != null) {
+                                val usedKeys = keys.filter { it.used }
+                                if (usedKeys.isNotEmpty()) {
+                                    child.annotations += usedKeys.map { irKeyMetaAnnotation(it) }
+                                } else {
+                                    declaration.declarations.remove(child)
+                                }
+                            }
+                        }
+                        return declaration
+                    }
+                }
+            }
+        )
     }
 
     var currentKeys = mutableListOf<KeyInfo>()
 
-    private val keyMetaAnnotation =
-        getTopLevelClassOrNull(ComposeClassIds.FunctionKeyMeta)
-    private val metaClassAnnotation =
-        getTopLevelClassOrNull(ComposeClassIds.FunctionKeyMetaClass)
+    private val keyMetaAnnotation = getTopLevelClassOrNull(ComposeClassIds.FunctionKeyMeta)
+    private val metaClassAnnotation = getTopLevelClassOrNull(ComposeClassIds.FunctionKeyMetaClass)
 
-    private fun irKeyMetaAnnotation(
-        key: KeyInfo
-    ): IrConstructorCall = IrConstructorCallImpl(
-        UNDEFINED_OFFSET,
-        UNDEFINED_OFFSET,
-        keyMetaAnnotation!!.defaultType,
-        keyMetaAnnotation.constructors.single(),
-        0,
-        0,
-        3
-    ).apply {
-        putValueArgument(0, irConst(key.key.hashCode()))
-        putValueArgument(1, irConst(key.startOffset))
-        putValueArgument(2, irConst(key.endOffset))
-    }
+    private fun irKeyMetaAnnotation(key: KeyInfo): IrConstructorCall =
+        IrConstructorCallImpl(
+                UNDEFINED_OFFSET,
+                UNDEFINED_OFFSET,
+                keyMetaAnnotation!!.defaultType,
+                keyMetaAnnotation.constructors.single(),
+                0,
+                0,
+                3
+            )
+            .apply {
+                putValueArgument(0, irConst(key.key.hashCode()))
+                putValueArgument(1, irConst(key.startOffset))
+                putValueArgument(2, irConst(key.endOffset))
+            }
 
-    private fun irMetaClassAnnotation(
-        file: String
-    ): IrConstructorCall = IrConstructorCallImpl(
-        UNDEFINED_OFFSET,
-        UNDEFINED_OFFSET,
-        metaClassAnnotation!!.defaultType,
-        metaClassAnnotation.constructors.single(),
-        0,
-        0,
-        1
-    ).apply {
-        putValueArgument(0, irConst(file))
-    }
+    private fun irMetaClassAnnotation(file: String): IrConstructorCall =
+        IrConstructorCallImpl(
+                UNDEFINED_OFFSET,
+                UNDEFINED_OFFSET,
+                metaClassAnnotation!!.defaultType,
+                metaClassAnnotation.constructors.single(),
+                0,
+                0,
+                1
+            )
+            .apply { putValueArgument(0, irConst(file)) }
 
     private fun buildClass(filePath: String): IrClass {
         val fileName = filePath.split('/').last()
-        return context.irFactory.buildClass {
-            kind = ClassKind.CLASS
-            visibility = DescriptorVisibilities.INTERNAL
-            val shortName = PackagePartClassUtils.getFilePartShortName(fileName)
-            // the name of the LiveLiterals class is per-file, so we use the same name that
-            // the kotlin file class lowering produces, prefixed with `LiveLiterals$`.
-            name = Name.identifier("$shortName\$KeyMeta")
-        }.also {
-            it.createParameterDeclarations()
+        return context.irFactory
+            .buildClass {
+                kind = ClassKind.CLASS
+                visibility = DescriptorVisibilities.INTERNAL
+                val shortName = PackagePartClassUtils.getFilePartShortName(fileName)
+                // the name of the LiveLiterals class is per-file, so we use the same name that
+                // the kotlin file class lowering produces, prefixed with `LiveLiterals$`.
+                name = Name.identifier("$shortName\$KeyMeta")
+            }
+            .also {
+                it.createParameterDeclarations()
 
-            // store the full file path to the file that this class is associated with in an
-            // annotation on the class. This will be used by tooling to associate the keys
-            // inside of this class with actual PSI in the editor.
-            if (metaClassAnnotation != null) {
-                it.annotations += irMetaClassAnnotation(filePath)
-            }
-            it.addConstructor {
-                isPrimary = true
-            }.also { ctor ->
-                ctor.body = DeclarationIrBuilder(context, it.symbol).irBlockBody {
-                    +irDelegatingConstructorCall(
-                        context
-                            .irBuiltIns
-                            .anyClass
-                            .owner
-                            .primaryConstructor!!
-                    )
+                // store the full file path to the file that this class is associated with in an
+                // annotation on the class. This will be used by tooling to associate the keys
+                // inside of this class with actual PSI in the editor.
+                if (metaClassAnnotation != null) {
+                    it.annotations += irMetaClassAnnotation(filePath)
                 }
+                it.addConstructor { isPrimary = true }
+                    .also { ctor ->
+                        ctor.body =
+                            DeclarationIrBuilder(context, it.symbol).irBlockBody {
+                                +irDelegatingConstructorCall(
+                                    context.irBuiltIns.anyClass.owner.primaryConstructor!!
+                                )
+                            }
+                    }
             }
-        }
     }
 
     override fun visitFile(declaration: IrFile): IrFile {
@@ -247,12 +246,13 @@
     override fun visitSimpleFunction(declaration: IrSimpleFunction): IrStatement {
         val signature = declaration.signatureString()
         val (fullName, success) = buildKey("fun-$signature")
-        val info = KeyInfo(
-            fullName,
-            declaration.startOffset,
-            declaration.endOffset,
-            !success,
-        )
+        val info =
+            KeyInfo(
+                fullName,
+                declaration.startOffset,
+                declaration.endOffset,
+                !success,
+            )
         currentKeys.add(info)
         context.irTrace.record(DURABLE_FUNCTION_KEY, declaration, info)
         return super.visitSimpleFunction(declaration)
diff --git a/compose/compiler/compiler-hosted/src/main/java/androidx/compose/compiler/plugins/kotlin/lower/DurableKeyTransformer.kt b/compose/compiler/compiler-hosted/src/main/java/androidx/compose/compiler/plugins/kotlin/lower/DurableKeyTransformer.kt
index 7936c3c..9d5f1f2 100644
--- a/compose/compiler/compiler-hosted/src/main/java/androidx/compose/compiler/plugins/kotlin/lower/DurableKeyTransformer.kt
+++ b/compose/compiler/compiler-hosted/src/main/java/androidx/compose/compiler/plugins/kotlin/lower/DurableKeyTransformer.kt
@@ -75,7 +75,7 @@
     stabilityInferencer: StabilityInferencer,
     metrics: ModuleMetrics,
     featureFlags: FeatureFlags,
-    ) :
+) :
     AbstractComposeLowering(context, symbolRemapper, metrics, stabilityInferencer, featureFlags),
     ModuleLoweringPass {
 
@@ -91,16 +91,16 @@
 
     protected fun <T> root(keys: MutableSet<String>, block: () -> T): T =
         keyVisitor.root(keys, block)
+
     protected fun <T> enter(key: String, block: () -> T) = keyVisitor.enter(key, block)
+
     protected fun <T> siblings(key: String, block: () -> T) = keyVisitor.siblings(key, block)
+
     protected fun <T> siblings(block: () -> T) = keyVisitor.siblings(block)
 
     protected fun Name.asJvmFriendlyString(): String {
         return if (!isSpecial) identifier
-        else asString()
-            .replace('<', '$')
-            .replace('>', '$')
-            .replace(' ', '-')
+        else asString().replace('<', '$').replace('>', '$').replace(' ', '-')
     }
 
     override fun visitClass(declaration: IrClass): IrStatement {
@@ -126,17 +126,11 @@
     }
 
     override fun visitTry(aTry: IrTry): IrExpression {
-        aTry.tryResult = enter("try") {
-            aTry.tryResult.transform(this, null)
-        }
+        aTry.tryResult = enter("try") { aTry.tryResult.transform(this, null) }
         siblings {
-            aTry.catches.forEach {
-                it.result = enter("catch") { it.result.transform(this, null) }
-            }
+            aTry.catches.forEach { it.result = enter("catch") { it.result.transform(this, null) } }
         }
-        aTry.finallyExpression = enter("finally") {
-            aTry.finallyExpression?.transform(this, null)
-        }
+        aTry.finallyExpression = enter("finally") { aTry.finallyExpression?.transform(this, null) }
         return aTry
     }
 
@@ -152,19 +146,15 @@
         val name = owner.name.asJvmFriendlyString()
 
         return enter("call-$name") {
-            expression.dispatchReceiver = enter("\$this") {
-                expression.dispatchReceiver?.transform(this, null)
-            }
-            expression.extensionReceiver = enter("\$\$this") {
-                expression.extensionReceiver?.transform(this, null)
-            }
+            expression.dispatchReceiver =
+                enter("\$this") { expression.dispatchReceiver?.transform(this, null) }
+            expression.extensionReceiver =
+                enter("\$\$this") { expression.extensionReceiver?.transform(this, null) }
 
             for (i in 0 until expression.valueArgumentsCount) {
                 val arg = expression.getValueArgument(i)
                 if (arg != null) {
-                    enter("arg-$i") {
-                        expression.putValueArgument(i, arg.transform(this, null))
-                    }
+                    enter("arg-$i") { expression.putValueArgument(i, arg.transform(this, null)) }
                 }
             }
             expression
@@ -176,19 +166,15 @@
         val name = owner.name.asJvmFriendlyString()
 
         return enter("call-$name") {
-            expression.dispatchReceiver = enter("\$this") {
-                expression.dispatchReceiver?.transform(this, null)
-            }
-            expression.extensionReceiver = enter("\$\$this") {
-                expression.extensionReceiver?.transform(this, null)
-            }
+            expression.dispatchReceiver =
+                enter("\$this") { expression.dispatchReceiver?.transform(this, null) }
+            expression.extensionReceiver =
+                enter("\$\$this") { expression.extensionReceiver?.transform(this, null) }
 
             for (i in 0 until expression.valueArgumentsCount) {
                 val arg = expression.getValueArgument(i)
                 if (arg != null) {
-                    enter("arg-$i") {
-                        expression.putValueArgument(i, arg.transform(this, null))
-                    }
+                    enter("arg-$i") { expression.putValueArgument(i, arg.transform(this, null)) }
                 }
             }
             expression
@@ -205,19 +191,15 @@
         val name = owner.name.asJvmFriendlyString()
 
         return enter("call-$name") {
-            expression.dispatchReceiver = enter("\$this") {
-                expression.dispatchReceiver?.transform(this, null)
-            }
-            expression.extensionReceiver = enter("\$\$this") {
-                expression.extensionReceiver?.transform(this, null)
-            }
+            expression.dispatchReceiver =
+                enter("\$this") { expression.dispatchReceiver?.transform(this, null) }
+            expression.extensionReceiver =
+                enter("\$\$this") { expression.extensionReceiver?.transform(this, null) }
 
             for (i in 0 until expression.valueArgumentsCount) {
                 val arg = expression.getValueArgument(i)
                 if (arg != null) {
-                    enter("arg-$i") {
-                        expression.putValueArgument(i, arg.transform(this, null))
-                    }
+                    enter("arg-$i") { expression.putValueArgument(i, arg.transform(this, null)) }
                 }
             }
             expression
@@ -229,19 +211,15 @@
         val name = owner.name.asJvmFriendlyString()
 
         return enter("call-$name") {
-            expression.dispatchReceiver = enter("\$this") {
-                expression.dispatchReceiver?.transform(this, null)
-            }
-            expression.extensionReceiver = enter("\$\$this") {
-                expression.extensionReceiver?.transform(this, null)
-            }
+            expression.dispatchReceiver =
+                enter("\$this") { expression.dispatchReceiver?.transform(this, null) }
+            expression.extensionReceiver =
+                enter("\$\$this") { expression.extensionReceiver?.transform(this, null) }
 
             for (i in 0 until expression.valueArgumentsCount) {
                 val arg = expression.getValueArgument(i)
                 if (arg != null) {
-                    enter("arg-$i") {
-                        expression.putValueArgument(i, arg.transform(this, null))
-                    }
+                    enter("arg-$i") { expression.putValueArgument(i, arg.transform(this, null)) }
                 }
             }
             expression
@@ -258,9 +236,8 @@
         if (expression !is IrVarargImpl) return expression
         return enter("vararg") {
             expression.elements.forEachIndexed { i, arg ->
-                expression.elements[i] = enter("$i") {
-                    arg.transform(this, null) as IrVarargElement
-                }
+                expression.elements[i] =
+                    enter("$i") { arg.transform(this, null) as IrVarargElement }
             }
             expression
         }
@@ -299,15 +276,17 @@
             // in these cases, the compiler relies on a certain structure for the condition
             // expression, so we only touch the body
             IrStatementOrigin.WHILE_LOOP,
-            IrStatementOrigin.FOR_LOOP_INNER_WHILE -> enter("loop") {
-                loop.body = enter("body") { loop.body?.transform(this, null) }
-                loop
-            }
-            else -> enter("loop") {
-                loop.condition = enter("cond") { loop.condition.transform(this, null) }
-                loop.body = enter("body") { loop.body?.transform(this, null) }
-                loop
-            }
+            IrStatementOrigin.FOR_LOOP_INNER_WHILE ->
+                enter("loop") {
+                    loop.body = enter("body") { loop.body?.transform(this, null) }
+                    loop
+                }
+            else ->
+                enter("loop") {
+                    loop.condition = enter("cond") { loop.condition.transform(this, null) }
+                    loop.body = enter("body") { loop.body?.transform(this, null) }
+                    loop
+                }
         }
     }
 
@@ -316,9 +295,7 @@
         return enter("str") {
             siblings {
                 expression.arguments.forEachIndexed { index, expr ->
-                    expression.arguments[index] = enter("$index") {
-                        expr.transform(this, null)
-                    }
+                    expression.arguments[index] = enter("$index") { expr.transform(this, null) }
                 }
                 expression
             }
@@ -340,14 +317,8 @@
                 expression.branches[1] = expression.branches[1].transform(this, null)
                 expression
             }
-
-            IrStatementOrigin.IF -> siblings("if") {
-                super.visitWhen(expression)
-            }
-
-            else -> siblings("when") {
-                super.visitWhen(expression)
-            }
+            IrStatementOrigin.IF -> siblings("if") { super.visitWhen(expression) }
+            else -> siblings("when") { super.visitWhen(expression) }
         }
     }
 
@@ -364,9 +335,7 @@
             // the condition of an else branch is a constant boolean but we don't want
             // to convert it into a live literal, so we don't transform it
             condition = branch.condition,
-            result = enter("else") {
-                branch.result.transform(this, null)
-            }
+            result = enter("else") { branch.result.transform(this, null) }
         )
     }
 
@@ -374,21 +343,15 @@
         return IrBranchImpl(
             startOffset = branch.startOffset,
             endOffset = branch.endOffset,
-            condition = enter("cond") {
-                branch.condition.transform(this, null)
-            },
+            condition = enter("cond") { branch.condition.transform(this, null) },
             // only translate the result, as the branch is a constant boolean but we don't want
             // to convert it into a live literal
-            result = enter("branch") {
-                branch.result.transform(this, null)
-            }
+            result = enter("branch") { branch.result.transform(this, null) }
         )
     }
 
     override fun visitComposite(expression: IrComposite): IrExpression {
-        return siblings {
-            super.visitComposite(expression)
-        }
+        return siblings { super.visitComposite(expression) }
     }
 
     override fun visitBlock(expression: IrBlock): IrExpression {
@@ -401,14 +364,12 @@
                     expression.statements[1].transform(this, null) as IrStatement
                 expression
             }
-//            IrStatementOrigin.SAFE_CALL
-//            IrStatementOrigin.WHEN
-//            IrStatementOrigin.IF
-//            IrStatementOrigin.ELVIS
-//            IrStatementOrigin.ARGUMENTS_REORDERING_FOR_CALL
-            else -> siblings {
-                super.visitBlock(expression)
-            }
+            //            IrStatementOrigin.SAFE_CALL
+            //            IrStatementOrigin.WHEN
+            //            IrStatementOrigin.IF
+            //            IrStatementOrigin.ELVIS
+            //            IrStatementOrigin.ARGUMENTS_REORDERING_FOR_CALL
+            else -> siblings { super.visitBlock(expression) }
         }
     }
 
@@ -431,9 +392,7 @@
     }
 
     override fun visitBlockBody(body: IrBlockBody): IrBody {
-        return siblings {
-            super.visitBlockBody(body)
-        }
+        return siblings { super.visitBlockBody(body) }
     }
 
     override fun visitVariable(declaration: IrVariable): IrStatement {
@@ -454,12 +413,8 @@
             // safe operation. We should figure out a way to do this for "static" expressions
             // though such as `val foo = 16.dp`.
             declaration.backingField = backingField?.transform(this, null) as? IrField
-            declaration.getter = enter("get") {
-                getter?.transform(this, null) as? IrSimpleFunction
-            }
-            declaration.setter = enter("set") {
-                setter?.transform(this, null) as? IrSimpleFunction
-            }
+            declaration.getter = enter("get") { getter?.transform(this, null) as? IrSimpleFunction }
+            declaration.setter = enter("set") { setter?.transform(this, null) as? IrSimpleFunction }
             declaration
         }
     }
diff --git a/compose/compiler/compiler-hosted/src/main/java/androidx/compose/compiler/plugins/kotlin/lower/DurableKeyVisitor.kt b/compose/compiler/compiler-hosted/src/main/java/androidx/compose/compiler/plugins/kotlin/lower/DurableKeyVisitor.kt
index 50c85a4..1f68074 100644
--- a/compose/compiler/compiler-hosted/src/main/java/androidx/compose/compiler/plugins/kotlin/lower/DurableKeyVisitor.kt
+++ b/compose/compiler/compiler-hosted/src/main/java/androidx/compose/compiler/plugins/kotlin/lower/DurableKeyVisitor.kt
@@ -19,34 +19,32 @@
 class PathPartInfo(val key: String) {
     var parent: PathPartInfo? = null
     var prev: PathPartInfo? = null
-    fun print(
-        builder: StringBuilder,
-        pathSeparator: String = "/",
-        siblingSeparator: String = ":"
-    ) = with(builder) {
-        var node = this@PathPartInfo
-        if (node == ROOT) {
-            append("<ROOT>")
-            return
-        }
-        while (node != ROOT) {
-            append(pathSeparator)
-            append(node.key)
-            val key = node.key
-            var count = 0
-            while (node.prev != null) {
-                if (node.prev?.key == key) {
-                    count++
+
+    fun print(builder: StringBuilder, pathSeparator: String = "/", siblingSeparator: String = ":") =
+        with(builder) {
+            var node = this@PathPartInfo
+            if (node == ROOT) {
+                append("<ROOT>")
+                return
+            }
+            while (node != ROOT) {
+                append(pathSeparator)
+                append(node.key)
+                val key = node.key
+                var count = 0
+                while (node.prev != null) {
+                    if (node.prev?.key == key) {
+                        count++
+                    }
+                    node = node.prev!!
                 }
-                node = node.prev!!
+                if (count > 0) {
+                    append(siblingSeparator)
+                    append(count)
+                }
+                node = node.parent ?: ROOT
             }
-            if (count > 0) {
-                append(siblingSeparator)
-                append(count)
-            }
-            node = node.parent ?: ROOT
         }
-    }
 
     override fun toString() = StringBuilder().also { print(it) }.toString()
 
@@ -59,17 +57,15 @@
  * This data structure is used to build unique but durable "key paths" for tree structures using a
  * DSL.
  *
- * This is primarily used by the [LiveLiteralTransformer] to create unique and durable keys for
- * all of the constant literals in an IR source tree.
+ * This is primarily used by the [LiveLiteralTransformer] to create unique and durable keys for all
+ * of the constant literals in an IR source tree.
  */
 class DurableKeyVisitor(private var keys: MutableSet<String> = mutableSetOf()) {
     private var current: PathPartInfo = PathPartInfo.ROOT
     private var parent: PathPartInfo? = null
     private var sibling: PathPartInfo? = null
 
-    /**
-     * Enter into a new scope with path part [part].
-     */
+    /** Enter into a new scope with path part [part]. */
     fun <T> enter(part: String, block: () -> T): T {
         val prev = current
         val prevSibling = sibling
@@ -100,9 +96,7 @@
         }
     }
 
-    /**
-     * Inside this block, treat all entered path parts as siblings of the current path part.
-     */
+    /** Inside this block, treat all entered path parts as siblings of the current path part. */
     fun <T> siblings(block: () -> T): T {
         if (parent != null) {
             // we are already in a siblings block, so we want this to be a no-op
@@ -123,8 +117,8 @@
     }
 
     /**
-     * Enter into a new scope with path part [part] and assume entered paths to be children of
-     * that path.
+     * Enter into a new scope with path part [part] and assume entered paths to be children of that
+     * path.
      *
      * This is shorthand for `enter(part) { siblings(block) } }`.
      */
@@ -132,21 +126,17 @@
 
     /**
      * This API is meant to allow for a sub-hierarchy of the tree to be treated as its own scope.
-     * This will use the provided [keys] Set as the container for keys that are built while in
-     * this scope. Inside of this scope, the previous scope will be completely ignored.
+     * This will use the provided [keys] Set as the container for keys that are built while in this
+     * scope. Inside of this scope, the previous scope will be completely ignored.
      */
-    fun <T> root(
-        keys: MutableSet<String> = mutableSetOf(),
-        block: () -> T
-    ): T {
+    fun <T> root(keys: MutableSet<String> = mutableSetOf(), block: () -> T): T {
         val prevKeys = this.keys
         val prevCurrent = current
         val prevParent = parent
         val prevSibling = sibling
         try {
             this.keys = keys
-            current =
-                PathPartInfo.ROOT
+            current = PathPartInfo.ROOT
             parent = null
             sibling = null
             return siblings(block)
@@ -164,12 +154,11 @@
      * @param prefix A string to prefix the path with
      * @param pathSeparator The string used to separate parts of the path
      * @param siblingSeparator When duplicate siblings are found an incrementing index is used to
-     * make the path unique. This string will be used to separate the path part from the
-     * incrementing index.
-     *
+     *   make the path unique. This string will be used to separate the path part from the
+     *   incrementing index.
      * @return A pair with `first` being the built key, and `second` being whether or not the key
-     * was absent in the dictionary of already built keys. If `second` is false, this key is a
-     * duplicate.
+     *   was absent in the dictionary of already built keys. If `second` is false, this key is a
+     *   duplicate.
      */
     fun buildPath(
         prefix: String,
@@ -177,10 +166,9 @@
         siblingSeparator: String = ":"
     ): Pair<String, Boolean> {
         return buildString {
-            append(prefix)
-            current.print(this, pathSeparator, siblingSeparator)
-        }.let {
-            it to keys.add(it)
-        }
+                append(prefix)
+                current.print(this, pathSeparator, siblingSeparator)
+            }
+            .let { it to keys.add(it) }
     }
 }
diff --git a/compose/compiler/compiler-hosted/src/main/java/androidx/compose/compiler/plugins/kotlin/lower/FunctionReferenceBuilder.kt b/compose/compiler/compiler-hosted/src/main/java/androidx/compose/compiler/plugins/kotlin/lower/FunctionReferenceBuilder.kt
index a341ffd..24e95ee 100644
--- a/compose/compiler/compiler-hosted/src/main/java/androidx/compose/compiler/plugins/kotlin/lower/FunctionReferenceBuilder.kt
+++ b/compose/compiler/compiler-hosted/src/main/java/androidx/compose/compiler/plugins/kotlin/lower/FunctionReferenceBuilder.kt
@@ -65,70 +65,78 @@
     private val superMethod =
         functionSuperClass.functions.single { it.owner.modality == Modality.ABSTRACT }
 
-    private val functionReferenceClass = generatorContext.irFactory.buildClass {
-        setSourceRange(irFunctionExpression)
-        visibility = DescriptorVisibilities.LOCAL
-        origin = JvmLoweredDeclarationOrigin.LAMBDA_IMPL
-        name = SpecialNames.NO_NAME_PROVIDED
-    }.apply {
-        parent = currentDeclarationParent
-        superTypes = listOfNotNull(superType)
-        createImplicitParameterDeclarationWithWrappedDescriptor()
-        copyAttributes(irFunctionExpression)
-        metadata = irFunctionExpression.function.metadata
-    }
+    private val functionReferenceClass =
+        generatorContext.irFactory
+            .buildClass {
+                setSourceRange(irFunctionExpression)
+                visibility = DescriptorVisibilities.LOCAL
+                origin = JvmLoweredDeclarationOrigin.LAMBDA_IMPL
+                name = SpecialNames.NO_NAME_PROVIDED
+            }
+            .apply {
+                parent = currentDeclarationParent
+                superTypes = listOfNotNull(superType)
+                createImplicitParameterDeclarationWithWrappedDescriptor()
+                copyAttributes(irFunctionExpression)
+                metadata = irFunctionExpression.function.metadata
+            }
 
-    fun build(): IrExpression = DeclarationIrBuilder(
-        generatorContext,
-        currentScopeOwnerSymbol
-    ).run {
-        irBlock(irFunctionExpression.startOffset, irFunctionExpression.endOffset) {
-            val constructor = createConstructor()
-            createInvokeMethod()
-            functionReferenceClass.addFakeOverrides(irTypeSystemContext)
-            +functionReferenceClass
-            +irCall(constructor.symbol)
-        }
-    }
-
-    private fun createConstructor(): IrConstructor =
-        functionReferenceClass.addConstructor {
-            origin = JvmLoweredDeclarationOrigin.GENERATED_MEMBER_IN_CALLABLE_REFERENCE
-            returnType = functionReferenceClass.defaultType
-            isPrimary = true
-        }.apply {
-            val constructor = irTypeSystemContext.irBuiltIns.anyClass.owner.constructors.single()
-            body = DeclarationIrBuilder(generatorContext, symbol).run {
-                irBlockBody(startOffset, endOffset) {
-                    +irDelegatingConstructorCall(constructor)
-                    +IrInstanceInitializerCallImpl(
-                        startOffset,
-                        endOffset,
-                        functionReferenceClass.symbol,
-                        context.irBuiltIns.unitType
-                    )
-                }
+    fun build(): IrExpression =
+        DeclarationIrBuilder(generatorContext, currentScopeOwnerSymbol).run {
+            irBlock(irFunctionExpression.startOffset, irFunctionExpression.endOffset) {
+                val constructor = createConstructor()
+                createInvokeMethod()
+                functionReferenceClass.addFakeOverrides(irTypeSystemContext)
+                +functionReferenceClass
+                +irCall(constructor.symbol)
             }
         }
 
+    private fun createConstructor(): IrConstructor =
+        functionReferenceClass
+            .addConstructor {
+                origin = JvmLoweredDeclarationOrigin.GENERATED_MEMBER_IN_CALLABLE_REFERENCE
+                returnType = functionReferenceClass.defaultType
+                isPrimary = true
+            }
+            .apply {
+                val constructor =
+                    irTypeSystemContext.irBuiltIns.anyClass.owner.constructors.single()
+                body =
+                    DeclarationIrBuilder(generatorContext, symbol).run {
+                        irBlockBody(startOffset, endOffset) {
+                            +irDelegatingConstructorCall(constructor)
+                            +IrInstanceInitializerCallImpl(
+                                startOffset,
+                                endOffset,
+                                functionReferenceClass.symbol,
+                                context.irBuiltIns.unitType
+                            )
+                        }
+                    }
+            }
+
     private fun createInvokeMethod(): IrSimpleFunction =
-        functionReferenceClass.addFunction {
-            setSourceRange(callee)
-            name = superMethod.owner.name
-            returnType = callee.returnType
-            isSuspend = callee.isSuspend
-        }.apply {
-            overriddenSymbols += superMethod
-            dispatchReceiverParameter = parentAsClass.thisReceiver!!.copyTo(this)
-            createLambdaInvokeMethod()
-        }
+        functionReferenceClass
+            .addFunction {
+                setSourceRange(callee)
+                name = superMethod.owner.name
+                returnType = callee.returnType
+                isSuspend = callee.isSuspend
+            }
+            .apply {
+                overriddenSymbols += superMethod
+                dispatchReceiverParameter = parentAsClass.thisReceiver!!.copyTo(this)
+                createLambdaInvokeMethod()
+            }
 
     // Inline the body of an anonymous function into the generated lambda subclass.
     private fun IrSimpleFunction.createLambdaInvokeMethod() {
         annotations += callee.annotations
-        val valueParameterMap = callee.explicitParameters.withIndex().associate { (index, param) ->
-            param to param.copyTo(this, index = index)
-        }
+        val valueParameterMap =
+            callee.explicitParameters.withIndex().associate { (index, param) ->
+                param to param.copyTo(this, index = index)
+            }
         valueParameters += valueParameterMap.values
         body = callee.moveBodyTo(this, valueParameterMap)
     }
diff --git a/compose/compiler/compiler-hosted/src/main/java/androidx/compose/compiler/plugins/kotlin/lower/GuardedLazy.kt b/compose/compiler/compiler-hosted/src/main/java/androidx/compose/compiler/plugins/kotlin/lower/GuardedLazy.kt
index be6b950..f4fb9fc 100644
--- a/compose/compiler/compiler-hosted/src/main/java/androidx/compose/compiler/plugins/kotlin/lower/GuardedLazy.kt
+++ b/compose/compiler/compiler-hosted/src/main/java/androidx/compose/compiler/plugins/kotlin/lower/GuardedLazy.kt
@@ -17,6 +17,7 @@
 package androidx.compose.compiler.plugins.kotlin.lower
 
 import kotlin.reflect.KProperty
+
 class GuardedLazy<out T>(initializer: () -> T) {
     private var _value: Any? = UNINITIALIZED_VALUE
     private var _initializer: (() -> T)? = initializer
@@ -30,8 +31,7 @@
                 throw java.lang.IllegalStateException("Error initializing $name", e)
             }
         }
-        @Suppress("UNCHECKED_CAST")
-        return _value as T
+        @Suppress("UNCHECKED_CAST") return _value as T
     }
 }
 
diff --git a/compose/compiler/compiler-hosted/src/main/java/androidx/compose/compiler/plugins/kotlin/lower/IrInlineReferenceLocator.kt b/compose/compiler/compiler-hosted/src/main/java/androidx/compose/compiler/plugins/kotlin/lower/IrInlineReferenceLocator.kt
index 5543726..b39154f 100644
--- a/compose/compiler/compiler-hosted/src/main/java/androidx/compose/compiler/plugins/kotlin/lower/IrInlineReferenceLocator.kt
+++ b/compose/compiler/compiler-hosted/src/main/java/androidx/compose/compiler/plugins/kotlin/lower/IrInlineReferenceLocator.kt
@@ -64,37 +64,42 @@
 
     // Locate all inline lambdas in the scope of the given IrElement.
     fun scan(element: IrElement) {
-        element.acceptVoid(object : IrElementVisitorVoid {
-            override fun visitElement(element: IrElement) {
-                element.acceptChildrenVoid(this)
-            }
+        element.acceptVoid(
+            object : IrElementVisitorVoid {
+                override fun visitElement(element: IrElement) {
+                    element.acceptChildrenVoid(this)
+                }
 
-            override fun visitValueParameter(declaration: IrValueParameter) {
-                declaration.acceptChildrenVoid(this)
-                val parent = declaration.parent as? IrFunction
-                if (parent?.isInlineFunctionCall(context) == true &&
-                    declaration.isInlinedFunction()) {
-                    declaration.defaultValue?.expression?.unwrapLambda()?.let {
-                        inlineLambdaToParameter[it] = declaration
+                override fun visitValueParameter(declaration: IrValueParameter) {
+                    declaration.acceptChildrenVoid(this)
+                    val parent = declaration.parent as? IrFunction
+                    if (
+                        parent?.isInlineFunctionCall(context) == true &&
+                            declaration.isInlinedFunction()
+                    ) {
+                        declaration.defaultValue?.expression?.unwrapLambda()?.let {
+                            inlineLambdaToParameter[it] = declaration
+                        }
                     }
                 }
-            }
 
-            override fun visitFunctionAccess(expression: IrFunctionAccessExpression) {
-                expression.acceptChildrenVoid(this)
-                val function = expression.symbol.owner
-                if (function.isInlineFunctionCall(context)) {
-                    for (parameter in function.valueParameters) {
-                        if (parameter.isInlinedFunction()) {
-                            expression.getValueArgument(parameter.index)
-                                ?.also { inlineFunctionExpressions += it }
-                                ?.unwrapLambda()
-                                ?.let { inlineLambdaToParameter[it] = parameter }
+                override fun visitFunctionAccess(expression: IrFunctionAccessExpression) {
+                    expression.acceptChildrenVoid(this)
+                    val function = expression.symbol.owner
+                    if (function.isInlineFunctionCall(context)) {
+                        for (parameter in function.valueParameters) {
+                            if (parameter.isInlinedFunction()) {
+                                expression
+                                    .getValueArgument(parameter.index)
+                                    ?.also { inlineFunctionExpressions += it }
+                                    ?.unwrapLambda()
+                                    ?.let { inlineLambdaToParameter[it] = parameter }
+                            }
                         }
                     }
                 }
             }
-        })
+        )
     }
 }
 
@@ -105,31 +110,33 @@
 
 // Constructors can't be marked as inline in metadata, hence this hack.
 private fun IrFunction.isInlineArrayConstructor(context: IrPluginContext): Boolean =
-    this is IrConstructor && valueParameters.size == 2 && constructedClass.symbol.let {
-        it == context.irBuiltIns.arrayClass ||
-            it in context.irBuiltIns.primitiveArraysToPrimitiveTypes
+    this is IrConstructor &&
+        valueParameters.size == 2 &&
+        constructedClass.symbol.let {
+            it == context.irBuiltIns.arrayClass ||
+                it in context.irBuiltIns.primitiveArraysToPrimitiveTypes
+        }
+
+fun IrExpression.unwrapLambda(): IrFunctionSymbol? =
+    when {
+        this is IrBlock && origin.isLambdaBlockOrigin ->
+            (statements.lastOrNull() as? IrFunctionReference)?.symbol
+        this is IrFunctionExpression -> function.symbol
+        else -> null
     }
 
-fun IrExpression.unwrapLambda(): IrFunctionSymbol? = when {
-    this is IrBlock && origin.isLambdaBlockOrigin ->
-        (statements.lastOrNull() as? IrFunctionReference)?.symbol
-
-    this is IrFunctionExpression ->
-        function.symbol
-
-    else ->
-        null
-}
-
 private val IrStatementOrigin?.isLambdaBlockOrigin: Boolean
-    get() = isLambda || this == IrStatementOrigin.ADAPTED_FUNCTION_REFERENCE ||
-        this == IrStatementOrigin.SUSPEND_CONVERSION
+    get() =
+        isLambda ||
+            this == IrStatementOrigin.ADAPTED_FUNCTION_REFERENCE ||
+            this == IrStatementOrigin.SUSPEND_CONVERSION
 
 // This is copied from JvmIrInlineUtils.kt in the Kotlin compiler, since we
 // need to check for synthetic composable functions.
 private fun IrValueParameter.isInlinedFunction(): Boolean =
-    index >= 0 && !isNoinline && (type.isFunction() || type.isSuspendFunction() ||
-        type.isSyntheticComposableFunction()) &&
+    index >= 0 &&
+        !isNoinline &&
+        (type.isFunction() || type.isSuspendFunction() || type.isSyntheticComposableFunction()) &&
         // Parameters with default values are always nullable, so check the expression too.
         // Note that the frontend has a diagnostic for nullable inline parameters, so actually
         // making this return `false` requires using `@Suppress`.
@@ -137,6 +144,5 @@
 
 fun IrType.isSyntheticComposableFunction() =
     classOrNull?.owner?.let {
-        it.name.asString().startsWith("ComposableFunction") &&
-            it.packageFqName == InternalPackage
+        it.name.asString().startsWith("ComposableFunction") && it.packageFqName == InternalPackage
     } ?: false
diff --git a/compose/compiler/compiler-hosted/src/main/java/androidx/compose/compiler/plugins/kotlin/lower/IrSourcePrinter.kt b/compose/compiler/compiler-hosted/src/main/java/androidx/compose/compiler/plugins/kotlin/lower/IrSourcePrinter.kt
index 25cc2fc..ec8b2c9 100644
--- a/compose/compiler/compiler-hosted/src/main/java/androidx/compose/compiler/plugins/kotlin/lower/IrSourcePrinter.kt
+++ b/compose/compiler/compiler-hosted/src/main/java/androidx/compose/compiler/plugins/kotlin/lower/IrSourcePrinter.kt
@@ -126,8 +126,7 @@
 fun IrElement.dumpSrc(useFir: Boolean = false): String {
     val sb = StringBuilder()
     accept(IrSourcePrinterVisitor(sb, "%tab%", useFir), null)
-    return sb
-        .toString()
+    return sb.toString()
         // replace tabs at beginning of line with white space
         .replace(Regex("\\n(%tab%)+", RegexOption.MULTILINE)) {
             val size = it.range.last - it.range.first - 1
@@ -157,18 +156,18 @@
     private fun IrElement.print() {
         accept(this@IrSourcePrinterVisitor, null)
     }
+
     private fun print(obj: Any?) = printer.print(obj)
+
     private fun println(obj: Any?) = printer.println(obj)
+
     private fun println() = printer.println()
 
     fun printType(type: IrType) = type.renderSrc()
 
     private inline fun IrFunction.scoped(block: (IrFunction) -> Unit) {
         val previousScope = currentScope
-        currentScope = Scope(
-            this,
-            HashSet(valueParameters)
-        )
+        currentScope = Scope(this, HashSet(valueParameters))
 
         block(this)
 
@@ -196,13 +195,13 @@
     }
 
     override fun visitModuleFragment(declaration: IrModuleFragment) {
-//        println("// MODULE: ${declaration.name}")
+        //        println("// MODULE: ${declaration.name}")
         declaration.files.printJoin()
     }
 
     override fun visitFile(declaration: IrFile) {
         includeFileNameInExceptionTrace(declaration) {
-//          println("// FILE: ${declaration.fileEntry.name}")
+            //          println("// FILE: ${declaration.fileEntry.name}")
             declaration.declarations.printJoin("\n")
         }
     }
@@ -233,7 +232,7 @@
             } else {
                 if (
                     declaration.visibility != DescriptorVisibilities.PUBLIC &&
-                    declaration.visibility != DescriptorVisibilities.LOCAL
+                        declaration.visibility != DescriptorVisibilities.LOCAL
                 ) {
                     print(declaration.visibility.toString().lowercase(Locale.ROOT))
                     print(" ")
@@ -262,9 +261,7 @@
             print(")")
             if (!declaration.returnType.isUnit()) {
                 print(": ")
-                print(
-                    declaration.returnType.renderSrc()
-                )
+                print(declaration.returnType.renderSrc())
             }
             print(" ")
             declaration.printBody()
@@ -276,9 +273,7 @@
         if (body.statements.isEmpty()) {
             println("{ }")
         } else {
-            bracedBlock {
-                body.print()
-            }
+            bracedBlock { body.print() }
         }
     }
 
@@ -326,66 +321,78 @@
                     }
                 }
             }
-            val opSymbol = when (name) {
-                "contains" -> "in"
-                "equals" -> if (isInNotCall) "!=" else "=="
-                "plus" -> "+"
-                "not" -> "!"
-                "minus" -> "-"
-                "times" -> "*"
-                "div" -> "/"
-                "rem" -> "%"
-                "rangeTo" -> ".."
-                "plusAssign" -> "+="
-                "minusAssign" -> "-="
-                "unaryMinus" -> "-"
-                "timesAssign" -> "*="
-                "divAssign" -> "/="
-                "remAssign" -> "%="
-                "inc" -> "++"
-                "dec" -> "--"
-                "greater" -> ">"
-                "less" -> "<"
-                "lessOrEqual" -> "<="
-                "greaterOrEqual" -> ">="
-                "EQEQ" -> if (isInNotCall) "!=" else "=="
-                "EQEQEQ" -> if (isInNotCall) "!==" else "==="
-                "OROR" -> "||"
-                "ieee754equals" -> "=="
+            val opSymbol =
+                when (name) {
+                    "contains" -> "in"
+                    "equals" -> if (isInNotCall) "!=" else "=="
+                    "plus" -> "+"
+                    "not" -> "!"
+                    "minus" -> "-"
+                    "times" -> "*"
+                    "div" -> "/"
+                    "rem" -> "%"
+                    "rangeTo" -> ".."
+                    "plusAssign" -> "+="
+                    "minusAssign" -> "-="
+                    "unaryMinus" -> "-"
+                    "timesAssign" -> "*="
+                    "divAssign" -> "/="
+                    "remAssign" -> "%="
+                    "inc" -> "++"
+                    "dec" -> "--"
+                    "greater" -> ">"
+                    "less" -> "<"
+                    "lessOrEqual" -> "<="
+                    "greaterOrEqual" -> ">="
+                    "EQEQ" -> if (isInNotCall) "!=" else "=="
+                    "EQEQEQ" -> if (isInNotCall) "!==" else "==="
+                    "OROR" -> "||"
+                    "ieee754equals" -> "=="
 
-                // no names for
-                "invoke", "get", "set" -> ""
-                "iterator", "hasNext", "next", "getValue", "setValue",
-                "noWhenBranchMatchedException" -> name
-                "CHECK_NOT_NULL" -> "!!"
-                else -> {
-                    if (name.startsWith("component")) name
-                    else error("Unhandled operator $name")
+                    // no names for
+                    "invoke",
+                    "get",
+                    "set" -> ""
+                    "iterator",
+                    "hasNext",
+                    "next",
+                    "getValue",
+                    "setValue",
+                    "noWhenBranchMatchedException" -> name
+                    "CHECK_NOT_NULL" -> "!!"
+                    else -> {
+                        if (name.startsWith("component")) name
+                        else error("Unhandled operator $name")
+                    }
                 }
-            }
 
-            val printBinary = when (name) {
-                "equals",
-                "EQEQ",
-                "EQEQEQ" -> when {
-                    expression.dispatchReceiver?.type?.isInt() == true -> true
-                    expression.extensionReceiver?.type?.isInt() == true -> true
-                    expression.valueArgumentsCount > 0 &&
-                        expression.getValueArgument(0)?.type?.isInt() == true -> true
+            val printBinary =
+                when (name) {
+                    "equals",
+                    "EQEQ",
+                    "EQEQEQ" ->
+                        when {
+                            expression.dispatchReceiver?.type?.isInt() == true -> true
+                            expression.extensionReceiver?.type?.isInt() == true -> true
+                            expression.valueArgumentsCount > 0 &&
+                                expression.getValueArgument(0)?.type?.isInt() == true -> true
+                            else -> false
+                        }
                     else -> false
                 }
-                else -> false
-            }
             val prevPrintBinary = printIntsAsBinary
             printIntsAsBinary = printBinary
             when (name) {
                 // unary prefx
-                "unaryPlus", "unaryMinus", "not" -> {
+                "unaryPlus",
+                "unaryMinus",
+                "not" -> {
                     print(opSymbol)
                     (expression.dispatchReceiver ?: expression.extensionReceiver)?.print()
                 }
                 // unary postfix
-                "inc", "dec" -> {
+                "inc",
+                "dec" -> {
                     (expression.dispatchReceiver ?: expression.extensionReceiver)?.print()
                     print(opSymbol)
                 }
@@ -393,7 +400,8 @@
                     expression.getValueArgument(0)?.print()
                     print(opSymbol)
                 }
-                "getValue", "setValue" -> {
+                "getValue",
+                "setValue" -> {
                     (expression.dispatchReceiver ?: expression.extensionReceiver)?.print()
                     print(".")
                     print(opSymbol)
@@ -422,13 +430,20 @@
                     expression.getValueArgument(1)?.print()
                 }
                 // builtin static operators
-                "greater", "less", "lessOrEqual", "greaterOrEqual", "EQEQ", "EQEQEQ",
+                "greater",
+                "less",
+                "lessOrEqual",
+                "greaterOrEqual",
+                "EQEQ",
+                "EQEQEQ",
                 "ieee754equals" -> {
                     expression.getValueArgument(0)?.print()
                     print(" $opSymbol ")
                     expression.getValueArgument(1)?.print()
                 }
-                "iterator", "hasNext", "next",
+                "iterator",
+                "hasNext",
+                "next",
                 "noWhenBranchMatchedException" -> {
                     (expression.dispatchReceiver ?: expression.extensionReceiver)?.print()
                     print(".")
@@ -458,8 +473,7 @@
             if (name == "xor" || name == "and" || name == "or") {
                 printIntsAsBinary = true
             }
-            expression.dispatchReceiver?.print()
-                ?: expression.extensionReceiver?.print()
+            expression.dispatchReceiver?.print() ?: expression.extensionReceiver?.print()
             print(" $name ")
             expression.getValueArgument(0)?.print()
             printIntsAsBinary = prev
@@ -486,8 +500,7 @@
     private fun IrAnnotationContainer.printAnnotations(onePerLine: Boolean = false) {
         if (annotations.isNotEmpty()) {
             annotations.printJoin(if (onePerLine) "\n" else " ")
-            if (onePerLine) println()
-            else print(" ")
+            if (onePerLine) println() else print(" ")
         }
     }
 
@@ -497,12 +510,10 @@
     ) {
         val dispatchReceiver = dispatchReceiver
         val extensionReceiver = extensionReceiver
-        val dispatchIsSpecial = dispatchReceiver.let {
-            it is IrGetValue && it.symbol.owner.name.isSpecial
-        }
-        val extensionIsSpecial = extensionReceiver.let {
-            it is IrGetValue && it.symbol.owner.name.isSpecial
-        }
+        val dispatchIsSpecial =
+            dispatchReceiver.let { it is IrGetValue && it.symbol.owner.name.isSpecial }
+        val extensionIsSpecial =
+            extensionReceiver.let { it is IrGetValue && it.symbol.owner.name.isSpecial }
 
         if (superQualifierSymbol != null) {
             print("super<${superQualifierSymbol.owner.name}>")
@@ -528,13 +539,11 @@
             val arg = getValueArgument(i)
             if (arg != null) {
                 val param = symbol.owner.valueParameters[i]
-                val isLambda = arg is IrFunctionExpression ||
-                    (arg is IrBlock &&
-                        (arg.origin == IrStatementOrigin.LAMBDA))
+                val isLambda =
+                    arg is IrFunctionExpression ||
+                        (arg is IrBlock && (arg.origin == IrStatementOrigin.LAMBDA))
                 if (isLambda) {
-                    arg.unwrapLambda()?.let {
-                        returnTargetToCall[it] = this
-                    }
+                    arg.unwrapLambda()?.let { returnTargetToCall[it] = this }
                 }
                 val isTrailingLambda = i == symbol.owner.valueParameters.size - 1 && isLambda
                 if (isTrailingLambda) {
@@ -573,9 +582,7 @@
                     when {
                         name.startsWith(ComposeNames.DEFAULT_PARAMETER.identifier) ||
                             name.startsWith(ComposeNames.CHANGED_PARAMETER.identifier) -> {
-                            withIntsAsBinaryLiterals {
-                                arg.print()
-                            }
+                            withIntsAsBinaryLiterals { arg.print() }
                         }
                         else -> {
                             arg.printWithExplicitBlock()
@@ -619,9 +626,7 @@
             } else {
                 println()
             }
-            indented {
-                body?.print()
-            }
+            indented { body?.print() }
             println()
             println("}")
         }
@@ -635,7 +640,9 @@
             IrTypeOperator.NOT_INSTANCEOF -> {
                 expression.argument.print()
             }
-            IrTypeOperator.CAST, IrTypeOperator.SAFE_CAST, IrTypeOperator.IMPLICIT_CAST -> {
+            IrTypeOperator.CAST,
+            IrTypeOperator.SAFE_CAST,
+            IrTypeOperator.IMPLICIT_CAST -> {
                 expression.argument.print()
             }
             IrTypeOperator.SAM_CONVERSION -> {
@@ -681,17 +688,19 @@
         }
         print(name)
 
-        val printArgumentList = if (!isAnnotation) true else {
-            var hasArguments = false
-            for (i in 0 until expression.valueArgumentsCount) {
-                val arg = expression.getValueArgument(i)
-                if (arg != null) {
-                    hasArguments = true
-                    break
+        val printArgumentList =
+            if (!isAnnotation) true
+            else {
+                var hasArguments = false
+                for (i in 0 until expression.valueArgumentsCount) {
+                    val arg = expression.getValueArgument(i)
+                    if (arg != null) {
+                        hasArguments = true
+                        break
+                    }
                 }
+                hasArguments
             }
-            hasArguments
-        }
         if (printArgumentList) {
             expression.printArgumentList(
                 forceParameterNames = isAnnotation,
@@ -721,17 +730,15 @@
     }
 
     override fun visitVararg(expression: IrVararg) {
-        expression
-            .elements
-            .forEachIndexed { index, it ->
-                if (it is IrSpreadElement) {
-                    print("*")
-                    it.expression.print()
-                } else if (it is IrExpression) {
-                    it.print()
-                }
-                if (index < expression.elements.size - 1) print(", ")
+        expression.elements.forEachIndexed { index, it ->
+            if (it is IrSpreadElement) {
+                print("*")
+                it.expression.print()
+            } else if (it is IrExpression) {
+                it.print()
             }
+            if (index < expression.elements.size - 1) print(", ")
+        }
     }
 
     override fun visitWhen(expression: IrWhen) {
@@ -752,48 +759,35 @@
                 rhs.print()
             }
             isIf -> {
-                val singleLine = expression.branches.all {
-                    it.result is IrConst<*> || it.result is IrGetValue
-                }
+                val singleLine =
+                    expression.branches.all { it.result is IrConst<*> || it.result is IrGetValue }
                 expression.branches.forEachIndexed { index, branch ->
-                    val isElse = index == expression.branches.size - 1 &&
-                        (branch.condition as? IrConst<*>)?.value == true
+                    val isElse =
+                        index == expression.branches.size - 1 &&
+                            (branch.condition as? IrConst<*>)?.value == true
                     when {
                         index == 0 -> {
                             print("if (")
                             branch.condition.print()
-                            if (singleLine)
-                                print(") ")
-                            else
-                                println(") {")
+                            if (singleLine) print(") ") else println(") {")
                         }
                         isElse -> {
-                            if (singleLine)
-                                print(" else ")
-                            else
-                                println("} else {")
+                            if (singleLine) print(" else ") else println("} else {")
                         }
                         else -> {
-                            if (singleLine)
-                                print(" else if (")
-                            else
-                                print("} else if (")
+                            if (singleLine) print(" else if (") else print("} else if (")
                             branch.condition.print()
-                            if (singleLine)
-                                print(") ")
-                            else
-                                println(") {")
+                            if (singleLine) print(") ") else println(") {")
                         }
                     }
-                    if (singleLine)
-                        branch.result.print()
-                    else indented {
-                        branch.result.print()
-                        println()
-                    }
+                    if (singleLine) branch.result.print()
+                    else
+                        indented {
+                            branch.result.print()
+                            println()
+                        }
                 }
-                if (!singleLine)
-                    println("}")
+                if (!singleLine) println("}")
             }
             else -> {
                 print("when ")
@@ -807,9 +801,7 @@
                             it.condition.print()
                         }
                         print(" -> ")
-                        bracedBlock {
-                            it.result.print()
-                        }
+                        bracedBlock { it.result.print() }
                     }
                 }
             }
@@ -837,8 +829,9 @@
         mutableMapOf<IrReturnTargetSymbol, IrFunctionAccessExpression>()
 
     private val IrFunction.isLambda: Boolean
-        get() = name.asString() == SpecialNames.ANONYMOUS_STRING ||
-            origin == IrDeclarationOrigin.ADAPTER_FOR_CALLABLE_REFERENCE
+        get() =
+            name.asString() == SpecialNames.ANONYMOUS_STRING ||
+                origin == IrDeclarationOrigin.ADAPTER_FOR_CALLABLE_REFERENCE
 
     private val IrFunction.isDelegatedPropertySetter: Boolean
         get() = isSetter && origin == IrDeclarationOrigin.DELEGATED_PROPERTY_ACCESSOR
@@ -860,12 +853,13 @@
         // Only print the return statement directly if it is not the last statement in a lambda,
         // or a delegated property setter. The latter have a superfluous "return" in K1.
         val returnTarget = expression.returnTargetSymbol.owner
-        if (returnTarget !is IrFunction ||
-            (!returnTarget.isLambda && (useFir || !returnTarget.isDelegatedPropertySetter)) ||
-            !expression.isLastStatementIn(returnTarget)) {
-            val suffix = returnTargetToCall[returnTarget.symbol]?.let {
-                "@${it.symbol.owner.name}"
-            } ?: ""
+        if (
+            returnTarget !is IrFunction ||
+                (!returnTarget.isLambda && (useFir || !returnTarget.isDelegatedPropertySetter)) ||
+                !expression.isLastStatementIn(returnTarget)
+        ) {
+            val suffix =
+                returnTargetToCall[returnTarget.symbol]?.let { "@${it.symbol.owner.name}" } ?: ""
             print("return$suffix ")
         }
         if (value.type.isUnit() && value is IrGetObjectValue) {
@@ -899,20 +893,22 @@
             IrStatementOrigin.SAFE_CALL -> {
                 val lhs = expression.statements[0] as IrVariable
                 val rhsStatement = expression.statements[1]
-                val rhs = when (rhsStatement) {
-                    is IrBlock -> {
-                        if (rhsStatement.statements.size == 2) {
-                            val target = rhsStatement.statements[1]
-                            when (target) {
-                                is IrVariable -> target.initializer
-                                else -> target
-                            }
-                        } else rhsStatement
+                val rhs =
+                    when (rhsStatement) {
+                        is IrBlock -> {
+                            if (rhsStatement.statements.size == 2) {
+                                val target = rhsStatement.statements[1]
+                                when (target) {
+                                    is IrVariable -> target.initializer
+                                    else -> target
+                                }
+                            } else rhsStatement
+                        }
+                        else -> {
+                            rhsStatement
+                        }
                     }
-                    else -> {
-                        rhsStatement
-                    }
-                } as? IrWhen
+                        as? IrWhen
                 val call = rhs?.let { it.branches.last().result as? IrCall }
                 if (call == null) {
                     expression.statements.printJoin("\n")
@@ -960,7 +956,7 @@
 
         if (
             owner.parent != currentScope.owner &&
-            currentScope.localValues.any { it.name == owner.name }
+                currentScope.localValues.any { it.name == owner.name }
         ) {
             print("@")
             print(owner.parent.kotlinFqName)
@@ -970,7 +966,7 @@
     override fun visitField(declaration: IrField) {
         if (
             declaration.visibility != DescriptorVisibilities.PUBLIC &&
-            declaration.visibility != DescriptorVisibilities.LOCAL
+                declaration.visibility != DescriptorVisibilities.LOCAL
         ) {
             print(declaration.visibility.toString().lowercase(Locale.ROOT))
             print(" ")
@@ -1005,6 +1001,7 @@
         print(".")
         print(owner.name)
     }
+
     override fun visitSetField(expression: IrSetField) {
         expression.receiver?.print()
         print(".")
@@ -1042,9 +1039,10 @@
         }
         print(declaration.name)
         print(": ")
-        val type = declaration.backingField?.type
-            ?: declaration.getter?.returnType
-            ?: error("Couldn't find return type")
+        val type =
+            declaration.backingField?.type
+                ?: declaration.getter?.returnType
+                ?: error("Couldn't find return type")
         print(type.renderSrc())
         declaration.backingField?.let { field ->
             field.initializer?.let { initializer ->
@@ -1059,9 +1057,7 @@
                     it.printAnnotations()
                     println()
                     println("get() {")
-                    indented {
-                        it.body?.accept(this, null)
-                    }
+                    indented { it.body?.accept(this, null) }
                     println()
                     println("}")
                 }
@@ -1071,9 +1067,7 @@
                     println()
                     it.printAnnotations()
                     println("set(value) {")
-                    indented {
-                        it.body?.accept(this, null)
-                    }
+                    indented { it.body?.accept(this, null) }
                     println()
                     println("}")
                 }
@@ -1082,6 +1076,7 @@
     }
 
     private var printIntsAsBinary = false
+
     fun <T> withIntsAsBinaryLiterals(block: () -> T): T {
         val prev = printIntsAsBinary
         try {
@@ -1105,24 +1100,25 @@
     }
 
     override fun visitConst(expression: IrConst<*>) {
-        val result = when (expression.kind) {
-            is IrConstKind.Null -> "${expression.value}"
-            is IrConstKind.Boolean -> "${expression.value}"
-            is IrConstKind.Char -> "'${expression.value}'"
-            is IrConstKind.Byte -> "${expression.value}"
-            is IrConstKind.Short -> "${expression.value}"
-            is IrConstKind.Int -> {
-                if (printIntsAsBinary) {
-                    intAsBinaryString(expression.value as Int)
-                } else {
-                    "${expression.value}"
+        val result =
+            when (expression.kind) {
+                is IrConstKind.Null -> "${expression.value}"
+                is IrConstKind.Boolean -> "${expression.value}"
+                is IrConstKind.Char -> "'${expression.value}'"
+                is IrConstKind.Byte -> "${expression.value}"
+                is IrConstKind.Short -> "${expression.value}"
+                is IrConstKind.Int -> {
+                    if (printIntsAsBinary) {
+                        intAsBinaryString(expression.value as Int)
+                    } else {
+                        "${expression.value}"
+                    }
                 }
+                is IrConstKind.Long -> "${expression.value}L"
+                is IrConstKind.Float -> "${expression.value}f"
+                is IrConstKind.Double -> "${expression.value}"
+                is IrConstKind.String -> "\"${expression.value}\""
             }
-            is IrConstKind.Long -> "${expression.value}L"
-            is IrConstKind.Float -> "${expression.value}f"
-            is IrConstKind.Double -> "${expression.value}"
-            is IrConstKind.String -> "\"${expression.value}\""
-        }
         print(result)
     }
 
@@ -1146,7 +1142,7 @@
         declaration.printAnnotations(onePerLine = true)
         if (
             declaration.visibility != DescriptorVisibilities.PUBLIC &&
-            declaration.visibility != DescriptorVisibilities.LOCAL
+                declaration.visibility != DescriptorVisibilities.LOCAL
         ) {
             print(declaration.visibility.toString().lowercase(Locale.ROOT))
             print(" ")
@@ -1199,14 +1195,12 @@
             print(declaration.superTypes.joinToString(", ") { it.renderSrc() })
             print(" ")
         }
-        val nonParamDeclarations = declaration
-            .declarations
-            .filter { it != primaryConstructor && !ctorProperties.contains(it) }
-            .filter { it.origin != IrDeclarationOrigin.FAKE_OVERRIDE }
+        val nonParamDeclarations =
+            declaration.declarations
+                .filter { it != primaryConstructor && !ctorProperties.contains(it) }
+                .filter { it.origin != IrDeclarationOrigin.FAKE_OVERRIDE }
         if (nonParamDeclarations.isNotEmpty()) {
-            bracedBlock {
-                nonParamDeclarations.printJoin("\n")
-            }
+            bracedBlock { nonParamDeclarations.printJoin("\n") }
         } else {
             println()
         }
@@ -1223,13 +1217,12 @@
             print(superTypes.joinToString(", ") { it.renderSrc() })
             print(" ")
         }
-        val printableDeclarations = declarations
-            .filter { it !is IrConstructor }
-            .filter { it.origin != IrDeclarationOrigin.FAKE_OVERRIDE }
+        val printableDeclarations =
+            declarations
+                .filter { it !is IrConstructor }
+                .filter { it.origin != IrDeclarationOrigin.FAKE_OVERRIDE }
         if (printableDeclarations.isNotEmpty()) {
-            bracedBlock {
-                printableDeclarations.printJoin("\n")
-            }
+            bracedBlock { printableDeclarations.printJoin("\n") }
         } else {
             println()
         }
@@ -1253,8 +1246,8 @@
 
     override fun visitTypeParameter(declaration: IrTypeParameter) {
         print(declaration.name)
-        val isNonEmpty = declaration.superTypes.isNotEmpty() &&
-            !declaration.superTypes[0].isNullableAny()
+        val isNonEmpty =
+            declaration.superTypes.isNotEmpty() && !declaration.superTypes[0].isNullableAny()
         if (isNonEmpty) {
             print(": ")
             print(declaration.superTypes.joinToString(", ") { it.renderSrc() })
@@ -1361,9 +1354,7 @@
             print("(")
             valueParameters.printJoin(", ")
             print(") ")
-            bracedBlock {
-                body?.acceptVoid(this@IrSourcePrinterVisitor)
-            }
+            bracedBlock { body?.acceptVoid(this@IrSourcePrinterVisitor) }
         }
     }
 
@@ -1395,24 +1386,18 @@
 
     override fun visitTry(aTry: IrTry) {
         println("try {")
-        indented {
-            aTry.tryResult.print()
-        }
+        indented { aTry.tryResult.print() }
         println()
         if (aTry.catches.isNotEmpty()) {
             aTry.catches.forEach {
                 println("} catch() {")
-                indented {
-                    it.print()
-                }
+                indented { it.print() }
                 println()
             }
         }
         aTry.finallyExpression?.let {
             println("} finally {")
-            indented {
-                it.print()
-            }
+            indented { it.print() }
             println()
         }
         println("}")
@@ -1424,79 +1409,69 @@
 
     override fun visitAnonymousInitializer(declaration: IrAnonymousInitializer) {
         println("init {")
-        indented {
-            declaration.body.print()
-        }
+        indented { declaration.body.print() }
         println()
         println("}")
     }
 
-    private fun IrType.renderSrc() =
-        "${renderTypeAnnotations(annotations)}${renderTypeInner()}"
+    private fun IrType.renderSrc() = "${renderTypeAnnotations(annotations)}${renderTypeInner()}"
 
     private fun IrType.renderTypeInner() =
         when (this) {
             is IrDynamicType -> "dynamic"
-
             is IrErrorType -> "IrErrorType"
-
-            is IrSimpleType -> buildTrimEnd {
-                append((classifier.owner as IrDeclarationWithName).name)
-                if (arguments.isNotEmpty()) {
-                    append(
-                        arguments.joinToString(prefix = "<", postfix = ">", separator = ", ") {
-                            it.renderTypeArgument()
-                        }
-                    )
+            is IrSimpleType ->
+                buildTrimEnd {
+                    append((classifier.owner as IrDeclarationWithName).name)
+                    if (arguments.isNotEmpty()) {
+                        append(
+                            arguments.joinToString(prefix = "<", postfix = ">", separator = ", ") {
+                                it.renderTypeArgument()
+                            }
+                        )
+                    }
+                    if (isMarkedNullable()) {
+                        append('?')
+                    }
+                    abbreviation?.let { append(it.renderTypeAbbreviation()) }
                 }
-                if (isMarkedNullable()) {
-                    append('?')
-                }
-                abbreviation?.let {
-                    append(it.renderTypeAbbreviation())
-                }
-            }
-
             else -> "{${javaClass.simpleName} $this}"
         }
 
     private inline fun buildTrimEnd(fn: StringBuilder.() -> Unit): String =
         buildString(fn).trimEnd()
 
-    private fun IrTypeAbbreviation.renderTypeAbbreviation(): String =
-        buildString {
-            append("{ ")
-            append(renderTypeAnnotations(annotations))
-            append(typeAlias.renderTypeAliasFqn())
-            if (arguments.isNotEmpty()) {
-                append(
-                    arguments.joinToString(prefix = "<", postfix = ">", separator = ", ") {
-                        it.renderTypeArgument()
-                    }
-                )
-            }
-            if (hasQuestionMark) {
-                append('?')
-            }
-            append(" }")
+    private fun IrTypeAbbreviation.renderTypeAbbreviation(): String = buildString {
+        append("{ ")
+        append(renderTypeAnnotations(annotations))
+        append(typeAlias.renderTypeAliasFqn())
+        if (arguments.isNotEmpty()) {
+            append(
+                arguments.joinToString(prefix = "<", postfix = ">", separator = ", ") {
+                    it.renderTypeArgument()
+                }
+            )
         }
+        if (hasQuestionMark) {
+            append('?')
+        }
+        append(" }")
+    }
 
     private fun IrTypeArgument.renderTypeArgument(): String =
         when (this) {
             is IrStarProjection -> "*"
-
-            is IrTypeProjection -> buildTrimEnd {
-                append(variance.label)
-                if (variance != Variance.INVARIANT) append(' ')
-                append(type.renderSrc())
-            }
-
+            is IrTypeProjection ->
+                buildTrimEnd {
+                    append(variance.label)
+                    if (variance != Variance.INVARIANT) append(' ')
+                    append(type.renderSrc())
+                }
             else -> "IrTypeArgument[$this]"
         }
 
     private fun renderTypeAnnotations(annotations: List<IrConstructorCall>) =
-        if (annotations.isEmpty())
-            ""
+        if (annotations.isEmpty()) ""
         else
             annotations.joinToString(prefix = "", postfix = " ", separator = " ") {
                 "@[${renderAsAnnotation(it)}]"
@@ -1506,11 +1481,12 @@
         StringBuilder().also { it.renderAsAnnotation(irAnnotation) }.toString()
 
     private fun StringBuilder.renderAsAnnotation(irAnnotation: IrConstructorCall) {
-        val annotationClassName = try {
-            irAnnotation.symbol.owner.parentAsClass.name.asString()
-        } catch (e: Exception) {
-            "<unbound>"
-        }
+        val annotationClassName =
+            try {
+                irAnnotation.symbol.owner.parentAsClass.name.asString()
+            } catch (e: Exception) {
+                "<unbound>"
+            }
         append(annotationClassName)
 
         if (irAnnotation.valueArgumentsCount == 0) return
@@ -1533,10 +1509,8 @@
 
     @OptIn(ObsoleteDescriptorBasedAPI::class)
     private fun IrTypeAliasSymbol.renderTypeAliasFqn(): String =
-        if (isBound)
-            StringBuilder().also { owner.renderDeclarationFqn(it) }.toString()
-        else
-            "<unbound $this: ${this.descriptor}>"
+        if (isBound) StringBuilder().also { owner.renderDeclarationFqn(it) }.toString()
+        else "<unbound $this: ${this.descriptor}>"
 
     private fun IrDeclaration.renderDeclarationFqn(sb: StringBuilder) {
         renderDeclarationParentFqn(sb)
@@ -1567,20 +1541,16 @@
             val owner = symbol.owner
             if (owner is IrFunction) {
                 (0 until expectedCount).map {
-                    if (it < owner.valueParameters.size)
-                        owner.valueParameters[it].normalizedName
-                    else
-                        "${it + 1}"
+                    if (it < owner.valueParameters.size) owner.valueParameters[it].normalizedName
+                    else "${it + 1}"
                 }
             } else {
                 getPlaceholderParameterNames(expectedCount)
             }
-        } else
-            getPlaceholderParameterNames(expectedCount)
+        } else getPlaceholderParameterNames(expectedCount)
     }
 
-    private fun getPlaceholderParameterNames(expectedCount: Int) =
-        (1..expectedCount).map { "$it" }
+    private fun getPlaceholderParameterNames(expectedCount: Int) = (1..expectedCount).map { "$it" }
 
     private fun StringBuilder.renderAsAnnotationArgument(irElement: IrElement?) {
         when (irElement) {
@@ -1603,15 +1573,16 @@
     // Names for temporary variables and synthesized parameters are not consistent between
     // K1 and K2. This function returns the same name for both frontends.
     private val IrValueDeclaration.normalizedName: String
-        get() = when {
-            // FIR generates both <iterator> and tmp0_for_iterator...
-            origin == IrDeclarationOrigin.FOR_LOOP_ITERATOR -> "<iterator>"
-            // $anonymous$parameter$x vs $unused$var$x
-            origin == IrDeclarationOrigin.UNDERSCORE_PARAMETER -> "<unused var>"
-            !useFir && name.asString().endsWith("_elvis_lhs") -> "<elvis>"
-            !useFir && name.asString() == "\$this\$null" -> "<this>"
-            else -> name.asString()
-        }
+        get() =
+            when {
+                // FIR generates both <iterator> and tmp0_for_iterator...
+                origin == IrDeclarationOrigin.FOR_LOOP_ITERATOR -> "<iterator>"
+                // $anonymous$parameter$x vs $unused$var$x
+                origin == IrDeclarationOrigin.UNDERSCORE_PARAMETER -> "<unused var>"
+                !useFir && name.asString().endsWith("_elvis_lhs") -> "<elvis>"
+                !useFir && name.asString() == "\$this\$null" -> "<this>"
+                else -> name.asString()
+            }
 
     override fun visitElement(element: IrElement) {
         print("<<${element::class.java.simpleName}>>")
diff --git a/compose/compiler/compiler-hosted/src/main/java/androidx/compose/compiler/plugins/kotlin/lower/KlibAssignableParamTransformer.kt b/compose/compiler/compiler-hosted/src/main/java/androidx/compose/compiler/plugins/kotlin/lower/KlibAssignableParamTransformer.kt
index d16f9a3..e1852f6 100644
--- a/compose/compiler/compiler-hosted/src/main/java/androidx/compose/compiler/plugins/kotlin/lower/KlibAssignableParamTransformer.kt
+++ b/compose/compiler/compiler-hosted/src/main/java/androidx/compose/compiler/plugins/kotlin/lower/KlibAssignableParamTransformer.kt
@@ -46,17 +46,12 @@
  * Converts assignable parameters to the corresponding variables and adds them on top of the
  * function
  *
- * E.g.
- * fun A($composer: Composer) {
- *     $composer = $composer.startRestartGroup(...)
- * }
+ * E.g. fun A($composer: Composer) { $composer = $composer.startRestartGroup(...) }
  *
  * is converted to:
  *
- * fun A($composer: Composer) {
- *     var $composer = $composer
- *     $composer = $composer.startRestartGroup(...)
- * }
+ * fun A($composer: Composer) { var $composer = $composer $composer =
+ * $composer.startRestartGroup(...) }
  */
 class KlibAssignableParamTransformer(
     context: IrPluginContext,
@@ -64,13 +59,9 @@
     metrics: ModuleMetrics,
     stabilityInferencer: StabilityInferencer,
     featureFlags: FeatureFlags,
-) : AbstractComposeLowering(
-    context,
-    symbolRemapper,
-    metrics,
-    stabilityInferencer,
-    featureFlags
-), ModuleLoweringPass {
+) :
+    AbstractComposeLowering(context, symbolRemapper, metrics, stabilityInferencer, featureFlags),
+    ModuleLoweringPass {
     override fun lower(module: IrModuleFragment) {
         module.transformChildrenVoid(this)
     }
@@ -82,80 +73,81 @@
             return super.visitFunction(declaration)
         }
 
-        val variables = assignableParams.map {
-            val variable = IrVariableImpl(
-                startOffset = UNDEFINED_OFFSET,
-                endOffset = UNDEFINED_OFFSET,
-                origin = IrDeclarationOrigin.DEFINED,
-                symbol = IrVariableSymbolImpl(),
-                name = it.name,
-                type = it.type,
-                isVar = true,
-                isConst = false,
-                isLateinit = false
-            )
-            variable.parent = declaration
-
-            variable.initializer = IrGetValueImpl(
-                UNDEFINED_OFFSET,
-                UNDEFINED_OFFSET,
-                it.symbol
-            )
-
-            variable
-        }
-
-        declaration.body = declaration.body?.let { body ->
-            IrBlockBodyImpl(
-                body.startOffset,
-                body.endOffset
-            ).apply {
-                statements.addAll(variables)
-
-                val updatedBody = body.statements.map {
-                    it.transformStatement(
-                        object : IrElementTransformerVoid() {
-                            override fun visitGetValue(expression: IrGetValue): IrExpression {
-                                if (expression.symbol.owner in assignableParams) {
-                                    val paramIndex =
-                                        assignableParams.indexOf(expression.symbol.owner)
-                                    return super.visitGetValue(
-                                        IrGetValueImpl(
-                                            expression.startOffset,
-                                            expression.endOffset,
-                                            expression.type,
-                                            variables[paramIndex].symbol,
-                                            expression.origin
-                                        )
-                                    )
-                                }
-                                return super.visitGetValue(expression)
-                            }
-
-                            override fun visitSetValue(expression: IrSetValue): IrExpression {
-                                if (expression.symbol.owner in assignableParams) {
-                                    val paramIndex =
-                                        assignableParams.indexOf(expression.symbol.owner)
-                                    return super.visitSetValue(
-                                        IrSetValueImpl(
-                                            expression.startOffset,
-                                            expression.endOffset,
-                                            expression.type,
-                                            variables[paramIndex].symbol,
-                                            expression.value,
-                                            expression.origin
-                                        )
-                                    )
-                                }
-                                return super.visitSetValue(expression)
-                            }
-                        }
+        val variables =
+            assignableParams.map {
+                val variable =
+                    IrVariableImpl(
+                        startOffset = UNDEFINED_OFFSET,
+                        endOffset = UNDEFINED_OFFSET,
+                        origin = IrDeclarationOrigin.DEFINED,
+                        symbol = IrVariableSymbolImpl(),
+                        name = it.name,
+                        type = it.type,
+                        isVar = true,
+                        isConst = false,
+                        isLateinit = false
                     )
-                }
+                variable.parent = declaration
 
-                statements.addAll(updatedBody)
+                variable.initializer = IrGetValueImpl(UNDEFINED_OFFSET, UNDEFINED_OFFSET, it.symbol)
+
+                variable
             }
-        }
+
+        declaration.body =
+            declaration.body?.let { body ->
+                IrBlockBodyImpl(body.startOffset, body.endOffset).apply {
+                    statements.addAll(variables)
+
+                    val updatedBody =
+                        body.statements.map {
+                            it.transformStatement(
+                                object : IrElementTransformerVoid() {
+                                    override fun visitGetValue(
+                                        expression: IrGetValue
+                                    ): IrExpression {
+                                        if (expression.symbol.owner in assignableParams) {
+                                            val paramIndex =
+                                                assignableParams.indexOf(expression.symbol.owner)
+                                            return super.visitGetValue(
+                                                IrGetValueImpl(
+                                                    expression.startOffset,
+                                                    expression.endOffset,
+                                                    expression.type,
+                                                    variables[paramIndex].symbol,
+                                                    expression.origin
+                                                )
+                                            )
+                                        }
+                                        return super.visitGetValue(expression)
+                                    }
+
+                                    override fun visitSetValue(
+                                        expression: IrSetValue
+                                    ): IrExpression {
+                                        if (expression.symbol.owner in assignableParams) {
+                                            val paramIndex =
+                                                assignableParams.indexOf(expression.symbol.owner)
+                                            return super.visitSetValue(
+                                                IrSetValueImpl(
+                                                    expression.startOffset,
+                                                    expression.endOffset,
+                                                    expression.type,
+                                                    variables[paramIndex].symbol,
+                                                    expression.value,
+                                                    expression.origin
+                                                )
+                                            )
+                                        }
+                                        return super.visitSetValue(expression)
+                                    }
+                                }
+                            )
+                        }
+
+                    statements.addAll(updatedBody)
+                }
+            }
 
         return super.visitFunction(declaration)
     }
diff --git a/compose/compiler/compiler-hosted/src/main/java/androidx/compose/compiler/plugins/kotlin/lower/LiveLiteralTransformer.kt b/compose/compiler/compiler-hosted/src/main/java/androidx/compose/compiler/plugins/kotlin/lower/LiveLiteralTransformer.kt
index a455c92..8c9708a 100644
--- a/compose/compiler/compiler-hosted/src/main/java/androidx/compose/compiler/plugins/kotlin/lower/LiveLiteralTransformer.kt
+++ b/compose/compiler/compiler-hosted/src/main/java/androidx/compose/compiler/plugins/kotlin/lower/LiveLiteralTransformer.kt
@@ -115,16 +115,16 @@
  * This transformer transforms constant literal expressions into expressions which read a
  * MutableState instance so that changes to the source code of the constant literal can be
  * communicated to the runtime without a recompile. This transformation is intended to improve
- * developer experience and should never be enabled in a release build as it will significantly
- * slow down performance-conscious code.
+ * developer experience and should never be enabled in a release build as it will significantly slow
+ * down performance-conscious code.
  *
  * The nontrivial piece of this transform is to create a stable "durable" unique key for every
  * single constant in the module. It does this by creating a path-based key which roughly maps to
- * the semantic structure of the code, and uses an incrementing index on sibling constants as a
- * last resort. The constant expressions in the IR will be transformed into property getter calls
- * to a synthetic "Live Literals" class that is generated per file. The class is an object
- * singleton where each property is lazily backed by a MutableState instance which is accessed
- * using the runtime's `liveLiteral(String,T)` top level API.
+ * the semantic structure of the code, and uses an incrementing index on sibling constants as a last
+ * resort. The constant expressions in the IR will be transformed into property getter calls to a
+ * synthetic "Live Literals" class that is generated per file. The class is an object singleton
+ * where each property is lazily backed by a MutableState instance which is accessed using the
+ * runtime's `liveLiteral(String,T)` top level API.
  *
  * Roughly speaking, the transform will turn the following:
  *
@@ -135,26 +135,13 @@
  *
  * into the following equivalent representation:
  *
- *    // file: Foo.kt
- *    fun Foo() {
- *      print(LiveLiterals$FooKt.`getString$arg-0$call-print$fun-Foo`())
- *    }
- *    object LiveLiterals$FooKt {
- *      var `String$arg-0$call-print$fun-Foo`: String = "Hello World"
- *      var `State$String$arg-0$call-print$fun-Foo`: MutableState<String>? = null
- *      fun `getString$arg-0$call-print$fun-Foo`(): String {
- *        val field = this.`String$arg-0$call-print$fun-Foo`
- *        val state = if (field == null) {
- *          val tmp = liveLiteral(
- *              "String$arg-0$call-print$fun-Foo",
- *              this.`String$arg-0$call-print$fun-Foo`
- *          )
- *          this.`String$arg-0$call-print$fun-Foo` = tmp
- *          tmp
- *        } else field
- *        return field.value
- *      }
- *    }
+ * // file: Foo.kt fun Foo() { print(LiveLiterals$FooKt.`getString$arg-0$call-print$fun-Foo`()) }
+ * object LiveLiterals$FooKt { var `String$arg-0$call-print$fun-Foo`: String = "Hello World" var
+ * `State$String$arg-0$call-print$fun-Foo`: MutableState<String>? = null fun
+ * `getString$arg-0$call-print$fun-Foo`(): String { val field =
+ * this.`String$arg-0$call-print$fun-Foo` val state = if (field == null) { val tmp = liveLiteral(
+ * "String$arg-0$call-print$fun-Foo", this.`String$arg-0$call-print$fun-Foo` )
+ * this.`String$arg-0$call-print$fun-Foo` = tmp tmp } else field return field.value } }
  *
  * @see DurableKeyVisitor
  */
@@ -175,26 +162,24 @@
         module.transformChildrenVoid(this)
     }
 
-    private val liveLiteral =
-        getTopLevelFunction(ComposeCallableIds.liveLiteral)
+    private val liveLiteral = getTopLevelFunction(ComposeCallableIds.liveLiteral)
     private val isLiveLiteralsEnabled =
         getTopLevelPropertyGetter(ComposeCallableIds.isLiveLiteralsEnabled)
-    private val liveLiteralInfoAnnotation =
-        getTopLevelClass(ComposeClassIds.LiveLiteralInfo)
+    private val liveLiteralInfoAnnotation = getTopLevelClass(ComposeClassIds.LiveLiteralInfo)
     private val liveLiteralFileInfoAnnotation =
         getTopLevelClass(ComposeClassIds.LiveLiteralFileInfo)
-    private val stateInterface =
-        getTopLevelClass(ComposeClassIds.State)
-    private val NoLiveLiteralsAnnotation =
-        getTopLevelClass(ComposeClassIds.NoLiveLiterals)
+    private val stateInterface = getTopLevelClass(ComposeClassIds.State)
+    private val NoLiveLiteralsAnnotation = getTopLevelClass(ComposeClassIds.NoLiveLiterals)
 
-    private fun IrAnnotationContainer.hasNoLiveLiteralsAnnotation(): Boolean = annotations.any {
-        it.symbol.owner == NoLiveLiteralsAnnotation.owner.primaryConstructor
-    }
+    private fun IrAnnotationContainer.hasNoLiveLiteralsAnnotation(): Boolean =
+        annotations.any { it.symbol.owner == NoLiveLiteralsAnnotation.owner.primaryConstructor }
 
     private fun <T> enter(key: String, block: () -> T) = keyVisitor.enter(key, block)
+
     private fun <T> siblings(key: String, block: () -> T) = keyVisitor.siblings(key, block)
+
     private fun <T> siblings(block: () -> T) = keyVisitor.siblings(block)
+
     private var liveLiteralsClass: IrClass? = null
     private var liveLiteralsEnabledSymbol: IrSimpleFunctionSymbol? = null
     private var currentFile: IrFile? = null
@@ -213,35 +198,32 @@
         else asString().replace('<', '$').replace('>', '$').replace(' ', '-')
     }
 
-    private fun irLiveLiteralInfoAnnotation(
-        key: String,
-        offset: Int
-    ): IrConstructorCall = IrConstructorCallImpl(
-        UNDEFINED_OFFSET,
-        UNDEFINED_OFFSET,
-        liveLiteralInfoAnnotation.defaultType,
-        liveLiteralInfoAnnotation.constructors.single(),
-        0,
-        0,
-        2
-    ).apply {
-        putValueArgument(0, irConst(key))
-        putValueArgument(1, irConst(offset))
-    }
+    private fun irLiveLiteralInfoAnnotation(key: String, offset: Int): IrConstructorCall =
+        IrConstructorCallImpl(
+                UNDEFINED_OFFSET,
+                UNDEFINED_OFFSET,
+                liveLiteralInfoAnnotation.defaultType,
+                liveLiteralInfoAnnotation.constructors.single(),
+                0,
+                0,
+                2
+            )
+            .apply {
+                putValueArgument(0, irConst(key))
+                putValueArgument(1, irConst(offset))
+            }
 
-    private fun irLiveLiteralFileInfoAnnotation(
-        file: String
-    ): IrConstructorCall = IrConstructorCallImpl(
-        UNDEFINED_OFFSET,
-        UNDEFINED_OFFSET,
-        liveLiteralFileInfoAnnotation.defaultType,
-        liveLiteralFileInfoAnnotation.constructors.single(),
-        0,
-        0,
-        1
-    ).apply {
-        putValueArgument(0, irConst(file))
-    }
+    private fun irLiveLiteralFileInfoAnnotation(file: String): IrConstructorCall =
+        IrConstructorCallImpl(
+                UNDEFINED_OFFSET,
+                UNDEFINED_OFFSET,
+                liveLiteralFileInfoAnnotation.defaultType,
+                liveLiteralFileInfoAnnotation.constructors.single(),
+                0,
+                0,
+                1
+            )
+            .apply { putValueArgument(0, irConst(file)) }
 
     private fun irLiveLiteralGetter(
         key: String,
@@ -252,150 +234,176 @@
         val clazz = liveLiteralsClass!!
         val stateType = stateInterface.owner.typeWith(literalType).makeNullable()
         val stateGetValue = stateInterface.getPropertyGetter("value")!!
-        val defaultProp = clazz.addProperty {
-            name = Name.identifier(key)
-            visibility = DescriptorVisibilities.PRIVATE
-        }.also { p ->
-            p.backingField = context.irFactory.buildField {
-                name = Name.identifier(key)
-                isStatic = true
-                type = literalType
-                visibility = DescriptorVisibilities.PRIVATE
-            }.also { f ->
-                f.correspondingPropertySymbol = p.symbol
-                f.parent = clazz
-                f.initializer = IrExpressionBodyImpl(
-                    SYNTHETIC_OFFSET,
-                    SYNTHETIC_OFFSET,
-                    literalValue
-                )
-            }
-            p.addGetter {
-                returnType = literalType
-                visibility = DescriptorVisibilities.PRIVATE
-                origin = IrDeclarationOrigin.DEFAULT_PROPERTY_ACCESSOR
-            }.also { fn ->
-                fn.correspondingPropertySymbol = p.symbol
-                val thisParam = clazz.thisReceiver!!.copyTo(fn)
-                fn.dispatchReceiverParameter = thisParam
-                fn.body = DeclarationIrBuilder(context, fn.symbol).irBlockBody {
-                    +irReturn(irGetField(irGet(thisParam), p.backingField!!))
+        val defaultProp =
+            clazz
+                .addProperty {
+                    name = Name.identifier(key)
+                    visibility = DescriptorVisibilities.PRIVATE
                 }
-            }
-        }
-        val stateProp = clazz.addProperty {
-            name = Name.identifier("State\$$key")
-            visibility = DescriptorVisibilities.PRIVATE
-            isVar = true
-        }.also { p ->
-            p.backingField = context.irFactory.buildField {
-                name = Name.identifier("State\$$key")
-                type = stateType
-                visibility = DescriptorVisibilities.PRIVATE
-                isStatic = true
-            }.also { f ->
-                f.correspondingPropertySymbol = p.symbol
-                f.parent = clazz
-            }
-            p.addGetter {
-                returnType = stateType
-                visibility = DescriptorVisibilities.PRIVATE
-                origin = IrDeclarationOrigin.DEFAULT_PROPERTY_ACCESSOR
-            }.also { fn ->
-                fn.correspondingPropertySymbol = p.symbol
-                val thisParam = clazz.thisReceiver!!.copyTo(fn)
-                fn.dispatchReceiverParameter = thisParam
-                fn.body = DeclarationIrBuilder(context, fn.symbol).irBlockBody {
-                    +irReturn(irGetField(irGet(thisParam), p.backingField!!))
+                .also { p ->
+                    p.backingField =
+                        context.irFactory
+                            .buildField {
+                                name = Name.identifier(key)
+                                isStatic = true
+                                type = literalType
+                                visibility = DescriptorVisibilities.PRIVATE
+                            }
+                            .also { f ->
+                                f.correspondingPropertySymbol = p.symbol
+                                f.parent = clazz
+                                f.initializer =
+                                    IrExpressionBodyImpl(
+                                        SYNTHETIC_OFFSET,
+                                        SYNTHETIC_OFFSET,
+                                        literalValue
+                                    )
+                            }
+                    p.addGetter {
+                            returnType = literalType
+                            visibility = DescriptorVisibilities.PRIVATE
+                            origin = IrDeclarationOrigin.DEFAULT_PROPERTY_ACCESSOR
+                        }
+                        .also { fn ->
+                            fn.correspondingPropertySymbol = p.symbol
+                            val thisParam = clazz.thisReceiver!!.copyTo(fn)
+                            fn.dispatchReceiverParameter = thisParam
+                            fn.body =
+                                DeclarationIrBuilder(context, fn.symbol).irBlockBody {
+                                    +irReturn(irGetField(irGet(thisParam), p.backingField!!))
+                                }
+                        }
                 }
-            }
-            p.addSetter {
-                returnType = context.irBuiltIns.unitType
-                visibility = DescriptorVisibilities.PRIVATE
-                origin = IrDeclarationOrigin.DEFAULT_PROPERTY_ACCESSOR
-            }.also { fn ->
-                fn.correspondingPropertySymbol = p.symbol
-                val thisParam = clazz.thisReceiver!!.copyTo(fn)
-                fn.dispatchReceiverParameter = thisParam
-                val valueParam = fn.addValueParameter("value", stateType)
-                fn.body = DeclarationIrBuilder(context, fn.symbol).irBlockBody {
-                    +irSetField(irGet(thisParam), p.backingField!!, irGet(valueParam))
+        val stateProp =
+            clazz
+                .addProperty {
+                    name = Name.identifier("State\$$key")
+                    visibility = DescriptorVisibilities.PRIVATE
+                    isVar = true
                 }
-            }
-        }
-        return clazz.addFunction(
-            name = key,
-            returnType = literalType
-        ).also { fn ->
+                .also { p ->
+                    p.backingField =
+                        context.irFactory
+                            .buildField {
+                                name = Name.identifier("State\$$key")
+                                type = stateType
+                                visibility = DescriptorVisibilities.PRIVATE
+                                isStatic = true
+                            }
+                            .also { f ->
+                                f.correspondingPropertySymbol = p.symbol
+                                f.parent = clazz
+                            }
+                    p.addGetter {
+                            returnType = stateType
+                            visibility = DescriptorVisibilities.PRIVATE
+                            origin = IrDeclarationOrigin.DEFAULT_PROPERTY_ACCESSOR
+                        }
+                        .also { fn ->
+                            fn.correspondingPropertySymbol = p.symbol
+                            val thisParam = clazz.thisReceiver!!.copyTo(fn)
+                            fn.dispatchReceiverParameter = thisParam
+                            fn.body =
+                                DeclarationIrBuilder(context, fn.symbol).irBlockBody {
+                                    +irReturn(irGetField(irGet(thisParam), p.backingField!!))
+                                }
+                        }
+                    p.addSetter {
+                            returnType = context.irBuiltIns.unitType
+                            visibility = DescriptorVisibilities.PRIVATE
+                            origin = IrDeclarationOrigin.DEFAULT_PROPERTY_ACCESSOR
+                        }
+                        .also { fn ->
+                            fn.correspondingPropertySymbol = p.symbol
+                            val thisParam = clazz.thisReceiver!!.copyTo(fn)
+                            fn.dispatchReceiverParameter = thisParam
+                            val valueParam = fn.addValueParameter("value", stateType)
+                            fn.body =
+                                DeclarationIrBuilder(context, fn.symbol).irBlockBody {
+                                    +irSetField(
+                                        irGet(thisParam),
+                                        p.backingField!!,
+                                        irGet(valueParam)
+                                    )
+                                }
+                        }
+                }
+        return clazz.addFunction(name = key, returnType = literalType).also { fn ->
             val thisParam = fn.dispatchReceiverParameter!!
             fn.annotations += irLiveLiteralInfoAnnotation(key, startOffset)
-            fn.body = DeclarationIrBuilder(context, fn.symbol).irBlockBody {
-                // if (!isLiveLiteralsEnabled) return defaultValueField
-                // val a = stateField
-                // val b = if (a == null) {
-                //     val c = liveLiteralState("key", defaultValueField)
-                //     stateField = c
-                //     c
-                // } else a
-                // return b.value
-                val condition = if (usePerFileEnabledFlag)
-                    irNot(
-                        irGet(builtIns.booleanType, irGet(thisParam), liveLiteralsEnabledSymbol!!)
-                    )
-                else
-                    irNot(irCall(isLiveLiteralsEnabled))
-                +irIf(
-                    condition = condition,
-                    body = irReturn(
-                        irGet(
-                            literalType,
-                            irGet(thisParam),
-                            defaultProp.getter!!.symbol
-                        )
-                    )
-                )
-                val a = irTemporary(irGet(stateType, irGet(thisParam), stateProp.getter!!.symbol))
-                val b = irIfNull(
-                    type = stateType,
-                    subject = irGet(a),
-                    thenPart = irBlock(resultType = stateType) {
-                        val liveLiteralCall = irCall(liveLiteral).apply {
-                            putValueArgument(0, irString(key))
-                            putValueArgument(
-                                1,
+            fn.body =
+                DeclarationIrBuilder(context, fn.symbol).irBlockBody {
+                    // if (!isLiveLiteralsEnabled) return defaultValueField
+                    // val a = stateField
+                    // val b = if (a == null) {
+                    //     val c = liveLiteralState("key", defaultValueField)
+                    //     stateField = c
+                    //     c
+                    // } else a
+                    // return b.value
+                    val condition =
+                        if (usePerFileEnabledFlag)
+                            irNot(
                                 irGet(
-                                    literalType,
+                                    builtIns.booleanType,
                                     irGet(thisParam),
-                                    defaultProp.getter!!.symbol
+                                    liveLiteralsEnabledSymbol!!
                                 )
                             )
-                            putTypeArgument(0, literalType)
-                        }
-                        val c = irTemporary(liveLiteralCall)
-                        +irSet(
-                            stateType,
-                            irGet(thisParam),
-                            stateProp.setter!!.symbol,
-                            irGet(c)
+                        else irNot(irCall(isLiveLiteralsEnabled))
+                    +irIf(
+                        condition = condition,
+                        body =
+                            irReturn(
+                                irGet(literalType, irGet(thisParam), defaultProp.getter!!.symbol)
+                            )
+                    )
+                    val a =
+                        irTemporary(irGet(stateType, irGet(thisParam), stateProp.getter!!.symbol))
+                    val b =
+                        irIfNull(
+                            type = stateType,
+                            subject = irGet(a),
+                            thenPart =
+                                irBlock(resultType = stateType) {
+                                    val liveLiteralCall =
+                                        irCall(liveLiteral).apply {
+                                            putValueArgument(0, irString(key))
+                                            putValueArgument(
+                                                1,
+                                                irGet(
+                                                    literalType,
+                                                    irGet(thisParam),
+                                                    defaultProp.getter!!.symbol
+                                                )
+                                            )
+                                            putTypeArgument(0, literalType)
+                                        }
+                                    val c = irTemporary(liveLiteralCall)
+                                    +irSet(
+                                        stateType,
+                                        irGet(thisParam),
+                                        stateProp.setter!!.symbol,
+                                        irGet(c)
+                                    )
+                                    +irGet(c)
+                                },
+                            elsePart = irGet(a)
                         )
-                        +irGet(c)
-                    },
-                    elsePart = irGet(a)
-                )
-                val call = IrCallImpl(
-                    UNDEFINED_OFFSET,
-                    UNDEFINED_OFFSET,
-                    literalType,
-                    stateGetValue,
-                    stateGetValue.owner.typeParameters.size,
-                    stateGetValue.owner.valueParameters.size,
-                    IrStatementOrigin.FOR_LOOP_ITERATOR
-                ).apply {
-                    dispatchReceiver = b
-                }
+                    val call =
+                        IrCallImpl(
+                                UNDEFINED_OFFSET,
+                                UNDEFINED_OFFSET,
+                                literalType,
+                                stateGetValue,
+                                stateGetValue.owner.typeParameters.size,
+                                stateGetValue.owner.valueParameters.size,
+                                IrStatementOrigin.FOR_LOOP_ITERATOR
+                            )
+                            .apply { dispatchReceiver = b }
 
-                +irReturn(call)
-            }
+                    +irReturn(call)
+                }
         }
     }
 
@@ -406,11 +414,12 @@
                 /* Continue visiting expression */
             }
         }
-        val (key, success) = keyVisitor.buildPath(
-            prefix = expression.kind.asString,
-            pathSeparator = "\$",
-            siblingSeparator = "-"
-        )
+        val (key, success) =
+            keyVisitor.buildPath(
+                prefix = expression.kind.asString,
+                pathSeparator = "\$",
+                siblingSeparator = "-"
+            )
         // NOTE: Even if `liveLiteralsEnabled` is false, we are still going to throw an exception
         // here because the presence of a duplicate key represents a bug in this transform since
         // it should be impossible. By checking this always, we are making it so that bugs in
@@ -420,10 +429,8 @@
         // class/file/function with the `@NoLiveLiterals` annotation.
         if (!success) {
             val file = currentFile ?: return expression
-            val src = file.fileEntry.getSourceRangeInfo(
-                expression.startOffset,
-                expression.endOffset
-            )
+            val src =
+                file.fileEntry.getSourceRangeInfo(expression.startOffset, expression.endOffset)
 
             error(
                 "Duplicate live literal key found: $key\n" +
@@ -439,26 +446,29 @@
         if (!liveLiteralsEnabled) return expression
 
         // create the getter function on the live literals class
-        val getter = irLiveLiteralGetter(
-            key = key,
-            // Move the start/endOffsets to the call of the getter since we don't
-            // want to step into <clinit> in the debugger.
-            literalValue = expression.copyWithOffsets(UNDEFINED_OFFSET, UNDEFINED_OFFSET),
-            literalType = expression.type,
-            startOffset = expression.startOffset
-        )
+        val getter =
+            irLiveLiteralGetter(
+                key = key,
+                // Move the start/endOffsets to the call of the getter since we don't
+                // want to step into <clinit> in the debugger.
+                literalValue = expression.copyWithOffsets(UNDEFINED_OFFSET, UNDEFINED_OFFSET),
+                literalType = expression.type,
+                startOffset = expression.startOffset
+            )
 
         // return a call to the getter in place of the constant
         return IrCallImpl(
-            expression.startOffset,
-            expression.endOffset,
-            expression.type,
-            getter.symbol,
-            getter.symbol.owner.typeParameters.size,
-            getter.symbol.owner.valueParameters.size
-        ).apply {
-            dispatchReceiver = irGetLiveLiteralsClass(expression.startOffset, expression.endOffset)
-        }
+                expression.startOffset,
+                expression.endOffset,
+                expression.type,
+                getter.symbol,
+                getter.symbol.owner.typeParameters.size,
+                getter.symbol.owner.valueParameters.size
+            )
+            .apply {
+                dispatchReceiver =
+                    irGetLiveLiteralsClass(expression.startOffset, expression.endOffset)
+            }
     }
 
     override fun visitClass(declaration: IrClass): IrStatement {
@@ -473,9 +483,7 @@
     override fun visitAnonymousInitializer(declaration: IrAnonymousInitializer): IrStatement {
         if (declaration.hasNoLiveLiteralsAnnotation()) return declaration
 
-        return enter("init") {
-            super.visitAnonymousInitializer(declaration)
-        }
+        return enter("init") { super.visitAnonymousInitializer(declaration) }
     }
 
     open fun makeKeySet(): MutableSet<String> {
@@ -492,68 +500,89 @@
                 val prevEnabledSymbol = liveLiteralsEnabledSymbol
                 var nextEnabledSymbol: IrSimpleFunctionSymbol? = null
                 val prevClass = liveLiteralsClass
-                val nextClass = context.irFactory.buildClass {
-                    kind = ClassKind.OBJECT
-                    visibility = DescriptorVisibilities.INTERNAL
-                    val shortName = PackagePartClassUtils.getFilePartShortName(fileName)
-                    // the name of the LiveLiterals class is per-file, so we use the same name that
-                    // the kotlin file class lowering produces, prefixed with `LiveLiterals$`.
-                    name = Name.identifier("LiveLiterals${"$"}$shortName")
-                }.also {
-                    it.createParameterDeclarations()
-
-                    // store the full file path to the file that this class is associated with in an
-                    // annotation on the class. This will be used by tooling to associate the keys
-                    // inside of this class with actual PSI in the editor.
-                    it.annotations += irLiveLiteralFileInfoAnnotation(declaration.fileEntry.name)
-                    it.addConstructor {
-                        isPrimary = true
-                    }.also { ctor ->
-                        ctor.body = DeclarationIrBuilder(context, it.symbol).irBlockBody {
-                            +irDelegatingConstructorCall(
-                                context
-                                    .irBuiltIns
-                                    .anyClass
-                                    .owner
-                                    .primaryConstructor!!
-                            )
+                val nextClass =
+                    context.irFactory
+                        .buildClass {
+                            kind = ClassKind.OBJECT
+                            visibility = DescriptorVisibilities.INTERNAL
+                            val shortName = PackagePartClassUtils.getFilePartShortName(fileName)
+                            // the name of the LiveLiterals class is per-file, so we use the same
+                            // name that
+                            // the kotlin file class lowering produces, prefixed with
+                            // `LiveLiterals$`.
+                            name = Name.identifier("LiveLiterals${"$"}$shortName")
                         }
-                    }
+                        .also {
+                            it.createParameterDeclarations()
 
-                    if (usePerFileEnabledFlag) {
-                        val enabledProp = it.addProperty {
-                            name = Name.identifier("enabled")
-                            visibility = DescriptorVisibilities.PRIVATE
-                        }.also { p ->
-                            p.backingField = context.irFactory.buildField {
-                                name = Name.identifier("enabled")
-                                isStatic = true
-                                type = builtIns.booleanType
-                                visibility = DescriptorVisibilities.PRIVATE
-                            }.also { f ->
-                                f.correspondingPropertySymbol = p.symbol
-                                f.parent = it
-                                f.initializer = IrExpressionBodyImpl(
-                                    SYNTHETIC_OFFSET,
-                                    SYNTHETIC_OFFSET,
-                                    irConst(false)
-                                )
-                            }
-                            p.addGetter {
-                                returnType = builtIns.booleanType
-                                visibility = DescriptorVisibilities.PRIVATE
-                                origin = IrDeclarationOrigin.DEFAULT_PROPERTY_ACCESSOR
-                            }.also { fn ->
-                                val thisParam = it.thisReceiver!!.copyTo(fn)
-                                fn.dispatchReceiverParameter = thisParam
-                                fn.body = DeclarationIrBuilder(context, fn.symbol).irBlockBody {
-                                    +irReturn(irGetField(irGet(thisParam), p.backingField!!))
+                            // store the full file path to the file that this class is associated
+                            // with in an
+                            // annotation on the class. This will be used by tooling to associate
+                            // the keys
+                            // inside of this class with actual PSI in the editor.
+                            it.annotations +=
+                                irLiveLiteralFileInfoAnnotation(declaration.fileEntry.name)
+                            it.addConstructor { isPrimary = true }
+                                .also { ctor ->
+                                    ctor.body =
+                                        DeclarationIrBuilder(context, it.symbol).irBlockBody {
+                                            +irDelegatingConstructorCall(
+                                                context.irBuiltIns.anyClass.owner
+                                                    .primaryConstructor!!
+                                            )
+                                        }
                                 }
+
+                            if (usePerFileEnabledFlag) {
+                                val enabledProp =
+                                    it.addProperty {
+                                            name = Name.identifier("enabled")
+                                            visibility = DescriptorVisibilities.PRIVATE
+                                        }
+                                        .also { p ->
+                                            p.backingField =
+                                                context.irFactory
+                                                    .buildField {
+                                                        name = Name.identifier("enabled")
+                                                        isStatic = true
+                                                        type = builtIns.booleanType
+                                                        visibility = DescriptorVisibilities.PRIVATE
+                                                    }
+                                                    .also { f ->
+                                                        f.correspondingPropertySymbol = p.symbol
+                                                        f.parent = it
+                                                        f.initializer =
+                                                            IrExpressionBodyImpl(
+                                                                SYNTHETIC_OFFSET,
+                                                                SYNTHETIC_OFFSET,
+                                                                irConst(false)
+                                                            )
+                                                    }
+                                            p.addGetter {
+                                                    returnType = builtIns.booleanType
+                                                    visibility = DescriptorVisibilities.PRIVATE
+                                                    origin =
+                                                        IrDeclarationOrigin
+                                                            .DEFAULT_PROPERTY_ACCESSOR
+                                                }
+                                                .also { fn ->
+                                                    val thisParam = it.thisReceiver!!.copyTo(fn)
+                                                    fn.dispatchReceiverParameter = thisParam
+                                                    fn.body =
+                                                        DeclarationIrBuilder(context, fn.symbol)
+                                                            .irBlockBody {
+                                                                +irReturn(
+                                                                    irGetField(
+                                                                        irGet(thisParam),
+                                                                        p.backingField!!
+                                                                    )
+                                                                )
+                                                            }
+                                                }
+                                        }
+                                nextEnabledSymbol = enabledProp.getter?.symbol
                             }
                         }
-                        nextEnabledSymbol = enabledProp.getter?.symbol
-                    }
-                }
                 try {
                     liveLiteralsClass = nextClass
                     currentFile = declaration
@@ -574,17 +603,11 @@
     }
 
     override fun visitTry(aTry: IrTry): IrExpression {
-        aTry.tryResult = enter("try") {
-            aTry.tryResult.transform(this, null)
-        }
+        aTry.tryResult = enter("try") { aTry.tryResult.transform(this, null) }
         siblings {
-            aTry.catches.forEach {
-                it.result = enter("catch") { it.result.transform(this, null) }
-            }
+            aTry.catches.forEach { it.result = enter("catch") { it.result.transform(this, null) } }
         }
-        aTry.finallyExpression = enter("finally") {
-            aTry.finallyExpression?.transform(this, null)
-        }
+        aTry.finallyExpression = enter("finally") { aTry.finallyExpression?.transform(this, null) }
         return aTry
     }
 
@@ -600,19 +623,15 @@
         val name = owner.name.asJvmFriendlyString()
 
         return enter("call-$name") {
-            expression.dispatchReceiver = enter("\$this") {
-                expression.dispatchReceiver?.transform(this, null)
-            }
-            expression.extensionReceiver = enter("\$\$this") {
-                expression.extensionReceiver?.transform(this, null)
-            }
+            expression.dispatchReceiver =
+                enter("\$this") { expression.dispatchReceiver?.transform(this, null) }
+            expression.extensionReceiver =
+                enter("\$\$this") { expression.extensionReceiver?.transform(this, null) }
 
             for (i in 0 until expression.valueArgumentsCount) {
                 val arg = expression.getValueArgument(i)
                 if (arg != null) {
-                    enter("arg-$i") {
-                        expression.putValueArgument(i, arg.transform(this, null))
-                    }
+                    enter("arg-$i") { expression.putValueArgument(i, arg.transform(this, null)) }
                 }
             }
             expression
@@ -624,19 +643,15 @@
         val name = owner.name.asJvmFriendlyString()
 
         return enter("call-$name") {
-            expression.dispatchReceiver = enter("\$this") {
-                expression.dispatchReceiver?.transform(this, null)
-            }
-            expression.extensionReceiver = enter("\$\$this") {
-                expression.extensionReceiver?.transform(this, null)
-            }
+            expression.dispatchReceiver =
+                enter("\$this") { expression.dispatchReceiver?.transform(this, null) }
+            expression.extensionReceiver =
+                enter("\$\$this") { expression.extensionReceiver?.transform(this, null) }
 
             for (i in 0 until expression.valueArgumentsCount) {
                 val arg = expression.getValueArgument(i)
                 if (arg != null) {
-                    enter("arg-$i") {
-                        expression.putValueArgument(i, arg.transform(this, null))
-                    }
+                    enter("arg-$i") { expression.putValueArgument(i, arg.transform(this, null)) }
                 }
             }
             expression
@@ -653,19 +668,15 @@
         val name = owner.name.asJvmFriendlyString()
 
         return enter("call-$name") {
-            expression.dispatchReceiver = enter("\$this") {
-                expression.dispatchReceiver?.transform(this, null)
-            }
-            expression.extensionReceiver = enter("\$\$this") {
-                expression.extensionReceiver?.transform(this, null)
-            }
+            expression.dispatchReceiver =
+                enter("\$this") { expression.dispatchReceiver?.transform(this, null) }
+            expression.extensionReceiver =
+                enter("\$\$this") { expression.extensionReceiver?.transform(this, null) }
 
             for (i in 0 until expression.valueArgumentsCount) {
                 val arg = expression.getValueArgument(i)
                 if (arg != null) {
-                    enter("arg-$i") {
-                        expression.putValueArgument(i, arg.transform(this, null))
-                    }
+                    enter("arg-$i") { expression.putValueArgument(i, arg.transform(this, null)) }
                 }
             }
             expression
@@ -677,19 +688,15 @@
         val name = owner.name.asJvmFriendlyString()
 
         return enter("call-$name") {
-            expression.dispatchReceiver = enter("\$this") {
-                expression.dispatchReceiver?.transform(this, null)
-            }
-            expression.extensionReceiver = enter("\$\$this") {
-                expression.extensionReceiver?.transform(this, null)
-            }
+            expression.dispatchReceiver =
+                enter("\$this") { expression.dispatchReceiver?.transform(this, null) }
+            expression.extensionReceiver =
+                enter("\$\$this") { expression.extensionReceiver?.transform(this, null) }
 
             for (i in 0 until expression.valueArgumentsCount) {
                 val arg = expression.getValueArgument(i)
                 if (arg != null) {
-                    enter("arg-$i") {
-                        expression.putValueArgument(i, arg.transform(this, null))
-                    }
+                    enter("arg-$i") { expression.putValueArgument(i, arg.transform(this, null)) }
                 }
             }
             expression
@@ -706,9 +713,8 @@
         if (expression !is IrVarargImpl) return expression
         return enter("vararg") {
             expression.elements.forEachIndexed { i, arg ->
-                expression.elements[i] = enter("$i") {
-                    arg.transform(this, null) as IrVarargElement
-                }
+                expression.elements[i] =
+                    enter("$i") { arg.transform(this, null) as IrVarargElement }
             }
             expression
         }
@@ -726,15 +732,17 @@
             // in these cases, the compiler relies on a certain structure for the condition
             // expression, so we only touch the body
             IrStatementOrigin.WHILE_LOOP,
-            IrStatementOrigin.FOR_LOOP_INNER_WHILE -> enter("loop") {
-                loop.body = enter("body") { loop.body?.transform(this, null) }
-                loop
-            }
-            else -> enter("loop") {
-                loop.condition = enter("cond") { loop.condition.transform(this, null) }
-                loop.body = enter("body") { loop.body?.transform(this, null) }
-                loop
-            }
+            IrStatementOrigin.FOR_LOOP_INNER_WHILE ->
+                enter("loop") {
+                    loop.body = enter("body") { loop.body?.transform(this, null) }
+                    loop
+                }
+            else ->
+                enter("loop") {
+                    loop.condition = enter("cond") { loop.condition.transform(this, null) }
+                    loop.body = enter("body") { loop.body?.transform(this, null) }
+                    loop
+                }
         }
     }
 
@@ -743,9 +751,7 @@
         return enter("str") {
             siblings {
                 expression.arguments.forEachIndexed { index, expr ->
-                    expression.arguments[index] = enter("$index") {
-                        expr.transform(this, null)
-                    }
+                    expression.arguments[index] = enter("$index") { expr.transform(this, null) }
                 }
                 expression
             }
@@ -767,14 +773,8 @@
                 expression.branches[1] = expression.branches[1].transform(this, null)
                 expression
             }
-
-            IrStatementOrigin.IF -> siblings("if") {
-                super.visitWhen(expression)
-            }
-
-            else -> siblings("when") {
-                super.visitWhen(expression)
-            }
+            IrStatementOrigin.IF -> siblings("if") { super.visitWhen(expression) }
+            else -> siblings("when") { super.visitWhen(expression) }
         }
     }
 
@@ -791,9 +791,7 @@
             // the condition of an else branch is a constant boolean but we don't want
             // to convert it into a live literal, so we don't transform it
             condition = branch.condition,
-            result = enter("else") {
-                branch.result.transform(this, null)
-            }
+            result = enter("else") { branch.result.transform(this, null) }
         )
     }
 
@@ -801,21 +799,15 @@
         return IrBranchImpl(
             startOffset = branch.startOffset,
             endOffset = branch.endOffset,
-            condition = enter("cond") {
-                branch.condition.transform(this, null)
-            },
+            condition = enter("cond") { branch.condition.transform(this, null) },
             // only translate the result, as the branch is a constant boolean but we don't want
             // to convert it into a live literal
-            result = enter("branch") {
-                branch.result.transform(this, null)
-            }
+            result = enter("branch") { branch.result.transform(this, null) }
         )
     }
 
     override fun visitComposite(expression: IrComposite): IrExpression {
-        return siblings {
-            super.visitComposite(expression)
-        }
+        return siblings { super.visitComposite(expression) }
     }
 
     override fun visitBlock(expression: IrBlock): IrExpression {
@@ -828,14 +820,12 @@
                     expression.statements[1].transform(this, null) as IrStatement
                 expression
             }
-//            IrStatementOrigin.SAFE_CALL
-//            IrStatementOrigin.WHEN
-//            IrStatementOrigin.IF
-//            IrStatementOrigin.ELVIS
-//            IrStatementOrigin.ARGUMENTS_REORDERING_FOR_CALL
-            else -> siblings {
-                super.visitBlock(expression)
-            }
+            //            IrStatementOrigin.SAFE_CALL
+            //            IrStatementOrigin.WHEN
+            //            IrStatementOrigin.IF
+            //            IrStatementOrigin.ELVIS
+            //            IrStatementOrigin.ARGUMENTS_REORDERING_FOR_CALL
+            else -> siblings { super.visitBlock(expression) }
         }
     }
 
@@ -858,9 +848,7 @@
     }
 
     override fun visitBlockBody(body: IrBlockBody): IrBody {
-        return siblings {
-            super.visitBlockBody(body)
-        }
+        return siblings { super.visitBlockBody(body) }
     }
 
     override fun visitVariable(declaration: IrVariable): IrStatement {
@@ -882,12 +870,8 @@
             // safe operation. We should figure out a way to do this for "static" expressions
             // though such as `val foo = 16.dp`.
             declaration.backingField = backingField
-            declaration.getter = enter("get") {
-                getter?.transform(this, null) as? IrSimpleFunction
-            }
-            declaration.setter = enter("set") {
-                setter?.transform(this, null) as? IrSimpleFunction
-            }
+            declaration.getter = enter("get") { getter?.transform(this, null) as? IrSimpleFunction }
+            declaration.setter = enter("set") { setter?.transform(this, null) as? IrSimpleFunction }
             declaration
         }
     }
@@ -902,25 +886,26 @@
             }
         }
 
-    fun IrFactory.buildFunction(builder: IrFunctionBuilder): IrSimpleFunction = with(builder) {
-        createSimpleFunction(
-            startOffset = startOffset,
-            endOffset = endOffset,
-            origin = origin,
-            name = name,
-            visibility = visibility,
-            isInline = isInline,
-            isExpect = isExpect,
-            returnType = returnType,
-            modality = modality,
-            symbol = IrSimpleFunctionSymbolImpl(),
-            isTailrec = isTailrec,
-            isSuspend = isSuspend,
-            isOperator = isOperator,
-            isInfix = isInfix,
-            isExternal = isExternal,
-            containerSource = containerSource,
-            isFakeOverride = isFakeOverride
-        )
-    }
+    fun IrFactory.buildFunction(builder: IrFunctionBuilder): IrSimpleFunction =
+        with(builder) {
+            createSimpleFunction(
+                startOffset = startOffset,
+                endOffset = endOffset,
+                origin = origin,
+                name = name,
+                visibility = visibility,
+                isInline = isInline,
+                isExpect = isExpect,
+                returnType = returnType,
+                modality = modality,
+                symbol = IrSimpleFunctionSymbolImpl(),
+                isTailrec = isTailrec,
+                isSuspend = isSuspend,
+                isOperator = isOperator,
+                isInfix = isInfix,
+                isExternal = isExternal,
+                containerSource = containerSource,
+                isFakeOverride = isFakeOverride
+            )
+        }
 }
diff --git a/compose/compiler/compiler-hosted/src/main/java/androidx/compose/compiler/plugins/kotlin/lower/WrapJsComposableLambdaLowering.kt b/compose/compiler/compiler-hosted/src/main/java/androidx/compose/compiler/plugins/kotlin/lower/WrapJsComposableLambdaLowering.kt
index 3b527cc..f070f1a 100644
--- a/compose/compiler/compiler-hosted/src/main/java/androidx/compose/compiler/plugins/kotlin/lower/WrapJsComposableLambdaLowering.kt
+++ b/compose/compiler/compiler-hosted/src/main/java/androidx/compose/compiler/plugins/kotlin/lower/WrapJsComposableLambdaLowering.kt
@@ -58,10 +58,9 @@
 import org.jetbrains.kotlin.name.SpecialNames
 
 /**
- * This lowering is necessary for k/js:
- * `composableLambda` and `composableLambdaInstance` return an instance of ComposableLambda which
- * doesn't implement FunctionX interfaces in k/js (due to k/js limitation), therefore they can't be
- * invoked using Function.invoke symbol.
+ * This lowering is necessary for k/js: `composableLambda` and `composableLambdaInstance` return an
+ * instance of ComposableLambda which doesn't implement FunctionX interfaces in k/js (due to k/js
+ * limitation), therefore they can't be invoked using Function.invoke symbol.
  *
  * This lowering finds all calls to `composableLambda(...)` and `composableLambdaInstance(...)`,
  * then transforms them into lambda expressions wrapping the original ComposableLambda instance:
@@ -70,15 +69,17 @@
  * ``` composableLambda(...) ```
  * After the lowering:
  * ```
- * run<FunctionX> { // same type as lambda argument in composableLambda call
- *    val composableLambdaVar = composableLambda(...) // the original call
- *    // return the same instance if composableLambdaVar didn't change
- *    return@run remember(composableLambdaVar) { composableLambdaVar::invoke }
- * }
+ *
+ * run<FunctionX> { // same type as lambda argument in composableLambda call val composableLambdaVar
+ * = composableLambda(...) // the original call // return the same instance if composableLambdaVar
+ * didn't change return@run remember(composableLambdaVar) { composableLambdaVar::invoke } }
+ *
  * ```
  * composableLambdaInstance After the lowering:
  * ```
+ *
  * composableLambdaInstance()::invoke
+ *
  * ```
  */
 class WrapJsComposableLambdaLowering(
@@ -89,48 +90,61 @@
     stabilityInferencer: StabilityInferencer,
     private val decoysEnabled: Boolean,
     featureFlags: FeatureFlags,
-) : AbstractComposeLowering(
-    context,
-    symbolRemapper,
-    metrics,
-    stabilityInferencer,
-    featureFlags,
-) {
+) :
+    AbstractComposeLowering(
+        context,
+        symbolRemapper,
+        metrics,
+        stabilityInferencer,
+        featureFlags,
+    ) {
     private val rememberFunSymbol by lazy {
-        val composerParamTransformer = ComposerParamTransformer(
-            context, symbolRemapper, stabilityInferencer, decoysEnabled, metrics, featureFlags
-        )
-        symbolRemapper.getReferencedSimpleFunction(
-            getTopLevelFunctions(ComposeCallableIds.remember).map { it.owner }.first {
-                it.valueParameters.size == 2 && !it.valueParameters.first().isVararg
-            }.symbol
-        ).owner.let {
-            if (!decoysEnabled || signatureBuilder == null) {
-                composerParamTransformer.visitSimpleFunction(it) as IrSimpleFunction
-            } else {
-                // If a module didn't have any explicit remember calls,
-                // so `fun remember` wasn't transformed yet, then we have to transform it now.
-                val createDecoysTransformer = CreateDecoysTransformer(
-                    context,
-                    symbolRemapper,
-                    signatureBuilder,
-                    stabilityInferencer,
-                    metrics,
-                    featureFlags,
-                )
-                with(createDecoysTransformer) {
-                    if (!it.isDecoy()) {
-                        visitSimpleFunction(it) as IrSimpleFunction
-                        updateParents()
-                        composerParamTransformer.visitSimpleFunction(
+        val composerParamTransformer =
+            ComposerParamTransformer(
+                context,
+                symbolRemapper,
+                stabilityInferencer,
+                decoysEnabled,
+                metrics,
+                featureFlags
+            )
+        symbolRemapper
+            .getReferencedSimpleFunction(
+                getTopLevelFunctions(ComposeCallableIds.remember)
+                    .map { it.owner }
+                    .first { it.valueParameters.size == 2 && !it.valueParameters.first().isVararg }
+                    .symbol
+            )
+            .owner
+            .let {
+                if (!decoysEnabled || signatureBuilder == null) {
+                    composerParamTransformer.visitSimpleFunction(it) as IrSimpleFunction
+                } else {
+                    // If a module didn't have any explicit remember calls,
+                    // so `fun remember` wasn't transformed yet, then we have to transform it now.
+                    val createDecoysTransformer =
+                        CreateDecoysTransformer(
+                            context,
+                            symbolRemapper,
+                            signatureBuilder,
+                            stabilityInferencer,
+                            metrics,
+                            featureFlags,
+                        )
+                    with(createDecoysTransformer) {
+                        if (!it.isDecoy()) {
+                            visitSimpleFunction(it) as IrSimpleFunction
+                            updateParents()
+                            composerParamTransformer.visitSimpleFunction(
+                                it.getComposableForDecoy().owner as IrSimpleFunction
+                            ) as IrSimpleFunction
+                        } else {
                             it.getComposableForDecoy().owner as IrSimpleFunction
-                        ) as IrSimpleFunction
-                    } else {
-                        it.getComposableForDecoy().owner as IrSimpleFunction
+                        }
                     }
                 }
             }
-        }.symbol
+            .symbol
     }
 
     override fun lower(module: IrModuleFragment) {
@@ -155,98 +169,104 @@
         lambda: IrFunctionExpression,
         dispatchReceiver: IrExpression
     ): IrFunctionReferenceImpl {
-        val argumentsCount = lambda.function.valueParameters.size +
-            if (lambda.function.extensionReceiverParameter != null) 1 else 0
+        val argumentsCount =
+            lambda.function.valueParameters.size +
+                if (lambda.function.extensionReceiverParameter != null) 1 else 0
 
-        val invokeSymbol = symbolRemapper.getReferencedClass(
-            getTopLevelClass(ComposeClassIds.ComposableLambda)
-        ).functions.single {
-            it.owner.name.asString() == "invoke" &&
-                argumentsCount == it.owner.valueParameters.size
-        }
+        val invokeSymbol =
+            symbolRemapper
+                .getReferencedClass(getTopLevelClass(ComposeClassIds.ComposableLambda))
+                .functions
+                .single {
+                    it.owner.name.asString() == "invoke" &&
+                        argumentsCount == it.owner.valueParameters.size
+                }
 
         return IrFunctionReferenceImpl(
-            startOffset = UNDEFINED_OFFSET,
-            endOffset = UNDEFINED_OFFSET,
-            type = lambda.type,
-            symbol = invokeSymbol,
-            typeArgumentsCount = invokeSymbol.owner.typeParameters.size,
-            valueArgumentsCount = invokeSymbol.owner.valueParameters.size
-        ).also { reference ->
-            reference.dispatchReceiver = dispatchReceiver
-        }
+                startOffset = UNDEFINED_OFFSET,
+                endOffset = UNDEFINED_OFFSET,
+                type = lambda.type,
+                symbol = invokeSymbol,
+                typeArgumentsCount = invokeSymbol.owner.typeParameters.size,
+                valueArgumentsCount = invokeSymbol.owner.valueParameters.size
+            )
+            .also { reference -> reference.dispatchReceiver = dispatchReceiver }
     }
 
     private fun transformComposableLambdaCall(originalCall: IrCall): IrExpression {
         val currentComposer = originalCall.getValueArgument(0)
-        val lambda = originalCall.getValueArgument(originalCall.valueArgumentsCount - 1)
-            as IrFunctionExpression
+        val lambda =
+            originalCall.getValueArgument(originalCall.valueArgumentsCount - 1)
+                as IrFunctionExpression
 
         val composableLambdaVar = irTemporary(originalCall, "dispatchReceiver")
         // create dispatchReceiver::invoke function reference
-        val funReference = functionReferenceForComposableLambda(
-            lambda, irGet(composableLambdaVar)
-        )
+        val funReference = functionReferenceForComposableLambda(lambda, irGet(composableLambdaVar))
 
         val calculationFunSymbol = IrSimpleFunctionSymbolImpl()
-        val rememberBlock = createLambda0(
-            returnType = lambda.type,
-            functionSymbol = calculationFunSymbol,
-            statements = listOf(irReturn(calculationFunSymbol, funReference))
-        )
+        val rememberBlock =
+            createLambda0(
+                returnType = lambda.type,
+                functionSymbol = calculationFunSymbol,
+                statements = listOf(irReturn(calculationFunSymbol, funReference))
+            )
 
         // create remember(dispatchReceiver,...) { dispatchReceiver::invoke }
-        val rememberCall = IrCallImpl(
-            startOffset = SYNTHETIC_OFFSET,
-            endOffset = SYNTHETIC_OFFSET,
-            type = lambda.type,
-            symbol = rememberFunSymbol,
-            typeArgumentsCount = 1,
-            valueArgumentsCount = 4
-        ).apply {
-            putTypeArgument(0, lambda.type)
-            putValueArgument(0, irGet(composableLambdaVar)) // key1
-            putValueArgument(1, rememberBlock) // calculation
-            putValueArgument(2, currentComposer) // composer
-            putValueArgument(3, irConst(0)) // changed
-        }
+        val rememberCall =
+            IrCallImpl(
+                    startOffset = SYNTHETIC_OFFSET,
+                    endOffset = SYNTHETIC_OFFSET,
+                    type = lambda.type,
+                    symbol = rememberFunSymbol,
+                    typeArgumentsCount = 1,
+                    valueArgumentsCount = 4
+                )
+                .apply {
+                    putTypeArgument(0, lambda.type)
+                    putValueArgument(0, irGet(composableLambdaVar)) // key1
+                    putValueArgument(1, rememberBlock) // calculation
+                    putValueArgument(2, currentComposer) // composer
+                    putValueArgument(3, irConst(0)) // changed
+                }
 
         val runBlockSymbol = IrSimpleFunctionSymbolImpl()
-        val runBlock = createLambda0(
-            returnType = lambda.type,
-            functionSymbol = runBlockSymbol,
-            statements = mutableListOf<IrStatement>().apply {
-                add(composableLambdaVar) // referenced in rememberCall
-                add(irReturn(runBlockSymbol, rememberCall))
-            }
-        )
+        val runBlock =
+            createLambda0(
+                returnType = lambda.type,
+                functionSymbol = runBlockSymbol,
+                statements =
+                    mutableListOf<IrStatement>().apply {
+                        add(composableLambdaVar) // referenced in rememberCall
+                        add(irReturn(runBlockSymbol, rememberCall))
+                    }
+            )
 
         return callRun(returnType = lambda.type, runBlock = runBlock)
     }
 
     private fun transformComposableLambdaInstanceCall(originalCall: IrCall): IrExpression {
-        val lambda = originalCall.getValueArgument(originalCall.valueArgumentsCount - 1)
-            as IrFunctionExpression
+        val lambda =
+            originalCall.getValueArgument(originalCall.valueArgumentsCount - 1)
+                as IrFunctionExpression
 
         // create composableLambdaInstance::invoke function reference
         return functionReferenceForComposableLambda(lambda, originalCall)
     }
 
     private fun callRun(returnType: IrType, runBlock: IrFunctionExpressionImpl): IrCall {
-        val runSymbol = getTopLevelFunction(
-            CallableId(FqName("kotlin"), Name.identifier("run"))
-        )
+        val runSymbol = getTopLevelFunction(CallableId(FqName("kotlin"), Name.identifier("run")))
         return IrCallImpl(
-            startOffset = SYNTHETIC_OFFSET,
-            endOffset = SYNTHETIC_OFFSET,
-            type = returnType,
-            symbol = runSymbol,
-            typeArgumentsCount = 1,
-            valueArgumentsCount = 1
-        ).apply {
-            putTypeArgument(0, returnType)
-            putValueArgument(0, runBlock)
-        }
+                startOffset = SYNTHETIC_OFFSET,
+                endOffset = SYNTHETIC_OFFSET,
+                type = returnType,
+                symbol = runSymbol,
+                typeArgumentsCount = 1,
+                valueArgumentsCount = 1
+            )
+            .apply {
+                putTypeArgument(0, returnType)
+                putValueArgument(0, runBlock)
+            }
     }
 
     private fun createLambda0(
@@ -259,25 +279,27 @@
             endOffset = SYNTHETIC_OFFSET,
             type = context.irBuiltIns.functionN(0).typeWith(returnType),
             origin = IrStatementOrigin.LAMBDA,
-            function = IrFunctionImpl(
-                startOffset = SYNTHETIC_OFFSET,
-                endOffset = SYNTHETIC_OFFSET,
-                origin = IrDeclarationOrigin.LOCAL_FUNCTION_FOR_LAMBDA,
-                symbol = functionSymbol,
-                name = SpecialNames.ANONYMOUS,
-                visibility = DescriptorVisibilities.LOCAL,
-                modality = Modality.FINAL,
-                returnType = returnType,
-                isInline = true,
-                isExternal = false,
-                isTailrec = false,
-                isSuspend = false,
-                isOperator = false,
-                isInfix = false,
-                isExpect = false
-            ).apply {
-                body = IrBlockBodyImpl(SYNTHETIC_OFFSET, SYNTHETIC_OFFSET, statements)
-            }
+            function =
+                IrFunctionImpl(
+                        startOffset = SYNTHETIC_OFFSET,
+                        endOffset = SYNTHETIC_OFFSET,
+                        origin = IrDeclarationOrigin.LOCAL_FUNCTION_FOR_LAMBDA,
+                        symbol = functionSymbol,
+                        name = SpecialNames.ANONYMOUS,
+                        visibility = DescriptorVisibilities.LOCAL,
+                        modality = Modality.FINAL,
+                        returnType = returnType,
+                        isInline = true,
+                        isExternal = false,
+                        isTailrec = false,
+                        isSuspend = false,
+                        isOperator = false,
+                        isInfix = false,
+                        isExpect = false
+                    )
+                    .apply {
+                        body = IrBlockBodyImpl(SYNTHETIC_OFFSET, SYNTHETIC_OFFSET, statements)
+                    }
         )
     }
 }
diff --git a/compose/compiler/compiler-hosted/src/main/java/androidx/compose/compiler/plugins/kotlin/lower/decoys/AbstractDecoysLowering.kt b/compose/compiler/compiler-hosted/src/main/java/androidx/compose/compiler/plugins/kotlin/lower/decoys/AbstractDecoysLowering.kt
index bfb4453..5f101d0 100644
--- a/compose/compiler/compiler-hosted/src/main/java/androidx/compose/compiler/plugins/kotlin/lower/decoys/AbstractDecoysLowering.kt
+++ b/compose/compiler/compiler-hosted/src/main/java/androidx/compose/compiler/plugins/kotlin/lower/decoys/AbstractDecoysLowering.kt
@@ -41,13 +41,15 @@
     stabilityInferencer: StabilityInferencer,
     override val signatureBuilder: IdSignatureSerializer,
     featureFlags: FeatureFlags,
-) : AbstractComposeLowering(
-    context = pluginContext,
-    symbolRemapper = symbolRemapper,
-    metrics = metrics,
-    stabilityInferencer = stabilityInferencer,
-    featureFlags = featureFlags
-), DecoyTransformBase {
+) :
+    AbstractComposeLowering(
+        context = pluginContext,
+        symbolRemapper = symbolRemapper,
+        metrics = metrics,
+        stabilityInferencer = stabilityInferencer,
+        featureFlags = featureFlags
+    ),
+    DecoyTransformBase {
 
     override fun visitFile(declaration: IrFile): IrFile {
         includeFileNameInExceptionTrace(declaration) {
@@ -72,14 +74,11 @@
             (isLocal && (this is IrSimpleFunction && !overridesComposable()))
 
     private fun IrSimpleFunction.overridesComposable() =
-        overriddenSymbols.any {
-            it.owner.isDecoy() || it.owner.shouldBeRemapped()
-        }
+        overriddenSymbols.any { it.owner.isDecoy() || it.owner.shouldBeRemapped() }
 
     private fun IrFunction.hasComposableParameter() =
         valueParameters.any { it.type.containsComposableAnnotation() } ||
             extensionReceiverParameter?.type.containsComposableAnnotation()
 
-    private fun IrFunction.isEnumConstructor() =
-        this is IrConstructor && parentAsClass.isEnumClass
+    private fun IrFunction.isEnumConstructor() = this is IrConstructor && parentAsClass.isEnumClass
 }
diff --git a/compose/compiler/compiler-hosted/src/main/java/androidx/compose/compiler/plugins/kotlin/lower/decoys/CreateDecoysTransformer.kt b/compose/compiler/compiler-hosted/src/main/java/androidx/compose/compiler/plugins/kotlin/lower/decoys/CreateDecoysTransformer.kt
index 0cc8ca9..1ad8e571 100644
--- a/compose/compiler/compiler-hosted/src/main/java/androidx/compose/compiler/plugins/kotlin/lower/decoys/CreateDecoysTransformer.kt
+++ b/compose/compiler/compiler-hosted/src/main/java/androidx/compose/compiler/plugins/kotlin/lower/decoys/CreateDecoysTransformer.kt
@@ -48,9 +48,9 @@
 import org.jetbrains.kotlin.name.Name
 
 /**
- * Copies each IR declaration that won't match descriptors after Compose transforms (see [shouldBeRemapped]).
- * Original function are kept to match descriptors with a stubbed body, all other transforms are
- * applied to the copied version only.
+ * Copies each IR declaration that won't match descriptors after Compose transforms (see
+ * [shouldBeRemapped]). Original function are kept to match descriptors with a stubbed body, all
+ * other transforms are applied to the copied version only.
  *
  * Example:
  * ```
@@ -59,7 +59,6 @@
  * ```
  *
  * is transformed into:
- *
  * ```
  * @Decoy(targetName="A$composable")
  * fun A(x: Any) {
@@ -78,20 +77,20 @@
     stabilityInferencer: StabilityInferencer,
     metrics: ModuleMetrics,
     featureFlags: FeatureFlags,
-) : AbstractDecoysLowering(
-    pluginContext = pluginContext,
-    symbolRemapper = symbolRemapper,
-    metrics = metrics,
-    stabilityInferencer = stabilityInferencer,
-    signatureBuilder = signatureBuilder,
-    featureFlags = featureFlags
-), ModuleLoweringPass {
+) :
+    AbstractDecoysLowering(
+        pluginContext = pluginContext,
+        symbolRemapper = symbolRemapper,
+        metrics = metrics,
+        stabilityInferencer = stabilityInferencer,
+        signatureBuilder = signatureBuilder,
+        featureFlags = featureFlags
+    ),
+    ModuleLoweringPass {
 
     private val originalFunctions: MutableMap<IrFunction, IrDeclarationParent> = mutableMapOf()
 
-    private val decoyAnnotation by lazy {
-        getTopLevelClass(DecoyClassIds.Decoy).owner
-    }
+    private val decoyAnnotation by lazy { getTopLevelClass(DecoyClassIds.Decoy).owner }
 
     private val decoyImplementationAnnotation by lazy {
         getTopLevelClass(DecoyClassIds.DecoyImplementation).owner
@@ -153,9 +152,8 @@
         }
 
         val newName = declaration.decoyImplementationName()
-        val copied = declaration.copyWithName(
-            newName, context.irFactory::buildConstructor
-        ) as IrConstructor
+        val copied =
+            declaration.copyWithName(newName, context.irFactory::buildConstructor) as IrConstructor
         copied.parent = declaration.parent
         originalFunctions += copied to declaration.parent
 
@@ -171,9 +169,7 @@
     }
 
     private fun IrFunction.decoyImplementationName(): Name {
-        return dexSafeName(
-            Name.identifier(name.asString() + IMPLEMENTATION_FUNCTION_SUFFIX)
-        )
+        return dexSafeName(Name.identifier(name.asString() + IMPLEMENTATION_FUNCTION_SUFFIX))
     }
 
     private fun IrFunction.copyWithName(
@@ -200,55 +196,62 @@
         newFunction.addDecoyImplementationAnnotation(newName.asString(), original.getSignatureId())
         newFunction.copyParametersFrom(original)
 
-        newFunction.body = original.moveBodyTo(newFunction)
-            ?.copyWithNewTypeParams(original, newFunction)
+        newFunction.body =
+            original.moveBodyTo(newFunction)?.copyWithNewTypeParams(original, newFunction)
 
         return newFunction
     }
 
     private fun IrFunction.stubBody() {
-        body = DeclarationIrBuilder(context, symbol).irBlockBody {
-            + irReturn(
-                irCall(decoyStub).also { call ->
-                    call.putValueArgument(0, irConst(name.asString()))
-                }
-            )
-        }
+        body =
+            DeclarationIrBuilder(context, symbol).irBlockBody {
+                +irReturn(
+                    irCall(decoyStub).also { call ->
+                        call.putValueArgument(0, irConst(name.asString()))
+                    }
+                )
+            }
     }
 
     private fun IrFunction.setDecoyAnnotation(implementationName: String) {
-        annotations = listOf(
-            IrConstructorCallImpl.fromSymbolOwner(
-                type = decoyAnnotation.defaultType,
-                constructorSymbol = decoyAnnotation.constructors.first().symbol
-            ).also {
-                it.putValueArgument(0, irConst(implementationName))
-                it.putValueArgument(1, irVarargString(emptyList()))
-            }
-        )
+        annotations =
+            listOf(
+                IrConstructorCallImpl.fromSymbolOwner(
+                        type = decoyAnnotation.defaultType,
+                        constructorSymbol = decoyAnnotation.constructors.first().symbol
+                    )
+                    .also {
+                        it.putValueArgument(0, irConst(implementationName))
+                        it.putValueArgument(1, irVarargString(emptyList()))
+                    }
+            )
     }
 
     private fun IrFunction.addDecoyImplementationAnnotation(name: String, signatureId: Long) {
-        annotations = annotations +
-            IrConstructorCallImpl.fromSymbolOwner(
-                type = decoyImplementationAnnotation.defaultType,
-                constructorSymbol = decoyImplementationAnnotation.constructors.first().symbol
-            ).also {
-                it.putValueArgument(0, irConst(name))
-                it.putValueArgument(1, irConst(signatureId))
-            }
+        annotations =
+            annotations +
+                IrConstructorCallImpl.fromSymbolOwner(
+                        type = decoyImplementationAnnotation.defaultType,
+                        constructorSymbol =
+                            decoyImplementationAnnotation.constructors.first().symbol
+                    )
+                    .also {
+                        it.putValueArgument(0, irConst(name))
+                        it.putValueArgument(1, irConst(signatureId))
+                    }
 
-        annotations = annotations +
-            IrConstructorCallImpl.fromSymbolOwner(
-                type = decoyImplementationDefaultsBitmaskAnnotation.defaultType,
-                constructorSymbol =
-                    decoyImplementationDefaultsBitmaskAnnotation.constructors.first().symbol
-            ).also {
-                val paramsWithDefaultsBitMask = bitMask(
-                    *valueParameters.map { it.hasDefaultValue() }.toBooleanArray()
-                )
-                it.putValueArgument(0, irConst(paramsWithDefaultsBitMask))
-            }
+        annotations =
+            annotations +
+                IrConstructorCallImpl.fromSymbolOwner(
+                        type = decoyImplementationDefaultsBitmaskAnnotation.defaultType,
+                        constructorSymbol =
+                            decoyImplementationDefaultsBitmaskAnnotation.constructors.first().symbol
+                    )
+                    .also {
+                        val paramsWithDefaultsBitMask =
+                            bitMask(*valueParameters.map { it.hasDefaultValue() }.toBooleanArray())
+                        it.putValueArgument(0, irConst(paramsWithDefaultsBitMask))
+                    }
     }
 
     companion object {
diff --git a/compose/compiler/compiler-hosted/src/main/java/androidx/compose/compiler/plugins/kotlin/lower/decoys/DecoyTransformBase.kt b/compose/compiler/compiler-hosted/src/main/java/androidx/compose/compiler/plugins/kotlin/lower/decoys/DecoyTransformBase.kt
index 037b408..65ea8a9 100644
--- a/compose/compiler/compiler-hosted/src/main/java/androidx/compose/compiler/plugins/kotlin/lower/decoys/DecoyTransformBase.kt
+++ b/compose/compiler/compiler-hosted/src/main/java/androidx/compose/compiler/plugins/kotlin/lower/decoys/DecoyTransformBase.kt
@@ -58,8 +58,8 @@
     val signatureBuilder: IdSignatureSerializer
 
     fun IrFunction.getSignatureId(): Long {
-        val signature = symbol.signature
-            ?: signatureBuilder.composeSignatureForDeclaration(this, false)
+        val signature =
+            symbol.signature ?: signatureBuilder.composeSignatureForDeclaration(this, false)
 
         return signature.getSignatureId()
     }
@@ -79,20 +79,19 @@
     }
 
     fun irVarargString(valueArguments: List<String>): IrExpression {
-        val stringArrayType = IrSimpleTypeImpl(
-            classifier = context.irBuiltIns.arrayClass,
-            hasQuestionMark = false,
-            arguments = listOf(context.irBuiltIns.stringType as IrTypeArgument),
-            annotations = emptyList()
-        )
+        val stringArrayType =
+            IrSimpleTypeImpl(
+                classifier = context.irBuiltIns.arrayClass,
+                hasQuestionMark = false,
+                arguments = listOf(context.irBuiltIns.stringType as IrTypeArgument),
+                annotations = emptyList()
+            )
         return IrVarargImpl(
             UNDEFINED_OFFSET,
             UNDEFINED_OFFSET,
             type = stringArrayType,
             varargElementType = context.irBuiltIns.stringType,
-            elements = valueArguments.map {
-                it.toIrConst(context.irBuiltIns.stringType)
-            }
+            elements = valueArguments.map { it.toIrConst(context.irBuiltIns.stringType) }
         )
     }
 
@@ -100,12 +99,14 @@
     fun IrFunction.getComposableForDecoy(): IrFunctionSymbol {
         val implementationName = getDecoyTargetName()
         val signatureId = getSignatureId()
-        val implementation = (parent as? IrDeclarationContainer)?.declarations
-            ?.filterIsInstance<IrFunction>()
-            ?.firstOrNull {
-                it.getDecoyImplementationName() == implementationName &&
-                    it.getDecoyImplementationId() == signatureId
-            }
+        val implementation =
+            (parent as? IrDeclarationContainer)
+                ?.declarations
+                ?.filterIsInstance<IrFunction>()
+                ?.firstOrNull {
+                    it.getDecoyImplementationName() == implementationName &&
+                        it.getDecoyImplementationId() == signatureId
+                }
 
         if (implementation != null) {
             return implementation.symbol
@@ -116,26 +117,27 @@
             "Could not find local implementation for $implementationName"
         }
         // top-level
-        val idSig = IdSignature.CommonSignature(
-            packageFqName = signature[0],
-            declarationFqName = signature[1],
-            id = signature[2].toLongOrNull(),
-            mask = signature[3].toLong(),
-            description = "Composable decoy signature"
-        )
+        val idSig =
+            IdSignature.CommonSignature(
+                packageFqName = signature[0],
+                declarationFqName = signature[1],
+                id = signature[2].toLongOrNull(),
+                mask = signature[3].toLong(),
+                description = "Composable decoy signature"
+            )
 
         val linker = (context as IrPluginContextImpl).linker
 
-        val symbol = if (isTopLevel) {
-            linker.getDeclaration(module, idSig) as? IrSimpleFunctionSymbol
-        } else {
-            (parent as? IrDeclarationContainer)?.declarations
-                ?.filterIsInstance<IrFunction>()
-                ?.find {
-                    it.symbol.signature == idSig
-                }
-                ?.symbol
-        }
+        val symbol =
+            if (isTopLevel) {
+                linker.getDeclaration(module, idSig) as? IrSimpleFunctionSymbol
+            } else {
+                (parent as? IrDeclarationContainer)
+                    ?.declarations
+                    ?.filterIsInstance<IrFunction>()
+                    ?.find { it.symbol.signature == idSig }
+                    ?.symbol
+            }
 
         return symbol ?: error("Couldn't find implementation for $name")
     }
@@ -171,9 +173,7 @@
         val decoyVararg = annotation.getValueArgument(1) as IrVararg
 
         @Suppress("UNCHECKED_CAST")
-        return decoyVararg.elements.map {
-            (it as IrConst<String>).value
-        }
+        return decoyVararg.elements.map { (it as IrConst<String>).value }
     }
 
     private fun IrDeserializer.getDeclaration(
@@ -182,8 +182,7 @@
     ): IrSymbol = resolveBySignatureInModule(idSignature, FUNCTION_SYMBOL, moduleDescriptor.name)
 }
 
-fun IrDeclaration.isDecoy(): Boolean =
-    hasAnnotationSafe(DecoyFqNames.Decoy)
+fun IrDeclaration.isDecoy(): Boolean = hasAnnotationSafe(DecoyFqNames.Decoy)
 
 fun IrDeclaration.isDecoyImplementation(): Boolean =
     hasAnnotationSafe(DecoyFqNames.DecoyImplementation)
@@ -198,36 +197,32 @@
 }
 
 fun IrFunction.didDecoyHaveDefaultForValueParameter(paramIndex: Int): Boolean {
-    return getDecoyImplementationDefaultValuesBitMask()?.let {
-        it.shr(paramIndex).and(1) == 1
-    } ?: false
+    return getDecoyImplementationDefaultValuesBitMask()?.let { it.shr(paramIndex).and(1) == 1 }
+        ?: false
 }
 
 internal inline fun <reified T : IrElement> T.copyWithNewTypeParams(
     source: IrFunction,
     target: IrFunction
 ): T {
-    val typeParamsAwareSymbolRemapper = object : DeepCopySymbolRemapper() {
-        init {
-            for ((orig, new) in source.typeParameters.zip(target.typeParameters)) {
-                typeParameters[orig.symbol] = new.symbol
+    val typeParamsAwareSymbolRemapper =
+        object : DeepCopySymbolRemapper() {
+            init {
+                for ((orig, new) in source.typeParameters.zip(target.typeParameters)) {
+                    typeParameters[orig.symbol] = new.symbol
+                }
             }
         }
-    }
-    return deepCopyWithSymbols(
-        target,
-        typeParamsAwareSymbolRemapper
-    ) { symbolRemapper, typeRemapper ->
-        val typeParamRemapper = object : TypeRemapper by typeRemapper {
-            override fun remapType(type: IrType): IrType {
-                return typeRemapper.remapType(type.remapTypeParameters(source, target))
+    return deepCopyWithSymbols(target, typeParamsAwareSymbolRemapper) { symbolRemapper, typeRemapper
+        ->
+        val typeParamRemapper =
+            object : TypeRemapper by typeRemapper {
+                override fun remapType(type: IrType): IrType {
+                    return typeRemapper.remapType(type.remapTypeParameters(source, target))
+                }
             }
-        }
-        val deepCopy = DeepCopyPreservingMetadata(
-            symbolRemapper,
-            typeParamRemapper,
-            SymbolRenamer.DEFAULT
-        )
+        val deepCopy =
+            DeepCopyPreservingMetadata(symbolRemapper, typeParamRemapper, SymbolRenamer.DEFAULT)
         (typeRemapper as? DeepCopyTypeRemapper)?.deepCopy = deepCopy
         deepCopy
     }
diff --git a/compose/compiler/compiler-hosted/src/main/java/androidx/compose/compiler/plugins/kotlin/lower/decoys/RecordDecoySignaturesTransformer.kt b/compose/compiler/compiler-hosted/src/main/java/androidx/compose/compiler/plugins/kotlin/lower/decoys/RecordDecoySignaturesTransformer.kt
index 428611e..fd30048 100644
--- a/compose/compiler/compiler-hosted/src/main/java/androidx/compose/compiler/plugins/kotlin/lower/decoys/RecordDecoySignaturesTransformer.kt
+++ b/compose/compiler/compiler-hosted/src/main/java/androidx/compose/compiler/plugins/kotlin/lower/decoys/RecordDecoySignaturesTransformer.kt
@@ -1,5 +1,3 @@
-
-
 /*
  * Copyright 2021 The Android Open Source Project
  *
@@ -47,14 +45,16 @@
     val mangler: KotlinMangler.IrMangler,
     stabilityInferencer: StabilityInferencer,
     featureFlags: FeatureFlags,
-) : AbstractDecoysLowering(
-    pluginContext = pluginContext,
-    symbolRemapper = symbolRemapper,
-    metrics = metrics,
-    signatureBuilder = signatureBuilder,
-    stabilityInferencer = stabilityInferencer,
-    featureFlags = featureFlags,
-), ModuleLoweringPass {
+) :
+    AbstractDecoysLowering(
+        pluginContext = pluginContext,
+        symbolRemapper = symbolRemapper,
+        metrics = metrics,
+        signatureBuilder = signatureBuilder,
+        stabilityInferencer = stabilityInferencer,
+        featureFlags = featureFlags,
+    ),
+    ModuleLoweringPass {
 
     override fun lower(module: IrModuleFragment) {
         module.transformChildrenVoid()
@@ -90,9 +90,7 @@
         return super.visitFunction(declaration)
     }
 
-    private fun findNearestCommonSignature(
-        sig: IdSignature
-    ): IdSignature.CommonSignature? {
+    private fun findNearestCommonSignature(sig: IdSignature): IdSignature.CommonSignature? {
         return when (sig) {
             is IdSignature.CommonSignature -> sig
             is IdSignature.CompositeSignature -> findNearestCommonSignature(sig.inner)
diff --git a/compose/compiler/compiler-hosted/src/main/java/androidx/compose/compiler/plugins/kotlin/lower/decoys/SubstituteDecoyCallsTransformer.kt b/compose/compiler/compiler-hosted/src/main/java/androidx/compose/compiler/plugins/kotlin/lower/decoys/SubstituteDecoyCallsTransformer.kt
index 969a439..0a87943 100644
--- a/compose/compiler/compiler-hosted/src/main/java/androidx/compose/compiler/plugins/kotlin/lower/decoys/SubstituteDecoyCallsTransformer.kt
+++ b/compose/compiler/compiler-hosted/src/main/java/androidx/compose/compiler/plugins/kotlin/lower/decoys/SubstituteDecoyCallsTransformer.kt
@@ -49,9 +49,7 @@
 import org.jetbrains.kotlin.ir.visitors.IrElementTransformerVoid
 import org.jetbrains.kotlin.ir.visitors.transformChildrenVoid
 
-/**
- * Replaces all decoys references to their implementations created in [CreateDecoysTransformer].
- */
+/** Replaces all decoys references to their implementations created in [CreateDecoysTransformer]. */
 class SubstituteDecoyCallsTransformer(
     pluginContext: IrPluginContext,
     symbolRemapper: DeepCopySymbolRemapper,
@@ -59,22 +57,25 @@
     stabilityInferencer: StabilityInferencer,
     metrics: ModuleMetrics,
     featureFlags: FeatureFlags,
-) : AbstractDecoysLowering(
-    pluginContext = pluginContext,
-    symbolRemapper = symbolRemapper,
-    metrics = metrics,
-    stabilityInferencer = stabilityInferencer,
-    signatureBuilder = signatureBuilder,
-    featureFlags = featureFlags,
-), ModuleLoweringPass {
-    private val decoysTransformer = CreateDecoysTransformer(
-        pluginContext,
-        symbolRemapper,
-        signatureBuilder,
-        stabilityInferencer,
-        metrics,
-        featureFlags,
-    )
+) :
+    AbstractDecoysLowering(
+        pluginContext = pluginContext,
+        symbolRemapper = symbolRemapper,
+        metrics = metrics,
+        stabilityInferencer = stabilityInferencer,
+        signatureBuilder = signatureBuilder,
+        featureFlags = featureFlags,
+    ),
+    ModuleLoweringPass {
+    private val decoysTransformer =
+        CreateDecoysTransformer(
+            pluginContext,
+            symbolRemapper,
+            signatureBuilder,
+            stabilityInferencer,
+            metrics,
+            featureFlags,
+        )
     private val lazyDeclarationsCache = mutableMapOf<IrFunctionSymbol, IrFunction>()
 
     override fun lower(module: IrModuleFragment) {
@@ -84,26 +85,24 @@
     }
 
     /*
-    * Some properties defined in classes get initialized by using values provided in
-    * constructors:
-    *   class TakesComposable(name: String, age: Int, val c: @Composable () -> Unit) {
-    *        var nameAndAge: String = "$name,$age"
-    *   }
-    *
-    * Since [ComposerTypeRemapper].remapType() skips decoys (including decoy constructors),
-    * the value getters (e.g `name` or `age` above) keep references to old value parameter symbols
-    * from decoy constructors.
-    * Therefore, getters for values from constructors need to be substituted by getters for values
-    * from constructors with DecoyImplementation annotation.
-    */
+     * Some properties defined in classes get initialized by using values provided in
+     * constructors:
+     *   class TakesComposable(name: String, age: Int, val c: @Composable () -> Unit) {
+     *        var nameAndAge: String = "$name,$age"
+     *   }
+     *
+     * Since [ComposerTypeRemapper].remapType() skips decoys (including decoy constructors),
+     * the value getters (e.g `name` or `age` above) keep references to old value parameter symbols
+     * from decoy constructors.
+     * Therefore, getters for values from constructors need to be substituted by getters for values
+     * from constructors with DecoyImplementation annotation.
+     */
     override fun visitGetValue(expression: IrGetValue): IrExpression {
         val originalGetValue = super.visitGetValue(expression)
 
-        val valueParameter = expression.symbol.owner as? IrValueParameter
-            ?: return originalGetValue
+        val valueParameter = expression.symbol.owner as? IrValueParameter ?: return originalGetValue
 
-        val constructorParent = valueParameter.parent as? IrConstructor
-            ?: return originalGetValue
+        val constructorParent = valueParameter.parent as? IrConstructor ?: return originalGetValue
 
         if (!constructorParent.isDecoy()) {
             return originalGetValue
@@ -130,18 +129,21 @@
     }
 
     private fun remapOverriddenSymbols(declaration: IrSimpleFunction) {
-        val newOverriddenSymbols = declaration.overriddenSymbols.map {
-            // It can be an overridden symbol from another module, so access it via `decoyOwner`
-            val maybeDecoy = it.decoyOwner
-            if (maybeDecoy.isDecoy()) {
-                maybeDecoy.getComposableForDecoy() as IrSimpleFunctionSymbol
-            } else {
-                it
-            }.also {
-                // need to fix for entire hierarchy (because of "original" symbols in LazyIR)
-                remapOverriddenSymbols(it.owner)
+        val newOverriddenSymbols =
+            declaration.overriddenSymbols.map {
+                // It can be an overridden symbol from another module, so access it via `decoyOwner`
+                val maybeDecoy = it.decoyOwner
+                if (maybeDecoy.isDecoy()) {
+                        maybeDecoy.getComposableForDecoy() as IrSimpleFunctionSymbol
+                    } else {
+                        it
+                    }
+                    .also {
+                        // need to fix for entire hierarchy (because of "original" symbols in
+                        // LazyIR)
+                        remapOverriddenSymbols(it.owner)
+                    }
             }
-        }
 
         declaration.overriddenSymbols = newOverriddenSymbols
     }
@@ -154,19 +156,21 @@
 
         val actualConstructor = callee.getComposableForDecoy().owner as IrConstructor
 
-        val updatedCall = IrConstructorCallImpl(
-            symbol = actualConstructor.symbol,
-            origin = expression.origin,
-            startOffset = expression.startOffset,
-            endOffset = expression.endOffset,
-            type = expression.type.remapTypeParameters(callee, actualConstructor),
-            typeArgumentsCount = expression.typeArgumentsCount,
-            valueArgumentsCount = expression.valueArgumentsCount,
-            constructorTypeArgumentsCount = expression.constructorTypeArgumentsCount
-        ).let {
-            it.copyTypeAndValueArgumentsFrom(expression)
-            return@let it.copyWithNewTypeParams(callee, actualConstructor)
-        }
+        val updatedCall =
+            IrConstructorCallImpl(
+                    symbol = actualConstructor.symbol,
+                    origin = expression.origin,
+                    startOffset = expression.startOffset,
+                    endOffset = expression.endOffset,
+                    type = expression.type.remapTypeParameters(callee, actualConstructor),
+                    typeArgumentsCount = expression.typeArgumentsCount,
+                    valueArgumentsCount = expression.valueArgumentsCount,
+                    constructorTypeArgumentsCount = expression.constructorTypeArgumentsCount
+                )
+                .let {
+                    it.copyTypeAndValueArgumentsFrom(expression)
+                    return@let it.copyWithNewTypeParams(callee, actualConstructor)
+                }
 
         return super.visitConstructorCall(updatedCall)
     }
@@ -181,17 +185,19 @@
 
         val actualConstructor = callee.getComposableForDecoy().owner as IrConstructor
 
-        val updatedCall = IrDelegatingConstructorCallImpl(
-            symbol = actualConstructor.symbol,
-            startOffset = expression.startOffset,
-            endOffset = expression.endOffset,
-            type = expression.type.remapTypeParameters(callee, actualConstructor),
-            typeArgumentsCount = expression.typeArgumentsCount,
-            valueArgumentsCount = expression.valueArgumentsCount,
-        ).let {
-            it.copyTypeAndValueArgumentsFrom(expression)
-            return@let it.copyWithNewTypeParams(callee, actualConstructor)
-        }
+        val updatedCall =
+            IrDelegatingConstructorCallImpl(
+                    symbol = actualConstructor.symbol,
+                    startOffset = expression.startOffset,
+                    endOffset = expression.endOffset,
+                    type = expression.type.remapTypeParameters(callee, actualConstructor),
+                    typeArgumentsCount = expression.typeArgumentsCount,
+                    valueArgumentsCount = expression.valueArgumentsCount,
+                )
+                .let {
+                    it.copyTypeAndValueArgumentsFrom(expression)
+                    return@let it.copyWithNewTypeParams(callee, actualConstructor)
+                }
 
         return super.visitDelegatingConstructorCall(updatedCall)
     }
@@ -204,19 +210,21 @@
 
         val actualFunction = callee.getComposableForDecoy().owner as IrSimpleFunction
 
-        val updatedCall = IrCallImpl(
-            symbol = actualFunction.symbol,
-            origin = expression.origin,
-            startOffset = expression.startOffset,
-            endOffset = expression.endOffset,
-            type = expression.type.remapTypeParameters(callee, actualFunction),
-            typeArgumentsCount = expression.typeArgumentsCount,
-            valueArgumentsCount = expression.valueArgumentsCount,
-            superQualifierSymbol = expression.superQualifierSymbol
-        ).let {
-            it.copyTypeAndValueArgumentsFrom(expression)
-            return@let it.copyWithNewTypeParams(callee, actualFunction)
-        }
+        val updatedCall =
+            IrCallImpl(
+                    symbol = actualFunction.symbol,
+                    origin = expression.origin,
+                    startOffset = expression.startOffset,
+                    endOffset = expression.endOffset,
+                    type = expression.type.remapTypeParameters(callee, actualFunction),
+                    typeArgumentsCount = expression.typeArgumentsCount,
+                    valueArgumentsCount = expression.valueArgumentsCount,
+                    superQualifierSymbol = expression.superQualifierSymbol
+                )
+                .let {
+                    it.copyTypeAndValueArgumentsFrom(expression)
+                    return@let it.copyWithNewTypeParams(callee, actualFunction)
+                }
         return super.visitCall(updatedCall)
     }
 
@@ -228,59 +236,69 @@
 
         val actualFunction = callee.getComposableForDecoy().owner as IrSimpleFunction
 
-        val updatedReference = IrFunctionReferenceImpl(
-            symbol = actualFunction.symbol,
-            origin = expression.origin,
-            startOffset = expression.startOffset,
-            endOffset = expression.endOffset,
-            type = expression.type.remapTypeParameters(callee, actualFunction),
-            typeArgumentsCount = expression.typeArgumentsCount,
-            valueArgumentsCount = expression.valueArgumentsCount,
-            reflectionTarget = expression.reflectionTarget
-        ).let {
-            it.copyTypeAndValueArgumentsFrom(expression)
-            return@let it.copyWithNewTypeParams(callee, actualFunction)
-        }
+        val updatedReference =
+            IrFunctionReferenceImpl(
+                    symbol = actualFunction.symbol,
+                    origin = expression.origin,
+                    startOffset = expression.startOffset,
+                    endOffset = expression.endOffset,
+                    type = expression.type.remapTypeParameters(callee, actualFunction),
+                    typeArgumentsCount = expression.typeArgumentsCount,
+                    valueArgumentsCount = expression.valueArgumentsCount,
+                    reflectionTarget = expression.reflectionTarget
+                )
+                .let {
+                    it.copyTypeAndValueArgumentsFrom(expression)
+                    return@let it.copyWithNewTypeParams(callee, actualFunction)
+                }
         return super.visitFunctionReference(updatedReference)
     }
 
-    private val addComposerParameterInplace = object : IrElementTransformerVoid() {
-        private val composerParamTransformer = ComposerParamTransformer(
-            context, symbolRemapper, stabilityInferencer, true, metrics, featureFlags
+    private val addComposerParameterInplace =
+        object : IrElementTransformerVoid() {
+            private val composerParamTransformer =
+                ComposerParamTransformer(
+                    context,
+                    symbolRemapper,
+                    stabilityInferencer,
+                    true,
+                    metrics,
+                    featureFlags
+                )
 
-        )
-        override fun visitSimpleFunction(declaration: IrSimpleFunction): IrStatement {
-            return composerParamTransformer.visitSimpleFunction(declaration)
+            override fun visitSimpleFunction(declaration: IrSimpleFunction): IrStatement {
+                return composerParamTransformer.visitSimpleFunction(declaration)
+            }
         }
-    }
 
     /**
-     * Since kotlin 1.7.20, k/js started to use LazyIr (stubs).
-     * Decoys logic used to rely on full deserialized IR of the module dependencies.
+     * Since kotlin 1.7.20, k/js started to use LazyIr (stubs). Decoys logic used to rely on full
+     * deserialized IR of the module dependencies.
      *
-     * This extension adjusts LazyIr for decoys needs:
-     * generates decoy implementation declarations and adds composer parameter to ensure matching
-     * signatures.
+     * This extension adjusts LazyIr for decoys needs: generates decoy implementation declarations
+     * and adds composer parameter to ensure matching signatures.
      *
-     * To consider: LazyIr allows to get rid of decoys logic. But it's going to be a breaking
-     * change for the compose users, since all published klibs will need to be recompiled in order
-     * to be compatible with new-no-decoys compiler plugin. So we'll need to choose
-     * a good moment for such a breaking change.
+     * To consider: LazyIr allows to get rid of decoys logic. But it's going to be a breaking change
+     * for the compose users, since all published klibs will need to be recompiled in order to be
+     * compatible with new-no-decoys compiler plugin. So we'll need to choose a good moment for such
+     * a breaking change.
      */
     private val IrFunctionSymbol.decoyOwner: IrFunction
-        get() = if (owner is IrLazyFunctionBase && !owner.isDecoy()) {
-            lazyDeclarationsCache.getOrPut(this) {
-                val declaration = owner
-                if (declaration.shouldBeRemapped()) {
-                    when (declaration) {
-                        is IrSimpleFunction -> decoysTransformer.visitSimpleFunction(declaration)
-                        is IrConstructor -> decoysTransformer.visitConstructor(declaration)
-                        else -> decoysTransformer.visitFunction(declaration)
-                    }.also {
-                        decoysTransformer.updateParents()
-                        owner.parent.transformChildrenVoid(addComposerParameterInplace)
-                    } as IrFunction
-                } else owner
-            }
-        } else owner
+        get() =
+            if (owner is IrLazyFunctionBase && !owner.isDecoy()) {
+                lazyDeclarationsCache.getOrPut(this) {
+                    val declaration = owner
+                    if (declaration.shouldBeRemapped()) {
+                        when (declaration) {
+                            is IrSimpleFunction ->
+                                decoysTransformer.visitSimpleFunction(declaration)
+                            is IrConstructor -> decoysTransformer.visitConstructor(declaration)
+                            else -> decoysTransformer.visitFunction(declaration)
+                        }.also {
+                            decoysTransformer.updateParents()
+                            owner.parent.transformChildrenVoid(addComposerParameterInplace)
+                        } as IrFunction
+                    } else owner
+                }
+            } else owner
 }
diff --git a/compose/compiler/compiler-hosted/src/main/java/androidx/compose/compiler/plugins/kotlin/lower/hiddenfromobjc/AddHiddenFromObjCLowering.kt b/compose/compiler/compiler-hosted/src/main/java/androidx/compose/compiler/plugins/kotlin/lower/hiddenfromobjc/AddHiddenFromObjCLowering.kt
index 0ef8a25..cc15628 100644
--- a/compose/compiler/compiler-hosted/src/main/java/androidx/compose/compiler/plugins/kotlin/lower/hiddenfromobjc/AddHiddenFromObjCLowering.kt
+++ b/compose/compiler/compiler-hosted/src/main/java/androidx/compose/compiler/plugins/kotlin/lower/hiddenfromobjc/AddHiddenFromObjCLowering.kt
@@ -41,9 +41,9 @@
 import org.jetbrains.kotlin.platform.konan.isNative
 
 /**
- *  AddHiddenFromObjCLowering looks for functions and properties with @Composable types and
- *  adds the `kotlin.native.HiddenFromObjC` annotation to them.
- *  [docs](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin.native/-hidden-from-obj-c/)
+ * AddHiddenFromObjCLowering looks for functions and properties with @Composable types and adds the
+ * `kotlin.native.HiddenFromObjC` annotation to them.
+ * [docs](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin.native/-hidden-from-obj-c/)
  */
 class AddHiddenFromObjCLowering(
     private val pluginContext: IrPluginContext,
@@ -52,13 +52,14 @@
     private val hideFromObjCDeclarationsSet: HideFromObjCDeclarationsSet?,
     stabilityInferencer: StabilityInferencer,
     featureFlags: FeatureFlags,
-) : AbstractComposeLowering(
-    pluginContext,
-    symbolRemapper,
-    metrics,
-    stabilityInferencer,
-    featureFlags
-) {
+) :
+    AbstractComposeLowering(
+        pluginContext,
+        symbolRemapper,
+        metrics,
+        stabilityInferencer,
+        featureFlags
+    ) {
 
     private val hiddenFromObjCAnnotation: IrClassSymbol by lazy {
         getTopLevelClass(ClassId.fromString("kotlin/native/HiddenFromObjC"))
@@ -74,7 +75,8 @@
         module.transformChildrenVoid(this)
     }
 
-    /** `visitClass` is only needed until [issue](https://youtrack.jetbrains.com/issue/KT-65288/) fix
+    /**
+     * `visitClass` is only needed until [issue](https://youtrack.jetbrains.com/issue/KT-65288/) fix
      * after the issue is resolved, `visitClass` could be removed entirely
      */
     override fun visitClass(declaration: IrClass): IrStatement {
@@ -84,7 +86,8 @@
         val cls = super.visitClass(declaration) as IrClass
 
         // We see an issue only with data classes containing something Composable.
-        // Adding an annotation to all classes makes the FirNativeHiddenFromObjCInheritanceChecker (kotlin) complain.
+        // Adding an annotation to all classes makes the FirNativeHiddenFromObjCInheritanceChecker
+        // (kotlin) complain.
         // data classes can't be open, so it should work.
         if (currentShouldAnnotateClass && cls.isData) {
             cls.addHiddenFromObjCAnnotation()
@@ -97,9 +100,11 @@
 
     override fun visitFunction(declaration: IrFunction): IrStatement {
         val f = super.visitFunction(declaration) as IrFunction
-        if (f.isLocal ||
-            !(f.visibility == DescriptorVisibilities.PUBLIC ||
-                f.visibility == DescriptorVisibilities.PROTECTED))
+        if (
+            f.isLocal ||
+                !(f.visibility == DescriptorVisibilities.PUBLIC ||
+                    f.visibility == DescriptorVisibilities.PROTECTED)
+        )
             return f
 
         if (f.hasComposableAnnotation() || f.needsComposableRemapping()) {
@@ -115,9 +120,10 @@
         val p = super.visitProperty(declaration) as IrProperty
         if (p.isLocal || p.visibility != DescriptorVisibilities.PUBLIC) return p
 
-        val shouldAdd = p.getter?.hasComposableAnnotation() ?: false ||
-            p.getter?.needsComposableRemapping() ?: false ||
-            p.backingField?.type.containsComposableAnnotation()
+        val shouldAdd =
+            p.getter?.hasComposableAnnotation() ?: false ||
+                p.getter?.needsComposableRemapping() ?: false ||
+                p.backingField?.type.containsComposableAnnotation()
 
         if (shouldAdd) {
             p.addHiddenFromObjCAnnotation()
@@ -129,10 +135,11 @@
     }
 
     private fun IrDeclaration.addHiddenFromObjCAnnotation() {
-        val annotation = IrConstructorCallImpl.fromSymbolOwner(
-            type = hiddenFromObjCAnnotation.defaultType,
-            constructorSymbol = hiddenFromObjCAnnotation.constructors.first()
-        )
+        val annotation =
+            IrConstructorCallImpl.fromSymbolOwner(
+                type = hiddenFromObjCAnnotation.defaultType,
+                constructorSymbol = hiddenFromObjCAnnotation.constructors.first()
+            )
         pluginContext.annotationsRegistrar.addMetadataVisibleAnnotationsToElement(this, annotation)
     }
 }
diff --git a/compose/compiler/compiler-hosted/src/main/java/androidx/compose/compiler/plugins/kotlin/lower/hiddenfromobjc/AddHiddenFromObjCSerializationPlugin.kt b/compose/compiler/compiler-hosted/src/main/java/androidx/compose/compiler/plugins/kotlin/lower/hiddenfromobjc/AddHiddenFromObjCSerializationPlugin.kt
index 86b897f..0cb56dc 100644
--- a/compose/compiler/compiler-hosted/src/main/java/androidx/compose/compiler/plugins/kotlin/lower/hiddenfromobjc/AddHiddenFromObjCSerializationPlugin.kt
+++ b/compose/compiler/compiler-hosted/src/main/java/androidx/compose/compiler/plugins/kotlin/lower/hiddenfromobjc/AddHiddenFromObjCSerializationPlugin.kt
@@ -30,8 +30,8 @@
 import org.jetbrains.kotlin.serialization.SerializerExtension
 
 /**
- * Adds the kotlin.native.HiddenFromObjC annotation to the descriptors of declarations
- * in [hideFromObjCDeclarationsSet].
+ * Adds the kotlin.native.HiddenFromObjC annotation to the descriptors of declarations in
+ * [hideFromObjCDeclarationsSet].
  *
  * @see [HideFromObjCDeclarationsSet]
  */
@@ -44,9 +44,9 @@
     private val annotationToAdd = ClassId.fromString("kotlin/native/HiddenFromObjC")
 
     private fun createAnnotationProto(extension: SerializerExtension) =
-        ProtoBuf.Annotation.newBuilder().apply {
-            id = extension.stringTable.getQualifiedClassNameIndex(annotationToAdd)
-        }.build()
+        ProtoBuf.Annotation.newBuilder()
+            .apply { id = extension.stringTable.getQualifiedClassNameIndex(annotationToAdd) }
+            .build()
 
     override fun afterClass(
         descriptor: ClassDescriptor,
diff --git a/compose/compiler/compiler-hosted/src/main/java/androidx/compose/compiler/plugins/kotlin/lower/hiddenfromobjc/HideFromObjCDeclarationsSet.kt b/compose/compiler/compiler-hosted/src/main/java/androidx/compose/compiler/plugins/kotlin/lower/hiddenfromobjc/HideFromObjCDeclarationsSet.kt
index 936d4d5..b0568a7 100644
--- a/compose/compiler/compiler-hosted/src/main/java/androidx/compose/compiler/plugins/kotlin/lower/hiddenfromobjc/HideFromObjCDeclarationsSet.kt
+++ b/compose/compiler/compiler-hosted/src/main/java/androidx/compose/compiler/plugins/kotlin/lower/hiddenfromobjc/HideFromObjCDeclarationsSet.kt
@@ -23,19 +23,17 @@
 import org.jetbrains.kotlin.ir.declarations.IrProperty
 
 /**
- * Represents a set of declarations that should have
- * kotlin.native.HiddenFromObjC annotation added in their IR and descriptors.
+ * Represents a set of declarations that should have kotlin.native.HiddenFromObjC annotation added
+ * in their IR and descriptors.
  *
- * It's used by [AddHiddenFromObjCSerializationPlugin] to determine
- * if there's a need to modify the declaration descriptor before it's serialized.
- * This set is populated by [AddHiddenFromObjCLowering].
+ * It's used by [AddHiddenFromObjCSerializationPlugin] to determine if there's a need to modify the
+ * declaration descriptor before it's serialized. This set is populated by
+ * [AddHiddenFromObjCLowering].
  *
- * More context:
- * The reason why we need this set is due to k/native ObjCExportMapper.kt is
- * using descriptors to look at the declaration annotations.
- * When ObjCExportMapper.kt migrates to FIR, we will need to simply remove this interface
- * and [AddHiddenFromObjCSerializationPlugin].
- * Adding the annotation in IR - [AddHiddenFromObjCLowering] will likely be enough.
+ * More context: The reason why we need this set is due to k/native ObjCExportMapper.kt is using
+ * descriptors to look at the declaration annotations. When ObjCExportMapper.kt migrates to FIR, we
+ * will need to simply remove this interface and [AddHiddenFromObjCSerializationPlugin]. Adding the
+ * annotation in IR - [AddHiddenFromObjCLowering] will likely be enough.
  */
 @OptIn(ObsoleteDescriptorBasedAPI::class)
 class HideFromObjCDeclarationsSet {
diff --git a/compose/compiler/compiler-hosted/src/test/kotlin/androidx/compose/compiler/plugins/kotlin/inference/FakeAst.kt b/compose/compiler/compiler-hosted/src/test/kotlin/androidx/compose/compiler/plugins/kotlin/inference/FakeAst.kt
index 821e893..a4f2739 100644
--- a/compose/compiler/compiler-hosted/src/test/kotlin/androidx/compose/compiler/plugins/kotlin/inference/FakeAst.kt
+++ b/compose/compiler/compiler-hosted/src/test/kotlin/androidx/compose/compiler/plugins/kotlin/inference/FakeAst.kt
@@ -20,61 +20,56 @@
 
 abstract class Node {
     abstract fun accept(visitor: Visitor)
+
     abstract fun visitChildren(visitor: Visitor)
+
     open fun storageNode(): Node = this
 }
 
 abstract class Leaf : Node() {
-    override fun visitChildren(visitor: Visitor) { }
+    override fun visitChildren(visitor: Visitor) {}
 }
 
-class Annotation(
-    val name: String,
-    val value: String = ""
-) : Leaf() {
+class Annotation(val name: String, val value: String = "") : Leaf() {
     override fun accept(visitor: Visitor) = visitor.visit(this)
 }
 
-class Lambda(
-    val type: FunctionType,
-    val body: List<Node>
-) : Node() {
+class Lambda(val type: FunctionType, val body: List<Node>) : Node() {
     override fun accept(visitor: Visitor) = visitor.visit(this)
+
     override fun visitChildren(visitor: Visitor) {
         walk(type.parameters, visitor)
         walk(body, visitor)
     }
+
     override fun toString(): String = "{ ${body.joinToString(";")} }: $type"
 }
 
-class Call(
-    val target: Node,
-    val arguments: List<Node> = emptyList()
-) : Node() {
+class Call(val target: Node, val arguments: List<Node> = emptyList()) : Node() {
     override fun accept(visitor: Visitor) = visitor.visit(this)
+
     override fun visitChildren(visitor: Visitor) {
         walk(target, visitor)
         walk(arguments, visitor)
     }
+
     override fun toString(): String =
         "$target(${
             arguments.joinToString { it.toString() }
         })"
 }
 
-class Ref(
-    val name: String
-) : Leaf() {
+class Ref(val name: String) : Leaf() {
     override fun accept(visitor: Visitor) = visitor.visit(this)
+
     override fun toString() = name
 }
 
-class Variable(
-    val name: String,
-    val initializer: Node
-) : Node() {
+class Variable(val name: String, val initializer: Node) : Node() {
     override fun accept(visitor: Visitor) = visitor.visit(this)
+
     override fun visitChildren(visitor: Visitor) = walk(initializer, visitor)
+
     override fun toString() = "val $name = $initializer"
 }
 
@@ -114,21 +109,17 @@
     override fun toString(): String = "fun $name: $type { ${body.joinToString(";") } }"
 }
 
-class Parameter(
-    val name: String,
-    val type: Type
-) : Leaf() {
+class Parameter(val name: String, val type: Type) : Leaf() {
     override fun accept(visitor: Visitor) = visitor.visit(this)
 }
 
 // Types
 
-abstract class Type(
-    val name: String,
-    val annotations: List<Annotation>
-) {
+abstract class Type(val name: String, val annotations: List<Annotation>) {
     abstract fun bind(binding: Map<OpenType, Type>, context: MutableMap<Type, Type>): Type
+
     open fun toScheme(selfIndex: Int, index: Int = -1): Scheme? = inferredScheme()
+
     open fun toScheme(): Scheme? = toScheme(-1)
 
     fun bind(binding: Map<OpenType, Type>): Type {
@@ -141,9 +132,10 @@
         return if (boundType == this) null else boundType
     }
 
-    protected fun inferredScheme(): Scheme? = annotations.firstNotNullOfOrNull {
-        if (it.name == "ComposableInferredTarget") deserializeScheme(it.value) else null
-    }
+    protected fun inferredScheme(): Scheme? =
+        annotations.firstNotNullOfOrNull {
+            if (it.name == "ComposableInferredTarget") deserializeScheme(it.value) else null
+        }
 }
 
 class FunctionType(
@@ -154,39 +146,39 @@
     val result: Type = UnitType
 ) : Type(name, annotations) {
     private var boundFrom = this
-    val isOpen get() = typeParameters.isNotEmpty()
-    val isBound get() = boundFrom != this
+    val isOpen
+        get() = typeParameters.isNotEmpty()
+
+    val isBound
+        get() = boundFrom != this
 
     override fun toScheme(): Scheme = toScheme(-1, if (isBound) 0 else -1)
+
     override fun toScheme(selfIndex: Int, index: Int): Scheme =
-        inferredScheme() ?: Scheme(
-            target = annotations.item() ?: Open(selfIndex),
-            parameters = parameters.mapNotNull { it.type.toScheme(index, index) },
-            result = result.toScheme(index, index)
-        )
+        inferredScheme()
+            ?: Scheme(
+                target = annotations.item() ?: Open(selfIndex),
+                parameters = parameters.mapNotNull { it.type.toScheme(index, index) },
+                result = result.toScheme(index, index)
+            )
 
     override fun bind(binding: Map<OpenType, Type>, context: MutableMap<Type, Type>): Type =
-        context[this] ?: run {
-            val newParameters = parameters.map { parameter ->
-                parameter.type.bindOrNull(binding, context)?.let {
-                    Parameter(parameter.name, it)
-                } ?: parameter
+        context[this]
+            ?: run {
+                val newParameters =
+                    parameters.map { parameter ->
+                        parameter.type.bindOrNull(binding, context)?.let {
+                            Parameter(parameter.name, it)
+                        } ?: parameter
+                    }
+                val newResult = result.bind(binding, context)
+                (if (newResult != result || !newParameters.sameContentAs(parameters)) {
+                        val newTypeParameters = typeParameters.filter { it !in binding }
+                        FunctionType(name, annotations, newParameters, newTypeParameters, newResult)
+                            .also { it.boundFrom = this }
+                    } else this)
+                    .also { context[this] = it }
             }
-            val newResult = result.bind(binding, context)
-            (if (
-                newResult != result ||
-                !newParameters.sameContentAs(parameters)
-            ) {
-                val newTypeParameters = typeParameters.filter {
-                    it !in binding
-                }
-                FunctionType(name, annotations, newParameters, newTypeParameters, newResult).also {
-                    it.boundFrom = this
-                }
-            } else this).also {
-                context[this] = it
-            }
-        }
 
     override fun toString(): String = buildString {
         append('[')
@@ -232,37 +224,49 @@
 class OpenType(name: String) : Type(name, emptyList()) {
     override fun bind(binding: Map<OpenType, Type>, context: MutableMap<Type, Type>) =
         binding[this] ?: this
+
     override fun toString(): String = "\\$name"
 }
 
 object UnitType : Type("Unit", emptyList()) {
     override fun bind(binding: Map<OpenType, Type>, context: MutableMap<Type, Type>): Type = this
+
     override fun toString(): String = "Unit"
 }
 
 interface Visitor {
     fun visit(annotation: Annotation)
+
     fun visit(lambda: Lambda)
+
     fun visit(call: Call)
+
     fun visit(ref: Ref)
+
     fun visit(variable: Variable)
+
     fun visit(function: Function)
+
     fun visit(parameter: Parameter)
 }
 
 open class EmptyVisitor : Visitor {
-    override fun visit(annotation: Annotation) { }
-    override fun visit(lambda: Lambda) { }
-    override fun visit(call: Call) { }
-    override fun visit(ref: Ref) { }
-    override fun visit(variable: Variable) { }
-    override fun visit(function: Function) { }
-    override fun visit(parameter: Parameter) { }
+    override fun visit(annotation: Annotation) {}
+
+    override fun visit(lambda: Lambda) {}
+
+    override fun visit(call: Call) {}
+
+    override fun visit(ref: Ref) {}
+
+    override fun visit(variable: Variable) {}
+
+    override fun visit(function: Function) {}
+
+    override fun visit(parameter: Parameter) {}
 }
 
-open class DelegateVisitor(
-    private val delegate: Visitor
-) : Visitor by delegate
+open class DelegateVisitor(private val delegate: Visitor) : Visitor by delegate
 
 class RecursiveVisitor(delegate: Visitor) : DelegateVisitor(delegate) {
     override fun visit(call: Call) {
@@ -295,21 +299,25 @@
 }
 
 fun <N : Node> walk(nodes: List<N>, visitor: Visitor) {
-    for (node in nodes)
-        node.accept(visitor)
+    for (node in nodes) node.accept(visitor)
 }
 
 class Scope(val map: Map<String, ResolvedType>, private val parent: Scope? = null) {
     fun typeOf(ref: Ref): ResolvedType {
         val name = ref.name
-        map[name]?.let { return it }
-        parent?.let { return it.typeOf(ref) }
+        map[name]?.let {
+            return it
+        }
+        parent?.let {
+            return it.typeOf(ref)
+        }
         error("Could not locate $name")
     }
 }
 
 class ResolvedType(val node: Node, val type: Type) {
     operator fun component1() = node
+
     operator fun component2() = type
 }
 
@@ -318,6 +326,7 @@
     val arguments: List<ResolvedType>,
     val result: ResolvedType
 )
+
 class Resolutions(val calls: Map<Call, ResolvedCall>, val nodes: Map<Node, ResolvedType>)
 
 infix fun Node.resolvesTo(type: Type) = ResolvedType(this, type)
@@ -325,27 +334,27 @@
 fun resolve(data: Map<String, Function>): Resolutions {
     val resolvedNodes = mutableMapOf<Node, ResolvedType>()
 
-    val rootScope = Scope(
-        data.entries.associate { (name, function) ->
-            name to (function resolvesTo function.type)
-        }
-    )
+    val rootScope =
+        Scope(
+            data.entries.associate { (name, function) ->
+                name to (function resolvesTo function.type)
+            }
+        )
 
     fun parameterScope(type: FunctionType, parent: Scope): Scope =
         if (type.parameters.isEmpty()) parent
-        else Scope(type.parameters.associate {
-            it.name to (it resolvesTo it.type)
-        }, parent)
+        else Scope(type.parameters.associate { it.name to (it resolvesTo it.type) }, parent)
 
     lateinit var callTypeOfRef: (call: Call, scope: Scope) -> ResolvedType
 
     fun typeOf(node: Node, scope: Scope): ResolvedType {
-        return resolvedNodes[node] ?: when (node) {
-            is Ref -> scope.typeOf(node)
-            is Lambda -> node resolvesTo node.type
-            is Call -> node resolvesTo callTypeOfRef(node, scope).type
-            else -> error("Invalid call target $node")
-        }.also { resolvedNodes[node] = it }
+        return resolvedNodes[node]
+            ?: when (node) {
+                is Ref -> scope.typeOf(node)
+                is Lambda -> node resolvesTo node.type
+                is Call -> node resolvesTo callTypeOfRef(node, scope).type
+                else -> error("Invalid call target $node")
+            }.also { resolvedNodes[node] = it }
     }
 
     fun callTypeOf(call: Call, scope: Scope): ResolvedType {
@@ -387,29 +396,30 @@
                     val functionType = callType.type as FunctionType
                     val result = call resolvesTo functionType.result
                     resolvedNodes[call] = result
-                    resolvedCalls[call] = ResolvedCall(
-                        target = callType,
-                        arguments = call.arguments.map { typeOf(it, scope) },
-                        result = result
-                    )
+                    resolvedCalls[call] =
+                        ResolvedCall(
+                            target = callType,
+                            arguments = call.arguments.map { typeOf(it, scope) },
+                            result = result
+                        )
                 }
+
                 override fun visit(variable: Variable) {
                     walkChildren(variable, this)
                     resolvedNodes[variable] =
                         variable resolvesTo typeOf(variable.initializer, scope).type
-                    scope = Scope(
-                        mapOf(
-                            variable.name to (
-                                variable resolvesTo typeOf(variable.initializer, scope).type
-                            )
-                        ),
-                        scope
-                    )
+                    scope =
+                        Scope(
+                            mapOf(
+                                variable.name to
+                                    (variable resolvesTo typeOf(variable.initializer, scope).type)
+                            ),
+                            scope
+                        )
                 }
+
                 override fun visit(lambda: Lambda) {
-                    inScope(parameterScope(lambda.type, scope)) {
-                        walkChildren(lambda, this)
-                    }
+                    inScope(parameterScope(lambda.type, scope)) { walkChildren(lambda, this) }
                 }
 
                 override fun visit(function: Function) {
@@ -460,6 +470,7 @@
                     result[variable] = currentContainer.last()
                     walkChildren(variable, this)
                 }
+
                 override fun visit(ref: Ref) {
                     result[ref] = currentContainer.last()
                 }
@@ -473,8 +484,7 @@
 private fun <T> List<T>.sameContentAs(other: List<T>) =
     other == this || (size == other.size && zip(other).all { (a, b) -> a == b })
 
-private fun <K, V> Map<K, V>.toPairs() =
-    entries.map { entry -> entry.key to entry.value }
+private fun <K, V> Map<K, V>.toPairs() = entries.map { entry -> entry.key to entry.value }
 
 private fun List<Annotation>.item(): Item? =
     firstOrNull { it.name == "ComposableTarget" }?.let { Token(it.value) }
@@ -483,7 +493,11 @@
 val composable = listOf(Annotation("Composable"))
 val uiTarget = listOf(Annotation("ComposableTarget", "UI"))
 val vectorTarget = listOf(Annotation("ComposableTarget", "Vector"))
+
 fun composableLambda() = FunctionType("lambda", annotations = composable)
+
 fun call(name: String, vararg args: Node) = Call(Ref(name), arguments = args.toList())
+
 fun lambda(vararg body: Node) = Lambda(type = composableLambda(), body = body.toList())
+
 fun openTarget(index: Int) = listOf(Annotation("ComposableOpenTarget", "$index"))
diff --git a/compose/compiler/compiler-hosted/src/test/kotlin/androidx/compose/compiler/plugins/kotlin/inference/FakeData.kt b/compose/compiler/compiler-hosted/src/test/kotlin/androidx/compose/compiler/plugins/kotlin/inference/FakeData.kt
index 2f02796..561ccd8 100644
--- a/compose/compiler/compiler-hosted/src/test/kotlin/androidx/compose/compiler/plugins/kotlin/inference/FakeData.kt
+++ b/compose/compiler/compiler-hosted/src/test/kotlin/androidx/compose/compiler/plugins/kotlin/inference/FakeData.kt
@@ -16,443 +16,329 @@
 
 package androidx.compose.compiler.plugins.kotlin.inference
 
-val data = mapOf(
-    "identity" to fresh { t ->
-        Function(
-            "identity",
-            typeParameters = listOf(t),
-            parameters = listOf(Parameter("value", t)),
-            result = t
-        )
-    },
-    "mark" to Function("mark", annotations = composable + uiTarget),
-    "run" to fresh { t ->
-        Function(
-            "run",
-            typeParameters = listOf(t),
-            parameters = listOf(
-                Parameter(
-                    name = "value",
-                    type = t
-                ),
-                Parameter(
-                    name = "block",
-                    type = FunctionType(
-                        name = "<anonymous>",
-                        parameters = listOf(Parameter("it", t)),
-                        result = t
-                    )
+val data =
+    mapOf(
+        "identity" to
+            fresh { t ->
+                Function(
+                    "identity",
+                    typeParameters = listOf(t),
+                    parameters = listOf(Parameter("value", t)),
+                    result = t
                 )
-            ),
-            result = t
-        )
-    },
-    "useRun" to Function(
-        "useRun",
-        annotations = composable,
-        parameters = listOf(
-            Parameter("content", composableLambda())
-        ),
-        body = listOf(
-            call("mark"),
-            call("run",
-                Ref("content"),
-                Lambda(
-                    type = FunctionType(
-                        name = "<lambda>",
-                        annotations = composable,
-                        parameters = listOf(
+            },
+        "mark" to Function("mark", annotations = composable + uiTarget),
+        "run" to
+            fresh { t ->
+                Function(
+                    "run",
+                    typeParameters = listOf(t),
+                    parameters =
+                        listOf(
+                            Parameter(name = "value", type = t),
                             Parameter(
-                                name = "content",
-                                type = composableLambda()
+                                name = "block",
+                                type =
+                                    FunctionType(
+                                        name = "<anonymous>",
+                                        parameters = listOf(Parameter("it", t)),
+                                        result = t
+                                    )
+                            )
+                        ),
+                    result = t
+                )
+            },
+        "useRun" to
+            Function(
+                "useRun",
+                annotations = composable,
+                parameters = listOf(Parameter("content", composableLambda())),
+                body =
+                    listOf(
+                        call("mark"),
+                        call(
+                            "run",
+                            Ref("content"),
+                            Lambda(
+                                type =
+                                    FunctionType(
+                                        name = "<lambda>",
+                                        annotations = composable,
+                                        parameters =
+                                            listOf(
+                                                Parameter(
+                                                    name = "content",
+                                                    type = composableLambda()
+                                                )
+                                            )
+                                    ),
+                                body = listOf(call("content"))
                             )
                         )
+                    )
+            ),
+        "useIdentity" to
+            Function(
+                "useIdentity",
+                annotations = composable,
+                parameters = listOf(Parameter("content", composableLambda())),
+                body = listOf(Call(Call(Ref("identity"), listOf(Ref("content")))))
+            ),
+        "Drawing" to
+            Function(
+                "Drawing",
+                annotations = composable + uiTarget,
+                parameters =
+                    listOf(
+                        Parameter(
+                            "content",
+                            FunctionType("lambda", annotations = composable + vectorTarget)
+                        )
+                    )
+            ),
+        "useVarAndIdentity" to
+            Function(
+                "useVarAndIdentity",
+                annotations = composable,
+                parameters =
+                    listOf(
+                        Parameter("content", composableLambda()),
+                        Parameter("image", composableLambda())
                     ),
-                    body = listOf(
-                        call("content")
+                body =
+                    listOf(
+                        Variable("tmp", call("identity", Ref("content"))),
+                        Variable("tmp2", call("identity", Ref("tmp"))),
+                        call("tmp2"),
+                        Variable("image_tmp", call("identity", Ref("image"))),
+                        call("Drawing", Ref("image_tmp"))
                     )
-                )
-            )
-        )
-    ),
-    "useIdentity" to Function(
-        "useIdentity",
-        annotations = composable,
-        parameters = listOf(
-            Parameter("content", composableLambda())
-        ),
-        body = listOf(
-            Call(Call(Ref("identity"), listOf(Ref("content"))))
-        )
-    ),
-    "Drawing" to Function(
-        "Drawing",
-        annotations = composable + uiTarget,
-        parameters = listOf(
-            Parameter(
-                "content",
-                FunctionType("lambda", annotations = composable + vectorTarget)
-            )
-        )
-    ),
-    "useVarAndIdentity" to Function(
-        "useVarAndIdentity",
-        annotations = composable,
-        parameters = listOf(
-            Parameter("content", composableLambda()),
-            Parameter("image", composableLambda())
-        ),
-        body = listOf(
-            Variable("tmp", call("identity", Ref("content"))),
-            Variable("tmp2", call("identity", Ref("tmp"))),
-            call("tmp2"),
-            Variable("image_tmp", call("identity", Ref("image"))),
-            call("Drawing", Ref("image_tmp"))
-        )
-    ),
-    "useVar" to Function(
-        "useVar",
-        annotations = composable,
-        parameters = listOf(
-            Parameter("content", composableLambda())
-        ),
-        body = listOf(
-            Variable("tmp", Ref("content")),
-            Call(Ref("tmp"))
-        )
-    ),
-    "Layout/1" to Function("Layout/1", annotations = composable + uiTarget),
-    "Layout/2" to Function(
-        "Layout/2",
-        annotations = composable + uiTarget,
-        parameters = listOf(
-            Parameter(
-                "content",
-                FunctionType("lambda", annotations = composable + uiTarget)
-            )
-        )
-    ),
-    "Vector/1" to Function("Vector/1", annotations = composable + vectorTarget),
-    "Vector/2" to Function(
-        "Vector/2",
-        annotations = composable + vectorTarget,
-        parameters = listOf(
-            Parameter(
-                "content",
-                FunctionType("lambda", annotations = composable + vectorTarget)
-            )
-        )
-    ),
-    "CoreText" to Function(
-        "CoreText",
-        annotations = composable,
-        body = listOf(
-            call("Layout/1")
-        )
-    ),
-    "BasicText" to Function(
-        "BasicText",
-        annotations = composable,
-        body = listOf(
-            call("CoreText")
-        )
-    ),
-    "Text" to Function(
-        "Text",
-        annotations = composable,
-        body = listOf(
-            call("BasicText")
-        )
-    ),
-    "Circle" to Function(
-        "Circle",
-        annotations = composable,
-        body = listOf(
-            call("Vector/1")
-        )
-    ),
-    "Square" to Function(
-        "Square",
-        annotations = composable,
-        body = listOf(
-            call("Vector/1")
-        )
-    ),
-    "Provider" to Function(
-        "Provider",
-        annotations = composable,
-        parameters = listOf(Parameter("content", composableLambda())),
-        body = listOf(
-            call("content")
-        )
-    ),
-    "Row" to Function(
-        "Row",
-        annotations = composable,
-        parameters = listOf(Parameter("content", composableLambda())),
-        body = listOf(
-            call("Layout/2", Ref("content"))
-        )
-    ),
-    "Button" to Function(
-        "Button",
-        annotations = composable,
-        parameters = listOf(Parameter("content", composableLambda())),
-        body = listOf(
-            call("Row", Ref("content"))
-        )
-    ),
-    "Layer" to Function(
-        "Layer",
-        annotations = composable,
-        parameters = listOf(Parameter("content", composableLambda())),
-        body = listOf(
-            call("Vector/2", Ref("content"))
-        )
-    ),
-
-    "SimpleOpen" to Function("SimpleOpen", annotations = composable),
-
-    "OpenRecursive" to Function(
-        "OpenRecursive",
-        annotations = composable,
-        body = listOf(
-            call("OpenRecursive")
-        )
-    ),
-
-    "ClosedRecursive" to Function(
-        "ClosedRecursive",
-        annotations = composable,
-        body = listOf(
-            call("ClosedRecursive"),
-            call("Text")
-        )
-    ),
-
-    "ClosedIndirectRecursive" to Function(
-        "ClosedIndirectRecursive",
-        annotations = composable,
-        body = listOf(
-            call("ClosedIndirectRecursiveRecurse")
-        )
-    ),
-
-    "ClosedIndirectRecursiveRecurse" to Function(
-        "ClosedIndirectRecursiveRecurse",
-        annotations = composable,
-        body = listOf(
-            call("ClosedIndirectRecursive"),
-            call("Text")
-        )
-    ),
-
-    "OpenIndirectRecursive" to Function(
-        "OpenIndirectRecursive",
-        annotations = composable,
-        body = listOf(
-            call("OpenIndirectRecursiveRecurse")
-        )
-    ),
-
-    "OpenIndirectRecursiveRecurse" to Function(
-        "OpenIndirectRecursiveRecurse",
-        annotations = composable,
-        body = listOf(
-            call("OpenIndirectRecursive")
-        )
-    ),
-
-    "p1" to Function(
-        "p1",
-        annotations = composable,
-        body = listOf(
-            call("Text")
-        )
-    ),
-
-    "p2" to Function(
-        "p2",
-        annotations = composable,
-        body = listOf(
-            call("Circle")
-        )
-    ),
-
-    "p3" to Function(
-        "p3",
-        annotations = composable,
-        body = listOf(
-            call("Text"),
-            call("Text")
-        )
-    ),
-
-    "p4" to Function(
-        "p4",
-        annotations = composable,
-        body = listOf(
-            call(
-                "Row",
-                lambda(
-                    call("Text"),
-                    call("Text")
-                )
-            )
-        )
-    ),
-
-    "p5" to Function(
-        "p5",
-        annotations = composable,
-        body = listOf(
-            call(
+            ),
+        "useVar" to
+            Function(
+                "useVar",
+                annotations = composable,
+                parameters = listOf(Parameter("content", composableLambda())),
+                body = listOf(Variable("tmp", Ref("content")), Call(Ref("tmp")))
+            ),
+        "Layout/1" to Function("Layout/1", annotations = composable + uiTarget),
+        "Layout/2" to
+            Function(
+                "Layout/2",
+                annotations = composable + uiTarget,
+                parameters =
+                    listOf(
+                        Parameter(
+                            "content",
+                            FunctionType("lambda", annotations = composable + uiTarget)
+                        )
+                    )
+            ),
+        "Vector/1" to Function("Vector/1", annotations = composable + vectorTarget),
+        "Vector/2" to
+            Function(
+                "Vector/2",
+                annotations = composable + vectorTarget,
+                parameters =
+                    listOf(
+                        Parameter(
+                            "content",
+                            FunctionType("lambda", annotations = composable + vectorTarget)
+                        )
+                    )
+            ),
+        "CoreText" to
+            Function("CoreText", annotations = composable, body = listOf(call("Layout/1"))),
+        "BasicText" to
+            Function("BasicText", annotations = composable, body = listOf(call("CoreText"))),
+        "Text" to Function("Text", annotations = composable, body = listOf(call("BasicText"))),
+        "Circle" to Function("Circle", annotations = composable, body = listOf(call("Vector/1"))),
+        "Square" to Function("Square", annotations = composable, body = listOf(call("Vector/1"))),
+        "Provider" to
+            Function(
                 "Provider",
-                lambda(
-                    call(
-                        "Row",
-                        lambda(
-                            call("Text"),
-                            call(
-                                "Button",
-                                lambda(
-                                    call("Text")
+                annotations = composable,
+                parameters = listOf(Parameter("content", composableLambda())),
+                body = listOf(call("content"))
+            ),
+        "Row" to
+            Function(
+                "Row",
+                annotations = composable,
+                parameters = listOf(Parameter("content", composableLambda())),
+                body = listOf(call("Layout/2", Ref("content")))
+            ),
+        "Button" to
+            Function(
+                "Button",
+                annotations = composable,
+                parameters = listOf(Parameter("content", composableLambda())),
+                body = listOf(call("Row", Ref("content")))
+            ),
+        "Layer" to
+            Function(
+                "Layer",
+                annotations = composable,
+                parameters = listOf(Parameter("content", composableLambda())),
+                body = listOf(call("Vector/2", Ref("content")))
+            ),
+        "SimpleOpen" to Function("SimpleOpen", annotations = composable),
+        "OpenRecursive" to
+            Function(
+                "OpenRecursive",
+                annotations = composable,
+                body = listOf(call("OpenRecursive"))
+            ),
+        "ClosedRecursive" to
+            Function(
+                "ClosedRecursive",
+                annotations = composable,
+                body = listOf(call("ClosedRecursive"), call("Text"))
+            ),
+        "ClosedIndirectRecursive" to
+            Function(
+                "ClosedIndirectRecursive",
+                annotations = composable,
+                body = listOf(call("ClosedIndirectRecursiveRecurse"))
+            ),
+        "ClosedIndirectRecursiveRecurse" to
+            Function(
+                "ClosedIndirectRecursiveRecurse",
+                annotations = composable,
+                body = listOf(call("ClosedIndirectRecursive"), call("Text"))
+            ),
+        "OpenIndirectRecursive" to
+            Function(
+                "OpenIndirectRecursive",
+                annotations = composable,
+                body = listOf(call("OpenIndirectRecursiveRecurse"))
+            ),
+        "OpenIndirectRecursiveRecurse" to
+            Function(
+                "OpenIndirectRecursiveRecurse",
+                annotations = composable,
+                body = listOf(call("OpenIndirectRecursive"))
+            ),
+        "p1" to Function("p1", annotations = composable, body = listOf(call("Text"))),
+        "p2" to Function("p2", annotations = composable, body = listOf(call("Circle"))),
+        "p3" to Function("p3", annotations = composable, body = listOf(call("Text"), call("Text"))),
+        "p4" to
+            Function(
+                "p4",
+                annotations = composable,
+                body = listOf(call("Row", lambda(call("Text"), call("Text"))))
+            ),
+        "p5" to
+            Function(
+                "p5",
+                annotations = composable,
+                body =
+                    listOf(
+                        call(
+                            "Provider",
+                            lambda(
+                                call(
+                                    "Row",
+                                    lambda(call("Text"), call("Button", lambda(call("Text"))))
                                 )
                             )
                         )
                     )
-                )
-            )
-        )
-    ),
-
-    "p6" to Function(
-        "p6",
-        annotations = composable,
-        body = listOf(
-            call(
-                "Provider",
-                lambda(
-                    call("Circle"),
-                    call("Square")
-                )
-            )
-        )
-    ),
-
-    "p7" to Function(
-        "p7",
-        annotations = composable,
-        body = listOf(
-            call(
-                "Row",
-                lambda(
-                    call(
-                        "Drawing",
-                        lambda(
-                            call("Circle"),
-                            call("Square"),
-                            call(
-                                "Layer",
-                                lambda(
-                                    call("Circle")
+            ),
+        "p6" to
+            Function(
+                "p6",
+                annotations = composable,
+                body = listOf(call("Provider", lambda(call("Circle"), call("Square"))))
+            ),
+        "p7" to
+            Function(
+                "p7",
+                annotations = composable,
+                body =
+                    listOf(
+                        call(
+                            "Row",
+                            lambda(
+                                call(
+                                    "Drawing",
+                                    lambda(
+                                        call("Circle"),
+                                        call("Square"),
+                                        call("Layer", lambda(call("Circle")))
+                                    )
                                 )
                             )
                         )
                     )
-                )
-            )
-        )
-    ),
-
-    "p8" to Function(
-        "p8",
-        annotations = composable,
-        body = listOf(
-            call(
-                "Provider",
-                lambda(
-                    call(
-                        "Row",
-                        lambda(
-                            call(
-                                "Drawing",
-                                lambda(
-                                    call(
-                                        "Provider",
-                                        lambda(
-                                            call("Circle"),
-                                            call("Square")
+            ),
+        "p8" to
+            Function(
+                "p8",
+                annotations = composable,
+                body =
+                    listOf(
+                        call(
+                            "Provider",
+                            lambda(
+                                call(
+                                    "Row",
+                                    lambda(
+                                        call(
+                                            "Drawing",
+                                            lambda(
+                                                call(
+                                                    "Provider",
+                                                    lambda(call("Circle"), call("Square"))
+                                                )
+                                            )
                                         )
                                     )
                                 )
                             )
                         )
                     )
-                )
-            )
-        )
-    ),
-
-    "p9" to Function(
-        "p9",
-        annotations = composable,
-        parameters = listOf(
-            Parameter(
-                "content",
-                FunctionType(
-                    "lambda",
-                    annotations = composable + openTarget(0),
-                    parameters = listOf(
+            ),
+        "p9" to
+            Function(
+                "p9",
+                annotations = composable,
+                parameters =
+                    listOf(
                         Parameter(
                             "content",
                             FunctionType(
                                 "lambda",
-                                annotations = composable + openTarget(0)
+                                annotations = composable + openTarget(0),
+                                parameters =
+                                    listOf(
+                                        Parameter(
+                                            "content",
+                                            FunctionType(
+                                                "lambda",
+                                                annotations = composable + openTarget(0)
+                                            )
+                                        )
+                                    )
                             )
                         )
-                    )
-                )
-            )
-        ),
-        body = listOf(
-            call(
-                "content",
-                lambda(
-                    call("Text")
-                )
-            )
-        )
-    ),
-
-    "e1" to Function(
-        "e1",
-        annotations = composable,
-        body = listOf(
-            call("Text"),
-            call("Circle")
-        )
-    ),
-
-    "e2" to Function(
-        "e2",
-        annotations = composable,
-        body = listOf(
-            call(
-                "Provider",
-                lambda(
-                    call("Text")
-                )
+                    ),
+                body = listOf(call("content", lambda(call("Text"))))
             ),
-            call(
-                "Provider",
-                lambda(
-                    call("Circle")
-                )
+        "e1" to
+            Function("e1", annotations = composable, body = listOf(call("Text"), call("Circle"))),
+        "e2" to
+            Function(
+                "e2",
+                annotations = composable,
+                body =
+                    listOf(
+                        call("Provider", lambda(call("Text"))),
+                        call("Provider", lambda(call("Circle")))
+                    )
             )
-        )
     )
-)
 
 fun walkData(visitor: Visitor) {
     for (function in data.values) {
@@ -465,39 +351,40 @@
     for (function in data.values) {
         walk(
             function,
-            visitor = object : Visitor {
-                override fun visit(annotation: Annotation) {
-                    nodes.add(annotation)
-                }
+            visitor =
+                object : Visitor {
+                    override fun visit(annotation: Annotation) {
+                        nodes.add(annotation)
+                    }
 
-                override fun visit(lambda: Lambda) {
-                    nodes.add(lambda)
-                    walkChildren(lambda, this)
-                }
+                    override fun visit(lambda: Lambda) {
+                        nodes.add(lambda)
+                        walkChildren(lambda, this)
+                    }
 
-                override fun visit(call: Call) {
-                    nodes.add(call)
-                    walkChildren(call, this)
-                }
+                    override fun visit(call: Call) {
+                        nodes.add(call)
+                        walkChildren(call, this)
+                    }
 
-                override fun visit(ref: Ref) {
-                    nodes.add(ref)
-                }
+                    override fun visit(ref: Ref) {
+                        nodes.add(ref)
+                    }
 
-                override fun visit(variable: Variable) {
-                    nodes.add(variable)
-                    walkChildren(variable, this)
-                }
+                    override fun visit(variable: Variable) {
+                        nodes.add(variable)
+                        walkChildren(variable, this)
+                    }
 
-                override fun visit(function: Function) {
-                    nodes.add(function)
-                    walkChildren(function, this)
-                }
+                    override fun visit(function: Function) {
+                        nodes.add(function)
+                        walkChildren(function, this)
+                    }
 
-                override fun visit(parameter: Parameter) {
-                    nodes.add(parameter)
+                    override fun visit(parameter: Parameter) {
+                        nodes.add(parameter)
+                    }
                 }
-            }
         )
     }
     nodes.shuffle()
@@ -506,5 +393,4 @@
 
 private var freshNumber = 0
 
-fun <T> fresh(block: (t: OpenType) -> T) =
-    block(OpenType("fresh-${freshNumber++}"))
+fun <T> fresh(block: (t: OpenType) -> T) = block(OpenType("fresh-${freshNumber++}"))
diff --git a/compose/compiler/compiler-hosted/src/test/kotlin/androidx/compose/compiler/plugins/kotlin/inference/TestInferApplier.kt b/compose/compiler/compiler-hosted/src/test/kotlin/androidx/compose/compiler/plugins/kotlin/inference/TestInferApplier.kt
index dfd801a..7addfb5 100644
--- a/compose/compiler/compiler-hosted/src/test/kotlin/androidx/compose/compiler/plugins/kotlin/inference/TestInferApplier.kt
+++ b/compose/compiler/compiler-hosted/src/test/kotlin/androidx/compose/compiler/plugins/kotlin/inference/TestInferApplier.kt
@@ -24,55 +24,67 @@
     private val resolutions = resolve(data)
     private val containers = containersOf(data)
 
-    private val typeAdapter = object : TypeAdapter<FunctionType> {
-        override fun declaredSchemaOf(type: FunctionType): Scheme = type.toScheme()
-        override fun currentInferredSchemeOf(type: FunctionType): Scheme? = null
-        override fun updatedInferredScheme(type: FunctionType, scheme: Scheme) { }
-    }
+    private val typeAdapter =
+        object : TypeAdapter<FunctionType> {
+            override fun declaredSchemaOf(type: FunctionType): Scheme = type.toScheme()
 
-    private val nodeAdapter = object : NodeAdapter<FunctionType, Node> {
-        override fun containerOf(node: Node) =
-            containers[node]
-                ?: (node as? ResolvedParameter)?.let { containers[it.parameter] }
-                ?: (node as? ResolvedVariable)?.let { containers[it.variable] }
-                ?: (node as? ResolvedExpression)?.let { containers[it.node] }
-                ?: error("Could not find container for $node")
-        override fun kindOf(node: Node): NodeKind = when (node) {
-            is Function -> NodeKind.Function
-            is Lambda -> NodeKind.Lambda
-            is ResolvedParameter -> NodeKind.ParameterReference
-            is ResolvedVariable -> NodeKind.Variable
-            is ResolvedExpression -> kindOf(node.node)
-            else -> NodeKind.Expression
-        }
-        override fun schemeParameterIndexOf(node: Node, container: Node): Int {
-            val parameter = node as? ResolvedParameter ?: return -1
-            val type = typeOf(container) ?: return -1
-            val parameters = type.parameters.filter { it.type is FunctionType }
-            return parameters.indexOf(parameter.parameter)
-        }
-        override fun typeOf(node: Node): FunctionType? = when (node) {
-            is Function -> node.type
-            is Lambda -> node.type
-            is ResolvedParameter -> node.type as? FunctionType
-            is ResolvedExpression -> node.type as? FunctionType
-            is ResolvedVariable -> node.type as? FunctionType
-            else -> null
+            override fun currentInferredSchemeOf(type: FunctionType): Scheme? = null
+
+            override fun updatedInferredScheme(type: FunctionType, scheme: Scheme) {}
         }
 
-        override fun referencedContainerOf(node: Node): Node? =
-            ((node as? ResolvedExpression)?.node as? Function)?.let {
-                if (it.type.isOpen || it.type.isBound) null else it
+    private val nodeAdapter =
+        object : NodeAdapter<FunctionType, Node> {
+            override fun containerOf(node: Node) =
+                containers[node]
+                    ?: (node as? ResolvedParameter)?.let { containers[it.parameter] }
+                    ?: (node as? ResolvedVariable)?.let { containers[it.variable] }
+                    ?: (node as? ResolvedExpression)?.let { containers[it.node] }
+                    ?: error("Could not find container for $node")
+
+            override fun kindOf(node: Node): NodeKind =
+                when (node) {
+                    is Function -> NodeKind.Function
+                    is Lambda -> NodeKind.Lambda
+                    is ResolvedParameter -> NodeKind.ParameterReference
+                    is ResolvedVariable -> NodeKind.Variable
+                    is ResolvedExpression -> kindOf(node.node)
+                    else -> NodeKind.Expression
+                }
+
+            override fun schemeParameterIndexOf(node: Node, container: Node): Int {
+                val parameter = node as? ResolvedParameter ?: return -1
+                val type = typeOf(container) ?: return -1
+                val parameters = type.parameters.filter { it.type is FunctionType }
+                return parameters.indexOf(parameter.parameter)
             }
-    }
 
-    private fun lazySchemeStorage() = object : LazySchemeStorage<Node> {
-        private val map = mutableMapOf<Node, LazyScheme>()
-        override fun getLazyScheme(node: Node): LazyScheme? = map[node.storageNode()]
-        override fun storeLazyScheme(node: Node, value: LazyScheme) {
-            map[node.storageNode()] = value
+            override fun typeOf(node: Node): FunctionType? =
+                when (node) {
+                    is Function -> node.type
+                    is Lambda -> node.type
+                    is ResolvedParameter -> node.type as? FunctionType
+                    is ResolvedExpression -> node.type as? FunctionType
+                    is ResolvedVariable -> node.type as? FunctionType
+                    else -> null
+                }
+
+            override fun referencedContainerOf(node: Node): Node? =
+                ((node as? ResolvedExpression)?.node as? Function)?.let {
+                    if (it.type.isOpen || it.type.isBound) null else it
+                }
         }
-    }
+
+    private fun lazySchemeStorage() =
+        object : LazySchemeStorage<Node> {
+            private val map = mutableMapOf<Node, LazyScheme>()
+
+            override fun getLazyScheme(node: Node): LazyScheme? = map[node.storageNode()]
+
+            override fun storeLazyScheme(node: Node, value: LazyScheme) {
+                map[node.storageNode()] = value
+            }
+        }
 
     private fun errorReporter(): Pair<ErrorReporter<Node>, List<Call>> {
         val errors = mutableListOf<Call>()
@@ -114,6 +126,7 @@
                         val target = call.target
                         if (target is Ref && target.name == part) current = call
                     }
+
                     override fun visit(lambda: Lambda) {
                         walkChildren(lambda, this)
                     }
@@ -168,9 +181,10 @@
     fun resolve(resolvedType: ResolvedType): Node =
         when (resolvedType.node) {
             is Lambda -> resolvedType.node
-            is Function -> if ((resolvedType.type as FunctionType).isBound) {
-                ResolvedExpression(resolvedType.node, resolvedType.type)
-            } else resolvedType.node
+            is Function ->
+                if ((resolvedType.type as FunctionType).isBound) {
+                    ResolvedExpression(resolvedType.node, resolvedType.type)
+                } else resolvedType.node
             is Parameter -> ResolvedParameter(resolvedType.node, resolvedType.type)
             is Variable -> ResolvedVariable(resolvedType.node, resolvedType.type)
             else -> ResolvedExpression(resolvedType.node, resolvedType.type)
@@ -184,10 +198,10 @@
             override fun visit(call: Call) {
                 val resolvedCall = resolutions.calls[call] ?: error("Could not resolve $call")
                 val target = resolve(resolvedCall.target)
-                val arguments = resolvedCall.arguments.mapNotNull { resolvedType ->
-                    if (resolvedType.type is FunctionType) resolve(resolvedType)
-                    else null
-                }
+                val arguments =
+                    resolvedCall.arguments.mapNotNull { resolvedType ->
+                        if (resolvedType.type is FunctionType) resolve(resolvedType) else null
+                    }
                 val resolvedCallNode = resolve(call)
                 inferApplier.visitCall(resolvedCallNode, target, arguments)
             }
@@ -204,25 +218,16 @@
     fun prefixOrderWalk() {
         val (errorReporter, errors) = errorReporter()
         val lazySchemeStorage = lazySchemeStorage()
-        val inferApplier = ApplierInferencer(
-            typeAdapter,
-            nodeAdapter,
-            lazySchemeStorage,
-            errorReporter
-        )
+        val inferApplier =
+            ApplierInferencer(typeAdapter, nodeAdapter, lazySchemeStorage, errorReporter)
 
         val visitor = dataVisitor(inferApplier)
 
         walkData(visitor)
 
-        expectCorrectInference {
-            inferApplier.toFinalScheme(it)
-        }
+        expectCorrectInference { inferApplier.toFinalScheme(it) }
 
-        assertTrue(
-            "Expected Circle in e1 to be in error",
-            findNode("e1", "Circle") in errors
-        )
+        assertTrue("Expected Circle in e1 to be in error", findNode("e1", "Circle") in errors)
         assertTrue(
             "Expected Circle in e2 to be in error",
             findNode("e2", "Provider", "Circle") in errors
@@ -234,36 +239,34 @@
     fun randomOrderWalk() {
         val (errorReporter, _) = errorReporter()
         val lazySchemeStorage = lazySchemeStorage()
-        val inferApplier = ApplierInferencer(
-            typeAdapter,
-            nodeAdapter,
-            lazySchemeStorage,
-            errorReporter
-        )
+        val inferApplier =
+            ApplierInferencer(typeAdapter, nodeAdapter, lazySchemeStorage, errorReporter)
         val visitor = dataVisitor(inferApplier)
 
         randomlyWalkData(visitor)
 
-        expectCorrectInference {
-            inferApplier.toFinalScheme(it)
-        }
+        expectCorrectInference { inferApplier.toFinalScheme(it) }
 
-        // Randomly walking the tree produces random errors as well for trees that can be interpreted multiple ways
+        // Randomly walking the tree produces random errors as well for trees that can be
+        // interpreted multiple ways
         // such as data contains, so don't assert on the errors.
     }
 }
 
 private class ResolvedParameter(val parameter: Parameter, val type: Type) : Leaf() {
     override fun accept(visitor: Visitor) = visitor.visit(parameter)
+
     override fun storageNode(): Node = parameter
 }
 
 private class ResolvedVariable(val variable: Variable, val type: Type) : Leaf() {
     override fun accept(visitor: Visitor) = visitor.visit(variable)
+
     override fun storageNode(): Node = variable
 }
 
 private class ResolvedExpression(val node: Node, val type: Type) : Leaf() {
-    override fun accept(visitor: Visitor) { }
+    override fun accept(visitor: Visitor) {}
+
     override fun storageNode(): Node = node
 }
diff --git a/compose/compiler/compiler-hosted/src/test/kotlin/androidx/compose/compiler/plugins/kotlin/inference/TestLazyScheme.kt b/compose/compiler/compiler-hosted/src/test/kotlin/androidx/compose/compiler/plugins/kotlin/inference/TestLazyScheme.kt
index f0f3b16..5bdc9f4 100644
--- a/compose/compiler/compiler-hosted/src/test/kotlin/androidx/compose/compiler/plugins/kotlin/inference/TestLazyScheme.kt
+++ b/compose/compiler/compiler-hosted/src/test/kotlin/androidx/compose/compiler/plugins/kotlin/inference/TestLazyScheme.kt
@@ -82,7 +82,10 @@
     fun skipWhiteSpace() {
         while (current < text.length) {
             when (text[current]) {
-                ' ', '\t', '\n', '\r' -> {
+                ' ',
+                '\t',
+                '\n',
+                '\r' -> {
                     current++
                     continue
                 }
@@ -151,20 +154,34 @@
         } else null
     }
 
-    fun isVariableStart() = current < text.length && when (text[current]) {
-        '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '_', '\\' -> true
-        else -> false
-    }
+    fun isVariableStart() =
+        current < text.length &&
+            when (text[current]) {
+                '0',
+                '1',
+                '2',
+                '3',
+                '4',
+                '5',
+                '6',
+                '7',
+                '8',
+                '9',
+                '_',
+                '\\' -> true
+                else -> false
+            }
 
-    fun item(): Item = if (isVariableStart()) {
-        if (text[current] == '\\') expect('\\')
-        if (text[current] == '_') {
-            expect('_')
-            Open(-1)
-        } else {
-            Open(expectNumber())
-        }
-    } else Token(expectToken())
+    fun item(): Item =
+        if (isVariableStart()) {
+            if (text[current] == '\\') expect('\\')
+            if (text[current] == '_') {
+                expect('_')
+                Open(-1)
+            } else {
+                Open(expectNumber())
+            }
+        } else Token(expectToken())
 
     fun <T> list(continueBlock: (first: Boolean) -> Boolean, block: () -> T): List<T> =
         if (continueBlock(true)) {
@@ -178,15 +195,16 @@
             result
         } else emptyList()
 
-    fun scheme(): Scheme = delimited('[', ']') {
-        val target = item()
-        val anyParameters = isChar('*')
-        val parameters = if (anyParameters) emptyList() else list({
-            (text[current] == ',').also { if (it) expect(',') }
-        }) { scheme() }
-        val result = optional(':') { scheme() }
-        Scheme(target, parameters, result, anyParameters)
-    }
+    fun scheme(): Scheme =
+        delimited('[', ']') {
+            val target = item()
+            val anyParameters = isChar('*')
+            val parameters =
+                if (anyParameters) emptyList()
+                else list({ (text[current] == ',').also { if (it) expect(',') } }) { scheme() }
+            val result = optional(':') { scheme() }
+            Scheme(target, parameters, result, anyParameters)
+        }
 
     return scheme()
 }
diff --git a/compose/compiler/compiler-hosted/src/test/kotlin/androidx/compose/compiler/plugins/kotlin/inference/TestScheme.kt b/compose/compiler/compiler-hosted/src/test/kotlin/androidx/compose/compiler/plugins/kotlin/inference/TestScheme.kt
index e78bb7d..0678aff 100644
--- a/compose/compiler/compiler-hosted/src/test/kotlin/androidx/compose/compiler/plugins/kotlin/inference/TestScheme.kt
+++ b/compose/compiler/compiler-hosted/src/test/kotlin/androidx/compose/compiler/plugins/kotlin/inference/TestScheme.kt
@@ -56,13 +56,7 @@
 
     @Test
     fun canCreateOpenBindings() {
-        val scheme = Scheme(
-            Open(0),
-            listOf(
-                Scheme(Open(0)),
-                Scheme(Open(2))
-            )
-        )
+        val scheme = Scheme(Open(0), listOf(Scheme(Open(0)), Scheme(Open(2))))
         val bindings = Bindings()
         val context = mutableListOf<Binding>()
         val t1 = scheme.target.toBinding(bindings, context)
@@ -122,27 +116,22 @@
         val z = Open(0)
         val one = Open(1)
         val oneScheme = Scheme(one)
-        val schemes = listOf(
-            ui,
-            Scheme(z, listOf(Scheme(z))),
-            Scheme(Token("This is a really long token with special chars [],_,123")),
-            Scheme(Token("Contains a \" character")),
-            Scheme(Token("Contains a \\ character")),
-            Scheme(one, listOf(Scheme(Open(2), listOf(Scheme(Open(3)))))),
-            Scheme(uiToken, listOf(ui, ui, ui, ui, ui, ui)),
-            Scheme(a, listOf(aScheme, aScheme, aScheme)),
-            Scheme(one, listOf(oneScheme, aScheme, oneScheme, aScheme)),
-            Scheme(Open(Int.MAX_VALUE), listOf(Scheme(Open(Int.MAX_VALUE)))),
-            Scheme(Open(Int.MIN_VALUE), listOf(Scheme(Open(Int.MIN_VALUE)))),
-            Scheme(
-                target = z,
-                result = oneScheme
-            ),
-            Scheme(
-                target = z,
-                anyParameters = true
+        val schemes =
+            listOf(
+                ui,
+                Scheme(z, listOf(Scheme(z))),
+                Scheme(Token("This is a really long token with special chars [],_,123")),
+                Scheme(Token("Contains a \" character")),
+                Scheme(Token("Contains a \\ character")),
+                Scheme(one, listOf(Scheme(Open(2), listOf(Scheme(Open(3)))))),
+                Scheme(uiToken, listOf(ui, ui, ui, ui, ui, ui)),
+                Scheme(a, listOf(aScheme, aScheme, aScheme)),
+                Scheme(one, listOf(oneScheme, aScheme, oneScheme, aScheme)),
+                Scheme(Open(Int.MAX_VALUE), listOf(Scheme(Open(Int.MAX_VALUE)))),
+                Scheme(Open(Int.MIN_VALUE), listOf(Scheme(Open(Int.MIN_VALUE)))),
+                Scheme(target = z, result = oneScheme),
+                Scheme(target = z, anyParameters = true)
             )
-        )
 
         for (scheme in schemes) {
             val serialized = scheme.serialize()
@@ -153,18 +142,19 @@
 
     @Test
     fun invalidDeserializationCanBeCaught() {
-        val invalids = listOf(
-            "",
-            "[ ]",
-            "[123123123123123123123123123123123123]",
-            "[\"",
-            "[a[a[a[a[a",
-            "[a[a[a[a[a[\"",
-            "[UI] ",
-            "[\"\\u0000\"]",
-            "[0*[0]]",
-            "[0[0]*]"
-        )
+        val invalids =
+            listOf(
+                "",
+                "[ ]",
+                "[123123123123123123123123123123123123]",
+                "[\"",
+                "[a[a[a[a[a",
+                "[a[a[a[a[a[\"",
+                "[UI] ",
+                "[\"\\u0000\"]",
+                "[0*[0]]",
+                "[0[0]*]"
+            )
         for (invalid in invalids) {
             val result = deserializeScheme(invalid)
             assertNull(result)
diff --git a/compose/compiler/compiler/integration-tests/src/test/kotlin/androidx/compose/compiler/test/CompilerPluginRuntimeVersionCheckTest.kt b/compose/compiler/compiler/integration-tests/src/test/kotlin/androidx/compose/compiler/test/CompilerPluginRuntimeVersionCheckTest.kt
index efb35c5..42398fe 100644
--- a/compose/compiler/compiler/integration-tests/src/test/kotlin/androidx/compose/compiler/test/CompilerPluginRuntimeVersionCheckTest.kt
+++ b/compose/compiler/compiler/integration-tests/src/test/kotlin/androidx/compose/compiler/test/CompilerPluginRuntimeVersionCheckTest.kt
@@ -38,33 +38,31 @@
         private const val SOURCE_DIR = "$MAIN_DIR/java/androidx/compose/compiler/test"
     }
 
-    @get:Rule
-    val projectSetup = ProjectSetupRule()
+    @get:Rule val projectSetup = ProjectSetupRule()
 
     private lateinit var gradleRunner: GradleRunner
 
     private lateinit var projectRoot: File
 
     private val compilerPluginVersion by lazy {
-        val metadataFile = File(projectSetup.props.tipOfTreeMavenRepoPath).resolve(
-            "androidx/compose/compiler/compiler/maven-metadata.xml"
-        )
+        val metadataFile =
+            File(projectSetup.props.tipOfTreeMavenRepoPath)
+                .resolve("androidx/compose/compiler/compiler/maven-metadata.xml")
         check(metadataFile.exists()) {
             "Cannot find compose metadata file in ${metadataFile.absolutePath}"
         }
-        check(metadataFile.isFile) {
-            "Metadata file should be a file but it is not."
-        }
-        val xmlDoc = DocumentBuilderFactory.newInstance().newDocumentBuilder()
-            .parse(metadataFile)
-        val latestVersionNode = XPathFactory.newInstance().newXPath()
-            .compile("/metadata/versioning/latest").evaluate(
-                xmlDoc, XPathConstants.STRING
-            )
+        check(metadataFile.isFile) { "Metadata file should be a file but it is not." }
+        val xmlDoc = DocumentBuilderFactory.newInstance().newDocumentBuilder().parse(metadataFile)
+        val latestVersionNode =
+            XPathFactory.newInstance()
+                .newXPath()
+                .compile("/metadata/versioning/latest")
+                .evaluate(xmlDoc, XPathConstants.STRING)
         check(latestVersionNode is String) {
             """Unexpected node for latest version:
                 $latestVersionNode / ${latestVersionNode::class.java}
-            """.trimIndent()
+            """
+                .trimIndent()
         }
         latestVersionNode
     }
@@ -72,9 +70,10 @@
     @Before
     fun setup() {
         projectRoot = projectSetup.rootDir
-        gradleRunner = GradleRunner.create()
-            .withProjectDir(projectRoot)
-            .withArguments("clean", "compileDebugKotlin")
+        gradleRunner =
+            GradleRunner.create()
+                .withProjectDir(projectRoot)
+                .withArguments("clean", "compileDebugKotlin")
         setupProjectBuildGradle()
         setupSettingsGradle()
         setupAndroidManifest()
@@ -118,7 +117,8 @@
                     maven {
                         url "$it"
                     }
-                    """.trimIndent()
+                    """
+                        .trimIndent()
                 )
             }
             appendLine("}")
@@ -141,7 +141,8 @@
             task clean(type: Delete) {
                 delete rootProject.buildDir
             }
-            """.trimIndent()
+            """
+                .trimIndent()
         )
     }
 
@@ -183,7 +184,8 @@
                     jvmTarget = "1.8"
                 }
             }
-            """.trimIndent()
+            """
+                .trimIndent()
         )
     }
 
@@ -192,7 +194,8 @@
             "settings.gradle",
             """
             include ':app'
-            """.trimIndent()
+            """
+                .trimIndent()
         )
     }
 
@@ -201,7 +204,8 @@
             "$MAIN_DIR/AndroidManifest.xml",
             """
             <manifest/>
-            """.trimIndent()
+            """
+                .trimIndent()
         )
     }
 
@@ -212,7 +216,8 @@
             """
             package androidx.compose.compiler.test
             const val number = 5
-            """.trimIndent()
+            """
+                .trimIndent()
         )
     }
 
diff --git a/compose/desktop/desktop/samples/src/jvmMain/kotlin/androidx/compose/desktop/examples/example1/Main.jvm.kt b/compose/desktop/desktop/samples/src/jvmMain/kotlin/androidx/compose/desktop/examples/example1/Main.jvm.kt
index ca0b9a3..a67ea5a 100644
--- a/compose/desktop/desktop/samples/src/jvmMain/kotlin/androidx/compose/desktop/examples/example1/Main.jvm.kt
+++ b/compose/desktop/desktop/samples/src/jvmMain/kotlin/androidx/compose/desktop/examples/example1/Main.jvm.kt
@@ -120,21 +120,18 @@
 
 private const val title = "Desktop Compose Elements"
 
-val italicFont = FontFamily(
-    Font("NotoSans-Italic.ttf")
-)
+val italicFont = FontFamily(Font("NotoSans-Italic.ttf"))
 
-val dispatchedFonts = FontFamily(
-    Font("NotoSans-Italic.ttf", style = FontStyle.Italic),
-    Font("NotoSans-Regular.ttf", style = FontStyle.Normal)
-)
+val dispatchedFonts =
+    FontFamily(
+        Font("NotoSans-Italic.ttf", style = FontStyle.Italic),
+        Font("NotoSans-Regular.ttf", style = FontStyle.Normal)
+    )
 
-fun main() = singleWindowApplication(
-    title = title,
-    state = WindowState(width = 1024.dp, height = 850.dp)
-) {
-    App()
-}
+fun main() =
+    singleWindowApplication(title = title, state = WindowState(width = 1024.dp, height = 850.dp)) {
+        App()
+    }
 
 @Composable
 private fun FrameWindowScope.App() {
@@ -159,17 +156,13 @@
             floatingActionButton = {
                 ExtendedFloatingActionButton(
                     text = { Text("Open URL") },
-                    onClick = {
-                        uriHandler.openUri("https://google.com")
-                    }
+                    onClick = { uriHandler.openUri("https://google.com") }
                 )
             },
             isFloatingActionButtonDocked = true,
             bottomBar = {
                 BottomAppBar(cutoutShape = CircleShape) {
-                    IconButton(
-                        onClick = {}
-                    ) {
+                    IconButton(onClick = {}) {
                         Icon(Icons.Filled.Menu, "Menu", Modifier.size(ButtonDefaults.IconSize))
                     }
                 }
@@ -185,15 +178,16 @@
 }
 
 @Composable
-private fun FrameWindowScope.LeftColumn(modifier: Modifier) = Box(modifier.fillMaxSize()) {
-    val state = rememberScrollState()
-    ScrollableContent(state)
+private fun FrameWindowScope.LeftColumn(modifier: Modifier) =
+    Box(modifier.fillMaxSize()) {
+        val state = rememberScrollState()
+        ScrollableContent(state)
 
-    VerticalScrollbar(
-        rememberScrollbarAdapter(state),
-        Modifier.align(Alignment.CenterEnd).fillMaxHeight()
-    )
-}
+        VerticalScrollbar(
+            rememberScrollbarAdapter(state),
+            Modifier.align(Alignment.CenterEnd).fillMaxHeight()
+        )
+    }
 
 @OptIn(ExperimentalComposeUiApi::class)
 @Composable
@@ -205,126 +199,102 @@
         Text(
             text = "Привет! 你好! Desktop Compose use $info: ${amount.value}",
             color = Color.Black,
-            modifier = Modifier
-                .background(Color.Blue)
-                .height(56.dp)
-                .wrapContentSize(Alignment.Center)
+            modifier =
+                Modifier.background(Color.Blue).height(56.dp).wrapContentSize(Alignment.Center)
         )
 
         val inlineIndicatorId = "indicator"
 
         Text(
-            text = buildAnnotatedString {
-                append("The quick ")
-                if (animation.value) {
-                    appendInlineContent(inlineIndicatorId)
-                }
-                pushStyle(
-                    SpanStyle(
-                        color = Color(0xff964B00),
-                        shadow = Shadow(Color.Green, offset = Offset(1f, 1f))
+            text =
+                buildAnnotatedString {
+                    append("The quick ")
+                    if (animation.value) {
+                        appendInlineContent(inlineIndicatorId)
+                    }
+                    pushStyle(
+                        SpanStyle(
+                            color = Color(0xff964B00),
+                            shadow = Shadow(Color.Green, offset = Offset(1f, 1f))
+                        )
                     )
-                )
-                append("brown fox")
-                pop()
-                pushStyle(SpanStyle(background = Color.Yellow))
-                append(" 🦊 ate a ")
-                pop()
-                pushStyle(SpanStyle(fontSize = 30.sp, textDecoration = Underline))
-                append("zesty hamburgerfons")
-                pop()
-                append(" 🍔.\nThe 👩‍👩‍👧‍👧 laughed.")
-                addStyle(SpanStyle(color = Color.Green), 25, 35)
-            },
+                    append("brown fox")
+                    pop()
+                    pushStyle(SpanStyle(background = Color.Yellow))
+                    append(" 🦊 ate a ")
+                    pop()
+                    pushStyle(SpanStyle(fontSize = 30.sp, textDecoration = Underline))
+                    append("zesty hamburgerfons")
+                    pop()
+                    append(" 🍔.\nThe 👩‍👩‍👧‍👧 laughed.")
+                    addStyle(SpanStyle(color = Color.Green), 25, 35)
+                },
             color = Color.Black,
-            inlineContent = mapOf(
-                inlineIndicatorId to InlineTextContent(
-                    Placeholder(
-                        width = 1.em,
-                        height = 1.em,
-                        placeholderVerticalAlign = PlaceholderVerticalAlign.AboveBaseline
-                    )
-                ) {
-                    CircularProgressIndicator(Modifier.padding(end = 3.dp))
-                }
-            )
+            inlineContent =
+                mapOf(
+                    inlineIndicatorId to
+                        InlineTextContent(
+                            Placeholder(
+                                width = 1.em,
+                                height = 1.em,
+                                placeholderVerticalAlign = PlaceholderVerticalAlign.AboveBaseline
+                            )
+                        ) {
+                            CircularProgressIndicator(Modifier.padding(end = 3.dp))
+                        }
+                )
         )
 
-        val loremColors = listOf(
-            Color.Black,
-            Color.Yellow,
-            Color.Green,
-            Color.Blue
-        )
+        val loremColors = listOf(Color.Black, Color.Yellow, Color.Green, Color.Blue)
         var loremColor by remember { mutableStateOf(0) }
 
-        val loremDecorations = listOf(
-            TextDecoration.None,
-            TextDecoration.Underline,
-            TextDecoration.LineThrough
-        )
-        val lorem = "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do" +
-            " eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad" +
-            " minim veniam, quis nostrud exercitation ullamco laboris nisi ut" +
-            " aliquipex ea commodo consequat. Duis aute irure dolor in reprehenderit" +
-            " in voluptate velit esse cillum dolore eu fugiat nulla pariatur." +
-            " Excepteur" +
-            " sint occaecat cupidatat non proident, sunt in culpa qui officia" +
-            " deserunt mollit anim id est laborum."
+        val loremDecorations =
+            listOf(TextDecoration.None, TextDecoration.Underline, TextDecoration.LineThrough)
+        val lorem =
+            "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do" +
+                " eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad" +
+                " minim veniam, quis nostrud exercitation ullamco laboris nisi ut" +
+                " aliquipex ea commodo consequat. Duis aute irure dolor in reprehenderit" +
+                " in voluptate velit esse cillum dolore eu fugiat nulla pariatur." +
+                " Excepteur" +
+                " sint occaecat cupidatat non proident, sunt in culpa qui officia" +
+                " deserunt mollit anim id est laborum."
         var loremDecoration by remember { mutableStateOf(0) }
         Text(
             text = lorem,
             color = loremColors[loremColor],
             textAlign = TextAlign.Center,
             textDecoration = loremDecorations[loremDecoration],
-            modifier = Modifier.clickable {
-                if (loremColor < loremColors.size - 1) {
-                    loremColor += 1
-                } else {
-                    loremColor = 0
-                }
+            modifier =
+                Modifier.clickable {
+                    if (loremColor < loremColors.size - 1) {
+                        loremColor += 1
+                    } else {
+                        loremColor = 0
+                    }
 
-                if (loremDecoration < loremDecorations.size - 1) {
-                    loremDecoration += 1
-                } else {
-                    loremDecoration = 0
+                    if (loremDecoration < loremDecorations.size - 1) {
+                        loremDecoration += 1
+                    } else {
+                        loremDecoration = 0
+                    }
                 }
-            }
         )
 
-        Text(
-            text = lorem,
-            maxLines = 1,
-            overflow = TextOverflow.Ellipsis
-        )
+        Text(text = lorem, maxLines = 1, overflow = TextOverflow.Ellipsis)
 
-        Row(
-            modifier = Modifier.fillMaxWidth(),
-            horizontalArrangement = Arrangement.SpaceEvenly
-        ) {
+        Row(modifier = Modifier.fillMaxWidth(), horizontalArrangement = Arrangement.SpaceEvenly) {
             Text(
                 "Default",
             )
 
-            Text(
-                "SansSerif",
-                fontFamily = FontFamily.SansSerif
-            )
+            Text("SansSerif", fontFamily = FontFamily.SansSerif)
 
-            Text(
-                "Serif",
-                fontFamily = FontFamily.Serif
-            )
+            Text("Serif", fontFamily = FontFamily.Serif)
 
-            Text(
-                "Monospace",
-                fontFamily = FontFamily.Monospace
-            )
+            Text("Monospace", fontFamily = FontFamily.Monospace)
 
-            Text(
-                "Cursive",
-                fontFamily = FontFamily.Cursive
-            )
+            Text("Cursive", fontFamily = FontFamily.Cursive)
         }
 
         var overText by remember { mutableStateOf("Move mouse over text:") }
@@ -332,55 +302,52 @@
 
         SelectionContainer {
             Text(
-                text = "fun <T : Comparable<T>> List<T>.quickSort(): List<T> = when {\n" +
-                    "  size < 2 -> this\n" +
-                    "  else -> {\n" +
-                    "    val pivot = first()\n" +
-                    "    val (smaller, greater) = drop(1).partition { it <= pivot }\n" +
-                    "    smaller.quickSort() + pivot + greater.quickSort()\n" +
-                    "   }\n" +
-                    "}",
+                text =
+                    "fun <T : Comparable<T>> List<T>.quickSort(): List<T> = when {\n" +
+                        "  size < 2 -> this\n" +
+                        "  else -> {\n" +
+                        "    val pivot = first()\n" +
+                        "    val (smaller, greater) = drop(1).partition { it <= pivot }\n" +
+                        "    smaller.quickSort() + pivot + greater.quickSort()\n" +
+                        "   }\n" +
+                        "}",
                 fontFamily = italicFont,
-                modifier = Modifier.padding(10.dp).pointerInput(Unit) {
-                    awaitPointerEventScope {
-                        while (true) {
-                            val event = awaitPointerEvent()
-                            val position = event.changes.first().position
-                            when (event.type) {
-                                PointerEventType.Move -> {
-                                    overText = "Move position: $position"
-                                }
-                                PointerEventType.Enter -> {
-                                    overText = "Over enter"
-                                }
-                                PointerEventType.Exit -> {
-                                    overText = "Over exit"
+                modifier =
+                    Modifier.padding(10.dp).pointerInput(Unit) {
+                        awaitPointerEventScope {
+                            while (true) {
+                                val event = awaitPointerEvent()
+                                val position = event.changes.first().position
+                                when (event.type) {
+                                    PointerEventType.Move -> {
+                                        overText = "Move position: $position"
+                                    }
+                                    PointerEventType.Enter -> {
+                                        overText = "Over enter"
+                                    }
+                                    PointerEventType.Exit -> {
+                                        overText = "Over exit"
+                                    }
                                 }
                             }
                         }
                     }
-                }
             )
         }
         Text(
-            text = buildAnnotatedString {
-                append("resolved: NotoSans-Regular.ttf ")
-                pushStyle(
-                    SpanStyle(
-                        fontStyle = FontStyle.Italic
-                    )
-                )
-                append("NotoSans-italic.ttf.")
-            },
+            text =
+                buildAnnotatedString {
+                    append("resolved: NotoSans-Regular.ttf ")
+                    pushStyle(SpanStyle(fontStyle = FontStyle.Italic))
+                    append("NotoSans-italic.ttf.")
+                },
             fontFamily = dispatchedFonts,
         )
 
         Row(verticalAlignment = Alignment.CenterVertically) {
             Button(
                 modifier = Modifier.padding(4.dp).pointerHoverIcon(PointerIcon.Hand),
-                onClick = {
-                    amount.value++
-                }
+                onClick = { amount.value++ }
             ) {
                 Text("Base")
             }
@@ -392,22 +359,12 @@
         ) {
             Row {
                 Column {
-                    Switch(
-                        animation.value,
-                        onCheckedChange = {
-                            animation.value = it
-                        }
-                    )
+                    Switch(animation.value, onCheckedChange = { animation.value = it })
                     Row(
                         modifier = Modifier.padding(4.dp),
                         verticalAlignment = Alignment.CenterVertically
                     ) {
-                        Checkbox(
-                            animation.value,
-                            onCheckedChange = {
-                                animation.value = it
-                            }
-                        )
+                        Checkbox(animation.value, onCheckedChange = { animation.value = it })
                         Text("Animation")
                     }
                 }
@@ -441,10 +398,7 @@
             Animations(isCircularEnabled = animation.value)
         }
 
-        Slider(
-            value = amount.value / 100f,
-            onValueChange = { amount.value = (it * 100) }
-        )
+        Slider(value = amount.value / 100f, onValueChange = { amount.value = (it * 100) })
         TextField(
             value = amount.value.toString(),
             onValueChange = { amount.value = it.toFloatOrNull() ?: 42f },
@@ -452,55 +406,50 @@
         )
 
         val (focusItem1, focusItem2) = FocusRequester.createRefs()
-        val text = remember {
-            mutableStateOf("Hello \uD83E\uDDD1\uD83C\uDFFF\u200D\uD83E\uDDB0")
-        }
+        val text = remember { mutableStateOf("Hello \uD83E\uDDD1\uD83C\uDFFF\u200D\uD83E\uDDB0") }
         ContextMenuDataProvider(
             items = {
-                listOf(ContextMenuItem("Clear") { text.value = ""; focusItem1.requestFocus() })
+                listOf(
+                    ContextMenuItem("Clear") {
+                        text.value = ""
+                        focusItem1.requestFocus()
+                    }
+                )
             }
         ) {
             TextField(
                 value = text.value,
                 onValueChange = { text.value = it },
                 label = { Text(text = "Input2") },
-                placeholder = {
-                    Text(text = "Important input")
-                },
+                placeholder = { Text(text = "Important input") },
                 maxLines = 1,
-                modifier = Modifier.onPreviewKeyEvent {
-                    when {
-                        (it.isMetaPressed && it.key == Key.Enter) -> {
-                            if (it.isShiftPressed) {
-                                text.value = "Cleared with shift!"
-                            } else {
-                                text.value = "Cleared!"
+                modifier =
+                    Modifier.onPreviewKeyEvent {
+                            when {
+                                (it.isMetaPressed && it.key == Key.Enter) -> {
+                                    if (it.isShiftPressed) {
+                                        text.value = "Cleared with shift!"
+                                    } else {
+                                        text.value = "Cleared!"
+                                    }
+                                    true
+                                }
+                                else -> false
                             }
-                            true
                         }
-                        else -> false
-                    }
-                }.focusRequester(focusItem1)
-                .focusProperties {
-                    next = focusItem2
-                }
+                        .focusRequester(focusItem1)
+                        .focusProperties { next = focusItem2 }
             )
         }
 
         var text2 by remember {
-            val initText = buildString {
-                (1..1000).forEach {
-                    append("$it\n")
-                }
-            }
+            val initText = buildString { (1..1000).forEach { append("$it\n") } }
             mutableStateOf(initText)
         }
         TextField(
             text2,
-            modifier = Modifier
-                .height(200.dp)
-                .focusRequester(focusItem2)
-                .focusProperties {
+            modifier =
+                Modifier.height(200.dp).focusRequester(focusItem2).focusProperties {
                     previous = focusItem1
                 },
             onValueChange = { text2 = it }
@@ -530,18 +479,14 @@
     }
 
     val enabled = remember { mutableStateOf(true) }
-    val color by animateColorAsState(
-        if (enabled.value) Color.Green else Color.Red,
-        animationSpec = TweenSpec(durationMillis = 2000)
-    )
+    val color by
+        animateColorAsState(
+            if (enabled.value) Color.Green else Color.Red,
+            animationSpec = TweenSpec(durationMillis = 2000)
+        )
 
     MaterialTheme {
-        Box(
-            Modifier
-                .size(70.dp)
-                .clickable { enabled.value = !enabled.value }
-                .background(color)
-        )
+        Box(Modifier.size(70.dp).clickable { enabled.value = !enabled.value }.background(color))
     }
 }
 
@@ -562,8 +507,5 @@
         }
     }
 
-    VerticalScrollbar(
-        rememberScrollbarAdapter(state),
-        Modifier.align(Alignment.CenterEnd)
-    )
+    VerticalScrollbar(rememberScrollbarAdapter(state), Modifier.align(Alignment.CenterEnd))
 }
diff --git a/compose/desktop/desktop/samples/src/jvmMain/kotlin/androidx/compose/desktop/examples/popupexample/AppContent.jvm.kt b/compose/desktop/desktop/samples/src/jvmMain/kotlin/androidx/compose/desktop/examples/popupexample/AppContent.jvm.kt
index bfbbc46..5e68189 100644
--- a/compose/desktop/desktop/samples/src/jvmMain/kotlin/androidx/compose/desktop/examples/popupexample/AppContent.jvm.kt
+++ b/compose/desktop/desktop/samples/src/jvmMain/kotlin/androidx/compose/desktop/examples/popupexample/AppContent.jvm.kt
@@ -82,46 +82,36 @@
 ) {
     val dialogState = remember { mutableStateOf(false) }
 
-    Surface(
-        modifier = Modifier.fillMaxSize(),
-        color = Color(55, 55, 55)
-    ) {
+    Surface(modifier = Modifier.fillMaxSize(), color = Color(55, 55, 55)) {
         Column {
             Row(
-                modifier = Modifier.background(color = Color(75, 75, 75))
-                    .fillMaxWidth()
-                    .height(30.dp)
-                    .padding(start = 20.dp, end = 10.dp),
+                modifier =
+                    Modifier.background(color = Color(75, 75, 75))
+                        .fillMaxWidth()
+                        .height(30.dp)
+                        .padding(start = 20.dp, end = 10.dp),
                 verticalAlignment = Alignment.CenterVertically
             ) {
-                WindowDraggableArea(
-                    modifier = Modifier.weight(1f)
-                ) {
+                WindowDraggableArea(modifier = Modifier.weight(1f)) {
                     TextBox(text = AppState.wndTitle.value)
                 }
                 Row {
                     Button(
                         color = Color(210, 210, 210),
                         size = IntSize(16, 16),
-                        onClick = {
-                            windowState.placement = WindowPlacement.Fullscreen
-                        }
+                        onClick = { windowState.placement = WindowPlacement.Fullscreen }
                     )
                     Spacer(modifier = Modifier.width(3.dp))
                     Button(
                         color = Color(232, 182, 109),
                         size = IntSize(16, 16),
-                        onClick = {
-                            windowState.isMinimized = true
-                        }
+                        onClick = { windowState.isMinimized = true }
                     )
                     Spacer(modifier = Modifier.width(3.dp))
                     Button(
                         color = Color(150, 232, 150),
                         size = IntSize(16, 16),
-                        onClick = {
-                            windowState.placement = WindowPlacement.Maximized
-                        }
+                        onClick = { windowState.placement = WindowPlacement.Maximized }
                     )
                     Spacer(modifier = Modifier.width(3.dp))
                     Button(
@@ -148,15 +138,18 @@
                         onClick = {
                             val message = "There should be your message."
                             when {
-                                AppState.notify.value -> trayState.sendNotification(
-                                    Notification("Notification.", message)
-                                )
-                                AppState.warn.value -> trayState.sendNotification(
-                                    Notification("Warning.", message, Notification.Type.Warning)
-                                )
-                                else -> trayState.sendNotification(
-                                    Notification("Error.", message, Notification.Type.Error)
-                                )
+                                AppState.notify.value ->
+                                    trayState.sendNotification(
+                                        Notification("Notification.", message)
+                                    )
+                                AppState.warn.value ->
+                                    trayState.sendNotification(
+                                        Notification("Warning.", message, Notification.Type.Warning)
+                                    )
+                                else ->
+                                    trayState.sendNotification(
+                                        Notification("Error.", message, Notification.Type.Error)
+                                    )
                             }
                         },
                         color = Color(196, 136, 255)
@@ -169,9 +162,10 @@
                     SwingActionButton("JButton", { AppState.amount.value++ })
                 }
                 Column(
-                    modifier = Modifier.padding(start = 30.dp, top = 50.dp, end = 30.dp)
-                        .background(color = Color(255, 255, 255, 10))
-                        .fillMaxWidth()
+                    modifier =
+                        Modifier.padding(start = 30.dp, top = 50.dp, end = 30.dp)
+                            .background(color = Color(255, 255, 255, 10))
+                            .fillMaxWidth()
                 ) {
                     Row {
                         ContextMenu()
@@ -190,20 +184,11 @@
                     )
                     Spacer(modifier = Modifier.height(30.dp))
                     Row(modifier = Modifier.padding(start = 20.dp)) {
-                        RadioButton(
-                            text = "- notify",
-                            state = AppState.notify
-                        )
+                        RadioButton(text = "- notify", state = AppState.notify)
                         Spacer(modifier = Modifier.width(30.dp))
-                        RadioButton(
-                            text = "- warn",
-                            state = AppState.warn
-                        )
+                        RadioButton(text = "- warn", state = AppState.warn)
                         Spacer(modifier = Modifier.width(30.dp))
-                        RadioButton(
-                            text = "- error",
-                            state = AppState.error
-                        )
+                        RadioButton(text = "- error", state = AppState.error)
                     }
                     Spacer(modifier = Modifier.height(30.dp))
                     Row(modifier = Modifier.padding(start = 20.dp)) {
@@ -215,19 +200,12 @@
         }
     }
 
-    Box(
-        modifier = Modifier.fillMaxSize(),
-        contentAlignment = Alignment.BottomCenter
-    ) {
+    Box(modifier = Modifier.fillMaxSize(), contentAlignment = Alignment.BottomCenter) {
         Box(
-            modifier = Modifier.background(color = Color(32, 32, 32))
-                .fillMaxWidth()
-                .height(30.dp)
+            modifier = Modifier.background(color = Color(32, 32, 32)).fillMaxWidth().height(30.dp)
         ) {
             Row(modifier = Modifier.padding(start = 20.dp)) {
-                TextBox(
-                    text = "Size: ${windowState.size}   Location: ${windowState.position}"
-                )
+                TextBox(text = "Size: ${windowState.size}   Location: ${windowState.position}")
             }
         }
     }
@@ -241,9 +219,7 @@
     )
     if (AppState.popupState.value) {
         // To make sure the popup is displayed on the top.
-        Box(
-            Modifier.fillMaxSize().background(color = Color(0, 0, 0, 200))
-        )
+        Box(Modifier.fillMaxSize().background(color = Color(0, 0, 0, 200)))
     }
 
     if (dialogState.value) {
@@ -255,35 +231,22 @@
         if (AppState.alertDialog.value) {
             AlertDialog(
                 onDismissRequest = dismiss,
-                confirmButton = {
-                    Button(text = "OK", onClick = { AppState.amount.value++ })
-                },
-                dismissButton = {
-                    Button(text = "Cancel", onClick = dismiss)
-                },
-                title = {
-                    TextBox(text = "Alert Dialog")
-                },
+                confirmButton = { Button(text = "OK", onClick = { AppState.amount.value++ }) },
+                dismissButton = { Button(text = "Cancel", onClick = dismiss) },
+                title = { TextBox(text = "Alert Dialog") },
                 text = {
                     println("CompositionLocal value is ${LocalTest.current}.")
                     TextBox(text = "Increment amount?")
                     DisposableEffect(Unit) {
-                        onDispose {
-                            println("onDispose inside AlertDialog is called.")
-                        }
+                        onDispose { println("onDispose inside AlertDialog is called.") }
                     }
                 },
                 shape = RoundedCornerShape(0.dp),
                 backgroundColor = Color(70, 70, 70)
             )
         } else {
-            DialogWindow(
-                onCloseRequest = dismiss
-            ) {
-                WindowContent(
-                    AppState.amount,
-                    onClose = dismiss
-                )
+            DialogWindow(onCloseRequest = dismiss) {
+                WindowContent(AppState.amount, onClose = dismiss)
             }
         }
     }
@@ -291,24 +254,18 @@
 
 @Composable
 fun PopupSample(displayed: Boolean, onDismiss: () -> Unit) {
-    Box(
-        modifier = Modifier.fillMaxSize()
-    ) {
+    Box(modifier = Modifier.fillMaxSize()) {
         if (displayed) {
             Popup(
                 alignment = Alignment.TopCenter,
                 offset = IntOffset(0, 50),
                 onDismissRequest = onDismiss,
-                properties = PopupProperties(
-                    focusable = true
-                )
+                properties = PopupProperties(focusable = true)
             ) {
                 println("CompositionLocal value is ${LocalTest.current}.")
                 PopupContent(onDismiss)
                 DisposableEffect(Unit) {
-                    onDispose {
-                        println("onDispose inside Popup is called.")
-                    }
+                    onDispose { println("onDispose inside Popup is called.") }
                 }
             }
         }
@@ -358,21 +315,15 @@
     @OptIn(ExperimentalFoundationApi::class)
     TooltipArea(
         tooltip = {
-            Surface(
-                color = Color(210, 210, 210),
-                shape = RoundedCornerShape(4.dp)
-            ) {
+            Surface(color = Color(210, 210, 210), shape = RoundedCornerShape(4.dp)) {
                 Text(text = "Tooltip: [$text]", modifier = Modifier.padding(10.dp))
             }
         }
     ) {
         Button(
             onClick = onClick,
-            colors = ButtonDefaults.buttonColors(
-                backgroundColor = color
-            ),
-            modifier = Modifier
-                .size(size.width.dp, size.height.dp)
+            colors = ButtonDefaults.buttonColors(backgroundColor = color),
+            modifier = Modifier.size(size.width.dp, size.height.dp)
         ) {
             Text(text = text)
         }
@@ -381,50 +332,37 @@
 
 @Composable
 fun TextBox(text: String = "", modifier: Modifier = Modifier.height(30.dp)) {
-    Box(
-        modifier = modifier,
-        contentAlignment = Alignment.Center
-    ) {
-        Text(
-            text = text,
-            color = Color(200, 200, 200)
-        )
+    Box(modifier = modifier, contentAlignment = Alignment.Center) {
+        Text(text = text, color = Color(200, 200, 200))
     }
 }
 
 @Composable
-@OptIn(
-    ExperimentalFoundationApi::class
-)
+@OptIn(ExperimentalFoundationApi::class)
 fun ContextMenu() {
     val items = listOf("Item A", "Item B", "Item C", "Item D", "Item E", "Item F")
     val showMenu = remember { mutableStateOf(false) }
     val selectedIndex = remember { mutableStateOf(0) }
     TooltipArea(
         delayMillis = 100,
-        tooltipPlacement = TooltipPlacement.ComponentRect(
-            anchor = Alignment.TopStart,
-            alignment = Alignment.TopEnd
-        ),
+        tooltipPlacement =
+            TooltipPlacement.ComponentRect(
+                anchor = Alignment.TopStart,
+                alignment = Alignment.TopEnd
+            ),
         tooltip = {
-            Surface(
-                color = Color(210, 210, 210),
-                shape = RoundedCornerShape(4.dp)
-            ) {
+            Surface(color = Color(210, 210, 210), shape = RoundedCornerShape(4.dp)) {
                 Text(text = "Tooltip: [ContextMenu]", modifier = Modifier.padding(10.dp))
             }
         }
     ) {
-        Surface(
-            color = Color(255, 255, 255, 40),
-            shape = RoundedCornerShape(4.dp)
-        ) {
+        Surface(color = Color(255, 255, 255, 40), shape = RoundedCornerShape(4.dp)) {
             TextBox(
                 text = "Selected: ${items[selectedIndex.value]}",
-                modifier = Modifier
-                    .height(35.dp)
-                    .padding(start = 4.dp, end = 4.dp)
-                    .clickable(onClick = { showMenu.value = true })
+                modifier =
+                    Modifier.height(35.dp)
+                        .padding(start = 4.dp, end = 4.dp)
+                        .clickable(onClick = { showMenu.value = true })
             )
             CursorDropdownMenu(
                 expanded = showMenu.value,
@@ -447,10 +385,7 @@
 
 @Composable
 fun TextFieldWithSuggestions() {
-    Surface(
-        color = Color(255, 255, 255, 40),
-        shape = RoundedCornerShape(4.dp)
-    ) {
+    Surface(color = Color(255, 255, 255, 40), shape = RoundedCornerShape(4.dp)) {
         Box(
             modifier = Modifier.size(200.dp, 35.dp).padding(5.dp),
             contentAlignment = Alignment.CenterStart
@@ -464,24 +399,17 @@
                 singleLine = true,
                 onValueChange = {
                     text.value = it
-                    if (text.value.isNotEmpty())
-                        showMenu.value = true
-                    else
-                        showMenu.value = false
+                    if (text.value.isNotEmpty()) showMenu.value = true else showMenu.value = false
                 },
                 modifier = Modifier.height(14.dp),
             )
             DropdownMenu(
                 expanded = showMenu.value,
                 onDismissRequest = {},
-                properties = PopupProperties(
-                    focusable = false
-                )
+                properties = PopupProperties(focusable = false)
             ) {
                 words.forEach { name ->
-                    DropdownMenuItem(onClick = { text.value += name }) {
-                        Text(text = name)
-                    }
+                    DropdownMenuItem(onClick = { text.value += name }) { Text(text = name) }
                 }
             }
         }
@@ -491,15 +419,10 @@
 @Composable
 fun CheckBox(text: String, state: MutableState<Boolean>) {
     Row {
-        Box(
-            modifier = Modifier.height(35.dp),
-            contentAlignment = Alignment.Center
-        ) {
+        Box(modifier = Modifier.height(35.dp), contentAlignment = Alignment.Center) {
             Checkbox(
                 checked = state.value,
-                onCheckedChange = {
-                    state.value = !state.value
-                },
+                onCheckedChange = { state.value = !state.value },
                 modifier = Modifier.padding(start = 20.dp, bottom = 5.dp)
             )
         }
@@ -533,32 +456,26 @@
         modifier = Modifier.size(200.dp, 35.dp),
         factory = {
             JButton(text).apply {
-                addActionListener(object : ActionListener {
-                    public override fun actionPerformed(e: ActionEvent) {
-                        action?.invoke()
+                addActionListener(
+                    object : ActionListener {
+                        public override fun actionPerformed(e: ActionEvent) {
+                            action?.invoke()
+                        }
                     }
-                })
+                )
             }
         },
-        update = { component ->
-            component.setText("$text:${AppState.amount.value}")
-        }
+        update = { component -> component.setText("$text:${AppState.amount.value}") }
     )
 }
 
 @Composable
-fun ApplicationScope.SecondaryWindow(onCloseRequest: () -> Unit) = Window(
-    onCloseRequest = onCloseRequest,
-    state = rememberWindowState(size = DpSize(400.dp, 200.dp)),
-    undecorated = AppState.undecorated.value,
-) {
-    WindowContent(
-        amount = AppState.amount,
-        onClose = onCloseRequest
-    )
-    DisposableEffect(Unit) {
-        onDispose {
-            println("Dispose composition")
-        }
+fun ApplicationScope.SecondaryWindow(onCloseRequest: () -> Unit) =
+    Window(
+        onCloseRequest = onCloseRequest,
+        state = rememberWindowState(size = DpSize(400.dp, 200.dp)),
+        undecorated = AppState.undecorated.value,
+    ) {
+        WindowContent(amount = AppState.amount, onClose = onCloseRequest)
+        DisposableEffect(Unit) { onDispose { println("Dispose composition") } }
     }
-}
diff --git a/compose/desktop/desktop/samples/src/jvmMain/kotlin/androidx/compose/desktop/examples/popupexample/Main.jvm.kt b/compose/desktop/desktop/samples/src/jvmMain/kotlin/androidx/compose/desktop/examples/popupexample/Main.jvm.kt
index 548a1b3..ec3edef 100644
--- a/compose/desktop/desktop/samples/src/jvmMain/kotlin/androidx/compose/desktop/examples/popupexample/Main.jvm.kt
+++ b/compose/desktop/desktop/samples/src/jvmMain/kotlin/androidx/compose/desktop/examples/popupexample/Main.jvm.kt
@@ -28,9 +28,7 @@
 import androidx.compose.ui.window.rememberWindowState
 
 fun main() = application {
-    val windowState = rememberWindowState(
-        size = DpSize(800.dp, 600.dp)
-    )
+    val windowState = rememberWindowState(size = DpSize(800.dp, 600.dp))
 
     val trayState = rememberTrayState()
 
@@ -38,9 +36,7 @@
         Tray(
             state = trayState,
             icon = AppState.image().toPainter(),
-            menu = {
-                ActionItems(trayState)
-            }
+            menu = { ActionItems(trayState) }
         )
 
         Window(
@@ -51,19 +47,11 @@
         ) {
             MainMenuBar(windowState, trayState)
 
-            CompositionLocalProvider(
-                LocalTest provides 42
-            ) {
-                Content(windowState, trayState)
-            }
+            CompositionLocalProvider(LocalTest provides 42) { Content(windowState, trayState) }
         }
     }
 
     for (id in AppState.secondaryWindowIds) {
-        key(id) {
-            SecondaryWindow(
-                onCloseRequest = { AppState.closeSecondaryWindow(id) }
-            )
-        }
+        key(id) { SecondaryWindow(onCloseRequest = { AppState.closeSecondaryWindow(id) }) }
     }
 }
diff --git a/compose/desktop/desktop/samples/src/jvmMain/kotlin/androidx/compose/desktop/examples/popupexample/MenuItems.jvm.kt b/compose/desktop/desktop/samples/src/jvmMain/kotlin/androidx/compose/desktop/examples/popupexample/MenuItems.jvm.kt
index 4e4624b..fffdd4e 100644
--- a/compose/desktop/desktop/samples/src/jvmMain/kotlin/androidx/compose/desktop/examples/popupexample/MenuItems.jvm.kt
+++ b/compose/desktop/desktop/samples/src/jvmMain/kotlin/androidx/compose/desktop/examples/popupexample/MenuItems.jvm.kt
@@ -30,24 +30,20 @@
 
 @OptIn(ExperimentalComposeUiApi::class)
 @Composable
-fun FrameWindowScope.MainMenuBar(
-    windowState: WindowState,
-    trayState: TrayState
-) = MenuBar {
-    Menu("Actions") {
-        ActionItems(trayState, withShortcuts = true)
-    }
+fun FrameWindowScope.MainMenuBar(windowState: WindowState, trayState: TrayState) = MenuBar {
+    Menu("Actions") { ActionItems(trayState, withShortcuts = true) }
     Menu("About") {
         CheckboxItem(
             "Fullscreen",
             windowState.placement == WindowPlacement.Fullscreen,
             shortcut = KeyShortcut(Key.F, ctrl = true)
         ) { checked ->
-            windowState.placement = if (checked) {
-                WindowPlacement.Fullscreen
-            } else {
-                WindowPlacement.Floating
-            }
+            windowState.placement =
+                if (checked) {
+                    WindowPlacement.Fullscreen
+                } else {
+                    WindowPlacement.Floating
+                }
         }
         Item("About", shortcut = KeyShortcut(Key.I, ctrl = true)) {
             println("This is PopUpExampleApp")
@@ -57,10 +53,7 @@
 
 @OptIn(ExperimentalComposeUiApi::class)
 @Composable
-fun MenuScope.ActionItems(
-    trayState: TrayState,
-    withShortcuts: Boolean = false
-) {
+fun MenuScope.ActionItems(trayState: TrayState, withShortcuts: Boolean = false) {
     Item(
         "Send tray notification",
         shortcut = KeyShortcut(Key.N, ctrl = true).takeIf { withShortcuts }
@@ -69,10 +62,7 @@
             Notification("New Notification from JB", "JetBrains send you a message!")
         )
     }
-    Item(
-        "Increment amount",
-        shortcut = KeyShortcut(Key.A, ctrl = true).takeIf { withShortcuts }
-    ) {
+    Item("Increment amount", shortcut = KeyShortcut(Key.A, ctrl = true).takeIf { withShortcuts }) {
         AppState.amount.value++
     }
     Item(
diff --git a/compose/desktop/desktop/samples/src/jvmMain/kotlin/androidx/compose/desktop/examples/popupexample/TestAmbient.jvm.kt b/compose/desktop/desktop/samples/src/jvmMain/kotlin/androidx/compose/desktop/examples/popupexample/TestAmbient.jvm.kt
index cb2d9a2..016f061 100644
--- a/compose/desktop/desktop/samples/src/jvmMain/kotlin/androidx/compose/desktop/examples/popupexample/TestAmbient.jvm.kt
+++ b/compose/desktop/desktop/samples/src/jvmMain/kotlin/androidx/compose/desktop/examples/popupexample/TestAmbient.jvm.kt
@@ -18,6 +18,4 @@
 
 import androidx.compose.runtime.staticCompositionLocalOf
 
-val LocalTest = staticCompositionLocalOf<Int> {
-    error("LocalTest not provided")
-}
+val LocalTest = staticCompositionLocalOf<Int> { error("LocalTest not provided") }
diff --git a/compose/desktop/desktop/samples/src/jvmMain/kotlin/androidx/compose/desktop/examples/swingexample/Main.jvm.kt b/compose/desktop/desktop/samples/src/jvmMain/kotlin/androidx/compose/desktop/examples/swingexample/Main.jvm.kt
index 27a2c5a..43e660b 100644
--- a/compose/desktop/desktop/samples/src/jvmMain/kotlin/androidx/compose/desktop/examples/swingexample/Main.jvm.kt
+++ b/compose/desktop/desktop/samples/src/jvmMain/kotlin/androidx/compose/desktop/examples/swingexample/Main.jvm.kt
@@ -66,9 +66,7 @@
 val westClicks = mutableStateOf(0)
 val eastClicks = mutableStateOf(0)
 
-fun main() = SwingUtilities.invokeLater {
-    SwingComposeWindow()
-}
+fun main() = SwingUtilities.invokeLater { SwingComposeWindow() }
 
 fun SwingComposeWindow() {
     // creating ComposePanel
@@ -81,19 +79,11 @@
     // setting the content
     composePanelTop.setContent {
         ComposeContent(background = Color(55, 155, 55))
-        DisposableEffect(Unit) {
-            onDispose {
-                println("Dispose composition")
-            }
-        }
+        DisposableEffect(Unit) { onDispose { println("Dispose composition") } }
     }
     composePanelBottom.setContent {
         ComposeContent(background = Color(55, 55, 155))
-        DisposableEffect(Unit) {
-            onDispose {
-                println("Dispose composition")
-            }
-        }
+        DisposableEffect(Unit) { onDispose { println("Dispose composition") } }
     }
 
     val window = JFrame()
@@ -109,9 +99,7 @@
         actionButton(
             text = "SOUTH/REMOVE COMPOSE",
             size = IntSize(40, 40),
-            action = {
-                panel.remove(composePanelBottom)
-            }
+            action = { panel.remove(composePanelBottom) }
         ),
         BorderLayout.SOUTH
     )
@@ -132,11 +120,13 @@
     val button = JButton(text)
     button.setToolTipText("Tooltip for $text button.")
     button.setPreferredSize(Dimension(size.width, size.height))
-    button.addActionListener(object : ActionListener {
-        public override fun actionPerformed(e: ActionEvent) {
-            action?.invoke()
+    button.addActionListener(
+        object : ActionListener {
+            public override fun actionPerformed(e: ActionEvent) {
+                action?.invoke()
+            }
         }
-    })
+    )
 
     return button
 }
@@ -148,9 +138,7 @@
         contentAlignment = Alignment.Center
     ) {
         Column {
-            Row(
-                modifier = Modifier.height(40.dp)
-            ) {
+            Row(modifier = Modifier.height(40.dp)) {
                 Button(
                     modifier = Modifier.height(35.dp).padding(top = 3.dp),
                     onClick = {
@@ -232,13 +220,8 @@
                 Text(text = "${text}Clicks: ${counter.value}")
             }
             Spacer(modifier = Modifier.height(25.dp))
-            Box(
-                modifier = Modifier.fillMaxSize(),
-                contentAlignment = Alignment.Center
-            ) {
-                Button(onClick = { counter.value++ }) {
-                    Text(text = text, color = Color.White)
-                }
+            Box(modifier = Modifier.fillMaxSize(), contentAlignment = Alignment.Center) {
+                Button(onClick = { counter.value++ }) { Text(text = text, color = Color.White) }
             }
         }
     }
@@ -246,10 +229,7 @@
 
 @Composable
 fun ApplicationScope.SecondWindowContent() {
-    Box(
-        Modifier.fillMaxSize(),
-        contentAlignment = Alignment.Center
-    ) {
+    Box(Modifier.fillMaxSize(), contentAlignment = Alignment.Center) {
         Column {
             Box(
                 modifier = Modifier.height(30.dp).fillMaxWidth(),
@@ -262,9 +242,7 @@
                 modifier = Modifier.height(30.dp).fillMaxWidth(),
                 contentAlignment = Alignment.Center
             ) {
-                Button(onClick = { exitApplication() }) {
-                    Text("Close", color = Color.White)
-                }
+                Button(onClick = { exitApplication() }) { Text("Close", color = Color.White) }
             }
         }
     }
diff --git a/compose/desktop/desktop/samples/src/jvmMain/kotlin/androidx/compose/desktop/examples/vsynctest/Main.jvm.kt b/compose/desktop/desktop/samples/src/jvmMain/kotlin/androidx/compose/desktop/examples/vsynctest/Main.jvm.kt
index aed8bfb..08c7b88 100644
--- a/compose/desktop/desktop/samples/src/jvmMain/kotlin/androidx/compose/desktop/examples/vsynctest/Main.jvm.kt
+++ b/compose/desktop/desktop/samples/src/jvmMain/kotlin/androidx/compose/desktop/examples/vsynctest/Main.jvm.kt
@@ -53,34 +53,35 @@
         }
     }
 
-    fun logFrame() = with(state) {
-        val t2 = System.nanoTime()
-        val dt = (t2 - t1).coerceAtLeast(0)
-        frameDeltas.add(dt)
-        t1 = t2
+    fun logFrame() =
+        with(state) {
+            val t2 = System.nanoTime()
+            val dt = (t2 - t1).coerceAtLeast(0)
+            frameDeltas.add(dt)
+            t1 = t2
 
-        if (heuristicExpectedFrameTime > 0 && dt > heuristicExpectedFrameTime * 1.5) {
-            val dtMillis = dt / 1E6
-            val expectedMillis = heuristicExpectedFrameTime / 1E6
-            println("Too long frame %.2f (expected %.2f)".format(dtMillis, expectedMillis))
+            if (heuristicExpectedFrameTime > 0 && dt > heuristicExpectedFrameTime * 1.5) {
+                val dtMillis = dt / 1E6
+                val expectedMillis = heuristicExpectedFrameTime / 1E6
+                println("Too long frame %.2f (expected %.2f)".format(dtMillis, expectedMillis))
+            }
+
+            if (frameDeltas.size % FrameLogCount == 0) {
+                val fps = 1E9 / frameDeltas.average()
+
+                // it is more precise than
+                // window.window.graphicsConfiguration.device.displayMode.refreshRate
+                // if vsync is supported
+                heuristicExpectedFrameTime = frameDeltas.median()
+
+                val actualFrameCount = frameDeltas.sum() / heuristicExpectedFrameTime
+                val missedFrames = (actualFrameCount - frameDeltas.size).coerceAtLeast(0)
+                val missedFrameCountPercent = 100.0 * missedFrames / frameDeltas.size
+                println("FPS %.2f, missed frames %.2f%%".format(fps, missedFrameCountPercent))
+                frameDeltas.clear()
+            }
         }
 
-        if (frameDeltas.size % FrameLogCount == 0) {
-            val fps = 1E9 / frameDeltas.average()
-
-            // it is more precise than
-            // window.window.graphicsConfiguration.device.displayMode.refreshRate
-            // if vsync is supported
-            heuristicExpectedFrameTime = frameDeltas.median()
-
-            val actualFrameCount = frameDeltas.sum() / heuristicExpectedFrameTime
-            val missedFrames = (actualFrameCount - frameDeltas.size).coerceAtLeast(0)
-            val missedFrameCountPercent = 100.0 * missedFrames / frameDeltas.size
-            println("FPS %.2f, missed frames %.2f%%".format(fps, missedFrameCountPercent))
-            frameDeltas.clear()
-        }
-    }
-
     Window(
         onCloseRequest = ::exitApplication,
         state = rememberWindowState(size = DpSize(800.dp, 200.dp))
diff --git a/compose/desktop/desktop/samples/src/jvmMain/kotlin/androidx/compose/desktop/examples/windowapi/Examples.jvm.kt b/compose/desktop/desktop/samples/src/jvmMain/kotlin/androidx/compose/desktop/examples/windowapi/Examples.jvm.kt
index 84f45b9..f05ef89 100644
--- a/compose/desktop/desktop/samples/src/jvmMain/kotlin/androidx/compose/desktop/examples/windowapi/Examples.jvm.kt
+++ b/compose/desktop/desktop/samples/src/jvmMain/kotlin/androidx/compose/desktop/examples/windowapi/Examples.jvm.kt
@@ -75,213 +75,100 @@
 import kotlinx.coroutines.withContext
 
 @OptIn(DelicateCoroutinesApi::class)
-fun helloWorld() = GlobalScope.launchApplication {
-    Window(onCloseRequest = ::exitApplication) {
-        Text("Hello, World!")
+fun helloWorld() =
+    GlobalScope.launchApplication {
+        Window(onCloseRequest = ::exitApplication) { Text("Hello, World!") }
     }
-}
 
 @OptIn(DelicateCoroutinesApi::class)
-fun suspendApplication() = GlobalScope.launch {
-    println("Before application")
+fun suspendApplication() =
+    GlobalScope.launch {
+        println("Before application")
 
-    awaitApplication {
-        Window(onCloseRequest = ::exitApplication) {}
+        awaitApplication { Window(onCloseRequest = ::exitApplication) {} }
+
+        println("After application")
     }
 
-    println("After application")
-}
-
 @OptIn(DelicateCoroutinesApi::class)
-fun suspendBackgroundApplication() = GlobalScope.launch {
-    println("Before application")
+fun suspendBackgroundApplication() =
+    GlobalScope.launch {
+        println("Before application")
 
-    awaitApplication {
-        LaunchedEffect(Unit) {
-            println("1")
-            delay(1000)
-            println("2")
-            delay(1000)
-            println("3")
-        }
-    }
-
-    println("After application")
-}
-
-@OptIn(DelicateCoroutinesApi::class)
-fun splashScreen() = GlobalScope.launchApplication {
-    var isLoading by remember { mutableStateOf(true) }
-
-    LaunchedEffect(Unit) {
-        delay(2000)
-        isLoading = false
-    }
-
-    if (isLoading) {
-        Window(onCloseRequest = ::exitApplication) {
-            Text("Loading")
-        }
-    } else {
-        Window(onCloseRequest = ::exitApplication) {
-            Text("Hello, World!")
-        }
-    }
-}
-
-@OptIn(DelicateCoroutinesApi::class)
-fun autoClose() = GlobalScope.launchApplication {
-    var isOpen by remember { mutableStateOf(true) }
-
-    LaunchedEffect(Unit) {
-        delay(2000)
-        isOpen = false
-    }
-
-    if (isOpen) {
-        Window(onCloseRequest = {}) {
-            Text("This window will be closed in 2 seconds")
-        }
-    }
-}
-
-@OptIn(DelicateCoroutinesApi::class)
-fun openSecondWindow() = GlobalScope.launchApplication {
-    var isMainWindowOpen by remember { mutableStateOf(true) }
-    var isSecondWindowOpen by remember { mutableStateOf(false) }
-
-    if (isMainWindowOpen) {
-        Window(onCloseRequest = { isMainWindowOpen = false }) {
-            Row(verticalAlignment = Alignment.CenterVertically) {
-                Checkbox(isSecondWindowOpen, { isSecondWindowOpen = !isSecondWindowOpen })
-                Text("Second window")
-            }
-        }
-    }
-
-    if (isSecondWindowOpen) {
-        Window(onCloseRequest = { isSecondWindowOpen = false }, title = "Nested window") {}
-    }
-}
-
-@OptIn(DelicateCoroutinesApi::class)
-fun closeToTray() = GlobalScope.launchApplication {
-    var isVisible by remember { mutableStateOf(true) }
-
-    Window(
-        onCloseRequest = { isVisible = false },
-        visible = isVisible,
-        title = "Counter",
-    ) {
-        var counter by remember { mutableStateOf(0) }
-        LaunchedEffect(Unit) {
-            while (true) {
-                counter++
+        awaitApplication {
+            LaunchedEffect(Unit) {
+                println("1")
                 delay(1000)
+                println("2")
+                delay(1000)
+                println("3")
             }
         }
-        Text(counter.toString())
+
+        println("After application")
     }
 
-    val icon = remember {
-        runBlocking {
-            loadIcon()
+@OptIn(DelicateCoroutinesApi::class)
+fun splashScreen() =
+    GlobalScope.launchApplication {
+        var isLoading by remember { mutableStateOf(true) }
+
+        LaunchedEffect(Unit) {
+            delay(2000)
+            isLoading = false
+        }
+
+        if (isLoading) {
+            Window(onCloseRequest = ::exitApplication) { Text("Loading") }
+        } else {
+            Window(onCloseRequest = ::exitApplication) { Text("Hello, World!") }
         }
     }
 
-    if (!isVisible) {
-        Tray(
-            icon,
-            tooltip = "Counter",
-            onAction = { isVisible = true },
-            menu = {
-                Item("Exit", onClick = ::exitApplication)
-            },
-        )
+@OptIn(DelicateCoroutinesApi::class)
+fun autoClose() =
+    GlobalScope.launchApplication {
+        var isOpen by remember { mutableStateOf(true) }
+
+        LaunchedEffect(Unit) {
+            delay(2000)
+            isOpen = false
+        }
+
+        if (isOpen) {
+            Window(onCloseRequest = {}) { Text("This window will be closed in 2 seconds") }
+        }
     }
-}
 
 @OptIn(DelicateCoroutinesApi::class)
-fun askToClose() = GlobalScope.launchApplication {
-    var isAskingToClose by remember { mutableStateOf(false) }
+fun openSecondWindow() =
+    GlobalScope.launchApplication {
+        var isMainWindowOpen by remember { mutableStateOf(true) }
+        var isSecondWindowOpen by remember { mutableStateOf(false) }
 
-    Window(onCloseRequest = { isAskingToClose = true }) {
-        Text("Very important document")
-
-        if (isAskingToClose) {
-            Window(onCloseRequest = { isAskingToClose = false }, title = "Are you sure?") {
-                Button(onClick = ::exitApplication) {
-                    Text("Yes!")
+        if (isMainWindowOpen) {
+            Window(onCloseRequest = { isMainWindowOpen = false }) {
+                Row(verticalAlignment = Alignment.CenterVertically) {
+                    Checkbox(isSecondWindowOpen, { isSecondWindowOpen = !isSecondWindowOpen })
+                    Text("Second window")
                 }
             }
         }
-    }
-}
 
-@OptIn(DelicateCoroutinesApi::class)
-fun customWindow() = GlobalScope.launchApplication {
-    var isShowing by remember { mutableStateOf(true) }
-    var titleNum by remember { mutableStateOf(0) }
-
-    LaunchedEffect(Unit) {
-        while (true) {
-            titleNum++
-            delay(1000)
+        if (isSecondWindowOpen) {
+            Window(onCloseRequest = { isSecondWindowOpen = false }, title = "Nested window") {}
         }
     }
 
-    if (isShowing) {
+@OptIn(DelicateCoroutinesApi::class)
+fun closeToTray() =
+    GlobalScope.launchApplication {
+        var isVisible by remember { mutableStateOf(true) }
+
         Window(
-            create = {
-                ComposeWindow().apply {
-                    size = Dimension(200, 200)
-                    addWindowListener(object : WindowAdapter() {
-                        override fun windowClosing(e: WindowEvent) {
-                            isShowing = false
-                        }
-                    })
-                }
-            },
-            dispose = ComposeWindow::dispose,
-            update = {
-                it.title = "title$titleNum"
-            }
-        ) {}
-    }
-}
-
-@OptIn(DelicateCoroutinesApi::class)
-fun dialog() = GlobalScope.launchApplication {
-    var isShowing by remember { mutableStateOf(true) }
-    var isDialogShowing by remember { mutableStateOf(false) }
-
-    if (isShowing) {
-        Window(onCloseRequest = { isShowing = false }) {
-            Button(onClick = { isDialogShowing = true }) {
-                Text("Dialog")
-            }
-
-            if (isDialogShowing) {
-                DialogWindow(onCloseRequest = { isDialogShowing = false }) {
-                    Text("Dialog")
-                }
-            }
-        }
-    }
-}
-
-@OptIn(DelicateCoroutinesApi::class)
-fun hideDialog() = GlobalScope.launchApplication {
-    var isDialogVisible by remember { mutableStateOf(false) }
-
-    Window(onCloseRequest = ::exitApplication) {
-        Button(onClick = { isDialogVisible = true }) {
-            Text("Dialog")
-        }
-
-        DialogWindow(
-            onCloseRequest = { isDialogVisible = false },
-            visible = isDialogVisible
+            onCloseRequest = { isVisible = false },
+            visible = isVisible,
+            title = "Counter",
         ) {
             var counter by remember { mutableStateOf(0) }
             LaunchedEffect(Unit) {
@@ -292,338 +179,420 @@
             }
             Text(counter.toString())
         }
+
+        val icon = remember { runBlocking { loadIcon() } }
+
+        if (!isVisible) {
+            Tray(
+                icon,
+                tooltip = "Counter",
+                onAction = { isVisible = true },
+                menu = { Item("Exit", onClick = ::exitApplication) },
+            )
+        }
     }
-}
 
 @OptIn(DelicateCoroutinesApi::class)
-fun customDialog() = GlobalScope.launchApplication {
-    var isShowing by remember { mutableStateOf(true) }
+fun askToClose() =
+    GlobalScope.launchApplication {
+        var isAskingToClose by remember { mutableStateOf(false) }
 
-    if (isShowing) {
-        FileDialog(
-            onDismissRequest = {
-                isShowing = false
-                println("Result $it")
+        Window(onCloseRequest = { isAskingToClose = true }) {
+            Text("Very important document")
+
+            if (isAskingToClose) {
+                Window(onCloseRequest = { isAskingToClose = false }, title = "Are you sure?") {
+                    Button(onClick = ::exitApplication) { Text("Yes!") }
+                }
             }
-        )
+        }
     }
-}
+
+@OptIn(DelicateCoroutinesApi::class)
+fun customWindow() =
+    GlobalScope.launchApplication {
+        var isShowing by remember { mutableStateOf(true) }
+        var titleNum by remember { mutableStateOf(0) }
+
+        LaunchedEffect(Unit) {
+            while (true) {
+                titleNum++
+                delay(1000)
+            }
+        }
+
+        if (isShowing) {
+            Window(
+                create = {
+                    ComposeWindow().apply {
+                        size = Dimension(200, 200)
+                        addWindowListener(
+                            object : WindowAdapter() {
+                                override fun windowClosing(e: WindowEvent) {
+                                    isShowing = false
+                                }
+                            }
+                        )
+                    }
+                },
+                dispose = ComposeWindow::dispose,
+                update = { it.title = "title$titleNum" }
+            ) {}
+        }
+    }
+
+@OptIn(DelicateCoroutinesApi::class)
+fun dialog() =
+    GlobalScope.launchApplication {
+        var isShowing by remember { mutableStateOf(true) }
+        var isDialogShowing by remember { mutableStateOf(false) }
+
+        if (isShowing) {
+            Window(onCloseRequest = { isShowing = false }) {
+                Button(onClick = { isDialogShowing = true }) { Text("Dialog") }
+
+                if (isDialogShowing) {
+                    DialogWindow(onCloseRequest = { isDialogShowing = false }) { Text("Dialog") }
+                }
+            }
+        }
+    }
+
+@OptIn(DelicateCoroutinesApi::class)
+fun hideDialog() =
+    GlobalScope.launchApplication {
+        var isDialogVisible by remember { mutableStateOf(false) }
+
+        Window(onCloseRequest = ::exitApplication) {
+            Button(onClick = { isDialogVisible = true }) { Text("Dialog") }
+
+            DialogWindow(onCloseRequest = { isDialogVisible = false }, visible = isDialogVisible) {
+                var counter by remember { mutableStateOf(0) }
+                LaunchedEffect(Unit) {
+                    while (true) {
+                        counter++
+                        delay(1000)
+                    }
+                }
+                Text(counter.toString())
+            }
+        }
+    }
+
+@OptIn(DelicateCoroutinesApi::class)
+fun customDialog() =
+    GlobalScope.launchApplication {
+        var isShowing by remember { mutableStateOf(true) }
+
+        if (isShowing) {
+            FileDialog(
+                onDismissRequest = {
+                    isShowing = false
+                    println("Result $it")
+                }
+            )
+        }
+    }
 
 @Composable
-private fun FileDialog(
-    onDismissRequest: (result: String?) -> Unit
-) = AwtWindow(
-    create = {
-        object : FileDialog(null as Frame?, "Choose a file", LOAD) {
-            override fun setVisible(value: Boolean) {
-                super.setVisible(value)
-                if (value) {
-                    onDismissRequest(file)
+private fun FileDialog(onDismissRequest: (result: String?) -> Unit) =
+    AwtWindow(
+        create = {
+            object : FileDialog(null as Frame?, "Choose a file", LOAD) {
+                override fun setVisible(value: Boolean) {
+                    super.setVisible(value)
+                    if (value) {
+                        onDismissRequest(file)
+                    }
                 }
             }
+        },
+        dispose = FileDialog::dispose
+    )
+
+@OptIn(DelicateCoroutinesApi::class)
+fun setIcon() =
+    GlobalScope.launchApplication {
+        var icon: Painter? by remember { mutableStateOf(null) }
+
+        LaunchedEffect(Unit) {
+            delay(1000)
+            icon = loadIcon()
+            delay(1000)
+            icon = null
+            delay(1000)
+            icon = loadIcon()
         }
-    },
-    dispose = FileDialog::dispose
-)
-@OptIn(DelicateCoroutinesApi::class)
-fun setIcon() = GlobalScope.launchApplication {
-    var icon: Painter? by remember { mutableStateOf(null) }
 
-    LaunchedEffect(Unit) {
-        delay(1000)
-        icon = loadIcon()
-        delay(1000)
-        icon = null
-        delay(1000)
-        icon = loadIcon()
+        Window(onCloseRequest = ::exitApplication, icon = icon) {}
     }
 
-    Window(onCloseRequest = ::exitApplication, icon = icon) {}
-}
-
 @OptIn(DelicateCoroutinesApi::class)
-fun setAwtIcon() = GlobalScope.launchApplication {
-    var icon: Painter? by remember { mutableStateOf(null) }
+fun setAwtIcon() =
+    GlobalScope.launchApplication {
+        var icon: Painter? by remember { mutableStateOf(null) }
 
-    LaunchedEffect(Unit) {
-        icon = loadAwtIcon().toPainter()
+        LaunchedEffect(Unit) { icon = loadAwtIcon().toPainter() }
+
+        Window(onCloseRequest = ::exitApplication, icon = icon) {}
     }
 
-    Window(onCloseRequest = ::exitApplication, icon = icon) {}
-}
-
 @Suppress("BlockingMethodInNonBlockingContext")
-private suspend fun loadIcon() = withContext(Dispatchers.IO) {
-    val path = "androidx/compose/desktop/example/star.svg"
-    useResource(path) {
-        loadSvgPainter(it, Density(1f))
+private suspend fun loadIcon() =
+    withContext(Dispatchers.IO) {
+        val path = "androidx/compose/desktop/example/star.svg"
+        useResource(path) { loadSvgPainter(it, Density(1f)) }
     }
-}
 
 @Suppress("BlockingMethodInNonBlockingContext")
-private suspend fun loadAwtIcon() = withContext(Dispatchers.IO) {
-    val path = "androidx/compose/desktop/example/tray.png"
-    useResource(path, ImageIO::read)
-}
+private suspend fun loadAwtIcon() =
+    withContext(Dispatchers.IO) {
+        val path = "androidx/compose/desktop/example/tray.png"
+        useResource(path, ImageIO::read)
+    }
 
 @OptIn(DelicateCoroutinesApi::class)
-fun setParameters() = GlobalScope.launchApplication {
-    val state = rememberWindowState()
-    Window(
-        onCloseRequest = ::exitApplication,
-        state = state, undecorated = true, resizable = false, alwaysOnTop = true
-    ) {
-        Button(onClick = ::exitApplication) {
-            Text("Close")
+fun setParameters() =
+    GlobalScope.launchApplication {
+        val state = rememberWindowState()
+        Window(
+            onCloseRequest = ::exitApplication,
+            state = state,
+            undecorated = true,
+            resizable = false,
+            alwaysOnTop = true
+        ) {
+            Button(onClick = ::exitApplication) { Text("Close") }
         }
     }
-}
 
 @OptIn(DelicateCoroutinesApi::class)
-fun setPosition() = GlobalScope.launchApplication {
-    var isOpen by remember { mutableStateOf(true) }
-    val state = rememberWindowState(position = WindowPosition(0.dp, 0.dp))
+fun setPosition() =
+    GlobalScope.launchApplication {
+        var isOpen by remember { mutableStateOf(true) }
+        val state = rememberWindowState(position = WindowPosition(0.dp, 0.dp))
 
-    if (isOpen) {
-        Window(onCloseRequest = ::exitApplication, state = state) {}
-    }
-
-    Window(onCloseRequest = ::exitApplication) {
-        Column {
-            Text(state.position.toString())
-
-            Button(
-                onClick = {
-                    val position = state.position
-                    if (position is WindowPosition.Absolute) {
-                        state.position = position.copy(x = state.position.x + 10.dp)
-                    }
-                }
-            ) {
-                Text("move")
-            }
-
-            Row(verticalAlignment = Alignment.CenterVertically) {
-                Checkbox(isOpen, { isOpen = !isOpen })
-                Text("isOpen")
-            }
+        if (isOpen) {
+            Window(onCloseRequest = ::exitApplication, state = state) {}
         }
-    }
-}
 
-@OptIn(DelicateCoroutinesApi::class)
-fun initiallyCenteredWindow() = GlobalScope.launchApplication {
-    var isOpen by remember { mutableStateOf(true) }
-    val state = rememberWindowState(position = WindowPosition(Alignment.Center))
+        Window(onCloseRequest = ::exitApplication) {
+            Column {
+                Text(state.position.toString())
 
-    if (isOpen) {
-        Window(onCloseRequest = ::exitApplication, state = state) {}
-    }
-
-    Window(onCloseRequest = ::exitApplication) {
-        Column {
-            Text(state.position.toString())
-
-            Button(
-                onClick = {
-                    val position = state.position
-                    if (position is WindowPosition.Absolute) {
-                        state.position = position.copy(x = state.position.x + 10.dp)
-                    }
-                }
-            ) {
-                Text("move")
-            }
-
-            Row(verticalAlignment = Alignment.CenterVertically) {
-                Checkbox(isOpen, { isOpen = !isOpen })
-                Text("isOpen")
-            }
-        }
-    }
-}
-
-@OptIn(DelicateCoroutinesApi::class)
-fun setSize() = GlobalScope.launchApplication {
-    var isOpen by remember { mutableStateOf(true) }
-    val state = rememberWindowState(size = DpSize(400.dp, 100.dp))
-
-    if (isOpen) {
-        Window(onCloseRequest = ::exitApplication, state = state) {}
-    }
-
-    Window(onCloseRequest = ::exitApplication) {
-        Column {
-            Text(state.size.toString())
-
-            Button(
-                onClick = {
-                    state.size = state.size.copy(width = state.size.width + 10.dp)
-                }
-            ) {
-                Text("resize")
-            }
-
-            Row(verticalAlignment = Alignment.CenterVertically) {
-                Checkbox(isOpen, { isOpen = !isOpen })
-                Text("isOpen")
-            }
-        }
-    }
-}
-
-@OptIn(DelicateCoroutinesApi::class)
-fun setStatus() = GlobalScope.launchApplication {
-    val state = rememberWindowState(placement = WindowPlacement.Maximized)
-
-    Window(onCloseRequest = ::exitApplication, state = state) {
-        Column {
-            Text(state.size.toString())
-
-            Row(verticalAlignment = Alignment.CenterVertically) {
-                Checkbox(
-                    state.placement == WindowPlacement.Fullscreen,
-                    {
-                        state.placement = if (it) {
-                            WindowPlacement.Fullscreen
-                        } else {
-                            WindowPlacement.Floating
+                Button(
+                    onClick = {
+                        val position = state.position
+                        if (position is WindowPosition.Absolute) {
+                            state.position = position.copy(x = state.position.x + 10.dp)
                         }
                     }
-                )
-                Text("isFullscreen")
-            }
+                ) {
+                    Text("move")
+                }
 
-            Row(verticalAlignment = Alignment.CenterVertically) {
-                Checkbox(
-                    state.placement == WindowPlacement.Fullscreen,
-                    {
-                        state.placement = if (it) {
-                            WindowPlacement.Maximized
-                        } else {
-                            WindowPlacement.Floating
-                        }
-                    }
-                )
-                Text("isMaximized")
-            }
-
-            Row(verticalAlignment = Alignment.CenterVertically) {
-                Checkbox(state.isMinimized, { state.isMinimized = !state.isMinimized })
-                Text("isMinimized")
+                Row(verticalAlignment = Alignment.CenterVertically) {
+                    Checkbox(isOpen, { isOpen = !isOpen })
+                    Text("isOpen")
+                }
             }
         }
     }
-}
 
 @OptIn(DelicateCoroutinesApi::class)
-fun hotKeys() = GlobalScope.launchApplication {
-    val state = rememberWindowState()
+fun initiallyCenteredWindow() =
+    GlobalScope.launchApplication {
+        var isOpen by remember { mutableStateOf(true) }
+        val state = rememberWindowState(position = WindowPosition(Alignment.Center))
 
-    Window(
-        onCloseRequest = ::exitApplication,
-        state = state,
-        onPreviewKeyEvent = {
-            when (it.key) {
-                Key.Escape -> {
-                    exitApplication()
-                    true
+        if (isOpen) {
+            Window(onCloseRequest = ::exitApplication, state = state) {}
+        }
+
+        Window(onCloseRequest = ::exitApplication) {
+            Column {
+                Text(state.position.toString())
+
+                Button(
+                    onClick = {
+                        val position = state.position
+                        if (position is WindowPosition.Absolute) {
+                            state.position = position.copy(x = state.position.x + 10.dp)
+                        }
+                    }
+                ) {
+                    Text("move")
                 }
-                else -> false
+
+                Row(verticalAlignment = Alignment.CenterVertically) {
+                    Checkbox(isOpen, { isOpen = !isOpen })
+                    Text("isOpen")
+                }
             }
         }
-    ) {
-        TextField("Text", {})
     }
-}
+
+@OptIn(DelicateCoroutinesApi::class)
+fun setSize() =
+    GlobalScope.launchApplication {
+        var isOpen by remember { mutableStateOf(true) }
+        val state = rememberWindowState(size = DpSize(400.dp, 100.dp))
+
+        if (isOpen) {
+            Window(onCloseRequest = ::exitApplication, state = state) {}
+        }
+
+        Window(onCloseRequest = ::exitApplication) {
+            Column {
+                Text(state.size.toString())
+
+                Button(
+                    onClick = { state.size = state.size.copy(width = state.size.width + 10.dp) }
+                ) {
+                    Text("resize")
+                }
+
+                Row(verticalAlignment = Alignment.CenterVertically) {
+                    Checkbox(isOpen, { isOpen = !isOpen })
+                    Text("isOpen")
+                }
+            }
+        }
+    }
+
+@OptIn(DelicateCoroutinesApi::class)
+fun setStatus() =
+    GlobalScope.launchApplication {
+        val state = rememberWindowState(placement = WindowPlacement.Maximized)
+
+        Window(onCloseRequest = ::exitApplication, state = state) {
+            Column {
+                Text(state.size.toString())
+
+                Row(verticalAlignment = Alignment.CenterVertically) {
+                    Checkbox(
+                        state.placement == WindowPlacement.Fullscreen,
+                        {
+                            state.placement =
+                                if (it) {
+                                    WindowPlacement.Fullscreen
+                                } else {
+                                    WindowPlacement.Floating
+                                }
+                        }
+                    )
+                    Text("isFullscreen")
+                }
+
+                Row(verticalAlignment = Alignment.CenterVertically) {
+                    Checkbox(
+                        state.placement == WindowPlacement.Fullscreen,
+                        {
+                            state.placement =
+                                if (it) {
+                                    WindowPlacement.Maximized
+                                } else {
+                                    WindowPlacement.Floating
+                                }
+                        }
+                    )
+                    Text("isMaximized")
+                }
+
+                Row(verticalAlignment = Alignment.CenterVertically) {
+                    Checkbox(state.isMinimized, { state.isMinimized = !state.isMinimized })
+                    Text("isMinimized")
+                }
+            }
+        }
+    }
+
+@OptIn(DelicateCoroutinesApi::class)
+fun hotKeys() =
+    GlobalScope.launchApplication {
+        val state = rememberWindowState()
+
+        Window(
+            onCloseRequest = ::exitApplication,
+            state = state,
+            onPreviewKeyEvent = {
+                when (it.key) {
+                    Key.Escape -> {
+                        exitApplication()
+                        true
+                    }
+                    else -> false
+                }
+            }
+        ) {
+            TextField("Text", {})
+        }
+    }
 
 fun saveWindowState() {
     // TODO
 }
 
 @OptIn(DelicateCoroutinesApi::class)
-fun menu() = GlobalScope.launchApplication {
-    var isSubmenuShowing by remember { mutableStateOf(false) }
-    val icon = remember {
-        runBlocking {
-            loadIcon()
-        }
-    }
+fun menu() =
+    GlobalScope.launchApplication {
+        var isSubmenuShowing by remember { mutableStateOf(false) }
+        val icon = remember { runBlocking { loadIcon() } }
 
-    Window(
-        onCloseRequest = ::exitApplication
-    ) {
-        MenuBar {
-            Menu("File", mnemonic = 'F') {
-                CheckboxItem(
-                    "Toggle submenu",
-                    isSubmenuShowing,
-                    mnemonic = 'T',
-                    onCheckedChange = {
-                        isSubmenuShowing = it
-                    },
-                    shortcut = KeyShortcut(Key.T, ctrl = true)
-                )
-                if (isSubmenuShowing) {
-                    Menu("Submenu", mnemonic = 'S') {
-                        Item(
+        Window(onCloseRequest = ::exitApplication) {
+            MenuBar {
+                Menu("File", mnemonic = 'F') {
+                    CheckboxItem(
+                        "Toggle submenu",
+                        isSubmenuShowing,
+                        mnemonic = 'T',
+                        onCheckedChange = { isSubmenuShowing = it },
+                        shortcut = KeyShortcut(Key.T, ctrl = true)
+                    )
+                    if (isSubmenuShowing) {
+                        Menu("Submenu", mnemonic = 'S') {
+                            Item("item1", icon = icon, onClick = { println("item1") })
+                            Item("item2", onClick = { println("item2") })
+                        }
+                    }
+
+                    var radioState by remember { mutableStateOf(0) }
+
+                    Menu("RadioButton", mnemonic = 'R') {
+                        RadioButtonItem(
                             "item1",
-                            icon = icon,
-                            onClick = {
-                                println("item1")
-                            }
+                            selected = radioState == 0,
+                            onClick = { radioState = 0 }
                         )
-                        Item(
+                        RadioButtonItem(
                             "item2",
-                            onClick = {
-                                println("item2")
-                            }
+                            selected = radioState == 1,
+                            onClick = { radioState = 1 }
                         )
                     }
+
+                    Separator()
+                    Item("Exit", onClick = this@launchApplication::exitApplication)
                 }
+            }
 
-                var radioState by remember { mutableStateOf(0) }
-
-                Menu("RadioButton", mnemonic = 'R') {
-                    RadioButtonItem(
-                        "item1",
-                        selected = radioState == 0,
-                        onClick = {
-                            radioState = 0
-                        }
-                    )
-                    RadioButtonItem(
-                        "item2",
-                        selected = radioState == 1,
-                        onClick = {
-                            radioState = 1
-                        }
-                    )
-                }
-
-                Separator()
-                Item("Exit", onClick = this@launchApplication::exitApplication)
+            Column {
+                TextField("Consume T Key", {}, Modifier.onKeyEvent { it.key == Key.T })
+                TextField("Don't consume", {})
             }
         }
-
-        Column {
-            TextField("Consume T Key", {}, Modifier.onKeyEvent { it.key == Key.T })
-            TextField("Don't consume", {})
-        }
     }
-}
 
 @OptIn(DelicateCoroutinesApi::class)
-fun trayAndNotifications() = GlobalScope.launchApplication {
-    val state = remember(::AppState)
+fun trayAndNotifications() =
+    GlobalScope.launchApplication {
+        val state = remember(::AppState)
 
-    Window(onCloseRequest = ::exitApplication, state = state.window) {
-        TrayScreen(state)
+        Window(onCloseRequest = ::exitApplication, state = state.window) { TrayScreen(state) }
+
+        Trays(state)
     }
 
-    Trays(state)
-}
-
 private class AppState {
     val window = WindowState()
     val tray = TrayState()
@@ -631,39 +600,29 @@
 }
 
 @Composable
-private fun TrayScreen(state: AppState) = Column(Modifier.padding(12.dp)) {
-    val notification = rememberNotification(
-        title = "Title",
-        message = "Text",
-        Notification.Type.Info
-    )
+private fun TrayScreen(state: AppState) =
+    Column(Modifier.padding(12.dp)) {
+        val notification =
+            rememberNotification(title = "Title", message = "Text", Notification.Type.Info)
 
-    Button(
-        modifier = Modifier.padding(8.dp),
-        onClick = {
-            state.isTray2Visible = !state.isTray2Visible
+        Button(
+            modifier = Modifier.padding(8.dp),
+            onClick = { state.isTray2Visible = !state.isTray2Visible }
+        ) {
+            Text("Toggle middle tray")
         }
-    ) {
-        Text("Toggle middle tray")
-    }
 
-    Button(
-        modifier = Modifier.padding(8.dp),
-        onClick = {
-            state.tray.sendNotification(notification)
+        Button(
+            modifier = Modifier.padding(8.dp),
+            onClick = { state.tray.sendNotification(notification) }
+        ) {
+            Text("Show notification")
         }
-    ) {
-        Text("Show notification")
     }
-}
 
 @Composable
 private fun ApplicationScope.Trays(state: AppState) {
-    val icon = remember {
-        runBlocking {
-            loadIcon()
-        }
-    }
+    val icon = remember { runBlocking { loadIcon() } }
 
     Tray(icon, tooltip = "Tray1")
 
@@ -674,26 +633,13 @@
             tooltip = "Tray2",
             menu = {
                 Menu("Submenu") {
-                    Item(
-                        "item1",
-                        onClick = {
-                            println("item1")
-                        }
-                    )
-                    Item(
-                        "item2",
-                        onClick = {
-                            println("item2")
-                        }
-                    )
+                    Item("item1", onClick = { println("item1") })
+                    Item("item2", onClick = { println("item2") })
                 }
 
                 Separator()
 
-                Item(
-                    "Exit",
-                    onClick = ::exitApplication
-                )
+                Item("Exit", onClick = ::exitApplication)
             }
         )
     }
diff --git a/compose/desktop/desktop/samples/src/jvmMain/kotlin/androidx/compose/desktop/examples/windowapi/Main.jvm.kt b/compose/desktop/desktop/samples/src/jvmMain/kotlin/androidx/compose/desktop/examples/windowapi/Main.jvm.kt
index a2b863f..1e3d6cc 100644
--- a/compose/desktop/desktop/samples/src/jvmMain/kotlin/androidx/compose/desktop/examples/windowapi/Main.jvm.kt
+++ b/compose/desktop/desktop/samples/src/jvmMain/kotlin/androidx/compose/desktop/examples/windowapi/Main.jvm.kt
@@ -66,12 +66,5 @@
 }
 
 @Composable
-private fun Button(
-    text: String = "",
-    onClick: () -> Unit = {}
-) = Button(
-    onClick = onClick,
-    modifier = Modifier.padding(2.dp)
-) {
-    Text(text)
-}
+private fun Button(text: String = "", onClick: () -> Unit = {}) =
+    Button(onClick = onClick, modifier = Modifier.padding(2.dp)) { Text(text) }
diff --git a/compose/desktop/desktop/src/jvmMain/kotlin/androidx/compose/desktop/DesktopTheme.jvm.kt b/compose/desktop/desktop/src/jvmMain/kotlin/androidx/compose/desktop/DesktopTheme.jvm.kt
index e132334..d0220de 100644
--- a/compose/desktop/desktop/src/jvmMain/kotlin/androidx/compose/desktop/DesktopTheme.jvm.kt
+++ b/compose/desktop/desktop/src/jvmMain/kotlin/androidx/compose/desktop/DesktopTheme.jvm.kt
@@ -28,10 +28,11 @@
 
 @Deprecated(
     "Use MaterialTheme",
-    replaceWith = ReplaceWith(
-        "MaterialTheme(colors, typography, shapes, content)",
-        "androidx.compose.material.MaterialTheme"
-    )
+    replaceWith =
+        ReplaceWith(
+            "MaterialTheme(colors, typography, shapes, content)",
+            "androidx.compose.material.MaterialTheme"
+        )
 )
 @Suppress("DEPRECATION")
 @Composable
@@ -40,37 +41,30 @@
     typography: Typography = MaterialTheme.typography,
     shapes: Shapes = MaterialTheme.shapes,
     content: @Composable () -> Unit
-) = MaterialTheme(
-    colors,
-    typography,
-    shapes
-) {
-    DesktopTheme(content = content)
-}
+) = MaterialTheme(colors, typography, shapes) { DesktopTheme(content = content) }
 
 @Deprecated(
     "Use CompositionLocalProvider(LocalScrollbarStyle provides scrollbar)",
-    replaceWith = ReplaceWith(
-        "CompositionLocalProvider(\n" +
-            "    LocalScrollbarStyle provides scrollbar,\n" +
-            "    content = content\n" +
-            ")",
-        "androidx.compose.runtime.CompositionLocalProvider",
-        "androidx.compose.foundation.LocalScrollbarStyle"
-    )
+    replaceWith =
+        ReplaceWith(
+            "CompositionLocalProvider(\n" +
+                "    LocalScrollbarStyle provides scrollbar,\n" +
+                "    content = content\n" +
+                ")",
+            "androidx.compose.runtime.CompositionLocalProvider",
+            "androidx.compose.foundation.LocalScrollbarStyle"
+        )
 )
 @Composable
 fun DesktopTheme(
-    scrollbar: ScrollbarStyle = ScrollbarStyle(
-        minimalHeight = 16.dp,
-        thickness = 8.dp,
-        shape = MaterialTheme.shapes.small,
-        hoverDurationMillis = 300,
-        unhoverColor = MaterialTheme.colors.onSurface.copy(alpha = 0.12f),
-        hoverColor = MaterialTheme.colors.onSurface.copy(alpha = 0.50f)
-    ),
+    scrollbar: ScrollbarStyle =
+        ScrollbarStyle(
+            minimalHeight = 16.dp,
+            thickness = 8.dp,
+            shape = MaterialTheme.shapes.small,
+            hoverDurationMillis = 300,
+            unhoverColor = MaterialTheme.colors.onSurface.copy(alpha = 0.12f),
+            hoverColor = MaterialTheme.colors.onSurface.copy(alpha = 0.50f)
+        ),
     content: @Composable () -> Unit
-) = CompositionLocalProvider(
-    LocalScrollbarStyle provides scrollbar,
-    content = content
-)
+) = CompositionLocalProvider(LocalScrollbarStyle provides scrollbar, content = content)
diff --git a/compose/desktop/desktop/src/jvmTest/kotlin/androidx/compose/desktop/InputsTest.kt b/compose/desktop/desktop/src/jvmTest/kotlin/androidx/compose/desktop/InputsTest.kt
index cc3dfdf..cd7f88c 100644
--- a/compose/desktop/desktop/src/jvmTest/kotlin/androidx/compose/desktop/InputsTest.kt
+++ b/compose/desktop/desktop/src/jvmTest/kotlin/androidx/compose/desktop/InputsTest.kt
@@ -34,8 +34,7 @@
 class InputsTest {
     private val tag = "slider"
 
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
     @Test
     @Ignore("b/293410369")
@@ -49,13 +48,9 @@
                 valueRange = 0f..1f
             )
         }
-        rule.runOnIdle {
-            state.value = 2f
-        }
+        rule.runOnIdle { state.value = 2f }
         rule.onNodeWithTag(tag).assertRangeInfoEquals(ProgressBarRangeInfo(1f, 0f..1f, 0))
-        rule.runOnIdle {
-            state.value = -123145f
-        }
+        rule.runOnIdle { state.value = -123145f }
         rule.onNodeWithTag(tag).assertRangeInfoEquals(ProgressBarRangeInfo(0f, 0f..1f, 0))
     }
 }
diff --git a/compose/desktop/desktop/src/jvmTest/kotlin/androidx/compose/desktop/ParagraphTest.kt b/compose/desktop/desktop/src/jvmTest/kotlin/androidx/compose/desktop/ParagraphTest.kt
index 38fb4b9..9c4eb65 100644
--- a/compose/desktop/desktop/src/jvmTest/kotlin/androidx/compose/desktop/ParagraphTest.kt
+++ b/compose/desktop/desktop/src/jvmTest/kotlin/androidx/compose/desktop/ParagraphTest.kt
@@ -1,18 +1,18 @@
 /*
-* Copyright 2020 The Android Open Source Project
-*
-* Licensed under the Apache License, Version 2.0 (the "License");
-* you may not use this file except in compliance with the License.
-* You may obtain a copy of the License at
-*
-*      http://www.apache.org/licenses/LICENSE-2.0
-*
-* Unless required by applicable law or agreed to in writing, software
-* distributed under the License is distributed on an "AS IS" BASIS,
-* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-* See the License for the specific language governing permissions and
-* limitations under the License.
-*/
+ * Copyright 2020 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
 
 package androidx.compose.desktop
 
@@ -48,8 +48,7 @@
 @RunWith(JUnit4::class)
 @OptIn(InternalTestApi::class)
 class ParagraphTest {
-    @get:Rule
-    val screenshotRule = DesktopScreenshotTestRule("compose/ui/ui-desktop/paragraph")
+    @get:Rule val screenshotRule = DesktopScreenshotTestRule("compose/ui/ui-desktop/paragraph")
 
     private val text1 =
         "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do" +
@@ -70,10 +69,11 @@
             "   }\n" +
             "}"
 
-    val fontFamily = FontFamily(
-        Font("NotoSans-Regular.ttf"),
-        Font("NotoSans-Italic.ttf", style = FontStyle.Italic)
-    )
+    val fontFamily =
+        FontFamily(
+            Font("NotoSans-Regular.ttf"),
+            Font("NotoSans-Italic.ttf", style = FontStyle.Italic)
+        )
 
     // TODO(b/168298835)
     @Ignore
@@ -87,31 +87,30 @@
                     Text(
                         text = "Привет! 你好! Desktop Compose",
                         color = Color.Black,
-                        modifier = Modifier
-                            .background(Color.Blue)
-                            .height(56.dp)
-                            .wrapContentSize(Alignment.Center)
+                        modifier =
+                            Modifier.background(Color.Blue)
+                                .height(56.dp)
+                                .wrapContentSize(Alignment.Center)
                     )
 
                     Text(
-                        text = with(AnnotatedString.Builder("The quick ")) {
-                            pushStyle(SpanStyle(color = Color(0xff964B00)))
-                            append("brown fox")
-                            pop()
-                            append(" 🦊 ate a ")
-                            pushStyle(SpanStyle(fontSize = 30.sp))
-                            append("zesty hamburgerfons")
-                            pop()
-                            append(" 🍔.\nThe 👩‍👩‍👧‍👧 laughed.")
-                            addStyle(SpanStyle(color = Color.Green), 25, 35)
-                            toAnnotatedString()
-                        },
+                        text =
+                            with(AnnotatedString.Builder("The quick ")) {
+                                pushStyle(SpanStyle(color = Color(0xff964B00)))
+                                append("brown fox")
+                                pop()
+                                append(" 🦊 ate a ")
+                                pushStyle(SpanStyle(fontSize = 30.sp))
+                                append("zesty hamburgerfons")
+                                pop()
+                                append(" 🍔.\nThe 👩‍👩‍👧‍👧 laughed.")
+                                addStyle(SpanStyle(color = Color.Green), 25, 35)
+                                toAnnotatedString()
+                            },
                         color = Color.Black
                     )
 
-                    Text(
-                        text = text1
-                    )
+                    Text(text = text1)
 
                     Text(
                         text = text2,
diff --git a/compose/foundation/foundation-layout/benchmark/src/androidTest/java/androidx/compose/foundation/layout/benchmark/BoxWithConstraintsBenchmark.kt b/compose/foundation/foundation-layout/benchmark/src/androidTest/java/androidx/compose/foundation/layout/benchmark/BoxWithConstraintsBenchmark.kt
index df00820..69fda32 100644
--- a/compose/foundation/foundation-layout/benchmark/src/androidTest/java/androidx/compose/foundation/layout/benchmark/BoxWithConstraintsBenchmark.kt
+++ b/compose/foundation/foundation-layout/benchmark/src/androidTest/java/androidx/compose/foundation/layout/benchmark/BoxWithConstraintsBenchmark.kt
@@ -30,17 +30,16 @@
 @LargeTest
 @RunWith(AndroidJUnit4::class)
 /**
- * A suite of benchmarks for [BoxWithConstraints] / subcomposition behavior. In this benchmark
- * we're comparing simple Box vs BoxWithConstraints. We're also checking the performance of
+ * A suite of benchmarks for [BoxWithConstraints] / subcomposition behavior. In this benchmark we're
+ * comparing simple Box vs BoxWithConstraints. We're also checking the performance of
  * [BoxWithConstraints] in the context of an app's layout depending on available space compared to
- * just using a theoretical CompositionLocal that contains screen width.
- * This allows measuring the performance impact of subcomposition on first composition and
- * recomposition of a relatively complex screen.
+ * just using a theoretical CompositionLocal that contains screen width. This allows measuring the
+ * performance impact of subcomposition on first composition and recomposition of a relatively
+ * complex screen.
  */
 class BoxWithConstraintsBenchmark {
 
-    @get:Rule
-    val benchmarkRule = ComposeBenchmarkRule()
+    @get:Rule val benchmarkRule = ComposeBenchmarkRule()
 
     @Test
     fun no_boxwithconstraints_inner_recompose() {
diff --git a/compose/foundation/foundation-layout/benchmark/src/androidTest/java/androidx/compose/foundation/layout/benchmark/BoxWithConstraintsTestCases.kt b/compose/foundation/foundation-layout/benchmark/src/androidTest/java/androidx/compose/foundation/layout/benchmark/BoxWithConstraintsTestCases.kt
index 1d57a22..70f2874 100644
--- a/compose/foundation/foundation-layout/benchmark/src/androidTest/java/androidx/compose/foundation/layout/benchmark/BoxWithConstraintsTestCases.kt
+++ b/compose/foundation/foundation-layout/benchmark/src/androidTest/java/androidx/compose/foundation/layout/benchmark/BoxWithConstraintsTestCases.kt
@@ -55,9 +55,7 @@
 import androidx.compose.ui.unit.dp
 import androidx.compose.ui.unit.sp
 
-/**
- * Test case simulating an app that uses [BoxWithConstraints] to make complex layout changes.
- */
+/** Test case simulating an app that uses [BoxWithConstraints] to make complex layout changes. */
 class BoxWithConstraintsAppTestCase : LayeredComposeTestCase(), ToggleableTestCase {
     private val phoneWidth = 360.dp
     private val tabletWidth = 900.dp
@@ -67,9 +65,7 @@
     @Composable
     override fun MeasuredContent() {
         val width = screenWidth.value
-        Box(Modifier.requiredWidth(width)) {
-            App()
-        }
+        Box(Modifier.requiredWidth(width)) { App() }
     }
 
     @Composable
@@ -86,8 +82,8 @@
 }
 
 /**
- * Test case simulating an app that uses a theoretical screen width CompositionLocal to make
- * complex layout changes.
+ * Test case simulating an app that uses a theoretical screen width CompositionLocal to make complex
+ * layout changes.
  */
 class CompositionLocalAppTestCase : LayeredComposeTestCase(), ToggleableTestCase {
     private val phoneWidth = 360.dp
@@ -101,9 +97,7 @@
     override fun MeasuredContent() {
         val width = screenWidth.value
         CompositionLocalProvider(LocalScreenWidth provides width) {
-            Box(Modifier.requiredWidth(width)) {
-                App()
-            }
+            Box(Modifier.requiredWidth(width)) { App() }
         }
     }
 
@@ -170,25 +164,19 @@
 
 @Composable
 private fun Grid(gridColumns: Int, modifier: Modifier = Modifier) {
-    LazyVerticalGrid(
-        modifier = modifier,
-        columns = GridCells.Fixed(gridColumns)
-    ) {
+    LazyVerticalGrid(modifier = modifier, columns = GridCells.Fixed(gridColumns)) {
         items(100) {
             Text(
                 text = "$it",
                 fontSize = 20.sp,
-                modifier = Modifier
-                    .background(Color.Gray.copy(alpha = (it % 10) / 10f))
-                    .padding(8.dp)
+                modifier =
+                    Modifier.background(Color.Gray.copy(alpha = (it % 10) / 10f)).padding(8.dp)
             )
         }
     }
 }
 
-/**
- * A simpler test case just using normal [Box]
- */
+/** A simpler test case just using normal [Box] */
 class NoWithConstraintsTestCase : ComposeTestCase, ToggleableTestCase {
 
     private lateinit var state: MutableState<Dp>
@@ -207,9 +195,7 @@
     }
 }
 
-/**
- * A simple test case just using normal [BoxWithConstraints]
- */
+/** A simple test case just using normal [BoxWithConstraints] */
 class BoxWithConstraintsTestCase : ComposeTestCase, ToggleableTestCase {
 
     private lateinit var state: MutableState<Dp>
diff --git a/compose/foundation/foundation-layout/benchmark/src/androidTest/java/androidx/compose/foundation/layout/benchmark/ColorLerpBenchmark.kt b/compose/foundation/foundation-layout/benchmark/src/androidTest/java/androidx/compose/foundation/layout/benchmark/ColorLerpBenchmark.kt
index 571ddab..a840d5c 100644
--- a/compose/foundation/foundation-layout/benchmark/src/androidTest/java/androidx/compose/foundation/layout/benchmark/ColorLerpBenchmark.kt
+++ b/compose/foundation/foundation-layout/benchmark/src/androidTest/java/androidx/compose/foundation/layout/benchmark/ColorLerpBenchmark.kt
@@ -29,37 +29,24 @@
 @LargeTest
 @RunWith(AndroidJUnit4::class)
 class ColorLerpBenchmark {
-    @get:Rule
-    val benchmarkRule = BenchmarkRule()
+    @get:Rule val benchmarkRule = BenchmarkRule()
 
     @Test
     fun lerpSrgb() {
-        benchmarkRule.measureRepeated {
-            repeat(1001) {
-                lerp(Color.Blue, Color.White, it / 1000f)
-            }
-        }
+        benchmarkRule.measureRepeated { repeat(1001) { lerp(Color.Blue, Color.White, it / 1000f) } }
     }
 
     @Test
     fun lerpOklab() {
         val blue = Color.Blue.convert(ColorSpaces.Oklab)
         val green = Color.Green.convert(ColorSpaces.Oklab)
-        benchmarkRule.measureRepeated {
-            repeat(1001) {
-                lerp(blue, green, it / 1000f)
-            }
-        }
+        benchmarkRule.measureRepeated { repeat(1001) { lerp(blue, green, it / 1000f) } }
     }
 
     @Test
     fun lerpCieLab() {
         val blue = Color.Blue.convert(ColorSpaces.CieLab)
         val green = Color.Green.convert(ColorSpaces.CieLab)
-        benchmarkRule.measureRepeated {
-            repeat(1001) {
-                lerp(blue, green, it / 1000f)
-            }
-        }
+        benchmarkRule.measureRepeated { repeat(1001) { lerp(blue, green, it / 1000f) } }
     }
 }
diff --git a/compose/foundation/foundation-layout/benchmark/src/androidTest/java/androidx/compose/foundation/layout/benchmark/DeepRowColumnBenchmark.kt b/compose/foundation/foundation-layout/benchmark/src/androidTest/java/androidx/compose/foundation/layout/benchmark/DeepRowColumnBenchmark.kt
index df4f78d..2538879 100644
--- a/compose/foundation/foundation-layout/benchmark/src/androidTest/java/androidx/compose/foundation/layout/benchmark/DeepRowColumnBenchmark.kt
+++ b/compose/foundation/foundation-layout/benchmark/src/androidTest/java/androidx/compose/foundation/layout/benchmark/DeepRowColumnBenchmark.kt
@@ -27,8 +27,8 @@
 import org.junit.runners.Parameterized
 
 /**
- * Benchmark that runs [DeepRowColumnTestCase]. The purpose of this benchmark is to measure
- * compose, measure, and layout performance of Row and Column, which are extremely common layouts.
+ * Benchmark that runs [DeepRowColumnTestCase]. The purpose of this benchmark is to measure compose,
+ * measure, and layout performance of Row and Column, which are extremely common layouts.
  */
 @LargeTest
 @RunWith(Parameterized::class)
@@ -42,17 +42,17 @@
     companion object {
         @JvmStatic
         @Parameterized.Parameters(name = "depth={0}_breadth={1}_weight={2}_align={3}")
-        fun initParameters(): Array<Any> = arrayOf(
-            arrayOf(1, 3, true, false),
-            arrayOf(1, 3, false, true),
-            arrayOf(1, 3, false, false),
-            arrayOf(1, 100, false, false),
-            arrayOf(100, 1, false, false),
-        )
+        fun initParameters(): Array<Any> =
+            arrayOf(
+                arrayOf(1, 3, true, false),
+                arrayOf(1, 3, false, true),
+                arrayOf(1, 3, false, false),
+                arrayOf(1, 100, false, false),
+                arrayOf(100, 1, false, false),
+            )
     }
 
-    @get:Rule
-    val benchmarkRule = ComposeBenchmarkRule()
+    @get:Rule val benchmarkRule = ComposeBenchmarkRule()
 
     private val caseFactory = { DeepRowColumnTestCase(weight, align, depth, breadth) }
 
diff --git a/compose/foundation/foundation-layout/benchmark/src/androidTest/java/androidx/compose/foundation/layout/benchmark/DeepRowColumnTestCase.kt b/compose/foundation/foundation-layout/benchmark/src/androidTest/java/androidx/compose/foundation/layout/benchmark/DeepRowColumnTestCase.kt
index 1cffdda..d95cec6 100644
--- a/compose/foundation/foundation-layout/benchmark/src/androidTest/java/androidx/compose/foundation/layout/benchmark/DeepRowColumnTestCase.kt
+++ b/compose/foundation/foundation-layout/benchmark/src/androidTest/java/androidx/compose/foundation/layout/benchmark/DeepRowColumnTestCase.kt
@@ -39,13 +39,14 @@
  * extremely common layouts. The parameters can be used to change the nature of the hierarchy (wide
  * vs deep, etc.) and stress different situations. The benchmark attempts to use different common
  * arrangements/alignments as well as child modifiers such as weight and alignBy.
+ *
  * @param useWeight If true, weight modifiers will be added to some children in the hierarchy
  * @param useAlign If true, align modifiers will be added to some children in the hierarchy
  * @param depth This is the depth of the resulting hierarchy. Be careful making this number too big
- *  as it will quickly increase the runtime of the benchmark.
+ *   as it will quickly increase the runtime of the benchmark.
  * @param breadth This is the number of direct children each row/column has at each level of the
- *  hierarchy. Be careful making this number too big as it will quickly increase the runtime of the
- *  benchmark.
+ *   hierarchy. Be careful making this number too big as it will quickly increase the runtime of the
+ *   benchmark.
  */
 class DeepRowColumnTestCase(
     private val useWeight: Boolean,
@@ -56,9 +57,7 @@
 
     @Composable
     override fun MeasuredContent() {
-        Row {
-            DeepTree(useWeight, useAlign, depth, breadth)
-        }
+        Row { DeepTree(useWeight, useAlign, depth, breadth) }
     }
 }
 
@@ -69,70 +68,61 @@
 @Composable
 @NonRestartableComposable
 private fun Terminal(style: Int, modifier: Modifier = Modifier) {
-    val background = when (style) {
-        0 -> blueBackground
-        1 -> blackBackground
-        else -> magentaBackground
+    val background =
+        when (style) {
+            0 -> blueBackground
+            1 -> blackBackground
+            else -> magentaBackground
+        }
+    Box(modifier = modifier.fillMaxSize().then(background))
+}
+
+private fun horizArrangementFor(id: Int) =
+    when (id % 2) {
+        0 -> Arrangement.Start
+        1 -> Arrangement.End
+        else -> Arrangement.Center
     }
-    Box(modifier = modifier
-        .fillMaxSize()
-        .then(background))
-}
 
-private fun horizArrangementFor(id: Int) = when (id % 2) {
-    0 -> Arrangement.Start
-    1 -> Arrangement.End
-    else -> Arrangement.Center
-}
+private fun vertArrangementFor(id: Int) =
+    when (id % 2) {
+        0 -> Arrangement.Top
+        1 -> Arrangement.Bottom
+        else -> Arrangement.Center
+    }
 
-private fun vertArrangementFor(id: Int) = when (id % 2) {
-    0 -> Arrangement.Top
-    1 -> Arrangement.Bottom
-    else -> Arrangement.Center
-}
+private fun vertAlignmentFor(id: Int) =
+    when (id % 2) {
+        0 -> Alignment.Top
+        1 -> Alignment.CenterVertically
+        else -> Alignment.Bottom
+    }
 
-private fun vertAlignmentFor(id: Int) = when (id % 2) {
-    0 -> Alignment.Top
-    1 -> Alignment.CenterVertically
-    else -> Alignment.Bottom
-}
-
-private fun horizAlignmentFor(id: Int) = when (id % 2) {
-    0 -> Alignment.Start
-    1 -> Alignment.CenterHorizontally
-    else -> Alignment.End
-}
+private fun horizAlignmentFor(id: Int) =
+    when (id % 2) {
+        0 -> Alignment.Start
+        1 -> Alignment.CenterHorizontally
+        else -> Alignment.End
+    }
 
 private fun ColumnScope.modifierFor(id: Int, useWeight: Boolean, useAlign: Boolean): Modifier {
-    return if (useWeight && id == 0)
-        Modifier.weight(0.5f, true)
-    else if (useAlign && id == 0)
-        Modifier.align(Alignment.CenterHorizontally)
-    else
-        Modifier.fillMaxWidth()
+    return if (useWeight && id == 0) Modifier.weight(0.5f, true)
+    else if (useAlign && id == 0) Modifier.align(Alignment.CenterHorizontally)
+    else Modifier.fillMaxWidth()
 }
 
 private fun ColumnScope.terminalModifierFor(id: Int, useWeight: Boolean): Modifier {
-    return if (useWeight && id == 0)
-        Modifier.weight(0.5f, true)
-    else
-        Modifier
+    return if (useWeight && id == 0) Modifier.weight(0.5f, true) else Modifier
 }
 
 private fun RowScope.modifierFor(id: Int, useWeight: Boolean, useAlign: Boolean): Modifier {
-    return if (useWeight && id == 0)
-        Modifier.weight(0.5f, true)
-    else if (useAlign && id == 0)
-        Modifier.align(Alignment.CenterVertically)
-    else
-        Modifier.fillMaxHeight()
+    return if (useWeight && id == 0) Modifier.weight(0.5f, true)
+    else if (useAlign && id == 0) Modifier.align(Alignment.CenterVertically)
+    else Modifier.fillMaxHeight()
 }
 
 private fun RowScope.terminalModifierFor(id: Int, useWeight: Boolean): Modifier {
-    return if (useWeight && id == 0)
-        Modifier.weight(0.5f, true)
-    else
-        Modifier
+    return if (useWeight && id == 0) Modifier.weight(0.5f, true) else Modifier
 }
 
 @Composable
@@ -155,9 +145,7 @@
                 modifier = terminalModifierFor(id, useWeight),
             )
         } else {
-            repeat(breadth) {
-                DeepTree(useWeight, useAlign, depth - 1, breadth, it)
-            }
+            repeat(breadth) { DeepTree(useWeight, useAlign, depth - 1, breadth, it) }
         }
     }
 }
@@ -182,9 +170,7 @@
                 modifier = terminalModifierFor(id, useWeight),
             )
         } else {
-            repeat(breadth) {
-                DeepTree(useWeight, useAlign, depth - 1, breadth, it)
-            }
+            repeat(breadth) { DeepTree(useWeight, useAlign, depth - 1, breadth, it) }
         }
     }
 }
diff --git a/compose/foundation/foundation-layout/benchmark/src/androidTest/java/androidx/compose/foundation/layout/benchmark/NestedBoxesBenchmark.kt b/compose/foundation/foundation-layout/benchmark/src/androidTest/java/androidx/compose/foundation/layout/benchmark/NestedBoxesBenchmark.kt
index dad019a..67af35c 100644
--- a/compose/foundation/foundation-layout/benchmark/src/androidTest/java/androidx/compose/foundation/layout/benchmark/NestedBoxesBenchmark.kt
+++ b/compose/foundation/foundation-layout/benchmark/src/androidTest/java/androidx/compose/foundation/layout/benchmark/NestedBoxesBenchmark.kt
@@ -27,9 +27,7 @@
 import org.junit.runner.RunWith
 import org.junit.runners.Parameterized
 
-/**
- * Benchmark that runs [NestedBoxesTestCase].
- */
+/** Benchmark that runs [NestedBoxesTestCase]. */
 @LargeTest
 @RunWith(Parameterized::class)
 class NestedBoxesBenchmark(private val depth: Int, private val children: Int) {
@@ -40,8 +38,7 @@
         fun initParameters(): Array<Any> = arrayOf(arrayOf(7, 2), arrayOf(4, 5), arrayOf(100, 1))
     }
 
-    @get:Rule
-    val benchmarkRule = ComposeBenchmarkRule()
+    @get:Rule val benchmarkRule = ComposeBenchmarkRule()
 
     private val checkboxCaseFactory = { NestedBoxesTestCase(depth, children) }
 
diff --git a/compose/foundation/foundation-layout/benchmark/src/androidTest/java/androidx/compose/foundation/layout/benchmark/NestedBoxesTestCase.kt b/compose/foundation/foundation-layout/benchmark/src/androidTest/java/androidx/compose/foundation/layout/benchmark/NestedBoxesTestCase.kt
index 115fbe6..2754f7b 100644
--- a/compose/foundation/foundation-layout/benchmark/src/androidTest/java/androidx/compose/foundation/layout/benchmark/NestedBoxesTestCase.kt
+++ b/compose/foundation/foundation-layout/benchmark/src/androidTest/java/androidx/compose/foundation/layout/benchmark/NestedBoxesTestCase.kt
@@ -20,28 +20,18 @@
 import androidx.compose.runtime.Composable
 import androidx.compose.testutils.LayeredComposeTestCase
 
-/**
- * Test case representing a layout hierarchy of nested boxes.
- */
-class NestedBoxesTestCase(
-    private val depth: Int,
-    private val children: Int
-) : LayeredComposeTestCase() {
+/** Test case representing a layout hierarchy of nested boxes. */
+class NestedBoxesTestCase(private val depth: Int, private val children: Int) :
+    LayeredComposeTestCase() {
 
     @Composable
     override fun MeasuredContent() {
-        Box {
-            Boxes(depth - 1, children)
-        }
+        Box { Boxes(depth - 1, children) }
     }
 
     @Composable
     private fun Boxes(depth: Int, children: Int) {
         if (depth == 0) return
-        repeat(children) {
-            Box {
-                Boxes(depth - 1, children)
-            }
-        }
+        repeat(children) { Box { Boxes(depth - 1, children) } }
     }
 }
diff --git a/compose/foundation/foundation-layout/benchmark/src/androidTest/java/androidx/compose/foundation/layout/benchmark/RectsInColumnBenchmark.kt b/compose/foundation/foundation-layout/benchmark/src/androidTest/java/androidx/compose/foundation/layout/benchmark/RectsInColumnBenchmark.kt
index 02aa96c..7349ef7 100644
--- a/compose/foundation/foundation-layout/benchmark/src/androidTest/java/androidx/compose/foundation/layout/benchmark/RectsInColumnBenchmark.kt
+++ b/compose/foundation/foundation-layout/benchmark/src/androidTest/java/androidx/compose/foundation/layout/benchmark/RectsInColumnBenchmark.kt
@@ -33,9 +33,7 @@
 import org.junit.runner.RunWith
 import org.junit.runners.Parameterized
 
-/**
- * Benchmark that runs [RectsInColumnTestCase].
- */
+/** Benchmark that runs [RectsInColumnTestCase]. */
 @LargeTest
 @RunWith(Parameterized::class)
 class RectsInColumnBenchmark(private val numberOfRectangles: Int) {
@@ -46,8 +44,7 @@
         fun initParameters(): Array<Any> = arrayOf(10, 100)
     }
 
-    @get:Rule
-    val benchmarkRule = ComposeBenchmarkRule()
+    @get:Rule val benchmarkRule = ComposeBenchmarkRule()
 
     private val rectsInColumnCaseFactory = { RectsInColumnTestCase(numberOfRectangles) }
 
diff --git a/compose/foundation/foundation-layout/benchmark/src/androidTest/java/androidx/compose/foundation/layout/benchmark/RectsInColumnTestCase.kt b/compose/foundation/foundation-layout/benchmark/src/androidTest/java/androidx/compose/foundation/layout/benchmark/RectsInColumnTestCase.kt
index 0fbdb92..e0c65d6 100644
--- a/compose/foundation/foundation-layout/benchmark/src/androidTest/java/androidx/compose/foundation/layout/benchmark/RectsInColumnTestCase.kt
+++ b/compose/foundation/foundation-layout/benchmark/src/androidTest/java/androidx/compose/foundation/layout/benchmark/RectsInColumnTestCase.kt
@@ -36,19 +36,14 @@
  *
  * Note: Each rectangle has its own model so changes should always affect only the first one.
  */
-class RectsInColumnTestCase(
-    private val amountOfRectangles: Int
-) : LayeredComposeTestCase(), ToggleableTestCase {
+class RectsInColumnTestCase(private val amountOfRectangles: Int) :
+    LayeredComposeTestCase(), ToggleableTestCase {
 
     private val states = mutableListOf<MutableState<Color>>()
 
     @Composable
     override fun MeasuredContent() {
-        Column {
-            repeat(amountOfRectangles) {
-                ColoredRectWithModel()
-            }
-        }
+        Column { repeat(amountOfRectangles) { ColoredRectWithModel() } }
     }
 
     override fun toggleState() {
diff --git a/compose/foundation/foundation-layout/benchmark/src/androidTest/java/androidx/compose/foundation/layout/benchmark/RectsInFlowColumnBenchmark.kt b/compose/foundation/foundation-layout/benchmark/src/androidTest/java/androidx/compose/foundation/layout/benchmark/RectsInFlowColumnBenchmark.kt
index 2d6f27f..3ee3836 100644
--- a/compose/foundation/foundation-layout/benchmark/src/androidTest/java/androidx/compose/foundation/layout/benchmark/RectsInFlowColumnBenchmark.kt
+++ b/compose/foundation/foundation-layout/benchmark/src/androidTest/java/androidx/compose/foundation/layout/benchmark/RectsInFlowColumnBenchmark.kt
@@ -33,9 +33,7 @@
 import org.junit.runner.RunWith
 import org.junit.runners.Parameterized
 
-/**
- * Benchmark that runs [RectsInFlowColumnTestCase].
- */
+/** Benchmark that runs [RectsInFlowColumnTestCase]. */
 @LargeTest
 @RunWith(Parameterized::class)
 class RectsInFlowColumnBenchmark(private val numberOfRectangles: Int) {
@@ -46,8 +44,7 @@
         fun initParameters(): Array<Any> = arrayOf(10, 100)
     }
 
-    @get:Rule
-    val benchmarkRule = ComposeBenchmarkRule()
+    @get:Rule val benchmarkRule = ComposeBenchmarkRule()
 
     private val rectsInFlowColumnCaseFactory = { RectsInFlowColumnTestCase(numberOfRectangles) }
 
diff --git a/compose/foundation/foundation-layout/benchmark/src/androidTest/java/androidx/compose/foundation/layout/benchmark/RectsInFlowColumnTestCase.kt b/compose/foundation/foundation-layout/benchmark/src/androidTest/java/androidx/compose/foundation/layout/benchmark/RectsInFlowColumnTestCase.kt
index 079516d..299a622 100644
--- a/compose/foundation/foundation-layout/benchmark/src/androidTest/java/androidx/compose/foundation/layout/benchmark/RectsInFlowColumnTestCase.kt
+++ b/compose/foundation/foundation-layout/benchmark/src/androidTest/java/androidx/compose/foundation/layout/benchmark/RectsInFlowColumnTestCase.kt
@@ -38,18 +38,15 @@
  * Note: Each rectangle has its own model so changes should always affect only the first one.
  */
 @OptIn(ExperimentalLayoutApi::class)
-class RectsInFlowColumnTestCase(
-    private val amountOfRectangles: Int
-) : LayeredComposeTestCase(), ToggleableTestCase {
+class RectsInFlowColumnTestCase(private val amountOfRectangles: Int) :
+    LayeredComposeTestCase(), ToggleableTestCase {
 
     private val states = mutableListOf<MutableState<Color>>()
 
     @Composable
     override fun MeasuredContent() {
         FlowColumn(maxItemsInEachColumn = 3) {
-            repeat(amountOfRectangles) {
-                ColoredRectWithModel()
-            }
+            repeat(amountOfRectangles) { ColoredRectWithModel() }
         }
     }
 
@@ -66,9 +63,6 @@
     fun ColoredRectWithModel() {
         val state = remember { mutableStateOf(Color.Black) }
         states.add(state)
-        Box(
-            Modifier
-                .size(100.dp, 50.dp)
-                .background(color = state.value))
+        Box(Modifier.size(100.dp, 50.dp).background(color = state.value))
     }
 }
diff --git a/compose/foundation/foundation-layout/benchmark/src/androidTest/java/androidx/compose/foundation/layout/benchmark/ResizeComposeViewBenchmark.kt b/compose/foundation/foundation-layout/benchmark/src/androidTest/java/androidx/compose/foundation/layout/benchmark/ResizeComposeViewBenchmark.kt
index b2190b2..79f2656 100644
--- a/compose/foundation/foundation-layout/benchmark/src/androidTest/java/androidx/compose/foundation/layout/benchmark/ResizeComposeViewBenchmark.kt
+++ b/compose/foundation/foundation-layout/benchmark/src/androidTest/java/androidx/compose/foundation/layout/benchmark/ResizeComposeViewBenchmark.kt
@@ -48,15 +48,12 @@
 import org.junit.Test
 import org.junit.runner.RunWith
 
-/**
- * Benchmark that runs [RectsInColumnTestCase].
- */
+/** Benchmark that runs [RectsInColumnTestCase]. */
 @LargeTest
 @RunWith(AndroidJUnit4::class)
 class ResizeComposeViewBenchmark {
 
-    @get:Rule
-    val benchmarkRule = ComposeBenchmarkRule()
+    @get:Rule val benchmarkRule = ComposeBenchmarkRule()
 
     private val rectsInColumnCaseFactory = { ComposeViewTestCase() }
 
@@ -92,43 +89,45 @@
                 AndroidView(
                     modifier = Modifier.fillMaxSize(),
                     factory = { context ->
-                        val column = LinearLayout(context).apply {
-                            orientation = LinearLayout.VERTICAL
-                        }
+                        val column =
+                            LinearLayout(context).apply { orientation = LinearLayout.VERTICAL }
                         repeat(10) {
-                            val row = ComposeView(context).apply {
-                                setContent {
-                                    Layout(content = {
-                                        with(LocalDensity.current) {
-                                            repeat(20) {
-                                                Row(Modifier.size(10.toDp())) {
-                                                    repeat(10) {
-                                                        Box(
-                                                            Modifier
-                                                                .width(1.toDp())
-                                                                .fillMaxHeight()
-                                                        )
+                            val row =
+                                ComposeView(context).apply {
+                                    setContent {
+                                        Layout(
+                                            content = {
+                                                with(LocalDensity.current) {
+                                                    repeat(20) {
+                                                        Row(Modifier.size(10.toDp())) {
+                                                            repeat(10) {
+                                                                Box(
+                                                                    Modifier.width(1.toDp())
+                                                                        .fillMaxHeight()
+                                                                )
+                                                            }
+                                                        }
                                                     }
                                                 }
                                             }
-                                        }
-                                    }) { measurables, constraints ->
-                                        val width = constraints.constrainWidth(400)
-                                        val height = constraints.constrainWidth(400)
-                                        layout(width, height) {
-                                            measurables.forEachIndexed { i, m ->
-                                                val p = m.measure(Constraints.fixed(10, 10))
-                                                p.place(i * 10, 0)
+                                        ) { measurables, constraints ->
+                                            val width = constraints.constrainWidth(400)
+                                            val height = constraints.constrainWidth(400)
+                                            layout(width, height) {
+                                                measurables.forEachIndexed { i, m ->
+                                                    val p = m.measure(Constraints.fixed(10, 10))
+                                                    p.place(i * 10, 0)
+                                                }
                                             }
                                         }
                                     }
                                 }
-                            }
-                            val layoutParams = LinearLayout.LayoutParams(
-                                LinearLayout.LayoutParams.MATCH_PARENT,
-                                0,
-                                1f
-                            )
+                            val layoutParams =
+                                LinearLayout.LayoutParams(
+                                    LinearLayout.LayoutParams.MATCH_PARENT,
+                                    0,
+                                    1f
+                                )
                             column.addView(row, layoutParams)
                         }
                         column
diff --git a/compose/foundation/foundation-layout/benchmark/src/androidTest/java/androidx/compose/foundation/layout/benchmark/SimpleColumnWithRowsBenchmark.kt b/compose/foundation/foundation-layout/benchmark/src/androidTest/java/androidx/compose/foundation/layout/benchmark/SimpleColumnWithRowsBenchmark.kt
index 54ea872..47cb20d 100644
--- a/compose/foundation/foundation-layout/benchmark/src/androidTest/java/androidx/compose/foundation/layout/benchmark/SimpleColumnWithRowsBenchmark.kt
+++ b/compose/foundation/foundation-layout/benchmark/src/androidTest/java/androidx/compose/foundation/layout/benchmark/SimpleColumnWithRowsBenchmark.kt
@@ -38,17 +38,18 @@
 class SimpleColumnWithRowsBenchmark(private val numberOfBoxes: Int) {
 
     private val subLayouts = 5
+
     companion object {
         @JvmStatic
         @Parameterized.Parameters(name = "numberOfBoxes={0}")
         fun initParameters(): Array<Int> = arrayOf(10, 100)
     }
 
-    @get:Rule
-    val benchmarkRule = ComposeBenchmarkRule()
+    @get:Rule val benchmarkRule = ComposeBenchmarkRule()
 
-    private val simpleColumnWithRowsFactory =
-        { SimpleColumnWithRowsTestCase(subLayouts, numberOfBoxes) }
+    private val simpleColumnWithRowsFactory = {
+        SimpleColumnWithRowsTestCase(subLayouts, numberOfBoxes)
+    }
 
     @Test
     fun first_compose() {
diff --git a/compose/foundation/foundation-layout/benchmark/src/androidTest/java/androidx/compose/foundation/layout/benchmark/SimpleColumnWithRowsTestCase.kt b/compose/foundation/foundation-layout/benchmark/src/androidTest/java/androidx/compose/foundation/layout/benchmark/SimpleColumnWithRowsTestCase.kt
index 727e76b..b1a09f0 100644
--- a/compose/foundation/foundation-layout/benchmark/src/androidTest/java/androidx/compose/foundation/layout/benchmark/SimpleColumnWithRowsTestCase.kt
+++ b/compose/foundation/foundation-layout/benchmark/src/androidTest/java/androidx/compose/foundation/layout/benchmark/SimpleColumnWithRowsTestCase.kt
@@ -27,10 +27,8 @@
 import androidx.compose.testutils.ToggleableTestCase
 import androidx.compose.ui.Modifier
 
-class SimpleColumnWithRowsTestCase(
-    private val subLayouts: Int,
-    private val numberOfBoxes: Int
-) : LayeredComposeTestCase(), ToggleableTestCase {
+class SimpleColumnWithRowsTestCase(private val subLayouts: Int, private val numberOfBoxes: Int) :
+    LayeredComposeTestCase(), ToggleableTestCase {
 
     private val numberOfSubLayouts = mutableStateOf(subLayouts)
 
@@ -39,9 +37,7 @@
         Column(modifier = Modifier.fillMaxSize()) {
             repeat(numberOfSubLayouts.value) {
                 Row(modifier = Modifier.fillMaxWidth()) {
-                    repeat(numberOfBoxes) {
-                        Box(modifier = Modifier.fillMaxSize())
-                    }
+                    repeat(numberOfBoxes) { Box(modifier = Modifier.fillMaxSize()) }
                 }
             }
         }
diff --git a/compose/foundation/foundation-layout/benchmark/src/androidTest/java/androidx/compose/foundation/layout/benchmark/WeightedColumnWithRowsBenchmark.kt b/compose/foundation/foundation-layout/benchmark/src/androidTest/java/androidx/compose/foundation/layout/benchmark/WeightedColumnWithRowsBenchmark.kt
index 6a8a67b..585ab9d 100644
--- a/compose/foundation/foundation-layout/benchmark/src/androidTest/java/androidx/compose/foundation/layout/benchmark/WeightedColumnWithRowsBenchmark.kt
+++ b/compose/foundation/foundation-layout/benchmark/src/androidTest/java/androidx/compose/foundation/layout/benchmark/WeightedColumnWithRowsBenchmark.kt
@@ -38,17 +38,18 @@
 class WeightedColumnWithRowsBenchmark(private val numberOfBoxes: Int) {
 
     private val subLayouts = 5
+
     companion object {
         @JvmStatic
         @Parameterized.Parameters(name = "numberOfBoxes={0}")
         fun initParameters(): Array<Int> = arrayOf(10, 100)
     }
 
-    @get:Rule
-    val benchmarkRule = ComposeBenchmarkRule()
+    @get:Rule val benchmarkRule = ComposeBenchmarkRule()
 
-    private val simpleColumnWithRowsFactory =
-        { WeightedColumnWithRowsTestCase(subLayouts, numberOfBoxes) }
+    private val simpleColumnWithRowsFactory = {
+        WeightedColumnWithRowsTestCase(subLayouts, numberOfBoxes)
+    }
 
     @Test
     fun first_compose() {
diff --git a/compose/foundation/foundation-layout/benchmark/src/androidTest/java/androidx/compose/foundation/layout/benchmark/WeightedColumnWithRowsTestCase.kt b/compose/foundation/foundation-layout/benchmark/src/androidTest/java/androidx/compose/foundation/layout/benchmark/WeightedColumnWithRowsTestCase.kt
index a9bd699..fdd1ab3 100644
--- a/compose/foundation/foundation-layout/benchmark/src/androidTest/java/androidx/compose/foundation/layout/benchmark/WeightedColumnWithRowsTestCase.kt
+++ b/compose/foundation/foundation-layout/benchmark/src/androidTest/java/androidx/compose/foundation/layout/benchmark/WeightedColumnWithRowsTestCase.kt
@@ -27,10 +27,8 @@
 import androidx.compose.testutils.ToggleableTestCase
 import androidx.compose.ui.Modifier
 
-class WeightedColumnWithRowsTestCase(
-    private val subLayouts: Int,
-    private val numberOfBoxes: Int
-) : LayeredComposeTestCase(), ToggleableTestCase {
+class WeightedColumnWithRowsTestCase(private val subLayouts: Int, private val numberOfBoxes: Int) :
+    LayeredComposeTestCase(), ToggleableTestCase {
 
     private val numberOfSubLayouts = mutableStateOf(subLayouts)
 
@@ -39,14 +37,11 @@
         Column(modifier = Modifier.fillMaxSize()) {
             repeat(numberOfSubLayouts.value) {
                 Row(
-                    modifier = Modifier
-                        .fillMaxWidth()
-                        .weight(1 / numberOfSubLayouts.value.toFloat())
+                    modifier =
+                        Modifier.fillMaxWidth().weight(1 / numberOfSubLayouts.value.toFloat())
                 ) {
                     repeat(numberOfBoxes) {
-                        Box(
-                            modifier = Modifier.weight(1 / numberOfBoxes.toFloat())
-                        )
+                        Box(modifier = Modifier.weight(1 / numberOfBoxes.toFloat()))
                     }
                 }
             }
diff --git a/compose/foundation/foundation-layout/benchmark/src/androidTest/java/androidx/compose/foundation/layout/benchmark/view/AndroidRectsInLinearLayoutBenchmark.kt b/compose/foundation/foundation-layout/benchmark/src/androidTest/java/androidx/compose/foundation/layout/benchmark/view/AndroidRectsInLinearLayoutBenchmark.kt
index 1728bd6..3db412a 100644
--- a/compose/foundation/foundation-layout/benchmark/src/androidTest/java/androidx/compose/foundation/layout/benchmark/view/AndroidRectsInLinearLayoutBenchmark.kt
+++ b/compose/foundation/foundation-layout/benchmark/src/androidTest/java/androidx/compose/foundation/layout/benchmark/view/AndroidRectsInLinearLayoutBenchmark.kt
@@ -29,9 +29,7 @@
 import org.junit.runner.RunWith
 import org.junit.runners.Parameterized
 
-/**
- * Benchmark that runs [AndroidCheckboxesInLinearLayoutTestCase].
- */
+/** Benchmark that runs [AndroidCheckboxesInLinearLayoutTestCase]. */
 @LargeTest
 @RunWith(Parameterized::class)
 class AndroidRectsInLinearLayoutBenchmark(private val numberOfRectangles: Int) {
@@ -42,12 +40,9 @@
         fun initParameters(): Array<Any> = arrayOf(10, 100)
     }
 
-    @get:Rule
-    val benchmarkRule = AndroidBenchmarkRule()
+    @get:Rule val benchmarkRule = AndroidBenchmarkRule()
 
-    private val rectanglesCaseFactory = {
-        AndroidRectsInLinearLayoutTestCase(numberOfRectangles)
-    }
+    private val rectanglesCaseFactory = { AndroidRectsInLinearLayoutTestCase(numberOfRectangles) }
 
     @Test
     fun first_setContent() {
diff --git a/compose/foundation/foundation-layout/benchmark/src/androidTest/java/androidx/compose/foundation/layout/benchmark/view/AndroidRectsInLinearLayoutTestCase.kt b/compose/foundation/foundation-layout/benchmark/src/androidTest/java/androidx/compose/foundation/layout/benchmark/view/AndroidRectsInLinearLayoutTestCase.kt
index 4729e91..85bd8ce 100644
--- a/compose/foundation/foundation-layout/benchmark/src/androidTest/java/androidx/compose/foundation/layout/benchmark/view/AndroidRectsInLinearLayoutTestCase.kt
+++ b/compose/foundation/foundation-layout/benchmark/src/androidTest/java/androidx/compose/foundation/layout/benchmark/view/AndroidRectsInLinearLayoutTestCase.kt
@@ -23,9 +23,7 @@
 import android.widget.LinearLayout
 import androidx.compose.testutils.benchmark.android.AndroidTestCase
 
-/**
- * Version of [CheckboxesInRowsTestCase] using Android views.
- */
+/** Version of [CheckboxesInRowsTestCase] using Android views. */
 class AndroidRectsInLinearLayoutTestCase(private val numberOfRectangles: Int) : AndroidTestCase {
 
     private val rectangles = mutableListOf<View>()
@@ -34,17 +32,19 @@
     override fun getContent(activity: Activity): ViewGroup {
         val column = LinearLayout(activity)
         column.orientation = LinearLayout.VERTICAL
-        column.layoutParams = ViewGroup.LayoutParams(
-            ViewGroup.LayoutParams.MATCH_PARENT,
-            ViewGroup.LayoutParams.WRAP_CONTENT
-        )
+        column.layoutParams =
+            ViewGroup.LayoutParams(
+                ViewGroup.LayoutParams.MATCH_PARENT,
+                ViewGroup.LayoutParams.WRAP_CONTENT
+            )
         repeat(numberOfRectangles) {
             val rectangle = View(activity)
             rectangle.setBackgroundColor(Color.BLUE)
-            rectangle.layoutParams = LinearLayout.LayoutParams(
-                ViewGroup.LayoutParams.WRAP_CONTENT,
-                ViewGroup.LayoutParams.WRAP_CONTENT
-            )
+            rectangle.layoutParams =
+                LinearLayout.LayoutParams(
+                    ViewGroup.LayoutParams.WRAP_CONTENT,
+                    ViewGroup.LayoutParams.WRAP_CONTENT
+                )
 
             column.addView(rectangle)
             rectangles += rectangle
diff --git a/compose/foundation/foundation-layout/benchmark/src/androidTest/java/androidx/compose/foundation/layout/benchmark/view/SimpleLinearLayoutBenchmark.kt b/compose/foundation/foundation-layout/benchmark/src/androidTest/java/androidx/compose/foundation/layout/benchmark/view/SimpleLinearLayoutBenchmark.kt
index 19853cf..8096f29 100644
--- a/compose/foundation/foundation-layout/benchmark/src/androidTest/java/androidx/compose/foundation/layout/benchmark/view/SimpleLinearLayoutBenchmark.kt
+++ b/compose/foundation/foundation-layout/benchmark/src/androidTest/java/androidx/compose/foundation/layout/benchmark/view/SimpleLinearLayoutBenchmark.kt
@@ -36,18 +36,16 @@
 @RunWith(Parameterized::class)
 class SimpleLinearLayoutBenchmark(private val numberOfBoxes: Int) {
     private val subLayouts = 5
+
     companion object {
         @JvmStatic
         @Parameterized.Parameters(name = "numberOfBoxes={0}")
         fun initParameters(): Array<Int> = arrayOf(10, 100)
     }
 
-    @get:Rule
-    val benchmarkRule = AndroidBenchmarkRule()
+    @get:Rule val benchmarkRule = AndroidBenchmarkRule()
 
-    private val linearLayoutCaseFactory = {
-        SimpleLinearLayoutTestCase(subLayouts, numberOfBoxes)
-    }
+    private val linearLayoutCaseFactory = { SimpleLinearLayoutTestCase(subLayouts, numberOfBoxes) }
 
     @Test
     fun first_setContent() {
diff --git a/compose/foundation/foundation-layout/benchmark/src/androidTest/java/androidx/compose/foundation/layout/benchmark/view/SimpleLinearLayoutTestCase.kt b/compose/foundation/foundation-layout/benchmark/src/androidTest/java/androidx/compose/foundation/layout/benchmark/view/SimpleLinearLayoutTestCase.kt
index 94135e6..90c15b3 100644
--- a/compose/foundation/foundation-layout/benchmark/src/androidTest/java/androidx/compose/foundation/layout/benchmark/view/SimpleLinearLayoutTestCase.kt
+++ b/compose/foundation/foundation-layout/benchmark/src/androidTest/java/androidx/compose/foundation/layout/benchmark/view/SimpleLinearLayoutTestCase.kt
@@ -24,37 +24,39 @@
 import androidx.compose.testutils.ToggleableTestCase
 import androidx.compose.testutils.benchmark.android.AndroidTestCase
 
-class SimpleLinearLayoutTestCase(
-    private val subLayouts: Int,
-    private val numberOfBoxes: Int
-) : AndroidTestCase, ToggleableTestCase {
+class SimpleLinearLayoutTestCase(private val subLayouts: Int, private val numberOfBoxes: Int) :
+    AndroidTestCase, ToggleableTestCase {
 
     private val rows = mutableListOf<LinearLayout>()
     private var isToggled = false
     private var linearLayout: LinearLayout? = null
+
     override fun getContent(activity: Activity): ViewGroup {
         val mainLayout = LinearLayout(activity).also { linearLayout = it }
         mainLayout.orientation = LinearLayout.VERTICAL
-        mainLayout.layoutParams = ViewGroup.LayoutParams(
-            ViewGroup.LayoutParams.MATCH_PARENT,
-            ViewGroup.LayoutParams.MATCH_PARENT
-        )
+        mainLayout.layoutParams =
+            ViewGroup.LayoutParams(
+                ViewGroup.LayoutParams.MATCH_PARENT,
+                ViewGroup.LayoutParams.MATCH_PARENT
+            )
 
         repeat(subLayouts) {
             val row = LinearLayout(activity)
             row.orientation = LinearLayout.HORIZONTAL
-            row.layoutParams = ViewGroup.LayoutParams(
-                ViewGroup.LayoutParams.MATCH_PARENT,
-                ViewGroup.LayoutParams.WRAP_CONTENT
-            )
+            row.layoutParams =
+                ViewGroup.LayoutParams(
+                    ViewGroup.LayoutParams.MATCH_PARENT,
+                    ViewGroup.LayoutParams.WRAP_CONTENT
+                )
 
             repeat(numberOfBoxes) {
                 val box = View(activity)
                 box.setBackgroundColor(Color.BLUE)
-                box.layoutParams = LinearLayout.LayoutParams(
-                    ViewGroup.LayoutParams.WRAP_CONTENT,
-                    ViewGroup.LayoutParams.WRAP_CONTENT
-                )
+                box.layoutParams =
+                    LinearLayout.LayoutParams(
+                        ViewGroup.LayoutParams.WRAP_CONTENT,
+                        ViewGroup.LayoutParams.WRAP_CONTENT
+                    )
                 row.addView(box)
             }
             rows += row
diff --git a/compose/foundation/foundation-layout/benchmark/src/androidTest/java/androidx/compose/foundation/layout/benchmark/view/WeightedLinearLayoutBenchmark.kt b/compose/foundation/foundation-layout/benchmark/src/androidTest/java/androidx/compose/foundation/layout/benchmark/view/WeightedLinearLayoutBenchmark.kt
index a0165f7..02b59c4 100644
--- a/compose/foundation/foundation-layout/benchmark/src/androidTest/java/androidx/compose/foundation/layout/benchmark/view/WeightedLinearLayoutBenchmark.kt
+++ b/compose/foundation/foundation-layout/benchmark/src/androidTest/java/androidx/compose/foundation/layout/benchmark/view/WeightedLinearLayoutBenchmark.kt
@@ -37,14 +37,14 @@
 class WeightedLinearLayoutBenchmark(private val numberOfBoxes: Int) {
 
     private val subLayouts = 5
+
     companion object {
         @JvmStatic
         @Parameterized.Parameters(name = "numberOfBoxes={0}")
         fun initParameters(): Array<Int> = arrayOf(10, 100)
     }
 
-    @get:Rule
-    val benchmarkRule = AndroidBenchmarkRule()
+    @get:Rule val benchmarkRule = AndroidBenchmarkRule()
 
     private val linearLayoutCaseFactory = {
         WeightedLinearLayoutTestCase(subLayouts, numberOfBoxes)
diff --git a/compose/foundation/foundation-layout/benchmark/src/androidTest/java/androidx/compose/foundation/layout/benchmark/view/WeightedLinearLayoutTestCase.kt b/compose/foundation/foundation-layout/benchmark/src/androidTest/java/androidx/compose/foundation/layout/benchmark/view/WeightedLinearLayoutTestCase.kt
index ca5f4c3..ba29102 100644
--- a/compose/foundation/foundation-layout/benchmark/src/androidTest/java/androidx/compose/foundation/layout/benchmark/view/WeightedLinearLayoutTestCase.kt
+++ b/compose/foundation/foundation-layout/benchmark/src/androidTest/java/androidx/compose/foundation/layout/benchmark/view/WeightedLinearLayoutTestCase.kt
@@ -24,39 +24,41 @@
 import androidx.compose.testutils.ToggleableTestCase
 import androidx.compose.testutils.benchmark.android.AndroidTestCase
 
-class WeightedLinearLayoutTestCase(
-    private val subLayouts: Int,
-    private val numberOfBoxes: Int
-) : AndroidTestCase, ToggleableTestCase {
+class WeightedLinearLayoutTestCase(private val subLayouts: Int, private val numberOfBoxes: Int) :
+    AndroidTestCase, ToggleableTestCase {
 
     private val rows = mutableListOf<LinearLayout>()
     private var isToggled = false
     private var linearLayout: LinearLayout? = null
+
     override fun getContent(activity: Activity): ViewGroup {
         val mainLayout = LinearLayout(activity).also { linearLayout = it }
         mainLayout.orientation = LinearLayout.VERTICAL
-        mainLayout.layoutParams = ViewGroup.LayoutParams(
-            ViewGroup.LayoutParams.MATCH_PARENT,
-            ViewGroup.LayoutParams.MATCH_PARENT
-        )
+        mainLayout.layoutParams =
+            ViewGroup.LayoutParams(
+                ViewGroup.LayoutParams.MATCH_PARENT,
+                ViewGroup.LayoutParams.MATCH_PARENT
+            )
 
         repeat(subLayouts) {
             val row = LinearLayout(activity)
             row.orientation = LinearLayout.HORIZONTAL
-            row.layoutParams = LinearLayout.LayoutParams(
-                ViewGroup.LayoutParams.MATCH_PARENT,
-                ViewGroup.LayoutParams.WRAP_CONTENT,
-                1 / subLayouts.toFloat()
-            )
+            row.layoutParams =
+                LinearLayout.LayoutParams(
+                    ViewGroup.LayoutParams.MATCH_PARENT,
+                    ViewGroup.LayoutParams.WRAP_CONTENT,
+                    1 / subLayouts.toFloat()
+                )
 
             repeat(numberOfBoxes) {
                 val box = View(activity)
                 box.setBackgroundColor(Color.BLUE)
-                box.layoutParams = LinearLayout.LayoutParams(
-                    ViewGroup.LayoutParams.WRAP_CONTENT,
-                    ViewGroup.LayoutParams.WRAP_CONTENT,
-                    1 / numberOfBoxes.toFloat()
-                )
+                box.layoutParams =
+                    LinearLayout.LayoutParams(
+                        ViewGroup.LayoutParams.WRAP_CONTENT,
+                        ViewGroup.LayoutParams.WRAP_CONTENT,
+                        1 / numberOfBoxes.toFloat()
+                    )
                 row.addView(box)
             }
             rows += row
diff --git a/compose/foundation/foundation-layout/integration-tests/layout-demos/src/main/java/androidx/compose/foundation/layout/demos/LayoutDemos.kt b/compose/foundation/foundation-layout/integration-tests/layout-demos/src/main/java/androidx/compose/foundation/layout/demos/LayoutDemos.kt
index b96504f..e61f026 100644
--- a/compose/foundation/foundation-layout/integration-tests/layout-demos/src/main/java/androidx/compose/foundation/layout/demos/LayoutDemos.kt
+++ b/compose/foundation/foundation-layout/integration-tests/layout-demos/src/main/java/androidx/compose/foundation/layout/demos/LayoutDemos.kt
@@ -19,14 +19,15 @@
 import androidx.compose.integration.demos.common.ComposableDemo
 import androidx.compose.integration.demos.common.DemoCategory
 
-val LayoutDemos = DemoCategory(
-    "Layout",
-    listOf(
-        ComposableDemo("Row and column") { SimpleLayoutDemo() },
-        ComposableDemo("Flow Column") { SimpleFlowColumnDemo() },
-        ComposableDemo("Flow Row") { SimpleFlowRowDemo() },
-        ComposableDemo("Contextual Flow Row") { ContextualFlowRowDemo() },
-        ComposableDemo("Contextual FlowColumn") { ContextualFlowColumnDemo() },
-        ComposableDemo("Rtl support") { RtlDemo() }
+val LayoutDemos =
+    DemoCategory(
+        "Layout",
+        listOf(
+            ComposableDemo("Row and column") { SimpleLayoutDemo() },
+            ComposableDemo("Flow Column") { SimpleFlowColumnDemo() },
+            ComposableDemo("Flow Row") { SimpleFlowRowDemo() },
+            ComposableDemo("Contextual Flow Row") { ContextualFlowRowDemo() },
+            ComposableDemo("Contextual FlowColumn") { ContextualFlowColumnDemo() },
+            ComposableDemo("Rtl support") { RtlDemo() }
+        )
     )
-)
diff --git a/compose/foundation/foundation-layout/integration-tests/layout-demos/src/main/java/androidx/compose/foundation/layout/demos/RtlDemo.kt b/compose/foundation/foundation-layout/integration-tests/layout-demos/src/main/java/androidx/compose/foundation/layout/demos/RtlDemo.kt
index 2b42b77..56df203 100644
--- a/compose/foundation/foundation-layout/integration-tests/layout-demos/src/main/java/androidx/compose/foundation/layout/demos/RtlDemo.kt
+++ b/compose/foundation/foundation-layout/integration-tests/layout-demos/src/main/java/androidx/compose/foundation/layout/demos/RtlDemo.kt
@@ -92,7 +92,7 @@
         Box(modifier = Modifier.padding(12.dp).size(56.dp).background(Color.Yellow)) {
             IconButton( // adds minimumTouchTargetSize
                 modifier = Modifier.padding(horizontal = 12.dp),
-                onClick = { }
+                onClick = {}
             ) {
                 Icon(Icons.Filled.Info, null)
             }
@@ -162,30 +162,23 @@
 @Composable
 private fun TestSiblings() {
     Column {
-        Box(
-            boxSize.background(color = Color.Red).alignBy { p -> p.measuredWidth }
-        ) {}
-        Box(
-            boxSize.background(color = Color.Green).alignBy { p -> p.measuredWidth / 2 }
-        ) {}
-        Box(
-            boxSize.background(color = Color.Blue).alignBy { p -> p.measuredWidth / 4 }
-        ) {}
+        Box(boxSize.background(color = Color.Red).alignBy { p -> p.measuredWidth }) {}
+        Box(boxSize.background(color = Color.Green).alignBy { p -> p.measuredWidth / 2 }) {}
+        Box(boxSize.background(color = Color.Blue).alignBy { p -> p.measuredWidth / 4 }) {}
     }
 }
 
 @Composable
 private fun CustomLayout(rtlSupport: Boolean) {
     Layout(
-        content = @Composable {
-            Box(boxSize.background(color = Color.Red)) {}
-            Box(boxSize.background(color = Color.Green)) {}
-            Box(boxSize.background(color = Color.Blue)) {}
-        }
+        content =
+            @Composable {
+                Box(boxSize.background(color = Color.Red)) {}
+                Box(boxSize.background(color = Color.Green)) {}
+                Box(boxSize.background(color = Color.Blue)) {}
+            }
     ) { measurables, constraints ->
-        val p = measurables.map { e ->
-            e.measure(constraints.copy(minWidth = 0, minHeight = 0))
-        }
+        val p = measurables.map { e -> e.measure(constraints.copy(minWidth = 0, minHeight = 0)) }
         val w = p.fold(0) { sum, e -> sum + e.width }
         val h = p.maxByOrNull { it.height }!!.height
         layout(w, h) {
@@ -206,11 +199,12 @@
 private fun LayoutWithConstraints(text: String) {
     BoxWithConstraints {
         val w = maxWidth / 3
-        val color = if (LocalLayoutDirection.current == LayoutDirection.Ltr) {
-            Color.Red
-        } else {
-            Color.Magenta
-        }
+        val color =
+            if (LocalLayoutDirection.current == LayoutDirection.Ltr) {
+                Color.Red
+            } else {
+                Color.Magenta
+            }
         Box(Modifier.size(w, 20.dp).background(color)) {
             Text(text, Modifier.align(Alignment.Center))
         }
diff --git a/compose/foundation/foundation-layout/samples/src/main/java/androidx/compose/foundation/layout/samples/BoxSample.kt b/compose/foundation/foundation-layout/samples/src/main/java/androidx/compose/foundation/layout/samples/BoxSample.kt
index 70709cb..4f34cad 100644
--- a/compose/foundation/foundation-layout/samples/src/main/java/androidx/compose/foundation/layout/samples/BoxSample.kt
+++ b/compose/foundation/foundation-layout/samples/src/main/java/androidx/compose/foundation/layout/samples/BoxSample.kt
@@ -34,29 +34,11 @@
     Box {
         Box(Modifier.fillMaxSize().background(Color.Cyan))
         Box(
-            Modifier.matchParentSize()
-                .padding(top = 20.dp, bottom = 20.dp)
-                .background(Color.Yellow)
+            Modifier.matchParentSize().padding(top = 20.dp, bottom = 20.dp).background(Color.Yellow)
         )
-        Box(
-            Modifier.matchParentSize()
-                .padding(40.dp)
-                .background(Color.Magenta)
-        )
-        Box(
-            Modifier.align(Alignment.Center)
-                .size(300.dp, 300.dp)
-                .background(Color.Green)
-        )
-        Box(
-            Modifier.align(Alignment.TopStart)
-                .size(150.dp, 150.dp)
-                .background(Color.Red)
-        )
-        Box(
-            Modifier.align(Alignment.BottomEnd)
-                .size(150.dp, 150.dp)
-                .background(Color.Blue)
-        )
+        Box(Modifier.matchParentSize().padding(40.dp).background(Color.Magenta))
+        Box(Modifier.align(Alignment.Center).size(300.dp, 300.dp).background(Color.Green))
+        Box(Modifier.align(Alignment.TopStart).size(150.dp, 150.dp).background(Color.Red))
+        Box(Modifier.align(Alignment.BottomEnd).size(150.dp, 150.dp).background(Color.Blue))
     }
 }
diff --git a/compose/foundation/foundation-layout/samples/src/main/java/androidx/compose/foundation/layout/samples/ColumnSample.kt b/compose/foundation/foundation-layout/samples/src/main/java/androidx/compose/foundation/layout/samples/ColumnSample.kt
index 44f46ec..b78e410 100644
--- a/compose/foundation/foundation-layout/samples/src/main/java/androidx/compose/foundation/layout/samples/ColumnSample.kt
+++ b/compose/foundation/foundation-layout/samples/src/main/java/androidx/compose/foundation/layout/samples/ColumnSample.kt
@@ -44,11 +44,7 @@
         Box(Modifier.width(40.dp).weight(1f).background(Color.Yellow))
         // Has weight and does not fill, the child will occupy at most half of the remaining height.
         // Therefore it will occupy 80.dp (its preferred height) if the assigned height is larger.
-        Box(
-            Modifier.size(40.dp, 80.dp)
-                .weight(1f, fill = false)
-                .background(Color.Green)
-        )
+        Box(Modifier.size(40.dp, 80.dp).weight(1f, fill = false).background(Color.Green))
     }
 }
 
@@ -62,25 +58,15 @@
         Box(Modifier.size(80.dp, 40.dp).background(Color.Magenta))
         // Alignment.Start, the child will be positioned so that its start edge is aligned with
         // the start edge of the horizontal axis.
-        Box(
-            Modifier.size(80.dp, 40.dp)
-                .align(Alignment.Start)
-                .background(Color.Red)
-        )
+        Box(Modifier.size(80.dp, 40.dp).align(Alignment.Start).background(Color.Red))
         // Alignment.Center, the child will be positioned so that its center is in the middle of
         // the horizontal axis.
         Box(
-            Modifier.size(80.dp, 40.dp)
-                .align(Alignment.CenterHorizontally)
-                .background(Color.Yellow)
+            Modifier.size(80.dp, 40.dp).align(Alignment.CenterHorizontally).background(Color.Yellow)
         )
         // Alignment.End, the child will be positioned so that its end edge aligned to the end of
         // the horizontal axis.
-        Box(
-            Modifier.size(80.dp, 40.dp)
-                .align(Alignment.End)
-                .background(Color.Green)
-        )
+        Box(Modifier.size(80.dp, 40.dp).align(Alignment.End).background(Color.Green))
     }
 }
 
@@ -90,21 +76,9 @@
     Column {
         // Center of the first rectangle is aligned to the right edge of the second rectangle and
         // left edge of the third one.
-        Box(
-            Modifier.size(80.dp, 40.dp)
-                .alignBy { it.measuredWidth / 2 }
-                .background(Color.Blue)
-        )
-        Box(
-            Modifier.size(80.dp, 40.dp)
-                .alignBy { it.measuredWidth }
-                .background(Color.Magenta)
-        )
-        Box(
-            Modifier.size(80.dp, 40.dp)
-                .alignBy { 0 }
-                .background(Color.Red)
-        )
+        Box(Modifier.size(80.dp, 40.dp).alignBy { it.measuredWidth / 2 }.background(Color.Blue))
+        Box(Modifier.size(80.dp, 40.dp).alignBy { it.measuredWidth }.background(Color.Magenta))
+        Box(Modifier.size(80.dp, 40.dp).alignBy { 0 }.background(Color.Red))
     }
 }
 
@@ -124,10 +98,7 @@
 
     @Composable
     fun RectangleWithStartEnd(modifier: Modifier = Modifier, color: Color, width: Dp, height: Dp) {
-        Layout(
-            content = { },
-            modifier = modifier.background(color = color)
-        ) { _, constraints ->
+        Layout(content = {}, modifier = modifier.background(color = color)) { _, constraints ->
             val widthPx = max(width.roundToPx(), constraints.minWidth)
             val heightPx = max(height.roundToPx(), constraints.minHeight)
             layout(widthPx, heightPx, mapOf(start to 0, end to widthPx)) {}
@@ -137,11 +108,7 @@
     Column {
         // Center of the first rectangle is aligned to the right edge of the second rectangle and
         // left edge of the third one.
-        Box(
-            Modifier.size(80.dp, 40.dp)
-                .alignBy { it.measuredWidth / 2 }
-                .background(Color.Blue)
-        )
+        Box(Modifier.size(80.dp, 40.dp).alignBy { it.measuredWidth / 2 }.background(Color.Blue))
         RectangleWithStartEnd(
             Modifier.alignBy(end),
             color = Color.Magenta,
diff --git a/compose/foundation/foundation-layout/samples/src/main/java/androidx/compose/foundation/layout/samples/ContextualFlowColumnSample.kt b/compose/foundation/foundation-layout/samples/src/main/java/androidx/compose/foundation/layout/samples/ContextualFlowColumnSample.kt
index ea694e9..6a7c208 100644
--- a/compose/foundation/foundation-layout/samples/src/main/java/androidx/compose/foundation/layout/samples/ContextualFlowColumnSample.kt
+++ b/compose/foundation/foundation-layout/samples/src/main/java/androidx/compose/foundation/layout/samples/ContextualFlowColumnSample.kt
@@ -51,60 +51,57 @@
 @Composable
 fun ContextualFlowColMaxLineDynamicSeeMore() {
     val totalCount = 300
-    var maxLines by remember {
-        mutableStateOf(2)
-    }
+    var maxLines by remember { mutableStateOf(2) }
 
     Text(
-        modifier = Modifier
-            .fillMaxWidth(1f)
-            .padding(20.dp),
-        text = "ContextualFlowColumn (based on Subcompose)" +
-            " is great for Large Items & +N dynamic labels",
+        modifier = Modifier.fillMaxWidth(1f).padding(20.dp),
+        text =
+            "ContextualFlowColumn (based on Subcompose)" +
+                " is great for Large Items & +N dynamic labels",
         fontWeight = FontWeight.Bold
     )
 
-    val moreOrCollapseIndicator = @Composable { scope: ContextualFlowColumnOverflowScope ->
-        val remainingItems = totalCount - scope.shownItemCount
-        DynamicSeeMore(
-            isHorizontal = true,
-            remainingItems = remainingItems
-        ) {
-            if (remainingItems == 0) {
-                maxLines = 2
-            } else {
-                maxLines += 2
+    val moreOrCollapseIndicator =
+        @Composable { scope: ContextualFlowColumnOverflowScope ->
+            val remainingItems = totalCount - scope.shownItemCount
+            DynamicSeeMore(isHorizontal = true, remainingItems = remainingItems) {
+                if (remainingItems == 0) {
+                    maxLines = 2
+                } else {
+                    maxLines += 2
+                }
             }
         }
-    }
     ContextualFlowColumn(
-        modifier = Modifier
-            .fillMaxWidth(1f)
-            .horizontalScroll(rememberScrollState())
-            .padding(20.dp)
-            .height(200.dp)
-            .wrapContentHeight(align = Alignment.Top),
+        modifier =
+            Modifier.fillMaxWidth(1f)
+                .horizontalScroll(rememberScrollState())
+                .padding(20.dp)
+                .height(200.dp)
+                .wrapContentHeight(align = Alignment.Top),
         verticalArrangement = Arrangement.spacedBy(10.dp),
         horizontalArrangement = Arrangement.spacedBy(20.dp),
         maxLines = maxLines,
-        overflow = ContextualFlowColumnOverflow.expandOrCollapseIndicator(
-            minColumnsToShowCollapse = 4,
-            expandIndicator = moreOrCollapseIndicator,
-            collapseIndicator = moreOrCollapseIndicator
-        ),
+        overflow =
+            ContextualFlowColumnOverflow.expandOrCollapseIndicator(
+                minColumnsToShowCollapse = 4,
+                expandIndicator = moreOrCollapseIndicator,
+                collapseIndicator = moreOrCollapseIndicator
+            ),
         itemCount = totalCount
     ) { index ->
         Box(
-            modifier = Modifier
-                .align(Alignment.CenterHorizontally)
-                .height(50.dp)
-                .width(50.dp)
-                .background(Color.Green)
+            modifier =
+                Modifier.align(Alignment.CenterHorizontally)
+                    .height(50.dp)
+                    .width(50.dp)
+                    .background(Color.Green)
         ) {
-            Text(text = index.toString(), fontSize = 18.sp, modifier =
-            Modifier
-                .padding(3.dp)
-                .align(Alignment.Center))
+            Text(
+                text = index.toString(),
+                fontSize = 18.sp,
+                modifier = Modifier.padding(3.dp).align(Alignment.Center)
+            )
         }
     }
 }
@@ -115,10 +112,7 @@
 fun ContextualFlowColumn_ItemPosition() {
     Text("Ln: Line No\nPs: Position No. in Line", modifier = Modifier.padding(20.dp))
     ContextualFlowColumn(
-        modifier = Modifier
-            .fillMaxHeight(1f)
-            .width(210.dp)
-            .padding(20.dp),
+        modifier = Modifier.fillMaxHeight(1f).width(210.dp).padding(20.dp),
         horizontalArrangement = Arrangement.spacedBy(10.dp),
         verticalArrangement = Arrangement.spacedBy(20.dp),
         maxItemsInEachColumn = 4,
@@ -127,14 +121,14 @@
         val width = 50.dp.coerceAtMost(maxWidth)
         val height = Random.nextInt(80, 100).dp.coerceAtMost(maxHeightInLine)
         Box(
-            Modifier
-                .width(width)
+            Modifier.width(width)
                 .height(height)
                 .background(MatchingColors.getByIndex(indexInLine)!!.color)
         ) {
             Text(
-                text = "Ln: ${this@ContextualFlowColumn.lineIndex}" +
-                    "\nPs: ${this@ContextualFlowColumn.indexInLine}",
+                text =
+                    "Ln: ${this@ContextualFlowColumn.lineIndex}" +
+                        "\nPs: ${this@ContextualFlowColumn.indexInLine}",
                 fontSize = 18.sp,
                 modifier = Modifier.padding(3.dp)
             )
diff --git a/compose/foundation/foundation-layout/samples/src/main/java/androidx/compose/foundation/layout/samples/ContextualFlowRowSample.kt b/compose/foundation/foundation-layout/samples/src/main/java/androidx/compose/foundation/layout/samples/ContextualFlowRowSample.kt
index 28bd857..f0eda4d 100644
--- a/compose/foundation/foundation-layout/samples/src/main/java/androidx/compose/foundation/layout/samples/ContextualFlowRowSample.kt
+++ b/compose/foundation/foundation-layout/samples/src/main/java/androidx/compose/foundation/layout/samples/ContextualFlowRowSample.kt
@@ -50,57 +50,52 @@
 @Composable
 fun ContextualFlowRowMaxLineDynamicSeeMore() {
     val totalCount = 300
-    var maxLines by remember {
-        mutableStateOf(2)
-    }
+    var maxLines by remember { mutableStateOf(2) }
 
-    Text(modifier = Modifier
-        .fillMaxWidth(1f)
-        .padding(20.dp)
-        .wrapContentHeight(align = Alignment.Top),
-        text = "ContextualFlowRow (based on Subcompose)" +
-            " is great for Large Items & +N dynamic labels",
+    Text(
+        modifier =
+            Modifier.fillMaxWidth(1f).padding(20.dp).wrapContentHeight(align = Alignment.Top),
+        text =
+            "ContextualFlowRow (based on Subcompose)" +
+                " is great for Large Items & +N dynamic labels",
         fontWeight = FontWeight.Bold
     )
-    val moreOrCollapseIndicator = @Composable { scope: ContextualFlowRowOverflowScope ->
-        val remainingItems = totalCount - scope.shownItemCount
-        DynamicSeeMore(
-            isHorizontal = true,
-            remainingItems = remainingItems
-        ) {
-            if (remainingItems == 0) {
-                maxLines = 2
-            } else {
-                maxLines += 5
+    val moreOrCollapseIndicator =
+        @Composable { scope: ContextualFlowRowOverflowScope ->
+            val remainingItems = totalCount - scope.shownItemCount
+            DynamicSeeMore(isHorizontal = true, remainingItems = remainingItems) {
+                if (remainingItems == 0) {
+                    maxLines = 2
+                } else {
+                    maxLines += 5
+                }
             }
         }
-    }
     ContextualFlowRow(
-        modifier = Modifier
-            .fillMaxWidth(1f)
-            .padding(20.dp)
-            .wrapContentHeight(align = Alignment.Top),
+        modifier =
+            Modifier.fillMaxWidth(1f).padding(20.dp).wrapContentHeight(align = Alignment.Top),
         horizontalArrangement = Arrangement.spacedBy(10.dp),
         verticalArrangement = Arrangement.spacedBy(20.dp),
         maxLines = maxLines,
-        overflow = ContextualFlowRowOverflow.expandOrCollapseIndicator(
-            minRowsToShowCollapse = 4,
-            expandIndicator = moreOrCollapseIndicator,
-            collapseIndicator = moreOrCollapseIndicator
-        ),
+        overflow =
+            ContextualFlowRowOverflow.expandOrCollapseIndicator(
+                minRowsToShowCollapse = 4,
+                expandIndicator = moreOrCollapseIndicator,
+                collapseIndicator = moreOrCollapseIndicator
+            ),
         itemCount = totalCount
     ) {
         Box(
-            Modifier
-                .align(Alignment.CenterVertically)
+            Modifier.align(Alignment.CenterVertically)
                 .width(50.dp)
                 .height(50.dp)
                 .background(Color.Green)
         ) {
-            Text(text = it.toString(), fontSize = 18.sp, modifier =
-            Modifier
-                .padding(3.dp)
-                .align(Alignment.Center))
+            Text(
+                text = it.toString(),
+                fontSize = 18.sp,
+                modifier = Modifier.padding(3.dp).align(Alignment.Center)
+            )
         }
     }
 }
@@ -111,10 +106,7 @@
 fun ContextualFlowRow_ItemPosition() {
     Text("Ln: Line No\nPs: Position No. in Line", modifier = Modifier.padding(20.dp))
     ContextualFlowRow(
-        modifier = Modifier
-            .fillMaxWidth(1f)
-            .height(210.dp)
-            .padding(20.dp),
+        modifier = Modifier.fillMaxWidth(1f).height(210.dp).padding(20.dp),
         horizontalArrangement = Arrangement.spacedBy(10.dp),
         verticalArrangement = Arrangement.spacedBy(20.dp),
         maxItemsInEachRow = 4,
@@ -123,14 +115,14 @@
         val width = Random.nextInt(80, 100).dp.coerceAtMost(maxWidthInLine)
         val height = 50.dp.coerceAtMost(maxHeight)
         Box(
-            Modifier
-                .width(width)
+            Modifier.width(width)
                 .height(height)
                 .background(MatchingColors.getByIndex(indexInLine)!!.color)
         ) {
             Text(
-                text = "Ln: ${this@ContextualFlowRow.lineIndex}" +
-                    "\nPs: ${this@ContextualFlowRow.indexInLine}",
+                text =
+                    "Ln: ${this@ContextualFlowRow.lineIndex}" +
+                        "\nPs: ${this@ContextualFlowRow.indexInLine}",
                 fontSize = 18.sp,
                 modifier = Modifier.padding(3.dp)
             )
@@ -152,23 +144,16 @@
 }
 
 @Composable
-internal fun DynamicSeeMore(
-    isHorizontal: Boolean,
-    remainingItems: Int,
-    onClick: () -> Unit
-) {
+internal fun DynamicSeeMore(isHorizontal: Boolean, remainingItems: Int, onClick: () -> Unit) {
     Box(
-        Modifier
-            .clickable(onClick = onClick)
+        Modifier.clickable(onClick = onClick)
             .wrapContentWidth()
             .height(50.dp)
             .background(Color.Green)
     ) {
         val collapseText = if (isHorizontal) "^" else "<"
         Text(
-            modifier = Modifier
-                .align(Alignment.Center)
-                .padding(3.dp),
+            modifier = Modifier.align(Alignment.Center).padding(3.dp),
             text = if (remainingItems == 0) collapseText else "+$remainingItems",
             fontSize = 18.sp
         )
diff --git a/compose/foundation/foundation-layout/samples/src/main/java/androidx/compose/foundation/layout/samples/FlowColumnSample.kt b/compose/foundation/foundation-layout/samples/src/main/java/androidx/compose/foundation/layout/samples/FlowColumnSample.kt
index a0308b7..ca95c71 100644
--- a/compose/foundation/foundation-layout/samples/src/main/java/androidx/compose/foundation/layout/samples/FlowColumnSample.kt
+++ b/compose/foundation/foundation-layout/samples/src/main/java/androidx/compose/foundation/layout/samples/FlowColumnSample.kt
@@ -52,17 +52,15 @@
 @Composable
 fun SimpleFlowColumn() {
 
-    Text(modifier = Modifier
-        .fillMaxWidth(1f)
-        .padding(20.dp)
-        .wrapContentHeight(align = Alignment.Top),
+    Text(
+        modifier =
+            Modifier.fillMaxWidth(1f).padding(20.dp).wrapContentHeight(align = Alignment.Top),
         text = "FlowColumn with weights",
         fontWeight = FontWeight.Bold
     )
 
     FlowColumn(
-        Modifier
-            .padding(20.dp)
+        Modifier.padding(20.dp)
             .fillMaxWidth()
             .padding(20.dp)
             .wrapContentHeight(align = Alignment.Top)
@@ -72,11 +70,9 @@
         verticalArrangement = Arrangement.spacedBy(20.dp),
         maxItemsInEachColumn = 3,
     ) {
-
         repeat(17) { index ->
             Box(
-                Modifier
-                    .align(Alignment.CenterHorizontally)
+                Modifier.align(Alignment.CenterHorizontally)
                     .width(50.dp)
                     .height(50.dp)
                     .weight(1f, true)
@@ -93,45 +89,39 @@
 @Composable
 fun SimpleFlowColumnMaxLinesWithSeeMore() {
     val totalCount = 20
-    var maxLines by remember {
-        mutableStateOf(2)
-    }
+    var maxLines by remember { mutableStateOf(2) }
 
-    Text(modifier = Modifier
-        .fillMaxWidth(1f)
-        .padding(20.dp)
-        .wrapContentHeight(align = Alignment.Top),
+    Text(
+        modifier =
+            Modifier.fillMaxWidth(1f).padding(20.dp).wrapContentHeight(align = Alignment.Top),
         text = "Flow Column with Max Lines and See More",
         fontWeight = FontWeight.Bold
     )
 
     FlowColumn(
-        modifier = Modifier
-            .height(200.dp)
-            .horizontalScroll(rememberScrollState())
-            .padding(20.dp)
-            .wrapContentWidth(align = Alignment.Start),
+        modifier =
+            Modifier.height(200.dp)
+                .horizontalScroll(rememberScrollState())
+                .padding(20.dp)
+                .wrapContentWidth(align = Alignment.Start),
         verticalArrangement = Arrangement.spacedBy(10.dp),
         horizontalArrangement = Arrangement.spacedBy(20.dp),
         maxLines = maxLines,
-        overflow = FlowColumnOverflow.expandIndicator {
-            Ellipsis(text = "...") {
-                maxLines += 2
-            }
-        }
+        overflow = FlowColumnOverflow.expandIndicator { Ellipsis(text = "...") { maxLines += 2 } }
     ) {
         repeat(totalCount) {
             Box(
-                modifier = Modifier
-                    .align(Alignment.CenterHorizontally)
-                    .height(50.dp)
-                    .width(50.dp)
-                    .background(Color.Green)
+                modifier =
+                    Modifier.align(Alignment.CenterHorizontally)
+                        .height(50.dp)
+                        .width(50.dp)
+                        .background(Color.Green)
             ) {
-                Text(text = it.toString(), fontSize = 18.sp, modifier =
-                Modifier
-                    .padding(3.dp)
-                    .align(Alignment.Center))
+                Text(
+                    text = it.toString(),
+                    fontSize = 18.sp,
+                    modifier = Modifier.padding(3.dp).align(Alignment.Center)
+                )
             }
         }
     }
@@ -144,43 +134,35 @@
     var width by remember { mutableStateOf(initialWidth) } // Reversed from height
 
     Text(
-        modifier = Modifier
-            .fillMaxWidth(1f)
-            .padding(20.dp)
-            .wrapContentHeight(align = Alignment.Top),
+        modifier =
+            Modifier.fillMaxWidth(1f).padding(20.dp).wrapContentHeight(align = Alignment.Top),
         text = "FlowColumn with MaxWidth and See More or collapse",
         fontWeight = FontWeight.Bold
     )
 
     FlowColumn(
-        modifier = Modifier
-            .height(200.dp)
-            .padding(20.dp)
-            .horizontalScroll(rememberScrollState())
-            .width(width)
-            .wrapContentWidth(align = Alignment.Start),
+        modifier =
+            Modifier.height(200.dp)
+                .padding(20.dp)
+                .horizontalScroll(rememberScrollState())
+                .width(width)
+                .wrapContentWidth(align = Alignment.Start),
         verticalArrangement = Arrangement.spacedBy(10.dp),
         horizontalArrangement = Arrangement.spacedBy(20.dp),
-        overflow = FlowColumnOverflow.expandOrCollapseIndicator(
-            minWidthToShowCollapse = 200.dp,
-            expandIndicator = {
-                Ellipsis(text = "...") {
-                    width += 200.dp
-                }
-            },
-            collapseIndicator = {
-                Ellipsis(text = "<") {
-                    width = 100.dp
-                }
-            })
+        overflow =
+            FlowColumnOverflow.expandOrCollapseIndicator(
+                minWidthToShowCollapse = 200.dp,
+                expandIndicator = { Ellipsis(text = "...") { width += 200.dp } },
+                collapseIndicator = { Ellipsis(text = "<") { width = 100.dp } }
+            )
     ) {
         repeat(40) {
             Box(
-                modifier = Modifier
-                    .align(Alignment.CenterHorizontally)
-                    .height(50.dp)
-                    .width(50.dp)
-                    .background(Color.Green)
+                modifier =
+                    Modifier.align(Alignment.CenterHorizontally)
+                        .height(50.dp)
+                        .width(50.dp)
+                        .background(Color.Green)
             ) {
                 Text(text = it.toString(), fontSize = 18.sp, modifier = Modifier.padding(3.dp))
             }
@@ -193,54 +175,53 @@
 @Composable
 fun SimpleFlowColumnMaxLinesDynamicSeeMore() {
     val totalCount = 20
-    var maxLines by remember {
-        mutableStateOf(2)
-    }
+    var maxLines by remember { mutableStateOf(2) }
 
     Text(
-        modifier = Modifier
-            .fillMaxWidth(1f)
-            .padding(20.dp)
-            .wrapContentHeight(align = Alignment.Top),
+        modifier =
+            Modifier.fillMaxWidth(1f).padding(20.dp).wrapContentHeight(align = Alignment.Top),
         text = "FlowColumn with MaxLines and +N button",
         fontWeight = FontWeight.Bold
     )
-    val moreOrCollapseIndicator = @Composable { scope: FlowColumnOverflowScope ->
-        DynamicSeeMoreForDrawText(
-            isHorizontal = false,
-            totalCount = totalCount,
-            { scope.shownItemCount },
-            onExpand = { maxLines += 2 },
-            onShrink = { maxLines = 2 }
-        )
-    }
+    val moreOrCollapseIndicator =
+        @Composable { scope: FlowColumnOverflowScope ->
+            DynamicSeeMoreForDrawText(
+                isHorizontal = false,
+                totalCount = totalCount,
+                { scope.shownItemCount },
+                onExpand = { maxLines += 2 },
+                onShrink = { maxLines = 2 }
+            )
+        }
     FlowColumn(
-        modifier = Modifier
-            .height(200.dp)
-            .padding(20.dp)
-            .horizontalScroll(rememberScrollState())
-            .wrapContentWidth(align = Alignment.Start),
+        modifier =
+            Modifier.height(200.dp)
+                .padding(20.dp)
+                .horizontalScroll(rememberScrollState())
+                .wrapContentWidth(align = Alignment.Start),
         verticalArrangement = Arrangement.spacedBy(10.dp),
         horizontalArrangement = Arrangement.spacedBy(20.dp),
         maxLines = maxLines,
-        overflow = FlowColumnOverflow.expandOrCollapseIndicator(
-            minColumnsToShowCollapse = 4,
-            expandIndicator = moreOrCollapseIndicator,
-            collapseIndicator = moreOrCollapseIndicator
-        )
+        overflow =
+            FlowColumnOverflow.expandOrCollapseIndicator(
+                minColumnsToShowCollapse = 4,
+                expandIndicator = moreOrCollapseIndicator,
+                collapseIndicator = moreOrCollapseIndicator
+            )
     ) {
         repeat(totalCount) {
             Box(
-                modifier = Modifier
-                    .align(Alignment.CenterHorizontally)
-                    .height(50.dp)
-                    .width(50.dp)
-                    .background(Color.Green)
+                modifier =
+                    Modifier.align(Alignment.CenterHorizontally)
+                        .height(50.dp)
+                        .width(50.dp)
+                        .background(Color.Green)
             ) {
-                Text(text = it.toString(), fontSize = 18.sp, modifier =
-                Modifier
-                    .padding(3.dp)
-                    .align(Alignment.Center))
+                Text(
+                    text = it.toString(),
+                    fontSize = 18.sp,
+                    modifier = Modifier.padding(3.dp).align(Alignment.Center)
+                )
             }
         }
     }
@@ -251,8 +232,7 @@
 @Composable
 fun SimpleFlowColumn_EqualWidth() {
     FlowColumn(
-        Modifier
-            .padding(20.dp)
+        Modifier.padding(20.dp)
             .wrapContentHeight(align = Alignment.Top)
             .wrapContentWidth(align = Alignment.Start),
         horizontalArrangement = Arrangement.spacedBy(10.dp),
@@ -260,18 +240,9 @@
         maxItemsInEachColumn = 3,
     ) {
         repeat(9) {
-            Box(
-                Modifier
-                    .height(100.dp)
-                    .fillMaxColumnWidth(1f)
-                    .background(Color.Green)
-            ) {
+            Box(Modifier.height(100.dp).fillMaxColumnWidth(1f).background(Color.Green)) {
                 val text = generateRandomString(IntRange(1, 5).random())
-                Text(
-                    text = text,
-                    fontSize = 18.sp,
-                    modifier = Modifier.padding(3.dp)
-                )
+                Text(text = text, fontSize = 18.sp, modifier = Modifier.padding(3.dp))
             }
         }
     }
diff --git a/compose/foundation/foundation-layout/samples/src/main/java/androidx/compose/foundation/layout/samples/FlowRowSample.kt b/compose/foundation/foundation-layout/samples/src/main/java/androidx/compose/foundation/layout/samples/FlowRowSample.kt
index c93b7f6..15f5304 100644
--- a/compose/foundation/foundation-layout/samples/src/main/java/androidx/compose/foundation/layout/samples/FlowRowSample.kt
+++ b/compose/foundation/foundation-layout/samples/src/main/java/androidx/compose/foundation/layout/samples/FlowRowSample.kt
@@ -57,27 +57,22 @@
 @Sampled
 @Composable
 fun SimpleFlowRow() {
-    Text(modifier = Modifier
-        .fillMaxWidth(1f)
-        .padding(20.dp)
-        .wrapContentHeight(align = Alignment.Top),
+    Text(
+        modifier =
+            Modifier.fillMaxWidth(1f).padding(20.dp).wrapContentHeight(align = Alignment.Top),
         text = "Flow Row with weights",
         fontWeight = FontWeight.Bold
     )
 
     FlowRow(
-        Modifier
-            .fillMaxWidth(1f)
-            .padding(20.dp)
-            .wrapContentHeight(align = Alignment.Top),
+        Modifier.fillMaxWidth(1f).padding(20.dp).wrapContentHeight(align = Alignment.Top),
         horizontalArrangement = Arrangement.spacedBy(10.dp),
         verticalArrangement = Arrangement.spacedBy(20.dp),
         maxItemsInEachRow = 3,
     ) {
         repeat(20) {
             Box(
-                Modifier
-                    .align(Alignment.CenterVertically)
+                Modifier.align(Alignment.CenterVertically)
                     .width(50.dp)
                     .height(50.dp)
                     .weight(1f, true)
@@ -94,45 +89,36 @@
 @Composable
 fun SimpleFlowRowMaxLinesWithSeeMore() {
     val totalCount = 20
-    var maxLines by remember {
-        mutableStateOf(2)
-    }
+    var maxLines by remember { mutableStateOf(2) }
 
-    Text(modifier = Modifier
-        .fillMaxWidth(1f)
-        .padding(20.dp)
-        .wrapContentHeight(align = Alignment.Top),
-        text = "Flow Row with total items of 40, " +
-            "with Max Lines of 2 and See More, " +
-            "which when clicked, increases max lines by two",
+    Text(
+        modifier =
+            Modifier.fillMaxWidth(1f).padding(20.dp).wrapContentHeight(align = Alignment.Top),
+        text =
+            "Flow Row with total items of 40, " +
+                "with Max Lines of 2 and See More, " +
+                "which when clicked, increases max lines by two",
         fontWeight = FontWeight.Bold
     )
     FlowRow(
-        Modifier
-            .fillMaxWidth(1f)
-            .padding(20.dp)
-            .wrapContentHeight(align = Alignment.Top),
+        Modifier.fillMaxWidth(1f).padding(20.dp).wrapContentHeight(align = Alignment.Top),
         horizontalArrangement = Arrangement.spacedBy(10.dp),
         verticalArrangement = Arrangement.spacedBy(20.dp),
         maxLines = maxLines,
-        overflow = FlowRowOverflow.expandIndicator {
-            Ellipsis(text = "...") {
-                maxLines += 2
-            }
-        }
+        overflow = FlowRowOverflow.expandIndicator { Ellipsis(text = "...") { maxLines += 2 } }
     ) {
         repeat(totalCount) {
             Box(
-                Modifier
-                    .align(Alignment.CenterVertically)
+                Modifier.align(Alignment.CenterVertically)
                     .width(50.dp)
                     .height(50.dp)
                     .background(Color.Green)
             ) {
-                Text(text = it.toString(), fontSize = 18.sp, modifier =
-                Modifier
-                    .padding(3.dp)
-                    .align(Alignment.Center))
+                Text(
+                    text = it.toString(),
+                    fontSize = 18.sp,
+                    modifier = Modifier.padding(3.dp).align(Alignment.Center)
+                )
             }
         }
     }
@@ -144,41 +130,33 @@
     var initialHeight = 200.dp
     var height by remember { mutableStateOf(initialHeight) }
 
-    Text(modifier = Modifier
-        .fillMaxWidth(1f)
-        .padding(20.dp)
-        .wrapContentHeight(align = Alignment.Top),
-        text = "Flow Row with total items of 40, " +
-            "with Max height of 200.dp and See More/collapse button, " +
-            "which when clicked, increases height by 200.dp",
+    Text(
+        modifier =
+            Modifier.fillMaxWidth(1f).padding(20.dp).wrapContentHeight(align = Alignment.Top),
+        text =
+            "Flow Row with total items of 40, " +
+                "with Max height of 200.dp and See More/collapse button, " +
+                "which when clicked, increases height by 200.dp",
         fontWeight = FontWeight.Bold
     )
 
     FlowRow(
-        Modifier
-            .fillMaxWidth(1f)
+        Modifier.fillMaxWidth(1f)
             .padding(20.dp)
             .height(height)
             .wrapContentHeight(align = Alignment.Top),
         horizontalArrangement = Arrangement.spacedBy(10.dp),
         verticalArrangement = Arrangement.spacedBy(20.dp),
-        overflow = FlowRowOverflow.expandOrCollapseIndicator(
-            minHeightToShowCollapse = 200.dp,
-            expandIndicator = {
-                Ellipsis(text = "...") {
-                    height += 200.dp
-                }
-            },
-            collapseIndicator = {
-                Ellipsis(text = "^") {
-                    height = 100.dp
-                }
-            })
+        overflow =
+            FlowRowOverflow.expandOrCollapseIndicator(
+                minHeightToShowCollapse = 200.dp,
+                expandIndicator = { Ellipsis(text = "...") { height += 200.dp } },
+                collapseIndicator = { Ellipsis(text = "^") { height = 100.dp } }
+            )
     ) {
         repeat(40) {
             Box(
-                Modifier
-                    .align(Alignment.CenterVertically)
+                Modifier.align(Alignment.CenterVertically)
                     .width(50.dp)
                     .height(50.dp)
                     .background(Color.Green)
@@ -194,31 +172,29 @@
 @Composable
 fun SimpleFlowRowMaxLinesDynamicSeeMore() {
     val totalCount = 40
-    var maxLines by remember {
-        mutableStateOf(2)
-    }
+    var maxLines by remember { mutableStateOf(2) }
 
-    Text(modifier = Modifier
-        .fillMaxWidth(1f)
-        .padding(20.dp)
-        .wrapContentHeight(align = Alignment.Top),
-        text = "Flow Row with total items of 40, " +
-            "with Max Lines of 2 and See More/collapse button, " +
-            "which when clicked, increases max lines by two",
+    Text(
+        modifier =
+            Modifier.fillMaxWidth(1f).padding(20.dp).wrapContentHeight(align = Alignment.Top),
+        text =
+            "Flow Row with total items of 40, " +
+                "with Max Lines of 2 and See More/collapse button, " +
+                "which when clicked, increases max lines by two",
         fontWeight = FontWeight.Bold
     )
-    val moreOrLessIndicator = @Composable { scope: FlowRowOverflowScope ->
-        DynamicSeeMoreForDrawText(
-            isHorizontal = true,
-            totalCount = totalCount,
-            { scope.shownItemCount },
-            onExpand = { maxLines += 2 },
-            onShrink = { maxLines = 2 }
-        )
-    }
+    val moreOrLessIndicator =
+        @Composable { scope: FlowRowOverflowScope ->
+            DynamicSeeMoreForDrawText(
+                isHorizontal = true,
+                totalCount = totalCount,
+                { scope.shownItemCount },
+                onExpand = { maxLines += 2 },
+                onShrink = { maxLines = 2 }
+            )
+        }
     FlowRow(
-        Modifier
-            .fillMaxWidth(1f)
+        Modifier.fillMaxWidth(1f)
             .padding(20.dp)
             .wrapContentHeight()
             .padding(20.dp)
@@ -226,24 +202,25 @@
         horizontalArrangement = Arrangement.spacedBy(10.dp),
         verticalArrangement = Arrangement.spacedBy(20.dp),
         maxLines = maxLines,
-        overflow = FlowRowOverflow.expandOrCollapseIndicator(
-            minRowsToShowCollapse = 4,
-            expandIndicator = moreOrLessIndicator,
-            collapseIndicator = moreOrLessIndicator
-        )
+        overflow =
+            FlowRowOverflow.expandOrCollapseIndicator(
+                minRowsToShowCollapse = 4,
+                expandIndicator = moreOrLessIndicator,
+                collapseIndicator = moreOrLessIndicator
+            )
     ) {
         repeat(totalCount) {
             Box(
-                Modifier
-                    .align(Alignment.CenterVertically)
+                Modifier.align(Alignment.CenterVertically)
                     .width(50.dp)
                     .height(50.dp)
                     .background(Color.Green)
             ) {
-                Text(text = it.toString(), fontSize = 18.sp, modifier =
-                Modifier
-                    .padding(3.dp)
-                    .align(Alignment.Center))
+                Text(
+                    text = it.toString(),
+                    fontSize = 18.sp,
+                    modifier = Modifier.padding(3.dp).align(Alignment.Center)
+                )
             }
         }
     }
@@ -258,60 +235,61 @@
     onShrink: () -> Unit,
 ) {
     Box(
-        Modifier
-            .clickable(onClick = {
-                val remainingItems = shownItemCount()?.let { totalCount - it }
-                if (remainingItems == 0) {
-                    onShrink()
-                } else {
-                    onExpand()
+        Modifier.clickable(
+                onClick = {
+                    val remainingItems = shownItemCount()?.let { totalCount - it }
+                    if (remainingItems == 0) {
+                        onShrink()
+                    } else {
+                        onExpand()
+                    }
                 }
-            }
             )
             .width(50.dp)
             .height(50.dp)
             .background(Color.Green)
     ) {
-
         val textMeasurer = rememberTextMeasurer()
         Canvas(
-            Modifier
-                .fillMaxSize()
-                .layout { measurable, constraints ->
-                    // TextLayout can be done any time prior to its use in draw, including in a
-                    // background thread.
-                    // In this sample, text layout is measured in layout modifier. This way the layout
-                    // call can be restarted when async font loading completes due to the fact that
-                    // `.measure` call is executed in `.layout`.
-                    val result = textMeasurer.measure(
+            Modifier.fillMaxSize().layout { measurable, constraints ->
+                // TextLayout can be done any time prior to its use in draw, including in a
+                // background thread.
+                // In this sample, text layout is measured in layout modifier. This way the layout
+                // call can be restarted when async font loading completes due to the fact that
+                // `.measure` call is executed in `.layout`.
+                val result =
+                    textMeasurer.measure(
                         text = "+2000",
                         style = TextStyle(fontSize = 24.sp),
                         constraints = constraints
                     )
-                    val placeable = measurable.measure(
-                        Constraints
-                            (
+                val placeable =
+                    measurable.measure(
+                        Constraints(
                             minWidth = result.size.width,
                             maxWidth = result.size.width,
                             minHeight = result.size.height,
                             maxHeight = result.size.height
                         )
                     )
-                    layout(placeable.width, placeable.height) {
-                        placeable.placeRelative(0, 0)
-                    }
-                }) {
+                layout(placeable.width, placeable.height) { placeable.placeRelative(0, 0) }
+            }
+        ) {
             // This happens during draw phase.
             val collapseText = if (isHorizontal) "^" else "<"
             val remainingItems = shownItemCount()?.let { totalCount - it }
-            var textLayoutResult: TextLayoutResult = textMeasurer.measure(
-                text = if (remainingItems == 0) collapseText else "+$remainingItems",
-                style = TextStyle(fontSize = 18.sp)
-            )
-            drawText(textLayoutResult,
-                topLeft = Offset((size.width - textLayoutResult.size.width) / 2,
-                    (size.height - textLayoutResult.size.height) / 2,
+            var textLayoutResult: TextLayoutResult =
+                textMeasurer.measure(
+                    text = if (remainingItems == 0) collapseText else "+$remainingItems",
+                    style = TextStyle(fontSize = 18.sp)
                 )
+            drawText(
+                textLayoutResult,
+                topLeft =
+                    Offset(
+                        (size.width - textLayoutResult.size.width) / 2,
+                        (size.height - textLayoutResult.size.height) / 2,
+                    )
             )
         }
     }
@@ -319,17 +297,9 @@
 
 @Composable
 internal fun Ellipsis(text: String, onClick: () -> Unit) {
-    Box(
-        Modifier
-            .clickable(onClick = onClick)
-            .width(50.dp)
-            .height(50.dp)
-            .background(Color.Green)
-    ) {
+    Box(Modifier.clickable(onClick = onClick).width(50.dp).height(50.dp).background(Color.Green)) {
         Text(
-            modifier = Modifier
-                .align(Alignment.Center)
-                .padding(3.dp),
+            modifier = Modifier.align(Alignment.Center).padding(3.dp),
             text = text,
             fontSize = 18.sp
         )
@@ -341,27 +311,15 @@
 @Composable
 fun SimpleFlowRow_EqualHeight() {
     FlowRow(
-        Modifier
-            .fillMaxWidth(1f)
-            .padding(20.dp)
-            .wrapContentHeight(align = Alignment.Top),
+        Modifier.fillMaxWidth(1f).padding(20.dp).wrapContentHeight(align = Alignment.Top),
         horizontalArrangement = Arrangement.spacedBy(10.dp),
         verticalArrangement = Arrangement.spacedBy(20.dp),
         maxItemsInEachRow = 3,
     ) {
         repeat(9) {
-            Box(
-                Modifier
-                    .width(100.dp)
-                    .background(Color.Green)
-                    .fillMaxRowHeight(1f)
-            ) {
+            Box(Modifier.width(100.dp).background(Color.Green).fillMaxRowHeight(1f)) {
                 val text = generateRandomString(IntRange(10, 50).random())
-                Text(
-                    text = text,
-                    fontSize = 18.sp,
-                    modifier = Modifier.padding(3.dp)
-                )
+                Text(text = text, fontSize = 18.sp, modifier = Modifier.padding(3.dp))
             }
         }
     }
diff --git a/compose/foundation/foundation-layout/samples/src/main/java/androidx/compose/foundation/layout/samples/IntrinsicSample.kt b/compose/foundation/foundation-layout/samples/src/main/java/androidx/compose/foundation/layout/samples/IntrinsicSample.kt
index aedd289..d6674ff 100644
--- a/compose/foundation/foundation-layout/samples/src/main/java/androidx/compose/foundation/layout/samples/IntrinsicSample.kt
+++ b/compose/foundation/foundation-layout/samples/src/main/java/androidx/compose/foundation/layout/samples/IntrinsicSample.kt
@@ -46,21 +46,9 @@
     // the Box's to use the same width.
     Box {
         Column(Modifier.width(IntrinsicSize.Min).fillMaxHeight()) {
-            Box(
-                modifier = Modifier.fillMaxWidth()
-                    .size(20.dp, 10.dp)
-                    .background(Color.Gray)
-            )
-            Box(
-                modifier = Modifier.fillMaxWidth()
-                    .size(30.dp, 10.dp)
-                    .background(Color.Blue)
-            )
-            Box(
-                modifier = Modifier.fillMaxWidth()
-                    .size(10.dp, 10.dp)
-                    .background(Color.Magenta)
-            )
+            Box(modifier = Modifier.fillMaxWidth().size(20.dp, 10.dp).background(Color.Gray))
+            Box(modifier = Modifier.fillMaxWidth().size(30.dp, 10.dp).background(Color.Blue))
+            Box(modifier = Modifier.fillMaxWidth().size(10.dp, 10.dp).background(Color.Magenta))
         }
     }
 }
@@ -84,8 +72,9 @@
             )
             Box(Modifier.width(1.dp).fillMaxHeight().background(Color.Black))
             Text(
-                text = "This is a much much much much much much much much much much" +
-                    " much much much much much much longer text",
+                text =
+                    "This is a much much much much much much much much much much" +
+                        " much much much much much much longer text",
                 modifier = Modifier.weight(1f).fillMaxHeight()
             )
         }
@@ -105,15 +94,11 @@
 
     Box {
         Column(Modifier.width(IntrinsicSize.Max).fillMaxHeight()) {
-            Box(Modifier.fillMaxWidth().background(Color.Gray)) {
-                Text("Short text")
-            }
+            Box(Modifier.fillMaxWidth().background(Color.Gray)) { Text("Short text") }
             Box(Modifier.fillMaxWidth().background(Color.Blue)) {
                 Text("Extremely long text giving the width of its siblings")
             }
-            Box(Modifier.fillMaxWidth().background(Color.Magenta)) {
-                Text("Medium length text")
-            }
+            Box(Modifier.fillMaxWidth().background(Color.Magenta)) { Text("Medium length text") }
         }
     }
 }
diff --git a/compose/foundation/foundation-layout/samples/src/main/java/androidx/compose/foundation/layout/samples/LayoutOffsetSample.kt b/compose/foundation/foundation-layout/samples/src/main/java/androidx/compose/foundation/layout/samples/LayoutOffsetSample.kt
index 0fb63f2..9b67c30f 100644
--- a/compose/foundation/foundation-layout/samples/src/main/java/androidx/compose/foundation/layout/samples/LayoutOffsetSample.kt
+++ b/compose/foundation/foundation-layout/samples/src/main/java/androidx/compose/foundation/layout/samples/LayoutOffsetSample.kt
@@ -40,9 +40,7 @@
     // right-to-left context, the offset will be (-10.dp, 20.dp).
     Text(
         "Layout offset modifier sample",
-        Modifier.fillMaxSize()
-            .wrapContentSize(Alignment.Center)
-            .offset(10.dp, 20.dp)
+        Modifier.fillMaxSize().wrapContentSize(Alignment.Center).offset(10.dp, 20.dp)
     )
 }
 
@@ -52,9 +50,7 @@
     // This text will be offset (10.dp, 20.dp) from the center of the available space.
     Text(
         "Layout offset modifier sample",
-        Modifier.fillMaxSize()
-            .wrapContentSize(Alignment.Center)
-            .absoluteOffset(10.dp, 20.dp)
+        Modifier.fillMaxSize().wrapContentSize(Alignment.Center).absoluteOffset(10.dp, 20.dp)
     )
 }
 
@@ -66,9 +62,7 @@
     var offset by remember { mutableStateOf(0) }
     Text(
         "Layout offset modifier sample",
-        Modifier
-            .clickable { offset += 10 }
-            .offset { IntOffset(offset, offset) }
+        Modifier.clickable { offset += 10 }.offset { IntOffset(offset, offset) }
     )
 }
 
@@ -79,8 +73,6 @@
     var offset by remember { mutableStateOf(0) }
     Text(
         "Layout offset modifier sample",
-        Modifier
-            .clickable { offset += 10 }
-            .absoluteOffset { IntOffset(offset, offset) }
+        Modifier.clickable { offset += 10 }.absoluteOffset { IntOffset(offset, offset) }
     )
 }
diff --git a/compose/foundation/foundation-layout/samples/src/main/java/androidx/compose/foundation/layout/samples/LayoutPaddingSample.kt b/compose/foundation/foundation-layout/samples/src/main/java/androidx/compose/foundation/layout/samples/LayoutPaddingSample.kt
index 8390c4d..1d2d995 100644
--- a/compose/foundation/foundation-layout/samples/src/main/java/androidx/compose/foundation/layout/samples/LayoutPaddingSample.kt
+++ b/compose/foundation/foundation-layout/samples/src/main/java/androidx/compose/foundation/layout/samples/LayoutPaddingSample.kt
@@ -45,8 +45,7 @@
 fun SymmetricPaddingModifier() {
     Box(Modifier.background(color = Color.Gray)) {
         Box(
-            Modifier
-                .padding(horizontal = 20.dp, vertical = 30.dp)
+            Modifier.padding(horizontal = 20.dp, vertical = 30.dp)
                 .size(50.dp)
                 .background(Color.Blue)
         )
diff --git a/compose/foundation/foundation-layout/samples/src/main/java/androidx/compose/foundation/layout/samples/RowSample.kt b/compose/foundation/foundation-layout/samples/src/main/java/androidx/compose/foundation/layout/samples/RowSample.kt
index a324206..b939243 100644
--- a/compose/foundation/foundation-layout/samples/src/main/java/androidx/compose/foundation/layout/samples/RowSample.kt
+++ b/compose/foundation/foundation-layout/samples/src/main/java/androidx/compose/foundation/layout/samples/RowSample.kt
@@ -41,11 +41,7 @@
         Box(Modifier.height(40.dp).weight(1f).background(Color.Yellow))
         // Has weight and does not fill, the child will occupy at most half of the remaining width.
         // Therefore it will occupy 80.dp (its preferred width) if the assigned width is larger.
-        Box(
-            Modifier.size(80.dp, 40.dp)
-                .weight(1f, fill = false)
-                .background(Color.Green)
-        )
+        Box(Modifier.size(80.dp, 40.dp).weight(1f, fill = false).background(Color.Green))
     }
 }
 
@@ -58,25 +54,13 @@
         Box(Modifier.size(80.dp, 40.dp).background(Color.Magenta))
         // Gravity.Top, the child will be positioned so that its top edge is aligned to the top
         // of the vertical axis.
-        Box(
-            Modifier.size(80.dp, 40.dp)
-                .align(Alignment.Top)
-                .background(Color.Red)
-        )
+        Box(Modifier.size(80.dp, 40.dp).align(Alignment.Top).background(Color.Red))
         // Gravity.Center, the child will be positioned so that its center is in the middle of
         // the vertical axis.
-        Box(
-            Modifier.size(80.dp, 40.dp)
-                .align(Alignment.CenterVertically)
-                .background(Color.Yellow)
-        )
+        Box(Modifier.size(80.dp, 40.dp).align(Alignment.CenterVertically).background(Color.Yellow))
         // Gravity.Bottom, the child will be positioned so that its bottom edge is aligned to the
         // bottom of the vertical axis.
-        Box(
-            Modifier.size(80.dp, 40.dp)
-                .align(Alignment.Bottom)
-                .background(Color.Green)
-        )
+        Box(Modifier.size(80.dp, 40.dp).align(Alignment.Bottom).background(Color.Green))
     }
 }
 
@@ -92,18 +76,16 @@
         // If no other sibling had alignBy() or alignByBaseline(), the modifier would have no
         // effect.
         Box(
-            modifier = Modifier.size(80.dp, 40.dp)
-                .alignBy { it.measuredHeight / 2 }
-                .background(Color.Magenta)
+            modifier =
+                Modifier.size(80.dp, 40.dp)
+                    .alignBy { it.measuredHeight / 2 }
+                    .background(Color.Magenta)
         )
         Text(
             text = "Text 1",
             fontSize = 40.sp,
             modifier = Modifier.alignByBaseline().background(color = Color.Red)
         )
-        Text(
-            text = "Text 2",
-            modifier = Modifier.alignByBaseline().background(color = Color.Cyan)
-        )
+        Text(text = "Text 2", modifier = Modifier.alignByBaseline().background(color = Color.Cyan))
     }
 }
diff --git a/compose/foundation/foundation-layout/samples/src/main/java/androidx/compose/foundation/layout/samples/SizeModifierSample.kt b/compose/foundation/foundation-layout/samples/src/main/java/androidx/compose/foundation/layout/samples/SizeModifierSample.kt
index ac4662d..fcbeaeb 100644
--- a/compose/foundation/foundation-layout/samples/src/main/java/androidx/compose/foundation/layout/samples/SizeModifierSample.kt
+++ b/compose/foundation/foundation-layout/samples/src/main/java/androidx/compose/foundation/layout/samples/SizeModifierSample.kt
@@ -48,12 +48,7 @@
     // The result is a 50.dp x 50.dp red box centered in a 100.dp x 100.dp space.
     // Note that although a previous modifier asked it to be 100.dp x 100.dp, this
     // will not be respected. They would be respected if size was used instead of requiredSize.
-    Box(
-        Modifier
-            .requiredSize(100.dp, 100.dp)
-            .requiredSize(50.dp, 50.dp)
-            .background(Color.Red)
-    )
+    Box(Modifier.requiredSize(100.dp, 100.dp).requiredSize(50.dp, 50.dp).background(Color.Red))
 }
 
 @Sampled
@@ -63,8 +58,7 @@
     // Note that although a previous modifier asked it to be 100.dp width, this
     // will not be respected. They would be respected if width was used instead of requiredWidth.
     Box(
-        Modifier
-            .requiredWidth(100.dp)
+        Modifier.requiredWidth(100.dp)
             .requiredWidth(50.dp)
             .aspectRatio(1f)
             .background(Color.Magenta)
@@ -78,44 +72,32 @@
     // Note that although a previous modifier asked it to be 100.dp height, this
     // will not be respected. They would be respected if height was used instead of requiredHeight.
     Box(
-        Modifier
-            .requiredHeight(100.dp)
-            .requiredHeight(50.dp)
-            .aspectRatio(1f)
-            .background(Color.Blue)
+        Modifier.requiredHeight(100.dp).requiredHeight(50.dp).aspectRatio(1f).background(Color.Blue)
     )
 }
 
 @Sampled
 @Composable
 fun SimpleSizeModifier() {
-    Box {
-        Box(Modifier.size(100.dp, 100.dp).background(Color.Red))
-    }
+    Box { Box(Modifier.size(100.dp, 100.dp).background(Color.Red)) }
 }
 
 @Sampled
 @Composable
 fun SimpleSizeModifierWithDpSize() {
-    Box {
-        Box(Modifier.size(DpSize(100.dp, 100.dp)).background(Color.Red))
-    }
+    Box { Box(Modifier.size(DpSize(100.dp, 100.dp)).background(Color.Red)) }
 }
 
 @Sampled
 @Composable
 fun SimpleWidthModifier() {
-    Box {
-        Box(Modifier.width(100.dp).aspectRatio(1f).background(Color.Magenta))
-    }
+    Box { Box(Modifier.width(100.dp).aspectRatio(1f).background(Color.Magenta)) }
 }
 
 @Sampled
 @Composable
 fun SimpleHeightModifier() {
-    Box {
-        Box(Modifier.height(100.dp).aspectRatio(1f).background(Color.Blue))
-    }
+    Box { Box(Modifier.height(100.dp).aspectRatio(1f).background(Color.Blue)) }
 }
 
 @Sampled
@@ -152,11 +134,7 @@
 fun FillHalfHeightModifier() {
     Box(Modifier.requiredSize(100.dp).background(Color.Red), contentAlignment = Alignment.Center) {
         // The inner Box will be (30.dp x 50.dp).
-        Box(
-            Modifier.requiredWidth(30.dp)
-                .fillMaxHeight(0.5f)
-                .background(color = Color.Magenta)
-        )
+        Box(Modifier.requiredWidth(30.dp).fillMaxHeight(0.5f).background(color = Color.Magenta))
     }
 }
 
@@ -173,11 +151,7 @@
 fun FillHalfSizeModifier() {
     Box(Modifier.requiredSize(100.dp).background(Color.Red), contentAlignment = Alignment.Center) {
         // The inner Box will be (50.dp x 50.dp).
-        Box(
-            Modifier.requiredWidth(30.dp)
-                .fillMaxSize(0.5f)
-                .background(color = Color.Magenta)
-        )
+        Box(Modifier.requiredWidth(30.dp).fillMaxSize(0.5f).background(color = Color.Magenta))
     }
 }
 
@@ -238,10 +212,7 @@
 fun DefaultMinSizeSample() {
     @Composable
     fun DefaultMinBox(modifier: Modifier = Modifier) {
-        Box(
-            modifier.defaultMinSize(minWidth = 100.dp, minHeight = 100.dp)
-                .background(Color.Blue)
-        )
+        Box(modifier.defaultMinSize(minWidth = 100.dp, minHeight = 100.dp).background(Color.Blue))
     }
     // This will be a 100.dp x 100.dp blue box. Because we are not providing any min constraints
     // to the DefaultMinBox, defaultMinSize will apply its min constraints.
diff --git a/compose/foundation/foundation-layout/samples/src/main/java/androidx/compose/foundation/layout/samples/WindowInsetsConnectionSample.kt b/compose/foundation/foundation-layout/samples/src/main/java/androidx/compose/foundation/layout/samples/WindowInsetsConnectionSample.kt
index 8bd86e3..a69e11e 100644
--- a/compose/foundation/foundation-layout/samples/src/main/java/androidx/compose/foundation/layout/samples/WindowInsetsConnectionSample.kt
+++ b/compose/foundation/foundation-layout/samples/src/main/java/androidx/compose/foundation/layout/samples/WindowInsetsConnectionSample.kt
@@ -31,15 +31,13 @@
 @Composable
 fun windowInsetsNestedScrollDemo() {
     LazyColumn(
-        modifier = Modifier
-            .fillMaxSize() // fill the window
-            .imePadding() // pad out the bottom for the IME
-            .imeNestedScroll(), // scroll IME at the bottom
+        modifier =
+            Modifier.fillMaxSize() // fill the window
+                .imePadding() // pad out the bottom for the IME
+                .imeNestedScroll(), // scroll IME at the bottom
         reverseLayout = true // First item is at the bottom
     ) {
         // content
-        items(50) {
-            Text("Hello World")
-        }
+        items(50) { Text("Hello World") }
     }
 }
diff --git a/compose/foundation/foundation-layout/samples/src/main/java/androidx/compose/foundation/layout/samples/WindowInsetsPaddingSample.kt b/compose/foundation/foundation-layout/samples/src/main/java/androidx/compose/foundation/layout/samples/WindowInsetsPaddingSample.kt
index 9e921ed..5c0c570 100644
--- a/compose/foundation/foundation-layout/samples/src/main/java/androidx/compose/foundation/layout/samples/WindowInsetsPaddingSample.kt
+++ b/compose/foundation/foundation-layout/samples/src/main/java/androidx/compose/foundation/layout/samples/WindowInsetsPaddingSample.kt
@@ -96,14 +96,8 @@
             WindowCompat.setDecorFitsSystemWindows(window, false)
             super.onCreate(savedInstanceState)
             setContent {
-                Box(
-                    Modifier
-                        .background(Color.Blue)
-                        .statusBarsPadding()) {
-                    Box(
-                        Modifier
-                            .background(Color.Yellow)
-                            .displayCutoutPadding()) {
+                Box(Modifier.background(Color.Blue).statusBarsPadding()) {
+                    Box(Modifier.background(Color.Yellow).displayCutoutPadding()) {
                         // app content
                     }
                 }
@@ -119,14 +113,8 @@
             WindowCompat.setDecorFitsSystemWindows(window, false)
             super.onCreate(savedInstanceState)
             setContent {
-                Box(
-                    Modifier
-                        .background(Color.Blue)
-                        .statusBarsPadding()) {
-                    Box(
-                        Modifier
-                            .background(Color.Green)
-                            .navigationBarsPadding()) {
+                Box(Modifier.background(Color.Blue).statusBarsPadding()) {
+                    Box(Modifier.background(Color.Green).navigationBarsPadding()) {
                         // app content
                     }
                 }
@@ -142,10 +130,7 @@
             WindowCompat.setDecorFitsSystemWindows(window, false)
             super.onCreate(savedInstanceState)
             setContent {
-                Box(
-                    Modifier
-                        .background(Color.Blue)
-                        .systemBarsPadding()) {
+                Box(Modifier.background(Color.Blue).systemBarsPadding()) {
                     Box(Modifier.imePadding()) {
                         // app content
                     }
@@ -162,15 +147,9 @@
             WindowCompat.setDecorFitsSystemWindows(window, false)
             super.onCreate(savedInstanceState)
             setContent {
-                Box(
-                    Modifier
-                        .background(Color.Blue)
-                        .systemBarsPadding()) {
+                Box(Modifier.background(Color.Blue).systemBarsPadding()) {
                     // The app content shouldn't spill over the edges. They will be green.
-                    Box(
-                        Modifier
-                            .background(Color.Green)
-                            .waterfallPadding()) {
+                    Box(Modifier.background(Color.Green).waterfallPadding()) {
                         // app content
                     }
                 }
@@ -186,16 +165,10 @@
             WindowCompat.setDecorFitsSystemWindows(window, false)
             super.onCreate(savedInstanceState)
             setContent {
-                Box(
-                    Modifier
-                        .background(Color.Blue)
-                        .systemBarsPadding()) {
+                Box(Modifier.background(Color.Blue).systemBarsPadding()) {
                     // The app content won't interfere with the system gestures area.
                     // It will just be white.
-                    Box(
-                        Modifier
-                            .background(Color.White)
-                            .systemGesturesPadding()) {
+                    Box(Modifier.background(Color.White).systemGesturesPadding()) {
                         // app content
                     }
                 }
@@ -211,16 +184,10 @@
             WindowCompat.setDecorFitsSystemWindows(window, false)
             super.onCreate(savedInstanceState)
             setContent {
-                Box(
-                    Modifier
-                        .background(Color.Blue)
-                        .systemBarsPadding()) {
+                Box(Modifier.background(Color.Blue).systemBarsPadding()) {
                     // The app content won't interfere with the mandatory system gestures area.
                     // It will just be white.
-                    Box(
-                        Modifier
-                            .background(Color.White)
-                            .mandatorySystemGesturesPadding()) {
+                    Box(Modifier.background(Color.White).mandatorySystemGesturesPadding()) {
                         // app content
                     }
                 }
@@ -236,16 +203,10 @@
             WindowCompat.setDecorFitsSystemWindows(window, false)
             super.onCreate(savedInstanceState)
             setContent {
-                Box(
-                    Modifier
-                        .background(Color.Black)
-                        .systemBarsPadding()) {
+                Box(Modifier.background(Color.Black).systemBarsPadding()) {
                     // The app content won't have anything drawing over it, but all the
                     // background not in the status bars will be white.
-                    Box(
-                        Modifier
-                            .background(Color.White)
-                            .safeDrawingPadding()) {
+                    Box(Modifier.background(Color.White).safeDrawingPadding()) {
                         // app content
                     }
                 }
@@ -261,16 +222,10 @@
             WindowCompat.setDecorFitsSystemWindows(window, false)
             super.onCreate(savedInstanceState)
             setContent {
-                Box(
-                    Modifier
-                        .background(Color.Black)
-                        .systemBarsPadding()) {
+                Box(Modifier.background(Color.Black).systemBarsPadding()) {
                     // The app content will only be drawn where there is no possible
                     // gesture confusion. The rest will be plain white
-                    Box(
-                        Modifier
-                            .background(Color.White)
-                            .safeGesturesPadding()) {
+                    Box(Modifier.background(Color.White).safeGesturesPadding()) {
                         // app content
                     }
                 }
@@ -286,17 +241,11 @@
             WindowCompat.setDecorFitsSystemWindows(window, false)
             super.onCreate(savedInstanceState)
             setContent {
-                Box(
-                    Modifier
-                        .background(Color.Black)
-                        .systemBarsPadding()) {
+                Box(Modifier.background(Color.Black).systemBarsPadding()) {
                     // The app content will only be drawn where there is no possible
                     // gesture confusion and content will not be drawn over.
                     // The rest will be plain white
-                    Box(
-                        Modifier
-                            .background(Color.White)
-                            .safeContentPadding()) {
+                    Box(Modifier.background(Color.White).safeContentPadding()) {
                         // app content
                     }
                 }
@@ -313,11 +262,7 @@
             super.onCreate(savedInstanceState)
             setContent {
                 val insets = WindowInsets.systemBars.union(WindowInsets.ime)
-                Box(
-                    Modifier
-                        .background(Color.White)
-                        .fillMaxSize()
-                        .windowInsetsPadding(insets)) {
+                Box(Modifier.background(Color.White).fillMaxSize().windowInsetsPadding(insets)) {
                     // app content
                 }
             }
@@ -334,11 +279,7 @@
             setContent {
                 with(LocalDensity.current) {
                     val paddingValues = PaddingValues(horizontal = 20.dp)
-                    Box(
-                        Modifier
-                            .padding(paddingValues)
-                            .consumeWindowInsets(paddingValues)
-                    ) {
+                    Box(Modifier.padding(paddingValues).consumeWindowInsets(paddingValues)) {
                         // app content
                     }
                 }
@@ -388,9 +329,7 @@
             WindowCompat.setDecorFitsSystemWindows(window, false)
             super.onCreate(savedInstanceState)
             setContent {
-                LazyColumn(
-                    contentPadding = WindowInsets.navigationBars.asPaddingValues()
-                ) {
+                LazyColumn(contentPadding = WindowInsets.navigationBars.asPaddingValues()) {
                     // items
                 }
             }
@@ -426,11 +365,11 @@
                 val remainingInsets = remember { MutableWindowInsets() }
                 val safeContent = WindowInsets.safeContent
                 Box(
-                    Modifier
-                        .navigationBarsPadding()
-                        .onConsumedWindowInsetsChanged { consumedWindowInsets ->
-                            remainingInsets.insets = safeContent.exclude(consumedWindowInsets)
-                        }) {
+                    Modifier.navigationBarsPadding().onConsumedWindowInsetsChanged {
+                        consumedWindowInsets ->
+                        remainingInsets.insets = safeContent.exclude(consumedWindowInsets)
+                    }
+                ) {
                     // padding can be used without recomposition when insets change.
                     val padding = remainingInsets.asPaddingValues()
                     Box(Modifier.padding(padding))
diff --git a/compose/foundation/foundation-layout/samples/src/main/java/androidx/compose/foundation/layout/samples/WindowInsetsSizeSample.kt b/compose/foundation/foundation-layout/samples/src/main/java/androidx/compose/foundation/layout/samples/WindowInsetsSizeSample.kt
index 6b875a8..94ccf40 100644
--- a/compose/foundation/foundation-layout/samples/src/main/java/androidx/compose/foundation/layout/samples/WindowInsetsSizeSample.kt
+++ b/compose/foundation/foundation-layout/samples/src/main/java/androidx/compose/foundation/layout/samples/WindowInsetsSizeSample.kt
@@ -45,10 +45,11 @@
             setContent {
                 Box(Modifier.fillMaxSize()) {
                     // Background for navigation bar at the start
-                    Box(Modifier.windowInsetsStartWidth(WindowInsets.navigationBars)
-                        .fillMaxHeight()
-                        .align(Alignment.CenterStart)
-                        .background(Color.Red)
+                    Box(
+                        Modifier.windowInsetsStartWidth(WindowInsets.navigationBars)
+                            .fillMaxHeight()
+                            .align(Alignment.CenterStart)
+                            .background(Color.Red)
                     )
                     // app content
                 }
@@ -66,10 +67,11 @@
             setContent {
                 Box(Modifier.fillMaxSize()) {
                     // Background for status bar at the top
-                    Box(Modifier.windowInsetsTopHeight(WindowInsets.statusBars)
-                        .fillMaxWidth()
-                        .align(Alignment.TopCenter)
-                        .background(Color.Red)
+                    Box(
+                        Modifier.windowInsetsTopHeight(WindowInsets.statusBars)
+                            .fillMaxWidth()
+                            .align(Alignment.TopCenter)
+                            .background(Color.Red)
                     )
                     // app content
                 }
@@ -87,10 +89,11 @@
             setContent {
                 Box(Modifier.fillMaxSize()) {
                     // Background for navigation bar at the end
-                    Box(Modifier.windowInsetsEndWidth(WindowInsets.navigationBars)
-                        .fillMaxHeight()
-                        .align(Alignment.CenterEnd)
-                        .background(Color.Red)
+                    Box(
+                        Modifier.windowInsetsEndWidth(WindowInsets.navigationBars)
+                            .fillMaxHeight()
+                            .align(Alignment.CenterEnd)
+                            .background(Color.Red)
                     )
                     // app content
                 }
@@ -108,10 +111,11 @@
             setContent {
                 Box(Modifier.fillMaxSize()) {
                     // Background for navigation bar at the bottom
-                    Box(Modifier.windowInsetsTopHeight(WindowInsets.navigationBars)
-                        .fillMaxWidth()
-                        .align(Alignment.BottomCenter)
-                        .background(Color.Red)
+                    Box(
+                        Modifier.windowInsetsTopHeight(WindowInsets.navigationBars)
+                            .fillMaxWidth()
+                            .align(Alignment.BottomCenter)
+                            .background(Color.Red)
                     )
                     // app content
                 }
diff --git a/compose/foundation/foundation-layout/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/layout/AlignmentLineTest.kt b/compose/foundation/foundation-layout/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/layout/AlignmentLineTest.kt
index c8d896e..85bfed9 100644
--- a/compose/foundation/foundation-layout/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/layout/AlignmentLineTest.kt
+++ b/compose/foundation/foundation-layout/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/layout/AlignmentLineTest.kt
@@ -63,464 +63,535 @@
     }
 
     @Test
-    fun testPaddingFrom_vertical() = with(density) {
-        val layoutLatch = CountDownLatch(2)
-        val testLine = VerticalAlignmentLine(::min)
-        val beforeDp = 20f.toDp()
-        val afterDp = 40f.toDp()
-        val childDp = 30f.toDp()
-        val lineDp = 10f.toDp()
+    fun testPaddingFrom_vertical() =
+        with(density) {
+            val layoutLatch = CountDownLatch(2)
+            val testLine = VerticalAlignmentLine(::min)
+            val beforeDp = 20f.toDp()
+            val afterDp = 40f.toDp()
+            val childDp = 30f.toDp()
+            val lineDp = 10f.toDp()
 
-        val parentSize = Ref<IntSize>()
-        val childSize = Ref<IntSize>()
-        val childPosition = Ref<Offset>()
-        show {
-            Box(
-                Modifier.onGloballyPositioned {
-                    parentSize.value = it.size
-                    layoutLatch.countDown()
-                }
-            ) {
-                AlignmentLineLayout(
-                    childDp, 0.dp, testLine, lineDp,
-                    Modifier.paddingFrom(testLine, beforeDp, afterDp).onGloballyPositioned {
-                        childSize.value = it.size
-                        childPosition.value = it.positionInRoot()
-                        layoutLatch.countDown()
-                    }
-                )
-            }
-        }
-        Assert.assertTrue(layoutLatch.await(1, TimeUnit.SECONDS))
-
-        Assert.assertNotNull(parentSize.value)
-        Assert.assertEquals(
-            beforeDp.roundToPx() + afterDp.roundToPx(),
-            parentSize.value!!.width
-        )
-        Assert.assertNotNull(childSize.value)
-        Assert.assertEquals(childSize.value!!.height, parentSize.value!!.height)
-        Assert.assertNotNull(childPosition.value)
-        Assert.assertEquals(
-            (beforeDp.roundToPx() - lineDp.roundToPx()).toFloat(),
-            childPosition.value!!.x
-        )
-        Assert.assertEquals(0f, childPosition.value!!.y)
-    }
-
-    @Test
-    fun testPaddingFrom_horizontal() = with(density) {
-        val layoutLatch = CountDownLatch(2)
-        val testLine = HorizontalAlignmentLine(::min)
-        val beforeDp = 20f.toDp()
-        val afterDp = 40f.toDp()
-        val childDp = 30f.toDp()
-        val lineDp = 10f.toDp()
-
-        val parentSize = Ref<IntSize>()
-        val childSize = Ref<IntSize>()
-        val childPosition = Ref<Offset>()
-        show {
-            Box(
-                modifier = Modifier.onGloballyPositioned {
-                    parentSize.value = it.size
-                    layoutLatch.countDown()
-                }
-            ) {
-                AlignmentLineLayout(
-                    0.dp, childDp, testLine, lineDp,
-                    Modifier.paddingFrom(testLine, beforeDp, afterDp).onGloballyPositioned {
-                        childSize.value = it.size
-                        childPosition.value = it.positionInRoot()
-                        layoutLatch.countDown()
-                    }
-                )
-            }
-        }
-        Assert.assertTrue(layoutLatch.await(1, TimeUnit.SECONDS))
-
-        Assert.assertNotNull(childSize.value)
-        Assert.assertEquals(childSize.value!!.width, parentSize.value!!.width)
-        Assert.assertNotNull(parentSize.value)
-        Assert.assertEquals(beforeDp.roundToPx() + afterDp.roundToPx(), parentSize.value!!.height)
-        Assert.assertNotNull(childPosition.value)
-        Assert.assertEquals(0f, childPosition.value!!.x)
-        Assert.assertEquals(
-            (beforeDp.roundToPx() - lineDp.roundToPx()).toFloat(),
-            childPosition.value!!.y
-        )
-    }
-
-    @Test
-    fun testPaddingFrom_vertical_withSmallOffsets() = with(density) {
-        val layoutLatch = CountDownLatch(2)
-        val testLine = VerticalAlignmentLine(::min)
-        val beforeDp = 5f.toDp()
-        val afterDp = 5f.toDp()
-        val childDp = 30f.toDp()
-        val lineDp = 10f.toDp()
-
-        val parentSize = Ref<IntSize>()
-        val childSize = Ref<IntSize>()
-        val childPosition = Ref<Offset>()
-        show {
-            Box(modifier = Modifier.saveLayoutInfo(parentSize, Ref(), layoutLatch)) {
-                AlignmentLineLayout(
-                    childDp, 0.dp, testLine, lineDp,
-                    Modifier.saveLayoutInfo(childSize, childPosition, layoutLatch)
-                        .paddingFrom(testLine, beforeDp, afterDp)
-                )
-            }
-        }
-        Assert.assertTrue(layoutLatch.await(1, TimeUnit.SECONDS))
-
-        Assert.assertNotNull(parentSize.value)
-        Assert.assertNotNull(childSize.value)
-        Assert.assertEquals(childSize.value, parentSize.value)
-        Assert.assertNotNull(childPosition.value)
-        Assert.assertEquals(0f, childPosition.value!!.x)
-        Assert.assertEquals(0f, childPosition.value!!.y)
-    }
-
-    @Test
-    fun testPaddingFrom_horizontal_withSmallOffsets() = with(density) {
-        val layoutLatch = CountDownLatch(2)
-        val testLine = HorizontalAlignmentLine(::min)
-        val beforeDp = 5f.toDp()
-        val afterDp = 5f.toDp()
-        val childDp = 30f.toDp()
-        val lineDp = 10f.toDp()
-
-        val parentSize = Ref<IntSize>()
-        val childSize = Ref<IntSize>()
-        val childPosition = Ref<Offset>()
-        show {
-            Box(Modifier.saveLayoutInfo(parentSize, Ref(), layoutLatch)) {
-                AlignmentLineLayout(
-                    0.dp, childDp, testLine, lineDp,
-                    Modifier
-                        .paddingFrom(testLine, beforeDp, afterDp)
-                        .saveLayoutInfo(childSize, childPosition, layoutLatch)
-                )
-            }
-        }
-        Assert.assertTrue(layoutLatch.await(1, TimeUnit.SECONDS))
-
-        Assert.assertNotNull(parentSize.value)
-        Assert.assertNotNull(childSize.value)
-        Assert.assertEquals(childSize.value, parentSize.value)
-        Assert.assertNotNull(childPosition.value)
-        Assert.assertEquals(0f, childPosition.value!!.x)
-        Assert.assertEquals(0f, childPosition.value!!.y)
-    }
-
-    @Test
-    fun testPaddingFrom_vertical_withInsufficientSpace() = with(density) {
-        val layoutLatch = CountDownLatch(2)
-        val testLine = VerticalAlignmentLine(::min)
-        val maxWidth = 30f.toDp()
-        val beforeDp = 20f.toDp()
-        val afterDp = 20f.toDp()
-        val childDp = 25f.toDp()
-        val lineDp = 10f.toDp()
-
-        val parentSize = Ref<IntSize>()
-        val childSize = Ref<IntSize>()
-        val childPosition = Ref<Offset>()
-        show {
-            Box(Modifier.saveLayoutInfo(parentSize, Ref(), layoutLatch)) {
-                AlignmentLineLayout(
-                    childDp, 0.dp, testLine, lineDp,
-                    Modifier.sizeIn(maxWidth = maxWidth)
-                        .paddingFrom(testLine, beforeDp, afterDp)
-                        .saveLayoutInfo(childSize, childPosition, layoutLatch)
-                )
-            }
-        }
-        Assert.assertTrue(layoutLatch.await(1, TimeUnit.SECONDS))
-
-        Assert.assertNotNull(parentSize.value)
-        Assert.assertEquals(maxWidth.roundToPx(), parentSize.value!!.width)
-        Assert.assertNotNull(childSize.value)
-        Assert.assertEquals(childSize.value!!.height, parentSize.value!!.height)
-        Assert.assertNotNull(childPosition.value)
-        Assert.assertEquals(5f, childPosition.value!!.x)
-        Assert.assertEquals(0f, childPosition.value!!.y)
-    }
-
-    @Test
-    fun testPaddingFrom_horizontal_withInsufficientSpace() = with(density) {
-        val layoutLatch = CountDownLatch(2)
-        val testLine = HorizontalAlignmentLine(::min)
-        val maxHeight = 30f.toDp()
-        val beforeDp = 20f.toDp()
-        val afterDp = 20f.toDp()
-        val childDp = 25f.toDp()
-        val lineDp = 10f.toDp()
-
-        val parentSize = Ref<IntSize>()
-        val childSize = Ref<IntSize>()
-        val childPosition = Ref<Offset>()
-        show {
-            Box(Modifier.saveLayoutInfo(parentSize, Ref(), layoutLatch)) {
-                AlignmentLineLayout(
-                    0.dp, childDp, testLine, lineDp,
-                    Modifier.sizeIn(maxHeight = maxHeight)
-                        .paddingFrom(testLine, beforeDp, afterDp)
-                        .saveLayoutInfo(childSize, childPosition, layoutLatch)
-                )
-            }
-        }
-        Assert.assertTrue(layoutLatch.await(1, TimeUnit.SECONDS))
-
-        Assert.assertNotNull(childSize.value)
-        Assert.assertEquals(childSize.value!!.width, parentSize.value!!.width)
-        Assert.assertNotNull(parentSize.value)
-        Assert.assertEquals(maxHeight.roundToPx(), parentSize.value!!.height)
-        Assert.assertNotNull(childPosition.value)
-        Assert.assertEquals(0f, childPosition.value!!.x)
-        Assert.assertEquals(5f, childPosition.value!!.y)
-    }
-
-    @Test
-    fun testPaddingFrom_vertical_keepsCrossAxisMinConstraints() = with(density) {
-        val testLine = VerticalAlignmentLine(::min)
-        val latch = CountDownLatch(1)
-        val minHeight = 10.dp
-        show {
-            Box {
-                BoxWithConstraints(
-                    Modifier
-                        .sizeIn(minHeight = minHeight)
-                        .paddingFrom(testLine, 0.dp)
-                ) {
-                    Assert.assertEquals(minHeight.roundToPx(), constraints.minHeight)
-                    latch.countDown()
-                }
-            }
-        }
-        Assert.assertTrue(latch.await(1, TimeUnit.SECONDS))
-    }
-
-    @Test
-    fun testPaddingFrom_horizontal_keepsCrossAxisMinConstraints() = with(density) {
-        val testLine = HorizontalAlignmentLine(::min)
-        val latch = CountDownLatch(1)
-        val minWidth = 10.dp
-        show {
-            Box {
-                BoxWithConstraints(
-                    Modifier
-                        .sizeIn(minWidth = minWidth)
-                        .paddingFrom(testLine, 0.dp)
-                ) {
-                    Assert.assertEquals(minWidth.roundToPx(), constraints.minWidth)
-                    latch.countDown()
-                }
-            }
-        }
-        Assert.assertTrue(latch.await(1, TimeUnit.SECONDS))
-    }
-
-    @Test
-    fun testPaddingFrom_vertical_whenMinConstrained() = with(density) {
-        val testLine = VerticalAlignmentLine(::min)
-        val latch = CountDownLatch(2)
-        val childSizePx = 20f
-        val childSize = childSizePx.toDp()
-        val linePositionPx = 10f
-        val linePosition = linePositionPx.toDp()
-        val beforePx = 20f
-        val before = beforePx.toDp()
-        val afterPx = 20f
-        val after = afterPx.toDp()
-        val incomingSizePx = 50f
-        val incomingSize = incomingSizePx.toDp()
-
-        show {
-            Box {
-                AlignmentLineLayout(
-                    childSize, childSize, testLine, linePosition,
-                    Modifier.width(incomingSize)
-                        .paddingFrom(testLine, before = before)
-                        .onGloballyPositioned {
-                            Assert.assertEquals(beforePx - linePositionPx, it.positionInParent().x)
-                            latch.countDown()
-                        }
-                )
-                AlignmentLineLayout(
-                    childSize, childSize, testLine, linePosition,
-                    Modifier.width(incomingSize)
-                        .paddingFrom(testLine, after = after)
-                        .onGloballyPositioned {
-                            Assert.assertEquals(
-                                incomingSizePx - childSizePx - afterPx + linePositionPx,
-                                it.positionInParent().x
-                            )
-                            latch.countDown()
-                        }
-                )
-            }
-        }
-        Assert.assertTrue(latch.await(1, TimeUnit.SECONDS))
-    }
-
-    @Test
-    fun testPaddingFrom_horizontal_whenMinConstrained() = with(density) {
-        val testLine = HorizontalAlignmentLine(::min)
-        val latch = CountDownLatch(2)
-        val childSizePx = 20f
-        val childSize = childSizePx.toDp()
-        val linePositionPx = 10f
-        val linePosition = linePositionPx.toDp()
-        val beforePx = 20f
-        val before = beforePx.toDp()
-        val afterPx = 20f
-        val after = afterPx.toDp()
-        val incomingSizePx = 50f
-        val incomingSize = incomingSizePx.toDp()
-
-        show {
-            Box {
-                AlignmentLineLayout(
-                    childSize, childSize, testLine, linePosition,
-                    Modifier.height(incomingSize)
-                        .paddingFrom(testLine, before = before)
-                        .onGloballyPositioned {
-                            Assert.assertEquals(beforePx - linePositionPx, it.positionInParent().y)
-                            latch.countDown()
-                        }
-                )
-                AlignmentLineLayout(
-                    childSize, childSize, testLine, linePosition,
-                    Modifier.height(incomingSize)
-                        .paddingFrom(testLine, after = after)
-                        .onGloballyPositioned {
-                            Assert.assertEquals(
-                                incomingSizePx - childSizePx - afterPx + linePositionPx,
-                                it.positionInParent().y
-                            )
-                            latch.countDown()
-                        }
-                )
-            }
-        }
-        Assert.assertTrue(latch.await(1, TimeUnit.SECONDS))
-    }
-
-    @Test
-    fun testPaddingFromBaseline() = with(density) {
-        val sizePx = 30
-        val sizeDp = sizePx.toDp()
-        val baselineOffsetPx = 10
-        val baselineOffsetDp = baselineOffsetPx.toDp()
-        val paddingPx = 20
-        val paddingDp = paddingPx.toDp()
-        val latch = CountDownLatch(1)
-
-        show {
-            Box(
-                Modifier.onSizeChanged { boxSize ->
-                    Assert.assertEquals(
-                        sizeDp.roundToPx() + (paddingPx - baselineOffsetPx) * 2,
-                        boxSize.height
-                    )
-                    latch.countDown()
-                }
-            ) {
-                Box(Modifier.paddingFromBaseline(paddingDp, paddingDp)) {
-                    AlignmentLineLayout(sizeDp, sizeDp, FirstBaseline, baselineOffsetDp, Modifier)
-                    AlignmentLineLayout(
-                        sizeDp,
-                        sizeDp,
-                        LastBaseline,
-                        sizeDp - baselineOffsetDp,
-                        Modifier
-                    )
-                }
-            }
-        }
-
-        Assert.assertTrue(latch.await(1, TimeUnit.SECONDS))
-    }
-
-    @Test
-    fun testPaddingFromBaseline_textUnit() = with(density) {
-        val sizePx = 30
-        val sizeDp = sizePx.toDp()
-        val baselineOffsetPx = 10
-        val baselineOffsetDp = baselineOffsetPx.toDp()
-        val paddingPx = 20
-        val paddingSp = paddingPx.toSp()
-        val latch = CountDownLatch(1)
-
-        show {
-            Box(
-                Modifier.onSizeChanged { boxSize ->
-                    Assert.assertEquals(
-                        sizeDp.roundToPx() + paddingPx - baselineOffsetPx,
-                        boxSize.height
-                    )
-                    latch.countDown()
-                }
-            ) {
-                Box(Modifier.paddingFromBaseline(paddingSp)) {
-                    AlignmentLineLayout(sizeDp, sizeDp, FirstBaseline, baselineOffsetDp, Modifier)
-                }
-            }
-        }
-
-        Assert.assertTrue(latch.await(1, TimeUnit.SECONDS))
-    }
-
-    @Test
-    fun testPaddingFromBaseline_whenMinConstrained() = with(density) {
-        val latch = CountDownLatch(1)
-        val childSizePx = 20f
-        val childSize = childSizePx.toDp()
-        val linePositionPx = 10f
-        val linePosition = linePositionPx.toDp()
-        val beforePx = 20f
-        val before = beforePx.toDp()
-        val afterPx = 20f
-        val after = afterPx.toDp()
-        val incomingSizePx = 50f
-        val incomingSize = incomingSizePx.toDp()
-
-        show {
-            Box {
+            val parentSize = Ref<IntSize>()
+            val childSize = Ref<IntSize>()
+            val childPosition = Ref<Offset>()
+            show {
                 Box(
-                    Modifier.height(incomingSize)
-                        .paddingFromBaseline(top = before, bottom = after)
-                        .onGloballyPositioned {
-                            Assert.assertEquals(beforePx - linePositionPx, it.positionInParent().y)
-                            latch.countDown()
-                        }
+                    Modifier.onGloballyPositioned {
+                        parentSize.value = it.size
+                        layoutLatch.countDown()
+                    }
                 ) {
                     AlignmentLineLayout(
-                        childSize, childSize, FirstBaseline, linePosition, Modifier
-                    )
-                    AlignmentLineLayout(
-                        childSize, childSize, LastBaseline, linePosition, Modifier
+                        childDp,
+                        0.dp,
+                        testLine,
+                        lineDp,
+                        Modifier.paddingFrom(testLine, beforeDp, afterDp).onGloballyPositioned {
+                            childSize.value = it.size
+                            childPosition.value = it.positionInRoot()
+                            layoutLatch.countDown()
+                        }
                     )
                 }
             }
+            Assert.assertTrue(layoutLatch.await(1, TimeUnit.SECONDS))
+
+            Assert.assertNotNull(parentSize.value)
+            Assert.assertEquals(
+                beforeDp.roundToPx() + afterDp.roundToPx(),
+                parentSize.value!!.width
+            )
+            Assert.assertNotNull(childSize.value)
+            Assert.assertEquals(childSize.value!!.height, parentSize.value!!.height)
+            Assert.assertNotNull(childPosition.value)
+            Assert.assertEquals(
+                (beforeDp.roundToPx() - lineDp.roundToPx()).toFloat(),
+                childPosition.value!!.x
+            )
+            Assert.assertEquals(0f, childPosition.value!!.y)
         }
-        Assert.assertTrue(latch.await(1, TimeUnit.SECONDS))
-    }
+
+    @Test
+    fun testPaddingFrom_horizontal() =
+        with(density) {
+            val layoutLatch = CountDownLatch(2)
+            val testLine = HorizontalAlignmentLine(::min)
+            val beforeDp = 20f.toDp()
+            val afterDp = 40f.toDp()
+            val childDp = 30f.toDp()
+            val lineDp = 10f.toDp()
+
+            val parentSize = Ref<IntSize>()
+            val childSize = Ref<IntSize>()
+            val childPosition = Ref<Offset>()
+            show {
+                Box(
+                    modifier =
+                        Modifier.onGloballyPositioned {
+                            parentSize.value = it.size
+                            layoutLatch.countDown()
+                        }
+                ) {
+                    AlignmentLineLayout(
+                        0.dp,
+                        childDp,
+                        testLine,
+                        lineDp,
+                        Modifier.paddingFrom(testLine, beforeDp, afterDp).onGloballyPositioned {
+                            childSize.value = it.size
+                            childPosition.value = it.positionInRoot()
+                            layoutLatch.countDown()
+                        }
+                    )
+                }
+            }
+            Assert.assertTrue(layoutLatch.await(1, TimeUnit.SECONDS))
+
+            Assert.assertNotNull(childSize.value)
+            Assert.assertEquals(childSize.value!!.width, parentSize.value!!.width)
+            Assert.assertNotNull(parentSize.value)
+            Assert.assertEquals(
+                beforeDp.roundToPx() + afterDp.roundToPx(),
+                parentSize.value!!.height
+            )
+            Assert.assertNotNull(childPosition.value)
+            Assert.assertEquals(0f, childPosition.value!!.x)
+            Assert.assertEquals(
+                (beforeDp.roundToPx() - lineDp.roundToPx()).toFloat(),
+                childPosition.value!!.y
+            )
+        }
+
+    @Test
+    fun testPaddingFrom_vertical_withSmallOffsets() =
+        with(density) {
+            val layoutLatch = CountDownLatch(2)
+            val testLine = VerticalAlignmentLine(::min)
+            val beforeDp = 5f.toDp()
+            val afterDp = 5f.toDp()
+            val childDp = 30f.toDp()
+            val lineDp = 10f.toDp()
+
+            val parentSize = Ref<IntSize>()
+            val childSize = Ref<IntSize>()
+            val childPosition = Ref<Offset>()
+            show {
+                Box(modifier = Modifier.saveLayoutInfo(parentSize, Ref(), layoutLatch)) {
+                    AlignmentLineLayout(
+                        childDp,
+                        0.dp,
+                        testLine,
+                        lineDp,
+                        Modifier.saveLayoutInfo(childSize, childPosition, layoutLatch)
+                            .paddingFrom(testLine, beforeDp, afterDp)
+                    )
+                }
+            }
+            Assert.assertTrue(layoutLatch.await(1, TimeUnit.SECONDS))
+
+            Assert.assertNotNull(parentSize.value)
+            Assert.assertNotNull(childSize.value)
+            Assert.assertEquals(childSize.value, parentSize.value)
+            Assert.assertNotNull(childPosition.value)
+            Assert.assertEquals(0f, childPosition.value!!.x)
+            Assert.assertEquals(0f, childPosition.value!!.y)
+        }
+
+    @Test
+    fun testPaddingFrom_horizontal_withSmallOffsets() =
+        with(density) {
+            val layoutLatch = CountDownLatch(2)
+            val testLine = HorizontalAlignmentLine(::min)
+            val beforeDp = 5f.toDp()
+            val afterDp = 5f.toDp()
+            val childDp = 30f.toDp()
+            val lineDp = 10f.toDp()
+
+            val parentSize = Ref<IntSize>()
+            val childSize = Ref<IntSize>()
+            val childPosition = Ref<Offset>()
+            show {
+                Box(Modifier.saveLayoutInfo(parentSize, Ref(), layoutLatch)) {
+                    AlignmentLineLayout(
+                        0.dp,
+                        childDp,
+                        testLine,
+                        lineDp,
+                        Modifier.paddingFrom(testLine, beforeDp, afterDp)
+                            .saveLayoutInfo(childSize, childPosition, layoutLatch)
+                    )
+                }
+            }
+            Assert.assertTrue(layoutLatch.await(1, TimeUnit.SECONDS))
+
+            Assert.assertNotNull(parentSize.value)
+            Assert.assertNotNull(childSize.value)
+            Assert.assertEquals(childSize.value, parentSize.value)
+            Assert.assertNotNull(childPosition.value)
+            Assert.assertEquals(0f, childPosition.value!!.x)
+            Assert.assertEquals(0f, childPosition.value!!.y)
+        }
+
+    @Test
+    fun testPaddingFrom_vertical_withInsufficientSpace() =
+        with(density) {
+            val layoutLatch = CountDownLatch(2)
+            val testLine = VerticalAlignmentLine(::min)
+            val maxWidth = 30f.toDp()
+            val beforeDp = 20f.toDp()
+            val afterDp = 20f.toDp()
+            val childDp = 25f.toDp()
+            val lineDp = 10f.toDp()
+
+            val parentSize = Ref<IntSize>()
+            val childSize = Ref<IntSize>()
+            val childPosition = Ref<Offset>()
+            show {
+                Box(Modifier.saveLayoutInfo(parentSize, Ref(), layoutLatch)) {
+                    AlignmentLineLayout(
+                        childDp,
+                        0.dp,
+                        testLine,
+                        lineDp,
+                        Modifier.sizeIn(maxWidth = maxWidth)
+                            .paddingFrom(testLine, beforeDp, afterDp)
+                            .saveLayoutInfo(childSize, childPosition, layoutLatch)
+                    )
+                }
+            }
+            Assert.assertTrue(layoutLatch.await(1, TimeUnit.SECONDS))
+
+            Assert.assertNotNull(parentSize.value)
+            Assert.assertEquals(maxWidth.roundToPx(), parentSize.value!!.width)
+            Assert.assertNotNull(childSize.value)
+            Assert.assertEquals(childSize.value!!.height, parentSize.value!!.height)
+            Assert.assertNotNull(childPosition.value)
+            Assert.assertEquals(5f, childPosition.value!!.x)
+            Assert.assertEquals(0f, childPosition.value!!.y)
+        }
+
+    @Test
+    fun testPaddingFrom_horizontal_withInsufficientSpace() =
+        with(density) {
+            val layoutLatch = CountDownLatch(2)
+            val testLine = HorizontalAlignmentLine(::min)
+            val maxHeight = 30f.toDp()
+            val beforeDp = 20f.toDp()
+            val afterDp = 20f.toDp()
+            val childDp = 25f.toDp()
+            val lineDp = 10f.toDp()
+
+            val parentSize = Ref<IntSize>()
+            val childSize = Ref<IntSize>()
+            val childPosition = Ref<Offset>()
+            show {
+                Box(Modifier.saveLayoutInfo(parentSize, Ref(), layoutLatch)) {
+                    AlignmentLineLayout(
+                        0.dp,
+                        childDp,
+                        testLine,
+                        lineDp,
+                        Modifier.sizeIn(maxHeight = maxHeight)
+                            .paddingFrom(testLine, beforeDp, afterDp)
+                            .saveLayoutInfo(childSize, childPosition, layoutLatch)
+                    )
+                }
+            }
+            Assert.assertTrue(layoutLatch.await(1, TimeUnit.SECONDS))
+
+            Assert.assertNotNull(childSize.value)
+            Assert.assertEquals(childSize.value!!.width, parentSize.value!!.width)
+            Assert.assertNotNull(parentSize.value)
+            Assert.assertEquals(maxHeight.roundToPx(), parentSize.value!!.height)
+            Assert.assertNotNull(childPosition.value)
+            Assert.assertEquals(0f, childPosition.value!!.x)
+            Assert.assertEquals(5f, childPosition.value!!.y)
+        }
+
+    @Test
+    fun testPaddingFrom_vertical_keepsCrossAxisMinConstraints() =
+        with(density) {
+            val testLine = VerticalAlignmentLine(::min)
+            val latch = CountDownLatch(1)
+            val minHeight = 10.dp
+            show {
+                Box {
+                    BoxWithConstraints(
+                        Modifier.sizeIn(minHeight = minHeight).paddingFrom(testLine, 0.dp)
+                    ) {
+                        Assert.assertEquals(minHeight.roundToPx(), constraints.minHeight)
+                        latch.countDown()
+                    }
+                }
+            }
+            Assert.assertTrue(latch.await(1, TimeUnit.SECONDS))
+        }
+
+    @Test
+    fun testPaddingFrom_horizontal_keepsCrossAxisMinConstraints() =
+        with(density) {
+            val testLine = HorizontalAlignmentLine(::min)
+            val latch = CountDownLatch(1)
+            val minWidth = 10.dp
+            show {
+                Box {
+                    BoxWithConstraints(
+                        Modifier.sizeIn(minWidth = minWidth).paddingFrom(testLine, 0.dp)
+                    ) {
+                        Assert.assertEquals(minWidth.roundToPx(), constraints.minWidth)
+                        latch.countDown()
+                    }
+                }
+            }
+            Assert.assertTrue(latch.await(1, TimeUnit.SECONDS))
+        }
+
+    @Test
+    fun testPaddingFrom_vertical_whenMinConstrained() =
+        with(density) {
+            val testLine = VerticalAlignmentLine(::min)
+            val latch = CountDownLatch(2)
+            val childSizePx = 20f
+            val childSize = childSizePx.toDp()
+            val linePositionPx = 10f
+            val linePosition = linePositionPx.toDp()
+            val beforePx = 20f
+            val before = beforePx.toDp()
+            val afterPx = 20f
+            val after = afterPx.toDp()
+            val incomingSizePx = 50f
+            val incomingSize = incomingSizePx.toDp()
+
+            show {
+                Box {
+                    AlignmentLineLayout(
+                        childSize,
+                        childSize,
+                        testLine,
+                        linePosition,
+                        Modifier.width(incomingSize)
+                            .paddingFrom(testLine, before = before)
+                            .onGloballyPositioned {
+                                Assert.assertEquals(
+                                    beforePx - linePositionPx,
+                                    it.positionInParent().x
+                                )
+                                latch.countDown()
+                            }
+                    )
+                    AlignmentLineLayout(
+                        childSize,
+                        childSize,
+                        testLine,
+                        linePosition,
+                        Modifier.width(incomingSize)
+                            .paddingFrom(testLine, after = after)
+                            .onGloballyPositioned {
+                                Assert.assertEquals(
+                                    incomingSizePx - childSizePx - afterPx + linePositionPx,
+                                    it.positionInParent().x
+                                )
+                                latch.countDown()
+                            }
+                    )
+                }
+            }
+            Assert.assertTrue(latch.await(1, TimeUnit.SECONDS))
+        }
+
+    @Test
+    fun testPaddingFrom_horizontal_whenMinConstrained() =
+        with(density) {
+            val testLine = HorizontalAlignmentLine(::min)
+            val latch = CountDownLatch(2)
+            val childSizePx = 20f
+            val childSize = childSizePx.toDp()
+            val linePositionPx = 10f
+            val linePosition = linePositionPx.toDp()
+            val beforePx = 20f
+            val before = beforePx.toDp()
+            val afterPx = 20f
+            val after = afterPx.toDp()
+            val incomingSizePx = 50f
+            val incomingSize = incomingSizePx.toDp()
+
+            show {
+                Box {
+                    AlignmentLineLayout(
+                        childSize,
+                        childSize,
+                        testLine,
+                        linePosition,
+                        Modifier.height(incomingSize)
+                            .paddingFrom(testLine, before = before)
+                            .onGloballyPositioned {
+                                Assert.assertEquals(
+                                    beforePx - linePositionPx,
+                                    it.positionInParent().y
+                                )
+                                latch.countDown()
+                            }
+                    )
+                    AlignmentLineLayout(
+                        childSize,
+                        childSize,
+                        testLine,
+                        linePosition,
+                        Modifier.height(incomingSize)
+                            .paddingFrom(testLine, after = after)
+                            .onGloballyPositioned {
+                                Assert.assertEquals(
+                                    incomingSizePx - childSizePx - afterPx + linePositionPx,
+                                    it.positionInParent().y
+                                )
+                                latch.countDown()
+                            }
+                    )
+                }
+            }
+            Assert.assertTrue(latch.await(1, TimeUnit.SECONDS))
+        }
+
+    @Test
+    fun testPaddingFromBaseline() =
+        with(density) {
+            val sizePx = 30
+            val sizeDp = sizePx.toDp()
+            val baselineOffsetPx = 10
+            val baselineOffsetDp = baselineOffsetPx.toDp()
+            val paddingPx = 20
+            val paddingDp = paddingPx.toDp()
+            val latch = CountDownLatch(1)
+
+            show {
+                Box(
+                    Modifier.onSizeChanged { boxSize ->
+                        Assert.assertEquals(
+                            sizeDp.roundToPx() + (paddingPx - baselineOffsetPx) * 2,
+                            boxSize.height
+                        )
+                        latch.countDown()
+                    }
+                ) {
+                    Box(Modifier.paddingFromBaseline(paddingDp, paddingDp)) {
+                        AlignmentLineLayout(
+                            sizeDp,
+                            sizeDp,
+                            FirstBaseline,
+                            baselineOffsetDp,
+                            Modifier
+                        )
+                        AlignmentLineLayout(
+                            sizeDp,
+                            sizeDp,
+                            LastBaseline,
+                            sizeDp - baselineOffsetDp,
+                            Modifier
+                        )
+                    }
+                }
+            }
+
+            Assert.assertTrue(latch.await(1, TimeUnit.SECONDS))
+        }
+
+    @Test
+    fun testPaddingFromBaseline_textUnit() =
+        with(density) {
+            val sizePx = 30
+            val sizeDp = sizePx.toDp()
+            val baselineOffsetPx = 10
+            val baselineOffsetDp = baselineOffsetPx.toDp()
+            val paddingPx = 20
+            val paddingSp = paddingPx.toSp()
+            val latch = CountDownLatch(1)
+
+            show {
+                Box(
+                    Modifier.onSizeChanged { boxSize ->
+                        Assert.assertEquals(
+                            sizeDp.roundToPx() + paddingPx - baselineOffsetPx,
+                            boxSize.height
+                        )
+                        latch.countDown()
+                    }
+                ) {
+                    Box(Modifier.paddingFromBaseline(paddingSp)) {
+                        AlignmentLineLayout(
+                            sizeDp,
+                            sizeDp,
+                            FirstBaseline,
+                            baselineOffsetDp,
+                            Modifier
+                        )
+                    }
+                }
+            }
+
+            Assert.assertTrue(latch.await(1, TimeUnit.SECONDS))
+        }
+
+    @Test
+    fun testPaddingFromBaseline_whenMinConstrained() =
+        with(density) {
+            val latch = CountDownLatch(1)
+            val childSizePx = 20f
+            val childSize = childSizePx.toDp()
+            val linePositionPx = 10f
+            val linePosition = linePositionPx.toDp()
+            val beforePx = 20f
+            val before = beforePx.toDp()
+            val afterPx = 20f
+            val after = afterPx.toDp()
+            val incomingSizePx = 50f
+            val incomingSize = incomingSizePx.toDp()
+
+            show {
+                Box {
+                    Box(
+                        Modifier.height(incomingSize)
+                            .paddingFromBaseline(top = before, bottom = after)
+                            .onGloballyPositioned {
+                                Assert.assertEquals(
+                                    beforePx - linePositionPx,
+                                    it.positionInParent().y
+                                )
+                                latch.countDown()
+                            }
+                    ) {
+                        AlignmentLineLayout(
+                            childSize,
+                            childSize,
+                            FirstBaseline,
+                            linePosition,
+                            Modifier
+                        )
+                        AlignmentLineLayout(
+                            childSize,
+                            childSize,
+                            LastBaseline,
+                            linePosition,
+                            Modifier
+                        )
+                    }
+                }
+            }
+            Assert.assertTrue(latch.await(1, TimeUnit.SECONDS))
+        }
 
     @Test
     fun testInspectableParameter() {
         val alignment = VerticalAlignmentLine(::min)
-        val modifier = Modifier.paddingFrom(alignment, before = 2.0.dp)
-            as InspectableValue
+        val modifier = Modifier.paddingFrom(alignment, before = 2.0.dp) as InspectableValue
         Truth.assertThat(modifier.nameFallback).isEqualTo("paddingFrom")
         Truth.assertThat(modifier.valueOverride).isNull()
-        Truth.assertThat(modifier.inspectableElements.asIterable()).containsExactly(
-            ValueElement("alignmentLine", alignment),
-            ValueElement("before", 2.0.dp),
-            ValueElement("after", Dp.Unspecified)
-        )
+        Truth.assertThat(modifier.inspectableElements.asIterable())
+            .containsExactly(
+                ValueElement("alignmentLine", alignment),
+                ValueElement("before", 2.0.dp),
+                ValueElement("after", Dp.Unspecified)
+            )
     }
 
     @Composable
diff --git a/compose/foundation/foundation-layout/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/layout/ArrangementTest.kt b/compose/foundation/foundation-layout/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/layout/ArrangementTest.kt
index 34ffd4b..98c4fd9 100644
--- a/compose/foundation/foundation-layout/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/layout/ArrangementTest.kt
+++ b/compose/foundation/foundation-layout/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/layout/ArrangementTest.kt
@@ -29,22 +29,22 @@
 @RunWith(Parameterized::class)
 class ArrangementTest(private val testParam: TestParam) {
 
-    @get:Rule
-    val composeTestRule = createComposeRule()
+    @get:Rule val composeTestRule = createComposeRule()
 
     @Test
-    fun testArrangement() = with(testParam) {
-        with(actualArrangement) {
-            composeTestRule.density.arrange(
-                actualTotalSize,
-                actualSizes,
-                actualLayoutDirection,
-                actualOutPositions
-            )
+    fun testArrangement() =
+        with(testParam) {
+            with(actualArrangement) {
+                composeTestRule.density.arrange(
+                    actualTotalSize,
+                    actualSizes,
+                    actualLayoutDirection,
+                    actualOutPositions
+                )
 
-            assertThat(actualOutPositions).isEqualTo(expectedOutPositions)
+                assertThat(actualOutPositions).isEqualTo(expectedOutPositions)
+            }
         }
-    }
 
     @Suppress("ArrayInDataClass") // Used only in parameterized tests.
     data class TestParam(
@@ -59,39 +59,40 @@
     companion object {
         @JvmStatic
         @Parameterized.Parameters(name = "{0}")
-        fun data() = listOf<Any>(
-            TestParam(
-                actualArrangement = Arrangement.SpaceBetween,
-                actualTotalSize = 2376,
-                actualSizes = intArrayOf(108, 24),
-                actualLayoutDirection = LayoutDirection.Rtl,
-                actualOutPositions = intArrayOf(0, 0),
-                expectedOutPositions = intArrayOf(2268, 0),
-            ),
-            TestParam(
-                actualArrangement = Arrangement.SpaceBetween,
-                actualTotalSize = 2376,
-                actualSizes = intArrayOf(108),
-                actualLayoutDirection = LayoutDirection.Rtl,
-                actualOutPositions = intArrayOf(0),
-                expectedOutPositions = intArrayOf(2268),
-            ),
-            TestParam(
-                actualArrangement = Arrangement.SpaceBetween,
-                actualTotalSize = 2376,
-                actualSizes = intArrayOf(108, 24),
-                actualLayoutDirection = LayoutDirection.Ltr,
-                actualOutPositions = intArrayOf(0, 0),
-                expectedOutPositions = intArrayOf(0, 2352),
-            ),
-            TestParam(
-                actualArrangement = Arrangement.SpaceBetween,
-                actualTotalSize = 2376,
-                actualSizes = intArrayOf(108),
-                actualLayoutDirection = LayoutDirection.Ltr,
-                actualOutPositions = intArrayOf(0),
-                expectedOutPositions = intArrayOf(0),
-            ),
-        )
+        fun data() =
+            listOf<Any>(
+                TestParam(
+                    actualArrangement = Arrangement.SpaceBetween,
+                    actualTotalSize = 2376,
+                    actualSizes = intArrayOf(108, 24),
+                    actualLayoutDirection = LayoutDirection.Rtl,
+                    actualOutPositions = intArrayOf(0, 0),
+                    expectedOutPositions = intArrayOf(2268, 0),
+                ),
+                TestParam(
+                    actualArrangement = Arrangement.SpaceBetween,
+                    actualTotalSize = 2376,
+                    actualSizes = intArrayOf(108),
+                    actualLayoutDirection = LayoutDirection.Rtl,
+                    actualOutPositions = intArrayOf(0),
+                    expectedOutPositions = intArrayOf(2268),
+                ),
+                TestParam(
+                    actualArrangement = Arrangement.SpaceBetween,
+                    actualTotalSize = 2376,
+                    actualSizes = intArrayOf(108, 24),
+                    actualLayoutDirection = LayoutDirection.Ltr,
+                    actualOutPositions = intArrayOf(0, 0),
+                    expectedOutPositions = intArrayOf(0, 2352),
+                ),
+                TestParam(
+                    actualArrangement = Arrangement.SpaceBetween,
+                    actualTotalSize = 2376,
+                    actualSizes = intArrayOf(108),
+                    actualLayoutDirection = LayoutDirection.Ltr,
+                    actualOutPositions = intArrayOf(0),
+                    expectedOutPositions = intArrayOf(0),
+                ),
+            )
     }
 }
diff --git a/compose/foundation/foundation-layout/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/layout/AspectRatioTest.kt b/compose/foundation/foundation-layout/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/layout/AspectRatioTest.kt
index 62ea033..756c754 100644
--- a/compose/foundation/foundation-layout/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/layout/AspectRatioTest.kt
+++ b/compose/foundation/foundation-layout/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/layout/AspectRatioTest.kt
@@ -53,23 +53,24 @@
     }
 
     @Test
-    fun testAspectRatioModifier_intrinsicDimensions() = with(density) {
-        testIntrinsics(
-            @Composable {
-                Container(modifier = Modifier.aspectRatio(2f), width = 30.dp, height = 40.dp) { }
-            }
-        ) { minIntrinsicWidth, minIntrinsicHeight, maxIntrinsicWidth, maxIntrinsicHeight ->
-            assertEquals(40, minIntrinsicWidth(20))
-            assertEquals(40, maxIntrinsicWidth(20))
-            assertEquals(20, minIntrinsicHeight(40))
-            assertEquals(20, maxIntrinsicHeight(40))
+    fun testAspectRatioModifier_intrinsicDimensions() =
+        with(density) {
+            testIntrinsics(
+                @Composable {
+                    Container(modifier = Modifier.aspectRatio(2f), width = 30.dp, height = 40.dp) {}
+                }
+            ) { minIntrinsicWidth, minIntrinsicHeight, maxIntrinsicWidth, maxIntrinsicHeight ->
+                assertEquals(40, minIntrinsicWidth(20))
+                assertEquals(40, maxIntrinsicWidth(20))
+                assertEquals(20, minIntrinsicHeight(40))
+                assertEquals(20, maxIntrinsicHeight(40))
 
-            assertEquals(30.dp.roundToPx(), minIntrinsicWidth(Constraints.Infinity))
-            assertEquals(30.dp.roundToPx(), maxIntrinsicWidth(Constraints.Infinity))
-            assertEquals(40.dp.roundToPx(), minIntrinsicHeight(Constraints.Infinity))
-            assertEquals(40.dp.roundToPx(), maxIntrinsicHeight(Constraints.Infinity))
+                assertEquals(30.dp.roundToPx(), minIntrinsicWidth(Constraints.Infinity))
+                assertEquals(30.dp.roundToPx(), maxIntrinsicWidth(Constraints.Infinity))
+                assertEquals(40.dp.roundToPx(), minIntrinsicHeight(Constraints.Infinity))
+                assertEquals(40.dp.roundToPx(), maxIntrinsicHeight(Constraints.Infinity))
+            }
         }
-    }
 
     @Test(expected = IllegalArgumentException::class)
     fun testAspectRatioModifier_zeroRatio() {
@@ -85,56 +86,29 @@
     fun testAspectRatio_sizesCorrectly() {
         assertEquals(IntSize(30, 30), getSize(1f, Constraints(maxWidth = 30)))
         assertEquals(IntSize(30, 15), getSize(2f, Constraints(maxWidth = 30)))
-        assertEquals(
-            IntSize(10, 10),
-            getSize(1f, Constraints(maxWidth = 30, maxHeight = 10))
-        )
-        assertEquals(
-            IntSize(20, 10),
-            getSize(2f, Constraints(maxWidth = 30, maxHeight = 10))
-        )
-        assertEquals(
-            IntSize(10, 5),
-            getSize(2f, Constraints(minWidth = 10, minHeight = 5))
-        )
-        assertEquals(
-            IntSize(20, 10),
-            getSize(2f, Constraints(minWidth = 5, minHeight = 10))
-        )
-        assertEquals(
-            IntSize(20, 10),
-            getSize(2f, Constraints.fixed(20, 20))
-        )
-        assertEquals(
-            IntSize(50, 25),
-            getSize(2f, Constraints(minWidth = 50, minHeight = 20))
-        )
+        assertEquals(IntSize(10, 10), getSize(1f, Constraints(maxWidth = 30, maxHeight = 10)))
+        assertEquals(IntSize(20, 10), getSize(2f, Constraints(maxWidth = 30, maxHeight = 10)))
+        assertEquals(IntSize(10, 5), getSize(2f, Constraints(minWidth = 10, minHeight = 5)))
+        assertEquals(IntSize(20, 10), getSize(2f, Constraints(minWidth = 5, minHeight = 10)))
+        assertEquals(IntSize(20, 10), getSize(2f, Constraints.fixed(20, 20)))
+        assertEquals(IntSize(50, 25), getSize(2f, Constraints(minWidth = 50, minHeight = 20)))
     }
 
     @Test
     fun testAspectRatio_sizesCorrectly_forHeightFirst() {
         assertEquals(IntSize(30, 30), getSize(1f, Constraints(maxHeight = 30), true))
         assertEquals(IntSize(15, 30), getSize(0.5f, Constraints(maxHeight = 30), true))
-        assertEquals(
-            IntSize(10, 10),
-            getSize(1f, Constraints(maxWidth = 10, maxHeight = 30), true)
-        )
+        assertEquals(IntSize(10, 10), getSize(1f, Constraints(maxWidth = 10, maxHeight = 30), true))
         assertEquals(
             IntSize(10, 20),
             getSize(0.5f, Constraints(maxWidth = 10, maxHeight = 30), true)
         )
-        assertEquals(
-            IntSize(5, 10),
-            getSize(0.5f, Constraints(minWidth = 5, minHeight = 10), true)
-        )
+        assertEquals(IntSize(5, 10), getSize(0.5f, Constraints(minWidth = 5, minHeight = 10), true))
         assertEquals(
             IntSize(10, 20),
             getSize(0.5f, Constraints(minWidth = 10, minHeight = 5), true)
         )
-        assertEquals(
-            IntSize(10, 20),
-            getSize(0.5f, Constraints.fixed(20, 20), true)
-        )
+        assertEquals(IntSize(10, 20), getSize(0.5f, Constraints.fixed(20, 20), true))
         assertEquals(
             IntSize(25, 50),
             getSize(0.5f, Constraints(minWidth = 20, minHeight = 50), true)
@@ -153,11 +127,9 @@
             Layout(
                 @Composable {
                     Container(
-                        Modifier
-                            .aspectRatio(aspectRatio, matchHeightConstraintsFirst)
+                        Modifier.aspectRatio(aspectRatio, matchHeightConstraintsFirst)
                             .then(Modifier.saveLayoutInfo(size, position, positionedLatch))
-                    ) {
-                    }
+                    ) {}
                 }
             ) { measurables, incomingConstraints ->
                 require(measurables.isNotEmpty())
@@ -175,9 +147,10 @@
     fun testInspectableValue() {
         val modifier = Modifier.aspectRatio(2.0f) as InspectableValue
         assertThat(modifier.nameFallback).isEqualTo("aspectRatio")
-        assertThat(modifier.inspectableElements.asIterable()).containsExactly(
-            ValueElement("ratio", 2.0f),
-            ValueElement("matchHeightConstraintsFirst", false)
-        )
+        assertThat(modifier.inspectableElements.asIterable())
+            .containsExactly(
+                ValueElement("ratio", 2.0f),
+                ValueElement("matchHeightConstraintsFirst", false)
+            )
     }
 }
diff --git a/compose/foundation/foundation-layout/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/layout/BoxTest.kt b/compose/foundation/foundation-layout/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/layout/BoxTest.kt
index d58d63d..45a6a9a 100644
--- a/compose/foundation/foundation-layout/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/layout/BoxTest.kt
+++ b/compose/foundation/foundation-layout/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/layout/BoxTest.kt
@@ -63,401 +63,371 @@
     }
 
     @Test
-    fun testBox() = with(density) {
-        val sizeDp = 50.toDp()
-        val size = sizeDp.roundToPx()
+    fun testBox() =
+        with(density) {
+            val sizeDp = 50.toDp()
+            val size = sizeDp.roundToPx()
 
-        val positionedLatch = CountDownLatch(3)
-        val stackSize = Ref<IntSize>()
-        val alignedChildSize = Ref<IntSize>()
-        val alignedChildPosition = Ref<Offset>()
-        val positionedChildSize = Ref<IntSize>()
-        val positionedChildPosition = Ref<Offset>()
-        show {
-            Container(alignment = Alignment.TopStart) {
-                Box {
-                    Container(
-                        Modifier.align(Alignment.BottomEnd)
-                            .saveLayoutInfo(alignedChildSize, alignedChildPosition, positionedLatch)
-                            .onGloballyPositioned { coordinates: LayoutCoordinates ->
-                                stackSize.value = coordinates.size
-                                positionedLatch.countDown()
-                            },
-                        width = sizeDp,
-                        height = sizeDp
-                    ) {
-                    }
-
-                    Container(
-                        Modifier.matchParentSize()
-                            .padding(10.toDp())
-                            .saveLayoutInfo(
-                                positionedChildSize,
-                                positionedChildPosition,
-                                positionedLatch
-                            )
-                    ) {
-                    }
-                }
-            }
-        }
-        assertTrue(positionedLatch.await(1, TimeUnit.SECONDS))
-
-        assertEquals(IntSize(size, size), stackSize.value)
-        assertEquals(IntSize(size, size), alignedChildSize.value)
-        assertEquals(Offset(0f, 0f), alignedChildPosition.value)
-        assertEquals(IntSize(30, 30), positionedChildSize.value)
-        assertEquals(Offset(10f, 10f), positionedChildPosition.value)
-    }
-
-    @Test
-    fun testBox_withMultipleAlignedChildren() = with(density) {
-        val size = 200
-        val sizeDp = size.toDp()
-        val doubleSizeDp = sizeDp * 2
-        val doubleSize = (sizeDp * 2).roundToPx()
-
-        val positionedLatch = CountDownLatch(3)
-        val stackSize = Ref<IntSize>()
-        val childSize = arrayOf(Ref<IntSize>(), Ref<IntSize>())
-        val childPosition = arrayOf(Ref<Offset>(), Ref<Offset>())
-        show {
-            Container(alignment = Alignment.TopStart) {
-                Box(
-                    Modifier.onGloballyPositioned { coordinates: LayoutCoordinates ->
-                        stackSize.value = coordinates.size
-                        positionedLatch.countDown()
-                    }
-                ) {
-                    Container(
-                        modifier = Modifier.align(Alignment.BottomEnd)
-                            .saveLayoutInfo(
-                                childSize[0],
-                                childPosition[0],
-                                positionedLatch
-                            ),
-                        width = sizeDp,
-                        height = sizeDp
-                    ) {
-                    }
-                    Container(
-                        modifier = Modifier.align(Alignment.BottomEnd)
-                            .saveLayoutInfo(
-                                size = childSize[1],
-                                position = childPosition[1],
-                                positionedLatch = positionedLatch
-                            ),
-                        width = doubleSizeDp,
-                        height = doubleSizeDp
-                    ) {
-                    }
-                }
-            }
-        }
-        assertTrue(positionedLatch.await(1, TimeUnit.SECONDS))
-
-        assertEquals(IntSize(doubleSize, doubleSize), stackSize.value)
-        assertEquals(IntSize(size, size), childSize[0].value)
-        assertEquals(
-            Offset(size.toFloat(), size.toFloat()),
-            childPosition[0].value
-        )
-        assertEquals(IntSize(doubleSize, doubleSize), childSize[1].value)
-        assertEquals(Offset(0f, 0f), childPosition[1].value)
-    }
-
-    @Test
-    fun testBox_withStretchChildren() = with(density) {
-        val size = 250
-        val sizeDp = size.toDp()
-        val halfSizeDp = sizeDp / 2
-        val inset = 50
-        val insetDp = inset.toDp()
-
-        val positionedLatch = CountDownLatch(6)
-        val stackSize = Ref<IntSize>()
-        val childSize = Array(5) { Ref<IntSize>() }
-        val childPosition = Array(5) { Ref<Offset>() }
-        show {
-            Container(alignment = Alignment.TopStart) {
-                Box(
-                    Modifier.onGloballyPositioned { coordinates: LayoutCoordinates ->
-                        stackSize.value = coordinates.size
-                        positionedLatch.countDown()
-                    }
-                ) {
-                    Container(
-                        Modifier.align(Alignment.Center)
-                            .saveLayoutInfo(
-                                childSize[0],
-                                childPosition[0],
-                                positionedLatch
-                            ),
-                        width = sizeDp,
-                        height = sizeDp
-                    ) {
-                    }
-                    Container(
-                        Modifier.matchParentSize()
-                            .padding(start = insetDp, top = insetDp)
-                            .saveLayoutInfo(childSize[1], childPosition[1], positionedLatch),
-                        width = halfSizeDp,
-                        height = halfSizeDp
-                    ) {
-                    }
-                    Container(
-                        Modifier.matchParentSize()
-                            .padding(end = insetDp, bottom = insetDp)
-                            .saveLayoutInfo(childSize[2], childPosition[2], positionedLatch),
-                        width = halfSizeDp,
-                        height = halfSizeDp
-                    ) {
-                    }
-                    Container(
-                        Modifier.matchParentSize()
-                            .padding(start = insetDp, end = insetDp)
-                            .saveLayoutInfo(childSize[3], childPosition[3], positionedLatch),
-                        width = halfSizeDp,
-                        height = halfSizeDp
-                    ) {
-                    }
-                    Container(
-                        Modifier.matchParentSize()
-                            .padding(top = insetDp, bottom = insetDp)
-                            .saveLayoutInfo(childSize[4], childPosition[4], positionedLatch),
-                        width = halfSizeDp,
-                        height = halfSizeDp
-                    ) {
-                    }
-                }
-            }
-        }
-        assertTrue(positionedLatch.await(1, TimeUnit.SECONDS))
-
-        assertEquals(IntSize(size, size), stackSize.value)
-        assertEquals(IntSize(size, size), childSize[0].value)
-        assertEquals(Offset(0f, 0f), childPosition[0].value)
-        assertEquals(IntSize(size - inset, size - inset), childSize[1].value)
-        assertEquals(Offset(inset.toFloat(), inset.toFloat()), childPosition[1].value)
-        assertEquals(IntSize(size - inset, size - inset), childSize[2].value)
-        assertEquals(Offset(0f, 0f), childPosition[2].value)
-        assertEquals(IntSize(size - inset * 2, size), childSize[3].value)
-        assertEquals(Offset(inset.toFloat(), 0f), childPosition[3].value)
-        assertEquals(IntSize(size, size - inset * 2), childSize[4].value)
-        assertEquals(Offset(0f, inset.toFloat()), childPosition[4].value)
-    }
-
-    @Test
-    fun testBox_Rtl() = with(density) {
-        val sizeDp = 48.toDp()
-        val size = sizeDp.roundToPx()
-        val tripleSizeDp = sizeDp * 3
-        val tripleSize = (sizeDp * 3).roundToPx()
-
-        val positionedLatch = CountDownLatch(10)
-        val stackSize = Ref<IntSize>()
-        val childSize = Array(9) { Ref<IntSize>() }
-        val childPosition = Array(9) { Ref<Offset>() }
-        show {
-            Box(Modifier.wrapContentSize(Alignment.TopStart)) {
-                DeviceConfigurationOverride(
-                    DeviceConfigurationOverride.LayoutDirection(LayoutDirection.Rtl)
-                ) {
-                    Box(
-                        Modifier
-                            .size(tripleSizeDp)
-                            .onGloballyPositioned { coordinates: LayoutCoordinates ->
-                                stackSize.value = coordinates.size
-                                positionedLatch.countDown()
-                            }
-                    ) {
-                        Box(
-                            Modifier.align(Alignment.TopStart)
-                                .size(sizeDp, sizeDp)
-                                .saveLayoutInfo(childSize[0], childPosition[0], positionedLatch)
-                        ) {
-                        }
-                        Box(
-                            Modifier.align(Alignment.TopCenter)
-                                .size(sizeDp)
-                                .saveLayoutInfo(childSize[1], childPosition[1], positionedLatch)
-                        ) {
-                        }
-                        Box(
-                            Modifier.align(Alignment.TopEnd)
-                                .size(sizeDp)
-                                .saveLayoutInfo(childSize[2], childPosition[2], positionedLatch)
-                        ) {
-                        }
-                        Box(
-                            Modifier.align(Alignment.CenterStart)
-                                .size(sizeDp)
-                                .saveLayoutInfo(childSize[3], childPosition[3], positionedLatch)
-                        ) {
-                        }
-                        Box(
-                            Modifier.align(Alignment.Center)
-                                .size(sizeDp)
-                                .saveLayoutInfo(childSize[4], childPosition[4], positionedLatch)
-                        ) {
-                        }
-                        Box(
-                            Modifier.align(Alignment.CenterEnd)
-                                .size(sizeDp)
-                                .saveLayoutInfo(childSize[5], childPosition[5], positionedLatch)
-                        ) {
-                        }
-                        Box(
-                            Modifier.align(Alignment.BottomStart)
-                                .size(sizeDp)
-                                .saveLayoutInfo(childSize[6], childPosition[6], positionedLatch)
-                        ) {
-                        }
-                        Box(
-                            Modifier.align(Alignment.BottomCenter)
-                                .size(sizeDp)
-                                .saveLayoutInfo(childSize[7], childPosition[7], positionedLatch)
-                        ) {
-                        }
-                        Box(
+            val positionedLatch = CountDownLatch(3)
+            val stackSize = Ref<IntSize>()
+            val alignedChildSize = Ref<IntSize>()
+            val alignedChildPosition = Ref<Offset>()
+            val positionedChildSize = Ref<IntSize>()
+            val positionedChildPosition = Ref<Offset>()
+            show {
+                Container(alignment = Alignment.TopStart) {
+                    Box {
+                        Container(
                             Modifier.align(Alignment.BottomEnd)
-                                .size(sizeDp)
-                                .saveLayoutInfo(childSize[8], childPosition[8], positionedLatch)
-                        ) {
-                        }
+                                .saveLayoutInfo(
+                                    alignedChildSize,
+                                    alignedChildPosition,
+                                    positionedLatch
+                                )
+                                .onGloballyPositioned { coordinates: LayoutCoordinates ->
+                                    stackSize.value = coordinates.size
+                                    positionedLatch.countDown()
+                                },
+                            width = sizeDp,
+                            height = sizeDp
+                        ) {}
+
+                        Container(
+                            Modifier.matchParentSize()
+                                .padding(10.toDp())
+                                .saveLayoutInfo(
+                                    positionedChildSize,
+                                    positionedChildPosition,
+                                    positionedLatch
+                                )
+                        ) {}
                     }
                 }
             }
-        }
-        assertTrue(positionedLatch.await(1, TimeUnit.SECONDS))
+            assertTrue(positionedLatch.await(1, TimeUnit.SECONDS))
 
-        assertEquals(IntSize(tripleSize, tripleSize), stackSize.value)
-        assertEquals(Offset((size * 2).toFloat(), 0f), childPosition[0].value)
-        assertEquals(Offset(size.toFloat(), 0f), childPosition[1].value)
-        assertEquals(Offset(0f, 0f), childPosition[2].value)
-        assertEquals(
-            Offset(
-                (size * 2).toFloat(),
-                size.toFloat()
-            ),
-            childPosition[3].value
-        )
-        assertEquals(Offset(size.toFloat(), size.toFloat()), childPosition[4].value)
-        assertEquals(Offset(0f, size.toFloat()), childPosition[5].value)
-        assertEquals(
-            Offset(
-                (size * 2).toFloat(),
-                (size * 2).toFloat()
-            ),
-            childPosition[6].value
-        )
-        assertEquals(
-            Offset(size.toFloat(), (size * 2).toFloat()),
-            childPosition[7].value
-        )
-        assertEquals(Offset(0f, (size * 2).toFloat()), childPosition[8].value)
-    }
+            assertEquals(IntSize(size, size), stackSize.value)
+            assertEquals(IntSize(size, size), alignedChildSize.value)
+            assertEquals(Offset(0f, 0f), alignedChildPosition.value)
+            assertEquals(IntSize(30, 30), positionedChildSize.value)
+            assertEquals(Offset(10f, 10f), positionedChildPosition.value)
+        }
 
     @Test
-    fun testBox_expanded() = with(density) {
-        val size = 250
-        val sizeDp = size.toDp()
-        val halfSize = 125
-        val halfSizeDp = halfSize.toDp()
+    fun testBox_withMultipleAlignedChildren() =
+        with(density) {
+            val size = 200
+            val sizeDp = size.toDp()
+            val doubleSizeDp = sizeDp * 2
+            val doubleSize = (sizeDp * 2).roundToPx()
 
-        val positionedLatch = CountDownLatch(3)
-        val stackSize = Ref<IntSize>()
-        val childSize = Array(2) { Ref<IntSize>() }
-        val childPosition = Array(2) { Ref<Offset>() }
-        show {
-            Container(alignment = Alignment.TopStart) {
-                Container(
-                    Modifier.size(
-                        sizeDp,
-                        sizeDp
-                    ).then(
+            val positionedLatch = CountDownLatch(3)
+            val stackSize = Ref<IntSize>()
+            val childSize = arrayOf(Ref<IntSize>(), Ref<IntSize>())
+            val childPosition = arrayOf(Ref<Offset>(), Ref<Offset>())
+            show {
+                Container(alignment = Alignment.TopStart) {
+                    Box(
                         Modifier.onGloballyPositioned { coordinates: LayoutCoordinates ->
                             stackSize.value = coordinates.size
                             positionedLatch.countDown()
                         }
-                    )
-                ) {
-                    Box {
+                    ) {
                         Container(
-                            Modifier.fillMaxSize()
-                                .saveLayoutInfo(childSize[0], childPosition[0], positionedLatch)
-                        ) {
+                            modifier =
+                                Modifier.align(Alignment.BottomEnd)
+                                    .saveLayoutInfo(
+                                        childSize[0],
+                                        childPosition[0],
+                                        positionedLatch
+                                    ),
+                            width = sizeDp,
+                            height = sizeDp
+                        ) {}
+                        Container(
+                            modifier =
+                                Modifier.align(Alignment.BottomEnd)
+                                    .saveLayoutInfo(
+                                        size = childSize[1],
+                                        position = childPosition[1],
+                                        positionedLatch = positionedLatch
+                                    ),
+                            width = doubleSizeDp,
+                            height = doubleSizeDp
+                        ) {}
+                    }
+                }
+            }
+            assertTrue(positionedLatch.await(1, TimeUnit.SECONDS))
+
+            assertEquals(IntSize(doubleSize, doubleSize), stackSize.value)
+            assertEquals(IntSize(size, size), childSize[0].value)
+            assertEquals(Offset(size.toFloat(), size.toFloat()), childPosition[0].value)
+            assertEquals(IntSize(doubleSize, doubleSize), childSize[1].value)
+            assertEquals(Offset(0f, 0f), childPosition[1].value)
+        }
+
+    @Test
+    fun testBox_withStretchChildren() =
+        with(density) {
+            val size = 250
+            val sizeDp = size.toDp()
+            val halfSizeDp = sizeDp / 2
+            val inset = 50
+            val insetDp = inset.toDp()
+
+            val positionedLatch = CountDownLatch(6)
+            val stackSize = Ref<IntSize>()
+            val childSize = Array(5) { Ref<IntSize>() }
+            val childPosition = Array(5) { Ref<Offset>() }
+            show {
+                Container(alignment = Alignment.TopStart) {
+                    Box(
+                        Modifier.onGloballyPositioned { coordinates: LayoutCoordinates ->
+                            stackSize.value = coordinates.size
+                            positionedLatch.countDown()
                         }
+                    ) {
                         Container(
-                            Modifier.align(Alignment.BottomEnd)
+                            Modifier.align(Alignment.Center)
+                                .saveLayoutInfo(childSize[0], childPosition[0], positionedLatch),
+                            width = sizeDp,
+                            height = sizeDp
+                        ) {}
+                        Container(
+                            Modifier.matchParentSize()
+                                .padding(start = insetDp, top = insetDp)
                                 .saveLayoutInfo(childSize[1], childPosition[1], positionedLatch),
                             width = halfSizeDp,
                             height = halfSizeDp
+                        ) {}
+                        Container(
+                            Modifier.matchParentSize()
+                                .padding(end = insetDp, bottom = insetDp)
+                                .saveLayoutInfo(childSize[2], childPosition[2], positionedLatch),
+                            width = halfSizeDp,
+                            height = halfSizeDp
+                        ) {}
+                        Container(
+                            Modifier.matchParentSize()
+                                .padding(start = insetDp, end = insetDp)
+                                .saveLayoutInfo(childSize[3], childPosition[3], positionedLatch),
+                            width = halfSizeDp,
+                            height = halfSizeDp
+                        ) {}
+                        Container(
+                            Modifier.matchParentSize()
+                                .padding(top = insetDp, bottom = insetDp)
+                                .saveLayoutInfo(childSize[4], childPosition[4], positionedLatch),
+                            width = halfSizeDp,
+                            height = halfSizeDp
+                        ) {}
+                    }
+                }
+            }
+            assertTrue(positionedLatch.await(1, TimeUnit.SECONDS))
+
+            assertEquals(IntSize(size, size), stackSize.value)
+            assertEquals(IntSize(size, size), childSize[0].value)
+            assertEquals(Offset(0f, 0f), childPosition[0].value)
+            assertEquals(IntSize(size - inset, size - inset), childSize[1].value)
+            assertEquals(Offset(inset.toFloat(), inset.toFloat()), childPosition[1].value)
+            assertEquals(IntSize(size - inset, size - inset), childSize[2].value)
+            assertEquals(Offset(0f, 0f), childPosition[2].value)
+            assertEquals(IntSize(size - inset * 2, size), childSize[3].value)
+            assertEquals(Offset(inset.toFloat(), 0f), childPosition[3].value)
+            assertEquals(IntSize(size, size - inset * 2), childSize[4].value)
+            assertEquals(Offset(0f, inset.toFloat()), childPosition[4].value)
+        }
+
+    @Test
+    fun testBox_Rtl() =
+        with(density) {
+            val sizeDp = 48.toDp()
+            val size = sizeDp.roundToPx()
+            val tripleSizeDp = sizeDp * 3
+            val tripleSize = (sizeDp * 3).roundToPx()
+
+            val positionedLatch = CountDownLatch(10)
+            val stackSize = Ref<IntSize>()
+            val childSize = Array(9) { Ref<IntSize>() }
+            val childPosition = Array(9) { Ref<Offset>() }
+            show {
+                Box(Modifier.wrapContentSize(Alignment.TopStart)) {
+                    DeviceConfigurationOverride(
+                        DeviceConfigurationOverride.LayoutDirection(LayoutDirection.Rtl)
+                    ) {
+                        Box(
+                            Modifier.size(tripleSizeDp).onGloballyPositioned {
+                                coordinates: LayoutCoordinates ->
+                                stackSize.value = coordinates.size
+                                positionedLatch.countDown()
+                            }
                         ) {
+                            Box(
+                                Modifier.align(Alignment.TopStart)
+                                    .size(sizeDp, sizeDp)
+                                    .saveLayoutInfo(childSize[0], childPosition[0], positionedLatch)
+                            ) {}
+                            Box(
+                                Modifier.align(Alignment.TopCenter)
+                                    .size(sizeDp)
+                                    .saveLayoutInfo(childSize[1], childPosition[1], positionedLatch)
+                            ) {}
+                            Box(
+                                Modifier.align(Alignment.TopEnd)
+                                    .size(sizeDp)
+                                    .saveLayoutInfo(childSize[2], childPosition[2], positionedLatch)
+                            ) {}
+                            Box(
+                                Modifier.align(Alignment.CenterStart)
+                                    .size(sizeDp)
+                                    .saveLayoutInfo(childSize[3], childPosition[3], positionedLatch)
+                            ) {}
+                            Box(
+                                Modifier.align(Alignment.Center)
+                                    .size(sizeDp)
+                                    .saveLayoutInfo(childSize[4], childPosition[4], positionedLatch)
+                            ) {}
+                            Box(
+                                Modifier.align(Alignment.CenterEnd)
+                                    .size(sizeDp)
+                                    .saveLayoutInfo(childSize[5], childPosition[5], positionedLatch)
+                            ) {}
+                            Box(
+                                Modifier.align(Alignment.BottomStart)
+                                    .size(sizeDp)
+                                    .saveLayoutInfo(childSize[6], childPosition[6], positionedLatch)
+                            ) {}
+                            Box(
+                                Modifier.align(Alignment.BottomCenter)
+                                    .size(sizeDp)
+                                    .saveLayoutInfo(childSize[7], childPosition[7], positionedLatch)
+                            ) {}
+                            Box(
+                                Modifier.align(Alignment.BottomEnd)
+                                    .size(sizeDp)
+                                    .saveLayoutInfo(childSize[8], childPosition[8], positionedLatch)
+                            ) {}
                         }
                     }
                 }
             }
-        }
-        assertTrue(positionedLatch.await(1, TimeUnit.SECONDS))
+            assertTrue(positionedLatch.await(1, TimeUnit.SECONDS))
 
-        assertEquals(IntSize(size, size), stackSize.value)
-        assertEquals(IntSize(size, size), childSize[0].value)
-        assertEquals(Offset(0f, 0f), childPosition[0].value)
-        assertEquals(IntSize(halfSize, halfSize), childSize[1].value)
-        assertEquals(
-            Offset(
-                (size - halfSize).toFloat(),
-                (size - halfSize).toFloat()
-            ),
-            childPosition[1].value
-        )
-    }
+            assertEquals(IntSize(tripleSize, tripleSize), stackSize.value)
+            assertEquals(Offset((size * 2).toFloat(), 0f), childPosition[0].value)
+            assertEquals(Offset(size.toFloat(), 0f), childPosition[1].value)
+            assertEquals(Offset(0f, 0f), childPosition[2].value)
+            assertEquals(Offset((size * 2).toFloat(), size.toFloat()), childPosition[3].value)
+            assertEquals(Offset(size.toFloat(), size.toFloat()), childPosition[4].value)
+            assertEquals(Offset(0f, size.toFloat()), childPosition[5].value)
+            assertEquals(Offset((size * 2).toFloat(), (size * 2).toFloat()), childPosition[6].value)
+            assertEquals(Offset(size.toFloat(), (size * 2).toFloat()), childPosition[7].value)
+            assertEquals(Offset(0f, (size * 2).toFloat()), childPosition[8].value)
+        }
 
     @Test
-    fun testBox_alignmentParameter() = with(density) {
-        val outerSizePx = 50f
-        val outerSize = outerSizePx.toDp()
-        val innerSizePx = 10f
-        val innerSize = innerSizePx.toDp()
+    fun testBox_expanded() =
+        with(density) {
+            val size = 250
+            val sizeDp = size.toDp()
+            val halfSize = 125
+            val halfSizeDp = halfSize.toDp()
 
-        val positionedLatch = CountDownLatch(1)
-        show {
-            Box(
-                contentAlignment = Alignment.BottomEnd,
-                modifier = Modifier.requiredSize(outerSize)
-            ) {
-                Box(
-                    Modifier.requiredSize(innerSize).onGloballyPositioned {
-                        assertEquals(outerSizePx - innerSizePx, it.positionInParent().x)
-                        assertEquals(outerSizePx - innerSizePx, it.positionInParent().y)
-                        positionedLatch.countDown()
+            val positionedLatch = CountDownLatch(3)
+            val stackSize = Ref<IntSize>()
+            val childSize = Array(2) { Ref<IntSize>() }
+            val childPosition = Array(2) { Ref<Offset>() }
+            show {
+                Container(alignment = Alignment.TopStart) {
+                    Container(
+                        Modifier.size(sizeDp, sizeDp)
+                            .then(
+                                Modifier.onGloballyPositioned { coordinates: LayoutCoordinates ->
+                                    stackSize.value = coordinates.size
+                                    positionedLatch.countDown()
+                                }
+                            )
+                    ) {
+                        Box {
+                            Container(
+                                Modifier.fillMaxSize()
+                                    .saveLayoutInfo(childSize[0], childPosition[0], positionedLatch)
+                            ) {}
+                            Container(
+                                Modifier.align(Alignment.BottomEnd)
+                                    .saveLayoutInfo(
+                                        childSize[1],
+                                        childPosition[1],
+                                        positionedLatch
+                                    ),
+                                width = halfSizeDp,
+                                height = halfSizeDp
+                            ) {}
+                        }
                     }
-                ) {}
+                }
             }
+            assertTrue(positionedLatch.await(1, TimeUnit.SECONDS))
+
+            assertEquals(IntSize(size, size), stackSize.value)
+            assertEquals(IntSize(size, size), childSize[0].value)
+            assertEquals(Offset(0f, 0f), childPosition[0].value)
+            assertEquals(IntSize(halfSize, halfSize), childSize[1].value)
+            assertEquals(
+                Offset((size - halfSize).toFloat(), (size - halfSize).toFloat()),
+                childPosition[1].value
+            )
         }
-        assertTrue(positionedLatch.await(1, TimeUnit.SECONDS))
-    }
 
     @Test
-    fun testBox_outermostGravityWins() = with(density) {
-        val positionedLatch = CountDownLatch(1)
-        val size = 10f
-        val sizeDp = size.toDp()
-        show {
-            Box(Modifier.requiredSize(sizeDp)) {
+    fun testBox_alignmentParameter() =
+        with(density) {
+            val outerSizePx = 50f
+            val outerSize = outerSizePx.toDp()
+            val innerSizePx = 10f
+            val innerSize = innerSizePx.toDp()
+
+            val positionedLatch = CountDownLatch(1)
+            show {
                 Box(
-                    Modifier.align(Alignment.BottomEnd).align(Alignment.TopStart)
-                        .onGloballyPositioned {
-                            assertEquals(size, it.positionInParent().x)
-                            assertEquals(size, it.positionInParent().y)
+                    contentAlignment = Alignment.BottomEnd,
+                    modifier = Modifier.requiredSize(outerSize)
+                ) {
+                    Box(
+                        Modifier.requiredSize(innerSize).onGloballyPositioned {
+                            assertEquals(outerSizePx - innerSizePx, it.positionInParent().x)
+                            assertEquals(outerSizePx - innerSizePx, it.positionInParent().y)
                             positionedLatch.countDown()
                         }
-                )
+                    ) {}
+                }
             }
+            assertTrue(positionedLatch.await(1, TimeUnit.SECONDS))
         }
-        assertTrue(positionedLatch.await(1, TimeUnit.SECONDS))
-    }
+
+    @Test
+    fun testBox_outermostGravityWins() =
+        with(density) {
+            val positionedLatch = CountDownLatch(1)
+            val size = 10f
+            val sizeDp = size.toDp()
+            show {
+                Box(Modifier.requiredSize(sizeDp)) {
+                    Box(
+                        Modifier.align(Alignment.BottomEnd)
+                            .align(Alignment.TopStart)
+                            .onGloballyPositioned {
+                                assertEquals(size, it.positionInParent().x)
+                                assertEquals(size, it.positionInParent().y)
+                                positionedLatch.countDown()
+                            }
+                    )
+                }
+            }
+            assertTrue(positionedLatch.await(1, TimeUnit.SECONDS))
+        }
 
     @Test
     fun testBox_childAffectsBoxSize() {
@@ -477,17 +447,18 @@
                             )
                         }
                     },
-                    measurePolicy = remember {
-                        MeasurePolicy { measurables, constraints ->
-                            val placeable = measurables.first().measure(constraints)
-                            ++measure
-                            layout(placeable.width, placeable.height) {
-                                placeable.place(0, 0)
-                                ++layout
-                                layoutLatch.countDown()
+                    measurePolicy =
+                        remember {
+                            MeasurePolicy { measurables, constraints ->
+                                val placeable = measurables.first().measure(constraints)
+                                ++measure
+                                layout(placeable.width, placeable.height) {
+                                    placeable.place(0, 0)
+                                    ++layout
+                                    layoutLatch.countDown()
+                                }
                             }
                         }
-                    }
                 )
             }
         }
@@ -503,42 +474,39 @@
     }
 
     @Test
-    fun testBox_canPropagateMinConstraints() = with(density) {
-        val measuredLatch = CountDownLatch(1)
+    fun testBox_canPropagateMinConstraints() =
+        with(density) {
+            val measuredLatch = CountDownLatch(1)
 
-        show {
-            Box(
-                Modifier.requiredWidthIn(20.dp, 40.dp),
-                propagateMinConstraints = true
-            ) {
-                Box(
-                    Modifier.width(10.dp).onSizeChanged {
-                        assertEquals(20.dp.roundToPx(), it.width)
-                        measuredLatch.countDown()
-                    }
-                )
+            show {
+                Box(Modifier.requiredWidthIn(20.dp, 40.dp), propagateMinConstraints = true) {
+                    Box(
+                        Modifier.width(10.dp).onSizeChanged {
+                            assertEquals(20.dp.roundToPx(), it.width)
+                            measuredLatch.countDown()
+                        }
+                    )
+                }
             }
+
+            assertTrue(measuredLatch.await(1, TimeUnit.SECONDS))
         }
 
-        assertTrue(measuredLatch.await(1, TimeUnit.SECONDS))
-    }
-
     @Test
-    fun testBox_tracksPropagateMinConstraintsChanges() = with(density) {
-        val measuredLatch = CountDownLatch(2)
+    fun testBox_tracksPropagateMinConstraintsChanges() =
+        with(density) {
+            val measuredLatch = CountDownLatch(2)
 
-        val pmc = mutableStateOf(true)
+            val pmc = mutableStateOf(true)
 
-        show {
-            Box(
-                Modifier.requiredWidthIn(20.dp, 40.dp),
-                propagateMinConstraints = pmc.value,
-                contentAlignment = Alignment.Center
-            ) {
+            show {
                 Box(
-                    Modifier
-                        .width(10.dp)
-                        .onSizeChanged {
+                    Modifier.requiredWidthIn(20.dp, 40.dp),
+                    propagateMinConstraints = pmc.value,
+                    contentAlignment = Alignment.Center
+                ) {
+                    Box(
+                        Modifier.width(10.dp).onSizeChanged {
                             if (measuredLatch.count == 2L) {
                                 assertEquals(20.dp.roundToPx(), it.width)
                                 pmc.value = false
@@ -547,88 +515,90 @@
                             }
                             measuredLatch.countDown()
                         }
-                )
-            }
-        }
-        assertTrue(measuredLatch.await(1, TimeUnit.SECONDS))
-    }
-
-    @Test
-    fun testBox_hasCorrectIntrinsicMeasurements() = with(density) {
-        val testWidth = 90.toDp()
-        val testHeight = 80.toDp()
-
-        val testDimension = 200
-        // When measuring the height with testDimension, width should be double
-        val expectedWidth = testDimension * 2
-        // When measuring the width with testDimension, height should be half
-        val expectedHeight = testDimension / 2
-
-        testIntrinsics(
-            @Composable {
-                Box {
-                    Container(Modifier.align(Alignment.TopStart).aspectRatio(2f)) { }
-                    ConstrainedBox(
-                        DpConstraints.fixed(testWidth, testHeight),
-                        Modifier.align(Alignment.BottomCenter)
-                    ) { }
-                    ConstrainedBox(
-                        DpConstraints.fixed(200.dp, 200.dp),
-                        Modifier.matchParentSize().padding(10.dp)
-                    ) { }
+                    )
                 }
             }
-        ) { minIntrinsicWidth, minIntrinsicHeight, maxIntrinsicWidth, maxIntrinsicHeight ->
-            // Min width.
-            assertEquals(testWidth.roundToPx(), minIntrinsicWidth(0.dp.roundToPx()))
-            assertEquals(expectedWidth, minIntrinsicWidth(testDimension))
-            assertEquals(testWidth.roundToPx(), minIntrinsicWidth(Constraints.Infinity))
-            // Min height.
-            assertEquals(testHeight.roundToPx(), minIntrinsicHeight(0.dp.roundToPx()))
-            assertEquals(expectedHeight, minIntrinsicHeight(testDimension))
-            assertEquals(testHeight.roundToPx(), minIntrinsicHeight(Constraints.Infinity))
-            // Max width.
-            assertEquals(testWidth.roundToPx(), maxIntrinsicWidth(0.dp.roundToPx()))
-            assertEquals(expectedWidth, maxIntrinsicWidth(testDimension))
-            assertEquals(testWidth.roundToPx(), maxIntrinsicWidth(Constraints.Infinity))
-            // Max height.
-            assertEquals(testHeight.roundToPx(), maxIntrinsicHeight(0.dp.roundToPx()))
-            assertEquals(expectedHeight, maxIntrinsicHeight(testDimension))
-            assertEquals(testHeight.roundToPx(), maxIntrinsicHeight(Constraints.Infinity))
+            assertTrue(measuredLatch.await(1, TimeUnit.SECONDS))
         }
-    }
 
     @Test
-    fun testBox_hasCorrectIntrinsicMeasurements_withNoAlignedChildren() = with(density) {
-        testIntrinsics(
-            @Composable {
-                Box {
-                    ConstrainedBox(
-                        modifier = Modifier.matchParentSize().padding(10.dp),
-                        constraints = DpConstraints.fixed(200.dp, 200.dp)
-                    ) { }
+    fun testBox_hasCorrectIntrinsicMeasurements() =
+        with(density) {
+            val testWidth = 90.toDp()
+            val testHeight = 80.toDp()
+
+            val testDimension = 200
+            // When measuring the height with testDimension, width should be double
+            val expectedWidth = testDimension * 2
+            // When measuring the width with testDimension, height should be half
+            val expectedHeight = testDimension / 2
+
+            testIntrinsics(
+                @Composable {
+                    Box {
+                        Container(Modifier.align(Alignment.TopStart).aspectRatio(2f)) {}
+                        ConstrainedBox(
+                            DpConstraints.fixed(testWidth, testHeight),
+                            Modifier.align(Alignment.BottomCenter)
+                        ) {}
+                        ConstrainedBox(
+                            DpConstraints.fixed(200.dp, 200.dp),
+                            Modifier.matchParentSize().padding(10.dp)
+                        ) {}
+                    }
                 }
+            ) { minIntrinsicWidth, minIntrinsicHeight, maxIntrinsicWidth, maxIntrinsicHeight ->
+                // Min width.
+                assertEquals(testWidth.roundToPx(), minIntrinsicWidth(0.dp.roundToPx()))
+                assertEquals(expectedWidth, minIntrinsicWidth(testDimension))
+                assertEquals(testWidth.roundToPx(), minIntrinsicWidth(Constraints.Infinity))
+                // Min height.
+                assertEquals(testHeight.roundToPx(), minIntrinsicHeight(0.dp.roundToPx()))
+                assertEquals(expectedHeight, minIntrinsicHeight(testDimension))
+                assertEquals(testHeight.roundToPx(), minIntrinsicHeight(Constraints.Infinity))
+                // Max width.
+                assertEquals(testWidth.roundToPx(), maxIntrinsicWidth(0.dp.roundToPx()))
+                assertEquals(expectedWidth, maxIntrinsicWidth(testDimension))
+                assertEquals(testWidth.roundToPx(), maxIntrinsicWidth(Constraints.Infinity))
+                // Max height.
+                assertEquals(testHeight.roundToPx(), maxIntrinsicHeight(0.dp.roundToPx()))
+                assertEquals(expectedHeight, maxIntrinsicHeight(testDimension))
+                assertEquals(testHeight.roundToPx(), maxIntrinsicHeight(Constraints.Infinity))
             }
-        ) { minIntrinsicWidth, minIntrinsicHeight, maxIntrinsicWidth, maxIntrinsicHeight ->
-            // Min width.
-            assertEquals(0.dp.roundToPx(), minIntrinsicWidth(50.dp.roundToPx()))
-            assertEquals(0.dp.roundToPx(), minIntrinsicWidth(Constraints.Infinity))
-            // Min height.
-            assertEquals(0.dp.roundToPx(), minIntrinsicHeight(50.dp.roundToPx()))
-            assertEquals(0.dp.roundToPx(), minIntrinsicHeight(Constraints.Infinity))
-            // Max width.
-            assertEquals(0.dp.roundToPx(), maxIntrinsicWidth(50.dp.roundToPx()))
-            assertEquals(0.dp.roundToPx(), maxIntrinsicWidth(Constraints.Infinity))
-            // Max height.
-            assertEquals(0.dp.roundToPx(), maxIntrinsicHeight(50.dp.roundToPx()))
-            assertEquals(0.dp.roundToPx(), maxIntrinsicHeight(Constraints.Infinity))
         }
-    }
+
+    @Test
+    fun testBox_hasCorrectIntrinsicMeasurements_withNoAlignedChildren() =
+        with(density) {
+            testIntrinsics(
+                @Composable {
+                    Box {
+                        ConstrainedBox(
+                            modifier = Modifier.matchParentSize().padding(10.dp),
+                            constraints = DpConstraints.fixed(200.dp, 200.dp)
+                        ) {}
+                    }
+                }
+            ) { minIntrinsicWidth, minIntrinsicHeight, maxIntrinsicWidth, maxIntrinsicHeight ->
+                // Min width.
+                assertEquals(0.dp.roundToPx(), minIntrinsicWidth(50.dp.roundToPx()))
+                assertEquals(0.dp.roundToPx(), minIntrinsicWidth(Constraints.Infinity))
+                // Min height.
+                assertEquals(0.dp.roundToPx(), minIntrinsicHeight(50.dp.roundToPx()))
+                assertEquals(0.dp.roundToPx(), minIntrinsicHeight(Constraints.Infinity))
+                // Max width.
+                assertEquals(0.dp.roundToPx(), maxIntrinsicWidth(50.dp.roundToPx()))
+                assertEquals(0.dp.roundToPx(), maxIntrinsicWidth(Constraints.Infinity))
+                // Max height.
+                assertEquals(0.dp.roundToPx(), maxIntrinsicHeight(50.dp.roundToPx()))
+                assertEquals(0.dp.roundToPx(), maxIntrinsicHeight(Constraints.Infinity))
+            }
+        }
 
     @Test
     fun testAlignInspectableValue() {
-        val modifier = with(BoxScopeInstance) { Modifier.align(Alignment.BottomCenter) }
-            as InspectableValue
+        val modifier =
+            with(BoxScopeInstance) { Modifier.align(Alignment.BottomCenter) } as InspectableValue
         assertThat(modifier.nameFallback).isEqualTo("align")
         assertThat(modifier.valueOverride).isEqualTo(Alignment.BottomCenter)
         assertThat(modifier.inspectableElements.asIterable()).isEmpty()
@@ -636,8 +606,7 @@
 
     @Test
     fun testMatchParentSizeInspectableValue() {
-        val modifier = with(BoxScopeInstance) { Modifier.matchParentSize() }
-            as InspectableValue
+        val modifier = with(BoxScopeInstance) { Modifier.matchParentSize() } as InspectableValue
         assertThat(modifier.nameFallback).isEqualTo("matchParentSize")
         assertThat(modifier.valueOverride).isNull()
         assertThat(modifier.inspectableElements.asIterable()).isEmpty()
diff --git a/compose/foundation/foundation-layout/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/layout/BoxWithConstraintsTest.kt b/compose/foundation/foundation-layout/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/layout/BoxWithConstraintsTest.kt
index 11962f0..6fc4ddb 100644
--- a/compose/foundation/foundation-layout/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/layout/BoxWithConstraintsTest.kt
+++ b/compose/foundation/foundation-layout/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/layout/BoxWithConstraintsTest.kt
@@ -85,24 +85,22 @@
             BoxWithConstraints {
                 topConstraints.value = constraints
                 Padding(size = size) {
-                    val drawModifier = Modifier.drawBehind {
-                        countDownLatch.countDown()
-                    }
+                    val drawModifier = Modifier.drawBehind { countDownLatch.countDown() }
                     BoxWithConstraints(drawModifier) {
                         paddedConstraints.value = constraints
                         Layout(
                             measurePolicy = { _, childConstraints ->
                                 firstChildConstraints.value = childConstraints
-                                layout(size, size) { }
+                                layout(size, size) {}
                             },
-                            content = { }
+                            content = {}
                         )
                         Layout(
                             measurePolicy = { _, chilConstraints ->
                                 secondChildConstraints.value = chilConstraints
-                                layout(size, size) { }
+                                layout(size, size) {}
                             },
-                            content = { }
+                            content = {}
                         )
                     }
                 }
@@ -110,12 +108,13 @@
         }
         assertTrue(countDownLatch.await(1, TimeUnit.SECONDS))
 
-        val expectedPaddedConstraints = Constraints(
-            0,
-            topConstraints.value!!.maxWidth - size * 2,
-            0,
-            topConstraints.value!!.maxHeight - size * 2
-        )
+        val expectedPaddedConstraints =
+            Constraints(
+                0,
+                topConstraints.value!!.maxWidth - size * 2,
+                0,
+                topConstraints.value!!.maxHeight - size * 2
+            )
         assertEquals(expectedPaddedConstraints, paddedConstraints.value)
         assertEquals(paddedConstraints.value, firstChildConstraints.value)
         assertEquals(paddedConstraints.value, secondChildConstraints.value)
@@ -131,30 +130,23 @@
 
         show {
             BoxWithConstraints {
-                val outerModifier = Modifier.drawBehind {
-                    drawRect(model.outerColor)
-                }
+                val outerModifier = Modifier.drawBehind { drawRect(model.outerColor) }
                 Layout(
                     content = {
-                        val innerModifier = Modifier.drawBehind {
-                            drawLatch.countDown()
-                            drawRect(model.innerColor)
-                        }
-                        Layout(
-                            content = {},
-                            modifier = innerModifier
-                        ) { measurables, constraints2 ->
+                        val innerModifier =
+                            Modifier.drawBehind {
+                                drawLatch.countDown()
+                                drawRect(model.innerColor)
+                            }
+                        Layout(content = {}, modifier = innerModifier) { measurables, constraints2
+                            ->
                             layout(model.size, model.size) {}
                         }
                     },
                     modifier = outerModifier
                 ) { measurables, constraints3 ->
-                    val placeable = measurables[0].measure(
-                        Constraints.fixed(
-                            model.size,
-                            model.size
-                        )
-                    )
+                    val placeable =
+                        measurables[0].measure(Constraints.fixed(model.size, model.size))
                     layout(model.size * 3, model.size * 3) {
                         placeable.place(model.size, model.size)
                     }
@@ -167,9 +159,7 @@
         }
 
         drawLatch = CountDownLatch(1)
-        activityTestRule.runOnUiThread {
-            model.size = 10
-        }
+        activityTestRule.runOnUiThread { model.size = 10 }
 
         takeScreenShot(30).apply {
             assertRect(color = white, size = 10)
@@ -178,8 +168,8 @@
     }
 
     /**
-     * WithConstraints will cause a requestLayout during layout in some circumstances.
-     * The test here is the minimal example from a bug.
+     * WithConstraints will cause a requestLayout during layout in some circumstances. The test here
+     * is the minimal example from a bug.
      */
     @SdkSuppress(minSdkVersion = Build.VERSION_CODES.O)
     @Test
@@ -188,9 +178,7 @@
         show {
             Scroller(
                 modifier = Modifier.countdownLatchBackground(Color.Yellow),
-                onScrollPositionChanged = { position, _ ->
-                    offset.value = position
-                },
+                onScrollPositionChanged = { position, _ -> offset.value = position },
                 offset = offset
             ) {
                 // Need to pass some param here to a separate function or else it works fine
@@ -216,16 +204,17 @@
                 // current frame and opens a new one. our model reads during measure()
                 // wasn't possible to survide Frames swicth previously so the model read
                 // within the child Layout wasn't recorded
-                val background = Modifier.paint(
-                    rememberVectorPainter(
-                        name = "testPainter",
-                        defaultWidth = 10.dp,
-                        defaultHeight = 10.dp,
-                        autoMirror = false
-                    ) { _, _ ->
-                        /* intentionally empty */
-                    }
-                )
+                val background =
+                    Modifier.paint(
+                        rememberVectorPainter(
+                            name = "testPainter",
+                            defaultWidth = 10.dp,
+                            defaultHeight = 10.dp,
+                            autoMirror = false
+                        ) { _, _ ->
+                            /* intentionally empty */
+                        }
+                    )
                 Layout(modifier = background, content = {}) { _, _ ->
                     // read the model
                     model.value
@@ -304,27 +293,29 @@
         show {
             Container(width = 200, height = 200) {
                 BoxWithConstraints(
-                    modifier = Modifier.onGloballyPositioned {
-                        // OnPositioned can be fired multiple times with the same value
-                        // for example when requestLayout() was triggered on ComposeView.
-                        // if we called twice, let's make sure we got the correct values.
-                        assertTrue(withConstSize == null || withConstSize == it.size)
-                        withConstSize = it.size
-                        withConstLatch.countDown()
-                    }
-                ) {
-                    Container(
-                        width = size.value, height = size.value,
-                        modifier = Modifier.onGloballyPositioned {
+                    modifier =
+                        Modifier.onGloballyPositioned {
                             // OnPositioned can be fired multiple times with the same value
                             // for example when requestLayout() was triggered on ComposeView.
                             // if we called twice, let's make sure we got the correct values.
-                            assertTrue(childSize == null || childSize == it.size)
-                            childSize = it.size
-                            childLatch.countDown()
+                            assertTrue(withConstSize == null || withConstSize == it.size)
+                            withConstSize = it.size
+                            withConstLatch.countDown()
                         }
-                    ) {
-                    }
+                ) {
+                    Container(
+                        width = size.value,
+                        height = size.value,
+                        modifier =
+                            Modifier.onGloballyPositioned {
+                                // OnPositioned can be fired multiple times with the same value
+                                // for example when requestLayout() was triggered on ComposeView.
+                                // if we called twice, let's make sure we got the correct values.
+                                assertTrue(childSize == null || childSize == it.size)
+                                childSize = it.size
+                                childLatch.countDown()
+                            }
+                    ) {}
                 }
             }
         }
@@ -359,10 +350,8 @@
                         val receivedConstraints = constraints
                         Container(100, 100, infiniteConstraints) {
                             Container(100, 100) {
-                                Layout(
-                                    {},
-                                    Modifier.countdownLatchBackground(Color.Yellow)
-                                ) { _, _ ->
+                                Layout({}, Modifier.countdownLatchBackground(Color.Yellow)) { _, _
+                                    ->
                                     // the same as the value inside ValueModel
                                     val size = receivedConstraints.maxWidth
                                     layout(size, size) {}
@@ -373,14 +362,10 @@
                 }
             }
         }
-        takeScreenShot(100).apply {
-            assertRect(color = Color.Yellow)
-        }
+        takeScreenShot(100).apply { assertRect(color = Color.Yellow) }
 
         drawLatch = CountDownLatch(1)
-        activityTestRule.runOnUiThread {
-            model.value = 50
-        }
+        activityTestRule.runOnUiThread { model.value = 50 }
         takeScreenShot(100).apply {
             assertRect(color = Color.Red, holeSize = 50)
             assertRect(color = Color.Yellow, size = 50)
@@ -420,10 +405,7 @@
         drawLatch = CountDownLatch(2)
 
         show {
-            Container(
-                100, 100,
-                modifier = Modifier.countdownLatchBackground(Color.Red)
-            ) {
+            Container(100, 100, modifier = Modifier.countdownLatchBackground(Color.Red)) {
                 // this component changes the constraints which triggers subcomposition
                 // within onMeasure block
                 ChangingConstraintsLayout(model) {
@@ -447,18 +429,12 @@
                 }
             }
         }
-        takeScreenShot(100).apply {
-            assertRect(color = Color.Yellow)
-        }
+        takeScreenShot(100).apply { assertRect(color = Color.Yellow) }
 
         drawLatch = CountDownLatch(1)
-        activityTestRule.runOnUiThread {
-            model.value = 50
-        }
+        activityTestRule.runOnUiThread { model.value = 50 }
 
-        takeScreenShot(100).apply {
-            assertRect(color = Color.Red)
-        }
+        takeScreenShot(100).apply { assertRect(color = Color.Red) }
     }
 
     @Test
@@ -471,11 +447,12 @@
         show {
             val state = remember { mutableStateOf(false) }
             var lastLayoutValue: Boolean = false
-            val drawModifier = Modifier.drawBehind {
-                // this verifies the layout was remeasured before being drawn
-                assertTrue(lastLayoutValue)
-                drawlatch.countDown()
-            }
+            val drawModifier =
+                Modifier.drawBehind {
+                    // this verifies the layout was remeasured before being drawn
+                    assertTrue(lastLayoutValue)
+                    drawlatch.countDown()
+                }
             Layout(content = {}, modifier = drawModifier) { _, _ ->
                 lastLayoutValue = state.value
                 // this registers the value read
@@ -502,32 +479,33 @@
         show {
             assertEquals(1, outerComposeLatch.count)
             outerComposeLatch.countDown()
-            val content = @Composable {
-                Layout(
-                    content = {
-                        BoxWithConstraints {
-                            assertEquals(1, innerComposeLatch.count)
-                            innerComposeLatch.countDown()
-                            Layout(content = {}) { _, _ ->
-                                assertEquals(1, innerMeasureLatch.count)
-                                innerMeasureLatch.countDown()
-                                layout(100, 100) {
-                                    assertEquals(1, innerLayoutLatch.count)
-                                    innerLayoutLatch.countDown()
+            val content =
+                @Composable {
+                    Layout(
+                        content = {
+                            BoxWithConstraints {
+                                assertEquals(1, innerComposeLatch.count)
+                                innerComposeLatch.countDown()
+                                Layout(content = {}) { _, _ ->
+                                    assertEquals(1, innerMeasureLatch.count)
+                                    innerMeasureLatch.countDown()
+                                    layout(100, 100) {
+                                        assertEquals(1, innerLayoutLatch.count)
+                                        innerLayoutLatch.countDown()
+                                    }
                                 }
                             }
                         }
-                    }
-                ) { measurables, constraints ->
-                    assertEquals(1, outerMeasureLatch.count)
-                    outerMeasureLatch.countDown()
-                    layout(100, 100) {
-                        assertEquals(1, outerLayoutLatch.count)
-                        outerLayoutLatch.countDown()
-                        measurables.forEach { it.measure(constraints).place(0, 0) }
+                    ) { measurables, constraints ->
+                        assertEquals(1, outerMeasureLatch.count)
+                        outerMeasureLatch.countDown()
+                        layout(100, 100) {
+                            assertEquals(1, outerLayoutLatch.count)
+                            outerLayoutLatch.countDown()
+                            measurables.forEach { it.measure(constraints).place(0, 0) }
+                        }
                     }
                 }
-            }
 
             Layout(content) { measurables, _ ->
                 layout(100, 100) {
@@ -563,9 +541,7 @@
                         layout(100, 100) {}
                     }
                 }
-                Container(100, 100) {
-                    BoxWithConstraints {}
-                }
+                Container(100, 100) { BoxWithConstraints {} }
             }
         }
 
@@ -616,20 +592,14 @@
             if (emit) {
                 BoxWithConstraints {
                     composedLatch.countDown()
-                    DisposableEffect(Unit) {
-                        onDispose {
-                            disposedLatch.countDown()
-                        }
-                    }
+                    DisposableEffect(Unit) { onDispose { disposedLatch.countDown() } }
                 }
             }
         }
 
         assertTrue(composedLatch.await(1, TimeUnit.SECONDS))
 
-        activityTestRule.runOnUiThread {
-            emit = false
-        }
+        activityTestRule.runOnUiThread { emit = false }
         assertTrue(disposedLatch.await(1, TimeUnit.SECONDS))
     }
 
@@ -642,27 +612,30 @@
             val minHeightConstraint = 9.dp
             val maxHeightConstraint = 12.dp
             Layout(
-                content = @Composable {
-                    BoxWithConstraints {
-                        with(LocalDensity.current) {
-                            assertEquals(minWidthConstraint.roundToPx(), minWidth.roundToPx())
-                            assertEquals(maxWidthConstraint.roundToPx(), maxWidth.roundToPx())
-                            assertEquals(minHeightConstraint.roundToPx(), minHeight.roundToPx())
-                            assertEquals(maxHeightConstraint.roundToPx(), maxHeight.roundToPx())
+                content =
+                    @Composable {
+                        BoxWithConstraints {
+                            with(LocalDensity.current) {
+                                assertEquals(minWidthConstraint.roundToPx(), minWidth.roundToPx())
+                                assertEquals(maxWidthConstraint.roundToPx(), maxWidth.roundToPx())
+                                assertEquals(minHeightConstraint.roundToPx(), minHeight.roundToPx())
+                                assertEquals(maxHeightConstraint.roundToPx(), maxHeight.roundToPx())
+                            }
+                            latch.countDown()
                         }
-                        latch.countDown()
                     }
-                }
             ) { m, _ ->
                 layout(0, 0) {
-                    m.first().measure(
-                        Constraints(
-                            minWidth = minWidthConstraint.roundToPx(),
-                            maxWidth = maxWidthConstraint.roundToPx(),
-                            minHeight = minHeightConstraint.roundToPx(),
-                            maxHeight = maxHeightConstraint.roundToPx()
+                    m.first()
+                        .measure(
+                            Constraints(
+                                minWidth = minWidthConstraint.roundToPx(),
+                                maxWidth = maxWidthConstraint.roundToPx(),
+                                minHeight = minHeightConstraint.roundToPx(),
+                                maxHeight = maxHeightConstraint.roundToPx()
+                            )
                         )
-                    ).place(IntOffset.Zero)
+                        .place(IntOffset.Zero)
                 }
             }
         }
@@ -695,16 +668,12 @@
 
     @Suppress("DEPRECATION")
     @RequiresApi(Build.VERSION_CODES.O)
-    fun ActivityTestRule<*>.waitAndScreenShot(
-        forceInvalidate: Boolean = true
-    ): Bitmap = waitAndScreenShot(findComposeView(), forceInvalidate)
+    fun ActivityTestRule<*>.waitAndScreenShot(forceInvalidate: Boolean = true): Bitmap =
+        waitAndScreenShot(findComposeView(), forceInvalidate)
 
     @Suppress("DEPRECATION")
     @RequiresApi(Build.VERSION_CODES.O)
-    fun ActivityTestRule<*>.waitAndScreenShot(
-        view: View,
-        forceInvalidate: Boolean = true
-    ): Bitmap {
+    fun ActivityTestRule<*>.waitAndScreenShot(view: View, forceInvalidate: Boolean = true): Bitmap {
         val flushListener = DrawCounterListener(view)
         val offset = intArrayOf(0, 0)
         var handler: Handler? = null
@@ -723,18 +692,18 @@
         val width = view.width
         val height = view.height
 
-        val dest =
-            Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888)
+        val dest = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888)
         val srcRect = android.graphics.Rect(0, 0, width, height)
         srcRect.offset(offset[0], offset[1])
         val latch = CountDownLatch(1)
         var copyResult = 0
-        val onCopyFinished = object : PixelCopy.OnPixelCopyFinishedListener {
-            override fun onPixelCopyFinished(result: Int) {
-                copyResult = result
-                latch.countDown()
+        val onCopyFinished =
+            object : PixelCopy.OnPixelCopyFinishedListener {
+                override fun onPixelCopyFinished(result: Int) {
+                    copyResult = result
+                    latch.countDown()
+                }
             }
-        }
         PixelCopy.request(activity.window, srcRect, dest, onCopyFinished, handler!!)
         assertTrue("Pixel copy latch timed out", latch.await(1, TimeUnit.SECONDS))
         assertEquals(PixelCopy.SUCCESS, copyResult)
@@ -749,29 +718,18 @@
 
 @Composable
 private fun TestLayout(@Suppress("UNUSED_PARAMETER") someInput: Int) {
-    Layout(
-        content = {
-            BoxWithConstraints {
-                NeedsOtherMeasurementComposable(10)
-            }
-        }
-    ) { measurables, constraints ->
+    Layout(content = { BoxWithConstraints { NeedsOtherMeasurementComposable(10) } }) {
+        measurables,
+        constraints ->
         val withConstraintsPlaceable = measurables[0].measure(constraints)
 
-        layout(30, 30) {
-            withConstraintsPlaceable.place(10, 10)
-        }
+        layout(30, 30) { withConstraintsPlaceable.place(10, 10) }
     }
 }
 
 @Composable
 private fun NeedsOtherMeasurementComposable(foo: Int) {
-    Layout(
-        content = {},
-        modifier = Modifier.background(Color.Red)
-    ) { _, _ ->
-        layout(foo, foo) { }
-    }
+    Layout(content = {}, modifier = Modifier.background(Color.Red)) { _, _ -> layout(foo, foo) {} }
 }
 
 @Composable
@@ -779,48 +737,43 @@
     width: Int,
     height: Int,
     modifier: Modifier = Modifier,
-    content: @Composable () ->
-    Unit
-) {
-    Layout(
-        content = content,
-        modifier = modifier,
-        measurePolicy = remember(width, height) {
-            MeasurePolicy { measurables, _ ->
-                val constraint = Constraints(maxWidth = width, maxHeight = height)
-                layout(width, height) {
-                    measurables.forEach {
-                        val placeable = it.measure(constraint)
-                        placeable.place(
-                            (width - placeable.width) / 2,
-                            (height - placeable.height) / 2
-                        )
-                    }
-                }
-            }
-        }
-    )
-}
-
-@Composable
-fun ContainerChildrenAffectsParentSize(
-    width: Int,
-    height: Int,
     content: @Composable () -> Unit
 ) {
     Layout(
         content = content,
-        measurePolicy = remember(width, height) {
-            MeasurePolicy { measurables, _ ->
-                val constraint = Constraints(maxWidth = width, maxHeight = height)
-                val placeables = measurables.map { it.measure(constraint) }
-                layout(width, height) {
-                    placeables.forEach {
-                        it.place((width - width) / 2, (height - height) / 2)
+        modifier = modifier,
+        measurePolicy =
+            remember(width, height) {
+                MeasurePolicy { measurables, _ ->
+                    val constraint = Constraints(maxWidth = width, maxHeight = height)
+                    layout(width, height) {
+                        measurables.forEach {
+                            val placeable = it.measure(constraint)
+                            placeable.place(
+                                (width - placeable.width) / 2,
+                                (height - placeable.height) / 2
+                            )
+                        }
                     }
                 }
             }
-        }
+    )
+}
+
+@Composable
+fun ContainerChildrenAffectsParentSize(width: Int, height: Int, content: @Composable () -> Unit) {
+    Layout(
+        content = content,
+        measurePolicy =
+            remember(width, height) {
+                MeasurePolicy { measurables, _ ->
+                    val constraint = Constraints(maxWidth = width, maxHeight = height)
+                    val placeables = measurables.map { it.measure(constraint) }
+                    layout(width, height) {
+                        placeables.forEach { it.place((width - width) / 2, (height - height) / 2) }
+                    }
+                }
+            }
     )
 }
 
@@ -834,53 +787,47 @@
     }
 }
 
-fun Modifier.background(color: Color): Modifier = drawBehind {
-    drawRect(color)
-}
+fun Modifier.background(color: Color): Modifier = drawBehind { drawRect(color) }
 
-val infiniteConstraints = object : LayoutModifier {
-    override fun MeasureScope.measure(
-        measurable: Measurable,
-        constraints: Constraints
-    ): MeasureResult {
-        val placeable = measurable.measure(Constraints())
-        return layout(constraints.maxWidth, constraints.maxHeight) {
-            placeable.place(0, 0)
+val infiniteConstraints =
+    object : LayoutModifier {
+        override fun MeasureScope.measure(
+            measurable: Measurable,
+            constraints: Constraints
+        ): MeasureResult {
+            val placeable = measurable.measure(Constraints())
+            return layout(constraints.maxWidth, constraints.maxHeight) { placeable.place(0, 0) }
         }
     }
-}
 
 @Composable
-internal fun Padding(
-    size: Int,
-    modifier: Modifier = Modifier,
-    content: @Composable () -> Unit
-) {
+internal fun Padding(size: Int, modifier: Modifier = Modifier, content: @Composable () -> Unit) {
     Layout(
         modifier = modifier,
         measurePolicy = { measurables, constraints ->
             val totalDiff = size * 2
             val targetMinWidth = constraints.minWidth - totalDiff
-            val targetMaxWidth = if (constraints.hasBoundedWidth) {
-                constraints.maxWidth - totalDiff
-            } else {
-                Constraints.Infinity
-            }
+            val targetMaxWidth =
+                if (constraints.hasBoundedWidth) {
+                    constraints.maxWidth - totalDiff
+                } else {
+                    Constraints.Infinity
+                }
             val targetMinHeight = constraints.minHeight - totalDiff
-            val targetMaxHeight = if (constraints.hasBoundedHeight) {
-                constraints.maxHeight - totalDiff
-            } else {
-                Constraints.Infinity
-            }
-            val newConstraints = Constraints(
-                minWidth = targetMinWidth.coerceAtLeast(0),
-                maxWidth = targetMaxWidth.coerceAtLeast(0),
-                minHeight = targetMinHeight.coerceAtLeast(0),
-                maxHeight = targetMaxHeight.coerceAtLeast(0)
-            )
-            val placeables = measurables.map { m ->
-                m.measure(newConstraints)
-            }
+            val targetMaxHeight =
+                if (constraints.hasBoundedHeight) {
+                    constraints.maxHeight - totalDiff
+                } else {
+                    Constraints.Infinity
+                }
+            val newConstraints =
+                Constraints(
+                    minWidth = targetMinWidth.coerceAtLeast(0),
+                    maxWidth = targetMaxWidth.coerceAtLeast(0),
+                    minHeight = targetMinHeight.coerceAtLeast(0),
+                    maxHeight = targetMaxHeight.coerceAtLeast(0)
+                )
+            val placeables = measurables.map { m -> m.measure(newConstraints) }
             var maxWidth = size
             var maxHeight = size
             placeables.forEach { child ->
@@ -888,9 +835,7 @@
                 maxWidth = max(child.width + totalDiff, maxWidth)
             }
             layout(maxWidth, maxHeight) {
-                placeables.forEach { child ->
-                    child.placeRelative(size, size)
-                }
+                placeables.forEach { child -> child.placeRelative(size, size) }
             }
         },
         content = content
@@ -911,9 +856,7 @@
     val halfHoleSize = holeSize / 2
     for (x in centerX - size / 2 until centerX + size / 2) {
         for (y in centerY - size / 2 until centerY + size / 2) {
-            if (abs(x - centerX) > halfHoleSize &&
-                abs(y - centerY) > halfHoleSize
-            ) {
+            if (abs(x - centerX) > halfHoleSize && abs(y - centerY) > halfHoleSize) {
                 val currentColor = Color(getPixel(x, y))
                 assertColorsEqual(color, currentColor)
             }
@@ -948,10 +891,8 @@
     content: @Composable () -> Unit
 ) {
     Layout(modifier = modifier, content = content) { measurables, constraints ->
-        val childConstraints = constraints.copy(
-            maxHeight = constraints.maxHeight,
-            maxWidth = Constraints.Infinity
-        )
+        val childConstraints =
+            constraints.copy(maxHeight = constraints.maxHeight, maxWidth = Constraints.Infinity)
         val childMeasurable = measurables.first()
         val placeable = childMeasurable.measure(childConstraints)
         val width = min(placeable.width, constraints.maxWidth)
@@ -962,8 +903,7 @@
     }
 }
 
-class DrawCounterListener(private val view: View) :
-    ViewTreeObserver.OnPreDrawListener {
+class DrawCounterListener(private val view: View) : ViewTreeObserver.OnPreDrawListener {
     val latch = CountDownLatch(5)
 
     override fun onPreDraw(): Boolean {
diff --git a/compose/foundation/foundation-layout/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/layout/ContextualFlowRowColumnTest.kt b/compose/foundation/foundation-layout/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/layout/ContextualFlowRowColumnTest.kt
index db46f25..690d36f 100644
--- a/compose/foundation/foundation-layout/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/layout/ContextualFlowRowColumnTest.kt
+++ b/compose/foundation/foundation-layout/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/layout/ContextualFlowRowColumnTest.kt
@@ -59,8 +59,7 @@
 @RunWith(AndroidJUnit4::class)
 class ContextualFlowRowColumnTest {
 
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
     @Test
     fun testContextualFlowRow_wrapsToTheNextLine() {
@@ -70,10 +69,7 @@
             with(LocalDensity.current) {
                 Box(Modifier.size(100.toDp())) {
                     ContextualFlowRow(
-                        modifier = Modifier
-                            .onSizeChanged {
-                                height = it.height
-                            },
+                        modifier = Modifier.onSizeChanged { height = it.height },
                         itemCount = 6
                     ) {
                         Box(Modifier.size(20.toDp()))
@@ -94,15 +90,10 @@
             with(LocalDensity.current) {
                 Box(Modifier.size(100.toDp())) {
                     ContextualFlowRow(
-                        modifier = Modifier
-                            .onSizeChanged {
-                                height = it.height
-                            },
+                        modifier = Modifier.onSizeChanged { height = it.height },
                         itemCount = 3
                     ) {
-                        repeat(2) {
-                            Box(Modifier.size(20.toDp()))
-                        }
+                        repeat(2) { Box(Modifier.size(20.toDp())) }
                     }
                 }
             }
@@ -120,16 +111,11 @@
             with(LocalDensity.current) {
                 Box(Modifier.size(100.toDp())) {
                     ContextualFlowRow(
-                        modifier = Modifier
-                            .onSizeChanged {
-                                height = it.height
-                            },
+                        modifier = Modifier.onSizeChanged { height = it.height },
                         itemCount = 3
                     ) { index ->
                         if (index == 0) {
-                            repeat(5) {
-                                Box(Modifier.size(20.toDp()))
-                            }
+                            repeat(5) { Box(Modifier.size(20.toDp())) }
                         } else if (index == 1) {
                             Box(Modifier.size(20.toDp()))
                         }
@@ -150,10 +136,7 @@
             with(LocalDensity.current) {
                 Box(Modifier.size(100.toDp())) {
                     ContextualFlowColumn(
-                        modifier = Modifier
-                            .onSizeChanged {
-                                width = it.width
-                            },
+                        modifier = Modifier.onSizeChanged { width = it.width },
                         itemCount = 6
                     ) {
                         Box(Modifier.size(20.toDp()))
@@ -174,10 +157,7 @@
             with(LocalDensity.current) {
                 Box(Modifier.size(100.toDp())) {
                     ContextualFlowRow(
-                        modifier = Modifier
-                            .onSizeChanged {
-                                height = it.height
-                            },
+                        modifier = Modifier.onSizeChanged { height = it.height },
                         itemCount = 10
                     ) {
                         Box(Modifier.size(20.toDp()))
@@ -198,10 +178,7 @@
             with(LocalDensity.current) {
                 Box(Modifier.size(100.toDp())) {
                     ContextualFlowColumn(
-                        modifier = Modifier
-                            .onSizeChanged {
-                                width = it.width
-                            },
+                        modifier = Modifier.onSizeChanged { width = it.width },
                         itemCount = 10
                     ) {
                         Box(Modifier.size(20.toDp()))
@@ -222,10 +199,7 @@
             with(LocalDensity.current) {
                 Box(Modifier.size(60.toDp())) {
                     ContextualFlowRow(
-                        modifier = Modifier
-                            .onSizeChanged {
-                                height = it.height
-                            },
+                        modifier = Modifier.onSizeChanged { height = it.height },
                         itemCount = 6
                     ) {
                         Box(Modifier.size(20.toDp()))
@@ -245,30 +219,19 @@
             with(LocalDensity.current) {
                 Box(Modifier.size(200.toDp())) {
                     ContextualFlowRow(
-                        modifier = Modifier
-                            .fillMaxWidth(1f)
-                            .wrapContentHeight(),
+                        modifier = Modifier.fillMaxWidth(1f).wrapContentHeight(),
                         horizontalArrangement = Arrangement.spacedBy(20.toDp()),
                         itemCount = 10
                     ) {
-                        if (it in 2..5 || it == 9) {
-                        } else {
-                            Box(
-                                Modifier
-                                    .size(20.toDp())
-                                    .onPlaced {
-                                        itemShown++
-                                    }
-                            )
+                        if (it in 2..5 || it == 9) {} else {
+                            Box(Modifier.size(20.toDp()).onPlaced { itemShown++ })
                         }
                     }
                 }
             }
         }
         rule.waitForIdle()
-        rule.runOnIdle {
-            Truth.assertThat(itemShown).isEqualTo(5)
-        }
+        rule.runOnIdle { Truth.assertThat(itemShown).isEqualTo(5) }
     }
 
     @Test
@@ -280,10 +243,7 @@
                 Box(Modifier.size(60.toDp())) {
                     ContextualFlowColumn(
                         itemCount = 6,
-                        Modifier
-                            .onSizeChanged {
-                                width = it.width
-                            }
+                        Modifier.onSizeChanged { width = it.width }
                     ) {
                         Box(Modifier.size(20.toDp()))
                     }
@@ -304,10 +264,8 @@
                 Box(Modifier.size(60.toDp())) {
                     ContextualFlowRow(
                         itemCount = 6,
-                        Modifier
-                            .onSizeChanged {
-                                height = it.height
-                            }, maxItemsInEachRow = 2
+                        Modifier.onSizeChanged { height = it.height },
+                        maxItemsInEachRow = 2
                     ) {
                         Box(Modifier.size(20.toDp()))
                     }
@@ -328,10 +286,8 @@
                 Box(Modifier.size(60.toDp())) {
                     ContextualFlowColumn(
                         itemCount = 6,
-                        Modifier
-                            .onSizeChanged {
-                                width = it.width
-                            }, maxItemsInEachColumn = 2
+                        Modifier.onSizeChanged { width = it.width },
+                        maxItemsInEachColumn = 2
                     ) {
                         Box(Modifier.size(20.toDp()))
                     }
@@ -352,16 +308,10 @@
                 Box(Modifier.size(60.toDp())) {
                     ContextualFlowRow(
                         itemCount = 6,
-                        Modifier
-                            .onSizeChanged {
-                                height = it.height
-                            }, maxItemsInEachRow = 2
+                        Modifier.onSizeChanged { height = it.height },
+                        maxItemsInEachRow = 2
                     ) {
-                        Box(
-                            Modifier
-                                .size(20.toDp())
-                                .weight(1f, true)
-                        )
+                        Box(Modifier.size(20.toDp()).weight(1f, true))
                     }
                 }
             }
@@ -380,16 +330,10 @@
                 Box(Modifier.size(60.toDp())) {
                     ContextualFlowColumn(
                         itemCount = 6,
-                        Modifier
-                            .onSizeChanged {
-                                width = it.width
-                            }, maxItemsInEachColumn = 2
+                        Modifier.onSizeChanged { width = it.width },
+                        maxItemsInEachColumn = 2
                     ) {
-                        Box(
-                            Modifier
-                                .size(20.toDp())
-                                .weight(1f, true)
-                        )
+                        Box(Modifier.size(20.toDp()).weight(1f, true))
                     }
                 }
             }
@@ -408,10 +352,7 @@
                 Box(Modifier.size(50.toDp())) {
                     ContextualFlowRow(
                         itemCount = 2,
-                        Modifier
-                            .onSizeChanged {
-                                height = it.height
-                            }
+                        Modifier.onSizeChanged { height = it.height }
                     ) {
                         Box(Modifier.size(20.toDp()))
                     }
@@ -434,38 +375,32 @@
         var mainAxisSpacing = 10
         var crossAxisSpacing = 20
         rule.setContent {
-            CompositionLocalProvider(
-                LocalDensity provides NoOpDensity
-            ) {
-                var maxLines by remember {
-                    mutableStateOf(2)
-                }
+            CompositionLocalProvider(LocalDensity provides NoOpDensity) {
+                var maxLines by remember { mutableStateOf(2) }
                 Box(modifier = Modifier.width(320.dp).wrapContentHeight()) {
                     ContextualFlowRow(
                         itemCount = totalCount,
-                        Modifier
-                            .fillMaxWidth(1f)
-                            .wrapContentHeight(align = Alignment.Top),
+                        Modifier.fillMaxWidth(1f).wrapContentHeight(align = Alignment.Top),
                         horizontalArrangement = Arrangement.spacedBy(mainAxisSpacing.dp),
                         verticalArrangement = Arrangement.spacedBy(crossAxisSpacing.dp),
                         maxLines = maxLines,
-                        overflow = ContextualFlowRowOverflow.expandIndicator {
-                            Box(modifier = Modifier
-                                .fillMaxWidth(1f)
-                                .height(eachSize.dp)
-                                .background(Color.Green)
-                                .clickable {
-                                    maxLines += 2
-                                }.onPlaced {
-                                    seeMorePosition = it.positionInParent()
-                                    seeMoreSize = it.size
-                                }
-                            ) {}
-                        },
+                        overflow =
+                            ContextualFlowRowOverflow.expandIndicator {
+                                Box(
+                                    modifier =
+                                        Modifier.fillMaxWidth(1f)
+                                            .height(eachSize.dp)
+                                            .background(Color.Green)
+                                            .clickable { maxLines += 2 }
+                                            .onPlaced {
+                                                seeMorePosition = it.positionInParent()
+                                                seeMoreSize = it.size
+                                            }
+                                ) {}
+                            },
                     ) { index ->
                         Box(
-                            Modifier
-                                .width(eachSize.dp)
+                            Modifier.width(eachSize.dp)
                                 .height(50.dp)
                                 .background(Color.Green)
                                 .onPlaced {
@@ -483,13 +418,9 @@
         var expectedYPosition = 0
         Truth.assertThat(positions.size).isEqualTo(5)
         positions.forEach { position ->
-            Truth
-                .assertThat(position.x)
-                .isEqualTo(expectedXPosition)
+            Truth.assertThat(position.x).isEqualTo(expectedXPosition)
 
-            Truth
-                .assertThat(position.y)
-                .isEqualTo(expectedYPosition)
+            Truth.assertThat(position.y).isEqualTo(expectedYPosition)
             expectedXPosition += eachSize + mainAxisSpacing
         }
         expectedYPosition += eachSize + crossAxisSpacing
@@ -510,42 +441,34 @@
         var mainAxisSpacing = 10
         var crossAxisSpacing = 20
         rule.setContent {
-            CompositionLocalProvider(
-                LocalDensity provides NoOpDensity
-            ) {
-                var maxLines by remember {
-                    mutableStateOf(2)
-                }
+            CompositionLocalProvider(LocalDensity provides NoOpDensity) {
+                var maxLines by remember { mutableStateOf(2) }
                 Box(modifier = Modifier.height(320.dp).wrapContentWidth()) {
                     ContextualFlowColumn(
                         itemCount = totalCount,
-                        Modifier
-                            .fillMaxHeight(1f)
-                            .wrapContentWidth(align = Alignment.Start),
+                        Modifier.fillMaxHeight(1f).wrapContentWidth(align = Alignment.Start),
                         verticalArrangement = Arrangement.spacedBy(mainAxisSpacing.dp),
                         horizontalArrangement = Arrangement.spacedBy(crossAxisSpacing.dp),
                         maxLines = maxLines,
-                        overflow = ContextualFlowColumnOverflow.expandIndicator {
-                            Box(modifier = Modifier
-                                .fillMaxHeight(1f)
-                                .width(eachSize.dp)
-                                .clickable {
-                                    maxLines += 2
-                                }.onPlaced {
-                                    seeMorePosition = it.positionInParent()
-                                    seeMoreSize = it.size
-                                }
-                            ) {}
-                        }
+                        overflow =
+                            ContextualFlowColumnOverflow.expandIndicator {
+                                Box(
+                                    modifier =
+                                        Modifier.fillMaxHeight(1f)
+                                            .width(eachSize.dp)
+                                            .clickable { maxLines += 2 }
+                                            .onPlaced {
+                                                seeMorePosition = it.positionInParent()
+                                                seeMoreSize = it.size
+                                            }
+                                ) {}
+                            }
                     ) { index ->
                         Box(
-                            Modifier
-                                .width(eachSize.dp)
-                                .height(eachSize.dp)
-                                .onPlaced {
-                                    val positionInParent = it.positionInParent()
-                                    positions.add(index, positionInParent)
-                                }
+                            Modifier.width(eachSize.dp).height(eachSize.dp).onPlaced {
+                                val positionInParent = it.positionInParent()
+                                positions.add(index, positionInParent)
+                            }
                         ) {}
                     }
                 }
@@ -557,13 +480,9 @@
         var expectedYPosition = 0
         Truth.assertThat(positions.size).isEqualTo(5)
         positions.forEach { position ->
-            Truth
-                .assertThat(position.x)
-                .isEqualTo(expectedXPosition)
+            Truth.assertThat(position.x).isEqualTo(expectedXPosition)
 
-            Truth
-                .assertThat(position.y)
-                .isEqualTo(expectedYPosition)
+            Truth.assertThat(position.y).isEqualTo(expectedYPosition)
             expectedYPosition += eachSize + mainAxisSpacing
         }
         expectedXPosition += eachSize + crossAxisSpacing
@@ -578,13 +497,10 @@
         val listOfHeights = mutableListOf<Int>()
 
         rule.setContent {
-            CompositionLocalProvider(
-                LocalDensity provides NoOpDensity
-            ) {
+            CompositionLocalProvider(LocalDensity provides NoOpDensity) {
                 ContextualFlowRow(
                     itemCount = 9,
-                    Modifier
-                        .fillMaxWidth(1f)
+                    Modifier.fillMaxWidth(1f)
                         .padding(20.dp)
                         .wrapContentHeight(align = Alignment.Top),
                     horizontalArrangement = Arrangement.spacedBy(10.dp),
@@ -592,10 +508,7 @@
                     maxItemsInEachRow = 3,
                 ) {
                     Box(
-                        Modifier
-                            .onSizeChanged {
-                                listOfHeights.add(it.height)
-                            }
+                        Modifier.onSizeChanged { listOfHeights.add(it.height) }
                             .width(100.dp)
                             .background(Color.Green)
                             .fillMaxRowHeight()
@@ -623,13 +536,10 @@
         val listOfHeights = mutableListOf<Int>()
 
         rule.setContent {
-            CompositionLocalProvider(
-                LocalDensity provides NoOpDensity
-            ) {
+            CompositionLocalProvider(LocalDensity provides NoOpDensity) {
                 ContextualFlowRow(
                     itemCount = 9,
-                    Modifier
-                        .fillMaxWidth(1f)
+                    Modifier.fillMaxWidth(1f)
                         .padding(20.dp)
                         .wrapContentHeight(align = Alignment.Top),
                     horizontalArrangement = Arrangement.spacedBy(10.dp),
@@ -637,10 +547,7 @@
                     maxItemsInEachRow = 3,
                 ) {
                     Box(
-                        Modifier
-                            .onSizeChanged {
-                                listOfHeights.add(it.height)
-                            }
+                        Modifier.onSizeChanged { listOfHeights.add(it.height) }
                             .width(100.dp)
                             .weight(1f, true)
                             .background(Color.Green)
@@ -669,14 +576,11 @@
         val listOfHeights = mutableMapOf<Int, Int>()
 
         rule.setContent {
-            CompositionLocalProvider(
-                LocalDensity provides NoOpDensity
-            ) {
+            CompositionLocalProvider(LocalDensity provides NoOpDensity) {
                 with(LocalDensity.current) {
                     ContextualFlowRow(
                         itemCount = 9,
-                        Modifier
-                            .fillMaxWidth(1f)
+                        Modifier.fillMaxWidth(1f)
                             .padding(20.dp)
                             .wrapContentHeight(align = Alignment.Top, unbounded = true),
                         horizontalArrangement = Arrangement.spacedBy(10.dp),
@@ -684,10 +588,7 @@
                         maxItemsInEachRow = 3,
                     ) {
                         Box(
-                            Modifier
-                                .onSizeChanged { item ->
-                                    listOfHeights[it] = item.height
-                                }
+                            Modifier.onSizeChanged { item -> listOfHeights[it] = item.height }
                                 .width(100.dp)
                                 .background(Color.Green)
                                 .run {
@@ -726,13 +627,10 @@
         val listOfWidths = mutableMapOf<Int, Int>()
 
         rule.setContent {
-            CompositionLocalProvider(
-                LocalDensity provides NoOpDensity
-            ) {
+            CompositionLocalProvider(LocalDensity provides NoOpDensity) {
                 ContextualFlowColumn(
                     itemCount = 9,
-                    Modifier
-                        .wrapContentWidth(align = Alignment.Start)
+                    Modifier.wrapContentWidth(align = Alignment.Start)
                         .padding(20.dp)
                         .fillMaxHeight(1f),
                     horizontalArrangement = Arrangement.spacedBy(20.dp),
@@ -740,10 +638,7 @@
                     maxItemsInEachColumn = 3,
                 ) {
                     Box(
-                        Modifier
-                            .onSizeChanged { item ->
-                                listOfWidths[it] = item.width
-                            }
+                        Modifier.onSizeChanged { item -> listOfWidths[it] = item.width }
                             .height(100.dp)
                             .background(Color.Green)
                             .fillMaxColumnWidth()
@@ -772,13 +667,10 @@
         val listOfWidths = mutableListOf<Int>()
 
         rule.setContent {
-            CompositionLocalProvider(
-                LocalDensity provides NoOpDensity
-            ) {
+            CompositionLocalProvider(LocalDensity provides NoOpDensity) {
                 ContextualFlowColumn(
                     itemCount = 9,
-                    Modifier
-                        .wrapContentWidth(align = Alignment.Start)
+                    Modifier.wrapContentWidth(align = Alignment.Start)
                         .fillMaxHeight(1f)
                         .padding(20.dp),
                     horizontalArrangement = Arrangement.spacedBy(20.dp),
@@ -786,10 +678,7 @@
                     maxItemsInEachColumn = 3,
                 ) {
                     Box(
-                        Modifier
-                            .onSizeChanged {
-                                listOfWidths.add(it.width)
-                            }
+                        Modifier.onSizeChanged { listOfWidths.add(it.width) }
                             .height(100.dp)
                             .weight(1f, true)
                             .background(Color.Green)
@@ -818,13 +707,10 @@
         val listOfWidths = mutableMapOf<Int, Int>()
 
         rule.setContent {
-            CompositionLocalProvider(
-                LocalDensity provides NoOpDensity
-            ) {
+            CompositionLocalProvider(LocalDensity provides NoOpDensity) {
                 ContextualFlowColumn(
                     itemCount = 9,
-                    Modifier
-                        .wrapContentWidth(align = Alignment.Start, unbounded = true)
+                    Modifier.wrapContentWidth(align = Alignment.Start, unbounded = true)
                         .padding(20.dp)
                         .fillMaxWidth(1f),
                     horizontalArrangement = Arrangement.spacedBy(20.dp),
@@ -832,10 +718,7 @@
                     maxItemsInEachColumn = 3,
                 ) { index ->
                     Box(
-                        Modifier
-                            .onSizeChanged {
-                                listOfWidths[index] = it.width
-                            }
+                        Modifier.onSizeChanged { listOfWidths[index] = it.width }
                             .height(100.dp)
                             .background(Color.Green)
                             .run {
@@ -877,10 +760,7 @@
                 Box(Modifier.size(50.toDp())) {
                     ContextualFlowColumn(
                         itemCount = 2,
-                        Modifier
-                            .onSizeChanged {
-                                width = it.width
-                            }
+                        Modifier.onSizeChanged { width = it.width }
                     ) {
                         Box(Modifier.size(20.toDp()))
                     }
@@ -901,10 +781,7 @@
                 Box(Modifier.size(50.toDp())) {
                     ContextualFlowRow(
                         itemCount = 3,
-                        Modifier
-                            .onSizeChanged {
-                                height = it.height
-                            }
+                        Modifier.onSizeChanged { height = it.height }
                     ) {
                         Box(Modifier.size(20.toDp()))
                     }
@@ -925,10 +802,7 @@
                 Box(Modifier.size(50.toDp())) {
                     ContextualFlowColumn(
                         itemCount = 3,
-                        Modifier
-                            .onSizeChanged {
-                                width = it.width
-                            }
+                        Modifier.onSizeChanged { width = it.width }
                     ) {
                         Box(Modifier.size(20.toDp()))
                     }
@@ -949,11 +823,10 @@
             Box(Modifier.size(100.dp)) {
                 ContextualFlowRow(
                     itemCount = 0,
-                    Modifier
-                        .onSizeChanged {
-                            height = it.height
-                            width = it.width
-                        }
+                    Modifier.onSizeChanged {
+                        height = it.height
+                        width = it.width
+                    }
                 ) {}
             }
         }
@@ -972,11 +845,10 @@
             Box(Modifier.size(100.dp)) {
                 ContextualFlowColumn(
                     itemCount = 0,
-                    Modifier
-                        .onSizeChanged {
-                            height = it.height
-                            width = it.width
-                        }
+                    Modifier.onSizeChanged {
+                        height = it.height
+                        width = it.width
+                    }
                 ) {}
             }
         }
@@ -996,15 +868,10 @@
                 Box(Modifier.size(200.toDp())) {
                     ContextualFlowRow(itemCount = 5) {
                         Box(
-                            Modifier
-                                .size(
-                                    20.toDp(),
-                                    shorterHeight.toDp()
-                                )
-                                .onPlaced {
-                                    val positionInParent = it.positionInParent()
-                                    positionInParentY = positionInParent.y
-                                }
+                            Modifier.size(20.toDp(), shorterHeight.toDp()).onPlaced {
+                                val positionInParent = it.positionInParent()
+                                positionInParentY = positionInParent.y
+                            }
                         )
                     }
                 }
@@ -1026,8 +893,7 @@
                 Box(Modifier.size(200.toDp())) {
                     ContextualFlowRow(itemCount = 5) { index ->
                         Box(
-                            Modifier
-                                .align(Alignment.CenterVertically)
+                            Modifier.align(Alignment.CenterVertically)
                                 .size(
                                     20.toDp(),
                                     if (index == 4) {
@@ -1041,7 +907,8 @@
                                         val positionInParent = it.positionInParent()
                                         positionInParentY = positionInParent.y
                                     }
-                                })
+                                }
+                        )
                     }
                 }
             }
@@ -1061,15 +928,10 @@
                 Box(Modifier.size(200.toDp())) {
                     ContextualFlowColumn(itemCount = 5) {
                         Box(
-                            Modifier
-                                .size(
-                                    shorterWidth.toDp(),
-                                    20.toDp()
-                                )
-                                .onPlaced {
-                                    val positionInParent = it.positionInParent()
-                                    positionInParentX = positionInParent.x
-                                }
+                            Modifier.size(shorterWidth.toDp(), 20.toDp()).onPlaced {
+                                val positionInParent = it.positionInParent()
+                                positionInParentX = positionInParent.x
+                            }
                         )
                     }
                 }
@@ -1091,8 +953,7 @@
                 Box(Modifier.size(200.toDp())) {
                     ContextualFlowColumn(itemCount = 5) { index ->
                         Box(
-                            Modifier
-                                .align(Alignment.CenterHorizontally)
+                            Modifier.align(Alignment.CenterHorizontally)
                                 .size(
                                     if (index == 4) {
                                         shorterWidth.toDp()
@@ -1135,13 +996,11 @@
                         horizontalArrangement = Arrangement.SpaceAround
                     ) { index ->
                         Box(
-                            Modifier
-                                .size(20.toDp())
-                                .onPlaced {
-                                    val positionInParent = it.positionInParent()
-                                    val xPosition = positionInParent.x
-                                    xPositions[index] = xPosition
-                                }
+                            Modifier.size(20.toDp()).onPlaced {
+                                val positionInParent = it.positionInParent()
+                                val xPosition = positionInParent.x
+                                xPositions[index] = xPosition
+                            }
                         )
                     }
                 }
@@ -1167,9 +1026,7 @@
         val spacing = 20
         var itemsShownCount = 0
         rule.setContent {
-            CompositionLocalProvider(
-                LocalDensity provides NoOpDensity
-            ) {
+            CompositionLocalProvider(LocalDensity provides NoOpDensity) {
                 ContextualFlowRow(
                     itemCount = totalItems,
                     modifier = Modifier.width(200.dp),
@@ -1178,11 +1035,8 @@
                     overflow = ContextualFlowRowOverflow.Visible
                 ) { index ->
                     Box(
-                        modifier = Modifier
-                            .size(itemSize.dp)
-                            .onPlaced {
-                                itemsShownCount = index + 1
-                            }
+                        modifier =
+                            Modifier.size(itemSize.dp).onPlaced { itemsShownCount = index + 1 }
                     )
                 }
             }
@@ -1200,9 +1054,7 @@
         val spacing = 20
         var itemsShownCount = 0
         rule.setContent {
-            CompositionLocalProvider(
-                LocalDensity provides NoOpDensity
-            ) {
+            CompositionLocalProvider(LocalDensity provides NoOpDensity) {
                 ContextualFlowColumn(
                     itemCount = totalItems,
                     modifier = Modifier.height(200.dp),
@@ -1211,11 +1063,8 @@
                     overflow = ContextualFlowColumnOverflow.Visible
                 ) { index ->
                     Box(
-                        modifier = Modifier
-                            .size(itemSize.dp)
-                            .onPlaced {
-                                itemsShownCount = index + 1
-                            }
+                        modifier =
+                            Modifier.size(itemSize.dp).onPlaced { itemsShownCount = index + 1 }
                     )
                 }
             }
@@ -1234,24 +1083,17 @@
         var itemsShownCount = 0
 
         rule.setContent {
-            CompositionLocalProvider(
-                LocalDensity provides NoOpDensity
-            ) {
+            CompositionLocalProvider(LocalDensity provides NoOpDensity) {
                 ContextualFlowRow(
                     itemCount = totalItems,
-                    modifier = Modifier
-                        .width(200.dp)
-                        .height(maxHeight.dp),
+                    modifier = Modifier.width(200.dp).height(maxHeight.dp),
                     horizontalArrangement = Arrangement.spacedBy(spacing.dp),
                     verticalArrangement = Arrangement.spacedBy(spacing.dp),
                     overflow = ContextualFlowRowOverflow.Visible
                 ) { index ->
                     Box(
-                        modifier = Modifier
-                            .size(itemSize.dp)
-                            .onPlaced {
-                                itemsShownCount = index + 1
-                            }
+                        modifier =
+                            Modifier.size(itemSize.dp).onPlaced { itemsShownCount = index + 1 }
                     )
                 }
             }
@@ -1270,24 +1112,17 @@
         var itemsShownCount = 0
 
         rule.setContent {
-            CompositionLocalProvider(
-                LocalDensity provides NoOpDensity
-            ) {
+            CompositionLocalProvider(LocalDensity provides NoOpDensity) {
                 ContextualFlowColumn(
                     itemCount = totalItems,
-                    modifier = Modifier
-                        .height(200.dp)
-                        .width(maxWidth.dp),
+                    modifier = Modifier.height(200.dp).width(maxWidth.dp),
                     verticalArrangement = Arrangement.spacedBy(spacing.dp),
                     horizontalArrangement = Arrangement.spacedBy(spacing.dp),
                     overflow = ContextualFlowColumnOverflow.Visible
                 ) { index ->
                     Box(
-                        modifier = Modifier
-                            .size(itemSize.dp)
-                            .onPlaced {
-                                itemsShownCount = index + 1
-                            }
+                        modifier =
+                            Modifier.size(itemSize.dp).onPlaced { itemsShownCount = index + 1 }
                     )
                 }
             }
@@ -1306,9 +1141,7 @@
         var itemsShownCount = 0
 
         rule.setContent {
-            CompositionLocalProvider(
-                LocalDensity provides NoOpDensity
-            ) {
+            CompositionLocalProvider(LocalDensity provides NoOpDensity) {
                 ContextualFlowRow(
                     itemCount = totalItems,
                     modifier = Modifier.width(200.dp),
@@ -1317,11 +1150,8 @@
                     overflow = ContextualFlowRowOverflow.Clip
                 ) { index ->
                     Box(
-                        modifier = Modifier
-                            .size(itemSize.dp)
-                            .onPlaced {
-                                itemsShownCount = index + 1
-                            }
+                        modifier =
+                            Modifier.size(itemSize.dp).onPlaced { itemsShownCount = index + 1 }
                     )
                 }
             }
@@ -1340,9 +1170,7 @@
         var itemsShownCount = 0
 
         rule.setContent {
-            CompositionLocalProvider(
-                LocalDensity provides NoOpDensity
-            ) {
+            CompositionLocalProvider(LocalDensity provides NoOpDensity) {
                 ContextualFlowColumn(
                     itemCount = totalItems,
                     modifier = Modifier.height(200.dp),
@@ -1351,11 +1179,8 @@
                     overflow = ContextualFlowColumnOverflow.Clip
                 ) { index ->
                     Box(
-                        modifier = Modifier
-                            .size(itemSize.dp)
-                            .onPlaced {
-                                itemsShownCount = index + 1
-                            }
+                        modifier =
+                            Modifier.size(itemSize.dp).onPlaced { itemsShownCount = index + 1 }
                     )
                 }
             }
@@ -1374,24 +1199,17 @@
         var itemsShownCount = 0
 
         rule.setContent {
-            CompositionLocalProvider(
-                LocalDensity provides NoOpDensity
-            ) {
+            CompositionLocalProvider(LocalDensity provides NoOpDensity) {
                 ContextualFlowRow(
                     itemCount = totalItems,
-                    modifier = Modifier
-                        .width(200.dp)
-                        .height(maxHeight.dp),
+                    modifier = Modifier.width(200.dp).height(maxHeight.dp),
                     horizontalArrangement = Arrangement.spacedBy(spacing.dp),
                     verticalArrangement = Arrangement.spacedBy(spacing.dp),
                     overflow = ContextualFlowRowOverflow.Clip
                 ) { index ->
                     Box(
-                        modifier = Modifier
-                            .size(itemSize.dp)
-                            .onPlaced {
-                                itemsShownCount = index + 1
-                            }
+                        modifier =
+                            Modifier.size(itemSize.dp).onPlaced { itemsShownCount = index + 1 }
                     )
                 }
             }
@@ -1410,24 +1228,17 @@
         var itemsShownCount = 0
 
         rule.setContent {
-            CompositionLocalProvider(
-                LocalDensity provides NoOpDensity
-            ) {
+            CompositionLocalProvider(LocalDensity provides NoOpDensity) {
                 ContextualFlowColumn(
                     itemCount = totalItems,
-                    modifier = Modifier
-                        .height(200.dp)
-                        .width(maxWidth.dp),
+                    modifier = Modifier.height(200.dp).width(maxWidth.dp),
                     verticalArrangement = Arrangement.spacedBy(spacing.dp),
                     horizontalArrangement = Arrangement.spacedBy(spacing.dp),
                     overflow = ContextualFlowColumnOverflow.Clip
                 ) { index ->
                     Box(
-                        modifier = Modifier
-                            .size(itemSize.dp)
-                            .onPlaced {
-                                itemsShownCount = index + 1
-                            }
+                        modifier =
+                            Modifier.size(itemSize.dp).onPlaced { itemsShownCount = index + 1 }
                     )
                 }
             }
@@ -1449,38 +1260,32 @@
 
         rule.setContent {
             var maxLines by remember { mutableStateOf(2) }
-            CompositionLocalProvider(
-                LocalDensity provides NoOpDensity
-            ) {
+            CompositionLocalProvider(LocalDensity provides NoOpDensity) {
                 ContextualFlowRow(
                     itemCount = totalItems,
                     modifier = Modifier.width(200.dp),
                     horizontalArrangement = Arrangement.spacedBy(spacing.dp),
                     maxLines = maxLines,
-                    overflow = ContextualFlowRowOverflow.expandIndicator {
-                        seeMoreTag = "seeMoreTag$shownItemCount"
-                        Box(
-                            modifier = Modifier
-                                .clickable {
-                                    itemsShownCount = 0
-                                    seeMoreShown = false
-                                    maxLines += 2
-                                    finalMaxLines = maxLines
-                                }
-                                .size(itemSize.dp)
-                                .testTag(seeMoreTag)
-                                .onPlaced {
-                                    seeMoreShown = true
-                                }
-                        )
-                    }
+                    overflow =
+                        ContextualFlowRowOverflow.expandIndicator {
+                            seeMoreTag = "seeMoreTag$shownItemCount"
+                            Box(
+                                modifier =
+                                    Modifier.clickable {
+                                            itemsShownCount = 0
+                                            seeMoreShown = false
+                                            maxLines += 2
+                                            finalMaxLines = maxLines
+                                        }
+                                        .size(itemSize.dp)
+                                        .testTag(seeMoreTag)
+                                        .onPlaced { seeMoreShown = true }
+                            )
+                        }
                 ) { index ->
                     Box(
-                        modifier = Modifier
-                            .size(itemSize.dp)
-                            .onPlaced {
-                                itemsShownCount = index + 1
-                            }
+                        modifier =
+                            Modifier.size(itemSize.dp).onPlaced { itemsShownCount = index + 1 }
                     )
                 }
             }
@@ -1491,8 +1296,7 @@
             Truth.assertThat(itemsShownCount).isEqualTo(5)
             Truth.assertThat(seeMoreShown).isTrue()
         }
-        rule.onNodeWithTag(seeMoreTag)
-            .performTouchInput { click() }
+        rule.onNodeWithTag(seeMoreTag).performTouchInput { click() }
 
         advanceClock()
 
@@ -1502,8 +1306,7 @@
             Truth.assertThat(seeMoreShown).isTrue()
         }
 
-        rule.onNodeWithTag(seeMoreTag)
-            .performTouchInput { click() }
+        rule.onNodeWithTag(seeMoreTag).performTouchInput { click() }
 
         advanceClock()
         rule.runOnIdle {
@@ -1525,38 +1328,32 @@
 
         rule.setContent {
             var maxLines by remember { mutableStateOf(2) }
-            CompositionLocalProvider(
-                LocalDensity provides NoOpDensity
-            ) {
+            CompositionLocalProvider(LocalDensity provides NoOpDensity) {
                 ContextualFlowColumn(
                     itemCount = totalItems,
                     modifier = Modifier.height(200.dp),
                     verticalArrangement = Arrangement.spacedBy(spacing.dp),
                     maxLines = maxLines,
-                    overflow = ContextualFlowColumnOverflow.expandIndicator {
-                        seeMoreTag = "SeeMoreTag$shownItemCount"
-                        Box(
-                            modifier = Modifier
-                                .clickable {
-                                    itemsShownCount = 0
-                                    seeMoreShown = false
-                                    maxLines += 2
-                                    finalMaxLines = maxLines
-                                }
-                                .size(itemSize.dp)
-                                .testTag(seeMoreTag)
-                                .onPlaced {
-                                    seeMoreShown = true
-                                }
-                        )
-                    }
+                    overflow =
+                        ContextualFlowColumnOverflow.expandIndicator {
+                            seeMoreTag = "SeeMoreTag$shownItemCount"
+                            Box(
+                                modifier =
+                                    Modifier.clickable {
+                                            itemsShownCount = 0
+                                            seeMoreShown = false
+                                            maxLines += 2
+                                            finalMaxLines = maxLines
+                                        }
+                                        .size(itemSize.dp)
+                                        .testTag(seeMoreTag)
+                                        .onPlaced { seeMoreShown = true }
+                            )
+                        }
                 ) { index ->
                     Box(
-                        modifier = Modifier
-                            .size(itemSize.dp)
-                            .onPlaced {
-                                itemsShownCount = index + 1
-                            }
+                        modifier =
+                            Modifier.size(itemSize.dp).onPlaced { itemsShownCount = index + 1 }
                     )
                 }
             }
@@ -1567,8 +1364,7 @@
             Truth.assertThat(itemsShownCount).isEqualTo(5)
             Truth.assertThat(seeMoreShown).isTrue()
         }
-        rule.onNodeWithTag(seeMoreTag)
-            .performTouchInput { click() }
+        rule.onNodeWithTag(seeMoreTag).performTouchInput { click() }
 
         advanceClock()
 
@@ -1578,8 +1374,7 @@
             Truth.assertThat(seeMoreShown).isTrue()
         }
 
-        rule.onNodeWithTag(seeMoreTag)
-            .performTouchInput { click() }
+        rule.onNodeWithTag(seeMoreTag).performTouchInput { click() }
 
         advanceClock()
         rule.runOnIdle {
@@ -1601,38 +1396,32 @@
 
         rule.setContent {
             var maxHeight by remember { mutableStateOf(120.dp) }
-            CompositionLocalProvider(
-                LocalDensity provides NoOpDensity
-            ) {
+            CompositionLocalProvider(LocalDensity provides NoOpDensity) {
                 ContextualFlowRow(
                     itemCount = totalItems,
-                    modifier = Modifier
-                        .width(200.dp)
-                        .height(maxHeight),
+                    modifier = Modifier.width(200.dp).height(maxHeight),
                     horizontalArrangement = Arrangement.spacedBy(spacing.dp),
                     verticalArrangement = Arrangement.spacedBy(spacing.dp),
-                    overflow = ContextualFlowRowOverflow.expandIndicator {
-                        seeMoreTag = "seeMoreTag$shownItemCount"
-                        Box(
-                            modifier = Modifier
-                                .clickable {
-                                    itemsShownCount = 0
-                                    seeMoreShown = false
-                                    maxHeight += 100.dp + (spacing.dp * 2)
-                                    finalMaxHeight = maxHeight
-                                }
-                                .size(itemSize.dp)
-                                .testTag(seeMoreTag)
-                                .onGloballyPositioned {
-                                    seeMoreShown = true
-                                }
-                        )
-                    }
+                    overflow =
+                        ContextualFlowRowOverflow.expandIndicator {
+                            seeMoreTag = "seeMoreTag$shownItemCount"
+                            Box(
+                                modifier =
+                                    Modifier.clickable {
+                                            itemsShownCount = 0
+                                            seeMoreShown = false
+                                            maxHeight += 100.dp + (spacing.dp * 2)
+                                            finalMaxHeight = maxHeight
+                                        }
+                                        .size(itemSize.dp)
+                                        .testTag(seeMoreTag)
+                                        .onGloballyPositioned { seeMoreShown = true }
+                            )
+                        }
                 ) { index ->
                     Box(
-                        modifier = Modifier
-                            .size(itemSize.dp)
-                            .onGloballyPositioned {
+                        modifier =
+                            Modifier.size(itemSize.dp).onGloballyPositioned {
                                 itemsShownCount = index + 1
                             }
                     )
@@ -1646,8 +1435,7 @@
             Truth.assertThat(seeMoreShown).isTrue()
             itemsShownCount = 0
         }
-        rule.onNodeWithTag(seeMoreTag)
-            .performTouchInput { click() }
+        rule.onNodeWithTag(seeMoreTag).performTouchInput { click() }
 
         advanceClock()
 
@@ -1658,8 +1446,7 @@
             itemsShownCount = 0
         }
 
-        rule.onNodeWithTag(seeMoreTag)
-            .performTouchInput { click() }
+        rule.onNodeWithTag(seeMoreTag).performTouchInput { click() }
 
         advanceClock()
         rule.runOnIdle {
@@ -1681,38 +1468,32 @@
 
         rule.setContent {
             var maxWidth by remember { mutableStateOf(120.dp) }
-            CompositionLocalProvider(
-                LocalDensity provides NoOpDensity
-            ) {
+            CompositionLocalProvider(LocalDensity provides NoOpDensity) {
                 ContextualFlowColumn(
                     itemCount = totalItems,
-                    modifier = Modifier
-                        .height(200.dp)
-                        .width(maxWidth),
+                    modifier = Modifier.height(200.dp).width(maxWidth),
                     verticalArrangement = Arrangement.spacedBy(spacing.dp),
                     horizontalArrangement = Arrangement.spacedBy(spacing.dp),
-                    overflow = ContextualFlowColumnOverflow.expandIndicator {
-                        seeMoreTag = "seeMoreTag$shownItemCount"
-                        Box(
-                            modifier = Modifier
-                                .clickable {
-                                    itemsShownCount = 0
-                                    seeMoreShown = false
-                                    maxWidth += 100.dp + (spacing.dp * 2)
-                                    finalMaxWidth = maxWidth
-                                }
-                                .size(itemSize.dp)
-                                .testTag(seeMoreTag)
-                                .onGloballyPositioned {
-                                    seeMoreShown = true
-                                }
-                        )
-                    }
+                    overflow =
+                        ContextualFlowColumnOverflow.expandIndicator {
+                            seeMoreTag = "seeMoreTag$shownItemCount"
+                            Box(
+                                modifier =
+                                    Modifier.clickable {
+                                            itemsShownCount = 0
+                                            seeMoreShown = false
+                                            maxWidth += 100.dp + (spacing.dp * 2)
+                                            finalMaxWidth = maxWidth
+                                        }
+                                        .size(itemSize.dp)
+                                        .testTag(seeMoreTag)
+                                        .onGloballyPositioned { seeMoreShown = true }
+                            )
+                        }
                 ) { index ->
                     Box(
-                        modifier = Modifier
-                            .size(itemSize.dp)
-                            .onGloballyPositioned {
+                        modifier =
+                            Modifier.size(itemSize.dp).onGloballyPositioned {
                                 itemsShownCount = index + 1
                             }
                     )
@@ -1726,8 +1507,7 @@
             Truth.assertThat(seeMoreShown).isTrue()
             itemsShownCount = 0
         }
-        rule.onNodeWithTag(seeMoreTag)
-            .performTouchInput { click() }
+        rule.onNodeWithTag(seeMoreTag).performTouchInput { click() }
 
         advanceClock()
 
@@ -1738,8 +1518,7 @@
             itemsShownCount = 0
         }
 
-        rule.onNodeWithTag(seeMoreTag)
-            .performTouchInput { click() }
+        rule.onNodeWithTag(seeMoreTag).performTouchInput { click() }
 
         advanceClock()
         rule.runOnIdle {
@@ -1757,45 +1536,35 @@
 
         rule.setContent {
             var maxLines by remember { mutableStateOf(2) }
-            CompositionLocalProvider(
-                LocalDensity provides NoOpDensity
-            ) {
+            CompositionLocalProvider(LocalDensity provides NoOpDensity) {
                 ContextualFlowRow(
                     itemCount = totalItems,
                     modifier = Modifier.width(200.dp),
                     horizontalArrangement = Arrangement.spacedBy(spacing.dp),
                     maxLines = maxLines,
-                    overflow = ContextualFlowRowOverflow.expandOrCollapseIndicator(
-                        expandIndicator = {
-                            val remainingItems = totalItems - shownItemCount
-                            if (remainingItems > 0) {
-                                Box(
-                                    modifier = Modifier
-                                        .clickable {
-                                            maxLines += 2
-                                        }
-                                        .size(itemSize.dp)
-                                )
+                    overflow =
+                        ContextualFlowRowOverflow.expandOrCollapseIndicator(
+                            expandIndicator = {
+                                val remainingItems = totalItems - shownItemCount
+                                if (remainingItems > 0) {
+                                    Box(
+                                        modifier =
+                                            Modifier.clickable { maxLines += 2 }.size(itemSize.dp)
+                                    )
+                                }
+                            },
+                            collapseIndicator = {
+                                val remainingItems = totalItems - shownItemCount
+                                if (remainingItems > 0) {
+                                    Box(
+                                        modifier =
+                                            Modifier.clickable { maxLines += 2 }.size(itemSize.dp)
+                                    )
+                                }
                             }
-                        },
-                        collapseIndicator = {
-                            val remainingItems = totalItems - shownItemCount
-                            if (remainingItems > 0) {
-                                Box(
-                                    modifier = Modifier
-                                        .clickable {
-                                            maxLines += 2
-                                        }
-                                        .size(itemSize.dp)
-                                )
-                            }
-                        }
-                    )
+                        )
                 ) {
-                    Box(
-                        modifier = Modifier
-                            .size(itemSize.dp)
-                    )
+                    Box(modifier = Modifier.size(itemSize.dp))
                 }
             }
         }
@@ -1809,45 +1578,35 @@
 
         rule.setContent {
             var maxLines by remember { mutableStateOf(2) }
-            CompositionLocalProvider(
-                LocalDensity provides NoOpDensity
-            ) {
+            CompositionLocalProvider(LocalDensity provides NoOpDensity) {
                 ContextualFlowColumn(
                     itemCount = totalItems,
                     modifier = Modifier.height(200.dp),
                     verticalArrangement = Arrangement.spacedBy(spacing.dp),
                     maxLines = maxLines,
-                    overflow = ContextualFlowColumnOverflow.expandOrCollapseIndicator(
-                        expandIndicator = {
-                            val remainingItems = totalItems - shownItemCount
-                            if (remainingItems > 0) {
-                                Box(
-                                    modifier = Modifier
-                                        .clickable {
-                                            maxLines += 2
-                                        }
-                                        .size(itemSize.dp)
-                                )
+                    overflow =
+                        ContextualFlowColumnOverflow.expandOrCollapseIndicator(
+                            expandIndicator = {
+                                val remainingItems = totalItems - shownItemCount
+                                if (remainingItems > 0) {
+                                    Box(
+                                        modifier =
+                                            Modifier.clickable { maxLines += 2 }.size(itemSize.dp)
+                                    )
+                                }
+                            },
+                            collapseIndicator = {
+                                val remainingItems = totalItems - shownItemCount
+                                if (remainingItems > 0) {
+                                    Box(
+                                        modifier =
+                                            Modifier.clickable { maxLines += 2 }.size(itemSize.dp)
+                                    )
+                                }
                             }
-                        },
-                        collapseIndicator = {
-                            val remainingItems = totalItems - shownItemCount
-                            if (remainingItems > 0) {
-                                Box(
-                                    modifier = Modifier
-                                        .clickable {
-                                            maxLines += 2
-                                        }
-                                        .size(itemSize.dp)
-                                )
-                            }
-                        }
-                    )
+                        )
                 ) {
-                    Box(
-                        modifier = Modifier
-                            .size(itemSize.dp)
-                    )
+                    Box(modifier = Modifier.size(itemSize.dp))
                 }
             }
         }
@@ -1869,67 +1628,55 @@
 
         rule.setContent {
             var maxLines by remember { mutableStateOf(2) }
-            CompositionLocalProvider(
-                LocalDensity provides NoOpDensity
-            ) {
+            CompositionLocalProvider(LocalDensity provides NoOpDensity) {
                 ContextualFlowRow(
                     itemCount = totalItems,
                     modifier = Modifier.width(200.dp),
                     horizontalArrangement = Arrangement.spacedBy(spacing.dp),
                     maxLines = maxLines,
-                    overflow = ContextualFlowRowOverflow.expandOrCollapseIndicator(
-                        expandIndicator = {
-                            expandOnScope = this
-                            seeMoreTag = "seeMoreTag$shownItemCount"
-                            Box(
-                                modifier = Modifier
-                                    .clickable {
-                                        itemsShownCount = 0
-                                        seeMoreShown = false
-                                        collapseShown = false
-                                        maxLines += 2
-                                        finalMaxLines = maxLines
-                                    }
-                                    .size(itemSize.dp)
-                                    .testTag(seeMoreTag)
-                                    .onGloballyPositioned {
-                                        seeMoreShown = true
-                                    }
-                                    .onPlaced {
-                                        seeMoreShown = true
-                                    }
-                            )
-                        },
-                        collapseIndicator = {
-                            collapseOnScope = this
-                            collapseTag = "collapseTag$shownItemCount"
-                            Box(
-                                modifier = Modifier
-                                    .clickable {
-                                        itemsShownCount = 0
-                                        seeMoreShown = false
-                                        collapseShown = false
-                                        maxLines = 2
-                                        finalMaxLines = maxLines
-                                    }
-                                    .size(itemSize.dp)
-                                    .testTag(collapseTag)
-                                    .onGloballyPositioned {
-                                        collapseShown = true
-                                    }
-                                    .onPlaced {
-                                        collapseShown = true
-                                    }
-                            )
-                        }
-                    )
+                    overflow =
+                        ContextualFlowRowOverflow.expandOrCollapseIndicator(
+                            expandIndicator = {
+                                expandOnScope = this
+                                seeMoreTag = "seeMoreTag$shownItemCount"
+                                Box(
+                                    modifier =
+                                        Modifier.clickable {
+                                                itemsShownCount = 0
+                                                seeMoreShown = false
+                                                collapseShown = false
+                                                maxLines += 2
+                                                finalMaxLines = maxLines
+                                            }
+                                            .size(itemSize.dp)
+                                            .testTag(seeMoreTag)
+                                            .onGloballyPositioned { seeMoreShown = true }
+                                            .onPlaced { seeMoreShown = true }
+                                )
+                            },
+                            collapseIndicator = {
+                                collapseOnScope = this
+                                collapseTag = "collapseTag$shownItemCount"
+                                Box(
+                                    modifier =
+                                        Modifier.clickable {
+                                                itemsShownCount = 0
+                                                seeMoreShown = false
+                                                collapseShown = false
+                                                maxLines = 2
+                                                finalMaxLines = maxLines
+                                            }
+                                            .size(itemSize.dp)
+                                            .testTag(collapseTag)
+                                            .onGloballyPositioned { collapseShown = true }
+                                            .onPlaced { collapseShown = true }
+                                )
+                            }
+                        )
                 ) { index ->
                     Box(
-                        modifier = Modifier
-                            .size(itemSize.dp)
-                            .onPlaced {
-                                itemsShownCount = index + 1
-                            }
+                        modifier =
+                            Modifier.size(itemSize.dp).onPlaced { itemsShownCount = index + 1 }
                     )
                 }
             }
@@ -1943,8 +1690,7 @@
             Truth.assertThat(expandOnScope.shownItemCount).isEqualTo(collapseOnScope.shownItemCount)
             Truth.assertThat(expandOnScope.shownItemCount).isEqualTo(itemsShownCount)
         }
-        rule.onNodeWithTag(seeMoreTag)
-            .performTouchInput { click() }
+        rule.onNodeWithTag(seeMoreTag).performTouchInput { click() }
 
         advanceClock()
 
@@ -1957,8 +1703,7 @@
             Truth.assertThat(expandOnScope.shownItemCount).isEqualTo(itemsShownCount)
         }
 
-        rule.onNodeWithTag(seeMoreTag)
-            .performTouchInput { click() }
+        rule.onNodeWithTag(seeMoreTag).performTouchInput { click() }
 
         advanceClock()
         rule.runOnIdle {
@@ -1970,8 +1715,7 @@
             Truth.assertThat(expandOnScope.shownItemCount).isEqualTo(itemsShownCount)
         }
 
-        rule.onNodeWithTag(seeMoreTag)
-            .performTouchInput { click() }
+        rule.onNodeWithTag(seeMoreTag).performTouchInput { click() }
 
         advanceClock()
         rule.runOnIdle {
@@ -1982,8 +1726,7 @@
             Truth.assertThat(expandOnScope.shownItemCount).isEqualTo(collapseOnScope.shownItemCount)
             Truth.assertThat(expandOnScope.shownItemCount).isEqualTo(itemsShownCount)
         }
-        rule.onNodeWithTag(collapseTag)
-            .performTouchInput { click() }
+        rule.onNodeWithTag(collapseTag).performTouchInput { click() }
 
         advanceClock()
 
@@ -2012,67 +1755,55 @@
 
         rule.setContent {
             var maxLines by remember { mutableStateOf(2) }
-            CompositionLocalProvider(
-                LocalDensity provides NoOpDensity
-            ) {
+            CompositionLocalProvider(LocalDensity provides NoOpDensity) {
                 ContextualFlowColumn(
                     itemCount = totalItems,
                     modifier = Modifier.height(200.dp),
                     verticalArrangement = Arrangement.spacedBy(spacing.dp),
                     maxLines = maxLines,
-                    overflow = ContextualFlowColumnOverflow.expandOrCollapseIndicator(
-                        expandIndicator = {
-                            itemsShownOnExpand = shownItemCount
-                            seeMoreTag = "seeMoreTag$shownItemCount"
-                            Box(
-                                modifier = Modifier
-                                    .clickable {
-                                        itemsShownCount = 0
-                                        seeMoreShown = false
-                                        collapseShown = false
-                                        maxLines += 2
-                                        finalMaxLines = maxLines
-                                    }
-                                    .size(itemSize.dp)
-                                    .testTag(seeMoreTag)
-                                    .onGloballyPositioned {
-                                        seeMoreShown = true
-                                    }
-                                    .onPlaced {
-                                        seeMoreShown = true
-                                    }
-                            )
-                        },
-                        collapseIndicator = {
-                            itemsShownOnCollapse = shownItemCount
-                            collapseTag = "collapseTag$shownItemCount"
-                            Box(
-                                modifier = Modifier
-                                    .clickable {
-                                        itemsShownCount = 0
-                                        seeMoreShown = false
-                                        collapseShown = false
-                                        maxLines = 2
-                                        finalMaxLines = maxLines
-                                    }
-                                    .size(itemSize.dp)
-                                    .testTag(collapseTag)
-                                    .onGloballyPositioned {
-                                        collapseShown = true
-                                    }
-                                    .onPlaced {
-                                        collapseShown = true
-                                    }
-                            )
-                        }
-                    )
+                    overflow =
+                        ContextualFlowColumnOverflow.expandOrCollapseIndicator(
+                            expandIndicator = {
+                                itemsShownOnExpand = shownItemCount
+                                seeMoreTag = "seeMoreTag$shownItemCount"
+                                Box(
+                                    modifier =
+                                        Modifier.clickable {
+                                                itemsShownCount = 0
+                                                seeMoreShown = false
+                                                collapseShown = false
+                                                maxLines += 2
+                                                finalMaxLines = maxLines
+                                            }
+                                            .size(itemSize.dp)
+                                            .testTag(seeMoreTag)
+                                            .onGloballyPositioned { seeMoreShown = true }
+                                            .onPlaced { seeMoreShown = true }
+                                )
+                            },
+                            collapseIndicator = {
+                                itemsShownOnCollapse = shownItemCount
+                                collapseTag = "collapseTag$shownItemCount"
+                                Box(
+                                    modifier =
+                                        Modifier.clickable {
+                                                itemsShownCount = 0
+                                                seeMoreShown = false
+                                                collapseShown = false
+                                                maxLines = 2
+                                                finalMaxLines = maxLines
+                                            }
+                                            .size(itemSize.dp)
+                                            .testTag(collapseTag)
+                                            .onGloballyPositioned { collapseShown = true }
+                                            .onPlaced { collapseShown = true }
+                                )
+                            }
+                        )
                 ) { index ->
                     Box(
-                        modifier = Modifier
-                            .size(itemSize.dp)
-                            .onPlaced {
-                                itemsShownCount = index + 1
-                            }
+                        modifier =
+                            Modifier.size(itemSize.dp).onPlaced { itemsShownCount = index + 1 }
                     )
                 }
             }
@@ -2086,8 +1817,7 @@
             Truth.assertThat(itemsShownOnCollapse).isEqualTo(0)
             Truth.assertThat(itemsShownOnExpand).isEqualTo(itemsShownCount)
         }
-        rule.onNodeWithTag(seeMoreTag)
-            .performTouchInput { click() }
+        rule.onNodeWithTag(seeMoreTag).performTouchInput { click() }
 
         advanceClock()
 
@@ -2099,8 +1829,7 @@
             Truth.assertThat(itemsShownOnExpand).isEqualTo(itemsShownCount)
         }
 
-        rule.onNodeWithTag(seeMoreTag)
-            .performTouchInput { click() }
+        rule.onNodeWithTag(seeMoreTag).performTouchInput { click() }
 
         advanceClock()
         rule.runOnIdle {
@@ -2111,8 +1840,7 @@
             Truth.assertThat(itemsShownOnExpand).isEqualTo(itemsShownCount)
         }
 
-        rule.onNodeWithTag(seeMoreTag)
-            .performTouchInput { click() }
+        rule.onNodeWithTag(seeMoreTag).performTouchInput { click() }
 
         advanceClock()
         rule.runOnIdle {
@@ -2122,8 +1850,7 @@
             Truth.assertThat(seeMoreShown).isFalse()
             Truth.assertThat(itemsShownOnCollapse).isEqualTo(itemsShownCount)
         }
-        rule.onNodeWithTag(collapseTag)
-            .performTouchInput { click() }
+        rule.onNodeWithTag(collapseTag).performTouchInput { click() }
 
         advanceClock()
 
@@ -2153,60 +1880,53 @@
 
         rule.setContent {
             var maxLines by remember { mutableStateOf(2) }
-            CompositionLocalProvider(
-                LocalDensity provides NoOpDensity
-            ) {
+            CompositionLocalProvider(LocalDensity provides NoOpDensity) {
                 ContextualFlowRow(
                     modifier = Modifier.width(200.dp),
                     horizontalArrangement = Arrangement.spacedBy(spacing.dp),
                     maxLines = maxLines,
-                    overflow = ContextualFlowRowOverflow.expandOrCollapseIndicator(
-                        expandIndicator = {
-                            seeMoreTag = "seeMoreTag$shownItemCount"
-                            itemsShownOnExpand = shownItemCount
-                            Box(
-                                modifier = Modifier
-                                    .clickable {
-                                        itemsShownCount = 0
-                                        seeMoreShown = false
-                                        collapseShown = false
-                                        maxLines += 2
-                                        finalMaxLines = maxLines
-                                    }
-                                    .size(itemSize.dp)
-                                    .testTag(seeMoreTag)
-                                    .onPlaced {
-                                        seeMoreShown = true
-                                    }
-                            )
-                        },
-                        collapseIndicator = {
-                            collapseTag = "collapseTag$shownItemCount"
-                            itemsShownOnCollapse = shownItemCount
-                            Box(
-                                modifier = Modifier
-                                    .clickable {
-                                        itemsShownCount = 0
-                                        seeMoreShown = false
-                                        collapseShown = false
-                                        maxLines = 2
-                                        finalMaxLines = maxLines
-                                    }
-                                    .size(collapseSize.dp)
-                                    .testTag(collapseTag)
-                                    .onPlaced {
-                                        collapseShown = true
-                                    }
-                            )
-                        }),
+                    overflow =
+                        ContextualFlowRowOverflow.expandOrCollapseIndicator(
+                            expandIndicator = {
+                                seeMoreTag = "seeMoreTag$shownItemCount"
+                                itemsShownOnExpand = shownItemCount
+                                Box(
+                                    modifier =
+                                        Modifier.clickable {
+                                                itemsShownCount = 0
+                                                seeMoreShown = false
+                                                collapseShown = false
+                                                maxLines += 2
+                                                finalMaxLines = maxLines
+                                            }
+                                            .size(itemSize.dp)
+                                            .testTag(seeMoreTag)
+                                            .onPlaced { seeMoreShown = true }
+                                )
+                            },
+                            collapseIndicator = {
+                                collapseTag = "collapseTag$shownItemCount"
+                                itemsShownOnCollapse = shownItemCount
+                                Box(
+                                    modifier =
+                                        Modifier.clickable {
+                                                itemsShownCount = 0
+                                                seeMoreShown = false
+                                                collapseShown = false
+                                                maxLines = 2
+                                                finalMaxLines = maxLines
+                                            }
+                                            .size(collapseSize.dp)
+                                            .testTag(collapseTag)
+                                            .onPlaced { collapseShown = true }
+                                )
+                            }
+                        ),
                     itemCount = totalItems
                 ) { index ->
                     Box(
-                        modifier = Modifier
-                            .size(itemSize.dp)
-                            .onPlaced {
-                                itemsShownCount = index + 1
-                            }
+                        modifier =
+                            Modifier.size(itemSize.dp).onPlaced { itemsShownCount = index + 1 }
                     )
                 }
             }
@@ -2219,8 +1939,7 @@
             Truth.assertThat(collapseShown).isFalse()
             Truth.assertThat(itemsShownOnExpand).isEqualTo(itemsShownCount)
         }
-        rule.onNodeWithTag(seeMoreTag)
-            .performTouchInput { click() }
+        rule.onNodeWithTag(seeMoreTag).performTouchInput { click() }
 
         advanceClock()
 
@@ -2233,8 +1952,7 @@
             Truth.assertThat(itemsShownOnExpand).isEqualTo(itemsShownCount)
         }
 
-        rule.onNodeWithTag(seeMoreTag)
-            .performTouchInput { click() }
+        rule.onNodeWithTag(seeMoreTag).performTouchInput { click() }
 
         advanceClock()
         rule.runOnIdle {
@@ -2246,8 +1964,7 @@
             Truth.assertThat(itemsShownOnExpand).isEqualTo(itemsShownCount)
         }
 
-        rule.onNodeWithTag(seeMoreTag)
-            .performTouchInput { click() }
+        rule.onNodeWithTag(seeMoreTag).performTouchInput { click() }
 
         advanceClock()
         rule.runOnIdle {
@@ -2258,8 +1975,7 @@
             Truth.assertThat(seeMoreShown).isFalse()
             Truth.assertThat(itemsShownOnCollapse).isEqualTo(itemsShownCount)
         }
-        rule.onNodeWithTag(collapseTag)
-            .performTouchInput { click() }
+        rule.onNodeWithTag(collapseTag).performTouchInput { click() }
 
         advanceClock()
 
@@ -2288,61 +2004,53 @@
 
         rule.setContent {
             var maxLines by remember { mutableStateOf(2) }
-            CompositionLocalProvider(
-                LocalDensity provides NoOpDensity
-            ) {
+            CompositionLocalProvider(LocalDensity provides NoOpDensity) {
                 ContextualFlowColumn(
                     modifier = Modifier.height(200.dp),
                     verticalArrangement = Arrangement.spacedBy(spacing.dp),
                     maxLines = maxLines,
-                    overflow = ContextualFlowColumnOverflow.expandOrCollapseIndicator(
-                        expandIndicator = {
-                            itemsShownOnExpand = shownItemCount
-                            seeMoreTag = "seeMoreTag$shownItemCount"
-                            Box(
-                                modifier = Modifier
-                                    .clickable {
-                                        itemsShownCount = 0
-                                        seeMoreShown = false
-                                        collapseShown = false
-                                        maxLines += 2
-                                        finalMaxLines = maxLines
-                                    }
-                                    .size(itemSize.dp)
-                                    .testTag(seeMoreTag)
-                                    .onPlaced {
-                                        seeMoreShown = true
-                                    }
-                            )
-                        },
-                        collapseIndicator = {
-                            itemsShownOnCollapse = shownItemCount
-                            collapseTag = "collapseTag$shownItemCount"
-                            Box(
-                                modifier = Modifier
-                                    .clickable {
-                                        itemsShownCount = 0
-                                        seeMoreShown = false
-                                        collapseShown = false
-                                        maxLines = 2
-                                        finalMaxLines = maxLines
-                                    }
-                                    .size(collapseSize.dp)
-                                    .testTag(collapseTag)
-                                    .onPlaced {
-                                        collapseShown = true
-                                    }
-                            )
-                        }
-                    ),
+                    overflow =
+                        ContextualFlowColumnOverflow.expandOrCollapseIndicator(
+                            expandIndicator = {
+                                itemsShownOnExpand = shownItemCount
+                                seeMoreTag = "seeMoreTag$shownItemCount"
+                                Box(
+                                    modifier =
+                                        Modifier.clickable {
+                                                itemsShownCount = 0
+                                                seeMoreShown = false
+                                                collapseShown = false
+                                                maxLines += 2
+                                                finalMaxLines = maxLines
+                                            }
+                                            .size(itemSize.dp)
+                                            .testTag(seeMoreTag)
+                                            .onPlaced { seeMoreShown = true }
+                                )
+                            },
+                            collapseIndicator = {
+                                itemsShownOnCollapse = shownItemCount
+                                collapseTag = "collapseTag$shownItemCount"
+                                Box(
+                                    modifier =
+                                        Modifier.clickable {
+                                                itemsShownCount = 0
+                                                seeMoreShown = false
+                                                collapseShown = false
+                                                maxLines = 2
+                                                finalMaxLines = maxLines
+                                            }
+                                            .size(collapseSize.dp)
+                                            .testTag(collapseTag)
+                                            .onPlaced { collapseShown = true }
+                                )
+                            }
+                        ),
                     itemCount = totalItems
                 ) { index ->
                     Box(
-                        modifier = Modifier
-                            .size(itemSize.dp)
-                            .onPlaced {
-                                itemsShownCount = index + 1
-                            }
+                        modifier =
+                            Modifier.size(itemSize.dp).onPlaced { itemsShownCount = index + 1 }
                     )
                 }
             }
@@ -2355,8 +2063,7 @@
             Truth.assertThat(collapseShown).isFalse()
             Truth.assertThat(itemsShownOnExpand).isEqualTo(itemsShownCount)
         }
-        rule.onNodeWithTag(seeMoreTag)
-            .performTouchInput { click() }
+        rule.onNodeWithTag(seeMoreTag).performTouchInput { click() }
 
         advanceClock()
 
@@ -2369,8 +2076,7 @@
             Truth.assertThat(itemsShownOnExpand).isEqualTo(itemsShownCount)
         }
 
-        rule.onNodeWithTag(seeMoreTag)
-            .performTouchInput { click() }
+        rule.onNodeWithTag(seeMoreTag).performTouchInput { click() }
 
         advanceClock()
         rule.runOnIdle {
@@ -2382,8 +2088,7 @@
             Truth.assertThat(itemsShownOnExpand).isEqualTo(itemsShownCount)
         }
 
-        rule.onNodeWithTag(seeMoreTag)
-            .performTouchInput { click() }
+        rule.onNodeWithTag(seeMoreTag).performTouchInput { click() }
 
         advanceClock()
         rule.runOnIdle {
@@ -2394,8 +2099,7 @@
             Truth.assertThat(seeMoreShown).isFalse()
             Truth.assertThat(itemsShownOnCollapse).isEqualTo(itemsShownCount)
         }
-        rule.onNodeWithTag(collapseTag)
-            .performTouchInput { click() }
+        rule.onNodeWithTag(collapseTag).performTouchInput { click() }
 
         advanceClock()
 
@@ -2425,19 +2129,16 @@
             with(LocalDensity.current) {
                 Box(Modifier.size(200.toDp())) {
                     ContextualFlowColumn(
-                        modifier = Modifier
-                            .fillMaxHeight(1f),
+                        modifier = Modifier.fillMaxHeight(1f),
                         verticalArrangement = Arrangement.SpaceAround,
                         itemCount = 5
                     ) { index ->
                         Box(
-                            Modifier
-                                .size(20.toDp())
-                                .onPlaced {
-                                    val positionInParent = it.positionInParent()
-                                    val yPosition = positionInParent.y
-                                    yPositions[index] = yPosition
-                                }
+                            Modifier.size(20.toDp()).onPlaced {
+                                val positionInParent = it.positionInParent()
+                                val yPosition = positionInParent.y
+                                yPositions[index] = yPosition
+                            }
                         )
                     }
                 }
@@ -2449,9 +2150,7 @@
         yPositions.forEach {
             val yPosition = it
             expectedYPosition += gapSize
-            Truth
-                .assertThat(yPosition)
-                .isEqualTo(expectedYPosition)
+            Truth.assertThat(yPosition).isEqualTo(expectedYPosition)
             expectedYPosition += eachSize
             expectedYPosition += gapSize
         }
@@ -2474,20 +2173,17 @@
             with(LocalDensity.current) {
                 Box(Modifier.size(200.toDp())) {
                     ContextualFlowRow(
-                        modifier = Modifier
-                            .fillMaxWidth(1f),
+                        modifier = Modifier.fillMaxWidth(1f),
                         horizontalArrangement = Arrangement.SpaceAround,
                         maxItemsInEachRow = 5,
                         itemCount = 10
                     ) { index ->
                         Box(
-                            Modifier
-                                .size(20.toDp())
-                                .onPlaced {
-                                    val positionInParent = it.positionInParent()
-                                    val xPosition = positionInParent.x
-                                    xPositions[index] = xPosition
-                                }
+                            Modifier.size(20.toDp()).onPlaced {
+                                val positionInParent = it.positionInParent()
+                                val xPosition = positionInParent.x
+                                xPositions[index] = xPosition
+                            }
                         )
                     }
                 }
@@ -2501,9 +2197,7 @@
                 expectedXPosition = 0
             }
             expectedXPosition += gapSize
-            Truth
-                .assertThat(xPosition)
-                .isEqualTo(expectedXPosition)
+            Truth.assertThat(xPosition).isEqualTo(expectedXPosition)
             expectedXPosition += eachSize
             expectedXPosition += gapSize
         }
@@ -2523,20 +2217,17 @@
             with(LocalDensity.current) {
                 Box(Modifier.size(200.toDp())) {
                     ContextualFlowColumn(
-                        modifier = Modifier
-                            .fillMaxHeight(1f),
+                        modifier = Modifier.fillMaxHeight(1f),
                         verticalArrangement = Arrangement.SpaceAround,
                         maxItemsInEachColumn = 5,
                         itemCount = 10
                     ) { index ->
                         Box(
-                            Modifier
-                                .size(20.toDp())
-                                .onPlaced {
-                                    val positionInParent = it.positionInParent()
-                                    val yPosition = positionInParent.y
-                                    yPositions[index] = yPosition
-                                }
+                            Modifier.size(20.toDp()).onPlaced {
+                                val positionInParent = it.positionInParent()
+                                val yPosition = positionInParent.y
+                                yPositions[index] = yPosition
+                            }
                         )
                     }
                 }
@@ -2550,9 +2241,7 @@
                 expectedYPosition = 0
             }
             expectedYPosition += gapSize
-            Truth
-                .assertThat(position)
-                .isEqualTo(expectedYPosition)
+            Truth.assertThat(position).isEqualTo(expectedYPosition)
             expectedYPosition += eachSize
             expectedYPosition += gapSize
         }
@@ -2572,20 +2261,17 @@
             with(LocalDensity.current) {
                 Box(Modifier.size(200.toDp())) {
                     ContextualFlowRow(
-                        modifier = Modifier
-                            .fillMaxWidth(1f),
+                        modifier = Modifier.fillMaxWidth(1f),
                         horizontalArrangement = Arrangement.End,
                         maxItemsInEachRow = 5,
                         itemCount = 10
                     ) { index ->
                         Box(
-                            Modifier
-                                .size(20.toDp())
-                                .onPlaced {
-                                    val positionInParent = it.positionInParent()
-                                    val xPosition = positionInParent.x
-                                    xPositions[index] = xPosition
-                                }
+                            Modifier.size(20.toDp()).onPlaced {
+                                val positionInParent = it.positionInParent()
+                                val xPosition = positionInParent.x
+                                xPositions[index] = xPosition
+                            }
                         )
                     }
                 }
@@ -2598,9 +2284,7 @@
             if (index % 5 == 0) {
                 expectedXPosition = gapSize
             }
-            Truth
-                .assertThat(position)
-                .isEqualTo(expectedXPosition)
+            Truth.assertThat(position).isEqualTo(expectedXPosition)
             expectedXPosition += eachSize
         }
     }
@@ -2618,20 +2302,17 @@
             with(LocalDensity.current) {
                 Box(Modifier.size(200.toDp())) {
                     ContextualFlowColumn(
-                        modifier = Modifier
-                            .fillMaxHeight(1f),
+                        modifier = Modifier.fillMaxHeight(1f),
                         verticalArrangement = Arrangement.Bottom,
                         maxItemsInEachColumn = 5,
                         itemCount = 10
                     ) { index ->
                         Box(
-                            Modifier
-                                .size(20.toDp())
-                                .onPlaced {
-                                    val positionInParent = it.positionInParent()
-                                    val yPosition = positionInParent.y
-                                    yPositions[index] = yPosition
-                                }
+                            Modifier.size(20.toDp()).onPlaced {
+                                val positionInParent = it.positionInParent()
+                                val yPosition = positionInParent.y
+                                yPositions[index] = yPosition
+                            }
                         )
                     }
                 }
@@ -2644,9 +2325,7 @@
             if (index % 5 == 0) {
                 expectedYPosition = gapSize
             }
-            Truth
-                .assertThat(position)
-                .isEqualTo(expectedYPosition)
+            Truth.assertThat(position).isEqualTo(expectedYPosition)
             expectedYPosition += eachSize
         }
     }
@@ -2667,13 +2346,11 @@
                         itemCount = 10
                     ) { index ->
                         Box(
-                            Modifier
-                                .size(eachSize.toDp())
-                                .onPlaced {
-                                    val positionInParent = it.positionInParent()
-                                    val xPosition = positionInParent.x
-                                    xPositions[index] = xPosition
-                                }
+                            Modifier.size(eachSize.toDp()).onPlaced {
+                                val positionInParent = it.positionInParent()
+                                val xPosition = positionInParent.x
+                                xPositions[index] = xPosition
+                            }
                         )
                     }
                 }
@@ -2683,9 +2360,7 @@
         rule.waitForIdle()
         var expectedXPosition = 0
         xPositions.forEachIndexed { index, position ->
-            Truth
-                .assertThat(position)
-                .isEqualTo(expectedXPosition)
+            Truth.assertThat(position).isEqualTo(expectedXPosition)
             if (index == (maxItemsInMainAxis - 1)) {
                 expectedXPosition = 0
             } else {
@@ -2714,29 +2389,26 @@
             var maxLines by remember { maxLinesState }
             var minLinesToShowCollapse by remember { minLinesToShowCollapseState }
             var minHeightToShowCollapse by remember { minHeightToShowCollapseState }
-            CompositionLocalProvider(
-                LocalDensity provides NoOpDensity
-            ) {
-                seeMoreOrCollapse = ContextualFlowRowOverflow.expandOrCollapseIndicator(
-                    expandIndicator = {
-                        Box(
-                            Modifier
-                                .size(20.dp)
-                                .onGloballyPositioned {
+            CompositionLocalProvider(LocalDensity provides NoOpDensity) {
+                seeMoreOrCollapse =
+                    ContextualFlowRowOverflow.expandOrCollapseIndicator(
+                        expandIndicator = {
+                            Box(
+                                Modifier.size(20.dp).onGloballyPositioned {
                                     seeMoreXPosition = it.positionInParent().x
-                                })
-                    },
-                    collapseIndicator = {
-                        Box(
-                            Modifier
-                                .size(20.dp)
-                                .onGloballyPositioned {
+                                }
+                            )
+                        },
+                        collapseIndicator = {
+                            Box(
+                                Modifier.size(20.dp).onGloballyPositioned {
                                     collapseXPosition = it.positionInParent().x
-                                })
-                    },
-                    minLinesToShowCollapse,
-                    minHeightToShowCollapse
-                )
+                                }
+                            )
+                        },
+                        minLinesToShowCollapse,
+                        minHeightToShowCollapse
+                    )
                 Box(Modifier.size(200.dp)) {
                     ContextualFlowRow(
                         horizontalArrangement = Arrangement.Start,
@@ -2746,13 +2418,11 @@
                         itemCount = total
                     ) {
                         Box(
-                            Modifier
-                                .size(eachSize.dp)
-                                .onGloballyPositioned {
-                                    val positionInParent = it.positionInParent()
-                                    val xPosition = positionInParent.x
-                                    xPositions.add(xPosition)
-                                }
+                            Modifier.size(eachSize.dp).onGloballyPositioned {
+                                val positionInParent = it.positionInParent()
+                                val xPosition = positionInParent.x
+                                xPositions.add(xPosition)
+                            }
                         )
                     }
                 }
@@ -2761,14 +2431,10 @@
 
         rule.waitForIdle()
         rule.runOnIdle {
-            Truth.assertThat(xPositions.size).isEqualTo(
-                maxItemsInMainAxis * maxLinesState.value
-            )
+            Truth.assertThat(xPositions.size).isEqualTo(maxItemsInMainAxis * maxLinesState.value)
             var expectedXPosition = 0
             xPositions.forEachIndexed { index, position ->
-                Truth
-                    .assertThat(position)
-                    .isEqualTo(expectedXPosition)
+                Truth.assertThat(position).isEqualTo(expectedXPosition)
                 if ((index + 1) % maxItemsInMainAxis == 0) {
                     expectedXPosition = 0
                 } else {
@@ -2776,27 +2442,23 @@
                 }
             }
             xPositions.clear()
-            overflowState.value = ContextualFlowRowOverflow.expandIndicator {
-                Box(
-                    Modifier
-                        .size(20.dp)
-                        .onGloballyPositioned {
+            overflowState.value =
+                ContextualFlowRowOverflow.expandIndicator {
+                    Box(
+                        Modifier.size(20.dp).onGloballyPositioned {
                             val positionInParent = it.positionInParent()
                             seeMoreXPosition = positionInParent.x
-                        })
-            }
+                        }
+                    )
+                }
         }
         advanceClock()
         rule.runOnIdle {
-            val maxItemsThatCanFit = min(
-                (maxItemsInMainAxis * maxLinesState.value) - 1, total
-            )
+            val maxItemsThatCanFit = min((maxItemsInMainAxis * maxLinesState.value) - 1, total)
             Truth.assertThat(xPositions.size).isEqualTo(maxItemsThatCanFit)
             var expectedXPosition = 0
             xPositions.forEachIndexed { index, position ->
-                Truth
-                    .assertThat(position)
-                    .isEqualTo(expectedXPosition)
+                Truth.assertThat(position).isEqualTo(expectedXPosition)
                 if ((index + 1) % maxItemsInMainAxis == 0) {
                     expectedXPosition = 0
                 } else {
@@ -2812,15 +2474,11 @@
         }
         advanceClock()
         rule.runOnIdle {
-            val maxItemsThatCanFit = min(
-                (maxItemsInMainAxis * maxLinesState.value) - 1, total
-            )
+            val maxItemsThatCanFit = min((maxItemsInMainAxis * maxLinesState.value) - 1, total)
             Truth.assertThat(xPositions.size).isEqualTo(maxItemsThatCanFit)
             var expectedXPosition = 0
             xPositions.forEachIndexed { index, position ->
-                Truth
-                    .assertThat(position)
-                    .isEqualTo(expectedXPosition)
+                Truth.assertThat(position).isEqualTo(expectedXPosition)
                 if ((index + 1) % maxItemsInMainAxis == 0) {
                     expectedXPosition = 0
                 } else {
@@ -2835,15 +2493,11 @@
         }
         advanceClock()
         rule.runOnIdle {
-            val maxItemsThatCanFit = min(
-                (maxItemsInMainAxis * maxLinesState.value) - 1, total
-            )
+            val maxItemsThatCanFit = min((maxItemsInMainAxis * maxLinesState.value) - 1, total)
             Truth.assertThat(xPositions.size).isEqualTo(maxItemsThatCanFit)
             var expectedXPosition = 0
             xPositions.forEachIndexed { index, position ->
-                Truth
-                    .assertThat(position)
-                    .isEqualTo(expectedXPosition)
+                Truth.assertThat(position).isEqualTo(expectedXPosition)
                 if ((index + 1) % maxItemsInMainAxis == 0) {
                     expectedXPosition = 0
                 } else {
@@ -2865,15 +2519,11 @@
         }
         advanceClock()
         rule.runOnIdle {
-            val maxItemsThatCanFit = min(
-                (maxItemsInMainAxis * maxLinesState.value), total
-            )
+            val maxItemsThatCanFit = min((maxItemsInMainAxis * maxLinesState.value), total)
             Truth.assertThat(xPositions.size).isEqualTo(maxItemsThatCanFit)
             var expectedXPosition = 0
             xPositions.forEachIndexed { index, position ->
-                Truth
-                    .assertThat(position)
-                    .isEqualTo(expectedXPosition)
+                Truth.assertThat(position).isEqualTo(expectedXPosition)
                 if ((index + 1) % maxItemsInMainAxis == 0) {
                     expectedXPosition = 0
                 } else {
@@ -2905,29 +2555,26 @@
             var maxLines by remember { maxLinesState }
             var minLinesToShowCollapse by remember { minLinesToShowCollapseState }
             var minHeightToShowCollapse by remember { minHeightToShowCollapseState }
-            CompositionLocalProvider(
-                LocalDensity provides NoOpDensity
-            ) {
-                seeMoreOrCollapse = ContextualFlowColumnOverflow.expandOrCollapseIndicator(
-                    expandIndicator = {
-                        Box(
-                            Modifier
-                                .size(20.dp)
-                                .onGloballyPositioned {
+            CompositionLocalProvider(LocalDensity provides NoOpDensity) {
+                seeMoreOrCollapse =
+                    ContextualFlowColumnOverflow.expandOrCollapseIndicator(
+                        expandIndicator = {
+                            Box(
+                                Modifier.size(20.dp).onGloballyPositioned {
                                     seeMoreYPosition = it.positionInParent().y
-                                })
-                    },
-                    collapseIndicator = {
-                        Box(
-                            Modifier
-                                .size(20.dp)
-                                .onGloballyPositioned {
+                                }
+                            )
+                        },
+                        collapseIndicator = {
+                            Box(
+                                Modifier.size(20.dp).onGloballyPositioned {
                                     collapseYPosition = it.positionInParent().y
-                                })
-                    },
-                    minLinesToShowCollapse,
-                    minHeightToShowCollapse
-                )
+                                }
+                            )
+                        },
+                        minLinesToShowCollapse,
+                        minHeightToShowCollapse
+                    )
                 Box(Modifier.size(200.dp)) {
                     ContextualFlowColumn(
                         verticalArrangement = Arrangement.Top,
@@ -2937,13 +2584,11 @@
                         itemCount = total
                     ) {
                         Box(
-                            Modifier
-                                .size(eachSize.dp)
-                                .onGloballyPositioned {
-                                    val positionInParent = it.positionInParent()
-                                    val yPosition = positionInParent.y
-                                    yPositions.add(yPosition)
-                                }
+                            Modifier.size(eachSize.dp).onGloballyPositioned {
+                                val positionInParent = it.positionInParent()
+                                val yPosition = positionInParent.y
+                                yPositions.add(yPosition)
+                            }
                         )
                     }
                 }
@@ -2953,9 +2598,7 @@
         // Assertions and interaction logic
         rule.waitForIdle()
         rule.runOnIdle {
-            Truth.assertThat(yPositions.size).isEqualTo(
-                maxItemsInMainAxis * maxLinesState.value
-            )
+            Truth.assertThat(yPositions.size).isEqualTo(maxItemsInMainAxis * maxLinesState.value)
             var expectedYPosition = 0
             yPositions.forEachIndexed { index, position ->
                 Truth.assertThat(position).isEqualTo(expectedYPosition)
@@ -2966,23 +2609,20 @@
                 }
             }
             yPositions.clear()
-            overflowState.value = ContextualFlowColumnOverflow.expandIndicator {
-                Box(
-                    Modifier
-                        .size(20.dp)
-                        .onGloballyPositioned {
+            overflowState.value =
+                ContextualFlowColumnOverflow.expandIndicator {
+                    Box(
+                        Modifier.size(20.dp).onGloballyPositioned {
                             val positionInParent = it.positionInParent()
                             seeMoreYPosition = positionInParent.y
                         }
-                )
-            }
+                    )
+                }
         }
         // Continuing from the previous logic
         advanceClock()
         rule.runOnIdle {
-            val maxItemsThatCanFit = min(
-                (maxItemsInMainAxis * maxLinesState.value) - 1, total
-            )
+            val maxItemsThatCanFit = min((maxItemsInMainAxis * maxLinesState.value) - 1, total)
             Truth.assertThat(yPositions.size).isEqualTo(maxItemsThatCanFit)
             var expectedYPosition = 0
             yPositions.forEachIndexed { index, position ->
@@ -3002,9 +2642,7 @@
         }
         advanceClock()
         rule.runOnIdle {
-            val maxItemsThatCanFit = min(
-                (maxItemsInMainAxis * maxLinesState.value) - 1, total
-            )
+            val maxItemsThatCanFit = min((maxItemsInMainAxis * maxLinesState.value) - 1, total)
             Truth.assertThat(yPositions.size).isEqualTo(maxItemsThatCanFit)
             var expectedYPosition = 0
             yPositions.forEachIndexed { index, position ->
@@ -3023,9 +2661,7 @@
         }
         advanceClock()
         rule.runOnIdle {
-            val maxItemsThatCanFit = min(
-                (maxItemsInMainAxis * maxLinesState.value) - 1, total
-            )
+            val maxItemsThatCanFit = min((maxItemsInMainAxis * maxLinesState.value) - 1, total)
             Truth.assertThat(yPositions.size).isEqualTo(maxItemsThatCanFit)
             var expectedYPosition = 0
             yPositions.forEachIndexed { index, position ->
@@ -3051,9 +2687,7 @@
         }
         advanceClock()
         rule.runOnIdle {
-            val maxItemsThatCanFit = min(
-                (maxItemsInMainAxis * maxLinesState.value), total
-            )
+            val maxItemsThatCanFit = min((maxItemsInMainAxis * maxLinesState.value), total)
             Truth.assertThat(yPositions.size).isEqualTo(maxItemsThatCanFit)
             var expectedYPosition = 0
             yPositions.forEachIndexed { index, position ->
@@ -3089,34 +2723,27 @@
             var maxHeight by remember { maxHeightState }
             var minLinesToShowCollapse by remember { minLinesToShowCollapseState }
             var minHeightToShowCollapse by remember { minHeightToShowCollapseState }
-            CompositionLocalProvider(
-                LocalDensity provides NoOpDensity
-            ) {
-                seeMoreOrCollapse = ContextualFlowRowOverflow.expandOrCollapseIndicator(
-                    expandIndicator = {
-                        Box(
-                            Modifier
-                                .size(20.dp)
-                                .onGloballyPositioned {
+            CompositionLocalProvider(LocalDensity provides NoOpDensity) {
+                seeMoreOrCollapse =
+                    ContextualFlowRowOverflow.expandOrCollapseIndicator(
+                        expandIndicator = {
+                            Box(
+                                Modifier.size(20.dp).onGloballyPositioned {
                                     seeMoreXPosition = it.positionInParent().x
-                                })
-                    },
-                    collapseIndicator = {
-                        Box(
-                            Modifier
-                                .size(20.dp)
-                                .onGloballyPositioned {
+                                }
+                            )
+                        },
+                        collapseIndicator = {
+                            Box(
+                                Modifier.size(20.dp).onGloballyPositioned {
                                     collapseXPosition = it.positionInParent().x
-                                })
-                    },
-                    minLinesToShowCollapse,
-                    minHeightToShowCollapse
-                )
-                Box(
-                    Modifier
-                        .width(200.dp)
-                        .height(maxHeight)
-                ) {
+                                }
+                            )
+                        },
+                        minLinesToShowCollapse,
+                        minHeightToShowCollapse
+                    )
+                Box(Modifier.width(200.dp).height(maxHeight)) {
                     ContextualFlowRow(
                         horizontalArrangement = Arrangement.Start,
                         maxItemsInEachRow = maxItemsInMainAxis,
@@ -3124,13 +2751,11 @@
                         itemCount = total
                     ) {
                         Box(
-                            Modifier
-                                .size(eachSize.dp)
-                                .onGloballyPositioned {
-                                    val positionInParent = it.positionInParent()
-                                    val xPosition = positionInParent.x
-                                    xPositions.add(xPosition)
-                                }
+                            Modifier.size(eachSize.dp).onGloballyPositioned {
+                                val positionInParent = it.positionInParent()
+                                val xPosition = positionInParent.x
+                                xPositions.add(xPosition)
+                            }
                         )
                     }
                 }
@@ -3142,9 +2767,7 @@
             Truth.assertThat(xPositions.size).isEqualTo(10)
             var expectedXPosition = 0
             xPositions.forEachIndexed { index, position ->
-                Truth
-                    .assertThat(position)
-                    .isEqualTo(expectedXPosition)
+                Truth.assertThat(position).isEqualTo(expectedXPosition)
                 if ((index + 1) % maxItemsInMainAxis == 0) {
                     expectedXPosition = 0
                 } else {
@@ -3152,15 +2775,15 @@
                 }
             }
             xPositions.clear()
-            overflowState.value = ContextualFlowRowOverflow.expandIndicator {
-                Box(
-                    Modifier
-                        .size(20.dp)
-                        .onGloballyPositioned {
+            overflowState.value =
+                ContextualFlowRowOverflow.expandIndicator {
+                    Box(
+                        Modifier.size(20.dp).onGloballyPositioned {
                             val positionInParent = it.positionInParent()
                             seeMoreXPosition = positionInParent.x
-                        })
-            }
+                        }
+                    )
+                }
         }
         advanceClock()
         rule.runOnIdle {
@@ -3168,9 +2791,7 @@
             Truth.assertThat(xPositions.size).isEqualTo(maxItemsThatCanFit)
             var expectedXPosition = 0
             xPositions.forEachIndexed { index, position ->
-                Truth
-                    .assertThat(position)
-                    .isEqualTo(expectedXPosition)
+                Truth.assertThat(position).isEqualTo(expectedXPosition)
                 if ((index + 1) % maxItemsInMainAxis == 0) {
                     expectedXPosition = 0
                 } else {
@@ -3190,9 +2811,7 @@
             Truth.assertThat(xPositions.size).isEqualTo(maxItemsThatCanFit)
             var expectedXPosition = 0
             xPositions.forEachIndexed { index, position ->
-                Truth
-                    .assertThat(position)
-                    .isEqualTo(expectedXPosition)
+                Truth.assertThat(position).isEqualTo(expectedXPosition)
                 if ((index + 1) % maxItemsInMainAxis == 0) {
                     expectedXPosition = 0
                 } else {
@@ -3211,9 +2830,7 @@
             Truth.assertThat(xPositions.size).isEqualTo(maxItemsThatCanFit)
             var expectedXPosition = 0
             xPositions.forEachIndexed { index, position ->
-                Truth
-                    .assertThat(position)
-                    .isEqualTo(expectedXPosition)
+                Truth.assertThat(position).isEqualTo(expectedXPosition)
                 if ((index + 1) % maxItemsInMainAxis == 0) {
                     expectedXPosition = 0
                 } else {
@@ -3239,9 +2856,7 @@
             Truth.assertThat(xPositions.size).isEqualTo(maxItemsThatCanFit)
             var expectedXPosition = 0
             xPositions.forEachIndexed { index, position ->
-                Truth
-                    .assertThat(position)
-                    .isEqualTo(expectedXPosition)
+                Truth.assertThat(position).isEqualTo(expectedXPosition)
                 if ((index + 1) % maxItemsInMainAxis == 0) {
                     expectedXPosition = 0
                 } else {
@@ -3269,13 +2884,11 @@
                         itemCount = 10
                     ) { index ->
                         Box(
-                            Modifier
-                                .size(eachSize.toDp())
-                                .onPlaced {
-                                    val positionInParent = it.positionInParent()
-                                    val xPosition = positionInParent.x
-                                    xPositions[index] = xPosition
-                                }
+                            Modifier.size(eachSize.toDp()).onPlaced {
+                                val positionInParent = it.positionInParent()
+                                val xPosition = positionInParent.x
+                                xPositions[index] = xPosition
+                            }
                         )
                     }
                 }
@@ -3292,9 +2905,7 @@
                 expectedXPosition += spaceAligned
             }
 
-            Truth
-                .assertThat(position)
-                .isEqualTo(expectedXPosition)
+            Truth.assertThat(position).isEqualTo(expectedXPosition)
         }
     }
 
@@ -3318,34 +2929,27 @@
             var maxWidth by remember { maxWidthState }
             var minLinesToShowCollapse by remember { minLinesToShowCollapseState }
             var minHeightToShowCollapse by remember { minHeightToShowCollapseState }
-            CompositionLocalProvider(
-                LocalDensity provides NoOpDensity
-            ) {
-                seeMoreOrCollapse = ContextualFlowColumnOverflow.expandOrCollapseIndicator(
-                    expandIndicator = {
-                        Box(
-                            Modifier
-                                .size(20.dp)
-                                .onGloballyPositioned {
+            CompositionLocalProvider(LocalDensity provides NoOpDensity) {
+                seeMoreOrCollapse =
+                    ContextualFlowColumnOverflow.expandOrCollapseIndicator(
+                        expandIndicator = {
+                            Box(
+                                Modifier.size(20.dp).onGloballyPositioned {
                                     seeMoreYPosition = it.positionInParent().y
-                                })
-                    },
-                    collapseIndicator = {
-                        Box(
-                            Modifier
-                                .size(20.dp)
-                                .onGloballyPositioned {
+                                }
+                            )
+                        },
+                        collapseIndicator = {
+                            Box(
+                                Modifier.size(20.dp).onGloballyPositioned {
                                     collapseYPosition = it.positionInParent().y
-                                })
-                    },
-                    minLinesToShowCollapse,
-                    minHeightToShowCollapse
-                )
-                Box(
-                    Modifier
-                        .height(200.dp)
-                        .width(maxWidth)
-                ) {
+                                }
+                            )
+                        },
+                        minLinesToShowCollapse,
+                        minHeightToShowCollapse
+                    )
+                Box(Modifier.height(200.dp).width(maxWidth)) {
                     ContextualFlowColumn(
                         verticalArrangement = Arrangement.Top,
                         maxItemsInEachColumn = maxItemsInMainAxis,
@@ -3353,13 +2957,11 @@
                         itemCount = total
                     ) {
                         Box(
-                            Modifier
-                                .size(eachSize.dp)
-                                .onGloballyPositioned {
-                                    val positionInParent = it.positionInParent()
-                                    val yPosition = positionInParent.y
-                                    yPositions.add(yPosition)
-                                }
+                            Modifier.size(eachSize.dp).onGloballyPositioned {
+                                val positionInParent = it.positionInParent()
+                                val yPosition = positionInParent.y
+                                yPositions.add(yPosition)
+                            }
                         )
                     }
                 }
@@ -3380,15 +2982,15 @@
                 }
             }
             yPositions.clear()
-            overflowState.value = ContextualFlowColumnOverflow.expandIndicator {
-                Box(
-                    Modifier
-                        .size(20.dp)
-                        .onGloballyPositioned {
+            overflowState.value =
+                ContextualFlowColumnOverflow.expandIndicator {
+                    Box(
+                        Modifier.size(20.dp).onGloballyPositioned {
                             val positionInParent = it.positionInParent()
                             seeMoreYPosition = positionInParent.y
-                        })
-            }
+                        }
+                    )
+                }
         }
         advanceClock()
         rule.runOnIdle {
@@ -3474,11 +3076,10 @@
     }
 
     /**
-     * Should space something like this:
-     * 1 2 3
+     * Should space something like this: 1 2 3
+     *
      * # SpaceAligned
-     * 4 5 6
-     * No Space here
+     * 4 5 6 No Space here
      */
     @Test
     fun testContextualFlowRow_crossAxisSpacedBy() {
@@ -3493,22 +3094,17 @@
             with(LocalDensity.current) {
                 Box(Modifier.size(200.toDp())) {
                     ContextualFlowRow(
-                        modifier = Modifier
-                            .onSizeChanged {
-                                heightResult = it.height
-                            },
+                        modifier = Modifier.onSizeChanged { heightResult = it.height },
                         verticalArrangement = Arrangement.spacedBy(spaceAligned.toDp()),
                         maxItemsInEachRow = 1,
                         itemCount = noOfItems
                     ) { index ->
                         Box(
-                            Modifier
-                                .size(eachSize.toDp())
-                                .onPlaced {
-                                    val positionInParent = it.positionInParent()
-                                    val yPosition = positionInParent.y
-                                    yPositions[index] = yPosition
-                                }
+                            Modifier.size(eachSize.toDp()).onPlaced {
+                                val positionInParent = it.positionInParent()
+                                val yPosition = positionInParent.y
+                                yPositions[index] = yPosition
+                            }
                         )
                     }
                 }
@@ -3516,14 +3112,10 @@
         }
 
         rule.waitForIdle()
-        Truth
-            .assertThat(heightResult)
-            .isEqualTo(expectedHeight)
+        Truth.assertThat(heightResult).isEqualTo(expectedHeight)
         var expectedYPosition = 0
         yPositions.forEachIndexed { index, position ->
-            Truth
-                .assertThat(position)
-                .isEqualTo(expectedYPosition)
+            Truth.assertThat(position).isEqualTo(expectedYPosition)
             expectedYPosition += eachSize
             if (index < (noOfItems - 1)) {
                 expectedYPosition += spaceAligned
@@ -3544,22 +3136,17 @@
             with(LocalDensity.current) {
                 Box(Modifier.size(200.toDp())) {
                     ContextualFlowColumn(
-                        modifier = Modifier
-                            .onSizeChanged {
-                                widthResult = it.width
-                            },
+                        modifier = Modifier.onSizeChanged { widthResult = it.width },
                         horizontalArrangement = Arrangement.spacedBy(spaceAligned.toDp()),
                         maxItemsInEachColumn = 1,
                         itemCount = noOfItems
                     ) { index ->
                         Box(
-                            Modifier
-                                .size(eachSize.toDp())
-                                .onPlaced {
-                                    val positionInParent = it.positionInParent()
-                                    val xPosition = positionInParent.x
-                                    xPositions[index] = xPosition
-                                }
+                            Modifier.size(eachSize.toDp()).onPlaced {
+                                val positionInParent = it.positionInParent()
+                                val xPosition = positionInParent.x
+                                xPositions[index] = xPosition
+                            }
                         )
                     }
                 }
@@ -3568,13 +3155,9 @@
 
         rule.waitForIdle()
         var expectedXPosition = 0
-        Truth
-            .assertThat(widthResult)
-            .isEqualTo(expectedWidth)
+        Truth.assertThat(widthResult).isEqualTo(expectedWidth)
         xPositions.forEachIndexed { index, position ->
-            Truth
-                .assertThat(position)
-                .isEqualTo(expectedXPosition)
+            Truth.assertThat(position).isEqualTo(expectedXPosition)
             expectedXPosition += eachSize
             if (index < (noOfItems - 1)) {
                 expectedXPosition += spaceAligned
@@ -3598,13 +3181,11 @@
                         itemCount = 10
                     ) { index ->
                         Box(
-                            Modifier
-                                .size(eachSize.toDp())
-                                .onPlaced {
-                                    val positionInParent = it.positionInParent()
-                                    val position = positionInParent.y
-                                    yPositions[index] = position
-                                }
+                            Modifier.size(eachSize.toDp()).onPlaced {
+                                val positionInParent = it.positionInParent()
+                                val position = positionInParent.y
+                                yPositions[index] = position
+                            }
                         )
                     }
                 }
@@ -3621,9 +3202,7 @@
                 expectedYPosition += spaceAligned
             }
 
-            Truth
-                .assertThat(position)
-                .isEqualTo(expectedYPosition)
+            Truth.assertThat(position).isEqualTo(expectedYPosition)
         }
     }
 
@@ -3639,27 +3218,19 @@
         val xPositions = FloatArray(10)
         rule.setContent {
             with(LocalDensity.current) {
-                Box(
-                    Modifier
-                        .widthIn(30.toDp(), 40.toDp())
-                ) {
+                Box(Modifier.widthIn(30.toDp(), 40.toDp())) {
                     ContextualFlowRow(
-                        modifier = Modifier
-                            .onSizeChanged {
-                                width = it.width
-                            },
+                        modifier = Modifier.onSizeChanged { width = it.width },
                         horizontalArrangement = Arrangement.spacedBy(spaceAligned.toDp()),
                         maxItemsInEachRow = maxItemsInMainAxis,
                         itemCount = 10
                     ) { index ->
                         Box(
-                            Modifier
-                                .size(eachSize.toDp())
-                                .onPlaced {
-                                    val positionInParent = it.positionInParent()
-                                    val xPosition = positionInParent.x
-                                    xPositions[index] = xPosition
-                                }
+                            Modifier.size(eachSize.toDp()).onPlaced {
+                                val positionInParent = it.positionInParent()
+                                val xPosition = positionInParent.x
+                                xPositions[index] = xPosition
+                            }
                         )
                     }
                 }
@@ -3677,9 +3248,7 @@
                 expectedXPosition += spaceAligned
             }
 
-            Truth
-                .assertThat(position)
-                .isEqualTo(expectedXPosition)
+            Truth.assertThat(position).isEqualTo(expectedXPosition)
         }
     }
 
@@ -3695,28 +3264,19 @@
         val yPositions = FloatArray(10)
         rule.setContent {
             with(LocalDensity.current) {
-                Box(
-                    Modifier
-                        .heightIn(30.toDp(), 40.toDp())
-
-                ) {
+                Box(Modifier.heightIn(30.toDp(), 40.toDp())) {
                     ContextualFlowColumn(
-                        modifier = Modifier
-                            .onSizeChanged {
-                                height = it.height
-                            },
+                        modifier = Modifier.onSizeChanged { height = it.height },
                         verticalArrangement = Arrangement.spacedBy(spaceAligned.toDp()),
                         maxItemsInEachColumn = maxItemsInMainAxis,
                         itemCount = 10
                     ) { index ->
                         Box(
-                            Modifier
-                                .size(eachSize.toDp())
-                                .onPlaced {
-                                    val positionInParent = it.positionInParent()
-                                    val yPosition = positionInParent.y
-                                    yPositions[index] = yPosition
-                                }
+                            Modifier.size(eachSize.toDp()).onPlaced {
+                                val positionInParent = it.positionInParent()
+                                val yPosition = positionInParent.y
+                                yPositions[index] = yPosition
+                            }
                         )
                     }
                 }
@@ -3734,9 +3294,7 @@
                 expectedYPosition += spaceAligned
             }
 
-            Truth
-                .assertThat(position)
-                .isEqualTo(expectedYPosition)
+            Truth.assertThat(position).isEqualTo(expectedYPosition)
         }
     }
 
@@ -3751,20 +3309,17 @@
             with(LocalDensity.current) {
                 Box(Modifier.size(size.toDp())) {
                     ContextualFlowColumn(
-                        modifier = Modifier
-                            .fillMaxHeight(1f),
+                        modifier = Modifier.fillMaxHeight(1f),
                         verticalArrangement = Arrangement.Top,
                         maxItemsInEachColumn = maxItemsInMainAxis,
                         itemCount = 10
                     ) { index ->
                         Box(
-                            Modifier
-                                .size(20.toDp())
-                                .onPlaced {
-                                    val positionInParent = it.positionInParent()
-                                    val yPosition = positionInParent.y
-                                    yPositions[index] = yPosition
-                                }
+                            Modifier.size(20.toDp()).onPlaced {
+                                val positionInParent = it.positionInParent()
+                                val yPosition = positionInParent.y
+                                yPositions[index] = yPosition
+                            }
                         )
                     }
                 }
@@ -3777,9 +3332,7 @@
             if (index % 5 == 0) {
                 expectedYPosition = 0
             }
-            Truth
-                .assertThat(position)
-                .isEqualTo(expectedYPosition)
+            Truth.assertThat(position).isEqualTo(expectedYPosition)
             expectedYPosition += eachSize
         }
     }
@@ -3795,26 +3348,21 @@
 
         val xPositions = FloatArray(6)
         rule.setContent {
-            CompositionLocalProvider(
-                LocalLayoutDirection provides LayoutDirection.Rtl
-            ) {
+            CompositionLocalProvider(LocalLayoutDirection provides LayoutDirection.Rtl) {
                 with(LocalDensity.current) {
                     Box(Modifier.size(size.toDp())) {
                         ContextualFlowRow(
-                            modifier = Modifier
-                                .fillMaxWidth(1f),
+                            modifier = Modifier.fillMaxWidth(1f),
                             horizontalArrangement = Arrangement.Start,
                             maxItemsInEachRow = maxItemsInMainAxis,
                             itemCount = 6
                         ) { index ->
                             Box(
-                                Modifier
-                                    .size(eachSize.toDp())
-                                    .onPlaced {
-                                        val positionInParent = it.positionInParent()
-                                        val xPosition = positionInParent.x
-                                        xPositions[index] = xPosition
-                                    }
+                                Modifier.size(eachSize.toDp()).onPlaced {
+                                    val positionInParent = it.positionInParent()
+                                    val xPosition = positionInParent.x
+                                    xPositions[index] = xPosition
+                                }
                             )
                         }
                     }
@@ -3825,9 +3373,7 @@
         rule.waitForIdle()
         var expectedXPosition = size.toInt() - eachSize
         xPositions.forEachIndexed { index, position ->
-            Truth
-                .assertThat(position)
-                .isEqualTo(expectedXPosition)
+            Truth.assertThat(position).isEqualTo(expectedXPosition)
             if (index == (maxItemsInMainAxis - 1)) {
                 expectedXPosition = size.toInt() - eachSize
             } else {
@@ -3844,28 +3390,22 @@
 
         val xYPositions = Array(10) { Pair(0f, 0f) }
         rule.setContent {
-            CompositionLocalProvider(
-                LocalLayoutDirection provides LayoutDirection.Rtl
-            ) {
+            CompositionLocalProvider(LocalLayoutDirection provides LayoutDirection.Rtl) {
                 with(LocalDensity.current) {
                     Box(Modifier.size(size.toDp())) {
                         ContextualFlowColumn(
-                            modifier = Modifier
-                                .fillMaxHeight(1f)
-                                .fillMaxWidth(1f),
+                            modifier = Modifier.fillMaxHeight(1f).fillMaxWidth(1f),
                             verticalArrangement = Arrangement.Top,
                             maxItemsInEachColumn = maxItemsInMainAxis,
                             itemCount = 10
                         ) { index ->
                             Box(
-                                Modifier
-                                    .size(20.toDp())
-                                    .onPlaced {
-                                        val positionInParent = it.positionInParent()
-                                        val yPosition = positionInParent.y
-                                        val xPosition = positionInParent.x
-                                        xYPositions[index] = Pair(xPosition, yPosition)
-                                    }
+                                Modifier.size(20.toDp()).onPlaced {
+                                    val positionInParent = it.positionInParent()
+                                    val yPosition = positionInParent.y
+                                    val xPosition = positionInParent.x
+                                    xYPositions[index] = Pair(xPosition, yPosition)
+                                }
                             )
                         }
                     }
@@ -3883,12 +3423,8 @@
             if (index % 5 == 0) {
                 expectedYPosition = 0
             }
-            Truth
-                .assertThat(yPosition)
-                .isEqualTo(expectedYPosition)
-            Truth
-                .assertThat(xPosition)
-                .isEqualTo(expectedXPosition)
+            Truth.assertThat(yPosition).isEqualTo(expectedYPosition)
+            Truth.assertThat(xPosition).isEqualTo(expectedXPosition)
             if (index == (maxItemsInMainAxis - 1)) {
                 expectedXPosition -= eachSize
             }
@@ -3906,15 +3442,12 @@
         var width = 0
         val xYPositions = Array(10) { Pair(0f, 0f) }
         rule.setContent {
-            CompositionLocalProvider(
-                LocalLayoutDirection provides LayoutDirection.Rtl
-            ) {
+            CompositionLocalProvider(LocalLayoutDirection provides LayoutDirection.Rtl) {
                 with(LocalDensity.current) {
                     Box(Modifier.size(size.toDp())) {
                         ContextualFlowColumn(
-                            modifier = Modifier
-                                .fillMaxHeight(1f)
-                                .onSizeChanged {
+                            modifier =
+                                Modifier.fillMaxHeight(1f).onSizeChanged {
                                     width = it.width
                                     itemsThatCanFit = it.height / eachSize
                                 },
@@ -3923,14 +3456,12 @@
                             itemCount = 10
                         ) { index ->
                             Box(
-                                Modifier
-                                    .size(20.toDp())
-                                    .onPlaced {
-                                        val positionInParent = it.positionInParent()
-                                        val xPosition = positionInParent.x
-                                        val yPosition = positionInParent.y
-                                        xYPositions[index] = Pair(xPosition, yPosition)
-                                    }
+                                Modifier.size(20.toDp()).onPlaced {
+                                    val positionInParent = it.positionInParent()
+                                    val xPosition = positionInParent.x
+                                    val yPosition = positionInParent.y
+                                    xYPositions[index] = Pair(xPosition, yPosition)
+                                }
                             )
                         }
                     }
@@ -3946,19 +3477,13 @@
             val pair = xYPositions[index]
             val xPosition = pair.first
             val yPosition = pair.second
-            if (index % maxItemsInMainAxis == 0 ||
-                fittedItems == itemsThatCanFit
-            ) {
+            if (index % maxItemsInMainAxis == 0 || fittedItems == itemsThatCanFit) {
                 expectedYPosition = 0
                 expectedXPosition -= eachSize
                 fittedItems = 0
             }
-            Truth
-                .assertThat(yPosition)
-                .isEqualTo(expectedYPosition)
-            Truth
-                .assertThat(xPosition)
-                .isEqualTo(expectedXPosition)
+            Truth.assertThat(yPosition).isEqualTo(expectedYPosition)
+            Truth.assertThat(xPosition).isEqualTo(expectedXPosition)
             expectedYPosition += eachSize
             fittedItems++
         }
@@ -3975,9 +3500,7 @@
 
         val xPositions = FloatArray(6)
         rule.setContent {
-            CompositionLocalProvider(
-                LocalLayoutDirection provides LayoutDirection.Rtl
-            ) {
+            CompositionLocalProvider(LocalLayoutDirection provides LayoutDirection.Rtl) {
                 with(LocalDensity.current) {
                     Box(Modifier.size(200.toDp())) {
                         ContextualFlowRow(
@@ -3986,13 +3509,11 @@
                             itemCount = 6
                         ) { index ->
                             Box(
-                                Modifier
-                                    .size(20.toDp())
-                                    .onPlaced {
-                                        val positionInParent = it.positionInParent()
-                                        val xPosition = positionInParent.x
-                                        xPositions[index] = xPosition
-                                    }
+                                Modifier.size(20.toDp()).onPlaced {
+                                    val positionInParent = it.positionInParent()
+                                    val xPosition = positionInParent.x
+                                    xPositions[index] = xPosition
+                                }
                             )
                         }
                     }
@@ -4002,9 +3523,7 @@
         rule.waitForIdle()
         var expectedXPosition = maxMainAxisSize - eachSize
         xPositions.forEachIndexed { index, position ->
-            Truth
-                .assertThat(position)
-                .isEqualTo(expectedXPosition)
+            Truth.assertThat(position).isEqualTo(expectedXPosition)
             if (index == (maxItemsInMainAxis - 1)) {
                 expectedXPosition = maxMainAxisSize - eachSize
             } else {
@@ -4018,28 +3537,22 @@
         var width = 0
         var noOfItemsPlaced = 0
         rule.setContent {
-            CompositionLocalProvider(
-                LocalDensity provides NoOpDensity
-            ) {
+            CompositionLocalProvider(LocalDensity provides NoOpDensity) {
                 Box(Modifier.size(200.dp)) {
                     ContextualFlowRow(
-                        modifier = Modifier
-                            .fillMaxWidth(1f)
-                            .onSizeChanged {
-                                width = it.width
-                            },
+                        modifier = Modifier.fillMaxWidth(1f).onSizeChanged { width = it.width },
                         verticalArrangement = Arrangement.spacedBy(20.dp),
                         itemCount = 2,
                         overflow = ContextualFlowRowOverflow.Clip
                     ) { index ->
                         Layout(
-                            modifier = Modifier
-                                .requiredSize(250.dp)
-                                .onPlaced {
+                            modifier =
+                                Modifier.requiredSize(250.dp).onPlaced {
                                     noOfItemsPlaced = index + 1
                                 }
                         ) { _, _ ->
-                            layout(250, 250) {} }
+                            layout(250, 250) {}
+                        }
                     }
                 }
             }
@@ -4054,28 +3567,22 @@
         var height = 0
         var noOfItemsPlaced = 0
         rule.setContent {
-            CompositionLocalProvider(
-                LocalDensity provides NoOpDensity
-            ) {
+            CompositionLocalProvider(LocalDensity provides NoOpDensity) {
                 Box(Modifier.size(200.dp)) {
                     ContextualFlowColumn(
-                        modifier = Modifier
-                            .fillMaxHeight(1f)
-                            .onSizeChanged {
-                                height = it.height
-                            },
+                        modifier = Modifier.fillMaxHeight(1f).onSizeChanged { height = it.height },
                         horizontalArrangement = Arrangement.spacedBy(20.dp),
                         itemCount = 2,
                         overflow = ContextualFlowColumnOverflow.Clip
                     ) { index ->
                         Layout(
-                            modifier = Modifier
-                                .requiredSize(250.dp)
-                                .onPlaced {
+                            modifier =
+                                Modifier.requiredSize(250.dp).onPlaced {
                                     noOfItemsPlaced = index + 1
                                 }
                         ) { _, _ ->
-                            layout(250, 250) {} }
+                            layout(250, 250) {}
+                        }
                     }
                 }
             }
@@ -4098,16 +3605,13 @@
         val maxItemsInMainAxis = mutableIntStateOf(4)
         val itemCount = 12
         rule.setContent {
-            CompositionLocalProvider(
-                LocalDensity provides NoOpDensity
-            ) {
+            CompositionLocalProvider(LocalDensity provides NoOpDensity) {
                 val heightState = remember { crossAxisSize }
                 val widthState by remember { mainAxisSize }
                 val maxItemsInMainAxisState by remember { maxItemsInMainAxis }
                 ContextualFlowRow(
-                    modifier = Modifier
-                        .width(widthState)
-                        .run {
+                    modifier =
+                        Modifier.width(widthState).run {
                             val heightValue = heightState.value
                             if (heightValue == Dp.Infinity) {
                                 this.wrapContentHeight()
@@ -4122,8 +3626,7 @@
                     overflow = ContextualFlowRowOverflow.Clip
                 ) {
                     Box(
-                        Modifier
-                            .width(if (lineIndex == 0) lineOneItemSize else itemSize)
+                        Modifier.width(if (lineIndex == 0) lineOneItemSize else itemSize)
                             .height(
                                 if (lineIndex == 0) {
                                     // choose varying heights, to
@@ -4137,14 +3640,10 @@
                                 } else {
                                     itemSize
                                 }
-                            ).onGloballyPositioned {
+                            )
+                            .onGloballyPositioned {
                                 list.add(
-                                    FlowLineInfo(
-                                        lineIndex,
-                                        indexInLine,
-                                        maxWidthInLine,
-                                        maxHeight
-                                    )
+                                    FlowLineInfo(lineIndex, indexInLine, maxWidthInLine, maxHeight)
                                 )
                             }
                     )
@@ -4224,16 +3723,13 @@
         val itemCount = 12
         val maxItemsInMainAxis = mutableIntStateOf(4)
         rule.setContent {
-            CompositionLocalProvider(
-                LocalDensity provides NoOpDensity
-            ) {
+            CompositionLocalProvider(LocalDensity provides NoOpDensity) {
                 val widthState = remember { crossAxisSize }
                 val heightState by remember { mainAxisSize }
                 val maxItemsInMainAxisState by remember { maxItemsInMainAxis }
                 ContextualFlowColumn(
-                    modifier = Modifier
-                        .height(heightState)
-                        .run {
+                    modifier =
+                        Modifier.height(heightState).run {
                             val widthValue = widthState.value
                             if (widthValue == Dp.Infinity) {
                                 this.wrapContentWidth()
@@ -4248,8 +3744,7 @@
                     overflow = ContextualFlowColumnOverflow.Clip
                 ) {
                     Box(
-                        Modifier
-                            .height(if (lineIndex == 0) lineOneItemSize else itemSize)
+                        Modifier.height(if (lineIndex == 0) lineOneItemSize else itemSize)
                             .width(
                                 if (lineIndex == 0) {
                                     // choose varying heights, to
@@ -4263,7 +3758,8 @@
                                 } else {
                                     itemSize
                                 }
-                            ).onGloballyPositioned {
+                            )
+                            .onGloballyPositioned {
                                 list.add(
                                     FlowLineInfo(
                                         lineIndex,
@@ -4347,19 +3843,15 @@
         crossAxisSpacing: Dp
     ) {
         var leftOver = mainAxisSize
-        val lineInfo = FlowLineInfo(
-            0,
-            0,
-            leftOver,
-            maxCrossAxis
-        )
+        val lineInfo = FlowLineInfo(0, 0, leftOver, maxCrossAxis)
         var leftOverCrossAxis = maxCrossAxis
         list.forEach { info ->
-            val lineItemSize = if (info.lineIndex == 0) {
-                lineOneItemSize
-            } else {
-                itemSize
-            }
+            val lineItemSize =
+                if (info.lineIndex == 0) {
+                    lineOneItemSize
+                } else {
+                    itemSize
+                }
             Truth.assertThat(info.positionInLine).isEqualTo(lineInfo.positionInLine)
             Truth.assertThat(info.maxMainAxisSize).isEqualTo(lineInfo.maxMainAxisSize)
             Truth.assertThat(info.maxCrossAxisSize).isEqualTo(lineInfo.maxCrossAxisSize)
diff --git a/compose/foundation/foundation-layout/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/layout/FlowRowColumnTest.kt b/compose/foundation/foundation-layout/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/layout/FlowRowColumnTest.kt
index e6123e22..39f21d5 100644
--- a/compose/foundation/foundation-layout/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/layout/FlowRowColumnTest.kt
+++ b/compose/foundation/foundation-layout/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/layout/FlowRowColumnTest.kt
@@ -61,8 +61,7 @@
 @RunWith(AndroidJUnit4::class)
 class FlowRowColumnTest {
 
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
     @Test
     fun testFlowRow_wrapsToTheNextLine() {
@@ -71,14 +70,8 @@
         rule.setContent {
             with(LocalDensity.current) {
                 Box(Modifier.size(100.toDp())) {
-                    FlowRow(
-                        Modifier
-                            .onSizeChanged {
-                                height = it.height
-                            }) {
-                        repeat(6) {
-                            Box(Modifier.size(20.toDp()))
-                        }
+                    FlowRow(Modifier.onSizeChanged { height = it.height }) {
+                        repeat(6) { Box(Modifier.size(20.toDp())) }
                     }
                 }
             }
@@ -95,14 +88,8 @@
         rule.setContent {
             with(LocalDensity.current) {
                 Box(Modifier.size(100.toDp())) {
-                    FlowColumn(
-                        Modifier
-                            .onSizeChanged {
-                                width = it.width
-                            }) {
-                        repeat(6) {
-                            Box(Modifier.size(20.toDp()))
-                        }
+                    FlowColumn(Modifier.onSizeChanged { width = it.width }) {
+                        repeat(6) { Box(Modifier.size(20.toDp())) }
                     }
                 }
             }
@@ -119,14 +106,8 @@
         rule.setContent {
             with(LocalDensity.current) {
                 Box(Modifier.size(100.toDp())) {
-                    FlowRow(
-                        Modifier
-                            .onSizeChanged {
-                                height = it.height
-                            }) {
-                        repeat(10) {
-                            Box(Modifier.size(20.toDp()))
-                        }
+                    FlowRow(Modifier.onSizeChanged { height = it.height }) {
+                        repeat(10) { Box(Modifier.size(20.toDp())) }
                     }
                 }
             }
@@ -143,14 +124,8 @@
         rule.setContent {
             with(LocalDensity.current) {
                 Box(Modifier.size(100.toDp())) {
-                    FlowColumn(
-                        Modifier
-                            .onSizeChanged {
-                                width = it.width
-                            }) {
-                        repeat(10) {
-                            Box(Modifier.size(20.toDp()))
-                        }
+                    FlowColumn(Modifier.onSizeChanged { width = it.width }) {
+                        repeat(10) { Box(Modifier.size(20.toDp())) }
                     }
                 }
             }
@@ -167,14 +142,8 @@
         rule.setContent {
             with(LocalDensity.current) {
                 Box(Modifier.size(60.toDp())) {
-                    FlowRow(
-                        Modifier
-                            .onSizeChanged {
-                                height = it.height
-                            }) {
-                        repeat(6) {
-                            Box(Modifier.size(20.toDp()))
-                        }
+                    FlowRow(Modifier.onSizeChanged { height = it.height }) {
+                        repeat(6) { Box(Modifier.size(20.toDp())) }
                     }
                 }
             }
@@ -191,14 +160,8 @@
         rule.setContent {
             with(LocalDensity.current) {
                 Box(Modifier.size(60.toDp())) {
-                    FlowColumn(
-                        Modifier
-                            .onSizeChanged {
-                                width = it.width
-                            }) {
-                        repeat(6) {
-                            Box(Modifier.size(20.toDp()))
-                        }
+                    FlowColumn(Modifier.onSizeChanged { width = it.width }) {
+                        repeat(6) { Box(Modifier.size(20.toDp())) }
                     }
                 }
             }
@@ -215,15 +178,8 @@
         rule.setContent {
             with(LocalDensity.current) {
                 Box(Modifier.size(60.toDp())) {
-                    FlowRow(
-                        Modifier
-                            .onSizeChanged {
-                                height = it.height
-                            }, maxItemsInEachRow = 2
-                    ) {
-                        repeat(6) {
-                            Box(Modifier.size(20.toDp()))
-                        }
+                    FlowRow(Modifier.onSizeChanged { height = it.height }, maxItemsInEachRow = 2) {
+                        repeat(6) { Box(Modifier.size(20.toDp())) }
                     }
                 }
             }
@@ -241,14 +197,10 @@
             with(LocalDensity.current) {
                 Box(Modifier.size(60.toDp())) {
                     FlowColumn(
-                        Modifier
-                            .onSizeChanged {
-                                width = it.width
-                            }, maxItemsInEachColumn = 2
+                        Modifier.onSizeChanged { width = it.width },
+                        maxItemsInEachColumn = 2
                     ) {
-                        repeat(6) {
-                            Box(Modifier.size(20.toDp()))
-                        }
+                        repeat(6) { Box(Modifier.size(20.toDp())) }
                     }
                 }
             }
@@ -265,19 +217,8 @@
         rule.setContent {
             with(LocalDensity.current) {
                 Box(Modifier.size(60.toDp())) {
-                    FlowRow(
-                        Modifier
-                            .onSizeChanged {
-                                height = it.height
-                            }, maxItemsInEachRow = 2
-                    ) {
-                        repeat(6) {
-                            Box(
-                                Modifier
-                                    .size(20.toDp())
-                                    .weight(1f, true)
-                            )
-                        }
+                    FlowRow(Modifier.onSizeChanged { height = it.height }, maxItemsInEachRow = 2) {
+                        repeat(6) { Box(Modifier.size(20.toDp()).weight(1f, true)) }
                     }
                 }
             }
@@ -295,18 +236,10 @@
             with(LocalDensity.current) {
                 Box(Modifier.size(60.toDp())) {
                     FlowColumn(
-                        Modifier
-                            .onSizeChanged {
-                                width = it.width
-                            }, maxItemsInEachColumn = 2
+                        Modifier.onSizeChanged { width = it.width },
+                        maxItemsInEachColumn = 2
                     ) {
-                        repeat(6) {
-                            Box(
-                                Modifier
-                                    .size(20.toDp())
-                                    .weight(1f, true)
-                            )
-                        }
+                        repeat(6) { Box(Modifier.size(20.toDp()).weight(1f, true)) }
                     }
                 }
             }
@@ -323,14 +256,8 @@
         rule.setContent {
             with(LocalDensity.current) {
                 Box(Modifier.size(50.toDp())) {
-                    FlowRow(
-                        Modifier
-                            .onSizeChanged {
-                                height = it.height
-                            }) {
-                        repeat(2) {
-                            Box(Modifier.size(20.toDp()))
-                        }
+                    FlowRow(Modifier.onSizeChanged { height = it.height }) {
+                        repeat(2) { Box(Modifier.size(20.toDp())) }
                     }
                 }
             }
@@ -345,12 +272,9 @@
         val listOfHeights = mutableListOf<Int>()
 
         rule.setContent {
-            CompositionLocalProvider(
-                LocalDensity provides NoOpDensity
-            ) {
+            CompositionLocalProvider(LocalDensity provides NoOpDensity) {
                 FlowRow(
-                    Modifier
-                        .fillMaxWidth(1f)
+                    Modifier.fillMaxWidth(1f)
                         .padding(20.dp)
                         .wrapContentHeight(align = Alignment.Top),
                     horizontalArrangement = Arrangement.spacedBy(10.dp),
@@ -359,10 +283,7 @@
                 ) {
                     repeat(9) {
                         Box(
-                            Modifier
-                                .onSizeChanged {
-                                    listOfHeights.add(it.height)
-                                }
+                            Modifier.onSizeChanged { listOfHeights.add(it.height) }
                                 .width(100.dp)
                                 .background(Color.Green)
                                 .fillMaxRowHeight()
@@ -394,21 +315,15 @@
         rule.setContent {
             with(LocalDensity.current) {
                 FlowRow(
-                    Modifier
-                        .fillMaxWidth(1f)
+                    Modifier.fillMaxWidth(1f)
                         .wrapContentHeight(align = Alignment.Top)
-                        .onSizeChanged {
-                            finalHeight = it.height
-                        },
+                        .onSizeChanged { finalHeight = it.height },
                     horizontalArrangement = Arrangement.spacedBy(10.dp),
                     maxItemsInEachRow = 3,
                 ) {
                     repeat(9) {
                         Box(
-                            Modifier
-                                .onSizeChanged {
-                                    listOfHeights.add(it.height)
-                                }
+                            Modifier.onSizeChanged { listOfHeights.add(it.height) }
                                 .width(100.dp)
                                 .background(Color.Green)
                                 .fillMaxRowHeight(0f)
@@ -420,9 +335,7 @@
 
         rule.waitForIdle()
         var desiredHeights = mutableListOf<Int>()
-        repeat(9) {
-            desiredHeights.add(0)
-        }
+        repeat(9) { desiredHeights.add(0) }
         Truth.assertThat(listOfHeights).containsExactlyElementsIn(desiredHeights)
         Truth.assertThat(finalHeight).isEqualTo(0)
     }
@@ -433,27 +346,19 @@
         var finalHeight = 0
 
         rule.setContent {
-            CompositionLocalProvider(
-                LocalDensity provides NoOpDensity
-            ) {
+            CompositionLocalProvider(LocalDensity provides NoOpDensity) {
                 with(LocalDensity.current) {
                     FlowRow(
-                        Modifier
-                            .fillMaxWidth(1f)
+                        Modifier.fillMaxWidth(1f)
                             .padding(20.dp)
                             .wrapContentHeight(align = Alignment.Top)
-                            .onSizeChanged {
-                                finalHeight = it.height
-                            },
+                            .onSizeChanged { finalHeight = it.height },
                         horizontalArrangement = Arrangement.spacedBy(10.dp),
                         maxItemsInEachRow = 3,
                     ) {
                         repeat(9) {
                             Box(
-                                Modifier
-                                    .onSizeChanged {
-                                        listOfHeights.add(it.height)
-                                    }
+                                Modifier.onSizeChanged { listOfHeights.add(it.height) }
                                     .width(100.dp)
                                     .background(Color.Green)
                                     .run {
@@ -474,9 +379,7 @@
 
         rule.waitForIdle()
         var desiredHeights = mutableListOf<Int>()
-        repeat(9) {
-            desiredHeights.add(if (it % 3 == 0) 0 else 20)
-        }
+        repeat(9) { desiredHeights.add(if (it % 3 == 0) 0 else 20) }
         Truth.assertThat(listOfHeights).containsExactlyElementsIn(desiredHeights)
         Truth.assertThat(finalHeight).isEqualTo(60)
     }
@@ -486,12 +389,9 @@
         val listOfHeights = mutableListOf<Int>()
 
         rule.setContent {
-            CompositionLocalProvider(
-                LocalDensity provides NoOpDensity
-            ) {
+            CompositionLocalProvider(LocalDensity provides NoOpDensity) {
                 FlowRow(
-                    Modifier
-                        .fillMaxWidth(1f)
+                    Modifier.fillMaxWidth(1f)
                         .padding(20.dp)
                         .wrapContentHeight(align = Alignment.Top),
                     horizontalArrangement = Arrangement.spacedBy(10.dp),
@@ -500,10 +400,7 @@
                 ) {
                     repeat(9) {
                         Box(
-                            Modifier
-                                .onSizeChanged {
-                                    listOfHeights.add(it.height)
-                                }
+                            Modifier.onSizeChanged { listOfHeights.add(it.height) }
                                 .width(100.dp)
                                 .weight(1f, true)
                                 .background(Color.Green)
@@ -533,12 +430,9 @@
         val listOfHeights = mutableListOf<Int>()
 
         rule.setContent {
-            CompositionLocalProvider(
-                LocalDensity provides NoOpDensity
-            ) {
+            CompositionLocalProvider(LocalDensity provides NoOpDensity) {
                 FlowRow(
-                    Modifier
-                        .fillMaxWidth(1f)
+                    Modifier.fillMaxWidth(1f)
                         .padding(20.dp)
                         .wrapContentHeight(align = Alignment.Top, unbounded = true),
                     horizontalArrangement = Arrangement.spacedBy(10.dp),
@@ -547,8 +441,7 @@
                 ) {
                     repeat(9) { index ->
                         Box(
-                            Modifier
-                                .width(100.dp)
+                            Modifier.width(100.dp)
                                 .background(Color.Green)
                                 .run {
                                     if (index == 0 || index == 3 || index == 6) {
@@ -557,9 +450,7 @@
                                         height(200.dp.times(index))
                                     }
                                 }
-                                .onPlaced {
-                                    listOfHeights.add(index, it.size.height)
-                                }
+                                .onPlaced { listOfHeights.add(index, it.size.height) }
                         )
                     }
                 }
@@ -585,12 +476,9 @@
         val listOfWidths = mutableListOf<Int>()
 
         rule.setContent {
-            CompositionLocalProvider(
-                LocalDensity provides NoOpDensity
-            ) {
+            CompositionLocalProvider(LocalDensity provides NoOpDensity) {
                 FlowColumn(
-                    Modifier
-                        .wrapContentWidth(align = Alignment.Start)
+                    Modifier.wrapContentWidth(align = Alignment.Start)
                         .padding(20.dp)
                         .fillMaxHeight(1f),
                     horizontalArrangement = Arrangement.spacedBy(20.dp),
@@ -599,10 +487,7 @@
                 ) {
                     repeat(9) {
                         Box(
-                            Modifier
-                                .onSizeChanged {
-                                    listOfWidths.add(it.width)
-                                }
+                            Modifier.onSizeChanged { listOfWidths.add(it.width) }
                                 .height(100.dp)
                                 .background(Color.Green)
                                 .fillMaxColumnWidth()
@@ -631,12 +516,9 @@
         val listOfWidths = mutableListOf<Int>()
 
         rule.setContent {
-            CompositionLocalProvider(
-                LocalDensity provides NoOpDensity
-            ) {
+            CompositionLocalProvider(LocalDensity provides NoOpDensity) {
                 FlowColumn(
-                    Modifier
-                        .wrapContentWidth(align = Alignment.Start)
+                    Modifier.wrapContentWidth(align = Alignment.Start)
                         .fillMaxHeight(1f)
                         .padding(20.dp),
                     horizontalArrangement = Arrangement.spacedBy(20.dp),
@@ -645,10 +527,7 @@
                 ) {
                     repeat(9) {
                         Box(
-                            Modifier
-                                .onSizeChanged {
-                                    listOfWidths.add(it.width)
-                                }
+                            Modifier.onSizeChanged { listOfWidths.add(it.width) }
                                 .height(100.dp)
                                 .weight(1f, true)
                                 .background(Color.Green)
@@ -678,12 +557,9 @@
         val listOfWidths = mutableListOf<Int>()
 
         rule.setContent {
-            CompositionLocalProvider(
-                LocalDensity provides NoOpDensity
-            ) {
+            CompositionLocalProvider(LocalDensity provides NoOpDensity) {
                 FlowColumn(
-                    Modifier
-                        .wrapContentWidth(align = Alignment.Start, unbounded = true)
+                    Modifier.wrapContentWidth(align = Alignment.Start, unbounded = true)
                         .padding(20.dp)
                         .fillMaxWidth(1f),
                     horizontalArrangement = Arrangement.spacedBy(20.dp),
@@ -692,10 +568,7 @@
                 ) {
                     repeat(9) {
                         Box(
-                            Modifier
-                                .onPlaced {
-                                    listOfWidths.add(it.size.width)
-                                }
+                            Modifier.onPlaced { listOfWidths.add(it.size.width) }
                                 .height(100.dp)
                                 .background(Color.Green)
                                 .run {
@@ -733,14 +606,8 @@
         rule.setContent {
             with(LocalDensity.current) {
                 Box(Modifier.size(50.toDp())) {
-                    FlowColumn(
-                        Modifier
-                            .onSizeChanged {
-                                width = it.width
-                            }) {
-                        repeat(2) {
-                            Box(Modifier.size(20.toDp()))
-                        }
+                    FlowColumn(Modifier.onSizeChanged { width = it.width }) {
+                        repeat(2) { Box(Modifier.size(20.toDp())) }
                     }
                 }
             }
@@ -757,14 +624,8 @@
         rule.setContent {
             with(LocalDensity.current) {
                 Box(Modifier.size(50.toDp())) {
-                    FlowRow(
-                        Modifier
-                            .onSizeChanged {
-                                height = it.height
-                            }) {
-                        repeat(3) {
-                            Box(Modifier.size(20.toDp()))
-                        }
+                    FlowRow(Modifier.onSizeChanged { height = it.height }) {
+                        repeat(3) { Box(Modifier.size(20.toDp())) }
                     }
                 }
             }
@@ -781,14 +642,8 @@
         rule.setContent {
             with(LocalDensity.current) {
                 Box(Modifier.size(50.toDp())) {
-                    FlowColumn(
-                        Modifier
-                            .onSizeChanged {
-                                width = it.width
-                            }) {
-                        repeat(3) {
-                            Box(Modifier.size(20.toDp()))
-                        }
+                    FlowColumn(Modifier.onSizeChanged { width = it.width }) {
+                        repeat(3) { Box(Modifier.size(20.toDp())) }
                     }
                 }
             }
@@ -806,12 +661,11 @@
         rule.setContent {
             Box(Modifier.size(100.dp)) {
                 FlowRow(
-                    Modifier
-                        .onSizeChanged {
-                            height = it.height
-                            width = it.width
-                        }) {
-                }
+                    Modifier.onSizeChanged {
+                        height = it.height
+                        width = it.width
+                    }
+                ) {}
             }
         }
 
@@ -828,12 +682,11 @@
         rule.setContent {
             Box(Modifier.size(100.dp)) {
                 FlowColumn(
-                    Modifier
-                        .onSizeChanged {
-                            height = it.height
-                            width = it.width
-                        }) {
-                }
+                    Modifier.onSizeChanged {
+                        height = it.height
+                        width = it.width
+                    }
+                ) {}
             }
         }
 
@@ -855,8 +708,7 @@
                     FlowRow() {
                         repeat(5) { index ->
                             Box(
-                                Modifier
-                                    .size(
+                                Modifier.size(
                                         20.toDp(),
                                         if (index == 4) {
                                             shorterHeight.toDp()
@@ -869,7 +721,8 @@
                                             val positionInParent = it.positionInParent()
                                             positionInParentY = positionInParent.y
                                         }
-                                    })
+                                    }
+                            )
                         }
                     }
                 }
@@ -893,8 +746,7 @@
                     FlowRow() {
                         repeat(5) { index ->
                             Box(
-                                Modifier
-                                    .align(Alignment.CenterVertically)
+                                Modifier.align(Alignment.CenterVertically)
                                     .size(
                                         20.toDp(),
                                         if (index == 4) {
@@ -908,7 +760,8 @@
                                             val positionInParent = it.positionInParent()
                                             positionInParentY = positionInParent.y
                                         }
-                                    })
+                                    }
+                            )
                         }
                     }
                 }
@@ -931,8 +784,7 @@
                     FlowColumn() {
                         repeat(5) { index ->
                             Box(
-                                Modifier
-                                    .size(
+                                Modifier.size(
                                         if (index == 4) {
                                             shorterWidth.toDp()
                                         } else {
@@ -945,7 +797,8 @@
                                             val positionInParent = it.positionInParent()
                                             positionInParentX = positionInParent.x
                                         }
-                                    })
+                                    }
+                            )
                         }
                     }
                 }
@@ -969,8 +822,7 @@
                     FlowColumn() {
                         repeat(5) { index ->
                             Box(
-                                Modifier
-                                    .align(Alignment.CenterHorizontally)
+                                Modifier.align(Alignment.CenterHorizontally)
                                     .size(
                                         if (index == 4) {
                                             shorterWidth.toDp()
@@ -984,7 +836,8 @@
                                             val positionInParent = it.positionInParent()
                                             positionInParentX = positionInParent.x
                                         }
-                                    })
+                                    }
+                            )
                         }
                     }
                 }
@@ -1012,19 +865,16 @@
             with(LocalDensity.current) {
                 Box(Modifier.size(200.toDp())) {
                     FlowRow(
-                        Modifier
-                            .fillMaxWidth(1f),
+                        Modifier.fillMaxWidth(1f),
                         horizontalArrangement = Arrangement.SpaceAround
                     ) {
                         repeat(5) { index ->
                             Box(
-                                Modifier
-                                    .size(20.toDp())
-                                    .onPlaced {
-                                        val positionInParent = it.positionInParent()
-                                        val xPosition = positionInParent.x
-                                        xPositions[index] = xPosition
-                                    }
+                                Modifier.size(20.toDp()).onPlaced {
+                                    val positionInParent = it.positionInParent()
+                                    val xPosition = positionInParent.x
+                                    xPositions[index] = xPosition
+                                }
                             )
                         }
                     }
@@ -1037,9 +887,7 @@
         xPositions.forEach {
             val xPosition = it
             expectedXPosition += gapSize
-            Truth
-                .assertThat(xPosition)
-                .isEqualTo(expectedXPosition)
+            Truth.assertThat(xPosition).isEqualTo(expectedXPosition)
             expectedXPosition += eachSize
             expectedXPosition += gapSize
         }
@@ -1054,9 +902,7 @@
         var itemsShownCount = 0
 
         rule.setContent {
-            CompositionLocalProvider(
-                LocalDensity provides NoOpDensity
-            ) {
+            CompositionLocalProvider(LocalDensity provides NoOpDensity) {
                 FlowRow(
                     modifier = Modifier.width(200.dp),
                     horizontalArrangement = Arrangement.spacedBy(spacing.dp),
@@ -1065,11 +911,8 @@
                 ) {
                     repeat(totalItems) { index ->
                         Box(
-                            modifier = Modifier
-                                .size(itemSize.dp)
-                                .onPlaced {
-                                    itemsShownCount = index + 1
-                                }
+                            modifier =
+                                Modifier.size(itemSize.dp).onPlaced { itemsShownCount = index + 1 }
                         )
                     }
                 }
@@ -1091,9 +934,7 @@
         var itemsShownCount = 0
 
         rule.setContent {
-            CompositionLocalProvider(
-                LocalDensity provides NoOpDensity
-            ) {
+            CompositionLocalProvider(LocalDensity provides NoOpDensity) {
                 FlowColumn(
                     modifier = Modifier.height(200.dp),
                     verticalArrangement = Arrangement.spacedBy(spacing.dp),
@@ -1102,11 +943,8 @@
                 ) {
                     repeat(totalItems) { index ->
                         Box(
-                            modifier = Modifier
-                                .size(itemSize.dp)
-                                .onPlaced {
-                                    itemsShownCount = index + 1
-                                }
+                            modifier =
+                                Modifier.size(itemSize.dp).onPlaced { itemsShownCount = index + 1 }
                         )
                     }
                 }
@@ -1128,24 +966,17 @@
         var itemsShownCount = 0
 
         rule.setContent {
-            CompositionLocalProvider(
-                LocalDensity provides NoOpDensity
-            ) {
+            CompositionLocalProvider(LocalDensity provides NoOpDensity) {
                 FlowRow(
-                    modifier = Modifier
-                        .width(200.dp)
-                        .height(maxHeight.dp),
+                    modifier = Modifier.width(200.dp).height(maxHeight.dp),
                     horizontalArrangement = Arrangement.spacedBy(spacing.dp),
                     verticalArrangement = Arrangement.spacedBy(spacing.dp),
                     overflow = FlowRowOverflow.Visible
                 ) {
                     repeat(totalItems) { index ->
                         Box(
-                            modifier = Modifier
-                                .size(itemSize.dp)
-                                .onPlaced {
-                                    itemsShownCount = index + 1
-                                }
+                            modifier =
+                                Modifier.size(itemSize.dp).onPlaced { itemsShownCount = index + 1 }
                         )
                     }
                 }
@@ -1167,24 +998,17 @@
         var itemsShownCount = 0
 
         rule.setContent {
-            CompositionLocalProvider(
-                LocalDensity provides NoOpDensity
-            ) {
+            CompositionLocalProvider(LocalDensity provides NoOpDensity) {
                 FlowColumn(
-                    modifier = Modifier
-                        .height(200.dp)
-                        .width(maxWidth.dp),
+                    modifier = Modifier.height(200.dp).width(maxWidth.dp),
                     verticalArrangement = Arrangement.spacedBy(spacing.dp),
                     horizontalArrangement = Arrangement.spacedBy(spacing.dp),
                     overflow = FlowColumnOverflow.Visible
                 ) {
                     repeat(totalItems) { index ->
                         Box(
-                            modifier = Modifier
-                                .size(itemSize.dp)
-                                .onPlaced {
-                                    itemsShownCount = index + 1
-                                }
+                            modifier =
+                                Modifier.size(itemSize.dp).onPlaced { itemsShownCount = index + 1 }
                         )
                     }
                 }
@@ -1206,9 +1030,7 @@
         var itemsShownCount = 0
 
         rule.setContent {
-            CompositionLocalProvider(
-                LocalDensity provides NoOpDensity
-            ) {
+            CompositionLocalProvider(LocalDensity provides NoOpDensity) {
                 FlowRow(
                     modifier = Modifier.width(200.dp),
                     horizontalArrangement = Arrangement.spacedBy(spacing.dp),
@@ -1217,11 +1039,8 @@
                 ) {
                     repeat(totalItems) { index ->
                         Box(
-                            modifier = Modifier
-                                .size(itemSize.dp)
-                                .onPlaced {
-                                    itemsShownCount = index + 1
-                                }
+                            modifier =
+                                Modifier.size(itemSize.dp).onPlaced { itemsShownCount = index + 1 }
                         )
                     }
                 }
@@ -1243,9 +1062,7 @@
         var itemsShownCount = 0
 
         rule.setContent {
-            CompositionLocalProvider(
-                LocalDensity provides NoOpDensity
-            ) {
+            CompositionLocalProvider(LocalDensity provides NoOpDensity) {
                 FlowColumn(
                     modifier = Modifier.height(200.dp),
                     verticalArrangement = Arrangement.spacedBy(spacing.dp),
@@ -1254,11 +1071,8 @@
                 ) {
                     repeat(totalItems) { index ->
                         Box(
-                            modifier = Modifier
-                                .size(itemSize.dp)
-                                .onPlaced {
-                                    itemsShownCount = index + 1
-                                }
+                            modifier =
+                                Modifier.size(itemSize.dp).onPlaced { itemsShownCount = index + 1 }
                         )
                     }
                 }
@@ -1280,24 +1094,17 @@
         var itemsShownCount = 0
 
         rule.setContent {
-            CompositionLocalProvider(
-                LocalDensity provides NoOpDensity
-            ) {
+            CompositionLocalProvider(LocalDensity provides NoOpDensity) {
                 FlowRow(
-                    modifier = Modifier
-                        .width(200.dp)
-                        .height(maxHeight.dp),
+                    modifier = Modifier.width(200.dp).height(maxHeight.dp),
                     horizontalArrangement = Arrangement.spacedBy(spacing.dp),
                     verticalArrangement = Arrangement.spacedBy(spacing.dp),
                     overflow = FlowRowOverflow.Clip
                 ) {
                     repeat(totalItems) { index ->
                         Box(
-                            modifier = Modifier
-                                .size(itemSize.dp)
-                                .onPlaced {
-                                    itemsShownCount = index + 1
-                                }
+                            modifier =
+                                Modifier.size(itemSize.dp).onPlaced { itemsShownCount = index + 1 }
                         )
                     }
                 }
@@ -1319,24 +1126,17 @@
         var itemsShownCount = 0
 
         rule.setContent {
-            CompositionLocalProvider(
-                LocalDensity provides NoOpDensity
-            ) {
+            CompositionLocalProvider(LocalDensity provides NoOpDensity) {
                 FlowColumn(
-                    modifier = Modifier
-                        .height(200.dp)
-                        .width(maxWidth.dp),
+                    modifier = Modifier.height(200.dp).width(maxWidth.dp),
                     verticalArrangement = Arrangement.spacedBy(spacing.dp),
                     horizontalArrangement = Arrangement.spacedBy(spacing.dp),
                     overflow = FlowColumnOverflow.Clip
                 ) {
                     repeat(totalItems) { index ->
                         Box(
-                            modifier = Modifier
-                                .size(itemSize.dp)
-                                .onPlaced {
-                                    itemsShownCount = index + 1
-                                }
+                            modifier =
+                                Modifier.size(itemSize.dp).onPlaced { itemsShownCount = index + 1 }
                         )
                     }
                 }
@@ -1361,37 +1161,31 @@
 
         rule.setContent {
             var maxLines by remember { mutableStateOf(2) }
-            CompositionLocalProvider(
-                LocalDensity provides NoOpDensity
-            ) {
+            CompositionLocalProvider(LocalDensity provides NoOpDensity) {
                 FlowRow(
                     modifier = Modifier.width(200.dp),
                     horizontalArrangement = Arrangement.spacedBy(spacing.dp),
                     maxLines = maxLines,
-                    overflow = FlowRowOverflow.expandIndicator {
-                        Box(
-                            modifier = Modifier
-                                .clickable {
-                                    itemsShownCount = 0
-                                    seeMoreShown = false
-                                    maxLines += 2
-                                    finalMaxLines = maxLines
-                                }
-                                .size(itemSize.dp)
-                                .testTag(seeMoreTag)
-                                .onGloballyPositioned {
-                                    seeMoreShown = true
-                                }
-                        )
-                    }
+                    overflow =
+                        FlowRowOverflow.expandIndicator {
+                            Box(
+                                modifier =
+                                    Modifier.clickable {
+                                            itemsShownCount = 0
+                                            seeMoreShown = false
+                                            maxLines += 2
+                                            finalMaxLines = maxLines
+                                        }
+                                        .size(itemSize.dp)
+                                        .testTag(seeMoreTag)
+                                        .onGloballyPositioned { seeMoreShown = true }
+                            )
+                        }
                 ) {
                     repeat(totalItems) { index ->
                         Box(
-                            modifier = Modifier
-                                .size(itemSize.dp)
-                                .onPlaced {
-                                    itemsShownCount = index + 1
-                                }
+                            modifier =
+                                Modifier.size(itemSize.dp).onPlaced { itemsShownCount = index + 1 }
                         )
                     }
                 }
@@ -1404,8 +1198,7 @@
             Truth.assertThat(itemsShownCount).isEqualTo(5)
             Truth.assertThat(seeMoreShown).isTrue()
         }
-        rule.onNodeWithTag(seeMoreTag)
-            .performTouchInput { click() }
+        rule.onNodeWithTag(seeMoreTag).performTouchInput { click() }
 
         advanceClock()
 
@@ -1416,8 +1209,7 @@
             Truth.assertThat(seeMoreShown).isTrue()
         }
 
-        rule.onNodeWithTag(seeMoreTag)
-            .performTouchInput { click() }
+        rule.onNodeWithTag(seeMoreTag).performTouchInput { click() }
 
         advanceClock()
         rule.runOnIdle {
@@ -1440,37 +1232,31 @@
 
         rule.setContent {
             var maxLines by remember { mutableStateOf(2) }
-            CompositionLocalProvider(
-                LocalDensity provides NoOpDensity
-            ) {
+            CompositionLocalProvider(LocalDensity provides NoOpDensity) {
                 FlowColumn(
                     modifier = Modifier.height(200.dp),
                     verticalArrangement = Arrangement.spacedBy(spacing.dp),
                     maxLines = maxLines,
-                    overflow = FlowColumnOverflow.expandIndicator {
-                        Box(
-                            modifier = Modifier
-                                .clickable {
-                                    itemsShownCount = 0
-                                    seeMoreShown = false
-                                    maxLines += 2
-                                    finalMaxLines = maxLines
-                                }
-                                .size(itemSize.dp)
-                                .testTag(seeMoreTag)
-                                .onGloballyPositioned {
-                                    seeMoreShown = true
-                                }
-                        )
-                    }
+                    overflow =
+                        FlowColumnOverflow.expandIndicator {
+                            Box(
+                                modifier =
+                                    Modifier.clickable {
+                                            itemsShownCount = 0
+                                            seeMoreShown = false
+                                            maxLines += 2
+                                            finalMaxLines = maxLines
+                                        }
+                                        .size(itemSize.dp)
+                                        .testTag(seeMoreTag)
+                                        .onGloballyPositioned { seeMoreShown = true }
+                            )
+                        }
                 ) {
                     repeat(totalItems) { index ->
                         Box(
-                            modifier = Modifier
-                                .size(itemSize.dp)
-                                .onPlaced {
-                                    itemsShownCount = index + 1
-                                }
+                            modifier =
+                                Modifier.size(itemSize.dp).onPlaced { itemsShownCount = index + 1 }
                         )
                     }
                 }
@@ -1483,8 +1269,7 @@
             Truth.assertThat(itemsShownCount).isEqualTo(5)
             Truth.assertThat(seeMoreShown).isTrue()
         }
-        rule.onNodeWithTag(seeMoreTag)
-            .performTouchInput { click() }
+        rule.onNodeWithTag(seeMoreTag).performTouchInput { click() }
 
         advanceClock()
 
@@ -1495,8 +1280,7 @@
             Truth.assertThat(seeMoreShown).isTrue()
         }
 
-        rule.onNodeWithTag(seeMoreTag)
-            .performTouchInput { click() }
+        rule.onNodeWithTag(seeMoreTag).performTouchInput { click() }
 
         advanceClock()
         rule.runOnIdle {
@@ -1519,37 +1303,31 @@
 
         rule.setContent {
             var maxHeight by remember { mutableStateOf(120.dp) }
-            CompositionLocalProvider(
-                LocalDensity provides NoOpDensity
-            ) {
+            CompositionLocalProvider(LocalDensity provides NoOpDensity) {
                 FlowRow(
-                    modifier = Modifier
-                        .width(200.dp)
-                        .height(maxHeight),
+                    modifier = Modifier.width(200.dp).height(maxHeight),
                     horizontalArrangement = Arrangement.spacedBy(spacing.dp),
                     verticalArrangement = Arrangement.spacedBy(spacing.dp),
-                    overflow = FlowRowOverflow.expandIndicator {
-                        Box(
-                            modifier = Modifier
-                                .clickable {
-                                    itemsShownCount = 0
-                                    seeMoreShown = false
-                                    maxHeight += 100.dp + (spacing.dp * 2)
-                                    finalMaxHeight = maxHeight
-                                }
-                                .size(itemSize.dp)
-                                .testTag(seeMoreTag)
-                                .onGloballyPositioned {
-                                    seeMoreShown = true
-                                }
-                        )
-                    }
+                    overflow =
+                        FlowRowOverflow.expandIndicator {
+                            Box(
+                                modifier =
+                                    Modifier.clickable {
+                                            itemsShownCount = 0
+                                            seeMoreShown = false
+                                            maxHeight += 100.dp + (spacing.dp * 2)
+                                            finalMaxHeight = maxHeight
+                                        }
+                                        .size(itemSize.dp)
+                                        .testTag(seeMoreTag)
+                                        .onGloballyPositioned { seeMoreShown = true }
+                            )
+                        }
                 ) {
                     repeat(totalItems) { index ->
                         Box(
-                            modifier = Modifier
-                                .size(itemSize.dp)
-                                .onGloballyPositioned {
+                            modifier =
+                                Modifier.size(itemSize.dp).onGloballyPositioned {
                                     itemsShownCount = index + 1
                                 }
                         )
@@ -1565,8 +1343,7 @@
             Truth.assertThat(seeMoreShown).isTrue()
             itemsShownCount = 0
         }
-        rule.onNodeWithTag(seeMoreTag)
-            .performTouchInput { click() }
+        rule.onNodeWithTag(seeMoreTag).performTouchInput { click() }
 
         advanceClock()
 
@@ -1578,8 +1355,7 @@
             itemsShownCount = 0
         }
 
-        rule.onNodeWithTag(seeMoreTag)
-            .performTouchInput { click() }
+        rule.onNodeWithTag(seeMoreTag).performTouchInput { click() }
 
         advanceClock()
         rule.runOnIdle {
@@ -1602,37 +1378,31 @@
 
         rule.setContent {
             var maxWidth by remember { mutableStateOf(120.dp) }
-            CompositionLocalProvider(
-                LocalDensity provides NoOpDensity
-            ) {
+            CompositionLocalProvider(LocalDensity provides NoOpDensity) {
                 FlowColumn(
-                    modifier = Modifier
-                        .height(200.dp)
-                        .width(maxWidth),
+                    modifier = Modifier.height(200.dp).width(maxWidth),
                     verticalArrangement = Arrangement.spacedBy(spacing.dp),
                     horizontalArrangement = Arrangement.spacedBy(spacing.dp),
-                    overflow = FlowColumnOverflow.expandIndicator {
-                        Box(
-                            modifier = Modifier
-                                .clickable {
-                                    itemsShownCount = 0
-                                    seeMoreShown = false
-                                    maxWidth += 100.dp + (spacing.dp * 2)
-                                    finalMaxWidth = maxWidth
-                                }
-                                .size(itemSize.dp)
-                                .testTag(seeMoreTag)
-                                .onGloballyPositioned {
-                                    seeMoreShown = true
-                                }
-                        )
-                    }
+                    overflow =
+                        FlowColumnOverflow.expandIndicator {
+                            Box(
+                                modifier =
+                                    Modifier.clickable {
+                                            itemsShownCount = 0
+                                            seeMoreShown = false
+                                            maxWidth += 100.dp + (spacing.dp * 2)
+                                            finalMaxWidth = maxWidth
+                                        }
+                                        .size(itemSize.dp)
+                                        .testTag(seeMoreTag)
+                                        .onGloballyPositioned { seeMoreShown = true }
+                            )
+                        }
                 ) {
                     repeat(totalItems) { index ->
                         Box(
-                            modifier = Modifier
-                                .size(itemSize.dp)
-                                .onGloballyPositioned {
+                            modifier =
+                                Modifier.size(itemSize.dp).onGloballyPositioned {
                                     itemsShownCount = index + 1
                                 }
                         )
@@ -1648,8 +1418,7 @@
             Truth.assertThat(seeMoreShown).isTrue()
             itemsShownCount = 0
         }
-        rule.onNodeWithTag(seeMoreTag)
-            .performTouchInput { click() }
+        rule.onNodeWithTag(seeMoreTag).performTouchInput { click() }
 
         advanceClock()
 
@@ -1661,8 +1430,7 @@
             itemsShownCount = 0
         }
 
-        rule.onNodeWithTag(seeMoreTag)
-            .performTouchInput { click() }
+        rule.onNodeWithTag(seeMoreTag).performTouchInput { click() }
 
         advanceClock()
         rule.runOnIdle {
@@ -1681,33 +1449,26 @@
 
         rule.setContent {
             var maxLines by remember { mutableStateOf(2) }
-            CompositionLocalProvider(
-                LocalDensity provides NoOpDensity
-            ) {
-
+            CompositionLocalProvider(LocalDensity provides NoOpDensity) {
                 FlowRow(
                     modifier = Modifier.width(200.dp),
                     horizontalArrangement = Arrangement.spacedBy(spacing.dp),
                     maxLines = maxLines,
-                    overflow = FlowRowOverflow.expandOrCollapseIndicator(
-                        expandIndicator = {
-                            Assert.assertThrows(RuntimeException::class.java) {
-                                totalItems - shownItemCount
+                    overflow =
+                        FlowRowOverflow.expandOrCollapseIndicator(
+                            expandIndicator = {
+                                Assert.assertThrows(RuntimeException::class.java) {
+                                    totalItems - shownItemCount
+                                }
+                            },
+                            collapseIndicator = {
+                                Assert.assertThrows(RuntimeException::class.java) {
+                                    totalItems - shownItemCount
+                                }
                             }
-                        },
-                        collapseIndicator = {
-                            Assert.assertThrows(RuntimeException::class.java) {
-                                totalItems - shownItemCount
-                            }
-                        }
-                    )
-                ) {
-                    repeat(totalItems) { _ ->
-                        Box(
-                            modifier = Modifier
-                                .size(itemSize.dp)
                         )
-                    }
+                ) {
+                    repeat(totalItems) { _ -> Box(modifier = Modifier.size(itemSize.dp)) }
                 }
             }
         }
@@ -1721,32 +1482,26 @@
 
         rule.setContent {
             var maxLines by remember { mutableStateOf(2) }
-            CompositionLocalProvider(
-                LocalDensity provides NoOpDensity
-            ) {
+            CompositionLocalProvider(LocalDensity provides NoOpDensity) {
                 FlowColumn(
                     modifier = Modifier.height(200.dp),
                     verticalArrangement = Arrangement.spacedBy(spacing.dp),
                     maxLines = maxLines,
-                    overflow = FlowColumnOverflow.expandOrCollapseIndicator(
-                        expandIndicator = {
-                            Assert.assertThrows(RuntimeException::class.java) {
-                                totalItems - shownItemCount
+                    overflow =
+                        FlowColumnOverflow.expandOrCollapseIndicator(
+                            expandIndicator = {
+                                Assert.assertThrows(RuntimeException::class.java) {
+                                    totalItems - shownItemCount
+                                }
+                            },
+                            collapseIndicator = {
+                                Assert.assertThrows(RuntimeException::class.java) {
+                                    totalItems - shownItemCount
+                                }
                             }
-                        },
-                        collapseIndicator = {
-                            Assert.assertThrows(RuntimeException::class.java) {
-                                totalItems - shownItemCount
-                            }
-                        }
-                    )
-                ) {
-                    repeat(totalItems) { _ ->
-                        Box(
-                            modifier = Modifier
-                                .size(itemSize.dp)
                         )
-                    }
+                ) {
+                    repeat(totalItems) { _ -> Box(modifier = Modifier.size(itemSize.dp)) }
                 }
             }
         }
@@ -1768,65 +1523,53 @@
 
         rule.setContent {
             var maxLines by remember { mutableStateOf(2) }
-            CompositionLocalProvider(
-                LocalDensity provides NoOpDensity
-            ) {
+            CompositionLocalProvider(LocalDensity provides NoOpDensity) {
                 FlowRow(
                     modifier = Modifier.width(200.dp),
                     horizontalArrangement = Arrangement.spacedBy(spacing.dp),
                     maxLines = maxLines,
-                    overflow = FlowRowOverflow.expandOrCollapseIndicator(
-                        expandIndicator = {
-                            scopeOnExpand = this
-                            Box(
-                                modifier = Modifier
-                                    .clickable {
-                                        itemsShownCount = 0
-                                        seeMoreShown = false
-                                        collapseShown = false
-                                        maxLines += 2
-                                        finalMaxLines = maxLines
-                                    }
-                                    .size(itemSize.dp)
-                                    .testTag(seeMoreTag)
-                                    .onGloballyPositioned {
-                                        seeMoreShown = true
-                                    }
-                                    .onPlaced {
-                                        seeMoreShown = true
-                                    }
-                            )
-                        },
-                        collapseIndicator = {
-                            scopeOnCollapse = this
-                            Box(
-                                modifier = Modifier
-                                    .clickable {
-                                        itemsShownCount = 0
-                                        seeMoreShown = false
-                                        collapseShown = false
-                                        maxLines = 2
-                                        finalMaxLines = maxLines
-                                    }
-                                    .size(itemSize.dp)
-                                    .testTag(collapseTag)
-                                    .onGloballyPositioned {
-                                        collapseShown = true
-                                    }
-                                    .onPlaced {
-                                        collapseShown = true
-                                    }
-                            )
-                        }
-                    )
+                    overflow =
+                        FlowRowOverflow.expandOrCollapseIndicator(
+                            expandIndicator = {
+                                scopeOnExpand = this
+                                Box(
+                                    modifier =
+                                        Modifier.clickable {
+                                                itemsShownCount = 0
+                                                seeMoreShown = false
+                                                collapseShown = false
+                                                maxLines += 2
+                                                finalMaxLines = maxLines
+                                            }
+                                            .size(itemSize.dp)
+                                            .testTag(seeMoreTag)
+                                            .onGloballyPositioned { seeMoreShown = true }
+                                            .onPlaced { seeMoreShown = true }
+                                )
+                            },
+                            collapseIndicator = {
+                                scopeOnCollapse = this
+                                Box(
+                                    modifier =
+                                        Modifier.clickable {
+                                                itemsShownCount = 0
+                                                seeMoreShown = false
+                                                collapseShown = false
+                                                maxLines = 2
+                                                finalMaxLines = maxLines
+                                            }
+                                            .size(itemSize.dp)
+                                            .testTag(collapseTag)
+                                            .onGloballyPositioned { collapseShown = true }
+                                            .onPlaced { collapseShown = true }
+                                )
+                            }
+                        )
                 ) {
                     repeat(totalItems) { index ->
                         Box(
-                            modifier = Modifier
-                                .size(itemSize.dp)
-                                .onPlaced {
-                                    itemsShownCount = index + 1
-                                }
+                            modifier =
+                                Modifier.size(itemSize.dp).onPlaced { itemsShownCount = index + 1 }
                         )
                     }
                 }
@@ -1841,8 +1584,7 @@
             Truth.assertThat(scopeOnExpand.shownItemCount).isEqualTo(scopeOnCollapse.shownItemCount)
             Truth.assertThat(scopeOnExpand.shownItemCount).isEqualTo(itemsShownCount)
         }
-        rule.onNodeWithTag(seeMoreTag)
-            .performTouchInput { click() }
+        rule.onNodeWithTag(seeMoreTag).performTouchInput { click() }
 
         advanceClock()
 
@@ -1856,8 +1598,7 @@
             Truth.assertThat(scopeOnExpand.shownItemCount).isEqualTo(itemsShownCount)
         }
 
-        rule.onNodeWithTag(seeMoreTag)
-            .performTouchInput { click() }
+        rule.onNodeWithTag(seeMoreTag).performTouchInput { click() }
 
         advanceClock()
         rule.runOnIdle {
@@ -1870,8 +1611,7 @@
             Truth.assertThat(scopeOnExpand.shownItemCount).isEqualTo(itemsShownCount)
         }
 
-        rule.onNodeWithTag(seeMoreTag)
-            .performTouchInput { click() }
+        rule.onNodeWithTag(seeMoreTag).performTouchInput { click() }
 
         advanceClock()
         rule.runOnIdle {
@@ -1883,8 +1623,7 @@
             Truth.assertThat(scopeOnExpand.shownItemCount).isEqualTo(scopeOnCollapse.shownItemCount)
             Truth.assertThat(scopeOnExpand.shownItemCount).isEqualTo(itemsShownCount)
         }
-        rule.onNodeWithTag(collapseTag)
-            .performTouchInput { click() }
+        rule.onNodeWithTag(collapseTag).performTouchInput { click() }
 
         advanceClock()
 
@@ -1913,65 +1652,53 @@
 
         rule.setContent {
             var maxLines by remember { mutableStateOf(2) }
-            CompositionLocalProvider(
-                LocalDensity provides NoOpDensity
-            ) {
+            CompositionLocalProvider(LocalDensity provides NoOpDensity) {
                 FlowColumn(
                     modifier = Modifier.height(200.dp),
                     verticalArrangement = Arrangement.spacedBy(spacing.dp),
                     maxLines = maxLines,
-                    overflow = FlowColumnOverflow.expandOrCollapseIndicator(
-                        expandIndicator = {
-                            scopeOnExpand = this
-                            Box(
-                                modifier = Modifier
-                                    .clickable {
-                                        itemsShownCount = 0
-                                        seeMoreShown = false
-                                        collapseShown = false
-                                        maxLines += 2
-                                        finalMaxLines = maxLines
-                                    }
-                                    .size(itemSize.dp)
-                                    .testTag(seeMoreTag)
-                                    .onGloballyPositioned {
-                                        seeMoreShown = true
-                                    }
-                                    .onPlaced {
-                                        seeMoreShown = true
-                                    }
-                            )
-                        },
-                        collapseIndicator = {
-                            scopeOnCollapse = this
-                            Box(
-                                modifier = Modifier
-                                    .clickable {
-                                        itemsShownCount = 0
-                                        seeMoreShown = false
-                                        collapseShown = false
-                                        maxLines = 2
-                                        finalMaxLines = maxLines
-                                    }
-                                    .size(itemSize.dp)
-                                    .testTag(collapseTag)
-                                    .onGloballyPositioned {
-                                        collapseShown = true
-                                    }
-                                    .onPlaced {
-                                        collapseShown = true
-                                    }
-                            )
-                        }
-                    )
+                    overflow =
+                        FlowColumnOverflow.expandOrCollapseIndicator(
+                            expandIndicator = {
+                                scopeOnExpand = this
+                                Box(
+                                    modifier =
+                                        Modifier.clickable {
+                                                itemsShownCount = 0
+                                                seeMoreShown = false
+                                                collapseShown = false
+                                                maxLines += 2
+                                                finalMaxLines = maxLines
+                                            }
+                                            .size(itemSize.dp)
+                                            .testTag(seeMoreTag)
+                                            .onGloballyPositioned { seeMoreShown = true }
+                                            .onPlaced { seeMoreShown = true }
+                                )
+                            },
+                            collapseIndicator = {
+                                scopeOnCollapse = this
+                                Box(
+                                    modifier =
+                                        Modifier.clickable {
+                                                itemsShownCount = 0
+                                                seeMoreShown = false
+                                                collapseShown = false
+                                                maxLines = 2
+                                                finalMaxLines = maxLines
+                                            }
+                                            .size(itemSize.dp)
+                                            .testTag(collapseTag)
+                                            .onGloballyPositioned { collapseShown = true }
+                                            .onPlaced { collapseShown = true }
+                                )
+                            }
+                        )
                 ) {
                     repeat(totalItems) { index ->
                         Box(
-                            modifier = Modifier
-                                .size(itemSize.dp)
-                                .onPlaced {
-                                    itemsShownCount = index + 1
-                                }
+                            modifier =
+                                Modifier.size(itemSize.dp).onPlaced { itemsShownCount = index + 1 }
                         )
                     }
                 }
@@ -1986,8 +1713,7 @@
             Truth.assertThat(scopeOnExpand.shownItemCount).isEqualTo(scopeOnCollapse.shownItemCount)
             Truth.assertThat(scopeOnExpand.shownItemCount).isEqualTo(itemsShownCount)
         }
-        rule.onNodeWithTag(seeMoreTag)
-            .performTouchInput { click() }
+        rule.onNodeWithTag(seeMoreTag).performTouchInput { click() }
 
         advanceClock()
 
@@ -2001,8 +1727,7 @@
             Truth.assertThat(scopeOnExpand.shownItemCount).isEqualTo(itemsShownCount)
         }
 
-        rule.onNodeWithTag(seeMoreTag)
-            .performTouchInput { click() }
+        rule.onNodeWithTag(seeMoreTag).performTouchInput { click() }
 
         advanceClock()
         rule.runOnIdle {
@@ -2015,8 +1740,7 @@
             Truth.assertThat(scopeOnExpand.shownItemCount).isEqualTo(itemsShownCount)
         }
 
-        rule.onNodeWithTag(seeMoreTag)
-            .performTouchInput { click() }
+        rule.onNodeWithTag(seeMoreTag).performTouchInput { click() }
 
         advanceClock()
         rule.runOnIdle {
@@ -2028,8 +1752,7 @@
             Truth.assertThat(scopeOnExpand.shownItemCount).isEqualTo(scopeOnCollapse.shownItemCount)
             Truth.assertThat(scopeOnExpand.shownItemCount).isEqualTo(itemsShownCount)
         }
-        rule.onNodeWithTag(collapseTag)
-            .performTouchInput { click() }
+        rule.onNodeWithTag(collapseTag).performTouchInput { click() }
 
         advanceClock()
 
@@ -2059,59 +1782,51 @@
 
         rule.setContent {
             var maxLines by remember { mutableStateOf(2) }
-            CompositionLocalProvider(
-                LocalDensity provides NoOpDensity
-            ) {
+            CompositionLocalProvider(LocalDensity provides NoOpDensity) {
                 FlowRow(
                     modifier = Modifier.width(200.dp),
                     horizontalArrangement = Arrangement.spacedBy(spacing.dp),
                     maxLines = maxLines,
-                    overflow = FlowRowOverflow.expandOrCollapseIndicator(
-                        expandIndicator = {
-                            scopeOnExpand = this
-                            Box(
-                                modifier = Modifier
-                                    .clickable {
-                                        itemsShownCount = 0
-                                        seeMoreShown = false
-                                        collapseShown = false
-                                        maxLines += 2
-                                        finalMaxLines = maxLines
-                                    }
-                                    .size(itemSize.dp)
-                                    .testTag(seeMoreTag)
-                                    .onGloballyPositioned {
-                                        seeMoreShown = true
-                                    }
-                            )
-                        },
-                        collapseIndicator = {
-                            scopeOnCollapse = this
-                            Box(
-                                modifier = Modifier
-                                    .clickable {
-                                        itemsShownCount = 0
-                                        seeMoreShown = false
-                                        collapseShown = false
-                                        maxLines = 2
-                                        finalMaxLines = maxLines
-                                    }
-                                    .size(collapseSize.dp)
-                                    .testTag(collapseTag)
-                                    .onGloballyPositioned {
-                                        collapseShown = true
-                                    }
-                            )
-                        }
-                    )
+                    overflow =
+                        FlowRowOverflow.expandOrCollapseIndicator(
+                            expandIndicator = {
+                                scopeOnExpand = this
+                                Box(
+                                    modifier =
+                                        Modifier.clickable {
+                                                itemsShownCount = 0
+                                                seeMoreShown = false
+                                                collapseShown = false
+                                                maxLines += 2
+                                                finalMaxLines = maxLines
+                                            }
+                                            .size(itemSize.dp)
+                                            .testTag(seeMoreTag)
+                                            .onGloballyPositioned { seeMoreShown = true }
+                                )
+                            },
+                            collapseIndicator = {
+                                scopeOnCollapse = this
+                                Box(
+                                    modifier =
+                                        Modifier.clickable {
+                                                itemsShownCount = 0
+                                                seeMoreShown = false
+                                                collapseShown = false
+                                                maxLines = 2
+                                                finalMaxLines = maxLines
+                                            }
+                                            .size(collapseSize.dp)
+                                            .testTag(collapseTag)
+                                            .onGloballyPositioned { collapseShown = true }
+                                )
+                            }
+                        )
                 ) {
                     repeat(totalItems) { index ->
                         Box(
-                            modifier = Modifier
-                                .size(itemSize.dp)
-                                .onPlaced {
-                                    itemsShownCount = index + 1
-                                }
+                            modifier =
+                                Modifier.size(itemSize.dp).onPlaced { itemsShownCount = index + 1 }
                         )
                     }
                 }
@@ -2126,8 +1841,7 @@
             Truth.assertThat(scopeOnExpand.shownItemCount).isEqualTo(scopeOnCollapse.shownItemCount)
             Truth.assertThat(scopeOnExpand.shownItemCount).isEqualTo(itemsShownCount)
         }
-        rule.onNodeWithTag(seeMoreTag)
-            .performTouchInput { click() }
+        rule.onNodeWithTag(seeMoreTag).performTouchInput { click() }
 
         advanceClock()
 
@@ -2141,8 +1855,7 @@
             Truth.assertThat(scopeOnExpand.shownItemCount).isEqualTo(itemsShownCount)
         }
 
-        rule.onNodeWithTag(seeMoreTag)
-            .performTouchInput { click() }
+        rule.onNodeWithTag(seeMoreTag).performTouchInput { click() }
 
         advanceClock()
         rule.runOnIdle {
@@ -2155,8 +1868,7 @@
             Truth.assertThat(scopeOnExpand.shownItemCount).isEqualTo(itemsShownCount)
         }
 
-        rule.onNodeWithTag(seeMoreTag)
-            .performTouchInput { click() }
+        rule.onNodeWithTag(seeMoreTag).performTouchInput { click() }
 
         advanceClock()
         rule.runOnIdle {
@@ -2168,8 +1880,7 @@
             Truth.assertThat(scopeOnExpand.shownItemCount).isEqualTo(scopeOnCollapse.shownItemCount)
             Truth.assertThat(scopeOnCollapse.shownItemCount).isEqualTo(itemsShownCount)
         }
-        rule.onNodeWithTag(collapseTag)
-            .performTouchInput { click() }
+        rule.onNodeWithTag(collapseTag).performTouchInput { click() }
 
         advanceClock()
 
@@ -2199,59 +1910,51 @@
 
         rule.setContent {
             var maxLines by remember { mutableStateOf(2) }
-            CompositionLocalProvider(
-                LocalDensity provides NoOpDensity
-            ) {
+            CompositionLocalProvider(LocalDensity provides NoOpDensity) {
                 FlowColumn(
                     modifier = Modifier.height(200.dp),
                     verticalArrangement = Arrangement.spacedBy(spacing.dp),
                     maxLines = maxLines,
-                    overflow = FlowColumnOverflow.expandOrCollapseIndicator(
-                        expandIndicator = {
-                            scopeOnExpand = this
-                            Box(
-                                modifier = Modifier
-                                    .clickable {
-                                        itemsShownCount = 0
-                                        seeMoreShown = false
-                                        collapseShown = false
-                                        maxLines += 2
-                                        finalMaxLines = maxLines
-                                    }
-                                    .size(itemSize.dp)
-                                    .testTag(seeMoreTag)
-                                    .onGloballyPositioned {
-                                        seeMoreShown = true
-                                    }
-                            )
-                        },
-                        collapseIndicator = {
-                            scopeOnCollapse = this
-                            Box(
-                                modifier = Modifier
-                                    .clickable {
-                                        itemsShownCount = 0
-                                        seeMoreShown = false
-                                        collapseShown = false
-                                        maxLines = 2
-                                        finalMaxLines = maxLines
-                                    }
-                                    .size(collapseSize.dp)
-                                    .testTag(collapseTag)
-                                    .onGloballyPositioned {
-                                        collapseShown = true
-                                    }
-                            )
-                        }
-                    )
+                    overflow =
+                        FlowColumnOverflow.expandOrCollapseIndicator(
+                            expandIndicator = {
+                                scopeOnExpand = this
+                                Box(
+                                    modifier =
+                                        Modifier.clickable {
+                                                itemsShownCount = 0
+                                                seeMoreShown = false
+                                                collapseShown = false
+                                                maxLines += 2
+                                                finalMaxLines = maxLines
+                                            }
+                                            .size(itemSize.dp)
+                                            .testTag(seeMoreTag)
+                                            .onGloballyPositioned { seeMoreShown = true }
+                                )
+                            },
+                            collapseIndicator = {
+                                scopeOnCollapse = this
+                                Box(
+                                    modifier =
+                                        Modifier.clickable {
+                                                itemsShownCount = 0
+                                                seeMoreShown = false
+                                                collapseShown = false
+                                                maxLines = 2
+                                                finalMaxLines = maxLines
+                                            }
+                                            .size(collapseSize.dp)
+                                            .testTag(collapseTag)
+                                            .onGloballyPositioned { collapseShown = true }
+                                )
+                            }
+                        )
                 ) {
                     repeat(totalItems) { index ->
                         Box(
-                            modifier = Modifier
-                                .size(itemSize.dp)
-                                .onPlaced {
-                                    itemsShownCount = index + 1
-                                }
+                            modifier =
+                                Modifier.size(itemSize.dp).onPlaced { itemsShownCount = index + 1 }
                         )
                     }
                 }
@@ -2269,8 +1972,7 @@
             Truth.assertThat(scopeOnExpand.shownItemCount).isEqualTo(scopeOnExpand.shownItemCount)
             Truth.assertThat(scopeOnExpand.shownItemCount).isEqualTo(itemsShownCount)
         }
-        rule.onNodeWithTag(seeMoreTag)
-            .performTouchInput { click() }
+        rule.onNodeWithTag(seeMoreTag).performTouchInput { click() }
 
         advanceClock()
 
@@ -2284,8 +1986,7 @@
             Truth.assertThat(scopeOnExpand.shownItemCount).isEqualTo(itemsShownCount)
         }
 
-        rule.onNodeWithTag(seeMoreTag)
-            .performTouchInput { click() }
+        rule.onNodeWithTag(seeMoreTag).performTouchInput { click() }
 
         advanceClock()
         rule.runOnIdle {
@@ -2298,8 +1999,7 @@
             Truth.assertThat(scopeOnExpand.shownItemCount).isEqualTo(itemsShownCount)
         }
 
-        rule.onNodeWithTag(seeMoreTag)
-            .performTouchInput { click() }
+        rule.onNodeWithTag(seeMoreTag).performTouchInput { click() }
 
         advanceClock()
         rule.runOnIdle {
@@ -2311,8 +2011,7 @@
             Truth.assertThat(scopeOnExpand.shownItemCount).isEqualTo(scopeOnExpand.shownItemCount)
             Truth.assertThat(scopeOnExpand.shownItemCount).isEqualTo(itemsShownCount)
         }
-        rule.onNodeWithTag(collapseTag)
-            .performTouchInput { click() }
+        rule.onNodeWithTag(collapseTag).performTouchInput { click() }
 
         advanceClock()
 
@@ -2343,19 +2042,16 @@
             with(LocalDensity.current) {
                 Box(Modifier.size(200.toDp())) {
                     FlowColumn(
-                        Modifier
-                            .fillMaxHeight(1f),
+                        Modifier.fillMaxHeight(1f),
                         verticalArrangement = Arrangement.SpaceAround
                     ) {
                         repeat(5) { index ->
                             Box(
-                                Modifier
-                                    .size(20.toDp())
-                                    .onPlaced {
-                                        val positionInParent = it.positionInParent()
-                                        val yPosition = positionInParent.y
-                                        yPositions[index] = yPosition
-                                    }
+                                Modifier.size(20.toDp()).onPlaced {
+                                    val positionInParent = it.positionInParent()
+                                    val yPosition = positionInParent.y
+                                    yPositions[index] = yPosition
+                                }
                             )
                         }
                     }
@@ -2368,9 +2064,7 @@
         yPositions.forEach {
             val yPosition = it
             expectedYPosition += gapSize
-            Truth
-                .assertThat(yPosition)
-                .isEqualTo(expectedYPosition)
+            Truth.assertThat(yPosition).isEqualTo(expectedYPosition)
             expectedYPosition += eachSize
             expectedYPosition += gapSize
         }
@@ -2393,20 +2087,17 @@
             with(LocalDensity.current) {
                 Box(Modifier.size(200.toDp())) {
                     FlowRow(
-                        Modifier
-                            .fillMaxWidth(1f),
+                        Modifier.fillMaxWidth(1f),
                         horizontalArrangement = Arrangement.SpaceAround,
                         maxItemsInEachRow = 5
                     ) {
                         repeat(10) { index ->
                             Box(
-                                Modifier
-                                    .size(20.toDp())
-                                    .onPlaced {
-                                        val positionInParent = it.positionInParent()
-                                        val xPosition = positionInParent.x
-                                        xPositions[index] = xPosition
-                                    }
+                                Modifier.size(20.toDp()).onPlaced {
+                                    val positionInParent = it.positionInParent()
+                                    val xPosition = positionInParent.x
+                                    xPositions[index] = xPosition
+                                }
                             )
                         }
                     }
@@ -2421,9 +2112,7 @@
                 expectedXPosition = 0
             }
             expectedXPosition += gapSize
-            Truth
-                .assertThat(xPosition)
-                .isEqualTo(expectedXPosition)
+            Truth.assertThat(xPosition).isEqualTo(expectedXPosition)
             expectedXPosition += eachSize
             expectedXPosition += gapSize
         }
@@ -2443,20 +2132,17 @@
             with(LocalDensity.current) {
                 Box(Modifier.size(200.toDp())) {
                     FlowColumn(
-                        Modifier
-                            .fillMaxHeight(1f),
+                        Modifier.fillMaxHeight(1f),
                         verticalArrangement = Arrangement.SpaceAround,
                         maxItemsInEachColumn = 5
                     ) {
                         repeat(10) { index ->
                             Box(
-                                Modifier
-                                    .size(20.toDp())
-                                    .onPlaced {
-                                        val positionInParent = it.positionInParent()
-                                        val yPosition = positionInParent.y
-                                        yPositions[index] = yPosition
-                                    }
+                                Modifier.size(20.toDp()).onPlaced {
+                                    val positionInParent = it.positionInParent()
+                                    val yPosition = positionInParent.y
+                                    yPositions[index] = yPosition
+                                }
                             )
                         }
                     }
@@ -2471,9 +2157,7 @@
                 expectedYPosition = 0
             }
             expectedYPosition += gapSize
-            Truth
-                .assertThat(position)
-                .isEqualTo(expectedYPosition)
+            Truth.assertThat(position).isEqualTo(expectedYPosition)
             expectedYPosition += eachSize
             expectedYPosition += gapSize
         }
@@ -2493,20 +2177,17 @@
             with(LocalDensity.current) {
                 Box(Modifier.size(200.toDp())) {
                     FlowRow(
-                        Modifier
-                            .fillMaxWidth(1f),
+                        Modifier.fillMaxWidth(1f),
                         horizontalArrangement = Arrangement.End,
                         maxItemsInEachRow = 5
                     ) {
                         repeat(10) { index ->
                             Box(
-                                Modifier
-                                    .size(20.toDp())
-                                    .onPlaced {
-                                        val positionInParent = it.positionInParent()
-                                        val xPosition = positionInParent.x
-                                        xPositions[index] = xPosition
-                                    }
+                                Modifier.size(20.toDp()).onPlaced {
+                                    val positionInParent = it.positionInParent()
+                                    val xPosition = positionInParent.x
+                                    xPositions[index] = xPosition
+                                }
                             )
                         }
                     }
@@ -2520,9 +2201,7 @@
             if (index % 5 == 0) {
                 expectedXPosition = gapSize
             }
-            Truth
-                .assertThat(position)
-                .isEqualTo(expectedXPosition)
+            Truth.assertThat(position).isEqualTo(expectedXPosition)
             expectedXPosition += eachSize
         }
     }
@@ -2540,20 +2219,17 @@
             with(LocalDensity.current) {
                 Box(Modifier.size(200.toDp())) {
                     FlowColumn(
-                        Modifier
-                            .fillMaxHeight(1f),
+                        Modifier.fillMaxHeight(1f),
                         verticalArrangement = Arrangement.Bottom,
                         maxItemsInEachColumn = 5
                     ) {
                         repeat(10) { index ->
                             Box(
-                                Modifier
-                                    .size(20.toDp())
-                                    .onPlaced {
-                                        val positionInParent = it.positionInParent()
-                                        val yPosition = positionInParent.y
-                                        yPositions[index] = yPosition
-                                    }
+                                Modifier.size(20.toDp()).onPlaced {
+                                    val positionInParent = it.positionInParent()
+                                    val yPosition = positionInParent.y
+                                    yPositions[index] = yPosition
+                                }
                             )
                         }
                     }
@@ -2567,9 +2243,7 @@
             if (index % 5 == 0) {
                 expectedYPosition = gapSize
             }
-            Truth
-                .assertThat(position)
-                .isEqualTo(expectedYPosition)
+            Truth.assertThat(position).isEqualTo(expectedYPosition)
             expectedYPosition += eachSize
         }
     }
@@ -2590,13 +2264,11 @@
                     ) {
                         repeat(10) { index ->
                             Box(
-                                Modifier
-                                    .size(eachSize.toDp())
-                                    .onPlaced {
-                                        val positionInParent = it.positionInParent()
-                                        val xPosition = positionInParent.x
-                                        xPositions[index] = xPosition
-                                    }
+                                Modifier.size(eachSize.toDp()).onPlaced {
+                                    val positionInParent = it.positionInParent()
+                                    val xPosition = positionInParent.x
+                                    xPositions[index] = xPosition
+                                }
                             )
                         }
                     }
@@ -2607,9 +2279,7 @@
         rule.waitForIdle()
         var expectedXPosition = 0
         xPositions.forEachIndexed { index, position ->
-            Truth
-                .assertThat(position)
-                .isEqualTo(expectedXPosition)
+            Truth.assertThat(position).isEqualTo(expectedXPosition)
             if (index == (maxItemsInMainAxis - 1)) {
                 expectedXPosition = 0
             } else {
@@ -2629,38 +2299,32 @@
         var mainAxisSpacing = 10
         var crossAxisSpacing = 20
         rule.setContent {
-            CompositionLocalProvider(
-                LocalDensity provides NoOpDensity
-            ) {
-                var maxLines by remember {
-                    mutableStateOf(2)
-                }
+            CompositionLocalProvider(LocalDensity provides NoOpDensity) {
+                var maxLines by remember { mutableStateOf(2) }
                 Box(modifier = Modifier.width(320.dp).wrapContentHeight()) {
                     FlowRow(
-                        Modifier
-                            .fillMaxWidth(1f)
-                            .wrapContentHeight(align = Alignment.Top),
+                        Modifier.fillMaxWidth(1f).wrapContentHeight(align = Alignment.Top),
                         horizontalArrangement = Arrangement.spacedBy(mainAxisSpacing.dp),
                         verticalArrangement = Arrangement.spacedBy(crossAxisSpacing.dp),
                         maxLines = maxLines,
-                        overflow = FlowRowOverflow.expandIndicator {
-                            Box(modifier = Modifier
-                                .fillMaxWidth(1f)
-                                .height(eachSize.dp)
-                                .background(Color.Green)
-                                .clickable {
-                                    maxLines += 2
-                                }.onPlaced {
-                                    seeMorePosition = it.positionInParent()
-                                    seeMoreSize = it.size
-                                }
-                            ) {}
-                        }
+                        overflow =
+                            FlowRowOverflow.expandIndicator {
+                                Box(
+                                    modifier =
+                                        Modifier.fillMaxWidth(1f)
+                                            .height(eachSize.dp)
+                                            .background(Color.Green)
+                                            .clickable { maxLines += 2 }
+                                            .onPlaced {
+                                                seeMorePosition = it.positionInParent()
+                                                seeMoreSize = it.size
+                                            }
+                                ) {}
+                            }
                     ) {
                         repeat(totalCount) { index ->
                             Box(
-                                Modifier
-                                    .width(eachSize.dp)
+                                Modifier.width(eachSize.dp)
                                     .height(50.dp)
                                     .background(Color.Green)
                                     .onPlaced {
@@ -2679,13 +2343,9 @@
         var expectedYPosition = 0
         Truth.assertThat(positions.size).isEqualTo(5)
         positions.forEach { position ->
-            Truth
-                .assertThat(position.x)
-                .isEqualTo(expectedXPosition)
+            Truth.assertThat(position.x).isEqualTo(expectedXPosition)
 
-            Truth
-                .assertThat(position.y)
-                .isEqualTo(expectedYPosition)
+            Truth.assertThat(position.y).isEqualTo(expectedYPosition)
             expectedXPosition += eachSize + mainAxisSpacing
         }
         expectedYPosition += eachSize + crossAxisSpacing
@@ -2706,42 +2366,34 @@
         var mainAxisSpacing = 10
         var crossAxisSpacing = 20
         rule.setContent {
-            CompositionLocalProvider(
-                LocalDensity provides NoOpDensity
-            ) {
-                var maxLines by remember {
-                    mutableStateOf(2)
-                }
+            CompositionLocalProvider(LocalDensity provides NoOpDensity) {
+                var maxLines by remember { mutableStateOf(2) }
                 Box(modifier = Modifier.height(320.dp).wrapContentWidth()) {
                     FlowColumn(
-                        Modifier
-                            .fillMaxHeight(1f)
-                            .wrapContentWidth(align = Alignment.Start),
+                        Modifier.fillMaxHeight(1f).wrapContentWidth(align = Alignment.Start),
                         verticalArrangement = Arrangement.spacedBy(mainAxisSpacing.dp),
                         horizontalArrangement = Arrangement.spacedBy(crossAxisSpacing.dp),
                         maxLines = maxLines,
-                        overflow = FlowColumnOverflow.expandIndicator {
-                            Box(modifier = Modifier
-                                .fillMaxHeight(1f)
-                                .width(eachSize.dp)
-                                .clickable {
-                                    maxLines += 2
-                                }.onPlaced {
-                                    seeMorePosition = it.positionInParent()
-                                    seeMoreSize = it.size
-                                }
-                            ) {}
-                        }
+                        overflow =
+                            FlowColumnOverflow.expandIndicator {
+                                Box(
+                                    modifier =
+                                        Modifier.fillMaxHeight(1f)
+                                            .width(eachSize.dp)
+                                            .clickable { maxLines += 2 }
+                                            .onPlaced {
+                                                seeMorePosition = it.positionInParent()
+                                                seeMoreSize = it.size
+                                            }
+                                ) {}
+                            }
                     ) {
                         repeat(totalCount) { index ->
                             Box(
-                                Modifier
-                                    .width(eachSize.dp)
-                                    .height(eachSize.dp)
-                                    .onPlaced {
-                                        val positionInParent = it.positionInParent()
-                                        positions.add(index, positionInParent)
-                                    }
+                                Modifier.width(eachSize.dp).height(eachSize.dp).onPlaced {
+                                    val positionInParent = it.positionInParent()
+                                    positions.add(index, positionInParent)
+                                }
                             ) {}
                         }
                     }
@@ -2754,13 +2406,9 @@
         var expectedYPosition = 0
         Truth.assertThat(positions.size).isEqualTo(5)
         positions.forEach { position ->
-            Truth
-                .assertThat(position.x)
-                .isEqualTo(expectedXPosition)
+            Truth.assertThat(position.x).isEqualTo(expectedXPosition)
 
-            Truth
-                .assertThat(position.y)
-                .isEqualTo(expectedYPosition)
+            Truth.assertThat(position.y).isEqualTo(expectedYPosition)
             expectedYPosition += eachSize + mainAxisSpacing
         }
         expectedXPosition += eachSize + crossAxisSpacing
@@ -2790,29 +2438,26 @@
             var maxLines by remember { maxLinesState }
             var minLinesToShowCollapse by remember { minLinesToShowCollapseState }
             var minHeightToShowCollapse by remember { minHeightToShowCollapseState }
-            CompositionLocalProvider(
-                LocalDensity provides NoOpDensity
-            ) {
-                seeMoreOrCollapse = FlowRowOverflow.expandOrCollapseIndicator(
-                    expandIndicator = {
-                        Box(
-                            Modifier
-                                .size(20.dp)
-                                .onGloballyPositioned {
+            CompositionLocalProvider(LocalDensity provides NoOpDensity) {
+                seeMoreOrCollapse =
+                    FlowRowOverflow.expandOrCollapseIndicator(
+                        expandIndicator = {
+                            Box(
+                                Modifier.size(20.dp).onGloballyPositioned {
                                     seeMoreXPosition = it.positionInParent().x
-                                })
-                    },
-                    collapseIndicator = {
-                        Box(
-                            Modifier
-                                .size(20.dp)
-                                .onGloballyPositioned {
+                                }
+                            )
+                        },
+                        collapseIndicator = {
+                            Box(
+                                Modifier.size(20.dp).onGloballyPositioned {
                                     collapseXPosition = it.positionInParent().x
-                                })
-                    },
-                    minLinesToShowCollapse,
-                    minHeightToShowCollapse
-                )
+                                }
+                            )
+                        },
+                        minLinesToShowCollapse,
+                        minHeightToShowCollapse
+                    )
                 Box(Modifier.size(200.dp)) {
                     FlowRow(
                         horizontalArrangement = Arrangement.Start,
@@ -2822,13 +2467,11 @@
                     ) {
                         repeat(total) { _ ->
                             Box(
-                                Modifier
-                                    .size(eachSize.dp)
-                                    .onGloballyPositioned {
-                                        val positionInParent = it.positionInParent()
-                                        val xPosition = positionInParent.x
-                                        xPositions.add(xPosition)
-                                    }
+                                Modifier.size(eachSize.dp).onGloballyPositioned {
+                                    val positionInParent = it.positionInParent()
+                                    val xPosition = positionInParent.x
+                                    xPositions.add(xPosition)
+                                }
                             )
                         }
                     }
@@ -2838,14 +2481,10 @@
 
         rule.waitForIdle()
         rule.runOnIdle {
-            Truth.assertThat(xPositions.size).isEqualTo(
-                maxItemsInMainAxis * maxLinesState.value
-            )
+            Truth.assertThat(xPositions.size).isEqualTo(maxItemsInMainAxis * maxLinesState.value)
             var expectedXPosition = 0
             xPositions.forEachIndexed { index, position ->
-                Truth
-                    .assertThat(position)
-                    .isEqualTo(expectedXPosition)
+                Truth.assertThat(position).isEqualTo(expectedXPosition)
                 if ((index + 1) % maxItemsInMainAxis == 0) {
                     expectedXPosition = 0
                 } else {
@@ -2853,26 +2492,23 @@
                 }
             }
             xPositions.clear()
-            overflowState.value = FlowRowOverflow.expandIndicator {
-                Box(
-                    Modifier
-                        .size(20.dp)
-                        .onGloballyPositioned {
+            overflowState.value =
+                FlowRowOverflow.expandIndicator {
+                    Box(
+                        Modifier.size(20.dp).onGloballyPositioned {
                             val positionInParent = it.positionInParent()
                             seeMoreXPosition = positionInParent.x
-                        })
-            }
+                        }
+                    )
+                }
         }
         advanceClock()
         rule.runOnIdle {
-            val maxItemsThatCanFit = min(
-                (maxItemsInMainAxis * maxLinesState.value) - 1, total)
+            val maxItemsThatCanFit = min((maxItemsInMainAxis * maxLinesState.value) - 1, total)
             Truth.assertThat(xPositions.size).isEqualTo(maxItemsThatCanFit)
             var expectedXPosition = 0
             xPositions.forEachIndexed { index, position ->
-                Truth
-                    .assertThat(position)
-                    .isEqualTo(expectedXPosition)
+                Truth.assertThat(position).isEqualTo(expectedXPosition)
                 if ((index + 1) % maxItemsInMainAxis == 0) {
                     expectedXPosition = 0
                 } else {
@@ -2888,14 +2524,11 @@
         }
         advanceClock()
         rule.runOnIdle {
-            val maxItemsThatCanFit = min(
-                (maxItemsInMainAxis * maxLinesState.value) - 1, total)
+            val maxItemsThatCanFit = min((maxItemsInMainAxis * maxLinesState.value) - 1, total)
             Truth.assertThat(xPositions.size).isEqualTo(maxItemsThatCanFit)
             var expectedXPosition = 0
             xPositions.forEachIndexed { index, position ->
-                Truth
-                    .assertThat(position)
-                    .isEqualTo(expectedXPosition)
+                Truth.assertThat(position).isEqualTo(expectedXPosition)
                 if ((index + 1) % maxItemsInMainAxis == 0) {
                     expectedXPosition = 0
                 } else {
@@ -2910,14 +2543,11 @@
         }
         advanceClock()
         rule.runOnIdle {
-            val maxItemsThatCanFit = min(
-                (maxItemsInMainAxis * maxLinesState.value) - 1, total)
+            val maxItemsThatCanFit = min((maxItemsInMainAxis * maxLinesState.value) - 1, total)
             Truth.assertThat(xPositions.size).isEqualTo(maxItemsThatCanFit)
             var expectedXPosition = 0
             xPositions.forEachIndexed { index, position ->
-                Truth
-                    .assertThat(position)
-                    .isEqualTo(expectedXPosition)
+                Truth.assertThat(position).isEqualTo(expectedXPosition)
                 if ((index + 1) % maxItemsInMainAxis == 0) {
                     expectedXPosition = 0
                 } else {
@@ -2939,14 +2569,11 @@
         }
         advanceClock()
         rule.runOnIdle {
-            val maxItemsThatCanFit = min(
-                (maxItemsInMainAxis * maxLinesState.value), total)
+            val maxItemsThatCanFit = min((maxItemsInMainAxis * maxLinesState.value), total)
             Truth.assertThat(xPositions.size).isEqualTo(maxItemsThatCanFit)
             var expectedXPosition = 0
             xPositions.forEachIndexed { index, position ->
-                Truth
-                    .assertThat(position)
-                    .isEqualTo(expectedXPosition)
+                Truth.assertThat(position).isEqualTo(expectedXPosition)
                 if ((index + 1) % maxItemsInMainAxis == 0) {
                     expectedXPosition = 0
                 } else {
@@ -2978,29 +2605,26 @@
             var maxLines by remember { maxLinesState }
             var minLinesToShowCollapse by remember { minLinesToShowCollapseState }
             var minHeightToShowCollapse by remember { minHeightToShowCollapseState }
-            CompositionLocalProvider(
-                LocalDensity provides NoOpDensity
-            ) {
-                seeMoreOrCollapse = FlowColumnOverflow.expandOrCollapseIndicator(
-                    expandIndicator = {
-                        Box(
-                            Modifier
-                                .size(20.dp)
-                                .onGloballyPositioned {
+            CompositionLocalProvider(LocalDensity provides NoOpDensity) {
+                seeMoreOrCollapse =
+                    FlowColumnOverflow.expandOrCollapseIndicator(
+                        expandIndicator = {
+                            Box(
+                                Modifier.size(20.dp).onGloballyPositioned {
                                     seeMoreYPosition = it.positionInParent().y
-                                })
-                    },
-                    collapseIndicator = {
-                        Box(
-                            Modifier
-                                .size(20.dp)
-                                .onGloballyPositioned {
+                                }
+                            )
+                        },
+                        collapseIndicator = {
+                            Box(
+                                Modifier.size(20.dp).onGloballyPositioned {
                                     collapseYPosition = it.positionInParent().y
-                                })
-                    },
-                    minLinesToShowCollapse,
-                    minHeightToShowCollapse
-                )
+                                }
+                            )
+                        },
+                        minLinesToShowCollapse,
+                        minHeightToShowCollapse
+                    )
                 Box(Modifier.size(200.dp)) {
                     FlowColumn(
                         verticalArrangement = Arrangement.Top,
@@ -3010,13 +2634,11 @@
                     ) {
                         repeat(total) { _ ->
                             Box(
-                                Modifier
-                                    .size(eachSize.dp)
-                                    .onGloballyPositioned {
-                                        val positionInParent = it.positionInParent()
-                                        val yPosition = positionInParent.y
-                                        yPositions.add(yPosition)
-                                    }
+                                Modifier.size(eachSize.dp).onGloballyPositioned {
+                                    val positionInParent = it.positionInParent()
+                                    val yPosition = positionInParent.y
+                                    yPositions.add(yPosition)
+                                }
                             )
                         }
                     }
@@ -3027,9 +2649,7 @@
         // Assertions and interaction logic
         rule.waitForIdle()
         rule.runOnIdle {
-            Truth.assertThat(yPositions.size).isEqualTo(
-                maxItemsInMainAxis * maxLinesState.value
-            )
+            Truth.assertThat(yPositions.size).isEqualTo(maxItemsInMainAxis * maxLinesState.value)
             var expectedYPosition = 0
             yPositions.forEachIndexed { index, position ->
                 Truth.assertThat(position).isEqualTo(expectedYPosition)
@@ -3040,22 +2660,20 @@
                 }
             }
             yPositions.clear()
-            overflowState.value = FlowColumnOverflow.expandIndicator {
-                Box(
-                    Modifier
-                        .size(20.dp)
-                        .onGloballyPositioned {
+            overflowState.value =
+                FlowColumnOverflow.expandIndicator {
+                    Box(
+                        Modifier.size(20.dp).onGloballyPositioned {
                             val positionInParent = it.positionInParent()
                             seeMoreYPosition = positionInParent.y
                         }
-                )
-            }
+                    )
+                }
         }
         // Continuing from the previous logic
         advanceClock()
         rule.runOnIdle {
-            val maxItemsThatCanFit = min(
-                (maxItemsInMainAxis * maxLinesState.value) - 1, total)
+            val maxItemsThatCanFit = min((maxItemsInMainAxis * maxLinesState.value) - 1, total)
             Truth.assertThat(yPositions.size).isEqualTo(maxItemsThatCanFit)
             var expectedYPosition = 0
             yPositions.forEachIndexed { index, position ->
@@ -3075,8 +2693,7 @@
         }
         advanceClock()
         rule.runOnIdle {
-            val maxItemsThatCanFit = min(
-                (maxItemsInMainAxis * maxLinesState.value) - 1, total)
+            val maxItemsThatCanFit = min((maxItemsInMainAxis * maxLinesState.value) - 1, total)
             Truth.assertThat(yPositions.size).isEqualTo(maxItemsThatCanFit)
             var expectedYPosition = 0
             yPositions.forEachIndexed { index, position ->
@@ -3095,8 +2712,7 @@
         }
         advanceClock()
         rule.runOnIdle {
-            val maxItemsThatCanFit = min(
-                (maxItemsInMainAxis * maxLinesState.value) - 1, total)
+            val maxItemsThatCanFit = min((maxItemsInMainAxis * maxLinesState.value) - 1, total)
             Truth.assertThat(yPositions.size).isEqualTo(maxItemsThatCanFit)
             var expectedYPosition = 0
             yPositions.forEachIndexed { index, position ->
@@ -3122,8 +2738,7 @@
         }
         advanceClock()
         rule.runOnIdle {
-            val maxItemsThatCanFit = min(
-                (maxItemsInMainAxis * maxLinesState.value), total)
+            val maxItemsThatCanFit = min((maxItemsInMainAxis * maxLinesState.value), total)
             Truth.assertThat(yPositions.size).isEqualTo(maxItemsThatCanFit)
             var expectedYPosition = 0
             yPositions.forEachIndexed { index, position ->
@@ -3159,33 +2774,27 @@
             var maxHeight by remember { maxHeightState }
             var minLinesToShowCollapse by remember { minLinesToShowCollapseState }
             var minHeightToShowCollapse by remember { minHeightToShowCollapseState }
-            CompositionLocalProvider(
-                LocalDensity provides NoOpDensity
-            ) {
-                seeMoreOrCollapse = FlowRowOverflow.expandOrCollapseIndicator(
-                    expandIndicator = {
-                        Box(
-                            Modifier
-                                .size(20.dp)
-                                .onGloballyPositioned {
+            CompositionLocalProvider(LocalDensity provides NoOpDensity) {
+                seeMoreOrCollapse =
+                    FlowRowOverflow.expandOrCollapseIndicator(
+                        expandIndicator = {
+                            Box(
+                                Modifier.size(20.dp).onGloballyPositioned {
                                     seeMoreXPosition = it.positionInParent().x
-                                })
-                    },
-                    collapseIndicator = {
-                        Box(
-                            Modifier
-                                .size(20.dp)
-                                .onGloballyPositioned {
+                                }
+                            )
+                        },
+                        collapseIndicator = {
+                            Box(
+                                Modifier.size(20.dp).onGloballyPositioned {
                                     collapseXPosition = it.positionInParent().x
-                                })
-                    },
-                    minLinesToShowCollapse,
-                    minHeightToShowCollapse
-                )
-                Box(
-                    Modifier
-                        .width(200.dp)
-                        .height(maxHeight)) {
+                                }
+                            )
+                        },
+                        minLinesToShowCollapse,
+                        minHeightToShowCollapse
+                    )
+                Box(Modifier.width(200.dp).height(maxHeight)) {
                     FlowRow(
                         horizontalArrangement = Arrangement.Start,
                         maxItemsInEachRow = maxItemsInMainAxis,
@@ -3193,13 +2802,11 @@
                     ) {
                         repeat(total) { _ ->
                             Box(
-                                Modifier
-                                    .size(eachSize.dp)
-                                    .onGloballyPositioned {
-                                        val positionInParent = it.positionInParent()
-                                        val xPosition = positionInParent.x
-                                        xPositions.add(xPosition)
-                                    }
+                                Modifier.size(eachSize.dp).onGloballyPositioned {
+                                    val positionInParent = it.positionInParent()
+                                    val xPosition = positionInParent.x
+                                    xPositions.add(xPosition)
+                                }
                             )
                         }
                     }
@@ -3212,9 +2819,7 @@
             Truth.assertThat(xPositions.size).isEqualTo(10)
             var expectedXPosition = 0
             xPositions.forEachIndexed { index, position ->
-                Truth
-                    .assertThat(position)
-                    .isEqualTo(expectedXPosition)
+                Truth.assertThat(position).isEqualTo(expectedXPosition)
                 if ((index + 1) % maxItemsInMainAxis == 0) {
                     expectedXPosition = 0
                 } else {
@@ -3222,15 +2827,15 @@
                 }
             }
             xPositions.clear()
-            overflowState.value = FlowRowOverflow.expandIndicator {
-                Box(
-                    Modifier
-                        .size(20.dp)
-                        .onGloballyPositioned {
+            overflowState.value =
+                FlowRowOverflow.expandIndicator {
+                    Box(
+                        Modifier.size(20.dp).onGloballyPositioned {
                             val positionInParent = it.positionInParent()
                             seeMoreXPosition = positionInParent.x
-                        })
-            }
+                        }
+                    )
+                }
         }
         advanceClock()
         rule.runOnIdle {
@@ -3238,9 +2843,7 @@
             Truth.assertThat(xPositions.size).isEqualTo(maxItemsThatCanFit)
             var expectedXPosition = 0
             xPositions.forEachIndexed { index, position ->
-                Truth
-                    .assertThat(position)
-                    .isEqualTo(expectedXPosition)
+                Truth.assertThat(position).isEqualTo(expectedXPosition)
                 if ((index + 1) % maxItemsInMainAxis == 0) {
                     expectedXPosition = 0
                 } else {
@@ -3260,9 +2863,7 @@
             Truth.assertThat(xPositions.size).isEqualTo(maxItemsThatCanFit)
             var expectedXPosition = 0
             xPositions.forEachIndexed { index, position ->
-                Truth
-                    .assertThat(position)
-                    .isEqualTo(expectedXPosition)
+                Truth.assertThat(position).isEqualTo(expectedXPosition)
                 if ((index + 1) % maxItemsInMainAxis == 0) {
                     expectedXPosition = 0
                 } else {
@@ -3281,9 +2882,7 @@
             Truth.assertThat(xPositions.size).isEqualTo(maxItemsThatCanFit)
             var expectedXPosition = 0
             xPositions.forEachIndexed { index, position ->
-                Truth
-                    .assertThat(position)
-                    .isEqualTo(expectedXPosition)
+                Truth.assertThat(position).isEqualTo(expectedXPosition)
                 if ((index + 1) % maxItemsInMainAxis == 0) {
                     expectedXPosition = 0
                 } else {
@@ -3309,9 +2908,7 @@
             Truth.assertThat(xPositions.size).isEqualTo(maxItemsThatCanFit)
             var expectedXPosition = 0
             xPositions.forEachIndexed { index, position ->
-                Truth
-                    .assertThat(position)
-                    .isEqualTo(expectedXPosition)
+                Truth.assertThat(position).isEqualTo(expectedXPosition)
                 if ((index + 1) % maxItemsInMainAxis == 0) {
                     expectedXPosition = 0
                 } else {
@@ -3339,13 +2936,11 @@
                     ) {
                         repeat(10) { index ->
                             Box(
-                                Modifier
-                                    .size(eachSize.toDp())
-                                    .onPlaced {
-                                        val positionInParent = it.positionInParent()
-                                        val xPosition = positionInParent.x
-                                        xPositions[index] = xPosition
-                                    }
+                                Modifier.size(eachSize.toDp()).onPlaced {
+                                    val positionInParent = it.positionInParent()
+                                    val xPosition = positionInParent.x
+                                    xPositions[index] = xPosition
+                                }
                             )
                         }
                     }
@@ -3363,9 +2958,7 @@
                 expectedXPosition += spaceAligned
             }
 
-            Truth
-                .assertThat(position)
-                .isEqualTo(expectedXPosition)
+            Truth.assertThat(position).isEqualTo(expectedXPosition)
         }
     }
 
@@ -3389,33 +2982,27 @@
             var maxWidth by remember { maxWidthState }
             var minLinesToShowCollapse by remember { minLinesToShowCollapseState }
             var minHeightToShowCollapse by remember { minHeightToShowCollapseState }
-            CompositionLocalProvider(
-                LocalDensity provides NoOpDensity
-            ) {
-                seeMoreOrCollapse = FlowColumnOverflow.expandOrCollapseIndicator(
-                    expandIndicator = {
-                        Box(
-                            Modifier
-                                .size(20.dp)
-                                .onGloballyPositioned {
+            CompositionLocalProvider(LocalDensity provides NoOpDensity) {
+                seeMoreOrCollapse =
+                    FlowColumnOverflow.expandOrCollapseIndicator(
+                        expandIndicator = {
+                            Box(
+                                Modifier.size(20.dp).onGloballyPositioned {
                                     seeMoreYPosition = it.positionInParent().y
-                                })
-                    },
-                    collapseIndicator = {
-                        Box(
-                            Modifier
-                                .size(20.dp)
-                                .onGloballyPositioned {
+                                }
+                            )
+                        },
+                        collapseIndicator = {
+                            Box(
+                                Modifier.size(20.dp).onGloballyPositioned {
                                     collapseYPosition = it.positionInParent().y
-                                })
-                    },
-                    minLinesToShowCollapse,
-                    minHeightToShowCollapse
-                )
-                Box(
-                    Modifier
-                        .height(200.dp)
-                        .width(maxWidth)) {
+                                }
+                            )
+                        },
+                        minLinesToShowCollapse,
+                        minHeightToShowCollapse
+                    )
+                Box(Modifier.height(200.dp).width(maxWidth)) {
                     FlowColumn(
                         verticalArrangement = Arrangement.Top,
                         maxItemsInEachColumn = maxItemsInMainAxis,
@@ -3423,13 +3010,11 @@
                     ) {
                         repeat(total) { _ ->
                             Box(
-                                Modifier
-                                    .size(eachSize.dp)
-                                    .onGloballyPositioned {
-                                        val positionInParent = it.positionInParent()
-                                        val yPosition = positionInParent.y
-                                        yPositions.add(yPosition)
-                                    }
+                                Modifier.size(eachSize.dp).onGloballyPositioned {
+                                    val positionInParent = it.positionInParent()
+                                    val yPosition = positionInParent.y
+                                    yPositions.add(yPosition)
+                                }
                             )
                         }
                     }
@@ -3451,15 +3036,15 @@
                 }
             }
             yPositions.clear()
-            overflowState.value = FlowColumnOverflow.expandIndicator {
-                Box(
-                    Modifier
-                        .size(20.dp)
-                        .onGloballyPositioned {
+            overflowState.value =
+                FlowColumnOverflow.expandIndicator {
+                    Box(
+                        Modifier.size(20.dp).onGloballyPositioned {
                             val positionInParent = it.positionInParent()
                             seeMoreYPosition = positionInParent.y
-                        })
-            }
+                        }
+                    )
+                }
         }
         advanceClock()
         rule.runOnIdle {
@@ -3545,11 +3130,10 @@
     }
 
     /**
-     * Should space something like this:
-     * 1 2 3
+     * Should space something like this: 1 2 3
+     *
      * # SpaceAligned
-     * 4 5 6
-     * No Space here
+     * 4 5 6 No Space here
      */
     @Test
     fun testFlowRow_crossAxisSpacedBy() {
@@ -3564,22 +3148,17 @@
             with(LocalDensity.current) {
                 Box(Modifier.size(200.toDp())) {
                     FlowRow(
-                        Modifier
-                            .onSizeChanged {
-                                heightResult = it.height
-                            },
+                        Modifier.onSizeChanged { heightResult = it.height },
                         verticalArrangement = Arrangement.spacedBy(spaceAligned.toDp()),
                         maxItemsInEachRow = 1
                     ) {
                         repeat(noOfItems) { index ->
                             Box(
-                                Modifier
-                                    .size(eachSize.toDp())
-                                    .onPlaced {
-                                        val positionInParent = it.positionInParent()
-                                        val yPosition = positionInParent.y
-                                        yPositions[index] = yPosition
-                                    }
+                                Modifier.size(eachSize.toDp()).onPlaced {
+                                    val positionInParent = it.positionInParent()
+                                    val yPosition = positionInParent.y
+                                    yPositions[index] = yPosition
+                                }
                             )
                         }
                     }
@@ -3588,14 +3167,10 @@
         }
 
         rule.waitForIdle()
-        Truth
-            .assertThat(heightResult)
-            .isEqualTo(expectedHeight)
+        Truth.assertThat(heightResult).isEqualTo(expectedHeight)
         var expectedYPosition = 0
         yPositions.forEachIndexed { index, position ->
-            Truth
-                .assertThat(position)
-                .isEqualTo(expectedYPosition)
+            Truth.assertThat(position).isEqualTo(expectedYPosition)
             expectedYPosition += eachSize
             if (index < (noOfItems - 1)) {
                 expectedYPosition += spaceAligned
@@ -3616,22 +3191,17 @@
             with(LocalDensity.current) {
                 Box(Modifier.size(200.toDp())) {
                     FlowColumn(
-                        Modifier
-                            .onSizeChanged {
-                                widthResult = it.width
-                            },
+                        Modifier.onSizeChanged { widthResult = it.width },
                         horizontalArrangement = Arrangement.spacedBy(spaceAligned.toDp()),
                         maxItemsInEachColumn = 1
                     ) {
                         repeat(noOfItems) { index ->
                             Box(
-                                Modifier
-                                    .size(eachSize.toDp())
-                                    .onPlaced {
-                                        val positionInParent = it.positionInParent()
-                                        val xPosition = positionInParent.x
-                                        xPositions[index] = xPosition
-                                    }
+                                Modifier.size(eachSize.toDp()).onPlaced {
+                                    val positionInParent = it.positionInParent()
+                                    val xPosition = positionInParent.x
+                                    xPositions[index] = xPosition
+                                }
                             )
                         }
                     }
@@ -3641,13 +3211,9 @@
 
         rule.waitForIdle()
         var expectedXPosition = 0
-        Truth
-            .assertThat(widthResult)
-            .isEqualTo(expectedWidth)
+        Truth.assertThat(widthResult).isEqualTo(expectedWidth)
         xPositions.forEachIndexed { index, position ->
-            Truth
-                .assertThat(position)
-                .isEqualTo(expectedXPosition)
+            Truth.assertThat(position).isEqualTo(expectedXPosition)
             expectedXPosition += eachSize
             if (index < (noOfItems - 1)) {
                 expectedXPosition += spaceAligned
@@ -3671,13 +3237,11 @@
                     ) {
                         repeat(10) { index ->
                             Box(
-                                Modifier
-                                    .size(eachSize.toDp())
-                                    .onPlaced {
-                                        val positionInParent = it.positionInParent()
-                                        val position = positionInParent.y
-                                        yPositions[index] = position
-                                    }
+                                Modifier.size(eachSize.toDp()).onPlaced {
+                                    val positionInParent = it.positionInParent()
+                                    val position = positionInParent.y
+                                    yPositions[index] = position
+                                }
                             )
                         }
                     }
@@ -3695,9 +3259,7 @@
                 expectedYPosition += spaceAligned
             }
 
-            Truth
-                .assertThat(position)
-                .isEqualTo(expectedYPosition)
+            Truth.assertThat(position).isEqualTo(expectedYPosition)
         }
     }
 
@@ -3713,27 +3275,19 @@
         val xPositions = FloatArray(10)
         rule.setContent {
             with(LocalDensity.current) {
-                Box(
-                    Modifier
-                        .widthIn(30.toDp(), 40.toDp())
-                ) {
+                Box(Modifier.widthIn(30.toDp(), 40.toDp())) {
                     FlowRow(
-                        Modifier
-                            .onSizeChanged {
-                                width = it.width
-                            },
+                        Modifier.onSizeChanged { width = it.width },
                         horizontalArrangement = Arrangement.spacedBy(spaceAligned.toDp()),
                         maxItemsInEachRow = maxItemsInMainAxis
                     ) {
                         repeat(10) { index ->
                             Box(
-                                Modifier
-                                    .size(eachSize.toDp())
-                                    .onPlaced {
-                                        val positionInParent = it.positionInParent()
-                                        val xPosition = positionInParent.x
-                                        xPositions[index] = xPosition
-                                    }
+                                Modifier.size(eachSize.toDp()).onPlaced {
+                                    val positionInParent = it.positionInParent()
+                                    val xPosition = positionInParent.x
+                                    xPositions[index] = xPosition
+                                }
                             )
                         }
                     }
@@ -3752,9 +3306,7 @@
                 expectedXPosition += spaceAligned
             }
 
-            Truth
-                .assertThat(position)
-                .isEqualTo(expectedXPosition)
+            Truth.assertThat(position).isEqualTo(expectedXPosition)
         }
     }
 
@@ -3770,28 +3322,19 @@
         val yPositions = FloatArray(10)
         rule.setContent {
             with(LocalDensity.current) {
-                Box(
-                    Modifier
-                        .heightIn(30.toDp(), 40.toDp())
-
-                ) {
+                Box(Modifier.heightIn(30.toDp(), 40.toDp())) {
                     FlowColumn(
-                        Modifier
-                            .onSizeChanged {
-                                height = it.height
-                            },
+                        Modifier.onSizeChanged { height = it.height },
                         verticalArrangement = Arrangement.spacedBy(spaceAligned.toDp()),
                         maxItemsInEachColumn = maxItemsInMainAxis
                     ) {
                         repeat(10) { index ->
                             Box(
-                                Modifier
-                                    .size(eachSize.toDp())
-                                    .onPlaced {
-                                        val positionInParent = it.positionInParent()
-                                        val yPosition = positionInParent.y
-                                        yPositions[index] = yPosition
-                                    }
+                                Modifier.size(eachSize.toDp()).onPlaced {
+                                    val positionInParent = it.positionInParent()
+                                    val yPosition = positionInParent.y
+                                    yPositions[index] = yPosition
+                                }
                             )
                         }
                     }
@@ -3810,9 +3353,7 @@
                 expectedYPosition += spaceAligned
             }
 
-            Truth
-                .assertThat(position)
-                .isEqualTo(expectedYPosition)
+            Truth.assertThat(position).isEqualTo(expectedYPosition)
         }
     }
 
@@ -3827,20 +3368,17 @@
             with(LocalDensity.current) {
                 Box(Modifier.size(size.toDp())) {
                     FlowColumn(
-                        Modifier
-                            .fillMaxHeight(1f),
+                        Modifier.fillMaxHeight(1f),
                         verticalArrangement = Arrangement.Top,
                         maxItemsInEachColumn = maxItemsInMainAxis
                     ) {
                         repeat(10) { index ->
                             Box(
-                                Modifier
-                                    .size(20.toDp())
-                                    .onPlaced {
-                                        val positionInParent = it.positionInParent()
-                                        val yPosition = positionInParent.y
-                                        yPositions[index] = yPosition
-                                    }
+                                Modifier.size(20.toDp()).onPlaced {
+                                    val positionInParent = it.positionInParent()
+                                    val yPosition = positionInParent.y
+                                    yPositions[index] = yPosition
+                                }
                             )
                         }
                     }
@@ -3854,9 +3392,7 @@
             if (index % 5 == 0) {
                 expectedYPosition = 0
             }
-            Truth
-                .assertThat(position)
-                .isEqualTo(expectedYPosition)
+            Truth.assertThat(position).isEqualTo(expectedYPosition)
             expectedYPosition += eachSize
         }
     }
@@ -3878,20 +3414,17 @@
                 with(LocalDensity.current) {
                     Box(Modifier.size(size.toDp())) {
                         FlowRow(
-                            Modifier
-                                .fillMaxWidth(1f),
+                            Modifier.fillMaxWidth(1f),
                             horizontalArrangement = Arrangement.Start,
                             maxItemsInEachRow = maxItemsInMainAxis
                         ) {
                             repeat(6) { index ->
                                 Box(
-                                    Modifier
-                                        .size(eachSize.toDp())
-                                        .onPlaced {
-                                            val positionInParent = it.positionInParent()
-                                            val xPosition = positionInParent.x
-                                            xPositions[index] = xPosition
-                                        }
+                                    Modifier.size(eachSize.toDp()).onPlaced {
+                                        val positionInParent = it.positionInParent()
+                                        val xPosition = positionInParent.x
+                                        xPositions[index] = xPosition
+                                    }
                                 )
                             }
                         }
@@ -3903,9 +3436,7 @@
         rule.waitForIdle()
         var expectedXPosition = size.toInt() - eachSize
         xPositions.forEachIndexed { index, position ->
-            Truth
-                .assertThat(position)
-                .isEqualTo(expectedXPosition)
+            Truth.assertThat(position).isEqualTo(expectedXPosition)
             if (index == (maxItemsInMainAxis - 1)) {
                 expectedXPosition = size.toInt() - eachSize
             } else {
@@ -3928,22 +3459,18 @@
                 with(LocalDensity.current) {
                     Box(Modifier.size(size.toDp())) {
                         FlowColumn(
-                            Modifier
-                                .fillMaxHeight(1f)
-                                .fillMaxWidth(1f),
+                            Modifier.fillMaxHeight(1f).fillMaxWidth(1f),
                             verticalArrangement = Arrangement.Top,
                             maxItemsInEachColumn = maxItemsInMainAxis
                         ) {
                             repeat(10) { index ->
                                 Box(
-                                    Modifier
-                                        .size(20.toDp())
-                                        .onPlaced {
-                                            val positionInParent = it.positionInParent()
-                                            val yPosition = positionInParent.y
-                                            val xPosition = positionInParent.x
-                                            xYPositions[index] = Pair(xPosition, yPosition)
-                                        }
+                                    Modifier.size(20.toDp()).onPlaced {
+                                        val positionInParent = it.positionInParent()
+                                        val yPosition = positionInParent.y
+                                        val xPosition = positionInParent.x
+                                        xYPositions[index] = Pair(xPosition, yPosition)
+                                    }
                                 )
                             }
                         }
@@ -3962,12 +3489,8 @@
             if (index % 5 == 0) {
                 expectedYPosition = 0
             }
-            Truth
-                .assertThat(yPosition)
-                .isEqualTo(expectedYPosition)
-            Truth
-                .assertThat(xPosition)
-                .isEqualTo(expectedXPosition)
+            Truth.assertThat(yPosition).isEqualTo(expectedYPosition)
+            Truth.assertThat(xPosition).isEqualTo(expectedXPosition)
             if (index == (maxItemsInMainAxis - 1)) {
                 expectedXPosition -= eachSize
             }
@@ -3991,25 +3514,21 @@
                 with(LocalDensity.current) {
                     Box(Modifier.size(size.toDp())) {
                         FlowColumn(
-                            Modifier
-                                .fillMaxHeight(1f)
-                                .onSizeChanged {
-                                    width = it.width
-                                    itemsThatCanFit = it.height / eachSize
-                                },
+                            Modifier.fillMaxHeight(1f).onSizeChanged {
+                                width = it.width
+                                itemsThatCanFit = it.height / eachSize
+                            },
                             verticalArrangement = Arrangement.Top,
                             maxItemsInEachColumn = maxItemsInMainAxis
                         ) {
                             repeat(10) { index ->
                                 Box(
-                                    Modifier
-                                        .size(20.toDp())
-                                        .onPlaced {
-                                            val positionInParent = it.positionInParent()
-                                            val xPosition = positionInParent.x
-                                            val yPosition = positionInParent.y
-                                            xYPositions[index] = Pair(xPosition, yPosition)
-                                        }
+                                    Modifier.size(20.toDp()).onPlaced {
+                                        val positionInParent = it.positionInParent()
+                                        val xPosition = positionInParent.x
+                                        val yPosition = positionInParent.y
+                                        xYPositions[index] = Pair(xPosition, yPosition)
+                                    }
                                 )
                             }
                         }
@@ -4026,19 +3545,13 @@
             val pair = xYPositions[index]
             val xPosition = pair.first
             val yPosition = pair.second
-            if (index % maxItemsInMainAxis == 0 ||
-                fittedItems == itemsThatCanFit
-            ) {
+            if (index % maxItemsInMainAxis == 0 || fittedItems == itemsThatCanFit) {
                 expectedYPosition = 0
                 expectedXPosition -= eachSize
                 fittedItems = 0
             }
-            Truth
-                .assertThat(yPosition)
-                .isEqualTo(expectedYPosition)
-            Truth
-                .assertThat(xPosition)
-                .isEqualTo(expectedXPosition)
+            Truth.assertThat(yPosition).isEqualTo(expectedYPosition)
+            Truth.assertThat(xPosition).isEqualTo(expectedXPosition)
             expectedYPosition += eachSize
             fittedItems++
         }
@@ -4060,19 +3573,14 @@
             ) {
                 with(LocalDensity.current) {
                     Box(Modifier.size(200.toDp())) {
-                        FlowRow(
-                            horizontalArrangement = Arrangement.Start,
-                            maxItemsInEachRow = 5
-                        ) {
+                        FlowRow(horizontalArrangement = Arrangement.Start, maxItemsInEachRow = 5) {
                             repeat(6) { index ->
                                 Box(
-                                    Modifier
-                                        .size(20.toDp())
-                                        .onPlaced {
-                                            val positionInParent = it.positionInParent()
-                                            val xPosition = positionInParent.x
-                                            xPositions[index] = xPosition
-                                        }
+                                    Modifier.size(20.toDp()).onPlaced {
+                                        val positionInParent = it.positionInParent()
+                                        val xPosition = positionInParent.x
+                                        xPositions[index] = xPosition
+                                    }
                                 )
                             }
                         }
@@ -4083,9 +3591,7 @@
         rule.waitForIdle()
         var expectedXPosition = maxMainAxisSize - eachSize
         xPositions.forEachIndexed { index, position ->
-            Truth
-                .assertThat(position)
-                .isEqualTo(expectedXPosition)
+            Truth.assertThat(position).isEqualTo(expectedXPosition)
             if (index == (maxItemsInMainAxis - 1)) {
                 expectedXPosition = maxMainAxisSize - eachSize
             } else {
@@ -4104,20 +3610,11 @@
                 with(LocalDensity.current) {
                     Box(Modifier.size(200.toDp())) {
                         FlowRow(
-                            Modifier
-                                .width(IntrinsicSize.Min)
-                                .onSizeChanged {
-                                    width = it.width
-                                },
+                            Modifier.width(IntrinsicSize.Min).onSizeChanged { width = it.width },
                             horizontalArrangement = Arrangement.Start,
                             maxItemsInEachRow = 5
                         ) {
-                            repeat(6) {
-                                Box(
-                                    Modifier
-                                        .size(20.toDp())
-                                )
-                            }
+                            repeat(6) { Box(Modifier.size(20.toDp())) }
                         }
                     }
                 }
@@ -4142,28 +3639,18 @@
             var overflow by remember { overflowState }
             var maxItemsInMainAxis by remember { maxItemsInMainAxisState }
             var spacedBy by remember { spacingState }
-            seeMoreOrCollapse = FlowRowOverflow.expandOrCollapseIndicator(
-                expandIndicator = {
-                    Box(Modifier.size(20.dp))
-                },
-                collapseIndicator = {
-                    Box(Modifier.size(20.dp))
-                }
-            )
-            CompositionLocalProvider(
-                LocalDensity provides NoOpDensity
-            ) {
-                Box(
-                    Modifier
-                        .width(200.dp)
-                        .wrapContentHeight()) {
+            seeMoreOrCollapse =
+                FlowRowOverflow.expandOrCollapseIndicator(
+                    expandIndicator = { Box(Modifier.size(20.dp)) },
+                    collapseIndicator = { Box(Modifier.size(20.dp)) }
+                )
+            CompositionLocalProvider(LocalDensity provides NoOpDensity) {
+                Box(Modifier.width(200.dp).wrapContentHeight()) {
                     FlowRow(
-                        Modifier
-                            .width(IntrinsicSize.Min)
-                            .onSizeChanged {
-                                width = it.width
-                                height = it.height
-                            },
+                        Modifier.width(IntrinsicSize.Min).onSizeChanged {
+                            width = it.width
+                            height = it.height
+                        },
                         horizontalArrangement = Arrangement.spacedBy(spacedBy.dp, Alignment.Start),
                         verticalArrangement = Arrangement.spacedBy(spacedBy.dp, Alignment.Top),
                         maxItemsInEachRow = maxItemsInMainAxis,
@@ -4171,13 +3658,7 @@
                         overflow = overflow
                     ) {
                         repeat(6) { index ->
-                            Box(
-                                Modifier
-                                    .size(20.dp)
-                                    .onPlaced {
-                                        itemShown = index + 1
-                                    }
-                            )
+                            Box(Modifier.size(20.dp).onPlaced { itemShown = index + 1 })
                         }
                     }
                 }
@@ -4188,9 +3669,7 @@
             Truth.assertThat(width).isEqualTo(40)
             Truth.assertThat(height).isEqualTo(20)
             Truth.assertThat(itemShown).isEqualTo(2)
-            overflowState.value = FlowRowOverflow.expandIndicator {
-                Box(Modifier.size(20.dp)) {}
-            }
+            overflowState.value = FlowRowOverflow.expandIndicator { Box(Modifier.size(20.dp)) {} }
         }
         advanceClock()
         rule.runOnIdle {
@@ -4238,28 +3717,18 @@
             var overflow by remember { overflowState }
             var maxItemsInMainAxis by remember { maxItemsInMainAxisState }
             var spacedBy by remember { spacingState }
-            seeMoreOrCollapse = FlowColumnOverflow.expandOrCollapseIndicator(
-                expandIndicator = {
-                    Box(Modifier.size(20.dp))
-                },
-                collapseIndicator = {
-                    Box(Modifier.size(20.dp)) {}
-                }
-            )
-            CompositionLocalProvider(
-                LocalDensity provides NoOpDensity
-            ) {
-                Box(
-                    Modifier
-                        .height(200.dp)
-                        .wrapContentWidth()) {
+            seeMoreOrCollapse =
+                FlowColumnOverflow.expandOrCollapseIndicator(
+                    expandIndicator = { Box(Modifier.size(20.dp)) },
+                    collapseIndicator = { Box(Modifier.size(20.dp)) {} }
+                )
+            CompositionLocalProvider(LocalDensity provides NoOpDensity) {
+                Box(Modifier.height(200.dp).wrapContentWidth()) {
                     FlowColumn(
-                        Modifier
-                            .height(IntrinsicSize.Min)
-                            .onSizeChanged {
-                                height = it.height
-                                width = it.width
-                            },
+                        Modifier.height(IntrinsicSize.Min).onSizeChanged {
+                            height = it.height
+                            width = it.width
+                        },
                         verticalArrangement = Arrangement.spacedBy(spacedBy.dp, Alignment.Top),
                         horizontalArrangement = Arrangement.spacedBy(spacedBy.dp, Alignment.Start),
                         maxItemsInEachColumn = maxItemsInMainAxis,
@@ -4267,13 +3736,7 @@
                         overflow = overflow
                     ) {
                         repeat(6) { index ->
-                            Box(
-                                Modifier
-                                    .size(20.dp)
-                                    .onPlaced {
-                                        itemShown = index + 1
-                                    }
-                            )
+                            Box(Modifier.size(20.dp).onPlaced { itemShown = index + 1 })
                         }
                     }
                 }
@@ -4284,9 +3747,8 @@
             Truth.assertThat(height).isEqualTo(40)
             Truth.assertThat(width).isEqualTo(20)
             Truth.assertThat(itemShown).isEqualTo(2)
-            overflowState.value = FlowColumnOverflow.expandIndicator {
-                Box(Modifier.size(20.dp)) {}
-            }
+            overflowState.value =
+                FlowColumnOverflow.expandIndicator { Box(Modifier.size(20.dp)) {} }
         }
         advanceClock()
         rule.runOnIdle {
@@ -4336,27 +3798,21 @@
             var minLinesToShowCollapse by remember { minLinesToShowCollapseState }
             var minHeightToShowCollapse by remember { minHeightToShowCollapseState }
             var spacedBy by remember { spacingState }
-            CompositionLocalProvider(
-                LocalDensity provides NoOpDensity
-            ) {
-                overflowState.value = FlowRowOverflow.expandOrCollapseIndicator(
-                    expandIndicator = { Box(Modifier.size(20.dp)) },
-                    collapseIndicator = { Box(Modifier.size(20.dp)) {} },
-                    minLinesToShowCollapse,
-                    minHeightToShowCollapse
-                )
+            CompositionLocalProvider(LocalDensity provides NoOpDensity) {
+                overflowState.value =
+                    FlowRowOverflow.expandOrCollapseIndicator(
+                        expandIndicator = { Box(Modifier.size(20.dp)) },
+                        collapseIndicator = { Box(Modifier.size(20.dp)) {} },
+                        minLinesToShowCollapse,
+                        minHeightToShowCollapse
+                    )
                 var overflow by remember { overflowState }
-                Box(
-                    Modifier
-                        .width(200.dp)
-                        .wrapContentHeight()) {
+                Box(Modifier.width(200.dp).wrapContentHeight()) {
                     FlowRow(
-                        Modifier
-                            .width(IntrinsicSize.Min)
-                            .onSizeChanged {
-                                width = it.width
-                                height = it.height
-                            },
+                        Modifier.width(IntrinsicSize.Min).onSizeChanged {
+                            width = it.width
+                            height = it.height
+                        },
                         horizontalArrangement = Arrangement.spacedBy(spacedBy.dp, Alignment.Start),
                         verticalArrangement = Arrangement.spacedBy(spacedBy.dp, Alignment.Top),
                         maxItemsInEachRow = maxItemsInMainAxis,
@@ -4364,13 +3820,7 @@
                         overflow = overflow
                     ) {
                         repeat(6) { index ->
-                            Box(
-                                Modifier
-                                    .size(20.dp)
-                                    .onPlaced {
-                                        itemShown = index + 1
-                                    }
-                            )
+                            Box(Modifier.size(20.dp).onPlaced { itemShown = index + 1 })
                         }
                     }
                 }
@@ -4425,31 +3875,17 @@
         val maxLinesState = mutableStateOf(1)
         rule.setContent {
             var maxLines by remember { maxLinesState }
-            CompositionLocalProvider(
-                LocalLayoutDirection provides LayoutDirection.Rtl
-            ) {
+            CompositionLocalProvider(LocalLayoutDirection provides LayoutDirection.Rtl) {
                 with(LocalDensity.current) {
-                    Box(
-                        Modifier
-                            .width(200.dp)
-                            .wrapContentHeight()) {
+                    Box(Modifier.width(200.dp).wrapContentHeight()) {
                         FlowRow(
-                            Modifier
-                                .width(IntrinsicSize.Min)
-                                .onSizeChanged {
-                                    width = it.width
-                                },
+                            Modifier.width(IntrinsicSize.Min).onSizeChanged { width = it.width },
                             horizontalArrangement = Arrangement.Start,
                             maxItemsInEachRow = 6,
                             maxLines = maxLines,
                             overflow = FlowRowOverflow.Clip
                         ) {
-                            repeat(6) {
-                                Box(
-                                    Modifier
-                                        .size(20.toDp())
-                                )
-                            }
+                            repeat(6) { Box(Modifier.size(20.toDp())) }
                         }
                     }
                 }
@@ -4471,9 +3907,7 @@
             maxLinesState.value = 6
         }
         advanceClock()
-        rule.runOnIdle {
-            Truth.assertThat(width).isEqualTo(20)
-        }
+        rule.runOnIdle { Truth.assertThat(width).isEqualTo(20) }
     }
 
     @Test
@@ -4493,27 +3927,21 @@
             var minLinesToShowCollapse by remember { minLinesToShowCollapseState }
             var minWidthToShowCollapse by remember { minWidthToShowCollapseState }
             var spacedBy by remember { spacingState }
-            CompositionLocalProvider(
-                LocalDensity provides NoOpDensity
-            ) {
-                overflowState.value = FlowColumnOverflow.expandOrCollapseIndicator(
-                    expandIndicator = { Box(Modifier.size(20.dp)) },
-                    collapseIndicator = { Box(Modifier.size(20.dp)) {} },
-                    minLinesToShowCollapse,
-                    minWidthToShowCollapse
-                )
+            CompositionLocalProvider(LocalDensity provides NoOpDensity) {
+                overflowState.value =
+                    FlowColumnOverflow.expandOrCollapseIndicator(
+                        expandIndicator = { Box(Modifier.size(20.dp)) },
+                        collapseIndicator = { Box(Modifier.size(20.dp)) {} },
+                        minLinesToShowCollapse,
+                        minWidthToShowCollapse
+                    )
                 var overflow by remember { overflowState }
-                Box(
-                    Modifier
-                        .height(200.dp)
-                        .wrapContentWidth()) {
+                Box(Modifier.height(200.dp).wrapContentWidth()) {
                     FlowColumn(
-                        Modifier
-                            .height(IntrinsicSize.Min)
-                            .onSizeChanged {
-                                height = it.height
-                                width = it.width
-                            },
+                        Modifier.height(IntrinsicSize.Min).onSizeChanged {
+                            height = it.height
+                            width = it.width
+                        },
                         verticalArrangement = Arrangement.spacedBy(spacedBy.dp, Alignment.Top),
                         horizontalArrangement = Arrangement.spacedBy(spacedBy.dp, Alignment.Start),
                         maxItemsInEachColumn = maxItemsInMainAxis,
@@ -4521,13 +3949,7 @@
                         overflow = overflow
                     ) {
                         repeat(6) { index ->
-                            Box(
-                                Modifier
-                                    .size(20.dp)
-                                    .onPlaced {
-                                        itemShown = index + 1
-                                    }
-                            )
+                            Box(Modifier.size(20.dp).onPlaced { itemShown = index + 1 })
                         }
                     }
                 }
@@ -4583,30 +4005,16 @@
         val maxLinesState = mutableStateOf(1)
         rule.setContent {
             var maxLines by remember { maxLinesState }
-            CompositionLocalProvider(
-                LocalDensity provides NoOpDensity
-            ) {
-                Box(
-                    Modifier
-                        .width(250.dp)
-                        .wrapContentHeight()) {
+            CompositionLocalProvider(LocalDensity provides NoOpDensity) {
+                Box(Modifier.width(250.dp).wrapContentHeight()) {
                     FlowRow(
-                        Modifier
-                            .width(IntrinsicSize.Min)
-                            .onSizeChanged {
-                                width = it.width
-                            },
+                        Modifier.width(IntrinsicSize.Min).onSizeChanged { width = it.width },
                         horizontalArrangement = Arrangement.spacedBy(20.dp),
                         maxItemsInEachRow = 6,
                         maxLines = maxLines,
                         overflow = FlowRowOverflow.Clip
                     ) {
-                        repeat(6) {
-                            Box(
-                                Modifier
-                                    .size(20.dp)
-                            )
-                        }
+                        repeat(6) { Box(Modifier.size(20.dp)) }
                     }
                 }
             }
@@ -4627,9 +4035,7 @@
             maxLinesState.value = 6
         }
         advanceClock()
-        rule.runOnIdle {
-            Truth.assertThat(width).isEqualTo(20)
-        }
+        rule.runOnIdle { Truth.assertThat(width).isEqualTo(20) }
     }
 
     @Test
@@ -4638,35 +4044,16 @@
         val maxLinesState = mutableStateOf(1)
         rule.setContent {
             var maxLines by remember { maxLinesState }
-            CompositionLocalProvider(
-                LocalDensity provides NoOpDensity
-            ) {
-                Box(
-                    Modifier
-                        .width(200.dp)
-                        .wrapContentHeight()) {
+            CompositionLocalProvider(LocalDensity provides NoOpDensity) {
+                Box(Modifier.width(200.dp).wrapContentHeight()) {
                     FlowRow(
-                        Modifier
-                            .width(IntrinsicSize.Min)
-                            .onSizeChanged {
-                                width = it.width
-                            },
+                        Modifier.width(IntrinsicSize.Min).onSizeChanged { width = it.width },
                         horizontalArrangement = Arrangement.Start,
                         maxItemsInEachRow = 6,
                         maxLines = maxLines,
-                        overflow = FlowRowOverflow.expandIndicator {
-                            Box(
-                                Modifier
-                                    .size(20.dp)
-                            )
-                        }
+                        overflow = FlowRowOverflow.expandIndicator { Box(Modifier.size(20.dp)) }
                     ) {
-                        repeat(6) {
-                            Box(
-                                Modifier
-                                    .size(20.dp)
-                            )
-                        }
+                        repeat(6) { Box(Modifier.size(20.dp)) }
                     }
                 }
             }
@@ -4687,9 +4074,7 @@
             maxLinesState.value = 6
         }
         advanceClock()
-        rule.runOnIdle {
-            Truth.assertThat(width).isEqualTo(20)
-        }
+        rule.runOnIdle { Truth.assertThat(width).isEqualTo(20) }
     }
 
     @Test
@@ -4698,35 +4083,16 @@
         val maxLinesState = mutableStateOf(1)
         rule.setContent {
             var maxLines by remember { maxLinesState }
-            CompositionLocalProvider(
-                LocalDensity provides NoOpDensity
-            ) {
-                Box(
-                    Modifier
-                        .height(200.dp)
-                        .wrapContentWidth()) {
+            CompositionLocalProvider(LocalDensity provides NoOpDensity) {
+                Box(Modifier.height(200.dp).wrapContentWidth()) {
                     FlowColumn(
-                        Modifier
-                            .height(IntrinsicSize.Min)
-                            .onSizeChanged {
-                                height = it.height
-                            },
+                        Modifier.height(IntrinsicSize.Min).onSizeChanged { height = it.height },
                         verticalArrangement = Arrangement.Top,
                         maxItemsInEachColumn = 6,
                         maxLines = maxLines,
-                        overflow = FlowColumnOverflow.expandIndicator {
-                            Box(
-                                Modifier
-                                    .size(20.dp)
-                            )
-                        }
+                        overflow = FlowColumnOverflow.expandIndicator { Box(Modifier.size(20.dp)) }
                     ) {
-                        repeat(6) {
-                            Box(
-                                Modifier
-                                    .size(20.dp)
-                            )
-                        }
+                        repeat(6) { Box(Modifier.size(20.dp)) }
                     }
                 }
             }
@@ -4747,9 +4113,7 @@
             maxLinesState.value = 6
         }
         advanceClock()
-        rule.runOnIdle {
-            Truth.assertThat(height).isEqualTo(20)
-        }
+        rule.runOnIdle { Truth.assertThat(height).isEqualTo(20) }
     }
 
     @Test
@@ -4758,35 +4122,16 @@
         val maxLinesState = mutableStateOf(1)
         rule.setContent {
             var maxLines by remember { maxLinesState }
-            CompositionLocalProvider(
-                LocalDensity provides NoOpDensity
-            ) {
-                Box(
-                    Modifier
-                        .width(250.dp)
-                        .wrapContentHeight()) {
+            CompositionLocalProvider(LocalDensity provides NoOpDensity) {
+                Box(Modifier.width(250.dp).wrapContentHeight()) {
                     FlowRow(
-                        Modifier
-                            .width(IntrinsicSize.Min)
-                            .onSizeChanged {
-                                width = it.width
-                            },
+                        Modifier.width(IntrinsicSize.Min).onSizeChanged { width = it.width },
                         horizontalArrangement = Arrangement.spacedBy(20.dp),
                         maxItemsInEachRow = 6,
                         maxLines = maxLines,
-                        overflow = FlowRowOverflow.expandIndicator {
-                            Box(
-                                Modifier
-                                    .size(20.dp)
-                            )
-                        }
+                        overflow = FlowRowOverflow.expandIndicator { Box(Modifier.size(20.dp)) }
                     ) {
-                        repeat(6) {
-                            Box(
-                                Modifier
-                                    .size(20.dp)
-                            )
-                        }
+                        repeat(6) { Box(Modifier.size(20.dp)) }
                     }
                 }
             }
@@ -4807,9 +4152,7 @@
             maxLinesState.value = 6
         }
         advanceClock()
-        rule.runOnIdle {
-            Truth.assertThat(width).isEqualTo(20)
-        }
+        rule.runOnIdle { Truth.assertThat(width).isEqualTo(20) }
     }
 
     @Test
@@ -4818,35 +4161,16 @@
         val maxLinesState = mutableStateOf(1)
         rule.setContent {
             var maxLines by remember { maxLinesState }
-            CompositionLocalProvider(
-                LocalDensity provides NoOpDensity
-            ) {
-                Box(
-                    Modifier
-                        .height(250.dp)
-                        .wrapContentWidth()) {
+            CompositionLocalProvider(LocalDensity provides NoOpDensity) {
+                Box(Modifier.height(250.dp).wrapContentWidth()) {
                     FlowColumn(
-                        Modifier
-                            .height(IntrinsicSize.Min)
-                            .onSizeChanged {
-                                height = it.height
-                            },
+                        Modifier.height(IntrinsicSize.Min).onSizeChanged { height = it.height },
                         verticalArrangement = Arrangement.spacedBy(20.dp),
                         maxItemsInEachColumn = 6,
                         maxLines = maxLines,
-                        overflow = FlowColumnOverflow.expandIndicator {
-                            Box(
-                                Modifier
-                                    .size(20.dp)
-                            )
-                        }
+                        overflow = FlowColumnOverflow.expandIndicator { Box(Modifier.size(20.dp)) }
                     ) {
-                        repeat(6) {
-                            Box(
-                                Modifier
-                                    .size(20.dp)
-                            )
-                        }
+                        repeat(6) { Box(Modifier.size(20.dp)) }
                     }
                 }
             }
@@ -4867,9 +4191,7 @@
             maxLinesState.value = 6
         }
         advanceClock()
-        rule.runOnIdle {
-            Truth.assertThat(height).isEqualTo(20)
-        }
+        rule.runOnIdle { Truth.assertThat(height).isEqualTo(20) }
     }
 
     @Test
@@ -4884,32 +4206,23 @@
                 LocalDensity provides NoOpDensity
             ) {
                 with(LocalDensity.current) {
-                    Box(
-                        Modifier
-                            .width(200.dp)
-                            .wrapContentHeight()) {
+                    Box(Modifier.width(200.dp).wrapContentHeight()) {
                         FlowRow(
-                            Modifier
-                                .width(IntrinsicSize.Min)
-                                .onSizeChanged {
-                                    width = it.width
-                                    height = it.height
-                                },
+                            Modifier.width(IntrinsicSize.Min).onSizeChanged {
+                                width = it.width
+                                height = it.height
+                            },
                             horizontalArrangement = Arrangement.Start,
                             maxItemsInEachRow = 6,
                             maxLines = maxLines,
-                            overflow = FlowRowOverflow.expandOrCollapseIndicator(
-                                expandIndicator = { Box(Modifier.size(20.dp)) },
-                                collapseIndicator = { Box(Modifier.size(20.dp)) },
-                                minRowsToShowCollapse = 2
-                            )
-                        ) {
-                            repeat(6) {
-                                Box(
-                                    Modifier
-                                        .size(20.dp)
+                            overflow =
+                                FlowRowOverflow.expandOrCollapseIndicator(
+                                    expandIndicator = { Box(Modifier.size(20.dp)) },
+                                    collapseIndicator = { Box(Modifier.size(20.dp)) },
+                                    minRowsToShowCollapse = 2
                                 )
-                            }
+                        ) {
+                            repeat(6) { Box(Modifier.size(20.dp)) }
                         }
                     }
                 }
@@ -4951,32 +4264,23 @@
                 LocalLayoutDirection provides LayoutDirection.Rtl,
                 LocalDensity provides NoOpDensity
             ) {
-                Box(
-                    Modifier
-                        .height(200.dp)
-                        .wrapContentWidth()) {
+                Box(Modifier.height(200.dp).wrapContentWidth()) {
                     FlowColumn(
-                        Modifier
-                            .height(IntrinsicSize.Min)
-                            .onSizeChanged {
-                                height = it.height
-                                width = it.width
-                            },
+                        Modifier.height(IntrinsicSize.Min).onSizeChanged {
+                            height = it.height
+                            width = it.width
+                        },
                         verticalArrangement = Arrangement.Top,
                         maxItemsInEachColumn = 6,
                         maxLines = maxLines,
-                        overflow = FlowColumnOverflow.expandOrCollapseIndicator(
-                            expandIndicator = { Box(Modifier.size(20.dp)) },
-                            collapseIndicator = { Box(Modifier.size(20.dp)) {} },
-                            minColumnsToShowCollapse = 2
-                        )
-                    ) {
-                        repeat(6) {
-                            Box(
-                                Modifier
-                                    .size(20.dp)
+                        overflow =
+                            FlowColumnOverflow.expandOrCollapseIndicator(
+                                expandIndicator = { Box(Modifier.size(20.dp)) },
+                                collapseIndicator = { Box(Modifier.size(20.dp)) {} },
+                                minColumnsToShowCollapse = 2
                             )
-                        }
+                    ) {
+                        repeat(6) { Box(Modifier.size(20.dp)) }
                     }
                 }
             }
@@ -5016,19 +4320,10 @@
                 with(LocalDensity.current) {
                     Box(Modifier.size(200.toDp())) {
                         FlowColumn(
-                            Modifier
-                                .width(IntrinsicSize.Min)
-                                .onSizeChanged {
-                                    width = it.width
-                                },
+                            Modifier.width(IntrinsicSize.Min).onSizeChanged { width = it.width },
                             maxItemsInEachColumn = 6
                         ) {
-                            repeat(6) {
-                                Box(
-                                    Modifier
-                                        .size(20.toDp())
-                                )
-                            }
+                            repeat(6) { Box(Modifier.size(20.toDp())) }
                         }
                     }
                 }
@@ -5048,19 +4343,10 @@
                 with(LocalDensity.current) {
                     Box(Modifier.size(200.toDp())) {
                         FlowColumn(
-                            Modifier
-                                .width(IntrinsicSize.Min)
-                                .onSizeChanged {
-                                    width = it.width
-                                },
+                            Modifier.width(IntrinsicSize.Min).onSizeChanged { width = it.width },
                             maxItemsInEachColumn = 5
                         ) {
-                            repeat(6) {
-                                Box(
-                                    Modifier
-                                        .size(20.toDp())
-                                )
-                            }
+                            repeat(6) { Box(Modifier.size(20.toDp())) }
                         }
                     }
                 }
@@ -5080,19 +4366,10 @@
                 with(LocalDensity.current) {
                     Box(Modifier.size(200.toDp())) {
                         FlowRow(
-                            Modifier
-                                .width(IntrinsicSize.Max)
-                                .onSizeChanged {
-                                    width = it.width
-                                },
+                            Modifier.width(IntrinsicSize.Max).onSizeChanged { width = it.width },
                             horizontalArrangement = Arrangement.Start,
                         ) {
-                            repeat(6) {
-                                Box(
-                                    Modifier
-                                        .size(20.toDp())
-                                )
-                            }
+                            repeat(6) { Box(Modifier.size(20.toDp())) }
                         }
                     }
                 }
@@ -5112,18 +4389,9 @@
                 with(LocalDensity.current) {
                     Box(Modifier.size(200.toDp())) {
                         FlowColumn(
-                            Modifier
-                                .width(IntrinsicSize.Max)
-                                .onSizeChanged {
-                                    width = it.width
-                                },
+                            Modifier.width(IntrinsicSize.Max).onSizeChanged { width = it.width },
                         ) {
-                            repeat(6) {
-                                Box(
-                                    Modifier
-                                        .size(20.toDp())
-                                )
-                            }
+                            repeat(6) { Box(Modifier.size(20.toDp())) }
                         }
                     }
                 }
@@ -5143,20 +4411,11 @@
                 with(LocalDensity.current) {
                     Box(Modifier.size(200.toDp())) {
                         FlowRow(
-                            Modifier
-                                .width(IntrinsicSize.Min)
-                                .onSizeChanged {
-                                    width = it.width
-                                },
+                            Modifier.width(IntrinsicSize.Min).onSizeChanged { width = it.width },
                             horizontalArrangement = Arrangement.spacedBy(20.toDp()),
                             maxItemsInEachRow = 5
                         ) {
-                            repeat(6) {
-                                Box(
-                                    Modifier
-                                        .size(20.toDp())
-                                )
-                            }
+                            repeat(6) { Box(Modifier.size(20.toDp())) }
                         }
                     }
                 }
@@ -5176,19 +4435,10 @@
                 with(LocalDensity.current) {
                     Box(Modifier.size(80.toDp())) {
                         FlowColumn(
-                            Modifier
-                                .width(IntrinsicSize.Min)
-                                .onSizeChanged {
-                                    width = it.width
-                                },
+                            Modifier.width(IntrinsicSize.Min).onSizeChanged { width = it.width },
                             verticalArrangement = Arrangement.spacedBy(20.toDp()),
                         ) {
-                            repeat(6) {
-                                Box(
-                                    Modifier
-                                        .size(20.toDp())
-                                )
-                            }
+                            repeat(6) { Box(Modifier.size(20.toDp())) }
                         }
                     }
                 }
@@ -5208,20 +4458,11 @@
                 with(LocalDensity.current) {
                     Box(Modifier.size(200.toDp())) {
                         FlowColumn(
-                            Modifier
-                                .width(IntrinsicSize.Min)
-                                .onSizeChanged {
-                                    width = it.width
-                                },
+                            Modifier.width(IntrinsicSize.Min).onSizeChanged { width = it.width },
                             horizontalArrangement = Arrangement.spacedBy(20.toDp()),
                             maxItemsInEachColumn = 5
                         ) {
-                            repeat(6) {
-                                Box(
-                                    Modifier
-                                        .size(20.toDp())
-                                )
-                            }
+                            repeat(6) { Box(Modifier.size(20.toDp())) }
                         }
                     }
                 }
@@ -5241,20 +4482,11 @@
                 with(LocalDensity.current) {
                     Box(Modifier.size(200.toDp())) {
                         FlowColumn(
-                            Modifier
-                                .width(IntrinsicSize.Min)
-                                .onSizeChanged {
-                                    width = it.width
-                                },
+                            Modifier.width(IntrinsicSize.Min).onSizeChanged { width = it.width },
                             horizontalArrangement = Arrangement.spacedBy(20.toDp()),
                             maxItemsInEachColumn = 5
                         ) {
-                            repeat(5) {
-                                Box(
-                                    Modifier
-                                        .size(20.toDp())
-                                )
-                            }
+                            repeat(5) { Box(Modifier.size(20.toDp())) }
                         }
                     }
                 }
@@ -5274,19 +4506,10 @@
                 with(LocalDensity.current) {
                     Box(Modifier.size(200.toDp())) {
                         FlowRow(
-                            Modifier
-                                .width(IntrinsicSize.Max)
-                                .onSizeChanged {
-                                    width = it.width
-                                },
+                            Modifier.width(IntrinsicSize.Max).onSizeChanged { width = it.width },
                             horizontalArrangement = Arrangement.spacedBy(10.toDp()),
                         ) {
-                            repeat(6) {
-                                Box(
-                                    Modifier
-                                        .size(20.toDp())
-                                )
-                            }
+                            repeat(6) { Box(Modifier.size(20.toDp())) }
                         }
                     }
                 }
@@ -5306,19 +4529,10 @@
                 with(LocalDensity.current) {
                     Box(Modifier.size(200.toDp())) {
                         FlowColumn(
-                            Modifier
-                                .width(IntrinsicSize.Max)
-                                .onSizeChanged {
-                                    width = it.width
-                                },
+                            Modifier.width(IntrinsicSize.Max).onSizeChanged { width = it.width },
                             verticalArrangement = Arrangement.spacedBy(20.toDp()),
                         ) {
-                            repeat(6) {
-                                Box(
-                                    Modifier
-                                        .size(20.toDp())
-                                )
-                            }
+                            repeat(6) { Box(Modifier.size(20.toDp())) }
                         }
                     }
                 }
@@ -5339,18 +4553,15 @@
                 with(LocalDensity.current) {
                     Box(Modifier.size(200.toDp())) {
                         FlowRow(
-                            Modifier
-                                .width(IntrinsicSize.Min)
-                                .onSizeChanged {
-                                    width = it.width
-                                    height = it.height
-                                },
+                            Modifier.width(IntrinsicSize.Min).onSizeChanged {
+                                width = it.width
+                                height = it.height
+                            },
                             maxItemsInEachRow = 5
                         ) {
                             repeat(6) { index ->
                                 Box(
-                                    Modifier
-                                        .width(if (index == 5) 100.toDp() else 20.toDp())
+                                    Modifier.width(if (index == 5) 100.toDp() else 20.toDp())
                                         .height(20.toDp())
                                 )
                             }
@@ -5375,18 +4586,15 @@
                 with(LocalDensity.current) {
                     Box(Modifier.size(200.toDp())) {
                         FlowColumn(
-                            Modifier
-                                .width(IntrinsicSize.Min)
-                                .onSizeChanged {
-                                    width = it.width
-                                    height = it.height
-                                },
+                            Modifier.width(IntrinsicSize.Min).onSizeChanged {
+                                width = it.width
+                                height = it.height
+                            },
                             maxItemsInEachColumn = 5
                         ) {
                             repeat(6) { index ->
                                 Box(
-                                    Modifier
-                                        .height(if (index == 5) 100.toDp() else 20.toDp())
+                                    Modifier.height(if (index == 5) 100.toDp() else 20.toDp())
                                         .width(20.toDp())
                                 )
                             }
@@ -5411,19 +4619,16 @@
                 with(LocalDensity.current) {
                     Box(Modifier.size(200.toDp())) {
                         FlowRow(
-                            Modifier
-                                .width(IntrinsicSize.Min)
-                                .onSizeChanged {
-                                    width = it.width
-                                    height = it.height
-                                },
+                            Modifier.width(IntrinsicSize.Min).onSizeChanged {
+                                width = it.width
+                                height = it.height
+                            },
                             horizontalArrangement = Arrangement.spacedBy(10.toDp()),
                             maxItemsInEachRow = 5
                         ) {
                             repeat(6) { index ->
                                 Box(
-                                    Modifier
-                                        .width(if (index == 5) 100.toDp() else 20.toDp())
+                                    Modifier.width(if (index == 5) 100.toDp() else 20.toDp())
                                         .height(20.toDp())
                                 )
                             }
@@ -5448,19 +4653,16 @@
                 with(LocalDensity.current) {
                     Box(Modifier.size(200.toDp())) {
                         FlowColumn(
-                            Modifier
-                                .width(IntrinsicSize.Min)
-                                .onSizeChanged {
-                                    width = it.width
-                                    height = it.height
-                                },
+                            Modifier.width(IntrinsicSize.Min).onSizeChanged {
+                                width = it.width
+                                height = it.height
+                            },
                             verticalArrangement = Arrangement.spacedBy(10.toDp()),
                             maxItemsInEachColumn = 5
                         ) {
                             repeat(6) { index ->
                                 Box(
-                                    Modifier
-                                        .width(if (index == 5) 100.toDp() else 20.toDp())
+                                    Modifier.width(if (index == 5) 100.toDp() else 20.toDp())
                                         .height(20.toDp())
                                 )
                             }
@@ -5484,19 +4686,10 @@
                 with(LocalDensity.current) {
                     Box(Modifier.size(200.toDp())) {
                         FlowRow(
-                            Modifier
-                                .width(IntrinsicSize.Min)
-                                .onSizeChanged {
-                                    width = it.width
-                                },
+                            Modifier.width(IntrinsicSize.Min).onSizeChanged { width = it.width },
                             maxItemsInEachRow = 2
                         ) {
-                            repeat(6) {
-                                Box(
-                                    Modifier
-                                        .size(20.toDp())
-                                )
-                            }
+                            repeat(6) { Box(Modifier.size(20.toDp())) }
                         }
                     }
                 }
@@ -5516,19 +4709,10 @@
                 with(LocalDensity.current) {
                     Box(Modifier.size(200.toDp())) {
                         FlowRow(
-                            Modifier
-                                .width(IntrinsicSize.Min)
-                                .onSizeChanged {
-                                    width = it.width
-                                },
+                            Modifier.width(IntrinsicSize.Min).onSizeChanged { width = it.width },
                             maxItemsInEachRow = 2
                         ) {
-                            repeat(6) {
-                                Box(
-                                    Modifier
-                                        .size(20.toDp())
-                                )
-                            }
+                            repeat(6) { Box(Modifier.size(20.toDp())) }
                         }
                     }
                 }
@@ -5548,19 +4732,10 @@
                 with(LocalDensity.current) {
                     Box(Modifier.size(200.toDp())) {
                         FlowRow(
-                            Modifier
-                                .width(IntrinsicSize.Max)
-                                .onSizeChanged {
-                                    width = it.width
-                                },
+                            Modifier.width(IntrinsicSize.Max).onSizeChanged { width = it.width },
                             maxItemsInEachRow = 2
                         ) {
-                            repeat(6) {
-                                Box(
-                                    Modifier
-                                        .size(20.toDp())
-                                )
-                            }
+                            repeat(6) { Box(Modifier.size(20.toDp())) }
                         }
                     }
                 }
@@ -5580,19 +4755,10 @@
                 with(LocalDensity.current) {
                     Box(Modifier.size(200.toDp())) {
                         FlowColumn(
-                            Modifier
-                                .width(IntrinsicSize.Max)
-                                .onSizeChanged {
-                                    width = it.width
-                                },
+                            Modifier.width(IntrinsicSize.Max).onSizeChanged { width = it.width },
                             maxItemsInEachColumn = 2
                         ) {
-                            repeat(6) {
-                                Box(
-                                    Modifier
-                                        .size(20.toDp())
-                                )
-                            }
+                            repeat(6) { Box(Modifier.size(20.toDp())) }
                         }
                     }
                 }
@@ -5613,18 +4779,15 @@
                 with(LocalDensity.current) {
                     Box(Modifier.size(200.toDp())) {
                         FlowRow(
-                            Modifier
-                                .width(IntrinsicSize.Min)
-                                .onSizeChanged {
-                                    width = it.width
-                                    height = it.height
-                                },
+                            Modifier.width(IntrinsicSize.Min).onSizeChanged {
+                                width = it.width
+                                height = it.height
+                            },
                             maxItemsInEachRow = 2
                         ) {
                             repeat(10) { index ->
                                 Box(
-                                    Modifier
-                                        .width(if (index == 5) 100.toDp() else 20.toDp())
+                                    Modifier.width(if (index == 5) 100.toDp() else 20.toDp())
                                         .height(20.toDp())
                                 )
                             }
@@ -5649,18 +4812,15 @@
                 with(LocalDensity.current) {
                     Box(Modifier.size(200.toDp())) {
                         FlowColumn(
-                            Modifier
-                                .width(IntrinsicSize.Min)
-                                .onSizeChanged {
-                                    width = it.width
-                                    height = it.height
-                                },
+                            Modifier.width(IntrinsicSize.Min).onSizeChanged {
+                                width = it.width
+                                height = it.height
+                            },
                             maxItemsInEachColumn = 2
                         ) {
                             repeat(10) { index ->
                                 Box(
-                                    Modifier
-                                        .width(if (index == 5) 100.toDp() else 20.toDp())
+                                    Modifier.width(if (index == 5) 100.toDp() else 20.toDp())
                                         .height(20.toDp())
                                 )
                             }
@@ -5684,18 +4844,9 @@
                 with(LocalDensity.current) {
                     Box(Modifier.size(200.toDp())) {
                         FlowRow(
-                            Modifier
-                                .height(IntrinsicSize.Min)
-                                .onSizeChanged {
-                                    height = it.height
-                                },
+                            Modifier.height(IntrinsicSize.Min).onSizeChanged { height = it.height },
                         ) {
-                            repeat(6) {
-                                Box(
-                                    Modifier
-                                        .size(20.toDp())
-                                )
-                            }
+                            repeat(6) { Box(Modifier.size(20.toDp())) }
                         }
                     }
                 }
@@ -5720,21 +4871,18 @@
             var overflow by remember { overflowState }
             var maxItemsInMainAxis by remember { maxItemsInMainAxisState }
             var spacedBy by remember { spacingState }
-            seeMoreOrCollapse = FlowRowOverflow.expandOrCollapseIndicator(
-                expandIndicator = { Box(Modifier.size(20.dp)) },
-                collapseIndicator = { Box(Modifier.size(20.dp)) {} },
-            )
-            CompositionLocalProvider(
-                LocalDensity provides NoOpDensity
-            ) {
+            seeMoreOrCollapse =
+                FlowRowOverflow.expandOrCollapseIndicator(
+                    expandIndicator = { Box(Modifier.size(20.dp)) },
+                    collapseIndicator = { Box(Modifier.size(20.dp)) {} },
+                )
+            CompositionLocalProvider(LocalDensity provides NoOpDensity) {
                 Box(Modifier.size(200.dp)) {
                     FlowRow(
-                        Modifier
-                            .height(IntrinsicSize.Min)
-                            .onSizeChanged {
-                                height = it.height
-                                width = it.width
-                            },
+                        Modifier.height(IntrinsicSize.Min).onSizeChanged {
+                            height = it.height
+                            width = it.width
+                        },
                         horizontalArrangement = Arrangement.spacedBy(spacedBy.dp, Alignment.Start),
                         verticalArrangement = Arrangement.spacedBy(spacedBy.dp, Alignment.Top),
                         maxItemsInEachRow = maxItemsInMainAxis,
@@ -5742,13 +4890,7 @@
                         overflow = overflow
                     ) {
                         repeat(6) { index ->
-                            Box(
-                                Modifier
-                                    .size(20.dp)
-                                    .onPlaced {
-                                        itemShown = index + 1
-                                    }
-                            )
+                            Box(Modifier.size(20.dp).onPlaced { itemShown = index + 1 })
                         }
                     }
                 }
@@ -5759,9 +4901,7 @@
             Truth.assertThat(width).isEqualTo(40)
             Truth.assertThat(height).isEqualTo(20)
             Truth.assertThat(itemShown).isEqualTo(2)
-            overflowState.value = FlowRowOverflow.expandIndicator {
-                Box(Modifier.size(20.dp)) {}
-            }
+            overflowState.value = FlowRowOverflow.expandIndicator { Box(Modifier.size(20.dp)) {} }
         }
         advanceClock()
         rule.runOnIdle {
@@ -5809,21 +4949,18 @@
             var overflow by remember { overflowState }
             var maxItemsInMainAxis by remember { maxItemsInMainAxisState }
             var spacedBy by remember { spacingState }
-            seeMoreOrCollapse = FlowColumnOverflow.expandOrCollapseIndicator(
-                expandIndicator = { Box(Modifier.size(20.dp)) },
-                collapseIndicator = { Box(Modifier.size(20.dp)) {} },
-            )
-            CompositionLocalProvider(
-                LocalDensity provides NoOpDensity
-            ) {
+            seeMoreOrCollapse =
+                FlowColumnOverflow.expandOrCollapseIndicator(
+                    expandIndicator = { Box(Modifier.size(20.dp)) },
+                    collapseIndicator = { Box(Modifier.size(20.dp)) {} },
+                )
+            CompositionLocalProvider(LocalDensity provides NoOpDensity) {
                 Box(Modifier.size(200.dp)) {
                     FlowColumn(
-                        Modifier
-                            .width(IntrinsicSize.Min)
-                            .onSizeChanged {
-                                width = it.width
-                                height = it.height
-                            },
+                        Modifier.width(IntrinsicSize.Min).onSizeChanged {
+                            width = it.width
+                            height = it.height
+                        },
                         verticalArrangement = Arrangement.spacedBy(spacedBy.dp, Alignment.Top),
                         horizontalArrangement = Arrangement.spacedBy(spacedBy.dp, Alignment.Start),
                         maxItemsInEachColumn = maxItemsInMainAxis,
@@ -5831,13 +4968,7 @@
                         overflow = overflow
                     ) {
                         repeat(6) { index ->
-                            Box(
-                                Modifier
-                                    .size(20.dp)
-                                    .onGloballyPositioned {
-                                        itemShown = index + 1
-                                    }
-                            )
+                            Box(Modifier.size(20.dp).onGloballyPositioned { itemShown = index + 1 })
                         }
                     }
                 }
@@ -5848,9 +4979,8 @@
             Truth.assertThat(height).isEqualTo(40)
             Truth.assertThat(width).isEqualTo(20)
             Truth.assertThat(itemShown).isEqualTo(2)
-            overflowState.value = FlowColumnOverflow.expandIndicator {
-                Box(Modifier.size(20.dp)) {}
-            }
+            overflowState.value =
+                FlowColumnOverflow.expandIndicator { Box(Modifier.size(20.dp)) {} }
         }
         advanceClock()
         rule.runOnIdle {
@@ -5893,19 +5023,11 @@
                 with(LocalDensity.current) {
                     Box(Modifier.size(200.toDp())) {
                         FlowRow(
-                            Modifier
-                                .width(IntrinsicSize.Min)
+                            Modifier.width(IntrinsicSize.Min)
                                 .height(IntrinsicSize.Max)
-                                .onSizeChanged {
-                                    height = it.height
-                                },
+                                .onSizeChanged { height = it.height },
                         ) {
-                            repeat(5) {
-                                Box(
-                                    Modifier
-                                        .size(20.toDp())
-                                )
-                            }
+                            repeat(5) { Box(Modifier.size(20.toDp())) }
                         }
                     }
                 }
@@ -5930,22 +5052,18 @@
             var overflow by remember { overflowState }
             var maxItemsInMainAxis by remember { maxItemsInMainAxisState }
             var spacedBy by remember { spacingState }
-            seeMoreOrCollapse = FlowRowOverflow.expandOrCollapseIndicator(
-                expandIndicator = { Box(Modifier.size(20.dp)) },
-                collapseIndicator = { Box(Modifier.size(20.dp)) {} },
-            )
-            CompositionLocalProvider(
-                LocalDensity provides NoOpDensity
-            ) {
+            seeMoreOrCollapse =
+                FlowRowOverflow.expandOrCollapseIndicator(
+                    expandIndicator = { Box(Modifier.size(20.dp)) },
+                    collapseIndicator = { Box(Modifier.size(20.dp)) {} },
+                )
+            CompositionLocalProvider(LocalDensity provides NoOpDensity) {
                 Box(Modifier.size(200.dp)) {
                     FlowRow(
-                        Modifier
-                            .width(IntrinsicSize.Min)
-                            .height(IntrinsicSize.Max)
-                            .onSizeChanged {
-                                height = it.height
-                                width = it.width
-                            },
+                        Modifier.width(IntrinsicSize.Min).height(IntrinsicSize.Max).onSizeChanged {
+                            height = it.height
+                            width = it.width
+                        },
                         horizontalArrangement = Arrangement.spacedBy(spacedBy.dp, Alignment.Start),
                         verticalArrangement = Arrangement.spacedBy(spacedBy.dp, Alignment.Top),
                         maxItemsInEachRow = maxItemsInMainAxis,
@@ -5953,13 +5071,7 @@
                         overflow = overflow
                     ) {
                         repeat(6) { index ->
-                            Box(
-                                Modifier
-                                    .size(20.dp)
-                                    .onPlaced {
-                                        itemShown = index + 1
-                                    }
-                            )
+                            Box(Modifier.size(20.dp).onPlaced { itemShown = index + 1 })
                         }
                     }
                 }
@@ -5970,9 +5082,7 @@
             Truth.assertThat(width).isEqualTo(40)
             Truth.assertThat(height).isEqualTo(20)
             Truth.assertThat(itemShown).isEqualTo(2)
-            overflowState.value = FlowRowOverflow.expandIndicator {
-                Box(Modifier.size(20.dp)) {}
-            }
+            overflowState.value = FlowRowOverflow.expandIndicator { Box(Modifier.size(20.dp)) {} }
         }
         advanceClock()
         rule.runOnIdle {
@@ -6020,22 +5130,18 @@
             var overflow by remember { overflowState }
             var maxItemsInMainAxis by remember { maxItemsInMainAxisState }
             var spacedBy by remember { spacingState }
-            seeMoreOrCollapse = FlowColumnOverflow.expandOrCollapseIndicator(
-                expandIndicator = { Box(Modifier.size(20.dp)) },
-                collapseIndicator = { Box(Modifier.size(20.dp)) {} },
-            )
-            CompositionLocalProvider(
-                LocalDensity provides NoOpDensity
-            ) {
+            seeMoreOrCollapse =
+                FlowColumnOverflow.expandOrCollapseIndicator(
+                    expandIndicator = { Box(Modifier.size(20.dp)) },
+                    collapseIndicator = { Box(Modifier.size(20.dp)) {} },
+                )
+            CompositionLocalProvider(LocalDensity provides NoOpDensity) {
                 Box(Modifier.size(200.dp)) {
                     FlowColumn(
-                        Modifier
-                            .height(IntrinsicSize.Min)
-                            .width(IntrinsicSize.Max)
-                            .onSizeChanged {
-                                width = it.width
-                                height = it.height
-                            },
+                        Modifier.height(IntrinsicSize.Min).width(IntrinsicSize.Max).onSizeChanged {
+                            width = it.width
+                            height = it.height
+                        },
                         verticalArrangement = Arrangement.spacedBy(spacedBy.dp, Alignment.Top),
                         horizontalArrangement = Arrangement.spacedBy(spacedBy.dp, Alignment.Start),
                         maxItemsInEachColumn = maxItemsInMainAxis,
@@ -6043,13 +5149,7 @@
                         overflow = overflow
                     ) {
                         repeat(6) { index ->
-                            Box(
-                                Modifier
-                                    .size(20.dp)
-                                    .onPlaced {
-                                        itemShown = index + 1
-                                    }
-                            )
+                            Box(Modifier.size(20.dp).onPlaced { itemShown = index + 1 })
                         }
                     }
                 }
@@ -6060,9 +5160,8 @@
             Truth.assertThat(height).isEqualTo(40)
             Truth.assertThat(width).isEqualTo(20)
             Truth.assertThat(itemShown).isEqualTo(2)
-            overflowState.value = FlowColumnOverflow.expandIndicator {
-                Box(Modifier.size(20.dp)) {}
-            }
+            overflowState.value =
+                FlowColumnOverflow.expandIndicator { Box(Modifier.size(20.dp)) {} }
         }
         advanceClock()
         rule.runOnIdle {
@@ -6105,20 +5204,12 @@
                 with(LocalDensity.current) {
                     Box(Modifier.size(200.toDp())) {
                         FlowRow(
-                            Modifier
-                                .width(IntrinsicSize.Min)
+                            Modifier.width(IntrinsicSize.Min)
                                 .height(IntrinsicSize.Max)
-                                .onSizeChanged {
-                                    height = it.height
-                                },
+                                .onSizeChanged { height = it.height },
                             verticalArrangement = Arrangement.spacedBy(20.toDp()),
                         ) {
-                            repeat(5) {
-                                Box(
-                                    Modifier
-                                        .size(20.toDp())
-                                )
-                            }
+                            repeat(5) { Box(Modifier.size(20.toDp())) }
                         }
                     }
                 }
@@ -6138,20 +5229,11 @@
                 with(LocalDensity.current) {
                     Box(Modifier.size(200.toDp())) {
                         FlowRow(
-                            Modifier
-                                .height(IntrinsicSize.Min)
-                                .onSizeChanged {
-                                    height = it.height
-                                },
+                            Modifier.height(IntrinsicSize.Min).onSizeChanged { height = it.height },
                             verticalArrangement = Arrangement.spacedBy(20.toDp()),
                             maxItemsInEachRow = 1
                         ) {
-                            repeat(2) {
-                                Box(
-                                    Modifier
-                                        .size(20.toDp())
-                                )
-                            }
+                            repeat(2) { Box(Modifier.size(20.toDp())) }
                         }
                     }
                 }
@@ -6171,19 +5253,10 @@
                 with(LocalDensity.current) {
                     Box(Modifier.size(200.toDp())) {
                         FlowRow(
-                            Modifier
-                                .height(IntrinsicSize.Min)
-                                .onSizeChanged {
-                                    height = it.height
-                                },
+                            Modifier.height(IntrinsicSize.Min).onSizeChanged { height = it.height },
                             verticalArrangement = Arrangement.spacedBy(20.toDp()),
                         ) {
-                            repeat(2) {
-                                Box(
-                                    Modifier
-                                        .size(20.toDp())
-                                )
-                            }
+                            repeat(2) { Box(Modifier.size(20.toDp())) }
                         }
                     }
                 }
@@ -6203,19 +5276,10 @@
                 with(LocalDensity.current) {
                     Box(Modifier.size(200.toDp())) {
                         FlowColumn(
-                            Modifier
-                                .height(IntrinsicSize.Min)
-                                .onSizeChanged {
-                                    height = it.height
-                                },
+                            Modifier.height(IntrinsicSize.Min).onSizeChanged { height = it.height },
                             maxItemsInEachColumn = 5
                         ) {
-                            repeat(6) {
-                                Box(
-                                    Modifier
-                                        .size(20.toDp())
-                                )
-                            }
+                            repeat(6) { Box(Modifier.size(20.toDp())) }
                         }
                     }
                 }
@@ -6235,20 +5299,11 @@
                 with(LocalDensity.current) {
                     Box(Modifier.size(200.toDp())) {
                         FlowColumn(
-                            Modifier
-                                .height(IntrinsicSize.Max)
-                                .onSizeChanged {
-                                    height = it.height
-                                },
+                            Modifier.height(IntrinsicSize.Max).onSizeChanged { height = it.height },
                             maxItemsInEachColumn = 5,
                             horizontalArrangement = Arrangement.spacedBy(20.toDp()),
                         ) {
-                            repeat(5) {
-                                Box(
-                                    Modifier
-                                        .size(20.toDp())
-                                )
-                            }
+                            repeat(5) { Box(Modifier.size(20.toDp())) }
                         }
                     }
                 }
@@ -6268,20 +5323,11 @@
                 with(LocalDensity.current) {
                     Box(Modifier.size(200.toDp())) {
                         FlowColumn(
-                            Modifier
-                                .height(IntrinsicSize.Max)
-                                .onSizeChanged {
-                                    height = it.height
-                                },
+                            Modifier.height(IntrinsicSize.Max).onSizeChanged { height = it.height },
                             maxItemsInEachColumn = 5,
                             verticalArrangement = Arrangement.spacedBy(20.toDp()),
                         ) {
-                            repeat(5) {
-                                Box(
-                                    Modifier
-                                        .size(20.toDp())
-                                )
-                            }
+                            repeat(5) { Box(Modifier.size(20.toDp())) }
                         }
                     }
                 }
@@ -6296,28 +5342,22 @@
         var width = 0
         var noOfItemsPlaced = 0
         rule.setContent {
-            CompositionLocalProvider(
-                LocalDensity provides NoOpDensity
-            ) {
+            CompositionLocalProvider(LocalDensity provides NoOpDensity) {
                 Box(Modifier.size(200.dp)) {
                     FlowRow(
-                        Modifier
-                            .fillMaxWidth(1f)
-                            .onSizeChanged {
-                                width = it.width
-                            },
+                        Modifier.fillMaxWidth(1f).onSizeChanged { width = it.width },
                         verticalArrangement = Arrangement.spacedBy(20.dp),
                         overflow = FlowRowOverflow.Clip
                     ) {
                         repeat(2) { index ->
                             Layout(
-                                modifier = Modifier
-                                    .requiredSize(250.dp)
-                                    .onPlaced {
+                                modifier =
+                                    Modifier.requiredSize(250.dp).onPlaced {
                                         noOfItemsPlaced = index + 1
                                     }
                             ) { _, _ ->
-                                layout(250, 250) {} }
+                                layout(250, 250) {}
+                            }
                         }
                     }
                 }
@@ -6333,7 +5373,7 @@
         val maxItemsInMainAxis = 5
         val maxLinesState = mutableStateOf(2)
 
-        var overflow = mutableStateOf(FlowRowOverflow.expandIndicator { })
+        var overflow = mutableStateOf(FlowRowOverflow.expandIndicator {})
         var seeMoreOrCollapse: FlowRowOverflow? = null
         var seeMoreTwo: FlowRowOverflow? = null
         var measurePolicy: MultiContentMeasurePolicy? = null
@@ -6342,25 +5382,30 @@
             previousMeasurePolicy = measurePolicy
             val minLinesToShowCollapseState = 1
             val minHeightToShowCollapseState = 0.dp
-            seeMoreOrCollapse = FlowRowOverflow.expandOrCollapseIndicator(
-                {},
-                {},
-                minLinesToShowCollapseState,
-                minHeightToShowCollapseState)
-            seeMoreTwo = FlowRowOverflow.expandOrCollapseIndicator(
-                {},
-                {},
-                minLinesToShowCollapseState,
-                minHeightToShowCollapseState)
+            seeMoreOrCollapse =
+                FlowRowOverflow.expandOrCollapseIndicator(
+                    {},
+                    {},
+                    minLinesToShowCollapseState,
+                    minHeightToShowCollapseState
+                )
+            seeMoreTwo =
+                FlowRowOverflow.expandOrCollapseIndicator(
+                    {},
+                    {},
+                    minLinesToShowCollapseState,
+                    minHeightToShowCollapseState
+                )
             var overflowState = remember(overflow.value) { overflow.value.createOverflowState() }
             var maxLines by remember { maxLinesState }
-            measurePolicy = rowMeasurementMultiContentHelper(
-                verticalArrangement = Arrangement.Top,
-                horizontalArrangement = Arrangement.Start,
-                maxItemsInMainAxis = maxItemsInMainAxis,
-                maxLines = maxLines,
-                overflowState = overflowState
-            )
+            measurePolicy =
+                rowMeasurementMultiContentHelper(
+                    verticalArrangement = Arrangement.Top,
+                    horizontalArrangement = Arrangement.Start,
+                    maxItemsInMainAxis = maxItemsInMainAxis,
+                    maxLines = maxLines,
+                    overflowState = overflowState
+                )
         }
 
         rule.runOnIdle {
@@ -6385,21 +5430,23 @@
         var measurePolicy: MultiContentMeasurePolicy? = null
         var previousMeasurePolicy: MultiContentMeasurePolicy? = null
         rule.setContent {
-            previousMeasurePolicy = rowMeasurementMultiContentHelper(
-                verticalArrangement = Arrangement.Top,
-                horizontalArrangement = Arrangement.Start,
-                maxItemsInMainAxis = maxItemsInMainAxis,
-                maxLines = maxLines,
-                overflowState = FlowRowOverflow.expandIndicator {}.createOverflowState()
-            )
+            previousMeasurePolicy =
+                rowMeasurementMultiContentHelper(
+                    verticalArrangement = Arrangement.Top,
+                    horizontalArrangement = Arrangement.Start,
+                    maxItemsInMainAxis = maxItemsInMainAxis,
+                    maxLines = maxLines,
+                    overflowState = FlowRowOverflow.expandIndicator {}.createOverflowState()
+                )
 
-            measurePolicy = rowMeasurementMultiContentHelper(
-                verticalArrangement = Arrangement.Top,
-                horizontalArrangement = Arrangement.Start,
-                maxItemsInMainAxis = maxItemsInMainAxis,
-                maxLines = maxLines,
-                overflowState = FlowRowOverflow.expandIndicator {}.createOverflowState()
-            )
+            measurePolicy =
+                rowMeasurementMultiContentHelper(
+                    verticalArrangement = Arrangement.Top,
+                    horizontalArrangement = Arrangement.Start,
+                    maxItemsInMainAxis = maxItemsInMainAxis,
+                    maxLines = maxLines,
+                    overflowState = FlowRowOverflow.expandIndicator {}.createOverflowState()
+                )
         }
 
         rule.waitForIdle()
@@ -6421,27 +5468,30 @@
             previousMeasurePolicy = measurePolicy
             val minLinesToShowCollapseState = 1
             val minWidthToShowCollapseState = 0.dp
-            seeMoreOrCollapse = FlowColumnOverflow.expandOrCollapseIndicator(
-                {},
-                {},
-                minLinesToShowCollapseState,
-                minWidthToShowCollapseState
-            )
-            seeMoreTwo = FlowColumnOverflow.expandOrCollapseIndicator(
-                {},
-                {},
-                minLinesToShowCollapseState,
-                minWidthToShowCollapseState
-            )
+            seeMoreOrCollapse =
+                FlowColumnOverflow.expandOrCollapseIndicator(
+                    {},
+                    {},
+                    minLinesToShowCollapseState,
+                    minWidthToShowCollapseState
+                )
+            seeMoreTwo =
+                FlowColumnOverflow.expandOrCollapseIndicator(
+                    {},
+                    {},
+                    minLinesToShowCollapseState,
+                    minWidthToShowCollapseState
+                )
             var overflowState = remember(overflow.value) { overflow.value.createOverflowState() }
             var maxLines by remember { maxLinesState }
-            measurePolicy = columnMeasurementMultiContentHelper(
-                verticalArrangement = Arrangement.Top,
-                horizontalArrangement = Arrangement.Start,
-                maxItemsInMainAxis = maxItemsInMainAxis,
-                maxLines = maxLines,
-                overflowState = overflowState
-            )
+            measurePolicy =
+                columnMeasurementMultiContentHelper(
+                    verticalArrangement = Arrangement.Top,
+                    horizontalArrangement = Arrangement.Start,
+                    maxItemsInMainAxis = maxItemsInMainAxis,
+                    maxLines = maxLines,
+                    overflowState = overflowState
+                )
         }
 
         rule.runOnIdle {
@@ -6463,28 +5513,22 @@
         var height = 0
         var noOfItemsPlaced = 0
         rule.setContent {
-            CompositionLocalProvider(
-                LocalDensity provides NoOpDensity
-            ) {
+            CompositionLocalProvider(LocalDensity provides NoOpDensity) {
                 Box(Modifier.size(200.dp)) {
                     FlowColumn(
-                        Modifier
-                            .fillMaxHeight(1f)
-                            .onSizeChanged {
-                                height = it.height
-                            },
+                        Modifier.fillMaxHeight(1f).onSizeChanged { height = it.height },
                         horizontalArrangement = Arrangement.spacedBy(20.dp),
                         overflow = FlowColumnOverflow.Clip
                     ) {
                         repeat(2) { index ->
                             Layout(
-                                modifier = Modifier
-                                    .requiredSize(250.dp)
-                                    .onPlaced {
+                                modifier =
+                                    Modifier.requiredSize(250.dp).onPlaced {
                                         noOfItemsPlaced = index + 1
                                     }
                             ) { _, _ ->
-                                layout(250, 250) {} }
+                                layout(250, 250) {}
+                            }
                         }
                     }
                 }
@@ -6496,7 +5540,8 @@
     }
 }
 
-internal val NoOpDensity = object : Density {
-    override val density = 1f
-    override val fontScale = 1f
-}
+internal val NoOpDensity =
+    object : Density {
+        override val density = 1f
+        override val fontScale = 1f
+    }
diff --git a/compose/foundation/foundation-layout/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/layout/IntrinsicTest.kt b/compose/foundation/foundation-layout/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/layout/IntrinsicTest.kt
index 09bf890..a6dadeb 100644
--- a/compose/foundation/foundation-layout/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/layout/IntrinsicTest.kt
+++ b/compose/foundation/foundation-layout/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/layout/IntrinsicTest.kt
@@ -49,587 +49,750 @@
 @RunWith(AndroidJUnit4::class)
 class IntrinsicTest : LayoutTest() {
     @Test
-    fun testMaxIntrinsic_HandleNegative() = with(density) {
-        val positionedLatch = CountDownLatch(2)
-        val size = Ref<IntSize>()
-        val position = Ref<Offset>()
-        val sizeTwo = Ref<IntSize>()
-        val positionTwo = Ref<Offset>()
-        val measurePolicy = object : MeasurePolicy {
-            override fun MeasureScope.measure(
-                measurables: List<Measurable>,
-                constraints: Constraints
-            ): MeasureResult {
-                return layout(0, 0) {}
-            }
-
-            override fun IntrinsicMeasureScope.minIntrinsicHeight(
-                measurables: List<IntrinsicMeasurable>,
-                width: Int
-            ): Int {
-                return -1
-            }
-
-            override fun IntrinsicMeasureScope.minIntrinsicWidth(
-                measurables: List<IntrinsicMeasurable>,
-                height: Int
-            ): Int {
-                return -1
-            }
-
-            override fun IntrinsicMeasureScope.maxIntrinsicHeight(
-                measurables: List<IntrinsicMeasurable>,
-                width: Int
-            ): Int {
-                return -1
-            }
-
-            override fun IntrinsicMeasureScope.maxIntrinsicWidth(
-                measurables: List<IntrinsicMeasurable>,
-                height: Int
-            ): Int {
-                return -1
-            }
-        }
-        show {
-            Column {
-                Layout(modifier = Modifier
-                    .width(IntrinsicSize.Min)
-                    .height(IntrinsicSize.Min)
-                    .saveLayoutInfo(
-                        size = size,
-                        position = position,
-                        positionedLatch = positionedLatch
-                    ), measurePolicy = measurePolicy)
-                Layout(modifier = Modifier
-                    .width(IntrinsicSize.Max)
-                    .height(IntrinsicSize.Max)
-                    .saveLayoutInfo(
-                        size = sizeTwo,
-                        position = positionTwo,
-                        positionedLatch = positionedLatch
-                    ), measurePolicy = measurePolicy)
-            }
-        }
-        assertTrue(positionedLatch.await(1, TimeUnit.SECONDS))
-        assertEquals(IntSize(0.dp.roundToPx(), 0.dp.roundToPx()), size.value)
-        assertEquals(IntSize(0.dp.roundToPx(), 0.dp.roundToPx()), sizeTwo.value)
-        assertEquals(Offset(0f, 0f), position.value)
-        assertEquals(Offset(0f, 0f), positionTwo.value)
-    }
-
-    @Test
-    fun testMinIntrinsicWidth() = with(density) {
-        val positionedLatch = CountDownLatch(2)
-        val minIntrinsicWidthSize = Ref<IntSize>()
-        val childSize = Ref<IntSize>()
-        val childPosition = Ref<Offset>()
-        show {
-            Box {
-                FixedIntrinsicsBox(
-                    Modifier.width(IntrinsicSize.Min).onGloballyPositioned {
-                        minIntrinsicWidthSize.value = it.size
-                        positionedLatch.countDown()
+    fun testMaxIntrinsic_HandleNegative() =
+        with(density) {
+            val positionedLatch = CountDownLatch(2)
+            val size = Ref<IntSize>()
+            val position = Ref<Offset>()
+            val sizeTwo = Ref<IntSize>()
+            val positionTwo = Ref<Offset>()
+            val measurePolicy =
+                object : MeasurePolicy {
+                    override fun MeasureScope.measure(
+                        measurables: List<Measurable>,
+                        constraints: Constraints
+                    ): MeasureResult {
+                        return layout(0, 0) {}
                     }
-                        .saveLayoutInfo(
-                            size = childSize,
-                            position = childPosition,
-                            positionedLatch = positionedLatch
-                        ),
-                    10.dp, 20.dp, 30.dp, 40.dp, 50.dp, 60.dp
-                )
-            }
-        }
-        assertTrue(positionedLatch.await(1, TimeUnit.SECONDS))
 
-        assertEquals(IntSize(10.dp.roundToPx(), 50.dp.roundToPx()), minIntrinsicWidthSize.value)
-        assertEquals(IntSize(10.dp.roundToPx(), 50.dp.roundToPx()), childSize.value)
-        assertEquals(Offset(0f, 0f), childPosition.value)
-    }
-
-    @Test
-    fun testMinIntrinsicHeight() = with(density) {
-        val positionedLatch = CountDownLatch(2)
-        val minIntrinsicHeightSize = Ref<IntSize>()
-        val childSize = Ref<IntSize>()
-        val childPosition = Ref<Offset>()
-        show {
-            Box {
-                FixedIntrinsicsBox(
-                    Modifier.height(IntrinsicSize.Min).onGloballyPositioned {
-                        minIntrinsicHeightSize.value = it.size
-                        positionedLatch.countDown()
-                    }.saveLayoutInfo(
-                        size = childSize,
-                        position = childPosition,
-                        positionedLatch = positionedLatch
-                    ),
-                    10.dp, 20.dp, 30.dp, 40.dp, 50.dp, 60.dp
-                )
-            }
-        }
-        assertTrue(positionedLatch.await(1, TimeUnit.SECONDS))
-
-        assertEquals(IntSize(20.dp.roundToPx(), 40.dp.roundToPx()), minIntrinsicHeightSize.value)
-        assertEquals(IntSize(20.dp.roundToPx(), 40.dp.roundToPx()), childSize.value)
-        assertEquals(Offset(0f, 0f), childPosition.value)
-    }
-
-    @Test
-    fun testMaxIntrinsicWidth() = with(density) {
-        val positionedLatch = CountDownLatch(2)
-        val maxIntrinsicWidthSize = Ref<IntSize>()
-        val childSize = Ref<IntSize>()
-        val childPosition = Ref<Offset>()
-        show {
-            Box {
-                FixedIntrinsicsBox(
-                    Modifier.width(IntrinsicSize.Max).onGloballyPositioned {
-                        maxIntrinsicWidthSize.value = it.size
-                        positionedLatch.countDown()
-                    }.saveLayoutInfo(
-                        size = childSize,
-                        position = childPosition,
-                        positionedLatch = positionedLatch
-                    ),
-                    10.dp, 20.dp, 30.dp, 40.dp, 50.dp, 60.dp
-                )
-            }
-        }
-        assertTrue(positionedLatch.await(1, TimeUnit.SECONDS))
-
-        assertEquals(IntSize(30.dp.roundToPx(), 50.dp.roundToPx()), maxIntrinsicWidthSize.value)
-        assertEquals(IntSize(30.dp.roundToPx(), 50.dp.roundToPx()), childSize.value)
-        assertEquals(Offset(0f, 0f), childPosition.value)
-    }
-
-    @Test
-    fun testMaxIntrinsicHeight() = with(density) {
-        val positionedLatch = CountDownLatch(2)
-        val maxIntrinsicHeightSize = Ref<IntSize>()
-        val childSize = Ref<IntSize>()
-        val childPosition = Ref<Offset>()
-        show {
-            Box {
-                FixedIntrinsicsBox(
-                    Modifier.height(IntrinsicSize.Max).onGloballyPositioned {
-                        maxIntrinsicHeightSize.value = it.size
-                        positionedLatch.countDown()
-                    }.saveLayoutInfo(
-                        size = childSize,
-                        position = childPosition,
-                        positionedLatch = positionedLatch
-                    ),
-                    10.dp, 20.dp, 30.dp, 40.dp, 50.dp, 60.dp
-                )
-            }
-        }
-        assertTrue(positionedLatch.await(1, TimeUnit.SECONDS))
-
-        assertEquals(IntSize(20.dp.roundToPx(), 60.dp.roundToPx()), maxIntrinsicHeightSize.value)
-        assertEquals(IntSize(20.dp.roundToPx(), 60.dp.roundToPx()), childSize.value)
-        assertEquals(Offset(0f, 0f), childPosition.value)
-    }
-
-    @Test
-    fun testMinIntrinsicWidth_respectsIncomingMaxConstraints() = with(density) {
-        val positionedLatch = CountDownLatch(2)
-        val minIntrinsicWidthSize = Ref<IntSize>()
-        val childSize = Ref<IntSize>()
-        val childPosition = Ref<Offset>()
-        show {
-            Box {
-                ConstrainedBox(DpConstraints(maxWidth = 5.dp)) {
-                    FixedIntrinsicsBox(
-                        Modifier.width(IntrinsicSize.Min).onGloballyPositioned {
-                            minIntrinsicWidthSize.value = it.size
-                            positionedLatch.countDown()
-                        }.saveLayoutInfo(
-                            size = childSize,
-                            position = childPosition,
-                            positionedLatch = positionedLatch
-                        ),
-                        10.dp, 20.dp, 30.dp, 40.dp, 50.dp, 60.dp
-                    )
-                }
-            }
-        }
-        assertTrue(positionedLatch.await(1, TimeUnit.SECONDS))
-
-        assertEquals(IntSize(5.dp.roundToPx(), 50.dp.roundToPx()), minIntrinsicWidthSize.value)
-        assertEquals(IntSize(5.dp.roundToPx(), 50.dp.roundToPx()), childSize.value)
-        assertEquals(Offset(0f, 0f), childPosition.value)
-    }
-
-    @Test
-    fun testMinIntrinsicWidth_respectsIncomingMinConstraints() = with(density) {
-        val positionedLatch = CountDownLatch(2)
-        val minIntrinsicWidthSize = Ref<IntSize>()
-        val childSize = Ref<IntSize>()
-        val childPosition = Ref<Offset>()
-        show {
-            Box {
-                ConstrainedBox(DpConstraints(minWidth = 15.dp)) {
-                    FixedIntrinsicsBox(
-                        Modifier.width(IntrinsicSize.Min).onGloballyPositioned {
-                            minIntrinsicWidthSize.value = it.size
-                            positionedLatch.countDown()
-                        }.saveLayoutInfo(
-                            size = childSize,
-                            position = childPosition,
-                            positionedLatch = positionedLatch
-                        ),
-                        10.dp, 20.dp, 30.dp, 40.dp, 50.dp, 60.dp
-                    )
-                }
-            }
-        }
-        assertTrue(positionedLatch.await(1, TimeUnit.SECONDS))
-
-        assertEquals(IntSize(15.dp.roundToPx(), 50.dp.roundToPx()), minIntrinsicWidthSize.value)
-        assertEquals(IntSize(15.dp.roundToPx(), 50.dp.roundToPx()), childSize.value)
-        assertEquals(Offset(0f, 0f), childPosition.value)
-    }
-
-    @Test
-    fun testMinIntrinsicHeight_respectsMaxIncomingConstraints() = with(density) {
-        val positionedLatch = CountDownLatch(2)
-        val minIntrinsicHeightSize = Ref<IntSize>()
-        val childSize = Ref<IntSize>()
-        val childPosition = Ref<Offset>()
-        show {
-            Box {
-                ConstrainedBox(
-                    DpConstraints(maxHeight = 35.dp),
-                    modifier = Modifier.onGloballyPositioned { coordinates: LayoutCoordinates ->
-                        minIntrinsicHeightSize.value = coordinates.size
-                        positionedLatch.countDown()
+                    override fun IntrinsicMeasureScope.minIntrinsicHeight(
+                        measurables: List<IntrinsicMeasurable>,
+                        width: Int
+                    ): Int {
+                        return -1
                     }
-                ) {
-                    FixedIntrinsicsBox(
-                        Modifier.height(IntrinsicSize.Min).saveLayoutInfo(
-                            size = childSize,
-                            position = childPosition,
-                            positionedLatch = positionedLatch
-                        ),
-                        10.dp, 20.dp, 30.dp, 40.dp, 50.dp, 60.dp
-                    )
-                }
-            }
-        }
-        assertTrue(positionedLatch.await(1, TimeUnit.SECONDS))
 
-        assertEquals(IntSize(20.dp.roundToPx(), 35.dp.roundToPx()), minIntrinsicHeightSize.value)
-        assertEquals(IntSize(20.dp.roundToPx(), 35.dp.roundToPx()), childSize.value)
-        assertEquals(Offset(0f, 0f), childPosition.value)
-    }
-
-    @Test
-    fun testMinIntrinsicHeight_respectsMinIncomingConstraints() = with(density) {
-        val positionedLatch = CountDownLatch(2)
-        val minIntrinsicHeightSize = Ref<IntSize>()
-        val childSize = Ref<IntSize>()
-        val childPosition = Ref<Offset>()
-        show {
-            Box {
-                ConstrainedBox(
-                    DpConstraints(minHeight = 45.dp),
-                    modifier = Modifier.onGloballyPositioned { coordinates: LayoutCoordinates ->
-                        minIntrinsicHeightSize.value = coordinates.size
-                        positionedLatch.countDown()
+                    override fun IntrinsicMeasureScope.minIntrinsicWidth(
+                        measurables: List<IntrinsicMeasurable>,
+                        height: Int
+                    ): Int {
+                        return -1
                     }
-                ) {
-                    FixedIntrinsicsBox(
-                        Modifier.height(IntrinsicSize.Min).saveLayoutInfo(
-                            size = childSize,
-                            position = childPosition,
-                            positionedLatch = positionedLatch
-                        ),
-                        10.dp, 20.dp, 30.dp, 40.dp, 50.dp, 60.dp
-                    )
-                }
-            }
-        }
-        assertTrue(positionedLatch.await(1, TimeUnit.SECONDS))
 
-        assertEquals(IntSize(20.dp.roundToPx(), 45.dp.roundToPx()), minIntrinsicHeightSize.value)
-        assertEquals(IntSize(20.dp.roundToPx(), 45.dp.roundToPx()), childSize.value)
-        assertEquals(Offset(0f, 0f), childPosition.value)
-    }
-
-    @Test
-    fun testMaxIntrinsicWidth_respectsMaxIncomingConstraints() = with(density) {
-        val positionedLatch = CountDownLatch(2)
-        val maxIntrinsicWidthSize = Ref<IntSize>()
-        val childSize = Ref<IntSize>()
-        val childPosition = Ref<Offset>()
-        show {
-            Box {
-                ConstrainedBox(
-                    DpConstraints(maxWidth = 25.dp),
-                    modifier = Modifier.onGloballyPositioned { coordinates: LayoutCoordinates ->
-                        maxIntrinsicWidthSize.value = coordinates.size
-                        positionedLatch.countDown()
+                    override fun IntrinsicMeasureScope.maxIntrinsicHeight(
+                        measurables: List<IntrinsicMeasurable>,
+                        width: Int
+                    ): Int {
+                        return -1
                     }
-                ) {
-                    FixedIntrinsicsBox(
-                        Modifier.width(IntrinsicSize.Max).saveLayoutInfo(
-                            size = childSize,
-                            position = childPosition,
-                            positionedLatch = positionedLatch
-                        ),
-                        10.dp, 20.dp, 30.dp, 40.dp, 50.dp, 60.dp
-                    )
-                }
-            }
-        }
-        assertTrue(positionedLatch.await(1, TimeUnit.SECONDS))
 
-        assertEquals(IntSize(25.dp.roundToPx(), 50.dp.roundToPx()), maxIntrinsicWidthSize.value)
-        assertEquals(IntSize(25.dp.roundToPx(), 50.dp.roundToPx()), childSize.value)
-        assertEquals(Offset(0f, 0f), childPosition.value)
-    }
-
-    @Test
-    fun testMaxIntrinsicWidth_respectsMinIncomingConstraints() = with(density) {
-        val positionedLatch = CountDownLatch(2)
-        val maxIntrinsicWidthSize = Ref<IntSize>()
-        val childSize = Ref<IntSize>()
-        val childPosition = Ref<Offset>()
-        show {
-            Box {
-                ConstrainedBox(
-                    DpConstraints(minWidth = 35.dp),
-                    modifier = Modifier.onGloballyPositioned { coordinates: LayoutCoordinates ->
-                        maxIntrinsicWidthSize.value = coordinates.size
-                        positionedLatch.countDown()
+                    override fun IntrinsicMeasureScope.maxIntrinsicWidth(
+                        measurables: List<IntrinsicMeasurable>,
+                        height: Int
+                    ): Int {
+                        return -1
                     }
-                ) {
-                    FixedIntrinsicsBox(
-                        Modifier.width(IntrinsicSize.Max).saveLayoutInfo(
-                            size = childSize,
-                            position = childPosition,
-                            positionedLatch = positionedLatch
-                        ),
-                        10.dp, 20.dp, 30.dp, 40.dp, 50.dp, 60.dp
+                }
+            show {
+                Column {
+                    Layout(
+                        modifier =
+                            Modifier.width(IntrinsicSize.Min)
+                                .height(IntrinsicSize.Min)
+                                .saveLayoutInfo(
+                                    size = size,
+                                    position = position,
+                                    positionedLatch = positionedLatch
+                                ),
+                        measurePolicy = measurePolicy
+                    )
+                    Layout(
+                        modifier =
+                            Modifier.width(IntrinsicSize.Max)
+                                .height(IntrinsicSize.Max)
+                                .saveLayoutInfo(
+                                    size = sizeTwo,
+                                    position = positionTwo,
+                                    positionedLatch = positionedLatch
+                                ),
+                        measurePolicy = measurePolicy
                     )
                 }
             }
+            assertTrue(positionedLatch.await(1, TimeUnit.SECONDS))
+            assertEquals(IntSize(0.dp.roundToPx(), 0.dp.roundToPx()), size.value)
+            assertEquals(IntSize(0.dp.roundToPx(), 0.dp.roundToPx()), sizeTwo.value)
+            assertEquals(Offset(0f, 0f), position.value)
+            assertEquals(Offset(0f, 0f), positionTwo.value)
         }
-        assertTrue(positionedLatch.await(1, TimeUnit.SECONDS))
-
-        assertEquals(IntSize(35.dp.roundToPx(), 50.dp.roundToPx()), maxIntrinsicWidthSize.value)
-        assertEquals(IntSize(35.dp.roundToPx(), 50.dp.roundToPx()), childSize.value)
-        assertEquals(Offset(0f, 0f), childPosition.value)
-    }
 
     @Test
-    fun testMaxIntrinsicHeight_respectsMaxIncomingConstraints() = with(density) {
-        val positionedLatch = CountDownLatch(2)
-        val maxIntrinsicHeightSize = Ref<IntSize>()
-        val childSize = Ref<IntSize>()
-        val childPosition = Ref<Offset>()
-        show {
-            Box {
-                ConstrainedBox(
-                    DpConstraints(maxHeight = 55.dp),
-                    modifier = Modifier.onGloballyPositioned { coordinates: LayoutCoordinates ->
-                        maxIntrinsicHeightSize.value = coordinates.size
-                        positionedLatch.countDown()
-                    }
-                ) {
+    fun testMinIntrinsicWidth() =
+        with(density) {
+            val positionedLatch = CountDownLatch(2)
+            val minIntrinsicWidthSize = Ref<IntSize>()
+            val childSize = Ref<IntSize>()
+            val childPosition = Ref<Offset>()
+            show {
+                Box {
                     FixedIntrinsicsBox(
-                        Modifier.height(IntrinsicSize.Max).saveLayoutInfo(
-                            size = childSize,
-                            position = childPosition,
-                            positionedLatch = positionedLatch
-                        ),
-                        10.dp, 20.dp, 30.dp, 40.dp, 50.dp, 60.dp
+                        Modifier.width(IntrinsicSize.Min)
+                            .onGloballyPositioned {
+                                minIntrinsicWidthSize.value = it.size
+                                positionedLatch.countDown()
+                            }
+                            .saveLayoutInfo(
+                                size = childSize,
+                                position = childPosition,
+                                positionedLatch = positionedLatch
+                            ),
+                        10.dp,
+                        20.dp,
+                        30.dp,
+                        40.dp,
+                        50.dp,
+                        60.dp
                     )
                 }
             }
-        }
-        assertTrue(positionedLatch.await(1, TimeUnit.SECONDS))
+            assertTrue(positionedLatch.await(1, TimeUnit.SECONDS))
 
-        assertEquals(IntSize(20.dp.roundToPx(), 55.dp.roundToPx()), maxIntrinsicHeightSize.value)
-        assertEquals(IntSize(20.dp.roundToPx(), 55.dp.roundToPx()), childSize.value)
-        assertEquals(Offset(0f, 0f), childPosition.value)
-    }
+            assertEquals(IntSize(10.dp.roundToPx(), 50.dp.roundToPx()), minIntrinsicWidthSize.value)
+            assertEquals(IntSize(10.dp.roundToPx(), 50.dp.roundToPx()), childSize.value)
+            assertEquals(Offset(0f, 0f), childPosition.value)
+        }
 
     @Test
-    fun testMaxIntrinsicHeight_respectsMinIncomingConstraints() = with(density) {
-        val positionedLatch = CountDownLatch(2)
-        val maxIntrinsicHeightSize = Ref<IntSize>()
-        val childSize = Ref<IntSize>()
-        val childPosition = Ref<Offset>()
-        show {
-            Box {
-                ConstrainedBox(
-                    DpConstraints(minHeight = 65.dp),
-                    modifier = Modifier.onGloballyPositioned { coordinates: LayoutCoordinates ->
-                        maxIntrinsicHeightSize.value = coordinates.size
-                        positionedLatch.countDown()
-                    }
-                ) {
+    fun testMinIntrinsicHeight() =
+        with(density) {
+            val positionedLatch = CountDownLatch(2)
+            val minIntrinsicHeightSize = Ref<IntSize>()
+            val childSize = Ref<IntSize>()
+            val childPosition = Ref<Offset>()
+            show {
+                Box {
                     FixedIntrinsicsBox(
-                        Modifier.height(IntrinsicSize.Max).saveLayoutInfo(
-                            size = childSize,
-                            position = childPosition,
-                            positionedLatch = positionedLatch
-                        ),
-                        10.dp, 20.dp, 30.dp, 40.dp, 50.dp, 60.dp
+                        Modifier.height(IntrinsicSize.Min)
+                            .onGloballyPositioned {
+                                minIntrinsicHeightSize.value = it.size
+                                positionedLatch.countDown()
+                            }
+                            .saveLayoutInfo(
+                                size = childSize,
+                                position = childPosition,
+                                positionedLatch = positionedLatch
+                            ),
+                        10.dp,
+                        20.dp,
+                        30.dp,
+                        40.dp,
+                        50.dp,
+                        60.dp
                     )
                 }
             }
-        }
-        assertTrue(positionedLatch.await(1, TimeUnit.SECONDS))
+            assertTrue(positionedLatch.await(1, TimeUnit.SECONDS))
 
-        assertEquals(IntSize(20.dp.roundToPx(), 65.dp.roundToPx()), maxIntrinsicHeightSize.value)
-        assertEquals(IntSize(20.dp.roundToPx(), 65.dp.roundToPx()), childSize.value)
-        assertEquals(Offset(0f, 0f), childPosition.value)
-    }
-
-    @Test
-    fun testRequiredMinIntrinsicWidth() = with(density) {
-        val countDownLatch = CountDownLatch(1)
-        show {
-            Box {
-                ConstrainedBox(
-                    DpConstraints.fixed(100.dp, 100.dp)
-                ) {
-                    FixedIntrinsicsBox(
-                        Modifier.requiredWidth(IntrinsicSize.Min).onSizeChanged {
-                            assertEquals(IntSize(10.dp.roundToPx(), 50.dp.roundToPx()), it)
-                            countDownLatch.countDown()
-                        },
-                        10.dp, 20.dp, 30.dp, 40.dp, 50.dp, 60.dp
-                    )
-                }
-            }
-        }
-        assertTrue(countDownLatch.await(1, TimeUnit.SECONDS))
-    }
-
-    @Test
-    fun testRequiredMinIntrinsicHeight() = with(density) {
-        val countDownLatch = CountDownLatch(1)
-        show {
-            Box {
-                ConstrainedBox(
-                    DpConstraints.fixed(100.dp, 100.dp)
-                ) {
-                    FixedIntrinsicsBox(
-                        Modifier.requiredHeight(IntrinsicSize.Min).onSizeChanged {
-                            assertEquals(IntSize(20.dp.roundToPx(), 40.dp.roundToPx()), it)
-                            countDownLatch.countDown()
-                        },
-                        10.dp, 20.dp, 30.dp, 40.dp, 50.dp, 60.dp
-                    )
-                }
-            }
-        }
-        assertTrue(countDownLatch.await(1, TimeUnit.SECONDS))
-    }
-
-    @Test
-    fun testRequiredMaxIntrinsicWidth() = with(density) {
-        val countDownLatch = CountDownLatch(1)
-        show {
-            Box {
-                ConstrainedBox(
-                    DpConstraints.fixed(100.dp, 100.dp)
-                ) {
-                    FixedIntrinsicsBox(
-                        Modifier.requiredWidth(IntrinsicSize.Max).onSizeChanged {
-                            assertEquals(IntSize(30.dp.roundToPx(), 50.dp.roundToPx()), it)
-                            countDownLatch.countDown()
-                        },
-                        10.dp, 20.dp, 30.dp, 40.dp, 50.dp, 60.dp
-                    )
-                }
-            }
-        }
-        assertTrue(countDownLatch.await(1, TimeUnit.SECONDS))
-    }
-
-    @Test
-    fun testRequiredMaxIntrinsicHeight() = with(density) {
-        val countDownLatch = CountDownLatch(1)
-        show {
-            Box {
-                ConstrainedBox(
-                    DpConstraints.fixed(100.dp, 100.dp)
-                ) {
-                    FixedIntrinsicsBox(
-                        Modifier.requiredHeight(IntrinsicSize.Max).onSizeChanged {
-                            assertEquals(IntSize(20.dp.roundToPx(), 60.dp.roundToPx()), it)
-                            countDownLatch.countDown()
-                        },
-                        10.dp, 20.dp, 30.dp, 40.dp, 50.dp, 60.dp
-                    )
-                }
-            }
-        }
-        assertTrue(countDownLatch.await(1, TimeUnit.SECONDS))
-    }
-
-    @Test
-    fun testMinIntrinsicWidth_intrinsicMeasurements() = with(density) {
-        testIntrinsics({
-            FixedIntrinsicsBox(
-                Modifier.width(IntrinsicSize.Min), 10.dp, 20.dp, 30.dp, 40.dp, 50.dp, 60.dp
+            assertEquals(
+                IntSize(20.dp.roundToPx(), 40.dp.roundToPx()),
+                minIntrinsicHeightSize.value
             )
-        }) { minIntrinsicWidth, minIntrinsicHeight, maxIntrinsicWidth, maxIntrinsicHeight ->
-            assertEquals(10.dp.roundToPx(), minIntrinsicWidth(0))
-            assertEquals(40.dp.roundToPx(), minIntrinsicHeight(0))
-            assertEquals(10.dp.roundToPx(), maxIntrinsicWidth(0))
-            assertEquals(60.dp.roundToPx(), maxIntrinsicHeight(0))
+            assertEquals(IntSize(20.dp.roundToPx(), 40.dp.roundToPx()), childSize.value)
+            assertEquals(Offset(0f, 0f), childPosition.value)
         }
-    }
 
     @Test
-    fun testMinIntrinsicHeight_intrinsicMeasurements() = with(density) {
-        testIntrinsics({
-            FixedIntrinsicsBox(
-                Modifier.height(IntrinsicSize.Min),
-                10.dp, 20.dp, 30.dp, 40.dp, 50.dp, 60.dp
-            )
-        }) { minIntrinsicWidth, minIntrinsicHeight, maxIntrinsicWidth, maxIntrinsicHeight ->
-            assertEquals(10.dp.roundToPx(), minIntrinsicWidth(0))
-            assertEquals(40.dp.roundToPx(), minIntrinsicHeight(0))
-            assertEquals(30.dp.roundToPx(), maxIntrinsicWidth(0))
-            assertEquals(40.dp.roundToPx(), maxIntrinsicHeight(0))
+    fun testMaxIntrinsicWidth() =
+        with(density) {
+            val positionedLatch = CountDownLatch(2)
+            val maxIntrinsicWidthSize = Ref<IntSize>()
+            val childSize = Ref<IntSize>()
+            val childPosition = Ref<Offset>()
+            show {
+                Box {
+                    FixedIntrinsicsBox(
+                        Modifier.width(IntrinsicSize.Max)
+                            .onGloballyPositioned {
+                                maxIntrinsicWidthSize.value = it.size
+                                positionedLatch.countDown()
+                            }
+                            .saveLayoutInfo(
+                                size = childSize,
+                                position = childPosition,
+                                positionedLatch = positionedLatch
+                            ),
+                        10.dp,
+                        20.dp,
+                        30.dp,
+                        40.dp,
+                        50.dp,
+                        60.dp
+                    )
+                }
+            }
+            assertTrue(positionedLatch.await(1, TimeUnit.SECONDS))
+
+            assertEquals(IntSize(30.dp.roundToPx(), 50.dp.roundToPx()), maxIntrinsicWidthSize.value)
+            assertEquals(IntSize(30.dp.roundToPx(), 50.dp.roundToPx()), childSize.value)
+            assertEquals(Offset(0f, 0f), childPosition.value)
         }
-    }
 
     @Test
-    fun testMaxIntrinsicWidth_intrinsicMeasurements() = with(density) {
-        testIntrinsics({
-            FixedIntrinsicsBox(
-                Modifier.width(IntrinsicSize.Max), 10.dp, 20.dp, 30.dp, 40.dp, 50.dp, 60.dp
+    fun testMaxIntrinsicHeight() =
+        with(density) {
+            val positionedLatch = CountDownLatch(2)
+            val maxIntrinsicHeightSize = Ref<IntSize>()
+            val childSize = Ref<IntSize>()
+            val childPosition = Ref<Offset>()
+            show {
+                Box {
+                    FixedIntrinsicsBox(
+                        Modifier.height(IntrinsicSize.Max)
+                            .onGloballyPositioned {
+                                maxIntrinsicHeightSize.value = it.size
+                                positionedLatch.countDown()
+                            }
+                            .saveLayoutInfo(
+                                size = childSize,
+                                position = childPosition,
+                                positionedLatch = positionedLatch
+                            ),
+                        10.dp,
+                        20.dp,
+                        30.dp,
+                        40.dp,
+                        50.dp,
+                        60.dp
+                    )
+                }
+            }
+            assertTrue(positionedLatch.await(1, TimeUnit.SECONDS))
+
+            assertEquals(
+                IntSize(20.dp.roundToPx(), 60.dp.roundToPx()),
+                maxIntrinsicHeightSize.value
             )
-        }) { minIntrinsicWidth, minIntrinsicHeight, maxIntrinsicWidth, maxIntrinsicHeight ->
-            assertEquals(30.dp.roundToPx(), minIntrinsicWidth(0))
-            assertEquals(40.dp.roundToPx(), minIntrinsicHeight(0))
-            assertEquals(30.dp.roundToPx(), maxIntrinsicWidth(0))
-            assertEquals(60.dp.roundToPx(), maxIntrinsicHeight(0))
+            assertEquals(IntSize(20.dp.roundToPx(), 60.dp.roundToPx()), childSize.value)
+            assertEquals(Offset(0f, 0f), childPosition.value)
         }
-    }
 
     @Test
-    fun testMaxIntrinsicHeight_intrinsicMeasurements() = with(density) {
-        testIntrinsics({
-            FixedIntrinsicsBox(
-                Modifier.height(IntrinsicSize.Max),
-                10.dp, 20.dp, 30.dp, 40.dp, 50.dp, 60.dp
-            )
-        }) { minIntrinsicWidth, minIntrinsicHeight, maxIntrinsicWidth, maxIntrinsicHeight ->
-            assertEquals(10.dp.roundToPx(), minIntrinsicWidth(0))
-            assertEquals(60.dp.roundToPx(), minIntrinsicHeight(0))
-            assertEquals(30.dp.roundToPx(), maxIntrinsicWidth(0))
-            assertEquals(60.dp.roundToPx(), maxIntrinsicHeight(0))
+    fun testMinIntrinsicWidth_respectsIncomingMaxConstraints() =
+        with(density) {
+            val positionedLatch = CountDownLatch(2)
+            val minIntrinsicWidthSize = Ref<IntSize>()
+            val childSize = Ref<IntSize>()
+            val childPosition = Ref<Offset>()
+            show {
+                Box {
+                    ConstrainedBox(DpConstraints(maxWidth = 5.dp)) {
+                        FixedIntrinsicsBox(
+                            Modifier.width(IntrinsicSize.Min)
+                                .onGloballyPositioned {
+                                    minIntrinsicWidthSize.value = it.size
+                                    positionedLatch.countDown()
+                                }
+                                .saveLayoutInfo(
+                                    size = childSize,
+                                    position = childPosition,
+                                    positionedLatch = positionedLatch
+                                ),
+                            10.dp,
+                            20.dp,
+                            30.dp,
+                            40.dp,
+                            50.dp,
+                            60.dp
+                        )
+                    }
+                }
+            }
+            assertTrue(positionedLatch.await(1, TimeUnit.SECONDS))
+
+            assertEquals(IntSize(5.dp.roundToPx(), 50.dp.roundToPx()), minIntrinsicWidthSize.value)
+            assertEquals(IntSize(5.dp.roundToPx(), 50.dp.roundToPx()), childSize.value)
+            assertEquals(Offset(0f, 0f), childPosition.value)
         }
-    }
+
+    @Test
+    fun testMinIntrinsicWidth_respectsIncomingMinConstraints() =
+        with(density) {
+            val positionedLatch = CountDownLatch(2)
+            val minIntrinsicWidthSize = Ref<IntSize>()
+            val childSize = Ref<IntSize>()
+            val childPosition = Ref<Offset>()
+            show {
+                Box {
+                    ConstrainedBox(DpConstraints(minWidth = 15.dp)) {
+                        FixedIntrinsicsBox(
+                            Modifier.width(IntrinsicSize.Min)
+                                .onGloballyPositioned {
+                                    minIntrinsicWidthSize.value = it.size
+                                    positionedLatch.countDown()
+                                }
+                                .saveLayoutInfo(
+                                    size = childSize,
+                                    position = childPosition,
+                                    positionedLatch = positionedLatch
+                                ),
+                            10.dp,
+                            20.dp,
+                            30.dp,
+                            40.dp,
+                            50.dp,
+                            60.dp
+                        )
+                    }
+                }
+            }
+            assertTrue(positionedLatch.await(1, TimeUnit.SECONDS))
+
+            assertEquals(IntSize(15.dp.roundToPx(), 50.dp.roundToPx()), minIntrinsicWidthSize.value)
+            assertEquals(IntSize(15.dp.roundToPx(), 50.dp.roundToPx()), childSize.value)
+            assertEquals(Offset(0f, 0f), childPosition.value)
+        }
+
+    @Test
+    fun testMinIntrinsicHeight_respectsMaxIncomingConstraints() =
+        with(density) {
+            val positionedLatch = CountDownLatch(2)
+            val minIntrinsicHeightSize = Ref<IntSize>()
+            val childSize = Ref<IntSize>()
+            val childPosition = Ref<Offset>()
+            show {
+                Box {
+                    ConstrainedBox(
+                        DpConstraints(maxHeight = 35.dp),
+                        modifier =
+                            Modifier.onGloballyPositioned { coordinates: LayoutCoordinates ->
+                                minIntrinsicHeightSize.value = coordinates.size
+                                positionedLatch.countDown()
+                            }
+                    ) {
+                        FixedIntrinsicsBox(
+                            Modifier.height(IntrinsicSize.Min)
+                                .saveLayoutInfo(
+                                    size = childSize,
+                                    position = childPosition,
+                                    positionedLatch = positionedLatch
+                                ),
+                            10.dp,
+                            20.dp,
+                            30.dp,
+                            40.dp,
+                            50.dp,
+                            60.dp
+                        )
+                    }
+                }
+            }
+            assertTrue(positionedLatch.await(1, TimeUnit.SECONDS))
+
+            assertEquals(
+                IntSize(20.dp.roundToPx(), 35.dp.roundToPx()),
+                minIntrinsicHeightSize.value
+            )
+            assertEquals(IntSize(20.dp.roundToPx(), 35.dp.roundToPx()), childSize.value)
+            assertEquals(Offset(0f, 0f), childPosition.value)
+        }
+
+    @Test
+    fun testMinIntrinsicHeight_respectsMinIncomingConstraints() =
+        with(density) {
+            val positionedLatch = CountDownLatch(2)
+            val minIntrinsicHeightSize = Ref<IntSize>()
+            val childSize = Ref<IntSize>()
+            val childPosition = Ref<Offset>()
+            show {
+                Box {
+                    ConstrainedBox(
+                        DpConstraints(minHeight = 45.dp),
+                        modifier =
+                            Modifier.onGloballyPositioned { coordinates: LayoutCoordinates ->
+                                minIntrinsicHeightSize.value = coordinates.size
+                                positionedLatch.countDown()
+                            }
+                    ) {
+                        FixedIntrinsicsBox(
+                            Modifier.height(IntrinsicSize.Min)
+                                .saveLayoutInfo(
+                                    size = childSize,
+                                    position = childPosition,
+                                    positionedLatch = positionedLatch
+                                ),
+                            10.dp,
+                            20.dp,
+                            30.dp,
+                            40.dp,
+                            50.dp,
+                            60.dp
+                        )
+                    }
+                }
+            }
+            assertTrue(positionedLatch.await(1, TimeUnit.SECONDS))
+
+            assertEquals(
+                IntSize(20.dp.roundToPx(), 45.dp.roundToPx()),
+                minIntrinsicHeightSize.value
+            )
+            assertEquals(IntSize(20.dp.roundToPx(), 45.dp.roundToPx()), childSize.value)
+            assertEquals(Offset(0f, 0f), childPosition.value)
+        }
+
+    @Test
+    fun testMaxIntrinsicWidth_respectsMaxIncomingConstraints() =
+        with(density) {
+            val positionedLatch = CountDownLatch(2)
+            val maxIntrinsicWidthSize = Ref<IntSize>()
+            val childSize = Ref<IntSize>()
+            val childPosition = Ref<Offset>()
+            show {
+                Box {
+                    ConstrainedBox(
+                        DpConstraints(maxWidth = 25.dp),
+                        modifier =
+                            Modifier.onGloballyPositioned { coordinates: LayoutCoordinates ->
+                                maxIntrinsicWidthSize.value = coordinates.size
+                                positionedLatch.countDown()
+                            }
+                    ) {
+                        FixedIntrinsicsBox(
+                            Modifier.width(IntrinsicSize.Max)
+                                .saveLayoutInfo(
+                                    size = childSize,
+                                    position = childPosition,
+                                    positionedLatch = positionedLatch
+                                ),
+                            10.dp,
+                            20.dp,
+                            30.dp,
+                            40.dp,
+                            50.dp,
+                            60.dp
+                        )
+                    }
+                }
+            }
+            assertTrue(positionedLatch.await(1, TimeUnit.SECONDS))
+
+            assertEquals(IntSize(25.dp.roundToPx(), 50.dp.roundToPx()), maxIntrinsicWidthSize.value)
+            assertEquals(IntSize(25.dp.roundToPx(), 50.dp.roundToPx()), childSize.value)
+            assertEquals(Offset(0f, 0f), childPosition.value)
+        }
+
+    @Test
+    fun testMaxIntrinsicWidth_respectsMinIncomingConstraints() =
+        with(density) {
+            val positionedLatch = CountDownLatch(2)
+            val maxIntrinsicWidthSize = Ref<IntSize>()
+            val childSize = Ref<IntSize>()
+            val childPosition = Ref<Offset>()
+            show {
+                Box {
+                    ConstrainedBox(
+                        DpConstraints(minWidth = 35.dp),
+                        modifier =
+                            Modifier.onGloballyPositioned { coordinates: LayoutCoordinates ->
+                                maxIntrinsicWidthSize.value = coordinates.size
+                                positionedLatch.countDown()
+                            }
+                    ) {
+                        FixedIntrinsicsBox(
+                            Modifier.width(IntrinsicSize.Max)
+                                .saveLayoutInfo(
+                                    size = childSize,
+                                    position = childPosition,
+                                    positionedLatch = positionedLatch
+                                ),
+                            10.dp,
+                            20.dp,
+                            30.dp,
+                            40.dp,
+                            50.dp,
+                            60.dp
+                        )
+                    }
+                }
+            }
+            assertTrue(positionedLatch.await(1, TimeUnit.SECONDS))
+
+            assertEquals(IntSize(35.dp.roundToPx(), 50.dp.roundToPx()), maxIntrinsicWidthSize.value)
+            assertEquals(IntSize(35.dp.roundToPx(), 50.dp.roundToPx()), childSize.value)
+            assertEquals(Offset(0f, 0f), childPosition.value)
+        }
+
+    @Test
+    fun testMaxIntrinsicHeight_respectsMaxIncomingConstraints() =
+        with(density) {
+            val positionedLatch = CountDownLatch(2)
+            val maxIntrinsicHeightSize = Ref<IntSize>()
+            val childSize = Ref<IntSize>()
+            val childPosition = Ref<Offset>()
+            show {
+                Box {
+                    ConstrainedBox(
+                        DpConstraints(maxHeight = 55.dp),
+                        modifier =
+                            Modifier.onGloballyPositioned { coordinates: LayoutCoordinates ->
+                                maxIntrinsicHeightSize.value = coordinates.size
+                                positionedLatch.countDown()
+                            }
+                    ) {
+                        FixedIntrinsicsBox(
+                            Modifier.height(IntrinsicSize.Max)
+                                .saveLayoutInfo(
+                                    size = childSize,
+                                    position = childPosition,
+                                    positionedLatch = positionedLatch
+                                ),
+                            10.dp,
+                            20.dp,
+                            30.dp,
+                            40.dp,
+                            50.dp,
+                            60.dp
+                        )
+                    }
+                }
+            }
+            assertTrue(positionedLatch.await(1, TimeUnit.SECONDS))
+
+            assertEquals(
+                IntSize(20.dp.roundToPx(), 55.dp.roundToPx()),
+                maxIntrinsicHeightSize.value
+            )
+            assertEquals(IntSize(20.dp.roundToPx(), 55.dp.roundToPx()), childSize.value)
+            assertEquals(Offset(0f, 0f), childPosition.value)
+        }
+
+    @Test
+    fun testMaxIntrinsicHeight_respectsMinIncomingConstraints() =
+        with(density) {
+            val positionedLatch = CountDownLatch(2)
+            val maxIntrinsicHeightSize = Ref<IntSize>()
+            val childSize = Ref<IntSize>()
+            val childPosition = Ref<Offset>()
+            show {
+                Box {
+                    ConstrainedBox(
+                        DpConstraints(minHeight = 65.dp),
+                        modifier =
+                            Modifier.onGloballyPositioned { coordinates: LayoutCoordinates ->
+                                maxIntrinsicHeightSize.value = coordinates.size
+                                positionedLatch.countDown()
+                            }
+                    ) {
+                        FixedIntrinsicsBox(
+                            Modifier.height(IntrinsicSize.Max)
+                                .saveLayoutInfo(
+                                    size = childSize,
+                                    position = childPosition,
+                                    positionedLatch = positionedLatch
+                                ),
+                            10.dp,
+                            20.dp,
+                            30.dp,
+                            40.dp,
+                            50.dp,
+                            60.dp
+                        )
+                    }
+                }
+            }
+            assertTrue(positionedLatch.await(1, TimeUnit.SECONDS))
+
+            assertEquals(
+                IntSize(20.dp.roundToPx(), 65.dp.roundToPx()),
+                maxIntrinsicHeightSize.value
+            )
+            assertEquals(IntSize(20.dp.roundToPx(), 65.dp.roundToPx()), childSize.value)
+            assertEquals(Offset(0f, 0f), childPosition.value)
+        }
+
+    @Test
+    fun testRequiredMinIntrinsicWidth() =
+        with(density) {
+            val countDownLatch = CountDownLatch(1)
+            show {
+                Box {
+                    ConstrainedBox(DpConstraints.fixed(100.dp, 100.dp)) {
+                        FixedIntrinsicsBox(
+                            Modifier.requiredWidth(IntrinsicSize.Min).onSizeChanged {
+                                assertEquals(IntSize(10.dp.roundToPx(), 50.dp.roundToPx()), it)
+                                countDownLatch.countDown()
+                            },
+                            10.dp,
+                            20.dp,
+                            30.dp,
+                            40.dp,
+                            50.dp,
+                            60.dp
+                        )
+                    }
+                }
+            }
+            assertTrue(countDownLatch.await(1, TimeUnit.SECONDS))
+        }
+
+    @Test
+    fun testRequiredMinIntrinsicHeight() =
+        with(density) {
+            val countDownLatch = CountDownLatch(1)
+            show {
+                Box {
+                    ConstrainedBox(DpConstraints.fixed(100.dp, 100.dp)) {
+                        FixedIntrinsicsBox(
+                            Modifier.requiredHeight(IntrinsicSize.Min).onSizeChanged {
+                                assertEquals(IntSize(20.dp.roundToPx(), 40.dp.roundToPx()), it)
+                                countDownLatch.countDown()
+                            },
+                            10.dp,
+                            20.dp,
+                            30.dp,
+                            40.dp,
+                            50.dp,
+                            60.dp
+                        )
+                    }
+                }
+            }
+            assertTrue(countDownLatch.await(1, TimeUnit.SECONDS))
+        }
+
+    @Test
+    fun testRequiredMaxIntrinsicWidth() =
+        with(density) {
+            val countDownLatch = CountDownLatch(1)
+            show {
+                Box {
+                    ConstrainedBox(DpConstraints.fixed(100.dp, 100.dp)) {
+                        FixedIntrinsicsBox(
+                            Modifier.requiredWidth(IntrinsicSize.Max).onSizeChanged {
+                                assertEquals(IntSize(30.dp.roundToPx(), 50.dp.roundToPx()), it)
+                                countDownLatch.countDown()
+                            },
+                            10.dp,
+                            20.dp,
+                            30.dp,
+                            40.dp,
+                            50.dp,
+                            60.dp
+                        )
+                    }
+                }
+            }
+            assertTrue(countDownLatch.await(1, TimeUnit.SECONDS))
+        }
+
+    @Test
+    fun testRequiredMaxIntrinsicHeight() =
+        with(density) {
+            val countDownLatch = CountDownLatch(1)
+            show {
+                Box {
+                    ConstrainedBox(DpConstraints.fixed(100.dp, 100.dp)) {
+                        FixedIntrinsicsBox(
+                            Modifier.requiredHeight(IntrinsicSize.Max).onSizeChanged {
+                                assertEquals(IntSize(20.dp.roundToPx(), 60.dp.roundToPx()), it)
+                                countDownLatch.countDown()
+                            },
+                            10.dp,
+                            20.dp,
+                            30.dp,
+                            40.dp,
+                            50.dp,
+                            60.dp
+                        )
+                    }
+                }
+            }
+            assertTrue(countDownLatch.await(1, TimeUnit.SECONDS))
+        }
+
+    @Test
+    fun testMinIntrinsicWidth_intrinsicMeasurements() =
+        with(density) {
+            testIntrinsics({
+                FixedIntrinsicsBox(
+                    Modifier.width(IntrinsicSize.Min),
+                    10.dp,
+                    20.dp,
+                    30.dp,
+                    40.dp,
+                    50.dp,
+                    60.dp
+                )
+            }) { minIntrinsicWidth, minIntrinsicHeight, maxIntrinsicWidth, maxIntrinsicHeight ->
+                assertEquals(10.dp.roundToPx(), minIntrinsicWidth(0))
+                assertEquals(40.dp.roundToPx(), minIntrinsicHeight(0))
+                assertEquals(10.dp.roundToPx(), maxIntrinsicWidth(0))
+                assertEquals(60.dp.roundToPx(), maxIntrinsicHeight(0))
+            }
+        }
+
+    @Test
+    fun testMinIntrinsicHeight_intrinsicMeasurements() =
+        with(density) {
+            testIntrinsics({
+                FixedIntrinsicsBox(
+                    Modifier.height(IntrinsicSize.Min),
+                    10.dp,
+                    20.dp,
+                    30.dp,
+                    40.dp,
+                    50.dp,
+                    60.dp
+                )
+            }) { minIntrinsicWidth, minIntrinsicHeight, maxIntrinsicWidth, maxIntrinsicHeight ->
+                assertEquals(10.dp.roundToPx(), minIntrinsicWidth(0))
+                assertEquals(40.dp.roundToPx(), minIntrinsicHeight(0))
+                assertEquals(30.dp.roundToPx(), maxIntrinsicWidth(0))
+                assertEquals(40.dp.roundToPx(), maxIntrinsicHeight(0))
+            }
+        }
+
+    @Test
+    fun testMaxIntrinsicWidth_intrinsicMeasurements() =
+        with(density) {
+            testIntrinsics({
+                FixedIntrinsicsBox(
+                    Modifier.width(IntrinsicSize.Max),
+                    10.dp,
+                    20.dp,
+                    30.dp,
+                    40.dp,
+                    50.dp,
+                    60.dp
+                )
+            }) { minIntrinsicWidth, minIntrinsicHeight, maxIntrinsicWidth, maxIntrinsicHeight ->
+                assertEquals(30.dp.roundToPx(), minIntrinsicWidth(0))
+                assertEquals(40.dp.roundToPx(), minIntrinsicHeight(0))
+                assertEquals(30.dp.roundToPx(), maxIntrinsicWidth(0))
+                assertEquals(60.dp.roundToPx(), maxIntrinsicHeight(0))
+            }
+        }
+
+    @Test
+    fun testMaxIntrinsicHeight_intrinsicMeasurements() =
+        with(density) {
+            testIntrinsics({
+                FixedIntrinsicsBox(
+                    Modifier.height(IntrinsicSize.Max),
+                    10.dp,
+                    20.dp,
+                    30.dp,
+                    40.dp,
+                    50.dp,
+                    60.dp
+                )
+            }) { minIntrinsicWidth, minIntrinsicHeight, maxIntrinsicWidth, maxIntrinsicHeight ->
+                assertEquals(10.dp.roundToPx(), minIntrinsicWidth(0))
+                assertEquals(60.dp.roundToPx(), minIntrinsicHeight(0))
+                assertEquals(30.dp.roundToPx(), maxIntrinsicWidth(0))
+                assertEquals(60.dp.roundToPx(), maxIntrinsicHeight(0))
+            }
+        }
 }
 
 @Composable
@@ -642,40 +805,37 @@
     height: Dp,
     maxIntrinsicHeight: Dp
 ) {
-    val measurePolicy = object : MeasurePolicy {
-        override fun MeasureScope.measure(
-            measurables: List<Measurable>,
-            constraints: Constraints
-        ): MeasureResult {
-            return layout(
-                constraints.constrainWidth(width.roundToPx()),
-                constraints.constrainHeight(height.roundToPx())
-            ) {}
+    val measurePolicy =
+        object : MeasurePolicy {
+            override fun MeasureScope.measure(
+                measurables: List<Measurable>,
+                constraints: Constraints
+            ): MeasureResult {
+                return layout(
+                    constraints.constrainWidth(width.roundToPx()),
+                    constraints.constrainHeight(height.roundToPx())
+                ) {}
+            }
+
+            override fun IntrinsicMeasureScope.minIntrinsicWidth(
+                measurables: List<IntrinsicMeasurable>,
+                height: Int
+            ) = minIntrinsicWidth.roundToPx()
+
+            override fun IntrinsicMeasureScope.minIntrinsicHeight(
+                measurables: List<IntrinsicMeasurable>,
+                width: Int
+            ) = minIntrinsicHeight.roundToPx()
+
+            override fun IntrinsicMeasureScope.maxIntrinsicWidth(
+                measurables: List<IntrinsicMeasurable>,
+                height: Int
+            ) = maxIntrinsicWidth.roundToPx()
+
+            override fun IntrinsicMeasureScope.maxIntrinsicHeight(
+                measurables: List<IntrinsicMeasurable>,
+                width: Int
+            ) = maxIntrinsicHeight.roundToPx()
         }
-
-        override fun IntrinsicMeasureScope.minIntrinsicWidth(
-            measurables: List<IntrinsicMeasurable>,
-            height: Int
-        ) = minIntrinsicWidth.roundToPx()
-
-        override fun IntrinsicMeasureScope.minIntrinsicHeight(
-            measurables: List<IntrinsicMeasurable>,
-            width: Int
-        ) = minIntrinsicHeight.roundToPx()
-
-        override fun IntrinsicMeasureScope.maxIntrinsicWidth(
-            measurables: List<IntrinsicMeasurable>,
-            height: Int
-        ) = maxIntrinsicWidth.roundToPx()
-
-        override fun IntrinsicMeasureScope.maxIntrinsicHeight(
-            measurables: List<IntrinsicMeasurable>,
-            width: Int
-        ) = maxIntrinsicHeight.roundToPx()
-    }
-    Layout(
-        content = {},
-        modifier = modifier,
-        measurePolicy = measurePolicy
-    )
+    Layout(content = {}, modifier = modifier, measurePolicy = measurePolicy)
 }
diff --git a/compose/foundation/foundation-layout/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/layout/LayoutReuseTest.kt b/compose/foundation/foundation-layout/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/layout/LayoutReuseTest.kt
index 79035d5..2a41483 100644
--- a/compose/foundation/foundation-layout/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/layout/LayoutReuseTest.kt
+++ b/compose/foundation/foundation-layout/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/layout/LayoutReuseTest.kt
@@ -37,104 +37,77 @@
 @RunWith(AndroidJUnit4::class)
 class LayoutReuseTest {
 
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
     @Test
     fun reuseBox() {
-        assertNoRemeasureOnReuse { modifier ->
-            Box(modifier.size(10.dp))
-        }
+        assertNoRemeasureOnReuse { modifier -> Box(modifier.size(10.dp)) }
     }
 
     @Test
     fun reuseBoxWithNonDefaultAlignment() {
         assertNoRemeasureOnReuse { modifier ->
-            Box(modifier.size(10.dp), contentAlignment = Alignment.Center) {
-            }
+            Box(modifier.size(10.dp), contentAlignment = Alignment.Center) {}
         }
     }
 
     @Test
     fun reuseRow() {
-        assertNoRemeasureOnReuse { modifier ->
-            Row(modifier.size(10.dp)) {
-            }
-        }
+        assertNoRemeasureOnReuse { modifier -> Row(modifier.size(10.dp)) {} }
     }
 
     @Test
     fun reuseRowWithNonDefaultAlignment() {
         assertNoRemeasureOnReuse { modifier ->
-            Row(modifier.size(10.dp), verticalAlignment = Alignment.CenterVertically) {
-            }
+            Row(modifier.size(10.dp), verticalAlignment = Alignment.CenterVertically) {}
         }
     }
 
     @Test
     fun reuseColumn() {
-        assertNoRemeasureOnReuse { modifier ->
-            Column(modifier.size(10.dp)) {
-            }
-        }
+        assertNoRemeasureOnReuse { modifier -> Column(modifier.size(10.dp)) {} }
     }
 
     @Test
     fun reuseColumnWithNonDefaultAlignment() {
         assertNoRemeasureOnReuse { modifier ->
-            Column(modifier.size(10.dp), horizontalAlignment = Alignment.CenterHorizontally) {
-            }
+            Column(modifier.size(10.dp), horizontalAlignment = Alignment.CenterHorizontally) {}
         }
     }
 
     @OptIn(ExperimentalLayoutApi::class)
     @Test
     fun reuseFlowRow() {
-        assertNoRemeasureOnReuse { modifier ->
-            FlowRow(modifier.size(10.dp)) {
-            }
-        }
+        assertNoRemeasureOnReuse { modifier -> FlowRow(modifier.size(10.dp)) {} }
     }
 
     @OptIn(ExperimentalLayoutApi::class)
     @Test
     fun reuseFlowColumn() {
-        assertNoRemeasureOnReuse { modifier ->
-            FlowColumn(modifier.size(10.dp)) {
-            }
-        }
+        assertNoRemeasureOnReuse { modifier -> FlowColumn(modifier.size(10.dp)) {} }
     }
 
     @OptIn(ExperimentalLayoutApi::class)
     @Test
     fun reuseSpacer() {
-        assertNoRemeasureOnReuse { modifier ->
-            Spacer(modifier.size(10.dp))
-        }
+        assertNoRemeasureOnReuse { modifier -> Spacer(modifier.size(10.dp)) }
     }
 
     private fun assertNoRemeasureOnReuse(content: @Composable (Modifier) -> Unit) {
         var measureCount = 0
-        val layoutModifier = Modifier.layout { measurable, constraints ->
-            measureCount++
-            val placeable = measurable.measure(constraints)
-            layout(placeable.width, placeable.height) {
-                placeable.place(0, 0)
+        val layoutModifier =
+            Modifier.layout { measurable, constraints ->
+                measureCount++
+                val placeable = measurable.measure(constraints)
+                layout(placeable.width, placeable.height) { placeable.place(0, 0) }
             }
-        }
         var key by mutableStateOf(0)
-        rule.setContent {
-            ReusableContent(key = key) {
-                content(layoutModifier)
-            }
-        }
+        rule.setContent { ReusableContent(key = key) { content(layoutModifier) } }
         rule.runOnIdle {
             measureCount = 0
             key++
         }
 
-        rule.runOnIdle {
-            assertThat(measureCount).isEqualTo(0)
-        }
+        rule.runOnIdle { assertThat(measureCount).isEqualTo(0) }
     }
 }
diff --git a/compose/foundation/foundation-layout/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/layout/LayoutTest.kt b/compose/foundation/foundation-layout/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/layout/LayoutTest.kt
index b51d90a..890fbc2 100644
--- a/compose/foundation/foundation-layout/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/layout/LayoutTest.kt
+++ b/compose/foundation/foundation-layout/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/layout/LayoutTest.kt
@@ -69,9 +69,8 @@
 open class LayoutTest {
     @Suppress("DEPRECATION")
     @get:Rule
-    val activityTestRule = androidx.test.rule.ActivityTestRule<TestActivity>(
-        TestActivity::class.java
-    )
+    val activityTestRule =
+        androidx.test.rule.ActivityTestRule<TestActivity>(TestActivity::class.java)
     lateinit var activity: TestActivity
     lateinit var handler: Handler
     internal lateinit var density: Density
@@ -84,20 +83,22 @@
 
         // Kotlin IR compiler doesn't seem too happy with auto-conversion from
         // lambda to Runnable, so separate it here
-        val runnable: Runnable = object : Runnable {
-            override fun run() {
-                handler = Handler(Looper.getMainLooper())
+        val runnable: Runnable =
+            object : Runnable {
+                override fun run() {
+                    handler = Handler(Looper.getMainLooper())
+                }
             }
-        }
         activityTestRule.runOnUiThread(runnable)
     }
 
     internal fun show(composable: @Composable () -> Unit) {
-        val runnable: Runnable = object : Runnable {
-            override fun run() {
-                activity.setContent(content = composable)
+        val runnable: Runnable =
+            object : Runnable {
+                override fun run() {
+                    activity.setContent(content = composable)
+                }
             }
-        }
         activityTestRule.runOnUiThread(runnable)
         // Wait for the frame to complete before continuing
         runBlocking {
@@ -133,17 +134,20 @@
 
     internal fun waitForDraw(view: View) {
         val viewDrawLatch = CountDownLatch(1)
-        val listener = object : ViewTreeObserver.OnDrawListener {
-            override fun onDraw() {
-                viewDrawLatch.countDown()
+        val listener =
+            object : ViewTreeObserver.OnDrawListener {
+                override fun onDraw() {
+                    viewDrawLatch.countDown()
+                }
             }
-        }
-        view.post(object : Runnable {
-            override fun run() {
-                view.viewTreeObserver.addOnDrawListener(listener)
-                view.invalidate()
+        view.post(
+            object : Runnable {
+                override fun run() {
+                    view.viewTreeObserver.addOnDrawListener(listener)
+                    view.invalidate()
+                }
             }
-        })
+        )
         assertTrue(viewDrawLatch.await(1, TimeUnit.SECONDS))
     }
 
@@ -151,11 +155,12 @@
         size: Ref<IntSize>,
         position: Ref<Offset>,
         positionedLatch: CountDownLatch
-    ): Modifier = this.onGloballyPositioned { coordinates ->
-        size.value = IntSize(coordinates.size.width, coordinates.size.height)
-        position.value = coordinates.localToRoot(Offset(0f, 0f))
-        positionedLatch.countDown()
-    }
+    ): Modifier =
+        this.onGloballyPositioned { coordinates ->
+            size.value = IntSize(coordinates.size.width, coordinates.size.height)
+            position.value = coordinates.localToRoot(Offset(0f, 0f))
+            positionedLatch.countDown()
+        }
 
     internal fun testIntrinsics(
         vararg layouts: @Composable () -> Unit,
@@ -164,58 +169,52 @@
         layouts.forEach { layout ->
             val layoutLatch = CountDownLatch(1)
             show {
-                val measurePolicy = object : MeasurePolicy {
-                    override fun MeasureScope.measure(
-                        measurables: List<Measurable>,
-                        constraints: Constraints
-                    ): MeasureResult {
-                        val measurable = measurables.first()
-                        test(
-                            { h -> measurable.minIntrinsicWidth(h) },
-                            { w -> measurable.minIntrinsicHeight(w) },
-                            { h -> measurable.maxIntrinsicWidth(h) },
-                            { w -> measurable.maxIntrinsicHeight(w) }
-                        )
-                        layoutLatch.countDown()
+                val measurePolicy =
+                    object : MeasurePolicy {
+                        override fun MeasureScope.measure(
+                            measurables: List<Measurable>,
+                            constraints: Constraints
+                        ): MeasureResult {
+                            val measurable = measurables.first()
+                            test(
+                                { h -> measurable.minIntrinsicWidth(h) },
+                                { w -> measurable.minIntrinsicHeight(w) },
+                                { h -> measurable.maxIntrinsicWidth(h) },
+                                { w -> measurable.maxIntrinsicHeight(w) }
+                            )
+                            layoutLatch.countDown()
 
-                        return layout(0, 0) {}
+                            return layout(0, 0) {}
+                        }
+
+                        override fun IntrinsicMeasureScope.minIntrinsicWidth(
+                            measurables: List<IntrinsicMeasurable>,
+                            height: Int
+                        ) = 0
+
+                        override fun IntrinsicMeasureScope.minIntrinsicHeight(
+                            measurables: List<IntrinsicMeasurable>,
+                            width: Int
+                        ) = 0
+
+                        override fun IntrinsicMeasureScope.maxIntrinsicWidth(
+                            measurables: List<IntrinsicMeasurable>,
+                            height: Int
+                        ) = 0
+
+                        override fun IntrinsicMeasureScope.maxIntrinsicHeight(
+                            measurables: List<IntrinsicMeasurable>,
+                            width: Int
+                        ) = 0
                     }
-
-                    override fun IntrinsicMeasureScope.minIntrinsicWidth(
-                        measurables: List<IntrinsicMeasurable>,
-                        height: Int
-                    ) = 0
-
-                    override fun IntrinsicMeasureScope.minIntrinsicHeight(
-                        measurables: List<IntrinsicMeasurable>,
-                        width: Int
-                    ) = 0
-
-                    override fun IntrinsicMeasureScope.maxIntrinsicWidth(
-                        measurables: List<IntrinsicMeasurable>,
-                        height: Int
-                    ) = 0
-
-                    override fun IntrinsicMeasureScope.maxIntrinsicHeight(
-                        measurables: List<IntrinsicMeasurable>,
-                        width: Int
-                    ) = 0
-                }
-                Layout(
-                    content = layout,
-                    measurePolicy = measurePolicy
-                )
+                Layout(content = layout, measurePolicy = measurePolicy)
             }
             assertTrue(layoutLatch.await(1, TimeUnit.SECONDS))
         }
     }
 
     @Composable
-    internal fun FixedSizeLayout(
-        width: Int,
-        height: Int,
-        alignmentLines: Map<AlignmentLine, Int>
-    ) {
+    internal fun FixedSizeLayout(width: Int, height: Int, alignmentLines: Map<AlignmentLine, Int>) {
         Layout({}) { _, constraints ->
             layout(
                 constraints.constrainWidth(width),
@@ -229,9 +228,7 @@
     internal fun WithInfiniteConstraints(content: @Composable () -> Unit) {
         Layout(content) { measurables, _ ->
             val placeables = measurables.map { it.measure(Constraints()) }
-            layout(0, 0) {
-                placeables.forEach { it.placeRelative(0, 0) }
-            }
+            layout(0, 0) { placeables.forEach { it.placeRelative(0, 0) } }
         }
     }
 
@@ -243,76 +240,66 @@
     ) {
         with(LocalDensity.current) {
             val pxConstraints = Constraints(constraints)
-            val measurePolicy = object : MeasurePolicy {
-                @Suppress("PARAMETER_NAME_CHANGED_ON_OVERRIDE")
-                override fun MeasureScope.measure(
-                    measurables: List<Measurable>,
-                    incomingConstraints: Constraints
-                ): MeasureResult {
-                    val measurable = measurables.firstOrNull()
-                    val childConstraints = incomingConstraints.constrain(Constraints(constraints))
-                    val placeable = measurable?.measure(childConstraints)
+            val measurePolicy =
+                object : MeasurePolicy {
+                    @Suppress("PARAMETER_NAME_CHANGED_ON_OVERRIDE")
+                    override fun MeasureScope.measure(
+                        measurables: List<Measurable>,
+                        incomingConstraints: Constraints
+                    ): MeasureResult {
+                        val measurable = measurables.firstOrNull()
+                        val childConstraints =
+                            incomingConstraints.constrain(Constraints(constraints))
+                        val placeable = measurable?.measure(childConstraints)
 
-                    val layoutWidth = placeable?.width ?: childConstraints.minWidth
-                    val layoutHeight = placeable?.height ?: childConstraints.minHeight
-                    return layout(layoutWidth, layoutHeight) {
-                        placeable?.placeRelative(0, 0)
+                        val layoutWidth = placeable?.width ?: childConstraints.minWidth
+                        val layoutHeight = placeable?.height ?: childConstraints.minHeight
+                        return layout(layoutWidth, layoutHeight) { placeable?.placeRelative(0, 0) }
+                    }
+
+                    override fun IntrinsicMeasureScope.minIntrinsicWidth(
+                        measurables: List<IntrinsicMeasurable>,
+                        height: Int
+                    ): Int {
+                        val width = measurables.firstOrNull()?.minIntrinsicWidth(height) ?: 0
+                        return pxConstraints.constrainWidth(width)
+                    }
+
+                    override fun IntrinsicMeasureScope.minIntrinsicHeight(
+                        measurables: List<IntrinsicMeasurable>,
+                        width: Int
+                    ): Int {
+                        val height = measurables.firstOrNull()?.minIntrinsicHeight(width) ?: 0
+                        return pxConstraints.constrainHeight(height)
+                    }
+
+                    override fun IntrinsicMeasureScope.maxIntrinsicWidth(
+                        measurables: List<IntrinsicMeasurable>,
+                        height: Int
+                    ): Int {
+                        val width = measurables.firstOrNull()?.maxIntrinsicWidth(height) ?: 0
+                        return pxConstraints.constrainWidth(width)
+                    }
+
+                    override fun IntrinsicMeasureScope.maxIntrinsicHeight(
+                        measurables: List<IntrinsicMeasurable>,
+                        width: Int
+                    ): Int {
+                        val height = measurables.firstOrNull()?.maxIntrinsicHeight(width) ?: 0
+                        return pxConstraints.constrainHeight(height)
                     }
                 }
-
-                override fun IntrinsicMeasureScope.minIntrinsicWidth(
-                    measurables: List<IntrinsicMeasurable>,
-                    height: Int
-                ): Int {
-                    val width = measurables.firstOrNull()?.minIntrinsicWidth(height) ?: 0
-                    return pxConstraints.constrainWidth(width)
-                }
-
-                override fun IntrinsicMeasureScope.minIntrinsicHeight(
-                    measurables: List<IntrinsicMeasurable>,
-                    width: Int
-                ): Int {
-                    val height = measurables.firstOrNull()?.minIntrinsicHeight(width) ?: 0
-                    return pxConstraints.constrainHeight(height)
-                }
-
-                override fun IntrinsicMeasureScope.maxIntrinsicWidth(
-                    measurables: List<IntrinsicMeasurable>,
-                    height: Int
-                ): Int {
-                    val width = measurables.firstOrNull()?.maxIntrinsicWidth(height) ?: 0
-                    return pxConstraints.constrainWidth(width)
-                }
-
-                override fun IntrinsicMeasureScope.maxIntrinsicHeight(
-                    measurables: List<IntrinsicMeasurable>,
-                    width: Int
-                ): Int {
-                    val height = measurables.firstOrNull()?.maxIntrinsicHeight(width) ?: 0
-                    return pxConstraints.constrainHeight(height)
-                }
-            }
-            Layout(
-                content = content,
-                modifier = modifier,
-                measurePolicy = measurePolicy
-            )
+            Layout(content = content, modifier = modifier, measurePolicy = measurePolicy)
         }
     }
 
-    /**
-     * Similar to [Constraints], but with constraint values expressed in [Dp].
-     */
+    /** Similar to [Constraints], but with constraint values expressed in [Dp]. */
     @Immutable
     data class DpConstraints(
-        @Stable
-        val minWidth: Dp = 0.dp,
-        @Stable
-        val maxWidth: Dp = Dp.Infinity,
-        @Stable
-        val minHeight: Dp = 0.dp,
-        @Stable
-        val maxHeight: Dp = Dp.Infinity
+        @Stable val minWidth: Dp = 0.dp,
+        @Stable val maxWidth: Dp = Dp.Infinity,
+        @Stable val minHeight: Dp = 0.dp,
+        @Stable val maxHeight: Dp = Dp.Infinity
     ) {
         init {
             require(minWidth.isFinite) { "Constraints#minWidth should be finite" }
@@ -334,24 +321,20 @@
         }
 
         companion object {
-            /**
-             * Creates constraints tight in both dimensions.
-             */
-            @Stable
-            fun fixed(width: Dp, height: Dp) = DpConstraints(width, width, height, height)
+            /** Creates constraints tight in both dimensions. */
+            @Stable fun fixed(width: Dp, height: Dp) = DpConstraints(width, width, height, height)
         }
     }
 
-    /**
-     * Creates the [Constraints] corresponding to the current [DpConstraints].
-     */
+    /** Creates the [Constraints] corresponding to the current [DpConstraints]. */
     @Stable
-    fun Density.Constraints(dpConstraints: DpConstraints) = Constraints(
-        minWidth = dpConstraints.minWidth.roundToPx(),
-        maxWidth = dpConstraints.maxWidth.roundToPx(),
-        minHeight = dpConstraints.minHeight.roundToPx(),
-        maxHeight = dpConstraints.maxHeight.roundToPx()
-    )
+    fun Density.Constraints(dpConstraints: DpConstraints) =
+        Constraints(
+            minWidth = dpConstraints.minWidth.roundToPx(),
+            maxWidth = dpConstraints.maxWidth.roundToPx(),
+            minHeight = dpConstraints.minHeight.roundToPx(),
+            maxHeight = dpConstraints.maxHeight.roundToPx()
+        )
 
     internal fun assertEquals(expected: Size?, actual: Size?) {
         assertNotNull("Null expected size", expected)
@@ -385,18 +368,8 @@
         assertNotNull("Null actual position", actual)
         actual as Offset
 
-        assertEquals(
-            "Expected x ${expected.x} but obtained ${actual.x}",
-            expected.x,
-            actual.x,
-            0f
-        )
-        assertEquals(
-            "Expected y ${expected.y} but obtained ${actual.y}",
-            expected.y,
-            actual.y,
-            0f
-        )
+        assertEquals("Expected x ${expected.x} but obtained ${actual.x}", expected.x, actual.x, 0f)
+        assertEquals("Expected y ${expected.y} but obtained ${actual.y}", expected.y, actual.y, 0f)
         if (actual.x != actual.x.toInt().toFloat()) {
             fail("Expected integer x coordinate")
         }
@@ -426,49 +399,58 @@
         content: @Composable () -> Unit
     ) {
         Layout(content, modifier) { measurables, incomingConstraints ->
-            val containerConstraints = incomingConstraints.constrain(
-                Constraints(constraints)
-                    .copy(
-                        width?.roundToPx() ?: constraints.minWidth.roundToPx(),
-                        width?.roundToPx() ?: constraints.maxWidth.roundToPx(),
-                        height?.roundToPx() ?: constraints.minHeight.roundToPx(),
-                        height?.roundToPx() ?: constraints.maxHeight.roundToPx()
-                    )
-            )
-            val totalHorizontal = padding.calculateLeftPadding(layoutDirection).roundToPx() +
-                padding.calculateRightPadding(layoutDirection).roundToPx()
-            val totalVertical = padding.calculateTopPadding().roundToPx() +
-                padding.calculateBottomPadding().roundToPx()
-            val childConstraints = containerConstraints
-                .copy(minWidth = 0, minHeight = 0)
-                .offset(-totalHorizontal, -totalVertical)
+            val containerConstraints =
+                incomingConstraints.constrain(
+                    Constraints(constraints)
+                        .copy(
+                            width?.roundToPx() ?: constraints.minWidth.roundToPx(),
+                            width?.roundToPx() ?: constraints.maxWidth.roundToPx(),
+                            height?.roundToPx() ?: constraints.minHeight.roundToPx(),
+                            height?.roundToPx() ?: constraints.maxHeight.roundToPx()
+                        )
+                )
+            val totalHorizontal =
+                padding.calculateLeftPadding(layoutDirection).roundToPx() +
+                    padding.calculateRightPadding(layoutDirection).roundToPx()
+            val totalVertical =
+                padding.calculateTopPadding().roundToPx() +
+                    padding.calculateBottomPadding().roundToPx()
+            val childConstraints =
+                containerConstraints
+                    .copy(minWidth = 0, minHeight = 0)
+                    .offset(-totalHorizontal, -totalVertical)
             var placeable: Placeable? = null
-            val containerWidth = if ((containerConstraints.hasFixedWidth || expanded) &&
-                containerConstraints.hasBoundedWidth
-            ) {
-                containerConstraints.maxWidth
-            } else {
-                placeable = measurables.firstOrNull()?.measure(childConstraints)
-                max((placeable?.width ?: 0) + totalHorizontal, containerConstraints.minWidth)
-            }
-            val containerHeight = if ((containerConstraints.hasFixedHeight || expanded) &&
-                containerConstraints.hasBoundedHeight
-            ) {
-                containerConstraints.maxHeight
-            } else {
-                if (placeable == null) {
+            val containerWidth =
+                if (
+                    (containerConstraints.hasFixedWidth || expanded) &&
+                        containerConstraints.hasBoundedWidth
+                ) {
+                    containerConstraints.maxWidth
+                } else {
                     placeable = measurables.firstOrNull()?.measure(childConstraints)
+                    max((placeable?.width ?: 0) + totalHorizontal, containerConstraints.minWidth)
                 }
-                max((placeable?.height ?: 0) + totalVertical, containerConstraints.minHeight)
-            }
+            val containerHeight =
+                if (
+                    (containerConstraints.hasFixedHeight || expanded) &&
+                        containerConstraints.hasBoundedHeight
+                ) {
+                    containerConstraints.maxHeight
+                } else {
+                    if (placeable == null) {
+                        placeable = measurables.firstOrNull()?.measure(childConstraints)
+                    }
+                    max((placeable?.height ?: 0) + totalVertical, containerConstraints.minHeight)
+                }
             layout(containerWidth, containerHeight) {
                 val p = placeable ?: measurables.firstOrNull()?.measure(childConstraints)
                 p?.let {
-                    val position = alignment.align(
-                        IntSize(it.width + totalHorizontal, it.height + totalVertical),
-                        IntSize(containerWidth, containerHeight),
-                        layoutDirection
-                    )
+                    val position =
+                        alignment.align(
+                            IntSize(it.width + totalHorizontal, it.height + totalVertical),
+                            IntSize(containerWidth, containerHeight),
+                            layoutDirection
+                        )
                     it.place(
                         padding.calculateLeftPadding(layoutDirection).roundToPx() + position.x,
                         padding.calculateTopPadding().roundToPx() + position.y
diff --git a/compose/foundation/foundation-layout/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/layout/OffsetTest.kt b/compose/foundation/foundation-layout/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/layout/OffsetTest.kt
index 172455b..e52ba6a 100644
--- a/compose/foundation/foundation-layout/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/layout/OffsetTest.kt
+++ b/compose/foundation/foundation-layout/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/layout/OffsetTest.kt
@@ -53,8 +53,7 @@
 @MediumTest
 @RunWith(AndroidJUnit4::class)
 class OffsetTest {
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
     @Before
     fun before() {
@@ -71,268 +70,264 @@
     }
 
     @Test
-    fun offset_positionIsModified() = with(rule.density) {
-        val offsetX = 10.dp
-        val offsetY = 20.dp
-        var positionX = 0
-        var positionY = 0
-        rule.setContent {
-            Box(
-                Modifier.testTag("box")
-                    .wrapContentSize(Alignment.TopStart)
-                    .offset(offsetX, offsetY)
-                    .onGloballyPositioned { coordinates: LayoutCoordinates ->
-                        positionX = coordinates.positionInRoot().x.roundToInt()
-                        positionY = coordinates.positionInRoot().y.roundToInt()
-                    }
-            ) {
-            }
-        }
-
-        rule.onNodeWithTag("box").assertExists()
-        rule.runOnIdle {
-            assertEquals(offsetX.roundToPx(), positionX)
-            assertEquals(offsetY.roundToPx(), positionY)
-        }
-    }
-
-    @Test
-    fun offset_positionIsModified_rtl() = with(rule.density) {
-        val containerWidth = 30.dp
-        val boxSize = 1
-        val offsetX = 10.dp
-        val offsetY = 20.dp
-        var positionX = 0
-        var positionY = 0
-        rule.setContent {
-            DeviceConfigurationOverride(
-                DeviceConfigurationOverride.LayoutDirection(LayoutDirection.Rtl)
-            ) {
+    fun offset_positionIsModified() =
+        with(rule.density) {
+            val offsetX = 10.dp
+            val offsetY = 20.dp
+            var positionX = 0
+            var positionY = 0
+            rule.setContent {
                 Box(
                     Modifier.testTag("box")
-                        .wrapContentSize(Alignment.TopEnd)
-                        .width(containerWidth)
                         .wrapContentSize(Alignment.TopStart)
                         .offset(offsetX, offsetY)
                         .onGloballyPositioned { coordinates: LayoutCoordinates ->
                             positionX = coordinates.positionInRoot().x.roundToInt()
                             positionY = coordinates.positionInRoot().y.roundToInt()
                         }
+                ) {}
+            }
+
+            rule.onNodeWithTag("box").assertExists()
+            rule.runOnIdle {
+                assertEquals(offsetX.roundToPx(), positionX)
+                assertEquals(offsetY.roundToPx(), positionY)
+            }
+        }
+
+    @Test
+    fun offset_positionIsModified_rtl() =
+        with(rule.density) {
+            val containerWidth = 30.dp
+            val boxSize = 1
+            val offsetX = 10.dp
+            val offsetY = 20.dp
+            var positionX = 0
+            var positionY = 0
+            rule.setContent {
+                DeviceConfigurationOverride(
+                    DeviceConfigurationOverride.LayoutDirection(LayoutDirection.Rtl)
                 ) {
-                    // TODO(soboleva): this box should not be needed after b/154758475 is fixed.
-                    Box(Modifier.requiredSize(boxSize.toDp()))
+                    Box(
+                        Modifier.testTag("box")
+                            .wrapContentSize(Alignment.TopEnd)
+                            .width(containerWidth)
+                            .wrapContentSize(Alignment.TopStart)
+                            .offset(offsetX, offsetY)
+                            .onGloballyPositioned { coordinates: LayoutCoordinates ->
+                                positionX = coordinates.positionInRoot().x.roundToInt()
+                                positionY = coordinates.positionInRoot().y.roundToInt()
+                            }
+                    ) {
+                        // TODO(soboleva): this box should not be needed after b/154758475 is fixed.
+                        Box(Modifier.requiredSize(boxSize.toDp()))
+                    }
                 }
             }
-        }
 
-        rule.onNodeWithTag("box").assertExists()
-        rule.runOnIdle {
-            assertEquals(containerWidth.roundToPx() - offsetX.roundToPx() - boxSize, positionX)
-            assertEquals(offsetY.roundToPx(), positionY)
-        }
-    }
-
-    @Test
-    fun absoluteOffset_positionModified() = with(rule.density) {
-        val offsetX = 10.dp
-        val offsetY = 20.dp
-        var positionX = 0
-        var positionY = 0
-        rule.setContent {
-            Box(
-                Modifier.testTag("box")
-                    .wrapContentSize(Alignment.TopStart)
-                    .absoluteOffset(offsetX, offsetY)
-                    .onGloballyPositioned { coordinates: LayoutCoordinates ->
-                        positionX = coordinates.positionInRoot().x.roundToInt()
-                        positionY = coordinates.positionInRoot().y.roundToInt()
-                    }
-            ) {
+            rule.onNodeWithTag("box").assertExists()
+            rule.runOnIdle {
+                assertEquals(containerWidth.roundToPx() - offsetX.roundToPx() - boxSize, positionX)
+                assertEquals(offsetY.roundToPx(), positionY)
             }
         }
 
-        rule.onNodeWithTag("box").assertExists()
-        rule.runOnIdle {
-            assertEquals(offsetX.roundToPx(), positionX)
-            assertEquals(offsetY.roundToPx(), positionY)
-        }
-    }
-
     @Test
-    fun absoluteOffset_positionModified_rtl() = with(rule.density) {
-        val containerWidth = 30.dp
-        val boxSize = 1
-        val offsetX = 10.dp
-        val offsetY = 20.dp
-        var positionX = 0
-        var positionY = 0
-        rule.setContent {
-            DeviceConfigurationOverride(
-                DeviceConfigurationOverride.LayoutDirection(LayoutDirection.Rtl)
-            ) {
+    fun absoluteOffset_positionModified() =
+        with(rule.density) {
+            val offsetX = 10.dp
+            val offsetY = 20.dp
+            var positionX = 0
+            var positionY = 0
+            rule.setContent {
                 Box(
                     Modifier.testTag("box")
-                        .wrapContentSize(Alignment.TopEnd)
-                        .width(containerWidth)
                         .wrapContentSize(Alignment.TopStart)
                         .absoluteOffset(offsetX, offsetY)
                         .onGloballyPositioned { coordinates: LayoutCoordinates ->
                             positionX = coordinates.positionInRoot().x.roundToInt()
                             positionY = coordinates.positionInRoot().y.roundToInt()
                         }
+                ) {}
+            }
+
+            rule.onNodeWithTag("box").assertExists()
+            rule.runOnIdle {
+                assertEquals(offsetX.roundToPx(), positionX)
+                assertEquals(offsetY.roundToPx(), positionY)
+            }
+        }
+
+    @Test
+    fun absoluteOffset_positionModified_rtl() =
+        with(rule.density) {
+            val containerWidth = 30.dp
+            val boxSize = 1
+            val offsetX = 10.dp
+            val offsetY = 20.dp
+            var positionX = 0
+            var positionY = 0
+            rule.setContent {
+                DeviceConfigurationOverride(
+                    DeviceConfigurationOverride.LayoutDirection(LayoutDirection.Rtl)
                 ) {
-                    // TODO(soboleva): this box should not be needed after b/154758475 is fixed.
-                    Box(Modifier.requiredSize(boxSize.toDp()))
+                    Box(
+                        Modifier.testTag("box")
+                            .wrapContentSize(Alignment.TopEnd)
+                            .width(containerWidth)
+                            .wrapContentSize(Alignment.TopStart)
+                            .absoluteOffset(offsetX, offsetY)
+                            .onGloballyPositioned { coordinates: LayoutCoordinates ->
+                                positionX = coordinates.positionInRoot().x.roundToInt()
+                                positionY = coordinates.positionInRoot().y.roundToInt()
+                            }
+                    ) {
+                        // TODO(soboleva): this box should not be needed after b/154758475 is fixed.
+                        Box(Modifier.requiredSize(boxSize.toDp()))
+                    }
                 }
             }
-        }
 
-        rule.onNodeWithTag("box").assertExists()
-        rule.runOnIdle {
-            assertEquals(containerWidth.roundToPx() - boxSize + offsetX.roundToPx(), positionX)
-            assertEquals(offsetY.roundToPx(), positionY)
-        }
-    }
-
-    @Test
-    fun offsetPx_positionIsModified() = with(rule.density) {
-        val offsetX = 10f
-        val offsetY = 20f
-        var positionX = 0f
-        var positionY = 0f
-        rule.setContent {
-            Box(
-                Modifier.testTag("box")
-                    .wrapContentSize(Alignment.TopStart)
-                    .offset { IntOffset(offsetX.roundToInt(), offsetY.roundToInt()) }
-                    .onGloballyPositioned { coordinates: LayoutCoordinates ->
-                        positionX = coordinates.positionInRoot().x
-                        positionY = coordinates.positionInRoot().y
-                    }
-            ) {
+            rule.onNodeWithTag("box").assertExists()
+            rule.runOnIdle {
+                assertEquals(containerWidth.roundToPx() - boxSize + offsetX.roundToPx(), positionX)
+                assertEquals(offsetY.roundToPx(), positionY)
             }
         }
 
-        rule.onNodeWithTag("box").assertExists()
-        rule.runOnIdle {
-            Assert.assertEquals(offsetX, positionX)
-            Assert.assertEquals(offsetY, positionY)
-        }
-    }
-
     @Test
-    fun offsetPx_positionIsModified_rtl() = with(rule.density) {
-        val containerWidth = 30.dp
-        val boxSize = 1
-        val offsetX = 10
-        val offsetY = 20
-        var positionX = 0
-        var positionY = 0
-        rule.setContent {
-            DeviceConfigurationOverride(
-                DeviceConfigurationOverride.LayoutDirection(LayoutDirection.Rtl)
-            ) {
+    fun offsetPx_positionIsModified() =
+        with(rule.density) {
+            val offsetX = 10f
+            val offsetY = 20f
+            var positionX = 0f
+            var positionY = 0f
+            rule.setContent {
                 Box(
                     Modifier.testTag("box")
-                        .wrapContentSize(Alignment.TopEnd)
-                        .width(containerWidth)
                         .wrapContentSize(Alignment.TopStart)
-                        .offset { IntOffset(offsetX, offsetY) }
+                        .offset { IntOffset(offsetX.roundToInt(), offsetY.roundToInt()) }
                         .onGloballyPositioned { coordinates: LayoutCoordinates ->
-                            positionX = coordinates.positionInRoot().x.roundToInt()
-                            positionY = coordinates.positionInRoot().y.roundToInt()
+                            positionX = coordinates.positionInRoot().x
+                            positionY = coordinates.positionInRoot().y
                         }
+                ) {}
+            }
+
+            rule.onNodeWithTag("box").assertExists()
+            rule.runOnIdle {
+                Assert.assertEquals(offsetX, positionX)
+                Assert.assertEquals(offsetY, positionY)
+            }
+        }
+
+    @Test
+    fun offsetPx_positionIsModified_rtl() =
+        with(rule.density) {
+            val containerWidth = 30.dp
+            val boxSize = 1
+            val offsetX = 10
+            val offsetY = 20
+            var positionX = 0
+            var positionY = 0
+            rule.setContent {
+                DeviceConfigurationOverride(
+                    DeviceConfigurationOverride.LayoutDirection(LayoutDirection.Rtl)
                 ) {
-                    // TODO(soboleva): this box should not be needed after b/154758475 is fixed.
-                    Box(Modifier.requiredSize(boxSize.toDp()))
+                    Box(
+                        Modifier.testTag("box")
+                            .wrapContentSize(Alignment.TopEnd)
+                            .width(containerWidth)
+                            .wrapContentSize(Alignment.TopStart)
+                            .offset { IntOffset(offsetX, offsetY) }
+                            .onGloballyPositioned { coordinates: LayoutCoordinates ->
+                                positionX = coordinates.positionInRoot().x.roundToInt()
+                                positionY = coordinates.positionInRoot().y.roundToInt()
+                            }
+                    ) {
+                        // TODO(soboleva): this box should not be needed after b/154758475 is fixed.
+                        Box(Modifier.requiredSize(boxSize.toDp()))
+                    }
                 }
             }
-        }
 
-        rule.onNodeWithTag("box").assertExists()
-        rule.runOnIdle {
-            Assert.assertEquals(
-                containerWidth.roundToPx() - offsetX - boxSize,
-                positionX
-            )
-            Assert.assertEquals(offsetY, positionY)
-        }
-    }
-
-    @Test
-    fun absoluteOffsetPx_positionIsModified() = with(rule.density) {
-        val offsetX = 10
-        val offsetY = 20
-        var positionX = 0
-        var positionY = 0
-        rule.setContent {
-            Box(
-                Modifier.testTag("box")
-                    .wrapContentSize(Alignment.TopStart)
-                    .absoluteOffset { IntOffset(offsetX, offsetY) }
-                    .onGloballyPositioned { coordinates: LayoutCoordinates ->
-                        positionX = coordinates.positionInRoot().x.roundToInt()
-                        positionY = coordinates.positionInRoot().y.roundToInt()
-                    }
-            ) {
+            rule.onNodeWithTag("box").assertExists()
+            rule.runOnIdle {
+                Assert.assertEquals(containerWidth.roundToPx() - offsetX - boxSize, positionX)
+                Assert.assertEquals(offsetY, positionY)
             }
         }
 
-        rule.onNodeWithTag("box").assertExists()
-        rule.runOnIdle {
-            Assert.assertEquals(offsetX, positionX)
-            Assert.assertEquals(offsetY, positionY)
-        }
-    }
-
     @Test
-    fun absoluteOffsetPx_positionIsModified_rtl() = with(rule.density) {
-        val containerWidth = 30.dp
-        val boxSize = 1
-        val offsetX = 10
-        val offsetY = 20
-        var positionX = 0
-        var positionY = 0
-        rule.setContent {
-            DeviceConfigurationOverride(
-                DeviceConfigurationOverride.LayoutDirection(LayoutDirection.Rtl)
-            ) {
+    fun absoluteOffsetPx_positionIsModified() =
+        with(rule.density) {
+            val offsetX = 10
+            val offsetY = 20
+            var positionX = 0
+            var positionY = 0
+            rule.setContent {
                 Box(
                     Modifier.testTag("box")
-                        .wrapContentSize(Alignment.TopEnd)
-                        .width(containerWidth)
                         .wrapContentSize(Alignment.TopStart)
                         .absoluteOffset { IntOffset(offsetX, offsetY) }
                         .onGloballyPositioned { coordinates: LayoutCoordinates ->
                             positionX = coordinates.positionInRoot().x.roundToInt()
                             positionY = coordinates.positionInRoot().y.roundToInt()
                         }
-                ) {
-                    // TODO(soboleva): this box should not be needed after b/154758475 is fixed.
-                    Box(Modifier.requiredSize(boxSize.toDp()))
-                }
+                ) {}
+            }
+
+            rule.onNodeWithTag("box").assertExists()
+            rule.runOnIdle {
+                Assert.assertEquals(offsetX, positionX)
+                Assert.assertEquals(offsetY, positionY)
             }
         }
 
-        rule.onNodeWithTag("box").assertExists()
-        rule.runOnIdle {
-            Assert.assertEquals(
-                containerWidth.roundToPx() - boxSize + offsetX,
-                positionX
-            )
-            Assert.assertEquals(offsetY, positionY)
+    @Test
+    fun absoluteOffsetPx_positionIsModified_rtl() =
+        with(rule.density) {
+            val containerWidth = 30.dp
+            val boxSize = 1
+            val offsetX = 10
+            val offsetY = 20
+            var positionX = 0
+            var positionY = 0
+            rule.setContent {
+                DeviceConfigurationOverride(
+                    DeviceConfigurationOverride.LayoutDirection(LayoutDirection.Rtl)
+                ) {
+                    Box(
+                        Modifier.testTag("box")
+                            .wrapContentSize(Alignment.TopEnd)
+                            .width(containerWidth)
+                            .wrapContentSize(Alignment.TopStart)
+                            .absoluteOffset { IntOffset(offsetX, offsetY) }
+                            .onGloballyPositioned { coordinates: LayoutCoordinates ->
+                                positionX = coordinates.positionInRoot().x.roundToInt()
+                                positionY = coordinates.positionInRoot().y.roundToInt()
+                            }
+                    ) {
+                        // TODO(soboleva): this box should not be needed after b/154758475 is fixed.
+                        Box(Modifier.requiredSize(boxSize.toDp()))
+                    }
+                }
+            }
+
+            rule.onNodeWithTag("box").assertExists()
+            rule.runOnIdle {
+                Assert.assertEquals(containerWidth.roundToPx() - boxSize + offsetX, positionX)
+                Assert.assertEquals(offsetY, positionY)
+            }
         }
-    }
 
     @Test
     fun testOffsetInspectableValue() {
         val modifier = Modifier.offset(3.0.dp, 4.5.dp) as InspectableValue
         assertThat(modifier.nameFallback).isEqualTo("offset")
         assertThat(modifier.valueOverride).isNull()
-        assertThat(modifier.inspectableElements.asIterable()).containsExactly(
-            ValueElement("x", 3.0.dp),
-            ValueElement("y", 4.5.dp)
-        )
+        assertThat(modifier.inspectableElements.asIterable())
+            .containsExactly(ValueElement("x", 3.0.dp), ValueElement("y", 4.5.dp))
     }
 
     @Test
@@ -340,10 +335,8 @@
         val modifier = Modifier.absoluteOffset(3.0.dp, 1.5.dp) as InspectableValue
         assertThat(modifier.nameFallback).isEqualTo("absoluteOffset")
         assertThat(modifier.valueOverride).isNull()
-        assertThat(modifier.inspectableElements.asIterable()).containsExactly(
-            ValueElement("x", 3.0.dp),
-            ValueElement("y", 1.5.dp)
-        )
+        assertThat(modifier.inspectableElements.asIterable())
+            .containsExactly(ValueElement("x", 3.0.dp), ValueElement("y", 1.5.dp))
     }
 
     @Test
@@ -370,21 +363,14 @@
         var offset by mutableStateOf(0f)
         rule.setContent {
             Box(
-                Modifier
-                    .requiredSize(10.dp)
+                Modifier.requiredSize(10.dp)
                     .offset { IntOffset(offset.roundToInt(), 0) }
-                    .drawBehind {
-                        contentRedrawsCount ++
-                    }
+                    .drawBehind { contentRedrawsCount++ }
             )
         }
 
-        rule.runOnIdle {
-            offset = 5f
-        }
+        rule.runOnIdle { offset = 5f }
 
-        rule.runOnIdle {
-            assertEquals(1, contentRedrawsCount)
-        }
+        rule.runOnIdle { assertEquals(1, contentRedrawsCount) }
     }
 }
diff --git a/compose/foundation/foundation-layout/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/layout/PaddingTest.kt b/compose/foundation/foundation-layout/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/layout/PaddingTest.kt
index ec53b66..c11a39ae 100644
--- a/compose/foundation/foundation-layout/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/layout/PaddingTest.kt
+++ b/compose/foundation/foundation-layout/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/layout/PaddingTest.kt
@@ -62,52 +62,37 @@
         isDebugInspectorInfoEnabled = false
     }
 
-    /**
-     * Tests that negative start padding is not allowed.
-     */
+    /** Tests that negative start padding is not allowed. */
     @Test(expected = IllegalArgumentException::class)
     fun negativeStartPadding_throws() {
         Modifier.padding(start = -1f.dp)
     }
 
-    /**
-     * Tests that negative top padding is not allowed.
-     */
+    /** Tests that negative top padding is not allowed. */
     @Test(expected = IllegalArgumentException::class)
     fun negativeTopPadding_throws() {
         Modifier.padding(top = -1f.dp)
     }
 
-    /**
-     * Tests that negative end padding is not allowed.
-     */
+    /** Tests that negative end padding is not allowed. */
     @Test(expected = IllegalArgumentException::class)
     fun negativeEndPadding_throws() {
         Modifier.padding(end = -1f.dp)
     }
 
-    /**
-     * Tests that negative bottom padding is not allowed.
-     */
+    /** Tests that negative bottom padding is not allowed. */
     @Test(expected = IllegalArgumentException::class)
     fun negativeBottomPadding_throws() {
         Modifier.padding(bottom = -1f.dp)
     }
 
-    /**
-     * Tests that the [padding]-all and [padding] factories return equivalent modifiers.
-     */
+    /** Tests that the [padding]-all and [padding] factories return equivalent modifiers. */
     @Test
     fun allEqualToAbsoluteWithExplicitSides() {
-        Assert.assertEquals(
-            Modifier.padding(10.dp, 10.dp, 10.dp, 10.dp),
-            Modifier.padding(10.dp)
-        )
+        Assert.assertEquals(Modifier.padding(10.dp, 10.dp, 10.dp, 10.dp), Modifier.padding(10.dp))
     }
 
-    /**
-     * Tests that the symmetrical-[padding] and [padding] factories return equivalent modifiers.
-     */
+    /** Tests that the symmetrical-[padding] and [padding] factories return equivalent modifiers. */
     @Test
     fun symmetricEqualToAbsoluteWithExplicitSides() {
         Assert.assertEquals(
@@ -117,32 +102,33 @@
     }
 
     /**
-     * Tests the top-level [padding] modifier factory with a single "all sides" argument,
-     * checking that a uniform padding of all sides is applied to a child when plenty of space is
-     * available for both content and padding.
+     * Tests the top-level [padding] modifier factory with a single "all sides" argument, checking
+     * that a uniform padding of all sides is applied to a child when plenty of space is available
+     * for both content and padding.
      */
     @Test
-    fun paddingAllAppliedToChild() = with(density) {
-        val padding = 10.dp
-        testPaddingIsAppliedImplementation(padding) { child: @Composable () -> Unit ->
-            TestBox(modifier = Modifier.padding(padding), content = child)
+    fun paddingAllAppliedToChild() =
+        with(density) {
+            val padding = 10.dp
+            testPaddingIsAppliedImplementation(padding) { child: @Composable () -> Unit ->
+                TestBox(modifier = Modifier.padding(padding), content = child)
+            }
         }
-    }
 
     /**
-     * Tests the top-level [padding] modifier factory with a single [PaddingValues]
-     * argument, checking that padding is applied to a child when plenty of space
-     * is available for both content and padding.
+     * Tests the top-level [padding] modifier factory with a single [PaddingValues] argument,
+     * checking that padding is applied to a child when plenty of space is available for both
+     * content and padding.
      */
     @Test
-    fun paddingPaddingValuesAppliedToChild() = with(density) {
-        val padding = PaddingValues(start = 1.dp, top = 3.dp, end = 6.dp, bottom = 10.dp)
-        testPaddingWithDifferentInsetsImplementation(
-            1.dp, 3.dp, 6.dp, 10.dp
-        ) { child: @Composable () -> Unit ->
-            TestBox(modifier = Modifier.padding(padding), content = child)
+    fun paddingPaddingValuesAppliedToChild() =
+        with(density) {
+            val padding = PaddingValues(start = 1.dp, top = 3.dp, end = 6.dp, bottom = 10.dp)
+            testPaddingWithDifferentInsetsImplementation(1.dp, 3.dp, 6.dp, 10.dp) {
+                child: @Composable () -> Unit ->
+                TestBox(modifier = Modifier.padding(padding), content = child)
+            }
         }
-    }
 
     /**
      * Tests the top-level [absolutePadding] modifier factory with different values for left, top,
@@ -168,269 +154,268 @@
 
     /**
      * Tests the top-level [absolutePadding] modifier factory with a single [PaddingValues.Absolute]
-     * argument, checking that padding is applied to a child when plenty of space
-     * is available for both content and padding.
+     * argument, checking that padding is applied to a child when plenty of space is available for
+     * both content and padding.
      */
     @Test
-    fun paddingAbsolutePaddingValuesAppliedToChild() = with(density) {
-        val padding = PaddingValues.Absolute(left = 1.dp, top = 3.dp, right = 6.dp, bottom = 10.dp)
-        testPaddingWithDifferentInsetsImplementation(
-            1.dp, 3.dp, 6.dp, 10.dp
-        ) { child: @Composable () -> Unit ->
-            TestBox(modifier = Modifier.padding(padding), content = child)
+    fun paddingAbsolutePaddingValuesAppliedToChild() =
+        with(density) {
+            val padding =
+                PaddingValues.Absolute(left = 1.dp, top = 3.dp, right = 6.dp, bottom = 10.dp)
+            testPaddingWithDifferentInsetsImplementation(1.dp, 3.dp, 6.dp, 10.dp) {
+                child: @Composable () -> Unit ->
+                TestBox(modifier = Modifier.padding(padding), content = child)
+            }
         }
-    }
 
     /**
-     * Tests the result of the [padding] modifier factory when not enough space is
-     * available to accommodate both the padding and the content. In this case, the padding
-     * should still be applied, modifying the final position of the content by its left and top
-     * paddings even if it would result in constraints that the child content is unable or
-     * unwilling to satisfy.
+     * Tests the result of the [padding] modifier factory when not enough space is available to
+     * accommodate both the padding and the content. In this case, the padding should still be
+     * applied, modifying the final position of the content by its left and top paddings even if it
+     * would result in constraints that the child content is unable or unwilling to satisfy.
      */
     @Test
-    fun insufficientSpaceAvailable() = with(density) {
-        val padding = 30.dp
-        testPaddingWithInsufficientSpaceImplementation(padding) { child: @Composable () -> Unit ->
-            TestBox(modifier = Modifier.padding(padding), content = child)
+    fun insufficientSpaceAvailable() =
+        with(density) {
+            val padding = 30.dp
+            testPaddingWithInsufficientSpaceImplementation(padding) { child: @Composable () -> Unit
+                ->
+                TestBox(modifier = Modifier.padding(padding), content = child)
+            }
         }
-    }
 
     @Test
-    fun intrinsicMeasurements() = with(density) {
-        val padding = 100.toDp()
+    fun intrinsicMeasurements() =
+        with(density) {
+            val padding = 100.toDp()
 
-        val latch = CountDownLatch(1)
-        var error: Throwable? = null
-        testIntrinsics(
-            @Composable {
-                TestBox(modifier = Modifier.padding(padding)) {
-                    Container(Modifier.aspectRatio(2f)) { }
+            val latch = CountDownLatch(1)
+            var error: Throwable? = null
+            testIntrinsics(
+                @Composable {
+                    TestBox(modifier = Modifier.padding(padding)) {
+                        Container(Modifier.aspectRatio(2f)) {}
+                    }
+                }
+            ) { minIntrinsicWidth, minIntrinsicHeight, maxIntrinsicWidth, maxIntrinsicHeight ->
+                // Spacing is applied on both sides of an axis
+                val totalAxisSpacing = (padding * 2).roundToPx()
+
+                // When the width/height is measured as 3 x the padding
+                val testDimension = (padding * 3).roundToPx()
+                // The actual dimension for the AspectRatio will be: test dimension - total padding
+                val actualAspectRatioDimension = testDimension - totalAxisSpacing
+
+                // When we measure the width first, the height will be half
+                val expectedAspectRatioHeight = (actualAspectRatioDimension / 2f).roundToInt()
+                // When we measure the height first, the width will be double
+                val expectedAspectRatioWidth = actualAspectRatioDimension * 2
+
+                // Add back the padding on both sides to get the total expected height
+                val expectedTotalHeight = expectedAspectRatioHeight + totalAxisSpacing
+                // Add back the padding on both sides to get the total expected height
+                val expectedTotalWidth = expectedAspectRatioWidth + totalAxisSpacing
+
+                try {
+                    // Min width.
+                    assertEquals(totalAxisSpacing, minIntrinsicWidth(0.dp.roundToPx()))
+                    assertEquals(expectedTotalWidth, minIntrinsicWidth(testDimension))
+                    assertEquals(totalAxisSpacing, minIntrinsicWidth(Constraints.Infinity))
+                    // Min height.
+                    assertEquals(totalAxisSpacing, minIntrinsicHeight(0.dp.roundToPx()))
+                    assertEquals(expectedTotalHeight, minIntrinsicHeight(testDimension))
+                    assertEquals(totalAxisSpacing, minIntrinsicHeight(Constraints.Infinity))
+                    // Max width.
+                    assertEquals(totalAxisSpacing, maxIntrinsicWidth(0.dp.roundToPx()))
+                    assertEquals(expectedTotalWidth, maxIntrinsicWidth(testDimension))
+                    assertEquals(totalAxisSpacing, maxIntrinsicWidth(Constraints.Infinity))
+                    // Max height.
+                    assertEquals(totalAxisSpacing, maxIntrinsicHeight(0.dp.roundToPx()))
+                    assertEquals(expectedTotalHeight, maxIntrinsicHeight(testDimension))
+                    assertEquals(totalAxisSpacing, maxIntrinsicHeight(Constraints.Infinity))
+                } catch (t: Throwable) {
+                    error = t
+                } finally {
+                    latch.countDown()
                 }
             }
-        ) { minIntrinsicWidth, minIntrinsicHeight, maxIntrinsicWidth, maxIntrinsicHeight ->
-            // Spacing is applied on both sides of an axis
-            val totalAxisSpacing = (padding * 2).roundToPx()
 
-            // When the width/height is measured as 3 x the padding
-            val testDimension = (padding * 3).roundToPx()
-            // The actual dimension for the AspectRatio will be: test dimension - total padding
-            val actualAspectRatioDimension = testDimension - totalAxisSpacing
+            assertTrue(latch.await(1, TimeUnit.SECONDS))
+            error?.let { throw it }
 
-            // When we measure the width first, the height will be half
-            val expectedAspectRatioHeight = (actualAspectRatioDimension / 2f).roundToInt()
-            // When we measure the height first, the width will be double
-            val expectedAspectRatioWidth = actualAspectRatioDimension * 2
-
-            // Add back the padding on both sides to get the total expected height
-            val expectedTotalHeight = expectedAspectRatioHeight + totalAxisSpacing
-            // Add back the padding on both sides to get the total expected height
-            val expectedTotalWidth = expectedAspectRatioWidth + totalAxisSpacing
-
-            try {
-                // Min width.
-                assertEquals(totalAxisSpacing, minIntrinsicWidth(0.dp.roundToPx()))
-                assertEquals(expectedTotalWidth, minIntrinsicWidth(testDimension))
-                assertEquals(totalAxisSpacing, minIntrinsicWidth(Constraints.Infinity))
-                // Min height.
-                assertEquals(totalAxisSpacing, minIntrinsicHeight(0.dp.roundToPx()))
-                assertEquals(expectedTotalHeight, minIntrinsicHeight(testDimension))
-                assertEquals(totalAxisSpacing, minIntrinsicHeight(Constraints.Infinity))
-                // Max width.
-                assertEquals(totalAxisSpacing, maxIntrinsicWidth(0.dp.roundToPx()))
-                assertEquals(expectedTotalWidth, maxIntrinsicWidth(testDimension))
-                assertEquals(totalAxisSpacing, maxIntrinsicWidth(Constraints.Infinity))
-                // Max height.
-                assertEquals(totalAxisSpacing, maxIntrinsicHeight(0.dp.roundToPx()))
-                assertEquals(expectedTotalHeight, maxIntrinsicHeight(testDimension))
-                assertEquals(totalAxisSpacing, maxIntrinsicHeight(Constraints.Infinity))
-            } catch (t: Throwable) {
-                error = t
-            } finally {
-                latch.countDown()
-            }
+            Unit
         }
 
-        assertTrue(latch.await(1, TimeUnit.SECONDS))
-        error?.let { throw it }
-
-        Unit
-    }
-
     @Test
-    fun testPadding_rtl() = with(density) {
-        val sizeDp = 100.toDp()
-        val size = sizeDp.roundToPx()
-        val padding1Dp = 5.dp
-        val padding2Dp = 10.dp
-        val padding3Dp = 15.dp
-        val padding1 = padding1Dp.roundToPx()
-        val padding2 = padding2Dp.roundToPx()
-        val padding3 = padding3Dp.roundToPx()
+    fun testPadding_rtl() =
+        with(density) {
+            val sizeDp = 100.toDp()
+            val size = sizeDp.roundToPx()
+            val padding1Dp = 5.dp
+            val padding2Dp = 10.dp
+            val padding3Dp = 15.dp
+            val padding1 = padding1Dp.roundToPx()
+            val padding2 = padding2Dp.roundToPx()
+            val padding3 = padding3Dp.roundToPx()
 
-        val drawLatch = CountDownLatch(3)
-        val childSize = Array(3) { IntSize(0, 0) }
-        val childPosition = Array(3) { Offset(0f, 0f) }
+            val drawLatch = CountDownLatch(3)
+            val childSize = Array(3) { IntSize(0, 0) }
+            val childPosition = Array(3) { Offset(0f, 0f) }
 
-        // ltr: P1 S P2 | S P3 | P1 S
-        // rtl:    S P1 | P3 S | P2 S P1
-        show {
-            DeviceConfigurationOverride(
-                DeviceConfigurationOverride.LayoutDirection(LayoutDirection.Rtl)
-            ) {
-                Row(Modifier.fillMaxSize()) {
-                    Box(
-                        Modifier.padding(start = padding1Dp, end = padding2Dp)
-                            .size(sizeDp, sizeDp)
-                            .onGloballyPositioned { coordinates: LayoutCoordinates ->
-                                childSize[0] = coordinates.size
-                                childPosition[0] = coordinates.positionInRoot()
-                                drawLatch.countDown()
-                            }
-                    ) {
-                    }
+            // ltr: P1 S P2 | S P3 | P1 S
+            // rtl:    S P1 | P3 S | P2 S P1
+            show {
+                DeviceConfigurationOverride(
+                    DeviceConfigurationOverride.LayoutDirection(LayoutDirection.Rtl)
+                ) {
+                    Row(Modifier.fillMaxSize()) {
+                        Box(
+                            Modifier.padding(start = padding1Dp, end = padding2Dp)
+                                .size(sizeDp, sizeDp)
+                                .onGloballyPositioned { coordinates: LayoutCoordinates ->
+                                    childSize[0] = coordinates.size
+                                    childPosition[0] = coordinates.positionInRoot()
+                                    drawLatch.countDown()
+                                }
+                        ) {}
 
-                    Box(
-                        Modifier.padding(end = padding3Dp)
-                            .size(sizeDp, sizeDp)
-                            .onGloballyPositioned { coordinates: LayoutCoordinates ->
-                                childSize[1] = coordinates.size
-                                childPosition[1] = coordinates.positionInRoot()
-                                drawLatch.countDown()
-                            }
-                    ) {
-                    }
+                        Box(
+                            Modifier.padding(end = padding3Dp)
+                                .size(sizeDp, sizeDp)
+                                .onGloballyPositioned { coordinates: LayoutCoordinates ->
+                                    childSize[1] = coordinates.size
+                                    childPosition[1] = coordinates.positionInRoot()
+                                    drawLatch.countDown()
+                                }
+                        ) {}
 
-                    Box(
-                        Modifier.padding(start = padding1Dp)
-                            .size(sizeDp, sizeDp)
-                            .onGloballyPositioned { coordinates: LayoutCoordinates ->
-                                childSize[2] = coordinates.size
-                                childPosition[2] = coordinates.positionInRoot()
-                                drawLatch.countDown()
-                            }
-                    ) {
+                        Box(
+                            Modifier.padding(start = padding1Dp)
+                                .size(sizeDp, sizeDp)
+                                .onGloballyPositioned { coordinates: LayoutCoordinates ->
+                                    childSize[2] = coordinates.size
+                                    childPosition[2] = coordinates.positionInRoot()
+                                    drawLatch.countDown()
+                                }
+                        ) {}
                     }
                 }
             }
+            assertTrue(drawLatch.await(1, TimeUnit.SECONDS))
+            val root = findComposeView()
+            waitForDraw(root)
+
+            val rootWidth = root.width
+            //        S P1 | P3 S | P2 S P1
+            assertEquals(Offset((rootWidth - padding1 - size).toFloat(), 0f), childPosition[0])
+            assertEquals(IntSize(size, size), childSize[0])
+
+            assertEquals(
+                Offset((rootWidth - padding1 - padding2 - size * 2).toFloat(), 0f),
+                childPosition[1]
+            )
+            assertEquals(IntSize(size, size), childSize[1])
+
+            assertEquals(
+                Offset((rootWidth - size * 3 - padding1 * 2 - padding2 - padding3).toFloat(), 0f),
+                childPosition[2]
+            )
+            assertEquals(IntSize(size, size), childSize[2])
         }
-        assertTrue(drawLatch.await(1, TimeUnit.SECONDS))
-        val root = findComposeView()
-        waitForDraw(root)
-
-        val rootWidth = root.width
-//        S P1 | P3 S | P2 S P1
-        assertEquals(Offset((rootWidth - padding1 - size).toFloat(), 0f), childPosition[0])
-        assertEquals(IntSize(size, size), childSize[0])
-
-        assertEquals(
-            Offset((rootWidth - padding1 - padding2 - size * 2).toFloat(), 0f),
-            childPosition[1]
-        )
-        assertEquals(IntSize(size, size), childSize[1])
-
-        assertEquals(
-            Offset((rootWidth - size * 3 - padding1 * 2 - padding2 - padding3).toFloat(), 0f),
-            childPosition[2]
-        )
-        assertEquals(IntSize(size, size), childSize[2])
-    }
 
     @Test
-    fun testAbsolutePadding_rtl() = with(density) {
-        val sizeDp = 100.toDp()
-        val size = sizeDp.roundToPx()
-        val padding1Dp = 5.dp
-        val padding2Dp = 10.dp
-        val padding3Dp = 15.dp
-        val padding1 = padding1Dp.roundToPx()
-        val padding2 = padding2Dp.roundToPx()
-        val padding3 = padding3Dp.roundToPx()
+    fun testAbsolutePadding_rtl() =
+        with(density) {
+            val sizeDp = 100.toDp()
+            val size = sizeDp.roundToPx()
+            val padding1Dp = 5.dp
+            val padding2Dp = 10.dp
+            val padding3Dp = 15.dp
+            val padding1 = padding1Dp.roundToPx()
+            val padding2 = padding2Dp.roundToPx()
+            val padding3 = padding3Dp.roundToPx()
 
-        val drawLatch = CountDownLatch(2)
-        val childPosition = Array(2) { Offset(0f, 0f) }
+            val drawLatch = CountDownLatch(2)
+            val childPosition = Array(2) { Offset(0f, 0f) }
 
-        // ltr: P1 S P2 | S P3
-        // rtl:    S P3 | P1 S P2
-        show {
-            DeviceConfigurationOverride(
-                DeviceConfigurationOverride.LayoutDirection(LayoutDirection.Rtl)
-            ) {
-                Row(Modifier.fillMaxSize()) {
-                    Box(
-                        Modifier.absolutePadding(left = padding1Dp, right = padding2Dp)
-                            .size(sizeDp, sizeDp)
-                            .onGloballyPositioned { coordinates: LayoutCoordinates ->
-                                childPosition[0] = coordinates.positionInRoot()
-                                drawLatch.countDown()
-                            }
-                    ) {
-                    }
-                    Box(
-                        Modifier.absolutePadding(right = padding3Dp)
-                            .size(sizeDp, sizeDp)
-                            .onGloballyPositioned { coordinates: LayoutCoordinates ->
-                                childPosition[1] = coordinates.positionInRoot()
-                                drawLatch.countDown()
-                            }
-                    ) {
+            // ltr: P1 S P2 | S P3
+            // rtl:    S P3 | P1 S P2
+            show {
+                DeviceConfigurationOverride(
+                    DeviceConfigurationOverride.LayoutDirection(LayoutDirection.Rtl)
+                ) {
+                    Row(Modifier.fillMaxSize()) {
+                        Box(
+                            Modifier.absolutePadding(left = padding1Dp, right = padding2Dp)
+                                .size(sizeDp, sizeDp)
+                                .onGloballyPositioned { coordinates: LayoutCoordinates ->
+                                    childPosition[0] = coordinates.positionInRoot()
+                                    drawLatch.countDown()
+                                }
+                        ) {}
+                        Box(
+                            Modifier.absolutePadding(right = padding3Dp)
+                                .size(sizeDp, sizeDp)
+                                .onGloballyPositioned { coordinates: LayoutCoordinates ->
+                                    childPosition[1] = coordinates.positionInRoot()
+                                    drawLatch.countDown()
+                                }
+                        ) {}
                     }
                 }
             }
+            assertTrue(drawLatch.await(1, TimeUnit.SECONDS))
+
+            val root = findComposeView()
+            waitForDraw(root)
+            val rootWidth = root.width
+
+            assertEquals(Offset((rootWidth - padding2 - size).toFloat(), 0f), childPosition[0])
+
+            assertEquals(
+                Offset((rootWidth - size * 2 - padding1 - padding2 - padding3).toFloat(), 0f),
+                childPosition[1]
+            )
         }
-        assertTrue(drawLatch.await(1, TimeUnit.SECONDS))
-
-        val root = findComposeView()
-        waitForDraw(root)
-        val rootWidth = root.width
-
-        assertEquals(Offset((rootWidth - padding2 - size).toFloat(), 0f), childPosition[0])
-
-        assertEquals(
-            Offset((rootWidth - size * 2 - padding1 - padding2 - padding3).toFloat(), 0f),
-            childPosition[1]
-        )
-    }
 
     @Test
-    fun testPaddingValuesRtl() = with(density) {
-        val latch = CountDownLatch(1)
-        val boxSize = 10
-        val startPadding = 1
-        val endPadding = 2
-        show {
-            DeviceConfigurationOverride(
-                DeviceConfigurationOverride.LayoutDirection(LayoutDirection.Rtl)
-            ) {
-                Box(
-                    Modifier
-                        .size(boxSize.toDp())
-                        .padding(
-                            PaddingValues(
-                                start = startPadding.toDp(),
-                                end = endPadding.toDp()
+    fun testPaddingValuesRtl() =
+        with(density) {
+            val latch = CountDownLatch(1)
+            val boxSize = 10
+            val startPadding = 1
+            val endPadding = 2
+            show {
+                DeviceConfigurationOverride(
+                    DeviceConfigurationOverride.LayoutDirection(LayoutDirection.Rtl)
+                ) {
+                    Box(
+                        Modifier.size(boxSize.toDp())
+                            .padding(
+                                PaddingValues(start = startPadding.toDp(), end = endPadding.toDp())
                             )
-                        ).onGloballyPositioned {
-                            assertEquals(boxSize - startPadding - endPadding, it.size.width)
-                            latch.countDown()
-                        }
-                )
+                            .onGloballyPositioned {
+                                assertEquals(boxSize - startPadding - endPadding, it.size.width)
+                                latch.countDown()
+                            }
+                    )
+                }
             }
+            assertTrue(latch.await(1, TimeUnit.SECONDS))
         }
-        assertTrue(latch.await(1, TimeUnit.SECONDS))
-    }
 
     @Test
     fun testInspectableParameter() {
         val modifier = Modifier.padding(10.dp, 20.dp, 30.dp, 40.dp) as InspectableValue
         assertThat(modifier.nameFallback).isEqualTo("padding")
         assertThat(modifier.valueOverride).isNull()
-        assertThat(modifier.inspectableElements.toList()).containsExactly(
-            ValueElement("start", 10.dp),
-            ValueElement("top", 20.dp),
-            ValueElement("end", 30.dp),
-            ValueElement("bottom", 40.dp)
-        )
+        assertThat(modifier.inspectableElements.toList())
+            .containsExactly(
+                ValueElement("start", 10.dp),
+                ValueElement("top", 20.dp),
+                ValueElement("end", 30.dp),
+                ValueElement("bottom", 40.dp)
+            )
     }
 
     @Test
@@ -438,10 +423,8 @@
         val modifier = Modifier.padding(10.dp, 20.dp) as InspectableValue
         assertThat(modifier.nameFallback).isEqualTo("padding")
         assertThat(modifier.valueOverride).isNull()
-        assertThat(modifier.inspectableElements.toList()).containsExactly(
-            ValueElement("horizontal", 10.dp),
-            ValueElement("vertical", 20.dp)
-        )
+        assertThat(modifier.inspectableElements.toList())
+            .containsExactly(ValueElement("horizontal", 10.dp), ValueElement("vertical", 20.dp))
     }
 
     @Test
@@ -449,12 +432,13 @@
         val modifier = Modifier.absolutePadding(10.dp, 20.dp, 30.dp, 40.dp) as InspectableValue
         assertThat(modifier.nameFallback).isEqualTo("absolutePadding")
         assertThat(modifier.valueOverride).isNull()
-        assertThat(modifier.inspectableElements.toList()).containsExactly(
-            ValueElement("left", 10.dp),
-            ValueElement("top", 20.dp),
-            ValueElement("right", 30.dp),
-            ValueElement("bottom", 40.dp)
-        )
+        assertThat(modifier.inspectableElements.toList())
+            .containsExactly(
+                ValueElement("left", 10.dp),
+                ValueElement("top", 20.dp),
+                ValueElement("right", 30.dp),
+                ValueElement("bottom", 40.dp)
+            )
     }
 
     @Test
@@ -468,48 +452,47 @@
     private fun testPaddingIsAppliedImplementation(
         padding: Dp,
         paddingContainer: @Composable (@Composable () -> Unit) -> Unit
-    ) = with(density) {
-        val sizeDp = 50.dp
-        val size = sizeDp.roundToPx()
-        val paddingPx = padding.roundToPx()
+    ) =
+        with(density) {
+            val sizeDp = 50.dp
+            val size = sizeDp.roundToPx()
+            val paddingPx = padding.roundToPx()
 
-        val drawLatch = CountDownLatch(1)
-        var childSize = IntSize(-1, -1)
-        var childPosition = Offset(-1f, -1f)
-        show {
-            Box(Modifier.fillMaxSize()) {
-                ConstrainedBox(
-                    constraints = DpConstraints.fixed(sizeDp, sizeDp),
-                    modifier = Modifier.align(Alignment.Center)
-                ) {
-                    val content = @Composable {
-                        Container(
-                            Modifier.onGloballyPositioned { coordinates: LayoutCoordinates ->
-                                childSize = coordinates.size
-                                childPosition = coordinates.positionInRoot()
-                                drawLatch.countDown()
+            val drawLatch = CountDownLatch(1)
+            var childSize = IntSize(-1, -1)
+            var childPosition = Offset(-1f, -1f)
+            show {
+                Box(Modifier.fillMaxSize()) {
+                    ConstrainedBox(
+                        constraints = DpConstraints.fixed(sizeDp, sizeDp),
+                        modifier = Modifier.align(Alignment.Center)
+                    ) {
+                        val content =
+                            @Composable {
+                                Container(
+                                    Modifier.onGloballyPositioned { coordinates: LayoutCoordinates
+                                        ->
+                                        childSize = coordinates.size
+                                        childPosition = coordinates.positionInRoot()
+                                        drawLatch.countDown()
+                                    }
+                                ) {}
                             }
-                        ) {
-                        }
+                        paddingContainer(content)
                     }
-                    paddingContainer(content)
                 }
             }
+            assertTrue(drawLatch.await(1, TimeUnit.SECONDS))
+
+            val root = findComposeView()
+            waitForDraw(root)
+
+            val innerSize = (size - paddingPx * 2)
+            assertEquals(IntSize(innerSize, innerSize), childSize)
+            val left = ((root.width - size) / 2f).roundToInt() + paddingPx
+            val top = ((root.height - size) / 2f).roundToInt() + paddingPx
+            assertEquals(Offset(left.toFloat(), top.toFloat()), childPosition)
         }
-        assertTrue(drawLatch.await(1, TimeUnit.SECONDS))
-
-        val root = findComposeView()
-        waitForDraw(root)
-
-        val innerSize = (size - paddingPx * 2)
-        assertEquals(IntSize(innerSize, innerSize), childSize)
-        val left = ((root.width - size) / 2f).roundToInt() + paddingPx
-        val top = ((root.height - size) / 2f).roundToInt() + paddingPx
-        assertEquals(
-            Offset(left.toFloat(), top.toFloat()),
-            childPosition
-        )
-    }
 
     private fun testPaddingWithDifferentInsetsImplementation(
         left: Dp,
@@ -517,101 +500,97 @@
         right: Dp,
         bottom: Dp,
         paddingContainer: @Composable ((@Composable () -> Unit) -> Unit)
-    ) = with(density) {
-        val sizeDp = 50.dp
-        val size = sizeDp.roundToPx()
+    ) =
+        with(density) {
+            val sizeDp = 50.dp
+            val size = sizeDp.roundToPx()
 
-        val drawLatch = CountDownLatch(1)
-        var childSize = IntSize(-1, -1)
-        var childPosition = Offset(-1f, -1f)
-        show {
-            Box(Modifier.fillMaxSize()) {
-                ConstrainedBox(
-                    constraints = DpConstraints.fixed(sizeDp, sizeDp),
-                    modifier = Modifier.align(Alignment.Center)
-                ) {
-                    val content = @Composable {
-                        Container(
-                            Modifier.onGloballyPositioned { coordinates: LayoutCoordinates ->
-                                childSize = coordinates.size
-                                childPosition = coordinates.positionInRoot()
-                                drawLatch.countDown()
+            val drawLatch = CountDownLatch(1)
+            var childSize = IntSize(-1, -1)
+            var childPosition = Offset(-1f, -1f)
+            show {
+                Box(Modifier.fillMaxSize()) {
+                    ConstrainedBox(
+                        constraints = DpConstraints.fixed(sizeDp, sizeDp),
+                        modifier = Modifier.align(Alignment.Center)
+                    ) {
+                        val content =
+                            @Composable {
+                                Container(
+                                    Modifier.onGloballyPositioned { coordinates: LayoutCoordinates
+                                        ->
+                                        childSize = coordinates.size
+                                        childPosition = coordinates.positionInRoot()
+                                        drawLatch.countDown()
+                                    }
+                                ) {}
                             }
-                        ) {
-                        }
+                        paddingContainer(content)
                     }
-                    paddingContainer(content)
                 }
             }
+            assertTrue(drawLatch.await(1, TimeUnit.SECONDS))
+
+            val root = findComposeView()
+            waitForDraw(root)
+
+            val paddingLeft = left.roundToPx()
+            val paddingRight = right.roundToPx()
+            val paddingTop = top.roundToPx()
+            val paddingBottom = bottom.roundToPx()
+            assertEquals(
+                IntSize(size - paddingLeft - paddingRight, size - paddingTop - paddingBottom),
+                childSize
+            )
+            val viewLeft = ((root.width - size) / 2f).roundToInt() + paddingLeft
+            val viewTop = ((root.height - size) / 2f).roundToInt() + paddingTop
+            assertEquals(Offset(viewLeft.toFloat(), viewTop.toFloat()), childPosition)
         }
-        assertTrue(drawLatch.await(1, TimeUnit.SECONDS))
-
-        val root = findComposeView()
-        waitForDraw(root)
-
-        val paddingLeft = left.roundToPx()
-        val paddingRight = right.roundToPx()
-        val paddingTop = top.roundToPx()
-        val paddingBottom = bottom.roundToPx()
-        assertEquals(
-            IntSize(
-                size - paddingLeft - paddingRight,
-                size - paddingTop - paddingBottom
-            ),
-            childSize
-        )
-        val viewLeft = ((root.width - size) / 2f).roundToInt() + paddingLeft
-        val viewTop = ((root.height - size) / 2f).roundToInt() + paddingTop
-        assertEquals(
-            Offset(viewLeft.toFloat(), viewTop.toFloat()),
-            childPosition
-        )
-    }
 
     private fun testPaddingWithInsufficientSpaceImplementation(
         padding: Dp,
         paddingContainer: @Composable (@Composable () -> Unit) -> Unit
-    ) = with(density) {
-        val sizeDp = 50.dp
-        val size = sizeDp.roundToPx()
-        val paddingPx = padding.roundToPx()
+    ) =
+        with(density) {
+            val sizeDp = 50.dp
+            val size = sizeDp.roundToPx()
+            val paddingPx = padding.roundToPx()
 
-        val drawLatch = CountDownLatch(1)
-        var childSize = IntSize(-1, -1)
-        var childPosition = Offset(-1f, -1f)
-        show {
-            Box(Modifier.fillMaxSize()) {
-                ConstrainedBox(
-                    constraints = DpConstraints.fixed(sizeDp, sizeDp),
-                    modifier = Modifier.align(Alignment.Center)
-                ) {
-                    paddingContainer {
-                        Container(
-                            Modifier.onGloballyPositioned { coordinates: LayoutCoordinates ->
-                                childSize = coordinates.size
-                                childPosition = coordinates.positionInRoot()
-                                drawLatch.countDown()
-                            }
-                        ) {
+            val drawLatch = CountDownLatch(1)
+            var childSize = IntSize(-1, -1)
+            var childPosition = Offset(-1f, -1f)
+            show {
+                Box(Modifier.fillMaxSize()) {
+                    ConstrainedBox(
+                        constraints = DpConstraints.fixed(sizeDp, sizeDp),
+                        modifier = Modifier.align(Alignment.Center)
+                    ) {
+                        paddingContainer {
+                            Container(
+                                Modifier.onGloballyPositioned { coordinates: LayoutCoordinates ->
+                                    childSize = coordinates.size
+                                    childPosition = coordinates.positionInRoot()
+                                    drawLatch.countDown()
+                                }
+                            ) {}
                         }
                     }
                 }
             }
+            assertTrue(drawLatch.await(1, TimeUnit.SECONDS))
+
+            val root = findComposeView()
+            waitForDraw(root)
+
+            assertEquals(IntSize(0, 0), childSize)
+            val left = ((root.width - size) / 2f).roundToInt() + paddingPx
+            val top = ((root.height - size) / 2f).roundToInt() + paddingPx
+            assertEquals(Offset(left.toFloat(), top.toFloat()), childPosition)
         }
-        assertTrue(drawLatch.await(1, TimeUnit.SECONDS))
-
-        val root = findComposeView()
-        waitForDraw(root)
-
-        assertEquals(IntSize(0, 0), childSize)
-        val left = ((root.width - size) / 2f).roundToInt() + paddingPx
-        val top = ((root.height - size) / 2f).roundToInt() + paddingPx
-        assertEquals(Offset(left.toFloat(), top.toFloat()), childPosition)
-    }
 
     /**
-     * A trivial layout that applies a [Modifier] and measures/lays out a single child
-     * with the same constraints it received.
+     * A trivial layout that applies a [Modifier] and measures/lays out a single child with the same
+     * constraints it received.
      */
     @Composable
     private fun TestBox(modifier: Modifier = Modifier, content: @Composable () -> Unit) {
diff --git a/compose/foundation/foundation-layout/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/layout/RowColumnModifierTest.kt b/compose/foundation/foundation-layout/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/layout/RowColumnModifierTest.kt
index bec5e9b..2a853de 100644
--- a/compose/foundation/foundation-layout/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/layout/RowColumnModifierTest.kt
+++ b/compose/foundation/foundation-layout/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/layout/RowColumnModifierTest.kt
@@ -50,8 +50,7 @@
 @SmallTest
 @RunWith(AndroidJUnit4::class)
 class RowColumnModifierTest() {
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
     @Test
     fun testRow_updatesOnAlignmentChange() {
@@ -61,14 +60,12 @@
         rule.setContent {
             with(LocalDensity.current) {
                 Box(Modifier.size(100.toDp())) {
-                    Row(
-                        Modifier.wrapContentHeight()
-                    ) {
+                    Row(Modifier.wrapContentHeight()) {
                         repeat(5) { index ->
                             Box(
-                                Modifier
-                                    .size(
-                                        20.toDp(), if (index == 4) {
+                                Modifier.size(
+                                        20.toDp(),
+                                        if (index == 4) {
                                             10.toDp()
                                         } else {
                                             20.toDp()
@@ -80,7 +77,8 @@
                                             val positionInParent = it.positionInParent()
                                             positionInParentY = positionInParent.y
                                         }
-                                    })
+                                    }
+                            )
                         }
                     }
                 }
@@ -92,9 +90,7 @@
             alignment = Alignment.CenterVertically
         }
 
-        rule.runOnIdle {
-            Truth.assertThat(positionInParentY).isEqualTo(5)
-        }
+        rule.runOnIdle { Truth.assertThat(positionInParentY).isEqualTo(5) }
     }
 
     @Test
@@ -107,14 +103,12 @@
         rule.setContent {
             with(LocalDensity.current) {
                 Box(Modifier.size(100.toDp())) {
-                    Row(
-                        Modifier.wrapContentHeight()
-                    ) {
+                    Row(Modifier.wrapContentHeight()) {
                         repeat(5) { index ->
                             Box(
-                                Modifier
-                                    .size(
-                                        20.toDp(), if (index == 4) {
+                                Modifier.size(
+                                        20.toDp(),
+                                        if (index == 4) {
                                             10.toDp()
                                         } else {
                                             20.toDp()
@@ -132,7 +126,8 @@
                                             val positionInParent = it.positionInParent()
                                             positionInParentY = positionInParent.y
                                         }
-                                    })
+                                    }
+                            )
                         }
                     }
                 }
@@ -144,9 +139,7 @@
             alignment = alignByNewBlock
         }
 
-        rule.runOnIdle {
-            Truth.assertThat(positionInParentY).isEqualTo(5)
-        }
+        rule.runOnIdle { Truth.assertThat(positionInParentY).isEqualTo(5) }
     }
 
     @Test
@@ -157,25 +150,17 @@
         rule.setContent {
             with(LocalDensity.current) {
                 Box(Modifier.size(200.toDp())) {
-                    Row(
-                        Modifier.wrapContentHeight()
-                    ) {
+                    Row(Modifier.wrapContentHeight()) {
                         repeat(5) { index ->
                             Box(
-                                Modifier
-                                    .size(
-                                        20.toDp()
-                                    )
-                                    .weight(1f, fill)
-                                    .onSizeChanged {
-                                        if (index > 0) {
-                                            Truth
-                                                .assertThat(it.width)
-                                                .isEqualTo(width)
-                                        } else {
-                                            width = it.width
-                                        }
-                                    })
+                                Modifier.size(20.toDp()).weight(1f, fill).onSizeChanged {
+                                    if (index > 0) {
+                                        Truth.assertThat(it.width).isEqualTo(width)
+                                    } else {
+                                        width = it.width
+                                    }
+                                }
+                            )
                         }
                     }
                 }
@@ -187,9 +172,7 @@
             fill = true
         }
 
-        rule.runOnIdle {
-            Truth.assertThat(width).isEqualTo(40)
-        }
+        rule.runOnIdle { Truth.assertThat(width).isEqualTo(40) }
     }
 
     @Test
@@ -202,14 +185,12 @@
         rule.setContent {
             with(LocalDensity.current) {
                 Box(Modifier.size(200.toDp())) {
-                    Row(
-                        Modifier.wrapContentHeight()
-                    ) {
+                    Row(Modifier.wrapContentHeight()) {
                         repeat(5) { index ->
                             Box(
-                                Modifier
-                                    .size(
-                                        20.toDp(), if (index == 4) {
+                                Modifier.size(
+                                        20.toDp(),
+                                        if (index == 4) {
                                             10.toDp()
                                         } else {
                                             20.toDp()
@@ -218,9 +199,7 @@
                                     .weight(1f, fill)
                                     .onSizeChanged {
                                         if (index > 0) {
-                                            Truth
-                                                .assertThat(it.width)
-                                                .isEqualTo(width)
+                                            Truth.assertThat(it.width).isEqualTo(width)
                                         } else {
                                             width = it.width
                                         }
@@ -231,7 +210,8 @@
                                             val positionInParent = it.positionInParent()
                                             positionInParentY = positionInParent.y
                                         }
-                                    })
+                                    }
+                            )
                         }
                     }
                 }
@@ -257,45 +237,28 @@
         var totalFakeTextPlaced = 0
 
         rule.setContent {
-            Row(
-                Modifier
-                    .width(200.dp)
-                    .background(Color.Green)
-                    .height(IntrinsicSize.Max)
-            ) {
-                Box(
-                    modifier = Modifier
-                        .size(24.dp)
-                        .background(Color.Blue)
-                )
+            Row(Modifier.width(200.dp).background(Color.Green).height(IntrinsicSize.Max)) {
+                Box(modifier = Modifier.size(24.dp).background(Color.Blue))
 
                 Column(Modifier.wrapContentHeight()) {
-                    FakeText(modifier = Modifier.onPlaced {
-                        totalFakeTextPlaced++
-                    }, text = "Text")
+                    FakeText(modifier = Modifier.onPlaced { totalFakeTextPlaced++ }, text = "Text")
                     FlowRow(Modifier) {
                         FakeText(
-                            modifier = Modifier.onPlaced {
-                                totalFakeTextPlaced++
-                        }, text = "Really long text 1")
-                        FakeText(modifier = Modifier.onPlaced {
-                            totalFakeTextPlaced++
-                        }, text = "Really long text 2")
+                            modifier = Modifier.onPlaced { totalFakeTextPlaced++ },
+                            text = "Really long text 1"
+                        )
+                        FakeText(
+                            modifier = Modifier.onPlaced { totalFakeTextPlaced++ },
+                            text = "Really long text 2"
+                        )
                     }
                 }
 
-                Box(
-                    modifier = Modifier
-                        .width(120.dp)
-                        .height(60.dp)
-                        .background(Color.Red)
-                )
+                Box(modifier = Modifier.width(120.dp).height(60.dp).background(Color.Red))
             }
         }
 
-        rule.runOnIdle {
-            Truth.assertThat(totalFakeTextPlaced).isEqualTo(3)
-        }
+        rule.runOnIdle { Truth.assertThat(totalFakeTextPlaced).isEqualTo(3) }
     }
 
     @OptIn(ExperimentalLayoutApi::class)
@@ -304,44 +267,37 @@
         var totalFakeTextPlaced = 0
         val forRow = false
         rule.setContent {
-            Column(
-                Modifier
-                    .height(176.dp)
-                    .background(Color.Green)
-                    .width(IntrinsicSize.Max)
-            ) {
+            Column(Modifier.height(176.dp).background(Color.Green).width(IntrinsicSize.Max)) {
                 Row(Modifier.wrapContentWidth()) {
-                    FakeText(modifier = Modifier.onPlaced {
-                        totalFakeTextPlaced++
-                    }, text = "Text", forRow)
+                    FakeText(
+                        modifier = Modifier.onPlaced { totalFakeTextPlaced++ },
+                        text = "Text",
+                        forRow
+                    )
                     FlowColumn(Modifier) {
                         FakeText(
-                            modifier = Modifier.onPlaced {
-                                totalFakeTextPlaced++
-                            }, text = "Really long text 1", forRow)
-                        FakeText(modifier = Modifier.onPlaced {
-                            totalFakeTextPlaced++
-                        }, text = "Really long text 2", forRow)
+                            modifier = Modifier.onPlaced { totalFakeTextPlaced++ },
+                            text = "Really long text 1",
+                            forRow
+                        )
+                        FakeText(
+                            modifier = Modifier.onPlaced { totalFakeTextPlaced++ },
+                            text = "Really long text 2",
+                            forRow
+                        )
                     }
                 }
 
-                Box(
-                    modifier = Modifier
-                        .width(60.dp)
-                        .height(120.dp)
-                        .background(Color.Red)
-                )
+                Box(modifier = Modifier.width(60.dp).height(120.dp).background(Color.Red))
             }
         }
 
-        rule.runOnIdle {
-            Truth.assertThat(totalFakeTextPlaced).isEqualTo(3)
-        }
+        rule.runOnIdle { Truth.assertThat(totalFakeTextPlaced).isEqualTo(3) }
     }
 
     /**
-     * @param forRow creates the bug setting for row. Otherwise, make it work for Column
-     * by laying out the text top to bottom.
+     * @param forRow creates the bug setting for row. Otherwise, make it work for Column by laying
+     *   out the text top to bottom.
      */
     @Composable
     fun FakeText(modifier: Modifier = Modifier, text: String, forRow: Boolean = true) {
@@ -353,89 +309,89 @@
         Layout(
             content = {},
             modifier = modifier,
-            measurePolicy = object : MeasurePolicy {
-                override fun MeasureScope.measure(
-                    measurables: List<Measurable>,
-                    constraints: Constraints
-                ): MeasureResult {
-                    val constraintsIndependent = OrientationIndependentConstraints(
-                        constraints,
-                        orientation
-                    )
-                    val maxMainAxis = constraintsIndependent.mainAxisMax
-                    val lengthNeeded = text.length * characterSizeMainAxis.roundToPx()
-                    val crossAxis = getCrossAxisNeeded(maxMainAxis)
-                    val mainAxis = lengthNeeded.coerceAtMost(maxMainAxis)
+            measurePolicy =
+                object : MeasurePolicy {
+                    override fun MeasureScope.measure(
+                        measurables: List<Measurable>,
+                        constraints: Constraints
+                    ): MeasureResult {
+                        val constraintsIndependent =
+                            OrientationIndependentConstraints(constraints, orientation)
+                        val maxMainAxis = constraintsIndependent.mainAxisMax
+                        val lengthNeeded = text.length * characterSizeMainAxis.roundToPx()
+                        val crossAxis = getCrossAxisNeeded(maxMainAxis)
+                        val mainAxis = lengthNeeded.coerceAtMost(maxMainAxis)
 
-                    var width: Int
-                    var height: Int
-                    if (forRow) {
-                        width = mainAxis
-                        height = crossAxis
-                    } else {
-                        width = crossAxis
-                        height = mainAxis
-                    }
+                        var width: Int
+                        var height: Int
+                        if (forRow) {
+                            width = mainAxis
+                            height = crossAxis
+                        } else {
+                            width = crossAxis
+                            height = mainAxis
+                        }
 
-                    return layout(width, height) {
-                        measurables.forEach { measurable ->
-                            val placeable = measurable.measure(constraints)
-                            placeable.place(0, 0)
+                        return layout(width, height) {
+                            measurables.forEach { measurable ->
+                                val placeable = measurable.measure(constraints)
+                                placeable.place(0, 0)
+                            }
                         }
                     }
-                }
 
-                override fun IntrinsicMeasureScope.maxIntrinsicHeight(
-                    measurables: List<IntrinsicMeasurable>,
-                    width: Int
-                ): Int {
-                    return if (forRow) {
-                        getCrossAxisNeeded(width)
-                    } else {
-                        maxIntrinsicMainAxisSize.roundToPx()
+                    override fun IntrinsicMeasureScope.maxIntrinsicHeight(
+                        measurables: List<IntrinsicMeasurable>,
+                        width: Int
+                    ): Int {
+                        return if (forRow) {
+                            getCrossAxisNeeded(width)
+                        } else {
+                            maxIntrinsicMainAxisSize.roundToPx()
+                        }
+                    }
+
+                    override fun IntrinsicMeasureScope.maxIntrinsicWidth(
+                        measurables: List<IntrinsicMeasurable>,
+                        height: Int
+                    ): Int {
+                        return if (forRow) {
+                            maxIntrinsicMainAxisSize.roundToPx()
+                        } else {
+                            getCrossAxisNeeded(height)
+                        }
+                    }
+
+                    override fun IntrinsicMeasureScope.minIntrinsicHeight(
+                        measurables: List<IntrinsicMeasurable>,
+                        width: Int
+                    ): Int {
+                        return if (forRow) {
+                            getCrossAxisNeeded(width)
+                        } else {
+                            characterSizeMainAxis.roundToPx()
+                        }
+                    }
+
+                    override fun IntrinsicMeasureScope.minIntrinsicWidth(
+                        measurables: List<IntrinsicMeasurable>,
+                        height: Int
+                    ): Int {
+                        return if (forRow) {
+                            characterSizeMainAxis.roundToPx()
+                        } else {
+                            getCrossAxisNeeded(height)
+                        }
+                    }
+
+                    private fun IntrinsicMeasureScope.getCrossAxisNeeded(mainAxisSize: Int): Int {
+                        val lengthNeeded = text.length * characterSizeMainAxis.roundToPx()
+                        val noOfLines =
+                            if (mainAxisSize == Constraints.Infinity) 1
+                            else ceil((lengthNeeded.toFloat() / mainAxisSize).toDouble()).toInt()
+                        return (textCrossAxisSize.roundToPx() * noOfLines)
                     }
                 }
-
-                override fun IntrinsicMeasureScope.maxIntrinsicWidth(
-                    measurables: List<IntrinsicMeasurable>,
-                    height: Int
-                ): Int {
-                    return if (forRow) {
-                        maxIntrinsicMainAxisSize.roundToPx()
-                    } else {
-                        getCrossAxisNeeded(height)
-                    }
-                }
-
-                override fun IntrinsicMeasureScope.minIntrinsicHeight(
-                    measurables: List<IntrinsicMeasurable>,
-                    width: Int
-                ): Int {
-                    return if (forRow) {
-                        getCrossAxisNeeded(width)
-                    } else {
-                        characterSizeMainAxis.roundToPx()
-                    }
-                }
-
-                override fun IntrinsicMeasureScope.minIntrinsicWidth(
-                    measurables: List<IntrinsicMeasurable>,
-                    height: Int
-                ): Int {
-                    return if (forRow) {
-                        characterSizeMainAxis.roundToPx()
-                    } else {
-                        getCrossAxisNeeded(height)
-                    }
-                }
-
-                private fun IntrinsicMeasureScope.getCrossAxisNeeded(mainAxisSize: Int): Int {
-                    val lengthNeeded = text.length * characterSizeMainAxis.roundToPx()
-                    val noOfLines = if (mainAxisSize == Constraints.Infinity) 1 else
-                        ceil((lengthNeeded.toFloat() / mainAxisSize).toDouble()).toInt()
-                    return (textCrossAxisSize.roundToPx() * noOfLines)
-                }
-            }
         )
     }
 
@@ -447,15 +403,10 @@
         rule.setContent {
             with(LocalDensity.current) {
                 Box(Modifier.size(100.toDp())) {
-                    Column(
-                        Modifier
-                            .wrapContentWidth()
-                            .wrapContentHeight()
-                    ) {
+                    Column(Modifier.wrapContentWidth().wrapContentHeight()) {
                         repeat(5) { index ->
                             Box(
-                                Modifier
-                                    .size(
+                                Modifier.size(
                                         if (index == 4) {
                                             10.toDp()
                                         } else {
@@ -469,7 +420,8 @@
                                             val positionInParent = it.positionInParent()
                                             positionInParentX = positionInParent.x
                                         }
-                                    })
+                                    }
+                            )
                         }
                     }
                 }
@@ -481,9 +433,7 @@
             alignment = Alignment.CenterHorizontally
         }
 
-        rule.runOnIdle {
-            Truth.assertThat(positionInParentX).isEqualTo(5)
-        }
+        rule.runOnIdle { Truth.assertThat(positionInParentX).isEqualTo(5) }
     }
 
     @Test
@@ -496,18 +446,16 @@
         rule.setContent {
             with(LocalDensity.current) {
                 Box(Modifier.size(100.toDp())) {
-                    Column(
-                        Modifier.wrapContentHeight()
-                    ) {
+                    Column(Modifier.wrapContentHeight()) {
                         repeat(5) { index ->
                             Box(
-                                Modifier
-                                    .size(
+                                Modifier.size(
                                         if (index == 4) {
                                             10.toDp()
                                         } else {
                                             20.toDp()
-                                        }, 20.toDp()
+                                        },
+                                        20.toDp()
                                     )
                                     .alignBy(
                                         if (index == 4) {
@@ -521,7 +469,8 @@
                                             val positionInParent = it.positionInParent()
                                             positionInParentX = positionInParent.x
                                         }
-                                    })
+                                    }
+                            )
                         }
                     }
                 }
@@ -533,9 +482,7 @@
             alignment = alignByNewBlock
         }
 
-        rule.runOnIdle {
-            Truth.assertThat(positionInParentX).isEqualTo(5)
-        }
+        rule.runOnIdle { Truth.assertThat(positionInParentX).isEqualTo(5) }
     }
 
     @Test
@@ -546,25 +493,17 @@
         rule.setContent {
             with(LocalDensity.current) {
                 Box(Modifier.size(200.toDp())) {
-                    Column(
-                        Modifier.wrapContentHeight()
-                    ) {
+                    Column(Modifier.wrapContentHeight()) {
                         repeat(5) { index ->
                             Box(
-                                Modifier
-                                    .size(
-                                        20.toDp()
-                                    )
-                                    .weight(1f, fill)
-                                    .onSizeChanged {
-                                        if (index > 0) {
-                                            Truth
-                                                .assertThat(it.height)
-                                                .isEqualTo(height)
-                                        } else {
-                                            height = it.height
-                                        }
-                                    })
+                                Modifier.size(20.toDp()).weight(1f, fill).onSizeChanged {
+                                    if (index > 0) {
+                                        Truth.assertThat(it.height).isEqualTo(height)
+                                    } else {
+                                        height = it.height
+                                    }
+                                }
+                            )
                         }
                     }
                 }
@@ -576,9 +515,7 @@
             fill = true
         }
 
-        rule.runOnIdle {
-            Truth.assertThat(height).isEqualTo(40)
-        }
+        rule.runOnIdle { Truth.assertThat(height).isEqualTo(40) }
     }
 
     @Test
@@ -591,13 +528,10 @@
         rule.setContent {
             with(LocalDensity.current) {
                 Box(Modifier.size(200.toDp())) {
-                    Column(
-                        Modifier.wrapContentHeight()
-                    ) {
+                    Column(Modifier.wrapContentHeight()) {
                         repeat(5) { index ->
                             Box(
-                                Modifier
-                                    .size(
+                                Modifier.size(
                                         if (index == 4) {
                                             10.toDp()
                                         } else {
@@ -608,9 +542,7 @@
                                     .weight(1f, fill)
                                     .onSizeChanged {
                                         if (index > 0) {
-                                            Truth
-                                                .assertThat(it.height)
-                                                .isEqualTo(height)
+                                            Truth.assertThat(it.height).isEqualTo(height)
                                         } else {
                                             height = it.height
                                         }
@@ -621,7 +553,8 @@
                                             val positionInParent = it.positionInParent()
                                             positionInParentX = positionInParent.x
                                         }
-                                    })
+                                    }
+                            )
                         }
                     }
                 }
diff --git a/compose/foundation/foundation-layout/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/layout/RowColumnTest.kt b/compose/foundation/foundation-layout/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/layout/RowColumnTest.kt
index 0716c11..f53db0b 100644
--- a/compose/foundation/foundation-layout/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/layout/RowColumnTest.kt
+++ b/compose/foundation/foundation-layout/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/layout/RowColumnTest.kt
@@ -79,281 +79,249 @@
 
     // region Size and position tests for Row and Column
     @Test
-    fun testRow() = with(density) {
-        val sizeDp = 50.toDp()
-        val size = sizeDp.roundToPx()
+    fun testRow() =
+        with(density) {
+            val sizeDp = 50.toDp()
+            val size = sizeDp.roundToPx()
 
-        val drawLatch = CountDownLatch(2)
-        val childSize = arrayOf(IntSize(-1, -1), IntSize(-1, -1))
-        val childPosition = arrayOf(Offset(-1f, -1f), Offset(-1f, -1f))
-        show {
-            Container(alignment = Alignment.TopStart) {
-                Row {
-                    Container(
-                        width = sizeDp,
-                        height = sizeDp,
-                        modifier = Modifier.onGloballyPositioned { coordinates ->
-                            childSize[0] = coordinates.size
-                            childPosition[0] = coordinates.positionInRoot()
-                            drawLatch.countDown()
-                        }
-                    ) {
-                    }
+            val drawLatch = CountDownLatch(2)
+            val childSize = arrayOf(IntSize(-1, -1), IntSize(-1, -1))
+            val childPosition = arrayOf(Offset(-1f, -1f), Offset(-1f, -1f))
+            show {
+                Container(alignment = Alignment.TopStart) {
+                    Row {
+                        Container(
+                            width = sizeDp,
+                            height = sizeDp,
+                            modifier =
+                                Modifier.onGloballyPositioned { coordinates ->
+                                    childSize[0] = coordinates.size
+                                    childPosition[0] = coordinates.positionInRoot()
+                                    drawLatch.countDown()
+                                }
+                        ) {}
 
-                    Container(
-                        width = (sizeDp * 2),
-                        height = (sizeDp * 2),
-                        modifier = Modifier.onGloballyPositioned { coordinates ->
-                            childSize[1] = coordinates.size
-                            childPosition[1] = coordinates.positionInRoot()
-                            drawLatch.countDown()
-                        }
-                    ) {
+                        Container(
+                            width = (sizeDp * 2),
+                            height = (sizeDp * 2),
+                            modifier =
+                                Modifier.onGloballyPositioned { coordinates ->
+                                    childSize[1] = coordinates.size
+                                    childPosition[1] = coordinates.positionInRoot()
+                                    drawLatch.countDown()
+                                }
+                        ) {}
                     }
                 }
             }
+            assertTrue(drawLatch.await(1, TimeUnit.SECONDS))
+
+            val root = findComposeView()
+            waitForDraw(root)
+
+            assertEquals(IntSize(size, size), childSize[0])
+            assertEquals(
+                IntSize((sizeDp.toPx() * 2).roundToInt(), (sizeDp.toPx() * 2).roundToInt()),
+                childSize[1]
+            )
+            assertEquals(Offset(0f, 0f), childPosition[0])
+            assertEquals(Offset(size.toFloat(), 0f), childPosition[1])
         }
-        assertTrue(drawLatch.await(1, TimeUnit.SECONDS))
-
-        val root = findComposeView()
-        waitForDraw(root)
-
-        assertEquals(IntSize(size, size), childSize[0])
-        assertEquals(
-            IntSize((sizeDp.toPx() * 2).roundToInt(), (sizeDp.toPx() * 2).roundToInt()),
-            childSize[1]
-        )
-        assertEquals(Offset(0f, 0f), childPosition[0])
-        assertEquals(Offset(size.toFloat(), 0f), childPosition[1])
-    }
 
     @Test
-    fun testRow_withChildrenWithWeight() = with(density) {
-        val width = 50.toDp()
-        val height = 80.toDp()
-        val childrenHeight = height.roundToPx()
+    fun testRow_withChildrenWithWeight() =
+        with(density) {
+            val width = 50.toDp()
+            val height = 80.toDp()
+            val childrenHeight = height.roundToPx()
 
-        val drawLatch = CountDownLatch(2)
-        val childSize = arrayOfNulls<IntSize>(2)
-        val childPosition = arrayOfNulls<Offset>(2)
-        show {
-            Container(alignment = Alignment.TopStart) {
-                Row {
-                    Container(
-                        Modifier.weight(1f)
-                            .onGloballyPositioned { coordinates ->
+            val drawLatch = CountDownLatch(2)
+            val childSize = arrayOfNulls<IntSize>(2)
+            val childPosition = arrayOfNulls<Offset>(2)
+            show {
+                Container(alignment = Alignment.TopStart) {
+                    Row {
+                        Container(
+                            Modifier.weight(1f).onGloballyPositioned { coordinates ->
                                 childSize[0] = coordinates.size
                                 childPosition[0] = coordinates.positionInRoot()
                                 drawLatch.countDown()
                             },
-                        width = width,
-                        height = height
-                    ) {
-                    }
+                            width = width,
+                            height = height
+                        ) {}
 
-                    Container(
-                        Modifier.weight(2f)
-                            .onGloballyPositioned { coordinates ->
+                        Container(
+                            Modifier.weight(2f).onGloballyPositioned { coordinates ->
                                 childSize[1] = coordinates.size
                                 childPosition[1] = coordinates.positionInRoot()
                                 drawLatch.countDown()
                             },
-                        width = width,
-                        height = height
-                    ) {
+                            width = width,
+                            height = height
+                        ) {}
                     }
                 }
             }
+            assertTrue(drawLatch.await(1, TimeUnit.SECONDS))
+
+            val root = findComposeView()
+            waitForDraw(root)
+            val rootWidth = root.width
+
+            assertEquals(IntSize((rootWidth / 3f).roundToInt(), childrenHeight), childSize[0])
+            assertEquals(IntSize((rootWidth * 2f / 3f).roundToInt(), childrenHeight), childSize[1])
+            assertEquals(Offset(0f, 0f), childPosition[0])
+            assertEquals(Offset((rootWidth / 3f).roundToInt().toFloat(), 0f), childPosition[1])
         }
-        assertTrue(drawLatch.await(1, TimeUnit.SECONDS))
-
-        val root = findComposeView()
-        waitForDraw(root)
-        val rootWidth = root.width
-
-        assertEquals(
-            IntSize((rootWidth / 3f).roundToInt(), childrenHeight),
-            childSize[0]
-        )
-        assertEquals(
-            IntSize((rootWidth * 2f / 3f).roundToInt(), childrenHeight),
-            childSize[1]
-        )
-        assertEquals(Offset(0f, 0f), childPosition[0])
-        assertEquals(Offset((rootWidth / 3f).roundToInt().toFloat(), 0f), childPosition[1])
-    }
 
     @Test
-    fun testRow_withChildrenWithWeightNonFilling() = with(density) {
-        val width = 50.toDp()
-        val childrenWidth = width.roundToPx()
-        val height = 80.toDp()
-        val childrenHeight = height.roundToPx()
+    fun testRow_withChildrenWithWeightNonFilling() =
+        with(density) {
+            val width = 50.toDp()
+            val childrenWidth = width.roundToPx()
+            val height = 80.toDp()
+            val childrenHeight = height.roundToPx()
 
-        val drawLatch = CountDownLatch(2)
-        val childSize = arrayOfNulls<IntSize>(2)
-        val childPosition = arrayOfNulls<Offset>(2)
-        show {
-            Container(alignment = Alignment.TopStart) {
-                Row {
-                    Container(
-                        Modifier.weight(1f, fill = false)
-                            .onGloballyPositioned { coordinates ->
+            val drawLatch = CountDownLatch(2)
+            val childSize = arrayOfNulls<IntSize>(2)
+            val childPosition = arrayOfNulls<Offset>(2)
+            show {
+                Container(alignment = Alignment.TopStart) {
+                    Row {
+                        Container(
+                            Modifier.weight(1f, fill = false).onGloballyPositioned { coordinates ->
                                 childSize[0] = coordinates.size
                                 childPosition[0] = coordinates.positionInRoot()
                                 drawLatch.countDown()
                             },
-                        width = width,
-                        height = height
-                    ) {
-                    }
+                            width = width,
+                            height = height
+                        ) {}
 
-                    Container(
-                        Modifier.weight(2f, fill = false)
-                            .onGloballyPositioned { coordinates ->
+                        Container(
+                            Modifier.weight(2f, fill = false).onGloballyPositioned { coordinates ->
                                 childSize[1] = coordinates.size
                                 childPosition[1] = coordinates.positionInRoot()
                                 drawLatch.countDown()
                             },
-                        width = width,
-                        height = height * 2
-                    ) {
+                            width = width,
+                            height = height * 2
+                        ) {}
                     }
                 }
             }
+            assertTrue(drawLatch.await(1, TimeUnit.SECONDS))
+
+            val root = findComposeView()
+            waitForDraw(root)
+
+            assertEquals(IntSize(childrenWidth, childrenHeight), childSize[0])
+            assertEquals(IntSize(childrenWidth, childrenHeight * 2), childSize[1])
+            assertEquals(Offset(0f, 0f), childPosition[0])
+            assertEquals(Offset(childrenWidth.toFloat(), 0f), childPosition[1])
         }
-        assertTrue(drawLatch.await(1, TimeUnit.SECONDS))
-
-        val root = findComposeView()
-        waitForDraw(root)
-
-        assertEquals(IntSize(childrenWidth, childrenHeight), childSize[0])
-        assertEquals(IntSize(childrenWidth, childrenHeight * 2), childSize[1])
-        assertEquals(Offset(0f, 0f), childPosition[0])
-        assertEquals(Offset(childrenWidth.toFloat(), 0f), childPosition[1])
-    }
 
     @Test
-    fun testRow_withChildrenWithMaxValueWeight() = with(density) {
-        val width = 50.toDp()
-        val height = 80.toDp()
-        val childrenHeight = height.roundToPx()
+    fun testRow_withChildrenWithMaxValueWeight() =
+        with(density) {
+            val width = 50.toDp()
+            val height = 80.toDp()
+            val childrenHeight = height.roundToPx()
 
-        val drawLatch = CountDownLatch(2)
-        val childSize = arrayOfNulls<IntSize>(2)
-        val childPosition = arrayOfNulls<Offset>(2)
-        show {
-            Container(alignment = Alignment.TopStart) {
-                Row {
-                    Container(
-                        Modifier.weight(Float.MAX_VALUE)
-                            .onGloballyPositioned { coordinates ->
+            val drawLatch = CountDownLatch(2)
+            val childSize = arrayOfNulls<IntSize>(2)
+            val childPosition = arrayOfNulls<Offset>(2)
+            show {
+                Container(alignment = Alignment.TopStart) {
+                    Row {
+                        Container(
+                            Modifier.weight(Float.MAX_VALUE).onGloballyPositioned { coordinates ->
                                 childSize[0] = coordinates.size
                                 childPosition[0] = coordinates.positionInRoot()
                                 drawLatch.countDown()
                             },
-                        width = width,
-                        height = height
-                    ) {
-                    }
+                            width = width,
+                            height = height
+                        ) {}
 
-                    Container(
-                        Modifier.weight(1f)
-                            .onGloballyPositioned { coordinates ->
+                        Container(
+                            Modifier.weight(1f).onGloballyPositioned { coordinates ->
                                 childSize[1] = coordinates.size
                                 childPosition[1] = coordinates.positionInRoot()
                                 drawLatch.countDown()
                             },
-                        width = width,
-                        height = height
-                    ) {
+                            width = width,
+                            height = height
+                        ) {}
                     }
                 }
             }
+            assertTrue(drawLatch.await(1, TimeUnit.SECONDS))
+
+            val root = findComposeView()
+            waitForDraw(root)
+            val rootWidth = root.width
+
+            assertEquals(IntSize(rootWidth, childrenHeight), childSize[0])
+            assertEquals(IntSize(0, childrenHeight), childSize[1])
+            assertEquals(Offset(0f, 0f), childPosition[0])
+            assertEquals(Offset((rootWidth).toFloat(), 0f), childPosition[1])
         }
-        assertTrue(drawLatch.await(1, TimeUnit.SECONDS))
-
-        val root = findComposeView()
-        waitForDraw(root)
-        val rootWidth = root.width
-
-        assertEquals(
-            IntSize(rootWidth, childrenHeight),
-            childSize[0]
-        )
-        assertEquals(
-            IntSize(0, childrenHeight),
-            childSize[1]
-        )
-        assertEquals(Offset(0f, 0f), childPosition[0])
-        assertEquals(Offset((rootWidth).toFloat(), 0f), childPosition[1])
-    }
 
     @Test
-    fun testRow_withChildrenWithPositiveInfinityWeight() = with(density) {
-        val width = 50.toDp()
-        val height = 80.toDp()
-        val childrenHeight = height.roundToPx()
+    fun testRow_withChildrenWithPositiveInfinityWeight() =
+        with(density) {
+            val width = 50.toDp()
+            val height = 80.toDp()
+            val childrenHeight = height.roundToPx()
 
-        val drawLatch = CountDownLatch(2)
-        val childSize = arrayOfNulls<IntSize>(2)
-        val childPosition = arrayOfNulls<Offset>(2)
-        show {
-            Container(alignment = Alignment.TopStart) {
-                Row {
-                    Container(
-                        Modifier.weight(Float.POSITIVE_INFINITY)
-                            .onGloballyPositioned { coordinates ->
+            val drawLatch = CountDownLatch(2)
+            val childSize = arrayOfNulls<IntSize>(2)
+            val childPosition = arrayOfNulls<Offset>(2)
+            show {
+                Container(alignment = Alignment.TopStart) {
+                    Row {
+                        Container(
+                            Modifier.weight(Float.POSITIVE_INFINITY).onGloballyPositioned {
+                                coordinates ->
                                 childSize[0] = coordinates.size
                                 childPosition[0] = coordinates.positionInRoot()
                                 drawLatch.countDown()
                             },
-                        width = width,
-                        height = height
-                    ) {
-                    }
+                            width = width,
+                            height = height
+                        ) {}
 
-                    Container(
-                        Modifier.weight(1f)
-                            .onGloballyPositioned { coordinates ->
+                        Container(
+                            Modifier.weight(1f).onGloballyPositioned { coordinates ->
                                 childSize[1] = coordinates.size
                                 childPosition[1] = coordinates.positionInRoot()
                                 drawLatch.countDown()
                             },
-                        width = width,
-                        height = height
-                    ) {
+                            width = width,
+                            height = height
+                        ) {}
                     }
                 }
             }
+            assertTrue(drawLatch.await(1, TimeUnit.SECONDS))
+
+            val root = findComposeView()
+            waitForDraw(root)
+            val rootWidth = root.width
+
+            assertEquals(IntSize(rootWidth, childrenHeight), childSize[0])
+            assertEquals(IntSize(0, childrenHeight), childSize[1])
+            assertEquals(Offset(0f, 0f), childPosition[0])
+            assertEquals(Offset((rootWidth).toFloat(), 0f), childPosition[1])
         }
-        assertTrue(drawLatch.await(1, TimeUnit.SECONDS))
-
-        val root = findComposeView()
-        waitForDraw(root)
-        val rootWidth = root.width
-
-        assertEquals(
-            IntSize(rootWidth, childrenHeight),
-            childSize[0]
-        )
-        assertEquals(
-            IntSize(0, childrenHeight),
-            childSize[1]
-        )
-        assertEquals(Offset(0f, 0f), childPosition[0])
-        assertEquals(Offset((rootWidth).toFloat(), 0f), childPosition[1])
-    }
 
     @Test
     fun testRow_invalidWeight() {
         with(RowScopeInstance) {
-            assertThrows(IllegalArgumentException::class.java) {
-                Modifier.weight(-1f)
-            }
-            assertThrows(IllegalArgumentException::class.java) {
-                Modifier.weight(Float.NaN)
-            }
+            assertThrows(IllegalArgumentException::class.java) { Modifier.weight(-1f) }
+            assertThrows(IllegalArgumentException::class.java) { Modifier.weight(Float.NaN) }
             assertThrows(IllegalArgumentException::class.java) {
                 Modifier.weight(Float.NEGATIVE_INFINITY)
             }
@@ -361,275 +329,247 @@
     }
 
     @Test
-    fun testColumn() = with(density) {
-        val sizeDp = 50.toDp()
-        val size = sizeDp.roundToPx()
+    fun testColumn() =
+        with(density) {
+            val sizeDp = 50.toDp()
+            val size = sizeDp.roundToPx()
 
-        val drawLatch = CountDownLatch(2)
-        val childSize = arrayOf(IntSize(-1, -1), IntSize(-1, -1))
-        val childPosition = arrayOf(Offset(-1f, -1f), Offset(-1f, -1f))
-        show {
-            Container(alignment = Alignment.TopStart) {
-                Column {
-                    Container(
-                        width = sizeDp,
-                        height = sizeDp,
-                        modifier = Modifier.onGloballyPositioned { coordinates ->
-                            childSize[0] = coordinates.size
-                            childPosition[0] = coordinates.positionInRoot()
-                            drawLatch.countDown()
-                        }
-                    ) {
-                    }
-                    Container(
-                        width = (sizeDp * 2),
-                        height = (sizeDp * 2),
-                        modifier = Modifier.onGloballyPositioned { coordinates ->
-                            childSize[1] = coordinates.size
-                            childPosition[1] = coordinates.positionInRoot()
-                            drawLatch.countDown()
-                        }
-                    ) {
+            val drawLatch = CountDownLatch(2)
+            val childSize = arrayOf(IntSize(-1, -1), IntSize(-1, -1))
+            val childPosition = arrayOf(Offset(-1f, -1f), Offset(-1f, -1f))
+            show {
+                Container(alignment = Alignment.TopStart) {
+                    Column {
+                        Container(
+                            width = sizeDp,
+                            height = sizeDp,
+                            modifier =
+                                Modifier.onGloballyPositioned { coordinates ->
+                                    childSize[0] = coordinates.size
+                                    childPosition[0] = coordinates.positionInRoot()
+                                    drawLatch.countDown()
+                                }
+                        ) {}
+                        Container(
+                            width = (sizeDp * 2),
+                            height = (sizeDp * 2),
+                            modifier =
+                                Modifier.onGloballyPositioned { coordinates ->
+                                    childSize[1] = coordinates.size
+                                    childPosition[1] = coordinates.positionInRoot()
+                                    drawLatch.countDown()
+                                }
+                        ) {}
                     }
                 }
             }
+            assertTrue(drawLatch.await(1, TimeUnit.SECONDS))
+
+            val root = findComposeView()
+            waitForDraw(root)
+
+            assertEquals(IntSize(size, size), childSize[0])
+            assertEquals(
+                IntSize((sizeDp.toPx() * 2).roundToInt(), (sizeDp.toPx() * 2).roundToInt()),
+                childSize[1]
+            )
+            assertEquals(Offset(0f, 0f), childPosition[0])
+            assertEquals(Offset(0f, size.toFloat()), childPosition[1])
         }
-        assertTrue(drawLatch.await(1, TimeUnit.SECONDS))
-
-        val root = findComposeView()
-        waitForDraw(root)
-
-        assertEquals(IntSize(size, size), childSize[0])
-        assertEquals(
-            IntSize((sizeDp.toPx() * 2).roundToInt(), (sizeDp.toPx() * 2).roundToInt()),
-            childSize[1]
-        )
-        assertEquals(Offset(0f, 0f), childPosition[0])
-        assertEquals(Offset(0f, size.toFloat()), childPosition[1])
-    }
 
     @Test
-    fun testColumn_withChildrenWithWeight() = with(density) {
-        val width = 80.toDp()
-        val childrenWidth = width.roundToPx()
-        val height = 50.toDp()
+    fun testColumn_withChildrenWithWeight() =
+        with(density) {
+            val width = 80.toDp()
+            val childrenWidth = width.roundToPx()
+            val height = 50.toDp()
 
-        val drawLatch = CountDownLatch(2)
-        val childSize = arrayOfNulls<IntSize>(2)
-        val childPosition = arrayOfNulls<Offset>(2)
-        show {
-            Container(alignment = Alignment.TopStart) {
-                Column {
-                    Container(
-                        Modifier.weight(1f)
-                            .onGloballyPositioned { coordinates ->
+            val drawLatch = CountDownLatch(2)
+            val childSize = arrayOfNulls<IntSize>(2)
+            val childPosition = arrayOfNulls<Offset>(2)
+            show {
+                Container(alignment = Alignment.TopStart) {
+                    Column {
+                        Container(
+                            Modifier.weight(1f).onGloballyPositioned { coordinates ->
                                 childSize[0] = coordinates.size
                                 childPosition[0] = coordinates.positionInRoot()
                                 drawLatch.countDown()
                             },
-                        width = width,
-                        height = height
-                    ) {
-                    }
+                            width = width,
+                            height = height
+                        ) {}
 
-                    Container(
-                        Modifier.weight(2f)
-                            .onGloballyPositioned { coordinates ->
+                        Container(
+                            Modifier.weight(2f).onGloballyPositioned { coordinates ->
                                 childSize[1] = coordinates.size
                                 childPosition[1] = coordinates.positionInRoot()
                                 drawLatch.countDown()
                             },
-                        width = width,
-                        height = height
-                    ) {
+                            width = width,
+                            height = height
+                        ) {}
                     }
                 }
             }
+            assertTrue(drawLatch.await(1, TimeUnit.SECONDS))
+
+            val root = findComposeView()
+            waitForDraw(root)
+            val rootHeight = root.height
+
+            assertEquals(IntSize(childrenWidth, (rootHeight / 3f).roundToInt()), childSize[0])
+            assertEquals(IntSize(childrenWidth, (rootHeight * 2f / 3f).roundToInt()), childSize[1])
+            assertEquals(Offset(0f, 0f), childPosition[0])
+            assertEquals(Offset(0f, (rootHeight / 3f).roundToInt().toFloat()), childPosition[1])
         }
-        assertTrue(drawLatch.await(1, TimeUnit.SECONDS))
-
-        val root = findComposeView()
-        waitForDraw(root)
-        val rootHeight = root.height
-
-        assertEquals(
-            IntSize(childrenWidth, (rootHeight / 3f).roundToInt()), childSize[0]
-        )
-        assertEquals(
-            IntSize(childrenWidth, (rootHeight * 2f / 3f).roundToInt()), childSize[1]
-        )
-        assertEquals(Offset(0f, 0f), childPosition[0])
-        assertEquals(Offset(0f, (rootHeight / 3f).roundToInt().toFloat()), childPosition[1])
-    }
 
     @Test
-    fun testColumn_withChildrenWithWeightNonFilling() = with(density) {
-        val width = 80.toDp()
-        val childrenWidth = width.roundToPx()
-        val height = 50.toDp()
-        val childrenHeight = height.roundToPx()
+    fun testColumn_withChildrenWithWeightNonFilling() =
+        with(density) {
+            val width = 80.toDp()
+            val childrenWidth = width.roundToPx()
+            val height = 50.toDp()
+            val childrenHeight = height.roundToPx()
 
-        val drawLatch = CountDownLatch(2)
-        val childSize = arrayOfNulls<IntSize>(2)
-        val childPosition = arrayOfNulls<Offset>(2)
-        show {
-            Container(alignment = Alignment.TopStart) {
-                Column {
-                    Container(
-                        Modifier.weight(1f, fill = false)
-                            .onGloballyPositioned { coordinates ->
+            val drawLatch = CountDownLatch(2)
+            val childSize = arrayOfNulls<IntSize>(2)
+            val childPosition = arrayOfNulls<Offset>(2)
+            show {
+                Container(alignment = Alignment.TopStart) {
+                    Column {
+                        Container(
+                            Modifier.weight(1f, fill = false).onGloballyPositioned { coordinates ->
                                 childSize[0] = coordinates.size
                                 childPosition[0] = coordinates.positionInRoot()
                                 drawLatch.countDown()
                             },
-                        width = width,
-                        height = height
-                    ) {
-                    }
-                    Container(
-                        Modifier.weight(2f, fill = false)
-                            .onGloballyPositioned { coordinates ->
+                            width = width,
+                            height = height
+                        ) {}
+                        Container(
+                            Modifier.weight(2f, fill = false).onGloballyPositioned { coordinates ->
                                 childSize[1] = coordinates.size
                                 childPosition[1] = coordinates.positionInRoot()
                                 drawLatch.countDown()
                             },
-                        width = width,
-                        height = height
-                    ) {
+                            width = width,
+                            height = height
+                        ) {}
                     }
                 }
             }
+            assertTrue(drawLatch.await(1, TimeUnit.SECONDS))
+
+            val root = findComposeView()
+            waitForDraw(root)
+
+            assertEquals(IntSize(childrenWidth, childrenHeight), childSize[0])
+            assertEquals(IntSize(childrenWidth, childrenHeight), childSize[1])
+            assertEquals(Offset(0.0f, 0.0f), childPosition[0])
+            assertEquals(Offset(0.0f, childrenHeight.toFloat()), childPosition[1])
         }
-        assertTrue(drawLatch.await(1, TimeUnit.SECONDS))
-
-        val root = findComposeView()
-        waitForDraw(root)
-
-        assertEquals(IntSize(childrenWidth, childrenHeight), childSize[0])
-        assertEquals(
-            IntSize(childrenWidth, childrenHeight), childSize[1]
-        )
-        assertEquals(Offset(0.0f, 0.0f), childPosition[0])
-        assertEquals(Offset(0.0f, childrenHeight.toFloat()), childPosition[1])
-    }
 
     @Test
-    fun testColumn_withChildrenWithMaxValueWeight() = with(density) {
-        val width = 80.toDp()
-        val childrenWidth = width.roundToPx()
-        val height = 50.toDp()
+    fun testColumn_withChildrenWithMaxValueWeight() =
+        with(density) {
+            val width = 80.toDp()
+            val childrenWidth = width.roundToPx()
+            val height = 50.toDp()
 
-        val drawLatch = CountDownLatch(2)
-        val childSize = arrayOfNulls<IntSize>(2)
-        val childPosition = arrayOfNulls<Offset>(2)
-        show {
-            Container(alignment = Alignment.TopStart) {
-                Column {
-                    Container(
-                        Modifier.weight(Float.MAX_VALUE)
-                            .onGloballyPositioned { coordinates ->
+            val drawLatch = CountDownLatch(2)
+            val childSize = arrayOfNulls<IntSize>(2)
+            val childPosition = arrayOfNulls<Offset>(2)
+            show {
+                Container(alignment = Alignment.TopStart) {
+                    Column {
+                        Container(
+                            Modifier.weight(Float.MAX_VALUE).onGloballyPositioned { coordinates ->
                                 childSize[0] = coordinates.size
                                 childPosition[0] = coordinates.positionInRoot()
                                 drawLatch.countDown()
                             },
-                        width = width,
-                        height = height
-                    ) {
-                    }
+                            width = width,
+                            height = height
+                        ) {}
 
-                    Container(
-                        Modifier.weight(1f)
-                            .onGloballyPositioned { coordinates ->
+                        Container(
+                            Modifier.weight(1f).onGloballyPositioned { coordinates ->
                                 childSize[1] = coordinates.size
                                 childPosition[1] = coordinates.positionInRoot()
                                 drawLatch.countDown()
                             },
-                        width = width,
-                        height = height
-                    ) {
+                            width = width,
+                            height = height
+                        ) {}
                     }
                 }
             }
+            assertTrue(drawLatch.await(1, TimeUnit.SECONDS))
+
+            val root = findComposeView()
+            waitForDraw(root)
+            val rootHeight = root.height
+
+            assertEquals(IntSize(childrenWidth, rootHeight), childSize[0])
+            assertEquals(IntSize(childrenWidth, 0), childSize[1])
+            assertEquals(Offset(0f, 0f), childPosition[0])
+            assertEquals(Offset(0f, rootHeight.toFloat()), childPosition[1])
         }
-        assertTrue(drawLatch.await(1, TimeUnit.SECONDS))
-
-        val root = findComposeView()
-        waitForDraw(root)
-        val rootHeight = root.height
-
-        assertEquals(
-            IntSize(childrenWidth, rootHeight), childSize[0]
-        )
-        assertEquals(
-            IntSize(childrenWidth, 0), childSize[1]
-        )
-        assertEquals(Offset(0f, 0f), childPosition[0])
-        assertEquals(Offset(0f, rootHeight.toFloat()), childPosition[1])
-    }
 
     @Test
-    fun testColumn_withChildrenWithPositiveInfinityWeight() = with(density) {
-        val width = 80.toDp()
-        val childrenWidth = width.roundToPx()
-        val height = 50.toDp()
+    fun testColumn_withChildrenWithPositiveInfinityWeight() =
+        with(density) {
+            val width = 80.toDp()
+            val childrenWidth = width.roundToPx()
+            val height = 50.toDp()
 
-        val drawLatch = CountDownLatch(2)
-        val childSize = arrayOfNulls<IntSize>(2)
-        val childPosition = arrayOfNulls<Offset>(2)
-        show {
-            Container(alignment = Alignment.TopStart) {
-                Column {
-                    Container(
-                        Modifier.weight(Float.POSITIVE_INFINITY)
-                            .onGloballyPositioned { coordinates ->
+            val drawLatch = CountDownLatch(2)
+            val childSize = arrayOfNulls<IntSize>(2)
+            val childPosition = arrayOfNulls<Offset>(2)
+            show {
+                Container(alignment = Alignment.TopStart) {
+                    Column {
+                        Container(
+                            Modifier.weight(Float.POSITIVE_INFINITY).onGloballyPositioned {
+                                coordinates ->
                                 childSize[0] = coordinates.size
                                 childPosition[0] = coordinates.positionInRoot()
                                 drawLatch.countDown()
                             },
-                        width = width,
-                        height = height
-                    ) {
-                    }
+                            width = width,
+                            height = height
+                        ) {}
 
-                    Container(
-                        Modifier.weight(1f)
-                            .onGloballyPositioned { coordinates ->
+                        Container(
+                            Modifier.weight(1f).onGloballyPositioned { coordinates ->
                                 childSize[1] = coordinates.size
                                 childPosition[1] = coordinates.positionInRoot()
                                 drawLatch.countDown()
                             },
-                        width = width,
-                        height = height
-                    ) {
+                            width = width,
+                            height = height
+                        ) {}
                     }
                 }
             }
+            assertTrue(drawLatch.await(1, TimeUnit.SECONDS))
+
+            val root = findComposeView()
+            waitForDraw(root)
+            val rootHeight = root.height
+
+            assertEquals(IntSize(childrenWidth, rootHeight), childSize[0])
+            assertEquals(IntSize(childrenWidth, 0), childSize[1])
+            assertEquals(Offset(0f, 0f), childPosition[0])
+            assertEquals(Offset(0f, rootHeight.toFloat()), childPosition[1])
         }
-        assertTrue(drawLatch.await(1, TimeUnit.SECONDS))
-
-        val root = findComposeView()
-        waitForDraw(root)
-        val rootHeight = root.height
-
-        assertEquals(
-            IntSize(childrenWidth, rootHeight), childSize[0]
-        )
-        assertEquals(
-            IntSize(childrenWidth, 0), childSize[1]
-        )
-        assertEquals(Offset(0f, 0f), childPosition[0])
-        assertEquals(Offset(0f, rootHeight.toFloat()), childPosition[1])
-    }
 
     @Test
     fun testColumn_invalidWeight() {
         with(ColumnScopeInstance) {
-            assertThrows(IllegalArgumentException::class.java) {
-                Modifier.weight(-1f)
-            }
-            assertThrows(IllegalArgumentException::class.java) {
-                Modifier.weight(Float.NaN)
-            }
+            assertThrows(IllegalArgumentException::class.java) { Modifier.weight(-1f) }
+            assertThrows(IllegalArgumentException::class.java) { Modifier.weight(Float.NaN) }
             assertThrows(IllegalArgumentException::class.java) {
                 Modifier.weight(Float.NEGATIVE_INFINITY)
             }
@@ -637,1059 +577,840 @@
     }
 
     @Test
-    fun testRow_doesNotPlaceChildrenOutOfBounds_becauseOfRoundings() = with(density) {
-        val expectedRowWidth = 11f
-        val leftPadding = 1f
-        var rowWidth = 0f
-        val width = Array(2) { 0f }
-        val x = Array(2) { 0f }
-        val latch = CountDownLatch(2)
-        show {
-            Row(
-                Modifier.wrapContentSize(Alignment.TopStart)
-                    .padding(start = leftPadding.toDp())
-                    .widthIn(max = expectedRowWidth.toDp())
-                    .onGloballyPositioned { coordinates ->
-                        rowWidth = coordinates.size.width.toFloat()
-                    }
-            ) {
-                Container(
-                    Modifier.weight(1f)
+    fun testRow_doesNotPlaceChildrenOutOfBounds_becauseOfRoundings() =
+        with(density) {
+            val expectedRowWidth = 11f
+            val leftPadding = 1f
+            var rowWidth = 0f
+            val width = Array(2) { 0f }
+            val x = Array(2) { 0f }
+            val latch = CountDownLatch(2)
+            show {
+                Row(
+                    Modifier.wrapContentSize(Alignment.TopStart)
+                        .padding(start = leftPadding.toDp())
+                        .widthIn(max = expectedRowWidth.toDp())
                         .onGloballyPositioned { coordinates ->
+                            rowWidth = coordinates.size.width.toFloat()
+                        }
+                ) {
+                    Container(
+                        Modifier.weight(1f).onGloballyPositioned { coordinates ->
                             width[0] = coordinates.size.width.toFloat()
                             x[0] = coordinates.positionInRoot().x
                             latch.countDown()
                         }
-                ) {
-                }
-                Container(
-                    Modifier.weight(1f)
-                        .onGloballyPositioned { coordinates ->
+                    ) {}
+                    Container(
+                        Modifier.weight(1f).onGloballyPositioned { coordinates ->
                             width[1] = coordinates.size.width.toFloat()
                             x[1] = coordinates.positionInRoot().x
                             latch.countDown()
                         }
-                ) {
+                    ) {}
                 }
             }
+
+            assertTrue(latch.await(1, TimeUnit.SECONDS))
+
+            assertEquals(expectedRowWidth, rowWidth)
+            assertEquals(leftPadding, x[0])
+            assertEquals(leftPadding + width[0], x[1])
+            assertEquals(rowWidth, width[0] + width[1])
         }
 
-        assertTrue(latch.await(1, TimeUnit.SECONDS))
-
-        assertEquals(expectedRowWidth, rowWidth)
-        assertEquals(leftPadding, x[0])
-        assertEquals(leftPadding + width[0], x[1])
-        assertEquals(rowWidth, width[0] + width[1])
-    }
-
     @Test
-    fun testRow_isNotLargerThanItsChildren_becauseOfRoundings() = with(density) {
-        val expectedRowWidth = 8f
-        val leftPadding = 1f
-        var rowWidth = 0f
-        val width = Array(3) { 0f }
-        val x = Array(3) { 0f }
-        val latch = CountDownLatch(3)
-        show {
-            Row(
-                Modifier.wrapContentSize(Alignment.TopStart)
-                    .padding(start = leftPadding.toDp())
-                    .widthIn(max = expectedRowWidth.toDp())
-                    .onGloballyPositioned { coordinates ->
-                        rowWidth = coordinates.size.width.toFloat()
-                    }
-            ) {
-                Container(
-                    Modifier.weight(2f)
+    fun testRow_isNotLargerThanItsChildren_becauseOfRoundings() =
+        with(density) {
+            val expectedRowWidth = 8f
+            val leftPadding = 1f
+            var rowWidth = 0f
+            val width = Array(3) { 0f }
+            val x = Array(3) { 0f }
+            val latch = CountDownLatch(3)
+            show {
+                Row(
+                    Modifier.wrapContentSize(Alignment.TopStart)
+                        .padding(start = leftPadding.toDp())
+                        .widthIn(max = expectedRowWidth.toDp())
                         .onGloballyPositioned { coordinates ->
+                            rowWidth = coordinates.size.width.toFloat()
+                        }
+                ) {
+                    Container(
+                        Modifier.weight(2f).onGloballyPositioned { coordinates ->
                             width[0] = coordinates.size.width.toFloat()
                             x[0] = coordinates.positionInRoot().x
                             latch.countDown()
                         }
-                ) {
-                }
-                Container(
-                    Modifier.weight(2f)
-                        .onGloballyPositioned { coordinates ->
+                    ) {}
+                    Container(
+                        Modifier.weight(2f).onGloballyPositioned { coordinates ->
                             width[1] = coordinates.size.width.toFloat()
                             x[1] = coordinates.positionInRoot().x
                             latch.countDown()
                         }
-                ) {
-                }
-                Container(
-                    Modifier.weight(3f)
-                        .onGloballyPositioned { coordinates ->
+                    ) {}
+                    Container(
+                        Modifier.weight(3f).onGloballyPositioned { coordinates ->
                             width[2] = coordinates.size.width.toFloat()
                             x[2] = coordinates.positionInRoot().x
                             latch.countDown()
                         }
-                ) {
+                    ) {}
                 }
             }
+
+            assertTrue(latch.await(1, TimeUnit.SECONDS))
+
+            assertEquals(expectedRowWidth, rowWidth)
+            assertEquals(leftPadding, x[0])
+            assertEquals(leftPadding + width[0], x[1])
+            assertEquals(leftPadding + width[0] + width[1], x[2])
+            assertEquals(rowWidth, width[0] + width[1] + width[2])
         }
 
-        assertTrue(latch.await(1, TimeUnit.SECONDS))
-
-        assertEquals(expectedRowWidth, rowWidth)
-        assertEquals(leftPadding, x[0])
-        assertEquals(leftPadding + width[0], x[1])
-        assertEquals(leftPadding + width[0] + width[1], x[2])
-        assertEquals(rowWidth, width[0] + width[1] + width[2])
-    }
-
     @Test
-    fun testColumn_isNotLargetThanItsChildren_becauseOfRoundings() = with(density) {
-        val expectedColumnHeight = 8f
-        val topPadding = 1f
-        var columnHeight = 0f
-        val height = Array(3) { 0f }
-        val y = Array(3) { 0f }
-        val latch = CountDownLatch(3)
-        show {
-            Column(
-                Modifier.wrapContentSize(Alignment.TopStart)
-                    .padding(top = topPadding.toDp())
-                    .heightIn(max = expectedColumnHeight.toDp())
-                    .onGloballyPositioned { coordinates ->
-                        columnHeight = coordinates.size.height.toFloat()
-                    }
-            ) {
-                Container(
-                    Modifier.weight(1f)
+    fun testColumn_isNotLargetThanItsChildren_becauseOfRoundings() =
+        with(density) {
+            val expectedColumnHeight = 8f
+            val topPadding = 1f
+            var columnHeight = 0f
+            val height = Array(3) { 0f }
+            val y = Array(3) { 0f }
+            val latch = CountDownLatch(3)
+            show {
+                Column(
+                    Modifier.wrapContentSize(Alignment.TopStart)
+                        .padding(top = topPadding.toDp())
+                        .heightIn(max = expectedColumnHeight.toDp())
                         .onGloballyPositioned { coordinates ->
+                            columnHeight = coordinates.size.height.toFloat()
+                        }
+                ) {
+                    Container(
+                        Modifier.weight(1f).onGloballyPositioned { coordinates ->
                             height[0] = coordinates.size.height.toFloat()
                             y[0] = coordinates.positionInRoot().y
                             latch.countDown()
                         }
-                ) {
-                }
-                Container(
-                    Modifier.weight(1f)
-                        .onGloballyPositioned { coordinates ->
+                    ) {}
+                    Container(
+                        Modifier.weight(1f).onGloballyPositioned { coordinates ->
                             height[1] = coordinates.size.height.toFloat()
                             y[1] = coordinates.positionInRoot().y
                             latch.countDown()
                         }
-                ) {
-                }
-                Container(
-                    Modifier.weight(1f)
-                        .onGloballyPositioned { coordinates ->
+                    ) {}
+                    Container(
+                        Modifier.weight(1f).onGloballyPositioned { coordinates ->
                             height[2] = coordinates.size.height.toFloat()
                             y[2] = coordinates.positionInRoot().y
                             latch.countDown()
                         }
-                ) {
+                    ) {}
                 }
             }
+
+            assertTrue(latch.await(1, TimeUnit.SECONDS))
+
+            assertEquals(expectedColumnHeight, columnHeight)
+            assertEquals(topPadding, y[0])
+            assertEquals(topPadding + height[0], y[1])
+            assertEquals(topPadding + height[0] + height[1], y[2])
+            assertEquals(columnHeight, height[0] + height[1] + height[2])
         }
 
-        assertTrue(latch.await(1, TimeUnit.SECONDS))
-
-        assertEquals(expectedColumnHeight, columnHeight)
-        assertEquals(topPadding, y[0])
-        assertEquals(topPadding + height[0], y[1])
-        assertEquals(topPadding + height[0] + height[1], y[2])
-        assertEquals(columnHeight, height[0] + height[1] + height[2])
-    }
-
     @Test
-    fun testColumn_doesNotPlaceChildrenOutOfBounds_becauseOfRoundings() = with(density) {
-        val expectedColumnHeight = 11f
-        val topPadding = 1f
-        var columnHeight = 0f
-        val height = Array(2) { 0f }
-        val y = Array(2) { 0f }
-        val latch = CountDownLatch(2)
-        show {
-            Column(
-                Modifier.wrapContentSize(Alignment.TopStart)
-                    .padding(top = topPadding.toDp())
-                    .heightIn(max = expectedColumnHeight.toDp())
-                    .onGloballyPositioned { coordinates ->
-                        columnHeight = coordinates.size.height.toFloat()
-                    }
-            ) {
-                Container(
-                    Modifier.weight(1f)
+    fun testColumn_doesNotPlaceChildrenOutOfBounds_becauseOfRoundings() =
+        with(density) {
+            val expectedColumnHeight = 11f
+            val topPadding = 1f
+            var columnHeight = 0f
+            val height = Array(2) { 0f }
+            val y = Array(2) { 0f }
+            val latch = CountDownLatch(2)
+            show {
+                Column(
+                    Modifier.wrapContentSize(Alignment.TopStart)
+                        .padding(top = topPadding.toDp())
+                        .heightIn(max = expectedColumnHeight.toDp())
                         .onGloballyPositioned { coordinates ->
+                            columnHeight = coordinates.size.height.toFloat()
+                        }
+                ) {
+                    Container(
+                        Modifier.weight(1f).onGloballyPositioned { coordinates ->
                             height[0] = coordinates.size.height.toFloat()
                             y[0] = coordinates.positionInRoot().y
                             latch.countDown()
                         }
-                ) {
-                }
-                Container(
-                    Modifier.weight(1f)
-                        .onGloballyPositioned { coordinates ->
+                    ) {}
+                    Container(
+                        Modifier.weight(1f).onGloballyPositioned { coordinates ->
                             height[1] = coordinates.size.height.toFloat()
                             y[1] = coordinates.positionInRoot().y
                             latch.countDown()
                         }
-                ) {
+                    ) {}
                 }
             }
+
+            assertTrue(latch.await(1, TimeUnit.SECONDS))
+
+            assertEquals(expectedColumnHeight, columnHeight)
+            assertEquals(topPadding, y[0])
+            assertEquals(topPadding + height[0], y[1])
+            assertEquals(columnHeight, height[0] + height[1])
         }
 
-        assertTrue(latch.await(1, TimeUnit.SECONDS))
-
-        assertEquals(expectedColumnHeight, columnHeight)
-        assertEquals(topPadding, y[0])
-        assertEquals(topPadding + height[0], y[1])
-        assertEquals(columnHeight, height[0] + height[1])
-    }
-
     // endregion
 
     // region Cross axis alignment tests in Row
     @Test
-    fun testRow_withStretchCrossAxisAlignment() = with(density) {
-        val sizeDp = 50.toDp()
-        val size = sizeDp.roundToPx()
+    fun testRow_withStretchCrossAxisAlignment() =
+        with(density) {
+            val sizeDp = 50.toDp()
+            val size = sizeDp.roundToPx()
 
-        val drawLatch = CountDownLatch(2)
-        val childSize = arrayOf(IntSize(-1, -1), IntSize(-1, -1))
-        val childPosition = arrayOf(Offset(-1f, -1f), Offset(-1f, -1f))
-        show {
-            Row {
-                Container(
-                    width = sizeDp,
-                    height = sizeDp,
-                    modifier = Modifier.fillMaxHeight()
-                        .onGloballyPositioned { coordinates ->
-                            childSize[0] = coordinates.size
-                            childPosition[0] = coordinates.positionInRoot()
-                            drawLatch.countDown()
-                        }
-                ) {
-                }
+            val drawLatch = CountDownLatch(2)
+            val childSize = arrayOf(IntSize(-1, -1), IntSize(-1, -1))
+            val childPosition = arrayOf(Offset(-1f, -1f), Offset(-1f, -1f))
+            show {
+                Row {
+                    Container(
+                        width = sizeDp,
+                        height = sizeDp,
+                        modifier =
+                            Modifier.fillMaxHeight().onGloballyPositioned { coordinates ->
+                                childSize[0] = coordinates.size
+                                childPosition[0] = coordinates.positionInRoot()
+                                drawLatch.countDown()
+                            }
+                    ) {}
 
-                Container(
-                    width = (sizeDp * 2),
-                    height = (sizeDp * 2),
-                    modifier = Modifier.fillMaxHeight()
-                        .onGloballyPositioned { coordinates ->
-                            childSize[1] = coordinates.size
-                            childPosition[1] = coordinates.positionInRoot()
-                            drawLatch.countDown()
-                        }
-                ) {
+                    Container(
+                        width = (sizeDp * 2),
+                        height = (sizeDp * 2),
+                        modifier =
+                            Modifier.fillMaxHeight().onGloballyPositioned { coordinates ->
+                                childSize[1] = coordinates.size
+                                childPosition[1] = coordinates.positionInRoot()
+                                drawLatch.countDown()
+                            }
+                    ) {}
                 }
             }
+            assertTrue(drawLatch.await(1, TimeUnit.SECONDS))
+
+            val root = findComposeView()
+            waitForDraw(root)
+
+            assertEquals(IntSize(size, root.height), childSize[0])
+            assertEquals(IntSize((sizeDp.toPx() * 2).roundToInt(), root.height), childSize[1])
+            assertEquals(Offset(0f, 0f), childPosition[0])
+            assertEquals(Offset(size.toFloat(), 0f), childPosition[1])
         }
-        assertTrue(drawLatch.await(1, TimeUnit.SECONDS))
-
-        val root = findComposeView()
-        waitForDraw(root)
-
-        assertEquals(IntSize(size, root.height), childSize[0])
-        assertEquals(
-            IntSize((sizeDp.toPx() * 2).roundToInt(), root.height),
-            childSize[1]
-        )
-        assertEquals(Offset(0f, 0f), childPosition[0])
-        assertEquals(Offset(size.toFloat(), 0f), childPosition[1])
-    }
 
     @Test
-    fun testRow_withGravityModifier_andGravityParameter() = with(density) {
-        val sizeDp = 50.toDp()
-        val size = sizeDp.roundToPx()
+    fun testRow_withGravityModifier_andGravityParameter() =
+        with(density) {
+            val sizeDp = 50.toDp()
+            val size = sizeDp.roundToPx()
 
-        val drawLatch = CountDownLatch(3)
-        val childSize = arrayOfNulls<IntSize>(3)
-        val childPosition = arrayOfNulls<Offset>(3)
-        show {
-            Row(Modifier.fillMaxHeight(), verticalAlignment = Alignment.CenterVertically) {
-                Container(
-                    width = sizeDp,
-                    height = sizeDp,
-                    modifier = Modifier.align(Alignment.Top)
-                        .onGloballyPositioned { coordinates ->
-                            childSize[0] = coordinates.size
-                            childPosition[0] = coordinates.positionInRoot()
-                            drawLatch.countDown()
-                        }
-                ) {
-                }
-                Container(
-                    width = sizeDp,
-                    height = sizeDp,
-                    modifier = Modifier.onGloballyPositioned { coordinates ->
-                        childSize[1] = coordinates.size
-                        childPosition[1] = coordinates.positionInRoot()
-                        drawLatch.countDown()
-                    }
-                ) {
-                }
-                Container(
-                    width = sizeDp,
-                    height = sizeDp,
-                    modifier = Modifier.align(Alignment.Bottom)
-                        .onGloballyPositioned { coordinates ->
-                            childSize[2] = coordinates.size
-                            childPosition[2] = coordinates.positionInRoot()
-                            drawLatch.countDown()
-                        }
-                ) {
+            val drawLatch = CountDownLatch(3)
+            val childSize = arrayOfNulls<IntSize>(3)
+            val childPosition = arrayOfNulls<Offset>(3)
+            show {
+                Row(Modifier.fillMaxHeight(), verticalAlignment = Alignment.CenterVertically) {
+                    Container(
+                        width = sizeDp,
+                        height = sizeDp,
+                        modifier =
+                            Modifier.align(Alignment.Top).onGloballyPositioned { coordinates ->
+                                childSize[0] = coordinates.size
+                                childPosition[0] = coordinates.positionInRoot()
+                                drawLatch.countDown()
+                            }
+                    ) {}
+                    Container(
+                        width = sizeDp,
+                        height = sizeDp,
+                        modifier =
+                            Modifier.onGloballyPositioned { coordinates ->
+                                childSize[1] = coordinates.size
+                                childPosition[1] = coordinates.positionInRoot()
+                                drawLatch.countDown()
+                            }
+                    ) {}
+                    Container(
+                        width = sizeDp,
+                        height = sizeDp,
+                        modifier =
+                            Modifier.align(Alignment.Bottom).onGloballyPositioned { coordinates ->
+                                childSize[2] = coordinates.size
+                                childPosition[2] = coordinates.positionInRoot()
+                                drawLatch.countDown()
+                            }
+                    ) {}
                 }
             }
+            assertTrue(drawLatch.await(1, TimeUnit.SECONDS))
+
+            val root = findComposeView()
+            waitForDraw(root)
+            val rootHeight = root.height
+
+            assertEquals(IntSize(size, size), childSize[0])
+            assertEquals(Offset(0f, 0f), childPosition[0])
+
+            assertEquals(IntSize(size, size), childSize[1])
+            assertEquals(
+                Offset(size.toFloat(), ((rootHeight - size.toFloat()) / 2f).roundToInt().toFloat()),
+                childPosition[1]
+            )
+
+            assertEquals(IntSize(size, size), childSize[2])
+            assertEquals(
+                Offset((size.toFloat() * 2), (rootHeight - size.toFloat())),
+                childPosition[2]
+            )
         }
-        assertTrue(drawLatch.await(1, TimeUnit.SECONDS))
-
-        val root = findComposeView()
-        waitForDraw(root)
-        val rootHeight = root.height
-
-        assertEquals(IntSize(size, size), childSize[0])
-        assertEquals(Offset(0f, 0f), childPosition[0])
-
-        assertEquals(IntSize(size, size), childSize[1])
-        assertEquals(
-            Offset(
-                size.toFloat(),
-                ((rootHeight - size.toFloat()) / 2f).roundToInt().toFloat()
-            ),
-            childPosition[1]
-        )
-
-        assertEquals(IntSize(size, size), childSize[2])
-        assertEquals(
-            Offset(
-                (size.toFloat() * 2),
-                (rootHeight - size.toFloat())
-            ),
-            childPosition[2]
-        )
-    }
 
     @Test
-    fun testRow_withGravityModifier() = with(density) {
-        val sizeDp = 50.toDp()
-        val size = sizeDp.roundToPx()
+    fun testRow_withGravityModifier() =
+        with(density) {
+            val sizeDp = 50.toDp()
+            val size = sizeDp.roundToPx()
 
-        val drawLatch = CountDownLatch(3)
-        val childSize = arrayOfNulls<IntSize>(3)
-        val childPosition = arrayOfNulls<Offset>(3)
-        show {
-            Row(Modifier.fillMaxHeight()) {
-                Container(
-                    width = sizeDp,
-                    height = sizeDp,
-                    modifier = Modifier.align(Alignment.Top)
-                        .onGloballyPositioned { coordinates ->
-                            childSize[0] = coordinates.size
-                            childPosition[0] = coordinates.positionInRoot()
-                            drawLatch.countDown()
-                        }
-                ) {
-                }
-                Container(
-                    width = sizeDp,
-                    height = sizeDp,
-                    modifier = Modifier.align(Alignment.CenterVertically)
-                        .onGloballyPositioned { coordinates ->
-                            childSize[1] = coordinates.size
-                            childPosition[1] = coordinates.positionInRoot()
-                            drawLatch.countDown()
-                        }
-                ) {
-                }
-                Container(
-                    width = sizeDp,
-                    height = sizeDp,
-                    modifier = Modifier.align(Alignment.Bottom)
-                        .onGloballyPositioned { coordinates ->
-                            childSize[2] = coordinates.size
-                            childPosition[2] = coordinates.positionInRoot()
-                            drawLatch.countDown()
-                        }
-                ) {
+            val drawLatch = CountDownLatch(3)
+            val childSize = arrayOfNulls<IntSize>(3)
+            val childPosition = arrayOfNulls<Offset>(3)
+            show {
+                Row(Modifier.fillMaxHeight()) {
+                    Container(
+                        width = sizeDp,
+                        height = sizeDp,
+                        modifier =
+                            Modifier.align(Alignment.Top).onGloballyPositioned { coordinates ->
+                                childSize[0] = coordinates.size
+                                childPosition[0] = coordinates.positionInRoot()
+                                drawLatch.countDown()
+                            }
+                    ) {}
+                    Container(
+                        width = sizeDp,
+                        height = sizeDp,
+                        modifier =
+                            Modifier.align(Alignment.CenterVertically).onGloballyPositioned {
+                                coordinates ->
+                                childSize[1] = coordinates.size
+                                childPosition[1] = coordinates.positionInRoot()
+                                drawLatch.countDown()
+                            }
+                    ) {}
+                    Container(
+                        width = sizeDp,
+                        height = sizeDp,
+                        modifier =
+                            Modifier.align(Alignment.Bottom).onGloballyPositioned { coordinates ->
+                                childSize[2] = coordinates.size
+                                childPosition[2] = coordinates.positionInRoot()
+                                drawLatch.countDown()
+                            }
+                    ) {}
                 }
             }
+            assertTrue(drawLatch.await(1, TimeUnit.SECONDS))
+
+            val root = findComposeView()
+            waitForDraw(root)
+            val rootHeight = root.height
+
+            assertEquals(IntSize(size, size), childSize[0])
+            assertEquals(Offset(0f, 0f), childPosition[0])
+
+            assertEquals(IntSize(size, size), childSize[1])
+            assertEquals(
+                Offset(size.toFloat(), ((rootHeight - size.toFloat()) / 2f).roundToInt().toFloat()),
+                childPosition[1]
+            )
+
+            assertEquals(IntSize(size, size), childSize[2])
+            assertEquals(
+                Offset((size.toFloat() * 2), (rootHeight - size.toFloat())),
+                childPosition[2]
+            )
         }
-        assertTrue(drawLatch.await(1, TimeUnit.SECONDS))
-
-        val root = findComposeView()
-        waitForDraw(root)
-        val rootHeight = root.height
-
-        assertEquals(IntSize(size, size), childSize[0])
-        assertEquals(Offset(0f, 0f), childPosition[0])
-
-        assertEquals(IntSize(size, size), childSize[1])
-        assertEquals(
-            Offset(
-                size.toFloat(),
-                ((rootHeight - size.toFloat()) / 2f).roundToInt().toFloat()
-            ),
-            childPosition[1]
-        )
-
-        assertEquals(IntSize(size, size), childSize[2])
-        assertEquals(
-            Offset((size.toFloat() * 2), (rootHeight - size.toFloat())),
-            childPosition[2]
-        )
-    }
 
     @Test
-    fun testRow_withAlignByModifier() = with(density) {
-        val baseline1Dp = 30.toDp()
-        val baseline1 = baseline1Dp.roundToPx()
-        val baseline2Dp = 25.toDp()
-        val baseline2 = baseline2Dp.roundToPx()
-        val baseline3Dp = 20.toDp()
-        val baseline3 = baseline3Dp.roundToPx()
-        val sizeDp = 40.toDp()
-        val size = sizeDp.roundToPx()
+    fun testRow_withAlignByModifier() =
+        with(density) {
+            val baseline1Dp = 30.toDp()
+            val baseline1 = baseline1Dp.roundToPx()
+            val baseline2Dp = 25.toDp()
+            val baseline2 = baseline2Dp.roundToPx()
+            val baseline3Dp = 20.toDp()
+            val baseline3 = baseline3Dp.roundToPx()
+            val sizeDp = 40.toDp()
+            val size = sizeDp.roundToPx()
 
-        val drawLatch = CountDownLatch(5)
-        val childSize = arrayOfNulls<IntSize>(5)
-        val childPosition = arrayOfNulls<Offset>(5)
-        show {
-            Row(Modifier.fillMaxHeight()) {
-                BaselineTestLayout(
-                    baseline = baseline1Dp,
-                    width = sizeDp,
-                    height = sizeDp,
-                    modifier = Modifier.alignBy(TestHorizontalLine)
-                        .onGloballyPositioned { coordinates ->
-                            childSize[0] = coordinates.size
-                            childPosition[0] = coordinates.positionInRoot()
-                            drawLatch.countDown()
-                        }
-                ) {
-                }
-                Container(
-                    width = sizeDp,
-                    height = sizeDp,
-                    modifier = Modifier.alignBy { it.measuredHeight / 2 }
-                        .onGloballyPositioned { coordinates ->
-                            childSize[1] = coordinates.size
-                            childPosition[1] = coordinates.positionInRoot()
-                            drawLatch.countDown()
-                        }
-                ) {
-                }
-                BaselineTestLayout(
-                    baseline = baseline2Dp,
-                    width = sizeDp,
-                    height = sizeDp,
-                    modifier = Modifier.alignBy(TestHorizontalLine)
-                        .onGloballyPositioned { coordinates ->
-                            childSize[2] = coordinates.size
-                            childPosition[2] = coordinates.positionInRoot()
-                            drawLatch.countDown()
-                        }
-                ) {
-                }
-                Container(
-                    width = sizeDp,
-                    height = sizeDp,
-                    modifier = Modifier.alignBy { it.measuredHeight * 3 / 4 }
-                        .onGloballyPositioned { coordinates ->
-                            childSize[3] = coordinates.size
-                            childPosition[3] = coordinates.positionInRoot()
-                            drawLatch.countDown()
-                        }
-                ) {
-                }
-                BaselineTestLayout(
-                    baseline = baseline3Dp,
-                    width = sizeDp,
-                    height = sizeDp,
-                    horizontalLine = FirstBaseline,
-                    modifier = Modifier.alignByBaseline()
-                        .onGloballyPositioned { coordinates ->
-                            childSize[4] = coordinates.size
-                            childPosition[4] = coordinates.positionInRoot()
-                            drawLatch.countDown()
-                        }
-                ) {
+            val drawLatch = CountDownLatch(5)
+            val childSize = arrayOfNulls<IntSize>(5)
+            val childPosition = arrayOfNulls<Offset>(5)
+            show {
+                Row(Modifier.fillMaxHeight()) {
+                    BaselineTestLayout(
+                        baseline = baseline1Dp,
+                        width = sizeDp,
+                        height = sizeDp,
+                        modifier =
+                            Modifier.alignBy(TestHorizontalLine).onGloballyPositioned { coordinates
+                                ->
+                                childSize[0] = coordinates.size
+                                childPosition[0] = coordinates.positionInRoot()
+                                drawLatch.countDown()
+                            }
+                    ) {}
+                    Container(
+                        width = sizeDp,
+                        height = sizeDp,
+                        modifier =
+                            Modifier.alignBy { it.measuredHeight / 2 }
+                                .onGloballyPositioned { coordinates ->
+                                    childSize[1] = coordinates.size
+                                    childPosition[1] = coordinates.positionInRoot()
+                                    drawLatch.countDown()
+                                }
+                    ) {}
+                    BaselineTestLayout(
+                        baseline = baseline2Dp,
+                        width = sizeDp,
+                        height = sizeDp,
+                        modifier =
+                            Modifier.alignBy(TestHorizontalLine).onGloballyPositioned { coordinates
+                                ->
+                                childSize[2] = coordinates.size
+                                childPosition[2] = coordinates.positionInRoot()
+                                drawLatch.countDown()
+                            }
+                    ) {}
+                    Container(
+                        width = sizeDp,
+                        height = sizeDp,
+                        modifier =
+                            Modifier.alignBy { it.measuredHeight * 3 / 4 }
+                                .onGloballyPositioned { coordinates ->
+                                    childSize[3] = coordinates.size
+                                    childPosition[3] = coordinates.positionInRoot()
+                                    drawLatch.countDown()
+                                }
+                    ) {}
+                    BaselineTestLayout(
+                        baseline = baseline3Dp,
+                        width = sizeDp,
+                        height = sizeDp,
+                        horizontalLine = FirstBaseline,
+                        modifier =
+                            Modifier.alignByBaseline().onGloballyPositioned { coordinates ->
+                                childSize[4] = coordinates.size
+                                childPosition[4] = coordinates.positionInRoot()
+                                drawLatch.countDown()
+                            }
+                    ) {}
                 }
             }
+            assertTrue(drawLatch.await(1, TimeUnit.SECONDS))
+
+            assertEquals(IntSize(size, size), childSize[0])
+            assertEquals(Offset(0f, 0f), childPosition[0])
+
+            assertEquals(IntSize(size, size), childSize[1])
+            assertEquals(
+                Offset(size.toFloat(), (baseline1.toFloat() - (size.toFloat() / 2).roundToInt())),
+                childPosition[1]
+            )
+
+            assertEquals(IntSize(size, size), childSize[2])
+            assertEquals(
+                Offset((size.toFloat() * 2), (baseline1 - baseline2).toFloat()),
+                childPosition[2]
+            )
+
+            assertEquals(IntSize(size, size), childSize[3])
+            assertEquals(Offset((size.toFloat() * 3), 0f), childPosition[3])
+
+            assertEquals(IntSize(size, size), childSize[4])
+            assertEquals(
+                Offset((size.toFloat() * 4), (baseline1 - baseline3).toFloat()),
+                childPosition[4]
+            )
         }
-        assertTrue(drawLatch.await(1, TimeUnit.SECONDS))
-
-        assertEquals(IntSize(size, size), childSize[0])
-        assertEquals(Offset(0f, 0f), childPosition[0])
-
-        assertEquals(IntSize(size, size), childSize[1])
-        assertEquals(
-            Offset(
-                size.toFloat(),
-                (baseline1.toFloat() - (size.toFloat() / 2).roundToInt())
-            ),
-            childPosition[1]
-        )
-
-        assertEquals(IntSize(size, size), childSize[2])
-        assertEquals(
-            Offset((size.toFloat() * 2), (baseline1 - baseline2).toFloat()),
-            childPosition[2]
-        )
-
-        assertEquals(IntSize(size, size), childSize[3])
-        assertEquals(
-            Offset((size.toFloat() * 3), 0f),
-            childPosition[3]
-        )
-
-        assertEquals(IntSize(size, size), childSize[4])
-        assertEquals(
-            Offset((size.toFloat() * 4), (baseline1 - baseline3).toFloat()),
-            childPosition[4]
-        )
-    }
 
     @Test
-    fun testRow_withAlignByModifier_andWeight() = with(density) {
-        val baselineDp = 30.toDp()
-        val baseline = baselineDp.roundToPx()
-        val sizeDp = 40.toDp()
-        val size = sizeDp.roundToPx()
+    fun testRow_withAlignByModifier_andWeight() =
+        with(density) {
+            val baselineDp = 30.toDp()
+            val baseline = baselineDp.roundToPx()
+            val sizeDp = 40.toDp()
+            val size = sizeDp.roundToPx()
 
-        val drawLatch = CountDownLatch(2)
-        val childSize = arrayOfNulls<IntSize>(2)
-        val childPosition = arrayOfNulls<Offset>(2)
-        show {
-            Row(Modifier.fillMaxHeight()) {
-                BaselineTestLayout(
-                    baseline = baselineDp,
-                    width = sizeDp,
-                    height = sizeDp,
-                    modifier = Modifier.alignBy(TestHorizontalLine)
-                        .onGloballyPositioned { coordinates ->
-                            childSize[0] = coordinates.size
-                            childPosition[0] = coordinates.positionInRoot()
-                            drawLatch.countDown()
-                        }
-                ) {
-                }
-                Container(
-                    height = sizeDp,
-                    modifier = Modifier.alignBy { it.measuredHeight / 2 }
-                        .weight(1f)
-                        .onGloballyPositioned { coordinates ->
-                            childSize[1] = coordinates.size
-                            childPosition[1] = coordinates.positionInRoot()
-                            drawLatch.countDown()
-                        }
-                ) {
+            val drawLatch = CountDownLatch(2)
+            val childSize = arrayOfNulls<IntSize>(2)
+            val childPosition = arrayOfNulls<Offset>(2)
+            show {
+                Row(Modifier.fillMaxHeight()) {
+                    BaselineTestLayout(
+                        baseline = baselineDp,
+                        width = sizeDp,
+                        height = sizeDp,
+                        modifier =
+                            Modifier.alignBy(TestHorizontalLine).onGloballyPositioned { coordinates
+                                ->
+                                childSize[0] = coordinates.size
+                                childPosition[0] = coordinates.positionInRoot()
+                                drawLatch.countDown()
+                            }
+                    ) {}
+                    Container(
+                        height = sizeDp,
+                        modifier =
+                            Modifier.alignBy { it.measuredHeight / 2 }
+                                .weight(1f)
+                                .onGloballyPositioned { coordinates ->
+                                    childSize[1] = coordinates.size
+                                    childPosition[1] = coordinates.positionInRoot()
+                                    drawLatch.countDown()
+                                }
+                    ) {}
                 }
             }
+            assertTrue(drawLatch.await(1, TimeUnit.SECONDS))
+
+            assertEquals(IntSize(size, size), childSize[0])
+            assertEquals(Offset(0f, 0f), childPosition[0])
+
+            assertEquals(size, childSize[1]!!.height)
+            assertEquals(Offset(size.toFloat(), (baseline - size / 2).toFloat()), childPosition[1])
         }
-        assertTrue(drawLatch.await(1, TimeUnit.SECONDS))
 
-        assertEquals(IntSize(size, size), childSize[0])
-        assertEquals(Offset(0f, 0f), childPosition[0])
-
-        assertEquals(size, childSize[1]!!.height)
-        assertEquals(
-            Offset(size.toFloat(), (baseline - size / 2).toFloat()),
-            childPosition[1]
-        )
-    }
     // endregion
 
     // region Cross axis alignment tests in Column
     @Test
-    fun testColumn_withStretchCrossAxisAlignment() = with(density) {
-        val sizeDp = 50.toDp()
-        val size = sizeDp.roundToPx()
+    fun testColumn_withStretchCrossAxisAlignment() =
+        with(density) {
+            val sizeDp = 50.toDp()
+            val size = sizeDp.roundToPx()
 
-        val drawLatch = CountDownLatch(2)
-        val childSize = arrayOf(IntSize(-1, -1), IntSize(-1, -1))
-        val childPosition = arrayOf(Offset(-1f, -1f), Offset(-1f, -1f))
-        show {
-            Column {
-                Container(
-                    width = sizeDp,
-                    height = sizeDp,
-                    modifier = Modifier.fillMaxWidth()
-                        .onGloballyPositioned { coordinates ->
-                            childSize[0] = coordinates.size
-                            childPosition[0] = coordinates.positionInRoot()
-                            drawLatch.countDown()
-                        }
-                ) {
-                }
+            val drawLatch = CountDownLatch(2)
+            val childSize = arrayOf(IntSize(-1, -1), IntSize(-1, -1))
+            val childPosition = arrayOf(Offset(-1f, -1f), Offset(-1f, -1f))
+            show {
+                Column {
+                    Container(
+                        width = sizeDp,
+                        height = sizeDp,
+                        modifier =
+                            Modifier.fillMaxWidth().onGloballyPositioned { coordinates ->
+                                childSize[0] = coordinates.size
+                                childPosition[0] = coordinates.positionInRoot()
+                                drawLatch.countDown()
+                            }
+                    ) {}
 
-                Container(
-                    width = (sizeDp * 2),
-                    height = (sizeDp * 2),
-                    modifier = Modifier.fillMaxWidth()
-                        .onGloballyPositioned { coordinates ->
-                            childSize[1] = coordinates.size
-                            childPosition[1] = coordinates.positionInRoot()
-                            drawLatch.countDown()
-                        }
-                ) {
+                    Container(
+                        width = (sizeDp * 2),
+                        height = (sizeDp * 2),
+                        modifier =
+                            Modifier.fillMaxWidth().onGloballyPositioned { coordinates ->
+                                childSize[1] = coordinates.size
+                                childPosition[1] = coordinates.positionInRoot()
+                                drawLatch.countDown()
+                            }
+                    ) {}
                 }
             }
+            assertTrue(drawLatch.await(1, TimeUnit.SECONDS))
+
+            val root = findComposeView()
+            waitForDraw(root)
+
+            assertEquals(IntSize(root.width, size), childSize[0])
+            assertEquals(IntSize(root.width, (sizeDp * 2).roundToPx()), childSize[1])
+            assertEquals(Offset(0f, 0f), childPosition[0])
+            assertEquals(Offset(0f, size.toFloat()), childPosition[1])
         }
-        assertTrue(drawLatch.await(1, TimeUnit.SECONDS))
-
-        val root = findComposeView()
-        waitForDraw(root)
-
-        assertEquals(IntSize(root.width, size), childSize[0])
-        assertEquals(
-            IntSize(root.width, (sizeDp * 2).roundToPx()),
-            childSize[1]
-        )
-        assertEquals(Offset(0f, 0f), childPosition[0])
-        assertEquals(Offset(0f, size.toFloat()), childPosition[1])
-    }
 
     @Test
-    fun testColumn_withGravityModifier() = with(density) {
-        val sizeDp = 50.toDp()
-        val size = sizeDp.roundToPx()
+    fun testColumn_withGravityModifier() =
+        with(density) {
+            val sizeDp = 50.toDp()
+            val size = sizeDp.roundToPx()
 
-        val drawLatch = CountDownLatch(3)
-        val childSize = arrayOfNulls<IntSize>(3)
-        val childPosition = arrayOfNulls<Offset>(3)
-        show {
-            Column(Modifier.fillMaxWidth()) {
-                Container(
-                    width = sizeDp,
-                    height = sizeDp,
-                    modifier = Modifier.align(Alignment.Start)
-                        .onGloballyPositioned { coordinates ->
-                            childSize[0] = coordinates.size
-                            childPosition[0] = coordinates.positionInRoot()
-                            drawLatch.countDown()
-                        }
-                ) {
-                }
-                Container(
-                    width = sizeDp,
-                    height = sizeDp,
-                    modifier = Modifier.align(Alignment.CenterHorizontally)
-                        .onGloballyPositioned { coordinates ->
-                            childSize[1] = coordinates.size
-                            childPosition[1] = coordinates.positionInRoot()
-                            drawLatch.countDown()
-                        }
-                ) {
-                }
-                Container(
-                    width = sizeDp,
-                    height = sizeDp,
-                    modifier = Modifier.align(Alignment.End)
-                        .onGloballyPositioned { coordinates ->
-                            childSize[2] = coordinates.size
-                            childPosition[2] = coordinates.positionInRoot()
-                            drawLatch.countDown()
-                        }
-                ) {
+            val drawLatch = CountDownLatch(3)
+            val childSize = arrayOfNulls<IntSize>(3)
+            val childPosition = arrayOfNulls<Offset>(3)
+            show {
+                Column(Modifier.fillMaxWidth()) {
+                    Container(
+                        width = sizeDp,
+                        height = sizeDp,
+                        modifier =
+                            Modifier.align(Alignment.Start).onGloballyPositioned { coordinates ->
+                                childSize[0] = coordinates.size
+                                childPosition[0] = coordinates.positionInRoot()
+                                drawLatch.countDown()
+                            }
+                    ) {}
+                    Container(
+                        width = sizeDp,
+                        height = sizeDp,
+                        modifier =
+                            Modifier.align(Alignment.CenterHorizontally).onGloballyPositioned {
+                                coordinates ->
+                                childSize[1] = coordinates.size
+                                childPosition[1] = coordinates.positionInRoot()
+                                drawLatch.countDown()
+                            }
+                    ) {}
+                    Container(
+                        width = sizeDp,
+                        height = sizeDp,
+                        modifier =
+                            Modifier.align(Alignment.End).onGloballyPositioned { coordinates ->
+                                childSize[2] = coordinates.size
+                                childPosition[2] = coordinates.positionInRoot()
+                                drawLatch.countDown()
+                            }
+                    ) {}
                 }
             }
+            assertTrue(drawLatch.await(1, TimeUnit.SECONDS))
+
+            val root = findComposeView()
+            waitForDraw(root)
+            val rootWidth = root.width
+
+            assertEquals(IntSize(size, size), childSize[0])
+            assertEquals(Offset(0f, 0f), childPosition[0])
+
+            assertEquals(IntSize(size, size), childSize[1])
+            assertEquals(
+                Offset(((rootWidth - size.toFloat()) / 2).roundToInt().toFloat(), size.toFloat()),
+                childPosition[1]
+            )
+
+            assertEquals(IntSize(size, size), childSize[2])
+            assertEquals(Offset((rootWidth - size.toFloat()), size.toFloat() * 2), childPosition[2])
         }
-        assertTrue(drawLatch.await(1, TimeUnit.SECONDS))
-
-        val root = findComposeView()
-        waitForDraw(root)
-        val rootWidth = root.width
-
-        assertEquals(IntSize(size, size), childSize[0])
-        assertEquals(Offset(0f, 0f), childPosition[0])
-
-        assertEquals(IntSize(size, size), childSize[1])
-        assertEquals(
-            Offset(
-                ((rootWidth - size.toFloat()) / 2).roundToInt().toFloat(),
-                size.toFloat()
-            ),
-            childPosition[1]
-        )
-
-        assertEquals(IntSize(size, size), childSize[2])
-        assertEquals(
-            Offset((rootWidth - size.toFloat()), size.toFloat() * 2),
-            childPosition[2]
-        )
-    }
 
     @Test
-    fun testColumn_withGravityModifier_andGravityParameter() = with(density) {
-        val sizeDp = 50.toDp()
-        val size = sizeDp.roundToPx()
+    fun testColumn_withGravityModifier_andGravityParameter() =
+        with(density) {
+            val sizeDp = 50.toDp()
+            val size = sizeDp.roundToPx()
 
-        val drawLatch = CountDownLatch(3)
-        val childSize = arrayOfNulls<IntSize>(3)
-        val childPosition = arrayOfNulls<Offset>(3)
-        show {
-            Column(Modifier.fillMaxWidth(), horizontalAlignment = Alignment.CenterHorizontally) {
-                Container(
-                    width = sizeDp,
-                    height = sizeDp,
-                    modifier = Modifier.align(Alignment.Start)
-                        .onGloballyPositioned { coordinates ->
-                            childSize[0] = coordinates.size
-                            childPosition[0] = coordinates.positionInRoot()
-                            drawLatch.countDown()
-                        }
+            val drawLatch = CountDownLatch(3)
+            val childSize = arrayOfNulls<IntSize>(3)
+            val childPosition = arrayOfNulls<Offset>(3)
+            show {
+                Column(
+                    Modifier.fillMaxWidth(),
+                    horizontalAlignment = Alignment.CenterHorizontally
                 ) {
-                }
-                Container(
-                    width = sizeDp,
-                    height = sizeDp,
-                    modifier = Modifier.onGloballyPositioned { coordinates ->
-                        childSize[1] = coordinates.size
-                        childPosition[1] = coordinates.positionInRoot()
-                        drawLatch.countDown()
-                    }
-                ) {
-                }
-                Container(
-                    width = sizeDp,
-                    height = sizeDp,
-                    modifier = Modifier.align(Alignment.End)
-                        .onGloballyPositioned { coordinates ->
-                            childSize[2] = coordinates.size
-                            childPosition[2] = coordinates.positionInRoot()
-                            drawLatch.countDown()
-                        }
-                ) {
+                    Container(
+                        width = sizeDp,
+                        height = sizeDp,
+                        modifier =
+                            Modifier.align(Alignment.Start).onGloballyPositioned { coordinates ->
+                                childSize[0] = coordinates.size
+                                childPosition[0] = coordinates.positionInRoot()
+                                drawLatch.countDown()
+                            }
+                    ) {}
+                    Container(
+                        width = sizeDp,
+                        height = sizeDp,
+                        modifier =
+                            Modifier.onGloballyPositioned { coordinates ->
+                                childSize[1] = coordinates.size
+                                childPosition[1] = coordinates.positionInRoot()
+                                drawLatch.countDown()
+                            }
+                    ) {}
+                    Container(
+                        width = sizeDp,
+                        height = sizeDp,
+                        modifier =
+                            Modifier.align(Alignment.End).onGloballyPositioned { coordinates ->
+                                childSize[2] = coordinates.size
+                                childPosition[2] = coordinates.positionInRoot()
+                                drawLatch.countDown()
+                            }
+                    ) {}
                 }
             }
+            assertTrue(drawLatch.await(1, TimeUnit.SECONDS))
+
+            val root = findComposeView()
+            waitForDraw(root)
+            val rootWidth = root.width
+
+            assertEquals(IntSize(size, size), childSize[0])
+            assertEquals(Offset(0f, 0f), childPosition[0])
+
+            assertEquals(IntSize(size, size), childSize[1])
+            assertEquals(
+                Offset(((rootWidth - size.toFloat()) / 2).roundToInt().toFloat(), size.toFloat()),
+                childPosition[1]
+            )
+
+            assertEquals(IntSize(size, size), childSize[2])
+            assertEquals(Offset((rootWidth - size.toFloat()), size.toFloat() * 2), childPosition[2])
         }
-        assertTrue(drawLatch.await(1, TimeUnit.SECONDS))
-
-        val root = findComposeView()
-        waitForDraw(root)
-        val rootWidth = root.width
-
-        assertEquals(IntSize(size, size), childSize[0])
-        assertEquals(Offset(0f, 0f), childPosition[0])
-
-        assertEquals(IntSize(size, size), childSize[1])
-        assertEquals(
-            Offset(
-                ((rootWidth - size.toFloat()) / 2).roundToInt().toFloat(),
-                size.toFloat()
-            ),
-            childPosition[1]
-        )
-
-        assertEquals(IntSize(size, size), childSize[2])
-        assertEquals(
-            Offset((rootWidth - size.toFloat()), size.toFloat() * 2),
-            childPosition[2]
-        )
-    }
 
     @Test
-    fun testColumn_withAlignByModifier() = with(density) {
-        val sizeDp = 40.toDp()
-        val size = sizeDp.roundToPx()
-        val firstBaseline1Dp = 20.toDp()
-        val firstBaseline2Dp = 30.toDp()
+    fun testColumn_withAlignByModifier() =
+        with(density) {
+            val sizeDp = 40.toDp()
+            val size = sizeDp.roundToPx()
+            val firstBaseline1Dp = 20.toDp()
+            val firstBaseline2Dp = 30.toDp()
 
-        val drawLatch = CountDownLatch(4)
-        val childSize = arrayOfNulls<IntSize>(4)
-        val childPosition = arrayOfNulls<Offset>(4)
-        show {
-            Column(Modifier.fillMaxWidth()) {
-                Container(
-                    width = sizeDp,
-                    height = sizeDp,
-                    modifier = Modifier.alignBy { it.measuredWidth }
-                        .onGloballyPositioned { coordinates ->
-                            childSize[0] = coordinates.size
-                            childPosition[0] = coordinates.positionInRoot()
-                            drawLatch.countDown()
-                        }
-                ) {
-                }
-                Container(
-                    width = sizeDp,
-                    height = sizeDp,
-                    modifier = Modifier.alignBy { 0 }
-                        .onGloballyPositioned { coordinates ->
-                            childSize[1] = coordinates.size
-                            childPosition[1] = coordinates.positionInRoot()
-                            drawLatch.countDown()
-                        }
-                ) {
-                }
-                BaselineTestLayout(
-                    width = sizeDp,
-                    height = sizeDp,
-                    baseline = firstBaseline1Dp,
-                    modifier = Modifier.alignBy(TestVerticalLine)
-                        .onGloballyPositioned { coordinates ->
-                            childSize[2] = coordinates.size
-                            childPosition[2] = coordinates.positionInRoot()
-                            drawLatch.countDown()
-                        }
-                ) {
-                }
-                BaselineTestLayout(
-                    width = sizeDp,
-                    height = sizeDp,
-                    baseline = firstBaseline2Dp,
-                    modifier = Modifier.alignBy(TestVerticalLine)
-                        .onGloballyPositioned { coordinates ->
-                            childSize[3] = coordinates.size
-                            childPosition[3] = coordinates.positionInRoot()
-                            drawLatch.countDown()
-                        }
-                ) {
+            val drawLatch = CountDownLatch(4)
+            val childSize = arrayOfNulls<IntSize>(4)
+            val childPosition = arrayOfNulls<Offset>(4)
+            show {
+                Column(Modifier.fillMaxWidth()) {
+                    Container(
+                        width = sizeDp,
+                        height = sizeDp,
+                        modifier =
+                            Modifier.alignBy { it.measuredWidth }
+                                .onGloballyPositioned { coordinates ->
+                                    childSize[0] = coordinates.size
+                                    childPosition[0] = coordinates.positionInRoot()
+                                    drawLatch.countDown()
+                                }
+                    ) {}
+                    Container(
+                        width = sizeDp,
+                        height = sizeDp,
+                        modifier =
+                            Modifier.alignBy { 0 }
+                                .onGloballyPositioned { coordinates ->
+                                    childSize[1] = coordinates.size
+                                    childPosition[1] = coordinates.positionInRoot()
+                                    drawLatch.countDown()
+                                }
+                    ) {}
+                    BaselineTestLayout(
+                        width = sizeDp,
+                        height = sizeDp,
+                        baseline = firstBaseline1Dp,
+                        modifier =
+                            Modifier.alignBy(TestVerticalLine).onGloballyPositioned { coordinates ->
+                                childSize[2] = coordinates.size
+                                childPosition[2] = coordinates.positionInRoot()
+                                drawLatch.countDown()
+                            }
+                    ) {}
+                    BaselineTestLayout(
+                        width = sizeDp,
+                        height = sizeDp,
+                        baseline = firstBaseline2Dp,
+                        modifier =
+                            Modifier.alignBy(TestVerticalLine).onGloballyPositioned { coordinates ->
+                                childSize[3] = coordinates.size
+                                childPosition[3] = coordinates.positionInRoot()
+                                drawLatch.countDown()
+                            }
+                    ) {}
                 }
             }
+            assertTrue(drawLatch.await(1, TimeUnit.SECONDS))
+
+            assertEquals(IntSize(size, size), childSize[0])
+            assertEquals(Offset(0f, 0f), childPosition[0])
+
+            assertEquals(IntSize(size, size), childSize[1])
+            assertEquals(Offset(size.toFloat(), size.toFloat()), childPosition[1])
+
+            assertEquals(IntSize(size, size), childSize[2])
+            assertEquals(
+                Offset((size - firstBaseline1Dp.roundToPx()).toFloat(), size.toFloat() * 2),
+                childPosition[2]
+            )
+
+            assertEquals(IntSize(size, size), childSize[3])
+            assertEquals(
+                Offset((size - firstBaseline2Dp.roundToPx()).toFloat(), size.toFloat() * 3),
+                childPosition[3]
+            )
         }
-        assertTrue(drawLatch.await(1, TimeUnit.SECONDS))
-
-        assertEquals(IntSize(size, size), childSize[0])
-        assertEquals(Offset(0f, 0f), childPosition[0])
-
-        assertEquals(IntSize(size, size), childSize[1])
-        assertEquals(Offset(size.toFloat(), size.toFloat()), childPosition[1])
-
-        assertEquals(IntSize(size, size), childSize[2])
-        assertEquals(
-            Offset(
-                (size - firstBaseline1Dp.roundToPx()).toFloat(),
-                size.toFloat() * 2
-            ),
-            childPosition[2]
-        )
-
-        assertEquals(IntSize(size, size), childSize[3])
-        assertEquals(
-            Offset(
-                (size - firstBaseline2Dp.roundToPx()).toFloat(),
-                size.toFloat() * 3
-            ),
-            childPosition[3]
-        )
-    }
 
     @Test
-    fun testColumn_withAlignByModifier_andWeight() = with(density) {
-        val baselineDp = 30.toDp()
-        val baseline = baselineDp.roundToPx()
-        val sizeDp = 40.toDp()
-        val size = sizeDp.roundToPx()
+    fun testColumn_withAlignByModifier_andWeight() =
+        with(density) {
+            val baselineDp = 30.toDp()
+            val baseline = baselineDp.roundToPx()
+            val sizeDp = 40.toDp()
+            val size = sizeDp.roundToPx()
 
-        val drawLatch = CountDownLatch(2)
-        val childSize = arrayOfNulls<IntSize>(2)
-        val childPosition = arrayOfNulls<Offset>(2)
-        show {
-            Column(Modifier.fillMaxWidth()) {
-                BaselineTestLayout(
-                    baseline = baselineDp,
-                    width = sizeDp,
-                    height = sizeDp,
-                    modifier = Modifier.alignBy(TestVerticalLine)
-                        .onGloballyPositioned { coordinates ->
-                            childSize[0] = coordinates.size
-                            childPosition[0] = coordinates.positionInRoot()
-                            drawLatch.countDown()
-                        }
-                ) {
-                }
-                Container(
-                    width = sizeDp,
-                    modifier = Modifier.alignBy { it.measuredWidth / 2 }
-                        .weight(1f)
-                        .onGloballyPositioned { coordinates ->
-                            childSize[1] = coordinates.size
-                            childPosition[1] = coordinates.positionInRoot()
-                            drawLatch.countDown()
-                        }
-                ) {
+            val drawLatch = CountDownLatch(2)
+            val childSize = arrayOfNulls<IntSize>(2)
+            val childPosition = arrayOfNulls<Offset>(2)
+            show {
+                Column(Modifier.fillMaxWidth()) {
+                    BaselineTestLayout(
+                        baseline = baselineDp,
+                        width = sizeDp,
+                        height = sizeDp,
+                        modifier =
+                            Modifier.alignBy(TestVerticalLine).onGloballyPositioned { coordinates ->
+                                childSize[0] = coordinates.size
+                                childPosition[0] = coordinates.positionInRoot()
+                                drawLatch.countDown()
+                            }
+                    ) {}
+                    Container(
+                        width = sizeDp,
+                        modifier =
+                            Modifier.alignBy { it.measuredWidth / 2 }
+                                .weight(1f)
+                                .onGloballyPositioned { coordinates ->
+                                    childSize[1] = coordinates.size
+                                    childPosition[1] = coordinates.positionInRoot()
+                                    drawLatch.countDown()
+                                }
+                    ) {}
                 }
             }
+            assertTrue(drawLatch.await(1, TimeUnit.SECONDS))
+
+            assertEquals(IntSize(size, size), childSize[0])
+            assertEquals(Offset(0f, 0f), childPosition[0])
+
+            assertEquals(size, childSize[1]!!.width)
+            assertEquals(
+                Offset((baseline - (size / 2)).toFloat(), size.toFloat()),
+                childPosition[1]
+            )
         }
-        assertTrue(drawLatch.await(1, TimeUnit.SECONDS))
 
-        assertEquals(IntSize(size, size), childSize[0])
-        assertEquals(Offset(0f, 0f), childPosition[0])
-
-        assertEquals(size, childSize[1]!!.width)
-        assertEquals(
-            Offset((baseline - (size / 2)).toFloat(), size.toFloat()),
-            childPosition[1]
-        )
-    }
     // endregion
 
     // region Size tests in Row
     @Test
-    fun testRow_expandedWidth_withExpandedModifier() = with(density) {
-        val sizeDp = 50.toDp()
+    fun testRow_expandedWidth_withExpandedModifier() =
+        with(density) {
+            val sizeDp = 50.toDp()
 
-        val drawLatch = CountDownLatch(1)
-        var rowSize: IntSize = IntSize.Zero
-        show {
-            Center {
-                Row(
-                    Modifier.fillMaxWidth().onGloballyPositioned { coordinates ->
-                        rowSize = coordinates.size
-                        drawLatch.countDown()
-                    }
-                ) {
-                    Spacer(Modifier.size(width = sizeDp, height = sizeDp))
-                    Spacer(Modifier.size(width = (sizeDp * 2), height = (sizeDp * 2)))
-                }
-            }
-        }
-        assertTrue(drawLatch.await(1, TimeUnit.SECONDS))
-
-        val root = findComposeView()
-        waitForDraw(root)
-
-        assertEquals(
-            root.width,
-            rowSize.width
-        )
-    }
-
-    @Test
-    fun testRow_wrappedWidth_withNoWeightChildren() = with(density) {
-        val sizeDp = 50.toDp()
-
-        val drawLatch = CountDownLatch(1)
-        var rowSize: IntSize = IntSize.Zero
-        show {
-            Center {
-                Row(
-                    Modifier.onGloballyPositioned { coordinates: LayoutCoordinates ->
-                        rowSize = coordinates.size
-                        drawLatch.countDown()
-                    }
-                ) {
-                    Spacer(Modifier.size(width = sizeDp, height = sizeDp))
-                    Spacer(Modifier.size(width = (sizeDp * 2), height = (sizeDp * 2)))
-                }
-            }
-        }
-        assertTrue(drawLatch.await(1, TimeUnit.SECONDS))
-
-        val root = findComposeView()
-        waitForDraw(root)
-
-        assertEquals(
-            (sizeDp * 3).roundToPx(),
-            rowSize.width
-        )
-    }
-
-    @Test
-    fun testRow_expandedWidth_withWeightChildren() = with(density) {
-        val sizeDp = 50.toDp()
-
-        val drawLatch = CountDownLatch(1)
-        var rowSize: IntSize = IntSize.Zero
-        show {
-            Center {
-                Row(
-                    Modifier.onGloballyPositioned { coordinates: LayoutCoordinates ->
-                        rowSize = coordinates.size
-                        drawLatch.countDown()
-                    }
-                ) {
-                    Container(
-                        Modifier.weight(1f),
-                        width = sizeDp,
-                        height = sizeDp,
-                        content = {}
-                    )
-                    Container(
-                        width = (sizeDp * 2),
-                        height = (sizeDp * 2),
-                        content = {}
-                    )
-                }
-            }
-        }
-        assertTrue(drawLatch.await(1, TimeUnit.SECONDS))
-
-        val root = findComposeView()
-        waitForDraw(root)
-
-        assertEquals(
-            root.width,
-            rowSize.width
-        )
-    }
-
-    @Test
-    fun testRow_withMaxCrossAxisSize() = with(density) {
-        val sizeDp = 50.toDp()
-
-        val drawLatch = CountDownLatch(1)
-        var rowSize: IntSize = IntSize.Zero
-        show {
-            Center {
-                Row(
-                    Modifier.fillMaxHeight().onGloballyPositioned { coordinates ->
-                        rowSize = coordinates.size
-                        drawLatch.countDown()
-                    }
-                ) {
-                    Spacer(Modifier.size(width = sizeDp, height = sizeDp))
-                    Spacer(Modifier.size(width = (sizeDp * 2), height = (sizeDp * 2)))
-                }
-            }
-        }
-        assertTrue(drawLatch.await(1, TimeUnit.SECONDS))
-
-        val root = findComposeView()
-        waitForDraw(root)
-
-        assertEquals(
-            root.height,
-            rowSize.height
-        )
-    }
-
-    @Test
-    fun testRow_withMinCrossAxisSize() = with(density) {
-        val sizeDp = 50.toDp()
-
-        val drawLatch = CountDownLatch(1)
-        var rowSize: IntSize = IntSize.Zero
-        show {
-            Center {
-                Row(
-                    Modifier.onGloballyPositioned { coordinates: LayoutCoordinates ->
-                        rowSize = coordinates.size
-                        drawLatch.countDown()
-                    }
-                ) {
-                    Spacer(Modifier.size(width = sizeDp, height = sizeDp))
-                    Spacer(Modifier.size(width = (sizeDp * 2), height = (sizeDp * 2)))
-                }
-            }
-        }
-        assertTrue(drawLatch.await(1, TimeUnit.SECONDS))
-
-        val root = findComposeView()
-        waitForDraw(root)
-
-        assertEquals(
-            (sizeDp * 2).roundToPx(),
-            rowSize.height
-        )
-    }
-
-    @Test
-    fun testRow_withExpandedModifier_respectsMaxWidthConstraint() = with(density) {
-        val sizeDp = 50.toDp()
-        val rowWidthDp = 250.toDp()
-
-        val drawLatch = CountDownLatch(1)
-        var rowSize: IntSize = IntSize.Zero
-        show {
-            Center {
-                ConstrainedBox(constraints = DpConstraints(maxWidth = rowWidthDp)) {
+            val drawLatch = CountDownLatch(1)
+            var rowSize: IntSize = IntSize.Zero
+            show {
+                Center {
                     Row(
                         Modifier.fillMaxWidth().onGloballyPositioned { coordinates ->
                             rowSize = coordinates.size
@@ -1697,32 +1418,55 @@
                         }
                     ) {
                         Spacer(Modifier.size(width = sizeDp, height = sizeDp))
-                        Spacer(Modifier.size(width = sizeDp * 2, height = sizeDp * 2))
+                        Spacer(Modifier.size(width = (sizeDp * 2), height = (sizeDp * 2)))
                     }
                 }
             }
+            assertTrue(drawLatch.await(1, TimeUnit.SECONDS))
+
+            val root = findComposeView()
+            waitForDraw(root)
+
+            assertEquals(root.width, rowSize.width)
         }
-        assertTrue(drawLatch.await(1, TimeUnit.SECONDS))
-
-        val root = findComposeView()
-        waitForDraw(root)
-
-        assertEquals(
-            min(root.width, rowWidthDp.roundToPx()),
-            rowSize.width
-        )
-    }
 
     @Test
-    fun testRow_withChildrenWithWeight_respectsMaxWidthConstraint() = with(density) {
-        val sizeDp = 50.toDp()
-        val rowWidthDp = 250.toDp()
+    fun testRow_wrappedWidth_withNoWeightChildren() =
+        with(density) {
+            val sizeDp = 50.toDp()
 
-        val drawLatch = CountDownLatch(1)
-        var rowSize: IntSize = IntSize.Zero
-        show {
-            Center {
-                ConstrainedBox(constraints = DpConstraints(maxWidth = rowWidthDp)) {
+            val drawLatch = CountDownLatch(1)
+            var rowSize: IntSize = IntSize.Zero
+            show {
+                Center {
+                    Row(
+                        Modifier.onGloballyPositioned { coordinates: LayoutCoordinates ->
+                            rowSize = coordinates.size
+                            drawLatch.countDown()
+                        }
+                    ) {
+                        Spacer(Modifier.size(width = sizeDp, height = sizeDp))
+                        Spacer(Modifier.size(width = (sizeDp * 2), height = (sizeDp * 2)))
+                    }
+                }
+            }
+            assertTrue(drawLatch.await(1, TimeUnit.SECONDS))
+
+            val root = findComposeView()
+            waitForDraw(root)
+
+            assertEquals((sizeDp * 3).roundToPx(), rowSize.width)
+        }
+
+    @Test
+    fun testRow_expandedWidth_withWeightChildren() =
+        with(density) {
+            val sizeDp = 50.toDp()
+
+            val drawLatch = CountDownLatch(1)
+            var rowSize: IntSize = IntSize.Zero
+            show {
+                Center {
                     Row(
                         Modifier.onGloballyPositioned { coordinates: LayoutCoordinates ->
                             rowSize = coordinates.size
@@ -1735,69 +1479,27 @@
                             height = sizeDp,
                             content = {}
                         )
-                        Container(
-                            width = sizeDp * 2,
-                            height = sizeDp * 2,
-                            content = {}
-                        )
+                        Container(width = (sizeDp * 2), height = (sizeDp * 2), content = {})
                     }
                 }
             }
+            assertTrue(drawLatch.await(1, TimeUnit.SECONDS))
+
+            val root = findComposeView()
+            waitForDraw(root)
+
+            assertEquals(root.width, rowSize.width)
         }
-        assertTrue(drawLatch.await(1, TimeUnit.SECONDS))
-
-        val root = findComposeView()
-        waitForDraw(root)
-
-        assertEquals(
-            min(root.width, rowWidthDp.roundToPx()),
-            rowSize.width
-        )
-    }
 
     @Test
-    fun testRow_withNoWeightChildren_respectsMinWidthConstraint() = with(density) {
-        val sizeDp = 50.toDp()
-        val rowWidthDp = 250.toDp()
+    fun testRow_withMaxCrossAxisSize() =
+        with(density) {
+            val sizeDp = 50.toDp()
 
-        val drawLatch = CountDownLatch(1)
-        var rowSize: IntSize = IntSize.Zero
-        show {
-            Center {
-                ConstrainedBox(constraints = DpConstraints(minWidth = rowWidthDp)) {
-                    Row(
-                        Modifier.onGloballyPositioned { coordinates: LayoutCoordinates ->
-                            rowSize = coordinates.size
-                            drawLatch.countDown()
-                        }
-                    ) {
-                        Spacer(Modifier.size(width = sizeDp, height = sizeDp))
-                        Spacer(Modifier.size(width = sizeDp * 2, height = sizeDp * 2))
-                    }
-                }
-            }
-        }
-        assertTrue(drawLatch.await(1, TimeUnit.SECONDS))
-
-        val root = findComposeView()
-        waitForDraw(root)
-
-        assertEquals(
-            rowWidthDp.roundToPx(),
-            rowSize.width
-        )
-    }
-
-    @Test
-    fun testRow_withMaxCrossAxisSize_respectsMaxHeightConstraint() = with(density) {
-        val sizeDp = 50.toDp()
-        val rowHeightDp = 250.toDp()
-
-        val drawLatch = CountDownLatch(1)
-        var rowSize: IntSize = IntSize.Zero
-        show {
-            Center {
-                ConstrainedBox(constraints = DpConstraints(maxHeight = rowHeightDp)) {
+            val drawLatch = CountDownLatch(1)
+            var rowSize: IntSize = IntSize.Zero
+            show {
+                Center {
                     Row(
                         Modifier.fillMaxHeight().onGloballyPositioned { coordinates ->
                             rowSize = coordinates.size
@@ -1805,32 +1507,27 @@
                         }
                     ) {
                         Spacer(Modifier.size(width = sizeDp, height = sizeDp))
-                        Spacer(Modifier.size(width = sizeDp * 2, height = sizeDp * 2))
+                        Spacer(Modifier.size(width = (sizeDp * 2), height = (sizeDp * 2)))
                     }
                 }
             }
+            assertTrue(drawLatch.await(1, TimeUnit.SECONDS))
+
+            val root = findComposeView()
+            waitForDraw(root)
+
+            assertEquals(root.height, rowSize.height)
         }
-        assertTrue(drawLatch.await(1, TimeUnit.SECONDS))
-
-        val root = findComposeView()
-        waitForDraw(root)
-
-        assertEquals(
-            min(root.height, rowHeightDp.roundToPx()),
-            rowSize.height
-        )
-    }
 
     @Test
-    fun testRow_withMinCrossAxisSize_respectsMinHeightConstraint() = with(density) {
-        val sizeDp = 50.toDp()
-        val rowHeightDp = 150.toDp()
+    fun testRow_withMinCrossAxisSize() =
+        with(density) {
+            val sizeDp = 50.toDp()
 
-        val drawLatch = CountDownLatch(1)
-        var rowSize: IntSize = IntSize.Zero
-        show {
-            Center {
-                ConstrainedBox(constraints = DpConstraints(minHeight = rowHeightDp)) {
+            val drawLatch = CountDownLatch(1)
+            var rowSize: IntSize = IntSize.Zero
+            show {
+                Center {
                     Row(
                         Modifier.onGloballyPositioned { coordinates: LayoutCoordinates ->
                             rowSize = coordinates.size
@@ -1838,412 +1535,406 @@
                         }
                     ) {
                         Spacer(Modifier.size(width = sizeDp, height = sizeDp))
-                        Spacer(Modifier.size(width = sizeDp * 2, height = sizeDp * 2))
+                        Spacer(Modifier.size(width = (sizeDp * 2), height = (sizeDp * 2)))
                     }
                 }
             }
+            assertTrue(drawLatch.await(1, TimeUnit.SECONDS))
+
+            val root = findComposeView()
+            waitForDraw(root)
+
+            assertEquals((sizeDp * 2).roundToPx(), rowSize.height)
         }
-        assertTrue(drawLatch.await(1, TimeUnit.SECONDS))
 
-        val root = findComposeView()
-        waitForDraw(root)
+    @Test
+    fun testRow_withExpandedModifier_respectsMaxWidthConstraint() =
+        with(density) {
+            val sizeDp = 50.toDp()
+            val rowWidthDp = 250.toDp()
 
-        assertEquals(
-            rowHeightDp.roundToPx(),
-            rowSize.height
-        )
-    }
+            val drawLatch = CountDownLatch(1)
+            var rowSize: IntSize = IntSize.Zero
+            show {
+                Center {
+                    ConstrainedBox(constraints = DpConstraints(maxWidth = rowWidthDp)) {
+                        Row(
+                            Modifier.fillMaxWidth().onGloballyPositioned { coordinates ->
+                                rowSize = coordinates.size
+                                drawLatch.countDown()
+                            }
+                        ) {
+                            Spacer(Modifier.size(width = sizeDp, height = sizeDp))
+                            Spacer(Modifier.size(width = sizeDp * 2, height = sizeDp * 2))
+                        }
+                    }
+                }
+            }
+            assertTrue(drawLatch.await(1, TimeUnit.SECONDS))
+
+            val root = findComposeView()
+            waitForDraw(root)
+
+            assertEquals(min(root.width, rowWidthDp.roundToPx()), rowSize.width)
+        }
+
+    @Test
+    fun testRow_withChildrenWithWeight_respectsMaxWidthConstraint() =
+        with(density) {
+            val sizeDp = 50.toDp()
+            val rowWidthDp = 250.toDp()
+
+            val drawLatch = CountDownLatch(1)
+            var rowSize: IntSize = IntSize.Zero
+            show {
+                Center {
+                    ConstrainedBox(constraints = DpConstraints(maxWidth = rowWidthDp)) {
+                        Row(
+                            Modifier.onGloballyPositioned { coordinates: LayoutCoordinates ->
+                                rowSize = coordinates.size
+                                drawLatch.countDown()
+                            }
+                        ) {
+                            Container(
+                                Modifier.weight(1f),
+                                width = sizeDp,
+                                height = sizeDp,
+                                content = {}
+                            )
+                            Container(width = sizeDp * 2, height = sizeDp * 2, content = {})
+                        }
+                    }
+                }
+            }
+            assertTrue(drawLatch.await(1, TimeUnit.SECONDS))
+
+            val root = findComposeView()
+            waitForDraw(root)
+
+            assertEquals(min(root.width, rowWidthDp.roundToPx()), rowSize.width)
+        }
+
+    @Test
+    fun testRow_withNoWeightChildren_respectsMinWidthConstraint() =
+        with(density) {
+            val sizeDp = 50.toDp()
+            val rowWidthDp = 250.toDp()
+
+            val drawLatch = CountDownLatch(1)
+            var rowSize: IntSize = IntSize.Zero
+            show {
+                Center {
+                    ConstrainedBox(constraints = DpConstraints(minWidth = rowWidthDp)) {
+                        Row(
+                            Modifier.onGloballyPositioned { coordinates: LayoutCoordinates ->
+                                rowSize = coordinates.size
+                                drawLatch.countDown()
+                            }
+                        ) {
+                            Spacer(Modifier.size(width = sizeDp, height = sizeDp))
+                            Spacer(Modifier.size(width = sizeDp * 2, height = sizeDp * 2))
+                        }
+                    }
+                }
+            }
+            assertTrue(drawLatch.await(1, TimeUnit.SECONDS))
+
+            val root = findComposeView()
+            waitForDraw(root)
+
+            assertEquals(rowWidthDp.roundToPx(), rowSize.width)
+        }
+
+    @Test
+    fun testRow_withMaxCrossAxisSize_respectsMaxHeightConstraint() =
+        with(density) {
+            val sizeDp = 50.toDp()
+            val rowHeightDp = 250.toDp()
+
+            val drawLatch = CountDownLatch(1)
+            var rowSize: IntSize = IntSize.Zero
+            show {
+                Center {
+                    ConstrainedBox(constraints = DpConstraints(maxHeight = rowHeightDp)) {
+                        Row(
+                            Modifier.fillMaxHeight().onGloballyPositioned { coordinates ->
+                                rowSize = coordinates.size
+                                drawLatch.countDown()
+                            }
+                        ) {
+                            Spacer(Modifier.size(width = sizeDp, height = sizeDp))
+                            Spacer(Modifier.size(width = sizeDp * 2, height = sizeDp * 2))
+                        }
+                    }
+                }
+            }
+            assertTrue(drawLatch.await(1, TimeUnit.SECONDS))
+
+            val root = findComposeView()
+            waitForDraw(root)
+
+            assertEquals(min(root.height, rowHeightDp.roundToPx()), rowSize.height)
+        }
+
+    @Test
+    fun testRow_withMinCrossAxisSize_respectsMinHeightConstraint() =
+        with(density) {
+            val sizeDp = 50.toDp()
+            val rowHeightDp = 150.toDp()
+
+            val drawLatch = CountDownLatch(1)
+            var rowSize: IntSize = IntSize.Zero
+            show {
+                Center {
+                    ConstrainedBox(constraints = DpConstraints(minHeight = rowHeightDp)) {
+                        Row(
+                            Modifier.onGloballyPositioned { coordinates: LayoutCoordinates ->
+                                rowSize = coordinates.size
+                                drawLatch.countDown()
+                            }
+                        ) {
+                            Spacer(Modifier.size(width = sizeDp, height = sizeDp))
+                            Spacer(Modifier.size(width = sizeDp * 2, height = sizeDp * 2))
+                        }
+                    }
+                }
+            }
+            assertTrue(drawLatch.await(1, TimeUnit.SECONDS))
+
+            val root = findComposeView()
+            waitForDraw(root)
+
+            assertEquals(rowHeightDp.roundToPx(), rowSize.height)
+        }
 
     @Test
     @Ignore(
         "Wrap is not supported when there are children with weight. " +
             "Should use maxWidth(.Infinity) modifier when it is available"
     )
-    fun testRow_withMinMainAxisSize() = with(density) {
-        val sizeDp = 50.toDp()
-        val size = sizeDp.roundToPx()
-        val rowWidthDp = 250.toDp()
-        val rowWidth = rowWidthDp.roundToPx()
+    fun testRow_withMinMainAxisSize() =
+        with(density) {
+            val sizeDp = 50.toDp()
+            val size = sizeDp.roundToPx()
+            val rowWidthDp = 250.toDp()
+            val rowWidth = rowWidthDp.roundToPx()
 
-        val drawLatch = CountDownLatch(2)
-        var rowSize: IntSize = IntSize.Zero
-        var expandedChildSize: IntSize = IntSize.Zero
-        show {
-            Center {
-                ConstrainedBox(constraints = DpConstraints(minWidth = rowWidthDp)) {
-                    // TODO: add maxWidth(Constraints.Infinity) modifier
-                    Row(
-                        Modifier.onGloballyPositioned { coordinates: LayoutCoordinates ->
-                            rowSize = coordinates.size
-                            drawLatch.countDown()
-                        }
-                    ) {
-                        Container(
-                            modifier = Modifier.weight(1f)
-                                .onGloballyPositioned { coordinates ->
-                                    expandedChildSize = coordinates.size
-                                    drawLatch.countDown()
-                                },
-                            width = sizeDp,
-                            height = sizeDp
+            val drawLatch = CountDownLatch(2)
+            var rowSize: IntSize = IntSize.Zero
+            var expandedChildSize: IntSize = IntSize.Zero
+            show {
+                Center {
+                    ConstrainedBox(constraints = DpConstraints(minWidth = rowWidthDp)) {
+                        // TODO: add maxWidth(Constraints.Infinity) modifier
+                        Row(
+                            Modifier.onGloballyPositioned { coordinates: LayoutCoordinates ->
+                                rowSize = coordinates.size
+                                drawLatch.countDown()
+                            }
                         ) {
+                            Container(
+                                modifier =
+                                    Modifier.weight(1f).onGloballyPositioned { coordinates ->
+                                        expandedChildSize = coordinates.size
+                                        drawLatch.countDown()
+                                    },
+                                width = sizeDp,
+                                height = sizeDp
+                            ) {}
                         }
                     }
                 }
             }
+            assertTrue(drawLatch.await(1, TimeUnit.SECONDS))
+
+            val root = findComposeView()
+            waitForDraw(root)
+
+            assertEquals(IntSize(rowWidth, size), rowSize)
+            assertEquals(IntSize(rowWidth, size), expandedChildSize)
         }
-        assertTrue(drawLatch.await(1, TimeUnit.SECONDS))
-
-        val root = findComposeView()
-        waitForDraw(root)
-
-        assertEquals(
-            IntSize(rowWidth, size),
-            rowSize
-        )
-        assertEquals(
-            IntSize(rowWidth, size),
-            expandedChildSize
-        )
-    }
 
     @Test
-    fun testRow_measuresChildrenCorrectly_whenMeasuredWithInfiniteWidth() = with(density) {
-        val rowMinWidth = 100.toDp()
-        val noWeightChildWidth = 30.toDp()
-        val latch = CountDownLatch(1)
-        show {
-            WithInfiniteConstraints {
-                ConstrainedBox(DpConstraints(minWidth = rowMinWidth)) {
-                    Row {
-                        BoxWithConstraints {
-                            assertEquals(Constraints(), constraints)
-                            FixedSizeLayout(noWeightChildWidth.roundToPx(), 0, mapOf())
-                        }
-                        BoxWithConstraints {
-                            assertEquals(Constraints(), constraints)
-                            FixedSizeLayout(noWeightChildWidth.roundToPx(), 0, mapOf())
-                        }
-                        Layout({}, Modifier.weight(1f)) { _, constraints ->
-                            assertEquals(
-                                rowMinWidth.roundToPx() - noWeightChildWidth.roundToPx() * 2,
-                                constraints.minWidth
-                            )
-                            assertEquals(
-                                rowMinWidth.roundToPx() - noWeightChildWidth.roundToPx() * 2,
-                                constraints.maxWidth
-                            )
-                            latch.countDown()
-                            layout(0, 0) { }
+    fun testRow_measuresChildrenCorrectly_whenMeasuredWithInfiniteWidth() =
+        with(density) {
+            val rowMinWidth = 100.toDp()
+            val noWeightChildWidth = 30.toDp()
+            val latch = CountDownLatch(1)
+            show {
+                WithInfiniteConstraints {
+                    ConstrainedBox(DpConstraints(minWidth = rowMinWidth)) {
+                        Row {
+                            BoxWithConstraints {
+                                assertEquals(Constraints(), constraints)
+                                FixedSizeLayout(noWeightChildWidth.roundToPx(), 0, mapOf())
+                            }
+                            BoxWithConstraints {
+                                assertEquals(Constraints(), constraints)
+                                FixedSizeLayout(noWeightChildWidth.roundToPx(), 0, mapOf())
+                            }
+                            Layout({}, Modifier.weight(1f)) { _, constraints ->
+                                assertEquals(
+                                    rowMinWidth.roundToPx() - noWeightChildWidth.roundToPx() * 2,
+                                    constraints.minWidth
+                                )
+                                assertEquals(
+                                    rowMinWidth.roundToPx() - noWeightChildWidth.roundToPx() * 2,
+                                    constraints.maxWidth
+                                )
+                                latch.countDown()
+                                layout(0, 0) {}
+                            }
                         }
                     }
                 }
             }
+            assertTrue(latch.await(1, TimeUnit.SECONDS))
         }
-        assertTrue(latch.await(1, TimeUnit.SECONDS))
-    }
 
     @Test
-    fun testRow_protectsAgainstOverflow() = with(density) {
-        val rowMinWidth = 0.toDp()
-        val latch = CountDownLatch(3)
-        show {
-            WithInfiniteConstraints {
-                ConstrainedBox(DpConstraints(minWidth = rowMinWidth)) {
-                    Row(horizontalArrangement = Arrangement.spacedBy((0.5).dp)) {
-                        Layout { _, constraints ->
-                            assertEquals(Constraints(), constraints)
-                            layout(1 shl 23, 100) {
+    fun testRow_protectsAgainstOverflow() =
+        with(density) {
+            val rowMinWidth = 0.toDp()
+            val latch = CountDownLatch(3)
+            show {
+                WithInfiniteConstraints {
+                    ConstrainedBox(DpConstraints(minWidth = rowMinWidth)) {
+                        Row(horizontalArrangement = Arrangement.spacedBy((0.5).dp)) {
+                            Layout { _, constraints ->
+                                assertEquals(Constraints(), constraints)
+                                layout(1 shl 23, 100) { latch.countDown() }
+                            }
+                            Box(modifier = Modifier.weight(1f, true)) { latch.countDown() }
+
+                            Box(modifier = Modifier.weight(.00000001f, true)) { latch.countDown() }
+                        }
+                    }
+                }
+            }
+            assertTrue(latch.await(1, TimeUnit.SECONDS))
+        }
+
+    @Test
+    fun testRow_measuresNoWeightChildrenCorrectly() =
+        with(density) {
+            val availableWidth = 100.toDp()
+            val childWidth = 50.toDp()
+            val availableHeight = 200.toDp()
+            val childHeight = 100.toDp()
+            val latch = CountDownLatch(1)
+            show {
+                Box {
+                    ConstrainedBox(
+                        DpConstraints(
+                            minWidth = availableWidth,
+                            maxWidth = availableWidth,
+                            minHeight = availableHeight,
+                            maxHeight = availableHeight
+                        )
+                    ) {
+                        Row {
+                            BoxWithConstraints {
+                                assertEquals(
+                                    Constraints(
+                                        maxWidth = availableWidth.roundToPx(),
+                                        maxHeight = availableHeight.roundToPx()
+                                    ),
+                                    constraints
+                                )
+                                FixedSizeLayout(
+                                    childWidth.roundToPx(),
+                                    childHeight.roundToPx(),
+                                    mapOf()
+                                )
+                            }
+                            BoxWithConstraints {
+                                assertEquals(
+                                    Constraints(
+                                        maxWidth =
+                                            availableWidth.roundToPx() - childWidth.roundToPx(),
+                                        maxHeight = availableHeight.roundToPx()
+                                    ),
+                                    constraints
+                                )
+                                FixedSizeLayout(
+                                    childWidth.roundToPx(),
+                                    childHeight.roundToPx(),
+                                    mapOf()
+                                )
                                 latch.countDown()
                             }
                         }
-                        Box(modifier = Modifier.weight(1f, true)) {
-                            latch.countDown()
-                        }
-
-                        Box(modifier = Modifier.weight(.00000001f, true)) {
-                            latch.countDown()
-                        }
                     }
                 }
             }
+            assertTrue(latch.await(1, TimeUnit.SECONDS))
         }
-        assertTrue(latch.await(1, TimeUnit.SECONDS))
-    }
 
     @Test
-    fun testRow_measuresNoWeightChildrenCorrectly() = with(density) {
-        val availableWidth = 100.toDp()
-        val childWidth = 50.toDp()
-        val availableHeight = 200.toDp()
-        val childHeight = 100.toDp()
-        val latch = CountDownLatch(1)
-        show {
-            Box {
-                ConstrainedBox(
-                    DpConstraints(
-                        minWidth = availableWidth,
-                        maxWidth = availableWidth,
-                        minHeight = availableHeight,
-                        maxHeight = availableHeight
-                    )
+    fun testRow_doesNotExpand_whenWeightChildrenDoNotFill() =
+        with(density) {
+            val size = 10
+            var rowWidth = 0
+            val latch = CountDownLatch(1)
+            show {
+                Row(
+                    Modifier.onGloballyPositioned {
+                        rowWidth = it.size.width
+                        latch.countDown()
+                    }
                 ) {
-                    Row {
-                        BoxWithConstraints {
-                            assertEquals(
-                                Constraints(
-                                    maxWidth = availableWidth.roundToPx(),
-                                    maxHeight = availableHeight.roundToPx()
-                                ),
-                                constraints
-                            )
-                            FixedSizeLayout(
-                                childWidth.roundToPx(),
-                                childHeight.roundToPx(),
-                                mapOf()
-                            )
+                    Box(Modifier.weight(1f, false).size(size.toDp()))
+                }
+            }
+            assertTrue(latch.await(1, TimeUnit.SECONDS))
+            assertEquals(size, rowWidth)
+        }
+
+    @Test
+    fun testRow_includesSpacing_withWeightChildren() =
+        with(density) {
+            val rowWidth = 40
+            val space = 8
+            val latch = CountDownLatch(2)
+            show {
+                Row(
+                    modifier = Modifier.widthIn(max = rowWidth.toDp()),
+                    horizontalArrangement = Arrangement.spacedBy(space.toDp())
+                ) {
+                    Box(
+                        Modifier.weight(1f).onGloballyPositioned {
+                            assertEquals((rowWidth - space) / 2, it.size.width)
+                            assertEquals(0, it.positionInRoot().x.toInt())
+                            latch.countDown()
                         }
-                        BoxWithConstraints {
+                    )
+                    Box(
+                        Modifier.weight(1f).onGloballyPositioned {
+                            assertEquals((rowWidth - space) / 2, it.size.width)
                             assertEquals(
-                                Constraints(
-                                    maxWidth = availableWidth.roundToPx() - childWidth.roundToPx(),
-                                    maxHeight = availableHeight.roundToPx()
-                                ),
-                                constraints
-                            )
-                            FixedSizeLayout(
-                                childWidth.roundToPx(),
-                                childHeight.roundToPx(),
-                                mapOf()
+                                (rowWidth - space) / 2 + space,
+                                it.positionInRoot().x.toInt()
                             )
                             latch.countDown()
                         }
-                    }
+                    )
                 }
             }
+            assertTrue(latch.await(1, TimeUnit.SECONDS))
         }
-        assertTrue(latch.await(1, TimeUnit.SECONDS))
-    }
 
-    @Test
-    fun testRow_doesNotExpand_whenWeightChildrenDoNotFill() = with(density) {
-        val size = 10
-        var rowWidth = 0
-        val latch = CountDownLatch(1)
-        show {
-            Row(
-                Modifier.onGloballyPositioned {
-                    rowWidth = it.size.width
-                    latch.countDown()
-                }
-            ) {
-                Box(Modifier.weight(1f, false).size(size.toDp()))
-            }
-        }
-        assertTrue(latch.await(1, TimeUnit.SECONDS))
-        assertEquals(size, rowWidth)
-    }
-
-    @Test
-    fun testRow_includesSpacing_withWeightChildren() = with(density) {
-        val rowWidth = 40
-        val space = 8
-        val latch = CountDownLatch(2)
-        show {
-            Row(
-                modifier = Modifier.widthIn(max = rowWidth.toDp()),
-                horizontalArrangement = Arrangement.spacedBy(space.toDp())
-            ) {
-                Box(
-                    Modifier.weight(1f).onGloballyPositioned {
-                        assertEquals((rowWidth - space) / 2, it.size.width)
-                        assertEquals(0, it.positionInRoot().x.toInt())
-                        latch.countDown()
-                    }
-                )
-                Box(
-                    Modifier.weight(1f).onGloballyPositioned {
-                        assertEquals((rowWidth - space) / 2, it.size.width)
-                        assertEquals((rowWidth - space) / 2 + space, it.positionInRoot().x.toInt())
-                        latch.countDown()
-                    }
-                )
-            }
-        }
-        assertTrue(latch.await(1, TimeUnit.SECONDS))
-    }
     // endregion
 
     // region Size tests in Column
     @Test
-    fun testColumn_expandedHeight_withExpandedModifier() = with(density) {
-        val sizeDp = 50.toDp()
+    fun testColumn_expandedHeight_withExpandedModifier() =
+        with(density) {
+            val sizeDp = 50.toDp()
 
-        val drawLatch = CountDownLatch(1)
-        var columnSize: IntSize = IntSize.Zero
-        show {
-            Center {
-                Column(
-                    Modifier.fillMaxHeight().onGloballyPositioned { coordinates ->
-                        columnSize = coordinates.size
-                        drawLatch.countDown()
-                    }
-                ) {
-                    Spacer(Modifier.size(width = sizeDp, height = sizeDp))
-                    Spacer(Modifier.size(width = (sizeDp * 2), height = (sizeDp * 2)))
-                }
-            }
-        }
-        assertTrue(drawLatch.await(1, TimeUnit.SECONDS))
-
-        val root = findComposeView()
-        waitForDraw(root)
-
-        assertEquals(
-            root.height,
-            columnSize.height
-        )
-    }
-
-    @Test
-    fun testColumn_wrappedHeight_withNoChildrenWithWeight() = with(density) {
-        val sizeDp = 50.toDp()
-
-        val drawLatch = CountDownLatch(1)
-        var columnSize: IntSize = IntSize.Zero
-        show {
-            Center {
-                Column(
-                    Modifier.onGloballyPositioned { coordinates: LayoutCoordinates ->
-                        columnSize = coordinates.size
-                        drawLatch.countDown()
-                    }
-                ) {
-                    Spacer(Modifier.size(width = sizeDp, height = sizeDp))
-                    Spacer(Modifier.size(width = (sizeDp * 2), height = (sizeDp * 2)))
-                }
-            }
-        }
-        assertTrue(drawLatch.await(1, TimeUnit.SECONDS))
-
-        val root = findComposeView()
-        waitForDraw(root)
-
-        assertEquals(
-            (sizeDp * 3).roundToPx(),
-            columnSize.height
-        )
-    }
-
-    @Test
-    fun testColumn_expandedHeight_withWeightChildren() = with(density) {
-        val sizeDp = 50.toDp()
-
-        val drawLatch = CountDownLatch(1)
-        var columnSize: IntSize = IntSize.Zero
-        show {
-            Center {
-                Column(
-                    Modifier.onGloballyPositioned { coordinates: LayoutCoordinates ->
-                        columnSize = coordinates.size
-                        drawLatch.countDown()
-                    }
-                ) {
-                    Container(
-                        Modifier.weight(1f),
-                        width = sizeDp,
-                        height = sizeDp,
-                        content = {}
-                    )
-                    Container(
-                        width = (sizeDp * 2),
-                        height = (sizeDp * 2),
-                        content = {}
-                    )
-                }
-            }
-        }
-        assertTrue(drawLatch.await(1, TimeUnit.SECONDS))
-
-        val root = findComposeView()
-        waitForDraw(root)
-
-        assertEquals(
-            root.height,
-            columnSize.height
-        )
-    }
-
-    @Test
-    fun testColumn_withMaxCrossAxisSize() = with(density) {
-        val sizeDp = 50.toDp()
-
-        val drawLatch = CountDownLatch(1)
-        var columnSize: IntSize = IntSize.Zero
-        show {
-            Center {
-                Column(
-                    Modifier.fillMaxWidth().onGloballyPositioned { coordinates ->
-                        columnSize = coordinates.size
-                        drawLatch.countDown()
-                    }
-                ) {
-                    Spacer(Modifier.size(width = sizeDp, height = sizeDp))
-                    Spacer(Modifier.size(width = (sizeDp * 2), height = (sizeDp * 2)))
-                }
-            }
-        }
-        assertTrue(drawLatch.await(1, TimeUnit.SECONDS))
-
-        val root = findComposeView()
-        waitForDraw(root)
-
-        assertEquals(
-            root.width,
-            columnSize.width
-        )
-    }
-
-    @Test
-    fun testColumn_withMinCrossAxisSize() = with(density) {
-        val sizeDp = 50.toDp()
-
-        val drawLatch = CountDownLatch(1)
-        var columnSize: IntSize = IntSize.Zero
-        show {
-            Center {
-                Column(
-                    Modifier.onGloballyPositioned { coordinates: LayoutCoordinates ->
-                        columnSize = coordinates.size
-                        drawLatch.countDown()
-                    }
-                ) {
-                    Spacer(Modifier.size(width = sizeDp, height = sizeDp))
-                    Spacer(Modifier.size(width = (sizeDp * 2), height = (sizeDp * 2)))
-                }
-            }
-        }
-        assertTrue(drawLatch.await(1, TimeUnit.SECONDS))
-
-        val root = findComposeView()
-        waitForDraw(root)
-
-        assertEquals(
-            (sizeDp * 2).roundToPx(),
-            columnSize.width
-        )
-    }
-
-    @Test
-    fun testColumn_withExpandedModifier_respectsMaxHeightConstraint() = with(density) {
-        val sizeDp = 50.toDp()
-        val columnHeightDp = 250.toDp()
-
-        val drawLatch = CountDownLatch(1)
-        var columnSize: IntSize = IntSize.Zero
-        show {
-            Center {
-                ConstrainedBox(constraints = DpConstraints(maxHeight = columnHeightDp)) {
+            val drawLatch = CountDownLatch(1)
+            var columnSize: IntSize = IntSize.Zero
+            show {
+                Center {
                     Column(
                         Modifier.fillMaxHeight().onGloballyPositioned { coordinates ->
                             columnSize = coordinates.size
@@ -2251,32 +1942,55 @@
                         }
                     ) {
                         Spacer(Modifier.size(width = sizeDp, height = sizeDp))
-                        Spacer(Modifier.size(width = sizeDp * 2, height = sizeDp * 2))
+                        Spacer(Modifier.size(width = (sizeDp * 2), height = (sizeDp * 2)))
                     }
                 }
             }
+            assertTrue(drawLatch.await(1, TimeUnit.SECONDS))
+
+            val root = findComposeView()
+            waitForDraw(root)
+
+            assertEquals(root.height, columnSize.height)
         }
-        assertTrue(drawLatch.await(1, TimeUnit.SECONDS))
-
-        val root = findComposeView()
-        waitForDraw(root)
-
-        assertEquals(
-            min(root.height, columnHeightDp.roundToPx()),
-            columnSize.height
-        )
-    }
 
     @Test
-    fun testColumn_withWeightChildren_respectsMaxHeightConstraint() = with(density) {
-        val sizeDp = 50.toDp()
-        val columnHeightDp = 250.toDp()
+    fun testColumn_wrappedHeight_withNoChildrenWithWeight() =
+        with(density) {
+            val sizeDp = 50.toDp()
 
-        val drawLatch = CountDownLatch(1)
-        var columnSize: IntSize = IntSize.Zero
-        show {
-            Center {
-                ConstrainedBox(constraints = DpConstraints(maxHeight = columnHeightDp)) {
+            val drawLatch = CountDownLatch(1)
+            var columnSize: IntSize = IntSize.Zero
+            show {
+                Center {
+                    Column(
+                        Modifier.onGloballyPositioned { coordinates: LayoutCoordinates ->
+                            columnSize = coordinates.size
+                            drawLatch.countDown()
+                        }
+                    ) {
+                        Spacer(Modifier.size(width = sizeDp, height = sizeDp))
+                        Spacer(Modifier.size(width = (sizeDp * 2), height = (sizeDp * 2)))
+                    }
+                }
+            }
+            assertTrue(drawLatch.await(1, TimeUnit.SECONDS))
+
+            val root = findComposeView()
+            waitForDraw(root)
+
+            assertEquals((sizeDp * 3).roundToPx(), columnSize.height)
+        }
+
+    @Test
+    fun testColumn_expandedHeight_withWeightChildren() =
+        with(density) {
+            val sizeDp = 50.toDp()
+
+            val drawLatch = CountDownLatch(1)
+            var columnSize: IntSize = IntSize.Zero
+            show {
+                Center {
                     Column(
                         Modifier.onGloballyPositioned { coordinates: LayoutCoordinates ->
                             columnSize = coordinates.size
@@ -2289,69 +2003,27 @@
                             height = sizeDp,
                             content = {}
                         )
-                        Container(
-                            width = sizeDp * 2,
-                            height = sizeDp * 2,
-                            content = {}
-                        )
+                        Container(width = (sizeDp * 2), height = (sizeDp * 2), content = {})
                     }
                 }
             }
+            assertTrue(drawLatch.await(1, TimeUnit.SECONDS))
+
+            val root = findComposeView()
+            waitForDraw(root)
+
+            assertEquals(root.height, columnSize.height)
         }
-        assertTrue(drawLatch.await(1, TimeUnit.SECONDS))
-
-        val root = findComposeView()
-        waitForDraw(root)
-
-        assertEquals(
-            min(root.height, columnHeightDp.roundToPx()),
-            columnSize.height
-        )
-    }
 
     @Test
-    fun testColumn_withChildren_respectsMinHeightConstraint() = with(density) {
-        val sizeDp = 50.toDp()
-        val columnHeightDp = 250.toDp()
+    fun testColumn_withMaxCrossAxisSize() =
+        with(density) {
+            val sizeDp = 50.toDp()
 
-        val drawLatch = CountDownLatch(1)
-        var columnSize: IntSize = IntSize.Zero
-        show {
-            Center {
-                ConstrainedBox(constraints = DpConstraints(minHeight = columnHeightDp)) {
-                    Column(
-                        Modifier.onGloballyPositioned { coordinates: LayoutCoordinates ->
-                            columnSize = coordinates.size
-                            drawLatch.countDown()
-                        }
-                    ) {
-                        Spacer(Modifier.size(width = sizeDp, height = sizeDp))
-                        Spacer(Modifier.size(width = sizeDp * 2, height = sizeDp * 2))
-                    }
-                }
-            }
-        }
-        assertTrue(drawLatch.await(1, TimeUnit.SECONDS))
-
-        val root = findComposeView()
-        waitForDraw(root)
-
-        assertEquals(
-            columnHeightDp.roundToPx(),
-            columnSize.height
-        )
-    }
-
-    @Test
-    fun testColumn_withMaxCrossAxisSize_respectsMaxWidthConstraint() = with(density) {
-        val sizeDp = 50.toDp()
-        val columnWidthDp = 250.toDp()
-
-        val drawLatch = CountDownLatch(1)
-        var columnSize: IntSize = IntSize.Zero
-        show {
-            Center {
-                ConstrainedBox(constraints = DpConstraints(maxWidth = columnWidthDp)) {
+            val drawLatch = CountDownLatch(1)
+            var columnSize: IntSize = IntSize.Zero
+            show {
+                Center {
                     Column(
                         Modifier.fillMaxWidth().onGloballyPositioned { coordinates ->
                             columnSize = coordinates.size
@@ -2359,32 +2031,27 @@
                         }
                     ) {
                         Spacer(Modifier.size(width = sizeDp, height = sizeDp))
-                        Spacer(Modifier.size(width = sizeDp * 2, height = sizeDp * 2))
+                        Spacer(Modifier.size(width = (sizeDp * 2), height = (sizeDp * 2)))
                     }
                 }
             }
+            assertTrue(drawLatch.await(1, TimeUnit.SECONDS))
+
+            val root = findComposeView()
+            waitForDraw(root)
+
+            assertEquals(root.width, columnSize.width)
         }
-        assertTrue(drawLatch.await(1, TimeUnit.SECONDS))
-
-        val root = findComposeView()
-        waitForDraw(root)
-
-        assertEquals(
-            min(root.width, columnWidthDp.roundToPx()),
-            columnSize.width
-        )
-    }
 
     @Test
-    fun testColumn_withMinCrossAxisSize_respectsMinWidthConstraint() = with(density) {
-        val sizeDp = 50.toDp()
-        val columnWidthDp = 150.toDp()
+    fun testColumn_withMinCrossAxisSize() =
+        with(density) {
+            val sizeDp = 50.toDp()
 
-        val drawLatch = CountDownLatch(1)
-        var columnSize: IntSize = IntSize.Zero
-        show {
-            Center {
-                ConstrainedBox(constraints = DpConstraints(minWidth = columnWidthDp)) {
+            val drawLatch = CountDownLatch(1)
+            var columnSize: IntSize = IntSize.Zero
+            show {
+                Center {
                     Column(
                         Modifier.onGloballyPositioned { coordinates: LayoutCoordinates ->
                             columnSize = coordinates.size
@@ -2392,75 +2059,224 @@
                         }
                     ) {
                         Spacer(Modifier.size(width = sizeDp, height = sizeDp))
-                        Spacer(Modifier.size(width = sizeDp * 2, height = sizeDp * 2))
+                        Spacer(Modifier.size(width = (sizeDp * 2), height = (sizeDp * 2)))
                     }
                 }
             }
+            assertTrue(drawLatch.await(1, TimeUnit.SECONDS))
+
+            val root = findComposeView()
+            waitForDraw(root)
+
+            assertEquals((sizeDp * 2).roundToPx(), columnSize.width)
         }
-        assertTrue(drawLatch.await(1, TimeUnit.SECONDS))
 
-        val root = findComposeView()
-        waitForDraw(root)
+    @Test
+    fun testColumn_withExpandedModifier_respectsMaxHeightConstraint() =
+        with(density) {
+            val sizeDp = 50.toDp()
+            val columnHeightDp = 250.toDp()
 
-        assertEquals(
-            columnWidthDp.roundToPx(),
-            columnSize.width
-        )
-    }
+            val drawLatch = CountDownLatch(1)
+            var columnSize: IntSize = IntSize.Zero
+            show {
+                Center {
+                    ConstrainedBox(constraints = DpConstraints(maxHeight = columnHeightDp)) {
+                        Column(
+                            Modifier.fillMaxHeight().onGloballyPositioned { coordinates ->
+                                columnSize = coordinates.size
+                                drawLatch.countDown()
+                            }
+                        ) {
+                            Spacer(Modifier.size(width = sizeDp, height = sizeDp))
+                            Spacer(Modifier.size(width = sizeDp * 2, height = sizeDp * 2))
+                        }
+                    }
+                }
+            }
+            assertTrue(drawLatch.await(1, TimeUnit.SECONDS))
+
+            val root = findComposeView()
+            waitForDraw(root)
+
+            assertEquals(min(root.height, columnHeightDp.roundToPx()), columnSize.height)
+        }
+
+    @Test
+    fun testColumn_withWeightChildren_respectsMaxHeightConstraint() =
+        with(density) {
+            val sizeDp = 50.toDp()
+            val columnHeightDp = 250.toDp()
+
+            val drawLatch = CountDownLatch(1)
+            var columnSize: IntSize = IntSize.Zero
+            show {
+                Center {
+                    ConstrainedBox(constraints = DpConstraints(maxHeight = columnHeightDp)) {
+                        Column(
+                            Modifier.onGloballyPositioned { coordinates: LayoutCoordinates ->
+                                columnSize = coordinates.size
+                                drawLatch.countDown()
+                            }
+                        ) {
+                            Container(
+                                Modifier.weight(1f),
+                                width = sizeDp,
+                                height = sizeDp,
+                                content = {}
+                            )
+                            Container(width = sizeDp * 2, height = sizeDp * 2, content = {})
+                        }
+                    }
+                }
+            }
+            assertTrue(drawLatch.await(1, TimeUnit.SECONDS))
+
+            val root = findComposeView()
+            waitForDraw(root)
+
+            assertEquals(min(root.height, columnHeightDp.roundToPx()), columnSize.height)
+        }
+
+    @Test
+    fun testColumn_withChildren_respectsMinHeightConstraint() =
+        with(density) {
+            val sizeDp = 50.toDp()
+            val columnHeightDp = 250.toDp()
+
+            val drawLatch = CountDownLatch(1)
+            var columnSize: IntSize = IntSize.Zero
+            show {
+                Center {
+                    ConstrainedBox(constraints = DpConstraints(minHeight = columnHeightDp)) {
+                        Column(
+                            Modifier.onGloballyPositioned { coordinates: LayoutCoordinates ->
+                                columnSize = coordinates.size
+                                drawLatch.countDown()
+                            }
+                        ) {
+                            Spacer(Modifier.size(width = sizeDp, height = sizeDp))
+                            Spacer(Modifier.size(width = sizeDp * 2, height = sizeDp * 2))
+                        }
+                    }
+                }
+            }
+            assertTrue(drawLatch.await(1, TimeUnit.SECONDS))
+
+            val root = findComposeView()
+            waitForDraw(root)
+
+            assertEquals(columnHeightDp.roundToPx(), columnSize.height)
+        }
+
+    @Test
+    fun testColumn_withMaxCrossAxisSize_respectsMaxWidthConstraint() =
+        with(density) {
+            val sizeDp = 50.toDp()
+            val columnWidthDp = 250.toDp()
+
+            val drawLatch = CountDownLatch(1)
+            var columnSize: IntSize = IntSize.Zero
+            show {
+                Center {
+                    ConstrainedBox(constraints = DpConstraints(maxWidth = columnWidthDp)) {
+                        Column(
+                            Modifier.fillMaxWidth().onGloballyPositioned { coordinates ->
+                                columnSize = coordinates.size
+                                drawLatch.countDown()
+                            }
+                        ) {
+                            Spacer(Modifier.size(width = sizeDp, height = sizeDp))
+                            Spacer(Modifier.size(width = sizeDp * 2, height = sizeDp * 2))
+                        }
+                    }
+                }
+            }
+            assertTrue(drawLatch.await(1, TimeUnit.SECONDS))
+
+            val root = findComposeView()
+            waitForDraw(root)
+
+            assertEquals(min(root.width, columnWidthDp.roundToPx()), columnSize.width)
+        }
+
+    @Test
+    fun testColumn_withMinCrossAxisSize_respectsMinWidthConstraint() =
+        with(density) {
+            val sizeDp = 50.toDp()
+            val columnWidthDp = 150.toDp()
+
+            val drawLatch = CountDownLatch(1)
+            var columnSize: IntSize = IntSize.Zero
+            show {
+                Center {
+                    ConstrainedBox(constraints = DpConstraints(minWidth = columnWidthDp)) {
+                        Column(
+                            Modifier.onGloballyPositioned { coordinates: LayoutCoordinates ->
+                                columnSize = coordinates.size
+                                drawLatch.countDown()
+                            }
+                        ) {
+                            Spacer(Modifier.size(width = sizeDp, height = sizeDp))
+                            Spacer(Modifier.size(width = sizeDp * 2, height = sizeDp * 2))
+                        }
+                    }
+                }
+            }
+            assertTrue(drawLatch.await(1, TimeUnit.SECONDS))
+
+            val root = findComposeView()
+            waitForDraw(root)
+
+            assertEquals(columnWidthDp.roundToPx(), columnSize.width)
+        }
 
     @Test
     @Ignore(
         "Wrap is not supported when there are weight children. " +
             "Should use maxHeight(Constraints.Infinity) modifier when it is available"
     )
-    fun testColumn_withMinMainAxisSize() = with(density) {
-        val sizeDp = 50.toDp()
-        val size = sizeDp.roundToPx()
-        val columnHeightDp = 250.toDp()
-        val columnHeight = columnHeightDp.roundToPx()
+    fun testColumn_withMinMainAxisSize() =
+        with(density) {
+            val sizeDp = 50.toDp()
+            val size = sizeDp.roundToPx()
+            val columnHeightDp = 250.toDp()
+            val columnHeight = columnHeightDp.roundToPx()
 
-        val drawLatch = CountDownLatch(2)
-        var columnSize: IntSize = IntSize.Zero
-        var expandedChildSize: IntSize = IntSize.Zero
-        show {
-            Center {
-                ConstrainedBox(constraints = DpConstraints(minHeight = columnHeightDp)) {
-                    // TODO: add maxHeight(Constraints.Infinity) modifier
-                    Column(
-                        Modifier.heightIn(max = Dp.Infinity)
-                            .onGloballyPositioned { coordinates: LayoutCoordinates ->
+            val drawLatch = CountDownLatch(2)
+            var columnSize: IntSize = IntSize.Zero
+            var expandedChildSize: IntSize = IntSize.Zero
+            show {
+                Center {
+                    ConstrainedBox(constraints = DpConstraints(minHeight = columnHeightDp)) {
+                        // TODO: add maxHeight(Constraints.Infinity) modifier
+                        Column(
+                            Modifier.heightIn(max = Dp.Infinity).onGloballyPositioned {
+                                coordinates: LayoutCoordinates ->
                                 columnSize = coordinates.size
                                 drawLatch.countDown()
                             }
-                    ) {
-                        Container(
-                            Modifier.weight(1f)
-                                .onGloballyPositioned { coordinates ->
+                        ) {
+                            Container(
+                                Modifier.weight(1f).onGloballyPositioned { coordinates ->
                                     expandedChildSize = coordinates.size
                                     drawLatch.countDown()
                                 },
-                            width = sizeDp,
-                            height = sizeDp
-                        ) {
+                                width = sizeDp,
+                                height = sizeDp
+                            ) {}
                         }
                     }
                 }
             }
+            assertTrue(drawLatch.await(1, TimeUnit.SECONDS))
+
+            val root = findComposeView()
+            waitForDraw(root)
+
+            assertEquals(IntSize(size, columnHeight), columnSize)
+            assertEquals(IntSize(size, columnHeight), expandedChildSize)
         }
-        assertTrue(drawLatch.await(1, TimeUnit.SECONDS))
-
-        val root = findComposeView()
-        waitForDraw(root)
-
-        assertEquals(
-            IntSize(size, columnHeight),
-            columnSize
-        )
-        assertEquals(
-            IntSize(size, columnHeight),
-            expandedChildSize
-        )
-    }
 
     @Test
     fun testColumn_measuresChildrenCorrectly_whenMeasuredWithInfiniteHeight() =
@@ -2474,19 +2290,11 @@
                         Column {
                             BoxWithConstraints {
                                 assertEquals(Constraints(), constraints)
-                                FixedSizeLayout(
-                                    0,
-                                    noWeightChildHeight.roundToPx(),
-                                    mapOf()
-                                )
+                                FixedSizeLayout(0, noWeightChildHeight.roundToPx(), mapOf())
                             }
                             BoxWithConstraints {
                                 assertEquals(Constraints(), constraints)
-                                FixedSizeLayout(
-                                    0,
-                                    noWeightChildHeight.roundToPx(),
-                                    mapOf()
-                                )
+                                FixedSizeLayout(0, noWeightChildHeight.roundToPx(), mapOf())
                             }
                             Layout({}, Modifier.weight(1f)) { _, constraints ->
                                 assertEquals(
@@ -2500,7 +2308,7 @@
                                     constraints.maxHeight
                                 )
                                 latch.countDown()
-                                layout(0, 0) { }
+                                layout(0, 0) {}
                             }
                         }
                     }
@@ -2509,858 +2317,858 @@
         }
 
     @Test
-    fun testColumn_measuresNoWeightChildrenCorrectly() = with(density) {
-        val availableWidth = 100.toDp()
-        val childWidth = 50.toDp()
-        val availableHeight = 200.toDp()
-        val childHeight = 100.toDp()
-        val latch = CountDownLatch(1)
-        show {
-            Box {
-                ConstrainedBox(
-                    DpConstraints(
-                        minWidth = availableWidth,
-                        maxWidth = availableWidth,
-                        minHeight = availableHeight,
-                        maxHeight = availableHeight
-                    )
-                ) {
-                    Column {
-                        BoxWithConstraints {
-                            assertEquals(
-                                Constraints(
-                                    maxWidth = availableWidth.roundToPx(),
-                                    maxHeight = availableHeight.roundToPx()
-                                ),
-                                constraints
-                            )
-                            FixedSizeLayout(
-                                childWidth.roundToPx(),
-                                childHeight.roundToPx(),
-                                mapOf()
-                            )
+    fun testColumn_measuresNoWeightChildrenCorrectly() =
+        with(density) {
+            val availableWidth = 100.toDp()
+            val childWidth = 50.toDp()
+            val availableHeight = 200.toDp()
+            val childHeight = 100.toDp()
+            val latch = CountDownLatch(1)
+            show {
+                Box {
+                    ConstrainedBox(
+                        DpConstraints(
+                            minWidth = availableWidth,
+                            maxWidth = availableWidth,
+                            minHeight = availableHeight,
+                            maxHeight = availableHeight
+                        )
+                    ) {
+                        Column {
+                            BoxWithConstraints {
+                                assertEquals(
+                                    Constraints(
+                                        maxWidth = availableWidth.roundToPx(),
+                                        maxHeight = availableHeight.roundToPx()
+                                    ),
+                                    constraints
+                                )
+                                FixedSizeLayout(
+                                    childWidth.roundToPx(),
+                                    childHeight.roundToPx(),
+                                    mapOf()
+                                )
+                            }
+                            BoxWithConstraints {
+                                assertEquals(
+                                    Constraints(
+                                        maxWidth = availableWidth.roundToPx(),
+                                        maxHeight =
+                                            availableHeight.roundToPx() - childHeight.roundToPx()
+                                    ),
+                                    constraints
+                                )
+                                FixedSizeLayout(
+                                    childWidth.roundToPx(),
+                                    childHeight.roundToPx(),
+                                    mapOf()
+                                )
+                                latch.countDown()
+                            }
                         }
-                        BoxWithConstraints {
+                    }
+                }
+            }
+            assertTrue(latch.await(1, TimeUnit.SECONDS))
+        }
+
+    @Test
+    fun testColumn_doesNotExpand_whenWeightChildrenDoNotFill() =
+        with(density) {
+            val size = 10
+            var columnHeight = 0
+            val latch = CountDownLatch(1)
+            show {
+                Column(
+                    Modifier.onGloballyPositioned {
+                        columnHeight = it.size.height
+                        latch.countDown()
+                    }
+                ) {
+                    Box(Modifier.weight(1f, false).size(size.toDp()))
+                }
+            }
+            assertTrue(latch.await(1, TimeUnit.SECONDS))
+            assertEquals(size, columnHeight)
+        }
+
+    @Test
+    fun testColumn_includesSpacing_withWeightChildren() =
+        with(density) {
+            val columnHeight = 40
+            val space = 8
+            val latch = CountDownLatch(2)
+            show {
+                Column(
+                    modifier = Modifier.height(columnHeight.toDp()),
+                    verticalArrangement = Arrangement.spacedBy(space.toDp())
+                ) {
+                    Box(
+                        Modifier.weight(1f).onGloballyPositioned {
+                            assertEquals((columnHeight - space) / 2, it.size.height)
+                            assertEquals(0, it.positionInRoot().y.toInt())
+                            latch.countDown()
+                        }
+                    )
+                    Box(
+                        Modifier.weight(1f).onGloballyPositioned {
+                            assertEquals((columnHeight - space) / 2, it.size.height)
                             assertEquals(
-                                Constraints(
-                                    maxWidth = availableWidth.roundToPx(),
-                                    maxHeight = availableHeight.roundToPx() -
-                                        childHeight.roundToPx()
-                                ),
-                                constraints
-                            )
-                            FixedSizeLayout(
-                                childWidth.roundToPx(),
-                                childHeight.roundToPx(),
-                                mapOf()
+                                (columnHeight - space) / 2 + space,
+                                it.positionInRoot().y.toInt()
                             )
                             latch.countDown()
                         }
-                    }
+                    )
                 }
             }
+            assertTrue(latch.await(1, TimeUnit.SECONDS))
         }
-        assertTrue(latch.await(1, TimeUnit.SECONDS))
-    }
 
-    @Test
-    fun testColumn_doesNotExpand_whenWeightChildrenDoNotFill() = with(density) {
-        val size = 10
-        var columnHeight = 0
-        val latch = CountDownLatch(1)
-        show {
-            Column(
-                Modifier.onGloballyPositioned {
-                    columnHeight = it.size.height
-                    latch.countDown()
-                }
-            ) {
-                Box(Modifier.weight(1f, false).size(size.toDp()))
-            }
-        }
-        assertTrue(latch.await(1, TimeUnit.SECONDS))
-        assertEquals(size, columnHeight)
-    }
-
-    @Test
-    fun testColumn_includesSpacing_withWeightChildren() = with(density) {
-        val columnHeight = 40
-        val space = 8
-        val latch = CountDownLatch(2)
-        show {
-            Column(
-                modifier = Modifier.height(columnHeight.toDp()),
-                verticalArrangement = Arrangement.spacedBy(space.toDp())
-            ) {
-                Box(
-                    Modifier.weight(1f).onGloballyPositioned {
-                        assertEquals((columnHeight - space) / 2, it.size.height)
-                        assertEquals(0, it.positionInRoot().y.toInt())
-                        latch.countDown()
-                    }
-                )
-                Box(
-                    Modifier.weight(1f).onGloballyPositioned {
-                        assertEquals((columnHeight - space) / 2, it.size.height)
-                        assertEquals(
-                            (columnHeight - space) / 2 + space,
-                            it.positionInRoot().y.toInt()
-                        )
-                        latch.countDown()
-                    }
-                )
-            }
-        }
-        assertTrue(latch.await(1, TimeUnit.SECONDS))
-    }
     // endregion
 
     // region Main axis alignment tests in Row
     @Test
-    fun testRow_withStartArrangement() = with(density) {
-        val sizeDp = 50.toDp()
-        val size = sizeDp.roundToPx()
+    fun testRow_withStartArrangement() =
+        with(density) {
+            val sizeDp = 50.toDp()
+            val size = sizeDp.roundToPx()
 
-        val drawLatch = CountDownLatch(4)
-        val childPosition = arrayOf(
-            Offset(-1f, -1f), Offset(-1f, -1f), Offset(-1f, -1f)
-        )
-        val childLayoutCoordinates = arrayOfNulls<LayoutCoordinates?>(childPosition.size)
-        var parentLayoutCoordinates: LayoutCoordinates? = null
-        show {
-            Center {
-                Row(
-                    Modifier.fillMaxWidth()
-                        .onGloballyPositioned { coordinates: LayoutCoordinates ->
+            val drawLatch = CountDownLatch(4)
+            val childPosition = arrayOf(Offset(-1f, -1f), Offset(-1f, -1f), Offset(-1f, -1f))
+            val childLayoutCoordinates = arrayOfNulls<LayoutCoordinates?>(childPosition.size)
+            var parentLayoutCoordinates: LayoutCoordinates? = null
+            show {
+                Center {
+                    Row(
+                        Modifier.fillMaxWidth().onGloballyPositioned {
+                            coordinates: LayoutCoordinates ->
                             parentLayoutCoordinates = coordinates
                             drawLatch.countDown()
                         }
-                ) {
-                    for (i in 0 until childPosition.size) {
-                        Container(
-                            width = sizeDp,
-                            height = sizeDp,
-                            modifier = Modifier.onGloballyPositioned { coordinates ->
-                                childLayoutCoordinates[i] = coordinates
-                                drawLatch.countDown()
-                            }
-                        ) {
+                    ) {
+                        for (i in 0 until childPosition.size) {
+                            Container(
+                                width = sizeDp,
+                                height = sizeDp,
+                                modifier =
+                                    Modifier.onGloballyPositioned { coordinates ->
+                                        childLayoutCoordinates[i] = coordinates
+                                        drawLatch.countDown()
+                                    }
+                            ) {}
                         }
                     }
                 }
             }
+            assertTrue(drawLatch.await(1, TimeUnit.SECONDS))
+
+            calculateChildPositions(childPosition, parentLayoutCoordinates, childLayoutCoordinates)
+
+            val root = findComposeView()
+            waitForDraw(root)
+
+            assertEquals(Offset(0f, 0f), childPosition[0])
+            assertEquals(Offset(size.toFloat(), 0f), childPosition[1])
+            assertEquals(Offset(size.toFloat() * 2, 0f), childPosition[2])
         }
-        assertTrue(drawLatch.await(1, TimeUnit.SECONDS))
-
-        calculateChildPositions(childPosition, parentLayoutCoordinates, childLayoutCoordinates)
-
-        val root = findComposeView()
-        waitForDraw(root)
-
-        assertEquals(Offset(0f, 0f), childPosition[0])
-        assertEquals(Offset(size.toFloat(), 0f), childPosition[1])
-        assertEquals(Offset(size.toFloat() * 2, 0f), childPosition[2])
-    }
 
     @Test
-    fun testRow_withEndArrangement() = with(density) {
-        val sizeDp = 50.toDp()
-        val size = sizeDp.roundToPx()
+    fun testRow_withEndArrangement() =
+        with(density) {
+            val sizeDp = 50.toDp()
+            val size = sizeDp.roundToPx()
 
-        val drawLatch = CountDownLatch(4)
-        val childPosition = arrayOf(
-            Offset(-1f, -1f), Offset(-1f, -1f), Offset(-1f, -1f)
-        )
-        val childLayoutCoordinates = arrayOfNulls<LayoutCoordinates?>(childPosition.size)
-        var parentLayoutCoordinates: LayoutCoordinates? = null
-        show {
-            Center {
-                Row(
-                    Modifier.fillMaxWidth().onGloballyPositioned { coordinates ->
-                        parentLayoutCoordinates = coordinates
-                        drawLatch.countDown()
-                    },
-                    horizontalArrangement = Arrangement.End
-                ) {
-                    for (i in 0 until childPosition.size) {
-                        Container(
-                            width = sizeDp,
-                            height = sizeDp,
-                            modifier = Modifier.onGloballyPositioned { coordinates ->
-                                childLayoutCoordinates[i] = coordinates
-                                drawLatch.countDown()
-                            }
-                        ) {
+            val drawLatch = CountDownLatch(4)
+            val childPosition = arrayOf(Offset(-1f, -1f), Offset(-1f, -1f), Offset(-1f, -1f))
+            val childLayoutCoordinates = arrayOfNulls<LayoutCoordinates?>(childPosition.size)
+            var parentLayoutCoordinates: LayoutCoordinates? = null
+            show {
+                Center {
+                    Row(
+                        Modifier.fillMaxWidth().onGloballyPositioned { coordinates ->
+                            parentLayoutCoordinates = coordinates
+                            drawLatch.countDown()
+                        },
+                        horizontalArrangement = Arrangement.End
+                    ) {
+                        for (i in 0 until childPosition.size) {
+                            Container(
+                                width = sizeDp,
+                                height = sizeDp,
+                                modifier =
+                                    Modifier.onGloballyPositioned { coordinates ->
+                                        childLayoutCoordinates[i] = coordinates
+                                        drawLatch.countDown()
+                                    }
+                            ) {}
                         }
                     }
                 }
             }
+            assertTrue(drawLatch.await(1, TimeUnit.SECONDS))
+
+            calculateChildPositions(childPosition, parentLayoutCoordinates, childLayoutCoordinates)
+
+            val root = findComposeView()
+            waitForDraw(root)
+
+            assertEquals(Offset((root.width - size.toFloat() * 3), 0f), childPosition[0])
+            assertEquals(Offset((root.width - size.toFloat() * 2), 0f), childPosition[1])
+            assertEquals(Offset((root.width - size.toFloat()), 0f), childPosition[2])
         }
-        assertTrue(drawLatch.await(1, TimeUnit.SECONDS))
-
-        calculateChildPositions(childPosition, parentLayoutCoordinates, childLayoutCoordinates)
-
-        val root = findComposeView()
-        waitForDraw(root)
-
-        assertEquals(Offset((root.width - size.toFloat() * 3), 0f), childPosition[0])
-        assertEquals(Offset((root.width - size.toFloat() * 2), 0f), childPosition[1])
-        assertEquals(Offset((root.width - size.toFloat()), 0f), childPosition[2])
-    }
 
     @Test
-    fun testRow_withCenterArrangement() = with(density) {
-        val sizeDp = 50.toDp()
-        val size = sizeDp.roundToPx()
+    fun testRow_withCenterArrangement() =
+        with(density) {
+            val sizeDp = 50.toDp()
+            val size = sizeDp.roundToPx()
 
-        val drawLatch = CountDownLatch(4)
-        val childPosition = arrayOf(
-            Offset(-1f, -1f), Offset(-1f, -1f), Offset(-1f, -1f)
-        )
-        val childLayoutCoordinates = arrayOfNulls<LayoutCoordinates?>(childPosition.size)
-        var parentLayoutCoordinates: LayoutCoordinates? = null
-        show {
-            Center {
-                Row(
-                    Modifier.fillMaxWidth().onGloballyPositioned { coordinates ->
-                        parentLayoutCoordinates = coordinates
-                        drawLatch.countDown()
-                    },
-                    horizontalArrangement = Arrangement.Center
-                ) {
-                    for (i in 0 until childPosition.size) {
-                        Container(
-                            width = sizeDp,
-                            height = sizeDp,
-                            modifier = Modifier.onGloballyPositioned { coordinates ->
-                                childLayoutCoordinates[i] = coordinates
-                                drawLatch.countDown()
-                            }
-                        ) {
+            val drawLatch = CountDownLatch(4)
+            val childPosition = arrayOf(Offset(-1f, -1f), Offset(-1f, -1f), Offset(-1f, -1f))
+            val childLayoutCoordinates = arrayOfNulls<LayoutCoordinates?>(childPosition.size)
+            var parentLayoutCoordinates: LayoutCoordinates? = null
+            show {
+                Center {
+                    Row(
+                        Modifier.fillMaxWidth().onGloballyPositioned { coordinates ->
+                            parentLayoutCoordinates = coordinates
+                            drawLatch.countDown()
+                        },
+                        horizontalArrangement = Arrangement.Center
+                    ) {
+                        for (i in 0 until childPosition.size) {
+                            Container(
+                                width = sizeDp,
+                                height = sizeDp,
+                                modifier =
+                                    Modifier.onGloballyPositioned { coordinates ->
+                                        childLayoutCoordinates[i] = coordinates
+                                        drawLatch.countDown()
+                                    }
+                            ) {}
                         }
                     }
                 }
             }
+            assertTrue(drawLatch.await(1, TimeUnit.SECONDS))
+
+            calculateChildPositions(childPosition, parentLayoutCoordinates, childLayoutCoordinates)
+
+            val root = findComposeView()
+            waitForDraw(root)
+
+            val extraSpace = root.width - size * 3
+            assertEquals(Offset((extraSpace / 2f).roundToInt().toFloat(), 0f), childPosition[0])
+            assertEquals(
+                Offset(((extraSpace / 2f) + size.toFloat()).roundToInt().toFloat(), 0f),
+                childPosition[1]
+            )
+            assertEquals(
+                Offset(((extraSpace / 2f) + size.toFloat() * 2).roundToInt().toFloat(), 0f),
+                childPosition[2]
+            )
         }
-        assertTrue(drawLatch.await(1, TimeUnit.SECONDS))
-
-        calculateChildPositions(childPosition, parentLayoutCoordinates, childLayoutCoordinates)
-
-        val root = findComposeView()
-        waitForDraw(root)
-
-        val extraSpace = root.width - size * 3
-        assertEquals(Offset((extraSpace / 2f).roundToInt().toFloat(), 0f), childPosition[0])
-        assertEquals(
-            Offset(((extraSpace / 2f) + size.toFloat()).roundToInt().toFloat(), 0f),
-            childPosition[1]
-        )
-        assertEquals(
-            Offset(
-                ((extraSpace / 2f) + size.toFloat() * 2).roundToInt().toFloat(),
-                0f
-            ),
-            childPosition[2]
-        )
-    }
 
     @Test
-    fun testRow_withSpaceEvenlyArrangement() = with(density) {
-        val sizeDp = 50.toDp()
-        val size = sizeDp.roundToPx()
+    fun testRow_withSpaceEvenlyArrangement() =
+        with(density) {
+            val sizeDp = 50.toDp()
+            val size = sizeDp.roundToPx()
 
-        val drawLatch = CountDownLatch(4)
-        val childPosition = arrayOf(
-            Offset(-1f, -1f), Offset(-1f, -1f), Offset(-1f, -1f)
-        )
-        val childLayoutCoordinates = arrayOfNulls<LayoutCoordinates?>(childPosition.size)
-        var parentLayoutCoordinates: LayoutCoordinates? = null
-        show {
-            Center {
-                Row(
-                    Modifier.fillMaxWidth().onGloballyPositioned { coordinates ->
-                        parentLayoutCoordinates = coordinates
-                        drawLatch.countDown()
-                    },
-                    horizontalArrangement = Arrangement.SpaceEvenly
-                ) {
-                    for (i in 0 until childPosition.size) {
-                        Container(
-                            width = sizeDp,
-                            height = sizeDp,
-                            modifier = Modifier.onGloballyPositioned { coordinates ->
-                                childLayoutCoordinates[i] = coordinates
-                                drawLatch.countDown()
-                            }
-                        ) {
+            val drawLatch = CountDownLatch(4)
+            val childPosition = arrayOf(Offset(-1f, -1f), Offset(-1f, -1f), Offset(-1f, -1f))
+            val childLayoutCoordinates = arrayOfNulls<LayoutCoordinates?>(childPosition.size)
+            var parentLayoutCoordinates: LayoutCoordinates? = null
+            show {
+                Center {
+                    Row(
+                        Modifier.fillMaxWidth().onGloballyPositioned { coordinates ->
+                            parentLayoutCoordinates = coordinates
+                            drawLatch.countDown()
+                        },
+                        horizontalArrangement = Arrangement.SpaceEvenly
+                    ) {
+                        for (i in 0 until childPosition.size) {
+                            Container(
+                                width = sizeDp,
+                                height = sizeDp,
+                                modifier =
+                                    Modifier.onGloballyPositioned { coordinates ->
+                                        childLayoutCoordinates[i] = coordinates
+                                        drawLatch.countDown()
+                                    }
+                            ) {}
                         }
                     }
                 }
             }
+            assertTrue(drawLatch.await(1, TimeUnit.SECONDS))
+
+            calculateChildPositions(childPosition, parentLayoutCoordinates, childLayoutCoordinates)
+
+            val root = findComposeView()
+            waitForDraw(root)
+
+            val gap = (root.width - size.toFloat() * 3f) / 4f
+            assertEquals(Offset(gap.roundToInt().toFloat(), 0f), childPosition[0])
+            assertEquals(
+                Offset((size.toFloat() + gap * 2f).roundToInt().toFloat(), 0f),
+                childPosition[1]
+            )
+            assertEquals(
+                Offset((size.toFloat() * 2f + gap * 3f).roundToInt().toFloat(), 0f),
+                childPosition[2]
+            )
         }
-        assertTrue(drawLatch.await(1, TimeUnit.SECONDS))
-
-        calculateChildPositions(childPosition, parentLayoutCoordinates, childLayoutCoordinates)
-
-        val root = findComposeView()
-        waitForDraw(root)
-
-        val gap = (root.width - size.toFloat() * 3f) / 4f
-        assertEquals(
-            Offset(gap.roundToInt().toFloat(), 0f), childPosition[0]
-        )
-        assertEquals(
-            Offset((size.toFloat() + gap * 2f).roundToInt().toFloat(), 0f),
-            childPosition[1]
-        )
-        assertEquals(
-            Offset((size.toFloat() * 2f + gap * 3f).roundToInt().toFloat(), 0f),
-            childPosition[2]
-        )
-    }
 
     @Test
-    fun testRow_withSpaceBetweenArrangement_singleItem() = with(density) {
-        val sizeDp = 50.toDp()
+    fun testRow_withSpaceBetweenArrangement_singleItem() =
+        with(density) {
+            val sizeDp = 50.toDp()
 
-        val drawLatch = CountDownLatch(2)
-        val childPosition = arrayOf(Offset(-1f, -1f))
-        val childLayoutCoordinates = arrayOfNulls<LayoutCoordinates?>(childPosition.size)
-        var parentLayoutCoordinates: LayoutCoordinates? = null
-        show {
-            Center {
-                Row(
-                    Modifier.fillMaxWidth().onGloballyPositioned { coordinates ->
-                        parentLayoutCoordinates = coordinates
-                        drawLatch.countDown()
-                    },
-                    horizontalArrangement = Arrangement.SpaceBetween
-                ) {
-                    for (i in 0 until childPosition.size) {
-                        Container(
-                            width = sizeDp,
-                            height = sizeDp,
-                            modifier = Modifier.onGloballyPositioned { coordinates ->
-                                childLayoutCoordinates[i] = coordinates
-                                drawLatch.countDown()
-                            }
-                        ) {
+            val drawLatch = CountDownLatch(2)
+            val childPosition = arrayOf(Offset(-1f, -1f))
+            val childLayoutCoordinates = arrayOfNulls<LayoutCoordinates?>(childPosition.size)
+            var parentLayoutCoordinates: LayoutCoordinates? = null
+            show {
+                Center {
+                    Row(
+                        Modifier.fillMaxWidth().onGloballyPositioned { coordinates ->
+                            parentLayoutCoordinates = coordinates
+                            drawLatch.countDown()
+                        },
+                        horizontalArrangement = Arrangement.SpaceBetween
+                    ) {
+                        for (i in 0 until childPosition.size) {
+                            Container(
+                                width = sizeDp,
+                                height = sizeDp,
+                                modifier =
+                                    Modifier.onGloballyPositioned { coordinates ->
+                                        childLayoutCoordinates[i] = coordinates
+                                        drawLatch.countDown()
+                                    }
+                            ) {}
                         }
                     }
                 }
             }
+            assertTrue(drawLatch.await(1, TimeUnit.SECONDS))
+
+            calculateChildPositions(childPosition, parentLayoutCoordinates, childLayoutCoordinates)
+
+            val root = findComposeView()
+            waitForDraw(root)
+
+            assertEquals(Offset(0f, 0f), childPosition[0])
         }
-        assertTrue(drawLatch.await(1, TimeUnit.SECONDS))
-
-        calculateChildPositions(childPosition, parentLayoutCoordinates, childLayoutCoordinates)
-
-        val root = findComposeView()
-        waitForDraw(root)
-
-        assertEquals(
-            Offset(0f, 0f),
-            childPosition[0]
-        )
-    }
 
     @Test
-    fun testRow_withSpaceBetweenArrangement_multipleItems() = with(density) {
-        val sizeDp = 50.toDp()
-        val size = sizeDp.roundToPx()
+    fun testRow_withSpaceBetweenArrangement_multipleItems() =
+        with(density) {
+            val sizeDp = 50.toDp()
+            val size = sizeDp.roundToPx()
 
-        val drawLatch = CountDownLatch(4)
-        val childPosition = arrayOf(
-            Offset(-1f, -1f), Offset(-1f, -1f), Offset(-1f, -1f)
-        )
-        val childLayoutCoordinates = arrayOfNulls<LayoutCoordinates?>(childPosition.size)
-        var parentLayoutCoordinates: LayoutCoordinates? = null
-        show {
-            Center {
-                Row(
-                    Modifier.fillMaxWidth().onGloballyPositioned { coordinates ->
-                        parentLayoutCoordinates = coordinates
-                        drawLatch.countDown()
-                    },
-                    horizontalArrangement = Arrangement.SpaceBetween
-                ) {
-                    for (i in childPosition.indices) {
-                        Container(
-                            width = sizeDp,
-                            height = sizeDp,
-                            modifier = Modifier.onGloballyPositioned { coordinates ->
-                                childLayoutCoordinates[i] = coordinates
-                                drawLatch.countDown()
-                            }
-                        ) {
+            val drawLatch = CountDownLatch(4)
+            val childPosition = arrayOf(Offset(-1f, -1f), Offset(-1f, -1f), Offset(-1f, -1f))
+            val childLayoutCoordinates = arrayOfNulls<LayoutCoordinates?>(childPosition.size)
+            var parentLayoutCoordinates: LayoutCoordinates? = null
+            show {
+                Center {
+                    Row(
+                        Modifier.fillMaxWidth().onGloballyPositioned { coordinates ->
+                            parentLayoutCoordinates = coordinates
+                            drawLatch.countDown()
+                        },
+                        horizontalArrangement = Arrangement.SpaceBetween
+                    ) {
+                        for (i in childPosition.indices) {
+                            Container(
+                                width = sizeDp,
+                                height = sizeDp,
+                                modifier =
+                                    Modifier.onGloballyPositioned { coordinates ->
+                                        childLayoutCoordinates[i] = coordinates
+                                        drawLatch.countDown()
+                                    }
+                            ) {}
                         }
                     }
                 }
             }
+            assertTrue(drawLatch.await(1, TimeUnit.SECONDS))
+
+            calculateChildPositions(childPosition, parentLayoutCoordinates, childLayoutCoordinates)
+
+            val root = findComposeView()
+            waitForDraw(root)
+
+            val gap = (root.width - size.toFloat() * 3) / 2
+            assertEquals(Offset(0f, 0f), childPosition[0])
+            assertEquals(
+                Offset((gap + size.toFloat()).roundToInt().toFloat(), 0f),
+                childPosition[1]
+            )
+            assertEquals(
+                Offset((gap * 2 + size.toFloat() * 2).roundToInt().toFloat(), 0f),
+                childPosition[2]
+            )
         }
-        assertTrue(drawLatch.await(1, TimeUnit.SECONDS))
-
-        calculateChildPositions(childPosition, parentLayoutCoordinates, childLayoutCoordinates)
-
-        val root = findComposeView()
-        waitForDraw(root)
-
-        val gap = (root.width - size.toFloat() * 3) / 2
-        assertEquals(Offset(0f, 0f), childPosition[0])
-        assertEquals(
-            Offset((gap + size.toFloat()).roundToInt().toFloat(), 0f),
-            childPosition[1]
-        )
-        assertEquals(
-            Offset((gap * 2 + size.toFloat() * 2).roundToInt().toFloat(), 0f),
-            childPosition[2]
-        )
-    }
 
     @Test
-    fun testRow_withSpaceAroundArrangement() = with(density) {
-        val sizeDp = 50.toDp()
-        val size = sizeDp.roundToPx()
+    fun testRow_withSpaceAroundArrangement() =
+        with(density) {
+            val sizeDp = 50.toDp()
+            val size = sizeDp.roundToPx()
 
-        val drawLatch = CountDownLatch(4)
-        val childPosition = arrayOf(
-            Offset(-1f, -1f), Offset(-1f, -1f), Offset(-1f, -1f)
-        )
-        val childLayoutCoordinates = arrayOfNulls<LayoutCoordinates?>(childPosition.size)
-        var parentLayoutCoordinates: LayoutCoordinates? = null
-        show {
-            Center {
-                Row(
-                    Modifier.fillMaxWidth().onGloballyPositioned { coordinates ->
-                        parentLayoutCoordinates = coordinates
-                        drawLatch.countDown()
-                    },
-                    horizontalArrangement = Arrangement.SpaceAround
-                ) {
-                    for (i in 0 until childPosition.size) {
-                        Container(
-                            width = sizeDp,
-                            height = sizeDp,
-                            modifier = Modifier.onGloballyPositioned { coordinates ->
-                                childLayoutCoordinates[i] = coordinates
-                                drawLatch.countDown()
-                            }
-                        ) {
+            val drawLatch = CountDownLatch(4)
+            val childPosition = arrayOf(Offset(-1f, -1f), Offset(-1f, -1f), Offset(-1f, -1f))
+            val childLayoutCoordinates = arrayOfNulls<LayoutCoordinates?>(childPosition.size)
+            var parentLayoutCoordinates: LayoutCoordinates? = null
+            show {
+                Center {
+                    Row(
+                        Modifier.fillMaxWidth().onGloballyPositioned { coordinates ->
+                            parentLayoutCoordinates = coordinates
+                            drawLatch.countDown()
+                        },
+                        horizontalArrangement = Arrangement.SpaceAround
+                    ) {
+                        for (i in 0 until childPosition.size) {
+                            Container(
+                                width = sizeDp,
+                                height = sizeDp,
+                                modifier =
+                                    Modifier.onGloballyPositioned { coordinates ->
+                                        childLayoutCoordinates[i] = coordinates
+                                        drawLatch.countDown()
+                                    }
+                            ) {}
                         }
                     }
                 }
             }
+            assertTrue(drawLatch.await(1, TimeUnit.SECONDS))
+
+            calculateChildPositions(childPosition, parentLayoutCoordinates, childLayoutCoordinates)
+
+            val root = findComposeView()
+            waitForDraw(root)
+
+            val gap = (root.width.toFloat() - size * 3) / 3
+            assertEquals(Offset((gap / 2f).roundToInt().toFloat(), 0f), childPosition[0])
+            assertEquals(
+                Offset(((gap * 3 / 2) + size.toFloat()).roundToInt().toFloat(), 0f),
+                childPosition[1]
+            )
+            assertEquals(
+                Offset(((gap * 5 / 2) + size.toFloat() * 2).roundToInt().toFloat(), 0f),
+                childPosition[2]
+            )
         }
-        assertTrue(drawLatch.await(1, TimeUnit.SECONDS))
-
-        calculateChildPositions(childPosition, parentLayoutCoordinates, childLayoutCoordinates)
-
-        val root = findComposeView()
-        waitForDraw(root)
-
-        val gap = (root.width.toFloat() - size * 3) / 3
-        assertEquals(Offset((gap / 2f).roundToInt().toFloat(), 0f), childPosition[0])
-        assertEquals(
-            Offset(((gap * 3 / 2) + size.toFloat()).roundToInt().toFloat(), 0f),
-            childPosition[1]
-        )
-        assertEquals(
-            Offset(((gap * 5 / 2) + size.toFloat() * 2).roundToInt().toFloat(), 0f),
-            childPosition[2]
-        )
-    }
 
     @Test
-    fun testRow_withSpacedByArrangement() = with(density) {
-        val spacePx = 10f
-        val space = spacePx.toDp()
-        val sizePx = 20f
-        val size = sizePx.toDp()
-        val latch = CountDownLatch(3)
-        show {
-            Column {
-                Row(
-                    horizontalArrangement = Arrangement.spacedBy(space),
-                    modifier = Modifier.onGloballyPositioned {
-                        assertEquals((sizePx * 2 + spacePx).roundToInt(), it.size.width)
-                        latch.countDown()
-                    }
-                ) {
-                    Box(
-                        Modifier.requiredSize(size).onGloballyPositioned {
-                            assertEquals(0f, it.positionInParent().x)
-                            latch.countDown()
-                        }
-                    )
-                    Box(
-                        Modifier.requiredSize(size).onGloballyPositioned {
-                            assertEquals(sizePx + spacePx, it.positionInParent().x)
-                            latch.countDown()
-                        }
-                    )
-                }
-            }
-        }
-        assertTrue(latch.await(1, TimeUnit.SECONDS))
-    }
-
-    @Test
-    fun testRow_withSpacedByAlignedArrangement() = with(density) {
-        val spacePx = 10f
-        val space = spacePx.toDp()
-        val sizePx = 20f
-        val size = sizePx.toDp()
-        val rowSizePx = 50
-        val rowSize = rowSizePx.toDp()
-        val latch = CountDownLatch(3)
-        show {
-            Column {
-                Row(
-                    horizontalArrangement = Arrangement.spacedBy(space, Alignment.End),
-                    modifier = Modifier.requiredSize(rowSize).onGloballyPositioned {
-                        assertEquals(rowSizePx, it.size.width)
-                        latch.countDown()
-                    }
-                ) {
-                    Box(
-                        Modifier.requiredSize(size).onGloballyPositioned {
-                            assertEquals(rowSizePx - spacePx - sizePx * 2, it.positionInParent().x)
-                            latch.countDown()
-                        }
-                    )
-                    Box(
-                        Modifier.requiredSize(size).onGloballyPositioned {
-                            assertEquals(rowSizePx - sizePx, it.positionInParent().x)
-                            latch.countDown()
-                        }
-                    )
-                }
-            }
-        }
-        assertTrue(latch.await(1, TimeUnit.SECONDS))
-    }
-
-    @Test
-    fun testRow_withSpacedByArrangement_insufficientSpace() = with(density) {
-        val spacePx = 15f
-        val space = spacePx.toDp()
-        val sizePx = 20f
-        val size = sizePx.toDp()
-        val rowSizePx = 50f
-        val rowSize = rowSizePx.toDp()
-        val latch = CountDownLatch(4)
-        show {
-            Column {
-                Row(
-                    horizontalArrangement = Arrangement.spacedBy(space),
-                    modifier = Modifier.requiredSize(rowSize).onGloballyPositioned {
-                        assertEquals(rowSizePx.roundToInt(), it.size.width)
-                        latch.countDown()
-                    }
-                ) {
-                    Box(
-                        Modifier.size(size).onGloballyPositioned {
-                            assertEquals(0f, it.positionInParent().x)
-                            assertEquals(sizePx.roundToInt(), it.size.width)
-                            latch.countDown()
-                        }
-                    )
-                    Box(
-                        Modifier.size(size).onGloballyPositioned {
-                            assertEquals(sizePx + spacePx, it.positionInParent().x)
-                            assertEquals((rowSizePx - spacePx - sizePx).roundToInt(), it.size.width)
-                            latch.countDown()
-                        }
-                    )
-                    Box(
-                        Modifier.size(size).onGloballyPositioned {
-                            assertEquals(rowSizePx, it.positionInParent().x)
-                            assertEquals(0, it.size.width)
-                            latch.countDown()
-                        }
-                    )
-                }
-            }
-        }
-        assertTrue(latch.await(1, TimeUnit.SECONDS))
-    }
-
-    @Test
-    fun testRow_withAlignedArrangement() = with(density) {
-        val sizePx = 20f
-        val size = sizePx.toDp()
-        val rowSizePx = 50f
-        val rowSize = rowSizePx.toDp()
-        val latch = CountDownLatch(3)
-        show {
-            Column {
-                Row(
-                    horizontalArrangement = Arrangement.aligned(Alignment.End),
-                    modifier = Modifier.requiredSize(rowSize).onGloballyPositioned {
-                        assertEquals(rowSizePx.roundToInt(), it.size.width)
-                        latch.countDown()
-                    }
-                ) {
-                    Box(
-                        Modifier.size(size).onGloballyPositioned {
-                            assertEquals(rowSizePx - sizePx * 2, it.positionInParent().x)
-                            assertEquals(sizePx.roundToInt(), it.size.width)
-                            latch.countDown()
-                        }
-                    )
-                    Box(
-                        Modifier.size(size).onGloballyPositioned {
-                            assertEquals(rowSizePx - sizePx, it.positionInParent().x)
-                            assertEquals(sizePx.roundToInt(), it.size.width)
-                            latch.countDown()
-                        }
-                    )
-                }
-            }
-        }
-        assertTrue(latch.await(1, TimeUnit.SECONDS))
-    }
-
-    @Test
-    fun testRow_withSpacedByArrangement_rtl() = with(density) {
-        val spacePx = 10f
-        val space = spacePx.toDp()
-        val bufferPx = 15f
-        val buffer = bufferPx.toDp()
-        val sizePx = 20f
-        val size = sizePx.toDp()
-        val latch = CountDownLatch(2)
-        show {
-            DeviceConfigurationOverride(
-                DeviceConfigurationOverride.LayoutDirection(LayoutDirection.Rtl)
-            ) {
+    fun testRow_withSpacedByArrangement() =
+        with(density) {
+            val spacePx = 10f
+            val space = spacePx.toDp()
+            val sizePx = 20f
+            val size = sizePx.toDp()
+            val latch = CountDownLatch(3)
+            show {
                 Column {
                     Row(
                         horizontalArrangement = Arrangement.spacedBy(space),
-                        modifier = Modifier.requiredWidth(size * 2 + space + buffer)
+                        modifier =
+                            Modifier.onGloballyPositioned {
+                                assertEquals((sizePx * 2 + spacePx).roundToInt(), it.size.width)
+                                latch.countDown()
+                            }
                     ) {
                         Box(
                             Modifier.requiredSize(size).onGloballyPositioned {
-                                assertEquals(sizePx + spacePx + bufferPx, it.positionInParent().x)
+                                assertEquals(0f, it.positionInParent().x)
                                 latch.countDown()
                             }
                         )
                         Box(
                             Modifier.requiredSize(size).onGloballyPositioned {
-                                assertEquals(bufferPx, it.positionInParent().x)
+                                assertEquals(sizePx + spacePx, it.positionInParent().x)
                                 latch.countDown()
                             }
                         )
                     }
                 }
             }
+            assertTrue(latch.await(1, TimeUnit.SECONDS))
         }
-        assertTrue(latch.await(1, TimeUnit.SECONDS))
-    }
+
+    @Test
+    fun testRow_withSpacedByAlignedArrangement() =
+        with(density) {
+            val spacePx = 10f
+            val space = spacePx.toDp()
+            val sizePx = 20f
+            val size = sizePx.toDp()
+            val rowSizePx = 50
+            val rowSize = rowSizePx.toDp()
+            val latch = CountDownLatch(3)
+            show {
+                Column {
+                    Row(
+                        horizontalArrangement = Arrangement.spacedBy(space, Alignment.End),
+                        modifier =
+                            Modifier.requiredSize(rowSize).onGloballyPositioned {
+                                assertEquals(rowSizePx, it.size.width)
+                                latch.countDown()
+                            }
+                    ) {
+                        Box(
+                            Modifier.requiredSize(size).onGloballyPositioned {
+                                assertEquals(
+                                    rowSizePx - spacePx - sizePx * 2,
+                                    it.positionInParent().x
+                                )
+                                latch.countDown()
+                            }
+                        )
+                        Box(
+                            Modifier.requiredSize(size).onGloballyPositioned {
+                                assertEquals(rowSizePx - sizePx, it.positionInParent().x)
+                                latch.countDown()
+                            }
+                        )
+                    }
+                }
+            }
+            assertTrue(latch.await(1, TimeUnit.SECONDS))
+        }
+
+    @Test
+    fun testRow_withSpacedByArrangement_insufficientSpace() =
+        with(density) {
+            val spacePx = 15f
+            val space = spacePx.toDp()
+            val sizePx = 20f
+            val size = sizePx.toDp()
+            val rowSizePx = 50f
+            val rowSize = rowSizePx.toDp()
+            val latch = CountDownLatch(4)
+            show {
+                Column {
+                    Row(
+                        horizontalArrangement = Arrangement.spacedBy(space),
+                        modifier =
+                            Modifier.requiredSize(rowSize).onGloballyPositioned {
+                                assertEquals(rowSizePx.roundToInt(), it.size.width)
+                                latch.countDown()
+                            }
+                    ) {
+                        Box(
+                            Modifier.size(size).onGloballyPositioned {
+                                assertEquals(0f, it.positionInParent().x)
+                                assertEquals(sizePx.roundToInt(), it.size.width)
+                                latch.countDown()
+                            }
+                        )
+                        Box(
+                            Modifier.size(size).onGloballyPositioned {
+                                assertEquals(sizePx + spacePx, it.positionInParent().x)
+                                assertEquals(
+                                    (rowSizePx - spacePx - sizePx).roundToInt(),
+                                    it.size.width
+                                )
+                                latch.countDown()
+                            }
+                        )
+                        Box(
+                            Modifier.size(size).onGloballyPositioned {
+                                assertEquals(rowSizePx, it.positionInParent().x)
+                                assertEquals(0, it.size.width)
+                                latch.countDown()
+                            }
+                        )
+                    }
+                }
+            }
+            assertTrue(latch.await(1, TimeUnit.SECONDS))
+        }
+
+    @Test
+    fun testRow_withAlignedArrangement() =
+        with(density) {
+            val sizePx = 20f
+            val size = sizePx.toDp()
+            val rowSizePx = 50f
+            val rowSize = rowSizePx.toDp()
+            val latch = CountDownLatch(3)
+            show {
+                Column {
+                    Row(
+                        horizontalArrangement = Arrangement.aligned(Alignment.End),
+                        modifier =
+                            Modifier.requiredSize(rowSize).onGloballyPositioned {
+                                assertEquals(rowSizePx.roundToInt(), it.size.width)
+                                latch.countDown()
+                            }
+                    ) {
+                        Box(
+                            Modifier.size(size).onGloballyPositioned {
+                                assertEquals(rowSizePx - sizePx * 2, it.positionInParent().x)
+                                assertEquals(sizePx.roundToInt(), it.size.width)
+                                latch.countDown()
+                            }
+                        )
+                        Box(
+                            Modifier.size(size).onGloballyPositioned {
+                                assertEquals(rowSizePx - sizePx, it.positionInParent().x)
+                                assertEquals(sizePx.roundToInt(), it.size.width)
+                                latch.countDown()
+                            }
+                        )
+                    }
+                }
+            }
+            assertTrue(latch.await(1, TimeUnit.SECONDS))
+        }
+
+    @Test
+    fun testRow_withSpacedByArrangement_rtl() =
+        with(density) {
+            val spacePx = 10f
+            val space = spacePx.toDp()
+            val bufferPx = 15f
+            val buffer = bufferPx.toDp()
+            val sizePx = 20f
+            val size = sizePx.toDp()
+            val latch = CountDownLatch(2)
+            show {
+                DeviceConfigurationOverride(
+                    DeviceConfigurationOverride.LayoutDirection(LayoutDirection.Rtl)
+                ) {
+                    Column {
+                        Row(
+                            horizontalArrangement = Arrangement.spacedBy(space),
+                            modifier = Modifier.requiredWidth(size * 2 + space + buffer)
+                        ) {
+                            Box(
+                                Modifier.requiredSize(size).onGloballyPositioned {
+                                    assertEquals(
+                                        sizePx + spacePx + bufferPx,
+                                        it.positionInParent().x
+                                    )
+                                    latch.countDown()
+                                }
+                            )
+                            Box(
+                                Modifier.requiredSize(size).onGloballyPositioned {
+                                    assertEquals(bufferPx, it.positionInParent().x)
+                                    latch.countDown()
+                                }
+                            )
+                        }
+                    }
+                }
+            }
+            assertTrue(latch.await(1, TimeUnit.SECONDS))
+        }
+
     // endregion
 
     // region Main axis alignment tests in Column
     @Test
-    fun testColumn_withTopArrangement() = with(density) {
-        val sizeDp = 50.toDp()
-        val size = sizeDp.roundToPx()
+    fun testColumn_withTopArrangement() =
+        with(density) {
+            val sizeDp = 50.toDp()
+            val size = sizeDp.roundToPx()
 
-        val drawLatch = CountDownLatch(4)
-        val childPosition = arrayOf(
-            Offset(-1f, -1f), Offset(-1f, -1f), Offset(-1f, -1f)
-        )
-        val childLayoutCoordinates = arrayOfNulls<LayoutCoordinates?>(childPosition.size)
-        var parentLayoutCoordinates: LayoutCoordinates? = null
-        show {
-            Center {
-                Column(
-                    Modifier.fillMaxHeight().onGloballyPositioned { coordinates ->
-                        parentLayoutCoordinates = coordinates
-                        drawLatch.countDown()
-                    }
-                ) {
-                    for (i in 0 until childPosition.size) {
-                        Container(
-                            width = sizeDp,
-                            height = sizeDp,
-                            modifier = Modifier.onGloballyPositioned { coordinates ->
-                                childLayoutCoordinates[i] = coordinates
-                                drawLatch.countDown()
-                            }
-                        ) {
+            val drawLatch = CountDownLatch(4)
+            val childPosition = arrayOf(Offset(-1f, -1f), Offset(-1f, -1f), Offset(-1f, -1f))
+            val childLayoutCoordinates = arrayOfNulls<LayoutCoordinates?>(childPosition.size)
+            var parentLayoutCoordinates: LayoutCoordinates? = null
+            show {
+                Center {
+                    Column(
+                        Modifier.fillMaxHeight().onGloballyPositioned { coordinates ->
+                            parentLayoutCoordinates = coordinates
+                            drawLatch.countDown()
+                        }
+                    ) {
+                        for (i in 0 until childPosition.size) {
+                            Container(
+                                width = sizeDp,
+                                height = sizeDp,
+                                modifier =
+                                    Modifier.onGloballyPositioned { coordinates ->
+                                        childLayoutCoordinates[i] = coordinates
+                                        drawLatch.countDown()
+                                    }
+                            ) {}
                         }
                     }
                 }
             }
+            assertTrue(drawLatch.await(1, TimeUnit.SECONDS))
+
+            calculateChildPositions(childPosition, parentLayoutCoordinates, childLayoutCoordinates)
+
+            val root = findComposeView()
+            waitForDraw(root)
+
+            assertEquals(Offset(0f, 0f), childPosition[0])
+            assertEquals(Offset(0f, size.toFloat()), childPosition[1])
+            assertEquals(Offset(0f, size.toFloat() * 2), childPosition[2])
         }
-        assertTrue(drawLatch.await(1, TimeUnit.SECONDS))
-
-        calculateChildPositions(childPosition, parentLayoutCoordinates, childLayoutCoordinates)
-
-        val root = findComposeView()
-        waitForDraw(root)
-
-        assertEquals(Offset(0f, 0f), childPosition[0])
-        assertEquals(Offset(0f, size.toFloat()), childPosition[1])
-        assertEquals(Offset(0f, size.toFloat() * 2), childPosition[2])
-    }
 
     @Test
-    fun testColumn_withBottomArrangement() = with(density) {
-        val sizeDp = 50.toDp()
-        val size = sizeDp.roundToPx()
+    fun testColumn_withBottomArrangement() =
+        with(density) {
+            val sizeDp = 50.toDp()
+            val size = sizeDp.roundToPx()
 
-        val drawLatch = CountDownLatch(4)
-        val childPosition = arrayOf(
-            Offset(-1f, -1f), Offset(-1f, -1f), Offset(-1f, -1f)
-        )
-        val childLayoutCoordinates = arrayOfNulls<LayoutCoordinates?>(childPosition.size)
-        var parentLayoutCoordinates: LayoutCoordinates? = null
-        show {
-            Center {
-                Column(
-                    Modifier.fillMaxHeight().onGloballyPositioned { coordinates ->
-                        parentLayoutCoordinates = coordinates
-                        drawLatch.countDown()
-                    },
-                    verticalArrangement = Arrangement.Bottom
-                ) {
-                    for (i in 0 until childPosition.size) {
-                        Container(
-                            width = sizeDp,
-                            height = sizeDp,
-                            modifier = Modifier.onGloballyPositioned { coordinates ->
-                                childLayoutCoordinates[i] = coordinates
-                                drawLatch.countDown()
-                            }
-                        ) {
+            val drawLatch = CountDownLatch(4)
+            val childPosition = arrayOf(Offset(-1f, -1f), Offset(-1f, -1f), Offset(-1f, -1f))
+            val childLayoutCoordinates = arrayOfNulls<LayoutCoordinates?>(childPosition.size)
+            var parentLayoutCoordinates: LayoutCoordinates? = null
+            show {
+                Center {
+                    Column(
+                        Modifier.fillMaxHeight().onGloballyPositioned { coordinates ->
+                            parentLayoutCoordinates = coordinates
+                            drawLatch.countDown()
+                        },
+                        verticalArrangement = Arrangement.Bottom
+                    ) {
+                        for (i in 0 until childPosition.size) {
+                            Container(
+                                width = sizeDp,
+                                height = sizeDp,
+                                modifier =
+                                    Modifier.onGloballyPositioned { coordinates ->
+                                        childLayoutCoordinates[i] = coordinates
+                                        drawLatch.countDown()
+                                    }
+                            ) {}
                         }
                     }
                 }
             }
+            assertTrue(drawLatch.await(1, TimeUnit.SECONDS))
+
+            calculateChildPositions(childPosition, parentLayoutCoordinates, childLayoutCoordinates)
+
+            val root = findComposeView()
+            waitForDraw(root)
+
+            assertEquals(Offset(0f, (root.height - size.toFloat() * 3)), childPosition[0])
+            assertEquals(Offset(0f, (root.height - size.toFloat() * 2)), childPosition[1])
+            assertEquals(Offset(0f, (root.height - size.toFloat())), childPosition[2])
         }
-        assertTrue(drawLatch.await(1, TimeUnit.SECONDS))
-
-        calculateChildPositions(childPosition, parentLayoutCoordinates, childLayoutCoordinates)
-
-        val root = findComposeView()
-        waitForDraw(root)
-
-        assertEquals(Offset(0f, (root.height - size.toFloat() * 3)), childPosition[0])
-        assertEquals(Offset(0f, (root.height - size.toFloat() * 2)), childPosition[1])
-        assertEquals(Offset(0f, (root.height - size.toFloat())), childPosition[2])
-    }
 
     @Test
-    fun testColumn_withCenterArrangement() = with(density) {
-        val sizeDp = 50.toDp()
-        val size = sizeDp.roundToPx()
+    fun testColumn_withCenterArrangement() =
+        with(density) {
+            val sizeDp = 50.toDp()
+            val size = sizeDp.roundToPx()
 
-        val drawLatch = CountDownLatch(4)
-        val childPosition = arrayOf(
-            Offset(-1f, -1f), Offset(-1f, -1f), Offset(-1f, -1f)
-        )
-        val childLayoutCoordinates = arrayOfNulls<LayoutCoordinates?>(childPosition.size)
-        var parentLayoutCoordinates: LayoutCoordinates? = null
-        show {
-            Center {
-                Column(
-                    Modifier.fillMaxHeight().onGloballyPositioned { coordinates ->
-                        parentLayoutCoordinates = coordinates
-                        drawLatch.countDown()
-                    },
-                    verticalArrangement = Arrangement.Center
-                ) {
-                    for (i in 0 until childPosition.size) {
-                        Container(
-                            width = sizeDp,
-                            height = sizeDp,
-                            modifier = Modifier.onGloballyPositioned { coordinates ->
-                                childLayoutCoordinates[i] = coordinates
-                                drawLatch.countDown()
-                            }
-                        ) {
+            val drawLatch = CountDownLatch(4)
+            val childPosition = arrayOf(Offset(-1f, -1f), Offset(-1f, -1f), Offset(-1f, -1f))
+            val childLayoutCoordinates = arrayOfNulls<LayoutCoordinates?>(childPosition.size)
+            var parentLayoutCoordinates: LayoutCoordinates? = null
+            show {
+                Center {
+                    Column(
+                        Modifier.fillMaxHeight().onGloballyPositioned { coordinates ->
+                            parentLayoutCoordinates = coordinates
+                            drawLatch.countDown()
+                        },
+                        verticalArrangement = Arrangement.Center
+                    ) {
+                        for (i in 0 until childPosition.size) {
+                            Container(
+                                width = sizeDp,
+                                height = sizeDp,
+                                modifier =
+                                    Modifier.onGloballyPositioned { coordinates ->
+                                        childLayoutCoordinates[i] = coordinates
+                                        drawLatch.countDown()
+                                    }
+                            ) {}
                         }
                     }
                 }
             }
+            assertTrue(drawLatch.await(1, TimeUnit.SECONDS))
+
+            calculateChildPositions(childPosition, parentLayoutCoordinates, childLayoutCoordinates)
+
+            val root = findComposeView()
+            waitForDraw(root)
+
+            val extraSpace = root.height - size * 3f
+            assertEquals(Offset(0f, (extraSpace / 2).roundToInt().toFloat()), childPosition[0])
+            assertEquals(
+                Offset(0f, ((extraSpace / 2) + size.toFloat()).roundToInt().toFloat()),
+                childPosition[1]
+            )
+            assertEquals(
+                Offset(0f, ((extraSpace / 2) + size.toFloat() * 2f).roundToInt().toFloat()),
+                childPosition[2]
+            )
         }
-        assertTrue(drawLatch.await(1, TimeUnit.SECONDS))
-
-        calculateChildPositions(childPosition, parentLayoutCoordinates, childLayoutCoordinates)
-
-        val root = findComposeView()
-        waitForDraw(root)
-
-        val extraSpace = root.height - size * 3f
-        assertEquals(
-            Offset(0f, (extraSpace / 2).roundToInt().toFloat()),
-            childPosition[0]
-        )
-        assertEquals(
-            Offset(0f, ((extraSpace / 2) + size.toFloat()).roundToInt().toFloat()),
-            childPosition[1]
-        )
-        assertEquals(
-            Offset(
-                0f,
-                ((extraSpace / 2) + size.toFloat() * 2f).roundToInt().toFloat()
-            ),
-            childPosition[2]
-        )
-    }
 
     @Test
-    fun testColumn_withSpaceEvenlyArrangement() = with(density) {
-        val sizeDp = 50.toDp()
-        val size = sizeDp.roundToPx()
+    fun testColumn_withSpaceEvenlyArrangement() =
+        with(density) {
+            val sizeDp = 50.toDp()
+            val size = sizeDp.roundToPx()
 
-        val drawLatch = CountDownLatch(4)
-        val childPosition = arrayOf(
-            Offset(-1f, -1f), Offset(-1f, -1f), Offset(-1f, -1f)
-        )
-        val childLayoutCoordinates = arrayOfNulls<LayoutCoordinates?>(childPosition.size)
-        var parentLayoutCoordinates: LayoutCoordinates? = null
-        show {
-            Center {
-                Column(
-                    Modifier.fillMaxHeight().onGloballyPositioned { coordinates ->
-                        parentLayoutCoordinates = coordinates
-                        drawLatch.countDown()
-                    },
-                    verticalArrangement = Arrangement.SpaceEvenly
-                ) {
-                    for (i in 0 until childPosition.size) {
-                        Container(
-                            width = sizeDp,
-                            height = sizeDp,
-                            modifier = Modifier.onGloballyPositioned { coordinates ->
-                                childLayoutCoordinates[i] = coordinates
-                                drawLatch.countDown()
-                            }
-                        ) {
+            val drawLatch = CountDownLatch(4)
+            val childPosition = arrayOf(Offset(-1f, -1f), Offset(-1f, -1f), Offset(-1f, -1f))
+            val childLayoutCoordinates = arrayOfNulls<LayoutCoordinates?>(childPosition.size)
+            var parentLayoutCoordinates: LayoutCoordinates? = null
+            show {
+                Center {
+                    Column(
+                        Modifier.fillMaxHeight().onGloballyPositioned { coordinates ->
+                            parentLayoutCoordinates = coordinates
+                            drawLatch.countDown()
+                        },
+                        verticalArrangement = Arrangement.SpaceEvenly
+                    ) {
+                        for (i in 0 until childPosition.size) {
+                            Container(
+                                width = sizeDp,
+                                height = sizeDp,
+                                modifier =
+                                    Modifier.onGloballyPositioned { coordinates ->
+                                        childLayoutCoordinates[i] = coordinates
+                                        drawLatch.countDown()
+                                    }
+                            ) {}
                         }
                     }
                 }
             }
+            assertTrue(drawLatch.await(1, TimeUnit.SECONDS))
+
+            calculateChildPositions(childPosition, parentLayoutCoordinates, childLayoutCoordinates)
+
+            val root = findComposeView()
+            waitForDraw(root)
+
+            val gap = (root.height - size.toFloat() * 3) / 4
+            assertEquals(Offset(0f, gap.roundToInt().toFloat()), childPosition[0])
+            assertEquals(
+                Offset(0f, (size.toFloat() + gap * 2).roundToInt().toFloat()),
+                childPosition[1]
+            )
+            assertEquals(
+                Offset(0f, (size.toFloat() * 2 + gap * 3f).roundToInt().toFloat()),
+                childPosition[2]
+            )
         }
-        assertTrue(drawLatch.await(1, TimeUnit.SECONDS))
-
-        calculateChildPositions(childPosition, parentLayoutCoordinates, childLayoutCoordinates)
-
-        val root = findComposeView()
-        waitForDraw(root)
-
-        val gap = (root.height - size.toFloat() * 3) / 4
-        assertEquals(Offset(0f, gap.roundToInt().toFloat()), childPosition[0])
-        assertEquals(
-            Offset(0f, (size.toFloat() + gap * 2).roundToInt().toFloat()),
-            childPosition[1]
-        )
-        assertEquals(
-            Offset(0f, (size.toFloat() * 2 + gap * 3f).roundToInt().toFloat()),
-            childPosition[2]
-        )
-    }
 
     private fun calculateChildPositions(
         childPosition: Array<Offset>,
@@ -3368,348 +3176,135 @@
         childLayoutCoordinates: Array<LayoutCoordinates?>
     ) {
         for (i in childPosition.indices) {
-            childPosition[i] = parentLayoutCoordinates!!
-                .localPositionOf(childLayoutCoordinates[i]!!, Offset(0f, 0f))
+            childPosition[i] =
+                parentLayoutCoordinates!!.localPositionOf(
+                    childLayoutCoordinates[i]!!,
+                    Offset(0f, 0f)
+                )
         }
     }
 
     @Test
-    fun testColumn_withSpaceBetweenArrangement() = with(density) {
-        val sizeDp = 50.toDp()
-        val size = sizeDp.roundToPx()
+    fun testColumn_withSpaceBetweenArrangement() =
+        with(density) {
+            val sizeDp = 50.toDp()
+            val size = sizeDp.roundToPx()
 
-        val drawLatch = CountDownLatch(4)
-        val childPosition = arrayOf(
-            Offset(-1f, -1f), Offset(-1f, -1f), Offset(-1f, -1f)
-        )
-        val childLayoutCoordinates = arrayOfNulls<LayoutCoordinates?>(childPosition.size)
-        var parentLayoutCoordinates: LayoutCoordinates? = null
-        show {
-            Center {
-                Column(
-                    Modifier.fillMaxHeight().onGloballyPositioned { coordinates ->
-                        parentLayoutCoordinates = coordinates
-                        drawLatch.countDown()
-                    },
-                    verticalArrangement = Arrangement.SpaceBetween
-                ) {
-                    for (i in 0 until childPosition.size) {
-                        Container(
-                            width = sizeDp,
-                            height = sizeDp,
-                            modifier = Modifier.onGloballyPositioned { coordinates ->
-                                childLayoutCoordinates[i] = coordinates
-                                drawLatch.countDown()
-                            }
-                        ) {
+            val drawLatch = CountDownLatch(4)
+            val childPosition = arrayOf(Offset(-1f, -1f), Offset(-1f, -1f), Offset(-1f, -1f))
+            val childLayoutCoordinates = arrayOfNulls<LayoutCoordinates?>(childPosition.size)
+            var parentLayoutCoordinates: LayoutCoordinates? = null
+            show {
+                Center {
+                    Column(
+                        Modifier.fillMaxHeight().onGloballyPositioned { coordinates ->
+                            parentLayoutCoordinates = coordinates
+                            drawLatch.countDown()
+                        },
+                        verticalArrangement = Arrangement.SpaceBetween
+                    ) {
+                        for (i in 0 until childPosition.size) {
+                            Container(
+                                width = sizeDp,
+                                height = sizeDp,
+                                modifier =
+                                    Modifier.onGloballyPositioned { coordinates ->
+                                        childLayoutCoordinates[i] = coordinates
+                                        drawLatch.countDown()
+                                    }
+                            ) {}
                         }
                     }
                 }
             }
+            assertTrue(drawLatch.await(1, TimeUnit.SECONDS))
+
+            calculateChildPositions(childPosition, parentLayoutCoordinates, childLayoutCoordinates)
+
+            val root = findComposeView()
+            waitForDraw(root)
+
+            val gap = (root.height - size.toFloat() * 3f) / 2f
+            assertEquals(Offset(0f, 0f), childPosition[0])
+            assertEquals(
+                Offset(0f, (gap + size.toFloat()).roundToInt().toFloat()),
+                childPosition[1]
+            )
+            assertEquals(
+                Offset(0f, (gap * 2 + size.toFloat() * 2).roundToInt().toFloat()),
+                childPosition[2]
+            )
         }
-        assertTrue(drawLatch.await(1, TimeUnit.SECONDS))
-
-        calculateChildPositions(childPosition, parentLayoutCoordinates, childLayoutCoordinates)
-
-        val root = findComposeView()
-        waitForDraw(root)
-
-        val gap = (root.height - size.toFloat() * 3f) / 2f
-        assertEquals(Offset(0f, 0f), childPosition[0])
-        assertEquals(
-            Offset(0f, (gap + size.toFloat()).roundToInt().toFloat()),
-            childPosition[1]
-        )
-        assertEquals(
-            Offset(0f, (gap * 2 + size.toFloat() * 2).roundToInt().toFloat()),
-            childPosition[2]
-        )
-    }
 
     @Test
-    fun testColumn_withSpaceAroundArrangement() = with(density) {
-        val sizeDp = 50.toDp()
-        val size = sizeDp.roundToPx()
+    fun testColumn_withSpaceAroundArrangement() =
+        with(density) {
+            val sizeDp = 50.toDp()
+            val size = sizeDp.roundToPx()
 
-        val drawLatch = CountDownLatch(4)
-        val childPosition = arrayOf(
-            Offset(-1f, -1f), Offset(-1f, -1f), Offset(-1f, -1f)
-        )
-        val childLayoutCoordinates = arrayOfNulls<LayoutCoordinates?>(childPosition.size)
-        var parentLayoutCoordinates: LayoutCoordinates? = null
-        show {
-            Center {
-                Column(
-                    Modifier.fillMaxHeight().onGloballyPositioned { coordinates ->
-                        parentLayoutCoordinates = coordinates
-                        drawLatch.countDown()
-                    },
-                    verticalArrangement = Arrangement.SpaceAround
-                ) {
-                    for (i in 0 until childPosition.size) {
-                        Container(
-                            width = sizeDp,
-                            height = sizeDp,
-                            modifier = Modifier.onGloballyPositioned { coordinates ->
-                                childLayoutCoordinates[i] = coordinates
-                                drawLatch.countDown()
-                            }
-                        ) {
+            val drawLatch = CountDownLatch(4)
+            val childPosition = arrayOf(Offset(-1f, -1f), Offset(-1f, -1f), Offset(-1f, -1f))
+            val childLayoutCoordinates = arrayOfNulls<LayoutCoordinates?>(childPosition.size)
+            var parentLayoutCoordinates: LayoutCoordinates? = null
+            show {
+                Center {
+                    Column(
+                        Modifier.fillMaxHeight().onGloballyPositioned { coordinates ->
+                            parentLayoutCoordinates = coordinates
+                            drawLatch.countDown()
+                        },
+                        verticalArrangement = Arrangement.SpaceAround
+                    ) {
+                        for (i in 0 until childPosition.size) {
+                            Container(
+                                width = sizeDp,
+                                height = sizeDp,
+                                modifier =
+                                    Modifier.onGloballyPositioned { coordinates ->
+                                        childLayoutCoordinates[i] = coordinates
+                                        drawLatch.countDown()
+                                    }
+                            ) {}
                         }
                     }
                 }
             }
+            assertTrue(drawLatch.await(1, TimeUnit.SECONDS))
+
+            calculateChildPositions(childPosition, parentLayoutCoordinates, childLayoutCoordinates)
+
+            val root = findComposeView()
+            waitForDraw(root)
+
+            val gap = (root.height - size.toFloat() * 3f) / 3f
+            assertEquals(Offset(0f, (gap / 2f).roundToInt().toFloat()), childPosition[0])
+            assertEquals(
+                Offset(0f, ((gap * 3f / 2f) + size.toFloat()).roundToInt().toFloat()),
+                childPosition[1]
+            )
+            assertEquals(
+                Offset(0f, ((gap * 5f / 2f) + size.toFloat() * 2f).roundToInt().toFloat()),
+                childPosition[2]
+            )
         }
-        assertTrue(drawLatch.await(1, TimeUnit.SECONDS))
-
-        calculateChildPositions(childPosition, parentLayoutCoordinates, childLayoutCoordinates)
-
-        val root = findComposeView()
-        waitForDraw(root)
-
-        val gap = (root.height - size.toFloat() * 3f) / 3f
-        assertEquals(Offset(0f, (gap / 2f).roundToInt().toFloat()), childPosition[0])
-        assertEquals(
-            Offset(0f, ((gap * 3f / 2f) + size.toFloat()).roundToInt().toFloat()),
-            childPosition[1]
-        )
-        assertEquals(
-            Offset(0f, ((gap * 5f / 2f) + size.toFloat() * 2f).roundToInt().toFloat()),
-            childPosition[2]
-        )
-    }
 
     @Test
-    fun testColumn_withSpacedByArrangement() = with(density) {
-        val spacePx = 10f
-        val space = spacePx.toDp()
-        val sizePx = 20f
-        val size = sizePx.toDp()
-        val latch = CountDownLatch(3)
-        show {
-            Row {
-                Column(
-                    verticalArrangement = Arrangement.spacedBy(space),
-                    modifier = Modifier.onGloballyPositioned {
-                        assertEquals((sizePx * 2 + spacePx).roundToInt(), it.size.height)
-                        latch.countDown()
-                    }
-                ) {
-                    Box(
-                        Modifier.requiredSize(size).onGloballyPositioned {
-                            assertEquals(0f, it.positionInParent().x)
-                            latch.countDown()
-                        }
-                    )
-                    Box(
-                        Modifier.requiredSize(size).onGloballyPositioned {
-                            assertEquals(sizePx + spacePx, it.positionInParent().y)
-                            latch.countDown()
-                        }
-                    )
-                }
-            }
-        }
-        assertTrue(latch.await(1, TimeUnit.SECONDS))
-    }
-
-    @Test
-    fun testColumn_withSpacedByAlignedArrangement() = with(density) {
-        val spacePx = 10f
-        val space = spacePx.toDp()
-        val sizePx = 20f
-        val size = sizePx.toDp()
-        val columnSizePx = 50
-        val columnSize = columnSizePx.toDp()
-        val latch = CountDownLatch(3)
-        show {
-            Row {
-                Column(
-                    verticalArrangement = Arrangement.spacedBy(space, Alignment.Bottom),
-                    modifier = Modifier.requiredSize(columnSize).onGloballyPositioned {
-                        assertEquals(columnSizePx, it.size.height)
-                        latch.countDown()
-                    }
-                ) {
-                    Box(
-                        Modifier.requiredSize(size).onGloballyPositioned {
-                            assertEquals(
-                                columnSizePx - spacePx - sizePx * 2, it.positionInParent().y
-                            )
-                            latch.countDown()
-                        }
-                    )
-                    Box(
-                        Modifier.requiredSize(size).onGloballyPositioned {
-                            assertEquals(columnSizePx - sizePx, it.positionInParent().y)
-                            latch.countDown()
-                        }
-                    )
-                }
-            }
-        }
-        assertTrue(latch.await(1, TimeUnit.SECONDS))
-    }
-
-    @Test
-    fun testColumn_withSpacedByArrangement_insufficientSpace() = with(density) {
-        val spacePx = 15f
-        val space = spacePx.toDp()
-        val sizePx = 20f
-        val size = sizePx.toDp()
-        val columnSizePx = 50f
-        val columnSize = columnSizePx.toDp()
-        val latch = CountDownLatch(4)
-        show {
-            Row {
-                Column(
-                    verticalArrangement = Arrangement.spacedBy(space),
-                    modifier = Modifier.requiredSize(columnSize).onGloballyPositioned {
-                        assertEquals(columnSizePx.roundToInt(), it.size.height)
-                        latch.countDown()
-                    }
-                ) {
-                    Box(
-                        Modifier.size(size).onGloballyPositioned {
-                            assertEquals(0f, it.positionInParent().y)
-                            assertEquals(sizePx.roundToInt(), it.size.height)
-                            latch.countDown()
-                        }
-                    )
-                    Box(
-                        Modifier.size(size).onGloballyPositioned {
-                            assertEquals(sizePx + spacePx, it.positionInParent().y)
-                            assertEquals(
-                                (columnSizePx - spacePx - sizePx).roundToInt(), it.size.height
-                            )
-                            latch.countDown()
-                        }
-                    )
-                    Box(
-                        Modifier.size(size).onGloballyPositioned {
-                            assertEquals(columnSizePx, it.positionInParent().y)
-                            assertEquals(0, it.size.height)
-                            latch.countDown()
-                        }
-                    )
-                }
-            }
-        }
-        assertTrue(latch.await(1, TimeUnit.SECONDS))
-    }
-
-    @Test
-    fun testColumn_withAlignedArrangement() = with(density) {
-        val sizePx = 20f
-        val size = sizePx.toDp()
-        val columnSizePx = 50
-        val columnSize = columnSizePx.toDp()
-        val latch = CountDownLatch(3)
-        show {
-            Row {
-                Column(
-                    verticalArrangement = Arrangement.aligned(Alignment.Bottom),
-                    modifier = Modifier.requiredSize(columnSize).onGloballyPositioned {
-                        assertEquals(columnSizePx, it.size.height)
-                        latch.countDown()
-                    }
-                ) {
-                    Box(
-                        Modifier.requiredSize(size).onGloballyPositioned {
-                            assertEquals(columnSizePx - sizePx * 2, it.positionInParent().y)
-                            latch.countDown()
-                        }
-                    )
-                    Box(
-                        Modifier.requiredSize(size).onGloballyPositioned {
-                            assertEquals(columnSizePx - sizePx, it.positionInParent().y)
-                            latch.countDown()
-                        }
-                    )
-                }
-            }
-        }
-        assertTrue(latch.await(1, TimeUnit.SECONDS))
-    }
-
-    @Test
-    fun testRow_doesNotUseMinConstraintsOnChildren() = with(density) {
-        val sizeDp = 50.toDp()
-        val childSizeDp = 30.toDp()
-        val childSize = childSizeDp.roundToPx()
-
-        val layoutLatch = CountDownLatch(1)
-        val containerSize = Ref<IntSize>()
-        show {
-            Center {
-                ConstrainedBox(
-                    constraints = DpConstraints.fixed(sizeDp, sizeDp)
-                ) {
-                    Row {
-                        Spacer(
-                            Modifier.size(width = childSizeDp, height = childSizeDp)
-                                .onGloballyPositioned { coordinates ->
-                                    containerSize.value = coordinates.size
-                                    layoutLatch.countDown()
-                                }
-                        )
-                    }
-                }
-            }
-        }
-        assertTrue(layoutLatch.await(1, TimeUnit.SECONDS))
-
-        assertEquals(IntSize(childSize, childSize), containerSize.value)
-    }
-
-    @Test
-    fun testColumn_doesNotUseMinConstraintsOnChildren() = with(density) {
-        val sizeDp = 50.toDp()
-        val childSizeDp = 30.toDp()
-        val childSize = childSizeDp.roundToPx()
-
-        val layoutLatch = CountDownLatch(1)
-        val containerSize = Ref<IntSize>()
-        show {
-            Center {
-                ConstrainedBox(
-                    constraints = DpConstraints.fixed(sizeDp, sizeDp)
-                ) {
-                    Column {
-                        Spacer(
-                            Modifier.size(width = childSizeDp, height = childSizeDp).then(
-                                Modifier.onGloballyPositioned { coordinates ->
-                                    containerSize.value = coordinates.size
-                                    layoutLatch.countDown()
-                                }
-                            )
-                        )
-                    }
-                }
-            }
-        }
-        assertTrue(layoutLatch.await(1, TimeUnit.SECONDS))
-
-        assertEquals(IntSize(childSize, childSize), containerSize.value)
-    }
-
-    @Test
-    fun testColumn_withSpacedByArrangement_rtl() = with(density) {
-        val spacePx = 10f
-        val space = spacePx.toDp()
-        val sizePx = 20f
-        val size = sizePx.toDp()
-        val latch = CountDownLatch(2)
-        show {
-            DeviceConfigurationOverride(
-                DeviceConfigurationOverride.LayoutDirection(LayoutDirection.Rtl)
-            ) {
-                // Nothing should change compared to the same ltr test. (just the size of the
-                // Column as we are doing fillMaxHeight()).
+    fun testColumn_withSpacedByArrangement() =
+        with(density) {
+            val spacePx = 10f
+            val space = spacePx.toDp()
+            val sizePx = 20f
+            val size = sizePx.toDp()
+            val latch = CountDownLatch(3)
+            show {
                 Row {
                     Column(
                         verticalArrangement = Arrangement.spacedBy(space),
-                        modifier = Modifier.fillMaxHeight()
+                        modifier =
+                            Modifier.onGloballyPositioned {
+                                assertEquals((sizePx * 2 + spacePx).roundToInt(), it.size.height)
+                                latch.countDown()
+                            }
                     ) {
                         Box(
                             Modifier.requiredSize(size).onGloballyPositioned {
@@ -3726,927 +3321,1085 @@
                     }
                 }
             }
+            assertTrue(latch.await(1, TimeUnit.SECONDS))
         }
-        assertTrue(latch.await(1, TimeUnit.SECONDS))
-    }
+
+    @Test
+    fun testColumn_withSpacedByAlignedArrangement() =
+        with(density) {
+            val spacePx = 10f
+            val space = spacePx.toDp()
+            val sizePx = 20f
+            val size = sizePx.toDp()
+            val columnSizePx = 50
+            val columnSize = columnSizePx.toDp()
+            val latch = CountDownLatch(3)
+            show {
+                Row {
+                    Column(
+                        verticalArrangement = Arrangement.spacedBy(space, Alignment.Bottom),
+                        modifier =
+                            Modifier.requiredSize(columnSize).onGloballyPositioned {
+                                assertEquals(columnSizePx, it.size.height)
+                                latch.countDown()
+                            }
+                    ) {
+                        Box(
+                            Modifier.requiredSize(size).onGloballyPositioned {
+                                assertEquals(
+                                    columnSizePx - spacePx - sizePx * 2,
+                                    it.positionInParent().y
+                                )
+                                latch.countDown()
+                            }
+                        )
+                        Box(
+                            Modifier.requiredSize(size).onGloballyPositioned {
+                                assertEquals(columnSizePx - sizePx, it.positionInParent().y)
+                                latch.countDown()
+                            }
+                        )
+                    }
+                }
+            }
+            assertTrue(latch.await(1, TimeUnit.SECONDS))
+        }
+
+    @Test
+    fun testColumn_withSpacedByArrangement_insufficientSpace() =
+        with(density) {
+            val spacePx = 15f
+            val space = spacePx.toDp()
+            val sizePx = 20f
+            val size = sizePx.toDp()
+            val columnSizePx = 50f
+            val columnSize = columnSizePx.toDp()
+            val latch = CountDownLatch(4)
+            show {
+                Row {
+                    Column(
+                        verticalArrangement = Arrangement.spacedBy(space),
+                        modifier =
+                            Modifier.requiredSize(columnSize).onGloballyPositioned {
+                                assertEquals(columnSizePx.roundToInt(), it.size.height)
+                                latch.countDown()
+                            }
+                    ) {
+                        Box(
+                            Modifier.size(size).onGloballyPositioned {
+                                assertEquals(0f, it.positionInParent().y)
+                                assertEquals(sizePx.roundToInt(), it.size.height)
+                                latch.countDown()
+                            }
+                        )
+                        Box(
+                            Modifier.size(size).onGloballyPositioned {
+                                assertEquals(sizePx + spacePx, it.positionInParent().y)
+                                assertEquals(
+                                    (columnSizePx - spacePx - sizePx).roundToInt(),
+                                    it.size.height
+                                )
+                                latch.countDown()
+                            }
+                        )
+                        Box(
+                            Modifier.size(size).onGloballyPositioned {
+                                assertEquals(columnSizePx, it.positionInParent().y)
+                                assertEquals(0, it.size.height)
+                                latch.countDown()
+                            }
+                        )
+                    }
+                }
+            }
+            assertTrue(latch.await(1, TimeUnit.SECONDS))
+        }
+
+    @Test
+    fun testColumn_withAlignedArrangement() =
+        with(density) {
+            val sizePx = 20f
+            val size = sizePx.toDp()
+            val columnSizePx = 50
+            val columnSize = columnSizePx.toDp()
+            val latch = CountDownLatch(3)
+            show {
+                Row {
+                    Column(
+                        verticalArrangement = Arrangement.aligned(Alignment.Bottom),
+                        modifier =
+                            Modifier.requiredSize(columnSize).onGloballyPositioned {
+                                assertEquals(columnSizePx, it.size.height)
+                                latch.countDown()
+                            }
+                    ) {
+                        Box(
+                            Modifier.requiredSize(size).onGloballyPositioned {
+                                assertEquals(columnSizePx - sizePx * 2, it.positionInParent().y)
+                                latch.countDown()
+                            }
+                        )
+                        Box(
+                            Modifier.requiredSize(size).onGloballyPositioned {
+                                assertEquals(columnSizePx - sizePx, it.positionInParent().y)
+                                latch.countDown()
+                            }
+                        )
+                    }
+                }
+            }
+            assertTrue(latch.await(1, TimeUnit.SECONDS))
+        }
+
+    @Test
+    fun testRow_doesNotUseMinConstraintsOnChildren() =
+        with(density) {
+            val sizeDp = 50.toDp()
+            val childSizeDp = 30.toDp()
+            val childSize = childSizeDp.roundToPx()
+
+            val layoutLatch = CountDownLatch(1)
+            val containerSize = Ref<IntSize>()
+            show {
+                Center {
+                    ConstrainedBox(constraints = DpConstraints.fixed(sizeDp, sizeDp)) {
+                        Row {
+                            Spacer(
+                                Modifier.size(width = childSizeDp, height = childSizeDp)
+                                    .onGloballyPositioned { coordinates ->
+                                        containerSize.value = coordinates.size
+                                        layoutLatch.countDown()
+                                    }
+                            )
+                        }
+                    }
+                }
+            }
+            assertTrue(layoutLatch.await(1, TimeUnit.SECONDS))
+
+            assertEquals(IntSize(childSize, childSize), containerSize.value)
+        }
+
+    @Test
+    fun testColumn_doesNotUseMinConstraintsOnChildren() =
+        with(density) {
+            val sizeDp = 50.toDp()
+            val childSizeDp = 30.toDp()
+            val childSize = childSizeDp.roundToPx()
+
+            val layoutLatch = CountDownLatch(1)
+            val containerSize = Ref<IntSize>()
+            show {
+                Center {
+                    ConstrainedBox(constraints = DpConstraints.fixed(sizeDp, sizeDp)) {
+                        Column {
+                            Spacer(
+                                Modifier.size(width = childSizeDp, height = childSizeDp)
+                                    .then(
+                                        Modifier.onGloballyPositioned { coordinates ->
+                                            containerSize.value = coordinates.size
+                                            layoutLatch.countDown()
+                                        }
+                                    )
+                            )
+                        }
+                    }
+                }
+            }
+            assertTrue(layoutLatch.await(1, TimeUnit.SECONDS))
+
+            assertEquals(IntSize(childSize, childSize), containerSize.value)
+        }
+
+    @Test
+    fun testColumn_withSpacedByArrangement_rtl() =
+        with(density) {
+            val spacePx = 10f
+            val space = spacePx.toDp()
+            val sizePx = 20f
+            val size = sizePx.toDp()
+            val latch = CountDownLatch(2)
+            show {
+                DeviceConfigurationOverride(
+                    DeviceConfigurationOverride.LayoutDirection(LayoutDirection.Rtl)
+                ) {
+                    // Nothing should change compared to the same ltr test. (just the size of the
+                    // Column as we are doing fillMaxHeight()).
+                    Row {
+                        Column(
+                            verticalArrangement = Arrangement.spacedBy(space),
+                            modifier = Modifier.fillMaxHeight()
+                        ) {
+                            Box(
+                                Modifier.requiredSize(size).onGloballyPositioned {
+                                    assertEquals(0f, it.positionInParent().x)
+                                    latch.countDown()
+                                }
+                            )
+                            Box(
+                                Modifier.requiredSize(size).onGloballyPositioned {
+                                    assertEquals(sizePx + spacePx, it.positionInParent().y)
+                                    latch.countDown()
+                                }
+                            )
+                        }
+                    }
+                }
+            }
+            assertTrue(latch.await(1, TimeUnit.SECONDS))
+        }
+
     // endregion
 
     // region Intrinsic measurement tests
     @Test
-    fun testRow_withNoWeightChildren_hasCorrectIntrinsicMeasurements() = with(density) {
-        testIntrinsics(
-            @Composable {
-                Row {
-                    Container(Modifier.aspectRatio(2f), content = {})
-                    ConstrainedBox(
-                        DpConstraints.fixed(50.toDp(), 40.toDp()),
-                        content = {}
-                    )
-                }
-            },
-            @Composable {
-                Row(Modifier.fillMaxWidth()) {
-                    Container(Modifier.aspectRatio(2f), content = {})
-                    ConstrainedBox(
-                        DpConstraints.fixed(50.toDp(), 40.toDp()),
-                        content = {}
-                    )
-                }
-            },
-            @Composable {
-                Row {
-                    Container(
-                        Modifier.aspectRatio(2f)
-                            .align(Alignment.Top),
-                        content = {}
-                    )
-                    ConstrainedBox(
-                        DpConstraints.fixed(50.toDp(), 40.toDp()),
-                        Modifier.align(Alignment.CenterVertically),
-                        content = {}
-                    )
-                }
-            },
-            @Composable {
-                Row {
-                    Container(
-                        Modifier.aspectRatio(2f).alignBy(FirstBaseline),
-                        content = {}
-                    )
-                    ConstrainedBox(
-                        DpConstraints.fixed(50.toDp(), 40.toDp()),
-                        Modifier.alignBy { it.measuredWidth },
-                        content = {}
-                    )
-                }
-            },
-            @Composable {
-                Row(Modifier.fillMaxWidth(), horizontalArrangement = Arrangement.Start) {
-                    Container(Modifier.aspectRatio(2f), content = {})
-                    ConstrainedBox(
-                        DpConstraints.fixed(50.toDp(), 40.toDp()),
-                        content = {}
-                    )
-                }
-            },
-            @Composable {
-                Row(Modifier.fillMaxWidth(), horizontalArrangement = Arrangement.Center) {
-                    Container(
-                        Modifier.align(Alignment.CenterVertically).aspectRatio(2f),
-                        content = {}
-                    )
-                    ConstrainedBox(
-                        DpConstraints.fixed(50.toDp(), 40.toDp()),
-                        Modifier.align(Alignment.CenterVertically),
-                        content = {}
-                    )
-                }
-            },
-            @Composable {
-                Row(Modifier.fillMaxWidth(), horizontalArrangement = Arrangement.End) {
-                    Container(
-                        Modifier.align(Alignment.Bottom).aspectRatio(2f),
-                        content = {}
-                    )
-                    ConstrainedBox(
-                        DpConstraints.fixed(50.toDp(), 40.toDp()),
-                        Modifier.align(Alignment.Bottom),
-                        content = {}
-                    )
-                }
-            },
-            @Composable {
-                Row(Modifier.fillMaxWidth(), horizontalArrangement = Arrangement.SpaceAround) {
-                    Container(Modifier.fillMaxHeight().aspectRatio(2f), content = {})
-                    ConstrainedBox(
-                        DpConstraints.fixed(50.toDp(), 40.toDp()),
-                        Modifier.fillMaxHeight(),
-                        content = {}
-                    )
-                }
-            },
-            @Composable {
-                Row(Modifier.fillMaxWidth(), horizontalArrangement = Arrangement.SpaceBetween) {
-                    Container(Modifier.aspectRatio(2f), content = {})
-                    ConstrainedBox(
-                        DpConstraints.fixed(50.toDp(), 40.toDp()),
-                        content = {}
-                    )
-                }
-            },
-            @Composable {
-                Row(Modifier.fillMaxWidth(), horizontalArrangement = Arrangement.SpaceEvenly) {
-                    Container(Modifier.aspectRatio(2f), content = {})
-                    ConstrainedBox(
-                        DpConstraints.fixed(50.toDp(), 40.toDp()),
-                        content = {}
-                    )
-                }
-            }
-        ) { minIntrinsicWidth, minIntrinsicHeight, maxIntrinsicWidth, maxIntrinsicHeight ->
-            // Min width.
-            assertEquals(50.toDp().roundToPx(), minIntrinsicWidth(0.toDp().roundToPx()))
-            assertEquals(
-                25.toDp().roundToPx() * 2 + 50.toDp().roundToPx(),
-                minIntrinsicWidth(25.toDp().roundToPx())
-            )
-            assertEquals(50.toDp().roundToPx(), minIntrinsicWidth(Constraints.Infinity))
-            // Min height.
-            assertEquals(40.toDp().roundToPx(), minIntrinsicHeight(0.toDp().roundToPx()))
-            assertEquals(40.toDp().roundToPx(), minIntrinsicHeight(70.toDp().roundToPx()))
-            assertEquals(40.toDp().roundToPx(), minIntrinsicHeight(Constraints.Infinity))
-            // Max width.
-            assertEquals(50.toDp().roundToPx(), maxIntrinsicWidth(0.toDp().roundToPx()))
-            assertEquals(
-                25.toDp().roundToPx() * 2 + 50.toDp().roundToPx(),
-                maxIntrinsicWidth(25.toDp().roundToPx())
-            )
-            assertEquals(50.toDp().roundToPx(), maxIntrinsicWidth(Constraints.Infinity))
-            // Max height.
-            assertEquals(40.toDp().roundToPx(), maxIntrinsicHeight(0.toDp().roundToPx()))
-            assertEquals(40.toDp().roundToPx(), maxIntrinsicHeight(70.toDp().roundToPx()))
-            assertEquals(40.toDp().roundToPx(), maxIntrinsicHeight(Constraints.Infinity))
-        }
-    }
-
-    @Test
-    fun testRow_withNoItems_hasCorrectIntrinsicMeasurements() = with(density) {
-        testIntrinsics(
-            @Composable {
-                Row(
-                    Modifier.width(IntrinsicSize.Max).height(IntrinsicSize.Max),
-                    horizontalArrangement = Arrangement.spacedBy(
-                        48.dp
-                    ),
-                ) { }
-            },
-            @Composable {
-                Row(
-                    Modifier.width(IntrinsicSize.Min).height(IntrinsicSize.Min),
-                    horizontalArrangement = Arrangement.spacedBy(
-                        48.dp
-                    ),
-                ) { }
-            },
-            @Composable {
-                Column(
-                    Modifier.width(IntrinsicSize.Max).height(IntrinsicSize.Max),
-                    verticalArrangement = Arrangement.spacedBy(
-                        48.dp
-                    ),
-                ) { }
-            },
-            @Composable {
-                Column(
-                    Modifier.width(IntrinsicSize.Min).height(IntrinsicSize.Min),
-                    verticalArrangement = Arrangement.spacedBy(
-                        48.dp
-                    ),
-                ) { }
-            },
-        ) { minIntrinsicWidth, minIntrinsicHeight, maxIntrinsicWidth, maxIntrinsicHeight ->
-            // Min width.
-            assertEquals(0.toDp().roundToPx(), minIntrinsicWidth(0.toDp().roundToPx()))
-            // Min height.
-            assertEquals(0.toDp().roundToPx(), minIntrinsicHeight(0.toDp().roundToPx()))
-            // Max width.
-            assertEquals(0.toDp().roundToPx(), maxIntrinsicWidth(0.toDp().roundToPx()))
-            // Max height.
-            assertEquals(0.toDp().roundToPx(), maxIntrinsicHeight(0.toDp().roundToPx()))
-        }
-    }
-
-    @Test
-    fun testRow_withWeightChildren_hasCorrectIntrinsicMeasurements() = with(density) {
-        testIntrinsics(
-            @Composable {
-                Row {
-                    ConstrainedBox(
-                        DpConstraints.fixed(20.toDp(), 30.toDp()),
-                        Modifier.weight(3f),
-                        content = {}
-                    )
-                    ConstrainedBox(
-                        DpConstraints.fixed(30.toDp(), 40.toDp()),
-                        Modifier.weight(2f),
-                        content = {}
-                    )
-                    Container(Modifier.aspectRatio(2f).weight(2f), content = {})
-                    ConstrainedBox(
-                        DpConstraints.fixed(20.toDp(), 30.toDp()),
-                        content = {}
-                    )
-                }
-            },
-            @Composable {
-                Row {
-                    ConstrainedBox(
-                        DpConstraints.fixed(20.toDp(), 30.toDp()),
-                        Modifier.weight(3f).align(Alignment.Top),
-                        content = {}
-                    )
-                    ConstrainedBox(
-                        DpConstraints.fixed(30.toDp(), 40.toDp()),
-                        Modifier.weight(2f).align(Alignment.CenterVertically),
-                        content = {}
-                    )
-                    Container(Modifier.aspectRatio(2f).weight(2f), content = {})
-                    ConstrainedBox(
-                        DpConstraints.fixed(20.toDp(), 30.toDp()),
-                        Modifier.align(Alignment.Bottom),
-                        content = {}
-                    )
-                }
-            },
-            @Composable {
-                Row(horizontalArrangement = Arrangement.Start) {
-                    ConstrainedBox(
-                        DpConstraints.fixed(20.toDp(), 30.toDp()),
-                        Modifier.weight(3f),
-                        content = {}
-                    )
-                    ConstrainedBox(
-                        DpConstraints.fixed(30.toDp(), 40.toDp()),
-                        Modifier.weight(2f),
-                        content = {}
-                    )
-                    Container(Modifier.aspectRatio(2f).weight(2f), content = {})
-                    ConstrainedBox(
-                        DpConstraints.fixed(20.toDp(), 30.toDp()),
-                        content = {}
-                    )
-                }
-            },
-            @Composable {
-                Row(horizontalArrangement = Arrangement.Center) {
-                    ConstrainedBox(
-                        constraints = DpConstraints.fixed(20.toDp(), 30.toDp()),
-                        modifier = Modifier.weight(3f).align(Alignment.CenterVertically),
-                        content = {}
-                    )
-                    ConstrainedBox(
-                        constraints = DpConstraints.fixed(30.toDp(), 40.toDp()),
-                        modifier = Modifier.weight(2f).align(Alignment.CenterVertically),
-                        content = {}
-                    )
-                    Container(
-                        Modifier.aspectRatio(2f).weight(2f).align(Alignment.CenterVertically),
-                        content = {}
-                    )
-                    ConstrainedBox(
-                        constraints = DpConstraints.fixed(20.toDp(), 30.toDp()),
-                        modifier = Modifier.align(Alignment.CenterVertically),
-                        content = {}
-                    )
-                }
-            },
-            @Composable {
-                Row(horizontalArrangement = Arrangement.End) {
-                    ConstrainedBox(
-                        constraints = DpConstraints.fixed(20.toDp(), 30.toDp()),
-                        modifier = Modifier.weight(3f).align(Alignment.Bottom),
-                        content = {}
-                    )
-                    ConstrainedBox(
-                        constraints = DpConstraints.fixed(30.toDp(), 40.toDp()),
-                        modifier = Modifier.weight(2f).align(Alignment.Bottom),
-                        content = {}
-                    )
-                    Container(
-                        Modifier.aspectRatio(2f).weight(2f).align(Alignment.Bottom),
-                        content = {}
-                    )
-                    ConstrainedBox(
-                        constraints = DpConstraints.fixed(20.toDp(), 30.toDp()),
-                        modifier = Modifier.align(Alignment.Bottom),
-                        content = {}
-                    )
-                }
-            },
-            @Composable {
-                Row(horizontalArrangement = Arrangement.SpaceAround) {
-                    ConstrainedBox(
-                        constraints = DpConstraints.fixed(20.toDp(), 30.toDp()),
-                        modifier = Modifier.weight(3f).fillMaxHeight(),
-                        content = {}
-                    )
-                    ConstrainedBox(
-                        constraints = DpConstraints.fixed(30.toDp(), 40.toDp()),
-                        modifier = Modifier.weight(2f).fillMaxHeight(),
-                        content = {}
-                    )
-                    Container(
-                        Modifier.aspectRatio(2f).weight(2f).fillMaxHeight(),
-                        content = {}
-                    )
-                    ConstrainedBox(
-                        constraints = DpConstraints.fixed(20.toDp(), 30.toDp()),
-                        modifier = Modifier.fillMaxHeight(),
-                        content = {}
-                    )
-                }
-            },
-            @Composable {
-                Row(horizontalArrangement = Arrangement.SpaceBetween) {
-                    ConstrainedBox(
-                        DpConstraints.fixed(20.toDp(), 30.toDp()),
-                        Modifier.weight(3f),
-                        content = {}
-                    )
-                    ConstrainedBox(
-                        DpConstraints.fixed(30.toDp(), 40.toDp()),
-                        Modifier.weight(2f),
-                        content = {}
-                    )
-                    Container(Modifier.aspectRatio(2f).weight(2f), content = {})
-                    ConstrainedBox(
-                        DpConstraints.fixed(20.toDp(), 30.toDp()),
-                        content = {}
-                    )
-                }
-            },
-            @Composable {
-                Row(horizontalArrangement = Arrangement.SpaceEvenly) {
-                    ConstrainedBox(
-                        DpConstraints.fixed(20.toDp(), 30.toDp()),
-                        Modifier.weight(3f),
-                        content = {}
-                    )
-                    ConstrainedBox(
-                        DpConstraints.fixed(30.toDp(), 40.toDp()),
-                        Modifier.weight(2f),
-                        content = {}
-                    )
-                    Container(Modifier.aspectRatio(2f).weight(2f), content = {})
-                    ConstrainedBox(
-                        DpConstraints.fixed(20.toDp(), 30.toDp()),
-                        content = {}
-                    )
-                }
-            }
-        ) { minIntrinsicWidth, minIntrinsicHeight, maxIntrinsicWidth, maxIntrinsicHeight ->
-            // Min width.
-            assertEquals(
-                30.toDp().roundToPx() / 2 * 7 + 20.toDp().roundToPx(),
-                minIntrinsicWidth(0)
-            )
-            assertEquals(
-                30.toDp().roundToPx() / 2 * 7 + 20.toDp().roundToPx(),
-                minIntrinsicWidth(10.toDp().roundToPx())
-            )
-            assertEquals(
-                25.toDp().roundToPx() * 2 / 2 * 7 + 20.toDp().roundToPx(),
-                minIntrinsicWidth(25.toDp().roundToPx())
-            )
-            assertEquals(
-                30.toDp().roundToPx() / 2 * 7 + 20.toDp().roundToPx(),
-                minIntrinsicWidth(Constraints.Infinity)
-            )
-            // Min height.
-            assertEquals(40.toDp().roundToPx(), minIntrinsicHeight(0.toDp().roundToPx()))
-            assertEquals(40.toDp().roundToPx(), minIntrinsicHeight(125.toDp().roundToPx()))
-            assertEquals(50.toDp().roundToPx(), minIntrinsicHeight(370.toDp().roundToPx()))
-            assertEquals(40.toDp().roundToPx(), minIntrinsicHeight(Constraints.Infinity))
-            // Max width.
-            assertEquals(
-                30.toDp().roundToPx() / 2 * 7 + 20.toDp().roundToPx(),
-                maxIntrinsicWidth(0)
-            )
-            assertEquals(
-                30.toDp().roundToPx() / 2 * 7 + 20.toDp().roundToPx(),
-                maxIntrinsicWidth(10.toDp().roundToPx())
-            )
-            assertEquals(
-                25.toDp().roundToPx() * 2 / 2 * 7 + 20.toDp().roundToPx(),
-                maxIntrinsicWidth(25.toDp().roundToPx())
-            )
-            assertEquals(
-                30.toDp().roundToPx() / 2 * 7 + 20.toDp().roundToPx(),
-                maxIntrinsicWidth(Constraints.Infinity)
-            )
-            // Max height.
-            assertEquals(40.toDp().roundToPx(), maxIntrinsicHeight(0.toDp().roundToPx()))
-            assertEquals(40.toDp().roundToPx(), maxIntrinsicHeight(125.toDp().roundToPx()))
-            assertEquals(50.toDp().roundToPx(), maxIntrinsicHeight(370.toDp().roundToPx()))
-            assertEquals(40.toDp().roundToPx(), maxIntrinsicHeight(Constraints.Infinity))
-        }
-    }
-
-    @Test
-    fun testRow_withArrangementSpacing() = with(density) {
-        val spacing = 5
-        val childSize = 10
-        testIntrinsics(
-            @Composable {
-                Row(horizontalArrangement = Arrangement.spacedBy(spacing.toDp())) {
-                    Box(Modifier.size(childSize.toDp()))
-                    Box(Modifier.size(childSize.toDp()))
-                    Box(Modifier.size(childSize.toDp()))
-                }
-            }
-        ) { minIntrinsicWidth, _, maxIntrinsicWidth, _ ->
-            assertEquals(childSize * 3 + 2 * spacing, minIntrinsicWidth(Constraints.Infinity))
-            assertEquals(childSize * 3 + 2 * spacing, maxIntrinsicWidth(Constraints.Infinity))
-        }
-    }
-
-    @Test
-    fun testRow_withArrangementSpacing_height() = with(density) {
-        val spacing = 5
-        val rowWidth = 15
-        val latch = CountDownLatch(1)
-        var rowHeight = 0
-        show {
-            Row(
-                modifier = Modifier.width(rowWidth.toDp()).height(IntrinsicSize.Min).onSizeChanged {
-                    rowHeight = it.height
-                    latch.countDown()
+    fun testRow_withNoWeightChildren_hasCorrectIntrinsicMeasurements() =
+        with(density) {
+            testIntrinsics(
+                @Composable {
+                    Row {
+                        Container(Modifier.aspectRatio(2f), content = {})
+                        ConstrainedBox(DpConstraints.fixed(50.toDp(), 40.toDp()), content = {})
+                    }
                 },
-                horizontalArrangement = Arrangement.spacedBy(spacing.toDp())
-            ) {
-                Box(Modifier) // Empty box
-                Box(Modifier.width(rowWidth.toDp()).aspectRatio(1f))
-            }
-        }
-        assertTrue(latch.await(1, TimeUnit.SECONDS))
-        assertEquals(rowWidth - spacing, rowHeight)
-    }
-
-    @Test
-    fun testColumn_withNoWeightChildren_hasCorrectIntrinsicMeasurements() = with(density) {
-        testIntrinsics(
-            @Composable {
-                Column {
-                    Container(Modifier.aspectRatio(2f), content = {})
-                    ConstrainedBox(
-                        DpConstraints.fixed(50.toDp(), 40.toDp()),
-                        content = {}
-                    )
-                }
-            },
-            @Composable {
-                Column {
-                    Container(
-                        Modifier.aspectRatio(2f).align(Alignment.Start),
-                        content = {}
-                    )
-                    ConstrainedBox(
-                        DpConstraints.fixed(50.toDp(), 40.toDp()),
-                        Modifier.align(Alignment.End),
-                        content = {}
-                    )
-                }
-            },
-            @Composable {
-                Column {
-                    Container(
-                        Modifier.aspectRatio(2f).alignBy { 0 },
-                        content = {}
-                    )
-                    ConstrainedBox(
-                        DpConstraints.fixed(50.toDp(), 40.toDp()),
-                        Modifier.alignBy(TestVerticalLine),
-                        content = {}
-                    )
-                }
-            },
-            @Composable {
-                Column(Modifier.fillMaxHeight()) {
-                    Container(Modifier.aspectRatio(2f), content = {})
-                    ConstrainedBox(
-                        DpConstraints.fixed(50.toDp(), 40.toDp()),
-                        content = {}
-                    )
-                }
-            },
-            @Composable {
-                Column(Modifier.fillMaxHeight(), verticalArrangement = Arrangement.Top) {
-                    Container(Modifier.aspectRatio(2f), content = {})
-                    ConstrainedBox(
-                        DpConstraints.fixed(50.toDp(), 40.toDp()),
-                        content = {}
-                    )
-                }
-            },
-            @Composable {
-                Column(Modifier.fillMaxHeight(), verticalArrangement = Arrangement.Center) {
-                    Container(
-                        Modifier.align(Alignment.CenterHorizontally).aspectRatio(2f),
-                        content = {}
-                    )
-                    ConstrainedBox(
-                        DpConstraints.fixed(50.toDp(), 40.toDp()),
-                        content = {}
-                    )
-                }
-            },
-            @Composable {
-                Column(Modifier.fillMaxHeight(), verticalArrangement = Arrangement.Bottom) {
-                    Container(
-                        Modifier.align(Alignment.End).aspectRatio(2f),
-                        content = {}
-                    )
-                    ConstrainedBox(
-                        DpConstraints.fixed(50.toDp(), 40.toDp()),
-                        Modifier.align(Alignment.End),
-                        content = {}
-                    )
-                }
-            },
-            @Composable {
-                Column(Modifier.fillMaxHeight(), verticalArrangement = Arrangement.SpaceAround) {
-                    Container(Modifier.fillMaxWidth().aspectRatio(2f), content = {})
-                    ConstrainedBox(
-                        DpConstraints.fixed(50.toDp(), 40.toDp()),
-                        Modifier.fillMaxWidth(),
-                        content = {}
-                    )
-                }
-            },
-            @Composable {
-                Column(Modifier.fillMaxHeight(), verticalArrangement = Arrangement.SpaceBetween) {
-                    Container(Modifier.aspectRatio(2f), content = {})
-                    ConstrainedBox(
-                        DpConstraints.fixed(50.toDp(), 40.toDp()),
-                        content = {}
-                    )
-                }
-            },
-            @Composable {
-                Column(Modifier.fillMaxHeight(), verticalArrangement = Arrangement.SpaceEvenly) {
-                    Container(
-                        Modifier.aspectRatio(2f),
-                        content = {}
-                    )
-                    ConstrainedBox(
-                        DpConstraints.fixed(50.toDp(), 40.toDp()),
-                        content = {}
-                    )
-                }
-            }
-        ) { minIntrinsicWidth, minIntrinsicHeight, maxIntrinsicWidth, maxIntrinsicHeight ->
-            // Min width.
-            assertEquals(50.toDp().roundToPx(), minIntrinsicWidth(0.toDp().roundToPx()))
-            assertEquals(50.toDp().roundToPx(), minIntrinsicWidth(25.toDp().roundToPx()))
-            assertEquals(50.toDp().roundToPx(), minIntrinsicWidth(Constraints.Infinity))
-            // Min height.
-            assertEquals(40.toDp().roundToPx(), minIntrinsicHeight(0.toDp().roundToPx()))
-            assertEquals(
-                50.toDp().roundToPx() / 2 + 40.toDp().roundToPx(),
-                minIntrinsicHeight(50.toDp().roundToPx())
-            )
-            assertEquals(40.toDp().roundToPx(), minIntrinsicHeight(Constraints.Infinity))
-            // Max width.
-            assertEquals(50.toDp().roundToPx(), maxIntrinsicWidth(0.toDp().roundToPx()))
-            assertEquals(50.toDp().roundToPx(), maxIntrinsicWidth(25.toDp().roundToPx()))
-            assertEquals(50.toDp().roundToPx(), maxIntrinsicWidth(Constraints.Infinity))
-            // Max height.
-            assertEquals(40.toDp().roundToPx(), maxIntrinsicHeight(0.toDp().roundToPx()))
-            assertEquals(
-                50.toDp().roundToPx() / 2 + 40.toDp().roundToPx(),
-                maxIntrinsicHeight(50.toDp().roundToPx())
-            )
-            assertEquals(40.toDp().roundToPx(), maxIntrinsicHeight(Constraints.Infinity))
-        }
-    }
-
-    @Test
-    fun testColumn_withWeightChildren_hasCorrectIntrinsicMeasurements() = with(density) {
-        testIntrinsics(
-            @Composable {
-                Column {
-                    ConstrainedBox(
-                        DpConstraints.fixed(30.toDp(), 20.toDp()),
-                        Modifier.weight(3f),
-                        content = {}
-                    )
-                    ConstrainedBox(
-                        DpConstraints.fixed(40.toDp(), 30.toDp()),
-                        Modifier.weight(2f),
-                        content = {}
-                    )
-                    Container(
-                        Modifier.aspectRatio(0.5f).weight(2f),
-                        content = {}
-                    )
-                    ConstrainedBox(
-                        DpConstraints.fixed(30.toDp(), 20.toDp()),
-                        content = {}
-                    )
-                }
-            },
-            @Composable {
-                Column {
-                    ConstrainedBox(
-                        DpConstraints.fixed(30.toDp(), 20.toDp()),
-                        Modifier.weight(3f).align(Alignment.Start),
-                        content = {}
-                    )
-                    ConstrainedBox(
-                        DpConstraints.fixed(40.toDp(), 30.toDp()),
-                        Modifier.weight(2f).align(Alignment.CenterHorizontally),
-                        content = {}
-                    )
-                    Container(Modifier.aspectRatio(0.5f).weight(2f)) { }
-                    ConstrainedBox(
-                        DpConstraints.fixed(30.toDp(), 20.toDp()),
-                        Modifier.align(Alignment.End)
-                    ) { }
-                }
-            },
-            @Composable {
-                Column(verticalArrangement = Arrangement.Top) {
-                    ConstrainedBox(
-                        DpConstraints.fixed(30.toDp(), 20.toDp()),
-                        Modifier.weight(3f)
-                    ) { }
-                    ConstrainedBox(
-                        DpConstraints.fixed(40.toDp(), 30.toDp()),
-                        Modifier.weight(2f)
-                    ) { }
-                    Container(Modifier.aspectRatio(0.5f).weight(2f)) { }
-                    ConstrainedBox(DpConstraints.fixed(30.toDp(), 20.toDp())) { }
-                }
-            },
-            @Composable {
-                Column(verticalArrangement = Arrangement.Center) {
-                    ConstrainedBox(
-                        constraints = DpConstraints.fixed(30.toDp(), 20.toDp()),
-                        modifier = Modifier.weight(3f).align(Alignment.CenterHorizontally)
-                    ) { }
-                    ConstrainedBox(
-                        constraints = DpConstraints.fixed(40.toDp(), 30.toDp()),
-                        modifier = Modifier.weight(2f).align(Alignment.CenterHorizontally)
-                    ) { }
-                    Container(
-                        Modifier.aspectRatio(0.5f).weight(2f).align(Alignment.CenterHorizontally)
-                    ) { }
-                    ConstrainedBox(
-                        constraints = DpConstraints.fixed(30.toDp(), 20.toDp()),
-                        modifier = Modifier.align(Alignment.CenterHorizontally)
-                    ) { }
-                }
-            },
-            @Composable {
-                Column(verticalArrangement = Arrangement.Bottom) {
-                    ConstrainedBox(
-                        constraints = DpConstraints.fixed(30.toDp(), 20.toDp()),
-                        modifier = Modifier.weight(3f).align(Alignment.End)
-                    ) { }
-                    ConstrainedBox(
-                        constraints = DpConstraints.fixed(40.toDp(), 30.toDp()),
-                        modifier = Modifier.weight(2f).align(Alignment.End)
-                    ) { }
-                    Container(
-                        Modifier.aspectRatio(0.5f).weight(2f).align(Alignment.End)
-                    ) { }
-                    ConstrainedBox(
-                        constraints = DpConstraints.fixed(30.toDp(), 20.toDp()),
-                        modifier = Modifier.align(Alignment.End)
-                    ) { }
-                }
-            },
-            @Composable {
-                Column(verticalArrangement = Arrangement.SpaceAround) {
-                    ConstrainedBox(
-                        constraints = DpConstraints.fixed(30.toDp(), 20.toDp()),
-                        modifier = Modifier.weight(3f).fillMaxWidth()
-                    ) { }
-                    ConstrainedBox(
-                        constraints = DpConstraints.fixed(40.toDp(), 30.toDp()),
-                        modifier = Modifier.weight(2f).fillMaxWidth()
-                    ) { }
-                    Container(
-                        Modifier.aspectRatio(0.5f).weight(2f).fillMaxWidth()
-                    ) { }
-                    ConstrainedBox(
-                        constraints = DpConstraints.fixed(30.toDp(), 20.toDp()),
-                        modifier = Modifier.fillMaxWidth()
-                    ) { }
-                }
-            },
-            @Composable {
-                Column(verticalArrangement = Arrangement.SpaceBetween) {
-                    ConstrainedBox(
-                        DpConstraints.fixed(30.toDp(), 20.toDp()),
-                        Modifier.weight(3f)
-                    ) { }
-                    ConstrainedBox(
-                        DpConstraints.fixed(40.toDp(), 30.toDp()),
-                        Modifier.weight(2f)
-                    ) { }
-                    Container(Modifier.aspectRatio(0.5f).then(Modifier.weight(2f))) { }
-                    ConstrainedBox(DpConstraints.fixed(30.toDp(), 20.toDp())) { }
-                }
-            },
-            @Composable {
-                Column(verticalArrangement = Arrangement.SpaceEvenly) {
-                    ConstrainedBox(
-                        DpConstraints.fixed(30.toDp(), 20.toDp()),
-                        Modifier.weight(3f)
-                    ) { }
-                    ConstrainedBox(
-                        DpConstraints.fixed(40.toDp(), 30.toDp()),
-                        Modifier.weight(2f)
-                    ) { }
-                    Container(Modifier.aspectRatio(0.5f).then(Modifier.weight(2f))) { }
-                    ConstrainedBox(DpConstraints.fixed(30.toDp(), 20.toDp())) { }
-                }
-            }
-        ) { minIntrinsicWidth, minIntrinsicHeight, maxIntrinsicWidth, maxIntrinsicHeight ->
-            // Min width.
-            assertEquals(40.toDp().roundToPx(), minIntrinsicWidth(0.toDp().roundToPx()))
-            assertEquals(40.toDp().roundToPx(), minIntrinsicWidth(125.toDp().roundToPx()))
-            assertEquals(50.toDp().roundToPx(), minIntrinsicWidth(370.toDp().roundToPx()))
-            assertEquals(40.toDp().roundToPx(), minIntrinsicWidth(Constraints.Infinity))
-            // Min height.
-            assertEquals(
-                30.toDp().roundToPx() / 2 * 7 + 20.toDp().roundToPx(),
-                minIntrinsicHeight(0)
-            )
-            assertEquals(
-                30.toDp().roundToPx() / 2 * 7 + 20.toDp().roundToPx(),
-                minIntrinsicHeight(10.toDp().roundToPx())
-            )
-            assertEquals(
-                25.toDp().roundToPx() * 2 / 2 * 7 + 20.toDp().roundToPx(),
-                minIntrinsicHeight(25.toDp().roundToPx())
-            )
-            assertEquals(
-                30.toDp().roundToPx() / 2 * 7 + 20.toDp().roundToPx(),
-                minIntrinsicHeight(Constraints.Infinity)
-            )
-            // Max width.
-            assertEquals(40.toDp().roundToPx(), maxIntrinsicWidth(0.toDp().roundToPx()))
-            assertEquals(40.toDp().roundToPx(), maxIntrinsicWidth(125.toDp().roundToPx()))
-            assertEquals(50.toDp().roundToPx(), maxIntrinsicWidth(370.toDp().roundToPx()))
-            assertEquals(40.toDp().roundToPx(), maxIntrinsicWidth(Constraints.Infinity))
-            // Max height.
-            assertEquals(
-                30.toDp().roundToPx() / 2 * 7 + 20.toDp().roundToPx(),
-                maxIntrinsicHeight(0)
-            )
-            assertEquals(
-                30.toDp().roundToPx() / 2 * 7 + 20.toDp().roundToPx(),
-                maxIntrinsicHeight(10.toDp().roundToPx())
-            )
-            assertEquals(
-                25.toDp().roundToPx() * 2 / 2 * 7 + 20.toDp().roundToPx(),
-                maxIntrinsicHeight(25.toDp().roundToPx())
-            )
-            assertEquals(
-                30.toDp().roundToPx() / 2 * 7 + 20.toDp().roundToPx(),
-                maxIntrinsicHeight(Constraints.Infinity)
-            )
-        }
-    }
-
-    @Test
-    fun testColumn_withArrangementSpacing() = with(density) {
-        val spacing = 5
-        val childSize = 10
-        testIntrinsics(
-            @Composable {
-                Column(verticalArrangement = Arrangement.spacedBy(spacing.toDp())) {
-                    Box(Modifier.size(childSize.toDp()))
-                    Box(Modifier.size(childSize.toDp()))
-                    Box(Modifier.size(childSize.toDp()))
-                }
-            }
-        ) { _, minIntrinsicHeight, _, maxIntrinsicHeight ->
-            assertEquals(childSize * 3 + 2 * spacing, minIntrinsicHeight(Constraints.Infinity))
-            assertEquals(childSize * 3 + 2 * spacing, maxIntrinsicHeight(Constraints.Infinity))
-        }
-    }
-
-    @Test
-    fun testColumn_withArrangementSpacing_width() = with(density) {
-        val spacing = 5
-        val columnHeight = 15
-        val latch = CountDownLatch(1)
-        var columnWidth = 0
-        show {
-            Column(
-                modifier = Modifier.height(columnHeight.toDp()).width(IntrinsicSize.Min)
-                    .onSizeChanged {
-                        columnWidth = it.width
-                        latch.countDown()
-                    },
-                verticalArrangement = Arrangement.spacedBy(spacing.toDp())
-            ) {
-                Box(Modifier) // Empty box
-                Box(Modifier.height(columnHeight.toDp()).aspectRatio(1f))
-            }
-        }
-        assertTrue(latch.await(1, TimeUnit.SECONDS))
-        assertEquals(columnHeight - spacing, columnWidth)
-    }
-
-    @Test
-    fun testRow_withWIHOChild_hasCorrectIntrinsicMeasurements() = with(density) {
-        val dividerWidth = 10.dp
-        val rowWidth = 40.dp
-
-        val positionedLatch = CountDownLatch(1)
-        show {
-            Row(Modifier.requiredWidth(rowWidth).height(IntrinsicSize.Min)) {
-                Container(
-                    Modifier.requiredWidth(dividerWidth).fillMaxHeight().onGloballyPositioned {
-                        assertEquals(
-                            it.size.height,
-                            (rowWidth.roundToPx() - dividerWidth.roundToPx()) / 2
-                        )
-                        positionedLatch.countDown()
+                @Composable {
+                    Row(Modifier.fillMaxWidth()) {
+                        Container(Modifier.aspectRatio(2f), content = {})
+                        ConstrainedBox(DpConstraints.fixed(50.toDp(), 40.toDp()), content = {})
                     }
-                ) {}
-                val measurePolicy = object : MeasurePolicy {
-                    override fun MeasureScope.measure(
-                        measurables: List<Measurable>,
-                        constraints: Constraints
-                    ) = layout(constraints.maxWidth, constraints.maxWidth / 2) {}
-
-                    override fun IntrinsicMeasureScope.minIntrinsicWidth(
-                        measurables: List<IntrinsicMeasurable>,
-                        height: Int
-                    ) = rowWidth.roundToPx() / 10
-
-                    override fun IntrinsicMeasureScope.minIntrinsicHeight(
-                        measurables: List<IntrinsicMeasurable>,
-                        width: Int
-                    ) = width / 2
-
-                    override fun IntrinsicMeasureScope.maxIntrinsicWidth(
-                        measurables: List<IntrinsicMeasurable>,
-                        height: Int
-                    ) = rowWidth.roundToPx() * 2
-
-                    override fun IntrinsicMeasureScope.maxIntrinsicHeight(
-                        measurables: List<IntrinsicMeasurable>,
-                        width: Int
-                    ) = width / 2
+                },
+                @Composable {
+                    Row {
+                        Container(Modifier.aspectRatio(2f).align(Alignment.Top), content = {})
+                        ConstrainedBox(
+                            DpConstraints.fixed(50.toDp(), 40.toDp()),
+                            Modifier.align(Alignment.CenterVertically),
+                            content = {}
+                        )
+                    }
+                },
+                @Composable {
+                    Row {
+                        Container(Modifier.aspectRatio(2f).alignBy(FirstBaseline), content = {})
+                        ConstrainedBox(
+                            DpConstraints.fixed(50.toDp(), 40.toDp()),
+                            Modifier.alignBy { it.measuredWidth },
+                            content = {}
+                        )
+                    }
+                },
+                @Composable {
+                    Row(Modifier.fillMaxWidth(), horizontalArrangement = Arrangement.Start) {
+                        Container(Modifier.aspectRatio(2f), content = {})
+                        ConstrainedBox(DpConstraints.fixed(50.toDp(), 40.toDp()), content = {})
+                    }
+                },
+                @Composable {
+                    Row(Modifier.fillMaxWidth(), horizontalArrangement = Arrangement.Center) {
+                        Container(
+                            Modifier.align(Alignment.CenterVertically).aspectRatio(2f),
+                            content = {}
+                        )
+                        ConstrainedBox(
+                            DpConstraints.fixed(50.toDp(), 40.toDp()),
+                            Modifier.align(Alignment.CenterVertically),
+                            content = {}
+                        )
+                    }
+                },
+                @Composable {
+                    Row(Modifier.fillMaxWidth(), horizontalArrangement = Arrangement.End) {
+                        Container(Modifier.align(Alignment.Bottom).aspectRatio(2f), content = {})
+                        ConstrainedBox(
+                            DpConstraints.fixed(50.toDp(), 40.toDp()),
+                            Modifier.align(Alignment.Bottom),
+                            content = {}
+                        )
+                    }
+                },
+                @Composable {
+                    Row(Modifier.fillMaxWidth(), horizontalArrangement = Arrangement.SpaceAround) {
+                        Container(Modifier.fillMaxHeight().aspectRatio(2f), content = {})
+                        ConstrainedBox(
+                            DpConstraints.fixed(50.toDp(), 40.toDp()),
+                            Modifier.fillMaxHeight(),
+                            content = {}
+                        )
+                    }
+                },
+                @Composable {
+                    Row(Modifier.fillMaxWidth(), horizontalArrangement = Arrangement.SpaceBetween) {
+                        Container(Modifier.aspectRatio(2f), content = {})
+                        ConstrainedBox(DpConstraints.fixed(50.toDp(), 40.toDp()), content = {})
+                    }
+                },
+                @Composable {
+                    Row(Modifier.fillMaxWidth(), horizontalArrangement = Arrangement.SpaceEvenly) {
+                        Container(Modifier.aspectRatio(2f), content = {})
+                        ConstrainedBox(DpConstraints.fixed(50.toDp(), 40.toDp()), content = {})
+                    }
                 }
-                Layout(
-                    content = {},
-                    measurePolicy = measurePolicy
+            ) { minIntrinsicWidth, minIntrinsicHeight, maxIntrinsicWidth, maxIntrinsicHeight ->
+                // Min width.
+                assertEquals(50.toDp().roundToPx(), minIntrinsicWidth(0.toDp().roundToPx()))
+                assertEquals(
+                    25.toDp().roundToPx() * 2 + 50.toDp().roundToPx(),
+                    minIntrinsicWidth(25.toDp().roundToPx())
+                )
+                assertEquals(50.toDp().roundToPx(), minIntrinsicWidth(Constraints.Infinity))
+                // Min height.
+                assertEquals(40.toDp().roundToPx(), minIntrinsicHeight(0.toDp().roundToPx()))
+                assertEquals(40.toDp().roundToPx(), minIntrinsicHeight(70.toDp().roundToPx()))
+                assertEquals(40.toDp().roundToPx(), minIntrinsicHeight(Constraints.Infinity))
+                // Max width.
+                assertEquals(50.toDp().roundToPx(), maxIntrinsicWidth(0.toDp().roundToPx()))
+                assertEquals(
+                    25.toDp().roundToPx() * 2 + 50.toDp().roundToPx(),
+                    maxIntrinsicWidth(25.toDp().roundToPx())
+                )
+                assertEquals(50.toDp().roundToPx(), maxIntrinsicWidth(Constraints.Infinity))
+                // Max height.
+                assertEquals(40.toDp().roundToPx(), maxIntrinsicHeight(0.toDp().roundToPx()))
+                assertEquals(40.toDp().roundToPx(), maxIntrinsicHeight(70.toDp().roundToPx()))
+                assertEquals(40.toDp().roundToPx(), maxIntrinsicHeight(Constraints.Infinity))
+            }
+        }
+
+    @Test
+    fun testRow_withNoItems_hasCorrectIntrinsicMeasurements() =
+        with(density) {
+            testIntrinsics(
+                @Composable {
+                    Row(
+                        Modifier.width(IntrinsicSize.Max).height(IntrinsicSize.Max),
+                        horizontalArrangement = Arrangement.spacedBy(48.dp),
+                    ) {}
+                },
+                @Composable {
+                    Row(
+                        Modifier.width(IntrinsicSize.Min).height(IntrinsicSize.Min),
+                        horizontalArrangement = Arrangement.spacedBy(48.dp),
+                    ) {}
+                },
+                @Composable {
+                    Column(
+                        Modifier.width(IntrinsicSize.Max).height(IntrinsicSize.Max),
+                        verticalArrangement = Arrangement.spacedBy(48.dp),
+                    ) {}
+                },
+                @Composable {
+                    Column(
+                        Modifier.width(IntrinsicSize.Min).height(IntrinsicSize.Min),
+                        verticalArrangement = Arrangement.spacedBy(48.dp),
+                    ) {}
+                },
+            ) { minIntrinsicWidth, minIntrinsicHeight, maxIntrinsicWidth, maxIntrinsicHeight ->
+                // Min width.
+                assertEquals(0.toDp().roundToPx(), minIntrinsicWidth(0.toDp().roundToPx()))
+                // Min height.
+                assertEquals(0.toDp().roundToPx(), minIntrinsicHeight(0.toDp().roundToPx()))
+                // Max width.
+                assertEquals(0.toDp().roundToPx(), maxIntrinsicWidth(0.toDp().roundToPx()))
+                // Max height.
+                assertEquals(0.toDp().roundToPx(), maxIntrinsicHeight(0.toDp().roundToPx()))
+            }
+        }
+
+    @Test
+    fun testRow_withWeightChildren_hasCorrectIntrinsicMeasurements() =
+        with(density) {
+            testIntrinsics(
+                @Composable {
+                    Row {
+                        ConstrainedBox(
+                            DpConstraints.fixed(20.toDp(), 30.toDp()),
+                            Modifier.weight(3f),
+                            content = {}
+                        )
+                        ConstrainedBox(
+                            DpConstraints.fixed(30.toDp(), 40.toDp()),
+                            Modifier.weight(2f),
+                            content = {}
+                        )
+                        Container(Modifier.aspectRatio(2f).weight(2f), content = {})
+                        ConstrainedBox(DpConstraints.fixed(20.toDp(), 30.toDp()), content = {})
+                    }
+                },
+                @Composable {
+                    Row {
+                        ConstrainedBox(
+                            DpConstraints.fixed(20.toDp(), 30.toDp()),
+                            Modifier.weight(3f).align(Alignment.Top),
+                            content = {}
+                        )
+                        ConstrainedBox(
+                            DpConstraints.fixed(30.toDp(), 40.toDp()),
+                            Modifier.weight(2f).align(Alignment.CenterVertically),
+                            content = {}
+                        )
+                        Container(Modifier.aspectRatio(2f).weight(2f), content = {})
+                        ConstrainedBox(
+                            DpConstraints.fixed(20.toDp(), 30.toDp()),
+                            Modifier.align(Alignment.Bottom),
+                            content = {}
+                        )
+                    }
+                },
+                @Composable {
+                    Row(horizontalArrangement = Arrangement.Start) {
+                        ConstrainedBox(
+                            DpConstraints.fixed(20.toDp(), 30.toDp()),
+                            Modifier.weight(3f),
+                            content = {}
+                        )
+                        ConstrainedBox(
+                            DpConstraints.fixed(30.toDp(), 40.toDp()),
+                            Modifier.weight(2f),
+                            content = {}
+                        )
+                        Container(Modifier.aspectRatio(2f).weight(2f), content = {})
+                        ConstrainedBox(DpConstraints.fixed(20.toDp(), 30.toDp()), content = {})
+                    }
+                },
+                @Composable {
+                    Row(horizontalArrangement = Arrangement.Center) {
+                        ConstrainedBox(
+                            constraints = DpConstraints.fixed(20.toDp(), 30.toDp()),
+                            modifier = Modifier.weight(3f).align(Alignment.CenterVertically),
+                            content = {}
+                        )
+                        ConstrainedBox(
+                            constraints = DpConstraints.fixed(30.toDp(), 40.toDp()),
+                            modifier = Modifier.weight(2f).align(Alignment.CenterVertically),
+                            content = {}
+                        )
+                        Container(
+                            Modifier.aspectRatio(2f).weight(2f).align(Alignment.CenterVertically),
+                            content = {}
+                        )
+                        ConstrainedBox(
+                            constraints = DpConstraints.fixed(20.toDp(), 30.toDp()),
+                            modifier = Modifier.align(Alignment.CenterVertically),
+                            content = {}
+                        )
+                    }
+                },
+                @Composable {
+                    Row(horizontalArrangement = Arrangement.End) {
+                        ConstrainedBox(
+                            constraints = DpConstraints.fixed(20.toDp(), 30.toDp()),
+                            modifier = Modifier.weight(3f).align(Alignment.Bottom),
+                            content = {}
+                        )
+                        ConstrainedBox(
+                            constraints = DpConstraints.fixed(30.toDp(), 40.toDp()),
+                            modifier = Modifier.weight(2f).align(Alignment.Bottom),
+                            content = {}
+                        )
+                        Container(
+                            Modifier.aspectRatio(2f).weight(2f).align(Alignment.Bottom),
+                            content = {}
+                        )
+                        ConstrainedBox(
+                            constraints = DpConstraints.fixed(20.toDp(), 30.toDp()),
+                            modifier = Modifier.align(Alignment.Bottom),
+                            content = {}
+                        )
+                    }
+                },
+                @Composable {
+                    Row(horizontalArrangement = Arrangement.SpaceAround) {
+                        ConstrainedBox(
+                            constraints = DpConstraints.fixed(20.toDp(), 30.toDp()),
+                            modifier = Modifier.weight(3f).fillMaxHeight(),
+                            content = {}
+                        )
+                        ConstrainedBox(
+                            constraints = DpConstraints.fixed(30.toDp(), 40.toDp()),
+                            modifier = Modifier.weight(2f).fillMaxHeight(),
+                            content = {}
+                        )
+                        Container(Modifier.aspectRatio(2f).weight(2f).fillMaxHeight(), content = {})
+                        ConstrainedBox(
+                            constraints = DpConstraints.fixed(20.toDp(), 30.toDp()),
+                            modifier = Modifier.fillMaxHeight(),
+                            content = {}
+                        )
+                    }
+                },
+                @Composable {
+                    Row(horizontalArrangement = Arrangement.SpaceBetween) {
+                        ConstrainedBox(
+                            DpConstraints.fixed(20.toDp(), 30.toDp()),
+                            Modifier.weight(3f),
+                            content = {}
+                        )
+                        ConstrainedBox(
+                            DpConstraints.fixed(30.toDp(), 40.toDp()),
+                            Modifier.weight(2f),
+                            content = {}
+                        )
+                        Container(Modifier.aspectRatio(2f).weight(2f), content = {})
+                        ConstrainedBox(DpConstraints.fixed(20.toDp(), 30.toDp()), content = {})
+                    }
+                },
+                @Composable {
+                    Row(horizontalArrangement = Arrangement.SpaceEvenly) {
+                        ConstrainedBox(
+                            DpConstraints.fixed(20.toDp(), 30.toDp()),
+                            Modifier.weight(3f),
+                            content = {}
+                        )
+                        ConstrainedBox(
+                            DpConstraints.fixed(30.toDp(), 40.toDp()),
+                            Modifier.weight(2f),
+                            content = {}
+                        )
+                        Container(Modifier.aspectRatio(2f).weight(2f), content = {})
+                        ConstrainedBox(DpConstraints.fixed(20.toDp(), 30.toDp()), content = {})
+                    }
+                }
+            ) { minIntrinsicWidth, minIntrinsicHeight, maxIntrinsicWidth, maxIntrinsicHeight ->
+                // Min width.
+                assertEquals(
+                    30.toDp().roundToPx() / 2 * 7 + 20.toDp().roundToPx(),
+                    minIntrinsicWidth(0)
+                )
+                assertEquals(
+                    30.toDp().roundToPx() / 2 * 7 + 20.toDp().roundToPx(),
+                    minIntrinsicWidth(10.toDp().roundToPx())
+                )
+                assertEquals(
+                    25.toDp().roundToPx() * 2 / 2 * 7 + 20.toDp().roundToPx(),
+                    minIntrinsicWidth(25.toDp().roundToPx())
+                )
+                assertEquals(
+                    30.toDp().roundToPx() / 2 * 7 + 20.toDp().roundToPx(),
+                    minIntrinsicWidth(Constraints.Infinity)
+                )
+                // Min height.
+                assertEquals(40.toDp().roundToPx(), minIntrinsicHeight(0.toDp().roundToPx()))
+                assertEquals(40.toDp().roundToPx(), minIntrinsicHeight(125.toDp().roundToPx()))
+                assertEquals(50.toDp().roundToPx(), minIntrinsicHeight(370.toDp().roundToPx()))
+                assertEquals(40.toDp().roundToPx(), minIntrinsicHeight(Constraints.Infinity))
+                // Max width.
+                assertEquals(
+                    30.toDp().roundToPx() / 2 * 7 + 20.toDp().roundToPx(),
+                    maxIntrinsicWidth(0)
+                )
+                assertEquals(
+                    30.toDp().roundToPx() / 2 * 7 + 20.toDp().roundToPx(),
+                    maxIntrinsicWidth(10.toDp().roundToPx())
+                )
+                assertEquals(
+                    25.toDp().roundToPx() * 2 / 2 * 7 + 20.toDp().roundToPx(),
+                    maxIntrinsicWidth(25.toDp().roundToPx())
+                )
+                assertEquals(
+                    30.toDp().roundToPx() / 2 * 7 + 20.toDp().roundToPx(),
+                    maxIntrinsicWidth(Constraints.Infinity)
+                )
+                // Max height.
+                assertEquals(40.toDp().roundToPx(), maxIntrinsicHeight(0.toDp().roundToPx()))
+                assertEquals(40.toDp().roundToPx(), maxIntrinsicHeight(125.toDp().roundToPx()))
+                assertEquals(50.toDp().roundToPx(), maxIntrinsicHeight(370.toDp().roundToPx()))
+                assertEquals(40.toDp().roundToPx(), maxIntrinsicHeight(Constraints.Infinity))
+            }
+        }
+
+    @Test
+    fun testRow_withArrangementSpacing() =
+        with(density) {
+            val spacing = 5
+            val childSize = 10
+            testIntrinsics(
+                @Composable {
+                    Row(horizontalArrangement = Arrangement.spacedBy(spacing.toDp())) {
+                        Box(Modifier.size(childSize.toDp()))
+                        Box(Modifier.size(childSize.toDp()))
+                        Box(Modifier.size(childSize.toDp()))
+                    }
+                }
+            ) { minIntrinsicWidth, _, maxIntrinsicWidth, _ ->
+                assertEquals(childSize * 3 + 2 * spacing, minIntrinsicWidth(Constraints.Infinity))
+                assertEquals(childSize * 3 + 2 * spacing, maxIntrinsicWidth(Constraints.Infinity))
+            }
+        }
+
+    @Test
+    fun testRow_withArrangementSpacing_height() =
+        with(density) {
+            val spacing = 5
+            val rowWidth = 15
+            val latch = CountDownLatch(1)
+            var rowHeight = 0
+            show {
+                Row(
+                    modifier =
+                        Modifier.width(rowWidth.toDp()).height(IntrinsicSize.Min).onSizeChanged {
+                            rowHeight = it.height
+                            latch.countDown()
+                        },
+                    horizontalArrangement = Arrangement.spacedBy(spacing.toDp())
+                ) {
+                    Box(Modifier) // Empty box
+                    Box(Modifier.width(rowWidth.toDp()).aspectRatio(1f))
+                }
+            }
+            assertTrue(latch.await(1, TimeUnit.SECONDS))
+            assertEquals(rowWidth - spacing, rowHeight)
+        }
+
+    @Test
+    fun testColumn_withNoWeightChildren_hasCorrectIntrinsicMeasurements() =
+        with(density) {
+            testIntrinsics(
+                @Composable {
+                    Column {
+                        Container(Modifier.aspectRatio(2f), content = {})
+                        ConstrainedBox(DpConstraints.fixed(50.toDp(), 40.toDp()), content = {})
+                    }
+                },
+                @Composable {
+                    Column {
+                        Container(Modifier.aspectRatio(2f).align(Alignment.Start), content = {})
+                        ConstrainedBox(
+                            DpConstraints.fixed(50.toDp(), 40.toDp()),
+                            Modifier.align(Alignment.End),
+                            content = {}
+                        )
+                    }
+                },
+                @Composable {
+                    Column {
+                        Container(Modifier.aspectRatio(2f).alignBy { 0 }, content = {})
+                        ConstrainedBox(
+                            DpConstraints.fixed(50.toDp(), 40.toDp()),
+                            Modifier.alignBy(TestVerticalLine),
+                            content = {}
+                        )
+                    }
+                },
+                @Composable {
+                    Column(Modifier.fillMaxHeight()) {
+                        Container(Modifier.aspectRatio(2f), content = {})
+                        ConstrainedBox(DpConstraints.fixed(50.toDp(), 40.toDp()), content = {})
+                    }
+                },
+                @Composable {
+                    Column(Modifier.fillMaxHeight(), verticalArrangement = Arrangement.Top) {
+                        Container(Modifier.aspectRatio(2f), content = {})
+                        ConstrainedBox(DpConstraints.fixed(50.toDp(), 40.toDp()), content = {})
+                    }
+                },
+                @Composable {
+                    Column(Modifier.fillMaxHeight(), verticalArrangement = Arrangement.Center) {
+                        Container(
+                            Modifier.align(Alignment.CenterHorizontally).aspectRatio(2f),
+                            content = {}
+                        )
+                        ConstrainedBox(DpConstraints.fixed(50.toDp(), 40.toDp()), content = {})
+                    }
+                },
+                @Composable {
+                    Column(Modifier.fillMaxHeight(), verticalArrangement = Arrangement.Bottom) {
+                        Container(Modifier.align(Alignment.End).aspectRatio(2f), content = {})
+                        ConstrainedBox(
+                            DpConstraints.fixed(50.toDp(), 40.toDp()),
+                            Modifier.align(Alignment.End),
+                            content = {}
+                        )
+                    }
+                },
+                @Composable {
+                    Column(
+                        Modifier.fillMaxHeight(),
+                        verticalArrangement = Arrangement.SpaceAround
+                    ) {
+                        Container(Modifier.fillMaxWidth().aspectRatio(2f), content = {})
+                        ConstrainedBox(
+                            DpConstraints.fixed(50.toDp(), 40.toDp()),
+                            Modifier.fillMaxWidth(),
+                            content = {}
+                        )
+                    }
+                },
+                @Composable {
+                    Column(
+                        Modifier.fillMaxHeight(),
+                        verticalArrangement = Arrangement.SpaceBetween
+                    ) {
+                        Container(Modifier.aspectRatio(2f), content = {})
+                        ConstrainedBox(DpConstraints.fixed(50.toDp(), 40.toDp()), content = {})
+                    }
+                },
+                @Composable {
+                    Column(
+                        Modifier.fillMaxHeight(),
+                        verticalArrangement = Arrangement.SpaceEvenly
+                    ) {
+                        Container(Modifier.aspectRatio(2f), content = {})
+                        ConstrainedBox(DpConstraints.fixed(50.toDp(), 40.toDp()), content = {})
+                    }
+                }
+            ) { minIntrinsicWidth, minIntrinsicHeight, maxIntrinsicWidth, maxIntrinsicHeight ->
+                // Min width.
+                assertEquals(50.toDp().roundToPx(), minIntrinsicWidth(0.toDp().roundToPx()))
+                assertEquals(50.toDp().roundToPx(), minIntrinsicWidth(25.toDp().roundToPx()))
+                assertEquals(50.toDp().roundToPx(), minIntrinsicWidth(Constraints.Infinity))
+                // Min height.
+                assertEquals(40.toDp().roundToPx(), minIntrinsicHeight(0.toDp().roundToPx()))
+                assertEquals(
+                    50.toDp().roundToPx() / 2 + 40.toDp().roundToPx(),
+                    minIntrinsicHeight(50.toDp().roundToPx())
+                )
+                assertEquals(40.toDp().roundToPx(), minIntrinsicHeight(Constraints.Infinity))
+                // Max width.
+                assertEquals(50.toDp().roundToPx(), maxIntrinsicWidth(0.toDp().roundToPx()))
+                assertEquals(50.toDp().roundToPx(), maxIntrinsicWidth(25.toDp().roundToPx()))
+                assertEquals(50.toDp().roundToPx(), maxIntrinsicWidth(Constraints.Infinity))
+                // Max height.
+                assertEquals(40.toDp().roundToPx(), maxIntrinsicHeight(0.toDp().roundToPx()))
+                assertEquals(
+                    50.toDp().roundToPx() / 2 + 40.toDp().roundToPx(),
+                    maxIntrinsicHeight(50.toDp().roundToPx())
+                )
+                assertEquals(40.toDp().roundToPx(), maxIntrinsicHeight(Constraints.Infinity))
+            }
+        }
+
+    @Test
+    fun testColumn_withWeightChildren_hasCorrectIntrinsicMeasurements() =
+        with(density) {
+            testIntrinsics(
+                @Composable {
+                    Column {
+                        ConstrainedBox(
+                            DpConstraints.fixed(30.toDp(), 20.toDp()),
+                            Modifier.weight(3f),
+                            content = {}
+                        )
+                        ConstrainedBox(
+                            DpConstraints.fixed(40.toDp(), 30.toDp()),
+                            Modifier.weight(2f),
+                            content = {}
+                        )
+                        Container(Modifier.aspectRatio(0.5f).weight(2f), content = {})
+                        ConstrainedBox(DpConstraints.fixed(30.toDp(), 20.toDp()), content = {})
+                    }
+                },
+                @Composable {
+                    Column {
+                        ConstrainedBox(
+                            DpConstraints.fixed(30.toDp(), 20.toDp()),
+                            Modifier.weight(3f).align(Alignment.Start),
+                            content = {}
+                        )
+                        ConstrainedBox(
+                            DpConstraints.fixed(40.toDp(), 30.toDp()),
+                            Modifier.weight(2f).align(Alignment.CenterHorizontally),
+                            content = {}
+                        )
+                        Container(Modifier.aspectRatio(0.5f).weight(2f)) {}
+                        ConstrainedBox(
+                            DpConstraints.fixed(30.toDp(), 20.toDp()),
+                            Modifier.align(Alignment.End)
+                        ) {}
+                    }
+                },
+                @Composable {
+                    Column(verticalArrangement = Arrangement.Top) {
+                        ConstrainedBox(
+                            DpConstraints.fixed(30.toDp(), 20.toDp()),
+                            Modifier.weight(3f)
+                        ) {}
+                        ConstrainedBox(
+                            DpConstraints.fixed(40.toDp(), 30.toDp()),
+                            Modifier.weight(2f)
+                        ) {}
+                        Container(Modifier.aspectRatio(0.5f).weight(2f)) {}
+                        ConstrainedBox(DpConstraints.fixed(30.toDp(), 20.toDp())) {}
+                    }
+                },
+                @Composable {
+                    Column(verticalArrangement = Arrangement.Center) {
+                        ConstrainedBox(
+                            constraints = DpConstraints.fixed(30.toDp(), 20.toDp()),
+                            modifier = Modifier.weight(3f).align(Alignment.CenterHorizontally)
+                        ) {}
+                        ConstrainedBox(
+                            constraints = DpConstraints.fixed(40.toDp(), 30.toDp()),
+                            modifier = Modifier.weight(2f).align(Alignment.CenterHorizontally)
+                        ) {}
+                        Container(
+                            Modifier.aspectRatio(0.5f)
+                                .weight(2f)
+                                .align(Alignment.CenterHorizontally)
+                        ) {}
+                        ConstrainedBox(
+                            constraints = DpConstraints.fixed(30.toDp(), 20.toDp()),
+                            modifier = Modifier.align(Alignment.CenterHorizontally)
+                        ) {}
+                    }
+                },
+                @Composable {
+                    Column(verticalArrangement = Arrangement.Bottom) {
+                        ConstrainedBox(
+                            constraints = DpConstraints.fixed(30.toDp(), 20.toDp()),
+                            modifier = Modifier.weight(3f).align(Alignment.End)
+                        ) {}
+                        ConstrainedBox(
+                            constraints = DpConstraints.fixed(40.toDp(), 30.toDp()),
+                            modifier = Modifier.weight(2f).align(Alignment.End)
+                        ) {}
+                        Container(Modifier.aspectRatio(0.5f).weight(2f).align(Alignment.End)) {}
+                        ConstrainedBox(
+                            constraints = DpConstraints.fixed(30.toDp(), 20.toDp()),
+                            modifier = Modifier.align(Alignment.End)
+                        ) {}
+                    }
+                },
+                @Composable {
+                    Column(verticalArrangement = Arrangement.SpaceAround) {
+                        ConstrainedBox(
+                            constraints = DpConstraints.fixed(30.toDp(), 20.toDp()),
+                            modifier = Modifier.weight(3f).fillMaxWidth()
+                        ) {}
+                        ConstrainedBox(
+                            constraints = DpConstraints.fixed(40.toDp(), 30.toDp()),
+                            modifier = Modifier.weight(2f).fillMaxWidth()
+                        ) {}
+                        Container(Modifier.aspectRatio(0.5f).weight(2f).fillMaxWidth()) {}
+                        ConstrainedBox(
+                            constraints = DpConstraints.fixed(30.toDp(), 20.toDp()),
+                            modifier = Modifier.fillMaxWidth()
+                        ) {}
+                    }
+                },
+                @Composable {
+                    Column(verticalArrangement = Arrangement.SpaceBetween) {
+                        ConstrainedBox(
+                            DpConstraints.fixed(30.toDp(), 20.toDp()),
+                            Modifier.weight(3f)
+                        ) {}
+                        ConstrainedBox(
+                            DpConstraints.fixed(40.toDp(), 30.toDp()),
+                            Modifier.weight(2f)
+                        ) {}
+                        Container(Modifier.aspectRatio(0.5f).then(Modifier.weight(2f))) {}
+                        ConstrainedBox(DpConstraints.fixed(30.toDp(), 20.toDp())) {}
+                    }
+                },
+                @Composable {
+                    Column(verticalArrangement = Arrangement.SpaceEvenly) {
+                        ConstrainedBox(
+                            DpConstraints.fixed(30.toDp(), 20.toDp()),
+                            Modifier.weight(3f)
+                        ) {}
+                        ConstrainedBox(
+                            DpConstraints.fixed(40.toDp(), 30.toDp()),
+                            Modifier.weight(2f)
+                        ) {}
+                        Container(Modifier.aspectRatio(0.5f).then(Modifier.weight(2f))) {}
+                        ConstrainedBox(DpConstraints.fixed(30.toDp(), 20.toDp())) {}
+                    }
+                }
+            ) { minIntrinsicWidth, minIntrinsicHeight, maxIntrinsicWidth, maxIntrinsicHeight ->
+                // Min width.
+                assertEquals(40.toDp().roundToPx(), minIntrinsicWidth(0.toDp().roundToPx()))
+                assertEquals(40.toDp().roundToPx(), minIntrinsicWidth(125.toDp().roundToPx()))
+                assertEquals(50.toDp().roundToPx(), minIntrinsicWidth(370.toDp().roundToPx()))
+                assertEquals(40.toDp().roundToPx(), minIntrinsicWidth(Constraints.Infinity))
+                // Min height.
+                assertEquals(
+                    30.toDp().roundToPx() / 2 * 7 + 20.toDp().roundToPx(),
+                    minIntrinsicHeight(0)
+                )
+                assertEquals(
+                    30.toDp().roundToPx() / 2 * 7 + 20.toDp().roundToPx(),
+                    minIntrinsicHeight(10.toDp().roundToPx())
+                )
+                assertEquals(
+                    25.toDp().roundToPx() * 2 / 2 * 7 + 20.toDp().roundToPx(),
+                    minIntrinsicHeight(25.toDp().roundToPx())
+                )
+                assertEquals(
+                    30.toDp().roundToPx() / 2 * 7 + 20.toDp().roundToPx(),
+                    minIntrinsicHeight(Constraints.Infinity)
+                )
+                // Max width.
+                assertEquals(40.toDp().roundToPx(), maxIntrinsicWidth(0.toDp().roundToPx()))
+                assertEquals(40.toDp().roundToPx(), maxIntrinsicWidth(125.toDp().roundToPx()))
+                assertEquals(50.toDp().roundToPx(), maxIntrinsicWidth(370.toDp().roundToPx()))
+                assertEquals(40.toDp().roundToPx(), maxIntrinsicWidth(Constraints.Infinity))
+                // Max height.
+                assertEquals(
+                    30.toDp().roundToPx() / 2 * 7 + 20.toDp().roundToPx(),
+                    maxIntrinsicHeight(0)
+                )
+                assertEquals(
+                    30.toDp().roundToPx() / 2 * 7 + 20.toDp().roundToPx(),
+                    maxIntrinsicHeight(10.toDp().roundToPx())
+                )
+                assertEquals(
+                    25.toDp().roundToPx() * 2 / 2 * 7 + 20.toDp().roundToPx(),
+                    maxIntrinsicHeight(25.toDp().roundToPx())
+                )
+                assertEquals(
+                    30.toDp().roundToPx() / 2 * 7 + 20.toDp().roundToPx(),
+                    maxIntrinsicHeight(Constraints.Infinity)
                 )
             }
         }
 
-        assertTrue(positionedLatch.await(1, TimeUnit.SECONDS))
-    }
-
     @Test
-    fun testColumn_withHIWOChild_hasCorrectIntrinsicMeasurements() = with(density) {
-        val dividerHeight = 10.dp
-        val columnHeight = 40.dp
-
-        val positionedLatch = CountDownLatch(1)
-        show {
-            Column(Modifier.requiredHeight(columnHeight).width(IntrinsicSize.Min)) {
-                Container(
-                    Modifier.requiredHeight(dividerHeight).fillMaxWidth().onGloballyPositioned {
-                        assertEquals(
-                            it.size.width,
-                            (columnHeight.roundToPx() - dividerHeight.roundToPx()) / 2
-                        )
-                        positionedLatch.countDown()
+    fun testColumn_withArrangementSpacing() =
+        with(density) {
+            val spacing = 5
+            val childSize = 10
+            testIntrinsics(
+                @Composable {
+                    Column(verticalArrangement = Arrangement.spacedBy(spacing.toDp())) {
+                        Box(Modifier.size(childSize.toDp()))
+                        Box(Modifier.size(childSize.toDp()))
+                        Box(Modifier.size(childSize.toDp()))
                     }
-                ) {}
-                val measurePolicy = object : MeasurePolicy {
-                    override fun MeasureScope.measure(
-                        measurables: List<Measurable>,
-                        constraints: Constraints
-                    ) = layout(constraints.maxHeight / 2, constraints.maxHeight) {}
-
-                    override fun IntrinsicMeasureScope.minIntrinsicWidth(
-                        measurables: List<IntrinsicMeasurable>,
-                        height: Int
-                    ) = height / 2
-
-                    override fun IntrinsicMeasureScope.minIntrinsicHeight(
-                        measurables: List<IntrinsicMeasurable>,
-                        width: Int
-                    ) = columnHeight.roundToPx() / 10
-
-                    override fun IntrinsicMeasureScope.maxIntrinsicWidth(
-                        measurables: List<IntrinsicMeasurable>,
-                        height: Int
-                    ) = height / 2
-
-                    override fun IntrinsicMeasureScope.maxIntrinsicHeight(
-                        measurables: List<IntrinsicMeasurable>,
-                        width: Int
-                    ) = columnHeight.roundToPx() * 2
                 }
-                Layout(
-                    content = {},
-                    measurePolicy = measurePolicy
-                )
+            ) { _, minIntrinsicHeight, _, maxIntrinsicHeight ->
+                assertEquals(childSize * 3 + 2 * spacing, minIntrinsicHeight(Constraints.Infinity))
+                assertEquals(childSize * 3 + 2 * spacing, maxIntrinsicHeight(Constraints.Infinity))
             }
         }
 
-        assertTrue(positionedLatch.await(1, TimeUnit.SECONDS))
-    }
+    @Test
+    fun testColumn_withArrangementSpacing_width() =
+        with(density) {
+            val spacing = 5
+            val columnHeight = 15
+            val latch = CountDownLatch(1)
+            var columnWidth = 0
+            show {
+                Column(
+                    modifier =
+                        Modifier.height(columnHeight.toDp())
+                            .width(IntrinsicSize.Min)
+                            .onSizeChanged {
+                                columnWidth = it.width
+                                latch.countDown()
+                            },
+                    verticalArrangement = Arrangement.spacedBy(spacing.toDp())
+                ) {
+                    Box(Modifier) // Empty box
+                    Box(Modifier.height(columnHeight.toDp()).aspectRatio(1f))
+                }
+            }
+            assertTrue(latch.await(1, TimeUnit.SECONDS))
+            assertEquals(columnHeight - spacing, columnWidth)
+        }
+
+    @Test
+    fun testRow_withWIHOChild_hasCorrectIntrinsicMeasurements() =
+        with(density) {
+            val dividerWidth = 10.dp
+            val rowWidth = 40.dp
+
+            val positionedLatch = CountDownLatch(1)
+            show {
+                Row(Modifier.requiredWidth(rowWidth).height(IntrinsicSize.Min)) {
+                    Container(
+                        Modifier.requiredWidth(dividerWidth).fillMaxHeight().onGloballyPositioned {
+                            assertEquals(
+                                it.size.height,
+                                (rowWidth.roundToPx() - dividerWidth.roundToPx()) / 2
+                            )
+                            positionedLatch.countDown()
+                        }
+                    ) {}
+                    val measurePolicy =
+                        object : MeasurePolicy {
+                            override fun MeasureScope.measure(
+                                measurables: List<Measurable>,
+                                constraints: Constraints
+                            ) = layout(constraints.maxWidth, constraints.maxWidth / 2) {}
+
+                            override fun IntrinsicMeasureScope.minIntrinsicWidth(
+                                measurables: List<IntrinsicMeasurable>,
+                                height: Int
+                            ) = rowWidth.roundToPx() / 10
+
+                            override fun IntrinsicMeasureScope.minIntrinsicHeight(
+                                measurables: List<IntrinsicMeasurable>,
+                                width: Int
+                            ) = width / 2
+
+                            override fun IntrinsicMeasureScope.maxIntrinsicWidth(
+                                measurables: List<IntrinsicMeasurable>,
+                                height: Int
+                            ) = rowWidth.roundToPx() * 2
+
+                            override fun IntrinsicMeasureScope.maxIntrinsicHeight(
+                                measurables: List<IntrinsicMeasurable>,
+                                width: Int
+                            ) = width / 2
+                        }
+                    Layout(content = {}, measurePolicy = measurePolicy)
+                }
+            }
+
+            assertTrue(positionedLatch.await(1, TimeUnit.SECONDS))
+        }
+
+    @Test
+    fun testColumn_withHIWOChild_hasCorrectIntrinsicMeasurements() =
+        with(density) {
+            val dividerHeight = 10.dp
+            val columnHeight = 40.dp
+
+            val positionedLatch = CountDownLatch(1)
+            show {
+                Column(Modifier.requiredHeight(columnHeight).width(IntrinsicSize.Min)) {
+                    Container(
+                        Modifier.requiredHeight(dividerHeight).fillMaxWidth().onGloballyPositioned {
+                            assertEquals(
+                                it.size.width,
+                                (columnHeight.roundToPx() - dividerHeight.roundToPx()) / 2
+                            )
+                            positionedLatch.countDown()
+                        }
+                    ) {}
+                    val measurePolicy =
+                        object : MeasurePolicy {
+                            override fun MeasureScope.measure(
+                                measurables: List<Measurable>,
+                                constraints: Constraints
+                            ) = layout(constraints.maxHeight / 2, constraints.maxHeight) {}
+
+                            override fun IntrinsicMeasureScope.minIntrinsicWidth(
+                                measurables: List<IntrinsicMeasurable>,
+                                height: Int
+                            ) = height / 2
+
+                            override fun IntrinsicMeasureScope.minIntrinsicHeight(
+                                measurables: List<IntrinsicMeasurable>,
+                                width: Int
+                            ) = columnHeight.roundToPx() / 10
+
+                            override fun IntrinsicMeasureScope.maxIntrinsicWidth(
+                                measurables: List<IntrinsicMeasurable>,
+                                height: Int
+                            ) = height / 2
+
+                            override fun IntrinsicMeasureScope.maxIntrinsicHeight(
+                                measurables: List<IntrinsicMeasurable>,
+                                width: Int
+                            ) = columnHeight.roundToPx() * 2
+                        }
+                    Layout(content = {}, measurePolicy = measurePolicy)
+                }
+            }
+
+            assertTrue(positionedLatch.await(1, TimeUnit.SECONDS))
+        }
 
     @Test
     fun scenarioShouldNotCrash() {
@@ -4668,805 +4421,700 @@
 
     // region Modifiers specific tests
     @Test
-    fun testRowColumnModifiersChain_leftMostWins() = with(density) {
-        val positionedLatch = CountDownLatch(1)
-        val containerHeight = Ref<Int>()
-        val columnHeight = 24
+    fun testRowColumnModifiersChain_leftMostWins() =
+        with(density) {
+            val positionedLatch = CountDownLatch(1)
+            val containerHeight = Ref<Int>()
+            val columnHeight = 24
 
-        show {
-            Box {
-                Column(Modifier.height(columnHeight.toDp())) {
-                    Container(
-                        Modifier.weight(2f)
-                            .weight(1f)
-                            .onGloballyPositioned { coordinates ->
+            show {
+                Box {
+                    Column(Modifier.height(columnHeight.toDp())) {
+                        Container(
+                            Modifier.weight(2f).weight(1f).onGloballyPositioned { coordinates ->
                                 containerHeight.value = coordinates.size.height
                                 positionedLatch.countDown()
                             },
-                        content = {}
-                    )
-                    Container(Modifier.weight(1f), content = {})
+                            content = {}
+                        )
+                        Container(Modifier.weight(1f), content = {})
+                    }
                 }
             }
+
+            assertTrue(positionedLatch.await(1, TimeUnit.SECONDS))
+
+            assertNotNull(containerHeight.value)
+            assertEquals(columnHeight * 2 / 3, containerHeight.value)
         }
 
-        assertTrue(positionedLatch.await(1, TimeUnit.SECONDS))
-
-        assertNotNull(containerHeight.value)
-        assertEquals(columnHeight * 2 / 3, containerHeight.value)
-    }
-
     @Test
-    fun testAlignByModifiersChain_leftMostWins() = with(density) {
-        val positionedLatch = CountDownLatch(1)
-        val containerSize = Ref<IntSize>()
-        val containerPosition = Ref<Offset>()
-        val size = 40.dp
+    fun testAlignByModifiersChain_leftMostWins() =
+        with(density) {
+            val positionedLatch = CountDownLatch(1)
+            val containerSize = Ref<IntSize>()
+            val containerPosition = Ref<Offset>()
+            val size = 40.dp
 
-        show {
-            Row {
-                Container(
-                    modifier = Modifier.alignBy { it.measuredHeight },
-                    width = size,
-                    height = size,
-                    content = {}
-                )
-                Container(
-                    modifier = Modifier.alignBy { 0 }
-                        .alignBy { it.measuredHeight / 2 }
-                        .onGloballyPositioned { coordinates ->
-                            containerSize.value = coordinates.size
-                            containerPosition.value = coordinates.positionInRoot()
-                            positionedLatch.countDown()
-                        },
-                    width = size,
-                    height = size,
-                    content = {}
-                )
+            show {
+                Row {
+                    Container(
+                        modifier = Modifier.alignBy { it.measuredHeight },
+                        width = size,
+                        height = size,
+                        content = {}
+                    )
+                    Container(
+                        modifier =
+                            Modifier.alignBy { 0 }
+                                .alignBy { it.measuredHeight / 2 }
+                                .onGloballyPositioned { coordinates ->
+                                    containerSize.value = coordinates.size
+                                    containerPosition.value = coordinates.positionInRoot()
+                                    positionedLatch.countDown()
+                                },
+                        width = size,
+                        height = size,
+                        content = {}
+                    )
+                }
             }
+
+            assertTrue(positionedLatch.await(1, TimeUnit.SECONDS))
+
+            assertNotNull(containerSize)
+            assertEquals(Offset(size.toPx(), size.toPx()), containerPosition.value)
         }
 
-        assertTrue(positionedLatch.await(1, TimeUnit.SECONDS))
-
-        assertNotNull(containerSize)
-        assertEquals(Offset(size.toPx(), size.toPx()), containerPosition.value)
-    }
     // endregion
 
     // region Rtl tests
     @Test
-    fun testRow_Rtl_arrangementStart() = with(density) {
-        val sizeDp = 35.toDp()
-        val size = sizeDp.roundToPx()
+    fun testRow_Rtl_arrangementStart() =
+        with(density) {
+            val sizeDp = 35.toDp()
+            val size = sizeDp.roundToPx()
 
-        val drawLatch = CountDownLatch(2)
-        val childPosition = arrayOf(Offset.Zero, Offset.Zero)
-        show {
-            DeviceConfigurationOverride(
-                DeviceConfigurationOverride.LayoutDirection(LayoutDirection.Rtl)
-            ) {
-                Row(Modifier.fillMaxWidth()) {
-                    Container(
-                        Modifier.size(sizeDp).onGloballyPositioned { coordinates ->
-                            childPosition[0] = coordinates.positionInRoot()
-                            drawLatch.countDown()
-                        }
-                    ) {
-                    }
+            val drawLatch = CountDownLatch(2)
+            val childPosition = arrayOf(Offset.Zero, Offset.Zero)
+            show {
+                DeviceConfigurationOverride(
+                    DeviceConfigurationOverride.LayoutDirection(LayoutDirection.Rtl)
+                ) {
+                    Row(Modifier.fillMaxWidth()) {
+                        Container(
+                            Modifier.size(sizeDp).onGloballyPositioned { coordinates ->
+                                childPosition[0] = coordinates.positionInRoot()
+                                drawLatch.countDown()
+                            }
+                        ) {}
 
-                    Container(
-                        Modifier.size(sizeDp * 2)
-                            .onGloballyPositioned { coordinates ->
+                        Container(
+                            Modifier.size(sizeDp * 2).onGloballyPositioned { coordinates ->
                                 childPosition[1] = coordinates.positionInRoot()
                                 drawLatch.countDown()
                             }
-                    ) {
+                        ) {}
                     }
                 }
             }
+
+            assertTrue(drawLatch.await(1, TimeUnit.SECONDS))
+            val root = findComposeView()
+            waitForDraw(root)
+            val rootWidth = root.width
+
+            assertEquals(Offset((rootWidth - size.toFloat()), 0f), childPosition[0])
+            assertEquals(
+                Offset((rootWidth - (sizeDp.toPx() * 3f).roundToInt()).toFloat(), 0f),
+                childPosition[1]
+            )
         }
 
-        assertTrue(drawLatch.await(1, TimeUnit.SECONDS))
-        val root = findComposeView()
-        waitForDraw(root)
-        val rootWidth = root.width
-
-        assertEquals(Offset((rootWidth - size.toFloat()), 0f), childPosition[0])
-        assertEquals(
-            Offset((rootWidth - (sizeDp.toPx() * 3f).roundToInt()).toFloat(), 0f),
-            childPosition[1]
-        )
-    }
-
     @Test
-    fun testRow_Rtl_arrangementCenter() = with(density) {
-        val size = 100
-        val sizeDp = size.toDp()
+    fun testRow_Rtl_arrangementCenter() =
+        with(density) {
+            val size = 100
+            val sizeDp = size.toDp()
 
-        val drawLatch = CountDownLatch(4)
-        val childPosition = Array(3) { Offset.Zero }
-        val childLayoutCoordinates = arrayOfNulls<LayoutCoordinates?>(childPosition.size)
-        var parentLayoutCoordinates: LayoutCoordinates? = null
-        show {
-            DeviceConfigurationOverride(
-                DeviceConfigurationOverride.LayoutDirection(LayoutDirection.Rtl)
-            ) {
-                Row(
-                    modifier = Modifier
-                        .fillMaxWidth()
-                        .onGloballyPositioned { coordinates ->
-                            parentLayoutCoordinates = coordinates
-                            drawLatch.countDown()
-                        },
-                    horizontalArrangement = Arrangement.Center
+            val drawLatch = CountDownLatch(4)
+            val childPosition = Array(3) { Offset.Zero }
+            val childLayoutCoordinates = arrayOfNulls<LayoutCoordinates?>(childPosition.size)
+            var parentLayoutCoordinates: LayoutCoordinates? = null
+            show {
+                DeviceConfigurationOverride(
+                    DeviceConfigurationOverride.LayoutDirection(LayoutDirection.Rtl)
                 ) {
-                    for (i in 0 until childPosition.size) {
-                        Container(
-                            width = sizeDp,
-                            height = sizeDp,
-                            modifier = Modifier.onGloballyPositioned { coordinates ->
-                                childLayoutCoordinates[i] = coordinates
-                                drawLatch.countDown()
-                            },
-                            content = {}
-                        )
-                    }
-                }
-            }
-        }
-        assertTrue(drawLatch.await(1, TimeUnit.SECONDS))
-
-        calculateChildPositions(childPosition, parentLayoutCoordinates, childLayoutCoordinates)
-
-        val root = findComposeView()
-        waitForDraw(root)
-
-        val extraSpace = root.width - size * 3
-        assertEquals(
-            Offset(
-                ((extraSpace / 2f) + size.toFloat() * 2).roundToInt().toFloat(),
-                0f
-            ),
-            childPosition[0]
-        )
-        assertEquals(
-            Offset(((extraSpace / 2f) + size.toFloat()).roundToInt().toFloat(), 0f),
-            childPosition[1]
-        )
-        assertEquals(Offset((extraSpace / 2f).roundToInt().toFloat(), 0f), childPosition[2])
-    }
-
-    @Test
-    fun testRow_Rtl_arrangementSpaceEvenly() = with(density) {
-        val size = 100
-        val sizeDp = size.toDp()
-
-        val drawLatch = CountDownLatch(4)
-        val childPosition = Array(3) { Offset.Zero }
-        val childLayoutCoordinates = arrayOfNulls<LayoutCoordinates?>(childPosition.size)
-        var parentLayoutCoordinates: LayoutCoordinates? = null
-        show {
-            DeviceConfigurationOverride(
-                DeviceConfigurationOverride.LayoutDirection(LayoutDirection.Rtl)
-            ) {
-                Row(
-                    modifier = Modifier
-                        .fillMaxWidth()
-                        .onGloballyPositioned { coordinates ->
-                            parentLayoutCoordinates = coordinates
-                            drawLatch.countDown()
-                        },
-                    horizontalArrangement = Arrangement.SpaceEvenly
-                ) {
-                    for (i in childPosition.indices) {
-                        Container(
-                            width = sizeDp,
-                            height = sizeDp,
-                            modifier = Modifier.onGloballyPositioned { coordinates ->
-                                childLayoutCoordinates[i] = coordinates
-                                drawLatch.countDown()
-                            },
-                            content = {}
-                        )
-                    }
-                }
-            }
-        }
-        assertTrue(drawLatch.await(1, TimeUnit.SECONDS))
-
-        calculateChildPositions(childPosition, parentLayoutCoordinates, childLayoutCoordinates)
-
-        val root = findComposeView()
-        waitForDraw(root)
-
-        val gap = (root.width - size.toFloat() * 3f) / 4f
-        assertEquals(
-            Offset((size.toFloat() * 2f + gap * 3f).roundToInt().toFloat(), 0f),
-            childPosition[0]
-        )
-        assertEquals(
-            Offset((size.toFloat() + gap * 2f).roundToInt().toFloat(), 0f),
-            childPosition[1]
-        )
-        assertEquals(
-            Offset(gap.roundToInt().toFloat(), 0f), childPosition[2]
-        )
-    }
-
-    @Test
-    fun testRow_Rtl_arrangementSpaceBetween_singleItem() = with(density) {
-        val size = 100
-        val sizeDp = size.toDp()
-
-        val drawLatch = CountDownLatch(2)
-        val childPosition = Array(1) { Offset.Zero }
-        val childLayoutCoordinates = arrayOfNulls<LayoutCoordinates?>(childPosition.size)
-        var parentLayoutCoordinates: LayoutCoordinates? = null
-        show {
-            DeviceConfigurationOverride(
-                DeviceConfigurationOverride.LayoutDirection(LayoutDirection.Rtl)
-            ) {
-                Row(
-                    modifier = Modifier
-                        .fillMaxWidth()
-                        .onGloballyPositioned { coordinates ->
-                            parentLayoutCoordinates = coordinates
-                            drawLatch.countDown()
-                        },
-                    horizontalArrangement = Arrangement.SpaceBetween
-                ) {
-                    for (i in childPosition.indices) {
-                        Container(
-                            width = sizeDp,
-                            height = sizeDp,
-                            modifier = Modifier.onGloballyPositioned { coordinates ->
-                                childLayoutCoordinates[i] = coordinates
-                                drawLatch.countDown()
-                            },
-                            content = {}
-                        )
-                    }
-                }
-            }
-        }
-        assertTrue(drawLatch.await(1, TimeUnit.SECONDS))
-
-        calculateChildPositions(childPosition, parentLayoutCoordinates, childLayoutCoordinates)
-
-        val root = findComposeView()
-        waitForDraw(root)
-
-        val gap = root.width - size.toFloat()
-        assertEquals(
-            Offset(gap, 0f),
-            childPosition[0]
-        )
-    }
-
-    @Test
-    fun testRow_Rtl_arrangementSpaceBetween_multipleItems() = with(density) {
-        val size = 100
-        val sizeDp = size.toDp()
-
-        val drawLatch = CountDownLatch(4)
-        val childPosition = Array(3) { Offset.Zero }
-        val childLayoutCoordinates = arrayOfNulls<LayoutCoordinates?>(childPosition.size)
-        var parentLayoutCoordinates: LayoutCoordinates? = null
-        show {
-            DeviceConfigurationOverride(
-                DeviceConfigurationOverride.LayoutDirection(LayoutDirection.Rtl)
-            ) {
-                Row(
-                    modifier = Modifier
-                        .fillMaxWidth()
-                        .onGloballyPositioned { coordinates ->
-                            parentLayoutCoordinates = coordinates
-                            drawLatch.countDown()
-                        },
-                    horizontalArrangement = Arrangement.SpaceBetween
-                ) {
-                    for (i in childPosition.indices) {
-                        Container(
-                            width = sizeDp,
-                            height = sizeDp,
-                            modifier = Modifier.onGloballyPositioned { coordinates ->
-                                childLayoutCoordinates[i] = coordinates
-                                drawLatch.countDown()
-                            },
-                            content = {}
-                        )
-                    }
-                }
-            }
-        }
-        assertTrue(drawLatch.await(1, TimeUnit.SECONDS))
-
-        calculateChildPositions(childPosition, parentLayoutCoordinates, childLayoutCoordinates)
-
-        val root = findComposeView()
-        waitForDraw(root)
-
-        val gap = (root.width - size.toFloat() * 3) / 2
-        assertEquals(
-            Offset((gap * 2 + size.toFloat() * 2).roundToInt().toFloat(), 0f),
-            childPosition[0]
-        )
-        assertEquals(
-            Offset((gap + size.toFloat()).roundToInt().toFloat(), 0f),
-            childPosition[1]
-        )
-        assertEquals(Offset(0f, 0f), childPosition[2])
-    }
-
-    @Test
-    fun testRow_Rtl_arrangementSpaceAround() = with(density) {
-        val size = 100
-        val sizeDp = size.toDp()
-
-        val drawLatch = CountDownLatch(4)
-        val childPosition = Array(3) { Offset.Zero }
-        val childLayoutCoordinates = arrayOfNulls<LayoutCoordinates?>(childPosition.size)
-        var parentLayoutCoordinates: LayoutCoordinates? = null
-        show {
-            DeviceConfigurationOverride(
-                DeviceConfigurationOverride.LayoutDirection(LayoutDirection.Rtl)
-            ) {
-                Row(
-                    modifier = Modifier
-                        .fillMaxWidth()
-                        .onGloballyPositioned { coordinates ->
-                            parentLayoutCoordinates = coordinates
-                            drawLatch.countDown()
-                        },
-                    horizontalArrangement = Arrangement.SpaceAround
-                ) {
-                    for (i in 0 until childPosition.size) {
-                        Container(
-                            width = sizeDp,
-                            height = sizeDp,
-                            modifier = Modifier.onGloballyPositioned { coordinates ->
-                                childLayoutCoordinates[i] = coordinates
-                                drawLatch.countDown()
-                            },
-                            content = {}
-                        )
-                    }
-                }
-            }
-        }
-        assertTrue(drawLatch.await(1, TimeUnit.SECONDS))
-
-        calculateChildPositions(childPosition, parentLayoutCoordinates, childLayoutCoordinates)
-
-        val root = findComposeView()
-        waitForDraw(root)
-
-        val gap = (root.width.toFloat() - size * 3) / 3
-        assertEquals(
-            Offset(((gap * 5 / 2) + size.toFloat() * 2).roundToInt().toFloat(), 0f),
-            childPosition[0]
-        )
-        assertEquals(
-            Offset(((gap * 3 / 2) + size.toFloat()).roundToInt().toFloat(), 0f),
-            childPosition[1]
-        )
-        assertEquals(Offset((gap / 2f).roundToInt().toFloat(), 0f), childPosition[2])
-    }
-
-    @Test
-    fun testRow_Rtl_arrangementEnd() = with(density) {
-        val sizeDp = 35.toDp()
-
-        val drawLatch = CountDownLatch(2)
-        val childPosition = arrayOf(Offset.Zero, Offset.Zero)
-        show {
-            DeviceConfigurationOverride(
-                DeviceConfigurationOverride.LayoutDirection(LayoutDirection.Rtl)
-            ) {
-                Row(
-                    Modifier.fillMaxWidth(),
-                    horizontalArrangement = Arrangement.End
-                ) {
-                    Container(
-                        Modifier.size(sizeDp).onGloballyPositioned { coordinates ->
-                            childPosition[0] = coordinates.positionInRoot()
-                            drawLatch.countDown()
-                        }
-                    ) {
-                    }
-
-                    Container(
-                        Modifier.size(sizeDp * 2)
-                            .onGloballyPositioned { coordinates ->
-                                childPosition[1] = coordinates.positionInRoot()
-                                drawLatch.countDown()
-                            }
-                    ) {
-                    }
-                }
-            }
-        }
-
-        assertTrue(drawLatch.await(1, TimeUnit.SECONDS))
-
-        assertEquals(
-            Offset(
-                (sizeDp.toPx() * 2).roundToInt().toFloat(),
-                0f
-            ),
-            childPosition[0]
-        )
-        assertEquals(Offset(0f, 0f), childPosition[1])
-    }
-
-    @Test
-    fun testRow_Rtl_withSpacedByAlignedArrangement() = with(density) {
-        val spacePx = 10f
-        val space = spacePx.toDp()
-        val sizePx = 20f
-        val size = sizePx.toDp()
-        val rowSizePx = 50
-        val rowSize = rowSizePx.toDp()
-        val latch = CountDownLatch(3)
-        show {
-            DeviceConfigurationOverride(
-                DeviceConfigurationOverride.LayoutDirection(LayoutDirection.Rtl)
-            ) {
-                Column {
                     Row(
-                        horizontalArrangement = Arrangement.spacedBy(space, Alignment.End),
-                        modifier = Modifier.requiredSize(rowSize).onGloballyPositioned {
-                            assertEquals(rowSizePx, it.size.width)
-                            latch.countDown()
-                        }
-                    ) {
-                        Box(
-                            Modifier.requiredSize(size).onGloballyPositioned {
-                                assertEquals(sizePx + spacePx, it.positionInParent().x)
-                                latch.countDown()
-                            }
-                        )
-                        Box(
-                            Modifier.requiredSize(size).onGloballyPositioned {
-                                assertEquals(0f, it.positionInParent().x)
-                                latch.countDown()
-                            }
-                        )
-                    }
-                }
-            }
-        }
-        assertTrue(latch.await(1, TimeUnit.SECONDS))
-    }
-
-    @Test
-    fun testColumn_Rtl_gravityStart() = with(density) {
-        val sizeDp = 35.toDp()
-        val size = sizeDp.roundToPx()
-
-        val drawLatch = CountDownLatch(2)
-        val childPosition = arrayOf(Offset.Zero, Offset.Zero)
-        show {
-            DeviceConfigurationOverride(
-                DeviceConfigurationOverride.LayoutDirection(LayoutDirection.Rtl)
-            ) {
-                Column(Modifier.fillMaxWidth()) {
-                    Container(
-                        Modifier.size(sizeDp).onGloballyPositioned { coordinates ->
-                            childPosition[0] = coordinates.positionInRoot()
-                            drawLatch.countDown()
-                        }
-                    ) {
-                    }
-
-                    Container(
-                        Modifier.size(sizeDp * 2)
-                            .onGloballyPositioned { coordinates ->
-                                childPosition[1] = coordinates.positionInRoot()
+                        modifier =
+                            Modifier.fillMaxWidth().onGloballyPositioned { coordinates ->
+                                parentLayoutCoordinates = coordinates
                                 drawLatch.countDown()
-                            }
+                            },
+                        horizontalArrangement = Arrangement.Center
                     ) {
+                        for (i in 0 until childPosition.size) {
+                            Container(
+                                width = sizeDp,
+                                height = sizeDp,
+                                modifier =
+                                    Modifier.onGloballyPositioned { coordinates ->
+                                        childLayoutCoordinates[i] = coordinates
+                                        drawLatch.countDown()
+                                    },
+                                content = {}
+                            )
+                        }
                     }
                 }
             }
+            assertTrue(drawLatch.await(1, TimeUnit.SECONDS))
+
+            calculateChildPositions(childPosition, parentLayoutCoordinates, childLayoutCoordinates)
+
+            val root = findComposeView()
+            waitForDraw(root)
+
+            val extraSpace = root.width - size * 3
+            assertEquals(
+                Offset(((extraSpace / 2f) + size.toFloat() * 2).roundToInt().toFloat(), 0f),
+                childPosition[0]
+            )
+            assertEquals(
+                Offset(((extraSpace / 2f) + size.toFloat()).roundToInt().toFloat(), 0f),
+                childPosition[1]
+            )
+            assertEquals(Offset((extraSpace / 2f).roundToInt().toFloat(), 0f), childPosition[2])
         }
 
-        assertTrue(drawLatch.await(1, TimeUnit.SECONDS))
-        val root = findComposeView()
-        waitForDraw(root)
-        val rootWidth = root.width
+    @Test
+    fun testRow_Rtl_arrangementSpaceEvenly() =
+        with(density) {
+            val size = 100
+            val sizeDp = size.toDp()
 
-        assertEquals(Offset((rootWidth - size.toFloat()), 0f), childPosition[0])
-        assertEquals(
-            Offset(
-                (rootWidth - (sizeDp * 2f).toPx()).roundToInt().toFloat(),
-                size.toFloat()
-            ),
-            childPosition[1]
-        )
-    }
+            val drawLatch = CountDownLatch(4)
+            val childPosition = Array(3) { Offset.Zero }
+            val childLayoutCoordinates = arrayOfNulls<LayoutCoordinates?>(childPosition.size)
+            var parentLayoutCoordinates: LayoutCoordinates? = null
+            show {
+                DeviceConfigurationOverride(
+                    DeviceConfigurationOverride.LayoutDirection(LayoutDirection.Rtl)
+                ) {
+                    Row(
+                        modifier =
+                            Modifier.fillMaxWidth().onGloballyPositioned { coordinates ->
+                                parentLayoutCoordinates = coordinates
+                                drawLatch.countDown()
+                            },
+                        horizontalArrangement = Arrangement.SpaceEvenly
+                    ) {
+                        for (i in childPosition.indices) {
+                            Container(
+                                width = sizeDp,
+                                height = sizeDp,
+                                modifier =
+                                    Modifier.onGloballyPositioned { coordinates ->
+                                        childLayoutCoordinates[i] = coordinates
+                                        drawLatch.countDown()
+                                    },
+                                content = {}
+                            )
+                        }
+                    }
+                }
+            }
+            assertTrue(drawLatch.await(1, TimeUnit.SECONDS))
+
+            calculateChildPositions(childPosition, parentLayoutCoordinates, childLayoutCoordinates)
+
+            val root = findComposeView()
+            waitForDraw(root)
+
+            val gap = (root.width - size.toFloat() * 3f) / 4f
+            assertEquals(
+                Offset((size.toFloat() * 2f + gap * 3f).roundToInt().toFloat(), 0f),
+                childPosition[0]
+            )
+            assertEquals(
+                Offset((size.toFloat() + gap * 2f).roundToInt().toFloat(), 0f),
+                childPosition[1]
+            )
+            assertEquals(Offset(gap.roundToInt().toFloat(), 0f), childPosition[2])
+        }
 
     @Test
-    fun testColumn_Rtl_gravityEnd() = with(density) {
-        val sizeDp = 50.toDp()
-        val size = sizeDp.roundToPx()
+    fun testRow_Rtl_arrangementSpaceBetween_singleItem() =
+        with(density) {
+            val size = 100
+            val sizeDp = size.toDp()
 
-        val drawLatch = CountDownLatch(2)
-        val childPosition = arrayOf(Offset.Zero, Offset.Zero)
-        show {
-            DeviceConfigurationOverride(
-                DeviceConfigurationOverride.LayoutDirection(LayoutDirection.Rtl)
-            ) {
-                Column(Modifier.fillMaxWidth()) {
-                    Container(
-                        Modifier.size(sizeDp)
-                            .align(Alignment.End)
-                            .onGloballyPositioned { coordinates ->
+            val drawLatch = CountDownLatch(2)
+            val childPosition = Array(1) { Offset.Zero }
+            val childLayoutCoordinates = arrayOfNulls<LayoutCoordinates?>(childPosition.size)
+            var parentLayoutCoordinates: LayoutCoordinates? = null
+            show {
+                DeviceConfigurationOverride(
+                    DeviceConfigurationOverride.LayoutDirection(LayoutDirection.Rtl)
+                ) {
+                    Row(
+                        modifier =
+                            Modifier.fillMaxWidth().onGloballyPositioned { coordinates ->
+                                parentLayoutCoordinates = coordinates
+                                drawLatch.countDown()
+                            },
+                        horizontalArrangement = Arrangement.SpaceBetween
+                    ) {
+                        for (i in childPosition.indices) {
+                            Container(
+                                width = sizeDp,
+                                height = sizeDp,
+                                modifier =
+                                    Modifier.onGloballyPositioned { coordinates ->
+                                        childLayoutCoordinates[i] = coordinates
+                                        drawLatch.countDown()
+                                    },
+                                content = {}
+                            )
+                        }
+                    }
+                }
+            }
+            assertTrue(drawLatch.await(1, TimeUnit.SECONDS))
+
+            calculateChildPositions(childPosition, parentLayoutCoordinates, childLayoutCoordinates)
+
+            val root = findComposeView()
+            waitForDraw(root)
+
+            val gap = root.width - size.toFloat()
+            assertEquals(Offset(gap, 0f), childPosition[0])
+        }
+
+    @Test
+    fun testRow_Rtl_arrangementSpaceBetween_multipleItems() =
+        with(density) {
+            val size = 100
+            val sizeDp = size.toDp()
+
+            val drawLatch = CountDownLatch(4)
+            val childPosition = Array(3) { Offset.Zero }
+            val childLayoutCoordinates = arrayOfNulls<LayoutCoordinates?>(childPosition.size)
+            var parentLayoutCoordinates: LayoutCoordinates? = null
+            show {
+                DeviceConfigurationOverride(
+                    DeviceConfigurationOverride.LayoutDirection(LayoutDirection.Rtl)
+                ) {
+                    Row(
+                        modifier =
+                            Modifier.fillMaxWidth().onGloballyPositioned { coordinates ->
+                                parentLayoutCoordinates = coordinates
+                                drawLatch.countDown()
+                            },
+                        horizontalArrangement = Arrangement.SpaceBetween
+                    ) {
+                        for (i in childPosition.indices) {
+                            Container(
+                                width = sizeDp,
+                                height = sizeDp,
+                                modifier =
+                                    Modifier.onGloballyPositioned { coordinates ->
+                                        childLayoutCoordinates[i] = coordinates
+                                        drawLatch.countDown()
+                                    },
+                                content = {}
+                            )
+                        }
+                    }
+                }
+            }
+            assertTrue(drawLatch.await(1, TimeUnit.SECONDS))
+
+            calculateChildPositions(childPosition, parentLayoutCoordinates, childLayoutCoordinates)
+
+            val root = findComposeView()
+            waitForDraw(root)
+
+            val gap = (root.width - size.toFloat() * 3) / 2
+            assertEquals(
+                Offset((gap * 2 + size.toFloat() * 2).roundToInt().toFloat(), 0f),
+                childPosition[0]
+            )
+            assertEquals(
+                Offset((gap + size.toFloat()).roundToInt().toFloat(), 0f),
+                childPosition[1]
+            )
+            assertEquals(Offset(0f, 0f), childPosition[2])
+        }
+
+    @Test
+    fun testRow_Rtl_arrangementSpaceAround() =
+        with(density) {
+            val size = 100
+            val sizeDp = size.toDp()
+
+            val drawLatch = CountDownLatch(4)
+            val childPosition = Array(3) { Offset.Zero }
+            val childLayoutCoordinates = arrayOfNulls<LayoutCoordinates?>(childPosition.size)
+            var parentLayoutCoordinates: LayoutCoordinates? = null
+            show {
+                DeviceConfigurationOverride(
+                    DeviceConfigurationOverride.LayoutDirection(LayoutDirection.Rtl)
+                ) {
+                    Row(
+                        modifier =
+                            Modifier.fillMaxWidth().onGloballyPositioned { coordinates ->
+                                parentLayoutCoordinates = coordinates
+                                drawLatch.countDown()
+                            },
+                        horizontalArrangement = Arrangement.SpaceAround
+                    ) {
+                        for (i in 0 until childPosition.size) {
+                            Container(
+                                width = sizeDp,
+                                height = sizeDp,
+                                modifier =
+                                    Modifier.onGloballyPositioned { coordinates ->
+                                        childLayoutCoordinates[i] = coordinates
+                                        drawLatch.countDown()
+                                    },
+                                content = {}
+                            )
+                        }
+                    }
+                }
+            }
+            assertTrue(drawLatch.await(1, TimeUnit.SECONDS))
+
+            calculateChildPositions(childPosition, parentLayoutCoordinates, childLayoutCoordinates)
+
+            val root = findComposeView()
+            waitForDraw(root)
+
+            val gap = (root.width.toFloat() - size * 3) / 3
+            assertEquals(
+                Offset(((gap * 5 / 2) + size.toFloat() * 2).roundToInt().toFloat(), 0f),
+                childPosition[0]
+            )
+            assertEquals(
+                Offset(((gap * 3 / 2) + size.toFloat()).roundToInt().toFloat(), 0f),
+                childPosition[1]
+            )
+            assertEquals(Offset((gap / 2f).roundToInt().toFloat(), 0f), childPosition[2])
+        }
+
+    @Test
+    fun testRow_Rtl_arrangementEnd() =
+        with(density) {
+            val sizeDp = 35.toDp()
+
+            val drawLatch = CountDownLatch(2)
+            val childPosition = arrayOf(Offset.Zero, Offset.Zero)
+            show {
+                DeviceConfigurationOverride(
+                    DeviceConfigurationOverride.LayoutDirection(LayoutDirection.Rtl)
+                ) {
+                    Row(Modifier.fillMaxWidth(), horizontalArrangement = Arrangement.End) {
+                        Container(
+                            Modifier.size(sizeDp).onGloballyPositioned { coordinates ->
                                 childPosition[0] = coordinates.positionInRoot()
                                 drawLatch.countDown()
                             }
-                    ) {
-                    }
+                        ) {}
 
-                    Container(
-                        Modifier.size(sizeDp * 2)
-                            .align(Alignment.End)
-                            .onGloballyPositioned { coordinates ->
+                        Container(
+                            Modifier.size(sizeDp * 2).onGloballyPositioned { coordinates ->
                                 childPosition[1] = coordinates.positionInRoot()
                                 drawLatch.countDown()
                             }
-                    ) {
+                        ) {}
                     }
                 }
             }
+
+            assertTrue(drawLatch.await(1, TimeUnit.SECONDS))
+
+            assertEquals(Offset((sizeDp.toPx() * 2).roundToInt().toFloat(), 0f), childPosition[0])
+            assertEquals(Offset(0f, 0f), childPosition[1])
         }
 
-        assertTrue(drawLatch.await(1, TimeUnit.SECONDS))
-
-        assertEquals(Offset(0f, 0f), childPosition[0])
-        assertEquals(Offset(0f, size.toFloat()), childPosition[1])
-    }
+    @Test
+    fun testRow_Rtl_withSpacedByAlignedArrangement() =
+        with(density) {
+            val spacePx = 10f
+            val space = spacePx.toDp()
+            val sizePx = 20f
+            val size = sizePx.toDp()
+            val rowSizePx = 50
+            val rowSize = rowSizePx.toDp()
+            val latch = CountDownLatch(3)
+            show {
+                DeviceConfigurationOverride(
+                    DeviceConfigurationOverride.LayoutDirection(LayoutDirection.Rtl)
+                ) {
+                    Column {
+                        Row(
+                            horizontalArrangement = Arrangement.spacedBy(space, Alignment.End),
+                            modifier =
+                                Modifier.requiredSize(rowSize).onGloballyPositioned {
+                                    assertEquals(rowSizePx, it.size.width)
+                                    latch.countDown()
+                                }
+                        ) {
+                            Box(
+                                Modifier.requiredSize(size).onGloballyPositioned {
+                                    assertEquals(sizePx + spacePx, it.positionInParent().x)
+                                    latch.countDown()
+                                }
+                            )
+                            Box(
+                                Modifier.requiredSize(size).onGloballyPositioned {
+                                    assertEquals(0f, it.positionInParent().x)
+                                    latch.countDown()
+                                }
+                            )
+                        }
+                    }
+                }
+            }
+            assertTrue(latch.await(1, TimeUnit.SECONDS))
+        }
 
     @Test
-    fun testColumn_Rtl_gravityAlignBy() = with(density) {
-        val sizeDp = 50.toDp()
-        val size = sizeDp.roundToPx()
+    fun testColumn_Rtl_gravityStart() =
+        with(density) {
+            val sizeDp = 35.toDp()
+            val size = sizeDp.roundToPx()
 
-        val drawLatch = CountDownLatch(2)
-        val childPosition = arrayOf(Offset.Zero, Offset.Zero)
-        show {
-            DeviceConfigurationOverride(
-                DeviceConfigurationOverride.LayoutDirection(LayoutDirection.Rtl)
-            ) {
-                Column(Modifier.fillMaxWidth()) {
-                    Container(
-                        Modifier.size(sizeDp)
-                            .alignBy { it.measuredWidth }
-                            .onGloballyPositioned { coordinates ->
+            val drawLatch = CountDownLatch(2)
+            val childPosition = arrayOf(Offset.Zero, Offset.Zero)
+            show {
+                DeviceConfigurationOverride(
+                    DeviceConfigurationOverride.LayoutDirection(LayoutDirection.Rtl)
+                ) {
+                    Column(Modifier.fillMaxWidth()) {
+                        Container(
+                            Modifier.size(sizeDp).onGloballyPositioned { coordinates ->
                                 childPosition[0] = coordinates.positionInRoot()
                                 drawLatch.countDown()
                             }
-                    ) {
-                    }
+                        ) {}
 
-                    Container(
-                        Modifier.size(sizeDp)
-                            .alignBy { it.measuredHeight / 2 }
-                            .onGloballyPositioned { coordinates ->
+                        Container(
+                            Modifier.size(sizeDp * 2).onGloballyPositioned { coordinates ->
                                 childPosition[1] = coordinates.positionInRoot()
                                 drawLatch.countDown()
                             }
-                    ) {
+                        ) {}
                     }
                 }
             }
+
+            assertTrue(drawLatch.await(1, TimeUnit.SECONDS))
+            val root = findComposeView()
+            waitForDraw(root)
+            val rootWidth = root.width
+
+            assertEquals(Offset((rootWidth - size.toFloat()), 0f), childPosition[0])
+            assertEquals(
+                Offset((rootWidth - (sizeDp * 2f).toPx()).roundToInt().toFloat(), size.toFloat()),
+                childPosition[1]
+            )
         }
 
-        assertTrue(drawLatch.await(1, TimeUnit.SECONDS))
-        val root = findComposeView()
-        waitForDraw(root)
-        val rootWidth = root.width
+    @Test
+    fun testColumn_Rtl_gravityEnd() =
+        with(density) {
+            val sizeDp = 50.toDp()
+            val size = sizeDp.roundToPx()
 
-        assertEquals(
-            Offset((rootWidth - size.toFloat()), 0f),
-            childPosition[0]
-        )
-        assertEquals(
-            Offset(
-                (rootWidth - size.toFloat() * 1.5f).roundToInt().toFloat(),
-                size.toFloat()
-            ),
-            childPosition[1]
-        )
-    }
-    //endregion
+            val drawLatch = CountDownLatch(2)
+            val childPosition = arrayOf(Offset.Zero, Offset.Zero)
+            show {
+                DeviceConfigurationOverride(
+                    DeviceConfigurationOverride.LayoutDirection(LayoutDirection.Rtl)
+                ) {
+                    Column(Modifier.fillMaxWidth()) {
+                        Container(
+                            Modifier.size(sizeDp).align(Alignment.End).onGloballyPositioned {
+                                coordinates ->
+                                childPosition[0] = coordinates.positionInRoot()
+                                drawLatch.countDown()
+                            }
+                        ) {}
+
+                        Container(
+                            Modifier.size(sizeDp * 2).align(Alignment.End).onGloballyPositioned {
+                                coordinates ->
+                                childPosition[1] = coordinates.positionInRoot()
+                                drawLatch.countDown()
+                            }
+                        ) {}
+                    }
+                }
+            }
+
+            assertTrue(drawLatch.await(1, TimeUnit.SECONDS))
+
+            assertEquals(Offset(0f, 0f), childPosition[0])
+            assertEquals(Offset(0f, size.toFloat()), childPosition[1])
+        }
+
+    @Test
+    fun testColumn_Rtl_gravityAlignBy() =
+        with(density) {
+            val sizeDp = 50.toDp()
+            val size = sizeDp.roundToPx()
+
+            val drawLatch = CountDownLatch(2)
+            val childPosition = arrayOf(Offset.Zero, Offset.Zero)
+            show {
+                DeviceConfigurationOverride(
+                    DeviceConfigurationOverride.LayoutDirection(LayoutDirection.Rtl)
+                ) {
+                    Column(Modifier.fillMaxWidth()) {
+                        Container(
+                            Modifier.size(sizeDp)
+                                .alignBy { it.measuredWidth }
+                                .onGloballyPositioned { coordinates ->
+                                    childPosition[0] = coordinates.positionInRoot()
+                                    drawLatch.countDown()
+                                }
+                        ) {}
+
+                        Container(
+                            Modifier.size(sizeDp)
+                                .alignBy { it.measuredHeight / 2 }
+                                .onGloballyPositioned { coordinates ->
+                                    childPosition[1] = coordinates.positionInRoot()
+                                    drawLatch.countDown()
+                                }
+                        ) {}
+                    }
+                }
+            }
+
+            assertTrue(drawLatch.await(1, TimeUnit.SECONDS))
+            val root = findComposeView()
+            waitForDraw(root)
+            val rootWidth = root.width
+
+            assertEquals(Offset((rootWidth - size.toFloat()), 0f), childPosition[0])
+            assertEquals(
+                Offset((rootWidth - size.toFloat() * 1.5f).roundToInt().toFloat(), size.toFloat()),
+                childPosition[1]
+            )
+        }
+
+    // endregion
 
     // region AbsoluteArrangement tests
     @Test
-    fun testRow_absoluteArrangementLeft() = with(density) {
-        val size = 100
-        val sizeDp = size.toDp()
+    fun testRow_absoluteArrangementLeft() =
+        with(density) {
+            val size = 100
+            val sizeDp = size.toDp()
 
-        val drawLatch = CountDownLatch(4)
-        val childPosition = Array(3) { Offset.Zero }
-        val childLayoutCoordinates =
-            arrayOfNulls<LayoutCoordinates?>(childPosition.size)
-        var parentLayoutCoordinates: LayoutCoordinates? = null
-        show {
-            Row(
-                Modifier
-                    .fillMaxWidth()
-                    .onGloballyPositioned { coordinates ->
+            val drawLatch = CountDownLatch(4)
+            val childPosition = Array(3) { Offset.Zero }
+            val childLayoutCoordinates = arrayOfNulls<LayoutCoordinates?>(childPosition.size)
+            var parentLayoutCoordinates: LayoutCoordinates? = null
+            show {
+                Row(
+                    Modifier.fillMaxWidth().onGloballyPositioned { coordinates ->
                         parentLayoutCoordinates = coordinates
                         drawLatch.countDown()
                     },
-                horizontalArrangement = Arrangement.Absolute.Left
-            ) {
-                for (i in childPosition.indices) {
-                    Container(
-                        width = sizeDp,
-                        height = sizeDp,
-                        modifier = Modifier.onGloballyPositioned { coordinates ->
-                            childLayoutCoordinates[i] = coordinates
-                            drawLatch.countDown()
-                        },
-                        content = {}
-                    )
-                }
-            }
-        }
-        assertTrue(drawLatch.await(1, TimeUnit.SECONDS))
-
-        calculateChildPositions(
-            childPosition,
-            parentLayoutCoordinates,
-            childLayoutCoordinates
-        )
-
-        val root = findComposeView()
-        waitForDraw(root)
-
-        assertEquals(Offset(0f, 0f), childPosition[0])
-        assertEquals(Offset(size.toFloat(), 0f), childPosition[1])
-        assertEquals(
-            Offset(size.toFloat() * 2, 0f),
-            childPosition[2]
-        )
-    }
-
-    @Test
-    fun testRow_Rtl_absoluteArrangementLeft() = with(density) {
-        val size = 100
-        val sizeDp = size.toDp()
-
-        val drawLatch = CountDownLatch(4)
-        val childPosition = Array(3) { Offset.Zero }
-        val childLayoutCoordinates =
-            arrayOfNulls<LayoutCoordinates?>(childPosition.size)
-        var parentLayoutCoordinates: LayoutCoordinates? = null
-        show {
-            DeviceConfigurationOverride(
-                DeviceConfigurationOverride.LayoutDirection(LayoutDirection.Rtl)
-            ) {
-                Row(
-                    Modifier
-                        .fillMaxWidth()
-                        .onGloballyPositioned { coordinates ->
-                            parentLayoutCoordinates = coordinates
-                            drawLatch.countDown()
-                        },
                     horizontalArrangement = Arrangement.Absolute.Left
                 ) {
                     for (i in childPosition.indices) {
                         Container(
                             width = sizeDp,
                             height = sizeDp,
-                            modifier = Modifier.onGloballyPositioned { coordinates ->
-                                childLayoutCoordinates[i] =
-                                    coordinates
-                                drawLatch.countDown()
-                            },
+                            modifier =
+                                Modifier.onGloballyPositioned { coordinates ->
+                                    childLayoutCoordinates[i] = coordinates
+                                    drawLatch.countDown()
+                                },
                             content = {}
                         )
                     }
                 }
             }
+            assertTrue(drawLatch.await(1, TimeUnit.SECONDS))
+
+            calculateChildPositions(childPosition, parentLayoutCoordinates, childLayoutCoordinates)
+
+            val root = findComposeView()
+            waitForDraw(root)
+
+            assertEquals(Offset(0f, 0f), childPosition[0])
+            assertEquals(Offset(size.toFloat(), 0f), childPosition[1])
+            assertEquals(Offset(size.toFloat() * 2, 0f), childPosition[2])
         }
-        assertTrue(drawLatch.await(1, TimeUnit.SECONDS))
-
-        calculateChildPositions(
-            childPosition,
-            parentLayoutCoordinates,
-            childLayoutCoordinates
-        )
-
-        val root = findComposeView()
-        waitForDraw(root)
-
-        assertEquals(Offset(0f, 0f), childPosition[0])
-        assertEquals(Offset(size.toFloat(), 0f), childPosition[1])
-        assertEquals(
-            Offset(size.toFloat() * 2, 0f),
-            childPosition[2]
-        )
-    }
 
     @Test
-    fun testRow_absoluteArrangementRight() = with(density) {
-        val size = 100
-        val sizeDp = size.toDp()
+    fun testRow_Rtl_absoluteArrangementLeft() =
+        with(density) {
+            val size = 100
+            val sizeDp = size.toDp()
 
-        val drawLatch = CountDownLatch(4)
-        val childPosition = Array(3) { Offset.Zero }
-        val childLayoutCoordinates =
-            arrayOfNulls<LayoutCoordinates?>(childPosition.size)
-        var parentLayoutCoordinates: LayoutCoordinates? = null
-        show {
-            Row(
-                modifier = Modifier
-                    .fillMaxWidth()
-                    .onGloballyPositioned { coordinates ->
-                        parentLayoutCoordinates = coordinates
-                        drawLatch.countDown()
-                    },
-                horizontalArrangement = Arrangement.Absolute.Right
-            ) {
-                for (i in childPosition.indices) {
-                    Container(
-                        width = sizeDp,
-                        height = sizeDp,
-                        modifier = Modifier.onGloballyPositioned { coordinates ->
-                            childLayoutCoordinates[i] = coordinates
+            val drawLatch = CountDownLatch(4)
+            val childPosition = Array(3) { Offset.Zero }
+            val childLayoutCoordinates = arrayOfNulls<LayoutCoordinates?>(childPosition.size)
+            var parentLayoutCoordinates: LayoutCoordinates? = null
+            show {
+                DeviceConfigurationOverride(
+                    DeviceConfigurationOverride.LayoutDirection(LayoutDirection.Rtl)
+                ) {
+                    Row(
+                        Modifier.fillMaxWidth().onGloballyPositioned { coordinates ->
+                            parentLayoutCoordinates = coordinates
                             drawLatch.countDown()
                         },
-                        content = {}
-                    )
+                        horizontalArrangement = Arrangement.Absolute.Left
+                    ) {
+                        for (i in childPosition.indices) {
+                            Container(
+                                width = sizeDp,
+                                height = sizeDp,
+                                modifier =
+                                    Modifier.onGloballyPositioned { coordinates ->
+                                        childLayoutCoordinates[i] = coordinates
+                                        drawLatch.countDown()
+                                    },
+                                content = {}
+                            )
+                        }
+                    }
                 }
             }
+            assertTrue(drawLatch.await(1, TimeUnit.SECONDS))
+
+            calculateChildPositions(childPosition, parentLayoutCoordinates, childLayoutCoordinates)
+
+            val root = findComposeView()
+            waitForDraw(root)
+
+            assertEquals(Offset(0f, 0f), childPosition[0])
+            assertEquals(Offset(size.toFloat(), 0f), childPosition[1])
+            assertEquals(Offset(size.toFloat() * 2, 0f), childPosition[2])
         }
-        assertTrue(drawLatch.await(1, TimeUnit.SECONDS))
-
-        calculateChildPositions(
-            childPosition,
-            parentLayoutCoordinates,
-            childLayoutCoordinates
-        )
-
-        val root = findComposeView()
-        waitForDraw(root)
-
-        assertEquals(
-            Offset((root.width - size.toFloat() * 3), 0f),
-            childPosition[0]
-        )
-        assertEquals(
-            Offset((root.width - size.toFloat() * 2), 0f),
-            childPosition[1]
-        )
-        assertEquals(
-            Offset((root.width - size.toFloat()), 0f),
-            childPosition[2]
-        )
-    }
 
     @Test
-    fun testRow_Rtl_absoluteArrangementRight() = with(density) {
-        val size = 100
-        val sizeDp = size.toDp()
+    fun testRow_absoluteArrangementRight() =
+        with(density) {
+            val size = 100
+            val sizeDp = size.toDp()
 
-        val drawLatch = CountDownLatch(4)
-        val childPosition = Array(3) { Offset.Zero }
-        val childLayoutCoordinates =
-            arrayOfNulls<LayoutCoordinates?>(childPosition.size)
-        var parentLayoutCoordinates: LayoutCoordinates? = null
-        show {
-            DeviceConfigurationOverride(
-                DeviceConfigurationOverride.LayoutDirection(LayoutDirection.Rtl)
-            ) {
+            val drawLatch = CountDownLatch(4)
+            val childPosition = Array(3) { Offset.Zero }
+            val childLayoutCoordinates = arrayOfNulls<LayoutCoordinates?>(childPosition.size)
+            var parentLayoutCoordinates: LayoutCoordinates? = null
+            show {
                 Row(
-                    modifier = Modifier
-                        .fillMaxWidth()
-                        .onGloballyPositioned { coordinates ->
+                    modifier =
+                        Modifier.fillMaxWidth().onGloballyPositioned { coordinates ->
                             parentLayoutCoordinates = coordinates
                             drawLatch.countDown()
                         },
@@ -5476,128 +5124,91 @@
                         Container(
                             width = sizeDp,
                             height = sizeDp,
-                            modifier = Modifier.onGloballyPositioned { coordinates ->
-                                childLayoutCoordinates[i] =
-                                    coordinates
-                                drawLatch.countDown()
-                            },
+                            modifier =
+                                Modifier.onGloballyPositioned { coordinates ->
+                                    childLayoutCoordinates[i] = coordinates
+                                    drawLatch.countDown()
+                                },
                             content = {}
                         )
                     }
                 }
             }
+            assertTrue(drawLatch.await(1, TimeUnit.SECONDS))
+
+            calculateChildPositions(childPosition, parentLayoutCoordinates, childLayoutCoordinates)
+
+            val root = findComposeView()
+            waitForDraw(root)
+
+            assertEquals(Offset((root.width - size.toFloat() * 3), 0f), childPosition[0])
+            assertEquals(Offset((root.width - size.toFloat() * 2), 0f), childPosition[1])
+            assertEquals(Offset((root.width - size.toFloat()), 0f), childPosition[2])
         }
-        assertTrue(drawLatch.await(1, TimeUnit.SECONDS))
-
-        calculateChildPositions(
-            childPosition,
-            parentLayoutCoordinates,
-            childLayoutCoordinates
-        )
-
-        val root = findComposeView()
-        waitForDraw(root)
-
-        assertEquals(
-            Offset((root.width - size.toFloat() * 3), 0f),
-            childPosition[0]
-        )
-        assertEquals(
-            Offset((root.width - size.toFloat() * 2), 0f),
-            childPosition[1]
-        )
-        assertEquals(
-            Offset((root.width - size.toFloat()), 0f),
-            childPosition[2]
-        )
-    }
 
     @Test
-    fun testRow_absoluteArrangementCenter() = with(density) {
-        val size = 100
-        val sizeDp = size.toDp()
+    fun testRow_Rtl_absoluteArrangementRight() =
+        with(density) {
+            val size = 100
+            val sizeDp = size.toDp()
 
-        val drawLatch = CountDownLatch(4)
-        val childPosition = Array(3) { Offset.Zero }
-        val childLayoutCoordinates =
-            arrayOfNulls<LayoutCoordinates?>(childPosition.size)
-        var parentLayoutCoordinates: LayoutCoordinates? = null
-        show {
-            Row(
-                modifier = Modifier
-                    .fillMaxWidth()
-                    .onGloballyPositioned { coordinates ->
-                        parentLayoutCoordinates = coordinates
-                        drawLatch.countDown()
-                    },
-                horizontalArrangement = Arrangement.Absolute.Center
-            ) {
-                for (i in 0 until childPosition.size) {
-                    Container(
-                        width = sizeDp,
-                        height = sizeDp,
-                        modifier = Modifier.onGloballyPositioned { coordinates ->
-                            childLayoutCoordinates[i] = coordinates
-                            drawLatch.countDown()
-                        },
-                        content = {}
-                    )
+            val drawLatch = CountDownLatch(4)
+            val childPosition = Array(3) { Offset.Zero }
+            val childLayoutCoordinates = arrayOfNulls<LayoutCoordinates?>(childPosition.size)
+            var parentLayoutCoordinates: LayoutCoordinates? = null
+            show {
+                DeviceConfigurationOverride(
+                    DeviceConfigurationOverride.LayoutDirection(LayoutDirection.Rtl)
+                ) {
+                    Row(
+                        modifier =
+                            Modifier.fillMaxWidth().onGloballyPositioned { coordinates ->
+                                parentLayoutCoordinates = coordinates
+                                drawLatch.countDown()
+                            },
+                        horizontalArrangement = Arrangement.Absolute.Right
+                    ) {
+                        for (i in childPosition.indices) {
+                            Container(
+                                width = sizeDp,
+                                height = sizeDp,
+                                modifier =
+                                    Modifier.onGloballyPositioned { coordinates ->
+                                        childLayoutCoordinates[i] = coordinates
+                                        drawLatch.countDown()
+                                    },
+                                content = {}
+                            )
+                        }
+                    }
                 }
             }
+            assertTrue(drawLatch.await(1, TimeUnit.SECONDS))
+
+            calculateChildPositions(childPosition, parentLayoutCoordinates, childLayoutCoordinates)
+
+            val root = findComposeView()
+            waitForDraw(root)
+
+            assertEquals(Offset((root.width - size.toFloat() * 3), 0f), childPosition[0])
+            assertEquals(Offset((root.width - size.toFloat() * 2), 0f), childPosition[1])
+            assertEquals(Offset((root.width - size.toFloat()), 0f), childPosition[2])
         }
-        assertTrue(drawLatch.await(1, TimeUnit.SECONDS))
-
-        calculateChildPositions(
-            childPosition,
-            parentLayoutCoordinates,
-            childLayoutCoordinates
-        )
-
-        val root = findComposeView()
-        waitForDraw(root)
-
-        val extraSpace = root.width - size * 3
-        assertEquals(
-            Offset(
-                (extraSpace / 2f).roundToInt().toFloat(),
-                0f
-            ),
-            childPosition[0]
-        )
-        assertEquals(
-            Offset(
-                ((extraSpace / 2f) + size.toFloat()).roundToInt().toFloat(),
-                0f
-            ),
-            childPosition[1]
-        )
-        assertEquals(
-            Offset(
-                ((extraSpace / 2f) + size.toFloat() * 2).roundToInt().toFloat(),
-                0f
-            ),
-            childPosition[2]
-        )
-    }
 
     @Test
-    fun testRow_Rtl_absoluteArrangementCenter() = with(density) {
-        val size = 100
-        val sizeDp = size.toDp()
+    fun testRow_absoluteArrangementCenter() =
+        with(density) {
+            val size = 100
+            val sizeDp = size.toDp()
 
-        val drawLatch = CountDownLatch(4)
-        val childPosition = Array(3) { Offset.Zero }
-        val childLayoutCoordinates =
-            arrayOfNulls<LayoutCoordinates?>(childPosition.size)
-        var parentLayoutCoordinates: LayoutCoordinates? = null
-        show {
-            DeviceConfigurationOverride(
-                DeviceConfigurationOverride.LayoutDirection(LayoutDirection.Rtl)
-            ) {
+            val drawLatch = CountDownLatch(4)
+            val childPosition = Array(3) { Offset.Zero }
+            val childLayoutCoordinates = arrayOfNulls<LayoutCoordinates?>(childPosition.size)
+            var parentLayoutCoordinates: LayoutCoordinates? = null
+            show {
                 Row(
-                    modifier = Modifier
-                        .fillMaxWidth()
-                        .onGloballyPositioned { coordinates ->
+                    modifier =
+                        Modifier.fillMaxWidth().onGloballyPositioned { coordinates ->
                             parentLayoutCoordinates = coordinates
                             drawLatch.countDown()
                         },
@@ -5607,115 +5218,142 @@
                         Container(
                             width = sizeDp,
                             height = sizeDp,
-                            modifier = Modifier.onGloballyPositioned { coordinates ->
-                                childLayoutCoordinates[i] =
-                                    coordinates
-                                drawLatch.countDown()
-                            },
+                            modifier =
+                                Modifier.onGloballyPositioned { coordinates ->
+                                    childLayoutCoordinates[i] = coordinates
+                                    drawLatch.countDown()
+                                },
                             content = {}
                         )
                     }
                 }
             }
+            assertTrue(drawLatch.await(1, TimeUnit.SECONDS))
+
+            calculateChildPositions(childPosition, parentLayoutCoordinates, childLayoutCoordinates)
+
+            val root = findComposeView()
+            waitForDraw(root)
+
+            val extraSpace = root.width - size * 3
+            assertEquals(Offset((extraSpace / 2f).roundToInt().toFloat(), 0f), childPosition[0])
+            assertEquals(
+                Offset(((extraSpace / 2f) + size.toFloat()).roundToInt().toFloat(), 0f),
+                childPosition[1]
+            )
+            assertEquals(
+                Offset(((extraSpace / 2f) + size.toFloat() * 2).roundToInt().toFloat(), 0f),
+                childPosition[2]
+            )
         }
-        assertTrue(drawLatch.await(1, TimeUnit.SECONDS))
-
-        calculateChildPositions(
-            childPosition,
-            parentLayoutCoordinates,
-            childLayoutCoordinates
-        )
-
-        val root = findComposeView()
-        waitForDraw(root)
-
-        val extraSpace = root.width - size * 3
-        assertEquals(
-            Offset(
-                (extraSpace / 2f).roundToInt().toFloat(),
-                0f
-            ),
-            childPosition[0]
-        )
-        assertEquals(
-            Offset(
-                ((extraSpace / 2f) + size.toFloat()).roundToInt().toFloat(),
-                0f
-            ),
-            childPosition[1]
-        )
-        assertEquals(
-            Offset(
-                ((extraSpace / 2f) + size.toFloat() * 2).roundToInt().toFloat(),
-                0f
-            ),
-            childPosition[2]
-        )
-    }
 
     @Test
-    fun testRow_absoluteArrangementSpaceEvenly() = with(density) {
-        val size = 100
-        val sizeDp = size.toDp()
+    fun testRow_Rtl_absoluteArrangementCenter() =
+        with(density) {
+            val size = 100
+            val sizeDp = size.toDp()
 
-        val drawLatch = CountDownLatch(4)
-        val childPosition = Array(3) { Offset.Zero }
-        val childLayoutCoordinates =
-            arrayOfNulls<LayoutCoordinates?>(childPosition.size)
-        var parentLayoutCoordinates: LayoutCoordinates? = null
-        show {
-            Row(
-                modifier = Modifier
-                    .fillMaxWidth()
-                    .onGloballyPositioned { coordinates ->
-                        parentLayoutCoordinates = coordinates
-                        drawLatch.countDown()
-                    },
-                horizontalArrangement = Arrangement.Absolute.SpaceEvenly
-            ) {
-                for (i in childPosition.indices) {
-                    Container(
-                        width = sizeDp,
-                        height = sizeDp,
-                        modifier = Modifier.onGloballyPositioned { coordinates ->
-                            childLayoutCoordinates[i] = coordinates
-                            drawLatch.countDown()
-                        },
-                        content = {}
-                    )
+            val drawLatch = CountDownLatch(4)
+            val childPosition = Array(3) { Offset.Zero }
+            val childLayoutCoordinates = arrayOfNulls<LayoutCoordinates?>(childPosition.size)
+            var parentLayoutCoordinates: LayoutCoordinates? = null
+            show {
+                DeviceConfigurationOverride(
+                    DeviceConfigurationOverride.LayoutDirection(LayoutDirection.Rtl)
+                ) {
+                    Row(
+                        modifier =
+                            Modifier.fillMaxWidth().onGloballyPositioned { coordinates ->
+                                parentLayoutCoordinates = coordinates
+                                drawLatch.countDown()
+                            },
+                        horizontalArrangement = Arrangement.Absolute.Center
+                    ) {
+                        for (i in 0 until childPosition.size) {
+                            Container(
+                                width = sizeDp,
+                                height = sizeDp,
+                                modifier =
+                                    Modifier.onGloballyPositioned { coordinates ->
+                                        childLayoutCoordinates[i] = coordinates
+                                        drawLatch.countDown()
+                                    },
+                                content = {}
+                            )
+                        }
+                    }
                 }
             }
+            assertTrue(drawLatch.await(1, TimeUnit.SECONDS))
+
+            calculateChildPositions(childPosition, parentLayoutCoordinates, childLayoutCoordinates)
+
+            val root = findComposeView()
+            waitForDraw(root)
+
+            val extraSpace = root.width - size * 3
+            assertEquals(Offset((extraSpace / 2f).roundToInt().toFloat(), 0f), childPosition[0])
+            assertEquals(
+                Offset(((extraSpace / 2f) + size.toFloat()).roundToInt().toFloat(), 0f),
+                childPosition[1]
+            )
+            assertEquals(
+                Offset(((extraSpace / 2f) + size.toFloat() * 2).roundToInt().toFloat(), 0f),
+                childPosition[2]
+            )
         }
-        assertTrue(drawLatch.await(1, TimeUnit.SECONDS))
 
-        calculateChildPositions(
-            childPosition,
-            parentLayoutCoordinates,
-            childLayoutCoordinates
-        )
+    @Test
+    fun testRow_absoluteArrangementSpaceEvenly() =
+        with(density) {
+            val size = 100
+            val sizeDp = size.toDp()
 
-        val root = findComposeView()
-        waitForDraw(root)
+            val drawLatch = CountDownLatch(4)
+            val childPosition = Array(3) { Offset.Zero }
+            val childLayoutCoordinates = arrayOfNulls<LayoutCoordinates?>(childPosition.size)
+            var parentLayoutCoordinates: LayoutCoordinates? = null
+            show {
+                Row(
+                    modifier =
+                        Modifier.fillMaxWidth().onGloballyPositioned { coordinates ->
+                            parentLayoutCoordinates = coordinates
+                            drawLatch.countDown()
+                        },
+                    horizontalArrangement = Arrangement.Absolute.SpaceEvenly
+                ) {
+                    for (i in childPosition.indices) {
+                        Container(
+                            width = sizeDp,
+                            height = sizeDp,
+                            modifier =
+                                Modifier.onGloballyPositioned { coordinates ->
+                                    childLayoutCoordinates[i] = coordinates
+                                    drawLatch.countDown()
+                                },
+                            content = {}
+                        )
+                    }
+                }
+            }
+            assertTrue(drawLatch.await(1, TimeUnit.SECONDS))
 
-        val gap = (root.width - size.toFloat() * 3f) / 4f
-        assertEquals(
-            Offset(gap.roundToInt().toFloat(), 0f), childPosition[0]
-        )
-        assertEquals(
-            Offset(
-                (size.toFloat() + gap * 2f).roundToInt().toFloat(),
-                0f
-            ),
-            childPosition[1]
-        )
-        assertEquals(
-            Offset(
-                (size.toFloat() * 2f + gap * 3f).roundToInt().toFloat(),
-                0f
-            ),
-            childPosition[2]
-        )
-    }
+            calculateChildPositions(childPosition, parentLayoutCoordinates, childLayoutCoordinates)
+
+            val root = findComposeView()
+            waitForDraw(root)
+
+            val gap = (root.width - size.toFloat() * 3f) / 4f
+            assertEquals(Offset(gap.roundToInt().toFloat(), 0f), childPosition[0])
+            assertEquals(
+                Offset((size.toFloat() + gap * 2f).roundToInt().toFloat(), 0f),
+                childPosition[1]
+            )
+            assertEquals(
+                Offset((size.toFloat() * 2f + gap * 3f).roundToInt().toFloat(), 0f),
+                childPosition[2]
+            )
+        }
 
     @Test
     fun testRow_Row_absoluteArrangementSpaceEvenly() =
@@ -5725,19 +5363,16 @@
 
             val drawLatch = CountDownLatch(4)
             val childPosition = Array(3) { Offset.Zero }
-            val childLayoutCoordinates =
-                arrayOfNulls<LayoutCoordinates?>(childPosition.size)
+            val childLayoutCoordinates = arrayOfNulls<LayoutCoordinates?>(childPosition.size)
             var parentLayoutCoordinates: LayoutCoordinates? = null
             show {
                 DeviceConfigurationOverride(
                     DeviceConfigurationOverride.LayoutDirection(LayoutDirection.Rtl)
                 ) {
                     Row(
-                        modifier = Modifier
-                            .fillMaxWidth()
-                            .onGloballyPositioned { coordinates ->
-                                parentLayoutCoordinates =
-                                    coordinates
+                        modifier =
+                            Modifier.fillMaxWidth().onGloballyPositioned { coordinates ->
+                                parentLayoutCoordinates = coordinates
                                 drawLatch.countDown()
                             },
                         horizontalArrangement = Arrangement.Absolute.SpaceEvenly
@@ -5746,11 +5381,11 @@
                             Container(
                                 width = sizeDp,
                                 height = sizeDp,
-                                modifier = Modifier.onGloballyPositioned { coordinates ->
-                                    childLayoutCoordinates[i] =
-                                        coordinates
-                                    drawLatch.countDown()
-                                },
+                                modifier =
+                                    Modifier.onGloballyPositioned { coordinates ->
+                                        childLayoutCoordinates[i] = coordinates
+                                        drawLatch.countDown()
+                                    },
                                 content = {}
                             )
                         }
@@ -5759,97 +5394,74 @@
             }
             assertTrue(drawLatch.await(1, TimeUnit.SECONDS))
 
-            calculateChildPositions(
-                childPosition,
-                parentLayoutCoordinates,
-                childLayoutCoordinates
-            )
+            calculateChildPositions(childPosition, parentLayoutCoordinates, childLayoutCoordinates)
 
             val root = findComposeView()
             waitForDraw(root)
 
             val gap = (root.width - size.toFloat() * 3f) / 4f
+            assertEquals(Offset(gap.roundToInt().toFloat(), 0f), childPosition[0])
             assertEquals(
-                Offset(gap.roundToInt().toFloat(), 0f),
-                childPosition[0]
-            )
-            assertEquals(
-                Offset(
-                    (size.toFloat() + gap * 2f).roundToInt().toFloat(),
-                    0f
-                ),
+                Offset((size.toFloat() + gap * 2f).roundToInt().toFloat(), 0f),
                 childPosition[1]
             )
             assertEquals(
-                Offset(
-                    (size.toFloat() * 2f + gap * 3f).roundToInt().toFloat(),
-                    0f
-                ),
+                Offset((size.toFloat() * 2f + gap * 3f).roundToInt().toFloat(), 0f),
                 childPosition[2]
             )
         }
 
     @Test
-    fun testRow_absoluteArrangementSpaceBetween() = with(density) {
-        val size = 100
-        val sizeDp = size.toDp()
+    fun testRow_absoluteArrangementSpaceBetween() =
+        with(density) {
+            val size = 100
+            val sizeDp = size.toDp()
 
-        val drawLatch = CountDownLatch(4)
-        val childPosition = Array(3) { Offset.Zero }
-        val childLayoutCoordinates =
-            arrayOfNulls<LayoutCoordinates?>(childPosition.size)
-        var parentLayoutCoordinates: LayoutCoordinates? = null
-        show {
-            Row(
-                modifier = Modifier
-                    .fillMaxWidth()
-                    .onGloballyPositioned { coordinates ->
-                        parentLayoutCoordinates = coordinates
-                        drawLatch.countDown()
-                    },
-                horizontalArrangement = Arrangement.Absolute.SpaceBetween
-            ) {
-                for (i in childPosition.indices) {
-                    Container(
-                        width = sizeDp,
-                        height = sizeDp,
-                        modifier = Modifier.onGloballyPositioned { coordinates ->
-                            childLayoutCoordinates[i] = coordinates
+            val drawLatch = CountDownLatch(4)
+            val childPosition = Array(3) { Offset.Zero }
+            val childLayoutCoordinates = arrayOfNulls<LayoutCoordinates?>(childPosition.size)
+            var parentLayoutCoordinates: LayoutCoordinates? = null
+            show {
+                Row(
+                    modifier =
+                        Modifier.fillMaxWidth().onGloballyPositioned { coordinates ->
+                            parentLayoutCoordinates = coordinates
                             drawLatch.countDown()
                         },
-                        content = {}
-                    )
+                    horizontalArrangement = Arrangement.Absolute.SpaceBetween
+                ) {
+                    for (i in childPosition.indices) {
+                        Container(
+                            width = sizeDp,
+                            height = sizeDp,
+                            modifier =
+                                Modifier.onGloballyPositioned { coordinates ->
+                                    childLayoutCoordinates[i] = coordinates
+                                    drawLatch.countDown()
+                                },
+                            content = {}
+                        )
+                    }
                 }
             }
+            assertTrue(drawLatch.await(1, TimeUnit.SECONDS))
+
+            calculateChildPositions(childPosition, parentLayoutCoordinates, childLayoutCoordinates)
+
+            val root = findComposeView()
+            waitForDraw(root)
+
+            val gap = (root.width - size.toFloat() * 3) / 2
+            assertEquals(Offset(0f, 0f), childPosition[0])
+            assertEquals(
+                Offset((gap + size.toFloat()).roundToInt().toFloat(), 0f),
+                childPosition[1]
+            )
+            assertEquals(
+                Offset((gap * 2 + size.toFloat() * 2).roundToInt().toFloat(), 0f),
+                childPosition[2]
+            )
         }
-        assertTrue(drawLatch.await(1, TimeUnit.SECONDS))
-
-        calculateChildPositions(
-            childPosition,
-            parentLayoutCoordinates,
-            childLayoutCoordinates
-        )
-
-        val root = findComposeView()
-        waitForDraw(root)
-
-        val gap = (root.width - size.toFloat() * 3) / 2
-        assertEquals(Offset(0f, 0f), childPosition[0])
-        assertEquals(
-            Offset(
-                (gap + size.toFloat()).roundToInt().toFloat(),
-                0f
-            ),
-            childPosition[1]
-        )
-        assertEquals(
-            Offset(
-                (gap * 2 + size.toFloat() * 2).roundToInt().toFloat(),
-                0f
-            ),
-            childPosition[2]
-        )
-    }
 
     @Test
     fun testRow_Row_absoluteArrangementSpaceBetween() =
@@ -5859,19 +5471,16 @@
 
             val drawLatch = CountDownLatch(4)
             val childPosition = Array(3) { Offset.Zero }
-            val childLayoutCoordinates =
-                arrayOfNulls<LayoutCoordinates?>(childPosition.size)
+            val childLayoutCoordinates = arrayOfNulls<LayoutCoordinates?>(childPosition.size)
             var parentLayoutCoordinates: LayoutCoordinates? = null
             show {
                 DeviceConfigurationOverride(
                     DeviceConfigurationOverride.LayoutDirection(LayoutDirection.Rtl)
                 ) {
                     Row(
-                        modifier = Modifier
-                            .fillMaxWidth()
-                            .onGloballyPositioned { coordinates ->
-                                parentLayoutCoordinates =
-                                    coordinates
+                        modifier =
+                            Modifier.fillMaxWidth().onGloballyPositioned { coordinates ->
+                                parentLayoutCoordinates = coordinates
                                 drawLatch.countDown()
                             },
                         horizontalArrangement = Arrangement.Absolute.SpaceBetween
@@ -5880,11 +5489,11 @@
                             Container(
                                 width = sizeDp,
                                 height = sizeDp,
-                                modifier = Modifier.onGloballyPositioned { coordinates ->
-                                    childLayoutCoordinates[i] =
-                                        coordinates
-                                    drawLatch.countDown()
-                                },
+                                modifier =
+                                    Modifier.onGloballyPositioned { coordinates ->
+                                        childLayoutCoordinates[i] = coordinates
+                                        drawLatch.countDown()
+                                    },
                                 content = {}
                             )
                         }
@@ -5893,11 +5502,7 @@
             }
             assertTrue(drawLatch.await(1, TimeUnit.SECONDS))
 
-            calculateChildPositions(
-                childPosition,
-                parentLayoutCoordinates,
-                childLayoutCoordinates
-            )
+            calculateChildPositions(childPosition, parentLayoutCoordinates, childLayoutCoordinates)
 
             val root = findComposeView()
             waitForDraw(root)
@@ -5905,85 +5510,66 @@
             val gap = (root.width - size.toFloat() * 3) / 2
             assertEquals(Offset(0f, 0f), childPosition[0])
             assertEquals(
-                Offset(
-                    (gap + size.toFloat()).roundToInt().toFloat(),
-                    0f
-                ),
+                Offset((gap + size.toFloat()).roundToInt().toFloat(), 0f),
                 childPosition[1]
             )
             assertEquals(
-                Offset(
-                    (gap * 2 + size.toFloat() * 2).roundToInt().toFloat(),
-                    0f
-                ),
+                Offset((gap * 2 + size.toFloat() * 2).roundToInt().toFloat(), 0f),
                 childPosition[2]
             )
         }
 
     @Test
-    fun testRow_absoluteArrangementSpaceAround() = with(density) {
-        val size = 100
-        val sizeDp = size.toDp()
+    fun testRow_absoluteArrangementSpaceAround() =
+        with(density) {
+            val size = 100
+            val sizeDp = size.toDp()
 
-        val drawLatch = CountDownLatch(4)
-        val childPosition = Array(3) { Offset.Zero }
-        val childLayoutCoordinates =
-            arrayOfNulls<LayoutCoordinates?>(childPosition.size)
-        var parentLayoutCoordinates: LayoutCoordinates? = null
-        show {
-            Row(
-                modifier = Modifier
-                    .fillMaxWidth()
-                    .onGloballyPositioned { coordinates ->
-                        parentLayoutCoordinates = coordinates
-                        drawLatch.countDown()
-                    },
-                horizontalArrangement = Arrangement.Absolute.SpaceAround
-            ) {
-                for (i in 0 until childPosition.size) {
-                    Container(
-                        width = sizeDp,
-                        height = sizeDp,
-                        modifier = Modifier.onGloballyPositioned { coordinates ->
-                            childLayoutCoordinates[i] = coordinates
+            val drawLatch = CountDownLatch(4)
+            val childPosition = Array(3) { Offset.Zero }
+            val childLayoutCoordinates = arrayOfNulls<LayoutCoordinates?>(childPosition.size)
+            var parentLayoutCoordinates: LayoutCoordinates? = null
+            show {
+                Row(
+                    modifier =
+                        Modifier.fillMaxWidth().onGloballyPositioned { coordinates ->
+                            parentLayoutCoordinates = coordinates
                             drawLatch.countDown()
                         },
-                        content = {}
-                    )
+                    horizontalArrangement = Arrangement.Absolute.SpaceAround
+                ) {
+                    for (i in 0 until childPosition.size) {
+                        Container(
+                            width = sizeDp,
+                            height = sizeDp,
+                            modifier =
+                                Modifier.onGloballyPositioned { coordinates ->
+                                    childLayoutCoordinates[i] = coordinates
+                                    drawLatch.countDown()
+                                },
+                            content = {}
+                        )
+                    }
                 }
             }
+            assertTrue(drawLatch.await(1, TimeUnit.SECONDS))
+
+            calculateChildPositions(childPosition, parentLayoutCoordinates, childLayoutCoordinates)
+
+            val root = findComposeView()
+            waitForDraw(root)
+
+            val gap = (root.width.toFloat() - size * 3) / 3
+            assertEquals(Offset((gap / 2f).roundToInt().toFloat(), 0f), childPosition[0])
+            assertEquals(
+                Offset(((gap * 3 / 2) + size.toFloat()).roundToInt().toFloat(), 0f),
+                childPosition[1]
+            )
+            assertEquals(
+                Offset(((gap * 5 / 2) + size.toFloat() * 2).roundToInt().toFloat(), 0f),
+                childPosition[2]
+            )
         }
-        assertTrue(drawLatch.await(1, TimeUnit.SECONDS))
-
-        calculateChildPositions(
-            childPosition,
-            parentLayoutCoordinates,
-            childLayoutCoordinates
-        )
-
-        val root = findComposeView()
-        waitForDraw(root)
-
-        val gap = (root.width.toFloat() - size * 3) / 3
-        assertEquals(
-            Offset((gap / 2f).roundToInt().toFloat(), 0f),
-            childPosition[0]
-        )
-        assertEquals(
-            Offset(
-                ((gap * 3 / 2) + size.toFloat()).roundToInt().toFloat(),
-                0f
-            ),
-            childPosition[1]
-        )
-        assertEquals(
-            Offset(
-                ((gap * 5 / 2) + size.toFloat() * 2).roundToInt().toFloat(),
-                0f
-            ),
-            childPosition[2]
-        )
-    }
 
     @Test
     fun testRow_Rtl_absoluteArrangementSpaceAround() =
@@ -5993,19 +5579,16 @@
 
             val drawLatch = CountDownLatch(4)
             val childPosition = Array(3) { Offset.Zero }
-            val childLayoutCoordinates =
-                arrayOfNulls<LayoutCoordinates?>(childPosition.size)
+            val childLayoutCoordinates = arrayOfNulls<LayoutCoordinates?>(childPosition.size)
             var parentLayoutCoordinates: LayoutCoordinates? = null
             show {
                 DeviceConfigurationOverride(
                     DeviceConfigurationOverride.LayoutDirection(LayoutDirection.Rtl)
                 ) {
                     Row(
-                        modifier = Modifier
-                            .fillMaxWidth()
-                            .onGloballyPositioned { coordinates ->
-                                parentLayoutCoordinates =
-                                    coordinates
+                        modifier =
+                            Modifier.fillMaxWidth().onGloballyPositioned { coordinates ->
+                                parentLayoutCoordinates = coordinates
                                 drawLatch.countDown()
                             },
                         horizontalArrangement = Arrangement.Absolute.SpaceAround
@@ -6014,11 +5597,11 @@
                             Container(
                                 width = sizeDp,
                                 height = sizeDp,
-                                modifier = Modifier.onGloballyPositioned { coordinates ->
-                                    childLayoutCoordinates[i] =
-                                        coordinates
-                                    drawLatch.countDown()
-                                },
+                                modifier =
+                                    Modifier.onGloballyPositioned { coordinates ->
+                                        childLayoutCoordinates[i] = coordinates
+                                        drawLatch.countDown()
+                                    },
                                 content = {}
                             )
                         }
@@ -6027,85 +5610,73 @@
             }
             assertTrue(drawLatch.await(1, TimeUnit.SECONDS))
 
-            calculateChildPositions(
-                childPosition,
-                parentLayoutCoordinates,
-                childLayoutCoordinates
-            )
+            calculateChildPositions(childPosition, parentLayoutCoordinates, childLayoutCoordinates)
 
             val root = findComposeView()
             waitForDraw(root)
 
             val gap = (root.width.toFloat() - size * 3) / 3
+            assertEquals(Offset((gap / 2f).roundToInt().toFloat(), 0f), childPosition[0])
             assertEquals(
-                Offset(
-                    (gap / 2f).roundToInt().toFloat(),
-                    0f
-                ),
-                childPosition[0]
-            )
-            assertEquals(
-                Offset(
-                    ((gap * 3 / 2) + size.toFloat()).roundToInt().toFloat(),
-                    0f
-                ),
+                Offset(((gap * 3 / 2) + size.toFloat()).roundToInt().toFloat(), 0f),
                 childPosition[1]
             )
             assertEquals(
-                Offset(
-                    ((gap * 5 / 2) + size.toFloat() * 2).roundToInt().toFloat(),
-                    0f
-                ),
+                Offset(((gap * 5 / 2) + size.toFloat() * 2).roundToInt().toFloat(), 0f),
                 childPosition[2]
             )
         }
 
     @Test
-    fun testRow_Rtl_withSpacedByAlignedAbsoluteArrangement() = with(density) {
-        val spacePx = 10f
-        val space = spacePx.toDp()
-        val sizePx = 20f
-        val size = sizePx.toDp()
-        val rowSizePx = 50
-        val rowSize = rowSizePx.toDp()
-        val latch = CountDownLatch(3)
-        show {
-            DeviceConfigurationOverride(
-                DeviceConfigurationOverride.LayoutDirection(LayoutDirection.Rtl)
-            ) {
-                Column {
-                    Row(
-                        horizontalArrangement = Arrangement.Absolute.spacedBy(space, Alignment.End),
-                        modifier = Modifier.requiredSize(rowSize).onGloballyPositioned {
-                            assertEquals(rowSizePx, it.size.width)
-                            latch.countDown()
+    fun testRow_Rtl_withSpacedByAlignedAbsoluteArrangement() =
+        with(density) {
+            val spacePx = 10f
+            val space = spacePx.toDp()
+            val sizePx = 20f
+            val size = sizePx.toDp()
+            val rowSizePx = 50
+            val rowSize = rowSizePx.toDp()
+            val latch = CountDownLatch(3)
+            show {
+                DeviceConfigurationOverride(
+                    DeviceConfigurationOverride.LayoutDirection(LayoutDirection.Rtl)
+                ) {
+                    Column {
+                        Row(
+                            horizontalArrangement =
+                                Arrangement.Absolute.spacedBy(space, Alignment.End),
+                            modifier =
+                                Modifier.requiredSize(rowSize).onGloballyPositioned {
+                                    assertEquals(rowSizePx, it.size.width)
+                                    latch.countDown()
+                                }
+                        ) {
+                            Box(
+                                Modifier.requiredSize(size).onGloballyPositioned {
+                                    assertEquals(0f, it.positionInParent().x)
+                                    latch.countDown()
+                                }
+                            )
+                            Box(
+                                Modifier.requiredSize(size).onGloballyPositioned {
+                                    assertEquals(sizePx + spacePx, it.positionInParent().x)
+                                    latch.countDown()
+                                }
+                            )
                         }
-                    ) {
-                        Box(
-                            Modifier.requiredSize(size).onGloballyPositioned {
-                                assertEquals(0f, it.positionInParent().x)
-                                latch.countDown()
-                            }
-                        )
-                        Box(
-                            Modifier.requiredSize(size).onGloballyPositioned {
-                                assertEquals(sizePx + spacePx, it.positionInParent().x)
-                                latch.countDown()
-                            }
-                        )
                     }
                 }
             }
+            assertTrue(latch.await(1, TimeUnit.SECONDS))
         }
-        assertTrue(latch.await(1, TimeUnit.SECONDS))
-    }
+
     // endregion
 
     // region InspectableValue tests for Row and Column
     @Test
     fun testRow_AlignInspectableValue() {
-        val modifier = with(RowScopeInstance) { Modifier.align(Alignment.Bottom) }
-            as InspectableValue
+        val modifier =
+            with(RowScopeInstance) { Modifier.align(Alignment.Bottom) } as InspectableValue
         Truth.assertThat(modifier.nameFallback).isEqualTo("align")
         Truth.assertThat(modifier.valueOverride).isEqualTo(Alignment.Bottom)
         Truth.assertThat(modifier.inspectableElements.asIterable()).isEmpty()
@@ -6113,8 +5684,8 @@
 
     @Test
     fun testRow_AlignByInspectableValue() {
-        val modifier = with(RowScopeInstance) { Modifier.alignBy(FirstBaseline) }
-            as InspectableValue
+        val modifier =
+            with(RowScopeInstance) { Modifier.alignBy(FirstBaseline) } as InspectableValue
         Truth.assertThat(modifier.nameFallback).isEqualTo("alignBy")
         Truth.assertThat(modifier.valueOverride).isEqualTo(FirstBaseline)
         Truth.assertThat(modifier.inspectableElements.asIterable()).isEmpty()
@@ -6122,20 +5693,17 @@
 
     @Test
     fun testRow_WeightInspectableValue() {
-        val modifier = with(RowScopeInstance) { Modifier.weight(2.0f, false) }
-            as InspectableValue
+        val modifier = with(RowScopeInstance) { Modifier.weight(2.0f, false) } as InspectableValue
         Truth.assertThat(modifier.nameFallback).isEqualTo("weight")
         Truth.assertThat(modifier.valueOverride).isEqualTo(2.0f)
-        Truth.assertThat(modifier.inspectableElements.asIterable()).containsExactly(
-            ValueElement("weight", 2.0f),
-            ValueElement("fill", false)
-        )
+        Truth.assertThat(modifier.inspectableElements.asIterable())
+            .containsExactly(ValueElement("weight", 2.0f), ValueElement("fill", false))
     }
 
     @Test
     fun testColumn_AlignInspectableValue() {
-        val modifier = with(ColumnScopeInstance) { Modifier.align(Alignment.Start) }
-            as InspectableValue
+        val modifier =
+            with(ColumnScopeInstance) { Modifier.align(Alignment.Start) } as InspectableValue
         Truth.assertThat(modifier.nameFallback).isEqualTo("align")
         Truth.assertThat(modifier.valueOverride).isEqualTo(Alignment.Start)
         Truth.assertThat(modifier.inspectableElements.asIterable()).isEmpty()
@@ -6143,8 +5711,8 @@
 
     @Test
     fun testColumn_AlignByInspectableValue() {
-        val modifier = with(ColumnScopeInstance) { Modifier.alignBy(TestVerticalLine) }
-            as InspectableValue
+        val modifier =
+            with(ColumnScopeInstance) { Modifier.alignBy(TestVerticalLine) } as InspectableValue
         Truth.assertThat(modifier.nameFallback).isEqualTo("alignBy")
         Truth.assertThat(modifier.valueOverride).isEqualTo(TestVerticalLine)
         Truth.assertThat(modifier.inspectableElements.asIterable()).isEmpty()
@@ -6152,16 +5720,15 @@
 
     @Test
     fun testColumn_WeightInspectableValue() {
-        val modifier = with(ColumnScopeInstance) { Modifier.weight(2.0f, false) }
-            as InspectableValue
+        val modifier =
+            with(ColumnScopeInstance) { Modifier.weight(2.0f, false) } as InspectableValue
         Truth.assertThat(modifier.nameFallback).isEqualTo("weight")
         Truth.assertThat(modifier.valueOverride).isEqualTo(2.0f)
-        Truth.assertThat(modifier.inspectableElements.asIterable()).containsExactly(
-            ValueElement("weight", 2.0f),
-            ValueElement("fill", false)
-        )
+        Truth.assertThat(modifier.inspectableElements.asIterable())
+            .containsExactly(ValueElement("weight", 2.0f), ValueElement("fill", false))
     }
 }
+
 private val TestHorizontalLine = HorizontalAlignmentLine(::min)
 private val TestVerticalLine = VerticalAlignmentLine(::min)
 
@@ -6181,7 +5748,8 @@
             val widthPx = max(width.roundToPx(), constraints.minWidth)
             val heightPx = max(height.roundToPx(), constraints.minHeight)
             layout(
-                widthPx, heightPx,
+                widthPx,
+                heightPx,
                 mapOf(
                     horizontalLine to baseline.roundToPx(),
                     TestVerticalLine to baseline.roundToPx()
@@ -6197,33 +5765,31 @@
     Layout(content) { measurables, constraints ->
         val measurable = measurables.firstOrNull()
         // The child cannot be larger than our max constraints, but we ignore min constraints.
-        val placeable = measurable?.measure(
-            constraints.copy(
-                minWidth = 0,
-                minHeight = 0
-            )
-        )
+        val placeable = measurable?.measure(constraints.copy(minWidth = 0, minHeight = 0))
 
         // The layout is as large as possible for bounded constraints,
         // or wrap content otherwise.
-        val layoutWidth = if (constraints.hasBoundedWidth) {
-            constraints.maxWidth
-        } else {
-            placeable?.width ?: constraints.minWidth
-        }
-        val layoutHeight = if (constraints.hasBoundedHeight) {
-            constraints.maxHeight
-        } else {
-            placeable?.height ?: constraints.minHeight
-        }
+        val layoutWidth =
+            if (constraints.hasBoundedWidth) {
+                constraints.maxWidth
+            } else {
+                placeable?.width ?: constraints.minWidth
+            }
+        val layoutHeight =
+            if (constraints.hasBoundedHeight) {
+                constraints.maxHeight
+            } else {
+                placeable?.height ?: constraints.minHeight
+            }
 
         layout(layoutWidth, layoutHeight) {
             if (placeable != null) {
-                val position = Alignment.Center.align(
-                    IntSize(placeable.width, placeable.height),
-                    IntSize(layoutWidth, layoutHeight),
-                    layoutDirection
-                )
+                val position =
+                    Alignment.Center.align(
+                        IntSize(placeable.width, placeable.height),
+                        IntSize(layoutWidth, layoutHeight),
+                        layoutDirection
+                    )
                 placeable.placeRelative(position.x, position.y)
             }
         }
diff --git a/compose/foundation/foundation-layout/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/layout/SizeTest.kt b/compose/foundation/foundation-layout/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/layout/SizeTest.kt
index 82927ce..0bb1ae2 100644
--- a/compose/foundation/foundation-layout/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/layout/SizeTest.kt
+++ b/compose/foundation/foundation-layout/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/layout/SizeTest.kt
@@ -80,1137 +80,1129 @@
     }
 
     @Test
-    fun testPreferredSize_withWidthSizeModifiers() = with(density) {
-        val sizeDp = 50.toDp()
-        val sizeIpx = sizeDp.roundToPx()
+    fun testPreferredSize_withWidthSizeModifiers() =
+        with(density) {
+            val sizeDp = 50.toDp()
+            val sizeIpx = sizeDp.roundToPx()
 
-        val positionedLatch = CountDownLatch(6)
-        val size = MutableList(6) { Ref<IntSize>() }
-        val position = MutableList(6) { Ref<Offset>() }
-        show {
-            Box {
-                Column {
-                    Container(
-                        Modifier.widthIn(min = sizeDp, max = sizeDp * 2)
-                            .height(sizeDp)
-                            .saveLayoutInfo(size[0], position[0], positionedLatch)
-                    ) {
-                    }
-                    Container(
-                        Modifier.widthIn(max = sizeDp * 2)
-                            .height(sizeDp)
-                            .saveLayoutInfo(size[1], position[1], positionedLatch)
-                    ) {
-                    }
-                    Container(
-                        Modifier.widthIn(min = sizeDp)
-                            .height(sizeDp)
-                            .saveLayoutInfo(size[2], position[2], positionedLatch)
-                    ) {
-                    }
-                    Container(
-                        Modifier.widthIn(max = sizeDp)
-                            .widthIn(min = sizeDp * 2)
-                            .height(sizeDp)
-                            .saveLayoutInfo(size[3], position[3], positionedLatch)
-                    ) {
-                    }
-                    Container(
-                        Modifier.widthIn(min = sizeDp * 2)
-                            .widthIn(max = sizeDp)
-                            .height(sizeDp)
-                            .saveLayoutInfo(size[4], position[4], positionedLatch)
-                    ) {
-                    }
-                    Container(
-                        Modifier.size(sizeDp)
-                            .saveLayoutInfo(size[5], position[5], positionedLatch)
-                    ) {
+            val positionedLatch = CountDownLatch(6)
+            val size = MutableList(6) { Ref<IntSize>() }
+            val position = MutableList(6) { Ref<Offset>() }
+            show {
+                Box {
+                    Column {
+                        Container(
+                            Modifier.widthIn(min = sizeDp, max = sizeDp * 2)
+                                .height(sizeDp)
+                                .saveLayoutInfo(size[0], position[0], positionedLatch)
+                        ) {}
+                        Container(
+                            Modifier.widthIn(max = sizeDp * 2)
+                                .height(sizeDp)
+                                .saveLayoutInfo(size[1], position[1], positionedLatch)
+                        ) {}
+                        Container(
+                            Modifier.widthIn(min = sizeDp)
+                                .height(sizeDp)
+                                .saveLayoutInfo(size[2], position[2], positionedLatch)
+                        ) {}
+                        Container(
+                            Modifier.widthIn(max = sizeDp)
+                                .widthIn(min = sizeDp * 2)
+                                .height(sizeDp)
+                                .saveLayoutInfo(size[3], position[3], positionedLatch)
+                        ) {}
+                        Container(
+                            Modifier.widthIn(min = sizeDp * 2)
+                                .widthIn(max = sizeDp)
+                                .height(sizeDp)
+                                .saveLayoutInfo(size[4], position[4], positionedLatch)
+                        ) {}
+                        Container(
+                            Modifier.size(sizeDp)
+                                .saveLayoutInfo(size[5], position[5], positionedLatch)
+                        ) {}
                     }
                 }
             }
+            assertTrue(positionedLatch.await(1, TimeUnit.SECONDS))
+
+            assertEquals(IntSize(sizeIpx, sizeIpx), size[0].value)
+            assertEquals(Offset.Zero, position[0].value)
+
+            assertEquals(IntSize(0, sizeIpx), size[1].value)
+            assertEquals(Offset(0f, sizeIpx.toFloat()), position[1].value)
+
+            assertEquals(IntSize(sizeIpx, sizeIpx), size[2].value)
+            assertEquals(Offset(0f, (sizeIpx * 2).toFloat()), position[2].value)
+
+            assertEquals(IntSize(sizeIpx, sizeIpx), size[3].value)
+            assertEquals(Offset(0f, (sizeIpx * 3).toFloat()), position[3].value)
+
+            assertEquals(IntSize((sizeDp * 2).roundToPx(), sizeIpx), size[4].value)
+            assertEquals(Offset(0f, (sizeIpx * 4).toFloat()), position[4].value)
+
+            assertEquals(IntSize(sizeIpx, sizeIpx), size[5].value)
+            assertEquals(Offset(0f, (sizeIpx * 5).toFloat()), position[5].value)
         }
-        assertTrue(positionedLatch.await(1, TimeUnit.SECONDS))
-
-        assertEquals(IntSize(sizeIpx, sizeIpx), size[0].value)
-        assertEquals(Offset.Zero, position[0].value)
-
-        assertEquals(IntSize(0, sizeIpx), size[1].value)
-        assertEquals(Offset(0f, sizeIpx.toFloat()), position[1].value)
-
-        assertEquals(IntSize(sizeIpx, sizeIpx), size[2].value)
-        assertEquals(Offset(0f, (sizeIpx * 2).toFloat()), position[2].value)
-
-        assertEquals(IntSize(sizeIpx, sizeIpx), size[3].value)
-        assertEquals(Offset(0f, (sizeIpx * 3).toFloat()), position[3].value)
-
-        assertEquals(IntSize((sizeDp * 2).roundToPx(), sizeIpx), size[4].value)
-        assertEquals(Offset(0f, (sizeIpx * 4).toFloat()), position[4].value)
-
-        assertEquals(IntSize(sizeIpx, sizeIpx), size[5].value)
-        assertEquals(Offset(0f, (sizeIpx * 5).toFloat()), position[5].value)
-    }
 
     @Test
-    fun testPreferredSize_withHeightSizeModifiers() = with(density) {
-        val sizeDp = 10.toDp()
-        val sizeIpx = sizeDp.roundToPx()
+    fun testPreferredSize_withHeightSizeModifiers() =
+        with(density) {
+            val sizeDp = 10.toDp()
+            val sizeIpx = sizeDp.roundToPx()
 
-        val positionedLatch = CountDownLatch(6)
-        val size = MutableList(6) { Ref<IntSize>() }
-        val position = MutableList(6) { Ref<Offset>() }
-        show {
-            Box {
-                Row {
-                    Container(
-                        Modifier.heightIn(min = sizeDp, max = sizeDp * 2)
-                            .width(sizeDp)
-                            .saveLayoutInfo(size[0], position[0], positionedLatch)
-                    ) {
-                    }
-                    Container(
-                        Modifier.heightIn(max = sizeDp * 2)
-                            .width(sizeDp)
-                            .saveLayoutInfo(size[1], position[1], positionedLatch)
-                    ) {
-                    }
-                    Container(
-                        Modifier.heightIn(min = sizeDp)
-                            .width(sizeDp)
-                            .saveLayoutInfo(size[2], position[2], positionedLatch)
-                    ) {
-                    }
-                    Container(
-                        Modifier.heightIn(max = sizeDp)
-                            .heightIn(min = sizeDp * 2)
-                            .width(sizeDp)
-                            .saveLayoutInfo(size[3], position[3], positionedLatch)
-                    ) {
-                    }
-                    Container(
-                        Modifier.heightIn(min = sizeDp * 2)
-                            .heightIn(max = sizeDp)
-                            .width(sizeDp)
-                            .saveLayoutInfo(size[4], position[4], positionedLatch)
-                    ) {
-                    }
-                    Container(
-                        Modifier.height(sizeDp).then(Modifier.width(sizeDp)).then(
-                            Modifier.saveLayoutInfo(size[5], position[5], positionedLatch)
-                        )
-                    ) {
+            val positionedLatch = CountDownLatch(6)
+            val size = MutableList(6) { Ref<IntSize>() }
+            val position = MutableList(6) { Ref<Offset>() }
+            show {
+                Box {
+                    Row {
+                        Container(
+                            Modifier.heightIn(min = sizeDp, max = sizeDp * 2)
+                                .width(sizeDp)
+                                .saveLayoutInfo(size[0], position[0], positionedLatch)
+                        ) {}
+                        Container(
+                            Modifier.heightIn(max = sizeDp * 2)
+                                .width(sizeDp)
+                                .saveLayoutInfo(size[1], position[1], positionedLatch)
+                        ) {}
+                        Container(
+                            Modifier.heightIn(min = sizeDp)
+                                .width(sizeDp)
+                                .saveLayoutInfo(size[2], position[2], positionedLatch)
+                        ) {}
+                        Container(
+                            Modifier.heightIn(max = sizeDp)
+                                .heightIn(min = sizeDp * 2)
+                                .width(sizeDp)
+                                .saveLayoutInfo(size[3], position[3], positionedLatch)
+                        ) {}
+                        Container(
+                            Modifier.heightIn(min = sizeDp * 2)
+                                .heightIn(max = sizeDp)
+                                .width(sizeDp)
+                                .saveLayoutInfo(size[4], position[4], positionedLatch)
+                        ) {}
+                        Container(
+                            Modifier.height(sizeDp)
+                                .then(Modifier.width(sizeDp))
+                                .then(
+                                    Modifier.saveLayoutInfo(size[5], position[5], positionedLatch)
+                                )
+                        ) {}
                     }
                 }
             }
+            assertTrue(positionedLatch.await(1, TimeUnit.SECONDS))
+
+            assertEquals(IntSize(sizeIpx, sizeIpx), size[0].value)
+            assertEquals(Offset.Zero, position[0].value)
+
+            assertEquals(IntSize(sizeIpx, 0), size[1].value)
+            assertEquals(Offset(sizeIpx.toFloat(), 0f), position[1].value)
+
+            assertEquals(IntSize(sizeIpx, sizeIpx), size[2].value)
+            assertEquals(Offset((sizeIpx * 2).toFloat(), 0f), position[2].value)
+
+            assertEquals(IntSize(sizeIpx, sizeIpx), size[3].value)
+            assertEquals(Offset((sizeIpx * 3).toFloat(), 0f), position[3].value)
+
+            assertEquals(IntSize(sizeIpx, (sizeDp * 2).roundToPx()), size[4].value)
+            assertEquals(Offset((sizeIpx * 4).toFloat(), 0f), position[4].value)
+
+            assertEquals(IntSize(sizeIpx, sizeIpx), size[5].value)
+            assertEquals(Offset((sizeIpx * 5).toFloat(), 0f), position[5].value)
         }
-        assertTrue(positionedLatch.await(1, TimeUnit.SECONDS))
-
-        assertEquals(IntSize(sizeIpx, sizeIpx), size[0].value)
-        assertEquals(Offset.Zero, position[0].value)
-
-        assertEquals(IntSize(sizeIpx, 0), size[1].value)
-        assertEquals(Offset(sizeIpx.toFloat(), 0f), position[1].value)
-
-        assertEquals(IntSize(sizeIpx, sizeIpx), size[2].value)
-        assertEquals(Offset((sizeIpx * 2).toFloat(), 0f), position[2].value)
-
-        assertEquals(IntSize(sizeIpx, sizeIpx), size[3].value)
-        assertEquals(Offset((sizeIpx * 3).toFloat(), 0f), position[3].value)
-
-        assertEquals(IntSize(sizeIpx, (sizeDp * 2).roundToPx()), size[4].value)
-        assertEquals(Offset((sizeIpx * 4).toFloat(), 0f), position[4].value)
-
-        assertEquals(IntSize(sizeIpx, sizeIpx), size[5].value)
-        assertEquals(Offset((sizeIpx * 5).toFloat(), 0f), position[5].value)
-    }
 
     @Test
-    fun testPreferredSize_withSizeModifiers() = with(density) {
-        val sizeDp = 50.toDp()
-        val sizeIpx = sizeDp.roundToPx()
+    fun testPreferredSize_withSizeModifiers() =
+        with(density) {
+            val sizeDp = 50.toDp()
+            val sizeIpx = sizeDp.roundToPx()
 
-        val positionedLatch = CountDownLatch(5)
-        val size = MutableList(5) { Ref<IntSize>() }
-        val position = MutableList(5) { Ref<Offset>() }
-        show {
-            Box {
-                Row {
-                    val maxSize = sizeDp * 2
-                    Container(
-                        Modifier.sizeIn(maxWidth = maxSize, maxHeight = maxSize)
-                            .sizeIn(minWidth = sizeDp, minHeight = sizeDp)
-                            .saveLayoutInfo(size[0], position[0], positionedLatch)
-                    ) {
-                    }
-                    Container(
-                        Modifier.sizeIn(maxWidth = sizeDp, maxHeight = sizeDp)
-                            .sizeIn(minWidth = sizeDp * 2, minHeight = sizeDp)
-                            .saveLayoutInfo(size[1], position[1], positionedLatch)
-                    ) {
-                    }
-                    val maxSize1 = sizeDp * 2
-                    Container(
-                        Modifier.sizeIn(minWidth = sizeDp, minHeight = sizeDp)
-                            .sizeIn(maxWidth = maxSize1, maxHeight = maxSize1)
-                            .saveLayoutInfo(size[2], position[2], positionedLatch)
-                    ) {
-                    }
-                    val minSize = sizeDp * 2
-                    Container(
-                        Modifier.sizeIn(minWidth = minSize, minHeight = minSize)
-                            .sizeIn(maxWidth = sizeDp, maxHeight = sizeDp)
-                            .saveLayoutInfo(size[3], position[3], positionedLatch)
-                    ) {
-                    }
-                    Container(
-                        Modifier.size(sizeDp)
-                            .saveLayoutInfo(size[4], position[4], positionedLatch)
-                    ) {
+            val positionedLatch = CountDownLatch(5)
+            val size = MutableList(5) { Ref<IntSize>() }
+            val position = MutableList(5) { Ref<Offset>() }
+            show {
+                Box {
+                    Row {
+                        val maxSize = sizeDp * 2
+                        Container(
+                            Modifier.sizeIn(maxWidth = maxSize, maxHeight = maxSize)
+                                .sizeIn(minWidth = sizeDp, minHeight = sizeDp)
+                                .saveLayoutInfo(size[0], position[0], positionedLatch)
+                        ) {}
+                        Container(
+                            Modifier.sizeIn(maxWidth = sizeDp, maxHeight = sizeDp)
+                                .sizeIn(minWidth = sizeDp * 2, minHeight = sizeDp)
+                                .saveLayoutInfo(size[1], position[1], positionedLatch)
+                        ) {}
+                        val maxSize1 = sizeDp * 2
+                        Container(
+                            Modifier.sizeIn(minWidth = sizeDp, minHeight = sizeDp)
+                                .sizeIn(maxWidth = maxSize1, maxHeight = maxSize1)
+                                .saveLayoutInfo(size[2], position[2], positionedLatch)
+                        ) {}
+                        val minSize = sizeDp * 2
+                        Container(
+                            Modifier.sizeIn(minWidth = minSize, minHeight = minSize)
+                                .sizeIn(maxWidth = sizeDp, maxHeight = sizeDp)
+                                .saveLayoutInfo(size[3], position[3], positionedLatch)
+                        ) {}
+                        Container(
+                            Modifier.size(sizeDp)
+                                .saveLayoutInfo(size[4], position[4], positionedLatch)
+                        ) {}
                     }
                 }
             }
+            assertTrue(positionedLatch.await(1, TimeUnit.SECONDS))
+
+            assertEquals(IntSize(sizeIpx, sizeIpx), size[0].value)
+            assertEquals(Offset.Zero, position[0].value)
+
+            assertEquals(IntSize(sizeIpx, sizeIpx), size[1].value)
+            assertEquals(Offset(sizeIpx.toFloat(), 0f), position[1].value)
+
+            assertEquals(IntSize(sizeIpx, sizeIpx), size[2].value)
+            assertEquals(Offset((sizeIpx * 2).toFloat(), 0f), position[2].value)
+
+            assertEquals(IntSize(sizeIpx * 2, sizeIpx * 2), size[3].value)
+            assertEquals(Offset((sizeIpx * 3).toFloat(), 0f), position[3].value)
+
+            assertEquals(IntSize(sizeIpx, sizeIpx), size[4].value)
+            assertEquals(Offset((sizeIpx * 5).toFloat(), 0f), position[4].value)
         }
-        assertTrue(positionedLatch.await(1, TimeUnit.SECONDS))
-
-        assertEquals(IntSize(sizeIpx, sizeIpx), size[0].value)
-        assertEquals(Offset.Zero, position[0].value)
-
-        assertEquals(IntSize(sizeIpx, sizeIpx), size[1].value)
-        assertEquals(Offset(sizeIpx.toFloat(), 0f), position[1].value)
-
-        assertEquals(IntSize(sizeIpx, sizeIpx), size[2].value)
-        assertEquals(Offset((sizeIpx * 2).toFloat(), 0f), position[2].value)
-
-        assertEquals(IntSize(sizeIpx * 2, sizeIpx * 2), size[3].value)
-        assertEquals(Offset((sizeIpx * 3).toFloat(), 0f), position[3].value)
-
-        assertEquals(IntSize(sizeIpx, sizeIpx), size[4].value)
-        assertEquals(Offset((sizeIpx * 5).toFloat(), 0f), position[4].value)
-    }
 
     @Test
-    fun testPreferredSizeModifiers_respectMaxConstraint() = with(density) {
-        val sizeDp = 100.toDp()
-        val size = sizeDp.roundToPx()
+    fun testPreferredSizeModifiers_respectMaxConstraint() =
+        with(density) {
+            val sizeDp = 100.toDp()
+            val size = sizeDp.roundToPx()
 
-        val positionedLatch = CountDownLatch(2)
-        val constrainedBoxSize = Ref<IntSize>()
-        val childSize = Ref<IntSize>()
-        val childPosition = Ref<Offset>()
-        show {
-            Box {
-                Container(width = sizeDp, height = sizeDp) {
-                    Container(
-                        Modifier.width(sizeDp * 2)
-                            .height(sizeDp * 3)
-                            .onGloballyPositioned { coordinates: LayoutCoordinates ->
+            val positionedLatch = CountDownLatch(2)
+            val constrainedBoxSize = Ref<IntSize>()
+            val childSize = Ref<IntSize>()
+            val childPosition = Ref<Offset>()
+            show {
+                Box {
+                    Container(width = sizeDp, height = sizeDp) {
+                        Container(
+                            Modifier.width(sizeDp * 2).height(sizeDp * 3).onGloballyPositioned {
+                                coordinates: LayoutCoordinates ->
                                 constrainedBoxSize.value = coordinates.size
                                 positionedLatch.countDown()
                             }
-                    ) {
-                        Container(
-                            expanded = true,
-                            modifier = Modifier.saveLayoutInfo(
-                                size = childSize,
-                                position = childPosition,
-                                positionedLatch = positionedLatch
-                            )
                         ) {
+                            Container(
+                                expanded = true,
+                                modifier =
+                                    Modifier.saveLayoutInfo(
+                                        size = childSize,
+                                        position = childPosition,
+                                        positionedLatch = positionedLatch
+                                    )
+                            ) {}
                         }
                     }
                 }
             }
-        }
-        assertTrue(positionedLatch.await(1, TimeUnit.SECONDS))
+            assertTrue(positionedLatch.await(1, TimeUnit.SECONDS))
 
-        assertEquals(IntSize(size, size), constrainedBoxSize.value)
-        assertEquals(IntSize(size, size), childSize.value)
-        assertEquals(Offset.Zero, childPosition.value)
-    }
+            assertEquals(IntSize(size, size), constrainedBoxSize.value)
+            assertEquals(IntSize(size, size), childSize.value)
+            assertEquals(Offset.Zero, childPosition.value)
+        }
 
     @Test
-    fun testMaxModifiers_withInfiniteValue() = with(density) {
-        val sizeDp = 20.toDp()
-        val sizeIpx = sizeDp.roundToPx()
+    fun testMaxModifiers_withInfiniteValue() =
+        with(density) {
+            val sizeDp = 20.toDp()
+            val sizeIpx = sizeDp.roundToPx()
 
-        val positionedLatch = CountDownLatch(4)
-        val size = MutableList(4) { Ref<IntSize>() }
-        val position = MutableList(4) { Ref<Offset>() }
-        show {
-            Box {
-                Row {
-                    Container(Modifier.widthIn(max = Dp.Infinity)) {
-                        Container(
-                            width = sizeDp, height = sizeDp,
-                            modifier = Modifier.saveLayoutInfo(
-                                size[0], position[0],
-                                positionedLatch
-                            )
-                        ) {
+            val positionedLatch = CountDownLatch(4)
+            val size = MutableList(4) { Ref<IntSize>() }
+            val position = MutableList(4) { Ref<Offset>() }
+            show {
+                Box {
+                    Row {
+                        Container(Modifier.widthIn(max = Dp.Infinity)) {
+                            Container(
+                                width = sizeDp,
+                                height = sizeDp,
+                                modifier =
+                                    Modifier.saveLayoutInfo(size[0], position[0], positionedLatch)
+                            ) {}
                         }
-                    }
-                    Container(Modifier.heightIn(max = Dp.Infinity)) {
-                        Container(
-                            width = sizeDp, height = sizeDp,
-                            modifier = Modifier.saveLayoutInfo(
-                                size[1],
-                                position[1],
-                                positionedLatch
-                            )
-                        ) {
+                        Container(Modifier.heightIn(max = Dp.Infinity)) {
+                            Container(
+                                width = sizeDp,
+                                height = sizeDp,
+                                modifier =
+                                    Modifier.saveLayoutInfo(size[1], position[1], positionedLatch)
+                            ) {}
                         }
-                    }
-                    Container(
-                        Modifier.width(sizeDp)
-                            .height(sizeDp)
-                            .widthIn(max = Dp.Infinity)
-                            .heightIn(max = Dp.Infinity)
-                            .saveLayoutInfo(size[2], position[2], positionedLatch)
-                    ) {
-                    }
-                    Container(
-                        Modifier.sizeIn(
-                            maxWidth = Dp.Infinity,
-                            maxHeight = Dp.Infinity
-                        )
-                    ) {
                         Container(
-                            width = sizeDp,
-                            height = sizeDp,
-                            modifier = Modifier.saveLayoutInfo(
-                                size[3],
-                                position[3],
-                                positionedLatch
-                            )
+                            Modifier.width(sizeDp)
+                                .height(sizeDp)
+                                .widthIn(max = Dp.Infinity)
+                                .heightIn(max = Dp.Infinity)
+                                .saveLayoutInfo(size[2], position[2], positionedLatch)
+                        ) {}
+                        Container(
+                            Modifier.sizeIn(maxWidth = Dp.Infinity, maxHeight = Dp.Infinity)
                         ) {
+                            Container(
+                                width = sizeDp,
+                                height = sizeDp,
+                                modifier =
+                                    Modifier.saveLayoutInfo(size[3], position[3], positionedLatch)
+                            ) {}
                         }
                     }
                 }
             }
-        }
-        assertTrue(positionedLatch.await(1, TimeUnit.SECONDS))
+            assertTrue(positionedLatch.await(1, TimeUnit.SECONDS))
 
-        assertEquals(IntSize(sizeIpx, sizeIpx), size[0].value)
-        assertEquals(IntSize(sizeIpx, sizeIpx), size[1].value)
-        assertEquals(IntSize(sizeIpx, sizeIpx), size[2].value)
-        assertEquals(IntSize(sizeIpx, sizeIpx), size[3].value)
-    }
+            assertEquals(IntSize(sizeIpx, sizeIpx), size[0].value)
+            assertEquals(IntSize(sizeIpx, sizeIpx), size[1].value)
+            assertEquals(IntSize(sizeIpx, sizeIpx), size[2].value)
+            assertEquals(IntSize(sizeIpx, sizeIpx), size[3].value)
+        }
 
     @Test
-    fun testSize_smallerInLarger() = with(density) {
-        val sizeIpx = 64
-        val sizeDp = sizeIpx.toDp()
+    fun testSize_smallerInLarger() =
+        with(density) {
+            val sizeIpx = 64
+            val sizeDp = sizeIpx.toDp()
 
-        val positionedLatch = CountDownLatch(1)
-        val boxSize = Ref<IntSize>()
-        val boxPosition = Ref<Offset>()
-        show {
-            Box(
-                Modifier.wrapContentSize(Alignment.TopStart)
-                    .requiredSize(sizeDp * 2)
-                    .requiredSize(sizeDp)
-                    .saveLayoutInfo(boxSize, boxPosition, positionedLatch)
+            val positionedLatch = CountDownLatch(1)
+            val boxSize = Ref<IntSize>()
+            val boxPosition = Ref<Offset>()
+            show {
+                Box(
+                    Modifier.wrapContentSize(Alignment.TopStart)
+                        .requiredSize(sizeDp * 2)
+                        .requiredSize(sizeDp)
+                        .saveLayoutInfo(boxSize, boxPosition, positionedLatch)
+                )
+            }
+            assertTrue(positionedLatch.await(1, TimeUnit.SECONDS))
+
+            assertEquals(IntSize(sizeIpx, sizeIpx), boxSize.value)
+            assertEquals(
+                Offset((sizeIpx / 2).toFloat(), (sizeIpx / 2).toFloat()),
+                boxPosition.value
             )
         }
-        assertTrue(positionedLatch.await(1, TimeUnit.SECONDS))
-
-        assertEquals(IntSize(sizeIpx, sizeIpx), boxSize.value)
-        assertEquals(
-            Offset(
-                (sizeIpx / 2).toFloat(),
-                (sizeIpx / 2).toFloat()
-            ),
-            boxPosition.value
-        )
-    }
 
     @Test
-    fun testSize_smallerBoxInLargerBox() = with(density) {
-        val sizeIpx = 64
-        val sizeDp = sizeIpx.toDp()
+    fun testSize_smallerBoxInLargerBox() =
+        with(density) {
+            val sizeIpx = 64
+            val sizeDp = sizeIpx.toDp()
 
-        val positionedLatch = CountDownLatch(1)
-        val boxSize = Ref<IntSize>()
-        val boxPosition = Ref<Offset>()
-        show {
-            Box(
-                Modifier.wrapContentSize(Alignment.TopStart).requiredSize(sizeDp * 2),
-                propagateMinConstraints = true
-            ) {
+            val positionedLatch = CountDownLatch(1)
+            val boxSize = Ref<IntSize>()
+            val boxPosition = Ref<Offset>()
+            show {
                 Box(
-                    Modifier.requiredSize(sizeDp)
-                        .onGloballyPositioned {
+                    Modifier.wrapContentSize(Alignment.TopStart).requiredSize(sizeDp * 2),
+                    propagateMinConstraints = true
+                ) {
+                    Box(
+                        Modifier.requiredSize(sizeDp).onGloballyPositioned {
                             boxSize.value = it.size
                             boxPosition.value = it.positionInRoot()
                             positionedLatch.countDown()
                         }
-                )
+                    )
+                }
             }
-        }
-        assertTrue(positionedLatch.await(1, TimeUnit.SECONDS))
+            assertTrue(positionedLatch.await(1, TimeUnit.SECONDS))
 
-        assertEquals(IntSize(sizeIpx, sizeIpx), boxSize.value)
-        assertEquals(
-            Offset(
-                (sizeIpx / 2).toFloat(),
-                (sizeIpx / 2).toFloat()
-            ),
-            boxPosition.value
-        )
-    }
-
-    @Test
-    fun testSize_largerInSmaller() = with(density) {
-        val sizeIpx = 64
-        val sizeDp = sizeIpx.toDp()
-
-        val positionedLatch = CountDownLatch(1)
-        val boxSize = Ref<IntSize>()
-        val boxPosition = Ref<Offset>()
-        show {
-            Box(
-                Modifier.wrapContentSize(Alignment.TopStart)
-                    .requiredSize(sizeDp)
-                    .requiredSize(sizeDp * 2)
-                    .saveLayoutInfo(boxSize, boxPosition, positionedLatch)
+            assertEquals(IntSize(sizeIpx, sizeIpx), boxSize.value)
+            assertEquals(
+                Offset((sizeIpx / 2).toFloat(), (sizeIpx / 2).toFloat()),
+                boxPosition.value
             )
         }
-        assertTrue(positionedLatch.await(1, TimeUnit.SECONDS))
-
-        assertEquals(IntSize(sizeIpx * 2, sizeIpx * 2), boxSize.value)
-        assertEquals(
-            Offset((-sizeIpx / 2).toFloat(), (-sizeIpx / 2).toFloat()),
-            boxPosition.value
-        )
-    }
 
     @Test
-    fun testMeasurementConstraints_preferredSatisfiable() = with(density) {
-        assertConstraints(
-            Constraints(10, 30, 15, 35),
-            Modifier.width(20.toDp()),
-            Constraints(20, 20, 15, 35)
-        )
-        assertConstraints(
-            Constraints(10, 30, 15, 35),
-            Modifier.height(20.toDp()),
-            Constraints(10, 30, 20, 20)
-        )
-        assertConstraints(
-            Constraints(10, 30, 15, 35),
-            Modifier.size(20.toDp()),
-            Constraints(20, 20, 20, 20)
-        )
-        assertConstraints(
-            Constraints(10, 30, 15, 35),
-            Modifier.widthIn(20.toDp(), 25.toDp()),
-            Constraints(20, 25, 15, 35)
-        )
-        assertConstraints(
-            Constraints(10, 30, 15, 35),
-            Modifier.heightIn(20.toDp(), 25.toDp()),
-            Constraints(10, 30, 20, 25)
-        )
-        assertConstraints(
-            Constraints(10, 30, 15, 35),
-            Modifier.sizeIn(20.toDp(), 20.toDp(), 25.toDp(), 25.toDp()),
-            Constraints(20, 25, 20, 25)
-        )
-    }
+    fun testSize_largerInSmaller() =
+        with(density) {
+            val sizeIpx = 64
+            val sizeDp = sizeIpx.toDp()
 
-    @Test
-    fun testMeasurementConstraints_preferredUnsatisfiable() = with(density) {
-        assertConstraints(
-            Constraints(20, 40, 15, 35),
-            Modifier.width(15.toDp()),
-            Constraints(20, 20, 15, 35)
-        )
-        assertConstraints(
-            Constraints(10, 30, 15, 35),
-            Modifier.height(10.toDp()),
-            Constraints(10, 30, 15, 15)
-        )
-        assertConstraints(
-            Constraints(10, 30, 15, 35),
-            Modifier.size(40.toDp()),
-            Constraints(30, 30, 35, 35)
-        )
-        assertConstraints(
-            Constraints(20, 30, 15, 35),
-            Modifier.widthIn(10.toDp(), 15.toDp()),
-            Constraints(20, 20, 15, 35)
-        )
-        assertConstraints(
-            Constraints(10, 30, 15, 35),
-            Modifier.heightIn(5.toDp(), 10.toDp()),
-            Constraints(10, 30, 15, 15)
-        )
-        assertConstraints(
-            Constraints(10, 30, 15, 35),
-            Modifier.sizeIn(40.toDp(), 50.toDp(), 45.toDp(), 55.toDp()),
-            Constraints(30, 30, 35, 35)
-        )
-    }
-
-    @Test
-    fun testMeasurementConstraints_compulsorySatisfiable() = with(density) {
-        assertConstraints(
-            Constraints(10, 30, 15, 35),
-            Modifier.requiredWidth(20.toDp()),
-            Constraints(20, 20, 15, 35)
-        )
-        assertConstraints(
-            Constraints(10, 30, 15, 35),
-            Modifier.requiredHeight(20.toDp()),
-            Constraints(10, 30, 20, 20)
-        )
-        assertConstraints(
-            Constraints(10, 30, 15, 35),
-            Modifier.requiredSize(20.toDp()),
-            Constraints(20, 20, 20, 20)
-        )
-        assertConstraints(
-            Constraints(10, 30, 15, 35),
-            Modifier.requiredWidthIn(20.toDp(), 25.toDp()),
-            Constraints(20, 25, 15, 35)
-        )
-        assertConstraints(
-            Constraints(10, 30, 15, 35),
-            Modifier.requiredHeightIn(20.toDp(), 25.toDp()),
-            Constraints(10, 30, 20, 25)
-        )
-        assertConstraints(
-            Constraints(10, 30, 15, 35),
-            Modifier.requiredSizeIn(20.toDp(), 20.toDp(), 25.toDp(), 25.toDp()),
-            Constraints(20, 25, 20, 25)
-        )
-    }
-
-    @Test
-    fun testMeasurementConstraints_compulsoryUnsatisfiable() = with(density) {
-        assertConstraints(
-            Constraints(20, 40, 15, 35),
-            Modifier.requiredWidth(15.toDp()),
-            Constraints(15, 15, 15, 35)
-        )
-        assertConstraints(
-            Constraints(10, 30, 15, 35),
-            Modifier.requiredHeight(10.toDp()),
-            Constraints(10, 30, 10, 10)
-        )
-        assertConstraints(
-            Constraints(10, 30, 15, 35),
-            Modifier.requiredSize(40.toDp()),
-            Constraints(40, 40, 40, 40)
-        )
-        assertConstraints(
-            Constraints(20, 30, 15, 35),
-            Modifier.requiredWidthIn(10.toDp(), 15.toDp()),
-            Constraints(10, 15, 15, 35)
-        )
-        assertConstraints(
-            Constraints(10, 30, 15, 35),
-            Modifier.requiredHeightIn(5.toDp(), 10.toDp()),
-            Constraints(10, 30, 5, 10)
-        )
-        assertConstraints(
-            Constraints(10, 30, 15, 35),
-            Modifier.requiredSizeIn(40.toDp(), 50.toDp(), 45.toDp(), 55.toDp()),
-            Constraints(40, 45, 50, 55)
-        )
-        // When one dimension is unspecified and the other contradicts the incoming constraint.
-        assertConstraints(
-            Constraints(10, 10, 10, 10),
-            Modifier.requiredSizeIn(20.toDp(), 30.toDp(), Dp.Unspecified, Dp.Unspecified),
-            Constraints(20, 20, 30, 30)
-        )
-        assertConstraints(
-            Constraints(40, 40, 40, 40),
-            Modifier.requiredSizeIn(Dp.Unspecified, Dp.Unspecified, 20.toDp(), 30.toDp()),
-            Constraints(20, 20, 30, 30)
-        )
-    }
-
-    @Test
-    fun testDefaultMinSize() = with(density) {
-        val latch = CountDownLatch(3)
-        show {
-            // Constraints are applied.
-            Layout(
-                {},
-                Modifier.wrapContentSize()
-                    .requiredSizeIn(maxWidth = 30.toDp(), maxHeight = 40.toDp())
-                    .defaultMinSize(minWidth = 10.toDp(), minHeight = 20.toDp())
-            ) { _, constraints ->
-                assertEquals(10, constraints.minWidth)
-                assertEquals(20, constraints.minHeight)
-                assertEquals(30, constraints.maxWidth)
-                assertEquals(40, constraints.maxHeight)
-                latch.countDown()
-                layout(0, 0) {}
-            }
-            // Constraints are not applied.
-            Layout(
-                {},
-                Modifier.requiredSizeIn(
-                    minWidth = 10.toDp(),
-                    minHeight = 20.toDp(),
-                    maxWidth = 100.toDp(),
-                    maxHeight = 110.toDp()
-                ).defaultMinSize(
-                    minWidth = 50.toDp(),
-                    minHeight = 50.toDp()
+            val positionedLatch = CountDownLatch(1)
+            val boxSize = Ref<IntSize>()
+            val boxPosition = Ref<Offset>()
+            show {
+                Box(
+                    Modifier.wrapContentSize(Alignment.TopStart)
+                        .requiredSize(sizeDp)
+                        .requiredSize(sizeDp * 2)
+                        .saveLayoutInfo(boxSize, boxPosition, positionedLatch)
                 )
-            ) { _, constraints ->
-                assertEquals(10, constraints.minWidth)
-                assertEquals(20, constraints.minHeight)
-                assertEquals(100, constraints.maxWidth)
-                assertEquals(110, constraints.maxHeight)
-                latch.countDown()
-                layout(0, 0) {}
             }
-            // Defaults values are not changing.
-            Layout(
-                {},
+            assertTrue(positionedLatch.await(1, TimeUnit.SECONDS))
+
+            assertEquals(IntSize(sizeIpx * 2, sizeIpx * 2), boxSize.value)
+            assertEquals(
+                Offset((-sizeIpx / 2).toFloat(), (-sizeIpx / 2).toFloat()),
+                boxPosition.value
+            )
+        }
+
+    @Test
+    fun testMeasurementConstraints_preferredSatisfiable() =
+        with(density) {
+            assertConstraints(
+                Constraints(10, 30, 15, 35),
+                Modifier.width(20.toDp()),
+                Constraints(20, 20, 15, 35)
+            )
+            assertConstraints(
+                Constraints(10, 30, 15, 35),
+                Modifier.height(20.toDp()),
+                Constraints(10, 30, 20, 20)
+            )
+            assertConstraints(
+                Constraints(10, 30, 15, 35),
+                Modifier.size(20.toDp()),
+                Constraints(20, 20, 20, 20)
+            )
+            assertConstraints(
+                Constraints(10, 30, 15, 35),
+                Modifier.widthIn(20.toDp(), 25.toDp()),
+                Constraints(20, 25, 15, 35)
+            )
+            assertConstraints(
+                Constraints(10, 30, 15, 35),
+                Modifier.heightIn(20.toDp(), 25.toDp()),
+                Constraints(10, 30, 20, 25)
+            )
+            assertConstraints(
+                Constraints(10, 30, 15, 35),
+                Modifier.sizeIn(20.toDp(), 20.toDp(), 25.toDp(), 25.toDp()),
+                Constraints(20, 25, 20, 25)
+            )
+        }
+
+    @Test
+    fun testMeasurementConstraints_preferredUnsatisfiable() =
+        with(density) {
+            assertConstraints(
+                Constraints(20, 40, 15, 35),
+                Modifier.width(15.toDp()),
+                Constraints(20, 20, 15, 35)
+            )
+            assertConstraints(
+                Constraints(10, 30, 15, 35),
+                Modifier.height(10.toDp()),
+                Constraints(10, 30, 15, 15)
+            )
+            assertConstraints(
+                Constraints(10, 30, 15, 35),
+                Modifier.size(40.toDp()),
+                Constraints(30, 30, 35, 35)
+            )
+            assertConstraints(
+                Constraints(20, 30, 15, 35),
+                Modifier.widthIn(10.toDp(), 15.toDp()),
+                Constraints(20, 20, 15, 35)
+            )
+            assertConstraints(
+                Constraints(10, 30, 15, 35),
+                Modifier.heightIn(5.toDp(), 10.toDp()),
+                Constraints(10, 30, 15, 15)
+            )
+            assertConstraints(
+                Constraints(10, 30, 15, 35),
+                Modifier.sizeIn(40.toDp(), 50.toDp(), 45.toDp(), 55.toDp()),
+                Constraints(30, 30, 35, 35)
+            )
+        }
+
+    @Test
+    fun testMeasurementConstraints_compulsorySatisfiable() =
+        with(density) {
+            assertConstraints(
+                Constraints(10, 30, 15, 35),
+                Modifier.requiredWidth(20.toDp()),
+                Constraints(20, 20, 15, 35)
+            )
+            assertConstraints(
+                Constraints(10, 30, 15, 35),
+                Modifier.requiredHeight(20.toDp()),
+                Constraints(10, 30, 20, 20)
+            )
+            assertConstraints(
+                Constraints(10, 30, 15, 35),
+                Modifier.requiredSize(20.toDp()),
+                Constraints(20, 20, 20, 20)
+            )
+            assertConstraints(
+                Constraints(10, 30, 15, 35),
+                Modifier.requiredWidthIn(20.toDp(), 25.toDp()),
+                Constraints(20, 25, 15, 35)
+            )
+            assertConstraints(
+                Constraints(10, 30, 15, 35),
+                Modifier.requiredHeightIn(20.toDp(), 25.toDp()),
+                Constraints(10, 30, 20, 25)
+            )
+            assertConstraints(
+                Constraints(10, 30, 15, 35),
+                Modifier.requiredSizeIn(20.toDp(), 20.toDp(), 25.toDp(), 25.toDp()),
+                Constraints(20, 25, 20, 25)
+            )
+        }
+
+    @Test
+    fun testMeasurementConstraints_compulsoryUnsatisfiable() =
+        with(density) {
+            assertConstraints(
+                Constraints(20, 40, 15, 35),
+                Modifier.requiredWidth(15.toDp()),
+                Constraints(15, 15, 15, 35)
+            )
+            assertConstraints(
+                Constraints(10, 30, 15, 35),
+                Modifier.requiredHeight(10.toDp()),
+                Constraints(10, 30, 10, 10)
+            )
+            assertConstraints(
+                Constraints(10, 30, 15, 35),
+                Modifier.requiredSize(40.toDp()),
+                Constraints(40, 40, 40, 40)
+            )
+            assertConstraints(
+                Constraints(20, 30, 15, 35),
+                Modifier.requiredWidthIn(10.toDp(), 15.toDp()),
+                Constraints(10, 15, 15, 35)
+            )
+            assertConstraints(
+                Constraints(10, 30, 15, 35),
+                Modifier.requiredHeightIn(5.toDp(), 10.toDp()),
+                Constraints(10, 30, 5, 10)
+            )
+            assertConstraints(
+                Constraints(10, 30, 15, 35),
+                Modifier.requiredSizeIn(40.toDp(), 50.toDp(), 45.toDp(), 55.toDp()),
+                Constraints(40, 45, 50, 55)
+            )
+            // When one dimension is unspecified and the other contradicts the incoming constraint.
+            assertConstraints(
+                Constraints(10, 10, 10, 10),
+                Modifier.requiredSizeIn(20.toDp(), 30.toDp(), Dp.Unspecified, Dp.Unspecified),
+                Constraints(20, 20, 30, 30)
+            )
+            assertConstraints(
+                Constraints(40, 40, 40, 40),
+                Modifier.requiredSizeIn(Dp.Unspecified, Dp.Unspecified, 20.toDp(), 30.toDp()),
+                Constraints(20, 20, 30, 30)
+            )
+        }
+
+    @Test
+    fun testDefaultMinSize() =
+        with(density) {
+            val latch = CountDownLatch(3)
+            show {
+                // Constraints are applied.
+                Layout(
+                    {},
+                    Modifier.wrapContentSize()
+                        .requiredSizeIn(maxWidth = 30.toDp(), maxHeight = 40.toDp())
+                        .defaultMinSize(minWidth = 10.toDp(), minHeight = 20.toDp())
+                ) { _, constraints ->
+                    assertEquals(10, constraints.minWidth)
+                    assertEquals(20, constraints.minHeight)
+                    assertEquals(30, constraints.maxWidth)
+                    assertEquals(40, constraints.maxHeight)
+                    latch.countDown()
+                    layout(0, 0) {}
+                }
+                // Constraints are not applied.
+                Layout(
+                    {},
+                    Modifier.requiredSizeIn(
+                            minWidth = 10.toDp(),
+                            minHeight = 20.toDp(),
+                            maxWidth = 100.toDp(),
+                            maxHeight = 110.toDp()
+                        )
+                        .defaultMinSize(minWidth = 50.toDp(), minHeight = 50.toDp())
+                ) { _, constraints ->
+                    assertEquals(10, constraints.minWidth)
+                    assertEquals(20, constraints.minHeight)
+                    assertEquals(100, constraints.maxWidth)
+                    assertEquals(110, constraints.maxHeight)
+                    latch.countDown()
+                    layout(0, 0) {}
+                }
+                // Defaults values are not changing.
+                Layout(
+                    {},
+                    Modifier.requiredSizeIn(
+                            minWidth = 10.toDp(),
+                            minHeight = 20.toDp(),
+                            maxWidth = 100.toDp(),
+                            maxHeight = 110.toDp()
+                        )
+                        .defaultMinSize()
+                ) { _, constraints ->
+                    assertEquals(10, constraints.minWidth)
+                    assertEquals(20, constraints.minHeight)
+                    assertEquals(100, constraints.maxWidth)
+                    assertEquals(110, constraints.maxHeight)
+                    latch.countDown()
+                    layout(0, 0) {}
+                }
+            }
+            assertTrue(latch.await(1, TimeUnit.SECONDS))
+        }
+
+    @Test
+    fun testDefaultMinSize_withCoercingMaxConstraints() =
+        with(density) {
+            val latch = CountDownLatch(1)
+            show {
+                Layout(
+                    {},
+                    Modifier.wrapContentSize()
+                        .requiredSizeIn(maxWidth = 30.toDp(), maxHeight = 40.toDp())
+                        .defaultMinSize(minWidth = 70.toDp(), minHeight = 80.toDp())
+                ) { _, constraints ->
+                    assertEquals(30, constraints.minWidth)
+                    assertEquals(40, constraints.minHeight)
+                    assertEquals(30, constraints.maxWidth)
+                    assertEquals(40, constraints.maxHeight)
+                    latch.countDown()
+                    layout(0, 0) {}
+                }
+            }
+            assertTrue(latch.await(1, TimeUnit.SECONDS))
+        }
+
+    @Test
+    fun testMinWidthModifier_hasCorrectIntrinsicMeasurements() =
+        with(density) {
+            testIntrinsics(
+                @Composable {
+                    Container(Modifier.widthIn(min = 10.toDp())) {
+                        Container(Modifier.aspectRatio(1f)) {}
+                    }
+                }
+            ) { minIntrinsicWidth, minIntrinsicHeight, maxIntrinsicWidth, maxIntrinsicHeight ->
+                // Min width.
+                assertEquals(10, minIntrinsicWidth(0))
+                assertEquals(10, minIntrinsicWidth(5))
+                assertEquals(50, minIntrinsicWidth(50))
+                assertEquals(10, minIntrinsicWidth(Constraints.Infinity))
+                // Min height.
+                assertEquals(0, minIntrinsicHeight(0))
+                assertEquals(35, minIntrinsicHeight(35))
+                assertEquals(50, minIntrinsicHeight(50))
+                assertEquals(0, minIntrinsicHeight(Constraints.Infinity))
+                // Max width.
+                assertEquals(10, maxIntrinsicWidth(0))
+                assertEquals(10, maxIntrinsicWidth(5))
+                assertEquals(50, maxIntrinsicWidth(50))
+                assertEquals(10, maxIntrinsicWidth(Constraints.Infinity))
+                // Max height.
+                assertEquals(0, maxIntrinsicHeight(0))
+                assertEquals(35, maxIntrinsicHeight(35))
+                assertEquals(50, maxIntrinsicHeight(50))
+                assertEquals(0, maxIntrinsicHeight(Constraints.Infinity))
+            }
+        }
+
+    @Test
+    fun testMaxWidthModifier_hasCorrectIntrinsicMeasurements() =
+        with(density) {
+            testIntrinsics(
+                @Composable {
+                    Container(Modifier.widthIn(max = 20.toDp())) {
+                        Container(Modifier.aspectRatio(1f)) {}
+                    }
+                }
+            ) { minIntrinsicWidth, minIntrinsicHeight, maxIntrinsicWidth, maxIntrinsicHeight ->
+                // Min width.
+                assertEquals(0, minIntrinsicWidth(0))
+                assertEquals(15, minIntrinsicWidth(15))
+                assertEquals(20, minIntrinsicWidth(50))
+                assertEquals(0, minIntrinsicWidth(Constraints.Infinity))
+                // Min height.
+                assertEquals(0, minIntrinsicHeight(0))
+                assertEquals(15, minIntrinsicHeight(15))
+                assertEquals(50, minIntrinsicHeight(50))
+                assertEquals(0, minIntrinsicHeight(Constraints.Infinity))
+                // Max width.
+                assertEquals(0, maxIntrinsicWidth(0))
+                assertEquals(15, maxIntrinsicWidth(15))
+                assertEquals(20, maxIntrinsicWidth(50))
+                assertEquals(0, maxIntrinsicWidth(Constraints.Infinity))
+                // Max height.
+                assertEquals(0, maxIntrinsicHeight(0))
+                assertEquals(15, maxIntrinsicHeight(15))
+                assertEquals(50, maxIntrinsicHeight(50))
+                assertEquals(0, maxIntrinsicHeight(Constraints.Infinity))
+            }
+        }
+
+    @Test
+    fun testMinHeightModifier_hasCorrectIntrinsicMeasurements() =
+        with(density) {
+            testIntrinsics(
+                @Composable {
+                    Container(Modifier.heightIn(min = 30.toDp())) {
+                        Container(Modifier.aspectRatio(1f)) {}
+                    }
+                }
+            ) { minIntrinsicWidth, minIntrinsicHeight, maxIntrinsicWidth, maxIntrinsicHeight ->
+                // Min width.
+                assertEquals(0, minIntrinsicWidth(0))
+                assertEquals(15, minIntrinsicWidth(15))
+                assertEquals(50, minIntrinsicWidth(50))
+                assertEquals(0, minIntrinsicWidth(Constraints.Infinity))
+                // Min height.
+                assertEquals(30, minIntrinsicHeight(0))
+                assertEquals(30, minIntrinsicHeight(15))
+                assertEquals(50, minIntrinsicHeight(50))
+                assertEquals(30, minIntrinsicHeight(Constraints.Infinity))
+                // Max width.
+                assertEquals(0, maxIntrinsicWidth(0))
+                assertEquals(15, maxIntrinsicWidth(15))
+                assertEquals(50, maxIntrinsicWidth(50))
+                assertEquals(0, maxIntrinsicWidth(Constraints.Infinity))
+                // Max height.
+                assertEquals(30, maxIntrinsicHeight(0))
+                assertEquals(30, maxIntrinsicHeight(15))
+                assertEquals(50, maxIntrinsicHeight(50))
+                assertEquals(30, maxIntrinsicHeight(Constraints.Infinity))
+            }
+        }
+
+    @Test
+    fun testMaxHeightModifier_hasCorrectIntrinsicMeasurements() =
+        with(density) {
+            testIntrinsics(
+                @Composable {
+                    Container(Modifier.heightIn(max = 40.toDp())) {
+                        Container(Modifier.aspectRatio(1f)) {}
+                    }
+                }
+            ) { minIntrinsicWidth, minIntrinsicHeight, maxIntrinsicWidth, maxIntrinsicHeight ->
+                // Min width.
+                assertEquals(0, minIntrinsicWidth(0))
+                assertEquals(15, minIntrinsicWidth(15))
+                assertEquals(50, minIntrinsicWidth(50))
+                assertEquals(0, minIntrinsicWidth(Constraints.Infinity))
+                // Min height.
+                assertEquals(0, minIntrinsicHeight(0))
+                assertEquals(15, minIntrinsicHeight(15))
+                assertEquals(40, minIntrinsicHeight(50))
+                assertEquals(0, minIntrinsicHeight(Constraints.Infinity))
+                // Max width.
+                assertEquals(0, maxIntrinsicWidth(0))
+                assertEquals(15, maxIntrinsicWidth(15))
+                assertEquals(50, maxIntrinsicWidth(50))
+                assertEquals(0, maxIntrinsicWidth(Constraints.Infinity))
+                // Max height.
+                assertEquals(0, maxIntrinsicHeight(0))
+                assertEquals(15, maxIntrinsicHeight(15))
+                assertEquals(40, maxIntrinsicHeight(50))
+                assertEquals(0, maxIntrinsicHeight(Constraints.Infinity))
+            }
+        }
+
+    @Test
+    fun testWidthModifier_hasCorrectIntrinsicMeasurements() =
+        with(density) {
+            testIntrinsics(
+                @Composable {
+                    Container(Modifier.width(10.toDp())) { Container(Modifier.aspectRatio(1f)) {} }
+                }
+            ) { minIntrinsicWidth, minIntrinsicHeight, maxIntrinsicWidth, maxIntrinsicHeight ->
+                // Min width.
+                assertEquals(10, minIntrinsicWidth(0))
+                assertEquals(10, minIntrinsicWidth(10))
+                assertEquals(10, minIntrinsicWidth(75))
+                assertEquals(10, minIntrinsicWidth(Constraints.Infinity))
+                // Min height.
+                assertEquals(0, minIntrinsicHeight(0))
+                assertEquals(35, minIntrinsicHeight(35))
+                assertEquals(70, minIntrinsicHeight(70))
+                assertEquals(0, minIntrinsicHeight(Constraints.Infinity))
+                // Max width.
+                assertEquals(10, maxIntrinsicWidth(0))
+                assertEquals(10, maxIntrinsicWidth(15))
+                assertEquals(10, maxIntrinsicWidth(75))
+                assertEquals(10, maxIntrinsicWidth(Constraints.Infinity))
+                // Max height.
+                assertEquals(0, maxIntrinsicHeight(0))
+                assertEquals(35, maxIntrinsicHeight(35))
+                assertEquals(70, maxIntrinsicHeight(70))
+                assertEquals(0, maxIntrinsicHeight(Constraints.Infinity))
+            }
+        }
+
+    @Test
+    fun testHeightModifier_hasCorrectIntrinsicMeasurements() =
+        with(density) {
+            testIntrinsics(
+                @Composable {
+                    Container(Modifier.height(10.toDp())) { Container(Modifier.aspectRatio(1f)) {} }
+                }
+            ) { minIntrinsicWidth, minIntrinsicHeight, maxIntrinsicWidth, maxIntrinsicHeight ->
+                // Min width.
+                assertEquals(0, minIntrinsicWidth(0))
+                assertEquals(15, minIntrinsicWidth(15))
+                assertEquals(75, minIntrinsicWidth(75))
+                assertEquals(0, minIntrinsicWidth(Constraints.Infinity))
+                // Min height.
+                assertEquals(10, minIntrinsicHeight(0))
+                assertEquals(10, minIntrinsicHeight(35))
+                assertEquals(10, minIntrinsicHeight(70))
+                assertEquals(10, minIntrinsicHeight(Constraints.Infinity))
+                // Max width.
+                assertEquals(0, maxIntrinsicWidth(0))
+                assertEquals(15, maxIntrinsicWidth(15))
+                assertEquals(75, maxIntrinsicWidth(75))
+                assertEquals(0, maxIntrinsicWidth(Constraints.Infinity))
+                // Max height.
+                assertEquals(10, maxIntrinsicHeight(0))
+                assertEquals(10, maxIntrinsicHeight(35))
+                assertEquals(10, maxIntrinsicHeight(70))
+                assertEquals(10, maxIntrinsicHeight(Constraints.Infinity))
+            }
+        }
+
+    @Test
+    fun testWidthHeightModifiers_hasCorrectIntrinsicMeasurements() =
+        with(density) {
+            testIntrinsics(
+                @Composable {
+                    Container(
+                        Modifier.sizeIn(
+                            minWidth = 10.toDp(),
+                            maxWidth = 20.toDp(),
+                            minHeight = 30.toDp(),
+                            maxHeight = 40.toDp()
+                        )
+                    ) {
+                        Container(Modifier.aspectRatio(1f)) {}
+                    }
+                }
+            ) { minIntrinsicWidth, minIntrinsicHeight, maxIntrinsicWidth, maxIntrinsicHeight ->
+                // Min width.
+                assertEquals(10, minIntrinsicWidth(0))
+                assertEquals(15, minIntrinsicWidth(15))
+                assertEquals(20, minIntrinsicWidth(50))
+                assertEquals(10, minIntrinsicWidth(Constraints.Infinity))
+                // Min height.
+                assertEquals(30, minIntrinsicHeight(0))
+                assertEquals(35, minIntrinsicHeight(35))
+                assertEquals(40, minIntrinsicHeight(50))
+                assertEquals(30, minIntrinsicHeight(Constraints.Infinity))
+                // Max width.
+                assertEquals(10, maxIntrinsicWidth(0))
+                assertEquals(15, maxIntrinsicWidth(15))
+                assertEquals(20, maxIntrinsicWidth(50))
+                assertEquals(10, maxIntrinsicWidth(Constraints.Infinity))
+                // Max height.
+                assertEquals(30, maxIntrinsicHeight(0))
+                assertEquals(35, maxIntrinsicHeight(35))
+                assertEquals(40, maxIntrinsicHeight(50))
+                assertEquals(30, maxIntrinsicHeight(Constraints.Infinity))
+            }
+        }
+
+    @Test
+    fun testMinSizeModifier_hasCorrectIntrinsicMeasurements() =
+        with(density) {
+            testIntrinsics(
+                @Composable {
+                    Container(Modifier.sizeIn(minWidth = 20.toDp(), minHeight = 30.toDp())) {
+                        Container(Modifier.aspectRatio(1f)) {}
+                    }
+                }
+            ) { minIntrinsicWidth, minIntrinsicHeight, maxIntrinsicWidth, maxIntrinsicHeight ->
+                // Min width.
+                assertEquals(20, minIntrinsicWidth(0))
+                assertEquals(20, minIntrinsicWidth(10))
+                assertEquals(50, minIntrinsicWidth(50))
+                assertEquals(20, minIntrinsicWidth(Constraints.Infinity))
+                // Min height.
+                assertEquals(30, minIntrinsicHeight(0))
+                assertEquals(30, minIntrinsicHeight(10))
+                assertEquals(50, minIntrinsicHeight(50))
+                assertEquals(30, minIntrinsicHeight(Constraints.Infinity))
+                // Max width.
+                assertEquals(20, maxIntrinsicWidth(0))
+                assertEquals(20, maxIntrinsicWidth(10))
+                assertEquals(50, maxIntrinsicWidth(50))
+                assertEquals(20, maxIntrinsicWidth(Constraints.Infinity))
+                // Max height.
+                assertEquals(30, maxIntrinsicHeight(0))
+                assertEquals(30, maxIntrinsicHeight(10))
+                assertEquals(50, maxIntrinsicHeight(50))
+                assertEquals(30, maxIntrinsicHeight(Constraints.Infinity))
+            }
+        }
+
+    @Test
+    fun testMaxSizeModifier_hasCorrectIntrinsicMeasurements() =
+        with(density) {
+            testIntrinsics(
+                @Composable {
+                    Container(Modifier.sizeIn(maxWidth = 40.toDp(), maxHeight = 50.toDp())) {
+                        Container(Modifier.aspectRatio(1f)) {}
+                    }
+                }
+            ) { minIntrinsicWidth, minIntrinsicHeight, maxIntrinsicWidth, maxIntrinsicHeight ->
+                // Min width.
+                assertEquals(0, minIntrinsicWidth(0))
+                assertEquals(15, minIntrinsicWidth(15))
+                assertEquals(40, minIntrinsicWidth(50))
+                assertEquals(0, minIntrinsicWidth(Constraints.Infinity))
+                // Min height.
+                assertEquals(0, minIntrinsicHeight(0))
+                assertEquals(15, minIntrinsicHeight(15))
+                assertEquals(50, minIntrinsicHeight(75))
+                assertEquals(0, minIntrinsicHeight(Constraints.Infinity))
+                // Max width.
+                assertEquals(0, maxIntrinsicWidth(0))
+                assertEquals(15, maxIntrinsicWidth(15))
+                assertEquals(40, maxIntrinsicWidth(50))
+                assertEquals(0, maxIntrinsicWidth(Constraints.Infinity))
+                // Max height.
+                assertEquals(0, maxIntrinsicHeight(0))
+                assertEquals(15, maxIntrinsicHeight(15))
+                assertEquals(50, maxIntrinsicHeight(75))
+                assertEquals(0, maxIntrinsicHeight(Constraints.Infinity))
+            }
+        }
+
+    @Test
+    fun testPreferredSizeModifier_hasCorrectIntrinsicMeasurements() =
+        with(density) {
+            testIntrinsics(
+                @Composable {
+                    Container(Modifier.size(40.toDp(), 50.toDp())) {
+                        Container(Modifier.aspectRatio(1f)) {}
+                    }
+                }
+            ) { minIntrinsicWidth, minIntrinsicHeight, maxIntrinsicWidth, maxIntrinsicHeight ->
+                // Min width.
+                assertEquals(40, minIntrinsicWidth(0))
+                assertEquals(40, minIntrinsicWidth(35))
+                assertEquals(40, minIntrinsicWidth(75))
+                assertEquals(40, minIntrinsicWidth(Constraints.Infinity))
+                // Min height.
+                assertEquals(50, minIntrinsicHeight(0))
+                assertEquals(50, minIntrinsicHeight(35))
+                assertEquals(50, minIntrinsicHeight(70))
+                assertEquals(50, minIntrinsicHeight(Constraints.Infinity))
+                // Max width.
+                assertEquals(40, maxIntrinsicWidth(0))
+                assertEquals(40, maxIntrinsicWidth(35))
+                assertEquals(40, maxIntrinsicWidth(75))
+                assertEquals(40, maxIntrinsicWidth(Constraints.Infinity))
+                // Max height.
+                assertEquals(50, maxIntrinsicHeight(0))
+                assertEquals(50, maxIntrinsicHeight(35))
+                assertEquals(50, maxIntrinsicHeight(70))
+                assertEquals(50, maxIntrinsicHeight(Constraints.Infinity))
+            }
+        }
+
+    @Test
+    fun testFillModifier_correctSize() =
+        with(density) {
+            val parentWidth = 100
+            val parentHeight = 80
+            val parentModifier = Modifier.requiredSize(parentWidth.toDp(), parentHeight.toDp())
+            val childWidth = 40
+            val childHeight = 30
+            val childModifier = Modifier.size(childWidth.toDp(), childHeight.toDp())
+
+            assertEquals(
+                IntSize(childWidth, childHeight),
+                calculateSizeFor(parentModifier, childModifier)
+            )
+            assertEquals(
+                IntSize(parentWidth, childHeight),
+                calculateSizeFor(parentModifier, Modifier.fillMaxWidth().then(childModifier))
+            )
+            assertEquals(
+                IntSize(childWidth, parentHeight),
+                calculateSizeFor(parentModifier, Modifier.fillMaxHeight().then(childModifier))
+            )
+            assertEquals(
+                IntSize(parentWidth, parentHeight),
+                calculateSizeFor(parentModifier, Modifier.fillMaxSize().then(childModifier))
+            )
+        }
+
+    @Test
+    fun testFillModifier_correctDpSize() =
+        with(density) {
+            val parentWidth = 100
+            val parentHeight = 80
+            val parentModifier =
+                Modifier.requiredSize(DpSize(parentWidth.toDp(), parentHeight.toDp()))
+            val childWidth = 40
+            val childHeight = 30
+            val childModifier = Modifier.size(DpSize(childWidth.toDp(), childHeight.toDp()))
+
+            assertEquals(
+                IntSize(childWidth, childHeight),
+                calculateSizeFor(parentModifier, childModifier)
+            )
+            assertEquals(
+                IntSize(parentWidth, childHeight),
+                calculateSizeFor(parentModifier, Modifier.fillMaxWidth().then(childModifier))
+            )
+            assertEquals(
+                IntSize(childWidth, parentHeight),
+                calculateSizeFor(parentModifier, Modifier.fillMaxHeight().then(childModifier))
+            )
+            assertEquals(
+                IntSize(parentWidth, parentHeight),
+                calculateSizeFor(parentModifier, Modifier.fillMaxSize().then(childModifier))
+            )
+        }
+
+    @Test
+    fun testFractionalFillModifier_correctSize_whenSmallerChild() =
+        with(density) {
+            val parentWidth = 100
+            val parentHeight = 80
+            val parentModifier = Modifier.requiredSize(parentWidth.toDp(), parentHeight.toDp())
+            val childWidth = 40
+            val childHeight = 30
+            val childModifier = Modifier.size(childWidth.toDp(), childHeight.toDp())
+
+            assertEquals(
+                IntSize(childWidth, childHeight),
+                calculateSizeFor(parentModifier, childModifier)
+            )
+            assertEquals(
+                IntSize(parentWidth / 2, childHeight),
+                calculateSizeFor(parentModifier, Modifier.fillMaxWidth(0.5f).then(childModifier))
+            )
+            assertEquals(
+                IntSize(childWidth, parentHeight / 2),
+                calculateSizeFor(parentModifier, Modifier.fillMaxHeight(0.5f).then(childModifier))
+            )
+            assertEquals(
+                IntSize(parentWidth / 2, parentHeight / 2),
+                calculateSizeFor(parentModifier, Modifier.fillMaxSize(0.5f).then(childModifier))
+            )
+        }
+
+    @Test
+    fun testFractionalFillModifier_correctSize_whenLargerChild() =
+        with(density) {
+            val parentWidth = 100
+            val parentHeight = 80
+            val parentModifier = Modifier.requiredSize(parentWidth.toDp(), parentHeight.toDp())
+            val childWidth = 70
+            val childHeight = 50
+            val childModifier = Modifier.size(childWidth.toDp(), childHeight.toDp())
+
+            assertEquals(
+                IntSize(childWidth, childHeight),
+                calculateSizeFor(parentModifier, childModifier)
+            )
+            assertEquals(
+                IntSize(parentWidth / 2, childHeight),
+                calculateSizeFor(parentModifier, Modifier.fillMaxWidth(0.5f).then(childModifier))
+            )
+            assertEquals(
+                IntSize(childWidth, parentHeight / 2),
+                calculateSizeFor(parentModifier, Modifier.fillMaxHeight(0.5f).then(childModifier))
+            )
+            assertEquals(
+                IntSize(parentWidth / 2, parentHeight / 2),
+                calculateSizeFor(parentModifier, Modifier.fillMaxSize(0.5f).then(childModifier))
+            )
+        }
+
+    @Test
+    fun testFractionalFillModifier_coerced() =
+        with(density) {
+            val childMinWidth = 40
+            val childMinHeight = 30
+            val childMaxWidth = 60
+            val childMaxHeight = 50
+            val childModifier =
                 Modifier.requiredSizeIn(
-                    minWidth = 10.toDp(),
-                    minHeight = 20.toDp(),
-                    maxWidth = 100.toDp(),
-                    maxHeight = 110.toDp()
-                ).defaultMinSize()
-            ) { _, constraints ->
-                assertEquals(10, constraints.minWidth)
-                assertEquals(20, constraints.minHeight)
-                assertEquals(100, constraints.maxWidth)
-                assertEquals(110, constraints.maxHeight)
-                latch.countDown()
-                layout(0, 0) {}
-            }
+                    childMinWidth.toDp(),
+                    childMinHeight.toDp(),
+                    childMaxWidth.toDp(),
+                    childMaxHeight.toDp()
+                )
+
+            assertEquals(
+                IntSize(childMinWidth, childMinHeight),
+                calculateSizeFor(Modifier, childModifier.then(Modifier.fillMaxSize(-0.1f)))
+            )
+            assertEquals(
+                IntSize(childMinWidth, childMinHeight),
+                calculateSizeFor(Modifier, childModifier.then(Modifier.fillMaxSize(0.1f)))
+            )
+            assertEquals(
+                IntSize(childMaxWidth, childMaxHeight),
+                calculateSizeFor(Modifier, childModifier.then(Modifier.fillMaxSize(1.2f)))
+            )
         }
-        assertTrue(latch.await(1, TimeUnit.SECONDS))
-    }
 
     @Test
-    fun testDefaultMinSize_withCoercingMaxConstraints() = with(density) {
-        val latch = CountDownLatch(1)
-        show {
-            Layout(
-                {},
-                Modifier.wrapContentSize()
-                    .requiredSizeIn(maxWidth = 30.toDp(), maxHeight = 40.toDp())
-                    .defaultMinSize(minWidth = 70.toDp(), minHeight = 80.toDp())
-            ) { _, constraints ->
-                assertEquals(30, constraints.minWidth)
-                assertEquals(40, constraints.minHeight)
-                assertEquals(30, constraints.maxWidth)
-                assertEquals(40, constraints.maxHeight)
-                latch.countDown()
-                layout(0, 0) {}
-            }
+    fun testFillModifier_noChangeIntrinsicMeasurements() =
+        with(density) {
+            verifyIntrinsicMeasurements(Modifier.fillMaxWidth())
+            verifyIntrinsicMeasurements(Modifier.fillMaxHeight())
+            verifyIntrinsicMeasurements(Modifier.fillMaxSize())
         }
-        assertTrue(latch.await(1, TimeUnit.SECONDS))
-    }
 
     @Test
-    fun testMinWidthModifier_hasCorrectIntrinsicMeasurements() = with(density) {
-        testIntrinsics(
-            @Composable {
-                Container(Modifier.widthIn(min = 10.toDp())) {
-                    Container(Modifier.aspectRatio(1f)) { }
+    fun testDefaultMinSizeModifier_hasCorrectIntrinsicMeasurements() =
+        with(density) {
+            testIntrinsics(
+                @Composable {
+                    Container(Modifier.defaultMinSize(40.toDp(), 50.toDp())) {
+                        Container(Modifier.aspectRatio(1f)) {}
+                    }
                 }
+            ) { minIntrinsicWidth, minIntrinsicHeight, _, _ ->
+                // Min width.
+                assertEquals(40, minIntrinsicWidth(0))
+                assertEquals(40, minIntrinsicWidth(35))
+                assertEquals(55, minIntrinsicWidth(55))
+                assertEquals(40, minIntrinsicWidth(Constraints.Infinity))
+                // Min height.
+                assertEquals(50, minIntrinsicHeight(0))
+                assertEquals(50, minIntrinsicHeight(35))
+                assertEquals(55, minIntrinsicHeight(55))
+                assertEquals(50, minIntrinsicHeight(Constraints.Infinity))
+                // Max width.
+                assertEquals(40, minIntrinsicWidth(0))
+                assertEquals(40, minIntrinsicWidth(35))
+                assertEquals(55, minIntrinsicWidth(55))
+                assertEquals(40, minIntrinsicWidth(Constraints.Infinity))
+                // Max height.
+                assertEquals(50, minIntrinsicHeight(0))
+                assertEquals(50, minIntrinsicHeight(35))
+                assertEquals(55, minIntrinsicHeight(55))
+                assertEquals(50, minIntrinsicHeight(Constraints.Infinity))
             }
-        ) { minIntrinsicWidth, minIntrinsicHeight, maxIntrinsicWidth, maxIntrinsicHeight ->
-            // Min width.
-            assertEquals(10, minIntrinsicWidth(0))
-            assertEquals(10, minIntrinsicWidth(5))
-            assertEquals(50, minIntrinsicWidth(50))
-            assertEquals(10, minIntrinsicWidth(Constraints.Infinity))
-            // Min height.
-            assertEquals(0, minIntrinsicHeight(0))
-            assertEquals(35, minIntrinsicHeight(35))
-            assertEquals(50, minIntrinsicHeight(50))
-            assertEquals(0, minIntrinsicHeight(Constraints.Infinity))
-            // Max width.
-            assertEquals(10, maxIntrinsicWidth(0))
-            assertEquals(10, maxIntrinsicWidth(5))
-            assertEquals(50, maxIntrinsicWidth(50))
-            assertEquals(10, maxIntrinsicWidth(Constraints.Infinity))
-            // Max height.
-            assertEquals(0, maxIntrinsicHeight(0))
-            assertEquals(35, maxIntrinsicHeight(35))
-            assertEquals(50, maxIntrinsicHeight(50))
-            assertEquals(0, maxIntrinsicHeight(Constraints.Infinity))
         }
-    }
-
-    @Test
-    fun testMaxWidthModifier_hasCorrectIntrinsicMeasurements() = with(density) {
-        testIntrinsics(
-            @Composable {
-                Container(Modifier.widthIn(max = 20.toDp())) {
-                    Container(Modifier.aspectRatio(1f)) { }
-                }
-            }
-        ) { minIntrinsicWidth, minIntrinsicHeight, maxIntrinsicWidth, maxIntrinsicHeight ->
-            // Min width.
-            assertEquals(0, minIntrinsicWidth(0))
-            assertEquals(15, minIntrinsicWidth(15))
-            assertEquals(20, minIntrinsicWidth(50))
-            assertEquals(0, minIntrinsicWidth(Constraints.Infinity))
-            // Min height.
-            assertEquals(0, minIntrinsicHeight(0))
-            assertEquals(15, minIntrinsicHeight(15))
-            assertEquals(50, minIntrinsicHeight(50))
-            assertEquals(0, minIntrinsicHeight(Constraints.Infinity))
-            // Max width.
-            assertEquals(0, maxIntrinsicWidth(0))
-            assertEquals(15, maxIntrinsicWidth(15))
-            assertEquals(20, maxIntrinsicWidth(50))
-            assertEquals(0, maxIntrinsicWidth(Constraints.Infinity))
-            // Max height.
-            assertEquals(0, maxIntrinsicHeight(0))
-            assertEquals(15, maxIntrinsicHeight(15))
-            assertEquals(50, maxIntrinsicHeight(50))
-            assertEquals(0, maxIntrinsicHeight(Constraints.Infinity))
-        }
-    }
-
-    @Test
-    fun testMinHeightModifier_hasCorrectIntrinsicMeasurements() = with(density) {
-        testIntrinsics(
-            @Composable {
-                Container(Modifier.heightIn(min = 30.toDp())) {
-                    Container(Modifier.aspectRatio(1f)) { }
-                }
-            }
-        ) { minIntrinsicWidth, minIntrinsicHeight, maxIntrinsicWidth, maxIntrinsicHeight ->
-            // Min width.
-            assertEquals(0, minIntrinsicWidth(0))
-            assertEquals(15, minIntrinsicWidth(15))
-            assertEquals(50, minIntrinsicWidth(50))
-            assertEquals(0, minIntrinsicWidth(Constraints.Infinity))
-            // Min height.
-            assertEquals(30, minIntrinsicHeight(0))
-            assertEquals(30, minIntrinsicHeight(15))
-            assertEquals(50, minIntrinsicHeight(50))
-            assertEquals(30, minIntrinsicHeight(Constraints.Infinity))
-            // Max width.
-            assertEquals(0, maxIntrinsicWidth(0))
-            assertEquals(15, maxIntrinsicWidth(15))
-            assertEquals(50, maxIntrinsicWidth(50))
-            assertEquals(0, maxIntrinsicWidth(Constraints.Infinity))
-            // Max height.
-            assertEquals(30, maxIntrinsicHeight(0))
-            assertEquals(30, maxIntrinsicHeight(15))
-            assertEquals(50, maxIntrinsicHeight(50))
-            assertEquals(30, maxIntrinsicHeight(Constraints.Infinity))
-        }
-    }
-
-    @Test
-    fun testMaxHeightModifier_hasCorrectIntrinsicMeasurements() = with(density) {
-        testIntrinsics(
-            @Composable {
-                Container(Modifier.heightIn(max = 40.toDp())) {
-                    Container(Modifier.aspectRatio(1f)) { }
-                }
-            }
-        ) { minIntrinsicWidth, minIntrinsicHeight, maxIntrinsicWidth, maxIntrinsicHeight ->
-            // Min width.
-            assertEquals(0, minIntrinsicWidth(0))
-            assertEquals(15, minIntrinsicWidth(15))
-            assertEquals(50, minIntrinsicWidth(50))
-            assertEquals(0, minIntrinsicWidth(Constraints.Infinity))
-            // Min height.
-            assertEquals(0, minIntrinsicHeight(0))
-            assertEquals(15, minIntrinsicHeight(15))
-            assertEquals(40, minIntrinsicHeight(50))
-            assertEquals(0, minIntrinsicHeight(Constraints.Infinity))
-            // Max width.
-            assertEquals(0, maxIntrinsicWidth(0))
-            assertEquals(15, maxIntrinsicWidth(15))
-            assertEquals(50, maxIntrinsicWidth(50))
-            assertEquals(0, maxIntrinsicWidth(Constraints.Infinity))
-            // Max height.
-            assertEquals(0, maxIntrinsicHeight(0))
-            assertEquals(15, maxIntrinsicHeight(15))
-            assertEquals(40, maxIntrinsicHeight(50))
-            assertEquals(0, maxIntrinsicHeight(Constraints.Infinity))
-        }
-    }
-
-    @Test
-    fun testWidthModifier_hasCorrectIntrinsicMeasurements() = with(density) {
-        testIntrinsics(
-            @Composable {
-                Container(Modifier.width(10.toDp())) {
-                    Container(Modifier.aspectRatio(1f)) { }
-                }
-            }
-        ) { minIntrinsicWidth, minIntrinsicHeight, maxIntrinsicWidth, maxIntrinsicHeight ->
-            // Min width.
-            assertEquals(10, minIntrinsicWidth(0))
-            assertEquals(10, minIntrinsicWidth(10))
-            assertEquals(10, minIntrinsicWidth(75))
-            assertEquals(10, minIntrinsicWidth(Constraints.Infinity))
-            // Min height.
-            assertEquals(0, minIntrinsicHeight(0))
-            assertEquals(35, minIntrinsicHeight(35))
-            assertEquals(70, minIntrinsicHeight(70))
-            assertEquals(0, minIntrinsicHeight(Constraints.Infinity))
-            // Max width.
-            assertEquals(10, maxIntrinsicWidth(0))
-            assertEquals(10, maxIntrinsicWidth(15))
-            assertEquals(10, maxIntrinsicWidth(75))
-            assertEquals(10, maxIntrinsicWidth(Constraints.Infinity))
-            // Max height.
-            assertEquals(0, maxIntrinsicHeight(0))
-            assertEquals(35, maxIntrinsicHeight(35))
-            assertEquals(70, maxIntrinsicHeight(70))
-            assertEquals(0, maxIntrinsicHeight(Constraints.Infinity))
-        }
-    }
-
-    @Test
-    fun testHeightModifier_hasCorrectIntrinsicMeasurements() = with(density) {
-        testIntrinsics(
-            @Composable {
-                Container(Modifier.height(10.toDp())) {
-                    Container(Modifier.aspectRatio(1f)) { }
-                }
-            }
-        ) { minIntrinsicWidth, minIntrinsicHeight, maxIntrinsicWidth, maxIntrinsicHeight ->
-            // Min width.
-            assertEquals(0, minIntrinsicWidth(0))
-            assertEquals(15, minIntrinsicWidth(15))
-            assertEquals(75, minIntrinsicWidth(75))
-            assertEquals(0, minIntrinsicWidth(Constraints.Infinity))
-            // Min height.
-            assertEquals(10, minIntrinsicHeight(0))
-            assertEquals(10, minIntrinsicHeight(35))
-            assertEquals(10, minIntrinsicHeight(70))
-            assertEquals(10, minIntrinsicHeight(Constraints.Infinity))
-            // Max width.
-            assertEquals(0, maxIntrinsicWidth(0))
-            assertEquals(15, maxIntrinsicWidth(15))
-            assertEquals(75, maxIntrinsicWidth(75))
-            assertEquals(0, maxIntrinsicWidth(Constraints.Infinity))
-            // Max height.
-            assertEquals(10, maxIntrinsicHeight(0))
-            assertEquals(10, maxIntrinsicHeight(35))
-            assertEquals(10, maxIntrinsicHeight(70))
-            assertEquals(10, maxIntrinsicHeight(Constraints.Infinity))
-        }
-    }
-
-    @Test
-    fun testWidthHeightModifiers_hasCorrectIntrinsicMeasurements() = with(density) {
-        testIntrinsics(
-            @Composable {
-                Container(
-                    Modifier.sizeIn(
-                        minWidth = 10.toDp(),
-                        maxWidth = 20.toDp(),
-                        minHeight = 30.toDp(),
-                        maxHeight = 40.toDp()
-                    )
-                ) {
-                    Container(Modifier.aspectRatio(1f)) { }
-                }
-            }
-        ) { minIntrinsicWidth, minIntrinsicHeight, maxIntrinsicWidth, maxIntrinsicHeight ->
-            // Min width.
-            assertEquals(10, minIntrinsicWidth(0))
-            assertEquals(15, minIntrinsicWidth(15))
-            assertEquals(20, minIntrinsicWidth(50))
-            assertEquals(10, minIntrinsicWidth(Constraints.Infinity))
-            // Min height.
-            assertEquals(30, minIntrinsicHeight(0))
-            assertEquals(35, minIntrinsicHeight(35))
-            assertEquals(40, minIntrinsicHeight(50))
-            assertEquals(30, minIntrinsicHeight(Constraints.Infinity))
-            // Max width.
-            assertEquals(10, maxIntrinsicWidth(0))
-            assertEquals(15, maxIntrinsicWidth(15))
-            assertEquals(20, maxIntrinsicWidth(50))
-            assertEquals(10, maxIntrinsicWidth(Constraints.Infinity))
-            // Max height.
-            assertEquals(30, maxIntrinsicHeight(0))
-            assertEquals(35, maxIntrinsicHeight(35))
-            assertEquals(40, maxIntrinsicHeight(50))
-            assertEquals(30, maxIntrinsicHeight(Constraints.Infinity))
-        }
-    }
-
-    @Test
-    fun testMinSizeModifier_hasCorrectIntrinsicMeasurements() = with(density) {
-        testIntrinsics(
-            @Composable {
-                Container(Modifier.sizeIn(minWidth = 20.toDp(), minHeight = 30.toDp())) {
-                    Container(Modifier.aspectRatio(1f)) { }
-                }
-            }
-        ) { minIntrinsicWidth, minIntrinsicHeight, maxIntrinsicWidth, maxIntrinsicHeight ->
-            // Min width.
-            assertEquals(20, minIntrinsicWidth(0))
-            assertEquals(20, minIntrinsicWidth(10))
-            assertEquals(50, minIntrinsicWidth(50))
-            assertEquals(20, minIntrinsicWidth(Constraints.Infinity))
-            // Min height.
-            assertEquals(30, minIntrinsicHeight(0))
-            assertEquals(30, minIntrinsicHeight(10))
-            assertEquals(50, minIntrinsicHeight(50))
-            assertEquals(30, minIntrinsicHeight(Constraints.Infinity))
-            // Max width.
-            assertEquals(20, maxIntrinsicWidth(0))
-            assertEquals(20, maxIntrinsicWidth(10))
-            assertEquals(50, maxIntrinsicWidth(50))
-            assertEquals(20, maxIntrinsicWidth(Constraints.Infinity))
-            // Max height.
-            assertEquals(30, maxIntrinsicHeight(0))
-            assertEquals(30, maxIntrinsicHeight(10))
-            assertEquals(50, maxIntrinsicHeight(50))
-            assertEquals(30, maxIntrinsicHeight(Constraints.Infinity))
-        }
-    }
-
-    @Test
-    fun testMaxSizeModifier_hasCorrectIntrinsicMeasurements() = with(density) {
-        testIntrinsics(
-            @Composable {
-                Container(Modifier.sizeIn(maxWidth = 40.toDp(), maxHeight = 50.toDp())) {
-                    Container(Modifier.aspectRatio(1f)) { }
-                }
-            }
-        ) { minIntrinsicWidth, minIntrinsicHeight, maxIntrinsicWidth, maxIntrinsicHeight ->
-            // Min width.
-            assertEquals(0, minIntrinsicWidth(0))
-            assertEquals(15, minIntrinsicWidth(15))
-            assertEquals(40, minIntrinsicWidth(50))
-            assertEquals(0, minIntrinsicWidth(Constraints.Infinity))
-            // Min height.
-            assertEquals(0, minIntrinsicHeight(0))
-            assertEquals(15, minIntrinsicHeight(15))
-            assertEquals(50, minIntrinsicHeight(75))
-            assertEquals(0, minIntrinsicHeight(Constraints.Infinity))
-            // Max width.
-            assertEquals(0, maxIntrinsicWidth(0))
-            assertEquals(15, maxIntrinsicWidth(15))
-            assertEquals(40, maxIntrinsicWidth(50))
-            assertEquals(0, maxIntrinsicWidth(Constraints.Infinity))
-            // Max height.
-            assertEquals(0, maxIntrinsicHeight(0))
-            assertEquals(15, maxIntrinsicHeight(15))
-            assertEquals(50, maxIntrinsicHeight(75))
-            assertEquals(0, maxIntrinsicHeight(Constraints.Infinity))
-        }
-    }
-
-    @Test
-    fun testPreferredSizeModifier_hasCorrectIntrinsicMeasurements() = with(density) {
-        testIntrinsics(
-            @Composable {
-                Container(Modifier.size(40.toDp(), 50.toDp())) {
-                    Container(Modifier.aspectRatio(1f)) { }
-                }
-            }
-        ) { minIntrinsicWidth, minIntrinsicHeight, maxIntrinsicWidth, maxIntrinsicHeight ->
-            // Min width.
-            assertEquals(40, minIntrinsicWidth(0))
-            assertEquals(40, minIntrinsicWidth(35))
-            assertEquals(40, minIntrinsicWidth(75))
-            assertEquals(40, minIntrinsicWidth(Constraints.Infinity))
-            // Min height.
-            assertEquals(50, minIntrinsicHeight(0))
-            assertEquals(50, minIntrinsicHeight(35))
-            assertEquals(50, minIntrinsicHeight(70))
-            assertEquals(50, minIntrinsicHeight(Constraints.Infinity))
-            // Max width.
-            assertEquals(40, maxIntrinsicWidth(0))
-            assertEquals(40, maxIntrinsicWidth(35))
-            assertEquals(40, maxIntrinsicWidth(75))
-            assertEquals(40, maxIntrinsicWidth(Constraints.Infinity))
-            // Max height.
-            assertEquals(50, maxIntrinsicHeight(0))
-            assertEquals(50, maxIntrinsicHeight(35))
-            assertEquals(50, maxIntrinsicHeight(70))
-            assertEquals(50, maxIntrinsicHeight(Constraints.Infinity))
-        }
-    }
-
-    @Test
-    fun testFillModifier_correctSize() = with(density) {
-        val parentWidth = 100
-        val parentHeight = 80
-        val parentModifier = Modifier.requiredSize(parentWidth.toDp(), parentHeight.toDp())
-        val childWidth = 40
-        val childHeight = 30
-        val childModifier = Modifier.size(childWidth.toDp(), childHeight.toDp())
-
-        assertEquals(
-            IntSize(childWidth, childHeight),
-            calculateSizeFor(parentModifier, childModifier)
-        )
-        assertEquals(
-            IntSize(parentWidth, childHeight),
-            calculateSizeFor(parentModifier, Modifier.fillMaxWidth().then(childModifier))
-        )
-        assertEquals(
-            IntSize(childWidth, parentHeight),
-            calculateSizeFor(parentModifier, Modifier.fillMaxHeight().then(childModifier))
-        )
-        assertEquals(
-            IntSize(parentWidth, parentHeight),
-            calculateSizeFor(parentModifier, Modifier.fillMaxSize().then(childModifier))
-        )
-    }
-
-    @Test
-    fun testFillModifier_correctDpSize() = with(density) {
-        val parentWidth = 100
-        val parentHeight = 80
-        val parentModifier = Modifier.requiredSize(DpSize(parentWidth.toDp(), parentHeight.toDp()))
-        val childWidth = 40
-        val childHeight = 30
-        val childModifier = Modifier.size(DpSize(childWidth.toDp(), childHeight.toDp()))
-
-        assertEquals(
-            IntSize(childWidth, childHeight),
-            calculateSizeFor(parentModifier, childModifier)
-        )
-        assertEquals(
-            IntSize(parentWidth, childHeight),
-            calculateSizeFor(parentModifier, Modifier.fillMaxWidth().then(childModifier))
-        )
-        assertEquals(
-            IntSize(childWidth, parentHeight),
-            calculateSizeFor(parentModifier, Modifier.fillMaxHeight().then(childModifier))
-        )
-        assertEquals(
-            IntSize(parentWidth, parentHeight),
-            calculateSizeFor(parentModifier, Modifier.fillMaxSize().then(childModifier))
-        )
-    }
-
-    @Test
-    fun testFractionalFillModifier_correctSize_whenSmallerChild() = with(density) {
-        val parentWidth = 100
-        val parentHeight = 80
-        val parentModifier = Modifier.requiredSize(parentWidth.toDp(), parentHeight.toDp())
-        val childWidth = 40
-        val childHeight = 30
-        val childModifier = Modifier.size(childWidth.toDp(), childHeight.toDp())
-
-        assertEquals(
-            IntSize(childWidth, childHeight),
-            calculateSizeFor(parentModifier, childModifier)
-        )
-        assertEquals(
-            IntSize(parentWidth / 2, childHeight),
-            calculateSizeFor(parentModifier, Modifier.fillMaxWidth(0.5f).then(childModifier))
-        )
-        assertEquals(
-            IntSize(childWidth, parentHeight / 2),
-            calculateSizeFor(parentModifier, Modifier.fillMaxHeight(0.5f).then(childModifier))
-        )
-        assertEquals(
-            IntSize(parentWidth / 2, parentHeight / 2),
-            calculateSizeFor(parentModifier, Modifier.fillMaxSize(0.5f).then(childModifier))
-        )
-    }
-
-    @Test
-    fun testFractionalFillModifier_correctSize_whenLargerChild() = with(density) {
-        val parentWidth = 100
-        val parentHeight = 80
-        val parentModifier = Modifier.requiredSize(parentWidth.toDp(), parentHeight.toDp())
-        val childWidth = 70
-        val childHeight = 50
-        val childModifier = Modifier.size(childWidth.toDp(), childHeight.toDp())
-
-        assertEquals(
-            IntSize(childWidth, childHeight),
-            calculateSizeFor(parentModifier, childModifier)
-        )
-        assertEquals(
-            IntSize(parentWidth / 2, childHeight),
-            calculateSizeFor(parentModifier, Modifier.fillMaxWidth(0.5f).then(childModifier))
-        )
-        assertEquals(
-            IntSize(childWidth, parentHeight / 2),
-            calculateSizeFor(parentModifier, Modifier.fillMaxHeight(0.5f).then(childModifier))
-        )
-        assertEquals(
-            IntSize(parentWidth / 2, parentHeight / 2),
-            calculateSizeFor(parentModifier, Modifier.fillMaxSize(0.5f).then(childModifier))
-        )
-    }
-
-    @Test
-    fun testFractionalFillModifier_coerced() = with(density) {
-        val childMinWidth = 40
-        val childMinHeight = 30
-        val childMaxWidth = 60
-        val childMaxHeight = 50
-        val childModifier = Modifier.requiredSizeIn(
-            childMinWidth.toDp(),
-            childMinHeight.toDp(),
-            childMaxWidth.toDp(),
-            childMaxHeight.toDp()
-        )
-
-        assertEquals(
-            IntSize(childMinWidth, childMinHeight),
-            calculateSizeFor(Modifier, childModifier.then(Modifier.fillMaxSize(-0.1f)))
-        )
-        assertEquals(
-            IntSize(childMinWidth, childMinHeight),
-            calculateSizeFor(Modifier, childModifier.then(Modifier.fillMaxSize(0.1f)))
-        )
-        assertEquals(
-            IntSize(childMaxWidth, childMaxHeight),
-            calculateSizeFor(Modifier, childModifier.then(Modifier.fillMaxSize(1.2f)))
-        )
-    }
-
-    @Test
-    fun testFillModifier_noChangeIntrinsicMeasurements() = with(density) {
-        verifyIntrinsicMeasurements(Modifier.fillMaxWidth())
-        verifyIntrinsicMeasurements(Modifier.fillMaxHeight())
-        verifyIntrinsicMeasurements(Modifier.fillMaxSize())
-    }
-
-    @Test
-    fun testDefaultMinSizeModifier_hasCorrectIntrinsicMeasurements() = with(density) {
-        testIntrinsics(
-            @Composable {
-                Container(Modifier.defaultMinSize(40.toDp(), 50.toDp())) {
-                    Container(Modifier.aspectRatio(1f)) { }
-                }
-            }
-        ) { minIntrinsicWidth, minIntrinsicHeight, _, _ ->
-            // Min width.
-            assertEquals(40, minIntrinsicWidth(0))
-            assertEquals(40, minIntrinsicWidth(35))
-            assertEquals(55, minIntrinsicWidth(55))
-            assertEquals(40, minIntrinsicWidth(Constraints.Infinity))
-            // Min height.
-            assertEquals(50, minIntrinsicHeight(0))
-            assertEquals(50, minIntrinsicHeight(35))
-            assertEquals(55, minIntrinsicHeight(55))
-            assertEquals(50, minIntrinsicHeight(Constraints.Infinity))
-            // Max width.
-            assertEquals(40, minIntrinsicWidth(0))
-            assertEquals(40, minIntrinsicWidth(35))
-            assertEquals(55, minIntrinsicWidth(55))
-            assertEquals(40, minIntrinsicWidth(Constraints.Infinity))
-            // Max height.
-            assertEquals(50, minIntrinsicHeight(0))
-            assertEquals(50, minIntrinsicHeight(35))
-            assertEquals(55, minIntrinsicHeight(55))
-            assertEquals(50, minIntrinsicHeight(Constraints.Infinity))
-        }
-    }
 
     @Test
     fun testInspectableParameter() {
@@ -1218,121 +1210,151 @@
         checkModifier(Modifier.requiredHeight(300.0.dp), "requiredHeight", 300.0.dp, listOf())
         checkModifier(Modifier.requiredSize(400.0.dp), "requiredSize", 400.0.dp, listOf())
         checkModifier(
-            Modifier.requiredSize(100.0.dp, 200.0.dp), "requiredSize", null,
-            listOf(
-                ValueElement("width", 100.0.dp),
-                ValueElement("height", 200.0.dp)
-            )
+            Modifier.requiredSize(100.0.dp, 200.0.dp),
+            "requiredSize",
+            null,
+            listOf(ValueElement("width", 100.0.dp), ValueElement("height", 200.0.dp))
         )
         checkModifier(
-            Modifier.requiredWidthIn(100.0.dp, 200.0.dp), "requiredWidthIn", null,
+            Modifier.requiredWidthIn(100.0.dp, 200.0.dp),
+            "requiredWidthIn",
+            null,
             listOf(ValueElement("min", 100.0.dp), ValueElement("max", 200.0.dp))
         )
         checkModifier(
-            Modifier.requiredHeightIn(10.0.dp, 200.0.dp), "requiredHeightIn", null,
+            Modifier.requiredHeightIn(10.0.dp, 200.0.dp),
+            "requiredHeightIn",
+            null,
             listOf(ValueElement("min", 10.0.dp), ValueElement("max", 200.0.dp))
         )
         checkModifier(
-            Modifier.requiredSizeIn(10.dp, 20.dp, 30.dp, 40.dp), "requiredSizeIn", null,
+            Modifier.requiredSizeIn(10.dp, 20.dp, 30.dp, 40.dp),
+            "requiredSizeIn",
+            null,
             listOf(
-                ValueElement("minWidth", 10.dp), ValueElement("minHeight", 20.dp),
-                ValueElement("maxWidth", 30.dp), ValueElement("maxHeight", 40.dp)
+                ValueElement("minWidth", 10.dp),
+                ValueElement("minHeight", 20.dp),
+                ValueElement("maxWidth", 30.dp),
+                ValueElement("maxHeight", 40.dp)
             )
         )
         checkModifier(Modifier.width(200.0.dp), "width", 200.0.dp, listOf())
         checkModifier(Modifier.height(300.0.dp), "height", 300.0.dp, listOf())
         checkModifier(Modifier.size(400.0.dp), "size", 400.0.dp, listOf())
         checkModifier(
-            Modifier.size(100.0.dp, 200.0.dp), "size", null,
+            Modifier.size(100.0.dp, 200.0.dp),
+            "size",
+            null,
             listOf(ValueElement("width", 100.0.dp), ValueElement("height", 200.0.dp))
         )
         checkModifier(
-            Modifier.widthIn(100.0.dp, 200.0.dp), "widthIn", null,
+            Modifier.widthIn(100.0.dp, 200.0.dp),
+            "widthIn",
+            null,
             listOf(ValueElement("min", 100.0.dp), ValueElement("max", 200.0.dp))
         )
         checkModifier(
-            Modifier.heightIn(10.0.dp, 200.0.dp), "heightIn", null,
+            Modifier.heightIn(10.0.dp, 200.0.dp),
+            "heightIn",
+            null,
             listOf(ValueElement("min", 10.0.dp), ValueElement("max", 200.0.dp))
         )
         checkModifier(
-            Modifier.sizeIn(10.dp, 20.dp, 30.dp, 40.dp), "sizeIn", null,
+            Modifier.sizeIn(10.dp, 20.dp, 30.dp, 40.dp),
+            "sizeIn",
+            null,
             listOf(
-                ValueElement("minWidth", 10.dp), ValueElement("minHeight", 20.dp),
-                ValueElement("maxWidth", 30.dp), ValueElement("maxHeight", 40.dp)
+                ValueElement("minWidth", 10.dp),
+                ValueElement("minHeight", 20.dp),
+                ValueElement("maxWidth", 30.dp),
+                ValueElement("maxHeight", 40.dp)
             )
         )
 
         checkModifier(
-            Modifier.fillMaxWidth(), "fillMaxWidth", null,
+            Modifier.fillMaxWidth(),
+            "fillMaxWidth",
+            null,
             listOf(ValueElement("fraction", 1.0f))
         )
         checkModifier(
-            Modifier.fillMaxWidth(0.7f), "fillMaxWidth", null,
+            Modifier.fillMaxWidth(0.7f),
+            "fillMaxWidth",
+            null,
             listOf(ValueElement("fraction", 0.7f))
         )
         checkModifier(
-            Modifier.fillMaxHeight(), "fillMaxHeight", null,
+            Modifier.fillMaxHeight(),
+            "fillMaxHeight",
+            null,
             listOf(ValueElement("fraction", 1.0f))
         )
         checkModifier(
-            Modifier.fillMaxHeight(0.15f), "fillMaxHeight", null,
+            Modifier.fillMaxHeight(0.15f),
+            "fillMaxHeight",
+            null,
             listOf(ValueElement("fraction", 0.15f))
         )
         checkModifier(
-            Modifier.fillMaxSize(), "fillMaxSize", null,
+            Modifier.fillMaxSize(),
+            "fillMaxSize",
+            null,
             listOf(ValueElement("fraction", 1.0f))
         )
         checkModifier(
-            Modifier.fillMaxSize(0.25f), "fillMaxSize", null,
+            Modifier.fillMaxSize(0.25f),
+            "fillMaxSize",
+            null,
             listOf(ValueElement("fraction", 0.25f))
         )
 
         checkModifier(
-            Modifier.wrapContentWidth(), "wrapContentWidth", null,
+            Modifier.wrapContentWidth(),
+            "wrapContentWidth",
+            null,
             listOf(
                 ValueElement("align", Alignment.CenterHorizontally),
                 ValueElement("unbounded", false)
             )
         )
         checkModifier(
-            Modifier.wrapContentWidth(Alignment.End, true), "wrapContentWidth", null,
-            listOf(
-                ValueElement("align", Alignment.End),
-                ValueElement("unbounded", true)
-            )
+            Modifier.wrapContentWidth(Alignment.End, true),
+            "wrapContentWidth",
+            null,
+            listOf(ValueElement("align", Alignment.End), ValueElement("unbounded", true))
         )
         checkModifier(
-            Modifier.wrapContentHeight(), "wrapContentHeight", null,
+            Modifier.wrapContentHeight(),
+            "wrapContentHeight",
+            null,
             listOf(
                 ValueElement("align", Alignment.CenterVertically),
                 ValueElement("unbounded", false)
             )
         )
         checkModifier(
-            Modifier.wrapContentHeight(Alignment.Bottom, true), "wrapContentHeight", null,
-            listOf(
-                ValueElement("align", Alignment.Bottom),
-                ValueElement("unbounded", true)
-            )
+            Modifier.wrapContentHeight(Alignment.Bottom, true),
+            "wrapContentHeight",
+            null,
+            listOf(ValueElement("align", Alignment.Bottom), ValueElement("unbounded", true))
         )
         checkModifier(
-            Modifier.wrapContentSize(), "wrapContentSize", null,
-            listOf(
-                ValueElement("align", Alignment.Center),
-                ValueElement("unbounded", false)
-            )
+            Modifier.wrapContentSize(),
+            "wrapContentSize",
+            null,
+            listOf(ValueElement("align", Alignment.Center), ValueElement("unbounded", false))
         )
         checkModifier(
-            Modifier.wrapContentSize(Alignment.BottomCenter, true), "wrapContentSize", null,
-            listOf(
-                ValueElement("align", Alignment.BottomCenter),
-                ValueElement("unbounded", true)
-            )
+            Modifier.wrapContentSize(Alignment.BottomCenter, true),
+            "wrapContentSize",
+            null,
+            listOf(ValueElement("align", Alignment.BottomCenter), ValueElement("unbounded", true))
         )
 
         checkModifier(
             Modifier.defaultMinSize(10.0.dp, 20.0.dp),
-            "defaultMinSize", null,
+            "defaultMinSize",
+            null,
             listOf(ValueElement("minWidth", 10.dp), ValueElement("minHeight", 20.dp))
         )
     }
@@ -1355,9 +1377,7 @@
         val size = Ref<IntSize>()
         val position = Ref<Offset>()
         show {
-            Box(parentModifier) {
-                Box(modifier.saveLayoutInfo(size, position, positionedLatch))
-            }
+            Box(parentModifier) { Box(modifier.saveLayoutInfo(size, position, positionedLatch)) }
         }
         assertTrue(positionedLatch.await(1, TimeUnit.SECONDS))
         return size.value!!
@@ -1383,485 +1403,479 @@
                 }
             }) { measurables, _ ->
                 measurables[0].measure(incomingConstraints)
-                layout(0, 0) { }
+                layout(0, 0) {}
             }
         }
         assertTrue(latch.await(1, TimeUnit.SECONDS))
         assertEquals(expectedConstraints, actualConstraints)
     }
 
-    private fun verifyIntrinsicMeasurements(expandedModifier: Modifier) = with(density) {
-        // intrinsic measurements do not change with the ExpandedModifier
-        testIntrinsics(
-            @Composable {
-                Container(
-                    expandedModifier.then(Modifier.aspectRatio(2f)),
-                    width = 30.toDp(), height = 40.toDp()
-                ) { }
-            }
-        ) { minIntrinsicWidth, minIntrinsicHeight, maxIntrinsicWidth, maxIntrinsicHeight ->
-            // Width
-            assertEquals(40, minIntrinsicWidth(20))
-            assertEquals(30, minIntrinsicWidth(Constraints.Infinity))
-
-            assertEquals(40, maxIntrinsicWidth(20))
-            assertEquals(30, maxIntrinsicWidth(Constraints.Infinity))
-
-            // Height
-            assertEquals(20, minIntrinsicHeight(40))
-            assertEquals(40, minIntrinsicHeight(Constraints.Infinity))
-
-            assertEquals(20, maxIntrinsicHeight(40))
-            assertEquals(40, maxIntrinsicHeight(Constraints.Infinity))
-        }
-    }
-    @Test
-    fun test2DWrapContentSize() = with(density) {
-        val sizeDp = 50.dp
-        val size = sizeDp.roundToPx()
-
-        val positionedLatch = CountDownLatch(2)
-        val alignSize = Ref<IntSize>()
-        val alignPosition = Ref<Offset>()
-        val childSize = Ref<IntSize>()
-        val childPosition = Ref<Offset>()
-        show {
-            Container(Modifier.saveLayoutInfo(alignSize, alignPosition, positionedLatch)) {
-                Container(
-                    Modifier.fillMaxSize()
-                        .wrapContentSize(Alignment.BottomEnd)
-                        .size(sizeDp)
-                        .saveLayoutInfo(childSize, childPosition, positionedLatch)
-                ) {
-                }
-            }
-        }
-        assertTrue(positionedLatch.await(1, TimeUnit.SECONDS))
-
-        val root = findComposeView()
-        waitForDraw(root)
-
-        assertEquals(IntSize(root.width, root.height), alignSize.value)
-        assertEquals(Offset(0f, 0f), alignPosition.value)
-        assertEquals(IntSize(size, size), childSize.value)
-        assertEquals(
-            Offset(root.width - size.toFloat(), root.height - size.toFloat()),
-            childPosition.value
-        )
-    }
-
-    @Test
-    fun test1DWrapContentSize() = with(density) {
-        val sizeDp = 50.dp
-        val size = sizeDp.roundToPx()
-
-        val positionedLatch = CountDownLatch(2)
-        val alignSize = Ref<IntSize>()
-        val alignPosition = Ref<Offset>()
-        val childSize = Ref<IntSize>()
-        val childPosition = Ref<Offset>()
-        show {
-            Container(
-                Modifier.saveLayoutInfo(
-                    size = alignSize,
-                    position = alignPosition,
-                    positionedLatch = positionedLatch
-                )
-            ) {
-                Container(
-                    Modifier.fillMaxSize()
-                        .wrapContentWidth(Alignment.End)
-                        .width(sizeDp)
-                        .saveLayoutInfo(childSize, childPosition, positionedLatch)
-                ) {
-                }
-            }
-        }
-        assertTrue(positionedLatch.await(1, TimeUnit.SECONDS))
-
-        val root = findComposeView()
-        waitForDraw(root)
-
-        assertEquals(IntSize(root.width, root.height), alignSize.value)
-        assertEquals(Offset(0f, 0f), alignPosition.value)
-        assertEquals(IntSize(size, root.height), childSize.value)
-        assertEquals(Offset(root.width - size.toFloat(), 0f), childPosition.value)
-    }
-
-    @SdkSuppress(maxSdkVersion = 32) // b/267699626
-    @Test
-    fun testWrapContentSize_rtl() = with(density) {
-        val sizeDp = 200.toDp()
-        val size = sizeDp.roundToPx()
-
-        val positionedLatch = CountDownLatch(3)
-        val childSize = Array(3) { Ref<IntSize>() }
-        val childPosition = Array(3) { Ref<Offset>() }
-        show {
-            DeviceConfigurationOverride(
-                DeviceConfigurationOverride.LayoutDirection(LayoutDirection.Rtl)
-            ) {
-                Box(Modifier.fillMaxSize()) {
-                    Box(Modifier.fillMaxSize().wrapContentSize(Alignment.TopStart)) {
-                        Box(
-                            Modifier.size(sizeDp)
-                                .saveLayoutInfo(childSize[0], childPosition[0], positionedLatch)
-                        ) {
-                        }
-                    }
-                    Box(Modifier.fillMaxSize().wrapContentHeight(Alignment.CenterVertically)) {
-                        Box(
-                            Modifier.size(sizeDp)
-                                .saveLayoutInfo(childSize[1], childPosition[1], positionedLatch)
-                        ) {
-                        }
-                    }
-                    Box(Modifier.fillMaxSize().wrapContentSize(Alignment.BottomEnd)) {
-                        Box(
-                            Modifier.size(sizeDp)
-                                .saveLayoutInfo(childSize[2], childPosition[2], positionedLatch)
-                        ) {
-                        }
-                    }
-                }
-            }
-        }
-        assertTrue(positionedLatch.await(1, TimeUnit.SECONDS))
-
-        val root = findComposeView()
-        waitForDraw(root)
-
-        assertEquals(
-            Offset((root.width - size).toFloat(), 0f),
-            childPosition[0].value
-        )
-        assertEquals(
-            Offset(
-                (root.width - size).toFloat(),
-                ((root.height - size) / 2).toFloat()
-            ),
-            childPosition[1].value
-        )
-        assertEquals(
-            Offset(0f, (root.height - size).toFloat()),
-            childPosition[2].value
-        )
-    }
-
-    @Test
-    fun testModifier_wrapsContent() = with(density) {
-        val contentSize = 50.dp
-        val size = Ref<IntSize>()
-        val latch = CountDownLatch(1)
-        show {
-            Container {
-                Container(Modifier.saveLayoutInfo(size, Ref(), latch)) {
+    private fun verifyIntrinsicMeasurements(expandedModifier: Modifier) =
+        with(density) {
+            // intrinsic measurements do not change with the ExpandedModifier
+            testIntrinsics(
+                @Composable {
                     Container(
-                        Modifier.wrapContentSize(Alignment.TopStart)
-                            .size(contentSize)
+                        expandedModifier.then(Modifier.aspectRatio(2f)),
+                        width = 30.toDp(),
+                        height = 40.toDp()
+                    ) {}
+                }
+            ) { minIntrinsicWidth, minIntrinsicHeight, maxIntrinsicWidth, maxIntrinsicHeight ->
+                // Width
+                assertEquals(40, minIntrinsicWidth(20))
+                assertEquals(30, minIntrinsicWidth(Constraints.Infinity))
+
+                assertEquals(40, maxIntrinsicWidth(20))
+                assertEquals(30, maxIntrinsicWidth(Constraints.Infinity))
+
+                // Height
+                assertEquals(20, minIntrinsicHeight(40))
+                assertEquals(40, minIntrinsicHeight(Constraints.Infinity))
+
+                assertEquals(20, maxIntrinsicHeight(40))
+                assertEquals(40, maxIntrinsicHeight(Constraints.Infinity))
+            }
+        }
+
+    @Test
+    fun test2DWrapContentSize() =
+        with(density) {
+            val sizeDp = 50.dp
+            val size = sizeDp.roundToPx()
+
+            val positionedLatch = CountDownLatch(2)
+            val alignSize = Ref<IntSize>()
+            val alignPosition = Ref<Offset>()
+            val childSize = Ref<IntSize>()
+            val childPosition = Ref<Offset>()
+            show {
+                Container(Modifier.saveLayoutInfo(alignSize, alignPosition, positionedLatch)) {
+                    Container(
+                        Modifier.fillMaxSize()
+                            .wrapContentSize(Alignment.BottomEnd)
+                            .size(sizeDp)
+                            .saveLayoutInfo(childSize, childPosition, positionedLatch)
                     ) {}
                 }
             }
-        }
+            assertTrue(positionedLatch.await(1, TimeUnit.SECONDS))
 
-        assertTrue(latch.await(1, TimeUnit.SECONDS))
-        assertEquals(IntSize(contentSize.roundToPx(), contentSize.roundToPx()), size.value)
-    }
+            val root = findComposeView()
+            waitForDraw(root)
 
-    @Test
-    fun testWrapContentSize_wrapsContent_whenMeasuredWithInfiniteConstraints() = with(density) {
-        val sizeDp = 50.dp
-        val size = sizeDp.roundToPx()
-
-        val positionedLatch = CountDownLatch(2)
-        val alignSize = Ref<IntSize>()
-        val alignPosition = Ref<Offset>()
-        val childSize = Ref<IntSize>()
-        val childPosition = Ref<Offset>()
-        show {
-            Layout(
-                content = {
-                    Container(
-                        Modifier.saveLayoutInfo(alignSize, alignPosition, positionedLatch)
-                    ) {
-                        Container(
-                            Modifier.wrapContentSize(Alignment.BottomEnd)
-                                .size(sizeDp)
-                                .saveLayoutInfo(childSize, childPosition, positionedLatch)
-                        ) {
-                        }
-                    }
-                },
-                measurePolicy = { measurables, constraints ->
-                    val placeable = measurables.first().measure(Constraints())
-                    layout(constraints.maxWidth, constraints.maxHeight) {
-                        placeable.placeRelative(0, 0)
-                    }
-                }
+            assertEquals(IntSize(root.width, root.height), alignSize.value)
+            assertEquals(Offset(0f, 0f), alignPosition.value)
+            assertEquals(IntSize(size, size), childSize.value)
+            assertEquals(
+                Offset(root.width - size.toFloat(), root.height - size.toFloat()),
+                childPosition.value
             )
         }
-        assertTrue(positionedLatch.await(1, TimeUnit.SECONDS))
-
-        val root = findComposeView()
-        waitForDraw(root)
-
-        assertEquals(IntSize(size, size), alignSize.value)
-        assertEquals(Offset(0f, 0f), alignPosition.value)
-        assertEquals(IntSize(size, size), childSize.value)
-        assertEquals(Offset(0f, 0f), childPosition.value)
-    }
 
     @Test
-    fun testWrapContentSize_respectsMinConstraints() = with(density) {
-        val sizeDp = 50.dp
-        val size = sizeDp.roundToPx()
-        val doubleSizeDp = sizeDp * 2
-        val doubleSize = doubleSizeDp.roundToPx()
+    fun test1DWrapContentSize() =
+        with(density) {
+            val sizeDp = 50.dp
+            val size = sizeDp.roundToPx()
 
-        val positionedLatch = CountDownLatch(2)
-        val wrapSize = Ref<IntSize>()
-        val childSize = Ref<IntSize>()
-        val childPosition = Ref<Offset>()
-        show {
-            Container(Modifier.wrapContentSize(Alignment.TopStart)) {
+            val positionedLatch = CountDownLatch(2)
+            val alignSize = Ref<IntSize>()
+            val alignPosition = Ref<Offset>()
+            val childSize = Ref<IntSize>()
+            val childPosition = Ref<Offset>()
+            show {
+                Container(
+                    Modifier.saveLayoutInfo(
+                        size = alignSize,
+                        position = alignPosition,
+                        positionedLatch = positionedLatch
+                    )
+                ) {
+                    Container(
+                        Modifier.fillMaxSize()
+                            .wrapContentWidth(Alignment.End)
+                            .width(sizeDp)
+                            .saveLayoutInfo(childSize, childPosition, positionedLatch)
+                    ) {}
+                }
+            }
+            assertTrue(positionedLatch.await(1, TimeUnit.SECONDS))
+
+            val root = findComposeView()
+            waitForDraw(root)
+
+            assertEquals(IntSize(root.width, root.height), alignSize.value)
+            assertEquals(Offset(0f, 0f), alignPosition.value)
+            assertEquals(IntSize(size, root.height), childSize.value)
+            assertEquals(Offset(root.width - size.toFloat(), 0f), childPosition.value)
+        }
+
+    @SdkSuppress(maxSdkVersion = 32) // b/267699626
+    @Test
+    fun testWrapContentSize_rtl() =
+        with(density) {
+            val sizeDp = 200.toDp()
+            val size = sizeDp.roundToPx()
+
+            val positionedLatch = CountDownLatch(3)
+            val childSize = Array(3) { Ref<IntSize>() }
+            val childPosition = Array(3) { Ref<Offset>() }
+            show {
+                DeviceConfigurationOverride(
+                    DeviceConfigurationOverride.LayoutDirection(LayoutDirection.Rtl)
+                ) {
+                    Box(Modifier.fillMaxSize()) {
+                        Box(Modifier.fillMaxSize().wrapContentSize(Alignment.TopStart)) {
+                            Box(
+                                Modifier.size(sizeDp)
+                                    .saveLayoutInfo(childSize[0], childPosition[0], positionedLatch)
+                            ) {}
+                        }
+                        Box(Modifier.fillMaxSize().wrapContentHeight(Alignment.CenterVertically)) {
+                            Box(
+                                Modifier.size(sizeDp)
+                                    .saveLayoutInfo(childSize[1], childPosition[1], positionedLatch)
+                            ) {}
+                        }
+                        Box(Modifier.fillMaxSize().wrapContentSize(Alignment.BottomEnd)) {
+                            Box(
+                                Modifier.size(sizeDp)
+                                    .saveLayoutInfo(childSize[2], childPosition[2], positionedLatch)
+                            ) {}
+                        }
+                    }
+                }
+            }
+            assertTrue(positionedLatch.await(1, TimeUnit.SECONDS))
+
+            val root = findComposeView()
+            waitForDraw(root)
+
+            assertEquals(Offset((root.width - size).toFloat(), 0f), childPosition[0].value)
+            assertEquals(
+                Offset((root.width - size).toFloat(), ((root.height - size) / 2).toFloat()),
+                childPosition[1].value
+            )
+            assertEquals(Offset(0f, (root.height - size).toFloat()), childPosition[2].value)
+        }
+
+    @Test
+    fun testModifier_wrapsContent() =
+        with(density) {
+            val contentSize = 50.dp
+            val size = Ref<IntSize>()
+            val latch = CountDownLatch(1)
+            show {
+                Container {
+                    Container(Modifier.saveLayoutInfo(size, Ref(), latch)) {
+                        Container(Modifier.wrapContentSize(Alignment.TopStart).size(contentSize)) {}
+                    }
+                }
+            }
+
+            assertTrue(latch.await(1, TimeUnit.SECONDS))
+            assertEquals(IntSize(contentSize.roundToPx(), contentSize.roundToPx()), size.value)
+        }
+
+    @Test
+    fun testWrapContentSize_wrapsContent_whenMeasuredWithInfiniteConstraints() =
+        with(density) {
+            val sizeDp = 50.dp
+            val size = sizeDp.roundToPx()
+
+            val positionedLatch = CountDownLatch(2)
+            val alignSize = Ref<IntSize>()
+            val alignPosition = Ref<Offset>()
+            val childSize = Ref<IntSize>()
+            val childPosition = Ref<Offset>()
+            show {
                 Layout(
-                    modifier = Modifier.onGloballyPositioned { coordinates: LayoutCoordinates ->
-                        wrapSize.value = coordinates.size
-                        positionedLatch.countDown()
-                    },
                     content = {
                         Container(
-                            Modifier.wrapContentSize(Alignment.Center)
-                                .size(sizeDp)
-                                .saveLayoutInfo(childSize, childPosition, positionedLatch)
+                            Modifier.saveLayoutInfo(alignSize, alignPosition, positionedLatch)
                         ) {
+                            Container(
+                                Modifier.wrapContentSize(Alignment.BottomEnd)
+                                    .size(sizeDp)
+                                    .saveLayoutInfo(childSize, childPosition, positionedLatch)
+                            ) {}
                         }
                     },
-                    measurePolicy = { measurables, incomingConstraints ->
-                        val measurable = measurables.first()
-                        val constraints = incomingConstraints.constrain(
-                            Constraints(
-                                minWidth = doubleSizeDp.roundToPx(),
-                                minHeight = doubleSizeDp.roundToPx()
-                            )
-                        )
-                        val placeable = measurable.measure(constraints)
-                        layout(placeable.width, placeable.height) {
-                            placeable.placeRelative(IntOffset.Zero)
+                    measurePolicy = { measurables, constraints ->
+                        val placeable = measurables.first().measure(Constraints())
+                        layout(constraints.maxWidth, constraints.maxHeight) {
+                            placeable.placeRelative(0, 0)
                         }
                     }
                 )
             }
-        }
-        assertTrue(positionedLatch.await(1, TimeUnit.SECONDS))
+            assertTrue(positionedLatch.await(1, TimeUnit.SECONDS))
 
-        assertEquals(IntSize(doubleSize, doubleSize), wrapSize.value)
-        assertEquals(IntSize(size, size), childSize.value)
-        assertEquals(
-            Offset(
-                ((doubleSize - size) / 2f).roundToInt().toFloat(),
-                ((doubleSize - size) / 2f).roundToInt().toFloat()
-            ),
-            childPosition.value
-        )
-    }
+            val root = findComposeView()
+            waitForDraw(root)
+
+            assertEquals(IntSize(size, size), alignSize.value)
+            assertEquals(Offset(0f, 0f), alignPosition.value)
+            assertEquals(IntSize(size, size), childSize.value)
+            assertEquals(Offset(0f, 0f), childPosition.value)
+        }
 
     @Test
-    fun testWrapContentSize_unbounded() = with(density) {
-        val outerSize = 10f
-        val innerSize = 20f
+    fun testWrapContentSize_respectsMinConstraints() =
+        with(density) {
+            val sizeDp = 50.dp
+            val size = sizeDp.roundToPx()
+            val doubleSizeDp = sizeDp * 2
+            val doubleSize = doubleSizeDp.roundToPx()
 
-        val positionedLatch = CountDownLatch(4)
-        show {
-            Box(
-                Modifier.requiredSize(outerSize.toDp())
-                    .onGloballyPositioned {
+            val positionedLatch = CountDownLatch(2)
+            val wrapSize = Ref<IntSize>()
+            val childSize = Ref<IntSize>()
+            val childPosition = Ref<Offset>()
+            show {
+                Container(Modifier.wrapContentSize(Alignment.TopStart)) {
+                    Layout(
+                        modifier =
+                            Modifier.onGloballyPositioned { coordinates: LayoutCoordinates ->
+                                wrapSize.value = coordinates.size
+                                positionedLatch.countDown()
+                            },
+                        content = {
+                            Container(
+                                Modifier.wrapContentSize(Alignment.Center)
+                                    .size(sizeDp)
+                                    .saveLayoutInfo(childSize, childPosition, positionedLatch)
+                            ) {}
+                        },
+                        measurePolicy = { measurables, incomingConstraints ->
+                            val measurable = measurables.first()
+                            val constraints =
+                                incomingConstraints.constrain(
+                                    Constraints(
+                                        minWidth = doubleSizeDp.roundToPx(),
+                                        minHeight = doubleSizeDp.roundToPx()
+                                    )
+                                )
+                            val placeable = measurable.measure(constraints)
+                            layout(placeable.width, placeable.height) {
+                                placeable.placeRelative(IntOffset.Zero)
+                            }
+                        }
+                    )
+                }
+            }
+            assertTrue(positionedLatch.await(1, TimeUnit.SECONDS))
+
+            assertEquals(IntSize(doubleSize, doubleSize), wrapSize.value)
+            assertEquals(IntSize(size, size), childSize.value)
+            assertEquals(
+                Offset(
+                    ((doubleSize - size) / 2f).roundToInt().toFloat(),
+                    ((doubleSize - size) / 2f).roundToInt().toFloat()
+                ),
+                childPosition.value
+            )
+        }
+
+    @Test
+    fun testWrapContentSize_unbounded() =
+        with(density) {
+            val outerSize = 10f
+            val innerSize = 20f
+
+            val positionedLatch = CountDownLatch(4)
+            show {
+                Box(
+                    Modifier.requiredSize(outerSize.toDp()).onGloballyPositioned {
                         assertEquals(outerSize, it.size.width.toFloat())
                         positionedLatch.countDown()
                     }
-            ) {
-                Box(
-                    Modifier.wrapContentSize(Alignment.BottomEnd, unbounded = true)
-                        .requiredSize(innerSize.toDp())
-                        .onGloballyPositioned {
-                            assertEquals(
-                                Offset(outerSize - innerSize, outerSize - innerSize),
-                                it.positionInParent()
-                            )
-                            positionedLatch.countDown()
-                        }
-                )
-                Box(
-                    Modifier.wrapContentWidth(Alignment.End, unbounded = true)
-                        .requiredSize(innerSize.toDp())
-                        .onGloballyPositioned {
-                            assertEquals(outerSize - innerSize, it.positionInParent().x)
-                            positionedLatch.countDown()
-                        }
-                )
-                Box(
-                    Modifier.wrapContentHeight(Alignment.Bottom, unbounded = true)
-                        .requiredSize(innerSize.toDp())
-                        .onGloballyPositioned {
-                            assertEquals(outerSize - innerSize, it.positionInParent().y)
-                            positionedLatch.countDown()
-                        }
-                )
-            }
-        }
-        assertTrue(positionedLatch.await(1, TimeUnit.SECONDS))
-    }
-
-    @Test
-    fun test2DAlignedModifier_hasCorrectIntrinsicMeasurements() = with(density) {
-        testIntrinsics(
-            @Composable {
-                Container(Modifier.wrapContentSize(Alignment.TopStart).aspectRatio(2f)) { }
-            }
-        ) { minIntrinsicWidth, minIntrinsicHeight, maxIntrinsicWidth, maxIntrinsicHeight ->
-            // Min width.
-            assertEquals(0, minIntrinsicWidth(0))
-            assertEquals(25.dp.roundToPx() * 2, minIntrinsicWidth(25.dp.roundToPx()))
-            assertEquals(0.dp.roundToPx(), minIntrinsicWidth(Constraints.Infinity))
-
-            // Min height.
-            assertEquals(0, minIntrinsicWidth(0))
-            assertEquals(
-                (50.dp.roundToPx() / 2f).roundToInt(),
-                minIntrinsicHeight(50.dp.roundToPx())
-            )
-            assertEquals(0.dp.roundToPx(), minIntrinsicHeight(Constraints.Infinity))
-
-            // Max width.
-            assertEquals(0, minIntrinsicWidth(0))
-            assertEquals(25.dp.roundToPx() * 2, maxIntrinsicWidth(25.dp.roundToPx()))
-            assertEquals(0.dp.roundToPx(), maxIntrinsicWidth(Constraints.Infinity))
-
-            // Max height.
-            assertEquals(0, minIntrinsicWidth(0))
-            assertEquals(
-                (50.dp.roundToPx() / 2f).roundToInt(),
-                maxIntrinsicHeight(50.dp.roundToPx())
-            )
-            assertEquals(0.dp.roundToPx(), maxIntrinsicHeight(Constraints.Infinity))
-        }
-    }
-
-    @Test
-    fun test1DAlignedModifier_hasCorrectIntrinsicMeasurements() = with(density) {
-        testIntrinsics({
-            Container(
-                Modifier.wrapContentHeight(Alignment.CenterVertically)
-                    .aspectRatio(2f)
-            ) { }
-        }) { minIntrinsicWidth, minIntrinsicHeight, maxIntrinsicWidth, maxIntrinsicHeight ->
-
-            // Min width.
-            assertEquals(0, minIntrinsicWidth(0))
-            assertEquals(25.dp.roundToPx() * 2, minIntrinsicWidth(25.dp.roundToPx()))
-            assertEquals(0.dp.roundToPx(), minIntrinsicWidth(Constraints.Infinity))
-
-            // Min height.
-            assertEquals(0, minIntrinsicWidth(0))
-            assertEquals(
-                (50.dp.roundToPx() / 2f).roundToInt(),
-                minIntrinsicHeight(50.dp.roundToPx())
-            )
-            assertEquals(0.dp.roundToPx(), minIntrinsicHeight(Constraints.Infinity))
-
-            // Max width.
-            assertEquals(0, minIntrinsicWidth(0))
-            assertEquals(25.dp.roundToPx() * 2, maxIntrinsicWidth(25.dp.roundToPx()))
-            assertEquals(0.dp.roundToPx(), maxIntrinsicWidth(Constraints.Infinity))
-
-            // Max height.
-            assertEquals(0, minIntrinsicWidth(0))
-            assertEquals(
-                (50.dp.roundToPx() / 2f).roundToInt(),
-                maxIntrinsicHeight(50.dp.roundToPx())
-            )
-            assertEquals(0.dp.roundToPx(), maxIntrinsicHeight(Constraints.Infinity))
-        }
-    }
-
-    @Test
-    fun testAlignedModifier_alignsCorrectly_whenOddDimensions_endAligned() = with(density) {
-        // Given a 100 x 100 pixel container, we want to make sure that when aligning a 1 x 1 pixel
-        // child to both ends (bottom, and right) we correctly position children at the last
-        // possible pixel, and avoid rounding issues. Previously we first centered the coordinates,
-        // and then aligned after, so the maths would actually be (99 / 2) * 2, which incorrectly
-        // ends up at 100 (Int rounds up) - so the last pixels in both directions just wouldn't
-        // be visible.
-        val parentSize = 100.toDp()
-        val childSizeDp = 1.toDp()
-        val childSizeIpx = childSizeDp.roundToPx()
-
-        val positionedLatch = CountDownLatch(2)
-        val alignSize = Ref<IntSize>()
-        val alignPosition = Ref<Offset>()
-        val childSize = Ref<IntSize>()
-        val childPosition = Ref<Offset>()
-        show {
-            Layout(
-                content = {
-                    Container(
-                        Modifier.size(parentSize)
-                            .saveLayoutInfo(alignSize, alignPosition, positionedLatch)
-                    ) {
-                        Container(
-                            Modifier.fillMaxSize()
-                                .wrapContentSize(Alignment.BottomEnd)
-                                .size(childSizeDp)
-                                .saveLayoutInfo(childSize, childPosition, positionedLatch)
-                        ) {
-                        }
-                    }
-                },
-                measurePolicy = { measurables, constraints ->
-                    val placeable = measurables.first().measure(Constraints())
-                    layout(constraints.maxWidth, constraints.maxHeight) {
-                        placeable.placeRelative(0, 0)
-                    }
+                ) {
+                    Box(
+                        Modifier.wrapContentSize(Alignment.BottomEnd, unbounded = true)
+                            .requiredSize(innerSize.toDp())
+                            .onGloballyPositioned {
+                                assertEquals(
+                                    Offset(outerSize - innerSize, outerSize - innerSize),
+                                    it.positionInParent()
+                                )
+                                positionedLatch.countDown()
+                            }
+                    )
+                    Box(
+                        Modifier.wrapContentWidth(Alignment.End, unbounded = true)
+                            .requiredSize(innerSize.toDp())
+                            .onGloballyPositioned {
+                                assertEquals(outerSize - innerSize, it.positionInParent().x)
+                                positionedLatch.countDown()
+                            }
+                    )
+                    Box(
+                        Modifier.wrapContentHeight(Alignment.Bottom, unbounded = true)
+                            .requiredSize(innerSize.toDp())
+                            .onGloballyPositioned {
+                                assertEquals(outerSize - innerSize, it.positionInParent().y)
+                                positionedLatch.countDown()
+                            }
+                    )
                 }
+            }
+            assertTrue(positionedLatch.await(1, TimeUnit.SECONDS))
+        }
+
+    @Test
+    fun test2DAlignedModifier_hasCorrectIntrinsicMeasurements() =
+        with(density) {
+            testIntrinsics(
+                @Composable {
+                    Container(Modifier.wrapContentSize(Alignment.TopStart).aspectRatio(2f)) {}
+                }
+            ) { minIntrinsicWidth, minIntrinsicHeight, maxIntrinsicWidth, maxIntrinsicHeight ->
+                // Min width.
+                assertEquals(0, minIntrinsicWidth(0))
+                assertEquals(25.dp.roundToPx() * 2, minIntrinsicWidth(25.dp.roundToPx()))
+                assertEquals(0.dp.roundToPx(), minIntrinsicWidth(Constraints.Infinity))
+
+                // Min height.
+                assertEquals(0, minIntrinsicWidth(0))
+                assertEquals(
+                    (50.dp.roundToPx() / 2f).roundToInt(),
+                    minIntrinsicHeight(50.dp.roundToPx())
+                )
+                assertEquals(0.dp.roundToPx(), minIntrinsicHeight(Constraints.Infinity))
+
+                // Max width.
+                assertEquals(0, minIntrinsicWidth(0))
+                assertEquals(25.dp.roundToPx() * 2, maxIntrinsicWidth(25.dp.roundToPx()))
+                assertEquals(0.dp.roundToPx(), maxIntrinsicWidth(Constraints.Infinity))
+
+                // Max height.
+                assertEquals(0, minIntrinsicWidth(0))
+                assertEquals(
+                    (50.dp.roundToPx() / 2f).roundToInt(),
+                    maxIntrinsicHeight(50.dp.roundToPx())
+                )
+                assertEquals(0.dp.roundToPx(), maxIntrinsicHeight(Constraints.Infinity))
+            }
+        }
+
+    @Test
+    fun test1DAlignedModifier_hasCorrectIntrinsicMeasurements() =
+        with(density) {
+            testIntrinsics({
+                Container(Modifier.wrapContentHeight(Alignment.CenterVertically).aspectRatio(2f)) {}
+            }) { minIntrinsicWidth, minIntrinsicHeight, maxIntrinsicWidth, maxIntrinsicHeight ->
+
+                // Min width.
+                assertEquals(0, minIntrinsicWidth(0))
+                assertEquals(25.dp.roundToPx() * 2, minIntrinsicWidth(25.dp.roundToPx()))
+                assertEquals(0.dp.roundToPx(), minIntrinsicWidth(Constraints.Infinity))
+
+                // Min height.
+                assertEquals(0, minIntrinsicWidth(0))
+                assertEquals(
+                    (50.dp.roundToPx() / 2f).roundToInt(),
+                    minIntrinsicHeight(50.dp.roundToPx())
+                )
+                assertEquals(0.dp.roundToPx(), minIntrinsicHeight(Constraints.Infinity))
+
+                // Max width.
+                assertEquals(0, minIntrinsicWidth(0))
+                assertEquals(25.dp.roundToPx() * 2, maxIntrinsicWidth(25.dp.roundToPx()))
+                assertEquals(0.dp.roundToPx(), maxIntrinsicWidth(Constraints.Infinity))
+
+                // Max height.
+                assertEquals(0, minIntrinsicWidth(0))
+                assertEquals(
+                    (50.dp.roundToPx() / 2f).roundToInt(),
+                    maxIntrinsicHeight(50.dp.roundToPx())
+                )
+                assertEquals(0.dp.roundToPx(), maxIntrinsicHeight(Constraints.Infinity))
+            }
+        }
+
+    @Test
+    fun testAlignedModifier_alignsCorrectly_whenOddDimensions_endAligned() =
+        with(density) {
+            // Given a 100 x 100 pixel container, we want to make sure that when aligning a 1 x 1
+            // pixel
+            // child to both ends (bottom, and right) we correctly position children at the last
+            // possible pixel, and avoid rounding issues. Previously we first centered the
+            // coordinates,
+            // and then aligned after, so the maths would actually be (99 / 2) * 2, which
+            // incorrectly
+            // ends up at 100 (Int rounds up) - so the last pixels in both directions just wouldn't
+            // be visible.
+            val parentSize = 100.toDp()
+            val childSizeDp = 1.toDp()
+            val childSizeIpx = childSizeDp.roundToPx()
+
+            val positionedLatch = CountDownLatch(2)
+            val alignSize = Ref<IntSize>()
+            val alignPosition = Ref<Offset>()
+            val childSize = Ref<IntSize>()
+            val childPosition = Ref<Offset>()
+            show {
+                Layout(
+                    content = {
+                        Container(
+                            Modifier.size(parentSize)
+                                .saveLayoutInfo(alignSize, alignPosition, positionedLatch)
+                        ) {
+                            Container(
+                                Modifier.fillMaxSize()
+                                    .wrapContentSize(Alignment.BottomEnd)
+                                    .size(childSizeDp)
+                                    .saveLayoutInfo(childSize, childPosition, positionedLatch)
+                            ) {}
+                        }
+                    },
+                    measurePolicy = { measurables, constraints ->
+                        val placeable = measurables.first().measure(Constraints())
+                        layout(constraints.maxWidth, constraints.maxHeight) {
+                            placeable.placeRelative(0, 0)
+                        }
+                    }
+                )
+            }
+            positionedLatch.await(1, TimeUnit.SECONDS)
+
+            val root = findComposeView()
+            waitForDraw(root)
+
+            assertEquals(IntSize(childSizeIpx, childSizeIpx), childSize.value)
+            assertEquals(
+                Offset(
+                    (alignSize.value!!.width - childSizeIpx).toFloat(),
+                    (alignSize.value!!.height - childSizeIpx).toFloat()
+                ),
+                childPosition.value
             )
         }
-        positionedLatch.await(1, TimeUnit.SECONDS)
-
-        val root = findComposeView()
-        waitForDraw(root)
-
-        assertEquals(IntSize(childSizeIpx, childSizeIpx), childSize.value)
-        assertEquals(
-            Offset(
-                (alignSize.value!!.width - childSizeIpx).toFloat(),
-                (alignSize.value!!.height - childSizeIpx).toFloat()
-            ),
-            childPosition.value
-        )
-    }
 
     @Test
     fun testModifiers_doNotCauseUnnecessaryRemeasure() {
         var drawLatch = CountDownLatch(1)
         var first by mutableStateOf(true)
         var totalMeasures = 0
-        @Composable fun CountMeasures(modifier: Modifier) {
+        @Composable
+        fun CountMeasures(modifier: Modifier) {
             Layout(
                 content = {},
                 modifier = modifier,
                 // remember the measurePolicy so it doesn't change and cause a relayout when
                 // recomposed
-                measurePolicy = remember {
-                    { _, _ ->
-                        ++totalMeasures
-                        layout(0, 0) {}
+                measurePolicy =
+                    remember {
+                        { _, _ ->
+                            ++totalMeasures
+                            layout(0, 0) {}
+                        }
                     }
-                }
             )
         }
-        val drawLatchModifier = Modifier.drawBehind {
-            drawLatch.countDown()
-        }
+        val drawLatchModifier = Modifier.drawBehind { drawLatch.countDown() }
         show {
             Box(drawLatchModifier) {
                 if (first) Box {} else Row {}
@@ -1883,9 +1897,7 @@
 
         assertTrue(drawLatch.await(1, TimeUnit.SECONDS))
 
-        activityTestRule.runOnUiThread {
-            assertEquals(5, totalMeasures)
-        }
+        activityTestRule.runOnUiThread { assertEquals(5, totalMeasures) }
     }
 
     @Test
@@ -1914,7 +1926,8 @@
 
     @Test
     fun testIntrinsicMeasurements_notQueriedWhenConstraintsAreFixed() {
-        @Composable fun ErrorIntrinsicsLayout(modifier: Modifier) {
+        @Composable
+        fun ErrorIntrinsicsLayout(modifier: Modifier) {
             Layout(
                 {},
                 modifier,
@@ -1951,13 +1964,9 @@
 
         show {
             Box(Modifier.width(IntrinsicSize.Min)) { ErrorIntrinsicsLayout(Modifier.width(1.dp)) }
-            Box(Modifier.width(IntrinsicSize.Min)) {
-                ErrorIntrinsicsLayout(Modifier.width(1.dp))
-            }
+            Box(Modifier.width(IntrinsicSize.Min)) { ErrorIntrinsicsLayout(Modifier.width(1.dp)) }
             Box(Modifier.width(IntrinsicSize.Max)) { ErrorIntrinsicsLayout(Modifier.width(1.dp)) }
-            Box(Modifier.width(IntrinsicSize.Max)) {
-                ErrorIntrinsicsLayout(Modifier.width(1.dp))
-            }
+            Box(Modifier.width(IntrinsicSize.Max)) { ErrorIntrinsicsLayout(Modifier.width(1.dp)) }
             Box(Modifier.requiredWidth(IntrinsicSize.Min)) {
                 ErrorIntrinsicsLayout(Modifier.width(1.dp))
             }
@@ -1971,13 +1980,9 @@
                 ErrorIntrinsicsLayout(Modifier.width(1.dp))
             }
             Box(Modifier.height(IntrinsicSize.Min)) { ErrorIntrinsicsLayout(Modifier.height(1.dp)) }
-            Box(Modifier.height(IntrinsicSize.Min)) {
-                ErrorIntrinsicsLayout(Modifier.height(1.dp))
-            }
+            Box(Modifier.height(IntrinsicSize.Min)) { ErrorIntrinsicsLayout(Modifier.height(1.dp)) }
             Box(Modifier.height(IntrinsicSize.Max)) { ErrorIntrinsicsLayout(Modifier.height(1.dp)) }
-            Box(Modifier.height(IntrinsicSize.Max)) {
-                ErrorIntrinsicsLayout(Modifier.height(1.dp))
-            }
+            Box(Modifier.height(IntrinsicSize.Max)) { ErrorIntrinsicsLayout(Modifier.height(1.dp)) }
             Box(Modifier.requiredHeight(IntrinsicSize.Min)) {
                 ErrorIntrinsicsLayout(Modifier.height(1.dp))
             }
diff --git a/compose/foundation/foundation-layout/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/layout/SpacerTest.kt b/compose/foundation/foundation-layout/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/layout/SpacerTest.kt
index 81a0bc1..bc21d9b 100644
--- a/compose/foundation/foundation-layout/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/layout/SpacerTest.kt
+++ b/compose/foundation/foundation-layout/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/layout/SpacerTest.kt
@@ -34,10 +34,7 @@
 @RunWith(AndroidJUnit4::class)
 class SpacerTest : LayoutTest() {
 
-    private val bigConstraints = DpConstraints(
-        maxWidth = 5000.dp,
-        maxHeight = 5000.dp
-    )
+    private val bigConstraints = DpConstraints(maxWidth = 5000.dp, maxHeight = 5000.dp)
 
     @Test
     fun fixedSpacer_Sizes() {
@@ -49,11 +46,11 @@
         show {
             Container(constraints = bigConstraints) {
                 Spacer(
-                    Modifier.size(width = width, height = height)
-                        .onGloballyPositioned { position: LayoutCoordinates ->
-                            size = position.size
-                            drawLatch.countDown()
-                        }
+                    Modifier.size(width = width, height = height).onGloballyPositioned {
+                        position: LayoutCoordinates ->
+                        size = position.size
+                        drawLatch.countDown()
+                    }
                 )
             }
         }
@@ -77,17 +74,15 @@
         show {
             Box {
                 Container(
-                    constraints = DpConstraints(
-                        maxWidth = containerWidth,
-                        maxHeight = containerHeight
-                    )
+                    constraints =
+                        DpConstraints(maxWidth = containerWidth, maxHeight = containerHeight)
                 ) {
                     Spacer(
-                        Modifier.size(width = width, height = height)
-                            .onGloballyPositioned { position: LayoutCoordinates ->
-                                size = position.size
-                                drawLatch.countDown()
-                            }
+                        Modifier.size(width = width, height = height).onGloballyPositioned {
+                            position: LayoutCoordinates ->
+                            size = position.size
+                            drawLatch.countDown()
+                        }
                     )
                 }
             }
@@ -135,17 +130,14 @@
         show {
             Box {
                 Container(
-                    constraints = DpConstraints(
-                        maxWidth = containerWidth,
-                        maxHeight = containerHeight
-                    )
+                    constraints =
+                        DpConstraints(maxWidth = containerWidth, maxHeight = containerHeight)
                 ) {
                     Spacer(
-                        Modifier.width(width)
-                            .onGloballyPositioned { position: LayoutCoordinates ->
-                                size = position.size
-                                drawLatch.countDown()
-                            }
+                        Modifier.width(width).onGloballyPositioned { position: LayoutCoordinates ->
+                            size = position.size
+                            drawLatch.countDown()
+                        }
                     )
                 }
             }
@@ -167,11 +159,10 @@
         show {
             Container(constraints = bigConstraints) {
                 Spacer(
-                    Modifier.height(height)
-                        .onGloballyPositioned { position: LayoutCoordinates ->
-                            size = position.size
-                            drawLatch.countDown()
-                        }
+                    Modifier.height(height).onGloballyPositioned { position: LayoutCoordinates ->
+                        size = position.size
+                        drawLatch.countDown()
+                    }
                 )
             }
         }
@@ -194,17 +185,15 @@
         show {
             Box {
                 Container(
-                    constraints = DpConstraints(
-                        maxWidth = containerWidth,
-                        maxHeight = containerHeight
-                    )
+                    constraints =
+                        DpConstraints(maxWidth = containerWidth, maxHeight = containerHeight)
                 ) {
                     Spacer(
-                        Modifier.height(height)
-                            .onGloballyPositioned { position: LayoutCoordinates ->
-                                size = position.size
-                                drawLatch.countDown()
-                            }
+                        Modifier.height(height).onGloballyPositioned { position: LayoutCoordinates
+                            ->
+                            size = position.size
+                            drawLatch.countDown()
+                        }
                     )
                 }
             }
diff --git a/compose/foundation/foundation-layout/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/layout/WindowInsetsControllerTest.kt b/compose/foundation/foundation-layout/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/layout/WindowInsetsControllerTest.kt
index 3540fb5..8641ccf 100644
--- a/compose/foundation/foundation-layout/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/layout/WindowInsetsControllerTest.kt
+++ b/compose/foundation/foundation-layout/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/layout/WindowInsetsControllerTest.kt
@@ -75,19 +75,16 @@
 @OptIn(ExperimentalLayoutApi::class)
 @SdkSuppress(minSdkVersion = Build.VERSION_CODES.R)
 class WindowInsetsControllerTest {
-    @get:Rule
-    val rule = createAndroidComposeRule<WindowInsetsActivity>()
+    @get:Rule val rule = createAndroidComposeRule<WindowInsetsActivity>()
 
     private val testTag = "TestTag"
 
-    /**
-     * The size of the inset when shown.
-     */
+    /** The size of the inset when shown. */
     private var shownSize = 0
 
     /**
-     * This is the fling velocity that will move enough so that a spring will show at least
-     * 1 pixel of movement. This should be considered a small fling.
+     * This is the fling velocity that will move enough so that a spring will show at least 1 pixel
+     * of movement. This should be considered a small fling.
      */
     private val FlingToSpring1Pixel = 300f
 
@@ -99,15 +96,12 @@
     // work with different insets types.
     // ========================================================
 
-    /**
-     * The android WindowInsets type.
-     */
+    /** The android WindowInsets type. */
     private val insetType = android.view.WindowInsets.Type.statusBars()
     private val insetSide = WindowInsetsSides.Top
 
     private val windowInsets: AndroidWindowInsets
-        @Composable
-        get() = WindowInsetsHolder.current().ime
+        @Composable get() = WindowInsetsHolder.current().ime
 
     private val WindowInsets.value: Int
         get() = getBottom(Density(1f))
@@ -125,9 +119,7 @@
         swipeDown()
     }
 
-    /**
-     * A motion in this direction moves away from the insets
-     */
+    /** A motion in this direction moves away from the insets */
     private val directionMultiplier: Float = -1f
 
     private var shownAtStart = false
@@ -141,6 +133,7 @@
             shownAtStart = view.rootWindowInsets.isVisible(insetType)
         }
     }
+
     @After
     fun teardown() {
         rule.runOnUiThread {
@@ -154,9 +147,7 @@
         }
     }
 
-    /**
-     * Scrolling away from the inset with the inset hidden should show it.
-     */
+    /** Scrolling away from the inset with the inset hidden should show it. */
     @Test
     fun canScrollToShow() {
         if (!initializeDeviceWithInsetsHidden()) {
@@ -166,13 +157,12 @@
         lateinit var coordinates: LayoutCoordinates
 
         rule.setContent {
-            connection =
-                rememberWindowInsetsConnection(windowInsets, insetSide)
-            Box(Modifier
-                .fillMaxSize()
-                .windowInsetsPadding(windowInsets)
-                .nestedScroll(connection)
-                .onPlaced { coordinates = it }
+            connection = rememberWindowInsetsConnection(windowInsets, insetSide)
+            Box(
+                Modifier.fillMaxSize()
+                    .windowInsetsPadding(windowInsets)
+                    .nestedScroll(connection)
+                    .onPlaced { coordinates = it }
             )
         }
 
@@ -180,11 +170,12 @@
 
         rule.runOnUiThread {
             // The first scroll triggers the animation controller to be requested
-            val consumed = connection.onPostScroll(
-                consumed = Offset.Zero,
-                available = Offset(3f, directionMultiplier),
-                source = NestedScrollSource.UserInput
-            )
+            val consumed =
+                connection.onPostScroll(
+                    consumed = Offset.Zero,
+                    available = Offset(3f, directionMultiplier),
+                    source = NestedScrollSource.UserInput
+                )
             assertThat(consumed).isEqualTo(Offset(0f, directionMultiplier))
         }
         // We don't know when the animation controller request will be fulfilled, so loop
@@ -192,14 +183,15 @@
         val startTime = SystemClock.uptimeMillis()
         do {
             assertThat(SystemClock.uptimeMillis()).isLessThan(startTime + 1000)
-            val size = rule.runOnUiThread {
-                connection.onPostScroll(
-                    consumed = Offset.Zero,
-                    available = Offset(3f, directionMultiplier * 5f),
-                    source = NestedScrollSource.UserInput
-                )
-                coordinates.size
-            }
+            val size =
+                rule.runOnUiThread {
+                    connection.onPostScroll(
+                        consumed = Offset.Zero,
+                        available = Offset(3f, directionMultiplier * 5f),
+                        source = NestedScrollSource.UserInput
+                    )
+                    coordinates.size
+                }
         } while (size == sizeBefore)
 
         rule.runOnIdle {
@@ -208,9 +200,7 @@
         }
     }
 
-    /**
-     * Scrolling toward the inset with the inset shown should hide it.
-     */
+    /** Scrolling toward the inset with the inset shown should hide it. */
     @Test
     fun canScrollToHide() {
         if (!initializeDeviceWithInsetsShown()) {
@@ -220,13 +210,12 @@
         lateinit var coordinates: LayoutCoordinates
 
         rule.setContent {
-            connection =
-                rememberWindowInsetsConnection(windowInsets, insetSide)
-            Box(Modifier
-                .fillMaxSize()
-                .windowInsetsPadding(windowInsets)
-                .nestedScroll(connection)
-                .onPlaced { coordinates = it }
+            connection = rememberWindowInsetsConnection(windowInsets, insetSide)
+            Box(
+                Modifier.fillMaxSize()
+                    .windowInsetsPadding(windowInsets)
+                    .nestedScroll(connection)
+                    .onPlaced { coordinates = it }
             )
         }
 
@@ -234,10 +223,11 @@
 
         rule.runOnUiThread {
             // The first scroll triggers the animation controller to be requested
-            val consumed = connection.onPreScroll(
-                available = Offset(3f, -directionMultiplier),
-                source = NestedScrollSource.UserInput
-            )
+            val consumed =
+                connection.onPreScroll(
+                    available = Offset(3f, -directionMultiplier),
+                    source = NestedScrollSource.UserInput
+                )
             assertThat(consumed).isEqualTo(Offset(0f, -directionMultiplier))
         }
         // We don't know when the animation controller request will be fulfilled, so loop
@@ -245,13 +235,14 @@
         val startTime = SystemClock.uptimeMillis()
         do {
             assertThat(SystemClock.uptimeMillis()).isLessThan(startTime + 1000)
-            val size = rule.runOnUiThread {
-                connection.onPreScroll(
-                    available = Offset(3f, directionMultiplier * -5f),
-                    source = NestedScrollSource.UserInput
-                )
-                coordinates.size
-            }
+            val size =
+                rule.runOnUiThread {
+                    connection.onPreScroll(
+                        available = Offset(3f, directionMultiplier * -5f),
+                        source = NestedScrollSource.UserInput
+                    )
+                    coordinates.size
+                }
         } while (size == sizeBefore)
 
         rule.runOnIdle {
@@ -260,9 +251,7 @@
         }
     }
 
-    /**
-     * Flinging away from an inset should show it.
-     */
+    /** Flinging away from an inset should show it. */
     @Test
     fun canFlingToShow() {
         if (!initializeDeviceWithInsetsHidden()) {
@@ -272,23 +261,23 @@
         lateinit var coordinates: LayoutCoordinates
 
         rule.setContent {
-            connection =
-                rememberWindowInsetsConnection(windowInsets, insetSide)
-            Box(Modifier
-                .fillMaxSize()
-                .windowInsetsPadding(windowInsets)
-                .nestedScroll(connection)
-                .onPlaced { coordinates = it }
+            connection = rememberWindowInsetsConnection(windowInsets, insetSide)
+            Box(
+                Modifier.fillMaxSize()
+                    .windowInsetsPadding(windowInsets)
+                    .nestedScroll(connection)
+                    .onPlaced { coordinates = it }
             )
         }
 
         val sizeBefore = coordinates.size
 
         runBlockingOnUiThread {
-            val consumed = connection.onPostFling(
-                consumed = Velocity.Zero,
-                available = Velocity(3f, directionMultiplier * 5000f)
-            )
+            val consumed =
+                connection.onPostFling(
+                    consumed = Velocity.Zero,
+                    available = Velocity(3f, directionMultiplier * 5000f)
+                )
             assertThat(consumed.x).isEqualTo(0f)
             assertThat(abs(consumed.y)).isLessThan(5000f)
         }
@@ -299,9 +288,7 @@
         }
     }
 
-    /**
-     * Flinging toward an inset should hide it.
-     */
+    /** Flinging toward an inset should hide it. */
     @Test
     fun canFlingToHide() {
         if (!initializeDeviceWithInsetsShown()) {
@@ -311,22 +298,20 @@
         lateinit var coordinates: LayoutCoordinates
 
         rule.setContent {
-            connection =
-                rememberWindowInsetsConnection(windowInsets, insetSide)
-            Box(Modifier
-                .fillMaxSize()
-                .windowInsetsPadding(windowInsets)
-                .nestedScroll(connection)
-                .onPlaced { coordinates = it }
+            connection = rememberWindowInsetsConnection(windowInsets, insetSide)
+            Box(
+                Modifier.fillMaxSize()
+                    .windowInsetsPadding(windowInsets)
+                    .nestedScroll(connection)
+                    .onPlaced { coordinates = it }
             )
         }
 
         val sizeBefore = coordinates.size
 
         runBlockingOnUiThread {
-            val consumed = connection.onPreFling(
-                available = Velocity(3f, -directionMultiplier * 5000f)
-            )
+            val consumed =
+                connection.onPreFling(available = Velocity(3f, -directionMultiplier * 5000f))
             assertThat(consumed.x).isEqualTo(0f)
             assertThat(abs(consumed.y)).isLessThan(5000f)
         }
@@ -337,9 +322,7 @@
         }
     }
 
-    /**
-     * A small fling should use an animation to bounce back to hiding the inset
-     */
+    /** A small fling should use an animation to bounce back to hiding the inset */
     @Test
     fun smallFlingSpringsBackToHide() {
         if (!initializeDeviceWithInsetsHidden()) {
@@ -351,15 +334,10 @@
         var isVisible = false
 
         rule.setContent {
-            connection =
-                rememberWindowInsetsConnection(windowInsets, insetSide)
+            connection = rememberWindowInsetsConnection(windowInsets, insetSide)
             maxVisible = maxOf(maxVisible, windowInsets.value)
             isVisible = windowInsets.isVisible
-            Box(Modifier
-                .fillMaxSize()
-                .windowInsetsPadding(windowInsets)
-                .nestedScroll(connection)
-            )
+            Box(Modifier.fillMaxSize().windowInsetsPadding(windowInsets).nestedScroll(connection))
         }
 
         runBlockingOnUiThread {
@@ -370,14 +348,10 @@
             assertThat(maxVisible).isGreaterThan(0)
         }
 
-        rule.runOnIdle {
-            assertThat(isVisible).isFalse()
-        }
+        rule.runOnIdle { assertThat(isVisible).isFalse() }
     }
 
-    /**
-     * A small fling should use an animation to bounce back to showing the inset
-     */
+    /** A small fling should use an animation to bounce back to showing the inset */
     @Test
     fun smallFlingSpringsBackToShow() {
         if (!initializeDeviceWithInsetsShown()) {
@@ -389,15 +363,10 @@
         var isVisible = false
 
         rule.setContent {
-            connection =
-                rememberWindowInsetsConnection(windowInsets, insetSide)
+            connection = rememberWindowInsetsConnection(windowInsets, insetSide)
             minVisible = minOf(minVisible, windowInsets.value)
             isVisible = windowInsets.isVisible
-            Box(Modifier
-                .fillMaxSize()
-                .windowInsetsPadding(windowInsets)
-                .nestedScroll(connection)
-            )
+            Box(Modifier.fillMaxSize().windowInsetsPadding(windowInsets).nestedScroll(connection))
         }
 
         runBlockingOnUiThread {
@@ -408,14 +377,10 @@
             assertThat(minVisible).isLessThan(shownSize)
         }
 
-        rule.runOnIdle {
-            assertThat(isVisible).isTrue()
-        }
+        rule.runOnIdle { assertThat(isVisible).isTrue() }
     }
 
-    /**
-     * A fling past the middle should animate to fully showing the inset
-     */
+    /** A fling past the middle should animate to fully showing the inset */
     @Test
     fun flingPastMiddleSpringsToShow() {
         if (!initializeDeviceWithInsetsHidden()) {
@@ -427,15 +392,10 @@
         var insetsSize = 0
 
         rule.setContent {
-            connection =
-                rememberWindowInsetsConnection(windowInsets, insetSide)
+            connection = rememberWindowInsetsConnection(windowInsets, insetSide)
             isVisible = windowInsets.isVisible
             insetsSize = windowInsets.value
-            Box(Modifier
-                .fillMaxSize()
-                .windowInsetsPadding(windowInsets)
-                .nestedScroll(connection)
-            )
+            Box(Modifier.fillMaxSize().windowInsetsPadding(windowInsets).nestedScroll(connection))
         }
 
         // We don't know when the animation controller request will be fulfilled, so loop
@@ -471,9 +431,7 @@
             )
         }
 
-        rule.runOnIdle {
-            assertThat(isVisible).isTrue()
-        }
+        rule.runOnIdle { assertThat(isVisible).isTrue() }
     }
 
     /**
@@ -490,15 +448,10 @@
         var insetsSize = 0
 
         rule.setContent {
-            connection =
-                rememberWindowInsetsConnection(windowInsets, insetSide)
+            connection = rememberWindowInsetsConnection(windowInsets, insetSide)
             isVisible = windowInsets.isVisible
             insetsSize = windowInsets.value
-            Box(Modifier
-                .fillMaxSize()
-                .windowInsetsPadding(windowInsets)
-                .nestedScroll(connection)
-            )
+            Box(Modifier.fillMaxSize().windowInsetsPadding(windowInsets).nestedScroll(connection))
         }
 
         // We don't know when the animation controller request will be fulfilled, so loop
@@ -530,14 +483,10 @@
             )
         }
 
-        rule.runOnIdle {
-            assertThat(isVisible).isFalse()
-        }
+        rule.runOnIdle { assertThat(isVisible).isFalse() }
     }
 
-    /**
-     * The insets shouldn't get in the way of normal scrolling on the normal content.
-     */
+    /** The insets shouldn't get in the way of normal scrolling on the normal content. */
     @Test
     fun allowsContentScroll() {
         if (!initializeDeviceWithInsetsHidden()) {
@@ -548,31 +497,25 @@
         val lazyListState = LazyListState()
 
         rule.setContent {
-            connection =
-                rememberWindowInsetsConnection(windowInsets, insetSide)
+            connection = rememberWindowInsetsConnection(windowInsets, insetSide)
             val boxSize = with(LocalDensity.current) { 100.toDp() }
             LazyColumn(
                 reverseLayout = reverseLazyColumn,
                 state = lazyListState,
-                modifier = Modifier
-                .fillMaxSize()
-                .windowInsetsPadding(windowInsets)
-                .nestedScroll(connection)
-                .testTag(testTag)
-                .onPlaced { coordinates = it }
+                modifier =
+                    Modifier.fillMaxSize()
+                        .windowInsetsPadding(windowInsets)
+                        .nestedScroll(connection)
+                        .testTag(testTag)
+                        .onPlaced { coordinates = it }
             ) {
-                items(1000) {
-                    Box(Modifier.size(boxSize))
-                }
+                items(1000) { Box(Modifier.size(boxSize)) }
             }
         }
 
         val sizeBefore = coordinates.size
 
-        rule.onNodeWithTag(testTag)
-            .performTouchInput {
-                swipeTowardInset()
-            }
+        rule.onNodeWithTag(testTag).performTouchInput { swipeTowardInset() }
 
         rule.runOnIdle {
             assertThat(coordinates.size.height).isEqualTo(sizeBefore.height)
@@ -582,10 +525,7 @@
 
         val firstVisibleIndex = lazyListState.firstVisibleItemIndex
 
-        rule.onNodeWithTag(testTag)
-            .performTouchInput {
-                swipeAwayFromInset()
-            }
+        rule.onNodeWithTag(testTag).performTouchInput { swipeAwayFromInset() }
 
         rule.runOnIdle {
             assertThat(coordinates.size.height).isEqualTo(sizeBefore.height)
@@ -595,8 +535,8 @@
     }
 
     /**
-     * When flinging more than the inset, it should animate the insets closed and then fling
-     * the content.
+     * When flinging more than the inset, it should animate the insets closed and then fling the
+     * content.
      */
     @Test
     fun flingRemainderMovesContent() {
@@ -608,31 +548,25 @@
         val lazyListState = LazyListState()
 
         rule.setContent {
-            connection =
-                rememberWindowInsetsConnection(windowInsets, insetSide)
+            connection = rememberWindowInsetsConnection(windowInsets, insetSide)
             val boxSize = with(LocalDensity.current) { 100.toDp() }
             LazyColumn(
                 reverseLayout = reverseLazyColumn,
                 state = lazyListState,
-                modifier = Modifier
-                .fillMaxSize()
-                .windowInsetsPadding(windowInsets)
-                .nestedScroll(connection)
-                .testTag(testTag)
-                .onPlaced { coordinates = it }
+                modifier =
+                    Modifier.fillMaxSize()
+                        .windowInsetsPadding(windowInsets)
+                        .nestedScroll(connection)
+                        .testTag(testTag)
+                        .onPlaced { coordinates = it }
             ) {
-                items(1000) {
-                    Box(Modifier.size(boxSize))
-                }
+                items(1000) { Box(Modifier.size(boxSize)) }
             }
         }
 
         val sizeBefore = coordinates.size
 
-        rule.onNodeWithTag(testTag)
-            .performTouchInput {
-                swipeTowardInset()
-            }
+        rule.onNodeWithTag(testTag).performTouchInput { swipeTowardInset() }
 
         rule.runOnIdle {
             assertThat(coordinates.size.height).isGreaterThan(sizeBefore.height)
@@ -642,24 +576,23 @@
     }
 
     /**
-     * On some devices, the animation can begin and then end immediately without the value being
-     * set to the final state in onProgress().
+     * On some devices, the animation can begin and then end immediately without the value being set
+     * to the final state in onProgress().
      */
     @Test
     fun quickAnimation() {
         val view = rule.activity.window.decorView
         val imeType = android.view.WindowInsets.Type.ime()
 
-        rule.runOnUiThread {
-            view.windowInsetsController?.show(imeType)
-        }
+        rule.runOnUiThread { view.windowInsetsController?.show(imeType) }
 
-        val imeAvailable = rule.runOnIdle {
-            val windowInsets = view.rootWindowInsets
-            val insets = windowInsets.getInsets(imeType)
-            shownSize = insets.value
-            windowInsets.isVisible(imeType) && insets.value != 0
-        }
+        val imeAvailable =
+            rule.runOnIdle {
+                val windowInsets = view.rootWindowInsets
+                val insets = windowInsets.getInsets(imeType)
+                shownSize = insets.value
+                windowInsets.isVisible(imeType) && insets.value != 0
+            }
         if (!imeAvailable) {
             return // IME isn't available on this device
         }
@@ -671,7 +604,7 @@
             Column(Modifier.background(Color.White).wrapContentSize().imePadding()) {
                 BasicTextField(
                     "Hello World",
-                    { },
+                    {},
                     modifier = Modifier.focusRequester(focusRequester).testTag("textField")
                 )
                 if (showDialog) {
@@ -682,15 +615,11 @@
             }
         }
 
-        rule.runOnIdle {
-            focusRequester.requestFocus()
-        }
+        rule.runOnIdle { focusRequester.requestFocus() }
 
         rule.onNodeWithTag("textField").assertIsFocused()
 
-        rule.runOnIdle {
-            assertThat(imeBottom).isNotEqualTo(0)
-        }
+        rule.runOnIdle { assertThat(imeBottom).isNotEqualTo(0) }
 
         showDialog = true
 
@@ -703,9 +632,7 @@
     private fun initializeDeviceWithInsetsShown(): Boolean {
         val view = rule.activity.window.decorView
 
-        rule.runOnUiThread {
-            view.windowInsetsController?.show(insetType)
-        }
+        rule.runOnUiThread { view.windowInsetsController?.show(insetType) }
 
         return rule.runOnIdle {
             val windowInsets = view.rootWindowInsets
@@ -720,9 +647,7 @@
             return false
         }
         val view = rule.activity.window.decorView
-        rule.runOnUiThread {
-            view.windowInsetsController?.hide(insetType)
-        }
+        rule.runOnUiThread { view.windowInsetsController?.hide(insetType) }
         return rule.runOnUiThread {
             val windowInsets = view.rootWindowInsets
             !windowInsets.isVisible(insetType)
diff --git a/compose/foundation/foundation-layout/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/layout/WindowInsetsDeviceTest.kt b/compose/foundation/foundation-layout/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/layout/WindowInsetsDeviceTest.kt
index f5c86b7..cd3b254 100644
--- a/compose/foundation/foundation-layout/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/layout/WindowInsetsDeviceTest.kt
+++ b/compose/foundation/foundation-layout/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/layout/WindowInsetsDeviceTest.kt
@@ -64,31 +64,28 @@
 @MediumTest
 @RunWith(AndroidJUnit4::class)
 class WindowInsetsDeviceTest {
-    @get:Rule
-    val rule = createAndroidComposeRule<WindowInsetsActivity>()
+    @get:Rule val rule = createAndroidComposeRule<WindowInsetsActivity>()
     private lateinit var finishLatch: CountDownLatch
     private val finishLatchGetter
         get() = finishLatch
-    private val observer = object : DefaultLifecycleObserver {
-        override fun onDestroy(owner: LifecycleOwner) {
-            finishLatchGetter.countDown()
+
+    private val observer =
+        object : DefaultLifecycleObserver {
+            override fun onDestroy(owner: LifecycleOwner) {
+                finishLatchGetter.countDown()
+            }
         }
-    }
 
     @Before
     fun setup() {
         rule.activity.createdLatch.await(1, TimeUnit.SECONDS)
         finishLatch = CountDownLatch(1)
-        rule.runOnUiThread {
-            rule.activity.lifecycle.addObserver(observer)
-        }
+        rule.runOnUiThread { rule.activity.lifecycle.addObserver(observer) }
     }
 
     @After
     fun tearDown() {
-        rule.runOnUiThread {
-            rule.activity.finish()
-        }
+        rule.runOnUiThread { rule.activity.finish() }
         assertThat(finishLatch.await(1, TimeUnit.SECONDS)).isTrue()
     }
 
@@ -99,21 +96,18 @@
         var imeInset1 = 0
         var imeInset2 = 0
 
-        val connection = object : NestedScrollConnection { }
+        val connection = object : NestedScrollConnection {}
         val dispatcher = NestedScrollDispatcher()
 
         // broken out for line length
         val innerComposable: @Composable () -> Unit = {
             imeInset2 = WindowInsets.ime.getBottom(LocalDensity.current)
             Box(
-                Modifier
-                    .fillMaxSize()
+                Modifier.fillMaxSize()
                     .imePadding()
                     .imeNestedScroll()
                     .nestedScroll(connection, dispatcher)
-                    .background(
-                        Color.Cyan
-                    )
+                    .background(Color.Cyan)
             )
         }
 
@@ -164,9 +158,7 @@
                 Snapshot.sendApplyNotifications()
                 iteration++
             }
-            rule.runOnIdle {
-                imeInset1 > 0 && imeInset1 == imeInset2
-            }
+            rule.runOnIdle { imeInset1 > 0 && imeInset1 == imeInset2 }
         }
     }
 
@@ -193,7 +185,7 @@
                 val controller: WindowInsetsControllerCompat? =
                     WindowCompat.getInsetsController(window, view)
                 controller?.show(WindowInsetsCompat.Type.systemBars())
-                onDispose { }
+                onDispose {}
             }
             Box(Modifier.fillMaxSize()) {
                 if (useInsets) {
@@ -208,13 +200,9 @@
             }
         }
 
-        rule.runOnIdle {
-            useInsets = true
-        }
+        rule.runOnIdle { useInsets = true }
 
-        rule.runOnIdle {
-            assertThat(systemBarsInsets).isNotEqualTo(Insets.NONE)
-        }
+        rule.runOnIdle { assertThat(systemBarsInsets).isNotEqualTo(Insets.NONE) }
     }
 
     @Test
@@ -232,7 +220,7 @@
                 val controller: WindowInsetsControllerCompat? =
                     WindowCompat.getInsetsController(window, view)
                 controller?.hide(WindowInsetsCompat.Type.statusBars())
-                onDispose { }
+                onDispose {}
             }
             Box(Modifier.fillMaxSize()) {
                 if (useInsets) {
@@ -252,9 +240,7 @@
         rule.waitUntil(1000) { !hasStatusBarInsets }
 
         // disable watching the insets
-        rule.runOnIdle {
-            useInsets = false
-        }
+        rule.runOnIdle { useInsets = false }
 
         val statusBarsWatcher = StatusBarsShowListener()
 
@@ -265,23 +251,20 @@
                 statusBarsWatcher
             )
             @Suppress("RedundantNullableReturnType")
-            val controller: WindowInsetsControllerCompat? = WindowCompat.getInsetsController(
-                rule.activity.window,
-                rule.activity.window.decorView
-            )
+            val controller: WindowInsetsControllerCompat? =
+                WindowCompat.getInsetsController(
+                    rule.activity.window,
+                    rule.activity.window.decorView
+                )
             controller?.show(WindowInsetsCompat.Type.statusBars())
         }
 
         assertThat(statusBarsWatcher.latch.await(1, TimeUnit.SECONDS)).isTrue()
 
         // Now look at the insets
-        rule.runOnIdle {
-            useInsets = true
-        }
+        rule.runOnIdle { useInsets = true }
 
-        rule.runOnIdle {
-            assertThat(hasStatusBarInsets).isTrue()
-        }
+        rule.runOnIdle { assertThat(hasStatusBarInsets).isTrue() }
     }
 
     @Test
@@ -291,10 +274,11 @@
         // hide the insets
         rule.runOnUiThread {
             @Suppress("RedundantNullableReturnType")
-            val controller: WindowInsetsControllerCompat? = WindowCompat.getInsetsController(
-                rule.activity.window,
-                rule.activity.window.decorView
-            )
+            val controller: WindowInsetsControllerCompat? =
+                WindowCompat.getInsetsController(
+                    rule.activity.window,
+                    rule.activity.window.decorView
+                )
             controller?.hide(WindowInsetsCompat.Type.statusBars())
         }
 
@@ -318,9 +302,7 @@
         val composeView = contentView.children.first()
 
         // remove the view
-        rule.runOnUiThread {
-            contentView.removeView(composeView)
-        }
+        rule.runOnUiThread { contentView.removeView(composeView) }
 
         val statusBarsWatcher = StatusBarsShowListener()
 
@@ -331,26 +313,23 @@
                 statusBarsWatcher
             )
             @Suppress("RedundantNullableReturnType")
-            val controller: WindowInsetsControllerCompat? = WindowCompat.getInsetsController(
-                rule.activity.window,
-                rule.activity.window.decorView
-            )
+            val controller: WindowInsetsControllerCompat? =
+                WindowCompat.getInsetsController(
+                    rule.activity.window,
+                    rule.activity.window.decorView
+                )
             controller?.show(WindowInsetsCompat.Type.statusBars())
         }
 
         assertThat(statusBarsWatcher.latch.await(1, TimeUnit.SECONDS)).isTrue()
 
         // Now add the view back again
-        rule.runOnUiThread {
-            contentView.addView(composeView)
-        }
+        rule.runOnUiThread { contentView.addView(composeView) }
 
         rule.waitUntil(1000) { hasStatusBarInsets }
     }
 
-    /**
-     * If we have setDecorFitsSystemWindows(false), there should be insets.
-     */
+    /** If we have setDecorFitsSystemWindows(false), there should be insets. */
     @Test
     fun insetsSetAtStart() {
         rule.runOnUiThread {
@@ -372,9 +351,7 @@
         }
 
         rule.waitForIdle()
-        assertTrue(
-            leftInset != 0 || topInset != 0 || rightInset != 0 || bottomInset != 0
-        )
+        assertTrue(leftInset != 0 || topInset != 0 || rightInset != 0 || bottomInset != 0)
     }
 
     class StatusBarsShowListener : OnApplyWindowInsetsListener {
diff --git a/compose/foundation/foundation-layout/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/layout/WindowInsetsIgnoringVisibilityTest.kt b/compose/foundation/foundation-layout/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/layout/WindowInsetsIgnoringVisibilityTest.kt
index 2c9d35b..c3c0732 100644
--- a/compose/foundation/foundation-layout/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/layout/WindowInsetsIgnoringVisibilityTest.kt
+++ b/compose/foundation/foundation-layout/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/layout/WindowInsetsIgnoringVisibilityTest.kt
@@ -42,8 +42,7 @@
 @RunWith(AndroidJUnit4::class)
 @SdkSuppress(minSdkVersion = Build.VERSION_CODES.R)
 class WindowInsetsIgnoringVisibilityTest {
-    @get:Rule
-    val rule = createAndroidComposeRule<WindowInsetsActivity>()
+    @get:Rule val rule = createAndroidComposeRule<WindowInsetsActivity>()
 
     private lateinit var insetsView: InsetsView
 
@@ -55,9 +54,7 @@
     @After
     fun teardown() {
         WindowInsetsHolder.setUseTestInsets(false)
-        rule.runOnUiThread {
-            rule.activity.finish()
-        }
+        rule.runOnUiThread { rule.activity.finish() }
     }
 
     @Test
@@ -70,15 +67,11 @@
             isVisible = WindowInsets.isCaptionBarVisible
         }
 
-        rule.runOnIdle {
-            assertThat(isVisible).isTrue()
-        }
+        rule.runOnIdle { assertThat(isVisible).isTrue() }
 
         dispatchApplyWindowInsets(createInsets(type, insets, false))
 
-        rule.runOnIdle {
-            assertThat(isVisible).isFalse()
-        }
+        rule.runOnIdle { assertThat(isVisible).isFalse() }
     }
 
     @Test
@@ -87,19 +80,13 @@
         val type = WindowInsetsCompat.Type.ime()
         var isVisible = false
 
-        setContent(createInsets(type, insets, true)) {
-            isVisible = WindowInsets.isImeVisible
-        }
+        setContent(createInsets(type, insets, true)) { isVisible = WindowInsets.isImeVisible }
 
-        rule.runOnIdle {
-            assertThat(isVisible).isTrue()
-        }
+        rule.runOnIdle { assertThat(isVisible).isTrue() }
 
         dispatchApplyWindowInsets(createInsets(type, insets, false))
 
-        rule.runOnIdle {
-            assertThat(isVisible).isFalse()
-        }
+        rule.runOnIdle { assertThat(isVisible).isFalse() }
     }
 
     @Test
@@ -112,15 +99,11 @@
             isVisible = WindowInsets.areStatusBarsVisible
         }
 
-        rule.runOnIdle {
-            assertThat(isVisible).isTrue()
-        }
+        rule.runOnIdle { assertThat(isVisible).isTrue() }
 
         dispatchApplyWindowInsets(createInsets(type, insets, false))
 
-        rule.runOnIdle {
-            assertThat(isVisible).isFalse()
-        }
+        rule.runOnIdle { assertThat(isVisible).isFalse() }
     }
 
     @Test
@@ -133,15 +116,11 @@
             isVisible = WindowInsets.areNavigationBarsVisible
         }
 
-        rule.runOnIdle {
-            assertThat(isVisible).isTrue()
-        }
+        rule.runOnIdle { assertThat(isVisible).isTrue() }
 
         dispatchApplyWindowInsets(createInsets(type, insets, false))
 
-        rule.runOnIdle {
-            assertThat(isVisible).isFalse()
-        }
+        rule.runOnIdle { assertThat(isVisible).isFalse() }
     }
 
     @Test
@@ -154,15 +133,11 @@
             isVisible = WindowInsets.areSystemBarsVisible
         }
 
-        rule.runOnIdle {
-            assertThat(isVisible).isTrue()
-        }
+        rule.runOnIdle { assertThat(isVisible).isTrue() }
 
         dispatchApplyWindowInsets(createInsets(type, insets, false))
 
-        rule.runOnIdle {
-            assertThat(isVisible).isFalse()
-        }
+        rule.runOnIdle { assertThat(isVisible).isFalse() }
     }
 
     @Test
@@ -175,21 +150,18 @@
             isVisible = WindowInsets.isTappableElementVisible
         }
 
-        rule.runOnIdle {
-            assertThat(isVisible).isTrue()
-        }
+        rule.runOnIdle { assertThat(isVisible).isTrue() }
 
         dispatchApplyWindowInsets(createInsets(type, insets, false))
 
-        rule.runOnIdle {
-            assertThat(isVisible).isFalse()
-        }
+        rule.runOnIdle { assertThat(isVisible).isFalse() }
     }
 
     private fun createInsets(type: Int, insets: Insets, isVisible: Boolean): WindowInsetsCompat {
-        val builder = WindowInsetsCompat.Builder()
-            .setInsets(type, if (isVisible) insets else Insets.of(0, 0, 0, 0))
-            .setVisible(type, isVisible)
+        val builder =
+            WindowInsetsCompat.Builder()
+                .setInsets(type, if (isVisible) insets else Insets.of(0, 0, 0, 0))
+                .setVisible(type, isVisible)
         if (type != WindowInsetsCompat.Type.ime()) {
             builder.setInsetsIgnoringVisibility(type, insets)
         }
@@ -206,15 +178,11 @@
             ignoringVisibility = WindowInsets.captionBarIgnoringVisibility
         }
 
-        rule.runOnIdle {
-            ignoringVisibility.assertSameAs(10, 11, 12, 13)
-        }
+        rule.runOnIdle { ignoringVisibility.assertSameAs(10, 11, 12, 13) }
 
         dispatchApplyWindowInsets(createInsets(type, insets, false))
 
-        rule.runOnIdle {
-            ignoringVisibility.assertSameAs(10, 11, 12, 13)
-        }
+        rule.runOnIdle { ignoringVisibility.assertSameAs(10, 11, 12, 13) }
     }
 
     @Test
@@ -227,15 +195,11 @@
             ignoringVisibility = WindowInsets.navigationBarsIgnoringVisibility
         }
 
-        rule.runOnIdle {
-            ignoringVisibility.assertSameAs(10, 11, 12, 13)
-        }
+        rule.runOnIdle { ignoringVisibility.assertSameAs(10, 11, 12, 13) }
 
         dispatchApplyWindowInsets(createInsets(type, insets, false))
 
-        rule.runOnIdle {
-            ignoringVisibility.assertSameAs(10, 11, 12, 13)
-        }
+        rule.runOnIdle { ignoringVisibility.assertSameAs(10, 11, 12, 13) }
     }
 
     @Test
@@ -248,15 +212,11 @@
             ignoringVisibility = WindowInsets.statusBarsIgnoringVisibility
         }
 
-        rule.runOnIdle {
-            ignoringVisibility.assertSameAs(10, 11, 12, 13)
-        }
+        rule.runOnIdle { ignoringVisibility.assertSameAs(10, 11, 12, 13) }
 
         dispatchApplyWindowInsets(createInsets(type, insets, false))
 
-        rule.runOnIdle {
-            ignoringVisibility.assertSameAs(10, 11, 12, 13)
-        }
+        rule.runOnIdle { ignoringVisibility.assertSameAs(10, 11, 12, 13) }
     }
 
     @Test
@@ -269,15 +229,11 @@
             ignoringVisibility = WindowInsets.systemBarsIgnoringVisibility
         }
 
-        rule.runOnIdle {
-            ignoringVisibility.assertSameAs(10, 11, 12, 13)
-        }
+        rule.runOnIdle { ignoringVisibility.assertSameAs(10, 11, 12, 13) }
 
         dispatchApplyWindowInsets(createInsets(type, insets, false))
 
-        rule.runOnIdle {
-            ignoringVisibility.assertSameAs(10, 11, 12, 13)
-        }
+        rule.runOnIdle { ignoringVisibility.assertSameAs(10, 11, 12, 13) }
     }
 
     @Test
@@ -290,15 +246,11 @@
             ignoringVisibility = WindowInsets.tappableElementIgnoringVisibility
         }
 
-        rule.runOnIdle {
-            ignoringVisibility.assertSameAs(10, 11, 12, 13)
-        }
+        rule.runOnIdle { ignoringVisibility.assertSameAs(10, 11, 12, 13) }
 
         dispatchApplyWindowInsets(createInsets(type, insets, false))
 
-        rule.runOnIdle {
-            ignoringVisibility.assertSameAs(10, 11, 12, 13)
-        }
+        rule.runOnIdle { ignoringVisibility.assertSameAs(10, 11, 12, 13) }
     }
 
     fun WindowInsets.assertSameAs(left: Int, top: Int, right: Int, bottom: Int) {
@@ -325,22 +277,24 @@
         content: @Composable () -> Unit
     ) {
         rule.setContent {
-            AndroidView(factory = { context ->
-                val view = InsetsView(context).also {
-                    it.myInsets = initialInsets?.toWindowInsets()
-                }
-                insetsView = view
-                val composeView = ComposeView(rule.activity)
-                view.addView(
-                    composeView,
-                    ViewGroup.LayoutParams(
-                        ViewGroup.LayoutParams.MATCH_PARENT,
-                        ViewGroup.LayoutParams.MATCH_PARENT
+            AndroidView(
+                factory = { context ->
+                    val view =
+                        InsetsView(context).also { it.myInsets = initialInsets?.toWindowInsets() }
+                    insetsView = view
+                    val composeView = ComposeView(rule.activity)
+                    view.addView(
+                        composeView,
+                        ViewGroup.LayoutParams(
+                            ViewGroup.LayoutParams.MATCH_PARENT,
+                            ViewGroup.LayoutParams.MATCH_PARENT
+                        )
                     )
-                )
-                composeView.setContent(content)
-                view
-            }, modifier = Modifier.fillMaxSize())
+                    composeView.setContent(content)
+                    view
+                },
+                modifier = Modifier.fillMaxSize()
+            )
         }
     }
 }
diff --git a/compose/foundation/foundation-layout/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/layout/WindowInsetsPaddingTest.kt b/compose/foundation/foundation-layout/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/layout/WindowInsetsPaddingTest.kt
index c72c7d7..ffc24e7 100644
--- a/compose/foundation/foundation-layout/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/layout/WindowInsetsPaddingTest.kt
+++ b/compose/foundation/foundation-layout/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/layout/WindowInsetsPaddingTest.kt
@@ -72,56 +72,46 @@
 @MediumTest
 @RunWith(AndroidJUnit4::class)
 class WindowInsetsPaddingTest {
-    @get:Rule
-    val rule = createAndroidComposeRule<ComponentActivity>()
+    @get:Rule val rule = createAndroidComposeRule<ComponentActivity>()
 
     private lateinit var insetsView: InsetsView
 
     private lateinit var finishLatch: CountDownLatch
     private val finishLatchGetter
         get() = finishLatch
-    private val observer = object : DefaultLifecycleObserver {
-        override fun onDestroy(owner: LifecycleOwner) {
-            finishLatchGetter.countDown()
+
+    private val observer =
+        object : DefaultLifecycleObserver {
+            override fun onDestroy(owner: LifecycleOwner) {
+                finishLatchGetter.countDown()
+            }
         }
-    }
 
     @Before
     fun setup() {
         WindowInsetsHolder.setUseTestInsets(true)
         finishLatch = CountDownLatch(1)
-        rule.runOnUiThread {
-            rule.activity.lifecycle.addObserver(observer)
-        }
+        rule.runOnUiThread { rule.activity.lifecycle.addObserver(observer) }
     }
 
     @After
     fun teardown() {
         WindowInsetsHolder.setUseTestInsets(false)
-        rule.runOnUiThread {
-            rule.activity.finish()
-        }
+        rule.runOnUiThread { rule.activity.finish() }
         assertThat(finishLatch.await(1, TimeUnit.SECONDS)).isTrue()
     }
 
     @Test
     fun systemBarsPadding() {
-        testInsetsPadding(
-            WindowInsetsCompat.Type.systemBars(),
-            Modifier.systemBarsPadding()
-        )
+        testInsetsPadding(WindowInsetsCompat.Type.systemBars(), Modifier.systemBarsPadding())
     }
 
     @SdkSuppress(minSdkVersion = Build.VERSION_CODES.Q)
     @Test
     fun displayCutoutPadding() {
-        val coordinates = setInsetContent {
-            Modifier.displayCutoutPadding()
-        }
+        val coordinates = setInsetContent { Modifier.displayCutoutPadding() }
 
-        val (width, height) = rule.runOnIdle {
-            coordinates.boundsInRoot().bottomRight.round()
-        }
+        val (width, height) = rule.runOnIdle { coordinates.boundsInRoot().bottomRight.round() }
 
         val insets = sendDisplayCutoutInsets(width, height)
         insets.assertIsConsumed(WindowInsetsCompat.Type.displayCutout())
@@ -141,30 +131,30 @@
         val right = AndroidRect(width - 12, centerHeight, width, centerHeight + 2)
         val bottom = AndroidRect(centerWidth, height - 13, centerWidth + 2, height)
         val safeInsets = AndroidXInsets.of(10, 11, 12, 13)
-        val windowInsets = WindowInsetsCompat.Builder()
-            .setInsets(WindowInsetsCompat.Type.statusBars(), AndroidXInsets.of(0, 11, 0, 0))
-            .setInsets(WindowInsetsCompat.Type.displayCutout(), safeInsets)
-            .setDisplayCutout(
-                DisplayCutoutCompat(
-                    safeInsets,
-                    left,
-                    top,
-                    right,
-                    bottom,
-                    AndroidXInsets.of(1, 2, 3, 4)
+        val windowInsets =
+            WindowInsetsCompat.Builder()
+                .setInsets(WindowInsetsCompat.Type.statusBars(), AndroidXInsets.of(0, 11, 0, 0))
+                .setInsets(WindowInsetsCompat.Type.displayCutout(), safeInsets)
+                .setDisplayCutout(
+                    DisplayCutoutCompat(
+                        safeInsets,
+                        left,
+                        top,
+                        right,
+                        bottom,
+                        AndroidXInsets.of(1, 2, 3, 4)
+                    )
                 )
-            )
-            .build()
+                .build()
         return dispatchApplyWindowInsets(windowInsets)
     }
 
     @SdkSuppress(maxSdkVersion = Build.VERSION_CODES.Q)
     @Test
     fun statusBarsPaddingApi21() {
-        testInsetsPadding(
-            WindowInsetsCompat.Type.statusBars(),
-            Modifier.statusBarsPadding()
-        ) { width, height ->
+        testInsetsPadding(WindowInsetsCompat.Type.statusBars(), Modifier.statusBarsPadding()) {
+            width,
+            height ->
             Rect(0f, 11f, width.toFloat(), height.toFloat())
         }
     }
@@ -172,19 +162,13 @@
     @SdkSuppress(minSdkVersion = Build.VERSION_CODES.R)
     @Test
     fun statusBarsPaddingApi30() {
-        testInsetsPadding(
-            WindowInsetsCompat.Type.statusBars(),
-            Modifier.statusBarsPadding()
-        )
+        testInsetsPadding(WindowInsetsCompat.Type.statusBars(), Modifier.statusBarsPadding())
     }
 
     @SdkSuppress(minSdkVersion = Build.VERSION_CODES.R)
     @Test
     fun captionBarPadding() {
-        testInsetsPadding(
-            WindowInsetsCompat.Type.captionBar(),
-            Modifier.captionBarPadding()
-        )
+        testInsetsPadding(WindowInsetsCompat.Type.captionBar(), Modifier.captionBarPadding())
     }
 
     @Test
@@ -225,33 +209,40 @@
 
     @SdkSuppress(minSdkVersion = Build.VERSION_CODES.R)
     @Test
-    fun insetsPaddingIme() = testInsetsPadding(WindowInsetsCompat.Type.ime()) {
-        Modifier.windowInsetsPadding(WindowInsets.ime)
-    }
+    fun insetsPaddingIme() =
+        testInsetsPadding(WindowInsetsCompat.Type.ime()) {
+            Modifier.windowInsetsPadding(WindowInsets.ime)
+        }
 
     @SdkSuppress(minSdkVersion = Build.VERSION_CODES.R)
     @Test
-    fun insetsPaddingDisplayCutout() = testInsetsPadding(WindowInsetsCompat.Type.displayCutout()) {
-        Modifier.windowInsetsPadding(WindowInsets.displayCutout)
-    }
+    fun insetsPaddingDisplayCutout() =
+        testInsetsPadding(WindowInsetsCompat.Type.displayCutout()) {
+            Modifier.windowInsetsPadding(WindowInsets.displayCutout)
+        }
 
     @Test
-    fun insetsPaddingStatusBarsTop() = testInsetsPadding(
-        WindowInsetsCompat.Type.statusBars(),
-        sentInsets = AndroidXInsets.of(0, 10, 0, 0),
-        expected = { w, h -> Rect(0f, 10f, w.toFloat(), h.toFloat()) }
-    ) { Modifier.windowInsetsPadding(WindowInsets.statusBars) }
+    fun insetsPaddingStatusBarsTop() =
+        testInsetsPadding(
+            WindowInsetsCompat.Type.statusBars(),
+            sentInsets = AndroidXInsets.of(0, 10, 0, 0),
+            expected = { w, h -> Rect(0f, 10f, w.toFloat(), h.toFloat()) }
+        ) {
+            Modifier.windowInsetsPadding(WindowInsets.statusBars)
+        }
 
     @SdkSuppress(minSdkVersion = Build.VERSION_CODES.R)
     @Test
-    fun insetsPaddingStatusBarsApi30() = testInsetsPadding(WindowInsetsCompat.Type.statusBars()) {
-        Modifier.windowInsetsPadding(WindowInsets.statusBars)
-    }
+    fun insetsPaddingStatusBarsApi30() =
+        testInsetsPadding(WindowInsetsCompat.Type.statusBars()) {
+            Modifier.windowInsetsPadding(WindowInsets.statusBars)
+        }
 
     @Test
-    fun insetsPaddingSystemBars() = testInsetsPadding(WindowInsetsCompat.Type.systemBars()) {
-        Modifier.windowInsetsPadding(WindowInsets.systemBars)
-    }
+    fun insetsPaddingSystemBars() =
+        testInsetsPadding(WindowInsetsCompat.Type.systemBars()) {
+            Modifier.windowInsetsPadding(WindowInsets.systemBars)
+        }
 
     @SdkSuppress(minSdkVersion = Build.VERSION_CODES.Q)
     @Test
@@ -262,9 +253,10 @@
 
     @SdkSuppress(minSdkVersion = Build.VERSION_CODES.R)
     @Test
-    fun insetsPaddingCaptionBar() = testInsetsPadding(WindowInsetsCompat.Type.captionBar()) {
-        Modifier.windowInsetsPadding(WindowInsets.captionBar)
-    }
+    fun insetsPaddingCaptionBar() =
+        testInsetsPadding(WindowInsetsCompat.Type.captionBar()) {
+            Modifier.windowInsetsPadding(WindowInsets.captionBar)
+        }
 
     @SdkSuppress(minSdkVersion = Build.VERSION_CODES.Q)
     @Test
@@ -313,13 +305,9 @@
     @SdkSuppress(minSdkVersion = Build.VERSION_CODES.R)
     @Test
     fun insetsPaddingWaterfall() {
-        val coordinates = setInsetContent {
-            Modifier.windowInsetsPadding(WindowInsets.waterfall)
-        }
+        val coordinates = setInsetContent { Modifier.windowInsetsPadding(WindowInsets.waterfall) }
 
-        val (width, height) = rule.runOnIdle {
-            coordinates.boundsInRoot().bottomRight.round()
-        }
+        val (width, height) = rule.runOnIdle { coordinates.boundsInRoot().bottomRight.round() }
 
         val insets = sendDisplayCutoutInsets(width, height)
         insets.assertIsConsumed(WindowInsetsCompat.Type.displayCutout())
@@ -346,11 +334,12 @@
             Modifier.windowInsetsPadding(insets)
         }
 
-        val insets = WindowInsetsCompat.Builder()
-            .setInsets(WindowInsetsCompat.Type.navigationBars(), AndroidXInsets.of(0, 0, 0, 15))
-            .setInsets(WindowInsetsCompat.Type.statusBars(), AndroidXInsets.of(0, 10, 0, 0))
-            .setInsets(WindowInsetsCompat.Type.ime(), AndroidXInsets.of(0, 0, 0, 5))
-            .build()
+        val insets =
+            WindowInsetsCompat.Builder()
+                .setInsets(WindowInsetsCompat.Type.navigationBars(), AndroidXInsets.of(0, 0, 0, 15))
+                .setInsets(WindowInsetsCompat.Type.statusBars(), AndroidXInsets.of(0, 10, 0, 0))
+                .setInsets(WindowInsetsCompat.Type.ime(), AndroidXInsets.of(0, 0, 0, 5))
+                .build()
 
         dispatchApplyWindowInsets(insets)
 
@@ -372,28 +361,22 @@
                     DeviceConfigurationOverride.LayoutDirection(LayoutDirection.Ltr)
                 ) {
                     Box(
-                        Modifier
-                            .fillMaxSize()
+                        Modifier.fillMaxSize()
                             .padding(5.toDp(), 4.toDp(), 3.toDp(), 2.toDp())
                             .consumeWindowInsets(WindowInsets(5, 4, 3, 2))
                     ) {
-                        Box(
-                            Modifier
-                                .fillMaxSize()
-                                .systemBarsPadding()) {
-                            Box(
-                                Modifier
-                                    .fillMaxSize()
-                                    .onGloballyPositioned { coordinates = it })
+                        Box(Modifier.fillMaxSize().systemBarsPadding()) {
+                            Box(Modifier.fillMaxSize().onGloballyPositioned { coordinates = it })
                         }
                     }
                 }
             }
         }
 
-        val insets = WindowInsetsCompat.Builder()
-            .setInsets(WindowInsetsCompat.Type.systemBars(), AndroidXInsets.of(10, 11, 12, 13))
-            .build()
+        val insets =
+            WindowInsetsCompat.Builder()
+                .setInsets(WindowInsetsCompat.Type.systemBars(), AndroidXInsets.of(10, 11, 12, 13))
+                .build()
 
         dispatchApplyWindowInsets(insets)
 
@@ -415,10 +398,7 @@
             ) {
                 Box(Modifier.statusBarsPadding()) {
                     Box(Modifier.systemBarsPadding()) {
-                        Box(
-                            Modifier
-                                .fillMaxSize()
-                                .onGloballyPositioned { coordinates = it })
+                        Box(Modifier.fillMaxSize().onGloballyPositioned { coordinates = it })
                     }
                 }
             }
@@ -427,10 +407,11 @@
         // wait for layout
         rule.waitForIdle()
 
-        val insets = WindowInsetsCompat.Builder()
-            .setInsets(WindowInsetsCompat.Type.statusBars(), AndroidXInsets.of(0, 5, 0, 0))
-            .setInsets(WindowInsetsCompat.Type.systemBars(), AndroidXInsets.of(10, 11, 12, 13))
-            .build()
+        val insets =
+            WindowInsetsCompat.Builder()
+                .setInsets(WindowInsetsCompat.Type.statusBars(), AndroidXInsets.of(0, 5, 0, 0))
+                .setInsets(WindowInsetsCompat.Type.systemBars(), AndroidXInsets.of(10, 11, 12, 13))
+                .build()
 
         dispatchApplyWindowInsets(insets)
 
@@ -453,11 +434,10 @@
                 Box(consumingModifier) {
                     val density = LocalDensity.current
                     Box(
-                        Modifier
-                            .fillMaxSize()
-                            .onConsumedWindowInsetsChanged {
-                                top = it.getTop(density)
-                            })
+                        Modifier.fillMaxSize().onConsumedWindowInsetsChanged {
+                            top = it.getTop(density)
+                        }
+                    )
                 }
             }
         }
@@ -467,9 +447,10 @@
 
         assertThat(top).isEqualTo(0)
 
-        val insets = WindowInsetsCompat.Builder()
-            .setInsets(WindowInsetsCompat.Type.statusBars(), AndroidXInsets.of(0, 5, 0, 0))
-            .build()
+        val insets =
+            WindowInsetsCompat.Builder()
+                .setInsets(WindowInsetsCompat.Type.statusBars(), AndroidXInsets.of(0, 5, 0, 0))
+                .build()
 
         dispatchApplyWindowInsets(insets)
 
@@ -531,16 +512,12 @@
             )
         }
 
-        rule.runOnIdle {
-            useStatusBarInsets = false
-        }
+        rule.runOnIdle { useStatusBarInsets = false }
 
         sendInsets(WindowInsetsCompat.Type.systemBars())
             .assertIsConsumed(WindowInsetsCompat.Type.systemBars())
 
-        rule.runOnIdle {
-            useNavigationBarInsets = false
-        }
+        rule.runOnIdle { useNavigationBarInsets = false }
 
         sendInsets(WindowInsetsCompat.Type.systemBars())
             .assertIsNotConsumed(WindowInsetsCompat.Type.systemBars())
@@ -557,10 +534,7 @@
     @Test
     fun animateImeInsets() {
         with(Api30Methods(rule)) {
-            val coordinates = setInsetContent {
-                Modifier
-                    .systemBarsPadding()
-                    .imePadding() }
+            val coordinates = setInsetContent { Modifier.systemBarsPadding().imePadding() }
 
             sendInsets(WindowInsetsCompat.Type.systemBars())
 
@@ -611,14 +585,8 @@
 
         setContent {
             val padding = WindowInsets.systemBars.asPaddingValues()
-            Box(
-                Modifier
-                    .fillMaxSize()
-                    .padding(padding)) {
-                Box(
-                    Modifier
-                        .fillMaxSize()
-                        .onGloballyPositioned { coordinates = it })
+            Box(Modifier.fillMaxSize().padding(padding)) {
+                Box(Modifier.fillMaxSize().onGloballyPositioned { coordinates = it })
             }
         }
 
@@ -646,31 +614,22 @@
         lateinit var ime: LayoutCoordinates
         setContent {
             Box(
-                Modifier
-                    .fillMaxSize()
-                    .statusBarsPadding()
-                    .onGloballyPositioned { statusBar = it }
+                Modifier.fillMaxSize().statusBarsPadding().onGloballyPositioned { statusBar = it }
             ) {
-                Box(
-                    Modifier
-                        .navigationBarsPadding()
-                        .onGloballyPositioned { navigationBar = it }) {
-                    Box(
-                        Modifier
-                            .imePadding()
-                            .fillMaxSize()
-                            .onGloballyPositioned { ime = it })
+                Box(Modifier.navigationBarsPadding().onGloballyPositioned { navigationBar = it }) {
+                    Box(Modifier.imePadding().fillMaxSize().onGloballyPositioned { ime = it })
                 }
             }
         }
         // wait for layout
         rule.waitForIdle()
 
-        val insets = WindowInsetsCompat.Builder()
-            .setInsets(WindowInsetsCompat.Type.statusBars(), AndroidXInsets.of(0, 10, 0, 0))
-            .setInsets(WindowInsetsCompat.Type.navigationBars(), AndroidXInsets.of(0, 0, 0, 11))
-            .setInsets(WindowInsetsCompat.Type.ime(), AndroidXInsets.of(0, 10, 0, 20))
-            .build()
+        val insets =
+            WindowInsetsCompat.Builder()
+                .setInsets(WindowInsetsCompat.Type.statusBars(), AndroidXInsets.of(0, 10, 0, 0))
+                .setInsets(WindowInsetsCompat.Type.navigationBars(), AndroidXInsets.of(0, 0, 0, 11))
+                .setInsets(WindowInsetsCompat.Type.ime(), AndroidXInsets.of(0, 10, 0, 20))
+                .build()
 
         dispatchApplyWindowInsets(insets)
 
@@ -692,21 +651,18 @@
         setContent {
             with(LocalDensity.current) {
                 Box(
-                    Modifier
-                        .fillMaxSize()
+                    Modifier.fillMaxSize()
                         .consumeWindowInsets(PaddingValues(top = 1.toDp()))
                         .windowInsetsPadding(WindowInsets(top = 10))
                         .onGloballyPositioned { outer = it }
                 ) {
                     Box(
-                        Modifier
-                            .consumeWindowInsets(PaddingValues(top = 1.toDp()))
+                        Modifier.consumeWindowInsets(PaddingValues(top = 1.toDp()))
                             .windowInsetsPadding(WindowInsets(top = 20))
                             .onGloballyPositioned { middle = it }
                     ) {
                         Box(
-                            Modifier
-                                .consumeWindowInsets(PaddingValues(top = 1.toDp()))
+                            Modifier.consumeWindowInsets(PaddingValues(top = 1.toDp()))
                                 .windowInsetsPadding(WindowInsets(top = 30))
                                 .fillMaxSize()
                                 .onGloballyPositioned { inner = it }
@@ -718,9 +674,10 @@
         // wait for layout
         rule.waitForIdle()
 
-        val insets = WindowInsetsCompat.Builder()
-            .setInsets(WindowInsetsCompat.Type.statusBars(), AndroidXInsets.of(0, 35, 0, 0))
-            .build()
+        val insets =
+            WindowInsetsCompat.Builder()
+                .setInsets(WindowInsetsCompat.Type.statusBars(), AndroidXInsets.of(0, 35, 0, 0))
+                .build()
 
         dispatchApplyWindowInsets(insets)
 
@@ -740,21 +697,18 @@
         lateinit var inner: LayoutCoordinates
         setContent {
             Box(
-                Modifier
-                    .fillMaxSize()
+                Modifier.fillMaxSize()
                     .consumeWindowInsets(WindowInsets(top = 1))
                     .windowInsetsPadding(WindowInsets(top = 10))
                     .onGloballyPositioned { outer = it }
             ) {
                 Box(
-                    Modifier
-                        .consumeWindowInsets(WindowInsets(top = 10))
+                    Modifier.consumeWindowInsets(WindowInsets(top = 10))
                         .windowInsetsPadding(WindowInsets(top = 20))
                         .onGloballyPositioned { middle = it }
                 ) {
                     Box(
-                        Modifier
-                            .consumeWindowInsets(WindowInsets(top = 20))
+                        Modifier.consumeWindowInsets(WindowInsets(top = 20))
                             .windowInsetsPadding(WindowInsets(top = 30))
                             .fillMaxSize()
                             .onGloballyPositioned { inner = it }
@@ -765,9 +719,10 @@
         // wait for layout
         rule.waitForIdle()
 
-        val insets = WindowInsetsCompat.Builder()
-            .setInsets(WindowInsetsCompat.Type.statusBars(), AndroidXInsets.of(0, 35, 0, 0))
-            .build()
+        val insets =
+            WindowInsetsCompat.Builder()
+                .setInsets(WindowInsetsCompat.Type.statusBars(), AndroidXInsets.of(0, 35, 0, 0))
+                .build()
 
         dispatchApplyWindowInsets(insets)
 
@@ -787,16 +742,16 @@
 
         setContent {
             Box(Modifier.fillMaxSize()) {
-                val modifier = if (useMiddleInsets) {
-                    Modifier.consumeWindowInsets(WindowInsets(top = 1))
-                } else {
-                    Modifier.consumeWindowInsets(WindowInsets(top = 2))
-                }
+                val modifier =
+                    if (useMiddleInsets) {
+                        Modifier.consumeWindowInsets(WindowInsets(top = 1))
+                    } else {
+                        Modifier.consumeWindowInsets(WindowInsets(top = 2))
+                    }
                 with(LocalDensity.current) {
                     Box(modifier.size(50.toDp())) {
                         Box(
-                            Modifier
-                                .windowInsetsPadding(WindowInsets(top = 10))
+                            Modifier.windowInsetsPadding(WindowInsets(top = 10))
                                 .fillMaxSize()
                                 .onGloballyPositioned { coordinates = it }
                         )
@@ -815,25 +770,20 @@
             useMiddleInsets = false
         }
 
-        rule.runOnIdle {
-            assertThat(coordinates.size.height).isEqualTo(42)
-        }
+        rule.runOnIdle { assertThat(coordinates.size.height).isEqualTo(42) }
     }
 
     @Test
     fun disableConsuming() {
         setContent {
-            AndroidView(factory = { context ->
-                ComposeView(context).also {
-                    it.consumeWindowInsets = false
-                    it.setContent {
-                        Box(
-                            Modifier
-                                .fillMaxSize()
-                                .statusBarsPadding())
+            AndroidView(
+                factory = { context ->
+                    ComposeView(context).also {
+                        it.consumeWindowInsets = false
+                        it.setContent { Box(Modifier.fillMaxSize().statusBarsPadding()) }
                     }
                 }
-            })
+            )
         }
 
         // wait for layout
@@ -844,9 +794,7 @@
         assertThat(remaining.getInsets(WindowInsetsCompat.Type.statusBars()).top).isEqualTo(20)
     }
 
-    /**
-     * If we don't have setDecorFitsSystemWindows(false), there shouldn't be any insets
-     */
+    /** If we don't have setDecorFitsSystemWindows(false), there shouldn't be any insets */
     @Test
     fun noInsets() {
         var leftInset = -1
@@ -876,16 +824,8 @@
         setContent {
             with(LocalDensity.current) {
                 val modifier = Modifier.consumeWindowInsets(PaddingValues(10.toDp()))
-                Box(
-                    modifier
-                        .fillMaxSize()
-                        .onConsumedWindowInsetsChanged { consumed1 = it }
-                ) {
-                    Box(
-                        modifier
-                            .fillMaxSize()
-                            .onConsumedWindowInsetsChanged { consumed2 = it }
-                    )
+                Box(modifier.fillMaxSize().onConsumedWindowInsetsChanged { consumed1 = it }) {
+                    Box(modifier.fillMaxSize().onConsumedWindowInsetsChanged { consumed2 = it })
                 }
             }
         }
@@ -902,9 +842,7 @@
         type: Int,
         sentInsets: AndroidXInsets = AndroidXInsets.of(10, 11, 12, 13)
     ): WindowInsetsCompat {
-        val insets = WindowInsetsCompat.Builder()
-            .setInsets(type, sentInsets)
-            .build()
+        val insets = WindowInsetsCompat.Builder().setInsets(type, sentInsets).build()
         return dispatchApplyWindowInsets(insets)
     }
 
@@ -918,23 +856,12 @@
         }
     }
 
-    private fun setInsetContent(
-        insetsModifier: @Composable () -> Modifier
-    ): LayoutCoordinates {
+    private fun setInsetContent(insetsModifier: @Composable () -> Modifier): LayoutCoordinates {
         lateinit var coordinates: LayoutCoordinates
 
         setContent {
-            Box(
-                Modifier
-                    .fillMaxSize()
-                    .background(Color.Blue)
-                    .then(insetsModifier())) {
-                Box(
-                    Modifier
-                        .fillMaxSize()
-                        .onGloballyPositioned {
-                            coordinates = it
-                        })
+            Box(Modifier.fillMaxSize().background(Color.Blue).then(insetsModifier())) {
+                Box(Modifier.fillMaxSize().onGloballyPositioned { coordinates = it })
             }
         }
 
@@ -945,20 +872,23 @@
 
     private fun setContent(content: @Composable () -> Unit) {
         rule.setContent {
-            AndroidView(factory = { context ->
-                val view = InsetsView(context)
-                insetsView = view
-                val composeView = ComposeView(rule.activity)
-                view.addView(
-                    composeView,
-                    ViewGroup.LayoutParams(
-                        ViewGroup.LayoutParams.MATCH_PARENT,
-                        ViewGroup.LayoutParams.MATCH_PARENT
+            AndroidView(
+                factory = { context ->
+                    val view = InsetsView(context)
+                    insetsView = view
+                    val composeView = ComposeView(rule.activity)
+                    view.addView(
+                        composeView,
+                        ViewGroup.LayoutParams(
+                            ViewGroup.LayoutParams.MATCH_PARENT,
+                            ViewGroup.LayoutParams.MATCH_PARENT
+                        )
                     )
-                )
-                composeView.setContent(content)
-                view
-            }, modifier = Modifier.fillMaxSize())
+                    composeView.setContent(content)
+                    view
+                },
+                modifier = Modifier.fillMaxSize()
+            )
         }
     }
 
@@ -984,15 +914,13 @@
             view.dispatchWindowInsetsAnimationPrepare(animation)
 
             val imeInsets = FrameworkInsets.of(0, 0, 0, 20)
-            val bounds = WindowInsetsAnimation.Bounds(
-                FrameworkInsets.NONE,
-                imeInsets
-            )
+            val bounds = WindowInsetsAnimation.Bounds(FrameworkInsets.NONE, imeInsets)
             view.dispatchWindowInsetsAnimationStart(animation, bounds)
-            val targetInsets = android.view.WindowInsets.Builder()
-                .setInsets(android.view.WindowInsets.Type.ime(), imeInsets)
-                .setInsets(type, otherInsets.toPlatformInsets())
-                .build()
+            val targetInsets =
+                android.view.WindowInsets.Builder()
+                    .setInsets(android.view.WindowInsets.Type.ime(), imeInsets)
+                    .setInsets(type, otherInsets.toPlatformInsets())
+                    .build()
             view.dispatchApplyWindowInsets(targetInsets)
             animation
         }
@@ -1003,10 +931,11 @@
             val bottom = (20 * progress).roundToInt()
             val imeInsets = FrameworkInsets.of(0, 0, 0, bottom)
             val systemBarsInsets = FrameworkInsets.of(10, 11, 12, 13)
-            val animatedInsets = AndroidWindowInsets.Builder()
-                .setInsets(AndroidWindowInsets.Type.systemBars(), systemBarsInsets)
-                .setInsets(AndroidWindowInsets.Type.ime(), imeInsets)
-                .build()
+            val animatedInsets =
+                AndroidWindowInsets.Builder()
+                    .setInsets(AndroidWindowInsets.Type.systemBars(), systemBarsInsets)
+                    .setInsets(AndroidWindowInsets.Type.ime(), imeInsets)
+                    .build()
 
             val progressInsets =
                 view.dispatchWindowInsetsAnimationProgress(animatedInsets, listOf(this))
@@ -1015,17 +944,15 @@
     }
 
     fun WindowInsetsAnimation.sendImeEnd(view: View) {
-        rule.runOnIdle {
-            view.dispatchWindowInsetsAnimationEnd(this)
-        }
+        rule.runOnIdle { view.dispatchWindowInsetsAnimationEnd(this) }
     }
 }
 
 /**
- * A View below the compose View that overrides the insets sent by the system. The
- * compat onApplyWindowInsets listener calls requestApplyInsets(), which results in
- * the insets being sent again. If we don't override the insets then the system insets
- * (which are likely 0) will override the insets that we set in the test.
+ * A View below the compose View that overrides the insets sent by the system. The compat
+ * onApplyWindowInsets listener calls requestApplyInsets(), which results in the insets being sent
+ * again. If we don't override the insets then the system insets (which are likely 0) will override
+ * the insets that we set in the test.
  */
 internal class InsetsView(context: Context) : FrameLayout(context) {
     var myInsets: AndroidWindowInsets? = null
diff --git a/compose/foundation/foundation-layout/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/layout/WindowInsetsSizeTest.kt b/compose/foundation/foundation-layout/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/layout/WindowInsetsSizeTest.kt
index 7fdd264..5b7c4ba 100644
--- a/compose/foundation/foundation-layout/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/layout/WindowInsetsSizeTest.kt
+++ b/compose/foundation/foundation-layout/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/layout/WindowInsetsSizeTest.kt
@@ -53,35 +53,32 @@
 @MediumTest
 @RunWith(AndroidJUnit4::class)
 class WindowInsetsSizeTest {
-    @get:Rule
-    val rule = createAndroidComposeRule<ComponentActivity>()
+    @get:Rule val rule = createAndroidComposeRule<ComponentActivity>()
 
     private lateinit var insetsView: InsetsView
 
     private lateinit var finishLatch: CountDownLatch
     private val finishLatchGetter
         get() = finishLatch
-    private val observer = object : DefaultLifecycleObserver {
-        override fun onDestroy(owner: LifecycleOwner) {
-            finishLatchGetter.countDown()
+
+    private val observer =
+        object : DefaultLifecycleObserver {
+            override fun onDestroy(owner: LifecycleOwner) {
+                finishLatchGetter.countDown()
+            }
         }
-    }
 
     @Before
     fun setup() {
         WindowInsetsHolder.setUseTestInsets(true)
         finishLatch = CountDownLatch(1)
-        rule.runOnUiThread {
-            rule.activity.lifecycle.addObserver(observer)
-        }
+        rule.runOnUiThread { rule.activity.lifecycle.addObserver(observer) }
     }
 
     @After
     fun teardown() {
         WindowInsetsHolder.setUseTestInsets(false)
-        rule.runOnUiThread {
-            rule.activity.finish()
-        }
+        rule.runOnUiThread { rule.activity.finish() }
         assertThat(finishLatch.await(1, TimeUnit.SECONDS)).isTrue()
     }
 
@@ -91,36 +88,38 @@
         lateinit var coordinates: LayoutCoordinates
 
         rule.setContent {
-            AndroidView(factory = { context ->
-                val view = InsetsView(context)
-                insetsView = view
-                val composeView = ComposeView(rule.activity)
-                view.addView(
-                    composeView,
-                    ViewGroup.LayoutParams(
-                        ViewGroup.LayoutParams.MATCH_PARENT,
-                        ViewGroup.LayoutParams.MATCH_PARENT
+            AndroidView(
+                factory = { context ->
+                    val view = InsetsView(context)
+                    insetsView = view
+                    val composeView = ComposeView(rule.activity)
+                    view.addView(
+                        composeView,
+                        ViewGroup.LayoutParams(
+                            ViewGroup.LayoutParams.MATCH_PARENT,
+                            ViewGroup.LayoutParams.MATCH_PARENT
+                        )
                     )
-                )
-                composeView.setContent {
-                    DeviceConfigurationOverride(
-                        DeviceConfigurationOverride.LayoutDirection(LayoutDirection.Ltr)
-                    ) {
-                        Box(Modifier
-                            .wrapContentSize()
-                            .onGloballyPositioned { coordinates = it }
-                            .consumeWindowInsets(WindowInsets(left = 10))
+                    composeView.setContent {
+                        DeviceConfigurationOverride(
+                            DeviceConfigurationOverride.LayoutDirection(LayoutDirection.Ltr)
                         ) {
                             Box(
-                                Modifier
-                                    .fillMaxHeight()
-                                    .windowInsetsStartWidth(WindowInsets.navigationBars)
-                            )
+                                Modifier.wrapContentSize()
+                                    .onGloballyPositioned { coordinates = it }
+                                    .consumeWindowInsets(WindowInsets(left = 10))
+                            ) {
+                                Box(
+                                    Modifier.fillMaxHeight()
+                                        .windowInsetsStartWidth(WindowInsets.navigationBars)
+                                )
+                            }
                         }
                     }
-                }
-                view
-            }, modifier = Modifier.fillMaxSize())
+                    view
+                },
+                modifier = Modifier.fillMaxSize()
+            )
         }
 
         // wait for layout
@@ -145,32 +144,34 @@
         lateinit var coordinates: LayoutCoordinates
 
         rule.setContent {
-            AndroidView(factory = { context ->
-                val view = InsetsView(context)
-                insetsView = view
-                val composeView = ComposeView(rule.activity)
-                view.addView(
-                    composeView,
-                    ViewGroup.LayoutParams(
-                        ViewGroup.LayoutParams.MATCH_PARENT,
-                        ViewGroup.LayoutParams.MATCH_PARENT
-                    )
-                )
-                composeView.setContent {
-                    Box(Modifier
-                        .wrapContentSize()
-                        .onGloballyPositioned { coordinates = it }
-                        .consumeWindowInsets(WindowInsets(bottom = 10))
-                    ) {
-                        Box(
-                            Modifier
-                                .fillMaxWidth()
-                                .windowInsetsBottomHeight(WindowInsets.navigationBars)
+            AndroidView(
+                factory = { context ->
+                    val view = InsetsView(context)
+                    insetsView = view
+                    val composeView = ComposeView(rule.activity)
+                    view.addView(
+                        composeView,
+                        ViewGroup.LayoutParams(
+                            ViewGroup.LayoutParams.MATCH_PARENT,
+                            ViewGroup.LayoutParams.MATCH_PARENT
                         )
+                    )
+                    composeView.setContent {
+                        Box(
+                            Modifier.wrapContentSize()
+                                .onGloballyPositioned { coordinates = it }
+                                .consumeWindowInsets(WindowInsets(bottom = 10))
+                        ) {
+                            Box(
+                                Modifier.fillMaxWidth()
+                                    .windowInsetsBottomHeight(WindowInsets.navigationBars)
+                            )
+                        }
                     }
-                }
-                view
-            }, modifier = Modifier.fillMaxSize())
+                    view
+                },
+                modifier = Modifier.fillMaxSize()
+            )
         }
 
         // wait for layout
@@ -197,7 +198,9 @@
             { Modifier.windowInsetsStartWidth(WindowInsets.ime).fillMaxHeight() },
             AndroidXInsets.of(10, 0, 0, 0),
             LayoutDirection.Ltr
-        ) { size -> IntSize(10, size.height) }
+        ) { size ->
+            IntSize(10, size.height)
+        }
     }
 
     @SdkSuppress(minSdkVersion = Build.VERSION_CODES.R)
@@ -208,7 +211,9 @@
             { Modifier.windowInsetsStartWidth(WindowInsets.ime).fillMaxHeight() },
             AndroidXInsets.of(0, 0, 10, 0),
             LayoutDirection.Rtl
-        ) { size -> IntSize(10, size.height) }
+        ) { size ->
+            IntSize(10, size.height)
+        }
     }
 
     @SdkSuppress(minSdkVersion = Build.VERSION_CODES.R)
@@ -219,7 +224,9 @@
             { Modifier.windowInsetsEndWidth(WindowInsets.ime).fillMaxHeight() },
             AndroidXInsets.of(0, 0, 10, 0),
             LayoutDirection.Ltr
-        ) { size -> IntSize(10, size.height) }
+        ) { size ->
+            IntSize(10, size.height)
+        }
     }
 
     @SdkSuppress(minSdkVersion = Build.VERSION_CODES.R)
@@ -230,7 +237,9 @@
             { Modifier.windowInsetsTopHeight(WindowInsets.ime).fillMaxWidth() },
             AndroidXInsets.of(0, 10, 0, 0),
             LayoutDirection.Ltr
-        ) { size -> IntSize(size.width, 10) }
+        ) { size ->
+            IntSize(size.width, 10)
+        }
     }
 
     @SdkSuppress(minSdkVersion = Build.VERSION_CODES.R)
@@ -241,7 +250,9 @@
             { Modifier.windowInsetsBottomHeight(WindowInsets.ime).fillMaxWidth() },
             AndroidXInsets.of(0, 0, 0, 10),
             LayoutDirection.Ltr
-        ) { size -> IntSize(size.width, 10) }
+        ) { size ->
+            IntSize(size.width, 10)
+        }
     }
 
     @Test
@@ -251,7 +262,9 @@
             { Modifier.windowInsetsStartWidth(WindowInsets.navigationBars).fillMaxHeight() },
             AndroidXInsets.of(10, 0, 0, 0),
             LayoutDirection.Ltr
-        ) { size -> IntSize(10, size.height) }
+        ) { size ->
+            IntSize(10, size.height)
+        }
     }
 
     @Test
@@ -261,7 +274,9 @@
             { Modifier.windowInsetsStartWidth(WindowInsets.navigationBars).fillMaxHeight() },
             AndroidXInsets.of(0, 0, 10, 0),
             LayoutDirection.Rtl
-        ) { size -> IntSize(10, size.height) }
+        ) { size ->
+            IntSize(10, size.height)
+        }
     }
 
     @Test
@@ -271,7 +286,9 @@
             { Modifier.windowInsetsEndWidth(WindowInsets.navigationBars).fillMaxHeight() },
             AndroidXInsets.of(0, 0, 10, 0),
             LayoutDirection.Ltr
-        ) { size -> IntSize(10, size.height) }
+        ) { size ->
+            IntSize(10, size.height)
+        }
     }
 
     @Test
@@ -281,23 +298,27 @@
             { Modifier.windowInsetsTopHeight(WindowInsets.statusBars).fillMaxWidth() },
             AndroidXInsets.of(0, 10, 0, 0),
             LayoutDirection.Ltr
-        ) { size -> IntSize(size.width, 10) }
+        ) { size ->
+            IntSize(size.width, 10)
+        }
     }
 
     @Test
     fun insetsTopHeightMixed() {
-        val coordinates = setInsetContent(
-            {
-                val insets = WindowInsets
-                Modifier.windowInsetsTopHeight(insets.navigationBars.union(insets.systemBars))
-                    .fillMaxWidth()
-            },
-            LayoutDirection.Ltr
-        )
-        val insets = WindowInsetsCompat.Builder()
-            .setInsets(WindowInsetsCompat.Type.navigationBars(), AndroidXInsets.of(0, 3, 0, 0))
-            .setInsets(WindowInsetsCompat.Type.systemBars(), AndroidXInsets.of(0, 10, 0, 0))
-            .build()
+        val coordinates =
+            setInsetContent(
+                {
+                    val insets = WindowInsets
+                    Modifier.windowInsetsTopHeight(insets.navigationBars.union(insets.systemBars))
+                        .fillMaxWidth()
+                },
+                LayoutDirection.Ltr
+            )
+        val insets =
+            WindowInsetsCompat.Builder()
+                .setInsets(WindowInsetsCompat.Type.navigationBars(), AndroidXInsets.of(0, 3, 0, 0))
+                .setInsets(WindowInsetsCompat.Type.systemBars(), AndroidXInsets.of(0, 10, 0, 0))
+                .build()
 
         val view = findComposeView()
         rule.runOnIdle {
@@ -305,9 +326,7 @@
             view.dispatchApplyWindowInsets(insets.toWindowInsets())
         }
 
-        rule.waitUntil {
-            coordinates.size == IntSize(view.width, 10)
-        }
+        rule.waitUntil { coordinates.size == IntSize(view.width, 10) }
     }
 
     @Test
@@ -371,8 +390,7 @@
         type: Int,
         sentInsets: AndroidXInsets = AndroidXInsets.of(10, 11, 12, 13)
     ): AndroidWindowInsets {
-        val builder = WindowInsetsCompat.Builder()
-            .setInsets(type, sentInsets)
+        val builder = WindowInsetsCompat.Builder().setInsets(type, sentInsets)
         if (type == WindowInsetsCompat.Type.displayCutout()) {
             val view = findComposeView()
             val width = view.width
@@ -404,9 +422,7 @@
             }
             builder.setDisplayCutout(DisplayCutoutCompat(safeRect, listOf(cutoutRect)))
         }
-        val insets = WindowInsetsCompat.Builder()
-            .setInsets(type, sentInsets)
-            .build()
+        val insets = WindowInsetsCompat.Builder().setInsets(type, sentInsets).build()
         insetsView.myInsets = insets.toWindowInsets()
         return rule.runOnIdle {
             AndroidWindowInsets(
@@ -422,28 +438,33 @@
         lateinit var coordinates: LayoutCoordinates
 
         rule.setContent {
-            AndroidView(factory = { context ->
-                val view = InsetsView(context)
-                insetsView = view
-                val composeView = ComposeView(rule.activity)
-                view.addView(
-                    composeView,
-                    ViewGroup.LayoutParams(
-                        ViewGroup.LayoutParams.MATCH_PARENT,
-                        ViewGroup.LayoutParams.MATCH_PARENT
+            AndroidView(
+                factory = { context ->
+                    val view = InsetsView(context)
+                    insetsView = view
+                    val composeView = ComposeView(rule.activity)
+                    view.addView(
+                        composeView,
+                        ViewGroup.LayoutParams(
+                            ViewGroup.LayoutParams.MATCH_PARENT,
+                            ViewGroup.LayoutParams.MATCH_PARENT
+                        )
                     )
-                )
-                composeView.setContent {
-                    DeviceConfigurationOverride(
-                        DeviceConfigurationOverride.LayoutDirection(layoutDirection)
-                    ) {
-                        Box(Modifier.wrapContentSize().onGloballyPositioned { coordinates = it }) {
-                            Box(sizeModifier())
+                    composeView.setContent {
+                        DeviceConfigurationOverride(
+                            DeviceConfigurationOverride.LayoutDirection(layoutDirection)
+                        ) {
+                            Box(
+                                Modifier.wrapContentSize().onGloballyPositioned { coordinates = it }
+                            ) {
+                                Box(sizeModifier())
+                            }
                         }
                     }
-                }
-                view
-            }, modifier = Modifier.fillMaxSize())
+                    view
+                },
+                modifier = Modifier.fillMaxSize()
+            )
         }
 
         // wait for layout
diff --git a/compose/foundation/foundation-layout/src/androidMain/kotlin/androidx/compose/foundation/layout/WindowInsets.android.kt b/compose/foundation/foundation-layout/src/androidMain/kotlin/androidx/compose/foundation/layout/WindowInsets.android.kt
index 4ebb005..4aad3f9 100644
--- a/compose/foundation/foundation-layout/src/androidMain/kotlin/androidx/compose/foundation/layout/WindowInsets.android.kt
+++ b/compose/foundation/foundation-layout/src/androidMain/kotlin/androidx/compose/foundation/layout/WindowInsets.android.kt
@@ -41,8 +41,7 @@
 import java.util.WeakHashMap
 import org.jetbrains.annotations.TestOnly
 
-internal fun AndroidXInsets.toInsetsValues(): InsetsValues =
-    InsetsValues(left, top, right, bottom)
+internal fun AndroidXInsets.toInsetsValues(): InsetsValues = InsetsValues(left, top, right, bottom)
 
 internal fun ValueInsets(insets: AndroidXInsets, name: String): ValueInsets =
     ValueInsets(insets.toInsetsValues(), name)
@@ -52,15 +51,13 @@
  * [rememberWindowInsetsConnection] to control the insets.
  */
 @Stable
-internal class AndroidWindowInsets(
-    internal val type: Int,
-    private val name: String
-) : WindowInsets {
+internal class AndroidWindowInsets(internal val type: Int, private val name: String) :
+    WindowInsets {
     internal var insets by mutableStateOf(AndroidXInsets.NONE)
 
     /**
-     * Returns whether the insets are visible, irrespective of whether or not they
-     * intersect with the Window.
+     * Returns whether the insets are visible, irrespective of whether or not they intersect with
+     * the Window.
      */
     var isVisible by mutableStateOf(true)
         private set
@@ -106,9 +103,9 @@
 }
 
 /**
- * Indicates whether access to [WindowInsets] within the [content][ComposeView.setContent]
- * should consume the Android  [android.view.WindowInsets]. The default value is `true`, meaning
- * that access to [WindowInsets.Companion] will consume the Android WindowInsets.
+ * Indicates whether access to [WindowInsets] within the [content][ComposeView.setContent] should
+ * consume the Android [android.view.WindowInsets]. The default value is `true`, meaning that access
+ * to [WindowInsets.Companion] will consume the Android WindowInsets.
  *
  * This property should be set prior to first composition.
  */
@@ -119,55 +116,48 @@
     }
 
 /**
- * Indicates whether access to [WindowInsets] within the [content][ComposeView.setContent]
- * should consume the Android  [android.view.WindowInsets]. The default value is `true`, meaning
- * that access to [WindowInsets.Companion] will consume the Android WindowInsets.
+ * Indicates whether access to [WindowInsets] within the [content][ComposeView.setContent] should
+ * consume the Android [android.view.WindowInsets]. The default value is `true`, meaning that access
+ * to [WindowInsets.Companion] will consume the Android WindowInsets.
  *
  * This property should be set prior to first composition.
  */
 @Deprecated(
     level = DeprecationLevel.HIDDEN,
-    message = "Please use AbstractComposeView.consumeWindowInsets")
+    message = "Please use AbstractComposeView.consumeWindowInsets"
+)
 var ComposeView.consumeWindowInsets: Boolean
     get() = getTag(R.id.consume_window_insets_tag) as? Boolean ?: true
     set(value) {
         setTag(R.id.consume_window_insets_tag, value)
     }
 
-/**
- * For the [WindowInsetsCompat.Type.captionBar].
- */
+/** For the [WindowInsetsCompat.Type.captionBar]. */
 actual val WindowInsets.Companion.captionBar: WindowInsets
-    @Composable
-    @NonRestartableComposable
-    get() = WindowInsetsHolder.current().captionBar
+    @Composable @NonRestartableComposable get() = WindowInsetsHolder.current().captionBar
 
 /**
- * For the [WindowInsetsCompat.Type.displayCutout]. This insets represents the area that the
- * display cutout (e.g. for camera) is and important content should be excluded from.
+ * For the [WindowInsetsCompat.Type.displayCutout]. This insets represents the area that the display
+ * cutout (e.g. for camera) is and important content should be excluded from.
  */
 actual val WindowInsets.Companion.displayCutout: WindowInsets
-    @Composable
-    @NonRestartableComposable
-    get() = WindowInsetsHolder.current().displayCutout
+    @Composable @NonRestartableComposable get() = WindowInsetsHolder.current().displayCutout
 
 /**
  * For the [WindowInsetsCompat.Type.ime]. On API level 23 (M) and above, the soft keyboard can be
  * detected and [ime] will update when it shows. On API 30 (R) and above, the [ime] insets will
  * animate synchronously with the actual IME animation.
  *
- * Developers should set `android:windowSoftInputMode="adjustResize"` in their
- * `AndroidManifest.xml` file and call `WindowCompat.setDecorFitsSystemWindows(window, false)`
- * in their [android.app.Activity.onCreate].
+ * Developers should set `android:windowSoftInputMode="adjustResize"` in their `AndroidManifest.xml`
+ * file and call `WindowCompat.setDecorFitsSystemWindows(window, false)` in their
+ * [android.app.Activity.onCreate].
  */
 actual val WindowInsets.Companion.ime: WindowInsets
-    @Composable
-    @NonRestartableComposable
-    get() = WindowInsetsHolder.current().ime
+    @Composable @NonRestartableComposable get() = WindowInsetsHolder.current().ime
 
 /**
- * For the [WindowInsetsCompat.Type.mandatorySystemGestures]. These insets represents the
- * space where system gestures have priority over application gestures.
+ * For the [WindowInsetsCompat.Type.mandatorySystemGestures]. These insets represents the space
+ * where system gestures have priority over application gestures.
  */
 actual val WindowInsets.Companion.mandatorySystemGestures: WindowInsets
     @Composable
@@ -175,88 +165,57 @@
     get() = WindowInsetsHolder.current().mandatorySystemGestures
 
 /**
- * For the [WindowInsetsCompat.Type.navigationBars]. These insets represent where
- * system UI places navigation bars. Interactive UI should avoid the navigation bars
- * area.
+ * For the [WindowInsetsCompat.Type.navigationBars]. These insets represent where system UI places
+ * navigation bars. Interactive UI should avoid the navigation bars area.
  */
 actual val WindowInsets.Companion.navigationBars: WindowInsets
-    @Composable
-    @NonRestartableComposable
-    get() = WindowInsetsHolder.current().navigationBars
+    @Composable @NonRestartableComposable get() = WindowInsetsHolder.current().navigationBars
 
-/**
- * For the [WindowInsetsCompat.Type.statusBars].
- */
+/** For the [WindowInsetsCompat.Type.statusBars]. */
 actual val WindowInsets.Companion.statusBars: WindowInsets
-    @Composable
-    @NonRestartableComposable
-    get() = WindowInsetsHolder.current().statusBars
+    @Composable @NonRestartableComposable get() = WindowInsetsHolder.current().statusBars
 
-/**
- * For the [WindowInsetsCompat.Type.systemBars].
- */
+/** For the [WindowInsetsCompat.Type.systemBars]. */
 actual val WindowInsets.Companion.systemBars: WindowInsets
-    @Composable
-    @NonRestartableComposable
-    get() = WindowInsetsHolder.current().systemBars
+    @Composable @NonRestartableComposable get() = WindowInsetsHolder.current().systemBars
 
-/**
- * For the [WindowInsetsCompat.Type.systemGestures].
- */
+/** For the [WindowInsetsCompat.Type.systemGestures]. */
 actual val WindowInsets.Companion.systemGestures: WindowInsets
-    @Composable
-    @NonRestartableComposable
-    get() = WindowInsetsHolder.current().systemGestures
+    @Composable @NonRestartableComposable get() = WindowInsetsHolder.current().systemGestures
 
-/**
- * For the [WindowInsetsCompat.Type.tappableElement].
- */
+/** For the [WindowInsetsCompat.Type.tappableElement]. */
 actual val WindowInsets.Companion.tappableElement: WindowInsets
-    @Composable
-    @NonRestartableComposable
-    get() = WindowInsetsHolder.current().tappableElement
+    @Composable @NonRestartableComposable get() = WindowInsetsHolder.current().tappableElement
 
-/**
- * The insets for the curved areas in a waterfall display.
- */
+/** The insets for the curved areas in a waterfall display. */
 actual val WindowInsets.Companion.waterfall: WindowInsets
-    @Composable
-    @NonRestartableComposable
-    get() = WindowInsetsHolder.current().waterfall
+    @Composable @NonRestartableComposable get() = WindowInsetsHolder.current().waterfall
 
 /**
- * The insets that include areas where content may be covered by other drawn content.
- * This includes all [system bars][systemBars], [display cutout][displayCutout], and
- * [soft keyboard][ime].
+ * The insets that include areas where content may be covered by other drawn content. This includes
+ * all [system bars][systemBars], [display cutout][displayCutout], and [soft keyboard][ime].
  */
 actual val WindowInsets.Companion.safeDrawing: WindowInsets
-    @Composable
-    @NonRestartableComposable
-    get() = WindowInsetsHolder.current().safeDrawing
+    @Composable @NonRestartableComposable get() = WindowInsetsHolder.current().safeDrawing
 
 /**
- * The insets that include areas where gestures may be confused with other input,
- * including [system gestures][systemGestures],
- * [mandatory system gestures][mandatorySystemGestures],
+ * The insets that include areas where gestures may be confused with other input, including
+ * [system gestures][systemGestures], [mandatory system gestures][mandatorySystemGestures],
  * [rounded display areas][waterfall], and [tappable areas][tappableElement].
  */
 actual val WindowInsets.Companion.safeGestures: WindowInsets
-    @Composable
-    @NonRestartableComposable
-    get() = WindowInsetsHolder.current().safeGestures
+    @Composable @NonRestartableComposable get() = WindowInsetsHolder.current().safeGestures
 
 /**
- * The insets that include all areas that may be drawn over or have gesture confusion,
- * including everything in [safeDrawing] and [safeGestures].
+ * The insets that include all areas that may be drawn over or have gesture confusion, including
+ * everything in [safeDrawing] and [safeGestures].
  */
 actual val WindowInsets.Companion.safeContent: WindowInsets
-    @Composable
-    @NonRestartableComposable
-    get() = WindowInsetsHolder.current().safeContent
+    @Composable @NonRestartableComposable get() = WindowInsetsHolder.current().safeContent
 
 /**
- * The insets that the [WindowInsetsCompat.Type.captionBar] will consume if shown.
- * If it cannot be shown then this will be empty.
+ * The insets that the [WindowInsetsCompat.Type.captionBar] will consume if shown. If it cannot be
+ * shown then this will be empty.
  */
 @ExperimentalLayoutApi
 val WindowInsets.Companion.captionBarIgnoringVisibility: WindowInsets
@@ -267,10 +226,9 @@
     get() = WindowInsetsHolder.current().captionBarIgnoringVisibility
 
 /**
- * The insets that [WindowInsetsCompat.Type.navigationBars] will consume if shown.
- * These insets represent where system UI places navigation bars. Interactive UI should
- * avoid the navigation bars area. If navigation bars cannot be shown, then this will be
- * empty.
+ * The insets that [WindowInsetsCompat.Type.navigationBars] will consume if shown. These insets
+ * represent where system UI places navigation bars. Interactive UI should avoid the navigation bars
+ * area. If navigation bars cannot be shown, then this will be empty.
  */
 @ExperimentalLayoutApi
 val WindowInsets.Companion.navigationBarsIgnoringVisibility: WindowInsets
@@ -281,8 +239,8 @@
     get() = WindowInsetsHolder.current().navigationBarsIgnoringVisibility
 
 /**
- * The insets that [WindowInsetsCompat.Type.statusBars] will consume if shown.
- * If the status bar can never be shown, then this will be empty.
+ * The insets that [WindowInsetsCompat.Type.statusBars] will consume if shown. If the status bar can
+ * never be shown, then this will be empty.
  */
 @ExperimentalLayoutApi
 val WindowInsets.Companion.statusBarsIgnoringVisibility: WindowInsets
@@ -319,8 +277,8 @@
     get() = WindowInsetsHolder.current().tappableElementIgnoringVisibility
 
 /**
- * `true` when the [caption bar][captionBar] is being displayed, irrespective of
- * whether it intersects with the Window.
+ * `true` when the [caption bar][captionBar] is being displayed, irrespective of whether it
+ * intersects with the Window.
  */
 @ExperimentalLayoutApi
 val WindowInsets.Companion.isCaptionBarVisible: Boolean
@@ -331,8 +289,8 @@
     get() = WindowInsetsHolder.current().captionBar.isVisible
 
 /**
- * `true` when the [soft keyboard][ime] is being displayed, irrespective of
- * whether it intersects with the Window.
+ * `true` when the [soft keyboard][ime] is being displayed, irrespective of whether it intersects
+ * with the Window.
  */
 @ExperimentalLayoutApi
 val WindowInsets.Companion.isImeVisible: Boolean
@@ -343,8 +301,8 @@
     get() = WindowInsetsHolder.current().ime.isVisible
 
 /**
- * `true` when the [statusBars] are being displayed, irrespective of
- * whether they intersects with the Window.
+ * `true` when the [statusBars] are being displayed, irrespective of whether they intersects with
+ * the Window.
  */
 @ExperimentalLayoutApi
 val WindowInsets.Companion.areStatusBarsVisible: Boolean
@@ -355,8 +313,8 @@
     get() = WindowInsetsHolder.current().statusBars.isVisible
 
 /**
- * `true` when the [navigationBars] are being displayed, irrespective of
- * whether they intersects with the Window.
+ * `true` when the [navigationBars] are being displayed, irrespective of whether they intersects
+ * with the Window.
  */
 @ExperimentalLayoutApi
 val WindowInsets.Companion.areNavigationBarsVisible: Boolean
@@ -367,8 +325,8 @@
     get() = WindowInsetsHolder.current().navigationBars.isVisible
 
 /**
- * `true` when the [systemBars] are being displayed, irrespective of
- * whether they intersects with the Window.
+ * `true` when the [systemBars] are being displayed, irrespective of whether they intersects with
+ * the Window.
  */
 @ExperimentalLayoutApi
 val WindowInsets.Companion.areSystemBarsVisible: Boolean
@@ -378,8 +336,8 @@
     @NonRestartableComposable
     get() = WindowInsetsHolder.current().systemBars.isVisible
 /**
- * `true` when the [tappableElement] is being displayed, irrespective of
- * whether they intersects with the Window.
+ * `true` when the [tappableElement] is being displayed, irrespective of whether they intersects
+ * with the Window.
  */
 @ExperimentalLayoutApi
 val WindowInsets.Companion.isTappableElementVisible: Boolean
@@ -390,11 +348,10 @@
     get() = WindowInsetsHolder.current().tappableElement.isVisible
 
 /**
- * The [WindowInsets] for the IME before the IME started animating in. The current
- * animated value is [WindowInsets.Companion.ime].
+ * The [WindowInsets] for the IME before the IME started animating in. The current animated value is
+ * [WindowInsets.Companion.ime].
  *
- * This will be the same as [imeAnimationTarget] when there is no IME animation
- * in progress.
+ * This will be the same as [imeAnimationTarget] when there is no IME animation in progress.
  */
 @ExperimentalLayoutApi
 val WindowInsets.Companion.imeAnimationSource: WindowInsets
@@ -405,11 +362,10 @@
     get() = WindowInsetsHolder.current().imeAnimationSource
 
 /**
- * The [WindowInsets] for the IME when the animation completes, if it is allowed
- * to complete successfully. The current animated value is [WindowInsets.Companion.ime].
+ * The [WindowInsets] for the IME when the animation completes, if it is allowed to complete
+ * successfully. The current animated value is [WindowInsets.Companion.ime].
  *
- * This will be the same as [imeAnimationSource] when there is no IME animation
- * in progress.
+ * This will be the same as [imeAnimationSource] when there is no IME animation in progress.
  */
 @ExperimentalLayoutApi
 val WindowInsets.Companion.imeAnimationTarget: WindowInsets
@@ -419,91 +375,86 @@
     @NonRestartableComposable
     get() = WindowInsetsHolder.current().imeAnimationTarget
 
-/**
- * The insets for various values in the current window.
- */
+/** The insets for various values in the current window. */
 internal class WindowInsetsHolder private constructor(insets: WindowInsetsCompat?, view: View) {
-    val captionBar =
-        systemInsets(insets, WindowInsetsCompat.Type.captionBar(), "captionBar")
+    val captionBar = systemInsets(insets, WindowInsetsCompat.Type.captionBar(), "captionBar")
     val displayCutout =
         systemInsets(insets, WindowInsetsCompat.Type.displayCutout(), "displayCutout")
     val ime = systemInsets(insets, WindowInsetsCompat.Type.ime(), "ime")
-    val mandatorySystemGestures = systemInsets(
-        insets,
-        WindowInsetsCompat.Type.mandatorySystemGestures(),
-        "mandatorySystemGestures"
-    )
+    val mandatorySystemGestures =
+        systemInsets(
+            insets,
+            WindowInsetsCompat.Type.mandatorySystemGestures(),
+            "mandatorySystemGestures"
+        )
     val navigationBars =
         systemInsets(insets, WindowInsetsCompat.Type.navigationBars(), "navigationBars")
-    val statusBars =
-        systemInsets(insets, WindowInsetsCompat.Type.statusBars(), "statusBars")
-    val systemBars =
-        systemInsets(insets, WindowInsetsCompat.Type.systemBars(), "systemBars")
+    val statusBars = systemInsets(insets, WindowInsetsCompat.Type.statusBars(), "statusBars")
+    val systemBars = systemInsets(insets, WindowInsetsCompat.Type.systemBars(), "systemBars")
     val systemGestures =
         systemInsets(insets, WindowInsetsCompat.Type.systemGestures(), "systemGestures")
     val tappableElement =
         systemInsets(insets, WindowInsetsCompat.Type.tappableElement(), "tappableElement")
     val waterfall =
         ValueInsets(insets?.displayCutout?.waterfallInsets ?: AndroidXInsets.NONE, "waterfall")
-    val safeDrawing =
-        systemBars.union(ime).union(displayCutout)
+    val safeDrawing = systemBars.union(ime).union(displayCutout)
     val safeGestures: WindowInsets =
         tappableElement.union(mandatorySystemGestures).union(systemGestures).union(waterfall)
     val safeContent: WindowInsets = safeDrawing.union(safeGestures)
 
-    val captionBarIgnoringVisibility = valueInsetsIgnoringVisibility(
-        insets,
-        WindowInsetsCompat.Type.captionBar(),
-        "captionBarIgnoringVisibility"
-    )
-    val navigationBarsIgnoringVisibility = valueInsetsIgnoringVisibility(
-        insets, WindowInsetsCompat.Type.navigationBars(), "navigationBarsIgnoringVisibility"
-    )
-    val statusBarsIgnoringVisibility = valueInsetsIgnoringVisibility(
-        insets,
-        WindowInsetsCompat.Type.statusBars(),
-        "statusBarsIgnoringVisibility"
-    )
-    val systemBarsIgnoringVisibility = valueInsetsIgnoringVisibility(
-        insets,
-        WindowInsetsCompat.Type.systemBars(),
-        "systemBarsIgnoringVisibility"
-    )
-    val tappableElementIgnoringVisibility = valueInsetsIgnoringVisibility(
-        insets,
-        WindowInsetsCompat.Type.tappableElement(),
-        "tappableElementIgnoringVisibility"
-    )
-    val imeAnimationTarget = valueInsetsIgnoringVisibility(
-        insets,
-        WindowInsetsCompat.Type.ime(),
-        "imeAnimationTarget"
-    )
-    val imeAnimationSource = valueInsetsIgnoringVisibility(
-        insets,
-        WindowInsetsCompat.Type.ime(),
-        "imeAnimationSource"
-    )
+    val captionBarIgnoringVisibility =
+        valueInsetsIgnoringVisibility(
+            insets,
+            WindowInsetsCompat.Type.captionBar(),
+            "captionBarIgnoringVisibility"
+        )
+    val navigationBarsIgnoringVisibility =
+        valueInsetsIgnoringVisibility(
+            insets,
+            WindowInsetsCompat.Type.navigationBars(),
+            "navigationBarsIgnoringVisibility"
+        )
+    val statusBarsIgnoringVisibility =
+        valueInsetsIgnoringVisibility(
+            insets,
+            WindowInsetsCompat.Type.statusBars(),
+            "statusBarsIgnoringVisibility"
+        )
+    val systemBarsIgnoringVisibility =
+        valueInsetsIgnoringVisibility(
+            insets,
+            WindowInsetsCompat.Type.systemBars(),
+            "systemBarsIgnoringVisibility"
+        )
+    val tappableElementIgnoringVisibility =
+        valueInsetsIgnoringVisibility(
+            insets,
+            WindowInsetsCompat.Type.tappableElement(),
+            "tappableElementIgnoringVisibility"
+        )
+    val imeAnimationTarget =
+        valueInsetsIgnoringVisibility(insets, WindowInsetsCompat.Type.ime(), "imeAnimationTarget")
+    val imeAnimationSource =
+        valueInsetsIgnoringVisibility(insets, WindowInsetsCompat.Type.ime(), "imeAnimationSource")
 
     /**
      * `true` unless the `AbstractComposeView` [AbstractComposeView.consumeWindowInsets] is set to
      * `false`.
      */
-    val consumes = (view.parent as? View)?.getTag(R.id.consume_window_insets_tag)
-        as? Boolean ?: true
+    val consumes =
+        (view.parent as? View)?.getTag(R.id.consume_window_insets_tag) as? Boolean ?: true
 
     /**
-     * The number of accesses to [WindowInsetsHolder]. When this reaches
-     * zero, the listeners are removed. When it increases to 1, the listeners are added.
+     * The number of accesses to [WindowInsetsHolder]. When this reaches zero, the listeners are
+     * removed. When it increases to 1, the listeners are added.
      */
     private var accessCount = 0
 
     private val insetsListener = InsetsListener(this)
 
     /**
-     * A usage of [WindowInsetsHolder.current] was added. We must track so that when the
-     * first one is added, listeners are set and when the last is removed, the listeners
-     * are removed.
+     * A usage of [WindowInsetsHolder.current] was added. We must track so that when the first one
+     * is added, listeners are set and when the last is removed, the listeners are removed.
      */
     fun incrementAccessors(view: View) {
         if (accessCount == 0) {
@@ -521,9 +472,8 @@
     }
 
     /**
-     * A usage of [WindowInsetsHolder.current] was removed. We must track so that when the
-     * first one is added, listeners are set and when the last is removed, the listeners
-     * are removed.
+     * A usage of [WindowInsetsHolder.current] was removed. We must track so that when the first one
+     * is added, listeners are set and when the last is removed, the listeners are removed.
      */
     fun decrementAccessors(view: View) {
         accessCount--
@@ -535,20 +485,19 @@
         }
     }
 
-    /**
-     * Updates the WindowInsets values and notifies changes.
-     */
+    /** Updates the WindowInsets values and notifies changes. */
     fun update(windowInsets: WindowInsetsCompat, types: Int = 0) {
-        val insets = if (testInsets) {
-            // WindowInsetsCompat erases insets that aren't part of the device.
-            // For example, if there is no navigation bar because of hardware keys,
-            // the bottom navigation bar will be removed. By using the constructor
-            // that doesn't accept a View, it doesn't remove the insets that aren't
-            // possible. This is important for testing on arbitrary hardware.
-            WindowInsetsCompat.toWindowInsetsCompat(windowInsets.toWindowInsets()!!)
-        } else {
-            windowInsets
-        }
+        val insets =
+            if (testInsets) {
+                // WindowInsetsCompat erases insets that aren't part of the device.
+                // For example, if there is no navigation bar because of hardware keys,
+                // the bottom navigation bar will be removed. By using the constructor
+                // that doesn't accept a View, it doesn't remove the insets that aren't
+                // possible. This is important for testing on arbitrary hardware.
+                WindowInsetsCompat.toWindowInsetsCompat(windowInsets.toWindowInsets()!!)
+            } else {
+                windowInsets
+            }
         captionBar.update(insets, types)
         ime.update(insets, types)
         displayCutout.update(insets, types)
@@ -560,21 +509,26 @@
         mandatorySystemGestures.update(insets, types)
 
         if (types == 0) {
-            captionBarIgnoringVisibility.value = insets.getInsetsIgnoringVisibility(
-                WindowInsetsCompat.Type.captionBar()
-            ).toInsetsValues()
-            navigationBarsIgnoringVisibility.value = insets.getInsetsIgnoringVisibility(
-                WindowInsetsCompat.Type.navigationBars()
-            ).toInsetsValues()
-            statusBarsIgnoringVisibility.value = insets.getInsetsIgnoringVisibility(
-                WindowInsetsCompat.Type.statusBars()
-            ).toInsetsValues()
-            systemBarsIgnoringVisibility.value = insets.getInsetsIgnoringVisibility(
-                WindowInsetsCompat.Type.systemBars()
-            ).toInsetsValues()
-            tappableElementIgnoringVisibility.value = insets.getInsetsIgnoringVisibility(
-                WindowInsetsCompat.Type.tappableElement()
-            ).toInsetsValues()
+            captionBarIgnoringVisibility.value =
+                insets
+                    .getInsetsIgnoringVisibility(WindowInsetsCompat.Type.captionBar())
+                    .toInsetsValues()
+            navigationBarsIgnoringVisibility.value =
+                insets
+                    .getInsetsIgnoringVisibility(WindowInsetsCompat.Type.navigationBars())
+                    .toInsetsValues()
+            statusBarsIgnoringVisibility.value =
+                insets
+                    .getInsetsIgnoringVisibility(WindowInsetsCompat.Type.statusBars())
+                    .toInsetsValues()
+            systemBarsIgnoringVisibility.value =
+                insets
+                    .getInsetsIgnoringVisibility(WindowInsetsCompat.Type.systemBars())
+                    .toInsetsValues()
+            tappableElementIgnoringVisibility.value =
+                insets
+                    .getInsetsIgnoringVisibility(WindowInsetsCompat.Type.tappableElement())
+                    .toInsetsValues()
 
             val cutout = insets.displayCutout
             if (cutout != null) {
@@ -586,8 +540,7 @@
     }
 
     /**
-     * Updates [WindowInsets.Companion.imeAnimationSource]. It should be called prior to
-     * [update].
+     * Updates [WindowInsets.Companion.imeAnimationSource]. It should be called prior to [update].
      */
     fun updateImeAnimationSource(windowInsets: WindowInsetsCompat) {
         imeAnimationSource.value =
@@ -595,8 +548,7 @@
     }
 
     /**
-     * Updates [WindowInsets.Companion.imeAnimationTarget]. It should be called prior to
-     * [update].
+     * Updates [WindowInsets.Companion.imeAnimationTarget]. It should be called prior to [update].
      */
     fun updateImeAnimationTarget(windowInsets: WindowInsetsCompat) {
         imeAnimationTarget.value =
@@ -605,9 +557,9 @@
 
     companion object {
         /**
-         * A mapping of AndroidComposeView to ComposeWindowInsets. Normally a tag is a great
-         * way to do this mapping, but off-UI thread and multithreaded composition don't
-         * allow using the tag.
+         * A mapping of AndroidComposeView to ComposeWindowInsets. Normally a tag is a great way to
+         * do this mapping, but off-UI thread and multithreaded composition don't allow using the
+         * tag.
          */
         private val viewMap = WeakHashMap<View, WindowInsetsHolder>()
 
@@ -630,16 +582,13 @@
 
             DisposableEffect(insets) {
                 insets.incrementAccessors(view)
-                onDispose {
-                    insets.decrementAccessors(view)
-                }
+                onDispose { insets.decrementAccessors(view) }
             }
             return insets
         }
 
         /**
-         * Returns the [WindowInsetsHolder] associated with [view] or creates one and associates
-         * it.
+         * Returns the [WindowInsetsHolder] associated with [view] or creates one and associates it.
          */
         private fun getOrCreateFor(view: View): WindowInsetsHolder {
             return synchronized(viewMap) {
@@ -650,18 +599,13 @@
             }
         }
 
-        /**
-         * Creates a [ValueInsets] using the value from [windowInsets] if it isn't `null`
-         */
-        private fun systemInsets(
-            windowInsets: WindowInsetsCompat?,
-            type: Int,
-            name: String
-        ) = AndroidWindowInsets(type, name).apply { windowInsets?.let { update(it, type) } }
+        /** Creates a [ValueInsets] using the value from [windowInsets] if it isn't `null` */
+        private fun systemInsets(windowInsets: WindowInsetsCompat?, type: Int, name: String) =
+            AndroidWindowInsets(type, name).apply { windowInsets?.let { update(it, type) } }
 
         /**
-         * Creates a [ValueInsets] using the "ignoring visibility" value from [windowInsets]
-         * if it isn't `null`
+         * Creates a [ValueInsets] using the "ignoring visibility" value from [windowInsets] if it
+         * isn't `null`
          */
         private fun valueInsetsIgnoringVisibility(
             windowInsets: WindowInsetsCompat?,
@@ -676,24 +620,25 @@
 
 private class InsetsListener(
     val composeInsets: WindowInsetsHolder,
-) : WindowInsetsAnimationCompat.Callback(
-    if (composeInsets.consumes) DISPATCH_MODE_STOP else DISPATCH_MODE_CONTINUE_ON_SUBTREE
-), Runnable, OnApplyWindowInsetsListener, OnAttachStateChangeListener {
+) :
+    WindowInsetsAnimationCompat.Callback(
+        if (composeInsets.consumes) DISPATCH_MODE_STOP else DISPATCH_MODE_CONTINUE_ON_SUBTREE
+    ),
+    Runnable,
+    OnApplyWindowInsetsListener,
+    OnAttachStateChangeListener {
     /**
-     * When [android.view.WindowInsetsController.controlWindowInsetsAnimation] is called,
-     * the [onApplyWindowInsets] is called after [onPrepare] with the target size. We
-     * don't want to report the target size, we want to always report the current size,
-     * so we must ignore those calls. However, the animation may be canceled before it
-     * progresses. On R, it won't make any callbacks, so we have to figure out whether
-     * the [onApplyWindowInsets] is from a canceled animation or if it is from the
-     * controlled animation. When [prepared] is `true` on R, we post a callback to
-     * set the [onApplyWindowInsets] insets value.
+     * When [android.view.WindowInsetsController.controlWindowInsetsAnimation] is called, the
+     * [onApplyWindowInsets] is called after [onPrepare] with the target size. We don't want to
+     * report the target size, we want to always report the current size, so we must ignore those
+     * calls. However, the animation may be canceled before it progresses. On R, it won't make any
+     * callbacks, so we have to figure out whether the [onApplyWindowInsets] is from a canceled
+     * animation or if it is from the controlled animation. When [prepared] is `true` on R, we post
+     * a callback to set the [onApplyWindowInsets] insets value.
      */
     var prepared = false
 
-    /**
-     * `true` if there is an animation in progress.
-     */
+    /** `true` if there is an animation in progress. */
     var runningAnimation = false
 
     var savedInsets: WindowInsetsCompat? = null
@@ -757,11 +702,11 @@
     }
 
     /**
-     * On [R], we don't receive the [onEnd] call when an animation is canceled, so we post
-     * the value received in [onApplyWindowInsets] immediately after [onPrepare]. If [onProgress]
-     * or [onEnd] is received before the runnable executes then the value won't be used. Otherwise,
-     * the [onApplyWindowInsets] value will be used. It may have a janky frame, but it is the best
-     * we can do.
+     * On [R], we don't receive the [onEnd] call when an animation is canceled, so we post the value
+     * received in [onApplyWindowInsets] immediately after [onPrepare]. If [onProgress] or [onEnd]
+     * is received before the runnable executes then the value won't be used. Otherwise, the
+     * [onApplyWindowInsets] value will be used. It may have a janky frame, but it is the best we
+     * can do.
      */
     override fun run() {
         if (prepared) {
@@ -779,6 +724,5 @@
         view.requestApplyInsets()
     }
 
-    override fun onViewDetachedFromWindow(v: View) {
-    }
+    override fun onViewDetachedFromWindow(v: View) {}
 }
diff --git a/compose/foundation/foundation-layout/src/androidMain/kotlin/androidx/compose/foundation/layout/WindowInsetsConnection.android.kt b/compose/foundation/foundation-layout/src/androidMain/kotlin/androidx/compose/foundation/layout/WindowInsetsConnection.android.kt
index 7572615..74b71d1 100644
--- a/compose/foundation/foundation-layout/src/androidMain/kotlin/androidx/compose/foundation/layout/WindowInsetsConnection.android.kt
+++ b/compose/foundation/foundation-layout/src/androidMain/kotlin/androidx/compose/foundation/layout/WindowInsetsConnection.android.kt
@@ -60,8 +60,8 @@
 import kotlinx.coroutines.suspendCancellableCoroutine
 
 /**
- * Controls the soft keyboard as a nested scrolling on Android [R][Build.VERSION_CODES.R]
- * and later. This allows the user to drag the soft keyboard up and down.
+ * Controls the soft keyboard as a nested scrolling on Android [R][Build.VERSION_CODES.R] and later.
+ * This allows the user to drag the soft keyboard up and down.
  *
  * After scrolling, the IME will animate either to the fully shown or fully hidden position,
  * depending on the position and fling.
@@ -73,15 +73,12 @@
     if (Build.VERSION.SDK_INT < Build.VERSION_CODES.R) {
         return this
     }
-    return composed(
-        debugInspectorInfo {
-            name = "imeNestedScroll"
-        }
-    ) {
-        val nestedScrollConnection = rememberWindowInsetsConnection(
-            WindowInsetsHolder.current().ime,
-            WindowInsetsSides.Bottom
-        )
+    return composed(debugInspectorInfo { name = "imeNestedScroll" }) {
+        val nestedScrollConnection =
+            rememberWindowInsetsConnection(
+                WindowInsetsHolder.current().ime,
+                WindowInsetsSides.Bottom
+            )
         nestedScroll(nestedScrollConnection)
     }
 }
@@ -92,14 +89,14 @@
  *
  * The [NestedScrollConnection] can be used when a developer wants to control a [WindowInsets],
  * either directly animating it or allowing the user to manually manipulate it. User interactions
- * will result in the [WindowInsets] animating either hidden or shown, depending on its
- * current position and the fling velocity received in [NestedScrollConnection.onPreFling] and
+ * will result in the [WindowInsets] animating either hidden or shown, depending on its current
+ * position and the fling velocity received in [NestedScrollConnection.onPreFling] and
  * [NestedScrollConnection.onPostFling].
  *
  * @param windowInsets The insets to be changed by the scroll effect
  * @param side The side of the [windowInsets] that is to be affected. Can only be one of
- * [WindowInsetsSides.Left], [WindowInsetsSides.Top], [WindowInsetsSides.Right],
- * [WindowInsetsSides.Bottom], [WindowInsetsSides.Start], [WindowInsetsSides.End].
+ *   [WindowInsetsSides.Left], [WindowInsetsSides.Top], [WindowInsetsSides.Right],
+ *   [WindowInsetsSides.Bottom], [WindowInsetsSides.Start], [WindowInsetsSides.End].
  */
 @ExperimentalLayoutApi
 @Composable
@@ -114,30 +111,24 @@
     val sideCalculator = SideCalculator.chooseCalculator(side, layoutDirection)
     val view = LocalView.current
     val density = LocalDensity.current
-    val connection = remember(windowInsets, view, sideCalculator, density) {
-        WindowInsetsNestedScrollConnection(windowInsets, view, sideCalculator, density)
-    }
-    DisposableEffect(connection) {
-        onDispose {
-            connection.dispose()
+    val connection =
+        remember(windowInsets, view, sideCalculator, density) {
+            WindowInsetsNestedScrollConnection(windowInsets, view, sideCalculator, density)
         }
-    }
+    DisposableEffect(connection) { onDispose { connection.dispose() } }
     return connection
 }
 
-/**
- * A [NestedScrollConnection] that does nothing, for versions before R.
- */
+/** A [NestedScrollConnection] that does nothing, for versions before R. */
 private object DoNothingNestedScrollConnection : NestedScrollConnection
 
 /**
- * Used in place of the standard Job cancellation pathway to avoid reflective
- * javaClass.simpleName lookups to build the exception message and stack trace collection.
- * Remove if these are changed in kotlinx.coroutines.
+ * Used in place of the standard Job cancellation pathway to avoid reflective javaClass.simpleName
+ * lookups to build the exception message and stack trace collection. Remove if these are changed in
+ * kotlinx.coroutines.
  */
-private class WindowInsetsAnimationCancelledException : CancellationException(
-    "Window insets animation cancelled"
-) {
+private class WindowInsetsAnimationCancelledException :
+    CancellationException("Window insets animation cancelled") {
     override fun fillInStackTrace(): Throwable {
         // Avoid null.clone() on Android <= 6.0 when accessing stackTrace
         stackTrace = emptyArray()
@@ -152,44 +143,43 @@
     val view: View,
     val sideCalculator: SideCalculator,
     val density: Density
-) : NestedScrollConnection,
-    WindowInsetsAnimationControlListener {
+) : NestedScrollConnection, WindowInsetsAnimationControlListener {
 
     /**
-     * The [WindowInsetsAnimationController] is only available once the insets are starting
-     * to be manipulated. This is used to set the current insets position.
+     * The [WindowInsetsAnimationController] is only available once the insets are starting to be
+     * manipulated. This is used to set the current insets position.
      */
     private var animationController: WindowInsetsAnimationController? = null
 
     /**
-     * `true` when we've requested a [WindowInsetsAnimationController] so that we don't
-     * ask for one when we've already asked for one. This should be `false` until we've
-     * made a request or when we've cleared [animationController] after it is finished.
+     * `true` when we've requested a [WindowInsetsAnimationController] so that we don't ask for one
+     * when we've already asked for one. This should be `false` until we've made a request or when
+     * we've cleared [animationController] after it is finished.
      */
     private var isControllerRequested = false
 
     /**
-     * We never need to cancel the animation because we always control it directly instead
-     * of using the [WindowInsetsAnimationController] to animate its value.
+     * We never need to cancel the animation because we always control it directly instead of using
+     * the [WindowInsetsAnimationController] to animate its value.
      */
     private val cancellationSignal = CancellationSignal()
 
     /**
      * Because touch motion has finer granularity than integers, we capture the fractions of
-     * integers here so that we can keep the finger more in line with the touch. Without this,
-     * we'd accumulate error.
+     * integers here so that we can keep the finger more in line with the touch. Without this, we'd
+     * accumulate error.
      */
     private var partialConsumption = 0f
 
     /**
-     * The [Job] that is launched to animate the insets during a fling. This can be canceled
-     * when the user touches the screen.
+     * The [Job] that is launched to animate the insets during a fling. This can be canceled when
+     * the user touches the screen.
      */
     private var animationJob: Job? = null
 
     /**
-     * Request an animation controller because it is `null`. If one has already been requested,
-     * this method does nothing.
+     * Request an animation controller because it is `null`. If one has already been requested, this
+     * method does nothing.
      */
     private fun requestAnimationController() {
         if (!isControllerRequested) {
@@ -206,33 +196,26 @@
 
     private var continuation: CancellableContinuation<WindowInsetsAnimationController?>? = null
 
-    /**
-     * Allows us to suspend, waiting for the animation controller to be returned.
-     */
+    /** Allows us to suspend, waiting for the animation controller to be returned. */
     private suspend fun getAnimationController(): WindowInsetsAnimationController? =
-        animationController ?: suspendCancellableCoroutine { continuation ->
-            this.continuation = continuation
-            requestAnimationController()
-        }
+        animationController
+            ?: suspendCancellableCoroutine { continuation ->
+                this.continuation = continuation
+                requestAnimationController()
+            }
 
-    /**
-     * Handle the dragging that hides the WindowInsets.
-     */
+    /** Handle the dragging that hides the WindowInsets. */
     override fun onPreScroll(available: Offset, source: NestedScrollSource): Offset =
         scroll(available, sideCalculator.hideMotion(available.x, available.y))
 
-    /**
-     * Handle the dragging that exposes the WindowInsets.
-     */
+    /** Handle the dragging that exposes the WindowInsets. */
     override fun onPostScroll(
         consumed: Offset,
         available: Offset,
         source: NestedScrollSource
     ): Offset = scroll(available, sideCalculator.showMotion(available.x, available.y))
 
-    /**
-     * Scrolls [scrollAmount] and returns the consumed amount of [available].
-     */
+    /** Scrolls [scrollAmount] and returns the consumed amount of [available]. */
     private fun scroll(available: Offset, scrollAmount: Float): Offset {
         animationJob?.let {
             it.cancel(WindowInsetsAnimationCancelledException())
@@ -241,8 +224,9 @@
 
         val animationController = animationController
 
-        if (scrollAmount == 0f ||
-            (windowInsets.isVisible == (scrollAmount > 0f) && animationController == null)
+        if (
+            scrollAmount == 0f ||
+                (windowInsets.isVisible == (scrollAmount > 0f) && animationController == null)
         ) {
             // No motion in the right direction or this is already fully shown/hidden.
             return Offset.Zero
@@ -282,23 +266,19 @@
         return sideCalculator.consumedOffsets(available)
     }
 
-    /**
-     * Handle flinging toward hiding the insets.
-     */
+    /** Handle flinging toward hiding the insets. */
     override suspend fun onPreFling(available: Velocity): Velocity =
         fling(available, sideCalculator.hideMotion(available.x, available.y), false)
 
-    /**
-     * Handle flinging toward showing the insets.
-     */
+    /** Handle flinging toward showing the insets. */
     override suspend fun onPostFling(consumed: Velocity, available: Velocity): Velocity =
         fling(available, sideCalculator.showMotion(available.x, available.y), true)
 
     /**
      * Handle flinging by [flingAmount] and return the consumed velocity of [available].
-     * [towardShown] should be `true` when the intended motion is to show the insets or `false`
-     * if to hide them. We always handle flinging toward the insets if the [flingAmount] is
-     * `0` so that the insets animate to a fully-shown or fully-hidden state.
+     * [towardShown] should be `true` when the intended motion is to show the insets or `false` if
+     * to hide them. We always handle flinging toward the insets if the [flingAmount] is `0` so that
+     * the insets animate to a fully-shown or fully-hidden state.
      */
     private suspend fun fling(
         available: Velocity,
@@ -309,8 +289,9 @@
         animationJob = null
         partialConsumption = 0f
 
-        if ((flingAmount == 0f && !towardShown) ||
-            (animationController == null && windowInsets.isVisible == towardShown)
+        if (
+            (flingAmount == 0f && !towardShown) ||
+                (animationController == null && windowInsets.isVisible == towardShown)
         ) {
             // Either there's no motion to hide or we're certain that
             // the inset is already correct.
@@ -382,9 +363,7 @@
         }
     }
 
-    /**
-     * Change the inset's side to [inset].
-     */
+    /** Change the inset's side to [inset]. */
     private fun adjustInsets(inset: Float) {
         animationController?.let {
             val currentInsets = it.currentInsets
@@ -397,18 +376,16 @@
         }
     }
 
-    /**
-     * Called after [requestAnimationController] and the [animationController] is ready.
-     */
+    /** Called after [requestAnimationController] and the [animationController] is ready. */
     override fun onReady(controller: WindowInsetsAnimationController, types: Int) {
         animationController = controller
         isControllerRequested = false
-        continuation?.resume(controller) { }
+        continuation?.resume(controller) {}
         continuation = null
     }
 
     fun dispose() {
-        continuation?.resume(null) { }
+        continuation?.resume(null) {}
         animationJob?.cancel()
         val animationController = animationController
         if (animationController != null) {
@@ -427,9 +404,7 @@
         animationEnded()
     }
 
-    /**
-     * The controlled animation has been terminated.
-     */
+    /** The controlled animation has been terminated. */
     private fun animationEnded() {
         if (animationController?.isReady == true) {
             animationController?.finish(windowInsets.isVisible)
@@ -438,7 +413,7 @@
 
         // The animation controller may not have been given to us, so we have to cancel animations
         // waiting for it.
-        continuation?.resume(null) { }
+        continuation?.resume(null) {}
         continuation = null
 
         // Cancel any animation that's running.
@@ -451,34 +426,31 @@
 }
 
 /**
- * This interface allows logic for the specific side (left, top, right, bottom) to be
- * extracted from the logic controlling showing and hiding insets. For example, an inset
- * at the top will show when dragging down, while an inset at the bottom will hide
- * when dragging down.
+ * This interface allows logic for the specific side (left, top, right, bottom) to be extracted from
+ * the logic controlling showing and hiding insets. For example, an inset at the top will show when
+ * dragging down, while an inset at the bottom will hide when dragging down.
  */
 @RequiresApi(Build.VERSION_CODES.R)
 private interface SideCalculator {
-    /**
-     * Returns the insets value for the side that this [SideCalculator] is associated with.
-     */
+    /** Returns the insets value for the side that this [SideCalculator] is associated with. */
     fun valueOf(insets: Insets): Int
 
     /**
      * Returns the motion, adjusted for side direction, that the [x], and [y] grant. A positive
-     * result indicates that it is in the direction of opening the insets on that side and
-     * a negative result indicates a closing of the insets on that side.
+     * result indicates that it is in the direction of opening the insets on that side and a
+     * negative result indicates a closing of the insets on that side.
      */
     fun motionOf(x: Float, y: Float): Float
 
     /**
-     * The motion of [x], [y] that indicates showing more of the insets on the side or `0` if
-     * no motion is given to showing more insets.
+     * The motion of [x], [y] that indicates showing more of the insets on the side or `0` if no
+     * motion is given to showing more insets.
      */
     fun showMotion(x: Float, y: Float): Float = motionOf(x, y).coerceAtLeast(0f)
 
     /**
-     * The motion of [x], [y] that indicates showing less of the insets on the side or `0` if
-     * no motion is given to showing less insets.
+     * The motion of [x], [y] that indicates showing less of the insets on the side or `0` if no
+     * motion is given to showing less insets.
      */
     fun hideMotion(x: Float, y: Float): Float = motionOf(x, y).coerceAtMost(0f)
 
@@ -487,20 +459,16 @@
      */
     fun adjustInsets(oldInsets: Insets, newValue: Int): Insets
 
-    /**
-     * Returns the [Offset] that consumes [available] in the direction of this side.
-     */
+    /** Returns the [Offset] that consumes [available] in the direction of this side. */
     fun consumedOffsets(available: Offset): Offset
 
-    /**
-     * Returns the [Velocity] that consumes [available] in the direction of this side.
-     */
+    /** Returns the [Velocity] that consumes [available] in the direction of this side. */
     fun consumedVelocity(available: Velocity, remaining: Float): Velocity
 
     companion object {
         /**
-         * Returns a [SideCalculator] for [side] and the given [layoutDirection]. This only
-         * works for one side and no combination of sides.
+         * Returns a [SideCalculator] for [side] and the given [layoutDirection]. This only works
+         * for one side and no combination of sides.
          */
         fun chooseCalculator(side: WindowInsetsSides, layoutDirection: LayoutDirection) =
             when (side) {
@@ -508,58 +476,80 @@
                 WindowInsetsSides.Top -> TopSideCalculator
                 WindowInsetsSides.Right -> RightSideCalculator
                 WindowInsetsSides.Bottom -> BottomSideCalculator
-                WindowInsetsSides.Start -> if (layoutDirection == LayoutDirection.Ltr) {
-                    LeftSideCalculator
-                } else {
-                    RightSideCalculator
-                }
-                WindowInsetsSides.End -> if (layoutDirection == LayoutDirection.Ltr) {
-                    RightSideCalculator
-                } else {
-                    LeftSideCalculator
-                }
+                WindowInsetsSides.Start ->
+                    if (layoutDirection == LayoutDirection.Ltr) {
+                        LeftSideCalculator
+                    } else {
+                        RightSideCalculator
+                    }
+                WindowInsetsSides.End ->
+                    if (layoutDirection == LayoutDirection.Ltr) {
+                        RightSideCalculator
+                    } else {
+                        LeftSideCalculator
+                    }
                 else -> error("Only Left, Top, Right, Bottom, Start and End are allowed")
             }
 
-        private val LeftSideCalculator = object : SideCalculator {
-            override fun valueOf(insets: Insets): Int = insets.left
-            override fun motionOf(x: Float, y: Float): Float = x
-            override fun adjustInsets(oldInsets: Insets, newValue: Int): Insets =
-                Insets.of(newValue, oldInsets.top, oldInsets.right, oldInsets.bottom)
-            override fun consumedOffsets(available: Offset): Offset = Offset(available.x, 0f)
-            override fun consumedVelocity(available: Velocity, remaining: Float): Velocity =
-                Velocity(available.x - remaining, 0f)
-        }
+        private val LeftSideCalculator =
+            object : SideCalculator {
+                override fun valueOf(insets: Insets): Int = insets.left
 
-        private val TopSideCalculator = object : SideCalculator {
-            override fun valueOf(insets: Insets): Int = insets.top
-            override fun motionOf(x: Float, y: Float): Float = y
-            override fun adjustInsets(oldInsets: Insets, newValue: Int): Insets =
-                Insets.of(oldInsets.left, newValue, oldInsets.right, oldInsets.bottom)
-            override fun consumedOffsets(available: Offset): Offset = Offset(0f, available.y)
-            override fun consumedVelocity(available: Velocity, remaining: Float): Velocity =
-                Velocity(0f, available.y - remaining)
-        }
+                override fun motionOf(x: Float, y: Float): Float = x
 
-        private val RightSideCalculator = object : SideCalculator {
-            override fun valueOf(insets: Insets): Int = insets.right
-            override fun motionOf(x: Float, y: Float): Float = -x
-            override fun adjustInsets(oldInsets: Insets, newValue: Int): Insets =
-                Insets.of(oldInsets.left, oldInsets.top, newValue, oldInsets.bottom)
-            override fun consumedOffsets(available: Offset): Offset = Offset(available.x, 0f)
-            override fun consumedVelocity(available: Velocity, remaining: Float): Velocity =
-                Velocity(available.x + remaining, 0f)
-        }
+                override fun adjustInsets(oldInsets: Insets, newValue: Int): Insets =
+                    Insets.of(newValue, oldInsets.top, oldInsets.right, oldInsets.bottom)
 
-        private val BottomSideCalculator = object : SideCalculator {
-            override fun valueOf(insets: Insets): Int = insets.bottom
-            override fun motionOf(x: Float, y: Float): Float = -y
-            override fun adjustInsets(oldInsets: Insets, newValue: Int): Insets =
-                Insets.of(oldInsets.left, oldInsets.top, oldInsets.right, newValue)
-            override fun consumedOffsets(available: Offset): Offset = Offset(0f, available.y)
-            override fun consumedVelocity(available: Velocity, remaining: Float): Velocity =
-                Velocity(0f, available.y + remaining)
-        }
+                override fun consumedOffsets(available: Offset): Offset = Offset(available.x, 0f)
+
+                override fun consumedVelocity(available: Velocity, remaining: Float): Velocity =
+                    Velocity(available.x - remaining, 0f)
+            }
+
+        private val TopSideCalculator =
+            object : SideCalculator {
+                override fun valueOf(insets: Insets): Int = insets.top
+
+                override fun motionOf(x: Float, y: Float): Float = y
+
+                override fun adjustInsets(oldInsets: Insets, newValue: Int): Insets =
+                    Insets.of(oldInsets.left, newValue, oldInsets.right, oldInsets.bottom)
+
+                override fun consumedOffsets(available: Offset): Offset = Offset(0f, available.y)
+
+                override fun consumedVelocity(available: Velocity, remaining: Float): Velocity =
+                    Velocity(0f, available.y - remaining)
+            }
+
+        private val RightSideCalculator =
+            object : SideCalculator {
+                override fun valueOf(insets: Insets): Int = insets.right
+
+                override fun motionOf(x: Float, y: Float): Float = -x
+
+                override fun adjustInsets(oldInsets: Insets, newValue: Int): Insets =
+                    Insets.of(oldInsets.left, oldInsets.top, newValue, oldInsets.bottom)
+
+                override fun consumedOffsets(available: Offset): Offset = Offset(available.x, 0f)
+
+                override fun consumedVelocity(available: Velocity, remaining: Float): Velocity =
+                    Velocity(available.x + remaining, 0f)
+            }
+
+        private val BottomSideCalculator =
+            object : SideCalculator {
+                override fun valueOf(insets: Insets): Int = insets.bottom
+
+                override fun motionOf(x: Float, y: Float): Float = -y
+
+                override fun adjustInsets(oldInsets: Insets, newValue: Int): Insets =
+                    Insets.of(oldInsets.left, oldInsets.top, oldInsets.right, newValue)
+
+                override fun consumedOffsets(available: Offset): Offset = Offset(0f, available.y)
+
+                override fun consumedVelocity(available: Velocity, remaining: Float): Velocity =
+                    Velocity(0f, available.y + remaining)
+            }
     }
 }
 
@@ -578,14 +568,12 @@
 private const val P1 = StartTension * Inflection
 private const val P2 = 1.0f - EndTension * (1.0f - Inflection)
 
-private class SplineBasedFloatDecayAnimationSpec(density: Density) :
-    FloatDecayAnimationSpec {
+private class SplineBasedFloatDecayAnimationSpec(density: Density) : FloatDecayAnimationSpec {
 
-    override val absVelocityThreshold: Float get() = 0f
+    override val absVelocityThreshold: Float
+        get() = 0f
 
-    /**
-     * A density-specific coefficient adjusted to physical values.
-     */
+    /** A density-specific coefficient adjusted to physical values. */
     private val magicPhysicalCoefficient: Float =
         GravityEarth * InchesPerMeter * density.density * 160f * 0.84f
 
@@ -595,15 +583,13 @@
             PlatformFlingScrollFriction * magicPhysicalCoefficient
         )
 
-    /**
-     * Compute the distance of a fling in units given an initial [velocity] of units/second
-     */
+    /** Compute the distance of a fling in units given an initial [velocity] of units/second */
     fun flingDistance(velocity: Float): Float {
         val l = getSplineDeceleration(velocity)
-        return (
-            PlatformFlingScrollFriction * magicPhysicalCoefficient
-                * exp(DecelerationRate / DecelMinusOne * l)
-            ).toFloat() * sign(velocity)
+        return (PlatformFlingScrollFriction *
+                magicPhysicalCoefficient *
+                exp(DecelerationRate / DecelMinusOne * l))
+            .toFloat() * sign(velocity)
     }
 
     override fun getTargetValue(initialValue: Float, initialVelocity: Float): Float =
@@ -618,8 +604,8 @@
         val duration = getDurationNanos(0f, initialVelocity)
         val splinePos = if (duration > 0) playTimeNanos / duration.toFloat() else 1f
         val distance = flingDistance(initialVelocity)
-        return initialValue + distance *
-            AndroidFlingSpline.flingPosition(splinePos).distanceCoefficient
+        return initialValue +
+            distance * AndroidFlingSpline.flingPosition(splinePos).distanceCoefficient
     }
 
     @Suppress("MethodNameUnits")
@@ -637,8 +623,8 @@
         val duration = getDurationNanos(0f, initialVelocity)
         val splinePos = if (duration > 0L) playTimeNanos / duration.toFloat() else 1f
         val distance = flingDistance(initialVelocity)
-        return AndroidFlingSpline.flingPosition(splinePos).velocityCoefficient *
-            distance / duration * 1_000_000_000.0f
+        return AndroidFlingSpline.flingPosition(splinePos).velocityCoefficient * distance /
+            duration * 1_000_000_000.0f
     }
 }
 
@@ -700,25 +686,22 @@
         return FlingResult(packFloats(distanceCoef, velocityCoef))
     }
 
-    /**
-     * The rate of deceleration along the spline motion given [velocity] and [friction].
-     */
+    /** The rate of deceleration along the spline motion given [velocity] and [friction]. */
     fun deceleration(velocity: Float, friction: Float): Double =
         ln(Inflection * abs(velocity) / friction.toDouble())
 
-    /**
-     * Result coefficients of a scroll computation
-     */
+    /** Result coefficients of a scroll computation */
     @JvmInline
     value class FlingResult(private val packedValue: Long) {
+        /** Linear distance traveled from 0-1, from source (0) to destination (1) */
+        val distanceCoefficient: Float
+            get() = unpackFloat1(packedValue)
+
         /**
-         * Linear distance traveled from 0-1, from source (0) to destination (1)
+         * Instantaneous velocity coefficient at this point in the fling expressed in total distance
+         * per unit time
          */
-        val distanceCoefficient: Float get() = unpackFloat1(packedValue)
-        /**
-         * Instantaneous velocity coefficient at this point in the fling expressed in
-         * total distance per unit time
-         */
-        val velocityCoefficient: Float get() = unpackFloat2(packedValue)
+        val velocityCoefficient: Float
+            get() = unpackFloat2(packedValue)
     }
 }
diff --git a/compose/foundation/foundation-layout/src/androidMain/kotlin/androidx/compose/foundation/layout/WindowInsetsPadding.android.kt b/compose/foundation/foundation-layout/src/androidMain/kotlin/androidx/compose/foundation/layout/WindowInsetsPadding.android.kt
index fc1e722..7ab6c42 100644
--- a/compose/foundation/foundation-layout/src/androidMain/kotlin/androidx/compose/foundation/layout/WindowInsetsPadding.android.kt
+++ b/compose/foundation/foundation-layout/src/androidMain/kotlin/androidx/compose/foundation/layout/WindowInsetsPadding.android.kt
@@ -30,8 +30,8 @@
  * will be excluded from the padding. [WindowInsets.Companion.safeDrawing] will be
  * [consumed][consumeWindowInsets] for child layouts as well.
  *
- * For example, if a parent layout uses [statusBarsPadding], the area that the parent
- * pads for the status bars will not be padded again by this [safeDrawingPadding] modifier.
+ * For example, if a parent layout uses [statusBarsPadding], the area that the parent pads for the
+ * status bars will not be padded again by this [safeDrawingPadding] modifier.
  *
  * When used, the [WindowInsets][android.view.WindowInsets] will be consumed.
  *
@@ -47,9 +47,8 @@
  * will be excluded from the padding. [WindowInsets.Companion.safeGestures] will be
  * [consumed][consumeWindowInsets] for child layouts as well.
  *
- * For example, if a parent layout uses [navigationBarsPadding],
- * the area that the parent layout pads for the status bars will not be padded again by this
- * [safeGesturesPadding] modifier.
+ * For example, if a parent layout uses [navigationBarsPadding], the area that the parent layout
+ * pads for the status bars will not be padded again by this [safeGesturesPadding] modifier.
  *
  * When used, the [WindowInsets][android.view.WindowInsets] will be consumed.
  *
@@ -65,9 +64,8 @@
  * will be excluded from the padding. [WindowInsets.Companion.safeContent] will be
  * [consumed][consumeWindowInsets] for child layouts as well.
  *
- * For example, if a parent layout uses [navigationBarsPadding],
- * the area that the parent layout pads for the status bars will not be padded again by this
- * [safeContentPadding] modifier.
+ * For example, if a parent layout uses [navigationBarsPadding], the area that the parent layout
+ * pads for the status bars will not be padded again by this [safeContentPadding] modifier.
  *
  * When used, the [WindowInsets][android.view.WindowInsets] will be consumed.
  *
@@ -83,9 +81,8 @@
  * will be excluded from the padding. [WindowInsets.Companion.systemBars] will be
  * [consumed][consumeWindowInsets] for child layouts as well.
  *
- * For example, if a parent layout uses [statusBarsPadding], the
- * area that the parent layout pads for the status bars will not be padded again by this
- * [systemBarsPadding] modifier.
+ * For example, if a parent layout uses [statusBarsPadding], the area that the parent layout pads
+ * for the status bars will not be padded again by this [systemBarsPadding] modifier.
  *
  * When used, the [WindowInsets][android.view.WindowInsets] will be consumed.
  *
@@ -101,9 +98,8 @@
  * will be excluded from the padding. [WindowInsets.Companion.displayCutout] will be
  * [consumed][consumeWindowInsets] for child layouts as well.
  *
- * For example, if a parent layout uses [statusBarsPadding], the
- * area that the parent layout pads for the status bars will not be padded again by this
- * [displayCutoutPadding] modifier.
+ * For example, if a parent layout uses [statusBarsPadding], the area that the parent layout pads
+ * for the status bars will not be padded again by this [displayCutoutPadding] modifier.
  *
  * When used, the [WindowInsets][android.view.WindowInsets] will be consumed.
  *
@@ -119,9 +115,8 @@
  * will be excluded from the padding. [WindowInsets.Companion.statusBars] will be
  * [consumed][consumeWindowInsets] for child layouts as well.
  *
- * For example, if a parent layout uses [displayCutoutPadding], the
- * area that the parent layout pads for the status bars will not be padded again by this
- * [statusBarsPadding] modifier.
+ * For example, if a parent layout uses [displayCutoutPadding], the area that the parent layout pads
+ * for the status bars will not be padded again by this [statusBarsPadding] modifier.
  *
  * When used, the [WindowInsets][android.view.WindowInsets] will be consumed.
  *
@@ -137,9 +132,8 @@
  * will be excluded from the padding. [WindowInsets.Companion.ime] will be
  * [consumed][consumeWindowInsets] for child layouts as well.
  *
- * For example, if a parent layout uses [navigationBarsPadding],
- * the area that the parent layout pads for the status bars will not be padded again by this
- * [imePadding] modifier.
+ * For example, if a parent layout uses [navigationBarsPadding], the area that the parent layout
+ * pads for the status bars will not be padded again by this [imePadding] modifier.
  *
  * When used, the [WindowInsets][android.view.WindowInsets] will be consumed.
  *
@@ -155,9 +149,8 @@
  * will be excluded from the padding. [WindowInsets.Companion.navigationBars] will be
  * [consumed][consumeWindowInsets] for child layouts as well.
  *
- * For example, if a parent layout uses [systemBarsPadding], the
- * area that the parent layout pads for the status bars will not be padded again by this
- * [navigationBarsPadding] modifier.
+ * For example, if a parent layout uses [systemBarsPadding], the area that the parent layout pads
+ * for the status bars will not be padded again by this [navigationBarsPadding] modifier.
  *
  * When used, the [WindowInsets][android.view.WindowInsets] will be consumed.
  *
@@ -173,9 +166,8 @@
  * will be excluded from the padding. [WindowInsets.Companion.captionBar] will be
  * [consumed][consumeWindowInsets] for child layouts as well.
  *
- * For example, if a parent layout uses [displayCutoutPadding], the
- * area that the parent layout pads for the status bars will not be padded again by this
- * [captionBarPadding] modifier.
+ * For example, if a parent layout uses [displayCutoutPadding], the area that the parent layout pads
+ * for the status bars will not be padded again by this [captionBarPadding] modifier.
  *
  * When used, the [WindowInsets][android.view.WindowInsets] will be consumed.
  *
@@ -191,9 +183,8 @@
  * will be excluded from the padding. [WindowInsets.Companion.waterfall] will be
  * [consumed][consumeWindowInsets] for child layouts as well.
  *
- * For example, if a parent layout uses [systemGesturesPadding],
- * the area that the parent layout pads for the status bars will not be padded again by this
- * [waterfallPadding] modifier.
+ * For example, if a parent layout uses [systemGesturesPadding], the area that the parent layout
+ * pads for the status bars will not be padded again by this [waterfallPadding] modifier.
  *
  * When used, the [WindowInsets][android.view.WindowInsets] will be consumed.
  *
@@ -209,9 +200,8 @@
  * will be excluded from the padding. [WindowInsets.Companion.systemGestures] will be
  * [consumed][consumeWindowInsets] for child layouts as well.
  *
- * For example, if a parent layout uses [waterfallPadding], the
- * area that the parent layout pads for the status bars will not be padded again by this
- * [systemGesturesPadding] modifier.
+ * For example, if a parent layout uses [waterfallPadding], the area that the parent layout pads for
+ * the status bars will not be padded again by this [systemGesturesPadding] modifier.
  *
  * When used, the [WindowInsets][android.view.WindowInsets] will be consumed.
  *
@@ -228,9 +218,9 @@
  * will be excluded from the padding. [WindowInsets.Companion.mandatorySystemGestures] will be
  * [consumed][consumeWindowInsets] for child layouts as well.
  *
- * For example, if a parent layout uses [navigationBarsPadding],
- * the area that the parent layout pads for the status bars will not be padded again by this
- * [mandatorySystemGesturesPadding] modifier.
+ * For example, if a parent layout uses [navigationBarsPadding], the area that the parent layout
+ * pads for the status bars will not be padded again by this [mandatorySystemGesturesPadding]
+ * modifier.
  *
  * When used, the [WindowInsets][android.view.WindowInsets] will be consumed.
  *
@@ -246,10 +236,11 @@
 private inline fun Modifier.windowInsetsPadding(
     noinline inspectorInfo: InspectorInfo.() -> Unit,
     crossinline insetsCalculation: WindowInsetsHolder.() -> WindowInsets
-): Modifier = composed(inspectorInfo) {
-    val composeInsets = WindowInsetsHolder.current()
-    remember(composeInsets) {
-        val insets = composeInsets.insetsCalculation()
-        InsetsPaddingModifier(insets)
+): Modifier =
+    composed(inspectorInfo) {
+        val composeInsets = WindowInsetsHolder.current()
+        remember(composeInsets) {
+            val insets = composeInsets.insetsCalculation()
+            InsetsPaddingModifier(insets)
+        }
     }
-}
diff --git a/compose/foundation/foundation-layout/src/androidUnitTest/kotlin/androidx/compose/foundation/layout/WindowInsetsTest.kt b/compose/foundation/foundation-layout/src/androidUnitTest/kotlin/androidx/compose/foundation/layout/WindowInsetsTest.kt
index 4574782..c9dfb64 100644
--- a/compose/foundation/foundation-layout/src/androidUnitTest/kotlin/androidx/compose/foundation/layout/WindowInsetsTest.kt
+++ b/compose/foundation/foundation-layout/src/androidUnitTest/kotlin/androidx/compose/foundation/layout/WindowInsetsTest.kt
@@ -98,9 +98,8 @@
     fun fixedDpInsets_toString() {
         val insets = WindowInsets(10.dp, 11.dp, 12.dp, 13.dp)
 
-        assertThat(insets.toString()).isEqualTo(
-            "Insets(left=10.0.dp, top=11.0.dp, right=12.0.dp, bottom=13.0.dp)"
-        )
+        assertThat(insets.toString())
+            .isEqualTo("Insets(left=10.0.dp, top=11.0.dp, right=12.0.dp, bottom=13.0.dp)")
     }
 
     @Test
@@ -119,10 +118,11 @@
         val first = WindowInsets(10, 11, 12, 13)
         val second = WindowInsets(5, 20, 14, 2)
         val union = first.union(second)
-        assertThat(union.toString()).isEqualTo(
-            "(Insets(left=10, top=11, right=12, bottom=13) ∪ " +
-                "Insets(left=5, top=20, right=14, bottom=2))"
-        )
+        assertThat(union.toString())
+            .isEqualTo(
+                "(Insets(left=10, top=11, right=12, bottom=13) ∪ " +
+                    "Insets(left=5, top=20, right=14, bottom=2))"
+            )
     }
 
     @Test
@@ -141,10 +141,11 @@
         val first = WindowInsets(10, 11, 12, 13)
         val second = WindowInsets(5, 20, 14, 2)
         val exclude = first.exclude(second)
-        assertThat(exclude.toString()).isEqualTo(
-            "(Insets(left=10, top=11, right=12, bottom=13) - " +
-                "Insets(left=5, top=20, right=14, bottom=2))"
-        )
+        assertThat(exclude.toString())
+            .isEqualTo(
+                "(Insets(left=10, top=11, right=12, bottom=13) - " +
+                    "Insets(left=5, top=20, right=14, bottom=2))"
+            )
     }
 
     @Test
@@ -163,10 +164,11 @@
         val first = WindowInsets(10, 11, 12, 13)
         val second = WindowInsets(5, 20, 14, 2)
         val add = first.add(second)
-        assertThat(add.toString()).isEqualTo(
-            "(Insets(left=10, top=11, right=12, bottom=13) + " +
-                "Insets(left=5, top=20, right=14, bottom=2))"
-        )
+        assertThat(add.toString())
+            .isEqualTo(
+                "(Insets(left=10, top=11, right=12, bottom=13) + " +
+                    "Insets(left=5, top=20, right=14, bottom=2))"
+            )
     }
 
     @Test
@@ -182,12 +184,13 @@
 
     @Test
     fun limitInsets_toString() {
-        val insets = WindowInsets(10, 11, 12, 13)
-            .only(WindowInsetsSides.Start + WindowInsetsSides.Vertical)
-        assertThat(insets.toString()).isEqualTo(
-            "(Insets(left=10, top=11, right=12, bottom=13) only " +
-                "WindowInsetsSides(Start+Top+Bottom))"
-        )
+        val insets =
+            WindowInsets(10, 11, 12, 13).only(WindowInsetsSides.Start + WindowInsetsSides.Vertical)
+        assertThat(insets.toString())
+            .isEqualTo(
+                "(Insets(left=10, top=11, right=12, bottom=13) only " +
+                    "WindowInsetsSides(Start+Top+Bottom))"
+            )
     }
 
     @Test
@@ -263,8 +266,9 @@
 
     @Test
     fun plus() {
-        val insets = WindowInsets(10, 11, 12, 13)
-            .only(WindowInsetsSides.Vertical + WindowInsetsSides.Horizontal)
+        val insets =
+            WindowInsets(10, 11, 12, 13)
+                .only(WindowInsetsSides.Vertical + WindowInsetsSides.Horizontal)
         assertThat(insets.getLeft(density, LayoutDirection.Ltr)).isEqualTo(10)
         assertThat(insets.getTop(density)).isEqualTo(11)
         assertThat(insets.getRight(density, LayoutDirection.Ltr)).isEqualTo(12)
@@ -273,9 +277,8 @@
 
     @Test
     fun insetsValues_toString() {
-        assertThat(InsetsValues(1, 2, 3, 4).toString()).isEqualTo(
-            "InsetsValues(left=1, top=2, right=3, bottom=4)"
-        )
+        assertThat(InsetsValues(1, 2, 3, 4).toString())
+            .isEqualTo("InsetsValues(left=1, top=2, right=3, bottom=4)")
     }
 
     @Test
@@ -320,17 +323,13 @@
         val density = Density(2f)
         val layoutDirection = LayoutDirection.Ltr
         val readValues = mutableListOf<Any>()
-        Snapshot.observe(readObserver = {
-            readValues += it
-        }) {
+        Snapshot.observe(readObserver = { readValues += it }) {
             insets.getLeft(density, layoutDirection)
         }
         assertThat(readValues).hasSize(1)
 
         val writeValues = mutableListOf<Any>()
-        Snapshot.observe(writeObserver = {
-            writeValues += it
-        }) {
+        Snapshot.observe(writeObserver = { writeValues += it }) {
             insets.insets = WindowInsets(1, 2, 3, 4)
         }
         Snapshot.sendApplyNotifications()
diff --git a/compose/foundation/foundation-layout/src/commonMain/kotlin/androidx/compose/foundation/layout/AlignmentLine.kt b/compose/foundation/foundation-layout/src/commonMain/kotlin/androidx/compose/foundation/layout/AlignmentLine.kt
index ca7cfe7..4a646db 100644
--- a/compose/foundation/foundation-layout/src/commonMain/kotlin/androidx/compose/foundation/layout/AlignmentLine.kt
+++ b/compose/foundation/foundation-layout/src/commonMain/kotlin/androidx/compose/foundation/layout/AlignmentLine.kt
@@ -36,30 +36,28 @@
 import kotlin.math.max
 
 /**
- * A [Modifier] that can add padding to position the content according to specified distances
- * from its bounds to an [alignment line][AlignmentLine]. Whether the positioning is vertical
- * or horizontal is defined by the orientation of the given [alignmentLine] (if the line is
- * horizontal, [before] and [after] will refer to distances from top and bottom, otherwise they
- * will refer to distances from start and end). The opposite axis sizing and positioning will
- * remain unaffected.
- * The modified layout will try to include the required padding, subject to the incoming max
- * layout constraints, such that the distance from its bounds to the [alignmentLine] of the
- * content will be [before] and [after], respectively. When the max constraints do not allow
- * this, satisfying the [before] requirement will have priority over [after]. When the modified
- * layout is min constrained in the affected layout direction and the padded layout is smaller
- * than the constraint, the modified layout will satisfy the min constraint and the content will
- * be positioned to satisfy the [before] requirement if specified, or the [after] requirement
- * otherwise.
+ * A [Modifier] that can add padding to position the content according to specified distances from
+ * its bounds to an [alignment line][AlignmentLine]. Whether the positioning is vertical or
+ * horizontal is defined by the orientation of the given [alignmentLine] (if the line is horizontal,
+ * [before] and [after] will refer to distances from top and bottom, otherwise they will refer to
+ * distances from start and end). The opposite axis sizing and positioning will remain unaffected.
+ * The modified layout will try to include the required padding, subject to the incoming max layout
+ * constraints, such that the distance from its bounds to the [alignmentLine] of the content will be
+ * [before] and [after], respectively. When the max constraints do not allow this, satisfying the
+ * [before] requirement will have priority over [after]. When the modified layout is min constrained
+ * in the affected layout direction and the padded layout is smaller than the constraint, the
+ * modified layout will satisfy the min constraint and the content will be positioned to satisfy the
+ * [before] requirement if specified, or the [after] requirement otherwise.
  *
  * @param alignmentLine the alignment line relative to which the padding is defined
  * @param before the distance between the container's top edge and the horizontal alignment line, or
- * the container's start edge and the vertical alignment line
+ *   the container's start edge and the vertical alignment line
  * @param after the distance between the container's bottom edge and the horizontal alignment line,
- * or the container's end edge and the vertical alignment line
- *
+ *   or the container's end edge and the vertical alignment line
  * @see paddingFromBaseline
  *
  * Example usage:
+ *
  * @sample androidx.compose.foundation.layout.samples.PaddingFromSample
  */
 @Stable
@@ -67,45 +65,44 @@
     alignmentLine: AlignmentLine,
     before: Dp = Dp.Unspecified,
     after: Dp = Dp.Unspecified
-): Modifier = this.then(
-    AlignmentLineOffsetDpElement(
-        alignmentLine,
-        before,
-        after,
-        debugInspectorInfo {
-            name = "paddingFrom"
-            properties["alignmentLine"] = alignmentLine
-            properties["before"] = before
-            properties["after"] = after
-        }
+): Modifier =
+    this.then(
+        AlignmentLineOffsetDpElement(
+            alignmentLine,
+            before,
+            after,
+            debugInspectorInfo {
+                name = "paddingFrom"
+                properties["alignmentLine"] = alignmentLine
+                properties["before"] = before
+                properties["after"] = after
+            }
+        )
     )
-)
 
 /**
- * A [Modifier] that can add padding to position the content according to specified distances
- * from its bounds to an [alignment line][AlignmentLine]. Whether the positioning is vertical
- * or horizontal is defined by the orientation of the given [alignmentLine] (if the line is
- * horizontal, [before] and [after] will refer to distances from top and bottom, otherwise they
- * will refer to distances from start and end). The opposite axis sizing and positioning will
- * remain unaffected.
- * The modified layout will try to include the required padding, subject to the incoming max
- * layout constraints, such that the distance from its bounds to the [alignmentLine] of the
- * content will be [before] and [after], respectively. When the max constraints do not allow
- * this, satisfying the [before] requirement will have priority over [after]. When the modified
- * layout is min constrained in the affected layout direction and the padded layout is smaller
- * than the constraint, the modified layout will satisfy the min constraint and the content will
- * be positioned to satisfy the [before] requirement if specified, or the [after] requirement
- * otherwise.
+ * A [Modifier] that can add padding to position the content according to specified distances from
+ * its bounds to an [alignment line][AlignmentLine]. Whether the positioning is vertical or
+ * horizontal is defined by the orientation of the given [alignmentLine] (if the line is horizontal,
+ * [before] and [after] will refer to distances from top and bottom, otherwise they will refer to
+ * distances from start and end). The opposite axis sizing and positioning will remain unaffected.
+ * The modified layout will try to include the required padding, subject to the incoming max layout
+ * constraints, such that the distance from its bounds to the [alignmentLine] of the content will be
+ * [before] and [after], respectively. When the max constraints do not allow this, satisfying the
+ * [before] requirement will have priority over [after]. When the modified layout is min constrained
+ * in the affected layout direction and the padded layout is smaller than the constraint, the
+ * modified layout will satisfy the min constraint and the content will be positioned to satisfy the
+ * [before] requirement if specified, or the [after] requirement otherwise.
  *
  * @param alignmentLine the alignment line relative to which the padding is defined
  * @param before the distance between the container's top edge and the horizontal alignment line, or
- * the container's start edge and the vertical alignment line
+ *   the container's start edge and the vertical alignment line
  * @param after the distance between the container's bottom edge and the horizontal alignment line,
- * or the container's end edge and the vertical alignment line
- *
+ *   or the container's end edge and the vertical alignment line
  * @see paddingFromBaseline
  *
  * Example usage:
+ *
  * @sample androidx.compose.foundation.layout.samples.PaddingFromSample
  */
 @Stable
@@ -113,26 +110,26 @@
     alignmentLine: AlignmentLine,
     before: TextUnit = TextUnit.Unspecified,
     after: TextUnit = TextUnit.Unspecified
-): Modifier = this.then(
-    AlignmentLineOffsetTextUnitElement(
-        alignmentLine,
-        before,
-        after,
-        debugInspectorInfo {
-            name = "paddingFrom"
-            properties["alignmentLine"] = alignmentLine
-            properties["before"] = before
-            properties["after"] = after
-        }
+): Modifier =
+    this.then(
+        AlignmentLineOffsetTextUnitElement(
+            alignmentLine,
+            before,
+            after,
+            debugInspectorInfo {
+                name = "paddingFrom"
+                properties["alignmentLine"] = alignmentLine
+                properties["before"] = before
+                properties["after"] = after
+            }
+        )
     )
-)
 
 /**
- * A [Modifier] that positions the content in a layout such that the distance from the top
- * of the layout to the [baseline of the first line of text in the content][FirstBaseline]
- * is [top], and the distance from the
- * [baseline of the last line of text in the content][LastBaseline] to the bottom of the layout
- * is [bottom].
+ * A [Modifier] that positions the content in a layout such that the distance from the top of the
+ * layout to the [baseline of the first line of text in the content][FirstBaseline] is [top], and
+ * the distance from the [baseline of the last line of text in the content][LastBaseline] to the
+ * bottom of the layout is [bottom].
  *
  * When the modified layout is min height constrained and the padded layout is smaller than the
  * constraint, the modified layout will satisfy the min constraint and the content will be
@@ -141,31 +138,31 @@
  * @see paddingFrom
  *
  * Example usage:
+ *
  * @sample androidx.compose.foundation.layout.samples.PaddingFromBaselineSampleDp
  */
 @Stable
-fun Modifier.paddingFromBaseline(top: Dp = Dp.Unspecified, bottom: Dp = Dp.Unspecified) = this
-    .then(
-        if (top != Dp.Unspecified) {
-            Modifier.paddingFrom(FirstBaseline, before = top)
-        } else {
-            Modifier
-        }
-    )
-    .then(
-        if (bottom != Dp.Unspecified) {
-            Modifier.paddingFrom(LastBaseline, after = bottom)
-        } else {
-            Modifier
-        }
-    )
+fun Modifier.paddingFromBaseline(top: Dp = Dp.Unspecified, bottom: Dp = Dp.Unspecified) =
+    this.then(
+            if (top != Dp.Unspecified) {
+                Modifier.paddingFrom(FirstBaseline, before = top)
+            } else {
+                Modifier
+            }
+        )
+        .then(
+            if (bottom != Dp.Unspecified) {
+                Modifier.paddingFrom(LastBaseline, after = bottom)
+            } else {
+                Modifier
+            }
+        )
 
 /**
- * A [Modifier] that positions the content in a layout such that the distance from the top
- * of the layout to the [baseline of the first line of text in the content][FirstBaseline]
- * is [top], and the distance from the
- * [baseline of the last line of text in the content][LastBaseline] to the bottom of the layout
- * is [bottom].
+ * A [Modifier] that positions the content in a layout such that the distance from the top of the
+ * layout to the [baseline of the first line of text in the content][FirstBaseline] is [top], and
+ * the distance from the [baseline of the last line of text in the content][LastBaseline] to the
+ * bottom of the layout is [bottom].
  *
  * When the modified layout is min height constrained and the padded layout is smaller than the
  * constraint, the modified layout will satisfy the min constraint and the content will be
@@ -174,19 +171,21 @@
  * @see paddingFrom
  *
  * Example usage:
+ *
  * @sample androidx.compose.foundation.layout.samples.PaddingFromBaselineSampleTextUnit
  */
 @Stable
 fun Modifier.paddingFromBaseline(
     top: TextUnit = TextUnit.Unspecified,
     bottom: TextUnit = TextUnit.Unspecified
-) = this
-    .then(
-        if (!top.isUnspecified) Modifier.paddingFrom(FirstBaseline, before = top) else Modifier
-    )
-    .then(
-        if (!bottom.isUnspecified) Modifier.paddingFrom(LastBaseline, after = bottom) else Modifier
-    )
+) =
+    this.then(
+            if (!top.isUnspecified) Modifier.paddingFrom(FirstBaseline, before = top) else Modifier
+        )
+        .then(
+            if (!bottom.isUnspecified) Modifier.paddingFrom(LastBaseline, after = bottom)
+            else Modifier
+        )
 
 private class AlignmentLineOffsetDpElement(
     val alignmentLine: AlignmentLine,
@@ -204,11 +203,7 @@
     }
 
     override fun create(): AlignmentLineOffsetDpNode {
-        return AlignmentLineOffsetDpNode(
-            alignmentLine,
-            before,
-            after
-        )
+        return AlignmentLineOffsetDpNode(alignmentLine, before, after)
     }
 
     override fun update(node: AlignmentLineOffsetDpNode) {
@@ -259,11 +254,7 @@
     val inspectorInfo: InspectorInfo.() -> Unit
 ) : ModifierNodeElement<AlignmentLineOffsetTextUnitNode>() {
     override fun create(): AlignmentLineOffsetTextUnitNode {
-        return AlignmentLineOffsetTextUnitNode(
-            alignmentLine,
-            before,
-            after
-        )
+        return AlignmentLineOffsetTextUnitNode(alignmentLine, before, after)
     }
 
     override fun hashCode(): Int {
@@ -319,47 +310,56 @@
     measurable: Measurable,
     constraints: Constraints
 ): MeasureResult {
-    val placeable = measurable.measure(
-        // Loose constraints perpendicular on the alignment line.
-        if (alignmentLine.horizontal) constraints.copy(minHeight = 0)
-        else constraints.copy(minWidth = 0)
-    )
-    val linePosition = placeable[alignmentLine].let {
-        if (it != AlignmentLine.Unspecified) it else 0
-    }
+    val placeable =
+        measurable.measure(
+            // Loose constraints perpendicular on the alignment line.
+            if (alignmentLine.horizontal) constraints.copy(minHeight = 0)
+            else constraints.copy(minWidth = 0)
+        )
+    val linePosition =
+        placeable[alignmentLine].let { if (it != AlignmentLine.Unspecified) it else 0 }
     val axis = if (alignmentLine.horizontal) placeable.height else placeable.width
     val axisMax = if (alignmentLine.horizontal) constraints.maxHeight else constraints.maxWidth
     // Compute padding required to satisfy the total before and after offsets.
     val paddingBefore =
-        ((if (before != Dp.Unspecified) before.roundToPx() else 0) - linePosition)
-            .coerceIn(0, axisMax - axis)
+        ((if (before != Dp.Unspecified) before.roundToPx() else 0) - linePosition).coerceIn(
+            0,
+            axisMax - axis
+        )
     val paddingAfter =
-        ((if (after != Dp.Unspecified) after.roundToPx() else 0) - axis + linePosition)
-            .coerceIn(0, axisMax - axis - paddingBefore)
+        ((if (after != Dp.Unspecified) after.roundToPx() else 0) - axis + linePosition).coerceIn(
+            0,
+            axisMax - axis - paddingBefore
+        )
 
-    val width = if (alignmentLine.horizontal) {
-        placeable.width
-    } else {
-        max(paddingBefore + placeable.width + paddingAfter, constraints.minWidth)
-    }
-    val height = if (alignmentLine.horizontal) {
-        max(paddingBefore + placeable.height + paddingAfter, constraints.minHeight)
-    } else {
-        placeable.height
-    }
+    val width =
+        if (alignmentLine.horizontal) {
+            placeable.width
+        } else {
+            max(paddingBefore + placeable.width + paddingAfter, constraints.minWidth)
+        }
+    val height =
+        if (alignmentLine.horizontal) {
+            max(paddingBefore + placeable.height + paddingAfter, constraints.minHeight)
+        } else {
+            placeable.height
+        }
     return layout(width, height) {
-        val x = when {
-            alignmentLine.horizontal -> 0
-            before != Dp.Unspecified -> paddingBefore
-            else -> width - paddingAfter - placeable.width
-        }
-        val y = when {
-            !alignmentLine.horizontal -> 0
-            before != Dp.Unspecified -> paddingBefore
-            else -> height - paddingAfter - placeable.height
-        }
+        val x =
+            when {
+                alignmentLine.horizontal -> 0
+                before != Dp.Unspecified -> paddingBefore
+                else -> width - paddingAfter - placeable.width
+            }
+        val y =
+            when {
+                !alignmentLine.horizontal -> 0
+                before != Dp.Unspecified -> paddingBefore
+                else -> height - paddingAfter - placeable.height
+            }
         placeable.placeRelative(x, y)
     }
 }
 
-private val AlignmentLine.horizontal: Boolean get() = this is HorizontalAlignmentLine
+private val AlignmentLine.horizontal: Boolean
+    get() = this is HorizontalAlignmentLine
diff --git a/compose/foundation/foundation-layout/src/commonMain/kotlin/androidx/compose/foundation/layout/Arrangement.kt b/compose/foundation/foundation-layout/src/commonMain/kotlin/androidx/compose/foundation/layout/Arrangement.kt
index 25a14a3..5d0d423 100644
--- a/compose/foundation/foundation-layout/src/commonMain/kotlin/androidx/compose/foundation/layout/Arrangement.kt
+++ b/compose/foundation/foundation-layout/src/commonMain/kotlin/androidx/compose/foundation/layout/Arrangement.kt
@@ -28,14 +28,14 @@
 import kotlin.math.min
 
 /**
- * Used to specify the arrangement of the layout's children in layouts like [Row] or [Column] in
- * the main axis direction (horizontal and vertical, respectively).
+ * Used to specify the arrangement of the layout's children in layouts like [Row] or [Column] in the
+ * main axis direction (horizontal and vertical, respectively).
  *
- * Below is an illustration of different horizontal arrangements in [Row]s:
- * ![Row arrangements](https://developer.android.com/images/reference/androidx/compose/foundation/layout/row_arrangement_visualization.gif)
+ * Below is an illustration of different horizontal arrangements in [Row]s: ![Row
+ * arrangements](https://developer.android.com/images/reference/androidx/compose/foundation/layout/row_arrangement_visualization.gif)
  *
- * Different vertical arrangements in [Column]s:
- * ![Column arrangements](https://developer.android.com/images/reference/androidx/compose/foundation/layout/column_arrangement_visualization.gif)
+ * Different vertical arrangements in [Column]s: ![Column
+ * arrangements](https://developer.android.com/images/reference/androidx/compose/foundation/layout/column_arrangement_visualization.gif)
  */
 @Immutable
 object Arrangement {
@@ -45,10 +45,9 @@
     @Stable
     @JvmDefaultWithCompatibility
     interface Horizontal {
-        /**
-         * Spacing that should be added between any two adjacent layout children.
-         */
-        val spacing get() = 0.dp
+        /** Spacing that should be added between any two adjacent layout children. */
+        val spacing
+            get() = 0.dp
 
         /**
          * Horizontally places the layout children.
@@ -56,9 +55,9 @@
          * @param totalSize Available space that can be occupied by the children, in pixels.
          * @param sizes An array of sizes of all children, in pixels.
          * @param layoutDirection A layout direction, left-to-right or right-to-left, of the parent
-         * layout that should be taken into account when determining positions of the children.
-         * @param outPositions An array of the size of [sizes] that returns the calculated
-         * positions relative to the left, in pixels.
+         *   layout that should be taken into account when determining positions of the children.
+         * @param outPositions An array of the size of [sizes] that returns the calculated positions
+         *   relative to the left, in pixels.
          */
         fun Density.arrange(
             totalSize: Int,
@@ -74,24 +73,19 @@
     @Stable
     @JvmDefaultWithCompatibility
     interface Vertical {
-        /**
-         * Spacing that should be added between any two adjacent layout children.
-         */
-        val spacing get() = 0.dp
+        /** Spacing that should be added between any two adjacent layout children. */
+        val spacing
+            get() = 0.dp
 
         /**
          * Vertically places the layout children.
          *
          * @param totalSize Available space that can be occupied by the children, in pixels.
          * @param sizes An array of sizes of all children, in pixels.
-         * @param outPositions An array of the size of [sizes] that returns the calculated
-         * positions relative to the top, in pixels.
+         * @param outPositions An array of the size of [sizes] that returns the calculated positions
+         *   relative to the top, in pixels.
          */
-        fun Density.arrange(
-            totalSize: Int,
-            sizes: IntArray,
-            outPositions: IntArray
-        )
+        fun Density.arrange(totalSize: Int, sizes: IntArray, outPositions: IntArray)
     }
 
     /**
@@ -102,206 +96,196 @@
     @Stable
     @JvmDefaultWithCompatibility
     interface HorizontalOrVertical : Horizontal, Vertical {
-        /**
-         * Spacing that should be added between any two adjacent layout children.
-         */
-        override val spacing: Dp get() = 0.dp
+        /** Spacing that should be added between any two adjacent layout children. */
+        override val spacing: Dp
+            get() = 0.dp
     }
 
     /**
      * Place children horizontally such that they are as close as possible to the beginning of the
-     * horizontal axis (left if the layout direction is LTR, right otherwise).
-     * Visually: 123#### for LTR and ####321.
+     * horizontal axis (left if the layout direction is LTR, right otherwise). Visually: 123#### for
+     * LTR and ####321.
      */
     @Stable
-    val Start = object : Horizontal {
-        override fun Density.arrange(
-            totalSize: Int,
-            sizes: IntArray,
-            layoutDirection: LayoutDirection,
-            outPositions: IntArray
-        ) = if (layoutDirection == LayoutDirection.Ltr) {
-            placeLeftOrTop(sizes, outPositions, reverseInput = false)
-        } else {
-            placeRightOrBottom(totalSize, sizes, outPositions, reverseInput = true)
-        }
+    val Start =
+        object : Horizontal {
+            override fun Density.arrange(
+                totalSize: Int,
+                sizes: IntArray,
+                layoutDirection: LayoutDirection,
+                outPositions: IntArray
+            ) =
+                if (layoutDirection == LayoutDirection.Ltr) {
+                    placeLeftOrTop(sizes, outPositions, reverseInput = false)
+                } else {
+                    placeRightOrBottom(totalSize, sizes, outPositions, reverseInput = true)
+                }
 
-        override fun toString() = "Arrangement#Start"
-    }
+            override fun toString() = "Arrangement#Start"
+        }
 
     /**
      * Place children horizontally such that they are as close as possible to the end of the main
-     * axis.
-     * Visually: ####123 for LTR and 321#### for RTL.
+     * axis. Visually: ####123 for LTR and 321#### for RTL.
      */
     @Stable
-    val End = object : Horizontal {
-        override fun Density.arrange(
-            totalSize: Int,
-            sizes: IntArray,
-            layoutDirection: LayoutDirection,
-            outPositions: IntArray
-        ) = if (layoutDirection == LayoutDirection.Ltr) {
-            placeRightOrBottom(totalSize, sizes, outPositions, reverseInput = false)
-        } else {
-            placeLeftOrTop(sizes, outPositions, reverseInput = true)
-        }
+    val End =
+        object : Horizontal {
+            override fun Density.arrange(
+                totalSize: Int,
+                sizes: IntArray,
+                layoutDirection: LayoutDirection,
+                outPositions: IntArray
+            ) =
+                if (layoutDirection == LayoutDirection.Ltr) {
+                    placeRightOrBottom(totalSize, sizes, outPositions, reverseInput = false)
+                } else {
+                    placeLeftOrTop(sizes, outPositions, reverseInput = true)
+                }
 
-        override fun toString() = "Arrangement#End"
-    }
+            override fun toString() = "Arrangement#End"
+        }
 
     /**
      * Place children vertically such that they are as close as possible to the top of the main
-     * axis.
-     * Visually: (top) 123#### (bottom)
+     * axis. Visually: (top) 123#### (bottom)
      */
     @Stable
-    val Top = object : Vertical {
-        override fun Density.arrange(
-            totalSize: Int,
-            sizes: IntArray,
-            outPositions: IntArray
-        ) = placeLeftOrTop(sizes, outPositions, reverseInput = false)
+    val Top =
+        object : Vertical {
+            override fun Density.arrange(totalSize: Int, sizes: IntArray, outPositions: IntArray) =
+                placeLeftOrTop(sizes, outPositions, reverseInput = false)
 
-        override fun toString() = "Arrangement#Top"
-    }
+            override fun toString() = "Arrangement#Top"
+        }
 
     /**
      * Place children vertically such that they are as close as possible to the bottom of the main
-     * axis.
-     * Visually: (top) ####123 (bottom)
+     * axis. Visually: (top) ####123 (bottom)
      */
     @Stable
-    val Bottom = object : Vertical {
-        override fun Density.arrange(
-            totalSize: Int,
-            sizes: IntArray,
-            outPositions: IntArray
-        ) = placeRightOrBottom(totalSize, sizes, outPositions, reverseInput = false)
+    val Bottom =
+        object : Vertical {
+            override fun Density.arrange(totalSize: Int, sizes: IntArray, outPositions: IntArray) =
+                placeRightOrBottom(totalSize, sizes, outPositions, reverseInput = false)
 
-        override fun toString() = "Arrangement#Bottom"
-    }
+            override fun toString() = "Arrangement#Bottom"
+        }
 
     /**
      * Place children such that they are as close as possible to the middle of the main axis.
      * Visually: ##123## for LTR and ##321## for RTL.
      */
     @Stable
-    val Center = object : HorizontalOrVertical {
-        override val spacing = 0.dp
+    val Center =
+        object : HorizontalOrVertical {
+            override val spacing = 0.dp
 
-        override fun Density.arrange(
-            totalSize: Int,
-            sizes: IntArray,
-            layoutDirection: LayoutDirection,
-            outPositions: IntArray
-        ) = if (layoutDirection == LayoutDirection.Ltr) {
-            placeCenter(totalSize, sizes, outPositions, reverseInput = false)
-        } else {
-            placeCenter(totalSize, sizes, outPositions, reverseInput = true)
+            override fun Density.arrange(
+                totalSize: Int,
+                sizes: IntArray,
+                layoutDirection: LayoutDirection,
+                outPositions: IntArray
+            ) =
+                if (layoutDirection == LayoutDirection.Ltr) {
+                    placeCenter(totalSize, sizes, outPositions, reverseInput = false)
+                } else {
+                    placeCenter(totalSize, sizes, outPositions, reverseInput = true)
+                }
+
+            override fun Density.arrange(totalSize: Int, sizes: IntArray, outPositions: IntArray) =
+                placeCenter(totalSize, sizes, outPositions, reverseInput = false)
+
+            override fun toString() = "Arrangement#Center"
         }
 
-        override fun Density.arrange(
-            totalSize: Int,
-            sizes: IntArray,
-            outPositions: IntArray
-        ) = placeCenter(totalSize, sizes, outPositions, reverseInput = false)
-
-        override fun toString() = "Arrangement#Center"
-    }
-
     /**
-     * Place children such that they are spaced evenly across the main axis, including free
-     * space before the first child and after the last child.
-     * Visually: #1#2#3# for LTR and #3#2#1# for RTL.
+     * Place children such that they are spaced evenly across the main axis, including free space
+     * before the first child and after the last child. Visually: #1#2#3# for LTR and #3#2#1# for
+     * RTL.
      */
     @Stable
-    val SpaceEvenly = object : HorizontalOrVertical {
-        override val spacing = 0.dp
+    val SpaceEvenly =
+        object : HorizontalOrVertical {
+            override val spacing = 0.dp
 
-        override fun Density.arrange(
-            totalSize: Int,
-            sizes: IntArray,
-            layoutDirection: LayoutDirection,
-            outPositions: IntArray
-        ) = if (layoutDirection == LayoutDirection.Ltr) {
-            placeSpaceEvenly(totalSize, sizes, outPositions, reverseInput = false)
-        } else {
-            placeSpaceEvenly(totalSize, sizes, outPositions, reverseInput = true)
+            override fun Density.arrange(
+                totalSize: Int,
+                sizes: IntArray,
+                layoutDirection: LayoutDirection,
+                outPositions: IntArray
+            ) =
+                if (layoutDirection == LayoutDirection.Ltr) {
+                    placeSpaceEvenly(totalSize, sizes, outPositions, reverseInput = false)
+                } else {
+                    placeSpaceEvenly(totalSize, sizes, outPositions, reverseInput = true)
+                }
+
+            override fun Density.arrange(totalSize: Int, sizes: IntArray, outPositions: IntArray) =
+                placeSpaceEvenly(totalSize, sizes, outPositions, reverseInput = false)
+
+            override fun toString() = "Arrangement#SpaceEvenly"
         }
 
-        override fun Density.arrange(
-            totalSize: Int,
-            sizes: IntArray,
-            outPositions: IntArray
-        ) = placeSpaceEvenly(totalSize, sizes, outPositions, reverseInput = false)
-
-        override fun toString() = "Arrangement#SpaceEvenly"
-    }
-
     /**
-     * Place children such that they are spaced evenly across the main axis, without free
-     * space before the first child or after the last child.
-     * Visually: 1##2##3 for LTR or 3##2##1 for RTL.
+     * Place children such that they are spaced evenly across the main axis, without free space
+     * before the first child or after the last child. Visually: 1##2##3 for LTR or 3##2##1 for RTL.
      */
     @Stable
-    val SpaceBetween = object : HorizontalOrVertical {
-        override val spacing = 0.dp
+    val SpaceBetween =
+        object : HorizontalOrVertical {
+            override val spacing = 0.dp
 
-        override fun Density.arrange(
-            totalSize: Int,
-            sizes: IntArray,
-            layoutDirection: LayoutDirection,
-            outPositions: IntArray
-        ) = if (layoutDirection == LayoutDirection.Ltr) {
-            placeSpaceBetween(totalSize, sizes, outPositions, reverseInput = false)
-        } else {
-            placeSpaceBetween(totalSize, sizes, outPositions, reverseInput = true)
+            override fun Density.arrange(
+                totalSize: Int,
+                sizes: IntArray,
+                layoutDirection: LayoutDirection,
+                outPositions: IntArray
+            ) =
+                if (layoutDirection == LayoutDirection.Ltr) {
+                    placeSpaceBetween(totalSize, sizes, outPositions, reverseInput = false)
+                } else {
+                    placeSpaceBetween(totalSize, sizes, outPositions, reverseInput = true)
+                }
+
+            override fun Density.arrange(totalSize: Int, sizes: IntArray, outPositions: IntArray) =
+                placeSpaceBetween(totalSize, sizes, outPositions, reverseInput = false)
+
+            override fun toString() = "Arrangement#SpaceBetween"
         }
 
-        override fun Density.arrange(
-            totalSize: Int,
-            sizes: IntArray,
-            outPositions: IntArray
-        ) = placeSpaceBetween(totalSize, sizes, outPositions, reverseInput = false)
-
-        override fun toString() = "Arrangement#SpaceBetween"
-    }
-
     /**
-     * Place children such that they are spaced evenly across the main axis, including free
-     * space before the first child and after the last child, but half the amount of space
-     * existing otherwise between two consecutive children.
-     * Visually: #1##2##3# for LTR and #3##2##1# for RTL
+     * Place children such that they are spaced evenly across the main axis, including free space
+     * before the first child and after the last child, but half the amount of space existing
+     * otherwise between two consecutive children. Visually: #1##2##3# for LTR and #3##2##1# for RTL
      */
     @Stable
-    val SpaceAround = object : HorizontalOrVertical {
-        override val spacing = 0.dp
+    val SpaceAround =
+        object : HorizontalOrVertical {
+            override val spacing = 0.dp
 
-        override fun Density.arrange(
-            totalSize: Int,
-            sizes: IntArray,
-            layoutDirection: LayoutDirection,
-            outPositions: IntArray
-        ) = if (layoutDirection == LayoutDirection.Ltr) {
-            placeSpaceAround(totalSize, sizes, outPositions, reverseInput = false)
-        } else {
-            placeSpaceAround(totalSize, sizes, outPositions, reverseInput = true)
+            override fun Density.arrange(
+                totalSize: Int,
+                sizes: IntArray,
+                layoutDirection: LayoutDirection,
+                outPositions: IntArray
+            ) =
+                if (layoutDirection == LayoutDirection.Ltr) {
+                    placeSpaceAround(totalSize, sizes, outPositions, reverseInput = false)
+                } else {
+                    placeSpaceAround(totalSize, sizes, outPositions, reverseInput = true)
+                }
+
+            override fun Density.arrange(totalSize: Int, sizes: IntArray, outPositions: IntArray) =
+                placeSpaceAround(totalSize, sizes, outPositions, reverseInput = false)
+
+            override fun toString() = "Arrangement#SpaceAround"
         }
 
-        override fun Density.arrange(
-            totalSize: Int,
-            sizes: IntArray,
-            outPositions: IntArray
-        ) = placeSpaceAround(totalSize, sizes, outPositions, reverseInput = false)
-
-        override fun toString() = "Arrangement#SpaceAround"
-    }
-
     /**
      * Place children such that each two adjacent ones are spaced by a fixed [space] distance across
-     * the main axis. The spacing will be subtracted from the available space that the children
-     * can occupy. The [space] can be negative, in which case children will overlap.
+     * the main axis. The spacing will be subtracted from the available space that the children can
+     * occupy. The [space] can be negative, in which case children will overlap.
      *
      * To change alignment of the spaced children horizontally or vertically, use [spacedBy]
      * overloads with `alignment` parameter.
@@ -316,10 +300,10 @@
 
     /**
      * Place children horizontally such that each two adjacent ones are spaced by a fixed [space]
-     * distance. The spacing will be subtracted from the available width that the children
-     * can occupy. An [alignment] can be specified to align the spaced children horizontally
-     * inside the parent, in case there is empty width remaining. The [space] can be negative,
-     * in which case children will overlap.
+     * distance. The spacing will be subtracted from the available width that the children can
+     * occupy. An [alignment] can be specified to align the spaced children horizontally inside the
+     * parent, in case there is empty width remaining. The [space] can be negative, in which case
+     * children will overlap.
      *
      * @param space The space between adjacent children.
      * @param alignment The alignment of the spaced children inside the parent.
@@ -332,10 +316,10 @@
 
     /**
      * Place children vertically such that each two adjacent ones are spaced by a fixed [space]
-     * distance. The spacing will be subtracted from the available height that the children
-     * can occupy. An [alignment] can be specified to align the spaced children vertically
-     * inside the parent, in case there is empty height remaining. The [space] can be negative,
-     * in which case children will overlap.
+     * distance. The spacing will be subtracted from the available height that the children can
+     * occupy. An [alignment] can be specified to align the spaced children vertically inside the
+     * parent, in case there is empty height remaining. The [space] can be negative, in which case
+     * children will overlap.
      *
      * @param space The space between adjacent children.
      * @param alignment The alignment of the spaced children inside the parent.
@@ -345,8 +329,8 @@
         SpacedAligned(space, false) { size, _ -> alignment.align(0, size) }
 
     /**
-     * Place children horizontally one next to the other and align the obtained group
-     * according to an [alignment].
+     * Place children horizontally one next to the other and align the obtained group according to
+     * an [alignment].
      *
      * @param alignment The alignment of the children inside the parent.
      */
@@ -357,8 +341,8 @@
         }
 
     /**
-     * Place children vertically one next to the other and align the obtained group
-     * according to an [alignment].
+     * Place children vertically one next to the other and align the obtained group according to an
+     * [alignment].
      *
      * @param alignment The alignment of the children inside the parent.
      */
@@ -373,149 +357,161 @@
          * the [Row].
          *
          * Unlike [Arrangement.Start], when the layout direction is RTL, the children will not be
-         * mirrored and as such children will appear in the order they are composed inside the [Row].
+         * mirrored and as such children will appear in the order they are composed inside the
+         * [Row].
          *
          * Visually: 123####
          */
         @Stable
-        val Left = object : Horizontal {
-            override fun Density.arrange(
-                totalSize: Int,
-                sizes: IntArray,
-                layoutDirection: LayoutDirection,
-                outPositions: IntArray
-            ) = placeLeftOrTop(sizes, outPositions, reverseInput = false)
+        val Left =
+            object : Horizontal {
+                override fun Density.arrange(
+                    totalSize: Int,
+                    sizes: IntArray,
+                    layoutDirection: LayoutDirection,
+                    outPositions: IntArray
+                ) = placeLeftOrTop(sizes, outPositions, reverseInput = false)
 
-            override fun toString() = "AbsoluteArrangement#Left"
-        }
+                override fun toString() = "AbsoluteArrangement#Left"
+            }
 
         /**
          * Place children such that they are as close as possible to the middle of the [Row].
          *
          * Unlike [Arrangement.Center], when the layout direction is RTL, the children will not be
-         * mirrored and as such children will appear in the order they are composed inside the [Row].
+         * mirrored and as such children will appear in the order they are composed inside the
+         * [Row].
          *
          * Visually: ##123##
          */
         @Stable
-        val Center = object : Horizontal {
-            override fun Density.arrange(
-                totalSize: Int,
-                sizes: IntArray,
-                layoutDirection: LayoutDirection,
-                outPositions: IntArray
-            ) = placeCenter(totalSize, sizes, outPositions, reverseInput = false)
+        val Center =
+            object : Horizontal {
+                override fun Density.arrange(
+                    totalSize: Int,
+                    sizes: IntArray,
+                    layoutDirection: LayoutDirection,
+                    outPositions: IntArray
+                ) = placeCenter(totalSize, sizes, outPositions, reverseInput = false)
 
-            override fun toString() = "AbsoluteArrangement#Center"
-        }
+                override fun toString() = "AbsoluteArrangement#Center"
+            }
 
         /**
          * Place children horizontally such that they are as close as possible to the right edge of
          * the [Row].
          *
          * Unlike [Arrangement.End], when the layout direction is RTL, the children will not be
-         * mirrored and as such children will appear in the order they are composed inside the [Row].
+         * mirrored and as such children will appear in the order they are composed inside the
+         * [Row].
          *
          * Visually: ####123
          */
         @Stable
-        val Right = object : Horizontal {
-            override fun Density.arrange(
-                totalSize: Int,
-                sizes: IntArray,
-                layoutDirection: LayoutDirection,
-                outPositions: IntArray
-            ) = placeRightOrBottom(totalSize, sizes, outPositions, reverseInput = false)
+        val Right =
+            object : Horizontal {
+                override fun Density.arrange(
+                    totalSize: Int,
+                    sizes: IntArray,
+                    layoutDirection: LayoutDirection,
+                    outPositions: IntArray
+                ) = placeRightOrBottom(totalSize, sizes, outPositions, reverseInput = false)
 
-            override fun toString() = "AbsoluteArrangement#Right"
-        }
+                override fun toString() = "AbsoluteArrangement#Right"
+            }
 
         /**
-         * Place children such that they are spaced evenly across the main axis, without free
-         * space before the first child or after the last child.
+         * Place children such that they are spaced evenly across the main axis, without free space
+         * before the first child or after the last child.
          *
-         * Unlike [Arrangement.SpaceBetween], when the layout direction is RTL, the children will not be
-         * mirrored and as such children will appear in the order they are composed inside the [Row].
+         * Unlike [Arrangement.SpaceBetween], when the layout direction is RTL, the children will
+         * not be mirrored and as such children will appear in the order they are composed inside
+         * the [Row].
          *
          * Visually: 1##2##3
          */
         @Stable
-        val SpaceBetween = object : Horizontal {
-            override fun Density.arrange(
-                totalSize: Int,
-                sizes: IntArray,
-                layoutDirection: LayoutDirection,
-                outPositions: IntArray
-            ) = placeSpaceBetween(totalSize, sizes, outPositions, reverseInput = false)
+        val SpaceBetween =
+            object : Horizontal {
+                override fun Density.arrange(
+                    totalSize: Int,
+                    sizes: IntArray,
+                    layoutDirection: LayoutDirection,
+                    outPositions: IntArray
+                ) = placeSpaceBetween(totalSize, sizes, outPositions, reverseInput = false)
 
-            override fun toString() = "AbsoluteArrangement#SpaceBetween"
-        }
+                override fun toString() = "AbsoluteArrangement#SpaceBetween"
+            }
 
         /**
          * Place children such that they are spaced evenly across the main axis, including free
          * space before the first child and after the last child.
          *
-         * Unlike [Arrangement.SpaceEvenly], when the layout direction is RTL, the children will not be
-         * mirrored and as such children will appear in the order they are composed inside the [Row].
+         * Unlike [Arrangement.SpaceEvenly], when the layout direction is RTL, the children will not
+         * be mirrored and as such children will appear in the order they are composed inside the
+         * [Row].
          *
          * Visually: #1#2#3#
          */
         @Stable
-        val SpaceEvenly = object : Horizontal {
-            override fun Density.arrange(
-                totalSize: Int,
-                sizes: IntArray,
-                layoutDirection: LayoutDirection,
-                outPositions: IntArray
-            ) = placeSpaceEvenly(totalSize, sizes, outPositions, reverseInput = false)
+        val SpaceEvenly =
+            object : Horizontal {
+                override fun Density.arrange(
+                    totalSize: Int,
+                    sizes: IntArray,
+                    layoutDirection: LayoutDirection,
+                    outPositions: IntArray
+                ) = placeSpaceEvenly(totalSize, sizes, outPositions, reverseInput = false)
 
-            override fun toString() = "AbsoluteArrangement#SpaceEvenly"
-        }
+                override fun toString() = "AbsoluteArrangement#SpaceEvenly"
+            }
 
         /**
-         * Place children such that they are spaced evenly horizontally, including free
-         * space before the first child and after the last child, but half the amount of space
-         * existing otherwise between two consecutive children.
+         * Place children such that they are spaced evenly horizontally, including free space before
+         * the first child and after the last child, but half the amount of space existing otherwise
+         * between two consecutive children.
          *
-         * Unlike [Arrangement.SpaceAround], when the layout direction is RTL, the children will not be
-         * mirrored and as such children will appear in the order they are composed inside the [Row].
+         * Unlike [Arrangement.SpaceAround], when the layout direction is RTL, the children will not
+         * be mirrored and as such children will appear in the order they are composed inside the
+         * [Row].
          *
          * Visually: #1##2##3##4#
          */
         @Stable
-        val SpaceAround = object : Horizontal {
-            override fun Density.arrange(
-                totalSize: Int,
-                sizes: IntArray,
-                layoutDirection: LayoutDirection,
-                outPositions: IntArray
-            ) = placeSpaceAround(totalSize, sizes, outPositions, reverseInput = false)
+        val SpaceAround =
+            object : Horizontal {
+                override fun Density.arrange(
+                    totalSize: Int,
+                    sizes: IntArray,
+                    layoutDirection: LayoutDirection,
+                    outPositions: IntArray
+                ) = placeSpaceAround(totalSize, sizes, outPositions, reverseInput = false)
 
-            override fun toString() = "AbsoluteArrangement#SpaceAround"
-        }
+                override fun toString() = "AbsoluteArrangement#SpaceAround"
+            }
 
         /**
-         * Place children such that each two adjacent ones are spaced by a fixed [space] distance across
-         * the main axis. The spacing will be subtracted from the available space that the children
-         * can occupy.
+         * Place children such that each two adjacent ones are spaced by a fixed [space] distance
+         * across the main axis. The spacing will be subtracted from the available space that the
+         * children can occupy.
          *
          * Unlike [Arrangement.spacedBy], when the layout direction is RTL, the children will not be
-         * mirrored and as such children will appear in the order they are composed inside the [Row].
+         * mirrored and as such children will appear in the order they are composed inside the
+         * [Row].
          *
          * @param space The space between adjacent children.
          */
-        @Stable
-        fun spacedBy(space: Dp): HorizontalOrVertical =
-            SpacedAligned(space, false, null)
+        @Stable fun spacedBy(space: Dp): HorizontalOrVertical = SpacedAligned(space, false, null)
 
         /**
-         * Place children horizontally such that each two adjacent ones are spaced by a fixed [space]
-         * distance. The spacing will be subtracted from the available width that the children
-         * can occupy. An [alignment] can be specified to align the spaced children horizontally
-         * inside the parent, in case there is empty width remaining.
+         * Place children horizontally such that each two adjacent ones are spaced by a fixed
+         * [space] distance. The spacing will be subtracted from the available width that the
+         * children can occupy. An [alignment] can be specified to align the spaced children
+         * horizontally inside the parent, in case there is empty width remaining.
          *
          * Unlike [Arrangement.spacedBy], when the layout direction is RTL, the children will not be
-         * mirrored and as such children will appear in the order they are composed inside the [Row].
+         * mirrored and as such children will appear in the order they are composed inside the
+         * [Row].
          *
          * @param space The space between adjacent children.
          * @param alignment The alignment of the spaced children inside the parent.
@@ -528,12 +524,13 @@
 
         /**
          * Place children vertically such that each two adjacent ones are spaced by a fixed [space]
-         * distance. The spacing will be subtracted from the available height that the children
-         * can occupy. An [alignment] can be specified to align the spaced children vertically
-         * inside the parent, in case there is empty height remaining.
+         * distance. The spacing will be subtracted from the available height that the children can
+         * occupy. An [alignment] can be specified to align the spaced children vertically inside
+         * the parent, in case there is empty height remaining.
          *
          * Unlike [Arrangement.spacedBy], when the layout direction is RTL, the children will not be
-         * mirrored and as such children will appear in the order they are composed inside the [Row].
+         * mirrored and as such children will appear in the order they are composed inside the
+         * [Row].
          *
          * @param space The space between adjacent children.
          * @param alignment The alignment of the spaced children inside the parent.
@@ -543,11 +540,12 @@
             SpacedAligned(space, false) { size, _ -> alignment.align(0, size) }
 
         /**
-         * Place children horizontally one next to the other and align the obtained group
-         * according to an [alignment].
+         * Place children horizontally one next to the other and align the obtained group according
+         * to an [alignment].
          *
          * Unlike [Arrangement.aligned], when the layout direction is RTL, the children will not be
-         * mirrored and as such children will appear in the order they are composed inside the [Row].
+         * mirrored and as such children will appear in the order they are composed inside the
+         * [Row].
          *
          * @param alignment The alignment of the children inside the parent.
          */
@@ -559,8 +557,8 @@
     }
 
     /**
-     * Arrangement with spacing between adjacent children and alignment for the spaced group.
-     * Should not be instantiated directly, use [spacedBy] instead.
+     * Arrangement with spacing between adjacent children and alignment for the spaced group. Should
+     * not be instantiated directly, use [spacedBy] instead.
      */
     @Immutable
     internal data class SpacedAligned(
@@ -598,11 +596,8 @@
             }
         }
 
-        override fun Density.arrange(
-            totalSize: Int,
-            sizes: IntArray,
-            outPositions: IntArray
-        ) = arrange(totalSize, sizes, LayoutDirection.Ltr, outPositions)
+        override fun Density.arrange(totalSize: Int, sizes: IntArray, outPositions: IntArray) =
+            arrange(totalSize, sizes, LayoutDirection.Ltr, outPositions)
 
         override fun toString() =
             "${if (rtlMirror) "" else "Absolute"}Arrangement#spacedAligned($space, $alignment)"
@@ -690,11 +685,12 @@
         reverseInput: Boolean
     ) {
         val consumedSize = size.fold(0) { a, b -> a + b }
-        val gapSize = if (size.isNotEmpty()) {
-            (totalSize - consumedSize).toFloat() / size.size
-        } else {
-            0f
-        }
+        val gapSize =
+            if (size.isNotEmpty()) {
+                (totalSize - consumedSize).toFloat() / size.size
+            } else {
+                0f
+            }
         var current = gapSize / 2
         size.forEachIndexed(reverseInput) { index, it ->
             outPosition[index] = current.fastRoundToInt()
diff --git a/compose/foundation/foundation-layout/src/commonMain/kotlin/androidx/compose/foundation/layout/AspectRatio.kt b/compose/foundation/foundation-layout/src/commonMain/kotlin/androidx/compose/foundation/layout/AspectRatio.kt
index 0e84e13..e4e42e4 100644
--- a/compose/foundation/foundation-layout/src/commonMain/kotlin/androidx/compose/foundation/layout/AspectRatio.kt
+++ b/compose/foundation/foundation-layout/src/commonMain/kotlin/androidx/compose/foundation/layout/AspectRatio.kt
@@ -38,35 +38,36 @@
  * incoming constraints in the following order: [Constraints.maxWidth], [Constraints.maxHeight],
  * [Constraints.minWidth], [Constraints.minHeight] if [matchHeightConstraintsFirst] is `false`
  * (which is the default), or [Constraints.maxHeight], [Constraints.maxWidth],
- * [Constraints.minHeight], [Constraints.minWidth] if [matchHeightConstraintsFirst] is `true`.
- * The size in the other dimension is determined by the aspect ratio. The combinations will be
- * tried in this order until one non-empty is found to satisfy the constraints. If no valid
- * size is obtained this way, it means that there is no non-empty size satisfying both
- * the constraints and the aspect ratio, so the constraints will not be respected
- * and the content will be sized such that the [Constraints.maxWidth] or [Constraints.maxHeight]
- * is matched (depending on [matchHeightConstraintsFirst]).
+ * [Constraints.minHeight], [Constraints.minWidth] if [matchHeightConstraintsFirst] is `true`. The
+ * size in the other dimension is determined by the aspect ratio. The combinations will be tried in
+ * this order until one non-empty is found to satisfy the constraints. If no valid size is obtained
+ * this way, it means that there is no non-empty size satisfying both the constraints and the aspect
+ * ratio, so the constraints will not be respected and the content will be sized such that the
+ * [Constraints.maxWidth] or [Constraints.maxHeight] is matched (depending on
+ * [matchHeightConstraintsFirst]).
  *
  * Example usage:
+ *
  * @sample androidx.compose.foundation.layout.samples.SimpleAspectRatio
  *
  * @param ratio the desired width/height positive ratio
  */
 @Stable
 fun Modifier.aspectRatio(
-    @FloatRange(from = 0.0, fromInclusive = false)
-    ratio: Float,
+    @FloatRange(from = 0.0, fromInclusive = false) ratio: Float,
     matchHeightConstraintsFirst: Boolean = false
-) = this.then(
-    AspectRatioElement(
-        ratio,
-        matchHeightConstraintsFirst,
-        debugInspectorInfo {
-            name = "aspectRatio"
-            properties["ratio"] = ratio
-            properties["matchHeightConstraintsFirst"] = matchHeightConstraintsFirst
-        }
+) =
+    this.then(
+        AspectRatioElement(
+            ratio,
+            matchHeightConstraintsFirst,
+            debugInspectorInfo {
+                name = "aspectRatio"
+                properties["ratio"] = ratio
+                properties["matchHeightConstraintsFirst"] = matchHeightConstraintsFirst
+            }
+        )
     )
-)
 
 private class AspectRatioElement(
     val aspectRatio: Float,
@@ -78,10 +79,7 @@
     }
 
     override fun create(): AspectRatioNode {
-        return AspectRatioNode(
-            aspectRatio,
-            matchHeightConstraintsFirst
-        )
+        return AspectRatioNode(aspectRatio, matchHeightConstraintsFirst)
     }
 
     override fun update(node: AspectRatioNode) {
@@ -89,7 +87,9 @@
         node.matchHeightConstraintsFirst = matchHeightConstraintsFirst
     }
 
-    override fun InspectorInfo.inspectableProperties() { inspectorInfo() }
+    override fun InspectorInfo.inspectableProperties() {
+        inspectorInfo()
+    }
 
     override fun equals(other: Any?): Boolean {
         if (this === other) return true
@@ -111,52 +111,55 @@
         constraints: Constraints
     ): MeasureResult {
         val size = constraints.findSize()
-        val wrappedConstraints = if (size != IntSize.Zero) {
-            Constraints.fixed(size.width, size.height)
-        } else {
-            constraints
-        }
+        val wrappedConstraints =
+            if (size != IntSize.Zero) {
+                Constraints.fixed(size.width, size.height)
+            } else {
+                constraints
+            }
         val placeable = measurable.measure(wrappedConstraints)
-        return layout(placeable.width, placeable.height) {
-            placeable.placeRelative(0, 0)
-        }
+        return layout(placeable.width, placeable.height) { placeable.placeRelative(0, 0) }
     }
 
     override fun IntrinsicMeasureScope.minIntrinsicWidth(
         measurable: IntrinsicMeasurable,
         height: Int
-    ) = if (height != Constraints.Infinity) {
-        (height * aspectRatio).fastRoundToInt()
-    } else {
-        measurable.minIntrinsicWidth(height)
-    }
+    ) =
+        if (height != Constraints.Infinity) {
+            (height * aspectRatio).fastRoundToInt()
+        } else {
+            measurable.minIntrinsicWidth(height)
+        }
 
     override fun IntrinsicMeasureScope.maxIntrinsicWidth(
         measurable: IntrinsicMeasurable,
         height: Int
-    ) = if (height != Constraints.Infinity) {
-        (height * aspectRatio).fastRoundToInt()
-    } else {
-        measurable.maxIntrinsicWidth(height)
-    }
+    ) =
+        if (height != Constraints.Infinity) {
+            (height * aspectRatio).fastRoundToInt()
+        } else {
+            measurable.maxIntrinsicWidth(height)
+        }
 
     override fun IntrinsicMeasureScope.minIntrinsicHeight(
         measurable: IntrinsicMeasurable,
         width: Int
-    ) = if (width != Constraints.Infinity) {
-        (width / aspectRatio).fastRoundToInt()
-    } else {
-        measurable.minIntrinsicHeight(width)
-    }
+    ) =
+        if (width != Constraints.Infinity) {
+            (width / aspectRatio).fastRoundToInt()
+        } else {
+            measurable.minIntrinsicHeight(width)
+        }
 
     override fun IntrinsicMeasureScope.maxIntrinsicHeight(
         measurable: IntrinsicMeasurable,
         width: Int
-    ) = if (width != Constraints.Infinity) {
-        (width / aspectRatio).fastRoundToInt()
-    } else {
-        measurable.maxIntrinsicHeight(width)
-    }
+    ) =
+        if (width != Constraints.Infinity) {
+            (width / aspectRatio).fastRoundToInt()
+        } else {
+            measurable.maxIntrinsicHeight(width)
+        }
 
     private fun Constraints.findSize(): IntSize {
         if (!matchHeightConstraintsFirst) {
diff --git a/compose/foundation/foundation-layout/src/commonMain/kotlin/androidx/compose/foundation/layout/Box.kt b/compose/foundation/foundation-layout/src/commonMain/kotlin/androidx/compose/foundation/layout/Box.kt
index 419ec49..6cfbf58 100644
--- a/compose/foundation/foundation-layout/src/commonMain/kotlin/androidx/compose/foundation/layout/Box.kt
+++ b/compose/foundation/foundation-layout/src/commonMain/kotlin/androidx/compose/foundation/layout/Box.kt
@@ -40,21 +40,20 @@
 import kotlin.math.max
 
 /**
- * A layout composable with [content].
- * The [Box] will size itself to fit the content, subject to the incoming constraints.
- * When children are smaller than the parent, by default they will be positioned inside
- * the [Box] according to the [contentAlignment]. For individually specifying the alignments
- * of the children layouts, use the [BoxScope.align] modifier.
- * By default, the content will be measured without the [Box]'s incoming min constraints,
- * unless [propagateMinConstraints] is `true`. As an example, setting [propagateMinConstraints] to
- * `true` can be useful when the [Box] has content on which modifiers cannot be specified
- * directly and setting a min size on the content of the [Box] is needed. If
- * [propagateMinConstraints] is set to `true`, the min size set on the [Box] will also be
- * applied to the content, whereas otherwise the min size will only apply to the [Box].
- * When the content has more than one layout child the layout children will be stacked one
- * on top of the other (positioned as explained above) in the composition order.
+ * A layout composable with [content]. The [Box] will size itself to fit the content, subject to the
+ * incoming constraints. When children are smaller than the parent, by default they will be
+ * positioned inside the [Box] according to the [contentAlignment]. For individually specifying the
+ * alignments of the children layouts, use the [BoxScope.align] modifier. By default, the content
+ * will be measured without the [Box]'s incoming min constraints, unless [propagateMinConstraints]
+ * is `true`. As an example, setting [propagateMinConstraints] to `true` can be useful when the
+ * [Box] has content on which modifiers cannot be specified directly and setting a min size on the
+ * content of the [Box] is needed. If [propagateMinConstraints] is set to `true`, the min size set
+ * on the [Box] will also be applied to the content, whereas otherwise the min size will only apply
+ * to the [Box]. When the content has more than one layout child the layout children will be stacked
+ * one on top of the other (positioned as explained above) in the composition order.
  *
  * Example usage:
+ *
  * @sample androidx.compose.foundation.layout.samples.SimpleBox
  *
  * @param modifier The modifier to be applied to the layout.
@@ -77,22 +76,21 @@
     )
 }
 
-private fun cacheFor(
-    propagateMinConstraints: Boolean
-) = HashMap<Alignment, MeasurePolicy>(9).apply {
-    fun putAlignment(it: Alignment) {
-        put(it, BoxMeasurePolicy(it, propagateMinConstraints))
+private fun cacheFor(propagateMinConstraints: Boolean) =
+    HashMap<Alignment, MeasurePolicy>(9).apply {
+        fun putAlignment(it: Alignment) {
+            put(it, BoxMeasurePolicy(it, propagateMinConstraints))
+        }
+        putAlignment(Alignment.TopStart)
+        putAlignment(Alignment.TopCenter)
+        putAlignment(Alignment.TopEnd)
+        putAlignment(Alignment.CenterStart)
+        putAlignment(Alignment.Center)
+        putAlignment(Alignment.CenterEnd)
+        putAlignment(Alignment.BottomStart)
+        putAlignment(Alignment.BottomCenter)
+        putAlignment(Alignment.BottomEnd)
     }
-    putAlignment(Alignment.TopStart)
-    putAlignment(Alignment.TopCenter)
-    putAlignment(Alignment.TopEnd)
-    putAlignment(Alignment.CenterStart)
-    putAlignment(Alignment.Center)
-    putAlignment(Alignment.CenterEnd)
-    putAlignment(Alignment.BottomStart)
-    putAlignment(Alignment.BottomCenter)
-    putAlignment(Alignment.BottomEnd)
-}
 
 private val cache1 = cacheFor(true)
 private val cache2 = cacheFor(false)
@@ -111,13 +109,14 @@
 internal fun rememberBoxMeasurePolicy(
     alignment: Alignment,
     propagateMinConstraints: Boolean
-): MeasurePolicy = if (alignment == Alignment.TopStart && !propagateMinConstraints) {
-    DefaultBoxMeasurePolicy
-} else {
-    remember(alignment, propagateMinConstraints) {
-        BoxMeasurePolicy(alignment, propagateMinConstraints)
+): MeasurePolicy =
+    if (alignment == Alignment.TopStart && !propagateMinConstraints) {
+        DefaultBoxMeasurePolicy
+    } else {
+        remember(alignment, propagateMinConstraints) {
+            BoxMeasurePolicy(alignment, propagateMinConstraints)
+        }
     }
-}
 
 private val DefaultBoxMeasurePolicy: MeasurePolicy = BoxMeasurePolicy(Alignment.TopStart, false)
 
@@ -130,17 +129,15 @@
         constraints: Constraints
     ): MeasureResult {
         if (measurables.isEmpty()) {
-            return layout(
-                constraints.minWidth,
-                constraints.minHeight
-            ) {}
+            return layout(constraints.minWidth, constraints.minHeight) {}
         }
 
-        val contentConstraints = if (propagateMinConstraints) {
-            constraints
-        } else {
-            constraints.copy(minWidth = 0, minHeight = 0)
-        }
+        val contentConstraints =
+            if (propagateMinConstraints) {
+                constraints
+            } else {
+                constraints.copy(minWidth = 0, minHeight = 0)
+            }
 
         if (measurables.size == 1) {
             val measurable = measurables[0]
@@ -154,9 +151,10 @@
             } else {
                 boxWidth = constraints.minWidth
                 boxHeight = constraints.minHeight
-                placeable = measurable.measure(
-                    Constraints.fixed(constraints.minWidth, constraints.minHeight)
-                )
+                placeable =
+                    measurable.measure(
+                        Constraints.fixed(constraints.minWidth, constraints.minHeight)
+                    )
             }
             return layout(boxWidth, boxHeight) {
                 placeInBox(placeable, measurable, layoutDirection, boxWidth, boxHeight, alignment)
@@ -182,12 +180,13 @@
         // Now measure match parent size children, if any.
         if (hasMatchParentSizeChildren) {
             // The infinity check is needed for default intrinsic measurements.
-            val matchParentSizeConstraints = Constraints(
-                minWidth = if (boxWidth != Constraints.Infinity) boxWidth else 0,
-                minHeight = if (boxHeight != Constraints.Infinity) boxHeight else 0,
-                maxWidth = boxWidth,
-                maxHeight = boxHeight
-            )
+            val matchParentSizeConstraints =
+                Constraints(
+                    minWidth = if (boxWidth != Constraints.Infinity) boxWidth else 0,
+                    minHeight = if (boxHeight != Constraints.Infinity) boxHeight else 0,
+                    maxWidth = boxWidth,
+                    maxHeight = boxHeight
+                )
             measurables.fastForEachIndexed { index, measurable ->
                 if (measurable.matchesParentSize) {
                     placeables[index] = measurable.measure(matchParentSizeConstraints)
@@ -215,17 +214,18 @@
     alignment: Alignment
 ) {
     val childAlignment = measurable.boxChildDataNode?.alignment ?: alignment
-    val position = childAlignment.align(
-        IntSize(placeable.width, placeable.height),
-        IntSize(boxWidth, boxHeight),
-        layoutDirection
-    )
+    val position =
+        childAlignment.align(
+            IntSize(placeable.width, placeable.height),
+            IntSize(boxWidth, boxHeight),
+            layoutDirection
+        )
     placeable.place(position)
 }
 
 /**
- * A box with no content that can participate in layout, drawing, pointer input
- * due to the [modifier] applied to it.
+ * A box with no content that can participate in layout, drawing, pointer input due to the
+ * [modifier] applied to it.
  *
  * Example usage:
  *
@@ -242,66 +242,65 @@
     layout(constraints.minWidth, constraints.minHeight) {}
 }
 
-/**
- * A BoxScope provides a scope for the children of [Box] and [BoxWithConstraints].
- */
+/** A BoxScope provides a scope for the children of [Box] and [BoxWithConstraints]. */
 @LayoutScopeMarker
 @Immutable
 interface BoxScope {
     /**
-     * Pull the content element to a specific [Alignment] within the [Box]. This alignment will
-     * have priority over the [Box]'s `alignment` parameter.
+     * Pull the content element to a specific [Alignment] within the [Box]. This alignment will have
+     * priority over the [Box]'s `alignment` parameter.
      */
-    @Stable
-    fun Modifier.align(alignment: Alignment): Modifier
+    @Stable fun Modifier.align(alignment: Alignment): Modifier
 
     /**
-     * Size the element to match the size of the [Box] after all other content elements have
-     * been measured.
+     * Size the element to match the size of the [Box] after all other content elements have been
+     * measured.
      *
      * The element using this modifier does not take part in defining the size of the [Box].
      * Instead, it matches the size of the [Box] after all other children (not using
-     * matchParentSize() modifier) have been measured to obtain the [Box]'s size.
-     * In contrast, a general-purpose [Modifier.fillMaxSize] modifier, which makes an element
-     * occupy all available space, will take part in defining the size of the [Box]. Consequently,
-     * using it for an element inside a [Box] will make the [Box] itself always fill the
-     * available space.
+     * matchParentSize() modifier) have been measured to obtain the [Box]'s size. In contrast, a
+     * general-purpose [Modifier.fillMaxSize] modifier, which makes an element occupy all available
+     * space, will take part in defining the size of the [Box]. Consequently, using it for an
+     * element inside a [Box] will make the [Box] itself always fill the available space.
      */
-    @Stable
-    fun Modifier.matchParentSize(): Modifier
+    @Stable fun Modifier.matchParentSize(): Modifier
 }
 
 internal object BoxScopeInstance : BoxScope {
     @Stable
-    override fun Modifier.align(alignment: Alignment) = this.then(
-        BoxChildDataElement(
-            alignment = alignment,
-            matchParentSize = false,
-            inspectorInfo = debugInspectorInfo {
-                name = "align"
-                value = alignment
-            }
-        ))
+    override fun Modifier.align(alignment: Alignment) =
+        this.then(
+            BoxChildDataElement(
+                alignment = alignment,
+                matchParentSize = false,
+                inspectorInfo =
+                    debugInspectorInfo {
+                        name = "align"
+                        value = alignment
+                    }
+            )
+        )
 
     @Stable
-    override fun Modifier.matchParentSize() = this.then(
-        BoxChildDataElement(
-            alignment = Alignment.Center,
-            matchParentSize = true,
-            inspectorInfo = debugInspectorInfo {
-                name = "matchParentSize"
-            }
-        ))
+    override fun Modifier.matchParentSize() =
+        this.then(
+            BoxChildDataElement(
+                alignment = Alignment.Center,
+                matchParentSize = true,
+                inspectorInfo = debugInspectorInfo { name = "matchParentSize" }
+            )
+        )
 }
 
-private val Measurable.boxChildDataNode: BoxChildDataNode? get() = parentData as? BoxChildDataNode
-private val Measurable.matchesParentSize: Boolean get() = boxChildDataNode?.matchParentSize ?: false
+private val Measurable.boxChildDataNode: BoxChildDataNode?
+    get() = parentData as? BoxChildDataNode
+private val Measurable.matchesParentSize: Boolean
+    get() = boxChildDataNode?.matchParentSize ?: false
 
 private class BoxChildDataElement(
     val alignment: Alignment,
     val matchParentSize: Boolean,
     val inspectorInfo: InspectorInfo.() -> Unit
-
 ) : ModifierNodeElement<BoxChildDataNode>() {
     override fun create(): BoxChildDataNode {
         return BoxChildDataNode(alignment, matchParentSize)
diff --git a/compose/foundation/foundation-layout/src/commonMain/kotlin/androidx/compose/foundation/layout/BoxWithConstraints.kt b/compose/foundation/foundation-layout/src/commonMain/kotlin/androidx/compose/foundation/layout/BoxWithConstraints.kt
index d4325f3..7a0fdca 100644
--- a/compose/foundation/foundation-layout/src/commonMain/kotlin/androidx/compose/foundation/layout/BoxWithConstraints.kt
+++ b/compose/foundation/foundation-layout/src/commonMain/kotlin/androidx/compose/foundation/layout/BoxWithConstraints.kt
@@ -29,25 +29,23 @@
 
 /**
  * A composable that defines its own content according to the available space, based on the incoming
- * constraints or the current [LayoutDirection].
- * Example usage:
+ * constraints or the current [LayoutDirection]. Example usage:
+ *
  * @sample androidx.compose.foundation.layout.samples.BoxWithConstraintsSample
  *
- * The composable will compose the given children, and will position the resulting layout
- * elements in a parent layout which behaves similar to a [Box].
- * The layout will size itself to fit the content, subject to the incoming constraints.
- * When children are smaller than the parent, by default they will be positioned inside
- * the layout according to the [contentAlignment]. For individually specifying the alignments
- * of the children layouts, use the [BoxScope.align] modifier.
- * By default, the content will be measured without the [Box]'s incoming min constraints,
+ * The composable will compose the given children, and will position the resulting layout elements
+ * in a parent layout which behaves similar to a [Box]. The layout will size itself to fit the
+ * content, subject to the incoming constraints. When children are smaller than the parent, by
+ * default they will be positioned inside the layout according to the [contentAlignment]. For
+ * individually specifying the alignments of the children layouts, use the [BoxScope.align]
+ * modifier. By default, the content will be measured without the [Box]'s incoming min constraints,
  * unless [propagateMinConstraints] is `true`. As an example, setting [propagateMinConstraints] to
  * `true` can be useful when the [BoxWithConstraints] has content on which modifiers cannot be
  * specified directly and setting a min size on the content of the [BoxWithConstraints] is needed.
  * If [propagateMinConstraints] is set to `true`, the min size set on the [BoxWithConstraints] will
  * also be applied to the content, whereas otherwise the min size will only apply to the
- * [BoxWithConstraints].
- * When the content has more than one layout child the layout children will be stacked one
- * on top of the other (positioned as explained above) in the composition order.
+ * [BoxWithConstraints]. When the content has more than one layout child the layout children will be
+ * stacked one on top of the other (positioned as explained above) in the composition order.
  *
  * @param modifier Modifier to be applied to the layout.
  * @param contentAlignment The default alignment inside the [BoxWithConstraints].
@@ -60,8 +58,7 @@
     modifier: Modifier = Modifier,
     contentAlignment: Alignment = Alignment.TopStart,
     propagateMinConstraints: Boolean = false,
-    content:
-        @Composable @UiComposable BoxWithConstraintsScope.() -> Unit
+    content: @Composable @UiComposable BoxWithConstraintsScope.() -> Unit
 ) {
     val measurePolicy = maybeCachedBoxMeasurePolicy(contentAlignment, propagateMinConstraints)
     SubcomposeLayout(modifier) { constraints ->
@@ -71,9 +68,7 @@
     }
 }
 
-/**
- * Receiver scope being used by the children parameter of [BoxWithConstraints]
- */
+/** Receiver scope being used by the children parameter of [BoxWithConstraints] */
 @Stable
 interface BoxWithConstraintsScope : BoxScope {
     /**
@@ -112,12 +107,21 @@
     private val density: Density,
     override val constraints: Constraints
 ) : BoxWithConstraintsScope, BoxScope by BoxScopeInstance {
-    override val minWidth: Dp get() = with(density) { constraints.minWidth.toDp() }
-    override val maxWidth: Dp get() = with(density) {
-        if (constraints.hasBoundedWidth) constraints.maxWidth.toDp() else Dp.Infinity
-    }
-    override val minHeight: Dp get() = with(density) { constraints.minHeight.toDp() }
-    override val maxHeight: Dp get() = with(density) {
-        if (constraints.hasBoundedHeight) constraints.maxHeight.toDp() else Dp.Infinity
-    }
+    override val minWidth: Dp
+        get() = with(density) { constraints.minWidth.toDp() }
+
+    override val maxWidth: Dp
+        get() =
+            with(density) {
+                if (constraints.hasBoundedWidth) constraints.maxWidth.toDp() else Dp.Infinity
+            }
+
+    override val minHeight: Dp
+        get() = with(density) { constraints.minHeight.toDp() }
+
+    override val maxHeight: Dp
+        get() =
+            with(density) {
+                if (constraints.hasBoundedHeight) constraints.maxHeight.toDp() else Dp.Infinity
+            }
 }
diff --git a/compose/foundation/foundation-layout/src/commonMain/kotlin/androidx/compose/foundation/layout/Column.kt b/compose/foundation/foundation-layout/src/commonMain/kotlin/androidx/compose/foundation/layout/Column.kt
index dd2f5b2..d9b985a 100644
--- a/compose/foundation/foundation-layout/src/commonMain/kotlin/androidx/compose/foundation/layout/Column.kt
+++ b/compose/foundation/foundation-layout/src/commonMain/kotlin/androidx/compose/foundation/layout/Column.kt
@@ -37,17 +37,17 @@
 import androidx.compose.ui.unit.LayoutDirection
 
 /**
- * A layout composable that places its children in a vertical sequence. For a layout composable
- * that places its children in a horizontal sequence, see [Row]. Note that by default items do
- * not scroll; see `Modifier.verticalScroll` to add this behavior. For a vertically
- * scrollable list that only composes and lays out the currently visible items see `LazyColumn`.
+ * A layout composable that places its children in a vertical sequence. For a layout composable that
+ * places its children in a horizontal sequence, see [Row]. Note that by default items do not
+ * scroll; see `Modifier.verticalScroll` to add this behavior. For a vertically scrollable list that
+ * only composes and lays out the currently visible items see `LazyColumn`.
  *
- * The [Column] layout is able to assign children heights according to their weights provided
- * using the [ColumnScope.weight] modifier. If a child is not provided a weight, it will be
- * asked for its preferred height before the sizes of the children with weights are calculated
- * proportionally to their weight based on the remaining available space. Note that if the
- * [Column] is vertically scrollable or part of a vertically scrollable container, any provided
- * weights will be disregarded as the remaining available space will be infinite.
+ * The [Column] layout is able to assign children heights according to their weights provided using
+ * the [ColumnScope.weight] modifier. If a child is not provided a weight, it will be asked for its
+ * preferred height before the sizes of the children with weights are calculated proportionally to
+ * their weight based on the remaining available space. Note that if the [Column] is vertically
+ * scrollable or part of a vertically scrollable container, any provided weights will be disregarded
+ * as the remaining available space will be infinite.
  *
  * When none of its children have weights, a [Column] will be as small as possible to fit its
  * children one on top of the other. In order to change the height of the [Column], use the
@@ -59,11 +59,12 @@
  *
  * When the size of the [Column] is larger than the sum of its children sizes, a
  * [verticalArrangement] can be specified to define the positioning of the children inside the
- * [Column]. See [Arrangement] for available positioning behaviors; a custom arrangement can also
- * be defined using the constructor of [Arrangement]. Below is an illustration of different
- * vertical arrangements:
+ * [Column]. See [Arrangement] for available positioning behaviors; a custom arrangement can also be
+ * defined using the constructor of [Arrangement]. Below is an illustration of different vertical
+ * arrangements:
  *
- * ![Column arrangements](https://developer.android.com/images/reference/androidx/compose/foundation/layout/column_arrangement_visualization.gif)
+ * ![Column
+ * arrangements](https://developer.android.com/images/reference/androidx/compose/foundation/layout/column_arrangement_visualization.gif)
  *
  * Example usage:
  *
@@ -72,7 +73,6 @@
  * @param modifier The modifier to be applied to the Column.
  * @param verticalArrangement The vertical arrangement of the layout's children.
  * @param horizontalAlignment The horizontal alignment of the layout's children.
- *
  * @see Row
  * @see [androidx.compose.foundation.lazy.LazyColumn]
  */
@@ -92,10 +92,11 @@
 }
 
 @PublishedApi
-internal val DefaultColumnMeasurePolicy: MeasurePolicy = ColumnMeasurePolicy(
-    verticalArrangement = Arrangement.Top,
-    horizontalAlignment = Alignment.Start,
-)
+internal val DefaultColumnMeasurePolicy: MeasurePolicy =
+    ColumnMeasurePolicy(
+        verticalArrangement = Arrangement.Top,
+        horizontalAlignment = Alignment.Start,
+    )
 
 @PublishedApi
 @Composable
@@ -120,7 +121,9 @@
 ) : MeasurePolicy, RowColumnMeasurePolicy {
 
     override fun Placeable.mainAxisSize(): Int = height
+
     override fun Placeable.crossAxisSize(): Int = width
+
     override fun populateMainAxisPositions(
         mainAxisLayoutSize: Int,
         childrenMainAxisSize: IntArray,
@@ -128,11 +131,7 @@
         measureScope: MeasureScope
     ) {
         with(verticalArrangement) {
-            measureScope.arrange(
-                mainAxisLayoutSize,
-                childrenMainAxisSize,
-                mainAxisPositions
-            )
+            measureScope.arrange(mainAxisLayoutSize, childrenMainAxisSize, mainAxisPositions)
         }
     }
 
@@ -151,17 +150,18 @@
         return with(measureScope) {
             layout(crossAxisLayoutSize, mainAxisLayoutSize) {
                 placeables.forEachIndexed { i, placeable ->
-                    val crossAxisPosition = getCrossAxisPosition(
-                        placeable!!,
-                        placeable.rowColumnParentData,
-                        crossAxisLayoutSize,
-                        beforeCrossAxisAlignmentLine,
-                        measureScope.layoutDirection
-                    )
+                    val crossAxisPosition =
+                        getCrossAxisPosition(
+                            placeable!!,
+                            placeable.rowColumnParentData,
+                            crossAxisLayoutSize,
+                            beforeCrossAxisAlignmentLine,
+                            measureScope.layoutDirection
+                        )
                     placeable.place(
                         crossAxisPosition,
                         mainAxisPositions[i],
-                 )
+                    )
                 }
             }
         }
@@ -180,8 +180,7 @@
             layoutDirection = layoutDirection,
             placeable = placeable,
             beforeCrossAxisAlignmentLine = beforeCrossAxisAlignmentLine
-        ) ?: horizontalAlignment.align(0, crossAxisLayoutSize - placeable.width,
-            layoutDirection)
+        ) ?: horizontalAlignment.align(0, crossAxisLayoutSize - placeable.width, layoutDirection)
     }
 
     override fun createConstraints(
@@ -221,38 +220,42 @@
     override fun IntrinsicMeasureScope.minIntrinsicWidth(
         measurables: List<IntrinsicMeasurable>,
         height: Int
-    ) = IntrinsicMeasureBlocks.VerticalMinWidth(
-        measurables,
-        height,
-        verticalArrangement.spacing.roundToPx(),
-    )
+    ) =
+        IntrinsicMeasureBlocks.VerticalMinWidth(
+            measurables,
+            height,
+            verticalArrangement.spacing.roundToPx(),
+        )
 
     override fun IntrinsicMeasureScope.minIntrinsicHeight(
         measurables: List<IntrinsicMeasurable>,
         width: Int
-    ) = IntrinsicMeasureBlocks.VerticalMinHeight(
-        measurables,
-        width,
-        verticalArrangement.spacing.roundToPx(),
-    )
+    ) =
+        IntrinsicMeasureBlocks.VerticalMinHeight(
+            measurables,
+            width,
+            verticalArrangement.spacing.roundToPx(),
+        )
 
     override fun IntrinsicMeasureScope.maxIntrinsicWidth(
         measurables: List<IntrinsicMeasurable>,
         height: Int
-    ) = IntrinsicMeasureBlocks.VerticalMaxWidth(
-        measurables,
-        height,
-        verticalArrangement.spacing.roundToPx(),
-    )
+    ) =
+        IntrinsicMeasureBlocks.VerticalMaxWidth(
+            measurables,
+            height,
+            verticalArrangement.spacing.roundToPx(),
+        )
 
     override fun IntrinsicMeasureScope.maxIntrinsicHeight(
         measurables: List<IntrinsicMeasurable>,
         width: Int
-    ) = IntrinsicMeasureBlocks.VerticalMaxHeight(
-        measurables,
-        width,
-        verticalArrangement.spacing.roundToPx(),
-    )
+    ) =
+        IntrinsicMeasureBlocks.VerticalMaxHeight(
+            measurables,
+            width,
+            verticalArrangement.spacing.roundToPx(),
+        )
 }
 
 internal fun createColumnConstraints(
@@ -279,9 +282,7 @@
     }
 }
 
-/**
- * Scope for the children of [Column].
- */
+/** Scope for the children of [Column]. */
 @LayoutScopeMarker
 @Immutable
 @JvmDefaultWithCompatibility
@@ -289,24 +290,23 @@
     /**
      * Size the element's height proportional to its [weight] relative to other weighted sibling
      * elements in the [Column]. The parent will divide the vertical space remaining after measuring
-     * unweighted child elements and distribute it according to this weight.
-     * When [fill] is true, the element will be forced to occupy the whole height allocated to it.
-     * Otherwise, the element is allowed to be smaller - this will result in [Column] being smaller,
-     * as the unused allocated height will not be redistributed to other siblings.
+     * unweighted child elements and distribute it according to this weight. When [fill] is true,
+     * the element will be forced to occupy the whole height allocated to it. Otherwise, the element
+     * is allowed to be smaller - this will result in [Column] being smaller, as the unused
+     * allocated height will not be redistributed to other siblings.
      *
-     * In a [FlowColumn], when a weight is applied to an item, the item is scaled based on
-     * the number of weighted items that fall on the column it was placed in.
+     * In a [FlowColumn], when a weight is applied to an item, the item is scaled based on the
+     * number of weighted items that fall on the column it was placed in.
      *
-     * @param weight The proportional height to give to this element, as related to the total of
-     * all weighted siblings. Must be positive.
+     * @param weight The proportional height to give to this element, as related to the total of all
+     *   weighted siblings. Must be positive.
      * @param fill When `true`, the element will occupy the whole height allocated.
      *
      * @sample androidx.compose.foundation.layout.samples.SimpleColumn
      */
     @Stable
     fun Modifier.weight(
-        @FloatRange(from = 0.0, fromInclusive = false)
-        weight: Float,
+        @FloatRange(from = 0.0, fromInclusive = false) weight: Float,
         fill: Boolean = true
     ): Modifier
 
@@ -315,49 +315,45 @@
      * the [Column]'s `horizontalAlignment` parameter.
      *
      * Example usage:
+     *
      * @sample androidx.compose.foundation.layout.samples.SimpleAlignInColumn
      */
-    @Stable
-    fun Modifier.align(alignment: Alignment.Horizontal): Modifier
+    @Stable fun Modifier.align(alignment: Alignment.Horizontal): Modifier
 
     /**
      * Position the element horizontally such that its [alignmentLine] aligns with sibling elements
-     * also configured to [alignBy]. [alignBy] is a form of [align],
-     * so both modifiers will not work together if specified for the same layout.
-     * Within a [Column], all components with [alignBy] will align horizontally using
-     * the specified [VerticalAlignmentLine]s or values provided using the other
-     * [alignBy] overload, forming a sibling group.
-     * At least one element of the sibling group will be placed as it had [Alignment.Start] align
-     * in [Column], and the alignment of the other siblings will be then determined such that
-     * the alignment lines coincide. Note that if only one element in a [Column] has the
-     * [alignBy] modifier specified the element will be positioned
-     * as if it had [Alignment.Start] align.
+     * also configured to [alignBy]. [alignBy] is a form of [align], so both modifiers will not work
+     * together if specified for the same layout. Within a [Column], all components with [alignBy]
+     * will align horizontally using the specified [VerticalAlignmentLine]s or values provided using
+     * the other [alignBy] overload, forming a sibling group. At least one element of the sibling
+     * group will be placed as it had [Alignment.Start] align in [Column], and the alignment of the
+     * other siblings will be then determined such that the alignment lines coincide. Note that if
+     * only one element in a [Column] has the [alignBy] modifier specified the element will be
+     * positioned as if it had [Alignment.Start] align.
      *
      * Example usage:
+     *
      * @sample androidx.compose.foundation.layout.samples.SimpleRelativeToSiblingsInColumn
      */
-    @Stable
-    fun Modifier.alignBy(alignmentLine: VerticalAlignmentLine): Modifier
+    @Stable fun Modifier.alignBy(alignmentLine: VerticalAlignmentLine): Modifier
 
     /**
-     * Position the element horizontally such that the alignment line for the content as
-     * determined by [alignmentLineBlock] aligns with sibling elements also configured to
-     * [alignBy]. [alignBy] is a form of [align], so both modifiers
-     * will not work together if specified for the same layout.
-     * Within a [Column], all components with [alignBy] will align horizontally using
-     * the specified [VerticalAlignmentLine]s or values obtained from [alignmentLineBlock],
-     * forming a sibling group.
-     * At least one element of the sibling group will be placed as it had [Alignment.Start] align
-     * in [Column], and the alignment of the other siblings will be then determined such that
-     * the alignment lines coincide. Note that if only one element in a [Column] has the
-     * [alignBy] modifier specified the element will be positioned
-     * as if it had [Alignment.Start] align.
+     * Position the element horizontally such that the alignment line for the content as determined
+     * by [alignmentLineBlock] aligns with sibling elements also configured to [alignBy]. [alignBy]
+     * is a form of [align], so both modifiers will not work together if specified for the same
+     * layout. Within a [Column], all components with [alignBy] will align horizontally using the
+     * specified [VerticalAlignmentLine]s or values obtained from [alignmentLineBlock], forming a
+     * sibling group. At least one element of the sibling group will be placed as it had
+     * [Alignment.Start] align in [Column], and the alignment of the other siblings will be then
+     * determined such that the alignment lines coincide. Note that if only one element in a
+     * [Column] has the [alignBy] modifier specified the element will be positioned as if it had
+     * [Alignment.Start] align.
      *
      * Example usage:
+     *
      * @sample androidx.compose.foundation.layout.samples.SimpleRelativeToSiblings
      */
-    @Stable
-    fun Modifier.alignBy(alignmentLineBlock: (Measured) -> Int): Modifier
+    @Stable fun Modifier.alignBy(alignmentLineBlock: (Measured) -> Int): Modifier
 }
 
 internal object ColumnScopeInstance : ColumnScope {
@@ -374,23 +370,14 @@
     }
 
     @Stable
-    override fun Modifier.align(alignment: Alignment.Horizontal) = this.then(
-        HorizontalAlignElement(
-            horizontal = alignment
-        )
-    )
+    override fun Modifier.align(alignment: Alignment.Horizontal) =
+        this.then(HorizontalAlignElement(horizontal = alignment))
 
     @Stable
-    override fun Modifier.alignBy(alignmentLine: VerticalAlignmentLine) = this.then(
-        WithAlignmentLineElement(
-            alignmentLine = alignmentLine
-        )
-    )
+    override fun Modifier.alignBy(alignmentLine: VerticalAlignmentLine) =
+        this.then(WithAlignmentLineElement(alignmentLine = alignmentLine))
 
     @Stable
-    override fun Modifier.alignBy(alignmentLineBlock: (Measured) -> Int) = this.then(
-        WithAlignmentLineBlockElement(
-            block = alignmentLineBlock
-        )
-    )
+    override fun Modifier.alignBy(alignmentLineBlock: (Measured) -> Int) =
+        this.then(WithAlignmentLineBlockElement(block = alignmentLineBlock))
 }
diff --git a/compose/foundation/foundation-layout/src/commonMain/kotlin/androidx/compose/foundation/layout/ContextualFlowLayout.kt b/compose/foundation/foundation-layout/src/commonMain/kotlin/androidx/compose/foundation/layout/ContextualFlowLayout.kt
index cbfbec0..1326399 100644
--- a/compose/foundation/foundation-layout/src/commonMain/kotlin/androidx/compose/foundation/layout/ContextualFlowLayout.kt
+++ b/compose/foundation/foundation-layout/src/commonMain/kotlin/androidx/compose/foundation/layout/ContextualFlowLayout.kt
@@ -29,23 +29,23 @@
 import androidx.compose.ui.unit.dp
 
 /**
- * [ContextualFlowRow] is a specialized version of the [FlowRow] layout. It is designed to
- * enable users to make contextual decisions during the construction of [FlowRow] layouts.
+ * [ContextualFlowRow] is a specialized version of the [FlowRow] layout. It is designed to enable
+ * users to make contextual decisions during the construction of [FlowRow] layouts.
  *
- * This component is particularly advantageous when dealing with
- * a large collection of items, allowing for efficient management and display. Unlike traditional
- * [FlowRow] that composes all items regardless of their visibility, ContextualFlowRow smartly
- * limits composition to only those items that are visible within its constraints, such as
- * [maxLines] or `maxHeight`. This approach ensures optimal performance and resource utilization
- * by composing fewer items than the total number available, based on the current context and
- * display parameters.
+ * This component is particularly advantageous when dealing with a large collection of items,
+ * allowing for efficient management and display. Unlike traditional [FlowRow] that composes all
+ * items regardless of their visibility, ContextualFlowRow smartly limits composition to only those
+ * items that are visible within its constraints, such as [maxLines] or `maxHeight`. This approach
+ * ensures optimal performance and resource utilization by composing fewer items than the total
+ * number available, based on the current context and display parameters.
  *
- * While maintaining the core functionality of the standard [FlowRow], [ContextualFlowRow]
- * operates on an index-based system and composes items sequentially, one after another.
- * This approach provides a perfect way to make contextual decisions and can be an easier way
- * to handle problems such as dynamic see more buttons such as (N+ buttons).
+ * While maintaining the core functionality of the standard [FlowRow], [ContextualFlowRow] operates
+ * on an index-based system and composes items sequentially, one after another. This approach
+ * provides a perfect way to make contextual decisions and can be an easier way to handle problems
+ * such as dynamic see more buttons such as (N+ buttons).
  *
  * Example:
+ *
  * @sample androidx.compose.foundation.layout.samples.ContextualFlowRowMaxLineDynamicSeeMore
  *
  * @param modifier The modifier to be applied to the Row.
@@ -56,7 +56,6 @@
  * @param overflow The strategy to handle overflowing items
  * @param itemCount The total number of item composable
  * @param content The indexed-based content of [ContextualFlowRowScope]
- *
  * @see FlowRow
  * @see ContextualFlowColumn
  */
@@ -72,55 +71,53 @@
     overflow: ContextualFlowRowOverflow = ContextualFlowRowOverflow.Clip,
     content: @Composable ContextualFlowRowScope.(index: Int) -> Unit,
 ) {
-    val overflowState = remember(overflow) {
-        overflow.createOverflowState()
-    }
-    val list: List<@Composable () -> Unit> = remember(overflow) {
-        val mutableList: MutableList<@Composable () -> Unit> = mutableListOf()
-        overflow.addOverflowComposables(overflowState, mutableList)
-        mutableList
-    }
-    val measurePolicy = contextualRowMeasurementHelper(
-        horizontalArrangement,
-        verticalArrangement,
-        maxItemsInEachRow,
-        maxLines,
-        overflowState,
-        itemCount,
-        list
-    ) { index, info ->
-        val scope = ContextualFlowRowScopeImpl(
-            info.lineIndex,
-            info.positionInLine,
-            maxWidthInLine = info.maxMainAxisSize,
-            maxHeight = info.maxCrossAxisSize
-        )
-        scope.content(index)
-    }
-    SubcomposeLayout(
-        modifier = modifier,
-        measurePolicy = measurePolicy
-    )
+    val overflowState = remember(overflow) { overflow.createOverflowState() }
+    val list: List<@Composable () -> Unit> =
+        remember(overflow) {
+            val mutableList: MutableList<@Composable () -> Unit> = mutableListOf()
+            overflow.addOverflowComposables(overflowState, mutableList)
+            mutableList
+        }
+    val measurePolicy =
+        contextualRowMeasurementHelper(
+            horizontalArrangement,
+            verticalArrangement,
+            maxItemsInEachRow,
+            maxLines,
+            overflowState,
+            itemCount,
+            list
+        ) { index, info ->
+            val scope =
+                ContextualFlowRowScopeImpl(
+                    info.lineIndex,
+                    info.positionInLine,
+                    maxWidthInLine = info.maxMainAxisSize,
+                    maxHeight = info.maxCrossAxisSize
+                )
+            scope.content(index)
+        }
+    SubcomposeLayout(modifier = modifier, measurePolicy = measurePolicy)
 }
 
 /**
  * [ContextualFlowColumn] is a specialized version of the [FlowColumn] layout. It is designed to
  * enable users to make contextual decisions during the construction of [FlowColumn] layouts.
  *
- * This component is particularly advantageous when dealing with
- * a large collection of items, allowing for efficient management and display. Unlike traditional
- * [FlowColumn] that composes all items regardless of their visibility, ContextualFlowColumn smartly
- * limits composition to only those items that are visible within its constraints, such as
- * [maxLines] or `maxWidth`. This approach ensures optimal performance and resource utilization
- * by composing fewer items than the total number available, based on the current context and
- * display parameters.
+ * This component is particularly advantageous when dealing with a large collection of items,
+ * allowing for efficient management and display. Unlike traditional [FlowColumn] that composes all
+ * items regardless of their visibility, ContextualFlowColumn smartly limits composition to only
+ * those items that are visible within its constraints, such as [maxLines] or `maxWidth`. This
+ * approach ensures optimal performance and resource utilization by composing fewer items than the
+ * total number available, based on the current context and display parameters.
  *
  * While maintaining the core functionality of the standard [FlowColumn], [ContextualFlowColumn]
- * operates on an index-based system and composes items sequentially, one after another.
- * This approach provides a perfect way to make contextual decisions and can be an easier way
- * to handle problems such as dynamic see more buttons such as (N+ buttons).
+ * operates on an index-based system and composes items sequentially, one after another. This
+ * approach provides a perfect way to make contextual decisions and can be an easier way to handle
+ * problems such as dynamic see more buttons such as (N+ buttons).
  *
  * Example:
+ *
  * @sample androidx.compose.foundation.layout.samples.ContextualFlowColMaxLineDynamicSeeMore
  *
  * @param modifier The modifier to be applied to the Row.
@@ -131,7 +128,6 @@
  * @param overflow The strategy to handle overflowing items
  * @param itemCount The total number of item composable
  * @param content The indexed-based content of [ContextualFlowColumnScope]
- *
  * @see FlowColumn
  * @see ContextualFlowRow
  */
@@ -147,139 +143,133 @@
     overflow: ContextualFlowColumnOverflow = ContextualFlowColumnOverflow.Clip,
     content: @Composable ContextualFlowColumnScope.(index: Int) -> Unit,
 ) {
-    val overflowState = remember(overflow) {
-        overflow.createOverflowState()
-    }
-    val list: List<@Composable () -> Unit> = remember(overflow) {
-        val mutableList: MutableList<@Composable () -> Unit> = mutableListOf()
-        overflow.addOverflowComposables(overflowState, mutableList)
-        mutableList
-    }
-    val measurePolicy = contextualColumnMeasureHelper(
-        verticalArrangement,
-        horizontalArrangement,
-        maxItemsInEachColumn,
-        maxLines,
-        overflowState,
-        itemCount,
-        list,
-    ) { index, info ->
-        val scope = ContextualFlowColumnScopeImpl(
-            info.lineIndex,
-            info.positionInLine,
-            maxHeightInLine = info.maxMainAxisSize,
-            maxWidth = info.maxCrossAxisSize
-        )
-        scope.content(index)
-    }
+    val overflowState = remember(overflow) { overflow.createOverflowState() }
+    val list: List<@Composable () -> Unit> =
+        remember(overflow) {
+            val mutableList: MutableList<@Composable () -> Unit> = mutableListOf()
+            overflow.addOverflowComposables(overflowState, mutableList)
+            mutableList
+        }
+    val measurePolicy =
+        contextualColumnMeasureHelper(
+            verticalArrangement,
+            horizontalArrangement,
+            maxItemsInEachColumn,
+            maxLines,
+            overflowState,
+            itemCount,
+            list,
+        ) { index, info ->
+            val scope =
+                ContextualFlowColumnScopeImpl(
+                    info.lineIndex,
+                    info.positionInLine,
+                    maxHeightInLine = info.maxMainAxisSize,
+                    maxWidth = info.maxCrossAxisSize
+                )
+            scope.content(index)
+        }
 
-    SubcomposeLayout(
-        modifier = modifier,
-        measurePolicy = measurePolicy
-    )
+    SubcomposeLayout(modifier = modifier, measurePolicy = measurePolicy)
 }
 
-/**
- * Defines the scope for items within a [ContextualFlowRow].
- */
+/** Defines the scope for items within a [ContextualFlowRow]. */
 @LayoutScopeMarker
 @Immutable
 @ExperimentalLayoutApi
 interface ContextualFlowRowScope : FlowRowScope {
     /**
      * Identifies the row or column index where the UI component(s) are to be placed, provided they
-     * do not exceed the specified [maxWidthInLine]
-     * and [maxHeight] for that row or column.
+     * do not exceed the specified [maxWidthInLine] and [maxHeight] for that row or column.
      *
      * Should the component(s) surpass these dimensions, their placement may shift to the subsequent
      * row/column or they may be omitted from display, contingent upon the defined constraints.
      *
      * Example:
+     *
      * @sample androidx.compose.foundation.layout.samples.ContextualFlowRow_ItemPosition
+     *
      * @sample androidx.compose.foundation.layout.samples.ContextualFlowColumn_ItemPosition
      */
     val lineIndex: Int
 
     /**
      * Marks the index within the current row/column where the next component is to be inserted,
-     * assuming it conforms to the row's or column's [maxWidthInLine]
-     * and [maxHeight] limitations.
+     * assuming it conforms to the row's or column's [maxWidthInLine] and [maxHeight] limitations.
      *
-     * In scenarios where multiple UI components are returned in one index call,
-     * this parameter is relevant solely to the first returned UI component, presuming it complies
-     * with the row's or column's defined constraints.
+     * In scenarios where multiple UI components are returned in one index call, this parameter is
+     * relevant solely to the first returned UI component, presuming it complies with the row's or
+     * column's defined constraints.
      *
      * Example:
+     *
      * @sample androidx.compose.foundation.layout.samples.ContextualFlowRow_ItemPosition
+     *
      * @sample androidx.compose.foundation.layout.samples.ContextualFlowColumn_ItemPosition
      */
     val indexInLine: Int
 
     /**
-     * Specifies the maximum permissible width (main-axis) for the upcoming UI component
-     * at the given [lineIndex] and [indexInLine]. Exceeding this width may result
-     * in the component being reallocated to the following row
-     * within the [ContextualFlowRow] structure, subject to existing constraints.
+     * Specifies the maximum permissible width (main-axis) for the upcoming UI component at the
+     * given [lineIndex] and [indexInLine]. Exceeding this width may result in the component being
+     * reallocated to the following row within the [ContextualFlowRow] structure, subject to
+     * existing constraints.
      */
     val maxWidthInLine: Dp
 
     /**
      * Determines the maximum allowable height (cross-axis) for the forthcoming UI component,
-     * aligned with its [lineIndex] and [indexInLine]. Should this height threshold be exceeded,
-     * the component's visibility will depend on the overflow settings, potentially
-     * leading to its exclusion.
+     * aligned with its [lineIndex] and [indexInLine]. Should this height threshold be exceeded, the
+     * component's visibility will depend on the overflow settings, potentially leading to its
+     * exclusion.
      */
     val maxHeight: Dp
 }
 
-/**
- * Scope for the overflow [ContextualFlowRow].
- */
+/** Scope for the overflow [ContextualFlowRow]. */
 @LayoutScopeMarker
 @Immutable
 @ExperimentalLayoutApi
 interface ContextualFlowRowOverflowScope : FlowRowOverflowScope
 
-/**
- * Scope for the overflow [ContextualFlowColumn].
- */
+/** Scope for the overflow [ContextualFlowColumn]. */
 @LayoutScopeMarker
 @Immutable
 @ExperimentalLayoutApi
 interface ContextualFlowColumnOverflowScope : FlowColumnOverflowScope
 
-/**
- * Provides a scope for items within a [ContextualFlowColumn].
- */
+/** Provides a scope for items within a [ContextualFlowColumn]. */
 @LayoutScopeMarker
 @Immutable
 @ExperimentalLayoutApi
 interface ContextualFlowColumnScope : FlowColumnScope {
     /**
      * Identifies the row or column index where the UI component(s) are to be placed, provided they
-     * do not exceed the specified [maxWidth]
-     * and [maxHeightInLine] for that row or column.
+     * do not exceed the specified [maxWidth] and [maxHeightInLine] for that row or column.
      *
      * Should the component(s) surpass these dimensions, their placement may shift to the subsequent
      * row/column or they may be omitted from display, contingent upon the defined constraints.
      *
      * Example:
+     *
      * @sample androidx.compose.foundation.layout.samples.ContextualFlowRow_ItemPosition
+     *
      * @sample androidx.compose.foundation.layout.samples.ContextualFlowColumn_ItemPosition
      */
     val lineIndex: Int
 
     /**
      * Marks the index within the current row/column where the next component is to be inserted,
-     * assuming it conforms to the row's or column's [maxWidth]
-     * and [maxHeightInLine] limitations.
+     * assuming it conforms to the row's or column's [maxWidth] and [maxHeightInLine] limitations.
      *
-     * In scenarios where multiple UI components are returned in one index call,
-     * this parameter is relevant solely to the first returned UI component, presuming it complies
-     * with the row's or column's defined constraints.
+     * In scenarios where multiple UI components are returned in one index call, this parameter is
+     * relevant solely to the first returned UI component, presuming it complies with the row's or
+     * column's defined constraints.
      *
      * Example:
+     *
      * @sample androidx.compose.foundation.layout.samples.ContextualFlowRow_ItemPosition
+     *
      * @sample androidx.compose.foundation.layout.samples.ContextualFlowColumn_ItemPosition
      */
     val indexInLine: Int
@@ -294,9 +284,9 @@
 
     /**
      * Establishes the maximum height (main-axis dimension) permissible for the next UI component,
-     * aligned with its [lineIndex] and [indexInLine]. Should the component's height exceed
-     * this limit, it may be shifted to the subsequent column in [ContextualFlowColumn], subject to
-     * the predefined constraints.
+     * aligned with its [lineIndex] and [indexInLine]. Should the component's height exceed this
+     * limit, it may be shifted to the subsequent column in [ContextualFlowColumn], subject to the
+     * predefined constraints.
      */
     val maxHeightInLine: Dp
 }
@@ -318,14 +308,13 @@
 ) : FlowColumnScope by FlowColumnScopeInstance, ContextualFlowColumnScope
 
 @ExperimentalLayoutApi
-internal class ContextualFlowRowOverflowScopeImpl(
-    private val state: FlowLayoutOverflowState
-) : FlowRowOverflowScope by FlowRowOverflowScopeImpl(state), ContextualFlowRowOverflowScope
+internal class ContextualFlowRowOverflowScopeImpl(private val state: FlowLayoutOverflowState) :
+    FlowRowOverflowScope by FlowRowOverflowScopeImpl(state), ContextualFlowRowOverflowScope
 
 @ExperimentalLayoutApi
-internal class ContextualFlowColumnOverflowScopeImpl(
-    private val state: FlowLayoutOverflowState
-) : FlowColumnOverflowScope by FlowColumnOverflowScopeImpl(state), ContextualFlowColumnOverflowScope
+internal class ContextualFlowColumnOverflowScopeImpl(private val state: FlowLayoutOverflowState) :
+    FlowColumnOverflowScope by FlowColumnOverflowScopeImpl(state),
+    ContextualFlowColumnOverflowScope
 
 @Composable
 internal fun contextualRowMeasurementHelper(
@@ -336,10 +325,7 @@
     overflowState: FlowLayoutOverflowState,
     itemCount: Int,
     overflowComposables: List<@Composable () -> Unit>,
-    getComposable: @Composable (
-        index: Int,
-        info: FlowLineInfo
-    ) -> Unit
+    getComposable: @Composable (index: Int, info: FlowLineInfo) -> Unit
 ): (SubcomposeMeasureScope, Constraints) -> MeasureResult {
     return remember(
         horizontalArrangement,
@@ -351,19 +337,20 @@
         getComposable
     ) {
         FlowMeasureLazyPolicy(
-            isHorizontal = true,
-            horizontalArrangement = horizontalArrangement,
-            mainAxisSpacing = horizontalArrangement.spacing,
-            crossAxisAlignment = CROSS_AXIS_ALIGNMENT_TOP,
-            verticalArrangement = verticalArrangement,
-            crossAxisArrangementSpacing = verticalArrangement.spacing,
-            maxItemsInMainAxis = maxItemsInMainAxis,
-            itemCount = itemCount,
-            overflow = overflowState,
-            maxLines = maxLines,
-            getComposable = getComposable,
-            overflowComposables = overflowComposables
-        ).getMeasurePolicy()
+                isHorizontal = true,
+                horizontalArrangement = horizontalArrangement,
+                mainAxisSpacing = horizontalArrangement.spacing,
+                crossAxisAlignment = CROSS_AXIS_ALIGNMENT_TOP,
+                verticalArrangement = verticalArrangement,
+                crossAxisArrangementSpacing = verticalArrangement.spacing,
+                maxItemsInMainAxis = maxItemsInMainAxis,
+                itemCount = itemCount,
+                overflow = overflowState,
+                maxLines = maxLines,
+                getComposable = getComposable,
+                overflowComposables = overflowComposables
+            )
+            .getMeasurePolicy()
     }
 }
 
@@ -376,10 +363,7 @@
     overflowState: FlowLayoutOverflowState,
     itemCount: Int,
     overflowComposables: List<@Composable () -> Unit>,
-    getComposable: @Composable (
-        index: Int,
-        info: FlowLineInfo
-    ) -> Unit
+    getComposable: @Composable (index: Int, info: FlowLineInfo) -> Unit
 ): (SubcomposeMeasureScope, Constraints) -> MeasureResult {
     return remember(
         verticalArrangement,
@@ -391,25 +375,24 @@
         getComposable
     ) {
         FlowMeasureLazyPolicy(
-            isHorizontal = false,
-            verticalArrangement = verticalArrangement,
-            mainAxisSpacing = verticalArrangement.spacing,
-            crossAxisAlignment = CROSS_AXIS_ALIGNMENT_START,
-            horizontalArrangement = horizontalArrangement,
-            crossAxisArrangementSpacing = horizontalArrangement.spacing,
-            maxItemsInMainAxis = maxItemsInMainAxis,
-            itemCount = itemCount,
-            overflow = overflowState,
-            maxLines = maxLines,
-            overflowComposables = overflowComposables,
-            getComposable = getComposable
-        ).getMeasurePolicy()
+                isHorizontal = false,
+                verticalArrangement = verticalArrangement,
+                mainAxisSpacing = verticalArrangement.spacing,
+                crossAxisAlignment = CROSS_AXIS_ALIGNMENT_START,
+                horizontalArrangement = horizontalArrangement,
+                crossAxisArrangementSpacing = horizontalArrangement.spacing,
+                maxItemsInMainAxis = maxItemsInMainAxis,
+                itemCount = itemCount,
+                overflow = overflowState,
+                maxLines = maxLines,
+                overflowComposables = overflowComposables,
+                getComposable = getComposable
+            )
+            .getMeasurePolicy()
     }
 }
 
-/**
- * Returns a Flow Measure Policy
- */
+/** Returns a Flow Measure Policy */
 @OptIn(ExperimentalLayoutApi::class)
 private data class FlowMeasureLazyPolicy(
     override val isHorizontal: Boolean,
@@ -423,46 +406,34 @@
     private val maxItemsInMainAxis: Int,
     private val overflow: FlowLayoutOverflowState,
     private val overflowComposables: List<@Composable () -> Unit>,
-    private val getComposable: @Composable (
-        index: Int,
-        info: FlowLineInfo
-    ) -> Unit
+    private val getComposable: @Composable (index: Int, info: FlowLineInfo) -> Unit
 ) : FlowLineMeasurePolicy {
 
     fun getMeasurePolicy(): (SubcomposeMeasureScope, Constraints) -> MeasureResult {
-        return { measureScope, constraints ->
-            measureScope.measure(constraints)
-        }
+        return { measureScope, constraints -> measureScope.measure(constraints) }
     }
 
-    private fun SubcomposeMeasureScope.measure(
-        constraints: Constraints
-    ): MeasureResult {
-        if (itemCount <= 0 ||
-            (maxLines == 0 ||
-            maxItemsInMainAxis == 0 ||
-            constraints.maxHeight == 0 &&
-            overflow.type != FlowLayoutOverflow.OverflowType.Visible
-                )) {
+    private fun SubcomposeMeasureScope.measure(constraints: Constraints): MeasureResult {
+        if (
+            itemCount <= 0 ||
+                (maxLines == 0 ||
+                    maxItemsInMainAxis == 0 ||
+                    constraints.maxHeight == 0 &&
+                        overflow.type != FlowLayoutOverflow.OverflowType.Visible)
+        ) {
             return layout(0, 0) {}
         }
-        val measurablesIterator = ContextualFlowItemIterator(
-            itemCount
-        ) { index, info ->
-            this.subcompose(index) {
-                getComposable(index, info)
+        val measurablesIterator =
+            ContextualFlowItemIterator(itemCount) { index, info ->
+                this.subcompose(index) { getComposable(index, info) }
             }
-        }
         overflow.itemCount = itemCount
-        overflow.setOverflowMeasurables(
-            this@FlowMeasureLazyPolicy,
-            constraints
-        ) { canExpand, shownItemCount ->
+        overflow.setOverflowMeasurables(this@FlowMeasureLazyPolicy, constraints) {
+            canExpand,
+            shownItemCount ->
             val composableIndex = if (canExpand) 0 else 1
             overflowComposables.getOrNull(composableIndex)?.run {
-                this@measure.subcompose("$canExpand$itemCount$shownItemCount",
-                    this
-                ).getOrNull(0)
+                this@measure.subcompose("$canExpand$itemCount$shownItemCount", this).getOrNull(0)
             }
         }
         return breakDownItems(
@@ -471,7 +442,8 @@
             mainAxisSpacing,
             crossAxisArrangementSpacing,
             OrientationIndependentConstraints(
-                constraints, if (isHorizontal) {
+                constraints,
+                if (isHorizontal) {
                     LayoutOrientation.Horizontal
                 } else {
                     LayoutOrientation.Vertical
@@ -486,15 +458,13 @@
 
 internal class ContextualFlowItemIterator(
     private val itemCount: Int,
-    private val getMeasurables: (
-        index: Int,
-        info: FlowLineInfo
-    ) -> List<Measurable>
+    private val getMeasurables: (index: Int, info: FlowLineInfo) -> List<Measurable>
 ) : Iterator<Measurable> {
     private val _list: MutableList<Measurable> = mutableListOf()
     private var itemIndex: Int = 0
     private var listIndex = 0
-    val list: List<Measurable> get() = _list
+    val list: List<Measurable>
+        get() = _list
 
     override fun hasNext(): Boolean {
         return listIndex < list.size || itemIndex < itemCount
@@ -504,9 +474,7 @@
         return getNext()
     }
 
-    internal fun getNext(
-        info: FlowLineInfo = FlowLineInfo()
-    ): Measurable {
+    internal fun getNext(info: FlowLineInfo = FlowLineInfo()): Measurable {
         // when we are at the end of the list, we fetch a new item from getMeasurables
         // and add to the list.
         // otherwise, we continue through the list.
@@ -534,9 +502,7 @@
 }
 
 /**
- * Contextual
- * Line Info for the current
- * lazy call for [ContextualFlowRow] or [ContextualFlowColumn]
+ * Contextual Line Info for the current lazy call for [ContextualFlowRow] or [ContextualFlowColumn]
  */
 internal class FlowLineInfo(
     internal var lineIndex: Int = 0,
@@ -545,10 +511,7 @@
     internal var maxCrossAxisSize: Dp = 0.dp,
 ) {
 
-    /**
-     * To allow reuse of the same object to reduce allocation,
-     * simply update the same value
-     */
+    /** To allow reuse of the same object to reduce allocation, simply update the same value */
     internal fun update(
         lineIndex: Int,
         positionInLine: Int,
diff --git a/compose/foundation/foundation-layout/src/commonMain/kotlin/androidx/compose/foundation/layout/FlowLayout.kt b/compose/foundation/foundation-layout/src/commonMain/kotlin/androidx/compose/foundation/layout/FlowLayout.kt
index e98650d..8a8bc1a 100644
--- a/compose/foundation/foundation-layout/src/commonMain/kotlin/androidx/compose/foundation/layout/FlowLayout.kt
+++ b/compose/foundation/foundation-layout/src/commonMain/kotlin/androidx/compose/foundation/layout/FlowLayout.kt
@@ -49,23 +49,23 @@
 import kotlin.math.min
 
 /**
- * [FlowRow] is a layout that fills items from left to right (ltr) in LTR layouts
- * or right to left (rtl) in RTL layouts and when it runs out of space, moves to
- * the next "row" or "line" positioned on the bottom, and then continues filling items
- * until the items run out.
+ * [FlowRow] is a layout that fills items from left to right (ltr) in LTR layouts or right to left
+ * (rtl) in RTL layouts and when it runs out of space, moves to the next "row" or "line" positioned
+ * on the bottom, and then continues filling items until the items run out.
  *
  * Example:
+ *
  * @sample androidx.compose.foundation.layout.samples.SimpleFlowRow
  *
- * When a Modifier [RowScope.weight] is provided, it scales the item
- * based on the number items that fall on the row it was placed in.
+ * When a Modifier [RowScope.weight] is provided, it scales the item based on the number items that
+ * fall on the row it was placed in.
  *
  * Note that if two or more Text components are placed in a [Row], normally they should be aligned
  * by their first baselines. [FlowRow] as a general purpose container does not do it automatically
  * so developers need to handle this manually. This is achieved by adding a
- * [RowScope.alignByBaseline] modifier to every such Text component. By default this modifier
- * aligns by [androidx.compose.ui.layout.FirstBaseline]. If, however, you need to align Texts
- * by [androidx.compose.ui.layout.LastBaseline] for example, use a more general [RowScope.alignBy]
+ * [RowScope.alignByBaseline] modifier to every such Text component. By default this modifier aligns
+ * by [androidx.compose.ui.layout.FirstBaseline]. If, however, you need to align Texts by
+ * [androidx.compose.ui.layout.LastBaseline] for example, use a more general [RowScope.alignBy]
  * modifier.
  *
  * @param modifier The modifier to be applied to the Row.
@@ -75,7 +75,6 @@
  * @param maxLines The max number of rows
  * @param overflow The strategy to handle overflowing items
  * @param content The content as a [RowScope]
- *
  * @see FlowColumn
  * @see ContextualFlowRow
  * @see [androidx.compose.foundation.layout.Row]
@@ -91,46 +90,41 @@
     overflow: FlowRowOverflow = FlowRowOverflow.Clip,
     content: @Composable FlowRowScope.() -> Unit
 ) {
-    val overflowState = remember(overflow) {
-        overflow.createOverflowState()
-    }
-    val measurePolicy = rowMeasurementMultiContentHelper(
-        horizontalArrangement,
-        verticalArrangement,
-        maxItemsInEachRow,
-        maxLines,
-        overflowState
-    )
-    val list: List<@Composable () -> Unit> = remember(overflow, content) {
-        val mutableList: MutableList<@Composable () -> Unit> = mutableListOf()
-        mutableList.add { FlowRowScopeInstance.content() }
-        overflow.addOverflowComposables(overflowState, mutableList)
-        mutableList
-    }
+    val overflowState = remember(overflow) { overflow.createOverflowState() }
+    val measurePolicy =
+        rowMeasurementMultiContentHelper(
+            horizontalArrangement,
+            verticalArrangement,
+            maxItemsInEachRow,
+            maxLines,
+            overflowState
+        )
+    val list: List<@Composable () -> Unit> =
+        remember(overflow, content) {
+            val mutableList: MutableList<@Composable () -> Unit> = mutableListOf()
+            mutableList.add { FlowRowScopeInstance.content() }
+            overflow.addOverflowComposables(overflowState, mutableList)
+            mutableList
+        }
 
-    Layout(
-        contents = list,
-        measurePolicy = measurePolicy,
-        modifier = modifier
-    )
+    Layout(contents = list, measurePolicy = measurePolicy, modifier = modifier)
 }
 
 /**
- * [FlowColumn] is a layout that fills items from top to bottom, and when it runs out of space
- * on the bottom, moves to the next "column" or "line"
- * on the right or left based on ltr or rtl layouts,
- * and then continues filling items from top to bottom.
+ * [FlowColumn] is a layout that fills items from top to bottom, and when it runs out of space on
+ * the bottom, moves to the next "column" or "line" on the right or left based on ltr or rtl
+ * layouts, and then continues filling items from top to bottom.
  *
- * It supports ltr in LTR layouts, by placing the first column to the left, and then moving
- * to the right
- * It supports rtl in RTL layouts, by placing the first column to the right, and then moving
+ * It supports ltr in LTR layouts, by placing the first column to the left, and then moving to the
+ * right It supports rtl in RTL layouts, by placing the first column to the right, and then moving
  * to the left
  *
  * Example:
+ *
  * @sample androidx.compose.foundation.layout.samples.SimpleFlowColumn
  *
- * When a Modifier [ColumnScope.weight] is provided, it scales the item
- * based on the number items that fall on the column it was placed in.
+ * When a Modifier [ColumnScope.weight] is provided, it scales the item based on the number items
+ * that fall on the column it was placed in.
  *
  * @param modifier The modifier to be applied to the Row.
  * @param verticalArrangement The vertical arrangement of the layout's children.
@@ -139,7 +133,6 @@
  * @param maxLines The max number of rows
  * @param overflow The strategy to handle overflowing items
  * @param content The content as a [ColumnScope]
- *
  * @see FlowRow
  * @see ContextualFlowColumn
  * @see [androidx.compose.foundation.layout.Column]
@@ -155,132 +148,110 @@
     overflow: FlowColumnOverflow = FlowColumnOverflow.Clip,
     content: @Composable FlowColumnScope.() -> Unit
 ) {
-    val overflowState = remember(overflow) {
-        overflow.createOverflowState()
-    }
-    val measurePolicy = columnMeasurementMultiContentHelper(
-        verticalArrangement,
-        horizontalArrangement,
-        maxItemsInEachColumn,
-        maxLines,
-        overflowState
-    )
-    val list: List<@Composable () -> Unit> = remember(overflow, content) {
-        val mutableList: MutableList<@Composable () -> Unit> = mutableListOf()
-        mutableList.add { FlowColumnScopeInstance.content() }
-        overflow.addOverflowComposables(overflowState, mutableList)
-        mutableList
-    }
-    Layout(
-        contents = list,
-        measurePolicy = measurePolicy,
-        modifier = modifier
-    )
+    val overflowState = remember(overflow) { overflow.createOverflowState() }
+    val measurePolicy =
+        columnMeasurementMultiContentHelper(
+            verticalArrangement,
+            horizontalArrangement,
+            maxItemsInEachColumn,
+            maxLines,
+            overflowState
+        )
+    val list: List<@Composable () -> Unit> =
+        remember(overflow, content) {
+            val mutableList: MutableList<@Composable () -> Unit> = mutableListOf()
+            mutableList.add { FlowColumnScopeInstance.content() }
+            overflow.addOverflowComposables(overflowState, mutableList)
+            mutableList
+        }
+    Layout(contents = list, measurePolicy = measurePolicy, modifier = modifier)
 }
 
-/**
- * Scope for the children of [FlowRow].
- */
+/** Scope for the children of [FlowRow]. */
 @LayoutScopeMarker
 @Immutable
 @ExperimentalLayoutApi
 interface FlowRowScope : RowScope {
     /**
-     * Have the item fill (possibly only partially) the max height of the tallest item in the
-     * row it was placed in, within the [FlowRow].
+     * Have the item fill (possibly only partially) the max height of the tallest item in the row it
+     * was placed in, within the [FlowRow].
      *
-     * @param fraction The fraction of the max height of the tallest item
-     * between `0` and `1`, inclusive.
+     * @param fraction The fraction of the max height of the tallest item between `0` and `1`,
+     *   inclusive.
      *
      * Example usage:
+     *
      * @sample androidx.compose.foundation.layout.samples.SimpleFlowRow_EqualHeight
      */
     @ExperimentalLayoutApi
     fun Modifier.fillMaxRowHeight(
-        @FloatRange(from = 0.0, to = 1.0)
-        fraction: Float = 1f,
+        @FloatRange(from = 0.0, to = 1.0) fraction: Float = 1f,
     ): Modifier
 }
 
-/**
- * Scope for the overflow [FlowRow].
- */
+/** Scope for the overflow [FlowRow]. */
 @LayoutScopeMarker
 @Immutable
 @ExperimentalLayoutApi
 interface FlowRowOverflowScope : FlowRowScope {
     /**
-    * Total Number of Items available to show in [FlowRow]
-    * This includes items that may not be displayed.
-    *
-    * In [ContextualFlowRow], this matches the
-    * [ContextualFlowRow]'s `itemCount` parameter
-    */
-    @ExperimentalLayoutApi
-    val totalItemCount: Int
-
-    /**
-     * Total Number of Items displayed in the [FlowRow]
+     * Total Number of Items available to show in [FlowRow] This includes items that may not be
+     * displayed.
+     *
+     * In [ContextualFlowRow], this matches the [ContextualFlowRow]'s `itemCount` parameter
      */
-    @ExperimentalLayoutApi
-    val shownItemCount: Int
+    @ExperimentalLayoutApi val totalItemCount: Int
+
+    /** Total Number of Items displayed in the [FlowRow] */
+    @ExperimentalLayoutApi val shownItemCount: Int
 }
 
-/**
- * Scope for the children of [FlowColumn].
- */
+/** Scope for the children of [FlowColumn]. */
 @LayoutScopeMarker
 @Immutable
 @ExperimentalLayoutApi
 interface FlowColumnScope : ColumnScope {
     /**
-     * Have the item fill (possibly only partially) the max width of the widest item in the
-     * column it was placed in, within the [FlowColumn].
+     * Have the item fill (possibly only partially) the max width of the widest item in the column
+     * it was placed in, within the [FlowColumn].
      *
-     * @param fraction The fraction of the max width of the widest item
-     * between `0` and `1`, inclusive.
+     * @param fraction The fraction of the max width of the widest item between `0` and `1`,
+     *   inclusive.
      *
      * Example usage:
+     *
      * @sample androidx.compose.foundation.layout.samples.SimpleFlowColumn_EqualWidth
      */
     @ExperimentalLayoutApi
     fun Modifier.fillMaxColumnWidth(
-        @FloatRange(from = 0.0, to = 1.0)
-        fraction: Float = 1f,
+        @FloatRange(from = 0.0, to = 1.0) fraction: Float = 1f,
     ): Modifier
 }
 
-/**
- * Scope for the overflow [FlowColumn].
- */
+/** Scope for the overflow [FlowColumn]. */
 @LayoutScopeMarker
 @Immutable
 @ExperimentalLayoutApi
 interface FlowColumnOverflowScope : FlowColumnScope {
     /**
-     * Total Number of Items available to show in [FlowColumn]
-     * This includes items that may not be displayed.
+     * Total Number of Items available to show in [FlowColumn] This includes items that may not be
+     * displayed.
      *
-     * In [ContextualFlowColumn], this matches the
-     * [ContextualFlowColumn]'s `itemCount` parameter
+     * In [ContextualFlowColumn], this matches the [ContextualFlowColumn]'s `itemCount` parameter
      */
-    @ExperimentalLayoutApi
-    val totalItemCount: Int
+    @ExperimentalLayoutApi val totalItemCount: Int
 
-    /**
-     * Total Number of Items displayed in the [FlowColumn]
-     */
-    @ExperimentalLayoutApi
-    val shownItemCount: Int
+    /** Total Number of Items displayed in the [FlowColumn] */
+    @ExperimentalLayoutApi val shownItemCount: Int
 }
 
 @OptIn(ExperimentalLayoutApi::class)
 internal object FlowRowScopeInstance : RowScope by RowScopeInstance, FlowRowScope {
     override fun Modifier.fillMaxRowHeight(fraction: Float): Modifier {
-        require(fraction >= 0.0) { "invalid fraction $fraction; must be greater than " +
-            "or equal to zero" }
-        require(fraction <= 1.0) { "invalid fraction $fraction; must not be greater " +
-            "than 1.0" }
+        require(fraction >= 0.0) {
+            "invalid fraction $fraction; must be greater than " + "or equal to zero"
+        }
+        require(fraction <= 1.0) { "invalid fraction $fraction; must not be greater " + "than 1.0" }
         return this.then(
             FillCrossAxisSizeElement(
                 fraction = fraction,
@@ -290,9 +261,8 @@
 }
 
 @OptIn(ExperimentalLayoutApi::class)
-internal class FlowRowOverflowScopeImpl(
-    private val state: FlowLayoutOverflowState
-) : FlowRowScope by FlowRowScopeInstance, FlowRowOverflowScope {
+internal class FlowRowOverflowScopeImpl(private val state: FlowLayoutOverflowState) :
+    FlowRowScope by FlowRowScopeInstance, FlowRowOverflowScope {
     override val totalItemCount: Int
         get() = state.itemCount
 
@@ -301,9 +271,8 @@
 }
 
 @OptIn(ExperimentalLayoutApi::class)
-internal class FlowColumnOverflowScopeImpl(
-    private val state: FlowLayoutOverflowState
-) : FlowColumnScope by FlowColumnScopeInstance, FlowColumnOverflowScope {
+internal class FlowColumnOverflowScopeImpl(private val state: FlowLayoutOverflowState) :
+    FlowColumnScope by FlowColumnScopeInstance, FlowColumnOverflowScope {
     override val totalItemCount: Int
         get() = state.itemCount
 
@@ -314,10 +283,10 @@
 @OptIn(ExperimentalLayoutApi::class)
 internal object FlowColumnScopeInstance : ColumnScope by ColumnScopeInstance, FlowColumnScope {
     override fun Modifier.fillMaxColumnWidth(fraction: Float): Modifier {
-        require(fraction >= 0.0) { "invalid fraction $fraction; must be greater than or " +
-            "equal to zero" }
-        require(fraction <= 1.0) { "invalid fraction $fraction; must not be greater " +
-            "than 1.0" }
+        require(fraction >= 0.0) {
+            "invalid fraction $fraction; must be greater than or " + "equal to zero"
+        }
+        require(fraction <= 1.0) { "invalid fraction $fraction; must not be greater " + "than 1.0" }
         return this.then(
             FillCrossAxisSizeElement(
                 fraction = fraction,
@@ -326,9 +295,7 @@
     }
 }
 
-internal data class FlowLayoutData(
-    var fillCrossAxisFraction: Float
-)
+internal data class FlowLayoutData(var fillCrossAxisFraction: Float)
 
 internal class FillCrossAxisSizeNode(
     var fraction: Float,
@@ -340,9 +307,8 @@
         }
 }
 
-internal class FillCrossAxisSizeElement(
-    val fraction: Float
-) : ModifierNodeElement<FillCrossAxisSizeNode>() {
+internal class FillCrossAxisSizeElement(val fraction: Float) :
+    ModifierNodeElement<FillCrossAxisSizeNode>() {
     override fun create(): FillCrossAxisSizeNode {
         return FillCrossAxisSizeNode(fraction)
     }
@@ -383,22 +349,22 @@
         verticalArrangement,
         maxItemsInMainAxis,
     ) {
-        val measurePolicy = FlowMeasurePolicy(
-            isHorizontal = true,
-            horizontalArrangement = horizontalArrangement,
-            mainAxisSpacing = horizontalArrangement.spacing,
-            crossAxisAlignment = CROSS_AXIS_ALIGNMENT_TOP,
-            verticalArrangement = verticalArrangement,
-            crossAxisArrangementSpacing = verticalArrangement.spacing,
-            maxItemsInMainAxis = maxItemsInMainAxis,
-            maxLines = Int.MAX_VALUE,
-            overflow = FlowRowOverflow.Visible.createOverflowState()
-        ) as MultiContentMeasurePolicy
+        val measurePolicy =
+            FlowMeasurePolicy(
+                isHorizontal = true,
+                horizontalArrangement = horizontalArrangement,
+                mainAxisSpacing = horizontalArrangement.spacing,
+                crossAxisAlignment = CROSS_AXIS_ALIGNMENT_TOP,
+                verticalArrangement = verticalArrangement,
+                crossAxisArrangementSpacing = verticalArrangement.spacing,
+                maxItemsInMainAxis = maxItemsInMainAxis,
+                maxLines = Int.MAX_VALUE,
+                overflow = FlowRowOverflow.Visible.createOverflowState()
+            )
+                as MultiContentMeasurePolicy
 
         MeasurePolicy { measurables, constraints ->
-            with(measurePolicy) {
-                this@MeasurePolicy.measure(listOf(measurables), constraints)
-            }
+            with(measurePolicy) { this@MeasurePolicy.measure(listOf(measurables), constraints) }
         }
     }
 }
@@ -446,21 +412,20 @@
         horizontalArrangement,
         maxItemsInMainAxis,
     ) {
-        val measurePolicy = FlowMeasurePolicy(
-            isHorizontal = false,
-            verticalArrangement = verticalArrangement,
-            mainAxisSpacing = verticalArrangement.spacing,
-            crossAxisAlignment = CROSS_AXIS_ALIGNMENT_START,
-            horizontalArrangement = horizontalArrangement,
-            crossAxisArrangementSpacing = horizontalArrangement.spacing,
-            maxItemsInMainAxis = maxItemsInMainAxis,
-            maxLines = Int.MAX_VALUE,
-            overflow = FlowRowOverflow.Visible.createOverflowState()
-        )
+        val measurePolicy =
+            FlowMeasurePolicy(
+                isHorizontal = false,
+                verticalArrangement = verticalArrangement,
+                mainAxisSpacing = verticalArrangement.spacing,
+                crossAxisAlignment = CROSS_AXIS_ALIGNMENT_START,
+                horizontalArrangement = horizontalArrangement,
+                crossAxisArrangementSpacing = horizontalArrangement.spacing,
+                maxItemsInMainAxis = maxItemsInMainAxis,
+                maxLines = Int.MAX_VALUE,
+                overflow = FlowRowOverflow.Visible.createOverflowState()
+            )
         MeasurePolicy { measurables, constraints ->
-            with(measurePolicy) {
-                this@MeasurePolicy.measure(listOf(measurables), constraints)
-            }
+            with(measurePolicy) { this@MeasurePolicy.measure(listOf(measurables), constraints) }
         }
     }
 }
@@ -500,11 +465,9 @@
     val verticalArrangement: Arrangement.Vertical
     val crossAxisAlignment: CrossAxisAlignment
 
-    override fun Placeable.mainAxisSize() =
-        if (isHorizontal) measuredWidth else measuredHeight
+    override fun Placeable.mainAxisSize() = if (isHorizontal) measuredWidth else measuredHeight
 
-    override fun Placeable.crossAxisSize() =
-        if (isHorizontal) measuredHeight else measuredWidth
+    override fun Placeable.crossAxisSize() = if (isHorizontal) measuredHeight else measuredWidth
 
     override fun createConstraints(
         mainAxisMin: Int,
@@ -558,23 +521,18 @@
                 val crossAxisLineOffset = crossAxisOffset?.get(currentLineIndex) ?: 0
                 for (i in startIndex until endIndex) {
                     val placeable = placeables[i]!!
-                    val crossAxisPosition = getCrossAxisPosition(
-                        placeable,
-                        placeable.rowColumnParentData,
-                        crossAxisLayoutSize,
-                        layoutDirection,
-                        beforeCrossAxisAlignmentLine
-                    ) + crossAxisLineOffset
+                    val crossAxisPosition =
+                        getCrossAxisPosition(
+                            placeable,
+                            placeable.rowColumnParentData,
+                            crossAxisLayoutSize,
+                            layoutDirection,
+                            beforeCrossAxisAlignmentLine
+                        ) + crossAxisLineOffset
                     if (isHorizontal) {
-                        placeable.place(
-                            mainAxisPositions[i - startIndex],
-                            crossAxisPosition
-                        )
+                        placeable.place(mainAxisPositions[i - startIndex], crossAxisPosition)
                     } else {
-                        placeable.place(
-                            crossAxisPosition,
-                            mainAxisPositions[i - startIndex]
-                        )
+                        placeable.place(crossAxisPosition, mainAxisPositions[i - startIndex])
                     }
                 }
             }
@@ -591,11 +549,12 @@
         val childCrossAlignment = rowColumnParentData?.crossAxisAlignment ?: crossAxisAlignment
         return childCrossAlignment.align(
             size = crossAxisLayoutSize - placeable.crossAxisSize(),
-            layoutDirection = if (isHorizontal) {
-                LayoutDirection.Ltr
-            } else {
-                layoutDirection
-            },
+            layoutDirection =
+                if (isHorizontal) {
+                    LayoutDirection.Ltr
+                } else {
+                    layoutDirection
+                },
             placeable = placeable,
             beforeCrossAxisAlignmentLine = beforeCrossAxisAlignmentLine
         )
@@ -627,9 +586,8 @@
         }
     }
 }
-/**
- * Returns a Flow Measure Policy
- */
+
+/** Returns a Flow Measure Policy */
 @OptIn(ExperimentalLayoutApi::class)
 private data class FlowMeasurePolicy(
     override val isHorizontal: Boolean,
@@ -647,8 +605,12 @@
         measurables: List<List<Measurable>>,
         constraints: Constraints
     ): MeasureResult {
-        if (maxLines == 0 || maxItemsInMainAxis == 0 || measurables.isEmpty() ||
-            constraints.maxHeight == 0 && overflow.type != FlowLayoutOverflow.OverflowType.Visible
+        if (
+            maxLines == 0 ||
+                maxItemsInMainAxis == 0 ||
+                measurables.isEmpty() ||
+                constraints.maxHeight == 0 &&
+                    overflow.type != FlowLayoutOverflow.OverflowType.Visible
         ) {
             return layout(0, 0) {}
         }
@@ -671,7 +633,8 @@
             mainAxisSpacing,
             crossAxisArrangementSpacing,
             OrientationIndependentConstraints(
-                constraints, if (isHorizontal) {
+                constraints,
+                if (isHorizontal) {
                     LayoutOrientation.Horizontal
                 } else {
                     LayoutOrientation.Vertical
@@ -815,29 +778,31 @@
         maxItemsInMainAxis: Int,
         maxLines: Int,
         overflow: FlowLayoutOverflowState
-    ) = minIntrinsicMainAxisSize(
-        measurables,
-        mainAxisSize = minMainAxisIntrinsicItemSize,
-        crossAxisSize = minCrossAxisIntrinsicItemSize,
-        crossAxisAvailable,
-        mainAxisSpacing,
-        crossAxisSpacing,
-        maxItemsInMainAxis,
-        maxLines,
-        overflow
-    )
+    ) =
+        minIntrinsicMainAxisSize(
+            measurables,
+            mainAxisSize = minMainAxisIntrinsicItemSize,
+            crossAxisSize = minCrossAxisIntrinsicItemSize,
+            crossAxisAvailable,
+            mainAxisSpacing,
+            crossAxisSpacing,
+            maxItemsInMainAxis,
+            maxLines,
+            overflow
+        )
 
     fun maxIntrinsicMainAxisSize(
         measurables: List<IntrinsicMeasurable>,
         height: Int,
         arrangementSpacing: Int
-    ) = maxIntrinsicMainAxisSize(
-        measurables,
-        maxMainAxisIntrinsicItemSize,
-        height,
-        arrangementSpacing,
-        maxItemsInMainAxis
-    )
+    ) =
+        maxIntrinsicMainAxisSize(
+            measurables,
+            maxMainAxisIntrinsicItemSize,
+            height,
+            arrangementSpacing,
+            maxItemsInMainAxis
+        )
 
     fun intrinsicCrossAxisSize(
         measurables: List<IntrinsicMeasurable>,
@@ -847,49 +812,31 @@
         maxItemsInMainAxis: Int,
         maxLines: Int,
         overflow: FlowLayoutOverflowState
-    ) = intrinsicCrossAxisSize(
-        measurables,
-        mainAxisSize = minMainAxisIntrinsicItemSize,
-        crossAxisSize = minCrossAxisIntrinsicItemSize,
-        mainAxisAvailable,
-        mainAxisSpacing,
-        crossAxisSpacing,
-        maxItemsInMainAxis = maxItemsInMainAxis,
-        overflow = overflow,
-        maxLines = maxLines
-    ).first
+    ) =
+        intrinsicCrossAxisSize(
+                measurables,
+                mainAxisSize = minMainAxisIntrinsicItemSize,
+                crossAxisSize = minCrossAxisIntrinsicItemSize,
+                mainAxisAvailable,
+                mainAxisSpacing,
+                crossAxisSpacing,
+                maxItemsInMainAxis = maxItemsInMainAxis,
+                overflow = overflow,
+                maxLines = maxLines
+            )
+            .first
 
     val maxMainAxisIntrinsicItemSize: IntrinsicMeasurable.(Int, Int) -> Int =
-        if (isHorizontal) { _, h ->
-            maxIntrinsicWidth(h)
-        }
-        else { _, w ->
-            maxIntrinsicHeight(w)
-        }
+        if (isHorizontal) { _, h -> maxIntrinsicWidth(h) } else { _, w -> maxIntrinsicHeight(w) }
 
     val maxCrossAxisIntrinsicItemSize: IntrinsicMeasurable.(Int, Int) -> Int =
-        if (isHorizontal) { _, w ->
-            maxIntrinsicHeight(w)
-        }
-        else { _, h ->
-            maxIntrinsicWidth(h)
-        }
+        if (isHorizontal) { _, w -> maxIntrinsicHeight(w) } else { _, h -> maxIntrinsicWidth(h) }
 
     val minCrossAxisIntrinsicItemSize: IntrinsicMeasurable.(Int, Int) -> Int =
-        if (isHorizontal) { _, w ->
-            minIntrinsicHeight(w)
-        }
-        else { _, h ->
-            minIntrinsicWidth(h)
-        }
+        if (isHorizontal) { _, w -> minIntrinsicHeight(w) } else { _, h -> minIntrinsicWidth(h) }
 
     val minMainAxisIntrinsicItemSize: IntrinsicMeasurable.(Int, Int) -> Int =
-        if (isHorizontal) { _, h ->
-            minIntrinsicWidth(h)
-        }
-        else { _, w ->
-            minIntrinsicHeight(w)
-        }
+        if (isHorizontal) { _, h -> minIntrinsicWidth(h) } else { _, w -> minIntrinsicHeight(w) }
 }
 
 private fun maxIntrinsicMainAxisSize(
@@ -918,8 +865,8 @@
 }
 
 /**
- * Slower algorithm but needed to determine the minimum main axis size
- * Uses a binary search to search different scenarios to see the minimum main axis size
+ * Slower algorithm but needed to determine the minimum main axis size Uses a binary search to
+ * search different scenarios to see the minimum main axis size
  */
 @OptIn(ExperimentalLayoutApi::class)
 private fun minIntrinsicMainAxisSize(
@@ -946,24 +893,23 @@
         crossAxisSizes[index] = child.crossAxisSize(index, mainAxisItemSize)
     }
 
-    var maxItemsThatCanBeShown = if (
-        maxLines != Int.MAX_VALUE &&
-        maxItemsInMainAxis != Int.MAX_VALUE) {
-        maxItemsInMainAxis * maxLines
-    } else {
-        Int.MAX_VALUE
-    }
-    val mustHaveEllipsis = when {
-        maxItemsThatCanBeShown < children.size &&
-            (overflow.type == FlowLayoutOverflow.OverflowType.ExpandIndicator ||
-                overflow.type == FlowLayoutOverflow.OverflowType.ExpandOrCollapseIndicator)
-        -> true
-        maxItemsThatCanBeShown >= children.size &&
-            maxLines >= overflow.minLinesToShowCollapse &&
-            overflow.type == FlowLayoutOverflow.OverflowType.ExpandOrCollapseIndicator ->
-            true
-        else -> false
-    }
+    var maxItemsThatCanBeShown =
+        if (maxLines != Int.MAX_VALUE && maxItemsInMainAxis != Int.MAX_VALUE) {
+            maxItemsInMainAxis * maxLines
+        } else {
+            Int.MAX_VALUE
+        }
+    val mustHaveEllipsis =
+        when {
+            maxItemsThatCanBeShown < children.size &&
+                (overflow.type == FlowLayoutOverflow.OverflowType.ExpandIndicator ||
+                    overflow.type == FlowLayoutOverflow.OverflowType.ExpandOrCollapseIndicator) ->
+                true
+            maxItemsThatCanBeShown >= children.size &&
+                maxLines >= overflow.minLinesToShowCollapse &&
+                overflow.type == FlowLayoutOverflow.OverflowType.ExpandOrCollapseIndicator -> true
+            else -> false
+        }
     maxItemsThatCanBeShown -= if (mustHaveEllipsis) 1 else 0
     maxItemsThatCanBeShown = min(maxItemsThatCanBeShown, children.size)
     val maxMainAxisSize = mainAxisSizes.sum().run { this + ((children.size - 1) * mainAxisSpacing) }
@@ -979,17 +925,18 @@
         }
         val mid = (low + high) / 2
         mainAxisUsed = mid
-        val pair = intrinsicCrossAxisSize(
-            children,
-            mainAxisSizes,
-            crossAxisSizes,
-            mainAxisUsed,
-            mainAxisSpacing,
-            crossAxisSpacing,
-            maxItemsInMainAxis,
-            maxLines,
-            overflow
-        )
+        val pair =
+            intrinsicCrossAxisSize(
+                children,
+                mainAxisSizes,
+                crossAxisSizes,
+                mainAxisUsed,
+                mainAxisSpacing,
+                crossAxisSpacing,
+                maxItemsInMainAxis,
+                maxLines,
+                overflow
+            )
         crossAxisUsed = pair.first
         val itemShown = pair.second
 
@@ -1009,8 +956,8 @@
 }
 
 /**
- * FlowRow: Intrinsic height (cross Axis) is based on a specified width
- * FlowColumn: Intrinsic width (crossAxis) based on a specified height
+ * FlowRow: Intrinsic height (cross Axis) is based on a specified width FlowColumn: Intrinsic width
+ * (crossAxis) based on a specified height
  */
 private fun intrinsicCrossAxisSize(
     children: List<IntrinsicMeasurable>,
@@ -1036,8 +983,9 @@
     )
 }
 
-/** FlowRow: Intrinsic height (cross Axis) is based on a specified width
- ** FlowColumn: Intrinsic width (crossAxis) based on a specified height
+/**
+ * FlowRow: Intrinsic height (cross Axis) is based on a specified width
+ * * FlowColumn: Intrinsic width (crossAxis) based on a specified height
  */
 private fun intrinsicCrossAxisSize(
     children: List<IntrinsicMeasurable>,
@@ -1053,19 +1001,21 @@
     if (children.isEmpty()) {
         return IntIntPair(0, 0)
     }
-    val buildingBlocks = FlowLayoutBuildingBlocks(
-        maxItemsInMainAxis = maxItemsInMainAxis,
-        overflow = overflow,
-        maxLines = maxLines,
-        constraints = OrientationIndependentConstraints(
-            mainAxisMin = 0,
-            mainAxisMax = mainAxisAvailable,
-            crossAxisMin = 0,
-            crossAxisMax = Constraints.Infinity
-        ),
-        mainAxisSpacing = mainAxisSpacing,
-        crossAxisSpacing = crossAxisSpacing,
-    )
+    val buildingBlocks =
+        FlowLayoutBuildingBlocks(
+            maxItemsInMainAxis = maxItemsInMainAxis,
+            overflow = overflow,
+            maxLines = maxLines,
+            constraints =
+                OrientationIndependentConstraints(
+                    mainAxisMin = 0,
+                    mainAxisMax = mainAxisAvailable,
+                    crossAxisMin = 0,
+                    crossAxisMax = Constraints.Infinity
+                ),
+            mainAxisSpacing = mainAxisSpacing,
+            crossAxisSpacing = crossAxisSpacing,
+        )
     var nextChild = children.getOrNull(0)
     var nextCrossAxisSize = nextChild?.crossAxisSize(0, mainAxisAvailable) ?: 0
     var nextMainAxisSize = nextChild?.mainAxisSize(0, nextCrossAxisSize) ?: 0
@@ -1076,24 +1026,29 @@
     var lastBreak = 0
     var lineIndex = 0
 
-    var wrapInfo = buildingBlocks.getWrapInfo(
-        nextItemHasNext = children.size > 1,
-        nextIndexInLine = 0,
-        leftOver = IntIntPair(remaining, Constraints.Infinity),
-        nextSize = if (nextChild == null) null else IntIntPair(nextMainAxisSize, nextCrossAxisSize),
-        lineIndex = lineIndex,
-        totalCrossAxisSize = totalCrossAxisSize,
-        currentLineCrossAxisSize = currentCrossAxisSize,
-        isWrappingRound = false,
-        isEllipsisWrap = false
-    )
+    var wrapInfo =
+        buildingBlocks.getWrapInfo(
+            nextItemHasNext = children.size > 1,
+            nextIndexInLine = 0,
+            leftOver = IntIntPair(remaining, Constraints.Infinity),
+            nextSize =
+                if (nextChild == null) null else IntIntPair(nextMainAxisSize, nextCrossAxisSize),
+            lineIndex = lineIndex,
+            totalCrossAxisSize = totalCrossAxisSize,
+            currentLineCrossAxisSize = currentCrossAxisSize,
+            isWrappingRound = false,
+            isEllipsisWrap = false
+        )
 
     if (wrapInfo.isLastItemInContainer) {
-        val size = overflow.ellipsisSize(
-            hasNext = nextChild != null,
-            lineIndex = 0,
-            totalCrossAxisSize = 0,
-        )?.second ?: 0
+        val size =
+            overflow
+                .ellipsisSize(
+                    hasNext = nextChild != null,
+                    lineIndex = 0,
+                    totalCrossAxisSize = 0,
+                )
+                ?.second ?: 0
         val noOfItemsShown = 0
         return IntIntPair(size, noOfItemsShown)
     }
@@ -1109,34 +1064,37 @@
         // look ahead to simplify logic
         nextChild = children.getOrNull(index + 1)
         nextCrossAxisSize = nextChild?.crossAxisSize(index + 1, mainAxisAvailable) ?: 0
-        nextMainAxisSize = nextChild?.mainAxisSize(index + 1, nextCrossAxisSize)
-            ?.plus(mainAxisSpacing) ?: 0
+        nextMainAxisSize =
+            nextChild?.mainAxisSize(index + 1, nextCrossAxisSize)?.plus(mainAxisSpacing) ?: 0
 
-        wrapInfo = buildingBlocks.getWrapInfo(
-            nextItemHasNext = index + 2 < children.size,
-            nextIndexInLine = (index + 1) - lastBreak,
-            leftOver = IntIntPair(remaining, Constraints.Infinity),
-            nextSize = if (nextChild == null) {
-                null
-            } else {
-                IntIntPair(nextMainAxisSize, nextCrossAxisSize)
-            },
-            lineIndex = lineIndex,
-            totalCrossAxisSize = totalCrossAxisSize,
-            currentLineCrossAxisSize = currentCrossAxisSize,
-            isWrappingRound = false,
-            isEllipsisWrap = false
-        )
+        wrapInfo =
+            buildingBlocks.getWrapInfo(
+                nextItemHasNext = index + 2 < children.size,
+                nextIndexInLine = (index + 1) - lastBreak,
+                leftOver = IntIntPair(remaining, Constraints.Infinity),
+                nextSize =
+                    if (nextChild == null) {
+                        null
+                    } else {
+                        IntIntPair(nextMainAxisSize, nextCrossAxisSize)
+                    },
+                lineIndex = lineIndex,
+                totalCrossAxisSize = totalCrossAxisSize,
+                currentLineCrossAxisSize = currentCrossAxisSize,
+                isWrappingRound = false,
+                isEllipsisWrap = false
+            )
         if (wrapInfo.isLastItemInLine) {
             totalCrossAxisSize += currentCrossAxisSize + crossAxisSpacing
-            val ellipsisWrapInfo = buildingBlocks.getWrapEllipsisInfo(
-                wrapInfo,
-                hasNext = nextChild != null,
-                leftOverMainAxis = remaining,
-                lastContentLineIndex = lineIndex,
-                totalCrossAxisSize = totalCrossAxisSize,
-                nextIndexInLine = (index + 1) - lastBreak,
-            )
+            val ellipsisWrapInfo =
+                buildingBlocks.getWrapEllipsisInfo(
+                    wrapInfo,
+                    hasNext = nextChild != null,
+                    leftOverMainAxis = remaining,
+                    lastContentLineIndex = lineIndex,
+                    totalCrossAxisSize = totalCrossAxisSize,
+                    nextIndexInLine = (index + 1) - lastBreak,
+                )
             currentCrossAxisSize = 0
             remaining = mainAxisAvailable
             lastBreak = index + 1
@@ -1158,9 +1116,9 @@
 }
 
 /**
- * Breaks down items based on space, size and maximum items in main axis.
- * When items run out of space or the maximum items to fit in the main axis is reached,
- * it moves to the next "line" and moves the next batch of items to a new list of items
+ * Breaks down items based on space, size and maximum items in main axis. When items run out of
+ * space or the maximum items to fit in the main axis is reached, it moves to the next "line" and
+ * moves the next batch of items to a new list of items
  */
 internal fun MeasureScope.breakDownItems(
     measurePolicy: FlowLineMeasurePolicy,
@@ -1181,17 +1139,14 @@
 
     val spacing = ceil(mainAxisSpacingDp.toPx()).toInt()
     val crossAxisSpacing = ceil(crossAxisSpacingDp.toPx()).toInt()
-    val subsetConstraints = OrientationIndependentConstraints(
-        0,
-        mainAxisMax,
-        0,
-        crossAxisMax
-    )
-    val measureConstraints = subsetConstraints.copy(
-        mainAxisMin = 0
-    ).toBoxConstraints(
-        if (measurePolicy.isHorizontal) LayoutOrientation.Horizontal else LayoutOrientation.Vertical
-    )
+    val subsetConstraints = OrientationIndependentConstraints(0, mainAxisMax, 0, crossAxisMax)
+    val measureConstraints =
+        subsetConstraints
+            .copy(mainAxisMin = 0)
+            .toBoxConstraints(
+                if (measurePolicy.isHorizontal) LayoutOrientation.Horizontal
+                else LayoutOrientation.Vertical
+            )
 
     var index = 0
     var measurable: Measurable?
@@ -1200,26 +1155,25 @@
     var lineIndex = 0
     var leftOver = mainAxisMax
     var leftOverCrossAxis = crossAxisMax
-    val lineInfo = if (measurablesIterator is ContextualFlowItemIterator) {
-        FlowLineInfo(
-            lineIndex = lineIndex,
-            positionInLine = 0,
-            maxMainAxisSize = leftOver.toDp(),
-            maxCrossAxisSize = leftOverCrossAxis.toDp()
-        )
-    } else {
-        null
-    }
-
-    var nextSize = measurablesIterator.hasNext().run {
-        measurable = if (!this) null else measurablesIterator.safeNext(lineInfo)
-        measurable?.measureAndCache(
-            measurePolicy,
-            measureConstraints
-        ) { placeable ->
-            placeableItem = placeable
+    val lineInfo =
+        if (measurablesIterator is ContextualFlowItemIterator) {
+            FlowLineInfo(
+                lineIndex = lineIndex,
+                positionInLine = 0,
+                maxMainAxisSize = leftOver.toDp(),
+                maxCrossAxisSize = leftOverCrossAxis.toDp()
+            )
+        } else {
+            null
         }
-    }
+
+    var nextSize =
+        measurablesIterator.hasNext().run {
+            measurable = if (!this) null else measurablesIterator.safeNext(lineInfo)
+            measurable?.measureAndCache(measurePolicy, measureConstraints) { placeable ->
+                placeableItem = placeable
+            }
+        }
     var nextMainAxisSize: Int? = nextSize?.first
     var nextCrossAxisSize: Int? = nextSize?.second
 
@@ -1227,37 +1181,42 @@
     val endBreakLineList = mutableIntListOf()
     val crossAxisSizes = mutableIntListOf()
 
-    val buildingBlocks = FlowLayoutBuildingBlocks(
-        maxItemsInMainAxis = maxItemsInMainAxis,
-        mainAxisSpacing = spacing,
-        crossAxisSpacing = crossAxisSpacing,
-        constraints = constraints,
-        maxLines = maxLines,
-        overflow = overflow
-    )
+    val buildingBlocks =
+        FlowLayoutBuildingBlocks(
+            maxItemsInMainAxis = maxItemsInMainAxis,
+            mainAxisSpacing = spacing,
+            crossAxisSpacing = crossAxisSpacing,
+            constraints = constraints,
+            maxLines = maxLines,
+            overflow = overflow
+        )
     var ellipsisWrapInfo: FlowLayoutBuildingBlocks.WrapEllipsisInfo? = null
-    var wrapInfo = buildingBlocks.getWrapInfo(
-        nextItemHasNext = measurablesIterator.hasNext(),
-        leftOver = IntIntPair(leftOver, leftOverCrossAxis),
-        totalCrossAxisSize = 0,
-        nextSize = nextSize,
-        currentLineCrossAxisSize = 0,
-        nextIndexInLine = 0,
-        isWrappingRound = false,
-        isEllipsisWrap = false,
-        lineIndex = 0
-    ).also { wrapInfo ->
-        if (wrapInfo.isLastItemInContainer) {
-            ellipsisWrapInfo = buildingBlocks.getWrapEllipsisInfo(
-                wrapInfo,
-                nextSize != null,
-                lastContentLineIndex = -1,
+    var wrapInfo =
+        buildingBlocks
+            .getWrapInfo(
+                nextItemHasNext = measurablesIterator.hasNext(),
+                leftOver = IntIntPair(leftOver, leftOverCrossAxis),
                 totalCrossAxisSize = 0,
-                leftOver,
-                nextIndexInLine = 0
+                nextSize = nextSize,
+                currentLineCrossAxisSize = 0,
+                nextIndexInLine = 0,
+                isWrappingRound = false,
+                isEllipsisWrap = false,
+                lineIndex = 0
             )
-        }
-    }
+            .also { wrapInfo ->
+                if (wrapInfo.isLastItemInContainer) {
+                    ellipsisWrapInfo =
+                        buildingBlocks.getWrapEllipsisInfo(
+                            wrapInfo,
+                            nextSize != null,
+                            lastContentLineIndex = -1,
+                            totalCrossAxisSize = 0,
+                            leftOver,
+                            nextIndexInLine = 0
+                        )
+                }
+            }
 
     // figure out the mainAxisTotalSize which will be minMainAxis when measuring the row/column
     var mainAxisTotalSize = mainAxisMin
@@ -1280,56 +1239,61 @@
         lineInfo?.update(
             lineIndex = if (willFitLine) lineIndex else lineIndex + 1,
             positionInLine = if (willFitLine) nextIndexInLine else 0,
-            maxMainAxisSize = if (willFitLine) {
-                (leftOver - spacing).coerceAtLeast(0)
-            } else {
-                mainAxisMax
-            }.toDp(),
-            maxCrossAxisSize = if (willFitLine) {
-                leftOverCrossAxis
-            } else {
-                (leftOverCrossAxis - currentLineCrossAxisSize -
-                    crossAxisSpacing).coerceAtLeast(0)
-            }.toDp()
+            maxMainAxisSize =
+                if (willFitLine) {
+                        (leftOver - spacing).coerceAtLeast(0)
+                    } else {
+                        mainAxisMax
+                    }
+                    .toDp(),
+            maxCrossAxisSize =
+                if (willFitLine) {
+                        leftOverCrossAxis
+                    } else {
+                        (leftOverCrossAxis - currentLineCrossAxisSize - crossAxisSpacing)
+                            .coerceAtLeast(0)
+                    }
+                    .toDp()
         )
 
-        nextSize = measurablesIterator.hasNext().run {
-            measurable = if (!this) null else measurablesIterator.safeNext(lineInfo)
-            placeableItem = null
-            measurable?.measureAndCache(
-                measurePolicy,
-                measureConstraints
-            ) { placeable ->
-                placeableItem = placeable
+        nextSize =
+            measurablesIterator.hasNext().run {
+                measurable = if (!this) null else measurablesIterator.safeNext(lineInfo)
+                placeableItem = null
+                measurable?.measureAndCache(measurePolicy, measureConstraints) { placeable ->
+                    placeableItem = placeable
+                }
             }
-        }
         nextMainAxisSize = nextSize?.first?.plus(spacing)
         nextCrossAxisSize = nextSize?.second
 
-        wrapInfo = buildingBlocks.getWrapInfo(
-            nextItemHasNext = measurablesIterator.hasNext(),
-            leftOver = IntIntPair(leftOver, leftOverCrossAxis),
-            totalCrossAxisSize = crossAxisTotalSize,
-            nextSize = if (nextSize == null) null else
-                IntIntPair(nextMainAxisSize!!, nextCrossAxisSize!!),
-            currentLineCrossAxisSize = currentLineCrossAxisSize,
-            nextIndexInLine = nextIndexInLine,
-            isWrappingRound = false,
-            isEllipsisWrap = false,
-            lineIndex = lineIndex
-        )
+        wrapInfo =
+            buildingBlocks.getWrapInfo(
+                nextItemHasNext = measurablesIterator.hasNext(),
+                leftOver = IntIntPair(leftOver, leftOverCrossAxis),
+                totalCrossAxisSize = crossAxisTotalSize,
+                nextSize =
+                    if (nextSize == null) null
+                    else IntIntPair(nextMainAxisSize!!, nextCrossAxisSize!!),
+                currentLineCrossAxisSize = currentLineCrossAxisSize,
+                nextIndexInLine = nextIndexInLine,
+                isWrappingRound = false,
+                isEllipsisWrap = false,
+                lineIndex = lineIndex
+            )
         if (wrapInfo.isLastItemInLine) {
             mainAxisTotalSize = maxOf(mainAxisTotalSize, currentLineMainAxisSize)
             mainAxisTotalSize = minOf(mainAxisTotalSize, mainAxisMax)
             crossAxisTotalSize += currentLineCrossAxisSize
-            ellipsisWrapInfo = buildingBlocks.getWrapEllipsisInfo(
-                wrapInfo,
-                nextSize != null,
-                lastContentLineIndex = lineIndex,
-                totalCrossAxisSize = crossAxisTotalSize,
-                leftOver,
-                (index + 1) - startBreakLineIndex
-            )
+            ellipsisWrapInfo =
+                buildingBlocks.getWrapEllipsisInfo(
+                    wrapInfo,
+                    nextSize != null,
+                    lastContentLineIndex = lineIndex,
+                    totalCrossAxisSize = crossAxisTotalSize,
+                    leftOver,
+                    (index + 1) - startBreakLineIndex
+                )
             crossAxisSizes.add(currentLineCrossAxisSize)
             leftOver = mainAxisMax
             leftOverCrossAxis = crossAxisMax - crossAxisTotalSize - crossAxisSpacing
@@ -1360,9 +1324,7 @@
         }
     }
 
-    val arrayOfPlaceables: Array<Placeable?> = Array(measurables.size) {
-        placeables[it]
-    }
+    val arrayOfPlaceables: Array<Placeable?> = Array(measurables.size) { placeables[it] }
     val crossAxisOffsets = IntArray(endBreakLineList.size) { 0 }
     val crossAxisSizesArray = IntArray(endBreakLineList.size) { 0 }
     crossAxisTotalSize = 0
@@ -1370,20 +1332,21 @@
     var startIndex = 0
     endBreakLineList.forEachIndexed { currentLineIndex, endIndex ->
         var crossAxisSize = crossAxisSizes[currentLineIndex]
-        val result = measurePolicy.measure(
-            mainAxisMin = mainAxisTotalSize,
-            crossAxisMin = subsetConstraints.crossAxisMin,
-            mainAxisMax = subsetConstraints.mainAxisMax,
-            crossAxisMax = crossAxisSize,
-            spacing,
-            this,
-            measurables,
-            arrayOfPlaceables,
-            startIndex,
-            endIndex,
-            crossAxisOffsets,
-            currentLineIndex
-        )
+        val result =
+            measurePolicy.measure(
+                mainAxisMin = mainAxisTotalSize,
+                crossAxisMin = subsetConstraints.crossAxisMin,
+                mainAxisMax = subsetConstraints.mainAxisMax,
+                crossAxisMax = crossAxisSize,
+                spacing,
+                this,
+                measurables,
+                arrayOfPlaceables,
+                startIndex,
+                endIndex,
+                crossAxisOffsets,
+                currentLineIndex
+            )
         var mainAxisSize: Int
         if (measurePolicy.isHorizontal) {
             mainAxisSize = result.width
@@ -1395,9 +1358,7 @@
         crossAxisSizesArray[currentLineIndex] = crossAxisSize
         crossAxisTotalSize += crossAxisSize
         mainAxisTotalSize = maxOf(mainAxisTotalSize, mainAxisSize)
-        items.add(
-            result
-        )
+        items.add(result)
         startIndex = endIndex
     }
 
@@ -1458,7 +1419,7 @@
 ): IntIntPair {
     return if (
         rowColumnParentData.weight == 0f &&
-        rowColumnParentData?.flowLayoutData?.fillCrossAxisFraction == null
+            rowColumnParentData?.flowLayoutData?.fillCrossAxisFraction == null
     ) {
         // fixed sizes: measure once
         val placeable = measure(constraints).also(storePlaceable)
@@ -1493,37 +1454,22 @@
         with(requireNotNull(verticalArrangement) { "null verticalArrangement" }) {
             val totalCrossAxisSpacing = spacing.roundToPx() * (items.size - 1)
             totalCrossAxisSize += totalCrossAxisSpacing
-            totalCrossAxisSize = totalCrossAxisSize.coerceIn(
-                constraints.crossAxisMin,
-                constraints.crossAxisMax
-            )
-            arrange(
-                totalCrossAxisSize,
-                crossAxisSizes,
-                outPosition
-            )
+            totalCrossAxisSize =
+                totalCrossAxisSize.coerceIn(constraints.crossAxisMin, constraints.crossAxisMax)
+            arrange(totalCrossAxisSize, crossAxisSizes, outPosition)
         }
     } else {
         with(requireNotNull(horizontalArrangement) { "null horizontalArrangement" }) {
             val totalCrossAxisSpacing = spacing.roundToPx() * (items.size - 1)
             totalCrossAxisSize += totalCrossAxisSpacing
-            totalCrossAxisSize = totalCrossAxisSize.coerceIn(
-                constraints.crossAxisMin,
-                constraints.crossAxisMax
-            )
-            arrange(
-                totalCrossAxisSize,
-                crossAxisSizes,
-                layoutDirection,
-                outPosition
-            )
+            totalCrossAxisSize =
+                totalCrossAxisSize.coerceIn(constraints.crossAxisMin, constraints.crossAxisMax)
+            arrange(totalCrossAxisSize, crossAxisSizes, layoutDirection, outPosition)
         }
     }
 
-    val finalMainAxisTotalSize = mainAxisTotalSize.coerceIn(
-        constraints.mainAxisMin,
-        constraints.mainAxisMax
-    )
+    val finalMainAxisTotalSize =
+        mainAxisTotalSize.coerceIn(constraints.mainAxisMin, constraints.mainAxisMax)
 
     var layoutWidth: Int
     var layoutHeight: Int
@@ -1536,8 +1482,6 @@
     }
 
     return layout(layoutWidth, layoutHeight) {
-        items.forEach { measureResult ->
-            measureResult.placeChildren()
-        }
+        items.forEach { measureResult -> measureResult.placeChildren() }
     }
 }
diff --git a/compose/foundation/foundation-layout/src/commonMain/kotlin/androidx/compose/foundation/layout/FlowLayoutBuildingBlocks.kt b/compose/foundation/foundation-layout/src/commonMain/kotlin/androidx/compose/foundation/layout/FlowLayoutBuildingBlocks.kt
index d49e626..956bd2c 100644
--- a/compose/foundation/foundation-layout/src/commonMain/kotlin/androidx/compose/foundation/layout/FlowLayoutBuildingBlocks.kt
+++ b/compose/foundation/foundation-layout/src/commonMain/kotlin/androidx/compose/foundation/layout/FlowLayoutBuildingBlocks.kt
@@ -51,15 +51,14 @@
     ): WrapEllipsisInfo? {
         if (!wrapInfo.isLastItemInContainer) return null
 
-        val ellipsisInfo = overflow.ellipsisInfo(
-            hasNext,
-            lastContentLineIndex,
-            totalCrossAxisSize
-        ) ?: return null
+        val ellipsisInfo =
+            overflow.ellipsisInfo(hasNext, lastContentLineIndex, totalCrossAxisSize) ?: return null
 
-        val canFitLine = lastContentLineIndex >= 0 && (nextIndexInLine == 0 ||
-            !(leftOverMainAxis - ellipsisInfo.ellipsisSize.first < 0 ||
-                nextIndexInLine >= maxItemsInMainAxis))
+        val canFitLine =
+            lastContentLineIndex >= 0 &&
+                (nextIndexInLine == 0 ||
+                    !(leftOverMainAxis - ellipsisInfo.ellipsisSize.first < 0 ||
+                        nextIndexInLine >= maxItemsInMainAxis))
 
         ellipsisInfo.placeEllipsisOnLastContentLine = canFitLine
         return ellipsisInfo
@@ -78,109 +77,98 @@
     ): WrapInfo {
         var totalContainerCrossAxisSize = totalCrossAxisSize + currentLineCrossAxisSize
         if (nextSize == null) {
-            return WrapInfo(
-                isLastItemInLine = true,
-                isLastItemInContainer = true
-            )
+            return WrapInfo(isLastItemInLine = true, isLastItemInContainer = true)
         }
 
-        val willOverflowCrossAxis = when {
-            overflow.type == FlowLayoutOverflow.OverflowType.Visible -> false
-            lineIndex >= maxLines -> true
-            leftOver.second - nextSize.second < 0 -> true
-            else -> false
-        }
+        val willOverflowCrossAxis =
+            when {
+                overflow.type == FlowLayoutOverflow.OverflowType.Visible -> false
+                lineIndex >= maxLines -> true
+                leftOver.second - nextSize.second < 0 -> true
+                else -> false
+            }
 
         if (willOverflowCrossAxis) {
-            return WrapInfo(
-                isLastItemInLine = true,
-                isLastItemInContainer = true
-            )
+            return WrapInfo(isLastItemInLine = true, isLastItemInContainer = true)
         }
 
-        val shouldWrapItem = when {
-            nextIndexInLine == 0 -> false
-            nextIndexInLine >= maxItemsInMainAxis -> true
-            leftOver.first - nextSize.first < 0 -> true
-            else -> false
-        }
+        val shouldWrapItem =
+            when {
+                nextIndexInLine == 0 -> false
+                nextIndexInLine >= maxItemsInMainAxis -> true
+                leftOver.first - nextSize.first < 0 -> true
+                else -> false
+            }
 
         if (shouldWrapItem) {
             if (isWrappingRound) {
-                return WrapInfo(
-                    isLastItemInLine = true,
-                    isLastItemInContainer = true
-                )
+                return WrapInfo(isLastItemInLine = true, isLastItemInContainer = true)
             }
-            val wrapInfo = getWrapInfo(
-                nextItemHasNext,
-                nextIndexInLine = 0,
-                leftOver = IntIntPair(
-                    constraints.mainAxisMax,
-                    leftOver.second -
-                    crossAxisSpacing -
-                    currentLineCrossAxisSize
-                ),
-                // remove the mainAxisSpacing added to 2nd position or more indexed items.
-                IntIntPair(
-                    first = nextSize.first.minus(mainAxisSpacing),
-                    second = nextSize.second
-                ),
-                lineIndex = lineIndex + 1,
-                totalCrossAxisSize = totalContainerCrossAxisSize,
-                currentLineCrossAxisSize = 0,
-                isWrappingRound = true,
-                isEllipsisWrap = false
-            )
+            val wrapInfo =
+                getWrapInfo(
+                    nextItemHasNext,
+                    nextIndexInLine = 0,
+                    leftOver =
+                        IntIntPair(
+                            constraints.mainAxisMax,
+                            leftOver.second - crossAxisSpacing - currentLineCrossAxisSize
+                        ),
+                    // remove the mainAxisSpacing added to 2nd position or more indexed items.
+                    IntIntPair(
+                        first = nextSize.first.minus(mainAxisSpacing),
+                        second = nextSize.second
+                    ),
+                    lineIndex = lineIndex + 1,
+                    totalCrossAxisSize = totalContainerCrossAxisSize,
+                    currentLineCrossAxisSize = 0,
+                    isWrappingRound = true,
+                    isEllipsisWrap = false
+                )
             return WrapInfo(
                 isLastItemInLine = true,
                 isLastItemInContainer = wrapInfo.isLastItemInContainer
             )
         }
 
-        totalContainerCrossAxisSize = totalCrossAxisSize + max(
-            currentLineCrossAxisSize,
-            nextSize.second)
+        totalContainerCrossAxisSize =
+            totalCrossAxisSize + max(currentLineCrossAxisSize, nextSize.second)
 
-        val ellipsis = if (isEllipsisWrap) {
-            null
-        } else {
-            overflow.ellipsisSize(
-                nextItemHasNext,
-                lineIndex,
-                totalContainerCrossAxisSize
-            )
-        }
-        val shouldWrapEllipsis = ellipsis?.run {
-            when {
-                nextIndexInLine + 1 >= maxItemsInMainAxis -> true
-                leftOver.first - nextSize.first - mainAxisSpacing - ellipsis.first < 0 -> true
-                else -> false
+        val ellipsis =
+            if (isEllipsisWrap) {
+                null
+            } else {
+                overflow.ellipsisSize(nextItemHasNext, lineIndex, totalContainerCrossAxisSize)
             }
-        } ?: false
+        val shouldWrapEllipsis =
+            ellipsis?.run {
+                when {
+                    nextIndexInLine + 1 >= maxItemsInMainAxis -> true
+                    leftOver.first - nextSize.first - mainAxisSpacing - ellipsis.first < 0 -> true
+                    else -> false
+                }
+            } ?: false
 
         if (shouldWrapEllipsis) {
             if (isEllipsisWrap) {
-                return WrapInfo(
-                    isLastItemInLine = true,
-                    isLastItemInContainer = true
-                )
+                return WrapInfo(isLastItemInLine = true, isLastItemInContainer = true)
             }
-            val wrapInfo = getWrapInfo(
-                nextItemHasNext = false,
-                nextIndexInLine = 0,
-                IntIntPair(
-                    constraints.mainAxisMax,
-                    leftOver.second -
-                    crossAxisSpacing - max(currentLineCrossAxisSize, nextSize.second)
-                ),
-                ellipsis,
-                lineIndex = lineIndex + 1,
-                totalCrossAxisSize = totalContainerCrossAxisSize,
-                currentLineCrossAxisSize = 0,
-                isWrappingRound = true,
-                isEllipsisWrap = true
-            )
+            val wrapInfo =
+                getWrapInfo(
+                    nextItemHasNext = false,
+                    nextIndexInLine = 0,
+                    IntIntPair(
+                        constraints.mainAxisMax,
+                        leftOver.second -
+                            crossAxisSpacing -
+                            max(currentLineCrossAxisSize, nextSize.second)
+                    ),
+                    ellipsis,
+                    lineIndex = lineIndex + 1,
+                    totalCrossAxisSize = totalContainerCrossAxisSize,
+                    currentLineCrossAxisSize = 0,
+                    isWrappingRound = true,
+                    isEllipsisWrap = true
+                )
 
             return WrapInfo(
                 isLastItemInLine = wrapInfo.isLastItemInContainer,
@@ -188,9 +176,6 @@
             )
         }
 
-        return WrapInfo(
-            isLastItemInLine = false,
-            isLastItemInContainer = false
-        )
+        return WrapInfo(isLastItemInLine = false, isLastItemInContainer = false)
     }
 }
diff --git a/compose/foundation/foundation-layout/src/commonMain/kotlin/androidx/compose/foundation/layout/FlowLayoutOverflow.kt b/compose/foundation/foundation-layout/src/commonMain/kotlin/androidx/compose/foundation/layout/FlowLayoutOverflow.kt
index e97b729..fd6eaf2 100644
--- a/compose/foundation/foundation-layout/src/commonMain/kotlin/androidx/compose/foundation/layout/FlowLayoutOverflow.kt
+++ b/compose/foundation/foundation-layout/src/commonMain/kotlin/androidx/compose/foundation/layout/FlowLayoutOverflow.kt
@@ -39,53 +39,46 @@
 /**
  * Overflow Handling Options
  *
- * This enumeration defines the available options for handling content that exceeds
- * the boundaries of its container for [FlowRow].
+ * This enumeration defines the available options for handling content that exceeds the boundaries
+ * of its container for [FlowRow].
  *
  * Options:
- *
- * - [Visible]: The overflowing content remains visible outside its container.
- * This can lead to overlapping with other elements. Use this option when it's crucial to
- * display all content, regardless of the container's size.
- *
- * - [Clip]: The overflowing content is clipped and not visible beyond the boundary of
- * its container. Ideal for maintaining a clean and uncluttered UI,
- * where overlapping elements are undesirable.
- *
- * - [expandIndicator]: Behaves similar to [Clip], however shows an indicator or button
- * indicating that more items can be loaded.
- *
- * - [expandOrCollapseIndicator]: Extends the [expandIndicator] functionality
- * by adding a 'Collapse' option. After expanding the content, users can
- * choose to collapse it back to the summary view.
+ * - [Visible]: The overflowing content remains visible outside its container. This can lead to
+ *   overlapping with other elements. Use this option when it's crucial to display all content,
+ *   regardless of the container's size.
+ * - [Clip]: The overflowing content is clipped and not visible beyond the boundary of its
+ *   container. Ideal for maintaining a clean and uncluttered UI, where overlapping elements are
+ *   undesirable.
+ * - [expandIndicator]: Behaves similar to [Clip], however shows an indicator or button indicating
+ *   that more items can be loaded.
+ * - [expandOrCollapseIndicator]: Extends the [expandIndicator] functionality by adding a 'Collapse'
+ *   option. After expanding the content, users can choose to collapse it back to the summary view.
  */
 @ExperimentalLayoutApi
-class FlowRowOverflow private constructor(
+class FlowRowOverflow
+private constructor(
     type: OverflowType,
     minLinesToShowCollapse: Int = 0,
     minCrossAxisSizeToShowCollapse: Int = 0,
     seeMoreGetter: ((state: FlowLayoutOverflowState) -> @Composable () -> Unit)? = null,
     collapseGetter: ((state: FlowLayoutOverflowState) -> @Composable () -> Unit)? = null
-) : FlowLayoutOverflow(
-    type,
-    minLinesToShowCollapse,
-    minCrossAxisSizeToShowCollapse,
-    seeMoreGetter,
-    collapseGetter
-) {
+) :
+    FlowLayoutOverflow(
+        type,
+        minLinesToShowCollapse,
+        minCrossAxisSizeToShowCollapse,
+        seeMoreGetter,
+        collapseGetter
+    ) {
 
     companion object {
-        /**
-         * Display all content, even if there is not enough space in the specified bounds.
-         */
+        /** Display all content, even if there is not enough space in the specified bounds. */
         @Suppress("OPT_IN_MARKER_ON_WRONG_TARGET")
         @ExperimentalLayoutApi
         @get:ExperimentalLayoutApi
         val Visible = FlowRowOverflow(OverflowType.Visible)
 
-        /**
-         * Clip the overflowing content to fix its container.
-         */
+        /** Clip the overflowing content to fix its container. */
         @Suppress("OPT_IN_MARKER_ON_WRONG_TARGET")
         @ExperimentalLayoutApi
         @get:ExperimentalLayoutApi
@@ -94,54 +87,46 @@
         /**
          * Registers an "expand indicator" composable for handling overflow in a [FlowRow].
          *
-         * This function allows the creation of a custom composable that can be displayed
-         * when there are more items in the [FlowRow] than can be displayed in the available
-         * space. The "expandable indicator" composable can be tailored to show a summary, a button,
-         * or any other composable element that indicates the presence of additional items.
+         * This function allows the creation of a custom composable that can be displayed when there
+         * are more items in the [FlowRow] than can be displayed in the available space. The
+         * "expandable indicator" composable can be tailored to show a summary, a button, or any
+         * other composable element that indicates the presence of additional items.
          *
          * @sample androidx.compose.foundation.layout.samples.SimpleFlowRowMaxLinesWithSeeMore
          *
          * @param content composable that visually indicates more items can be loaded.
          */
         @ExperimentalLayoutApi
-        fun expandIndicator(
-            content: @Composable FlowRowOverflowScope.() -> Unit
-        ): FlowRowOverflow {
+        fun expandIndicator(content: @Composable FlowRowOverflowScope.() -> Unit): FlowRowOverflow {
             val seeMoreGetter = { state: FlowLayoutOverflowState ->
                 @Composable {
                     val scope = FlowRowOverflowScopeImpl(state)
                     scope.content()
                 }
             }
-            return FlowRowOverflow(
-                OverflowType.ExpandIndicator,
-                seeMoreGetter = seeMoreGetter
-            )
+            return FlowRowOverflow(OverflowType.ExpandIndicator, seeMoreGetter = seeMoreGetter)
         }
 
         /**
-         * Registers an "expand or collapse indicator" composable for handling
-         * overflow in a [FlowRow].
+         * Registers an "expand or collapse indicator" composable for handling overflow in a
+         * [FlowRow].
          *
          * This function is designed to switch between two states: a "Expandable" state when there
          * are more items to show, and a "Collapsable" state when all items are being displayed and
          * can be collapsed.
          *
-         * Prior to layout, the function evaluates both composables indicators to determine
-         * their maximum intrinsic size. Depending on the space available and the number
-         * of items, either the [expandIndicator] or the [collapseIndicator] is rendered.
+         * Prior to layout, the function evaluates both composables indicators to determine their
+         * maximum intrinsic size. Depending on the space available and the number of items, either
+         * the [expandIndicator] or the [collapseIndicator] is rendered.
          *
          * @sample androidx.compose.foundation.layout.samples.SimpleFlowRowMaxLinesDynamicSeeMore
          *
-         * @param minRowsToShowCollapse Specifies the minimum number of rows that
-         *        should be visible before showing the collapse option. This parameter is useful
-         *        when the number of rows is too small to be reduced further.
-         *
-         * @param minHeightToShowCollapse Specifies the minimum height at
-         *        which the collapse option should be displayed.
-         *        This parameter is useful for preventing the collapse
-         *        option from appearing when the height is too narrow.
-         *
+         * @param minRowsToShowCollapse Specifies the minimum number of rows that should be visible
+         *   before showing the collapse option. This parameter is useful when the number of rows is
+         *   too small to be reduced further.
+         * @param minHeightToShowCollapse Specifies the minimum height at which the collapse option
+         *   should be displayed. This parameter is useful for preventing the collapse option from
+         *   appearing when the height is too narrow.
          * @param expandIndicator composable that visually indicates more items can be loaded.
          * @param collapseIndicator composable that visually indicates less items can be loaded.
          */
@@ -153,9 +138,8 @@
             minRowsToShowCollapse: Int = 1,
             minHeightToShowCollapse: Dp = 0.dp,
         ): FlowRowOverflow {
-            val minHeightToShowCollapsePx = with(LocalDensity.current) {
-                minHeightToShowCollapse.roundToPx()
-            }
+            val minHeightToShowCollapsePx =
+                with(LocalDensity.current) { minHeightToShowCollapse.roundToPx() }
             return remember(
                 minRowsToShowCollapse,
                 minHeightToShowCollapsePx,
@@ -191,52 +175,45 @@
 /**
  * Overflow Handling Options
  *
- * This enumeration defines the available options for handling content that exceeds
- * the boundaries of its container for [FlowColumn] and [ContextualFlowColumn].
+ * This enumeration defines the available options for handling content that exceeds the boundaries
+ * of its container for [FlowColumn] and [ContextualFlowColumn].
  *
  * Options:
- *
- * - [Visible]: The overflowing content remains visible outside its container.
- * This can lead to overlapping with other elements. Use this option when it's crucial to
- * display all content, regardless of the container's size.
- *
- * - [Clip]: The overflowing content is clipped and not visible beyond the boundary of
- * its container. Ideal for maintaining a clean and uncluttered UI,
- * where overlapping elements are undesirable.
- *
- * - [expandIndicator]: Behaves similar to [Clip], however shows an indicator or button
- * indicating that more items can be loaded.
- *
- * - [expandOrCollapseIndicator]: Extends the [expandIndicator] functionality
- * by adding a 'Collapse' option. After expanding the content, users can
- * choose to collapse it back to the summary view.
+ * - [Visible]: The overflowing content remains visible outside its container. This can lead to
+ *   overlapping with other elements. Use this option when it's crucial to display all content,
+ *   regardless of the container's size.
+ * - [Clip]: The overflowing content is clipped and not visible beyond the boundary of its
+ *   container. Ideal for maintaining a clean and uncluttered UI, where overlapping elements are
+ *   undesirable.
+ * - [expandIndicator]: Behaves similar to [Clip], however shows an indicator or button indicating
+ *   that more items can be loaded.
+ * - [expandOrCollapseIndicator]: Extends the [expandIndicator] functionality by adding a 'Collapse'
+ *   option. After expanding the content, users can choose to collapse it back to the summary view.
  */
 @ExperimentalLayoutApi
-class FlowColumnOverflow private constructor(
+class FlowColumnOverflow
+private constructor(
     type: OverflowType,
     minLinesToShowCollapse: Int = 0,
     minCrossAxisSizeToShowCollapse: Int = 0,
     seeMoreGetter: ((state: FlowLayoutOverflowState) -> @Composable () -> Unit)? = null,
     collapseGetter: ((state: FlowLayoutOverflowState) -> @Composable () -> Unit)? = null
-) : FlowLayoutOverflow(
-    type,
-    minLinesToShowCollapse,
-    minCrossAxisSizeToShowCollapse,
-    seeMoreGetter,
-    collapseGetter
-) {
+) :
+    FlowLayoutOverflow(
+        type,
+        minLinesToShowCollapse,
+        minCrossAxisSizeToShowCollapse,
+        seeMoreGetter,
+        collapseGetter
+    ) {
     companion object {
-        /**
-         * Display all content, even if there is not enough space in the specified bounds.
-         */
+        /** Display all content, even if there is not enough space in the specified bounds. */
         @Suppress("OPT_IN_MARKER_ON_WRONG_TARGET")
         @ExperimentalLayoutApi
         @get:ExperimentalLayoutApi
         val Visible = FlowColumnOverflow(FlowLayoutOverflow.OverflowType.Visible)
 
-        /**
-         * Clip the overflowing content to fix its container.
-         */
+        /** Clip the overflowing content to fix its container. */
         @Suppress("OPT_IN_MARKER_ON_WRONG_TARGET")
         @ExperimentalLayoutApi
         @get:ExperimentalLayoutApi
@@ -245,10 +222,10 @@
         /**
          * Registers an "expand indicator" composable for handling overflow in a [FlowColumn].
          *
-         * This function allows the creation of a custom composable that can be displayed
-         * when there are more items in the [FlowColumn] than can be displayed in the available
-         * space. The "expandable indicator" composable can be tailored to show a summary, a button,
-         * or any other composable element that indicates the presence of additional items.
+         * This function allows the creation of a custom composable that can be displayed when there
+         * are more items in the [FlowColumn] than can be displayed in the available space. The
+         * "expandable indicator" composable can be tailored to show a summary, a button, or any
+         * other composable element that indicates the presence of additional items.
          *
          * @sample androidx.compose.foundation.layout.samples.SimpleFlowColumnMaxLinesWithSeeMore
          *
@@ -264,34 +241,29 @@
                     scope.content()
                 }
             }
-            return FlowColumnOverflow(
-                OverflowType.ExpandIndicator,
-                seeMoreGetter = seeMoreGetter
-            )
+            return FlowColumnOverflow(OverflowType.ExpandIndicator, seeMoreGetter = seeMoreGetter)
         }
 
         /**
-         * Registers an "expand or collapse indicator" composable for handling
-         * overflow in a [FlowColumn].
+         * Registers an "expand or collapse indicator" composable for handling overflow in a
+         * [FlowColumn].
          *
          * This function is designed to switch between two states: a "Expandable" state when there
          * are more items to show, and a "Collapsable" state when all items are being displayed and
          * can be collapsed.
          *
-         * Prior to layout, the function evaluates both composables indicators to determine
-         * their maximum intrinsic size. Depending on the space available and the number
-         * of items, either the [expandIndicator] or the [collapseIndicator] is rendered.
+         * Prior to layout, the function evaluates both composables indicators to determine their
+         * maximum intrinsic size. Depending on the space available and the number of items, either
+         * the [expandIndicator] or the [collapseIndicator] is rendered.
          *
          * @sample androidx.compose.foundation.layout.samples.SimpleFlowColumnMaxLinesDynamicSeeMore
          *
-         * @param minColumnsToShowCollapse Specifies the minimum number of columns that
-         *        should be visible before showing the collapse option. This parameter is useful
-         *        when the number of columns is too small to be reduced further.
-         *
-         * @param minWidthToShowCollapse Specifies the minimum width at which the collapse
-         *        option should be displayed. This parameter is useful for preventing the collapse
-         *        option from appearing when the width is too narrow.
-         *
+         * @param minColumnsToShowCollapse Specifies the minimum number of columns that should be
+         *   visible before showing the collapse option. This parameter is useful when the number of
+         *   columns is too small to be reduced further.
+         * @param minWidthToShowCollapse Specifies the minimum width at which the collapse option
+         *   should be displayed. This parameter is useful for preventing the collapse option from
+         *   appearing when the width is too narrow.
          * @param expandIndicator composable that visually indicates more items can be loaded.
          * @param collapseIndicator composable that visually indicates less items can be loaded.
          */
@@ -303,9 +275,8 @@
             minColumnsToShowCollapse: Int = 1,
             minWidthToShowCollapse: Dp = 0.dp,
         ): FlowColumnOverflow {
-            val minWidthToShowCollapsePx = with(LocalDensity.current) {
-                minWidthToShowCollapse.roundToPx()
-            }
+            val minWidthToShowCollapsePx =
+                with(LocalDensity.current) { minWidthToShowCollapse.roundToPx() }
             return remember(
                 minColumnsToShowCollapse,
                 minWidthToShowCollapsePx,
@@ -341,68 +312,59 @@
 /**
  * Overflow Handling Options
  *
- * This enumeration defines the available options for handling content that exceeds
- * the boundaries of its container for [ContextualFlowRow].
- *
+ * This enumeration defines the available options for handling content that exceeds the boundaries
+ * of its container for [ContextualFlowRow].
  *
  * Options:
- *
- * - [Visible]: The overflowing content remains visible outside its container.
- * This can lead to overlapping with other elements. Use this option when it's crucial to
- * display all content, regardless of the container's size.
- *
- * - [Clip]: The overflowing content is clipped and not visible beyond the boundary of
- * its container. Ideal for maintaining a clean and uncluttered UI,
- * where overlapping elements are undesirable.
- *
- * - [expandIndicator]: Behaves similar to [Clip], however shows an indicator or button
- * indicating that more items can be loaded.
- *
- * - [expandOrCollapseIndicator]: Extends the [expandIndicator] functionality
- * by adding a 'Collapse' option. After expanding the content, users can
- * choose to collapse it back to the summary view.
+ * - [Visible]: The overflowing content remains visible outside its container. This can lead to
+ *   overlapping with other elements. Use this option when it's crucial to display all content,
+ *   regardless of the container's size.
+ * - [Clip]: The overflowing content is clipped and not visible beyond the boundary of its
+ *   container. Ideal for maintaining a clean and uncluttered UI, where overlapping elements are
+ *   undesirable.
+ * - [expandIndicator]: Behaves similar to [Clip], however shows an indicator or button indicating
+ *   that more items can be loaded.
+ * - [expandOrCollapseIndicator]: Extends the [expandIndicator] functionality by adding a 'Collapse'
+ *   option. After expanding the content, users can choose to collapse it back to the summary view.
  */
 @ExperimentalLayoutApi
-class ContextualFlowRowOverflow private constructor(
+class ContextualFlowRowOverflow
+private constructor(
     type: OverflowType,
     minLinesToShowCollapse: Int = 0,
     minCrossAxisSizeToShowCollapse: Int = 0,
     seeMoreGetter: ((state: FlowLayoutOverflowState) -> @Composable () -> Unit)? = null,
     collapseGetter: ((state: FlowLayoutOverflowState) -> @Composable () -> Unit)? = null
-) : FlowLayoutOverflow(
-    type,
-    minLinesToShowCollapse,
-    minCrossAxisSizeToShowCollapse,
-    seeMoreGetter,
-    collapseGetter
-) {
+) :
+    FlowLayoutOverflow(
+        type,
+        minLinesToShowCollapse,
+        minCrossAxisSizeToShowCollapse,
+        seeMoreGetter,
+        collapseGetter
+    ) {
 
     companion object {
-        /**
-         * Display all content, even if there is not enough space in the specified bounds.
-         */
+        /** Display all content, even if there is not enough space in the specified bounds. */
         @Suppress("OPT_IN_MARKER_ON_WRONG_TARGET")
         @ExperimentalLayoutApi
         @get:ExperimentalLayoutApi
         val Visible = ContextualFlowRowOverflow(FlowLayoutOverflow.OverflowType.Visible)
 
-        /**
-         * Clip the overflowing content to fix its container.
-         */
+        /** Clip the overflowing content to fix its container. */
         @Suppress("OPT_IN_MARKER_ON_WRONG_TARGET")
         @ExperimentalLayoutApi
         @get:ExperimentalLayoutApi
         val Clip = ContextualFlowRowOverflow(FlowLayoutOverflow.OverflowType.Clip)
 
         /**
-         * Registers an "expand indicator" composable for handling overflow
-         * in a [ContextualFlowRow].
+         * Registers an "expand indicator" composable for handling overflow in a
+         * [ContextualFlowRow].
          *
-         * This function allows the creation of a custom composable that can be displayed
-         * when there are more items in the [ContextualFlowRow] than can be displayed
-         * in the available space. The "expandable indicator" composable can be tailored to
-         * show a summary, a button, or any other composable element that indicates
-         * the presence of additional items.
+         * This function allows the creation of a custom composable that can be displayed when there
+         * are more items in the [ContextualFlowRow] than can be displayed in the available space.
+         * The "expandable indicator" composable can be tailored to show a summary, a button, or any
+         * other composable element that indicates the presence of additional items.
          *
          * @param content composable that visually indicates more items can be loaded.
          */
@@ -423,28 +385,25 @@
         }
 
         /**
-         * Registers an "expand or collapse indicator" composable for handling
-         * overflow in a [ContextualFlowRow].
+         * Registers an "expand or collapse indicator" composable for handling overflow in a
+         * [ContextualFlowRow].
          *
          * This function is designed to switch between two states: a "Expandable" state when there
          * are more items to show, and a "Collapsable" state when all items are being displayed and
          * can be collapsed.
          *
-         * Prior to layout, the function evaluates both composables indicators to determine
-         * their maximum intrinsic size. Depending on the space available and the number
-         * of items, either the [expandIndicator] or the [collapseIndicator] is rendered.
+         * Prior to layout, the function evaluates both composables indicators to determine their
+         * maximum intrinsic size. Depending on the space available and the number of items, either
+         * the [expandIndicator] or the [collapseIndicator] is rendered.
          *
          * @sample androidx.compose.foundation.layout.samples.ContextualFlowRowMaxLineDynamicSeeMore
          *
-         * @param minRowsToShowCollapse Specifies the minimum number of rows that
-         *        should be visible before showing the collapse option. This parameter is useful
-         *        when the number of rows is too small to be reduced further.
-         *
-         * @param minHeightToShowCollapse Specifies the minimum height at
-         *        which the collapse option should be displayed.
-         *        This parameter is useful for preventing the collapse
-         *        option from appearing when the height is too narrow.
-         *
+         * @param minRowsToShowCollapse Specifies the minimum number of rows that should be visible
+         *   before showing the collapse option. This parameter is useful when the number of rows is
+         *   too small to be reduced further.
+         * @param minHeightToShowCollapse Specifies the minimum height at which the collapse option
+         *   should be displayed. This parameter is useful for preventing the collapse option from
+         *   appearing when the height is too narrow.
          * @param expandIndicator composable that visually indicates more items can be loaded.
          * @param collapseIndicator composable that visually indicates less items can be loaded.
          */
@@ -456,9 +415,8 @@
             minRowsToShowCollapse: Int = 1,
             minHeightToShowCollapse: Dp = 0.dp,
         ): ContextualFlowRowOverflow {
-            val minHeightToShowCollapsePx = with(LocalDensity.current) {
-                minHeightToShowCollapse.roundToPx()
-            }
+            val minHeightToShowCollapsePx =
+                with(LocalDensity.current) { minHeightToShowCollapse.roundToPx() }
             return remember(
                 minRowsToShowCollapse,
                 minHeightToShowCollapsePx,
@@ -494,67 +452,59 @@
 /**
  * Overflow Handling Options
  *
- * This enumeration defines the available options for handling content that exceeds
- * the boundaries of its container for [ContextualFlowColumn].
+ * This enumeration defines the available options for handling content that exceeds the boundaries
+ * of its container for [ContextualFlowColumn].
  *
  * Options:
- *
- * - [Visible]: The overflowing content remains visible outside its container.
- * This can lead to overlapping with other elements. Use this option when it's crucial to
- * display all content, regardless of the container's size.
- *
- * - [Clip]: The overflowing content is clipped and not visible beyond the boundary of
- * its container. Ideal for maintaining a clean and uncluttered UI,
- * where overlapping elements are undesirable.
- *
- * - [expandIndicator]: Behaves similar to [Clip], however shows an indicator or button
- * indicating that more items can be loaded.
- *
- * - [expandOrCollapseIndicator]: Extends the [expandIndicator] functionality
- * by adding a 'Collapse' option. After expanding the content, users can
- * choose to collapse it back to the summary view.
+ * - [Visible]: The overflowing content remains visible outside its container. This can lead to
+ *   overlapping with other elements. Use this option when it's crucial to display all content,
+ *   regardless of the container's size.
+ * - [Clip]: The overflowing content is clipped and not visible beyond the boundary of its
+ *   container. Ideal for maintaining a clean and uncluttered UI, where overlapping elements are
+ *   undesirable.
+ * - [expandIndicator]: Behaves similar to [Clip], however shows an indicator or button indicating
+ *   that more items can be loaded.
+ * - [expandOrCollapseIndicator]: Extends the [expandIndicator] functionality by adding a 'Collapse'
+ *   option. After expanding the content, users can choose to collapse it back to the summary view.
  */
 @ExperimentalLayoutApi
-class ContextualFlowColumnOverflow private constructor(
+class ContextualFlowColumnOverflow
+private constructor(
     type: OverflowType,
     minLinesToShowCollapse: Int = 0,
     minCrossAxisSizeToShowCollapse: Int = 0,
     seeMoreGetter: ((state: FlowLayoutOverflowState) -> @Composable () -> Unit)? = null,
     collapseGetter: ((state: FlowLayoutOverflowState) -> @Composable () -> Unit)? = null
-) : FlowLayoutOverflow(
-    type,
-    minLinesToShowCollapse,
-    minCrossAxisSizeToShowCollapse,
-    seeMoreGetter,
-    collapseGetter
-) {
+) :
+    FlowLayoutOverflow(
+        type,
+        minLinesToShowCollapse,
+        minCrossAxisSizeToShowCollapse,
+        seeMoreGetter,
+        collapseGetter
+    ) {
 
     companion object {
-        /**
-         * Display all content, even if there is not enough space in the specified bounds.
-         */
+        /** Display all content, even if there is not enough space in the specified bounds. */
         @Suppress("OPT_IN_MARKER_ON_WRONG_TARGET")
         @ExperimentalLayoutApi
         @get:ExperimentalLayoutApi
         val Visible = ContextualFlowColumnOverflow(FlowLayoutOverflow.OverflowType.Visible)
 
-        /**
-         * Clip the overflowing content to fix its container.
-         */
+        /** Clip the overflowing content to fix its container. */
         @Suppress("OPT_IN_MARKER_ON_WRONG_TARGET")
         @ExperimentalLayoutApi
         @get:ExperimentalLayoutApi
         val Clip = ContextualFlowColumnOverflow(FlowLayoutOverflow.OverflowType.Clip)
 
         /**
-         * Registers an "expand indicator" composable for handling overflow
-         * in a [ContextualFlowColumn].
+         * Registers an "expand indicator" composable for handling overflow in a
+         * [ContextualFlowColumn].
          *
-         * This function allows the creation of a custom composable that can be displayed
-         * when there are more items in the [ContextualFlowColumn] than can be displayed
-         * in the available space. The "expandable indicator" composable can be tailored to
-         * show a summary, a button, or any other composable element that indicates
-         * the presence of additional items.
+         * This function allows the creation of a custom composable that can be displayed when there
+         * are more items in the [ContextualFlowColumn] than can be displayed in the available
+         * space. The "expandable indicator" composable can be tailored to show a summary, a button,
+         * or any other composable element that indicates the presence of additional items.
          *
          * @param content composable that visually indicates more items can be loaded.
          */
@@ -575,27 +525,25 @@
         }
 
         /**
-         * Registers an "expand or collapse indicator" composable for handling
-         * overflow in a [ContextualFlowColumn].
+         * Registers an "expand or collapse indicator" composable for handling overflow in a
+         * [ContextualFlowColumn].
          *
          * This function is designed to switch between two states: a "Expandable" state when there
          * are more items to show, and a "Collapsable" state when all items are being displayed and
          * can be collapsed.
          *
-         * Prior to layout, the function evaluates both composables indicators to determine
-         * their maximum intrinsic size. Depending on the space available and the number
-         * of items, either the [expandIndicator] or the [collapseIndicator] is rendered.
+         * Prior to layout, the function evaluates both composables indicators to determine their
+         * maximum intrinsic size. Depending on the space available and the number of items, either
+         * the [expandIndicator] or the [collapseIndicator] is rendered.
          *
          * @sample androidx.compose.foundation.layout.samples.ContextualFlowColMaxLineDynamicSeeMore
          *
-         * @param minColumnsToShowCollapse Specifies the minimum number of columns that
-         *        should be visible before showing the collapse option. This parameter is useful
-         *        when the number of columns is too small to be reduced further.
-         *
-         * @param minWidthToShowCollapse Specifies the minimum width at which the collapse
-         *        option should be displayed. This parameter is useful for preventing the collapse
-         *        option from appearing when the width is too narrow.
-         *
+         * @param minColumnsToShowCollapse Specifies the minimum number of columns that should be
+         *   visible before showing the collapse option. This parameter is useful when the number of
+         *   columns is too small to be reduced further.
+         * @param minWidthToShowCollapse Specifies the minimum width at which the collapse option
+         *   should be displayed. This parameter is useful for preventing the collapse option from
+         *   appearing when the width is too narrow.
          * @param expandIndicator composable that visually indicates more items can be loaded.
          * @param collapseIndicator composable that visually indicates less items can be loaded.
          */
@@ -607,9 +555,8 @@
             minColumnsToShowCollapse: Int = 1,
             minWidthToShowCollapse: Dp = 0.dp,
         ): ContextualFlowColumnOverflow {
-            val minWidthToShowCollapsePx = with(LocalDensity.current) {
-                minWidthToShowCollapse.roundToPx()
-            }
+            val minWidthToShowCollapsePx =
+                with(LocalDensity.current) { minWidthToShowCollapse.roundToPx() }
             return remember(
                 minColumnsToShowCollapse,
                 minWidthToShowCollapsePx,
@@ -645,8 +592,8 @@
 /**
  * Overflow Handling Options
  *
- * This enumeration defines the available options for handling content that exceeds
- * the boundaries of its container.
+ * This enumeration defines the available options for handling content that exceeds the boundaries
+ * of its container.
  *
  * Please check out the children classes on ways to initialize a FlowLayout overflow
  *
@@ -654,7 +601,7 @@
  * @see [FlowColumnOverflow]
  * @see [ContextualFlowRowOverflow]
  * @see [ContextualFlowColumnOverflow]
- **/
+ */
 @ExperimentalLayoutApi
 sealed class FlowLayoutOverflow(
     internal val type: OverflowType,
@@ -664,11 +611,7 @@
     private val collapseGetter: ((state: FlowLayoutOverflowState) -> @Composable () -> Unit)? = null
 ) {
     internal fun createOverflowState() =
-        FlowLayoutOverflowState(
-            type,
-            minLinesToShowCollapse,
-            minCrossAxisSizeToShowCollapse
-        )
+        FlowLayoutOverflowState(type, minLinesToShowCollapse, minCrossAxisSizeToShowCollapse)
 
     internal fun addOverflowComposables(
         state: FlowLayoutOverflowState,
@@ -697,7 +640,8 @@
 
 /** Overflow State for managing overflow state within FlowLayouts. */
 @OptIn(ExperimentalLayoutApi::class)
-internal data class FlowLayoutOverflowState internal constructor(
+internal data class FlowLayoutOverflowState
+internal constructor(
     internal val type: FlowLayoutOverflow.OverflowType,
     internal val minLinesToShowCollapse: Int,
     internal val minCrossAxisSizeToShowCollapse: Int
@@ -711,7 +655,8 @@
                         "rather than in the draw phase? " +
                         "Consider our samples on how to use it during the draw phase " +
                         "or consider using ContextualFlowRow/ContextualFlowColumn " +
-                        "which initializes this method in the composition phase.")
+                        "which initializes this method in the composition phase."
+                )
             }
             return itemShown
         }
@@ -725,10 +670,9 @@
     private var seeMoreSize: IntIntPair? = null
     private var collapseSize: IntIntPair? = null
     // for contextual flow row
-    private var getOverflowMeasurable: ((
-        isExpandable: Boolean,
-        noOfItemsShown: Int
-    ) -> Measurable?)? = null
+    private var getOverflowMeasurable:
+        ((isExpandable: Boolean, noOfItemsShown: Int) -> Measurable?)? =
+        null
 
     internal fun ellipsisSize(
         hasNext: Boolean,
@@ -738,17 +682,23 @@
         return when (type) {
             FlowLayoutOverflow.OverflowType.Visible -> null
             FlowLayoutOverflow.OverflowType.Clip -> null
-            FlowLayoutOverflow.OverflowType.ExpandIndicator -> if (hasNext) {
-                seeMoreSize
-            } else {
-                null
-            }
+            FlowLayoutOverflow.OverflowType.ExpandIndicator ->
+                if (hasNext) {
+                    seeMoreSize
+                } else {
+                    null
+                }
             FlowLayoutOverflow.OverflowType.ExpandOrCollapseIndicator -> {
                 if (hasNext) {
                     seeMoreSize
-                } else if (lineIndex + 1 >= minLinesToShowCollapse &&
-                    totalCrossAxisSize >= minCrossAxisSizeToShowCollapse
-                ) { collapseSize } else { null }
+                } else if (
+                    lineIndex + 1 >= minLinesToShowCollapse &&
+                        totalCrossAxisSize >= minCrossAxisSizeToShowCollapse
+                ) {
+                    collapseSize
+                } else {
+                    null
+                }
             }
         }
     }
@@ -767,20 +717,21 @@
                 var placeable: Placeable? = null
                 var ellipsisSize: IntIntPair?
                 if (hasNext) {
-                    measurable = getOverflowMeasurable?.invoke(
-                        /* isExpandable */ true, shownItemCount
-                    ) ?: seeMoreMeasurable
+                    measurable =
+                        getOverflowMeasurable?.invoke(/* isExpandable */ true, shownItemCount)
+                            ?: seeMoreMeasurable
                     ellipsisSize = seeMoreSize
                     if (getOverflowMeasurable == null) {
                         placeable = seeMorePlaceable
                     }
                 } else {
-                    if (lineIndex >= (minLinesToShowCollapse - 1) &&
-                        totalCrossAxisSize >= (minCrossAxisSizeToShowCollapse)
-                     ) {
-                        measurable = getOverflowMeasurable?.invoke(
-                            /* isExpandable */ false, shownItemCount
-                        ) ?: collapseMeasurable
+                    if (
+                        lineIndex >= (minLinesToShowCollapse - 1) &&
+                            totalCrossAxisSize >= (minCrossAxisSizeToShowCollapse)
+                    ) {
+                        measurable =
+                            getOverflowMeasurable?.invoke(/* isExpandable */ false, shownItemCount)
+                                ?: collapseMeasurable
                     }
                     ellipsisSize = collapseSize
                     if (getOverflowMeasurable == null) {
@@ -788,11 +739,7 @@
                     }
                 }
                 measurable ?: return null
-                FlowLayoutBuildingBlocks.WrapEllipsisInfo(
-                    measurable,
-                    placeable,
-                    ellipsisSize!!
-                )
+                FlowLayoutBuildingBlocks.WrapEllipsisInfo(measurable, placeable, ellipsisSize!!)
             }
         }
     }
@@ -803,27 +750,21 @@
         isHorizontal: Boolean,
         constraints: Constraints,
     ) {
-        val orientation = if (isHorizontal)
-            LayoutOrientation.Horizontal else LayoutOrientation.Vertical
+        val orientation =
+            if (isHorizontal) LayoutOrientation.Horizontal else LayoutOrientation.Vertical
         val orientationIndependentConstraints =
             OrientationIndependentConstraints(constraints, orientation)
         seeMoreMeasurable?.let { item ->
-            val mainAxisSize = item.mainAxisMin(
-                isHorizontal,
-                orientationIndependentConstraints.crossAxisMax
-            )
-            val crossAxisSize = item.crossAxisMin(isHorizontal,
-                mainAxisSize
-            )
+            val mainAxisSize =
+                item.mainAxisMin(isHorizontal, orientationIndependentConstraints.crossAxisMax)
+            val crossAxisSize = item.crossAxisMin(isHorizontal, mainAxisSize)
             this.seeMoreSize = IntIntPair(mainAxisSize, crossAxisSize)
             this.seeMoreMeasurable = item as? Measurable
             this.seeMorePlaceable = null
         }
         collapseMeasurable?.let { item ->
-            val mainAxisSize = item.mainAxisMin(
-                isHorizontal,
-                orientationIndependentConstraints.crossAxisMax
-            )
+            val mainAxisSize =
+                item.mainAxisMin(isHorizontal, orientationIndependentConstraints.crossAxisMax)
             val crossAxisSize = item.crossAxisMin(isHorizontal, mainAxisSize)
             this.collapseSize = IntIntPair(mainAxisSize, crossAxisSize)
             this.collapseMeasurable = item as? Measurable
@@ -838,17 +779,14 @@
         constraints: Constraints,
     ) {
         val isHorizontal = measurePolicy.isHorizontal
-        val orientation = if (isHorizontal)
-            LayoutOrientation.Horizontal else LayoutOrientation.Vertical
+        val orientation =
+            if (isHorizontal) LayoutOrientation.Horizontal else LayoutOrientation.Vertical
         val orientationIndependentConstraints =
             OrientationIndependentConstraints(constraints, orientation)
                 .copy(mainAxisMin = 0, crossAxisMin = 0)
         val finalConstraints = orientationIndependentConstraints.toBoxConstraints(orientation)
         seeMoreMeasurable?.let { item ->
-            item.measureAndCache(
-                measurePolicy,
-                finalConstraints
-            ) { placeable ->
+            item.measureAndCache(measurePolicy, finalConstraints) { placeable ->
                 var mainAxisSize = 0
                 var crossAxisSize = 0
                 placeable?.let {
@@ -863,10 +801,7 @@
             this.seeMoreMeasurable = item
         }
         collapseMeasurable?.let { item ->
-            item.measureAndCache(
-                measurePolicy,
-                finalConstraints
-            ) { placeable ->
+            item.measureAndCache(measurePolicy, finalConstraints) { placeable ->
                 var mainAxisSize = 0
                 var crossAxisSize = 0
                 placeable?.let {
@@ -889,17 +824,10 @@
     ) {
         this.itemShown = 0
         this.getOverflowMeasurable = getOverflowMeasurable
-        val seeMoreMeasurable = getOverflowMeasurable(
-            /* isExpandable */ true, /* numberOfItemsShown */ 0
-        )
-        val collapseMeasurable = getOverflowMeasurable(
-            /* isExpandable */ false, /* numberOfItemsShown */ 0
-        )
-        setOverflowMeasurables(
-            measurePolicy,
-            seeMoreMeasurable,
-            collapseMeasurable,
-            constraints
-        )
+        val seeMoreMeasurable =
+            getOverflowMeasurable(/* isExpandable */ true, /* numberOfItemsShown */ 0)
+        val collapseMeasurable =
+            getOverflowMeasurable(/* isExpandable */ false, /* numberOfItemsShown */ 0)
+        setOverflowMeasurables(measurePolicy, seeMoreMeasurable, collapseMeasurable, constraints)
     }
 }
diff --git a/compose/foundation/foundation-layout/src/commonMain/kotlin/androidx/compose/foundation/layout/Intrinsic.kt b/compose/foundation/foundation-layout/src/commonMain/kotlin/androidx/compose/foundation/layout/Intrinsic.kt
index 37fe411..6b077cd 100644
--- a/compose/foundation/foundation-layout/src/commonMain/kotlin/androidx/compose/foundation/layout/Intrinsic.kt
+++ b/compose/foundation/foundation-layout/src/commonMain/kotlin/androidx/compose/foundation/layout/Intrinsic.kt
@@ -36,97 +36,114 @@
  * the content. The incoming measurement [Constraints] may override this value, forcing the content
  * to be either smaller or larger.
  *
- * See [height] for options of sizing to intrinsic height.
- * Also see [width] and [widthIn] for other options to set the preferred width.
+ * See [height] for options of sizing to intrinsic height. Also see [width] and [widthIn] for other
+ * options to set the preferred width.
  *
  * Example usage for min intrinsic:
+ *
  * @sample androidx.compose.foundation.layout.samples.SameWidthBoxes
  *
  * Example usage for max intrinsic:
+ *
  * @sample androidx.compose.foundation.layout.samples.SameWidthTextBoxes
  */
 @Stable
-fun Modifier.width(intrinsicSize: IntrinsicSize) = this then IntrinsicWidthElement(
-    width = intrinsicSize,
-    enforceIncoming = true,
-    inspectorInfo = debugInspectorInfo {
-        name = "width"
-        properties["intrinsicSize"] = intrinsicSize
-    }
-)
+fun Modifier.width(intrinsicSize: IntrinsicSize) =
+    this then
+        IntrinsicWidthElement(
+            width = intrinsicSize,
+            enforceIncoming = true,
+            inspectorInfo =
+                debugInspectorInfo {
+                    name = "width"
+                    properties["intrinsicSize"] = intrinsicSize
+                }
+        )
 
 /**
  * Declare the preferred height of the content to be the same as the min or max intrinsic height of
  * the content. The incoming measurement [Constraints] may override this value, forcing the content
  * to be either smaller or larger.
  *
- * See [width] for other options of sizing to intrinsic width.
- * Also see [height] and [heightIn] for other options to set the preferred height.
+ * See [width] for other options of sizing to intrinsic width. Also see [height] and [heightIn] for
+ * other options to set the preferred height.
  *
  * Example usage for min intrinsic:
+ *
  * @sample androidx.compose.foundation.layout.samples.MatchParentDividerForText
  *
  * Example usage for max intrinsic:
+ *
  * @sample androidx.compose.foundation.layout.samples.MatchParentDividerForAspectRatio
  */
 @Stable
-fun Modifier.height(intrinsicSize: IntrinsicSize) = this then IntrinsicHeightElement(
-    height = intrinsicSize,
-    enforceIncoming = true,
-    inspectorInfo = debugInspectorInfo {
-        name = "height"
-        properties["intrinsicSize"] = intrinsicSize
-    }
-)
+fun Modifier.height(intrinsicSize: IntrinsicSize) =
+    this then
+        IntrinsicHeightElement(
+            height = intrinsicSize,
+            enforceIncoming = true,
+            inspectorInfo =
+                debugInspectorInfo {
+                    name = "height"
+                    properties["intrinsicSize"] = intrinsicSize
+                }
+        )
 
 /**
- * Declare the width of the content to be exactly the same as the min or max intrinsic width of
- * the content. The incoming measurement [Constraints] will not override this value. If the content
- * intrinsic width does not satisfy the incoming [Constraints], the parent layout will be
- * reported a size coerced in the [Constraints], and the position of the content will be
- * automatically offset to be centered on the space assigned to the child by the parent layout under
- * the assumption that [Constraints] were respected.
+ * Declare the width of the content to be exactly the same as the min or max intrinsic width of the
+ * content. The incoming measurement [Constraints] will not override this value. If the content
+ * intrinsic width does not satisfy the incoming [Constraints], the parent layout will be reported a
+ * size coerced in the [Constraints], and the position of the content will be automatically offset
+ * to be centered on the space assigned to the child by the parent layout under the assumption that
+ * [Constraints] were respected.
  *
- * See [height] for options of sizing to intrinsic height.
- * See [width] and [widthIn] for options to set the preferred width.
- * See [requiredWidth] and [requiredWidthIn] for other options to set the required width.
+ * See [height] for options of sizing to intrinsic height. See [width] and [widthIn] for options to
+ * set the preferred width. See [requiredWidth] and [requiredWidthIn] for other options to set the
+ * required width.
  */
 @Stable
-fun Modifier.requiredWidth(intrinsicSize: IntrinsicSize) = this then IntrinsicWidthElement(
-    width = intrinsicSize,
-    enforceIncoming = false,
-    inspectorInfo = debugInspectorInfo {
-        name = "requiredWidth"
-        properties["intrinsicSize"] = intrinsicSize
-    }
-)
+fun Modifier.requiredWidth(intrinsicSize: IntrinsicSize) =
+    this then
+        IntrinsicWidthElement(
+            width = intrinsicSize,
+            enforceIncoming = false,
+            inspectorInfo =
+                debugInspectorInfo {
+                    name = "requiredWidth"
+                    properties["intrinsicSize"] = intrinsicSize
+                }
+        )
 
 /**
  * Declare the height of the content to be exactly the same as the min or max intrinsic height of
  * the content. The incoming measurement [Constraints] will not override this value. If the content
- * intrinsic height does not satisfy the incoming [Constraints], the parent layout will be
- * reported a size coerced in the [Constraints], and the position of the content will be
- * automatically offset to be centered on the space assigned to the child by the parent layout under
- * the assumption that [Constraints] were respected.
+ * intrinsic height does not satisfy the incoming [Constraints], the parent layout will be reported
+ * a size coerced in the [Constraints], and the position of the content will be automatically offset
+ * to be centered on the space assigned to the child by the parent layout under the assumption that
+ * [Constraints] were respected.
  *
- * See [width] for options of sizing to intrinsic width.
- * See [height] and [heightIn] for options to set the preferred height.
- * See [requiredHeight] and [requiredHeightIn] for other options to set the required height.
+ * See [width] for options of sizing to intrinsic width. See [height] and [heightIn] for options to
+ * set the preferred height. See [requiredHeight] and [requiredHeightIn] for other options to set
+ * the required height.
  */
 @Stable
-fun Modifier.requiredHeight(intrinsicSize: IntrinsicSize) = this then IntrinsicHeightElement(
-    height = intrinsicSize,
-    enforceIncoming = false,
-    inspectorInfo = debugInspectorInfo {
-        name = "requiredHeight"
-        properties["intrinsicSize"] = intrinsicSize
-    }
-)
+fun Modifier.requiredHeight(intrinsicSize: IntrinsicSize) =
+    this then
+        IntrinsicHeightElement(
+            height = intrinsicSize,
+            enforceIncoming = false,
+            inspectorInfo =
+                debugInspectorInfo {
+                    name = "requiredHeight"
+                    properties["intrinsicSize"] = intrinsicSize
+                }
+        )
 
-/**
- * Intrinsic size used in [width] or [height] which can refer to width or height.
- */
-enum class IntrinsicSize { Min, Max }
+/** Intrinsic size used in [width] or [height] which can refer to width or height. */
+enum class IntrinsicSize {
+    Min,
+    Max
+}
 
 private class IntrinsicWidthElement(
     val width: IntrinsicSize,
@@ -154,34 +171,37 @@
     }
 }
 
-private class IntrinsicWidthNode(
-    var width: IntrinsicSize,
-    override var enforceIncoming: Boolean
-) : IntrinsicSizeModifier() {
+private class IntrinsicWidthNode(var width: IntrinsicSize, override var enforceIncoming: Boolean) :
+    IntrinsicSizeModifier() {
     override fun MeasureScope.calculateContentConstraints(
         measurable: Measurable,
         constraints: Constraints
     ): Constraints {
-        var measuredWidth = if (width == IntrinsicSize.Min) {
-            measurable.minIntrinsicWidth(constraints.maxHeight)
-        } else {
-            measurable.maxIntrinsicWidth(constraints.maxHeight)
+        var measuredWidth =
+            if (width == IntrinsicSize.Min) {
+                measurable.minIntrinsicWidth(constraints.maxHeight)
+            } else {
+                measurable.maxIntrinsicWidth(constraints.maxHeight)
+            }
+        if (measuredWidth < 0) {
+            measuredWidth = 0
         }
-        if (measuredWidth < 0) { measuredWidth = 0 }
         return Constraints.fixedWidth(measuredWidth)
     }
 
     override fun IntrinsicMeasureScope.minIntrinsicWidth(
         measurable: IntrinsicMeasurable,
         height: Int
-    ) = if (width == IntrinsicSize.Min) measurable.minIntrinsicWidth(height) else
-        measurable.maxIntrinsicWidth(height)
+    ) =
+        if (width == IntrinsicSize.Min) measurable.minIntrinsicWidth(height)
+        else measurable.maxIntrinsicWidth(height)
 
     override fun IntrinsicMeasureScope.maxIntrinsicWidth(
         measurable: IntrinsicMeasurable,
         height: Int
-    ) = if (width == IntrinsicSize.Min) measurable.minIntrinsicWidth(height) else
-        measurable.maxIntrinsicWidth(height)
+    ) =
+        if (width == IntrinsicSize.Min) measurable.minIntrinsicWidth(height)
+        else measurable.maxIntrinsicWidth(height)
 }
 
 private class IntrinsicHeightElement(
@@ -218,26 +238,31 @@
         measurable: Measurable,
         constraints: Constraints
     ): Constraints {
-        var measuredHeight = if (height == IntrinsicSize.Min) {
-            measurable.minIntrinsicHeight(constraints.maxWidth)
-        } else {
-            measurable.maxIntrinsicHeight(constraints.maxWidth)
+        var measuredHeight =
+            if (height == IntrinsicSize.Min) {
+                measurable.minIntrinsicHeight(constraints.maxWidth)
+            } else {
+                measurable.maxIntrinsicHeight(constraints.maxWidth)
+            }
+        if (measuredHeight < 0) {
+            measuredHeight = 0
         }
-        if (measuredHeight < 0) { measuredHeight = 0 }
         return Constraints.fixedHeight(measuredHeight)
     }
 
     override fun IntrinsicMeasureScope.minIntrinsicHeight(
         measurable: IntrinsicMeasurable,
         width: Int
-    ) = if (height == IntrinsicSize.Min) measurable.minIntrinsicHeight(width) else
-        measurable.maxIntrinsicHeight(width)
+    ) =
+        if (height == IntrinsicSize.Min) measurable.minIntrinsicHeight(width)
+        else measurable.maxIntrinsicHeight(width)
 
     override fun IntrinsicMeasureScope.maxIntrinsicHeight(
         measurable: IntrinsicMeasurable,
         width: Int
-    ) = if (height == IntrinsicSize.Min) measurable.minIntrinsicHeight(width) else
-        measurable.maxIntrinsicHeight(width)
+    ) =
+        if (height == IntrinsicSize.Min) measurable.minIntrinsicHeight(width)
+        else measurable.maxIntrinsicHeight(width)
 }
 
 private abstract class IntrinsicSizeModifier : LayoutModifierNode, Modifier.Node() {
@@ -254,12 +279,12 @@
         constraints: Constraints
     ): MeasureResult {
         val contentConstraints = calculateContentConstraints(measurable, constraints)
-        val placeable = measurable.measure(
-            if (enforceIncoming) constraints.constrain(contentConstraints) else contentConstraints
-        )
-        return layout(placeable.width, placeable.height) {
-            placeable.placeRelative(IntOffset.Zero)
-        }
+        val placeable =
+            measurable.measure(
+                if (enforceIncoming) constraints.constrain(contentConstraints)
+                else contentConstraints
+            )
+        return layout(placeable.width, placeable.height) { placeable.placeRelative(IntOffset.Zero) }
     }
 
     override fun IntrinsicMeasureScope.minIntrinsicWidth(
diff --git a/compose/foundation/foundation-layout/src/commonMain/kotlin/androidx/compose/foundation/layout/LayoutScopeMarker.kt b/compose/foundation/foundation-layout/src/commonMain/kotlin/androidx/compose/foundation/layout/LayoutScopeMarker.kt
index b90fcf3..36aa5fd 100644
--- a/compose/foundation/foundation-layout/src/commonMain/kotlin/androidx/compose/foundation/layout/LayoutScopeMarker.kt
+++ b/compose/foundation/foundation-layout/src/commonMain/kotlin/androidx/compose/foundation/layout/LayoutScopeMarker.kt
@@ -16,5 +16,4 @@
 
 package androidx.compose.foundation.layout
 
-@DslMarker
-annotation class LayoutScopeMarker
+@DslMarker annotation class LayoutScopeMarker
diff --git a/compose/foundation/foundation-layout/src/commonMain/kotlin/androidx/compose/foundation/layout/Offset.kt b/compose/foundation/foundation-layout/src/commonMain/kotlin/androidx/compose/foundation/layout/Offset.kt
index 3fc7a65..1edf317 100644
--- a/compose/foundation/foundation-layout/src/commonMain/kotlin/androidx/compose/foundation/layout/Offset.kt
+++ b/compose/foundation/foundation-layout/src/commonMain/kotlin/androidx/compose/foundation/layout/Offset.kt
@@ -32,114 +32,123 @@
 
 /**
  * Offset the content by ([x] dp, [y] dp). The offsets can be positive as well as non-positive.
- * Applying an offset only changes the position of the content, without interfering with
- * its size measurement.
+ * Applying an offset only changes the position of the content, without interfering with its size
+ * measurement.
  *
  * This modifier will automatically adjust the horizontal offset according to the layout direction:
  * when the layout direction is LTR, positive [x] offsets will move the content to the right and
- * when the layout direction is RTL, positive [x] offsets will move the content to the left.
- * For a modifier that offsets without considering layout direction, see [absoluteOffset].
+ * when the layout direction is RTL, positive [x] offsets will move the content to the left. For a
+ * modifier that offsets without considering layout direction, see [absoluteOffset].
  *
  * @see absoluteOffset
  *
  * Example usage:
+ *
  * @sample androidx.compose.foundation.layout.samples.OffsetModifier
  */
 @Stable
-fun Modifier.offset(x: Dp = 0.dp, y: Dp = 0.dp) = this then OffsetElement(
-    x = x,
-    y = y,
-    rtlAware = true,
-    inspectorInfo = {
-        name = "offset"
-        properties["x"] = x
-        properties["y"] = y
-    }
-)
+fun Modifier.offset(x: Dp = 0.dp, y: Dp = 0.dp) =
+    this then
+        OffsetElement(
+            x = x,
+            y = y,
+            rtlAware = true,
+            inspectorInfo = {
+                name = "offset"
+                properties["x"] = x
+                properties["y"] = y
+            }
+        )
 
 /**
  * Offset the content by ([x] dp, [y] dp). The offsets can be positive as well as non-positive.
- * Applying an offset only changes the position of the content, without interfering with
- * its size measurement.
+ * Applying an offset only changes the position of the content, without interfering with its size
+ * measurement.
  *
- * This modifier will not consider layout direction when calculating the position of the content:
- * a positive [x] offset will always move the content to the right.
- * For a modifier that considers the layout direction when applying the offset, see [offset].
+ * This modifier will not consider layout direction when calculating the position of the content: a
+ * positive [x] offset will always move the content to the right. For a modifier that considers the
+ * layout direction when applying the offset, see [offset].
  *
  * @see offset
  *
  * Example usage:
+ *
  * @sample androidx.compose.foundation.layout.samples.AbsoluteOffsetModifier
  */
 @Stable
-fun Modifier.absoluteOffset(x: Dp = 0.dp, y: Dp = 0.dp) = this then OffsetElement(
-    x = x,
-    y = y,
-    rtlAware = false,
-    inspectorInfo = {
-        name = "absoluteOffset"
-        properties["x"] = x
-        properties["y"] = y
-    }
-)
+fun Modifier.absoluteOffset(x: Dp = 0.dp, y: Dp = 0.dp) =
+    this then
+        OffsetElement(
+            x = x,
+            y = y,
+            rtlAware = false,
+            inspectorInfo = {
+                name = "absoluteOffset"
+                properties["x"] = x
+                properties["y"] = y
+            }
+        )
 
 /**
- * Offset the content by [offset] px. The offsets can be positive as well as non-positive.
- * Applying an offset only changes the position of the content, without interfering with
- * its size measurement.
+ * Offset the content by [offset] px. The offsets can be positive as well as non-positive. Applying
+ * an offset only changes the position of the content, without interfering with its size
+ * measurement.
  *
  * This modifier is designed to be used for offsets that change, possibly due to user interactions.
- * It avoids recomposition when the offset is changing, and also adds a graphics layer that
- * prevents unnecessary redrawing of the context when the offset is changing.
+ * It avoids recomposition when the offset is changing, and also adds a graphics layer that prevents
+ * unnecessary redrawing of the context when the offset is changing.
  *
  * This modifier will automatically adjust the horizontal offset according to the layout direction:
- * when the LD is LTR, positive horizontal offsets will move the content to the right and
- * when the LD is RTL, positive horizontal offsets will move the content to the left.
- * For a modifier that offsets without considering layout direction, see [absoluteOffset].
+ * when the LD is LTR, positive horizontal offsets will move the content to the right and when the
+ * LD is RTL, positive horizontal offsets will move the content to the left. For a modifier that
+ * offsets without considering layout direction, see [absoluteOffset].
  *
  * @see [absoluteOffset]
  *
  * Example usage:
+ *
  * @sample androidx.compose.foundation.layout.samples.OffsetPxModifier
  */
-fun Modifier.offset(offset: Density.() -> IntOffset) = this then
-    OffsetPxElement(
-        offset = offset,
-        rtlAware = true,
-        inspectorInfo = {
-            name = "offset"
-            properties["offset"] = offset
-        }
-    )
+fun Modifier.offset(offset: Density.() -> IntOffset) =
+    this then
+        OffsetPxElement(
+            offset = offset,
+            rtlAware = true,
+            inspectorInfo = {
+                name = "offset"
+                properties["offset"] = offset
+            }
+        )
 
 /**
- * Offset the content by [offset] px. The offsets can be positive as well as non-positive.
- * Applying an offset only changes the position of the content, without interfering with
- * its size measurement.
+ * Offset the content by [offset] px. The offsets can be positive as well as non-positive. Applying
+ * an offset only changes the position of the content, without interfering with its size
+ * measurement.
  *
  * This modifier is designed to be used for offsets that change, possibly due to user interactions.
- * It avoids recomposition when the offset is changing, and also adds a graphics layer that
- * prevents unnecessary redrawing of the context when the offset is changing.
+ * It avoids recomposition when the offset is changing, and also adds a graphics layer that prevents
+ * unnecessary redrawing of the context when the offset is changing.
  *
- * This modifier will not consider layout direction when calculating the position of the content:
- * a positive horizontal offset will always move the content to the right.
- * For a modifier that considers layout direction when applying the offset, see [offset].
+ * This modifier will not consider layout direction when calculating the position of the content: a
+ * positive horizontal offset will always move the content to the right. For a modifier that
+ * considers layout direction when applying the offset, see [offset].
  *
  * @see offset
  *
  * Example usage:
+ *
  * @sample androidx.compose.foundation.layout.samples.AbsoluteOffsetPxModifier
  */
-fun Modifier.absoluteOffset(
-    offset: Density.() -> IntOffset
-) = this then OffsetPxElement(
-    offset = offset,
-    rtlAware = false,
-    inspectorInfo = {
-        name = "absoluteOffset"
-        properties["offset"] = offset
-    }
-)
+fun Modifier.absoluteOffset(offset: Density.() -> IntOffset) =
+    this then
+        OffsetPxElement(
+            offset = offset,
+            rtlAware = false,
+            inspectorInfo = {
+                name = "absoluteOffset"
+                properties["offset"] = offset
+            }
+        )
 
 private class OffsetElement(
     val x: Dp,
@@ -175,14 +184,13 @@
 
     override fun toString(): String = "OffsetModifierElement(x=$x, y=$y, rtlAware=$rtlAware)"
 
-    override fun InspectorInfo.inspectableProperties() { inspectorInfo() }
+    override fun InspectorInfo.inspectableProperties() {
+        inspectorInfo()
+    }
 }
 
-private class OffsetNode(
-    var x: Dp,
-    var y: Dp,
-    var rtlAware: Boolean
-) : LayoutModifierNode, Modifier.Node() {
+private class OffsetNode(var x: Dp, var y: Dp, var rtlAware: Boolean) :
+    LayoutModifierNode, Modifier.Node() {
 
     override fun MeasureScope.measure(
         measurable: Measurable,
@@ -217,8 +225,7 @@
         if (this === other) return true
         val otherModifier = other as? OffsetPxElement ?: return false
 
-        return offset === otherModifier.offset &&
-            rtlAware == otherModifier.rtlAware
+        return offset === otherModifier.offset && rtlAware == otherModifier.rtlAware
     }
 
     override fun toString(): String = "OffsetPxModifier(offset=$offset, rtlAware=$rtlAware)"
@@ -234,10 +241,8 @@
     }
 }
 
-private class OffsetPxNode(
-    var offset: Density.() -> IntOffset,
-    var rtlAware: Boolean
-) : LayoutModifierNode, Modifier.Node() {
+private class OffsetPxNode(var offset: Density.() -> IntOffset, var rtlAware: Boolean) :
+    LayoutModifierNode, Modifier.Node() {
     override fun MeasureScope.measure(
         measurable: Measurable,
         constraints: Constraints
diff --git a/compose/foundation/foundation-layout/src/commonMain/kotlin/androidx/compose/foundation/layout/Padding.kt b/compose/foundation/foundation-layout/src/commonMain/kotlin/androidx/compose/foundation/layout/Padding.kt
index 1ff4160..90c74eb 100644
--- a/compose/foundation/foundation-layout/src/commonMain/kotlin/androidx/compose/foundation/layout/Padding.kt
+++ b/compose/foundation/foundation-layout/src/commonMain/kotlin/androidx/compose/foundation/layout/Padding.kt
@@ -36,109 +36,112 @@
 
 /**
  * Apply additional space along each edge of the content in [Dp]: [start], [top], [end] and
- * [bottom]. The start and end edges will be determined by the current [LayoutDirection].
- * Padding is applied before content measurement and takes precedence; content may only be as large
- * as the remaining space.
+ * [bottom]. The start and end edges will be determined by the current [LayoutDirection]. Padding is
+ * applied before content measurement and takes precedence; content may only be as large as the
+ * remaining space.
  *
- * Negative padding is not permitted — it will cause [IllegalArgumentException].
- * See [Modifier.offset].
+ * Negative padding is not permitted — it will cause [IllegalArgumentException]. See
+ * [Modifier.offset].
  *
  * Example usage:
+ *
  * @sample androidx.compose.foundation.layout.samples.PaddingModifier
  */
 @Stable
-fun Modifier.padding(
-    start: Dp = 0.dp,
-    top: Dp = 0.dp,
-    end: Dp = 0.dp,
-    bottom: Dp = 0.dp
-) = this then PaddingElement(
-    start = start,
-    top = top,
-    end = end,
-    bottom = bottom,
-    rtlAware = true,
-    inspectorInfo = {
-        name = "padding"
-        properties["start"] = start
-        properties["top"] = top
-        properties["end"] = end
-        properties["bottom"] = bottom
-    }
-)
+fun Modifier.padding(start: Dp = 0.dp, top: Dp = 0.dp, end: Dp = 0.dp, bottom: Dp = 0.dp) =
+    this then
+        PaddingElement(
+            start = start,
+            top = top,
+            end = end,
+            bottom = bottom,
+            rtlAware = true,
+            inspectorInfo = {
+                name = "padding"
+                properties["start"] = start
+                properties["top"] = top
+                properties["end"] = end
+                properties["bottom"] = bottom
+            }
+        )
 
 /**
  * Apply [horizontal] dp space along the left and right edges of the content, and [vertical] dp
- * space along the top and bottom edges.
- * Padding is applied before content measurement and takes precedence; content may only be as large
- * as the remaining space.
+ * space along the top and bottom edges. Padding is applied before content measurement and takes
+ * precedence; content may only be as large as the remaining space.
  *
- * Negative padding is not permitted — it will cause [IllegalArgumentException].
- * See [Modifier.offset].
+ * Negative padding is not permitted — it will cause [IllegalArgumentException]. See
+ * [Modifier.offset].
  *
  * Example usage:
+ *
  * @sample androidx.compose.foundation.layout.samples.SymmetricPaddingModifier
  */
 @Stable
-fun Modifier.padding(
-    horizontal: Dp = 0.dp,
-    vertical: Dp = 0.dp
-) = this then PaddingElement(
-    start = horizontal,
-    top = vertical,
-    end = horizontal,
-    bottom = vertical,
-    rtlAware = true,
-    inspectorInfo = {
-        name = "padding"
-        properties["horizontal"] = horizontal
-        properties["vertical"] = vertical
-    }
-)
+fun Modifier.padding(horizontal: Dp = 0.dp, vertical: Dp = 0.dp) =
+    this then
+        PaddingElement(
+            start = horizontal,
+            top = vertical,
+            end = horizontal,
+            bottom = vertical,
+            rtlAware = true,
+            inspectorInfo = {
+                name = "padding"
+                properties["horizontal"] = horizontal
+                properties["vertical"] = vertical
+            }
+        )
 
 /**
  * Apply [all] dp of additional space along each edge of the content, left, top, right and bottom.
  * Padding is applied before content measurement and takes precedence; content may only be as large
  * as the remaining space.
  *
- * Negative padding is not permitted — it will cause [IllegalArgumentException].
- * See [Modifier.offset].
+ * Negative padding is not permitted — it will cause [IllegalArgumentException]. See
+ * [Modifier.offset].
  *
  * Example usage:
+ *
  * @sample androidx.compose.foundation.layout.samples.PaddingAllModifier
  */
 @Stable
-fun Modifier.padding(all: Dp) = this then PaddingElement(
-    start = all,
-    top = all,
-    end = all,
-    bottom = all,
-    rtlAware = true,
-    inspectorInfo = {
-        name = "padding"
-        value = all
-    }
-)
+fun Modifier.padding(all: Dp) =
+    this then
+        PaddingElement(
+            start = all,
+            top = all,
+            end = all,
+            bottom = all,
+            rtlAware = true,
+            inspectorInfo = {
+                name = "padding"
+                value = all
+            }
+        )
 
 /**
  * Apply [PaddingValues] to the component as additional space along each edge of the content's left,
  * top, right and bottom. Padding is applied before content measurement and takes precedence;
  * content may only be as large as the remaining space.
  *
- * Negative padding is not permitted — it will cause [IllegalArgumentException].
- * See [Modifier.offset].
+ * Negative padding is not permitted — it will cause [IllegalArgumentException]. See
+ * [Modifier.offset].
  *
  * Example usage:
+ *
  * @sample androidx.compose.foundation.layout.samples.PaddingValuesModifier
  */
 @Stable
-fun Modifier.padding(paddingValues: PaddingValues) = this then PaddingValuesElement(
-    paddingValues = paddingValues,
-    inspectorInfo = {
-        name = "padding"
-        properties["paddingValues"] = paddingValues
-    }
-)
+fun Modifier.padding(paddingValues: PaddingValues) =
+    this then
+        PaddingValuesElement(
+            paddingValues = paddingValues,
+            inspectorInfo = {
+                name = "padding"
+                properties["paddingValues"] = paddingValues
+            }
+        )
 
 /**
  * Apply additional space along each edge of the content in [Dp]: [left], [top], [right] and
@@ -146,72 +149,56 @@
  * [padding] to apply relative paddings. Padding is applied before content measurement and takes
  * precedence; content may only be as large as the remaining space.
  *
- * Negative padding is not permitted — it will cause [IllegalArgumentException].
- * See [Modifier.offset].
+ * Negative padding is not permitted — it will cause [IllegalArgumentException]. See
+ * [Modifier.offset].
  *
  * Example usage:
+ *
  * @sample androidx.compose.foundation.layout.samples.AbsolutePaddingModifier
  */
 @Stable
-fun Modifier.absolutePadding(
-    left: Dp = 0.dp,
-    top: Dp = 0.dp,
-    right: Dp = 0.dp,
-    bottom: Dp = 0.dp
-) = this then(
-    PaddingElement(
-        start = left,
-        top = top,
-        end = right,
-        bottom = bottom,
-        rtlAware = false,
-        inspectorInfo = {
-            name = "absolutePadding"
-            properties["left"] = left
-            properties["top"] = top
-            properties["right"] = right
-            properties["bottom"] = bottom
-        }
-    )
-)
+fun Modifier.absolutePadding(left: Dp = 0.dp, top: Dp = 0.dp, right: Dp = 0.dp, bottom: Dp = 0.dp) =
+    this then
+        (PaddingElement(
+            start = left,
+            top = top,
+            end = right,
+            bottom = bottom,
+            rtlAware = false,
+            inspectorInfo = {
+                name = "absolutePadding"
+                properties["left"] = left
+                properties["top"] = top
+                properties["right"] = right
+                properties["bottom"] = bottom
+            }
+        ))
 
 /**
- * Describes a padding to be applied along the edges inside a box.
- * See the [PaddingValues] factories and [Absolute] for convenient ways to
- * build [PaddingValues].
+ * Describes a padding to be applied along the edges inside a box. See the [PaddingValues] factories
+ * and [Absolute] for convenient ways to build [PaddingValues].
  */
 @Stable
 interface PaddingValues {
-    /**
-     * The padding to be applied along the left edge inside a box.
-     */
+    /** The padding to be applied along the left edge inside a box. */
     fun calculateLeftPadding(layoutDirection: LayoutDirection): Dp
-    /**
-     * The padding to be applied along the top edge inside a box.
-     */
+
+    /** The padding to be applied along the top edge inside a box. */
     fun calculateTopPadding(): Dp
-    /**
-     * The padding to be applied along the right edge inside a box.
-     */
+
+    /** The padding to be applied along the right edge inside a box. */
     fun calculateRightPadding(layoutDirection: LayoutDirection): Dp
-    /**
-     * The padding to be applied along the bottom edge inside a box.
-     */
+
+    /** The padding to be applied along the bottom edge inside a box. */
     fun calculateBottomPadding(): Dp
 
-    /**
-     * Describes an absolute (RTL unaware) padding to be applied along the edges inside a box.
-     */
+    /** Describes an absolute (RTL unaware) padding to be applied along the edges inside a box. */
     @Immutable
     class Absolute(
-        @Stable
-        private val left: Dp = 0.dp,
-        @Stable
-        private val top: Dp = 0.dp,
-        @Stable
-        private val right: Dp = 0.dp,
-        @Stable
-        private val bottom: Dp = 0.dp
+        @Stable private val left: Dp = 0.dp,
+        @Stable private val top: Dp = 0.dp,
+        @Stable private val right: Dp = 0.dp,
+        @Stable private val bottom: Dp = 0.dp
     ) : PaddingValues {
 
         init {
@@ -238,8 +225,8 @@
         }
 
         override fun hashCode() =
-            ((left.hashCode() * 31 + top.hashCode()) * 31 + right.hashCode()) *
-                31 + bottom.hashCode()
+            ((left.hashCode() * 31 + top.hashCode()) * 31 + right.hashCode()) * 31 +
+                bottom.hashCode()
 
         override fun toString() =
             "PaddingValues.Absolute(left=$left, top=$top, right=$right, bottom=$bottom)"
@@ -247,8 +234,8 @@
 }
 
 /**
- * The padding to be applied along the start edge inside a box: along the left edge if
- * the layout direction is LTR, or along the right edge for RTL.
+ * The padding to be applied along the start edge inside a box: along the left edge if the layout
+ * direction is LTR, or along the right edge for RTL.
  */
 @Stable
 fun PaddingValues.calculateStartPadding(layoutDirection: LayoutDirection) =
@@ -259,8 +246,8 @@
     }
 
 /**
- * The padding to be applied along the end edge inside a box: along the right edge if
- * the layout direction is LTR, or along the left edge for RTL.
+ * The padding to be applied along the end edge inside a box: along the right edge if the layout
+ * direction is LTR, or along the left edge for RTL.
  */
 @Stable
 fun PaddingValues.calculateEndPadding(layoutDirection: LayoutDirection) =
@@ -270,23 +257,20 @@
         calculateLeftPadding(layoutDirection)
     }
 
-/**
- * Creates a padding of [all] dp along all 4 edges.
- */
-@Stable
-fun PaddingValues(all: Dp): PaddingValues = PaddingValuesImpl(all, all, all, all)
+/** Creates a padding of [all] dp along all 4 edges. */
+@Stable fun PaddingValues(all: Dp): PaddingValues = PaddingValuesImpl(all, all, all, all)
 
 /**
- * Creates a padding of [horizontal] dp along the left and right edges, and of [vertical]
- * dp along the top and bottom edges.
+ * Creates a padding of [horizontal] dp along the left and right edges, and of [vertical] dp along
+ * the top and bottom edges.
  */
 @Stable
 fun PaddingValues(horizontal: Dp = 0.dp, vertical: Dp = 0.dp): PaddingValues =
     PaddingValuesImpl(horizontal, vertical, horizontal, vertical)
 
 /**
- * Creates a padding to be applied along the edges inside a box. In LTR contexts [start] will
- * be applied along the left edge and [end] will be applied along the right edge. In RTL contexts,
+ * Creates a padding to be applied along the edges inside a box. In LTR contexts [start] will be
+ * applied along the left edge and [end] will be applied along the right edge. In RTL contexts,
  * [start] will correspond to the right edge and [end] to the left.
  */
 @Stable
@@ -299,14 +283,10 @@
 
 @Immutable
 internal class PaddingValuesImpl(
-    @Stable
-    val start: Dp = 0.dp,
-    @Stable
-    val top: Dp = 0.dp,
-    @Stable
-    val end: Dp = 0.dp,
-    @Stable
-    val bottom: Dp = 0.dp
+    @Stable val start: Dp = 0.dp,
+    @Stable val top: Dp = 0.dp,
+    @Stable val end: Dp = 0.dp,
+    @Stable val bottom: Dp = 0.dp
 ) : PaddingValues {
 
     init {
@@ -449,9 +429,8 @@
     }
 }
 
-private class PaddingValuesModifier(
-    var paddingValues: PaddingValues
-) : LayoutModifierNode, Modifier.Node() {
+private class PaddingValuesModifier(var paddingValues: PaddingValues) :
+    LayoutModifierNode, Modifier.Node() {
     override fun MeasureScope.measure(
         measurable: Measurable,
         constraints: Constraints
@@ -464,10 +443,12 @@
         ) {
             "Padding must be non-negative"
         }
-        val horizontal = paddingValues.calculateLeftPadding(layoutDirection).roundToPx() +
-            paddingValues.calculateRightPadding(layoutDirection).roundToPx()
-        val vertical = paddingValues.calculateTopPadding().roundToPx() +
-            paddingValues.calculateBottomPadding().roundToPx()
+        val horizontal =
+            paddingValues.calculateLeftPadding(layoutDirection).roundToPx() +
+                paddingValues.calculateRightPadding(layoutDirection).roundToPx()
+        val vertical =
+            paddingValues.calculateTopPadding().roundToPx() +
+                paddingValues.calculateBottomPadding().roundToPx()
 
         val placeable = measurable.measure(constraints.offset(-horizontal, -vertical))
 
diff --git a/compose/foundation/foundation-layout/src/commonMain/kotlin/androidx/compose/foundation/layout/Row.kt b/compose/foundation/foundation-layout/src/commonMain/kotlin/androidx/compose/foundation/layout/Row.kt
index 766585c..5825b16 100644
--- a/compose/foundation/foundation-layout/src/commonMain/kotlin/androidx/compose/foundation/layout/Row.kt
+++ b/compose/foundation/foundation-layout/src/commonMain/kotlin/androidx/compose/foundation/layout/Row.kt
@@ -40,43 +40,43 @@
 
 /**
  * A layout composable that places its children in a horizontal sequence. For a layout composable
- * that places its children in a vertical sequence, see [Column]. Note that by default items do
- * not scroll; see `Modifier.horizontalScroll` to add this behavior. For a horizontally
- * scrollable list that only composes and lays out the currently visible items see `LazyRow`.
+ * that places its children in a vertical sequence, see [Column]. Note that by default items do not
+ * scroll; see `Modifier.horizontalScroll` to add this behavior. For a horizontally scrollable list
+ * that only composes and lays out the currently visible items see `LazyRow`.
  *
- * The [Row] layout is able to assign children widths according to their weights provided
- * using the [RowScope.weight] modifier. If a child is not provided a weight, it will be
- * asked for its preferred width before the sizes of the children with weights are calculated
- * proportionally to their weight based on the remaining available space. Note that if the
- * [Row] is horizontally scrollable or part of a horizontally scrollable container, any provided
- * weights will be disregarded as the remaining available space will be infinite.
+ * The [Row] layout is able to assign children widths according to their weights provided using the
+ * [RowScope.weight] modifier. If a child is not provided a weight, it will be asked for its
+ * preferred width before the sizes of the children with weights are calculated proportionally to
+ * their weight based on the remaining available space. Note that if the [Row] is horizontally
+ * scrollable or part of a horizontally scrollable container, any provided weights will be
+ * disregarded as the remaining available space will be infinite.
  *
- * When none of its children have weights, a [Row] will be as small as possible to fit its
- * children one next to the other. In order to change the width of the [Row], use the
- * [Modifier.width] modifiers; e.g. to make it fill the available width [Modifier.fillMaxWidth]
- * can be used. If at least one child of a [Row] has a [weight][RowScope.weight], the [Row] will
- * fill the available width, so there is no need for [Modifier.fillMaxWidth]. However, if [Row]'s
- * size should be limited, the [Modifier.width] or [Modifier.size] layout modifiers should be
- * applied.
+ * When none of its children have weights, a [Row] will be as small as possible to fit its children
+ * one next to the other. In order to change the width of the [Row], use the [Modifier.width]
+ * modifiers; e.g. to make it fill the available width [Modifier.fillMaxWidth] can be used. If at
+ * least one child of a [Row] has a [weight][RowScope.weight], the [Row] will fill the available
+ * width, so there is no need for [Modifier.fillMaxWidth]. However, if [Row]'s size should be
+ * limited, the [Modifier.width] or [Modifier.size] layout modifiers should be applied.
  *
  * When the size of the [Row] is larger than the sum of its children sizes, a
- * [horizontalArrangement] can be specified to define the positioning of the children inside
- * the [Row]. See [Arrangement] for available positioning behaviors; a custom arrangement can
- * also be defined using the constructor of [Arrangement]. Below is an illustration of
- * different horizontal arrangements:
+ * [horizontalArrangement] can be specified to define the positioning of the children inside the
+ * [Row]. See [Arrangement] for available positioning behaviors; a custom arrangement can also be
+ * defined using the constructor of [Arrangement]. Below is an illustration of different horizontal
+ * arrangements:
  *
- * ![Row arrangements](https://developer.android.com/images/reference/androidx/compose/foundation/layout/row_arrangement_visualization.gif)
+ * ![Row
+ * arrangements](https://developer.android.com/images/reference/androidx/compose/foundation/layout/row_arrangement_visualization.gif)
  *
  * Example usage:
  *
  * @sample androidx.compose.foundation.layout.samples.SimpleRow
  *
  * Note that if two or more Text components are placed in a [Row], normally they should be aligned
- * by their first baselines. [Row] as a general purpose container does not do it automatically
- * so developers need to handle this manually. This is achieved by adding a
- * [RowScope.alignByBaseline] modifier to every such Text component. By default this modifier
- * aligns by [FirstBaseline]. If, however, you need to align Texts by [LastBaseline] for example,
- * use a more general [RowScope.alignBy] modifier.
+ * by their first baselines. [Row] as a general purpose container does not do it automatically so
+ * developers need to handle this manually. This is achieved by adding a [RowScope.alignByBaseline]
+ * modifier to every such Text component. By default this modifier aligns by [FirstBaseline]. If,
+ * however, you need to align Texts by [LastBaseline] for example, use a more general
+ * [RowScope.alignBy] modifier.
  *
  * See example of using Texts inside the Row:
  *
@@ -85,7 +85,6 @@
  * @param modifier The modifier to be applied to the Row.
  * @param horizontalArrangement The horizontal arrangement of the layout's children.
  * @param verticalAlignment The vertical alignment of the layout's children.
- *
  * @see Column
  * @see [androidx.compose.foundation.lazy.LazyRow]
  */
@@ -104,14 +103,13 @@
     )
 }
 
-/**
- * MeasureBlocks to use when horizontalArrangement and verticalAlignment are not provided.
- */
+/** MeasureBlocks to use when horizontalArrangement and verticalAlignment are not provided. */
 @PublishedApi
-internal val DefaultRowMeasurePolicy: MeasurePolicy = RowMeasurePolicy(
-    horizontalArrangement = Arrangement.Start,
-    verticalAlignment = Alignment.Top,
-)
+internal val DefaultRowMeasurePolicy: MeasurePolicy =
+    RowMeasurePolicy(
+        horizontalArrangement = Arrangement.Start,
+        verticalAlignment = Alignment.Top,
+    )
 
 @PublishedApi
 @Composable
@@ -133,9 +131,9 @@
 internal data class RowMeasurePolicy(
     private val horizontalArrangement: Arrangement.Horizontal,
     private val verticalAlignment: Alignment.Vertical
-) : MeasurePolicy,
-    RowColumnMeasurePolicy {
+) : MeasurePolicy, RowColumnMeasurePolicy {
     override fun Placeable.mainAxisSize() = width
+
     override fun Placeable.crossAxisSize() = height
 
     override fun MeasureScope.measure(
@@ -187,16 +185,14 @@
         return with(measureScope) {
             layout(mainAxisLayoutSize, crossAxisLayoutSize) {
                 placeables.forEachIndexed { i, placeable ->
-                    val crossAxisPosition = getCrossAxisPosition(
-                        placeable!!,
-                        placeable.rowColumnParentData,
-                        crossAxisLayoutSize,
-                        beforeCrossAxisAlignmentLine
-                    )
-                    placeable.place(
-                        mainAxisPositions[i],
-                        crossAxisPosition
-                    )
+                    val crossAxisPosition =
+                        getCrossAxisPosition(
+                            placeable!!,
+                            placeable.rowColumnParentData,
+                            crossAxisLayoutSize,
+                            beforeCrossAxisAlignmentLine
+                        )
+                    placeable.place(mainAxisPositions[i], crossAxisPosition)
                 }
             }
         }
@@ -236,38 +232,42 @@
     override fun IntrinsicMeasureScope.minIntrinsicWidth(
         measurables: List<IntrinsicMeasurable>,
         height: Int
-    ) = IntrinsicMeasureBlocks.HorizontalMinWidth(
-        measurables,
-        height,
-        horizontalArrangement.spacing.roundToPx(),
-    )
+    ) =
+        IntrinsicMeasureBlocks.HorizontalMinWidth(
+            measurables,
+            height,
+            horizontalArrangement.spacing.roundToPx(),
+        )
 
     override fun IntrinsicMeasureScope.minIntrinsicHeight(
         measurables: List<IntrinsicMeasurable>,
         width: Int
-    ) = IntrinsicMeasureBlocks.HorizontalMinHeight(
-        measurables,
-        width,
-        horizontalArrangement.spacing.roundToPx(),
-    )
+    ) =
+        IntrinsicMeasureBlocks.HorizontalMinHeight(
+            measurables,
+            width,
+            horizontalArrangement.spacing.roundToPx(),
+        )
 
     override fun IntrinsicMeasureScope.maxIntrinsicWidth(
         measurables: List<IntrinsicMeasurable>,
         height: Int
-    ) = IntrinsicMeasureBlocks.HorizontalMaxWidth(
-        measurables,
-        height,
-        horizontalArrangement.spacing.roundToPx(),
-    )
+    ) =
+        IntrinsicMeasureBlocks.HorizontalMaxWidth(
+            measurables,
+            height,
+            horizontalArrangement.spacing.roundToPx(),
+        )
 
     override fun IntrinsicMeasureScope.maxIntrinsicHeight(
         measurables: List<IntrinsicMeasurable>,
         width: Int
-    ) = IntrinsicMeasureBlocks.HorizontalMaxHeight(
-        measurables,
-        width,
-        horizontalArrangement.spacing.roundToPx(),
-    )
+    ) =
+        IntrinsicMeasureBlocks.HorizontalMaxHeight(
+            measurables,
+            width,
+            horizontalArrangement.spacing.roundToPx(),
+        )
 }
 
 internal fun createRowConstraints(
@@ -294,9 +294,7 @@
     }
 }
 
-/**
- * Scope for the children of [Row].
- */
+/** Scope for the children of [Row]. */
 @LayoutScopeMarker
 @Immutable
 @JvmDefaultWithCompatibility
@@ -304,19 +302,18 @@
     /**
      * Size the element's width proportional to its [weight] relative to other weighted sibling
      * elements in the [Row]. The parent will divide the horizontal space remaining after measuring
-     * unweighted child elements and distribute it according to this weight.
-     * When [fill] is true, the element will be forced to occupy the whole width allocated to it.
-     * Otherwise, the element is allowed to be smaller - this will result in [Row] being smaller,
-     * as the unused allocated width will not be redistributed to other siblings.
+     * unweighted child elements and distribute it according to this weight. When [fill] is true,
+     * the element will be forced to occupy the whole width allocated to it. Otherwise, the element
+     * is allowed to be smaller - this will result in [Row] being smaller, as the unused allocated
+     * width will not be redistributed to other siblings.
      *
-     * @param weight The proportional width to give to this element, as related to the total of
-     * all weighted siblings. Must be positive.
+     * @param weight The proportional width to give to this element, as related to the total of all
+     *   weighted siblings. Must be positive.
      * @param fill When `true`, the element will occupy the whole width allocated.
      */
     @Stable
     fun Modifier.weight(
-        @FloatRange(from = 0.0, fromInclusive = false)
-        weight: Float,
+        @FloatRange(from = 0.0, fromInclusive = false) weight: Float,
         fill: Boolean = true
     ): Modifier
 
@@ -325,68 +322,61 @@
      * [Row]'s `verticalAlignment` parameter.
      *
      * Example usage:
+     *
      * @sample androidx.compose.foundation.layout.samples.SimpleAlignInRow
      */
-    @Stable
-    fun Modifier.align(alignment: Alignment.Vertical): Modifier
+    @Stable fun Modifier.align(alignment: Alignment.Vertical): Modifier
 
     /**
      * Position the element vertically such that its [alignmentLine] aligns with sibling elements
-     * also configured to [alignBy]. [alignBy] is a form of [align],
-     * so both modifiers will not work together if specified for the same layout.
-     * [alignBy] can be used to align two layouts by baseline inside a [Row],
-     * using `alignBy(FirstBaseline)`.
-     * Within a [Row], all components with [alignBy] will align vertically using
-     * the specified [HorizontalAlignmentLine]s or values provided using the other
-     * [alignBy] overload, forming a sibling group.
-     * At least one element of the sibling group will be placed as it had [Alignment.Top] align
-     * in [Row], and the alignment of the other siblings will be then determined such that
-     * the alignment lines coincide. Note that if only one element in a [Row] has the
-     * [alignBy] modifier specified the element will be positioned
-     * as if it had [Alignment.Top] align.
+     * also configured to [alignBy]. [alignBy] is a form of [align], so both modifiers will not work
+     * together if specified for the same layout. [alignBy] can be used to align two layouts by
+     * baseline inside a [Row], using `alignBy(FirstBaseline)`. Within a [Row], all components with
+     * [alignBy] will align vertically using the specified [HorizontalAlignmentLine]s or values
+     * provided using the other [alignBy] overload, forming a sibling group. At least one element of
+     * the sibling group will be placed as it had [Alignment.Top] align in [Row], and the alignment
+     * of the other siblings will be then determined such that the alignment lines coincide. Note
+     * that if only one element in a [Row] has the [alignBy] modifier specified the element will be
+     * positioned as if it had [Alignment.Top] align.
      *
      * @see alignByBaseline
      *
      * Example usage:
+     *
      * @sample androidx.compose.foundation.layout.samples.SimpleAlignByInRow
      */
-    @Stable
-    fun Modifier.alignBy(alignmentLine: HorizontalAlignmentLine): Modifier
+    @Stable fun Modifier.alignBy(alignmentLine: HorizontalAlignmentLine): Modifier
 
     /**
      * Position the element vertically such that its first baseline aligns with sibling elements
-     * also configured to [alignByBaseline] or [alignBy]. This modifier is a form
-     * of [align], so both modifiers will not work together if specified for the same layout.
-     * [alignByBaseline] is a particular case of [alignBy]. See [alignBy] for
-     * more details.
+     * also configured to [alignByBaseline] or [alignBy]. This modifier is a form of [align], so
+     * both modifiers will not work together if specified for the same layout. [alignByBaseline] is
+     * a particular case of [alignBy]. See [alignBy] for more details.
      *
      * @see alignBy
      *
      * Example usage:
+     *
      * @sample androidx.compose.foundation.layout.samples.SimpleAlignByInRow
      */
-    @Stable
-    fun Modifier.alignByBaseline(): Modifier
+    @Stable fun Modifier.alignByBaseline(): Modifier
 
     /**
-     * Position the element vertically such that the alignment line for the content as
-     * determined by [alignmentLineBlock] aligns with sibling elements also configured to
-     * [alignBy]. [alignBy] is a form of [align], so both modifiers
-     * will not work together if specified for the same layout.
-     * Within a [Row], all components with [alignBy] will align vertically using
-     * the specified [HorizontalAlignmentLine]s or values obtained from [alignmentLineBlock],
-     * forming a sibling group.
-     * At least one element of the sibling group will be placed as it had [Alignment.Top] align
-     * in [Row], and the alignment of the other siblings will be then determined such that
-     * the alignment lines coincide. Note that if only one element in a [Row] has the
-     * [alignBy] modifier specified the element will be positioned
-     * as if it had [Alignment.Top] align.
+     * Position the element vertically such that the alignment line for the content as determined by
+     * [alignmentLineBlock] aligns with sibling elements also configured to [alignBy]. [alignBy] is
+     * a form of [align], so both modifiers will not work together if specified for the same layout.
+     * Within a [Row], all components with [alignBy] will align vertically using the specified
+     * [HorizontalAlignmentLine]s or values obtained from [alignmentLineBlock], forming a sibling
+     * group. At least one element of the sibling group will be placed as it had [Alignment.Top]
+     * align in [Row], and the alignment of the other siblings will be then determined such that the
+     * alignment lines coincide. Note that if only one element in a [Row] has the [alignBy] modifier
+     * specified the element will be positioned as if it had [Alignment.Top] align.
      *
      * Example usage:
+     *
      * @sample androidx.compose.foundation.layout.samples.SimpleAlignByInRow
      */
-    @Stable
-    fun Modifier.alignBy(alignmentLineBlock: (Measured) -> Int): Modifier
+    @Stable fun Modifier.alignBy(alignmentLineBlock: (Measured) -> Int): Modifier
 }
 
 internal object RowScopeInstance : RowScope {
@@ -403,25 +393,15 @@
     }
 
     @Stable
-    override fun Modifier.align(alignment: Alignment.Vertical) = this.then(
-        VerticalAlignElement(
-            alignment
-        )
-    )
+    override fun Modifier.align(alignment: Alignment.Vertical) =
+        this.then(VerticalAlignElement(alignment))
 
     @Stable
-    override fun Modifier.alignBy(alignmentLine: HorizontalAlignmentLine) = this.then(
-        WithAlignmentLineElement(
-            alignmentLine = alignmentLine
-        )
-    )
+    override fun Modifier.alignBy(alignmentLine: HorizontalAlignmentLine) =
+        this.then(WithAlignmentLineElement(alignmentLine = alignmentLine))
 
-    @Stable
-    override fun Modifier.alignByBaseline() = alignBy(FirstBaseline)
+    @Stable override fun Modifier.alignByBaseline() = alignBy(FirstBaseline)
 
-    override fun Modifier.alignBy(alignmentLineBlock: (Measured) -> Int) = this.then(
-        WithAlignmentLineBlockElement(
-            block = alignmentLineBlock
-        )
-    )
+    override fun Modifier.alignBy(alignmentLineBlock: (Measured) -> Int) =
+        this.then(WithAlignmentLineBlockElement(block = alignmentLineBlock))
 }
diff --git a/compose/foundation/foundation-layout/src/commonMain/kotlin/androidx/compose/foundation/layout/RowColumnImpl.kt b/compose/foundation/foundation-layout/src/commonMain/kotlin/androidx/compose/foundation/layout/RowColumnImpl.kt
index 7467caf..64c786f 100644
--- a/compose/foundation/foundation-layout/src/commonMain/kotlin/androidx/compose/foundation/layout/RowColumnImpl.kt
+++ b/compose/foundation/foundation-layout/src/commonMain/kotlin/androidx/compose/foundation/layout/RowColumnImpl.kt
@@ -37,17 +37,13 @@
 import kotlin.math.max
 import kotlin.math.min
 
-/**
- * [Row] will be [Horizontal], [Column] is [Vertical].
- */
+/** [Row] will be [Horizontal], [Column] is [Vertical]. */
 internal enum class LayoutOrientation {
     Horizontal,
     Vertical
 }
 
-/**
- * Used to specify the alignment of a layout's children, in cross axis direction.
- */
+/** Used to specify the alignment of a layout's children, in cross axis direction. */
 @Immutable
 internal sealed class CrossAxisAlignment {
     /**
@@ -56,10 +52,10 @@
      *
      * @param size The remaining space (total size - content size) in the container.
      * @param layoutDirection The layout direction of the content if horizontal or
-     * [LayoutDirection.Ltr] if vertical.
+     *   [LayoutDirection.Ltr] if vertical.
      * @param placeable The item being aligned.
-     * @param beforeCrossAxisAlignmentLine The space before the cross-axis alignment line if
-     * an alignment line is being used or 0 if no alignment line is being used.
+     * @param beforeCrossAxisAlignmentLine The space before the cross-axis alignment line if an
+     *   alignment line is being used or 0 if no alignment line is being used.
      */
     internal abstract fun align(
         size: Int,
@@ -68,42 +64,33 @@
         beforeCrossAxisAlignmentLine: Int
     ): Int
 
-    /**
-     * Returns `true` if this is [Relative].
-     */
+    /** Returns `true` if this is [Relative]. */
     internal open val isRelative: Boolean
         get() = false
 
     /**
-     * Returns the alignment line position relative to the left/top of the space or `null` if
-     * this alignment doesn't rely on alignment lines.
+     * Returns the alignment line position relative to the left/top of the space or `null` if this
+     * alignment doesn't rely on alignment lines.
      */
     internal open fun calculateAlignmentLinePosition(placeable: Placeable): Int? = null
 
     companion object {
-        /**
-         * Place children such that their center is in the middle of the cross axis.
-         */
-        @Stable
-        val Center: CrossAxisAlignment = CenterCrossAxisAlignment
+        /** Place children such that their center is in the middle of the cross axis. */
+        @Stable val Center: CrossAxisAlignment = CenterCrossAxisAlignment
 
         /**
          * Place children such that their start edge is aligned to the start edge of the cross
          * axis. TODO(popam): Consider rtl directionality.
          */
-        @Stable
-        val Start: CrossAxisAlignment = StartCrossAxisAlignment
+        @Stable val Start: CrossAxisAlignment = StartCrossAxisAlignment
 
         /**
          * Place children such that their end edge is aligned to the end edge of the cross
          * axis. TODO(popam): Consider rtl directionality.
          */
-        @Stable
-        val End: CrossAxisAlignment = EndCrossAxisAlignment
+        @Stable val End: CrossAxisAlignment = EndCrossAxisAlignment
 
-        /**
-         * Align children by their baseline.
-         */
+        /** Align children by their baseline. */
         fun AlignmentLine(alignmentLine: AlignmentLine): CrossAxisAlignment =
             AlignmentLineCrossAxisAlignment(AlignmentLineProvider.Value(alignmentLine))
 
@@ -114,15 +101,11 @@
         internal fun Relative(alignmentLineProvider: AlignmentLineProvider): CrossAxisAlignment =
             AlignmentLineCrossAxisAlignment(alignmentLineProvider)
 
-        /**
-         * Align children with vertical alignment.
-         */
+        /** Align children with vertical alignment. */
         internal fun vertical(vertical: Alignment.Vertical): CrossAxisAlignment =
             VerticalCrossAxisAlignment(vertical)
 
-        /**
-         * Align children with horizontal alignment.
-         */
+        /** Align children with horizontal alignment. */
         internal fun horizontal(horizontal: Alignment.Horizontal): CrossAxisAlignment =
             HorizontalCrossAxisAlignment(horizontal)
     }
@@ -191,9 +174,8 @@
         }
     }
 
-    private data class VerticalCrossAxisAlignment(
-        val vertical: Alignment.Vertical
-    ) : CrossAxisAlignment() {
+    private data class VerticalCrossAxisAlignment(val vertical: Alignment.Vertical) :
+        CrossAxisAlignment() {
         override fun align(
             size: Int,
             layoutDirection: LayoutDirection,
@@ -204,9 +186,8 @@
         }
     }
 
-    private data class HorizontalCrossAxisAlignment(
-        val horizontal: Alignment.Horizontal
-    ) : CrossAxisAlignment() {
+    private data class HorizontalCrossAxisAlignment(val horizontal: Alignment.Horizontal) :
+        CrossAxisAlignment() {
         override fun align(
             size: Int,
             layoutDirection: LayoutDirection,
@@ -222,13 +203,19 @@
  * Box [Constraints], but which abstract away width and height in favor of main axis and cross axis.
  */
 @JvmInline
-internal value class OrientationIndependentConstraints private constructor(
-    private val value: Constraints
-) {
-    inline val mainAxisMin: Int get() = value.minWidth
-    inline val mainAxisMax: Int get() = value.maxWidth
-    inline val crossAxisMin: Int get() = value.minHeight
-    inline val crossAxisMax: Int get() = value.maxHeight
+internal value class OrientationIndependentConstraints
+private constructor(private val value: Constraints) {
+    inline val mainAxisMin: Int
+        get() = value.minWidth
+
+    inline val mainAxisMax: Int
+        get() = value.maxWidth
+
+    inline val crossAxisMin: Int
+        get() = value.minHeight
+
+    inline val crossAxisMax: Int
+        get() = value.maxHeight
 
     constructor(
         mainAxisMin: Int,
@@ -244,7 +231,10 @@
         )
     )
 
-    constructor(c: Constraints, orientation: LayoutOrientation) : this(
+    constructor(
+        c: Constraints,
+        orientation: LayoutOrientation
+    ) : this(
         if (orientation === Horizontal) c.minWidth else c.minHeight,
         if (orientation === Horizontal) c.maxWidth else c.maxHeight,
         if (orientation === Horizontal) c.minHeight else c.minWidth,
@@ -252,12 +242,13 @@
     )
 
     // Creates a new instance with the same main axis constraints and maximum tight cross axis.
-    fun stretchCrossAxis() = OrientationIndependentConstraints(
-        mainAxisMin,
-        mainAxisMax,
-        if (crossAxisMax != Constraints.Infinity) crossAxisMax else crossAxisMin,
-        crossAxisMax
-    )
+    fun stretchCrossAxis() =
+        OrientationIndependentConstraints(
+            mainAxisMin,
+            mainAxisMax,
+            if (crossAxisMax != Constraints.Infinity) crossAxisMax else crossAxisMin,
+            crossAxisMax
+        )
 
     // Given an orientation, resolves the current instance to traditional constraints.
     fun toBoxConstraints(orientation: LayoutOrientation) =
@@ -289,12 +280,7 @@
         crossAxisMin: Int = this.crossAxisMin,
         crossAxisMax: Int = this.crossAxisMax
     ): OrientationIndependentConstraints =
-        OrientationIndependentConstraints(
-            mainAxisMin,
-            mainAxisMax,
-            crossAxisMin,
-            crossAxisMax
-        )
+        OrientationIndependentConstraints(mainAxisMin, mainAxisMax, crossAxisMin, crossAxisMax)
 }
 
 internal val IntrinsicMeasurable.rowColumnParentData: RowColumnParentData?
@@ -328,6 +314,7 @@
             mainAxisSpacing,
         )
     }
+
     fun VerticalMinWidth(
         measurables: List<IntrinsicMeasurable>,
         availableHeight: Int,
@@ -341,6 +328,7 @@
             mainAxisSpacing,
         )
     }
+
     fun HorizontalMinHeight(
         measurables: List<IntrinsicMeasurable>,
         availableWidth: Int,
@@ -354,6 +342,7 @@
             mainAxisSpacing,
         )
     }
+
     fun VerticalMinHeight(
         measurables: List<IntrinsicMeasurable>,
         availableWidth: Int,
@@ -366,6 +355,7 @@
             mainAxisSpacing,
         )
     }
+
     fun HorizontalMaxWidth(
         measurables: List<IntrinsicMeasurable>,
         availableHeight: Int,
@@ -378,6 +368,7 @@
             mainAxisSpacing,
         )
     }
+
     fun VerticalMaxWidth(
         measurables: List<IntrinsicMeasurable>,
         availableHeight: Int,
@@ -391,6 +382,7 @@
             mainAxisSpacing,
         )
     }
+
     fun HorizontalMaxHeight(
         measurables: List<IntrinsicMeasurable>,
         availableWidth: Int,
@@ -404,6 +396,7 @@
             mainAxisSpacing,
         )
     }
+
     fun VerticalMaxHeight(
         measurables: List<IntrinsicMeasurable>,
         availableWidth: Int,
@@ -438,7 +431,8 @@
             weightUnitSpace = max(weightUnitSpace, (size / weight).fastRoundToInt())
         }
     }
-    return (weightUnitSpace * totalWeight).fastRoundToInt() + fixedSpace +
+    return (weightUnitSpace * totalWeight).fastRoundToInt() +
+        fixedSpace +
         (children.size - 1) * mainAxisSpacing
 }
 
@@ -458,12 +452,10 @@
         if (weight == 0f) {
             // Ask the child how much main axis space it wants to occupy. This cannot be more
             // than the remaining available space.
-            val remaining = if (mainAxisAvailable == Constraints.Infinity)
-                Constraints.Infinity else mainAxisAvailable - fixedSpace
-            val mainAxisSpace = min(
-                child.mainAxisSize(Constraints.Infinity),
-                remaining
-            )
+            val remaining =
+                if (mainAxisAvailable == Constraints.Infinity) Constraints.Infinity
+                else mainAxisAvailable - fixedSpace
+            val mainAxisSpace = min(child.mainAxisSize(Constraints.Infinity), remaining)
             fixedSpace += mainAxisSpace
             // Now that the assigned main axis space is known, ask about the cross axis space.
             crossAxisMax = max(crossAxisMax, child.crossAxisSize(mainAxisSpace))
@@ -473,28 +465,30 @@
     }
 
     // For weighted children, calculate how much main axis space weight=1 would represent.
-    val weightUnitSpace = if (totalWeight == 0f) {
-        0
-    } else if (mainAxisAvailable == Constraints.Infinity) {
-        Constraints.Infinity
-    } else {
-        (max(mainAxisAvailable - fixedSpace, 0) / totalWeight).fastRoundToInt()
-    }
+    val weightUnitSpace =
+        if (totalWeight == 0f) {
+            0
+        } else if (mainAxisAvailable == Constraints.Infinity) {
+            Constraints.Infinity
+        } else {
+            (max(mainAxisAvailable - fixedSpace, 0) / totalWeight).fastRoundToInt()
+        }
 
     children.fastForEach { child ->
         val weight = child.rowColumnParentData.weight
         // Now the main axis for weighted children is known, so ask about the cross axis space.
         if (weight > 0f) {
-            crossAxisMax = max(
-                crossAxisMax,
-                child.crossAxisSize(
-                    if (weightUnitSpace != Constraints.Infinity) {
-                        (weightUnitSpace * weight).fastRoundToInt()
-                    } else {
-                        Constraints.Infinity
-                    }
+            crossAxisMax =
+                max(
+                    crossAxisMax,
+                    child.crossAxisSize(
+                        if (weightUnitSpace != Constraints.Infinity) {
+                            (weightUnitSpace * weight).fastRoundToInt()
+                        } else {
+                            Constraints.Infinity
+                        }
+                    )
                 )
-            )
         }
     }
     return crossAxisMax
@@ -529,8 +523,7 @@
     override fun equals(other: Any?): Boolean {
         if (this === other) return true
         val otherModifier = other as? LayoutWeightElement ?: return false
-        return weight == otherModifier.weight &&
-            fill == otherModifier.fill
+        return weight == otherModifier.weight && fill == otherModifier.fill
     }
 }
 
@@ -545,9 +538,8 @@
         }
 }
 
-internal class WithAlignmentLineBlockElement(
-    val block: (Measured) -> Int
-) : ModifierNodeElement<SiblingsAlignedNode.WithAlignmentLineBlockNode>() {
+internal class WithAlignmentLineBlockElement(val block: (Measured) -> Int) :
+    ModifierNodeElement<SiblingsAlignedNode.WithAlignmentLineBlockNode>() {
     override fun create(): SiblingsAlignedNode.WithAlignmentLineBlockNode {
         return SiblingsAlignedNode.WithAlignmentLineBlockNode(block)
     }
@@ -570,9 +562,8 @@
     }
 }
 
-internal class WithAlignmentLineElement(
-    val alignmentLine: AlignmentLine
-) : ModifierNodeElement<SiblingsAlignedNode.WithAlignmentLineNode>() {
+internal class WithAlignmentLineElement(val alignmentLine: AlignmentLine) :
+    ModifierNodeElement<SiblingsAlignedNode.WithAlignmentLineNode>() {
     override fun create(): SiblingsAlignedNode.WithAlignmentLineNode {
         return SiblingsAlignedNode.WithAlignmentLineNode(alignmentLine)
     }
@@ -621,9 +612,8 @@
     }
 }
 
-internal class HorizontalAlignElement(
-    val horizontal: Alignment.Horizontal
-) : ModifierNodeElement<HorizontalAlignNode>() {
+internal class HorizontalAlignElement(val horizontal: Alignment.Horizontal) :
+    ModifierNodeElement<HorizontalAlignNode>() {
     override fun create(): HorizontalAlignNode {
         return HorizontalAlignNode(horizontal)
     }
@@ -636,6 +626,7 @@
         name = "align"
         value = horizontal
     }
+
     override fun hashCode(): Int = horizontal.hashCode()
 
     override fun equals(other: Any?): Boolean {
@@ -645,9 +636,8 @@
     }
 }
 
-internal class HorizontalAlignNode(
-    var horizontal: Alignment.Horizontal
-) : ParentDataModifierNode, Modifier.Node() {
+internal class HorizontalAlignNode(var horizontal: Alignment.Horizontal) :
+    ParentDataModifierNode, Modifier.Node() {
     override fun Density.modifyParentData(parentData: Any?): RowColumnParentData {
         return ((parentData as? RowColumnParentData) ?: RowColumnParentData()).also {
             it.crossAxisAlignment = CrossAxisAlignment.horizontal(horizontal)
@@ -680,9 +670,8 @@
     }
 }
 
-internal class VerticalAlignNode(
-    var vertical: Alignment.Vertical
-) : ParentDataModifierNode, Modifier.Node() {
+internal class VerticalAlignNode(var vertical: Alignment.Vertical) :
+    ParentDataModifierNode, Modifier.Node() {
     override fun Density.modifyParentData(parentData: Any?): RowColumnParentData {
         return ((parentData as? RowColumnParentData) ?: RowColumnParentData()).also {
             it.crossAxisAlignment = CrossAxisAlignment.vertical(vertical)
@@ -690,9 +679,7 @@
     }
 }
 
-/**
- * Parent data associated with children.
- */
+/** Parent data associated with children. */
 internal data class RowColumnParentData(
     var weight: Float = 0f,
     var fill: Boolean = true,
@@ -700,15 +687,12 @@
     var flowLayoutData: FlowLayoutData? = null,
 )
 
-/**
- * Provides the alignment line.
- */
+/** Provides the alignment line. */
 internal sealed class AlignmentLineProvider {
     abstract fun calculateAlignmentLinePosition(placeable: Placeable): Int
+
     data class Block(val lineProviderBlock: (Measured) -> Int) : AlignmentLineProvider() {
-        override fun calculateAlignmentLinePosition(
-            placeable: Placeable
-        ): Int {
+        override fun calculateAlignmentLinePosition(placeable: Placeable): Int {
             return lineProviderBlock(placeable)
         }
     }
diff --git a/compose/foundation/foundation-layout/src/commonMain/kotlin/androidx/compose/foundation/layout/RowColumnMeasurePolicy.kt b/compose/foundation/foundation-layout/src/commonMain/kotlin/androidx/compose/foundation/layout/RowColumnMeasurePolicy.kt
index af3d877..013d42b 100644
--- a/compose/foundation/foundation-layout/src/commonMain/kotlin/androidx/compose/foundation/layout/RowColumnMeasurePolicy.kt
+++ b/compose/foundation/foundation-layout/src/commonMain/kotlin/androidx/compose/foundation/layout/RowColumnMeasurePolicy.kt
@@ -29,7 +29,9 @@
 
 internal interface RowColumnMeasurePolicy {
     fun Placeable.mainAxisSize(): Int
+
     fun Placeable.crossAxisSize(): Int
+
     fun populateMainAxisPositions(
         mainAxisLayoutSize: Int,
         childrenMainAxisSize: IntArray,
@@ -63,13 +65,11 @@
  * Measures the row and column
  *
  * @param measureScope The measure scope to retrieve density
- * @param startIndex The startIndex (inclusive) when examining measurables, placeable
- * and parentData
- * @param endIndex The ending index (exclusive) when examining measurable, placeable
- * and parentData
+ * @param startIndex The startIndex (inclusive) when examining measurables, placeable and parentData
+ * @param endIndex The ending index (exclusive) when examining measurable, placeable and parentData
  * @param crossAxisOffset The offset to apply to the cross axis when placing
  * @param currentLineIndex The index of the current line if in a multi-row/column setting like
- * [FlowRow]
+ *   [FlowRow]
  */
 internal fun RowColumnMeasurePolicy.measure(
     mainAxisMin: Int,
@@ -111,31 +111,34 @@
             totalWeight += weight
             ++weightChildrenCount
         } else {
-            val crossAxisDesiredSize = if (crossAxisMax == Constraints.Infinity) null else
-                parentData?.flowLayoutData?.let {
-                    (it.fillCrossAxisFraction * crossAxisMax).fastRoundToInt()
-                }
+            val crossAxisDesiredSize =
+                if (crossAxisMax == Constraints.Infinity) null
+                else
+                    parentData?.flowLayoutData?.let {
+                        (it.fillCrossAxisFraction * crossAxisMax).fastRoundToInt()
+                    }
             val remaining = mainAxisMax - fixedSpace
-            val placeable = placeables[i] ?: child.measure(
-                // Ask for preferred main axis size.
-                createConstraints(
-                    mainAxisMin = 0,
-                    crossAxisMin = crossAxisDesiredSize ?: 0,
-                    mainAxisMax = if (mainAxisMax == Constraints.Infinity) {
-                        Constraints.Infinity
-                    } else {
-                        remaining.coerceAtLeast(0)
-                    },
-                    crossAxisMax = crossAxisDesiredSize ?: crossAxisMax
-                )
-            )
+            val placeable =
+                placeables[i]
+                    ?: child.measure(
+                        // Ask for preferred main axis size.
+                        createConstraints(
+                            mainAxisMin = 0,
+                            crossAxisMin = crossAxisDesiredSize ?: 0,
+                            mainAxisMax =
+                                if (mainAxisMax == Constraints.Infinity) {
+                                    Constraints.Infinity
+                                } else {
+                                    remaining.coerceAtLeast(0)
+                                },
+                            crossAxisMax = crossAxisDesiredSize ?: crossAxisMax
+                        )
+                    )
             val placeableMainAxisSize = placeable.mainAxisSize()
             val placeableCrossAxisSize = placeable.crossAxisSize()
             childrenMainAxisSize[i - startIndex] = placeableMainAxisSize
-            spaceAfterLastNoWeight = min(
-                arrangementSpacingInt,
-                (remaining - placeableMainAxisSize).coerceAtLeast(0)
-            )
+            spaceAfterLastNoWeight =
+                min(arrangementSpacingInt, (remaining - placeableMainAxisSize).coerceAtLeast(0))
             fixedSpace += placeableMainAxisSize + spaceAfterLastNoWeight
             crossAxisSpace = max(crossAxisSpace, placeableCrossAxisSize)
             placeables[i] = placeable
@@ -168,24 +171,37 @@
                 remainder -= weightedSize.fastRoundToInt()
             } catch (e: IllegalArgumentException) {
                 throw IllegalArgumentException(
-                    "This log indicates a hard-to-reproduce Compose issue, " +
-                        "modified with additional debugging details. " +
-                        "Please help us by adding your experiences to the bug link provided. " +
-                        "Thank you for helping us improve Compose. " +
-                        "https://issuetracker.google.com/issues/297974033 " +
-                        "mainAxisMax " + mainAxisMax +
-                        "mainAxisMin " + mainAxisMin +
-                        "targetSpace " + targetSpace +
-                        "arrangementSpacingPx " + arrangementSpacingPx +
-                        "weightChildrenCount " + weightChildrenCount +
-                        "fixedSpace " + fixedSpace +
-                        "arrangementSpacingTotal " + arrangementSpacingTotal +
-                        "remainingToTarget " + remainingToTarget +
-                        "totalWeight " + totalWeight +
-                        "weightUnitSpace " + weightUnitSpace +
-                        "itemWeight " + itemWeight +
-                        "weightedSize " + weightedSize
-                ).initCause(e)
+                        "This log indicates a hard-to-reproduce Compose issue, " +
+                            "modified with additional debugging details. " +
+                            "Please help us by adding your experiences to the bug link provided. " +
+                            "Thank you for helping us improve Compose. " +
+                            "https://issuetracker.google.com/issues/297974033 " +
+                            "mainAxisMax " +
+                            mainAxisMax +
+                            "mainAxisMin " +
+                            mainAxisMin +
+                            "targetSpace " +
+                            targetSpace +
+                            "arrangementSpacingPx " +
+                            arrangementSpacingPx +
+                            "weightChildrenCount " +
+                            weightChildrenCount +
+                            "fixedSpace " +
+                            fixedSpace +
+                            "arrangementSpacingTotal " +
+                            arrangementSpacingTotal +
+                            "remainingToTarget " +
+                            remainingToTarget +
+                            "totalWeight " +
+                            totalWeight +
+                            "weightUnitSpace " +
+                            weightUnitSpace +
+                            "itemWeight " +
+                            itemWeight +
+                            "weightedSize " +
+                            weightedSize
+                    )
+                    .initCause(e)
             }
         }
 
@@ -194,10 +210,12 @@
                 val child = measurables[i]
                 val parentData = child.rowColumnParentData
                 val weight = parentData.weight
-                val crossAxisDesiredSize = if (crossAxisMax == Constraints.Infinity) null else
-                    parentData?.flowLayoutData?.let {
-                        (it.fillCrossAxisFraction * crossAxisMax).fastRoundToInt()
-                    }
+                val crossAxisDesiredSize =
+                    if (crossAxisMax == Constraints.Infinity) null
+                    else
+                        parentData?.flowLayoutData?.let {
+                            (it.fillCrossAxisFraction * crossAxisMax).fastRoundToInt()
+                        }
                 check(weight > 0) { "All weights <= 0 should have placeables" }
                 // After the weightUnitSpace rounding, the total space going to be occupied
                 // can be smaller or larger than remainingToTarget. Here we distribute the
@@ -205,49 +223,62 @@
                 val remainderUnit = remainder.sign
                 remainder -= remainderUnit
                 val weightedSize = (weightUnitSpace * weight)
-                val childMainAxisSize = max(
-                    0,
-                    weightedSize.fastRoundToInt() + remainderUnit
-                )
+                val childMainAxisSize = max(0, weightedSize.fastRoundToInt() + remainderUnit)
 
                 val childConstraints: Constraints
                 try {
-                     childConstraints = createConstraints(
-                        mainAxisMin = if (parentData.fill &&
-                            childMainAxisSize != Constraints.Infinity
-                        ) {
-                            childMainAxisSize
-                        } else {
-                            0
-                        },
-                        crossAxisMin = crossAxisDesiredSize ?: 0,
-                        mainAxisMax = childMainAxisSize,
-                        crossAxisMax = crossAxisDesiredSize ?: crossAxisMax,
-                        isPrioritizing = true
-                    )
+                    childConstraints =
+                        createConstraints(
+                            mainAxisMin =
+                                if (parentData.fill && childMainAxisSize != Constraints.Infinity) {
+                                    childMainAxisSize
+                                } else {
+                                    0
+                                },
+                            crossAxisMin = crossAxisDesiredSize ?: 0,
+                            mainAxisMax = childMainAxisSize,
+                            crossAxisMax = crossAxisDesiredSize ?: crossAxisMax,
+                            isPrioritizing = true
+                        )
                 } catch (e: IllegalArgumentException) {
                     throw IllegalArgumentException(
-                        "This log indicates a hard-to-reproduce Compose issue, " +
-                            "modified with additional debugging details. " +
-                            "Please help us by adding your experiences to the bug link provided. " +
-                            "Thank you for helping us improve Compose. " +
-                            "https://issuetracker.google.com/issues/300280216 " +
-                            "mainAxisMax " + mainAxisMax +
-                            "mainAxisMin " + mainAxisMin +
-                            "targetSpace " + targetSpace +
-                            "arrangementSpacingPx " + arrangementSpacingPx +
-                            "weightChildrenCount " + weightChildrenCount +
-                            "fixedSpace " + fixedSpace +
-                            "arrangementSpacingTotal " + arrangementSpacingTotal +
-                            "remainingToTarget " + remainingToTarget +
-                            "totalWeight " + totalWeight +
-                            "weightUnitSpace " + weightUnitSpace +
-                            "weight " + weight +
-                            "weightedSize " + weightedSize +
-                            "crossAxisDesiredSize " + crossAxisDesiredSize +
-                            "remainderUnit " + remainderUnit +
-                            "childMainAxisSize " + childMainAxisSize
-                    ).initCause(e)
+                            "This log indicates a hard-to-reproduce Compose issue, " +
+                                "modified with additional debugging details. " +
+                                "Please help us by adding your experiences to the bug link provided. " +
+                                "Thank you for helping us improve Compose. " +
+                                "https://issuetracker.google.com/issues/300280216 " +
+                                "mainAxisMax " +
+                                mainAxisMax +
+                                "mainAxisMin " +
+                                mainAxisMin +
+                                "targetSpace " +
+                                targetSpace +
+                                "arrangementSpacingPx " +
+                                arrangementSpacingPx +
+                                "weightChildrenCount " +
+                                weightChildrenCount +
+                                "fixedSpace " +
+                                fixedSpace +
+                                "arrangementSpacingTotal " +
+                                arrangementSpacingTotal +
+                                "remainingToTarget " +
+                                remainingToTarget +
+                                "totalWeight " +
+                                totalWeight +
+                                "weightUnitSpace " +
+                                weightUnitSpace +
+                                "weight " +
+                                weight +
+                                "weightedSize " +
+                                weightedSize +
+                                "crossAxisDesiredSize " +
+                                crossAxisDesiredSize +
+                                "remainderUnit " +
+                                remainderUnit +
+                                "childMainAxisSize " +
+                                childMainAxisSize
+                        )
+                        .initCause(e)
                 }
                 val placeable = child.measure(childConstraints)
                 val placeableMainAxisSize = placeable.mainAxisSize()
@@ -258,9 +289,8 @@
                 placeables[i] = placeable
             }
         }
-        weightedSpace = (weightedSpace + arrangementSpacingTotal)
-            .toInt()
-            .coerceIn(0, mainAxisMax - fixedSpace)
+        weightedSpace =
+            (weightedSpace + arrangementSpacingTotal).toInt().coerceIn(0, mainAxisMax - fixedSpace)
     }
 
     // we've done this check in weights as to avoid going through another loop
@@ -268,35 +298,36 @@
         for (i in startIndex until endIndex) {
             val placeable = placeables[i]
             val parentData = placeable!!.rowColumnParentData
-            val alignmentLinePosition = parentData.crossAxisAlignment
-                ?.calculateAlignmentLinePosition(placeable)
+            val alignmentLinePosition =
+                parentData.crossAxisAlignment?.calculateAlignmentLinePosition(placeable)
             alignmentLinePosition?.let {
                 val placeableCrossAxisSize = placeable.crossAxisSize()
-                beforeCrossAxisAlignmentLine = max(
-                    beforeCrossAxisAlignmentLine,
-                    if (it != AlignmentLine.Unspecified) alignmentLinePosition else 0
-                )
-                afterCrossAxisAlignmentLine = max(
-                    afterCrossAxisAlignmentLine,
-                    placeableCrossAxisSize - if (it != AlignmentLine.Unspecified) {
-                        it
-                    } else {
-                        placeableCrossAxisSize
-                    }
-                )
+                beforeCrossAxisAlignmentLine =
+                    max(
+                        beforeCrossAxisAlignmentLine,
+                        if (it != AlignmentLine.Unspecified) alignmentLinePosition else 0
+                    )
+                afterCrossAxisAlignmentLine =
+                    max(
+                        afterCrossAxisAlignmentLine,
+                        placeableCrossAxisSize -
+                            if (it != AlignmentLine.Unspecified) {
+                                it
+                            } else {
+                                placeableCrossAxisSize
+                            }
+                    )
             }
         }
     }
 
     // Compute the Row or Column size and position the children.
-    val mainAxisLayoutSize = max(
-        (fixedSpace + weightedSpace).coerceAtLeast(0),
-        mainAxisMin
-    )
-    val crossAxisLayoutSize = max(
-        crossAxisSpace,
-        max(crossAxisMin, beforeCrossAxisAlignmentLine + afterCrossAxisAlignmentLine)
-    )
+    val mainAxisLayoutSize = max((fixedSpace + weightedSpace).coerceAtLeast(0), mainAxisMin)
+    val crossAxisLayoutSize =
+        max(
+            crossAxisSpace,
+            max(crossAxisMin, beforeCrossAxisAlignmentLine + afterCrossAxisAlignmentLine)
+        )
     val mainAxisPositions = IntArray(subSize) { 0 }
     populateMainAxisPositions(
         mainAxisLayoutSize,
diff --git a/compose/foundation/foundation-layout/src/commonMain/kotlin/androidx/compose/foundation/layout/Size.kt b/compose/foundation/foundation-layout/src/commonMain/kotlin/androidx/compose/foundation/layout/Size.kt
index 3fa5e57..8879056 100644
--- a/compose/foundation/foundation-layout/src/commonMain/kotlin/androidx/compose/foundation/layout/Size.kt
+++ b/compose/foundation/foundation-layout/src/commonMain/kotlin/androidx/compose/foundation/layout/Size.kt
@@ -46,74 +46,83 @@
  * [Constraints] may override this value, forcing the content to be either smaller or larger.
  *
  * For a modifier that sets the width of the content regardless of the incoming constraints see
- * [Modifier.requiredWidth]. See [height] or [size] to set other preferred dimensions.
- * See [widthIn], [heightIn] or [sizeIn] to set a preferred size range.
+ * [Modifier.requiredWidth]. See [height] or [size] to set other preferred dimensions. See
+ * [widthIn], [heightIn] or [sizeIn] to set a preferred size range.
  *
  * Example usage:
+ *
  * @sample androidx.compose.foundation.layout.samples.SimpleWidthModifier
  */
 @Stable
-fun Modifier.width(width: Dp) = this.then(
-    SizeElement(
-        minWidth = width,
-        maxWidth = width,
-        enforceIncoming = true,
-        inspectorInfo = debugInspectorInfo {
-            name = "width"
-            value = width
-        }
+fun Modifier.width(width: Dp) =
+    this.then(
+        SizeElement(
+            minWidth = width,
+            maxWidth = width,
+            enforceIncoming = true,
+            inspectorInfo =
+                debugInspectorInfo {
+                    name = "width"
+                    value = width
+                }
+        )
     )
-)
 
 /**
  * Declare the preferred height of the content to be exactly [height]dp. The incoming measurement
  * [Constraints] may override this value, forcing the content to be either smaller or larger.
  *
  * For a modifier that sets the height of the content regardless of the incoming constraints see
- * [Modifier.requiredHeight]. See [width] or [size] to set other preferred dimensions.
- * See [widthIn], [heightIn] or [sizeIn] to set a preferred size range.
+ * [Modifier.requiredHeight]. See [width] or [size] to set other preferred dimensions. See
+ * [widthIn], [heightIn] or [sizeIn] to set a preferred size range.
  *
  * Example usage:
+ *
  * @sample androidx.compose.foundation.layout.samples.SimpleHeightModifier
  */
 @Stable
-fun Modifier.height(height: Dp) = this.then(
-    SizeElement(
-        minHeight = height,
-        maxHeight = height,
-        enforceIncoming = true,
-        inspectorInfo = debugInspectorInfo {
-            name = "height"
-            value = height
-        }
+fun Modifier.height(height: Dp) =
+    this.then(
+        SizeElement(
+            minHeight = height,
+            maxHeight = height,
+            enforceIncoming = true,
+            inspectorInfo =
+                debugInspectorInfo {
+                    name = "height"
+                    value = height
+                }
+        )
     )
-)
 
 /**
  * Declare the preferred size of the content to be exactly [size]dp square. The incoming measurement
  * [Constraints] may override this value, forcing the content to be either smaller or larger.
  *
  * For a modifier that sets the size of the content regardless of the incoming constraints, see
- * [Modifier.requiredSize]. See [width] or [height] to set width or height alone.
- * See [widthIn], [heightIn] or [sizeIn] to set a preferred size range.
+ * [Modifier.requiredSize]. See [width] or [height] to set width or height alone. See [widthIn],
+ * [heightIn] or [sizeIn] to set a preferred size range.
  *
  * Example usage:
+ *
  * @sample androidx.compose.foundation.layout.samples.SimpleSizeModifier
  */
 @Stable
-fun Modifier.size(size: Dp) = this.then(
-    SizeElement(
-        minWidth = size,
-        maxWidth = size,
-        minHeight = size,
-        maxHeight = size,
-        enforceIncoming = true,
-        inspectorInfo = debugInspectorInfo {
-            name = "size"
-            value = size
-        }
+fun Modifier.size(size: Dp) =
+    this.then(
+        SizeElement(
+            minWidth = size,
+            maxWidth = size,
+            minHeight = size,
+            maxHeight = size,
+            enforceIncoming = true,
+            inspectorInfo =
+                debugInspectorInfo {
+                    name = "size"
+                    value = size
+                }
+        )
     )
-)
 
 /**
  * Declare the preferred size of the content to be exactly [width]dp by [height]dp. The incoming
@@ -121,92 +130,91 @@
  * larger.
  *
  * For a modifier that sets the size of the content regardless of the incoming constraints, see
- * [Modifier.requiredSize]. See [width] or [height] to set width or height alone.
- * See [widthIn], [heightIn] or [sizeIn] to set a preferred size range.
+ * [Modifier.requiredSize]. See [width] or [height] to set width or height alone. See [widthIn],
+ * [heightIn] or [sizeIn] to set a preferred size range.
  *
  * Example usage:
+ *
  * @sample androidx.compose.foundation.layout.samples.SimpleSizeModifier
  */
 @Stable
-fun Modifier.size(width: Dp, height: Dp) = this.then(
-    SizeElement(
-        minWidth = width,
-        maxWidth = width,
-        minHeight = height,
-        maxHeight = height,
-        enforceIncoming = true,
-        inspectorInfo = debugInspectorInfo {
-            name = "size"
-            properties["width"] = width
-            properties["height"] = height
-        }
+fun Modifier.size(width: Dp, height: Dp) =
+    this.then(
+        SizeElement(
+            minWidth = width,
+            maxWidth = width,
+            minHeight = height,
+            maxHeight = height,
+            enforceIncoming = true,
+            inspectorInfo =
+                debugInspectorInfo {
+                    name = "size"
+                    properties["width"] = width
+                    properties["height"] = height
+                }
+        )
     )
-)
 
 /**
- * Declare the preferred size of the content to be exactly [size]. The incoming
- * measurement [Constraints] may override this value, forcing the content to be either smaller or
- * larger.
+ * Declare the preferred size of the content to be exactly [size]. The incoming measurement
+ * [Constraints] may override this value, forcing the content to be either smaller or larger.
  *
  * For a modifier that sets the size of the content regardless of the incoming constraints, see
- * [Modifier.requiredSize]. See [width] or [height] to set width or height alone.
- * See [widthIn], [heightIn] or [sizeIn] to set a preferred size range.
+ * [Modifier.requiredSize]. See [width] or [height] to set width or height alone. See [widthIn],
+ * [heightIn] or [sizeIn] to set a preferred size range.
  *
  * Example usage:
+ *
  * @sample androidx.compose.foundation.layout.samples.SimpleSizeModifierWithDpSize
  */
-@Stable
-fun Modifier.size(size: DpSize) = size(size.width, size.height)
+@Stable fun Modifier.size(size: DpSize) = size(size.width, size.height)
 
 /**
- * Constrain the width of the content to be between [min]dp and [max]dp as permitted
- * by the incoming measurement [Constraints]. If the incoming constraints are more restrictive
- * the requested size will obey the incoming constraints and attempt to be as close as possible
- * to the preferred size.
+ * Constrain the width of the content to be between [min]dp and [max]dp as permitted by the incoming
+ * measurement [Constraints]. If the incoming constraints are more restrictive the requested size
+ * will obey the incoming constraints and attempt to be as close as possible to the preferred size.
  */
 @Stable
-fun Modifier.widthIn(
-    min: Dp = Dp.Unspecified,
-    max: Dp = Dp.Unspecified
-) = this.then(
-    SizeElement(
-        minWidth = min,
-        maxWidth = max,
-        enforceIncoming = true,
-        inspectorInfo = debugInspectorInfo {
-            name = "widthIn"
-            properties["min"] = min
-            properties["max"] = max
-        }
+fun Modifier.widthIn(min: Dp = Dp.Unspecified, max: Dp = Dp.Unspecified) =
+    this.then(
+        SizeElement(
+            minWidth = min,
+            maxWidth = max,
+            enforceIncoming = true,
+            inspectorInfo =
+                debugInspectorInfo {
+                    name = "widthIn"
+                    properties["min"] = min
+                    properties["max"] = max
+                }
+        )
     )
-)
 
 /**
- * Constrain the height of the content to be between [min]dp and [max]dp as permitted
- * by the incoming measurement [Constraints]. If the incoming constraints are more restrictive
- * the requested size will obey the incoming constraints and attempt to be as close as possible
- * to the preferred size.
+ * Constrain the height of the content to be between [min]dp and [max]dp as permitted by the
+ * incoming measurement [Constraints]. If the incoming constraints are more restrictive the
+ * requested size will obey the incoming constraints and attempt to be as close as possible to the
+ * preferred size.
  */
 @Stable
-fun Modifier.heightIn(
-    min: Dp = Dp.Unspecified,
-    max: Dp = Dp.Unspecified
-) = this.then(
-    SizeElement(
-        minHeight = min,
-        maxHeight = max,
-        enforceIncoming = true,
-        inspectorInfo = debugInspectorInfo {
-            name = "heightIn"
-            properties["min"] = min
-            properties["max"] = max
-        }
+fun Modifier.heightIn(min: Dp = Dp.Unspecified, max: Dp = Dp.Unspecified) =
+    this.then(
+        SizeElement(
+            minHeight = min,
+            maxHeight = max,
+            enforceIncoming = true,
+            inspectorInfo =
+                debugInspectorInfo {
+                    name = "heightIn"
+                    properties["min"] = min
+                    properties["max"] = max
+                }
+        )
     )
-)
 
 /**
- * Constrain the width of the content to be between [minWidth]dp and [maxWidth]dp and the height
- * of the content to be between [minHeight]dp and [maxHeight]dp as permitted by the incoming
+ * Constrain the width of the content to be between [minWidth]dp and [maxWidth]dp and the height of
+ * the content to be between [minHeight]dp and [maxHeight]dp as permitted by the incoming
  * measurement [Constraints]. If the incoming constraints are more restrictive the requested size
  * will obey the incoming constraints and attempt to be as close as possible to the preferred size.
  */
@@ -216,207 +224,210 @@
     minHeight: Dp = Dp.Unspecified,
     maxWidth: Dp = Dp.Unspecified,
     maxHeight: Dp = Dp.Unspecified
-) = this.then(
-    SizeElement(
-        minWidth = minWidth,
-        minHeight = minHeight,
-        maxWidth = maxWidth,
-        maxHeight = maxHeight,
-        enforceIncoming = true,
-        inspectorInfo = debugInspectorInfo {
-            name = "sizeIn"
-            properties["minWidth"] = minWidth
-            properties["minHeight"] = minHeight
-            properties["maxWidth"] = maxWidth
-            properties["maxHeight"] = maxHeight
-        }
+) =
+    this.then(
+        SizeElement(
+            minWidth = minWidth,
+            minHeight = minHeight,
+            maxWidth = maxWidth,
+            maxHeight = maxHeight,
+            enforceIncoming = true,
+            inspectorInfo =
+                debugInspectorInfo {
+                    name = "sizeIn"
+                    properties["minWidth"] = minWidth
+                    properties["minHeight"] = minHeight
+                    properties["maxWidth"] = maxWidth
+                    properties["maxHeight"] = maxHeight
+                }
+        )
     )
-)
 
 /**
- * Declare the width of the content to be exactly [width]dp. The incoming measurement
- * [Constraints] will not override this value. If the content chooses a size that does not
- * satisfy the incoming [Constraints], the parent layout will be reported a size coerced
- * in the [Constraints], and the position of the content will be automatically offset to be
- * centered on the space assigned to the child by the parent layout under the assumption that
- * [Constraints] were respected.
+ * Declare the width of the content to be exactly [width]dp. The incoming measurement [Constraints]
+ * will not override this value. If the content chooses a size that does not satisfy the incoming
+ * [Constraints], the parent layout will be reported a size coerced in the [Constraints], and the
+ * position of the content will be automatically offset to be centered on the space assigned to the
+ * child by the parent layout under the assumption that [Constraints] were respected.
  *
- * See [requiredWidthIn] and [requiredSizeIn] to set a size range.
- * See [width] to set a preferred width, which is only respected when the incoming
- * constraints allow it.
+ * See [requiredWidthIn] and [requiredSizeIn] to set a size range. See [width] to set a preferred
+ * width, which is only respected when the incoming constraints allow it.
  *
  * Example usage:
+ *
  * @sample androidx.compose.foundation.layout.samples.SimpleRequiredWidthModifier
  */
 @Stable
-fun Modifier.requiredWidth(width: Dp) = this.then(
-    SizeElement(
-        minWidth = width,
-        maxWidth = width,
-        enforceIncoming = false,
-        inspectorInfo = debugInspectorInfo {
-            name = "requiredWidth"
-            value = width
-        }
+fun Modifier.requiredWidth(width: Dp) =
+    this.then(
+        SizeElement(
+            minWidth = width,
+            maxWidth = width,
+            enforceIncoming = false,
+            inspectorInfo =
+                debugInspectorInfo {
+                    name = "requiredWidth"
+                    value = width
+                }
+        )
     )
-)
 
 /**
  * Declare the height of the content to be exactly [height]dp. The incoming measurement
- * [Constraints] will not override this value. If the content chooses a size that does not
- * satisfy the incoming [Constraints], the parent layout will be reported a size coerced
- * in the [Constraints], and the position of the content will be automatically offset to be
- * centered on the space assigned to the child by the parent layout under the assumption that
- * [Constraints] were respected.
+ * [Constraints] will not override this value. If the content chooses a size that does not satisfy
+ * the incoming [Constraints], the parent layout will be reported a size coerced in the
+ * [Constraints], and the position of the content will be automatically offset to be centered on the
+ * space assigned to the child by the parent layout under the assumption that [Constraints] were
+ * respected.
  *
- * See [requiredHeightIn] and [requiredSizeIn] to set a size range.
- * See [height] to set a preferred height, which is only respected when the incoming
- * constraints allow it.
+ * See [requiredHeightIn] and [requiredSizeIn] to set a size range. See [height] to set a preferred
+ * height, which is only respected when the incoming constraints allow it.
  *
  * Example usage:
+ *
  * @sample androidx.compose.foundation.layout.samples.SimpleRequiredHeightModifier
  */
 @Stable
-fun Modifier.requiredHeight(height: Dp) = this.then(
-    SizeElement(
-        minHeight = height,
-        maxHeight = height,
-        enforceIncoming = false,
-        inspectorInfo = debugInspectorInfo {
-            name = "requiredHeight"
-            value = height
-        }
+fun Modifier.requiredHeight(height: Dp) =
+    this.then(
+        SizeElement(
+            minHeight = height,
+            maxHeight = height,
+            enforceIncoming = false,
+            inspectorInfo =
+                debugInspectorInfo {
+                    name = "requiredHeight"
+                    value = height
+                }
+        )
     )
-)
 
 /**
  * Declare the size of the content to be exactly [size]dp width and height. The incoming measurement
- * [Constraints] will not override this value. If the content chooses a size that does not
- * satisfy the incoming [Constraints], the parent layout will be reported a size coerced
- * in the [Constraints], and the position of the content will be automatically offset to be
- * centered on the space assigned to the child by the parent layout under the assumption that
- * [Constraints] were respected.
+ * [Constraints] will not override this value. If the content chooses a size that does not satisfy
+ * the incoming [Constraints], the parent layout will be reported a size coerced in the
+ * [Constraints], and the position of the content will be automatically offset to be centered on the
+ * space assigned to the child by the parent layout under the assumption that [Constraints] were
+ * respected.
  *
- * See [requiredSizeIn] to set a size range.
- * See [size] to set a preferred size, which is only respected when the incoming
- * constraints allow it.
+ * See [requiredSizeIn] to set a size range. See [size] to set a preferred size, which is only
+ * respected when the incoming constraints allow it.
  *
  * Example usage:
+ *
  * @sample androidx.compose.foundation.layout.samples.SimpleRequiredSizeModifier
  */
 @Stable
-fun Modifier.requiredSize(size: Dp) = this.then(
-    SizeElement(
-        minWidth = size,
-        maxWidth = size,
-        minHeight = size,
-        maxHeight = size,
-        enforceIncoming = false,
-        inspectorInfo = debugInspectorInfo {
-            name = "requiredSize"
-            value = size
-        }
+fun Modifier.requiredSize(size: Dp) =
+    this.then(
+        SizeElement(
+            minWidth = size,
+            maxWidth = size,
+            minHeight = size,
+            maxHeight = size,
+            enforceIncoming = false,
+            inspectorInfo =
+                debugInspectorInfo {
+                    name = "requiredSize"
+                    value = size
+                }
+        )
     )
-)
 
 /**
  * Declare the size of the content to be exactly [width]dp and [height]dp. The incoming measurement
- * [Constraints] will not override this value. If the content chooses a size that does not
- * satisfy the incoming [Constraints], the parent layout will be reported a size coerced
- * in the [Constraints], and the position of the content will be automatically offset to be
+ * [Constraints] will not override this value. If the content chooses a size that does not satisfy
+ * the incoming [Constraints], the parent layout will be reported a size coerced in the
+ * [Constraints], and the position of the content will be automatically offset to be centered on the
+ * space assigned to the child by the parent layout under the assumption that [Constraints] were
+ * respected.
+ *
+ * See [requiredSizeIn] to set a size range. See [size] to set a preferred size, which is only
+ * respected when the incoming constraints allow it.
+ */
+@Stable
+fun Modifier.requiredSize(width: Dp, height: Dp) =
+    this.then(
+        SizeElement(
+            minWidth = width,
+            maxWidth = width,
+            minHeight = height,
+            maxHeight = height,
+            enforceIncoming = false,
+            inspectorInfo =
+                debugInspectorInfo {
+                    name = "requiredSize"
+                    properties["width"] = width
+                    properties["height"] = height
+                }
+        )
+    )
+
+/**
+ * Declare the size of the content to be exactly [size]. The incoming measurement [Constraints] will
+ * not override this value. If the content chooses a size that does not satisfy the incoming
+ * [Constraints], the parent layout will be reported a size coerced in the [Constraints], and the
+ * position of the content will be automatically offset to be centered on the space assigned to the
+ * child by the parent layout under the assumption that [Constraints] were respected.
+ *
+ * See [requiredSizeIn] to set a size range. See [size] to set a preferred size, which is only
+ * respected when the incoming constraints allow it.
+ */
+@Stable fun Modifier.requiredSize(size: DpSize) = requiredSize(size.width, size.height)
+
+/**
+ * Constrain the width of the content to be between [min]dp and [max]dp. If the content chooses a
+ * size that does not satisfy the incoming [Constraints], the parent layout will be reported a size
+ * coerced in the [Constraints], and the position of the content will be automatically offset to be
  * centered on the space assigned to the child by the parent layout under the assumption that
  * [Constraints] were respected.
- *
- * See [requiredSizeIn] to set a size range.
- * See [size] to set a preferred size, which is only respected when the incoming
- * constraints allow it.
  */
 @Stable
-fun Modifier.requiredSize(width: Dp, height: Dp) = this.then(
-    SizeElement(
-        minWidth = width,
-        maxWidth = width,
-        minHeight = height,
-        maxHeight = height,
-        enforceIncoming = false,
-        inspectorInfo = debugInspectorInfo {
-            name = "requiredSize"
-            properties["width"] = width
-            properties["height"] = height
-        }
+fun Modifier.requiredWidthIn(min: Dp = Dp.Unspecified, max: Dp = Dp.Unspecified) =
+    this.then(
+        SizeElement(
+            minWidth = min,
+            maxWidth = max,
+            enforceIncoming = false,
+            inspectorInfo =
+                debugInspectorInfo {
+                    name = "requiredWidthIn"
+                    properties["min"] = min
+                    properties["max"] = max
+                }
+        )
     )
-)
 
 /**
- * Declare the size of the content to be exactly [size]. The incoming measurement
- * [Constraints] will not override this value. If the content chooses a size that does not
- * satisfy the incoming [Constraints], the parent layout will be reported a size coerced
- * in the [Constraints], and the position of the content will be automatically offset to be
+ * Constrain the height of the content to be between [min]dp and [max]dp. If the content chooses a
+ * size that does not satisfy the incoming [Constraints], the parent layout will be reported a size
+ * coerced in the [Constraints], and the position of the content will be automatically offset to be
  * centered on the space assigned to the child by the parent layout under the assumption that
  * [Constraints] were respected.
- *
- * See [requiredSizeIn] to set a size range.
- * See [size] to set a preferred size, which is only respected when the incoming
- * constraints allow it.
  */
 @Stable
-fun Modifier.requiredSize(size: DpSize) = requiredSize(size.width, size.height)
-
-/**
- * Constrain the width of the content to be between [min]dp and [max]dp.
- * If the content chooses a size that does not satisfy the incoming [Constraints], the
- * parent layout will be reported a size coerced in the [Constraints], and the position
- * of the content will be automatically offset to be centered on the space assigned to
- * the child by the parent layout under the assumption that [Constraints] were respected.
- */
-@Stable
-fun Modifier.requiredWidthIn(
-    min: Dp = Dp.Unspecified,
-    max: Dp = Dp.Unspecified
-) = this.then(
-    SizeElement(
-        minWidth = min,
-        maxWidth = max,
-        enforceIncoming = false,
-        inspectorInfo = debugInspectorInfo {
-            name = "requiredWidthIn"
-            properties["min"] = min
-            properties["max"] = max
-        }
+fun Modifier.requiredHeightIn(min: Dp = Dp.Unspecified, max: Dp = Dp.Unspecified) =
+    this.then(
+        SizeElement(
+            minHeight = min,
+            maxHeight = max,
+            enforceIncoming = false,
+            inspectorInfo =
+                debugInspectorInfo {
+                    name = "requiredHeightIn"
+                    properties["min"] = min
+                    properties["max"] = max
+                }
+        )
     )
-)
 
 /**
- * Constrain the height of the content to be between [min]dp and [max]dp.
- * If the content chooses a size that does not satisfy the incoming [Constraints], the
- * parent layout will be reported a size coerced in the [Constraints], and the position
- * of the content will be automatically offset to be centered on the space assigned to
- * the child by the parent layout under the assumption that [Constraints] were respected.
- */
-@Stable
-fun Modifier.requiredHeightIn(
-    min: Dp = Dp.Unspecified,
-    max: Dp = Dp.Unspecified
-) = this.then(
-    SizeElement(
-        minHeight = min,
-        maxHeight = max,
-        enforceIncoming = false,
-        inspectorInfo = debugInspectorInfo {
-            name = "requiredHeightIn"
-            properties["min"] = min
-            properties["max"] = max
-        }
-    )
-)
-
-/**
- * Constrain the width of the content to be between [minWidth]dp and [maxWidth]dp, and the
- * height of the content to be between [minHeight]dp and [maxHeight]dp.
- * If the content chooses a size that does not satisfy the incoming [Constraints], the
- * parent layout will be reported a size coerced in the [Constraints], and the position
- * of the content will be automatically offset to be centered on the space assigned to
- * the child by the parent layout under the assumption that [Constraints] were respected.
+ * Constrain the width of the content to be between [minWidth]dp and [maxWidth]dp, and the height of
+ * the content to be between [minHeight]dp and [maxHeight]dp. If the content chooses a size that
+ * does not satisfy the incoming [Constraints], the parent layout will be reported a size coerced in
+ * the [Constraints], and the position of the content will be automatically offset to be centered on
+ * the space assigned to the child by the parent layout under the assumption that [Constraints] were
+ * respected.
  */
 @Stable
 fun Modifier.requiredSizeIn(
@@ -424,35 +435,39 @@
     minHeight: Dp = Dp.Unspecified,
     maxWidth: Dp = Dp.Unspecified,
     maxHeight: Dp = Dp.Unspecified
-) = this.then(
-    SizeElement(
-        minWidth = minWidth,
-        minHeight = minHeight,
-        maxWidth = maxWidth,
-        maxHeight = maxHeight,
-        enforceIncoming = false,
-        inspectorInfo = debugInspectorInfo {
-            name = "requiredSizeIn"
-            properties["minWidth"] = minWidth
-            properties["minHeight"] = minHeight
-            properties["maxWidth"] = maxWidth
-            properties["maxHeight"] = maxHeight
-        }
+) =
+    this.then(
+        SizeElement(
+            minWidth = minWidth,
+            minHeight = minHeight,
+            maxWidth = maxWidth,
+            maxHeight = maxHeight,
+            enforceIncoming = false,
+            inspectorInfo =
+                debugInspectorInfo {
+                    name = "requiredSizeIn"
+                    properties["minWidth"] = minWidth
+                    properties["minHeight"] = minHeight
+                    properties["maxWidth"] = maxWidth
+                    properties["maxHeight"] = maxHeight
+                }
+        )
     )
-)
 
 /**
  * Have the content fill (possibly only partially) the [Constraints.maxWidth] of the incoming
  * measurement constraints, by setting the [minimum width][Constraints.minWidth] and the
  * [maximum width][Constraints.maxWidth] to be equal to the [maximum width][Constraints.maxWidth]
- * multiplied by [fraction]. Note that, by default, the [fraction] is 1, so the modifier will
- * make the content fill the whole available width. If the incoming maximum width is
+ * multiplied by [fraction]. Note that, by default, the [fraction] is 1, so the modifier will make
+ * the content fill the whole available width. If the incoming maximum width is
  * [Constraints.Infinity] this modifier will have no effect.
  *
  * @param fraction The fraction of the maximum width to use, between `0` and `1`, inclusive.
  *
  * Example usage:
+ *
  * @sample androidx.compose.foundation.layout.samples.SimpleFillWidthModifier
+ *
  * @sample androidx.compose.foundation.layout.samples.FillHalfWidthModifier
  */
 @Stable
@@ -465,14 +480,16 @@
  * Have the content fill (possibly only partially) the [Constraints.maxHeight] of the incoming
  * measurement constraints, by setting the [minimum height][Constraints.minHeight] and the
  * [maximum height][Constraints.maxHeight] to be equal to the
- * [maximum height][Constraints.maxHeight] multiplied by [fraction]. Note that, by default,
- * the [fraction] is 1, so the modifier will make the content fill the whole available height.
- * If the incoming maximum height is [Constraints.Infinity] this modifier will have no effect.
+ * [maximum height][Constraints.maxHeight] multiplied by [fraction]. Note that, by default, the
+ * [fraction] is 1, so the modifier will make the content fill the whole available height. If the
+ * incoming maximum height is [Constraints.Infinity] this modifier will have no effect.
  *
  * @param fraction The fraction of the maximum height to use, between `0` and `1`, inclusive.
  *
  * Example usage:
+ *
  * @sample androidx.compose.foundation.layout.samples.SimpleFillHeightModifier
+ *
  * @sample androidx.compose.foundation.layout.samples.FillHalfHeightModifier
  */
 @Stable
@@ -484,19 +501,20 @@
 /**
  * Have the content fill (possibly only partially) the [Constraints.maxWidth] and
  * [Constraints.maxHeight] of the incoming measurement constraints, by setting the
- * [minimum width][Constraints.minWidth] and the [maximum width][Constraints.maxWidth] to be
- * equal to the [maximum width][Constraints.maxWidth] multiplied by [fraction], as well as
- * the [minimum height][Constraints.minHeight] and the [maximum height][Constraints.minHeight]
- * to be equal to the [maximum height][Constraints.maxHeight] multiplied by [fraction].
- * Note that, by default, the [fraction] is 1, so the modifier will make the content fill
- * the whole available space.
- * If the incoming maximum width or height is [Constraints.Infinity] this modifier will have no
- * effect in that dimension.
+ * [minimum width][Constraints.minWidth] and the [maximum width][Constraints.maxWidth] to be equal
+ * to the [maximum width][Constraints.maxWidth] multiplied by [fraction], as well as the
+ * [minimum height][Constraints.minHeight] and the [maximum height][Constraints.minHeight] to be
+ * equal to the [maximum height][Constraints.maxHeight] multiplied by [fraction]. Note that, by
+ * default, the [fraction] is 1, so the modifier will make the content fill the whole available
+ * space. If the incoming maximum width or height is [Constraints.Infinity] this modifier will have
+ * no effect in that dimension.
  *
  * @param fraction The fraction of the maximum size to use, between `0` and `1`, inclusive.
  *
  * Example usage:
+ *
  * @sample androidx.compose.foundation.layout.samples.SimpleFillModifier
+ *
  * @sample androidx.compose.foundation.layout.samples.FillHalfSizeModifier
  */
 @Stable
@@ -508,105 +526,103 @@
 /**
  * Allow the content to measure at its desired width without regard for the incoming measurement
  * [minimum width constraint][Constraints.minWidth], and, if [unbounded] is true, also without
- * regard for the incoming measurement [maximum width constraint][Constraints.maxWidth]. If
- * the content's measured size is smaller than the minimum width constraint, [align]
- * it within that minimum width space. If the content's measured size is larger than the maximum
- * width constraint (only possible when [unbounded] is true), [align] over the maximum
- * width space.
+ * regard for the incoming measurement [maximum width constraint][Constraints.maxWidth]. If the
+ * content's measured size is smaller than the minimum width constraint, [align] it within that
+ * minimum width space. If the content's measured size is larger than the maximum width constraint
+ * (only possible when [unbounded] is true), [align] over the maximum width space.
  *
  * Example usage:
+ *
  * @sample androidx.compose.foundation.layout.samples.SimpleWrapContentHorizontallyAlignedModifier
  */
 @Stable
 fun Modifier.wrapContentWidth(
     align: Alignment.Horizontal = Alignment.CenterHorizontally,
     unbounded: Boolean = false
-) = this.then(
-    if (align == Alignment.CenterHorizontally && !unbounded) {
-        WrapContentWidthCenter
-    } else if (align == Alignment.Start && !unbounded) {
-        WrapContentWidthStart
-    } else {
-        WrapContentElement.width(align, unbounded)
-    }
-)
+) =
+    this.then(
+        if (align == Alignment.CenterHorizontally && !unbounded) {
+            WrapContentWidthCenter
+        } else if (align == Alignment.Start && !unbounded) {
+            WrapContentWidthStart
+        } else {
+            WrapContentElement.width(align, unbounded)
+        }
+    )
 
-private val WrapContentWidthCenter =
-    WrapContentElement.width(Alignment.CenterHorizontally, false)
+private val WrapContentWidthCenter = WrapContentElement.width(Alignment.CenterHorizontally, false)
 private val WrapContentWidthStart = WrapContentElement.width(Alignment.Start, false)
 
 /**
  * Allow the content to measure at its desired height without regard for the incoming measurement
  * [minimum height constraint][Constraints.minHeight], and, if [unbounded] is true, also without
  * regard for the incoming measurement [maximum height constraint][Constraints.maxHeight]. If the
- * content's measured size is smaller than the minimum height constraint, [align] it within
- * that minimum height space. If the content's measured size is larger than the maximum height
- * constraint (only possible when [unbounded] is true), [align] over the maximum height space.
+ * content's measured size is smaller than the minimum height constraint, [align] it within that
+ * minimum height space. If the content's measured size is larger than the maximum height constraint
+ * (only possible when [unbounded] is true), [align] over the maximum height space.
  *
  * Example usage:
+ *
  * @sample androidx.compose.foundation.layout.samples.SimpleWrapContentVerticallyAlignedModifier
  */
 @Stable
 fun Modifier.wrapContentHeight(
     align: Alignment.Vertical = Alignment.CenterVertically,
     unbounded: Boolean = false
-) = this.then(
-    if (align == Alignment.CenterVertically && !unbounded) {
-        WrapContentHeightCenter
-    } else if (align == Alignment.Top && !unbounded) {
-        WrapContentHeightTop
-    } else {
-        WrapContentElement.height(align, unbounded)
-    }
-)
+) =
+    this.then(
+        if (align == Alignment.CenterVertically && !unbounded) {
+            WrapContentHeightCenter
+        } else if (align == Alignment.Top && !unbounded) {
+            WrapContentHeightTop
+        } else {
+            WrapContentElement.height(align, unbounded)
+        }
+    )
 
-private val WrapContentHeightCenter =
-    WrapContentElement.height(Alignment.CenterVertically, false)
+private val WrapContentHeightCenter = WrapContentElement.height(Alignment.CenterVertically, false)
 private val WrapContentHeightTop = WrapContentElement.height(Alignment.Top, false)
 
 /**
  * Allow the content to measure at its desired size without regard for the incoming measurement
  * [minimum width][Constraints.minWidth] or [minimum height][Constraints.minHeight] constraints,
- * and, if [unbounded] is true, also without regard for the incoming maximum constraints.
- * If the content's measured size is smaller than the minimum size constraint, [align] it
- * within that minimum sized space. If the content's measured size is larger than the maximum
- * size constraint (only possible when [unbounded] is true), [align] within the maximum space.
+ * and, if [unbounded] is true, also without regard for the incoming maximum constraints. If the
+ * content's measured size is smaller than the minimum size constraint, [align] it within that
+ * minimum sized space. If the content's measured size is larger than the maximum size constraint
+ * (only possible when [unbounded] is true), [align] within the maximum space.
  *
  * Example usage:
+ *
  * @sample androidx.compose.foundation.layout.samples.SimpleWrapContentAlignedModifier
  */
 @Stable
-fun Modifier.wrapContentSize(
-    align: Alignment = Alignment.Center,
-    unbounded: Boolean = false
-) = this.then(
-    if (align == Alignment.Center && !unbounded) {
-        WrapContentSizeCenter
-    } else if (align == Alignment.TopStart && !unbounded) {
-        WrapContentSizeTopStart
-    } else {
-        WrapContentElement.size(align, unbounded)
-    }
-)
+fun Modifier.wrapContentSize(align: Alignment = Alignment.Center, unbounded: Boolean = false) =
+    this.then(
+        if (align == Alignment.Center && !unbounded) {
+            WrapContentSizeCenter
+        } else if (align == Alignment.TopStart && !unbounded) {
+            WrapContentSizeTopStart
+        } else {
+            WrapContentElement.size(align, unbounded)
+        }
+    )
 
 private val WrapContentSizeCenter = WrapContentElement.size(Alignment.Center, false)
 private val WrapContentSizeTopStart = WrapContentElement.size(Alignment.TopStart, false)
 
 /**
- * Constrain the size of the wrapped layout only when it would be otherwise unconstrained:
- * the [minWidth] and [minHeight] constraints are only applied when the incoming corresponding
- * constraint is `0`.
- * The modifier can be used, for example, to define a default min size of a component,
- * while still allowing it to be overidden with smaller min sizes across usages.
+ * Constrain the size of the wrapped layout only when it would be otherwise unconstrained: the
+ * [minWidth] and [minHeight] constraints are only applied when the incoming corresponding
+ * constraint is `0`. The modifier can be used, for example, to define a default min size of a
+ * component, while still allowing it to be overidden with smaller min sizes across usages.
  *
  * Example usage:
+ *
  * @sample androidx.compose.foundation.layout.samples.DefaultMinSizeSample
  */
 @Stable
-fun Modifier.defaultMinSize(
-    minWidth: Dp = Dp.Unspecified,
-    minHeight: Dp = Dp.Unspecified
-) = this.then(UnspecifiedConstraintsElement(minWidth = minWidth, minHeight = minHeight))
+fun Modifier.defaultMinSize(minWidth: Dp = Dp.Unspecified, minHeight: Dp = Dp.Unspecified) =
+    this.then(UnspecifiedConstraintsElement(minWidth = minWidth, minHeight = minHeight))
 
 private class FillElement(
     private val direction: Direction,
@@ -644,32 +660,33 @@
     @Suppress("ModifierFactoryExtensionFunction", "ModifierFactoryReturnType")
     companion object {
         @Stable
-        fun width(fraction: Float) = FillElement(
-            direction = Direction.Horizontal,
-            fraction = fraction,
-            inspectorName = "fillMaxWidth"
-        )
+        fun width(fraction: Float) =
+            FillElement(
+                direction = Direction.Horizontal,
+                fraction = fraction,
+                inspectorName = "fillMaxWidth"
+            )
 
         @Stable
-        fun height(fraction: Float) = FillElement(
-            direction = Direction.Vertical,
-            fraction = fraction,
-            inspectorName = "fillMaxHeight"
-        )
+        fun height(fraction: Float) =
+            FillElement(
+                direction = Direction.Vertical,
+                fraction = fraction,
+                inspectorName = "fillMaxHeight"
+            )
 
         @Stable
-        fun size(fraction: Float) = FillElement(
-            direction = Direction.Both,
-            fraction = fraction,
-            inspectorName = "fillMaxSize"
-        )
+        fun size(fraction: Float) =
+            FillElement(
+                direction = Direction.Both,
+                fraction = fraction,
+                inspectorName = "fillMaxSize"
+            )
     }
 }
 
-private class FillNode(
-    var direction: Direction,
-    var fraction: Float
-) : LayoutModifierNode, Modifier.Node() {
+private class FillNode(var direction: Direction, var fraction: Float) :
+    LayoutModifierNode, Modifier.Node() {
     override fun MeasureScope.measure(
         measurable: Measurable,
         constraints: Constraints
@@ -677,8 +694,10 @@
         val minWidth: Int
         val maxWidth: Int
         if (constraints.hasBoundedWidth && direction != Direction.Vertical) {
-            val width = (constraints.maxWidth * fraction).fastRoundToInt()
-                .coerceIn(constraints.minWidth, constraints.maxWidth)
+            val width =
+                (constraints.maxWidth * fraction)
+                    .fastRoundToInt()
+                    .coerceIn(constraints.minWidth, constraints.maxWidth)
             minWidth = width
             maxWidth = width
         } else {
@@ -688,21 +707,19 @@
         val minHeight: Int
         val maxHeight: Int
         if (constraints.hasBoundedHeight && direction != Direction.Horizontal) {
-            val height = (constraints.maxHeight * fraction).fastRoundToInt()
-                .coerceIn(constraints.minHeight, constraints.maxHeight)
+            val height =
+                (constraints.maxHeight * fraction)
+                    .fastRoundToInt()
+                    .coerceIn(constraints.minHeight, constraints.maxHeight)
             minHeight = height
             maxHeight = height
         } else {
             minHeight = constraints.minHeight
             maxHeight = constraints.maxHeight
         }
-        val placeable = measurable.measure(
-            Constraints(minWidth, maxWidth, minHeight, maxHeight)
-        )
+        val placeable = measurable.measure(Constraints(minWidth, maxWidth, minHeight, maxHeight))
 
-        return layout(placeable.width, placeable.height) {
-            placeable.placeRelative(0, 0)
-        }
+        return layout(placeable.width, placeable.height) { placeable.placeRelative(0, 0) }
     }
 }
 
@@ -767,30 +784,34 @@
 ) : LayoutModifierNode, Modifier.Node() {
     private val Density.targetConstraints: Constraints
         get() {
-            val maxWidth = if (maxWidth != Dp.Unspecified) {
-                maxWidth.roundToPx().coerceAtLeast(0)
-            } else {
-                Constraints.Infinity
-            }
-            val maxHeight = if (maxHeight != Dp.Unspecified) {
-                maxHeight.roundToPx().coerceAtLeast(0)
-            } else {
-                Constraints.Infinity
-            }
-            val minWidth = if (minWidth != Dp.Unspecified) {
-                minWidth.roundToPx().coerceAtMost(maxWidth).coerceAtLeast(0).let {
-                    if (it != Constraints.Infinity) it else 0
+            val maxWidth =
+                if (maxWidth != Dp.Unspecified) {
+                    maxWidth.roundToPx().coerceAtLeast(0)
+                } else {
+                    Constraints.Infinity
                 }
-            } else {
-                0
-            }
-            val minHeight = if (minHeight != Dp.Unspecified) {
-                minHeight.roundToPx().coerceAtMost(maxHeight).coerceAtLeast(0).let {
-                    if (it != Constraints.Infinity) it else 0
+            val maxHeight =
+                if (maxHeight != Dp.Unspecified) {
+                    maxHeight.roundToPx().coerceAtLeast(0)
+                } else {
+                    Constraints.Infinity
                 }
-            } else {
-                0
-            }
+            val minWidth =
+                if (minWidth != Dp.Unspecified) {
+                    minWidth.roundToPx().coerceAtMost(maxWidth).coerceAtLeast(0).let {
+                        if (it != Constraints.Infinity) it else 0
+                    }
+                } else {
+                    0
+                }
+            val minHeight =
+                if (minHeight != Dp.Unspecified) {
+                    minHeight.roundToPx().coerceAtMost(maxHeight).coerceAtLeast(0).let {
+                        if (it != Constraints.Infinity) it else 0
+                    }
+                } else {
+                    0
+                }
             return Constraints(
                 minWidth = minWidth,
                 minHeight = minHeight,
@@ -803,42 +824,45 @@
         measurable: Measurable,
         constraints: Constraints
     ): MeasureResult {
-        val wrappedConstraints = targetConstraints.let { targetConstraints ->
-            if (enforceIncoming) {
-                constraints.constrain(targetConstraints)
-            } else {
-                val resolvedMinWidth = if (minWidth != Dp.Unspecified) {
-                    targetConstraints.minWidth
+        val wrappedConstraints =
+            targetConstraints.let { targetConstraints ->
+                if (enforceIncoming) {
+                    constraints.constrain(targetConstraints)
                 } else {
-                    constraints.minWidth.coerceAtMost(targetConstraints.maxWidth)
+                    val resolvedMinWidth =
+                        if (minWidth != Dp.Unspecified) {
+                            targetConstraints.minWidth
+                        } else {
+                            constraints.minWidth.coerceAtMost(targetConstraints.maxWidth)
+                        }
+                    val resolvedMaxWidth =
+                        if (maxWidth != Dp.Unspecified) {
+                            targetConstraints.maxWidth
+                        } else {
+                            constraints.maxWidth.coerceAtLeast(targetConstraints.minWidth)
+                        }
+                    val resolvedMinHeight =
+                        if (minHeight != Dp.Unspecified) {
+                            targetConstraints.minHeight
+                        } else {
+                            constraints.minHeight.coerceAtMost(targetConstraints.maxHeight)
+                        }
+                    val resolvedMaxHeight =
+                        if (maxHeight != Dp.Unspecified) {
+                            targetConstraints.maxHeight
+                        } else {
+                            constraints.maxHeight.coerceAtLeast(targetConstraints.minHeight)
+                        }
+                    Constraints(
+                        resolvedMinWidth,
+                        resolvedMaxWidth,
+                        resolvedMinHeight,
+                        resolvedMaxHeight
+                    )
                 }
-                val resolvedMaxWidth = if (maxWidth != Dp.Unspecified) {
-                    targetConstraints.maxWidth
-                } else {
-                    constraints.maxWidth.coerceAtLeast(targetConstraints.minWidth)
-                }
-                val resolvedMinHeight = if (minHeight != Dp.Unspecified) {
-                    targetConstraints.minHeight
-                } else {
-                    constraints.minHeight.coerceAtMost(targetConstraints.maxHeight)
-                }
-                val resolvedMaxHeight = if (maxHeight != Dp.Unspecified) {
-                    targetConstraints.maxHeight
-                } else {
-                    constraints.maxHeight.coerceAtLeast(targetConstraints.minHeight)
-                }
-                Constraints(
-                    resolvedMinWidth,
-                    resolvedMaxWidth,
-                    resolvedMinHeight,
-                    resolvedMaxHeight
-                )
             }
-        }
         val placeable = measurable.measure(wrappedConstraints)
-        return layout(placeable.width, placeable.height) {
-            placeable.placeRelative(0, 0)
-        }
+        return layout(placeable.width, placeable.height) { placeable.placeRelative(0, 0) }
     }
 
     override fun IntrinsicMeasureScope.minIntrinsicWidth(
@@ -897,11 +921,8 @@
     private val align: Any, // only used for equals and hashcode
     private val inspectorName: String
 ) : ModifierNodeElement<WrapContentNode>() {
-    override fun create(): WrapContentNode = WrapContentNode(
-        direction,
-        unbounded,
-        alignmentCallback
-    )
+    override fun create(): WrapContentNode =
+        WrapContentNode(direction, unbounded, alignmentCallback)
 
     override fun update(node: WrapContentNode) {
         node.direction = direction
@@ -939,46 +960,38 @@
     @Suppress("ModifierFactoryExtensionFunction", "ModifierFactoryReturnType")
     companion object {
         @Stable
-        fun width(
-            align: Alignment.Horizontal,
-            unbounded: Boolean
-        ) = WrapContentElement(
-            direction = Direction.Horizontal,
-            unbounded = unbounded,
-            alignmentCallback = { size, layoutDirection ->
-                IntOffset(align.align(0, size.width, layoutDirection), 0)
-            },
-            align,
-            inspectorName = "wrapContentWidth"
-        )
+        fun width(align: Alignment.Horizontal, unbounded: Boolean) =
+            WrapContentElement(
+                direction = Direction.Horizontal,
+                unbounded = unbounded,
+                alignmentCallback = { size, layoutDirection ->
+                    IntOffset(align.align(0, size.width, layoutDirection), 0)
+                },
+                align,
+                inspectorName = "wrapContentWidth"
+            )
 
         @Stable
-        fun height(
-            align: Alignment.Vertical,
-            unbounded: Boolean
-        ) = WrapContentElement(
-            direction = Direction.Vertical,
-            unbounded = unbounded,
-            alignmentCallback = { size, _ ->
-                IntOffset(0, align.align(0, size.height))
-            },
-            align,
-            inspectorName = "wrapContentHeight"
-        )
+        fun height(align: Alignment.Vertical, unbounded: Boolean) =
+            WrapContentElement(
+                direction = Direction.Vertical,
+                unbounded = unbounded,
+                alignmentCallback = { size, _ -> IntOffset(0, align.align(0, size.height)) },
+                align,
+                inspectorName = "wrapContentHeight"
+            )
 
         @Stable
-        fun size(
-            align: Alignment,
-            unbounded: Boolean
-        ) = WrapContentElement(
-            direction = Direction.Both,
-            unbounded = unbounded,
-            alignmentCallback = { size, layoutDirection ->
-                align.align(IntSize.Zero, size, layoutDirection)
-            },
-            align,
-            inspectorName = "wrapContentSize"
-        )
+        fun size(align: Alignment, unbounded: Boolean) =
+            WrapContentElement(
+                direction = Direction.Both,
+                unbounded = unbounded,
+                alignmentCallback = { size, layoutDirection ->
+                    align.align(IntSize.Zero, size, layoutDirection)
+                },
+                align,
+                inspectorName = "wrapContentSize"
+            )
     }
 }
 
@@ -991,31 +1004,32 @@
         measurable: Measurable,
         constraints: Constraints
     ): MeasureResult {
-        val wrappedConstraints = Constraints(
-            minWidth = if (direction != Direction.Vertical) 0 else constraints.minWidth,
-            minHeight = if (direction != Direction.Horizontal) 0 else constraints.minHeight,
-            maxWidth = if (direction != Direction.Vertical && unbounded) {
-                Constraints.Infinity
-            } else {
-                constraints.maxWidth
-            },
-            maxHeight = if (direction != Direction.Horizontal && unbounded) {
-                Constraints.Infinity
-            } else {
-                constraints.maxHeight
-            }
-        )
+        val wrappedConstraints =
+            Constraints(
+                minWidth = if (direction != Direction.Vertical) 0 else constraints.minWidth,
+                minHeight = if (direction != Direction.Horizontal) 0 else constraints.minHeight,
+                maxWidth =
+                    if (direction != Direction.Vertical && unbounded) {
+                        Constraints.Infinity
+                    } else {
+                        constraints.maxWidth
+                    },
+                maxHeight =
+                    if (direction != Direction.Horizontal && unbounded) {
+                        Constraints.Infinity
+                    } else {
+                        constraints.maxHeight
+                    }
+            )
         val placeable = measurable.measure(wrappedConstraints)
         val wrapperWidth = placeable.width.coerceIn(constraints.minWidth, constraints.maxWidth)
         val wrapperHeight = placeable.height.coerceIn(constraints.minHeight, constraints.maxHeight)
-        return layout(
-            wrapperWidth,
-            wrapperHeight
-        ) {
-            val position = alignmentCallback(
-                IntSize(wrapperWidth - placeable.width, wrapperHeight - placeable.height),
-                layoutDirection
-            )
+        return layout(wrapperWidth, wrapperHeight) {
+            val position =
+                alignmentCallback(
+                    IntSize(wrapperWidth - placeable.width, wrapperHeight - placeable.height),
+                    layoutDirection
+                )
             placeable.place(position)
         }
     }
@@ -1025,10 +1039,8 @@
     val minWidth: Dp = Dp.Unspecified,
     val minHeight: Dp = Dp.Unspecified,
 ) : ModifierNodeElement<UnspecifiedConstraintsNode>() {
-    override fun create(): UnspecifiedConstraintsNode = UnspecifiedConstraintsNode(
-        minWidth = minWidth,
-        minHeight = minHeight
-    )
+    override fun create(): UnspecifiedConstraintsNode =
+        UnspecifiedConstraintsNode(minWidth = minWidth, minHeight = minHeight)
 
     override fun update(node: UnspecifiedConstraintsNode) {
         node.minWidth = minWidth
@@ -1057,55 +1069,60 @@
         measurable: Measurable,
         constraints: Constraints
     ): MeasureResult {
-        val wrappedConstraints = Constraints(
-            if (minWidth != Dp.Unspecified && constraints.minWidth == 0) {
-                minWidth.roundToPx().coerceAtMost(constraints.maxWidth).coerceAtLeast(0)
-            } else {
-                constraints.minWidth
-            },
-            constraints.maxWidth,
-            if (minHeight != Dp.Unspecified && constraints.minHeight == 0) {
-                minHeight.roundToPx().coerceAtMost(constraints.maxHeight).coerceAtLeast(0)
-            } else {
-                constraints.minHeight
-            },
-            constraints.maxHeight
-        )
+        val wrappedConstraints =
+            Constraints(
+                if (minWidth != Dp.Unspecified && constraints.minWidth == 0) {
+                    minWidth.roundToPx().coerceAtMost(constraints.maxWidth).coerceAtLeast(0)
+                } else {
+                    constraints.minWidth
+                },
+                constraints.maxWidth,
+                if (minHeight != Dp.Unspecified && constraints.minHeight == 0) {
+                    minHeight.roundToPx().coerceAtMost(constraints.maxHeight).coerceAtLeast(0)
+                } else {
+                    constraints.minHeight
+                },
+                constraints.maxHeight
+            )
         val placeable = measurable.measure(wrappedConstraints)
-        return layout(placeable.width, placeable.height) {
-            placeable.placeRelative(0, 0)
-        }
+        return layout(placeable.width, placeable.height) { placeable.placeRelative(0, 0) }
     }
 
     override fun IntrinsicMeasureScope.minIntrinsicWidth(
         measurable: IntrinsicMeasurable,
         height: Int
-    ) = measurable.minIntrinsicWidth(height).coerceAtLeast(
-        if (minWidth != Dp.Unspecified) minWidth.roundToPx() else 0
-    )
+    ) =
+        measurable
+            .minIntrinsicWidth(height)
+            .coerceAtLeast(if (minWidth != Dp.Unspecified) minWidth.roundToPx() else 0)
 
     override fun IntrinsicMeasureScope.maxIntrinsicWidth(
         measurable: IntrinsicMeasurable,
         height: Int
-    ) = measurable.maxIntrinsicWidth(height).coerceAtLeast(
-        if (minWidth != Dp.Unspecified) minWidth.roundToPx() else 0
-    )
+    ) =
+        measurable
+            .maxIntrinsicWidth(height)
+            .coerceAtLeast(if (minWidth != Dp.Unspecified) minWidth.roundToPx() else 0)
 
     override fun IntrinsicMeasureScope.minIntrinsicHeight(
         measurable: IntrinsicMeasurable,
         width: Int
-    ) = measurable.minIntrinsicHeight(width).coerceAtLeast(
-        if (minHeight != Dp.Unspecified) minHeight.roundToPx() else 0
-    )
+    ) =
+        measurable
+            .minIntrinsicHeight(width)
+            .coerceAtLeast(if (minHeight != Dp.Unspecified) minHeight.roundToPx() else 0)
 
     override fun IntrinsicMeasureScope.maxIntrinsicHeight(
         measurable: IntrinsicMeasurable,
         width: Int
-    ) = measurable.maxIntrinsicHeight(width).coerceAtLeast(
-        if (minHeight != Dp.Unspecified) minHeight.roundToPx() else 0
-    )
+    ) =
+        measurable
+            .maxIntrinsicHeight(width)
+            .coerceAtLeast(if (minHeight != Dp.Unspecified) minHeight.roundToPx() else 0)
 }
 
 internal enum class Direction {
-    Vertical, Horizontal, Both
+    Vertical,
+    Horizontal,
+    Both
 }
diff --git a/compose/foundation/foundation-layout/src/commonMain/kotlin/androidx/compose/foundation/layout/WindowInsets.kt b/compose/foundation/foundation-layout/src/commonMain/kotlin/androidx/compose/foundation/layout/WindowInsets.kt
index 3ba8eb0..d5049ca 100644
--- a/compose/foundation/foundation-layout/src/commonMain/kotlin/androidx/compose/foundation/layout/WindowInsets.kt
+++ b/compose/foundation/foundation-layout/src/commonMain/kotlin/androidx/compose/foundation/layout/WindowInsets.kt
@@ -31,44 +31,34 @@
 import androidx.compose.ui.unit.dp
 
 /**
- * A representation of window insets that tracks access to enable recomposition,
- * relayout, and redrawing when values change. These values should not be read during composition
- * to avoid doing composition for every frame of an animation. Use methods like
- * [Modifier.windowInsetsPadding], [Modifier.systemBarsPadding], and
- * [Modifier.windowInsetsTopHeight] for Modifiers that will not cause recomposition when values
- * change.
+ * A representation of window insets that tracks access to enable recomposition, relayout, and
+ * redrawing when values change. These values should not be read during composition to avoid doing
+ * composition for every frame of an animation. Use methods like [Modifier.windowInsetsPadding],
+ * [Modifier.systemBarsPadding], and [Modifier.windowInsetsTopHeight] for Modifiers that will not
+ * cause recomposition when values change.
  *
- * Use the [WindowInsets.Companion] extensions to retrieve [WindowInsets] for the current
- * window.
+ * Use the [WindowInsets.Companion] extensions to retrieve [WindowInsets] for the current window.
  */
 @Stable
 interface WindowInsets {
-    /**
-     * The space, in pixels, at the left of the window that the inset represents.
-     */
+    /** The space, in pixels, at the left of the window that the inset represents. */
     fun getLeft(density: Density, layoutDirection: LayoutDirection): Int
 
-    /**
-     * The space, in pixels, at the top of the window that the inset represents.
-     */
+    /** The space, in pixels, at the top of the window that the inset represents. */
     fun getTop(density: Density): Int
 
-    /**
-     * The space, in pixels, at the right of the window that the inset represents.
-     */
+    /** The space, in pixels, at the right of the window that the inset represents. */
     fun getRight(density: Density, layoutDirection: LayoutDirection): Int
 
-    /**
-     * The space, in pixels, at the bottom of the window that the inset represents.
-     */
+    /** The space, in pixels, at the bottom of the window that the inset represents. */
     fun getBottom(density: Density): Int
 
     companion object
 }
 
 /**
- * A [WindowInsets] whose values can change without changing the instance. This is useful
- * to avoid recomposition when [WindowInsets] can change.
+ * A [WindowInsets] whose values can change without changing the instance. This is useful to avoid
+ * recomposition when [WindowInsets] can change.
  *
  * @sample androidx.compose.foundation.layout.samples.withConsumedInsetsSample
  *
@@ -77,8 +67,8 @@
 @ExperimentalLayoutApi
 class MutableWindowInsets(initialInsets: WindowInsets = WindowInsets(0, 0, 0, 0)) : WindowInsets {
     /**
-     * The [WindowInsets] that are used for [left][getLeft], [top][getTop], [right][getRight],
-     * and [bottom][getBottom] values.
+     * The [WindowInsets] that are used for [left][getLeft], [top][getTop], [right][getRight], and
+     * [bottom][getBottom] values.
      */
     var insets by mutableStateOf(initialInsets)
 
@@ -94,20 +84,16 @@
 }
 
 /**
- * [WindowInsetsSides] is used in [WindowInsets.only] to define which sides of the
- * [WindowInsets] should apply.
+ * [WindowInsetsSides] is used in [WindowInsets.only] to define which sides of the [WindowInsets]
+ * should apply.
  */
 @kotlin.jvm.JvmInline
 value class WindowInsetsSides private constructor(private val value: Int) {
-    /**
-     * Returns a [WindowInsetsSides] containing sides defied in [sides] and the
-     * sides in `this`.
-     */
+    /** Returns a [WindowInsetsSides] containing sides defied in [sides] and the sides in `this`. */
     operator fun plus(sides: WindowInsetsSides): WindowInsetsSides =
         WindowInsetsSides(value or sides.value)
 
-    internal fun hasAny(sides: WindowInsetsSides): Boolean =
-        (value and sides.value) != 0
+    internal fun hasAny(sides: WindowInsetsSides): Boolean = (value and sides.value) != 0
 
     override fun toString(): String = "WindowInsetsSides(${valueToString()})"
 
@@ -148,68 +134,59 @@
         internal val AllowRightInRtl = WindowInsetsSides(1 shl 0)
 
         /**
-         * Indicates a [WindowInsets] start side, which is left or right
-         * depending on [LayoutDirection]. If [LayoutDirection.Ltr], [Start]
-         * is the left side. If [LayoutDirection.Rtl], [Start] is the right side.
+         * Indicates a [WindowInsets] start side, which is left or right depending on
+         * [LayoutDirection]. If [LayoutDirection.Ltr], [Start] is the left side. If
+         * [LayoutDirection.Rtl], [Start] is the right side.
          *
          * Use [Left] or [Right] if the physical direction is required.
          */
         val Start = AllowLeftInLtr + AllowRightInRtl
 
         /**
-         * Indicates a [WindowInsets] end side, which is left or right
-         * depending on [LayoutDirection]. If [LayoutDirection.Ltr], [End]
-         * is the right side. If [LayoutDirection.Rtl], [End] is the left side.
+         * Indicates a [WindowInsets] end side, which is left or right depending on
+         * [LayoutDirection]. If [LayoutDirection.Ltr], [End] is the right side. If
+         * [LayoutDirection.Rtl], [End] is the left side.
          *
          * Use [Left] or [Right] if the physical direction is required.
          */
         val End = AllowRightInLtr + AllowLeftInRtl
 
-        /**
-         * Indicates a [WindowInsets] top side.
-         */
+        /** Indicates a [WindowInsets] top side. */
         val Top = WindowInsetsSides(1 shl 4)
 
-        /**
-         * Indicates a [WindowInsets] bottom side.
-         */
+        /** Indicates a [WindowInsets] bottom side. */
         val Bottom = WindowInsetsSides(1 shl 5)
 
         /**
-         * Indicates a [WindowInsets] left side. Most layouts will prefer using
-         * [Start] or [End] to account for [LayoutDirection].
+         * Indicates a [WindowInsets] left side. Most layouts will prefer using [Start] or [End] to
+         * account for [LayoutDirection].
          */
         val Left = AllowLeftInLtr + AllowLeftInRtl
 
         /**
-         * Indicates a [WindowInsets] right side. Most layouts will prefer using
-         * [Start] or [End] to account for [LayoutDirection].
+         * Indicates a [WindowInsets] right side. Most layouts will prefer using [Start] or [End] to
+         * account for [LayoutDirection].
          */
         val Right = AllowRightInLtr + AllowRightInRtl
 
         /**
-         * Indicates a [WindowInsets] horizontal sides. This is a combination of
-         * [Left] and [Right] sides, or [Start] and [End] sides.
+         * Indicates a [WindowInsets] horizontal sides. This is a combination of [Left] and [Right]
+         * sides, or [Start] and [End] sides.
          */
         val Horizontal = Left + Right
 
-        /**
-         * Indicates a [WindowInsets] [Top] and [Bottom] sides.
-         */
+        /** Indicates a [WindowInsets] [Top] and [Bottom] sides. */
         val Vertical = Top + Bottom
     }
 }
 
-/**
- * Returns a [WindowInsets] that has the maximum values of this [WindowInsets] and [insets].
- */
+/** Returns a [WindowInsets] that has the maximum values of this [WindowInsets] and [insets]. */
 fun WindowInsets.union(insets: WindowInsets): WindowInsets = UnionInsets(this, insets)
 
 /**
  * Returns the values in this [WindowInsets] that are not also in [insets]. For example, if this
- * [WindowInsets] has a [WindowInsets.getTop] value of `10` and [insets] has a
- * [WindowInsets.getTop] value of `8`, the returned [WindowInsets] will have a
- * [WindowInsets.getTop] value of `2`.
+ * [WindowInsets] has a [WindowInsets.getTop] value of `10` and [insets] has a [WindowInsets.getTop]
+ * value of `8`, the returned [WindowInsets] will have a [WindowInsets.getTop] value of `2`.
  *
  * Negative values are never returned. For example if [insets] has a [WindowInsets.getTop] of `10`
  * and this has a [WindowInsets.getTop] of `0`, the returned [WindowInsets] will have a
@@ -218,23 +195,22 @@
 fun WindowInsets.exclude(insets: WindowInsets): WindowInsets = ExcludeInsets(this, insets)
 
 /**
- * Returns a [WindowInsets] that has values of this, added to the values of [insets].
- * For example, if this has a top of 10 and insets has a top of 5, the returned [WindowInsets]
- * will have a top of 15.
+ * Returns a [WindowInsets] that has values of this, added to the values of [insets]. For example,
+ * if this has a top of 10 and insets has a top of 5, the returned [WindowInsets] will have a top
+ * of 15.
  */
 fun WindowInsets.add(insets: WindowInsets): WindowInsets = AddedInsets(this, insets)
 
 /**
- * Returns a [WindowInsets] that eliminates all dimensions except the ones that are enabled.
- * For example, to have a [WindowInsets] at the bottom of the screen, pass
- * [WindowInsetsSides.Bottom].
+ * Returns a [WindowInsets] that eliminates all dimensions except the ones that are enabled. For
+ * example, to have a [WindowInsets] at the bottom of the screen, pass [WindowInsetsSides.Bottom].
  */
 fun WindowInsets.only(sides: WindowInsetsSides): WindowInsets = LimitInsets(this, sides)
 
 /**
- * Convert a [WindowInsets] to a [PaddingValues] and uses [LocalDensity] for DP to pixel
- * conversion. [PaddingValues] can be passed to some containers to pad internal content so that
- * it doesn't overlap the insets when fully scrolled. Ensure that the insets are
+ * Convert a [WindowInsets] to a [PaddingValues] and uses [LocalDensity] for DP to pixel conversion.
+ * [PaddingValues] can be passed to some containers to pad internal content so that it doesn't
+ * overlap the insets when fully scrolled. Ensure that the insets are
  * [consumed][consumeWindowInsets] after the padding is applied if insets are to be used further
  * down the hierarchy.
  *
@@ -256,9 +232,7 @@
 fun WindowInsets.asPaddingValues(density: Density): PaddingValues =
     InsetsPaddingValues(this, density)
 
-/**
- * Convert a [PaddingValues] to a [WindowInsets].
- */
+/** Convert a [PaddingValues] to a [WindowInsets]. */
 internal fun PaddingValues.asInsets(): WindowInsets = PaddingValuesInsets(this)
 
 /**
@@ -289,8 +263,11 @@
     private val bottomVal: Int
 ) : WindowInsets {
     override fun getLeft(density: Density, layoutDirection: LayoutDirection): Int = leftVal
+
     override fun getTop(density: Density): Int = topVal
+
     override fun getRight(density: Density, layoutDirection: LayoutDirection): Int = rightVal
+
     override fun getBottom(density: Density): Int = bottomVal
 
     override fun toString(): String {
@@ -305,8 +282,10 @@
             return false
         }
 
-        return leftVal == other.leftVal && topVal == other.topVal &&
-            rightVal == other.rightVal && bottomVal == other.bottomVal
+        return leftVal == other.leftVal &&
+            topVal == other.topVal &&
+            rightVal == other.rightVal &&
+            bottomVal == other.bottomVal
     }
 
     override fun hashCode(): Int {
@@ -329,8 +308,10 @@
         with(density) { leftDp.roundToPx() }
 
     override fun getTop(density: Density) = with(density) { topDp.roundToPx() }
+
     override fun getRight(density: Density, layoutDirection: LayoutDirection) =
         with(density) { rightDp.roundToPx() }
+
     override fun getBottom(density: Density) = with(density) { bottomDp.roundToPx() }
 
     override fun toString(): String {
@@ -345,8 +326,10 @@
             return false
         }
 
-        return leftDp == other.leftDp && topDp == other.topDp &&
-            rightDp == other.rightDp && bottomDp == other.bottomDp
+        return leftDp == other.leftDp &&
+            topDp == other.topDp &&
+            rightDp == other.rightDp &&
+            bottomDp == other.bottomDp
     }
 
     override fun hashCode(): Int {
@@ -359,16 +342,19 @@
 }
 
 /**
- * An [WindowInsets] that comes straight from [androidx.core.graphics.Insets], whose value can
- * be updated.
+ * An [WindowInsets] that comes straight from [androidx.core.graphics.Insets], whose value can be
+ * updated.
  */
 @Stable
 internal class ValueInsets(insets: InsetsValues, val name: String) : WindowInsets {
     internal var value by mutableStateOf(insets)
 
     override fun getLeft(density: Density, layoutDirection: LayoutDirection): Int = value.left
+
     override fun getTop(density: Density) = value.top
+
     override fun getRight(density: Density, layoutDirection: LayoutDirection) = value.right
+
     override fun getBottom(density: Density) = value.bottom
 
     override fun equals(other: Any?): Boolean {
@@ -424,15 +410,12 @@
  * [WindowInsets.union].
  */
 @Stable
-private class UnionInsets(
-    private val first: WindowInsets,
-    private val second: WindowInsets
-) : WindowInsets {
+private class UnionInsets(private val first: WindowInsets, private val second: WindowInsets) :
+    WindowInsets {
     override fun getLeft(density: Density, layoutDirection: LayoutDirection) =
         maxOf(first.getLeft(density, layoutDirection), second.getLeft(density, layoutDirection))
 
-    override fun getTop(density: Density) =
-        maxOf(first.getTop(density), second.getTop(density))
+    override fun getTop(density: Density) = maxOf(first.getTop(density), second.getTop(density))
 
     override fun getRight(density: Density, layoutDirection: LayoutDirection) =
         maxOf(first.getRight(density, layoutDirection), second.getRight(density, layoutDirection))
@@ -455,25 +438,19 @@
     override fun toString(): String = "($first ∪ $second)"
 }
 
-/**
- * An [WindowInsets] that includes the added value of [first] to [second].
- */
+/** An [WindowInsets] that includes the added value of [first] to [second]. */
 @Stable
-private class AddedInsets(
-    private val first: WindowInsets,
-    private val second: WindowInsets
-) : WindowInsets {
+private class AddedInsets(private val first: WindowInsets, private val second: WindowInsets) :
+    WindowInsets {
     override fun getLeft(density: Density, layoutDirection: LayoutDirection) =
         first.getLeft(density, layoutDirection) + second.getLeft(density, layoutDirection)
 
-    override fun getTop(density: Density) =
-        first.getTop(density) + second.getTop(density)
+    override fun getTop(density: Density) = first.getTop(density) + second.getTop(density)
 
     override fun getRight(density: Density, layoutDirection: LayoutDirection) =
         first.getRight(density, layoutDirection) + second.getRight(density, layoutDirection)
 
-    override fun getBottom(density: Density) =
-        first.getBottom(density) + second.getBottom(density)
+    override fun getBottom(density: Density) = first.getBottom(density) + second.getBottom(density)
 
     override fun hashCode(): Int = first.hashCode() + second.hashCode() * 31
 
@@ -529,26 +506,20 @@
     override fun hashCode(): Int = 31 * included.hashCode() + excluded.hashCode()
 }
 
-/**
- * An [WindowInsets] calculated from [paddingValues].
- */
+/** An [WindowInsets] calculated from [paddingValues]. */
 @Stable
 private class PaddingValuesInsets(private val paddingValues: PaddingValues) : WindowInsets {
-    override fun getLeft(density: Density, layoutDirection: LayoutDirection) = with(density) {
-        paddingValues.calculateLeftPadding(layoutDirection).roundToPx()
-    }
+    override fun getLeft(density: Density, layoutDirection: LayoutDirection) =
+        with(density) { paddingValues.calculateLeftPadding(layoutDirection).roundToPx() }
 
-    override fun getTop(density: Density) = with(density) {
-        paddingValues.calculateTopPadding().roundToPx()
-    }
+    override fun getTop(density: Density) =
+        with(density) { paddingValues.calculateTopPadding().roundToPx() }
 
-    override fun getRight(density: Density, layoutDirection: LayoutDirection) = with(density) {
-        paddingValues.calculateRightPadding(layoutDirection).roundToPx()
-    }
+    override fun getRight(density: Density, layoutDirection: LayoutDirection) =
+        with(density) { paddingValues.calculateRightPadding(layoutDirection).roundToPx() }
 
-    override fun getBottom(density: Density) = with(density) {
-        paddingValues.calculateBottomPadding().roundToPx()
-    }
+    override fun getBottom(density: Density) =
+        with(density) { paddingValues.calculateBottomPadding().roundToPx() }
 
     override fun toString(): String {
         val layoutDirection = LayoutDirection.Ltr
@@ -574,16 +545,14 @@
 }
 
 @Stable
-private class LimitInsets(
-    val insets: WindowInsets,
-    val sides: WindowInsetsSides
-) : WindowInsets {
+private class LimitInsets(val insets: WindowInsets, val sides: WindowInsetsSides) : WindowInsets {
     override fun getLeft(density: Density, layoutDirection: LayoutDirection): Int {
-        val layoutDirectionSide = if (layoutDirection == LayoutDirection.Ltr) {
-            WindowInsetsSides.AllowLeftInLtr
-        } else {
-            WindowInsetsSides.AllowLeftInRtl
-        }
+        val layoutDirectionSide =
+            if (layoutDirection == LayoutDirection.Ltr) {
+                WindowInsetsSides.AllowLeftInLtr
+            } else {
+                WindowInsetsSides.AllowLeftInRtl
+            }
         val allowLeft = sides.hasAny(layoutDirectionSide)
         return if (allowLeft) {
             insets.getLeft(density, layoutDirection)
@@ -596,11 +565,12 @@
         if (sides.hasAny(WindowInsetsSides.Top)) insets.getTop(density) else 0
 
     override fun getRight(density: Density, layoutDirection: LayoutDirection): Int {
-        val layoutDirectionSide = if (layoutDirection == LayoutDirection.Ltr) {
-            WindowInsetsSides.AllowRightInLtr
-        } else {
-            WindowInsetsSides.AllowRightInRtl
-        }
+        val layoutDirectionSide =
+            if (layoutDirection == LayoutDirection.Ltr) {
+                WindowInsetsSides.AllowRightInLtr
+            } else {
+                WindowInsetsSides.AllowRightInRtl
+            }
         val allowRight = sides.hasAny(layoutDirectionSide)
         return if (allowRight) {
             insets.getRight(density, layoutDirection)
@@ -619,8 +589,7 @@
         if (other !is LimitInsets) {
             return false
         }
-        return insets == other.insets &&
-            sides == other.sides
+        return insets == other.insets && sides == other.sides
     }
 
     override fun hashCode(): Int {
@@ -633,25 +602,17 @@
 }
 
 @Stable
-private class InsetsPaddingValues(
-    val insets: WindowInsets,
-    private val density: Density
-) : PaddingValues {
-    override fun calculateLeftPadding(layoutDirection: LayoutDirection) = with(density) {
-        insets.getLeft(this, layoutDirection).toDp()
-    }
+private class InsetsPaddingValues(val insets: WindowInsets, private val density: Density) :
+    PaddingValues {
+    override fun calculateLeftPadding(layoutDirection: LayoutDirection) =
+        with(density) { insets.getLeft(this, layoutDirection).toDp() }
 
-    override fun calculateTopPadding() = with(density) {
-        insets.getTop(this).toDp()
-    }
+    override fun calculateTopPadding() = with(density) { insets.getTop(this).toDp() }
 
-    override fun calculateRightPadding(layoutDirection: LayoutDirection) = with(density) {
-        insets.getRight(this, layoutDirection).toDp()
-    }
+    override fun calculateRightPadding(layoutDirection: LayoutDirection) =
+        with(density) { insets.getRight(this, layoutDirection).toDp() }
 
-    override fun calculateBottomPadding() = with(density) {
-        insets.getBottom(this).toDp()
-    }
+    override fun calculateBottomPadding() = with(density) { insets.getBottom(this).toDp() }
 
     override fun toString(): String {
         return "InsetsPaddingValues(insets=$insets, density=$density)"
@@ -674,19 +635,13 @@
     }
 }
 
-/**
- * An insets type representing the window of a caption bar.
- */
+/** An insets type representing the window of a caption bar. */
 expect val WindowInsets.Companion.captionBar: WindowInsets
 
-/**
- * This [WindowInsets] represents the area with the display cutout (e.g. for camera).
- */
+/** This [WindowInsets] represents the area with the display cutout (e.g. for camera). */
 expect val WindowInsets.Companion.displayCutout: WindowInsets
 
-/**
- * An insets type representing the window of the software keyboard.
- */
+/** An insets type representing the window of the software keyboard. */
 expect val WindowInsets.Companion.ime: WindowInsets
 
 /**
@@ -695,53 +650,47 @@
 expect val WindowInsets.Companion.mandatorySystemGestures: WindowInsets
 
 /**
- * These insets represent where system UI places navigation bars.
- * Interactive UI should avoid the navigation bars area.
+ * These insets represent where system UI places navigation bars. Interactive UI should avoid the
+ * navigation bars area.
  */
 expect val WindowInsets.Companion.navigationBars: WindowInsets
 
-/**
- * These insets represent status bar.
- */
+/** These insets represent status bar. */
 expect val WindowInsets.Companion.statusBars: WindowInsets
 
 /**
- * These insets represent all system bars.
- * Includes [statusBars], [captionBar] as well as [navigationBars], but not [ime].
+ * These insets represent all system bars. Includes [statusBars], [captionBar] as well as
+ * [navigationBars], but not [ime].
  */
 expect val WindowInsets.Companion.systemBars: WindowInsets
 
 /**
- * The [systemGestures] insets represent the area of a window where system gestures have
- * priority and may consume some or all touch input, e.g. due to the system bar
- * occupying it, or it being reserved for touch-only gestures.
+ * The [systemGestures] insets represent the area of a window where system gestures have priority
+ * and may consume some or all touch input, e.g. due to the system bar occupying it, or it being
+ * reserved for touch-only gestures.
  */
 expect val WindowInsets.Companion.systemGestures: WindowInsets
 
-/**
- * Returns the tappable element insets.
- */
+/** Returns the tappable element insets. */
 expect val WindowInsets.Companion.tappableElement: WindowInsets
 
-/**
- * The insets for the curved areas in a waterfall display.
- */
+/** The insets for the curved areas in a waterfall display. */
 expect val WindowInsets.Companion.waterfall: WindowInsets
 
 /**
- * The insets that include areas where content may be covered by other drawn content.
- * This includes all [systemBars], [displayCutout], and [ime].
+ * The insets that include areas where content may be covered by other drawn content. This includes
+ * all [systemBars], [displayCutout], and [ime].
  */
 expect val WindowInsets.Companion.safeDrawing: WindowInsets
 
 /**
- * The insets that include areas where gestures may be confused with other input,
- * including [systemGestures], [mandatorySystemGestures], [waterfall], and [tappableElement].
+ * The insets that include areas where gestures may be confused with other input, including
+ * [systemGestures], [mandatorySystemGestures], [waterfall], and [tappableElement].
  */
 expect val WindowInsets.Companion.safeGestures: WindowInsets
 
 /**
- * The insets that include all areas that may be drawn over or have gesture confusion,
- * including everything in [safeDrawing] and [safeGestures].
+ * The insets that include all areas that may be drawn over or have gesture confusion, including
+ * everything in [safeDrawing] and [safeGestures].
  */
 expect val WindowInsets.Companion.safeContent: WindowInsets
diff --git a/compose/foundation/foundation-layout/src/commonMain/kotlin/androidx/compose/foundation/layout/WindowInsetsPadding.kt b/compose/foundation/foundation-layout/src/commonMain/kotlin/androidx/compose/foundation/layout/WindowInsetsPadding.kt
index 08b8395..18bb568 100644
--- a/compose/foundation/foundation-layout/src/commonMain/kotlin/androidx/compose/foundation/layout/WindowInsetsPadding.kt
+++ b/compose/foundation/foundation-layout/src/commonMain/kotlin/androidx/compose/foundation/layout/WindowInsetsPadding.kt
@@ -41,92 +41,90 @@
 /**
  * Adds padding so that the content doesn't enter [insets] space.
  *
- * Any insets consumed by other insets padding modifiers or [consumeWindowInsets] on a parent
- * layout will be excluded from [insets]. [insets] will be [consumed][consumeWindowInsets] for
- * child layouts as well.
+ * Any insets consumed by other insets padding modifiers or [consumeWindowInsets] on a parent layout
+ * will be excluded from [insets]. [insets] will be [consumed][consumeWindowInsets] for child
+ * layouts as well.
  *
  * For example, if an ancestor uses [statusBarsPadding] and this modifier uses
  * [WindowInsets.Companion.systemBars], the portion of the system bars that the status bars uses
  * will not be padded again by this modifier.
  *
  * @sample androidx.compose.foundation.layout.samples.insetsPaddingSample
+ *
  * @see WindowInsets
  */
 @Stable
-fun Modifier.windowInsetsPadding(insets: WindowInsets): Modifier = composed(
-    debugInspectorInfo {
-        name = "windowInsetsPadding"
-        properties["insets"] = insets
+fun Modifier.windowInsetsPadding(insets: WindowInsets): Modifier =
+    composed(
+        debugInspectorInfo {
+            name = "windowInsetsPadding"
+            properties["insets"] = insets
+        }
+    ) {
+        remember(insets) { InsetsPaddingModifier(insets) }
     }
-) {
-    remember(insets) { InsetsPaddingModifier(insets) }
-}
 
 /**
  * Consume insets that haven't been consumed yet by other insets Modifiers similar to
  * [windowInsetsPadding] without adding any padding.
  *
- * This can be useful when content offsets are provided by [WindowInsets.asPaddingValues].
- * This should be used further down the hierarchy than the [PaddingValues] is used so
- * that the values aren't consumed before the padding is added.
+ * This can be useful when content offsets are provided by [WindowInsets.asPaddingValues]. This
+ * should be used further down the hierarchy than the [PaddingValues] is used so that the values
+ * aren't consumed before the padding is added.
  *
  * @sample androidx.compose.foundation.layout.samples.consumedInsetsSample
  */
 @Stable
-fun Modifier.consumeWindowInsets(insets: WindowInsets): Modifier = composed(
-    debugInspectorInfo {
-        name = "consumeWindowInsets"
-        properties["insets"] = insets
+fun Modifier.consumeWindowInsets(insets: WindowInsets): Modifier =
+    composed(
+        debugInspectorInfo {
+            name = "consumeWindowInsets"
+            properties["insets"] = insets
+        }
+    ) {
+        remember(insets) { UnionInsetsConsumingModifier(insets) }
     }
-) {
-    remember(insets) { UnionInsetsConsumingModifier(insets) }
-}
 
 /**
- * Consume [paddingValues] as insets as if the padding was added irrespective of insets.
- * Layouts further down the hierarchy that use [windowInsetsPadding], [safeContentPadding],
- * and other insets padding Modifiers won't pad for the values that [paddingValues] provides.
- * This can be useful when content offsets are provided by layout rather than [windowInsetsPadding]
- * modifiers.
+ * Consume [paddingValues] as insets as if the padding was added irrespective of insets. Layouts
+ * further down the hierarchy that use [windowInsetsPadding], [safeContentPadding], and other insets
+ * padding Modifiers won't pad for the values that [paddingValues] provides. This can be useful when
+ * content offsets are provided by layout rather than [windowInsetsPadding] modifiers.
  *
- * This method consumes all of [paddingValues] in addition to whatever has been
- * consumed by other [windowInsetsPadding] modifiers by ancestors. [consumeWindowInsets]
- * accepting a [WindowInsets] argument ensures that its insets are consumed and doesn't
- * consume more if they have already been consumed by ancestors.
+ * This method consumes all of [paddingValues] in addition to whatever has been consumed by other
+ * [windowInsetsPadding] modifiers by ancestors. [consumeWindowInsets] accepting a [WindowInsets]
+ * argument ensures that its insets are consumed and doesn't consume more if they have already been
+ * consumed by ancestors.
  *
  * @sample androidx.compose.foundation.layout.samples.consumedInsetsPaddingSample
  */
 @Stable
-fun Modifier.consumeWindowInsets(paddingValues: PaddingValues): Modifier = composed(
-    debugInspectorInfo {
-        name = "consumeWindowInsets"
-        properties["paddingValues"] = paddingValues
+fun Modifier.consumeWindowInsets(paddingValues: PaddingValues): Modifier =
+    composed(
+        debugInspectorInfo {
+            name = "consumeWindowInsets"
+            properties["paddingValues"] = paddingValues
+        }
+    ) {
+        remember(paddingValues) { PaddingValuesConsumingModifier(paddingValues) }
     }
-) {
-    remember(paddingValues) {
-        PaddingValuesConsumingModifier(paddingValues)
-    }
-}
 
 /**
- * Calls [block] with the [WindowInsets] that have been consumed, either by [consumeWindowInsets]
- * or one of the padding Modifiers, such as [imePadding].
+ * Calls [block] with the [WindowInsets] that have been consumed, either by [consumeWindowInsets] or
+ * one of the padding Modifiers, such as [imePadding].
  *
  * @sample androidx.compose.foundation.layout.samples.withConsumedInsetsSample
  */
 @Stable
-fun Modifier.onConsumedWindowInsetsChanged(
-    block: (consumedWindowInsets: WindowInsets) -> Unit
-) = composed(
-    debugInspectorInfo {
-        name = "onConsumedWindowInsetsChanged"
-        properties["block"] = block
+fun Modifier.onConsumedWindowInsetsChanged(block: (consumedWindowInsets: WindowInsets) -> Unit) =
+    composed(
+        debugInspectorInfo {
+            name = "onConsumedWindowInsetsChanged"
+            properties["block"] = block
+        }
+    ) {
+        remember(block) { ConsumedInsetsModifier(block) }
     }
-) {
-    remember(block) {
-        ConsumedInsetsModifier(block)
-    }
-}
 
 /**
  * Adds padding to accommodate the [safe drawing][WindowInsets.Companion.safeDrawing] insets.
@@ -135,8 +133,8 @@
  * will be excluded from the padding. [WindowInsets.Companion.safeDrawing] will be
  * [consumed][consumeWindowInsets] for child layouts as well.
  *
- * For example, if a parent layout uses [statusBarsPadding], the area that the parent
- * pads for the status bars will not be padded again by this [safeDrawingPadding] modifier.
+ * For example, if a parent layout uses [statusBarsPadding], the area that the parent pads for the
+ * status bars will not be padded again by this [safeDrawingPadding] modifier.
  *
  * When used, the [WindowInsets] will be consumed.
  *
@@ -151,9 +149,8 @@
  * will be excluded from the padding. [WindowInsets.Companion.safeGestures] will be
  * [consumed][consumeWindowInsets] for child layouts as well.
  *
- * For example, if a parent layout uses [navigationBarsPadding],
- * the area that the parent layout pads for the status bars will not be padded again by this
- * [safeGesturesPadding] modifier.
+ * For example, if a parent layout uses [navigationBarsPadding], the area that the parent layout
+ * pads for the status bars will not be padded again by this [safeGesturesPadding] modifier.
  *
  * When used, the [WindowInsets] will be consumed.
  *
@@ -168,9 +165,8 @@
  * will be excluded from the padding. [WindowInsets.Companion.safeContent] will be
  * [consumed][consumeWindowInsets] for child layouts as well.
  *
- * For example, if a parent layout uses [navigationBarsPadding],
- * the area that the parent layout pads for the status bars will not be padded again by this
- * [safeContentPadding] modifier.
+ * For example, if a parent layout uses [navigationBarsPadding], the area that the parent layout
+ * pads for the status bars will not be padded again by this [safeContentPadding] modifier.
  *
  * When used, the [WindowInsets] will be consumed.
  *
@@ -185,9 +181,8 @@
  * will be excluded from the padding. [WindowInsets.Companion.systemBars] will be
  * [consumed][consumeWindowInsets] for child layouts as well.
  *
- * For example, if a parent layout uses [statusBarsPadding], the
- * area that the parent layout pads for the status bars will not be padded again by this
- * [systemBarsPadding] modifier.
+ * For example, if a parent layout uses [statusBarsPadding], the area that the parent layout pads
+ * for the status bars will not be padded again by this [systemBarsPadding] modifier.
  *
  * When used, the [WindowInsets] will be consumed.
  *
@@ -202,9 +197,8 @@
  * will be excluded from the padding. [WindowInsets.Companion.displayCutout] will be
  * [consumed][consumeWindowInsets] for child layouts as well.
  *
- * For example, if a parent layout uses [statusBarsPadding], the
- * area that the parent layout pads for the status bars will not be padded again by this
- * [displayCutoutPadding] modifier.
+ * For example, if a parent layout uses [statusBarsPadding], the area that the parent layout pads
+ * for the status bars will not be padded again by this [displayCutoutPadding] modifier.
  *
  * When used, the [WindowInsets] will be consumed.
  *
@@ -219,9 +213,8 @@
  * will be excluded from the padding. [WindowInsets.Companion.statusBars] will be
  * [consumed][consumeWindowInsets] for child layouts as well.
  *
- * For example, if a parent layout uses [displayCutoutPadding], the
- * area that the parent layout pads for the status bars will not be padded again by this
- * [statusBarsPadding] modifier.
+ * For example, if a parent layout uses [displayCutoutPadding], the area that the parent layout pads
+ * for the status bars will not be padded again by this [statusBarsPadding] modifier.
  *
  * When used, the [WindowInsets] will be consumed.
  *
@@ -236,9 +229,8 @@
  * will be excluded from the padding. [WindowInsets.Companion.ime] will be
  * [consumed][consumeWindowInsets] for child layouts as well.
  *
- * For example, if a parent layout uses [navigationBarsPadding],
- * the area that the parent layout pads for the status bars will not be padded again by this
- * [imePadding] modifier.
+ * For example, if a parent layout uses [navigationBarsPadding], the area that the parent layout
+ * pads for the status bars will not be padded again by this [imePadding] modifier.
  *
  * When used, the [WindowInsets] will be consumed.
  *
@@ -253,9 +245,8 @@
  * will be excluded from the padding. [WindowInsets.Companion.navigationBars] will be
  * [consumed][consumeWindowInsets] for child layouts as well.
  *
- * For example, if a parent layout uses [systemBarsPadding], the
- * area that the parent layout pads for the status bars will not be padded again by this
- * [navigationBarsPadding] modifier.
+ * For example, if a parent layout uses [systemBarsPadding], the area that the parent layout pads
+ * for the status bars will not be padded again by this [navigationBarsPadding] modifier.
  *
  * When used, the [WindowInsets] will be consumed.
  *
@@ -270,9 +261,8 @@
  * will be excluded from the padding. [WindowInsets.Companion.captionBar] will be
  * [consumed][consumeWindowInsets] for child layouts as well.
  *
- * For example, if a parent layout uses [displayCutoutPadding], the
- * area that the parent layout pads for the status bars will not be padded again by this
- * [captionBarPadding] modifier.
+ * For example, if a parent layout uses [displayCutoutPadding], the area that the parent layout pads
+ * for the status bars will not be padded again by this [captionBarPadding] modifier.
  *
  * When used, the [WindowInsets] will be consumed.
  *
@@ -287,9 +277,8 @@
  * will be excluded from the padding. [WindowInsets.Companion.waterfall] will be
  * [consumed][consumeWindowInsets] for child layouts as well.
  *
- * For example, if a parent layout uses [systemGesturesPadding],
- * the area that the parent layout pads for the status bars will not be padded again by this
- * [waterfallPadding] modifier.
+ * For example, if a parent layout uses [systemGesturesPadding], the area that the parent layout
+ * pads for the status bars will not be padded again by this [waterfallPadding] modifier.
  *
  * When used, the [WindowInsets] will be consumed.
  *
@@ -304,9 +293,8 @@
  * will be excluded from the padding. [WindowInsets.Companion.systemGestures] will be
  * [consumed][consumeWindowInsets] for child layouts as well.
  *
- * For example, if a parent layout uses [waterfallPadding], the
- * area that the parent layout pads for the status bars will not be padded again by this
- * [systemGesturesPadding] modifier.
+ * For example, if a parent layout uses [waterfallPadding], the area that the parent layout pads for
+ * the status bars will not be padded again by this [systemGesturesPadding] modifier.
  *
  * When used, the [WindowInsets] will be consumed.
  *
@@ -322,9 +310,9 @@
  * will be excluded from the padding. [WindowInsets.Companion.mandatorySystemGestures] will be
  * [consumed][consumeWindowInsets] for child layouts as well.
  *
- * For example, if a parent layout uses [navigationBarsPadding],
- * the area that the parent layout pads for the status bars will not be padded again by this
- * [mandatorySystemGesturesPadding] modifier.
+ * For example, if a parent layout uses [navigationBarsPadding], the area that the parent layout
+ * pads for the status bars will not be padded again by this [mandatorySystemGesturesPadding]
+ * modifier.
  *
  * When used, the [WindowInsets] will be consumed.
  *
@@ -332,14 +320,10 @@
  */
 expect fun Modifier.mandatorySystemGesturesPadding(): Modifier
 
-internal val ModifierLocalConsumedWindowInsets = modifierLocalOf {
-    WindowInsets(0, 0, 0, 0)
-}
+internal val ModifierLocalConsumedWindowInsets = modifierLocalOf { WindowInsets(0, 0, 0, 0) }
 
-internal class InsetsPaddingModifier(
-    private val insets: WindowInsets
-) : LayoutModifier,
-    ModifierLocalConsumer, ModifierLocalProvider<WindowInsets> {
+internal class InsetsPaddingModifier(private val insets: WindowInsets) :
+    LayoutModifier, ModifierLocalConsumer, ModifierLocalProvider<WindowInsets> {
     private var unconsumedInsets: WindowInsets by mutableStateOf(insets)
     private var consumedInsets: WindowInsets by mutableStateOf(insets)
 
@@ -360,9 +344,7 @@
 
         val width = constraints.constrainWidth(placeable.width + horizontal)
         val height = constraints.constrainHeight(placeable.height + vertical)
-        return layout(width, height) {
-            placeable.place(left, top)
-        }
+        return layout(width, height) { placeable.place(left, top) }
     }
 
     override fun onModifierLocalsUpdated(scope: ModifierLocalReadScope) {
@@ -393,12 +375,10 @@
     override fun hashCode(): Int = insets.hashCode()
 }
 
-/**
- * Base class for arbitrary insets consumption modifiers.
- */
+/** Base class for arbitrary insets consumption modifiers. */
 @Stable
-private sealed class InsetsConsumingModifier : ModifierLocalConsumer,
-    ModifierLocalProvider<WindowInsets> {
+private sealed class InsetsConsumingModifier :
+    ModifierLocalConsumer, ModifierLocalProvider<WindowInsets> {
     private var consumedInsets: WindowInsets by mutableStateOf(WindowInsets(0, 0, 0, 0))
 
     abstract fun calculateInsets(modifierLocalInsets: WindowInsets): WindowInsets
@@ -418,9 +398,8 @@
 }
 
 @Stable
-private class PaddingValuesConsumingModifier(
-    private val paddingValues: PaddingValues
-) : InsetsConsumingModifier() {
+private class PaddingValuesConsumingModifier(private val paddingValues: PaddingValues) :
+    InsetsConsumingModifier() {
     override fun calculateInsets(modifierLocalInsets: WindowInsets): WindowInsets =
         paddingValues.asInsets().add(modifierLocalInsets)
 
@@ -439,9 +418,8 @@
 }
 
 @Stable
-private class ConsumedInsetsModifier(
-    private val block: (WindowInsets) -> Unit
-) : ModifierLocalConsumer {
+private class ConsumedInsetsModifier(private val block: (WindowInsets) -> Unit) :
+    ModifierLocalConsumer {
 
     private var oldWindowInsets: WindowInsets? = null
 
@@ -458,19 +436,19 @@
 
     override fun hashCode(): Int = block.hashCode()
 
-    override fun onModifierLocalsUpdated(scope: ModifierLocalReadScope) = with(scope) {
-        val consumed = ModifierLocalConsumedWindowInsets.current
-        if (consumed != oldWindowInsets) {
-            oldWindowInsets = consumed
-            block(consumed)
+    override fun onModifierLocalsUpdated(scope: ModifierLocalReadScope) =
+        with(scope) {
+            val consumed = ModifierLocalConsumedWindowInsets.current
+            if (consumed != oldWindowInsets) {
+                oldWindowInsets = consumed
+                block(consumed)
+            }
         }
-    }
 }
 
 @Stable
-private class UnionInsetsConsumingModifier(
-    private val insets: WindowInsets
-) : InsetsConsumingModifier() {
+private class UnionInsetsConsumingModifier(private val insets: WindowInsets) :
+    InsetsConsumingModifier() {
     override fun calculateInsets(modifierLocalInsets: WindowInsets): WindowInsets =
         insets.union(modifierLocalInsets)
 
diff --git a/compose/foundation/foundation-layout/src/commonMain/kotlin/androidx/compose/foundation/layout/WindowInsetsSize.kt b/compose/foundation/foundation-layout/src/commonMain/kotlin/androidx/compose/foundation/layout/WindowInsetsSize.kt
index 4d2cc98..c0b5649 100644
--- a/compose/foundation/foundation-layout/src/commonMain/kotlin/androidx/compose/foundation/layout/WindowInsetsSize.kt
+++ b/compose/foundation/foundation-layout/src/commonMain/kotlin/androidx/compose/foundation/layout/WindowInsetsSize.kt
@@ -35,96 +35,108 @@
 import androidx.compose.ui.unit.LayoutDirection
 
 /**
- * Sets the width to that of [insets] at the [start][androidx.compose.ui.Alignment.Start]
- * of the screen, using either [left][WindowInsets.getLeft] or [right][WindowInsets.getRight],
- * depending on the [LayoutDirection].
+ * Sets the width to that of [insets] at the [start][androidx.compose.ui.Alignment.Start] of the
+ * screen, using either [left][WindowInsets.getLeft] or [right][WindowInsets.getRight], depending on
+ * the [LayoutDirection].
  *
- * When used, the [WindowInsets][android.view.WindowInsets] will respect the consumed
- * insets from [windowInsetsPadding] and [consumeWindowInsets], but won't consume any
- * insets.
+ * When used, the [WindowInsets][android.view.WindowInsets] will respect the consumed insets from
+ * [windowInsetsPadding] and [consumeWindowInsets], but won't consume any insets.
  *
  * @sample androidx.compose.foundation.layout.samples.insetsStartWidthSample
  */
 @Stable
-fun Modifier.windowInsetsStartWidth(insets: WindowInsets) = this.then(
-    DerivedWidthModifier(insets, debugInspectorInfo {
-        name = "insetsStartWidth"
-        properties["insets"] = insets
-    }) { layoutDirection, density ->
-        if (layoutDirection == LayoutDirection.Ltr) {
-            getLeft(density, layoutDirection)
-        } else {
-            getRight(density, layoutDirection)
+fun Modifier.windowInsetsStartWidth(insets: WindowInsets) =
+    this.then(
+        DerivedWidthModifier(
+            insets,
+            debugInspectorInfo {
+                name = "insetsStartWidth"
+                properties["insets"] = insets
+            }
+        ) { layoutDirection, density ->
+            if (layoutDirection == LayoutDirection.Ltr) {
+                getLeft(density, layoutDirection)
+            } else {
+                getRight(density, layoutDirection)
+            }
         }
-    }
-)
+    )
 
 /**
- * Sets the width to that of [insets] at the [end][androidx.compose.ui.Alignment.End]
- * of the screen, using either [left][WindowInsets.getLeft] or [right][WindowInsets.getRight],
- * depending on the [LayoutDirection].
+ * Sets the width to that of [insets] at the [end][androidx.compose.ui.Alignment.End] of the screen,
+ * using either [left][WindowInsets.getLeft] or [right][WindowInsets.getRight], depending on the
+ * [LayoutDirection].
  *
- * When used, the [WindowInsets][android.view.WindowInsets] will respect the consumed
- * insets from [windowInsetsPadding] and [consumeWindowInsets], but won't consume any
- * insets.
+ * When used, the [WindowInsets][android.view.WindowInsets] will respect the consumed insets from
+ * [windowInsetsPadding] and [consumeWindowInsets], but won't consume any insets.
  *
  * @sample androidx.compose.foundation.layout.samples.insetsEndWidthSample
  */
 @Stable
-fun Modifier.windowInsetsEndWidth(insets: WindowInsets) = this.then(
-    DerivedWidthModifier(insets, debugInspectorInfo {
-        name = "insetsEndWidth"
-        properties["insets"] = insets
-    }) { layoutDirection, density ->
-        if (layoutDirection == LayoutDirection.Rtl) {
-            getLeft(density, layoutDirection)
-        } else {
-            getRight(density, layoutDirection)
+fun Modifier.windowInsetsEndWidth(insets: WindowInsets) =
+    this.then(
+        DerivedWidthModifier(
+            insets,
+            debugInspectorInfo {
+                name = "insetsEndWidth"
+                properties["insets"] = insets
+            }
+        ) { layoutDirection, density ->
+            if (layoutDirection == LayoutDirection.Rtl) {
+                getLeft(density, layoutDirection)
+            } else {
+                getRight(density, layoutDirection)
+            }
         }
-    }
-)
+    )
 
 /**
  * Sets the height to that of [insets] at the [top][WindowInsets.getTop] of the screen.
  *
- * When used, the [WindowInsets][android.view.WindowInsets] will respect the consumed
- * insets from [windowInsetsPadding] and [consumeWindowInsets], but won't consume any
- * insets.
+ * When used, the [WindowInsets][android.view.WindowInsets] will respect the consumed insets from
+ * [windowInsetsPadding] and [consumeWindowInsets], but won't consume any insets.
  *
  * @sample androidx.compose.foundation.layout.samples.insetsTopHeightSample
  */
 @Stable
-fun Modifier.windowInsetsTopHeight(insets: WindowInsets) = this.then(
-    DerivedHeightModifier(insets, debugInspectorInfo {
-        name = "insetsTopHeight"
-        properties["insets"] = insets
-    }) {
-        getTop(it)
-    }
-)
+fun Modifier.windowInsetsTopHeight(insets: WindowInsets) =
+    this.then(
+        DerivedHeightModifier(
+            insets,
+            debugInspectorInfo {
+                name = "insetsTopHeight"
+                properties["insets"] = insets
+            }
+        ) {
+            getTop(it)
+        }
+    )
 
 /**
  * Sets the height to that of [insets] at the [bottom][WindowInsets.getBottom] of the screen.
  *
- * When used, the [WindowInsets][android.view.WindowInsets] will respect the consumed
- * insets from [windowInsetsPadding] and [consumeWindowInsets], but won't consume any
- * insets.
+ * When used, the [WindowInsets][android.view.WindowInsets] will respect the consumed insets from
+ * [windowInsetsPadding] and [consumeWindowInsets], but won't consume any insets.
  *
  * @sample androidx.compose.foundation.layout.samples.insetsBottomHeightSample
  */
 @Stable
-fun Modifier.windowInsetsBottomHeight(insets: WindowInsets) = this.then(
-    DerivedHeightModifier(insets, debugInspectorInfo {
-        name = "insetsBottomHeight"
-        properties["insets"] = insets
-    }) {
-        getBottom(it)
-    }
-)
+fun Modifier.windowInsetsBottomHeight(insets: WindowInsets) =
+    this.then(
+        DerivedHeightModifier(
+            insets,
+            debugInspectorInfo {
+                name = "insetsBottomHeight"
+                properties["insets"] = insets
+            }
+        ) {
+            getBottom(it)
+        }
+    )
 
 /**
- * Sets the width based on [widthCalc]. If the width is 0, the height will also always be 0
- * and the content will not be placed.
+ * Sets the width based on [widthCalc]. If the width is 0, the height will also always be 0 and the
+ * content will not be placed.
  */
 @Stable
 private class DerivedWidthModifier(
@@ -140,19 +152,16 @@
     ): MeasureResult {
         val width = unconsumedInsets.widthCalc(layoutDirection, this)
         if (width == 0) {
-            return layout(0, 0) { }
+            return layout(0, 0) {}
         }
         // check for height first
         val childConstraints = constraints.copy(minWidth = width, maxWidth = width)
         val placeable = measurable.measure(childConstraints)
-        return layout(width, placeable.height) {
-            placeable.placeRelative(0, 0)
-        }
+        return layout(width, placeable.height) { placeable.placeRelative(0, 0) }
     }
 
-    override fun onModifierLocalsUpdated(scope: ModifierLocalReadScope) = with(scope) {
-        unconsumedInsets = insets.exclude(ModifierLocalConsumedWindowInsets.current)
-    }
+    override fun onModifierLocalsUpdated(scope: ModifierLocalReadScope) =
+        with(scope) { unconsumedInsets = insets.exclude(ModifierLocalConsumedWindowInsets.current) }
 
     override fun equals(other: Any?): Boolean {
         if (this === other) {
@@ -168,8 +177,8 @@
 }
 
 /**
- * Sets the height based on [heightCalc]. If the height is 0, the width will also always be 0
- * and the content will not be placed.
+ * Sets the height based on [heightCalc]. If the height is 0, the width will also always be 0 and
+ * the content will not be placed.
  */
 @Stable
 private class DerivedHeightModifier(
@@ -185,19 +194,16 @@
     ): MeasureResult {
         val height = unconsumedInsets.heightCalc(this)
         if (height == 0) {
-            return layout(0, 0) { }
+            return layout(0, 0) {}
         }
         // check for height first
         val childConstraints = constraints.copy(minHeight = height, maxHeight = height)
         val placeable = measurable.measure(childConstraints)
-        return layout(placeable.width, height) {
-            placeable.placeRelative(0, 0)
-        }
+        return layout(placeable.width, height) { placeable.placeRelative(0, 0) }
     }
 
-    override fun onModifierLocalsUpdated(scope: ModifierLocalReadScope) = with(scope) {
-        unconsumedInsets = insets.exclude(ModifierLocalConsumedWindowInsets.current)
-    }
+    override fun onModifierLocalsUpdated(scope: ModifierLocalReadScope) =
+        with(scope) { unconsumedInsets = insets.exclude(ModifierLocalConsumedWindowInsets.current) }
 
     override fun equals(other: Any?): Boolean {
         if (this === other) {
diff --git a/compose/foundation/foundation-layout/src/desktopMain/kotlin/androidx/compose/foundation/layout/WindowInsetsPadding.desktop.kt b/compose/foundation/foundation-layout/src/desktopMain/kotlin/androidx/compose/foundation/layout/WindowInsetsPadding.desktop.kt
index e0ad7e78..b8e3738 100644
--- a/compose/foundation/foundation-layout/src/desktopMain/kotlin/androidx/compose/foundation/layout/WindowInsetsPadding.desktop.kt
+++ b/compose/foundation/foundation-layout/src/desktopMain/kotlin/androidx/compose/foundation/layout/WindowInsetsPadding.desktop.kt
@@ -54,9 +54,7 @@
     }
 
 actual fun Modifier.imePadding() =
-    windowInsetsPadding(debugInspectorInfo { name = "imePadding" }) {
-        WindowInsets.ime
-    }
+    windowInsetsPadding(debugInspectorInfo { name = "imePadding" }) { WindowInsets.ime }
 
 actual fun Modifier.navigationBarsPadding() =
     windowInsetsPadding(debugInspectorInfo { name = "navigationBarsPadding" }) {
@@ -69,9 +67,7 @@
     }
 
 actual fun Modifier.waterfallPadding() =
-    windowInsetsPadding(debugInspectorInfo { name = "waterfallPadding" }) {
-        WindowInsets.waterfall
-    }
+    windowInsetsPadding(debugInspectorInfo { name = "waterfallPadding" }) { WindowInsets.waterfall }
 
 actual fun Modifier.systemGesturesPadding() =
     windowInsetsPadding(debugInspectorInfo { name = "systemGesturesPadding" }) {
@@ -88,7 +84,8 @@
 private inline fun Modifier.windowInsetsPadding(
     noinline inspectorInfo: InspectorInfo.() -> Unit,
     crossinline insetsCalculation: @Composable () -> WindowInsets
-): Modifier = composed(inspectorInfo) {
-    val insets = insetsCalculation()
-    InsetsPaddingModifier(insets)
-}
+): Modifier =
+    composed(inspectorInfo) {
+        val insets = insetsCalculation()
+        InsetsPaddingModifier(insets)
+    }
diff --git a/compose/foundation/foundation-lint/src/main/java/androidx/compose/foundation/lint/BoxWithConstraintsDetector.kt b/compose/foundation/foundation-lint/src/main/java/androidx/compose/foundation/lint/BoxWithConstraintsDetector.kt
index 9d45624..7dcd835 100644
--- a/compose/foundation/foundation-lint/src/main/java/androidx/compose/foundation/lint/BoxWithConstraintsDetector.kt
+++ b/compose/foundation/foundation-lint/src/main/java/androidx/compose/foundation/lint/BoxWithConstraintsDetector.kt
@@ -39,84 +39,94 @@
 import org.jetbrains.uast.visitor.AbstractUastVisitor
 
 class BoxWithConstraintsDetector : Detector(), SourceCodeScanner {
-    override fun getApplicableMethodNames(): List<String> = listOf(
-        FoundationNames.Layout.BoxWithConstraints.shortName
-    )
+    override fun getApplicableMethodNames(): List<String> =
+        listOf(FoundationNames.Layout.BoxWithConstraints.shortName)
 
     override fun visitMethodCall(context: JavaContext, node: UCallExpression, method: PsiMethod) {
         if (method.isInPackageName(FoundationNames.Layout.PackageName)) {
-            val contentArgument = computeKotlinArgumentMapping(node, method)
-                .orEmpty()
-                .filter { (_, parameter) ->
-                    parameter.name == "content"
-                }
-                .keys
-                .filterIsInstance<ULambdaExpression>()
-                .firstOrNull() ?: return
+            val contentArgument =
+                computeKotlinArgumentMapping(node, method)
+                    .orEmpty()
+                    .filter { (_, parameter) -> parameter.name == "content" }
+                    .keys
+                    .filterIsInstance<ULambdaExpression>()
+                    .firstOrNull() ?: return
 
             var foundValidReference = false
-            contentArgument.accept(object : AbstractUastVisitor() {
-                // Check for references to any property of BoxWithConstraintsScope
-                override fun visitSimpleNameReferenceExpression(
-                    node: USimpleNameReferenceExpression
-                ): Boolean {
-                    val reference = (node.tryResolve() as? PsiMethod)
-                        ?: return foundValidReference // No need to continue if already found
-                    if (reference.isInPackageName(FoundationNames.Layout.PackageName) &&
-                        reference.containingClass?.name == FoundationNames
-                            .Layout.BoxWithConstraintsScope.shortName
-                    ) {
-                        foundValidReference = true
+            contentArgument.accept(
+                object : AbstractUastVisitor() {
+                    // Check for references to any property of BoxWithConstraintsScope
+                    override fun visitSimpleNameReferenceExpression(
+                        node: USimpleNameReferenceExpression
+                    ): Boolean {
+                        val reference =
+                            (node.tryResolve() as? PsiMethod)
+                                ?: return foundValidReference // No need to continue if already
+                        // found
+                        if (
+                            reference.isInPackageName(FoundationNames.Layout.PackageName) &&
+                                reference.containingClass?.name ==
+                                    FoundationNames.Layout.BoxWithConstraintsScope.shortName
+                        ) {
+                            foundValidReference = true
+                        }
+
+                        // Check if reference is an extension property on BoxWithConstraintsScope
+                        if (
+                            reference.hierarchicalMethodSignature.parameterTypes
+                                .firstOrNull()
+                                ?.inheritsFrom(FoundationNames.Layout.BoxWithConstraintsScope) ==
+                                true
+                        ) {
+                            foundValidReference = true
+                        }
+                        return foundValidReference
                     }
 
-                    // Check if reference is an extension property on BoxWithConstraintsScope
-                    if (reference.hierarchicalMethodSignature
-                            .parameterTypes.firstOrNull()?.inheritsFrom(
-                                FoundationNames
-                                    .Layout.BoxWithConstraintsScope
-                            ) == true
-                    ) {
-                        foundValidReference = true
-                    }
-                    return foundValidReference
-                }
-
-                // If this is referenced in the content lambda then consider
-                // the constraints used.
-                override fun visitThisExpression(node: UThisExpression): Boolean {
-                    foundValidReference = true
-                    return foundValidReference
-                }
-
-                // Check function calls inside the content lambda to see if they
-                // are using BoxWithConstraintsScope
-                override fun visitCallExpression(node: UCallExpression): Boolean {
-                    val receiverType = node.receiverType ?: return foundValidReference
-
-                    // Check for function calls with a BoxWithConstraintsScope receiver type
-                    if (receiverType.inheritsFrom(FoundationNames.Layout.BoxWithConstraintsScope)) {
+                    // If this is referenced in the content lambda then consider
+                    // the constraints used.
+                    override fun visitThisExpression(node: UThisExpression): Boolean {
                         foundValidReference = true
                         return foundValidReference
                     }
 
-                    // Check for calls to a lambda with a BoxWithConstraintsScope receiver type
-                    // e.g. BoxWithConstraintsScope.() -> Unit
-                    val firstChildReceiverType = (receiverType as? PsiClassReferenceType)?.reference
-                        ?.typeParameters
-                        ?.firstOrNull() ?: return foundValidReference
+                    // Check function calls inside the content lambda to see if they
+                    // are using BoxWithConstraintsScope
+                    override fun visitCallExpression(node: UCallExpression): Boolean {
+                        val receiverType = node.receiverType ?: return foundValidReference
 
-                    val resolvedWildcardType = (firstChildReceiverType as? PsiWildcardType)?.bound
-                    if (
-                        resolvedWildcardType?.inheritsFrom(
-                            FoundationNames.Layout.BoxWithConstraintsScope
-                        ) == true
-                    ) {
-                        foundValidReference = true
+                        // Check for function calls with a BoxWithConstraintsScope receiver type
+                        if (
+                            receiverType.inheritsFrom(
+                                FoundationNames.Layout.BoxWithConstraintsScope
+                            )
+                        ) {
+                            foundValidReference = true
+                            return foundValidReference
+                        }
+
+                        // Check for calls to a lambda with a BoxWithConstraintsScope receiver type
+                        // e.g. BoxWithConstraintsScope.() -> Unit
+                        val firstChildReceiverType =
+                            (receiverType as? PsiClassReferenceType)
+                                ?.reference
+                                ?.typeParameters
+                                ?.firstOrNull() ?: return foundValidReference
+
+                        val resolvedWildcardType =
+                            (firstChildReceiverType as? PsiWildcardType)?.bound
+                        if (
+                            resolvedWildcardType?.inheritsFrom(
+                                FoundationNames.Layout.BoxWithConstraintsScope
+                            ) == true
+                        ) {
+                            foundValidReference = true
+                        }
+
+                        return foundValidReference
                     }
-
-                    return foundValidReference
                 }
-            })
+            )
             if (!foundValidReference) {
                 context.report(
                     UnusedConstraintsParameter,
@@ -129,19 +139,22 @@
     }
 
     companion object {
-        val UnusedConstraintsParameter = Issue.create(
-            "UnusedBoxWithConstraintsScope",
-            "BoxWithConstraints content should use the constraints provided " +
-                "via BoxWithConstraintsScope",
-            "The `content` lambda in BoxWithConstraints has a scope " +
-                "which will include the incoming constraints. If this " +
-                "scope is ignored, then the cost of subcomposition is being wasted and " +
-                "this BoxWithConstraints should be replaced with a Box.",
-            Category.CORRECTNESS, 3, Severity.ERROR,
-            Implementation(
-                BoxWithConstraintsDetector::class.java,
-                EnumSet.of(Scope.JAVA_FILE, Scope.TEST_SOURCES)
+        val UnusedConstraintsParameter =
+            Issue.create(
+                "UnusedBoxWithConstraintsScope",
+                "BoxWithConstraints content should use the constraints provided " +
+                    "via BoxWithConstraintsScope",
+                "The `content` lambda in BoxWithConstraints has a scope " +
+                    "which will include the incoming constraints. If this " +
+                    "scope is ignored, then the cost of subcomposition is being wasted and " +
+                    "this BoxWithConstraints should be replaced with a Box.",
+                Category.CORRECTNESS,
+                3,
+                Severity.ERROR,
+                Implementation(
+                    BoxWithConstraintsDetector::class.java,
+                    EnumSet.of(Scope.JAVA_FILE, Scope.TEST_SOURCES)
+                )
             )
-        )
     }
 }
diff --git a/compose/foundation/foundation-lint/src/main/java/androidx/compose/foundation/lint/FoundationIssueRegistry.kt b/compose/foundation/foundation-lint/src/main/java/androidx/compose/foundation/lint/FoundationIssueRegistry.kt
index d3de50b..4aaa5741 100644
--- a/compose/foundation/foundation-lint/src/main/java/androidx/compose/foundation/lint/FoundationIssueRegistry.kt
+++ b/compose/foundation/foundation-lint/src/main/java/androidx/compose/foundation/lint/FoundationIssueRegistry.kt
@@ -22,22 +22,24 @@
 import com.android.tools.lint.client.api.Vendor
 import com.android.tools.lint.detector.api.CURRENT_API
 
-/**
- * [IssueRegistry] containing Compose Foundation specific lint issues.
- */
+/** [IssueRegistry] containing Compose Foundation specific lint issues. */
 class FoundationIssueRegistry : IssueRegistry() {
     // Tests are run with this version. We ensure that with ApiLintVersionsTest
     override val api = 14
     override val minApi = CURRENT_API
-    override val issues get() = listOf(
-        LazyLayoutStateReadInCompositionDetector.FrequentlyChangedStateReadInComposition,
-        UnrememberedMutableInteractionSourceDetector.UnrememberedMutableInteractionSource,
-        NonLambdaOffsetModifierDetector.UseOfNonLambdaOverload,
-        BoxWithConstraintsDetector.UnusedConstraintsParameter
-    )
-    override val vendor = Vendor(
-        vendorName = "Jetpack Compose",
-        identifier = "androidx.compose.foundation",
-        feedbackUrl = "https://issuetracker.google.com/issues/new?component=612128"
-    )
+    override val issues
+        get() =
+            listOf(
+                LazyLayoutStateReadInCompositionDetector.FrequentlyChangedStateReadInComposition,
+                UnrememberedMutableInteractionSourceDetector.UnrememberedMutableInteractionSource,
+                NonLambdaOffsetModifierDetector.UseOfNonLambdaOverload,
+                BoxWithConstraintsDetector.UnusedConstraintsParameter
+            )
+
+    override val vendor =
+        Vendor(
+            vendorName = "Jetpack Compose",
+            identifier = "androidx.compose.foundation",
+            feedbackUrl = "https://issuetracker.google.com/issues/new?component=612128"
+        )
 }
diff --git a/compose/foundation/foundation-lint/src/main/java/androidx/compose/foundation/lint/LazyLayoutStateReadInCompositionDetector.kt b/compose/foundation/foundation-lint/src/main/java/androidx/compose/foundation/lint/LazyLayoutStateReadInCompositionDetector.kt
index 8df549b..eb44412 100644
--- a/compose/foundation/foundation-lint/src/main/java/androidx/compose/foundation/lint/LazyLayoutStateReadInCompositionDetector.kt
+++ b/compose/foundation/foundation-lint/src/main/java/androidx/compose/foundation/lint/LazyLayoutStateReadInCompositionDetector.kt
@@ -76,9 +76,10 @@
                     return
                 }
 
-                val receiverClsFqName = (node.tryResolveUDeclaration() as? UMethod)
-                    ?.getContainingUClass()
-                    ?.qualifiedName
+                val receiverClsFqName =
+                    (node.tryResolveUDeclaration() as? UMethod)
+                        ?.getContainingUClass()
+                        ?.qualifiedName
 
                 if (receiverClsFqName !in LazyStateFqNames) {
                     return
@@ -120,12 +121,13 @@
     }
 
     private fun JavaContext.snapshotFlowLintFix(node: UElement): LintFix {
-        val receiverText = when (node) {
-            is UQualifiedReferenceExpression -> {
-                node.receiver.sourcePsi?.text
+        val receiverText =
+            when (node) {
+                is UQualifiedReferenceExpression -> {
+                    node.receiver.sourcePsi?.text
+                }
+                else -> "this"
             }
-            else -> "this"
-        }
         val expressionText = node.sourcePsi?.text
         return LintFix.create()
             .replace()
@@ -136,7 +138,8 @@
                 """androidx.compose.runtime.LaunchedEffect($receiverText) {
                     androidx.compose.runtime.snapshotFlow { $expressionText }
                         .collect { TODO("Collect the state") }
-                }""".trimIndent()
+                }"""
+                    .trimIndent()
             )
             .shortenNames()
             .reformat(true)
@@ -144,39 +147,36 @@
     }
 
     companion object {
-        val LazyStateFqNames = listOf(
-            FoundationNames.Lazy.LazyListState.javaFqn,
-            FoundationNames.Lazy.Grid.LazyGridState.javaFqn,
-        )
-        val ObservableGetterNames = listOf(
-            "getFirstVisibleItemIndex",
-            "getFirstVisibleItemScrollOffset",
-            "getLayoutInfo"
-        )
-        val ObservablePropertyNames = listOf(
-            "firstVisibleItemIndex",
-            "firstVisibleItemScrollOffset",
-            "layoutInfo"
-        )
-        val FrequentlyChangedStateReadInComposition = Issue.create(
-            id = "FrequentlyChangedStateReadInComposition",
-            briefDescription =
-                "Frequently changing state should not " +
-                    " be directly read in composable function",
-            explanation =
-                "This property is observable and is updated after every scroll or remeasure. " +
-                "If you use it in the composable function directly, " +
-                "it will be recomposed on every change, causing potential performance issues " +
-                "including infinity recomposition loops. " +
-                "Prefer wrapping it with derivedStateOf to use calculation based on this " +
-                "property in composition or collect changes inside LaunchedEffect instead.",
-            category = Category.PERFORMANCE,
-            priority = 3,
-            severity = Severity.WARNING,
-            implementation = Implementation(
-                LazyLayoutStateReadInCompositionDetector::class.java,
-                EnumSet.of(Scope.JAVA_FILE, Scope.TEST_SOURCES)
+        val LazyStateFqNames =
+            listOf(
+                FoundationNames.Lazy.LazyListState.javaFqn,
+                FoundationNames.Lazy.Grid.LazyGridState.javaFqn,
             )
-        )
+        val ObservableGetterNames =
+            listOf("getFirstVisibleItemIndex", "getFirstVisibleItemScrollOffset", "getLayoutInfo")
+        val ObservablePropertyNames =
+            listOf("firstVisibleItemIndex", "firstVisibleItemScrollOffset", "layoutInfo")
+        val FrequentlyChangedStateReadInComposition =
+            Issue.create(
+                id = "FrequentlyChangedStateReadInComposition",
+                briefDescription =
+                    "Frequently changing state should not " +
+                        " be directly read in composable function",
+                explanation =
+                    "This property is observable and is updated after every scroll or remeasure. " +
+                        "If you use it in the composable function directly, " +
+                        "it will be recomposed on every change, causing potential performance issues " +
+                        "including infinity recomposition loops. " +
+                        "Prefer wrapping it with derivedStateOf to use calculation based on this " +
+                        "property in composition or collect changes inside LaunchedEffect instead.",
+                category = Category.PERFORMANCE,
+                priority = 3,
+                severity = Severity.WARNING,
+                implementation =
+                    Implementation(
+                        LazyLayoutStateReadInCompositionDetector::class.java,
+                        EnumSet.of(Scope.JAVA_FILE, Scope.TEST_SOURCES)
+                    )
+            )
     }
 }
diff --git a/compose/foundation/foundation-lint/src/main/java/androidx/compose/foundation/lint/NonLambdaOffsetModifierDetector.kt b/compose/foundation/foundation-lint/src/main/java/androidx/compose/foundation/lint/NonLambdaOffsetModifierDetector.kt
index 9380897..52974ba 100644
--- a/compose/foundation/foundation-lint/src/main/java/androidx/compose/foundation/lint/NonLambdaOffsetModifierDetector.kt
+++ b/compose/foundation/foundation-lint/src/main/java/androidx/compose/foundation/lint/NonLambdaOffsetModifierDetector.kt
@@ -53,10 +53,11 @@
  */
 class NonLambdaOffsetModifierDetector : Detector(), SourceCodeScanner {
 
-    override fun getApplicableMethodNames(): List<String> = listOf(
-        FoundationNames.Layout.Offset.shortName,
-        FoundationNames.Layout.AbsoluteOffset.shortName
-    )
+    override fun getApplicableMethodNames(): List<String> =
+        listOf(
+            FoundationNames.Layout.Offset.shortName,
+            FoundationNames.Layout.AbsoluteOffset.shortName
+        )
 
     override fun visitMethodCall(context: JavaContext, node: UCallExpression, method: PsiMethod) {
         // Non Modifier Offset
@@ -93,17 +94,15 @@
         if (valueParameters.size != 2) {
             return false
         }
-        return valueParameters.all {
-            it.type.classifier == DpClassifier
-        }
+        return valueParameters.all { it.type.classifier == DpClassifier }
     }
 
     private fun hasStateBackedArguments(node: UCallExpression): Boolean {
         var dynamicArguments = false
 
-        node.valueArguments
-            .forEach { expression ->
-                expression.accept(object : AbstractUastVisitor() {
+        node.valueArguments.forEach { expression ->
+            expression.accept(
+                object : AbstractUastVisitor() {
                     override fun visitSimpleNameReferenceExpression(
                         node: USimpleNameReferenceExpression
                     ): Boolean {
@@ -111,8 +110,9 @@
                         dynamicArguments = dynamicArguments || declaration.isCompositionAwareType()
                         return dynamicArguments
                     }
-                })
-            }
+                }
+            )
+        }
 
         return dynamicArguments
     }
@@ -123,19 +123,22 @@
 
         const val IssueId = "UseOfNonLambdaOffsetOverload"
 
-        val UseOfNonLambdaOverload = Issue.create(
-            IssueId,
-            "Modifier.offset{ } is preferred over Modifier.offset() for " +
-                "`State` backed arguments.",
-            "`Modifier.offset()` is recommended to be used with static arguments only to " +
-                "avoid unnecessary recompositions. `Modifier.offset{ }` is " +
-                "preferred in the cases where the arguments are backed by a `State`.",
-            Category.PERFORMANCE, 3, Severity.WARNING,
-            Implementation(
-                NonLambdaOffsetModifierDetector::class.java,
-                EnumSet.of(Scope.JAVA_FILE, Scope.TEST_SOURCES)
+        val UseOfNonLambdaOverload =
+            Issue.create(
+                IssueId,
+                "Modifier.offset{ } is preferred over Modifier.offset() for " +
+                    "`State` backed arguments.",
+                "`Modifier.offset()` is recommended to be used with static arguments only to " +
+                    "avoid unnecessary recompositions. `Modifier.offset{ }` is " +
+                    "preferred in the cases where the arguments are backed by a `State`.",
+                Category.PERFORMANCE,
+                3,
+                Severity.WARNING,
+                Implementation(
+                    NonLambdaOffsetModifierDetector::class.java,
+                    EnumSet.of(Scope.JAVA_FILE, Scope.TEST_SOURCES)
+                )
             )
-        )
     }
 }
 
@@ -149,9 +152,7 @@
             type.inheritsFrom(Names.Animation.Core.Animatable))
 }
 
-/**
- * Special handling of implicit receiver types
- */
+/** Special handling of implicit receiver types */
 private fun UDeclaration.isMethodFromStateOrAnimatable(): Boolean {
     val argument = this as? UMethod
     val containingClass = argument?.containingClass ?: return false
diff --git a/compose/foundation/foundation-lint/src/main/java/androidx/compose/foundation/lint/UnrememberedMutableInteractionSourceDetector.kt b/compose/foundation/foundation-lint/src/main/java/androidx/compose/foundation/lint/UnrememberedMutableInteractionSourceDetector.kt
index dcf1254..dcfe9c4 100644
--- a/compose/foundation/foundation-lint/src/main/java/androidx/compose/foundation/lint/UnrememberedMutableInteractionSourceDetector.kt
+++ b/compose/foundation/foundation-lint/src/main/java/androidx/compose/foundation/lint/UnrememberedMutableInteractionSourceDetector.kt
@@ -37,9 +37,8 @@
  * inside a Composable body, they are `remember`ed.
  */
 class UnrememberedMutableInteractionSourceDetector : Detector(), SourceCodeScanner {
-    override fun getApplicableMethodNames(): List<String> = listOf(
-        FoundationNames.Interaction.MutableInteractionSource.shortName
-    )
+    override fun getApplicableMethodNames(): List<String> =
+        listOf(FoundationNames.Interaction.MutableInteractionSource.shortName)
 
     override fun visitMethodCall(context: JavaContext, node: UCallExpression, method: PsiMethod) {
         if (!method.isInPackageName(FoundationNames.Interaction.PackageName)) return
@@ -56,20 +55,23 @@
     }
 
     companion object {
-        val UnrememberedMutableInteractionSource = Issue.create(
-            "UnrememberedMutableInteractionSource",
-            "Creating a MutableInteractionSource during composition without using " +
-                "`remember`",
-            "MutableInteractionSource instances created during composition need to be " +
-                "`remember`ed, otherwise they will be recreated during recomposition, and lose " +
-                "their state. Either hoist the MutableInteractionSource to an object that is not " +
-                "created during composition, or wrap the MutableInteractionSource in a call to " +
-                "`remember`.",
-            Category.CORRECTNESS, 3, Severity.ERROR,
-            Implementation(
-                UnrememberedMutableInteractionSourceDetector::class.java,
-                EnumSet.of(Scope.JAVA_FILE, Scope.TEST_SOURCES)
+        val UnrememberedMutableInteractionSource =
+            Issue.create(
+                "UnrememberedMutableInteractionSource",
+                "Creating a MutableInteractionSource during composition without using " +
+                    "`remember`",
+                "MutableInteractionSource instances created during composition need to be " +
+                    "`remember`ed, otherwise they will be recreated during recomposition, and lose " +
+                    "their state. Either hoist the MutableInteractionSource to an object that is not " +
+                    "created during composition, or wrap the MutableInteractionSource in a call to " +
+                    "`remember`.",
+                Category.CORRECTNESS,
+                3,
+                Severity.ERROR,
+                Implementation(
+                    UnrememberedMutableInteractionSourceDetector::class.java,
+                    EnumSet.of(Scope.JAVA_FILE, Scope.TEST_SOURCES)
+                )
             )
-        )
     }
 }
diff --git a/compose/foundation/foundation-lint/src/test/java/androidx/compose/foundation/lint/BoxWithConstraintsDetectorTest.kt b/compose/foundation/foundation-lint/src/test/java/androidx/compose/foundation/lint/BoxWithConstraintsDetectorTest.kt
index 8575d8f..390b7ea 100644
--- a/compose/foundation/foundation-lint/src/test/java/androidx/compose/foundation/lint/BoxWithConstraintsDetectorTest.kt
+++ b/compose/foundation/foundation-lint/src/test/java/androidx/compose/foundation/lint/BoxWithConstraintsDetectorTest.kt
@@ -26,11 +26,13 @@
 import org.junit.runner.RunWith
 import org.junit.runners.JUnit4
 
-private val ExternalModuleFunctionStub = kotlinAndBytecodeStub(
-    filename = "Other.kt",
-    filepath = "bar/compose",
-    checksum = 0xdc553c55,
-    source = """
+private val ExternalModuleFunctionStub =
+    kotlinAndBytecodeStub(
+        filename = "Other.kt",
+        filepath = "bar/compose",
+        checksum = 0xdc553c55,
+        source =
+            """
         package bar.compose
 
         import androidx.compose.foundation.layout.BoxWithConstraints
@@ -49,14 +51,15 @@
                 UseThis(scope = this)
             }
         }
-    """.trimIndent(),
     """
+                .trimIndent(),
+        """
     META-INF/main.kotlin_module:
     H4sIAAAAAAAA/2NgYGBmYGBgBGJOBijgsuJSSsxLKcrPTKnQS87PLcgvTtVL
     yy/NS0ksyczP08tJrMwvLRESccqvCM8syXDOzysuKUrMzCsp9i7hEuPiTkos
     gmkTYvcvyUgtAorzcjGn5ecLsYWkFpd4lygxaDEAADRmnbZ7AAAA
     """,
-    """
+        """
     bar/compose/OtherKt＄Test＄1.class:
     H4sIAAAAAAAA/6VU33PbRBD+TnYsW1FxmtI2SUsL1LROAlVSCoXapE1NQkWN
     y+A0DJOns3yNFct3GenkSd/yxv/BX0BhhnZghsnwyB/FsKcY405THuiD9lb7
@@ -79,7 +82,7 @@
     UcAc7mejuYB1+Fm5HL7Mznt4QOctirxBWR/uIOfjpo+PfHyMWz4+wac+bqO2
     A5agjs92kE+wluBOgssJyn8D0BOnRkwGAAA=
     """,
-    """
+        """
     bar/compose/OtherKt.class:
     H4sIAAAAAAAA/6VT21ITQRA9s7kSoqwBkYt3owZUFvCCGrxgSsotY7QEsUqe
     JpuBLNnMWjsTCt/4JXyifLB49qMse5aIRlCr9GFnus90n54+0/vl66fPAG5h
@@ -99,7 +102,7 @@
     4F58ShrF6SO4H9/oJsq0PyD8ColydRUJFyUXEy4mcc3FddxwMQVnFUxhGjOr
     SCsMK8wqDCoMKRQUUt8ADl3qEW8FAAA=
     """
-)
+    )
 
 @RunWith(JUnit4::class)
 class BoxWithConstraintsDetectorTest : LintDetectorTest() {
@@ -108,12 +111,13 @@
     override fun getIssues(): MutableList<Issue> =
         mutableListOf(BoxWithConstraintsDetector.UnusedConstraintsParameter)
 
-    private val BoxWithConstraintsStub = bytecodeStub(
-        filename = "BoxWithConstraints.kt",
-        filepath = "androidx/compose/foundation/layout",
-        checksum = 0x12a1c0a0,
-        source =
-        """
+    private val BoxWithConstraintsStub =
+        bytecodeStub(
+            filename = "BoxWithConstraints.kt",
+            filepath = "androidx/compose/foundation/layout",
+            checksum = 0x12a1c0a0,
+            source =
+                """
             package androidx.compose.foundation.layout
 
             import androidx.compose.runtime.Composable
@@ -135,14 +139,15 @@
                 propagateMinConstraints: Boolean = false,
                 content: @Composable BoxWithConstraintsScope.() -> Unit
             ) {}
-        """.trimIndent(),
         """
+                    .trimIndent(),
+            """
         META-INF/main.kotlin_module:
         H4sIAAAAAAAA/2NgYGBmYGBgBGJOBijgsuJSSsxLKcrPTKnQS87PLcgvTtVL
         yy/NS0ksyczP08tJrMwvLRESccqvCM8syXDOzysuKUrMzCsp9i7hEuPiTkos
         gmkTYvcvyUgt8i5RYtBiAADDkmqHbAAAAA==
         """,
-        """
+            """
         androidx/compose/foundation/layout/BoxWithConstraintsKt.class:
         H4sIAAAAAAAA/6VTW08TQRT+Zlt6A7GucrEioqKCqNuiCQ81JkokNhY0FjHK
         03Q7lO1lptmdbcqL4W/46j/wzfhgiI/+KOOZbavVPpDoQ89l55vvnDnn6/cf
@@ -162,7 +167,7 @@
         m44LEWgV6+S3iM48IbePWAmXSlgo4TIWS7iCpRKu4to+WIDrWN5HOsBEgBsB
         7MhmAtwMcCtAKsDKT2vS8Et1BQAA
         """,
-        """
+            """
         androidx/compose/foundation/layout/BoxWithConstraintsScope.class:
         H4sIAAAAAAAA/5WS3W4SQRTH/7MLy+5C6bZapdTvarQ3LhKv1Bs/YiShNWkT
         a8LVAlsY2J0hzEDwjqfwAbzwIbwwpJc+lPEs0kKgJphszscv/zNn9pz59fvH
@@ -177,7 +182,7 @@
         Ubf9qb2Ph+RrRDeoa74Gs4LNCrwKtrBNIa5VcB07JFC4gZs1eAoFhV2FosKe
         QlrBUrilcFshp+Ao3FFwFe4qZBXuKdh/AAfjFM8gBAAA
         """,
-        """
+            """
         androidx/compose/foundation/layout/Constraints.class:
         H4sIAAAAAAAA/5VPy07CQBQ9d1pKKT4KiiJfoBtaiXFjXKiJSROICSZiwqrQ
         AsNjxjADwR3f4sKPcGEISz/KOLAwbk0mZ859nnO/vj8+AVygTKjGIplKniyC
@@ -188,7 +193,7 @@
         4op3xumNEFJvFZRjfMDG9jqbkIFjGMPRFks4Nv+1EcyaituGFSEXwYuQx46h
         2I2wh/02SMFHoQ1HoahwoHC4xYyC8wPcDr7hxAEAAA==
         """,
-        """
+            """
         androidx/compose/foundation/layout/Dp.class:
         H4sIAAAAAAAA/41Oy07DQAwcb6GP8GqBSuUDEDfSVr1x4iGkSEVIIMGhp22z
         hW2S3Sq7qcKt38UB9cxHIZzyA9jSeGzLM/7++fwCMEKXcC5NnFsdl+HMZkvr
@@ -198,13 +203,14 @@
         b9VcnT2xg78QONniMU65Dlh9l7M+QS1CI0IzQgsBU+xF2MfBBORwiKMJhEPb
         ofMLzHJE/14BAAA=
         """
-    )
+        )
 
     @Test
     fun unreferencedConstraints() {
-        lint().files(
-            kotlin(
-                """
+        lint()
+            .files(
+                kotlin(
+                    """
                 package foo
 
                 import androidx.compose.foundation.layout.BoxWithConstraints
@@ -218,11 +224,12 @@
                     BoxWithConstraints(content = { /**/ })
                     BoxWithConstraints(propagateMinConstraints = false, content = { /**/ })
                 }
-                """.trimIndent()
-            ),
-            BoxWithConstraintsStub,
-            Stubs.Composable,
-        )
+                """
+                        .trimIndent()
+                ),
+                BoxWithConstraintsStub,
+                Stubs.Composable,
+            )
             .run()
             .expect(
                 """
@@ -245,9 +252,10 @@
 
     @Test
     fun referencedConstraints() {
-        lint().files(
-            kotlin(
-                """
+        lint()
+            .files(
+                kotlin(
+                    """
                 package foo
 
                 import androidx.compose.foundation.layout.BoxWithConstraints
@@ -281,20 +289,22 @@
                         }
                     }
                 }
-                """.trimIndent()
-            ),
-            BoxWithConstraintsStub,
-            Stubs.Composable,
-        )
+                """
+                        .trimIndent()
+                ),
+                BoxWithConstraintsStub,
+                Stubs.Composable,
+            )
             .run()
             .expectClean()
     }
 
     @Test
     fun referencedConstraintsViaThis() {
-        lint().files(
-            kotlin(
-                """
+        lint()
+            .files(
+                kotlin(
+                    """
                 package foo
 
                 import androidx.compose.foundation.layout.BoxWithConstraints
@@ -310,20 +320,22 @@
                         PassOnScope(scope = this)
                     }
                 }
-                """.trimIndent()
-            ),
-            BoxWithConstraintsStub,
-            Stubs.Composable,
-        )
+                """
+                        .trimIndent()
+                ),
+                BoxWithConstraintsStub,
+                Stubs.Composable,
+            )
             .run()
             .expectClean()
     }
 
     @Test
     fun referencedConstraintsViaReceiver() {
-        lint().files(
-            kotlin(
-                """
+        lint()
+            .files(
+                kotlin(
+                    """
                 package foo
 
                 import androidx.compose.foundation.layout.BoxWithConstraints
@@ -356,20 +368,22 @@
                         Foo { this@BoxWithConstraints.lambda() }
                     }
                 }
-                """.trimIndent()
-            ),
-            BoxWithConstraintsStub,
-            Stubs.Composable,
-        )
+                """
+                        .trimIndent()
+                ),
+                BoxWithConstraintsStub,
+                Stubs.Composable,
+            )
             .run()
             .expectClean()
     }
 
     @Test
     fun referencedConstraintsInExternalModule() {
-        lint().files(
-            kotlin(
-                """
+        lint()
+            .files(
+                kotlin(
+                    """
                     package foo
 
                     import androidx.compose.foundation.layout.BoxWithConstraints
@@ -383,23 +397,21 @@
                             Other()
                         }
                     }
-                """.trimIndent()
-            ),
-            BoxWithConstraintsStub,
-            ExternalModuleFunctionStub.bytecode,
-            Stubs.Composable
-        )
+                """
+                        .trimIndent()
+                ),
+                BoxWithConstraintsStub,
+                ExternalModuleFunctionStub.bytecode,
+                Stubs.Composable
+            )
             .run()
             .expectClean()
     }
 
     @Test
     fun referencedThisInExternalModule() {
-        lint().files(
-            ExternalModuleFunctionStub.kotlin,
-            BoxWithConstraintsStub,
-            Stubs.Composable
-        )
+        lint()
+            .files(ExternalModuleFunctionStub.kotlin, BoxWithConstraintsStub, Stubs.Composable)
             .run()
             .expectClean()
     }
diff --git a/compose/foundation/foundation-lint/src/test/java/androidx/compose/foundation/lint/LazyLayoutStateReadInCompositionDetectorTest.kt b/compose/foundation/foundation-lint/src/test/java/androidx/compose/foundation/lint/LazyLayoutStateReadInCompositionDetectorTest.kt
index 1fe039d..1358cbc 100644
--- a/compose/foundation/foundation-lint/src/test/java/androidx/compose/foundation/lint/LazyLayoutStateReadInCompositionDetectorTest.kt
+++ b/compose/foundation/foundation-lint/src/test/java/androidx/compose/foundation/lint/LazyLayoutStateReadInCompositionDetectorTest.kt
@@ -34,11 +34,13 @@
             LazyLayoutStateReadInCompositionDetector.FrequentlyChangedStateReadInComposition
         )
 
-    private val lazyGridStateStub = bytecodeStub(
-        filename = "LazyGridState.kt",
-        filepath = "androidx/compose/foundation/lazy/grid",
-        checksum = 0x1f30c0f3,
-        source = """
+    private val lazyGridStateStub =
+        bytecodeStub(
+            filename = "LazyGridState.kt",
+            filepath = "androidx/compose/foundation/lazy/grid",
+            checksum = 0x1f30c0f3,
+            source =
+                """
                     package androidx.compose.foundation.lazy.grid
 
                     interface LazyGridLayoutInfo {
@@ -51,12 +53,12 @@
                         val layoutInfo: LazyGridLayoutInfo get() = object : LazyGridLayoutInfo {}
                     }
         """,
-"""
+            """
         META-INF/main.kotlin_module:
         H4sIAAAAAAAA/2NgYGBmYGBgBGJOBijg0uSST8xLKcrPTKnQS87PLcgvTtVL
         yy/NS0ksyczPAzLzhdhCUotLvEuUGLQYAAC6oXVDAAAA
         """,
-        """
+            """
         androidx/compose/foundation/lazy/grid/LazyGridLayoutInfo.class:
         H4sIAAAAAAAA/52OzU4CMRSFzy3Kz/g3qCT4EhaIC4MrN5pJxphI4oZVmemQ
         wtAapkPAFc/lwrD2oYx3ML6Avcnpd3ubc8/X98cngBt0CLfKpktn0rVM3OLN
@@ -66,7 +68,7 @@
         +t5a5/feRZ0T4AC/R+Bir+e45LvPxodc9TFqERoRmhFaCBhxFOEYJ2NQgVOc
         jSEKhAXaP+1d5AJ/AQAA
         """,
-        """
+            """
         androidx/compose/foundation/lazy/grid/LazyGridState＄layoutInfo＄1.class:
         H4sIAAAAAAAA/6VSTW/TQBB946R1Y1zSlo8mfH8E1PaAm8IBQYWACpAlAxJF
         ueS0sbfpNs4ustdVyyl/iRMSB5QzPwoxGxAVx5bLzJu3M7Oz++bHz2/fATzC
@@ -80,7 +82,7 @@
         Akch+zrusA2Y85zCaOPujL2C6+jM6m/gHvsuZyxy1fk+ajGaMZZiLGOFIS7E
         uIhLfVCJy1jtwysdbP0CBEAxIl4DAAA=
         """,
-        """
+            """
         androidx/compose/foundation/lazy/grid/LazyGridState.class:
         H4sIAAAAAAAA/6VTW08TQRT+ZnvfFtiiaLkoKqiAygJKQpQYlQSzSYUETBPD
         07ad1qHbWbMzJeATv8VnH/SJRBPT+OiPMp5ZGm7yILgP5/LN+c45e87Mr9/f
@@ -98,13 +100,15 @@
         BB7EhWj+8USGqR2T4R4ekd4g/Br97vUtJDyUPAx7GMEomRjzcAM3t8AUxnFr
         C30KtsJthbTCndjIKxQUJpQ5mlS4q9CvMPAH6p7bvDkFAAA=
         """
-    )
+        )
 
-    private val lazyListStateStub = bytecodeStub(
-        filename = "LazyListState.kt",
-        filepath = "androidx/compose/foundation/lazy",
-        checksum = 0x4e68cddf,
-        source = """
+    private val lazyListStateStub =
+        bytecodeStub(
+            filename = "LazyListState.kt",
+            filepath = "androidx/compose/foundation/lazy",
+            checksum = 0x4e68cddf,
+            source =
+                """
                     package androidx.compose.foundation.lazy
 
                     interface LazyListLayoutInfo {
@@ -117,12 +121,12 @@
                         val layoutInfo: LazyListLayoutInfo get() = object : LazyListLayoutInfo {}
                     }
         """,
-"""
+            """
         META-INF/main.kotlin_module:
         H4sIAAAAAAAA/2NgYGBmYGBgBGJOBijg0uSST8xLKcrPTKnQS87PLcgvTtVL
         yy/NS0ksyczPAzLzhdhCUotLvEuUGLQYAAC6oXVDAAAA
         """,
-        """
+            """
         androidx/compose/foundation/lazy/LazyListLayoutInfo.class:
         H4sIAAAAAAAA/51OTU/CQBB9syiF+lVUEvwTFlBOnryYNKkxkcRLT0u7mIWy
         a9gtAU/8Lg+Gsz/KOMX4B5xJ3rz5yHvz9f3xCeAWXcKNNMXS6mId53bxZp2K
@@ -132,7 +136,7 @@
         ZV2TzXGA3xC42OM5LrkOWPiQs5mhkSBI0ErQRsgURwmOcZKBHE5xlkE4RA6d
         H25NYfx1AQAA
         """,
-        """
+            """
         androidx/compose/foundation/lazy/LazyListState＄layoutInfo＄1.class:
         H4sIAAAAAAAA/6VSS2/TQBD+xknrxqSkLY8mvB8BtT3UTQFxKCChCiRLhkoU
         5ZLTxt6m2zi7yF5XLaf8JU5IHFDO/CjErEE8bgUu38x8ntfO5y9fP30G8BD3
@@ -146,7 +150,7 @@
         7jAGzHlOUnRwt2Kv4Dq6Vf0N3GPb44xFrjo/QC1CK8JShGWssIsLES7i0gBU
         4DJWB/AK57a/AQF0+xNAAwAA
         """,
-        """
+            """
         androidx/compose/foundation/lazy/LazyListState.class:
         H4sIAAAAAAAA/51TS08UQRD+evY9u8gsii4PRQUVUJkFJZpgTJSEZJIREjCb
         GE6zu73Y7GyPme4l4Inf4tmDnkg0MRuP/ihj9bDhJQdgDvX4ur6q6qrpP39/
@@ -164,13 +168,14 @@
         /JOJjFA7JsNDPCW9TvhNuu6tTaQ8VDyMeBjFGJkY93AbdzbBFCZwdxMDCrbC
         PYWswv3EKCqUFCaVOZpSeKBwTWHwHwU6zXobBQAA
         """
-    )
+        )
 
     @Test
     fun observablePropertiesUsedInComposableFunction() {
-        lint().files(
-            kotlin(
-                """
+        lint()
+            .files(
+                kotlin(
+                    """
                 package androidx.compose.foundation.foo
 
                 import androidx.compose.runtime.Composable
@@ -191,13 +196,14 @@
                     val layoutInfo = state.layoutInfo
                 }
             """
-            ),
-            lazyGridStateStub,
-            lazyListStateStub,
-            Stubs.Composable
-        )
+                ),
+                lazyGridStateStub,
+                lazyListStateStub,
+                Stubs.Composable
+            )
             .run()
-            .expect("""
+            .expect(
+                """
 src/androidx/compose/foundation/foo/test.kt:10: Warning: Frequently changing state should not be directly read in composable function [FrequentlyChangedStateReadInComposition]
                     val index = state.firstVisibleItemIndex
                                 ~~~~~~~~~~~~~~~~~~~~~~~~~~~
@@ -217,8 +223,10 @@
                     val layoutInfo = state.layoutInfo
                                      ~~~~~~~~~~~~~~~~
 0 errors, 6 warnings
-            """)
-            .expectFixDiffs("""
+            """
+            )
+            .expectFixDiffs(
+                """
 Fix for src/androidx/compose/foundation/foo/test.kt line 10: Wrap with derivedStateOf:
 @@ -10 +10
 -                     val index = state.firstVisibleItemIndex
@@ -287,14 +295,17 @@
 +                         .collect { TODO("Collect the state") }
 @@ -21 +23
 +                 }
-            """.trimIndent())
+            """
+                    .trimIndent()
+            )
     }
 
     @Test
     fun observablePropertiesUsedInNonComposableFunction() {
-        lint().files(
-            kotlin(
-                """
+        lint()
+            .files(
+                kotlin(
+                    """
                 package androidx.compose.foundation.foo
 
                 import androidx.compose.runtime.Composable
@@ -313,20 +324,21 @@
                     val layoutInfo = state.layoutInfo
                 }
             """
-            ),
-            lazyGridStateStub,
-            lazyListStateStub,
-            Stubs.Composable,
-        )
+                ),
+                lazyGridStateStub,
+                lazyListStateStub,
+                Stubs.Composable,
+            )
             .run()
             .expectClean()
     }
 
     @Test
     fun observablePropertiesUsedInComposableFunctionWithReceiver() {
-        lint().files(
-            kotlin(
-                """
+        lint()
+            .files(
+                kotlin(
+                    """
                 package androidx.compose.foundation.foo
 
                 import androidx.compose.runtime.Composable
@@ -347,13 +359,14 @@
                     val layoutInfo = layoutInfo
                 }
             """
-            ),
-            lazyGridStateStub,
-            lazyListStateStub,
-            Stubs.Composable,
-        )
+                ),
+                lazyGridStateStub,
+                lazyListStateStub,
+                Stubs.Composable,
+            )
             .run()
-            .expect("""
+            .expect(
+                """
 src/androidx/compose/foundation/foo/test.kt:10: Warning: Frequently changing state should not be directly read in composable function [FrequentlyChangedStateReadInComposition]
                     val index = firstVisibleItemIndex
                                 ~~~~~~~~~~~~~~~~~~~~~
@@ -373,9 +386,11 @@
                     val layoutInfo = layoutInfo
                                      ~~~~~~~~~~
 0 errors, 6 warnings
-            """.trimIndent()
+            """
+                    .trimIndent()
             )
-            .expectFixDiffs("""
+            .expectFixDiffs(
+                """
 Fix for src/androidx/compose/foundation/foo/test.kt line 10: Wrap with derivedStateOf:
 @@ -10 +10
 -                     val index = firstVisibleItemIndex
@@ -444,14 +459,17 @@
 +                         .collect { TODO("Collect the state") }
 @@ -21 +23
 +                 }
-            """.trimIndent())
+            """
+                    .trimIndent()
+            )
     }
 
     @Test
     fun observablePropertiesUsedInComposableLambda() {
-        lint().files(
-            kotlin(
-                """
+        lint()
+            .files(
+                kotlin(
+                    """
                 package androidx.compose.foundation.foo
 
                 import androidx.compose.runtime.Composable
@@ -480,13 +498,14 @@
                     }
                 }
             """
-            ),
-            lazyGridStateStub,
-            lazyListStateStub,
-            Stubs.Composable,
-        )
+                ),
+                lazyGridStateStub,
+                lazyListStateStub,
+                Stubs.Composable,
+            )
             .run()
-            .expect("""
+            .expect(
+                """
 src/androidx/compose/foundation/foo/test.kt:15: Warning: Frequently changing state should not be directly read in composable function [FrequentlyChangedStateReadInComposition]
                         val index = state.firstVisibleItemIndex
                                     ~~~~~~~~~~~~~~~~~~~~~~~~~~~
@@ -506,8 +525,11 @@
                         val layoutInfo = state.layoutInfo
                                          ~~~~~~~~~~~~~~~~
 0 errors, 6 warnings
-            """.trimIndent())
-            .expectFixDiffs("""
+            """
+                    .trimIndent()
+            )
+            .expectFixDiffs(
+                """
 Fix for src/androidx/compose/foundation/foo/test.kt line 15: Wrap with derivedStateOf:
 @@ -15 +15
 -                         val index = state.firstVisibleItemIndex
@@ -574,14 +596,17 @@
 +                     androidx.compose.runtime.snapshotFlow { state.layoutInfo }
 +                         .collect { TODO("Collect the state") }
 +                 }
-            """.trimIndent())
+            """
+                    .trimIndent()
+            )
     }
 
     @Test
     fun observablePropertiesUsedInComposableLambdaWithReceiver() {
-        lint().files(
-            kotlin(
-                """
+        lint()
+            .files(
+                kotlin(
+                    """
                 package androidx.compose.foundation.foo
 
                 import androidx.compose.runtime.Composable
@@ -612,13 +637,14 @@
                     }
                 }
             """
-            ),
-            lazyGridStateStub,
-            lazyListStateStub,
-            Stubs.Composable,
-        )
+                ),
+                lazyGridStateStub,
+                lazyListStateStub,
+                Stubs.Composable,
+            )
             .run()
-            .expect("""
+            .expect(
+                """
 src/androidx/compose/foundation/foo/test.kt:18: Warning: Frequently changing state should not be directly read in composable function [FrequentlyChangedStateReadInComposition]
                         val index = firstVisibleItemIndex
                                     ~~~~~~~~~~~~~~~~~~~~~
@@ -638,8 +664,11 @@
                         val layoutInfo = layoutInfo
                                          ~~~~~~~~~~
 0 errors, 6 warnings
-            """.trimIndent())
-            .expectFixDiffs("""
+            """
+                    .trimIndent()
+            )
+            .expectFixDiffs(
+                """
 Fix for src/androidx/compose/foundation/foo/test.kt line 18: Wrap with derivedStateOf:
 @@ -18 +18
 -                         val index = firstVisibleItemIndex
@@ -706,6 +735,8 @@
 +                     androidx.compose.runtime.snapshotFlow { layoutInfo }
 +                         .collect { TODO("Collect the state") }
 +                 }
-            """.trimIndent())
+            """
+                    .trimIndent()
+            )
     }
 }
diff --git a/compose/foundation/foundation-lint/src/test/java/androidx/compose/foundation/lint/NonLambdaOffsetModifierDetectorTest.kt b/compose/foundation/foundation-lint/src/test/java/androidx/compose/foundation/lint/NonLambdaOffsetModifierDetectorTest.kt
index 0b7007e..26c5cb5 100644
--- a/compose/foundation/foundation-lint/src/test/java/androidx/compose/foundation/lint/NonLambdaOffsetModifierDetectorTest.kt
+++ b/compose/foundation/foundation-lint/src/test/java/androidx/compose/foundation/lint/NonLambdaOffsetModifierDetectorTest.kt
@@ -34,11 +34,13 @@
         "Warning: ${NonLambdaOffsetModifierDetector.ReportMainMessage} " +
             "[${NonLambdaOffsetModifierDetector.IssueId}]"
 
-    private val OffsetStub: TestFile = bytecodeStub(
-        filename = "Offset.kt",
-        filepath = "androidx/compose/foundation/layout",
-        checksum = 0xdde1b690,
-        source = """
+    private val OffsetStub: TestFile =
+        bytecodeStub(
+            filename = "Offset.kt",
+            filepath = "androidx/compose/foundation/layout",
+            checksum = 0xdde1b690,
+            source =
+                """
         package androidx.compose.foundation.layout
 
         import androidx.compose.ui.Modifier
@@ -53,13 +55,13 @@
         fun Modifier.absoluteOffset(offset: Density.() -> IntOffset): Modifier = this.then(Modifier)
 
         """,
-        """
+            """
                 META-INF/main.kotlin_module:
                 H4sIAAAAAAAA/2NgYGBmYGBgBGJOBijg0uNSSsxLKcrPTKnQS87PLcgvTtVL
                 yy/NS0ksyczP08tJrMwvLRHi8E9LK04t8S7hUuCSwFBfmqlXmpdZIsTiUgBU
                 wcfFUpJaXCLEFgIkvUuUGLQYAPzR4e16AAAA
                 """,
-        """
+            """
                 androidx/compose/foundation/layout/OffsetKt.class:
                 H4sIAAAAAAAA/+1WSVMbRxT+erSPhC2EN7GZWAoGYTwS2DhGDrEDKFEswEaE
                 xCFLDdIID0gzqlkoyCFF5ZBrzjkml1xTOZEcUpRzy2/Ib0nl9YwECGRE8DVS
@@ -92,14 +94,16 @@
                 5/EE7+cxi7k1MBPzyK2hy8S0iT4TkyY+MPGhibyJj0z0m3hqYtDEHRN+k2zx
                 ulwiu0vUnjn6z/8FFIb9PeENAAA=
                 """
-    )
+        )
 
     // common_typos_disable
-    private val AnotherOffsetDefinitionStub = kotlinAndBytecodeStub(
-        filename = "InitialTestPackage.kt",
-        filepath = "initial/test/pack",
-        checksum = 0xceabfb36,
-        source = """
+    private val AnotherOffsetDefinitionStub =
+        kotlinAndBytecodeStub(
+            filename = "InitialTestPackage.kt",
+            filepath = "initial/test/pack",
+            checksum = 0xceabfb36,
+            source =
+                """
             package initial.test.pack
 
             class OffsetClass {
@@ -123,13 +127,13 @@
             }
 
         """,
-        """
+            """
                 META-INF/main.kotlin_module:
                 H4sIAAAAAAAA/2NgYGBmYGBgBGJOBijgkuYSTMzLL8lILdIrSS0u0StITM4W
                 YgsBMr1LuDS5BDPzMksyE3OQJEU8IUIgNQFAgcT0VO8SJQYtBgDlWnMBYAAA
                 AA==
                 """,
-        """
+            """
                 initial/test/pack/AnotherClass.class:
                 H4sIAAAAAAAA/4VU30/cRhD+1r4fPnOADwIhcCVpudLjSGKgSZsGkhZoU0yA
                 oBChpvRluXMPg7Gv9h5qXyqe8idEal8qVVWfeEilFqpGikjy1r+pqjp7dg56
@@ -156,7 +160,7 @@
                 wpSFOxZN08dk4hML05hZAwsxi0/X0BnK57MQekOmQhghciG6QnSHuNlw3gph
                 hsiT/R+xoJVLkAcAAA==
                 """,
-        """
+            """
                 initial/test/pack/InitialTestPackageKt.class:
                 H4sIAAAAAAAA/5VR328SQRD+9qCUXmtLEbTQWtHSFjDxaOMbatI0MV6KbWMb
                 XnhxObawcNyZ24XUN/4g/wDjg+mzf5RxFlBrG6NecjPffPNrZ+brt89fADzD
@@ -172,7 +176,7 @@
                 UCK8GCNqHtMvh+x/tMn+1ubev7exUJ7IIiqkX5DnPs231kTMRc5F3sU6Nlw8
                 wKaLhyg0wRQe4XETCYWswpbCqkJaIaMw9x0Y3G4V2AMAAA==
                 """,
-        """
+            """
                 initial/test/pack/OffsetClass.class:
                 H4sIAAAAAAAA/41QPW8TQRB9u/dh5/Lhc0iC80UCNAkF51jpQEjEEtIhgxFE
                 pnDD2t6Ejc93yLuOQuffQp2GKlIKZFHyoxCz56sQQjnpZt682fd2Z379vv0B
@@ -186,14 +190,15 @@
                 7f68X2gtWsZK4V0hxMkvvJNfcEc/joe5chePKDepV6W3r3bhxLgXYy3GOjYI
                 4n6MGja7YBpb2O6irBFo7Gj4GmEOljUqGot/AARrj8f7AgAA
                 """
-    )
+        )
     // common_typos_enabled
 
-    private val DensityStub: TestFile = bytecodeStub(
-        filename = "Density.kt",
-        filepath = "androidx/compose/ui/unit",
-        checksum = 0xeb800aa8,
-        """
+    private val DensityStub: TestFile =
+        bytecodeStub(
+            filename = "Density.kt",
+            filepath = "androidx/compose/ui/unit",
+            checksum = 0xeb800aa8,
+            """
             package androidx.compose.ui.unit
 
             interface Density {
@@ -201,13 +206,13 @@
                 val fontScale: Float
             }
         """,
-        """
+            """
                 META-INF/main.kotlin_module:
                 H4sIAAAAAAAA/2NgYGBmYGBgBGJOBijg0uNSSsxLKcrPTKnQS87PLcgvTtVL
                 yy/NS0ksyczP08tJrMwvLRHi8E9LK04t8S7hUuCSwFBfmqlXmpdZIsTiUgBU
                 wcfFUpJaXCLEFgIkvUuUGLQYAPzR4e16AAAA
                 """,
-        """
+            """
                 androidx/compose/ui/unit/Density.class:
                 H4sIAAAAAAAA/4VPTUtCQRQ9M+/Tl9XTvtRVtKpNz6RdqyiEB0agEIGr0TfK
                 pM4LZ57Yzt/Soh/RIsRlPyqaJ0bQJhjOvffcw5x7Pr/ePwBcokZwzGQyTUUy
@@ -218,7 +223,7 @@
                 +INQojfm11KmmmmRSuUaZ9h5SFCbwIELmOrl1WwqazxC1dQbY+wbRaELK0YQ
                 YytGEdumxU6MXYRdEIUSyl34CnsK+woHa3QUXIVDBe8bGvQ5CNoBAAA=
                 """
-    )
+        )
 
     override fun getDetector(): Detector = NonLambdaOffsetModifierDetector()
 
@@ -227,9 +232,10 @@
 
     @Test
     fun lambdaOffset_simpleUsage_shouldNotWarn() {
-        lint().files(
-            kotlin(
-                """
+        lint()
+            .files(
+                kotlin(
+                    """
             package test
 
             import androidx.compose.foundation.layout.absoluteOffset
@@ -249,22 +255,23 @@
                 modifier.absoluteOffset { IntOffset(0, 0) }
             }
         """
-            ),
-            Stubs.Composable,
-            Stubs.Modifier,
-            Stubs.Dp,
-            Stubs.IntOffset,
-            OffsetStub
-        )
+                ),
+                Stubs.Composable,
+                Stubs.Modifier,
+                Stubs.Dp,
+                Stubs.IntOffset,
+                OffsetStub
+            )
             .run()
             .expectClean()
     }
 
     @Test
     fun lambdaOffset_withStateUsages_shouldNotWarn() {
-        lint().files(
-            kotlin(
-                """
+        lint()
+            .files(
+                kotlin(
+                    """
             package test
 
             import androidx.compose.foundation.layout.absoluteOffset
@@ -296,24 +303,25 @@
                 modifier.absoluteOffset { IntOffset(offsetY.value, 0) }
             }
         """
-            ),
-            Stubs.Composable,
-            Stubs.Modifier,
-            Stubs.Dp,
-            Stubs.IntOffset,
-            Stubs.SnapshotState,
-            Stubs.Remember,
-            OffsetStub
-        )
+                ),
+                Stubs.Composable,
+                Stubs.Modifier,
+                Stubs.Dp,
+                Stubs.IntOffset,
+                Stubs.SnapshotState,
+                Stubs.Remember,
+                OffsetStub
+            )
             .run()
             .expectClean()
     }
 
     @Test
     fun lambdaOffset_withAnimatableUsage_shouldNotWarn() {
-        lint().files(
-            kotlin(
-                """
+        lint()
+            .files(
+                kotlin(
+                    """
             package test
 
             import androidx.compose.animation.core.Animatable
@@ -350,24 +358,25 @@
                 modifier.absoluteOffset { IntOffset(offsetX.value.toInt(), 0) }
             }
         """
-            ),
-            Stubs.Composable,
-            Stubs.Modifier,
-            Stubs.Dp,
-            Stubs.IntOffset,
-            Stubs.Animatable,
-            Stubs.Remember,
-            OffsetStub
-        )
+                ),
+                Stubs.Composable,
+                Stubs.Modifier,
+                Stubs.Dp,
+                Stubs.IntOffset,
+                Stubs.Animatable,
+                Stubs.Remember,
+                OffsetStub
+            )
             .run()
             .expectClean()
     }
 
     @Test
     fun nonLambdaOffset_usingVariableDp_shouldNotWarn() {
-        lint().files(
-            kotlin(
-                """
+        lint()
+            .files(
+                kotlin(
+                    """
             package test
             import androidx.compose.foundation.layout.absoluteOffset
             import androidx.compose.foundation.layout.offset
@@ -394,23 +403,24 @@
                 Modifier.offset(offsetX, with(density) { 0.dp })
             }
         """
-            ),
-            Stubs.Composable,
-            Stubs.Modifier,
-            DensityStub,
-            Stubs.Dp,
-            Stubs.IntOffset,
-            OffsetStub
-        )
+                ),
+                Stubs.Composable,
+                Stubs.Modifier,
+                DensityStub,
+                Stubs.Dp,
+                Stubs.IntOffset,
+                OffsetStub
+            )
             .run()
             .expectClean()
     }
 
     @Test
     fun nonLambdaOffset_usingPassedStaticArguments_shouldNotWarn() {
-        lint().files(
-            kotlin(
-                """
+        lint()
+            .files(
+                kotlin(
+                    """
             package test
 
             import androidx.compose.foundation.layout.absoluteOffset
@@ -428,14 +438,14 @@
                 Modifier.absoluteOffset(0.dp, passedOffset)
             }
         """
-            ),
-            Stubs.Modifier,
-            Stubs.Dp,
-            Stubs.Remember,
-            Stubs.Composable,
-            Stubs.SnapshotState,
-            OffsetStub
-        )
+                ),
+                Stubs.Modifier,
+                Stubs.Dp,
+                Stubs.Remember,
+                Stubs.Composable,
+                Stubs.SnapshotState,
+                OffsetStub
+            )
             .run()
             .expectClean()
     }
@@ -444,9 +454,10 @@
 
     @Test
     fun nonLambdaOffset_usingStateLocalVariable_shouldWarn() {
-        lint().files(
-            kotlin(
-                """
+        lint()
+            .files(
+                kotlin(
+                    """
             package test
 
             import androidx.compose.foundation.layout.absoluteOffset
@@ -466,14 +477,14 @@
                 Modifier.absoluteOffset(0.dp, offsetStateful.value)
             }
         """
-            ),
-            Stubs.Modifier,
-            Stubs.Dp,
-            Stubs.Remember,
-            Stubs.Composable,
-            Stubs.SnapshotState,
-            OffsetStub
-        )
+                ),
+                Stubs.Modifier,
+                Stubs.Dp,
+                Stubs.Remember,
+                Stubs.Composable,
+                Stubs.SnapshotState,
+                OffsetStub
+            )
             .run()
             .expect(
                 """
@@ -490,9 +501,10 @@
 
     @Test
     fun nonLambdaOffset_usingDelegatedStateVariable_shouldWarn() {
-        lint().files(
-            kotlin(
-                """
+        lint()
+            .files(
+                kotlin(
+                    """
             package test
 
             import androidx.compose.foundation.layout.absoluteOffset
@@ -513,14 +525,14 @@
                 Modifier.absoluteOffset(0.dp, offsetStateful)
             }
         """
-            ),
-            Stubs.Modifier,
-            Stubs.Dp,
-            Stubs.Remember,
-            Stubs.Composable,
-            Stubs.SnapshotState,
-            OffsetStub
-        )
+                ),
+                Stubs.Modifier,
+                Stubs.Dp,
+                Stubs.Remember,
+                Stubs.Composable,
+                Stubs.SnapshotState,
+                OffsetStub
+            )
             .run()
             .expect(
                 """
@@ -537,9 +549,10 @@
 
     @Test
     fun nonLambdaOffset_usingStateReceiver_shouldWarn() {
-        lint().files(
-            kotlin(
-                """
+        lint()
+            .files(
+                kotlin(
+                    """
             package test
 
             import androidx.compose.foundation.layout.absoluteOffset
@@ -565,14 +578,14 @@
                 Modifier.absoluteOffset(value, 10.dp)
             }
         """
-            ),
-            Stubs.Modifier,
-            Stubs.Dp,
-            Stubs.Remember,
-            Stubs.Composable,
-            Stubs.SnapshotState,
-            OffsetStub
-        )
+                ),
+                Stubs.Modifier,
+                Stubs.Dp,
+                Stubs.Remember,
+                Stubs.Composable,
+                Stubs.SnapshotState,
+                OffsetStub
+            )
             .run()
             .expect(
                 """
@@ -595,9 +608,10 @@
 
     @Test
     fun nonLambdaOffset_usingTopLevelStateVariables_shouldWarn() {
-        lint().files(
-            kotlin(
-                """
+        lint()
+            .files(
+                kotlin(
+                    """
             package test
 
             import androidx.compose.foundation.layout.absoluteOffset
@@ -616,15 +630,15 @@
                 Modifier.absoluteOffset(offsetStateful.value, yAxis)
             }
         """
-            ),
-            Stubs.Modifier,
-            Stubs.Dp,
-            Stubs.Remember,
-            Stubs.Composable,
-            Stubs.SnapshotState,
-            Stubs.Animatable,
-            OffsetStub
-        )
+                ),
+                Stubs.Modifier,
+                Stubs.Dp,
+                Stubs.Remember,
+                Stubs.Composable,
+                Stubs.SnapshotState,
+                Stubs.Animatable,
+                OffsetStub
+            )
             .run()
             .expect(
                 """
@@ -641,9 +655,10 @@
 
     @Test
     fun nonLambdaOffset_usingClassPropertiesState_shouldWarn() {
-        lint().files(
-            kotlin(
-                """
+        lint()
+            .files(
+                kotlin(
+                    """
             package test
 
             import androidx.compose.foundation.layout.absoluteOffset
@@ -664,15 +679,15 @@
                 Modifier.absoluteOffset(secondaryClass.offsetStateful.value, yAxis)
             }
         """
-            ),
-            Stubs.Modifier,
-            Stubs.Dp,
-            Stubs.Remember,
-            Stubs.Composable,
-            Stubs.SnapshotState,
-            Stubs.Animatable,
-            OffsetStub
-        )
+                ),
+                Stubs.Modifier,
+                Stubs.Dp,
+                Stubs.Remember,
+                Stubs.Composable,
+                Stubs.SnapshotState,
+                Stubs.Animatable,
+                OffsetStub
+            )
             .run()
             .expect(
                 """
@@ -689,9 +704,10 @@
 
     @Test
     fun nonLambdaOffset_usingLambdaMethodWithState_shouldWarn() {
-        lint().files(
-            kotlin(
-                """
+        lint()
+            .files(
+                kotlin(
+                    """
             package test
 
             import androidx.compose.foundation.layout.absoluteOffset
@@ -711,14 +727,14 @@
                 Modifier.absoluteOffset(0.dp, run { offsetStateful.value })
             }
         """
-            ),
-            Stubs.Modifier,
-            Stubs.Dp,
-            Stubs.Remember,
-            Stubs.Composable,
-            Stubs.SnapshotState,
-            OffsetStub
-        )
+                ),
+                Stubs.Modifier,
+                Stubs.Dp,
+                Stubs.Remember,
+                Stubs.Composable,
+                Stubs.SnapshotState,
+                OffsetStub
+            )
             .run()
             .expect(
                 """
@@ -735,9 +751,10 @@
 
     @Test
     fun nonLambdaOffset_usingStateArgumentsHoisted_shouldWarn() {
-        lint().files(
-            kotlin(
-                """
+        lint()
+            .files(
+                kotlin(
+                    """
             package test
 
             import androidx.compose.foundation.layout.absoluteOffset
@@ -756,14 +773,14 @@
                 Modifier.absoluteOffset(0.dp, offsetStateful.value)
             }
         """
-            ),
-            Stubs.Modifier,
-            Stubs.Dp,
-            Stubs.Remember,
-            Stubs.Composable,
-            Stubs.SnapshotState,
-            OffsetStub
-        )
+                ),
+                Stubs.Modifier,
+                Stubs.Dp,
+                Stubs.Remember,
+                Stubs.Composable,
+                Stubs.SnapshotState,
+                OffsetStub
+            )
             .run()
             .expect(
                 """
@@ -780,9 +797,10 @@
 
     @Test
     fun nonLambdaOffset_usingStateVariableWithSecondaryMethodCallNoStateInSignature_shouldWarn() {
-        lint().files(
-            kotlin(
-                """
+        lint()
+            .files(
+                kotlin(
+                    """
             package test
 
             import androidx.compose.foundation.layout.absoluteOffset
@@ -808,14 +826,14 @@
                 return offsetStateful + 10.dp
             }
         """
-            ),
-            Stubs.Modifier,
-            Stubs.Dp,
-            Stubs.Remember,
-            Stubs.Composable,
-            Stubs.SnapshotState,
-            OffsetStub
-        )
+                ),
+                Stubs.Modifier,
+                Stubs.Dp,
+                Stubs.Remember,
+                Stubs.Composable,
+                Stubs.SnapshotState,
+                OffsetStub
+            )
             .run()
             .expect(
                 """
@@ -832,9 +850,10 @@
 
     @Test
     fun nonLambdaOffset_usingStateVariableWithSecondaryMethodCallStateInSignature_shouldWarn() {
-        lint().files(
-            kotlin(
-                """
+        lint()
+            .files(
+                kotlin(
+                    """
             package test
 
             import androidx.compose.foundation.layout.absoluteOffset
@@ -861,14 +880,14 @@
             }
 
         """
-            ),
-            Stubs.Modifier,
-            Stubs.Dp,
-            Stubs.Remember,
-            Stubs.Composable,
-            Stubs.SnapshotState,
-            OffsetStub
-        )
+                ),
+                Stubs.Modifier,
+                Stubs.Dp,
+                Stubs.Remember,
+                Stubs.Composable,
+                Stubs.SnapshotState,
+                OffsetStub
+            )
             .run()
             .expect(
                 """
@@ -885,9 +904,10 @@
 
     @Test
     fun nonLambdaOffset_usingDelegatedStateVariableWithComplexExpression_shouldWarn() {
-        lint().files(
-            kotlin(
-                """
+        lint()
+            .files(
+                kotlin(
+                    """
             package test
 
             import androidx.compose.foundation.layout.absoluteOffset
@@ -908,14 +928,14 @@
                 Modifier.absoluteOffset(0.dp, offsetStateful + 100.dp + yAxis)
             }
         """
-            ),
-            Stubs.Modifier,
-            Stubs.Dp,
-            Stubs.Remember,
-            Stubs.Composable,
-            Stubs.SnapshotState,
-            OffsetStub
-        )
+                ),
+                Stubs.Modifier,
+                Stubs.Dp,
+                Stubs.Remember,
+                Stubs.Composable,
+                Stubs.SnapshotState,
+                OffsetStub
+            )
             .run()
             .expect(
                 """
@@ -934,9 +954,10 @@
 
     @Test
     fun nonLambdaOffset_usingAnimatableArgumentsLocalVariable_shouldWarn() {
-        lint().files(
-            kotlin(
-                """
+        lint()
+            .files(
+                kotlin(
+                    """
             package test
 
             import androidx.compose.animation.core.Animatable
@@ -954,15 +975,15 @@
                 Modifier.absoluteOffset(0.dp, y = offsetX.value)
             }
         """
-            ),
-            Stubs.Dp,
-            Stubs.Animatable,
-            Stubs.Modifier,
-            Stubs.Remember,
-            Stubs.Composable,
-            Stubs.SnapshotState,
-            OffsetStub
-        )
+                ),
+                Stubs.Dp,
+                Stubs.Animatable,
+                Stubs.Modifier,
+                Stubs.Remember,
+                Stubs.Composable,
+                Stubs.SnapshotState,
+                OffsetStub
+            )
             .run()
             .expect(
                 """
@@ -979,9 +1000,10 @@
 
     @Test
     fun nonLambdaOffset_usingAnimatableArgumentsHoisted_shouldWarn() {
-        lint().files(
-            kotlin(
-                """
+        lint()
+            .files(
+                kotlin(
+                    """
             package test
 
             import androidx.compose.animation.core.Animatable
@@ -998,15 +1020,15 @@
                 Modifier.absoluteOffset(0.dp, y = offsetX.value)
             }
         """
-            ),
-            Stubs.Modifier,
-            Stubs.Dp,
-            Stubs.Remember,
-            Stubs.Composable,
-            Stubs.SnapshotState,
-            Stubs.Animatable,
-            OffsetStub
-        )
+                ),
+                Stubs.Modifier,
+                Stubs.Dp,
+                Stubs.Remember,
+                Stubs.Composable,
+                Stubs.SnapshotState,
+                Stubs.Animatable,
+                OffsetStub
+            )
             .run()
             .expect(
                 """
@@ -1023,9 +1045,10 @@
 
     @Test
     fun nonLambdaOffset_usingAnimatableReceiver_shouldWarn() {
-        lint().files(
-            kotlin(
-                """
+        lint()
+            .files(
+                kotlin(
+                    """
             package test
 
             import androidx.compose.animation.core.Animatable
@@ -1051,15 +1074,15 @@
                 Modifier.absoluteOffset(value, 10.dp)
             }
         """
-            ),
-            Stubs.Modifier,
-            Stubs.Dp,
-            Stubs.Remember,
-            Stubs.Composable,
-            Stubs.SnapshotState,
-            Stubs.Animatable,
-            OffsetStub
-        )
+                ),
+                Stubs.Modifier,
+                Stubs.Dp,
+                Stubs.Remember,
+                Stubs.Composable,
+                Stubs.SnapshotState,
+                Stubs.Animatable,
+                OffsetStub
+            )
             .run()
             .expect(
                 """
@@ -1082,9 +1105,10 @@
 
     @Test
     fun nonLambdaOffset_usingLambdaMethodWithAnimatable_shouldWarn() {
-        lint().files(
-            kotlin(
-                """
+        lint()
+            .files(
+                kotlin(
+                    """
             package test
 
             import androidx.compose.animation.core.Animatable
@@ -1104,15 +1128,15 @@
                 Modifier.absoluteOffset(0.dp, run { offsetStateful.value })
             }
         """
-            ),
-            Stubs.Modifier,
-            Stubs.Dp,
-            Stubs.Remember,
-            Stubs.Composable,
-            Stubs.SnapshotState,
-            Stubs.Animatable,
-            OffsetStub
-        )
+                ),
+                Stubs.Modifier,
+                Stubs.Dp,
+                Stubs.Remember,
+                Stubs.Composable,
+                Stubs.SnapshotState,
+                Stubs.Animatable,
+                OffsetStub
+            )
             .run()
             .expect(
                 """
@@ -1129,9 +1153,10 @@
 
     @Test
     fun nonLambdaOffset_usingTopLevelAnimatableVariables_shouldWarn() {
-        lint().files(
-            kotlin(
-                """
+        lint()
+            .files(
+                kotlin(
+                    """
             package test
 
             import androidx.compose.animation.core.Animatable
@@ -1151,15 +1176,15 @@
                 Modifier.absoluteOffset(0.dp, animatable.value)
             }
         """
-            ),
-            Stubs.Modifier,
-            Stubs.Dp,
-            Stubs.Remember,
-            Stubs.Composable,
-            Stubs.SnapshotState,
-            Stubs.Animatable,
-            OffsetStub
-        )
+                ),
+                Stubs.Modifier,
+                Stubs.Dp,
+                Stubs.Remember,
+                Stubs.Composable,
+                Stubs.SnapshotState,
+                Stubs.Animatable,
+                OffsetStub
+            )
             .run()
             .expect(
                 """
@@ -1176,9 +1201,10 @@
 
     @Test
     fun nonLambdaOffset_usingClassPropertiesAnimatable_shouldWarn() {
-        lint().files(
-            kotlin(
-                """
+        lint()
+            .files(
+                kotlin(
+                    """
             package test
 
             import androidx.compose.animation.core.Animatable
@@ -1200,15 +1226,15 @@
                 Modifier.absoluteOffset(0.dp, secondaryClass.animatable.value)
             }
         """
-            ),
-            Stubs.Modifier,
-            Stubs.Dp,
-            Stubs.Remember,
-            Stubs.Composable,
-            Stubs.SnapshotState,
-            Stubs.Animatable,
-            OffsetStub
-        )
+                ),
+                Stubs.Modifier,
+                Stubs.Dp,
+                Stubs.Remember,
+                Stubs.Composable,
+                Stubs.SnapshotState,
+                Stubs.Animatable,
+                OffsetStub
+            )
             .run()
             .expect(
                 """
@@ -1225,9 +1251,10 @@
 
     @Test
     fun nonLambdaOffset_usingAnimatableVariableWithComplexExpression_shouldWarn() {
-        lint().files(
-            kotlin(
-                """
+        lint()
+            .files(
+                kotlin(
+                    """
             package test
 
             import androidx.compose.animation.core.Animatable
@@ -1245,15 +1272,15 @@
                 Modifier.absoluteOffset(0.dp, y = offsetX.value + 5.dp)
             }
         """
-            ),
-            Stubs.Modifier,
-            Stubs.Dp,
-            Stubs.Remember,
-            Stubs.Composable,
-            Stubs.SnapshotState,
-            Stubs.Animatable,
-            OffsetStub
-        )
+                ),
+                Stubs.Modifier,
+                Stubs.Dp,
+                Stubs.Remember,
+                Stubs.Composable,
+                Stubs.SnapshotState,
+                Stubs.Animatable,
+                OffsetStub
+            )
             .run()
             .expect(
                 """
@@ -1270,9 +1297,10 @@
 
     @Test
     fun nonLambdaOffset_animatableVariableWithSecondaryMethodCallNoStateInSignature_shouldWarn() {
-        lint().files(
-            kotlin(
-                """
+        lint()
+            .files(
+                kotlin(
+                    """
             package test
 
             import androidx.compose.animation.core.Animatable
@@ -1297,15 +1325,15 @@
                 return offsetStateful + 10.dp
             }
         """
-            ),
-            Stubs.Modifier,
-            Stubs.Dp,
-            Stubs.Remember,
-            Stubs.Composable,
-            Stubs.SnapshotState,
-            Stubs.Animatable,
-            OffsetStub
-        )
+                ),
+                Stubs.Modifier,
+                Stubs.Dp,
+                Stubs.Remember,
+                Stubs.Composable,
+                Stubs.SnapshotState,
+                Stubs.Animatable,
+                OffsetStub
+            )
             .run()
             .expect(
                 """
@@ -1322,9 +1350,10 @@
 
     @Test
     fun nonLambdaOffset_usingAnimatableArgumentsWithMethodCallStateInSignature_shouldWarn() {
-        lint().files(
-            kotlin(
-                """
+        lint()
+            .files(
+                kotlin(
+                    """
             package test
 
             import androidx.compose.animation.core.Animatable
@@ -1349,15 +1378,15 @@
                 return offsetStateful.value + 10.dp
             }
         """
-            ),
-            Stubs.Modifier,
-            Stubs.Dp,
-            Stubs.Remember,
-            Stubs.Composable,
-            Stubs.SnapshotState,
-            Stubs.Animatable,
-            OffsetStub
-        )
+                ),
+                Stubs.Modifier,
+                Stubs.Dp,
+                Stubs.Remember,
+                Stubs.Composable,
+                Stubs.SnapshotState,
+                Stubs.Animatable,
+                OffsetStub
+            )
             .run()
             .expect(
                 """
@@ -1376,9 +1405,10 @@
 
     @Test
     fun nonModifierOffset_bytecode_shouldNotWarn() {
-        lint().files(
-            kotlin(
-                """
+        lint()
+            .files(
+                kotlin(
+                    """
                 package another.test.pack
 
                 import initial.test.pack.AnotherClass
@@ -1391,18 +1421,19 @@
                 val anotherOffsetCalculation = otherOffsets.offset(0, 0)
 
         """
-            ),
-            AnotherOffsetDefinitionStub.bytecode
-        )
+                ),
+                AnotherOffsetDefinitionStub.bytecode
+            )
             .run()
             .expectClean()
     }
 
     @Test
     fun nonModifierOffsetKotlin_shouldNotWarn() {
-        lint().files(
-            kotlin(
-                """
+        lint()
+            .files(
+                kotlin(
+                    """
                 package another.test.pack
 
                 import initial.test.pack.AnotherClass
@@ -1415,9 +1446,9 @@
                 val anotherOffsetCalculation = otherOffsets.offset(0, 0)
 
         """
-            ),
-            AnotherOffsetDefinitionStub.kotlin
-        )
+                ),
+                AnotherOffsetDefinitionStub.kotlin
+            )
             .run()
             .expectClean()
     }
diff --git a/compose/foundation/foundation-lint/src/test/java/androidx/compose/foundation/lint/UnrememberedMutableInteractionSourceDetectorTest.kt b/compose/foundation/foundation-lint/src/test/java/androidx/compose/foundation/lint/UnrememberedMutableInteractionSourceDetectorTest.kt
index a1a3bf9..f347bd6 100644
--- a/compose/foundation/foundation-lint/src/test/java/androidx/compose/foundation/lint/UnrememberedMutableInteractionSourceDetectorTest.kt
+++ b/compose/foundation/foundation-lint/src/test/java/androidx/compose/foundation/lint/UnrememberedMutableInteractionSourceDetectorTest.kt
@@ -29,11 +29,13 @@
 @RunWith(JUnit4::class)
 class UnrememberedMutableInteractionSourceDetectorTest : LintDetectorTest() {
 
-    private val InteractionSourceStub: TestFile = bytecodeStub(
-        filename = "InteractionSource.kt",
-        filepath = "androidx/compose/foundation/interaction",
-        checksum = 0xac2a176d,
-        source = """
+    private val InteractionSourceStub: TestFile =
+        bytecodeStub(
+            filename = "InteractionSource.kt",
+            filepath = "androidx/compose/foundation/interaction",
+            checksum = 0xac2a176d,
+            source =
+                """
         package androidx.compose.foundation.interaction
 
         interface InteractionSource
@@ -44,13 +46,13 @@
 
         private class MutableInteractionSourceImpl : MutableInteractionSource
         """,
-"""
+            """
         META-INF/main.kotlin_module:
         H4sIAAAAAAAA/2NgYGBmYGBgBGJOBijgsuNST8xLKcrPTKnQS87PLcgvTtVL
         yy/NS0ksyczP08vMK0ktSkwGsYWEPRGc4PzSouRU7xIubi6WktTiEiHmeO8S
         JQYtBgD0QcfwZQAAAA==
         """,
-        """
+            """
         androidx/compose/foundation/interaction/InteractionSource.class:
         H4sIAAAAAAAA/52OP0/DMBDF3znQtOFfCq1UvgRuKxbUiQUpUhESSCyZ3MRF
         bhIbxW7VsZ+LAXXmQyGcdGBg4yw9/+5Ouve+vj8+AdxiSLgTOq+Nyrc8M9W7
@@ -60,7 +62,7 @@
         KIarVi8x8P/EHz/2r5MiSBAm6CboIfKIkwSnOEtBFue4SMEsYov+D8H/p5CF
         AQAA
         """,
-        """
+            """
         androidx/compose/foundation/interaction/InteractionSourceKt.class:
         H4sIAAAAAAAA/61R308TQRD+5gpXevwqAtoWRbAv8OJR4xvGqBCSi7UmakhM
         n7a9lWx7t0vu9hoe+yf5ZqIJ6bN/lHG2kPDQkJDAPsx8M/vNN7szf//9vgTw
@@ -73,7 +75,7 @@
         8gSrP6ek52x99sACdq5x2Q0Mu1P7DC/YtzhbZbm1LkoRHkVYj7CBzQiP8SRC
         DfUuKEcDW114OeZzPP0PDZ9NFzMDAAA=
         """,
-        """
+            """
         androidx/compose/foundation/interaction/MutableInteractionSource.class:
         H4sIAAAAAAAA/6VQvU7DMBi8L4E2DX8tBCgvQdqKBXUBBqRIRUggsWRyExe5
         SW3UOFXHPhcD6sxDIb6EgYEOlRh8Pp/1ne/8+fX+AeAK54QbodO5UekyTMzs
@@ -83,7 +85,7 @@
         ky+qUBziVmtja/eiwUWww8UbVX/mpzUGOOO9zzr/HrwYboRWBD/CHvaZ4iDC
         IY5iUIE2OjGcAscFTr4BtDhpnA4CAAA=
         """,
-        """
+            """
         androidx/compose/foundation/interaction/MutableInteractionSourceImpl.class:
         H4sIAAAAAAAA/61Sy04bMRQ91yEPpqEEyiO0ULa0i06KugOhFhDSSGkrFZQN
         K2fGUJMZG814EMt8S/+AFRILFLHsR6FeT5C66JIufHTOuQ9dX/v34909gE/Y
@@ -95,19 +97,21 @@
         /AjTm/vtM75mFVYaqL+/RXDDROANY6MyA6wztqcJeMHMxzcqXMPb6gMS5jj2
         8hS1CPMROhEWsMgUryIsYfkUVGAFqxwv0C7QLdD6A/UGq929AgAA
         """
-    )
+        )
 
     override fun getDetector(): Detector = UnrememberedMutableInteractionSourceDetector()
 
-    override fun getIssues(): MutableList<Issue> = mutableListOf(
-        UnrememberedMutableInteractionSourceDetector.UnrememberedMutableInteractionSource
-    )
+    override fun getIssues(): MutableList<Issue> =
+        mutableListOf(
+            UnrememberedMutableInteractionSourceDetector.UnrememberedMutableInteractionSource
+        )
 
     @Test
     fun notRemembered() {
-        lint().files(
-            kotlin(
-                """
+        lint()
+            .files(
+                kotlin(
+                    """
                 package test
 
                 import androidx.compose.foundation.interaction.*
@@ -156,10 +160,10 @@
                     }
                 }
             """
-            ),
-            InteractionSourceStub,
-            Stubs.Composable,
-        )
+                ),
+                InteractionSourceStub,
+                Stubs.Composable,
+            )
             .run()
             .expect(
                 """
@@ -194,9 +198,10 @@
 
     @Test
     fun rememberedInsideComposableBody() {
-        lint().files(
-            kotlin(
-                """
+        lint()
+            .files(
+                kotlin(
+                    """
                 package test
 
                 import androidx.compose.foundation.interaction.*
@@ -238,20 +243,21 @@
                     }
                 }
             """
-            ),
-            InteractionSourceStub,
-            Stubs.Composable,
-            Stubs.Remember
-        )
+                ),
+                InteractionSourceStub,
+                Stubs.Composable,
+                Stubs.Remember
+            )
             .run()
             .expectClean()
     }
 
     @Test
     fun noErrors() {
-        lint().files(
-            kotlin(
-                """
+        lint()
+            .files(
+                kotlin(
+                    """
                 package test
 
                 import androidx.compose.foundation.interaction.*
@@ -307,10 +313,10 @@
                     }
                 }
             """
-            ),
-            InteractionSourceStub,
-            Stubs.Composable
-        )
+                ),
+                InteractionSourceStub,
+                Stubs.Composable
+            )
             .run()
             .expectClean()
     }
diff --git a/compose/foundation/foundation/benchmark/src/androidTest/java/androidx/compose/foundation/benchmark/DraggableAnchorsBenchmark.kt b/compose/foundation/foundation/benchmark/src/androidTest/java/androidx/compose/foundation/benchmark/DraggableAnchorsBenchmark.kt
index 7944221..4a4eacc 100644
--- a/compose/foundation/foundation/benchmark/src/androidTest/java/androidx/compose/foundation/benchmark/DraggableAnchorsBenchmark.kt
+++ b/compose/foundation/foundation/benchmark/src/androidTest/java/androidx/compose/foundation/benchmark/DraggableAnchorsBenchmark.kt
@@ -26,7 +26,13 @@
 import org.junit.Test
 import org.junit.runner.RunWith
 
-private enum class DraggableAnchorsSampleValue { Start, HalfStart, Center, HalfEnd, End }
+private enum class DraggableAnchorsSampleValue {
+    Start,
+    HalfStart,
+    Center,
+    HalfEnd,
+    End
+}
 
 @OptIn(ExperimentalFoundationApi::class)
 @RunWith(AndroidJUnit4::class)
@@ -34,8 +40,7 @@
 @MediumTest
 class DraggableAnchorsBenchmark {
 
-    @get:Rule
-    val benchmarkRule = BenchmarkRule()
+    @get:Rule val benchmarkRule = BenchmarkRule()
 
     @Test
     fun constructAnchors() {
@@ -59,9 +64,7 @@
             DraggableAnchorsSampleValue.HalfEnd at 300f
             DraggableAnchorsSampleValue.End at 400f
         }
-        benchmarkRule.measureRepeated {
-            anchors.positionOf(DraggableAnchorsSampleValue.Center)
-        }
+        benchmarkRule.measureRepeated { anchors.positionOf(DraggableAnchorsSampleValue.Center) }
     }
 
     @Test
@@ -73,9 +76,7 @@
             DraggableAnchorsSampleValue.HalfEnd at 300f
             DraggableAnchorsSampleValue.End at 400f
         }
-        benchmarkRule.measureRepeated {
-            anchors.closestAnchor(250f, searchUpwards = true)
-        }
+        benchmarkRule.measureRepeated { anchors.closestAnchor(250f, searchUpwards = true) }
     }
 
     @Test
@@ -87,9 +88,7 @@
             DraggableAnchorsSampleValue.HalfEnd at 300f
             DraggableAnchorsSampleValue.End at 400f
         }
-        benchmarkRule.measureRepeated {
-            anchors.closestAnchor(250f, searchUpwards = false)
-        }
+        benchmarkRule.measureRepeated { anchors.closestAnchor(250f, searchUpwards = false) }
     }
 
     @Test
@@ -101,9 +100,7 @@
             DraggableAnchorsSampleValue.HalfEnd at 300f
             DraggableAnchorsSampleValue.End at 400f
         }
-        benchmarkRule.measureRepeated {
-            anchors.closestAnchor(250f)
-        }
+        benchmarkRule.measureRepeated { anchors.closestAnchor(250f) }
     }
 
     @Test
@@ -115,9 +112,7 @@
             DraggableAnchorsSampleValue.HalfEnd at 300f
             DraggableAnchorsSampleValue.End at 400f
         }
-        benchmarkRule.measureRepeated {
-            anchors.hasAnchorFor(DraggableAnchorsSampleValue.Center)
-        }
+        benchmarkRule.measureRepeated { anchors.hasAnchorFor(DraggableAnchorsSampleValue.Center) }
     }
 
     @Test
@@ -129,9 +124,7 @@
             DraggableAnchorsSampleValue.HalfEnd at 300f
             DraggableAnchorsSampleValue.End at 400f
         }
-        benchmarkRule.measureRepeated {
-            anchors.minAnchor()
-        }
+        benchmarkRule.measureRepeated { anchors.minAnchor() }
     }
 
     @Test
@@ -143,8 +136,6 @@
             DraggableAnchorsSampleValue.HalfEnd at 300f
             DraggableAnchorsSampleValue.End at 400f
         }
-        benchmarkRule.measureRepeated {
-            anchors.maxAnchor()
-        }
+        benchmarkRule.measureRepeated { anchors.maxAnchor() }
     }
 }
diff --git a/compose/foundation/foundation/benchmark/src/androidTest/java/androidx/compose/foundation/benchmark/NestedScrollerBenchmark.kt b/compose/foundation/foundation/benchmark/src/androidTest/java/androidx/compose/foundation/benchmark/NestedScrollerBenchmark.kt
index 101a68c..0c35b7d4 100644
--- a/compose/foundation/foundation/benchmark/src/androidTest/java/androidx/compose/foundation/benchmark/NestedScrollerBenchmark.kt
+++ b/compose/foundation/foundation/benchmark/src/androidTest/java/androidx/compose/foundation/benchmark/NestedScrollerBenchmark.kt
@@ -36,8 +36,7 @@
 @LargeTest
 @RunWith(AndroidJUnit4::class)
 class NestedScrollerBenchmark {
-    @get:Rule
-    val benchmarkRule = ComposeBenchmarkRule()
+    @get:Rule val benchmarkRule = ComposeBenchmarkRule()
 
     private val nestedScrollerCaseFactory = { NestedScrollerTestCase() }
 
diff --git a/compose/foundation/foundation/benchmark/src/androidTest/java/androidx/compose/foundation/benchmark/NestedScrollerTestCase.kt b/compose/foundation/foundation/benchmark/src/androidTest/java/androidx/compose/foundation/benchmark/NestedScrollerTestCase.kt
index 99232e1..26c0d66 100644
--- a/compose/foundation/foundation/benchmark/src/androidTest/java/androidx/compose/foundation/benchmark/NestedScrollerTestCase.kt
+++ b/compose/foundation/foundation/benchmark/src/androidTest/java/androidx/compose/foundation/benchmark/NestedScrollerTestCase.kt
@@ -40,9 +40,7 @@
 import kotlin.random.Random
 import kotlinx.coroutines.runBlocking
 
-/**
- * Test case that puts many horizontal scrollers in a vertical scroller
- */
+/** Test case that puts many horizontal scrollers in a vertical scroller */
 class NestedScrollerTestCase : LayeredComposeTestCase(), ToggleableTestCase {
     // ScrollerPosition must now be constructed during composition to obtain the Density
     private lateinit var scrollState: ScrollState
@@ -51,9 +49,7 @@
     override fun MeasuredContent() {
         scrollState = rememberScrollState()
         Column(modifier = Modifier.fillMaxWidth().verticalScroll(rememberScrollState())) {
-            repeat(5) { index ->
-                SquareRow(index == 0)
-            }
+            repeat(5) { index -> SquareRow(index == 0) }
         }
     }
 
@@ -74,15 +70,8 @@
                             val blue = Random.nextInt(256)
                             Color(red = red, green = green, blue = blue)
                         }
-                        Box(
-                            Modifier
-                                .size(350f.toDp())
-                                .background(color = color))
-                        Text(
-                            text = "Some title",
-                            color = Color.Black,
-                            fontSize = 60f.toSp()
-                        )
+                        Box(Modifier.size(350f.toDp()).background(color = color))
+                        Text(text = "Some title", color = Color.Black, fontSize = 60f.toSp())
                         Row(Modifier.fillMaxWidth()) {
                             Text(
                                 "3.5 ★",
@@ -90,8 +79,7 @@
                                 modifier = Modifier.align(Alignment.CenterVertically)
                             )
                             Box(
-                                Modifier
-                                    .align(Alignment.CenterVertically)
+                                Modifier.align(Alignment.CenterVertically)
                                     .size(40f.toDp())
                                     .background(color = playStoreColor)
                             )
diff --git a/compose/foundation/foundation/benchmark/src/androidTest/java/androidx/compose/foundation/benchmark/OverscrollBenchmark.kt b/compose/foundation/foundation/benchmark/src/androidTest/java/androidx/compose/foundation/benchmark/OverscrollBenchmark.kt
index 740bf49..4a1bdd2 100644
--- a/compose/foundation/foundation/benchmark/src/androidTest/java/androidx/compose/foundation/benchmark/OverscrollBenchmark.kt
+++ b/compose/foundation/foundation/benchmark/src/androidTest/java/androidx/compose/foundation/benchmark/OverscrollBenchmark.kt
@@ -61,8 +61,7 @@
 @LargeTest
 @RunWith(AndroidJUnit4::class)
 class OverscrollBenchmark {
-    @get:Rule
-    val benchmarkRule = ComposeBenchmarkRule()
+    @get:Rule val benchmarkRule = ComposeBenchmarkRule()
 
     private val overscrollTestCase = { OverscrollTestCase() }
 
@@ -125,18 +124,19 @@
         view = LocalView.current
         if (!::motionEventHelper.isInitialized) motionEventHelper = MotionEventHelper(view)
         val scrollState = rememberScrollState()
-        val wrappedScrollState = remember(scrollState) {
-            object : ScrollableState by scrollState {
-                override val canScrollForward: Boolean
-                    get() = true
-                override val canScrollBackward: Boolean
-                    get() = true
+        val wrappedScrollState =
+            remember(scrollState) {
+                object : ScrollableState by scrollState {
+                    override val canScrollForward: Boolean
+                        get() = true
+
+                    override val canScrollBackward: Boolean
+                        get() = true
+                }
             }
-        }
         val overscrollEffect = ScrollableDefaults.overscrollEffect()
         Box(
-            Modifier
-                .scrollable(
+            Modifier.scrollable(
                     wrappedScrollState,
                     orientation = Orientation.Vertical,
                     reverseDirection = true,
@@ -146,11 +146,11 @@
                 .fillMaxSize()
         ) {
             Box(
-                Modifier
-                    .offset { IntOffset(0, scrollState.value) }
+                Modifier.offset { IntOffset(0, scrollState.value) }
                     .background(color = Color.Red)
                     .fillMaxWidth()
-                    .height(100.dp))
+                    .height(100.dp)
+            )
         }
     }
 
diff --git a/compose/foundation/foundation/benchmark/src/androidTest/java/androidx/compose/foundation/benchmark/ScrollerBenchmark.kt b/compose/foundation/foundation/benchmark/src/androidTest/java/androidx/compose/foundation/benchmark/ScrollerBenchmark.kt
index ec6a794..e183e97 100644
--- a/compose/foundation/foundation/benchmark/src/androidTest/java/androidx/compose/foundation/benchmark/ScrollerBenchmark.kt
+++ b/compose/foundation/foundation/benchmark/src/androidTest/java/androidx/compose/foundation/benchmark/ScrollerBenchmark.kt
@@ -36,8 +36,7 @@
 @LargeTest
 @RunWith(AndroidJUnit4::class)
 class ScrollerBenchmark {
-    @get:Rule
-    val benchmarkRule = ComposeBenchmarkRule()
+    @get:Rule val benchmarkRule = ComposeBenchmarkRule()
 
     private val scrollerCaseFactory = { ScrollerTestCase() }
 
@@ -76,18 +75,12 @@
 
     @Test
     fun changeScroll_layout() {
-        benchmarkRule.toggleStateBenchmarkLayout(
-            scrollerCaseFactory,
-            toggleCausesRecompose = false
-        )
+        benchmarkRule.toggleStateBenchmarkLayout(scrollerCaseFactory, toggleCausesRecompose = false)
     }
 
     @Test
     fun changeScroll_draw() {
-        benchmarkRule.toggleStateBenchmarkDraw(
-            scrollerCaseFactory,
-            toggleCausesRecompose = false
-        )
+        benchmarkRule.toggleStateBenchmarkDraw(scrollerCaseFactory, toggleCausesRecompose = false)
     }
 
     @Test
diff --git a/compose/foundation/foundation/benchmark/src/androidTest/java/androidx/compose/foundation/benchmark/ScrollerTestCase.kt b/compose/foundation/foundation/benchmark/src/androidTest/java/androidx/compose/foundation/benchmark/ScrollerTestCase.kt
index 43c37f6..4c202c1 100644
--- a/compose/foundation/foundation/benchmark/src/androidTest/java/androidx/compose/foundation/benchmark/ScrollerTestCase.kt
+++ b/compose/foundation/foundation/benchmark/src/androidTest/java/androidx/compose/foundation/benchmark/ScrollerTestCase.kt
@@ -32,7 +32,8 @@
 import kotlinx.coroutines.runBlocking
 
 /**
- * Test case that puts a large number of boxes in a column in a vertical scroller to force scrolling.
+ * Test case that puts a large number of boxes in a column in a vertical scroller to force
+ * scrolling.
  */
 class ScrollerTestCase : LayeredComposeTestCase(), ToggleableTestCase {
     private lateinit var scrollState: ScrollState
diff --git a/compose/foundation/foundation/benchmark/src/androidTest/java/androidx/compose/foundation/benchmark/SimpleComponentImplementationBenchmark.kt b/compose/foundation/foundation/benchmark/src/androidTest/java/androidx/compose/foundation/benchmark/SimpleComponentImplementationBenchmark.kt
index ef0fe06..48a39e6 100644
--- a/compose/foundation/foundation/benchmark/src/androidTest/java/androidx/compose/foundation/benchmark/SimpleComponentImplementationBenchmark.kt
+++ b/compose/foundation/foundation/benchmark/src/androidTest/java/androidx/compose/foundation/benchmark/SimpleComponentImplementationBenchmark.kt
@@ -57,8 +57,7 @@
 @LargeTest
 @RunWith(AndroidJUnit4::class)
 class SimpleComponentImplementationBenchmark {
-    @get:Rule
-    val benchmarkRule = ComposeBenchmarkRule()
+    @get:Rule val benchmarkRule = ComposeBenchmarkRule()
 
     private val twoLayoutNodesCaseFactory = { ComponentWithTwoLayoutNodesTestCase() }
     private val redrawOnlyCasefactory = { ComponentWithRedrawTestCase() }
@@ -152,10 +151,7 @@
 
     @Test
     fun component_redrawOnly_update_draw() {
-        benchmarkRule.toggleStateBenchmarkDraw(
-            redrawOnlyCasefactory,
-            toggleCausesRecompose = false
-        )
+        benchmarkRule.toggleStateBenchmarkDraw(redrawOnlyCasefactory, toggleCausesRecompose = false)
     }
 
     @Test
@@ -237,11 +233,7 @@
             Modifier.size(48.dp)
                 .background(color = Color.Cyan)
                 .padding(innerSize.value)
-                .border(
-                    color = Color.Cyan,
-                    width = 1.dp,
-                    shape = CircleShape
-                )
+                .border(color = Color.Cyan, width = 1.dp, shape = CircleShape)
         )
     }
 }
@@ -263,18 +255,15 @@
     @Composable
     override fun MeasuredContent() {
         Box(
-            modifier = Modifier
-                .size(48.dp)
-                .border(BorderStroke(1.dp, Color.Cyan), CircleShape)
-                .padding(1.dp),
+            modifier =
+                Modifier.size(48.dp)
+                    .border(BorderStroke(1.dp, Color.Cyan), CircleShape)
+                    .padding(1.dp),
             contentAlignment = Alignment.Center
         ) {
             val innerSize = getInnerSize().value
             Canvas(Modifier.size(innerSize)) {
-                drawOutline(
-                    CircleShape.createOutline(size, layoutDirection, this),
-                    Color.Cyan
-                )
+                drawOutline(CircleShape.createOutline(size, layoutDirection, this), Color.Cyan)
             }
         }
     }
@@ -293,11 +282,12 @@
 
     override fun toggleState() {
         with(state!!) {
-            value = if (value == 10.dp) {
-                20.dp
-            } else {
-                10.dp
-            }
+            value =
+                if (value == 10.dp) {
+                    20.dp
+                } else {
+                    10.dp
+                }
         }
     }
 }
diff --git a/compose/foundation/foundation/benchmark/src/androidTest/java/androidx/compose/foundation/benchmark/focusable/FocusableInLazyListBenchmark.kt b/compose/foundation/foundation/benchmark/src/androidTest/java/androidx/compose/foundation/benchmark/focusable/FocusableInLazyListBenchmark.kt
index add90b4..76c642c 100644
--- a/compose/foundation/foundation/benchmark/src/androidTest/java/androidx/compose/foundation/benchmark/focusable/FocusableInLazyListBenchmark.kt
+++ b/compose/foundation/foundation/benchmark/src/androidTest/java/androidx/compose/foundation/benchmark/focusable/FocusableInLazyListBenchmark.kt
@@ -45,8 +45,7 @@
 @RunWith(AndroidJUnit4::class)
 class FocusableInLazyListBenchmark {
 
-    @get:Rule
-    val benchmarkRule = ComposeBenchmarkRule()
+    @get:Rule val benchmarkRule = ComposeBenchmarkRule()
 
     private val itemCount = 10000
 
@@ -54,14 +53,7 @@
     fun lazyListWithNoFocusTarget() {
         benchmarkRule.toggleAndMeasureRepeated { state ->
             LazyRow(state = state) {
-                items(itemCount) {
-                    Box(
-                        modifier = Modifier
-                            .size(100.dp)
-                    ) {
-                        Text("Hello There")
-                    }
-                }
+                items(itemCount) { Box(modifier = Modifier.size(100.dp)) { Text("Hello There") } }
             }
         }
     }
@@ -71,13 +63,7 @@
         benchmarkRule.toggleAndMeasureRepeated { state ->
             LazyRow(state = state) {
                 items(itemCount) {
-                    Box(
-                        modifier = Modifier
-                            .focusable()
-                            .size(100.dp)
-                    ) {
-                        Text("Hello There")
-                    }
+                    Box(modifier = Modifier.focusable().size(100.dp)) { Text("Hello There") }
                 }
             }
         }
@@ -86,9 +72,7 @@
     private fun ComposeBenchmarkRule.toggleAndMeasureRepeated(
         content: @Composable (LazyListState) -> Unit
     ) {
-        runBenchmarkFor({
-            LazyListTestCase(itemCount) { state -> content(state) }
-        }) {
+        runBenchmarkFor({ LazyListTestCase(itemCount) { state -> content(state) } }) {
             measureRepeatedOnUiThread {
                 runWithTimingDisabled {
                     doFramesUntilNoChangesPending()
diff --git a/compose/foundation/foundation/benchmark/src/androidTest/java/androidx/compose/foundation/benchmark/lazy/LazyBenchmarkCommon.kt b/compose/foundation/foundation/benchmark/src/androidTest/java/androidx/compose/foundation/benchmark/lazy/LazyBenchmarkCommon.kt
index b0aa6cb..befc112 100644
--- a/compose/foundation/foundation/benchmark/src/androidTest/java/androidx/compose/foundation/benchmark/lazy/LazyBenchmarkCommon.kt
+++ b/compose/foundation/foundation/benchmark/src/androidTest/java/androidx/compose/foundation/benchmark/lazy/LazyBenchmarkCommon.kt
@@ -40,67 +40,60 @@
 
 data class LazyItem(val index: Int)
 
-/**
- * Helper for dispatching simple [MotionEvent]s to a [view] for use in scrolling benchmarks.
- */
+/** Helper for dispatching simple [MotionEvent]s to a [view] for use in scrolling benchmarks. */
 class MotionEventHelper(private val view: View) {
     private var time = 0L
     private var lastCoord: Offset? = null
 
-    fun sendEvent(
-        action: Int,
-        delta: Offset,
-        timeDelta: Long = 10L
-    ) {
+    fun sendEvent(action: Int, delta: Offset, timeDelta: Long = 10L) {
         time += timeDelta
 
         val coord = delta + (lastCoord ?: Offset.Zero)
 
-        lastCoord = if (action == MotionEvent.ACTION_UP) {
-            null
-        } else {
-            coord
-        }
+        lastCoord =
+            if (action == MotionEvent.ACTION_UP) {
+                null
+            } else {
+                coord
+            }
 
         val locationOnScreen = IntArray(2) { 0 }
         view.getLocationOnScreen(locationOnScreen)
 
-        val motionEvent = MotionEvent.obtain(
-            0,
-            time,
-            action,
-            1,
-            arrayOf(MotionEvent.PointerProperties()),
-            arrayOf(
-                MotionEvent.PointerCoords().apply {
-                    x = locationOnScreen[0] + coord.x.coerceAtLeast(1f)
-                    y = locationOnScreen[1] + coord.y.coerceAtLeast(1f)
+        val motionEvent =
+            MotionEvent.obtain(
+                    0,
+                    time,
+                    action,
+                    1,
+                    arrayOf(MotionEvent.PointerProperties()),
+                    arrayOf(
+                        MotionEvent.PointerCoords().apply {
+                            x = locationOnScreen[0] + coord.x.coerceAtLeast(1f)
+                            y = locationOnScreen[1] + coord.y.coerceAtLeast(1f)
+                        }
+                    ),
+                    0,
+                    0,
+                    0f,
+                    0f,
+                    0,
+                    0,
+                    0,
+                    0
+                )
+                .apply {
+                    offsetLocation(-locationOnScreen[0].toFloat(), -locationOnScreen[1].toFloat())
                 }
-            ),
-            0,
-            0,
-            0f,
-            0f,
-            0,
-            0,
-            0,
-            0
-        ).apply {
-            offsetLocation(-locationOnScreen[0].toFloat(), -locationOnScreen[1].toFloat())
-        }
 
         view.dispatchTouchEvent(motionEvent)
     }
 }
 
 // TODO(b/169852102 use existing public constructs instead)
-internal fun ComposeBenchmarkRule.toggleStateBenchmark(
-    caseFactory: () -> LazyBenchmarkTestCase
-) {
+internal fun ComposeBenchmarkRule.toggleStateBenchmark(caseFactory: () -> LazyBenchmarkTestCase) {
     runBenchmarkFor(caseFactory) {
-        runOnUiThread {
-            doFramesUntilNoChangesPending()
-        }
+        runOnUiThread { doFramesUntilNoChangesPending() }
 
         measureRepeatedOnUiThread {
             runWithTimingDisabled {
@@ -154,9 +147,7 @@
     caseFactory: () -> LazyBenchmarkTestCase
 ) {
     runBenchmarkFor(caseFactory) {
-        runOnUiThread {
-            doFrame()
-        }
+        runOnUiThread { doFrame() }
 
         measureRepeatedOnUiThread {
             runWithTimingDisabled {
@@ -200,18 +191,21 @@
         val view = LocalView.current
         val touchSlop = LocalViewConfiguration.current.touchSlop
 
-        if (!::scrollingHelper.isInitialized) scrollingHelper = ScrollingHelper(
-            view,
-            MotionEventHelper(view),
-            touchSlop,
-            scrollAmount,
-            isVertical,
-            usePointerInput,
-            ::programmaticScroll
-        )
+        if (!::scrollingHelper.isInitialized)
+            scrollingHelper =
+                ScrollingHelper(
+                    view,
+                    MotionEventHelper(view),
+                    touchSlop,
+                    scrollAmount,
+                    isVertical,
+                    usePointerInput,
+                    ::programmaticScroll
+                )
     }
 
     abstract fun beforeToggleCheck()
+
     abstract fun afterToggleCheck()
 
     abstract suspend fun programmaticScroll(amount: Int)
@@ -239,8 +233,10 @@
             val size = if (isVertical) view.measuredHeight else view.measuredWidth
             motionEventHelper.sendEvent(MotionEvent.ACTION_DOWN, (size / 2f).toSingleAxisOffset())
             motionEventHelper.sendEvent(MotionEvent.ACTION_MOVE, touchSlop.toSingleAxisOffset())
-            motionEventHelper
-                .sendEvent(MotionEvent.ACTION_MOVE, -scrollAmount.toFloat().toSingleAxisOffset())
+            motionEventHelper.sendEvent(
+                MotionEvent.ACTION_MOVE,
+                -scrollAmount.toFloat().toSingleAxisOffset()
+            )
             motionEventHelper.sendEvent(MotionEvent.ACTION_UP, Offset.Zero)
         } else {
             runBlocking { programmaticScroll.invoke(scrollAmount) }
diff --git a/compose/foundation/foundation/benchmark/src/androidTest/java/androidx/compose/foundation/benchmark/lazy/LazyGridScrollingBenchmark.kt b/compose/foundation/foundation/benchmark/src/androidTest/java/androidx/compose/foundation/benchmark/lazy/LazyGridScrollingBenchmark.kt
index bad3856..1b99bd8 100644
--- a/compose/foundation/foundation/benchmark/src/androidTest/java/androidx/compose/foundation/benchmark/lazy/LazyGridScrollingBenchmark.kt
+++ b/compose/foundation/foundation/benchmark/src/androidTest/java/androidx/compose/foundation/benchmark/lazy/LazyGridScrollingBenchmark.kt
@@ -49,11 +49,8 @@
 
 @LargeTest
 @RunWith(Parameterized::class)
-class LazyGridScrollingBenchmark(
-    private val testCase: LazyGridScrollingTestCase
-) {
-    @get:Rule
-    val benchmarkRule = ComposeBenchmarkRule()
+class LazyGridScrollingBenchmark(private val testCase: LazyGridScrollingTestCase) {
+    @get:Rule val benchmarkRule = ComposeBenchmarkRule()
 
     @Test
     fun scrollProgrammatically_noNewItems() {
@@ -132,16 +129,13 @@
     companion object {
         @JvmStatic
         @Parameterized.Parameters(name = "{0}")
-        fun initParameters(): Array<LazyGridScrollingTestCase> =
-            arrayOf(
-                Vertical,
-                Horizontal
-            )
+        fun initParameters(): Array<LazyGridScrollingTestCase> = arrayOf(Vertical, Horizontal)
 
         // Copied from AndroidComposeTestCaseRunner
         private val supportsRenderNode = Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q
-        private val supportsMRenderNode = Build.VERSION.SDK_INT < Build.VERSION_CODES.P &&
-            Build.VERSION.SDK_INT >= Build.VERSION_CODES.M
+        private val supportsMRenderNode =
+            Build.VERSION.SDK_INT < Build.VERSION_CODES.P &&
+                Build.VERSION.SDK_INT >= Build.VERSION_CODES.M
     }
 }
 
@@ -155,47 +149,31 @@
     }
 }
 
-private val Vertical = LazyGridScrollingTestCase(
-    "Vertical",
-    isVertical = true
-) { state ->
-    LazyVerticalGrid(
-        columns = GridCells.Fixed(2),
-        state = state,
-        modifier = Modifier
-            .requiredHeight(400.dp)
-            .fillMaxWidth(),
-        flingBehavior = NoFlingBehavior
-    ) {
-        items(2) {
-            FirstLargeItem()
-        }
-        items(items) {
-            RegularItem()
+private val Vertical =
+    LazyGridScrollingTestCase("Vertical", isVertical = true) { state ->
+        LazyVerticalGrid(
+            columns = GridCells.Fixed(2),
+            state = state,
+            modifier = Modifier.requiredHeight(400.dp).fillMaxWidth(),
+            flingBehavior = NoFlingBehavior
+        ) {
+            items(2) { FirstLargeItem() }
+            items(items) { RegularItem() }
         }
     }
-}
 
-private val Horizontal = LazyGridScrollingTestCase(
-    "Horizontal",
-    isVertical = false
-) { state ->
-    LazyHorizontalGrid(
-        rows = GridCells.Fixed(2),
-        state = state,
-        modifier = Modifier
-            .requiredWidth(400.dp)
-            .fillMaxHeight(),
-        flingBehavior = NoFlingBehavior
-    ) {
-        items(2) {
-            FirstLargeItem()
-        }
-        items(items) {
-            RegularItem()
+private val Horizontal =
+    LazyGridScrollingTestCase("Horizontal", isVertical = false) { state ->
+        LazyHorizontalGrid(
+            rows = GridCells.Fixed(2),
+            state = state,
+            modifier = Modifier.requiredWidth(400.dp).fillMaxHeight(),
+            flingBehavior = NoFlingBehavior
+        ) {
+            items(2) { FirstLargeItem() }
+            items(items) { RegularItem() }
         }
     }
-}
 
 class GridRemeasureTestCase(
     val addNewItemOnToggle: Boolean,
@@ -215,11 +193,12 @@
 
     @Composable
     override fun Content() {
-        val scrollBy = if (addNewItemOnToggle) {
-            with(LocalDensity.current) { 15.dp.roundToPx() }
-        } else {
-            5
-        }
+        val scrollBy =
+            if (addNewItemOnToggle) {
+                with(LocalDensity.current) { 15.dp.roundToPx() }
+            } else {
+                5
+            }
         InitializeScrollHelper(scrollAmount = scrollBy)
         state = rememberLazyGridState()
         content(state)
@@ -227,11 +206,7 @@
 
     @Composable
     fun RegularItem() {
-        Box(
-            Modifier
-                .requiredSize(20.dp)
-                .background(Color.Red, RoundedCornerShape(8.dp))
-        )
+        Box(Modifier.requiredSize(20.dp).background(Color.Red, RoundedCornerShape(8.dp)))
     }
 
     override fun beforeToggleCheck() {
@@ -245,15 +220,11 @@
     }
 
     override suspend fun programmaticScroll(amount: Int) {
-        runBlocking {
-            state.scrollBy(amount.toFloat())
-        }
+        runBlocking { state.scrollBy(amount.toFloat()) }
     }
 
     override fun setUp() {
-        runBlocking {
-            state.scrollToItem(0, 0)
-        }
+        runBlocking { state.scrollToItem(0, 0) }
     }
 
     override fun tearDown() {
diff --git a/compose/foundation/foundation/benchmark/src/androidTest/java/androidx/compose/foundation/benchmark/lazy/LazyListScrollingBenchmark.kt b/compose/foundation/foundation/benchmark/src/androidTest/java/androidx/compose/foundation/benchmark/lazy/LazyListScrollingBenchmark.kt
index 57bd22e..3576b77 100644
--- a/compose/foundation/foundation/benchmark/src/androidTest/java/androidx/compose/foundation/benchmark/lazy/LazyListScrollingBenchmark.kt
+++ b/compose/foundation/foundation/benchmark/src/androidTest/java/androidx/compose/foundation/benchmark/lazy/LazyListScrollingBenchmark.kt
@@ -48,11 +48,8 @@
 
 @LargeTest
 @RunWith(Parameterized::class)
-class LazyListScrollingBenchmark(
-    private val testCase: LazyListScrollingTestCase
-) {
-    @get:Rule
-    val benchmarkRule = ComposeBenchmarkRule()
+class LazyListScrollingBenchmark(private val testCase: LazyListScrollingTestCase) {
+    @get:Rule val benchmarkRule = ComposeBenchmarkRule()
 
     @Test
     fun scrollProgrammatically_noNewItems() {
@@ -155,16 +152,13 @@
     companion object {
         @JvmStatic
         @Parameterized.Parameters(name = "{0}")
-        fun initParameters(): Array<LazyListScrollingTestCase> =
-            arrayOf(
-                LazyColumn,
-                LazyRow
-            )
+        fun initParameters(): Array<LazyListScrollingTestCase> = arrayOf(LazyColumn, LazyRow)
 
         // Copied from AndroidComposeTestCaseRunner
         private val supportsRenderNode = Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q
-        private val supportsMRenderNode = Build.VERSION.SDK_INT < Build.VERSION_CODES.P &&
-            Build.VERSION.SDK_INT >= Build.VERSION_CODES.M
+        private val supportsMRenderNode =
+            Build.VERSION.SDK_INT < Build.VERSION_CODES.P &&
+                Build.VERSION.SDK_INT >= Build.VERSION_CODES.M
     }
 }
 
@@ -178,54 +172,49 @@
     }
 }
 
-private val LazyColumn = LazyListScrollingTestCase(
-    "LazyColumn",
-    isVertical = true
-) { state, useKeys ->
-    LazyColumn(
-        state = state,
-        modifier = Modifier
-            .requiredHeight(400.dp)
-            .fillMaxWidth(),
-        flingBehavior = NoFlingBehavior
-    ) {
-        item(key = if (useKeys) "header" else null) {
-            FirstLargeItem()
-        }
-        items(
-            items, key = if (useKeys) {
-                { it.index }
-            } else {
-                null
-            }) {
-            RegularItem()
+private val LazyColumn =
+    LazyListScrollingTestCase("LazyColumn", isVertical = true) { state, useKeys ->
+        LazyColumn(
+            state = state,
+            modifier = Modifier.requiredHeight(400.dp).fillMaxWidth(),
+            flingBehavior = NoFlingBehavior
+        ) {
+            item(key = if (useKeys) "header" else null) { FirstLargeItem() }
+            items(
+                items,
+                key =
+                    if (useKeys) {
+                        { it.index }
+                    } else {
+                        null
+                    }
+            ) {
+                RegularItem()
+            }
         }
     }
-}
 
-private val LazyRow = LazyListScrollingTestCase(
-    "LazyRow",
-    isVertical = false
-) { state, useKeys ->
-    LazyRow(
-        state = state,
-        modifier = Modifier
-            .requiredWidth(400.dp)
-            .fillMaxHeight(),
-        flingBehavior = NoFlingBehavior
-    ) {
-        item(if (useKeys) "header" else null) {
-            FirstLargeItem()
-        }
-        items(items, key = if (useKeys) {
-            { it.index }
-        } else {
-            null
-        }) {
-            RegularItem()
+private val LazyRow =
+    LazyListScrollingTestCase("LazyRow", isVertical = false) { state, useKeys ->
+        LazyRow(
+            state = state,
+            modifier = Modifier.requiredWidth(400.dp).fillMaxHeight(),
+            flingBehavior = NoFlingBehavior
+        ) {
+            item(if (useKeys) "header" else null) { FirstLargeItem() }
+            items(
+                items,
+                key =
+                    if (useKeys) {
+                        { it.index }
+                    } else {
+                        null
+                    }
+            ) {
+                RegularItem()
+            }
         }
     }
-}
 
 class ListRemeasureTestCase(
     val addNewItemOnToggle: Boolean,
@@ -246,11 +235,12 @@
 
     @Composable
     override fun Content() {
-        val scrollBy = if (addNewItemOnToggle) {
-            with(LocalDensity.current) { 15.dp.roundToPx() }
-        } else {
-            5
-        }
+        val scrollBy =
+            if (addNewItemOnToggle) {
+                with(LocalDensity.current) { 15.dp.roundToPx() }
+            } else {
+                5
+            }
         InitializeScrollHelper(scrollAmount = scrollBy)
         listState = rememberLazyListState()
         content(listState, useKeys)
@@ -258,11 +248,7 @@
 
     @Composable
     fun RegularItem() {
-        Box(
-            Modifier
-                .requiredSize(20.dp)
-                .background(Color.Red, RoundedCornerShape(8.dp))
-        )
+        Box(Modifier.requiredSize(20.dp).background(Color.Red, RoundedCornerShape(8.dp)))
     }
 
     override fun beforeToggleCheck() {
@@ -276,15 +262,11 @@
     }
 
     override suspend fun programmaticScroll(amount: Int) {
-        runBlocking {
-            listState.scrollBy(amount.toFloat())
-        }
+        runBlocking { listState.scrollBy(amount.toFloat()) }
     }
 
     override fun setUp() {
-        runBlocking {
-            listState.scrollToItem(0, 0)
-        }
+        runBlocking { listState.scrollToItem(0, 0) }
     }
 
     override fun tearDown() {
diff --git a/compose/foundation/foundation/benchmark/src/androidTest/java/androidx/compose/foundation/benchmark/lazy/LazyStaggeredGridScrollingBenchmark.kt b/compose/foundation/foundation/benchmark/src/androidTest/java/androidx/compose/foundation/benchmark/lazy/LazyStaggeredGridScrollingBenchmark.kt
index 3bea8e5..e242f16 100644
--- a/compose/foundation/foundation/benchmark/src/androidTest/java/androidx/compose/foundation/benchmark/lazy/LazyStaggeredGridScrollingBenchmark.kt
+++ b/compose/foundation/foundation/benchmark/src/androidTest/java/androidx/compose/foundation/benchmark/lazy/LazyStaggeredGridScrollingBenchmark.kt
@@ -55,8 +55,7 @@
 class LazyStaggeredGridScrollingBenchmark(
     private val testCase: LazyStaggeredGridScrollingTestCase
 ) {
-    @get:Rule
-    val benchmarkRule = ComposeBenchmarkRule()
+    @get:Rule val benchmarkRule = ComposeBenchmarkRule()
 
     @Test
     fun scrollProgrammatically_noNewItems() {
@@ -165,15 +164,13 @@
         @JvmStatic
         @Parameterized.Parameters(name = "{0}")
         fun initParameters(): Array<LazyStaggeredGridScrollingTestCase> =
-            arrayOf(
-                Vertical,
-                Horizontal
-            )
+            arrayOf(Vertical, Horizontal)
 
         // Copied from AndroidComposeTestCaseRunner
         private val supportsRenderNode = Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q
-        private val supportsMRenderNode = Build.VERSION.SDK_INT < Build.VERSION_CODES.P &&
-            Build.VERSION.SDK_INT >= Build.VERSION_CODES.M
+        private val supportsMRenderNode =
+            Build.VERSION.SDK_INT < Build.VERSION_CODES.P &&
+                Build.VERSION.SDK_INT >= Build.VERSION_CODES.M
     }
 }
 
@@ -189,48 +186,32 @@
 }
 
 @OptIn(ExperimentalFoundationApi::class)
-private val Vertical = LazyStaggeredGridScrollingTestCase(
-    "Vertical",
-    isVertical = true
-) { state ->
-    LazyVerticalStaggeredGrid(
-        columns = StaggeredGridCells.Fixed(2),
-        state = state,
-        modifier = Modifier
-            .requiredHeight(400.dp)
-            .fillMaxWidth(),
-        flingBehavior = NoFlingBehavior
-    ) {
-        items(2) {
-            FirstLargeItem()
-        }
-        items(items) {
-            RegularItem()
+private val Vertical =
+    LazyStaggeredGridScrollingTestCase("Vertical", isVertical = true) { state ->
+        LazyVerticalStaggeredGrid(
+            columns = StaggeredGridCells.Fixed(2),
+            state = state,
+            modifier = Modifier.requiredHeight(400.dp).fillMaxWidth(),
+            flingBehavior = NoFlingBehavior
+        ) {
+            items(2) { FirstLargeItem() }
+            items(items) { RegularItem() }
         }
     }
-}
 
 @OptIn(ExperimentalFoundationApi::class)
-private val Horizontal = LazyStaggeredGridScrollingTestCase(
-    "Horizontal",
-    isVertical = false
-) { state ->
-    LazyHorizontalStaggeredGrid(
-        rows = StaggeredGridCells.Fixed(2),
-        state = state,
-        modifier = Modifier
-            .requiredWidth(400.dp)
-            .fillMaxHeight(),
-        flingBehavior = NoFlingBehavior
-    ) {
-        items(2) {
-            FirstLargeItem()
-        }
-        items(items) {
-            RegularItem()
+private val Horizontal =
+    LazyStaggeredGridScrollingTestCase("Horizontal", isVertical = false) { state ->
+        LazyHorizontalStaggeredGrid(
+            rows = StaggeredGridCells.Fixed(2),
+            state = state,
+            modifier = Modifier.requiredWidth(400.dp).fillMaxHeight(),
+            flingBehavior = NoFlingBehavior
+        ) {
+            items(2) { FirstLargeItem() }
+            items(items) { RegularItem() }
         }
     }
-}
 
 @OptIn(ExperimentalFoundationApi::class)
 class StaggeredGridRemeasureTestCase(
@@ -254,25 +235,23 @@
 
     @Composable
     fun RegularItem() {
-        Box(
-            Modifier
-                .requiredSize(20.dp)
-                .background(Color.Red, RoundedCornerShape(8.dp))
-        )
+        Box(Modifier.requiredSize(20.dp).background(Color.Red, RoundedCornerShape(8.dp)))
     }
 
     @Composable
     override fun Content() {
-        val scrollBy = if (addNewItemOnToggle) {
-            with(LocalDensity.current) { 15.dp.roundToPx() }
-        } else {
-            5
-        } * if (scrollUp) -1 else 1
-        targetItemOffset = if (scrollUp) {
-            with(LocalDensity.current) { 20.dp.roundToPx() + scrollBy }
-        } else {
-            scrollBy
-        }
+        val scrollBy =
+            if (addNewItemOnToggle) {
+                with(LocalDensity.current) { 15.dp.roundToPx() }
+            } else {
+                5
+            } * if (scrollUp) -1 else 1
+        targetItemOffset =
+            if (scrollUp) {
+                with(LocalDensity.current) { 20.dp.roundToPx() + scrollBy }
+            } else {
+                scrollBy
+            }
 
         InitializeScrollHelper(scrollAmount = scrollBy)
         state = rememberLazyStaggeredGridState()
@@ -293,15 +272,11 @@
     }
 
     override suspend fun programmaticScroll(amount: Int) {
-        runBlocking {
-            state.scrollBy(amount.toFloat())
-        }
+        runBlocking { state.scrollBy(amount.toFloat()) }
     }
 
     override fun setUp() {
-        runBlocking {
-            state.scrollToItem(firstItemIndex, 0)
-        }
+        runBlocking { state.scrollToItem(firstItemIndex, 0) }
     }
 
     override fun tearDown() {
diff --git a/compose/foundation/foundation/benchmark/src/androidTest/java/androidx/compose/foundation/benchmark/lazy/LazySwitchingStatesBenchmark.kt b/compose/foundation/foundation/benchmark/src/androidTest/java/androidx/compose/foundation/benchmark/lazy/LazySwitchingStatesBenchmark.kt
index 8df6bf0..b486763 100644
--- a/compose/foundation/foundation/benchmark/src/androidTest/java/androidx/compose/foundation/benchmark/lazy/LazySwitchingStatesBenchmark.kt
+++ b/compose/foundation/foundation/benchmark/src/androidTest/java/androidx/compose/foundation/benchmark/lazy/LazySwitchingStatesBenchmark.kt
@@ -44,8 +44,7 @@
 @LargeTest
 @RunWith(AndroidJUnit4::class)
 class LazySwitchingStatesBenchmark {
-    @get:Rule
-    val benchmarkRule = ComposeBenchmarkRule()
+    @get:Rule val benchmarkRule = ComposeBenchmarkRule()
 
     @Test
     fun lazyColumn_switchingItems_composition() {
@@ -67,10 +66,7 @@
         benchmarkRule.runBenchmark(composition = false, switchingStateCount = 1)
     }
 
-    private fun ComposeBenchmarkRule.runBenchmark(
-        composition: Boolean,
-        switchingStateCount: Int
-    ) {
+    private fun ComposeBenchmarkRule.runBenchmark(composition: Boolean, switchingStateCount: Int) {
         runBenchmarkFor(
             { LazyColumnSwitchingItemsCase(readInComposition = composition) },
         ) {
@@ -82,16 +78,12 @@
             measureRepeatedOnUiThread {
                 runWithTimingDisabled {
                     assertNoPendingChanges()
-                    repeat(switchingStateCount) {
-                        getTestCase().toggle(it)
-                    }
+                    repeat(switchingStateCount) { getTestCase().toggle(it) }
                     doFramesUntilIdle()
                     assertNoPendingChanges()
                 }
 
-                repeat(switchingStateCount) {
-                    getTestCase().toggle(it)
-                }
+                repeat(switchingStateCount) { getTestCase().toggle(it) }
                 doFramesUntilIdle()
             }
         }
@@ -100,47 +92,40 @@
 
 // The number is based on height of items below (20 visible + 5 extra).
 private const val NUMBER_OF_LAZY_ITEMS = 25
-class LazyColumnSwitchingItemsCase(
-    private val readInComposition: Boolean = false
-) : ComposeTestCase {
-    val items = List(NUMBER_OF_LAZY_ITEMS) {
-        mutableStateOf(false)
-    }
+
+class LazyColumnSwitchingItemsCase(private val readInComposition: Boolean = false) :
+    ComposeTestCase {
+    val items = List(NUMBER_OF_LAZY_ITEMS) { mutableStateOf(false) }
 
     @Composable
     override fun Content() {
         LazyColumn(
-            Modifier
-                .requiredHeight(400.dp)
-                .fillMaxWidth(),
+            Modifier.requiredHeight(400.dp).fillMaxWidth(),
             flingBehavior = NoFlingBehavior
         ) {
             items(items) { state ->
-                val color = if (readInComposition) {
-                   if (state.value) Color.Blue else Color.Red
-                } else {
-                    Color.Red
-                }
+                val color =
+                    if (readInComposition) {
+                        if (state.value) Color.Blue else Color.Red
+                    } else {
+                        Color.Red
+                    }
                 Box(
-                    Modifier
-                        .width(20.dp)
-                        .height(20.dp)
-                        .drawBehind {
-                            val rectColor = if (readInComposition) {
+                    Modifier.width(20.dp).height(20.dp).drawBehind {
+                        val rectColor =
+                            if (readInComposition) {
                                 color
                             } else {
                                 if (state.value) Color.Blue else Color.Red
                             }
-                            drawRoundRect(rectColor, cornerRadius = CornerRadius(20f))
-                        }
+                        drawRoundRect(rectColor, cornerRadius = CornerRadius(20f))
+                    }
                 )
             }
         }
     }
 
     fun toggle(index: Int) {
-        Snapshot.withoutReadObservation {
-            items[index].value = !items[index].value
-        }
+        Snapshot.withoutReadObservation { items[index].value = !items[index].value }
     }
 }
diff --git a/compose/foundation/foundation/benchmark/src/androidTest/java/androidx/compose/foundation/benchmark/lazy/ReuseBenchmark.kt b/compose/foundation/foundation/benchmark/src/androidTest/java/androidx/compose/foundation/benchmark/lazy/ReuseBenchmark.kt
index 2f41240..f858ddd 100644
--- a/compose/foundation/foundation/benchmark/src/androidTest/java/androidx/compose/foundation/benchmark/lazy/ReuseBenchmark.kt
+++ b/compose/foundation/foundation/benchmark/src/androidTest/java/androidx/compose/foundation/benchmark/lazy/ReuseBenchmark.kt
@@ -40,16 +40,11 @@
 @FixMethodOrder(MethodSorters.NAME_ASCENDING)
 class ReuseBenchmark {
 
-    @get:Rule
-    val rule = ComposeBenchmarkRule()
+    @get:Rule val rule = ComposeBenchmarkRule()
 
     @Test
     fun create_button() {
-        rule.benchmarkCreateFor {
-            Button(onClick = {}) {
-                Text("Hello")
-            }
-        }
+        rule.benchmarkCreateFor { Button(onClick = {}) { Text("Hello") } }
     }
 
     @Test
@@ -66,23 +61,13 @@
     @Test
     fun create_lazy_column() {
         rule.benchmarkCreateFor {
-            LazyColumn {
-                items(10) {
-                    Button(onClick = {}) {
-                        Text("Hello")
-                    }
-                }
-            }
+            LazyColumn { items(10) { Button(onClick = {}) { Text("Hello") } } }
         }
     }
 
     @Test
     fun reuse_button() {
-        rule.benchmarkReuseFor {
-            Button(onClick = {}) {
-                Text("Hello")
-            }
-        }
+        rule.benchmarkReuseFor { Button(onClick = {}) { Text("Hello") } }
     }
 
     @Test
@@ -99,13 +84,7 @@
     @Test
     fun reuse_lazy_column() {
         rule.benchmarkReuseFor {
-            LazyColumn {
-                items(10) {
-                    Button(onClick = {}) {
-                        Text("Hello")
-                    }
-                }
-            }
+            LazyColumn { items(10) { Button(onClick = {}) { Text("Hello") } } }
         }
     }
 
@@ -113,13 +92,7 @@
     fun dispose_lazy_column() {
         rule.disposeBenchmark {
             SubcomposeLayoutReuseTestCase(reusableSlots = 0) {
-                LazyColumn {
-                    items(10) {
-                        Button(onClick = {}) {
-                            Text("Hello")
-                        }
-                    }
-                }
+                LazyColumn { items(10) { Button(onClick = {}) { Text("Hello") } } }
             }
         }
     }
@@ -128,13 +101,7 @@
     fun deactivate_lazy_column() {
         rule.disposeBenchmark {
             SubcomposeLayoutReuseTestCase(reusableSlots = 1) {
-                LazyColumn {
-                    items(10) {
-                        Button(onClick = {}) {
-                            Text("Hello")
-                        }
-                    }
-                }
+                LazyColumn { items(10) { Button(onClick = {}) { Text("Hello") } } }
             }
         }
     }
@@ -147,9 +114,7 @@
 }
 
 private fun ComposeBenchmarkRule.benchmarkCreateFor(content: @Composable () -> Unit) {
-    createBenchmark {
-        SubcomposeLayoutReuseTestCase(reusableSlots = 0, content)
-    }
+    createBenchmark { SubcomposeLayoutReuseTestCase(reusableSlots = 0, content) }
 }
 
 private fun ComposeBenchmarkRule.createBenchmark(
diff --git a/compose/foundation/foundation/benchmark/src/androidTest/java/androidx/compose/foundation/benchmark/pager/PagerBasicBenchmark.kt b/compose/foundation/foundation/benchmark/src/androidTest/java/androidx/compose/foundation/benchmark/pager/PagerBasicBenchmark.kt
index ebe8fb7..53bfa64 100644
--- a/compose/foundation/foundation/benchmark/src/androidTest/java/androidx/compose/foundation/benchmark/pager/PagerBasicBenchmark.kt
+++ b/compose/foundation/foundation/benchmark/src/androidTest/java/androidx/compose/foundation/benchmark/pager/PagerBasicBenchmark.kt
@@ -41,8 +41,7 @@
 import org.junit.Test
 
 class PagerBasicBenchmark {
-    @get:Rule
-    val benchmarkRule = ComposeBenchmarkRule()
+    @get:Rule val benchmarkRule = ComposeBenchmarkRule()
 
     private val fullPageBenchmark = { PagerTestCase() }
     private val multiPageBenchmark = { PagerTestCase(false) }
diff --git a/compose/foundation/foundation/benchmark/src/androidTest/java/androidx/compose/foundation/benchmark/pager/PagerScrollingBenchmark.kt b/compose/foundation/foundation/benchmark/src/androidTest/java/androidx/compose/foundation/benchmark/pager/PagerScrollingBenchmark.kt
index 9987d83..267653a 100644
--- a/compose/foundation/foundation/benchmark/src/androidTest/java/androidx/compose/foundation/benchmark/pager/PagerScrollingBenchmark.kt
+++ b/compose/foundation/foundation/benchmark/src/androidTest/java/androidx/compose/foundation/benchmark/pager/PagerScrollingBenchmark.kt
@@ -56,8 +56,7 @@
 @RunWith(Parameterized::class)
 class PagerScrollingBenchmark(private val testCase: PagerScrollingTestCase) {
 
-    @get:Rule
-    val benchmarkRule = ComposeBenchmarkRule()
+    @get:Rule val benchmarkRule = ComposeBenchmarkRule()
 
     @Test
     fun scrollProgrammatically_noNewPages() {
@@ -198,8 +197,9 @@
 
         // Copied from AndroidComposeTestCaseRunner
         private val supportsRenderNode = Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q
-        private val supportsMRenderNode = Build.VERSION.SDK_INT < Build.VERSION_CODES.P &&
-            Build.VERSION.SDK_INT >= Build.VERSION_CODES.M
+        private val supportsMRenderNode =
+            Build.VERSION.SDK_INT < Build.VERSION_CODES.P &&
+                Build.VERSION.SDK_INT >= Build.VERSION_CODES.M
     }
 }
 
@@ -208,11 +208,9 @@
     private val name: String,
     val isVertical: Boolean,
     val beyondBoundsPageCount: Int,
-    val content: @Composable PagerRemeasureTestCase.(
-        PagerState,
-        useKeys: Boolean,
-        beyondBoundsPageCount: Int
-    ) -> Unit
+    val content:
+        @Composable
+        PagerRemeasureTestCase.(PagerState, useKeys: Boolean, beyondBoundsPageCount: Int) -> Unit
 ) {
     override fun toString(): String {
         return name
@@ -222,11 +220,9 @@
 @OptIn(ExperimentalFoundationApi::class)
 class PagerRemeasureTestCase(
     val addNewItemOnToggle: Boolean,
-    val content: @Composable PagerRemeasureTestCase.(
-        PagerState,
-        useKeys: Boolean,
-        beyondBoundsPageCount: Int
-    ) -> Unit,
+    val content:
+        @Composable
+        PagerRemeasureTestCase.(PagerState, useKeys: Boolean, beyondBoundsPageCount: Int) -> Unit,
     val isVertical: Boolean,
     val usePointerInput: Boolean = false,
     val useKeys: Boolean = true,
@@ -256,15 +252,13 @@
     }
 
     override fun setUp() {
-        runBlocking {
-            pagerState.scrollToPage(0, 0.0f)
-        }
+        runBlocking { pagerState.scrollToPage(0, 0.0f) }
     }
 
     override fun tearDown() {
         runBlocking {
             try {
-                pagerState.scroll { }
+                pagerState.scroll {}
             } catch (_: CancellationException) {
                 // prevent snapping
             }
@@ -273,44 +267,43 @@
 
     @Composable
     override fun Content() {
-        val scrollBy = if (addNewItemOnToggle) {
-            with(LocalDensity.current) { 5.dp.roundToPx() }
-        } else {
-            1
-        }
+        val scrollBy =
+            if (addNewItemOnToggle) {
+                with(LocalDensity.current) { 5.dp.roundToPx() }
+            } else {
+                1
+            }
         InitializeScrollHelper(scrollAmount = scrollBy)
         pagerState = rememberPagerState { pageCount }
         content(pagerState, useKeys, beyondBoundsPageCount)
     }
 }
 
-val NoOpInfoProvider = object : SnapLayoutInfoProvider {
-    override fun calculateApproachOffset(velocity: Float, decayOffset: Float): Float =
-        0.0f
+val NoOpInfoProvider =
+    object : SnapLayoutInfoProvider {
+        override fun calculateApproachOffset(velocity: Float, decayOffset: Float): Float = 0.0f
 
-    override fun calculateSnapOffset(velocity: Float): Float {
-        return 0f
+        override fun calculateSnapOffset(velocity: Float): Float {
+            return 0f
+        }
     }
-}
 
-val VerticalPagerContent: @Composable PagerRemeasureTestCase.(
-    state: PagerState,
-    useKeys: Boolean,
-    beyondBoundsPageCount: Int
-) -> Unit =
+val VerticalPagerContent:
+    @Composable
+    PagerRemeasureTestCase.(
+        state: PagerState, useKeys: Boolean, beyondBoundsPageCount: Int
+    ) -> Unit =
     { state, useKeys, beyondBoundsPageCount ->
-        val flingBehavior = rememberSnapFlingBehavior(
-            snapLayoutInfoProvider = NoOpInfoProvider
-        )
+        val flingBehavior = rememberSnapFlingBehavior(snapLayoutInfoProvider = NoOpInfoProvider)
         VerticalPager(
-            state = state, modifier = Modifier
-                .requiredHeight(400.dp)
-                .fillMaxWidth(),
-            key = if (useKeys) {
-                { pages[it].index }
-            } else {
-                null
-            },
+            state = state,
+            modifier = Modifier.requiredHeight(400.dp).fillMaxWidth(),
+            key =
+                if (useKeys) {
+                    { pages[it].index }
+                } else {
+                    null
+                },
             pageSize = PageSize.Fixed(30.dp),
             beyondViewportPageCount = beyondBoundsPageCount,
             flingBehavior = flingBehavior
@@ -319,24 +312,22 @@
         }
     }
 
-val HorizontalPagerContent: @Composable PagerRemeasureTestCase.(
-    state: PagerState,
-    useKeys: Boolean,
-    beyondBoundsPageCount: Int
-) -> Unit =
+val HorizontalPagerContent:
+    @Composable
+    PagerRemeasureTestCase.(
+        state: PagerState, useKeys: Boolean, beyondBoundsPageCount: Int
+    ) -> Unit =
     { state, useKeys, beyondBoundsPageCount ->
-        val flingBehavior = rememberSnapFlingBehavior(
-            snapLayoutInfoProvider = NoOpInfoProvider
-        )
+        val flingBehavior = rememberSnapFlingBehavior(snapLayoutInfoProvider = NoOpInfoProvider)
         HorizontalPager(
-            state = state, modifier = Modifier
-                .requiredWidth(400.dp)
-                .fillMaxHeight(),
-            key = if (useKeys) {
-                { pages[it].index }
-            } else {
-                null
-            },
+            state = state,
+            modifier = Modifier.requiredWidth(400.dp).fillMaxHeight(),
+            key =
+                if (useKeys) {
+                    { pages[it].index }
+                } else {
+                    null
+                },
             pageSize = PageSize.Fixed(30.dp),
             beyondViewportPageCount = beyondBoundsPageCount,
             flingBehavior = flingBehavior
diff --git a/compose/foundation/foundation/benchmark/src/androidTest/java/androidx/compose/foundation/benchmark/text/AnnotatedTextInColumnTestCase.kt b/compose/foundation/foundation/benchmark/src/androidTest/java/androidx/compose/foundation/benchmark/text/AnnotatedTextInColumnTestCase.kt
index 67ffa52..d0c8e82 100644
--- a/compose/foundation/foundation/benchmark/src/androidTest/java/androidx/compose/foundation/benchmark/text/AnnotatedTextInColumnTestCase.kt
+++ b/compose/foundation/foundation/benchmark/src/androidTest/java/androidx/compose/foundation/benchmark/text/AnnotatedTextInColumnTestCase.kt
@@ -33,9 +33,7 @@
 import androidx.compose.ui.unit.Dp
 import androidx.compose.ui.unit.TextUnit
 
-/**
- * The benchmark test case for [Text], where the input is a plain annotated string.
- */
+/** The benchmark test case for [Text], where the input is a plain annotated string. */
 class AnnotatedTextInColumnTestCase(
     private val texts: List<AnnotatedString>,
     private val width: Dp,
@@ -54,8 +52,10 @@
     @Composable
     override fun ContentWrappers(content: @Composable () -> Unit) {
         Column(
-            modifier = Modifier.wrapContentSize(Alignment.Center).width(width)
-                .verticalScroll(rememberScrollState())
+            modifier =
+                Modifier.wrapContentSize(Alignment.Center)
+                    .width(width)
+                    .verticalScroll(rememberScrollState())
         ) {
             content()
         }
diff --git a/compose/foundation/foundation/benchmark/src/androidTest/java/androidx/compose/foundation/benchmark/text/BasicTextField2ToggleTextBenchmark.kt b/compose/foundation/foundation/benchmark/src/androidTest/java/androidx/compose/foundation/benchmark/text/BasicTextField2ToggleTextBenchmark.kt
index bb2d93c..498b9bc 100644
--- a/compose/foundation/foundation/benchmark/src/androidTest/java/androidx/compose/foundation/benchmark/text/BasicTextField2ToggleTextBenchmark.kt
+++ b/compose/foundation/foundation/benchmark/src/androidTest/java/androidx/compose/foundation/benchmark/text/BasicTextField2ToggleTextBenchmark.kt
@@ -40,9 +40,7 @@
 
 @SmallTest
 @RunWith(Parameterized::class)
-class BasicTextField2ToggleTextBenchmark(
-    private val textLength: Int
-) {
+class BasicTextField2ToggleTextBenchmark(private val textLength: Int) {
     companion object {
         @JvmStatic
         @Parameterized.Parameters(name = "length={0}")
@@ -52,10 +50,7 @@
     private val textBenchmarkRule = TextBenchmarkTestRule()
     private val benchmarkRule = ComposeBenchmarkRule()
 
-    @get:Rule
-    val testRule = RuleChain
-        .outerRule(textBenchmarkRule)
-        .around(benchmarkRule)
+    @get:Rule val testRule = RuleChain.outerRule(textBenchmarkRule).around(benchmarkRule)
 
     private val width = textBenchmarkRule.widthDp.dp
     private val fontSize = textBenchmarkRule.fontSizeSp.sp
@@ -73,8 +68,8 @@
     }
 
     /**
-     * Measure the time taken to compose a [BasicTextField] composable from scratch with the
-     * given input. This is the time taken to call the [BasicTextField] composable function.
+     * Measure the time taken to compose a [BasicTextField] composable from scratch with the given
+     * input. This is the time taken to call the [BasicTextField] composable function.
      */
     @Test
     fun first_compose() {
@@ -110,8 +105,8 @@
     }
 
     /**
-     * Measure the time taken by layout the [BasicTextField] composable after the layout
-     * constrains changed. This is mainly the time used to re-measure and re-layout the composable.
+     * Measure the time taken by layout the [BasicTextField] composable after the layout constrains
+     * changed. This is mainly the time used to re-measure and re-layout the composable.
      */
     @Test
     fun layout() {
@@ -126,9 +121,7 @@
         benchmarkRule.toggleStateBenchmarkRecompose(caseFactory, requireRecomposition = false)
     }
 
-    /**
-     * Measure the time taken to measure the [BasicTextField] composable when text gets toggled.
-     */
+    /** Measure the time taken to measure the [BasicTextField] composable when text gets toggled. */
     @Test
     fun toggleText_measure() {
         benchmarkRule.toggleStateBenchmarkMeasure(
@@ -138,9 +131,7 @@
         )
     }
 
-    /**
-     * Measure the time taken to layout the [BasicTextField] composable when text gets toggled.
-     */
+    /** Measure the time taken to layout the [BasicTextField] composable when text gets toggled. */
     @Test
     fun toggleText_layout() {
         benchmarkRule.toggleStateBenchmarkLayout(
@@ -150,9 +141,7 @@
         )
     }
 
-    /**
-     * Measure the time taken to draw the [BasicTextField] composable when text gets toggled.
-     */
+    /** Measure the time taken to draw the [BasicTextField] composable when text gets toggled. */
     @Test
     fun toggleText_draw() {
         benchmarkRule.toggleStateBenchmarkDraw(
diff --git a/compose/foundation/foundation/benchmark/src/androidTest/java/androidx/compose/foundation/benchmark/text/BasicTextField2ToggleTextTestCase.kt b/compose/foundation/foundation/benchmark/src/androidTest/java/androidx/compose/foundation/benchmark/text/BasicTextField2ToggleTextTestCase.kt
index c22686e..070298b 100644
--- a/compose/foundation/foundation/benchmark/src/androidTest/java/androidx/compose/foundation/benchmark/text/BasicTextField2ToggleTextTestCase.kt
+++ b/compose/foundation/foundation/benchmark/src/androidTest/java/androidx/compose/foundation/benchmark/text/BasicTextField2ToggleTextTestCase.kt
@@ -49,9 +49,8 @@
     private val fontSize: TextUnit
 ) : LayeredComposeTestCase(), ToggleableTestCase {
 
-    private val states = List(textNumber) {
-        TextFieldState(textGenerator.nextParagraph(length = textLength))
-    }
+    private val states =
+        List(textNumber) { TextFieldState(textGenerator.nextParagraph(length = textLength)) }
 
     @Composable
     override fun MeasuredContent() {
@@ -59,20 +58,14 @@
             BasicTextField(
                 state = state,
                 textStyle = TextStyle(color = Color.Black, fontSize = fontSize),
-                modifier = Modifier
-                    .background(color = Color.Cyan)
-                    .requiredWidth(width)
+                modifier = Modifier.background(color = Color.Cyan).requiredWidth(width)
             )
         }
     }
 
     @Composable
     override fun ContentWrappers(content: @Composable () -> Unit) {
-        Column(
-            modifier = Modifier
-                .width(width)
-                .verticalScroll(rememberScrollState())
-        ) {
+        Column(modifier = Modifier.width(width).verticalScroll(rememberScrollState())) {
             InterceptPlatformTextInput(
                 interceptor = { _, _ -> awaitCancellation() },
                 content = content
diff --git a/compose/foundation/foundation/benchmark/src/androidTest/java/androidx/compose/foundation/benchmark/text/ParamUtils.kt b/compose/foundation/foundation/benchmark/src/androidTest/java/androidx/compose/foundation/benchmark/text/ParamUtils.kt
index b60780a..b960a01 100644
--- a/compose/foundation/foundation/benchmark/src/androidTest/java/androidx/compose/foundation/benchmark/text/ParamUtils.kt
+++ b/compose/foundation/foundation/benchmark/src/androidTest/java/androidx/compose/foundation/benchmark/text/ParamUtils.kt
@@ -16,24 +16,22 @@
 
 package androidx.compose.foundation.benchmark.text
 
-/**
- * On CI we only track a subset of metrics, to run a full suite for analysis set this to true.
- */
+/** On CI we only track a subset of metrics, to run a full suite for analysis set this to true. */
 internal const val DoFullBenchmark = false
 
 fun <T> List<Array<T>>.filterForCi(
     selector: List<Array<T>>.() -> Array<T> = { first() }
-): List<Array<T>> = if (DoFullBenchmark) {
-    this
-} else {
-    listOf(selector())
-}
+): List<Array<T>> =
+    if (DoFullBenchmark) {
+        this
+    } else {
+        listOf(selector())
+    }
 
 @Suppress("UNCHECKED_CAST")
-fun Array<Int>.filterForCi(
-    selector: Array<Int>.() -> Int = { min() }
-): Array<Any> = if (DoFullBenchmark) {
-    this as Array<Any>
-} else {
-    arrayOf(selector())
-}
+fun Array<Int>.filterForCi(selector: Array<Int>.() -> Int = { min() }): Array<Any> =
+    if (DoFullBenchmark) {
+        this as Array<Any>
+    } else {
+        arrayOf(selector())
+    }
diff --git a/compose/foundation/foundation/benchmark/src/androidTest/java/androidx/compose/foundation/benchmark/text/TextBasicBenchmark.kt b/compose/foundation/foundation/benchmark/src/androidTest/java/androidx/compose/foundation/benchmark/text/TextBasicBenchmark.kt
index 2f34336..8e159e1 100644
--- a/compose/foundation/foundation/benchmark/src/androidTest/java/androidx/compose/foundation/benchmark/text/TextBasicBenchmark.kt
+++ b/compose/foundation/foundation/benchmark/src/androidTest/java/androidx/compose/foundation/benchmark/text/TextBasicBenchmark.kt
@@ -35,25 +35,19 @@
 import org.junit.runner.RunWith
 import org.junit.runners.Parameterized
 
-/**
- * The benchmark for [Text] composable with the input being a plain string.
- */
+/** The benchmark for [Text] composable with the input being a plain string. */
 @LargeTest
 @RunWith(Parameterized::class)
-class TextBasicBenchmark(
-    private val textLength: Int
-) {
+class TextBasicBenchmark(private val textLength: Int) {
     companion object {
         @JvmStatic
         @Parameterized.Parameters(name = "length={0}")
         fun initParameters(): Array<Any> = arrayOf(32, 512).filterForCi()
     }
 
-    @get:Rule
-    val textBenchmarkRule = TextBenchmarkTestRule()
+    @get:Rule val textBenchmarkRule = TextBenchmarkTestRule()
 
-    @get:Rule
-    val benchmarkRule = ComposeBenchmarkRule()
+    @get:Rule val benchmarkRule = ComposeBenchmarkRule()
 
     private val width = textBenchmarkRule.widthDp.dp
     private val fontSize = textBenchmarkRule.fontSizeSp.sp
@@ -63,23 +57,18 @@
             /**
              * Text render has a word cache in the underlying system. To get a proper metric of its
              * performance, the cache needs to be disabled, which unfortunately is not doable via
-             * public API. Here is a workaround which generates a new string when a new test case
-             * is created.
+             * public API. Here is a workaround which generates a new string when a new test case is
+             * created.
              */
-            val texts = List(textBenchmarkRule.repeatTimes) {
-                textGenerator.nextParagraph(textLength)
-            }
-            TextInColumnTestCase(
-                texts = texts,
-                width = width,
-                fontSize = fontSize
-            )
+            val texts =
+                List(textBenchmarkRule.repeatTimes) { textGenerator.nextParagraph(textLength) }
+            TextInColumnTestCase(texts = texts, width = width, fontSize = fontSize)
         }
     }
 
     /**
-     * Measure the time taken to compose a [Text] composable from scratch with the given input.
-     * This is the time taken to call the [Text] composable function.
+     * Measure the time taken to compose a [Text] composable from scratch with the given input. This
+     * is the time taken to call the [Text] composable function.
      */
     @Test
     fun first_compose() {
@@ -104,9 +93,7 @@
         benchmarkRule.benchmarkFirstLayout(caseFactory)
     }
 
-    /**
-     * Measure the time taken by first time draw the [Text] composable with the given input.
-     */
+    /** Measure the time taken by first time draw the [Text] composable with the given input. */
     @Test
     fun first_draw() {
         benchmarkRule.benchmarkFirstDraw(caseFactory)
@@ -121,33 +108,25 @@
         benchmarkRule.benchmarkLayoutPerf(caseFactory)
     }
 
-    /**
-     * Measure the time taken to recompose the [Text] composable when color gets toggled.
-     */
+    /** Measure the time taken to recompose the [Text] composable when color gets toggled. */
     @Test
     fun toggleColor_recompose() {
         benchmarkRule.toggleStateBenchmarkRecompose(caseFactory)
     }
 
-    /**
-     * Measure the time taken to measure the [Text] composable when color gets toggled.
-     */
+    /** Measure the time taken to measure the [Text] composable when color gets toggled. */
     @Test
     fun toggleColor_measure() {
         benchmarkRule.toggleStateBenchmarkMeasure(caseFactory)
     }
 
-    /**
-     * Measure the time taken to layout the [Text] composable when color gets toggled.
-     */
+    /** Measure the time taken to layout the [Text] composable when color gets toggled. */
     @Test
     fun toggleColor_layout() {
         benchmarkRule.toggleStateBenchmarkLayout(caseFactory)
     }
 
-    /**
-     * Measure the time taken to draw the [Text] composable when color gets toggled.
-     */
+    /** Measure the time taken to draw the [Text] composable when color gets toggled. */
     @Test
     fun toggleColor_draw() {
         benchmarkRule.toggleStateBenchmarkDraw(caseFactory)
diff --git a/compose/foundation/foundation/benchmark/src/androidTest/java/androidx/compose/foundation/benchmark/text/TextEllipsisBenchmark.kt b/compose/foundation/foundation/benchmark/src/androidTest/java/androidx/compose/foundation/benchmark/text/TextEllipsisBenchmark.kt
index d8e8c73..b717d81 100644
--- a/compose/foundation/foundation/benchmark/src/androidTest/java/androidx/compose/foundation/benchmark/text/TextEllipsisBenchmark.kt
+++ b/compose/foundation/foundation/benchmark/src/androidTest/java/androidx/compose/foundation/benchmark/text/TextEllipsisBenchmark.kt
@@ -29,25 +29,19 @@
 import org.junit.runner.RunWith
 import org.junit.runners.Parameterized
 
-/**
- * The benchmark for a Text composable with ellipsis and restricted height.
- */
+/** The benchmark for a Text composable with ellipsis and restricted height. */
 @LargeTest
 @RunWith(Parameterized::class)
-class TextEllipsisBenchmark(
-    private val textLength: Int
-) {
+class TextEllipsisBenchmark(private val textLength: Int) {
     companion object {
         @JvmStatic
         @Parameterized.Parameters(name = "length={0}")
         fun initParameters(): Array<Any> = arrayOf(32, 128, 512).filterForCi { max() }
     }
 
-    @get:Rule
-    val textBenchmarkRule = TextBenchmarkTestRule()
+    @get:Rule val textBenchmarkRule = TextBenchmarkTestRule()
 
-    @get:Rule
-    val benchmarkRule = ComposeBenchmarkRule()
+    @get:Rule val benchmarkRule = ComposeBenchmarkRule()
 
     private val width = textBenchmarkRule.widthDp.dp
     private val fontSize = textBenchmarkRule.fontSizeSp.sp
@@ -57,17 +51,12 @@
             /**
              * Text render has a word cache in the underlying system. To get a proper metric of its
              * performance, the cache needs to be disabled, which unfortunately is not doable via
-             * public API. Here is a workaround which generates a new string when a new test case
-             * is created.
+             * public API. Here is a workaround which generates a new string when a new test case is
+             * created.
              */
-            val texts = List(textBenchmarkRule.repeatTimes) {
-                textGenerator.nextParagraph(textLength)
-            }
-            TextWithEllipsisTestCase(
-                texts = texts,
-                width = width,
-                fontSize = fontSize
-            )
+            val texts =
+                List(textBenchmarkRule.repeatTimes) { textGenerator.nextParagraph(textLength) }
+            TextWithEllipsisTestCase(texts = texts, width = width, fontSize = fontSize)
         }
     }
 
@@ -89,9 +78,7 @@
         benchmarkRule.benchmarkFirstLayout(caseFactory)
     }
 
-    /**
-     * Measure the time taken to layout the a Text composable when alignment gets toggled.
-     */
+    /** Measure the time taken to layout the a Text composable when alignment gets toggled. */
     @Test
     fun toggleAlignment_measureLayout() {
         benchmarkRule.toggleStateBenchmarkMeasureLayout(caseFactory, assertOneRecomposition = false)
diff --git a/compose/foundation/foundation/benchmark/src/androidTest/java/androidx/compose/foundation/benchmark/text/TextFieldToggleTextBenchmark.kt b/compose/foundation/foundation/benchmark/src/androidTest/java/androidx/compose/foundation/benchmark/text/TextFieldToggleTextBenchmark.kt
index cfc5e10..3916ef14 100644
--- a/compose/foundation/foundation/benchmark/src/androidTest/java/androidx/compose/foundation/benchmark/text/TextFieldToggleTextBenchmark.kt
+++ b/compose/foundation/foundation/benchmark/src/androidTest/java/androidx/compose/foundation/benchmark/text/TextFieldToggleTextBenchmark.kt
@@ -38,9 +38,7 @@
 
 @SmallTest
 @RunWith(Parameterized::class)
-class TextFieldToggleTextBenchmark(
-    private val textLength: Int
-) {
+class TextFieldToggleTextBenchmark(private val textLength: Int) {
     companion object {
         @JvmStatic
         @Parameterized.Parameters(name = "length={0}")
@@ -50,10 +48,7 @@
     private val textBenchmarkRule = TextBenchmarkTestRule()
     private val benchmarkRule = ComposeBenchmarkRule()
 
-    @get:Rule
-    val testRule = RuleChain
-        .outerRule(textBenchmarkRule)
-        .around(benchmarkRule)
+    @get:Rule val testRule = RuleChain.outerRule(textBenchmarkRule).around(benchmarkRule)
 
     private val width = textBenchmarkRule.widthDp.dp
     private val fontSize = textBenchmarkRule.fontSizeSp.sp
@@ -71,8 +66,8 @@
     }
 
     /**
-     * Measure the time taken to compose a [BasicTextField] composable from scratch with the
-     * given input. This is the time taken to call the [BasicTextField] composable function.
+     * Measure the time taken to compose a [BasicTextField] composable from scratch with the given
+     * input. This is the time taken to call the [BasicTextField] composable function.
      */
     @Test
     fun first_compose() {
@@ -108,8 +103,8 @@
     }
 
     /**
-     * Measure the time taken by layout the [BasicTextField] composable after the layout
-     * constrains changed. This is mainly the time used to re-measure and re-layout the composable.
+     * Measure the time taken by layout the [BasicTextField] composable after the layout constrains
+     * changed. This is mainly the time used to re-measure and re-layout the composable.
      */
     @Test
     fun layout() {
@@ -124,25 +119,19 @@
         benchmarkRule.toggleStateBenchmarkRecompose(caseFactory)
     }
 
-    /**
-     * Measure the time taken to measure the [BasicTextField] composable when text gets toggled.
-     */
+    /** Measure the time taken to measure the [BasicTextField] composable when text gets toggled. */
     @Test
     fun toggleText_measure() {
         benchmarkRule.toggleStateBenchmarkMeasure(caseFactory, assertOneRecomposition = false)
     }
 
-    /**
-     * Measure the time taken to layout the [BasicTextField] composable when text gets toggled.
-     */
+    /** Measure the time taken to layout the [BasicTextField] composable when text gets toggled. */
     @Test
     fun toggleText_layout() {
         benchmarkRule.toggleStateBenchmarkLayout(caseFactory, assertOneRecomposition = false)
     }
 
-    /**
-     * Measure the time taken to draw the [BasicTextField] composable when text gets toggled.
-     */
+    /** Measure the time taken to draw the [BasicTextField] composable when text gets toggled. */
     @Test
     fun toggleText_draw() {
         benchmarkRule.toggleStateBenchmarkDraw(caseFactory)
diff --git a/compose/foundation/foundation/benchmark/src/androidTest/java/androidx/compose/foundation/benchmark/text/TextFieldToggleTextTestCase.kt b/compose/foundation/foundation/benchmark/src/androidTest/java/androidx/compose/foundation/benchmark/text/TextFieldToggleTextTestCase.kt
index 1869dc0..fad7cf2 100644
--- a/compose/foundation/foundation/benchmark/src/androidTest/java/androidx/compose/foundation/benchmark/text/TextFieldToggleTextTestCase.kt
+++ b/compose/foundation/foundation/benchmark/src/androidTest/java/androidx/compose/foundation/benchmark/text/TextFieldToggleTextTestCase.kt
@@ -55,9 +55,8 @@
 
     private val textInputService = TextInputService(TestPlatformTextInputService())
 
-    private val texts = List(textNumber) {
-        mutableStateOf(textGenerator.nextParagraph(length = textLength))
-    }
+    private val texts =
+        List(textNumber) { mutableStateOf(textGenerator.nextParagraph(length = textLength)) }
 
     @OptIn(ExperimentalFoundationApi::class)
     @Composable
@@ -74,19 +73,13 @@
 
     @Composable
     override fun ContentWrappers(content: @Composable () -> Unit) {
-        Column(
-            modifier = Modifier.width(width).verticalScroll(rememberScrollState())
-        ) {
-            CompositionLocalProvider(LocalTextInputService provides textInputService) {
-                content()
-            }
+        Column(modifier = Modifier.width(width).verticalScroll(rememberScrollState())) {
+            CompositionLocalProvider(LocalTextInputService provides textInputService) { content() }
         }
     }
 
     override fun toggleState() {
-        texts.forEach {
-            it.value = textGenerator.nextParagraph(length = textLength)
-        }
+        texts.forEach { it.value = textGenerator.nextParagraph(length = textLength) }
     }
 
     private class TestPlatformTextInputService : PlatformTextInputService {
@@ -95,10 +88,22 @@
             imeOptions: ImeOptions,
             onEditCommand: (List<EditCommand>) -> Unit,
             onImeActionPerformed: (ImeAction) -> Unit
-        ) { /*do nothing*/ }
-        override fun stopInput() { /*do nothing*/ }
-        override fun showSoftwareKeyboard() { /*do nothing*/ }
-        override fun hideSoftwareKeyboard() { /*do nothing*/ }
+        ) {
+            /*do nothing*/
+        }
+
+        override fun stopInput() {
+            /*do nothing*/
+        }
+
+        override fun showSoftwareKeyboard() {
+            /*do nothing*/
+        }
+
+        override fun hideSoftwareKeyboard() {
+            /*do nothing*/
+        }
+
         override fun updateState(oldValue: TextFieldValue?, newValue: TextFieldValue) {
             /*do nothing*/
         }
diff --git a/compose/foundation/foundation/benchmark/src/androidTest/java/androidx/compose/foundation/benchmark/text/TextInColumnTestCase.kt b/compose/foundation/foundation/benchmark/src/androidTest/java/androidx/compose/foundation/benchmark/text/TextInColumnTestCase.kt
index a4d56ed..0489a6b 100644
--- a/compose/foundation/foundation/benchmark/src/androidTest/java/androidx/compose/foundation/benchmark/text/TextInColumnTestCase.kt
+++ b/compose/foundation/foundation/benchmark/src/androidTest/java/androidx/compose/foundation/benchmark/text/TextInColumnTestCase.kt
@@ -32,9 +32,7 @@
 import androidx.compose.ui.unit.Dp
 import androidx.compose.ui.unit.TextUnit
 
-/**
- * The benchmark test case for [Text], where the input is a plain string.
- */
+/** The benchmark test case for [Text], where the input is a plain string. */
 class TextInColumnTestCase(
     private val texts: List<String>,
     private val width: Dp,
@@ -53,8 +51,10 @@
     @Composable
     override fun ContentWrappers(content: @Composable () -> Unit) {
         Column(
-            modifier = Modifier.wrapContentSize(Alignment.Center).width(width)
-                .verticalScroll(rememberScrollState())
+            modifier =
+                Modifier.wrapContentSize(Alignment.Center)
+                    .width(width)
+                    .verticalScroll(rememberScrollState())
         ) {
             content()
         }
diff --git a/compose/foundation/foundation/benchmark/src/androidTest/java/androidx/compose/foundation/benchmark/text/TextMultiStyleBenchmark.kt b/compose/foundation/foundation/benchmark/src/androidTest/java/androidx/compose/foundation/benchmark/text/TextMultiStyleBenchmark.kt
index c2fb0f1..f464d07 100644
--- a/compose/foundation/foundation/benchmark/src/androidTest/java/androidx/compose/foundation/benchmark/text/TextMultiStyleBenchmark.kt
+++ b/compose/foundation/foundation/benchmark/src/androidTest/java/androidx/compose/foundation/benchmark/text/TextMultiStyleBenchmark.kt
@@ -38,24 +38,16 @@
  */
 @LargeTest
 @RunWith(Parameterized::class)
-class TextMultiStyleBenchmark(
-    private val textLength: Int,
-    private val styleCount: Int
-) {
+class TextMultiStyleBenchmark(private val textLength: Int, private val styleCount: Int) {
     companion object {
         @JvmStatic
         @Parameterized.Parameters(name = "length={0} styleCount={1}")
-        fun initParameters() = cartesian(
-            arrayOf(32, 512),
-            arrayOf(0, 32)
-        ).filterForCi { last() }
+        fun initParameters() = cartesian(arrayOf(32, 512), arrayOf(0, 32)).filterForCi { last() }
     }
 
-    @get:Rule
-    val textBenchmarkRule = TextBenchmarkTestRule()
+    @get:Rule val textBenchmarkRule = TextBenchmarkTestRule()
 
-    @get:Rule
-    val benchmarkRule = ComposeBenchmarkRule()
+    @get:Rule val benchmarkRule = ComposeBenchmarkRule()
 
     private val width = textBenchmarkRule.widthDp.dp
     private val fontSize = textBenchmarkRule.fontSizeSp.sp
@@ -65,21 +57,18 @@
             /**
              * Text render has a word cache in the underlying system. To get a proper metric of its
              * performance, the cache needs to be disabled, which unfortunately is not doable via
-             * public API. Here is a workaround which generates a new string when a new test case
-             * is created.
+             * public API. Here is a workaround which generates a new string when a new test case is
+             * created.
              */
-            val texts = List(textBenchmarkRule.repeatTimes) {
-                textGenerator.nextAnnotatedString(
-                    length = textLength,
-                    styleCount = styleCount,
-                    hasMetricAffectingStyle = true
-                )
-            }
-            AnnotatedTextInColumnTestCase(
-                texts = texts,
-                width = width,
-                fontSize = fontSize
-            )
+            val texts =
+                List(textBenchmarkRule.repeatTimes) {
+                    textGenerator.nextAnnotatedString(
+                        length = textLength,
+                        styleCount = styleCount,
+                        hasMetricAffectingStyle = true
+                    )
+                }
+            AnnotatedTextInColumnTestCase(texts = texts, width = width, fontSize = fontSize)
         }
     }
 
@@ -110,19 +99,15 @@
         benchmarkRule.benchmarkFirstLayout(caseFactory)
     }
 
-    /**
-     * Measure the time taken by first time draw the Text composable with styled text
-     * as input.
-     */
+    /** Measure the time taken by first time draw the Text composable with styled text as input. */
     @Test
     fun first_draw() {
         benchmarkRule.benchmarkFirstDraw(caseFactory)
     }
 
     /**
-     * Measure the time taken by layout a Text composable with styled text input, when
-     * layout constrains changed.
-     * This is mainly the time used to re-measure and re-layout the composable.
+     * Measure the time taken by layout a Text composable with styled text input, when layout
+     * constrains changed. This is mainly the time used to re-measure and re-layout the composable.
      */
     @Test
     fun layout() {
diff --git a/compose/foundation/foundation/benchmark/src/androidTest/java/androidx/compose/foundation/benchmark/text/TextToggleTextBenchmark.kt b/compose/foundation/foundation/benchmark/src/androidTest/java/androidx/compose/foundation/benchmark/text/TextToggleTextBenchmark.kt
index 8fc96f7..ca8b266 100644
--- a/compose/foundation/foundation/benchmark/src/androidTest/java/androidx/compose/foundation/benchmark/text/TextToggleTextBenchmark.kt
+++ b/compose/foundation/foundation/benchmark/src/androidTest/java/androidx/compose/foundation/benchmark/text/TextToggleTextBenchmark.kt
@@ -31,20 +31,16 @@
 
 @SmallTest
 @RunWith(Parameterized::class)
-class TextToggleTextBenchmark(
-    private val textLength: Int
-) {
+class TextToggleTextBenchmark(private val textLength: Int) {
     companion object {
         @JvmStatic
         @Parameterized.Parameters(name = "length={0}")
         fun initParameters(): Array<Any> = arrayOf(32, 512).filterForCi()
     }
 
-    @get:Rule
-    val textBenchmarkRule = TextBenchmarkTestRule()
+    @get:Rule val textBenchmarkRule = TextBenchmarkTestRule()
 
-    @get:Rule
-    val benchmarkRule = ComposeBenchmarkRule()
+    @get:Rule val benchmarkRule = ComposeBenchmarkRule()
 
     private val width = textBenchmarkRule.widthDp.dp
     private val fontSize = textBenchmarkRule.fontSizeSp.sp
@@ -61,25 +57,19 @@
         }
     }
 
-    /**
-     * Measure the time taken to recompose the [Text] composable when text gets toggled.
-     */
+    /** Measure the time taken to recompose the [Text] composable when text gets toggled. */
     @Test
     fun toggleText_recompose() {
         benchmarkRule.toggleStateBenchmarkRecompose(caseFactory)
     }
 
-    /**
-     * Measure the time taken to measure the [Text] composable when text gets toggled.
-     */
+    /** Measure the time taken to measure the [Text] composable when text gets toggled. */
     @Test
     fun toggleText_measureLayout() {
         benchmarkRule.toggleStateBenchmarkMeasureLayout(caseFactory, assertOneRecomposition = false)
     }
 
-    /**
-     * Measure the time taken to draw the [Text] composable when text gets toggled.
-     */
+    /** Measure the time taken to draw the [Text] composable when text gets toggled. */
     @Test
     fun toggleText_draw() {
         benchmarkRule.toggleStateBenchmarkDraw(caseFactory)
diff --git a/compose/foundation/foundation/benchmark/src/androidTest/java/androidx/compose/foundation/benchmark/text/TextToggleTextTestCase.kt b/compose/foundation/foundation/benchmark/src/androidTest/java/androidx/compose/foundation/benchmark/text/TextToggleTextTestCase.kt
index f6eb648..bc7f72f 100644
--- a/compose/foundation/foundation/benchmark/src/androidTest/java/androidx/compose/foundation/benchmark/text/TextToggleTextTestCase.kt
+++ b/compose/foundation/foundation/benchmark/src/androidTest/java/androidx/compose/foundation/benchmark/text/TextToggleTextTestCase.kt
@@ -41,15 +41,16 @@
     private val fontSize: TextUnit
 ) : ComposeTestCase, ToggleableTestCase {
 
-    private val texts = List(textNumber) {
-        mutableStateOf(textGenerator.nextParagraph(length = textLength))
-    }
+    private val texts =
+        List(textNumber) { mutableStateOf(textGenerator.nextParagraph(length = textLength)) }
 
     @Composable
     override fun Content() {
         Column(
-            modifier = Modifier.wrapContentSize(Alignment.Center).width(width)
-                .verticalScroll(rememberScrollState())
+            modifier =
+                Modifier.wrapContentSize(Alignment.Center)
+                    .width(width)
+                    .verticalScroll(rememberScrollState())
         ) {
             for (text in texts) {
                 Text(text = text.value, color = Color.Black, fontSize = fontSize)
@@ -58,8 +59,6 @@
     }
 
     override fun toggleState() {
-        texts.forEach {
-            it.value = textGenerator.nextParagraph(length = textLength)
-        }
+        texts.forEach { it.value = textGenerator.nextParagraph(length = textLength) }
     }
 }
diff --git a/compose/foundation/foundation/benchmark/src/androidTest/java/androidx/compose/foundation/benchmark/text/TextWithEllipsisTestCase.kt b/compose/foundation/foundation/benchmark/src/androidTest/java/androidx/compose/foundation/benchmark/text/TextWithEllipsisTestCase.kt
index 6017c6b..9bcc95c 100644
--- a/compose/foundation/foundation/benchmark/src/androidTest/java/androidx/compose/foundation/benchmark/text/TextWithEllipsisTestCase.kt
+++ b/compose/foundation/foundation/benchmark/src/androidTest/java/androidx/compose/foundation/benchmark/text/TextWithEllipsisTestCase.kt
@@ -31,9 +31,7 @@
 import androidx.compose.ui.unit.Dp
 import androidx.compose.ui.unit.TextUnit
 
-/**
- * The benchmark test case for [Text] with ellipsis.
- */
+/** The benchmark test case for [Text] with ellipsis. */
 class TextWithEllipsisTestCase(
     private val texts: List<String>,
     private val width: Dp,
@@ -59,9 +57,7 @@
 
     @Composable
     override fun ContentWrappers(content: @Composable () -> Unit) {
-        Column(modifier = Modifier.width(width)) {
-            content()
-        }
+        Column(modifier = Modifier.width(width)) { content() }
     }
 
     override fun toggleState() {
diff --git a/compose/foundation/foundation/benchmark/src/androidTest/java/androidx/compose/foundation/benchmark/text/empirical/EmpiricalBench.kt b/compose/foundation/foundation/benchmark/src/androidTest/java/androidx/compose/foundation/benchmark/text/empirical/EmpiricalBench.kt
index 9c3951d..0c05af7 100644
--- a/compose/foundation/foundation/benchmark/src/androidTest/java/androidx/compose/foundation/benchmark/text/empirical/EmpiricalBench.kt
+++ b/compose/foundation/foundation/benchmark/src/androidTest/java/androidx/compose/foundation/benchmark/text/empirical/EmpiricalBench.kt
@@ -33,8 +33,7 @@
 
 abstract class EmpiricalBench<S> where S : ToggleableTestCase, S : LayeredComposeTestCase {
 
-    @get:Rule
-    val benchmarkRule = ComposeBenchmarkRule()
+    @get:Rule val benchmarkRule = ComposeBenchmarkRule()
 
     abstract val caseFactory: () -> S
 
diff --git a/compose/foundation/foundation/benchmark/src/androidTest/java/androidx/compose/foundation/benchmark/text/empirical/IfNotEmptyCallText.kt b/compose/foundation/foundation/benchmark/src/androidTest/java/androidx/compose/foundation/benchmark/text/empirical/IfNotEmptyCallText.kt
index 38e6250..d59dbac 100644
--- a/compose/foundation/foundation/benchmark/src/androidTest/java/androidx/compose/foundation/benchmark/text/empirical/IfNotEmptyCallText.kt
+++ b/compose/foundation/foundation/benchmark/src/androidTest/java/androidx/compose/foundation/benchmark/text/empirical/IfNotEmptyCallText.kt
@@ -42,10 +42,7 @@
     @Composable
     override fun MeasuredContent() {
         if (toggleText.value.isNotEmpty()) {
-            Text(
-                toggleText.value,
-                style = style
-            )
+            Text(toggleText.value, style = style)
         }
     }
 
@@ -74,9 +71,7 @@
     }
 }
 
-/**
- * Metrics determined from all apps
- */
+/** Metrics determined from all apps */
 @LargeTest
 @RunWith(Parameterized::class)
 class AllAppsIfNotEmptyCallText(size: Int) : IfNotEmptyParent(size) {
diff --git a/compose/foundation/foundation/benchmark/src/androidTest/java/androidx/compose/foundation/benchmark/text/empirical/IfNotEmptyCallTextWithSpans.kt b/compose/foundation/foundation/benchmark/src/androidTest/java/androidx/compose/foundation/benchmark/text/empirical/IfNotEmptyCallTextWithSpans.kt
index d15ec0f..28c8ad7 100644
--- a/compose/foundation/foundation/benchmark/src/androidTest/java/androidx/compose/foundation/benchmark/text/empirical/IfNotEmptyCallTextWithSpans.kt
+++ b/compose/foundation/foundation/benchmark/src/androidTest/java/androidx/compose/foundation/benchmark/text/empirical/IfNotEmptyCallTextWithSpans.kt
@@ -36,17 +36,15 @@
  * usage of spans as text formatting).
  *
  * Spans are intentionally limited to
- *
  * 1) Not MetricsAffectingSpans (usage is very low)
  * 2) Not inlineContent (usage is very low).
  *
  * TODO: If introducing more optimizations that depend on the "full length" assumption, confirm the
- * frequency of spans that use the full length. This is not verified in the data set that produced
- * this benchmark.
+ *   frequency of spans that use the full length. This is not verified in the data set that produced
+ *   this benchmark.
  */
-class IfNotEmptyCallTextWithSpans(
-    private val text: AnnotatedString
-) : LayeredComposeTestCase(), ToggleableTestCase {
+class IfNotEmptyCallTextWithSpans(private val text: AnnotatedString) :
+    LayeredComposeTestCase(), ToggleableTestCase {
     private var toggleText = mutableStateOf(AnnotatedString(""))
 
     private val style = TextStyle.Default.copy(fontFamily = FontFamily.Monospace)
@@ -67,10 +65,8 @@
 
 @LargeTest
 @RunWith(Parameterized::class)
-open class IfNotEmptyCallTextWithSpansParent(
-    private val size: Int,
-    private val spanCount: Int
-) : EmpiricalBench<IfNotEmptyCallTextWithSpans>() {
+open class IfNotEmptyCallTextWithSpansParent(private val size: Int, private val spanCount: Int) :
+    EmpiricalBench<IfNotEmptyCallTextWithSpans>() {
     override val caseFactory = {
         val text = generateCacheableStringOf(size)
         IfNotEmptyCallTextWithSpans(text.annotateWithSpans(spanCount))
@@ -85,10 +81,8 @@
 
 @LargeTest
 @RunWith(Parameterized::class)
-class AllAppsIfNotEmptyCallTextWithSpans(
-    size: Int,
-    spanCount: Int
-) : IfNotEmptyCallTextWithSpansParent(size, spanCount) {
+class AllAppsIfNotEmptyCallTextWithSpans(size: Int, spanCount: Int) :
+    IfNotEmptyCallTextWithSpansParent(size, spanCount) {
     companion object {
         @JvmStatic
         @Parameterized.Parameters(name = "size={0}, spanCount={1}")
@@ -98,10 +92,8 @@
 
 @LargeTest
 @RunWith(Parameterized::class)
-class SocialAppIfNotEmptyCallTextWithSpans(
-    size: Int,
-    spanCount: Int
-) : IfNotEmptyCallTextWithSpansParent(size, spanCount) {
+class SocialAppIfNotEmptyCallTextWithSpans(size: Int, spanCount: Int) :
+    IfNotEmptyCallTextWithSpansParent(size, spanCount) {
     companion object {
         @JvmStatic
         @Parameterized.Parameters(name = "size={0}, spanCount={1}")
@@ -116,10 +108,8 @@
 
 @LargeTest
 @RunWith(Parameterized::class)
-class ChatAppIfNotEmptyCallTextWithSpans(
-    size: Int,
-    spanCount: Int
-) : IfNotEmptyCallTextWithSpansParent(size, spanCount) {
+class ChatAppIfNotEmptyCallTextWithSpans(size: Int, spanCount: Int) :
+    IfNotEmptyCallTextWithSpansParent(size, spanCount) {
     companion object {
         @JvmStatic
         @Parameterized.Parameters(name = "size={0}, spanCount={1}")
@@ -134,10 +124,8 @@
 
 @LargeTest
 @RunWith(Parameterized::class)
-class ShoppingAppIfNotEmptyCallTextWithSpans(
-    size: Int,
-    spanCount: Int
-) : IfNotEmptyCallTextWithSpansParent(size, spanCount) {
+class ShoppingAppIfNotEmptyCallTextWithSpans(size: Int, spanCount: Int) :
+    IfNotEmptyCallTextWithSpansParent(size, spanCount) {
     companion object {
         @JvmStatic
         @Parameterized.Parameters(name = "size={0}, spanCount={1}")
diff --git a/compose/foundation/foundation/benchmark/src/androidTest/java/androidx/compose/foundation/benchmark/text/empirical/Parameters.kt b/compose/foundation/foundation/benchmark/src/androidTest/java/androidx/compose/foundation/benchmark/text/empirical/Parameters.kt
index 1db91b9..f6cd300 100644
--- a/compose/foundation/foundation/benchmark/src/androidTest/java/androidx/compose/foundation/benchmark/text/empirical/Parameters.kt
+++ b/compose/foundation/foundation/benchmark/src/androidTest/java/androidx/compose/foundation/benchmark/text/empirical/Parameters.kt
@@ -29,9 +29,7 @@
      *
      * Examples of typical text
      *
-     * "OK"
-     * "Close"
-     * "Click below to learn more"
+     * "OK" "Close" "Click below to learn more"
      */
     val TextLengths: Array<Any> = arrayOf(2, 16, 32, 64).filterForCi()
     val SpanCounts: Array<Any> = arrayOf(4, 16).filterForCi()
@@ -49,18 +47,14 @@
 }
 
 object ChatApps {
-    /**
-     * For chat apps, strings tend to be longer due to user generated content.
-     */
+    /** For chat apps, strings tend to be longer due to user generated content. */
     val TextLengths: Array<Any> = arrayOf(256, 512).filterForCi()
     val SpanCounts: Array<Any> = arrayOf(2).filterForCi()
     val TextLengthsWithSpans: List<Array<Any>> = TextLengths.cartesian(SpanCounts).filterForCi()
 }
 
 object ShoppingApps {
-    /**
-     * Shopping apps are more designed focused with short, intentional, text usage
-     */
+    /** Shopping apps are more designed focused with short, intentional, text usage */
     val TextLengths: Array<Any> = arrayOf(2, 64).filterForCi()
     val SpanCounts: Array<Any> = arrayOf(16).filterForCi()
     val TextLengthsWithSpans: List<Array<Any>> = TextLengths.cartesian(SpanCounts).filterForCi()
@@ -115,9 +109,7 @@
 
 internal const val BenchmarkInlineContentId = "BenchmarkInlineContent.Id"
 
-/**
- * Add inline content to a String.
- */
+/** Add inline content to a String. */
 internal fun String.annotateWithInlineContent(): AnnotatedString {
     return buildAnnotatedString {
         appendInlineContent(BenchmarkInlineContentId)
@@ -125,9 +117,7 @@
     }
 }
 
-/**
- * ([1,2,3] X [A, B]) -> [[1, A], [1, B], [2, A], ...
- */
+/** ([1,2,3] X [A, B]) -> [[1, A], [1, B], [2, A], ... */
 private fun Array<Any>.cartesian(rhs: Array<Any>): List<Array<Any>> = flatMap { lhs ->
     rhs.map { arrayOf(lhs, it) }
 }
diff --git a/compose/foundation/foundation/benchmark/src/androidTest/java/androidx/compose/foundation/benchmark/text/empirical/SetText.kt b/compose/foundation/foundation/benchmark/src/androidTest/java/androidx/compose/foundation/benchmark/text/empirical/SetText.kt
index 845e473..71a7c0e 100644
--- a/compose/foundation/foundation/benchmark/src/androidTest/java/androidx/compose/foundation/benchmark/text/empirical/SetText.kt
+++ b/compose/foundation/foundation/benchmark/src/androidTest/java/androidx/compose/foundation/benchmark/text/empirical/SetText.kt
@@ -40,10 +40,7 @@
 
     @Composable
     override fun MeasuredContent() {
-        Subject(
-            toggleText.value,
-            style = style
-        )
+        Subject(toggleText.value, style = style)
     }
 
     override fun toggleState() {
@@ -57,9 +54,7 @@
 
 @LargeTest
 @RunWith(Parameterized::class)
-open class SetTextParent(
-    private val size: Int
-) : EmpiricalBench<SetText>() {
+open class SetTextParent(private val size: Int) : EmpiricalBench<SetText>() {
     override val caseFactory = {
         val text = generateCacheableStringOf(size)
         SetText(text)
@@ -72,9 +67,7 @@
     }
 }
 
-/**
- * Metrics determined from all apps
- */
+/** Metrics determined from all apps */
 @LargeTest
 @RunWith(Parameterized::class)
 class AllAppsSetText(size: Int) : SetTextParent(size) {
diff --git a/compose/foundation/foundation/benchmark/src/androidTest/java/androidx/compose/foundation/benchmark/text/empirical/SetTextFillMaxWidth.kt b/compose/foundation/foundation/benchmark/src/androidTest/java/androidx/compose/foundation/benchmark/text/empirical/SetTextFillMaxWidth.kt
index 60f2d14..0eb48a5 100644
--- a/compose/foundation/foundation/benchmark/src/androidTest/java/androidx/compose/foundation/benchmark/text/empirical/SetTextFillMaxWidth.kt
+++ b/compose/foundation/foundation/benchmark/src/androidTest/java/androidx/compose/foundation/benchmark/text/empirical/SetTextFillMaxWidth.kt
@@ -44,11 +44,7 @@
 
     @Composable
     override fun MeasuredContent() {
-        Subject(
-            toggleText.value,
-            modifier = Modifier.fillMaxWidth(),
-            style = style
-        )
+        Subject(toggleText.value, modifier = Modifier.fillMaxWidth(), style = style)
     }
 
     override fun toggleState() {
@@ -62,9 +58,8 @@
 
 @LargeTest
 @RunWith(Parameterized::class)
-open class SetTextFillMaxWidthParent(
-    private val size: Int
-) : EmpiricalBench<SetTextFillMaxWidth>() {
+open class SetTextFillMaxWidthParent(private val size: Int) :
+    EmpiricalBench<SetTextFillMaxWidth>() {
     override val caseFactory = {
         val text = generateCacheableStringOf(size)
         SetTextFillMaxWidth(text)
@@ -77,9 +72,7 @@
     }
 }
 
-/**
- * Metrics determined from all apps
- */
+/** Metrics determined from all apps */
 @LargeTest
 @RunWith(Parameterized::class)
 class AllAppsSetTextFillMaxWidth(size: Int) : SetTextFillMaxWidthParent(size) {
diff --git a/compose/foundation/foundation/benchmark/src/androidTest/java/androidx/compose/foundation/benchmark/text/empirical/SetTextWithInlineContent.kt b/compose/foundation/foundation/benchmark/src/androidTest/java/androidx/compose/foundation/benchmark/text/empirical/SetTextWithInlineContent.kt
index ed02274..d331a96 100644
--- a/compose/foundation/foundation/benchmark/src/androidTest/java/androidx/compose/foundation/benchmark/text/empirical/SetTextWithInlineContent.kt
+++ b/compose/foundation/foundation/benchmark/src/androidTest/java/androidx/compose/foundation/benchmark/text/empirical/SetTextWithInlineContent.kt
@@ -44,24 +44,26 @@
  *
  * This benchmark only adds one replacement span, which is a typical case.
  */
-class SetTextWithInlineContent(
-    private val text: AnnotatedString
-) : LayeredComposeTestCase(), ToggleableTestCase {
+class SetTextWithInlineContent(private val text: AnnotatedString) :
+    LayeredComposeTestCase(), ToggleableTestCase {
     private var toggleText = mutableStateOf(AnnotatedString(""))
 
     private val style = TextStyle.Default.copy(fontFamily = FontFamily.Monospace)
 
     @Composable
     override fun MeasuredContent() {
-        Subject(toggleText.value,
+        Subject(
+            toggleText.value,
             style = style,
-            inlineContent = mapOf(
-                BenchmarkInlineContentId to InlineTextContent(
-                    Placeholder(12.sp, 12.sp, PlaceholderVerticalAlign.Center)
-                ) {
-                    Box(Modifier.size(12.dp, 12.dp))
-                }
-            )
+            inlineContent =
+                mapOf(
+                    BenchmarkInlineContentId to
+                        InlineTextContent(
+                            Placeholder(12.sp, 12.sp, PlaceholderVerticalAlign.Center)
+                        ) {
+                            Box(Modifier.size(12.dp, 12.dp))
+                        }
+                )
         )
     }
 
@@ -76,9 +78,8 @@
 
 @LargeTest
 @RunWith(Parameterized::class)
-open class SetTextWithInlineContentParent(
-    private val size: Int
-) : EmpiricalBench<SetTextWithInlineContent>() {
+open class SetTextWithInlineContentParent(private val size: Int) :
+    EmpiricalBench<SetTextWithInlineContent>() {
 
     override val caseFactory = {
         val text = generateCacheableStringOf(size)
diff --git a/compose/foundation/foundation/benchmark/src/androidTest/java/androidx/compose/foundation/benchmark/text/empirical/SetTextWithSpans.kt b/compose/foundation/foundation/benchmark/src/androidTest/java/androidx/compose/foundation/benchmark/text/empirical/SetTextWithSpans.kt
index 1aac7da..892d32e 100644
--- a/compose/foundation/foundation/benchmark/src/androidTest/java/androidx/compose/foundation/benchmark/text/empirical/SetTextWithSpans.kt
+++ b/compose/foundation/foundation/benchmark/src/androidTest/java/androidx/compose/foundation/benchmark/text/empirical/SetTextWithSpans.kt
@@ -36,7 +36,6 @@
  * usage of spans as text formatting).
  *
  * Spans are intentionally limited to
- *
  * 1) Not MetricsAffectingSpans (usage is very low)
  * 2) Not inlineContent (usage is very low).
  *
@@ -44,9 +43,8 @@
  * frequency of spans that use the full length. This is not verified in the data set that produced
  * this benchmark. This assumption does not, currently, impact the performance of Compose.
  */
-class SetTextWithSpans(
-    private val text: AnnotatedString
-) : LayeredComposeTestCase(), ToggleableTestCase {
+class SetTextWithSpans(private val text: AnnotatedString) :
+    LayeredComposeTestCase(), ToggleableTestCase {
     private var toggleText = mutableStateOf(AnnotatedString(""))
 
     private val style = TextStyle.Default.copy(fontFamily = FontFamily.Monospace)
@@ -67,10 +65,8 @@
 
 @LargeTest
 @RunWith(Parameterized::class)
-open class SetTextWithSpansParent(
-    private val size: Int,
-    private val spanCount: Int
-) : EmpiricalBench<SetTextWithSpans>() {
+open class SetTextWithSpansParent(private val size: Int, private val spanCount: Int) :
+    EmpiricalBench<SetTextWithSpans>() {
     override val caseFactory = {
         val text = generateCacheableStringOf(size)
         SetTextWithSpans(text.annotateWithSpans(spanCount))
diff --git a/compose/foundation/foundation/benchmark/src/androidTest/java/androidx/compose/foundation/benchmark/text/empirical/baselines/EmptyLayoutBaseline.kt b/compose/foundation/foundation/benchmark/src/androidTest/java/androidx/compose/foundation/benchmark/text/empirical/baselines/EmptyLayoutBaseline.kt
index 3bf8608..8ee63cd 100644
--- a/compose/foundation/foundation/benchmark/src/androidTest/java/androidx/compose/foundation/benchmark/text/empirical/baselines/EmptyLayoutBaseline.kt
+++ b/compose/foundation/foundation/benchmark/src/androidTest/java/androidx/compose/foundation/benchmark/text/empirical/baselines/EmptyLayoutBaseline.kt
@@ -48,9 +48,7 @@
  * Text will never be able to be _this_ fast (as we don't _yet_ have time-travel chips), but it is
  * useful to use this number as a floor when evaluating potential optimizations.
  */
-class EmptyLayoutBaseline(
-    private val text: String
-) : LayeredComposeTestCase(), ToggleableTestCase {
+class EmptyLayoutBaseline(private val text: String) : LayeredComposeTestCase(), ToggleableTestCase {
     private var toggleText = mutableStateOf("")
 
     private val measurePolicy = MeasurePolicy { _, _ ->
@@ -81,8 +79,7 @@
 @RunWith(Parameterized::class)
 open class EmptyLayoutBaselineParent(private val size: Int) {
 
-    @get:Rule
-    val benchmarkRule = ComposeBenchmarkRule()
+    @get:Rule val benchmarkRule = ComposeBenchmarkRule()
 
     private val caseFactory = {
         val text = generateCacheableStringOf(size)
diff --git a/compose/foundation/foundation/benchmark/src/androidTest/java/androidx/compose/foundation/benchmark/text/empirical/baselines/StaticLayoutBaseline.kt b/compose/foundation/foundation/benchmark/src/androidTest/java/androidx/compose/foundation/benchmark/text/empirical/baselines/StaticLayoutBaseline.kt
index da0c34c..e968faf 100644
--- a/compose/foundation/foundation/benchmark/src/androidTest/java/androidx/compose/foundation/benchmark/text/empirical/baselines/StaticLayoutBaseline.kt
+++ b/compose/foundation/foundation/benchmark/src/androidTest/java/androidx/compose/foundation/benchmark/text/empirical/baselines/StaticLayoutBaseline.kt
@@ -51,8 +51,7 @@
 @SdkSuppress(minSdkVersion = 23)
 open class StaticLayoutBaseline(private val size: Int) {
 
-    @get:Rule
-    val benchmarkRule = BenchmarkRule()
+    @get:Rule val benchmarkRule = BenchmarkRule()
 
     companion object {
         @JvmStatic
@@ -113,23 +112,28 @@
         StaticLayoutBuilderCompat_Api23.build(text, textPaint)
     } else {
         @Suppress("DEPRECATION")
-        StaticLayout(/* source = */ text, /* paint = */
-            textPaint, /* width = */
-            Int.MAX_VALUE, /* align = */
-            Layout.Alignment.ALIGN_NORMAL, /* spacingmult = */
-            1.0f, /* spacingadd = */
-            0.0f, /* includepad = */
-            true)
+        StaticLayout(
+            /* source = */ text,
+            /* paint = */ textPaint,
+            /* width = */ Int.MAX_VALUE,
+            /* align = */ Layout.Alignment.ALIGN_NORMAL,
+            /* spacingmult = */ 1.0f,
+            /* spacingadd = */ 0.0f,
+            /* includepad = */ true
+        )
     }
 }
 
 @RequiresApi(23)
 object StaticLayoutBuilderCompat_Api23 {
     fun build(text: String, textPaint: TextPaint): StaticLayout {
-        return StaticLayout.Builder.obtain(/* source = */ text, /* start = */
-            0, /* end = */
-            text.length, /* paint = */
-            textPaint, /* width = */
-            Int.MAX_VALUE).build()
+        return StaticLayout.Builder.obtain(
+                /* source = */ text,
+                /* start = */ 0,
+                /* end = */ text.length,
+                /* paint = */ textPaint,
+                /* width = */ Int.MAX_VALUE
+            )
+            .build()
     }
 }
diff --git a/compose/foundation/foundation/benchmark/src/androidTest/java/androidx/compose/foundation/benchmark/text/lazyhosted/TextLazyReuse.kt b/compose/foundation/foundation/benchmark/src/androidTest/java/androidx/compose/foundation/benchmark/text/lazyhosted/TextLazyReuse.kt
index 27c7154..24d1e59 100644
--- a/compose/foundation/foundation/benchmark/src/androidTest/java/androidx/compose/foundation/benchmark/text/lazyhosted/TextLazyReuse.kt
+++ b/compose/foundation/foundation/benchmark/src/androidTest/java/androidx/compose/foundation/benchmark/text/lazyhosted/TextLazyReuse.kt
@@ -37,27 +37,20 @@
 import org.junit.Test
 import org.junit.runner.RunWith
 
-class TextLazyReuse(
-    private val changeText: Boolean
-) : LayeredComposeTestCase(), ToggleableTestCase {
+class TextLazyReuse(private val changeText: Boolean) :
+    LayeredComposeTestCase(), ToggleableTestCase {
     private var flipper = false
     private var toggleText = mutableStateOf("")
     private var active = mutableStateOf(true)
     private var reuseKey = mutableStateOf(0)
 
-    private val style = TextStyle.Default.copy(
-        fontFamily = FontFamily.Monospace
-    )
+    private val style = TextStyle.Default.copy(fontFamily = FontFamily.Monospace)
 
     @Composable
     override fun MeasuredContent() {
         ReusableContentHost(active.value) {
             ReusableContent(reuseKey.value) {
-                Text(
-                    toggleText.value,
-                    style = style,
-                    modifier = Modifier.fillMaxWidth()
-                )
+                Text(toggleText.value, style = style, modifier = Modifier.fillMaxWidth())
             }
         }
     }
@@ -80,8 +73,7 @@
 @RunWith(AndroidJUnit4::class)
 class TextLazyReuseSameText {
 
-    @get:Rule
-    val benchmarkRule = ComposeBenchmarkRule()
+    @get:Rule val benchmarkRule = ComposeBenchmarkRule()
 
     val caseFactory = { TextLazyReuse(false) }
 
@@ -105,8 +97,7 @@
 @RunWith(AndroidJUnit4::class)
 class TextLazyReuseChangedText {
 
-    @get:Rule
-    val benchmarkRule = ComposeBenchmarkRule()
+    @get:Rule val benchmarkRule = ComposeBenchmarkRule()
 
     val caseFactory = { TextLazyReuse(true) }
 
diff --git a/compose/foundation/foundation/benchmark/src/androidTest/java/androidx/compose/foundation/benchmark/text/selection/SelectionContainerBenchmark.kt b/compose/foundation/foundation/benchmark/src/androidTest/java/androidx/compose/foundation/benchmark/text/selection/SelectionContainerBenchmark.kt
index 3ade0c5..af5dc5e 100644
--- a/compose/foundation/foundation/benchmark/src/androidTest/java/androidx/compose/foundation/benchmark/text/selection/SelectionContainerBenchmark.kt
+++ b/compose/foundation/foundation/benchmark/src/androidTest/java/androidx/compose/foundation/benchmark/text/selection/SelectionContainerBenchmark.kt
@@ -40,14 +40,11 @@
 class SelectionContainerBenchmark(private val childrenCount: Int) {
     companion object {
         @JvmStatic
-        @Parameterized.Parameters(
-            name = "childrenCount={0}"
-        )
+        @Parameterized.Parameters(name = "childrenCount={0}")
         fun initParameters() = arrayOf(1, 10, 20).filterForCi { min() }
     }
 
-    @get:Rule
-    val benchmarkRule = ComposeBenchmarkRule()
+    @get:Rule val benchmarkRule = ComposeBenchmarkRule()
     private val caseFactory = { SelectionContainerTestCase(childrenCount) }
 
     @Test
diff --git a/compose/foundation/foundation/benchmark/src/androidTest/java/androidx/compose/foundation/benchmark/view/AndroidNestedScrollViewBenchmark.kt b/compose/foundation/foundation/benchmark/src/androidTest/java/androidx/compose/foundation/benchmark/view/AndroidNestedScrollViewBenchmark.kt
index f3fca79..95104b5 100644
--- a/compose/foundation/foundation/benchmark/src/androidTest/java/androidx/compose/foundation/benchmark/view/AndroidNestedScrollViewBenchmark.kt
+++ b/compose/foundation/foundation/benchmark/src/androidTest/java/androidx/compose/foundation/benchmark/view/AndroidNestedScrollViewBenchmark.kt
@@ -32,15 +32,12 @@
 import org.junit.Test
 import org.junit.runner.RunWith
 
-/**
- * Benchmark that runs [AndroidNestedScrollViewTestCase].
- */
+/** Benchmark that runs [AndroidNestedScrollViewTestCase]. */
 @LargeTest
 @RunWith(AndroidJUnit4::class)
 class AndroidNestedScrollViewBenchmark {
 
-    @get:Rule
-    val benchmarkRule = AndroidBenchmarkRule()
+    @get:Rule val benchmarkRule = AndroidBenchmarkRule()
 
     private val nestedScrollCaseFactory = { AndroidNestedScrollViewTestCase() }
 
diff --git a/compose/foundation/foundation/benchmark/src/androidTest/java/androidx/compose/foundation/benchmark/view/AndroidNestedScrollViewTestCase.kt b/compose/foundation/foundation/benchmark/src/androidTest/java/androidx/compose/foundation/benchmark/view/AndroidNestedScrollViewTestCase.kt
index eb41dcf..a88678b 100644
--- a/compose/foundation/foundation/benchmark/src/androidTest/java/androidx/compose/foundation/benchmark/view/AndroidNestedScrollViewTestCase.kt
+++ b/compose/foundation/foundation/benchmark/src/androidTest/java/androidx/compose/foundation/benchmark/view/AndroidNestedScrollViewTestCase.kt
@@ -27,25 +27,28 @@
 import androidx.compose.ui.graphics.toArgb
 import kotlin.random.Random
 
-/**
- * Version of [NestedScrollerTestCase] using Android views.
- */
+/** Version of [NestedScrollerTestCase] using Android views. */
 class AndroidNestedScrollViewTestCase : AndroidTestCase, ToggleableTestCase {
     lateinit var firstScrollView: HorizontalScrollView
 
     override fun getContent(activity: Activity): ViewGroup {
-        val scrollView = activity.layoutInflater
-            .inflate(androidx.compose.foundation.benchmark.R.layout.simple_store, null) as ViewGroup
+        val scrollView =
+            activity.layoutInflater.inflate(
+                androidx.compose.foundation.benchmark.R.layout.simple_store,
+                null
+            ) as ViewGroup
         visitImages(scrollView) { view ->
-            val color = Color(
-                red = Random.nextInt(256),
-                green = Random.nextInt(256),
-                blue = Random.nextInt(256)
-            ).toArgb()
+            val color =
+                Color(
+                        red = Random.nextInt(256),
+                        green = Random.nextInt(256),
+                        blue = Random.nextInt(256)
+                    )
+                    .toArgb()
             view.setBackgroundColor(color)
         }
-        firstScrollView = scrollView
-            .findViewById(androidx.compose.foundation.benchmark.R.id.first_row)
+        firstScrollView =
+            scrollView.findViewById(androidx.compose.foundation.benchmark.R.id.first_row)
         return scrollView
     }
 
@@ -61,10 +64,10 @@
     }
 
     /**
-     * This scrolls the first HorizontalScrollView. Views are well optimized for this operation,
-     * so it is good to have a metric to compare against. Compose UI does more during scrolling,
-     * and it is important that it doesn't explode. This View example helps compare
-     * measure/layout/draw times for scrolling operations.
+     * This scrolls the first HorizontalScrollView. Views are well optimized for this operation, so
+     * it is good to have a metric to compare against. Compose UI does more during scrolling, and it
+     * is important that it doesn't explode. This View example helps compare measure/layout/draw
+     * times for scrolling operations.
      */
     override fun toggleState() {
         firstScrollView.scrollX = if (firstScrollView.scrollX == 0) 5 else 0
diff --git a/compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/BasicMarqueeDemo.kt b/compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/BasicMarqueeDemo.kt
index d923e1f..1056135b 100644
--- a/compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/BasicMarqueeDemo.kt
+++ b/compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/BasicMarqueeDemo.kt
@@ -93,11 +93,7 @@
         listOf(40.dp, 80.dp, 120.dp).forEach {
             MarqueeText("long text in short marquee", Modifier.width(it))
         }
-        MarqueeText(
-            "backwards animation",
-            Modifier.width(80.dp),
-            velocity = -Velocity
-        )
+        MarqueeText("backwards animation", Modifier.width(80.dp), velocity = -Velocity)
         MarqueeWithClickable()
         Row {
             Text("Tap to focus: ")
@@ -119,9 +115,10 @@
 
 @Composable
 private fun AndroidMarqueeWithClickableLink() {
-    val text = SpannableStringBuilder("text with link").apply {
-        setSpan(URLSpan("https://www.google.com"), 5, 9, 0)
-    }
+    val text =
+        SpannableStringBuilder("text with link").apply {
+            setSpan(URLSpan("https://www.google.com"), 5, 9, 0)
+        }
     AndroidMarqueeTextView(text, Modifier.width(60.dp))
 }
 
@@ -134,9 +131,10 @@
 ) {
     var isFocused by remember { mutableStateOf(false) }
     AndroidView(
-        modifier = modifier
-            .border(if (isFocused) 4.dp else 1.dp, Color.Black)
-            .onFocusChanged { isFocused = it.hasFocus },
+        modifier =
+            modifier.border(if (isFocused) 4.dp else 1.dp, Color.Black).onFocusChanged {
+                isFocused = it.hasFocus
+            },
         factory = {
             TextView(it).apply {
                 ellipsize = TextUtils.TruncateAt.MARQUEE
@@ -148,9 +146,7 @@
                 isFocusableInTouchMode = focusable
             }
         },
-        update = {
-            it.text = text
-        }
+        update = { it.text = text }
     )
 }
 
@@ -158,16 +154,11 @@
 private fun MarqueeWithClickable() {
     val uriHandler = LocalUriHandler.current
     Row(
-        Modifier
-            .width(60.dp)
-            .border(1.dp, Color.Black)
-            .basicMarquee(iterations = Int.MAX_VALUE),
+        Modifier.width(60.dp).border(1.dp, Color.Black).basicMarquee(iterations = Int.MAX_VALUE),
         verticalAlignment = Alignment.CenterVertically
     ) {
         Text("text ")
-        TextButton(onClick = { uriHandler.openUri("https://www.google.com") }) {
-            Text("with")
-        }
+        TextButton(onClick = { uriHandler.openUri("https://www.google.com") }) { Text("with") }
         Text(" link")
     }
 }
diff --git a/compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/CombinedClickableDemo.kt b/compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/CombinedClickableDemo.kt
index 0fb3f21..5530a05 100644
--- a/compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/CombinedClickableDemo.kt
+++ b/compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/CombinedClickableDemo.kt
@@ -62,11 +62,7 @@
                 "input before it arrives at combinedClickable:",
         )
         Spacer(Modifier.height(4.dp))
-        CombinedClickableButton(
-            { clicks++ },
-            { doubleClicks++ },
-            { longClicks++ }
-        )
+        CombinedClickableButton({ clicks++ }, { doubleClicks++ }, { longClicks++ })
 
         Divider(Modifier.padding(vertical = 12.dp))
 
@@ -75,11 +71,7 @@
                 "input, such as Box:"
         )
         Spacer(Modifier.height(4.dp))
-        CombinedClickableBox(
-            { clicks++ },
-            { doubleClicks++ },
-            { longClicks++ }
-        )
+        CombinedClickableBox({ clicks++ }, { doubleClicks++ }, { longClicks++ })
     }
 }
 
@@ -90,8 +82,7 @@
     onLongClick: () -> Unit,
 ) {
     Box(
-        Modifier
-            .border(2.dp, Color.Black)
+        Modifier.border(2.dp, Color.Black)
             .background(Color(0xFFFFE59C))
             .combinedClickable(
                 onClick = onClick,
diff --git a/compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/FocusedBoundsDemo.kt b/compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/FocusedBoundsDemo.kt
index 94fea4b..e5c4f02 100644
--- a/compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/FocusedBoundsDemo.kt
+++ b/compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/FocusedBoundsDemo.kt
@@ -124,20 +124,14 @@
 private fun FocusableDemoContent() {
     Column(verticalArrangement = spacedBy(4.dp)) {
         val focusManager = LocalFocusManager.current
-        Button(onClick = { focusManager.clearFocus() }) {
-            Text("Clear focus")
-        }
+        Button(onClick = { focusManager.clearFocus() }) { Text("Clear focus") }
         TextField("", {}, Modifier.fillMaxWidth())
         Text("Lazy row:")
         LazyRow(
-            modifier = Modifier
-                .padding(horizontal = 32.dp)
-                .border(2.dp, Color.Black),
+            modifier = Modifier.padding(horizontal = 32.dp).border(2.dp, Color.Black),
             horizontalArrangement = spacedBy(8.dp)
         ) {
-            items(50) { index ->
-                TextField(index.toString(), {}, Modifier.width(64.dp))
-            }
+            items(50) { index -> TextField(index.toString(), {}, Modifier.width(64.dp)) }
         }
     }
 }
@@ -147,17 +141,14 @@
 
     init {
         orientation = VERTICAL
-        val fields = LinearLayout(context).apply {
-            orientation = HORIZONTAL
-            repeat(50) { index ->
-                addView(EditText(context).apply {
-                    setText(index.toString())
-                })
+        val fields =
+            LinearLayout(context).apply {
+                orientation = HORIZONTAL
+                repeat(50) { index ->
+                    addView(EditText(context).apply { setText(index.toString()) })
+                }
             }
-        }
-        val fieldRow = HorizontalScrollView(context).apply {
-            addView(fields)
-        }
+        val fieldRow = HorizontalScrollView(context).apply { addView(fields) }
         addView(fieldRow)
         addView(composeView)
     }
@@ -203,17 +194,13 @@
     ) {
         Row(
             horizontalArrangement = Arrangement.Center,
-            modifier = Modifier
-                .padding(8.dp)
-                .fillMaxWidth()
+            modifier = Modifier.padding(8.dp).fillMaxWidth()
         ) {
             Eyeball(focalPoint, myBounds)
             Spacer(Modifier.width(36.dp))
             Eyeball(focalPoint, myBounds)
         }
-        Box(propagateMinConstraints = true) {
-            content()
-        }
+        Box(propagateMinConstraints = true) { content() }
     }
 }
 
@@ -221,28 +208,24 @@
 private fun Eyeball(focalPoint: Offset, parentBounds: Rect) {
     var myCenter by remember { mutableStateOf(Offset.Unspecified) }
     var mySize by remember { mutableStateOf(Size.Unspecified) }
-    val targetPoint = if (focalPoint.isSpecified && myCenter.isSpecified && mySize.isSpecified) {
-        val foo = focalPoint.minus(myCenter)
-        val maxDistanceX = maxOf(
-            myCenter.x - parentBounds.left,
-            parentBounds.width - myCenter.x
-        )
-        val maxDistanceY = maxOf(
-            myCenter.y - parentBounds.top,
-            parentBounds.height - myCenter.y
-        )
-        val maxDistance = maxOf(maxDistanceX, maxDistanceY)
-        val scaleFactor = (mySize.minDimension / 2) / maxDistance
-        foo.times(scaleFactor)
-    } else {
-        Offset.Zero
-    }
+    val targetPoint =
+        if (focalPoint.isSpecified && myCenter.isSpecified && mySize.isSpecified) {
+            val foo = focalPoint.minus(myCenter)
+            val maxDistanceX =
+                maxOf(myCenter.x - parentBounds.left, parentBounds.width - myCenter.x)
+            val maxDistanceY =
+                maxOf(myCenter.y - parentBounds.top, parentBounds.height - myCenter.y)
+            val maxDistance = maxOf(maxDistanceX, maxDistanceY)
+            val scaleFactor = (mySize.minDimension / 2) / maxDistance
+            foo.times(scaleFactor)
+        } else {
+            Offset.Zero
+        }
     val animatedTargetPoint by animateOffsetAsState(targetPoint)
     val focusRequester = remember { FocusRequester() }
 
     Canvas(
-        Modifier
-            .size(24.dp)
+        Modifier.size(24.dp)
             .onGloballyPositioned {
                 myCenter = it.boundsInRoot().center
                 mySize = it.size.toSize()
@@ -258,11 +241,7 @@
 
         val pupilCenter = center + animatedTargetPoint
         val pupilRadius = size.minDimension / 4f
-        drawCircle(
-            Color.Black,
-            center = pupilCenter,
-            radius = pupilRadius
-        )
+        drawCircle(Color.Black, center = pupilCenter, radius = pupilRadius)
         drawCircle(
             Color.White,
             center = pupilCenter - (Offset(pupilRadius / 2, pupilRadius / 2)),
@@ -281,16 +260,16 @@
 
     fun update() {
         with(density) {
-            focusedBounds = calculateHighlightBounds(focusedChild, coordinates, clipBounds = false)
-                .inflate(1.dp.toPx())
+            focusedBounds =
+                calculateHighlightBounds(focusedChild, coordinates, clipBounds = false)
+                    .inflate(1.dp.toPx())
             focusedBoundsClipped =
                 calculateHighlightBounds(focusedChild, coordinates, clipBounds = true)
                     .inflate(1.dp.toPx())
         }
     }
 
-    Modifier
-        .onGloballyPositioned {
+    Modifier.onGloballyPositioned {
             coordinates = it
             update()
         }
@@ -319,14 +298,15 @@
     val animatedPrimaryBounds by animateRectAsState(primaryBounds)
     val animatedSecondaryBounds by animateRectAsState(secondaryBounds)
     val strokeDashes = remember { floatArrayOf(10f, 10f) }
-    val strokeDashPhase by rememberInfiniteTransition()
-        .animateFloat(0f, 20f, infiniteRepeatable(tween(500, easing = LinearEasing)))
+    val strokeDashPhase by
+        rememberInfiniteTransition()
+            .animateFloat(0f, 20f, infiniteRepeatable(tween(500, easing = LinearEasing)))
 
     drawWithContent {
         drawContent()
 
-        if (animatedSecondaryBounds != Rect.Zero &&
-            animatedSecondaryBounds != animatedPrimaryBounds
+        if (
+            animatedSecondaryBounds != Rect.Zero && animatedSecondaryBounds != animatedPrimaryBounds
         ) {
             drawRoundRect(
                 color = Color.LightGray,
@@ -334,10 +314,11 @@
                 topLeft = animatedSecondaryBounds.topLeft,
                 size = animatedSecondaryBounds.size,
                 cornerRadius = CornerRadius(4.dp.toPx(), 4.dp.toPx()),
-                style = Stroke(
-                    width = 3.dp.toPx(),
-                    pathEffect = dashPathEffect(strokeDashes, strokeDashPhase)
-                )
+                style =
+                    Stroke(
+                        width = 3.dp.toPx(),
+                        pathEffect = dashPathEffect(strokeDashes, strokeDashPhase)
+                    )
             )
         }
 
@@ -349,10 +330,11 @@
                 topLeft = animatedPrimaryBounds.topLeft,
                 size = animatedPrimaryBounds.size,
                 cornerRadius = CornerRadius(4.dp.toPx(), 4.dp.toPx()),
-                style = Stroke(
-                    width = 3.dp.toPx(),
-                    pathEffect = dashPathEffect(strokeDashes, strokeDashPhase)
-                )
+                style =
+                    Stroke(
+                        width = 3.dp.toPx(),
+                        pathEffect = dashPathEffect(strokeDashes, strokeDashPhase)
+                    )
             )
         }
     }
diff --git a/compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/FoundationDemos.kt b/compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/FoundationDemos.kt
index 2edc0f6..56666f0 100644
--- a/compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/FoundationDemos.kt
+++ b/compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/FoundationDemos.kt
@@ -37,64 +37,72 @@
 import androidx.compose.integration.demos.common.ComposableDemo
 import androidx.compose.integration.demos.common.DemoCategory
 
-private val RelocationDemos = listOf(
-    ComposableDemo("Bring Into View") { BringIntoViewDemo() },
-    ComposableDemo("Bring Rectangle Into View") { BringRectangleIntoViewDemo() },
-    ComposableDemo("Custom responder") { BringIntoViewResponderDemo() },
-    ComposableDemo("Request Rectangle On Screen") { RequestRectangleOnScreenDemo() },
-    ComposableDemo("Android view interop") { BringIntoViewAndroidInteropDemo() },
-    ComposableDemo("Nested scrollables") { BringNestedIntoViewDemo() },
-)
-
-private val FocusDemos = listOf(
-    ComposableDemo("Focus Group") { FocusGroupDemo() },
-)
-
-private val GestureDemos = listOf(
-    ComposableDemo("AnchoredDraggable") { AnchoredDraggableDemo() },
-    ComposableDemo("Draggable, Scrollable, Zoomable, Focusable") { HighLevelGesturesDemo() }
-)
-
-private val NestedScrollDemos = listOf(
-    ComposableDemo("Nested Scroll") { NestedScrollDemo() },
-    ComposableDemo("Nested Scroll Connection") { NestedScrollConnectionSample() },
-    ComposableDemo("Nested Scroll Simple Column") { SimpleColumnNestedScrollSample() },
-)
-
-private val DragAndDropDemos = listOf(
-    ComposableDemo("Multi app drag and drop") { DragAndDropMultiAppDemo() },
-    ComposableDemo("Nested Drag and drop") { DragAndDropNestedDemo() }
-)
-
-val FoundationDemos = DemoCategory(
-    "Foundation",
+private val RelocationDemos =
     listOf(
-        DemoCategory("High-level Gestures", GestureDemos),
-        DemoCategory("Drag and drop", DragAndDropDemos),
-        ComposableDemo("Combined clickable") { CombinedClickableDemo() },
-        ComposableDemo("Overscroll") { OverscrollDemo() },
-        ComposableDemo("Can scroll forward / backward") { CanScrollSample() },
-        ComposableDemo("Vertical scroll") { VerticalScrollExample() },
-        ComposableDemo("Controlled Scrollable Row") { ControlledScrollableRowSample() },
-        ComposableDemo("Draw Modifiers") { DrawModifiersDemo() },
-        ComposableDemo("External Surfaces") { AndroidExternalSurfaceDemo() },
-        DemoCategory("Lazy lists", LazyListDemos),
-        DemoCategory("Snapping", SnappingDemos),
-        DemoCategory("Pagers", PagerDemos),
-        ComposableDemo("Simple InteractionSource") { SimpleInteractionSourceSample() },
-        ComposableDemo("Flow InteractionSource") { InteractionSourceFlowSample() },
-        DemoCategory("Suspending Gesture Detectors", CoroutineGestureDemos),
-        DemoCategory("Nested Scroll", NestedScrollDemos),
-        DemoCategory("Relocation Demos", RelocationDemos),
-        DemoCategory("Focus Demos", FocusDemos),
-        DemoCategory("Magnifier Demos", MagnifierDemos),
-        ComposableDemo("Custom Touch Slop Demo - Composition Locals") { CustomTouchSlopSample() },
-        ComposableDemo("Focused bounds") { FocusedBoundsDemo() },
-        ComposableDemo("Scrollable with focused child") { ScrollableFocusedChildDemo() },
-        ComposableDemo("Window insets") { WindowInsetsDemo() },
-        ComposableDemo("Marquee") { BasicMarqueeDemo() },
-        DemoCategory("Pointer Icon", PointerIconDemos),
-        DemoCategory("Long screenshots", LongScreenshotsDemos),
-        DemoCategory("Context Menu", ContextMenuDemos),
+        ComposableDemo("Bring Into View") { BringIntoViewDemo() },
+        ComposableDemo("Bring Rectangle Into View") { BringRectangleIntoViewDemo() },
+        ComposableDemo("Custom responder") { BringIntoViewResponderDemo() },
+        ComposableDemo("Request Rectangle On Screen") { RequestRectangleOnScreenDemo() },
+        ComposableDemo("Android view interop") { BringIntoViewAndroidInteropDemo() },
+        ComposableDemo("Nested scrollables") { BringNestedIntoViewDemo() },
     )
-)
+
+private val FocusDemos =
+    listOf(
+        ComposableDemo("Focus Group") { FocusGroupDemo() },
+    )
+
+private val GestureDemos =
+    listOf(
+        ComposableDemo("AnchoredDraggable") { AnchoredDraggableDemo() },
+        ComposableDemo("Draggable, Scrollable, Zoomable, Focusable") { HighLevelGesturesDemo() }
+    )
+
+private val NestedScrollDemos =
+    listOf(
+        ComposableDemo("Nested Scroll") { NestedScrollDemo() },
+        ComposableDemo("Nested Scroll Connection") { NestedScrollConnectionSample() },
+        ComposableDemo("Nested Scroll Simple Column") { SimpleColumnNestedScrollSample() },
+    )
+
+private val DragAndDropDemos =
+    listOf(
+        ComposableDemo("Multi app drag and drop") { DragAndDropMultiAppDemo() },
+        ComposableDemo("Nested Drag and drop") { DragAndDropNestedDemo() }
+    )
+
+val FoundationDemos =
+    DemoCategory(
+        "Foundation",
+        listOf(
+            DemoCategory("High-level Gestures", GestureDemos),
+            DemoCategory("Drag and drop", DragAndDropDemos),
+            ComposableDemo("Combined clickable") { CombinedClickableDemo() },
+            ComposableDemo("Overscroll") { OverscrollDemo() },
+            ComposableDemo("Can scroll forward / backward") { CanScrollSample() },
+            ComposableDemo("Vertical scroll") { VerticalScrollExample() },
+            ComposableDemo("Controlled Scrollable Row") { ControlledScrollableRowSample() },
+            ComposableDemo("Draw Modifiers") { DrawModifiersDemo() },
+            ComposableDemo("External Surfaces") { AndroidExternalSurfaceDemo() },
+            DemoCategory("Lazy lists", LazyListDemos),
+            DemoCategory("Snapping", SnappingDemos),
+            DemoCategory("Pagers", PagerDemos),
+            ComposableDemo("Simple InteractionSource") { SimpleInteractionSourceSample() },
+            ComposableDemo("Flow InteractionSource") { InteractionSourceFlowSample() },
+            DemoCategory("Suspending Gesture Detectors", CoroutineGestureDemos),
+            DemoCategory("Nested Scroll", NestedScrollDemos),
+            DemoCategory("Relocation Demos", RelocationDemos),
+            DemoCategory("Focus Demos", FocusDemos),
+            DemoCategory("Magnifier Demos", MagnifierDemos),
+            ComposableDemo("Custom Touch Slop Demo - Composition Locals") {
+                CustomTouchSlopSample()
+            },
+            ComposableDemo("Focused bounds") { FocusedBoundsDemo() },
+            ComposableDemo("Scrollable with focused child") { ScrollableFocusedChildDemo() },
+            ComposableDemo("Window insets") { WindowInsetsDemo() },
+            ComposableDemo("Marquee") { BasicMarqueeDemo() },
+            DemoCategory("Pointer Icon", PointerIconDemos),
+            DemoCategory("Long screenshots", LongScreenshotsDemos),
+            DemoCategory("Context Menu", ContextMenuDemos),
+        )
+    )
diff --git a/compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/LazyColumnDragAndDropDemo.kt b/compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/LazyColumnDragAndDropDemo.kt
index 8d31d0c..0a6e1b7 100644
--- a/compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/LazyColumnDragAndDropDemo.kt
+++ b/compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/LazyColumnDragAndDropDemo.kt
@@ -62,11 +62,10 @@
     var list by remember { mutableStateOf(List(50) { it }) }
 
     val listState = rememberLazyListState()
-    val dragDropState = rememberDragDropState(listState) { fromIndex, toIndex ->
-        list = list.toMutableList().apply {
-            add(toIndex, removeAt(fromIndex))
+    val dragDropState =
+        rememberDragDropState(listState) { fromIndex, toIndex ->
+            list = list.toMutableList().apply { add(toIndex, removeAt(fromIndex)) }
         }
-    }
 
     LazyColumn(
         modifier = Modifier.dragContainer(dragDropState),
@@ -78,10 +77,7 @@
             DraggableItem(dragDropState, index) { isDragging ->
                 val elevation by animateDpAsState(if (isDragging) 4.dp else 1.dp)
                 Card(elevation = elevation) {
-                    Text("Item $item",
-                        Modifier
-                            .fillMaxWidth()
-                            .padding(20.dp))
+                    Text("Item $item", Modifier.fillMaxWidth().padding(20.dp))
                 }
             }
         }
@@ -89,18 +85,12 @@
 }
 
 @Composable
-fun rememberDragDropState(
-    lazyListState: LazyListState,
-    onMove: (Int, Int) -> Unit
-): DragDropState {
+fun rememberDragDropState(lazyListState: LazyListState, onMove: (Int, Int) -> Unit): DragDropState {
     val scope = rememberCoroutineScope()
-    val state = remember(lazyListState) {
-        DragDropState(
-            state = lazyListState,
-            onMove = onMove,
-            scope = scope
-        )
-    }
+    val state =
+        remember(lazyListState) {
+            DragDropState(state = lazyListState, onMove = onMove, scope = scope)
+        }
     LaunchedEffect(state) {
         while (true) {
             val diff = state.scrollChannel.receive()
@@ -110,7 +100,8 @@
     return state
 }
 
-class DragDropState internal constructor(
+class DragDropState
+internal constructor(
     private val state: LazyListState,
     private val scope: CoroutineScope,
     private val onMove: (Int, Int) -> Unit
@@ -123,24 +114,24 @@
     private var draggingItemDraggedDelta by mutableFloatStateOf(0f)
     private var draggingItemInitialOffset by mutableIntStateOf(0)
     internal val draggingItemOffset: Float
-        get() = draggingItemLayoutInfo?.let { item ->
-            draggingItemInitialOffset + draggingItemDraggedDelta - item.offset
-        } ?: 0f
+        get() =
+            draggingItemLayoutInfo?.let { item ->
+                draggingItemInitialOffset + draggingItemDraggedDelta - item.offset
+            } ?: 0f
 
     private val draggingItemLayoutInfo: LazyListItemInfo?
-        get() = state.layoutInfo.visibleItemsInfo
-            .firstOrNull { it.index == draggingItemIndex }
+        get() = state.layoutInfo.visibleItemsInfo.firstOrNull { it.index == draggingItemIndex }
 
     internal var previousIndexOfDraggedItem by mutableStateOf<Int?>(null)
         private set
+
     internal var previousItemOffset = Animatable(0f)
         private set
 
     internal fun onDragStart(offset: Offset) {
         state.layoutInfo.visibleItemsInfo
-            .firstOrNull { item ->
-                offset.y.toInt() in item.offset..(item.offset + item.size)
-            }?.also {
+            .firstOrNull { item -> offset.y.toInt() in item.offset..(item.offset + item.size) }
+            ?.also {
                 draggingItemIndex = it.index
                 draggingItemInitialOffset = it.offset
             }
@@ -154,10 +145,7 @@
                 previousItemOffset.snapTo(startOffset)
                 previousItemOffset.animateTo(
                     0f,
-                    spring(
-                        stiffness = Spring.StiffnessMediumLow,
-                        visibilityThreshold = 1f
-                    )
+                    spring(stiffness = Spring.StiffnessMediumLow, visibilityThreshold = 1f)
                 )
                 previousIndexOfDraggedItem = null
             }
@@ -175,13 +163,15 @@
         val endOffset = startOffset + draggingItem.size
         val middleOffset = startOffset + (endOffset - startOffset) / 2f
 
-        val targetItem = state.layoutInfo.visibleItemsInfo.find { item ->
-            middleOffset.toInt() in item.offset..item.offsetEnd &&
-                draggingItem.index != item.index
-        }
+        val targetItem =
+            state.layoutInfo.visibleItemsInfo.find { item ->
+                middleOffset.toInt() in item.offset..item.offsetEnd &&
+                    draggingItem.index != item.index
+            }
         if (targetItem != null) {
-            if (draggingItem.index == state.firstVisibleItemIndex ||
-                targetItem.index == state.firstVisibleItemIndex
+            if (
+                draggingItem.index == state.firstVisibleItemIndex ||
+                    targetItem.index == state.firstVisibleItemIndex
             ) {
                 state.requestScrollToItem(
                     state.firstVisibleItemIndex,
@@ -191,13 +181,14 @@
             onMove.invoke(draggingItem.index, targetItem.index)
             draggingItemIndex = targetItem.index
         } else {
-            val overscroll = when {
-                draggingItemDraggedDelta > 0 ->
-                    (endOffset - state.layoutInfo.viewportEndOffset).coerceAtLeast(0f)
-                draggingItemDraggedDelta < 0 ->
-                    (startOffset - state.layoutInfo.viewportStartOffset).coerceAtMost(0f)
-                else -> 0f
-            }
+            val overscroll =
+                when {
+                    draggingItemDraggedDelta > 0 ->
+                        (endOffset - state.layoutInfo.viewportEndOffset).coerceAtLeast(0f)
+                    draggingItemDraggedDelta < 0 ->
+                        (startOffset - state.layoutInfo.viewportStartOffset).coerceAtMost(0f)
+                    else -> 0f
+                }
             if (overscroll != 0f) {
                 scrollChannel.trySend(overscroll)
             }
@@ -230,22 +221,15 @@
     content: @Composable ColumnScope.(isDragging: Boolean) -> Unit
 ) {
     val dragging = index == dragDropState.draggingItemIndex
-    val draggingModifier = if (dragging) {
-        Modifier
-            .zIndex(1f)
-            .graphicsLayer {
-                translationY = dragDropState.draggingItemOffset
-            }
-    } else if (index == dragDropState.previousIndexOfDraggedItem) {
-        Modifier
-            .zIndex(1f)
-            .graphicsLayer {
+    val draggingModifier =
+        if (dragging) {
+            Modifier.zIndex(1f).graphicsLayer { translationY = dragDropState.draggingItemOffset }
+        } else if (index == dragDropState.previousIndexOfDraggedItem) {
+            Modifier.zIndex(1f).graphicsLayer {
                 translationY = dragDropState.previousItemOffset.value
             }
-    } else {
-        Modifier.animateItem(fadeInSpec = null, fadeOutSpec = null)
-    }
-    Column(modifier = modifier.then(draggingModifier)) {
-        content(dragging)
-    }
+        } else {
+            Modifier.animateItem(fadeInSpec = null, fadeOutSpec = null)
+        }
+    Column(modifier = modifier.then(draggingModifier)) { content(dragging) }
 }
diff --git a/compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/LazyGridDragAndDropDemo.kt b/compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/LazyGridDragAndDropDemo.kt
index 4f7a65a..b8951d2 100644
--- a/compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/LazyGridDragAndDropDemo.kt
+++ b/compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/LazyGridDragAndDropDemo.kt
@@ -68,11 +68,10 @@
     var list by remember { mutableStateOf(List(50) { it }) }
 
     val gridState = rememberLazyGridState()
-    val dragDropState = rememberGridDragDropState(gridState) { fromIndex, toIndex ->
-        list = list.toMutableList().apply {
-            add(toIndex, removeAt(fromIndex))
+    val dragDropState =
+        rememberGridDragDropState(gridState) { fromIndex, toIndex ->
+            list = list.toMutableList().apply { add(toIndex, removeAt(fromIndex)) }
         }
-    }
 
     LazyVerticalGrid(
         columns = GridCells.Fixed(3),
@@ -89,9 +88,7 @@
                     Text(
                         "Item $item",
                         textAlign = TextAlign.Center,
-                        modifier = Modifier
-                            .fillMaxWidth()
-                            .padding(vertical = 40.dp)
+                        modifier = Modifier.fillMaxWidth().padding(vertical = 40.dp)
                     )
                 }
             }
@@ -105,13 +102,8 @@
     onMove: (Int, Int) -> Unit
 ): GridDragDropState {
     val scope = rememberCoroutineScope()
-    val state = remember(gridState) {
-        GridDragDropState(
-            state = gridState,
-            onMove = onMove,
-            scope = scope
-        )
-    }
+    val state =
+        remember(gridState) { GridDragDropState(state = gridState, onMove = onMove, scope = scope) }
     LaunchedEffect(state) {
         while (true) {
             val diff = state.scrollChannel.receive()
@@ -121,7 +113,8 @@
     return state
 }
 
-class GridDragDropState internal constructor(
+class GridDragDropState
+internal constructor(
     private val state: LazyGridState,
     private val scope: CoroutineScope,
     private val onMove: (Int, Int) -> Unit
@@ -134,16 +127,17 @@
     private var draggingItemDraggedDelta by mutableStateOf(Offset.Zero)
     private var draggingItemInitialOffset by mutableStateOf(Offset.Zero)
     internal val draggingItemOffset: Offset
-        get() = draggingItemLayoutInfo?.let { item ->
-            draggingItemInitialOffset + draggingItemDraggedDelta - item.offset.toOffset()
-        } ?: Offset.Zero
+        get() =
+            draggingItemLayoutInfo?.let { item ->
+                draggingItemInitialOffset + draggingItemDraggedDelta - item.offset.toOffset()
+            } ?: Offset.Zero
 
     private val draggingItemLayoutInfo: LazyGridItemInfo?
-        get() = state.layoutInfo.visibleItemsInfo
-            .firstOrNull { it.index == draggingItemIndex }
+        get() = state.layoutInfo.visibleItemsInfo.firstOrNull { it.index == draggingItemIndex }
 
     internal var previousIndexOfDraggedItem by mutableStateOf<Int?>(null)
         private set
+
     internal var previousItemOffset = Animatable(Offset.Zero, Offset.VectorConverter)
         private set
 
@@ -152,7 +146,8 @@
             .firstOrNull { item ->
                 offset.x.toInt() in item.offset.x..item.offsetEnd.x &&
                     offset.y.toInt() in item.offset.y..item.offsetEnd.y
-            }?.also {
+            }
+            ?.also {
                 draggingItemIndex = it.index
                 draggingItemInitialOffset = it.offset.toOffset()
             }
@@ -187,14 +182,16 @@
         val endOffset = startOffset + draggingItem.size.toSize()
         val middleOffset = startOffset + (endOffset - startOffset) / 2f
 
-        val targetItem = state.layoutInfo.visibleItemsInfo.find { item ->
-            middleOffset.x.toInt() in item.offset.x..item.offsetEnd.x &&
-                middleOffset.y.toInt() in item.offset.y..item.offsetEnd.y &&
-                draggingItem.index != item.index
-        }
+        val targetItem =
+            state.layoutInfo.visibleItemsInfo.find { item ->
+                middleOffset.x.toInt() in item.offset.x..item.offsetEnd.x &&
+                    middleOffset.y.toInt() in item.offset.y..item.offsetEnd.y &&
+                    draggingItem.index != item.index
+            }
         if (targetItem != null) {
-            if (draggingItem.index == state.firstVisibleItemIndex ||
-                targetItem.index == state.firstVisibleItemIndex
+            if (
+                draggingItem.index == state.firstVisibleItemIndex ||
+                    targetItem.index == state.firstVisibleItemIndex
             ) {
                 state.requestScrollToItem(
                     state.firstVisibleItemIndex,
@@ -204,13 +201,14 @@
             onMove.invoke(draggingItem.index, targetItem.index)
             draggingItemIndex = targetItem.index
         } else {
-            val overscroll = when {
-                draggingItemDraggedDelta.y > 0 ->
-                    (endOffset.y - state.layoutInfo.viewportEndOffset).coerceAtLeast(0f)
-                draggingItemDraggedDelta.y < 0 ->
-                    (startOffset.y - state.layoutInfo.viewportStartOffset).coerceAtMost(0f)
-                else -> 0f
-            }
+            val overscroll =
+                when {
+                    draggingItemDraggedDelta.y > 0 ->
+                        (endOffset.y - state.layoutInfo.viewportEndOffset).coerceAtLeast(0f)
+                    draggingItemDraggedDelta.y < 0 ->
+                        (startOffset.y - state.layoutInfo.viewportStartOffset).coerceAtMost(0f)
+                    else -> 0f
+                }
             if (overscroll != 0f) {
                 scrollChannel.trySend(overscroll)
             }
@@ -251,23 +249,20 @@
     content: @Composable (isDragging: Boolean) -> Unit
 ) {
     val dragging = index == dragDropState.draggingItemIndex
-    val draggingModifier = if (dragging) {
-        Modifier
-            .zIndex(1f)
-            .graphicsLayer {
+    val draggingModifier =
+        if (dragging) {
+            Modifier.zIndex(1f).graphicsLayer {
                 translationX = dragDropState.draggingItemOffset.x
                 translationY = dragDropState.draggingItemOffset.y
             }
-    } else if (index == dragDropState.previousIndexOfDraggedItem) {
-        Modifier
-            .zIndex(1f)
-            .graphicsLayer {
+        } else if (index == dragDropState.previousIndexOfDraggedItem) {
+            Modifier.zIndex(1f).graphicsLayer {
                 translationX = dragDropState.previousItemOffset.value.x
                 translationY = dragDropState.previousItemOffset.value.y
             }
-    } else {
-        Modifier.animateItem(fadeInSpec = null, fadeOutSpec = null)
-    }
+        } else {
+            Modifier.animateItem(fadeInSpec = null, fadeOutSpec = null)
+        }
     Box(modifier = modifier.then(draggingModifier), propagateMinConstraints = true) {
         content(dragging)
     }
diff --git a/compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/ListDemos.kt b/compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/ListDemos.kt
index eff136e..282aefc 100644
--- a/compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/ListDemos.kt
+++ b/compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/ListDemos.kt
@@ -114,43 +114,50 @@
 import kotlinx.coroutines.CancellationException
 import kotlinx.coroutines.launch
 
-val LazyListDemos = listOf(
-    ComposableDemo("Simple column") { LazyColumnDemo() },
-    ComposableDemo("Add/remove items") { ListAddRemoveItemsDemo() },
-    ComposableDemo("Hoisted state") { ListHoistedStateDemo() },
-    ComposableDemo("Horizontal list") { LazyRowItemsDemo() },
-    ComposableDemo("List with indexes") { ListWithIndexSample() },
-    ComposableDemo("Pager-like list") { PagerLikeDemo() },
-    ComposableDemo("Rtl list") { RtlListDemo() },
-    ComposableDemo("LazyColumn DSL") { LazyColumnScope() },
-    ComposableDemo("LazyRow DSL") { LazyRowScope() },
-    ComposableDemo("LazyColumn with sticky headers") { StickyHeaderSample() },
-    ComposableDemo("Arrangements") { LazyListArrangements() },
-    ComposableDemo("ReverseLayout and RTL") { ReverseLayoutAndRtlDemo() },
-    ComposableDemo("Nested lazy lists") { NestedLazyDemo() },
-    ComposableDemo("LazyGrid") { LazyGridDemo() },
-    ComposableDemo("LazyGrid with Spacing") { LazyGridWithSpacingDemo() },
-    ComposableDemo("Custom keys") { ReorderWithCustomKeys() },
-    ComposableDemo("Fling Config") { LazyWithFlingConfig() },
-    ComposableDemo("Item reordering") { PopularBooksDemo() },
-    ComposableDemo("List drag and drop") { LazyColumnDragAndDropDemo() },
-    ComposableDemo("Grid drag and drop") { LazyGridDragAndDropDemo() },
-    ComposableDemo("Staggered grid") { LazyStaggeredGridDemo() },
-    ComposableDemo("Animate item placement") { AnimateItemPlacementDemo() },
-    ComposableDemo("Focus Scrolling") { BringIntoViewDemo() },
-    PagingDemos
-)
+val LazyListDemos =
+    listOf(
+        ComposableDemo("Simple column") { LazyColumnDemo() },
+        ComposableDemo("Add/remove items") { ListAddRemoveItemsDemo() },
+        ComposableDemo("Hoisted state") { ListHoistedStateDemo() },
+        ComposableDemo("Horizontal list") { LazyRowItemsDemo() },
+        ComposableDemo("List with indexes") { ListWithIndexSample() },
+        ComposableDemo("Pager-like list") { PagerLikeDemo() },
+        ComposableDemo("Rtl list") { RtlListDemo() },
+        ComposableDemo("LazyColumn DSL") { LazyColumnScope() },
+        ComposableDemo("LazyRow DSL") { LazyRowScope() },
+        ComposableDemo("LazyColumn with sticky headers") { StickyHeaderSample() },
+        ComposableDemo("Arrangements") { LazyListArrangements() },
+        ComposableDemo("ReverseLayout and RTL") { ReverseLayoutAndRtlDemo() },
+        ComposableDemo("Nested lazy lists") { NestedLazyDemo() },
+        ComposableDemo("LazyGrid") { LazyGridDemo() },
+        ComposableDemo("LazyGrid with Spacing") { LazyGridWithSpacingDemo() },
+        ComposableDemo("Custom keys") { ReorderWithCustomKeys() },
+        ComposableDemo("Fling Config") { LazyWithFlingConfig() },
+        ComposableDemo("Item reordering") { PopularBooksDemo() },
+        ComposableDemo("List drag and drop") { LazyColumnDragAndDropDemo() },
+        ComposableDemo("Grid drag and drop") { LazyGridDragAndDropDemo() },
+        ComposableDemo("Staggered grid") { LazyStaggeredGridDemo() },
+        ComposableDemo("Animate item placement") { AnimateItemPlacementDemo() },
+        ComposableDemo("Focus Scrolling") { BringIntoViewDemo() },
+        PagingDemos
+    )
 
 @Preview
 @Composable
 private fun LazyColumnDemo() {
     LazyColumn {
         items(
-            items = listOf(
-                "Hello,", "World:", "It works!", "",
-                "this one is really long and spans a few lines for scrolling purposes",
-                "these", "are", "offscreen"
-            )
+            items =
+                listOf(
+                    "Hello,",
+                    "World:",
+                    "It works!",
+                    "",
+                    "this one is really long and spans a few lines for scrolling purposes",
+                    "these",
+                    "are",
+                    "offscreen"
+                )
         ) {
             Text(text = it, fontSize = 80.sp)
 
@@ -158,9 +165,7 @@
                 Text("You can even emit multiple components per item.")
             }
         }
-        items(100) {
-            Text(text = "$it", fontSize = 80.sp)
-        }
+        items(100) { Text(text = "$it", fontSize = 80.sp) }
     }
 }
 
@@ -198,9 +203,7 @@
             Button(
                 modifier = buttonModifier,
                 onClick = {
-                    coroutineScope.launch {
-                        state.scrollToItem(state.firstVisibleItemIndex - 1)
-                    }
+                    coroutineScope.launch { state.scrollToItem(state.firstVisibleItemIndex - 1) }
                 }
             ) {
                 Text("Previous")
@@ -208,9 +211,7 @@
             Button(
                 modifier = buttonModifier,
                 onClick = {
-                    coroutineScope.launch {
-                        state.scrollToItem(state.firstVisibleItemIndex + 1)
-                    }
+                    coroutineScope.launch { state.scrollToItem(state.firstVisibleItemIndex + 1) }
                 }
             ) {
                 Text("Next")
@@ -241,10 +242,7 @@
                 modifier = buttonModifier,
                 onClick = {
                     coroutineScope.launch {
-                        state.animateScrollToItem(
-                            state.firstVisibleItemIndex,
-                            500
-                        )
+                        state.animateScrollToItem(state.firstVisibleItemIndex, 500)
                     }
                 }
             ) {
@@ -256,12 +254,13 @@
                     with(density) {
                         coroutineScope.launch {
                             val requestedScroll = 10000.dp.toPx()
-                            lastScrollDescription = try {
-                                val actualScroll = state.animateScrollBy(requestedScroll)
-                                "$actualScroll/$requestedScroll px"
-                            } catch (_: CancellationException) {
-                                "Interrupted!"
-                            }
+                            lastScrollDescription =
+                                try {
+                                    val actualScroll = state.animateScrollBy(requestedScroll)
+                                    "$actualScroll/$requestedScroll px"
+                                } catch (_: CancellationException) {
+                                    "Interrupted!"
+                                }
                         }
                     }
                 }
@@ -280,13 +279,8 @@
                 fontSize = 20.sp
             )
         }
-        LazyColumn(
-            Modifier.fillMaxWidth(),
-            state = state
-        ) {
-            items(numItems) {
-                Text("$it", style = LocalTextStyle.current.copy(fontSize = 40.sp))
-            }
+        LazyColumn(Modifier.fillMaxWidth(), state = state) {
+            items(numItems) { Text("$it", style = LocalTextStyle.current.copy(fontSize = 40.sp)) }
         }
     }
 }
@@ -294,21 +288,14 @@
 @Preview
 @Composable
 private fun LazyRowItemsDemo() {
-    LazyRow {
-        items(1000) {
-            Square(it)
-        }
-    }
+    LazyRow { items(1000) { Square(it) } }
 }
 
 @Composable
 private fun Square(index: Int) {
     val width = remember { Random.nextInt(50, 150).dp }
     Box(
-        Modifier
-            .width(width)
-            .fillMaxHeight()
-            .background(colors[index % colors.size]),
+        Modifier.width(width).fillMaxHeight().background(colors[index % colors.size]),
         contentAlignment = Alignment.Center
     ) {
         Text(index.toString())
@@ -339,8 +326,7 @@
             items(100) {
                 Text(
                     "$it",
-                    Modifier
-                        .requiredSize(100.dp)
+                    Modifier.requiredSize(100.dp)
                         .background(if (it % 2 == 0) Color.LightGray else Color.Transparent)
                         .padding(16.dp)
                 )
@@ -352,60 +338,41 @@
 @Composable
 private fun PagerLikeDemo() {
     val pages = listOf(Color.LightGray, Color.White, Color.DarkGray)
-    LazyRow {
-        items(pages) {
-            Spacer(
-                Modifier
-                    .fillParentMaxSize()
-                    .background(it)
-            )
-        }
-    }
+    LazyRow { items(pages) { Spacer(Modifier.fillParentMaxSize().background(it)) } }
 }
 
-private val colors = listOf(
-    Color(0xFFffd7d7.toInt()),
-    Color(0xFFffe9d6.toInt()),
-    Color(0xFFfffbd0.toInt()),
-    Color(0xFFe3ffd9.toInt()),
-    Color(0xFFd0fff8.toInt())
-)
+private val colors =
+    listOf(
+        Color(0xFFffd7d7.toInt()),
+        Color(0xFFffe9d6.toInt()),
+        Color(0xFFfffbd0.toInt()),
+        Color(0xFFe3ffd9.toInt()),
+        Color(0xFFd0fff8.toInt())
+    )
 
 @Composable
 private fun LazyColumnScope() {
     LazyColumn {
-        items(10) {
-            Text("$it", fontSize = 40.sp)
-        }
+        items(10) { Text("$it", fontSize = 40.sp) }
 
-        item {
-            Text("Single item", fontSize = 40.sp)
-        }
+        item { Text("Single item", fontSize = 40.sp) }
 
         val items = listOf("A", "B", "C")
-        itemsIndexed(items) { index, item ->
-            Text("Item $item has index $index", fontSize = 40.sp)
-        }
+        itemsIndexed(items) { index, item -> Text("Item $item has index $index", fontSize = 40.sp) }
     }
 }
 
 @Composable
 private fun LazyRowScope() {
     LazyRow {
-        items(10) {
-            Text("$it", fontSize = 40.sp)
-        }
+        items(10) { Text("$it", fontSize = 40.sp) }
 
-        item {
-            Text("Single item", fontSize = 40.sp)
-        }
+        item { Text("Single item", fontSize = 40.sp) }
 
         val items = listOf(Color.Cyan, Color.Blue, Color.Magenta)
         itemsIndexed(items) { index, item ->
             Box(
-                modifier = Modifier
-                    .background(item)
-                    .requiredSize(40.dp),
+                modifier = Modifier.background(item).requiredSize(40.dp),
                 contentAlignment = Alignment.Center
             ) {
                 Text("$index", fontSize = 30.sp)
@@ -420,12 +387,8 @@
     var arrangement by remember { mutableIntStateOf(6) }
     Column {
         Row {
-            Button(onClick = { count-- }) {
-                Text("--")
-            }
-            Button(onClick = { count++ }) {
-                Text("++")
-            }
+            Button(onClick = { count-- }) { Text("--") }
+            Button(onClick = { count++ }) { Text("++") }
             Button(
                 onClick = {
                     arrangement++
@@ -439,50 +402,42 @@
             Text("$arrangement ${Arrangements[arrangement]}")
         }
         Row {
-            val item = @Composable {
-                Box(
-                    Modifier
-                        .requiredHeight(200.dp)
-                        .fillMaxWidth()
-                        .background(Color.Red)
-                        .border(1.dp, Color.Cyan)
-                )
-            }
+            val item =
+                @Composable {
+                    Box(
+                        Modifier.requiredHeight(200.dp)
+                            .fillMaxWidth()
+                            .background(Color.Red)
+                            .border(1.dp, Color.Cyan)
+                    )
+                }
             Column(
                 verticalArrangement = Arrangements[arrangement],
-                modifier = Modifier
-                    .weight(1f)
-                    .fillMaxHeight()
-                    .verticalScroll(rememberScrollState())
+                modifier = Modifier.weight(1f).fillMaxHeight().verticalScroll(rememberScrollState())
             ) {
-                repeat(count) {
-                    item()
-                }
+                repeat(count) { item() }
             }
             LazyColumn(
                 verticalArrangement = Arrangements[arrangement],
-                modifier = Modifier
-                    .weight(1f)
-                    .fillMaxHeight()
+                modifier = Modifier.weight(1f).fillMaxHeight()
             ) {
-                items(count) {
-                    item()
-                }
+                items(count) { item() }
             }
         }
     }
 }
 
-private val Arrangements = listOf(
-    Arrangement.Center,
-    Arrangement.Top,
-    Arrangement.Bottom,
-    Arrangement.SpaceAround,
-    Arrangement.SpaceBetween,
-    Arrangement.SpaceEvenly,
-    Arrangement.spacedBy(40.dp),
-    Arrangement.spacedBy(40.dp, Alignment.Bottom),
-)
+private val Arrangements =
+    listOf(
+        Arrangement.Center,
+        Arrangement.Top,
+        Arrangement.Bottom,
+        Arrangement.SpaceAround,
+        Arrangement.SpaceBetween,
+        Arrangement.SpaceEvenly,
+        Arrangement.spacedBy(40.dp),
+        Arrangement.spacedBy(40.dp, Alignment.Bottom),
+    )
 
 @Composable
 private fun ReverseLayoutAndRtlDemo() {
@@ -501,12 +456,8 @@
             horizontalArrangement = Arrangement.spacedBy(10.dp),
             verticalAlignment = Alignment.CenterVertically
         ) {
-            Button(onClick = { count = max(0, count - 5) }) {
-                Text("--")
-            }
-            Button(onClick = { count += 5 }) {
-                Text("++")
-            }
+            Button(onClick = { count = max(0, count - 5) }) { Text("--") }
+            Button(onClick = { count += 5 }) { Text("++") }
             Column {
                 Row {
                     Checkbox(checked = reverse, onCheckedChange = { reverse = it })
@@ -529,26 +480,17 @@
             }
         }
 
-        val itemModifier = if (column) {
-            Modifier
-                .heightIn(200.dp)
-                .fillMaxWidth()
-        } else {
-            Modifier
-                .widthIn(200.dp)
-                .fillMaxHeight()
-        }
-        val item1 = @Composable { index: Int ->
-            Text(
-                "${index}A",
-                itemModifier
-                    .background(backgroundColor)
-                    .border(1.dp, Color.Cyan)
-            )
-        }
-        val item2 = @Composable { index: Int ->
-            Text("${index}B")
-        }
+        val itemModifier =
+            if (column) {
+                Modifier.heightIn(200.dp).fillMaxWidth()
+            } else {
+                Modifier.widthIn(200.dp).fillMaxHeight()
+            }
+        val item1 =
+            @Composable { index: Int ->
+                Text("${index}A", itemModifier.background(backgroundColor).border(1.dp, Color.Cyan))
+            }
+        val item2 = @Composable { index: Int -> Text("${index}B") }
 
         @Composable
         fun NonLazyContent() {
@@ -585,10 +527,10 @@
                 CompositionLocalProvider(LocalLayoutDirection provides direction) {
                     Column(
                         verticalArrangement = if (reverse) Arrangement.Bottom else Arrangement.Top,
-                        modifier = Modifier
-                            .weight(1f)
-                            .fillMaxHeight()
-                            .verticalScroll(scrollState, reverseScrolling = reverse)
+                        modifier =
+                            Modifier.weight(1f)
+                                .fillMaxHeight()
+                                .verticalScroll(scrollState, reverseScrolling = reverse)
                     ) {
                         NonLazyContent()
                     }
@@ -597,9 +539,7 @@
                     LazyColumn(
                         reverseLayout = reverse,
                         state = lazyState,
-                        modifier = Modifier
-                            .weight(1f)
-                            .fillMaxHeight(),
+                        modifier = Modifier.weight(1f).fillMaxHeight(),
                         content = lazyContent
                     )
                 }
@@ -609,10 +549,10 @@
             CompositionLocalProvider(LocalLayoutDirection provides direction) {
                 Row(
                     horizontalArrangement = if (reverse) Arrangement.End else Arrangement.Start,
-                    modifier = Modifier
-                        .weight(1f)
-                        .fillMaxWidth()
-                        .horizontalScroll(scrollState, reverseScrolling = reverse)
+                    modifier =
+                        Modifier.weight(1f)
+                            .fillMaxWidth()
+                            .horizontalScroll(scrollState, reverseScrolling = reverse)
                 ) {
                     NonLazyContent()
                 }
@@ -624,9 +564,7 @@
             CompositionLocalProvider(LocalLayoutDirection provides direction) {
                 LazyRow(
                     state = lazyState,
-                    modifier = Modifier
-                        .weight(1f)
-                        .fillMaxWidth(),
+                    modifier = Modifier.weight(1f).fillMaxWidth(),
                     reverseLayout = reverse,
                     content = lazyContent
                 )
@@ -637,47 +575,30 @@
 
 @Composable
 private fun NestedLazyDemo() {
-    val item = @Composable { index: Int ->
-        Box(
-            Modifier
-                .padding(16.dp)
-                .requiredSize(200.dp)
-                .background(Color.LightGray),
-            contentAlignment = Alignment.Center
-        ) {
-            var state by rememberSaveable { mutableIntStateOf(0) }
-            Button(onClick = { state++ }) {
-                Text("Index=$index State=$state")
+    val item =
+        @Composable { index: Int ->
+            Box(
+                Modifier.padding(16.dp).requiredSize(200.dp).background(Color.LightGray),
+                contentAlignment = Alignment.Center
+            ) {
+                var state by rememberSaveable { mutableIntStateOf(0) }
+                Button(onClick = { state++ }) { Text("Index=$index State=$state") }
             }
         }
-    }
     LazyColumn {
-        item {
-            LazyRow {
-                items(100) {
-                    item(it)
-                }
-            }
-        }
-        items(100) {
-            item(it)
-        }
+        item { LazyRow { items(100) { item(it) } } }
+        items(100) { item(it) }
     }
 }
 
 @Composable
 private fun LazyGridDemo() {
-    val columnModes = listOf(
-        GridCells.Fixed(3),
-        GridCells.Adaptive(minSize = 60.dp)
-    )
+    val columnModes = listOf(GridCells.Fixed(3), GridCells.Adaptive(minSize = 60.dp))
     var currentMode by remember { mutableIntStateOf(0) }
     Column {
         Button(
             modifier = Modifier.wrapContentSize(),
-            onClick = {
-                currentMode = (currentMode + 1) % columnModes.size
-            }
+            onClick = { currentMode = (currentMode + 1) % columnModes.size }
         ) {
             Text("Switch mode")
         }
@@ -692,9 +613,8 @@
             Text(
                 text = "$it",
                 fontSize = 20.sp,
-                modifier = Modifier
-                    .background(Color.Gray.copy(alpha = (it % 10) / 10f))
-                    .padding(8.dp)
+                modifier =
+                    Modifier.background(Color.Gray.copy(alpha = (it % 10) / 10f)).padding(8.dp)
             )
         }
     }
@@ -704,22 +624,23 @@
 @Preview
 @Composable
 private fun LazyGridWithSpacingDemo() {
-    val columnModes = listOf(
-        GridCells.Fixed(3),
-        GridCells.Adaptive(minSize = 60.dp),
-        GridCells.FixedSize(50.dp),
-        object : GridCells {
-            // columns widths have ratio 1:1:2:3
-            override fun Density.calculateCrossAxisCellSizes(
-                availableSize: Int,
-                spacing: Int,
-            ): List<Int> {
-                val totalSlots = 1 + 1 + 2 + 3
-                val slotWidth = (availableSize - spacing * 3) / totalSlots
-                return listOf(slotWidth, slotWidth, slotWidth * 2, slotWidth * 3)
+    val columnModes =
+        listOf(
+            GridCells.Fixed(3),
+            GridCells.Adaptive(minSize = 60.dp),
+            GridCells.FixedSize(50.dp),
+            object : GridCells {
+                // columns widths have ratio 1:1:2:3
+                override fun Density.calculateCrossAxisCellSizes(
+                    availableSize: Int,
+                    spacing: Int,
+                ): List<Int> {
+                    val totalSlots = 1 + 1 + 2 + 3
+                    val slotWidth = (availableSize - spacing * 3) / totalSlots
+                    return listOf(slotWidth, slotWidth, slotWidth * 2, slotWidth * 3)
+                }
             }
-        }
-    )
+        )
     var currentMode by remember { mutableIntStateOf(0) }
     var horizontalSpacing by remember { mutableIntStateOf(8) }
     var horizontalSpacingExpanded by remember { mutableStateOf(false) }
@@ -729,9 +650,7 @@
         Row {
             Button(
                 modifier = Modifier.wrapContentSize(),
-                onClick = {
-                    currentMode = (currentMode + 1) % columnModes.size
-                }
+                onClick = { currentMode = (currentMode + 1) % columnModes.size }
             ) {
                 Text("Switch mode")
             }
@@ -853,9 +772,8 @@
             Text(
                 text = "$it",
                 fontSize = 20.sp,
-                modifier = Modifier
-                    .background(Color.Gray.copy(alpha = (it % 10) / 10f))
-                    .padding(8.dp)
+                modifier =
+                    Modifier.background(Color.Gray.copy(alpha = (it % 10) / 10f)).padding(8.dp)
             )
         }
     }
@@ -866,20 +784,13 @@
 private fun ReorderWithCustomKeys() {
     var names by remember { mutableStateOf(listOf("John", "Sara", "Dan")) }
     Column {
-        Button(onClick = { names = names.shuffled() }) {
-            Text("Shuffle")
-        }
+        Button(onClick = { names = names.shuffled() }) { Text("Shuffle") }
         LazyColumn {
             item {
                 var counter by rememberSaveable { mutableIntStateOf(0) }
-                Button(onClick = { counter++ }) {
-                    Text("Header has $counter")
-                }
+                Button(onClick = { counter++ }) { Text("Header has $counter") }
             }
-            items(
-                items = names,
-                key = { it }
-            ) {
+            items(items = names, key = { it }) {
                 var counter by rememberSaveable { mutableIntStateOf(0) }
                 Button(onClick = { counter++ }, modifier = Modifier.animateItem()) {
                     Text("$it has $counter")
@@ -910,39 +821,34 @@
                         listOf(perDance * 3 / 4, -perDance * 1 / 4).forEach { toGo ->
                             if (abs(lastLeft) > 1f) return@forEach
                             var lastValue = 0f
-                            AnimationState(
-                                initialValue = 0f,
-                                lastFrameTimeNanos = lastFrameTime
-                            ).animateTo(
-                                targetValue = toGo,
-                                sequentialAnimation = lastFrameTime != unspecifiedFrame
-                            ) {
-                                val delta = value - lastValue
-                                lastLeft = delta - scrollBy(delta)
-                                lastValue = value
-                                velocityLeft = this.velocity
-                                lastFrameTime = this.lastFrameTimeNanos
-                                if (abs(lastLeft) > 0.5f) this.cancelAnimation()
-                            }
+                            AnimationState(initialValue = 0f, lastFrameTimeNanos = lastFrameTime)
+                                .animateTo(
+                                    targetValue = toGo,
+                                    sequentialAnimation = lastFrameTime != unspecifiedFrame
+                                ) {
+                                    val delta = value - lastValue
+                                    lastLeft = delta - scrollBy(delta)
+                                    lastValue = value
+                                    velocityLeft = this.velocity
+                                    lastFrameTime = this.lastFrameTimeNanos
+                                    if (abs(lastLeft) > 0.5f) this.cancelAnimation()
+                                }
                         }
                     }
                     return velocityLeft
                 }
             }
         }
-        LazyColumn(
-            modifier = Modifier.fillMaxSize(),
-            flingBehavior = flingConfig
-        ) {
+        LazyColumn(modifier = Modifier.fillMaxSize(), flingBehavior = flingConfig) {
             items(100) {
                 Text(
                     text = "$it",
                     fontSize = 20.sp,
-                    modifier = Modifier
-                        .fillParentMaxWidth()
-                        .background(Color.Gray.copy(alpha = it / 100f))
-                        .border(1.dp, Color.Gray)
-                        .padding(16.dp)
+                    modifier =
+                        Modifier.fillParentMaxWidth()
+                            .background(Color.Gray.copy(alpha = it / 100f))
+                            .border(1.dp, Color.Gray)
+                            .padding(16.dp)
                 )
             }
         }
@@ -952,45 +858,26 @@
 @Preview
 @Composable
 private fun LazyStaggeredGridDemo() {
-    val heights = remember {
-        List(100) {
-            (Random.nextInt(100) + 100).dp
-        }
-    }
+    val heights = remember { List(100) { (Random.nextInt(100) + 100).dp } }
 
-    val colors = remember {
-        List(100) {
-            Color.hsl(
-                Random.nextFloat() * 360,
-                .5f,
-                .65f
-            )
-        }
-    }
+    val colors = remember { List(100) { Color.hsl(Random.nextFloat() * 360, .5f, .65f) } }
 
-    val indices = remember {
-        mutableStateOf(List(100) { it })
-    }
+    val indices = remember { mutableStateOf(List(100) { it }) }
 
     var count by remember { mutableIntStateOf(10) }
     var reverseLayout by remember { mutableStateOf(false) }
     var rtl by remember { mutableStateOf(false) }
 
     Column(Modifier.fillMaxSize()) {
-        Row(
-            modifier = Modifier.fillMaxWidth(),
-            horizontalArrangement = Arrangement.SpaceBetween
-        ) {
+        Row(modifier = Modifier.fillMaxWidth(), horizontalArrangement = Arrangement.SpaceBetween) {
             Button(onClick = { count++ }) { Text(text = "++") }
-            Button(onClick = { reverseLayout = !reverseLayout }) {
-                Text("reverse")
+            Button(onClick = { reverseLayout = !reverseLayout }) { Text("reverse") }
+            Button(onClick = { rtl = !rtl }) { Text(if (rtl) "rtl" else "ltr") }
+            Button(
+                onClick = { indices.value = indices.value.toMutableList().apply { shuffle() } }
+            ) {
+                Text(text = "shuffle")
             }
-            Button(onClick = { rtl = !rtl }) {
-                Text(if (rtl) "rtl" else "ltr")
-            }
-            Button(onClick = {
-                indices.value = indices.value.toMutableList().apply { shuffle() }
-            }) { Text(text = "shuffle") }
             Button(onClick = { if (count != 0) count-- }) { Text(text = "--") }
         }
 
@@ -1010,10 +897,8 @@
                     items(
                         count,
                         span = {
-                            if (it % 30 == 0)
-                                StaggeredGridItemSpan.FullLine
-                            else
-                                StaggeredGridItemSpan.SingleLane
+                            if (it % 30 == 0) StaggeredGridItemSpan.FullLine
+                            else StaggeredGridItemSpan.SingleLane
                         },
                         key = { indices.value[it % indices.value.size] }
                     ) {
@@ -1021,13 +906,11 @@
                         val index = indices.value[it % indices.value.size]
                         val color = colors[index]
                         Box(
-                            modifier = Modifier
-                                .animateItem()
-                                .height(if (!expanded) heights[index] else heights[index] * 2)
-                                .border(2.dp, color, RoundedCornerShape(5.dp))
-                                .clickable {
-                                    expanded = !expanded
-                                }
+                            modifier =
+                                Modifier.animateItem()
+                                    .height(if (!expanded) heights[index] else heights[index] * 2)
+                                    .border(2.dp, color, RoundedCornerShape(5.dp))
+                                    .clickable { expanded = !expanded }
                         ) {
                             Text(
                                 "$it",
@@ -1046,99 +929,66 @@
 @OptIn(ExperimentalFoundationApi::class)
 @Composable
 private fun AnimateItemPlacementDemo() {
-    val items = remember {
-        mutableStateListOf<Int>().apply {
-            repeat(20) { add(it) }
-        }
-    }
+    val items = remember { mutableStateListOf<Int>().apply { repeat(20) { add(it) } } }
     val selectedIndexes = remember { mutableStateMapOf<Int, Boolean>() }
     var reverse by remember { mutableStateOf(false) }
     Column {
         Row {
-            Button(onClick = {
-                selectedIndexes.entries.reversed().forEach { entry ->
-                    if (entry.value) {
-                        items.remove(entry.key)
-                        items.add(items.size - 3, entry.key)
+            Button(
+                onClick = {
+                    selectedIndexes.entries.reversed().forEach { entry ->
+                        if (entry.value) {
+                            items.remove(entry.key)
+                            items.add(items.size - 3, entry.key)
+                        }
                     }
                 }
-            }) {
+            ) {
                 Text("MoveToEnd")
             }
-            Button(onClick = {
-                selectedIndexes.clear()
-            }) {
-                Text("RmvSelected")
-            }
-            Button(onClick = {
-                reverse = !reverse
-            }) {
-                Text("Reverse=$reverse")
-            }
+            Button(onClick = { selectedIndexes.clear() }) { Text("RmvSelected") }
+            Button(onClick = { reverse = !reverse }) { Text("Reverse=$reverse") }
         }
-        LazyColumn(
-            Modifier
-                .fillMaxWidth()
-                .weight(1f), reverseLayout = reverse
-        ) {
+        LazyColumn(Modifier.fillMaxWidth().weight(1f), reverseLayout = reverse) {
             items(items, key = { it }) { item ->
                 val selected = selectedIndexes.getOrDefault(item, false)
                 val modifier = Modifier.animateItem(fadeInSpec = null, fadeOutSpec = null)
                 var height by remember { mutableStateOf(40.dp) }
                 Row(
-                    modifier
-                        .padding(8.dp)
-                        .fillMaxWidth()
-                        .border(1.dp, Color.Black)
-                        .clickable {
-                            height = if (height == 40.dp) 120.dp else 40.dp
-                        },
+                    modifier.padding(8.dp).fillMaxWidth().border(1.dp, Color.Black).clickable {
+                        height = if (height == 40.dp) 120.dp else 40.dp
+                    },
                     verticalAlignment = Alignment.CenterVertically
                 ) {
-                    Checkbox(checked = selected, onCheckedChange = {
-                        selectedIndexes[item] = it
-                    })
-                    Spacer(
-                        Modifier
-                            .width(16.dp)
-                            .height(height)
-                    )
+                    Checkbox(checked = selected, onCheckedChange = { selectedIndexes[item] = it })
+                    Spacer(Modifier.width(16.dp).height(height))
                     Text("Item $item")
                 }
             }
         }
         var size by remember { mutableStateOf(40.dp) }
         Box(
-            Modifier
-                .height(size)
-                .fillMaxWidth()
-                .border(1.dp, Color.DarkGray)
-                .clickable {
-                    size = if (size == 40.dp) 350.dp else 40.dp
-                })
+            Modifier.height(size).fillMaxWidth().border(1.dp, Color.DarkGray).clickable {
+                size = if (size == 40.dp) 350.dp else 40.dp
+            }
+        )
     }
 }
 
 @Preview(uiMode = Configuration.UI_MODE_TYPE_TELEVISION)
 @Composable
 private fun BringIntoViewDemo() {
-    LazyRow(
-        modifier = Modifier
-            .fillMaxWidth()
-            .wrapContentHeight()
-    ) {
+    LazyRow(modifier = Modifier.fillMaxWidth().wrapContentHeight()) {
         items(100) {
             var color by remember { mutableStateOf(Color.White) }
             Box(
-                modifier = Modifier
-                    .size(100.dp)
-                    .padding(4.dp)
-                    .background(Color.Gray)
-                    .onFocusChanged {
-                        color = if (it.isFocused) Red else White
-                    }
-                    .border(5.dp, color)
-                    .focusable(),
+                modifier =
+                    Modifier.size(100.dp)
+                        .padding(4.dp)
+                        .background(Color.Gray)
+                        .onFocusChanged { color = if (it.isFocused) Red else White }
+                        .border(5.dp, color)
+                        .focusable(),
                 contentAlignment = Alignment.Center
             ) {
                 Text(text = it.toString())
diff --git a/compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/LongScreenshotsDemos.kt b/compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/LongScreenshotsDemos.kt
index f40115d..5fc0218 100644
--- a/compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/LongScreenshotsDemos.kt
+++ b/compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/LongScreenshotsDemos.kt
@@ -67,21 +67,22 @@
 import androidx.compose.ui.viewinterop.AndroidView
 import androidx.compose.ui.window.Dialog
 
-val LongScreenshotsDemos = listOf(
-    ComposableDemo("Single, small, eager list") { SingleEagerListDemo() },
-    ComposableDemo("Single, small, lazy list") { SingleLazyListDemo() },
-    ComposableDemo("Single, full-screen list") { SingleFullScreenListDemo() },
-    ComposableDemo("Lazy list with content padding") { LazyListContentPaddingDemo() },
-    ComposableDemo("Big viewport nested in smaller outer viewport") { BigInLittleDemo() },
-    ComposableDemo("Scrollable in dialog") { InDialogDemo() },
-    ComposableDemo("Nested AndroidView") { AndroidViewDemo() },
-    ComposableDemo("TextField in scrollable (legacy)") { LegacyTextFieldInScrollableDemo() },
-    ComposableDemo("Single giant text field (legacy)") { LegacySingleGiantTextFieldDemo() },
-    ComposableDemo("TextField in scrollable") { TextFieldInScrollableDemo() },
-    ComposableDemo("Single giant text field") { SingleGiantTextFieldDemo() },
-    ComposableDemo("Lazy list with sticky headers") { LazyListWithStickiesDemo() },
-    ComposableDemo("Reverse layout") { ReverseScrollingCaptureDemo() },
-)
+val LongScreenshotsDemos =
+    listOf(
+        ComposableDemo("Single, small, eager list") { SingleEagerListDemo() },
+        ComposableDemo("Single, small, lazy list") { SingleLazyListDemo() },
+        ComposableDemo("Single, full-screen list") { SingleFullScreenListDemo() },
+        ComposableDemo("Lazy list with content padding") { LazyListContentPaddingDemo() },
+        ComposableDemo("Big viewport nested in smaller outer viewport") { BigInLittleDemo() },
+        ComposableDemo("Scrollable in dialog") { InDialogDemo() },
+        ComposableDemo("Nested AndroidView") { AndroidViewDemo() },
+        ComposableDemo("TextField in scrollable (legacy)") { LegacyTextFieldInScrollableDemo() },
+        ComposableDemo("Single giant text field (legacy)") { LegacySingleGiantTextFieldDemo() },
+        ComposableDemo("TextField in scrollable") { TextFieldInScrollableDemo() },
+        ComposableDemo("Single giant text field") { SingleGiantTextFieldDemo() },
+        ComposableDemo("Lazy list with sticky headers") { LazyListWithStickiesDemo() },
+        ComposableDemo("Reverse layout") { ReverseScrollingCaptureDemo() },
+    )
 
 @Composable
 private fun SingleEagerListDemo() {
@@ -89,9 +90,7 @@
     var fullHeight by remember { mutableStateOf(false) }
 
     Column(
-        modifier = Modifier
-            .fillMaxSize()
-            .wrapContentHeight(),
+        modifier = Modifier.fillMaxSize().wrapContentHeight(),
         horizontalAlignment = Alignment.CenterHorizontally
     ) {
         Text(
@@ -116,19 +115,13 @@
         Divider()
 
         Column(
-            Modifier
-                .border(1.dp, Color.Black)
+            Modifier.border(1.dp, Color.Black)
                 .fillMaxWidth(fraction = if (fullWidth) 1f else 0.75f)
                 .fillMaxHeight(fraction = if (fullHeight) 1f else 0.75f)
                 .verticalScroll(rememberScrollState())
         ) {
             repeat(50) { index ->
-                Button(
-                    onClick = {},
-                    Modifier
-                        .padding(8.dp)
-                        .fillMaxWidth()
-                ) {
+                Button(onClick = {}, Modifier.padding(8.dp).fillMaxWidth()) {
                     Text("Button $index")
                 }
             }
@@ -139,9 +132,7 @@
 @Composable
 private fun SingleLazyListDemo() {
     Column(
-        modifier = Modifier
-            .fillMaxSize()
-            .wrapContentHeight(),
+        modifier = Modifier.fillMaxSize().wrapContentHeight(),
         horizontalAlignment = Alignment.CenterHorizontally
     ) {
         Text(
@@ -151,18 +142,10 @@
         )
 
         LazyColumn(
-            Modifier
-                .border(1.dp, Color.Black)
-                .fillMaxWidth(fraction = 0.75f)
-                .height(200.dp)
+            Modifier.border(1.dp, Color.Black).fillMaxWidth(fraction = 0.75f).height(200.dp)
         ) {
             items(50) { index ->
-                Button(
-                    onClick = {},
-                    Modifier
-                        .padding(8.dp)
-                        .fillMaxWidth()
-                ) {
+                Button(onClick = {}, Modifier.padding(8.dp).fillMaxWidth()) {
                     Text("Button $index")
                 }
             }
@@ -174,14 +157,7 @@
 private fun SingleFullScreenListDemo() {
     LazyColumn(Modifier.fillMaxSize()) {
         items(50) { index ->
-            Button(
-                onClick = {},
-                Modifier
-                    .padding(8.dp)
-                    .fillMaxWidth()
-            ) {
-                Text("Button $index")
-            }
+            Button(onClick = {}, Modifier.padding(8.dp).fillMaxWidth()) { Text("Button $index") }
         }
     }
 }
@@ -189,9 +165,7 @@
 @Composable
 private fun LazyListContentPaddingDemo() {
     Scaffold(
-        modifier = Modifier
-            .padding(8.dp)
-            .border(1.dp, Color.Black),
+        modifier = Modifier.padding(8.dp).border(1.dp, Color.Black),
         topBar = {
             TopAppBar(
                 title = { Text("Top bar") },
@@ -199,24 +173,19 @@
             )
         },
         bottomBar = {
-            BottomAppBar(
-                backgroundColor = MaterialTheme.colors.primarySurface.copy(alpha = 0.5f)
-            ) { Text("Bottom bar") }
+            BottomAppBar(backgroundColor = MaterialTheme.colors.primarySurface.copy(alpha = 0.5f)) {
+                Text("Bottom bar")
+            }
         }
     ) { contentPadding ->
         LazyColumn(
-            modifier = Modifier
-                .fillMaxSize()
-                .background(Color.Red),
+            modifier = Modifier.fillMaxSize().background(Color.Red),
             contentPadding = contentPadding
         ) {
             items(15) { index ->
                 Button(
                     onClick = {},
-                    Modifier
-                        .background(Color.LightGray)
-                        .padding(8.dp)
-                        .fillMaxWidth()
+                    Modifier.background(Color.LightGray).padding(8.dp).fillMaxWidth()
                 ) {
                     Text("Button $index")
                 }
@@ -228,9 +197,7 @@
 @Composable
 private fun BigInLittleDemo() {
     Column(
-        modifier = Modifier
-            .fillMaxSize()
-            .wrapContentHeight(),
+        modifier = Modifier.fillMaxSize().wrapContentHeight(),
         horizontalAlignment = Alignment.CenterHorizontally
     ) {
         Text(
@@ -240,23 +207,16 @@
         )
 
         LazyColumn(
-            Modifier
-                .border(1.dp, Color.Black)
-                .weight(1f)
-                .fillMaxWidth(),
+            Modifier.border(1.dp, Color.Black).weight(1f).fillMaxWidth(),
             horizontalAlignment = Alignment.CenterHorizontally
         ) {
             items(4) {
                 Text(
                     "Header $it",
-                    Modifier
-                        .fillMaxWidth()
-                        .background(Color.LightGray)
-                        .padding(16.dp)
+                    Modifier.fillMaxWidth().background(Color.LightGray).padding(16.dp)
                 )
                 Box(
-                    Modifier
-                        .background(Color.Magenta)
+                    Modifier.background(Color.Magenta)
                         .fillParentMaxHeight(0.5f)
                         .padding(horizontal = 16.dp)
                 ) {
@@ -264,10 +224,7 @@
                 }
                 Text(
                     "Footer $it",
-                    Modifier
-                        .fillMaxWidth()
-                        .background(Color.LightGray)
-                        .padding(16.dp)
+                    Modifier.fillMaxWidth().background(Color.LightGray).padding(16.dp)
                 )
             }
         }
@@ -282,22 +239,13 @@
         LazyColumn(Modifier.fillMaxSize()) {
             items(50) { index ->
                 var showDialog by remember { mutableStateOf(false) }
-                Button(
-                    onClick = { showDialog = true },
-                    Modifier
-                        .padding(8.dp)
-                        .fillMaxWidth()
-                ) {
+                Button(onClick = { showDialog = true }, Modifier.padding(8.dp).fillMaxWidth()) {
                     Text("Open dialog ($index)")
                 }
 
                 if (showDialog) {
                     Dialog(onDismissRequest = { showDialog = false }) {
-                        Box(
-                            Modifier
-                                .fillMaxSize(fraction = 0.5f)
-                                .background(Color.LightGray)
-                        ) {
+                        Box(Modifier.fillMaxSize(fraction = 0.5f).background(Color.LightGray)) {
                             SingleFullScreenListDemo()
                         }
                     }
@@ -313,18 +261,25 @@
         init {
             orientation = VERTICAL
             addView(TextView(context).also { it.text = "AndroidView Header" })
-            addView(ScrollView(context).apply {
-                setBackgroundColor(android.graphics.Color.CYAN)
-                addView(LinearLayout(context).apply {
-                    orientation = VERTICAL
-                    repeat(20) {
-                        addView(TextView(context).apply {
-                            setPadding(20, 20, 20, 20)
-                            text = "Item $it"
-                        })
-                    }
-                })
-            }, LayoutParams(MATCH_PARENT, 0, 1f))
+            addView(
+                ScrollView(context).apply {
+                    setBackgroundColor(android.graphics.Color.CYAN)
+                    addView(
+                        LinearLayout(context).apply {
+                            orientation = VERTICAL
+                            repeat(20) {
+                                addView(
+                                    TextView(context).apply {
+                                        setPadding(20, 20, 20, 20)
+                                        text = "Item $it"
+                                    }
+                                )
+                            }
+                        }
+                    )
+                },
+                LayoutParams(MATCH_PARENT, 0, 1f)
+            )
             addView(TextView(context).also { it.text = "AndroidView Footer" })
         }
     }
@@ -334,32 +289,24 @@
             modifier = Modifier.fillMaxSize(),
             horizontalAlignment = Alignment.CenterHorizontally,
         ) {
-            items(10) {
-                Text("Compose item", Modifier.padding(16.dp))
-            }
+            items(10) { Text("Compose item", Modifier.padding(16.dp)) }
             item {
                 AndroidView(
                     factory = ::DemoAndroidView,
-                    modifier = Modifier
-                        .background(Color.Magenta)
-                        .fillParentMaxHeight(0.5f)
-                        .padding(horizontal = 16.dp)
+                    modifier =
+                        Modifier.background(Color.Magenta)
+                            .fillParentMaxHeight(0.5f)
+                            .padding(horizontal = 16.dp)
                 )
             }
-            items(5) {
-                Text("Compose item", Modifier.padding(16.dp))
-            }
+            items(5) { Text("Compose item", Modifier.padding(16.dp)) }
         }
     }
 }
 
 @Composable
 private fun LegacyTextFieldInScrollableDemo() {
-    LazyColumn(
-        Modifier
-            .fillMaxSize()
-            .imePadding()
-    ) {
+    LazyColumn(Modifier.fillMaxSize().imePadding()) {
         repeat(10) {
             item {
                 var text by remember { mutableStateOf("") }
@@ -368,9 +315,7 @@
                     value = text,
                     onValueChange = { text = it },
                     singleLine = true,
-                    modifier = Modifier
-                        .fillMaxWidth()
-                        .padding(8.dp),
+                    modifier = Modifier.fillMaxWidth().padding(8.dp),
                 )
             }
             item {
@@ -381,9 +326,7 @@
                     onValueChange = { text = it },
                     singleLine = false,
                     maxLines = 3,
-                    modifier = Modifier
-                        .fillMaxWidth()
-                        .padding(8.dp),
+                    modifier = Modifier.fillMaxWidth().padding(8.dp),
                 )
             }
         }
@@ -393,26 +336,14 @@
 @Composable
 fun LegacySingleGiantTextFieldDemo() {
     var text by remember { mutableStateOf("") }
-    Column(
-        modifier = Modifier
-            .fillMaxSize()
-            .imePadding()
-    ) {
-        TextField(
-            value = text,
-            onValueChange = { text = it },
-            modifier = Modifier.fillMaxSize()
-        )
+    Column(modifier = Modifier.fillMaxSize().imePadding()) {
+        TextField(value = text, onValueChange = { text = it }, modifier = Modifier.fillMaxSize())
     }
 }
 
 @Composable
 private fun TextFieldInScrollableDemo() {
-    LazyColumn(
-        Modifier
-            .fillMaxSize()
-            .imePadding()
-    ) {
+    LazyColumn(Modifier.fillMaxSize().imePadding()) {
         repeat(10) {
             item {
                 val text = rememberTextFieldState()
@@ -420,9 +351,7 @@
                 BasicTextField(
                     state = text,
                     lineLimits = TextFieldLineLimits.SingleLine,
-                    modifier = Modifier
-                        .fillMaxWidth()
-                        .padding(8.dp),
+                    modifier = Modifier.fillMaxWidth().padding(8.dp),
                 )
             }
             item {
@@ -431,9 +360,7 @@
                 BasicTextField(
                     state = text,
                     lineLimits = TextFieldLineLimits.MultiLine(maxHeightInLines = 3),
-                    modifier = Modifier
-                        .fillMaxWidth()
-                        .padding(8.dp),
+                    modifier = Modifier.fillMaxWidth().padding(8.dp),
                 )
             }
         }
@@ -443,15 +370,8 @@
 @Composable
 fun SingleGiantTextFieldDemo() {
     val text = rememberTextFieldState()
-    Column(
-        modifier = Modifier
-            .fillMaxSize()
-            .imePadding()
-    ) {
-        BasicTextField(
-            state = text,
-            modifier = Modifier.fillMaxSize()
-        )
+    Column(modifier = Modifier.fillMaxSize().imePadding()) {
+        BasicTextField(state = text, modifier = Modifier.fillMaxSize())
     }
 }
 
@@ -464,20 +384,10 @@
             Text(
                 "Header 1",
                 textAlign = TextAlign.Center,
-                modifier = Modifier
-                    .background(Color.Green)
-                    .fillMaxWidth()
-                    .padding(16.dp)
+                modifier = Modifier.background(Color.Green).fillMaxWidth().padding(16.dp)
             )
         }
-        item {
-            Box(
-                Modifier
-                    .background(Color.Magenta)
-                    .fillMaxWidth()
-                    .fillParentMaxHeight()
-            )
-        }
+        item { Box(Modifier.background(Color.Magenta).fillMaxWidth().fillParentMaxHeight()) }
 
         // Headers with small sections.
         val sectionCount = 4
@@ -486,16 +396,12 @@
                 Text(
                     "Header ${it + 2}",
                     textAlign = TextAlign.Center,
-                    modifier = Modifier
-                        .background(Color.Green)
-                        .fillMaxWidth()
-                        .padding(16.dp)
+                    modifier = Modifier.background(Color.Green).fillMaxWidth().padding(16.dp)
                 )
             }
             item {
                 Box(
-                    Modifier
-                        .background(Color.Magenta)
+                    Modifier.background(Color.Magenta)
                         .fillMaxWidth()
                         .fillParentMaxHeight(1f / (sectionCount - 1))
                 )
@@ -508,17 +414,9 @@
 private fun ReverseScrollingCaptureDemo() {
     Column(
         horizontalAlignment = Alignment.CenterHorizontally,
-        modifier = Modifier
-            .fillMaxSize()
-            .verticalScroll(rememberScrollState(), reverseScrolling = true)
+        modifier =
+            Modifier.fillMaxSize().verticalScroll(rememberScrollState(), reverseScrolling = true)
     ) {
-        repeat(50) { index ->
-            Text(
-                "Row $index",
-                Modifier
-                    .heightIn(min = 40.dp)
-                    .padding(8.dp)
-            )
-        }
+        repeat(50) { index -> Text("Row $index", Modifier.heightIn(min = 40.dp).padding(8.dp)) }
     }
 }
diff --git a/compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/MagnifierDemos.kt b/compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/MagnifierDemos.kt
index 3a98a7e..5ca046a 100644
--- a/compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/MagnifierDemos.kt
+++ b/compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/MagnifierDemos.kt
@@ -53,10 +53,11 @@
 import androidx.compose.ui.unit.DpSize
 import androidx.compose.ui.unit.dp
 
-val MagnifierDemos = listOf(
-    ComposableDemo("Simple Magnifier") { MagnifierSample() },
-    ComposableDemo("Multitouch Custom Magnifier") { MultitouchCustomMagnifierDemo() },
-)
+val MagnifierDemos =
+    listOf(
+        ComposableDemo("Simple Magnifier") { MagnifierSample() },
+        ComposableDemo("Multitouch Custom Magnifier") { MultitouchCustomMagnifierDemo() },
+    )
 
 @Preview
 @Composable
@@ -66,11 +67,9 @@
 
     // Animate the background to demonstrate the magnifier updating its content when the
     // layer is redrawn.
-    val colorAnimationSpec = remember {
-        infiniteRepeatable(tween<Color>(1000))
-    }
-    val color by rememberInfiniteTransition()
-        .animateColor(Color.Red, Color.Green, colorAnimationSpec)
+    val colorAnimationSpec = remember { infiniteRepeatable(tween<Color>(1000)) }
+    val color by
+        rememberInfiniteTransition().animateColor(Color.Red, Color.Green, colorAnimationSpec)
 
     Column {
         Text(
@@ -89,8 +88,7 @@
         Divider()
         // Include some padding to ensure the magnifier is using the right offset.
         Box(
-            Modifier
-                .padding(48.dp)
+            Modifier.padding(48.dp)
                 .fillMaxSize()
                 .clipToBounds()
                 .drawBehind {
@@ -101,30 +99,26 @@
                     // Draw something interesting to zoom in on.
                     @Suppress("SteppedForLoop")
                     for (diameter in 2 until size.maxDimension.toInt() step 10) {
-                        drawCircle(
-                            color = Color.Black,
-                            radius = diameter / 2f,
-                            style = Stroke()
-                        )
+                        drawCircle(color = Color.Black, radius = diameter / 2f, style = Stroke())
                     }
                 }
-            .pointerInput(Unit) {
-                awaitPointerEventScope {
-                    while (true) {
-                        // Track a magnifier for each finger on the screen.
-                        awaitPointerEvent().changes.forEach {
-                            if (it.pressed) {
-                                magnifierOffsets.getOrPut(it.id) {
-                                    mutableStateOf(it.position)
-                                }.value = it.position
-                            } else {
-                                magnifierOffsets -= it.id
+                .pointerInput(Unit) {
+                    awaitPointerEventScope {
+                        while (true) {
+                            // Track a magnifier for each finger on the screen.
+                            awaitPointerEvent().changes.forEach {
+                                if (it.pressed) {
+                                    magnifierOffsets
+                                        .getOrPut(it.id) { mutableStateOf(it.position) }
+                                        .value = it.position
+                                } else {
+                                    magnifierOffsets -= it.id
+                                }
+                                it.consume()
                             }
-                            it.consume()
                         }
                     }
                 }
-            }
         ) {
             magnifierOffsets.keys.forEach { id ->
                 key(id) {
diff --git a/compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/NestedScrollDemos.kt b/compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/NestedScrollDemos.kt
index f9900e2..d42aedf 100644
--- a/compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/NestedScrollDemos.kt
+++ b/compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/NestedScrollDemos.kt
@@ -52,36 +52,30 @@
 @Composable
 fun NestedScrollDemo() {
     Column(
-        Modifier
-            .fillMaxSize()
+        Modifier.fillMaxSize()
             .background(Color.Red)
             .verticalScroll(rememberScrollState())
             .padding(PaddingValues(30.dp))
     ) {
-        repeat(6) { outerOuterIndex ->
-            OuterLvl1(outerOuterIndex)
-        }
+        repeat(6) { outerOuterIndex -> OuterLvl1(outerOuterIndex) }
     }
 }
 
 @Composable
 private fun OuterLvl1(outerOuterIndex: Int) {
     LazyColumn(
-        modifier = Modifier.fillMaxSize()
-            .border(3.dp, Color.Black)
-            .height(350.dp)
-            .background(Color.Yellow),
+        modifier =
+            Modifier.fillMaxSize()
+                .border(3.dp, Color.Black)
+                .height(350.dp)
+                .background(Color.Yellow),
         reverseLayout = true,
         contentPadding = PaddingValues(60.dp)
     ) {
         repeat(3) { outerIndex ->
-            item {
-                InnerColumn(outerOuterIndex, outerIndex)
-            }
+            item { InnerColumn(outerOuterIndex, outerIndex) }
 
-            item {
-                Spacer(Modifier.height(5.dp))
-            }
+            item { Spacer(Modifier.height(5.dp)) }
         }
     }
     Spacer(Modifier.height(5.dp))
@@ -90,8 +84,7 @@
 @Composable
 private fun InnerColumn(outerOuterIndex: Int, outerIndex: Int) {
     Column(
-        Modifier
-            .fillMaxSize()
+        Modifier.fillMaxSize()
             .border(3.dp, Color.Blue)
             .height(150.dp)
             .background(Color.White)
@@ -100,8 +93,7 @@
     ) {
         repeat(10) { innerIndex ->
             Box(
-                Modifier
-                    .height(38.dp)
+                Modifier.height(38.dp)
                     .fillMaxWidth()
                     .background(Color.Magenta)
                     .border(2.dp, Color.Yellow),
@@ -133,23 +125,23 @@
         }
     }
     Box(
-        Modifier
-            .fillMaxSize()
+        Modifier.fillMaxSize()
             // attach as a parent to the nested scroll system
             .nestedScroll(nestedScrollConnection)
     ) {
         Column {
             Text(
                 modifier = Modifier.fillMaxWidth(),
-                text = "Scroll Connection PreScroll available: $availableOffset")
+                text = "Scroll Connection PreScroll available: $availableOffset"
+            )
 
             // our list with build in nested scroll support that will notify us about its scroll
             LazyColumn {
                 items(100) { index ->
-                    Text("I'm item $index", modifier = Modifier
-                        .fillMaxWidth()
-                        .focusable()
-                        .padding(16.dp))
+                    Text(
+                        "I'm item $index",
+                        modifier = Modifier.fillMaxWidth().focusable().padding(16.dp)
+                    )
                 }
             }
         }
@@ -161,16 +153,10 @@
     val scrollState = rememberScrollState()
 
     Column(
-        Modifier
-            .fillMaxWidth()
-            .background(Color.Red)
-            .verticalScroll(scrollState),
+        Modifier.fillMaxWidth().background(Color.Red).verticalScroll(scrollState),
         verticalArrangement = Arrangement.spacedBy(20.dp)
     ) {
-        Text(
-            modifier = Modifier.fillMaxWidth(),
-            text = "Outer Scrollable Column"
-        )
+        Text(modifier = Modifier.fillMaxWidth(), text = "Outer Scrollable Column")
 
         for (i in 0 until 4) {
             SimpleColumn("Inner Scrollable Column: $i")
@@ -181,16 +167,12 @@
 @Composable
 fun SimpleColumn(label: String) {
     Column(
-        Modifier
-            .fillMaxWidth()
+        Modifier.fillMaxWidth()
             .height(200.dp)
             .background(Color.Green)
             .verticalScroll(rememberScrollState())
     ) {
-        Text(
-            modifier = Modifier.fillMaxWidth(),
-            text = "$label INNER, scrollable only"
-        )
+        Text(modifier = Modifier.fillMaxWidth(), text = "$label INNER, scrollable only")
 
         for (i in 0 until 20) {
             Text(
diff --git a/compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/PointerIconDemo.kt b/compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/PointerIconDemo.kt
index 4ce3e6a7..aae1809 100644
--- a/compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/PointerIconDemo.kt
+++ b/compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/PointerIconDemo.kt
@@ -36,38 +36,36 @@
 import androidx.compose.ui.tooling.preview.Preview
 import androidx.compose.ui.unit.dp
 
-val PointerIconDemos = listOf(
-    ComposableDemo("Pointer Icon Partial Overlap") {
-        PointerIconPartialOverlapDemo()
-    },
-    ComposableDemo("Pointer Icon Full Overlap") { PointerIconFullOverlapDemo() },
-    ComposableDemo("Pointer Icon Non Overlapping Parents") {
-        PointerIconNonOverlappingParentsDemo()
-    },
-    ComposableDemo("Pointer Icon Overlapping Siblings") {
-        PointerIconOverlappingSiblingsDemo()
-    },
-    ComposableDemo("Pointer Icon Multi-Layered Nesting") {
-        PointerIconMultiLayeredNestingDemo()
-    },
-    ComposableDemo("Pointer Icon Child Doesn't Fully Overlap Parent") {
-        PointerIconChildNotFullyOverlappedByParentDemo()
-    },
-)
+val PointerIconDemos =
+    listOf(
+        ComposableDemo("Pointer Icon Partial Overlap") { PointerIconPartialOverlapDemo() },
+        ComposableDemo("Pointer Icon Full Overlap") { PointerIconFullOverlapDemo() },
+        ComposableDemo("Pointer Icon Non Overlapping Parents") {
+            PointerIconNonOverlappingParentsDemo()
+        },
+        ComposableDemo("Pointer Icon Overlapping Siblings") {
+            PointerIconOverlappingSiblingsDemo()
+        },
+        ComposableDemo("Pointer Icon Multi-Layered Nesting") {
+            PointerIconMultiLayeredNestingDemo()
+        },
+        ComposableDemo("Pointer Icon Child Doesn't Fully Overlap Parent") {
+            PointerIconChildNotFullyOverlappedByParentDemo()
+        },
+    )
 
 @Preview
 @Composable
 fun PointerIconPartialOverlapDemo() {
     Box(
-        modifier = Modifier
-            .fillMaxSize()
-            .border(BorderStroke(2.dp, SolidColor(Color.Red)))
-            .pointerHoverIcon(PointerIcon.Crosshair)
+        modifier =
+            Modifier.fillMaxSize()
+                .border(BorderStroke(2.dp, SolidColor(Color.Red)))
+                .pointerHoverIcon(PointerIcon.Crosshair)
     ) {
         Text(text = "expected crosshair")
         Box(
-            Modifier
-                .padding(20.dp)
+            Modifier.padding(20.dp)
                 .fillMaxWidth(0.6f)
                 .border(BorderStroke(2.dp, SolidColor(Color.Black)))
                 .pointerHoverIcon(PointerIcon.Hand, true)
@@ -81,15 +79,14 @@
 @Composable
 fun PointerIconFullOverlapDemo() {
     Box(
-        modifier = Modifier
-            .fillMaxSize()
-            .border(BorderStroke(2.dp, SolidColor(Color.Red)))
-            .pointerHoverIcon(PointerIcon.Crosshair)
+        modifier =
+            Modifier.fillMaxSize()
+                .border(BorderStroke(2.dp, SolidColor(Color.Red)))
+                .pointerHoverIcon(PointerIcon.Crosshair)
     ) {
         Text(text = "expected crosshair")
         Box(
-            Modifier
-                .fillMaxSize()
+            Modifier.fillMaxSize()
                 .border(BorderStroke(2.dp, SolidColor(Color.Black)))
                 .pointerHoverIcon(PointerIcon.Hand)
         ) {
@@ -102,15 +99,12 @@
 @Composable
 fun PointerIconNonOverlappingParentsDemo() {
     Box(
-        modifier = Modifier
-            .requiredSize(200.dp)
-            .border(BorderStroke(2.dp, SolidColor(Color.Red)))
+        modifier = Modifier.requiredSize(200.dp).border(BorderStroke(2.dp, SolidColor(Color.Red)))
     ) {
         Column {
             Text("default arrow")
             Box(
-                Modifier
-                    .padding(20.dp)
+                Modifier.padding(20.dp)
                     .requiredSize(50.dp)
                     .border(BorderStroke(2.dp, SolidColor(Color.Black)))
                     .pointerHoverIcon(PointerIcon.Hand)
@@ -118,8 +112,7 @@
                 Text("hand")
             }
             Box(
-                Modifier
-                    .padding(40.dp)
+                Modifier.padding(40.dp)
                     .requiredSize(50.dp)
                     .border(BorderStroke(2.dp, SolidColor(Color.Blue)))
                     .pointerHoverIcon(PointerIcon.Crosshair)
@@ -134,14 +127,11 @@
 @Composable
 fun PointerIconOverlappingSiblingsDemo() {
     Box(
-        modifier = Modifier
-            .requiredSize(200.dp)
-            .border(BorderStroke(2.dp, SolidColor(Color.Red)))
+        modifier = Modifier.requiredSize(200.dp).border(BorderStroke(2.dp, SolidColor(Color.Red)))
     ) {
         Text(text = "expected default arrow")
         Box(
-            Modifier
-                .padding(20.dp)
+            Modifier.padding(20.dp)
                 .requiredSize(120.dp, 60.dp)
                 .border(BorderStroke(2.dp, SolidColor(Color.Black)))
                 .pointerHoverIcon(PointerIcon.Hand)
@@ -149,8 +139,7 @@
             Text(text = "expected hand")
         }
         Box(
-            Modifier
-                .padding(horizontal = 100.dp, vertical = 40.dp)
+            Modifier.padding(horizontal = 100.dp, vertical = 40.dp)
                 .requiredSize(120.dp, 20.dp)
                 .border(BorderStroke(2.dp, SolidColor(Color.Blue)))
                 .pointerHoverIcon(PointerIcon.Crosshair)
@@ -164,23 +153,21 @@
 @Composable
 fun PointerIconMultiLayeredNestingDemo() {
     Box(
-        modifier = Modifier
-            .requiredSize(200.dp)
-            .border(BorderStroke(2.dp, SolidColor(Color.Red)))
-            .pointerHoverIcon(PointerIcon.Crosshair)
+        modifier =
+            Modifier.requiredSize(200.dp)
+                .border(BorderStroke(2.dp, SolidColor(Color.Red)))
+                .pointerHoverIcon(PointerIcon.Crosshair)
     ) {
         Text(text = "expected crosshair")
         Box(
-            Modifier
-                .padding(20.dp)
+            Modifier.padding(20.dp)
                 .requiredSize(150.dp)
                 .border(BorderStroke(2.dp, SolidColor(Color.Black)))
                 .pointerHoverIcon(PointerIcon.Text)
         ) {
             Text(text = "expected text")
             Box(
-                Modifier
-                    .padding(40.dp)
+                Modifier.padding(40.dp)
                     .requiredSize(100.dp)
                     .border(BorderStroke(2.dp, SolidColor(Color.Blue)))
                     .pointerHoverIcon(PointerIcon.Hand)
@@ -194,31 +181,25 @@
 @Preview
 @Composable
 fun PointerIconChildNotFullyOverlappedByParentDemo() {
-    Box(
-        modifier = Modifier
-            .fillMaxSize()
-            .border(BorderStroke(2.dp, SolidColor(Color.Yellow)))
-    ) {
+    Box(modifier = Modifier.fillMaxSize().border(BorderStroke(2.dp, SolidColor(Color.Yellow)))) {
         Text(text = "expected default arrow")
         Box(
-            modifier = Modifier
-                .padding(vertical = 20.dp)
-                .requiredSize(width = 200.dp, height = 150.dp)
-                .border(BorderStroke(2.dp, SolidColor(Color.Red)))
-                .pointerHoverIcon(PointerIcon.Crosshair, overrideDescendants = false)
+            modifier =
+                Modifier.padding(vertical = 20.dp)
+                    .requiredSize(width = 200.dp, height = 150.dp)
+                    .border(BorderStroke(2.dp, SolidColor(Color.Red)))
+                    .pointerHoverIcon(PointerIcon.Crosshair, overrideDescendants = false)
         ) {
             Text(text = "expected crosshair")
             Box(
-                Modifier
-                    .padding(vertical = 40.dp)
+                Modifier.padding(vertical = 40.dp)
                     .requiredSize(width = 150.dp, height = 125.dp)
                     .border(BorderStroke(2.dp, SolidColor(Color.Black)))
                     .pointerHoverIcon(PointerIcon.Text, overrideDescendants = false)
             ) {
                 Text(text = "expected text")
                 Box(
-                    Modifier
-                        .padding(vertical = 80.dp)
+                    Modifier.padding(vertical = 80.dp)
                         .requiredSize(width = 300.dp, height = 100.dp)
                         .offset(x = 100.dp)
                         .border(BorderStroke(2.dp, SolidColor(Color.Blue)))
diff --git a/compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/PopularBooksDemo.kt b/compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/PopularBooksDemo.kt
index 137b758..efb086b 100644
--- a/compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/PopularBooksDemo.kt
+++ b/compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/PopularBooksDemo.kt
@@ -95,15 +95,11 @@
                 )
             }
             Divider(color = Color.LightGray, thickness = Dp.Hairline)
-            LazyColumn(
-                Modifier.fillMaxSize(),
-                verticalArrangement = Arrangement.spacedBy(16.dp)
-            ) {
+            LazyColumn(Modifier.fillMaxSize(), verticalArrangement = Arrangement.spacedBy(16.dp)) {
                 val sortedList = PopularBooksList.sortedWith(comparator)
                 items(sortedList, key = { it.title }) {
                     Row(
-                        Modifier.animateItem()
-                            .height(IntrinsicSize.Max),
+                        Modifier.animateItem().height(IntrinsicSize.Max),
                         horizontalArrangement = Arrangement.spacedBy(8.dp)
                     ) {
                         Text(
@@ -145,37 +141,33 @@
     }
 }
 
-private val TitleComparator = Comparator<Book> { left, right ->
-    left.title.compareTo(right.title)
-}
+private val TitleComparator = Comparator<Book> { left, right -> left.title.compareTo(right.title) }
 
-private val AuthorComparator = Comparator<Book> { left, right ->
-    left.author.compareTo(right.author)
-}
+private val AuthorComparator =
+    Comparator<Book> { left, right -> left.author.compareTo(right.author) }
 
-private val YearComparator = Comparator<Book> { left, right ->
-    right.published.compareTo(left.published)
-}
+private val YearComparator =
+    Comparator<Book> { left, right -> right.published.compareTo(left.published) }
 
-private val SalesComparator = Comparator<Book> { left, right ->
-    right.salesInMillions.compareTo(left.salesInMillions)
-}
+private val SalesComparator =
+    Comparator<Book> { left, right -> right.salesInMillions.compareTo(left.salesInMillions) }
 
-private val PopularBooksList = listOf(
-    Book("The Hobbit", "J. R. R. Tolkien", 1937, 140),
-    Book("Harry Potter and the Philosopher's Stone", "J. K. Rowling", 1997, 120),
-    Book("Dream of the Red Chamber", "Cao Xueqin", 1800, 100),
-    Book("And Then There Were None", "Agatha Christie", 1939, 100),
-    Book("The Little Prince", "Antoine de Saint-Exupéry", 1943, 100),
-    Book("The Lion, the Witch and the Wardrobe", "C. S. Lewis", 1950, 85),
-    Book("The Adventures of Pinocchio", "Carlo Collodi", 1881, 80),
-    Book("The Da Vinci Code", "Dan Brown", 2003, 80),
-    Book("Harry Potter and the Chamber of Secrets", "J. K. Rowling", 1998, 77),
-    Book("The Alchemist", "Paulo Coelho", 1988, 65),
-    Book("Harry Potter and the Prisoner of Azkaban", "J. K. Rowling", 1999, 65),
-    Book("Harry Potter and the Goblet of Fire", "J. K. Rowling", 2000, 65),
-    Book("Harry Potter and the Order of the Phoenix", "J. K. Rowling", 2003, 65)
-)
+private val PopularBooksList =
+    listOf(
+        Book("The Hobbit", "J. R. R. Tolkien", 1937, 140),
+        Book("Harry Potter and the Philosopher's Stone", "J. K. Rowling", 1997, 120),
+        Book("Dream of the Red Chamber", "Cao Xueqin", 1800, 100),
+        Book("And Then There Were None", "Agatha Christie", 1939, 100),
+        Book("The Little Prince", "Antoine de Saint-Exupéry", 1943, 100),
+        Book("The Lion, the Witch and the Wardrobe", "C. S. Lewis", 1950, 85),
+        Book("The Adventures of Pinocchio", "Carlo Collodi", 1881, 80),
+        Book("The Da Vinci Code", "Dan Brown", 2003, 80),
+        Book("Harry Potter and the Chamber of Secrets", "J. K. Rowling", 1998, 77),
+        Book("The Alchemist", "Paulo Coelho", 1988, 65),
+        Book("Harry Potter and the Prisoner of Azkaban", "J. K. Rowling", 1999, 65),
+        Book("Harry Potter and the Goblet of Fire", "J. K. Rowling", 2000, 65),
+        Book("Harry Potter and the Order of the Phoenix", "J. K. Rowling", 2003, 65)
+    )
 
 private class Book(
     val title: String,
diff --git a/compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/ScrollableFocusedChildDemo.kt b/compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/ScrollableFocusedChildDemo.kt
index b333d14..b1893ed 100644
--- a/compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/ScrollableFocusedChildDemo.kt
+++ b/compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/ScrollableFocusedChildDemo.kt
@@ -78,26 +78,14 @@
         )
 
         Row {
-            Button(
-                onClick = {
-                    resizableState.cutInHalf()
-                },
-                modifier = Modifier.weight(1f)
-            ) {
+            Button(onClick = { resizableState.cutInHalf() }, modifier = Modifier.weight(1f)) {
                 Text("½ size")
             }
-            Button(
-                onClick = {
-                    resizableState.resetToMaxSize()
-                },
-                modifier = Modifier.weight(1f)
-            ) {
+            Button(onClick = { resizableState.resetToMaxSize() }, modifier = Modifier.weight(1f)) {
                 Text("Max size")
             }
             Button(
-                onClick = {
-                    reverseScrolling = !reverseScrolling
-                },
+                onClick = { reverseScrolling = !reverseScrolling },
                 modifier = Modifier.weight(1f)
             ) {
                 Text("Scroll: ${if (reverseScrolling) "backward" else "forward"}")
@@ -109,14 +97,10 @@
         var maxViewportSize by remember { mutableStateOf(IntSize.Zero) }
         Resizable(
             resizableState,
-            Modifier
-                .weight(1f)
-                .fillMaxWidth()
-                .onSizeChanged { maxViewportSize = it }
+            Modifier.weight(1f).fillMaxWidth().onSizeChanged { maxViewportSize = it }
         ) {
             Box(
-                Modifier
-                    .border(2.dp, Color.Black)
+                Modifier.border(2.dp, Color.Black)
                     .verticalScroll(rememberScrollState(), reverseScrolling = reverseScrolling)
                     .horizontalScroll(rememberScrollState(), reverseScrolling = reverseScrolling)
             ) {
@@ -142,14 +126,15 @@
     Text(
         text = if (hasFocus) "Focused" else "Click to focus",
         color = if (hasFocus) Color.White else Color.Black,
-        modifier = modifier
-            .clickable { focusRequester.requestFocus() }
-            .onFocusChanged { hasFocus = it.hasFocus }
-            .focusRequester(focusRequester)
-            .focusable()
-            .border(3.dp, Color.Blue)
-            .then(if (hasFocus) Modifier.background(Color.Blue) else Modifier)
-            .padding(8.dp)
+        modifier =
+            modifier
+                .clickable { focusRequester.requestFocus() }
+                .onFocusChanged { hasFocus = it.hasFocus }
+                .focusRequester(focusRequester)
+                .focusable()
+                .border(3.dp, Color.Blue)
+                .then(if (hasFocus) Modifier.background(Color.Blue) else Modifier)
+                .padding(8.dp)
     )
 }
 
@@ -195,39 +180,38 @@
             val (horizontalHandleMeasurable, verticalHandleMeasurable, contentMeasurable) =
                 measurables
             val handleThickness = handleThickness.roundToPx()
-            widthOverride = if (widthOverride < 0) {
-                constraints.maxWidth
-            } else {
-                widthOverride.coerceIn(handleThickness, constraints.maxWidth)
-            }
-            heightOverride = if (heightOverride < 0) {
-                constraints.maxHeight
-            } else {
-                heightOverride.coerceIn(handleThickness, constraints.maxHeight)
-            }
-            val contentConstraints = Constraints.fixed(
-                width = widthOverride - handleThickness,
-                height = heightOverride - handleThickness
-            )
+            widthOverride =
+                if (widthOverride < 0) {
+                    constraints.maxWidth
+                } else {
+                    widthOverride.coerceIn(handleThickness, constraints.maxWidth)
+                }
+            heightOverride =
+                if (heightOverride < 0) {
+                    constraints.maxHeight
+                } else {
+                    heightOverride.coerceIn(handleThickness, constraints.maxHeight)
+                }
+            val contentConstraints =
+                Constraints.fixed(
+                    width = widthOverride - handleThickness,
+                    height = heightOverride - handleThickness
+                )
 
             val contentPlaceable = contentMeasurable.measure(contentConstraints)
-            val horizontalHandlePlaceable = horizontalHandleMeasurable.measure(
-                Constraints.fixed(width = widthOverride, height = handleThickness)
-            )
-            val verticalHandlePlaceable = verticalHandleMeasurable.measure(
-                Constraints.fixed(width = handleThickness, height = heightOverride)
-            )
+            val horizontalHandlePlaceable =
+                horizontalHandleMeasurable.measure(
+                    Constraints.fixed(width = widthOverride, height = handleThickness)
+                )
+            val verticalHandlePlaceable =
+                verticalHandleMeasurable.measure(
+                    Constraints.fixed(width = handleThickness, height = heightOverride)
+                )
 
             layout(constraints.maxWidth, constraints.maxHeight) {
                 contentPlaceable.place(IntOffset.Zero)
-                horizontalHandlePlaceable.place(
-                    x = 0,
-                    y = contentPlaceable.height
-                )
-                verticalHandlePlaceable.place(
-                    x = contentPlaceable.width,
-                    y = 0
-                )
+                horizontalHandlePlaceable.place(x = 0, y = contentPlaceable.height)
+                verticalHandlePlaceable.place(x = contentPlaceable.width, y = 0)
             }
         }
     }
@@ -242,8 +226,7 @@
     val lineWeight = 1.dp
 
     Canvas(
-        Modifier
-            .fillMaxSize()
+        Modifier.fillMaxSize()
             .draggable(dragState, if (orientation == Horizontal) Vertical else Horizontal)
     ) {
         val lineWidth = lineWidth.toPx()
@@ -270,11 +253,8 @@
 
 /** Measures the modified node to be the size returned from [size]. */
 private fun Modifier.size(size: () -> Size): Modifier = layout { measurable, _ ->
-    val constraints = size().let {
-        Constraints.fixed(it.width.roundToInt(), it.height.roundToInt())
-    }
+    val constraints =
+        size().let { Constraints.fixed(it.width.roundToInt(), it.height.roundToInt()) }
     val placeable = measurable.measure(constraints)
-    layout(placeable.width, placeable.height) {
-        placeable.place(IntOffset.Zero)
-    }
+    layout(placeable.width, placeable.height) { placeable.place(IntOffset.Zero) }
 }
diff --git a/compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/SuspendingGesturesDemo.kt b/compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/SuspendingGesturesDemo.kt
index b7f7366..272520a 100644
--- a/compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/SuspendingGesturesDemo.kt
+++ b/compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/SuspendingGesturesDemo.kt
@@ -68,15 +68,16 @@
 import kotlin.math.sqrt
 import kotlin.random.Random
 
-val CoroutineGestureDemos = listOf(
-    ComposableDemo("Tap/Double-Tap/Long Press") { CoroutineTapDemo() },
-    ComposableDemo("Drag Horizontal and Vertical") { TouchSlopDragGestures() },
-    ComposableDemo("Drag with orientation locking") { OrientationLockDragGestures() },
-    ComposableDemo("Drag 2D") { Drag2DGestures() },
-    ComposableDemo("Rotation/Pan/Zoom") { MultitouchGestureDetector() },
-    ComposableDemo("Rotation/Pan/Zoom with Lock") { MultitouchLockGestureDetector() },
-    ComposableDemo("Pointer type input") { PointerTypeInput() },
-)
+val CoroutineGestureDemos =
+    listOf(
+        ComposableDemo("Tap/Double-Tap/Long Press") { CoroutineTapDemo() },
+        ComposableDemo("Drag Horizontal and Vertical") { TouchSlopDragGestures() },
+        ComposableDemo("Drag with orientation locking") { OrientationLockDragGestures() },
+        ComposableDemo("Drag 2D") { Drag2DGestures() },
+        ComposableDemo("Rotation/Pan/Zoom") { MultitouchGestureDetector() },
+        ComposableDemo("Rotation/Pan/Zoom with Lock") { MultitouchLockGestureDetector() },
+        ComposableDemo("Pointer type input") { PointerTypeInput() },
+    )
 
 fun hueToColor(hue: Float): Color {
     val huePrime = hue / 60
@@ -105,9 +106,7 @@
     }
 }
 
-/**
- * Gesture detector for tap, double-tap, and long-press.
- */
+/** Gesture detector for tap, double-tap, and long-press. */
 @Composable
 fun CoroutineTapDemo() {
     var tapHue by remember { mutableFloatStateOf(randomHue()) }
@@ -121,8 +120,7 @@
         Text("The boxes change color when you tap the white box.")
         Spacer(Modifier.requiredSize(5.dp))
         Box(
-            Modifier
-                .fillMaxWidth()
+            Modifier.fillMaxWidth()
                 .height(50.dp)
                 .pointerInput(Unit) {
                     detectTapGestures(
@@ -147,8 +145,7 @@
         Spacer(Modifier.requiredSize(5.dp))
         Row {
             Box(
-                Modifier
-                    .size(50.dp)
+                Modifier.size(50.dp)
                     .background(hueToColor(tapHue))
                     .border(BorderStroke(2.dp, Color.Black))
             )
@@ -157,8 +154,7 @@
         Spacer(Modifier.requiredSize(5.dp))
         Row {
             Box(
-                Modifier
-                    .size(50.dp)
+                Modifier.size(50.dp)
                     .clipToBounds()
                     .background(hueToColor(doubleTapHue))
                     .border(BorderStroke(2.dp, Color.Black))
@@ -168,8 +164,7 @@
         Spacer(Modifier.requiredSize(5.dp))
         Row {
             Box(
-                Modifier
-                    .size(50.dp)
+                Modifier.size(50.dp)
                     .clipToBounds()
                     .background(hueToColor(longPressHue))
                     .border(BorderStroke(2.dp, Color.Black))
@@ -179,8 +174,7 @@
         Spacer(Modifier.requiredSize(5.dp))
         Row {
             Box(
-                Modifier
-                    .size(50.dp)
+                Modifier.size(50.dp)
                     .clipToBounds()
                     .background(hueToColor(pressHue))
                     .border(BorderStroke(2.dp, Color.Black))
@@ -190,8 +184,7 @@
         Spacer(Modifier.requiredSize(5.dp))
         Row {
             Box(
-                Modifier
-                    .size(50.dp)
+                Modifier.size(50.dp)
                     .clipToBounds()
                     .background(hueToColor(releaseHue))
                     .border(BorderStroke(2.dp, Color.Black))
@@ -201,8 +194,7 @@
         Spacer(Modifier.requiredSize(5.dp))
         Row {
             Box(
-                Modifier
-                    .size(50.dp)
+                Modifier.size(50.dp)
                     .clipToBounds()
                     .background(hueToColor(cancelHue))
                     .border(BorderStroke(2.dp, Color.Black))
@@ -217,9 +209,9 @@
     Column {
         var width by remember { mutableFloatStateOf(0f) }
         Box(
-            Modifier.fillMaxWidth()
-                .background(Color.Cyan)
-                .onSizeChanged { width = it.width.toFloat() }
+            Modifier.fillMaxWidth().background(Color.Cyan).onSizeChanged {
+                width = it.width.toFloat()
+            }
         ) {
             var offset by remember { mutableStateOf(0.dp) }
             Box(
@@ -244,9 +236,9 @@
         Box(Modifier.weight(1f)) {
             var height by remember { mutableFloatStateOf(0f) }
             Box(
-                Modifier.fillMaxHeight()
-                    .background(Color.Yellow)
-                    .onSizeChanged { height = it.height.toFloat() }
+                Modifier.fillMaxHeight().background(Color.Yellow).onSizeChanged {
+                    height = it.height.toFloat()
+                }
             ) {
                 var offset by remember { mutableStateOf(0.dp) }
                 Box(
@@ -256,8 +248,8 @@
                         .pointerInput(Unit) {
                             detectVerticalDragGestures { _, dragDistance ->
                                 val offsetPx = offset.toPx()
-                                val newOffset = (offsetPx + dragDistance)
-                                    .coerceIn(0f, height - 50.dp.toPx())
+                                val newOffset =
+                                    (offsetPx + dragDistance).coerceIn(0f, height - 50.dp.toPx())
                                 val consumed = newOffset - offsetPx
                                 if (consumed != 0f) {
                                     offset = newOffset.toDp()
@@ -270,15 +262,9 @@
                 Modifier.requiredHeight(50.dp)
                     .fillMaxWidth()
                     .align(Alignment.TopStart)
-                    .graphicsLayer(
-                        rotationZ = 90f,
-                        transformOrigin = TransformOrigin(0f, 1f)
-                    )
+                    .graphicsLayer(rotationZ = 90f, transformOrigin = TransformOrigin(0f, 1f))
             ) {
-                Text(
-                    "Drag red box within here",
-                    Modifier.align(Alignment.Center)
-                )
+                Text("Drag red box within here", Modifier.align(Alignment.Center))
             }
         }
     }
@@ -290,15 +276,15 @@
     var offsetX by remember { mutableStateOf(0.dp) }
     var offsetY by remember { mutableStateOf(0.dp) }
     Box(
-        Modifier.onSizeChanged {
-            size = it
-        }.pointerInput(Unit) {
-            detectVerticalDragGestures { _, dragAmount ->
-                offsetY = (offsetY.toPx() + dragAmount)
-                    .coerceIn(0f, size.height.toFloat() - 50.dp.toPx()).toDp()
+        Modifier.onSizeChanged { size = it }
+            .pointerInput(Unit) {
+                detectVerticalDragGestures { _, dragAmount ->
+                    offsetY =
+                        (offsetY.toPx() + dragAmount)
+                            .coerceIn(0f, size.height.toFloat() - 50.dp.toPx())
+                            .toDp()
+                }
             }
-        }
-
     ) {
         Box(
             Modifier.offset { IntOffset(x = offsetX.roundToPx(), y = 0) }
@@ -307,8 +293,10 @@
                 .fillMaxHeight()
                 .pointerInput(Unit) {
                     detectHorizontalDragGestures { _, dragAmount ->
-                        offsetX = (offsetX.toPx() + dragAmount)
-                            .coerceIn(0f, size.width.toFloat() - 50.dp.toPx()).toDp()
+                        offsetX =
+                            (offsetX.toPx() + dragAmount)
+                                .coerceIn(0f, size.width.toFloat() - 50.dp.toPx())
+                                .toDp()
                     }
                 }
         )
@@ -331,22 +319,24 @@
     var size by remember { mutableStateOf(IntSize.Zero) }
     var offsetX by remember { mutableFloatStateOf(0f) }
     var offsetY by remember { mutableFloatStateOf(0f) }
-    Box(
-        Modifier.onSizeChanged {
-            size = it
-        }.fillMaxSize()
-    ) {
+    Box(Modifier.onSizeChanged { size = it }.fillMaxSize()) {
         Box(
             Modifier.offset { IntOffset(offsetX.roundToInt(), offsetY.roundToInt()) }
                 .background(Color.Blue)
                 .requiredSize(50.dp)
                 .pointerInput(Unit) {
                     detectDragGestures { _, dragAmount ->
-                        offsetX = (offsetX + dragAmount.x)
-                            .coerceIn(0f, size.width.toFloat() - 50.dp.toPx())
+                        offsetX =
+                            (offsetX + dragAmount.x).coerceIn(
+                                0f,
+                                size.width.toFloat() - 50.dp.toPx()
+                            )
 
-                        offsetY = (offsetY + dragAmount.y)
-                            .coerceIn(0f, size.height.toFloat() - 50.dp.toPx())
+                        offsetY =
+                            (offsetY + dragAmount.y).coerceIn(
+                                0f,
+                                size.height.toFloat() - 50.dp.toPx()
+                            )
                     }
                 }
         )
@@ -357,9 +347,10 @@
 @Composable
 fun MultitouchArea(
     text: String,
-    gestureDetector: suspend PointerInputScope.(
-        (centroid: Offset, pan: Offset, zoom: Float, angle: Float) -> Unit,
-    ) -> Unit
+    gestureDetector:
+        suspend PointerInputScope.(
+            (centroid: Offset, pan: Offset, zoom: Float, angle: Float) -> Unit,
+        ) -> Unit
 ) {
     val matrix by remember { mutableStateOf(Matrix()) }
     var angle by remember { mutableFloatStateOf(0f) }
@@ -389,11 +380,8 @@
     ) {
         Box(
             Modifier.offset { IntOffset(offsetX.roundToInt(), offsetY.roundToInt()) }
-                .graphicsLayer(
-                    scaleX = zoom,
-                    scaleY = zoom,
-                    rotationZ = angle
-                ).drawBehind {
+                .graphicsLayer(scaleX = zoom, scaleY = zoom, rotationZ = angle)
+                .drawBehind {
                     val approximateRectangleSize = 10.dp.toPx()
                     val numRectanglesHorizontal =
                         (size.width / approximateRectangleSize).roundToInt()
@@ -410,10 +398,11 @@
                                 hue = 0f
                             }
                             val color = hueToColor(hue)
-                            val topLeft = Offset(
-                                x = x * size.width / numRectanglesHorizontal,
-                                y = y * size.height / numRectanglesVertical
-                            )
+                            val topLeft =
+                                Offset(
+                                    x = x * size.width / numRectanglesHorizontal,
+                                    y = y * size.height / numRectanglesVertical
+                                )
                             drawRect(color = color, topLeft = topLeft, size = rectangleSize)
                         }
                     }
@@ -425,35 +414,25 @@
 }
 
 /**
- * This is a multi-touch gesture detector, including pan, zoom, and rotation.
- * The user can pan, zoom, and rotate once touch slop has been reached.
+ * This is a multi-touch gesture detector, including pan, zoom, and rotation. The user can pan,
+ * zoom, and rotate once touch slop has been reached.
  */
 @Composable
 fun MultitouchGestureDetector() {
-    MultitouchArea(
-        "Zoom, Pan, and Rotate"
-    ) {
-        detectTransformGestures(
-            panZoomLock = false,
-            onGesture = it
-        )
+    MultitouchArea("Zoom, Pan, and Rotate") {
+        detectTransformGestures(panZoomLock = false, onGesture = it)
     }
 }
 
 /**
- * This is a multi-touch gesture detector, including pan, zoom, and rotation.
- * It is common to want to lean toward zoom over rotation, so this gesture detector will
- * lock into zoom if the first unless the rotation passes touch slop first.
+ * This is a multi-touch gesture detector, including pan, zoom, and rotation. It is common to want
+ * to lean toward zoom over rotation, so this gesture detector will lock into zoom if the first
+ * unless the rotation passes touch slop first.
  */
 @Composable
 fun MultitouchLockGestureDetector() {
-    MultitouchArea(
-        "Zoom, Pan, and Rotate Locking to Zoom"
-    ) {
-        detectTransformGestures(
-            panZoomLock = true,
-            onGesture = it
-        )
+    MultitouchArea("Zoom, Pan, and Rotate Locking to Zoom") {
+        detectTransformGestures(panZoomLock = true, onGesture = it)
     }
 }
 
diff --git a/compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/WindowInsetsDemo.kt b/compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/WindowInsetsDemo.kt
index 030e322..2101687 100644
--- a/compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/WindowInsetsDemo.kt
+++ b/compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/WindowInsetsDemo.kt
@@ -58,9 +58,7 @@
         BasicTextField(
             value = "Click to show keyboard",
             onValueChange = {},
-            modifier = Modifier
-                .fillMaxWidth()
-                .wrapContentSize(),
+            modifier = Modifier.fillMaxWidth().wrapContentSize(),
             textStyle = TextStyle(color = Color.Black.copy(alpha = 0.5f))
         ) { field ->
             with(density) {
@@ -75,13 +73,7 @@
                             insets.getLeft(density, layoutDirection).toDp().toString(),
                             style = MaterialTheme.typography.caption
                         )
-                        Box(
-                            Modifier
-                                .padding(2.dp)
-                                .border(1.dp, Color.Black)
-                        ) {
-                            field()
-                        }
+                        Box(Modifier.padding(2.dp).border(1.dp, Color.Black)) { field() }
                         Text(
                             insets.getRight(density, layoutDirection).toDp().toString(),
                             style = MaterialTheme.typography.caption
diff --git a/compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/collection/ColorList.kt b/compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/collection/ColorList.kt
index e8ce3d3..0f85250 100644
--- a/compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/collection/ColorList.kt
+++ b/compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/collection/ColorList.kt
@@ -49,49 +49,39 @@
 // -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
 
 /**
- * [ColorList] is a [List]-like collection for [Color] values. It allows retrieving
- * the elements without boxing. [ColorList] is always backed by a [MutableColorList],
- * its [MutableList]-like subclass.
+ * [ColorList] is a [List]-like collection for [Color] values. It allows retrieving the elements
+ * without boxing. [ColorList] is always backed by a [MutableColorList], its [MutableList]-like
+ * subclass.
  *
- * This implementation is not thread-safe: if multiple threads access this
- * container concurrently, and one or more threads modify the structure of
- * the list (insertion or removal for instance), the calling code must provide
- * the appropriate synchronization. It is also not safe to mutate during reentrancy --
- * in the middle of a [forEach], for example. However, concurrent reads are safe.
+ * This implementation is not thread-safe: if multiple threads access this container concurrently,
+ * and one or more threads modify the structure of the list (insertion or removal for instance), the
+ * calling code must provide the appropriate synchronization. It is also not safe to mutate during
+ * reentrancy -- in the middle of a [forEach], for example. However, concurrent reads are safe.
  */
 @OptIn(ExperimentalContracts::class)
 @JvmInline
 internal value class ColorList(val list: LongList) {
-    /**
-     * The number of elements in the [ColorList].
-     */
+    /** The number of elements in the [ColorList]. */
     @get:androidx.annotation.IntRange(from = 0)
-    public inline val size: Int get() = list.size
+    public inline val size: Int
+        get() = list.size
 
-    /**
-     * Returns the last valid index in the [ColorList]. This can be `-1` when the list is empty.
-     */
+    /** Returns the last valid index in the [ColorList]. This can be `-1` when the list is empty. */
     @get:androidx.annotation.IntRange(from = -1)
-    public inline val lastIndex: Int get() = list.lastIndex
+    public inline val lastIndex: Int
+        get() = list.lastIndex
 
-    /**
-     * Returns an [IntRange] of the valid indices for this [ColorList].
-     */
-    public inline val indices: IntRange get() = list.indices
+    /** Returns an [IntRange] of the valid indices for this [ColorList]. */
+    public inline val indices: IntRange
+        get() = list.indices
 
-    /**
-     * Returns `true` if the collection has no elements in it.
-     */
+    /** Returns `true` if the collection has no elements in it. */
     public inline fun none(): Boolean = list.none()
 
-    /**
-     * Returns `true` if there's at least one element in the collection.
-     */
+    /** Returns `true` if there's at least one element in the collection. */
     public inline fun any(): Boolean = list.any()
 
-    /**
-     * Returns `true` if any of the elements give a `true` return value for [predicate].
-     */
+    /** Returns `true` if any of the elements give a `true` return value for [predicate]. */
     public inline fun any(predicate: (element: Color) -> Boolean): Boolean {
         contract { callsInPlace(predicate) }
         return list.any { predicate(Color(it.toULong())) }
@@ -106,33 +96,29 @@
         return list.reversedAny { predicate(Color(it.toULong())) }
     }
 
-    /**
-     * Returns `true` if the [ColorList] contains [element] or `false` otherwise.
-     */
+    /** Returns `true` if the [ColorList] contains [element] or `false` otherwise. */
     public inline operator fun contains(element: Color): Boolean =
         list.contains(element.value.toLong())
 
     /**
-     * Returns `true` if the [ColorList] contains all elements in [elements] or `false` if
-     * one or more are missing.
+     * Returns `true` if the [ColorList] contains all elements in [elements] or `false` if one or
+     * more are missing.
      */
-    public inline fun containsAll(elements: ColorList): Boolean =
-        list.containsAll(elements.list)
+    public inline fun containsAll(elements: ColorList): Boolean = list.containsAll(elements.list)
 
     /**
-     * Returns `true` if the [ColorList] contains all elements in [elements] or `false` if
-     * one or more are missing.
+     * Returns `true` if the [ColorList] contains all elements in [elements] or `false` if one or
+     * more are missing.
      */
     public inline fun containsAll(elements: MutableColorList): Boolean =
         list.containsAll(elements.list)
 
-    /**
-     * Returns the number of elements in this list.
-     */
+    /** Returns the number of elements in this list. */
     public inline fun count(): Int = list.count()
 
     /**
      * Counts the number of elements matching [predicate].
+     *
      * @return The number of elements in this list for which [predicate] returns true.
      */
     public inline fun count(predicate: (element: Color) -> Boolean): Int {
@@ -141,14 +127,15 @@
     }
 
     /**
-     * Returns the first element in the [ColorList] or throws a [NoSuchElementException] if
-     * it [isEmpty].
+     * Returns the first element in the [ColorList] or throws a [NoSuchElementException] if it
+     * [isEmpty].
      */
     public inline fun first(): Color = Color(list.first().toULong())
 
     /**
-     * Returns the first element in the [ColorList] for which [predicate] returns `true` or
-     * throws [NoSuchElementException] if nothing matches.
+     * Returns the first element in the [ColorList] for which [predicate] returns `true` or throws
+     * [NoSuchElementException] if nothing matches.
+     *
      * @see indexOfFirst
      */
     public inline fun first(predicate: (element: Color) -> Boolean): Color {
@@ -157,23 +144,22 @@
     }
 
     /**
-     * Accumulates values, starting with [initial], and applying [operation] to each element
-     * in the [ColorList] in order.
-     * @param initial The value of `acc` for the first call to [operation] or return value if
-     * there are no elements in this list.
-     * @param operation function that takes current accumulator value and an element, and
-     * calculates the next accumulator value.
+     * Accumulates values, starting with [initial], and applying [operation] to each element in the
+     * [ColorList] in order.
+     *
+     * @param initial The value of `acc` for the first call to [operation] or return value if there
+     *   are no elements in this list.
+     * @param operation function that takes current accumulator value and an element, and calculates
+     *   the next accumulator value.
      */
     public inline fun <R> fold(initial: R, operation: (acc: R, element: Color) -> R): R {
         contract { callsInPlace(operation) }
-        return list.fold(initial) { acc, element ->
-            operation(acc, Color(element.toULong()))
-        }
+        return list.fold(initial) { acc, element -> operation(acc, Color(element.toULong())) }
     }
 
     /**
-     * Accumulates values, starting with [initial], and applying [operation] to each element
-     * in the [ColorList] in order.
+     * Accumulates values, starting with [initial], and applying [operation] to each element in the
+     * [ColorList] in order.
      */
     public inline fun <R> foldIndexed(
         initial: R,
@@ -186,23 +172,22 @@
     }
 
     /**
-     * Accumulates values, starting with [initial], and applying [operation] to each element
-     * in the [ColorList] in reverse order.
-     * @param initial The value of `acc` for the first call to [operation] or return value if
-     * there are no elements in this list.
+     * Accumulates values, starting with [initial], and applying [operation] to each element in the
+     * [ColorList] in reverse order.
+     *
+     * @param initial The value of `acc` for the first call to [operation] or return value if there
+     *   are no elements in this list.
      * @param operation function that takes an element and the current accumulator value, and
-     * calculates the next accumulator value.
+     *   calculates the next accumulator value.
      */
     public inline fun <R> foldRight(initial: R, operation: (element: Color, acc: R) -> R): R {
         contract { callsInPlace(operation) }
-        return list.foldRight(initial) { element, acc ->
-            operation(Color(element.toULong()), acc)
-        }
+        return list.foldRight(initial) { element, acc -> operation(Color(element.toULong()), acc) }
     }
 
     /**
-     * Accumulates values, starting with [initial], and applying [operation] to each element
-     * in the [ColorList] in reverse order.
+     * Accumulates values, starting with [initial], and applying [operation] to each element in the
+     * [ColorList] in reverse order.
      */
     public inline fun <R> foldRightIndexed(
         initial: R,
@@ -216,8 +201,9 @@
 
     /**
      * Calls [block] for each element in the [ColorList], in order.
-     * @param block will be executed for every element in the list, accepting an element from
-     * the list
+     *
+     * @param block will be executed for every element in the list, accepting an element from the
+     *   list
      */
     public inline fun forEach(block: (element: Color) -> Unit) {
         contract { callsInPlace(block) }
@@ -226,20 +212,20 @@
 
     /**
      * Calls [block] for each element in the [ColorList] along with its index, in order.
-     * @param block will be executed for every element in the list, accepting the index and
-     * the element at that index.
+     *
+     * @param block will be executed for every element in the list, accepting the index and the
+     *   element at that index.
      */
     public inline fun forEachIndexed(block: (index: Int, element: Color) -> Unit) {
         contract { callsInPlace(block) }
-        list.forEachIndexed { index, element ->
-            block(index, Color(element.toULong()))
-        }
+        list.forEachIndexed { index, element -> block(index, Color(element.toULong())) }
     }
 
     /**
      * Calls [block] for each element in the [ColorList] in reverse order.
-     * @param block will be executed for every element in the list, accepting an element from
-     * the list
+     *
+     * @param block will be executed for every element in the list, accepting an element from the
+     *   list
      */
     public inline fun forEachReversed(block: (element: Color) -> Unit) {
         contract { callsInPlace(block) }
@@ -247,55 +233,49 @@
     }
 
     /**
-     * Calls [block] for each element in the [ColorList] along with its index, in reverse
-     * order.
-     * @param block will be executed for every element in the list, accepting the index and
-     * the element at that index.
+     * Calls [block] for each element in the [ColorList] along with its index, in reverse order.
+     *
+     * @param block will be executed for every element in the list, accepting the index and the
+     *   element at that index.
      */
     public inline fun forEachReversedIndexed(block: (index: Int, element: Color) -> Unit) {
         contract { callsInPlace(block) }
-        list.forEachReversedIndexed { index, element ->
-            block(index, Color(element.toULong()))
-        }
+        list.forEachReversedIndexed { index, element -> block(index, Color(element.toULong())) }
     }
 
     /**
-     * Returns the element at the given [index] or throws [IndexOutOfBoundsException] if
-     * the [index] is out of bounds of this collection.
+     * Returns the element at the given [index] or throws [IndexOutOfBoundsException] if the [index]
+     * is out of bounds of this collection.
      */
-    public inline operator fun get(
-        @androidx.annotation.IntRange(from = 0) index: Int
-    ): Color = Color(list[index].toULong())
+    public inline operator fun get(@androidx.annotation.IntRange(from = 0) index: Int): Color =
+        Color(list[index].toULong())
 
     /**
-     * Returns the element at the given [index] or throws [IndexOutOfBoundsException] if
-     * the [index] is out of bounds of this collection.
+     * Returns the element at the given [index] or throws [IndexOutOfBoundsException] if the [index]
+     * is out of bounds of this collection.
      */
     public inline fun elementAt(@androidx.annotation.IntRange(from = 0) index: Int): Color =
         Color(list[index].toULong())
 
     /**
-     * Returns the element at the given [index] or [defaultValue] if [index] is out of bounds
-     * of the collection.
+     * Returns the element at the given [index] or [defaultValue] if [index] is out of bounds of the
+     * collection.
+     *
      * @param index The index of the element whose value should be returned
-     * @param defaultValue A lambda to call with [index] as a parameter to return a value at
-     * an index not in the list.
+     * @param defaultValue A lambda to call with [index] as a parameter to return a value at an
+     *   index not in the list.
      */
     public inline fun elementAtOrElse(
         @androidx.annotation.IntRange(from = 0) index: Int,
         defaultValue: (index: Int) -> Color
-    ): Color =
-        Color(list.elementAtOrElse(index) { defaultValue(it).value.toLong() }.toULong())
+    ): Color = Color(list.elementAtOrElse(index) { defaultValue(it).value.toLong() }.toULong())
+
+    /** Returns the index of [element] in the [ColorList] or `-1` if [element] is not there. */
+    public inline fun indexOf(element: Color): Int = list.indexOf(element.value.toLong())
 
     /**
-     * Returns the index of [element] in the [ColorList] or `-1` if [element] is not there.
-     */
-    public inline fun indexOf(element: Color): Int =
-        list.indexOf(element.value.toLong())
-
-    /**
-     * Returns the index if the first element in the [ColorList] for which [predicate]
-     * returns `true`.
+     * Returns the index if the first element in the [ColorList] for which [predicate] returns
+     * `true`.
      */
     public inline fun indexOfFirst(predicate: (element: Color) -> Boolean): Int {
         contract { callsInPlace(predicate) }
@@ -303,33 +283,30 @@
     }
 
     /**
-     * Returns the index if the last element in the [ColorList] for which [predicate]
-     * returns `true`.
+     * Returns the index if the last element in the [ColorList] for which [predicate] returns
+     * `true`.
      */
     public inline fun indexOfLast(predicate: (element: Color) -> Boolean): Int {
         contract { callsInPlace(predicate) }
         return list.indexOfLast { predicate(Color(it.toULong())) }
     }
 
-    /**
-     * Returns `true` if the [ColorList] has no elements in it or `false` otherwise.
-     */
+    /** Returns `true` if the [ColorList] has no elements in it or `false` otherwise. */
     public inline fun isEmpty(): Boolean = list.isEmpty()
 
-    /**
-     * Returns `true` if there are elements in the [ColorList] or `false` if it is empty.
-     */
+    /** Returns `true` if there are elements in the [ColorList] or `false` if it is empty. */
     public inline fun isNotEmpty(): Boolean = list.isNotEmpty()
 
     /**
-     * Returns the last element in the [ColorList] or throws a [NoSuchElementException] if
-     * it [isEmpty].
+     * Returns the last element in the [ColorList] or throws a [NoSuchElementException] if it
+     * [isEmpty].
      */
     public inline fun last(): Color = Color(list.last().toULong())
 
     /**
-     * Returns the last element in the [ColorList] for which [predicate] returns `true` or
-     * throws [NoSuchElementException] if nothing matches.
+     * Returns the last element in the [ColorList] for which [predicate] returns `true` or throws
+     * [NoSuchElementException] if nothing matches.
+     *
      * @see indexOfLast
      */
     public inline fun last(predicate: (element: Color) -> Boolean): Color {
@@ -338,15 +315,14 @@
     }
 
     /**
-     * Returns the index of the last element in the [ColorList] that is the same as
-     * [element] or `-1` if no elements match.
+     * Returns the index of the last element in the [ColorList] that is the same as [element] or
+     * `-1` if no elements match.
      */
-    public inline fun lastIndexOf(element: Color): Int =
-        list.lastIndexOf(element.value.toLong())
+    public inline fun lastIndexOf(element: Color): Int = list.lastIndexOf(element.value.toLong())
 
     /**
-     * Returns a String representation of the list, surrounded by "[]" and each element
-     * separated by ", ".
+     * Returns a String representation of the list, surrounded by "[]" and each element separated by
+     * ", ".
      */
     override fun toString(): String {
         if (isEmpty()) {
@@ -366,16 +342,14 @@
 }
 
 /**
- * [MutableColorList] is a [MutableList]-like collection for [Color] values.
- * It allows storing and retrieving the elements without boxing. Immutable
- * access is available through its base class [ColorList], which has a [List]-like
- * interface.
+ * [MutableColorList] is a [MutableList]-like collection for [Color] values. It allows storing and
+ * retrieving the elements without boxing. Immutable access is available through its base class
+ * [ColorList], which has a [List]-like interface.
  *
- * This implementation is not thread-safe: if multiple threads access this
- * container concurrently, and one or more threads modify the structure of
- * the list (insertion or removal for instance), the calling code must provide
- * the appropriate synchronization. It is also not safe to mutate during reentrancy --
- * in the middle of a [forEach], for example. However, concurrent reads are safe.
+ * This implementation is not thread-safe: if multiple threads access this container concurrently,
+ * and one or more threads modify the structure of the list (insertion or removal for instance), the
+ * calling code must provide the appropriate synchronization. It is also not safe to mutate during
+ * reentrancy -- in the middle of a [forEach], for example. However, concurrent reads are safe.
  *
  * @constructor Creates a [MutableColorList] with a [capacity] of `initialCapacity`.
  */
@@ -384,36 +358,27 @@
 internal value class MutableColorList(val list: MutableLongList) {
     public constructor(initialCapacity: Int = 16) : this(MutableLongList(initialCapacity))
 
-    /**
-     * The number of elements in the [ColorList].
-     */
+    /** The number of elements in the [ColorList]. */
     @get:androidx.annotation.IntRange(from = 0)
-    public inline val size: Int get() = list.size
+    public inline val size: Int
+        get() = list.size
 
-    /**
-     * Returns the last valid index in the [ColorList]. This can be `-1` when the list is empty.
-     */
+    /** Returns the last valid index in the [ColorList]. This can be `-1` when the list is empty. */
     @get:androidx.annotation.IntRange(from = -1)
-    public inline val lastIndex: Int get() = list.lastIndex
+    public inline val lastIndex: Int
+        get() = list.lastIndex
 
-    /**
-     * Returns an [IntRange] of the valid indices for this [ColorList].
-     */
-    public inline val indices: IntRange get() = list.indices
+    /** Returns an [IntRange] of the valid indices for this [ColorList]. */
+    public inline val indices: IntRange
+        get() = list.indices
 
-    /**
-     * Returns `true` if the collection has no elements in it.
-     */
+    /** Returns `true` if the collection has no elements in it. */
     public inline fun none(): Boolean = list.none()
 
-    /**
-     * Returns `true` if there's at least one element in the collection.
-     */
+    /** Returns `true` if there's at least one element in the collection. */
     public inline fun any(): Boolean = list.any()
 
-    /**
-     * Returns `true` if any of the elements give a `true` return value for [predicate].
-     */
+    /** Returns `true` if any of the elements give a `true` return value for [predicate]. */
     public inline fun any(predicate: (element: Color) -> Boolean): Boolean {
         contract { callsInPlace(predicate) }
         return list.any { predicate(Color(it.toULong())) }
@@ -428,33 +393,29 @@
         return list.reversedAny { predicate(Color(it.toULong())) }
     }
 
-    /**
-     * Returns `true` if the [ColorList] contains [element] or `false` otherwise.
-     */
+    /** Returns `true` if the [ColorList] contains [element] or `false` otherwise. */
     public inline operator fun contains(element: Color): Boolean =
         list.contains(element.value.toLong())
 
     /**
-     * Returns `true` if the [ColorList] contains all elements in [elements] or `false` if
-     * one or more are missing.
+     * Returns `true` if the [ColorList] contains all elements in [elements] or `false` if one or
+     * more are missing.
      */
-    public inline fun containsAll(elements: ColorList): Boolean =
-        list.containsAll(elements.list)
+    public inline fun containsAll(elements: ColorList): Boolean = list.containsAll(elements.list)
 
     /**
-     * Returns `true` if the [ColorList] contains all elements in [elements] or `false` if
-     * one or more are missing.
+     * Returns `true` if the [ColorList] contains all elements in [elements] or `false` if one or
+     * more are missing.
      */
     public inline fun containsAll(elements: MutableColorList): Boolean =
         list.containsAll(elements.list)
 
-    /**
-     * Returns the number of elements in this list.
-     */
+    /** Returns the number of elements in this list. */
     public inline fun count(): Int = list.count()
 
     /**
      * Counts the number of elements matching [predicate].
+     *
      * @return The number of elements in this list for which [predicate] returns true.
      */
     public inline fun count(predicate: (element: Color) -> Boolean): Int {
@@ -463,14 +424,15 @@
     }
 
     /**
-     * Returns the first element in the [ColorList] or throws a [NoSuchElementException] if
-     * it [isEmpty].
+     * Returns the first element in the [ColorList] or throws a [NoSuchElementException] if it
+     * [isEmpty].
      */
     public inline fun first(): Color = Color(list.first().toULong())
 
     /**
-     * Returns the first element in the [ColorList] for which [predicate] returns `true` or
-     * throws [NoSuchElementException] if nothing matches.
+     * Returns the first element in the [ColorList] for which [predicate] returns `true` or throws
+     * [NoSuchElementException] if nothing matches.
+     *
      * @see indexOfFirst
      */
     public inline fun first(predicate: (element: Color) -> Boolean): Color {
@@ -479,23 +441,22 @@
     }
 
     /**
-     * Accumulates values, starting with [initial], and applying [operation] to each element
-     * in the [ColorList] in order.
-     * @param initial The value of `acc` for the first call to [operation] or return value if
-     * there are no elements in this list.
-     * @param operation function that takes current accumulator value and an element, and
-     * calculates the next accumulator value.
+     * Accumulates values, starting with [initial], and applying [operation] to each element in the
+     * [ColorList] in order.
+     *
+     * @param initial The value of `acc` for the first call to [operation] or return value if there
+     *   are no elements in this list.
+     * @param operation function that takes current accumulator value and an element, and calculates
+     *   the next accumulator value.
      */
     public inline fun <R> fold(initial: R, operation: (acc: R, element: Color) -> R): R {
         contract { callsInPlace(operation) }
-        return list.fold(initial) { acc, element ->
-            operation(acc, Color(element.toULong()))
-        }
+        return list.fold(initial) { acc, element -> operation(acc, Color(element.toULong())) }
     }
 
     /**
-     * Accumulates values, starting with [initial], and applying [operation] to each element
-     * in the [ColorList] in order.
+     * Accumulates values, starting with [initial], and applying [operation] to each element in the
+     * [ColorList] in order.
      */
     public inline fun <R> foldIndexed(
         initial: R,
@@ -508,23 +469,22 @@
     }
 
     /**
-     * Accumulates values, starting with [initial], and applying [operation] to each element
-     * in the [ColorList] in reverse order.
-     * @param initial The value of `acc` for the first call to [operation] or return value if
-     * there are no elements in this list.
+     * Accumulates values, starting with [initial], and applying [operation] to each element in the
+     * [ColorList] in reverse order.
+     *
+     * @param initial The value of `acc` for the first call to [operation] or return value if there
+     *   are no elements in this list.
      * @param operation function that takes an element and the current accumulator value, and
-     * calculates the next accumulator value.
+     *   calculates the next accumulator value.
      */
     public inline fun <R> foldRight(initial: R, operation: (element: Color, acc: R) -> R): R {
         contract { callsInPlace(operation) }
-        return list.foldRight(initial) { element, acc ->
-            operation(Color(element.toULong()), acc)
-        }
+        return list.foldRight(initial) { element, acc -> operation(Color(element.toULong()), acc) }
     }
 
     /**
-     * Accumulates values, starting with [initial], and applying [operation] to each element
-     * in the [ColorList] in reverse order.
+     * Accumulates values, starting with [initial], and applying [operation] to each element in the
+     * [ColorList] in reverse order.
      */
     public inline fun <R> foldRightIndexed(
         initial: R,
@@ -538,8 +498,9 @@
 
     /**
      * Calls [block] for each element in the [ColorList], in order.
-     * @param block will be executed for every element in the list, accepting an element from
-     * the list
+     *
+     * @param block will be executed for every element in the list, accepting an element from the
+     *   list
      */
     public inline fun forEach(block: (element: Color) -> Unit) {
         contract { callsInPlace(block) }
@@ -548,20 +509,20 @@
 
     /**
      * Calls [block] for each element in the [ColorList] along with its index, in order.
-     * @param block will be executed for every element in the list, accepting the index and
-     * the element at that index.
+     *
+     * @param block will be executed for every element in the list, accepting the index and the
+     *   element at that index.
      */
     public inline fun forEachIndexed(block: (index: Int, element: Color) -> Unit) {
         contract { callsInPlace(block) }
-        list.forEachIndexed { index, element ->
-            block(index, Color(element.toULong()))
-        }
+        list.forEachIndexed { index, element -> block(index, Color(element.toULong())) }
     }
 
     /**
      * Calls [block] for each element in the [ColorList] in reverse order.
-     * @param block will be executed for every element in the list, accepting an element from
-     * the list
+     *
+     * @param block will be executed for every element in the list, accepting an element from the
+     *   list
      */
     public inline fun forEachReversed(block: (element: Color) -> Unit) {
         contract { callsInPlace(block) }
@@ -569,55 +530,49 @@
     }
 
     /**
-     * Calls [block] for each element in the [ColorList] along with its index, in reverse
-     * order.
-     * @param block will be executed for every element in the list, accepting the index and
-     * the element at that index.
+     * Calls [block] for each element in the [ColorList] along with its index, in reverse order.
+     *
+     * @param block will be executed for every element in the list, accepting the index and the
+     *   element at that index.
      */
     public inline fun forEachReversedIndexed(block: (index: Int, element: Color) -> Unit) {
         contract { callsInPlace(block) }
-        list.forEachReversedIndexed { index, element ->
-            block(index, Color(element.toULong()))
-        }
+        list.forEachReversedIndexed { index, element -> block(index, Color(element.toULong())) }
     }
 
     /**
-     * Returns the element at the given [index] or throws [IndexOutOfBoundsException] if
-     * the [index] is out of bounds of this collection.
+     * Returns the element at the given [index] or throws [IndexOutOfBoundsException] if the [index]
+     * is out of bounds of this collection.
      */
-    public inline operator fun get(
-        @androidx.annotation.IntRange(from = 0) index: Int
-    ): Color = Color(list[index].toULong())
+    public inline operator fun get(@androidx.annotation.IntRange(from = 0) index: Int): Color =
+        Color(list[index].toULong())
 
     /**
-     * Returns the element at the given [index] or throws [IndexOutOfBoundsException] if
-     * the [index] is out of bounds of this collection.
+     * Returns the element at the given [index] or throws [IndexOutOfBoundsException] if the [index]
+     * is out of bounds of this collection.
      */
     public inline fun elementAt(@androidx.annotation.IntRange(from = 0) index: Int): Color =
         Color(list[index].toULong())
 
     /**
-     * Returns the element at the given [index] or [defaultValue] if [index] is out of bounds
-     * of the collection.
+     * Returns the element at the given [index] or [defaultValue] if [index] is out of bounds of the
+     * collection.
+     *
      * @param index The index of the element whose value should be returned
-     * @param defaultValue A lambda to call with [index] as a parameter to return a value at
-     * an index not in the list.
+     * @param defaultValue A lambda to call with [index] as a parameter to return a value at an
+     *   index not in the list.
      */
     public inline fun elementAtOrElse(
         @androidx.annotation.IntRange(from = 0) index: Int,
         defaultValue: (index: Int) -> Color
-    ): Color =
-        Color(list.elementAtOrElse(index) { defaultValue(it).value.toLong() }.toULong())
+    ): Color = Color(list.elementAtOrElse(index) { defaultValue(it).value.toLong() }.toULong())
+
+    /** Returns the index of [element] in the [ColorList] or `-1` if [element] is not there. */
+    public inline fun indexOf(element: Color): Int = list.indexOf(element.value.toLong())
 
     /**
-     * Returns the index of [element] in the [ColorList] or `-1` if [element] is not there.
-     */
-    public inline fun indexOf(element: Color): Int =
-        list.indexOf(element.value.toLong())
-
-    /**
-     * Returns the index if the first element in the [ColorList] for which [predicate]
-     * returns `true`.
+     * Returns the index if the first element in the [ColorList] for which [predicate] returns
+     * `true`.
      */
     public inline fun indexOfFirst(predicate: (element: Color) -> Boolean): Int {
         contract { callsInPlace(predicate) }
@@ -625,33 +580,30 @@
     }
 
     /**
-     * Returns the index if the last element in the [ColorList] for which [predicate]
-     * returns `true`.
+     * Returns the index if the last element in the [ColorList] for which [predicate] returns
+     * `true`.
      */
     public inline fun indexOfLast(predicate: (element: Color) -> Boolean): Int {
         contract { callsInPlace(predicate) }
         return list.indexOfLast { predicate(Color(it.toULong())) }
     }
 
-    /**
-     * Returns `true` if the [ColorList] has no elements in it or `false` otherwise.
-     */
+    /** Returns `true` if the [ColorList] has no elements in it or `false` otherwise. */
     public inline fun isEmpty(): Boolean = list.isEmpty()
 
-    /**
-     * Returns `true` if there are elements in the [ColorList] or `false` if it is empty.
-     */
+    /** Returns `true` if there are elements in the [ColorList] or `false` if it is empty. */
     public inline fun isNotEmpty(): Boolean = list.isNotEmpty()
 
     /**
-     * Returns the last element in the [ColorList] or throws a [NoSuchElementException] if
-     * it [isEmpty].
+     * Returns the last element in the [ColorList] or throws a [NoSuchElementException] if it
+     * [isEmpty].
      */
     public inline fun last(): Color = Color(list.last().toULong())
 
     /**
-     * Returns the last element in the [ColorList] for which [predicate] returns `true` or
-     * throws [NoSuchElementException] if nothing matches.
+     * Returns the last element in the [ColorList] for which [predicate] returns `true` or throws
+     * [NoSuchElementException] if nothing matches.
+     *
      * @see indexOfLast
      */
     public inline fun last(predicate: (element: Color) -> Boolean): Color {
@@ -660,21 +612,18 @@
     }
 
     /**
-     * Returns the index of the last element in the [ColorList] that is the same as
-     * [element] or `-1` if no elements match.
+     * Returns the index of the last element in the [ColorList] that is the same as [element] or
+     * `-1` if no elements match.
      */
-    public inline fun lastIndexOf(element: Color): Int =
-        list.lastIndexOf(element.value.toLong())
+    public inline fun lastIndexOf(element: Color): Int = list.lastIndexOf(element.value.toLong())
 
     /**
-     * Returns a String representation of the list, surrounded by "[]" and each element
-     * separated by ", ".
+     * Returns a String representation of the list, surrounded by "[]" and each element separated by
+     * ", ".
      */
     override fun toString(): String = asColorList().toString()
 
-    /**
-     * Returns a read-only interface to the list.
-     */
+    /** Returns a read-only interface to the list. */
     public inline fun asColorList(): ColorList = ColorList(list)
 
     /**
@@ -686,25 +635,22 @@
     public inline val capacity: Int
         get() = list.capacity
 
-    /**
-     * Adds [element] to the [MutableColorList] and returns `true`.
-     */
-    public inline fun add(element: Color): Boolean =
-        list.add(element.value.toLong())
+    /** Adds [element] to the [MutableColorList] and returns `true`. */
+    public inline fun add(element: Color): Boolean = list.add(element.value.toLong())
 
     /**
-     * Adds [element] to the [MutableColorList] at the given [index], shifting over any
-     * elements at [index] and after, if any.
+     * Adds [element] to the [MutableColorList] at the given [index], shifting over any elements at
+     * [index] and after, if any.
+     *
      * @throws IndexOutOfBoundsException if [index] isn't between 0 and [size], inclusive
      */
-    public inline fun add(
-        @androidx.annotation.IntRange(from = 0) index: Int,
-        element: Color
-    ) = list.add(index, element.value.toLong())
+    public inline fun add(@androidx.annotation.IntRange(from = 0) index: Int, element: Color) =
+        list.add(index, element.value.toLong())
 
     /**
      * Adds all [elements] to the [MutableColorList] at the given [index], shifting over any
      * elements at [index] and after, if any.
+     *
      * @return `true` if the [MutableColorList] was changed or `false` if [elements] was empty
      * @throws IndexOutOfBoundsException if [index] isn't between 0 and [size], inclusive
      */
@@ -716,6 +662,7 @@
     /**
      * Adds all [elements] to the [MutableColorList] at the given [index], shifting over any
      * elements at [index] and after, if any.
+     *
      * @return `true` if the [MutableColorList] was changed or `false` if [elements] was empty
      * @throws IndexOutOfBoundsException if [index] isn't between 0 and [size], inclusive
      */
@@ -730,11 +677,8 @@
      */
     public inline fun addAll(elements: ColorList): Boolean = list.addAll(elements.list)
 
-    /**
-     * Adds all [elements] to the end of the [MutableColorList].
-     */
-    public inline operator fun plusAssign(elements: ColorList) =
-        list.plusAssign(elements.list)
+    /** Adds all [elements] to the end of the [MutableColorList]. */
+    public inline operator fun plusAssign(elements: ColorList) = list.plusAssign(elements.list)
 
     /**
      * Adds all [elements] to the end of the [MutableColorList] and returns `true` if the
@@ -742,14 +686,13 @@
      */
     public inline fun addAll(elements: MutableColorList): Boolean = list.addAll(elements.list)
 
-    /**
-     * Adds all [elements] to the end of the [MutableColorList].
-     */
+    /** Adds all [elements] to the end of the [MutableColorList]. */
     public inline operator fun plusAssign(elements: MutableColorList) =
         list.plusAssign(elements.list)
 
     /**
      * Removes all elements in the [MutableColorList]. The storage isn't released.
+     *
      * @see trim
      */
     public inline fun clear() = list.clear()
@@ -757,62 +700,54 @@
     /**
      * Reduces the internal storage. If [capacity] is greater than [minCapacity] and [size], the
      * internal storage is reduced to the maximum of [size] and [minCapacity].
+     *
      * @see ensureCapacity
      */
     public inline fun trim(minCapacity: Int = size) = list.trim(minCapacity)
 
     /**
      * Ensures that there is enough space to store [capacity] elements in the [MutableColorList].
+     *
      * @see trim
      */
     public inline fun ensureCapacity(capacity: Int) = list.ensureCapacity(capacity)
 
-    /**
-     * [add] [element] to the [MutableColorList].
-     */
-    public inline operator fun plusAssign(element: Color) =
-        list.plusAssign(element.value.toLong())
+    /** [add] [element] to the [MutableColorList]. */
+    public inline operator fun plusAssign(element: Color) = list.plusAssign(element.value.toLong())
 
-    /**
-     * [remove] [element] from the [MutableColorList]
-     */
+    /** [remove] [element] from the [MutableColorList] */
     public inline operator fun minusAssign(element: Color) =
         list.minusAssign(element.value.toLong())
 
     /**
-     * Removes [element] from the [MutableColorList]. If [element] was in the [MutableColorList]
-     * and was removed, `true` will be returned, or `false` will be returned if the element
-     * was not found.
+     * Removes [element] from the [MutableColorList]. If [element] was in the [MutableColorList] and
+     * was removed, `true` will be returned, or `false` will be returned if the element was not
+     * found.
      */
-    public inline fun remove(element: Color): Boolean =
-        list.remove(element.value.toLong())
+    public inline fun remove(element: Color): Boolean = list.remove(element.value.toLong())
 
     /**
-     * Removes all [elements] from the [MutableColorList] and returns `true` if anything was removed.
+     * Removes all [elements] from the [MutableColorList] and returns `true` if anything was
+     * removed.
      */
-    public inline fun removeAll(elements: ColorList): Boolean =
-        list.removeAll(elements.list)
+    public inline fun removeAll(elements: ColorList): Boolean = list.removeAll(elements.list)
+
+    /** Removes all [elements] from the [MutableColorList]. */
+    public inline operator fun minusAssign(elements: ColorList) = list.minusAssign(elements.list)
 
     /**
-     * Removes all [elements] from the [MutableColorList].
+     * Removes all [elements] from the [MutableColorList] and returns `true` if anything was
+     * removed.
      */
-    public inline operator fun minusAssign(elements: ColorList) =
-        list.minusAssign(elements.list)
+    public inline fun removeAll(elements: MutableColorList): Boolean = list.removeAll(elements.list)
 
-    /**
-     * Removes all [elements] from the [MutableColorList] and returns `true` if anything was removed.
-     */
-    public inline fun removeAll(elements: MutableColorList): Boolean =
-        list.removeAll(elements.list)
-
-    /**
-     * Removes all [elements] from the [MutableColorList].
-     */
+    /** Removes all [elements] from the [MutableColorList]. */
     public inline operator fun minusAssign(elements: MutableColorList) =
         list.minusAssign(elements.list)
 
     /**
      * Removes the element at the given [index] and returns it.
+     *
      * @throws IndexOutOfBoundsException if [index] isn't between 0 and [lastIndex], inclusive
      */
     public inline fun removeAt(@androidx.annotation.IntRange(from = 0) index: Int): Color =
@@ -820,6 +755,7 @@
 
     /**
      * Removes items from index [start] (inclusive) to [end] (exclusive).
+     *
      * @throws IndexOutOfBoundsException if [start] or [end] isn't between 0 and [size], inclusive
      * @throws IllegalArgumentException if [start] is greater than [end]
      */
@@ -830,20 +766,21 @@
 
     /**
      * Keeps only [elements] in the [MutableColorList] and removes all other values.
+     *
      * @return `true` if the [MutableColorList] has changed.
      */
-    public inline fun retainAll(elements: ColorList): Boolean =
-        list.retainAll(elements.list)
+    public inline fun retainAll(elements: ColorList): Boolean = list.retainAll(elements.list)
 
     /**
      * Keeps only [elements] in the [MutableColorList] and removes all other values.
+     *
      * @return `true` if the [MutableColorList] has changed.
      */
-    public inline fun retainAll(elements: MutableColorList): Boolean =
-        list.retainAll(elements.list)
+    public inline fun retainAll(elements: MutableColorList): Boolean = list.retainAll(elements.list)
 
     /**
      * Sets the value at [index] to [element].
+     *
      * @return the previous value set at [index]
      * @throws IndexOutOfBoundsException if [index] isn't between 0 and [lastIndex], inclusive
      */
@@ -853,86 +790,49 @@
     ): Color = Color(list.set(index, element.value.toLong()).toULong())
 }
 
-/**
- * @return a read-only [ColorList] with nothing in it.
- */
+/** @return a read-only [ColorList] with nothing in it. */
 internal inline fun emptyColorList(): ColorList = ColorList(emptyLongList())
 
-/**
- * @return a read-only [ColorList] with nothing in it.
- */
+/** @return a read-only [ColorList] with nothing in it. */
 internal inline fun colorListOf(): ColorList = ColorList(emptyLongList())
 
-/**
- * @return a new read-only [ColorList] with [element1] as the only item in the list.
- */
+/** @return a new read-only [ColorList] with [element1] as the only item in the list. */
 internal inline fun colorListOf(element1: Color): ColorList =
     ColorList(mutableLongListOf(element1.value.toLong()))
 
-/**
- * @return a new read-only [ColorList] with 2 elements, [element1] and [element2], in order.
- */
+/** @return a new read-only [ColorList] with 2 elements, [element1] and [element2], in order. */
 internal inline fun colorListOf(element1: Color, element2: Color): ColorList =
+    ColorList(mutableLongListOf(element1.value.toLong(), element2.value.toLong()))
+
+/**
+ * @return a new read-only [ColorList] with 3 elements, [element1], [element2], and [element3], in
+ *   order.
+ */
+internal inline fun colorListOf(element1: Color, element2: Color, element3: Color): ColorList =
     ColorList(
-        mutableLongListOf(
-            element1.value.toLong(),
-            element2.value.toLong()
-        )
+        mutableLongListOf(element1.value.toLong(), element2.value.toLong(), element3.value.toLong())
     )
 
-/**
- * @return a new read-only [ColorList] with 3 elements, [element1], [element2], and [element3],
- * in order.
- */
-internal inline fun colorListOf(
-        element1: Color,
-        element2: Color,
-        element3: Color
-): ColorList = ColorList(
-    mutableLongListOf(
-        element1.value.toLong(),
-        element2.value.toLong(),
-        element3.value.toLong()
-    )
-)
+/** @return a new empty [MutableColorList] with the default capacity. */
+internal inline fun mutableColorListOf(): MutableColorList = MutableColorList(MutableLongList())
 
-/**
- * @return a new empty [MutableColorList] with the default capacity.
- */
-internal inline fun mutableColorListOf(): MutableColorList =
-    MutableColorList(MutableLongList())
-
-/**
- * @return a new [MutableColorList] with [element1] as the only item in the list.
- */
+/** @return a new [MutableColorList] with [element1] as the only item in the list. */
 internal inline fun mutableColorListOf(element1: Color): MutableColorList =
     MutableColorList(mutableLongListOf(element1.value.toLong()))
 
-/**
- * @return a new [MutableColorList] with 2 elements, [element1] and [element2], in order.
- */
-internal inline fun mutableColorListOf(
-        element1: Color,
-        element2: Color
-    ): MutableColorList = MutableColorList(
-        mutableLongListOf(
-            element1.value.toLong(),
-            element2.value.toLong()
-        )
-    )
+/** @return a new [MutableColorList] with 2 elements, [element1] and [element2], in order. */
+internal inline fun mutableColorListOf(element1: Color, element2: Color): MutableColorList =
+    MutableColorList(mutableLongListOf(element1.value.toLong(), element2.value.toLong()))
 
 /**
- * @return a new [MutableColorList] with 3 elements, [element1], [element2], and [element3],
- * in order.
+ * @return a new [MutableColorList] with 3 elements, [element1], [element2], and [element3], in
+ *   order.
  */
 internal inline fun mutableColorListOf(
-        element1: Color,
-        element2: Color,
-        element3: Color
-): MutableColorList = MutableColorList(
-    mutableLongListOf(
-        element1.value.toLong(),
-        element2.value.toLong(),
-        element3.value.toLong()
+    element1: Color,
+    element2: Color,
+    element3: Color
+): MutableColorList =
+    MutableColorList(
+        mutableLongListOf(element1.value.toLong(), element2.value.toLong(), element3.value.toLong())
     )
-)
diff --git a/compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/collection/ColorSet.kt b/compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/collection/ColorSet.kt
index de673b8..978d6cb 100644
--- a/compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/collection/ColorSet.kt
+++ b/compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/collection/ColorSet.kt
@@ -48,30 +48,19 @@
 // to ensure the change is available on all versions of the set.
 // -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
 
-/**
- * Returns an empty, read-only [ColorSet].
- */
+/** Returns an empty, read-only [ColorSet]. */
 internal inline fun emptyColorSet(): ColorSet = ColorSet(emptyLongSet())
 
-/**
- * Returns an empty, read-only [ColorSet].
- */
+/** Returns an empty, read-only [ColorSet]. */
 internal inline fun colorSetOf(): ColorSet = ColorSet(emptyLongSet())
 
-/**
- * Returns a new read-only [ColorSet] with only [element1] in it.
- */
+/** Returns a new read-only [ColorSet] with only [element1] in it. */
 internal inline fun colorSetOf(element1: Color): ColorSet =
     ColorSet(mutableLongSetOf(element1.value.toLong()))
 
-/**
- * Returns a new read-only [ColorSet] with only [element1] and [element2] in it.
- */
+/** Returns a new read-only [ColorSet] with only [element1] and [element2] in it. */
 @Suppress("UNCHECKED_CAST")
-internal fun colorSetOf(
-    element1: Color,
-    element2: Color
-): ColorSet =
+internal fun colorSetOf(element1: Color, element2: Color): ColorSet =
     ColorSet(
         mutableLongSetOf(
             element1.value.toLong(),
@@ -79,42 +68,26 @@
         )
     )
 
-/**
- * Returns a new read-only [ColorSet] with only [element1], [element2], and [element3] in it.
- */
+/** Returns a new read-only [ColorSet] with only [element1], [element2], and [element3] in it. */
 @Suppress("UNCHECKED_CAST")
-internal fun colorSetOf(
-    element1: Color,
-    element2: Color,
-    element3: Color
-): ColorSet = ColorSet(
-    mutableLongSetOf(
-        element1.value.toLong(),
-        element2.value.toLong(),
-        element3.value.toLong(),
+internal fun colorSetOf(element1: Color, element2: Color, element3: Color): ColorSet =
+    ColorSet(
+        mutableLongSetOf(
+            element1.value.toLong(),
+            element2.value.toLong(),
+            element3.value.toLong(),
+        )
     )
-)
 
-/**
- * Returns a new [MutableColorSet].
- */
-internal fun mutableColorSetOf(): MutableColorSet = MutableColorSet(
-    MutableLongSet()
-)
+/** Returns a new [MutableColorSet]. */
+internal fun mutableColorSetOf(): MutableColorSet = MutableColorSet(MutableLongSet())
 
-/**
- * Returns a new [MutableColorSet] with only [element1] in it.
- */
+/** Returns a new [MutableColorSet] with only [element1] in it. */
 internal fun mutableColorSetOf(element1: Color): MutableColorSet =
     MutableColorSet(mutableLongSetOf(element1.value.toLong()))
 
-/**
- * Returns a new [MutableColorSet] with only [element1] and [element2] in it.
- */
-internal fun mutableColorSetOf(
-    element1: Color,
-    element2: Color
-): MutableColorSet =
+/** Returns a new [MutableColorSet] with only [element1] and [element2] in it. */
+internal fun mutableColorSetOf(element1: Color, element2: Color): MutableColorSet =
     MutableColorSet(
         mutableLongSetOf(
             element1.value.toLong(),
@@ -122,14 +95,8 @@
         )
     )
 
-/**
- * Returns a new [MutableColorSet] with only [element1], [element2], and [element3] in it.
- */
-internal fun mutableColorSetOf(
-    element1: Color,
-    element2: Color,
-    element3: Color
-): MutableColorSet =
+/** Returns a new [MutableColorSet] with only [element1], [element2], and [element3] in it. */
+internal fun mutableColorSetOf(element1: Color, element2: Color, element3: Color): MutableColorSet =
     MutableColorSet(
         mutableLongSetOf(
             element1.value.toLong(),
@@ -139,17 +106,16 @@
     )
 
 /**
- * [ColorSet] is a container with a [Set]-like interface designed to avoid
- * allocations, including boxing.
+ * [ColorSet] is a container with a [Set]-like interface designed to avoid allocations, including
+ * boxing.
  *
- * This implementation makes no guarantee as to the order of the elements,
- * nor does it make guarantees that the order remains constant over time.
+ * This implementation makes no guarantee as to the order of the elements, nor does it make
+ * guarantees that the order remains constant over time.
  *
- * Though [ColorSet] offers a read-only interface, it is always backed
- * by a [MutableColorSet]. Read operations alone are thread-safe. However,
- * any mutations done through the backing [MutableColorSet] while reading
- * on another thread are not safe and the developer must protect the set
- * from such changes during read operations.
+ * Though [ColorSet] offers a read-only interface, it is always backed by a [MutableColorSet]. Read
+ * operations alone are thread-safe. However, any mutations done through the backing
+ * [MutableColorSet] while reading on another thread are not safe and the developer must protect the
+ * set from such changes during read operations.
  *
  * @see [MutableColorSet]
  */
@@ -157,42 +123,33 @@
 @JvmInline
 internal value class ColorSet(val set: LongSet) {
     /**
-     * Returns the number of elements that can be stored in this set
-     * without requiring internal storage reallocation.
+     * Returns the number of elements that can be stored in this set without requiring internal
+     * storage reallocation.
      */
     @get:androidx.annotation.IntRange(from = 0)
     public inline val capacity: Int
         get() = set.capacity
 
-    /**
-     * Returns the number of elements in this set.
-     */
+    /** Returns the number of elements in this set. */
     @get:androidx.annotation.IntRange(from = 0)
     public inline val size: Int
         get() = set.size
 
-    /**
-     * Returns `true` if this set has at least one element.
-     */
+    /** Returns `true` if this set has at least one element. */
     public inline fun any(): Boolean = set.any()
 
-    /**
-     * Returns `true` if this set has no elements.
-     */
+    /** Returns `true` if this set has no elements. */
     public inline fun none(): Boolean = set.none()
 
-    /**
-     * Indicates whether this set is empty.
-     */
+    /** Indicates whether this set is empty. */
     public inline fun isEmpty(): Boolean = set.isEmpty()
 
-    /**
-     * Returns `true` if this set is not empty.
-     */
+    /** Returns `true` if this set is not empty. */
     public inline fun isNotEmpty(): Boolean = set.isNotEmpty()
 
     /**
      * Returns the first element in the collection.
+     *
      * @throws NoSuchElementException if the collection is empty
      */
     public inline fun first(): Color = Color(set.first().toULong())
@@ -201,21 +158,21 @@
      * Returns the first element in the collection for which [predicate] returns `true`.
      *
      * **Note** There is no mechanism for both determining if there is an element that matches
-     * [predicate] _and_ returning it if it exists. Developers should use [forEach] to achieve
-     * this behavior.
+     * [predicate] _and_ returning it if it exists. Developers should use [forEach] to achieve this
+     * behavior.
      *
      * @param predicate Called on elements of the set, returning `true` for an element that matches
-     * or `false` if it doesn't
+     *   or `false` if it doesn't
      * @return An element in the set for which [predicate] returns `true`.
      * @throws NoSuchElementException if [predicate] returns `false` for all elements or the
-     * collection is empty.
+     *   collection is empty.
      */
     public inline fun first(predicate: (element: Color) -> Boolean): Color =
         Color(set.first { predicate(Color(it.toULong())) }.toULong())
 
     /**
-     * Iterates over every element stored in this set by invoking
-     * the specified [block] lambda.
+     * Iterates over every element stored in this set by invoking the specified [block] lambda.
+     *
      * @param block called with each element in the set
      */
     public inline fun forEach(block: (element: Color) -> Unit) {
@@ -225,8 +182,9 @@
 
     /**
      * Returns true if all elements match the given [predicate].
+     *
      * @param predicate called for elements in the set to determine if it returns return `true` for
-     * all elements.
+     *   all elements.
      */
     public inline fun all(predicate: (element: Color) -> Boolean): Boolean {
         contract { callsInPlace(predicate) }
@@ -235,24 +193,23 @@
 
     /**
      * Returns true if at least one element matches the given [predicate].
+     *
      * @param predicate called for elements in the set to determine if it returns `true` for any
-     * elements.
+     *   elements.
      */
     public inline fun any(predicate: (element: Color) -> Boolean): Boolean {
         contract { callsInPlace(predicate) }
         return set.any { predicate(Color(it.toULong())) }
     }
 
-    /**
-     * Returns the number of elements in this set.
-     */
-    @androidx.annotation.IntRange(from = 0)
-    public inline fun count(): Int = set.count()
+    /** Returns the number of elements in this set. */
+    @androidx.annotation.IntRange(from = 0) public inline fun count(): Int = set.count()
 
     /**
      * Returns the number of elements matching the given [predicate].
+     *
      * @param predicate Called for all elements in the set to count the number for which it returns
-     * `true`.
+     *   `true`.
      */
     @androidx.annotation.IntRange(from = 0)
     public inline fun count(predicate: (element: Color) -> Boolean): Int {
@@ -261,16 +218,16 @@
     }
 
     /**
-     * Returns `true` if the specified [element] is present in this set, `false`
-     * otherwise.
+     * Returns `true` if the specified [element] is present in this set, `false` otherwise.
+     *
      * @param element The element to look for in this set
      */
     public inline operator fun contains(element: Color): Boolean =
         set.contains(element.value.toLong())
 
     /**
-     * Returns a string representation of this set. The set is denoted in the
-     * string by the `{}`. Each element is separated by `, `.
+     * Returns a string representation of this set. The set is denoted in the string by the `{}`.
+     * Each element is separated by `, `.
      */
     public override fun toString(): String {
         if (isEmpty()) {
@@ -290,60 +247,49 @@
 }
 
 /**
- * [MutableColorSet] is a container with a [MutableSet]-like interface based on a flat
- * hash table implementation. The underlying implementation is designed to avoid
- * all allocations on insertion, removal, retrieval, and iteration. Allocations
- * may still happen on insertion when the underlying storage needs to grow to
- * accommodate newly added elements to the set.
+ * [MutableColorSet] is a container with a [MutableSet]-like interface based on a flat hash table
+ * implementation. The underlying implementation is designed to avoid all allocations on insertion,
+ * removal, retrieval, and iteration. Allocations may still happen on insertion when the underlying
+ * storage needs to grow to accommodate newly added elements to the set.
  *
- * This implementation makes no guarantee as to the order of the elements stored,
- * nor does it make guarantees that the order remains constant over time.
+ * This implementation makes no guarantee as to the order of the elements stored, nor does it make
+ * guarantees that the order remains constant over time.
  *
- * This implementation is not thread-safe: if multiple threads access this
- * container concurrently, and one or more threads modify the structure of
- * the set (insertion or removal for instance), the calling code must provide
- * the appropriate synchronization. Concurrent reads are however safe.
+ * This implementation is not thread-safe: if multiple threads access this container concurrently,
+ * and one or more threads modify the structure of the set (insertion or removal for instance), the
+ * calling code must provide the appropriate synchronization. Concurrent reads are however safe.
  */
 @OptIn(ExperimentalContracts::class)
 @JvmInline
 internal value class MutableColorSet(val set: MutableLongSet) {
     /**
-     * Returns the number of elements that can be stored in this set
-     * without requiring internal storage reallocation.
+     * Returns the number of elements that can be stored in this set without requiring internal
+     * storage reallocation.
      */
     @get:androidx.annotation.IntRange(from = 0)
     public inline val capacity: Int
         get() = set.capacity
 
-    /**
-     * Returns the number of elements in this set.
-     */
+    /** Returns the number of elements in this set. */
     @get:androidx.annotation.IntRange(from = 0)
     public inline val size: Int
         get() = set.size
 
-    /**
-     * Returns `true` if this set has at least one element.
-     */
+    /** Returns `true` if this set has at least one element. */
     public inline fun any(): Boolean = set.any()
 
-    /**
-     * Returns `true` if this set has no elements.
-     */
+    /** Returns `true` if this set has no elements. */
     public inline fun none(): Boolean = set.none()
 
-    /**
-     * Indicates whether this set is empty.
-     */
+    /** Indicates whether this set is empty. */
     public inline fun isEmpty(): Boolean = set.isEmpty()
 
-    /**
-     * Returns `true` if this set is not empty.
-     */
+    /** Returns `true` if this set is not empty. */
     public inline fun isNotEmpty(): Boolean = set.isNotEmpty()
 
     /**
      * Returns the first element in the collection.
+     *
      * @throws NoSuchElementException if the collection is empty
      */
     public inline fun first(): Color = Color(set.first().toULong())
@@ -352,21 +298,21 @@
      * Returns the first element in the collection for which [predicate] returns `true`.
      *
      * **Note** There is no mechanism for both determining if there is an element that matches
-     * [predicate] _and_ returning it if it exists. Developers should use [forEach] to achieve
-     * this behavior.
+     * [predicate] _and_ returning it if it exists. Developers should use [forEach] to achieve this
+     * behavior.
      *
      * @param predicate Called on elements of the set, returning `true` for an element that matches
-     * or `false` if it doesn't
+     *   or `false` if it doesn't
      * @return An element in the set for which [predicate] returns `true`.
      * @throws NoSuchElementException if [predicate] returns `false` for all elements or the
-     * collection is empty.
+     *   collection is empty.
      */
     public inline fun first(predicate: (element: Color) -> Boolean): Color =
         Color(set.first { predicate(Color(it.toULong())) }.toULong())
 
     /**
-     * Iterates over every element stored in this set by invoking
-     * the specified [block] lambda.
+     * Iterates over every element stored in this set by invoking the specified [block] lambda.
+     *
      * @param block called with each element in the set
      */
     public inline fun forEach(block: (element: Color) -> Unit) {
@@ -376,8 +322,9 @@
 
     /**
      * Returns true if all elements match the given [predicate].
+     *
      * @param predicate called for elements in the set to determine if it returns return `true` for
-     * all elements.
+     *   all elements.
      */
     public inline fun all(predicate: (element: Color) -> Boolean): Boolean {
         contract { callsInPlace(predicate) }
@@ -386,24 +333,23 @@
 
     /**
      * Returns true if at least one element matches the given [predicate].
+     *
      * @param predicate called for elements in the set to determine if it returns `true` for any
-     * elements.
+     *   elements.
      */
     public inline fun any(predicate: (element: Color) -> Boolean): Boolean {
         contract { callsInPlace(predicate) }
         return set.any { predicate(Color(it.toULong())) }
     }
 
-    /**
-     * Returns the number of elements in this set.
-     */
-    @androidx.annotation.IntRange(from = 0)
-    public inline fun count(): Int = set.count()
+    /** Returns the number of elements in this set. */
+    @androidx.annotation.IntRange(from = 0) public inline fun count(): Int = set.count()
 
     /**
      * Returns the number of elements matching the given [predicate].
+     *
      * @param predicate Called for all elements in the set to count the number for which it returns
-     * `true`.
+     *   `true`.
      */
     @androidx.annotation.IntRange(from = 0)
     public inline fun count(predicate: (element: Color) -> Boolean): Int {
@@ -412,95 +358,98 @@
     }
 
     /**
-     * Returns `true` if the specified [element] is present in this set, `false`
-     * otherwise.
+     * Returns `true` if the specified [element] is present in this set, `false` otherwise.
+     *
      * @param element The element to look for in this set
      */
     public inline operator fun contains(element: Color): Boolean =
         set.contains(element.value.toLong())
 
     /**
-     * Returns a string representation of this set. The set is denoted in the
-     * string by the `{}`. Each element is separated by `, `.
+     * Returns a string representation of this set. The set is denoted in the string by the `{}`.
+     * Each element is separated by `, `.
      */
     public override fun toString(): String = asColorSet().toString()
 
     /**
      * Creates a new [MutableColorSet]
-     * @param initialCapacity The initial desired capacity for this container.
-     * The container will honor this value by guaranteeing its internal structures
-     * can hold that many elements without requiring any allocations. The initial
-     * capacity can be set to 0.
+     *
+     * @param initialCapacity The initial desired capacity for this container. The container will
+     *   honor this value by guaranteeing its internal structures can hold that many elements
+     *   without requiring any allocations. The initial capacity can be set to 0.
      */
     public constructor(initialCapacity: Int = 6) : this(MutableLongSet(initialCapacity))
 
-    /**
-     * Returns a read-only interface to the set.
-     */
+    /** Returns a read-only interface to the set. */
     public inline fun asColorSet(): ColorSet = ColorSet(set)
 
     /**
      * Adds the specified element to the set.
+     *
      * @param element The element to add to the set.
-     * @return `true` if the element has been added or `false` if the element is already
-     * contained within the set.
+     * @return `true` if the element has been added or `false` if the element is already contained
+     *   within the set.
      */
     public inline fun add(element: Color): Boolean = set.add(element.value.toLong())
 
     /**
      * Adds the specified element to the set.
+     *
      * @param element The element to add to the set.
      */
-    public inline operator fun plusAssign(element: Color) =
-        set.plusAssign(element.value.toLong())
+    public inline operator fun plusAssign(element: Color) = set.plusAssign(element.value.toLong())
 
     /**
      * Adds all the elements in the [elements] set into this set.
+     *
      * @param elements A [ColorSet] of elements to add to this set.
-     * @return `true` if any of the specified elements were added to the collection,
-     * `false` if the collection was not modified.
+     * @return `true` if any of the specified elements were added to the collection, `false` if the
+     *   collection was not modified.
      */
     public inline fun addAll(elements: ColorSet): Boolean = set.addAll(elements.set)
 
     /**
      * Adds all the elements in the [elements] set into this set.
+     *
      * @param elements A [ColorSet] of elements to add to this set.
-     * @return `true` if any of the specified elements were added to the collection,
-     * `false` if the collection was not modified.
+     * @return `true` if any of the specified elements were added to the collection, `false` if the
+     *   collection was not modified.
      */
     public inline fun addAll(elements: MutableColorSet): Boolean = set.addAll(elements.set)
 
     /**
      * Adds all the elements in the [elements] set into this set.
+     *
      * @param elements A [ColorSet] of elements to add to this set.
      */
-    public inline operator fun plusAssign(elements: ColorSet) =
-        set.plusAssign(elements.set)
+    public inline operator fun plusAssign(elements: ColorSet) = set.plusAssign(elements.set)
 
     /**
      * Adds all the elements in the [elements] set into this set.
+     *
      * @param elements A [ColorSet] of elements to add to this set.
      */
-    public inline operator fun plusAssign(elements: MutableColorSet) =
-        set.plusAssign(elements.set)
+    public inline operator fun plusAssign(elements: MutableColorSet) = set.plusAssign(elements.set)
 
     /**
      * Removes the specified [element] from the set.
+     *
      * @param element The element to remove from the set.
-     * @return `true` if the [element] was present in the set, or `false` if it wasn't
-     * present before removal.
+     * @return `true` if the [element] was present in the set, or `false` if it wasn't present
+     *   before removal.
      */
     public inline fun remove(element: Color): Boolean = set.remove(element.value.toLong())
 
     /**
      * Removes the specified [element] from the set if it is present.
+     *
      * @param element The element to remove from the set.
      */
-    public inline operator fun minusAssign(element: Color) =
-        set.minusAssign(element.value.toLong())
+    public inline operator fun minusAssign(element: Color) = set.minusAssign(element.value.toLong())
 
     /**
      * Removes the specified [elements] from the set, if present.
+     *
      * @param elements An [ColorSet] of elements to be removed from the set.
      * @return `true` if the set was changed or `false` if none of the elements were present.
      */
@@ -508,38 +457,36 @@
 
     /**
      * Removes the specified [elements] from the set, if present.
+     *
      * @param elements An [ColorSet] of elements to be removed from the set.
      * @return `true` if the set was changed or `false` if none of the elements were present.
      */
-    public inline fun removeAll(elements: MutableColorSet): Boolean =
-        set.removeAll(elements.set)
+    public inline fun removeAll(elements: MutableColorSet): Boolean = set.removeAll(elements.set)
 
     /**
      * Removes the specified [elements] from the set, if present.
+     *
      * @param elements An [ColorSet] of elements to be removed from the set.
      */
-    public inline operator fun minusAssign(elements: ColorSet) =
-        set.minusAssign(elements.set)
+    public inline operator fun minusAssign(elements: ColorSet) = set.minusAssign(elements.set)
 
     /**
      * Removes the specified [elements] from the set, if present.
+     *
      * @param elements An [ColorSet] of elements to be removed from the set.
      */
     public inline operator fun minusAssign(elements: MutableColorSet) =
         set.minusAssign(elements.set)
 
-    /**
-     * Removes all elements from this set.
-     */
+    /** Removes all elements from this set. */
     public inline fun clear() = set.clear()
 
     /**
-     * Trims this [MutableColorSet]'s storage so it is sized appropriately
-     * to hold the current elements.
+     * Trims this [MutableColorSet]'s storage so it is sized appropriately to hold the current
+     * elements.
      *
-     * Returns the number of empty elements removed from this set's storage.
-     * Returns 0 if no trimming is necessary or possible.
+     * Returns the number of empty elements removed from this set's storage. Returns 0 if no
+     * trimming is necessary or possible.
      */
-    @androidx.annotation.IntRange(from = 0)
-    public inline fun trim(): Int = set.trim()
+    @androidx.annotation.IntRange(from = 0) public inline fun trim(): Int = set.trim()
 }
diff --git a/compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/contextmenu/ComposeContextMenu.kt b/compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/contextmenu/ComposeContextMenu.kt
index a498dc6..8dda6bb 100644
--- a/compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/contextmenu/ComposeContextMenu.kt
+++ b/compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/contextmenu/ComposeContextMenu.kt
@@ -18,6 +18,7 @@
 
 import androidx.compose.integration.demos.common.ComposableDemo
 
-val ContextMenuDemos = listOf(
-    ComposableDemo(title = "Text Context Menus") { TextContextMenusDemo() },
-)
+val ContextMenuDemos =
+    listOf(
+        ComposableDemo(title = "Text Context Menus") { TextContextMenusDemo() },
+    )
diff --git a/compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/contextmenu/ComposeTextContextMenu.kt b/compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/contextmenu/ComposeTextContextMenu.kt
index 6fc8991..3292acb 100644
--- a/compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/contextmenu/ComposeTextContextMenu.kt
+++ b/compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/contextmenu/ComposeTextContextMenu.kt
@@ -58,15 +58,9 @@
 
 @Composable
 internal fun TextContextMenusDemo() {
-    Box(
-        modifier = Modifier
-            .fillMaxSize()
-            .verticalScroll(rememberScrollState())
-    ) {
+    Box(modifier = Modifier.fillMaxSize().verticalScroll(rememberScrollState())) {
         Column(
-            modifier = Modifier
-                .fillMaxSize()
-                .padding(start = 32.dp, end = 32.dp, bottom = 32.dp),
+            modifier = Modifier.fillMaxSize().padding(start = 32.dp, end = 32.dp, bottom = 32.dp),
             verticalArrangement = spacedBy(16.dp),
             horizontalAlignment = Alignment.CenterHorizontally,
         ) {
@@ -77,9 +71,7 @@
             }
 
             LabeledItem("Selectable Text - Single") {
-                SelectionContainer {
-                    MyText("This single text is selectable.")
-                }
+                SelectionContainer { MyText("This single text is selectable.") }
             }
 
             LabeledItem("Selectable Text - Multiple") {
@@ -129,8 +121,8 @@
                 val interactionSource = remember { MutableInteractionSource() }
                 BasicSecureTextField(
                     state = tfs,
-                    textStyle = MaterialTheme.typography.body1
-                        .copy(color = LocalContentColor.current),
+                    textStyle =
+                        MaterialTheme.typography.body1.copy(color = LocalContentColor.current),
                     interactionSource = interactionSource,
                     decorator = { innerTextField ->
                         TextFieldDefaults.OutlinedTextFieldDecorationBox(
@@ -209,9 +201,8 @@
         modifier = modifier,
         enabled = enabled,
         readOnly = readOnly,
-        textStyle = MaterialTheme.typography.body1
-            .copy(color = LocalContentColor.current)
-            .merge(textStyle),
+        textStyle =
+            MaterialTheme.typography.body1.copy(color = LocalContentColor.current).merge(textStyle),
         visualTransformation = visualTransformation,
         interactionSource = interactionSource,
         decorationBox = { innerTextField ->
@@ -242,9 +233,8 @@
         modifier = modifier,
         enabled = enabled,
         readOnly = readOnly,
-        textStyle = MaterialTheme.typography.body1
-            .copy(color = LocalContentColor.current)
-            .merge(textStyle),
+        textStyle =
+            MaterialTheme.typography.body1.copy(color = LocalContentColor.current).merge(textStyle),
         interactionSource = interactionSource,
         decorator = { innerTextField ->
             TextFieldDefaults.OutlinedTextFieldDecorationBox(
@@ -267,6 +257,5 @@
     }
 }
 
-private fun Modifier.outline(color: Color = Color.LightGray): Modifier = this
-    .border(1.dp, color, RoundedCornerShape(4.dp))
-    .padding(2.dp)
+private fun Modifier.outline(color: Color = Color.LightGray): Modifier =
+    this.border(1.dp, color, RoundedCornerShape(4.dp)).padding(2.dp)
diff --git a/compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/focus/FocusDemos.kt b/compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/focus/FocusDemos.kt
index ab50628..e7fc41d 100644
--- a/compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/focus/FocusDemos.kt
+++ b/compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/focus/FocusDemos.kt
@@ -32,7 +32,8 @@
             Use the tab key to move focus among buttons.
             Notice how all the items in column 1 are visited before focus moves to the
             second column. This is because each column is in its own focus group.
-            """.trimIndent()
+            """
+                .trimIndent()
         )
         FocusGroupSample()
         Text(
@@ -40,7 +41,8 @@
             The LazyRow on the bottom is an example of a focuable focus group. Notice
             how the parent gains focus first and you have to use DPad center or the Tab
             key to visit the children inside the LazyRow
-            """.trimIndent()
+            """
+                .trimIndent()
         )
         FocusableFocusGroupSample()
     }
diff --git a/compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/pager/PagerCarrouselDemos.kt b/compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/pager/PagerCarrouselDemos.kt
index c17b0b2..5161f52 100644
--- a/compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/pager/PagerCarrouselDemos.kt
+++ b/compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/pager/PagerCarrouselDemos.kt
@@ -45,21 +45,23 @@
 import androidx.compose.ui.unit.dp
 import androidx.compose.ui.unit.sp
 
-val Carrousel = listOf(
-    ComposableDemo("Horizontal") { HorizontalCarrouselDemo() },
-    ComposableDemo("Vertical") { VerticalCarrouselDemo() },
-    ComposableDemo("3 pages per viewport") { HorizontalCustomPageSizeDemo() },
-    ComposableDemo("Max Scroll = 3 pages") {
-        HorizontalCustomPageSizeWithCustomMaxScrollDemo()
-    }
-)
+val Carrousel =
+    listOf(
+        ComposableDemo("Horizontal") { HorizontalCarrouselDemo() },
+        ComposableDemo("Vertical") { VerticalCarrouselDemo() },
+        ComposableDemo("3 pages per viewport") { HorizontalCustomPageSizeDemo() },
+        ComposableDemo("Max Scroll = 3 pages") { HorizontalCustomPageSizeWithCustomMaxScrollDemo() }
+    )
 
-val SnapPositionDemos = listOf(
-    ComposableDemo("Snap Position - Start") { HorizontalCarrouselDemo(SnapPosition.Start) },
-    ComposableDemo("Snap Position - Center") { HorizontalCarrouselDemo(SnapPosition.Center) },
-    ComposableDemo("Snap Position - End") { HorizontalCarrouselDemo(SnapPosition.End) },
-    ComposableDemo("Snap Position - Custom") { HorizontalCarrouselDemoWithCustomSnapPosition() },
-)
+val SnapPositionDemos =
+    listOf(
+        ComposableDemo("Snap Position - Start") { HorizontalCarrouselDemo(SnapPosition.Start) },
+        ComposableDemo("Snap Position - Center") { HorizontalCarrouselDemo(SnapPosition.Center) },
+        ComposableDemo("Snap Position - End") { HorizontalCarrouselDemo(SnapPosition.End) },
+        ComposableDemo("Snap Position - Custom") {
+            HorizontalCarrouselDemoWithCustomSnapPosition()
+        },
+    )
 
 @Composable
 private fun HorizontalCarrouselDemoWithCustomSnapPosition() {
@@ -169,10 +171,11 @@
             state = pagerState,
             pageSize = ThreePagesPerViewport,
             pageSpacing = 8.dp,
-            flingBehavior = PagerDefaults.flingBehavior(
-                state = pagerState,
-                pagerSnapDistance = PagerSnapDistance.atMost(3)
-            )
+            flingBehavior =
+                PagerDefaults.flingBehavior(
+                    state = pagerState,
+                    pagerSnapDistance = PagerSnapDistance.atMost(3)
+                )
         ) {
             CarrouselItem(index = it, fillOrientation = Orientation.Vertical)
         }
@@ -182,28 +185,21 @@
 
 @Composable
 private fun CarrouselItem(index: Int, fillOrientation: Orientation) {
-    val fillAxisModifier = if (fillOrientation == Orientation.Vertical) Modifier
-        .focusable()
-        .fillMaxWidth()
-        .height(256.dp) else Modifier
-        .fillMaxHeight()
-        .width(256.dp)
+    val fillAxisModifier =
+        if (fillOrientation == Orientation.Vertical)
+            Modifier.focusable().fillMaxWidth().height(256.dp)
+        else Modifier.fillMaxHeight().width(256.dp)
     Box(
-        modifier = Modifier
-            .then(fillAxisModifier)
-            .padding(10.dp)
-            .background(Color.Magenta),
+        modifier = Modifier.then(fillAxisModifier).padding(10.dp).background(Color.Magenta),
         contentAlignment = Alignment.Center
     ) {
         Text(text = index.toString(), fontSize = 32.sp)
     }
 }
 
-private val ThreePagesPerViewport = object : PageSize {
-    override fun Density.calculateMainAxisPageSize(
-        availableSpace: Int,
-        pageSpacing: Int
-    ): Int {
-        return (availableSpace - 2 * pageSpacing) / 3
+private val ThreePagesPerViewport =
+    object : PageSize {
+        override fun Density.calculateMainAxisPageSize(availableSpace: Int, pageSpacing: Int): Int {
+            return (availableSpace - 2 * pageSpacing) / 3
+        }
     }
-}
diff --git a/compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/pager/PagerDemos.kt b/compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/pager/PagerDemos.kt
index 5ba5ced..add6cb5 100644
--- a/compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/pager/PagerDemos.kt
+++ b/compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/pager/PagerDemos.kt
@@ -58,17 +58,19 @@
 import androidx.compose.ui.unit.sp
 import kotlinx.coroutines.launch
 
-val SimplePager = listOf(
-    ComposableDemo("Horizontal") { HorizontalPagerDemo() },
-    ComposableDemo("Vertical") { VerticalPagerDemo() },
-)
+val SimplePager =
+    listOf(
+        ComposableDemo("Horizontal") { HorizontalPagerDemo() },
+        ComposableDemo("Vertical") { VerticalPagerDemo() },
+    )
 
-val PagerDemos = listOf(
-    DemoCategory("Simple", SimplePager),
-    DemoCategory("Carrousel", Carrousel),
-    DemoCategory("State Interactions", PagerStateInteractions),
-    DemoCategory("Snap Position", SnapPositionDemos),
-)
+val PagerDemos =
+    listOf(
+        DemoCategory("Simple", SimplePager),
+        DemoCategory("Carrousel", Carrousel),
+        DemoCategory("State Interactions", PagerStateInteractions),
+        DemoCategory("Snap Position", SnapPositionDemos),
+    )
 
 @Composable
 private fun VerticalPagerDemo() {
@@ -96,12 +98,12 @@
 @Composable
 internal fun PagerItem(index: Int) {
     Box(
-        modifier = Modifier
-            .focusable()
-            .padding(10.dp)
-            .background(Color.Blue)
-            .fillMaxWidth()
-            .aspectRatio(1f),
+        modifier =
+            Modifier.focusable()
+                .padding(10.dp)
+                .background(Color.Blue)
+                .fillMaxWidth()
+                .aspectRatio(1f),
         contentAlignment = Alignment.Center
     ) {
         Text(text = index.toString(), fontSize = 32.sp)
@@ -115,25 +117,23 @@
         Button(onClick = { animationScope.launch { pagerState.animateScrollToPage(0) } }) {
             Text(text = "Start")
         }
-        Button(onClick = {
-            animationScope.launch {
-                pagerState.animateScrollToPage(pagerState.currentPage - 1)
+        Button(
+            onClick = {
+                animationScope.launch { pagerState.animateScrollToPage(pagerState.currentPage - 1) }
             }
-        }) {
+        ) {
             Text(text = "Previous")
         }
-        Button(onClick = {
-            animationScope.launch {
-                pagerState.animateScrollToPage(pagerState.currentPage + 1)
+        Button(
+            onClick = {
+                animationScope.launch { pagerState.animateScrollToPage(pagerState.currentPage + 1) }
             }
-        }) {
+        ) {
             Text(text = "Next")
         }
-        Button(onClick = {
-            animationScope.launch {
-                pagerState.animateScrollToPage(PagesCount - 1)
-            }
-        }) {
+        Button(
+            onClick = { animationScope.launch { pagerState.animateScrollToPage(PagesCount - 1) } }
+        ) {
             Text(text = "End")
         }
     }
diff --git a/compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/pager/PagerStateInteractionsDemos.kt b/compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/pager/PagerStateInteractionsDemos.kt
index 4fe87a5..e63c287 100644
--- a/compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/pager/PagerStateInteractionsDemos.kt
+++ b/compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/pager/PagerStateInteractionsDemos.kt
@@ -31,28 +31,24 @@
 import androidx.compose.ui.Modifier
 import androidx.compose.ui.unit.dp
 
-val PagerStateInteractions = listOf(
-    ComposableDemo("Moving Pages Programmatically") { StateDrivenPage() },
-    ComposableDemo("Observing Page Changes - Full Size Page") { StateMonitoringPager() },
-    ComposableDemo("Observing Page Changes - Custom Page Size") {
-        StateMonitoringCustomPageSize()
-    },
-    ComposableDemo("Moving Pages Programmatically and Observing Changes") {
-        StateDrivenPageWithMonitor()
-    }
-)
+val PagerStateInteractions =
+    listOf(
+        ComposableDemo("Moving Pages Programmatically") { StateDrivenPage() },
+        ComposableDemo("Observing Page Changes - Full Size Page") { StateMonitoringPager() },
+        ComposableDemo("Observing Page Changes - Custom Page Size") {
+            StateMonitoringCustomPageSize()
+        },
+        ComposableDemo("Moving Pages Programmatically and Observing Changes") {
+            StateDrivenPageWithMonitor()
+        }
+    )
 
 @Composable
 private fun StateDrivenPage() {
     val pagerState = rememberPagerState { PagesCount }
 
     Column(modifier = Modifier.fillMaxSize()) {
-        HorizontalPager(
-            modifier = Modifier.weight(0.9f),
-            state = pagerState
-        ) {
-            PagerItem(it)
-        }
+        HorizontalPager(modifier = Modifier.weight(0.9f), state = pagerState) { PagerItem(it) }
         PagerControls(Modifier.weight(0.1f), pagerState)
     }
 }
@@ -62,12 +58,7 @@
     val pagerState = rememberPagerState { PagesCount }
 
     Column(modifier = Modifier.fillMaxSize()) {
-        HorizontalPager(
-            modifier = Modifier.weight(0.8f),
-            state = pagerState
-        ) {
-            PagerItem(it)
-        }
+        HorizontalPager(modifier = Modifier.weight(0.8f), state = pagerState) { PagerItem(it) }
         PagerControls(Modifier.weight(0.1f), pagerState)
         PageMonitor(Modifier.weight(0.1f), pagerState = pagerState)
     }
@@ -77,12 +68,7 @@
 private fun StateMonitoringPager() {
     val pagerState = rememberPagerState { PagesCount }
     Column(modifier = Modifier.fillMaxSize()) {
-        HorizontalPager(
-            modifier = Modifier.weight(0.8f),
-            state = pagerState
-        ) {
-            PagerItem(it)
-        }
+        HorizontalPager(modifier = Modifier.weight(0.8f), state = pagerState) { PagerItem(it) }
         PageMonitor(Modifier.weight(0.2f), pagerState)
     }
 }
@@ -103,9 +89,7 @@
 private fun StateMonitoringCustomPageSize() {
     val pagerState = rememberPagerState { PagesCount }
 
-    val fling = PagerDefaults.flingBehavior(
-        state = pagerState, PagerSnapDistance.atMost(3)
-    )
+    val fling = PagerDefaults.flingBehavior(state = pagerState, PagerSnapDistance.atMost(3))
 
     Column(modifier = Modifier.fillMaxSize()) {
         HorizontalPager(
diff --git a/compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/performance/DrawingDemo.kt b/compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/performance/DrawingDemo.kt
index e310b12..dfc7db2 100644
--- a/compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/performance/DrawingDemo.kt
+++ b/compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/performance/DrawingDemo.kt
@@ -31,30 +31,28 @@
 import androidx.compose.ui.tooling.preview.Preview
 
 /**
- * This demo draws a straight line from where the screen was first touched to where the
- * pointer is now. It basically tracks drag operations, drawing a line between the start
- * and end positions of that drag. The intention of this app is to allow easy testing of
- * what Compose is doing during drag operations (allocations, etc).
+ * This demo draws a straight line from where the screen was first touched to where the pointer is
+ * now. It basically tracks drag operations, drawing a line between the start and end positions of
+ * that drag. The intention of this app is to allow easy testing of what Compose is doing during
+ * drag operations (allocations, etc).
  */
 @Preview
 @Composable
 fun DrawingDemo() {
     val start = remember { mutableStateOf(Offset(0f, 0f)) }
     val end = remember { mutableStateOf(Offset(0f, 0f)) }
-    Canvas(modifier = Modifier
-        .fillMaxWidth()
-        .fillMaxHeight()
-        .background(Color.White)
-        .pointerInput(Unit) {
-            detectDragGestures(
-                onDragStart = {
-                    start.value = it
-                    end.value = it
+    Canvas(
+        modifier =
+            Modifier.fillMaxWidth().fillMaxHeight().background(Color.White).pointerInput(Unit) {
+                detectDragGestures(
+                    onDragStart = {
+                        start.value = it
+                        end.value = it
+                    }
+                ) { _, dragAmount ->
+                    end.value += dragAmount
                 }
-            ) { _, dragAmount ->
-                end.value += dragAmount
             }
-        }
     ) {
         drawLine(Color.Blue, start = start.value, end = end.value)
     }
diff --git a/compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/performance/PerformanceDemos.kt b/compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/performance/PerformanceDemos.kt
index 9da7417..bfcbb39 100644
--- a/compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/performance/PerformanceDemos.kt
+++ b/compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/performance/PerformanceDemos.kt
@@ -23,10 +23,11 @@
  * These demos are for triggering specific elements of Compose, to enable testing the performance
  * (runtime duration, allocations, etc) of those elements.
  */
-val PerformanceDemos = DemoCategory(
-    "Performance",
-    listOf(
-        ComposableDemo("Recomposition") { RecompositionDemo() },
-        ComposableDemo("Drawing") { DrawingDemo() },
+val PerformanceDemos =
+    DemoCategory(
+        "Performance",
+        listOf(
+            ComposableDemo("Recomposition") { RecompositionDemo() },
+            ComposableDemo("Drawing") { DrawingDemo() },
+        )
     )
-)
diff --git a/compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/performance/RecompositionDemo.kt b/compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/performance/RecompositionDemo.kt
index 9edab5b..78b2ae4 100644
--- a/compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/performance/RecompositionDemo.kt
+++ b/compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/performance/RecompositionDemo.kt
@@ -41,14 +41,14 @@
 import kotlinx.coroutines.launch
 
 /**
- * This demo enables easy, targeted testing of simple recomposition situations.
- * Each composable element below tests a specific hierarchy of objects. Tapping on the element
- * triggers a recomposition of that element, which can be tested to see what Compose is doing
- * to make that happen (allocations, etc).
+ * This demo enables easy, targeted testing of simple recomposition situations. Each composable
+ * element below tests a specific hierarchy of objects. Tapping on the element triggers a
+ * recomposition of that element, which can be tested to see what Compose is doing to make that
+ * happen (allocations, etc).
  *
- * All of the demos use the same mechanism of a coroutine with an initial and per-frame delay
- * to force the recomposition to happen at times and frequencies that can be examined in tools.
- * The reason for the initial delay is to move the recomposition pieces away from any tough/ripple
+ * All of the demos use the same mechanism of a coroutine with an initial and per-frame delay to
+ * force the recomposition to happen at times and frequencies that can be examined in tools. The
+ * reason for the initial delay is to move the recomposition pieces away from any tough/ripple
  * behavior of a composable, to make the resulting results clearer.
  */
 @Preview
@@ -79,56 +79,54 @@
 // How long to delay (after tap) before first recomposition
 val InitialDelay = 1000L
 
-/**
- * This hierarchy consists of just a single, empty Box composable.
- */
+/** This hierarchy consists of just a single, empty Box composable. */
 @Composable
 fun BoxElement() {
     var iteration by remember { mutableIntStateOf(0) }
     val scope = rememberCoroutineScope()
-    Box(modifier = Modifier
-        .fillMaxWidth()
-        .height(50.dp)
-        .background(Color.Blue)
-        .clickable {
-            scope.launch {
-                // Note the initial delay to delineate the recomposition from other UI behavior
-                // such as touch input and ripple
-                delay(InitialDelay)
-                while (iteration < Iterations) {
-                    delay(PerFrameDelay)
-                    iteration++
+    Box(
+        modifier =
+            Modifier.fillMaxWidth().height(50.dp).background(Color.Blue).clickable {
+                scope.launch {
+                    // Note the initial delay to delineate the recomposition from other UI behavior
+                    // such as touch input and ripple
+                    delay(InitialDelay)
+                    while (iteration < Iterations) {
+                        delay(PerFrameDelay)
+                        iteration++
+                    }
                 }
+                iteration = 0
             }
-            iteration = 0
-        })
+    )
 }
 
 /**
- * This hierarchy consists of just a single, empty Box composable. The default click
- * indication is disabled to ensure that there will be no ripple. This is useful for testing
- * the result of touch input when the element is tapped (separate from the ripple animation
- * behavior).
+ * This hierarchy consists of just a single, empty Box composable. The default click indication is
+ * disabled to ensure that there will be no ripple. This is useful for testing the result of touch
+ * input when the element is tapped (separate from the ripple animation behavior).
  */
 @Composable
 fun NoRippleBoxElement() {
     var iteration by remember { mutableIntStateOf(0) }
     val scope = rememberCoroutineScope()
     val interactionSource = remember { MutableInteractionSource() }
-    Box(modifier = Modifier
-        .fillMaxWidth()
-        .height(50.dp)
-        .background(Color.Blue)
-        .clickable(interactionSource = interactionSource, indication = null) {
-            scope.launch {
-                delay(InitialDelay)
-                while (iteration < Iterations) {
-                    delay(PerFrameDelay)
-                    iteration++
+    Box(
+        modifier =
+            Modifier.fillMaxWidth().height(50.dp).background(Color.Blue).clickable(
+                interactionSource = interactionSource,
+                indication = null
+            ) {
+                scope.launch {
+                    delay(InitialDelay)
+                    while (iteration < Iterations) {
+                        delay(PerFrameDelay)
+                        iteration++
+                    }
                 }
+                iteration = 0
             }
-            iteration = 0
-        })
+    )
 }
 
 /**
@@ -139,10 +137,8 @@
 fun ButtonElement() {
     var iteration by remember { mutableIntStateOf(0) }
     val scope = rememberCoroutineScope()
-    Button(modifier = Modifier
-        .fillMaxWidth()
-        .height(50.dp)
-        .background(Color.Blue),
+    Button(
+        modifier = Modifier.fillMaxWidth().height(50.dp).background(Color.Blue),
         onClick = {
             scope.launch {
                 delay(InitialDelay)
@@ -152,7 +148,8 @@
                 }
                 iteration = 0
             }
-        }) {
+        }
+    ) {
         Text(text = "Button")
     }
 }
diff --git a/compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/relocation/BringIntoViewAndroidInteropDemo.kt b/compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/relocation/BringIntoViewAndroidInteropDemo.kt
index 31a1594..ed0273e 100644
--- a/compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/relocation/BringIntoViewAndroidInteropDemo.kt
+++ b/compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/relocation/BringIntoViewAndroidInteropDemo.kt
@@ -56,8 +56,7 @@
         val scope = rememberCoroutineScope()
 
         Box(
-            Modifier
-                .border(2.dp, Color.Blue)
+            Modifier.border(2.dp, Color.Blue)
                 .size(200.dp, 200.dp)
                 .verticalScroll(rememberScrollState())
         ) {
@@ -66,14 +65,12 @@
                     Box(Modifier.size(500.dp)) {
                         Text(
                             "Top-start",
-                            Modifier
-                                .align(Alignment.TopStart)
+                            Modifier.align(Alignment.TopStart)
                                 .bringIntoViewRequester(topStartRequester)
                         )
                         Text(
                             "Bottom-end",
-                            Modifier
-                                .align(Alignment.BottomEnd)
+                            Modifier.align(Alignment.BottomEnd)
                                 .bringIntoViewRequester(bottomEndRequester)
                         )
                     }
@@ -81,18 +78,10 @@
             }
         }
 
-        Button(onClick = {
-            scope.launch {
-                topStartRequester.bringIntoView()
-            }
-        }) {
+        Button(onClick = { scope.launch { topStartRequester.bringIntoView() } }) {
             Text("Bring top-start into view")
         }
-        Button(onClick = {
-            scope.launch {
-                bottomEndRequester.bringIntoView()
-            }
-        }) {
+        Button(onClick = { scope.launch { bottomEndRequester.bringIntoView() } }) {
             Text("Bring bottom-end into view")
         }
     }
diff --git a/compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/relocation/BringIntoViewResponderDemo.kt b/compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/relocation/BringIntoViewResponderDemo.kt
index 37adf80..3c0fb35 100644
--- a/compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/relocation/BringIntoViewResponderDemo.kt
+++ b/compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/relocation/BringIntoViewResponderDemo.kt
@@ -55,40 +55,43 @@
         )
         var offset: IntOffset by remember { mutableStateOf(IntOffset.Zero) }
         Box(
-            modifier = Modifier
-                .size(100.dp)
-                .layout { measurable, constraints ->
-                    // Allow the content to be as big as it wants.
-                    val placeable = measurable.measure(
-                        constraints.copy(
-                            maxWidth = Constraints.Infinity,
-                            maxHeight = Constraints.Infinity
-                        )
-                    )
+            modifier =
+                Modifier.size(100.dp)
+                    .layout { measurable, constraints ->
+                        // Allow the content to be as big as it wants.
+                        val placeable =
+                            measurable.measure(
+                                constraints.copy(
+                                    maxWidth = Constraints.Infinity,
+                                    maxHeight = Constraints.Infinity
+                                )
+                            )
 
-                    layout(constraints.maxWidth, constraints.maxHeight) {
-                        // Place the last-requested rectangle at the top-left of the box.
-                        placeable.place(offset)
-                    }
-                }
-                .bringIntoViewResponder(remember {
-                    object : BringIntoViewResponder {
-                        override fun calculateRectForParent(localRect: Rect): Rect {
-                            // Ask our parent to bring our top-left corner into view, since that's
-                            // where we're always going to position the requested content.
-                            return Rect(Offset.Zero, localRect.size)
+                        layout(constraints.maxWidth, constraints.maxHeight) {
+                            // Place the last-requested rectangle at the top-left of the box.
+                            placeable.place(offset)
                         }
+                    }
+                    .bringIntoViewResponder(
+                        remember {
+                            object : BringIntoViewResponder {
+                                override fun calculateRectForParent(localRect: Rect): Rect {
+                                    // Ask our parent to bring our top-left corner into view, since
+                                    // that's
+                                    // where we're always going to position the requested content.
+                                    return Rect(Offset.Zero, localRect.size)
+                                }
 
-                        @ExperimentalFoundationApi
-                        override suspend fun bringChildIntoView(localRect: () -> Rect?) {
-                            // Offset the content right and down by the offset of the requested area
-                            // so that it will always be aligned to the top-left of the box.
-                            localRect()?.also {
-                                offset = -it.topLeft.round()
+                                @ExperimentalFoundationApi
+                                override suspend fun bringChildIntoView(localRect: () -> Rect?) {
+                                    // Offset the content right and down by the offset of the
+                                    // requested area
+                                    // so that it will always be aligned to the top-left of the box.
+                                    localRect()?.also { offset = -it.topLeft.round() }
+                                }
                             }
                         }
-                    }
-                })
+                    )
         ) {
             LargeContentWithFocusableChildren()
         }
@@ -105,11 +108,8 @@
                     val isFocused by interactionSource.collectIsFocusedAsState()
                     Text(
                         "$row x $column",
-                        Modifier
-                            .focusable(interactionSource = interactionSource)
-                            .then(
-                                if (isFocused) Modifier.border(1.dp, Color.Blue) else Modifier
-                            )
+                        Modifier.focusable(interactionSource = interactionSource)
+                            .then(if (isFocused) Modifier.border(1.dp, Color.Blue) else Modifier)
                             .padding(8.dp)
                     )
                 }
diff --git a/compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/relocation/BringNestedIntoViewDemo.kt b/compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/relocation/BringNestedIntoViewDemo.kt
index a941f51..b2f1a46 100644
--- a/compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/relocation/BringNestedIntoViewDemo.kt
+++ b/compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/relocation/BringNestedIntoViewDemo.kt
@@ -70,10 +70,7 @@
 @Composable
 private fun ScrollableGrid(rows: Int, columns: Int, requesters: List<BringIntoViewRequester>) {
     Column(
-        Modifier
-            .border(3.dp, Color.Blue)
-            .size(200.dp, 250.dp)
-            .verticalScroll(rememberScrollState())
+        Modifier.border(3.dp, Color.Blue).size(200.dp, 250.dp).verticalScroll(rememberScrollState())
     ) {
         repeat(rows) { row ->
             Row(
@@ -92,9 +89,7 @@
                     val index = row * columns + column
                     TextCircle(
                         index.toString(),
-                        Modifier
-                            .size(75.dp)
-                            .bringIntoViewRequester(requesters[index])
+                        Modifier.size(75.dp).bringIntoViewRequester(requesters[index])
                     )
                 }
             }
@@ -111,18 +106,9 @@
             Row {
                 repeat(columns) { column ->
                     val requester = requesters[row * columns + column]
-                    IconButton(
-                        onClick = {
-                            coroutineScope.launch {
-                                requester.bringIntoView()
-                            }
-                        }
-                    ) {
+                    IconButton(onClick = { coroutineScope.launch { requester.bringIntoView() } }) {
                         val index = row * columns + column
-                        TextCircle(
-                            index.toString(),
-                            Modifier.size(50.dp)
-                        )
+                        TextCircle(index.toString(), Modifier.size(50.dp))
                     }
                 }
             }
@@ -132,15 +118,7 @@
 
 @Composable
 private fun TextCircle(text: String, modifier: Modifier = Modifier) {
-    Box(
-        modifier
-            .aspectRatio(1f)
-            .background(Color.Red, shape = CircleShape)
-    ) {
-        Text(
-            text = text,
-            color = Color.White,
-            modifier = Modifier.align(Alignment.Center)
-        )
+    Box(modifier.aspectRatio(1f).background(Color.Red, shape = CircleShape)) {
+        Text(text = text, color = Color.White, modifier = Modifier.align(Alignment.Center))
     }
 }
diff --git a/compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/relocation/RequestRectangleOnScreenDemo.kt b/compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/relocation/RequestRectangleOnScreenDemo.kt
index 38f93d2..e934c1b 100644
--- a/compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/relocation/RequestRectangleOnScreenDemo.kt
+++ b/compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/relocation/RequestRectangleOnScreenDemo.kt
@@ -47,8 +47,7 @@
         }
         Spacer(Modifier.weight(weight = 1f, fill = true))
         Box(
-            Modifier
-                .size(50.dp)
+            Modifier.size(50.dp)
                 .background(Color.Blue)
                 .bringIntoViewRequester(bringIntoViewRequester)
         )
diff --git a/compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/snapping/LazyGridSnappingDemos.kt b/compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/snapping/LazyGridSnappingDemos.kt
index 3f84793..e5cf826 100644
--- a/compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/snapping/LazyGridSnappingDemos.kt
+++ b/compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/snapping/LazyGridSnappingDemos.kt
@@ -41,9 +41,10 @@
 import androidx.compose.ui.unit.dp
 import androidx.compose.ui.unit.sp
 
-val LazyGridSnappingDemos = listOf(
-    ComposableDemo("Single Item - Same Size Items") { GridSingleItemSnapping() },
-)
+val LazyGridSnappingDemos =
+    listOf(
+        ComposableDemo("Single Item - Same Size Items") { GridSingleItemSnapping() },
+    )
 
 /**
  * Snapping happens to the next item and items have the same size. We use the top line in the grid
@@ -61,23 +62,20 @@
 @Composable
 private fun GridSnappingDemoMainLayout(flingBehavior: FlingBehavior, lazyGridState: LazyGridState) {
     Box(
-        modifier = Modifier
-            .fillMaxSize()
-            .drawWithContent {
+        modifier =
+            Modifier.fillMaxSize().drawWithContent {
                 drawContent()
                 drawAnchor(CenterAnchor)
-            }, contentAlignment = Alignment.Center
+            },
+        contentAlignment = Alignment.Center
     ) {
         LazyHorizontalGrid(
-            modifier = Modifier
-                .fillMaxHeight(0.7f),
+            modifier = Modifier.fillMaxHeight(0.7f),
             rows = GridCells.Fixed(3),
             state = lazyGridState,
             flingBehavior = flingBehavior
         ) {
-            items(100) {
-                GridSinglePageSnappingItem(it)
-            }
+            items(100) { GridSinglePageSnappingItem(it) }
         }
     }
 }
@@ -85,11 +83,8 @@
 @Composable
 private fun GridSinglePageSnappingItem(position: Int) {
     Box(
-        modifier = Modifier
-            .size(100.dp)
-            .padding(4.dp)
-            .background(Color.Gray)
-            .drawWithContent {
+        modifier =
+            Modifier.size(100.dp).padding(4.dp).background(Color.Gray).drawWithContent {
                 drawContent()
                 drawAnchor(CenterAnchor)
             },
diff --git a/compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/snapping/LazyListSnappingDemos.kt b/compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/snapping/LazyListSnappingDemos.kt
index 5809903..5205481 100644
--- a/compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/snapping/LazyListSnappingDemos.kt
+++ b/compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/snapping/LazyListSnappingDemos.kt
@@ -41,41 +41,36 @@
 import androidx.compose.ui.unit.sp
 import androidx.compose.ui.util.fastSumBy
 
-val SnapPositionDemos = listOf(
-    ComposableDemo("Center") { SnapPosition(SnapPosition.Center) },
-    ComposableDemo("Start") { SnapPosition(SnapPosition.Start) },
-    ComposableDemo("End") { SnapPosition(SnapPosition.End) },
-)
+val SnapPositionDemos =
+    listOf(
+        ComposableDemo("Center") { SnapPosition(SnapPosition.Center) },
+        ComposableDemo("Start") { SnapPosition(SnapPosition.Start) },
+        ComposableDemo("End") { SnapPosition(SnapPosition.End) },
+    )
 
-val LazyListSnappingDemos = listOf(
-    ComposableDemo("Single Item - Same Size Items") { SameItemSizeDemo() },
-    ComposableDemo("Single Item - Different Size Item") { DifferentItemSizeDemo() },
-    ComposableDemo("Single Item - Large Items") { LargeItemSizeDemo() },
-    ComposableDemo("Single Item - List with Content padding") { DifferentContentPaddingDemo() },
-    ComposableDemo("Multi Item - Decayed Snapping") { DecayedSnappingDemo() },
-    ComposableDemo("Multi Item - View Port Based Offset") { ViewPortBasedSnappingDemo() },
-    DemoCategory("Snap Position", SnapPositionDemos)
-)
+val LazyListSnappingDemos =
+    listOf(
+        ComposableDemo("Single Item - Same Size Items") { SameItemSizeDemo() },
+        ComposableDemo("Single Item - Different Size Item") { DifferentItemSizeDemo() },
+        ComposableDemo("Single Item - Large Items") { LargeItemSizeDemo() },
+        ComposableDemo("Single Item - List with Content padding") { DifferentContentPaddingDemo() },
+        ComposableDemo("Multi Item - Decayed Snapping") { DecayedSnappingDemo() },
+        ComposableDemo("Multi Item - View Port Based Offset") { ViewPortBasedSnappingDemo() },
+        DemoCategory("Snap Position", SnapPositionDemos)
+    )
 
-/**
- * Snapping happens to the next item and items have the same size
- */
+/** Snapping happens to the next item and items have the same size */
 @Composable
 private fun SnapPosition(snapPosition: SnapPosition) {
     val lazyListState = rememberLazyListState()
     val layoutInfoProvider = rememberNextItemSnappingLayoutInfoProvider(lazyListState, snapPosition)
     val flingBehavior = rememberSnapFlingBehavior(layoutInfoProvider)
 
-    SnappingDemoMainLayout(
-        lazyListState = lazyListState,
-        flingBehavior = flingBehavior
-    ) { position ->
+    SnappingDemoMainLayout(lazyListState = lazyListState, flingBehavior = flingBehavior) { position
+        ->
         Box(
-            modifier = Modifier
-                .size(150.dp)
-                .padding(8.dp)
-                .background(Color.White)
-                .drawWithContent {
+            modifier =
+                Modifier.size(150.dp).padding(8.dp).background(Color.White).drawWithContent {
                     drawContent()
                     drawAnchor(CenterAnchor)
                 },
@@ -86,26 +81,19 @@
     }
 }
 
-/**
- * Snapping happens to the next item and items have the same size
- */
+/** Snapping happens to the next item and items have the same size */
 @Composable
 private fun SameItemSizeDemo() {
     val lazyListState = rememberLazyListState()
     val layoutInfoProvider = rememberNextItemSnappingLayoutInfoProvider(lazyListState)
     val flingBehavior = rememberSnapFlingBehavior(layoutInfoProvider)
 
-    SnappingDemoMainLayout(
-        lazyListState = lazyListState,
-        flingBehavior = flingBehavior
-    ) {
+    SnappingDemoMainLayout(lazyListState = lazyListState, flingBehavior = flingBehavior) {
         DefaultSnapDemoItem(it)
     }
 }
 
-/**
- * Snapping happens to the next item and items have the different sizes
- */
+/** Snapping happens to the next item and items have the different sizes */
 @Composable
 private fun DifferentItemSizeDemo() {
     val lazyListState = rememberLazyListState()
@@ -113,17 +101,11 @@
     val flingBehavior = rememberSnapFlingBehavior(layoutInfoProvider)
 
     SnappingDemoMainLayout(lazyListState = lazyListState, flingBehavior = flingBehavior) {
-        ResizableSnapDemoItem(
-            width = PagesSizes[it],
-            height = 500.dp,
-            position = it
-        )
+        ResizableSnapDemoItem(width = PagesSizes[it], height = 500.dp, position = it)
     }
 }
 
-/**
- * Snapping happens to the next item and items are larger than the view port
- */
+/** Snapping happens to the next item and items are larger than the view port */
 @Composable
 private fun LargeItemSizeDemo() {
     val lazyListState = rememberLazyListState()
@@ -131,22 +113,15 @@
     val flingBehavior = rememberSnapFlingBehavior(layoutInfoProvider)
 
     SnappingDemoMainLayout(lazyListState = lazyListState, flingBehavior = flingBehavior) {
-        ResizableSnapDemoItem(
-            width = 350.dp,
-            height = 500.dp,
-            position = it
-        )
+        ResizableSnapDemoItem(width = 350.dp, height = 500.dp, position = it)
     }
 }
 
-/**
- * Snapping happens to the next item and list has content paddings
- */
+/** Snapping happens to the next item and list has content paddings */
 @Composable
 private fun DifferentContentPaddingDemo() {
     val lazyListState = rememberLazyListState()
-    val layoutInfoProvider =
-        remember(lazyListState) { SnapLayoutInfoProvider(lazyListState) }
+    val layoutInfoProvider = remember(lazyListState) { SnapLayoutInfoProvider(lazyListState) }
     val flingBehavior = rememberSnapFlingBehavior(layoutInfoProvider)
 
     SnappingDemoMainLayout(
@@ -158,9 +133,7 @@
     }
 }
 
-/**
- * Snapping happens after a decay animation and items have the same size
- */
+/** Snapping happens after a decay animation and items have the same size */
 @Composable
 private fun DecayedSnappingDemo() {
     val lazyListState = rememberLazyListState()
@@ -170,9 +143,7 @@
     }
 }
 
-/**
- * Snapping happens to at max one view port item's worth distance.
- */
+/** Snapping happens to at max one view port item's worth distance. */
 @Composable
 private fun ViewPortBasedSnappingDemo() {
     val lazyListState = rememberLazyListState()
@@ -193,10 +164,7 @@
         val basedSnappingLayoutInfoProvider =
             SnapLayoutInfoProvider(lazyListState = state, snapPosition = snapPosition)
         object : SnapLayoutInfoProvider by basedSnappingLayoutInfoProvider {
-            override fun calculateApproachOffset(
-                velocity: Float,
-                decayOffset: Float
-            ): Float = 0.0f
+            override fun calculateApproachOffset(velocity: Float, decayOffset: Float): Float = 0.0f
         }
     }
 }
@@ -214,7 +182,9 @@
                 val visibleItemsSum = state.layoutInfo.visibleItemsInfo.fastSumBy { it.size }
                 visibleItemsSum / state.layoutInfo.visibleItemsInfo.size.toFloat()
             }
-        ) { state.layoutInfo.viewportSize.width.toFloat() }
+        ) {
+            state.layoutInfo.viewportSize.width.toFloat()
+        }
     }
 }
 
diff --git a/compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/snapping/NonItemBasedSnapping.kt b/compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/snapping/NonItemBasedSnapping.kt
index 15952ec..51aac37 100644
--- a/compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/snapping/NonItemBasedSnapping.kt
+++ b/compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/snapping/NonItemBasedSnapping.kt
@@ -42,9 +42,7 @@
 import androidx.compose.ui.unit.dp
 import kotlin.math.abs
 
-/**
- * A provider that doesn't use the concept of items for snapping.
- */
+/** A provider that doesn't use the concept of items for snapping. */
 @OptIn(ExperimentalFoundationApi::class)
 class NonItemBasedSnappingLayoutInfoProvider(
     private val currentOffset: Int,
@@ -56,31 +54,31 @@
     private val offsetList = listOf(0, layoutSize / 2 - thumbSize / 2, (layoutSize - thumbSize))
 
     // do not approach, our snapping positions are discrete.
-    override fun calculateApproachOffset(velocity: Float, decayOffset: Float): Float =
-        0.0f
+    override fun calculateApproachOffset(velocity: Float, decayOffset: Float): Float = 0.0f
 
     override fun calculateSnapOffset(velocity: Float): Float {
-        val targetOffset = if (velocity == 0.0f) {
-            // snap to closest offset
-            var closestOffset = 0
-            var prevMinAbs = Int.MAX_VALUE
-            offsetList.forEach {
-                val absDistance = abs(currentOffset - it)
-                if (absDistance < prevMinAbs) {
-                    prevMinAbs = absDistance
-                    closestOffset = it
+        val targetOffset =
+            if (velocity == 0.0f) {
+                // snap to closest offset
+                var closestOffset = 0
+                var prevMinAbs = Int.MAX_VALUE
+                offsetList.forEach {
+                    val absDistance = abs(currentOffset - it)
+                    if (absDistance < prevMinAbs) {
+                        prevMinAbs = absDistance
+                        closestOffset = it
+                    }
                 }
+                (closestOffset).toFloat()
+            } else if (velocity > 0) {
+                // snap to the next offset
+                val offset = offsetList.firstOrNull { it > currentOffset }
+                (offset ?: 0).toFloat() // if offset is found, move there, if not, don't move
+            } else {
+                // snap to the previous offset
+                val offset = offsetList.reversed().firstOrNull { it < currentOffset }
+                (offset ?: 0).toFloat() // if offset is found, move there, if not, don't move
             }
-            (closestOffset).toFloat()
-        } else if (velocity > 0) {
-            // snap to the next offset
-            val offset = offsetList.firstOrNull { it > currentOffset }
-            (offset ?: 0).toFloat() // if offset is found, move there, if not, don't move
-        } else {
-            // snap to the previous offset
-            val offset = offsetList.reversed().firstOrNull { it < currentOffset }
-            (offset ?: 0).toFloat() // if offset is found, move there, if not, don't move
-        }
         return targetOffset - currentOffset // distance that needs to be consumed to reach target
     }
 }
@@ -94,13 +92,12 @@
     var layoutSize by remember { mutableIntStateOf(0) }
 
     val thumbSize = with(LocalDensity.current) { ThumbSize.roundToPx() }
-    val maxPosition = with(LocalDensity.current) {
-        layoutSize - ThumbSize.roundToPx()
-    }
+    val maxPosition = with(LocalDensity.current) { layoutSize - ThumbSize.roundToPx() }
 
-    val snapLayoutInfoProvider = remember(thumbOffset, layoutSize, thumbSize) {
-        NonItemBasedSnappingLayoutInfoProvider(thumbOffset.x, layoutSize, thumbSize)
-    }
+    val snapLayoutInfoProvider =
+        remember(thumbOffset, layoutSize, thumbSize) {
+            NonItemBasedSnappingLayoutInfoProvider(thumbOffset.x, layoutSize, thumbSize)
+        }
 
     val fling = rememberSnapFlingBehavior(snapLayoutInfoProvider = snapLayoutInfoProvider)
     val scrollableState = rememberScrollableState {
@@ -110,22 +107,19 @@
         it // need to return correct consumption
     }
     Box(
-        modifier = Modifier
-            .requiredHeight(ThumbSize)
-            .fillMaxWidth()
-            .background(Color.LightGray)
-            .scrollable(
-                scrollableState,
-                orientation = Orientation.Horizontal,
-                flingBehavior = fling
-            )
-            .onSizeChanged {
-                layoutSize = it.width
-            }
+        modifier =
+            Modifier.requiredHeight(ThumbSize)
+                .fillMaxWidth()
+                .background(Color.LightGray)
+                .scrollable(
+                    scrollableState,
+                    orientation = Orientation.Horizontal,
+                    flingBehavior = fling
+                )
+                .onSizeChanged { layoutSize = it.width }
     ) {
-        Box(modifier = Modifier
-            .offset { thumbOffset }
-            .requiredSize(ThumbSize)
-            .background(Color.Red))
+        Box(
+            modifier = Modifier.offset { thumbOffset }.requiredSize(ThumbSize).background(Color.Red)
+        )
     }
 }
diff --git a/compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/snapping/RowSnapLayoutInfoProvider.kt b/compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/snapping/RowSnapLayoutInfoProvider.kt
index b8ff732..6014262 100644
--- a/compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/snapping/RowSnapLayoutInfoProvider.kt
+++ b/compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/snapping/RowSnapLayoutInfoProvider.kt
@@ -31,55 +31,54 @@
     scrollState: ScrollState,
     itemSize: () -> Float,
     layoutSize: () -> Float
-) = object : SnapLayoutInfoProvider {
+) =
+    object : SnapLayoutInfoProvider {
 
-    override fun calculateApproachOffset(velocity: Float, decayOffset: Float): Float {
-        val calculatedItemSize = itemSize.invoke()
-        return (decayOffset.absoluteValue - calculatedItemSize)
-            .coerceAtLeast(0.0f) * calculatedItemSize.sign
+        override fun calculateApproachOffset(velocity: Float, decayOffset: Float): Float {
+            val calculatedItemSize = itemSize.invoke()
+            return (decayOffset.absoluteValue - calculatedItemSize).coerceAtLeast(0.0f) *
+                calculatedItemSize.sign
+        }
+
+        fun nextFullItemCenter(layoutCenter: Float): Float {
+            val intItemSize = itemSize().roundToInt()
+            return floor((layoutCenter + itemSize()) / itemSize().roundToInt()) * intItemSize
+        }
+
+        fun previousFullItemCenter(layoutCenter: Float): Float {
+            val intItemSize = itemSize().roundToInt()
+            return ceil((layoutCenter - itemSize()) / itemSize().roundToInt()) * intItemSize
+        }
+
+        override fun calculateSnapOffset(velocity: Float): Float {
+            val layoutCenter = layoutSize() / 2f + scrollState.value + itemSize() / 2f
+            val lowerBound = nextFullItemCenter(layoutCenter) - layoutCenter
+            val upperBound = previousFullItemCenter(layoutCenter) - layoutCenter
+
+            return calculateFinalOffset(velocity, upperBound, lowerBound)
+        }
     }
 
-    fun nextFullItemCenter(layoutCenter: Float): Float {
-        val intItemSize = itemSize().roundToInt()
-        return floor((layoutCenter + itemSize()) / itemSize().roundToInt()) *
-            intItemSize
-    }
-
-    fun previousFullItemCenter(layoutCenter: Float): Float {
-        val intItemSize = itemSize().roundToInt()
-        return ceil((layoutCenter - itemSize()) / itemSize().roundToInt()) *
-            intItemSize
-    }
-
-    override fun calculateSnapOffset(velocity: Float): Float {
-        val layoutCenter = layoutSize() / 2f + scrollState.value + itemSize() / 2f
-        val lowerBound = nextFullItemCenter(layoutCenter) - layoutCenter
-        val upperBound = previousFullItemCenter(layoutCenter) - layoutCenter
-
-        return calculateFinalOffset(velocity, upperBound, lowerBound)
-    }
-}
-
 internal fun calculateFinalOffset(velocity: Float, lowerBound: Float, upperBound: Float): Float {
 
     fun Float.isValidDistance(): Boolean {
         return this != Float.POSITIVE_INFINITY && this != Float.NEGATIVE_INFINITY
     }
 
-    val finalDistance = when (sign(velocity)) {
-        0f -> {
-            if (abs(upperBound) <= abs(lowerBound)) {
-                upperBound
-            } else {
-                lowerBound
+    val finalDistance =
+        when (sign(velocity)) {
+            0f -> {
+                if (abs(upperBound) <= abs(lowerBound)) {
+                    upperBound
+                } else {
+                    lowerBound
+                }
             }
+            1f -> upperBound
+            -1f -> lowerBound
+            else -> 0f
         }
 
-        1f -> upperBound
-        -1f -> lowerBound
-        else -> 0f
-    }
-
     return if (finalDistance.isValidDistance()) {
         finalDistance
     } else {
diff --git a/compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/snapping/RowSnappingDemos.kt b/compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/snapping/RowSnappingDemos.kt
index 2566f4a..83b1977 100644
--- a/compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/snapping/RowSnappingDemos.kt
+++ b/compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/snapping/RowSnappingDemos.kt
@@ -48,53 +48,49 @@
 import androidx.compose.ui.unit.dp
 import androidx.compose.ui.unit.sp
 
-val RowSnappingDemos = listOf(
-    ComposableDemo("Single Item - Same Size Items") { SinglePageSnapping() },
-    ComposableDemo("Multi Item - Decayed Snapping") { DecayedSnappingDemo() },
-    ComposableDemo("Multi Item - View Port Based Offset") { ViewPortBasedSnappingDemo() },
-)
+val RowSnappingDemos =
+    listOf(
+        ComposableDemo("Single Item - Same Size Items") { SinglePageSnapping() },
+        ComposableDemo("Multi Item - Decayed Snapping") { DecayedSnappingDemo() },
+        ComposableDemo("Multi Item - View Port Based Offset") { ViewPortBasedSnappingDemo() },
+    )
 
-/**
- * Snapping happens to the next item and items have the same size
- */
+/** Snapping happens to the next item and items have the same size */
 @OptIn(ExperimentalFoundationApi::class)
 @Composable
 private fun SinglePageSnapping() {
     val scrollState = rememberScrollState()
     val layoutSizeState = remember { mutableStateOf(IntSize.Zero) }
-    val layoutInfoProvider = rememberNextItemSnappingLayoutInfoProvider(scrollState) {
-        layoutSizeState.value.width.toFloat()
-    }
+    val layoutInfoProvider =
+        rememberNextItemSnappingLayoutInfoProvider(scrollState) {
+            layoutSizeState.value.width.toFloat()
+        }
     val snapFlingBehavior = rememberSnapFlingBehavior(snapLayoutInfoProvider = layoutInfoProvider)
     RowSnappingMainLayout(snapFlingBehavior, scrollState) { layoutSizeState.value = it }
 }
 
-/**
- * Snapping happens after a decay animation. Items have the same size.
- */
+/** Snapping happens after a decay animation. Items have the same size. */
 @OptIn(ExperimentalFoundationApi::class)
 @Composable
 private fun DecayedSnappingDemo() {
     val scrollState = rememberScrollState()
     val layoutSizeState = remember { mutableStateOf(IntSize.Zero) }
-    val layoutInfoProvider = rememberRowSnapLayoutInfoProvider(scrollState) {
-        layoutSizeState.value.width.toFloat()
-    }
+    val layoutInfoProvider =
+        rememberRowSnapLayoutInfoProvider(scrollState) { layoutSizeState.value.width.toFloat() }
     val snapFlingBehavior = rememberSnapFlingBehavior(snapLayoutInfoProvider = layoutInfoProvider)
     RowSnappingMainLayout(snapFlingBehavior, scrollState) { layoutSizeState.value = it }
 }
 
-/**
- * Snapping happens to at max one view port item's worth distance.
- */
+/** Snapping happens to at max one view port item's worth distance. */
 @OptIn(ExperimentalFoundationApi::class)
 @Composable
 private fun ViewPortBasedSnappingDemo() {
     val scrollState = rememberScrollState()
     val layoutSizeState = remember { mutableStateOf(IntSize.Zero) }
-    val layoutInfoProvider = rememberViewPortSnapLayoutInfoProvider(scrollState) {
-        layoutSizeState.value.width.toFloat()
-    }
+    val layoutInfoProvider =
+        rememberViewPortSnapLayoutInfoProvider(scrollState) {
+            layoutSizeState.value.width.toFloat()
+        }
     val snapFlingBehavior = rememberSnapFlingBehavior(snapLayoutInfoProvider = layoutInfoProvider)
     RowSnappingMainLayout(snapFlingBehavior, scrollState) { layoutSizeState.value = it }
 }
@@ -106,23 +102,21 @@
     onLayoutSizeChanged: (IntSize) -> Unit
 ) {
     Box(
-        modifier = Modifier
-            .fillMaxSize()
-            .drawWithContent {
+        modifier =
+            Modifier.fillMaxSize().drawWithContent {
                 drawContent()
                 drawAnchor(CenterAnchor)
-            }, contentAlignment = Alignment.Center
+            },
+        contentAlignment = Alignment.Center
     ) {
         Row(
-            modifier = Modifier
-                .fillMaxWidth()
-                .onSizeChanged(onLayoutSizeChanged)
-                .fillMaxHeight(0.7f)
-                .horizontalScroll(scrollState, flingBehavior = snapFlingBehavior)
+            modifier =
+                Modifier.fillMaxWidth()
+                    .onSizeChanged(onLayoutSizeChanged)
+                    .fillMaxHeight(0.7f)
+                    .horizontalScroll(scrollState, flingBehavior = snapFlingBehavior)
         ) {
-            repeat(100) {
-                RowSnappingItem(position = it)
-            }
+            repeat(100) { RowSnappingItem(position = it) }
         }
     }
 }
@@ -130,15 +124,15 @@
 @Composable
 private fun RowSnappingItem(position: Int) {
     Box(
-        modifier = Modifier
-            .fillMaxHeight()
-            .width(RowItemSize)
-            .padding(4.dp)
-            .background(Color.Gray)
-            .drawWithContent {
-                drawContent()
-                drawAnchor(CenterAnchor)
-            },
+        modifier =
+            Modifier.fillMaxHeight()
+                .width(RowItemSize)
+                .padding(4.dp)
+                .background(Color.Gray)
+                .drawWithContent {
+                    drawContent()
+                    drawAnchor(CenterAnchor)
+                },
         contentAlignment = Alignment.Center
     ) {
         Text(text = position.toString(), fontSize = 40.sp)
@@ -168,17 +162,15 @@
     layoutSize: () -> Float
 ): SnapLayoutInfoProvider {
     val density = LocalDensity.current
-    val basedSnappingLayoutInfoProvider = SnapLayoutInfoProvider(
-        scrollState = scrollState,
-        itemSize = { with(density) { RowItemSize.toPx() } },
-        layoutSize = layoutSize
-    )
+    val basedSnappingLayoutInfoProvider =
+        SnapLayoutInfoProvider(
+            scrollState = scrollState,
+            itemSize = { with(density) { RowItemSize.toPx() } },
+            layoutSize = layoutSize
+        )
     return remember(scrollState, layoutSize) {
         object : SnapLayoutInfoProvider by basedSnappingLayoutInfoProvider {
-            override fun calculateApproachOffset(
-                velocity: Float,
-                decayOffset: Float
-            ): Float = 0.0f
+            override fun calculateApproachOffset(velocity: Float, decayOffset: Float): Float = 0.0f
         }
     }
 }
@@ -191,10 +183,8 @@
 ): SnapLayoutInfoProvider {
     val density = LocalDensity.current
     val decayAnimationSpec: DecayAnimationSpec<Float> = rememberSplineBasedDecay()
-    val baseSnapLayoutInfoProvider = rememberScrollStateLayoutInfoProvider(
-        scrollState = scrollState,
-        layoutSize = layoutSize
-    )
+    val baseSnapLayoutInfoProvider =
+        rememberScrollStateLayoutInfoProvider(scrollState = scrollState, layoutSize = layoutSize)
 
     return remember(baseSnapLayoutInfoProvider, density, layoutSize) {
         ViewPortBasedSnappingLayoutInfoProvider(
diff --git a/compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/snapping/SnappingDemos.kt b/compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/snapping/SnappingDemos.kt
index 8c0be81..ce08161 100644
--- a/compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/snapping/SnappingDemos.kt
+++ b/compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/snapping/SnappingDemos.kt
@@ -44,12 +44,13 @@
 import androidx.compose.ui.unit.dp
 import androidx.compose.ui.unit.sp
 
-val SnappingDemos = listOf(
-    DemoCategory("Lazy List Snapping", LazyListSnappingDemos),
-    DemoCategory("Scrollable Row Snapping", RowSnappingDemos),
-    DemoCategory("Lazy Grid Snapping", LazyGridSnappingDemos),
-    ComposableDemo("Non Item based Snapping") { NonItemBasedLayout() },
-)
+val SnappingDemos =
+    listOf(
+        DemoCategory("Lazy List Snapping", LazyListSnappingDemos),
+        DemoCategory("Scrollable Row Snapping", RowSnappingDemos),
+        DemoCategory("Lazy Grid Snapping", LazyGridSnappingDemos),
+        ComposableDemo("Non Item based Snapping") { NonItemBasedLayout() },
+    )
 
 @Composable
 internal fun SnappingDemoMainLayout(
@@ -59,42 +60,32 @@
     content: @Composable (Int) -> Unit
 ) {
     LazyRow(
-        modifier = Modifier
-            .fillMaxSize()
-            .background(Color.LightGray)
-            .drawWithContent {
+        modifier =
+            Modifier.fillMaxSize().background(Color.LightGray).drawWithContent {
                 drawContent()
-                drawAnchor(
-                    CenterAnchor,
-                    contentPaddingValues,
-                    true,
-                    4.0f,
-                    4.0f
-                )
+                drawAnchor(CenterAnchor, contentPaddingValues, true, 4.0f, 4.0f)
             },
         contentPadding = contentPaddingValues,
         verticalAlignment = Alignment.CenterVertically,
         state = lazyListState,
         flingBehavior = flingBehavior
     ) {
-        items(ItemNumber) {
-            content(it)
-        }
+        items(ItemNumber) { content(it) }
     }
 }
 
 @Composable
 internal fun DefaultSnapDemoItem(position: Int) {
     Box(
-        modifier = Modifier
-            .width(200.dp)
-            .height(500.dp)
-            .padding(8.dp)
-            .background(Color.White)
-            .drawWithContent {
-                drawContent()
-                drawAnchor(CenterAnchor)
-            },
+        modifier =
+            Modifier.width(200.dp)
+                .height(500.dp)
+                .padding(8.dp)
+                .background(Color.White)
+                .drawWithContent {
+                    drawContent()
+                    drawAnchor(CenterAnchor)
+                },
         contentAlignment = Alignment.Center
     ) {
         Text(text = position.toString(), fontSize = 40.sp)
@@ -104,15 +95,15 @@
 @Composable
 internal fun ResizableSnapDemoItem(width: Dp, height: Dp, position: Int) {
     Box(
-        modifier = Modifier
-            .width(width)
-            .height(height)
-            .padding(8.dp)
-            .background(Color.White)
-            .drawWithContent {
-                drawContent()
-                drawAnchor(CenterAnchor)
-            },
+        modifier =
+            Modifier.width(width)
+                .height(height)
+                .padding(8.dp)
+                .background(Color.White)
+                .drawWithContent {
+                    drawContent()
+                    drawAnchor(CenterAnchor)
+                },
         contentAlignment = Alignment.Center
     ) {
         Text(text = position.toString(), fontSize = 40.sp)
diff --git a/compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/snapping/SnappingDemosCommon.kt b/compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/snapping/SnappingDemosCommon.kt
index 2ba91e1..864ed76 100644
--- a/compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/snapping/SnappingDemosCommon.kt
+++ b/compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/snapping/SnappingDemosCommon.kt
@@ -28,8 +28,8 @@
     private val itemSize: () -> Float
 ) : SnapLayoutInfoProvider by baseSnapLayoutInfoProvider {
     override fun calculateApproachOffset(velocity: Float, decayOffset: Float): Float {
-        val finalOffset = (decayOffset.absoluteValue - itemSize())
-            .coerceAtLeast(0.0f) * decayOffset.sign
+        val finalOffset =
+            (decayOffset.absoluteValue - itemSize()).coerceAtLeast(0.0f) * decayOffset.sign
         val viewPortOffset = viewPortStep()
         return finalOffset.coerceIn(-viewPortOffset, viewPortOffset)
     }
diff --git a/compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/text/BasicTextMinMaxLinesDemo.kt b/compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/text/BasicTextMinMaxLinesDemo.kt
index b837381..e9254a6 100644
--- a/compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/text/BasicTextMinMaxLinesDemo.kt
+++ b/compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/text/BasicTextMinMaxLinesDemo.kt
@@ -54,13 +54,12 @@
 
         TagLine("maxLines < line count with different line heights")
         TextWithMinMaxLines(
-            text = buildAnnotatedString {
-                append("Line 1\n")
-                withStyle(SpanStyle(fontSize = fontSize8)) {
-                    append("Line 2\n")
-                }
-                append("Line 3")
-            },
+            text =
+                buildAnnotatedString {
+                    append("Line 1\n")
+                    withStyle(SpanStyle(fontSize = fontSize8)) { append("Line 2\n") }
+                    append("Line 3")
+                },
             maxLines = 2
         )
 
@@ -73,10 +72,7 @@
         TagLine("minLines > line count")
         var sameLineHeightsHasExtraLine by remember { mutableStateOf(false) }
         val extraLine = if (sameLineHeightsHasExtraLine) "\nLine 4" else ""
-        TextWithMinMaxLines(
-            text = "Line 1\nLine 2\nLine 3$extraLine",
-            minLines = 4
-        )
+        TextWithMinMaxLines(text = "Line 1\nLine 2\nLine 3$extraLine", minLines = 4)
         Button(onClick = { sameLineHeightsHasExtraLine = !sameLineHeightsHasExtraLine }) {
             Text(text = "Toggle last line")
         }
@@ -84,14 +80,13 @@
         TagLine("minLines > line count with different line heights")
         var diffLineHeightsHasExtraLine by remember { mutableStateOf(false) }
         TextWithMinMaxLines(
-            text = buildAnnotatedString {
-                append("Line 1\n")
-                withStyle(SpanStyle(fontSize = fontSize6)) {
-                    append("Line 2\n")
-                }
-                append("Line 3")
-                if (diffLineHeightsHasExtraLine) append("\nLine 4")
-            },
+            text =
+                buildAnnotatedString {
+                    append("Line 1\n")
+                    withStyle(SpanStyle(fontSize = fontSize6)) { append("Line 2\n") }
+                    append("Line 3")
+                    if (diffLineHeightsHasExtraLine) append("\nLine 4")
+                },
             minLines = 4
         )
         Button(onClick = { diffLineHeightsHasExtraLine = !diffLineHeightsHasExtraLine }) {
@@ -99,11 +94,7 @@
         }
 
         TagLine("minLines < maxLines")
-        TextWithMinMaxLines(
-            "Line 1\nLine 2\nLine 3\nLine 4",
-            minLines = 2,
-            maxLines = 3
-        )
+        TextWithMinMaxLines("Line 1\nLine 2\nLine 3\nLine 4", minLines = 2, maxLines = 3)
     }
 }
 
@@ -116,9 +107,7 @@
 ) {
     BasicText(
         text = text,
-        modifier = Modifier
-            .border(1.dp, Color.Gray)
-            .padding(2.dp),
+        modifier = Modifier.border(1.dp, Color.Gray).padding(2.dp),
         maxLines = maxLines,
         minLines = minLines
     )
@@ -130,9 +119,5 @@
     minLines: Int = 1,
     maxLines: Int = Int.MAX_VALUE
 ) {
-    TextWithMinMaxLines(
-        text = AnnotatedString(text),
-        minLines = minLines,
-        maxLines = maxLines
-    )
+    TextWithMinMaxLines(text = AnnotatedString(text), minLines = minLines, maxLines = maxLines)
 }
diff --git a/compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/text/BrushAnimatingSpanDemo.kt b/compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/text/BrushAnimatingSpanDemo.kt
index 82f1324..054c284 100644
--- a/compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/text/BrushAnimatingSpanDemo.kt
+++ b/compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/text/BrushAnimatingSpanDemo.kt
@@ -63,13 +63,8 @@
     var highlightWordCount by remember { mutableIntStateOf(15) }
     var postWordCount by remember { mutableIntStateOf(5) }
 
-    Box(
-        modifier = Modifier
-            .fillMaxSize()
-            .padding(16.dp)
-    ) {
+    Box(modifier = Modifier.fillMaxSize().padding(16.dp)) {
         Column {
-
             Text("Pre Word Count")
             Slider(
                 value = preWordCount.toFloat(),
@@ -101,33 +96,37 @@
                 animatable = animatable,
                 animatable2 = animatable2
             )
-            Button(onClick = {
-                coroutineScope.launch {
-                    animatable.snapTo(0f)
-                    animatable2.snapTo(0f)
-                    launch {
-                        animatable2.animateTo(
-                            1f,
-                            tween(highlightWordCount * 100, easing = LinearEasing)
-                        )
-                    }
-                    delay(300)
-                    launch {
-                        animatable.animateTo(
-                            1f,
-                            tween(highlightWordCount * 100, easing = LinearEasing)
-                        )
+            Button(
+                onClick = {
+                    coroutineScope.launch {
+                        animatable.snapTo(0f)
+                        animatable2.snapTo(0f)
+                        launch {
+                            animatable2.animateTo(
+                                1f,
+                                tween(highlightWordCount * 100, easing = LinearEasing)
+                            )
+                        }
+                        delay(300)
+                        launch {
+                            animatable.animateTo(
+                                1f,
+                                tween(highlightWordCount * 100, easing = LinearEasing)
+                            )
+                        }
                     }
                 }
-            }) {
+            ) {
                 Text("Go")
             }
-            Button(onClick = {
-                coroutineScope.launch {
-                    animatable.snapTo(0f)
-                    animatable2.snapTo(0f)
+            Button(
+                onClick = {
+                    coroutineScope.launch {
+                        animatable.snapTo(0f)
+                        animatable2.snapTo(0f)
+                    }
                 }
-            }) {
+            ) {
                 Text("Reset")
             }
         }
@@ -142,40 +141,37 @@
     animatable: Animatable<Float, AnimationVector1D>,
     animatable2: Animatable<Float, AnimationVector1D>
 ) {
-    val (text, start, end) = remember(preWordCount, highlightWordCount, postWordCount) {
-        var start = 0
-        var end = 0
-        val text = buildAnnotatedString {
-            append(loremIpsum(wordCount = preWordCount))
-            start = length
-            withStyle(SpanStyle(fontWeight = FontWeight.Bold)) {
-                append(loremIpsum(wordCount = highlightWordCount))
+    val (text, start, end) =
+        remember(preWordCount, highlightWordCount, postWordCount) {
+            var start = 0
+            var end = 0
+            val text = buildAnnotatedString {
+                append(loremIpsum(wordCount = preWordCount))
+                start = length
+                withStyle(SpanStyle(fontWeight = FontWeight.Bold)) {
+                    append(loremIpsum(wordCount = highlightWordCount))
+                }
+                end = length
+                append(loremIpsum(wordCount = postWordCount))
             }
-            end = length
-            append(loremIpsum(wordCount = postWordCount))
+            Triple(text, start, end)
         }
-        Triple(text, start, end)
-    }
 
     val textLayoutResult = remember { mutableStateOf<TextLayoutResult?>(null) }
 
-    val finalText = remember(text, start, end, textLayoutResult.value?.layoutInput?.text?.text) {
-        calculateAnnotatedString(
-            text,
-            start,
-            end,
-            textLayoutResult.value,
-            animatable,
-            animatable2
-        )
-    }
+    val finalText =
+        remember(text, start, end, textLayoutResult.value?.layoutInput?.text?.text) {
+            calculateAnnotatedString(
+                text,
+                start,
+                end,
+                textLayoutResult.value,
+                animatable,
+                animatable2
+            )
+        }
 
-    Text(
-        text = finalText,
-        fontSize = 20.sp,
-        onTextLayout = {
-            textLayoutResult.value = it
-        })
+    Text(text = finalText, fontSize = 20.sp, onTextLayout = { textLayoutResult.value = it })
 }
 
 fun calculateAnnotatedString(
@@ -194,83 +190,94 @@
     val lastLineRight = textLayoutResult.getBoundingBox(end).right
 
     if (startLine == endLine) {
-        lines += Segment(
-            leftPosition = firstLineLeft,
-            rightPosition = lastLineRight,
-            leftOffset = start,
-            rightOffset = end
-        )
+        lines +=
+            Segment(
+                leftPosition = firstLineLeft,
+                rightPosition = lastLineRight,
+                leftOffset = start,
+                rightOffset = end
+            )
     } else {
         for (i in (startLine..endLine)) {
-            lines += when (i) {
-                startLine -> {
-                    Segment(
-                        leftPosition = firstLineLeft,
-                        rightPosition = textLayoutResult.getLineRight(i),
-                        leftOffset = start,
-                        rightOffset = textLayoutResult.getLineEnd(i)
-                    )
-                }
-
-                endLine -> {
-                    Segment(
-                        leftPosition = textLayoutResult.getLineLeft(i),
-                        rightPosition = lastLineRight,
-                        leftOffset = textLayoutResult.getLineStart(i),
-                        rightOffset = end
-                    )
-                }
-
-                else -> {
-                    Segment(
-                        leftPosition = textLayoutResult.getLineLeft(i),
-                        rightPosition = textLayoutResult.getLineRight(i),
-                        leftOffset = textLayoutResult.getLineStart(i),
-                        rightOffset = textLayoutResult.getLineEnd(i)
-                    )
-                }
-            }
-        }
-    }
-
-    val brushSpans = (lines).mapIndexed { index, segment ->
-        AnnotatedString.Range(
-            item = SpanStyle(
-                brush = object : ShaderBrush() {
-                    override fun createShader(size: Size): Shader {
-                        val animationValue = animatable.value
-                        val animationValue2 = animatable2.value
-                        return LinearGradientShader(
-                            from = Offset(
-                                x = segment.leftPosition - lines.allLeftWidth(index),
-                                y = 0f
-                            ),
-                            to = Offset(
-                                x = segment.rightPosition + lines.allRightWidth(index),
-                                y = 0f
-                            ),
-                            colors = listOf(
-                                Color.Blue,
-                                Color.Blue,
-                                Color.Gray,
-                                Color.Black,
-                                Color.Black
-                            ),
-                            colorStops = listOf(
-                                0f,
-                                animationValue,
-                                (animationValue + animationValue2) / 2,
-                                animationValue2,
-                                1f
-                            )
+            lines +=
+                when (i) {
+                    startLine -> {
+                        Segment(
+                            leftPosition = firstLineLeft,
+                            rightPosition = textLayoutResult.getLineRight(i),
+                            leftOffset = start,
+                            rightOffset = textLayoutResult.getLineEnd(i)
+                        )
+                    }
+                    endLine -> {
+                        Segment(
+                            leftPosition = textLayoutResult.getLineLeft(i),
+                            rightPosition = lastLineRight,
+                            leftOffset = textLayoutResult.getLineStart(i),
+                            rightOffset = end
+                        )
+                    }
+                    else -> {
+                        Segment(
+                            leftPosition = textLayoutResult.getLineLeft(i),
+                            rightPosition = textLayoutResult.getLineRight(i),
+                            leftOffset = textLayoutResult.getLineStart(i),
+                            rightOffset = textLayoutResult.getLineEnd(i)
                         )
                     }
                 }
-            ),
-            start = segment.leftOffset,
-            end = segment.rightOffset
-        )
+        }
     }
+
+    val brushSpans =
+        (lines).mapIndexed { index, segment ->
+            AnnotatedString.Range(
+                item =
+                    SpanStyle(
+                        brush =
+                            object : ShaderBrush() {
+                                override fun createShader(size: Size): Shader {
+                                    val animationValue = animatable.value
+                                    val animationValue2 = animatable2.value
+                                    return LinearGradientShader(
+                                        from =
+                                            Offset(
+                                                x =
+                                                    segment.leftPosition -
+                                                        lines.allLeftWidth(index),
+                                                y = 0f
+                                            ),
+                                        to =
+                                            Offset(
+                                                x =
+                                                    segment.rightPosition +
+                                                        lines.allRightWidth(index),
+                                                y = 0f
+                                            ),
+                                        colors =
+                                            listOf(
+                                                Color.Blue,
+                                                Color.Blue,
+                                                Color.Gray,
+                                                Color.Black,
+                                                Color.Black
+                                            ),
+                                        colorStops =
+                                            listOf(
+                                                0f,
+                                                animationValue,
+                                                (animationValue + animationValue2) / 2,
+                                                animationValue2,
+                                                1f
+                                            )
+                                    )
+                                }
+                            }
+                    ),
+                start = segment.leftOffset,
+                end = segment.rightOffset
+            )
+        }
     return AnnotatedString(
         text.text,
         paragraphStyles = text.paragraphStyles,
diff --git a/compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/text/BrushDemo.kt b/compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/text/BrushDemo.kt
index 88e7d1a..c12eda6 100644
--- a/compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/text/BrushDemo.kt
+++ b/compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/text/BrushDemo.kt
@@ -101,13 +101,11 @@
 fun BrushDemo() {
     Text(
         "Brush is awesome\nBrush is awesome\nBrush is awesome",
-        style = TextStyle(
-            brush = Brush.linearGradient(
-                colors = RainbowColors,
-                tileMode = TileMode.Mirror
-            ),
-            fontSize = 30.sp
-        )
+        style =
+            TextStyle(
+                brush = Brush.linearGradient(colors = RainbowColors, tileMode = TileMode.Mirror),
+                fontSize = 30.sp
+            )
     )
 }
 
@@ -115,12 +113,10 @@
 fun BrushGraphicalEmoji() {
     Text(
         "\uD83D\uDEF3\uD83D\uDD2E\uD83E\uDDED\uD83E\uDD5D\uD83E\uDD8C\uD83D\uDE0D",
-        style = TextStyle(
-            brush = Brush.linearGradient(
-                colors = RainbowColors,
-                tileMode = TileMode.Mirror
-            )
-        ),
+        style =
+            TextStyle(
+                brush = Brush.linearGradient(colors = RainbowColors, tileMode = TileMode.Mirror)
+            ),
         fontSize = 30.sp
     )
 }
@@ -128,24 +124,27 @@
 @Composable
 fun SingleLineSpanBrush() {
     val infiniteTransition = rememberInfiniteTransition()
-    val start by infiniteTransition.animateFloat(
-        initialValue = 0f,
-        targetValue = 4000f,
-        animationSpec = infiniteRepeatable(
-            animation = tween(durationMillis = 2000, easing = LinearEasing),
-            repeatMode = RepeatMode.Reverse
+    val start by
+        infiniteTransition.animateFloat(
+            initialValue = 0f,
+            targetValue = 4000f,
+            animationSpec =
+                infiniteRepeatable(
+                    animation = tween(durationMillis = 2000, easing = LinearEasing),
+                    repeatMode = RepeatMode.Reverse
+                )
         )
-    )
     Text(
         buildAnnotatedString {
             append("Brush is awesome\n")
             withStyle(
                 SpanStyle(
-                    brush = Brush.linearGradient(
-                        colors = RainbowColors,
-                        start = Offset(start, 0f),
-                        tileMode = TileMode.Mirror
-                    )
+                    brush =
+                        Brush.linearGradient(
+                            colors = RainbowColors,
+                            start = Offset(start, 0f),
+                            tileMode = TileMode.Mirror
+                        )
                 )
             ) {
                 append("Brush is awesome")
@@ -163,10 +162,7 @@
             append("Brush is aweso")
             withStyle(
                 SpanStyle(
-                    brush = Brush.linearGradient(
-                        colors = RainbowColors,
-                        tileMode = TileMode.Mirror
-                    )
+                    brush = Brush.linearGradient(colors = RainbowColors, tileMode = TileMode.Mirror)
                 )
             ) {
                 append("me\nBrush is awesome\nCo")
@@ -189,13 +185,15 @@
                 append(loremIpsum(wordCount = 29))
             }
         },
-        style = TextStyle(
-            brush = Brush.radialGradient(
-                *RainbowStops.zip(RainbowColors).toTypedArray(),
-                radius = 600f,
-                tileMode = TileMode.Mirror
-            )
-        ),
+        style =
+            TextStyle(
+                brush =
+                    Brush.radialGradient(
+                        *RainbowStops.zip(RainbowColors).toTypedArray(),
+                        radius = 600f,
+                        tileMode = TileMode.Mirror
+                    )
+            ),
         fontSize = 30.sp
     )
 }
@@ -203,14 +201,16 @@
 @Composable
 fun AnimatedBrush() {
     val infiniteTransition = rememberInfiniteTransition()
-    val radius by infiniteTransition.animateFloat(
-        initialValue = 100f,
-        targetValue = 300f,
-        animationSpec = infiniteRepeatable(
-            animation = tween(durationMillis = 1000, easing = LinearEasing),
-            repeatMode = RepeatMode.Reverse
+    val radius by
+        infiniteTransition.animateFloat(
+            initialValue = 100f,
+            targetValue = 300f,
+            animationSpec =
+                infiniteRepeatable(
+                    animation = tween(durationMillis = 1000, easing = LinearEasing),
+                    repeatMode = RepeatMode.Reverse
+                )
         )
-    )
     val brush = remember {
         // postpone the state read to shader creation time which happens during draw.
         ShaderBrush { size ->
@@ -223,30 +223,18 @@
             )
         }
     }
-    Text(
-        text = loremIpsum(wordCount = 29),
-        style = TextStyle(
-            brush = brush,
-            fontSize = 30.sp
-        )
-    )
+    Text(text = loremIpsum(wordCount = 29), style = TextStyle(brush = brush, fontSize = 30.sp))
 }
 
 @Composable
 fun ShadowAndBrush() {
     Text(
         "Brush is awesome",
-        style = TextStyle(
-            shadow = Shadow(
-                offset = Offset(8f, 8f),
-                blurRadius = 4f,
-                color = Color.Black
+        style =
+            TextStyle(
+                shadow = Shadow(offset = Offset(8f, 8f), blurRadius = 4f, color = Color.Black),
+                brush = Brush.linearGradient(colors = RainbowColors, tileMode = TileMode.Mirror)
             ),
-            brush = Brush.linearGradient(
-                colors = RainbowColors,
-                tileMode = TileMode.Mirror
-            )
-        ),
         fontSize = 42.sp
     )
 }
@@ -258,25 +246,24 @@
         value = text,
         onValueChange = { text = it },
         modifier = Modifier.fillMaxWidth(),
-        textStyle = TextStyle(
-            brush = Brush.linearGradient(
-                colors = RainbowColors,
-                tileMode = TileMode.Mirror
-            ),
-            fontSize = 30.sp
-        )
+        textStyle =
+            TextStyle(
+                brush = Brush.linearGradient(colors = RainbowColors, tileMode = TileMode.Mirror),
+                fontSize = 30.sp
+            )
     )
 }
 
 @Suppress("PrimitiveInCollection")
-internal val RainbowColors = listOf(
-    Color(0xff9c4f96),
-    Color(0xffff6355),
-    Color(0xfffba949),
-    Color(0xfffae442),
-    Color(0xff8bd448),
-    Color(0xff2aa8f2)
-)
+internal val RainbowColors =
+    listOf(
+        Color(0xff9c4f96),
+        Color(0xffff6355),
+        Color(0xfffba949),
+        Color(0xfffae442),
+        Color(0xff8bd448),
+        Color(0xff2aa8f2)
+    )
 
 @Suppress("PrimitiveInCollection")
 internal val RainbowStops = listOf(0f, 0.2f, 0.4f, 0.6f, 0.8f, 1f)
diff --git a/compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/text/CapitalizationAutoCorrectDemo.kt b/compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/text/CapitalizationAutoCorrectDemo.kt
index 724035b..c53a232 100644
--- a/compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/text/CapitalizationAutoCorrectDemo.kt
+++ b/compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/text/CapitalizationAutoCorrectDemo.kt
@@ -37,44 +37,43 @@
 import androidx.compose.ui.tooling.preview.Preview
 import androidx.compose.ui.unit.dp
 
-private val KeyboardOptionsList = listOf(
-    ImeOptionsData(
-        keyboardOptions = KeyboardOptions(
-            keyboardType = KeyboardType.Text,
-            capitalization = KeyboardCapitalization.Characters
+private val KeyboardOptionsList =
+    listOf(
+        ImeOptionsData(
+            keyboardOptions =
+                KeyboardOptions(
+                    keyboardType = KeyboardType.Text,
+                    capitalization = KeyboardCapitalization.Characters
+                ),
+            name = "Capitalize Characters"
         ),
-
-        name = "Capitalize Characters"
-    ),
-    ImeOptionsData(
-        keyboardOptions = KeyboardOptions(
-            keyboardType = KeyboardType.Text,
-            capitalization = KeyboardCapitalization.Words
+        ImeOptionsData(
+            keyboardOptions =
+                KeyboardOptions(
+                    keyboardType = KeyboardType.Text,
+                    capitalization = KeyboardCapitalization.Words
+                ),
+            name = "Capitalize Words"
         ),
-        name = "Capitalize Words"
-    ),
-    ImeOptionsData(
-        keyboardOptions = KeyboardOptions(
-            keyboardType = KeyboardType.Text,
-            capitalization = KeyboardCapitalization.Sentences
+        ImeOptionsData(
+            keyboardOptions =
+                KeyboardOptions(
+                    keyboardType = KeyboardType.Text,
+                    capitalization = KeyboardCapitalization.Sentences
+                ),
+            name = "Capitalize Sentences"
         ),
-        name = "Capitalize Sentences"
-    ),
-    ImeOptionsData(
-        keyboardOptions = KeyboardOptions(
-            autoCorrectEnabled = true,
-            keyboardType = KeyboardType.Text
+        ImeOptionsData(
+            keyboardOptions =
+                KeyboardOptions(autoCorrectEnabled = true, keyboardType = KeyboardType.Text),
+            name = "AutoCorrect On"
         ),
-        name = "AutoCorrect On"
-    ),
-    ImeOptionsData(
-        keyboardOptions = KeyboardOptions(
-            autoCorrectEnabled = false,
-            keyboardType = KeyboardType.Text
-        ),
-        name = "AutoCorrect Off"
+        ImeOptionsData(
+            keyboardOptions =
+                KeyboardOptions(autoCorrectEnabled = false, keyboardType = KeyboardType.Text),
+            name = "AutoCorrect Off"
+        )
     )
-)
 
 @Preview
 @Composable
@@ -89,9 +88,8 @@
 
 @Composable
 private fun MyTextField(data: ImeOptionsData) {
-    var state by rememberSaveable(stateSaver = TextFieldValue.Saver) {
-        mutableStateOf(TextFieldValue())
-    }
+    var state by
+        rememberSaveable(stateSaver = TextFieldValue.Saver) { mutableStateOf(TextFieldValue()) }
     val keyboardController = LocalSoftwareKeyboardController.current
     BasicTextField(
         modifier = demoTextFieldModifiers.defaultMinSize(100.dp),
diff --git a/compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/text/ComposeFontPadding.kt b/compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/text/ComposeFontPadding.kt
index 95467d4..85623c4 100644
--- a/compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/text/ComposeFontPadding.kt
+++ b/compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/text/ComposeFontPadding.kt
@@ -84,18 +84,18 @@
                 Column(padding.width(width)) {
                     Text(
                         text,
-                        style = style.copy(
-                            color = Color.Red,
-                            platformStyle = PlatformTextStyle(includeFontPadding = false)
-                        )
+                        style =
+                            style.copy(
+                                color = Color.Red,
+                                platformStyle = PlatformTextStyle(includeFontPadding = false)
+                            )
                     )
                 }
                 Column(padding.width(width)) {
                     Text(
                         text,
-                        style = style.copy(
-                            platformStyle = PlatformTextStyle(includeFontPadding = true)
-                        )
+                        style =
+                            style.copy(platformStyle = PlatformTextStyle(includeFontPadding = true))
                     )
                 }
             }
@@ -206,10 +206,7 @@
         verticalArrangement = Arrangement.Center,
         horizontalAlignment = Alignment.CenterHorizontally
     ) {
-        Text(
-            text = text,
-            style = TextStyle(fontSize = fontSize, color = Color.White)
-        )
+        Text(text = text, style = TextStyle(fontSize = fontSize, color = Color.White))
     }
 }
 
@@ -234,10 +231,7 @@
         modifier = Modifier.clip(CircleShape).background(Color.Red).size(size),
         contentAlignment = Alignment.Center
     ) {
-        Text(
-            text = text,
-            style = TextStyle(fontSize = fontSize, color = Color.White)
-        )
+        Text(text = text, style = TextStyle(fontSize = fontSize, color = Color.White))
     }
 }
 
@@ -249,9 +243,7 @@
             append("a")
             // half the size of original size
             // as a tall script should not be extending the height since now it is shorter
-            withStyle(SpanStyle(fontSize = fontSize / 2)) {
-                append("ဩ")
-            }
+            withStyle(SpanStyle(fontSize = fontSize / 2)) { append("ဩ") }
         }
         Text(text = shorterTallChar.toString(), style = TextStyle(fontSize = fontSize))
         Spacer(Modifier.padding(16.dp))
@@ -261,9 +253,7 @@
 
         val tallerTallChar = buildAnnotatedString {
             append("a")
-            withStyle(SpanStyle(fontSize = fontSize * 3)) {
-                append("ဩ")
-            }
+            withStyle(SpanStyle(fontSize = fontSize * 3)) { append("ဩ") }
         }
         Text(text = tallerTallChar, style = TextStyle(fontSize = fontSize))
     }
@@ -308,24 +298,19 @@
     val smallerShape = buildAnnotatedString {
         append("a")
         appendInlineContent(myId, " ")
-        withStyle(SpanStyle(fontSize = tallCharSize)) {
-            append("ဩ")
-        }
+        withStyle(SpanStyle(fontSize = tallCharSize)) { append("ဩ") }
     }
 
-    val inlineContent = InlineTextContent(
-        Placeholder(
-            width = inlineContentSize,
-            height = inlineContentSize,
-            placeholderVerticalAlign = placeholderVerticalAlign
-        )
-    ) {
-        Box(
-            modifier = Modifier.fillMaxSize()
-                .clip(CircleShape)
-                .background(color = Color.Red)
-        )
-    }
+    val inlineContent =
+        InlineTextContent(
+            Placeholder(
+                width = inlineContentSize,
+                height = inlineContentSize,
+                placeholderVerticalAlign = placeholderVerticalAlign
+            )
+        ) {
+            Box(modifier = Modifier.fillMaxSize().clip(CircleShape).background(color = Color.Red))
+        }
 
     val inlineContentMap = mapOf(Pair(myId, inlineContent))
 
diff --git a/compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/text/ComposeInputField.kt b/compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/text/ComposeInputField.kt
index 9d90318..1ac7632 100644
--- a/compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/text/ComposeInputField.kt
+++ b/compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/text/ComposeInputField.kt
@@ -45,9 +45,7 @@
 @Composable
 fun InputFieldDemo() {
     LazyColumn {
-        item {
-            TagLine(tag = "LTR Layout")
-        }
+        item { TagLine(tag = "LTR Layout") }
         item {
             CompositionLocalProvider(LocalLayoutDirection provides LayoutDirection.Ltr) {
                 Column(modifier = Modifier.fillMaxWidth()) {
@@ -60,9 +58,7 @@
                 }
             }
         }
-        item {
-            TagLine(tag = "RTL Layout")
-        }
+        item { TagLine(tag = "RTL Layout") }
         item {
             CompositionLocalProvider(LocalLayoutDirection provides LayoutDirection.Rtl) {
                 Column(modifier = Modifier.fillMaxWidth()) {
@@ -90,17 +86,12 @@
         modifier = demoTextFieldModifiers,
         value = state.value,
         singleLine = singleLine,
-        keyboardOptions = KeyboardOptions(
-            keyboardType = keyboardType,
-            imeAction = imeAction
-        ),
+        keyboardOptions = KeyboardOptions(keyboardType = keyboardType, imeAction = imeAction),
         keyboardActions = KeyboardActions { keyboardController?.hide() },
         onValueChange = { state.value = it },
         textStyle = TextStyle(fontSize = fontSize8),
     )
 }
 
-val demoTextFieldModifiers = Modifier
-    .padding(6.dp)
-    .border(1.dp, Color.LightGray, RoundedCornerShape(6.dp))
-    .padding(6.dp)
+val demoTextFieldModifiers =
+    Modifier.padding(6.dp).border(1.dp, Color.LightGray, RoundedCornerShape(6.dp)).padding(6.dp)
diff --git a/compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/text/ComposeInputFieldFocusTransition.kt b/compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/text/ComposeInputFieldFocusTransition.kt
index 57add62..d5e76c9 100644
--- a/compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/text/ComposeInputFieldFocusTransition.kt
+++ b/compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/text/ComposeInputFieldFocusTransition.kt
@@ -60,10 +60,11 @@
 
     BasicTextField(
         value = state.value,
-        modifier = demoTextFieldModifiers
-            .onFocusChanged { color = if (it.isFocused) Red else Black }
-            .focusRequester(focusRequester)
-            .focusProperties { next = nextFocusRequester },
+        modifier =
+            demoTextFieldModifiers
+                .onFocusChanged { color = if (it.isFocused) Red else Black }
+                .focusRequester(focusRequester)
+                .focusProperties { next = nextFocusRequester },
         textStyle = TextStyle(color = color, fontSize = 32.sp),
         onValueChange = { state.value = it },
         keyboardOptions = KeyboardOptions(imeAction = ImeAction.Next)
diff --git a/compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/text/ComposeInputFieldMinMaxLines.kt b/compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/text/ComposeInputFieldMinMaxLines.kt
index b29943c..c7a1043 100644
--- a/compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/text/ComposeInputFieldMinMaxLines.kt
+++ b/compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/text/ComposeInputFieldMinMaxLines.kt
@@ -72,10 +72,7 @@
         }
         item {
             TagLine("minLines > line count")
-            TextFieldWithMinMaxLines(
-                createMultilineText(4),
-                minLines = 5
-            )
+            TextFieldWithMinMaxLines(createMultilineText(4), minLines = 5)
         }
         item {
             TagLine("minLines < line count")
@@ -83,28 +80,18 @@
         }
         item {
             TagLine("minLines < maxLines")
-            TextFieldWithMinMaxLines(
-                createMultilineText(4),
-                minLines = 2,
-                maxLines = 3
-            )
+            TextFieldWithMinMaxLines(createMultilineText(4), minLines = 2, maxLines = 3)
         }
         item {
             TagLine("minLines == maxLines")
-            TextFieldWithMinMaxLines(
-                createMultilineText(2),
-                minLines = 3,
-                maxLines = 3
-            )
+            TextFieldWithMinMaxLines(createMultilineText(2), minLines = 3, maxLines = 3)
         }
         item {
             TagLine("maxLines=4 with different line heights")
             TextFieldWithMinMaxLines(
                 createMultilineText(5),
                 maxLines = 4,
-                spanStyles = listOf(
-                    AnnotatedString.Range(SpanStyle(fontSize = 40.sp), 14, 21)
-                )
+                spanStyles = listOf(AnnotatedString.Range(SpanStyle(fontSize = 40.sp), 14, 21))
             )
         }
         item {
@@ -112,9 +99,7 @@
             TextFieldWithMinMaxLines(
                 createMultilineText(4),
                 minLines = 5,
-                spanStyles = listOf(
-                    AnnotatedString.Range(SpanStyle(fontSize = 40.sp), 14, 21)
-                )
+                spanStyles = listOf(AnnotatedString.Range(SpanStyle(fontSize = 40.sp), 14, 21))
             )
         }
     }
@@ -136,10 +121,7 @@
         } else {
             VisualTransformation { annotatedString ->
                 TransformedText(
-                    AnnotatedString(
-                        annotatedString.text,
-                        spanStyles = spanStyles
-                    ),
+                    AnnotatedString(annotatedString.text, spanStyles = spanStyles),
                     OffsetMapping.Identity
                 )
             }
@@ -157,5 +139,4 @@
     )
 }
 
-private fun createMultilineText(lineCount: Int) =
-    (1..lineCount).joinToString("\n") { "Line $it" }
+private fun createMultilineText(lineCount: Int) = (1..lineCount).joinToString("\n") { "Line $it" }
diff --git a/compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/text/ComposeLineHeight.kt b/compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/text/ComposeLineHeight.kt
index a91e0d2..b9f6b2c 100644
--- a/compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/text/ComposeLineHeight.kt
+++ b/compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/text/ComposeLineHeight.kt
@@ -61,7 +61,9 @@
 import kotlin.math.round
 
 private val HintStyle = TextStyle(fontSize = 14.sp)
+
 private fun Float.format(digits: Int = 2) = "%.${digits}f".format(this)
+
 private val FontSize = 60.sp
 
 @Preview
@@ -75,9 +77,7 @@
         var lineHeightEm = remember { mutableFloatStateOf(1f) }
         var lineHeightEnabled = remember { mutableStateOf(false) }
         val lineHeightStyleEnabled = remember { mutableStateOf(false) }
-        var lineHeightAlignment = remember {
-            mutableStateOf(LineHeightStyle.Default.alignment)
-        }
+        var lineHeightAlignment = remember { mutableStateOf(LineHeightStyle.Default.alignment) }
         var lineHeightTrim = remember { mutableStateOf(LineHeightStyle.Default.trim) }
         val includeFontPadding = remember { mutableStateOf(false) }
         val applyMaxLines = remember { mutableStateOf(false) }
@@ -198,22 +198,19 @@
     lineHeightAlignment: MutableState<LineHeightStyle.Alignment>,
     enabled: Boolean
 ) {
-    val options = listOf(
-        LineHeightStyle.Alignment.Proportional,
-        LineHeightStyle.Alignment.Top,
-        LineHeightStyle.Alignment.Center,
-        LineHeightStyle.Alignment.Bottom
-    )
+    val options =
+        listOf(
+            LineHeightStyle.Alignment.Proportional,
+            LineHeightStyle.Alignment.Top,
+            LineHeightStyle.Alignment.Center,
+            LineHeightStyle.Alignment.Bottom
+        )
 
-    Row(
-        modifier = Modifier.selectableGroup(),
-        verticalAlignment = Alignment.CenterVertically
-    ) {
+    Row(modifier = Modifier.selectableGroup(), verticalAlignment = Alignment.CenterVertically) {
         Text(text = "alignment:", style = HintStyle)
         options.forEach { option ->
             Row(
-                Modifier
-                    .height(56.dp)
+                Modifier.height(56.dp)
                     .selectable(
                         selected = (option == lineHeightAlignment.value),
                         onClick = { lineHeightAlignment.value = option },
@@ -234,26 +231,14 @@
 }
 
 @Composable
-private fun LineHeightTrimOptions(
-    lineHeightTrim: MutableState<Trim>,
-    enabled: Boolean
-) {
-    val options = listOf(
-        Trim.Both,
-        Trim.None,
-        Trim.FirstLineTop,
-        Trim.LastLineBottom
-    )
+private fun LineHeightTrimOptions(lineHeightTrim: MutableState<Trim>, enabled: Boolean) {
+    val options = listOf(Trim.Both, Trim.None, Trim.FirstLineTop, Trim.LastLineBottom)
 
-    Row(
-        modifier = Modifier.selectableGroup(),
-        verticalAlignment = Alignment.CenterVertically
-    ) {
+    Row(modifier = Modifier.selectableGroup(), verticalAlignment = Alignment.CenterVertically) {
         Text(text = "trim:", style = HintStyle)
         options.forEach { option ->
             Row(
-                Modifier
-                    .height(56.dp)
+                Modifier.height(56.dp)
                     .selectable(
                         selected = (option == lineHeightTrim.value),
                         onClick = { lineHeightTrim.value = option },
@@ -281,20 +266,11 @@
 ) {
     Column(Modifier.horizontalScroll(rememberScrollState())) {
         Row(verticalAlignment = Alignment.CenterVertically) {
-            Checkbox(
-                checked = useSizeSpan.value,
-                onCheckedChange = { useSizeSpan.value = it }
-            )
+            Checkbox(checked = useSizeSpan.value, onCheckedChange = { useSizeSpan.value = it })
             Text("Size Span", style = HintStyle)
-            Checkbox(
-                checked = singleLine.value,
-                onCheckedChange = { singleLine.value = it }
-            )
+            Checkbox(checked = singleLine.value, onCheckedChange = { singleLine.value = it })
             Text("Single Line", style = HintStyle)
-            Checkbox(
-                checked = useTallScript.value,
-                onCheckedChange = { useTallScript.value = it }
-            )
+            Checkbox(checked = useTallScript.value, onCheckedChange = { useTallScript.value = it })
             Text("Tall script", style = HintStyle)
         }
     }
@@ -313,15 +289,9 @@
                 onCheckedChange = { includeFontPadding.value = it }
             )
             Text("IncludeFontPadding", style = HintStyle)
-            Checkbox(
-                checked = applyMaxLines.value,
-                onCheckedChange = { applyMaxLines.value = it }
-            )
+            Checkbox(checked = applyMaxLines.value, onCheckedChange = { applyMaxLines.value = it })
             Text("maxLines", style = HintStyle)
-            Checkbox(
-                checked = ellipsize.value,
-                onCheckedChange = { ellipsize.value = it }
-            )
+            Checkbox(checked = ellipsize.value, onCheckedChange = { ellipsize.value = it })
             Text("ellipsize", style = HintStyle)
         }
     }
@@ -374,11 +344,12 @@
 ) {
     val width = with(LocalDensity.current) { (FontSize.toPx() * 5).toDp() }
 
-    var string = if (singleLine) {
-        if (useTallScript) "ဪไ၇ဤန်" else "Abyfhpq"
-    } else {
-        if (useTallScript) "ဪไ၇ဤနဩဦဤနိမြသကိမ့်ဪไန််" else "ABCDEfgHIjKgpvylzgpvykwi"
-    }
+    var string =
+        if (singleLine) {
+            if (useTallScript) "ဪไ၇ဤန်" else "Abyfhpq"
+        } else {
+            if (useTallScript) "ဪไ၇ဤနဩဦဤနိမြသကိမ့်ဪไန််" else "ABCDEfgHIjKgpvylzgpvykwi"
+        }
 
     if (applyMaxLines) {
         string = string.repeat(4)
@@ -386,35 +357,38 @@
 
     var text = AnnotatedString(string)
     if (useSizeSpan) {
-        text = if (singleLine) {
-            buildAnnotatedString {
-                append(text)
-                addStyle(style = SpanStyle(fontSize = FontSize * 1.5), start = 1, end = 2)
-                addStyle(style = SpanStyle(fontSize = FontSize * 1.5), start = 3, end = 4)
+        text =
+            if (singleLine) {
+                buildAnnotatedString {
+                    append(text)
+                    addStyle(style = SpanStyle(fontSize = FontSize * 1.5), start = 1, end = 2)
+                    addStyle(style = SpanStyle(fontSize = FontSize * 1.5), start = 3, end = 4)
+                }
+            } else {
+                buildAnnotatedString {
+                    append(text)
+                    addStyle(style = SpanStyle(fontSize = FontSize * 1.5), start = 1, end = 2)
+                    addStyle(style = SpanStyle(fontSize = FontSize * 1.5), start = 10, end = 12)
+                    addStyle(style = SpanStyle(fontSize = FontSize * 1.5), start = 18, end = 19)
+                }
             }
-        } else {
-            buildAnnotatedString {
-                append(text)
-                addStyle(style = SpanStyle(fontSize = FontSize * 1.5), start = 1, end = 2)
-                addStyle(style = SpanStyle(fontSize = FontSize * 1.5), start = 10, end = 12)
-                addStyle(style = SpanStyle(fontSize = FontSize * 1.5), start = 18, end = 19)
-            }
-        }
     }
 
     val maxLines = if (applyMaxLines) 3 else Int.MAX_VALUE
 
-    val style = TextStyle(
-        fontSize = FontSize,
-        color = TextMetricColors.Default.text,
-        lineHeightStyle = lineHeightStyle,
-        lineHeight = if (lineHeightEnabled) {
-            if (lineHeightSp > 0) lineHeightSp.sp else lineHeightEm.em
-        } else {
-            TextUnit.Unspecified
-        },
-        platformStyle = PlatformTextStyle(includeFontPadding = includeFontPadding)
-    )
+    val style =
+        TextStyle(
+            fontSize = FontSize,
+            color = TextMetricColors.Default.text,
+            lineHeightStyle = lineHeightStyle,
+            lineHeight =
+                if (lineHeightEnabled) {
+                    if (lineHeightSp > 0) lineHeightSp.sp else lineHeightEm.em
+                } else {
+                    TextUnit.Unspecified
+                },
+            platformStyle = PlatformTextStyle(includeFontPadding = includeFontPadding)
+        )
 
     val overflow = if (ellipsize) TextOverflow.Ellipsis else TextOverflow.Clip
     Column(modifier = Modifier.fillMaxWidth(), horizontalAlignment = Alignment.CenterHorizontally) {
@@ -434,9 +408,7 @@
 
             TextFieldWithMetrics(
                 value = textFieldValue,
-                onValueChange = {
-                    textFieldValue = it
-                },
+                onValueChange = { textFieldValue = it },
                 style = style,
                 maxLines = maxLines,
                 softWrap = !singleLine
diff --git a/compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/text/ComposeMinTouchTargetTextSelectionDemo.kt b/compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/text/ComposeMinTouchTargetTextSelectionDemo.kt
index d5cf31a..65d6c77 100644
--- a/compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/text/ComposeMinTouchTargetTextSelectionDemo.kt
+++ b/compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/text/ComposeMinTouchTargetTextSelectionDemo.kt
@@ -60,22 +60,21 @@
 private val Purple = Color(0xff7B4397)
 
 // red is used for the selection container color
-private val Rainbow = MutableColorList(initialCapacity = 6).apply {
-    add(Orange)
-    add(Yellow)
-    add(Green)
-    add(Blue)
-    add(Indigo)
-    add(Purple)
-}.asColorList()
+private val Rainbow =
+    MutableColorList(initialCapacity = 6)
+        .apply {
+            add(Orange)
+            add(Yellow)
+            add(Green)
+            add(Blue)
+            add(Indigo)
+            add(Purple)
+        }
+        .asColorList()
 
 @Composable
 fun MinTouchTargetTextSelection() {
-    Column(
-        Modifier
-            .fillMaxSize()
-            .padding(horizontal = 32.dp, vertical = 8.dp)
-    ) {
+    Column(Modifier.fillMaxSize().padding(horizontal = 32.dp, vertical = 8.dp)) {
         Text(
             buildAnnotatedString {
                 append("The ")
@@ -98,14 +97,18 @@
                     """
                     |. We expect that touch selection gestures in the touch target space,
                     | but not directly on the
-                    | """.trimMargin().replace("\n", "")
+                    | """
+                        .trimMargin()
+                        .replace("\n", "")
                 )
                 appendCode("Text")
                 append(
                     """
                     |, will still start a selection and not crash. The below slider adjusts
                     | the minimum touch target size between 0 and 100 dp.
-                    |""".trimMargin().replace("\n", "")
+                    |"""
+                        .trimMargin()
+                        .replace("\n", "")
                 )
             },
         )
@@ -117,9 +120,7 @@
         )
         Box(modifier = Modifier.fillMaxSize(), contentAlignment = Alignment.Center) {
             val length = minTouchSideLength.dp
-            OverrideMinimumTouchTarget(DpSize(length, length)) {
-                MinTouchTargetInTextSelection()
-            }
+            OverrideMinimumTouchTarget(DpSize(length, length)) { MinTouchTargetInTextSelection() }
         }
     }
 }
@@ -135,47 +136,45 @@
 private fun MinTouchTargetInTextSelection() {
     val minimumTouchTarget = LocalViewConfiguration.current.minimumTouchTargetSize
     SelectionContainer(
-        Modifier
-            .border(1.dp, Red)
+        Modifier.border(1.dp, Red)
             .padding(1.dp)
             .drawMinTouchTargetBorderBehind(Red.copy(alpha), minimumTouchTarget)
     ) {
-        Column(
-            verticalArrangement = Arrangement.spacedBy(4.dp)
-        ) {
+        Column(verticalArrangement = Arrangement.spacedBy(4.dp)) {
             Rainbow.forEachIndexed { index, color ->
                 val fadedColor = color.copy(alpha)
                 Text(
                     text = "Text",
                     style = LocalTextStyle.current.merge(color = color),
-                    modifier = Modifier
-                        // offset the texts horizontally, else the borders will heavily overlap
-                        .padding(start = (index * 6).dp)
-                        .border(1.dp, color)
-                        // Padding between text and border so they aren't touching
-                        .padding(1.dp)
-                        .drawMinTouchTargetBorderBehind(fadedColor, minimumTouchTarget)
+                    modifier =
+                        Modifier
+                            // offset the texts horizontally, else the borders will heavily overlap
+                            .padding(start = (index * 6).dp)
+                            .border(1.dp, color)
+                            // Padding between text and border so they aren't touching
+                            .padding(1.dp)
+                            .drawMinTouchTargetBorderBehind(fadedColor, minimumTouchTarget)
                 )
             }
         }
     }
 }
 
-/**
- * Draw a 1 dp unfilled rect around the minimum touch target.
- */
+/** Draw a 1 dp unfilled rect around the minimum touch target. */
 private fun Modifier.drawMinTouchTargetBorderBehind(
     color: Color,
     minimumTouchTarget: DpSize
 ): Modifier = drawBehind {
-    val minTouchTargetCoercedSize = Size(
-        width = size.width.coerceAtLeast(minimumTouchTarget.width.toPx()),
-        height = size.height.coerceAtLeast(minimumTouchTarget.height.toPx())
-    )
-    val topLeft = Offset(
-        x = (size.width - minTouchTargetCoercedSize.width) / 2,
-        y = (size.height - minTouchTargetCoercedSize.height) / 2
-    )
+    val minTouchTargetCoercedSize =
+        Size(
+            width = size.width.coerceAtLeast(minimumTouchTarget.width.toPx()),
+            height = size.height.coerceAtLeast(minimumTouchTarget.height.toPx())
+        )
+    val topLeft =
+        Offset(
+            x = (size.width - minTouchTargetCoercedSize.width) / 2,
+            y = (size.height - minTouchTargetCoercedSize.height) / 2
+        )
     drawRect(color, topLeft, minTouchTargetCoercedSize, style = Stroke(1.dp.toPx()))
 }
 
@@ -183,9 +182,7 @@
     val size = Rainbow.size
     text.forEachIndexed { index, char ->
         val color = Rainbow[index % size].copy(alpha)
-        withStyle(SpanStyle(color = color)) {
-            append(char)
-        }
+        withStyle(SpanStyle(color = color)) { append(char) }
     }
 }
 
diff --git a/compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/text/ComposeMultiParagraph.kt b/compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/text/ComposeMultiParagraph.kt
index 4405d9c..b8ba7f0 100644
--- a/compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/text/ComposeMultiParagraph.kt
+++ b/compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/text/ComposeMultiParagraph.kt
@@ -64,12 +64,11 @@
     val text1 = "paragraph1 paragraph1 paragraph1 paragraph1 paragraph1"
     val text2 = "paragraph2 paragraph2 paragraph2 paragraph2 paragraph2"
     Text(
-        text = buildAnnotatedString {
-            append(text1)
-            withStyle(ParagraphStyle()) {
-                append(text2)
-            }
-        },
+        text =
+            buildAnnotatedString {
+                append(text1)
+                withStyle(ParagraphStyle()) { append(text2) }
+            },
         style = TextStyle(fontSize = fontSize6)
     )
 }
@@ -80,9 +79,7 @@
     val annotatedString = buildAnnotatedString {
         TextAlign.values().forEach { textAlign ->
             val str = List(4) { "TextAlign.$textAlign" }.joinToString(" ")
-            withStyle(ParagraphStyle(textAlign = textAlign)) {
-                append(str)
-            }
+            withStyle(ParagraphStyle(textAlign = textAlign)) { append(str) }
         }
     }
 
@@ -96,27 +93,25 @@
     val text3 = "LineHeight=50sp: $lorem"
 
     Text(
-        text = AnnotatedString(
-            text = text1 + text2 + text3,
-            spanStyles = listOf(),
-            paragraphStyles = listOf(
-                AnnotatedString.Range(
-                    ParagraphStyle(lineHeight = 30.sp),
-                    0,
-                    text1.length
-                ),
-                AnnotatedString.Range(
-                    ParagraphStyle(lineHeight = 40.sp),
-                    text1.length,
-                    text1.length + text2.length
-                ),
-                AnnotatedString.Range(
-                    ParagraphStyle(lineHeight = 50.sp),
-                    text1.length + text2.length,
-                    text1.length + text2.length + text3.length
-                )
-            )
-        ),
+        text =
+            AnnotatedString(
+                text = text1 + text2 + text3,
+                spanStyles = listOf(),
+                paragraphStyles =
+                    listOf(
+                        AnnotatedString.Range(ParagraphStyle(lineHeight = 30.sp), 0, text1.length),
+                        AnnotatedString.Range(
+                            ParagraphStyle(lineHeight = 40.sp),
+                            text1.length,
+                            text1.length + text2.length
+                        ),
+                        AnnotatedString.Range(
+                            ParagraphStyle(lineHeight = 50.sp),
+                            text1.length + text2.length,
+                            text1.length + text2.length + text3.length
+                        )
+                    )
+            ),
         style = TextStyle(fontSize = fontSize6)
     )
 }
@@ -128,14 +123,15 @@
     val text2 = "TextIndent restLine TextIndent restLine TextIndent restLine"
 
     Text(
-        text = buildAnnotatedString {
-            withStyle(ParagraphStyle(textIndent = TextIndent(firstLine = 20.sp))) {
-                append(text1)
-            }
-            withStyle(ParagraphStyle(textIndent = TextIndent(restLine = 20.sp))) {
-                append(text2)
-            }
-        },
+        text =
+            buildAnnotatedString {
+                withStyle(ParagraphStyle(textIndent = TextIndent(firstLine = 20.sp))) {
+                    append(text1)
+                }
+                withStyle(ParagraphStyle(textIndent = TextIndent(restLine = 20.sp))) {
+                    append(text2)
+                }
+            },
         style = TextStyle(fontSize = fontSize6)
     )
 }
@@ -145,14 +141,11 @@
     val ltrText = "Hello World! Hello World! Hello World! Hello World! Hello World!"
     val rtlText = "مرحبا بالعالم مرحبا بالعالم مرحبا بالعالم مرحبا بالعالم مرحبا بالعالم"
     Text(
-        text = buildAnnotatedString {
-            withStyle(ParagraphStyle()) {
-                append(ltrText)
-            }
-            withStyle(ParagraphStyle()) {
-                append(rtlText)
-            }
-        },
+        text =
+            buildAnnotatedString {
+                withStyle(ParagraphStyle()) { append(ltrText) }
+                withStyle(ParagraphStyle()) { append(rtlText) }
+            },
         style = TextStyle(fontSize = fontSize6)
     )
 }
diff --git a/compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/text/ComposeReuseLayout.kt b/compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/text/ComposeReuseLayout.kt
index e23dbff..976ba70 100644
--- a/compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/text/ComposeReuseLayout.kt
+++ b/compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/text/ComposeReuseLayout.kt
@@ -42,9 +42,8 @@
 import androidx.compose.ui.unit.sp
 
 /**
- * TextStyle parameters color, textDecoration and shadow currently have special treatment that
- * they are sent to TextPainter and set on the paint. Previously we did this for performance
- * reasons.
+ * TextStyle parameters color, textDecoration and shadow currently have special treatment that they
+ * are sent to TextPainter and set on the paint. Previously we did this for performance reasons.
  *
  * Some of the text params definitely change the text metrics and require re-layout of the text.
  * However something like background do not change text metrics and ideally could have not required
@@ -62,21 +61,22 @@
     val colorAnimationSpec = remember {
         infiniteRepeatable(tween<Color>(3000), repeatMode = RepeatMode.Reverse)
     }
-    val color by rememberInfiniteTransition()
-        .animateColor(Color.Red, Color.Green, colorAnimationSpec)
+    val color by
+        rememberInfiniteTransition().animateColor(Color.Red, Color.Green, colorAnimationSpec)
 
     val shadowDistanceAnimationSpec = remember {
         infiniteRepeatable(tween<Float>(3000), repeatMode = RepeatMode.Reverse)
     }
-    val shadowDistance by rememberInfiniteTransition()
-        .animateFloat(5f, 20f, shadowDistanceAnimationSpec)
+    val shadowDistance by
+        rememberInfiniteTransition().animateFloat(5f, 20f, shadowDistanceAnimationSpec)
 
     val style = TextStyle(fontSize = 64.sp, color = Color.Yellow, fontWeight = FontWeight.Bold)
-    val shadow = Shadow(
-        color = color,
-        blurRadius = Float.MIN_VALUE,
-        offset = Offset(shadowDistance, shadowDistance)
-    )
+    val shadow =
+        Shadow(
+            color = color,
+            blurRadius = Float.MIN_VALUE,
+            offset = Offset(shadowDistance, shadowDistance)
+        )
     val text = "ABC"
 
     Column(Modifier.padding(16.dp).verticalScroll(rememberScrollState())) {
diff --git a/compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/text/ComposeText.kt b/compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/text/ComposeText.kt
index 554f07a..6152c8f 100644
--- a/compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/text/ComposeText.kt
+++ b/compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/text/ComposeText.kt
@@ -107,8 +107,8 @@
 import androidx.compose.ui.window.Popup
 import androidx.compose.ui.window.PopupProperties
 
-private const val longText = "This is a very-very long string that wraps into a few lines " +
-    "given the width restrictions."
+private const val longText =
+    "This is a very-very long string that wraps into a few lines " + "given the width restrictions."
 const val displayText = "Text Demo"
 const val displayTextChinese = "文本演示"
 const val displayTextArabic = "\u0639\u0631\u0636\u0020\u0627\u0644\u0646\u0635"
@@ -133,8 +133,9 @@
         }
         item {
             TagLine(
-                tag = "color, fontSize, fontWeight, fontFamily, fontStyle, letterSpacing, " +
-                    "background, decoration"
+                tag =
+                    "color, fontSize, fontWeight, fontFamily, fontStyle, letterSpacing, " +
+                        "background, decoration"
             )
             TextDemoComplexStyling()
         }
@@ -210,33 +211,25 @@
 fun TagLine(tag: String) {
     Text(
         style = TextStyle(fontSize = fontSize8),
-        text = buildAnnotatedString {
-            append("\n")
-            withStyle(
-                style = SpanStyle(
-                    color = Color(0xFFAAAAAA),
-                    fontSize = fontSize6
-                )
-            ) {
-                append(tag)
+        text =
+            buildAnnotatedString {
+                append("\n")
+                withStyle(style = SpanStyle(color = Color(0xFFAAAAAA), fontSize = fontSize6)) {
+                    append(tag)
+                }
             }
-        }
     )
 }
 
 @Composable
 fun SecondTagLine(tag: String) {
     Text(
-        text = buildAnnotatedString {
-            withStyle(
-                style = SpanStyle(
-                    color = Color(0xFFAAAAAA),
-                    fontSize = fontSize4
-                )
-            ) {
-                append(tag)
+        text =
+            buildAnnotatedString {
+                withStyle(style = SpanStyle(color = Color(0xFFAAAAAA), fontSize = fontSize4)) {
+                    append(tag)
+                }
             }
-        }
     )
 }
 
@@ -245,40 +238,41 @@
     // This group of text composables show different color, fontSize, fontWeight and fontStyle in
     // English.
     Text(
-        text = buildAnnotatedString {
-            withStyle(
-                SpanStyle(
-                    color = Color(0xFFFF0000),
-                    fontSize = fontSize6,
-                    fontWeight = FontWeight.W200,
-                    fontStyle = FontStyle.Italic
-                )
-            ) {
-                append("$displayText   ")
-            }
+        text =
+            buildAnnotatedString {
+                withStyle(
+                    SpanStyle(
+                        color = Color(0xFFFF0000),
+                        fontSize = fontSize6,
+                        fontWeight = FontWeight.W200,
+                        fontStyle = FontStyle.Italic
+                    )
+                ) {
+                    append("$displayText   ")
+                }
 
-            withStyle(
-                SpanStyle(
-                    color = Color(0xFF00FF00),
-                    fontSize = fontSize8,
-                    fontWeight = FontWeight.W500,
-                    fontStyle = FontStyle.Normal
-                )
-            ) {
-                append("$displayText   ")
-            }
+                withStyle(
+                    SpanStyle(
+                        color = Color(0xFF00FF00),
+                        fontSize = fontSize8,
+                        fontWeight = FontWeight.W500,
+                        fontStyle = FontStyle.Normal
+                    )
+                ) {
+                    append("$displayText   ")
+                }
 
-            withStyle(
-                SpanStyle(
-                    color = Color(0xFF0000FF),
-                    fontSize = fontSize10,
-                    fontWeight = FontWeight.W800,
-                    fontStyle = FontStyle.Normal
-                )
-            ) {
-                append(displayText)
+                withStyle(
+                    SpanStyle(
+                        color = Color(0xFF0000FF),
+                        fontSize = fontSize10,
+                        fontWeight = FontWeight.W800,
+                        fontStyle = FontStyle.Normal
+                    )
+                ) {
+                    append(displayText)
+                }
             }
-        }
     )
 }
 
@@ -292,40 +286,44 @@
     // This group of text composables show different color, fontSize, fontWeight and fontStyle in
     // Chinese, Arabic, and Hindi.
     Text(
-        text = buildAnnotatedString {
-            withStyle(
-                style = SpanStyle(
-                    color = Color(0xFFFF0000),
-                    fontSize = fontSize6,
-                    fontWeight = FontWeight.W200,
-                    fontStyle = FontStyle.Italic
-                )
-            ) {
-                append("$displayTextChinese   ")
-            }
+        text =
+            buildAnnotatedString {
+                withStyle(
+                    style =
+                        SpanStyle(
+                            color = Color(0xFFFF0000),
+                            fontSize = fontSize6,
+                            fontWeight = FontWeight.W200,
+                            fontStyle = FontStyle.Italic
+                        )
+                ) {
+                    append("$displayTextChinese   ")
+                }
 
-            withStyle(
-                style = SpanStyle(
-                    color = Color(0xFF00FF00),
-                    fontSize = fontSize8,
-                    fontWeight = FontWeight.W500,
-                    fontStyle = FontStyle.Normal
-                )
-            ) {
-                append("$displayTextArabic   ")
-            }
+                withStyle(
+                    style =
+                        SpanStyle(
+                            color = Color(0xFF00FF00),
+                            fontSize = fontSize8,
+                            fontWeight = FontWeight.W500,
+                            fontStyle = FontStyle.Normal
+                        )
+                ) {
+                    append("$displayTextArabic   ")
+                }
 
-            withStyle(
-                style = SpanStyle(
-                    color = Color(0xFF0000FF),
-                    fontSize = fontSize10,
-                    fontWeight = FontWeight.W800,
-                    fontStyle = FontStyle.Normal
-                )
-            ) {
-                append(displayTextHindi)
+                withStyle(
+                    style =
+                        SpanStyle(
+                            color = Color(0xFF0000FF),
+                            fontSize = fontSize10,
+                            fontWeight = FontWeight.W800,
+                            fontStyle = FontStyle.Normal
+                        )
+                ) {
+                    append(displayTextHindi)
+                }
             }
-        }
     )
 }
 
@@ -334,30 +332,15 @@
     // This group of text composables show different fontFamilies in English.
     Text(
         buildAnnotatedString {
-            withStyle(
-                style = SpanStyle(
-                    fontSize = fontSize8,
-                    fontFamily = FontFamily.SansSerif
-                )
-            ) {
+            withStyle(style = SpanStyle(fontSize = fontSize8, fontFamily = FontFamily.SansSerif)) {
                 append("$displayText sans-serif\n")
             }
 
-            withStyle(
-                style = SpanStyle(
-                    fontSize = fontSize8,
-                    fontFamily = FontFamily.Serif
-                )
-            ) {
+            withStyle(style = SpanStyle(fontSize = fontSize8, fontFamily = FontFamily.Serif)) {
                 append("$displayText serif\n")
             }
 
-            withStyle(
-                style = SpanStyle(
-                    fontSize = fontSize8,
-                    fontFamily = FontFamily.Monospace
-                )
-            ) {
+            withStyle(style = SpanStyle(fontSize = fontSize8, fontFamily = FontFamily.Monospace)) {
                 append("$displayText monospace")
             }
         }
@@ -375,7 +358,8 @@
 
 @Composable
 fun TextDemoTextDecoration() {
-    // This group of text composables show different decoration, decorationColor and decorationStyle.
+    // This group of text composables show different decoration, decorationColor and
+    // decorationStyle.
     TextDecorationLineThroughSample()
     TextDecorationUnderlineSample()
     TextDecorationCombinedSample()
@@ -385,19 +369,13 @@
 fun TextDemoLetterSpacing() {
     // This group of text composables show different letterSpacing.
     Text(
-        text = buildAnnotatedString {
-            withStyle(style = SpanStyle(fontSize = fontSize8)) {
-                append("$displayText   ")
+        text =
+            buildAnnotatedString {
+                withStyle(style = SpanStyle(fontSize = fontSize8)) { append("$displayText   ") }
+                withStyle(style = SpanStyle(fontSize = fontSize8, letterSpacing = 0.5.em)) {
+                    append(displayText)
+                }
             }
-            withStyle(
-                style = SpanStyle(
-                    fontSize = fontSize8,
-                    letterSpacing = 0.5.em
-                )
-            ) {
-                append(displayText)
-            }
-        }
     )
 }
 
@@ -410,10 +388,7 @@
 fun TextDemoHeight() {
     // This group of text composables show different height.
     Row(Modifier.fillMaxWidth()) {
-        Text(
-            text = "$displayText\n$displayText   ",
-            style = TextStyle(fontSize = fontSize8)
-        )
+        Text(text = "$displayText\n$displayText   ", style = TextStyle(fontSize = fontSize8))
         Text(
             text = "$displayText\n$displayText   ",
             style = TextStyle(fontSize = fontSize8, lineHeight = 50.sp)
@@ -425,19 +400,18 @@
 fun TextDemoBackground() {
     // This group of text composables show different background.
     Text(
-        text = buildAnnotatedString {
-            withStyle(style = SpanStyle(background = Color(0xFFFF0000))) {
-                append("$displayText   ")
-            }
+        text =
+            buildAnnotatedString {
+                withStyle(style = SpanStyle(background = Color(0xFFFF0000))) {
+                    append("$displayText   ")
+                }
 
-            withStyle(style = SpanStyle(background = Color(0xFF00FF00))) {
-                append("$displayText   ")
-            }
+                withStyle(style = SpanStyle(background = Color(0xFF00FF00))) {
+                    append("$displayText   ")
+                }
 
-            withStyle(style = SpanStyle(background = Color(0xFF0000FF))) {
-                append(displayText)
-            }
-        },
+                withStyle(style = SpanStyle(background = Color(0xFF0000FF))) { append(displayText) }
+            },
         style = TextStyle(fontSize = fontSize8)
     )
 }
@@ -447,26 +421,26 @@
     // This group of text composables show different Locales of the same Unicode codepoint.
     val text = "\u82B1"
     Text(
-        text = buildAnnotatedString {
-            withStyle(style = SpanStyle(localeList = LocaleList("ja-JP"))) {
-                append("$text   ")
-            }
+        text =
+            buildAnnotatedString {
+                withStyle(style = SpanStyle(localeList = LocaleList("ja-JP"))) {
+                    append("$text   ")
+                }
 
-            withStyle(style = SpanStyle(localeList = LocaleList("zh-CN"))) {
-                append("$text   ")
-            }
+                withStyle(style = SpanStyle(localeList = LocaleList("zh-CN"))) {
+                    append("$text   ")
+                }
 
-            withStyle(style = SpanStyle(localeList = LocaleList("zh-TW"))) {
-                append(text)
-            }
-        },
+                withStyle(style = SpanStyle(localeList = LocaleList("zh-TW"))) { append(text) }
+            },
         style = TextStyle(fontSize = fontSize8)
     )
 }
 
 @Composable
 fun TextDemoTextAlign() {
-    // This group of text composables show different TextAligns: LEFT, RIGHT, CENTER, JUSTIFY, START for
+    // This group of text composables show different TextAligns: LEFT, RIGHT, CENTER, JUSTIFY, START
+    // for
     // LTR and RTL, END for LTR and RTL.
     var text = ""
     for (i in 1..10) {
@@ -498,19 +472,17 @@
         Text(
             modifier = Modifier.fillMaxWidth(),
             text = text,
-            style = TextStyle(
-                fontSize = fontSize8,
-                color = Color(0xFFFF0000)
-            )
+            style = TextStyle(fontSize = fontSize8, color = Color(0xFFFF0000))
         )
         Text(
             modifier = Modifier.fillMaxWidth(),
             text = text,
-            style = TextStyle(
-                fontSize = fontSize8,
-                color = Color(0xFF0000FF),
-                textAlign = TextAlign.Justify
-            )
+            style =
+                TextStyle(
+                    fontSize = fontSize8,
+                    color = Color(0xFF0000FF),
+                    textAlign = TextAlign.Justify
+                )
         )
 
         SecondTagLine(tag = "textAlign = TextAlign.Start for Ltr")
@@ -558,17 +530,13 @@
 @Composable
 fun TextDemoHyphens() {
     val text = "Transformation"
-    val textStyleHyphensOn = TextStyle(fontSize = fontSize8, color = Color.Red,
-        hyphens = Hyphens.Auto)
-    val textStyleHyphensOff = TextStyle(fontSize = fontSize8, color = Color.Blue,
-        hyphens = Hyphens.None)
+    val textStyleHyphensOn =
+        TextStyle(fontSize = fontSize8, color = Color.Red, hyphens = Hyphens.Auto)
+    val textStyleHyphensOff =
+        TextStyle(fontSize = fontSize8, color = Color.Blue, hyphens = Hyphens.None)
     Column {
         var width by remember { mutableFloatStateOf(30f) }
-        Slider(
-            value = width,
-            onValueChange = { width = it },
-            valueRange = 20f..400f
-        )
+        Slider(value = width, onValueChange = { width = it }, valueRange = 20f..400f)
         Column(Modifier.width(width.dp)) {
             Text(text = text, style = textStyleHyphensOn)
             Text(text = text, style = textStyleHyphensOff)
@@ -578,19 +546,14 @@
 
 @Composable
 fun TextDemoShadowEffect() {
-    val shadow = Shadow(
-        Color(0xFFE0A0A0),
-        Offset(5f, 5f),
-        blurRadius = 5.0f
-    )
+    val shadow = Shadow(Color(0xFFE0A0A0), Offset(5f, 5f), blurRadius = 5.0f)
     Text(
         style = TextStyle(fontSize = fontSize8),
-        text = buildAnnotatedString {
-            append("text with ")
-            withStyle(style = SpanStyle(shadow = shadow)) {
-                append("shadow!")
+        text =
+            buildAnnotatedString {
+                append("text with ")
+                withStyle(style = SpanStyle(shadow = shadow)) { append("shadow!") }
             }
-        }
     )
 }
 
@@ -598,14 +561,15 @@
 fun TextDemoFontSizeScale() {
     Text(
         style = TextStyle(fontSize = fontSize8),
-        text = buildAnnotatedString {
-            for (i in 4..12 step 4) {
-                val scale = i * 0.1f
-                withStyle(style = SpanStyle(fontSize = scale.em)) {
-                    append("fontSizeScale=$scale\n")
+        text =
+            buildAnnotatedString {
+                for (i in 4..12 step 4) {
+                    val scale = i * 0.1f
+                    withStyle(style = SpanStyle(fontSize = scale.em)) {
+                        append("fontSizeScale=$scale\n")
+                    }
                 }
             }
-        }
     )
 }
 
@@ -630,10 +594,7 @@
 
 @Composable
 fun TextOverflowVisibleInPopupDemo() {
-    Popup(
-        alignment = Alignment.Center,
-        properties = PopupProperties(clippingEnabled = false)
-    ) {
+    Popup(alignment = Alignment.Center, properties = PopupProperties(clippingEnabled = false)) {
         val text = "Line\n".repeat(10)
         Box(Modifier.background(Color.Magenta).size(100.dp)) {
             Text(text, fontSize = fontSize6, overflow = TextOverflow.Visible)
@@ -647,11 +608,8 @@
     val textMeasurer = rememberTextMeasurer()
     val text = "Line\n".repeat(10)
     Box(Modifier.fillMaxSize()) {
-        Canvas(Modifier
-            .graphicsLayer()
-            .align(Alignment.Center)
-            .background(Color.Green)
-            .size(100.dp)
+        Canvas(
+            Modifier.graphicsLayer().align(Alignment.Center).background(Color.Green).size(100.dp)
         ) {
             drawText(
                 textMeasurer = textMeasurer,
@@ -673,8 +631,7 @@
                 Text("TextOverflow", fontWeight = FontWeight.Bold)
                 overflowOptions.forEach {
                     Row(
-                        Modifier
-                            .fillMaxWidth()
+                        Modifier.fillMaxWidth()
                             .selectable(
                                 selected = (it == selectedOverflow),
                                 onClick = { selectedOverflow = it },
@@ -694,8 +651,7 @@
                 Text("Paragraph", fontWeight = FontWeight.Bold)
                 paragraphOptions.forEach {
                     Row(
-                        Modifier
-                            .fillMaxWidth()
+                        Modifier.fillMaxWidth()
                             .selectable(
                                 selected = (it == singleParagraph),
                                 onClick = { singleParagraph = it },
@@ -720,16 +676,17 @@
 @Composable
 private fun ColumnScope.TextOverflowDemo(singleParagraph: Boolean, textOverflow: TextOverflow) {
     Box(Modifier.weight(1f).fillMaxWidth()) {
-        val text = if (singleParagraph) {
-            AnnotatedString(longText)
-        } else {
-            buildAnnotatedString {
-                append(longText)
-                withStyle(ParagraphStyle(textAlign = TextAlign.End)) {
-                    append("This is a second paragraph.")
+        val text =
+            if (singleParagraph) {
+                AnnotatedString(longText)
+            } else {
+                buildAnnotatedString {
+                    append(longText)
+                    withStyle(ParagraphStyle(textAlign = TextAlign.End)) {
+                        append("This is a second paragraph.")
+                    }
                 }
             }
-        }
         Text(
             text = text,
             modifier = Modifier.align(Alignment.Center).background(Color.Magenta).size(100.dp),
@@ -742,30 +699,32 @@
 @Composable
 fun TextDemoInlineContent() {
     val inlineContentId = "box"
-    val inlineTextContent = InlineTextContent(
-        placeholder = Placeholder(
-            width = 5.em,
-            height = 1.em,
-            placeholderVerticalAlign = PlaceholderVerticalAlign.AboveBaseline
-        )
-    ) {
-        val colorAnimation = rememberInfiniteTransition()
-        val color by colorAnimation.animateColor(
-            initialValue = Color.Red,
-            targetValue = Color.Blue,
-            animationSpec = infiniteRepeatable(tween(1000), RepeatMode.Reverse)
-        )
-        Box(modifier = Modifier
-            .fillMaxSize()
-            .background(color))
-    }
+    val inlineTextContent =
+        InlineTextContent(
+            placeholder =
+                Placeholder(
+                    width = 5.em,
+                    height = 1.em,
+                    placeholderVerticalAlign = PlaceholderVerticalAlign.AboveBaseline
+                )
+        ) {
+            val colorAnimation = rememberInfiniteTransition()
+            val color by
+                colorAnimation.animateColor(
+                    initialValue = Color.Red,
+                    targetValue = Color.Blue,
+                    animationSpec = infiniteRepeatable(tween(1000), RepeatMode.Reverse)
+                )
+            Box(modifier = Modifier.fillMaxSize().background(color))
+        }
 
     Text(
-        text = buildAnnotatedString {
-            append("Here is a wide inline composable ")
-            appendInlineContent(inlineContentId)
-            append(" that is repeatedly changing its color.")
-        },
+        text =
+            buildAnnotatedString {
+                append("Here is a wide inline composable ")
+                appendInlineContent(inlineContentId)
+                append(" that is repeatedly changing its color.")
+            },
         inlineContent = mapOf(inlineContentId to inlineTextContent),
         modifier = Modifier.fillMaxWidth()
     )
@@ -773,11 +732,12 @@
     SecondTagLine(tag = "RTL Layout")
     CompositionLocalProvider(LocalLayoutDirection provides LayoutDirection.Rtl) {
         Text(
-            text = buildAnnotatedString {
-                append("Here is a wide inline composable ")
-                appendInlineContent(inlineContentId)
-                append(" that is repeatedly changing its color.")
-            },
+            text =
+                buildAnnotatedString {
+                    append("Here is a wide inline composable ")
+                    appendInlineContent(inlineContentId)
+                    append(" that is repeatedly changing its color.")
+                },
             inlineContent = mapOf(inlineContentId to inlineTextContent),
             modifier = Modifier.fillMaxWidth()
         )
@@ -785,22 +745,24 @@
 
     SecondTagLine(tag = "Bidi Text - LTR/RTL")
     Text(
-        text = buildAnnotatedString {
-            append("$displayText   ")
-            appendInlineContent(inlineContentId)
-            append("$displayTextArabic   ")
-        },
+        text =
+            buildAnnotatedString {
+                append("$displayText   ")
+                appendInlineContent(inlineContentId)
+                append("$displayTextArabic   ")
+            },
         inlineContent = mapOf(inlineContentId to inlineTextContent),
         modifier = Modifier.fillMaxWidth()
     )
 
     SecondTagLine(tag = "Bidi Text - RTL/LTR")
     Text(
-        text = buildAnnotatedString {
-            append("$displayTextArabic   ")
-            appendInlineContent(inlineContentId)
-            append("$displayText   ")
-        },
+        text =
+            buildAnnotatedString {
+                append("$displayTextArabic   ")
+                appendInlineContent(inlineContentId)
+                append("$displayText   ")
+            },
         inlineContent = mapOf(inlineContentId to inlineTextContent),
         modifier = Modifier.fillMaxWidth()
     )
@@ -867,26 +829,25 @@
         }
 
         val fontSize = 16.sp
-        val text = "This is a very-very " +
-            "long text that has a limited height and width to test how it's ellipsized." +
-            " This is a second sentence of the text."
+        val text =
+            "This is a very-very " +
+                "long text that has a limited height and width to test how it's ellipsized." +
+                " This is a second sentence of the text."
         val textWithSpans = buildAnnotatedString {
             withStyle(SpanStyle(fontSize = fontSize / 2)) {
                 append("This is a very-very long text that has ")
             }
-            withStyle(SpanStyle(fontSize = fontSize * 2)) {
-                append("a limited height")
-            }
+            withStyle(SpanStyle(fontSize = fontSize * 2)) { append("a limited height") }
             append(" and width to test how it's ellipsized. This is a second sentence of the text.")
         }
         Text(
             text = if (withSpans) textWithSpans else AnnotatedString(text),
             fontSize = fontSize,
             lineHeight = lineHeight.value,
-            modifier = Modifier
-                .background(Color.Magenta)
-                .width(200.dp)
-                .heightIn(max = heightRestriction.value),
+            modifier =
+                Modifier.background(Color.Magenta)
+                    .width(200.dp)
+                    .heightIn(max = heightRestriction.value),
             softWrap = softWrap,
             overflow = if (ellipsis) TextOverflow.Ellipsis else TextOverflow.Clip
         )
diff --git a/compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/text/ComposeTextAccessibility.kt b/compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/text/ComposeTextAccessibility.kt
index b9274b1..c87815d 100644
--- a/compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/text/ComposeTextAccessibility.kt
+++ b/compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/text/ComposeTextAccessibility.kt
@@ -34,50 +34,51 @@
     Column {
         TagLine("Text to speech with different locales.")
         Text(
-            text = buildAnnotatedString {
-                pushStyle(SpanStyle(localeList = LocaleList("en-us")))
-                append("Hello!\n")
-                pop()
-                pushStyle(SpanStyle(localeList = LocaleList("en-gb")))
-                append("Hello!\n")
-                pop()
-                pushStyle(SpanStyle(localeList = LocaleList("fr")))
-                append("Bonjour!\n")
-                pop()
-                pushStyle(SpanStyle(localeList = LocaleList("tr-TR")))
-                append("Merhaba!\n")
-                pop()
-                pushStyle(SpanStyle(localeList = LocaleList("ja-JP")))
-                append("こんにちは!\n")
-                pop()
-                pushStyle(SpanStyle(localeList = LocaleList("zh")))
-                append("你好!")
-                pop()
-            },
+            text =
+                buildAnnotatedString {
+                    pushStyle(SpanStyle(localeList = LocaleList("en-us")))
+                    append("Hello!\n")
+                    pop()
+                    pushStyle(SpanStyle(localeList = LocaleList("en-gb")))
+                    append("Hello!\n")
+                    pop()
+                    pushStyle(SpanStyle(localeList = LocaleList("fr")))
+                    append("Bonjour!\n")
+                    pop()
+                    pushStyle(SpanStyle(localeList = LocaleList("tr-TR")))
+                    append("Merhaba!\n")
+                    pop()
+                    pushStyle(SpanStyle(localeList = LocaleList("ja-JP")))
+                    append("こんにちは!\n")
+                    pop()
+                    pushStyle(SpanStyle(localeList = LocaleList("zh")))
+                    append("你好!")
+                    pop()
+                },
             style = TextStyle(fontSize = fontSize8)
         )
 
         TagLine("VerbatimTtsAnnotation ")
         Text(
-            text = buildAnnotatedString {
-                append("This word is read verbatim: ")
-                pushTtsAnnotation(VerbatimTtsAnnotation(verbatim = "hello"))
-                append("hello\n")
-                pop()
-                append("This word is read normally: hello")
-            },
+            text =
+                buildAnnotatedString {
+                    append("This word is read verbatim: ")
+                    pushTtsAnnotation(VerbatimTtsAnnotation(verbatim = "hello"))
+                    append("hello\n")
+                    pop()
+                    append("This word is read normally: hello")
+                },
             style = TextStyle(fontSize = fontSize8)
         )
 
         TagLine("LinkAnnotation")
         Text(
-            text = buildAnnotatedString {
-                append("This word is a link: ")
-                withLink(LinkAnnotation.Url("https://google.com")) {
-                    append("Google")
-                }
-                append("\nThis word is not a link: google.com")
-            },
+            text =
+                buildAnnotatedString {
+                    append("This word is a link: ")
+                    withLink(LinkAnnotation.Url("https://google.com")) { append("Google") }
+                    append("\nThis word is not a link: google.com")
+                },
             style = TextStyle(fontSize = fontSize8)
         )
     }
diff --git a/compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/text/ComposeTextOverflownSelection.kt b/compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/text/ComposeTextOverflownSelection.kt
index 422f01e..1613949 100644
--- a/compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/text/ComposeTextOverflownSelection.kt
+++ b/compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/text/ComposeTextOverflownSelection.kt
@@ -59,19 +59,15 @@
 fun TextOverflowedSelectionDemo() {
     var overflow by remember { mutableStateOf(TextOverflow.Clip) }
     val context = LocalContext.current
-    val clipboardManager = remember(context) {
-        context.getSystemService(CLIPBOARD_SERVICE) as ClipboardManager
-    }
+    val clipboardManager =
+        remember(context) { context.getSystemService(CLIPBOARD_SERVICE) as ClipboardManager }
     var copiedText by remember { mutableStateOf("") }
 
     DisposableEffect(clipboardManager) {
-        val listener = ClipboardManager.OnPrimaryClipChangedListener {
-            copiedText = clipboardManager.read()
-        }
+        val listener =
+            ClipboardManager.OnPrimaryClipChangedListener { copiedText = clipboardManager.read() }
         clipboardManager.addPrimaryClipChangedListener(listener)
-        onDispose {
-            clipboardManager.removePrimaryClipChangedListener(listener)
-        }
+        onDispose { clipboardManager.removePrimaryClipChangedListener(listener) }
     }
 
     SelectionContainer {
@@ -79,34 +75,29 @@
             Row(verticalAlignment = Alignment.CenterVertically) {
                 RadioButton(
                     selected = overflow == TextOverflow.Clip,
-                    onClick = { overflow = TextOverflow.Clip })
+                    onClick = { overflow = TextOverflow.Clip }
+                )
                 Text(text = "Clip")
                 Spacer(modifier = Modifier.width(8.dp))
                 RadioButton(
                     selected = overflow == TextOverflow.Ellipsis,
-                    onClick = { overflow = TextOverflow.Ellipsis })
+                    onClick = { overflow = TextOverflow.Ellipsis }
+                )
                 Text(text = "Ellipsis")
             }
-            DisableSelection {
-                Text(text = "Softwrap false, no maxLines")
-            }
+            DisableSelection { Text(text = "Softwrap false, no maxLines") }
             OverflowToggleText(
                 text = loremIpsum(Language.Latin, wordCount = 50),
-                modifier = Modifier
-                    .fillMaxWidth()
-                    .background(Color.Green),
+                modifier = Modifier.fillMaxWidth().background(Color.Green),
                 softWrap = false,
                 overflow = overflow
             )
-            DisableSelection {
-                Text(text = "Softwrap true, maxLines 1, in a row")
-            }
+            DisableSelection { Text(text = "Softwrap true, maxLines 1, in a row") }
             Row {
                 Box(modifier = Modifier.weight(1f), propagateMinConstraints = false) {
                     OverflowToggleText(
                         text = loremIpsum(Language.Latin, wordCount = 50),
-                        modifier = Modifier
-                            .background(Color.Green),
+                        modifier = Modifier.background(Color.Green),
                         overflow = overflow,
                         maxLines = 1
                     )
@@ -114,55 +105,40 @@
                 Box(modifier = Modifier.weight(1f), propagateMinConstraints = false) {
                     OverflowToggleText(
                         text = loremIpsum(Language.Latin, wordCount = 50),
-                        modifier = Modifier
-                            .background(Color.Green),
+                        modifier = Modifier.background(Color.Green),
                         overflow = overflow,
                         maxLines = 1
                     )
                 }
             }
-            DisableSelection {
-                Text(text = "Softwrap true, height constrained, in a row")
-            }
+            DisableSelection { Text(text = "Softwrap true, height constrained, in a row") }
             Row {
                 Box(modifier = Modifier.weight(1f), propagateMinConstraints = false) {
                     OverflowToggleText(
                         text = loremIpsum(Language.Latin, wordCount = 50),
-                        modifier = Modifier
-                            .background(Color.Green)
-                            .heightIn(max = 36.dp),
+                        modifier = Modifier.background(Color.Green).heightIn(max = 36.dp),
                         overflow = overflow
                     )
                 }
                 Box(modifier = Modifier.weight(1f), propagateMinConstraints = false) {
                     OverflowToggleText(
                         text = loremIpsum(Language.Latin, wordCount = 50),
-                        modifier = Modifier
-                            .background(Color.Green)
-                            .heightIn(max = 36.dp),
+                        modifier = Modifier.background(Color.Green).heightIn(max = 36.dp),
                         overflow = overflow
                     )
                 }
             }
-            DisableSelection {
-                Text(text = "Softwrap true, maxLines 1, half width")
-            }
+            DisableSelection { Text(text = "Softwrap true, maxLines 1, half width") }
             OverflowToggleText(
                 text = loremIpsum(Language.Latin, wordCount = 50),
-                modifier = Modifier
-                    .background(Color.Green)
-                    .fillMaxWidth(0.5f),
+                modifier = Modifier.background(Color.Green).fillMaxWidth(0.5f),
                 overflow = overflow,
                 maxLines = 1
             )
-            DisableSelection {
-                Text(text = "Softwrap true, maxLines 1")
-            }
+            DisableSelection { Text(text = "Softwrap true, maxLines 1") }
             OverflowToggleText(
                 text = loremIpsum(Language.Latin, wordCount = 50),
-                modifier = Modifier
-                    .fillMaxWidth()
-                    .background(Color.Red),
+                modifier = Modifier.fillMaxWidth().background(Color.Red),
                 maxLines = 1,
                 overflow = overflow
             )
@@ -174,12 +150,10 @@
                 )
             }
             OverflowToggleText(
-                text = loremIpsum(
-                    Language.Latin,
-                    wordCount = 3
-                ) + loremIpsum(Language.Arabic, wordCount = 20),
-                modifier = Modifier
-                    .fillMaxWidth(),
+                text =
+                    loremIpsum(Language.Latin, wordCount = 3) +
+                        loremIpsum(Language.Arabic, wordCount = 20),
+                modifier = Modifier.fillMaxWidth(),
                 maxLines = 1,
                 overflow = overflow
             )
@@ -219,14 +193,16 @@
     var toggleOverflow by remember(overflow) { mutableStateOf(overflow) }
     Text(
         text = text,
-        modifier = modifier.clickable {
-            toggleOverflow = when (toggleOverflow) {
-                TextOverflow.Clip -> TextOverflow.Ellipsis
-                TextOverflow.Ellipsis -> TextOverflow.Visible
-                TextOverflow.Visible -> TextOverflow.Clip
-                else -> TextOverflow.Clip
-            }
-        },
+        modifier =
+            modifier.clickable {
+                toggleOverflow =
+                    when (toggleOverflow) {
+                        TextOverflow.Clip -> TextOverflow.Ellipsis
+                        TextOverflow.Ellipsis -> TextOverflow.Visible
+                        TextOverflow.Visible -> TextOverflow.Clip
+                        else -> TextOverflow.Clip
+                    }
+            },
         color = color,
         fontSize = fontSize,
         fontStyle = fontStyle,
diff --git a/compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/text/ComposeTextPointerIcon.kt b/compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/text/ComposeTextPointerIcon.kt
index 18d950b..1896978 100644
--- a/compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/text/ComposeTextPointerIcon.kt
+++ b/compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/text/ComposeTextPointerIcon.kt
@@ -44,22 +44,25 @@
 import androidx.compose.ui.tooling.preview.Preview
 import androidx.compose.ui.unit.dp
 
-private enum class ParentOverride { None, Override, NoOverride }
+private enum class ParentOverride {
+    None,
+    Override,
+    NoOverride
+}
 
 @Preview
 @Composable
 fun TextPointerIconDemo() {
     Column(
-        modifier = Modifier
-            .padding(horizontal = 32.dp)
-            .verticalScroll(rememberScrollState()),
+        modifier = Modifier.padding(horizontal = 32.dp).verticalScroll(rememberScrollState()),
         verticalArrangement = Arrangement.spacedBy(16.dp),
     ) {
         Text(
             """The texts below demonstrate how different pointer hover icons work on
                 | different texts and text fields with different permutations of
                 | overrideDescendants."""
-                .trimMargin().replace("\n", "")
+                .trimMargin()
+                .replace("\n", "")
         )
         IconDemoRectangle(parentOverride = ParentOverride.None, textOverride = false)
         IconDemoRectangle(parentOverride = ParentOverride.None, textOverride = true)
@@ -72,19 +75,21 @@
 
 @Composable
 private fun IconDemoRectangle(parentOverride: ParentOverride, textOverride: Boolean) {
-    val rectanglePointerIconModifier = when (parentOverride) {
-        ParentOverride.None -> Modifier
-        else -> Modifier.pointerHoverIcon(
-            icon = PointerIcon.Hand,
-            overrideDescendants = parentOverride == ParentOverride.Override
-        )
-    }
+    val rectanglePointerIconModifier =
+        when (parentOverride) {
+            ParentOverride.None -> Modifier
+            else ->
+                Modifier.pointerHoverIcon(
+                    icon = PointerIcon.Hand,
+                    overrideDescendants = parentOverride == ParentOverride.Override
+                )
+        }
 
     Column(
-        modifier = Modifier
-            .then(rectanglePointerIconModifier)
-            .border(1.dp, Color.LightGray)
-            .padding(16.dp),
+        modifier =
+            Modifier.then(rectanglePointerIconModifier)
+                .border(1.dp, Color.LightGray)
+                .padding(16.dp),
         verticalArrangement = Arrangement.spacedBy(16.dp)
     ) {
         val annotatedString = buildAnnotatedString {
@@ -94,7 +99,6 @@
                     withStyle(SpanStyle(fontWeight = FontWeight.Bold)) { append("not") }
                     append(" set a pointer hover icon.")
                 }
-
                 else -> {
                     append("This box sets the hand pointer icon with ")
                     appendCode("overrideDescendants = ${parentOverride == ParentOverride.Override}")
@@ -120,13 +124,9 @@
 
         Text("Regular Text, icon crosshair", iconMod)
 
-        SelectionContainer {
-            Text("Selectable Text, icon not set", borderMod)
-        }
+        SelectionContainer { Text("Selectable Text, icon not set", borderMod) }
 
-        SelectionContainer {
-            Text("Selectable Text, icon crosshair", iconMod)
-        }
+        SelectionContainer { Text("Selectable Text, icon crosshair", iconMod) }
 
         var nonMod by remember { mutableStateOf("TextField, icon not set") }
         TextField(nonMod, { nonMod = it }, borderMod)
diff --git a/compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/text/ComposeTextSelection.kt b/compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/text/ComposeTextSelection.kt
index 5a6bb7f..807ecca 100644
--- a/compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/text/ComposeTextSelection.kt
+++ b/compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/text/ComposeTextSelection.kt
@@ -46,9 +46,7 @@
 import androidx.compose.ui.unit.dp
 import androidx.compose.ui.util.fastForEach
 
-val textBorderModifier = Modifier
-    .border(1.dp, Color.LightGray)
-    .padding(1.dp)
+val textBorderModifier = Modifier.border(1.dp, Color.LightGray).padding(1.dp)
 const val defaultText = "Line1\nLine2 text1 text2\nLine3"
 
 @Preview
@@ -58,20 +56,21 @@
         item {
             Text(
                 modifier = textBorderModifier,
-                text = buildAnnotatedString {
-                    appendWithColor(Color.Green, "Green")
-                    append(" borders represent a ")
-                    appendCode("SelectionContainer")
-                    append(". ")
-                    appendWithColor(Color.Red, "Red")
-                    append(" borders represent a ")
-                    appendCode("DisableSelection")
-                    append(". ")
-                    appendWithColor(Color.Gray, "Light gray")
-                    append(" borders represent a single ")
-                    appendCode("Text/BasicText")
-                    append(".")
-                },
+                text =
+                    buildAnnotatedString {
+                        appendWithColor(Color.Green, "Green")
+                        append(" borders represent a ")
+                        appendCode("SelectionContainer")
+                        append(". ")
+                        appendWithColor(Color.Red, "Red")
+                        append(" borders represent a ")
+                        appendCode("DisableSelection")
+                        append(". ")
+                        appendWithColor(Color.Gray, "Light gray")
+                        append(" borders represent a single ")
+                        appendCode("Text/BasicText")
+                        append(".")
+                    },
             )
         }
         item {
@@ -103,9 +102,10 @@
             OutlinedSelectionContainer {
                 Text(
                     text = "Hello World\nHello",
-                    modifier = Modifier.fillMaxWidth()
-                        .border(BorderStroke(1.dp, color = Color.Black))
-                        .height(80.dp)
+                    modifier =
+                        Modifier.fillMaxWidth()
+                            .border(BorderStroke(1.dp, color = Color.Black))
+                            .height(80.dp)
                 )
             }
         }
@@ -149,38 +149,40 @@
     OutlinedSelectionContainer {
         Text(
             modifier = textBorderModifier,
-            style = TextStyle(
-                color = Color(0xFFFF0000),
-                fontSize = fontSize6,
-                fontWeight = FontWeight.W200,
-                fontStyle = FontStyle.Italic
-            ),
-            text = buildAnnotatedString {
-                append(text = "$displayText   ")
-                append(text = "$displayTextArabic   ")
-                append(text = "$displayTextChinese   ")
+            style =
+                TextStyle(
+                    color = Color(0xFFFF0000),
+                    fontSize = fontSize6,
+                    fontWeight = FontWeight.W200,
+                    fontStyle = FontStyle.Italic
+                ),
+            text =
+                buildAnnotatedString {
+                    append(text = "$displayText   ")
+                    append(text = "$displayTextArabic   ")
+                    append(text = "$displayTextChinese   ")
 
-                withStyle(
-                    SpanStyle(
-                        color = Color(0xFF0000FF),
-                        fontSize = fontSize10,
-                        fontWeight = FontWeight.W800,
-                        fontStyle = FontStyle.Normal
-                    )
-                ) {
-                    append(displayTextHindi)
+                    withStyle(
+                        SpanStyle(
+                            color = Color(0xFF0000FF),
+                            fontSize = fontSize10,
+                            fontWeight = FontWeight.W800,
+                            fontStyle = FontStyle.Normal
+                        )
+                    ) {
+                        append(displayTextHindi)
+                    }
+
+                    append(text = arabicSentence)
+
+                    withStyle(SpanStyle(localeList = LocaleList("zh-CN"))) {
+                        append("\n先帝创业未半而中道崩殂，今天下三分，益州疲弊，此诚危急存亡之秋也。")
+                    }
+
+                    withStyle(SpanStyle(localeList = LocaleList("ja-JP"))) {
+                        append("\nまず、現在天下が魏・呉・蜀に分れており、そのうち蜀は疲弊していることを指摘する。")
+                    }
                 }
-
-                append(text = arabicSentence)
-
-                withStyle(SpanStyle(localeList = LocaleList("zh-CN"))) {
-                    append("\n先帝创业未半而中道崩殂，今天下三分，益州疲弊，此诚危急存亡之秋也。")
-                }
-
-                withStyle(SpanStyle(localeList = LocaleList("ja-JP"))) {
-                    append("\nまず、現在天下が魏・呉・蜀に分れており、そのうち蜀は疲弊していることを指摘する。")
-                }
-            }
         )
     }
 }
@@ -208,17 +210,18 @@
         text = "$text$displayText" + "\n"
     }
 
-    val colorList = listOf(
-        Color(0xFFFF0000),
-        Color(0xFF00FF00),
-        Color(0xFF0000FF),
-        Color(0xFF00FFFF),
-        Color(0xFFFF00FF),
-        Color(0xFFFFFF00),
-        Color(0xFF0000FF),
-        Color(0xFF00FF00),
-        Color(0xFFFF0000)
-    )
+    val colorList =
+        listOf(
+            Color(0xFFFF0000),
+            Color(0xFF00FF00),
+            Color(0xFF0000FF),
+            Color(0xFF00FFFF),
+            Color(0xFFFF00FF),
+            Color(0xFFFFFF00),
+            Color(0xFF0000FF),
+            Color(0xFF00FF00),
+            Color(0xFFFF0000)
+        )
 
     OutlinedSelectionContainer {
         Column(Modifier.fillMaxHeight()) {
@@ -228,11 +231,7 @@
                         Text(
                             text = text,
                             modifier = textBorderModifier,
-                            style = TextStyle(
-                                color = colorList[i * 3 + j],
-                                fontSize = fontSize6
-                            )
-
+                            style = TextStyle(color = colorList[i * 3 + j], fontSize = fontSize6)
                         )
                     }
                 }
@@ -290,32 +289,20 @@
 @Composable
 fun OutlinedSelectionContainer(modifier: Modifier = Modifier, content: @Composable () -> Unit) {
     SelectionContainer(
-        modifier = modifier
-            .border(1.dp, Color.Green)
-            .padding(1.dp),
+        modifier = modifier.border(1.dp, Color.Green).padding(1.dp),
         content = content
     )
 }
 
 @Composable
 fun OutlinedDisableSelection(content: @Composable () -> Unit) {
-    Box(
-        Modifier
-            .border(1.dp, Color.Red)
-            .padding(1.dp)
-    ) {
-        DisableSelection(content)
-    }
+    Box(Modifier.border(1.dp, Color.Red).padding(1.dp)) { DisableSelection(content) }
 }
 
 internal fun AnnotatedString.Builder.appendWithColor(color: Color, text: String) {
-    withStyle(SpanStyle(color = color)) {
-        append(text)
-    }
+    withStyle(SpanStyle(color = color)) { append(text) }
 }
 
 internal fun AnnotatedString.Builder.appendCode(text: String) {
-    withStyle(SpanStyle(fontFamily = FontFamily.Monospace)) {
-        append(text)
-    }
+    withStyle(SpanStyle(fontFamily = FontFamily.Monospace)) { append(text) }
 }
diff --git a/compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/text/ComposeTextSelectionSample.kt b/compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/text/ComposeTextSelectionSample.kt
index 9d63ed7..50f28e4 100644
--- a/compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/text/ComposeTextSelectionSample.kt
+++ b/compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/text/ComposeTextSelectionSample.kt
@@ -43,71 +43,58 @@
 val highlight = SpanStyle(background = Color(0xFFefefef))
 val rectColor = Color(0xFFffb74d)
 
-val langContent = listOf(
-    arrayOf(
-        "Jetpack يؤلف أساسيات",
-        "Jetpack Compose عبارة عن مجموعة أدوات حديثة لبناء واجهة مستخدم " +
-            "Android الأصلية. يعمل Jetpack Compose على تبسيط وتسريع " +
-            "تطوير واجهة المستخدم على نظام Android باستخدام " +
-            "رموز أقل وأدوات قوية وواجهات برمجة تطبيقات Kotlin البديهية."
-    ),
-    arrayOf(
-        "添加文本元素",
-        "Jetpack Compose是用于构建本机Android UI的现代工具包。 Jetpack " +
-            "Compose使用更少的代码，强大的工具和直观的Kotlin API简化并加速了Android上的UI开发。"
-    ),
-    arrayOf(
-        "एक पाठ तत्व जोड़ें",
-        "रचना योग्य कार्यों को केवल अन्य रचना कार्यों के " +
-            "दायरे में से बुलाया जा सकता है। किसी फंक्शन को " +
-            "कंपोजिटेबल बनाने के लिए, @ कम्\u200Dपोजिट " +
-            "एनोटेशन जोड़ें।"
-    ),
-    arrayOf(
-        "ข้อมูลพื้นฐานเกี่ยวกับการเขียน Jetpack",
-        "ฟังก์ชั่น Composable สามารถเรียกใช้ได้จากภายในขอบเขตของฟังก์ชั่นอื่น ๆ เท่านั้น " +
-            "ในการสร้างฟังก์ชั่นคอมโพสิตให้เพิ่มคำอธิบายประกอบ @Composable"
+val langContent =
+    listOf(
+        arrayOf(
+            "Jetpack يؤلف أساسيات",
+            "Jetpack Compose عبارة عن مجموعة أدوات حديثة لبناء واجهة مستخدم " +
+                "Android الأصلية. يعمل Jetpack Compose على تبسيط وتسريع " +
+                "تطوير واجهة المستخدم على نظام Android باستخدام " +
+                "رموز أقل وأدوات قوية وواجهات برمجة تطبيقات Kotlin البديهية."
+        ),
+        arrayOf(
+            "添加文本元素",
+            "Jetpack Compose是用于构建本机Android UI的现代工具包。 Jetpack " +
+                "Compose使用更少的代码，强大的工具和直观的Kotlin API简化并加速了Android上的UI开发。"
+        ),
+        arrayOf(
+            "एक पाठ तत्व जोड़ें",
+            "रचना योग्य कार्यों को केवल अन्य रचना कार्यों के " +
+                "दायरे में से बुलाया जा सकता है। किसी फंक्शन को " +
+                "कंपोजिटेबल बनाने के लिए, @ कम्\u200Dपोजिट " +
+                "एनोटेशन जोड़ें।"
+        ),
+        arrayOf(
+            "ข้อมูลพื้นฐานเกี่ยวกับการเขียน Jetpack",
+            "ฟังก์ชั่น Composable สามารถเรียกใช้ได้จากภายในขอบเขตของฟังก์ชั่นอื่น ๆ เท่านั้น " +
+                "ในการสร้างฟังก์ชั่นคอมโพสิตให้เพิ่มคำอธิบายประกอบ @Composable"
+        )
     )
-)
 
 @Composable
 fun TextSelectionSample() {
     SelectionContainer {
         LazyColumn(Modifier.padding(12.dp)) {
-            item {
-                Basics()
-            }
-            item {
-                AddTextElement()
-            }
-            items(langContent) {
-                MultiLanguage(it[0], it[1])
-            }
-            item {
-                Basics()
-            }
-            item {
-                MultiParagraph()
-            }
-            item {
-                AddTextElement()
-            }
+            item { Basics() }
+            item { AddTextElement() }
+            items(langContent) { MultiLanguage(it[0], it[1]) }
+            item { Basics() }
+            item { MultiParagraph() }
+            item { AddTextElement() }
         }
     }
 }
 
 @Composable
 private fun Basics() {
-    Text(
-        text = "Jetpack Compose Basics",
-        style = commonStyle.merge(header)
-    )
+    Text(text = "Jetpack Compose Basics", style = commonStyle.merge(header))
     Row {
         Box(Modifier.padding(8.dp).size(48.dp).background(rectColor))
         Text(
-            text = "Jetpack Compose is a modern toolkit for building native Android UI." +
-                " Jetpack Compose simplifies and accelerates UI development on Android " +
-                "with less code, powerful tools, and intuitive Kotlin APIs.",
+            text =
+                "Jetpack Compose is a modern toolkit for building native Android UI." +
+                    " Jetpack Compose simplifies and accelerates UI development on Android " +
+                    "with less code, powerful tools, and intuitive Kotlin APIs.",
             modifier = Modifier.weight(1f),
             style = commonStyle
         )
@@ -116,54 +103,44 @@
 
 @Composable
 private fun AddTextElement() {
-    Text(
-        text = "Add a text element",
-        style = commonStyle.merge(header2)
-    )
+    Text(text = "Add a text element", style = commonStyle.merge(header2))
     Row {
         Column(Modifier.weight(1f)) {
             Text(
-                text = buildAnnotatedString {
-                    append("To begin, follow the")
-                    withStyle(link) {
-                        append(" Jetpack Compose setup instructions ")
-                    }
-                    append(
-                        ", and create an app using the Empty Compose Activity template. Then " +
-                            "add a text element to your blank activity. You do this by " +
-                            "defining a content block, and calling the Text() function."
-                    )
-                },
+                text =
+                    buildAnnotatedString {
+                        append("To begin, follow the")
+                        withStyle(link) { append(" Jetpack Compose setup instructions ") }
+                        append(
+                            ", and create an app using the Empty Compose Activity template. Then " +
+                                "add a text element to your blank activity. You do this by " +
+                                "defining a content block, and calling the Text() function."
+                        )
+                    },
                 style = commonStyle
             )
         }
         Box(Modifier.padding(8.dp).size(48.dp).background(rectColor))
     }
-    Box(
-        Modifier
-            .padding(top = 20.dp, bottom = 20.dp)
-            .size(200.dp, 60.dp)
-            .background(rectColor)
-    )
+    Box(Modifier.padding(top = 20.dp, bottom = 20.dp).size(200.dp, 60.dp).background(rectColor))
     Text(
-        text = buildAnnotatedString {
-            withStyle(commonStyle.toSpanStyle()) {
-                append(
-                    "The setContent block defines the activity's layout. Instead of " +
-                        "defining the layout contents with an XML file, we call " +
-                        "composable functions. Jetpack Compose uses a custom " +
-                        "Kotlin compiler plugin to transform these composable " +
-                        "functions into the app's UI elements. For example, the"
-                )
-                withStyle(highlight) {
-                    append(" Text() ")
+        text =
+            buildAnnotatedString {
+                withStyle(commonStyle.toSpanStyle()) {
+                    append(
+                        "The setContent block defines the activity's layout. Instead of " +
+                            "defining the layout contents with an XML file, we call " +
+                            "composable functions. Jetpack Compose uses a custom " +
+                            "Kotlin compiler plugin to transform these composable " +
+                            "functions into the app's UI elements. For example, the"
+                    )
+                    withStyle(highlight) { append(" Text() ") }
+                    append(
+                        " function is defined by the Compose UI library; you call that " +
+                            "function to declare a text element in your app."
+                    )
                 }
-                append(
-                    " function is defined by the Compose UI library; you call that " +
-                        "function to declare a text element in your app."
-                )
             }
-        }
     )
 }
 
@@ -174,45 +151,37 @@
         style = commonStyle.merge(header2)
     )
     Text(
-        text = buildAnnotatedString {
-            withStyle(commonStyle.toSpanStyle()) {
-                withStyle(commonStyle.toParagraphStyle()) {
+        text =
+            buildAnnotatedString {
+                withStyle(commonStyle.toSpanStyle()) {
+                    withStyle(commonStyle.toParagraphStyle()) {
+                        append(
+                            "Composable functions can only be called from within the scope of " +
+                                "other composable functions. To make a function composable, add " +
+                                "the @Composable annotation. "
+                        )
+                    }
+                    withStyle(commonStyle.toParagraphStyle()) {
+                        append(
+                            "To try this out, define a Greeting() function which is passed a " +
+                                "name, and uses that name to configure the text element."
+                        )
+                    }
+                    withStyle(highlight) { append(" Text() ") }
                     append(
-                        "Composable functions can only be called from within the scope of " +
-                            "other composable functions. To make a function composable, add " +
-                            "the @Composable annotation. "
+                        " function is defined by the Compose UI library; you call that " +
+                            "function to declare a text element in your app."
                     )
                 }
-                withStyle(commonStyle.toParagraphStyle()) {
-                    append(
-                        "To try this out, define a Greeting() function which is passed a " +
-                            "name, and uses that name to configure the text element."
-                    )
-                }
-                withStyle(highlight) {
-                    append(" Text() ")
-                }
-                append(
-                    " function is defined by the Compose UI library; you call that " +
-                        "function to declare a text element in your app."
-                )
             }
-        }
     )
 }
 
 @Composable
 private fun MultiLanguage(title: String, content: String) {
-    Text(
-        text = title,
-        style = commonStyle.merge(header)
-    )
+    Text(text = title, style = commonStyle.merge(header))
     Row {
         Box(Modifier.padding(8.dp).size(48.dp).background(rectColor))
-        Text(
-            text = content,
-            modifier = Modifier.weight(1f),
-            style = commonStyle
-        )
+        Text(text = content, modifier = Modifier.weight(1f), style = commonStyle)
     }
 }
diff --git a/compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/text/ComposeTextSelectionScrollable.kt b/compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/text/ComposeTextSelectionScrollable.kt
index 0727e0e..132a14c 100644
--- a/compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/text/ComposeTextSelectionScrollable.kt
+++ b/compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/text/ComposeTextSelectionScrollable.kt
@@ -44,29 +44,26 @@
 @Composable
 fun TextScrollableColumnSelectionDemo() {
     val spacing = 16.dp
-    Column(
-        modifier = Modifier.padding(spacing),
-        verticalArrangement = spacedBy(spacing)
-    ) {
+    Column(modifier = Modifier.padding(spacing), verticalArrangement = spacedBy(spacing)) {
         Text(
-            text = "We expect that selection works, " +
-                "regardless of how many times each text goes in or out of view. " +
-                "The selection handles and text toolbar also should follow the selection " +
-                "when it is scrolled.",
+            text =
+                "We expect that selection works, " +
+                    "regardless of how many times each text goes in or out of view. " +
+                    "The selection handles and text toolbar also should follow the selection " +
+                    "when it is scrolled.",
             style = MaterialTheme.typography.body1.merge(),
         )
-        val (selectedOption, onOptionSelected) = remember {
-            mutableStateOf(Options.LongScrollableText)
-        }
+        val (selectedOption, onOptionSelected) =
+            remember { mutableStateOf(Options.LongScrollableText) }
         Column(Modifier.selectableGroup()) {
             Options.values().forEach { option ->
                 Row(
-                    modifier = Modifier
-                        .fillMaxWidth()
-                        .selectable(
-                            selected = option == selectedOption,
-                            onClick = { onOptionSelected(option) }
-                        ),
+                    modifier =
+                        Modifier.fillMaxWidth()
+                            .selectable(
+                                selected = option == selectedOption,
+                                onClick = { onOptionSelected(option) }
+                            ),
                     verticalAlignment = Alignment.CenterVertically,
                 ) {
                     RadioButton(
@@ -86,27 +83,35 @@
 
 @Suppress("unused") // enum values used in .values()
 private enum class Options(val displayText: String, val content: @Composable () -> Unit) {
-    LongScrollableText("Long Scrollable Single Text", {
-        MyText(
-            modifier = Modifier.verticalScroll(rememberScrollState()),
-            text = (0..100).joinToString(separator = "\n") { it.toString() },
-        )
-    }),
-    LongTextScrollableColumn("Long Single Text in Scrollable Column", {
-        Column(Modifier.verticalScroll(rememberScrollState())) {
-            MyText((0..100).joinToString(separator = "\n") { it.toString() })
+    LongScrollableText(
+        "Long Scrollable Single Text",
+        {
+            MyText(
+                modifier = Modifier.verticalScroll(rememberScrollState()),
+                text = (0..100).joinToString(separator = "\n") { it.toString() },
+            )
         }
-    }),
-    MultiTextScrollableColumn("Multiple Texts in Scrollable Column", {
-        Column(Modifier.verticalScroll(rememberScrollState())) {
-            repeat(100) { MyText(it.toString()) }
+    ),
+    LongTextScrollableColumn(
+        "Long Single Text in Scrollable Column",
+        {
+            Column(Modifier.verticalScroll(rememberScrollState())) {
+                MyText((0..100).joinToString(separator = "\n") { it.toString() })
+            }
         }
-    }),
-    MultiTextLazyColumn("Multiple Texts in LazyColumn", {
-        LazyColumn {
-            items(100) { MyText(it.toString()) }
+    ),
+    MultiTextScrollableColumn(
+        "Multiple Texts in Scrollable Column",
+        {
+            Column(Modifier.verticalScroll(rememberScrollState())) {
+                repeat(100) { MyText(it.toString()) }
+            }
         }
-    });
+    ),
+    MultiTextLazyColumn(
+        "Multiple Texts in LazyColumn",
+        { LazyColumn { items(100) { MyText(it.toString()) } } }
+    );
 
     @Composable
     fun Content() {
diff --git a/compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/text/DrawTextDemo.kt b/compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/text/DrawTextDemo.kt
index 1cbc9a2..6e32f3d 100644
--- a/compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/text/DrawTextDemo.kt
+++ b/compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/text/DrawTextDemo.kt
@@ -122,11 +122,7 @@
 @Composable
 fun DrawTextString() {
     val textMeasurer = rememberTextMeasurer()
-    Canvas(
-        Modifier
-            .fillMaxWidth()
-            .height(100.dp)
-    ) {
+    Canvas(Modifier.fillMaxWidth().height(100.dp)) {
         drawRect(brush = Brush.linearGradient(RainbowColors))
         val padding = 16.dp.toPx()
 
@@ -142,11 +138,7 @@
 @Composable
 fun DrawTextLongString() {
     val textMeasurer = rememberTextMeasurer()
-    Canvas(
-        Modifier
-            .fillMaxWidth()
-            .height(100.dp)
-    ) {
+    Canvas(Modifier.fillMaxWidth().height(100.dp)) {
         drawRect(color = Color.Gray)
         val padding = 16.dp.toPx()
 
@@ -156,10 +148,7 @@
             topLeft = Offset(padding, padding),
             style = TextStyle(fontSize = fontSize6),
             overflow = TextOverflow.Visible,
-            size = Size(
-                width = size.width - 2 * padding,
-                height = size.height - 2 * padding
-            )
+            size = Size(width = size.width - 2 * padding, height = size.height - 2 * padding)
         )
     }
 }
@@ -181,26 +170,24 @@
         Text(text = "Draw alignment lines")
     }
 
-    Canvas(
-        Modifier
-            .fillMaxWidth()
-            .height(200.dp)
-    ) {
+    Canvas(Modifier.fillMaxWidth().height(200.dp)) {
         drawRect(color = Color.Gray)
         val radius = 80.dp
 
         drawCircle(Color.Red, radius = radius.toPx())
 
-        val textLayoutResult = textMeasurer.measure(
-            AnnotatedString("Hello, World!"),
-            style = TextStyle(
-                color = Color.White,
-                fontSize = 24.sp,
-                textAlign = TextAlign.Center,
-                platformStyle = PlatformTextStyle(includeFontPadding = includeFontPadding)
-            ),
-            constraints = Constraints.fixedWidth((radius * 2).roundToPx())
-        )
+        val textLayoutResult =
+            textMeasurer.measure(
+                AnnotatedString("Hello, World!"),
+                style =
+                    TextStyle(
+                        color = Color.White,
+                        fontSize = 24.sp,
+                        textAlign = TextAlign.Center,
+                        platformStyle = PlatformTextStyle(includeFontPadding = includeFontPadding)
+                    ),
+                constraints = Constraints.fixedWidth((radius * 2).roundToPx())
+            )
 
         drawText(
             textLayoutResult,
@@ -238,19 +225,13 @@
     val text = remember {
         buildAnnotatedString {
             append("Hello World\n")
-            withStyle(
-                SpanStyle(brush = Brush.linearGradient(colors = RainbowColors))
-            ) {
+            withStyle(SpanStyle(brush = Brush.linearGradient(colors = RainbowColors))) {
                 append("Hello World")
             }
             append("\nHello World")
         }
     }
-    Canvas(
-        Modifier
-            .fillMaxWidth()
-            .height(100.dp)
-    ) {
+    Canvas(Modifier.fillMaxWidth().height(100.dp)) {
         drawRect(brush = Brush.linearGradient(RainbowColors))
         val padding = 16.dp.toPx()
 
@@ -266,19 +247,16 @@
     var textLayoutResult by remember { mutableStateOf<TextLayoutResult?>(null) }
 
     Canvas(
-        Modifier
-            .fillMaxWidth()
-            .height(100.dp)
-            .layout { measurable, constraints ->
-                val placeable = measurable.measure(constraints)
-                textLayoutResult = textMeasurer.measure(
+        Modifier.fillMaxWidth().height(100.dp).layout { measurable, constraints ->
+            val placeable = measurable.measure(constraints)
+            textLayoutResult =
+                textMeasurer.measure(
                     AnnotatedString("Hello, World!"),
                     style = TextStyle(fontSize = fontSize8)
                 )
-                layout(placeable.width, placeable.height) {
-                    placeable.placeRelative(0, 0)
-                }
-            }) {
+            layout(placeable.width, placeable.height) { placeable.placeRelative(0, 0) }
+        }
+    ) {
         drawRect(brush = Brush.linearGradient(RainbowColors))
         val padding = 16.dp.toPx()
 
@@ -286,61 +264,56 @@
     }
 }
 
-private val blendModes = listOf(
-    BlendMode.Clear,
-    BlendMode.Src,
-    BlendMode.Dst,
-    BlendMode.SrcOver,
-    BlendMode.DstOver,
-    BlendMode.SrcIn,
-    BlendMode.DstIn,
-    BlendMode.SrcOut,
-    BlendMode.DstOut,
-    BlendMode.SrcAtop,
-    BlendMode.DstAtop,
-    BlendMode.Xor,
-    BlendMode.Plus,
-    BlendMode.Modulate,
-    BlendMode.Screen,
-    BlendMode.Overlay,
-    BlendMode.Darken,
-    BlendMode.Lighten,
-    BlendMode.ColorDodge,
-    BlendMode.ColorBurn,
-    BlendMode.Hardlight,
-    BlendMode.Softlight,
-    BlendMode.Difference,
-    BlendMode.Exclusion,
-    BlendMode.Multiply,
-    BlendMode.Hue,
-    BlendMode.Saturation,
-    BlendMode.Color,
-    BlendMode.Luminosity,
-)
+private val blendModes =
+    listOf(
+        BlendMode.Clear,
+        BlendMode.Src,
+        BlendMode.Dst,
+        BlendMode.SrcOver,
+        BlendMode.DstOver,
+        BlendMode.SrcIn,
+        BlendMode.DstIn,
+        BlendMode.SrcOut,
+        BlendMode.DstOut,
+        BlendMode.SrcAtop,
+        BlendMode.DstAtop,
+        BlendMode.Xor,
+        BlendMode.Plus,
+        BlendMode.Modulate,
+        BlendMode.Screen,
+        BlendMode.Overlay,
+        BlendMode.Darken,
+        BlendMode.Lighten,
+        BlendMode.ColorDodge,
+        BlendMode.ColorBurn,
+        BlendMode.Hardlight,
+        BlendMode.Softlight,
+        BlendMode.Difference,
+        BlendMode.Exclusion,
+        BlendMode.Multiply,
+        BlendMode.Hue,
+        BlendMode.Saturation,
+        BlendMode.Color,
+        BlendMode.Luminosity,
+    )
 
 @Composable
 fun DrawTextBlendMode() {
     val textMeasurer = rememberTextMeasurer()
     var isExpanded by remember { mutableStateOf(false) }
     var blendModeState by remember { mutableStateOf(BlendMode.SrcOver) }
-    Button(onClick = { isExpanded = true }) {
-        Text("BlendMode: $blendModeState")
-    }
+    Button(onClick = { isExpanded = true }) { Text("BlendMode: $blendModeState") }
     DropdownMenu(expanded = isExpanded, onDismissRequest = { isExpanded = false }) {
         blendModes.forEach { blendMode ->
             DropdownMenuItem(onClick = { blendModeState = blendMode }) {
                 val weight = if (blendModeState == blendMode) FontWeight.Bold else FontWeight.Normal
-                Text(
-                    text = blendMode.toString(),
-                    fontWeight = weight
-                )
+                Text(text = blendMode.toString(), fontWeight = weight)
             }
         }
     }
     Box(
-        modifier = Modifier
-            .size(400.dp)
-            .drawBehind {
+        modifier =
+            Modifier.size(400.dp).drawBehind {
                 drawRect(color = Color.Red, size = Size(size.width / 2, size.height))
                 drawRect(
                     color = Color.Green,
@@ -354,20 +327,23 @@
                     blendMode = BlendMode.Clear
                 )
 
-                val textLayout = textMeasurer.measure(
-                    text = AnnotatedString("12 34"),
-                    style = TextStyle(
-                        brush = Brush.horizontalGradient(RainbowColors),
-                        fontSize = 220.sp,
-                        textAlign = TextAlign.Center,
-                        lineHeight = 180.sp,
-                        lineHeightStyle = LineHeightStyle(
-                            trim = LineHeightStyle.Trim.Both,
-                            alignment = LineHeightStyle.Alignment.Center
-                        )
-                    ),
-                    constraints = Constraints(maxWidth = size.width.roundToInt())
-                )
+                val textLayout =
+                    textMeasurer.measure(
+                        text = AnnotatedString("12 34"),
+                        style =
+                            TextStyle(
+                                brush = Brush.horizontalGradient(RainbowColors),
+                                fontSize = 220.sp,
+                                textAlign = TextAlign.Center,
+                                lineHeight = 180.sp,
+                                lineHeightStyle =
+                                    LineHeightStyle(
+                                        trim = LineHeightStyle.Trim.Both,
+                                        alignment = LineHeightStyle.Alignment.Center
+                                    )
+                            ),
+                        constraints = Constraints(maxWidth = size.width.roundToInt())
+                    )
                 drawText(textLayout, blendMode = blendModeState, topLeft = Offset(0f, -50f))
 
                 drawCircle(color = Color.White, radius = size.width / 6f, blendMode = BlendMode.Xor)
@@ -380,11 +356,12 @@
 @Composable
 fun DrawTextAndAnimateColor() {
     val infiniteTransition = rememberInfiniteTransition()
-    val color by infiniteTransition.animateColor(
-        initialValue = Color.Red,
-        targetValue = Color.Blue,
-        animationSpec = infiniteRepeatable(tween(3000), RepeatMode.Reverse)
-    )
+    val color by
+        infiniteTransition.animateColor(
+            initialValue = Color.Red,
+            targetValue = Color.Blue,
+            animationSpec = infiniteRepeatable(tween(3000), RepeatMode.Reverse)
+        )
 
     var skipCache by remember { mutableStateOf(false) }
     val textMeasurer = rememberTextMeasurer(cacheSize = if (skipCache) 0 else 16)
@@ -398,11 +375,7 @@
             Checkbox(checked = skipCache, onCheckedChange = { skipCache = it })
             Text(text = "Skip Cache")
         }
-        Canvas(
-            Modifier
-                .fillMaxWidth()
-                .height(100.dp)
-        ) {
+        Canvas(Modifier.fillMaxWidth().height(100.dp)) {
             drawRect(brush = Brush.linearGradient(RainbowColors))
             val padding = 16.dp.toPx()
 
@@ -424,11 +397,12 @@
     val textMeasurer = rememberTextMeasurer()
     var textLayoutResult by remember { mutableStateOf<TextLayoutResult?>(null) }
     val infiniteTransition = rememberInfiniteTransition()
-    val color by infiniteTransition.animateColor(
-        initialValue = Color.Red,
-        targetValue = Color.Blue,
-        animationSpec = infiniteRepeatable(tween(3000), RepeatMode.Reverse)
-    )
+    val color by
+        infiniteTransition.animateColor(
+            initialValue = Color.Red,
+            targetValue = Color.Blue,
+            animationSpec = infiniteRepeatable(tween(3000), RepeatMode.Reverse)
+        )
 
     var skipCache by remember { mutableStateOf(false) }
     val layoutMeasurer = remember(skipCache) { AverageDurationMeasurer() }
@@ -446,23 +420,20 @@
             Text(text = "Skip Cache")
         }
         Canvas(
-            Modifier
-                .fillMaxWidth()
-                .height(100.dp)
-                .layout { measurable, constraints ->
-                    val placeable = measurable.measure(constraints)
-                    val duration = measureNanoTime {
-                        textLayoutResult = textMeasurer.measure(
+            Modifier.fillMaxWidth().height(100.dp).layout { measurable, constraints ->
+                val placeable = measurable.measure(constraints)
+                val duration = measureNanoTime {
+                    textLayoutResult =
+                        textMeasurer.measure(
                             AnnotatedString("Hello, World!"),
                             style = TextStyle(fontSize = fontSize8),
                             skipCache = skipCache
                         )
-                    }
-                    layoutMeasurer.addMeasure(duration)
-                    layout(placeable.width, placeable.height) {
-                        placeable.placeRelative(0, 0)
-                    }
-                }) {
+                }
+                layoutMeasurer.addMeasure(duration)
+                layout(placeable.width, placeable.height) { placeable.placeRelative(0, 0) }
+            }
+        ) {
             drawRect(brush = Brush.linearGradient(RainbowColors))
             val padding = 16.dp.toPx()
 
@@ -486,11 +457,11 @@
         }
     }
 
-    val current = derivedStateOf {
-        if (values.isEmpty()) 0L else values.average().roundToLong()
-    }
+    val current = derivedStateOf { if (values.isEmpty()) 0L else values.average().roundToLong() }
 
-    val averageDurationFlow = snapshotFlow { current.value }.withIndex().map { (index, value) ->
-        if (index % 60 == 0) value else null
-    }.filterNotNull()
+    val averageDurationFlow =
+        snapshotFlow { current.value }
+            .withIndex()
+            .map { (index, value) -> if (index % 60 == 0) value else null }
+            .filterNotNull()
 }
diff --git a/compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/text/DropdownMenuSelection.kt b/compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/text/DropdownMenuSelection.kt
index 59aa40e..67f7a68 100644
--- a/compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/text/DropdownMenuSelection.kt
+++ b/compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/text/DropdownMenuSelection.kt
@@ -40,9 +40,7 @@
 @Composable
 fun DropdownMenuSelection() {
     Column(
-        modifier = Modifier
-            .fillMaxSize()
-            .padding(horizontal = 32.dp, vertical = 8.dp),
+        modifier = Modifier.fillMaxSize().padding(horizontal = 32.dp, vertical = 8.dp),
         verticalArrangement = Arrangement.spacedBy(16.dp),
     ) {
         Text(
@@ -85,9 +83,7 @@
     Button(onClick = { expanded = true }) { Text("DropdownMenu in SelectionContainer") }
     SelectionContainer {
         DropdownMenu(expanded = expanded, onDismissRequest = { expanded = false }) {
-            repeat(4) {
-                DropdownMenuItem(onClick = { expanded = false }) { Text("Item $it") }
-            }
+            repeat(4) { DropdownMenuItem(onClick = { expanded = false }) { Text("Item $it") } }
         }
     }
 }
@@ -99,9 +95,7 @@
     DropdownMenu(expanded = expanded, onDismissRequest = { expanded = false }) {
         SelectionContainer {
             Column {
-                repeat(4) {
-                    DropdownMenuItem(onClick = { expanded = false }) { Text("Item $it") }
-                }
+                repeat(4) { DropdownMenuItem(onClick = { expanded = false }) { Text("Item $it") } }
             }
         }
     }
diff --git a/compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/text/EllipsizeWithLetterSpacing.kt b/compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/text/EllipsizeWithLetterSpacing.kt
index d73e2a0..eeee538 100644
--- a/compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/text/EllipsizeWithLetterSpacing.kt
+++ b/compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/text/EllipsizeWithLetterSpacing.kt
@@ -45,28 +45,16 @@
 @Composable
 fun EllipsizeWithLetterSpacing() {
     SelectionContainer() {
-        Column(
-            Modifier
-                .padding(horizontal = 16.dp)
-                .verticalScroll(rememberScrollState())
-        ) {
-
-            for (textIndent in arrayOf(
-                TextIndent.None,
-                positiveTextIndent,
-                negativeTextIndent
-            )) {
-                for (text in arrayOf(
-                    displayText,
-                    displayTextArabic,
-                    displayTextBidi
-                )) {
-                    for (textAlign in arrayOf(
-                        TextAlign.Start,
-                        TextAlign.End,
-                        TextAlign.Center,
-                        TextAlign.Justify
-                    )) {
+        Column(Modifier.padding(horizontal = 16.dp).verticalScroll(rememberScrollState())) {
+            for (textIndent in arrayOf(TextIndent.None, positiveTextIndent, negativeTextIndent)) {
+                for (text in arrayOf(displayText, displayTextArabic, displayTextBidi)) {
+                    for (textAlign in
+                        arrayOf(
+                            TextAlign.Start,
+                            TextAlign.End,
+                            TextAlign.Center,
+                            TextAlign.Justify
+                        )) {
                         for (maxLines in arrayOf(1, 3)) {
                             SecondTagLine(
                                 "align=$textAlign, lines=$maxLines, " +
@@ -99,19 +87,21 @@
         text = text.repeat(100),
         maxLines = maxLines,
         overflow = TextOverflow.Ellipsis,
-        style = TextStyle(
-            fontSize = fontSize,
-            textAlign = textAlign,
-            letterSpacing = fontSize / 3,
-            textDirection = TextDirection.Content,
-            textIndent = textIndent
-        )
+        style =
+            TextStyle(
+                fontSize = fontSize,
+                textAlign = textAlign,
+                letterSpacing = fontSize / 3,
+                textDirection = TextDirection.Content,
+                textIndent = textIndent
+            )
     )
 }
 
-private fun TextIndent.toLabel() = when (this) {
-    TextIndent.None -> "None"
-    positiveTextIndent -> "Positive"
-    negativeTextIndent -> "Negative"
-    else -> toString()
-}
+private fun TextIndent.toLabel() =
+    when (this) {
+        TextIndent.None -> "None"
+        positiveTextIndent -> "Positive"
+        negativeTextIndent -> "Negative"
+        else -> toString()
+    }
diff --git a/compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/text/EmojiCompatDemo.kt b/compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/text/EmojiCompatDemo.kt
index 8f45f11..f267c4f 100644
--- a/compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/text/EmojiCompatDemo.kt
+++ b/compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/text/EmojiCompatDemo.kt
@@ -38,13 +38,12 @@
     val emoji12Flamingo = "\uD83E\uDDA9"
     val emoji11PartyingFace = "\uD83E\uDD73"
 
-    val text = "11: $emoji11PartyingFace 12: $emoji12Flamingo $emoji12HoldingHands " +
-        "13: $emoji13DisguisedFace $emoji13WomanFeedingBaby " +
-        "14: $emoji14MeltingFace"
+    val text =
+        "11: $emoji11PartyingFace 12: $emoji12Flamingo $emoji12HoldingHands " +
+            "13: $emoji13DisguisedFace $emoji13WomanFeedingBaby " +
+            "14: $emoji14MeltingFace"
 
-    Column(modifier = Modifier
-        .fillMaxSize()
-        .padding(16.dp)) {
+    Column(modifier = Modifier.fillMaxSize().padding(16.dp)) {
         Text(text = text, modifier = Modifier.padding(16.dp))
 
         val textFieldValue =
diff --git a/compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/text/FocusTextFieldImmediatelyDemo.kt b/compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/text/FocusTextFieldImmediatelyDemo.kt
index ba81b02..5017162 100644
--- a/compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/text/FocusTextFieldImmediatelyDemo.kt
+++ b/compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/text/FocusTextFieldImmediatelyDemo.kt
@@ -54,16 +54,12 @@
 
         if (launchedEffect) {
             val focusRequester = remember { FocusRequester() }
-            LaunchedEffect(focusRequester) {
-                focusRequester.requestFocus()
-            }
+            LaunchedEffect(focusRequester) { focusRequester.requestFocus() }
 
             TextField(
                 value,
                 onValueChange = { value = it },
-                modifier = Modifier
-                    .wrapContentSize()
-                    .focusRequester(focusRequester)
+                modifier = Modifier.wrapContentSize().focusRequester(focusRequester)
             )
         } else {
             val focusRequester = remember { FocusRequester() }
@@ -75,9 +71,7 @@
             TextField(
                 value,
                 onValueChange = { value = it },
-                modifier = Modifier
-                    .wrapContentSize()
-                    .focusRequester(focusRequester)
+                modifier = Modifier.wrapContentSize().focusRequester(focusRequester)
             )
         }
     }
diff --git a/compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/text/FontFamilyDemo.kt b/compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/text/FontFamilyDemo.kt
index 0b21ea8..138b8d8 100644
--- a/compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/text/FontFamilyDemo.kt
+++ b/compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/text/FontFamilyDemo.kt
@@ -66,9 +66,7 @@
 fun AsyncFontFamilyDemo() {
 
     var recreateFontFamily by remember { mutableIntStateOf(0) }
-    var showW800 by remember {
-        mutableStateOf(false)
-    }
+    var showW800 by remember { mutableStateOf(false) }
 
     // define three font fallback chains
     // 1. (Normal, Normal) has an optional font and two async fonts
@@ -80,54 +78,57 @@
     // this would typically be defined outside of composition, but we're doing it here to allow font
     // loading to restart. The DemoFonts above do not specify equals or  hashcode, so new instances
     // are never equal for caching.
-    val fontFamily = remember(recreateFontFamily) {
-        FontFamily(
-            // first font fails to load but is optional
-            Font(
-                DeviceFontFamilyName("A font that is not installed, on any device"),
-                FontWeight.Normal,
-                FontStyle.Normal
-            ),
-            // second font loads with a delay, is fallback for (Normal, Normal)
-            DemoAsyncFont(
-                FontWeight.Normal,
-                FontStyle.Normal,
-                delay = 2_000L,
-                typeface = Typeface.create("cursive", Typeface.NORMAL)
-            ),
-            // third (Normal, Normal) font is never matched, as previous font correctly loads, if
-            // previous font failed to load it would match next for (Normal, Normal)
-            DemoAsyncFont(FontWeight.Normal, FontStyle.Normal, delay = 500L),
-            // this is the fallback used during loading for (Normal, Normal)
-            DemoBlockingFont(FontWeight.Normal, FontStyle.Normal, Typeface.SERIF),
+    val fontFamily =
+        remember(recreateFontFamily) {
+            FontFamily(
+                // first font fails to load but is optional
+                Font(
+                    DeviceFontFamilyName("A font that is not installed, on any device"),
+                    FontWeight.Normal,
+                    FontStyle.Normal
+                ),
+                // second font loads with a delay, is fallback for (Normal, Normal)
+                DemoAsyncFont(
+                    FontWeight.Normal,
+                    FontStyle.Normal,
+                    delay = 2_000L,
+                    typeface = Typeface.create("cursive", Typeface.NORMAL)
+                ),
+                // third (Normal, Normal) font is never matched, as previous font correctly loads,
+                // if
+                // previous font failed to load it would match next for (Normal, Normal)
+                DemoAsyncFont(FontWeight.Normal, FontStyle.Normal, delay = 500L),
+                // this is the fallback used during loading for (Normal, Normal)
+                DemoBlockingFont(FontWeight.Normal, FontStyle.Normal, Typeface.SERIF),
 
-            // This font matches (W200, Normal), and will load on first use
-            DemoAsyncFont(
-                FontWeight.W200,
-                FontStyle.Normal,
-                delay = 500L,
-                Typeface.create("cursive", Typeface.NORMAL)
-            ),
+                // This font matches (W200, Normal), and will load on first use
+                DemoAsyncFont(
+                    FontWeight.W200,
+                    FontStyle.Normal,
+                    delay = 500L,
+                    Typeface.create("cursive", Typeface.NORMAL)
+                ),
 
-            // This font matches (W800, Normal), and will load on first use
-            DemoAsyncFont(
-                FontWeight.W800,
-                FontStyle.Normal,
-                delay = 500L,
-                typeface = Typeface.create("cursive", Typeface.BOLD)
-            ),
-            // Fallback for (W800, Normal)
-            Font(
-                DeviceFontFamilyName("A font that is not installed, on any device"),
-                FontWeight.W800,
-                FontStyle.Normal
+                // This font matches (W800, Normal), and will load on first use
+                DemoAsyncFont(
+                    FontWeight.W800,
+                    FontStyle.Normal,
+                    delay = 500L,
+                    typeface = Typeface.create("cursive", Typeface.BOLD)
+                ),
+                // Fallback for (W800, Normal)
+                Font(
+                    DeviceFontFamilyName("A font that is not installed, on any device"),
+                    FontWeight.W800,
+                    FontStyle.Normal
+                )
             )
-        )
-    }
+        }
     Column {
-        Text("This demo will load the fonts using fallback chains. Demo fonts descriptions" +
-            " are defined to not cache between loads of this screen, but typically will cache in" +
-            " production usage.",
+        Text(
+            "This demo will load the fonts using fallback chains. Demo fonts descriptions" +
+                " are defined to not cache between loads of this screen, but typically will cache in" +
+                " production usage.",
             color = Color.Gray
         )
         Spacer(Modifier.height(16.dp))
@@ -154,22 +155,12 @@
         TextField(
             value = "(W200, Normal) 500ms",
             onValueChange = {},
-            textStyle = TextStyle.Default.copy(
-                fontFamily = fontFamily,
-                fontWeight = FontWeight.W200
-            )
+            textStyle =
+                TextStyle.Default.copy(fontFamily = fontFamily, fontWeight = FontWeight.W200)
         )
-        Button(onClick = {
-            showW800 = !showW800
-        }) {
-            Text("Toggle W800 text")
-        }
+        Button(onClick = { showW800 = !showW800 }) { Text("Toggle W800 text") }
 
-        Button(onClick = {
-            recreateFontFamily++
-        }) {
-            Text("Restart font loading")
-        }
+        Button(onClick = { recreateFontFamily++ }) { Text("Restart font loading") }
     }
 }
 
@@ -188,10 +179,7 @@
         }
     }
 
-    override suspend fun awaitLoad(
-        context: Context,
-        font: AndroidFont
-    ): Typeface {
+    override suspend fun awaitLoad(context: Context, font: AndroidFont): Typeface {
         // delayed fonts take the specified delay
         font as DemoAsyncFont
         delay(font.delay)
@@ -209,18 +197,20 @@
 class DemoOptionalFont(
     override val weight: FontWeight,
     override val style: FontStyle,
-) : AndroidFont(
-    OptionalLocal,
-    ExampleAsyncFontTypefaceLoader,
-    FontVariation.Settings(weight, style)
-)
+) :
+    AndroidFont(
+        OptionalLocal,
+        ExampleAsyncFontTypefaceLoader,
+        FontVariation.Settings(weight, style)
+    )
 
 class DemoBlockingFont(
     override val weight: FontWeight,
     override val style: FontStyle,
     val typeface: Typeface
-) : AndroidFont(
-    OptionalLocal,
-    ExampleAsyncFontTypefaceLoader,
-    FontVariation.Settings(weight, style)
-)
+) :
+    AndroidFont(
+        OptionalLocal,
+        ExampleAsyncFontTypefaceLoader,
+        FontVariation.Settings(weight, style)
+    )
diff --git a/compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/text/FullScreenTextFieldDemo.kt b/compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/text/FullScreenTextFieldDemo.kt
index fa26f8f..833f459 100644
--- a/compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/text/FullScreenTextFieldDemo.kt
+++ b/compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/text/FullScreenTextFieldDemo.kt
@@ -35,8 +35,6 @@
     TextField(
         value,
         onValueChange = { value = it },
-        modifier = Modifier
-            .border(3.dp, MaterialTheme.colors.primary)
-            .fillMaxSize()
+        modifier = Modifier.border(3.dp, MaterialTheme.colors.primary).fillMaxSize()
     )
 }
diff --git a/compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/text/Hyperlinks.kt b/compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/text/Hyperlinks.kt
index 6530887..a3c1db7 100644
--- a/compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/text/Hyperlinks.kt
+++ b/compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/text/Hyperlinks.kt
@@ -74,38 +74,42 @@
 @Composable
 fun Hyperlinks() {
     Column(
-        modifier = Modifier
-            .wrapContentWidth(Alignment.CenterHorizontally)
-            .widthIn(max = 400.dp)
-            .verticalScroll(rememberScrollState())
-            .padding(10.dp),
+        modifier =
+            Modifier.wrapContentWidth(Alignment.CenterHorizontally)
+                .widthIn(max = 400.dp)
+                .verticalScroll(rememberScrollState())
+                .padding(10.dp),
         verticalArrangement = Arrangement.spacedBy(10.dp)
     ) {
         Sample("State-based styling through builder") {
-            BasicText(buildAnnotatedString {
-                append("Text and a ")
-                withLink(
-                    LinkAnnotation.Url(
-                        "https://developer.android.com",
-                        TextLinkStyles(
-                            style = SpanStyle(color = Color.Magenta),
-                            focusedStyle = SpanStyle(background = Color.Yellow.copy(alpha = 0.3f)),
-                            hoveredStyle = SpanStyle(textDecoration = TextDecoration.Underline),
-                            pressedStyle = SpanStyle(color = Color.Red)
+            BasicText(
+                buildAnnotatedString {
+                    append("Text and a ")
+                    withLink(
+                        LinkAnnotation.Url(
+                            "https://developer.android.com",
+                            TextLinkStyles(
+                                style = SpanStyle(color = Color.Magenta),
+                                focusedStyle =
+                                    SpanStyle(background = Color.Yellow.copy(alpha = 0.3f)),
+                                hoveredStyle = SpanStyle(textDecoration = TextDecoration.Underline),
+                                pressedStyle = SpanStyle(color = Color.Red)
+                            )
                         )
-                    )
-                ) {
-                    append("DEVELOPER ANDROID COM LINK")
+                    ) {
+                        append("DEVELOPER ANDROID COM LINK")
+                    }
+                    append(" immediately following.")
                 }
-                append(" immediately following.")
-            }
             )
         }
         Sample("State-based styling from Html-tagged string") {
-            val htmlString = """
+            val htmlString =
+                """
                 This is a <span style="color:red"><a href="https://developer.android.com">link</a></span> here.
                 Another <a href="https://developer.android.com">link</a> follows.
-            """.trimIndent()
+            """
+                    .trimIndent()
             val annotatedString = AnnotatedString.fromHtml(htmlString)
             BasicText(annotatedString)
         }
@@ -129,11 +133,13 @@
             BasicText(text = stringWithLink)
         }
         Sample("Material colors for links from builder") {
-            Text(buildAnnotatedString {
-                append("Text and ")
-                withLink(LinkAnnotation.Url(WebLink)) { append("developer.android.com") }
-                append(" link.")
-            })
+            Text(
+                buildAnnotatedString {
+                    append("Text and ")
+                    withLink(LinkAnnotation.Url(WebLink)) { append("developer.android.com") }
+                    append(" link.")
+                }
+            )
         }
         Sample("Material colors for links from html") {
             val htmlString =
@@ -161,37 +167,44 @@
             Text(text)
         }
         Sample("Link inside clickable text") {
-            Text(buildAnnotatedString {
-                append("Clickable text with a ")
-                withLink(LinkAnnotation.Url(WebLink)) { append("developer.android.com") }
-                append(" link.")
-            }, Modifier.clickable { })
+            Text(
+                buildAnnotatedString {
+                    append("Clickable text with a ")
+                    withLink(LinkAnnotation.Url(WebLink)) { append("developer.android.com") }
+                    append(" link.")
+                },
+                Modifier.clickable {}
+            )
         }
         Sample("Link inside selectable text") {
             SelectionContainer {
-                Text(buildAnnotatedString {
-                    append("Selectable text with a ")
-                    withLink(LinkAnnotation.Url(WebLink)) { append("developer.android.com") }
-                    append(" link.")
-                })
+                Text(
+                    buildAnnotatedString {
+                        append("Selectable text with a ")
+                        withLink(LinkAnnotation.Url(WebLink)) { append("developer.android.com") }
+                        append(" link.")
+                    }
+                )
             }
         }
         Sample("Link and inline content in text") {
             val fontSize = 20.sp
-            val inlineTextContent = InlineTextContent(
-                placeholder = Placeholder(fontSize, fontSize, PlaceholderVerticalAlign.Center)
-            ) {
-                Box(modifier = Modifier
-                    .fillMaxSize()
-                    .background(Color.Green))
-            }
-            Text(buildAnnotatedString {
-                append("A ")
-                appendInlineContent("box")
-                append(" inline content and a ")
-                withLink(LinkAnnotation.Url(WebLink)) { append("developer.android.com") }
-                append(" link.")
-            }, inlineContent = mapOf("box" to inlineTextContent))
+            val inlineTextContent =
+                InlineTextContent(
+                    placeholder = Placeholder(fontSize, fontSize, PlaceholderVerticalAlign.Center)
+                ) {
+                    Box(modifier = Modifier.fillMaxSize().background(Color.Green))
+                }
+            Text(
+                buildAnnotatedString {
+                    append("A ")
+                    appendInlineContent("box")
+                    append(" inline content and a ")
+                    withLink(LinkAnnotation.Url(WebLink)) { append("developer.android.com") }
+                    append(" link.")
+                },
+                inlineContent = mapOf("box" to inlineTextContent)
+            )
         }
         Sample("Invalid link not opened") {
             Text(
@@ -209,13 +222,9 @@
         }
         Sample("RTL text") {
             val text = buildAnnotatedString {
-                withLink(LinkAnnotation.Url(LongWebLink)) {
-                    append(loremIpsum(Language.Arabic, 2))
-                }
+                withLink(LinkAnnotation.Url(LongWebLink)) { append(loremIpsum(Language.Arabic, 2)) }
                 append(loremIpsum(Language.Arabic, 5))
-                withLink(LinkAnnotation.Url(LongWebLink)) {
-                    append(loremIpsum(Language.Arabic, 3))
-                }
+                withLink(LinkAnnotation.Url(LongWebLink)) { append(loremIpsum(Language.Arabic, 3)) }
                 append(loremIpsum(Language.Arabic, 5))
             }
             Text(text)
@@ -240,9 +249,10 @@
                     append("Click me")
                 }
             }
-            val saveableText = rememberSaveable(stateSaver = AnnotatedStringSaver(listener)) {
-                mutableStateOf(text)
-            }
+            val saveableText =
+                rememberSaveable(stateSaver = AnnotatedStringSaver(listener)) {
+                    mutableStateOf(text)
+                }
             Text(saveableText.value)
         }
         Sample("Link with listener - accessibility") {
@@ -263,74 +273,67 @@
     }
 }
 
-private class AnnotatedStringSaver(
-    private val linkInteractionListener: LinkInteractionListener?
-) : Saver<AnnotatedString, Any> {
+private class AnnotatedStringSaver(private val linkInteractionListener: LinkInteractionListener?) :
+    Saver<AnnotatedString, Any> {
     override fun SaverScope.save(value: AnnotatedString): Any? {
         // It will store LinkAnnotation ignoring the LinkInteractionListener that needs to be put
         // back manually after restoration
-        return with(AnnotatedString.Saver) {
-            save(value)
-        }
+        return with(AnnotatedString.Saver) { save(value) }
     }
 
     @OptIn(ExperimentalTextApi::class)
     @Suppress("UNCHECKED_CAST")
     @SuppressLint("NullAnnotationGroup")
     override fun restore(value: Any): AnnotatedString? {
-       with(AnnotatedString.Saver as Saver<AnnotatedString, Any>) {
-           val result = this.restore(value)
-           result?.let { text ->
-               // create a builder and copy over all styles
-               val builder = AnnotatedString.Builder(text.text)
-               text.spanStyles.fastForEach { builder.addStyle(it.item, it.start, it.end) }
-               text.paragraphStyles.fastForEach { builder.addStyle(it.item, it.start, it.end) }
-               // put annotations back apart from links
-               text.getStringAnnotations(0, text.length).fastForEach {
-                   builder.addStringAnnotation(it.tag, it.item, it.start, it.end)
-               }
-               text.getTtsAnnotations(0, text.length).fastForEach {
-                   builder.addTtsAnnotation(it.item, it.start, it.end)
-               }
-               // copy link annotations and apply the listener where needed
-               text.getLinkAnnotations(0, text.length).fastForEach { linkRange ->
-                   when (linkRange.item) {
-                       is LinkAnnotation.Url -> {
-                           // in our example we assume that we never provide listeners to the
-                           // LinkAnnotation.Url annotations. Therefore we restore
-                           // LinkAnnotation.Url annotations as is.
-                           builder.addLink(
-                               linkRange.item as LinkAnnotation.Url,
-                               linkRange.start,
-                               linkRange.end
-                           )
-                       }
-                       is LinkAnnotation.Clickable -> {
-                           val link = LinkAnnotation.Clickable(
-                               (linkRange.item as LinkAnnotation.Clickable).tag,
-                               linkRange.item.styles,
-                               linkInteractionListener
-                           )
-                           builder.addLink(link, linkRange.start, linkRange.end)
-                       }
-                   }
-               }
+        with(AnnotatedString.Saver as Saver<AnnotatedString, Any>) {
+            val result = this.restore(value)
+            result?.let { text ->
+                // create a builder and copy over all styles
+                val builder = AnnotatedString.Builder(text.text)
+                text.spanStyles.fastForEach { builder.addStyle(it.item, it.start, it.end) }
+                text.paragraphStyles.fastForEach { builder.addStyle(it.item, it.start, it.end) }
+                // put annotations back apart from links
+                text.getStringAnnotations(0, text.length).fastForEach {
+                    builder.addStringAnnotation(it.tag, it.item, it.start, it.end)
+                }
+                text.getTtsAnnotations(0, text.length).fastForEach {
+                    builder.addTtsAnnotation(it.item, it.start, it.end)
+                }
+                // copy link annotations and apply the listener where needed
+                text.getLinkAnnotations(0, text.length).fastForEach { linkRange ->
+                    when (linkRange.item) {
+                        is LinkAnnotation.Url -> {
+                            // in our example we assume that we never provide listeners to the
+                            // LinkAnnotation.Url annotations. Therefore we restore
+                            // LinkAnnotation.Url annotations as is.
+                            builder.addLink(
+                                linkRange.item as LinkAnnotation.Url,
+                                linkRange.start,
+                                linkRange.end
+                            )
+                        }
+                        is LinkAnnotation.Clickable -> {
+                            val link =
+                                LinkAnnotation.Clickable(
+                                    (linkRange.item as LinkAnnotation.Clickable).tag,
+                                    linkRange.item.styles,
+                                    linkInteractionListener
+                                )
+                            builder.addLink(link, linkRange.start, linkRange.end)
+                        }
+                    }
+                }
 
-               return builder.toAnnotatedString()
-           }
-           return null
+                return builder.toAnnotatedString()
+            }
+            return null
         }
     }
 }
 
 @Composable
 private fun Sample(title: String, content: @Composable () -> Unit) {
-    Column(
-        Modifier
-            .fillMaxWidth()
-            .border(2.dp, Color.Black)
-            .padding(8.dp)
-    ) {
+    Column(Modifier.fillMaxWidth().border(2.dp, Color.Black).padding(8.dp)) {
         Text(title, Modifier.align(Alignment.CenterHorizontally), fontWeight = FontWeight.Bold)
         content()
     }
diff --git a/compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/text/InteropTextFieldDemo.kt b/compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/text/InteropTextFieldDemo.kt
index f236c62..db71b19 100644
--- a/compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/text/InteropTextFieldDemo.kt
+++ b/compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/text/InteropTextFieldDemo.kt
@@ -47,9 +47,7 @@
         )
 
         Text("First EditText")
-        AndroidView(factory = {
-            EditText(it)
-        }, Modifier.fillMaxWidth())
+        AndroidView(factory = { EditText(it) }, Modifier.fillMaxWidth())
 
         Text("Second TextField")
         TextField(
@@ -60,8 +58,6 @@
         )
 
         Text("Second EditText")
-        AndroidView(factory = {
-            EditText(it)
-        }, Modifier.fillMaxWidth())
+        AndroidView(factory = { EditText(it) }, Modifier.fillMaxWidth())
     }
 }
diff --git a/compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/text/KeyboardSingleLineDemo.kt b/compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/text/KeyboardSingleLineDemo.kt
index d94de02..7b5a8bd 100644
--- a/compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/text/KeyboardSingleLineDemo.kt
+++ b/compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/text/KeyboardSingleLineDemo.kt
@@ -42,82 +42,63 @@
     val name: String,
 )
 
-private val ImeOptionsList = listOf(
-    ImeOptionsData(
-        singleLine = true,
-        keyboardOptions = KeyboardOptions(
-            keyboardType = KeyboardType.Text
+private val ImeOptionsList =
+    listOf(
+        ImeOptionsData(
+            singleLine = true,
+            keyboardOptions = KeyboardOptions(keyboardType = KeyboardType.Text),
+            name = "singleLine/Text"
         ),
-        name = "singleLine/Text"
-    ),
-    ImeOptionsData(
-        singleLine = false,
-        keyboardOptions = KeyboardOptions(
-            keyboardType = KeyboardType.Text
+        ImeOptionsData(
+            singleLine = false,
+            keyboardOptions = KeyboardOptions(keyboardType = KeyboardType.Text),
+            name = "multiLine/Text"
         ),
-        name = "multiLine/Text"
-    ),
-    ImeOptionsData(
-        singleLine = true,
-        keyboardOptions = KeyboardOptions(
-            keyboardType = KeyboardType.Text,
-            imeAction = ImeAction.Search
+        ImeOptionsData(
+            singleLine = true,
+            keyboardOptions =
+                KeyboardOptions(keyboardType = KeyboardType.Text, imeAction = ImeAction.Search),
+            name = "singleLine/Text/Search"
         ),
-        name = "singleLine/Text/Search"
-    ),
-    ImeOptionsData(
-        singleLine = false,
-        keyboardOptions = KeyboardOptions(
-            keyboardType = KeyboardType.Text,
-            imeAction = ImeAction.Search
+        ImeOptionsData(
+            singleLine = false,
+            keyboardOptions =
+                KeyboardOptions(keyboardType = KeyboardType.Text, imeAction = ImeAction.Search),
+            name = "multiLine/Text/Search"
         ),
-        name = "multiLine/Text/Search"
-    ),
-    ImeOptionsData(
-        singleLine = true,
-        keyboardOptions = KeyboardOptions(
-            keyboardType = KeyboardType.Number
+        ImeOptionsData(
+            singleLine = true,
+            keyboardOptions = KeyboardOptions(keyboardType = KeyboardType.Number),
+            name = "singleLine/Number"
         ),
-        name = "singleLine/Number"
-    ),
-    ImeOptionsData(
-        singleLine = false,
-        keyboardOptions = KeyboardOptions(
-            keyboardType = KeyboardType.Number
+        ImeOptionsData(
+            singleLine = false,
+            keyboardOptions = KeyboardOptions(keyboardType = KeyboardType.Number),
+            name = "multiLine/Number"
         ),
-        name = "multiLine/Number"
-    ),
-    ImeOptionsData(
-        singleLine = true,
-        keyboardOptions = KeyboardOptions(
-            keyboardType = KeyboardType.Number,
-            imeAction = ImeAction.Send
+        ImeOptionsData(
+            singleLine = true,
+            keyboardOptions =
+                KeyboardOptions(keyboardType = KeyboardType.Number, imeAction = ImeAction.Send),
+            name = "singleLine/Number/Send"
         ),
-        name = "singleLine/Number/Send"
-    ),
-    ImeOptionsData(
-        singleLine = false,
-        keyboardOptions = KeyboardOptions(
-            keyboardType = KeyboardType.Number,
-            imeAction = ImeAction.Send
+        ImeOptionsData(
+            singleLine = false,
+            keyboardOptions =
+                KeyboardOptions(keyboardType = KeyboardType.Number, imeAction = ImeAction.Send),
+            name = "multiLine/Number/Send"
         ),
-        name = "multiLine/Number/Send"
-    ),
-    ImeOptionsData(
-        singleLine = true,
-        keyboardOptions = KeyboardOptions(
-            keyboardType = KeyboardType.Decimal
+        ImeOptionsData(
+            singleLine = true,
+            keyboardOptions = KeyboardOptions(keyboardType = KeyboardType.Decimal),
+            name = "singleLine/Decimal"
         ),
-        name = "singleLine/Decimal"
-    ),
-    ImeOptionsData(
-        singleLine = false,
-        keyboardOptions = KeyboardOptions(
-            keyboardType = KeyboardType.Decimal
-        ),
-        name = "multiLine/Decimal"
+        ImeOptionsData(
+            singleLine = false,
+            keyboardOptions = KeyboardOptions(keyboardType = KeyboardType.Decimal),
+            name = "multiLine/Decimal"
+        )
     )
-)
 
 @Preview
 @Composable
@@ -134,9 +115,8 @@
 @Composable
 private fun MyTextField(data: ImeOptionsData) {
     val keyboardController = LocalSoftwareKeyboardController.current
-    val state = rememberSaveable(stateSaver = TextFieldValue.Saver) {
-        mutableStateOf(TextFieldValue())
-    }
+    val state =
+        rememberSaveable(stateSaver = TextFieldValue.Saver) { mutableStateOf(TextFieldValue()) }
     BasicTextField(
         modifier = demoTextFieldModifiers.defaultMinSize(100.dp),
         value = state.value,
diff --git a/compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/text/LastClippedCharacterDemo.kt b/compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/text/LastClippedCharacterDemo.kt
index fcd5d96..d7310b7 100644
--- a/compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/text/LastClippedCharacterDemo.kt
+++ b/compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/text/LastClippedCharacterDemo.kt
@@ -51,53 +51,55 @@
     var overflow by remember { mutableStateOf(false) }
     var height by remember { mutableIntStateOf(20) }
     Column {
-        Box(modifier = Modifier
-            .width(100.dp)
-            .height(height.dp)
-            .border(1.dp, Color.Red)) {
+        Box(modifier = Modifier.width(100.dp).height(height.dp).border(1.dp, Color.Red)) {
             BasicText(
                 text = "Lorem ipsum dolor sit amet, consectetur adipiscing elit",
-                overflow = if (!overflow) { TextOverflow.Clip } else { TextOverflow.Visible },
-                modifier = Modifier.drawWithContent {
-                    drawContent()
-                    lastCharacterBox?.let { box ->
-                        drawRoundRect(
-                            Color.Green,
-                            box.topLeft,
-                            box.size,
-                            CornerRadius(4f, 4f),
-                            Stroke(2f)
-                        )
-                    }
-                },
+                overflow =
+                    if (!overflow) {
+                        TextOverflow.Clip
+                    } else {
+                        TextOverflow.Visible
+                    },
+                modifier =
+                    Modifier.drawWithContent {
+                        drawContent()
+                        lastCharacterBox?.let { box ->
+                            drawRoundRect(
+                                Color.Green,
+                                box.topLeft,
+                                box.size,
+                                CornerRadius(4f, 4f),
+                                Stroke(2f)
+                            )
+                        }
+                    },
                 onTextLayout = { textLayoutResult ->
                     val lastNonClippedLine = textLayoutResult.findLastNonClippedLine()
                     // this finds the newline
-                    val actualLastCharacter = textLayoutResult
-                        .getOffsetForPosition(
+                    val actualLastCharacter =
+                        textLayoutResult.getOffsetForPosition(
                             Offset(
                                 textLayoutResult.size.width.toFloat(),
                                 textLayoutResult.lineVerticalMiddle(lastNonClippedLine),
-                            ))
-                    lastCharacterBox = textLayoutResult.getBoundingBox(actualLastCharacter)
-                        .translate(Offset(0f, textLayoutResult.getLineTop(lastNonClippedLine)))
+                            )
+                        )
+                    lastCharacterBox =
+                        textLayoutResult
+                            .getBoundingBox(actualLastCharacter)
+                            .translate(Offset(0f, textLayoutResult.getLineTop(lastNonClippedLine)))
                 },
             )
         }
         Spacer(modifier = Modifier.height(200.dp))
-        Button(onClick = { overflow = !overflow }) {
-            Text("Show overflow")
-        }
-        Button(onClick = { height += 5 }) {
-            Text("Increase clip height (5)")
-        }
-        Button(onClick = { height = 2 }) {
-            Text("Reset height (+5)")
-        }
+        Button(onClick = { overflow = !overflow }) { Text("Show overflow") }
+        Button(onClick = { height += 5 }) { Text("Increase clip height (5)") }
+        Button(onClick = { height = 2 }) { Text("Reset height (+5)") }
 
         Text("For more information see b/319500907")
-        Text("Note that this demo considers a line non-clipped when any pixel of the line is" +
-            " not clipped, change the logic in findLastNonClippedLine to fit your needs")
+        Text(
+            "Note that this demo considers a line non-clipped when any pixel of the line is" +
+                " not clipped, change the logic in findLastNonClippedLine to fit your needs"
+        )
     }
 }
 
diff --git a/compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/text/LetterSpacingDemo.kt b/compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/text/LetterSpacingDemo.kt
index 045a0c1..236119b 100644
--- a/compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/text/LetterSpacingDemo.kt
+++ b/compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/text/LetterSpacingDemo.kt
@@ -37,12 +37,11 @@
 import androidx.compose.ui.unit.sp
 
 private const val text = "The quick brown fox jumps over the lazy dog"
+
 @Preview
 @Composable
 fun LetterSpacingDemo() {
-    Column(
-        Modifier.padding(horizontal = 16.dp)
-    ) {
+    Column(Modifier.padding(horizontal = 16.dp)) {
         var letterSpacing: Float by remember { mutableFloatStateOf(0.0f) }
         var fontSize: Float by remember { mutableFloatStateOf(12f) }
 
@@ -53,11 +52,7 @@
             valueRange = -100f..100f,
         )
         Text("fontSize: ${fontSize.toString().take(4)}.sp")
-        Slider(
-            value = fontSize,
-            onValueChange = { fontSize = it },
-            valueRange = 5f..100f
-        )
+        Slider(value = fontSize, onValueChange = { fontSize = it }, valueRange = 5f..100f)
         AnnotatedText(letterSpacing, fontSize)
     }
 }
@@ -66,13 +61,16 @@
 fun AnnotatedText(letterSpacing: Float, fontSize: Float) {
     var textLayoutResult: TextLayoutResult? by remember { mutableStateOf(null) }
     Row(horizontalArrangement = Arrangement.End, modifier = Modifier.fillMaxWidth()) {
-        Text(text,
-            modifier = Modifier
-                .fillMaxWidth(0.5f) /* only half the screen, to allow negative em */
-                .drawTextMetrics(textLayoutResult, null),
-            style = LocalTextStyle.current.copy(
-                letterSpacing = letterSpacing.sp,
-                fontSize = fontSize.sp),
+        Text(
+            text,
+            modifier =
+                Modifier.fillMaxWidth(0.5f) /* only half the screen, to allow negative em */
+                    .drawTextMetrics(textLayoutResult, null),
+            style =
+                LocalTextStyle.current.copy(
+                    letterSpacing = letterSpacing.sp,
+                    fontSize = fontSize.sp
+                ),
             onTextLayout = { textLayoutResult = it }
         )
     }
diff --git a/compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/text/LineBreakDemo.kt b/compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/text/LineBreakDemo.kt
index f62350d..96c6db3 100644
--- a/compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/text/LineBreakDemo.kt
+++ b/compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/text/LineBreakDemo.kt
@@ -41,16 +41,18 @@
 import androidx.compose.ui.unit.dp
 import androidx.compose.ui.unit.sp
 
-private val lineBreakOptions = listOf(
-    "Simple" to LineBreak.Simple,
-    "Paragraph" to LineBreak.Paragraph,
-    "Heading" to LineBreak.Heading,
-    "Custom" to LineBreak(
-        strategy = LineBreak.Strategy.Balanced,
-        strictness = LineBreak.Strictness.Strict,
-        wordBreak = LineBreak.WordBreak.Default
+private val lineBreakOptions =
+    listOf(
+        "Simple" to LineBreak.Simple,
+        "Paragraph" to LineBreak.Paragraph,
+        "Heading" to LineBreak.Heading,
+        "Custom" to
+            LineBreak(
+                strategy = LineBreak.Strategy.Balanced,
+                strictness = LineBreak.Strictness.Strict,
+                wordBreak = LineBreak.WordBreak.Default
+            )
     )
-)
 
 private val demoText = "This is an example text\n今日は自由が丘で焼き鳥を食べます。"
 private val presetNameStyle = SpanStyle(fontWeight = FontWeight.Bold, fontSize = 16.sp)
@@ -68,24 +70,20 @@
         )
 
         Row(Modifier.fillMaxWidth()) {
-            val textModifier = Modifier
-                .wrapContentHeight()
-                .padding(horizontal = 5.dp)
-                .border(1.dp, Color.Gray)
+            val textModifier =
+                Modifier.wrapContentHeight().padding(horizontal = 5.dp).border(1.dp, Color.Gray)
 
             lineBreakOptions.forEach { (presetName, preset) ->
                 Text(
-                    text = buildAnnotatedString {
-                        withStyle(presetNameStyle) {
-                            append(presetName)
-                            append(":\n")
-                        }
-                        append(demoText)
-                    },
-                    style = TextStyle(
-                        lineBreak = preset,
-                        fontSize = selectedFontSize.sp
-                    ),
+                    text =
+                        buildAnnotatedString {
+                            withStyle(presetNameStyle) {
+                                append(presetName)
+                                append(":\n")
+                            }
+                            append(demoText)
+                        },
+                    style = TextStyle(lineBreak = preset, fontSize = selectedFontSize.sp),
                     modifier = textModifier.weight(1f)
                 )
             }
diff --git a/compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/text/LoremIpsum.kt b/compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/text/LoremIpsum.kt
index 62c54c3..87fd124 100644
--- a/compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/text/LoremIpsum.kt
+++ b/compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/text/LoremIpsum.kt
@@ -31,14 +31,12 @@
 ): String =
     loremIpsumWords(language).joinToString(separator = separator, limit = wordCount, truncated = "")
 
-/**
- * An infinite [Sequence] of words of Lorem Ipsum text.
- */
-fun loremIpsumWords(
-    language: Language = Language.Latin
-): Sequence<String> = generateSequence { language.words.asSequence() }.flatten()
+/** An infinite [Sequence] of words of Lorem Ipsum text. */
+fun loremIpsumWords(language: Language = Language.Latin): Sequence<String> =
+    generateSequence { language.words.asSequence() }.flatten()
 
-private val LatinLipsum = """
+private val LatinLipsum =
+    """
     Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque a egestas nisi. Aenean
     aliquam neque lacus, ac sollicitudin risus consequat in. Pellentesque habitant morbi tristique
     senectus et netus et malesuada fames ac turpis egestas. In id nulla quam. Ut lobortis justo
@@ -77,9 +75,11 @@
     eleifend efficitur. Curabitur accumsan vestibulum ligula sed aliquet. Nulla pretium dui id
     nunc ultricies, id porttitor lorem pretium. Lorem ipsum dolor sit amet, consectetur
     adipiscing elit.
-""".trimIndent()
+"""
+        .trimIndent()
 
-private val ArabicLipsum = """
+private val ArabicLipsum =
+    """
     وبحلول التخطيط بلا عل. لأداء المنتصر عسكرياً لكل أن, أخذ ثانية عرفها و. شيء من قدما الجو بخطوط,
     تم لها بحشد كثيرة الأولية, إذ أواخر الشتاء، الكونجرس عدد. عل العصبة للأراضي عدد, بـ تلك هامش
     اعتداء وإيطالي. فصل أم العالم المعاهدات.
@@ -90,9 +90,11 @@
     ٣٠ صفحة فاتّبع الكونجرس لها, بحق ضمنها الإنذار، و. تم لعدم الإنزال الأهداف ذلك, غضون تجهيز عن
     جهة. الذود الأسيوي ٣٠ حيث, دار بل بزمام أثره، المواد, تم الدّفاع الأوروبية شيء. مواقعها مليارات
     وتم ٣٠. كما جنوب مكثّفة الإمداد عن, من أضف وحتّى الخاسر الإحتفاظ.
-""".trimIndent()
+"""
+        .trimIndent()
 
-private val HebrewLipsum = """
+private val HebrewLipsum =
+    """
     גם לכאן הבהרה בהשחתה היא. גם בדף דרכה ביוטכנולוגיה, אם כלל עמוד בקרבת רומנית, בהבנה לעריכה
     שתי גם. או הספרות הנאמנים ויקימדיה עוד. דת דפים הגולשות רבה. והנדסה לחיבור תחבורה תנך אם. בה
     אתה כלים אחרים וקשקש. של לכאן החופשית ארץ.
@@ -103,4 +105,5 @@
     ישראל בקלות לטיפול בה שמו. שנתי בגרסה האנציקלופדיה זכר של, של חשמל לימודים האטמוספירה מתן, לוח
     על ובמתן קישורים עקרונות. סדר את החול רוסית, תנך למנוע ברוכים דת, מדע אל ניווט ניהול והנדסה.
     בה צעד בקלות אנגלית שימושיים. על ערכים נבחרים הספרות כדי, ארץ ליום טיפול ברוכים מה.
-""".trimIndent()
+"""
+        .trimIndent()
diff --git a/compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/text/MemoryAllocs.kt b/compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/text/MemoryAllocs.kt
index 5e2b764..c858f2e 100644
--- a/compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/text/MemoryAllocs.kt
+++ b/compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/text/MemoryAllocs.kt
@@ -36,6 +36,7 @@
 import androidx.compose.ui.unit.sp
 
 private val style = TextStyle.Default
+
 /**
  * These demos are for using the memory profiler to observe initial compo and recompo memory
  * pressure.
@@ -45,11 +46,13 @@
 @Composable
 fun MemoryAllocsSetText() {
     Column {
-        Preamble("""
+        Preamble(
+            """
             @Composable
             fun SetText(text: State<String>) {
                 Text(text.value)
-            }""".trimIndent()
+            }"""
+                .trimIndent()
         )
         SetText(textToggler())
     }
@@ -64,13 +67,15 @@
 @Composable
 fun MemoryAllocsIfNotEmptyText() {
     Column {
-        Preamble("""
+        Preamble(
+            """
             @Composable
             fun IfNotEmptyText(text: State<String>) {
                 if (text.value.isNotEmpty()) {
                     Text(text.value)
                 }
-            }""".trimIndent()
+            }"""
+                .trimIndent()
         )
         IfNotEmptyText(textToggler())
     }
@@ -80,9 +85,12 @@
 fun MemoryAllocsLazyList() {
     val states = produceLazyListReuseDriver()
     Column {
-        Preamble(sourceCode = """
+        Preamble(
+            sourceCode =
+                """
                 item { Text("Some static text") }
-            """.trimIndent()
+            """
+                    .trimIndent()
         )
         LazyListReuse(states)
     }
@@ -91,28 +99,21 @@
 @Composable
 fun Preamble(sourceCode: String) {
     Text("Run in memory profiler to emulate text behavior during observable loads")
-    Text(text = sourceCode,
-        modifier = Modifier
-            .fillMaxWidth()
-            .background(Color(220, 230, 240)),
+    Text(
+        text = sourceCode,
+        modifier = Modifier.fillMaxWidth().background(Color(220, 230, 240)),
         fontFamily = FontFamily.Monospace,
         color = Color(41, 17, 27),
         fontSize = 10.sp
     )
-    Divider(
-        Modifier
-            .fillMaxWidth()
-            .padding(vertical = 8.dp))
+    Divider(Modifier.fillMaxWidth().padding(vertical = 8.dp))
     Text("\uD83D\uDC47 running here \uD83D\uDC47")
 }
 
 @Composable
 fun IfNotEmptyText(text: State<String>) {
     if (text.value.isNotEmpty()) {
-        Text(
-            text.value,
-            style = style
-        )
+        Text(text.value, style = style)
     }
 }
 
@@ -121,11 +122,7 @@
     // this emulates what a LazyList does during reuse
     ReusableContentHost(active.value.first) {
         ReusableContent(active.value.second) {
-            Text(
-                "Some static text",
-                style = style,
-                modifier = Modifier.fillMaxWidth()
-            )
+            Text("Some static text", style = style, modifier = Modifier.fillMaxWidth())
         }
     }
 }
@@ -136,28 +133,32 @@
 }
 
 @Composable
-private fun textToggler(): State<String> = produceState("") {
-    while (true) {
-        withFrameMillis {
-            value = if (value.isEmpty()) {
-                "This text and empty string swap every frame"
-            } else {
-                ""
+private fun textToggler(): State<String> =
+    produceState("") {
+        while (true) {
+            withFrameMillis {
+                value =
+                    if (value.isEmpty()) {
+                        "This text and empty string swap every frame"
+                    } else {
+                        ""
+                    }
             }
         }
     }
-}
 
 @Composable
-fun produceLazyListReuseDriver(): State<Pair<Boolean, Int>> = produceState(false to 0) {
-    while (true) {
-        withFrameMillis {
-            val (oldToggle, oldCount) = value
-            value = if (oldToggle) {
-                false to oldCount
-            } else {
-                true to oldCount + 1
+fun produceLazyListReuseDriver(): State<Pair<Boolean, Int>> =
+    produceState(false to 0) {
+        while (true) {
+            withFrameMillis {
+                val (oldToggle, oldCount) = value
+                value =
+                    if (oldToggle) {
+                        false to oldCount
+                    } else {
+                        true to oldCount + 1
+                    }
             }
         }
     }
-}
diff --git a/compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/text/PlatformTextInputAdapterDemo.kt b/compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/text/PlatformTextInputAdapterDemo.kt
index 92378c4..c282e97 100644
--- a/compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/text/PlatformTextInputAdapterDemo.kt
+++ b/compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/text/PlatformTextInputAdapterDemo.kt
@@ -100,18 +100,25 @@
             modifier = Modifier.fillMaxWidth()
         ) {
             Text("Move selection:")
-            IconButton(onClick = {
-                val newCursor = (textFieldState.selection.start - 1)
-                    .coerceIn(0, textFieldState.buffer.length)
-                textFieldState.selection = TextRange(newCursor)
-            }) {
+            IconButton(
+                onClick = {
+                    val newCursor =
+                        (textFieldState.selection.start - 1).coerceIn(
+                            0,
+                            textFieldState.buffer.length
+                        )
+                    textFieldState.selection = TextRange(newCursor)
+                }
+            ) {
                 Image(Icons.AutoMirrored.Filled.KeyboardArrowLeft, contentDescription = "backward")
             }
-            IconButton(onClick = {
-                val newCursor = (textFieldState.selection.end + 1)
-                    .coerceIn(0, textFieldState.buffer.length)
-                textFieldState.selection = TextRange(newCursor)
-            }) {
+            IconButton(
+                onClick = {
+                    val newCursor =
+                        (textFieldState.selection.end + 1).coerceIn(0, textFieldState.buffer.length)
+                    textFieldState.selection = TextRange(newCursor)
+                }
+            ) {
                 Image(Icons.AutoMirrored.Filled.KeyboardArrowRight, contentDescription = "forward")
             }
         }
@@ -127,33 +134,35 @@
     BasicText(
         text = state.toString(),
         onTextLayout = { textLayoutResult = it },
-        modifier = modifier
-            .border(if (isFocused) 2.dp else 1.dp, Color.Gray.copy(alpha = 0.5f))
-            // The modifier element that produces the PlatformTextInputModifierNode must come before
-            // or be the same as the focus target (i.e. focusable).
-            .then(WackyTextFieldModifierElement(state))
-            .focusable(interactionSource = interactionSource)
-            .drawWithContent {
-                drawContent()
+        modifier =
+            modifier
+                .border(if (isFocused) 2.dp else 1.dp, Color.Gray.copy(alpha = 0.5f))
+                // The modifier element that produces the PlatformTextInputModifierNode must come
+                // before
+                // or be the same as the focus target (i.e. focusable).
+                .then(WackyTextFieldModifierElement(state))
+                .focusable(interactionSource = interactionSource)
+                .drawWithContent {
+                    drawContent()
 
-                if (isFocused) {
-                    textLayoutResult?.let {
-                        if (state.selection.collapsed) {
-                            val cursorRect = it.getCursorRect(state.selection.start)
-                            drawLine(
-                                Color.Black,
-                                start = cursorRect.topCenter,
-                                end = cursorRect.bottomCenter,
-                                strokeWidth = 1.dp.toPx()
-                            )
-                        } else {
-                            val selectionPath =
-                                it.getPathForRange(state.selection.start, state.selection.end)
-                            drawPath(selectionPath, Color.Blue.copy(alpha = 0.5f))
+                    if (isFocused) {
+                        textLayoutResult?.let {
+                            if (state.selection.collapsed) {
+                                val cursorRect = it.getCursorRect(state.selection.start)
+                                drawLine(
+                                    Color.Black,
+                                    start = cursorRect.topCenter,
+                                    end = cursorRect.bottomCenter,
+                                    strokeWidth = 1.dp.toPx()
+                                )
+                            } else {
+                                val selectionPath =
+                                    it.getPathForRange(state.selection.start, state.selection.end)
+                                drawPath(selectionPath, Color.Blue.copy(alpha = 0.5f))
+                            }
                         }
                     }
                 }
-            }
     )
 }
 
@@ -172,10 +181,12 @@
 private data class WackyTextFieldModifierElement(val state: WackyTextState) :
     ModifierNodeElement<WackyTextFieldModifierNode>() {
     override fun create() = WackyTextFieldModifierNode(state)
+
     override fun update(node: WackyTextFieldModifierNode) {}
 }
 
-private class WackyTextFieldModifierNode(private val state: WackyTextState) : Modifier.Node(),
+private class WackyTextFieldModifierNode(private val state: WackyTextState) :
+    Modifier.Node(),
     PlatformTextInputModifierNode,
     FocusEventModifierNode,
     FocusRequesterModifierNode,
@@ -189,34 +200,37 @@
         if (isFocused == focusState.isFocused) return
         isFocused = focusState.isFocused
         if (isFocused) {
-            job = coroutineScope.launch {
+            job =
+                coroutineScope.launch {
 
-                // In a real app, creating this session would be platform-specific code.
-                // This will cancel any previous request.
-                establishTextInputSession {
-                    val imm = view.context
-                        .getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager
+                    // In a real app, creating this session would be platform-specific code.
+                    // This will cancel any previous request.
+                    establishTextInputSession {
+                        val imm =
+                            view.context.getSystemService(Context.INPUT_METHOD_SERVICE)
+                                as InputMethodManager
 
-                    launch {
-                        snapshotFlow { state.selection }.collectLatest { selection ->
-                            imm.updateSelection(view, selection.start, selection.end, 0, 0)
+                        launch {
+                            snapshotFlow { state.selection }
+                                .collectLatest { selection ->
+                                    imm.updateSelection(view, selection.start, selection.end, 0, 0)
+                                }
+                        }
+
+                        startInputMethod { outAttrs ->
+                            Log.d(TAG, "creating input connection for $state")
+
+                            outAttrs.initialSelStart = state.buffer.length
+                            outAttrs.initialSelEnd = state.buffer.length
+                            outAttrs.inputType = InputType.TYPE_CLASS_TEXT
+                            EditorInfoCompat.setInitialSurroundingText(outAttrs, state.toString())
+                            outAttrs.imeOptions =
+                                EditorInfo.IME_ACTION_DONE or EditorInfo.IME_FLAG_NO_FULLSCREEN
+                            state.refresh = Unit
+                            WackyInputConnection(state, view)
                         }
                     }
-
-                    startInputMethod { outAttrs ->
-                        Log.d(TAG, "creating input connection for $state")
-
-                        outAttrs.initialSelStart = state.buffer.length
-                        outAttrs.initialSelEnd = state.buffer.length
-                        outAttrs.inputType = InputType.TYPE_CLASS_TEXT
-                        EditorInfoCompat.setInitialSurroundingText(outAttrs, state.toString())
-                        outAttrs.imeOptions =
-                            EditorInfo.IME_ACTION_DONE or EditorInfo.IME_FLAG_NO_FULLSCREEN
-                        state.refresh = Unit
-                        WackyInputConnection(state, view)
-                    }
                 }
-            }
         } else {
             job?.cancel()
             job = null
@@ -245,16 +259,14 @@
 /**
  * This class can mostly be ignored for the sake of this demo.
  *
- * This is where most of the actual communication with the Android IME system APIs is. It is
- * an implementation of the Android interface [InputConnection], which is a very large and
- * complex interface to implement. Here we use the [BaseInputConnection] class to avoid
- * implementing the whole thing from scratch, and then only make very weak attempts at handling
- * all the edge cases a real-world text editor would need to handle.
+ * This is where most of the actual communication with the Android IME system APIs is. It is an
+ * implementation of the Android interface [InputConnection], which is a very large and complex
+ * interface to implement. Here we use the [BaseInputConnection] class to avoid implementing the
+ * whole thing from scratch, and then only make very weak attempts at handling all the edge cases a
+ * real-world text editor would need to handle.
  */
-private class WackyInputConnection(
-    private val state: WackyTextState,
-    view: View
-) : BaseInputConnection(view, false) {
+private class WackyInputConnection(private val state: WackyTextState, view: View) :
+    BaseInputConnection(view, false) {
     private var composition: TextRange? = null
 
     private var batchLevel = 0
@@ -280,16 +292,16 @@
 
     override fun commitText(text: CharSequence?, newCursorPosition: Int): Boolean {
         Log.d(TAG, "committing text: text=\"$text\", newCursorPosition=$newCursorPosition")
-        @Suppress("NAME_SHADOWING")
-        val text = text.toString()
+        @Suppress("NAME_SHADOWING") val text = text.toString()
         withBatch {
-            state.selection = if (composition != null) {
-                state.buffer.replace(composition!!.start, composition!!.end, text)
-                TextRange(composition!!.end)
-            } else {
-                state.buffer.replace(state.selection.start, state.selection.end, text)
-                TextRange(state.selection.start + text.length)
-            }
+            state.selection =
+                if (composition != null) {
+                    state.buffer.replace(composition!!.start, composition!!.end, text)
+                    TextRange(composition!!.end)
+                } else {
+                    state.buffer.replace(state.selection.start, state.selection.end, text)
+                    TextRange(state.selection.start + text.length)
+                }
         }
         return true
     }
@@ -307,18 +319,13 @@
     }
 
     override fun setComposingText(text: CharSequence?, newCursorPosition: Int): Boolean {
-        Log.d(
-            TAG,
-            "setting composing text: text=\"$text\", newCursorPosition=$newCursorPosition"
-        )
-        @Suppress("NAME_SHADOWING")
-        val text = text.toString()
+        Log.d(TAG, "setting composing text: text=\"$text\", newCursorPosition=$newCursorPosition")
+        @Suppress("NAME_SHADOWING") val text = text.toString()
         withBatch {
             if (composition != null) {
                 state.buffer.replace(composition!!.start, composition!!.end, text)
                 if (text.isNotEmpty()) {
-                    composition =
-                        TextRange(composition!!.start, composition!!.start + text.length)
+                    composition = TextRange(composition!!.start, composition!!.start + text.length)
                 }
                 state.selection = TextRange(composition!!.end)
             } else {
@@ -354,19 +361,18 @@
     override fun setSelection(start: Int, end: Int): Boolean {
         Log.d(TAG, "setting selection: start=$start, end=$end")
         withBatch {
-            state.selection = TextRange(
-                start.coerceIn(0, state.buffer.length),
-                end.coerceIn(0, state.buffer.length)
-            )
+            state.selection =
+                TextRange(
+                    start.coerceIn(0, state.buffer.length),
+                    end.coerceIn(0, state.buffer.length)
+                )
         }
         return true
     }
 
     override fun finishComposingText(): Boolean {
         Log.d(TAG, "finishing composing text")
-        withBatch {
-            composition = null
-        }
+        withBatch { composition = null }
         return true
     }
 
diff --git a/compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/text/ReadOnlyTextFieldDemo.kt b/compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/text/ReadOnlyTextFieldDemo.kt
index 2750ed8..ff3e87e 100644
--- a/compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/text/ReadOnlyTextFieldDemo.kt
+++ b/compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/text/ReadOnlyTextFieldDemo.kt
@@ -58,9 +58,7 @@
 
         Button(
             onClick = { focusManager.clearFocus() },
-            modifier = Modifier
-                .fillMaxWidth()
-                .wrapContentWidth()
+            modifier = Modifier.fillMaxWidth().wrapContentWidth()
         ) {
             Text("Clear focus")
         }
diff --git a/compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/text/RejectTextChangeDemo.kt b/compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/text/RejectTextChangeDemo.kt
index d5f1028..1674eac 100644
--- a/compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/text/RejectTextChangeDemo.kt
+++ b/compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/text/RejectTextChangeDemo.kt
@@ -66,8 +66,6 @@
         modifier = demoTextFieldModifiers,
         value = state.value,
         textStyle = TextStyle(fontSize = 32.sp),
-        onValueChange = {
-            state.value = it
-        }
+        onValueChange = { state.value = it }
     )
 }
diff --git a/compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/text/StrokeDemo.kt b/compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/text/StrokeDemo.kt
index 9573d68..6aea28b 100644
--- a/compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/text/StrokeDemo.kt
+++ b/compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/text/StrokeDemo.kt
@@ -49,11 +49,7 @@
     var dashInterval by remember { mutableFloatStateOf(2f) }
     var stroke by remember {
         mutableStateOf(
-            Stroke(
-                width = 4f, pathEffect = PathEffect.dashPathEffect(
-                    floatArrayOf(2f, 2f)
-                )
-            )
+            Stroke(width = 4f, pathEffect = PathEffect.dashPathEffect(floatArrayOf(2f, 2f)))
         )
     }
     var fontSize by remember { mutableStateOf(20.sp) }
@@ -61,39 +57,25 @@
     val finalStroke by remember {
         derivedStateOf {
             stroke.copy(
-                pathEffect = PathEffect.dashPathEffect(
-                    floatArrayOf(
-                        dashInterval,
-                        dashInterval
-                    ), phase = 0f
-                )
+                pathEffect =
+                    PathEffect.dashPathEffect(floatArrayOf(dashInterval, dashInterval), phase = 0f)
             )
         }
     }
     Column(verticalArrangement = Arrangement.spacedBy(8.dp)) {
         Text("Font Size")
-        Slider(
-            value = fontSize.value,
-            onValueChange = {
-                fontSize = it.sp
-            },
-            valueRange = 8f..144f
-        )
+        Slider(value = fontSize.value, onValueChange = { fontSize = it.sp }, valueRange = 8f..144f)
         Text("Width")
         Slider(
             value = stroke.width,
-            onValueChange = {
-                stroke = stroke.copy(width = it)
-            },
+            onValueChange = { stroke = stroke.copy(width = it) },
             valueRange = 0f..16f,
             steps = 16
         )
         Text("Miter")
         Slider(
             value = stroke.miter,
-            onValueChange = {
-                stroke = stroke.copy(miter = it)
-            },
+            onValueChange = { stroke = stroke.copy(miter = it) },
             valueRange = 0f..16f,
             steps = 16
         )
@@ -113,17 +95,20 @@
         ) {
             RadioButton(
                 selected = stroke.cap == StrokeCap.Butt,
-                onClick = { stroke = stroke.copy(cap = StrokeCap.Butt) })
+                onClick = { stroke = stroke.copy(cap = StrokeCap.Butt) }
+            )
             Text(text = "Butt", style = MaterialTheme.typography.body2)
 
             RadioButton(
                 selected = stroke.cap == StrokeCap.Round,
-                onClick = { stroke = stroke.copy(cap = StrokeCap.Round) })
+                onClick = { stroke = stroke.copy(cap = StrokeCap.Round) }
+            )
             Text(text = "Round", style = MaterialTheme.typography.body2)
 
             RadioButton(
                 selected = stroke.cap == StrokeCap.Square,
-                onClick = { stroke = stroke.copy(cap = StrokeCap.Square) })
+                onClick = { stroke = stroke.copy(cap = StrokeCap.Square) }
+            )
             Text(text = "Square", style = MaterialTheme.typography.body2)
         }
 
@@ -134,34 +119,34 @@
         ) {
             RadioButton(
                 selected = stroke.join == StrokeJoin.Round,
-                onClick = { stroke = stroke.copy(join = StrokeJoin.Round) })
+                onClick = { stroke = stroke.copy(join = StrokeJoin.Round) }
+            )
             Text(text = "Round", style = MaterialTheme.typography.body2)
 
             RadioButton(
                 selected = stroke.join == StrokeJoin.Miter,
-                onClick = { stroke = stroke.copy(join = StrokeJoin.Miter) })
+                onClick = { stroke = stroke.copy(join = StrokeJoin.Miter) }
+            )
             Text(text = "Miter", style = MaterialTheme.typography.body2)
 
             RadioButton(
                 selected = stroke.join == StrokeJoin.Bevel,
-                onClick = { stroke = stroke.copy(join = StrokeJoin.Bevel) })
+                onClick = { stroke = stroke.copy(join = StrokeJoin.Bevel) }
+            )
             Text(text = "Bevel", style = MaterialTheme.typography.body2)
         }
 
         Text(
             text = "This text is drawn using stroke! 🎉",
-            style = LocalTextStyle.current.merge(
-                TextStyle(
-                    fontSize = fontSize,
-                    brush = Brush.horizontalGradient(
-                        listOf(
-                            Color.Red,
-                            Color.Green,
-                            Color.Blue
-                        )
-                    ), drawStyle = finalStroke
+            style =
+                LocalTextStyle.current.merge(
+                    TextStyle(
+                        fontSize = fontSize,
+                        brush =
+                            Brush.horizontalGradient(listOf(Color.Red, Color.Green, Color.Blue)),
+                        drawStyle = finalStroke
+                    )
                 )
-            )
         )
     }
 }
diff --git a/compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/text/TailFollowingTextField.kt b/compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/text/TailFollowingTextField.kt
index e680aa4..ea1ac84 100644
--- a/compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/text/TailFollowingTextField.kt
+++ b/compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/text/TailFollowingTextField.kt
@@ -37,29 +37,22 @@
 @Composable
 fun TailFollowingTextFieldDemo() {
     Column {
-        val hstate = rememberSaveable {
-            mutableStateOf("abc def ghi jkl mno pqr stu vwx yz")
-        }
+        val hstate = rememberSaveable { mutableStateOf("abc def ghi jkl mno pqr stu vwx yz") }
         HorizontalTailFollowingTextField(
             value = hstate.value,
             onValueChange = { hstate.value = it },
-            modifier = Modifier
-                .then(demoTextFieldModifiers)
-                .fillMaxWidth()
-                .clipToBounds()
+            modifier = Modifier.then(demoTextFieldModifiers).fillMaxWidth().clipToBounds()
         )
 
-        val vstate = rememberSaveable {
-            mutableStateOf("a\nb\nc\nd\ne\nf\ng\nh")
-        }
+        val vstate = rememberSaveable { mutableStateOf("a\nb\nc\nd\ne\nf\ng\nh") }
         VerticalTailFollowintTextField(
             value = vstate.value,
             onValueChange = { vstate.value = it },
-            modifier = Modifier
-                .then(demoTextFieldModifiers)
-                .fillMaxWidth()
-                .requiredHeight(120.dp)
-                .clipToBounds()
+            modifier =
+                Modifier.then(demoTextFieldModifiers)
+                    .fillMaxWidth()
+                    .requiredHeight(120.dp)
+                    .clipToBounds()
         )
     }
 }
@@ -72,31 +65,26 @@
     textStyle: TextStyle = TextStyle(fontSize = fontSize8)
 ) {
     Layout(
-        content = @Composable {
-            BasicTextField(
-                value = value,
-                onValueChange = onValueChange,
-                textStyle = textStyle
-            )
-        },
+        content =
+            @Composable {
+                BasicTextField(value = value, onValueChange = onValueChange, textStyle = textStyle)
+            },
         modifier = modifier
     ) { measurable, constraints ->
-
-        val p = measurable[0].measure(
-            Constraints(
-                minWidth = 0,
-                maxWidth = Constraints.Infinity,
-                minHeight = constraints.minHeight,
-                maxHeight = constraints.maxHeight
+        val p =
+            measurable[0].measure(
+                Constraints(
+                    minWidth = 0,
+                    maxWidth = Constraints.Infinity,
+                    minHeight = constraints.minHeight,
+                    maxHeight = constraints.maxHeight
+                )
             )
-        )
 
         val width = constraints.constrainWidth(p.width)
         val xOffset = min(0, constraints.maxWidth - p.width)
 
-        layout(width, p.height) {
-            p.placeRelative(xOffset, 0)
-        }
+        layout(width, p.height) { p.placeRelative(xOffset, 0) }
     }
 }
 
@@ -108,30 +96,25 @@
     textStyle: TextStyle = TextStyle(fontSize = fontSize8)
 ) {
     Layout(
-        content = @Composable {
-            BasicTextField(
-                value = value,
-                onValueChange = onValueChange,
-                textStyle = textStyle
-            )
-        },
+        content =
+            @Composable {
+                BasicTextField(value = value, onValueChange = onValueChange, textStyle = textStyle)
+            },
         modifier = modifier
     ) { measurable, constraints ->
-
-        val p = measurable[0].measure(
-            Constraints(
-                minWidth = constraints.minWidth,
-                maxWidth = constraints.maxWidth,
-                minHeight = 0,
-                maxHeight = Constraints.Infinity
+        val p =
+            measurable[0].measure(
+                Constraints(
+                    minWidth = constraints.minWidth,
+                    maxWidth = constraints.maxWidth,
+                    minHeight = 0,
+                    maxHeight = Constraints.Infinity
+                )
             )
-        )
 
         val height = min(p.height, constraints.maxHeight)
         val yOffset = min(0, constraints.maxHeight - p.height)
 
-        layout(p.width, height) {
-            p.placeRelative(0, yOffset)
-        }
+        layout(p.width, height) { p.placeRelative(0, yOffset) }
     }
 }
diff --git a/compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/text/TextAnimationDemo.kt b/compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/text/TextAnimationDemo.kt
index 1f7432f..c066f52 100644
--- a/compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/text/TextAnimationDemo.kt
+++ b/compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/text/TextAnimationDemo.kt
@@ -75,18 +75,21 @@
         }
     }
 }
+
 @Composable
 fun TextColorAnimation() {
     val anim = rememberInfiniteTransition("slow animation")
-    val color: State<Color> = anim.animateColor(
-        initialValue = Color.Black,
-        targetValue = Color.Gray,
-        animationSpec = InfiniteRepeatableSpec(
-            tween(5_000, 50, CubicBezierEasing(0.2f, 0.0f, 0.5f, 0.6f)),
-            repeatMode = RepeatMode.Reverse
-        ),
-        label = "slow gray"
-    )
+    val color: State<Color> =
+        anim.animateColor(
+            initialValue = Color.Black,
+            targetValue = Color.Gray,
+            animationSpec =
+                InfiniteRepeatableSpec(
+                    tween(5_000, 50, CubicBezierEasing(0.2f, 0.0f, 0.5f, 0.6f)),
+                    repeatMode = RepeatMode.Reverse
+                ),
+            label = "slow gray"
+        )
     Box(contentAlignment = Alignment.Center) {
         Column(horizontalAlignment = Alignment.CenterHorizontally) {
             BasicText(
@@ -97,9 +100,7 @@
             BasicText(
                 buildAnnotatedString {
                     append("So does ")
-                    withStyle(SpanStyle(fontWeight = FontWeight.Black)) {
-                        append("this")
-                    }
+                    withStyle(SpanStyle(fontWeight = FontWeight.Black)) { append("this") }
                 },
                 style = TextStyle.Default.copy(fontSize = 30.sp, textAlign = TextAlign.Center),
                 color = { color.value },
@@ -125,9 +126,7 @@
     fun TextMotionPanel() {
         Row(Modifier.fillMaxSize()) {
             Row(
-                Modifier
-                    .weight(1f)
-                    .clickable { isStatic = true },
+                Modifier.weight(1f).clickable { isStatic = true },
                 verticalAlignment = Alignment.CenterVertically
             ) {
                 RadioButton(selected = isStatic, onClick = { isStatic = true })
@@ -135,9 +134,7 @@
             }
 
             Row(
-                Modifier
-                    .weight(1f)
-                    .clickable { isStatic = false },
+                Modifier.weight(1f).clickable { isStatic = false },
                 verticalAlignment = Alignment.CenterVertically
             ) {
                 RadioButton(selected = !isStatic, onClick = { isStatic = false })
@@ -159,26 +156,23 @@
 
     textMotionState.TextMotionPanel()
 
-    Box(
-        modifier = Modifier
-            .fillMaxSize()
-            .height(200.dp),
-        contentAlignment = Alignment.Center
-    ) {
+    Box(modifier = Modifier.fillMaxSize().height(200.dp), contentAlignment = Alignment.Center) {
         val infiniteTransition = rememberInfiniteTransition()
-        val scale by infiniteTransition.animateFloat(
-            initialValue = 1f,
-            targetValue = 2.5f,
-            animationSpec = infiniteRepeatable(tween(3500), RepeatMode.Reverse)
-        )
+        val scale by
+            infiniteTransition.animateFloat(
+                initialValue = 1f,
+                targetValue = 2.5f,
+                animationSpec = infiniteRepeatable(tween(3500), RepeatMode.Reverse)
+            )
         Text(
             text = "Lorem Ipsum\ndolor sit amet",
             fontSize = 24.sp,
             style = textMotionState.textStyle,
-            modifier = Modifier.graphicsLayer {
-                scaleX = scale
-                scaleY = scale
-            }
+            modifier =
+                Modifier.graphicsLayer {
+                    scaleX = scale
+                    scaleY = scale
+                }
         )
     }
 }
@@ -189,26 +183,23 @@
 
     textMotionState.TextMotionPanel()
 
-    Box(
-        modifier = Modifier
-            .fillMaxSize()
-            .height(200.dp),
-        contentAlignment = Alignment.Center
-    ) {
+    Box(modifier = Modifier.fillMaxSize().height(200.dp), contentAlignment = Alignment.Center) {
         val infiniteTransition = rememberInfiniteTransition()
-        val translation by infiniteTransition.animateFloat(
-            initialValue = -100f,
-            targetValue = 100f,
-            animationSpec = infiniteRepeatable(tween(3500), RepeatMode.Reverse)
-        )
+        val translation by
+            infiniteTransition.animateFloat(
+                initialValue = -100f,
+                targetValue = 100f,
+                animationSpec = infiniteRepeatable(tween(3500), RepeatMode.Reverse)
+            )
         Text(
             text = "Lorem Ipsum\ndolor sit amet",
             fontSize = 24.sp,
             style = textMotionState.textStyle,
-            modifier = Modifier.graphicsLayer {
-                translationX = translation
-                translationY = translation
-            }
+            modifier =
+                Modifier.graphicsLayer {
+                    translationX = translation
+                    translationY = translation
+                }
         )
     }
 }
@@ -218,19 +209,15 @@
     val textMotionState = rememberTextMotionState()
 
     val infiniteTransition = rememberInfiniteTransition()
-    val rotation by infiniteTransition.animateFloat(
-        initialValue = 0f,
-        targetValue = 360f,
-        animationSpec = infiniteRepeatable(tween(3500), RepeatMode.Reverse)
-    )
+    val rotation by
+        infiniteTransition.animateFloat(
+            initialValue = 0f,
+            targetValue = 360f,
+            animationSpec = infiniteRepeatable(tween(3500), RepeatMode.Reverse)
+        )
     textMotionState.TextMotionPanel()
 
-    Box(
-        modifier = Modifier
-            .fillMaxSize()
-            .height(200.dp),
-        contentAlignment = Alignment.Center
-    ) {
+    Box(modifier = Modifier.fillMaxSize().height(200.dp), contentAlignment = Alignment.Center) {
         Text(
             text = "Lorem Ipsum\ndolor sit amet",
             fontSize = 24.sp,
@@ -238,12 +225,7 @@
             modifier = Modifier.graphicsLayer { rotationX = rotation }
         )
     }
-    Box(
-        modifier = Modifier
-            .fillMaxSize()
-            .height(200.dp),
-        contentAlignment = Alignment.Center
-    ) {
+    Box(modifier = Modifier.fillMaxSize().height(200.dp), contentAlignment = Alignment.Center) {
         Text(
             text = "Lorem Ipsum\ndolor sit amet",
             fontSize = 24.sp,
@@ -251,13 +233,7 @@
             modifier = Modifier.graphicsLayer { rotationY = rotation }
         )
     }
-    Box(
-        modifier = Modifier
-            .fillMaxSize()
-            .height(200.dp),
-        contentAlignment = Alignment.Center
-    ) {
-
+    Box(modifier = Modifier.fillMaxSize().height(200.dp), contentAlignment = Alignment.Center) {
         Text(
             text = "Lorem Ipsum\ndolor sit amet",
             fontSize = 24.sp,
diff --git a/compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/text/TextDemoMetrics.kt b/compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/text/TextDemoMetrics.kt
index 6d0d2d0..a6a0d3c 100644
--- a/compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/text/TextDemoMetrics.kt
+++ b/compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/text/TextDemoMetrics.kt
@@ -63,9 +63,7 @@
         modifier = Modifier.drawTextMetrics(textLayout.value, colors).background(Color.LightGray),
         maxLines = maxLines,
         overflow = overflow,
-        onTextLayout = {
-            textLayout.value = it
-        },
+        onTextLayout = { textLayout.value = it },
         softWrap = softWrap
     )
 }
@@ -88,9 +86,7 @@
         textStyle = style,
         singleLine = !softWrap,
         maxLines = maxLines,
-        onTextLayout = {
-            textLayout = it
-        }
+        onTextLayout = { textLayout = it }
     )
 }
 
@@ -140,14 +136,19 @@
     drawScope: DrawScope
 ) : DrawScope by drawScope {
 
-    private enum class Alignment { Left, Right, Center }
+    private enum class Alignment {
+        Left,
+        Right,
+        Center
+    }
 
     private val pathEffect = PathEffect.dashPathEffect(floatArrayOf(5f, 5f))
     private val overflow = 3 * thickness
-    private val textPaint = android.graphics.Paint().apply {
-        textSize = labelSize
-        setShadowLayer(Float.MIN_VALUE, 4f, 4f, android.graphics.Color.WHITE)
-    }
+    private val textPaint =
+        android.graphics.Paint().apply {
+            textSize = labelSize
+            setShadowLayer(Float.MIN_VALUE, 4f, 4f, android.graphics.Color.WHITE)
+        }
 
     fun drawTextLayout(textLayout: TextLayoutResult?) {
         if (textLayout == null) return
@@ -184,11 +185,12 @@
             strokeWidth = thickness,
             pathEffect = pathEffect
         )
-        val x = when (alignment) {
-            Left -> startX + textOffset
-            Right -> endX - labelSize - textOffset
-            Center -> startX + (endX - startX) / 2f + textOffset
-        }
+        val x =
+            when (alignment) {
+                Left -> startX + textOffset
+                Right -> endX - labelSize - textOffset
+                Center -> startX + (endX - startX) / 2f + textOffset
+            }
 
         if (text.isNotBlank()) {
             text(text, color, x, y)
diff --git a/compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/text/TextDemos.kt b/compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/text/TextDemos.kt
index fb49236..8ff478f 100644
--- a/compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/text/TextDemos.kt
+++ b/compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/text/TextDemos.kt
@@ -42,180 +42,189 @@
 import androidx.compose.integration.demos.common.DemoCategory
 import androidx.compose.ui.text.samples.AnnotatedStringFromHtml
 
-val TextDemos = DemoCategory(
-    "Text",
-    listOf(
-        ComposableDemo("Text Accessibility") { TextAccessibilityDemo() },
-        DemoCategory(
-            "Text Canvas",
-            listOf(
-                ComposableDemo("Brush") { TextBrushDemo() },
-                ComposableDemo("Brush Span") { BrushAnimatingSpanDemo() },
-                ComposableDemo("drawText") { DrawTextDemo() },
-                ComposableDemo("Stroke") { TextStrokeDemo() }
-            )
-        ),
-        DemoCategory(
-            "Animation",
-            listOf(
-                ComposableDemo("color = { animatedColor.value }") { TextColorAnimation() },
-                ComposableDemo("GraphicsLayer (skew, scale, etc)") { TextAnimationDemo() },
-            )
-        ),
-        DemoCategory(
-            "Text Layout",
-            listOf(
-                ComposableDemo("Static text") { TextDemo() },
-                DemoCategory(
-                    "Line breaking",
-                    listOf(
-                        ComposableDemo("Line Break") { TextLineBreakDemo() },
-                        ComposableDemo("Hyphens") { TextDemoHyphens() },
-                        ComposableDemo("Ellipsize") { EllipsizeDemo() },
-                        ComposableDemo("Ellipsize and letterspacing") {
-                            EllipsizeWithLetterSpacing()
-                        },
-                        ComposableDemo("Letterspacing") {
-                            LetterSpacingDemo()
-                        }
-                    )
-                ),
-                DemoCategory(
-                    "Text Overflow",
-                    listOf(
-                        ComposableDemo("TextOverflow demo") { TextOverflowDemo() },
-                        ComposableDemo("Visible overflow in drawText") {
-                            TextOverflowVisibleInDrawText()
-                        },
-                        ComposableDemo("Visible overflow in Popup") {
-                            TextOverflowVisibleInPopupDemo()
-                        },
-                        ComposableDemo("Min/max lines") { BasicTextMinMaxLinesDemo() },
-                        ComposableDemo("Get last character after clip") {
-                            LastClippedCharacterDemo()
-                        }
-                    )
-                ),
-                ComposableDemo("IncludeFontPadding & Clip") { TextFontPaddingDemo() },
-                ComposableDemo("Line Height Behavior") { TextLineHeightDemo() },
-                ComposableDemo("Layout Reuse") { TextReuseLayoutDemo() },
-                ComposableDemo("Multi paragraph") { MultiParagraphDemo() },
-            )
-        ),
-        DemoCategory(
-            "Fonts",
-            listOf(
-                ComposableDemo("Typeface") { TypefaceDemo() },
-                ComposableDemo("Variable Fonts") { VariableFontsDemo() },
-                ComposableDemo("FontFamily fallback") { FontFamilyDemo() },
-                ComposableDemo("All system font families") { SystemFontFamilyDemo() },
-                ComposableDemo("Emoji Compat") { EmojiCompatDemo() },
-            )
-        ),
-        DemoCategory(
-            "Legacy Text Input (BasicTextFieldv1)",
-            listOf(
-                ComposableDemo("Basic input fields") { InputFieldDemo() },
-                ComposableDemo("Capitalization/AutoCorrect") {
-                    CapitalizationAutoCorrectDemo()
-                },
-                DemoCategory(
-                    "Cursor",
-                    listOf(
-                        ComposableDemo("Cursor configuration") { TextFieldCursorBlinkingDemo() },
-                        ComposableDemo("Unfocused window") {
-                            CursorNotBlinkingInUnfocusedWindowDemo()
-                        }
-                    )
-                ),
-                DemoCategory(
-                    "Focus",
-                    listOf(
-                        ComposableDemo("Focus transition") { TextFieldFocusTransition() },
-                        ComposableDemo("Focus keyboard interaction") {
-                            TextFieldFocusKeyboardInteraction()
-                        },
-                        ComposableDemo("Focus immediately") { FocusTextFieldImmediatelyDemo() },
-                        ComposableDemo("TextField focus") { TextFieldFocusDemo() },
-                    )
-                ),
-                ComposableDemo("Full-screen field") { FullScreenTextFieldDemo() },
-                ComposableDemo("Ime Action") { ImeActionDemo() },
-                ComposableDemo("Ime SingleLine") { ImeSingleLineDemo() },
-                ComposableDemo("Inside Dialog") { TextFieldsInDialogDemo() },
-                ComposableDemo("Inside scrollable") { TextFieldsInScrollableDemo() },
-                ComposableDemo("Keyboard Types") { KeyboardTypeDemo() },
-                ComposableDemo("Min/Max Lines") { BasicTextFieldMinMaxDemo() },
-                ComposableDemo("Reject Text Change") { RejectTextChangeDemo() },
-                ComposableDemo("Scrollable text fields") { ScrollableTextFieldDemo() },
-                ComposableDemo("Visual Transformation") { VisualTransformationDemo() },
-                ComposableDemo("TextFieldValue") { TextFieldValueDemo() },
-                ComposableDemo("Tail Following Text Field") { TailFollowingTextFieldDemo() },
-                ComposableDemo("Secondary input system") { PlatformTextInputAdapterDemo() },
-                ComposableDemo("Read-only field") { ReadOnlyTextFieldDemo() },
-                ComposableDemo("Interop") { InteropTextFieldDemo() }
-            )
-        ),
-        DemoCategory(
-            "Text Input (BasicTextFieldv2)",
-            listOf(
-                ComposableDemo("Basic text input") { BasicTextFieldDemos() },
-                ComposableDemo("Value/callback overload") { BasicTextFieldValueCallbackDemo() },
-                ComposableDemo("Keyboard Options") { KeyboardOptionsDemos() },
-                ComposableDemo("Keyboard Actions") { KeyboardActionsDemos() },
-                ComposableDemo("Decoration Box") { DecorationBoxDemos() },
-                ComposableDemo("Line limits") { TextFieldLineLimitsDemos() },
-                DemoCategory("Scroll", listOf(
-                    ComposableDemo("Ltr") { ScrollableDemos() },
-                    ComposableDemo("Rtl") { ScrollableDemosRtl() },
-                )),
-                ComposableDemo("Inside Scrollable") { BasicTextFieldInScrollableDemo() },
-                ComposableDemo("Input Transformation") {
-                    BasicTextFieldInputTransformationDemos()
-                },
-                DemoCategory("Receive Content", listOf(
-                    ComposableDemo("Basic") { TextFieldReceiveContentDemo() },
-                    ComposableDemo("Nested") { NestedReceiveContentDemo() },
-                )),
-                ComposableDemo("Output Transformation") {
-                    BasicTextFieldOutputTransformationDemos()
-                },
-                ComposableDemo("Secure Field") { BasicSecureTextFieldDemos() },
-                ComposableDemo("Inside Dialog") { BasicTextFieldsInDialogDemo() },
-                ComposableDemo("Swap the field but reuse the state") { SwapFieldSameStateDemo() },
-                ComposableDemo("Custom PIN field") { BasicTextFieldCustomPinFieldDemo() },
-                ComposableDemo("Undo/Redo") { BasicTextFieldUndoSample() },
-                ComposableDemo("Long text") { BasicTextFieldLongTextDemo() },
-                ComposableDemo("Cursor") { TextFieldCursorNotBlinkingInUnfocusedWindowDemo() },
-                ComposableDemo("Handwriting detector") { HandwritingDetectorSample() }
-            )
-        ),
-        DemoCategory(
-            "Selection",
-            listOf(
-                ComposableDemo("Text selection") { TextSelectionDemo() },
-                ComposableDemo("Text selection sample") { TextSelectionSample() },
-                ComposableDemo("Overflowed Selection") { TextOverflowedSelectionDemo() },
-                ComposableDemo("Scrollable Column Text Selection") {
-                    TextScrollableColumnSelectionDemo()
-                },
-                ComposableDemo("Selection Minimum Touch Target") {
-                    MinTouchTargetTextSelection()
-                },
-                ComposableDemo("Selection & DropdownMenu") { DropdownMenuSelection() },
-            )
-        ),
-        DemoCategory(
-            "\uD83D\uDD75️️️ Memory allocs",
-            listOf(
-                ComposableDemo("\uD83D\uDD75️ SetText") { MemoryAllocsSetText() },
-                ComposableDemo("\uD83D\uDD75️ IfNotEmptyText") { MemoryAllocsIfNotEmptyText() },
-                ComposableDemo("\uD83E\uDDA5 LazyList reuse") { MemoryAllocsLazyList() }
-            )
-        ),
-        ComposableDemo("\uD83D\uDD17 Hyperlinks") { Hyperlinks() },
-        ComposableDemo("Text Pointer Icon") { TextPointerIconDemo() },
-        ComposableDemo("Html") { AnnotatedStringFromHtml() },
-        ComposableDemo("Show/hide keyboard via scroll") { windowInsetsNestedScrollDemo() },
+val TextDemos =
+    DemoCategory(
+        "Text",
+        listOf(
+            ComposableDemo("Text Accessibility") { TextAccessibilityDemo() },
+            DemoCategory(
+                "Text Canvas",
+                listOf(
+                    ComposableDemo("Brush") { TextBrushDemo() },
+                    ComposableDemo("Brush Span") { BrushAnimatingSpanDemo() },
+                    ComposableDemo("drawText") { DrawTextDemo() },
+                    ComposableDemo("Stroke") { TextStrokeDemo() }
+                )
+            ),
+            DemoCategory(
+                "Animation",
+                listOf(
+                    ComposableDemo("color = { animatedColor.value }") { TextColorAnimation() },
+                    ComposableDemo("GraphicsLayer (skew, scale, etc)") { TextAnimationDemo() },
+                )
+            ),
+            DemoCategory(
+                "Text Layout",
+                listOf(
+                    ComposableDemo("Static text") { TextDemo() },
+                    DemoCategory(
+                        "Line breaking",
+                        listOf(
+                            ComposableDemo("Line Break") { TextLineBreakDemo() },
+                            ComposableDemo("Hyphens") { TextDemoHyphens() },
+                            ComposableDemo("Ellipsize") { EllipsizeDemo() },
+                            ComposableDemo("Ellipsize and letterspacing") {
+                                EllipsizeWithLetterSpacing()
+                            },
+                            ComposableDemo("Letterspacing") { LetterSpacingDemo() }
+                        )
+                    ),
+                    DemoCategory(
+                        "Text Overflow",
+                        listOf(
+                            ComposableDemo("TextOverflow demo") { TextOverflowDemo() },
+                            ComposableDemo("Visible overflow in drawText") {
+                                TextOverflowVisibleInDrawText()
+                            },
+                            ComposableDemo("Visible overflow in Popup") {
+                                TextOverflowVisibleInPopupDemo()
+                            },
+                            ComposableDemo("Min/max lines") { BasicTextMinMaxLinesDemo() },
+                            ComposableDemo("Get last character after clip") {
+                                LastClippedCharacterDemo()
+                            }
+                        )
+                    ),
+                    ComposableDemo("IncludeFontPadding & Clip") { TextFontPaddingDemo() },
+                    ComposableDemo("Line Height Behavior") { TextLineHeightDemo() },
+                    ComposableDemo("Layout Reuse") { TextReuseLayoutDemo() },
+                    ComposableDemo("Multi paragraph") { MultiParagraphDemo() },
+                )
+            ),
+            DemoCategory(
+                "Fonts",
+                listOf(
+                    ComposableDemo("Typeface") { TypefaceDemo() },
+                    ComposableDemo("Variable Fonts") { VariableFontsDemo() },
+                    ComposableDemo("FontFamily fallback") { FontFamilyDemo() },
+                    ComposableDemo("All system font families") { SystemFontFamilyDemo() },
+                    ComposableDemo("Emoji Compat") { EmojiCompatDemo() },
+                )
+            ),
+            DemoCategory(
+                "Legacy Text Input (BasicTextFieldv1)",
+                listOf(
+                    ComposableDemo("Basic input fields") { InputFieldDemo() },
+                    ComposableDemo("Capitalization/AutoCorrect") {
+                        CapitalizationAutoCorrectDemo()
+                    },
+                    DemoCategory(
+                        "Cursor",
+                        listOf(
+                            ComposableDemo("Cursor configuration") {
+                                TextFieldCursorBlinkingDemo()
+                            },
+                            ComposableDemo("Unfocused window") {
+                                CursorNotBlinkingInUnfocusedWindowDemo()
+                            }
+                        )
+                    ),
+                    DemoCategory(
+                        "Focus",
+                        listOf(
+                            ComposableDemo("Focus transition") { TextFieldFocusTransition() },
+                            ComposableDemo("Focus keyboard interaction") {
+                                TextFieldFocusKeyboardInteraction()
+                            },
+                            ComposableDemo("Focus immediately") { FocusTextFieldImmediatelyDemo() },
+                            ComposableDemo("TextField focus") { TextFieldFocusDemo() },
+                        )
+                    ),
+                    ComposableDemo("Full-screen field") { FullScreenTextFieldDemo() },
+                    ComposableDemo("Ime Action") { ImeActionDemo() },
+                    ComposableDemo("Ime SingleLine") { ImeSingleLineDemo() },
+                    ComposableDemo("Inside Dialog") { TextFieldsInDialogDemo() },
+                    ComposableDemo("Inside scrollable") { TextFieldsInScrollableDemo() },
+                    ComposableDemo("Keyboard Types") { KeyboardTypeDemo() },
+                    ComposableDemo("Min/Max Lines") { BasicTextFieldMinMaxDemo() },
+                    ComposableDemo("Reject Text Change") { RejectTextChangeDemo() },
+                    ComposableDemo("Scrollable text fields") { ScrollableTextFieldDemo() },
+                    ComposableDemo("Visual Transformation") { VisualTransformationDemo() },
+                    ComposableDemo("TextFieldValue") { TextFieldValueDemo() },
+                    ComposableDemo("Tail Following Text Field") { TailFollowingTextFieldDemo() },
+                    ComposableDemo("Secondary input system") { PlatformTextInputAdapterDemo() },
+                    ComposableDemo("Read-only field") { ReadOnlyTextFieldDemo() },
+                    ComposableDemo("Interop") { InteropTextFieldDemo() }
+                )
+            ),
+            DemoCategory(
+                "Text Input (BasicTextFieldv2)",
+                listOf(
+                    ComposableDemo("Basic text input") { BasicTextFieldDemos() },
+                    ComposableDemo("Value/callback overload") { BasicTextFieldValueCallbackDemo() },
+                    ComposableDemo("Keyboard Options") { KeyboardOptionsDemos() },
+                    ComposableDemo("Keyboard Actions") { KeyboardActionsDemos() },
+                    ComposableDemo("Decoration Box") { DecorationBoxDemos() },
+                    ComposableDemo("Line limits") { TextFieldLineLimitsDemos() },
+                    DemoCategory(
+                        "Scroll",
+                        listOf(
+                            ComposableDemo("Ltr") { ScrollableDemos() },
+                            ComposableDemo("Rtl") { ScrollableDemosRtl() },
+                        )
+                    ),
+                    ComposableDemo("Inside Scrollable") { BasicTextFieldInScrollableDemo() },
+                    ComposableDemo("Input Transformation") {
+                        BasicTextFieldInputTransformationDemos()
+                    },
+                    DemoCategory(
+                        "Receive Content",
+                        listOf(
+                            ComposableDemo("Basic") { TextFieldReceiveContentDemo() },
+                            ComposableDemo("Nested") { NestedReceiveContentDemo() },
+                        )
+                    ),
+                    ComposableDemo("Output Transformation") {
+                        BasicTextFieldOutputTransformationDemos()
+                    },
+                    ComposableDemo("Secure Field") { BasicSecureTextFieldDemos() },
+                    ComposableDemo("Inside Dialog") { BasicTextFieldsInDialogDemo() },
+                    ComposableDemo("Swap the field but reuse the state") {
+                        SwapFieldSameStateDemo()
+                    },
+                    ComposableDemo("Custom PIN field") { BasicTextFieldCustomPinFieldDemo() },
+                    ComposableDemo("Undo/Redo") { BasicTextFieldUndoSample() },
+                    ComposableDemo("Long text") { BasicTextFieldLongTextDemo() },
+                    ComposableDemo("Cursor") { TextFieldCursorNotBlinkingInUnfocusedWindowDemo() },
+                    ComposableDemo("Handwriting detector") { HandwritingDetectorSample() }
+                )
+            ),
+            DemoCategory(
+                "Selection",
+                listOf(
+                    ComposableDemo("Text selection") { TextSelectionDemo() },
+                    ComposableDemo("Text selection sample") { TextSelectionSample() },
+                    ComposableDemo("Overflowed Selection") { TextOverflowedSelectionDemo() },
+                    ComposableDemo("Scrollable Column Text Selection") {
+                        TextScrollableColumnSelectionDemo()
+                    },
+                    ComposableDemo("Selection Minimum Touch Target") {
+                        MinTouchTargetTextSelection()
+                    },
+                    ComposableDemo("Selection & DropdownMenu") { DropdownMenuSelection() },
+                )
+            ),
+            DemoCategory(
+                "\uD83D\uDD75️️️ Memory allocs",
+                listOf(
+                    ComposableDemo("\uD83D\uDD75️ SetText") { MemoryAllocsSetText() },
+                    ComposableDemo("\uD83D\uDD75️ IfNotEmptyText") { MemoryAllocsIfNotEmptyText() },
+                    ComposableDemo("\uD83E\uDDA5 LazyList reuse") { MemoryAllocsLazyList() }
+                )
+            ),
+            ComposableDemo("\uD83D\uDD17 Hyperlinks") { Hyperlinks() },
+            ComposableDemo("Text Pointer Icon") { TextPointerIconDemo() },
+            ComposableDemo("Html") { AnnotatedStringFromHtml() },
+            ComposableDemo("Show/hide keyboard via scroll") { windowInsetsNestedScrollDemo() },
+        )
     )
-)
diff --git a/compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/text/TextFieldCursorBlinkingDemo.kt b/compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/text/TextFieldCursorBlinkingDemo.kt
index 21ece6d..d915d6c 100644
--- a/compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/text/TextFieldCursorBlinkingDemo.kt
+++ b/compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/text/TextFieldCursorBlinkingDemo.kt
@@ -60,53 +60,35 @@
     Column(Modifier.verticalScroll(rememberScrollState())) {
         BasicText("Focus on any of the text fields below to observe cursor behavior.")
         BasicText("All fields are not editable, with a fixed selection position")
-        Item("Default cursor") {
-            DefaultCursor()
-        }
-        Item("Color cursor") {
-            ColorCursor()
-        }
-        Item("Color changing cursor") {
-            RainbowCursor()
-        }
-        Item("Gradient Cursor") {
-            GradientCursor()
-        }
-        Item("Cursors don't blink when typing (fake typing)") {
-            TypingCursorNeverBlinks()
-        }
-        Item("Changing selection shows cursor") {
-            ChangingSelectionShowsCursor()
-        }
+        Item("Default cursor") { DefaultCursor() }
+        Item("Color cursor") { ColorCursor() }
+        Item("Color changing cursor") { RainbowCursor() }
+        Item("Gradient Cursor") { GradientCursor() }
+        Item("Cursors don't blink when typing (fake typing)") { TypingCursorNeverBlinks() }
+        Item("Changing selection shows cursor") { ChangingSelectionShowsCursor() }
     }
 }
 
 @Composable
 private fun Item(title: String, content: @Composable () -> Unit) {
     Column {
-        BasicText(title, style = TextStyle.Default.copy(
-            color = Color(0xFFAAAAAA),
-            fontSize = 20.sp
-        ))
+        BasicText(
+            title,
+            style = TextStyle.Default.copy(color = Color(0xFFAAAAAA), fontSize = 20.sp)
+        )
         content()
     }
 }
 
 @Composable
 private fun DefaultCursor() {
-    val textFieldValue = TextFieldValue(
-        text = "Normal blink",
-        selection = TextRange(3)
-    )
+    val textFieldValue = TextFieldValue(text = "Normal blink", selection = TextRange(3))
     BasicTextField(value = textFieldValue, modifier = demoTextFieldModifiers, onValueChange = {})
 }
 
 @Composable
 private fun ColorCursor() {
-    val textFieldValue = TextFieldValue(
-        text = "Red cursor",
-        selection = TextRange(3)
-    )
+    val textFieldValue = TextFieldValue(text = "Red cursor", selection = TextRange(3))
     BasicTextField(
         value = textFieldValue,
         modifier = demoTextFieldModifiers,
@@ -125,18 +107,13 @@
 
 @Composable
 private fun RainbowCursor() {
-    val textFieldValue = TextFieldValue(
-        text = "Rainbow cursor",
-        selection = TextRange(3)
-    )
+    val textFieldValue = TextFieldValue(text = "Rainbow cursor", selection = TextRange(3))
 
     val color = remember { Animatable(Red) }
     var shouldAnimate by remember { mutableStateOf(false) }
     LaunchedEffect(shouldAnimate) {
         while (shouldAnimate) {
-            Rainbow.forEach {
-                color.animateTo(it, TweenSpec(1_800))
-            }
+            Rainbow.forEach { color.animateTo(it, TweenSpec(1_800)) }
         }
     }
     BasicTextField(
@@ -149,10 +126,7 @@
 
 @Composable
 private fun GradientCursor() {
-    val textFieldValue = TextFieldValue(
-        text = "Gradient cursor",
-        selection = TextRange(3)
-    )
+    val textFieldValue = TextFieldValue(text = "Gradient cursor", selection = TextRange(3))
 
     BasicTextField(
         value = textFieldValue,
@@ -175,10 +149,11 @@
             }
         }
     }
-    val textFieldValue = TextFieldValue(
-        text = text,
-        selection = TextRange(text.length),
-    )
+    val textFieldValue =
+        TextFieldValue(
+            text = text,
+            selection = TextRange(text.length),
+        )
     BasicTextField(
         value = textFieldValue,
         onValueChange = {},
@@ -197,10 +172,7 @@
             delay(500)
         }
     }
-    val textFieldValue = TextFieldValue(
-        text = text,
-        selection = selection
-    )
+    val textFieldValue = TextFieldValue(text = text, selection = selection)
     Column {
         BasicTextField(
             value = textFieldValue,
@@ -230,14 +202,11 @@
                     val dialogFocusRequester = remember { FocusRequester() }
                     Text(
                         "Hello! This is a dialog.",
-                        Modifier
-                            .padding(20.dp)
+                        Modifier.padding(20.dp)
                             .focusRequester(dialogFocusRequester)
                             .background(Color.DarkGray)
                     )
-                    LaunchedEffect(Unit) {
-                        dialogFocusRequester.requestFocus()
-                    }
+                    LaunchedEffect(Unit) { dialogFocusRequester.requestFocus() }
                 }
             }
         }
diff --git a/compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/text/TextFieldFocusDemo.kt b/compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/text/TextFieldFocusDemo.kt
index 2ea25dc..aa3cf8b 100644
--- a/compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/text/TextFieldFocusDemo.kt
+++ b/compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/text/TextFieldFocusDemo.kt
@@ -59,18 +59,20 @@
 import androidx.compose.ui.text.input.ImeAction
 import androidx.compose.ui.unit.dp
 
-private val modifierKeys = setOf(
-    NativeKeyEvent.KEYCODE_SHIFT_LEFT,
-    NativeKeyEvent.KEYCODE_SHIFT_RIGHT,
-    NativeKeyEvent.KEYCODE_ALT_LEFT,
-    NativeKeyEvent.KEYCODE_ALT_RIGHT,
-    NativeKeyEvent.KEYCODE_CTRL_LEFT,
-    NativeKeyEvent.KEYCODE_CTRL_RIGHT,
-    NativeKeyEvent.KEYCODE_META_LEFT,
-    NativeKeyEvent.KEYCODE_META_RIGHT,
-)
+private val modifierKeys =
+    setOf(
+        NativeKeyEvent.KEYCODE_SHIFT_LEFT,
+        NativeKeyEvent.KEYCODE_SHIFT_RIGHT,
+        NativeKeyEvent.KEYCODE_ALT_LEFT,
+        NativeKeyEvent.KEYCODE_ALT_RIGHT,
+        NativeKeyEvent.KEYCODE_CTRL_LEFT,
+        NativeKeyEvent.KEYCODE_CTRL_RIGHT,
+        NativeKeyEvent.KEYCODE_META_LEFT,
+        NativeKeyEvent.KEYCODE_META_RIGHT,
+    )
 
-private val KeyEvent.keyCode get() = nativeKeyEvent.keyCode
+private val KeyEvent.keyCode
+    get() = nativeKeyEvent.keyCode
 
 private val demoInstructionText =
     """Navigate the below text fields using the (shift)-tab keys on a physical keyboard.
@@ -81,12 +83,14 @@
         | so the enter key ought to move the focus to the next focus element.
         | In multi-line, the tab and enter keys should add '\t' and '\n', respectively.
         |"""
-        .trimMargin().replace("\n", "")
+        .trimMargin()
+        .replace("\n", "")
 
 private val keyIndicatorInstructionText =
     """The keys being pressed and their modifiers are shown below.
         | Keys that are currently being pressed are in red text."""
-        .trimMargin().replace("\n", "")
+        .trimMargin()
+        .replace("\n", "")
 
 @Composable
 fun TextFieldFocusDemo() {
@@ -110,26 +114,23 @@
 
     Column(
         horizontalAlignment = Alignment.CenterHorizontally,
-        modifier = Modifier
-            .safeDrawingPadding()
-            .verticalScroll(rememberScrollState())
-            .padding(10.dp)
-            .onPreviewKeyEvent { event ->
-                if (event.keyCode !in modifierKeys) {
-                    when (event.type) {
-                        KeyEventType.KeyDown -> onKeyDown(event)
-                        KeyEventType.KeyUp -> onKeyUp(event)
+        modifier =
+            Modifier.safeDrawingPadding()
+                .verticalScroll(rememberScrollState())
+                .padding(10.dp)
+                .onPreviewKeyEvent { event ->
+                    if (event.keyCode !in modifierKeys) {
+                        when (event.type) {
+                            KeyEventType.KeyDown -> onKeyDown(event)
+                            KeyEventType.KeyUp -> onKeyUp(event)
+                        }
                     }
-                }
-                false // don't consume the event, we just want to observe it
-            },
+                    false // don't consume the event, we just want to observe it
+                },
     ) {
         val (multiLine, setMultiLine) = rememberSaveable { mutableStateOf(false) }
         Text(demoInstructionText)
-        SingleLineToggle(
-            checked = multiLine,
-            onCheckedChange = setMultiLine
-        )
+        SingleLineToggle(checked = multiLine, onCheckedChange = setMultiLine)
         Column(horizontalAlignment = Alignment.CenterHorizontally) {
             DemoTextField("Up", multiLine)
             Row {
@@ -154,29 +155,20 @@
 }
 
 @Composable
-private fun DemoTextField(
-    initText: String,
-    multiLine: Boolean,
-    startWithFocus: Boolean = false
-) {
-    var modifier = Modifier
-        .padding(6.dp)
-        .border(1.dp, Color.LightGray, RoundedCornerShape(6.dp))
-        .padding(6.dp)
+private fun DemoTextField(initText: String, multiLine: Boolean, startWithFocus: Boolean = false) {
+    var modifier =
+        Modifier.padding(6.dp).border(1.dp, Color.LightGray, RoundedCornerShape(6.dp)).padding(6.dp)
 
     if (startWithFocus) {
         val focusRequester = remember { FocusRequester() }
         modifier = modifier.focusRequester(focusRequester)
-        LaunchedEffect(focusRequester) {
-            focusRequester.requestFocus()
-        }
+        LaunchedEffect(focusRequester) { focusRequester.requestFocus() }
     }
 
-    var text by remember(multiLine) {
-        mutableStateOf(
-            if (multiLine) "$initText line 1\n$initText line 2" else initText
-        )
-    }
+    var text by
+        remember(multiLine) {
+            mutableStateOf(if (multiLine) "$initText line 1\n$initText line 2" else initText)
+        }
 
     BasicTextField(
         value = text,
@@ -197,9 +189,7 @@
 private fun KeyPressList(keys: List<KeyState>) {
     Column(
         horizontalAlignment = Alignment.CenterHorizontally,
-        modifier = Modifier
-            .fillMaxSize()
-            .border(1.dp, Color.LightGray, RoundedCornerShape(4.dp)),
+        modifier = Modifier.fillMaxSize().border(1.dp, Color.LightGray, RoundedCornerShape(4.dp)),
     ) {
         keys.forEach { keyState ->
             key(keyState.downTime) {
@@ -214,10 +204,14 @@
                     val shift = if (event.isShiftPressed) "SHIFT + " else ""
                     val meta = if (event.isMetaPressed) "META + " else ""
                     Text(
-                        text = ctrl + alt + shift + meta +
-                            NativeKeyEvent.keyCodeToString(event.keyCode)
-                                .replace("KEYCODE_", "")
-                                .replace("DPAD_", ""),
+                        text =
+                            ctrl +
+                                alt +
+                                shift +
+                                meta +
+                                NativeKeyEvent.keyCodeToString(event.keyCode)
+                                    .replace("KEYCODE_", "")
+                                    .replace("DPAD_", ""),
                         color = if (keyState.isUp) Color.Unspecified else Color.Red,
                     )
                 }
diff --git a/compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/text/TextFieldFocusKeyboardInteraction.kt b/compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/text/TextFieldFocusKeyboardInteraction.kt
index 763a665..7911025 100644
--- a/compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/text/TextFieldFocusKeyboardInteraction.kt
+++ b/compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/text/TextFieldFocusKeyboardInteraction.kt
@@ -62,24 +62,14 @@
         verticalArrangement = spacedBy(4.dp),
         modifier = Modifier.verticalScroll(rememberScrollState())
     ) {
-        Button(onClick = { focusManager.clearFocus() }) {
-            Text("Clear focus")
-        }
+        Button(onClick = { focusManager.clearFocus() }) { Text("Clear focus") }
 
-        Column(
-            Modifier
-                .border(1.dp, Color.Black, shape = RoundedCornerShape(8.dp))
-                .padding(4.dp)
-        ) {
+        Column(Modifier.border(1.dp, Color.Black, shape = RoundedCornerShape(8.dp)).padding(4.dp)) {
             Text("Outer Compose Fields")
             FocusableFieldRow()
         }
 
-        Column(
-            Modifier
-                .border(1.dp, Color.Black, shape = RoundedCornerShape(8.dp))
-                .padding(4.dp)
-        ) {
+        Column(Modifier.border(1.dp, Color.Black, shape = RoundedCornerShape(8.dp)).padding(4.dp)) {
             Text("Android EditTexts")
             AndroidView(::AndroidFieldRow)
         }
@@ -111,19 +101,14 @@
             keyboardOptions = KeyboardOptions(keyboardType = KeyboardType.Number),
             modifier = Modifier.weight(1f)
         )
-        TextField(
-            text3,
-            onValueChange = { text3 = it },
-            modifier = Modifier.weight(1f)
-        )
+        TextField(text3, onValueChange = { text3 = it }, modifier = Modifier.weight(1f))
 
         val interactionSource = remember { MutableInteractionSource() }
         val isButtonFocused by interactionSource.collectIsFocusedAsState()
         val buttonFocusRequester = remember { FocusRequester() }
         Button(
             onClick = { buttonFocusRequester.requestFocus() },
-            Modifier
-                .weight(1f)
+            Modifier.weight(1f)
                 .focusRequester(buttonFocusRequester)
                 .focusable(interactionSource = interactionSource)
         ) {
@@ -159,9 +144,7 @@
         val innerCompose = ComposeView(context)
         innerCompose.setContent {
             Column(
-                Modifier
-                    .border(1.dp, Color.Black, shape = RoundedCornerShape(8.dp))
-                    .padding(4.dp)
+                Modifier.border(1.dp, Color.Black, shape = RoundedCornerShape(8.dp)).padding(4.dp)
             ) {
                 Text("Inner Compose Fields")
                 FocusableFieldRow()
diff --git a/compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/text/TextFieldKeyboardTypeDemo.kt b/compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/text/TextFieldKeyboardTypeDemo.kt
index 90b24cd..92997344 100644
--- a/compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/text/TextFieldKeyboardTypeDemo.kt
+++ b/compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/text/TextFieldKeyboardTypeDemo.kt
@@ -61,9 +61,7 @@
             modifier = demoTextFieldModifiers,
             value = text,
             onValueChange = { text = it },
-            keyboardOptions = KeyboardOptions(
-                hintLocales = localeList
-            )
+            keyboardOptions = KeyboardOptions(hintLocales = localeList)
         )
     }
 }
diff --git a/compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/text/TextFieldValueDemo.kt b/compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/text/TextFieldValueDemo.kt
index 4f9d204..3563d6e 100644
--- a/compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/text/TextFieldValueDemo.kt
+++ b/compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/text/TextFieldValueDemo.kt
@@ -50,9 +50,7 @@
             var string by remember { mutableStateOf("") }
             BasicTextField(
                 value = string,
-                onValueChange = {
-                    string = it
-                },
+                onValueChange = { string = it },
                 textStyle = TextStyle(fontSize = fontSize8),
                 modifier = demoTextFieldModifiers
             )
@@ -62,9 +60,7 @@
             var uppercaseValue by remember { mutableStateOf("") }
             BasicTextField(
                 value = uppercaseValue,
-                onValueChange = {
-                    uppercaseValue = it.uppercase(java.util.Locale.US)
-                },
+                onValueChange = { uppercaseValue = it.uppercase(java.util.Locale.US) },
                 textStyle = TextStyle(fontSize = fontSize8),
                 modifier = demoTextFieldModifiers
             )
@@ -74,15 +70,11 @@
             var clearedValue by remember { mutableStateOf("") }
             BasicTextField(
                 value = clearedValue,
-                onValueChange = {
-                    clearedValue = it
-                },
+                onValueChange = { clearedValue = it },
                 textStyle = TextStyle(fontSize = fontSize8),
                 modifier = demoTextFieldModifiers
             )
-            Button(onClick = { clearedValue = "" }) {
-                Text("Clear")
-            }
+            Button(onClick = { clearedValue = "" }) { Text("Clear") }
         }
         item {
             TagLine("Delayed callback")
diff --git a/compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/text/TextFieldsInDialogDemo.kt b/compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/text/TextFieldsInDialogDemo.kt
index d7244bb..697fed5 100644
--- a/compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/text/TextFieldsInDialogDemo.kt
+++ b/compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/text/TextFieldsInDialogDemo.kt
@@ -46,62 +46,56 @@
 import androidx.compose.ui.window.Dialog
 import androidx.compose.ui.window.DialogProperties
 
-private val dialogDemos = listOf(
-    ComposableDemo("Full screen dialog, multiple fields") { onNavigateUp ->
-        Dialog(onDismissRequest = onNavigateUp) {
-            InputFieldDemo()
+private val dialogDemos =
+    listOf(
+        ComposableDemo("Full screen dialog, multiple fields") { onNavigateUp ->
+            Dialog(onDismissRequest = onNavigateUp) { InputFieldDemo() }
+        },
+        ComposableDemo(
+            "Small dialog, single field (platform default width, decor fits system windows)"
+        ) { onNavigateUp ->
+            Dialog(
+                onDismissRequest = onNavigateUp,
+                properties =
+                    DialogProperties(usePlatformDefaultWidth = true, decorFitsSystemWindows = true)
+            ) {
+                SingleTextFieldDialog()
+            }
+        },
+        ComposableDemo("Small dialog, single field (decor fits system windows)") { onNavigateUp ->
+            Dialog(
+                onDismissRequest = onNavigateUp,
+                properties =
+                    DialogProperties(usePlatformDefaultWidth = false, decorFitsSystemWindows = true)
+            ) {
+                SingleTextFieldDialog()
+            }
+        },
+        ComposableDemo("Small dialog, single field (platform default width)") { onNavigateUp ->
+            Dialog(
+                onDismissRequest = onNavigateUp,
+                properties =
+                    DialogProperties(usePlatformDefaultWidth = true, decorFitsSystemWindows = false)
+            ) {
+                SingleTextFieldDialog()
+            }
+        },
+        ComposableDemo("Small dialog, single field") { onNavigateUp ->
+            Dialog(
+                onDismissRequest = onNavigateUp,
+                properties =
+                    DialogProperties(
+                        usePlatformDefaultWidth = false,
+                        decorFitsSystemWindows = false
+                    )
+            ) {
+                SingleTextFieldDialog()
+            }
+        },
+        ComposableDemo("Show keyboard automatically") { onNavigateUp ->
+            Dialog(onDismissRequest = onNavigateUp) { AutoFocusTextFieldDialog() }
         }
-    },
-    ComposableDemo(
-        "Small dialog, single field (platform default width, decor fits system windows)"
-    ) { onNavigateUp ->
-        Dialog(
-            onDismissRequest = onNavigateUp,
-            properties = DialogProperties(
-                usePlatformDefaultWidth = true,
-                decorFitsSystemWindows = true
-            )
-        ) { SingleTextFieldDialog() }
-    },
-    ComposableDemo(
-        "Small dialog, single field (decor fits system windows)"
-    ) { onNavigateUp ->
-        Dialog(
-            onDismissRequest = onNavigateUp,
-            properties = DialogProperties(
-                usePlatformDefaultWidth = false,
-                decorFitsSystemWindows = true
-            )
-        ) { SingleTextFieldDialog() }
-    },
-    ComposableDemo(
-        "Small dialog, single field (platform default width)"
-    ) { onNavigateUp ->
-        Dialog(
-            onDismissRequest = onNavigateUp,
-            properties = DialogProperties(
-                usePlatformDefaultWidth = true,
-                decorFitsSystemWindows = false
-            )
-        ) { SingleTextFieldDialog() }
-    },
-    ComposableDemo(
-        "Small dialog, single field"
-    ) { onNavigateUp ->
-        Dialog(
-            onDismissRequest = onNavigateUp,
-            properties = DialogProperties(
-                usePlatformDefaultWidth = false,
-                decorFitsSystemWindows = false
-            )
-        ) { SingleTextFieldDialog() }
-    },
-    ComposableDemo("Show keyboard automatically") { onNavigateUp ->
-        Dialog(onDismissRequest = onNavigateUp) {
-            AutoFocusTextFieldDialog()
-        }
-    }
-)
+    )
 
 @OptIn(ExperimentalMaterialApi::class)
 @Composable
@@ -112,23 +106,17 @@
     if (currentDemoIndex == -1) {
         LazyColumn(state = listState) {
             itemsIndexed(dialogDemos) { index, demo ->
-                ListItem(Modifier.clickable { setDemoIndex(index) }) {
-                    Text(demo.title)
-                }
+                ListItem(Modifier.clickable { setDemoIndex(index) }) { Text(demo.title) }
             }
         }
     } else {
         val currentDemo = dialogDemos[currentDemoIndex]
         Text(
             currentDemo.title,
-            modifier = Modifier
-                .fillMaxSize()
-                .wrapContentSize(),
+            modifier = Modifier.fillMaxSize().wrapContentSize(),
             textAlign = TextAlign.Center
         )
-        Layout(
-            content = { currentDemo.content { setDemoIndex(-1) } }
-        ) { measurables, _ ->
+        Layout(content = { currentDemo.content { setDemoIndex(-1) } }) { measurables, _ ->
             check(measurables.isEmpty()) { "Dialog demo must only emit a Dialog composable." }
             layout(0, 0) {}
         }
@@ -146,9 +134,7 @@
     var text by remember { mutableStateOf("") }
     val focusRequester = remember { FocusRequester() }
 
-    LaunchedEffect(focusRequester) {
-        focusRequester.requestFocus()
-    }
+    LaunchedEffect(focusRequester) { focusRequester.requestFocus() }
 
     TextField(
         text,
diff --git a/compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/text/TextFieldsInScrollableDemo.kt b/compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/text/TextFieldsInScrollableDemo.kt
index f094edb..c3cc5d9 100644
--- a/compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/text/TextFieldsInScrollableDemo.kt
+++ b/compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/text/TextFieldsInScrollableDemo.kt
@@ -97,23 +97,15 @@
 @Preview(showBackground = true)
 @Composable
 private fun TextFieldInScrollableColumn() {
-    Column(
-        Modifier.verticalScroll(rememberScrollState())
-    ) {
-        repeat(50) { index ->
-            DemoTextField(index)
-        }
+    Column(Modifier.verticalScroll(rememberScrollState())) {
+        repeat(50) { index -> DemoTextField(index) }
     }
 }
 
 @Preview(showBackground = true)
 @Composable
 private fun TextFieldInLazyColumn() {
-    LazyColumn {
-        items(50) { index ->
-            DemoTextField(index)
-        }
-    }
+    LazyColumn { items(50) { index -> DemoTextField(index) } }
 }
 
 @Preview(showBackground = true)
@@ -129,10 +121,7 @@
         value = text,
         onValueChange = { text = it },
         leadingIcon = { Text(index.toString()) },
-        modifier = Modifier
-            .padding(4.dp)
-            .border(1.dp, Color.Black)
-            .fillMaxWidth()
+        modifier = Modifier.padding(4.dp).border(1.dp, Color.Black).fillMaxWidth()
     )
 }
 
@@ -141,7 +130,8 @@
         val column = LinearLayout(context)
         column.orientation = LinearLayout.VERTICAL
         addView(
-            column, ViewGroup.LayoutParams(
+            column,
+            ViewGroup.LayoutParams(
                 ViewGroup.LayoutParams.MATCH_PARENT,
                 ViewGroup.LayoutParams.WRAP_CONTENT
             )
@@ -149,12 +139,14 @@
 
         repeat(30) {
             val text = EditText(context)
-            column.addView(text, LinearLayout.LayoutParams(
-                ViewGroup.LayoutParams.MATCH_PARENT,
-                ViewGroup.LayoutParams.WRAP_CONTENT
-            ).also {
-                it.setMargins(20)
-            })
+            column.addView(
+                text,
+                LinearLayout.LayoutParams(
+                        ViewGroup.LayoutParams.MATCH_PARENT,
+                        ViewGroup.LayoutParams.WRAP_CONTENT
+                    )
+                    .also { it.setMargins(20) }
+            )
         }
     }
 }
diff --git a/compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/text/VariableFontsDemo.kt b/compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/text/VariableFontsDemo.kt
index 970c573..10cc07d 100644
--- a/compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/text/VariableFontsDemo.kt
+++ b/compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/text/VariableFontsDemo.kt
@@ -64,7 +64,7 @@
 fun VariableFontsDemo() {
     if (Build.VERSION.SDK_INT < 26) {
         Text("Variable fonts are only supported on API 26+")
-     }
+    }
 
     val (weight, setWeight) = remember { mutableFloatStateOf(1000f) }
     val (italic, setItalic) = remember { mutableStateOf(false) }
@@ -84,8 +84,10 @@
             }
         }
         item {
-            Text("These demos show setting fontVariationSettings on a demo font that " +
-                "exaggerates 'wght'. Font only supports the codepoint 'A' code=\"0x41\"")
+            Text(
+                "These demos show setting fontVariationSettings on a demo font that " +
+                    "exaggerates 'wght'. Font only supports the codepoint 'A' code=\"0x41\""
+            )
         }
         item {
             TagLine(tag = "ResourceFont")
@@ -118,19 +120,21 @@
 fun AssetFont(weight: Int, italic: Boolean) {
     Column(Modifier.fillMaxWidth()) {
         val context = LocalContext.current
-        val assetFonts = remember(weight, italic) {
-            FontFamily(
-                Font(
-                    "subdirectory/asset_variable_font.ttf",
-                    context.assets,
-                    variationSettings = FontVariation.Settings(
-                        FontVariation.weight(weight.toInt()), /* Changes "A" glyph */
-                        /* italic not supported by font, ignored */
-                        FontVariation.italic(if (italic) 1f else 0f)
+        val assetFonts =
+            remember(weight, italic) {
+                FontFamily(
+                    Font(
+                        "subdirectory/asset_variable_font.ttf",
+                        context.assets,
+                        variationSettings =
+                            FontVariation.Settings(
+                                FontVariation.weight(weight.toInt()), /* Changes "A" glyph */
+                                /* italic not supported by font, ignored */
+                                FontVariation.italic(if (italic) 1f else 0f)
+                            )
                     )
                 )
-            )
-        }
+            }
         Text(
             "A",
             fontSize = 48.sp,
@@ -144,25 +148,25 @@
 @Composable
 fun FileFont(weight: Int, italic: Boolean) {
     val context = LocalContext.current
-    val filePath = remember { mutableStateOf<String?> (null) }
-    LaunchedEffect(Unit) {
-        filePath.value = mkTempFont(context).path
-    }
+    val filePath = remember { mutableStateOf<String?>(null) }
+    LaunchedEffect(Unit) { filePath.value = mkTempFont(context).path }
     val actualPath = filePath.value ?: return
 
     Column(Modifier.fillMaxWidth()) {
-        val fileFonts = remember(weight, italic) {
-            FontFamily(
-                Font(
-                    File(actualPath),
-                    variationSettings = FontVariation.Settings(
-                        FontVariation.weight(weight.toInt()), /* Changes "A" glyph */
-                        /* italic not supported by font, ignored */
-                        FontVariation.italic(if (italic) 1f else 0f)
+        val fileFonts =
+            remember(weight, italic) {
+                FontFamily(
+                    Font(
+                        File(actualPath),
+                        variationSettings =
+                            FontVariation.Settings(
+                                FontVariation.weight(weight.toInt()), /* Changes "A" glyph */
+                                /* italic not supported by font, ignored */
+                                FontVariation.italic(if (italic) 1f else 0f)
+                            )
                     )
                 )
-            )
-        }
+            }
         Text(
             "A",
             fontSize = 48.sp,
@@ -177,25 +181,25 @@
 @RequiresApi(26)
 fun ParcelFileDescriptorFont(weight: Int, italic: Boolean) {
     val context = LocalContext.current
-    val filePath = remember { mutableStateOf<String?> (null) }
-    LaunchedEffect(Unit) {
-        filePath.value = mkTempFont(context).path
-    }
+    val filePath = remember { mutableStateOf<String?>(null) }
+    LaunchedEffect(Unit) { filePath.value = mkTempFont(context).path }
     val actualPath = filePath.value ?: return
 
     Column(Modifier.fillMaxWidth()) {
-        val parcelFonts = remember(weight, italic) {
-            FontFamily(
-                Font(
-                    File(actualPath).toParcelFileDescriptor(context),
-                    variationSettings = FontVariation.Settings(
-                        FontVariation.weight(weight.toInt()), /* Changes "A" glyph */
-                        /* italic not supported by font, ignored */
-                        FontVariation.italic(if (italic) 1f else 0f)
+        val parcelFonts =
+            remember(weight, italic) {
+                FontFamily(
+                    Font(
+                        File(actualPath).toParcelFileDescriptor(context),
+                        variationSettings =
+                            FontVariation.Settings(
+                                FontVariation.weight(weight.toInt()), /* Changes "A" glyph */
+                                /* italic not supported by font, ignored */
+                                FontVariation.italic(if (italic) 1f else 0f)
+                            )
                     )
                 )
-            )
-        }
+            }
         Text(
             "A",
             fontSize = 48.sp,
@@ -209,18 +213,20 @@
 @Composable
 fun DeviceNamedFontFamilyFont(weight: Int, italic: Boolean) {
     Column(Modifier.fillMaxWidth()) {
-        val deviceFonts = remember(weight, italic) {
-            FontFamily(
-                Font(
-                    DeviceFontFamilyName("sans-serif"),
-                    variationSettings = FontVariation.Settings(
-                        FontVariation.weight(weight.toInt()), /* Changes "A" glyph */
-                        /* italic not supported by font, ignored */
-                        FontVariation.italic(if (italic) 1f else 0f)
+        val deviceFonts =
+            remember(weight, italic) {
+                FontFamily(
+                    Font(
+                        DeviceFontFamilyName("sans-serif"),
+                        variationSettings =
+                            FontVariation.Settings(
+                                FontVariation.weight(weight.toInt()), /* Changes "A" glyph */
+                                /* italic not supported by font, ignored */
+                                FontVariation.italic(if (italic) 1f else 0f)
+                            )
                     )
                 )
-            )
-        }
+            }
         Text(
             "Setting variation on system fonts has no effect on (most) Android builds",
             fontSize = 12.sp,
@@ -228,9 +234,7 @@
             modifier = Modifier.align(Alignment.CenterHorizontally)
         )
         val textPaint = remember { TextPaint() }
-        Canvas(modifier = Modifier
-            .fillMaxWidth()
-            .height(40.dp)) {
+        Canvas(modifier = Modifier.fillMaxWidth().height(40.dp)) {
             this.drawIntoCanvas {
                 val nativeCanvas = drawContext.canvas.nativeCanvas
                 textPaint.typeface = Typeface.create("sans-serif", Typeface.NORMAL)
@@ -244,7 +248,8 @@
                     "Platform 'sans-serif' behavior on this device' (nativeCanvas)" /* text */,
                     0f /* x */,
                     40f /* y */,
-                    textPaint)
+                    textPaint
+                )
             }
         }
     }
@@ -254,18 +259,20 @@
 @Composable
 fun ResourceFont(weight: Int, italic: Boolean) {
     Column(Modifier.fillMaxWidth()) {
-        val resourceFonts = remember(weight, italic) {
-            FontFamily(
-                Font(
-                    R.font.variable_font,
-                    variationSettings = FontVariation.Settings(
-                        FontVariation.weight(weight.toInt()), /* Changes "A" glyph */
-                        /* italic not supported by font, ignored */
-                        FontVariation.italic(if (italic) 1f else 0f)
+        val resourceFonts =
+            remember(weight, italic) {
+                FontFamily(
+                    Font(
+                        R.font.variable_font,
+                        variationSettings =
+                            FontVariation.Settings(
+                                FontVariation.weight(weight.toInt()), /* Changes "A" glyph */
+                                /* italic not supported by font, ignored */
+                                FontVariation.italic(if (italic) 1f else 0f)
+                            )
                     )
                 )
-            )
-        }
+            }
         Text(
             "A",
             fontSize = 48.sp,
@@ -275,16 +282,17 @@
     }
 }
 
-private suspend fun mkTempFont(context: Context): File = withContext(Dispatchers.IO) {
-    val temp = File.createTempFile("tmp", ".ttf", context.filesDir)
-    context.assets.open("subdirectory/asset_variable_font.ttf").use { input ->
-        val bytes = input.readBytes()
-        context.openFileOutput(temp.name, Context.MODE_PRIVATE).use { output ->
-            output.write(bytes)
+private suspend fun mkTempFont(context: Context): File =
+    withContext(Dispatchers.IO) {
+        val temp = File.createTempFile("tmp", ".ttf", context.filesDir)
+        context.assets.open("subdirectory/asset_variable_font.ttf").use { input ->
+            val bytes = input.readBytes()
+            context.openFileOutput(temp.name, Context.MODE_PRIVATE).use { output ->
+                output.write(bytes)
+            }
         }
+        temp
     }
-    temp
-}
 
 private fun File.toParcelFileDescriptor(context: Context): ParcelFileDescriptor {
     context.openFileInput(name).use { input ->
diff --git a/compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/text/VisualTransformationDemo.kt b/compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/text/VisualTransformationDemo.kt
index 8189632..a107be0 100644
--- a/compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/text/VisualTransformationDemo.kt
+++ b/compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/text/VisualTransformationDemo.kt
@@ -47,22 +47,21 @@
 import androidx.compose.ui.text.toUpperCase
 import androidx.compose.ui.tooling.preview.Preview
 
-/**
- * The offset translator which works for all offset keep remains the same.
- */
-private val identityTranslator = object : OffsetMapping {
-    override fun originalToTransformed(offset: Int): Int = offset
-    override fun transformedToOriginal(offset: Int): Int = offset
-}
+/** The offset translator which works for all offset keep remains the same. */
+private val identityTranslator =
+    object : OffsetMapping {
+        override fun originalToTransformed(offset: Int): Int = offset
+
+        override fun transformedToOriginal(offset: Int): Int = offset
+    }
 
 /**
  * The visual filter for capitalization.
  *
  * This filer converts ASCII characters to capital form.
  */
-private class CapitalizeTransformation(
-    val locale: LocaleList = LocaleList("en-US")
-) : VisualTransformation {
+private class CapitalizeTransformation(val locale: LocaleList = LocaleList("en-US")) :
+    VisualTransformation {
     override fun filter(text: AnnotatedString): TransformedText {
         // Note: identityTranslator doesn't work for some locale, e.g. Turkish
         return TransformedText(AnnotatedString(text.text).toUpperCase(locale), identityTranslator)
@@ -74,55 +73,56 @@
  *
  * @see phoneNumberFilter
  */
-private fun phoneNumberOffsetTranslator(text: String) = object : OffsetMapping {
-    override fun originalToTransformed(offset: Int): Int {
-        return when (offset) {
-            0 -> 1
-            1 -> 2
-            2 -> 3
-            3 -> 6
-            4 -> 7
-            5 -> 8
-            6 -> 10
-            7 -> 11
-            8 -> 12
-            9 -> 13
-            else -> 14
+private fun phoneNumberOffsetTranslator(text: String) =
+    object : OffsetMapping {
+        override fun originalToTransformed(offset: Int): Int {
+            return when (offset) {
+                0 -> 1
+                1 -> 2
+                2 -> 3
+                3 -> 6
+                4 -> 7
+                5 -> 8
+                6 -> 10
+                7 -> 11
+                8 -> 12
+                9 -> 13
+                else -> 14
+            }
+        }
+
+        override fun transformedToOriginal(offset: Int): Int {
+            return when (offset) {
+                0 -> 0
+                1 -> 0
+                2 -> 1
+                3 -> 2
+                4 -> 3
+                5 -> 3
+                6 -> 3
+                7 -> 4
+                8 -> 5
+                9 -> 6
+                10 -> 6
+                11 -> 7
+                12 -> 8
+                13 -> 9
+                else -> 10
+            }.coerceAtMost(text.length)
         }
     }
 
-    override fun transformedToOriginal(offset: Int): Int {
-        return when (offset) {
-            0 -> 0
-            1 -> 0
-            2 -> 1
-            3 -> 2
-            4 -> 3
-            5 -> 3
-            6 -> 3
-            7 -> 4
-            8 -> 5
-            9 -> 6
-            10 -> 6
-            11 -> 7
-            12 -> 8
-            13 -> 9
-            else -> 10
-        }.coerceAtMost(text.length)
-    }
-}
-
 /**
  * The visual filter for phone number.
  *
- * This filter converts up to 10 digits to phone number form.
- * For example, "1234567890" will be shown as "(123) 456-7890".
+ * This filter converts up to 10 digits to phone number form. For example, "1234567890" will be
+ * shown as "(123) 456-7890".
  */
 private val phoneNumberFilter = VisualTransformation { text ->
     val trimmed = if (text.text.length >= 10) text.text.substring(0..9) else text.text
     val filled = trimmed + "_".repeat(10 - trimmed.length)
-    val res = "(" + filled.substring(0..2) + ") " + filled.substring(3..5) + "-" +
-        filled.substring(6..9)
+    val res =
+        "(" + filled.substring(0..2) + ") " + filled.substring(3..5) + "-" + filled.substring(6..9)
     TransformedText(AnnotatedString(text = res), phoneNumberOffsetTranslator(text.text))
 }
 
@@ -137,19 +137,20 @@
     }
 }
 
-private fun emailOffsetTranslator(text: String) = object : OffsetMapping {
-    override fun originalToTransformed(offset: Int): Int {
-        return (offset).coerceAtMost(text.length + 10)
-    }
+private fun emailOffsetTranslator(text: String) =
+    object : OffsetMapping {
+        override fun originalToTransformed(offset: Int): Int {
+            return (offset).coerceAtMost(text.length + 10)
+        }
 
-    override fun transformedToOriginal(offset: Int): Int {
-        return if (offset <= text.length) {
-            offset
-        } else {
-            (offset - 10).coerceAtMost(text.length).coerceAtLeast(0)
+        override fun transformedToOriginal(offset: Int): Int {
+            return if (offset <= text.length) {
+                offset
+            } else {
+                (offset - 10).coerceAtMost(text.length).coerceAtLeast(0)
+            }
         }
     }
-}
 
 @Preview
 @Composable
@@ -159,9 +160,7 @@
             TagLine(tag = "Capitalization")
             VariousEditLine(
                 keyboardType = KeyboardType.Ascii,
-                onValueChange = { old, new ->
-                    if (new.any { !it.isLetterOrDigit() }) old else new
-                },
+                onValueChange = { old, new -> if (new.any { !it.isLetterOrDigit() }) old else new },
                 visualTransformation = CapitalizeTransformation()
             )
         }
@@ -169,9 +168,7 @@
             TagLine(tag = "Capitalization (Turkish)")
             VariousEditLine(
                 keyboardType = KeyboardType.Ascii,
-                onValueChange = { old, new ->
-                    if (new.any { !it.isLetterOrDigit() }) old else new
-                },
+                onValueChange = { old, new -> if (new.any { !it.isLetterOrDigit() }) old else new },
                 visualTransformation = CapitalizeTransformation(LocaleList("tr"))
             )
         }
@@ -179,9 +176,7 @@
             TagLine(tag = "Password")
             VariousEditLine(
                 keyboardType = KeyboardType.Password,
-                onValueChange = { old, new ->
-                    if (new.any { !it.isLetterOrDigit() }) old else new
-                },
+                onValueChange = { old, new -> if (new.any { !it.isLetterOrDigit() }) old else new },
                 visualTransformation = PasswordVisualTransformation()
             )
         }
@@ -201,10 +196,7 @@
         }
         item {
             TagLine(tag = "Email Suggestion")
-            VariousEditLine(
-                keyboardType = KeyboardType.Email,
-                visualTransformation = emailFilter
-            )
+            VariousEditLine(keyboardType = KeyboardType.Email, visualTransformation = emailFilter)
         }
         item {
             TagLine(tag = "Editfield with Hint Text")
@@ -235,10 +227,7 @@
         modifier = demoTextFieldModifiers,
         value = state.value,
         singleLine = true,
-        keyboardOptions = KeyboardOptions(
-            keyboardType = keyboardType,
-            imeAction = imeAction
-        ),
+        keyboardOptions = KeyboardOptions(keyboardType = keyboardType, imeAction = imeAction),
         visualTransformation = visualTransformation,
         onValueChange = {
             val value = onValueChange(state.value, it)
@@ -267,24 +256,14 @@
 
 @Composable
 private fun InteractionSourceTextField() {
-    val state = rememberSaveable(stateSaver = TextFieldValue.Saver) {
-        mutableStateOf(TextFieldValue())
-    }
+    val state =
+        rememberSaveable(stateSaver = TextFieldValue.Saver) { mutableStateOf(TextFieldValue()) }
     val interactionSource = remember { MutableInteractionSource() }
 
     Column(demoTextFieldModifiers) {
-        Text(
-            "Pressed?: ${interactionSource.collectIsPressedAsState().value}",
-            fontSize = fontSize4
-        )
-        Text(
-            "Focused?: ${interactionSource.collectIsFocusedAsState().value}",
-            fontSize = fontSize4
-        )
-        Text(
-            "Dragged?: ${interactionSource.collectIsDraggedAsState().value}",
-            fontSize = fontSize4
-        )
+        Text("Pressed?: ${interactionSource.collectIsPressedAsState().value}", fontSize = fontSize4)
+        Text("Focused?: ${interactionSource.collectIsFocusedAsState().value}", fontSize = fontSize4)
+        Text("Dragged?: ${interactionSource.collectIsDraggedAsState().value}", fontSize = fontSize4)
         BasicTextField(
             modifier = Modifier.fillMaxWidth(),
             value = state.value,
diff --git a/compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/text2/BasicSecureTextFieldDemos.kt b/compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/text2/BasicSecureTextFieldDemos.kt
index 134f8a0..bd158fd 100644
--- a/compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/text2/BasicSecureTextFieldDemos.kt
+++ b/compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/text2/BasicSecureTextFieldDemos.kt
@@ -55,11 +55,7 @@
 @OptIn(ExperimentalFoundationApi::class)
 @Composable
 fun BasicSecureTextFieldDemos() {
-    Column(
-        Modifier
-            .imePadding()
-            .verticalScroll(rememberScrollState())
-    ) {
+    Column(Modifier.imePadding().verticalScroll(rememberScrollState())) {
         val clipboardManager = LocalClipboardManager.current
         Button(onClick = { clipboardManager.setText(AnnotatedString("\uD801\uDC37")) }) {
             Text("Copy surrogate pair \"\uD801\uDC37\"")
@@ -108,9 +104,10 @@
             modifier = demoTextFieldModifiers,
             inputTransformation = {
                 // only handle single character insertion, reject everything else
-                val isSingleCharacterInsertion = changes.changeCount == 1 &&
-                    changes.getRange(0).length == 1 &&
-                    changes.getOriginalRange(0).length == 0
+                val isSingleCharacterInsertion =
+                    changes.changeCount == 1 &&
+                        changes.getRange(0).length == 1 &&
+                        changes.getOriginalRange(0).length == 0
 
                 if (!isSingleCharacterInsertion) {
                     revertAllChanges()
@@ -118,14 +115,11 @@
                     replace(
                         start = 0,
                         end = length,
-                        text = asCharSequence()
-                            .substring(changes.getRange(0))
+                        text = asCharSequence().substring(changes.getRange(0))
                     )
                 }
             },
-            outputTransformation = {
-                insert(0, "Enter mask character: ")
-            }
+            outputTransformation = { insert(0, "Enter mask character: ") }
         )
     }
     BasicSecureTextField(
@@ -147,10 +141,8 @@
                 revertAllChanges()
             }
         },
-        keyboardOptions = KeyboardOptions(
-            autoCorrectEnabled = false,
-            keyboardType = KeyboardType.NumberPassword
-        ),
+        keyboardOptions =
+            KeyboardOptions(autoCorrectEnabled = false, keyboardType = KeyboardType.NumberPassword),
         modifier = demoTextFieldModifiers
     )
 }
@@ -163,25 +155,22 @@
     Row(Modifier.fillMaxWidth(), verticalAlignment = Alignment.CenterVertically) {
         BasicSecureTextField(
             state = state,
-            textObfuscationMode = if (visible) {
-                TextObfuscationMode.Visible
-            } else {
-                TextObfuscationMode.RevealLastTyped
-            },
-            modifier = Modifier
-                .weight(1f)
-                .padding(6.dp)
-                .border(1.dp, Color.LightGray, RoundedCornerShape(6.dp))
-                .padding(6.dp)
+            textObfuscationMode =
+                if (visible) {
+                    TextObfuscationMode.Visible
+                } else {
+                    TextObfuscationMode.RevealLastTyped
+                },
+            modifier =
+                Modifier.weight(1f)
+                    .padding(6.dp)
+                    .border(1.dp, Color.LightGray, RoundedCornerShape(6.dp))
+                    .padding(6.dp)
         )
         if (visible) {
-            TextButton(onClick = { visible = false }) {
-                Text("Hide")
-            }
+            TextButton(onClick = { visible = false }) { Text("Hide") }
         } else {
-            TextButton(onClick = { visible = true }) {
-                Text("Show")
-            }
+            TextButton(onClick = { visible = true }) { Text("Show") }
         }
     }
 }
diff --git a/compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/text2/BasicTextFieldCustomPinFieldDemo.kt b/compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/text2/BasicTextFieldCustomPinFieldDemo.kt
index 92d293d..49edc3a 100644
--- a/compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/text2/BasicTextFieldCustomPinFieldDemo.kt
+++ b/compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/text2/BasicTextFieldCustomPinFieldDemo.kt
@@ -83,9 +83,7 @@
 private fun VerifyPinScreen(viewModel: VerifyPinViewModel) {
     val focusRequester = remember { FocusRequester() }
 
-    LaunchedEffect(viewModel) {
-        viewModel.run()
-    }
+    LaunchedEffect(viewModel) { viewModel.run() }
 
     if (!viewModel.isLoading) {
         DisposableEffect(Unit) {
@@ -98,16 +96,13 @@
 
     Column(
         horizontalAlignment = Alignment.CenterHorizontally,
-        modifier = Modifier
-            .fillMaxSize()
-            .wrapContentHeight()
+        modifier = Modifier.fillMaxSize().wrapContentHeight()
     ) {
         PinField(
             viewModel.pinState,
             enabled = !viewModel.isLoading,
-            modifier = Modifier
-                .focusRequester(focusRequester)
-                .graphicsLayer {
+            modifier =
+                Modifier.focusRequester(focusRequester).graphicsLayer {
                     if (blurRadius != 0.dp) {
                         val blurRadiusPx = blurRadius.toPx()
                         renderEffect =
@@ -130,9 +125,7 @@
     suspend fun run() {
         snapshotFlow { pinState.digits }
             .filter { it.length == 6 }
-            .collectLatest { digits ->
-                validatePin(digits)
-            }
+            .collectLatest { digits -> validatePin(digits) }
     }
 
     private suspend fun validatePin(digits: String): Boolean {
@@ -152,13 +145,11 @@
 
 @Stable
 private class PinState(val maxDigits: Int) {
-    val digits: String by derivedStateOf {
-        textState.text.toString()
-    }
+    val digits: String by derivedStateOf { textState.text.toString() }
 
     /*internal*/ val textState = TextFieldState()
-    /*internal*/ val filter: InputTransformation = OnlyDigitsTransformation
-        .then(InputTransformation.maxLength(maxDigits))
+    /*internal*/ val filter: InputTransformation =
+        OnlyDigitsTransformation.then(InputTransformation.maxLength(maxDigits))
 
     fun clear() {
         textState.clearText()
@@ -176,20 +167,14 @@
 }
 
 @Composable
-private fun PinField(
-    state: PinState,
-    modifier: Modifier = Modifier,
-    enabled: Boolean = true
-) {
+private fun PinField(state: PinState, modifier: Modifier = Modifier, enabled: Boolean = true) {
     val contentAlpha = if (enabled) 1f else 0.3f
     val contentColor = LocalContentColor.current.copy(alpha = contentAlpha)
 
     BasicTextField(
         state = state.textState,
         inputTransformation = state.filter,
-        modifier = modifier
-            .border(1.dp, contentColor, RoundedCornerShape(8.dp))
-            .padding(8.dp),
+        modifier = modifier.border(1.dp, contentColor, RoundedCornerShape(8.dp)).padding(8.dp),
         enabled = enabled,
         decorator = {
             CompositionLocalProvider(LocalContentAlpha provides contentAlpha) {
diff --git a/compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/text2/BasicTextFieldDemos.kt b/compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/text2/BasicTextFieldDemos.kt
index ceab4e2..c93b7bf 100644
--- a/compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/text2/BasicTextFieldDemos.kt
+++ b/compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/text2/BasicTextFieldDemos.kt
@@ -58,30 +58,18 @@
     val state = remember { TextFieldState() }
 
     Column {
-        Button(onClick = { swapped = !swapped }) {
-            Text("Swap")
-        }
+        Button(onClick = { swapped = !swapped }) { Text("Swap") }
         if (swapped) {
-            BasicTextField(
-                state,
-                Modifier.border(1.dp, Color.Magenta)
-            )
+            BasicTextField(state, Modifier.border(1.dp, Color.Magenta))
         } else {
-            BasicTextField(
-                state,
-                Modifier.border(1.dp, Color.Blue)
-            )
+            BasicTextField(state, Modifier.border(1.dp, Color.Blue))
         }
     }
 }
 
 @Composable
 fun BasicTextFieldDemos() {
-    Column(
-        Modifier
-            .imePadding()
-            .verticalScroll(rememberScrollState())
-    ) {
+    Column(Modifier.imePadding().verticalScroll(rememberScrollState())) {
         TagLine(tag = "Plain BasicTextField")
         PlainBasicTextField()
 
@@ -101,11 +89,7 @@
 
 @Composable
 fun BasicTextFieldValueCallbackDemo() {
-    Column(
-        Modifier
-            .imePadding()
-            .verticalScroll(rememberScrollState())
-    ) {
+    Column(Modifier.imePadding().verticalScroll(rememberScrollState())) {
         TagLine("Simple string-only")
         SimpleValueCallbackDemo()
 
@@ -117,11 +101,7 @@
 @Composable
 private fun SimpleValueCallbackDemo() {
     var text by remember { mutableStateOf("") }
-    BasicTextField(
-        value = text,
-        onValueChange = { text = it },
-        modifier = demoTextFieldModifiers
-    )
+    BasicTextField(value = text, onValueChange = { text = it }, modifier = demoTextFieldModifiers)
 }
 
 @Composable
@@ -162,10 +142,7 @@
         state = state,
         modifier = demoTextFieldModifiers,
         textStyle = TextStyle(fontSize = fontSize8, textAlign = TextAlign.Center),
-        lineLimits = TextFieldLineLimits.MultiLine(
-            minHeightInLines = 3,
-            maxHeightInLines = 3
-        )
+        lineLimits = TextFieldLineLimits.MultiLine(minHeightInLines = 3, maxHeightInLines = 3)
     )
 }
 
@@ -175,10 +152,14 @@
     var counter by remember { mutableIntStateOf(0) }
     val states = remember { listOf(TextFieldState(), TextFieldState()) }
     val state = states[counter]
-    Text("Click to toggle state: $counter", modifier = Modifier.clickable {
-        counter++
-        counter %= 2
-    })
+    Text(
+        "Click to toggle state: $counter",
+        modifier =
+            Modifier.clickable {
+                counter++
+                counter %= 2
+            }
+    )
 
     BasicTextField(state, demoTextFieldModifiers, textStyle = LocalTextStyle.current)
 }
diff --git a/compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/text2/BasicTextFieldInScrollableDemo.kt b/compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/text2/BasicTextFieldInScrollableDemo.kt
index 5a2224d..67e62d2 100644
--- a/compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/text2/BasicTextFieldInScrollableDemo.kt
+++ b/compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/text2/BasicTextFieldInScrollableDemo.kt
@@ -96,23 +96,15 @@
 @Preview(showBackground = true)
 @Composable
 private fun TextFieldInScrollableColumn() {
-    Column(
-        Modifier.verticalScroll(rememberScrollState())
-    ) {
-        repeat(50) { index ->
-            DemoTextField(index)
-        }
+    Column(Modifier.verticalScroll(rememberScrollState())) {
+        repeat(50) { index -> DemoTextField(index) }
     }
 }
 
 @Preview(showBackground = true)
 @Composable
 private fun TextFieldInLazyColumn() {
-    LazyColumn {
-        items(50) { index ->
-            DemoTextField(index)
-        }
-    }
+    LazyColumn { items(50) { index -> DemoTextField(index) } }
 }
 
 @Preview(showBackground = true)
@@ -140,7 +132,8 @@
         val column = LinearLayout(context)
         column.orientation = LinearLayout.VERTICAL
         addView(
-            column, ViewGroup.LayoutParams(
+            column,
+            ViewGroup.LayoutParams(
                 ViewGroup.LayoutParams.MATCH_PARENT,
                 ViewGroup.LayoutParams.WRAP_CONTENT
             )
@@ -148,12 +141,14 @@
 
         repeat(30) {
             val text = EditText(context)
-            column.addView(text, LinearLayout.LayoutParams(
-                ViewGroup.LayoutParams.MATCH_PARENT,
-                ViewGroup.LayoutParams.WRAP_CONTENT
-            ).also {
-                it.setMargins(20)
-            })
+            column.addView(
+                text,
+                LinearLayout.LayoutParams(
+                        ViewGroup.LayoutParams.MATCH_PARENT,
+                        ViewGroup.LayoutParams.WRAP_CONTENT
+                    )
+                    .also { it.setMargins(20) }
+            )
         }
     }
 }
diff --git a/compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/text2/BasicTextFieldInputTransformationDemos.kt b/compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/text2/BasicTextFieldInputTransformationDemos.kt
index 1b5b733..0885440 100644
--- a/compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/text2/BasicTextFieldInputTransformationDemos.kt
+++ b/compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/text2/BasicTextFieldInputTransformationDemos.kt
@@ -54,11 +54,7 @@
 
 @Composable
 fun BasicTextFieldInputTransformationDemos() {
-    Column(
-        Modifier
-            .imePadding()
-            .verticalScroll(rememberScrollState())
-    ) {
+    Column(Modifier.imePadding().verticalScroll(rememberScrollState())) {
         TagLine(tag = "allCaps")
         FilterDemo(filter = InputTransformation.allCaps(Locale.current))
 
@@ -103,39 +99,38 @@
 
 @Composable
 private fun DigitsOnlyDemo() {
-    FilterDemo(filter = object : InputTransformation {
-        override val keyboardOptions = KeyboardOptions(
-            keyboardType = KeyboardType.Number
-        )
+    FilterDemo(
+        filter =
+            object : InputTransformation {
+                override val keyboardOptions = KeyboardOptions(keyboardType = KeyboardType.Number)
 
-        override fun TextFieldBuffer.transformInput() {
-            if (!asCharSequence().isDigitsOnly()) {
-                revertAllChanges()
+                override fun TextFieldBuffer.transformInput() {
+                    if (!asCharSequence().isDigitsOnly()) {
+                        revertAllChanges()
+                    }
+                }
             }
-        }
-    })
+    )
 }
 
 @Composable
 private fun AdditiveInputTransformationDemo() {
-    FilterDemo(filter = {
-        changes.forEachChange { range, originalRange ->
-            // only extend the insertions
-            if (!range.collapsed && originalRange.collapsed) {
-                replace(range.end, range.end, "a")
+    FilterDemo(
+        filter = {
+            changes.forEachChange { range, originalRange ->
+                // only extend the insertions
+                if (!range.collapsed && originalRange.collapsed) {
+                    replace(range.end, range.end, "a")
+                }
             }
         }
-    })
+    )
 }
 
 @Composable
 private fun FilterDemo(filter: InputTransformation) {
     val state = remember { TextFieldState() }
-    BasicTextField(
-        state = state,
-        inputTransformation = filter,
-        modifier = demoTextFieldModifiers
-    )
+    BasicTextField(state = state, inputTransformation = filter, modifier = demoTextFieldModifiers)
 }
 
 @Composable
@@ -146,9 +141,13 @@
     Column {
         Row(horizontalArrangement = Arrangement.SpaceBetween) {
             Text("Filter enabled?")
-            Switch(checked = filter != null, onCheckedChange = {
-                filter = if (filter == null) InputTransformation.allCaps(Locale.current) else null
-            })
+            Switch(
+                checked = filter != null,
+                onCheckedChange = {
+                    filter =
+                        if (filter == null) InputTransformation.allCaps(Locale.current) else null
+                }
+            )
         }
         BasicTextField(
             state = state,
diff --git a/compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/text2/BasicTextFieldLongTextDemo.kt b/compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/text2/BasicTextFieldLongTextDemo.kt
index bf39fb9..e81aef5 100644
--- a/compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/text2/BasicTextFieldLongTextDemo.kt
+++ b/compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/text2/BasicTextFieldLongTextDemo.kt
@@ -36,19 +36,18 @@
     Column(Modifier.imePadding()) {
         BasicTextField(
             state = text,
-            modifier = Modifier
-                .weight(1f)
-                .then(demoTextFieldModifiers),
+            modifier = Modifier.weight(1f).then(demoTextFieldModifiers),
             lineLimits = MultiLine(maxHeightInLines = 20)
         )
         Text("Char count: ${text.text.length}")
     }
 }
 
-private fun generateString(charCount: Int): String = buildString(capacity = charCount) {
-    val wordIterator = loremIpsumWords().iterator()
-    while (length < charCount) {
-        append(wordIterator.next().take(charCount - length - 1))
-        append(' ')
+private fun generateString(charCount: Int): String =
+    buildString(capacity = charCount) {
+        val wordIterator = loremIpsumWords().iterator()
+        while (length < charCount) {
+            append(wordIterator.next().take(charCount - length - 1))
+            append(' ')
+        }
     }
-}
diff --git a/compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/text2/BasicTextFieldOutputTransformationDemos.kt b/compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/text2/BasicTextFieldOutputTransformationDemos.kt
index a476523..819dc04 100644
--- a/compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/text2/BasicTextFieldOutputTransformationDemos.kt
+++ b/compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/text2/BasicTextFieldOutputTransformationDemos.kt
@@ -59,11 +59,7 @@
 
 @Composable
 fun BasicTextFieldOutputTransformationDemos() {
-    Column(
-        modifier = Modifier
-            .imePadding()
-            .verticalScroll(rememberScrollState())
-    ) {
+    Column(modifier = Modifier.imePadding().verticalScroll(rememberScrollState())) {
         TagLine("Insert, replace, delete")
         InsertReplaceDeleteDemo()
 
@@ -129,7 +125,7 @@
         Text("Deletion ")
         Text("s/def//", style = MaterialTheme.typography.caption)
     }
-    Row(/*verticalAlignment = Alignment.CenterVertically*/) {
+    Row(/*verticalAlignment = Alignment.CenterVertically*/ ) {
         var textLayoutResultProvider: () -> TextLayoutResult? by remember {
             mutableStateOf({ null })
         }
@@ -137,36 +133,36 @@
         BasicTextField(
             state = state,
             onTextLayout = { textLayoutResultProvider = it },
-            modifier = Modifier
-                .alignByBaseline()
-                .weight(0.5f)
-                .then(demoTextFieldModifiers)
-                .onFocusChanged { isFirstFieldFocused = it.isFocused }
-                .drawWithContent {
-                    drawContent()
+            modifier =
+                Modifier.alignByBaseline()
+                    .weight(0.5f)
+                    .then(demoTextFieldModifiers)
+                    .onFocusChanged { isFirstFieldFocused = it.isFocused }
+                    .drawWithContent {
+                        drawContent()
 
-                    // Only draw selection outline when not focused.
-                    if (isFirstFieldFocused) return@drawWithContent
-                    val textLayoutResult = textLayoutResultProvider() ?: return@drawWithContent
-                    val selection = state.selection
-                    if (selection.collapsed) {
-                        val cursorRect = textLayoutResult.getCursorRect(selection.start)
-                        drawLine(
-                            Color.Blue,
-                            start = cursorRect.topCenter,
-                            end = cursorRect.bottomCenter
-                        )
-                    } else {
-                        val selectionPath =
-                            textLayoutResult.getPathForRange(selection.min, selection.max)
-                        drawPath(
-                            selectionPath,
-                            Color.Blue,
-                            alpha = 0.8f,
-                            style = Stroke(width = 1.dp.toPx())
-                        )
-                    }
-                },
+                        // Only draw selection outline when not focused.
+                        if (isFirstFieldFocused) return@drawWithContent
+                        val textLayoutResult = textLayoutResultProvider() ?: return@drawWithContent
+                        val selection = state.selection
+                        if (selection.collapsed) {
+                            val cursorRect = textLayoutResult.getCursorRect(selection.start)
+                            drawLine(
+                                Color.Blue,
+                                start = cursorRect.topCenter,
+                                end = cursorRect.bottomCenter
+                            )
+                        } else {
+                            val selectionPath =
+                                textLayoutResult.getPathForRange(selection.min, selection.max)
+                            drawPath(
+                                selectionPath,
+                                Color.Blue,
+                                alpha = 0.8f,
+                                style = Stroke(width = 1.dp.toPx())
+                            )
+                        }
+                    },
         )
         Icon(
             Icons.AutoMirrored.Default.KeyboardArrowRight,
@@ -175,10 +171,7 @@
         )
         BasicTextField(
             state = state,
-            modifier = Modifier
-                .alignByBaseline()
-                .weight(0.5f)
-                .then(demoTextFieldModifiers),
+            modifier = Modifier.alignByBaseline().weight(0.5f).then(demoTextFieldModifiers),
             outputTransformation = {
                 if (prefixEnabled) {
                     insert(0, prefix.text.toString())
@@ -236,17 +229,14 @@
 
 @OptIn(ExperimentalFoundationApi::class)
 @Stable
-private data class PhoneNumberOutputTransformation(
-    private val pad: Boolean
-) : OutputTransformation {
+private data class PhoneNumberOutputTransformation(private val pad: Boolean) :
+    OutputTransformation {
     override fun TextFieldBuffer.transformOutput() {
         if (pad) {
             // Pad the text with placeholder chars if too short.
             // (___) ___-____
             val padCount = 10 - length
-            repeat(padCount) {
-                append('_')
-            }
+            repeat(padCount) { append('_') }
         }
 
         // (123) 456-7890
@@ -267,7 +257,5 @@
 
 @OptIn(ExperimentalFoundationApi::class)
 private val demoDecorationBox = TextFieldDecorator { innerField ->
-    Box(Modifier.padding(16.dp)) {
-        innerField()
-    }
+    Box(Modifier.padding(16.dp)) { innerField() }
 }
diff --git a/compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/text2/BasicTextFieldsInDialogDemo.kt b/compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/text2/BasicTextFieldsInDialogDemo.kt
index a7e55c8..346df95 100644
--- a/compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/text2/BasicTextFieldsInDialogDemo.kt
+++ b/compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/text2/BasicTextFieldsInDialogDemo.kt
@@ -49,64 +49,56 @@
 import androidx.compose.ui.window.Dialog
 import androidx.compose.ui.window.DialogProperties
 
-private val dialogDemos = listOf(
-    ComposableDemo("Full screen dialog, multiple fields") { onNavigateUp ->
-        Dialog(onDismissRequest = onNavigateUp) {
-            Surface {
-                BasicTextFieldDemos()
+private val dialogDemos =
+    listOf(
+        ComposableDemo("Full screen dialog, multiple fields") { onNavigateUp ->
+            Dialog(onDismissRequest = onNavigateUp) { Surface { BasicTextFieldDemos() } }
+        },
+        ComposableDemo(
+            "Small dialog, single field (platform default width, decor fits system windows)"
+        ) { onNavigateUp ->
+            Dialog(
+                onDismissRequest = onNavigateUp,
+                properties =
+                    DialogProperties(usePlatformDefaultWidth = true, decorFitsSystemWindows = true)
+            ) {
+                SingleTextFieldDialog()
             }
+        },
+        ComposableDemo("Small dialog, single field (decor fits system windows)") { onNavigateUp ->
+            Dialog(
+                onDismissRequest = onNavigateUp,
+                properties =
+                    DialogProperties(usePlatformDefaultWidth = false, decorFitsSystemWindows = true)
+            ) {
+                SingleTextFieldDialog()
+            }
+        },
+        ComposableDemo("Small dialog, single field (platform default width)") { onNavigateUp ->
+            Dialog(
+                onDismissRequest = onNavigateUp,
+                properties =
+                    DialogProperties(usePlatformDefaultWidth = true, decorFitsSystemWindows = false)
+            ) {
+                SingleTextFieldDialog()
+            }
+        },
+        ComposableDemo("Small dialog, single field") { onNavigateUp ->
+            Dialog(
+                onDismissRequest = onNavigateUp,
+                properties =
+                    DialogProperties(
+                        usePlatformDefaultWidth = false,
+                        decorFitsSystemWindows = false
+                    )
+            ) {
+                SingleTextFieldDialog()
+            }
+        },
+        ComposableDemo("Show keyboard automatically") { onNavigateUp ->
+            Dialog(onDismissRequest = onNavigateUp) { AutoFocusTextFieldDialog() }
         }
-    },
-    ComposableDemo(
-        "Small dialog, single field (platform default width, decor fits system windows)"
-    ) { onNavigateUp ->
-        Dialog(
-            onDismissRequest = onNavigateUp,
-            properties = DialogProperties(
-                usePlatformDefaultWidth = true,
-                decorFitsSystemWindows = true
-            )
-        ) { SingleTextFieldDialog() }
-    },
-    ComposableDemo(
-        "Small dialog, single field (decor fits system windows)"
-    ) { onNavigateUp ->
-        Dialog(
-            onDismissRequest = onNavigateUp,
-            properties = DialogProperties(
-                usePlatformDefaultWidth = false,
-                decorFitsSystemWindows = true
-            )
-        ) { SingleTextFieldDialog() }
-    },
-    ComposableDemo(
-        "Small dialog, single field (platform default width)"
-    ) { onNavigateUp ->
-        Dialog(
-            onDismissRequest = onNavigateUp,
-            properties = DialogProperties(
-                usePlatformDefaultWidth = true,
-                decorFitsSystemWindows = false
-            )
-        ) { SingleTextFieldDialog() }
-    },
-    ComposableDemo(
-        "Small dialog, single field"
-    ) { onNavigateUp ->
-        Dialog(
-            onDismissRequest = onNavigateUp,
-            properties = DialogProperties(
-                usePlatformDefaultWidth = false,
-                decorFitsSystemWindows = false
-            )
-        ) { SingleTextFieldDialog() }
-    },
-    ComposableDemo("Show keyboard automatically") { onNavigateUp ->
-        Dialog(onDismissRequest = onNavigateUp) {
-            AutoFocusTextFieldDialog()
-        }
-    }
-)
+    )
 
 @OptIn(ExperimentalMaterialApi::class)
 @Composable
@@ -117,23 +109,17 @@
     if (currentDemoIndex == -1) {
         LazyColumn(state = listState) {
             itemsIndexed(dialogDemos) { index, demo ->
-                ListItem(Modifier.clickable { setDemoIndex(index) }) {
-                    Text(demo.title)
-                }
+                ListItem(Modifier.clickable { setDemoIndex(index) }) { Text(demo.title) }
             }
         }
     } else {
         val currentDemo = dialogDemos[currentDemoIndex]
         Text(
             currentDemo.title,
-            modifier = Modifier
-                .fillMaxSize()
-                .wrapContentSize(),
+            modifier = Modifier.fillMaxSize().wrapContentSize(),
             textAlign = TextAlign.Center
         )
-        Layout(
-            content = { currentDemo.content { setDemoIndex(-1) } }
-        ) { measurables, _ ->
+        Layout(content = { currentDemo.content { setDemoIndex(-1) } }) { measurables, _ ->
             check(measurables.isEmpty()) { "Dialog demo must only emit a Dialog composable." }
             layout(0, 0) {}
         }
@@ -143,9 +129,7 @@
 @Composable
 private fun SingleTextFieldDialog() {
     val state = rememberTextFieldState()
-    Surface {
-        BasicTextField(state, decorator = materialTextFieldDecorator(state))
-    }
+    Surface { BasicTextField(state, decorator = materialTextFieldDecorator(state)) }
 }
 
 @Composable
@@ -153,9 +137,7 @@
     val state = rememberTextFieldState()
     val focusRequester = remember { FocusRequester() }
 
-    LaunchedEffect(focusRequester) {
-        focusRequester.requestFocus()
-    }
+    LaunchedEffect(focusRequester) { focusRequester.requestFocus() }
 
     Surface {
         BasicTextField(
diff --git a/compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/text2/CursorDemos.kt b/compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/text2/CursorDemos.kt
index 7f57c44..c106b74 100644
--- a/compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/text2/CursorDemos.kt
+++ b/compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/text2/CursorDemos.kt
@@ -47,9 +47,8 @@
 @Composable
 fun TextFieldCursorNotBlinkingInUnfocusedWindowDemo() {
     Column(verticalArrangement = Arrangement.spacedBy(16.dp)) {
-        val textFieldDecoration = Modifier
-            .border(2.dp, Color.DarkGray, RoundedCornerShape(5.dp))
-            .padding(8.dp)
+        val textFieldDecoration =
+            Modifier.border(2.dp, Color.DarkGray, RoundedCornerShape(5.dp)).padding(8.dp)
 
         val textState = rememberTextFieldState("hello")
         BasicTextField(textState, textFieldDecoration)
@@ -67,14 +66,11 @@
                     val dialogFocusRequester = remember { FocusRequester() }
                     Text(
                         "Hello! This is a dialog.",
-                        Modifier
-                            .padding(20.dp)
+                        Modifier.padding(20.dp)
                             .focusRequester(dialogFocusRequester)
                             .background(Color.DarkGray)
                     )
-                    LaunchedEffect(Unit) {
-                        dialogFocusRequester.requestFocus()
-                    }
+                    LaunchedEffect(Unit) { dialogFocusRequester.requestFocus() }
                 }
             }
         }
diff --git a/compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/text2/DecorationBoxDemos.kt b/compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/text2/DecorationBoxDemos.kt
index 07f07d2..253daf4 100644
--- a/compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/text2/DecorationBoxDemos.kt
+++ b/compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/text2/DecorationBoxDemos.kt
@@ -55,12 +55,7 @@
 
 @Composable
 fun DecorationBoxDemos() {
-    Column(
-        Modifier
-            .imePadding()
-            .verticalScroll(rememberScrollState())
-            .padding(16.dp)
-    ) {
+    Column(Modifier.imePadding().verticalScroll(rememberScrollState()).padding(16.dp)) {
         TagLine(tag = "Simple Decoration w/ Label")
         SimpleDecorationWithLabel()
 
@@ -92,9 +87,7 @@
 @Composable
 fun OutlinedBasicTextField() {
     val state = remember { TextFieldState() }
-    val cursorColor by TextFieldDefaults
-        .outlinedTextFieldColors()
-        .cursorColor(isError = false)
+    val cursorColor by TextFieldDefaults.outlinedTextFieldColors().cursorColor(isError = false)
     BasicTextField(
         state = state,
         modifier = Modifier.fillMaxWidth(),
@@ -129,10 +122,10 @@
         textStyle = TextStyle(fontSize = 24.sp),
         decorator = {
             Box(
-                Modifier
-                    .fillMaxWidth()
+                Modifier.fillMaxWidth()
                     .border(1.dp, Color.Blue, RoundedCornerShape(8.dp))
-                    .padding(8.dp)) {
+                    .padding(8.dp)
+            ) {
                 Text("${state.text}", Modifier.align(Alignment.Center))
             }
         }
diff --git a/compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/text2/KeyboardActionsDemos.kt b/compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/text2/KeyboardActionsDemos.kt
index 4d38365..89e4d0c1 100644
--- a/compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/text2/KeyboardActionsDemos.kt
+++ b/compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/text2/KeyboardActionsDemos.kt
@@ -55,16 +55,17 @@
     val coroutineScope = rememberCoroutineScope()
     Box(Modifier.imePadding()) {
         var executeDefaultActions by remember { mutableStateOf(true) }
-        val onKeyboardAction: KeyboardActionHandler = remember(executeDefaultActions) {
-            KeyboardActionHandler { performDefaultAction ->
-                coroutineScope.launch {
-                    snackbarHostState.showSnackbar("Keyboard action is executed")
-                }
-                if (executeDefaultActions) {
-                    performDefaultAction()
+        val onKeyboardAction: KeyboardActionHandler =
+            remember(executeDefaultActions) {
+                KeyboardActionHandler { performDefaultAction ->
+                    coroutineScope.launch {
+                        snackbarHostState.showSnackbar("Keyboard action is executed")
+                    }
+                    if (executeDefaultActions) {
+                        performDefaultAction()
+                    }
                 }
             }
-        }
         LazyColumn {
             item {
                 Row(Modifier.padding(8.dp)) {
@@ -100,16 +101,17 @@
 }
 
 @Suppress("PrimitiveInCollection")
-private val imeActions = listOf(
-    ImeAction.Default,
-    ImeAction.None,
-    ImeAction.Go,
-    ImeAction.Search,
-    ImeAction.Send,
-    ImeAction.Previous,
-    ImeAction.Next,
-    ImeAction.Done
-)
+private val imeActions =
+    listOf(
+        ImeAction.Default,
+        ImeAction.None,
+        ImeAction.Go,
+        ImeAction.Search,
+        ImeAction.Send,
+        ImeAction.Previous,
+        ImeAction.Next,
+        ImeAction.Done
+    )
 
 @OptIn(ExperimentalFoundationApi::class)
 @Composable
@@ -123,14 +125,13 @@
     BasicTextField(
         modifier = demoTextFieldModifiers,
         state = state,
-        keyboardOptions = KeyboardOptions(
-            imeAction = imeAction
-        ),
-        lineLimits = if (singleLine) {
-            TextFieldLineLimits.SingleLine
-        } else {
-            TextFieldLineLimits.Default
-        },
+        keyboardOptions = KeyboardOptions(imeAction = imeAction),
+        lineLimits =
+            if (singleLine) {
+                TextFieldLineLimits.SingleLine
+            } else {
+                TextFieldLineLimits.Default
+            },
         onKeyboardAction = onKeyboardAction,
         textStyle = TextStyle(fontSize = fontSize8),
     )
diff --git a/compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/text2/KeyboardOptionsDemos.kt b/compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/text2/KeyboardOptionsDemos.kt
index 8f24e1c..a46a535 100644
--- a/compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/text2/KeyboardOptionsDemos.kt
+++ b/compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/text2/KeyboardOptionsDemos.kt
@@ -81,10 +81,7 @@
     BasicTextField(
         modifier = demoTextFieldModifiers,
         state = state,
-        keyboardOptions = KeyboardOptions(
-            keyboardType = keyboardType,
-            imeAction = imeAction
-        ),
+        keyboardOptions = KeyboardOptions(keyboardType = keyboardType, imeAction = imeAction),
         textStyle = TextStyle(fontSize = fontSize8),
     )
 }
@@ -99,9 +96,7 @@
         BasicTextField(
             modifier = demoTextFieldModifiers.focusRequester(focusRequester),
             state = state,
-            keyboardOptions = KeyboardOptions(
-                showKeyboardOnFocus = showKeyboardOnFocus
-            )
+            keyboardOptions = KeyboardOptions(showKeyboardOnFocus = showKeyboardOnFocus)
         )
         Button(onClick = { focusRequester.requestFocus() }) {
             BasicText("Focus me", style = LocalTextStyle.current)
@@ -118,15 +113,13 @@
         BasicTextField(
             modifier = demoTextFieldModifiers,
             state = state,
-            keyboardOptions = KeyboardOptions(
-                hintLocales = localeList
-            )
+            keyboardOptions = KeyboardOptions(hintLocales = localeList)
         )
     }
 }
 
-val demoTextFieldModifiers = Modifier
-    .fillMaxWidth()
-    .padding(6.dp)
-    .border(1.dp, Color.LightGray, RoundedCornerShape(6.dp))
-    .padding(6.dp)
+val demoTextFieldModifiers =
+    Modifier.fillMaxWidth()
+        .padding(6.dp)
+        .border(1.dp, Color.LightGray, RoundedCornerShape(6.dp))
+        .padding(6.dp)
diff --git a/compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/text2/ReceiveContentDemos.kt b/compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/text2/ReceiveContentDemos.kt
index a9f990ca2..946920f 100644
--- a/compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/text2/ReceiveContentDemos.kt
+++ b/compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/text2/ReceiveContentDemos.kt
@@ -106,9 +106,7 @@
                 hovering = false
             }
 
-            override fun onReceive(
-                transferableContent: TransferableContent
-            ): TransferableContent? {
+            override fun onReceive(transferableContent: TransferableContent): TransferableContent? {
                 val newImageUris = mutableListOf<Uri>()
                 return transferableContent
                     .consume { item ->
@@ -129,18 +127,19 @@
         }
     }
     Column(
-        modifier = Modifier
-            .fillMaxSize()
-            .contentReceiver(receiveContentListener)
-            .padding(16.dp)
-            .background(
-                color = when {
-                    hovering -> MaterialTheme.colors.primary
-                    dragging -> MaterialTheme.colors.primary.copy(alpha = 0.7f)
-                    else -> MaterialTheme.colors.background
-                },
-                shape = RoundedCornerShape(8.dp)
-            ),
+        modifier =
+            Modifier.fillMaxSize()
+                .contentReceiver(receiveContentListener)
+                .padding(16.dp)
+                .background(
+                    color =
+                        when {
+                            hovering -> MaterialTheme.colors.primary
+                            dragging -> MaterialTheme.colors.primary.copy(alpha = 0.7f)
+                            else -> MaterialTheme.colors.background
+                        },
+                    shape = RoundedCornerShape(8.dp)
+                ),
         verticalArrangement = Arrangement.Bottom
     ) {
         Column(Modifier.weight(1f), verticalArrangement = Arrangement.Center) {
@@ -157,22 +156,18 @@
                         bitmap = imageBitmap,
                         contentDescription = "",
                         contentScale = ContentScale.Crop,
-                        modifier = Modifier
-                            .fillMaxSize()
-                            .padding(4.dp)
-                            .clip(RoundedCornerShape(4.dp))
+                        modifier =
+                            Modifier.fillMaxSize().padding(4.dp).clip(RoundedCornerShape(4.dp))
                     )
                     Icon(
                         Icons.Default.Clear,
                         "remove image",
-                        modifier = Modifier
-                            .size(16.dp)
-                            .align(Alignment.TopEnd)
-                            .background(MaterialTheme.colors.background, CircleShape)
-                            .clip(CircleShape)
-                            .clickable {
-                                images = images.filterNot { it == imageBitmap }
-                            }
+                        modifier =
+                            Modifier.size(16.dp)
+                                .align(Alignment.TopEnd)
+                                .background(MaterialTheme.colors.background, CircleShape)
+                                .clip(CircleShape)
+                                .clickable { images = images.filterNot { it == imageBitmap } }
                     )
                 }
             }
@@ -195,9 +190,7 @@
         var descriptionToggle by remember { mutableStateOf(false) }
         Text(
             if (descriptionToggle) Description else "Click to see the description...",
-            Modifier
-                .padding(8.dp)
-                .clickable { descriptionToggle = !descriptionToggle }
+            Modifier.padding(8.dp).clickable { descriptionToggle = !descriptionToggle }
         )
         Spacer(Modifier.height(8.dp))
         ReceiveContentShowcase(
@@ -217,27 +210,27 @@
                         transferableContent
                     } else {
                         var uri: Uri? = null
-                        transferableContent.consume { item ->
-                            // only consume this item if we can read
-                            if (item.uri != null && uri == null) {
-                                uri = item.uri
-                                true
-                            } else {
-                                false
+                        transferableContent
+                            .consume { item ->
+                                // only consume this item if we can read
+                                if (item.uri != null && uri == null) {
+                                    uri = item.uri
+                                    true
+                                } else {
+                                    false
+                                }
                             }
-                        }.also {
-                            coroutineScope.launch(Dispatchers.IO) {
-                                uri?.readImageBitmap(context)?.let { images = listOf(it) }
+                            .also {
+                                coroutineScope.launch(Dispatchers.IO) {
+                                    uri?.readImageBitmap(context)?.let { images = listOf(it) }
+                                }
                             }
-                        }
                     }
                 },
                 onClear = { images = emptyList() }
             ) {
                 Row(horizontalArrangement = Arrangement.spacedBy(8.dp)) {
-                    images.forEach {
-                        Image(it, contentDescription = null, Modifier.size(100.dp))
-                    }
+                    images.forEach { Image(it, contentDescription = null, Modifier.size(100.dp)) }
                 }
                 ReceiveContentShowcase(
                     title = "Text Consumer",
@@ -279,24 +272,19 @@
             onReceive(it)
         }
     }
-    Column(
-        modifier
-            .dropReceiveContent(receiveContentState)
-            .padding(8.dp)
-    ) {
+    Column(modifier.dropReceiveContent(receiveContentState).padding(8.dp)) {
         Card(
-            Modifier
-                .fillMaxWidth()
-                .clickable {
-                    transferableContentState.value = null
-                    onClear()
-                },
+            Modifier.fillMaxWidth().clickable {
+                transferableContentState.value = null
+                onClear()
+            },
             elevation = 4.dp,
-            backgroundColor = if (receiveContentState.hovering) {
-                MaterialTheme.colors.secondary
-            } else {
-                MaterialTheme.colors.surface
-            }
+            backgroundColor =
+                if (receiveContentState.hovering) {
+                    MaterialTheme.colors.secondary
+                } else {
+                    MaterialTheme.colors.surface
+                }
         ) {
             Column(
                 modifier = Modifier.padding(8.dp),
@@ -338,10 +326,7 @@
 }
 
 @Composable
-private fun KeyValueEntry(
-    key: String,
-    value: String
-) {
+private fun KeyValueEntry(key: String, value: String) {
     Row {
         Text(key, fontWeight = FontWeight.Bold)
         Spacer(modifier = Modifier.width(8.dp))
@@ -353,10 +338,11 @@
 private fun Uri.readImageBitmap(context: Context): ImageBitmap? {
     return try {
         if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {
-            ImageDecoder.decodeBitmap(ImageDecoder.createSource(context.contentResolver, this))
-        } else {
-            MediaStore.Images.Media.getBitmap(context.contentResolver, this)
-        }.asImageBitmap()
+                ImageDecoder.decodeBitmap(ImageDecoder.createSource(context.contentResolver, this))
+            } else {
+                MediaStore.Images.Media.getBitmap(context.contentResolver, this)
+            }
+            .asImageBitmap()
     } catch (e: Exception) {
         null
     }
@@ -370,63 +356,62 @@
 }
 
 @OptIn(ExperimentalFoundationApi::class)
-class ReceiveContentState(
-    private val onReceive: (TransferableContent) -> TransferableContent?
-) {
+class ReceiveContentState(private val onReceive: (TransferableContent) -> TransferableContent?) {
     internal var hovering by mutableStateOf(false)
     internal var dragging by mutableStateOf(false)
 
-    internal val listener = object : ReceiveContentListener {
-        override fun onDragEnter() {
-            hovering = true
-        }
+    internal val listener =
+        object : ReceiveContentListener {
+            override fun onDragEnter() {
+                hovering = true
+            }
 
-        override fun onDragEnd() {
-            hovering = false
-            dragging = false
-        }
+            override fun onDragEnd() {
+                hovering = false
+                dragging = false
+            }
 
-        override fun onDragStart() {
-            dragging = true
-        }
+            override fun onDragStart() {
+                dragging = true
+            }
 
-        override fun onDragExit() {
-            hovering = false
-        }
+            override fun onDragExit() {
+                hovering = false
+            }
 
-        override fun onReceive(transferableContent: TransferableContent): TransferableContent? {
-            dragging = false
-            hovering = false
-            return this@ReceiveContentState.onReceive(transferableContent)
+            override fun onReceive(transferableContent: TransferableContent): TransferableContent? {
+                dragging = false
+                hovering = false
+                return this@ReceiveContentState.onReceive(transferableContent)
+            }
         }
-    }
 }
 
 @OptIn(ExperimentalFoundationApi::class)
-fun Modifier.dropReceiveContent(
-    state: ReceiveContentState
-) = composed {
+fun Modifier.dropReceiveContent(state: ReceiveContentState) = composed {
     contentReceiver(state.listener)
         .background(
-            color = if (state.hovering) {
-                MaterialTheme.colors.secondary
-            } else if (state.dragging) {
-                MaterialTheme.colors.primary
-            } else {
-                MaterialTheme.colors.surface
-            },
+            color =
+                if (state.hovering) {
+                    MaterialTheme.colors.secondary
+                } else if (state.dragging) {
+                    MaterialTheme.colors.primary
+                } else {
+                    MaterialTheme.colors.surface
+                },
             shape = RoundedCornerShape(8.dp)
         )
 }
 
-private const val Description = "Below setup works as follows;\n" +
-    "  - There are 3 nested receiveContent nodes.\n" +
-    "  - The outermost one consumes everything that's passed to it.\n" +
-    "  - The middle one only consumes image content.\n" +
-    "  - The innermost one only consumes text content.\n" +
-    "  - BasicTextField that's nested the deepest would delegate whatever it receives " +
-    "to all 3 parents in order of proximity.\n" +
-    "  - Each node shows all the items it receives, not just what it consumes.\n\n" +
-    "ReceiveContent works with keyboard, paste, and drag/drop.\n" +
-    "Click on any card to clear its internal state.\n" +
-    "Click on this description to hide it."
+private const val Description =
+    "Below setup works as follows;\n" +
+        "  - There are 3 nested receiveContent nodes.\n" +
+        "  - The outermost one consumes everything that's passed to it.\n" +
+        "  - The middle one only consumes image content.\n" +
+        "  - The innermost one only consumes text content.\n" +
+        "  - BasicTextField that's nested the deepest would delegate whatever it receives " +
+        "to all 3 parents in order of proximity.\n" +
+        "  - Each node shows all the items it receives, not just what it consumes.\n\n" +
+        "ReceiveContent works with keyboard, paste, and drag/drop.\n" +
+        "Click on any card to clear its internal state.\n" +
+        "Click on this description to hide it."
diff --git a/compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/text2/ScrollDemos.kt b/compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/text2/ScrollDemos.kt
index 6178152..d1ddc77 100644
--- a/compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/text2/ScrollDemos.kt
+++ b/compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/text2/ScrollDemos.kt
@@ -89,16 +89,18 @@
             }
 
             item {
-                Box(modifier = Modifier
-                    .padding(vertical = 16.dp)
-                    .height(120.dp)
-                    .fillMaxWidth()
-                    .background(
-                        Brush.linearGradient(
-                            colors = RainbowColors,
-                            tileMode = TileMode.Mirror
-                        )
-                    )) {
+                Box(
+                    modifier =
+                        Modifier.padding(vertical = 16.dp)
+                            .height(120.dp)
+                            .fillMaxWidth()
+                            .background(
+                                Brush.linearGradient(
+                                    colors = RainbowColors,
+                                    tileMode = TileMode.Mirror
+                                )
+                            )
+                ) {
                     Text("Left empty for demo purposes", Modifier.align(Alignment.Center))
                 }
             }
@@ -132,14 +134,8 @@
 fun SingleLineHorizontalScrollableTextField() {
     val layoutDirection = LocalLayoutDirection.current
     val language = if (layoutDirection == LayoutDirection.Ltr) Language.Latin else Language.Hebrew
-    val state = remember(language) {
-        TextFieldState(
-            loremIpsum(
-                wordCount = 100,
-                language = language
-            )
-        )
-    }
+    val state =
+        remember(language) { TextFieldState(loremIpsum(wordCount = 100, language = language)) }
     BasicTextField(
         state = state,
         lineLimits = SingleLine,
@@ -153,15 +149,10 @@
 fun SingleLineHorizontalScrollableTextFieldWithNewlines() {
     val layoutDirection = LocalLayoutDirection.current
     val language = if (layoutDirection == LayoutDirection.Ltr) Language.Latin else Language.Hebrew
-    val state = remember(language) {
-        TextFieldState(
-            loremIpsum(
-                wordCount = 20,
-                language = language,
-                separator = "\n"
-            )
-        )
-    }
+    val state =
+        remember(language) {
+            TextFieldState(loremIpsum(wordCount = 20, language = language, separator = "\n"))
+        }
     BasicTextField(
         state = state,
         lineLimits = SingleLine,
@@ -174,14 +165,8 @@
 fun MultiLineVerticalScrollableTextField() {
     val layoutDirection = LocalLayoutDirection.current
     val language = if (layoutDirection == LayoutDirection.Ltr) Language.Latin else Language.Hebrew
-    val state = remember(language) {
-        TextFieldState(
-            loremIpsum(
-                wordCount = 200,
-                language = language
-            )
-        )
-    }
+    val state =
+        remember(language) { TextFieldState(loremIpsum(wordCount = 200, language = language)) }
     BasicTextField(
         state = state,
         textStyle = TextStyle(fontSize = 24.sp),
@@ -195,22 +180,14 @@
 fun HoistedHorizontalScroll() {
     val layoutDirection = LocalLayoutDirection.current
     val language = if (layoutDirection == LayoutDirection.Ltr) Language.Latin else Language.Hebrew
-    val state = remember(language) {
-        TextFieldState(
-            loremIpsum(
-                wordCount = 20,
-                language = language
-            )
-        )
-    }
+    val state =
+        remember(language) { TextFieldState(loremIpsum(wordCount = 20, language = language)) }
     val scrollState = rememberScrollState()
     val coroutineScope = rememberCoroutineScope()
     Column {
         Slider(
             value = scrollState.value.toFloat(),
-            onValueChange = {
-                coroutineScope.launch { scrollState.scrollTo(it.roundToInt()) }
-            },
+            onValueChange = { coroutineScope.launch { scrollState.scrollTo(it.roundToInt()) } },
             valueRange = 0f..scrollState.maxValue.toFloat()
         )
         BasicTextField(
@@ -228,30 +205,16 @@
 fun SharedHoistedScroll() {
     val layoutDirection = LocalLayoutDirection.current
     val language = if (layoutDirection == LayoutDirection.Ltr) Language.Latin else Language.Hebrew
-    val state1 = remember(language) {
-        TextFieldState(
-            loremIpsum(
-                wordCount = 20,
-                language = language
-            )
-        )
-    }
-    val state2 = remember(language) {
-        TextFieldState(
-            loremIpsum(
-                wordCount = 20,
-                language = language
-            )
-        )
-    }
+    val state1 =
+        remember(language) { TextFieldState(loremIpsum(wordCount = 20, language = language)) }
+    val state2 =
+        remember(language) { TextFieldState(loremIpsum(wordCount = 20, language = language)) }
     val scrollState = rememberScrollState()
     val coroutineScope = rememberCoroutineScope()
     Column {
         Slider(
             value = scrollState.value.toFloat(),
-            onValueChange = {
-                coroutineScope.launch { scrollState.scrollTo(it.roundToInt()) }
-            },
+            onValueChange = { coroutineScope.launch { scrollState.scrollTo(it.roundToInt()) } },
             valueRange = 0f..scrollState.maxValue.toFloat()
         )
         BasicTextField(
@@ -280,9 +243,9 @@
             val isDecorated = LocalDecoration.current
             if (isDecorated) {
                 Box(
-                    modifier = Modifier
-                        .border(1.dp, Color.DarkGray, RoundedCornerShape(4.dp))
-                        .padding(8.dp)
+                    modifier =
+                        Modifier.border(1.dp, Color.DarkGray, RoundedCornerShape(4.dp))
+                            .padding(8.dp)
                 ) {
                     it()
                 }
diff --git a/compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/text2/TextFieldLineLimitsDemos.kt b/compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/text2/TextFieldLineLimitsDemos.kt
index 1a36889..45e3719 100644
--- a/compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/text2/TextFieldLineLimitsDemos.kt
+++ b/compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/text2/TextFieldLineLimitsDemos.kt
@@ -42,12 +42,7 @@
 
 @Composable
 fun TextFieldLineLimitsDemos() {
-    Column(
-        Modifier
-            .imePadding()
-            .verticalScroll(rememberScrollState())
-            .padding(16.dp)
-    ) {
+    Column(Modifier.imePadding().verticalScroll(rememberScrollState()).padding(16.dp)) {
         TagLine(tag = "Default")
         DefaultLineLimits()
 
@@ -97,9 +92,7 @@
         Text("Min: $minLines")
         Slider(
             value = minLines.toFloat(),
-            onValueChange = {
-                minLines = it.roundToInt()
-            },
+            onValueChange = { minLines = it.roundToInt() },
             valueRange = 1f..10f,
             steps = 9
         )
@@ -109,9 +102,7 @@
         Text("Max: $maxLines")
         Slider(
             value = maxLines.toFloat(),
-            onValueChange = {
-                maxLines = it.roundToInt()
-            },
+            onValueChange = { maxLines = it.roundToInt() },
             valueRange = 1f..10f,
             steps = 9
         )
@@ -121,10 +112,8 @@
 
     BasicTextField(
         state = rememberTextFieldState(),
-        lineLimits = TextFieldLineLimits.MultiLine(
-            minHeightInLines = minLines,
-            maxHeightInLines = maxLines
-        ),
+        lineLimits =
+            TextFieldLineLimits.MultiLine(minHeightInLines = minLines, maxHeightInLines = maxLines),
         textStyle = LocalTextStyle.current,
         modifier = demoTextFieldModifiers
     )
diff --git a/compose/foundation/foundation/integration-tests/lazy-tests/src/androidTest/kotlin/androidx/compose/foundation/BaseLazyLayoutTestWithOrientation.kt b/compose/foundation/foundation/integration-tests/lazy-tests/src/androidTest/kotlin/androidx/compose/foundation/BaseLazyLayoutTestWithOrientation.kt
index 571c316..50b0ea8 100644
--- a/compose/foundation/foundation/integration-tests/lazy-tests/src/androidTest/kotlin/androidx/compose/foundation/BaseLazyLayoutTestWithOrientation.kt
+++ b/compose/foundation/foundation/integration-tests/lazy-tests/src/androidTest/kotlin/androidx/compose/foundation/BaseLazyLayoutTestWithOrientation.kt
@@ -39,8 +39,7 @@
 import org.junit.Rule
 
 open class BaseLazyLayoutTestWithOrientation(private val orientation: Orientation) {
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
     val vertical: Boolean
         get() = orientation == Orientation.Vertical
@@ -92,11 +91,12 @@
         }
 
     fun SemanticsNodeInteraction.assertStartPositionIsAlmost(expected: Dp) {
-        val position = if (vertical) {
-            getUnclippedBoundsInRoot().top
-        } else {
-            getUnclippedBoundsInRoot().left
-        }
+        val position =
+            if (vertical) {
+                getUnclippedBoundsInRoot().top
+            } else {
+                getUnclippedBoundsInRoot().left
+            }
         position.assertIsEqualTo(expected, tolerance = 1.dp)
     }
 
@@ -121,45 +121,41 @@
             assertTopPositionInRootIsEqualTo(expectedStart)
         }
 
-    fun SemanticsNodeInteraction.assertAxisBounds(
-        offset: DpOffset,
-        size: DpSize
-    ) =
+    fun SemanticsNodeInteraction.assertAxisBounds(offset: DpOffset, size: DpSize) =
         assertMainAxisStartPositionInRootIsEqualTo(offset.y)
             .assertCrossAxisStartPositionInRootIsEqualTo(offset.x)
             .assertMainAxisSizeIsEqualTo(size.height)
             .assertCrossAxisSizeIsEqualTo(size.width)
 
-    fun PaddingValues(
-        mainAxis: Dp = 0.dp,
-        crossAxis: Dp = 0.dp
-    ) = PaddingValues(
-        beforeContent = mainAxis,
-        afterContent = mainAxis,
-        beforeContentCrossAxis = crossAxis,
-        afterContentCrossAxis = crossAxis
-    )
+    fun PaddingValues(mainAxis: Dp = 0.dp, crossAxis: Dp = 0.dp) =
+        PaddingValues(
+            beforeContent = mainAxis,
+            afterContent = mainAxis,
+            beforeContentCrossAxis = crossAxis,
+            afterContentCrossAxis = crossAxis
+        )
 
     fun PaddingValues(
         beforeContent: Dp = 0.dp,
         afterContent: Dp = 0.dp,
         beforeContentCrossAxis: Dp = 0.dp,
         afterContentCrossAxis: Dp = 0.dp,
-    ) = if (vertical) {
-        androidx.compose.foundation.layout.PaddingValues(
-            start = beforeContentCrossAxis,
-            top = beforeContent,
-            end = afterContentCrossAxis,
-            bottom = afterContent
-        )
-    } else {
-        androidx.compose.foundation.layout.PaddingValues(
-            start = beforeContent,
-            top = beforeContentCrossAxis,
-            end = afterContent,
-            bottom = afterContentCrossAxis
-        )
-    }
+    ) =
+        if (vertical) {
+            androidx.compose.foundation.layout.PaddingValues(
+                start = beforeContentCrossAxis,
+                top = beforeContent,
+                end = afterContentCrossAxis,
+                bottom = afterContent
+            )
+        } else {
+            androidx.compose.foundation.layout.PaddingValues(
+                start = beforeContent,
+                top = beforeContentCrossAxis,
+                end = afterContent,
+                bottom = afterContentCrossAxis
+            )
+        }
 
     internal fun Modifier.debugBorder(color: Color = Color.Black) = border(1.dp, color)
 
diff --git a/compose/foundation/foundation/integration-tests/lazy-tests/src/androidTest/kotlin/androidx/compose/foundation/ScrollableUtils.kt b/compose/foundation/foundation/integration-tests/lazy-tests/src/androidTest/kotlin/androidx/compose/foundation/ScrollableUtils.kt
index f09cbd5..3e53b90 100644
--- a/compose/foundation/foundation/integration-tests/lazy-tests/src/androidTest/kotlin/androidx/compose/foundation/ScrollableUtils.kt
+++ b/compose/foundation/foundation/integration-tests/lazy-tests/src/androidTest/kotlin/androidx/compose/foundation/ScrollableUtils.kt
@@ -55,17 +55,13 @@
                 while (true) {
                     var event: PointerInputChange? = awaitFirstDown()
                     while (event != null && !event.changedToUpIgnoreConsumed()) {
-                        val currentEvent = awaitPointerEvent().changes
-                            .firstOrNull()
+                        val currentEvent = awaitPointerEvent().changes.firstOrNull()
 
                         if (currentEvent != null && !currentEvent.changedToUpIgnoreConsumed()) {
                             currentEvent.historical.fastForEach {
                                 tracker.addPosition(it.uptimeMillis, it.position)
                             }
-                            tracker.addPosition(
-                                currentEvent.uptimeMillis,
-                                currentEvent.position
-                            )
+                            tracker.addPosition(currentEvent.uptimeMillis, currentEvent.position)
                         }
 
                         event = currentEvent
@@ -88,17 +84,13 @@
                     var event = awaitFirstDown()
                     tracker.addPosition(event.uptimeMillis, event.position)
                     while (!event.changedToUpIgnoreConsumed()) {
-                        val currentEvent = awaitPointerEvent().changes
-                            .firstOrNull()
+                        val currentEvent = awaitPointerEvent().changes.firstOrNull()
 
                         if (currentEvent != null) {
                             currentEvent.historical.fastForEach {
                                 tracker.addPosition(it.uptimeMillis, it.position)
                             }
-                            tracker.addPosition(
-                                currentEvent.uptimeMillis,
-                                currentEvent.position
-                            )
+                            tracker.addPosition(currentEvent.uptimeMillis, currentEvent.position)
                             event = currentEvent
                         }
                     }
@@ -110,50 +102,27 @@
 
 internal fun composeViewSwipeUp() {
     Espresso.onView(CoreMatchers.allOf(CoreMatchers.instanceOf(AbstractComposeView::class.java)))
-        .perform(
-            espressoSwipe(
-                GeneralLocation.CENTER,
-                GeneralLocation.TOP_CENTER
-            )
-        )
+        .perform(espressoSwipe(GeneralLocation.CENTER, GeneralLocation.TOP_CENTER))
 }
 
 internal fun composeViewSwipeDown() {
     Espresso.onView(CoreMatchers.allOf(CoreMatchers.instanceOf(AbstractComposeView::class.java)))
-        .perform(
-            espressoSwipe(
-                GeneralLocation.CENTER,
-                GeneralLocation.BOTTOM_CENTER
-            )
-        )
+        .perform(espressoSwipe(GeneralLocation.CENTER, GeneralLocation.BOTTOM_CENTER))
 }
 
 internal fun composeViewSwipeLeft() {
     Espresso.onView(CoreMatchers.allOf(CoreMatchers.instanceOf(AbstractComposeView::class.java)))
-        .perform(
-            espressoSwipe(
-                GeneralLocation.CENTER,
-                GeneralLocation.CENTER_LEFT
-            )
-        )
+        .perform(espressoSwipe(GeneralLocation.CENTER, GeneralLocation.CENTER_LEFT))
 }
 
 internal fun composeViewSwipeRight() {
     Espresso.onView(CoreMatchers.allOf(CoreMatchers.instanceOf(AbstractComposeView::class.java)))
-        .perform(
-            espressoSwipe(
-                GeneralLocation.CENTER,
-                GeneralLocation.CENTER_RIGHT
-            )
-        )
+        .perform(espressoSwipe(GeneralLocation.CENTER, GeneralLocation.CENTER_RIGHT))
 }
 
 private fun espressoSwipe(
     start: CoordinatesProvider,
     end: CoordinatesProvider
 ): GeneralSwipeAction {
-    return GeneralSwipeAction(
-        Swipe.FAST, start, end,
-        Press.FINGER
-    )
+    return GeneralSwipeAction(Swipe.FAST, start, end, Press.FINGER)
 }
diff --git a/compose/foundation/foundation/integration-tests/lazy-tests/src/androidTest/kotlin/androidx/compose/foundation/lazy/grid/BaseLazyGridTestWithOrientation.kt b/compose/foundation/foundation/integration-tests/lazy-tests/src/androidTest/kotlin/androidx/compose/foundation/lazy/grid/BaseLazyGridTestWithOrientation.kt
index 0bf7bf5..18b78f9 100644
--- a/compose/foundation/foundation/integration-tests/lazy-tests/src/androidTest/kotlin/androidx/compose/foundation/lazy/grid/BaseLazyGridTestWithOrientation.kt
+++ b/compose/foundation/foundation/integration-tests/lazy-tests/src/androidTest/kotlin/androidx/compose/foundation/lazy/grid/BaseLazyGridTestWithOrientation.kt
@@ -33,9 +33,8 @@
 import kotlinx.coroutines.Dispatchers
 import kotlinx.coroutines.runBlocking
 
-open class BaseLazyGridTestWithOrientation(
-    orientation: Orientation
-) : BaseLazyLayoutTestWithOrientation(orientation) {
+open class BaseLazyGridTestWithOrientation(orientation: Orientation) :
+    BaseLazyLayoutTestWithOrientation(orientation) {
 
     fun LazyGridState.scrollBy(offset: Dp) {
         runBlocking(Dispatchers.Main + AutoTestFrameClock()) {
@@ -44,9 +43,7 @@
     }
 
     fun LazyGridState.scrollTo(index: Int) {
-        runBlocking(Dispatchers.Main + AutoTestFrameClock()) {
-            scrollToItem(index)
-        }
+        runBlocking(Dispatchers.Main + AutoTestFrameClock()) { scrollToItem(index) }
     }
 
     fun SemanticsNodeInteraction.scrollBy(offset: Dp) = scrollMainAxisBy(offset)
@@ -64,19 +61,20 @@
         crossAxisSpacedBy: Dp = 0.dp,
         mainAxisSpacedBy: Dp = 0.dp,
         content: LazyGridScope.() -> Unit
-    ) = LazyGrid(
-        GridCells.Fixed(cells),
-        modifier,
-        state,
-        contentPadding,
-        reverseLayout,
-        reverseArrangement,
-        flingBehavior,
-        userScrollEnabled,
-        crossAxisSpacedBy,
-        mainAxisSpacedBy,
-        content
-    )
+    ) =
+        LazyGrid(
+            GridCells.Fixed(cells),
+            modifier,
+            state,
+            contentPadding,
+            reverseLayout,
+            reverseArrangement,
+            flingBehavior,
+            userScrollEnabled,
+            crossAxisSpacedBy,
+            mainAxisSpacedBy,
+            content
+        )
 
     @Composable
     fun LazyGrid(
@@ -93,15 +91,17 @@
         content: LazyGridScope.() -> Unit
     ) {
         if (vertical) {
-            val verticalArrangement = when {
-                mainAxisSpacedBy != 0.dp -> Arrangement.spacedBy(mainAxisSpacedBy)
-                reverseLayout xor reverseArrangement -> Arrangement.Bottom
-                else -> Arrangement.Top
-            }
-            val horizontalArrangement = when {
-                crossAxisSpacedBy != 0.dp -> Arrangement.spacedBy(crossAxisSpacedBy)
-                else -> Arrangement.Start
-            }
+            val verticalArrangement =
+                when {
+                    mainAxisSpacedBy != 0.dp -> Arrangement.spacedBy(mainAxisSpacedBy)
+                    reverseLayout xor reverseArrangement -> Arrangement.Bottom
+                    else -> Arrangement.Top
+                }
+            val horizontalArrangement =
+                when {
+                    crossAxisSpacedBy != 0.dp -> Arrangement.spacedBy(crossAxisSpacedBy)
+                    else -> Arrangement.Start
+                }
             LazyVerticalGrid(
                 columns = cells,
                 modifier = modifier,
@@ -115,15 +115,17 @@
                 content = content
             )
         } else {
-            val horizontalArrangement = when {
-                mainAxisSpacedBy != 0.dp -> Arrangement.spacedBy(mainAxisSpacedBy)
-                reverseLayout xor reverseArrangement -> Arrangement.End
-                else -> Arrangement.Start
-            }
-            val verticalArrangement = when {
-                crossAxisSpacedBy != 0.dp -> Arrangement.spacedBy(crossAxisSpacedBy)
-                else -> Arrangement.Top
-            }
+            val horizontalArrangement =
+                when {
+                    mainAxisSpacedBy != 0.dp -> Arrangement.spacedBy(mainAxisSpacedBy)
+                    reverseLayout xor reverseArrangement -> Arrangement.End
+                    else -> Arrangement.Start
+                }
+            val verticalArrangement =
+                when {
+                    crossAxisSpacedBy != 0.dp -> Arrangement.spacedBy(crossAxisSpacedBy)
+                    else -> Arrangement.Top
+                }
             LazyHorizontalGrid(
                 rows = cells,
                 modifier = modifier,
diff --git a/compose/foundation/foundation/integration-tests/lazy-tests/src/androidTest/kotlin/androidx/compose/foundation/lazy/grid/LazyArrangementsTest.kt b/compose/foundation/foundation/integration-tests/lazy-tests/src/androidTest/kotlin/androidx/compose/foundation/lazy/grid/LazyArrangementsTest.kt
index 89e6b70..c784a18 100644
--- a/compose/foundation/foundation/integration-tests/lazy-tests/src/androidTest/kotlin/androidx/compose/foundation/lazy/grid/LazyArrangementsTest.kt
+++ b/compose/foundation/foundation/integration-tests/lazy-tests/src/androidTest/kotlin/androidx/compose/foundation/lazy/grid/LazyArrangementsTest.kt
@@ -57,8 +57,7 @@
 
     private val ContainerTag = "ContainerTag"
 
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
     private var itemSize: Dp = Dp.Infinity
     private var smallerItemSize: Dp = Dp.Infinity
@@ -66,12 +65,8 @@
 
     @Before
     fun before() {
-        with(rule.density) {
-            itemSize = 50.toDp()
-        }
-        with(rule.density) {
-            smallerItemSize = 40.toDp()
-        }
+        with(rule.density) { itemSize = 50.toDp() }
+        with(rule.density) { smallerItemSize = 40.toDp() }
         containerSize = itemSize * 5
     }
 
@@ -84,9 +79,7 @@
                 modifier = Modifier.requiredSize(containerSize),
                 columns = GridCells.Fixed(1)
             ) {
-                items(2) {
-                    Box(Modifier.requiredSize(itemSize).testTag(it.toString()))
-                }
+                items(2) { Box(Modifier.requiredSize(itemSize).testTag(it.toString())) }
             }
         }
 
@@ -119,9 +112,7 @@
                 modifier = Modifier.requiredSize(containerSize),
                 rows = GridCells.Fixed(1)
             ) {
-                items(2) {
-                    Box(Modifier.requiredSize(itemSize).testTag(it.toString()))
-                }
+                items(2) { Box(Modifier.requiredSize(itemSize).testTag(it.toString())) }
             }
         }
 
@@ -176,13 +167,12 @@
                 modifier = Modifier.width(itemSize).testTag(ContainerTag),
                 columns = GridCells.Fixed(1)
             ) {
-                items(2) {
-                    Box(Modifier.requiredSize(itemSize))
-                }
+                items(2) { Box(Modifier.requiredSize(itemSize)) }
             }
         }
 
-        rule.onNodeWithTag(ContainerTag)
+        rule
+            .onNodeWithTag(ContainerTag)
             .assertWidthIsEqualTo(itemSize)
             .assertHeightIsEqualTo(itemSize * 3)
     }
@@ -195,13 +185,12 @@
                 modifier = Modifier.height(itemSize).testTag(ContainerTag),
                 rows = GridCells.Fixed(1)
             ) {
-                items(2) {
-                    Box(Modifier.requiredSize(itemSize))
-                }
+                items(2) { Box(Modifier.requiredSize(itemSize)) }
             }
         }
 
-        rule.onNodeWithTag(ContainerTag)
+        rule
+            .onNodeWithTag(ContainerTag)
             .assertWidthIsEqualTo(itemSize * 3)
             .assertHeightIsEqualTo(itemSize)
     }
@@ -216,17 +205,13 @@
                 modifier = Modifier.requiredSize(itemSize * 3.5f),
                 columns = GridCells.Fixed(1)
             ) {
-                items(3) {
-                    Box(Modifier.requiredSize(itemSize).testTag(it.toString()))
-                }
+                items(3) { Box(Modifier.requiredSize(itemSize).testTag(it.toString())) }
             }
         }
 
-        rule.onNodeWithTag("0")
-            .assertTopPositionInRootIsEqualTo(0.dp)
+        rule.onNodeWithTag("0").assertTopPositionInRootIsEqualTo(0.dp)
 
-        rule.onNodeWithTag("1")
-            .assertTopPositionInRootIsEqualTo(itemSize * 2)
+        rule.onNodeWithTag("1").assertTopPositionInRootIsEqualTo(itemSize * 2)
     }
 
     @Test
@@ -237,20 +222,15 @@
                 modifier = Modifier.requiredSize(itemSize * 3.5f).testTag(ContainerTag),
                 columns = GridCells.Fixed(1)
             ) {
-                items(3) {
-                    Box(Modifier.requiredSize(itemSize).testTag(it.toString()))
-                }
+                items(3) { Box(Modifier.requiredSize(itemSize).testTag(it.toString())) }
             }
         }
 
-        rule.onNodeWithTag(ContainerTag)
-            .scrollBy(y = itemSize * 2, density = rule.density)
+        rule.onNodeWithTag(ContainerTag).scrollBy(y = itemSize * 2, density = rule.density)
 
-        rule.onNodeWithTag("1")
-            .assertTopPositionInRootIsEqualTo(itemSize * 0.5f)
+        rule.onNodeWithTag("1").assertTopPositionInRootIsEqualTo(itemSize * 0.5f)
 
-        rule.onNodeWithTag("2")
-            .assertTopPositionInRootIsEqualTo(itemSize * 2.5f)
+        rule.onNodeWithTag("2").assertTopPositionInRootIsEqualTo(itemSize * 2.5f)
     }
 
     @Test
@@ -261,17 +241,13 @@
                 modifier = Modifier.requiredSize(itemSize * 3.5f),
                 rows = GridCells.Fixed(1)
             ) {
-                items(3) {
-                    Box(Modifier.requiredSize(itemSize).testTag(it.toString()))
-                }
+                items(3) { Box(Modifier.requiredSize(itemSize).testTag(it.toString())) }
             }
         }
 
-        rule.onNodeWithTag("0")
-            .assertLeftPositionInRootIsEqualTo(0.dp)
+        rule.onNodeWithTag("0").assertLeftPositionInRootIsEqualTo(0.dp)
 
-        rule.onNodeWithTag("1")
-            .assertLeftPositionInRootIsEqualTo(itemSize * 2)
+        rule.onNodeWithTag("1").assertLeftPositionInRootIsEqualTo(itemSize * 2)
     }
 
     @Test
@@ -282,20 +258,15 @@
                 modifier = Modifier.requiredSize(itemSize * 3.5f).testTag(ContainerTag),
                 rows = GridCells.Fixed(1)
             ) {
-                items(3) {
-                    Box(Modifier.requiredSize(itemSize).testTag(it.toString()))
-                }
+                items(3) { Box(Modifier.requiredSize(itemSize).testTag(it.toString())) }
             }
         }
 
-        rule.onNodeWithTag(ContainerTag)
-            .scrollBy(x = itemSize * 2, density = rule.density)
+        rule.onNodeWithTag(ContainerTag).scrollBy(x = itemSize * 2, density = rule.density)
 
-        rule.onNodeWithTag("1")
-            .assertLeftPositionInRootIsEqualTo(itemSize * 0.5f)
+        rule.onNodeWithTag("1").assertLeftPositionInRootIsEqualTo(itemSize * 0.5f)
 
-        rule.onNodeWithTag("2")
-            .assertLeftPositionInRootIsEqualTo(itemSize * 2.5f)
+        rule.onNodeWithTag("2").assertLeftPositionInRootIsEqualTo(itemSize * 2.5f)
     }
 
     @Test
@@ -312,22 +283,13 @@
                 verticalArrangement = Arrangement.spacedBy(spacingSize),
                 columns = GridCells.Fixed(1)
             ) {
-                items(5) {
-                    Spacer(
-                        Modifier.size(itemSize).testTag("$it")
-                    )
-                }
+                items(5) { Spacer(Modifier.size(itemSize).testTag("$it")) }
             }
         }
 
-        rule.runOnIdle {
-            runBlocking {
-                state.scrollBy((itemSizePx + spacingSizePx).toFloat())
-            }
-        }
+        rule.runOnIdle { runBlocking { state.scrollBy((itemSizePx + spacingSizePx).toFloat()) } }
 
-        rule.onNodeWithTag("0")
-            .assertIsNotDisplayed()
+        rule.onNodeWithTag("0").assertIsNotDisplayed()
 
         rule.runOnIdle {
             assertThat(state.firstVisibleItemIndex).isEqualTo(1)
@@ -349,27 +311,19 @@
                 verticalArrangement = Arrangement.spacedBy(spacingSize),
                 columns = GridCells.Fixed(1)
             ) {
-                items(5) {
-                    Spacer(
-                        Modifier.size(itemSize).testTag("$it")
-                    )
-                }
+                items(5) { Spacer(Modifier.size(itemSize).testTag("$it")) }
             }
         }
 
         rule.runOnIdle {
-            runBlocking {
-                state.scrollBy((itemSizePx + spacingSizePx / 2).toFloat())
-            }
+            runBlocking { state.scrollBy((itemSizePx + spacingSizePx / 2).toFloat()) }
         }
 
-        rule.onNodeWithTag("0")
-            .assertIsNotDisplayed()
+        rule.onNodeWithTag("0").assertIsNotDisplayed()
 
         rule.runOnIdle {
             assertThat(state.firstVisibleItemIndex).isEqualTo(0)
-            assertThat(state.firstVisibleItemScrollOffset)
-                .isEqualTo(itemSizePx + spacingSizePx / 2)
+            assertThat(state.firstVisibleItemScrollOffset).isEqualTo(itemSizePx + spacingSizePx / 2)
         }
     }
 
@@ -387,22 +341,13 @@
                 state = rememberLazyGridState().also { state = it },
                 horizontalArrangement = Arrangement.spacedBy(spacingSize)
             ) {
-                items(5) {
-                    Spacer(
-                        Modifier.size(itemSize).testTag("$it")
-                    )
-                }
+                items(5) { Spacer(Modifier.size(itemSize).testTag("$it")) }
             }
         }
 
-        rule.runOnIdle {
-            runBlocking {
-                state.scrollBy((itemSizePx + spacingSizePx).toFloat())
-            }
-        }
+        rule.runOnIdle { runBlocking { state.scrollBy((itemSizePx + spacingSizePx).toFloat()) } }
 
-        rule.onNodeWithTag("0")
-            .assertIsNotDisplayed()
+        rule.onNodeWithTag("0").assertIsNotDisplayed()
 
         rule.runOnIdle {
             assertThat(state.firstVisibleItemIndex).isEqualTo(1)
@@ -424,27 +369,19 @@
                 state = rememberLazyGridState().also { state = it },
                 horizontalArrangement = Arrangement.spacedBy(spacingSize)
             ) {
-                items(5) {
-                    Spacer(
-                        Modifier.size(itemSize).testTag("$it")
-                    )
-                }
+                items(5) { Spacer(Modifier.size(itemSize).testTag("$it")) }
             }
         }
 
         rule.runOnIdle {
-            runBlocking {
-                state.scrollBy((itemSizePx + spacingSizePx / 2).toFloat())
-            }
+            runBlocking { state.scrollBy((itemSizePx + spacingSizePx / 2).toFloat()) }
         }
 
-        rule.onNodeWithTag("0")
-            .assertIsNotDisplayed()
+        rule.onNodeWithTag("0").assertIsNotDisplayed()
 
         rule.runOnIdle {
             assertThat(state.firstVisibleItemIndex).isEqualTo(0)
-            assertThat(state.firstVisibleItemScrollOffset)
-                .isEqualTo(itemSizePx + spacingSizePx / 2)
+            assertThat(state.firstVisibleItemScrollOffset).isEqualTo(itemSizePx + spacingSizePx / 2)
         }
     }
 
@@ -458,9 +395,7 @@
                 reverseLayout = true,
                 modifier = Modifier.size(containerSize)
             ) {
-                items(2) {
-                    Item(it)
-                }
+                items(2) { Item(it) }
             }
         }
 
@@ -475,15 +410,11 @@
                 reverseLayout = true,
                 modifier = Modifier.requiredSize(containerSize)
             ) {
-                items(2) {
-                    Item(it)
-                }
+                items(2) { Item(it) }
             }
         }
 
-        assertArrangementForTwoItems(
-            Arrangement.End, LayoutDirection.Ltr, reverseLayout = true
-        )
+        assertArrangementForTwoItems(Arrangement.End, LayoutDirection.Ltr, reverseLayout = true)
     }
 
     @Test
@@ -495,17 +426,13 @@
                 verticalArrangement = arrangement,
                 columns = GridCells.Fixed(1)
             ) {
-                items(2) {
-                    Item(it)
-                }
+                items(2) { Item(it) }
             }
         }
 
         assertArrangementForTwoItems(Arrangement.Top)
 
-        rule.runOnIdle {
-            arrangement = Arrangement.Bottom
-        }
+        rule.runOnIdle { arrangement = Arrangement.Bottom }
 
         assertArrangementForTwoItems(Arrangement.Bottom)
     }
@@ -519,17 +446,13 @@
                 modifier = Modifier.requiredSize(containerSize),
                 horizontalArrangement = arrangement
             ) {
-                items(2) {
-                    Item(it)
-                }
+                items(2) { Item(it) }
             }
         }
 
         assertArrangementForTwoItems(Arrangement.Start, LayoutDirection.Ltr)
 
-        rule.runOnIdle {
-            arrangement = Arrangement.End
-        }
+        rule.runOnIdle { arrangement = Arrangement.End }
 
         assertArrangementForTwoItems(Arrangement.End, LayoutDirection.Ltr)
     }
@@ -545,33 +468,25 @@
                 verticalArrangement = Arrangement.spacedBy(-halfItemSize),
                 state = state
             ) {
-                items(100) { index ->
-                    Box(Modifier.size(itemSize).testTag(index.toString()))
-                }
+                items(100) { index -> Box(Modifier.size(itemSize).testTag(index.toString())) }
             }
         }
 
-        rule.onNodeWithTag("0")
-            .assertTopPositionInRootIsEqualTo(0.dp)
-        rule.onNodeWithTag("1")
-            .assertTopPositionInRootIsEqualTo(halfItemSize)
+        rule.onNodeWithTag("0").assertTopPositionInRootIsEqualTo(0.dp)
+        rule.onNodeWithTag("1").assertTopPositionInRootIsEqualTo(halfItemSize)
 
         rule.runOnIdle {
             assertThat(state.firstVisibleItemIndex).isEqualTo(0)
             assertThat(state.firstVisibleItemScrollOffset).isEqualTo(0)
 
-            runBlocking {
-                state.scrollBy(with(rule.density) { halfItemSize.toPx() })
-            }
+            runBlocking { state.scrollBy(with(rule.density) { halfItemSize.toPx() }) }
 
             assertThat(state.firstVisibleItemIndex).isEqualTo(1)
             assertThat(state.firstVisibleItemScrollOffset).isEqualTo(0)
         }
 
-        rule.onNodeWithTag("0")
-            .assertTopPositionInRootIsEqualTo(-halfItemSize)
-        rule.onNodeWithTag("1")
-            .assertTopPositionInRootIsEqualTo(0.dp)
+        rule.onNodeWithTag("0").assertTopPositionInRootIsEqualTo(-halfItemSize)
+        rule.onNodeWithTag("1").assertTopPositionInRootIsEqualTo(0.dp)
     }
 
     @Test
@@ -585,33 +500,25 @@
                 horizontalArrangement = Arrangement.spacedBy(-halfItemSize),
                 state = state
             ) {
-                items(100) { index ->
-                    Box(Modifier.size(itemSize).testTag(index.toString()))
-                }
+                items(100) { index -> Box(Modifier.size(itemSize).testTag(index.toString())) }
             }
         }
 
-        rule.onNodeWithTag("0")
-            .assertLeftPositionInRootIsEqualTo(0.dp)
-        rule.onNodeWithTag("1")
-            .assertLeftPositionInRootIsEqualTo(halfItemSize)
+        rule.onNodeWithTag("0").assertLeftPositionInRootIsEqualTo(0.dp)
+        rule.onNodeWithTag("1").assertLeftPositionInRootIsEqualTo(halfItemSize)
 
         rule.runOnIdle {
             assertThat(state.firstVisibleItemIndex).isEqualTo(0)
             assertThat(state.firstVisibleItemScrollOffset).isEqualTo(0)
 
-            runBlocking {
-                state.scrollBy(with(rule.density) { halfItemSize.toPx() })
-            }
+            runBlocking { state.scrollBy(with(rule.density) { halfItemSize.toPx() }) }
 
             assertThat(state.firstVisibleItemIndex).isEqualTo(1)
             assertThat(state.firstVisibleItemScrollOffset).isEqualTo(0)
         }
 
-        rule.onNodeWithTag("0")
-            .assertLeftPositionInRootIsEqualTo(-halfItemSize)
-        rule.onNodeWithTag("1")
-            .assertLeftPositionInRootIsEqualTo(0.dp)
+        rule.onNodeWithTag("0").assertLeftPositionInRootIsEqualTo(-halfItemSize)
+        rule.onNodeWithTag("1").assertLeftPositionInRootIsEqualTo(0.dp)
     }
 
     @Test
@@ -625,16 +532,11 @@
                 verticalArrangement = Arrangement.spacedBy(-largerThanItemSize),
                 state = state
             ) {
-                items(8) { index ->
-                    Box(Modifier.size(itemSize).testTag(index.toString()))
-                }
+                items(8) { index -> Box(Modifier.size(itemSize).testTag(index.toString())) }
             }
         }
 
-        repeat(8) {
-            rule.onNodeWithTag("$it")
-                .assertTopPositionInRootIsEqualTo(0.dp)
-        }
+        repeat(8) { rule.onNodeWithTag("$it").assertTopPositionInRootIsEqualTo(0.dp) }
 
         rule.runOnIdle {
             assertThat(state.firstVisibleItemIndex).isEqualTo(0)
@@ -653,16 +555,11 @@
                 horizontalArrangement = Arrangement.spacedBy(-largerThanItemSize),
                 state = state
             ) {
-                items(8) { index ->
-                    Box(Modifier.size(itemSize).testTag(index.toString()))
-                }
+                items(8) { index -> Box(Modifier.size(itemSize).testTag(index.toString())) }
             }
         }
 
-        repeat(8) {
-            rule.onNodeWithTag("$it")
-                .assertLeftPositionInRootIsEqualTo(0.dp)
-        }
+        repeat(8) { rule.onNodeWithTag("$it").assertLeftPositionInRootIsEqualTo(0.dp) }
 
         rule.runOnIdle {
             assertThat(state.firstVisibleItemIndex).isEqualTo(0)
@@ -680,17 +577,17 @@
                 verticalArrangement = Arrangement.Center,
                 state = state
             ) {
-                items(100) { index ->
-                    Box(Modifier.size(itemSize).testTag(index.toString()))
-                }
+                items(100) { index -> Box(Modifier.size(itemSize).testTag(index.toString())) }
             }
         }
 
-        rule.onNodeWithTag("0")
+        rule
+            .onNodeWithTag("0")
             .assertTopPositionInRootIsEqualTo(itemSize * 0.5f)
             .assertHeightIsEqualTo(itemSize * 2f)
 
-        rule.onNodeWithTag("1")
+        rule
+            .onNodeWithTag("1")
             .assertTopPositionInRootIsEqualTo(itemSize * 2.5f)
             .assertHeightIsEqualTo(itemSize * 2f)
     }
@@ -705,17 +602,17 @@
                 horizontalArrangement = Arrangement.Center,
                 state = state
             ) {
-                items(100) { index ->
-                    Box(Modifier.size(itemSize).testTag(index.toString()))
-                }
+                items(100) { index -> Box(Modifier.size(itemSize).testTag(index.toString())) }
             }
         }
 
-        rule.onNodeWithTag("0")
+        rule
+            .onNodeWithTag("0")
             .assertLeftPositionInRootIsEqualTo(itemSize * 0.5f)
             .assertWidthIsEqualTo(itemSize * 2f)
 
-        rule.onNodeWithTag("1")
+        rule
+            .onNodeWithTag("1")
             .assertLeftPositionInRootIsEqualTo(itemSize * 2.5f)
             .assertWidthIsEqualTo(itemSize * 2f)
     }
@@ -730,17 +627,17 @@
                 verticalArrangement = Arrangement.spacedBy(itemSize * 0.5f, Alignment.Bottom),
                 state = state
             ) {
-                items(100) { index ->
-                    Box(Modifier.size(itemSize).testTag(index.toString()))
-                }
+                items(100) { index -> Box(Modifier.size(itemSize).testTag(index.toString())) }
             }
         }
 
-        rule.onNodeWithTag("0")
+        rule
+            .onNodeWithTag("0")
             .assertTopPositionInRootIsEqualTo(itemSize * 0.5f)
             .assertHeightIsEqualTo(itemSize * 2f)
 
-        rule.onNodeWithTag("1")
+        rule
+            .onNodeWithTag("1")
             .assertTopPositionInRootIsEqualTo(itemSize * 3f)
             .assertHeightIsEqualTo(itemSize * 2f)
     }
@@ -755,17 +652,17 @@
                 horizontalArrangement = Arrangement.spacedBy(itemSize * 0.5f, Alignment.End),
                 state = state
             ) {
-                items(100) { index ->
-                    Box(Modifier.size(itemSize).testTag(index.toString()))
-                }
+                items(100) { index -> Box(Modifier.size(itemSize).testTag(index.toString())) }
             }
         }
 
-        rule.onNodeWithTag("0")
+        rule
+            .onNodeWithTag("0")
             .assertLeftPositionInRootIsEqualTo(itemSize * 0.5f)
             .assertWidthIsEqualTo(itemSize * 2f)
 
-        rule.onNodeWithTag("1")
+        rule
+            .onNodeWithTag("1")
             .assertLeftPositionInRootIsEqualTo(itemSize * 3f)
             .assertWidthIsEqualTo(itemSize * 2f)
     }
@@ -777,9 +674,7 @@
                 modifier = Modifier.requiredSize(containerSize),
                 columns = GridCells.Fixed(1)
             ) {
-                items(2) {
-                    Item(it)
-                }
+                items(2) { Item(it) }
             }
         }
     }
@@ -795,9 +690,7 @@
                     modifier = Modifier.requiredSize(containerSize),
                     rows = GridCells.Fixed(1)
                 ) {
-                    items(2) {
-                        Item(it)
-                    }
+                    items(2) { Item(it) }
                 }
             }
         }
@@ -815,17 +708,17 @@
         reverseLayout: Boolean = false
     ) {
         with(rule.density) {
-            val sizes = IntArray(2) {
-                val index = if (reverseLayout) if (it == 0) 1 else 0 else it
-                if (index == 0) itemSize.roundToPx() else smallerItemSize.roundToPx()
-            }
+            val sizes =
+                IntArray(2) {
+                    val index = if (reverseLayout) if (it == 0) 1 else 0 else it
+                    if (index == 0) itemSize.roundToPx() else smallerItemSize.roundToPx()
+                }
             val outPositions = IntArray(2) { 0 }
             with(arrangement) { arrange(containerSize.roundToPx(), sizes, outPositions) }
 
             outPositions.forEachIndexed { index, position ->
                 val realIndex = if (reverseLayout) if (index == 0) 1 else 0 else index
-                rule.onNodeWithTag("$realIndex")
-                    .assertTopPositionInRootIsEqualTo(position.toDp())
+                rule.onNodeWithTag("$realIndex").assertTopPositionInRootIsEqualTo(position.toDp())
             }
         }
     }
@@ -836,10 +729,11 @@
         reverseLayout: Boolean = false
     ) {
         with(rule.density) {
-            val sizes = IntArray(2) {
-                val index = if (reverseLayout) if (it == 0) 1 else 0 else it
-                if (index == 0) itemSize.roundToPx() else smallerItemSize.roundToPx()
-            }
+            val sizes =
+                IntArray(2) {
+                    val index = if (reverseLayout) if (it == 0) 1 else 0 else it
+                    if (index == 0) itemSize.roundToPx() else smallerItemSize.roundToPx()
+                }
             val outPositions = IntArray(2) { 0 }
             with(arrangement) {
                 arrange(containerSize.roundToPx(), sizes, layoutDirection, outPositions)
@@ -848,8 +742,7 @@
             outPositions.forEachIndexed { index, position ->
                 val realIndex = if (reverseLayout) if (index == 0) 1 else 0 else index
                 val expectedPosition = position.toDp()
-                rule.onNodeWithTag("$realIndex")
-                    .assertLeftPositionInRootIsEqualTo(expectedPosition)
+                rule.onNodeWithTag("$realIndex").assertLeftPositionInRootIsEqualTo(expectedPosition)
             }
         }
     }
diff --git a/compose/foundation/foundation/integration-tests/lazy-tests/src/androidTest/kotlin/androidx/compose/foundation/lazy/grid/LazyCustomKeysTest.kt b/compose/foundation/foundation/integration-tests/lazy-tests/src/androidTest/kotlin/androidx/compose/foundation/lazy/grid/LazyCustomKeysTest.kt
index 76103d9..8e57e8a 100644
--- a/compose/foundation/foundation/integration-tests/lazy-tests/src/androidTest/kotlin/androidx/compose/foundation/lazy/grid/LazyCustomKeysTest.kt
+++ b/compose/foundation/foundation/integration-tests/lazy-tests/src/androidTest/kotlin/androidx/compose/foundation/lazy/grid/LazyCustomKeysTest.kt
@@ -44,12 +44,9 @@
 @RunWith(AndroidJUnit4::class)
 class LazyCustomKeysTest {
 
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
-    val itemSize = with(rule.density) {
-        100.toDp()
-    }
+    val itemSize = with(rule.density) { 100.toDp() }
     val columns = 2
 
     @Test
@@ -58,9 +55,7 @@
 
         rule.setContent {
             LazyVerticalGrid(GridCells.Fixed(columns)) {
-                items(list, key = { it.id }) {
-                    Item("${it.id}")
-                }
+                items(list, key = { it.id }) { Item("${it.id}") }
             }
         }
 
@@ -73,26 +68,18 @@
 
         rule.setContent {
             LazyVerticalGrid(GridCells.Fixed(columns)) {
-                items(list, key = { it.id }) {
-                    Item(remember { "${it.id}" })
-                }
+                items(list, key = { it.id }) { Item(remember { "${it.id}" }) }
             }
         }
 
-        rule.runOnIdle {
-            list = listOf(list[0], list[2])
-        }
+        rule.runOnIdle { list = listOf(list[0], list[2]) }
 
         assertItems("0", "2")
     }
 
     @Test
     fun reordering_statesAreMoved_list() {
-        testReordering { grid ->
-            items(grid, key = { it.id }) {
-                Item(remember { "${it.id}" })
-            }
-        }
+        testReordering { grid -> items(grid, key = { it.id }) { Item(remember { "${it.id}" }) } }
     }
 
     @Test
@@ -108,9 +95,7 @@
     fun reordering_statesAreMoved_array() {
         testReordering { grid ->
             val array = grid.toTypedArray()
-            items(array, key = { it.id }) {
-                Item(remember { "${it.id}" })
-            }
+            items(array, key = { it.id }) { Item(remember { "${it.id}" }) }
         }
     }
 
@@ -127,9 +112,7 @@
     @Test
     fun reordering_statesAreMoved_itemsWithCount() {
         testReordering { grid ->
-            items(grid.size, key = { grid[it].id }) {
-                Item(remember { "${grid[it].id}" })
-            }
+            items(grid.size, key = { grid[it].id }) { Item(remember { "${grid[it].id}" }) }
         }
     }
 
@@ -140,15 +123,11 @@
 
         rule.setContent {
             LazyVerticalGrid(GridCells.Fixed(columns)) {
-                items(list, key = { it.id }) {
-                    Item(remember { counter++ }.toString())
-                }
+                items(list, key = { it.id }) { Item(remember { counter++ }.toString()) }
             }
         }
 
-        rule.runOnIdle {
-            list = listOf(MyClass(3), MyClass(4), MyClass(5), MyClass(6))
-        }
+        rule.runOnIdle { list = listOf(MyClass(3), MyClass(4), MyClass(5), MyClass(6)) }
 
         assertItems("3", "4", "5", "6")
     }
@@ -160,15 +139,11 @@
 
         rule.setContent {
             LazyVerticalGrid(GridCells.Fixed(columns)) {
-                items(list, key = { it.id }) {
-                    Item(remember { counter++ }.toString())
-                }
+                items(list, key = { it.id }) { Item(remember { counter++ }.toString()) }
             }
         }
 
-        rule.runOnIdle {
-            list = listOf(MyClass(1))
-        }
+        rule.runOnIdle { list = listOf(MyClass(1)) }
 
         assertItems("1")
     }
@@ -180,15 +155,11 @@
 
         rule.setContent {
             LazyVerticalGrid(GridCells.Fixed(columns)) {
-                items(list, key = { it.id }) {
-                    Item(remember { counter++ }.toString())
-                }
+                items(list, key = { it.id }) { Item(remember { counter++ }.toString()) }
             }
         }
 
-        rule.runOnIdle {
-            list = listOf(MyClass(1), MyClass(3))
-        }
+        rule.runOnIdle { list = listOf(MyClass(1), MyClass(3)) }
 
         assertItems("1", "3")
     }
@@ -196,9 +167,7 @@
     @Test
     fun mixingKeyedItemsAndNot() {
         testReordering { list ->
-            item {
-                Item("${list.first().id}")
-            }
+            item { Item("${list.first().id}") }
             items(list.subList(fromIndex = 1, toIndex = list.size), key = { it.id }) {
                 Item(remember { "${it.id}" })
             }
@@ -210,24 +179,18 @@
         val state = mutableStateOf(emptyList<Int>())
 
         rule.setContent {
-            LaunchedEffect(Unit) {
-                state.value = listOf(4, 1, 3)
-            }
+            LaunchedEffect(Unit) { state.value = listOf(4, 1, 3) }
 
             val list = state.value
 
             LazyVerticalGrid(GridCells.Fixed(columns), Modifier.fillMaxSize()) {
-                items(list, key = { it }) {
-                    Item(it.toString())
-                }
+                items(list, key = { it }) { Item(it.toString()) }
             }
         }
 
         assertItems("4", "1", "3")
 
-        rule.runOnIdle {
-            state.value = listOf(2, 4, 6, 1, 3, 5)
-        }
+        rule.runOnIdle { state.value = listOf(2, 4, 6, 1, 3, 5) }
 
         assertItems("2", "4", "6", "1", "3", "5")
     }
@@ -238,15 +201,11 @@
 
         rule.setContent {
             LazyVerticalGrid(GridCells.Fixed(columns)) {
-                items(list, key = { it.id }) {
-                    Item(remember { "${it.id}" })
-                }
+                items(list, key = { it.id }) { Item(remember { "${it.id}" }) }
             }
         }
 
-        rule.runOnIdle {
-            list.add(list.removeAt(1))
-        }
+        rule.runOnIdle { list.add(list.removeAt(1)) }
 
         assertItems("0", "2", "1")
     }
@@ -259,17 +218,11 @@
         rule.setContent {
             state = rememberLazyGridState()
             LazyVerticalGrid(GridCells.Fixed(columns), state = state) {
-                items(list, key = { it.id }) {
-                    Item(remember { "${it.id}" })
-                }
+                items(list, key = { it.id }) { Item(remember { "${it.id}" }) }
             }
         }
 
-        rule.runOnIdle {
-            assertThat(
-                state.visibleKeys
-            ).isEqualTo(listOf(0, 1, 2))
-        }
+        rule.runOnIdle { assertThat(state.visibleKeys).isEqualTo(listOf(0, 1, 2)) }
     }
 
     @Test
@@ -280,21 +233,13 @@
         rule.setContent {
             state = rememberLazyGridState()
             LazyVerticalGrid(columns = GridCells.Fixed(columns), state = state) {
-                items(list, key = { it.id }) {
-                    Item(remember { "${it.id}" })
-                }
+                items(list, key = { it.id }) { Item(remember { "${it.id}" }) }
             }
         }
 
-        rule.runOnIdle {
-            list = listOf(list[0], list[2], list[1])
-        }
+        rule.runOnIdle { list = listOf(list[0], list[2], list[1]) }
 
-        rule.runOnIdle {
-            assertThat(
-                state.visibleKeys
-            ).isEqualTo(listOf(0, 2, 1))
-        }
+        rule.runOnIdle { assertThat(state.visibleKeys).isEqualTo(listOf(0, 2, 1)) }
     }
 
     @Test
@@ -305,19 +250,13 @@
         rule.setContent {
             state = rememberLazyGridState()
             LazyVerticalGrid(GridCells.Fixed(columns), Modifier.size(itemSize * 2.5f), state) {
-                items(list) {
-                    Item(remember { "$it" })
-                }
+                items(list) { Item(remember { "$it" }) }
             }
         }
 
-        rule.runOnIdle {
-            list = (0..15).toList()
-        }
+        rule.runOnIdle { list = (0..15).toList() }
 
-        rule.runOnIdle {
-            assertThat(state.firstVisibleItemIndex).isEqualTo(0)
-        }
+        rule.runOnIdle { assertThat(state.firstVisibleItemIndex).isEqualTo(0) }
     }
 
     @Test
@@ -328,21 +267,15 @@
         rule.setContent {
             state = rememberLazyGridState()
             LazyVerticalGrid(GridCells.Fixed(columns), Modifier.size(itemSize * 2.5f), state) {
-                items(list, key = { it }) {
-                    Item(remember { "$it" })
-                }
+                items(list, key = { it }) { Item(remember { "$it" }) }
             }
         }
 
-        rule.runOnIdle {
-            list = (0..15).toList()
-        }
+        rule.runOnIdle { list = (0..15).toList() }
 
         rule.runOnIdle {
             assertThat(state.firstVisibleItemIndex).isEqualTo(10)
-            assertThat(
-                state.visibleKeys
-            ).isEqualTo(listOf(10, 11, 12, 13, 14, 15))
+            assertThat(state.visibleKeys).isEqualTo(listOf(10, 11, 12, 13, 14, 15))
         }
     }
 
@@ -354,21 +287,15 @@
         rule.setContent {
             state = rememberLazyGridState(5)
             LazyVerticalGrid(GridCells.Fixed(columns), Modifier.size(itemSize * 2.5f), state) {
-                items(list, key = { it }) {
-                    Item(remember { "$it" })
-                }
+                items(list, key = { it }) { Item(remember { "$it" }) }
             }
         }
 
-        rule.runOnIdle {
-            list = (0..15).toList()
-        }
+        rule.runOnIdle { list = (0..15).toList() }
 
         rule.runOnIdle {
             assertThat(state.firstVisibleItemIndex).isEqualTo(4)
-            assertThat(
-                state.visibleKeys
-            ).isEqualTo(listOf(4, 5, 6, 7, 8, 9))
+            assertThat(state.visibleKeys).isEqualTo(listOf(4, 5, 6, 7, 8, 9))
         }
     }
 
@@ -380,21 +307,15 @@
         rule.setContent {
             state = rememberLazyGridState(10) // key 20 is the first item
             LazyVerticalGrid(GridCells.Fixed(columns), Modifier.size(itemSize * 2.5f), state) {
-                items(list, key = { it }) {
-                    Item(remember { "$it" })
-                }
+                items(list, key = { it }) { Item(remember { "$it" }) }
             }
         }
 
-        rule.runOnIdle {
-            list = (0..30).toList()
-        }
+        rule.runOnIdle { list = (0..30).toList() }
 
         rule.runOnIdle {
             assertThat(state.firstVisibleItemIndex).isEqualTo(20)
-            assertThat(
-                state.visibleKeys
-            ).isEqualTo(listOf(20, 21, 22, 23, 24, 25))
+            assertThat(state.visibleKeys).isEqualTo(listOf(20, 21, 22, 23, 24, 25))
         }
     }
 
@@ -406,15 +327,11 @@
         rule.setContent {
             state = rememberLazyGridState(8)
             LazyVerticalGrid(GridCells.Fixed(columns), Modifier.size(itemSize * 2.5f), state) {
-                items(list, key = { it }) {
-                    Item(remember { "$it" })
-                }
+                items(list, key = { it }) { Item(remember { "$it" }) }
             }
         }
 
-        rule.runOnIdle {
-            list = (0..20) - 8
-        }
+        rule.runOnIdle { list = (0..20) - 8 }
 
         rule.runOnIdle {
             assertThat(state.firstVisibleItemIndex).isEqualTo(8)
@@ -428,32 +345,27 @@
 
         rule.setContent {
             LazyVerticalGrid(GridCells.Fixed(1)) {
-                items(1, key = {
-                    keyCalls++
-                    0
-                }) {
+                items(
+                    1,
+                    key = {
+                        keyCalls++
+                        0
+                    }
+                ) {
                     Item("item")
                 }
             }
         }
 
-        rule.runOnIdle {
-            assertThat(keyCalls).isEqualTo(1)
-        }
+        rule.runOnIdle { assertThat(keyCalls).isEqualTo(1) }
     }
 
     private fun testReordering(content: LazyGridScope.(List<MyClass>) -> Unit) {
         var list by mutableStateOf(listOf(MyClass(0), MyClass(1), MyClass(2)))
 
-        rule.setContent {
-            LazyVerticalGrid(GridCells.Fixed(columns)) {
-                content(list)
-            }
-        }
+        rule.setContent { LazyVerticalGrid(GridCells.Fixed(columns)) { content(list) } }
 
-        rule.runOnIdle {
-            list = listOf(list[0], list[2], list[1])
-        }
+        rule.runOnIdle { list = listOf(list[0], list[2], list[1]) }
 
         assertItems("0", "2", "1")
     }
@@ -462,7 +374,8 @@
         var currentTop = 0.dp
         var column = 0
         tags.forEach {
-            rule.onNodeWithTag(it)
+            rule
+                .onNodeWithTag(it)
                 .assertTopPositionInRootIsEqualTo(currentTop)
                 .assertHeightIsEqualTo(itemSize)
             ++column
@@ -475,12 +388,11 @@
 
     @Composable
     private fun Item(tag: String) {
-        Spacer(
-            Modifier.testTag(tag).size(itemSize)
-        )
+        Spacer(Modifier.testTag(tag).size(itemSize))
     }
 
     private class MyClass(val id: Int)
 }
 
-val LazyGridState.visibleKeys: List<Any> get() = layoutInfo.visibleItemsInfo.map { it.key }
+val LazyGridState.visibleKeys: List<Any>
+    get() = layoutInfo.visibleItemsInfo.map { it.key }
diff --git a/compose/foundation/foundation/integration-tests/lazy-tests/src/androidTest/kotlin/androidx/compose/foundation/lazy/grid/LazyGridBeyondBoundsTest.kt b/compose/foundation/foundation/integration-tests/lazy-tests/src/androidTest/kotlin/androidx/compose/foundation/lazy/grid/LazyGridBeyondBoundsTest.kt
index 5ed55e3..23b55c5 100644
--- a/compose/foundation/foundation/integration-tests/lazy-tests/src/androidTest/kotlin/androidx/compose/foundation/lazy/grid/LazyGridBeyondBoundsTest.kt
+++ b/compose/foundation/foundation/integration-tests/lazy-tests/src/androidTest/kotlin/androidx/compose/foundation/lazy/grid/LazyGridBeyondBoundsTest.kt
@@ -54,8 +54,7 @@
 @MediumTest
 class LazyGridBeyondBoundsTest {
 
-    @get:Rule
-    val rule = createParameterizedComposeTestRule<Param>()
+    @get:Rule val rule = createParameterizedComposeTestRule<Param>()
 
     // We need to wrap the inline class parameter in another class because Java can't instantiate
     // the inline class.
@@ -64,9 +63,10 @@
         val reverseLayout: Boolean,
         val layoutDirection: LayoutDirection,
     ) {
-        override fun toString() = "beyondBoundsLayoutDirection=$beyondBoundsLayoutDirection " +
-            "reverseLayout=$reverseLayout " +
-            "layoutDirection=$layoutDirection"
+        override fun toString() =
+            "beyondBoundsLayoutDirection=$beyondBoundsLayoutDirection " +
+                "reverseLayout=$reverseLayout " +
+                "layoutDirection=$layoutDirection"
 
         internal fun placementComparator(): PlacementComparator {
             return PlacementComparator(beyondBoundsLayoutDirection, layoutDirection, reverseLayout)
@@ -97,495 +97,403 @@
     }
 
     @Test
-    fun onlyOneVisibleItemIsPlaced() = with(rule) {
-        // Arrange.
-        setLazyContent(size = 10.toDp(), firstVisibleItem = 0) {
-            items(100) { index ->
-                Box(
-                    Modifier
-                        .size(10.toDp())
-                        .trackPlaced(index)
-                )
+    fun onlyOneVisibleItemIsPlaced() =
+        with(rule) {
+            // Arrange.
+            setLazyContent(size = 10.toDp(), firstVisibleItem = 0) {
+                items(100) { index -> Box(Modifier.size(10.toDp()).trackPlaced(index)) }
+            }
+            forEachParameter(ParamsToTest) { _ ->
+                // Assert.
+                runOnIdle {
+                    assertThat(placedItems.keys).containsExactly(0)
+                    assertThat(visibleItems).containsExactly(0)
+                }
+                resetTestCase()
             }
         }
-        forEachParameter(ParamsToTest) { _ ->
-            // Assert.
-            runOnIdle {
-                assertThat(placedItems.keys).containsExactly(0)
-                assertThat(visibleItems).containsExactly(0)
-            }
-            resetTestCase()
-        }
-    }
 
     @Test
-    fun onlyTwoVisibleItemsArePlaced() = with(rule) {
-        // Arrange.
-        setLazyContent(size = 20.toDp(), firstVisibleItem = 0) {
-            items(100) { index ->
-                Box(
-                    Modifier
-                        .size(10.toDp())
-                        .trackPlaced(index)
-                )
+    fun onlyTwoVisibleItemsArePlaced() =
+        with(rule) {
+            // Arrange.
+            setLazyContent(size = 20.toDp(), firstVisibleItem = 0) {
+                items(100) { index -> Box(Modifier.size(10.toDp()).trackPlaced(index)) }
             }
-        }
 
-        forEachParameter(ParamsToTest) { _ ->
-            // Assert.
-            runOnIdle {
-                assertThat(placedItems.keys).containsExactly(0, 1)
-                assertThat(visibleItems).containsExactly(0, 1)
+            forEachParameter(ParamsToTest) { _ ->
+                // Assert.
+                runOnIdle {
+                    assertThat(placedItems.keys).containsExactly(0, 1)
+                    assertThat(visibleItems).containsExactly(0, 1)
+                }
+                resetTestCase()
             }
-            resetTestCase()
         }
-    }
 
     @Test
-    fun onlyThreeVisibleItemsArePlaced() = with(rule) {
-        // Arrange.
-        setLazyContent(size = 30.toDp(), firstVisibleItem = 0) {
-            items(100) { index ->
-                Box(
-                    Modifier
-                        .size(10.toDp())
-                        .trackPlaced(index)
-                )
+    fun onlyThreeVisibleItemsArePlaced() =
+        with(rule) {
+            // Arrange.
+            setLazyContent(size = 30.toDp(), firstVisibleItem = 0) {
+                items(100) { index -> Box(Modifier.size(10.toDp()).trackPlaced(index)) }
             }
-        }
 
-        forEachParameter(ParamsToTest) { _ ->
-            // Assert.
-            runOnIdle {
-                assertThat(placedItems.keys).containsExactly(0, 1, 2)
-                assertThat(visibleItems).containsExactly(0, 1, 2)
+            forEachParameter(ParamsToTest) { _ ->
+                // Assert.
+                runOnIdle {
+                    assertThat(placedItems.keys).containsExactly(0, 1, 2)
+                    assertThat(visibleItems).containsExactly(0, 1, 2)
+                }
+                resetTestCase()
             }
-            resetTestCase()
         }
-    }
 
     @Test
-    fun emptyLazyList_doesNotCrash() = with(rule) {
-        // Arrange.
-        var addItems by mutableStateOf(true)
-        lateinit var beyondBoundsLayoutRef: BeyondBoundsLayout
-        setLazyContent(size = 30.toDp(), firstVisibleItem = 0) {
-            if (addItems) {
+    fun emptyLazyList_doesNotCrash() =
+        with(rule) {
+            // Arrange.
+            var addItems by mutableStateOf(true)
+            lateinit var beyondBoundsLayoutRef: BeyondBoundsLayout
+            setLazyContent(size = 30.toDp(), firstVisibleItem = 0) {
+                if (addItems) {
+                    item {
+                        Box(
+                            Modifier.modifierLocalConsumer {
+                                beyondBoundsLayout = ModifierLocalBeyondBoundsLayout.current
+                            }
+                        )
+                    }
+                }
+            }
+
+            forEachParameter(ParamsToTest) { param ->
+                runOnIdle {
+                    beyondBoundsLayoutRef = beyondBoundsLayout!!
+                    addItems = false
+                }
+
+                // Act.
+                val hasMoreContent = runOnIdle {
+                    beyondBoundsLayoutRef.layout(param.beyondBoundsLayoutDirection) {
+                        hasMoreContent
+                    }
+                }
+
+                // Assert.
+                runOnIdle { assertThat(hasMoreContent).isFalse() }
+                resetTestCase()
+                addItems = true
+            }
+        }
+
+    @Test
+    fun oneExtraItemBeyondVisibleBounds() =
+        with(rule) {
+            // Arrange.
+            setLazyContent(size = 30.toDp(), firstVisibleItem = 5) {
+                items(5) { index -> Box(Modifier.size(10.toDp()).trackPlaced(index)) }
                 item {
                     Box(
-                        Modifier.modifierLocalConsumer {
+                        Modifier.size(10.toDp()).trackPlaced(5).modifierLocalConsumer {
                             beyondBoundsLayout = ModifierLocalBeyondBoundsLayout.current
                         }
                     )
                 }
-            }
-        }
-
-        forEachParameter(ParamsToTest) { param ->
-            runOnIdle {
-                beyondBoundsLayoutRef = beyondBoundsLayout!!
-                addItems = false
+                items(5) { index -> Box(Modifier.size(10.toDp()).trackPlaced(index + 6)) }
             }
 
-            // Act.
-            val hasMoreContent = runOnIdle {
-                beyondBoundsLayoutRef.layout(param.beyondBoundsLayoutDirection) {
-                    hasMoreContent
-                }
-            }
-
-            // Assert.
-            runOnIdle {
-                assertThat(hasMoreContent).isFalse()
-            }
-            resetTestCase()
-            addItems = true
-        }
-    }
-
-    @Test
-    fun oneExtraItemBeyondVisibleBounds() = with(rule) {
-        // Arrange.
-        setLazyContent(size = 30.toDp(), firstVisibleItem = 5) {
-            items(5) { index ->
-                Box(
-                    Modifier
-                        .size(10.toDp())
-                        .trackPlaced(index)
-                )
-            }
-            item {
-                Box(
-                    Modifier
-                        .size(10.toDp())
-                        .trackPlaced(5)
-                        .modifierLocalConsumer {
-                            beyondBoundsLayout = ModifierLocalBeyondBoundsLayout.current
+            forEachParameter(ParamsToTest) { param ->
+                // Act.
+                runOnUiThread {
+                    beyondBoundsLayout!!.layout(param.beyondBoundsLayoutDirection) {
+                        // Assert that the beyond bounds items are present.
+                        if (param.expectedExtraItemsBeforeVisibleBounds()) {
+                            assertThat(placedItems.keys).containsExactly(4, 5, 6, 7)
+                        } else {
+                            assertThat(placedItems.keys).containsExactly(5, 6, 7, 8)
                         }
-                )
-            }
-            items(5) { index ->
-                Box(
-                    Modifier
-                        .size(10.toDp())
-                        .trackPlaced(index + 6)
-                )
-            }
-        }
+                        assertThat(visibleItems).containsExactly(5, 6, 7)
 
-        forEachParameter(ParamsToTest) { param ->
-            // Act.
-            runOnUiThread {
-                beyondBoundsLayout!!.layout(param.beyondBoundsLayoutDirection) {
-                    // Assert that the beyond bounds items are present.
-                    if (param.expectedExtraItemsBeforeVisibleBounds()) {
-                        assertThat(placedItems.keys).containsExactly(4, 5, 6, 7)
-                    } else {
-                        assertThat(placedItems.keys).containsExactly(5, 6, 7, 8)
+                        assertThat(placedItems.values).isInOrder(param.placementComparator())
+
+                        // Just return true so that we stop as soon as we run this once.
+                        // This should result in one extra item being added.
+                        true
                     }
+                }
+
+                // Assert that the beyond bounds items are removed.
+                runOnIdle {
+                    assertThat(placedItems.keys).containsExactly(5, 6, 7)
                     assertThat(visibleItems).containsExactly(5, 6, 7)
-
-                    assertThat(placedItems.values).isInOrder(param.placementComparator())
-
-                    // Just return true so that we stop as soon as we run this once.
-                    // This should result in one extra item being added.
-                    true
                 }
+                resetTestCase(5)
             }
-
-            // Assert that the beyond bounds items are removed.
-            runOnIdle {
-                assertThat(placedItems.keys).containsExactly(5, 6, 7)
-                assertThat(visibleItems).containsExactly(5, 6, 7)
-            }
-            resetTestCase(5)
         }
-    }
 
     @Test
-    fun oneExtraItemBeyondVisibleBounds_multipleCells() = with(rule) {
-        val itemSize = 50
-        val itemSizeDp = itemSize.toDp()
-        // Arrange.
-        setLazyContent(cells = 2, size = itemSizeDp * 3, firstVisibleItem = 10) {
-            // item | item  | x5
-            // item | local | x1
-            // item | item  | x5
-            items(11) { index ->
-                Box(
-                    Modifier
-                        .size(itemSizeDp)
-                        .trackPlaced(index)
-                )
-            }
-            item {
-                Box(
-                    Modifier
-                        .size(itemSizeDp)
-                        .trackPlaced(11)
-                        .modifierLocalConsumer {
+    fun oneExtraItemBeyondVisibleBounds_multipleCells() =
+        with(rule) {
+            val itemSize = 50
+            val itemSizeDp = itemSize.toDp()
+            // Arrange.
+            setLazyContent(cells = 2, size = itemSizeDp * 3, firstVisibleItem = 10) {
+                // item | item  | x5
+                // item | local | x1
+                // item | item  | x5
+                items(11) { index -> Box(Modifier.size(itemSizeDp).trackPlaced(index)) }
+                item {
+                    Box(
+                        Modifier.size(itemSizeDp).trackPlaced(11).modifierLocalConsumer {
                             beyondBoundsLayout = ModifierLocalBeyondBoundsLayout.current
                         }
-                )
+                    )
+                }
+                items(10) { index -> Box(Modifier.size(itemSizeDp).trackPlaced(index + 12)) }
             }
-            items(10) { index ->
-                Box(
-                    Modifier
-                        .size(itemSizeDp)
-                        .trackPlaced(index + 12)
-                )
-            }
-        }
 
-        forEachParameter(ParamsToTest) { param ->
-            // Act.
-            runOnUiThread {
-                beyondBoundsLayout!!.layout(param.beyondBoundsLayoutDirection) {
-                    // Assert that the beyond bounds items are present.
-                    if (param.expectedExtraItemsBeforeVisibleBounds()) {
-                        assertThat(placedItems.keys).containsExactly(9, 10, 11, 12, 13, 14, 15)
-                    } else {
-                        assertThat(placedItems.keys).containsExactly(10, 11, 12, 13, 14, 15, 16)
+            forEachParameter(ParamsToTest) { param ->
+                // Act.
+                runOnUiThread {
+                    beyondBoundsLayout!!.layout(param.beyondBoundsLayoutDirection) {
+                        // Assert that the beyond bounds items are present.
+                        if (param.expectedExtraItemsBeforeVisibleBounds()) {
+                            assertThat(placedItems.keys).containsExactly(9, 10, 11, 12, 13, 14, 15)
+                        } else {
+                            assertThat(placedItems.keys).containsExactly(10, 11, 12, 13, 14, 15, 16)
+                        }
+                        assertThat(visibleItems).containsExactly(10, 11, 12, 13, 14, 15)
+
+                        assertThat(placedItems.values).isInOrder(param.placementComparator())
+
+                        // Just return true so that we stop as soon as we run this once.
+                        // This should result in one extra item being added.
+                        true
                     }
+                }
+
+                // Assert that the beyond bounds items are removed.
+                runOnIdle {
+                    assertThat(placedItems.keys).containsExactly(10, 11, 12, 13, 14, 15)
                     assertThat(visibleItems).containsExactly(10, 11, 12, 13, 14, 15)
-
-                    assertThat(placedItems.values).isInOrder(param.placementComparator())
-
-                    // Just return true so that we stop as soon as we run this once.
-                    // This should result in one extra item being added.
-                    true
                 }
+                resetTestCase(10)
             }
-
-            // Assert that the beyond bounds items are removed.
-            runOnIdle {
-                assertThat(placedItems.keys).containsExactly(10, 11, 12, 13, 14, 15)
-                assertThat(visibleItems).containsExactly(10, 11, 12, 13, 14, 15)
-            }
-            resetTestCase(10)
         }
-    }
 
     @Test
-    fun twoExtraItemsBeyondVisibleBounds() = with(rule) {
-        // Arrange.
-        setLazyContent(size = 30.toDp(), firstVisibleItem = 5) {
-            items(5) { index ->
-                Box(
-                    Modifier
-                        .size(10.toDp())
-                        .trackPlaced(index)
-                )
-            }
-            item {
-                Box(
-                    Modifier
-                        .size(10.toDp())
-                        .trackPlaced(5)
-                        .modifierLocalConsumer {
+    fun twoExtraItemsBeyondVisibleBounds() =
+        with(rule) {
+            // Arrange.
+            setLazyContent(size = 30.toDp(), firstVisibleItem = 5) {
+                items(5) { index -> Box(Modifier.size(10.toDp()).trackPlaced(index)) }
+                item {
+                    Box(
+                        Modifier.size(10.toDp()).trackPlaced(5).modifierLocalConsumer {
                             beyondBoundsLayout = ModifierLocalBeyondBoundsLayout.current
                         }
-                )
+                    )
+                }
+                items(5) { index -> Box(Modifier.size(10.toDp()).trackPlaced(index + 6)) }
             }
-            items(5) { index ->
-                Box(
-                    Modifier
-                        .size(10.toDp())
-                        .trackPlaced(index + 6)
-                )
+
+            forEachParameter(ParamsToTest) { param ->
+                var extraItemCount = 2
+                // Act.
+                runOnUiThread {
+                    beyondBoundsLayout!!.layout(param.beyondBoundsLayoutDirection) {
+                        if (--extraItemCount > 0) {
+                            // Return null to continue the search.
+                            null
+                        } else {
+                            // Assert that the beyond bounds items are present.
+                            if (param.expectedExtraItemsBeforeVisibleBounds()) {
+                                assertThat(placedItems.keys).containsExactly(3, 4, 5, 6, 7)
+                            } else {
+                                assertThat(placedItems.keys).containsExactly(5, 6, 7, 8, 9)
+                            }
+                            assertThat(visibleItems).containsExactly(5, 6, 7)
+
+                            assertThat(placedItems.values).isInOrder(param.placementComparator())
+
+                            // Return true to stop the search.
+                            true
+                        }
+                    }
+                }
+
+                // Assert that the beyond bounds items are removed.
+                runOnIdle {
+                    assertThat(placedItems.keys).containsExactly(5, 6, 7)
+                    assertThat(visibleItems).containsExactly(5, 6, 7)
+                }
+                resetTestCase(5)
             }
         }
 
-        forEachParameter(ParamsToTest) { param ->
-            var extraItemCount = 2
-            // Act.
-            runOnUiThread {
-                beyondBoundsLayout!!.layout(param.beyondBoundsLayoutDirection) {
-                    if (--extraItemCount > 0) {
-                        // Return null to continue the search.
-                        null
-                    } else {
-                        // Assert that the beyond bounds items are present.
-                        if (param.expectedExtraItemsBeforeVisibleBounds()) {
-                            assertThat(placedItems.keys).containsExactly(3, 4, 5, 6, 7)
+    @Test
+    fun allBeyondBoundsItemsInSpecifiedDirection() =
+        with(rule) {
+            // Arrange.
+            setLazyContent(size = 30.toDp(), firstVisibleItem = 5) {
+                items(5) { index -> Box(Modifier.size(10.toDp()).trackPlaced(index)) }
+                item {
+                    Box(
+                        Modifier.size(10.toDp())
+                            .modifierLocalConsumer {
+                                beyondBoundsLayout = ModifierLocalBeyondBoundsLayout.current
+                            }
+                            .trackPlaced(5)
+                    )
+                }
+                items(5) { index -> Box(Modifier.size(10.toDp()).trackPlaced(index + 6)) }
+            }
+
+            forEachParameter(ParamsToTest) { param ->
+                // Act.
+                runOnUiThread {
+                    beyondBoundsLayout!!.layout(param.beyondBoundsLayoutDirection) {
+                        if (hasMoreContent) {
+                            // Just return null so that we keep adding more items till we reach the
+                            // end.
+                            null
                         } else {
-                            assertThat(placedItems.keys).containsExactly(5, 6, 7, 8, 9)
+                            // Assert that the beyond bounds items are present.
+                            if (param.expectedExtraItemsBeforeVisibleBounds()) {
+                                assertThat(placedItems.keys).containsExactly(0, 1, 2, 3, 4, 5, 6, 7)
+                            } else {
+                                assertThat(placedItems.keys).containsExactly(5, 6, 7, 8, 9, 10)
+                            }
+                            assertThat(visibleItems).containsExactly(5, 6, 7)
+
+                            assertThat(placedItems.values).isInOrder(param.placementComparator())
+
+                            // Return true to end the search.
+                            true
                         }
-                        assertThat(visibleItems).containsExactly(5, 6, 7)
+                    }
+                }
 
-                        assertThat(placedItems.values).isInOrder(param.placementComparator())
+                // Assert that the beyond bounds items are removed.
+                runOnIdle { assertThat(placedItems.keys).containsExactly(5, 6, 7) }
+                resetTestCase(5)
+            }
+        }
 
-                        // Return true to stop the search.
+    @Test
+    fun beyondBoundsLayoutRequest_inDirectionPerpendicularToLazyListOrientation() =
+        with(rule) {
+            // Arrange.
+            setLazyContentInPerpendicularDirection(size = 30.toDp(), firstVisibleItem = 5) {
+                items(5) { index -> Box(Modifier.size(10.toDp()).trackPlaced(index)) }
+                item {
+                    Box(
+                        Modifier.size(10.toDp()).trackPlaced(5).modifierLocalConsumer {
+                            beyondBoundsLayout = ModifierLocalBeyondBoundsLayout.current
+                        }
+                    )
+                }
+                items(5) { index -> Box(Modifier.size(10.toDp()).trackPlaced(index + 6)) }
+            }
+
+            forEachParameter(ParamsToTest) { param ->
+                var beyondBoundsLayoutCount = 0
+                runOnIdle {
+                    assertThat(placedItems.keys).containsExactly(5, 6, 7)
+                    assertThat(visibleItems).containsExactly(5, 6, 7)
+                }
+
+                // Act.
+                runOnUiThread {
+                    beyondBoundsLayout!!.layout(param.beyondBoundsLayoutDirection) {
+                        beyondBoundsLayoutCount++
+                        when (param.beyondBoundsLayoutDirection) {
+                            Left,
+                            Right,
+                            Above,
+                            Below -> {
+                                assertThat(placedItems.keys).containsExactly(5, 6, 7)
+                                assertThat(visibleItems).containsExactly(5, 6, 7)
+                            }
+                            Before,
+                            After -> {
+                                if (param.expectedExtraItemsBeforeVisibleBounds()) {
+                                    assertThat(placedItems.keys).containsExactly(4, 5, 6, 7)
+                                    assertThat(visibleItems).containsExactly(5, 6, 7)
+                                } else {
+                                    assertThat(placedItems.keys).containsExactly(5, 6, 7, 8)
+                                    assertThat(visibleItems).containsExactly(5, 6, 7)
+                                }
+                            }
+                        }
+                        // Just return true so that we stop as soon as we run this once.
+                        // This should result in one extra item being added.
                         true
                     }
                 }
-            }
 
-            // Assert that the beyond bounds items are removed.
-            runOnIdle {
-                assertThat(placedItems.keys).containsExactly(5, 6, 7)
-                assertThat(visibleItems).containsExactly(5, 6, 7)
-            }
-            resetTestCase(5)
-        }
-    }
-
-    @Test
-    fun allBeyondBoundsItemsInSpecifiedDirection() = with(rule) {
-        // Arrange.
-        setLazyContent(size = 30.toDp(), firstVisibleItem = 5) {
-            items(5) { index ->
-                Box(
-                    Modifier
-                        .size(10.toDp())
-                        .trackPlaced(index)
-                )
-            }
-            item {
-                Box(
-                    Modifier
-                        .size(10.toDp())
-                        .modifierLocalConsumer {
-                            beyondBoundsLayout = ModifierLocalBeyondBoundsLayout.current
-                        }
-                        .trackPlaced(5)
-                )
-            }
-            items(5) { index ->
-                Box(
-                    Modifier
-                        .size(10.toDp())
-                        .trackPlaced(index + 6)
-                )
-            }
-        }
-
-        forEachParameter(ParamsToTest) { param ->
-            // Act.
-            runOnUiThread {
-                beyondBoundsLayout!!.layout(param.beyondBoundsLayoutDirection) {
-                    if (hasMoreContent) {
-                        // Just return null so that we keep adding more items till we reach the end.
-                        null
-                    } else {
-                        // Assert that the beyond bounds items are present.
-                        if (param.expectedExtraItemsBeforeVisibleBounds()) {
-                            assertThat(placedItems.keys).containsExactly(0, 1, 2, 3, 4, 5, 6, 7)
-                        } else {
-                            assertThat(placedItems.keys).containsExactly(5, 6, 7, 8, 9, 10)
-                        }
-                        assertThat(visibleItems).containsExactly(5, 6, 7)
-
-                        assertThat(placedItems.values).isInOrder(param.placementComparator())
-
-                        // Return true to end the search.
-                        true
-                    }
-                }
-            }
-
-            // Assert that the beyond bounds items are removed.
-            runOnIdle {
-                assertThat(placedItems.keys).containsExactly(5, 6, 7)
-            }
-            resetTestCase(5)
-        }
-    }
-
-    @Test
-    fun beyondBoundsLayoutRequest_inDirectionPerpendicularToLazyListOrientation() = with(rule) {
-        // Arrange.
-        setLazyContentInPerpendicularDirection(size = 30.toDp(), firstVisibleItem = 5) {
-            items(5) { index ->
-                Box(
-                    Modifier
-                        .size(10.toDp())
-                        .trackPlaced(index)
-                )
-            }
-            item {
-                Box(
-                    Modifier
-                        .size(10.toDp())
-                        .trackPlaced(5)
-                        .modifierLocalConsumer {
-                            beyondBoundsLayout = ModifierLocalBeyondBoundsLayout.current
-                        }
-                )
-            }
-            items(5) { index ->
-                Box(
-                    Modifier
-                        .size(10.toDp())
-                        .trackPlaced(index + 6)
-                )
-            }
-        }
-
-        forEachParameter(ParamsToTest) { param ->
-            var beyondBoundsLayoutCount = 0
-            runOnIdle {
-                assertThat(placedItems.keys).containsExactly(5, 6, 7)
-                assertThat(visibleItems).containsExactly(5, 6, 7)
-            }
-
-            // Act.
-            runOnUiThread {
-                beyondBoundsLayout!!.layout(param.beyondBoundsLayoutDirection) {
-                    beyondBoundsLayoutCount++
+                runOnIdle {
                     when (param.beyondBoundsLayoutDirection) {
-                        Left, Right, Above, Below -> {
+                        Left,
+                        Right,
+                        Above,
+                        Below -> {
+                            assertThat(beyondBoundsLayoutCount).isEqualTo(0)
+                        }
+                        Before,
+                        After -> {
+                            assertThat(beyondBoundsLayoutCount).isEqualTo(1)
+
+                            // Assert that the beyond bounds items are removed.
                             assertThat(placedItems.keys).containsExactly(5, 6, 7)
                             assertThat(visibleItems).containsExactly(5, 6, 7)
                         }
-
-                        Before, After -> {
-                            if (param.expectedExtraItemsBeforeVisibleBounds()) {
-                                assertThat(placedItems.keys).containsExactly(4, 5, 6, 7)
-                                assertThat(visibleItems).containsExactly(5, 6, 7)
-                            } else {
-                                assertThat(placedItems.keys).containsExactly(5, 6, 7, 8)
-                                assertThat(visibleItems).containsExactly(5, 6, 7)
-                            }
-                        }
+                        else -> error("Unsupported BeyondBoundsLayoutDirection")
                     }
-                    // Just return true so that we stop as soon as we run this once.
-                    // This should result in one extra item being added.
-                    true
                 }
+                resetTestCase(5)
             }
-
-            runOnIdle {
-                when (param.beyondBoundsLayoutDirection) {
-                    Left, Right, Above, Below -> {
-                        assertThat(beyondBoundsLayoutCount).isEqualTo(0)
-                    }
-
-                    Before, After -> {
-                        assertThat(beyondBoundsLayoutCount).isEqualTo(1)
-
-                        // Assert that the beyond bounds items are removed.
-                        assertThat(placedItems.keys).containsExactly(5, 6, 7)
-                        assertThat(visibleItems).containsExactly(5, 6, 7)
-                    }
-
-                    else -> error("Unsupported BeyondBoundsLayoutDirection")
-                }
-            }
-            resetTestCase(5)
         }
-    }
 
     @Test
-    fun returningNullDoesNotCauseInfiniteLoop() = with(rule) {
-        // Arrange.
-        setLazyContent(size = 30.toDp(), firstVisibleItem = 5) {
-            items(5) { index ->
-                Box(
-                    Modifier
-                        .size(10.toDp())
-                        .trackPlaced(index)
-                )
-            }
-            item {
-                Box(
-                    Modifier
-                        .size(10.toDp())
-                        .modifierLocalConsumer {
-                            beyondBoundsLayout = ModifierLocalBeyondBoundsLayout.current
-                        }
-                        .trackPlaced(5)
-                )
-            }
-            items(5) { index ->
-                Box(
-                    Modifier
-                        .size(10.toDp())
-                        .trackPlaced(index + 6)
-                )
-            }
-        }
-
-        forEachParameter(ParamsToTest) { param ->
-            // Act.
-            var count = 0
-            runOnUiThread {
-                beyondBoundsLayout!!.layout(param.beyondBoundsLayoutDirection) {
-                    // Assert that we don't keep iterating when there is no ending condition.
-                    assertThat(count++).isLessThan(lazyGridState.layoutInfo.totalItemsCount)
-                    // Always return null to continue the search.
-                    null
+    fun returningNullDoesNotCauseInfiniteLoop() =
+        with(rule) {
+            // Arrange.
+            setLazyContent(size = 30.toDp(), firstVisibleItem = 5) {
+                items(5) { index -> Box(Modifier.size(10.toDp()).trackPlaced(index)) }
+                item {
+                    Box(
+                        Modifier.size(10.toDp())
+                            .modifierLocalConsumer {
+                                beyondBoundsLayout = ModifierLocalBeyondBoundsLayout.current
+                            }
+                            .trackPlaced(5)
+                    )
                 }
+                items(5) { index -> Box(Modifier.size(10.toDp()).trackPlaced(index + 6)) }
             }
 
-            // Assert that the beyond bounds items are removed.
-            runOnIdle {
-                assertThat(placedItems.keys).containsExactly(5, 6, 7)
-                assertThat(visibleItems).containsExactly(5, 6, 7)
+            forEachParameter(ParamsToTest) { param ->
+                // Act.
+                var count = 0
+                runOnUiThread {
+                    beyondBoundsLayout!!.layout(param.beyondBoundsLayoutDirection) {
+                        // Assert that we don't keep iterating when there is no ending condition.
+                        assertThat(count++).isLessThan(lazyGridState.layoutInfo.totalItemsCount)
+                        // Always return null to continue the search.
+                        null
+                    }
+                }
+
+                // Assert that the beyond bounds items are removed.
+                runOnIdle {
+                    assertThat(placedItems.keys).containsExactly(5, 6, 7)
+                    assertThat(visibleItems).containsExactly(5, 6, 7)
+                }
+                resetTestCase(5)
             }
-            resetTestCase(5)
         }
-    }
 
     private fun ParameterizedComposeTestRule<Param>.setLazyContent(
         size: Dp,
@@ -598,7 +506,10 @@
                 CompositionLocalProvider(LocalLayoutDirection provides it.layoutDirection) {
                     lazyGridState = rememberLazyGridState(firstVisibleItem)
                     when (it.beyondBoundsLayoutDirection) {
-                        Left, Right, Before, After ->
+                        Left,
+                        Right,
+                        Before,
+                        After ->
                             LazyHorizontalGrid(
                                 rows = GridCells.Fixed(cells),
                                 modifier = Modifier.size(size),
@@ -606,8 +517,8 @@
                                 reverseLayout = it.reverseLayout,
                                 content = content
                             )
-
-                        Above, Below ->
+                        Above,
+                        Below ->
                             LazyVerticalGrid(
                                 columns = GridCells.Fixed(cells),
                                 modifier = Modifier.size(size),
@@ -615,7 +526,6 @@
                                 reverseLayout = it.reverseLayout,
                                 content = content
                             )
-
                         else -> unsupportedDirection()
                     }
                 }
@@ -633,7 +543,10 @@
                 CompositionLocalProvider(LocalLayoutDirection provides it.layoutDirection) {
                     lazyGridState = rememberLazyGridState(firstVisibleItem)
                     when (it.beyondBoundsLayoutDirection) {
-                        Left, Right, Before, After ->
+                        Left,
+                        Right,
+                        Before,
+                        After ->
                             LazyVerticalGrid(
                                 columns = GridCells.Fixed(1),
                                 modifier = Modifier.size(size),
@@ -641,8 +554,8 @@
                                 reverseLayout = it.reverseLayout,
                                 content = content
                             )
-
-                        Above, Below ->
+                        Above,
+                        Below ->
                             LazyHorizontalGrid(
                                 rows = GridCells.Fixed(1),
                                 modifier = Modifier.size(size),
@@ -650,7 +563,6 @@
                                 reverseLayout = it.reverseLayout,
                                 content = content
                             )
-
                         else -> unsupportedDirection()
                     }
                 }
@@ -663,19 +575,19 @@
     private val visibleItems: List<Int>
         get() = lazyGridState.layoutInfo.visibleItemsInfo.map { it.index }
 
-    private fun Param.expectedExtraItemsBeforeVisibleBounds() = when (beyondBoundsLayoutDirection) {
-        Right -> if (layoutDirection == Ltr) reverseLayout else !reverseLayout
-        Left -> if (layoutDirection == Ltr) !reverseLayout else reverseLayout
-        Above -> !reverseLayout
-        Below -> reverseLayout
-        After -> false
-        Before -> true
-        else -> error("Unsupported BeyondBoundsDirection")
-    }
+    private fun Param.expectedExtraItemsBeforeVisibleBounds() =
+        when (beyondBoundsLayoutDirection) {
+            Right -> if (layoutDirection == Ltr) reverseLayout else !reverseLayout
+            Left -> if (layoutDirection == Ltr) !reverseLayout else reverseLayout
+            Above -> !reverseLayout
+            Below -> reverseLayout
+            After -> false
+            Before -> true
+            else -> error("Unsupported BeyondBoundsDirection")
+        }
 
-    private fun unsupportedDirection(): Nothing = error(
-        "Lazy list does not support beyond bounds layout for the specified direction"
-    )
+    private fun unsupportedDirection(): Nothing =
+        error("Lazy list does not support beyond bounds layout for the specified direction")
 
     private fun Modifier.trackPlaced(index: Int): Modifier =
         this then TrackPlacedElement(index, placedItems)
diff --git a/compose/foundation/foundation/integration-tests/lazy-tests/src/androidTest/kotlin/androidx/compose/foundation/lazy/grid/LazyGridItemAppearanceAnimationTest.kt b/compose/foundation/foundation/integration-tests/lazy-tests/src/androidTest/kotlin/androidx/compose/foundation/lazy/grid/LazyGridItemAppearanceAnimationTest.kt
index f982bfd..d19125a 100644
--- a/compose/foundation/foundation/integration-tests/lazy-tests/src/androidTest/kotlin/androidx/compose/foundation/lazy/grid/LazyGridItemAppearanceAnimationTest.kt
+++ b/compose/foundation/foundation/integration-tests/lazy-tests/src/androidTest/kotlin/androidx/compose/foundation/lazy/grid/LazyGridItemAppearanceAnimationTest.kt
@@ -57,8 +57,7 @@
 @SdkSuppress(minSdkVersion = Build.VERSION_CODES.O)
 class LazyGridItemAppearanceAnimationTest {
 
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
     private val itemSize: Int = 4
     private var itemSizeDp: Dp = Dp.Infinity
@@ -82,16 +81,10 @@
     fun oneItemAdded() {
         var list by mutableStateOf(emptyList<Color>())
         rule.setContent {
-            LazyGrid(containerSize = itemSizeDp) {
-                items(list, key = { it.toArgb() }) {
-                    Item(it)
-                }
-            }
+            LazyGrid(containerSize = itemSizeDp) { items(list, key = { it.toArgb() }) { Item(it) } }
         }
 
-        rule.runOnUiThread {
-            list = listOf(Color.Black)
-        }
+        rule.runOnUiThread { list = listOf(Color.Black) }
 
         onAnimationFrame { fraction ->
             assertPixels(mainAxisSize = itemSize) { _, _ -> Color.Black.copy(alpha = fraction) }
@@ -102,9 +95,7 @@
     fun noAnimationForInitialList() {
         rule.setContent {
             LazyGrid(containerSize = itemSizeDp) {
-                items(listOf(Color.Black), key = { it.toArgb() }) {
-                    Item(it)
-                }
+                items(listOf(Color.Black), key = { it.toArgb() }) { Item(it) }
             }
         }
 
@@ -116,15 +107,11 @@
         var list by mutableStateOf(listOf(Color.Black))
         rule.setContent {
             LazyGrid(containerSize = itemSizeDp * 3) {
-                items(list, key = { it.toArgb() }) {
-                    Item(it)
-                }
+                items(list, key = { it.toArgb() }) { Item(it) }
             }
         }
 
-        rule.runOnUiThread {
-            list = listOf(Color.Black, Color.Red, Color.Green)
-        }
+        rule.runOnUiThread { list = listOf(Color.Black, Color.Red, Color.Green) }
 
         onAnimationFrame { fraction ->
             assertPixels(itemSize * 3) { _, offset ->
@@ -148,9 +135,7 @@
             }
         }
 
-        rule.runOnUiThread {
-            list = listOf(Color.Black, Color.Red)
-        }
+        rule.runOnUiThread { list = listOf(Color.Black, Color.Red) }
 
         onAnimationFrame { fraction ->
             assertPixels(itemSize * 2) { _, offset ->
@@ -167,9 +152,7 @@
         var list by mutableStateOf(listOf(Color.Black, Color.Red, Color.Green))
         rule.setContent {
             LazyGrid(containerSize = itemSizeDp * 2) {
-                items(list, key = { it.toArgb() }) {
-                    Item(it)
-                }
+                items(list, key = { it.toArgb() }) { Item(it) }
             }
         }
 
@@ -200,49 +183,31 @@
     fun animatedItemChangesTheContainerSize() {
         var list by mutableStateOf(listOf(Color.Black))
         rule.setContent {
-            LazyGrid(containerSize = null) {
-                items(list, key = { it.toArgb() }) {
-                    Item(it)
-                }
-            }
+            LazyGrid(containerSize = null) { items(list, key = { it.toArgb() }) { Item(it) } }
         }
 
-        rule.onNodeWithTag(ContainerTag)
-            .assertHeightIsEqualTo(itemSizeDp)
+        rule.onNodeWithTag(ContainerTag).assertHeightIsEqualTo(itemSizeDp)
 
-        rule.runOnUiThread {
-            list = listOf(Color.Black, Color.Red)
-        }
+        rule.runOnUiThread { list = listOf(Color.Black, Color.Red) }
 
-        onAnimationFrame {
-            rule.onNodeWithTag(ContainerTag)
-                .assertHeightIsEqualTo(itemSizeDp * 2)
-        }
+        onAnimationFrame { rule.onNodeWithTag(ContainerTag).assertHeightIsEqualTo(itemSizeDp * 2) }
     }
 
     @Test
     fun removeItemBeingAnimated() {
         var list by mutableStateOf(emptyList<Color>())
         rule.setContent {
-            LazyGrid(containerSize = itemSizeDp) {
-                items(list, key = { it.toArgb() }) {
-                    Item(it)
-                }
-            }
+            LazyGrid(containerSize = itemSizeDp) { items(list, key = { it.toArgb() }) { Item(it) } }
         }
 
-        rule.runOnUiThread {
-            list = listOf(Color.Black)
-        }
+        rule.runOnUiThread { list = listOf(Color.Black) }
 
         onAnimationFrame { fraction ->
             if (fraction < 0.5f) {
                 assertPixels(itemSize) { _, _ -> Color.Black.copy(alpha = fraction) }
             } else {
                 if (fraction.isCloseTo(0.5f)) {
-                    rule.runOnUiThread {
-                        list = emptyList()
-                    }
+                    rule.runOnUiThread { list = emptyList() }
                 }
                 assertPixels(itemSize) { _, _ -> Color.Transparent }
             }
@@ -254,9 +219,7 @@
         var list by mutableStateOf(listOf(Color.Black, Color.Green, Color.Blue, Color.Yellow))
         rule.setContent {
             LazyGrid(containerSize = itemSizeDp * 2) {
-                items(list, key = { it.toArgb() }) {
-                    Item(it)
-                }
+                items(list, key = { it.toArgb() }) { Item(it) }
             }
         }
 
@@ -288,11 +251,7 @@
                 }
             } else {
                 if (fraction.isCloseTo(0.75f)) {
-                    rule.runOnUiThread {
-                        runBlocking {
-                            state.scrollBy(-itemSize * 1.5f)
-                        }
-                    }
+                    rule.runOnUiThread { runBlocking { state.scrollBy(-itemSize * 1.5f) } }
                 }
                 assertPixels(itemSize * 2) { _, offset ->
                     // red item is not displayed anywhere
@@ -313,15 +272,11 @@
         val containerSizeDp = itemSizeDp * 2
         rule.setContent {
             LazyGrid(cells = 2, containerSize = containerSizeDp, crossAxisSize = containerSizeDp) {
-                items(list, key = { it.toArgb() }) {
-                    Item(it)
-                }
+                items(list, key = { it.toArgb() }) { Item(it) }
             }
         }
 
-        rule.runOnUiThread {
-            list = listOf(Color.Green, Color.Red, Color.Blue, Color.Black)
-        }
+        rule.runOnUiThread { list = listOf(Color.Green, Color.Red, Color.Blue, Color.Black) }
 
         onAnimationFrame { fraction ->
             assertPixels(containerSize, containerSize) { x, y ->
@@ -342,11 +297,11 @@
         crossAxisSize: Int = this.crossAxisSize,
         expectedColorProvider: (x: Int, y: Int) -> Color?
     ) {
-        rule.onNodeWithTag(ContainerTag)
-            .captureToImage()
-            .assertPixels(IntSize(crossAxisSize, mainAxisSize)) {
-                expectedColorProvider(it.x, it.y)?.compositeOver(Color.White)
-            }
+        rule.onNodeWithTag(ContainerTag).captureToImage().assertPixels(
+            IntSize(crossAxisSize, mainAxisSize)
+        ) {
+            expectedColorProvider(it.x, it.y)?.compositeOver(Color.White)
+        }
     }
 
     private fun onAnimationFrame(duration: Long = Duration, onFrame: (fraction: Float) -> Unit) {
@@ -378,23 +333,23 @@
         LazyVerticalGrid(
             GridCells.Fixed(cells),
             state = state,
-            modifier = Modifier
-                .then(
-                    if (containerSize != null) {
-                        Modifier.requiredHeight(containerSize)
-                    } else {
-                        Modifier
-                    }
-                )
-                .background(Color.White)
-                .then(
-                    if (crossAxisSize != Dp.Unspecified) {
-                        Modifier.requiredWidth(crossAxisSize)
-                    } else {
-                        Modifier.fillMaxWidth()
-                    }
-                )
-                .testTag(ContainerTag),
+            modifier =
+                Modifier.then(
+                        if (containerSize != null) {
+                            Modifier.requiredHeight(containerSize)
+                        } else {
+                            Modifier
+                        }
+                    )
+                    .background(Color.White)
+                    .then(
+                        if (crossAxisSize != Dp.Unspecified) {
+                            Modifier.requiredWidth(crossAxisSize)
+                        } else {
+                            Modifier.fillMaxWidth()
+                        }
+                    )
+                    .testTag(ContainerTag),
             content = content
         )
     }
@@ -407,12 +362,7 @@
         animSpec: FiniteAnimationSpec<Float>? = AnimSpec
     ) {
         Box(
-            Modifier
-                .animateItem(
-                    fadeInSpec = animSpec,
-                    placementSpec = null,
-                    fadeOutSpec = null
-                )
+            Modifier.animateItem(fadeInSpec = animSpec, placementSpec = null, fadeOutSpec = null)
                 .background(color)
                 .requiredHeight(size)
                 .requiredWidth(crossAxisSize)
diff --git a/compose/foundation/foundation/integration-tests/lazy-tests/src/androidTest/kotlin/androidx/compose/foundation/lazy/grid/LazyGridItemDisappearanceAnimationTest.kt b/compose/foundation/foundation/integration-tests/lazy-tests/src/androidTest/kotlin/androidx/compose/foundation/lazy/grid/LazyGridItemDisappearanceAnimationTest.kt
index 0575235..808bb76 100644
--- a/compose/foundation/foundation/integration-tests/lazy-tests/src/androidTest/kotlin/androidx/compose/foundation/lazy/grid/LazyGridItemDisappearanceAnimationTest.kt
+++ b/compose/foundation/foundation/integration-tests/lazy-tests/src/androidTest/kotlin/androidx/compose/foundation/lazy/grid/LazyGridItemDisappearanceAnimationTest.kt
@@ -58,8 +58,7 @@
 @SdkSuppress(minSdkVersion = Build.VERSION_CODES.O)
 class LazyGridItemDisappearanceAnimationTest {
 
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
     // the numbers should be divisible by 8 to avoid the rounding issues as we run 4 or 8 frames
     // of the animation.
@@ -85,16 +84,10 @@
     fun oneItemRemoved() {
         var list by mutableStateOf(listOf(Color.Black))
         rule.setContent {
-            LazyGrid(containerSize = itemSizeDp) {
-                items(list, key = { it.toArgb() }) {
-                    Item(it)
-                }
-            }
+            LazyGrid(containerSize = itemSizeDp) { items(list, key = { it.toArgb() }) { Item(it) } }
         }
 
-        rule.runOnUiThread {
-            list = emptyList()
-        }
+        rule.runOnUiThread { list = emptyList() }
 
         onAnimationFrame { fraction ->
             assertPixels(mainAxisSize = itemSize) { _, _ ->
@@ -108,15 +101,11 @@
         var list by mutableStateOf(listOf(Color.Black, Color.Red, Color.Green))
         rule.setContent {
             LazyGrid(containerSize = itemSizeDp * 3) {
-                items(list, key = { it.toArgb() }) {
-                    Item(it)
-                }
+                items(list, key = { it.toArgb() }) { Item(it) }
             }
         }
 
-        rule.runOnUiThread {
-            list = listOf(Color.Black)
-        }
+        rule.runOnUiThread { list = listOf(Color.Black) }
 
         onAnimationFrame { fraction ->
             assertPixels(itemSize * 3) { _, offset ->
@@ -135,15 +124,11 @@
         var list by mutableStateOf(listOf(Color.Black, Color.Red, Color.Green))
         rule.setContent {
             LazyGrid(containerSize = itemSizeDp * 3, reverseLayout = true) {
-                items(list, key = { it.toArgb() }) {
-                    Item(it)
-                }
+                items(list, key = { it.toArgb() }) { Item(it) }
             }
         }
 
-        rule.runOnUiThread {
-            list = listOf(Color.Black)
-        }
+        rule.runOnUiThread { list = listOf(Color.Black) }
 
         onAnimationFrame { fraction ->
             assertPixels(itemSize * 3) { _, offset ->
@@ -165,15 +150,11 @@
                 reverseLayout = true,
                 contentPadding = PaddingValues(bottom = itemSizeDp)
             ) {
-                items(list, key = { it.toArgb() }) {
-                    Item(it)
-                }
+                items(list, key = { it.toArgb() }) { Item(it) }
             }
         }
 
-        rule.runOnUiThread {
-            list = listOf(Color.Black)
-        }
+        rule.runOnUiThread { list = listOf(Color.Black) }
 
         onAnimationFrame { fraction ->
             assertPixels(itemSize * 3) { _, offset ->
@@ -197,9 +178,7 @@
             }
         }
 
-        rule.runOnUiThread {
-            list = emptyList()
-        }
+        rule.runOnUiThread { list = emptyList() }
 
         onAnimationFrame { fraction ->
             assertPixels(itemSize * 2) { _, offset ->
@@ -216,9 +195,7 @@
         var list by mutableStateOf(listOf(Color.Black, Color.Red, Color.Blue, Color.Green))
         rule.setContent {
             LazyGrid(containerSize = itemSizeDp * 2) {
-                items(list, key = { it.toArgb() }) {
-                    Item(it)
-                }
+                items(list, key = { it.toArgb() }) { Item(it) }
             }
         }
 
@@ -249,23 +226,15 @@
     fun itemsBeingRemovedAreAffectingTheContainerSizeForTheDurationOfAnimation() {
         var list by mutableStateOf(listOf(Color.Black, Color.Red))
         rule.setContent {
-            LazyGrid(containerSize = null) {
-                items(list, key = { it.toArgb() }) {
-                    Item(it)
-                }
-            }
+            LazyGrid(containerSize = null) { items(list, key = { it.toArgb() }) { Item(it) } }
         }
 
-        rule.onNodeWithTag(ContainerTag)
-            .assertHeightIsEqualTo(itemSizeDp * 2)
+        rule.onNodeWithTag(ContainerTag).assertHeightIsEqualTo(itemSizeDp * 2)
 
-        rule.runOnUiThread {
-            list = listOf(Color.Black)
-        }
+        rule.runOnUiThread { list = listOf(Color.Black) }
 
         onAnimationFrame { fraction ->
-            val heightDp = rule.onNodeWithTag(ContainerTag)
-                .getBoundsInRoot().height
+            val heightDp = rule.onNodeWithTag(ContainerTag).getBoundsInRoot().height
             val heightPx = with(rule.density) { heightDp.roundToPx() }
             Truth.assertWithMessage("Height on fraction=$fraction")
                 .that(heightPx)
@@ -289,14 +258,11 @@
         var list by mutableStateOf(listOf(Color.Black, Color.Red))
         rule.setContent {
             LazyGrid(containerSize = null, reverseLayout = true) {
-                items(list, key = { it.toArgb() }) {
-                    Item(it)
-                }
+                items(list, key = { it.toArgb() }) { Item(it) }
             }
         }
 
-        rule.onNodeWithTag(ContainerTag)
-            .assertHeightIsEqualTo(itemSizeDp * 2)
+        rule.onNodeWithTag(ContainerTag).assertHeightIsEqualTo(itemSizeDp * 2)
 
         assertPixels(itemSize * 2) { _, offset ->
             when (offset) {
@@ -305,13 +271,10 @@
             }
         }
 
-        rule.runOnUiThread {
-            list = listOf(Color.Black)
-        }
+        rule.runOnUiThread { list = listOf(Color.Black) }
 
         onAnimationFrame { fraction ->
-            val heightDp = rule.onNodeWithTag(ContainerTag)
-                .getBoundsInRoot().height
+            val heightDp = rule.onNodeWithTag(ContainerTag).getBoundsInRoot().height
             val heightPx = with(rule.density) { heightDp.roundToPx() }
             Truth.assertWithMessage("Height on fraction=$fraction")
                 .that(heightPx)
@@ -334,25 +297,17 @@
     fun reAddItemBeingAnimated_withoutAppearanceAnimation() {
         var list by mutableStateOf(listOf(Color.Black))
         rule.setContent {
-            LazyGrid(containerSize = itemSizeDp) {
-                items(list, key = { it.toArgb() }) {
-                    Item(it)
-                }
-            }
+            LazyGrid(containerSize = itemSizeDp) { items(list, key = { it.toArgb() }) { Item(it) } }
         }
 
-        rule.runOnUiThread {
-            list = emptyList()
-        }
+        rule.runOnUiThread { list = emptyList() }
 
         onAnimationFrame { fraction ->
             if (fraction < 0.5f) {
                 assertPixels(itemSize) { _, _ -> Color.Black.copy(alpha = 1f - fraction) }
             } else {
                 if (fraction.isCloseTo(0.5f)) {
-                    rule.runOnUiThread {
-                        list = listOf(Color.Black)
-                    }
+                    rule.runOnUiThread { list = listOf(Color.Black) }
                 }
                 assertPixels(itemSize) { _, _ -> Color.Black }
             }
@@ -370,22 +325,16 @@
             }
         }
 
-        rule.runOnUiThread {
-            list = emptyList()
-        }
+        rule.runOnUiThread { list = emptyList() }
 
         onAnimationFrame { fraction ->
             if (fraction < 0.5f) {
                 assertPixels(itemSize) { _, _ -> Color.Black.copy(alpha = 1f - fraction) }
             } else {
                 if (fraction.isCloseTo(0.5f)) {
-                    rule.runOnUiThread {
-                        list = listOf(Color.Black)
-                    }
+                    rule.runOnUiThread { list = listOf(Color.Black) }
                 }
-                assertPixels(itemSize) { _, _ ->
-                Color.Black.copy(alpha = fraction)
-                }
+                assertPixels(itemSize) { _, _ -> Color.Black.copy(alpha = fraction) }
             }
         }
     }
@@ -401,22 +350,16 @@
             }
         }
 
-        rule.runOnUiThread {
-            list = listOf(Color.Black)
-        }
+        rule.runOnUiThread { list = listOf(Color.Black) }
 
         onAnimationFrame { fraction ->
             if (fraction < 0.5f) {
                 assertPixels(itemSize) { _, _ -> Color.Black.copy(alpha = fraction) }
             } else {
                 if (fraction.isCloseTo(0.5f)) {
-                    rule.runOnUiThread {
-                        list = emptyList()
-                    }
+                    rule.runOnUiThread { list = emptyList() }
                 }
-                assertPixels(itemSize) { _, _ ->
-                    Color.Black.copy(alpha = 1f - fraction)
-                }
+                assertPixels(itemSize) { _, _ -> Color.Black.copy(alpha = 1f - fraction) }
             }
         }
     }
@@ -426,15 +369,11 @@
         var list by mutableStateOf(listOf(Color.Black, Color.Green))
         rule.setContent {
             LazyGrid(cells = 2, containerSize = itemSizeDp, crossAxisSize = itemSizeDp * 2) {
-                items(list, key = { it.toArgb() }) {
-                    Item(it)
-                }
+                items(list, key = { it.toArgb() }) { Item(it) }
             }
         }
 
-        rule.runOnUiThread {
-            list = emptyList()
-        }
+        rule.runOnUiThread { list = emptyList() }
 
         onAnimationFrame { fraction ->
             assertPixels(mainAxisSize = itemSize, crossAxisSize = itemSize * 2) { x, _ ->
@@ -452,11 +391,11 @@
         crossAxisSize: Int = this.crossAxisSize,
         expectedColorProvider: (x: Int, y: Int) -> Color?
     ) {
-        rule.onNodeWithTag(ContainerTag)
-            .captureToImage()
-            .assertPixels(IntSize(crossAxisSize, mainAxisSize)) {
-                expectedColorProvider(it.x, it.y)?.compositeOver(Color.White)
-            }
+        rule.onNodeWithTag(ContainerTag).captureToImage().assertPixels(
+            IntSize(crossAxisSize, mainAxisSize)
+        ) {
+            expectedColorProvider(it.x, it.y)?.compositeOver(Color.White)
+        }
     }
 
     private fun onAnimationFrame(duration: Long = Duration, onFrame: (fraction: Float) -> Unit) {
@@ -490,22 +429,23 @@
         LazyVerticalGrid(
             GridCells.Fixed(cells),
             state = state,
-            modifier = Modifier.then(
-                if (containerSize != null) {
-                    Modifier.requiredHeight(containerSize)
-                } else {
-                    Modifier
-                }
-            )
-                .background(Color.White)
-                .then(
-                    if (crossAxisSize != Dp.Unspecified) {
-                        Modifier.requiredWidth(crossAxisSize)
-                    } else {
-                        Modifier.fillMaxWidth()
-                    }
-                )
-                .testTag(ContainerTag),
+            modifier =
+                Modifier.then(
+                        if (containerSize != null) {
+                            Modifier.requiredHeight(containerSize)
+                        } else {
+                            Modifier
+                        }
+                    )
+                    .background(Color.White)
+                    .then(
+                        if (crossAxisSize != Dp.Unspecified) {
+                            Modifier.requiredWidth(crossAxisSize)
+                        } else {
+                            Modifier.fillMaxWidth()
+                        }
+                    )
+                    .testTag(ContainerTag),
             contentPadding = contentPadding,
             reverseLayout = reverseLayout,
             content = content
@@ -521,8 +461,7 @@
         appearanceSpec: FiniteAnimationSpec<Float>? = null
     ) {
         Box(
-            Modifier
-                .animateItem(
+            Modifier.animateItem(
                     fadeInSpec = appearanceSpec,
                     placementSpec = null,
                     fadeOutSpec = disappearanceSpec
diff --git a/compose/foundation/foundation/integration-tests/lazy-tests/src/androidTest/kotlin/androidx/compose/foundation/lazy/grid/LazyGridItemPlacementAnimationTest.kt b/compose/foundation/foundation/integration-tests/lazy-tests/src/androidTest/kotlin/androidx/compose/foundation/lazy/grid/LazyGridItemPlacementAnimationTest.kt
index 156c1bd..3d9d8d3 100644
--- a/compose/foundation/foundation/integration-tests/lazy-tests/src/androidTest/kotlin/androidx/compose/foundation/lazy/grid/LazyGridItemPlacementAnimationTest.kt
+++ b/compose/foundation/foundation/integration-tests/lazy-tests/src/androidTest/kotlin/androidx/compose/foundation/lazy/grid/LazyGridItemPlacementAnimationTest.kt
@@ -68,11 +68,13 @@
 @RunWith(Parameterized::class)
 class LazyGridItemPlacementAnimationTest(private val config: Config) {
 
-    private val isVertical: Boolean get() = config.isVertical
-    private val reverseLayout: Boolean get() = config.reverseLayout
+    private val isVertical: Boolean
+        get() = config.isVertical
 
-    @get:Rule
-    val rule = createComposeRule()
+    private val reverseLayout: Boolean
+        get() = config.reverseLayout
+
+    @get:Rule val rule = createComposeRule()
 
     // the numbers should be divisible by 8 to avoid the rounding issues as we run 4 or 8 frames
     // of the animation.
@@ -106,22 +108,11 @@
     @Test
     fun reorderTwoItems() {
         var list by mutableStateOf(listOf(0, 1))
-        rule.setContent {
-            LazyGrid(1) {
-                items(list, key = { it }) {
-                    Item(it)
-                }
-            }
-        }
+        rule.setContent { LazyGrid(1) { items(list, key = { it }) { Item(it) } } }
 
-        assertPositions(
-            0 to AxisOffset(0f, 0f),
-            1 to AxisOffset(0f, itemSize)
-        )
+        assertPositions(0 to AxisOffset(0f, 0f), 1 to AxisOffset(0f, itemSize))
 
-        rule.runOnUiThread {
-            list = listOf(1, 0)
-        }
+        rule.runOnUiThread { list = listOf(1, 0) }
 
         onAnimationFrame { fraction ->
             assertPositions(
@@ -135,13 +126,7 @@
     @Test
     fun reorderTwoByTwoItems() {
         var list by mutableStateOf(listOf(0, 1, 2, 3))
-        rule.setContent {
-            LazyGrid(2) {
-                items(list, key = { it }) {
-                    Item(it)
-                }
-            }
-        }
+        rule.setContent { LazyGrid(2) { items(list, key = { it }) { Item(it) } } }
 
         assertPositions(
             0 to AxisOffset(0f, 0f),
@@ -150,9 +135,7 @@
             3 to AxisOffset(itemSize, itemSize)
         )
 
-        rule.runOnUiThread {
-            list = listOf(3, 2, 1, 0)
-        }
+        rule.runOnUiThread { list = listOf(3, 2, 1, 0) }
 
         onAnimationFrame { fraction ->
             val increasing = 0 + itemSize * fraction
@@ -170,13 +153,7 @@
     @Test
     fun reorderTwoItems_layoutInfoHasFinalPositions() {
         var list by mutableStateOf(listOf(0, 1, 2, 3))
-        rule.setContent {
-            LazyGrid(2) {
-                items(list, key = { it }) {
-                    Item(it)
-                }
-            }
-        }
+        rule.setContent { LazyGrid(2) { items(list, key = { it }) { Item(it) } } }
 
         assertLayoutInfoPositions(
             0 to AxisOffset(0f, 0f),
@@ -185,9 +162,7 @@
             3 to AxisOffset(itemSize, itemSize)
         )
 
-        rule.runOnUiThread {
-            list = listOf(3, 2, 1, 0)
-        }
+        rule.runOnUiThread { list = listOf(3, 2, 1, 0) }
 
         onAnimationFrame {
             // fraction doesn't affect the offsets in layout info
@@ -203,13 +178,7 @@
     @Test
     fun reorderFirstAndLastItems() {
         var list by mutableStateOf(listOf(0, 1, 2, 3, 4))
-        rule.setContent {
-            LazyGrid(1) {
-                items(list, key = { it }) {
-                    Item(it)
-                }
-            }
-        }
+        rule.setContent { LazyGrid(1) { items(list, key = { it }) { Item(it) } } }
 
         assertPositions(
             0 to AxisOffset(0f, 0f),
@@ -219,9 +188,7 @@
             4 to AxisOffset(0f, itemSize * 4)
         )
 
-        rule.runOnUiThread {
-            list = listOf(4, 1, 2, 3, 0)
-        }
+        rule.runOnUiThread { list = listOf(4, 1, 2, 3, 0) }
 
         onAnimationFrame { fraction ->
             assertPositions(
@@ -238,13 +205,7 @@
     @Test
     fun moveFirstItemToEndCausingAllItemsToAnimate() {
         var list by mutableStateOf(listOf(0, 1, 2, 3, 4, 5))
-        rule.setContent {
-            LazyGrid(2) {
-                items(list, key = { it }) {
-                    Item(it)
-                }
-            }
-        }
+        rule.setContent { LazyGrid(2) { items(list, key = { it }) { Item(it) } } }
 
         assertPositions(
             0 to AxisOffset(0f, 0f),
@@ -255,9 +216,7 @@
             5 to AxisOffset(itemSize, itemSize * 2)
         )
 
-        rule.runOnUiThread {
-            list = listOf(1, 2, 3, 4, 5, 0)
-        }
+        rule.runOnUiThread { list = listOf(1, 2, 3, 4, 5, 0) }
 
         onAnimationFrame { fraction ->
             val increasingX = 0 + itemSize * fraction
@@ -285,13 +244,10 @@
             }
         }
 
-        rule.runOnUiThread {
-            size = itemSizeDp * 2
-        }
+        rule.runOnUiThread { size = itemSizeDp * 2 }
         rule.mainClock.advanceTimeByFrame()
 
-        rule.onNodeWithTag("1")
-            .assertMainAxisSizeIsEqualTo(size)
+        rule.onNodeWithTag("1").assertMainAxisSizeIsEqualTo(size)
 
         onAnimationFrame { fraction ->
             assertPositions(
@@ -315,9 +271,7 @@
             }
         }
 
-        rule.runOnUiThread {
-            list = listOf(1, 2, 3, 4, 0)
-        }
+        rule.runOnUiThread { list = listOf(1, 2, 3, 4, 0) }
 
         onAnimationFrame { fraction ->
             assertPositions(
@@ -343,9 +297,7 @@
             }
         }
 
-        rule.runOnUiThread {
-            list = listOf(1, 2, 3, 4, 0)
-        }
+        rule.runOnUiThread { list = listOf(1, 2, 3, 4, 0) }
 
         onAnimationFrame(duration = Duration * 2) { fraction ->
             val shorterAnimFraction = (fraction * 2).coerceAtMost(1f)
@@ -379,9 +331,7 @@
             3 to AxisOffset(0f, itemSize)
         )
 
-        rule.runOnUiThread {
-            list = listOf(2, 0)
-        }
+        rule.runOnUiThread { list = listOf(2, 0) }
 
         onAnimationFrame { fraction ->
             assertPositions(
@@ -406,9 +356,7 @@
             }
         }
 
-        rule.runOnUiThread {
-            list = listOf(2, 0)
-        }
+        rule.runOnUiThread { list = listOf(2, 0) }
 
         onAnimationFrame { fraction ->
             assertPositions(
@@ -431,9 +379,7 @@
                 minSize = itemSizeDp * 5,
                 maxSize = itemSizeDp * 5
             ) {
-                items(listOf(1, 2, 3), key = { it }) {
-                    Item(it)
-                }
+                items(listOf(1, 2, 3), key = { it }) { Item(it) }
             }
         }
 
@@ -443,9 +389,7 @@
             3 to AxisOffset(0f, itemSize * 3),
         )
 
-        rule.runOnUiThread {
-            arrangement = Arrangement.SpaceBetween
-        }
+        rule.runOnUiThread { arrangement = Arrangement.SpaceBetween }
         rule.mainClock.advanceTimeByFrame()
 
         onAnimationFrame { fraction ->
@@ -464,11 +408,7 @@
         val gridSize = itemSize * 3
         val gridSizeDp = with(rule.density) { gridSize.toDp() }
         rule.setContent {
-            LazyGrid(2, maxSize = gridSizeDp) {
-                items(list, key = { it }) {
-                    Item(it)
-                }
-            }
+            LazyGrid(2, maxSize = gridSizeDp) { items(list, key = { it }) { Item(it) } }
         }
 
         assertPositions(
@@ -480,36 +420,31 @@
             5 to AxisOffset(itemSize, itemSize * 2)
         )
 
-        rule.runOnUiThread {
-            list = listOf(0, 8, 2, 3, 4, 5, 6, 7, 1, 9, 10, 11)
-        }
+        rule.runOnUiThread { list = listOf(0, 8, 2, 3, 4, 5, 6, 7, 1, 9, 10, 11) }
 
         onAnimationFrame { fraction ->
             // item 1 moves to and item 8 moves from `gridSize`, right after the end edge
             val item1Offset = AxisOffset(itemSize, 0 + gridSize * fraction)
-            val item8Offset =
-                AxisOffset(itemSize, gridSize - gridSize * fraction)
-            val expected = mutableListOf<Pair<Any, Offset>>().apply {
-                add(0 to AxisOffset(0f, 0f))
-                if (item1Offset.mainAxis < itemSize * 3) {
-                    add(1 to item1Offset)
-                } else {
-                    rule.onNodeWithTag("1").assertIsNotDisplayed()
+            val item8Offset = AxisOffset(itemSize, gridSize - gridSize * fraction)
+            val expected =
+                mutableListOf<Pair<Any, Offset>>().apply {
+                    add(0 to AxisOffset(0f, 0f))
+                    if (item1Offset.mainAxis < itemSize * 3) {
+                        add(1 to item1Offset)
+                    } else {
+                        rule.onNodeWithTag("1").assertIsNotDisplayed()
+                    }
+                    add(2 to AxisOffset(0f, itemSize))
+                    add(3 to AxisOffset(itemSize, itemSize))
+                    add(4 to AxisOffset(0f, itemSize * 2))
+                    add(5 to AxisOffset(itemSize, itemSize * 2))
+                    if (item8Offset.mainAxis < itemSize * 3) {
+                        add(8 to item8Offset)
+                    } else {
+                        rule.onNodeWithTag("8").assertIsNotDisplayed()
+                    }
                 }
-                add(2 to AxisOffset(0f, itemSize))
-                add(3 to AxisOffset(itemSize, itemSize))
-                add(4 to AxisOffset(0f, itemSize * 2))
-                add(5 to AxisOffset(itemSize, itemSize * 2))
-                if (item8Offset.mainAxis < itemSize * 3) {
-                    add(8 to item8Offset)
-                } else {
-                    rule.onNodeWithTag("8").assertIsNotDisplayed()
-                }
-            }
-            assertPositions(
-                expected = expected.toTypedArray(),
-                fraction = fraction
-            )
+            assertPositions(expected = expected.toTypedArray(), fraction = fraction)
         }
     }
 
@@ -518,9 +453,7 @@
         var list by mutableStateOf(listOf(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11))
         rule.setContent {
             LazyGrid(2, maxSize = itemSizeDp * 3, startIndex = 6) {
-                items(list, key = { it }) {
-                    Item(it)
-                }
+                items(list, key = { it }) { Item(it) }
             }
         }
 
@@ -533,35 +466,31 @@
             11 to AxisOffset(itemSize, itemSize * 2)
         )
 
-        rule.runOnUiThread {
-            list = listOf(0, 8, 2, 3, 4, 5, 6, 7, 1, 9, 10, 11)
-        }
+        rule.runOnUiThread { list = listOf(0, 8, 2, 3, 4, 5, 6, 7, 1, 9, 10, 11) }
 
         onAnimationFrame { fraction ->
             // item 1 moves from and item 8 moves to `0 - itemSize`, right before the start edge
             val item8Offset = AxisOffset(0f, itemSize - itemSize * 2 * fraction)
             val item1Offset = AxisOffset(0f, -itemSize + itemSize * 2 * fraction)
-            val expected = mutableListOf<Pair<Any, Offset>>().apply {
-                if (item1Offset.mainAxis > -itemSize) {
-                    add(1 to item1Offset)
-                } else {
-                    rule.onNodeWithTag("1").assertIsNotDisplayed()
+            val expected =
+                mutableListOf<Pair<Any, Offset>>().apply {
+                    if (item1Offset.mainAxis > -itemSize) {
+                        add(1 to item1Offset)
+                    } else {
+                        rule.onNodeWithTag("1").assertIsNotDisplayed()
+                    }
+                    add(6 to AxisOffset(0f, 0f))
+                    add(7 to AxisOffset(itemSize, 0f))
+                    if (item8Offset.mainAxis > -itemSize) {
+                        add(8 to item8Offset)
+                    } else {
+                        rule.onNodeWithTag("8").assertIsNotDisplayed()
+                    }
+                    add(9 to AxisOffset(itemSize, itemSize))
+                    add(10 to AxisOffset(0f, itemSize * 2))
+                    add(11 to AxisOffset(itemSize, itemSize * 2))
                 }
-                add(6 to AxisOffset(0f, 0f))
-                add(7 to AxisOffset(itemSize, 0f))
-                if (item8Offset.mainAxis > -itemSize) {
-                    add(8 to item8Offset)
-                } else {
-                    rule.onNodeWithTag("8").assertIsNotDisplayed()
-                }
-                add(9 to AxisOffset(itemSize, itemSize))
-                add(10 to AxisOffset(0f, itemSize * 2))
-                add(11 to AxisOffset(itemSize, itemSize * 2))
-            }
-            assertPositions(
-                expected = expected.toTypedArray(),
-                fraction = fraction
-            )
+            assertPositions(expected = expected.toTypedArray(), fraction = fraction)
         }
     }
 
@@ -570,15 +499,11 @@
         var list by mutableStateOf(listOf(0, 1, 2, 3, 4, 5, 6, 7))
         rule.setContent {
             LazyGrid(2, arrangement = Arrangement.spacedBy(spacingDp)) {
-                items(list, key = { it }) {
-                    Item(it)
-                }
+                items(list, key = { it }) { Item(it) }
             }
         }
 
-        rule.runOnUiThread {
-            list = listOf(1, 2, 3, 4, 5, 6, 7, 0)
-        }
+        rule.runOnUiThread { list = listOf(1, 2, 3, 4, 5, 6, 7, 0) }
 
         onAnimationFrame { fraction ->
             val increasingX = fraction * itemSize
@@ -586,20 +511,19 @@
             assertPositions(
                 0 to AxisOffset(increasingX, itemSizePlusSpacing * 3 * fraction),
                 1 to AxisOffset(decreasingX, 0f),
-                2 to AxisOffset(
-                    increasingX,
-                    itemSizePlusSpacing - itemSizePlusSpacing * fraction
-                ),
+                2 to AxisOffset(increasingX, itemSizePlusSpacing - itemSizePlusSpacing * fraction),
                 3 to AxisOffset(decreasingX, itemSizePlusSpacing),
-                4 to AxisOffset(
-                    increasingX,
-                    itemSizePlusSpacing * 2 - itemSizePlusSpacing * fraction
-                ),
+                4 to
+                    AxisOffset(
+                        increasingX,
+                        itemSizePlusSpacing * 2 - itemSizePlusSpacing * fraction
+                    ),
                 5 to AxisOffset(decreasingX, itemSizePlusSpacing * 2),
-                6 to AxisOffset(
-                    increasingX,
-                    itemSizePlusSpacing * 3 - itemSizePlusSpacing * fraction
-                ),
+                6 to
+                    AxisOffset(
+                        increasingX,
+                        itemSizePlusSpacing * 3 - itemSizePlusSpacing * fraction
+                    ),
                 7 to AxisOffset(decreasingX, itemSizePlusSpacing * 3),
                 fraction = fraction
             )
@@ -612,14 +536,8 @@
         val gridSize = itemSize * 3 + spacing * 2
         val gridSizeDp = with(rule.density) { gridSize.toDp() }
         rule.setContent {
-            LazyGrid(
-                2,
-                maxSize = gridSizeDp,
-                arrangement = Arrangement.spacedBy(spacingDp)
-            ) {
-                items(list, key = { it }) {
-                    Item(it)
-                }
+            LazyGrid(2, maxSize = gridSizeDp, arrangement = Arrangement.spacedBy(spacingDp)) {
+                items(list, key = { it }) { Item(it) }
             }
         }
 
@@ -632,9 +550,7 @@
             5 to AxisOffset(itemSize, itemSizePlusSpacing * 2)
         )
 
-        rule.runOnUiThread {
-            list = listOf(0, 8, 2, 3, 4, 5, 6, 7, 1, 9)
-        }
+        rule.runOnUiThread { list = listOf(0, 8, 2, 3, 4, 5, 6, 7, 1, 9) }
 
         val afterLastVisibleItem = itemSize * 3 + spacing * 3
         onAnimationFrame { fraction ->
@@ -643,23 +559,21 @@
             val item8Offset =
                 AxisOffset(itemSize, afterLastVisibleItem - afterLastVisibleItem * fraction)
             val screenSize = itemSize * 3 + spacing * 2
-            val expected = mutableListOf<Pair<Any, Offset>>().apply {
-                add(0 to AxisOffset(0f, 0f))
-                if (item1Offset.mainAxis < screenSize) {
-                    add(1 to item1Offset)
+            val expected =
+                mutableListOf<Pair<Any, Offset>>().apply {
+                    add(0 to AxisOffset(0f, 0f))
+                    if (item1Offset.mainAxis < screenSize) {
+                        add(1 to item1Offset)
+                    }
+                    add(2 to AxisOffset(0f, itemSizePlusSpacing))
+                    add(3 to AxisOffset(itemSize, itemSizePlusSpacing))
+                    add(4 to AxisOffset(0f, itemSizePlusSpacing * 2))
+                    add(5 to AxisOffset(itemSize, itemSizePlusSpacing * 2))
+                    if (item8Offset.mainAxis < screenSize) {
+                        add(8 to item8Offset)
+                    }
                 }
-                add(2 to AxisOffset(0f, itemSizePlusSpacing))
-                add(3 to AxisOffset(itemSize, itemSizePlusSpacing))
-                add(4 to AxisOffset(0f, itemSizePlusSpacing * 2))
-                add(5 to AxisOffset(itemSize, itemSizePlusSpacing * 2))
-                if (item8Offset.mainAxis < screenSize) {
-                    add(8 to item8Offset)
-                }
-            }
-            assertPositions(
-                expected = expected.toTypedArray(),
-                fraction = fraction
-            )
+            assertPositions(expected = expected.toTypedArray(), fraction = fraction)
         }
     }
 
@@ -673,9 +587,7 @@
                 arrangement = Arrangement.spacedBy(spacingDp),
                 startIndex = 4
             ) {
-                items(list, key = { it }) {
-                    Item(it)
-                }
+                items(list, key = { it }) { Item(it) }
             }
         }
 
@@ -688,38 +600,30 @@
             9 to AxisOffset(itemSize, itemSizePlusSpacing * 2)
         )
 
-        rule.runOnUiThread {
-            list = listOf(0, 8, 2, 3, 4, 5, 6, 7, 1, 9, 10, 11)
-        }
+        rule.runOnUiThread { list = listOf(0, 8, 2, 3, 4, 5, 6, 7, 1, 9, 10, 11) }
 
         onAnimationFrame { fraction ->
-            // item 8 moves to and item 1 moves from `-itemSizePlusSpacing`, right before the start edge
-            val item1Offset = AxisOffset(
-                0f,
-                -itemSizePlusSpacing + (itemSizePlusSpacing * 3) * fraction
-            )
-            val item8Offset = AxisOffset(
-                0f,
-                itemSizePlusSpacing * 2 -
-                    (itemSizePlusSpacing * 3) * fraction
-            )
-            val expected = mutableListOf<Pair<Any, Offset>>().apply {
-                if (item1Offset.mainAxis > -itemSize) {
-                    add(1 to item1Offset)
+            // item 8 moves to and item 1 moves from `-itemSizePlusSpacing`, right before the start
+            // edge
+            val item1Offset =
+                AxisOffset(0f, -itemSizePlusSpacing + (itemSizePlusSpacing * 3) * fraction)
+            val item8Offset =
+                AxisOffset(0f, itemSizePlusSpacing * 2 - (itemSizePlusSpacing * 3) * fraction)
+            val expected =
+                mutableListOf<Pair<Any, Offset>>().apply {
+                    if (item1Offset.mainAxis > -itemSize) {
+                        add(1 to item1Offset)
+                    }
+                    add(4 to AxisOffset(0f, 0f))
+                    add(5 to AxisOffset(itemSize, 0f))
+                    add(6 to AxisOffset(0f, itemSizePlusSpacing))
+                    add(7 to AxisOffset(itemSize, itemSizePlusSpacing))
+                    if (item8Offset.mainAxis > -itemSize) {
+                        add(8 to item8Offset)
+                    }
+                    add(9 to AxisOffset(itemSize, itemSizePlusSpacing * 2))
                 }
-                add(4 to AxisOffset(0f, 0f))
-                add(5 to AxisOffset(itemSize, 0f))
-                add(6 to AxisOffset(0f, itemSizePlusSpacing))
-                add(7 to AxisOffset(itemSize, itemSizePlusSpacing))
-                if (item8Offset.mainAxis > -itemSize) {
-                    add(8 to item8Offset)
-                }
-                add(9 to AxisOffset(itemSize, itemSizePlusSpacing * 2))
-            }
-            assertPositions(
-                expected = expected.toTypedArray(),
-                fraction = fraction
-            )
+            assertPositions(expected = expected.toTypedArray(), fraction = fraction)
         }
     }
 
@@ -729,15 +633,16 @@
         rule.setContent {
             LazyGrid(2, maxSize = itemSize2Dp + itemSize3Dp + itemSizeDp, startIndex = 6) {
                 items(list, key = { it }) {
-                    val height = when (it) {
-                        2 -> itemSize3Dp
-                        3 -> itemSize3Dp / 2
-                        6 -> itemSize2Dp
-                        7 -> itemSize2Dp / 2
-                        else -> {
-                            if (it % 2 == 0) itemSizeDp else itemSize3Dp / 2
+                    val height =
+                        when (it) {
+                            2 -> itemSize3Dp
+                            3 -> itemSize3Dp / 2
+                            6 -> itemSize2Dp
+                            7 -> itemSize2Dp / 2
+                            else -> {
+                                if (it % 2 == 0) itemSizeDp else itemSize3Dp / 2
+                            }
                         }
-                    }
                     Item(it, size = height)
                 }
             }
@@ -766,42 +671,41 @@
             val item2Size = itemSize3 /* the real size of the item 2 */
             // item 2 moves from `0 - item size`, right before the start edge
             val startItem2Offset = -item2Size
-            val item2Offset =
-                startItem2Offset + (itemSize2 - startItem2Offset) * fraction
+            val item2Offset = startItem2Offset + (itemSize2 - startItem2Offset) * fraction
             val item8Size = itemSize /* the real size of the item 8 */
             val endItem8Offset = -item8Size
             val item8Offset = line3Size - (line3Size - endItem8Offset) * fraction
-            val expected = mutableListOf<Pair<Any, Offset>>().apply {
-                if (item8Offset > -line4Size) {
-                    add(8 to AxisOffset(0f, item8Offset))
-                } else {
-                    rule.onNodeWithTag("8").assertIsNotDisplayed()
-                }
-                add(6 to AxisOffset(0f, 0f))
-                add(7 to AxisOffset(itemSize, 0f))
-                if (item2Offset > -item2Size) {
-                    add(2 to AxisOffset(0f, item2Offset))
-                } else {
-                    rule.onNodeWithTag("2").assertIsNotDisplayed()
-                }
-                add(9 to AxisOffset(itemSize, line3Size))
-                add(
-                    10 to AxisOffset(
-                        0f,
-                        line3Size + line4Size - (itemSize - itemSize3) * fraction
+            val expected =
+                mutableListOf<Pair<Any, Offset>>().apply {
+                    if (item8Offset > -line4Size) {
+                        add(8 to AxisOffset(0f, item8Offset))
+                    } else {
+                        rule.onNodeWithTag("8").assertIsNotDisplayed()
+                    }
+                    add(6 to AxisOffset(0f, 0f))
+                    add(7 to AxisOffset(itemSize, 0f))
+                    if (item2Offset > -item2Size) {
+                        add(2 to AxisOffset(0f, item2Offset))
+                    } else {
+                        rule.onNodeWithTag("2").assertIsNotDisplayed()
+                    }
+                    add(9 to AxisOffset(itemSize, line3Size))
+                    add(
+                        10 to
+                            AxisOffset(
+                                0f,
+                                line3Size + line4Size - (itemSize - itemSize3) * fraction
+                            )
                     )
-                )
-                add(
-                    11 to AxisOffset(
-                        itemSize,
-                        line3Size + line4Size - (itemSize - itemSize3) * fraction
+                    add(
+                        11 to
+                            AxisOffset(
+                                itemSize,
+                                line3Size + line4Size - (itemSize - itemSize3) * fraction
+                            )
                     )
-                )
-            }
-            assertPositions(
-                expected = expected.toTypedArray(),
-                fraction = fraction
-            )
+                }
+            assertPositions(expected = expected.toTypedArray(), fraction = fraction)
         }
     }
 
@@ -813,13 +717,14 @@
         rule.setContent {
             LazyGrid(2, maxSize = gridSizeDp) {
                 items(list, key = { it }) {
-                    val height = when (it) {
-                        0 -> itemSize2Dp
-                        8 -> itemSize3Dp
-                        else -> {
-                            if (it % 2 == 0) itemSizeDp else itemSize3Dp / 2
+                    val height =
+                        when (it) {
+                            0 -> itemSize2Dp
+                            8 -> itemSize3Dp
+                            else -> {
+                                if (it % 2 == 0) itemSizeDp else itemSize3Dp / 2
+                            }
                         }
-                    }
                     Item(it, size = height)
                 }
             }
@@ -836,9 +741,7 @@
             5 to AxisOffset(itemSize, line0Size + line1Size),
         )
 
-        rule.runOnUiThread {
-            list = listOf(0, 1, 8, 3, 4, 5, 6, 7, 2, 9, 10, 11)
-        }
+        rule.runOnUiThread { list = listOf(0, 1, 8, 3, 4, 5, 6, 7, 2, 9, 10, 11) }
 
         val afterLastVisibleItem = itemSize2 + itemSize3 + itemSize
         onAnimationFrame { fraction ->
@@ -846,41 +749,39 @@
             val startItem8Offset = gridSize
             val endItem2Offset = afterLastVisibleItem
             val line4Size = itemSize3
-            val item2Offset =
-                line0Size + (endItem2Offset - line0Size) * fraction
-            val item8Offset =
-                startItem8Offset - (startItem8Offset - line0Size) * fraction
-            val expected = mutableListOf<Pair<Any, Offset>>().apply {
-                add(0 to AxisOffset(0f, 0f))
-                add(1 to AxisOffset(itemSize, 0f))
-                if (item8Offset < gridSize) {
-                    add(8 to AxisOffset(0f, item8Offset))
-                } else {
-                    rule.onNodeWithTag("8").assertIsNotDisplayed()
-                }
-                add(3 to AxisOffset(itemSize, line0Size))
-                add(
-                    4 to AxisOffset(
-                        0f,
-                        line0Size + line1Size - (line1Size - line4Size) * fraction
+            val item2Offset = line0Size + (endItem2Offset - line0Size) * fraction
+            val item8Offset = startItem8Offset - (startItem8Offset - line0Size) * fraction
+            val expected =
+                mutableListOf<Pair<Any, Offset>>().apply {
+                    add(0 to AxisOffset(0f, 0f))
+                    add(1 to AxisOffset(itemSize, 0f))
+                    if (item8Offset < gridSize) {
+                        add(8 to AxisOffset(0f, item8Offset))
+                    } else {
+                        rule.onNodeWithTag("8").assertIsNotDisplayed()
+                    }
+                    add(3 to AxisOffset(itemSize, line0Size))
+                    add(
+                        4 to
+                            AxisOffset(
+                                0f,
+                                line0Size + line1Size - (line1Size - line4Size) * fraction
+                            )
                     )
-                )
-                add(
-                    5 to AxisOffset(
-                        itemSize,
-                        line0Size + line1Size - (line1Size - line4Size) * fraction
+                    add(
+                        5 to
+                            AxisOffset(
+                                itemSize,
+                                line0Size + line1Size - (line1Size - line4Size) * fraction
+                            )
                     )
-                )
-                if (item2Offset < afterLastVisibleItem) {
-                    add(2 to AxisOffset(0f, item2Offset))
-                } else {
-                    rule.onNodeWithTag("2").assertIsNotDisplayed()
+                    if (item2Offset < afterLastVisibleItem) {
+                        add(2 to AxisOffset(0f, item2Offset))
+                    } else {
+                        rule.onNodeWithTag("2").assertIsNotDisplayed()
+                    }
                 }
-            }
-            assertPositions(
-                expected = expected.toTypedArray(),
-                fraction = fraction
-            )
+            assertPositions(expected = expected.toTypedArray(), fraction = fraction)
         }
     }
 
@@ -946,7 +847,8 @@
     //             items(1) {
     //                 listOf(1, 2, 3).forEach {
     //                     val crossAxisSize =
-    //                         if (it == 1) itemSizeDp else if (it == 2) itemSize2Dp else itemSize3Dp
+    //                         if (it == 1) itemSizeDp else if (it == 2) itemSize2Dp else
+    // itemSize3Dp
     //                     Item(it, crossAxisSize = crossAxisSize)
     //                 }
     //             }
@@ -988,7 +890,8 @@
     //             ) {
     //                 items(listOf(1, 2, 3), key = { it }) {
     //                     val crossAxisSize =
-    //                         if (it == 1) itemSizeDp else if (it == 2) itemSize2Dp else itemSize3Dp
+    //                         if (it == 1) itemSizeDp else if (it == 2) itemSize2Dp else
+    // itemSize3Dp
     //                     Item(it, crossAxisSize = crossAxisSize)
     //                 }
     //             }
@@ -1031,14 +934,11 @@
         var list by mutableStateOf(listOf(0, 1, 2, 3, 4))
         val rawStartPadding = 8f
         val rawEndPadding = 12f
-        val (startPaddingDp, endPaddingDp) = with(rule.density) {
-            rawStartPadding.toDp() to rawEndPadding.toDp()
-        }
+        val (startPaddingDp, endPaddingDp) =
+            with(rule.density) { rawStartPadding.toDp() to rawEndPadding.toDp() }
         rule.setContent {
             LazyGrid(1, startPadding = startPaddingDp, endPadding = endPaddingDp) {
-                items(list, key = { it }) {
-                    Item(it)
-                }
+                items(list, key = { it }) { Item(it) }
             }
         }
 
@@ -1051,29 +951,15 @@
             4 to AxisOffset(0f, startPadding + itemSize * 4),
         )
 
-        rule.runOnUiThread {
-            list = listOf(0, 2, 3, 4, 1)
-        }
+        rule.runOnUiThread { list = listOf(0, 2, 3, 4, 1) }
 
         onAnimationFrame { fraction ->
             assertPositions(
                 0 to AxisOffset(0f, startPadding),
-                1 to AxisOffset(
-                    0f,
-                    startPadding + itemSize + itemSize * 3 * fraction
-                ),
-                2 to AxisOffset(
-                    0f,
-                    startPadding + itemSize * 2 - itemSize * fraction
-                ),
-                3 to AxisOffset(
-                    0f,
-                    startPadding + itemSize * 3 - itemSize * fraction
-                ),
-                4 to AxisOffset(
-                    0f,
-                    startPadding + itemSize * 4 - itemSize * fraction
-                ),
+                1 to AxisOffset(0f, startPadding + itemSize + itemSize * 3 * fraction),
+                2 to AxisOffset(0f, startPadding + itemSize * 2 - itemSize * fraction),
+                3 to AxisOffset(0f, startPadding + itemSize * 3 - itemSize * fraction),
+                4 to AxisOffset(0f, startPadding + itemSize * 4 - itemSize * fraction),
                 fraction = fraction
             )
         }
@@ -1085,22 +971,11 @@
 
         var measurePasses = 0
         rule.setContent {
-            LazyGrid(1) {
-                items(list, key = { it }) {
-                    Item(it)
-                }
-            }
-            LaunchedEffect(Unit) {
-                snapshotFlow { state.layoutInfo }
-                    .collect {
-                        measurePasses++
-                    }
-            }
+            LazyGrid(1) { items(list, key = { it }) { Item(it) } }
+            LaunchedEffect(Unit) { snapshotFlow { state.layoutInfo }.collect { measurePasses++ } }
         }
 
-        rule.runOnUiThread {
-            list = listOf(4, 1, 2, 3, 0)
-        }
+        rule.runOnUiThread { list = listOf(4, 1, 2, 3, 0) }
 
         var startMeasurePasses = Int.MIN_VALUE
         onAnimationFrame { fraction ->
@@ -1119,17 +994,11 @@
     fun noAnimationWhenScrolledToOtherPosition() {
         rule.setContent {
             LazyGrid(1, maxSize = itemSizeDp * 3) {
-                items(listOf(0, 1, 2, 3, 4, 5, 6, 7), key = { it }) {
-                    Item(it)
-                }
+                items(listOf(0, 1, 2, 3, 4, 5, 6, 7), key = { it }) { Item(it) }
             }
         }
 
-        rule.runOnUiThread {
-            runBlocking {
-                state.scrollToItem(0, (itemSize / 2).roundToInt())
-            }
-        }
+        rule.runOnUiThread { runBlocking { state.scrollToItem(0, (itemSize / 2).roundToInt()) } }
 
         onAnimationFrame { fraction ->
             assertPositions(
@@ -1146,17 +1015,11 @@
     fun noAnimationWhenScrollForwardBySmallOffset() {
         rule.setContent {
             LazyGrid(1, maxSize = itemSizeDp * 3) {
-                items(listOf(0, 1, 2, 3, 4, 5, 6, 7), key = { it }) {
-                    Item(it)
-                }
+                items(listOf(0, 1, 2, 3, 4, 5, 6, 7), key = { it }) { Item(it) }
             }
         }
 
-        rule.runOnUiThread {
-            runBlocking {
-                state.scrollBy(itemSize / 2f)
-            }
-        }
+        rule.runOnUiThread { runBlocking { state.scrollBy(itemSize / 2f) } }
 
         onAnimationFrame { fraction ->
             assertPositions(
@@ -1173,17 +1036,11 @@
     fun noAnimationWhenScrollBackwardBySmallOffset() {
         rule.setContent {
             LazyGrid(1, maxSize = itemSizeDp * 3, startIndex = 2) {
-                items(listOf(0, 1, 2, 3, 4, 5, 6, 7), key = { it }) {
-                    Item(it)
-                }
+                items(listOf(0, 1, 2, 3, 4, 5, 6, 7), key = { it }) { Item(it) }
             }
         }
 
-        rule.runOnUiThread {
-            runBlocking {
-                state.scrollBy(-itemSize / 2f)
-            }
-        }
+        rule.runOnUiThread { runBlocking { state.scrollBy(-itemSize / 2f) } }
 
         onAnimationFrame { fraction ->
             assertPositions(
@@ -1200,17 +1057,11 @@
     fun noAnimationWhenScrollForwardByLargeOffset() {
         rule.setContent {
             LazyGrid(1, maxSize = itemSizeDp * 3) {
-                items(listOf(0, 1, 2, 3, 4, 5, 6, 7), key = { it }) {
-                    Item(it)
-                }
+                items(listOf(0, 1, 2, 3, 4, 5, 6, 7), key = { it }) { Item(it) }
             }
         }
 
-        rule.runOnUiThread {
-            runBlocking {
-                state.scrollBy(itemSize * 2.5f)
-            }
-        }
+        rule.runOnUiThread { runBlocking { state.scrollBy(itemSize * 2.5f) } }
 
         onAnimationFrame { fraction ->
             assertPositions(
@@ -1227,17 +1078,11 @@
     fun noAnimationWhenScrollBackwardByLargeOffset() {
         rule.setContent {
             LazyGrid(1, maxSize = itemSizeDp * 3, startIndex = 3) {
-                items(listOf(0, 1, 2, 3, 4, 5, 6, 7), key = { it }) {
-                    Item(it)
-                }
+                items(listOf(0, 1, 2, 3, 4, 5, 6, 7), key = { it }) { Item(it) }
             }
         }
 
-        rule.runOnUiThread {
-            runBlocking {
-                state.scrollBy(-itemSize * 2.5f)
-            }
-        }
+        rule.runOnUiThread { runBlocking { state.scrollBy(-itemSize * 2.5f) } }
 
         onAnimationFrame { fraction ->
             assertPositions(
@@ -1260,11 +1105,7 @@
             }
         }
 
-        rule.runOnUiThread {
-            runBlocking {
-                state.scrollBy(itemSize + itemSize2 + itemSize / 2f)
-            }
-        }
+        rule.runOnUiThread { runBlocking { state.scrollBy(itemSize + itemSize2 + itemSize / 2f) } }
 
         onAnimationFrame { fraction ->
             assertPositions(
@@ -1288,9 +1129,7 @@
         }
 
         rule.runOnUiThread {
-            runBlocking {
-                state.scrollBy(-(itemSize + itemSize2 + itemSize / 2f))
-            }
+            runBlocking { state.scrollBy(-(itemSize + itemSize2 + itemSize / 2f)) }
         }
 
         onAnimationFrame { fraction ->
@@ -1308,9 +1147,7 @@
     fun noAnimationWhenScrollForwardByLargeOffset_multipleCells() {
         rule.setContent {
             LazyGrid(3, maxSize = itemSizeDp * 2) {
-                items(List(20) { it }, key = { it }) {
-                    Item(it)
-                }
+                items(List(20) { it }, key = { it }) { Item(it) }
             }
         }
 
@@ -1323,11 +1160,7 @@
             5 to AxisOffset(itemSize * 2, itemSize)
         )
 
-        rule.runOnUiThread {
-            runBlocking {
-                state.scrollBy(itemSize * 2.5f)
-            }
-        }
+        rule.runOnUiThread { runBlocking { state.scrollBy(itemSize * 2.5f) } }
 
         onAnimationFrame { fraction ->
             assertPositions(
@@ -1349,9 +1182,7 @@
     fun noAnimationWhenScrollBackwardByLargeOffset_multipleCells() {
         rule.setContent {
             LazyGrid(3, maxSize = itemSizeDp * 2, startIndex = 9) {
-                items(List(20) { it }, key = { it }) {
-                    Item(it)
-                }
+                items(List(20) { it }, key = { it }) { Item(it) }
             }
         }
 
@@ -1364,11 +1195,7 @@
             14 to AxisOffset(itemSize * 2, itemSize)
         )
 
-        rule.runOnUiThread {
-            runBlocking {
-                state.scrollBy(-itemSize * 2.5f)
-            }
-        }
+        rule.runOnUiThread { runBlocking { state.scrollBy(-itemSize * 2.5f) } }
 
         onAnimationFrame { fraction ->
             assertPositions(
@@ -1409,11 +1236,7 @@
             5 to AxisOffset(itemSize * 2, itemSize)
         )
 
-        rule.runOnUiThread {
-            runBlocking {
-                state.scrollBy(itemSize * 2.5f)
-            }
-        }
+        rule.runOnUiThread { runBlocking { state.scrollBy(itemSize * 2.5f) } }
 
         onAnimationFrame { fraction ->
             assertPositions(
@@ -1451,11 +1274,7 @@
             11 to AxisOffset(itemSize * 2, itemSize)
         )
 
-        rule.runOnUiThread {
-            runBlocking {
-                state.scrollBy(-itemSize * 2.5f)
-            }
-        }
+        rule.runOnUiThread { runBlocking { state.scrollBy(-itemSize * 2.5f) } }
 
         onAnimationFrame { fraction ->
             assertPositions(
@@ -1480,11 +1299,13 @@
                     span = { GridItemSpan(if (it == 9) 3 else if (it == 10) 2 else 1) }
                 ) {
                     Item(
-                        it, size = when (it) {
-                            in 6..8 -> itemSize2Dp
-                            9 -> itemSize3Dp
-                            else -> itemSizeDp
-                        }
+                        it,
+                        size =
+                            when (it) {
+                                in 6..8 -> itemSize2Dp
+                                9 -> itemSize3Dp
+                                else -> itemSizeDp
+                            }
                     )
                 }
             }
@@ -1499,11 +1320,7 @@
             5 to AxisOffset(itemSize * 2, itemSize)
         )
 
-        rule.runOnUiThread {
-            runBlocking {
-                state.scrollBy(itemSize * 2.5f)
-            }
-        }
+        rule.runOnUiThread { runBlocking { state.scrollBy(itemSize * 2.5f) } }
 
         onAnimationFrame { fraction ->
             val startOffset = -itemSize / 2
@@ -1529,11 +1346,13 @@
                     span = { GridItemSpan(if (it == 3) 3 else if (it == 4) 2 else 1) }
                 ) {
                     Item(
-                        it, size = when (it) {
-                            in 0..2 -> itemSize2Dp
-                            3 -> itemSize3Dp
-                            else -> itemSizeDp
-                        }
+                        it,
+                        size =
+                            when (it) {
+                                in 0..2 -> itemSize2Dp
+                                3 -> itemSize3Dp
+                                else -> itemSizeDp
+                            }
                     )
                 }
             }
@@ -1549,9 +1368,7 @@
         )
 
         rule.runOnUiThread {
-            runBlocking {
-                state.scrollBy(-itemSize - itemSize3 - itemSize2 / 2f)
-            }
+            runBlocking { state.scrollBy(-itemSize - itemSize3 - itemSize2 / 2f) }
         }
 
         onAnimationFrame { fraction ->
@@ -1574,11 +1391,7 @@
         val gridSize = itemSize * 2
         val gridSizeDp = with(rule.density) { gridSize.toDp() }
         rule.setContent {
-            LazyGrid(2, maxSize = gridSizeDp) {
-                items(list, key = { it }) {
-                    Item(it)
-                }
-            }
+            LazyGrid(2, maxSize = gridSizeDp) { items(list, key = { it }) { Item(it) } }
         }
 
         assertLayoutInfoPositions(
@@ -1588,33 +1401,24 @@
             3 to AxisOffset(itemSize, itemSize)
         )
 
-        rule.runOnUiThread {
-            list = listOf(0, 2, 4, 6)
-        }
+        rule.runOnUiThread { list = listOf(0, 2, 4, 6) }
 
         onAnimationFrame { fraction ->
-            val expected = mutableListOf<Pair<Any, Offset>>().apply {
-                add(0 to AxisOffset(0f, 0f))
-                add(
-                    2 to AxisOffset(
-                        itemSize * fraction,
-                        itemSize * (1f - fraction)
-                    )
-                )
-                val item4and6MainAxis = gridSize - (gridSize - itemSize) * fraction
-                if (item4and6MainAxis < gridSize) {
-                    add(4 to AxisOffset(0f, item4and6MainAxis))
-                    add(6 to AxisOffset(itemSize, item4and6MainAxis))
-                } else {
-                    rule.onNodeWithTag("4").assertIsNotDisplayed()
-                    rule.onNodeWithTag("6").assertIsNotDisplayed()
+            val expected =
+                mutableListOf<Pair<Any, Offset>>().apply {
+                    add(0 to AxisOffset(0f, 0f))
+                    add(2 to AxisOffset(itemSize * fraction, itemSize * (1f - fraction)))
+                    val item4and6MainAxis = gridSize - (gridSize - itemSize) * fraction
+                    if (item4and6MainAxis < gridSize) {
+                        add(4 to AxisOffset(0f, item4and6MainAxis))
+                        add(6 to AxisOffset(itemSize, item4and6MainAxis))
+                    } else {
+                        rule.onNodeWithTag("4").assertIsNotDisplayed()
+                        rule.onNodeWithTag("6").assertIsNotDisplayed()
+                    }
                 }
-            }
 
-            assertPositions(
-                expected = expected.toTypedArray(),
-                fraction = fraction
-            )
+            assertPositions(expected = expected.toTypedArray(), fraction = fraction)
         }
     }
 
@@ -1625,9 +1429,11 @@
         val gridSizeDp = with(rule.density) { gridSize.toDp() }
         rule.setContent {
             LazyGrid(2, maxSize = gridSizeDp) {
-                items(list, key = { it }, span = {
-                    GridItemSpan(if (it == 6) maxLineSpan else 1)
-                }) {
+                items(
+                    list,
+                    key = { it },
+                    span = { GridItemSpan(if (it == 6) maxLineSpan else 1) }
+                ) {
                     Item(it)
                 }
             }
@@ -1640,35 +1446,27 @@
             3 to AxisOffset(itemSize, itemSize)
         )
 
-        rule.runOnUiThread {
-            list = listOf(0, 4, 6)
-        }
+        rule.runOnUiThread { list = listOf(0, 4, 6) }
 
         onAnimationFrame { fraction ->
-            val expected = mutableListOf<Pair<Any, Offset>>().apply {
-                add(0 to AxisOffset(0f, 0f))
-                val item4MainAxis = gridSize - gridSize * fraction
-                if (item4MainAxis < gridSize) {
-                    add(
-                        4 to AxisOffset(itemSize, item4MainAxis)
-                    )
-                } else {
-                    rule.onNodeWithTag("4").assertIsNotDisplayed()
+            val expected =
+                mutableListOf<Pair<Any, Offset>>().apply {
+                    add(0 to AxisOffset(0f, 0f))
+                    val item4MainAxis = gridSize - gridSize * fraction
+                    if (item4MainAxis < gridSize) {
+                        add(4 to AxisOffset(itemSize, item4MainAxis))
+                    } else {
+                        rule.onNodeWithTag("4").assertIsNotDisplayed()
+                    }
+                    val item6MainAxis = gridSize + itemSize - gridSize * fraction
+                    if (item6MainAxis < gridSize) {
+                        add(6 to AxisOffset(0f, item6MainAxis))
+                    } else {
+                        rule.onNodeWithTag("6").assertIsNotDisplayed()
+                    }
                 }
-                val item6MainAxis = gridSize + itemSize - gridSize * fraction
-                if (item6MainAxis < gridSize) {
-                    add(
-                        6 to AxisOffset(0f, item6MainAxis)
-                    )
-                } else {
-                    rule.onNodeWithTag("6").assertIsNotDisplayed()
-                }
-            }
 
-            assertPositions(
-                expected = expected.toTypedArray(),
-                fraction = fraction
-            )
+            assertPositions(expected = expected.toTypedArray(), fraction = fraction)
         }
     }
 
@@ -1679,31 +1477,25 @@
         val gridSizeDp = with(rule.density) { gridSize.toDp() }
         rule.setContent {
             LazyGrid(1, maxSize = gridSizeDp) {
-                items(list, key = { it }) {
-                    Item(it, animSpec = if (it == 1) AnimSpec else null)
-                }
+                items(list, key = { it }) { Item(it, animSpec = if (it == 1) AnimSpec else null) }
             }
         }
 
-        rule.runOnUiThread {
-            list = listOf(0, 2, 3, 1)
-        }
+        rule.runOnUiThread { list = listOf(0, 2, 3, 1) }
 
         onAnimationFrame { fraction ->
             // item 1 moves to `gridSize`
             val item1Offset = itemSize + (gridSize - itemSize) * fraction
-            val expected = mutableListOf<Pair<Any, Offset>>().apply {
-                add(0 to AxisOffset(0f, 0f))
-                if (item1Offset < gridSize) {
-                    add(1 to AxisOffset(0f, item1Offset))
-                } else {
-                    rule.onNodeWithTag("1").assertIsNotDisplayed()
+            val expected =
+                mutableListOf<Pair<Any, Offset>>().apply {
+                    add(0 to AxisOffset(0f, 0f))
+                    if (item1Offset < gridSize) {
+                        add(1 to AxisOffset(0f, item1Offset))
+                    } else {
+                        rule.onNodeWithTag("1").assertIsNotDisplayed()
+                    }
                 }
-            }
-            assertPositions(
-                expected = expected.toTypedArray(),
-                fraction = fraction
-            )
+            assertPositions(expected = expected.toTypedArray(), fraction = fraction)
         }
     }
 
@@ -1712,9 +1504,7 @@
         var list by mutableStateOf(listOf(0, 1, 2, 3, 4, 5))
         rule.setContent {
             LazyGrid(1, maxSize = itemSizeDp * 3f, startIndex = 3) {
-                items(list, key = { it }) {
-                    Item(it)
-                }
+                items(list, key = { it }) { Item(it) }
             }
         }
 
@@ -1724,9 +1514,7 @@
             5 to AxisOffset(0f, itemSize * 2)
         )
 
-        rule.runOnUiThread {
-            list = listOf(0, 4, 5, 3, 1, 2)
-        }
+        rule.runOnUiThread { list = listOf(0, 4, 5, 3, 1, 2) }
 
         onAnimationFrame { fraction ->
             // item 2 moves from and item 5 moves to `-itemSize`, right before the start edge
@@ -1735,33 +1523,31 @@
             // item 1 moves from and item 4 moves to `-itemSize * 2`, right before item 2
             val item1Offset = -itemSize * 2 + itemSize * 3 * fraction
             val item4Offset = itemSize - itemSize * 3 * fraction
-            val expected = mutableListOf<Pair<Any, Offset>>().apply {
-                if (item1Offset > -itemSize) {
-                    add(1 to AxisOffset(0f, item1Offset))
-                } else {
-                    rule.onNodeWithTag("1").assertIsNotDisplayed()
+            val expected =
+                mutableListOf<Pair<Any, Offset>>().apply {
+                    if (item1Offset > -itemSize) {
+                        add(1 to AxisOffset(0f, item1Offset))
+                    } else {
+                        rule.onNodeWithTag("1").assertIsNotDisplayed()
+                    }
+                    if (item2Offset > -itemSize) {
+                        add(2 to AxisOffset(0f, item2Offset))
+                    } else {
+                        rule.onNodeWithTag("2").assertIsNotDisplayed()
+                    }
+                    add(3 to AxisOffset(0f, 0f))
+                    if (item4Offset > -itemSize) {
+                        add(4 to AxisOffset(0f, item4Offset))
+                    } else {
+                        rule.onNodeWithTag("4").assertIsNotDisplayed()
+                    }
+                    if (item5Offset > -itemSize) {
+                        add(5 to AxisOffset(0f, item5Offset))
+                    } else {
+                        rule.onNodeWithTag("5").assertIsNotDisplayed()
+                    }
                 }
-                if (item2Offset > -itemSize) {
-                    add(2 to AxisOffset(0f, item2Offset))
-                } else {
-                    rule.onNodeWithTag("2").assertIsNotDisplayed()
-                }
-                add(3 to AxisOffset(0f, 0f))
-                if (item4Offset > -itemSize) {
-                    add(4 to AxisOffset(0f, item4Offset))
-                } else {
-                    rule.onNodeWithTag("4").assertIsNotDisplayed()
-                }
-                if (item5Offset > -itemSize) {
-                    add(5 to AxisOffset(0f, item5Offset))
-                } else {
-                    rule.onNodeWithTag("5").assertIsNotDisplayed()
-                }
-            }
-            assertPositions(
-                expected = expected.toTypedArray(),
-                fraction = fraction
-            )
+            assertPositions(expected = expected.toTypedArray(), fraction = fraction)
         }
     }
 
@@ -1770,9 +1556,7 @@
         var list by mutableStateOf(listOf(0, 1, 2, 3, 4, 5))
         rule.setContent {
             LazyGrid(1, maxSize = itemSizeDp * 3f, startIndex = 3) {
-                items(list, key = { it }) {
-                    Item(it)
-                }
+                items(list, key = { it }) { Item(it) }
             }
         }
 
@@ -1782,9 +1566,7 @@
             5 to AxisOffset(0f, itemSize * 2)
         )
 
-        rule.runOnUiThread {
-            list = listOf(0, 5, 4, 3, 2, 1)
-        }
+        rule.runOnUiThread { list = listOf(0, 5, 4, 3, 2, 1) }
 
         onAnimationFrame { fraction ->
             // item 2 moves from and item 4 moves to `-itemSize`, right before the start edge
@@ -1793,33 +1575,31 @@
             // item 1 moves from and item 5 moves to `-itemSize * 2`, right before item 2
             val item1Offset = -itemSize * 2 + itemSize * 4 * fraction
             val item5Offset = itemSize * 2 - itemSize * 4 * fraction
-            val expected = mutableListOf<Pair<Any, Offset>>().apply {
-                if (item1Offset > -itemSize) {
-                    add(1 to AxisOffset(0f, item1Offset))
-                } else {
-                    rule.onNodeWithTag("1").assertIsNotDisplayed()
+            val expected =
+                mutableListOf<Pair<Any, Offset>>().apply {
+                    if (item1Offset > -itemSize) {
+                        add(1 to AxisOffset(0f, item1Offset))
+                    } else {
+                        rule.onNodeWithTag("1").assertIsNotDisplayed()
+                    }
+                    if (item2Offset > -itemSize) {
+                        add(2 to AxisOffset(0f, item2Offset))
+                    } else {
+                        rule.onNodeWithTag("2").assertIsNotDisplayed()
+                    }
+                    add(3 to AxisOffset(0f, 0f))
+                    if (item4Offset > -itemSize) {
+                        add(4 to AxisOffset(0f, item4Offset))
+                    } else {
+                        rule.onNodeWithTag("4").assertIsNotDisplayed()
+                    }
+                    if (item5Offset > -itemSize) {
+                        add(5 to AxisOffset(0f, item5Offset))
+                    } else {
+                        rule.onNodeWithTag("5").assertIsNotDisplayed()
+                    }
                 }
-                if (item2Offset > -itemSize) {
-                    add(2 to AxisOffset(0f, item2Offset))
-                } else {
-                    rule.onNodeWithTag("2").assertIsNotDisplayed()
-                }
-                add(3 to AxisOffset(0f, 0f))
-                if (item4Offset > -itemSize) {
-                    add(4 to AxisOffset(0f, item4Offset))
-                } else {
-                    rule.onNodeWithTag("4").assertIsNotDisplayed()
-                }
-                if (item5Offset > -itemSize) {
-                    add(5 to AxisOffset(0f, item5Offset))
-                } else {
-                    rule.onNodeWithTag("5").assertIsNotDisplayed()
-                }
-            }
-            assertPositions(
-                expected = expected.toTypedArray(),
-                fraction = fraction
-            )
+            assertPositions(expected = expected.toTypedArray(), fraction = fraction)
         }
     }
 
@@ -1828,9 +1608,7 @@
         var list by mutableStateOf(listOf(0, 1, 2, 3, 4, 5))
         rule.setContent {
             LazyGrid(2, maxSize = itemSizeDp * 2f, startIndex = 3) {
-                items(list, key = { it }) {
-                    Item(it)
-                }
+                items(list, key = { it }) { Item(it) }
             }
         }
 
@@ -1841,37 +1619,33 @@
             5 to AxisOffset(itemSize, itemSize)
         )
 
-        rule.runOnUiThread {
-            list = listOf(4, 5, 2, 3, 0, 1)
-        }
+        rule.runOnUiThread { list = listOf(4, 5, 2, 3, 0, 1) }
 
         onAnimationFrame { fraction ->
             // items 0 and 2 moves from and items 4 and 5 moves to `-itemSize`,
             // right before the start edge
             val items0and1Offset = -itemSize + itemSize * 2 * fraction
             val items4and5Offset = itemSize - itemSize * 2 * fraction
-            val expected = mutableListOf<Pair<Any, Offset>>().apply {
-                if (items0and1Offset > -itemSize) {
-                    add(0 to AxisOffset(0f, items0and1Offset))
-                    add(1 to AxisOffset(itemSize, items0and1Offset))
-                } else {
-                    rule.onNodeWithTag("0").assertIsNotDisplayed()
-                    rule.onNodeWithTag("1").assertIsNotDisplayed()
+            val expected =
+                mutableListOf<Pair<Any, Offset>>().apply {
+                    if (items0and1Offset > -itemSize) {
+                        add(0 to AxisOffset(0f, items0and1Offset))
+                        add(1 to AxisOffset(itemSize, items0and1Offset))
+                    } else {
+                        rule.onNodeWithTag("0").assertIsNotDisplayed()
+                        rule.onNodeWithTag("1").assertIsNotDisplayed()
+                    }
+                    add(2 to AxisOffset(0f, 0f))
+                    add(3 to AxisOffset(itemSize, 0f))
+                    if (items4and5Offset > -itemSize) {
+                        add(4 to AxisOffset(0f, items4and5Offset))
+                        add(5 to AxisOffset(itemSize, items4and5Offset))
+                    } else {
+                        rule.onNodeWithTag("4").assertIsNotDisplayed()
+                        rule.onNodeWithTag("5").assertIsNotDisplayed()
+                    }
                 }
-                add(2 to AxisOffset(0f, 0f))
-                add(3 to AxisOffset(itemSize, 0f))
-                if (items4and5Offset > -itemSize) {
-                    add(4 to AxisOffset(0f, items4and5Offset))
-                    add(5 to AxisOffset(itemSize, items4and5Offset))
-                } else {
-                    rule.onNodeWithTag("4").assertIsNotDisplayed()
-                    rule.onNodeWithTag("5").assertIsNotDisplayed()
-                }
-            }
-            assertPositions(
-                expected = expected.toTypedArray(),
-                fraction = fraction
-            )
+            assertPositions(expected = expected.toTypedArray(), fraction = fraction)
         }
     }
 
@@ -1881,11 +1655,7 @@
         val gridSize = itemSize * 3
         val gridSizeDp = with(rule.density) { gridSize.toDp() }
         rule.setContent {
-            LazyGrid(1, maxSize = gridSizeDp) {
-                items(list, key = { it }) {
-                    Item(it)
-                }
-            }
+            LazyGrid(1, maxSize = gridSizeDp) { items(list, key = { it }) { Item(it) } }
         }
 
         assertPositions(
@@ -1894,9 +1664,7 @@
             2 to AxisOffset(0f, itemSize * 2)
         )
 
-        rule.runOnUiThread {
-            list = listOf(0, 3, 4, 1, 2)
-        }
+        rule.runOnUiThread { list = listOf(0, 3, 4, 1, 2) }
 
         onAnimationFrame { fraction ->
             // item 1 moves to and item 3 moves from `gridSize`, right after the end edge
@@ -1905,33 +1673,31 @@
             // item 2 moves to and item 4 moves from `gridSize + itemSize`, right after item 4
             val item2Offset = itemSize * 2 + (gridSize - itemSize) * fraction
             val item4Offset = gridSize + itemSize - (gridSize - itemSize) * fraction
-            val expected = mutableListOf<Pair<Any, Offset>>().apply {
-                add(0 to AxisOffset(0f, 0f))
-                if (item1Offset < gridSize) {
-                    add(1 to AxisOffset(0f, item1Offset))
-                } else {
-                    rule.onNodeWithTag("1").assertIsNotDisplayed()
+            val expected =
+                mutableListOf<Pair<Any, Offset>>().apply {
+                    add(0 to AxisOffset(0f, 0f))
+                    if (item1Offset < gridSize) {
+                        add(1 to AxisOffset(0f, item1Offset))
+                    } else {
+                        rule.onNodeWithTag("1").assertIsNotDisplayed()
+                    }
+                    if (item2Offset < gridSize) {
+                        add(2 to AxisOffset(0f, item2Offset))
+                    } else {
+                        rule.onNodeWithTag("2").assertIsNotDisplayed()
+                    }
+                    if (item3Offset < gridSize) {
+                        add(3 to AxisOffset(0f, item3Offset))
+                    } else {
+                        rule.onNodeWithTag("3").assertIsNotDisplayed()
+                    }
+                    if (item4Offset < gridSize) {
+                        add(4 to AxisOffset(0f, item4Offset))
+                    } else {
+                        rule.onNodeWithTag("4").assertIsNotDisplayed()
+                    }
                 }
-                if (item2Offset < gridSize) {
-                    add(2 to AxisOffset(0f, item2Offset))
-                } else {
-                    rule.onNodeWithTag("2").assertIsNotDisplayed()
-                }
-                if (item3Offset < gridSize) {
-                    add(3 to AxisOffset(0f, item3Offset))
-                } else {
-                    rule.onNodeWithTag("3").assertIsNotDisplayed()
-                }
-                if (item4Offset < gridSize) {
-                    add(4 to AxisOffset(0f, item4Offset))
-                } else {
-                    rule.onNodeWithTag("4").assertIsNotDisplayed()
-                }
-            }
-            assertPositions(
-                expected = expected.toTypedArray(),
-                fraction = fraction
-            )
+            assertPositions(expected = expected.toTypedArray(), fraction = fraction)
         }
     }
 
@@ -1941,11 +1707,7 @@
         val gridSize = itemSize * 3
         val gridSizeDp = with(rule.density) { gridSize.toDp() }
         rule.setContent {
-            LazyGrid(1, maxSize = gridSizeDp) {
-                items(list, key = { it }) {
-                    Item(it)
-                }
-            }
+            LazyGrid(1, maxSize = gridSizeDp) { items(list, key = { it }) { Item(it) } }
         }
 
         assertPositions(
@@ -1954,9 +1716,7 @@
             2 to AxisOffset(0f, itemSize * 2)
         )
 
-        rule.runOnUiThread {
-            list = listOf(0, 4, 3, 2, 1)
-        }
+        rule.runOnUiThread { list = listOf(0, 4, 3, 2, 1) }
 
         onAnimationFrame { fraction ->
             // item 2 moves to and item 3 moves from `gridSize`, right after the end edge
@@ -1964,35 +1724,32 @@
             val item3Offset = gridSize - (gridSize - itemSize * 2) * fraction
             // item 1 moves to and item 4 moves from `gridSize + itemSize`, right after item 4
             val item1Offset = itemSize + (gridSize + itemSize - itemSize) * fraction
-            val item4Offset =
-                gridSize + itemSize - (gridSize + itemSize - itemSize) * fraction
-            val expected = mutableListOf<Pair<Any, Offset>>().apply {
-                add(0 to AxisOffset(0f, 0f))
-                if (item1Offset < gridSize) {
-                    add(1 to AxisOffset(0f, item1Offset))
-                } else {
-                    rule.onNodeWithTag("1").assertIsNotDisplayed()
+            val item4Offset = gridSize + itemSize - (gridSize + itemSize - itemSize) * fraction
+            val expected =
+                mutableListOf<Pair<Any, Offset>>().apply {
+                    add(0 to AxisOffset(0f, 0f))
+                    if (item1Offset < gridSize) {
+                        add(1 to AxisOffset(0f, item1Offset))
+                    } else {
+                        rule.onNodeWithTag("1").assertIsNotDisplayed()
+                    }
+                    if (item2Offset < gridSize) {
+                        add(2 to AxisOffset(0f, item2Offset))
+                    } else {
+                        rule.onNodeWithTag("2").assertIsNotDisplayed()
+                    }
+                    if (item3Offset < gridSize) {
+                        add(3 to AxisOffset(0f, item3Offset))
+                    } else {
+                        rule.onNodeWithTag("3").assertIsNotDisplayed()
+                    }
+                    if (item4Offset < gridSize) {
+                        add(4 to AxisOffset(0f, item4Offset))
+                    } else {
+                        rule.onNodeWithTag("4").assertIsNotDisplayed()
+                    }
                 }
-                if (item2Offset < gridSize) {
-                    add(2 to AxisOffset(0f, item2Offset))
-                } else {
-                    rule.onNodeWithTag("2").assertIsNotDisplayed()
-                }
-                if (item3Offset < gridSize) {
-                    add(3 to AxisOffset(0f, item3Offset))
-                } else {
-                    rule.onNodeWithTag("3").assertIsNotDisplayed()
-                }
-                if (item4Offset < gridSize) {
-                    add(4 to AxisOffset(0f, item4Offset))
-                } else {
-                    rule.onNodeWithTag("4").assertIsNotDisplayed()
-                }
-            }
-            assertPositions(
-                expected = expected.toTypedArray(),
-                fraction = fraction
-            )
+            assertPositions(expected = expected.toTypedArray(), fraction = fraction)
         }
     }
 
@@ -2002,11 +1759,7 @@
         val gridSize = itemSize * 2
         val gridSizeDp = with(rule.density) { gridSize.toDp() }
         rule.setContent {
-            LazyGrid(2, maxSize = gridSizeDp) {
-                items(list, key = { it }) {
-                    Item(it)
-                }
-            }
+            LazyGrid(2, maxSize = gridSizeDp) { items(list, key = { it }) { Item(it) } }
         }
 
         assertPositions(
@@ -2016,37 +1769,33 @@
             3 to AxisOffset(itemSize, itemSize)
         )
 
-        rule.runOnUiThread {
-            list = listOf(0, 1, 4, 5, 2, 3)
-        }
+        rule.runOnUiThread { list = listOf(0, 1, 4, 5, 2, 3) }
 
         onAnimationFrame { fraction ->
             // items 4 and 5 moves from and items 2 and 3 moves to `gridSize`,
             // right before the start edge
             val items4and5Offset = gridSize - (gridSize - itemSize) * fraction
             val items2and3Offset = itemSize + (gridSize - itemSize) * fraction
-            val expected = mutableListOf<Pair<Any, Offset>>().apply {
-                add(0 to AxisOffset(0f, 0f))
-                add(1 to AxisOffset(itemSize, 0f))
-                if (items2and3Offset < gridSize) {
-                    add(2 to AxisOffset(0f, items2and3Offset))
-                    add(3 to AxisOffset(itemSize, items2and3Offset))
-                } else {
-                    rule.onNodeWithTag("2").assertIsNotDisplayed()
-                    rule.onNodeWithTag("3").assertIsNotDisplayed()
+            val expected =
+                mutableListOf<Pair<Any, Offset>>().apply {
+                    add(0 to AxisOffset(0f, 0f))
+                    add(1 to AxisOffset(itemSize, 0f))
+                    if (items2and3Offset < gridSize) {
+                        add(2 to AxisOffset(0f, items2and3Offset))
+                        add(3 to AxisOffset(itemSize, items2and3Offset))
+                    } else {
+                        rule.onNodeWithTag("2").assertIsNotDisplayed()
+                        rule.onNodeWithTag("3").assertIsNotDisplayed()
+                    }
+                    if (items4and5Offset < gridSize) {
+                        add(4 to AxisOffset(0f, items4and5Offset))
+                        add(5 to AxisOffset(itemSize, items4and5Offset))
+                    } else {
+                        rule.onNodeWithTag("4").assertIsNotDisplayed()
+                        rule.onNodeWithTag("5").assertIsNotDisplayed()
+                    }
                 }
-                if (items4and5Offset < gridSize) {
-                    add(4 to AxisOffset(0f, items4and5Offset))
-                    add(5 to AxisOffset(itemSize, items4and5Offset))
-                } else {
-                    rule.onNodeWithTag("4").assertIsNotDisplayed()
-                    rule.onNodeWithTag("5").assertIsNotDisplayed()
-                }
-            }
-            assertPositions(
-                expected = expected.toTypedArray(),
-                fraction = fraction
-            )
+            assertPositions(expected = expected.toTypedArray(), fraction = fraction)
         }
     }
 
@@ -2054,16 +1803,10 @@
     fun noAnimationWhenParentSizeShrinks() {
         var size by mutableStateOf(itemSizeDp * 3)
         rule.setContent {
-            LazyGrid(1, maxSize = size) {
-                items(listOf(0, 1, 2), key = { it }) {
-                    Item(it)
-                }
-            }
+            LazyGrid(1, maxSize = size) { items(listOf(0, 1, 2), key = { it }) { Item(it) } }
         }
 
-        rule.runOnUiThread {
-            size = itemSizeDp * 2
-        }
+        rule.runOnUiThread { size = itemSizeDp * 2 }
 
         onAnimationFrame { fraction ->
             assertPositions(
@@ -2079,16 +1822,10 @@
     fun noAnimationWhenParentSizeExpands() {
         var size by mutableStateOf(itemSizeDp * 2)
         rule.setContent {
-            LazyGrid(1, maxSize = size) {
-                items(listOf(0, 1, 2), key = { it }) {
-                    Item(it)
-                }
-            }
+            LazyGrid(1, maxSize = size) { items(listOf(0, 1, 2), key = { it }) { Item(it) } }
         }
 
-        rule.runOnUiThread {
-            size = itemSizeDp * 3
-        }
+        rule.runOnUiThread { size = itemSizeDp * 3 }
 
         onAnimationFrame { fraction ->
             assertPositions(
@@ -2105,16 +1842,10 @@
         var list by mutableStateOf(listOf(0, 1, 2, 3))
         val scrollDelta = spacing
         rule.setContent {
-            LazyGrid(1, maxSize = itemSizeDp * 2) {
-                items(list, key = { it }) {
-                    Item(it)
-                }
-            }
+            LazyGrid(1, maxSize = itemSizeDp * 2) { items(list, key = { it }) { Item(it) } }
         }
 
-        rule.runOnUiThread {
-            list = listOf(0, 2, 1, 3)
-        }
+        rule.runOnUiThread { list = listOf(0, 2, 1, 3) }
 
         onAnimationFrame { fraction ->
             if (fraction == 0f) {
@@ -2124,9 +1855,7 @@
                     2 to AxisOffset(0f, itemSize * 2),
                     fraction = fraction
                 )
-                rule.runOnUiThread {
-                    runBlocking { state.scrollBy(scrollDelta) }
-                }
+                rule.runOnUiThread { runBlocking { state.scrollBy(scrollDelta) } }
             }
             assertPositions(
                 0 to AxisOffset(0f, -scrollDelta),
@@ -2144,16 +1873,10 @@
         val containerSizeDp = itemSizeDp * 2
         val containerSize = itemSize * 2
         rule.setContent {
-            LazyGrid(1, maxSize = containerSizeDp) {
-                items(list, key = { it }) {
-                    Item(it)
-                }
-            }
+            LazyGrid(1, maxSize = containerSizeDp) { items(list, key = { it }) { Item(it) } }
         }
 
-        rule.runOnUiThread {
-            list = listOf(0, 4, 2, 3, 1)
-        }
+        rule.runOnUiThread { list = listOf(0, 4, 2, 3, 1) }
 
         onAnimationFrame { fraction ->
             if (fraction == 0f) {
@@ -2162,9 +1885,7 @@
                     1 to AxisOffset(0f, itemSize),
                     fraction = fraction
                 )
-                rule.runOnUiThread {
-                    runBlocking { state.scrollBy(scrollDelta) }
-                }
+                rule.runOnUiThread { runBlocking { state.scrollBy(scrollDelta) } }
             }
             assertPositions(
                 0 to AxisOffset(0f, -scrollDelta),
@@ -2181,15 +1902,11 @@
         val containerSizeDp = itemSizeDp * 2
         rule.setContent {
             LazyGrid(1, maxSize = containerSizeDp, startIndex = 2) {
-                items(list, key = { it }) {
-                    Item(it)
-                }
+                items(list, key = { it }) { Item(it) }
             }
         }
 
-        rule.runOnUiThread {
-            list = listOf(3, 0, 1, 2, 4)
-        }
+        rule.runOnUiThread { list = listOf(3, 0, 1, 2, 4) }
 
         onAnimationFrame { fraction ->
             if (fraction == 0f) {
@@ -2198,9 +1915,7 @@
                     3 to AxisOffset(0f, itemSize),
                     fraction = fraction
                 )
-                rule.runOnUiThread {
-                    runBlocking { state.scrollBy(scrollDelta) }
-                }
+                rule.runOnUiThread { runBlocking { state.scrollBy(scrollDelta) } }
             }
             assertPositions(
                 2 to AxisOffset(0f, -scrollDelta),
@@ -2216,16 +1931,10 @@
         val containerSizeDp = itemSizeDp * 2
         val scrollDelta = spacing
         rule.setContent {
-            LazyGrid(1, maxSize = containerSizeDp) {
-                items(list, key = { it }) {
-                    Item(it)
-                }
-            }
+            LazyGrid(1, maxSize = containerSizeDp) { items(list, key = { it }) { Item(it) } }
         }
 
-        rule.runOnUiThread {
-            list = listOf(0, 4, 2, 3, 1)
-        }
+        rule.runOnUiThread { list = listOf(0, 4, 2, 3, 1) }
 
         onAnimationFrame { fraction ->
             if (fraction == 0f) {
@@ -2234,9 +1943,7 @@
                     1 to AxisOffset(0f, itemSize),
                     fraction = fraction
                 )
-                rule.runOnUiThread {
-                    runBlocking { state.scrollBy(itemSize * 2) }
-                }
+                rule.runOnUiThread { runBlocking { state.scrollBy(itemSize * 2) } }
                 assertPositions(
                     2 to AxisOffset(0f, 0f),
                     3 to AxisOffset(0f, itemSize),
@@ -2245,9 +1952,7 @@
                     1 to AxisOffset(0f, itemSize),
                     fraction = fraction
                 )
-                rule.runOnUiThread {
-                    runBlocking { state.scrollBy(scrollDelta) }
-                }
+                rule.runOnUiThread { runBlocking { state.scrollBy(scrollDelta) } }
                 assertPositions(
                     2 to AxisOffset(0f, 0f - scrollDelta),
                     3 to AxisOffset(0f, itemSize - scrollDelta),
@@ -2279,54 +1984,39 @@
             }
         }
 
-        rule.runOnUiThread {
-            item0Size = itemSize2Dp
-        }
+        rule.runOnUiThread { item0Size = itemSize2Dp }
 
         rule.waitForIdle()
         rule.mainClock.advanceTimeByFrame()
         onAnimationFrame(duration = FrameDuration) { fraction ->
             if (fraction == 0f) {
-                assertPositions(
-                    0 to AxisOffset(0f, 0f),
-                    1 to AxisOffset(0f, itemSize)
-                )
+                assertPositions(0 to AxisOffset(0f, 0f), 1 to AxisOffset(0f, itemSize))
             } else {
                 assertThat(fraction).isEqualTo(1f)
                 val valueAfterOneFrame =
                     animSpec.getValueAtFrame(1, from = itemSize, to = itemSize2)
-                assertPositions(
-                    0 to AxisOffset(0f, 0f),
-                    1 to AxisOffset(0f, valueAfterOneFrame)
-                )
+                assertPositions(0 to AxisOffset(0f, 0f), 1 to AxisOffset(0f, valueAfterOneFrame))
             }
         }
 
-        rule.runOnUiThread {
-            item0Size = 0.dp
-        }
+        rule.runOnUiThread { item0Size = 0.dp }
 
         rule.waitForIdle()
         val startValue = animSpec.getValueAtFrame(2, from = itemSize, to = itemSize2)
         val startVelocity = animSpec.getVelocityAtFrame(2, from = itemSize, to = itemSize2)
         onAnimationFrame(duration = FrameDuration) { fraction ->
             if (fraction == 0f) {
-                assertPositions(
-                    0 to AxisOffset(0f, 0f),
-                    1 to AxisOffset(0f, startValue)
-                )
+                assertPositions(0 to AxisOffset(0f, 0f), 1 to AxisOffset(0f, startValue))
             } else {
                 assertThat(fraction).isEqualTo(1f)
-                val valueAfterThreeFrames = animSpec.getValueAtFrame(
-                    1,
-                    from = startValue,
-                    to = 0f,
-                    initialVelocity = startVelocity
-                )
-                assertPositions(
-                    0 to AxisOffset(0f, 0f),
-                    1 to AxisOffset(0f, valueAfterThreeFrames)
-                )
+                val valueAfterThreeFrames =
+                    animSpec.getValueAtFrame(
+                        1,
+                        from = startValue,
+                        to = 0f,
+                        initialVelocity = startVelocity
+                    )
+                assertPositions(0 to AxisOffset(0f, 0f), 1 to AxisOffset(0f, valueAfterThreeFrames))
             }
         }
     }
@@ -2337,43 +2027,36 @@
         val listSize = itemSize * 2.5
         val listSizeDp = itemSizeDp * 3f
         rule.setContent {
-            LazyGrid(cells = 1, maxSize = listSizeDp) {
-                items(list, key = { it }) {
-                    Item(it)
-                }
-            }
+            LazyGrid(cells = 1, maxSize = listSizeDp) { items(list, key = { it }) { Item(it) } }
         }
 
         rule.runOnUiThread {
             list = listOf(0, 1, 2, 3)
-            runBlocking {
-                state.scrollToItem(0, 0)
-            }
+            runBlocking { state.scrollToItem(0, 0) }
         }
 
         onAnimationFrame { fraction ->
-            val expected = mutableListOf<Pair<Any, Offset>>().apply {
-                add(0 to AxisOffset(0f, 0f))
-                add(1 to AxisOffset(0f, itemSize * fraction))
-                add(2 to AxisOffset(0f, itemSize + itemSize * fraction))
-                val item3Offset = itemSize * 2 + itemSize * fraction
-                if (item3Offset < listSize) {
-                    add(3 to AxisOffset(0f, item3Offset))
-                } else {
-                    rule.onNodeWithTag("4").assertIsNotDisplayed()
+            val expected =
+                mutableListOf<Pair<Any, Offset>>().apply {
+                    add(0 to AxisOffset(0f, 0f))
+                    add(1 to AxisOffset(0f, itemSize * fraction))
+                    add(2 to AxisOffset(0f, itemSize + itemSize * fraction))
+                    val item3Offset = itemSize * 2 + itemSize * fraction
+                    if (item3Offset < listSize) {
+                        add(3 to AxisOffset(0f, item3Offset))
+                    } else {
+                        rule.onNodeWithTag("4").assertIsNotDisplayed()
+                    }
                 }
-            }
-            assertPositions(
-                expected = expected.toTypedArray(),
-                fraction = fraction
-            )
+            assertPositions(expected = expected.toTypedArray(), fraction = fraction)
         }
     }
 
     private fun AxisOffset(crossAxis: Float, mainAxis: Float) =
         if (isVertical) Offset(crossAxis, mainAxis) else Offset(mainAxis, crossAxis)
 
-    private val Offset.mainAxis: Float get() = if (isVertical) y else x
+    private val Offset.mainAxis: Float
+        get() = if (isVertical) y else x
 
     private fun assertPositions(
         vararg expected: Pair<Any, Offset>,
@@ -2382,20 +2065,22 @@
         autoReverse: Boolean = reverseLayout
     ) {
         val roundedExpected = expected.map { it.first to it.second.round() }
-        val actualBounds = rule.onAllNodes(NodesWithTagMatcher)
-            .fetchSemanticsNodes()
-            .associateBy(
-                keySelector = { it.config[SemanticsProperties.TestTag] },
-                valueTransform = { IntRect(it.positionInRoot.round(), it.size) }
-            )
-        val actualPositions = expected.map {
-            it.first to actualBounds.getValue(it.first.toString()).topLeft
-        }
-        val subject = if (fraction == null) {
-            assertThat(actualPositions)
-        } else {
-            assertWithMessage("Fraction=$fraction").that(actualPositions)
-        }
+        val actualBounds =
+            rule
+                .onAllNodes(NodesWithTagMatcher)
+                .fetchSemanticsNodes()
+                .associateBy(
+                    keySelector = { it.config[SemanticsProperties.TestTag] },
+                    valueTransform = { IntRect(it.positionInRoot.round(), it.size) }
+                )
+        val actualPositions =
+            expected.map { it.first to actualBounds.getValue(it.first.toString()).topLeft }
+        val subject =
+            if (fraction == null) {
+                assertThat(actualPositions)
+            } else {
+                assertWithMessage("Fraction=$fraction").that(actualPositions)
+            }
         subject.isEqualTo(
             roundedExpected.let { list ->
                 if (!autoReverse) {
@@ -2422,13 +2107,14 @@
             }
         )
         if (crossAxis != null) {
-            val actualCross = expected.map {
-                it.first to actualBounds.getValue(it.first.toString()).topLeft
-                    .let { offset -> if (isVertical) offset.x else offset.y }
-            }
-            assertWithMessage(
-                "CrossAxis" + if (fraction != null) "for fraction=$fraction" else ""
-            )
+            val actualCross =
+                expected.map {
+                    it.first to
+                        actualBounds.getValue(it.first.toString()).topLeft.let { offset ->
+                            if (isVertical) offset.x else offset.y
+                        }
+                }
+            assertWithMessage("CrossAxis" + if (fraction != null) "for fraction=$fraction" else "")
                 .that(actualCross)
                 .isEqualTo(crossAxis.map { it.first to it.second.roundToInt() })
         }
@@ -2441,9 +2127,7 @@
     }
 
     private val visibleItemsOffsets: List<Pair<Any, IntOffset>>
-        get() = state.layoutInfo.visibleItemsInfo.map {
-            it.key to it.offset
-        }
+        get() = state.layoutInfo.visibleItemsInfo.map { it.key to it.offset }
 
     private fun onAnimationFrame(duration: Long = Duration, onFrame: (fraction: Float) -> Unit) {
         require(duration.mod(FrameDuration) == 0L)
@@ -2476,13 +2160,13 @@
         if (isVertical) {
             LazyVerticalGrid(
                 GridCells.Fixed(cells),
-                Modifier
-                    .requiredHeightIn(minSize, maxSize)
+                Modifier.requiredHeightIn(minSize, maxSize)
                     .requiredWidth(itemSizeDp * cells)
                     .testTag(ContainerTag),
                 state = state,
-                verticalArrangement = arrangement as? Arrangement.Vertical
-                    ?: if (!reverseLayout) Arrangement.Top else Arrangement.Bottom,
+                verticalArrangement =
+                    arrangement as? Arrangement.Vertical
+                        ?: if (!reverseLayout) Arrangement.Top else Arrangement.Bottom,
                 reverseLayout = reverseLayout,
                 contentPadding = PaddingValues(top = startPadding, bottom = endPadding),
                 content = content
@@ -2490,13 +2174,13 @@
         } else {
             LazyHorizontalGrid(
                 GridCells.Fixed(cells),
-                Modifier
-                    .requiredWidthIn(minSize, maxSize)
+                Modifier.requiredWidthIn(minSize, maxSize)
                     .requiredHeight(itemSizeDp * cells)
                     .testTag(ContainerTag),
                 state = state,
-                horizontalArrangement = arrangement as? Arrangement.Horizontal
-                    ?: if (!reverseLayout) Arrangement.Start else Arrangement.End,
+                horizontalArrangement =
+                    arrangement as? Arrangement.Horizontal
+                        ?: if (!reverseLayout) Arrangement.Start else Arrangement.End,
                 reverseLayout = reverseLayout,
                 contentPadding = PaddingValues(start = startPadding, end = endPadding),
                 content = content
@@ -2512,14 +2196,14 @@
     ) {
         Box(
             if (animSpec != null) {
-                Modifier.animateItem(
-                    placementSpec = animSpec,
-                    fadeInSpec = null,
-                    fadeOutSpec = null
-                )
-            } else {
-                Modifier
-            }
+                    Modifier.animateItem(
+                        placementSpec = animSpec,
+                        fadeInSpec = null,
+                        fadeOutSpec = null
+                    )
+                } else {
+                    Modifier
+                }
                 .then(
                     if (isVertical) {
                         Modifier.requiredHeight(size)
@@ -2540,17 +2224,15 @@
     companion object {
         @JvmStatic
         @Parameterized.Parameters(name = "{0}")
-        fun params() = arrayOf(
-            Config(isVertical = true, reverseLayout = false),
-            Config(isVertical = false, reverseLayout = false),
-            Config(isVertical = true, reverseLayout = true),
-            Config(isVertical = false, reverseLayout = true),
-        )
+        fun params() =
+            arrayOf(
+                Config(isVertical = true, reverseLayout = false),
+                Config(isVertical = false, reverseLayout = false),
+                Config(isVertical = true, reverseLayout = true),
+                Config(isVertical = false, reverseLayout = true),
+            )
 
-        class Config(
-            val isVertical: Boolean,
-            val reverseLayout: Boolean
-        ) {
+        class Config(val isVertical: Boolean, val reverseLayout: Boolean) {
             override fun toString() =
                 (if (isVertical) "LazyVerticalGrid" else "LazyHorizontalGrid") +
                     (if (reverseLayout) "(reverse)" else "")
@@ -2562,6 +2244,5 @@
 private val Duration = 64L // 4 frames, so we get 0f, 0.25f, 0.5f, 0.75f and 1f fractions
 private val AnimSpec = tween<IntOffset>(Duration.toInt(), easing = LinearEasing)
 private val ContainerTag = "container"
-private val NodesWithTagMatcher = SemanticsMatcher("NodesWithTag") {
-    it.config.contains(SemanticsProperties.TestTag)
-}
+private val NodesWithTagMatcher =
+    SemanticsMatcher("NodesWithTag") { it.config.contains(SemanticsProperties.TestTag) }
diff --git a/compose/foundation/foundation/integration-tests/lazy-tests/src/androidTest/kotlin/androidx/compose/foundation/lazy/grid/LazyGridLayoutInfoTest.kt b/compose/foundation/foundation/integration-tests/lazy-tests/src/androidTest/kotlin/androidx/compose/foundation/lazy/grid/LazyGridLayoutInfoTest.kt
index 42b948d..6ff48a4 100644
--- a/compose/foundation/foundation/integration-tests/lazy-tests/src/androidTest/kotlin/androidx/compose/foundation/lazy/grid/LazyGridLayoutInfoTest.kt
+++ b/compose/foundation/foundation/integration-tests/lazy-tests/src/androidTest/kotlin/androidx/compose/foundation/lazy/grid/LazyGridLayoutInfoTest.kt
@@ -44,19 +44,20 @@
 
 @MediumTest
 @RunWith(Parameterized::class)
-class LazyGridLayoutInfoTest(
-    param: LayoutInfoTestParam
-) : BaseLazyGridTestWithOrientation(param.orientation) {
+class LazyGridLayoutInfoTest(param: LayoutInfoTestParam) :
+    BaseLazyGridTestWithOrientation(param.orientation) {
     companion object {
         @JvmStatic
         @Parameterized.Parameters(name = "{0}")
-        fun initParameters(): Array<Any> = arrayOf(
-            LayoutInfoTestParam(Orientation.Vertical, false),
-            LayoutInfoTestParam(Orientation.Vertical, true),
-            LayoutInfoTestParam(Orientation.Horizontal, false),
-            LayoutInfoTestParam(Orientation.Horizontal, true),
-        )
+        fun initParameters(): Array<Any> =
+            arrayOf(
+                LayoutInfoTestParam(Orientation.Vertical, false),
+                LayoutInfoTestParam(Orientation.Vertical, true),
+                LayoutInfoTestParam(Orientation.Horizontal, false),
+                LayoutInfoTestParam(Orientation.Horizontal, true),
+            )
     }
+
     private val isVertical = param.orientation == Orientation.Vertical
     private val reverseLayout = param.reverseLayout
 
@@ -83,15 +84,11 @@
                 reverseLayout = reverseLayout,
                 modifier = Modifier.axisSize(gridWidthDp, itemSizeDp * 3.5f),
             ) {
-                items((0..11).toList()) {
-                    Box(Modifier.mainAxisSize(itemSizeDp))
-                }
+                items((0..11).toList()) { Box(Modifier.mainAxisSize(itemSizeDp)) }
             }
         }
 
-        rule.runOnIdle {
-            state.layoutInfo.assertVisibleItems(count = 8, cells = 2)
-        }
+        rule.runOnIdle { state.layoutInfo.assertVisibleItems(count = 8, cells = 2) }
     }
 
     @Test
@@ -104,18 +101,18 @@
                 reverseLayout = reverseLayout,
                 modifier = Modifier.axisSize(gridWidthDp, itemSizeDp * 3.5f),
             ) {
-                items((0..11).toList()) {
-                    Box(Modifier.mainAxisSize(itemSizeDp))
-                }
+                items((0..11).toList()) { Box(Modifier.mainAxisSize(itemSizeDp)) }
             }
         }
 
         rule.runOnIdle {
-            runBlocking {
-                state.scrollToItem(2, 10)
-            }
-            state.layoutInfo
-                .assertVisibleItems(count = 8, startIndex = 2, startOffset = -10, cells = 2)
+            runBlocking { state.scrollToItem(2, 10) }
+            state.layoutInfo.assertVisibleItems(
+                count = 8,
+                startIndex = 2,
+                startOffset = -10,
+                cells = 2
+            )
         }
     }
 
@@ -130,9 +127,7 @@
                 mainAxisSpacedBy = itemSizeDp,
                 modifier = Modifier.axisSize(itemSizeDp, itemSizeDp * 3.5f),
             ) {
-                items((0..11).toList()) {
-                    Box(Modifier.mainAxisSize(itemSizeDp))
-                }
+                items((0..11).toList()) { Box(Modifier.mainAxisSize(itemSizeDp)) }
             }
         }
 
@@ -145,6 +140,7 @@
     fun ObservingFun(state: LazyGridState, currentInfo: StableRef<LazyGridLayoutInfo?>) {
         currentInfo.value = state.layoutInfo
     }
+
     @Test
     fun visibleItemsAreObservableWhenWeScroll() {
         lateinit var state: LazyGridState
@@ -156,9 +152,7 @@
                 reverseLayout = reverseLayout,
                 modifier = Modifier.axisSize(itemSizeDp * 2f, itemSizeDp * 3.5f),
             ) {
-                items((0..11).toList()) {
-                    Box(Modifier.mainAxisSize(itemSizeDp))
-                }
+                items((0..11).toList()) { Box(Modifier.mainAxisSize(itemSizeDp)) }
             }
             ObservingFun(state, currentInfo)
         }
@@ -166,15 +160,12 @@
         rule.runOnIdle {
             // empty it here and scrolling should invoke observingFun again
             currentInfo.value = null
-            runBlocking {
-                state.scrollToItem(2, 0)
-            }
+            runBlocking { state.scrollToItem(2, 0) }
         }
 
         rule.runOnIdle {
             assertThat(currentInfo.value).isNotNull()
-            currentInfo.value!!
-                .assertVisibleItems(count = 8, startIndex = 2, cells = 2)
+            currentInfo.value!!.assertVisibleItems(count = 8, startIndex = 2, cells = 2)
         }
     }
 
@@ -194,9 +185,7 @@
                 reverseLayout = reverseLayout,
                 state = rememberLazyGridState().also { state = it },
             ) {
-                item {
-                    Box(Modifier.size(size))
-                }
+                item { Box(Modifier.size(size)) }
             }
             observingFun()
         }
@@ -205,11 +194,12 @@
             assertThat(currentInfo).isNotNull()
             currentInfo!!.assertVisibleItems(
                 count = 1,
-                expectedSize = if (isVertical) {
-                    IntSize(itemSizePx, itemSizePx * 2)
-                } else {
-                    IntSize(itemSizePx * 2, itemSizePx)
-               },
+                expectedSize =
+                    if (isVertical) {
+                        IntSize(itemSizePx, itemSizePx * 2)
+                    } else {
+                        IntSize(itemSizePx * 2, itemSizePx)
+                    },
                 cells = 1
             )
             currentInfo = null
@@ -236,9 +226,7 @@
                 reverseLayout = reverseLayout,
                 state = rememberLazyGridState().also { state = it },
             ) {
-                items((0 until count).toList()) {
-                    Box(Modifier.mainAxisSize(10.dp))
-                }
+                items((0 until count).toList()) { Box(Modifier.mainAxisSize(10.dp)) }
             }
         }
 
@@ -247,9 +235,7 @@
             count = 20
         }
 
-        rule.runOnIdle {
-            assertThat(state.layoutInfo.totalItemsCount).isEqualTo(20)
-        }
+        rule.runOnIdle { assertThat(state.layoutInfo.totalItemsCount).isEqualTo(20) }
     }
 
     @Test
@@ -264,22 +250,21 @@
                 reverseLayout = reverseLayout,
                 state = rememberLazyGridState().also { state = it },
             ) {
-                items((0..7).toList()) {
-                    Box(Modifier.mainAxisSize(sizeDp))
-                }
+                items((0..7).toList()) { Box(Modifier.mainAxisSize(sizeDp)) }
             }
         }
 
         rule.runOnIdle {
             assertThat(state.layoutInfo.viewportStartOffset).isEqualTo(0)
             assertThat(state.layoutInfo.viewportEndOffset).isEqualTo(sizePx)
-            assertThat(state.layoutInfo.viewportSize).isEqualTo(
-                if (isVertical) {
-                    IntSize(sizePx * 2, sizePx)
-                } else {
-                    IntSize(sizePx, sizePx * 2)
-                }
-            )
+            assertThat(state.layoutInfo.viewportSize)
+                .isEqualTo(
+                    if (isVertical) {
+                        IntSize(sizePx * 2, sizePx)
+                    } else {
+                        IntSize(sizePx, sizePx * 2)
+                    }
+                )
         }
     }
 
@@ -289,29 +274,30 @@
         val startPaddingPx = 10
         val endPaddingPx = 15
         val sizeDp = with(rule.density) { sizePx.toDp() }
-        val beforeContentPaddingDp = with(rule.density) {
-            if (!reverseLayout) startPaddingPx.toDp() else endPaddingPx.toDp()
-        }
-        val afterContentPaddingDp = with(rule.density) {
-            if (!reverseLayout) endPaddingPx.toDp() else startPaddingPx.toDp()
-        }
+        val beforeContentPaddingDp =
+            with(rule.density) {
+                if (!reverseLayout) startPaddingPx.toDp() else endPaddingPx.toDp()
+            }
+        val afterContentPaddingDp =
+            with(rule.density) {
+                if (!reverseLayout) endPaddingPx.toDp() else startPaddingPx.toDp()
+            }
         lateinit var state: LazyGridState
         rule.setContent {
             LazyGrid(
                 cells = 2,
                 modifier = Modifier.axisSize(sizeDp * 2, sizeDp),
-                contentPadding = PaddingValues(
-                    beforeContent = beforeContentPaddingDp,
-                    afterContent = afterContentPaddingDp,
-                    beforeContentCrossAxis = 2.dp,
-                    afterContentCrossAxis = 2.dp
-                ),
+                contentPadding =
+                    PaddingValues(
+                        beforeContent = beforeContentPaddingDp,
+                        afterContent = afterContentPaddingDp,
+                        beforeContentCrossAxis = 2.dp,
+                        afterContentCrossAxis = 2.dp
+                    ),
                 reverseLayout = reverseLayout,
                 state = rememberLazyGridState().also { state = it },
             ) {
-                items((0..7).toList()) {
-                    Box(Modifier.mainAxisSize(sizeDp))
-                }
+                items((0..7).toList()) { Box(Modifier.mainAxisSize(sizeDp)) }
             }
         }
 
@@ -319,13 +305,14 @@
             assertThat(state.layoutInfo.viewportStartOffset).isEqualTo(-startPaddingPx)
             assertThat(state.layoutInfo.viewportEndOffset).isEqualTo(sizePx - startPaddingPx)
             assertThat(state.layoutInfo.afterContentPadding).isEqualTo(endPaddingPx)
-            assertThat(state.layoutInfo.viewportSize).isEqualTo(
-                if (isVertical) {
-                    IntSize(sizePx * 2, sizePx)
-                } else {
-                    IntSize(sizePx, sizePx * 2)
-                }
-            )
+            assertThat(state.layoutInfo.viewportSize)
+                .isEqualTo(
+                    if (isVertical) {
+                        IntSize(sizePx * 2, sizePx)
+                    } else {
+                        IntSize(sizePx, sizePx * 2)
+                    }
+                )
         }
     }
 
@@ -333,12 +320,9 @@
     fun emptyItemsInVisibleItemsInfo() {
         lateinit var state: LazyGridState
         rule.setContent {
-            LazyGrid(
-                cells = 2,
-                state = rememberLazyGridState().also { state = it }
-            ) {
+            LazyGrid(cells = 2, state = rememberLazyGridState().also { state = it }) {
                 item { Box(Modifier) }
-                item { }
+                item {}
             }
         }
 
@@ -356,24 +340,26 @@
         val startPaddingPx = 10
         val endPaddingPx = 15
         val sizeDp = with(rule.density) { sizePx.toDp() }
-        val beforeContentPaddingDp = with(rule.density) {
-            if (!reverseLayout) startPaddingPx.toDp() else endPaddingPx.toDp()
-        }
-        val afterContentPaddingDp = with(rule.density) {
-            if (!reverseLayout) endPaddingPx.toDp() else startPaddingPx.toDp()
-        }
+        val beforeContentPaddingDp =
+            with(rule.density) {
+                if (!reverseLayout) startPaddingPx.toDp() else endPaddingPx.toDp()
+            }
+        val afterContentPaddingDp =
+            with(rule.density) {
+                if (!reverseLayout) endPaddingPx.toDp() else startPaddingPx.toDp()
+            }
         rule.setContent {
             LazyGrid(
                 cells = 1,
                 modifier = Modifier.mainAxisSize(sizeDp).crossAxisSize(sizeDp * 2),
                 state = rememberLazyGridState().also { state = it },
                 reverseLayout = reverseLayout,
-                contentPadding = PaddingValues(
-                    beforeContent = beforeContentPaddingDp,
-                    afterContent = afterContentPaddingDp
-                )
-            ) {
-            }
+                contentPadding =
+                    PaddingValues(
+                        beforeContent = beforeContentPaddingDp,
+                        afterContent = afterContentPaddingDp
+                    )
+            ) {}
         }
 
         rule.runOnIdle {
@@ -381,9 +367,10 @@
             assertThat(state.layoutInfo.viewportEndOffset).isEqualTo(sizePx - startPaddingPx)
             assertThat(state.layoutInfo.beforeContentPadding).isEqualTo(startPaddingPx)
             assertThat(state.layoutInfo.afterContentPadding).isEqualTo(endPaddingPx)
-            assertThat(state.layoutInfo.viewportSize).isEqualTo(
-                if (vertical) IntSize(sizePx * 2, sizePx) else IntSize(sizePx, sizePx * 2)
-            )
+            assertThat(state.layoutInfo.viewportSize)
+                .isEqualTo(
+                    if (vertical) IntSize(sizePx * 2, sizePx) else IntSize(sizePx, sizePx * 2)
+                )
         }
     }
 
@@ -394,26 +381,27 @@
         val startPaddingPx = 10
         val endPaddingPx = 15
         val sizeDp = with(rule.density) { sizePx.toDp() }
-        val beforeContentPaddingDp = with(rule.density) {
-            if (!reverseLayout) startPaddingPx.toDp() else endPaddingPx.toDp()
-        }
-        val afterContentPaddingDp = with(rule.density) {
-            if (!reverseLayout) endPaddingPx.toDp() else startPaddingPx.toDp()
-        }
+        val beforeContentPaddingDp =
+            with(rule.density) {
+                if (!reverseLayout) startPaddingPx.toDp() else endPaddingPx.toDp()
+            }
+        val afterContentPaddingDp =
+            with(rule.density) {
+                if (!reverseLayout) endPaddingPx.toDp() else startPaddingPx.toDp()
+            }
         rule.setContent {
             LazyGrid(
                 cells = 1,
                 modifier = Modifier.mainAxisSize(sizeDp).crossAxisSize(sizeDp * 2),
                 state = rememberLazyGridState().also { state = it },
                 reverseLayout = reverseLayout,
-                contentPadding = PaddingValues(
-                    beforeContent = beforeContentPaddingDp,
-                    afterContent = afterContentPaddingDp
-                )
+                contentPadding =
+                    PaddingValues(
+                        beforeContent = beforeContentPaddingDp,
+                        afterContent = afterContentPaddingDp
+                    )
             ) {
-                item {
-                    Box(Modifier.size(sizeDp / 2))
-                }
+                item { Box(Modifier.size(sizeDp / 2)) }
             }
         }
 
@@ -422,9 +410,10 @@
             assertThat(state.layoutInfo.viewportEndOffset).isEqualTo(sizePx - startPaddingPx)
             assertThat(state.layoutInfo.beforeContentPadding).isEqualTo(startPaddingPx)
             assertThat(state.layoutInfo.afterContentPadding).isEqualTo(endPaddingPx)
-            assertThat(state.layoutInfo.viewportSize).isEqualTo(
-                if (vertical) IntSize(sizePx * 2, sizePx) else IntSize(sizePx, sizePx * 2)
-            )
+            assertThat(state.layoutInfo.viewportSize)
+                .isEqualTo(
+                    if (vertical) IntSize(sizePx * 2, sizePx) else IntSize(sizePx, sizePx * 2)
+                )
         }
     }
 
@@ -438,15 +427,11 @@
                 reverseLayout = reverseLayout,
                 modifier = Modifier.width(gridWidthDp).height(itemSizeDp * 3.5f),
             ) {
-                items((0..11).toList()) {
-                    Box(Modifier.size(itemSizeDp))
-                }
+                items((0..11).toList()) { Box(Modifier.size(itemSizeDp)) }
             }
         }
 
-        rule.runOnIdle {
-            assertThat(state.layoutInfo.reverseLayout).isEqualTo(reverseLayout)
-        }
+        rule.runOnIdle { assertThat(state.layoutInfo.reverseLayout).isEqualTo(reverseLayout) }
     }
 
     @Test
@@ -459,9 +444,7 @@
                 reverseLayout = reverseLayout,
                 modifier = Modifier.axisSize(gridWidthDp, itemSizeDp * 3.5f),
             ) {
-                items((0..11).toList()) {
-                    Box(Modifier.mainAxisSize(itemSizeDp))
-                }
+                items((0..11).toList()) { Box(Modifier.mainAxisSize(itemSizeDp)) }
             }
         }
 
@@ -481,9 +464,7 @@
                 reverseLayout = reverseLayout,
                 reverseArrangement = true
             ) {
-                items(8) {
-                    Box(Modifier.requiredSize(itemSizeDp))
-                }
+                items(8) { Box(Modifier.requiredSize(itemSizeDp)) }
             }
         }
 
@@ -501,17 +482,9 @@
 
         val state = LazyGridState()
         rule.setContent {
-            LazyGrid(
-                cells = 1,
-                state = state,
-                modifier = Modifier.requiredSize(itemSizeDp * 3f)
-            ) {
-                items(2, contentType = { it }) {
-                    Box(Modifier.requiredSize(itemSizeDp))
-                }
-                item {
-                    Box(Modifier.requiredSize(itemSizeDp))
-                }
+            LazyGrid(cells = 1, state = state, modifier = Modifier.requiredSize(itemSizeDp * 3f)) {
+                items(2, contentType = { it }) { Box(Modifier.requiredSize(itemSizeDp)) }
+                item { Box(Modifier.requiredSize(itemSizeDp)) }
             }
         }
 
@@ -545,10 +518,8 @@
                 .that(if (isVertical) it.offset.y else it.offset.x)
                 .isEqualTo(currentOffset)
             assertThat(it.size).isEqualTo(expectedSize)
-            assertThat(if (isVertical) it.row else it.column)
-                .isEqualTo(currentLine)
-            assertThat(if (isVertical) it.column else it.row)
-                .isEqualTo(currentCell)
+            assertThat(if (isVertical) it.row else it.column).isEqualTo(currentLine)
+            assertThat(if (isVertical) it.column else it.row).isEqualTo(currentCell)
             currentIndex++
             currentCell++
             if (currentCell == cells) {
@@ -560,14 +531,10 @@
     }
 }
 
-class LayoutInfoTestParam(
-    val orientation: Orientation,
-    val reverseLayout: Boolean
-) {
+class LayoutInfoTestParam(val orientation: Orientation, val reverseLayout: Boolean) {
     override fun toString(): String {
         return "orientation=$orientation;reverseLayout=$reverseLayout"
     }
 }
 
-@Stable
-class StableRef<T>(var value: T)
+@Stable class StableRef<T>(var value: T)
diff --git a/compose/foundation/foundation/integration-tests/lazy-tests/src/androidTest/kotlin/androidx/compose/foundation/lazy/grid/LazyGridNestedPrefetchingTest.kt b/compose/foundation/foundation/integration-tests/lazy-tests/src/androidTest/kotlin/androidx/compose/foundation/lazy/grid/LazyGridNestedPrefetchingTest.kt
index fe2014d..bf1100a 100644
--- a/compose/foundation/foundation/integration-tests/lazy-tests/src/androidTest/kotlin/androidx/compose/foundation/lazy/grid/LazyGridNestedPrefetchingTest.kt
+++ b/compose/foundation/foundation/integration-tests/lazy-tests/src/androidTest/kotlin/androidx/compose/foundation/lazy/grid/LazyGridNestedPrefetchingTest.kt
@@ -42,17 +42,17 @@
 
 @LargeTest
 @RunWith(Parameterized::class)
-class LazyGridNestedPrefetchingTest(
-    val config: Config
-) : BaseLazyGridTestWithOrientation(config.orientation) {
+class LazyGridNestedPrefetchingTest(val config: Config) :
+    BaseLazyGridTestWithOrientation(config.orientation) {
 
     companion object {
         @JvmStatic
         @Parameterized.Parameters(name = "{0}")
-        fun initParameters(): Array<Any> = arrayOf(
-            Config(Orientation.Vertical),
-            Config(Orientation.Horizontal),
-        )
+        fun initParameters(): Array<Any> =
+            arrayOf(
+                Config(Orientation.Vertical),
+                Config(Orientation.Horizontal),
+            )
 
         class Config(
             val orientation: Orientation,
@@ -63,6 +63,7 @@
 
     sealed interface Action {
         data class Compose(val index: Int, val nestedIndex: Int? = null) : Action
+
         data class Measure(val index: Int, val nestedIndex: Int? = null) : Action
     }
 
@@ -72,9 +73,10 @@
     private val scheduler = TestPrefetchScheduler()
 
     @OptIn(ExperimentalFoundationApi::class)
-    private val strategy = object : LazyGridPrefetchStrategy by LazyGridPrefetchStrategy() {
-        override val prefetchScheduler: PrefetchScheduler = scheduler
-    }
+    private val strategy =
+        object : LazyGridPrefetchStrategy by LazyGridPrefetchStrategy() {
+            override val prefetchScheduler: PrefetchScheduler = scheduler
+        }
 
     @OptIn(ExperimentalFoundationApi::class)
     private fun createState(): LazyGridState = LazyGridState(prefetchStrategy = strategy)
@@ -86,44 +88,37 @@
 
         val prefetchIndex = 2
         val actions = trackingActions {
-            rule.runOnIdle {
-                runBlocking {
-                    state.scrollBy(5f)
-                }
-            }
+            rule.runOnIdle { runBlocking { state.scrollBy(5f) } }
 
             waitForPrefetch()
         }
 
         // We want to make sure nested children were precomposed before the parent was premeasured
         // (which would force them all to compose in a single block of work in premeasure)
-        assertThat(actions).containsExactly(
-            Action.Compose(prefetchIndex),
-            Action.Compose(prefetchIndex, 0),
-            Action.Compose(prefetchIndex, 1),
-            Action.Measure(prefetchIndex),
-            // Measurement of parent forces measure of pre-composed items and compose+measure of the
-            // rest of the initially visible items
-            Action.Measure(prefetchIndex, 0),
-            Action.Measure(prefetchIndex, 1),
-            Action.Compose(prefetchIndex, 2),
-            Action.Measure(prefetchIndex, 2),
-            Action.Compose(prefetchIndex, 3),
-            Action.Measure(prefetchIndex, 3),
-        ).inOrder()
+        assertThat(actions)
+            .containsExactly(
+                Action.Compose(prefetchIndex),
+                Action.Compose(prefetchIndex, 0),
+                Action.Compose(prefetchIndex, 1),
+                Action.Measure(prefetchIndex),
+                // Measurement of parent forces measure of pre-composed items and compose+measure of
+                // the
+                // rest of the initially visible items
+                Action.Measure(prefetchIndex, 0),
+                Action.Measure(prefetchIndex, 1),
+                Action.Compose(prefetchIndex, 2),
+                Action.Measure(prefetchIndex, 2),
+                Action.Compose(prefetchIndex, 3),
+                Action.Measure(prefetchIndex, 3),
+            )
+            .inOrder()
 
-        rule.onNodeWithTag(tagFor(prefetchIndex))
-            .assertExists()
-        rule.onNodeWithTag(tagFor(2, 0))
-            .assertExists()
-        rule.onNodeWithTag(tagFor(2, 1))
-            .assertExists()
-        rule.onNodeWithTag(tagFor(2, 2))
-            .assertExists()
-        rule.onNodeWithTag(tagFor(2, 3))
-            .assertExists()
-        rule.onNodeWithTag(tagFor(2, 4))
-            .assertDoesNotExist()
+        rule.onNodeWithTag(tagFor(prefetchIndex)).assertExists()
+        rule.onNodeWithTag(tagFor(2, 0)).assertExists()
+        rule.onNodeWithTag(tagFor(2, 1)).assertExists()
+        rule.onNodeWithTag(tagFor(2, 2)).assertExists()
+        rule.onNodeWithTag(tagFor(2, 3)).assertExists()
+        rule.onNodeWithTag(tagFor(2, 4)).assertDoesNotExist()
     }
 
     @Test
@@ -181,37 +176,34 @@
         composeGrid(
             state,
             createNestedLazyGridState = {
-                LazyGridState(
-                    prefetchStrategy = LazyGridPrefetchStrategy(1)
-                )
-            })
+                LazyGridState(prefetchStrategy = LazyGridPrefetchStrategy(1))
+            }
+        )
 
         val prefetchIndex = 2
         val actions = trackingActions {
-            rule.runOnIdle {
-                runBlocking {
-                    state.scrollBy(5f)
-                }
-            }
+            rule.runOnIdle { runBlocking { state.scrollBy(5f) } }
 
             waitForPrefetch()
         }
 
         // Since the nested prefetch count on the strategy is 1, we only expect index 0 to be
         // precomposed before measure
-        assertThat(actions).containsExactly(
-            Action.Compose(prefetchIndex),
-            Action.Compose(prefetchIndex, 0),
-            Action.Measure(prefetchIndex),
-            Action.Measure(prefetchIndex, 0),
-            // Compose and measure the rest
-            Action.Compose(prefetchIndex, 1),
-            Action.Measure(prefetchIndex, 1),
-            Action.Compose(prefetchIndex, 2),
-            Action.Measure(prefetchIndex, 2),
-            Action.Compose(prefetchIndex, 3),
-            Action.Measure(prefetchIndex, 3),
-        ).inOrder()
+        assertThat(actions)
+            .containsExactly(
+                Action.Compose(prefetchIndex),
+                Action.Compose(prefetchIndex, 0),
+                Action.Measure(prefetchIndex),
+                Action.Measure(prefetchIndex, 0),
+                // Compose and measure the rest
+                Action.Compose(prefetchIndex, 1),
+                Action.Measure(prefetchIndex, 1),
+                Action.Compose(prefetchIndex, 2),
+                Action.Measure(prefetchIndex, 2),
+                Action.Compose(prefetchIndex, 3),
+                Action.Measure(prefetchIndex, 3),
+            )
+            .inOrder()
     }
 
     @OptIn(ExperimentalFoundationApi::class)
@@ -226,77 +218,68 @@
                 LazyGridState(
                     prefetchStrategy = NestedPrefetchWithConstraintsStrategy(nestedConstraints)
                 )
-            })
+            }
+        )
 
         val prefetchIndex = 2
         val actions = trackingActions {
-            rule.runOnIdle {
-                runBlocking {
-                    state.scrollBy(5f)
-                }
-            }
+            rule.runOnIdle { runBlocking { state.scrollBy(5f) } }
 
             waitForPrefetch()
         }
 
-        assertThat(actions).containsExactly(
-            Action.Compose(prefetchIndex),
-            Action.Compose(prefetchIndex, 0),
-            Action.Measure(prefetchIndex, 0),
-            Action.Compose(prefetchIndex, 1),
-            Action.Measure(prefetchIndex, 1),
-            Action.Measure(prefetchIndex),
-            // Extra measure calls here since we didn't actually provide the right Constraints
-            Action.Measure(prefetchIndex, 0),
-            Action.Measure(prefetchIndex, 1),
-            // Compose and measure the rest
-            Action.Compose(prefetchIndex, 2),
-            Action.Measure(prefetchIndex, 2),
-            Action.Compose(prefetchIndex, 3),
-            Action.Measure(prefetchIndex, 3),
-        ).inOrder()
+        assertThat(actions)
+            .containsExactly(
+                Action.Compose(prefetchIndex),
+                Action.Compose(prefetchIndex, 0),
+                Action.Measure(prefetchIndex, 0),
+                Action.Compose(prefetchIndex, 1),
+                Action.Measure(prefetchIndex, 1),
+                Action.Measure(prefetchIndex),
+                // Extra measure calls here since we didn't actually provide the right Constraints
+                Action.Measure(prefetchIndex, 0),
+                Action.Measure(prefetchIndex, 1),
+                // Compose and measure the rest
+                Action.Compose(prefetchIndex, 2),
+                Action.Measure(prefetchIndex, 2),
+                Action.Compose(prefetchIndex, 3),
+                Action.Measure(prefetchIndex, 3),
+            )
+            .inOrder()
     }
 
     @Test
     fun nestedPrefetchStartsFromFirstVisibleItemIndex() {
         val state = createState()
-        composeGrid(
-            state,
-            createNestedLazyGridState = {
-                LazyGridState(firstVisibleItemIndex = 4)
-            })
+        composeGrid(state, createNestedLazyGridState = { LazyGridState(firstVisibleItemIndex = 4) })
 
         val prefetchIndex = 2
         val actions = trackingActions {
-            rule.runOnIdle {
-                runBlocking {
-                    state.scrollBy(5f)
-                }
-            }
+            rule.runOnIdle { runBlocking { state.scrollBy(5f) } }
 
             waitForPrefetch()
         }
 
-        assertThat(actions).containsExactly(
-            Action.Compose(prefetchIndex),
-            Action.Compose(prefetchIndex, 4),
-            Action.Compose(prefetchIndex, 5),
-            Action.Measure(prefetchIndex),
-            Action.Measure(prefetchIndex, 4),
-            Action.Measure(prefetchIndex, 5),
-            // Compose and measure the rest
-            Action.Compose(prefetchIndex, 6),
-            Action.Measure(prefetchIndex, 6),
-            Action.Compose(prefetchIndex, 7),
-            Action.Measure(prefetchIndex, 7),
-        ).inOrder()
+        assertThat(actions)
+            .containsExactly(
+                Action.Compose(prefetchIndex),
+                Action.Compose(prefetchIndex, 4),
+                Action.Compose(prefetchIndex, 5),
+                Action.Measure(prefetchIndex),
+                Action.Measure(prefetchIndex, 4),
+                Action.Measure(prefetchIndex, 5),
+                // Compose and measure the rest
+                Action.Compose(prefetchIndex, 6),
+                Action.Measure(prefetchIndex, 6),
+                Action.Compose(prefetchIndex, 7),
+                Action.Measure(prefetchIndex, 7),
+            )
+            .inOrder()
     }
 
     private var actions: MutableList<Action>? = null
 
-    /**
-     * Returns the list of Actions performed during block()
-     */
+    /** Returns the list of Actions performed during block() */
     private fun trackingActions(block: () -> Unit): List<Action> {
         return mutableListOf<Action>().apply {
             actions = this
@@ -306,9 +289,7 @@
     }
 
     private fun waitForPrefetch() {
-        rule.runOnIdle {
-            scheduler.executeActiveRequests()
-        }
+        rule.runOnIdle { scheduler.executeActiveRequests() }
     }
 
     fun tagFor(index: Int, nestedIndex: Int? = null): String {
@@ -321,14 +302,12 @@
 
     /**
      * Initialize a list of grids where each grid has 4 initial items visible in a 2x2 arrangement.
-     *
      * -------
-     * |  |  | index 0, nested index 0 and 1
+     * | | | index 0, nested index 0 and 1
      * -------
-     * |  |  | index 0, nested index 2 and 3
+     * | | | index 0, nested index 2 and 3
      * -------
-     * |  |  | index 1, nested index 0 and 1
-     *
+     * | | | index 1, nested index 0 and 1
      */
     private fun composeGrid(
         lazyGridState: LazyGridState,
@@ -337,9 +316,7 @@
         rule.setContent {
             LazyGrid(
                 cells = 1,
-                modifier = Modifier
-                    .mainAxisSize(itemsSizeDp * 2.5f)
-                    .crossAxisSize(itemsSizeDp * 2),
+                modifier = Modifier.mainAxisSize(itemsSizeDp * 2.5f).crossAxisSize(itemsSizeDp * 2),
                 state = lazyGridState
             ) {
                 items(100) { index ->
@@ -347,17 +324,16 @@
                     val nestedState = remember(index) { createNestedLazyGridState(index) }
                     LazyGrid(
                         cells = 2,
-                        modifier = Modifier
-                            .size(itemsSizeDp * 2)
-                            .testTag(tagFor(index))
-                            .trackWhenMeasured(index),
+                        modifier =
+                            Modifier.size(itemsSizeDp * 2)
+                                .testTag(tagFor(index))
+                                .trackWhenMeasured(index),
                         state = nestedState,
                     ) {
                         items(100) { nestedIndex ->
                             TrackActiveNodesEffect(index, nestedIndex)
                             Spacer(
-                                Modifier
-                                    .size(itemsSizeDp)
+                                Modifier.size(itemsSizeDp)
                                     .testTag(tagFor(index, nestedIndex))
                                     .trackWhenMeasured(index, nestedIndex)
                             )
@@ -374,20 +350,17 @@
         DisposableEffect(tag) {
             activeNodes.add(tag)
             actions?.add(Action.Compose(index, nestedIndex))
-            onDispose {
-                activeNodes.remove(tag)
-            }
+            onDispose { activeNodes.remove(tag) }
         }
     }
 
     private fun Modifier.trackWhenMeasured(index: Int, nestedIndex: Int? = null): Modifier {
-        return this then Modifier.layout { measurable, constraints ->
-            actions?.add(Action.Measure(index, nestedIndex))
-            val placeable = measurable.measure(constraints)
-            layout(placeable.width, placeable.height) {
-                placeable.place(0, 0)
+        return this then
+            Modifier.layout { measurable, constraints ->
+                actions?.add(Action.Measure(index, nestedIndex))
+                val placeable = measurable.measure(constraints)
+                layout(placeable.width, placeable.height) { placeable.place(0, 0) }
             }
-        }
     }
 
     @OptIn(ExperimentalFoundationApi::class)
@@ -395,11 +368,9 @@
         private val childConstraints: Constraints,
         private val nestedPrefetchItemCount: Int = 2
     ) : LazyGridPrefetchStrategy {
-        override fun LazyGridPrefetchScope.onScroll(delta: Float, layoutInfo: LazyGridLayoutInfo) {
-        }
+        override fun LazyGridPrefetchScope.onScroll(delta: Float, layoutInfo: LazyGridLayoutInfo) {}
 
-        override fun LazyGridPrefetchScope.onVisibleItemsUpdated(layoutInfo: LazyGridLayoutInfo) {
-        }
+        override fun LazyGridPrefetchScope.onVisibleItemsUpdated(layoutInfo: LazyGridLayoutInfo) {}
 
         override fun NestedPrefetchScope.onNestedPrefetch(firstVisibleItemIndex: Int) {
             repeat(nestedPrefetchItemCount) { i ->
diff --git a/compose/foundation/foundation/integration-tests/lazy-tests/src/androidTest/kotlin/androidx/compose/foundation/lazy/grid/LazyGridPinnableContainerTest.kt b/compose/foundation/foundation/integration-tests/lazy-tests/src/androidTest/kotlin/androidx/compose/foundation/lazy/grid/LazyGridPinnableContainerTest.kt
index 38a076d..ee75d0e 100644
--- a/compose/foundation/foundation/integration-tests/lazy-tests/src/androidTest/kotlin/androidx/compose/foundation/lazy/grid/LazyGridPinnableContainerTest.kt
+++ b/compose/foundation/foundation/integration-tests/lazy-tests/src/androidTest/kotlin/androidx/compose/foundation/lazy/grid/LazyGridPinnableContainerTest.kt
@@ -45,8 +45,7 @@
 @MediumTest
 class LazyGridPinnableContainerTest {
 
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
     private var pinnableContainer: PinnableContainer? = null
 
@@ -62,16 +61,10 @@
 
     @Composable
     fun Item(index: Int) {
-        Box(
-            Modifier
-                .size(itemSize)
-                .testTag("$index")
-        )
+        Box(Modifier.size(itemSize).testTag("$index"))
         DisposableEffect(index) {
             composed.add(index)
-            onDispose {
-                composed.remove(index)
-            }
+            onDispose { composed.remove(index) }
         }
     }
 
@@ -94,15 +87,11 @@
             }
         }
 
-        rule.runOnIdle {
-            requireNotNull(pinnableContainer).pin()
-        }
+        rule.runOnIdle { requireNotNull(pinnableContainer).pin() }
 
         rule.runOnIdle {
             assertThat(composed).contains(1)
-            runBlocking {
-                state.scrollToItem(3)
-            }
+            runBlocking { state.scrollToItem(3) }
         }
 
         rule.waitUntil {
@@ -115,10 +104,7 @@
             assertThat(composed).contains(1)
         }
 
-        rule.onNodeWithTag("1")
-            .assertExists()
-            .assertIsNotDisplayed()
-            .assertIsPlaced()
+        rule.onNodeWithTag("1").assertExists().assertIsNotDisplayed().assertIsPlaced()
     }
 
     @Test
@@ -140,15 +126,9 @@
             }
         }
 
-        rule.runOnIdle {
-            requireNotNull(pinnableContainer).pin()
-        }
+        rule.runOnIdle { requireNotNull(pinnableContainer).pin() }
 
-        rule.runOnIdle {
-            runBlocking {
-                state.scrollToItem(4)
-            }
-        }
+        rule.runOnIdle { runBlocking { state.scrollToItem(4) } }
 
         rule.waitUntil {
             // not visible items were disposed
@@ -183,11 +163,7 @@
             }
         }
 
-        rule.runOnIdle {
-            runBlocking {
-                state.scrollToItem(4)
-            }
-        }
+        rule.runOnIdle { runBlocking { state.scrollToItem(4) } }
 
         rule.waitUntil {
             // wait for not visible items to be disposed
@@ -199,11 +175,7 @@
             assertThat(composed).contains(5)
         }
 
-        rule.runOnIdle {
-            runBlocking {
-                state.scrollToItem(0)
-            }
-        }
+        rule.runOnIdle { runBlocking { state.scrollToItem(0) } }
 
         rule.waitUntil {
             // wait for not visible items to be disposed
@@ -239,32 +211,23 @@
             }
         }
 
-        val handle = rule.runOnIdle {
-            requireNotNull(pinnableContainer).pin()
-        }
+        val handle = rule.runOnIdle { requireNotNull(pinnableContainer).pin() }
 
-        rule.runOnIdle {
-            runBlocking {
-                state.scrollToItem(3)
-            }
-        }
+        rule.runOnIdle { runBlocking { state.scrollToItem(3) } }
 
         rule.waitUntil {
             // wait for not visible items to be disposed
             !composed.contains(0)
         }
 
-        rule.runOnIdle {
-            handle.release()
-        }
+        rule.runOnIdle { handle.release() }
 
         rule.waitUntil {
             // wait for unpinned item to be disposed
             !composed.contains(1)
         }
 
-        rule.onNodeWithTag("1")
-            .assertIsNotPlaced()
+        rule.onNodeWithTag("1").assertIsNotPlaced()
     }
 
     @Test
@@ -292,9 +255,7 @@
             requireNotNull(pinnableContainer).pin()
         }
 
-        rule.runOnIdle {
-            list = listOf(0, 3, 4, 1, 2)
-        }
+        rule.runOnIdle { list = listOf(0, 3, 4, 1, 2) }
 
         rule.waitUntil {
             // wait for not visible item to be disposed
@@ -305,8 +266,7 @@
             assertThat(composed).containsExactly(0, 3, 4, 2) // 2 is pinned
         }
 
-        rule.onNodeWithTag("2")
-            .assertIsPlaced()
+        rule.onNodeWithTag("2").assertIsPlaced()
     }
 
     @Test
@@ -328,15 +288,11 @@
             }
         }
 
-        rule.runOnIdle {
-            requireNotNull(pinnableContainer).pin()
-        }
+        rule.runOnIdle { requireNotNull(pinnableContainer).pin() }
 
         rule.runOnIdle {
             assertThat(composed).contains(3)
-            runBlocking {
-                state.scrollToItem(0)
-            }
+            runBlocking { state.scrollToItem(0) }
         }
 
         rule.waitUntil {
@@ -354,8 +310,7 @@
             !composed.contains(2)
         }
 
-        rule.onNodeWithTag("2")
-            .assertIsNotPlaced()
+        rule.onNodeWithTag("2").assertIsNotPlaced()
     }
 
     @Test
@@ -377,19 +332,13 @@
             }
         }
 
-        rule.runOnIdle {
-            state = LazyGridState()
-        }
+        rule.runOnIdle { state = LazyGridState() }
 
-        rule.runOnIdle {
-            requireNotNull(pinnableContainer).pin()
-        }
+        rule.runOnIdle { requireNotNull(pinnableContainer).pin() }
 
         rule.runOnIdle {
             assertThat(composed).contains(1)
-            runBlocking {
-                state.scrollToItem(2)
-            }
+            runBlocking { state.scrollToItem(2) }
         }
 
         rule.waitUntil {
@@ -397,9 +346,7 @@
             !composed.contains(1)
         }
 
-        rule.runOnIdle {
-            assertThat(composed).contains(0)
-        }
+        rule.runOnIdle { assertThat(composed).contains(0) }
     }
 
     @Test
@@ -423,15 +370,11 @@
             }
         }
 
-        rule.runOnIdle {
-            requireNotNull(pinnableContainer).pin()
-        }
+        rule.runOnIdle { requireNotNull(pinnableContainer).pin() }
 
         rule.runOnIdle {
             assertThat(composed).contains(4)
-            runBlocking {
-                state.scrollToItem(6)
-            }
+            runBlocking { state.scrollToItem(6) }
         }
 
         rule.waitUntil {
@@ -439,14 +382,9 @@
             !composed.contains(4)
         }
 
-        rule.runOnIdle {
-            assertThat(composed).contains(3)
-        }
+        rule.runOnIdle { assertThat(composed).contains(3) }
 
-        rule.onNodeWithTag("3")
-            .assertExists()
-            .assertIsNotDisplayed()
-            .assertIsPlaced()
+        rule.onNodeWithTag("3").assertExists().assertIsNotDisplayed().assertIsPlaced()
     }
 
     @Test
@@ -472,9 +410,7 @@
         rule.runOnIdle {
             requireNotNull(pinnableContainer).pin()
             assertThat(composed).contains(4)
-            runBlocking {
-                state.scrollToItem(0)
-            }
+            runBlocking { state.scrollToItem(0) }
         }
 
         rule.waitUntil {
@@ -482,17 +418,14 @@
             !composed.contains(4)
         }
 
-        rule.runOnIdle {
-            itemCount = 3
-        }
+        rule.runOnIdle { itemCount = 3 }
 
         rule.waitUntil {
             // wait for pinned item to be disposed
             !composed.contains(3)
         }
 
-        rule.onNodeWithTag("3")
-            .assertIsNotPlaced()
+        rule.onNodeWithTag("3").assertIsNotPlaced()
     }
 
     @Test
@@ -515,21 +448,16 @@
             }
         }
 
-        rule.runOnIdle {
-            requireNotNull(pinnableContainer).pin()
-        }
+        rule.runOnIdle { requireNotNull(pinnableContainer).pin() }
 
-        rule.runOnIdle {
-            items = listOf(0, 2)
-        }
+        rule.runOnIdle { items = listOf(0, 2) }
 
         rule.waitUntil {
             // wait for pinned item to be disposed
             !composed.contains(1)
         }
 
-        rule.onNodeWithTag("1")
-            .assertIsNotPlaced()
+        rule.onNodeWithTag("1").assertIsNotPlaced()
     }
 
     @Test
@@ -561,9 +489,7 @@
             // pinned 3 times in total
             handles.add(requireNotNull(pinnableContainer).pin())
             assertThat(composed).contains(0)
-            runBlocking {
-                state.scrollToItem(3)
-            }
+            runBlocking { state.scrollToItem(3) }
         }
 
         rule.waitUntil {
@@ -587,12 +513,13 @@
     @Test
     fun pinningIsPropagatedToParentContainer() {
         var parentPinned = false
-        val parentContainer = object : PinnableContainer {
-            override fun pin(): PinnedHandle {
-                parentPinned = true
-                return PinnedHandle { parentPinned = false }
+        val parentContainer =
+            object : PinnableContainer {
+                override fun pin(): PinnedHandle {
+                    parentPinned = true
+                    return PinnedHandle { parentPinned = false }
+                }
             }
-        }
         // Arrange.
         rule.setContent {
             CompositionLocalProvider(LocalPinnableContainer provides parentContainer) {
@@ -605,36 +532,34 @@
             }
         }
 
-        val handle = rule.runOnIdle {
-            requireNotNull(pinnableContainer).pin()
-        }
+        val handle = rule.runOnIdle { requireNotNull(pinnableContainer).pin() }
 
         rule.runOnIdle {
             assertThat(parentPinned).isTrue()
             handle.release()
         }
 
-        rule.runOnIdle {
-            assertThat(parentPinned).isFalse()
-        }
+        rule.runOnIdle { assertThat(parentPinned).isFalse() }
     }
 
     @Test
     fun parentContainerChange_pinningIsMaintained() {
         var parent1Pinned = false
-        val parent1Container = object : PinnableContainer {
-            override fun pin(): PinnedHandle {
-                parent1Pinned = true
-                return PinnedHandle { parent1Pinned = false }
+        val parent1Container =
+            object : PinnableContainer {
+                override fun pin(): PinnedHandle {
+                    parent1Pinned = true
+                    return PinnedHandle { parent1Pinned = false }
+                }
             }
-        }
         var parent2Pinned = false
-        val parent2Container = object : PinnableContainer {
-            override fun pin(): PinnedHandle {
-                parent2Pinned = true
-                return PinnedHandle { parent2Pinned = false }
+        val parent2Container =
+            object : PinnableContainer {
+                override fun pin(): PinnedHandle {
+                    parent2Pinned = true
+                    return PinnedHandle { parent2Pinned = false }
+                }
             }
-        }
         var parentContainer by mutableStateOf<PinnableContainer>(parent1Container)
         // Arrange.
         rule.setContent {
@@ -648,9 +573,7 @@
             }
         }
 
-        rule.runOnIdle {
-            requireNotNull(pinnableContainer).pin()
-        }
+        rule.runOnIdle { requireNotNull(pinnableContainer).pin() }
 
         rule.runOnIdle {
             assertThat(parent1Pinned).isTrue()
diff --git a/compose/foundation/foundation/integration-tests/lazy-tests/src/androidTest/kotlin/androidx/compose/foundation/lazy/grid/LazyGridPrefetchStrategyTest.kt b/compose/foundation/foundation/integration-tests/lazy-tests/src/androidTest/kotlin/androidx/compose/foundation/lazy/grid/LazyGridPrefetchStrategyTest.kt
index 786b20b..ddd1d62 100644
--- a/compose/foundation/foundation/integration-tests/lazy-tests/src/androidTest/kotlin/androidx/compose/foundation/lazy/grid/LazyGridPrefetchStrategyTest.kt
+++ b/compose/foundation/foundation/integration-tests/lazy-tests/src/androidTest/kotlin/androidx/compose/foundation/lazy/grid/LazyGridPrefetchStrategyTest.kt
@@ -44,17 +44,17 @@
 @LargeTest
 @RunWith(Parameterized::class)
 @OptIn(ExperimentalFoundationApi::class)
-class LazyGridPrefetchStrategyTest(
-    val config: Config
-) : BaseLazyGridTestWithOrientation(config.orientation) {
+class LazyGridPrefetchStrategyTest(val config: Config) :
+    BaseLazyGridTestWithOrientation(config.orientation) {
 
     companion object {
         @JvmStatic
         @Parameterized.Parameters(name = "{0}")
-        fun initParameters(): Array<Any> = arrayOf(
-            Config(Orientation.Vertical),
-            Config(Orientation.Horizontal),
-        )
+        fun initParameters(): Array<Any> =
+            arrayOf(
+                Config(Orientation.Vertical),
+                Config(Orientation.Horizontal),
+            )
 
         class Config(
             val orientation: Orientation,
@@ -66,9 +66,10 @@
             get() = visibleItemsInfo.map { it.index }.sorted()
 
         private val LazyGridLayoutInfo.lastLineIndex: Int
-            get() = visibleItemsInfo.last().let {
-                if (this.orientation == Orientation.Vertical) it.row else it.column
-            }
+            get() =
+                visibleItemsInfo.last().let {
+                    if (this.orientation == Orientation.Vertical) it.row else it.column
+                }
     }
 
     private val itemsSizePx = 30
@@ -83,25 +84,20 @@
 
         composeGrid(prefetchStrategy = strategy)
 
-        assertThat(strategy.callbacks).containsExactly(
-            Callback.OnVisibleItemsUpdated(
-                visibleIndices = listOf(0, 1, 2, 3)
-            ),
-        ).inOrder()
+        assertThat(strategy.callbacks)
+            .containsExactly(
+                Callback.OnVisibleItemsUpdated(visibleIndices = listOf(0, 1, 2, 3)),
+            )
+            .inOrder()
         strategy.reset()
 
-        rule.runOnIdle {
-            runBlocking {
-                state.scrollBy(5f)
-            }
-        }
+        rule.runOnIdle { runBlocking { state.scrollBy(5f) } }
 
-        assertThat(strategy.callbacks).containsExactly(
-            Callback.OnScroll(
-                delta = -5f,
-                visibleIndices = listOf(0, 1, 2, 3)
-            ),
-        ).inOrder()
+        assertThat(strategy.callbacks)
+            .containsExactly(
+                Callback.OnScroll(delta = -5f, visibleIndices = listOf(0, 1, 2, 3)),
+            )
+            .inOrder()
     }
 
     @Test
@@ -110,25 +106,20 @@
 
         composeGrid(firstItem = 10, itemOffset = 10, prefetchStrategy = strategy)
 
-        assertThat(strategy.callbacks).containsExactly(
-            Callback.OnVisibleItemsUpdated(
-                visibleIndices = listOf(10, 11, 12, 13)
-            ),
-        ).inOrder()
+        assertThat(strategy.callbacks)
+            .containsExactly(
+                Callback.OnVisibleItemsUpdated(visibleIndices = listOf(10, 11, 12, 13)),
+            )
+            .inOrder()
         strategy.reset()
 
-        rule.runOnIdle {
-            runBlocking {
-                state.scrollBy(-5f)
-            }
-        }
+        rule.runOnIdle { runBlocking { state.scrollBy(-5f) } }
 
-        assertThat(strategy.callbacks).containsExactly(
-            Callback.OnScroll(
-                delta = 5f,
-                visibleIndices = listOf(10, 11, 12, 13)
-            ),
-        ).inOrder()
+        assertThat(strategy.callbacks)
+            .containsExactly(
+                Callback.OnScroll(delta = 5f, visibleIndices = listOf(10, 11, 12, 13)),
+            )
+            .inOrder()
     }
 
     @Test
@@ -137,28 +128,28 @@
 
         composeGrid(prefetchStrategy = strategy)
 
-        assertThat(strategy.callbacks).containsExactly(
-            RecordingLazyGridPrefetchStrategy.Callback.OnVisibleItemsUpdated(
-                visibleIndices = listOf(0, 1, 2, 3)
-            ),
-        ).inOrder()
+        assertThat(strategy.callbacks)
+            .containsExactly(
+                RecordingLazyGridPrefetchStrategy.Callback.OnVisibleItemsUpdated(
+                    visibleIndices = listOf(0, 1, 2, 3)
+                ),
+            )
+            .inOrder()
         strategy.reset()
 
-        rule.runOnIdle {
-            runBlocking {
-                state.scrollBy(itemsSizePx + 5f)
-            }
-        }
+        rule.runOnIdle { runBlocking { state.scrollBy(itemsSizePx + 5f) } }
 
-        assertThat(strategy.callbacks).containsExactly(
-            RecordingLazyGridPrefetchStrategy.Callback.OnVisibleItemsUpdated(
-                visibleIndices = listOf(2, 3, 4, 5)
-            ),
-            RecordingLazyGridPrefetchStrategy.Callback.OnScroll(
-                delta = -(itemsSizePx + 5f),
-                visibleIndices = listOf(2, 3, 4, 5)
-            ),
-        ).inOrder()
+        assertThat(strategy.callbacks)
+            .containsExactly(
+                RecordingLazyGridPrefetchStrategy.Callback.OnVisibleItemsUpdated(
+                    visibleIndices = listOf(2, 3, 4, 5)
+                ),
+                RecordingLazyGridPrefetchStrategy.Callback.OnScroll(
+                    delta = -(itemsSizePx + 5f),
+                    visibleIndices = listOf(2, 3, 4, 5)
+                ),
+            )
+            .inOrder()
     }
 
     @Test
@@ -168,22 +159,26 @@
 
         composeGrid(prefetchStrategy = strategy, numItems = numItems)
 
-        assertThat(strategy.callbacks).containsExactly(
-            RecordingLazyGridPrefetchStrategy.Callback.OnVisibleItemsUpdated(
-                visibleIndices = listOf(0, 1, 2, 3)
-            ),
-        ).inOrder()
+        assertThat(strategy.callbacks)
+            .containsExactly(
+                RecordingLazyGridPrefetchStrategy.Callback.OnVisibleItemsUpdated(
+                    visibleIndices = listOf(0, 1, 2, 3)
+                ),
+            )
+            .inOrder()
         strategy.reset()
 
         numItems.value = 1
 
         rule.waitForIdle()
 
-        assertThat(strategy.callbacks).containsExactly(
-            RecordingLazyGridPrefetchStrategy.Callback.OnVisibleItemsUpdated(
-                visibleIndices = listOf(0)
-            ),
-        ).inOrder()
+        assertThat(strategy.callbacks)
+            .containsExactly(
+                RecordingLazyGridPrefetchStrategy.Callback.OnVisibleItemsUpdated(
+                    visibleIndices = listOf(0)
+                ),
+            )
+            .inOrder()
     }
 
     @Test
@@ -192,23 +187,15 @@
 
         composeGrid(prefetchStrategy = strategy)
 
-        rule.runOnIdle {
-            runBlocking {
-                state.scrollBy(5f)
-            }
-        }
+        rule.runOnIdle { runBlocking { state.scrollBy(5f) } }
 
         waitForPrefetch()
-        rule.onNodeWithTag("4")
-            .assertExists()
-        rule.onNodeWithTag("5")
-            .assertExists()
+        rule.onNodeWithTag("4").assertExists()
+        rule.onNodeWithTag("5").assertExists()
     }
 
     private fun waitForPrefetch() {
-        rule.runOnIdle {
-            scheduler.executeActiveRequests()
-        }
+        rule.runOnIdle { scheduler.executeActiveRequests() }
     }
 
     /**
@@ -217,10 +204,9 @@
      *
      * Example in vertical orientation:
      * -------
-     * |  |  |  index 0, 1
+     * | | | index 0, 1
      * -------
-     * |  |  |  index 2, 3
-     *
+     * | | | index 2, 3
      */
     @OptIn(ExperimentalFoundationApi::class)
     private fun composeGrid(
@@ -230,38 +216,30 @@
         prefetchStrategy: LazyGridPrefetchStrategy = DefaultLazyGridPrefetchStrategy()
     ) {
         rule.setContent {
-            state = rememberLazyGridState(
-                initialFirstVisibleItemIndex = firstItem,
-                initialFirstVisibleItemScrollOffset = itemOffset,
-                prefetchStrategy = prefetchStrategy
-            )
+            state =
+                rememberLazyGridState(
+                    initialFirstVisibleItemIndex = firstItem,
+                    initialFirstVisibleItemScrollOffset = itemOffset,
+                    prefetchStrategy = prefetchStrategy
+                )
             LazyGrid(
                 cells = 2,
-                Modifier
-                    .mainAxisSize(itemsSizeDp * 1.5f)
-                    .crossAxisSize(itemsSizeDp * 2),
+                Modifier.mainAxisSize(itemsSizeDp * 1.5f).crossAxisSize(itemsSizeDp * 2),
                 state,
             ) {
-                items(numItems.value) {
-                    Spacer(
-                        Modifier
-                            .size(itemsSizeDp)
-                            .testTag("$it")
-                    )
-                }
+                items(numItems.value) { Spacer(Modifier.size(itemsSizeDp).testTag("$it")) }
             }
         }
     }
 
-    /**
-     * LazyGridPrefetchStrategy that just records callbacks without scheduling prefetches.
-     */
+    /** LazyGridPrefetchStrategy that just records callbacks without scheduling prefetches. */
     private class RecordingLazyGridPrefetchStrategy(
         override val prefetchScheduler: PrefetchScheduler?
     ) : LazyGridPrefetchStrategy {
 
         sealed interface Callback {
             data class OnScroll(val delta: Float, val visibleIndices: List<Int>) : Callback
+
             data class OnVisibleItemsUpdated(val visibleIndices: List<Int>) : Callback
         }
 
@@ -289,8 +267,7 @@
      */
     private class PrefetchNextLargestLineIndexStrategy : LazyGridPrefetchStrategy {
 
-        private val handles =
-            mutableVectorOf<LazyLayoutPrefetchState.PrefetchHandle>()
+        private val handles = mutableVectorOf<LazyLayoutPrefetchState.PrefetchHandle>()
         private var prefetchIndex: Int = -1
 
         override fun LazyGridPrefetchScope.onScroll(delta: Float, layoutInfo: LazyGridLayoutInfo) {
diff --git a/compose/foundation/foundation/integration-tests/lazy-tests/src/androidTest/kotlin/androidx/compose/foundation/lazy/grid/LazyGridPrefetcherTest.kt b/compose/foundation/foundation/integration-tests/lazy-tests/src/androidTest/kotlin/androidx/compose/foundation/lazy/grid/LazyGridPrefetcherTest.kt
index 51d0eb14..966aa31 100644
--- a/compose/foundation/foundation/integration-tests/lazy-tests/src/androidTest/kotlin/androidx/compose/foundation/lazy/grid/LazyGridPrefetcherTest.kt
+++ b/compose/foundation/foundation/integration-tests/lazy-tests/src/androidTest/kotlin/androidx/compose/foundation/lazy/grid/LazyGridPrefetcherTest.kt
@@ -48,17 +48,17 @@
 
 @LargeTest
 @RunWith(Parameterized::class)
-class LazyGridPrefetcherTest(
-    orientation: Orientation
-) : BaseLazyGridTestWithOrientation(orientation) {
+class LazyGridPrefetcherTest(orientation: Orientation) :
+    BaseLazyGridTestWithOrientation(orientation) {
 
     companion object {
         @JvmStatic
         @Parameterized.Parameters(name = "{0}")
-        fun initParameters(): Array<Any> = arrayOf(
-            Orientation.Vertical,
-            Orientation.Horizontal,
-        )
+        fun initParameters(): Array<Any> =
+            arrayOf(
+                Orientation.Vertical,
+                Orientation.Horizontal,
+            )
     }
 
     val itemsSizePx = 30
@@ -68,9 +68,10 @@
     private val scheduler = TestPrefetchScheduler()
 
     @OptIn(ExperimentalFoundationApi::class)
-    private val strategy = object : LazyGridPrefetchStrategy by LazyGridPrefetchStrategy() {
-        override val prefetchScheduler: PrefetchScheduler = scheduler
-    }
+    private val strategy =
+        object : LazyGridPrefetchStrategy by LazyGridPrefetchStrategy() {
+            override val prefetchScheduler: PrefetchScheduler = scheduler
+        }
 
     @OptIn(ExperimentalFoundationApi::class)
     @Composable
@@ -85,79 +86,56 @@
     fun notPrefetchingForwardInitially() {
         composeGrid()
 
-        rule.onNodeWithTag("4")
-            .assertDoesNotExist()
+        rule.onNodeWithTag("4").assertDoesNotExist()
     }
 
     @Test
     fun notPrefetchingBackwardInitially() {
         composeGrid(firstItem = 4)
 
-        rule.onNodeWithTag("0")
-            .assertDoesNotExist()
+        rule.onNodeWithTag("0").assertDoesNotExist()
     }
 
     @Test
     fun prefetchingForwardAfterSmallScroll() {
         composeGrid()
 
-        rule.runOnIdle {
-            runBlocking {
-                state.scrollBy(5f)
-            }
-        }
+        rule.runOnIdle { runBlocking { state.scrollBy(5f) } }
 
         waitForPrefetch()
         waitForPrefetch()
 
-        rule.onNodeWithTag("4")
-            .assertExists()
-        rule.onNodeWithTag("5")
-            .assertExists()
-        rule.onNodeWithTag("6")
-            .assertDoesNotExist()
+        rule.onNodeWithTag("4").assertExists()
+        rule.onNodeWithTag("5").assertExists()
+        rule.onNodeWithTag("6").assertDoesNotExist()
     }
 
     @Test
     fun prefetchingBackwardAfterSmallScroll() {
         composeGrid(firstItem = 4, itemOffset = 10)
 
-        rule.runOnIdle {
-            runBlocking {
-                state.scrollBy(-5f)
-            }
-        }
+        rule.runOnIdle { runBlocking { state.scrollBy(-5f) } }
 
         waitForPrefetch()
         waitForPrefetch()
 
-        rule.onNodeWithTag("2")
-            .assertExists()
-        rule.onNodeWithTag("3")
-            .assertExists()
-        rule.onNodeWithTag("0")
-            .assertDoesNotExist()
+        rule.onNodeWithTag("2").assertExists()
+        rule.onNodeWithTag("3").assertExists()
+        rule.onNodeWithTag("0").assertDoesNotExist()
     }
 
     @Test
     fun prefetchingForwardAndBackward() {
         composeGrid(firstItem = 2)
 
-        rule.runOnIdle {
-            runBlocking {
-                state.scrollBy(5f)
-            }
-        }
+        rule.runOnIdle { runBlocking { state.scrollBy(5f) } }
 
         waitForPrefetch()
         waitForPrefetch()
 
-        rule.onNodeWithTag("6")
-            .assertExists()
-        rule.onNodeWithTag("7")
-            .assertExists()
-        rule.onNodeWithTag("0")
-            .assertDoesNotExist()
+        rule.onNodeWithTag("6").assertExists()
+        rule.onNodeWithTag("7").assertExists()
+        rule.onNodeWithTag("0").assertDoesNotExist()
 
         rule.runOnIdle {
             runBlocking {
@@ -169,23 +147,16 @@
         waitForPrefetch()
         waitForPrefetch()
 
-        rule.onNodeWithTag("0")
-            .assertExists()
-        rule.onNodeWithTag("1")
-            .assertExists()
-        rule.onNodeWithTag("6")
-            .assertDoesNotExist()
+        rule.onNodeWithTag("0").assertExists()
+        rule.onNodeWithTag("1").assertExists()
+        rule.onNodeWithTag("6").assertDoesNotExist()
     }
 
     @Test
     fun prefetchingForwardTwice() {
         composeGrid()
 
-        rule.runOnIdle {
-            runBlocking {
-                state.scrollBy(5f)
-            }
-        }
+        rule.runOnIdle { runBlocking { state.scrollBy(5f) } }
 
         waitForPrefetch()
 
@@ -198,23 +169,16 @@
 
         waitForPrefetch()
 
-        rule.onNodeWithTag("4")
-            .assertIsDisplayed()
-        rule.onNodeWithTag("6")
-            .assertExists()
-        rule.onNodeWithTag("8")
-            .assertDoesNotExist()
+        rule.onNodeWithTag("4").assertIsDisplayed()
+        rule.onNodeWithTag("6").assertExists()
+        rule.onNodeWithTag("8").assertDoesNotExist()
     }
 
     @Test
     fun prefetchingBackwardTwice() {
         composeGrid(firstItem = 8)
 
-        rule.runOnIdle {
-            runBlocking {
-                state.scrollBy(-5f)
-            }
-        }
+        rule.runOnIdle { runBlocking { state.scrollBy(-5f) } }
 
         waitForPrefetch()
 
@@ -227,36 +191,24 @@
 
         waitForPrefetch()
 
-        rule.onNodeWithTag("4")
-            .assertIsDisplayed()
-        rule.onNodeWithTag("6")
-            .assertIsDisplayed()
-        rule.onNodeWithTag("2")
-            .assertExists()
-        rule.onNodeWithTag("0")
-            .assertDoesNotExist()
+        rule.onNodeWithTag("4").assertIsDisplayed()
+        rule.onNodeWithTag("6").assertIsDisplayed()
+        rule.onNodeWithTag("2").assertExists()
+        rule.onNodeWithTag("0").assertDoesNotExist()
     }
 
     @Test
     fun prefetchingForwardAndBackwardReverseLayout() {
         composeGrid(firstItem = 2, reverseLayout = true)
 
-        rule.runOnIdle {
-            runBlocking {
-                state.scrollBy(5f)
-            }
-        }
+        rule.runOnIdle { runBlocking { state.scrollBy(5f) } }
 
         waitForPrefetch()
 
-        rule.onNodeWithTag("6")
-            .assertExists()
-        rule.onNodeWithTag("7")
-            .assertExists()
-        rule.onNodeWithTag("0")
-            .assertDoesNotExist()
-        rule.onNodeWithTag("1")
-            .assertDoesNotExist()
+        rule.onNodeWithTag("6").assertExists()
+        rule.onNodeWithTag("7").assertExists()
+        rule.onNodeWithTag("0").assertDoesNotExist()
+        rule.onNodeWithTag("1").assertDoesNotExist()
 
         rule.runOnIdle {
             runBlocking {
@@ -267,14 +219,10 @@
 
         waitForPrefetch()
 
-        rule.onNodeWithTag("0")
-            .assertExists()
-        rule.onNodeWithTag("1")
-            .assertExists()
-        rule.onNodeWithTag("6")
-            .assertDoesNotExist()
-        rule.onNodeWithTag("7")
-            .assertDoesNotExist()
+        rule.onNodeWithTag("0").assertExists()
+        rule.onNodeWithTag("1").assertExists()
+        rule.onNodeWithTag("6").assertDoesNotExist()
+        rule.onNodeWithTag("7").assertDoesNotExist()
     }
 
     @Test
@@ -286,40 +234,24 @@
             contentPadding = PaddingValues(mainAxis = halfItemSize)
         )
 
-        rule.onNodeWithTag("2")
-            .assertIsDisplayed()
-        rule.onNodeWithTag("4")
-            .assertIsDisplayed()
-        rule.onNodeWithTag("6")
-            .assertIsDisplayed()
-        rule.onNodeWithTag("0")
-            .assertDoesNotExist()
-        rule.onNodeWithTag("8")
-            .assertDoesNotExist()
+        rule.onNodeWithTag("2").assertIsDisplayed()
+        rule.onNodeWithTag("4").assertIsDisplayed()
+        rule.onNodeWithTag("6").assertIsDisplayed()
+        rule.onNodeWithTag("0").assertDoesNotExist()
+        rule.onNodeWithTag("8").assertDoesNotExist()
 
-        rule.runOnIdle {
-            runBlocking {
-                state.scrollBy(5f)
-            }
-        }
+        rule.runOnIdle { runBlocking { state.scrollBy(5f) } }
 
         waitForPrefetch()
 
-        rule.onNodeWithTag("8")
-            .assertExists()
-        rule.onNodeWithTag("0")
-            .assertDoesNotExist()
+        rule.onNodeWithTag("8").assertExists()
+        rule.onNodeWithTag("0").assertDoesNotExist()
 
-        rule.runOnIdle {
-            runBlocking {
-                state.scrollBy(-2f)
-            }
-        }
+        rule.runOnIdle { runBlocking { state.scrollBy(-2f) } }
 
         waitForPrefetch()
 
-        rule.onNodeWithTag("0")
-            .assertExists()
+        rule.onNodeWithTag("0").assertExists()
     }
 
     @Test
@@ -328,47 +260,43 @@
         lateinit var remeasure: Remeasurement
         rule.setContent {
             SubcomposeLayout(
-                modifier = object : RemeasurementModifier {
-                    override fun onRemeasurementAvailable(remeasurement: Remeasurement) {
-                        remeasure = remeasurement
-                    }
-                }
-            ) { constraints ->
-                val placeable = if (emit) {
-                    subcompose(Unit) {
-                        state = rememberState()
-                        LazyGrid(
-                            2,
-                            Modifier.mainAxisSize(itemsSizeDp * 1.5f),
-                            state,
-                        ) {
-                            items(1000) {
-                                Spacer(
-                                    Modifier.mainAxisSize(itemsSizeDp)
-                                )
-                            }
+                modifier =
+                    object : RemeasurementModifier {
+                        override fun onRemeasurementAvailable(remeasurement: Remeasurement) {
+                            remeasure = remeasurement
                         }
-                    }.first().measure(constraints)
-                } else {
-                    null
-                }
-                layout(constraints.maxWidth, constraints.maxHeight) {
-                    placeable?.place(0, 0)
-                }
+                    }
+            ) { constraints ->
+                val placeable =
+                    if (emit) {
+                        subcompose(Unit) {
+                                state = rememberState()
+                                LazyGrid(
+                                    2,
+                                    Modifier.mainAxisSize(itemsSizeDp * 1.5f),
+                                    state,
+                                ) {
+                                    items(1000) { Spacer(Modifier.mainAxisSize(itemsSizeDp)) }
+                                }
+                            }
+                            .first()
+                            .measure(constraints)
+                    } else {
+                        null
+                    }
+                layout(constraints.maxWidth, constraints.maxHeight) { placeable?.place(0, 0) }
             }
         }
 
         rule.runOnIdle {
             // this will schedule the prefetching
-            runBlocking(AutoTestFrameClock()) {
-                state.scrollBy(itemsSizePx.toFloat())
-            }
+            runBlocking(AutoTestFrameClock()) { state.scrollBy(itemsSizePx.toFloat()) }
             // then we synchronously dispose LazyColumn
             emit = false
             remeasure.forceRemeasure()
         }
 
-        rule.runOnIdle { }
+        rule.runOnIdle {}
     }
 
     @Test
@@ -405,9 +333,7 @@
         rule.waitForIdle()
         rule.waitForIdle()
 
-        rule.runOnIdle {
-            Truth.assertThat(composedItems).doesNotContain(3)
-        }
+        rule.runOnIdle { Truth.assertThat(composedItems).doesNotContain(3) }
     }
 
     @Test
@@ -439,15 +365,11 @@
             }
         }
 
-        rule.runOnIdle {
-            assertThat(activeNodes).doesNotContain(6)
-        }
+        rule.runOnIdle { assertThat(activeNodes).doesNotContain(6) }
     }
 
     private fun waitForPrefetch() {
-        rule.runOnIdle {
-            scheduler.executeActiveRequests()
-        }
+        rule.runOnIdle { scheduler.executeActiveRequests() }
     }
 
     private val activeNodes = mutableSetOf<Int>()
@@ -459,10 +381,11 @@
         contentPadding: PaddingValues = PaddingValues(0.dp)
     ) {
         rule.setContent {
-            state = rememberState(
-                initialFirstVisibleItemIndex = firstItem,
-                initialFirstVisibleItemScrollOffset = itemOffset
-            )
+            state =
+                rememberState(
+                    initialFirstVisibleItemIndex = firstItem,
+                    initialFirstVisibleItemScrollOffset = itemOffset
+                )
             LazyGrid(
                 2,
                 Modifier.mainAxisSize(itemsSizeDp * 1.5f),
@@ -473,20 +396,15 @@
                 items(100) {
                     DisposableEffect(it) {
                         activeNodes.add(it)
-                        onDispose {
-                            activeNodes.remove(it)
-                        }
+                        onDispose { activeNodes.remove(it) }
                     }
                     Spacer(
-                        Modifier
-                            .mainAxisSize(itemsSizeDp)
-                            .testTag("$it")
-                            .layout { measurable, constraints ->
-                                val placeable = measurable.measure(constraints)
-                                layout(placeable.width, placeable.height) {
-                                    placeable.place(0, 0)
-                                }
-                            }
+                        Modifier.mainAxisSize(itemsSizeDp).testTag("$it").layout {
+                            measurable,
+                            constraints ->
+                            val placeable = measurable.measure(constraints)
+                            layout(placeable.width, placeable.height) { placeable.place(0, 0) }
+                        }
                     )
                 }
             }
diff --git a/compose/foundation/foundation/integration-tests/lazy-tests/src/androidTest/kotlin/androidx/compose/foundation/lazy/grid/LazyGridRequestScrollTest.kt b/compose/foundation/foundation/integration-tests/lazy-tests/src/androidTest/kotlin/androidx/compose/foundation/lazy/grid/LazyGridRequestScrollTest.kt
index b696aca4..05153f4 100644
--- a/compose/foundation/foundation/integration-tests/lazy-tests/src/androidTest/kotlin/androidx/compose/foundation/lazy/grid/LazyGridRequestScrollTest.kt
+++ b/compose/foundation/foundation/integration-tests/lazy-tests/src/androidTest/kotlin/androidx/compose/foundation/lazy/grid/LazyGridRequestScrollTest.kt
@@ -49,9 +49,7 @@
 class LazyGridRequestScrollTest(private val orientation: Orientation) :
     BaseLazyGridTestWithOrientation(orientation) {
 
-    private val itemSize = with(rule.density) {
-        100.toDp()
-    }
+    private val itemSize = with(rule.density) { 100.toDp() }
 
     @Test
     fun requestScrollToItem_withIndex0_itemsPrepended_scrollsToNewFirstItem() {
@@ -62,33 +60,21 @@
         rule.setContent {
             state = rememberLazyGridState()
 
-            LazyGrid(
-                modifier = Modifier.size(itemSize * 2.5f),
-                cells = 3,
-                state = state
-            ) {
-                items(list, key = { it }) {
-                    Item(remember { "$it" })
-                }
+            LazyGrid(modifier = Modifier.size(itemSize * 2.5f), cells = 3, state = state) {
+                items(list, key = { it }) { Item(remember { "$it" }) }
 
-                Snapshot.withoutReadObservation {
-                    state.requestScrollToItem(index = 0)
-                }
+                Snapshot.withoutReadObservation { state.requestScrollToItem(index = 0) }
             }
         }
 
         // When the list is updated by prepending from 0 to 9, such that the new list contains
         // from 0 to 15.
-        rule.runOnIdle {
-            list = (0..15).toList()
-        }
+        rule.runOnIdle { list = (0..15).toList() }
 
         // Then we are scrolled to the start where the visible items are 0, 1, and 2.
         rule.runOnIdle {
             Truth.assertThat(state.firstVisibleItemIndex).isEqualTo(0)
-            Truth.assertThat(
-                state.visibleKeys
-            ).isEqualTo(listOf(0, 1, 2, 3, 4, 5, 6, 7, 8))
+            Truth.assertThat(state.visibleKeys).isEqualTo(listOf(0, 1, 2, 3, 4, 5, 6, 7, 8))
         }
     }
 
@@ -101,31 +87,27 @@
         rule.setContent {
             state = rememberLazyGridState()
 
-            LazyGrid(
-                modifier = Modifier.size(itemSize * 2.5f),
-                cells = 3,
-                state = state
-            ) {
-                items(list, key = { it }) {
-                    Item(remember { "$it" })
-                }
+            LazyGrid(modifier = Modifier.size(itemSize * 2.5f), cells = 3, state = state) {
+                items(list, key = { it }) { Item(remember { "$it" }) }
 
-                Snapshot.withoutReadObservation {
-                    state.requestScrollToItem(index = 0)
-                }
+                Snapshot.withoutReadObservation { state.requestScrollToItem(index = 0) }
             }
         }
 
         // When we scroll towards the end very quickly.
         rule.onNode(hasScrollAction()).performTouchInput {
             swipeWithVelocity(
-                start = when (orientation) {
-                    Orientation.Vertical -> bottomCenter
-                    Orientation.Horizontal -> centerRight
-                }, end = when (orientation) {
-                    Orientation.Vertical -> topCenter
-                    Orientation.Horizontal -> centerLeft
-                }, endVelocity = 5_000F
+                start =
+                    when (orientation) {
+                        Orientation.Vertical -> bottomCenter
+                        Orientation.Horizontal -> centerRight
+                    },
+                end =
+                    when (orientation) {
+                        Orientation.Vertical -> topCenter
+                        Orientation.Horizontal -> centerLeft
+                    },
+                endVelocity = 5_000F
             )
         }
 
@@ -133,9 +115,7 @@
         // scrolled back to the start.
         rule.runOnIdle {
             Truth.assertThat(state.firstVisibleItemIndex).isNotEqualTo(0)
-            Truth.assertThat(
-                state.visibleKeys
-            ).isEqualTo(list.takeLast(9))
+            Truth.assertThat(state.visibleKeys).isEqualTo(list.takeLast(9))
         }
     }
 
@@ -163,22 +143,21 @@
             fun TestContent(list: List<Int>) {
                 LazyGrid(
                     cells = GridCells.FixedSize(itemSize),
-                    modifier = Modifier
-                        .width(listSize)
-                        .height(listSize), state = state, reverseLayout = true
+                    modifier = Modifier.width(listSize).height(listSize),
+                    state = state,
+                    reverseLayout = true
                 ) {
-                    items(list, key = { it }) {
-                        Item(remember { "$it" })
-                    }
+                    items(list, key = { it }) { Item(remember { "$it" }) }
                 }
 
                 SideEffect {
                     val firstMessageChanged = state.firstVisibleItemKey() != list.firstOrNull()
                     if (!state.canScrollBackward && firstMessageChanged) {
                         // This scrolls to the start of the first item.
-                        state.requestScrollToItem(index = 1, scrollOffset = with(rule.density) {
-                            -listSize.roundToPx()
-                        })
+                        state.requestScrollToItem(
+                            index = 1,
+                            scrollOffset = with(rule.density) { -listSize.roundToPx() }
+                        )
                     }
                 }
             }
@@ -188,9 +167,7 @@
         rule.onNode(hasScrollAction()).performScrollToIndex(0)
 
         // When the list is updated, prepending items 0 to 2 so the list contains from 0 to 30.
-        rule.runOnIdle {
-            list = (0..30).toList()
-        }
+        rule.runOnIdle { list = (0..30).toList() }
 
         // Then the first visible item has index 0, its key is 0, and it's scrolled to the start
         // of that item (since we're laying out from bottom-to-top/right-to-left, we want the offset
@@ -201,9 +178,7 @@
                 Truth.assertThat(state.firstVisibleItemScrollOffset)
                     .isEqualTo(itemSize.roundToPx() - listSize.roundToPx())
             }
-            Truth.assertThat(
-                state.visibleKeys
-            ).isEqualTo(listOf(0))
+            Truth.assertThat(state.visibleKeys).isEqualTo(listOf(0))
         }
     }
 
@@ -221,19 +196,11 @@
             // triggers SideEffect.
             @Composable
             fun TestContent(list: List<Int>) {
-                LazyGrid(
-                    modifier = Modifier.size(itemSize * 2.5f),
-                    cells = 3,
-                    state = state
-                ) {
-                    items(list, key = { it }) {
-                        Item(remember { "$it" })
-                    }
+                LazyGrid(modifier = Modifier.size(itemSize * 2.5f), cells = 3, state = state) {
+                    items(list, key = { it }) { Item(remember { "$it" }) }
                 }
 
-                SideEffect {
-                    state.requestScrollToItem(index = state.firstVisibleItemIndex)
-                }
+                SideEffect { state.requestScrollToItem(index = state.firstVisibleItemIndex) }
             }
 
             TestContent(list = list)
@@ -250,9 +217,7 @@
         // (24, 25, 5).
         rule.runOnIdle {
             Truth.assertThat(state.firstVisibleItemIndex).isEqualTo(6)
-            Truth.assertThat(
-                state.visibleKeys
-            ).isEqualTo(listOf(7, 8, 9, 10, 11, 12, 13, 14, 15))
+            Truth.assertThat(state.visibleKeys).isEqualTo(listOf(7, 8, 9, 10, 11, 12, 13, 14, 15))
         }
     }
 
@@ -270,14 +235,8 @@
             // triggers SideEffect.
             @Composable
             fun TestContent(list: List<Int>) {
-                LazyGrid(
-                    cells = 3,
-                    modifier = Modifier.size(itemSize * 2.5f),
-                    state = state
-                ) {
-                    items(list, key = { it }) {
-                        Item(remember { "$it" })
-                    }
+                LazyGrid(cells = 3, modifier = Modifier.size(itemSize * 2.5f), state = state) {
+                    items(list, key = { it }) { Item(remember { "$it" }) }
                 }
 
                 SideEffect {
@@ -292,16 +251,13 @@
         rule.onNode(hasScrollAction()).performScrollToIndex(15)
 
         // When the list is updated with the first item removed (now from 1 to 35).
-        rule.runOnIdle {
-            list = (1..35).toList()
-        }
+        rule.runOnIdle { list = (1..35).toList() }
 
         // Then first item is index is still 15, the items have shifted back one to (16, 17, 18).
         rule.runOnIdle {
             Truth.assertThat(state.firstVisibleItemIndex).isEqualTo(15)
-            Truth.assertThat(
-                state.visibleKeys
-            ).isEqualTo(listOf(16, 17, 18, 19, 20, 21, 22, 23, 24))
+            Truth.assertThat(state.visibleKeys)
+                .isEqualTo(listOf(16, 17, 18, 19, 20, 21, 22, 23, 24))
         }
     }
 
@@ -319,9 +275,7 @@
                 cells = GridCells.FixedSize(itemSize),
                 state = state
             ) {
-                items(list, key = { it }) {
-                    Item(remember { "$it" })
-                }
+                items(list, key = { it }) { Item(remember { "$it" }) }
             }
         }
 
@@ -345,14 +299,8 @@
         rule.setContent {
             state = rememberLazyGridState()
 
-            LazyGrid(
-                modifier = Modifier.size(itemSize * 2.5f),
-                cells = 3,
-                state = state
-            ) {
-                items(list, key = { it }) {
-                    Item(remember { "$it" })
-                }
+            LazyGrid(modifier = Modifier.size(itemSize * 2.5f), cells = 3, state = state) {
+                items(list, key = { it }) { Item(remember { "$it" }) }
             }
         }
 
@@ -370,9 +318,8 @@
         // 22, 23, 24, 25, 26, 27, 28, 29, 30
         rule.runOnIdle {
             Truth.assertThat(state.firstVisibleItemIndex).isEqualTo(21)
-            Truth.assertThat(
-                state.visibleKeys
-            ).isEqualTo(listOf(21, 22, 23, 24, 25, 26, 27, 28, 29))
+            Truth.assertThat(state.visibleKeys)
+                .isEqualTo(listOf(21, 22, 23, 24, 25, 26, 27, 28, 29))
         }
     }
 
@@ -391,9 +338,7 @@
                 cells = GridCells.FixedSize(itemSize),
                 state = state
             ) {
-                items(15, key = { it }) {
-                    Item(remember { "$it" })
-                }
+                items(15, key = { it }) { Item(remember { "$it" }) }
             }
         }
 
@@ -410,9 +355,7 @@
                 }
             }
         }
-        rule.runOnIdle {
-            state.requestScrollToItem(index = 0)
-        }
+        rule.runOnIdle { state.requestScrollToItem(index = 0) }
 
         // Then the scroll was canceled.
         rule.waitUntil { canceled }
@@ -429,14 +372,8 @@
         rule.setContent {
             state = rememberLazyGridState()
 
-            LazyGrid(
-                modifier = Modifier.size(itemSize * 2.5f),
-                cells = 3,
-                state = state
-            ) {
-                items(list, key = { it }) {
-                    Item(remember { "$it" })
-                }
+            LazyGrid(modifier = Modifier.size(itemSize * 2.5f), cells = 3, state = state) {
+                items(list, key = { it }) { Item(remember { "$it" }) }
 
                 Snapshot.withoutReadObservation {
                     if (state.firstVisibleItemIndex == 0) {
@@ -445,23 +382,17 @@
                 }
             }
         }
-        rule.runOnIdle {
-            list = (0..20).toList()
-        }
+        rule.runOnIdle { list = (0..20).toList() }
         rule.onNode(hasScrollAction()).performScrollToIndex(3)
 
         // When item 3 moves to the end of the list.
-        rule.runOnIdle {
-            list = listOf(0, 1, 2) + (4..20).toList() + listOf(3)
-        }
+        rule.runOnIdle { list = listOf(0, 1, 2) + (4..20).toList() + listOf(3) }
 
         // Then we are scrolled to the end where the visible items are
         // 13, 14, 15, 16, 17, 18, 19, 20, 3.
         rule.runOnIdle {
             Truth.assertThat(state.firstVisibleItemIndex).isEqualTo(list.size - 9)
-            Truth.assertThat(
-                state.visibleKeys
-            ).isEqualTo(listOf(13, 14, 15, 16, 17, 18, 19, 20, 3))
+            Truth.assertThat(state.visibleKeys).isEqualTo(listOf(13, 14, 15, 16, 17, 18, 19, 20, 3))
         }
     }
 
@@ -469,11 +400,7 @@
 
     @Composable
     private fun Item(tag: String) {
-        Spacer(
-            Modifier
-                .testTag(tag)
-                .size(itemSize)
-        )
+        Spacer(Modifier.testTag(tag).size(itemSize))
     }
 
     companion object {
diff --git a/compose/foundation/foundation/integration-tests/lazy-tests/src/androidTest/kotlin/androidx/compose/foundation/lazy/grid/LazyGridSlotsReuseTest.kt b/compose/foundation/foundation/integration-tests/lazy-tests/src/androidTest/kotlin/androidx/compose/foundation/lazy/grid/LazyGridSlotsReuseTest.kt
index dc3049d..5e0c8d9 100644
--- a/compose/foundation/foundation/integration-tests/lazy-tests/src/androidTest/kotlin/androidx/compose/foundation/lazy/grid/LazyGridSlotsReuseTest.kt
+++ b/compose/foundation/foundation/integration-tests/lazy-tests/src/androidTest/kotlin/androidx/compose/foundation/lazy/grid/LazyGridSlotsReuseTest.kt
@@ -41,8 +41,7 @@
 @RunWith(AndroidJUnit4::class)
 class LazyGridSlotsReuseTest {
 
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
     val itemsSizePx = 30f
     val itemsSizeDp = with(rule.density) { itemsSizePx.toDp() }
@@ -52,30 +51,17 @@
         lateinit var state: LazyGridState
         rule.setContent {
             state = rememberLazyGridState()
-            LazyVerticalGrid(
-                GridCells.Fixed(1),
-                Modifier.height(itemsSizeDp * 1.5f),
-                state
-            ) {
-                items(100) {
-                    Spacer(Modifier.height(itemsSizeDp).fillMaxWidth().testTag("$it"))
-                }
+            LazyVerticalGrid(GridCells.Fixed(1), Modifier.height(itemsSizeDp * 1.5f), state) {
+                items(100) { Spacer(Modifier.height(itemsSizeDp).fillMaxWidth().testTag("$it")) }
             }
         }
 
-        rule.onNodeWithTag("0")
-            .assertIsDisplayed()
+        rule.onNodeWithTag("0").assertIsDisplayed()
 
-        rule.runOnIdle {
-            runBlocking {
-                state.scrollToItem(1)
-            }
-        }
+        rule.runOnIdle { runBlocking { state.scrollToItem(1) } }
 
-        rule.onNodeWithTag("0")
-            .assertIsDeactivated()
-        rule.onNodeWithTag("1")
-            .assertIsDisplayed()
+        rule.onNodeWithTag("0").assertIsDeactivated()
+        rule.onNodeWithTag("1").assertIsDisplayed()
     }
 
     @Test
@@ -83,34 +69,19 @@
         lateinit var state: LazyGridState
         rule.setContent {
             state = rememberLazyGridState()
-            LazyVerticalGrid(
-                GridCells.Fixed(1),
-                Modifier.height(itemsSizeDp * 1.5f),
-                state
-            ) {
-                items(100) {
-                    Spacer(Modifier.height(itemsSizeDp).fillMaxWidth().testTag("$it"))
-                }
+            LazyVerticalGrid(GridCells.Fixed(1), Modifier.height(itemsSizeDp * 1.5f), state) {
+                items(100) { Spacer(Modifier.height(itemsSizeDp).fillMaxWidth().testTag("$it")) }
             }
         }
 
-        rule.onNodeWithTag("0")
-            .assertIsDisplayed()
-        rule.onNodeWithTag("1")
-            .assertIsDisplayed()
+        rule.onNodeWithTag("0").assertIsDisplayed()
+        rule.onNodeWithTag("1").assertIsDisplayed()
 
-        rule.runOnIdle {
-            runBlocking {
-                state.scrollToItem(2)
-            }
-        }
+        rule.runOnIdle { runBlocking { state.scrollToItem(2) } }
 
-        rule.onNodeWithTag("0")
-            .assertIsDeactivated()
-        rule.onNodeWithTag("1")
-            .assertIsDeactivated()
-        rule.onNodeWithTag("2")
-            .assertIsDisplayed()
+        rule.onNodeWithTag("0").assertIsDeactivated()
+        rule.onNodeWithTag("1").assertIsDeactivated()
+        rule.onNodeWithTag("2").assertIsDisplayed()
     }
 
     @Test
@@ -123,26 +94,15 @@
                 Modifier.height(itemsSizeDp * (DefaultMaxItemsToRetain + 0.5f)),
                 state
             ) {
-                items(100) {
-                    Spacer(Modifier.height(itemsSizeDp).fillMaxWidth().testTag("$it"))
-                }
+                items(100) { Spacer(Modifier.height(itemsSizeDp).fillMaxWidth().testTag("$it")) }
             }
         }
 
-        rule.runOnIdle {
-            runBlocking {
-                state.scrollToItem(DefaultMaxItemsToRetain + 1)
-            }
-        }
+        rule.runOnIdle { runBlocking { state.scrollToItem(DefaultMaxItemsToRetain + 1) } }
 
-        repeat(DefaultMaxItemsToRetain) {
-            rule.onNodeWithTag("$it")
-                .assertIsDeactivated()
-        }
-        rule.onNodeWithTag("$DefaultMaxItemsToRetain")
-            .assertDoesNotExist()
-        rule.onNodeWithTag("${DefaultMaxItemsToRetain + 1}")
-            .assertIsDisplayed()
+        repeat(DefaultMaxItemsToRetain) { rule.onNodeWithTag("$it").assertIsDeactivated() }
+        rule.onNodeWithTag("$DefaultMaxItemsToRetain").assertDoesNotExist()
+        rule.onNodeWithTag("${DefaultMaxItemsToRetain + 1}").assertIsDisplayed()
     }
 
     @Test
@@ -150,21 +110,13 @@
         lateinit var state: LazyGridState
         rule.setContent {
             state = rememberLazyGridState()
-            LazyVerticalGrid(
-                GridCells.Fixed(1),
-                Modifier.height(itemsSizeDp * 1.5f),
-                state
-            ) {
-                items(100) {
-                    Spacer(Modifier.height(itemsSizeDp).fillMaxWidth().testTag("$it"))
-                }
+            LazyVerticalGrid(GridCells.Fixed(1), Modifier.height(itemsSizeDp * 1.5f), state) {
+                items(100) { Spacer(Modifier.height(itemsSizeDp).fillMaxWidth().testTag("$it")) }
             }
         }
 
-        rule.onNodeWithTag("0")
-            .assertIsDisplayed()
-        rule.onNodeWithTag("1")
-            .assertIsDisplayed()
+        rule.onNodeWithTag("0").assertIsDisplayed()
+        rule.onNodeWithTag("1").assertIsDisplayed()
 
         rule.runOnIdle {
             runBlocking {
@@ -178,20 +130,15 @@
         }
 
         // recycled
-        rule.onNodeWithTag("1")
-            .assertDoesNotExist()
+        rule.onNodeWithTag("1").assertDoesNotExist()
 
         // in buffer
-        rule.onNodeWithTag("0")
-            .assertIsDeactivated()
-        rule.onNodeWithTag("2")
-            .assertIsDeactivated()
+        rule.onNodeWithTag("0").assertIsDeactivated()
+        rule.onNodeWithTag("2").assertIsDeactivated()
 
         // visible
-        rule.onNodeWithTag("3")
-            .assertIsDisplayed()
-        rule.onNodeWithTag("4")
-            .assertIsDisplayed()
+        rule.onNodeWithTag("3").assertIsDisplayed()
+        rule.onNodeWithTag("4").assertIsDisplayed()
     }
 
     @Test
@@ -199,14 +146,8 @@
         lateinit var state: LazyGridState
         rule.setContent {
             state = rememberLazyGridState()
-            LazyVerticalGrid(
-                GridCells.Fixed(1),
-                Modifier.height(itemsSizeDp * 1.5f),
-                state
-            ) {
-                items(100) {
-                    Spacer(Modifier.height(itemsSizeDp).fillMaxWidth().testTag("$it"))
-                }
+            LazyVerticalGrid(GridCells.Fixed(1), Modifier.height(itemsSizeDp * 1.5f), state) {
+                items(100) { Spacer(Modifier.height(itemsSizeDp).fillMaxWidth().testTag("$it")) }
             }
         }
         rule.runOnIdle {
@@ -219,22 +160,16 @@
         }
 
         // recycled
-        rule.onNodeWithTag("0")
-            .assertDoesNotExist()
-        rule.onNodeWithTag("1")
-            .assertDoesNotExist()
-        rule.onNodeWithTag("2")
-            .assertDoesNotExist()
+        rule.onNodeWithTag("0").assertDoesNotExist()
+        rule.onNodeWithTag("1").assertDoesNotExist()
+        rule.onNodeWithTag("2").assertDoesNotExist()
 
         // in buffer
-        rule.onNodeWithTag("3")
-            .assertIsDeactivated()
+        rule.onNodeWithTag("3").assertIsDeactivated()
 
         // visible
-        rule.onNodeWithTag("4")
-            .assertIsDisplayed()
-        rule.onNodeWithTag("5")
-            .assertIsDisplayed()
+        rule.onNodeWithTag("4").assertIsDisplayed()
+        rule.onNodeWithTag("5").assertIsDisplayed()
     }
 
     @Test
@@ -242,14 +177,8 @@
         lateinit var state: LazyGridState
         rule.setContent {
             state = rememberLazyGridState(10)
-            LazyVerticalGrid(
-                GridCells.Fixed(1),
-                Modifier.height(itemsSizeDp * 1.5f),
-                state
-            ) {
-                items(100) {
-                    Spacer(Modifier.height(itemsSizeDp).fillMaxWidth().testTag("$it"))
-                }
+            LazyVerticalGrid(GridCells.Fixed(1), Modifier.height(itemsSizeDp * 1.5f), state) {
+                items(100) { Spacer(Modifier.height(itemsSizeDp).fillMaxWidth().testTag("$it")) }
             }
         }
         rule.runOnIdle {
@@ -259,16 +188,12 @@
         }
 
         // in buffer
-        rule.onNodeWithTag("10")
-            .assertIsDeactivated()
-        rule.onNodeWithTag("11")
-            .assertIsDeactivated()
+        rule.onNodeWithTag("10").assertIsDeactivated()
+        rule.onNodeWithTag("11").assertIsDeactivated()
 
         // visible
-        rule.onNodeWithTag("8")
-            .assertIsDisplayed()
-        rule.onNodeWithTag("9")
-            .assertIsDisplayed()
+        rule.onNodeWithTag("8").assertIsDisplayed()
+        rule.onNodeWithTag("9").assertIsDisplayed()
     }
 
     @Test
@@ -276,14 +201,8 @@
         lateinit var state: LazyGridState
         rule.setContent {
             state = rememberLazyGridState(10)
-            LazyVerticalGrid(
-                GridCells.Fixed(1),
-                Modifier.height(itemsSizeDp * 1.5f),
-                state
-            ) {
-                items(100) {
-                    Spacer(Modifier.height(itemsSizeDp).fillMaxWidth().testTag("$it"))
-                }
+            LazyVerticalGrid(GridCells.Fixed(1), Modifier.height(itemsSizeDp * 1.5f), state) {
+                items(100) { Spacer(Modifier.height(itemsSizeDp).fillMaxWidth().testTag("$it")) }
             }
         }
         rule.runOnIdle {
@@ -295,14 +214,11 @@
         }
 
         // in buffer
-        rule.onNodeWithTag("8")
-            .assertIsDeactivated()
+        rule.onNodeWithTag("8").assertIsDeactivated()
 
         // visible
-        rule.onNodeWithTag("6")
-            .assertIsDisplayed()
-        rule.onNodeWithTag("7")
-            .assertIsDisplayed()
+        rule.onNodeWithTag("6").assertIsDisplayed()
+        rule.onNodeWithTag("7").assertIsDisplayed()
     }
 
     @Test
@@ -311,41 +227,31 @@
         var counter0 = 0
         var counter1 = 0
 
-        val measureCountModifier0 = Modifier.layout { measurable, constraints ->
-            counter0++
-            val placeable = measurable.measure(constraints)
-            layout(placeable.width, placeable.height) {
-                placeable.place(IntOffset.Zero)
+        val measureCountModifier0 =
+            Modifier.layout { measurable, constraints ->
+                counter0++
+                val placeable = measurable.measure(constraints)
+                layout(placeable.width, placeable.height) { placeable.place(IntOffset.Zero) }
             }
-        }
 
-        val measureCountModifier1 = Modifier.layout { measurable, constraints ->
-            counter1++
-            val placeable = measurable.measure(constraints)
-            layout(placeable.width, placeable.height) {
-                placeable.place(IntOffset.Zero)
+        val measureCountModifier1 =
+            Modifier.layout { measurable, constraints ->
+                counter1++
+                val placeable = measurable.measure(constraints)
+                layout(placeable.width, placeable.height) { placeable.place(IntOffset.Zero) }
             }
-        }
 
         rule.setContent {
             state = rememberLazyGridState()
-            LazyVerticalGrid(
-                GridCells.Fixed(1),
-                Modifier.height(itemsSizeDp * 1.5f),
-                state
-            ) {
+            LazyVerticalGrid(GridCells.Fixed(1), Modifier.height(itemsSizeDp * 1.5f), state) {
                 items(100) {
-                    val modifier = when (it) {
-                        0 -> measureCountModifier0
-                        1 -> measureCountModifier1
-                        else -> Modifier
-                    }
-                    Spacer(
-                        Modifier
-                            .height(itemsSizeDp)
-                            .testTag("$it")
-                            .then(modifier)
-                    )
+                    val modifier =
+                        when (it) {
+                            0 -> measureCountModifier0
+                            1 -> measureCountModifier1
+                            else -> Modifier
+                        }
+                    Spacer(Modifier.height(itemsSizeDp).testTag("$it").then(modifier))
                 }
             }
         }
@@ -360,20 +266,18 @@
 
         rule.runOnIdle {
             Truth.assertWithMessage("Item 0 measured $counter0 times, expected 0.")
-                .that(counter0).isEqualTo(0)
+                .that(counter0)
+                .isEqualTo(0)
             Truth.assertWithMessage("Item 1 measured $counter1 times, expected 0.")
-                .that(counter1).isEqualTo(0)
+                .that(counter1)
+                .isEqualTo(0)
         }
 
-        rule.onNodeWithTag("0")
-            .assertIsDisplayed()
-        rule.onNodeWithTag("1")
-            .assertIsDisplayed()
+        rule.onNodeWithTag("0").assertIsDisplayed()
+        rule.onNodeWithTag("1").assertIsDisplayed()
 
-        rule.onNodeWithTag("2")
-            .assertIsDeactivated()
-        rule.onNodeWithTag("3")
-            .assertIsDeactivated()
+        rule.onNodeWithTag("2").assertIsDeactivated()
+        rule.onNodeWithTag("3").assertIsDeactivated()
     }
 
     @Test
@@ -388,44 +292,31 @@
                 Modifier.height(itemsSizeDp * (visibleItemsCount - 0.5f)),
                 state
             ) {
-                items(
-                    100,
-                    contentType = { if (it >= startOfType1) 1 else 0 }
-                ) {
+                items(100, contentType = { if (it >= startOfType1) 1 else 0 }) {
                     Spacer(Modifier.height(itemsSizeDp).fillMaxWidth().testTag("$it"))
                 }
             }
         }
 
         for (i in 0 until visibleItemsCount) {
-            rule.onNodeWithTag("$i")
-                .assertIsDisplayed()
+            rule.onNodeWithTag("$i").assertIsDisplayed()
         }
 
-        rule.runOnIdle {
-            runBlocking {
-                state.scrollToItem(visibleItemsCount)
-            }
-        }
+        rule.runOnIdle { runBlocking { state.scrollToItem(visibleItemsCount) } }
 
-        rule.onNodeWithTag("$visibleItemsCount")
-            .assertIsDisplayed()
+        rule.onNodeWithTag("$visibleItemsCount").assertIsDisplayed()
 
         // [DefaultMaxItemsToRetain] items of type 0 are left for reuse
         for (i in 0 until DefaultMaxItemsToRetain) {
-            rule.onNodeWithTag("$i")
-                .assertIsDeactivated()
+            rule.onNodeWithTag("$i").assertIsDeactivated()
         }
-        rule.onNodeWithTag("$DefaultMaxItemsToRetain")
-            .assertDoesNotExist()
+        rule.onNodeWithTag("$DefaultMaxItemsToRetain").assertDoesNotExist()
 
         // and 7 items of type 1
         for (i in startOfType1 until startOfType1 + DefaultMaxItemsToRetain) {
-            rule.onNodeWithTag("$i")
-                .assertIsDeactivated()
+            rule.onNodeWithTag("$i").assertIsDeactivated()
         }
-        rule.onNodeWithTag("${startOfType1 + DefaultMaxItemsToRetain}")
-            .assertDoesNotExist()
+        rule.onNodeWithTag("${startOfType1 + DefaultMaxItemsToRetain}").assertDoesNotExist()
     }
 
     @Test
@@ -433,23 +324,17 @@
         lateinit var state: LazyGridState
         rule.setContent {
             state = rememberLazyGridState()
-            LazyVerticalGrid(
-                GridCells.Fixed(1),
-                Modifier.height(itemsSizeDp * 2.5f),
-                state
-            ) {
-                val content = @Composable { tag: String ->
-                    Spacer(Modifier.height(itemsSizeDp).width(10.dp).testTag(tag))
-                }
-                item(contentType = "not-to-reuse-0") {
-                    content("0")
-                }
-                item(contentType = "reuse") {
-                    content("1")
-                }
+            LazyVerticalGrid(GridCells.Fixed(1), Modifier.height(itemsSizeDp * 2.5f), state) {
+                val content =
+                    @Composable { tag: String ->
+                        Spacer(Modifier.height(itemsSizeDp).width(10.dp).testTag(tag))
+                    }
+                item(contentType = "not-to-reuse-0") { content("0") }
+                item(contentType = "reuse") { content("1") }
                 items(
                     List(100) { it + 2 },
-                    contentType = { if (it == 10) "reuse" else "not-to-reuse-$it" }) {
+                    contentType = { if (it == 10) "reuse" else "not-to-reuse-$it" }
+                ) {
                     content("$it")
                 }
             }
@@ -462,10 +347,8 @@
             }
         }
 
-        rule.onNodeWithTag("0")
-            .assertIsDeactivated()
-        rule.onNodeWithTag("1")
-            .assertIsDeactivated()
+        rule.onNodeWithTag("0").assertIsDeactivated()
+        rule.onNodeWithTag("1").assertIsDeactivated()
 
         rule.runOnIdle {
             runBlocking {
@@ -474,16 +357,11 @@
             }
         }
 
-        rule.onNodeWithTag("0")
-            .assertIsDeactivated()
-        rule.onNodeWithTag("1")
-            .assertDoesNotExist()
-        rule.onNodeWithTag("9")
-            .assertIsDisplayed()
-        rule.onNodeWithTag("10")
-            .assertIsDisplayed()
-        rule.onNodeWithTag("11")
-            .assertIsDisplayed()
+        rule.onNodeWithTag("0").assertIsDeactivated()
+        rule.onNodeWithTag("1").assertDoesNotExist()
+        rule.onNodeWithTag("9").assertIsDisplayed()
+        rule.onNodeWithTag("10").assertIsDisplayed()
+        rule.onNodeWithTag("11").assertIsDisplayed()
     }
 }
 
diff --git a/compose/foundation/foundation/integration-tests/lazy-tests/src/androidTest/kotlin/androidx/compose/foundation/lazy/grid/LazyGridSpanTest.kt b/compose/foundation/foundation/integration-tests/lazy-tests/src/androidTest/kotlin/androidx/compose/foundation/lazy/grid/LazyGridSpanTest.kt
index 71da15f..1b28310 100644
--- a/compose/foundation/foundation/integration-tests/lazy-tests/src/androidTest/kotlin/androidx/compose/foundation/lazy/grid/LazyGridSpanTest.kt
+++ b/compose/foundation/foundation/integration-tests/lazy-tests/src/androidTest/kotlin/androidx/compose/foundation/lazy/grid/LazyGridSpanTest.kt
@@ -41,8 +41,7 @@
 @MediumTest
 @RunWith(AndroidJUnit4::class)
 class LazyGridSpanTest {
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
     @Test
     fun spans() {
@@ -97,22 +96,28 @@
             }
         }
 
-        rule.onNodeWithTag("0")
+        rule
+            .onNodeWithTag("0")
             .assertTopPositionInRootIsEqualTo(0.dp)
             .assertLeftPositionInRootIsEqualTo(0.dp)
-        rule.onNodeWithTag("1")
+        rule
+            .onNodeWithTag("1")
             .assertTopPositionInRootIsEqualTo(0.dp)
             .assertLeftPositionInRootIsEqualTo(columnWidth * 3)
-        rule.onNodeWithTag("2")
+        rule
+            .onNodeWithTag("2")
             .assertTopPositionInRootIsEqualTo(itemHeight)
             .assertLeftPositionInRootIsEqualTo(0.dp)
-        rule.onNodeWithTag("3")
+        rule
+            .onNodeWithTag("3")
             .assertTopPositionInRootIsEqualTo(itemHeight)
             .assertLeftPositionInRootIsEqualTo(columnWidth)
-        rule.onNodeWithTag("4")
+        rule
+            .onNodeWithTag("4")
             .assertTopPositionInRootIsEqualTo(itemHeight * 2)
             .assertLeftPositionInRootIsEqualTo(0.dp)
-        rule.onNodeWithTag("5")
+        rule
+            .onNodeWithTag("5")
             .assertTopPositionInRootIsEqualTo(itemHeight * 2)
             .assertLeftPositionInRootIsEqualTo(columnWidth)
     }
@@ -126,10 +131,11 @@
         rule.setContent {
             LazyVerticalGrid(
                 columns = GridCells.Fixed(columns),
-                modifier = Modifier.requiredSize(
-                    columnWidth * columns + spacing * (columns - 1),
-                    itemHeight
-                ),
+                modifier =
+                    Modifier.requiredSize(
+                        columnWidth * columns + spacing * (columns - 1),
+                        itemHeight
+                    ),
                 horizontalArrangement = Arrangement.spacedBy(spacing)
             ) {
                 items(
@@ -147,11 +153,13 @@
             }
         }
 
-        rule.onNodeWithTag("0")
+        rule
+            .onNodeWithTag("0")
             .assertTopPositionInRootIsEqualTo(0.dp)
             .assertLeftPositionInRootIsEqualTo(0.dp)
             .assertWidthIsEqualTo(columnWidth)
-        rule.onNodeWithTag("1")
+        rule
+            .onNodeWithTag("1")
             .assertTopPositionInRootIsEqualTo(0.dp)
             .assertLeftPositionInRootIsEqualTo(columnWidth + spacing)
             .assertWidthIsEqualTo(columnWidth * 3 + spacing * 2)
@@ -178,10 +186,12 @@
                 ) {
                     Box(Modifier.height(itemHeight).testTag("0"))
                 }
-                item(span = {
-                    if (maxCurrentLineSpan != 3) error("Wrong maxSpan")
-                    GridItemSpan(2)
-                }) {
+                item(
+                    span = {
+                        if (maxCurrentLineSpan != 3) error("Wrong maxSpan")
+                        GridItemSpan(2)
+                    }
+                ) {
                     Box(Modifier.height(itemHeight).testTag("1"))
                 }
                 items(
@@ -199,15 +209,18 @@
             }
         }
 
-        rule.onNodeWithTag("0")
+        rule
+            .onNodeWithTag("0")
             .assertTopPositionInRootIsEqualTo(0.dp)
             .assertLeftPositionInRootIsEqualTo(0.dp)
             .assertWidthIsEqualTo(columnWidth)
-        rule.onNodeWithTag("1")
+        rule
+            .onNodeWithTag("1")
             .assertTopPositionInRootIsEqualTo(0.dp)
             .assertLeftPositionInRootIsEqualTo(columnWidth)
             .assertWidthIsEqualTo(columnWidth * 2)
-        rule.onNodeWithTag("2")
+        rule
+            .onNodeWithTag("2")
             .assertTopPositionInRootIsEqualTo(0.dp)
             .assertLeftPositionInRootIsEqualTo(columnWidth * 3)
             .assertWidthIsEqualTo(columnWidth)
@@ -223,23 +236,28 @@
                 columns = GridCells.Fixed(columns),
                 modifier = Modifier.requiredSize(columnWidth * columns, itemHeight * 3)
             ) {
-                item(span = {
-                    if (maxCurrentLineSpan != 4) error("Wrong maxSpan")
-                    GridItemSpan(3)
-                }) {
+                item(
+                    span = {
+                        if (maxCurrentLineSpan != 4) error("Wrong maxSpan")
+                        GridItemSpan(3)
+                    }
+                ) {
                     Box(Modifier.height(itemHeight).testTag("0"))
                 }
                 items(
                     count = 4,
                     span = { index ->
-                        if (maxCurrentLineSpan != when (index) {
-                                0 -> 1
-                                1 -> 2
-                                2 -> 1
-                                3 -> 2
-                                else -> error("Wrong index")
-                            }
-                        ) error("Wrong maxSpan")
+                        if (
+                            maxCurrentLineSpan !=
+                                when (index) {
+                                    0 -> 1
+                                    1 -> 2
+                                    2 -> 1
+                                    3 -> 2
+                                    else -> error("Wrong index")
+                                }
+                        )
+                            error("Wrong maxSpan")
                         GridItemSpan(listOf(2, 1, 2, 2)[index])
                     }
                 ) {
@@ -248,23 +266,28 @@
             }
         }
 
-        rule.onNodeWithTag("0")
+        rule
+            .onNodeWithTag("0")
             .assertTopPositionInRootIsEqualTo(0.dp)
             .assertLeftPositionInRootIsEqualTo(0.dp)
             .assertWidthIsEqualTo(columnWidth * 3)
-        rule.onNodeWithTag("1")
+        rule
+            .onNodeWithTag("1")
             .assertTopPositionInRootIsEqualTo(itemHeight)
             .assertLeftPositionInRootIsEqualTo(0.dp)
             .assertWidthIsEqualTo(columnWidth * 2)
-        rule.onNodeWithTag("2")
+        rule
+            .onNodeWithTag("2")
             .assertTopPositionInRootIsEqualTo(itemHeight)
             .assertLeftPositionInRootIsEqualTo(columnWidth * 2)
             .assertWidthIsEqualTo(columnWidth)
-        rule.onNodeWithTag("3")
+        rule
+            .onNodeWithTag("3")
             .assertTopPositionInRootIsEqualTo(itemHeight * 2)
             .assertLeftPositionInRootIsEqualTo(0.dp)
             .assertWidthIsEqualTo(columnWidth * 2)
-        rule.onNodeWithTag("4")
+        rule
+            .onNodeWithTag("4")
             .assertTopPositionInRootIsEqualTo(itemHeight * 2)
             .assertLeftPositionInRootIsEqualTo(columnWidth * 2)
             .assertWidthIsEqualTo(columnWidth * 2)
@@ -285,17 +308,11 @@
                     item(span = { GridItemSpan(maxLineSpan) }) {
                         Box(Modifier.fillMaxWidth().height(1.dp))
                     }
-                    items(10) {
-                        Box(Modifier.fillMaxWidth().height(1.dp))
-                    }
+                    items(10) { Box(Modifier.fillMaxWidth().height(1.dp)) }
                 }
             }
         }
 
-        rule.runOnIdle {
-            runBlocking {
-                state.scrollToItem(state.layoutInfo.totalItemsCount)
-            }
-        }
+        rule.runOnIdle { runBlocking { state.scrollToItem(state.layoutInfo.totalItemsCount) } }
     }
 }
diff --git a/compose/foundation/foundation/integration-tests/lazy-tests/src/androidTest/kotlin/androidx/compose/foundation/lazy/grid/LazyGridTest.kt b/compose/foundation/foundation/integration-tests/lazy-tests/src/androidTest/kotlin/androidx/compose/foundation/lazy/grid/LazyGridTest.kt
index b94d36c..82e655a 100644
--- a/compose/foundation/foundation/integration-tests/lazy-tests/src/androidTest/kotlin/androidx/compose/foundation/lazy/grid/LazyGridTest.kt
+++ b/compose/foundation/foundation/integration-tests/lazy-tests/src/androidTest/kotlin/androidx/compose/foundation/lazy/grid/LazyGridTest.kt
@@ -92,18 +92,18 @@
 @OptIn(ExperimentalFoundationApi::class)
 @MediumTest
 @RunWith(Parameterized::class)
-class LazyGridTest(
-    private val orientation: Orientation
-) : BaseLazyGridTestWithOrientation(orientation) {
+class LazyGridTest(private val orientation: Orientation) :
+    BaseLazyGridTestWithOrientation(orientation) {
     private val LazyGridTag = "LazyGridTag"
 
     companion object {
         @JvmStatic
         @Parameterized.Parameters(name = "{0}")
-        fun initParameters(): Array<Any> = arrayOf(
-            Orientation.Vertical,
-            Orientation.Horizontal,
-        )
+        fun initParameters(): Array<Any> =
+            arrayOf(
+                Orientation.Vertical,
+                Orientation.Horizontal,
+            )
     }
 
     @Test
@@ -111,19 +111,10 @@
         val itemTestTag = "itemTestTag"
 
         rule.setContent {
-            LazyGrid(
-                cells = 3
-            ) {
-                item {
-                    Spacer(
-                        Modifier.size(10.dp).testTag(itemTestTag)
-                    )
-                }
-            }
+            LazyGrid(cells = 3) { item { Spacer(Modifier.size(10.dp).testTag(itemTestTag)) } }
         }
 
-        rule.onNodeWithTag(itemTestTag)
-            .assertIsDisplayed()
+        rule.onNodeWithTag(itemTestTag).assertIsDisplayed()
     }
 
     @Test
@@ -131,30 +122,20 @@
         val items = (1..5).map { it.toString() }
 
         rule.setContent {
-            LazyGrid(
-                cells = 3,
-                modifier = Modifier.axisSize(300.dp, 100.dp)
-            ) {
-                items(items) {
-                    Spacer(Modifier.mainAxisSize(101.dp).testTag(it))
-                }
+            LazyGrid(cells = 3, modifier = Modifier.axisSize(300.dp, 100.dp)) {
+                items(items) { Spacer(Modifier.mainAxisSize(101.dp).testTag(it)) }
             }
         }
 
-        rule.onNodeWithTag("1")
-            .assertIsDisplayed()
+        rule.onNodeWithTag("1").assertIsDisplayed()
 
-        rule.onNodeWithTag("2")
-            .assertIsDisplayed()
+        rule.onNodeWithTag("2").assertIsDisplayed()
 
-        rule.onNodeWithTag("3")
-            .assertIsDisplayed()
+        rule.onNodeWithTag("3").assertIsDisplayed()
 
-        rule.onNodeWithTag("4")
-            .assertDoesNotExist()
+        rule.onNodeWithTag("4").assertDoesNotExist()
 
-        rule.onNodeWithTag("5")
-            .assertDoesNotExist()
+        rule.onNodeWithTag("5").assertDoesNotExist()
     }
 
     @Test
@@ -162,36 +143,24 @@
         val items = (1..9).map { it.toString() }
 
         rule.setContentWithTestViewConfiguration {
-            LazyGrid(
-                cells = 3,
-                modifier = Modifier.mainAxisSize(100.dp).testTag(LazyGridTag)
-            ) {
-                items(items) {
-                    Spacer(Modifier.mainAxisSize(101.dp).testTag(it))
-                }
+            LazyGrid(cells = 3, modifier = Modifier.mainAxisSize(100.dp).testTag(LazyGridTag)) {
+                items(items) { Spacer(Modifier.mainAxisSize(101.dp).testTag(it)) }
             }
         }
 
-        rule.onNodeWithTag(LazyGridTag)
-            .scrollBy(offset = 50.dp)
+        rule.onNodeWithTag(LazyGridTag).scrollBy(offset = 50.dp)
 
-        rule.onNodeWithTag("4")
-            .assertIsDisplayed()
+        rule.onNodeWithTag("4").assertIsDisplayed()
 
-        rule.onNodeWithTag("5")
-            .assertIsDisplayed()
+        rule.onNodeWithTag("5").assertIsDisplayed()
 
-        rule.onNodeWithTag("6")
-            .assertIsDisplayed()
+        rule.onNodeWithTag("6").assertIsDisplayed()
 
-        rule.onNodeWithTag("7")
-            .assertIsNotDisplayed()
+        rule.onNodeWithTag("7").assertIsNotDisplayed()
 
-        rule.onNodeWithTag("8")
-            .assertIsNotDisplayed()
+        rule.onNodeWithTag("8").assertIsNotDisplayed()
 
-        rule.onNodeWithTag("9")
-            .assertIsNotDisplayed()
+        rule.onNodeWithTag("9").assertIsNotDisplayed()
     }
 
     @Test
@@ -199,45 +168,30 @@
         val items = (1..9).map { it.toString() }
 
         rule.setContentWithTestViewConfiguration {
-            LazyGrid(
-                cells = 3,
-                modifier = Modifier.mainAxisSize(200.dp).testTag(LazyGridTag)
-            ) {
-                items(items) {
-                    Spacer(Modifier.mainAxisSize(101.dp).testTag(it))
-                }
+            LazyGrid(cells = 3, modifier = Modifier.mainAxisSize(200.dp).testTag(LazyGridTag)) {
+                items(items) { Spacer(Modifier.mainAxisSize(101.dp).testTag(it)) }
             }
         }
 
-        rule.onNodeWithTag(LazyGridTag)
-            .scrollBy(offset = 103.dp)
+        rule.onNodeWithTag(LazyGridTag).scrollBy(offset = 103.dp)
 
-        rule.onNodeWithTag("1")
-            .assertIsNotDisplayed()
+        rule.onNodeWithTag("1").assertIsNotDisplayed()
 
-        rule.onNodeWithTag("2")
-            .assertIsNotDisplayed()
+        rule.onNodeWithTag("2").assertIsNotDisplayed()
 
-        rule.onNodeWithTag("3")
-            .assertIsNotDisplayed()
+        rule.onNodeWithTag("3").assertIsNotDisplayed()
 
-        rule.onNodeWithTag("4")
-            .assertIsDisplayed()
+        rule.onNodeWithTag("4").assertIsDisplayed()
 
-        rule.onNodeWithTag("5")
-            .assertIsDisplayed()
+        rule.onNodeWithTag("5").assertIsDisplayed()
 
-        rule.onNodeWithTag("6")
-            .assertIsDisplayed()
+        rule.onNodeWithTag("6").assertIsDisplayed()
 
-        rule.onNodeWithTag("7")
-            .assertIsDisplayed()
+        rule.onNodeWithTag("7").assertIsDisplayed()
 
-        rule.onNodeWithTag("8")
-            .assertIsDisplayed()
+        rule.onNodeWithTag("8").assertIsDisplayed()
 
-        rule.onNodeWithTag("9")
-            .assertIsDisplayed()
+        rule.onNodeWithTag("9").assertIsDisplayed()
     }
 
     @Test
@@ -249,26 +203,19 @@
                 cells = GridCells.Adaptive(130.dp),
                 modifier = Modifier.axisSize(300.dp, 100.dp)
             ) {
-                items(items) {
-                    Spacer(Modifier.mainAxisSize(101.dp).testTag(it))
-                }
+                items(items) { Spacer(Modifier.mainAxisSize(101.dp).testTag(it)) }
             }
         }
 
-        rule.onNodeWithTag("1")
-            .assertCrossAxisStartPositionInRootIsEqualTo(0.dp)
+        rule.onNodeWithTag("1").assertCrossAxisStartPositionInRootIsEqualTo(0.dp)
 
-        rule.onNodeWithTag("2")
-            .assertCrossAxisStartPositionInRootIsEqualTo(150.dp)
+        rule.onNodeWithTag("2").assertCrossAxisStartPositionInRootIsEqualTo(150.dp)
 
-        rule.onNodeWithTag("3")
-            .assertDoesNotExist()
+        rule.onNodeWithTag("3").assertDoesNotExist()
 
-        rule.onNodeWithTag("4")
-            .assertDoesNotExist()
+        rule.onNodeWithTag("4").assertDoesNotExist()
 
-        rule.onNodeWithTag("5")
-            .assertDoesNotExist()
+        rule.onNodeWithTag("5").assertDoesNotExist()
     }
 
     @Test
@@ -280,20 +227,15 @@
                 cells = GridCells.Adaptive(301.dp),
                 modifier = Modifier.axisSize(300.dp, 100.dp)
             ) {
-                items(items) {
-                    Spacer(Modifier.mainAxisSize(101.dp).testTag(it))
-                }
+                items(items) { Spacer(Modifier.mainAxisSize(101.dp).testTag(it)) }
             }
         }
 
-        rule.onNodeWithTag("1")
-            .assertIsDisplayed()
+        rule.onNodeWithTag("1").assertIsDisplayed()
 
-        rule.onNodeWithTag("2")
-            .assertDoesNotExist()
+        rule.onNodeWithTag("2").assertDoesNotExist()
 
-        rule.onNodeWithTag("3")
-            .assertDoesNotExist()
+        rule.onNodeWithTag("3").assertDoesNotExist()
     }
 
     @Test
@@ -309,23 +251,24 @@
                 modifier = Modifier.axisSize(itemSize * 3 + spacing * 2, itemSize),
                 crossAxisSpacedBy = spacing
             ) {
-                items(items) {
-                    Spacer(Modifier.size(itemSize).testTag(it))
-                }
+                items(items) { Spacer(Modifier.size(itemSize).testTag(it)) }
             }
         }
 
-        rule.onNodeWithTag("1")
+        rule
+            .onNodeWithTag("1")
             .assertIsDisplayed()
             .assertCrossAxisStartPositionInRootIsEqualTo(0.dp)
             .assertCrossAxisSizeIsEqualTo(itemSize)
 
-        rule.onNodeWithTag("2")
+        rule
+            .onNodeWithTag("2")
             .assertIsDisplayed()
             .assertCrossAxisStartPositionInRootIsEqualTo(itemSize + spacing)
             .assertCrossAxisSizeIsEqualTo(itemSize)
 
-        rule.onNodeWithTag("3")
+        rule
+            .onNodeWithTag("3")
             .assertIsDisplayed()
             .assertCrossAxisStartPositionInRootIsEqualTo(itemSize * 2 + spacing * 2)
             .assertCrossAxisSizeIsEqualTo(itemSize)
@@ -345,23 +288,24 @@
                 crossAxisSpacedBy = spacing,
                 contentPadding = PaddingValues(crossAxis = spacing)
             ) {
-                items(items) {
-                    Spacer(Modifier.size(itemSize).testTag(it))
-                }
+                items(items) { Spacer(Modifier.size(itemSize).testTag(it)) }
             }
         }
 
-        rule.onNodeWithTag("1")
+        rule
+            .onNodeWithTag("1")
             .assertIsDisplayed()
             .assertCrossAxisStartPositionInRootIsEqualTo(spacing)
             .assertCrossAxisSizeIsEqualTo(itemSize)
 
-        rule.onNodeWithTag("2")
+        rule
+            .onNodeWithTag("2")
             .assertIsDisplayed()
             .assertCrossAxisStartPositionInRootIsEqualTo(itemSize + spacing * 2)
             .assertCrossAxisSizeIsEqualTo(itemSize)
 
-        rule.onNodeWithTag("3")
+        rule
+            .onNodeWithTag("3")
             .assertIsDisplayed()
             .assertCrossAxisStartPositionInRootIsEqualTo(itemSize * 2 + spacing * 3)
             .assertCrossAxisSizeIsEqualTo(itemSize)
@@ -380,23 +324,24 @@
                 modifier = Modifier.axisSize(itemSize, itemSize * 3 + spacing * 2),
                 mainAxisSpacedBy = spacing
             ) {
-                items(items) {
-                    Spacer(Modifier.size(itemSize).testTag(it))
-                }
+                items(items) { Spacer(Modifier.size(itemSize).testTag(it)) }
             }
         }
 
-        rule.onNodeWithTag("1")
+        rule
+            .onNodeWithTag("1")
             .assertIsDisplayed()
             .assertMainAxisStartPositionInRootIsEqualTo(0.dp)
             .assertMainAxisSizeIsEqualTo(itemSize)
 
-        rule.onNodeWithTag("2")
+        rule
+            .onNodeWithTag("2")
             .assertIsDisplayed()
             .assertMainAxisStartPositionInRootIsEqualTo(itemSize + spacing)
             .assertMainAxisSizeIsEqualTo(itemSize)
 
-        rule.onNodeWithTag("3")
+        rule
+            .onNodeWithTag("3")
             .assertIsDisplayed()
             .assertMainAxisStartPositionInRootIsEqualTo(itemSize * 2 + spacing * 2)
             .assertMainAxisSizeIsEqualTo(itemSize)
@@ -416,23 +361,24 @@
                 mainAxisSpacedBy = spacing,
                 contentPadding = PaddingValues(mainAxis = spacing)
             ) {
-                items(items) {
-                    Spacer(Modifier.size(itemSize).testTag(it))
-                }
+                items(items) { Spacer(Modifier.size(itemSize).testTag(it)) }
             }
         }
 
-        rule.onNodeWithTag("1")
+        rule
+            .onNodeWithTag("1")
             .assertIsDisplayed()
             .assertMainAxisStartPositionInRootIsEqualTo(spacing)
             .assertMainAxisSizeIsEqualTo(itemSize)
 
-        rule.onNodeWithTag("2")
+        rule
+            .onNodeWithTag("2")
             .assertIsDisplayed()
             .assertMainAxisStartPositionInRootIsEqualTo(spacing * 2 + itemSize)
             .assertMainAxisSizeIsEqualTo(itemSize)
 
-        rule.onNodeWithTag("3")
+        rule
+            .onNodeWithTag("3")
             .assertIsDisplayed()
             .assertMainAxisStartPositionInRootIsEqualTo(spacing * 3 + itemSize * 2)
             .assertMainAxisSizeIsEqualTo(itemSize)
@@ -451,28 +397,30 @@
                 modifier = Modifier.axisSize(itemSize, itemSize * 2 + spacing),
                 mainAxisSpacedBy = spacing,
             ) {
-                items(items) {
-                    Spacer(Modifier.size(itemSize).testTag(it))
-                }
+                items(items) { Spacer(Modifier.size(itemSize).testTag(it)) }
             }
         }
 
-        rule.onNodeWithTag("1")
+        rule
+            .onNodeWithTag("1")
             .assertIsDisplayed()
             .assertMainAxisStartPositionInRootIsEqualTo(0.dp)
             .assertMainAxisSizeIsEqualTo(itemSize)
 
-        rule.onNodeWithTag("2")
+        rule
+            .onNodeWithTag("2")
             .assertIsDisplayed()
             .assertMainAxisStartPositionInRootIsEqualTo(0.dp)
             .assertMainAxisSizeIsEqualTo(itemSize)
 
-        rule.onNodeWithTag("3")
+        rule
+            .onNodeWithTag("3")
             .assertIsDisplayed()
             .assertMainAxisStartPositionInRootIsEqualTo(spacing + itemSize)
             .assertMainAxisSizeIsEqualTo(itemSize)
 
-        rule.onNodeWithTag("4")
+        rule
+            .onNodeWithTag("4")
             .assertIsDisplayed()
             .assertMainAxisStartPositionInRootIsEqualTo(spacing + itemSize)
             .assertMainAxisSizeIsEqualTo(itemSize)
@@ -491,28 +439,30 @@
                 modifier = Modifier.axisSize(itemSize * 2 + spacing, itemSize * 2),
                 crossAxisSpacedBy = spacing
             ) {
-                items(items) {
-                    Spacer(Modifier.size(itemSize).testTag(it))
-                }
+                items(items) { Spacer(Modifier.size(itemSize).testTag(it)) }
             }
         }
 
-        rule.onNodeWithTag("1")
+        rule
+            .onNodeWithTag("1")
             .assertIsDisplayed()
             .assertCrossAxisStartPositionInRootIsEqualTo(0.dp)
             .assertCrossAxisSizeIsEqualTo(itemSize)
 
-        rule.onNodeWithTag("2")
+        rule
+            .onNodeWithTag("2")
             .assertIsDisplayed()
             .assertCrossAxisStartPositionInRootIsEqualTo(spacing + itemSize)
             .assertCrossAxisSizeIsEqualTo(itemSize)
 
-        rule.onNodeWithTag("3")
+        rule
+            .onNodeWithTag("3")
             .assertIsDisplayed()
             .assertCrossAxisStartPositionInRootIsEqualTo(0.dp)
             .assertCrossAxisSizeIsEqualTo(itemSize)
 
-        rule.onNodeWithTag("4")
+        rule
+            .onNodeWithTag("4")
             .assertIsDisplayed()
             .assertCrossAxisStartPositionInRootIsEqualTo(spacing + itemSize)
             .assertCrossAxisSizeIsEqualTo(itemSize)
@@ -532,28 +482,30 @@
                 mainAxisSpacedBy = spacing,
                 contentPadding = PaddingValues(mainAxis = spacing)
             ) {
-                items(items) {
-                    Spacer(Modifier.size(itemSize).testTag(it))
-                }
+                items(items) { Spacer(Modifier.size(itemSize).testTag(it)) }
             }
         }
 
-        rule.onNodeWithTag("1")
+        rule
+            .onNodeWithTag("1")
             .assertIsDisplayed()
             .assertMainAxisStartPositionInRootIsEqualTo(spacing)
             .assertMainAxisSizeIsEqualTo(itemSize)
 
-        rule.onNodeWithTag("2")
+        rule
+            .onNodeWithTag("2")
             .assertIsDisplayed()
             .assertMainAxisStartPositionInRootIsEqualTo(spacing)
             .assertMainAxisSizeIsEqualTo(itemSize)
 
-        rule.onNodeWithTag("3")
+        rule
+            .onNodeWithTag("3")
             .assertIsDisplayed()
             .assertMainAxisStartPositionInRootIsEqualTo(spacing * 2 + itemSize)
             .assertMainAxisSizeIsEqualTo(itemSize)
 
-        rule.onNodeWithTag("4")
+        rule
+            .onNodeWithTag("4")
             .assertIsDisplayed()
             .assertMainAxisStartPositionInRootIsEqualTo(spacing * 2 + itemSize)
             .assertMainAxisSizeIsEqualTo(itemSize)
@@ -573,28 +525,30 @@
                 crossAxisSpacedBy = spacing,
                 contentPadding = PaddingValues(crossAxis = spacing)
             ) {
-                items(items) {
-                    Spacer(Modifier.size(itemSize).testTag(it))
-                }
+                items(items) { Spacer(Modifier.size(itemSize).testTag(it)) }
             }
         }
 
-        rule.onNodeWithTag("1")
+        rule
+            .onNodeWithTag("1")
             .assertIsDisplayed()
             .assertCrossAxisStartPositionInRootIsEqualTo(spacing)
             .assertCrossAxisSizeIsEqualTo(itemSize)
 
-        rule.onNodeWithTag("2")
+        rule
+            .onNodeWithTag("2")
             .assertIsDisplayed()
             .assertCrossAxisStartPositionInRootIsEqualTo(spacing * 2 + itemSize)
             .assertCrossAxisSizeIsEqualTo(itemSize)
 
-        rule.onNodeWithTag("3")
+        rule
+            .onNodeWithTag("3")
             .assertIsDisplayed()
             .assertCrossAxisStartPositionInRootIsEqualTo(spacing)
             .assertCrossAxisSizeIsEqualTo(itemSize)
 
-        rule.onNodeWithTag("4")
+        rule
+            .onNodeWithTag("4")
             .assertIsDisplayed()
             .assertCrossAxisStartPositionInRootIsEqualTo(spacing * 2 + itemSize)
             .assertCrossAxisSizeIsEqualTo(itemSize)
@@ -607,29 +561,28 @@
         val itemSize = with(rule.density) { 15.toDp() }
 
         rule.setContent {
-            LazyGrid(
-                cells = 2,
-                modifier = Modifier.crossAxisSize(itemSize * 2)
-            ) {
-                items(items) {
-                    Spacer(Modifier.mainAxisSize(itemSize).testTag(it))
-                }
+            LazyGrid(cells = 2, modifier = Modifier.crossAxisSize(itemSize * 2)) {
+                items(items) { Spacer(Modifier.mainAxisSize(itemSize).testTag(it)) }
             }
         }
 
-        rule.onNodeWithTag("1")
+        rule
+            .onNodeWithTag("1")
             .assertMainAxisStartPositionInRootIsEqualTo(0.dp)
             .assertCrossAxisStartPositionInRootIsEqualTo(0.dp)
 
-        rule.onNodeWithTag("2")
+        rule
+            .onNodeWithTag("2")
             .assertMainAxisStartPositionInRootIsEqualTo(0.dp)
             .assertCrossAxisStartPositionInRootIsEqualTo(itemSize)
 
-        rule.onNodeWithTag("3")
+        rule
+            .onNodeWithTag("3")
             .assertMainAxisStartPositionInRootIsEqualTo(itemSize)
             .assertCrossAxisStartPositionInRootIsEqualTo(0.dp)
 
-        rule.onNodeWithTag("4")
+        rule
+            .onNodeWithTag("4")
             .assertMainAxisStartPositionInRootIsEqualTo(itemSize)
             .assertCrossAxisStartPositionInRootIsEqualTo(itemSize)
     }
@@ -641,29 +594,30 @@
         val itemSize = with(rule.density) { 15.toDp() }
 
         rule.setContent {
-            LazyGrid(
-                cells = 2,
-                Modifier.crossAxisSize(itemSize * 2)
-            ) {
+            LazyGrid(cells = 2, Modifier.crossAxisSize(itemSize * 2)) {
                 itemsIndexed(items) { index, item ->
                     Spacer(Modifier.mainAxisSize(itemSize).testTag("$index*$item"))
                 }
             }
         }
 
-        rule.onNodeWithTag("0*1")
+        rule
+            .onNodeWithTag("0*1")
             .assertMainAxisStartPositionInRootIsEqualTo(0.dp)
             .assertCrossAxisStartPositionInRootIsEqualTo(0.dp)
 
-        rule.onNodeWithTag("1*2")
+        rule
+            .onNodeWithTag("1*2")
             .assertMainAxisStartPositionInRootIsEqualTo(0.dp)
             .assertCrossAxisStartPositionInRootIsEqualTo(itemSize)
 
-        rule.onNodeWithTag("2*3")
+        rule
+            .onNodeWithTag("2*3")
             .assertMainAxisStartPositionInRootIsEqualTo(itemSize)
             .assertCrossAxisStartPositionInRootIsEqualTo(0.dp)
 
-        rule.onNodeWithTag("3*4")
+        rule
+            .onNodeWithTag("3*4")
             .assertMainAxisStartPositionInRootIsEqualTo(itemSize)
             .assertCrossAxisStartPositionInRootIsEqualTo(itemSize)
     }
@@ -675,11 +629,7 @@
         val composedIndexes = mutableListOf<Int>()
         rule.setContent {
             state = rememberLazyGridState()
-            LazyGrid(
-                cells = 1,
-                modifier = Modifier.mainAxisSize(10.dp),
-                state = state
-            ) {
+            LazyGrid(cells = 1, modifier = Modifier.mainAxisSize(10.dp), state = state) {
                 items(count) { index ->
                     composedIndexes.add(index)
                     Box(Modifier.size(20.dp))
@@ -695,9 +645,7 @@
                 // already be aware there is a new count and not compose items with index > 10
                 state.scrollToItem(50)
             }
-            composedIndexes.forEach {
-                Truth.assertThat(it).isLessThan(count)
-            }
+            composedIndexes.forEach { Truth.assertThat(it).isLessThan(count) }
             Truth.assertThat(state.firstVisibleItemIndex).isEqualTo(9)
         }
     }
@@ -712,21 +660,22 @@
                 modifier = Modifier.size(itemSize * 2).testTag(LazyGridTag),
                 state = LazyGridState(firstVisibleItemIndex = Int.MAX_VALUE - 3)
             ) {
-                items(Int.MAX_VALUE) {
-                    Box(Modifier.size(itemSize).testTag("$it"))
-                }
+                items(Int.MAX_VALUE) { Box(Modifier.size(itemSize).testTag("$it")) }
             }
         }
 
-        rule.onNodeWithTag("${Int.MAX_VALUE - 3}")
+        rule
+            .onNodeWithTag("${Int.MAX_VALUE - 3}")
             .assertMainAxisStartPositionInRootIsEqualTo(0.dp)
             .assertCrossAxisStartPositionInRootIsEqualTo(0.dp)
 
-        rule.onNodeWithTag("${Int.MAX_VALUE - 2}")
+        rule
+            .onNodeWithTag("${Int.MAX_VALUE - 2}")
             .assertMainAxisStartPositionInRootIsEqualTo(0.dp)
             .assertCrossAxisStartPositionInRootIsEqualTo(itemSize)
 
-        rule.onNodeWithTag("${Int.MAX_VALUE - 1}")
+        rule
+            .onNodeWithTag("${Int.MAX_VALUE - 1}")
             .assertMainAxisStartPositionInRootIsEqualTo(itemSize)
             .assertCrossAxisStartPositionInRootIsEqualTo(0.dp)
 
@@ -744,14 +693,11 @@
                 modifier = Modifier.size(itemSize),
                 state = LazyGridState(firstVisibleItemIndex = Int.MAX_VALUE / 2)
             ) {
-                items(Int.MAX_VALUE, key = { it }) {
-                    Box(Modifier.size(itemSize).testTag("$it"))
-                }
+                items(Int.MAX_VALUE, key = { it }) { Box(Modifier.size(itemSize).testTag("$it")) }
             }
         }
 
-        rule.onNodeWithTag("${Int.MAX_VALUE / 2}")
-            .assertMainAxisStartPositionInRootIsEqualTo(0.dp)
+        rule.onNodeWithTag("${Int.MAX_VALUE / 2}").assertMainAxisStartPositionInRootIsEqualTo(0.dp)
     }
 
     @Test
@@ -763,18 +709,13 @@
                 modifier = Modifier.size(itemSize * 3).testTag(LazyGridTag),
                 userScrollEnabled = true,
             ) {
-                items(5) {
-                    Spacer(Modifier.size(itemSize).testTag("$it"))
-                }
+                items(5) { Spacer(Modifier.size(itemSize).testTag("$it")) }
             }
         }
 
-        rule.onNodeWithTag(LazyGridTag).apply {
-            scrollBy(offset = itemSize)
-        }
+        rule.onNodeWithTag(LazyGridTag).apply { scrollBy(offset = itemSize) }
 
-        rule.onNodeWithTag("1")
-            .assertMainAxisStartPositionInRootIsEqualTo(0.dp)
+        rule.onNodeWithTag("1").assertMainAxisStartPositionInRootIsEqualTo(0.dp)
     }
 
     @Test
@@ -786,16 +727,13 @@
                 modifier = Modifier.size(itemSize * 3).testTag(LazyGridTag),
                 userScrollEnabled = false,
             ) {
-                items(5) {
-                    Spacer(Modifier.size(itemSize).testTag("$it"))
-                }
+                items(5) { Spacer(Modifier.size(itemSize).testTag("$it")) }
             }
         }
 
         rule.onNodeWithTag(LazyGridTag).scrollBy(offset = itemSize)
 
-        rule.onNodeWithTag("1")
-            .assertMainAxisStartPositionInRootIsEqualTo(itemSize)
+        rule.onNodeWithTag("1").assertMainAxisStartPositionInRootIsEqualTo(itemSize)
     }
 
     @Test
@@ -810,20 +748,13 @@
                 state = rememberLazyGridState().also { state = it },
                 userScrollEnabled = false,
             ) {
-                items(5) {
-                    Spacer(Modifier.size(itemSize).testTag("$it"))
-                }
+                items(5) { Spacer(Modifier.size(itemSize).testTag("$it")) }
             }
         }
 
-        rule.runOnIdle {
-            runBlocking {
-                state.scrollBy(itemSizePx)
-            }
-        }
+        rule.runOnIdle { runBlocking { state.scrollBy(itemSizePx) } }
 
-        rule.onNodeWithTag("1")
-            .assertMainAxisStartPositionInRootIsEqualTo(0.dp)
+        rule.onNodeWithTag("1").assertMainAxisStartPositionInRootIsEqualTo(0.dp)
     }
 
     @Test
@@ -835,13 +766,12 @@
                 modifier = Modifier.size(itemSize * 3).testTag(LazyGridTag),
                 userScrollEnabled = false,
             ) {
-                items(5) {
-                    Spacer(Modifier.size(itemSize).testTag("$it"))
-                }
+                items(5) { Spacer(Modifier.size(itemSize).testTag("$it")) }
             }
         }
 
-        rule.onNodeWithTag(LazyGridTag)
+        rule
+            .onNodeWithTag(LazyGridTag)
             .assert(SemanticsMatcher.keyNotDefined(SemanticsActions.ScrollBy))
             .assert(SemanticsMatcher.keyNotDefined(SemanticsActions.ScrollToIndex))
             // but we still have a read only scroll range property
@@ -862,28 +792,25 @@
         val gridCrossAxisSizeDp = with(rule.density) { gridCrossAxisSize.toDp() }
         rule.setContent {
             CompositionLocalProvider(LocalLayoutDirection provides LayoutDirection.Rtl) {
-                LazyGrid(
-                    cells = 3,
-                    modifier = Modifier.crossAxisSize(gridCrossAxisSizeDp)
-                ) {
-                    items(3) {
-                        Box(Modifier.mainAxisSize(1.dp).testTag("$it"))
-                    }
+                LazyGrid(cells = 3, modifier = Modifier.crossAxisSize(gridCrossAxisSizeDp)) {
+                    items(3) { Box(Modifier.mainAxisSize(1.dp).testTag("$it")) }
                 }
             }
         }
 
-        val tags = if (orientation == Orientation.Vertical) {
-            listOf("0", "1", "2")
-        } else {
-            listOf("2", "1", "0")
-        }
-        rule.onNodeWithTag(tags[0])
+        val tags =
+            if (orientation == Orientation.Vertical) {
+                listOf("0", "1", "2")
+            } else {
+                listOf("2", "1", "0")
+            }
+        rule
+            .onNodeWithTag(tags[0])
             .assertCrossAxisStartPositionInRootIsEqualTo(gridCrossAxisSizeDp * 2 / 3)
-        rule.onNodeWithTag(tags[1])
+        rule
+            .onNodeWithTag(tags[1])
             .assertCrossAxisStartPositionInRootIsEqualTo(gridCrossAxisSizeDp / 3)
-        rule.onNodeWithTag(tags[2])
-            .assertCrossAxisStartPositionInRootIsEqualTo(0.dp)
+        rule.onNodeWithTag(tags[2]).assertCrossAxisStartPositionInRootIsEqualTo(0.dp)
     }
 
     @Test
@@ -909,11 +836,7 @@
         rule.onNodeWithTag("1").assertIsDisplayed()
         rule.onNodeWithTag("2").assertIsDisplayed()
 
-        rule.runOnIdle {
-            runBlocking {
-                state.scrollToItem(3)
-            }
-        }
+        rule.runOnIdle { runBlocking { state.scrollToItem(3) } }
 
         rule.onNodeWithTag("0").assertIsNotDisplayed()
         rule.onNodeWithTag("1").assertIsNotDisplayed()
@@ -927,45 +850,38 @@
     @Test
     fun withZeroSizedFirstItem() {
         var scrollConsumedAccumulator = Offset.Zero
-        val collectingDataConnection = object : NestedScrollConnection {
-            override fun onPostScroll(
-                consumed: Offset,
-                available: Offset,
-                source: NestedScrollSource
-            ): Offset {
-                scrollConsumedAccumulator += consumed
-                return Offset.Zero
+        val collectingDataConnection =
+            object : NestedScrollConnection {
+                override fun onPostScroll(
+                    consumed: Offset,
+                    available: Offset,
+                    source: NestedScrollSource
+                ): Offset {
+                    scrollConsumedAccumulator += consumed
+                    return Offset.Zero
+                }
             }
-        }
 
         rule.setContent {
             val state = rememberLazyGridState()
             LazyGrid(
                 cells = 1,
                 state = state,
-                modifier = Modifier
-                    .testTag("mainList")
-                    .nestedScroll(connection = collectingDataConnection),
+                modifier =
+                    Modifier.testTag("mainList")
+                        .nestedScroll(connection = collectingDataConnection),
                 contentPadding = androidx.compose.foundation.layout.PaddingValues(all = 10.dp)
             ) {
-                item {
-                    Spacer(modifier = Modifier.size(size = 0.dp))
-                }
+                item { Spacer(modifier = Modifier.size(size = 0.dp)) }
                 items((0..8).map { it.toString() }) {
-                    Box(Modifier.testTag(it)) {
-                        BasicText(text = it.toString())
-                    }
+                    Box(Modifier.testTag(it)) { BasicText(text = it.toString()) }
                 }
             }
         }
 
-        rule.onNodeWithTag("mainList").performTouchInput {
-            swipeDown()
-        }
+        rule.onNodeWithTag("mainList").performTouchInput { swipeDown() }
 
-        rule.runOnIdle {
-            assertThat(scrollConsumedAccumulator).isEqualTo(Offset.Zero)
-        }
+        rule.runOnIdle { assertThat(scrollConsumedAccumulator).isEqualTo(Offset.Zero) }
     }
 
     @Test
@@ -977,20 +893,19 @@
             LazyGrid(
                 cells = 1,
                 state = state,
-                modifier = Modifier
-                    .testTag("mainList"),
+                modifier = Modifier.testTag("mainList"),
                 contentPadding = androidx.compose.foundation.layout.PaddingValues(all = 10.dp)
             ) {
                 item {
-                    Spacer(modifier = Modifier
-                        .testTag("firstItem")
-                        .size(size = firstItemSize.value)
-                        .background(Color.Black))
+                    Spacer(
+                        modifier =
+                            Modifier.testTag("firstItem")
+                                .size(size = firstItemSize.value)
+                                .background(Color.Black)
+                    )
                 }
                 items((0..8).map { it.toString() }) {
-                    Box(Modifier.testTag(it)) {
-                        BasicText(text = it.toString())
-                    }
+                    Box(Modifier.testTag(it)) { BasicText(text = it.toString()) }
                 }
             }
         }
@@ -1006,9 +921,7 @@
         rule.setContentWithTestViewConfiguration {
             LazyGrid(cells = 1) {
                 try {
-                    items(-1) {
-                        Box(Modifier)
-                    }
+                    items(-1) { Box(Modifier) }
                 } catch (e: Exception) {
                     exception = e
                 }
@@ -1023,13 +936,12 @@
     @Test
     fun recomposingWithNewComposedModifierObjectIsNotCausingRemeasure() {
         var remeasureCount = 0
-        val layoutModifier = Modifier.layout { measurable, constraints ->
-            remeasureCount++
-            val placeable = measurable.measure(constraints)
-            layout(placeable.width, placeable.height) {
-                placeable.place(0, 0)
+        val layoutModifier =
+            Modifier.layout { measurable, constraints ->
+                remeasureCount++
+                val placeable = measurable.measure(constraints)
+                layout(placeable.width, placeable.height) { placeable.place(0, 0) }
             }
-        }
         val counter = mutableStateOf(0)
 
         rule.setContentWithTestViewConfiguration {
@@ -1040,9 +952,7 @@
                 // without causing remeasure
                 modifier = Modifier.composed { layoutModifier }
             ) {
-                items(1) {
-                    Spacer(Modifier.size(10.dp))
-                }
+                items(1) { Spacer(Modifier.size(10.dp)) }
             }
         }
 
@@ -1051,9 +961,7 @@
             counter.value++
         }
 
-        rule.runOnIdle {
-            Truth.assertThat(remeasureCount).isEqualTo(1)
-        }
+        rule.runOnIdle { Truth.assertThat(remeasureCount).isEqualTo(1) }
     }
 
     @Test
@@ -1065,43 +973,35 @@
             state = rememberLazyGridState()
             LazyGrid(
                 cells = 1,
-                modifier = Modifier.composed {
-                    recomposeCount++
-                    Modifier
-                }.size(100.dp),
+                modifier =
+                    Modifier.composed {
+                            recomposeCount++
+                            Modifier
+                        }
+                        .size(100.dp),
                 state
             ) {
-                items(1000) {
-                    Spacer(Modifier.size(100.dp))
-                }
+                items(1000) { Spacer(Modifier.size(100.dp)) }
             }
         }
 
         rule.runOnIdle {
             Truth.assertThat(recomposeCount).isEqualTo(1)
 
-            runBlocking {
-                state.scrollToItem(100)
-            }
+            runBlocking { state.scrollToItem(100) }
         }
 
-        rule.runOnIdle {
-            Truth.assertThat(recomposeCount).isEqualTo(1)
-        }
+        rule.runOnIdle { Truth.assertThat(recomposeCount).isEqualTo(1) }
     }
 
     @Test
     @SdkSuppress(minSdkVersion = Build.VERSION_CODES.O)
     fun zIndexOnItemAffectsDrawingOrder() {
         rule.setContentWithTestViewConfiguration {
-            LazyGrid(
-                cells = 1,
-                modifier = Modifier.size(6.dp).testTag(LazyGridTag)
-            ) {
+            LazyGrid(cells = 1, modifier = Modifier.size(6.dp).testTag(LazyGridTag)) {
                 items(listOf(Color.Blue, Color.Green, Color.Red)) { color ->
                     Box(
-                        Modifier
-                            .axisSize(6.dp, 2.dp)
+                        Modifier.axisSize(6.dp, 2.dp)
                             .zIndex(if (color == Color.Green) 1f else 0f)
                             .drawBehind {
                                 drawRect(
@@ -1109,14 +1009,13 @@
                                     topLeft = Offset(-10.dp.toPx(), -10.dp.toPx()),
                                     size = Size(20.dp.toPx(), 20.dp.toPx())
                                 )
-                            })
+                            }
+                    )
                 }
             }
         }
 
-        rule.onNodeWithTag(LazyGridTag)
-            .captureToImage()
-            .assertPixels { Color.Green }
+        rule.onNodeWithTag(LazyGridTag).captureToImage().assertPixels { Color.Green }
     }
 
     @Test
@@ -1126,40 +1025,38 @@
         rule.setContent {
             LazyGrid(
                 // Two columns in ratio 1:2
-                cells = object : GridCells {
-                    override fun Density.calculateCrossAxisCellSizes(
-                        availableSize: Int,
-                        spacing: Int
-                    ): List<Int> {
-                        val availableCrossAxis = availableSize - spacing
-                        val columnSize = availableCrossAxis / 3
-                        return listOf(columnSize, columnSize * 2)
-                    }
-                },
+                cells =
+                    object : GridCells {
+                        override fun Density.calculateCrossAxisCellSizes(
+                            availableSize: Int,
+                            spacing: Int
+                        ): List<Int> {
+                            val availableCrossAxis = availableSize - spacing
+                            val columnSize = availableCrossAxis / 3
+                            return listOf(columnSize, columnSize * 2)
+                        }
+                    },
                 modifier = Modifier.axisSize(300.dp, 100.dp)
             ) {
-                items(items) {
-                    Spacer(Modifier.mainAxisSize(101.dp).testTag(it))
-                }
+                items(items) { Spacer(Modifier.mainAxisSize(101.dp).testTag(it)) }
             }
         }
 
-        rule.onNodeWithTag("1")
+        rule
+            .onNodeWithTag("1")
             .assertCrossAxisStartPositionInRootIsEqualTo(0.dp)
             .assertCrossAxisSizeIsEqualTo(100.dp)
 
-        rule.onNodeWithTag("2")
+        rule
+            .onNodeWithTag("2")
             .assertCrossAxisStartPositionInRootIsEqualTo(100.dp)
             .assertCrossAxisSizeIsEqualTo(200.dp)
 
-        rule.onNodeWithTag("3")
-            .assertDoesNotExist()
+        rule.onNodeWithTag("3").assertDoesNotExist()
 
-        rule.onNodeWithTag("4")
-            .assertDoesNotExist()
+        rule.onNodeWithTag("4").assertDoesNotExist()
 
-        rule.onNodeWithTag("5")
-            .assertDoesNotExist()
+        rule.onNodeWithTag("5").assertDoesNotExist()
     }
 
     @Test
@@ -1168,20 +1065,12 @@
         lateinit var state: LazyGridState
         rule.setContent {
             state = rememberLazyGridState()
-            LazyGrid(
-                1,
-                Modifier.requiredSize(100.dp).testTag(LazyGridTag),
-                state = state
-            ) {
-                items(items) {
-                    Spacer(Modifier.requiredSize(20.dp).testTag("$it"))
-                }
+            LazyGrid(1, Modifier.requiredSize(100.dp).testTag(LazyGridTag), state = state) {
+                items(items) { Spacer(Modifier.requiredSize(20.dp).testTag("$it")) }
             }
         }
 
-        rule.runOnIdle {
-            assertThat(state.numMeasurePasses).isEqualTo(1)
-        }
+        rule.runOnIdle { assertThat(state.numMeasurePasses).isEqualTo(1) }
     }
 
     @Test
@@ -1221,11 +1110,7 @@
         rule.setContent {
             BoxWithConstraints {
                 val state = rememberLazyGridState()
-                LazyGrid(
-                    cells = 2,
-                    state = state,
-                    modifier = Modifier.axisSize(40.dp, 100.dp)
-                ) {
+                LazyGrid(cells = 2, state = state, modifier = Modifier.axisSize(40.dp, 100.dp)) {
                     items(20) {
                         val tag = it.toString()
                         BasicText(
@@ -1234,40 +1119,27 @@
                         )
                     }
                 }
-                LaunchedEffect(state) {
-                    state.scrollToItem(10)
-                }
+                LaunchedEffect(state) { state.scrollToItem(10) }
             }
         }
 
-        rule.onNodeWithTag("10")
-            .assertMainAxisStartPositionInRootIsEqualTo(0.dp)
+        rule.onNodeWithTag("10").assertMainAxisStartPositionInRootIsEqualTo(0.dp)
     }
 
     @Test
     fun scrollInLaunchedEffect() {
         rule.setContent {
             val state = rememberLazyGridState()
-            LazyGrid(
-                cells = 2,
-                state = state,
-                modifier = Modifier.axisSize(40.dp, 100.dp)
-            ) {
+            LazyGrid(cells = 2, state = state, modifier = Modifier.axisSize(40.dp, 100.dp)) {
                 items(20) {
                     val tag = it.toString()
-                    BasicText(
-                        text = tag,
-                        modifier = Modifier.axisSize(20.dp, 20.dp).testTag(tag)
-                    )
+                    BasicText(text = tag, modifier = Modifier.axisSize(20.dp, 20.dp).testTag(tag))
                 }
             }
-            LaunchedEffect(state) {
-                state.scrollToItem(10)
-            }
+            LaunchedEffect(state) { state.scrollToItem(10) }
         }
 
-        rule.onNodeWithTag("10")
-            .assertMainAxisStartPositionInRootIsEqualTo(0.dp)
+        rule.onNodeWithTag("10").assertMainAxisStartPositionInRootIsEqualTo(0.dp)
     }
 
     @Test
@@ -1275,30 +1147,22 @@
         var flag by mutableStateOf(false)
         rule.setContent {
             LazyGrid(cells = GridCells.Fixed(2), modifier = Modifier.axisSize(60.dp, 100.dp)) {
-                item(
-                    span = { GridItemSpan(maxLineSpan) }
-                ) {
+                item(span = { GridItemSpan(maxLineSpan) }) {
                     Box(Modifier.mainAxisSize(32.dp).background(Color.Red))
                 }
 
                 if (flag) {
-                    item {
-                        Box(Modifier.mainAxisSize(32.dp).background(Color.Blue))
-                    }
+                    item { Box(Modifier.mainAxisSize(32.dp).background(Color.Blue)) }
 
                     item {
                         Box(Modifier.mainAxisSize(32.dp).background(Color.Yellow).testTag("target"))
                     }
                 } else {
-                    item(
-                        span = { GridItemSpan(maxLineSpan) }
-                    ) {
+                    item(span = { GridItemSpan(maxLineSpan) }) {
                         Box(Modifier.mainAxisSize(32.dp).background(Color.Blue))
                     }
 
-                    item(
-                        span = { GridItemSpan(maxLineSpan) }
-                    ) {
+                    item(span = { GridItemSpan(maxLineSpan) }) {
                         Box(Modifier.mainAxisSize(32.dp).background(Color.Yellow).testTag("target"))
                     }
                 }
@@ -1306,7 +1170,8 @@
         }
 
         flag = true
-        rule.onNodeWithTag("target")
+        rule
+            .onNodeWithTag("target")
             .assertCrossAxisSizeIsEqualTo(30.dp)
             .assertMainAxisStartPositionInRootIsEqualTo(32.dp)
             .assertCrossAxisStartPositionInRootIsEqualTo(30.dp)
@@ -1325,23 +1190,17 @@
                 modifier = Modifier.axisSize(0.dp, itemSize),
                 crossAxisSpacedBy = spacing
             ) {
-                items(items) {
-                    Spacer(Modifier.size(itemSize).testTag(it))
-                }
+                items(items) { Spacer(Modifier.size(itemSize).testTag(it)) }
             }
         }
 
-        val bounds1 = rule.onNodeWithTag("1")
-            .assertExists()
-            .getBoundsInRoot()
+        val bounds1 = rule.onNodeWithTag("1").assertExists().getBoundsInRoot()
 
         assertThat(bounds1.top).isEqualTo(0.dp)
         assertThat(bounds1.left).isEqualTo(0.dp)
         assertThat(bounds1.size).isEqualTo(DpSize(0.dp, 0.dp))
 
-        val bounds2 = rule.onNodeWithTag("2")
-            .assertExists()
-            .getBoundsInRoot()
+        val bounds2 = rule.onNodeWithTag("2").assertExists().getBoundsInRoot()
 
         assertThat(bounds2.top).isEqualTo(0.dp)
         assertThat(bounds2.left).isEqualTo(0.dp)
@@ -1362,7 +1221,8 @@
         // extra recompositions
         val itemContent: @Composable LazyGridItemScope.(index: Int) -> Unit = {
             Truth.assertWithMessage("Item $it should be larger than $previousItem")
-                .that(it > previousItem).isTrue()
+                .that(it > previousItem)
+                .isTrue()
             previousItem = it
             BasicText("$it", Modifier.size(10.dp))
         }
@@ -1391,29 +1251,15 @@
         val itemSizePx = 5f
         val itemSize = with(rule.density) { itemSizePx.toDp() }
         rule.setContentWithTestViewConfiguration {
-            LazyGrid(
-                1,
-                Modifier
-                    .testTag(LazyGridTag)
-                    .mainAxisSize(itemSize),
-                state
-            ) {
-                items(3) { index ->
-                    Box(Modifier.size(itemSize).testTag("$index"))
-                }
+            LazyGrid(1, Modifier.testTag(LazyGridTag).mainAxisSize(itemSize), state) {
+                items(3) { index -> Box(Modifier.size(itemSize).testTag("$index")) }
             }
         }
 
         repeat(3) { index ->
-            rule.onNodeWithTag("$index")
-                .assertIsDisplayed()
-            rule.onNodeWithTag("${index + 1}")
-                .assertDoesNotExist()
-            rule.runOnIdle {
-                runBlocking {
-                    state.scrollBy(itemSizePx)
-                }
-            }
+            rule.onNodeWithTag("$index").assertIsDisplayed()
+            rule.onNodeWithTag("${index + 1}").assertDoesNotExist()
+            rule.runOnIdle { runBlocking { state.scrollBy(itemSizePx) } }
         }
     }
 
@@ -1428,25 +1274,25 @@
             Row {
                 LazyGrid(
                     GridCells.Adaptive(itemSizeDp),
-                    Modifier
-                        .testTag(LazyGridTag)
-                        .layout { measurable, _ ->
-                            val crossAxis = if (expanded) {
+                    Modifier.testTag(LazyGridTag).layout { measurable, _ ->
+                        val crossAxis =
+                            if (expanded) {
                                 itemSizePx * 3
                             } else {
                                 itemSizePx
                             }
-                            val mainAxis = itemSizePx * 3 + 1
-                            val placeable = measurable.measure(
+                        val mainAxis = itemSizePx * 3 + 1
+                        val placeable =
+                            measurable.measure(
                                 Constraints.fixed(
                                     width = if (vertical) crossAxis else mainAxis,
                                     height = if (vertical) mainAxis else crossAxis
                                 )
                             )
-                            layout(placeable.width, placeable.height) {
-                                placeable.place(IntOffset.Zero)
-                            }
-                        },
+                        layout(placeable.width, placeable.height) {
+                            placeable.place(IntOffset.Zero)
+                        }
+                    },
                     state
                 ) {
                     items(
@@ -1480,16 +1326,16 @@
                 modifier = Modifier.axisSize(crossAxis = itemSizeDp * 5, mainAxis = itemSizeDp * 5),
                 state = state
             ) {
-                items(10) { index ->
-                    Box(Modifier.size(itemSizeDp).testTag(index.toString()))
-                }
+                items(10) { index -> Box(Modifier.size(itemSizeDp).testTag(index.toString())) }
             }
         }
 
-        rule.onNodeWithTag("0")
+        rule
+            .onNodeWithTag("0")
             .assertCrossAxisStartPositionInRootIsEqualTo(0.dp)
             .assertCrossAxisSizeIsEqualTo(itemSizeDp * 2)
-        rule.onNodeWithTag("1")
+        rule
+            .onNodeWithTag("1")
             .assertCrossAxisStartPositionInRootIsEqualTo(itemSizeDp * 2f)
             .assertCrossAxisSizeIsEqualTo(itemSizeDp * 2)
     }
@@ -1504,16 +1350,16 @@
                 modifier = Modifier.axisSize(crossAxis = itemSizeDp, mainAxis = itemSizeDp * 5),
                 state = state
             ) {
-                items(10) { index ->
-                    Box(Modifier.size(itemSizeDp).testTag(index.toString()))
-                }
+                items(10) { index -> Box(Modifier.size(itemSizeDp).testTag(index.toString())) }
             }
         }
 
-        rule.onNodeWithTag("0")
+        rule
+            .onNodeWithTag("0")
             .assertCrossAxisStartPositionInRootIsEqualTo(0.dp)
             .assertCrossAxisSizeIsEqualTo(itemSizeDp)
-        rule.onNodeWithTag("1")
+        rule
+            .onNodeWithTag("1")
             .assertCrossAxisStartPositionInRootIsEqualTo(0.dp)
             .assertCrossAxisSizeIsEqualTo(itemSizeDp)
     }
diff --git a/compose/foundation/foundation/integration-tests/lazy-tests/src/androidTest/kotlin/androidx/compose/foundation/lazy/grid/LazyGridsContentPaddingTest.kt b/compose/foundation/foundation/integration-tests/lazy-tests/src/androidTest/kotlin/androidx/compose/foundation/lazy/grid/LazyGridsContentPaddingTest.kt
index 50475ce..05f8ee5 100644
--- a/compose/foundation/foundation/integration-tests/lazy-tests/src/androidTest/kotlin/androidx/compose/foundation/lazy/grid/LazyGridsContentPaddingTest.kt
+++ b/compose/foundation/foundation/integration-tests/lazy-tests/src/androidTest/kotlin/androidx/compose/foundation/lazy/grid/LazyGridsContentPaddingTest.kt
@@ -63,8 +63,7 @@
     private val ItemTag = "item"
     private val ContainerTag = "container"
 
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
     private var itemSize: Dp = Dp.Infinity
     private var smallPaddingSize: Dp = Dp.Infinity
@@ -87,23 +86,22 @@
         rule.setContent {
             LazyVerticalGrid(
                 columns = GridCells.Fixed(1),
-                modifier = Modifier.requiredSize(containerSize)
-                    .testTag(LazyListTag),
+                modifier = Modifier.requiredSize(containerSize).testTag(LazyListTag),
                 state = rememberLazyGridState().also { state = it },
-                contentPadding = PaddingValues(
-                    start = smallPaddingSize,
-                    top = largePaddingSize,
-                    end = smallPaddingSize,
-                    bottom = largePaddingSize
-                )
+                contentPadding =
+                    PaddingValues(
+                        start = smallPaddingSize,
+                        top = largePaddingSize,
+                        end = smallPaddingSize,
+                        bottom = largePaddingSize
+                    )
             ) {
-                items(listOf(1)) {
-                    Spacer(Modifier.height(itemSize).testTag(ItemTag))
-                }
+                items(listOf(1)) { Spacer(Modifier.height(itemSize).testTag(ItemTag)) }
             }
         }
 
-        rule.onNodeWithTag(ItemTag)
+        rule
+            .onNodeWithTag(ItemTag)
             .assertLeftPositionInRootIsEqualTo(smallPaddingSize)
             .assertTopPositionInRootIsEqualTo(largePaddingSize)
             .assertWidthIsEqualTo(containerSize - smallPaddingSize * 2)
@@ -111,7 +109,8 @@
 
         state.scrollBy(largePaddingSize)
 
-        rule.onNodeWithTag(ItemTag)
+        rule
+            .onNodeWithTag(ItemTag)
             .assertTopPositionInRootIsEqualTo(0.dp)
             .assertHeightIsEqualTo(itemSize)
     }
@@ -122,17 +121,11 @@
         rule.setContent {
             LazyVerticalGrid(
                 columns = GridCells.Fixed(1),
-                modifier = Modifier.requiredSize(itemSize * 2)
-                    .testTag(LazyListTag),
+                modifier = Modifier.requiredSize(itemSize * 2).testTag(LazyListTag),
                 state = rememberLazyGridState().also { state = it },
-                contentPadding = PaddingValues(
-                    top = itemSize,
-                    bottom = itemSize
-                )
+                contentPadding = PaddingValues(top = itemSize, bottom = itemSize)
             ) {
-                items(listOf(1)) {
-                    Spacer(Modifier.height(itemSize).testTag(ItemTag))
-                }
+                items(listOf(1)) { Spacer(Modifier.height(itemSize).testTag(ItemTag)) }
             }
         }
 
@@ -150,13 +143,9 @@
         rule.setContent {
             LazyVerticalGrid(
                 columns = GridCells.Fixed(1),
-                modifier = Modifier.requiredSize(padding * 2 + itemSize)
-                    .testTag(LazyListTag),
+                modifier = Modifier.requiredSize(padding * 2 + itemSize).testTag(LazyListTag),
                 state = rememberLazyGridState().also { state = it },
-                contentPadding = PaddingValues(
-                    top = padding,
-                    bottom = padding
-                )
+                contentPadding = PaddingValues(top = padding, bottom = padding)
             ) {
                 items((0..3).toList()) {
                     Spacer(Modifier.requiredSize(itemSize).testTag(it.toString()))
@@ -164,25 +153,18 @@
             }
         }
 
-        rule.onNodeWithTag("0")
-            .assertTopPositionInRootIsEqualTo(padding)
-        rule.onNodeWithTag("1")
-            .assertTopPositionInRootIsEqualTo(itemSize + padding)
-        rule.onNodeWithTag("2")
-            .assertTopPositionInRootIsEqualTo(itemSize * 2 + padding)
+        rule.onNodeWithTag("0").assertTopPositionInRootIsEqualTo(padding)
+        rule.onNodeWithTag("1").assertTopPositionInRootIsEqualTo(itemSize + padding)
+        rule.onNodeWithTag("2").assertTopPositionInRootIsEqualTo(itemSize * 2 + padding)
 
         state.scrollBy(padding)
 
         state.assertScrollPosition(1, padding - itemSize)
 
-        rule.onNodeWithTag("0")
-            .assertTopPositionInRootIsEqualTo(0.dp)
-        rule.onNodeWithTag("1")
-            .assertTopPositionInRootIsEqualTo(itemSize)
-        rule.onNodeWithTag("2")
-            .assertTopPositionInRootIsEqualTo(itemSize * 2)
-        rule.onNodeWithTag("3")
-            .assertTopPositionInRootIsEqualTo(itemSize * 3)
+        rule.onNodeWithTag("0").assertTopPositionInRootIsEqualTo(0.dp)
+        rule.onNodeWithTag("1").assertTopPositionInRootIsEqualTo(itemSize)
+        rule.onNodeWithTag("2").assertTopPositionInRootIsEqualTo(itemSize * 2)
+        rule.onNodeWithTag("3").assertTopPositionInRootIsEqualTo(itemSize * 3)
     }
 
     @Test
@@ -192,13 +174,9 @@
         rule.setContent {
             LazyVerticalGrid(
                 columns = GridCells.Fixed(1),
-                modifier = Modifier.requiredSize(itemSize + padding * 2)
-                    .testTag(LazyListTag),
+                modifier = Modifier.requiredSize(itemSize + padding * 2).testTag(LazyListTag),
                 state = rememberLazyGridState().also { state = it },
-                contentPadding = PaddingValues(
-                    top = padding,
-                    bottom = padding
-                )
+                contentPadding = PaddingValues(top = padding, bottom = padding)
             ) {
                 items((0..3).toList()) {
                     Spacer(Modifier.requiredSize(itemSize).testTag(it.toString()))
@@ -211,14 +189,10 @@
 
         state.assertScrollPosition(1, itemSize * 0.5f)
 
-        rule.onNodeWithTag("0")
-            .assertTopPositionInRootIsEqualTo(itemSize * 1.5f - padding)
-        rule.onNodeWithTag("1")
-            .assertTopPositionInRootIsEqualTo(itemSize * 2.5f - padding)
-        rule.onNodeWithTag("2")
-            .assertTopPositionInRootIsEqualTo(itemSize * 3.5f - padding)
-        rule.onNodeWithTag("3")
-            .assertTopPositionInRootIsEqualTo(itemSize * 4.5f - padding)
+        rule.onNodeWithTag("0").assertTopPositionInRootIsEqualTo(itemSize * 1.5f - padding)
+        rule.onNodeWithTag("1").assertTopPositionInRootIsEqualTo(itemSize * 2.5f - padding)
+        rule.onNodeWithTag("2").assertTopPositionInRootIsEqualTo(itemSize * 3.5f - padding)
+        rule.onNodeWithTag("3").assertTopPositionInRootIsEqualTo(itemSize * 4.5f - padding)
     }
 
     @Test
@@ -228,13 +202,9 @@
         rule.setContent {
             LazyVerticalGrid(
                 columns = GridCells.Fixed(1),
-                modifier = Modifier.requiredSize(padding * 2 + itemSize)
-                    .testTag(LazyListTag),
+                modifier = Modifier.requiredSize(padding * 2 + itemSize).testTag(LazyListTag),
                 state = rememberLazyGridState().also { state = it },
-                contentPadding = PaddingValues(
-                    top = padding,
-                    bottom = padding
-                )
+                contentPadding = PaddingValues(top = padding, bottom = padding)
             ) {
                 items((0..3).toList()) {
                     Spacer(Modifier.requiredSize(itemSize).testTag(it.toString()))
@@ -246,24 +216,18 @@
 
         state.assertScrollPosition(3, 0.dp)
 
-        rule.onNodeWithTag("1")
-            .assertTopPositionInRootIsEqualTo(itemSize - padding)
-        rule.onNodeWithTag("2")
-            .assertTopPositionInRootIsEqualTo(itemSize * 2 - padding)
-        rule.onNodeWithTag("3")
-            .assertTopPositionInRootIsEqualTo(itemSize * 3 - padding)
+        rule.onNodeWithTag("1").assertTopPositionInRootIsEqualTo(itemSize - padding)
+        rule.onNodeWithTag("2").assertTopPositionInRootIsEqualTo(itemSize * 2 - padding)
+        rule.onNodeWithTag("3").assertTopPositionInRootIsEqualTo(itemSize * 3 - padding)
 
         // there are no space to scroll anymore, so it should change nothing
         state.scrollBy(10.dp)
 
         state.assertScrollPosition(3, 0.dp)
 
-        rule.onNodeWithTag("1")
-            .assertTopPositionInRootIsEqualTo(itemSize - padding)
-        rule.onNodeWithTag("2")
-            .assertTopPositionInRootIsEqualTo(itemSize * 2 - padding)
-        rule.onNodeWithTag("3")
-            .assertTopPositionInRootIsEqualTo(itemSize * 3 - padding)
+        rule.onNodeWithTag("1").assertTopPositionInRootIsEqualTo(itemSize - padding)
+        rule.onNodeWithTag("2").assertTopPositionInRootIsEqualTo(itemSize * 2 - padding)
+        rule.onNodeWithTag("3").assertTopPositionInRootIsEqualTo(itemSize * 3 - padding)
     }
 
     @Test
@@ -273,13 +237,9 @@
         rule.setContent {
             LazyVerticalGrid(
                 columns = GridCells.Fixed(1),
-                modifier = Modifier.requiredSize(padding * 2 + itemSize)
-                    .testTag(LazyListTag),
+                modifier = Modifier.requiredSize(padding * 2 + itemSize).testTag(LazyListTag),
                 state = rememberLazyGridState().also { state = it },
-                contentPadding = PaddingValues(
-                    top = padding,
-                    bottom = padding
-                )
+                contentPadding = PaddingValues(top = padding, bottom = padding)
             ) {
                 items((0..3).toList()) {
                     Spacer(Modifier.requiredSize(itemSize).testTag(it.toString()))
@@ -292,12 +252,9 @@
 
         state.assertScrollPosition(2, itemSize / 2)
 
-        rule.onNodeWithTag("1")
-            .assertTopPositionInRootIsEqualTo(itemSize * 1.5f - padding)
-        rule.onNodeWithTag("2")
-            .assertTopPositionInRootIsEqualTo(itemSize * 2.5f - padding)
-        rule.onNodeWithTag("3")
-            .assertTopPositionInRootIsEqualTo(itemSize * 3.5f - padding)
+        rule.onNodeWithTag("1").assertTopPositionInRootIsEqualTo(itemSize * 1.5f - padding)
+        rule.onNodeWithTag("2").assertTopPositionInRootIsEqualTo(itemSize * 2.5f - padding)
+        rule.onNodeWithTag("3").assertTopPositionInRootIsEqualTo(itemSize * 3.5f - padding)
     }
 
     @Test
@@ -306,27 +263,23 @@
             Box(modifier = Modifier.testTag(ContainerTag).width(itemSize + 8.dp)) {
                 LazyVerticalGrid(
                     columns = GridCells.Fixed(1),
-                    contentPadding = PaddingValues(
-                        start = 2.dp,
-                        top = 4.dp,
-                        end = 6.dp,
-                        bottom = 8.dp
-                    )
+                    contentPadding =
+                        PaddingValues(start = 2.dp, top = 4.dp, end = 6.dp, bottom = 8.dp)
                 ) {
-                    items(listOf(1)) {
-                        Spacer(Modifier.size(itemSize).testTag(ItemTag))
-                    }
+                    items(listOf(1)) { Spacer(Modifier.size(itemSize).testTag(ItemTag)) }
                 }
             }
         }
 
-        rule.onNodeWithTag(ItemTag)
+        rule
+            .onNodeWithTag(ItemTag)
             .assertLeftPositionInRootIsEqualTo(2.dp)
             .assertTopPositionInRootIsEqualTo(4.dp)
             .assertWidthIsEqualTo(itemSize)
             .assertHeightIsEqualTo(itemSize)
 
-        rule.onNodeWithTag(ContainerTag)
+        rule
+            .onNodeWithTag(ContainerTag)
             .assertLeftPositionInRootIsEqualTo(0.dp)
             .assertTopPositionInRootIsEqualTo(0.dp)
             .assertWidthIsEqualTo(itemSize + 2.dp + 6.dp)
@@ -339,17 +292,14 @@
             Box(modifier = Modifier.testTag(ContainerTag)) {
                 LazyVerticalGrid(
                     columns = GridCells.Fixed(1),
-                    contentPadding = PaddingValues(
-                        start = 2.dp,
-                        top = 4.dp,
-                        end = 6.dp,
-                        bottom = 8.dp
-                    )
-                ) { }
+                    contentPadding =
+                        PaddingValues(start = 2.dp, top = 4.dp, end = 6.dp, bottom = 8.dp)
+                ) {}
             }
         }
 
-        rule.onNodeWithTag(ContainerTag)
+        rule
+            .onNodeWithTag(ContainerTag)
             .assertLeftPositionInRootIsEqualTo(0.dp)
             .assertTopPositionInRootIsEqualTo(0.dp)
             .assertWidthIsEqualTo(8.dp)
@@ -362,19 +312,16 @@
             Box(modifier = Modifier.testTag(ContainerTag)) {
                 LazyVerticalGrid(
                     columns = GridCells.Fixed(1),
-                    contentPadding = PaddingValues(
-                        start = 2.dp,
-                        top = 4.dp,
-                        end = 6.dp,
-                        bottom = 8.dp
-                    )
+                    contentPadding =
+                        PaddingValues(start = 2.dp, top = 4.dp, end = 6.dp, bottom = 8.dp)
                 ) {
-                    items(0) { }
+                    items(0) {}
                 }
             }
         }
 
-        rule.onNodeWithTag(ContainerTag)
+        rule
+            .onNodeWithTag(ContainerTag)
             .assertLeftPositionInRootIsEqualTo(0.dp)
             .assertTopPositionInRootIsEqualTo(0.dp)
             .assertWidthIsEqualTo(8.dp)
@@ -395,19 +342,18 @@
                 modifier = Modifier.size(listSize),
                 contentPadding = PaddingValues(top = topPadding, bottom = bottomPadding),
             ) {
-                items(3) { index ->
-                    Box(Modifier.size(itemSize).testTag("$index"))
-                }
+                items(3) { index -> Box(Modifier.size(itemSize).testTag("$index")) }
             }
         }
 
-        rule.onNodeWithTag("0")
+        rule
+            .onNodeWithTag("0")
             .assertTopPositionInRootIsEqualTo(listSize - bottomPadding - itemSize)
-        rule.onNodeWithTag("1")
+        rule
+            .onNodeWithTag("1")
             .assertTopPositionInRootIsEqualTo(listSize - bottomPadding - itemSize * 2)
         // Partially visible.
-        rule.onNodeWithTag("2")
-            .assertTopPositionInRootIsEqualTo(-itemSize / 2)
+        rule.onNodeWithTag("2").assertTopPositionInRootIsEqualTo(-itemSize / 2)
 
         // Scroll to the top.
         state.scrollBy(itemSize * 2.5f)
@@ -432,17 +378,13 @@
                 modifier = Modifier.size(listSize),
                 contentPadding = PaddingValues(top = topPadding, bottom = bottomPadding),
             ) {
-                items(3) { index ->
-                    Box(Modifier.size(itemSize).testTag("$index"))
-                }
+                items(3) { index -> Box(Modifier.size(itemSize).testTag("$index")) }
             }
         }
 
-        rule.onNodeWithTag("0")
-            .assertTopPositionInRootIsEqualTo(0.dp)
+        rule.onNodeWithTag("0").assertTopPositionInRootIsEqualTo(0.dp)
         // Not visible.
-        rule.onNodeWithTag("1")
-            .assertDoesNotExist()
+        rule.onNodeWithTag("1").assertDoesNotExist()
 
         // Scroll to the top.
         state.scrollBy(itemSize * 5f)
@@ -462,22 +404,20 @@
                 LazyVerticalGrid(
                     GridCells.Fixed(1),
                     state = state,
-                    contentPadding = PaddingValues(
-                        vertical = smallPaddingSize
-                    )
+                    contentPadding = PaddingValues(vertical = smallPaddingSize)
                 ) {
-                    items(2) {
-                        Box(Modifier.testTag("$it").height(itemSize))
-                    }
+                    items(2) { Box(Modifier.testTag("$it").height(itemSize)) }
                 }
             }
         }
 
-        rule.onNodeWithTag("0")
+        rule
+            .onNodeWithTag("0")
             .assertTopPositionInRootIsEqualTo(smallPaddingSize)
             .assertHeightIsEqualTo(itemSize)
 
-        rule.onNodeWithTag("1")
+        rule
+            .onNodeWithTag("1")
             .assertTopPositionInRootIsEqualTo(smallPaddingSize + itemSize)
             .assertHeightIsEqualTo(itemSize)
 
@@ -490,11 +430,13 @@
             }
         }
 
-        rule.onNodeWithTag("1")
+        rule
+            .onNodeWithTag("1")
             .assertTopPositionInRootIsEqualTo(smallPaddingSize)
             .assertHeightIsEqualTo(itemSize)
 
-        rule.onNodeWithTag("0")
+        rule
+            .onNodeWithTag("0")
             .assertTopPositionInRootIsEqualTo(smallPaddingSize - itemSize)
             .assertHeightIsEqualTo(itemSize)
     }
@@ -510,18 +452,14 @@
                     state = state,
                     contentPadding = PaddingValues(vertical = itemSize)
                 ) {
-                    items(4) {
-                        Box(Modifier.testTag("$it").size(itemSize))
-                    }
+                    items(4) { Box(Modifier.testTag("$it").size(itemSize)) }
                 }
             }
         }
 
-        rule.onNodeWithTag("0")
-            .assertTopPositionInRootIsEqualTo(itemSize)
+        rule.onNodeWithTag("0").assertTopPositionInRootIsEqualTo(itemSize)
 
-        rule.onNodeWithTag("1")
-            .assertDoesNotExist()
+        rule.onNodeWithTag("1").assertDoesNotExist()
 
         rule.runOnIdle {
             state.assertScrollPosition(0, 0.dp)
@@ -541,23 +479,18 @@
                     state = state,
                     contentPadding = PaddingValues(vertical = itemSize)
                 ) {
-                    items(4) {
-                        Box(Modifier.testTag("$it").size(itemSize))
-                    }
+                    items(4) { Box(Modifier.testTag("$it").size(itemSize)) }
                 }
             }
         }
 
         state.scrollBy(itemSize)
 
-        rule.onNodeWithTag("0")
-            .assertTopPositionInRootIsEqualTo(0.dp)
+        rule.onNodeWithTag("0").assertTopPositionInRootIsEqualTo(0.dp)
 
-        rule.onNodeWithTag("1")
-            .assertTopPositionInRootIsEqualTo(itemSize)
+        rule.onNodeWithTag("1").assertTopPositionInRootIsEqualTo(itemSize)
 
-        rule.onNodeWithTag("2")
-            .assertIsNotDisplayed()
+        rule.onNodeWithTag("2").assertIsNotDisplayed()
 
         rule.runOnIdle {
             state.assertScrollPosition(1, 0.dp)
@@ -576,23 +509,18 @@
                     state = state,
                     contentPadding = PaddingValues(vertical = itemSize)
                 ) {
-                    items(4) {
-                        Box(Modifier.testTag("$it").size(itemSize))
-                    }
+                    items(4) { Box(Modifier.testTag("$it").size(itemSize)) }
                 }
             }
         }
 
         state.scrollTo(3)
 
-        rule.onNodeWithTag("1")
-            .assertDoesNotExist()
+        rule.onNodeWithTag("1").assertDoesNotExist()
 
-        rule.onNodeWithTag("2")
-            .assertTopPositionInRootIsEqualTo(0.dp)
+        rule.onNodeWithTag("2").assertTopPositionInRootIsEqualTo(0.dp)
 
-        rule.onNodeWithTag("3")
-            .assertTopPositionInRootIsEqualTo(itemSize)
+        rule.onNodeWithTag("3").assertTopPositionInRootIsEqualTo(itemSize)
 
         rule.runOnIdle {
             state.assertScrollPosition(3, 0.dp)
@@ -611,23 +539,18 @@
                     state = state,
                     contentPadding = PaddingValues(vertical = itemSize)
                 ) {
-                    items(4) {
-                        Box(Modifier.testTag("$it").size(itemSize))
-                    }
+                    items(4) { Box(Modifier.testTag("$it").size(itemSize)) }
                 }
             }
         }
 
         state.scrollBy(itemSize * 3)
 
-        rule.onNodeWithTag("1")
-            .assertIsNotDisplayed()
+        rule.onNodeWithTag("1").assertIsNotDisplayed()
 
-        rule.onNodeWithTag("2")
-            .assertTopPositionInRootIsEqualTo(0.dp)
+        rule.onNodeWithTag("2").assertTopPositionInRootIsEqualTo(0.dp)
 
-        rule.onNodeWithTag("3")
-            .assertTopPositionInRootIsEqualTo(itemSize)
+        rule.onNodeWithTag("3").assertTopPositionInRootIsEqualTo(itemSize)
 
         rule.runOnIdle {
             state.assertScrollPosition(3, 0.dp)
@@ -647,20 +570,16 @@
                     state = state,
                     contentPadding = PaddingValues(vertical = itemSize)
                 ) {
-                    items(4) {
-                        Box(Modifier.testTag("$it").size(itemSize))
-                    }
+                    items(4) { Box(Modifier.testTag("$it").size(itemSize)) }
                 }
             }
         }
 
         state.scrollBy(itemSize * 4.5f)
 
-        rule.onNodeWithTag("2")
-            .assertIsNotDisplayed()
+        rule.onNodeWithTag("2").assertIsNotDisplayed()
 
-        rule.onNodeWithTag("3")
-            .assertTopPositionInRootIsEqualTo(-itemSize * 0.5f)
+        rule.onNodeWithTag("3").assertTopPositionInRootIsEqualTo(-itemSize * 0.5f)
 
         rule.runOnIdle {
             state.assertScrollPosition(3, itemSize * 1.5f)
@@ -679,15 +598,12 @@
                     state = state,
                     contentPadding = PaddingValues(vertical = itemSize * 2)
                 ) {
-                    items(4) {
-                        Box(Modifier.testTag("$it").size(itemSize))
-                    }
+                    items(4) { Box(Modifier.testTag("$it").size(itemSize)) }
                 }
             }
         }
 
-        rule.onNodeWithTag("0")
-            .assertIsNotDisplayed()
+        rule.onNodeWithTag("0").assertIsNotDisplayed()
 
         rule.runOnIdle {
             state.assertScrollPosition(0, 0.dp)
@@ -707,23 +623,18 @@
                     state = state,
                     contentPadding = PaddingValues(vertical = itemSize * 2)
                 ) {
-                    items(4) {
-                        Box(Modifier.testTag("$it").size(itemSize))
-                    }
+                    items(4) { Box(Modifier.testTag("$it").size(itemSize)) }
                 }
             }
         }
 
         state.scrollBy(itemSize * 2)
 
-        rule.onNodeWithTag("0")
-            .assertTopPositionInRootIsEqualTo(0.dp)
+        rule.onNodeWithTag("0").assertTopPositionInRootIsEqualTo(0.dp)
 
-        rule.onNodeWithTag("1")
-            .assertTopPositionInRootIsEqualTo(itemSize)
+        rule.onNodeWithTag("1").assertTopPositionInRootIsEqualTo(itemSize)
 
-        rule.onNodeWithTag("2")
-            .assertIsNotDisplayed()
+        rule.onNodeWithTag("2").assertIsNotDisplayed()
 
         rule.runOnIdle {
             state.assertScrollPosition(2, 0.dp)
@@ -742,26 +653,20 @@
                     state = state,
                     contentPadding = PaddingValues(vertical = itemSize * 2)
                 ) {
-                    items(4) {
-                        Box(Modifier.testTag("$it").size(itemSize))
-                    }
+                    items(4) { Box(Modifier.testTag("$it").size(itemSize)) }
                 }
             }
         }
 
         state.scrollTo(3)
 
-        rule.onNodeWithTag("0")
-            .assertIsNotDisplayed()
+        rule.onNodeWithTag("0").assertIsNotDisplayed()
 
-        rule.onNodeWithTag("1")
-            .assertTopPositionInRootIsEqualTo(0.dp)
+        rule.onNodeWithTag("1").assertTopPositionInRootIsEqualTo(0.dp)
 
-        rule.onNodeWithTag("2")
-            .assertTopPositionInRootIsEqualTo(itemSize)
+        rule.onNodeWithTag("2").assertTopPositionInRootIsEqualTo(itemSize)
 
-        rule.onNodeWithTag("3")
-            .assertIsNotDisplayed()
+        rule.onNodeWithTag("3").assertIsNotDisplayed()
 
         rule.runOnIdle {
             state.assertScrollPosition(3, 0.dp)
@@ -780,26 +685,20 @@
                     state = state,
                     contentPadding = PaddingValues(vertical = itemSize * 2)
                 ) {
-                    items(4) {
-                        Box(Modifier.testTag("$it").size(itemSize))
-                    }
+                    items(4) { Box(Modifier.testTag("$it").size(itemSize)) }
                 }
             }
         }
 
         state.scrollBy(itemSize * 3)
 
-        rule.onNodeWithTag("0")
-            .assertIsNotDisplayed()
+        rule.onNodeWithTag("0").assertIsNotDisplayed()
 
-        rule.onNodeWithTag("1")
-            .assertTopPositionInRootIsEqualTo(0.dp)
+        rule.onNodeWithTag("1").assertTopPositionInRootIsEqualTo(0.dp)
 
-        rule.onNodeWithTag("2")
-            .assertTopPositionInRootIsEqualTo(itemSize)
+        rule.onNodeWithTag("2").assertTopPositionInRootIsEqualTo(itemSize)
 
-        rule.onNodeWithTag("3")
-            .assertIsNotDisplayed()
+        rule.onNodeWithTag("3").assertIsNotDisplayed()
 
         rule.runOnIdle {
             state.assertScrollPosition(3, 0.dp)
@@ -819,9 +718,7 @@
                     state = state,
                     contentPadding = PaddingValues(vertical = itemSize * 2)
                 ) {
-                    items(4) {
-                        Box(Modifier.testTag("$it").size(itemSize))
-                    }
+                    items(4) { Box(Modifier.testTag("$it").size(itemSize)) }
                 }
             }
         }
@@ -832,8 +729,7 @@
                 itemSize * 3 // all items
         )
 
-        rule.onNodeWithTag("3")
-            .assertIsNotDisplayed()
+        rule.onNodeWithTag("3").assertIsNotDisplayed()
 
         rule.runOnIdle {
             state.assertScrollPosition(3, itemSize * 3.5f)
@@ -850,19 +746,12 @@
             CompositionLocalProvider(LocalLayoutDirection provides LayoutDirection.Rtl) {
                 LazyVerticalGrid(
                     columns = GridCells.Fixed(1),
-                    modifier = Modifier
-                        .testTag("list")
-                        .requiredHeight(itemSize * 2),
+                    modifier = Modifier.testTag("list").requiredHeight(itemSize * 2),
                     state = state,
                     contentPadding = padding
                 ) {
                     items(4) {
-                        Box(
-                            Modifier
-                                .testTag("$it")
-                                .background(Color.Red)
-                                .size(itemSize)
-                        ) {
+                        Box(Modifier.testTag("$it").background(Color.Red).size(itemSize)) {
                             BasicText("$it")
                         }
                     }
@@ -870,19 +759,17 @@
             }
         }
 
-        rule.onNodeWithTag("0")
+        rule
+            .onNodeWithTag("0")
             .assertTopPositionInRootIsEqualTo(0.dp)
-            .assertLeftPositionInRootIsEqualTo(
-                padding.calculateLeftPadding(LayoutDirection.Rtl)
-            )
+            .assertLeftPositionInRootIsEqualTo(padding.calculateLeftPadding(LayoutDirection.Rtl))
 
         state.scrollBy(itemSize * 4)
 
-        rule.onNodeWithTag("3")
+        rule
+            .onNodeWithTag("3")
             .assertTopPositionInRootIsEqualTo(itemSize)
-            .assertLeftPositionInRootIsEqualTo(
-                padding.calculateLeftPadding(LayoutDirection.Rtl)
-            )
+            .assertLeftPositionInRootIsEqualTo(padding.calculateLeftPadding(LayoutDirection.Rtl))
     }
 
     // @Test
@@ -1222,7 +1109,8 @@
     //     lateinit var state: LazyListState
     //     rule.setContent {
     //         state = rememberLazyListState()
-    //         Box(modifier = Modifier.testTag(ContainerTag).size(itemSize + smallPaddingSize * 2)) {
+    //         Box(modifier = Modifier.testTag(ContainerTag).size(itemSize + smallPaddingSize * 2))
+    // {
     //             LazyRow(
     //                 state = state,
     //                 contentPadding = PaddingValues(
@@ -1268,15 +1156,17 @@
         }
     }
 
-    private fun LazyGridState.assertScrollPosition(index: Int, offset: Dp) = with(rule.density) {
-        assertThat(this@assertScrollPosition.firstVisibleItemIndex).isEqualTo(index)
-        assertThat(firstVisibleItemScrollOffset.toDp().value).isWithin(0.5f).of(offset.value)
-    }
+    private fun LazyGridState.assertScrollPosition(index: Int, offset: Dp) =
+        with(rule.density) {
+            assertThat(this@assertScrollPosition.firstVisibleItemIndex).isEqualTo(index)
+            assertThat(firstVisibleItemScrollOffset.toDp().value).isWithin(0.5f).of(offset.value)
+        }
 
-    private fun LazyGridState.assertLayoutInfoOffsetRange(from: Dp, to: Dp) = with(rule.density) {
-        assertThat(layoutInfo.viewportStartOffset to layoutInfo.viewportEndOffset)
-            .isEqualTo(from.roundToPx() to to.roundToPx())
-    }
+    private fun LazyGridState.assertLayoutInfoOffsetRange(from: Dp, to: Dp) =
+        with(rule.density) {
+            assertThat(layoutInfo.viewportStartOffset to layoutInfo.viewportEndOffset)
+                .isEqualTo(from.roundToPx() to to.roundToPx())
+        }
 
     private fun LazyGridState.assertVisibleItems(vararg expected: Pair<Int, Dp>) =
         with(rule.density) {
@@ -1285,8 +1175,6 @@
         }
 
     fun LazyGridState.scrollTo(index: Int) {
-        runBlocking(Dispatchers.Main + AutoTestFrameClock()) {
-            scrollToItem(index)
-        }
+        runBlocking(Dispatchers.Main + AutoTestFrameClock()) { scrollToItem(index) }
     }
 }
diff --git a/compose/foundation/foundation/integration-tests/lazy-tests/src/androidTest/kotlin/androidx/compose/foundation/lazy/grid/LazyGridsIndexedTest.kt b/compose/foundation/foundation/integration-tests/lazy-tests/src/androidTest/kotlin/androidx/compose/foundation/lazy/grid/LazyGridsIndexedTest.kt
index 53934b3..dce53e0 100644
--- a/compose/foundation/foundation/integration-tests/lazy-tests/src/androidTest/kotlin/androidx/compose/foundation/lazy/grid/LazyGridsIndexedTest.kt
+++ b/compose/foundation/foundation/integration-tests/lazy-tests/src/androidTest/kotlin/androidx/compose/foundation/lazy/grid/LazyGridsIndexedTest.kt
@@ -33,8 +33,7 @@
 
 class LazyGridsIndexedTest {
 
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
     @Test
     fun lazyVerticalGridShowsIndexedItems() {
@@ -43,24 +42,18 @@
         rule.setContent {
             LazyVerticalGrid(GridCells.Fixed(1), Modifier.height(200.dp)) {
                 itemsIndexed(items) { index, item ->
-                    Spacer(
-                        Modifier.height(101.dp).testTag("$index-$item")
-                    )
+                    Spacer(Modifier.height(101.dp).testTag("$index-$item"))
                 }
             }
         }
 
-        rule.onNodeWithTag("0-1")
-            .assertIsDisplayed()
+        rule.onNodeWithTag("0-1").assertIsDisplayed()
 
-        rule.onNodeWithTag("1-2")
-            .assertIsDisplayed()
+        rule.onNodeWithTag("1-2").assertIsDisplayed()
 
-        rule.onNodeWithTag("2-3")
-            .assertDoesNotExist()
+        rule.onNodeWithTag("2-3").assertDoesNotExist()
 
-        rule.onNodeWithTag("3-4")
-            .assertDoesNotExist()
+        rule.onNodeWithTag("3-4").assertDoesNotExist()
     }
 
     @Test
@@ -70,18 +63,14 @@
         rule.setContent {
             LazyVerticalGrid(GridCells.Fixed(1), Modifier.height(200.dp)) {
                 itemsIndexed(items) { index, item ->
-                    BasicText(
-                        "${index}x$item", Modifier.requiredHeight(100.dp)
-                    )
+                    BasicText("${index}x$item", Modifier.requiredHeight(100.dp))
                 }
             }
         }
 
-        rule.onNodeWithText("0x0")
-            .assertTopPositionInRootIsEqualTo(0.dp)
+        rule.onNodeWithText("0x0").assertTopPositionInRootIsEqualTo(0.dp)
 
-        rule.onNodeWithText("1x1")
-            .assertTopPositionInRootIsEqualTo(100.dp)
+        rule.onNodeWithText("1x1").assertTopPositionInRootIsEqualTo(100.dp)
     }
 
     // @Test
diff --git a/compose/foundation/foundation/integration-tests/lazy-tests/src/androidTest/kotlin/androidx/compose/foundation/lazy/grid/LazyGridsReverseLayoutTest.kt b/compose/foundation/foundation/integration-tests/lazy-tests/src/androidTest/kotlin/androidx/compose/foundation/lazy/grid/LazyGridsReverseLayoutTest.kt
index ee7e05e..b5dea1b8 100644
--- a/compose/foundation/foundation/integration-tests/lazy-tests/src/androidTest/kotlin/androidx/compose/foundation/lazy/grid/LazyGridsReverseLayoutTest.kt
+++ b/compose/foundation/foundation/integration-tests/lazy-tests/src/androidTest/kotlin/androidx/compose/foundation/lazy/grid/LazyGridsReverseLayoutTest.kt
@@ -43,16 +43,13 @@
 
     private val ContainerTag = "ContainerTag"
 
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
     private var itemSize: Dp = Dp.Infinity
 
     @Before
     fun before() {
-        with(rule.density) {
-            itemSize = 50.toDp()
-        }
+        with(rule.density) { itemSize = 50.toDp() }
     }
 
     @Test
@@ -63,22 +60,24 @@
                 Modifier.width(itemSize * 2),
                 reverseLayout = true
             ) {
-                items(4) {
-                    Box(Modifier.height(itemSize).testTag(it.toString()))
-                }
+                items(4) { Box(Modifier.height(itemSize).testTag(it.toString())) }
             }
         }
 
-        rule.onNodeWithTag("2")
+        rule
+            .onNodeWithTag("2")
             .assertTopPositionInRootIsEqualTo(0.dp)
             .assertLeftPositionInRootIsEqualTo(0.dp)
-        rule.onNodeWithTag("3")
+        rule
+            .onNodeWithTag("3")
             .assertTopPositionInRootIsEqualTo(0.dp)
             .assertLeftPositionInRootIsEqualTo(itemSize)
-        rule.onNodeWithTag("0")
+        rule
+            .onNodeWithTag("0")
             .assertTopPositionInRootIsEqualTo(itemSize)
             .assertLeftPositionInRootIsEqualTo(0.dp)
-        rule.onNodeWithTag("1")
+        rule
+            .onNodeWithTag("1")
             .assertTopPositionInRootIsEqualTo(itemSize)
             .assertLeftPositionInRootIsEqualTo(itemSize)
     }
@@ -98,28 +97,36 @@
             }
         }
 
-        rule.onNodeWithTag("4")
+        rule
+            .onNodeWithTag("4")
             .assertTopPositionInRootIsEqualTo(0.dp)
             .assertLeftPositionInRootIsEqualTo(0.dp)
-        rule.onNodeWithTag("5")
+        rule
+            .onNodeWithTag("5")
             .assertTopPositionInRootIsEqualTo(0.dp)
             .assertLeftPositionInRootIsEqualTo(0.dp)
-        rule.onNodeWithTag("6")
+        rule
+            .onNodeWithTag("6")
             .assertTopPositionInRootIsEqualTo(0.dp)
             .assertLeftPositionInRootIsEqualTo(itemSize)
-        rule.onNodeWithTag("7")
+        rule
+            .onNodeWithTag("7")
             .assertTopPositionInRootIsEqualTo(0.dp)
             .assertLeftPositionInRootIsEqualTo(itemSize)
-        rule.onNodeWithTag("0")
+        rule
+            .onNodeWithTag("0")
             .assertTopPositionInRootIsEqualTo(itemSize)
             .assertLeftPositionInRootIsEqualTo(0.dp)
-        rule.onNodeWithTag("1")
+        rule
+            .onNodeWithTag("1")
             .assertTopPositionInRootIsEqualTo(itemSize)
             .assertLeftPositionInRootIsEqualTo(0.dp)
-        rule.onNodeWithTag("2")
+        rule
+            .onNodeWithTag("2")
             .assertTopPositionInRootIsEqualTo(itemSize)
             .assertLeftPositionInRootIsEqualTo(itemSize)
-        rule.onNodeWithTag("3")
+        rule
+            .onNodeWithTag("3")
             .assertTopPositionInRootIsEqualTo(itemSize)
             .assertLeftPositionInRootIsEqualTo(itemSize)
     }
@@ -134,9 +141,7 @@
                 state = rememberLazyGridState().also { state = it },
                 modifier = Modifier.size(itemSize * 2).testTag(ContainerTag)
             ) {
-                items((0..5).toList()) {
-                    Box(Modifier.size(itemSize).testTag("$it"))
-                }
+                items((0..5).toList()) { Box(Modifier.size(itemSize).testTag("$it")) }
             }
         }
 
@@ -156,25 +161,20 @@
                 state = rememberLazyGridState().also { state = it },
                 modifier = Modifier.size(itemSize * 2).testTag(ContainerTag)
             ) {
-                items((0..2).toList()) {
-                    Box(Modifier.size(itemSize).testTag("$it"))
-                }
+                items((0..2).toList()) { Box(Modifier.size(itemSize).testTag("$it")) }
             }
         }
 
         // we scroll down and as the scrolling is reversed it shouldn't affect anything
-        rule.onNodeWithTag(ContainerTag)
-            .scrollBy(y = itemSize, density = rule.density)
+        rule.onNodeWithTag(ContainerTag).scrollBy(y = itemSize, density = rule.density)
 
         rule.runOnIdle {
             assertThat(state.firstVisibleItemScrollOffset).isEqualTo(0)
             assertThat(state.firstVisibleItemIndex).isEqualTo(0)
         }
 
-        rule.onNodeWithTag("1")
-            .assertTopPositionInRootIsEqualTo(0.dp)
-        rule.onNodeWithTag("0")
-            .assertTopPositionInRootIsEqualTo(itemSize)
+        rule.onNodeWithTag("1").assertTopPositionInRootIsEqualTo(0.dp)
+        rule.onNodeWithTag("0").assertTopPositionInRootIsEqualTo(itemSize)
     }
 
     @Test
@@ -187,27 +187,22 @@
                 state = rememberLazyGridState().also { state = it },
                 modifier = Modifier.requiredSize(itemSize * 2).testTag(ContainerTag)
             ) {
-                items((0..2).toList()) {
-                    Box(Modifier.requiredSize(itemSize).testTag("$it"))
-                }
+                items((0..2).toList()) { Box(Modifier.requiredSize(itemSize).testTag("$it")) }
             }
         }
 
-        rule.onNodeWithTag(ContainerTag)
-            .scrollBy(y = -itemSize * 0.5f, density = rule.density)
+        rule.onNodeWithTag(ContainerTag).scrollBy(y = -itemSize * 0.5f, density = rule.density)
 
-        val scrolled = rule.runOnIdle {
-            assertThat(state.firstVisibleItemScrollOffset).isGreaterThan(0)
-            assertThat(state.firstVisibleItemIndex).isEqualTo(0)
-            with(rule.density) { state.firstVisibleItemScrollOffset.toDp() }
-        }
+        val scrolled =
+            rule.runOnIdle {
+                assertThat(state.firstVisibleItemScrollOffset).isGreaterThan(0)
+                assertThat(state.firstVisibleItemIndex).isEqualTo(0)
+                with(rule.density) { state.firstVisibleItemScrollOffset.toDp() }
+            }
 
-        rule.onNodeWithTag("2")
-            .assertTopPositionInRootIsEqualTo(-itemSize + scrolled)
-        rule.onNodeWithTag("1")
-            .assertTopPositionInRootIsEqualTo(scrolled)
-        rule.onNodeWithTag("0")
-            .assertTopPositionInRootIsEqualTo(itemSize + scrolled)
+        rule.onNodeWithTag("2").assertTopPositionInRootIsEqualTo(-itemSize + scrolled)
+        rule.onNodeWithTag("1").assertTopPositionInRootIsEqualTo(scrolled)
+        rule.onNodeWithTag("0").assertTopPositionInRootIsEqualTo(itemSize + scrolled)
     }
 
     @Test
@@ -220,28 +215,24 @@
                 state = rememberLazyGridState().also { state = it },
                 modifier = Modifier.size(itemSize * 2).testTag(ContainerTag)
             ) {
-                items((0..3).toList()) {
-                    Box(Modifier.size(itemSize).testTag("$it"))
-                }
+                items((0..3).toList()) { Box(Modifier.size(itemSize).testTag("$it")) }
             }
         }
 
         // we scroll a bit more than it is possible just to make sure we would stop correctly
-        rule.onNodeWithTag(ContainerTag)
-            .scrollBy(y = -itemSize * 2.2f, density = rule.density)
+        rule.onNodeWithTag(ContainerTag).scrollBy(y = -itemSize * 2.2f, density = rule.density)
 
         rule.runOnIdle {
             with(rule.density) {
-                val realOffset = state.firstVisibleItemScrollOffset.toDp() +
-                    itemSize * state.firstVisibleItemIndex
+                val realOffset =
+                    state.firstVisibleItemScrollOffset.toDp() +
+                        itemSize * state.firstVisibleItemIndex
                 assertThat(realOffset).isEqualTo(itemSize * 2)
             }
         }
 
-        rule.onNodeWithTag("3")
-            .assertTopPositionInRootIsEqualTo(0.dp)
-        rule.onNodeWithTag("2")
-            .assertTopPositionInRootIsEqualTo(itemSize)
+        rule.onNodeWithTag("3").assertTopPositionInRootIsEqualTo(0.dp)
+        rule.onNodeWithTag("2").assertTopPositionInRootIsEqualTo(itemSize)
     }
 
     // @Test
@@ -487,39 +478,43 @@
                 Modifier.width(itemSize * 2),
                 reverseLayout = reverse
             ) {
-                items(4) {
-                    Box(Modifier.size(itemSize).testTag(it.toString()))
-                }
+                items(4) { Box(Modifier.size(itemSize).testTag(it.toString())) }
             }
         }
 
-        rule.onNodeWithTag("2")
+        rule
+            .onNodeWithTag("2")
             .assertTopPositionInRootIsEqualTo(0.dp)
             .assertLeftPositionInRootIsEqualTo(0.dp)
-        rule.onNodeWithTag("3")
+        rule
+            .onNodeWithTag("3")
             .assertTopPositionInRootIsEqualTo(0.dp)
             .assertLeftPositionInRootIsEqualTo(itemSize)
-        rule.onNodeWithTag("0")
+        rule
+            .onNodeWithTag("0")
             .assertTopPositionInRootIsEqualTo(itemSize)
             .assertLeftPositionInRootIsEqualTo(0.dp)
-        rule.onNodeWithTag("1")
+        rule
+            .onNodeWithTag("1")
             .assertTopPositionInRootIsEqualTo(itemSize)
             .assertLeftPositionInRootIsEqualTo(itemSize)
 
-        rule.runOnIdle {
-            reverse = false
-        }
+        rule.runOnIdle { reverse = false }
 
-        rule.onNodeWithTag("0")
+        rule
+            .onNodeWithTag("0")
             .assertTopPositionInRootIsEqualTo(0.dp)
             .assertLeftPositionInRootIsEqualTo(0.dp)
-        rule.onNodeWithTag("1")
+        rule
+            .onNodeWithTag("1")
             .assertTopPositionInRootIsEqualTo(0.dp)
             .assertLeftPositionInRootIsEqualTo(itemSize)
-        rule.onNodeWithTag("2")
+        rule
+            .onNodeWithTag("2")
             .assertTopPositionInRootIsEqualTo(itemSize)
             .assertLeftPositionInRootIsEqualTo(0.dp)
-        rule.onNodeWithTag("3")
+        rule
+            .onNodeWithTag("3")
             .assertTopPositionInRootIsEqualTo(itemSize)
             .assertLeftPositionInRootIsEqualTo(itemSize)
     }
diff --git a/compose/foundation/foundation/integration-tests/lazy-tests/src/androidTest/kotlin/androidx/compose/foundation/lazy/grid/LazyNestedScrollingTest.kt b/compose/foundation/foundation/integration-tests/lazy-tests/src/androidTest/kotlin/androidx/compose/foundation/lazy/grid/LazyNestedScrollingTest.kt
index 25502d0..6a2a4cf 100644
--- a/compose/foundation/foundation/integration-tests/lazy-tests/src/androidTest/kotlin/androidx/compose/foundation/lazy/grid/LazyNestedScrollingTest.kt
+++ b/compose/foundation/foundation/integration-tests/lazy-tests/src/androidTest/kotlin/androidx/compose/foundation/lazy/grid/LazyNestedScrollingTest.kt
@@ -46,8 +46,7 @@
 class LazyNestedScrollingTest {
     private val LazyTag = "LazyTag"
 
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
     private val expectedDragOffset = 20f
     private val dragOffsetWithTouchSlop = expectedDragOffset + TestTouchSlop
@@ -61,33 +60,23 @@
             it
         }
         rule.setContentWithTestViewConfiguration {
-            Box(
-                Modifier.scrollable(
-                    orientation = Orientation.Vertical,
-                    state = scrollable
-                )
-            ) {
+            Box(Modifier.scrollable(orientation = Orientation.Vertical, state = scrollable)) {
                 LazyVerticalGrid(
                     GridCells.Fixed(1),
                     Modifier.requiredSize(100.dp).testTag(LazyTag)
                 ) {
-                    items(items) {
-                        Spacer(Modifier.requiredSize(50.dp).testTag("$it"))
-                    }
+                    items(items) { Spacer(Modifier.requiredSize(50.dp).testTag("$it")) }
                 }
             }
         }
 
-        rule.onNodeWithTag(LazyTag)
-            .performTouchInput {
-                down(Offset(x = 10f, y = 10f))
-                moveBy(Offset(x = 0f, y = 100f + TestTouchSlop))
-                up()
-            }
-
-        rule.runOnIdle {
-            Truth.assertThat(draggedOffset).isEqualTo(100f)
+        rule.onNodeWithTag(LazyTag).performTouchInput {
+            down(Offset(x = 10f, y = 10f))
+            moveBy(Offset(x = 0f, y = 100f + TestTouchSlop))
+            up()
         }
+
+        rule.runOnIdle { Truth.assertThat(draggedOffset).isEqualTo(100f) }
     }
 
     @Test
@@ -99,43 +88,31 @@
             it
         }
         rule.setContentWithTestViewConfiguration {
-            Box(
-                Modifier.scrollable(
-                    orientation = Orientation.Vertical,
-                    state = scrollable
-                )
-            ) {
+            Box(Modifier.scrollable(orientation = Orientation.Vertical, state = scrollable)) {
                 LazyVerticalGrid(
                     GridCells.Fixed(1),
                     Modifier.requiredSize(100.dp).testTag(LazyTag)
                 ) {
-                    items(items) {
-                        Box(Modifier.requiredHeight(50.dp).testTag("$it"))
-                    }
+                    items(items) { Box(Modifier.requiredHeight(50.dp).testTag("$it")) }
                 }
             }
         }
 
         // scroll forward
-        rule.onNodeWithTag(LazyTag)
-            .scrollBy(y = 20.dp, density = rule.density)
+        rule.onNodeWithTag(LazyTag).scrollBy(y = 20.dp, density = rule.density)
 
         // scroll back so we again on 0 position
         // we scroll one extra dp to prevent rounding issues
-        rule.onNodeWithTag(LazyTag)
-            .scrollBy(y = -(21.dp), density = rule.density)
+        rule.onNodeWithTag(LazyTag).scrollBy(y = -(21.dp), density = rule.density)
 
-        rule.onNodeWithTag(LazyTag)
-            .performTouchInput {
-                draggedOffset = 0f
-                down(Offset(x = 100f, y = 100f))
-                moveBy(Offset(x = 0f, y = dragOffsetWithTouchSlop))
-                up()
-            }
-
-        rule.runOnIdle {
-            Truth.assertThat(draggedOffset).isEqualTo(expectedDragOffset)
+        rule.onNodeWithTag(LazyTag).performTouchInput {
+            draggedOffset = 0f
+            down(Offset(x = 100f, y = 100f))
+            moveBy(Offset(x = 0f, y = dragOffsetWithTouchSlop))
+            up()
         }
+
+        rule.runOnIdle { Truth.assertThat(draggedOffset).isEqualTo(expectedDragOffset) }
     }
 
     @Test
@@ -147,33 +124,23 @@
             it
         }
         rule.setContentWithTestViewConfiguration {
-            Box(
-                Modifier.scrollable(
-                    orientation = Orientation.Vertical,
-                    state = scrollable
-                )
-            ) {
+            Box(Modifier.scrollable(orientation = Orientation.Vertical, state = scrollable)) {
                 LazyVerticalGrid(
                     GridCells.Fixed(1),
                     Modifier.requiredSize(100.dp).testTag(LazyTag)
                 ) {
-                    items(items) {
-                        Spacer(Modifier.requiredSize(40.dp).testTag("$it"))
-                    }
+                    items(items) { Spacer(Modifier.requiredSize(40.dp).testTag("$it")) }
                 }
             }
         }
 
-        rule.onNodeWithTag(LazyTag)
-            .performTouchInput {
-                down(Offset(x = 10f, y = 10f))
-                moveBy(Offset(x = 0f, y = -dragOffsetWithTouchSlop))
-                up()
-            }
-
-        rule.runOnIdle {
-            Truth.assertThat(draggedOffset).isEqualTo(-expectedDragOffset)
+        rule.onNodeWithTag(LazyTag).performTouchInput {
+            down(Offset(x = 10f, y = 10f))
+            moveBy(Offset(x = 0f, y = -dragOffsetWithTouchSlop))
+            up()
         }
+
+        rule.runOnIdle { Truth.assertThat(draggedOffset).isEqualTo(-expectedDragOffset) }
     }
 
     @Test
@@ -185,38 +152,27 @@
             it
         }
         rule.setContentWithTestViewConfiguration {
-            Box(
-                Modifier.scrollable(
-                    orientation = Orientation.Vertical,
-                    state = scrollable
-                )
-            ) {
+            Box(Modifier.scrollable(orientation = Orientation.Vertical, state = scrollable)) {
                 LazyVerticalGrid(
                     GridCells.Fixed(1),
                     Modifier.requiredSize(100.dp).testTag(LazyTag)
                 ) {
-                    items(items) {
-                        Spacer(Modifier.requiredSize(50.dp).testTag("$it"))
-                    }
+                    items(items) { Spacer(Modifier.requiredSize(50.dp).testTag("$it")) }
                 }
             }
         }
 
         // scroll till the end
-        rule.onNodeWithTag(LazyTag)
-            .scrollBy(y = 55.dp, density = rule.density)
+        rule.onNodeWithTag(LazyTag).scrollBy(y = 55.dp, density = rule.density)
 
-        rule.onNodeWithTag(LazyTag)
-            .performTouchInput {
-                draggedOffset = 0f
-                down(Offset(x = 10f, y = 10f))
-                moveBy(Offset(x = 0f, y = -dragOffsetWithTouchSlop))
-                up()
-            }
-
-        rule.runOnIdle {
-            Truth.assertThat(draggedOffset).isEqualTo(-expectedDragOffset)
+        rule.onNodeWithTag(LazyTag).performTouchInput {
+            draggedOffset = 0f
+            down(Offset(x = 10f, y = 10f))
+            moveBy(Offset(x = 0f, y = -dragOffsetWithTouchSlop))
+            up()
         }
+
+        rule.runOnIdle { Truth.assertThat(draggedOffset).isEqualTo(-expectedDragOffset) }
     }
 
     // @Test
diff --git a/compose/foundation/foundation/integration-tests/lazy-tests/src/androidTest/kotlin/androidx/compose/foundation/lazy/grid/LazyScrollAccessibilityTest.kt b/compose/foundation/foundation/integration-tests/lazy-tests/src/androidTest/kotlin/androidx/compose/foundation/lazy/grid/LazyScrollAccessibilityTest.kt
index 3371446..7286b83 100644
--- a/compose/foundation/foundation/integration-tests/lazy-tests/src/androidTest/kotlin/androidx/compose/foundation/lazy/grid/LazyScrollAccessibilityTest.kt
+++ b/compose/foundation/foundation/integration-tests/lazy-tests/src/androidTest/kotlin/androidx/compose/foundation/lazy/grid/LazyScrollAccessibilityTest.kt
@@ -55,15 +55,10 @@
 
 @MediumTest
 @RunWith(Parameterized::class)
-class LazyScrollAccessibilityTest(
-    private val config: TestConfig
-) : BaseLazyGridTestWithOrientation(config.orientation) {
+class LazyScrollAccessibilityTest(private val config: TestConfig) :
+    BaseLazyGridTestWithOrientation(config.orientation) {
 
-    data class TestConfig(
-        val orientation: Orientation,
-        val rtl: Boolean,
-        val reversed: Boolean
-    ) {
+    data class TestConfig(val orientation: Orientation, val rtl: Boolean, val reversed: Boolean) {
         val horizontal = orientation == Orientation.Horizontal
         val vertical = !horizontal
 
@@ -80,9 +75,7 @@
         fun params() =
             listOf(Orientation.Horizontal, Orientation.Vertical).flatMap { horizontal ->
                 listOf(false, true).flatMap { rtl ->
-                    listOf(false, true).map { reversed ->
-                        TestConfig(horizontal, rtl, reversed)
-                    }
+                    listOf(false, true).map { reversed -> TestConfig(horizontal, rtl, reversed) }
                 }
             }
     }
@@ -90,14 +83,16 @@
     private val scrollerTag = "ScrollerTest"
     private var composeView: View? = null
     private val accessibilityNodeProvider: AccessibilityNodeProvider
-        get() = checkNotNull(composeView) {
-            "composeView not initialized. Did `composeView = LocalView.current` not work?"
-        }.let { composeView ->
-            ViewCompat
-                .getAccessibilityDelegate(composeView)!!
-                .getAccessibilityNodeProvider(composeView)!!
-                .provider as AccessibilityNodeProvider
-        }
+        get() =
+            checkNotNull(composeView) {
+                    "composeView not initialized. Did `composeView = LocalView.current` not work?"
+                }
+                .let { composeView ->
+                    ViewCompat.getAccessibilityDelegate(composeView)!!.getAccessibilityNodeProvider(
+                            composeView
+                        )!!
+                        .provider as AccessibilityNodeProvider
+                }
 
     private val itemSize = 21
     private var itemSizeDp: Dp = Dp.Unspecified
@@ -157,10 +152,7 @@
     @Test
     fun verifyScrollActionsInMiddle() {
         createScrollableContent_StartInMiddle()
-        verifyNodeInfoScrollActions(
-            expectForward = true,
-            expectBackward = true
-        )
+        verifyNodeInfoScrollActions(expectForward = true, expectBackward = true)
     }
 
     @Test
@@ -173,12 +165,12 @@
     }
 
     /**
-     * Setup the test, run the given [accessibilityAction], and check if the [canonicalTarget]
-     * has been reached. The canonical target is the item that we expect to see when moving
-     * forward in a non-reversed scrollable (e.g. down in LazyColumn or right in LazyRow in LTR).
-     * The actual target is either the canonical target or the target that is as far from the
-     * middle of the lazy list as the canonical target, but on the other side of the middle,
-     * depending on the [configuration][config].
+     * Setup the test, run the given [accessibilityAction], and check if the [canonicalTarget] has
+     * been reached. The canonical target is the item that we expect to see when moving forward in a
+     * non-reversed scrollable (e.g. down in LazyColumn or right in LazyRow in LTR). The actual
+     * target is either the canonical target or the target that is as far from the middle of the
+     * lazy list as the canonical target, but on the other side of the middle, depending on the
+     * [configuration][config].
      */
     private fun testRelativeDirection(canonicalTarget: Int, accessibilityAction: Int) {
         val target = if (!config.reversed) canonicalTarget else 100 - canonicalTarget - 1
@@ -186,12 +178,12 @@
     }
 
     /**
-     * Setup the test, run the given [accessibilityAction], and check if the [canonicalTarget]
-     * has been reached (but only if we [expect][expectActionSuccess] the action to succeed).
-     * The canonical target is the item that we expect to see when moving forward in a
-     * non-reversed scrollable (e.g. down in LazyColumn or right in LazyRow in LTR). The actual
-     * target is either the canonical target or the target that is as far from the middle of the
-     * scrollable as the canonical target, but on the other side of the middle, depending on the
+     * Setup the test, run the given [accessibilityAction], and check if the [canonicalTarget] has
+     * been reached (but only if we [expect][expectActionSuccess] the action to succeed). The
+     * canonical target is the item that we expect to see when moving forward in a non-reversed
+     * scrollable (e.g. down in LazyColumn or right in LazyRow in LTR). The actual target is either
+     * the canonical target or the target that is as far from the middle of the scrollable as the
+     * canonical target, but on the other side of the middle, depending on the
      * [configuration][config].
      */
     private fun testAbsoluteDirection(
@@ -221,9 +213,10 @@
         createScrollableContent_StartInMiddle()
         rule.onNodeWithText("$target").assertDoesNotExist()
 
-        val returnValue = rule.onNodeWithTag(scrollerTag).withSemanticsNode {
-            accessibilityNodeProvider.performAction(id, accessibilityAction, null)
-        }
+        val returnValue =
+            rule.onNodeWithTag(scrollerTag).withSemanticsNode {
+                accessibilityNodeProvider.performAction(id, accessibilityAction, null)
+            }
 
         assertThat(returnValue).isEqualTo(expectActionSuccess)
         if (expectActionSuccess) {
@@ -240,11 +233,10 @@
      * [reversing][TestConfig.reversed].
      */
     private fun verifyNodeInfoScrollActions(expectForward: Boolean, expectBackward: Boolean) {
-        val nodeInfo = rule.onNodeWithTag(scrollerTag).withSemanticsNode {
-            rule.runOnUiThread {
-                accessibilityNodeProvider.createAccessibilityNodeInfo(id)!!
+        val nodeInfo =
+            rule.onNodeWithTag(scrollerTag).withSemanticsNode {
+                rule.runOnUiThread { accessibilityNodeProvider.createAccessibilityNodeInfo(id)!! }
             }
-        }
 
         val actions = nodeInfo.actionList.map { it.id }
 
@@ -285,9 +277,7 @@
         }
     }
 
-    /**
-     * Creates a Row/Column that starts in the middle, according to [createScrollableContent]
-     */
+    /** Creates a Row/Column that starts in the middle, according to [createScrollableContent] */
     private fun createScrollableContent_StartInMiddle() {
         createScrollableContent {
             // Start at the middle:
@@ -295,16 +285,11 @@
             // Viewport size: 200 rect - 50 padding on both sides = 100
             // Content outside viewport: 2100 - 100 = 2000
             // -> centered when 1000 on either side, which is 47 items + 13
-            rememberLazyGridState(
-                47,
-                13
-            )
+            rememberLazyGridState(47, 13)
         }
     }
 
-    /**
-     * Creates a Row/Column that starts at the last item, according to [createScrollableContent]
-     */
+    /** Creates a Row/Column that starts at the last item, according to [createScrollableContent] */
     private fun createScrollableContent_StartAtEnd() {
         createScrollableContent {
             // Start at the end:
@@ -312,18 +297,15 @@
             // Viewport size: 200 rect - 50 padding on both sides = 100
             // Content outside viewport: 2100 - 100 = 2000
             // -> at the end when offset at 2000, which is 95 items + 5
-            rememberLazyGridState(
-                95,
-                5
-            )
+            rememberLazyGridState(95, 5)
         }
     }
 
     /**
-     * Creates a grid with a viewport of 100 px, containing 100 items each 21 px in size.
-     * The items have a text with their index (ASC), and where the viewport starts is determined
-     * by the given [lambda][rememberLazyGridState]. All properties from [config] are applied.
-     * The viewport has padding around it to make sure scroll distance doesn't include padding.
+     * Creates a grid with a viewport of 100 px, containing 100 items each 21 px in size. The items
+     * have a text with their index (ASC), and where the viewport starts is determined by the given
+     * [lambda][rememberLazyGridState]. All properties from [config] are applied. The viewport has
+     * padding around it to make sure scroll distance doesn't include padding.
      */
     private fun createScrollableContent(rememberLazyGridState: @Composable () -> LazyGridState) {
         rule.setContent {
diff --git a/compose/foundation/foundation/integration-tests/lazy-tests/src/androidTest/kotlin/androidx/compose/foundation/lazy/grid/LazyScrollTest.kt b/compose/foundation/foundation/integration-tests/lazy-tests/src/androidTest/kotlin/androidx/compose/foundation/lazy/grid/LazyScrollTest.kt
index 7a9fa96..cde76b9 100644
--- a/compose/foundation/foundation/integration-tests/lazy-tests/src/androidTest/kotlin/androidx/compose/foundation/lazy/grid/LazyScrollTest.kt
+++ b/compose/foundation/foundation/integration-tests/lazy-tests/src/androidTest/kotlin/androidx/compose/foundation/lazy/grid/LazyScrollTest.kt
@@ -47,8 +47,7 @@
 @MediumTest
 // @RunWith(Parameterized::class)
 class LazyScrollTest { // (private val orientation: Orientation)
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
     private val vertical: Boolean
         get() = true // orientation == Orientation.Vertical
@@ -83,9 +82,7 @@
                 TestContent(spacingPx.toDp(), containerSizePx.toDp(), afterContentPaddingPx.toDp())
             }
         }
-        runBlocking {
-            assertBlock()
-        }
+        runBlocking { assertBlock() }
     }
 
     @Test
@@ -97,9 +94,7 @@
 
     @Test
     fun scrollToItem() = testScroll {
-        withContext(Dispatchers.Main + AutoTestFrameClock()) {
-            state.scrollToItem(2)
-        }
+        withContext(Dispatchers.Main + AutoTestFrameClock()) { state.scrollToItem(2) }
         assertThat(state.firstVisibleItemIndex).isEqualTo(2)
         assertThat(state.firstVisibleItemScrollOffset).isEqualTo(0)
         withContext(Dispatchers.Main + AutoTestFrameClock()) {
@@ -112,18 +107,14 @@
 
     @Test
     fun scrollToItemWithOffset() = testScroll {
-        withContext(Dispatchers.Main + AutoTestFrameClock()) {
-            state.scrollToItem(6, 10)
-        }
+        withContext(Dispatchers.Main + AutoTestFrameClock()) { state.scrollToItem(6, 10) }
         assertThat(state.firstVisibleItemIndex).isEqualTo(6)
         assertThat(state.firstVisibleItemScrollOffset).isEqualTo(10)
     }
 
     @Test
     fun scrollToItemWithNegativeOffset() = testScroll {
-        withContext(Dispatchers.Main + AutoTestFrameClock()) {
-            state.scrollToItem(6, -10)
-        }
+        withContext(Dispatchers.Main + AutoTestFrameClock()) { state.scrollToItem(6, -10) }
         assertThat(state.firstVisibleItemIndex).isEqualTo(4)
         val item6Offset = state.layoutInfo.visibleItemsInfo.first { it.index == 6 }.offset.y
         assertThat(item6Offset).isEqualTo(10)
@@ -149,9 +140,7 @@
 
     @Test
     fun scrollToItemWithIndexLargerThanItemsCount() = testScroll {
-        withContext(Dispatchers.Main + AutoTestFrameClock()) {
-            state.scrollToItem(itemsCount + 4)
-        }
+        withContext(Dispatchers.Main + AutoTestFrameClock()) { state.scrollToItem(itemsCount + 4) }
         assertThat(state.firstVisibleItemIndex).isEqualTo(itemsCount - 6)
     }
 
@@ -172,27 +161,21 @@
 
     @Test
     fun animateScrollToItem() = testScroll {
-        withContext(Dispatchers.Main + AutoTestFrameClock()) {
-            state.animateScrollToItem(10, 10)
-        }
+        withContext(Dispatchers.Main + AutoTestFrameClock()) { state.animateScrollToItem(10, 10) }
         assertThat(state.firstVisibleItemIndex).isEqualTo(10)
         assertThat(state.firstVisibleItemScrollOffset).isEqualTo(10)
     }
 
     @Test
     fun animateScrollToItemWithOffset() = testScroll {
-        withContext(Dispatchers.Main + AutoTestFrameClock()) {
-            state.animateScrollToItem(6, 10)
-        }
+        withContext(Dispatchers.Main + AutoTestFrameClock()) { state.animateScrollToItem(6, 10) }
         assertThat(state.firstVisibleItemIndex).isEqualTo(6)
         assertThat(state.firstVisibleItemScrollOffset).isEqualTo(10)
     }
 
     @Test
     fun animateScrollToItemWithNegativeOffset() = testScroll {
-        withContext(Dispatchers.Main + AutoTestFrameClock()) {
-            state.animateScrollToItem(6, -10)
-        }
+        withContext(Dispatchers.Main + AutoTestFrameClock()) { state.animateScrollToItem(6, -10) }
         assertThat(state.firstVisibleItemIndex).isEqualTo(4)
         val item6Offset = state.layoutInfo.visibleItemsInfo.first { it.index == 6 }.offset.y
         assertThat(item6Offset).isEqualTo(10)
@@ -225,9 +208,7 @@
     }
 
     @Test
-    fun animatePerFrameForwardToVisibleItem() = testScroll {
-        assertSpringAnimation(toIndex = 4)
-    }
+    fun animatePerFrameForwardToVisibleItem() = testScroll { assertSpringAnimation(toIndex = 4) }
 
     @Test
     fun animatePerFrameForwardToVisibleItemWithOffset() = testScroll {
@@ -287,9 +268,7 @@
 
     @Test
     fun canScrollBackward() = testScroll {
-        withContext(Dispatchers.Main + AutoTestFrameClock()) {
-            state.scrollToItem(itemsCount)
-        }
+        withContext(Dispatchers.Main + AutoTestFrameClock()) { state.scrollToItem(itemsCount) }
         assertThat(state.firstVisibleItemIndex).isEqualTo(itemsCount - 6)
         assertThat(state.canScrollForward).isFalse()
         assertThat(state.canScrollBackward).isTrue()
@@ -297,112 +276,112 @@
 
     @Test
     fun canScrollForwardAndBackward() = testScroll {
-        withContext(Dispatchers.Main + AutoTestFrameClock()) {
-            state.scrollToItem(10)
-        }
+        withContext(Dispatchers.Main + AutoTestFrameClock()) { state.scrollToItem(10) }
         assertThat(state.firstVisibleItemIndex).isEqualTo(10)
         assertThat(state.canScrollForward).isTrue()
         assertThat(state.canScrollBackward).isTrue()
     }
 
     @Test
-    fun canScrollForwardAndBackward_afterSmallScrollFromStart() = testScroll(
-        containerSizePx = (itemSizePx * 1.5f).roundToInt()
-    ) {
-        val delta = (itemSizePx / 3f).roundToInt()
-        withContext(Dispatchers.Main + AutoTestFrameClock()) {
-            // small enough scroll to not cause any new items to be composed or old ones disposed.
-            state.scrollBy(delta.toFloat())
+    fun canScrollForwardAndBackward_afterSmallScrollFromStart() =
+        testScroll(containerSizePx = (itemSizePx * 1.5f).roundToInt()) {
+            val delta = (itemSizePx / 3f).roundToInt()
+            withContext(Dispatchers.Main + AutoTestFrameClock()) {
+                // small enough scroll to not cause any new items to be composed or old ones
+                // disposed.
+                state.scrollBy(delta.toFloat())
+            }
+            rule.runOnIdle {
+                assertThat(state.firstVisibleItemScrollOffset).isEqualTo(delta)
+                assertThat(state.canScrollForward).isTrue()
+                assertThat(state.canScrollBackward).isTrue()
+            }
+            // and scroll back to start
+            withContext(Dispatchers.Main + AutoTestFrameClock()) {
+                state.scrollBy(-delta.toFloat())
+            }
+            rule.runOnIdle {
+                assertThat(state.canScrollForward).isTrue()
+                assertThat(state.canScrollBackward).isFalse()
+            }
         }
-        rule.runOnIdle {
-            assertThat(state.firstVisibleItemScrollOffset).isEqualTo(delta)
-            assertThat(state.canScrollForward).isTrue()
-            assertThat(state.canScrollBackward).isTrue()
-        }
-        // and scroll back to start
-        withContext(Dispatchers.Main + AutoTestFrameClock()) {
-            state.scrollBy(-delta.toFloat())
-        }
-        rule.runOnIdle {
-            assertThat(state.canScrollForward).isTrue()
-            assertThat(state.canScrollBackward).isFalse()
-        }
-    }
 
     @Test
-    fun canScrollForwardAndBackward_afterSmallScrollFromEnd() = testScroll(
-        containerSizePx = (itemSizePx * 1.5f).roundToInt()
-    ) {
-        val delta = -(itemSizePx / 3f).roundToInt()
-        withContext(Dispatchers.Main + AutoTestFrameClock()) {
-            // scroll to the end of the list.
-            state.scrollToItem(itemsCount)
-            // small enough scroll to not cause any new items to be composed or old ones disposed.
-            state.scrollBy(delta.toFloat())
+    fun canScrollForwardAndBackward_afterSmallScrollFromEnd() =
+        testScroll(containerSizePx = (itemSizePx * 1.5f).roundToInt()) {
+            val delta = -(itemSizePx / 3f).roundToInt()
+            withContext(Dispatchers.Main + AutoTestFrameClock()) {
+                // scroll to the end of the list.
+                state.scrollToItem(itemsCount)
+                // small enough scroll to not cause any new items to be composed or old ones
+                // disposed.
+                state.scrollBy(delta.toFloat())
+            }
+            rule.runOnIdle {
+                assertThat(state.canScrollForward).isTrue()
+                assertThat(state.canScrollBackward).isTrue()
+            }
+            // and scroll back to the end
+            withContext(Dispatchers.Main + AutoTestFrameClock()) {
+                state.scrollBy(-delta.toFloat())
+            }
+            rule.runOnIdle {
+                assertThat(state.canScrollForward).isFalse()
+                assertThat(state.canScrollBackward).isTrue()
+            }
         }
-        rule.runOnIdle {
-            assertThat(state.canScrollForward).isTrue()
-            assertThat(state.canScrollBackward).isTrue()
-        }
-        // and scroll back to the end
-        withContext(Dispatchers.Main + AutoTestFrameClock()) {
-            state.scrollBy(-delta.toFloat())
-        }
-        rule.runOnIdle {
-            assertThat(state.canScrollForward).isFalse()
-            assertThat(state.canScrollBackward).isTrue()
-        }
-    }
 
     @Test
-    fun canScrollForwardAndBackward_afterSmallScrollFromEnd_withContentPadding() = testScroll(
-        containerSizePx = (itemSizePx * 1.5f).roundToInt(),
-        afterContentPaddingPx = 2,
-    ) {
-        val delta = -(itemSizePx / 3f).roundToInt()
-        withContext(Dispatchers.Main + AutoTestFrameClock()) {
-            // scroll to the end of the list.
-            state.scrollToItem(itemsCount)
+    fun canScrollForwardAndBackward_afterSmallScrollFromEnd_withContentPadding() =
+        testScroll(
+            containerSizePx = (itemSizePx * 1.5f).roundToInt(),
+            afterContentPaddingPx = 2,
+        ) {
+            val delta = -(itemSizePx / 3f).roundToInt()
+            withContext(Dispatchers.Main + AutoTestFrameClock()) {
+                // scroll to the end of the list.
+                state.scrollToItem(itemsCount)
 
-            assertThat(state.canScrollForward).isFalse()
-            assertThat(state.canScrollBackward).isTrue()
+                assertThat(state.canScrollForward).isFalse()
+                assertThat(state.canScrollBackward).isTrue()
 
-            // small enough scroll to not cause any new items to be composed or old ones disposed.
-            state.scrollBy(delta.toFloat())
+                // small enough scroll to not cause any new items to be composed or old ones
+                // disposed.
+                state.scrollBy(delta.toFloat())
+            }
+            rule.runOnIdle {
+                assertThat(state.canScrollForward).isTrue()
+                assertThat(state.canScrollBackward).isTrue()
+            }
+            // and scroll back to the end
+            withContext(Dispatchers.Main + AutoTestFrameClock()) {
+                state.scrollBy(-delta.toFloat())
+            }
+            rule.runOnIdle {
+                assertThat(state.canScrollForward).isFalse()
+                assertThat(state.canScrollBackward).isTrue()
+            }
         }
-        rule.runOnIdle {
-            assertThat(state.canScrollForward).isTrue()
-            assertThat(state.canScrollBackward).isTrue()
-        }
-        // and scroll back to the end
-        withContext(Dispatchers.Main + AutoTestFrameClock()) {
-            state.scrollBy(-delta.toFloat())
-        }
-        rule.runOnIdle {
-            assertThat(state.canScrollForward).isFalse()
-            assertThat(state.canScrollBackward).isTrue()
-        }
-    }
 
     @Test
-    fun animatePerFrameForwardWithSpacing() = testScroll(spacingPx = 10) {
-        assertSpringAnimation(toIndex = 16, spacingPx = 10)
-    }
+    fun animatePerFrameForwardWithSpacing() =
+        testScroll(spacingPx = 10) { assertSpringAnimation(toIndex = 16, spacingPx = 10) }
 
     @Test
-    fun animatePerFrameForwardWithNegativeSpacing() = testScroll(spacingPx = -10) {
-        assertSpringAnimation(toIndex = 16, spacingPx = -10)
-    }
+    fun animatePerFrameForwardWithNegativeSpacing() =
+        testScroll(spacingPx = -10) { assertSpringAnimation(toIndex = 16, spacingPx = -10) }
 
     @Test
-    fun animatePerFrameBackwardWithSpacing() = testScroll(spacingPx = 10) {
-        assertSpringAnimation(toIndex = 2, fromIndex = 12, spacingPx = 10)
-    }
+    fun animatePerFrameBackwardWithSpacing() =
+        testScroll(spacingPx = 10) {
+            assertSpringAnimation(toIndex = 2, fromIndex = 12, spacingPx = 10)
+        }
 
     @Test
-    fun animatePerFrameBackwardWithNegativeSpacing() = testScroll(spacingPx = -10) {
-        assertSpringAnimation(toIndex = 2, fromIndex = 12, spacingPx = -10)
-    }
+    fun animatePerFrameBackwardWithNegativeSpacing() =
+        testScroll(spacingPx = -10) {
+            assertSpringAnimation(toIndex = 2, fromIndex = 12, spacingPx = -10)
+        }
 
     private fun assertSpringAnimation(
         toIndex: Int,
@@ -412,11 +391,7 @@
         spacingPx: Int = 0
     ) {
         if (fromIndex != 0 || fromOffset != 0) {
-            rule.runOnIdle {
-                runBlocking {
-                    state.scrollToItem(fromIndex, fromOffset)
-                }
-            }
+            rule.runOnIdle { runBlocking { state.scrollToItem(fromIndex, fromOffset) } }
         }
         rule.waitForIdle()
 
@@ -425,9 +400,7 @@
 
         rule.mainClock.autoAdvance = false
 
-        scope.launch {
-            state.animateScrollToItem(toIndex, toOffset)
-        }
+        scope.launch { state.animateScrollToItem(toIndex, toOffset) }
 
         while (!state.isScrollInProgress) {
             Thread.sleep(5)
@@ -444,14 +417,15 @@
         var expectedTime = rule.mainClock.currentTime
         for (i in 0..duration step FrameDuration) {
             val nanosTime = TimeUnit.MILLISECONDS.toNanos(i)
-            val expectedValue =
-                spec.getValueFromNanos(nanosTime, startOffset, endOffset, 0f)
+            val expectedValue = spec.getValueFromNanos(nanosTime, startOffset, endOffset, 0f)
             val actualValue =
                 state.firstVisibleItemIndex / 2 * itemWSpacing + state.firstVisibleItemScrollOffset
             assertWithMessage(
-                "On animation frame at $i index=${state.firstVisibleItemIndex} " +
-                    "offset=${state.firstVisibleItemScrollOffset} expectedValue=$expectedValue"
-            ).that(actualValue).isEqualTo(expectedValue.roundToInt(), tolerance = 1)
+                    "On animation frame at $i index=${state.firstVisibleItemIndex} " +
+                        "offset=${state.firstVisibleItemScrollOffset} expectedValue=$expectedValue"
+                )
+                .that(actualValue)
+                .isEqualTo(expectedValue.roundToInt(), tolerance = 1)
 
             rule.mainClock.advanceTimeBy(FrameDuration)
             expectedTime += FrameDuration
@@ -472,9 +446,7 @@
                 contentPadding = PaddingValues(bottom = afterContentPaddingDp),
                 verticalArrangement = Arrangement.spacedBy(spacingDp)
             ) {
-                items(itemsCount) {
-                    ItemContent()
-                }
+                items(itemsCount) { ItemContent() }
             }
         } else {
             // LazyRow(Modifier.width(300.dp), state) {
@@ -487,11 +459,12 @@
 
     @Composable
     private fun ItemContent() {
-        val modifier = if (vertical) {
-            Modifier.height(itemSizeDp)
-        } else {
-            Modifier.width(itemSizeDp)
-        }
+        val modifier =
+            if (vertical) {
+                Modifier.height(itemSizeDp)
+            } else {
+                Modifier.width(itemSizeDp)
+            }
         Spacer(modifier)
     }
 
diff --git a/compose/foundation/foundation/integration-tests/lazy-tests/src/androidTest/kotlin/androidx/compose/foundation/lazy/grid/LazySemanticsTest.kt b/compose/foundation/foundation/integration-tests/lazy-tests/src/androidTest/kotlin/androidx/compose/foundation/lazy/grid/LazySemanticsTest.kt
index d7ca27a..924ccce 100644
--- a/compose/foundation/foundation/integration-tests/lazy-tests/src/androidTest/kotlin/androidx/compose/foundation/lazy/grid/LazySemanticsTest.kt
+++ b/compose/foundation/foundation/integration-tests/lazy-tests/src/androidTest/kotlin/androidx/compose/foundation/lazy/grid/LazySemanticsTest.kt
@@ -44,11 +44,9 @@
  * - GetIndexForKey
  * - ScrollToIndex
  *
- * GetIndexForKey:
- * Create a lazy grid, iterate over all indices, verify key of each of them
+ * GetIndexForKey: Create a lazy grid, iterate over all indices, verify key of each of them
  *
- * ScrollToIndex:
- * Create a lazy grid, scroll to a line off screen, verify shown items
+ * ScrollToIndex: Create a lazy grid, scroll to a line off screen, verify shown items
  *
  * All tests performed in [runTest], scenarios set up in the test methods.
  */
@@ -60,20 +58,16 @@
     private val LazyGridModifier = Modifier.testTag(LazyGridTag).requiredSize(100.dp)
 
     private fun tag(index: Int): String = "tag_$index"
+
     private fun key(index: Int): String = "key_$index"
 
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
     @Test
     fun itemSemantics_verticalGrid() {
         rule.setContent {
             LazyVerticalGrid(GridCells.Fixed(1), LazyGridModifier) {
-                repeat(N) {
-                    item(key = key(it)) {
-                        SpacerInColumn(it)
-                    }
-                }
+                repeat(N) { item(key = key(it)) { SpacerInColumn(it) } }
             }
         }
         runTest()
@@ -84,9 +78,7 @@
         rule.setContent {
             val state = rememberLazyGridState()
             LazyVerticalGrid(GridCells.Fixed(1), LazyGridModifier, state) {
-                items(items = List(N) { it }, key = { key(it) }) {
-                    SpacerInColumn(it)
-                }
+                items(items = List(N) { it }, key = { key(it) }) { SpacerInColumn(it) }
             }
         }
         runTest()
@@ -122,16 +114,19 @@
         checkViewport(firstExpectedItem = 0, lastExpectedItem = 3)
 
         // Verify IndexForKey
-        rule.onNodeWithTag(LazyGridTag).assert(
-            SemanticsMatcher.keyIsDefined(IndexForKey).and(
-                SemanticsMatcher("keys match") { node ->
-                    val actualIndex = node.config.getOrNull(IndexForKey)!!
-                    (0 until N).all { expectedIndex ->
-                        expectedIndex == actualIndex.invoke(key(expectedIndex))
-                    }
-                }
+        rule
+            .onNodeWithTag(LazyGridTag)
+            .assert(
+                SemanticsMatcher.keyIsDefined(IndexForKey)
+                    .and(
+                        SemanticsMatcher("keys match") { node ->
+                            val actualIndex = node.config.getOrNull(IndexForKey)!!
+                            (0 until N).all { expectedIndex ->
+                                expectedIndex == actualIndex.invoke(key(expectedIndex))
+                            }
+                        }
+                    )
             )
-        )
 
         // Verify ScrollToIndex
         rule.onNodeWithTag(LazyGridTag).assert(SemanticsMatcher.keyIsDefined(ScrollToIndex))
@@ -144,20 +139,16 @@
     }
 
     private fun invokeScrollToIndex(targetIndex: Int) {
-        val node = rule.onNodeWithTag(LazyGridTag)
-            .fetchSemanticsNode("Failed: invoke ScrollToIndex")
-        rule.runOnUiThread {
-            node.config[ScrollToIndex].action!!.invoke(targetIndex)
-        }
+        val node =
+            rule.onNodeWithTag(LazyGridTag).fetchSemanticsNode("Failed: invoke ScrollToIndex")
+        rule.runOnUiThread { node.config[ScrollToIndex].action!!.invoke(targetIndex) }
     }
 
     private fun checkViewport(firstExpectedItem: Int, lastExpectedItem: Int) {
         if (firstExpectedItem > 0) {
             rule.onNodeWithTag(tag(firstExpectedItem - 1)).assertDoesNotExist()
         }
-        (firstExpectedItem..lastExpectedItem).forEach {
-            rule.onNodeWithTag(tag(it)).assertExists()
-        }
+        (firstExpectedItem..lastExpectedItem).forEach { rule.onNodeWithTag(tag(it)).assertExists() }
         if (firstExpectedItem < N - 1) {
             rule.onNodeWithTag(tag(lastExpectedItem + 1)).assertDoesNotExist()
         }
diff --git a/compose/foundation/foundation/integration-tests/lazy-tests/src/androidTest/kotlin/androidx/compose/foundation/lazy/layout/LazyLayoutStateRestorationTest.kt b/compose/foundation/foundation/integration-tests/lazy-tests/src/androidTest/kotlin/androidx/compose/foundation/lazy/layout/LazyLayoutStateRestorationTest.kt
index eab253b..562b4dc 100644
--- a/compose/foundation/foundation/integration-tests/lazy-tests/src/androidTest/kotlin/androidx/compose/foundation/lazy/layout/LazyLayoutStateRestorationTest.kt
+++ b/compose/foundation/foundation/integration-tests/lazy-tests/src/androidTest/kotlin/androidx/compose/foundation/lazy/layout/LazyLayoutStateRestorationTest.kt
@@ -42,8 +42,7 @@
 @RunWith(AndroidJUnit4::class)
 class LazyLayoutStateRestorationTest {
 
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
     @Test
     fun visibleItemsStateRestored() {
@@ -88,17 +87,10 @@
         var visibleItem by mutableStateOf(0)
         var realState = 0
         rule.setContent {
-            LazyLayout(
-                itemCount = { 2 },
-                itemIsVisible = { it == visibleItem }
-            ) {
+            LazyLayout(itemCount = { 2 }, itemIsVisible = { it == visibleItem }) {
                 if (it == 0) {
                     realState = rememberSaveable { counter0++ }
-                    DisposableEffect(Unit) {
-                        onDispose {
-                            itemDisposed = true
-                        }
-                    }
+                    DisposableEffect(Unit) { onDispose { itemDisposed = true } }
                 }
                 Box(Modifier.requiredSize(30.dp))
             }
@@ -115,9 +107,7 @@
             visibleItem = 0
         }
 
-        rule.runOnIdle {
-            Truth.assertThat(realState).isEqualTo(1)
-        }
+        rule.runOnIdle { Truth.assertThat(realState).isEqualTo(1) }
     }
 
     @Test
@@ -127,18 +117,11 @@
         var itemDisposed = false
         var realState = 0
         rule.setContent {
-            LazyLayout(
-                itemCount = { 2 },
-                itemIsVisible = { it == visibleItem }
-            ) {
+            LazyLayout(itemCount = { 2 }, itemIsVisible = { it == visibleItem }) {
                 if (it == 0) {
                     LazyLayout(itemCount = { 1 }) {
                         realState = rememberSaveable { counter0++ }
-                        DisposableEffect(Unit) {
-                            onDispose {
-                                itemDisposed = true
-                            }
-                        }
+                        DisposableEffect(Unit) { onDispose { itemDisposed = true } }
                         Box(Modifier.requiredSize(30.dp))
                     }
                 } else {
@@ -158,9 +141,7 @@
             visibleItem = 0
         }
 
-        rule.runOnIdle {
-            Truth.assertThat(realState).isEqualTo(1)
-        }
+        rule.runOnIdle { Truth.assertThat(realState).isEqualTo(1) }
     }
 
     @Test
@@ -171,10 +152,7 @@
         var counter2 = 100
         var realState = arrayOf(0, 0, 0)
         restorationTester.setContent {
-            LazyLayout(
-                itemCount = { 3 },
-                indexToKey = { "$it" }
-            ) {
+            LazyLayout(itemCount = { 3 }, indexToKey = { "$it" }) {
                 if (it == 0) {
                     realState[0] = rememberSaveable { counter0++ }
                 } else if (it == 1) {
@@ -211,10 +189,7 @@
         var realState = arrayOf(0, 0, 0)
         var list by mutableStateOf(listOf(0, 1, 2))
         restorationTester.setContent {
-            LazyLayout(
-                itemCount = { list.size },
-                indexToKey = { "${list[it]}" }
-            ) { index ->
+            LazyLayout(itemCount = { list.size }, indexToKey = { "${list[it]}" }) { index ->
                 val it = list[index]
                 if (it == 0) {
                     realState[0] = rememberSaveable { counter0++ }
@@ -227,9 +202,7 @@
             }
         }
 
-        rule.runOnIdle {
-            list = listOf(1, 2, 0)
-        }
+        rule.runOnIdle { list = listOf(1, 2, 0) }
 
         rule.runOnIdle {
             Truth.assertThat(realState[0]).isEqualTo(1)
@@ -252,22 +225,15 @@
         val restorationTester = StateRestorationTester(rule)
         var stateToUse = 1
         var visibleRange by mutableStateOf(0 until 90)
-        var realState = Array(100) {
-            0
-        }
+        var realState = Array(100) { 0 }
         restorationTester.setContent {
-            LazyLayout(
-                itemCount = { 100 },
-                itemIsVisible = { visibleRange.contains(it) }
-            ) {
+            LazyLayout(itemCount = { 100 }, itemIsVisible = { visibleRange.contains(it) }) {
                 realState[it] = rememberSaveable { stateToUse }
                 Box(Modifier.requiredSize(30.dp))
             }
         }
 
-        rule.runOnIdle {
-            visibleRange = 90 until 100
-        }
+        rule.runOnIdle { visibleRange = 90 until 100 }
 
         rule.runOnIdle {
             // all states were initialized with 1
@@ -280,14 +246,10 @@
 
         restorationTester.emulateSavedInstanceStateRestore()
 
-        rule.runOnIdle {
-            visibleRange = 0 until 90
-        }
+        rule.runOnIdle { visibleRange = 0 until 90 }
 
         rule.runOnIdle {
-            Truth.assertThat(realState).isEqualTo(Array(100) {
-                if (it >= 90) 1 else 2
-            })
+            Truth.assertThat(realState).isEqualTo(Array(100) { if (it >= 90) 1 else 2 })
         }
     }
 
@@ -299,18 +261,19 @@
         indexToKey: (Int) -> Any = { getDefaultLazyLayoutKey(it) },
         content: @Composable (Int) -> Unit
     ) {
-        val provider = remember(itemCount, indexToKey, content as Any) {
-            object : LazyLayoutItemProvider {
-                override val itemCount: Int = itemCount()
+        val provider =
+            remember(itemCount, indexToKey, content as Any) {
+                object : LazyLayoutItemProvider {
+                    override val itemCount: Int = itemCount()
 
-                @Composable
-                override fun Item(index: Int, key: Any) {
-                    content(index)
+                    @Composable
+                    override fun Item(index: Int, key: Any) {
+                        content(index)
+                    }
+
+                    override fun getKey(index: Int) = indexToKey(index)
                 }
-
-                override fun getKey(index: Int) = indexToKey(index)
             }
-        }
         LazyLayout(itemProvider = { provider }) { constraints ->
             val placeables = mutableListOf<Placeable>()
             repeat(itemCount()) { index ->
@@ -319,9 +282,7 @@
                 }
             }
             layout(constraints.maxWidth, constraints.maxHeight) {
-                placeables.forEach {
-                    it.place(0, 0)
-                }
+                placeables.forEach { it.place(0, 0) }
             }
         }
     }
diff --git a/compose/foundation/foundation/integration-tests/lazy-tests/src/androidTest/kotlin/androidx/compose/foundation/lazy/layout/LazyLayoutTest.kt b/compose/foundation/foundation/integration-tests/lazy-tests/src/androidTest/kotlin/androidx/compose/foundation/lazy/layout/LazyLayoutTest.kt
index 0aee6b1..84d022c 100644
--- a/compose/foundation/foundation/integration-tests/lazy-tests/src/androidTest/kotlin/androidx/compose/foundation/lazy/layout/LazyLayoutTest.kt
+++ b/compose/foundation/foundation/integration-tests/lazy-tests/src/androidTest/kotlin/androidx/compose/foundation/lazy/layout/LazyLayoutTest.kt
@@ -56,8 +56,7 @@
 @RunWith(AndroidJUnit4::class)
 class LazyLayoutTest {
 
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
     @Test
     fun recompositionWithTheSameInputDoesntCauseRemeasure() {
@@ -69,10 +68,11 @@
                 override val alignmentLines: Map<AlignmentLine, Int> = emptyMap()
                 override val height: Int = 10
                 override val width: Int = 10
+
                 override fun placeChildren() {}
             }
         }
-        val itemProvider = itemProvider({ 0 }) { }
+        val itemProvider = itemProvider({ 0 }) {}
 
         rule.setContent {
             counter.value // just to trigger recomposition
@@ -90,19 +90,13 @@
             counter.value++
         }
 
-        rule.runOnIdle {
-            assertThat(remeasureCount).isEqualTo(1)
-        }
+        rule.runOnIdle { assertThat(remeasureCount).isEqualTo(1) }
     }
 
     @Test
     fun measureAndPlaceTwoItems() {
-        val itemProvider = itemProvider({ 2 }) { index ->
-            Box(
-                Modifier
-                    .fillMaxSize()
-                    .testTag("$index"))
-        }
+        val itemProvider =
+            itemProvider({ 2 }) { index -> Box(Modifier.fillMaxSize().testTag("$index")) }
         rule.setContent {
             LazyLayout(itemProvider) {
                 val item1 = measure(0, Constraints.fixed(50, 50))[0]
@@ -124,16 +118,11 @@
 
     @Test
     fun measureAndPlaceMultipleLayoutsInOneItem() {
-        val itemProvider = itemProvider({ 1 }) { index ->
-            Box(
-                Modifier
-                    .fillMaxSize()
-                    .testTag("${index}x0"))
-            Box(
-                Modifier
-                    .fillMaxSize()
-                    .testTag("${index}x1"))
-        }
+        val itemProvider =
+            itemProvider({ 1 }) { index ->
+                Box(Modifier.fillMaxSize().testTag("${index}x0"))
+                Box(Modifier.fillMaxSize().testTag("${index}x1"))
+            }
 
         rule.setContent {
             LazyLayout(itemProvider) {
@@ -155,12 +144,10 @@
 
     @Test
     fun updatingitemProvider() {
-        var itemProvider by mutableStateOf(itemProvider({ 1 }) { index ->
-            Box(
-                Modifier
-                    .fillMaxSize()
-                    .testTag("$index"))
-        })
+        var itemProvider by
+            mutableStateOf(
+                itemProvider({ 1 }) { index -> Box(Modifier.fillMaxSize().testTag("$index")) }
+            )
 
         rule.setContent {
             LazyLayout(itemProvider) {
@@ -169,11 +156,7 @@
                 repeat(itemProvider().itemCount) { index ->
                     items.addAll(measure(index, constraints))
                 }
-                layout(100, 100) {
-                    items.forEach {
-                        it.place(0, 0)
-                    }
-                }
+                layout(100, 100) { items.forEach { it.place(0, 0) } }
             }
         }
 
@@ -181,12 +164,8 @@
         rule.onNodeWithTag("1").assertDoesNotExist()
 
         rule.runOnIdle {
-            itemProvider = itemProvider({ 2 }) { index ->
-                Box(
-                    Modifier
-                        .fillMaxSize()
-                        .testTag("$index"))
-            }
+            itemProvider =
+                itemProvider({ 2 }) { index -> Box(Modifier.fillMaxSize().testTag("$index")) }
         }
 
         rule.onNodeWithTag("0").assertIsDisplayed()
@@ -196,12 +175,8 @@
     @Test
     fun stateBaseditemProvider() {
         var itemCount by mutableStateOf(1)
-        val itemProvider = itemProvider({ itemCount }) { index ->
-            Box(
-                Modifier
-                    .fillMaxSize()
-                    .testTag("$index"))
-        }
+        val itemProvider =
+            itemProvider({ itemCount }) { index -> Box(Modifier.fillMaxSize().testTag("$index")) }
 
         rule.setContent {
             LazyLayout(itemProvider) {
@@ -210,20 +185,14 @@
                 repeat(itemProvider().itemCount) { index ->
                     items.addAll(measure(index, constraints))
                 }
-                layout(100, 100) {
-                    items.forEach {
-                        it.place(0, 0)
-                    }
-                }
+                layout(100, 100) { items.forEach { it.place(0, 0) } }
             }
         }
 
         rule.onNodeWithTag("0").assertIsDisplayed()
         rule.onNodeWithTag("1").assertDoesNotExist()
 
-        rule.runOnIdle {
-            itemCount = 2
-        }
+        rule.runOnIdle { itemCount = 2 }
 
         rule.onNodeWithTag("0").assertIsDisplayed()
         rule.onNodeWithTag("1").assertIsDisplayed()
@@ -242,31 +211,26 @@
         val constraints = Constraints.fixed(50, 50)
         var measureCount = 0
         @Suppress("NAME_SHADOWING")
-        val modifier = Modifier.layout { measurable, constraints ->
-            measureCount++
-            val placeable = measurable.measure(constraints)
-            layout(placeable.width, placeable.height) {
-                placeable.place(0, 0)
+        val modifier =
+            Modifier.layout { measurable, constraints ->
+                measureCount++
+                val placeable = measurable.measure(constraints)
+                layout(placeable.width, placeable.height) { placeable.place(0, 0) }
             }
-        }
-        val itemProvider = itemProvider({ 1 }) { index ->
-            Box(
-                Modifier
-                    .fillMaxSize()
-                    .testTag("$index")
-                    .then(modifier))
-        }
+        val itemProvider =
+            itemProvider({ 1 }) { index ->
+                Box(Modifier.fillMaxSize().testTag("$index").then(modifier))
+            }
         var needToCompose by mutableStateOf(false)
         val scheduler = TestPrefetchScheduler()
         val prefetchState = LazyLayoutPrefetchState(scheduler)
         rule.setContent {
             LazyLayout(itemProvider, prefetchState = prefetchState) {
-                val item = if (needToCompose) {
-                    measure(0, constraints)[0]
-                } else null
-                layout(100, 100) {
-                    item?.place(0, 0)
-                }
+                val item =
+                    if (needToCompose) {
+                        measure(0, constraints)[0]
+                    } else null
+                layout(100, 100) { item?.place(0, 0) }
             }
         }
 
@@ -288,9 +252,7 @@
 
         rule.onNodeWithTag("0").assertIsDisplayed()
 
-        rule.runOnIdle {
-            assertThat(measureCount).isEqualTo(1)
-        }
+        rule.runOnIdle { assertThat(measureCount).isEqualTo(1) }
     }
 
     @Test
@@ -298,31 +260,26 @@
         val constraints = Constraints.fixed(50, 50)
         var measureCount = 0
         @Suppress("NAME_SHADOWING")
-        val modifier = Modifier.layout { measurable, constraints ->
-            measureCount++
-            val placeable = measurable.measure(constraints)
-            layout(placeable.width, placeable.height) {
-                placeable.place(0, 0)
+        val modifier =
+            Modifier.layout { measurable, constraints ->
+                measureCount++
+                val placeable = measurable.measure(constraints)
+                layout(placeable.width, placeable.height) { placeable.place(0, 0) }
             }
-        }
-        val itemProvider = itemProvider({ 1 }, true) { index ->
-            Box(
-                Modifier
-                    .fillMaxSize()
-                    .testTag("$index")
-                    .then(modifier))
-        }
+        val itemProvider =
+            itemProvider({ 1 }, true) { index ->
+                Box(Modifier.fillMaxSize().testTag("$index").then(modifier))
+            }
         var needToCompose by mutableStateOf(false)
         val scheduler = TestPrefetchScheduler()
         val prefetchState = LazyLayoutPrefetchState(scheduler)
         rule.setContent {
             LazyLayout(itemProvider, prefetchState = prefetchState) {
-                val item = if (needToCompose) {
-                    measure(0, constraints)[0]
-                } else null
-                layout(100, 100) {
-                    item?.place(0, 0)
-                }
+                val item =
+                    if (needToCompose) {
+                        measure(0, constraints)[0]
+                    } else null
+                layout(100, 100) { item?.place(0, 0) }
             }
         }
 
@@ -344,29 +301,24 @@
 
         rule.onNodeWithTag("0").assertIsDisplayed()
 
-        rule.runOnIdle {
-            assertThat(measureCount).isEqualTo(1)
-        }
+        rule.runOnIdle { assertThat(measureCount).isEqualTo(1) }
     }
 
     @Test
     fun cancelPrefetchedItem() {
         var composed = false
-        val itemProvider = itemProvider({ 1 }) {
-            Box(Modifier.fillMaxSize())
-            DisposableEffect(Unit) {
-                composed = true
-                onDispose {
-                    composed = false
+        val itemProvider =
+            itemProvider({ 1 }) {
+                Box(Modifier.fillMaxSize())
+                DisposableEffect(Unit) {
+                    composed = true
+                    onDispose { composed = false }
                 }
             }
-        }
         val scheduler = TestPrefetchScheduler()
         val prefetchState = LazyLayoutPrefetchState(scheduler)
         rule.setContent {
-            LazyLayout(itemProvider, prefetchState = prefetchState) {
-                layout(100, 100) {}
-            }
+            LazyLayout(itemProvider, prefetchState = prefetchState) { layout(100, 100) {} }
         }
 
         rule.runOnIdle {
@@ -376,31 +328,21 @@
             handle.cancel()
         }
 
-        rule.runOnIdle {
-            assertThat(composed).isFalse()
-        }
+        rule.runOnIdle { assertThat(composed).isFalse() }
     }
 
     @Test
     fun prefetchItemWithCustomExecutor() {
-        val itemProvider = itemProvider({ 1 }) { index ->
-            Box(
-                Modifier
-                    .fillMaxSize()
-                    .testTag("$index"))
-        }
+        val itemProvider =
+            itemProvider({ 1 }) { index -> Box(Modifier.fillMaxSize().testTag("$index")) }
 
         val executor = RecordingPrefetchScheduler()
         val prefetchState = LazyLayoutPrefetchState(executor)
         rule.setContent {
-            LazyLayout(itemProvider, prefetchState = prefetchState) {
-                layout(100, 100) {}
-            }
+            LazyLayout(itemProvider, prefetchState = prefetchState) { layout(100, 100) {} }
         }
 
-        rule.runOnIdle {
-            prefetchState.schedulePrefetch(0, Constraints.fixed(50, 50))
-        }
+        rule.runOnIdle { prefetchState.schedulePrefetch(0, Constraints.fixed(50, 50)) }
 
         assertThat(executor.requests).hasSize(1)
 
@@ -412,14 +354,13 @@
     fun keptForReuseItemIsDisposedWhenCanceled() {
         val needChild = mutableStateOf(true)
         var composed = true
-        val itemProvider = itemProvider({ 1 }) {
-            DisposableEffect(Unit) {
-                composed = true
-                onDispose {
-                    composed = false
+        val itemProvider =
+            itemProvider({ 1 }) {
+                DisposableEffect(Unit) {
+                    composed = true
+                    onDispose { composed = false }
                 }
             }
-        }
 
         rule.setContent {
             LazyLayout(itemProvider) { constraints ->
@@ -435,38 +376,31 @@
             needChild.value = false
         }
 
-        rule.runOnIdle {
-            assertThat(composed).isFalse()
-        }
+        rule.runOnIdle { assertThat(composed).isFalse() }
     }
 
     @Test
     fun nodeIsReusedWithoutExtraRemeasure() {
         var indexToCompose by mutableStateOf<Int?>(0)
         var remeasuresCount = 0
-        val modifier = Modifier
-            .layout { measurable, constraints ->
-                val placeable = measurable.measure(constraints)
-                remeasuresCount++
-                layout(placeable.width, placeable.height) {
-                    placeable.place(0, 0)
+        val modifier =
+            Modifier.layout { measurable, constraints ->
+                    val placeable = measurable.measure(constraints)
+                    remeasuresCount++
+                    layout(placeable.width, placeable.height) { placeable.place(0, 0) }
                 }
-            }
-            .fillMaxSize()
-        val itemProvider = itemProvider({ 2 }) {
-            Box(modifier)
-        }
+                .fillMaxSize()
+        val itemProvider = itemProvider({ 2 }) { Box(modifier) }
 
         rule.setContent {
             LazyLayout(itemProvider) { constraints ->
-                val node = if (indexToCompose != null) {
-                    measure(indexToCompose!!, constraints).first()
-                } else {
-                    null
-                }
-                layout(10, 10) {
-                    node?.place(0, 0)
-                }
+                val node =
+                    if (indexToCompose != null) {
+                        measure(indexToCompose!!, constraints).first()
+                    } else {
+                        null
+                    }
+                layout(10, 10) { node?.place(0, 0) }
             }
         }
 
@@ -481,38 +415,31 @@
             indexToCompose = 1
         }
 
-        rule.runOnIdle {
-            assertThat(remeasuresCount).isEqualTo(1)
-        }
+        rule.runOnIdle { assertThat(remeasuresCount).isEqualTo(1) }
     }
 
     @Test
     fun nodeIsReusedWhenRemovedFirst() {
         var itemCount by mutableStateOf(1)
         var remeasuresCount = 0
-        val modifier = Modifier
-            .layout { measurable, constraints ->
-                val placeable = measurable.measure(constraints)
-                remeasuresCount++
-                layout(placeable.width, placeable.height) {
-                    placeable.place(0, 0)
+        val modifier =
+            Modifier.layout { measurable, constraints ->
+                    val placeable = measurable.measure(constraints)
+                    remeasuresCount++
+                    layout(placeable.width, placeable.height) { placeable.place(0, 0) }
                 }
-            }
-            .fillMaxSize()
-        val itemProvider = itemProvider({ itemCount }) {
-            Box(modifier)
-        }
+                .fillMaxSize()
+        val itemProvider = itemProvider({ itemCount }) { Box(modifier) }
 
         rule.setContent {
             LazyLayout(itemProvider) { constraints ->
-                val node = if (itemCount == 1) {
-                    measure(0, constraints).first()
-                } else {
-                    null
-                }
-                layout(10, 10) {
-                    node?.place(0, 0)
-                }
+                val node =
+                    if (itemCount == 1) {
+                        measure(0, constraints).first()
+                    } else {
+                        null
+                    }
+                layout(10, 10) { node?.place(0, 0) }
             }
         }
 
@@ -527,27 +454,27 @@
             itemCount = 1
         }
 
-        rule.runOnIdle {
-            assertThat(remeasuresCount).isEqualTo(1)
-        }
+        rule.runOnIdle { assertThat(remeasuresCount).isEqualTo(1) }
     }
 
     @Test
     fun skippingItemBlockWhenKeyIsObservableButDidntChange() {
         val stateList = mutableStateListOf(0)
         var itemCalls = 0
-        val itemProvider = object : LazyLayoutItemProvider {
-            @Composable
-            override fun Item(index: Int, key: Any) {
-                assertThat(index).isEqualTo(0)
-                assertThat(key).isEqualTo(index)
-                itemCalls++
+        val itemProvider =
+            object : LazyLayoutItemProvider {
+                @Composable
+                override fun Item(index: Int, key: Any) {
+                    assertThat(index).isEqualTo(0)
+                    assertThat(key).isEqualTo(index)
+                    itemCalls++
+                }
+
+                override val itemCount: Int
+                    get() = stateList.size
+
+                override fun getKey(index: Int) = stateList[index]
             }
-
-            override val itemCount: Int get() = stateList.size
-
-            override fun getKey(index: Int) = stateList[index]
-        }
         rule.setContent {
             LazyLayout({ itemProvider }) { constraint ->
                 measure(0, constraint)
@@ -561,37 +488,31 @@
             stateList += 1
         }
 
-        rule.runOnIdle {
-            assertThat(itemCalls).isEqualTo(1)
-        }
+        rule.runOnIdle { assertThat(itemCalls).isEqualTo(1) }
     }
 
     @Test
     fun subcomposeNodeContentIsResetWhenReused() {
         var indexToCompose by mutableStateOf(0)
         var remeasurement: Remeasurement? = null
-        val itemProvider = itemProvider({ 3 }) {
-            BoxWithConstraints(
-                Modifier.testTag("Box $it")
-            ) {
-                Box(Modifier.testTag("$it"))
+        val itemProvider =
+            itemProvider({ 3 }) {
+                BoxWithConstraints(Modifier.testTag("Box $it")) { Box(Modifier.testTag("$it")) }
             }
-        }
 
         rule.setContent {
             LazyLayout(
                 itemProvider = itemProvider,
-                modifier = object : RemeasurementModifier {
-                    @Suppress("PARAMETER_NAME_CHANGED_ON_OVERRIDE")
-                    override fun onRemeasurementAvailable(value: Remeasurement) {
-                        remeasurement = value
+                modifier =
+                    object : RemeasurementModifier {
+                        @Suppress("PARAMETER_NAME_CHANGED_ON_OVERRIDE")
+                        override fun onRemeasurementAvailable(value: Remeasurement) {
+                            remeasurement = value
+                        }
                     }
-                }
             ) { constraints ->
                 val node = measure(indexToCompose, constraints).first()
-                layout(node.width, node.height) {
-                    node.place(0, 0)
-                }
+                layout(node.width, node.height) { node.place(0, 0) }
             }
         }
 
@@ -602,17 +523,13 @@
             remeasurement?.forceRemeasure()
         }
 
-        rule.onNodeWithTag("Box 0")
-            .assertDoesNotExist()
+        rule.onNodeWithTag("Box 0").assertDoesNotExist()
 
-        rule.onNodeWithTag("0")
-            .assertDoesNotExist()
+        rule.onNodeWithTag("0").assertDoesNotExist()
 
-        rule.onNodeWithTag("Box 2")
-            .assertExists()
+        rule.onNodeWithTag("Box 2").assertExists()
 
-        rule.onNodeWithTag("2")
-            .assertExists()
+        rule.onNodeWithTag("2").assertExists()
     }
 
     private fun itemProvider(
@@ -620,19 +537,23 @@
         hasContentType: Boolean? = false,
         itemContent: @Composable (Int) -> Unit
     ): () -> LazyLayoutItemProvider {
-        val provider = object : LazyLayoutItemProvider {
-            @Composable
-            override fun Item(index: Int, key: Any) {
-                itemContent(index)
-            }
+        val provider =
+            object : LazyLayoutItemProvider {
+                @Composable
+                override fun Item(index: Int, key: Any) {
+                    itemContent(index)
+                }
 
-            override fun getContentType(index: Int): Any? {
-                hasContentType?.let { return if (hasContentType) index else null }
-                return null
-            }
+                override fun getContentType(index: Int): Any? {
+                    hasContentType?.let {
+                        return if (hasContentType) index else null
+                    }
+                    return null
+                }
 
-            override val itemCount: Int get() = itemCount()
-        }
+                override val itemCount: Int
+                    get() = itemCount()
+            }
         return { provider }
     }
 
diff --git a/compose/foundation/foundation/integration-tests/lazy-tests/src/androidTest/kotlin/androidx/compose/foundation/lazy/layout/TestPrefetchScheduler.kt b/compose/foundation/foundation/integration-tests/lazy-tests/src/androidTest/kotlin/androidx/compose/foundation/lazy/layout/TestPrefetchScheduler.kt
index ad3b8a6..588beb3 100644
--- a/compose/foundation/foundation/integration-tests/lazy-tests/src/androidTest/kotlin/androidx/compose/foundation/lazy/layout/TestPrefetchScheduler.kt
+++ b/compose/foundation/foundation/integration-tests/lazy-tests/src/androidTest/kotlin/androidx/compose/foundation/lazy/layout/TestPrefetchScheduler.kt
@@ -22,18 +22,18 @@
 internal class TestPrefetchScheduler : PrefetchScheduler {
 
     private var activeRequests = mutableListOf<PrefetchRequest>()
+
     override fun schedulePrefetch(prefetchRequest: PrefetchRequest) {
         activeRequests.add(prefetchRequest)
     }
 
     fun executeActiveRequests() {
-        activeRequests.forEach {
-            with(it) { scope.execute() }
-        }
+        activeRequests.forEach { with(it) { scope.execute() } }
         activeRequests.clear()
     }
 
-    private val scope = object : PrefetchRequestScope {
-        override fun availableTimeNanos(): Long = Long.MAX_VALUE
-    }
+    private val scope =
+        object : PrefetchRequestScope {
+            override fun availableTimeNanos(): Long = Long.MAX_VALUE
+        }
 }
diff --git a/compose/foundation/foundation/integration-tests/lazy-tests/src/androidTest/kotlin/androidx/compose/foundation/lazy/list/BaseLazyListTestWithOrientation.kt b/compose/foundation/foundation/integration-tests/lazy-tests/src/androidTest/kotlin/androidx/compose/foundation/lazy/list/BaseLazyListTestWithOrientation.kt
index 3748124..367485e 100644
--- a/compose/foundation/foundation/integration-tests/lazy-tests/src/androidTest/kotlin/androidx/compose/foundation/lazy/list/BaseLazyListTestWithOrientation.kt
+++ b/compose/foundation/foundation/integration-tests/lazy-tests/src/androidTest/kotlin/androidx/compose/foundation/lazy/list/BaseLazyListTestWithOrientation.kt
@@ -50,9 +50,8 @@
 import kotlinx.coroutines.Dispatchers
 import kotlinx.coroutines.runBlocking
 
-open class BaseLazyListTestWithOrientation(
-    private val orientation: Orientation
-) : BaseLazyLayoutTestWithOrientation(orientation) {
+open class BaseLazyListTestWithOrientation(private val orientation: Orientation) :
+    BaseLazyLayoutTestWithOrientation(orientation) {
 
     fun Modifier.fillMaxCrossAxis() =
         if (vertical) {
@@ -82,16 +81,15 @@
     }
 
     fun LazyListState.scrollTo(index: Int) {
-        runBlocking(Dispatchers.Main + AutoTestFrameClock()) {
-            scrollToItem(index)
-        }
+        runBlocking(Dispatchers.Main + AutoTestFrameClock()) { scrollToItem(index) }
     }
 
-    fun SemanticsNodeInteraction.scrollBy(offset: Dp) = scrollBy(
-        x = if (vertical) 0.dp else offset,
-        y = if (!vertical) 0.dp else offset,
-        density = rule.density
-    )
+    fun SemanticsNodeInteraction.scrollBy(offset: Dp) =
+        scrollBy(
+            x = if (vertical) 0.dp else offset,
+            y = if (!vertical) 0.dp else offset,
+            density = rule.density
+        )
 
     fun composeViewSwipeForward() {
         if (orientation == Orientation.Vertical) {
@@ -127,11 +125,12 @@
         content: LazyListScope.() -> Unit
     ) {
         if (vertical xor isCrossAxis) {
-            val verticalArrangement = when {
-                spacedBy != 0.dp -> Arrangement.spacedBy(spacedBy)
-                reverseLayout xor reverseArrangement -> Arrangement.Bottom
-                else -> Arrangement.Top
-            }
+            val verticalArrangement =
+                when {
+                    spacedBy != 0.dp -> Arrangement.spacedBy(spacedBy)
+                    reverseLayout xor reverseArrangement -> Arrangement.Bottom
+                    else -> Arrangement.Top
+                }
             LazyColumn(
                 modifier = modifier,
                 state = state,
@@ -143,11 +142,12 @@
                 content = content
             )
         } else {
-            val horizontalArrangement = when {
-                spacedBy != 0.dp -> Arrangement.spacedBy(spacedBy)
-                reverseLayout xor reverseArrangement -> Arrangement.End
-                else -> Arrangement.Start
-            }
+            val horizontalArrangement =
+                when {
+                    spacedBy != 0.dp -> Arrangement.spacedBy(spacedBy)
+                    reverseLayout xor reverseArrangement -> Arrangement.End
+                    else -> Arrangement.Start
+                }
             LazyRow(
                 modifier = modifier,
                 state = state,
@@ -175,11 +175,12 @@
         content: LazyListScope.() -> Unit
     ) {
         if (vertical) {
-            val verticalArrangement = when {
-                spacedBy != 0.dp -> Arrangement.spacedBy(spacedBy)
-                reverseLayout xor reverseArrangement -> Arrangement.Bottom
-                else -> Arrangement.Top
-            }
+            val verticalArrangement =
+                when {
+                    spacedBy != 0.dp -> Arrangement.spacedBy(spacedBy)
+                    reverseLayout xor reverseArrangement -> Arrangement.Bottom
+                    else -> Arrangement.Top
+                }
             LazyColumn(
                 modifier = modifier,
                 state = state,
@@ -192,11 +193,12 @@
                 content = content
             )
         } else {
-            val horizontalArrangement = when {
-                spacedBy != 0.dp -> Arrangement.spacedBy(spacedBy)
-                reverseLayout xor reverseArrangement -> Arrangement.End
-                else -> Arrangement.Start
-            }
+            val horizontalArrangement =
+                when {
+                    spacedBy != 0.dp -> Arrangement.spacedBy(spacedBy)
+                    reverseLayout xor reverseArrangement -> Arrangement.End
+                    else -> Arrangement.Start
+                }
             LazyRow(
                 modifier = modifier,
                 state = state,
diff --git a/compose/foundation/foundation/integration-tests/lazy-tests/src/androidTest/kotlin/androidx/compose/foundation/lazy/list/LazyArrangementsTest.kt b/compose/foundation/foundation/integration-tests/lazy-tests/src/androidTest/kotlin/androidx/compose/foundation/lazy/list/LazyArrangementsTest.kt
index 184b6e4..934778b 100644
--- a/compose/foundation/foundation/integration-tests/lazy-tests/src/androidTest/kotlin/androidx/compose/foundation/lazy/list/LazyArrangementsTest.kt
+++ b/compose/foundation/foundation/integration-tests/lazy-tests/src/androidTest/kotlin/androidx/compose/foundation/lazy/list/LazyArrangementsTest.kt
@@ -54,8 +54,7 @@
 
     private val ContainerTag = "ContainerTag"
 
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
     private var itemSize: Dp = Dp.Infinity
     private var smallerItemSize: Dp = Dp.Infinity
@@ -63,12 +62,8 @@
 
     @Before
     fun before() {
-        with(rule.density) {
-            itemSize = 50.toDp()
-        }
-        with(rule.density) {
-            smallerItemSize = 40.toDp()
-        }
+        with(rule.density) { itemSize = 50.toDp() }
+        with(rule.density) { smallerItemSize = 40.toDp() }
         containerSize = itemSize * 5
     }
 
@@ -77,12 +72,8 @@
     @Test
     fun column_defaultArrangementIsTop() {
         rule.setContent {
-            LazyColumn(
-                modifier = Modifier.requiredSize(containerSize)
-            ) {
-                items(2) {
-                    Box(Modifier.requiredSize(itemSize).testTag(it.toString()))
-                }
+            LazyColumn(modifier = Modifier.requiredSize(containerSize)) {
+                items(2) { Box(Modifier.requiredSize(itemSize).testTag(it.toString())) }
             }
         }
 
@@ -111,12 +102,8 @@
     @Test
     fun row_defaultArrangementIsStart() {
         rule.setContent {
-            LazyRow(
-                modifier = Modifier.requiredSize(containerSize)
-            ) {
-                items(2) {
-                    Box(Modifier.requiredSize(itemSize).testTag(it.toString()))
-                }
+            LazyRow(modifier = Modifier.requiredSize(containerSize)) {
+                items(2) { Box(Modifier.requiredSize(itemSize).testTag(it.toString())) }
             }
         }
 
@@ -170,13 +157,12 @@
                 verticalArrangement = Arrangement.spacedBy(itemSize),
                 modifier = Modifier.testTag(ContainerTag)
             ) {
-                items(2) {
-                    Box(Modifier.requiredSize(itemSize))
-                }
+                items(2) { Box(Modifier.requiredSize(itemSize)) }
             }
         }
 
-        rule.onNodeWithTag(ContainerTag)
+        rule
+            .onNodeWithTag(ContainerTag)
             .assertWidthIsEqualTo(itemSize)
             .assertHeightIsEqualTo(itemSize * 3)
     }
@@ -188,13 +174,12 @@
                 horizontalArrangement = Arrangement.spacedBy(itemSize),
                 modifier = Modifier.testTag(ContainerTag)
             ) {
-                items(2) {
-                    Box(Modifier.requiredSize(itemSize))
-                }
+                items(2) { Box(Modifier.requiredSize(itemSize)) }
             }
         }
 
-        rule.onNodeWithTag(ContainerTag)
+        rule
+            .onNodeWithTag(ContainerTag)
             .assertWidthIsEqualTo(itemSize * 3)
             .assertHeightIsEqualTo(itemSize)
     }
@@ -208,17 +193,13 @@
                 verticalArrangement = Arrangement.spacedBy(itemSize),
                 modifier = Modifier.requiredSize(itemSize * 3.5f)
             ) {
-                items(3) {
-                    Box(Modifier.requiredSize(itemSize).testTag(it.toString()))
-                }
+                items(3) { Box(Modifier.requiredSize(itemSize).testTag(it.toString())) }
             }
         }
 
-        rule.onNodeWithTag("0")
-            .assertTopPositionInRootIsEqualTo(0.dp)
+        rule.onNodeWithTag("0").assertTopPositionInRootIsEqualTo(0.dp)
 
-        rule.onNodeWithTag("1")
-            .assertTopPositionInRootIsEqualTo(itemSize * 2)
+        rule.onNodeWithTag("1").assertTopPositionInRootIsEqualTo(itemSize * 2)
     }
 
     @Test
@@ -228,20 +209,15 @@
                 verticalArrangement = Arrangement.spacedBy(itemSize),
                 modifier = Modifier.requiredSize(itemSize * 3.5f).testTag(ContainerTag)
             ) {
-                items(3) {
-                    Box(Modifier.requiredSize(itemSize).testTag(it.toString()))
-                }
+                items(3) { Box(Modifier.requiredSize(itemSize).testTag(it.toString())) }
             }
         }
 
-        rule.onNodeWithTag(ContainerTag)
-            .scrollBy(y = itemSize * 2, density = rule.density)
+        rule.onNodeWithTag(ContainerTag).scrollBy(y = itemSize * 2, density = rule.density)
 
-        rule.onNodeWithTag("1")
-            .assertTopPositionInRootIsEqualTo(itemSize * 0.5f)
+        rule.onNodeWithTag("1").assertTopPositionInRootIsEqualTo(itemSize * 0.5f)
 
-        rule.onNodeWithTag("2")
-            .assertTopPositionInRootIsEqualTo(itemSize * 2.5f)
+        rule.onNodeWithTag("2").assertTopPositionInRootIsEqualTo(itemSize * 2.5f)
     }
 
     @Test
@@ -251,17 +227,13 @@
                 horizontalArrangement = Arrangement.spacedBy(itemSize),
                 modifier = Modifier.requiredSize(itemSize * 3.5f)
             ) {
-                items(3) {
-                    Box(Modifier.requiredSize(itemSize).testTag(it.toString()))
-                }
+                items(3) { Box(Modifier.requiredSize(itemSize).testTag(it.toString())) }
             }
         }
 
-        rule.onNodeWithTag("0")
-            .assertLeftPositionInRootIsEqualTo(0.dp)
+        rule.onNodeWithTag("0").assertLeftPositionInRootIsEqualTo(0.dp)
 
-        rule.onNodeWithTag("1")
-            .assertLeftPositionInRootIsEqualTo(itemSize * 2)
+        rule.onNodeWithTag("1").assertLeftPositionInRootIsEqualTo(itemSize * 2)
     }
 
     @Test
@@ -271,20 +243,15 @@
                 horizontalArrangement = Arrangement.spacedBy(itemSize),
                 modifier = Modifier.requiredSize(itemSize * 3.5f).testTag(ContainerTag)
             ) {
-                items(3) {
-                    Box(Modifier.requiredSize(itemSize).testTag(it.toString()))
-                }
+                items(3) { Box(Modifier.requiredSize(itemSize).testTag(it.toString())) }
             }
         }
 
-        rule.onNodeWithTag(ContainerTag)
-            .scrollBy(x = itemSize * 2, density = rule.density)
+        rule.onNodeWithTag(ContainerTag).scrollBy(x = itemSize * 2, density = rule.density)
 
-        rule.onNodeWithTag("1")
-            .assertLeftPositionInRootIsEqualTo(itemSize * 0.5f)
+        rule.onNodeWithTag("1").assertLeftPositionInRootIsEqualTo(itemSize * 0.5f)
 
-        rule.onNodeWithTag("2")
-            .assertLeftPositionInRootIsEqualTo(itemSize * 2.5f)
+        rule.onNodeWithTag("2").assertLeftPositionInRootIsEqualTo(itemSize * 2.5f)
     }
 
     @Test
@@ -300,22 +267,13 @@
                 state = rememberLazyListState().also { state = it },
                 verticalArrangement = Arrangement.spacedBy(spacingSize)
             ) {
-                items(5) {
-                    Spacer(
-                        Modifier.size(itemSize).testTag("$it")
-                    )
-                }
+                items(5) { Spacer(Modifier.size(itemSize).testTag("$it")) }
             }
         }
 
-        rule.runOnIdle {
-            runBlocking {
-                state.scrollBy((itemSizePx + spacingSizePx).toFloat())
-            }
-        }
+        rule.runOnIdle { runBlocking { state.scrollBy((itemSizePx + spacingSizePx).toFloat()) } }
 
-        rule.onNodeWithTag("0")
-            .assertIsNotDisplayed()
+        rule.onNodeWithTag("0").assertIsNotDisplayed()
 
         rule.runOnIdle {
             assertThat(state.firstVisibleItemIndex).isEqualTo(1)
@@ -336,27 +294,19 @@
                 state = rememberLazyListState().also { state = it },
                 verticalArrangement = Arrangement.spacedBy(spacingSize)
             ) {
-                items(5) {
-                    Spacer(
-                        Modifier.size(itemSize).testTag("$it")
-                    )
-                }
+                items(5) { Spacer(Modifier.size(itemSize).testTag("$it")) }
             }
         }
 
         rule.runOnIdle {
-            runBlocking {
-                state.scrollBy((itemSizePx + spacingSizePx / 2).toFloat())
-            }
+            runBlocking { state.scrollBy((itemSizePx + spacingSizePx / 2).toFloat()) }
         }
 
-        rule.onNodeWithTag("0")
-            .assertIsNotDisplayed()
+        rule.onNodeWithTag("0").assertIsNotDisplayed()
 
         rule.runOnIdle {
             assertThat(state.firstVisibleItemIndex).isEqualTo(0)
-            assertThat(state.firstVisibleItemScrollOffset)
-                .isEqualTo(itemSizePx + spacingSizePx / 2)
+            assertThat(state.firstVisibleItemScrollOffset).isEqualTo(itemSizePx + spacingSizePx / 2)
         }
     }
 
@@ -373,22 +323,13 @@
                 state = rememberLazyListState().also { state = it },
                 horizontalArrangement = Arrangement.spacedBy(spacingSize)
             ) {
-                items(5) {
-                    Spacer(
-                        Modifier.size(itemSize).testTag("$it")
-                    )
-                }
+                items(5) { Spacer(Modifier.size(itemSize).testTag("$it")) }
             }
         }
 
-        rule.runOnIdle {
-            runBlocking {
-                state.scrollBy((itemSizePx + spacingSizePx).toFloat())
-            }
-        }
+        rule.runOnIdle { runBlocking { state.scrollBy((itemSizePx + spacingSizePx).toFloat()) } }
 
-        rule.onNodeWithTag("0")
-            .assertIsNotDisplayed()
+        rule.onNodeWithTag("0").assertIsNotDisplayed()
 
         rule.runOnIdle {
             assertThat(state.firstVisibleItemIndex).isEqualTo(1)
@@ -409,27 +350,19 @@
                 state = rememberLazyListState().also { state = it },
                 horizontalArrangement = Arrangement.spacedBy(spacingSize)
             ) {
-                items(5) {
-                    Spacer(
-                        Modifier.size(itemSize).testTag("$it")
-                    )
-                }
+                items(5) { Spacer(Modifier.size(itemSize).testTag("$it")) }
             }
         }
 
         rule.runOnIdle {
-            runBlocking {
-                state.scrollBy((itemSizePx + spacingSizePx / 2).toFloat())
-            }
+            runBlocking { state.scrollBy((itemSizePx + spacingSizePx / 2).toFloat()) }
         }
 
-        rule.onNodeWithTag("0")
-            .assertIsNotDisplayed()
+        rule.onNodeWithTag("0").assertIsNotDisplayed()
 
         rule.runOnIdle {
             assertThat(state.firstVisibleItemIndex).isEqualTo(0)
-            assertThat(state.firstVisibleItemScrollOffset)
-                .isEqualTo(itemSizePx + spacingSizePx / 2)
+            assertThat(state.firstVisibleItemScrollOffset).isEqualTo(itemSizePx + spacingSizePx / 2)
         }
     }
 
@@ -438,13 +371,8 @@
     @Test
     fun column_defaultArrangementIsBottomWithReverseLayout() {
         rule.setContent {
-            LazyColumn(
-                reverseLayout = true,
-                modifier = Modifier.requiredSize(containerSize)
-            ) {
-                items(2) {
-                    Item(it)
-                }
+            LazyColumn(reverseLayout = true, modifier = Modifier.requiredSize(containerSize)) {
+                items(2) { Item(it) }
             }
         }
 
@@ -454,19 +382,12 @@
     @Test
     fun row_defaultArrangementIsEndWithReverseLayout() {
         rule.setContent {
-            LazyRow(
-                reverseLayout = true,
-                modifier = Modifier.requiredSize(containerSize)
-            ) {
-                items(2) {
-                    Item(it)
-                }
+            LazyRow(reverseLayout = true, modifier = Modifier.requiredSize(containerSize)) {
+                items(2) { Item(it) }
             }
         }
 
-        assertArrangementForTwoItems(
-            Arrangement.End, LayoutDirection.Ltr, reverseLayout = true
-        )
+        assertArrangementForTwoItems(Arrangement.End, LayoutDirection.Ltr, reverseLayout = true)
     }
 
     @Test
@@ -477,17 +398,13 @@
                 modifier = Modifier.requiredSize(containerSize),
                 verticalArrangement = arrangement
             ) {
-                items(2) {
-                    Item(it)
-                }
+                items(2) { Item(it) }
             }
         }
 
         assertArrangementForTwoItems(Arrangement.Top)
 
-        rule.runOnIdle {
-            arrangement = Arrangement.Bottom
-        }
+        rule.runOnIdle { arrangement = Arrangement.Bottom }
 
         assertArrangementForTwoItems(Arrangement.Bottom)
     }
@@ -500,17 +417,13 @@
                 modifier = Modifier.requiredSize(containerSize),
                 horizontalArrangement = arrangement
             ) {
-                items(2) {
-                    Item(it)
-                }
+                items(2) { Item(it) }
             }
         }
 
         assertArrangementForTwoItems(Arrangement.Start, LayoutDirection.Ltr)
 
-        rule.runOnIdle {
-            arrangement = Arrangement.End
-        }
+        rule.runOnIdle { arrangement = Arrangement.End }
 
         assertArrangementForTwoItems(Arrangement.End, LayoutDirection.Ltr)
     }
@@ -525,33 +438,25 @@
                 verticalArrangement = Arrangement.spacedBy(-halfItemSize),
                 state = state
             ) {
-                items(100) { index ->
-                    Box(Modifier.size(itemSize).testTag(index.toString()))
-                }
+                items(100) { index -> Box(Modifier.size(itemSize).testTag(index.toString())) }
             }
         }
 
-        rule.onNodeWithTag("0")
-            .assertTopPositionInRootIsEqualTo(0.dp)
-        rule.onNodeWithTag("1")
-            .assertTopPositionInRootIsEqualTo(halfItemSize)
+        rule.onNodeWithTag("0").assertTopPositionInRootIsEqualTo(0.dp)
+        rule.onNodeWithTag("1").assertTopPositionInRootIsEqualTo(halfItemSize)
 
         rule.runOnIdle {
             assertThat(state.firstVisibleItemIndex).isEqualTo(0)
             assertThat(state.firstVisibleItemScrollOffset).isEqualTo(0)
 
-            runBlocking {
-                state.scrollBy(with(rule.density) { halfItemSize.toPx() })
-            }
+            runBlocking { state.scrollBy(with(rule.density) { halfItemSize.toPx() }) }
 
             assertThat(state.firstVisibleItemIndex).isEqualTo(1)
             assertThat(state.firstVisibleItemScrollOffset).isEqualTo(0)
         }
 
-        rule.onNodeWithTag("0")
-            .assertTopPositionInRootIsEqualTo(-halfItemSize)
-        rule.onNodeWithTag("1")
-            .assertTopPositionInRootIsEqualTo(0.dp)
+        rule.onNodeWithTag("0").assertTopPositionInRootIsEqualTo(-halfItemSize)
+        rule.onNodeWithTag("1").assertTopPositionInRootIsEqualTo(0.dp)
     }
 
     @Test
@@ -564,33 +469,25 @@
                 horizontalArrangement = Arrangement.spacedBy(-halfItemSize),
                 state = state
             ) {
-                items(100) { index ->
-                    Box(Modifier.size(itemSize).testTag(index.toString()))
-                }
+                items(100) { index -> Box(Modifier.size(itemSize).testTag(index.toString())) }
             }
         }
 
-        rule.onNodeWithTag("0")
-            .assertLeftPositionInRootIsEqualTo(0.dp)
-        rule.onNodeWithTag("1")
-            .assertLeftPositionInRootIsEqualTo(halfItemSize)
+        rule.onNodeWithTag("0").assertLeftPositionInRootIsEqualTo(0.dp)
+        rule.onNodeWithTag("1").assertLeftPositionInRootIsEqualTo(halfItemSize)
 
         rule.runOnIdle {
             assertThat(state.firstVisibleItemIndex).isEqualTo(0)
             assertThat(state.firstVisibleItemScrollOffset).isEqualTo(0)
 
-            runBlocking {
-                state.scrollBy(with(rule.density) { halfItemSize.toPx() })
-            }
+            runBlocking { state.scrollBy(with(rule.density) { halfItemSize.toPx() }) }
 
             assertThat(state.firstVisibleItemIndex).isEqualTo(1)
             assertThat(state.firstVisibleItemScrollOffset).isEqualTo(0)
         }
 
-        rule.onNodeWithTag("0")
-            .assertLeftPositionInRootIsEqualTo(-halfItemSize)
-        rule.onNodeWithTag("1")
-            .assertLeftPositionInRootIsEqualTo(0.dp)
+        rule.onNodeWithTag("0").assertLeftPositionInRootIsEqualTo(-halfItemSize)
+        rule.onNodeWithTag("1").assertLeftPositionInRootIsEqualTo(0.dp)
     }
 
     @Test
@@ -603,16 +500,11 @@
                 verticalArrangement = Arrangement.spacedBy(-largerThanItemSize),
                 state = state
             ) {
-                items(4) { index ->
-                    Box(Modifier.size(itemSize).testTag(index.toString()))
-                }
+                items(4) { index -> Box(Modifier.size(itemSize).testTag(index.toString())) }
             }
         }
 
-        repeat(4) {
-            rule.onNodeWithTag("$it")
-                .assertTopPositionInRootIsEqualTo(0.dp)
-        }
+        repeat(4) { rule.onNodeWithTag("$it").assertTopPositionInRootIsEqualTo(0.dp) }
 
         rule.runOnIdle {
             assertThat(state.firstVisibleItemIndex).isEqualTo(0)
@@ -630,16 +522,11 @@
                 horizontalArrangement = Arrangement.spacedBy(-largerThanItemSize),
                 state = state
             ) {
-                items(4) { index ->
-                    Box(Modifier.size(itemSize).testTag(index.toString()))
-                }
+                items(4) { index -> Box(Modifier.size(itemSize).testTag(index.toString())) }
             }
         }
 
-        repeat(4) {
-            rule.onNodeWithTag("$it")
-                .assertLeftPositionInRootIsEqualTo(0.dp)
-        }
+        repeat(4) { rule.onNodeWithTag("$it").assertLeftPositionInRootIsEqualTo(0.dp) }
 
         rule.runOnIdle {
             assertThat(state.firstVisibleItemIndex).isEqualTo(0)
@@ -653,9 +540,7 @@
                 verticalArrangement = arrangement,
                 modifier = Modifier.requiredSize(containerSize)
             ) {
-                items(2) {
-                    Item(it)
-                }
+                items(2) { Item(it) }
             }
         }
     }
@@ -667,9 +552,7 @@
                     horizontalArrangement = arrangement,
                     modifier = Modifier.requiredSize(containerSize)
                 ) {
-                    items(2) {
-                        Item(it)
-                    }
+                    items(2) { Item(it) }
                 }
             }
         }
@@ -687,17 +570,17 @@
         reverseLayout: Boolean = false
     ) {
         with(rule.density) {
-            val sizes = IntArray(2) {
-                val index = if (reverseLayout) if (it == 0) 1 else 0 else it
-                if (index == 0) itemSize.roundToPx() else smallerItemSize.roundToPx()
-            }
+            val sizes =
+                IntArray(2) {
+                    val index = if (reverseLayout) if (it == 0) 1 else 0 else it
+                    if (index == 0) itemSize.roundToPx() else smallerItemSize.roundToPx()
+                }
             val outPositions = IntArray(2) { 0 }
             with(arrangement) { arrange(containerSize.roundToPx(), sizes, outPositions) }
 
             outPositions.forEachIndexed { index, position ->
                 val realIndex = if (reverseLayout) if (index == 0) 1 else 0 else index
-                rule.onNodeWithTag("$realIndex")
-                    .assertTopPositionInRootIsEqualTo(position.toDp())
+                rule.onNodeWithTag("$realIndex").assertTopPositionInRootIsEqualTo(position.toDp())
             }
         }
     }
@@ -708,10 +591,11 @@
         reverseLayout: Boolean = false
     ) {
         with(rule.density) {
-            val sizes = IntArray(2) {
-                val index = if (reverseLayout) if (it == 0) 1 else 0 else it
-                if (index == 0) itemSize.roundToPx() else smallerItemSize.roundToPx()
-            }
+            val sizes =
+                IntArray(2) {
+                    val index = if (reverseLayout) if (it == 0) 1 else 0 else it
+                    if (index == 0) itemSize.roundToPx() else smallerItemSize.roundToPx()
+                }
             val outPositions = IntArray(2) { 0 }
             with(arrangement) {
                 arrange(containerSize.roundToPx(), sizes, layoutDirection, outPositions)
@@ -720,8 +604,7 @@
             outPositions.forEachIndexed { index, position ->
                 val realIndex = if (reverseLayout) if (index == 0) 1 else 0 else index
                 val expectedPosition = position.toDp()
-                rule.onNodeWithTag("$realIndex")
-                    .assertLeftPositionInRootIsEqualTo(expectedPosition)
+                rule.onNodeWithTag("$realIndex").assertLeftPositionInRootIsEqualTo(expectedPosition)
             }
         }
     }
diff --git a/compose/foundation/foundation/integration-tests/lazy-tests/src/androidTest/kotlin/androidx/compose/foundation/lazy/list/LazyColumnTest.kt b/compose/foundation/foundation/integration-tests/lazy-tests/src/androidTest/kotlin/androidx/compose/foundation/lazy/list/LazyColumnTest.kt
index 96d5b43..7831afe 100644
--- a/compose/foundation/foundation/integration-tests/lazy-tests/src/androidTest/kotlin/androidx/compose/foundation/lazy/list/LazyColumnTest.kt
+++ b/compose/foundation/foundation/integration-tests/lazy-tests/src/androidTest/kotlin/androidx/compose/foundation/lazy/list/LazyColumnTest.kt
@@ -95,8 +95,7 @@
 
     private val LazyListTag = "LazyListTag"
 
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
     @Test
     fun compositionsAreDisposed_whenDataIsChanged() {
@@ -108,16 +107,11 @@
         var part2 by mutableStateOf(false)
 
         rule.setContentWithTestViewConfiguration {
-            LazyColumn(
-                Modifier
-                    .testTag(LazyListTag)
-                    .fillMaxSize()) {
+            LazyColumn(Modifier.testTag(LazyListTag).fillMaxSize()) {
                 items(if (!part2) data1 else data2) {
                     DisposableEffect(NeverEqualObject) {
                         composed++
-                        onDispose {
-                            disposals++
-                        }
+                        onDispose { disposals++ }
                     }
 
                     Spacer(Modifier.height(50.dp))
@@ -126,8 +120,7 @@
         }
 
         rule.runOnIdle {
-            assertWithMessage("Not all items were composed")
-                .that(composed).isEqualTo(data1.size)
+            assertWithMessage("Not all items were composed").that(composed).isEqualTo(data1.size)
             composed = 0
 
             part2 = true
@@ -135,13 +128,17 @@
 
         rule.runOnIdle {
             assertWithMessage(
-                "No additional items were composed after data change, something didn't work"
-            ).that(composed).isEqualTo(data2.size)
+                    "No additional items were composed after data change, something didn't work"
+                )
+                .that(composed)
+                .isEqualTo(data2.size)
 
             // We may need to modify this test once we prefetch/cache items outside the viewport
             assertWithMessage(
-                "Not enough compositions were disposed after scrolling, compositions were leaked"
-            ).that(disposals).isEqualTo(data1.size)
+                    "Not enough compositions were disposed after scrolling, compositions were leaked"
+                )
+                .that(disposals)
+                .isEqualTo(data1.size)
         }
     }
 
@@ -172,17 +169,21 @@
 
         rule.runOnIdle {
             assertWithMessage("First item was incorrectly immediately disposed")
-                .that(disposeCalledOnFirstItem).isFalse()
+                .that(disposeCalledOnFirstItem)
+                .isFalse()
             assertWithMessage("Second item was incorrectly immediately disposed")
-                .that(disposeCalledOnFirstItem).isFalse()
+                .that(disposeCalledOnFirstItem)
+                .isFalse()
             emitLazyList = false
         }
 
         rule.runOnIdle {
             assertWithMessage("First item was not correctly disposed")
-                .that(disposeCalledOnFirstItem).isTrue()
+                .that(disposeCalledOnFirstItem)
+                .isTrue()
             assertWithMessage("Second item was not correctly disposed")
-                .that(disposeCalledOnSecondItem).isTrue()
+                .that(disposeCalledOnSecondItem)
+                .isTrue()
         }
     }
 
@@ -192,9 +193,7 @@
         val tag = "List"
         rule.setContentWithTestViewConfiguration {
             LazyColumn(Modifier.testTag(tag)) {
-                items((0 until itemCount).toList()) {
-                    BasicText("$it")
-                }
+                items((0 until itemCount).toList()) { BasicText("$it") }
             }
         }
 
@@ -220,10 +219,7 @@
         val composedIndexes = mutableListOf<Int>()
         rule.setContent {
             state = rememberLazyListState()
-            LazyColumn(
-                Modifier
-                    .fillMaxWidth()
-                    .height(10.dp), state) {
+            LazyColumn(Modifier.fillMaxWidth().height(10.dp), state) {
                 items(count) { index ->
                     composedIndexes.add(index)
                     Box(Modifier.size(20.dp))
@@ -234,31 +230,19 @@
         rule.runOnIdle {
             composedIndexes.clear()
             count = 10
-            runBlocking(AutoTestFrameClock()) {
-                state.scrollToItem(50)
-            }
-            composedIndexes.forEach {
-                assertThat(it).isLessThan(count)
-            }
+            runBlocking(AutoTestFrameClock()) { state.scrollToItem(50) }
+            composedIndexes.forEach { assertThat(it).isLessThan(count) }
             assertThat(state.firstVisibleItemIndex).isEqualTo(9)
         }
     }
 
     @Test
     fun changingDataTest() {
-        val dataLists = listOf(
-            (1..3).toList(),
-            (4..8).toList(),
-            (3..4).toList()
-        )
+        val dataLists = listOf((1..3).toList(), (4..8).toList(), (3..4).toList())
         var dataModel by mutableStateOf(dataLists[0])
         val tag = "List"
         rule.setContentWithTestViewConfiguration {
-            LazyColumn(Modifier.testTag(tag)) {
-                items(dataModel) {
-                    BasicText("$it")
-                }
-            }
+            LazyColumn(Modifier.testTag(tag)) { items(dataModel) { BasicText("$it") } }
         }
 
         for (data in dataLists) {
@@ -281,35 +265,24 @@
     private fun prepareLazyColumnsItemsAlignment(horizontalGravity: Alignment.Horizontal) {
         rule.setContentWithTestViewConfiguration {
             LazyColumn(
-                Modifier
-                    .testTag(LazyListTag)
-                    .requiredWidth(100.dp),
+                Modifier.testTag(LazyListTag).requiredWidth(100.dp),
                 horizontalAlignment = horizontalGravity
             ) {
                 items(listOf(1, 2)) {
                     if (it == 1) {
-                        Spacer(
-                            Modifier
-                                .size(50.dp)
-                                .testTag(firstItemTag))
+                        Spacer(Modifier.size(50.dp).testTag(firstItemTag))
                     } else {
-                        Spacer(
-                            Modifier
-                                .size(70.dp)
-                                .testTag(secondItemTag))
+                        Spacer(Modifier.size(70.dp).testTag(secondItemTag))
                     }
                 }
             }
         }
 
-        rule.onNodeWithTag(firstItemTag)
-            .assertIsDisplayed()
+        rule.onNodeWithTag(firstItemTag).assertIsDisplayed()
 
-        rule.onNodeWithTag(secondItemTag)
-            .assertIsDisplayed()
+        rule.onNodeWithTag(secondItemTag).assertIsDisplayed()
 
-        val lazyColumnBounds = rule.onNodeWithTag(LazyListTag)
-            .getUnclippedBoundsInRoot()
+        val lazyColumnBounds = rule.onNodeWithTag(LazyListTag).getUnclippedBoundsInRoot()
 
         with(rule.density) {
             // Verify the width of the column
@@ -322,33 +295,27 @@
     fun lazyColumnAlignmentCenterHorizontally() {
         prepareLazyColumnsItemsAlignment(Alignment.CenterHorizontally)
 
-        rule.onNodeWithTag(firstItemTag)
-            .assertPositionInRootIsEqualTo(25.dp, 0.dp)
+        rule.onNodeWithTag(firstItemTag).assertPositionInRootIsEqualTo(25.dp, 0.dp)
 
-        rule.onNodeWithTag(secondItemTag)
-            .assertPositionInRootIsEqualTo(15.dp, 50.dp)
+        rule.onNodeWithTag(secondItemTag).assertPositionInRootIsEqualTo(15.dp, 50.dp)
     }
 
     @Test
     fun lazyColumnAlignmentStart() {
         prepareLazyColumnsItemsAlignment(Alignment.Start)
 
-        rule.onNodeWithTag(firstItemTag)
-            .assertPositionInRootIsEqualTo(0.dp, 0.dp)
+        rule.onNodeWithTag(firstItemTag).assertPositionInRootIsEqualTo(0.dp, 0.dp)
 
-        rule.onNodeWithTag(secondItemTag)
-            .assertPositionInRootIsEqualTo(0.dp, 50.dp)
+        rule.onNodeWithTag(secondItemTag).assertPositionInRootIsEqualTo(0.dp, 50.dp)
     }
 
     @Test
     fun lazyColumnAlignmentEnd() {
         prepareLazyColumnsItemsAlignment(Alignment.End)
 
-        rule.onNodeWithTag(firstItemTag)
-            .assertPositionInRootIsEqualTo(50.dp, 0.dp)
+        rule.onNodeWithTag(firstItemTag).assertPositionInRootIsEqualTo(50.dp, 0.dp)
 
-        rule.onNodeWithTag(secondItemTag)
-            .assertPositionInRootIsEqualTo(30.dp, 50.dp)
+        rule.onNodeWithTag(secondItemTag).assertPositionInRootIsEqualTo(30.dp, 50.dp)
     }
 
     @Test
@@ -356,18 +323,8 @@
         val items by mutableStateOf((1..20).toList())
         val state = LazyListState()
         rule.setContentWithTestViewConfiguration {
-            LazyColumn(
-                Modifier
-                    .requiredSize(100.dp)
-                    .testTag(LazyListTag),
-                state = state
-            ) {
-                items(items) {
-                    Spacer(
-                        Modifier
-                            .requiredSize(20.dp)
-                            .testTag("$it"))
-                }
+            LazyColumn(Modifier.requiredSize(100.dp).testTag(LazyListTag), state = state) {
+                items(items) { Spacer(Modifier.requiredSize(20.dp).testTag("$it")) }
             }
         }
 
@@ -377,8 +334,7 @@
         }
 
         rule.mainClock.autoAdvance = false
-        rule.onNodeWithTag(LazyListTag)
-            .performTouchInput { swipeUp() }
+        rule.onNodeWithTag(LazyListTag).performTouchInput { swipeUp() }
         rule.mainClock.advanceTimeBy(100)
 
         val itemIndexWhenInterrupting = state.firstVisibleItemIndex
@@ -387,8 +343,7 @@
         assertThat(itemIndexWhenInterrupting).isNotEqualTo(0)
         assertThat(itemOffsetWhenInterrupting).isNotEqualTo(0)
 
-        rule.onNodeWithTag(LazyListTag)
-            .performTouchInput { down(center) }
+        rule.onNodeWithTag(LazyListTag).performTouchInput { down(center) }
         rule.mainClock.advanceTimeBy(100)
 
         assertThat(state.firstVisibleItemIndex).isEqualTo(itemIndexWhenInterrupting)
@@ -402,28 +357,16 @@
         val itemSize = with(rule.density) { 15.toDp() }
 
         rule.setContentWithTestViewConfiguration {
-            LazyColumn {
-                items(items) { item ->
-                    Spacer(
-                        Modifier
-                            .size(itemSize)
-                            .testTag(item))
-                }
-            }
+            LazyColumn { items(items) { item -> Spacer(Modifier.size(itemSize).testTag(item)) } }
         }
 
-        rule.runOnIdle {
-            items.removeLast()
-        }
+        rule.runOnIdle { items.removeLast() }
 
-        rule.onNodeWithTag("1")
-            .assertIsDisplayed()
+        rule.onNodeWithTag("1").assertIsDisplayed()
 
-        rule.onNodeWithTag("2")
-            .assertIsDisplayed()
+        rule.onNodeWithTag("2").assertIsDisplayed()
 
-        rule.onNodeWithTag("3")
-            .assertIsNotPlaced()
+        rule.onNodeWithTag("3").assertIsNotPlaced()
     }
 
     @Test
@@ -447,11 +390,7 @@
             outerState.value++
         }
 
-        rule.runOnIdle {
-            assertThat(recompositions).isEqualTo(
-                listOf(0 to 0, 1 to 1)
-            )
-        }
+        rule.runOnIdle { assertThat(recompositions).isEqualTo(listOf(0 to 0, 1 to 1)) }
     }
 
     @SdkSuppress(minSdkVersion = Build.VERSION_CODES.O)
@@ -461,8 +400,7 @@
         rule.setContentWithTestViewConfiguration {
             state = rememberLazyListState()
             LazyColumn(
-                Modifier
-                    .requiredSize(10.dp)
+                Modifier.requiredSize(10.dp)
                     .testTag(LazyListTag)
                     .graphicsLayer()
                     .background(Color.Blue),
@@ -471,13 +409,7 @@
                 items(2) {
                     val size = if (it == 0) 5.dp else 100.dp
                     val color = if (it == 0) Color.Red else Color.Transparent
-                    Box(
-                        Modifier
-                            .fillMaxWidth()
-                            .height(size)
-                            .background(color)
-                            .testTag("$it")
-                    )
+                    Box(Modifier.fillMaxWidth().height(size).background(color).testTag("$it"))
                 }
             }
         }
@@ -492,11 +424,7 @@
         }
 
         // and verify there is no Red item displayed
-        rule.onNodeWithTag(LazyListTag)
-            .captureToImage()
-            .assertPixels {
-                Color.Blue
-            }
+        rule.onNodeWithTag(LazyListTag).captureToImage().assertPixels { Color.Blue }
     }
 
     @Test
@@ -505,23 +433,14 @@
         rule.setContentWithTestViewConfiguration {
             state = rememberLazyListState()
             LazyColumn(Modifier.size(20.dp), state = state) {
-                items(100) {
-                    LazyRowWrapped {
-                        BasicText("$it", Modifier.size(21.dp))
-                    }
-                }
+                items(100) { LazyRowWrapped { BasicText("$it", Modifier.size(21.dp)) } }
             }
         }
 
         (1..10).forEach { item ->
-            rule.runOnIdle {
-                runBlocking {
-                    state.scrollToItem(item)
-                }
-            }
+            rule.runOnIdle { runBlocking { state.scrollToItem(item) } }
 
-            rule.onNodeWithText("$item")
-                .assertIsDisplayed()
+            rule.onNodeWithText("$item").assertIsDisplayed()
         }
     }
 
@@ -529,32 +448,19 @@
     fun nestedLazyRowChildrenAreReused() {
         lateinit var state: LazyListState
         var remeasuresCount = 0
-        val measureModifier = Modifier.layout { _, constraints ->
-            if (!isLookingAhead) {
-                // Track the post-lookahead measurement count to avoid double counting when
-                // lookahead is used.
-                remeasuresCount++
+        val measureModifier =
+            Modifier.layout { _, constraints ->
+                if (!isLookingAhead) {
+                    // Track the post-lookahead measurement count to avoid double counting when
+                    // lookahead is used.
+                    remeasuresCount++
+                }
+                layout(constraints.maxWidth, constraints.maxHeight) {}
             }
-            layout(constraints.maxWidth, constraints.maxHeight) {}
-        }
         rule.setContentWithTestViewConfiguration {
             state = rememberLazyListState()
-            LazyColumn(
-                Modifier
-                    .fillMaxWidth()
-                    .height(10.dp),
-                state = state
-            ) {
-                items(100) {
-                    LazyRow {
-                        item {
-                            Box(
-                                Modifier
-                                    .size(25.dp)
-                                    .then(measureModifier))
-                        }
-                    }
-                }
+            LazyColumn(Modifier.fillMaxWidth().height(10.dp), state = state) {
+                items(100) { LazyRow { item { Box(Modifier.size(25.dp).then(measureModifier)) } } }
             }
         }
 
@@ -579,30 +485,21 @@
     fun nestedLazyRowChildrenWithDifferentContentTypeAreReused() {
         lateinit var state: LazyListState
         var remeasuresCount = 0
-        val measureModifier = Modifier.layout { _, constraints ->
-            if (!isLookingAhead) {
-                // Track the post-lookahead measurement count to avoid double counting when
-                // lookahead is used.
-                remeasuresCount++
+        val measureModifier =
+            Modifier.layout { _, constraints ->
+                if (!isLookingAhead) {
+                    // Track the post-lookahead measurement count to avoid double counting when
+                    // lookahead is used.
+                    remeasuresCount++
+                }
+                layout(constraints.maxWidth, constraints.maxHeight) {}
             }
-            layout(constraints.maxWidth, constraints.maxHeight) {}
-        }
         rule.setContentWithTestViewConfiguration {
             state = rememberLazyListState()
-            LazyColumn(
-                Modifier
-                    .fillMaxWidth()
-                    .height(10.dp),
-                state = state
-            ) {
+            LazyColumn(Modifier.fillMaxWidth().height(10.dp), state = state) {
                 items(100) { row ->
                     LazyRow {
-                        item(contentType = row) {
-                            Box(
-                                Modifier
-                                    .size(25.dp)
-                                    .then(measureModifier))
-                        }
+                        item(contentType = row) { Box(Modifier.size(25.dp).then(measureModifier)) }
                     }
                 }
             }
@@ -635,39 +532,28 @@
         var compose by mutableStateOf(true)
         rule.setContent {
             SubcomposeLayout(state = subcomposeState) { constraints ->
-                val node = if (compose) {
-                    subcompose(Unit) {
-                        LazyColumn(Modifier.size(itemSizeDp), state) {
-                            items(100) {
-                                Box(Modifier.size(itemSizeDp))
+                val node =
+                    if (compose) {
+                        subcompose(Unit) {
+                                LazyColumn(Modifier.size(itemSizeDp), state) {
+                                    items(100) { Box(Modifier.size(itemSizeDp)) }
+                                }
                             }
-                        }
-                    }.first().measure(constraints)
-                } else {
-                    null
-                }
-                layout(10, 10) {
-                    node?.place(0, 0)
-                }
+                            .first()
+                            .measure(constraints)
+                    } else {
+                        null
+                    }
+                layout(10, 10) { node?.place(0, 0) }
             }
         }
-        rule.runOnIdle {
-            compose = false
-        }
-        rule.runOnIdle {
-            runBlocking {
-                state.scrollBy(itemSize)
-            }
-        }
+        rule.runOnIdle { compose = false }
+        rule.runOnIdle { runBlocking { state.scrollBy(itemSize) } }
     }
 
     @Composable
     private fun LazyRowWrapped(content: @Composable () -> Unit) {
-        LazyRow {
-            items(count = 1) {
-                content()
-            }
-        }
+        LazyRow { items(count = 1) { content() } }
     }
 
     private fun ComposeContentTestRule.setContentWithTestViewConfiguration(
@@ -675,9 +561,7 @@
     ) {
         this.setContent {
             if (useLookaheadScope) {
-                LookaheadScope {
-                    WithTouchSlop(TestTouchSlop, composable)
-                }
+                LookaheadScope { WithTouchSlop(TestTouchSlop, composable) }
             } else {
                 WithTouchSlop(TestTouchSlop, composable)
             }
diff --git a/compose/foundation/foundation/integration-tests/lazy-tests/src/androidTest/kotlin/androidx/compose/foundation/lazy/list/LazyCustomKeysTest.kt b/compose/foundation/foundation/integration-tests/lazy-tests/src/androidTest/kotlin/androidx/compose/foundation/lazy/list/LazyCustomKeysTest.kt
index e5da285..cab2ad8 100644
--- a/compose/foundation/foundation/integration-tests/lazy-tests/src/androidTest/kotlin/androidx/compose/foundation/lazy/list/LazyCustomKeysTest.kt
+++ b/compose/foundation/foundation/integration-tests/lazy-tests/src/androidTest/kotlin/androidx/compose/foundation/lazy/list/LazyCustomKeysTest.kt
@@ -52,24 +52,15 @@
 @RunWith(AndroidJUnit4::class)
 class LazyCustomKeysTest {
 
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
-    val itemSize = with(rule.density) {
-        100.toDp()
-    }
+    val itemSize = with(rule.density) { 100.toDp() }
 
     @Test
     fun itemsWithKeysAreLaidOutCorrectly() {
         val list = listOf(MyClass(0), MyClass(1), MyClass(2))
 
-        rule.setContent {
-            LazyColumn {
-                items(list, key = { it.id }) {
-                    Item("${it.id}")
-                }
-            }
-        }
+        rule.setContent { LazyColumn { items(list, key = { it.id }) { Item("${it.id}") } } }
 
         assertItems("0", "1", "2")
     }
@@ -79,27 +70,17 @@
         var list by mutableStateOf(listOf(MyClass(0), MyClass(1), MyClass(2)))
 
         rule.setContent {
-            LazyColumn {
-                items(list, key = { it.id }) {
-                    Item(remember { "${it.id}" })
-                }
-            }
+            LazyColumn { items(list, key = { it.id }) { Item(remember { "${it.id}" }) } }
         }
 
-        rule.runOnIdle {
-            list = listOf(list[0], list[2])
-        }
+        rule.runOnIdle { list = listOf(list[0], list[2]) }
 
         assertItems("0", "2")
     }
 
     @Test
     fun reordering_statesAreMoved_list() {
-        testReordering { list ->
-            items(list, key = { it.id }) {
-                Item(remember { "${it.id}" })
-            }
-        }
+        testReordering { list -> items(list, key = { it.id }) { Item(remember { "${it.id}" }) } }
     }
 
     @Test
@@ -115,9 +96,7 @@
     fun reordering_statesAreMoved_array() {
         testReordering { list ->
             val array = list.toTypedArray()
-            items(array, key = { it.id }) {
-                Item(remember { "${it.id}" })
-            }
+            items(array, key = { it.id }) { Item(remember { "${it.id}" }) }
         }
     }
 
@@ -134,9 +113,7 @@
     @Test
     fun reordering_statesAreMoved_itemsWithCount() {
         testReordering { list ->
-            items(list.size, key = { list[it].id }) {
-                Item(remember { "${list[it].id}" })
-            }
+            items(list.size, key = { list[it].id }) { Item(remember { "${list[it].id}" }) }
         }
     }
 
@@ -146,16 +123,10 @@
         var counter = 0
 
         rule.setContent {
-            LazyColumn {
-                items(list, key = { it.id }) {
-                    Item(remember { counter++ }.toString())
-                }
-            }
+            LazyColumn { items(list, key = { it.id }) { Item(remember { counter++ }.toString()) } }
         }
 
-        rule.runOnIdle {
-            list = listOf(MyClass(3), MyClass(4), MyClass(5), MyClass(6))
-        }
+        rule.runOnIdle { list = listOf(MyClass(3), MyClass(4), MyClass(5), MyClass(6)) }
 
         assertItems("3", "4", "5", "6")
     }
@@ -166,16 +137,10 @@
         var counter = 0
 
         rule.setContent {
-            LazyColumn {
-                items(list, key = { it.id }) {
-                    Item(remember { counter++ }.toString())
-                }
-            }
+            LazyColumn { items(list, key = { it.id }) { Item(remember { counter++ }.toString()) } }
         }
 
-        rule.runOnIdle {
-            list = listOf(MyClass(1))
-        }
+        rule.runOnIdle { list = listOf(MyClass(1)) }
 
         assertItems("1")
     }
@@ -186,16 +151,10 @@
         var counter = 0
 
         rule.setContent {
-            LazyColumn {
-                items(list, key = { it.id }) {
-                    Item(remember { counter++ }.toString())
-                }
-            }
+            LazyColumn { items(list, key = { it.id }) { Item(remember { counter++ }.toString()) } }
         }
 
-        rule.runOnIdle {
-            list = listOf(MyClass(1), MyClass(3))
-        }
+        rule.runOnIdle { list = listOf(MyClass(1), MyClass(3)) }
 
         assertItems("1", "3")
     }
@@ -203,9 +162,7 @@
     @Test
     fun mixingKeyedItemsAndNot() {
         testReordering { list ->
-            item {
-                Item("${list.first().id}")
-            }
+            item { Item("${list.first().id}") }
             items(list.subList(fromIndex = 1, toIndex = list.size), key = { it.id }) {
                 Item(remember { "${it.id}" })
             }
@@ -217,24 +174,16 @@
         val state = mutableStateOf(emptyList<Int>())
 
         rule.setContent {
-            LaunchedEffect(Unit) {
-                state.value = listOf(4, 1, 3)
-            }
+            LaunchedEffect(Unit) { state.value = listOf(4, 1, 3) }
 
             val list = state.value
 
-            LazyColumn(Modifier.fillMaxSize()) {
-                items(list, key = { it }) {
-                    Item(it.toString())
-                }
-            }
+            LazyColumn(Modifier.fillMaxSize()) { items(list, key = { it }) { Item(it.toString()) } }
         }
 
         assertItems("4", "1", "3")
 
-        rule.runOnIdle {
-            state.value = listOf(2, 4, 6, 1, 3, 5)
-        }
+        rule.runOnIdle { state.value = listOf(2, 4, 6, 1, 3, 5) }
 
         assertItems("2", "4", "6", "1", "3", "5")
     }
@@ -244,16 +193,10 @@
         val list = mutableStateListOf(MyClass(0), MyClass(1), MyClass(2))
 
         rule.setContent {
-            LazyColumn {
-                items(list, key = { it.id }) {
-                    Item(remember { "${it.id}" })
-                }
-            }
+            LazyColumn { items(list, key = { it.id }) { Item(remember { "${it.id}" }) } }
         }
 
-        rule.runOnIdle {
-            list.add(list.removeAt(1))
-        }
+        rule.runOnIdle { list.add(list.removeAt(1)) }
 
         assertItems("0", "2", "1")
     }
@@ -266,17 +209,11 @@
         rule.setContent {
             state = rememberLazyListState()
             LazyColumn(state = state) {
-                items(list, key = { it.id }) {
-                    Item(remember { "${it.id}" })
-                }
+                items(list, key = { it.id }) { Item(remember { "${it.id}" }) }
             }
         }
 
-        rule.runOnIdle {
-            assertThat(
-                state.visibleKeys
-            ).isEqualTo(listOf(0, 1, 2))
-        }
+        rule.runOnIdle { assertThat(state.visibleKeys).isEqualTo(listOf(0, 1, 2)) }
     }
 
     @Test
@@ -287,21 +224,13 @@
         rule.setContent {
             state = rememberLazyListState()
             LazyColumn(state = state) {
-                items(list, key = { it.id }) {
-                    Item(remember { "${it.id}" })
-                }
+                items(list, key = { it.id }) { Item(remember { "${it.id}" }) }
             }
         }
 
-        rule.runOnIdle {
-            list = listOf(list[0], list[2], list[1])
-        }
+        rule.runOnIdle { list = listOf(list[0], list[2], list[1]) }
 
-        rule.runOnIdle {
-            assertThat(
-                state.visibleKeys
-            ).isEqualTo(listOf(0, 2, 1))
-        }
+        rule.runOnIdle { assertThat(state.visibleKeys).isEqualTo(listOf(0, 2, 1)) }
     }
 
     @Test
@@ -312,19 +241,13 @@
         rule.setContent {
             state = rememberLazyListState()
             LazyColumn(Modifier.size(itemSize * 2.5f), state) {
-                items(list) {
-                    Item(remember { "$it" })
-                }
+                items(list) { Item(remember { "$it" }) }
             }
         }
 
-        rule.runOnIdle {
-            list = (0..15).toList()
-        }
+        rule.runOnIdle { list = (0..15).toList() }
 
-        rule.runOnIdle {
-            assertThat(state.firstVisibleItemIndex).isEqualTo(0)
-        }
+        rule.runOnIdle { assertThat(state.firstVisibleItemIndex).isEqualTo(0) }
     }
 
     @Test
@@ -335,21 +258,15 @@
         rule.setContent {
             state = rememberLazyListState()
             LazyColumn(Modifier.size(itemSize * 2.5f), state) {
-                items(list, key = { it }) {
-                    Item(remember { "$it" })
-                }
+                items(list, key = { it }) { Item(remember { "$it" }) }
             }
         }
 
-        rule.runOnIdle {
-            list = (0..15).toList()
-        }
+        rule.runOnIdle { list = (0..15).toList() }
 
         rule.runOnIdle {
             assertThat(state.firstVisibleItemIndex).isEqualTo(10)
-            assertThat(
-                state.visibleKeys
-            ).isEqualTo(listOf(10, 11, 12))
+            assertThat(state.visibleKeys).isEqualTo(listOf(10, 11, 12))
         }
     }
 
@@ -361,21 +278,15 @@
         rule.setContent {
             state = rememberLazyListState(5)
             LazyColumn(Modifier.size(itemSize * 2.5f), state) {
-                items(list, key = { it }) {
-                    Item(remember { "$it" })
-                }
+                items(list, key = { it }) { Item(remember { "$it" }) }
             }
         }
 
-        rule.runOnIdle {
-            list = (0..15).toList()
-        }
+        rule.runOnIdle { list = (0..15).toList() }
 
         rule.runOnIdle {
             assertThat(state.firstVisibleItemIndex).isEqualTo(5)
-            assertThat(
-                state.visibleKeys
-            ).isEqualTo(listOf(5, 6, 7))
+            assertThat(state.visibleKeys).isEqualTo(listOf(5, 6, 7))
         }
     }
 
@@ -387,21 +298,15 @@
         rule.setContent {
             state = rememberLazyListState(10) // key 20 is the first item
             LazyColumn(Modifier.size(itemSize * 2.5f), state) {
-                items(list, key = { it }) {
-                    Item(remember { "$it" })
-                }
+                items(list, key = { it }) { Item(remember { "$it" }) }
             }
         }
 
-        rule.runOnIdle {
-            list = (0..30).toList()
-        }
+        rule.runOnIdle { list = (0..30).toList() }
 
         rule.runOnIdle {
             assertThat(state.firstVisibleItemIndex).isEqualTo(20)
-            assertThat(
-                state.visibleKeys
-            ).isEqualTo(listOf(20, 21, 22))
+            assertThat(state.visibleKeys).isEqualTo(listOf(20, 21, 22))
         }
     }
 
@@ -413,15 +318,11 @@
         rule.setContent {
             state = rememberLazyListState(5)
             LazyColumn(Modifier.size(itemSize * 2.5f), state) {
-                items(list, key = { it }) {
-                    Item(remember { "$it" })
-                }
+                items(list, key = { it }) { Item(remember { "$it" }) }
             }
         }
 
-        rule.runOnIdle {
-            list = (0..20) - 5
-        }
+        rule.runOnIdle { list = (0..20) - 5 }
 
         rule.runOnIdle {
             assertThat(state.firstVisibleItemIndex).isEqualTo(5)
@@ -435,32 +336,27 @@
 
         rule.setContent {
             LazyColumn {
-                items(1, key = {
-                    keyCalls++
-                    0
-                }) {
+                items(
+                    1,
+                    key = {
+                        keyCalls++
+                        0
+                    }
+                ) {
                     Item("item")
                 }
             }
         }
 
-        rule.runOnIdle {
-            assertThat(keyCalls).isEqualTo(1)
-        }
+        rule.runOnIdle { assertThat(keyCalls).isEqualTo(1) }
     }
 
     private fun testReordering(content: LazyListScope.(List<MyClass>) -> Unit) {
         var list by mutableStateOf(listOf(MyClass(0), MyClass(1), MyClass(2)))
 
-        rule.setContent {
-            LazyColumn {
-                content(list)
-            }
-        }
+        rule.setContent { LazyColumn { content(list) } }
 
-        rule.runOnIdle {
-            list = listOf(list[0], list[2], list[1])
-        }
+        rule.runOnIdle { list = listOf(list[0], list[2], list[1]) }
 
         assertItems("0", "2", "1")
     }
@@ -468,7 +364,8 @@
     private fun assertItems(vararg tags: String) {
         var currentTop = 0.dp
         tags.forEach {
-            rule.onNodeWithTag(it)
+            rule
+                .onNodeWithTag(it)
                 .assertTopPositionInRootIsEqualTo(currentTop)
                 .assertHeightIsEqualTo(itemSize)
             currentTop += itemSize
@@ -477,12 +374,11 @@
 
     @Composable
     private fun Item(tag: String) {
-        Spacer(
-            Modifier.testTag(tag).size(itemSize)
-        )
+        Spacer(Modifier.testTag(tag).size(itemSize))
     }
 
     private class MyClass(val id: Int)
 }
 
-private val LazyListState.visibleKeys: List<Any> get() = layoutInfo.visibleItemsInfo.map { it.key }
+private val LazyListState.visibleKeys: List<Any>
+    get() = layoutInfo.visibleItemsInfo.map { it.key }
diff --git a/compose/foundation/foundation/integration-tests/lazy-tests/src/androidTest/kotlin/androidx/compose/foundation/lazy/list/LazyListBeyondBoundsAndExtraItemsTest.kt b/compose/foundation/foundation/integration-tests/lazy-tests/src/androidTest/kotlin/androidx/compose/foundation/lazy/list/LazyListBeyondBoundsAndExtraItemsTest.kt
index 01d26d2..cd135f0 100644
--- a/compose/foundation/foundation/integration-tests/lazy-tests/src/androidTest/kotlin/androidx/compose/foundation/lazy/list/LazyListBeyondBoundsAndExtraItemsTest.kt
+++ b/compose/foundation/foundation/integration-tests/lazy-tests/src/androidTest/kotlin/androidx/compose/foundation/lazy/list/LazyListBeyondBoundsAndExtraItemsTest.kt
@@ -71,30 +71,15 @@
                     beyondBoundsItemCount = 1,
                     reverseLayout = reverseLayout
                 ) {
-                    items(5) { index ->
-                        Box(
-                            Modifier
-                                .size(10.dp)
-                                .trackPlaced(index)
-                        )
-                    }
+                    items(5) { index -> Box(Modifier.size(10.dp).trackPlaced(index)) }
                     item {
                         Box(
-                            Modifier
-                                .size(10.dp)
-                                .trackPlaced(5)
-                                .modifierLocalConsumer {
-                                    beyondBoundsLayout = ModifierLocalBeyondBoundsLayout.current
-                                }
+                            Modifier.size(10.dp).trackPlaced(5).modifierLocalConsumer {
+                                beyondBoundsLayout = ModifierLocalBeyondBoundsLayout.current
+                            }
                         )
                     }
-                    items(5) { index ->
-                        Box(
-                            Modifier
-                                .size(10.dp)
-                                .trackPlaced(index + 6)
-                        )
-                    }
+                    items(5) { index -> Box(Modifier.size(10.dp).trackPlaced(index + 6)) }
                 }
             }
         }
@@ -140,30 +125,15 @@
                     beyondBoundsItemCount = 1,
                     reverseLayout = reverseLayout
                 ) {
-                    items(5) { index ->
-                        Box(
-                            Modifier
-                                .size(10.dp)
-                                .trackPlaced(index)
-                        )
-                    }
+                    items(5) { index -> Box(Modifier.size(10.dp).trackPlaced(index)) }
                     item {
                         Box(
-                            Modifier
-                                .size(10.dp)
-                                .trackPlaced(5)
-                                .modifierLocalConsumer {
-                                    beyondBoundsLayout = ModifierLocalBeyondBoundsLayout.current
-                                }
+                            Modifier.size(10.dp).trackPlaced(5).modifierLocalConsumer {
+                                beyondBoundsLayout = ModifierLocalBeyondBoundsLayout.current
+                            }
                         )
                     }
-                    items(5) { index ->
-                        Box(
-                            Modifier
-                                .size(10.dp)
-                                .trackPlaced(index + 6)
-                        )
-                    }
+                    items(5) { index -> Box(Modifier.size(10.dp).trackPlaced(index + 6)) }
                 }
             }
         }
@@ -202,14 +172,8 @@
         @Parameterized.Parameters(name = "{0}")
         fun params() = buildList {
             for (orientation in listOf(Orientation.Horizontal, Orientation.Vertical)) {
-                for (beyondBoundsLayoutDirection in listOf(
-                    Left,
-                    Right,
-                    Above,
-                    Below,
-                    Before,
-                    After
-                )) {
+                for (beyondBoundsLayoutDirection in
+                    listOf(Left, Right, Above, Below, Before, After)) {
                     for (reverseLayout in listOf(false, true)) {
                         for (layoutDirection in listOf(LayoutDirection.Ltr, LayoutDirection.Rtl)) {
                             add(
@@ -244,15 +208,16 @@
     private val LazyListState.visibleItems: List<Int>
         get() = layoutInfo.visibleItemsInfo.map { it.index }
 
-    private fun expectedExtraItemsBeforeVisibleBounds() = when (beyondBoundsLayoutDirection) {
-        Right -> if (layoutDirection == LayoutDirection.Ltr) reverseLayout else !reverseLayout
-        Left -> if (layoutDirection == LayoutDirection.Ltr) !reverseLayout else reverseLayout
-        Above -> !reverseLayout
-        Below -> reverseLayout
-        After -> false
-        Before -> true
-        else -> error("Unsupported BeyondBoundsDirection")
-    }
+    private fun expectedExtraItemsBeforeVisibleBounds() =
+        when (beyondBoundsLayoutDirection) {
+            Right -> if (layoutDirection == LayoutDirection.Ltr) reverseLayout else !reverseLayout
+            Left -> if (layoutDirection == LayoutDirection.Ltr) !reverseLayout else reverseLayout
+            Above -> !reverseLayout
+            Below -> reverseLayout
+            After -> false
+            Before -> true
+            else -> error("Unsupported BeyondBoundsDirection")
+        }
 
     private fun Modifier.trackPlaced(index: Int): Modifier =
         this then TrackPlacedElement(index, placedItems)
diff --git a/compose/foundation/foundation/integration-tests/lazy-tests/src/androidTest/kotlin/androidx/compose/foundation/lazy/list/LazyListBeyondBoundsItemCountTest.kt b/compose/foundation/foundation/integration-tests/lazy-tests/src/androidTest/kotlin/androidx/compose/foundation/lazy/list/LazyListBeyondBoundsItemCountTest.kt
index 2daecbe..b7a11fd 100644
--- a/compose/foundation/foundation/integration-tests/lazy-tests/src/androidTest/kotlin/androidx/compose/foundation/lazy/list/LazyListBeyondBoundsItemCountTest.kt
+++ b/compose/foundation/foundation/integration-tests/lazy-tests/src/androidTest/kotlin/androidx/compose/foundation/lazy/list/LazyListBeyondBoundsItemCountTest.kt
@@ -48,11 +48,7 @@
         val state = LazyListState(firstVisibleItem)
 
         // Act
-        setLazyListContent(state = state) {
-            items(ItemCount) {
-                ListItem(index = it)
-            }
-        }
+        setLazyListContent(state = state) { items(ItemCount) { ListItem(index = it) } }
 
         // Assert
         assertBeforeItemsArePlaced(state)
@@ -67,18 +63,10 @@
     fun verifyItemsArePlacedBeforeAndAfterVisibleItemsAfterScroll() {
         // Arrange
         val state = LazyListState()
-        setLazyListContent(state = state) {
-            items(ItemCount) {
-                ListItem(index = it)
-            }
-        }
+        setLazyListContent(state = state) { items(ItemCount) { ListItem(index = it) } }
 
         // Act
-        rule.runOnIdle {
-            runBlocking {
-                state.scrollToItem(firstVisibleItem)
-            }
-        }
+        rule.runOnIdle { runBlocking { state.scrollToItem(firstVisibleItem) } }
 
         // Assert
         assertBeforeItemsArePlaced(state)
@@ -127,11 +115,7 @@
 
     @Composable
     private fun ListItem(index: Int) {
-        Box(
-            modifier = Modifier
-                .size(25.dp)
-                .testTag(index.toString())
-        )
+        Box(modifier = Modifier.size(25.dp).testTag(index.toString()))
     }
 
     companion object {
diff --git a/compose/foundation/foundation/integration-tests/lazy-tests/src/androidTest/kotlin/androidx/compose/foundation/lazy/list/LazyListBeyondBoundsTest.kt b/compose/foundation/foundation/integration-tests/lazy-tests/src/androidTest/kotlin/androidx/compose/foundation/lazy/list/LazyListBeyondBoundsTest.kt
index 3d7d3ed..8f25e31 100644
--- a/compose/foundation/foundation/integration-tests/lazy-tests/src/androidTest/kotlin/androidx/compose/foundation/lazy/list/LazyListBeyondBoundsTest.kt
+++ b/compose/foundation/foundation/integration-tests/lazy-tests/src/androidTest/kotlin/androidx/compose/foundation/lazy/list/LazyListBeyondBoundsTest.kt
@@ -62,8 +62,7 @@
 @MediumTest
 class LazyListBeyondBoundsTest {
 
-    @get:Rule
-    val rule = createParameterizedComposeTestRule<Param>()
+    @get:Rule val rule = createParameterizedComposeTestRule<Param>()
 
     // We need to wrap the inline class parameter in another class because Java can't instantiate
     // the inline class.
@@ -72,9 +71,10 @@
         val reverseLayout: Boolean,
         val layoutDirection: LayoutDirection,
     ) {
-        override fun toString() = "beyondBoundsLayoutDirection=$beyondBoundsLayoutDirection " +
-            "reverseLayout=$reverseLayout " +
-            "layoutDirection=$layoutDirection"
+        override fun toString() =
+            "beyondBoundsLayoutDirection=$beyondBoundsLayoutDirection " +
+                "reverseLayout=$reverseLayout " +
+                "layoutDirection=$layoutDirection"
 
         internal fun placementComparator(): PlacementComparator {
             return PlacementComparator(beyondBoundsLayoutDirection, layoutDirection, reverseLayout)
@@ -104,432 +104,353 @@
     }
 
     @Test
-    fun onlyOneVisibleItemIsPlaced() = with(rule) {
-        // Arrange.
-        setLazyContent(size = 10.toDp(), firstVisibleItem = 0) {
-            items(100) { index ->
-                Box(
-                    Modifier
-                        .size(10.toDp())
-                        .trackPlaced(index)
-                )
+    fun onlyOneVisibleItemIsPlaced() =
+        with(rule) {
+            // Arrange.
+            setLazyContent(size = 10.toDp(), firstVisibleItem = 0) {
+                items(100) { index -> Box(Modifier.size(10.toDp()).trackPlaced(index)) }
             }
-        }
 
-        forEachParameter(ParamsToTest) { _ ->
-            // Assert.
-            runOnIdle {
-                assertThat(placedItems.keys).containsExactly(0)
-                assertThat(visibleItems).containsExactly(0)
-            }
-            resetTestCase()
-        }
-    }
-
-    @Test
-    fun onlyTwoVisibleItemsArePlaced() = with(rule) {
-        // Arrange.
-        setLazyContent(size = 20.toDp(), firstVisibleItem = 0) {
-            items(100) { index ->
-                Box(
-                    Modifier
-                        .size(10.toDp())
-                        .trackPlaced(index)
-                )
+            forEachParameter(ParamsToTest) { _ ->
+                // Assert.
+                runOnIdle {
+                    assertThat(placedItems.keys).containsExactly(0)
+                    assertThat(visibleItems).containsExactly(0)
+                }
+                resetTestCase()
             }
         }
-        forEachParameter(ParamsToTest) { _ ->
-            // Assert.
-            runOnIdle {
-                assertThat(placedItems.keys).containsExactly(0, 1)
-                assertThat(visibleItems).containsExactly(0, 1)
-            }
-            resetTestCase()
-        }
-    }
-
-    @Test
-    fun onlyThreeVisibleItemsArePlaced() = with(rule) {
-        // Arrange.
-        setLazyContent(size = 30.toDp(), firstVisibleItem = 0) {
-            items(100) { index ->
-                Box(
-                    Modifier
-                        .size(10.toDp())
-                        .trackPlaced(index)
-                )
-            }
-        }
-
-        forEachParameter(ParamsToTest) { _ ->
-            // Assert.
-            runOnIdle {
-                assertThat(placedItems.keys).containsExactly(0, 1, 2)
-                assertThat(visibleItems).containsExactly(0, 1, 2)
-            }
-            resetTestCase()
-        }
-    }
 
     @Test
-    fun emptyLazyList_doesNotCrash() = with(rule) {
-        // Arrange.
-        var addItems by mutableStateOf(true)
-        lateinit var beyondBoundsLayoutRef: BeyondBoundsLayout
-        setLazyContent(size = 30.toDp(), firstVisibleItem = 0) {
-            if (addItems) {
+    fun onlyTwoVisibleItemsArePlaced() =
+        with(rule) {
+            // Arrange.
+            setLazyContent(size = 20.toDp(), firstVisibleItem = 0) {
+                items(100) { index -> Box(Modifier.size(10.toDp()).trackPlaced(index)) }
+            }
+            forEachParameter(ParamsToTest) { _ ->
+                // Assert.
+                runOnIdle {
+                    assertThat(placedItems.keys).containsExactly(0, 1)
+                    assertThat(visibleItems).containsExactly(0, 1)
+                }
+                resetTestCase()
+            }
+        }
+
+    @Test
+    fun onlyThreeVisibleItemsArePlaced() =
+        with(rule) {
+            // Arrange.
+            setLazyContent(size = 30.toDp(), firstVisibleItem = 0) {
+                items(100) { index -> Box(Modifier.size(10.toDp()).trackPlaced(index)) }
+            }
+
+            forEachParameter(ParamsToTest) { _ ->
+                // Assert.
+                runOnIdle {
+                    assertThat(placedItems.keys).containsExactly(0, 1, 2)
+                    assertThat(visibleItems).containsExactly(0, 1, 2)
+                }
+                resetTestCase()
+            }
+        }
+
+    @Test
+    fun emptyLazyList_doesNotCrash() =
+        with(rule) {
+            // Arrange.
+            var addItems by mutableStateOf(true)
+            lateinit var beyondBoundsLayoutRef: BeyondBoundsLayout
+            setLazyContent(size = 30.toDp(), firstVisibleItem = 0) {
+                if (addItems) {
+                    item {
+                        Box(
+                            Modifier.modifierLocalConsumer {
+                                beyondBoundsLayout = ModifierLocalBeyondBoundsLayout.current
+                            }
+                        )
+                    }
+                }
+            }
+
+            forEachParameter(ParamsToTest) { param ->
+                runOnIdle {
+                    beyondBoundsLayoutRef = beyondBoundsLayout!!
+                    addItems = false
+                }
+
+                // Act.
+                val hasMoreContent = runOnIdle {
+                    beyondBoundsLayoutRef.layout(param.beyondBoundsLayoutDirection) {
+                        hasMoreContent
+                    }
+                }
+
+                // Assert.
+                runOnIdle { assertThat(hasMoreContent).isFalse() }
+                resetTestCase()
+                addItems = true
+            }
+        }
+
+    @Test
+    fun oneExtraItemBeyondVisibleBounds() =
+        with(rule) {
+            // Arrange.
+            setLazyContent(size = 30.toDp(), firstVisibleItem = 5) {
+                items(5) { index -> Box(Modifier.size(10.toDp()).trackPlaced(index)) }
                 item {
                     Box(
-                        Modifier.modifierLocalConsumer {
+                        Modifier.size(10.toDp()).trackPlaced(5).modifierLocalConsumer {
                             beyondBoundsLayout = ModifierLocalBeyondBoundsLayout.current
                         }
                     )
                 }
-            }
-        }
-
-        forEachParameter(ParamsToTest) { param ->
-            runOnIdle {
-                beyondBoundsLayoutRef = beyondBoundsLayout!!
-                addItems = false
+                items(5) { index -> Box(Modifier.size(10.toDp()).trackPlaced(index + 6)) }
             }
 
-            // Act.
-            val hasMoreContent = runOnIdle {
-                beyondBoundsLayoutRef.layout(param.beyondBoundsLayoutDirection) {
-                    hasMoreContent
-                }
-            }
-
-            // Assert.
-            runOnIdle {
-                assertThat(hasMoreContent).isFalse()
-            }
-            resetTestCase()
-            addItems = true
-        }
-    }
-
-    @Test
-    fun oneExtraItemBeyondVisibleBounds() = with(rule) {
-        // Arrange.
-        setLazyContent(size = 30.toDp(), firstVisibleItem = 5) {
-            items(5) { index ->
-                Box(
-                    Modifier
-                        .size(10.toDp())
-                        .trackPlaced(index)
-                )
-            }
-            item {
-                Box(
-                    Modifier
-                        .size(10.toDp())
-                        .trackPlaced(5)
-                        .modifierLocalConsumer {
-                            beyondBoundsLayout = ModifierLocalBeyondBoundsLayout.current
+            forEachParameter(ParamsToTest) { param ->
+                // Act.
+                runOnUiThread {
+                    beyondBoundsLayout!!.layout(param.beyondBoundsLayoutDirection) {
+                        // Assert that the beyond bounds items are present.
+                        if (param.expectedExtraItemsBeforeVisibleBounds()) {
+                            assertThat(placedItems.keys).containsExactly(4, 5, 6, 7)
+                        } else {
+                            assertThat(placedItems.keys).containsExactly(5, 6, 7, 8)
                         }
-                )
-            }
-            items(5) { index ->
-                Box(
-                    Modifier
-                        .size(10.toDp())
-                        .trackPlaced(index + 6)
-                )
-            }
-        }
+                        assertThat(visibleItems).containsExactly(5, 6, 7)
 
-        forEachParameter(ParamsToTest) { param ->
-            // Act.
-            runOnUiThread {
-                beyondBoundsLayout!!.layout(param.beyondBoundsLayoutDirection) {
-                    // Assert that the beyond bounds items are present.
-                    if (param.expectedExtraItemsBeforeVisibleBounds()) {
-                        assertThat(placedItems.keys).containsExactly(4, 5, 6, 7)
-                    } else {
-                        assertThat(placedItems.keys).containsExactly(5, 6, 7, 8)
+                        assertThat(placedItems.values).isInOrder(param.placementComparator())
+
+                        // Just return true so that we stop as soon as we run this once.
+                        // This should result in one extra item being added.
+                        true
                     }
+                }
+
+                // Assert that the beyond bounds items are removed.
+                runOnIdle {
+                    assertThat(placedItems.keys).containsExactly(5, 6, 7)
                     assertThat(visibleItems).containsExactly(5, 6, 7)
-
-                    assertThat(placedItems.values).isInOrder(param.placementComparator())
-
-                    // Just return true so that we stop as soon as we run this once.
-                    // This should result in one extra item being added.
-                    true
                 }
+                resetTestCase(5)
             }
-
-            // Assert that the beyond bounds items are removed.
-            runOnIdle {
-                assertThat(placedItems.keys).containsExactly(5, 6, 7)
-                assertThat(visibleItems).containsExactly(5, 6, 7)
-            }
-            resetTestCase(5)
         }
-    }
 
     @Test
-    fun twoExtraItemsBeyondVisibleBounds() = with(rule) {
-        // Arrange.
-        setLazyContent(size = 30.toDp(), firstVisibleItem = 5) {
-            items(5) { index ->
-                Box(
-                    Modifier
-                        .size(10.toDp())
-                        .trackPlaced(index)
-                )
-            }
-            item {
-                Box(
-                    Modifier
-                        .size(10.toDp())
-                        .trackPlaced(5)
-                        .modifierLocalConsumer {
+    fun twoExtraItemsBeyondVisibleBounds() =
+        with(rule) {
+            // Arrange.
+            setLazyContent(size = 30.toDp(), firstVisibleItem = 5) {
+                items(5) { index -> Box(Modifier.size(10.toDp()).trackPlaced(index)) }
+                item {
+                    Box(
+                        Modifier.size(10.toDp()).trackPlaced(5).modifierLocalConsumer {
                             beyondBoundsLayout = ModifierLocalBeyondBoundsLayout.current
                         }
-                )
+                    )
+                }
+                items(5) { index -> Box(Modifier.size(10.toDp()).trackPlaced(index + 6)) }
             }
-            items(5) { index ->
-                Box(
-                    Modifier
-                        .size(10.toDp())
-                        .trackPlaced(index + 6)
-                )
+
+            forEachParameter(ParamsToTest) { param ->
+                var extraItemCount = 2
+                // Act.
+                runOnUiThread {
+                    beyondBoundsLayout!!.layout(param.beyondBoundsLayoutDirection) {
+                        if (--extraItemCount > 0) {
+                            // Return null to continue the search.
+                            null
+                        } else {
+                            // Assert that the beyond bounds items are present.
+                            if (param.expectedExtraItemsBeforeVisibleBounds()) {
+                                assertThat(placedItems.keys).containsExactly(3, 4, 5, 6, 7)
+                            } else {
+                                assertThat(placedItems.keys).containsExactly(5, 6, 7, 8, 9)
+                            }
+                            assertThat(visibleItems).containsExactly(5, 6, 7)
+
+                            assertThat(placedItems.values).isInOrder(param.placementComparator())
+
+                            // Return true to stop the search.
+                            true
+                        }
+                    }
+                }
+
+                // Assert that the beyond bounds items are removed.
+                runOnIdle {
+                    assertThat(placedItems.keys).containsExactly(5, 6, 7)
+                    assertThat(visibleItems).containsExactly(5, 6, 7)
+                }
+                resetTestCase(5)
             }
         }
 
-        forEachParameter(ParamsToTest) { param ->
-            var extraItemCount = 2
-            // Act.
-            runOnUiThread {
-                beyondBoundsLayout!!.layout(param.beyondBoundsLayoutDirection) {
-                    if (--extraItemCount > 0) {
-                        // Return null to continue the search.
-                        null
-                    } else {
-                        // Assert that the beyond bounds items are present.
-                        if (param.expectedExtraItemsBeforeVisibleBounds()) {
-                            assertThat(placedItems.keys).containsExactly(3, 4, 5, 6, 7)
+    @Test
+    fun allBeyondBoundsItemsInSpecifiedDirection() =
+        with(rule) {
+            // Arrange.
+            setLazyContent(size = 30.toDp(), firstVisibleItem = 5) {
+                items(5) { index -> Box(Modifier.size(10.toDp()).trackPlaced(index)) }
+                item {
+                    Box(
+                        Modifier.size(10.toDp())
+                            .modifierLocalConsumer {
+                                beyondBoundsLayout = ModifierLocalBeyondBoundsLayout.current
+                            }
+                            .trackPlaced(5)
+                    )
+                }
+                items(5) { index -> Box(Modifier.size(10.toDp()).trackPlaced(index + 6)) }
+            }
+
+            forEachParameter(ParamsToTest) { param ->
+                // Act.
+                runOnUiThread {
+                    beyondBoundsLayout!!.layout(param.beyondBoundsLayoutDirection) {
+                        if (hasMoreContent) {
+                            // Just return null so that we keep adding more items till we reach the
+                            // end.
+                            null
                         } else {
-                            assertThat(placedItems.keys).containsExactly(5, 6, 7, 8, 9)
+                            // Assert that the beyond bounds items are present.
+                            if (param.expectedExtraItemsBeforeVisibleBounds()) {
+                                assertThat(placedItems.keys).containsExactly(0, 1, 2, 3, 4, 5, 6, 7)
+                            } else {
+                                assertThat(placedItems.keys).containsExactly(5, 6, 7, 8, 9, 10)
+                            }
+                            assertThat(visibleItems).containsExactly(5, 6, 7)
+
+                            assertThat(placedItems.values).isInOrder(param.placementComparator())
+
+                            // Return true to end the search.
+                            true
                         }
-                        assertThat(visibleItems).containsExactly(5, 6, 7)
+                    }
+                }
 
-                        assertThat(placedItems.values).isInOrder(param.placementComparator())
+                // Assert that the beyond bounds items are removed.
+                runOnIdle { assertThat(placedItems.keys).containsExactly(5, 6, 7) }
+                resetTestCase(5)
+            }
+        }
 
-                        // Return true to stop the search.
+    @Test
+    fun beyondBoundsLayoutRequest_inDirectionPerpendicularToLazyListOrientation() =
+        with(rule) {
+            // Arrange.
+            setLazyContentInPerpendicularDirection(size = 30.toDp(), firstVisibleItem = 5) {
+                items(5) { index -> Box(Modifier.size(10.toDp()).trackPlaced(index)) }
+                item {
+                    Box(
+                        Modifier.size(10.toDp()).trackPlaced(5).modifierLocalConsumer {
+                            beyondBoundsLayout = ModifierLocalBeyondBoundsLayout.current
+                        }
+                    )
+                }
+                items(5) { index -> Box(Modifier.size(10.toDp()).trackPlaced(index + 6)) }
+            }
+
+            forEachParameter(ParamsToTest) { param ->
+                var beyondBoundsLayoutCount = 0
+                runOnIdle {
+                    assertThat(placedItems.keys).containsExactly(5, 6, 7)
+                    assertThat(visibleItems).containsExactly(5, 6, 7)
+                }
+
+                // Act.
+                runOnUiThread {
+                    beyondBoundsLayout!!.layout(param.beyondBoundsLayoutDirection) {
+                        beyondBoundsLayoutCount++
+                        when (param.beyondBoundsLayoutDirection) {
+                            Left,
+                            Right,
+                            Above,
+                            Below -> {
+                                assertThat(placedItems.keys).containsExactly(5, 6, 7)
+                                assertThat(visibleItems).containsExactly(5, 6, 7)
+                            }
+                            Before,
+                            After -> {
+                                if (param.expectedExtraItemsBeforeVisibleBounds()) {
+                                    assertThat(placedItems.keys).containsExactly(4, 5, 6, 7)
+                                    assertThat(visibleItems).containsExactly(5, 6, 7)
+                                } else {
+                                    assertThat(placedItems.keys).containsExactly(5, 6, 7, 8)
+                                    assertThat(visibleItems).containsExactly(5, 6, 7)
+                                }
+                            }
+                        }
+                        // Just return true so that we stop as soon as we run this once.
+                        // This should result in one extra item being added.
                         true
                     }
                 }
-            }
 
-            // Assert that the beyond bounds items are removed.
-            runOnIdle {
-                assertThat(placedItems.keys).containsExactly(5, 6, 7)
-                assertThat(visibleItems).containsExactly(5, 6, 7)
-            }
-            resetTestCase(5)
-        }
-    }
-
-    @Test
-    fun allBeyondBoundsItemsInSpecifiedDirection() = with(rule) {
-        // Arrange.
-        setLazyContent(size = 30.toDp(), firstVisibleItem = 5) {
-            items(5) { index ->
-                Box(
-                    Modifier
-                        .size(10.toDp())
-                        .trackPlaced(index)
-                )
-            }
-            item {
-                Box(
-                    Modifier
-                        .size(10.toDp())
-                        .modifierLocalConsumer {
-                            beyondBoundsLayout = ModifierLocalBeyondBoundsLayout.current
-                        }
-                        .trackPlaced(5)
-                )
-            }
-            items(5) { index ->
-                Box(
-                    Modifier
-                        .size(10.toDp())
-                        .trackPlaced(index + 6)
-                )
-            }
-        }
-
-        forEachParameter(ParamsToTest) { param ->
-            // Act.
-            runOnUiThread {
-                beyondBoundsLayout!!.layout(param.beyondBoundsLayoutDirection) {
-                    if (hasMoreContent) {
-                        // Just return null so that we keep adding more items till we reach the end.
-                        null
-                    } else {
-                        // Assert that the beyond bounds items are present.
-                        if (param.expectedExtraItemsBeforeVisibleBounds()) {
-                            assertThat(placedItems.keys).containsExactly(0, 1, 2, 3, 4, 5, 6, 7)
-                        } else {
-                            assertThat(placedItems.keys).containsExactly(5, 6, 7, 8, 9, 10)
-                        }
-                        assertThat(visibleItems).containsExactly(5, 6, 7)
-
-                        assertThat(placedItems.values).isInOrder(param.placementComparator())
-
-                        // Return true to end the search.
-                        true
-                    }
-                }
-            }
-
-            // Assert that the beyond bounds items are removed.
-            runOnIdle {
-                assertThat(placedItems.keys).containsExactly(5, 6, 7)
-            }
-            resetTestCase(5)
-        }
-    }
-
-    @Test
-    fun beyondBoundsLayoutRequest_inDirectionPerpendicularToLazyListOrientation() = with(rule) {
-        // Arrange.
-        setLazyContentInPerpendicularDirection(size = 30.toDp(), firstVisibleItem = 5) {
-            items(5) { index ->
-                Box(
-                    Modifier
-                        .size(10.toDp())
-                        .trackPlaced(index)
-                )
-            }
-            item {
-                Box(
-                    Modifier
-                        .size(10.toDp())
-                        .trackPlaced(5)
-                        .modifierLocalConsumer {
-                            beyondBoundsLayout = ModifierLocalBeyondBoundsLayout.current
-                        }
-                )
-            }
-            items(5) { index ->
-                Box(
-                    Modifier
-                        .size(10.toDp())
-                        .trackPlaced(index + 6)
-                )
-            }
-        }
-
-        forEachParameter(ParamsToTest) { param ->
-
-            var beyondBoundsLayoutCount = 0
-            runOnIdle {
-                assertThat(placedItems.keys).containsExactly(5, 6, 7)
-                assertThat(visibleItems).containsExactly(5, 6, 7)
-            }
-
-            // Act.
-            runOnUiThread {
-                beyondBoundsLayout!!.layout(param.beyondBoundsLayoutDirection) {
-                    beyondBoundsLayoutCount++
+                runOnIdle {
                     when (param.beyondBoundsLayoutDirection) {
-                        Left, Right, Above, Below -> {
+                        Left,
+                        Right,
+                        Above,
+                        Below -> {
+                            assertThat(beyondBoundsLayoutCount).isEqualTo(0)
+                        }
+                        Before,
+                        After -> {
+                            assertThat(beyondBoundsLayoutCount).isEqualTo(1)
+
+                            // Assert that the beyond bounds items are removed.
                             assertThat(placedItems.keys).containsExactly(5, 6, 7)
                             assertThat(visibleItems).containsExactly(5, 6, 7)
                         }
-
-                        Before, After -> {
-                            if (param.expectedExtraItemsBeforeVisibleBounds()) {
-                                assertThat(placedItems.keys).containsExactly(4, 5, 6, 7)
-                                assertThat(visibleItems).containsExactly(5, 6, 7)
-                            } else {
-                                assertThat(placedItems.keys).containsExactly(5, 6, 7, 8)
-                                assertThat(visibleItems).containsExactly(5, 6, 7)
-                            }
-                        }
+                        else -> error("Unsupported BeyondBoundsLayoutDirection")
                     }
-                    // Just return true so that we stop as soon as we run this once.
-                    // This should result in one extra item being added.
-                    true
                 }
+                resetTestCase(5)
             }
-
-            runOnIdle {
-                when (param.beyondBoundsLayoutDirection) {
-                    Left, Right, Above, Below -> {
-                        assertThat(beyondBoundsLayoutCount).isEqualTo(0)
-                    }
-
-                    Before, After -> {
-                        assertThat(beyondBoundsLayoutCount).isEqualTo(1)
-
-                        // Assert that the beyond bounds items are removed.
-                        assertThat(placedItems.keys).containsExactly(5, 6, 7)
-                        assertThat(visibleItems).containsExactly(5, 6, 7)
-                    }
-
-                    else -> error("Unsupported BeyondBoundsLayoutDirection")
-                }
-            }
-            resetTestCase(5)
         }
-    }
 
     @Test
-    fun returningNullDoesNotCauseInfiniteLoop() = with(rule) {
-        // Arrange.
-        setLazyContent(size = 30.toDp(), firstVisibleItem = 5) {
-            items(5) { index ->
-                Box(
-                    Modifier
-                        .size(10.toDp())
-                        .trackPlaced(index)
-                )
-            }
-            item {
-                Box(
-                    Modifier
-                        .size(10.toDp())
-                        .modifierLocalConsumer {
-                            beyondBoundsLayout = ModifierLocalBeyondBoundsLayout.current
-                        }
-                        .trackPlaced(5)
-                )
-            }
-            items(5) { index ->
-                Box(
-                    Modifier
-                        .size(10.toDp())
-                        .trackPlaced(index + 6)
-                )
-            }
-        }
-
-        forEachParameter(ParamsToTest) { param ->
-            // Act.
-            var count = 0
-            runOnUiThread {
-                beyondBoundsLayout!!.layout(param.beyondBoundsLayoutDirection) {
-                    // Assert that we don't keep iterating when there is no ending condition.
-                    assertThat(count++).isLessThan(lazyListState.layoutInfo.totalItemsCount)
-                    // Always return null to continue the search.
-                    null
+    fun returningNullDoesNotCauseInfiniteLoop() =
+        with(rule) {
+            // Arrange.
+            setLazyContent(size = 30.toDp(), firstVisibleItem = 5) {
+                items(5) { index -> Box(Modifier.size(10.toDp()).trackPlaced(index)) }
+                item {
+                    Box(
+                        Modifier.size(10.toDp())
+                            .modifierLocalConsumer {
+                                beyondBoundsLayout = ModifierLocalBeyondBoundsLayout.current
+                            }
+                            .trackPlaced(5)
+                    )
                 }
+                items(5) { index -> Box(Modifier.size(10.toDp()).trackPlaced(index + 6)) }
             }
 
-            // Assert that the beyond bounds items are removed.
-            runOnIdle {
-                assertThat(placedItems.keys).containsExactly(5, 6, 7)
-                assertThat(visibleItems).containsExactly(5, 6, 7)
+            forEachParameter(ParamsToTest) { param ->
+                // Act.
+                var count = 0
+                runOnUiThread {
+                    beyondBoundsLayout!!.layout(param.beyondBoundsLayoutDirection) {
+                        // Assert that we don't keep iterating when there is no ending condition.
+                        assertThat(count++).isLessThan(lazyListState.layoutInfo.totalItemsCount)
+                        // Always return null to continue the search.
+                        null
+                    }
+                }
+
+                // Assert that the beyond bounds items are removed.
+                runOnIdle {
+                    assertThat(placedItems.keys).containsExactly(5, 6, 7)
+                    assertThat(visibleItems).containsExactly(5, 6, 7)
+                }
+                resetTestCase(5)
             }
-            resetTestCase(5)
         }
-    }
 
     private fun ParameterizedComposeTestRule<Param>.setLazyContent(
         size: Dp,
@@ -541,22 +462,24 @@
                 CompositionLocalProvider(LocalLayoutDirection provides it.layoutDirection) {
                     lazyListState = rememberLazyListState(firstVisibleItem)
                     when (it.beyondBoundsLayoutDirection) {
-                        Left, Right, Before, After ->
+                        Left,
+                        Right,
+                        Before,
+                        After ->
                             LazyRow(
                                 modifier = Modifier.size(size),
                                 state = lazyListState,
                                 reverseLayout = it.reverseLayout,
                                 content = content
                             )
-
-                        Above, Below ->
+                        Above,
+                        Below ->
                             LazyColumn(
                                 modifier = Modifier.size(size),
                                 state = lazyListState,
                                 reverseLayout = it.reverseLayout,
                                 content = content
                             )
-
                         else -> unsupportedDirection()
                     }
                 }
@@ -573,22 +496,24 @@
             CompositionLocalProvider(LocalLayoutDirection provides it.layoutDirection) {
                 lazyListState = rememberLazyListState(firstVisibleItem)
                 when (it.beyondBoundsLayoutDirection) {
-                    Left, Right, Before, After ->
+                    Left,
+                    Right,
+                    Before,
+                    After ->
                         LazyColumn(
                             modifier = Modifier.size(size),
                             state = lazyListState,
                             reverseLayout = it.reverseLayout,
                             content = content
                         )
-
-                    Above, Below ->
+                    Above,
+                    Below ->
                         LazyRow(
                             modifier = Modifier.size(size),
                             state = lazyListState,
                             reverseLayout = it.reverseLayout,
                             content = content
                         )
-
                     else -> unsupportedDirection()
                 }
             }
@@ -600,28 +525,26 @@
     private val visibleItems: List<Int>
         get() = lazyListState.layoutInfo.visibleItemsInfo.map { it.index }
 
-    private fun Param.expectedExtraItemsBeforeVisibleBounds() = when (beyondBoundsLayoutDirection) {
-        Right -> if (layoutDirection == Ltr) reverseLayout else !reverseLayout
-        Left -> if (layoutDirection == Ltr) !reverseLayout else reverseLayout
-        Above -> !reverseLayout
-        Below -> reverseLayout
-        After -> false
-        Before -> true
-        else -> error("Unsupported BeyondBoundsDirection")
-    }
+    private fun Param.expectedExtraItemsBeforeVisibleBounds() =
+        when (beyondBoundsLayoutDirection) {
+            Right -> if (layoutDirection == Ltr) reverseLayout else !reverseLayout
+            Left -> if (layoutDirection == Ltr) !reverseLayout else reverseLayout
+            Above -> !reverseLayout
+            Below -> reverseLayout
+            After -> false
+            Before -> true
+            else -> error("Unsupported BeyondBoundsDirection")
+        }
 
-    private fun unsupportedDirection(): Nothing = error(
-        "Lazy list does not support beyond bounds layout for the specified direction"
-    )
+    private fun unsupportedDirection(): Nothing =
+        error("Lazy list does not support beyond bounds layout for the specified direction")
 
     private fun Modifier.trackPlaced(index: Int): Modifier =
         this then TrackPlacedElement(index, placedItems)
 }
 
-internal data class TrackPlacedElement(
-    var index: Int,
-    var placedItems: MutableMap<Int, Rect>
-) : ModifierNodeElement<TrackPlacedNode>() {
+internal data class TrackPlacedElement(var index: Int, var placedItems: MutableMap<Int, Rect>) :
+    ModifierNodeElement<TrackPlacedNode>() {
     override fun create() = TrackPlacedNode(index, placedItems)
 
     override fun update(node: TrackPlacedNode) {
@@ -636,10 +559,8 @@
     }
 }
 
-internal class TrackPlacedNode(
-    var index: Int,
-    var placedItems: MutableMap<Int, Rect>
-) : LayoutAwareModifierNode, Modifier.Node() {
+internal class TrackPlacedNode(var index: Int, var placedItems: MutableMap<Int, Rect>) :
+    LayoutAwareModifierNode, Modifier.Node() {
     override fun onPlaced(coordinates: LayoutCoordinates) {
         placedItems[index] =
             coordinates.findRootCoordinates().localBoundingBoxOf(coordinates, false)
@@ -655,10 +576,12 @@
     val layoutDirection: LayoutDirection,
     val reverseLayout: Boolean
 ) : Comparator<Rect> {
-    private fun itemsInReverseOrder() = when (beyondBoundsLayoutDirection) {
-        Above, Below -> reverseLayout
-        else -> if (layoutDirection == Ltr) reverseLayout else !reverseLayout
-    }
+    private fun itemsInReverseOrder() =
+        when (beyondBoundsLayoutDirection) {
+            Above,
+            Below -> reverseLayout
+            else -> if (layoutDirection == Ltr) reverseLayout else !reverseLayout
+        }
 
     private fun compareOffset(o1: Float, o2: Float): Int {
         return if (itemsInReverseOrder()) o2.compareTo(o1) else o1.compareTo(o2)
@@ -667,7 +590,8 @@
     override fun compare(o1: Rect?, o2: Rect?): Int {
         if (o1 == null || o2 == null) return 0
         return when (beyondBoundsLayoutDirection) {
-            Above, Below -> compareOffset(o1.top, o2.top)
+            Above,
+            Below -> compareOffset(o1.top, o2.top)
             else -> compareOffset(o1.left, o2.left)
         }
     }
diff --git a/compose/foundation/foundation/integration-tests/lazy-tests/src/androidTest/kotlin/androidx/compose/foundation/lazy/list/LazyListFocusMoveCompositionCountTest.kt b/compose/foundation/foundation/integration-tests/lazy-tests/src/androidTest/kotlin/androidx/compose/foundation/lazy/list/LazyListFocusMoveCompositionCountTest.kt
index 21f1531..f714583 100644
--- a/compose/foundation/foundation/integration-tests/lazy-tests/src/androidTest/kotlin/androidx/compose/foundation/lazy/list/LazyListFocusMoveCompositionCountTest.kt
+++ b/compose/foundation/foundation/integration-tests/lazy-tests/src/androidTest/kotlin/androidx/compose/foundation/lazy/list/LazyListFocusMoveCompositionCountTest.kt
@@ -43,14 +43,11 @@
 @RunWith(AndroidJUnit4::class)
 class LazyListFocusMoveCompositionCountTest {
 
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
     private val composedItems = mutableSetOf<Int>()
 
-    private val state = LazyListState().also {
-        it.prefetchingEnabled = false
-    }
+    private val state = LazyListState().also { it.prefetchingEnabled = false }
 
     @Test
     fun moveFocus() {
@@ -61,12 +58,7 @@
             focusManager = LocalFocusManager.current
             LazyRow(Modifier.size(rowSize), state) {
                 items(100) { index ->
-                    Box(
-                        Modifier
-                            .size(itemSize)
-                            .testTag("$index")
-                            .focusable()
-                    )
+                    Box(Modifier.size(itemSize).testTag("$index").focusable())
                     SideEffect { composedItems.add(index) }
                 }
             }
diff --git a/compose/foundation/foundation/integration-tests/lazy-tests/src/androidTest/kotlin/androidx/compose/foundation/lazy/list/LazyListFocusMoveTest.kt b/compose/foundation/foundation/integration-tests/lazy-tests/src/androidTest/kotlin/androidx/compose/foundation/lazy/list/LazyListFocusMoveTest.kt
index 8addd6e..03a3ca3 100644
--- a/compose/foundation/foundation/integration-tests/lazy-tests/src/androidTest/kotlin/androidx/compose/foundation/lazy/list/LazyListFocusMoveTest.kt
+++ b/compose/foundation/foundation/integration-tests/lazy-tests/src/androidTest/kotlin/androidx/compose/foundation/lazy/list/LazyListFocusMoveTest.kt
@@ -68,20 +68,15 @@
 @RunWith(Parameterized::class)
 class LazyListFocusMoveTest(param: FocusDirectionWrapper) {
 
-    @get:Rule
-    val rule = createParameterizedComposeTestRule<Param>()
+    @get:Rule val rule = createParameterizedComposeTestRule<Param>()
 
     // We need to wrap the inline class parameter in another class because Java can't instantiate
     // the inline class.
     data class FocusDirectionWrapper(val direction: FocusDirection)
 
-    class Param(
-        val reverseLayout: Boolean,
-        val layoutDirection: LayoutDirection
-    ) {
+    class Param(val reverseLayout: Boolean, val layoutDirection: LayoutDirection) {
         override fun toString() =
-            "reverseLayout=$reverseLayout " +
-                "layoutDirection=$layoutDirection"
+            "reverseLayout=$reverseLayout " + "layoutDirection=$layoutDirection"
     }
 
     private val focusDirection = param.direction
@@ -130,9 +125,7 @@
                 runOnIdle { initiallyFocused.requestFocus() }
 
                 // Act.
-                val success = runOnIdle {
-                    focusManager.moveFocus(focusDirection)
-                }
+                val success = runOnIdle { focusManager.moveFocus(focusDirection) }
 
                 // Assert.
                 runOnIdle {
@@ -140,16 +133,24 @@
                         if (focusDirection == Enter) isFalse() else isTrue()
                     }
                     when (focusDirection) {
-                        Left -> when (param.layoutDirection) {
-                            Ltr -> assertThat(isFocused[if (param.reverseLayout) 2 else 0]).isTrue()
-                            Rtl -> assertThat(isFocused[if (param.reverseLayout) 0 else 2]).isTrue()
-                        }
-
-                        Right -> when (param.layoutDirection) {
-                            Ltr -> assertThat(isFocused[if (param.reverseLayout) 0 else 2]).isTrue()
-                            Rtl -> assertThat(isFocused[if (param.reverseLayout) 2 else 0]).isTrue()
-                        }
-
+                        Left ->
+                            when (param.layoutDirection) {
+                                Ltr ->
+                                    assertThat(isFocused[if (param.reverseLayout) 2 else 0])
+                                        .isTrue()
+                                Rtl ->
+                                    assertThat(isFocused[if (param.reverseLayout) 0 else 2])
+                                        .isTrue()
+                            }
+                        Right ->
+                            when (param.layoutDirection) {
+                                Ltr ->
+                                    assertThat(isFocused[if (param.reverseLayout) 0 else 2])
+                                        .isTrue()
+                                Rtl ->
+                                    assertThat(isFocused[if (param.reverseLayout) 2 else 0])
+                                        .isTrue()
+                            }
                         Up -> assertThat(isFocused[if (param.reverseLayout) 2 else 0]).isTrue()
                         Down -> assertThat(isFocused[if (param.reverseLayout) 0 else 2]).isTrue()
                         Previous -> assertThat(isFocused[0]).isTrue()
@@ -180,9 +181,7 @@
                 runOnIdle { initiallyFocused.requestFocus() }
 
                 // Act.
-                val success = runOnIdle {
-                    focusManager.moveFocus(focusDirection)
-                }
+                val success = runOnIdle { focusManager.moveFocus(focusDirection) }
 
                 // Assert.
                 runOnIdle {
@@ -190,16 +189,24 @@
                         if (focusDirection == Enter) isFalse() else isTrue()
                     }
                     when (focusDirection) {
-                        Left -> when (param.layoutDirection) {
-                            Ltr -> assertThat(isFocused[if (param.reverseLayout) 2 else 0]).isTrue()
-                            Rtl -> assertThat(isFocused[if (param.reverseLayout) 0 else 2]).isTrue()
-                        }
-
-                        Right -> when (param.layoutDirection) {
-                            Ltr -> assertThat(isFocused[if (param.reverseLayout) 0 else 2]).isTrue()
-                            Rtl -> assertThat(isFocused[if (param.reverseLayout) 2 else 0]).isTrue()
-                        }
-
+                        Left ->
+                            when (param.layoutDirection) {
+                                Ltr ->
+                                    assertThat(isFocused[if (param.reverseLayout) 2 else 0])
+                                        .isTrue()
+                                Rtl ->
+                                    assertThat(isFocused[if (param.reverseLayout) 0 else 2])
+                                        .isTrue()
+                            }
+                        Right ->
+                            when (param.layoutDirection) {
+                                Ltr ->
+                                    assertThat(isFocused[if (param.reverseLayout) 0 else 2])
+                                        .isTrue()
+                                Rtl ->
+                                    assertThat(isFocused[if (param.reverseLayout) 2 else 0])
+                                        .isTrue()
+                            }
                         Up -> assertThat(isFocused[if (param.reverseLayout) 2 else 0]).isTrue()
                         Down -> assertThat(isFocused[if (param.reverseLayout) 0 else 2]).isTrue()
                         Previous -> assertThat(isFocused[0]).isTrue()
@@ -235,22 +242,22 @@
                     // Move focus to the last visible item.
                     initiallyFocused.requestFocus()
                     when (focusDirection) {
-                        Left, Right, Up, Down, Previous, Next -> focusManager.moveFocus(
-                            focusDirection
-                        )
-
-                        Enter, Exit -> {
+                        Left,
+                        Right,
+                        Up,
+                        Down,
+                        Previous,
+                        Next -> focusManager.moveFocus(focusDirection)
+                        Enter,
+                        Exit -> {
                             // Do nothing
                         }
-
                         else -> unsupportedDirection()
                     }
                 }
 
                 // Act.
-                val success = runOnIdle {
-                    focusManager.moveFocus(focusDirection)
-                }
+                val success = runOnIdle { focusManager.moveFocus(focusDirection) }
 
                 // Assert.
                 runOnIdle {
@@ -258,16 +265,24 @@
                         if (focusDirection == Enter) isFalse() else isTrue()
                     }
                     when (focusDirection) {
-                        Left -> when (param.layoutDirection) {
-                            Ltr -> assertThat(isFocused[if (param.reverseLayout) 7 else 3]).isTrue()
-                            Rtl -> assertThat(isFocused[if (param.reverseLayout) 3 else 7]).isTrue()
-                        }
-
-                        Right -> when (param.layoutDirection) {
-                            Ltr -> assertThat(isFocused[if (param.reverseLayout) 3 else 7]).isTrue()
-                            Rtl -> assertThat(isFocused[if (param.reverseLayout) 7 else 3]).isTrue()
-                        }
-
+                        Left ->
+                            when (param.layoutDirection) {
+                                Ltr ->
+                                    assertThat(isFocused[if (param.reverseLayout) 7 else 3])
+                                        .isTrue()
+                                Rtl ->
+                                    assertThat(isFocused[if (param.reverseLayout) 3 else 7])
+                                        .isTrue()
+                            }
+                        Right ->
+                            when (param.layoutDirection) {
+                                Ltr ->
+                                    assertThat(isFocused[if (param.reverseLayout) 3 else 7])
+                                        .isTrue()
+                                Rtl ->
+                                    assertThat(isFocused[if (param.reverseLayout) 7 else 3])
+                                        .isTrue()
+                            }
                         Up -> assertThat(isFocused[if (param.reverseLayout) 7 else 3]).isTrue()
                         Down -> assertThat(isFocused[if (param.reverseLayout) 3 else 7]).isTrue()
                         Previous -> assertThat(isFocused[3]).isTrue()
@@ -302,22 +317,22 @@
                     // Move focus to the last visible item.
                     initiallyFocused.requestFocus()
                     when (focusDirection) {
-                        Left, Right, Up, Down, Previous, Next -> focusManager.moveFocus(
-                            focusDirection
-                        )
-
-                        Enter, Exit -> {
+                        Left,
+                        Right,
+                        Up,
+                        Down,
+                        Previous,
+                        Next -> focusManager.moveFocus(focusDirection)
+                        Enter,
+                        Exit -> {
                             // Do nothing
                         }
-
                         else -> unsupportedDirection()
                     }
                 }
                 val firstVisibleItemIndex = lazyListState.firstVisibleItemIndex
                 // Act.
-                runOnIdle {
-                    focusManager.moveFocus(focusDirection)
-                }
+                runOnIdle { focusManager.moveFocus(focusDirection) }
 
                 // Assert We Did Not Move
                 runOnIdle {
@@ -352,22 +367,22 @@
 
                     // Move focus to the last visible item.
                     when (focusDirection) {
-                        Left, Right, Up, Down, Previous, Next -> focusManager.moveFocus(
-                            focusDirection
-                        )
-
-                        Enter, Exit -> {
+                        Left,
+                        Right,
+                        Up,
+                        Down,
+                        Previous,
+                        Next -> focusManager.moveFocus(focusDirection)
+                        Enter,
+                        Exit -> {
                             // Do nothing
                         }
-
                         else -> unsupportedDirection()
                     }
                 }
 
                 // Act.
-                val success = runOnIdle {
-                    focusManager.moveFocus(focusDirection)
-                }
+                val success = runOnIdle { focusManager.moveFocus(focusDirection) }
 
                 // Assert.
                 runOnIdle {
@@ -375,22 +390,24 @@
                         if (focusDirection == Enter) isFalse() else isTrue()
                     }
                     when (focusDirection) {
-                        Left -> when (param.layoutDirection) {
-                            Ltr ->
-                                assertThat(isFocused[if (param.reverseLayout) 208 else 4]).isTrue()
-
-                            Rtl ->
-                                assertThat(isFocused[if (param.reverseLayout) 4 else 208]).isTrue()
-                        }
-
-                        Right -> when (param.layoutDirection) {
-                            Ltr ->
-                                assertThat(isFocused[if (param.reverseLayout) 4 else 208]).isTrue()
-
-                            Rtl ->
-                                assertThat(isFocused[if (param.reverseLayout) 208 else 4]).isTrue()
-                        }
-
+                        Left ->
+                            when (param.layoutDirection) {
+                                Ltr ->
+                                    assertThat(isFocused[if (param.reverseLayout) 208 else 4])
+                                        .isTrue()
+                                Rtl ->
+                                    assertThat(isFocused[if (param.reverseLayout) 4 else 208])
+                                        .isTrue()
+                            }
+                        Right ->
+                            when (param.layoutDirection) {
+                                Ltr ->
+                                    assertThat(isFocused[if (param.reverseLayout) 4 else 208])
+                                        .isTrue()
+                                Rtl ->
+                                    assertThat(isFocused[if (param.reverseLayout) 208 else 4])
+                                        .isTrue()
+                            }
                         Up -> assertThat(isFocused[if (param.reverseLayout) 208 else 4]).isTrue()
                         Down -> assertThat(isFocused[if (param.reverseLayout) 4 else 208]).isTrue()
                         Previous -> assertThat(isFocused[4]).isTrue()
@@ -411,21 +428,11 @@
         // Arrange.
         rule.setTestContent {
             lazyList(30.dp, it, lazyListState) {
-                item {
-                    lazyListCrossAxis(
-                        30.dp,
-                        it
-                    ) { items(3) { FocusableBox(it + 0) } }
-                }
+                item { lazyListCrossAxis(30.dp, it) { items(3) { FocusableBox(it + 0) } } }
                 item { FocusableBox(3) }
                 item { FocusableBox(4, initiallyFocused) }
                 item { FocusableBox(5) }
-                item {
-                    lazyListCrossAxis(
-                        30.dp,
-                        it
-                    ) { items(3) { FocusableBox(it + 6) } }
-                }
+                item { lazyListCrossAxis(30.dp, it) { items(3) { FocusableBox(it + 6) } } }
             }
         }
         with(rule) {
@@ -437,22 +444,22 @@
 
                     // Move focus to the last visible item.
                     when (focusDirection) {
-                        Left, Right, Up, Down, Previous, Next -> focusManager.moveFocus(
-                            focusDirection
-                        )
-
-                        Enter, Exit -> {
+                        Left,
+                        Right,
+                        Up,
+                        Down,
+                        Previous,
+                        Next -> focusManager.moveFocus(focusDirection)
+                        Enter,
+                        Exit -> {
                             // Do nothing
                         }
-
                         else -> unsupportedDirection()
                     }
                 }
 
                 // Act.
-                val success = runOnIdle {
-                    focusManager.moveFocus(focusDirection)
-                }
+                val success = runOnIdle { focusManager.moveFocus(focusDirection) }
 
                 // Assert.
                 runOnIdle {
@@ -460,16 +467,24 @@
                         if (focusDirection == Enter) isFalse() else isTrue()
                     }
                     when (focusDirection) {
-                        Left -> when (param.layoutDirection) {
-                            Ltr -> assertThat(isFocused[if (param.reverseLayout) 8 else 0]).isTrue()
-                            Rtl -> assertThat(isFocused[if (param.reverseLayout) 2 else 6]).isTrue()
-                        }
-
-                        Right -> when (param.layoutDirection) {
-                            Ltr -> assertThat(isFocused[if (param.reverseLayout) 2 else 6]).isTrue()
-                            Rtl -> assertThat(isFocused[if (param.reverseLayout) 8 else 0]).isTrue()
-                        }
-
+                        Left ->
+                            when (param.layoutDirection) {
+                                Ltr ->
+                                    assertThat(isFocused[if (param.reverseLayout) 8 else 0])
+                                        .isTrue()
+                                Rtl ->
+                                    assertThat(isFocused[if (param.reverseLayout) 2 else 6])
+                                        .isTrue()
+                            }
+                        Right ->
+                            when (param.layoutDirection) {
+                                Ltr ->
+                                    assertThat(isFocused[if (param.reverseLayout) 2 else 6])
+                                        .isTrue()
+                                Rtl ->
+                                    assertThat(isFocused[if (param.reverseLayout) 8 else 0])
+                                        .isTrue()
+                            }
                         Up -> assertThat(isFocused[if (param.reverseLayout) 8 else 0]).isTrue()
                         Down -> assertThat(isFocused[if (param.reverseLayout) 2 else 6]).isTrue()
                         Previous -> assertThat(isFocused[2]).isTrue()
@@ -495,19 +510,9 @@
         rule.setTestContent {
             lazyList(30.dp, it, lazyListState) {
                 item { FocusableBox(0) }
-                item {
-                    lazyListCrossAxis(
-                        30.dp,
-                        it
-                    ) { items(3) { FocusableBox(it + 1) } }
-                }
+                item { lazyListCrossAxis(30.dp, it) { items(3) { FocusableBox(it + 1) } } }
                 item { FocusableBox(4, initiallyFocused) }
-                item {
-                    lazyListCrossAxis(
-                        30.dp,
-                        it
-                    ) { items(3) { FocusableBox(it + 5) } }
-                }
+                item { lazyListCrossAxis(30.dp, it) { items(3) { FocusableBox(it + 5) } } }
                 item { FocusableBox(8) }
             }
         }
@@ -520,20 +525,22 @@
 
                     // Move focus to the last visible item.
                     when (focusDirection) {
-                        Left, Right, Up, Down -> focusManager.moveFocus(focusDirection)
-                        Previous, Next -> repeat(3) { focusManager.moveFocus(focusDirection) }
-                        Enter, Exit -> {
+                        Left,
+                        Right,
+                        Up,
+                        Down -> focusManager.moveFocus(focusDirection)
+                        Previous,
+                        Next -> repeat(3) { focusManager.moveFocus(focusDirection) }
+                        Enter,
+                        Exit -> {
                             // Do nothing
                         }
-
                         else -> unsupportedDirection()
                     }
                 }
 
                 // Act.
-                val success = runOnIdle {
-                    focusManager.moveFocus(focusDirection)
-                }
+                val success = runOnIdle { focusManager.moveFocus(focusDirection) }
 
                 // Assert.
                 runOnIdle {
@@ -541,16 +548,24 @@
                         if (focusDirection == Enter) isFalse() else isTrue()
                     }
                     when (focusDirection) {
-                        Left -> when (param.layoutDirection) {
-                            Ltr -> assertThat(isFocused[if (param.reverseLayout) 8 else 0]).isTrue()
-                            Rtl -> assertThat(isFocused[if (param.reverseLayout) 0 else 8]).isTrue()
-                        }
-
-                        Right -> when (param.layoutDirection) {
-                            Ltr -> assertThat(isFocused[if (param.reverseLayout) 0 else 8]).isTrue()
-                            Rtl -> assertThat(isFocused[if (param.reverseLayout) 8 else 0]).isTrue()
-                        }
-
+                        Left ->
+                            when (param.layoutDirection) {
+                                Ltr ->
+                                    assertThat(isFocused[if (param.reverseLayout) 8 else 0])
+                                        .isTrue()
+                                Rtl ->
+                                    assertThat(isFocused[if (param.reverseLayout) 0 else 8])
+                                        .isTrue()
+                            }
+                        Right ->
+                            when (param.layoutDirection) {
+                                Ltr ->
+                                    assertThat(isFocused[if (param.reverseLayout) 0 else 8])
+                                        .isTrue()
+                                Rtl ->
+                                    assertThat(isFocused[if (param.reverseLayout) 8 else 0])
+                                        .isTrue()
+                            }
                         Up -> assertThat(isFocused[if (param.reverseLayout) 8 else 0]).isTrue()
                         Down -> assertThat(isFocused[if (param.reverseLayout) 0 else 8]).isTrue()
                         Previous -> assertThat(isFocused[0]).isTrue()
@@ -575,31 +590,11 @@
         // Arrange.
         rule.setTestContent {
             lazyList(30.dp, it, lazyListState) {
-                item {
-                    lazyListCrossAxis(
-                        30.dp,
-                        it
-                    ) { items(3) { FocusableBox(it + 0) } }
-                }
-                item {
-                    lazyListCrossAxis(
-                        30.dp,
-                        it
-                    ) { items(3) { FocusableBox(it + 3) } }
-                }
+                item { lazyListCrossAxis(30.dp, it) { items(3) { FocusableBox(it + 0) } } }
+                item { lazyListCrossAxis(30.dp, it) { items(3) { FocusableBox(it + 3) } } }
                 item { FocusableBox(6, initiallyFocused) }
-                item {
-                    lazyListCrossAxis(
-                        30.dp,
-                        it
-                    ) { items(3) { FocusableBox(it + 7) } }
-                }
-                item {
-                    lazyListCrossAxis(
-                        30.dp,
-                        it
-                    ) { items(3) { FocusableBox(it + 10) } }
-                }
+                item { lazyListCrossAxis(30.dp, it) { items(3) { FocusableBox(it + 7) } } }
+                item { lazyListCrossAxis(30.dp, it) { items(3) { FocusableBox(it + 10) } } }
             }
         }
         with(rule) {
@@ -611,20 +606,22 @@
 
                     // Move focus to the last visible item.
                     when (focusDirection) {
-                        Left, Right, Up, Down -> focusManager.moveFocus(focusDirection)
-                        Previous, Next -> repeat(3) { focusManager.moveFocus(focusDirection) }
-                        Enter, Exit -> {
+                        Left,
+                        Right,
+                        Up,
+                        Down -> focusManager.moveFocus(focusDirection)
+                        Previous,
+                        Next -> repeat(3) { focusManager.moveFocus(focusDirection) }
+                        Enter,
+                        Exit -> {
                             // Do nothing
                         }
-
                         else -> unsupportedDirection()
                     }
                 }
 
                 // Act.
-                val success = runOnIdle {
-                    focusManager.moveFocus(focusDirection)
-                }
+                val success = runOnIdle { focusManager.moveFocus(focusDirection) }
 
                 // Assert.
                 runOnIdle {
@@ -632,22 +629,24 @@
                         if (focusDirection == Enter) isFalse() else isTrue()
                     }
                     when (focusDirection) {
-                        Left -> when (param.layoutDirection) {
-                            Ltr ->
-                                assertThat(isFocused[if (param.reverseLayout) 12 else 0]).isTrue()
-
-                            Rtl ->
-                                assertThat(isFocused[if (param.reverseLayout) 2 else 10]).isTrue()
-                        }
-
-                        Right -> when (param.layoutDirection) {
-                            Ltr ->
-                                assertThat(isFocused[if (param.reverseLayout) 2 else 10]).isTrue()
-
-                            Rtl ->
-                                assertThat(isFocused[if (param.reverseLayout) 12 else 0]).isTrue()
-                        }
-
+                        Left ->
+                            when (param.layoutDirection) {
+                                Ltr ->
+                                    assertThat(isFocused[if (param.reverseLayout) 12 else 0])
+                                        .isTrue()
+                                Rtl ->
+                                    assertThat(isFocused[if (param.reverseLayout) 2 else 10])
+                                        .isTrue()
+                            }
+                        Right ->
+                            when (param.layoutDirection) {
+                                Ltr ->
+                                    assertThat(isFocused[if (param.reverseLayout) 2 else 10])
+                                        .isTrue()
+                                Rtl ->
+                                    assertThat(isFocused[if (param.reverseLayout) 12 else 0])
+                                        .isTrue()
+                            }
                         Up -> assertThat(isFocused[if (param.reverseLayout) 12 else 0]).isTrue()
                         Down -> assertThat(isFocused[if (param.reverseLayout) 2 else 10]).isTrue()
                         Previous -> assertThat(isFocused[2]).isTrue()
@@ -666,8 +665,7 @@
     @Composable
     private fun FocusableBox(index: Int, focusRequester: FocusRequester = FocusRequester()) {
         Box(
-            Modifier
-                .size(10.dp)
+            Modifier.size(10.dp)
                 .focusRequester(focusRequester)
                 .onFocusChanged { isFocused[index] = it.isFocused }
                 .focusable()
@@ -697,28 +695,34 @@
         content: LazyListScope.() -> Unit,
     ) {
         when (focusDirection) {
-            Left, Right, Enter, Exit, Next, Previous -> LazyRow(
-                modifier = Modifier
-                    .size(size)
-                    .onFocusChanged { isLazyListFocused = it.isFocused }
-                    .focusable(),
-                state = state,
-                reverseLayout = param.reverseLayout,
-                content = content,
-                userScrollEnabled = userScrollEnabled
-            )
-
-            Up, Down -> LazyColumn(
-                modifier = Modifier
-                    .size(size)
-                    .onFocusChanged { isLazyListFocused = it.isFocused }
-                    .focusable(),
-                state = state,
-                reverseLayout = param.reverseLayout,
-                content = content,
-                userScrollEnabled = userScrollEnabled
-            )
-
+            Left,
+            Right,
+            Enter,
+            Exit,
+            Next,
+            Previous ->
+                LazyRow(
+                    modifier =
+                        Modifier.size(size)
+                            .onFocusChanged { isLazyListFocused = it.isFocused }
+                            .focusable(),
+                    state = state,
+                    reverseLayout = param.reverseLayout,
+                    content = content,
+                    userScrollEnabled = userScrollEnabled
+                )
+            Up,
+            Down ->
+                LazyColumn(
+                    modifier =
+                        Modifier.size(size)
+                            .onFocusChanged { isLazyListFocused = it.isFocused }
+                            .focusable(),
+                    state = state,
+                    reverseLayout = param.reverseLayout,
+                    content = content,
+                    userScrollEnabled = userScrollEnabled
+                )
             else -> unsupportedDirection()
         }
     }
@@ -731,20 +735,26 @@
         content: LazyListScope.() -> Unit
     ) {
         when (focusDirection) {
-            Left, Right, Enter, Exit, Next, Previous -> LazyColumn(
-                modifier = Modifier.size(size),
-                state = state,
-                reverseLayout = param.reverseLayout,
-                content = content
-            )
-
-            Up, Down -> LazyRow(
-                modifier = Modifier.size(size),
-                state = state,
-                reverseLayout = param.reverseLayout,
-                content = content
-            )
-
+            Left,
+            Right,
+            Enter,
+            Exit,
+            Next,
+            Previous ->
+                LazyColumn(
+                    modifier = Modifier.size(size),
+                    state = state,
+                    reverseLayout = param.reverseLayout,
+                    content = content
+                )
+            Up,
+            Down ->
+                LazyRow(
+                    modifier = Modifier.size(size),
+                    state = state,
+                    reverseLayout = param.reverseLayout,
+                    content = content
+                )
             else -> unsupportedDirection()
         }
     }
diff --git a/compose/foundation/foundation/integration-tests/lazy-tests/src/androidTest/kotlin/androidx/compose/foundation/lazy/list/LazyListHeadersTest.kt b/compose/foundation/foundation/integration-tests/lazy-tests/src/androidTest/kotlin/androidx/compose/foundation/lazy/list/LazyListHeadersTest.kt
index b99984c..25cf39e 100644
--- a/compose/foundation/foundation/integration-tests/lazy-tests/src/androidTest/kotlin/androidx/compose/foundation/lazy/list/LazyListHeadersTest.kt
+++ b/compose/foundation/foundation/integration-tests/lazy-tests/src/androidTest/kotlin/androidx/compose/foundation/lazy/list/LazyListHeadersTest.kt
@@ -61,8 +61,7 @@
 
     private val LazyListTag = "LazyList"
 
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
     @Test
     fun lazyColumnShowsHeader_withoutBeyondBoundsItemCount() {
@@ -73,36 +72,24 @@
         rule.setContent {
             LazyColumn(Modifier.height(300.dp), beyondBoundsItemCount = 0) {
                 stickyHeader {
-                    Spacer(
-                        Modifier.height(101.dp).fillParentMaxWidth()
-                            .testTag(firstHeaderTag)
-                    )
+                    Spacer(Modifier.height(101.dp).fillParentMaxWidth().testTag(firstHeaderTag))
                 }
 
-                items(items) {
-                    Spacer(Modifier.height(101.dp).fillParentMaxWidth().testTag(it))
-                }
+                items(items) { Spacer(Modifier.height(101.dp).fillParentMaxWidth().testTag(it)) }
 
                 stickyHeader {
-                    Spacer(
-                        Modifier.height(101.dp).fillParentMaxWidth()
-                            .testTag(secondHeaderTag)
-                    )
+                    Spacer(Modifier.height(101.dp).fillParentMaxWidth().testTag(secondHeaderTag))
                 }
             }
         }
 
-        rule.onNodeWithTag(firstHeaderTag)
-            .assertIsDisplayed()
+        rule.onNodeWithTag(firstHeaderTag).assertIsDisplayed()
 
-        rule.onNodeWithTag("1")
-            .assertIsDisplayed()
+        rule.onNodeWithTag("1").assertIsDisplayed()
 
-        rule.onNodeWithTag("2")
-            .assertIsDisplayed()
+        rule.onNodeWithTag("2").assertIsDisplayed()
 
-        rule.onNodeWithTag(secondHeaderTag)
-            .assertDoesNotExist()
+        rule.onNodeWithTag(secondHeaderTag).assertDoesNotExist()
     }
 
     @Test
@@ -114,36 +101,24 @@
         rule.setContent {
             LazyColumn(Modifier.height(300.dp), beyondBoundsItemCount = 1) {
                 stickyHeader {
-                    Spacer(
-                        Modifier.height(101.dp).fillParentMaxWidth()
-                            .testTag(firstHeaderTag)
-                    )
+                    Spacer(Modifier.height(101.dp).fillParentMaxWidth().testTag(firstHeaderTag))
                 }
 
-                items(items) {
-                    Spacer(Modifier.height(101.dp).fillParentMaxWidth().testTag(it))
-                }
+                items(items) { Spacer(Modifier.height(101.dp).fillParentMaxWidth().testTag(it)) }
 
                 stickyHeader {
-                    Spacer(
-                        Modifier.height(101.dp).fillParentMaxWidth()
-                            .testTag(secondHeaderTag)
-                    )
+                    Spacer(Modifier.height(101.dp).fillParentMaxWidth().testTag(secondHeaderTag))
                 }
             }
         }
 
-        rule.onNodeWithTag(firstHeaderTag)
-            .assertIsDisplayed()
+        rule.onNodeWithTag(firstHeaderTag).assertIsDisplayed()
 
-        rule.onNodeWithTag("1")
-            .assertIsDisplayed()
+        rule.onNodeWithTag("1").assertIsDisplayed()
 
-        rule.onNodeWithTag("2")
-            .assertIsDisplayed()
+        rule.onNodeWithTag("2").assertIsDisplayed()
 
-        rule.onNodeWithTag(secondHeaderTag)
-            .assertExists()
+        rule.onNodeWithTag(secondHeaderTag).assertExists()
     }
 
     @Test
@@ -159,29 +134,21 @@
                 rememberLazyListState().also { state = it }
             ) {
                 stickyHeader {
-                    Spacer(
-                        Modifier.height(101.dp).fillParentMaxWidth()
-                            .testTag(firstHeaderTag)
-                    )
+                    Spacer(Modifier.height(101.dp).fillParentMaxWidth().testTag(firstHeaderTag))
                 }
 
-                items(items) {
-                    Spacer(Modifier.height(101.dp).fillParentMaxWidth().testTag(it))
-                }
+                items(items) { Spacer(Modifier.height(101.dp).fillParentMaxWidth().testTag(it)) }
 
                 stickyHeader {
-                    Spacer(
-                        Modifier.height(101.dp).fillParentMaxWidth()
-                            .testTag(secondHeaderTag)
-                    )
+                    Spacer(Modifier.height(101.dp).fillParentMaxWidth().testTag(secondHeaderTag))
                 }
             }
         }
 
-        rule.onNodeWithTag(LazyListTag)
-            .scrollBy(y = 102.dp, density = rule.density)
+        rule.onNodeWithTag(LazyListTag).scrollBy(y = 102.dp, density = rule.density)
 
-        rule.onNodeWithTag(firstHeaderTag)
+        rule
+            .onNodeWithTag(firstHeaderTag)
             .assertIsDisplayed()
             .assertTopPositionInRootIsEqualTo(0.dp)
 
@@ -190,11 +157,9 @@
             assertEquals(0, state.layoutInfo.visibleItemsInfo.first().offset)
         }
 
-        rule.onNodeWithTag("2")
-            .assertIsDisplayed()
+        rule.onNodeWithTag("2").assertIsDisplayed()
 
-        rule.onNodeWithTag(secondHeaderTag)
-            .assertIsDisplayed()
+        rule.onNodeWithTag(secondHeaderTag).assertIsDisplayed()
     }
 
     @Test
@@ -206,39 +171,26 @@
         rule.setContentWithTestViewConfiguration {
             LazyColumn(Modifier.height(300.dp).testTag(LazyListTag)) {
                 stickyHeader {
-                    Spacer(
-                        Modifier.height(101.dp).fillParentMaxWidth()
-                            .testTag(firstHeaderTag)
-                    )
+                    Spacer(Modifier.height(101.dp).fillParentMaxWidth().testTag(firstHeaderTag))
                 }
 
                 stickyHeader {
-                    Spacer(
-                        Modifier.height(101.dp).fillParentMaxWidth()
-                            .testTag(secondHeaderTag)
-                    )
+                    Spacer(Modifier.height(101.dp).fillParentMaxWidth().testTag(secondHeaderTag))
                 }
 
-                items(items) {
-                    Spacer(Modifier.height(101.dp).fillParentMaxWidth().testTag(it))
-                }
+                items(items) { Spacer(Modifier.height(101.dp).fillParentMaxWidth().testTag(it)) }
             }
         }
 
-        rule.onNodeWithTag(LazyListTag)
-            .scrollBy(y = 105.dp, density = rule.density)
+        rule.onNodeWithTag(LazyListTag).scrollBy(y = 105.dp, density = rule.density)
 
-        rule.onNodeWithTag(firstHeaderTag)
-            .assertIsNotDisplayed()
+        rule.onNodeWithTag(firstHeaderTag).assertIsNotDisplayed()
 
-        rule.onNodeWithTag(secondHeaderTag)
-            .assertIsDisplayed()
+        rule.onNodeWithTag(secondHeaderTag).assertIsDisplayed()
 
-        rule.onNodeWithTag("1")
-            .assertIsDisplayed()
+        rule.onNodeWithTag("1").assertIsDisplayed()
 
-        rule.onNodeWithTag("2")
-            .assertIsDisplayed()
+        rule.onNodeWithTag("2").assertIsDisplayed()
     }
 
     @Test
@@ -250,36 +202,24 @@
         rule.setContent {
             LazyRow(Modifier.width(300.dp), beyondBoundsItemCount = 0) {
                 stickyHeader {
-                    Spacer(
-                        Modifier.width(101.dp).fillParentMaxHeight()
-                            .testTag(firstHeaderTag)
-                    )
+                    Spacer(Modifier.width(101.dp).fillParentMaxHeight().testTag(firstHeaderTag))
                 }
 
-                items(items) {
-                    Spacer(Modifier.width(101.dp).fillParentMaxHeight().testTag(it))
-                }
+                items(items) { Spacer(Modifier.width(101.dp).fillParentMaxHeight().testTag(it)) }
 
                 stickyHeader {
-                    Spacer(
-                        Modifier.width(101.dp).fillParentMaxHeight()
-                            .testTag(secondHeaderTag)
-                    )
+                    Spacer(Modifier.width(101.dp).fillParentMaxHeight().testTag(secondHeaderTag))
                 }
             }
         }
 
-        rule.onNodeWithTag(firstHeaderTag)
-            .assertIsDisplayed()
+        rule.onNodeWithTag(firstHeaderTag).assertIsDisplayed()
 
-        rule.onNodeWithTag("1")
-            .assertIsDisplayed()
+        rule.onNodeWithTag("1").assertIsDisplayed()
 
-        rule.onNodeWithTag("2")
-            .assertIsDisplayed()
+        rule.onNodeWithTag("2").assertIsDisplayed()
 
-        rule.onNodeWithTag(secondHeaderTag)
-            .assertDoesNotExist()
+        rule.onNodeWithTag(secondHeaderTag).assertDoesNotExist()
     }
 
     @Test
@@ -291,36 +231,24 @@
         rule.setContent {
             LazyRow(Modifier.width(300.dp), beyondBoundsItemCount = 1) {
                 stickyHeader {
-                    Spacer(
-                        Modifier.width(101.dp).fillParentMaxHeight()
-                            .testTag(firstHeaderTag)
-                    )
+                    Spacer(Modifier.width(101.dp).fillParentMaxHeight().testTag(firstHeaderTag))
                 }
 
-                items(items) {
-                    Spacer(Modifier.width(101.dp).fillParentMaxHeight().testTag(it))
-                }
+                items(items) { Spacer(Modifier.width(101.dp).fillParentMaxHeight().testTag(it)) }
 
                 stickyHeader {
-                    Spacer(
-                        Modifier.width(101.dp).fillParentMaxHeight()
-                            .testTag(secondHeaderTag)
-                    )
+                    Spacer(Modifier.width(101.dp).fillParentMaxHeight().testTag(secondHeaderTag))
                 }
             }
         }
 
-        rule.onNodeWithTag(firstHeaderTag)
-            .assertIsDisplayed()
+        rule.onNodeWithTag(firstHeaderTag).assertIsDisplayed()
 
-        rule.onNodeWithTag("1")
-            .assertIsDisplayed()
+        rule.onNodeWithTag("1").assertIsDisplayed()
 
-        rule.onNodeWithTag("2")
-            .assertIsDisplayed()
+        rule.onNodeWithTag("2").assertIsDisplayed()
 
-        rule.onNodeWithTag(secondHeaderTag)
-            .assertExists()
+        rule.onNodeWithTag(secondHeaderTag).assertExists()
     }
 
     @Test
@@ -336,29 +264,21 @@
                 rememberLazyListState().also { state = it }
             ) {
                 stickyHeader {
-                    Spacer(
-                        Modifier.width(101.dp).fillParentMaxHeight()
-                            .testTag(firstHeaderTag)
-                    )
+                    Spacer(Modifier.width(101.dp).fillParentMaxHeight().testTag(firstHeaderTag))
                 }
 
-                items(items) {
-                    Spacer(Modifier.width(101.dp).fillParentMaxHeight().testTag(it))
-                }
+                items(items) { Spacer(Modifier.width(101.dp).fillParentMaxHeight().testTag(it)) }
 
                 stickyHeader {
-                    Spacer(
-                        Modifier.width(101.dp).fillParentMaxHeight()
-                            .testTag(secondHeaderTag)
-                    )
+                    Spacer(Modifier.width(101.dp).fillParentMaxHeight().testTag(secondHeaderTag))
                 }
             }
         }
 
-        rule.onNodeWithTag(LazyListTag)
-            .scrollBy(x = 102.dp, density = rule.density)
+        rule.onNodeWithTag(LazyListTag).scrollBy(x = 102.dp, density = rule.density)
 
-        rule.onNodeWithTag(firstHeaderTag)
+        rule
+            .onNodeWithTag(firstHeaderTag)
             .assertIsDisplayed()
             .assertLeftPositionInRootIsEqualTo(0.dp)
 
@@ -367,11 +287,9 @@
             assertEquals(0, state.layoutInfo.visibleItemsInfo.first().offset)
         }
 
-        rule.onNodeWithTag("2")
-            .assertIsDisplayed()
+        rule.onNodeWithTag("2").assertIsDisplayed()
 
-        rule.onNodeWithTag(secondHeaderTag)
-            .assertIsDisplayed()
+        rule.onNodeWithTag(secondHeaderTag).assertIsDisplayed()
     }
 
     @Test
@@ -383,39 +301,26 @@
         rule.setContentWithTestViewConfiguration {
             LazyRow(Modifier.width(300.dp).testTag(LazyListTag)) {
                 stickyHeader {
-                    Spacer(
-                        Modifier.width(101.dp).fillParentMaxHeight()
-                            .testTag(firstHeaderTag)
-                    )
+                    Spacer(Modifier.width(101.dp).fillParentMaxHeight().testTag(firstHeaderTag))
                 }
 
                 stickyHeader {
-                    Spacer(
-                        Modifier.width(101.dp).fillParentMaxHeight()
-                            .testTag(secondHeaderTag)
-                    )
+                    Spacer(Modifier.width(101.dp).fillParentMaxHeight().testTag(secondHeaderTag))
                 }
 
-                items(items) {
-                    Spacer(Modifier.width(101.dp).fillParentMaxHeight().testTag(it))
-                }
+                items(items) { Spacer(Modifier.width(101.dp).fillParentMaxHeight().testTag(it)) }
             }
         }
 
-        rule.onNodeWithTag(LazyListTag)
-            .scrollBy(x = 105.dp, density = rule.density)
+        rule.onNodeWithTag(LazyListTag).scrollBy(x = 105.dp, density = rule.density)
 
-        rule.onNodeWithTag(firstHeaderTag)
-            .assertIsNotDisplayed()
+        rule.onNodeWithTag(firstHeaderTag).assertIsNotDisplayed()
 
-        rule.onNodeWithTag(secondHeaderTag)
-            .assertIsDisplayed()
+        rule.onNodeWithTag(secondHeaderTag).assertIsDisplayed()
 
-        rule.onNodeWithTag("1")
-            .assertIsDisplayed()
+        rule.onNodeWithTag("1").assertIsDisplayed()
 
-        rule.onNodeWithTag("2")
-            .assertIsDisplayed()
+        rule.onNodeWithTag("2").assertIsDisplayed()
     }
 
     @Test
@@ -431,22 +336,15 @@
                 state = rememberLazyListState().also { state = it },
                 contentPadding = PaddingValues(top = itemIndexDp * 2)
             ) {
-                stickyHeader {
-                    Spacer(Modifier.requiredSize(itemIndexDp).testTag(headerTag))
-                }
+                stickyHeader { Spacer(Modifier.requiredSize(itemIndexDp).testTag(headerTag)) }
 
-                items((0..4).toList()) {
-                    Spacer(Modifier.requiredSize(itemIndexDp).testTag("$it"))
-                }
+                items((0..4).toList()) { Spacer(Modifier.requiredSize(itemIndexDp).testTag("$it")) }
             }
         }
 
-        rule.runOnIdle {
-            runBlocking { state.scrollToItem(1, itemIndexPx / 2) }
-        }
+        rule.runOnIdle { runBlocking { state.scrollToItem(1, itemIndexPx / 2) } }
 
-        rule.onNodeWithTag(headerTag)
-            .assertTopPositionInRootIsEqualTo(itemIndexDp / 2)
+        rule.onNodeWithTag(headerTag).assertTopPositionInRootIsEqualTo(itemIndexDp / 2)
 
         rule.runOnIdle {
             assertEquals(0, state.layoutInfo.visibleItemsInfo.first().index)
@@ -456,8 +354,7 @@
             )
         }
 
-        rule.onNodeWithTag("0")
-            .assertTopPositionInRootIsEqualTo(itemIndexDp * 3 / 2)
+        rule.onNodeWithTag("0").assertTopPositionInRootIsEqualTo(itemIndexDp * 3 / 2)
     }
 
     @Test
@@ -472,15 +369,11 @@
         rule.setContent {
             LazyColumn(Modifier.height(itemSizeDp * 3.5f), state) {
                 stickyHeader {
-                    Spacer(
-                        Modifier.height(itemSizeDp).fillParentMaxWidth()
-                            .testTag(firstHeaderTag)
-                    )
+                    Spacer(Modifier.height(itemSizeDp).fillParentMaxWidth().testTag(firstHeaderTag))
                 }
                 stickyHeader {
                     Spacer(
-                        Modifier.height(itemSizeDp).fillParentMaxWidth()
-                            .testTag(secondHeaderTag)
+                        Modifier.height(itemSizeDp).fillParentMaxWidth().testTag(secondHeaderTag)
                     )
                 }
 
@@ -490,16 +383,13 @@
             }
         }
 
-        rule.runOnIdle {
-            runBlocking { state.scrollBy(scrollDistance.toFloat()) }
-        }
+        rule.runOnIdle { runBlocking { state.scrollBy(scrollDistance.toFloat()) } }
 
-        rule.onNodeWithTag(firstHeaderTag)
-            .assertTopPositionInRootIsEqualTo(-scrollDistanceDp)
-        rule.onNodeWithTag(secondHeaderTag)
+        rule.onNodeWithTag(firstHeaderTag).assertTopPositionInRootIsEqualTo(-scrollDistanceDp)
+        rule
+            .onNodeWithTag(secondHeaderTag)
             .assertTopPositionInRootIsEqualTo(itemSizeDp - scrollDistanceDp)
-        rule.onNodeWithTag("0")
-            .assertTopPositionInRootIsEqualTo(itemSizeDp * 2 - scrollDistanceDp)
+        rule.onNodeWithTag("0").assertTopPositionInRootIsEqualTo(itemSizeDp * 2 - scrollDistanceDp)
     }
 }
 
diff --git a/compose/foundation/foundation/integration-tests/lazy-tests/src/androidTest/kotlin/androidx/compose/foundation/lazy/list/LazyListItemAppearanceAnimationTest.kt b/compose/foundation/foundation/integration-tests/lazy-tests/src/androidTest/kotlin/androidx/compose/foundation/lazy/list/LazyListItemAppearanceAnimationTest.kt
index 03845b8..3dc7c6d 100644
--- a/compose/foundation/foundation/integration-tests/lazy-tests/src/androidTest/kotlin/androidx/compose/foundation/lazy/list/LazyListItemAppearanceAnimationTest.kt
+++ b/compose/foundation/foundation/integration-tests/lazy-tests/src/androidTest/kotlin/androidx/compose/foundation/lazy/list/LazyListItemAppearanceAnimationTest.kt
@@ -64,8 +64,7 @@
 @SdkSuppress(minSdkVersion = Build.VERSION_CODES.O)
 class LazyListItemAppearanceAnimationTest {
 
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
     private val itemSize: Int = 4
     private var itemSizeDp: Dp = Dp.Infinity
@@ -89,21 +88,13 @@
     fun oneItemAdded() {
         var list by mutableStateOf(emptyList<Color>())
         rule.setContent {
-            LazyList(containerSize = itemSizeDp) {
-                items(list, key = { it.toArgb() }) {
-                    Item(it)
-                }
-            }
+            LazyList(containerSize = itemSizeDp) { items(list, key = { it.toArgb() }) { Item(it) } }
         }
 
-        rule.runOnUiThread {
-            list = listOf(Color.Black)
-        }
+        rule.runOnUiThread { list = listOf(Color.Black) }
 
         onAnimationFrame { fraction ->
-            assertPixels(mainAxisSize = itemSize) {
-                Color.Black.copy(alpha = fraction)
-            }
+            assertPixels(mainAxisSize = itemSize) { Color.Black.copy(alpha = fraction) }
         }
     }
 
@@ -111,15 +102,11 @@
     fun noAnimationForInitialList() {
         rule.setContent {
             LazyList(containerSize = itemSizeDp) {
-                items(listOf(Color.Black), key = { it.toArgb() }) {
-                    Item(it)
-                }
+                items(listOf(Color.Black), key = { it.toArgb() }) { Item(it) }
             }
         }
 
-        assertPixels(itemSize) {
-            Color.Black
-        }
+        assertPixels(itemSize) { Color.Black }
     }
 
     @Test
@@ -127,15 +114,11 @@
         var list by mutableStateOf(listOf(Color.Black))
         rule.setContent {
             LazyList(containerSize = itemSizeDp * 3) {
-                items(list, key = { it.toArgb() }) {
-                    Item(it)
-                }
+                items(list, key = { it.toArgb() }) { Item(it) }
             }
         }
 
-        rule.runOnUiThread {
-            list = listOf(Color.Black, Color.Red, Color.Green)
-        }
+        rule.runOnUiThread { list = listOf(Color.Black, Color.Red, Color.Green) }
 
         onAnimationFrame { fraction ->
             assertPixels(itemSize * 3) { offset ->
@@ -159,9 +142,7 @@
             }
         }
 
-        rule.runOnUiThread {
-            list = listOf(Color.Black, Color.Red)
-        }
+        rule.runOnUiThread { list = listOf(Color.Black, Color.Red) }
 
         onAnimationFrame { fraction ->
             assertPixels(itemSize * 2) { offset ->
@@ -178,9 +159,7 @@
         var list by mutableStateOf(listOf(Color.Black, Color.Red, Color.Green))
         rule.setContent {
             LazyList(containerSize = itemSizeDp * 2) {
-                items(list, key = { it.toArgb() }) {
-                    Item(it)
-                }
+                items(list, key = { it.toArgb() }) { Item(it) }
             }
         }
 
@@ -211,49 +190,31 @@
     fun animatedItemChangesTheContainerSize() {
         var list by mutableStateOf(listOf(Color.Black))
         rule.setContent {
-            LazyList(containerSize = null) {
-                items(list, key = { it.toArgb() }) {
-                    Item(it)
-                }
-            }
+            LazyList(containerSize = null) { items(list, key = { it.toArgb() }) { Item(it) } }
         }
 
-        rule.onNodeWithTag(ContainerTag)
-            .assertHeightIsEqualTo(itemSizeDp)
+        rule.onNodeWithTag(ContainerTag).assertHeightIsEqualTo(itemSizeDp)
 
-        rule.runOnUiThread {
-            list = listOf(Color.Black, Color.Red)
-        }
+        rule.runOnUiThread { list = listOf(Color.Black, Color.Red) }
 
-        onAnimationFrame {
-            rule.onNodeWithTag(ContainerTag)
-                .assertHeightIsEqualTo(itemSizeDp * 2)
-        }
+        onAnimationFrame { rule.onNodeWithTag(ContainerTag).assertHeightIsEqualTo(itemSizeDp * 2) }
     }
 
     @Test
     fun removeItemBeingAnimated() {
         var list by mutableStateOf(emptyList<Color>())
         rule.setContent {
-            LazyList(containerSize = itemSizeDp) {
-                items(list, key = { it.toArgb() }) {
-                    Item(it)
-                }
-            }
+            LazyList(containerSize = itemSizeDp) { items(list, key = { it.toArgb() }) { Item(it) } }
         }
 
-        rule.runOnUiThread {
-            list = listOf(Color.Black)
-        }
+        rule.runOnUiThread { list = listOf(Color.Black) }
 
         onAnimationFrame { fraction ->
             if (fraction < 0.5f) {
                 assertPixels(itemSize) { Color.Black.copy(alpha = fraction) }
             } else {
                 if (fraction.isCloseTo(0.5f)) {
-                    rule.runOnUiThread {
-                        list = emptyList()
-                    }
+                    rule.runOnUiThread { list = emptyList() }
                 }
                 assertPixels(itemSize) { Color.Transparent }
             }
@@ -265,9 +226,7 @@
         var list by mutableStateOf(listOf(Color.Black, Color.Green, Color.Blue, Color.Yellow))
         rule.setContent {
             LazyList(containerSize = itemSizeDp * 2) {
-                items(list, key = { it.toArgb() }) {
-                    Item(it)
-                }
+                items(list, key = { it.toArgb() }) { Item(it) }
             }
         }
 
@@ -299,11 +258,7 @@
                 }
             } else {
                 if (fraction.isCloseTo(0.75f)) {
-                    rule.runOnUiThread {
-                        runBlocking {
-                            state.scrollBy(-itemSize * 1.5f)
-                        }
-                    }
+                    rule.runOnUiThread { runBlocking { state.scrollBy(-itemSize * 1.5f) } }
                 }
                 assertPixels(itemSize * 2) { offset ->
                     // red item is not displayed anywhere
@@ -319,20 +274,13 @@
 
     @Test
     fun itemOutsideOfViewPortBeingAnimatedIn_shouldBePlacedAtTheEndOfList() {
-        var list by mutableStateOf(
-            listOf(
-                Color.Black,
-                Color.Green,
-                Color.Blue,
-                Color.Yellow,
-                Color.DarkGray
+        var list by
+            mutableStateOf(
+                listOf(Color.Black, Color.Green, Color.Blue, Color.Yellow, Color.DarkGray)
             )
-        )
         rule.setContent {
             LazyList(containerSize = itemSizeDp * 2.5f) {
-                items(list, key = { it.toArgb() }) {
-                    Item(it)
-                }
+                items(list, key = { it.toArgb() }) { Item(it) }
             }
         }
 
@@ -362,11 +310,11 @@
         crossAxisSize: Int = this.crossAxisSize,
         expectedColorProvider: (offset: Int) -> Color?
     ) {
-        rule.onNodeWithTag(ContainerTag)
-            .captureToImage()
-            .assertPixels(IntSize(crossAxisSize, mainAxisSize)) {
-                expectedColorProvider(it.y)?.compositeOver(Color.White)
-            }
+        rule.onNodeWithTag(ContainerTag).captureToImage().assertPixels(
+            IntSize(crossAxisSize, mainAxisSize)
+        ) {
+            expectedColorProvider(it.y)?.compositeOver(Color.White)
+        }
     }
 
     private fun onAnimationFrame(duration: Long = Duration, onFrame: (fraction: Float) -> Unit) {
@@ -396,23 +344,23 @@
 
         LazyColumn(
             state = state,
-            modifier = Modifier
-                .then(
-                    if (containerSize != null) {
-                        Modifier.requiredHeight(containerSize)
-                    } else {
-                        Modifier
-                    }
-                )
-                .background(Color.White)
-                .then(
-                    if (crossAxisSize != Dp.Unspecified) {
-                        Modifier.requiredWidth(crossAxisSize)
-                    } else {
-                        Modifier.fillMaxWidth()
-                    }
-                )
-                .testTag(ContainerTag),
+            modifier =
+                Modifier.then(
+                        if (containerSize != null) {
+                            Modifier.requiredHeight(containerSize)
+                        } else {
+                            Modifier
+                        }
+                    )
+                    .background(Color.White)
+                    .then(
+                        if (crossAxisSize != Dp.Unspecified) {
+                            Modifier.requiredWidth(crossAxisSize)
+                        } else {
+                            Modifier.fillMaxWidth()
+                        }
+                    )
+                    .testTag(ContainerTag),
             content = content
         )
     }
@@ -425,12 +373,7 @@
         animSpec: FiniteAnimationSpec<Float>? = AnimSpec
     ) {
         Box(
-            Modifier
-                .animateItem(
-                    fadeInSpec = animSpec,
-                    placementSpec = null,
-                    fadeOutSpec = null
-                )
+            Modifier.animateItem(fadeInSpec = animSpec, placementSpec = null, fadeOutSpec = null)
                 .background(color)
                 .requiredHeight(size)
                 .requiredWidth(crossAxisSize)
diff --git a/compose/foundation/foundation/integration-tests/lazy-tests/src/androidTest/kotlin/androidx/compose/foundation/lazy/list/LazyListItemDisappearanceAnimationTest.kt b/compose/foundation/foundation/integration-tests/lazy-tests/src/androidTest/kotlin/androidx/compose/foundation/lazy/list/LazyListItemDisappearanceAnimationTest.kt
index 61ea124..36548b4 100644
--- a/compose/foundation/foundation/integration-tests/lazy-tests/src/androidTest/kotlin/androidx/compose/foundation/lazy/list/LazyListItemDisappearanceAnimationTest.kt
+++ b/compose/foundation/foundation/integration-tests/lazy-tests/src/androidTest/kotlin/androidx/compose/foundation/lazy/list/LazyListItemDisappearanceAnimationTest.kt
@@ -65,8 +65,7 @@
 @SdkSuppress(minSdkVersion = Build.VERSION_CODES.O)
 class LazyListItemDisappearanceAnimationTest {
 
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
     // the numbers should be divisible by 8 to avoid the rounding issues as we run 4 or 8 frames
     // of the animation.
@@ -92,21 +91,13 @@
     fun oneItemRemoved() {
         var list by mutableStateOf(listOf(Color.Black))
         rule.setContent {
-            LazyList(containerSize = itemSizeDp) {
-                items(list, key = { it.toArgb() }) {
-                    Item(it)
-                }
-            }
+            LazyList(containerSize = itemSizeDp) { items(list, key = { it.toArgb() }) { Item(it) } }
         }
 
-        rule.runOnUiThread {
-            list = emptyList()
-        }
+        rule.runOnUiThread { list = emptyList() }
 
         onAnimationFrame { fraction ->
-            assertPixels(mainAxisSize = itemSize) {
-                Color.Black.copy(alpha = 1f - fraction)
-            }
+            assertPixels(mainAxisSize = itemSize) { Color.Black.copy(alpha = 1f - fraction) }
         }
     }
 
@@ -115,15 +106,11 @@
         var list by mutableStateOf(listOf(Color.Black, Color.Red, Color.Green))
         rule.setContent {
             LazyList(containerSize = itemSizeDp * 3) {
-                items(list, key = { it.toArgb() }) {
-                    Item(it)
-                }
+                items(list, key = { it.toArgb() }) { Item(it) }
             }
         }
 
-        rule.runOnUiThread {
-            list = listOf(Color.Black)
-        }
+        rule.runOnUiThread { list = listOf(Color.Black) }
 
         onAnimationFrame { fraction ->
             assertPixels(itemSize * 3) { offset ->
@@ -142,15 +129,11 @@
         var list by mutableStateOf(listOf(Color.Black, Color.Red, Color.Green))
         rule.setContent {
             LazyList(containerSize = itemSizeDp * 3, reverseLayout = true) {
-                items(list, key = { it.toArgb() }) {
-                    Item(it)
-                }
+                items(list, key = { it.toArgb() }) { Item(it) }
             }
         }
 
-        rule.runOnUiThread {
-            list = listOf(Color.Black)
-        }
+        rule.runOnUiThread { list = listOf(Color.Black) }
 
         onAnimationFrame { fraction ->
             assertPixels(itemSize * 3) { offset ->
@@ -172,15 +155,11 @@
                 reverseLayout = true,
                 contentPadding = PaddingValues(bottom = itemSizeDp)
             ) {
-                items(list, key = { it.toArgb() }) {
-                    Item(it)
-                }
+                items(list, key = { it.toArgb() }) { Item(it) }
             }
         }
 
-        rule.runOnUiThread {
-            list = listOf(Color.Black)
-        }
+        rule.runOnUiThread { list = listOf(Color.Black) }
 
         onAnimationFrame { fraction ->
             assertPixels(itemSize * 3) { offset ->
@@ -204,9 +183,7 @@
             }
         }
 
-        rule.runOnUiThread {
-            list = emptyList()
-        }
+        rule.runOnUiThread { list = emptyList() }
 
         onAnimationFrame { fraction ->
             assertPixels(itemSize * 2) { offset ->
@@ -223,9 +200,7 @@
         var list by mutableStateOf(listOf(Color.Black, Color.Red, Color.Blue, Color.Green))
         rule.setContent {
             LazyList(containerSize = itemSizeDp * 2) {
-                items(list, key = { it.toArgb() }) {
-                    Item(it)
-                }
+                items(list, key = { it.toArgb() }) { Item(it) }
             }
         }
 
@@ -256,23 +231,15 @@
     fun itemsBeingRemovedAreAffectingTheContainerSizeForTheDurationOfAnimation() {
         var list by mutableStateOf(listOf(Color.Black, Color.Red))
         rule.setContent {
-            LazyList(containerSize = null) {
-                items(list, key = { it.toArgb() }) {
-                    Item(it)
-                }
-            }
+            LazyList(containerSize = null) { items(list, key = { it.toArgb() }) { Item(it) } }
         }
 
-        rule.onNodeWithTag(ContainerTag)
-            .assertHeightIsEqualTo(itemSizeDp * 2)
+        rule.onNodeWithTag(ContainerTag).assertHeightIsEqualTo(itemSizeDp * 2)
 
-        rule.runOnUiThread {
-            list = listOf(Color.Black)
-        }
+        rule.runOnUiThread { list = listOf(Color.Black) }
 
         onAnimationFrame { fraction ->
-            val heightDp = rule.onNodeWithTag(ContainerTag)
-                .getBoundsInRoot().height
+            val heightDp = rule.onNodeWithTag(ContainerTag).getBoundsInRoot().height
             val heightPx = with(rule.density) { heightDp.roundToPx() }
             assertWithMessage("Height on fraction=$fraction")
                 .that(heightPx)
@@ -296,14 +263,11 @@
         var list by mutableStateOf(listOf(Color.Black, Color.Red))
         rule.setContent {
             LazyList(containerSize = null, reverseLayout = true) {
-                items(list, key = { it.toArgb() }) {
-                    Item(it)
-                }
+                items(list, key = { it.toArgb() }) { Item(it) }
             }
         }
 
-        rule.onNodeWithTag(ContainerTag)
-            .assertHeightIsEqualTo(itemSizeDp * 2)
+        rule.onNodeWithTag(ContainerTag).assertHeightIsEqualTo(itemSizeDp * 2)
 
         assertPixels(itemSize * 2) { offset ->
             when (offset) {
@@ -312,13 +276,10 @@
             }
         }
 
-        rule.runOnUiThread {
-            list = listOf(Color.Black)
-        }
+        rule.runOnUiThread { list = listOf(Color.Black) }
 
         onAnimationFrame { fraction ->
-            val heightDp = rule.onNodeWithTag(ContainerTag)
-                .getBoundsInRoot().height
+            val heightDp = rule.onNodeWithTag(ContainerTag).getBoundsInRoot().height
             val heightPx = with(rule.density) { heightDp.roundToPx() }
             assertWithMessage("Height on fraction=$fraction")
                 .that(heightPx)
@@ -341,25 +302,17 @@
     fun reAddItemBeingAnimated_withoutAppearanceAnimation() {
         var list by mutableStateOf(listOf(Color.Black))
         rule.setContent {
-            LazyList(containerSize = itemSizeDp) {
-                items(list, key = { it.toArgb() }) {
-                    Item(it)
-                }
-            }
+            LazyList(containerSize = itemSizeDp) { items(list, key = { it.toArgb() }) { Item(it) } }
         }
 
-        rule.runOnUiThread {
-            list = emptyList()
-        }
+        rule.runOnUiThread { list = emptyList() }
 
         onAnimationFrame { fraction ->
             if (fraction < 0.5f) {
                 assertPixels(itemSize) { Color.Black.copy(alpha = 1f - fraction) }
             } else {
                 if (fraction.isCloseTo(0.5f)) {
-                    rule.runOnUiThread {
-                        list = listOf(Color.Black)
-                    }
+                    rule.runOnUiThread { list = listOf(Color.Black) }
                 }
                 assertPixels(itemSize) { Color.Black }
             }
@@ -377,22 +330,16 @@
             }
         }
 
-        rule.runOnUiThread {
-            list = emptyList()
-        }
+        rule.runOnUiThread { list = emptyList() }
 
         onAnimationFrame { fraction ->
             if (fraction < 0.5f) {
                 assertPixels(itemSize) { Color.Black.copy(alpha = 1f - fraction) }
             } else {
                 if (fraction.isCloseTo(0.5f)) {
-                    rule.runOnUiThread {
-                        list = listOf(Color.Black)
-                    }
+                    rule.runOnUiThread { list = listOf(Color.Black) }
                 }
-                assertPixels(itemSize) {
-                    Color.Black.copy(alpha = fraction)
-                }
+                assertPixels(itemSize) { Color.Black.copy(alpha = fraction) }
             }
         }
     }
@@ -408,22 +355,16 @@
             }
         }
 
-        rule.runOnUiThread {
-            list = listOf(Color.Black)
-        }
+        rule.runOnUiThread { list = listOf(Color.Black) }
 
         onAnimationFrame { fraction ->
             if (fraction < 0.5f) {
                 assertPixels(itemSize) { Color.Black.copy(alpha = fraction) }
             } else {
                 if (fraction.isCloseTo(0.5f)) {
-                    rule.runOnUiThread {
-                        list = emptyList()
-                    }
+                    rule.runOnUiThread { list = emptyList() }
                 }
-                assertPixels(itemSize) {
-                    Color.Black.copy(alpha = 1f - fraction)
-                }
+                assertPixels(itemSize) { Color.Black.copy(alpha = 1f - fraction) }
             }
         }
     }
@@ -433,11 +374,11 @@
         crossAxisSize: Int = this.crossAxisSize,
         expectedColorProvider: (offset: Int) -> Color?
     ) {
-        rule.onNodeWithTag(ContainerTag)
-            .captureToImage()
-            .assertPixels(IntSize(crossAxisSize, mainAxisSize)) {
-                expectedColorProvider(it.y)?.compositeOver(Color.White)
-            }
+        rule.onNodeWithTag(ContainerTag).captureToImage().assertPixels(
+            IntSize(crossAxisSize, mainAxisSize)
+        ) {
+            expectedColorProvider(it.y)?.compositeOver(Color.White)
+        }
     }
 
     private fun onAnimationFrame(duration: Long = Duration, onFrame: (fraction: Float) -> Unit) {
@@ -469,23 +410,23 @@
 
         LazyColumn(
             state = state,
-            modifier = Modifier
-                .then(
-                    if (containerSize != null) {
-                        Modifier.requiredHeight(containerSize)
-                    } else {
-                        Modifier
-                    }
-                )
-                .background(Color.White)
-                .then(
-                    if (crossAxisSize != Dp.Unspecified) {
-                        Modifier.requiredWidth(crossAxisSize)
-                    } else {
-                        Modifier.fillMaxWidth()
-                    }
-                )
-                .testTag(ContainerTag),
+            modifier =
+                Modifier.then(
+                        if (containerSize != null) {
+                            Modifier.requiredHeight(containerSize)
+                        } else {
+                            Modifier
+                        }
+                    )
+                    .background(Color.White)
+                    .then(
+                        if (crossAxisSize != Dp.Unspecified) {
+                            Modifier.requiredWidth(crossAxisSize)
+                        } else {
+                            Modifier.fillMaxWidth()
+                        }
+                    )
+                    .testTag(ContainerTag),
             contentPadding = contentPadding,
             reverseLayout = reverseLayout,
             content = content
@@ -501,8 +442,7 @@
         appearanceSpec: FiniteAnimationSpec<Float>? = null
     ) {
         Box(
-            Modifier
-                .animateItem(
+            Modifier.animateItem(
                     fadeInSpec = appearanceSpec,
                     placementSpec = null,
                     fadeOutSpec = disappearanceSpec
diff --git a/compose/foundation/foundation/integration-tests/lazy-tests/src/androidTest/kotlin/androidx/compose/foundation/lazy/list/LazyListItemPlacementAnimationTest.kt b/compose/foundation/foundation/integration-tests/lazy-tests/src/androidTest/kotlin/androidx/compose/foundation/lazy/list/LazyListItemPlacementAnimationTest.kt
index 4742047..ca60373 100644
--- a/compose/foundation/foundation/integration-tests/lazy-tests/src/androidTest/kotlin/androidx/compose/foundation/lazy/list/LazyListItemPlacementAnimationTest.kt
+++ b/compose/foundation/foundation/integration-tests/lazy-tests/src/androidTest/kotlin/androidx/compose/foundation/lazy/list/LazyListItemPlacementAnimationTest.kt
@@ -86,12 +86,16 @@
 @RunWith(Parameterized::class)
 class LazyListAnimateItemPlacementTest(private val config: Config) {
 
-    private val isVertical: Boolean get() = config.isVertical
-    private val reverseLayout: Boolean get() = config.reverseLayout
-    private val isInLookaheadScope: Boolean get() = config.isInLookaheadScope
+    private val isVertical: Boolean
+        get() = config.isVertical
 
-    @get:Rule
-    val rule = createComposeRule()
+    private val reverseLayout: Boolean
+        get() = config.reverseLayout
+
+    private val isInLookaheadScope: Boolean
+        get() = config.isInLookaheadScope
+
+    @get:Rule val rule = createComposeRule()
 
     // the numbers should be divisible by 8 to avoid the rounding issues as we run 4 or 8 frames
     // of the animation.
@@ -125,19 +129,11 @@
     @Test
     fun reorderTwoItems() {
         var list by mutableStateOf(listOf(0, 1))
-        rule.setContent {
-            LazyList {
-                items(list, key = { it }) {
-                    Item(it)
-                }
-            }
-        }
+        rule.setContent { LazyList { items(list, key = { it }) { Item(it) } } }
 
         assertPositions(0 to 0f, 1 to itemSize)
 
-        rule.runOnUiThread {
-            list = listOf(1, 0)
-        }
+        rule.runOnUiThread { list = listOf(1, 0) }
 
         onAnimationFrame { fraction ->
             assertPositions(
@@ -151,19 +147,11 @@
     @Test
     fun reorderTwoItems_layoutInfoHasFinalPositions() {
         var list by mutableStateOf(listOf(0, 1))
-        rule.setContent {
-            LazyList {
-                items(list, key = { it }) {
-                    Item(it)
-                }
-            }
-        }
+        rule.setContent { LazyList { items(list, key = { it }) { Item(it) } } }
 
         assertLayoutInfoPositions(0 to 0f, 1 to itemSize)
 
-        rule.runOnUiThread {
-            list = listOf(1, 0)
-        }
+        rule.runOnUiThread { list = listOf(1, 0) }
 
         onAnimationFrame {
             // fraction doesn't affect the offsets in layout info
@@ -174,13 +162,7 @@
     @Test
     fun reorderFirstAndLastItems() {
         var list by mutableStateOf(listOf(0, 1, 2, 3, 4))
-        rule.setContent {
-            LazyList {
-                items(list, key = { it }) {
-                    Item(it)
-                }
-            }
-        }
+        rule.setContent { LazyList { items(list, key = { it }) { Item(it) } } }
 
         assertPositions(
             0 to 0f,
@@ -190,9 +172,7 @@
             4 to itemSize * 4,
         )
 
-        rule.runOnUiThread {
-            list = listOf(4, 1, 2, 3, 0)
-        }
+        rule.runOnUiThread { list = listOf(4, 1, 2, 3, 0) }
 
         onAnimationFrame { fraction ->
             assertPositions(
@@ -209,13 +189,7 @@
     @Test
     fun moveFirstItemToEndCausingAllItemsToAnimate() {
         var list by mutableStateOf(listOf(0, 1, 2, 3, 4))
-        rule.setContent {
-            LazyList {
-                items(list, key = { it }) {
-                    Item(it)
-                }
-            }
-        }
+        rule.setContent { LazyList { items(list, key = { it }) { Item(it) } } }
 
         assertPositions(
             0 to 0f,
@@ -225,9 +199,7 @@
             4 to itemSize * 4,
         )
 
-        rule.runOnUiThread {
-            list = listOf(1, 2, 3, 4, 0)
-        }
+        rule.runOnUiThread { list = listOf(1, 2, 3, 4, 0) }
 
         onAnimationFrame { fraction ->
             assertPositions(
@@ -245,23 +217,17 @@
     fun itemSizeChangeAnimatesNextItems() {
         var size by mutableStateOf(itemSizeDp)
         rule.setContent {
-            LazyList(
-                minSize = itemSizeDp * 5,
-                maxSize = itemSizeDp * 5
-            ) {
+            LazyList(minSize = itemSizeDp * 5, maxSize = itemSizeDp * 5) {
                 items(listOf(0, 1, 2, 3), key = { it }) {
                     Item(it, size = if (it == 1) size else itemSizeDp)
                 }
             }
         }
 
-        rule.runOnUiThread {
-            size = itemSizeDp * 2
-        }
+        rule.runOnUiThread { size = itemSizeDp * 2 }
         rule.mainClock.advanceTimeByFrame()
 
-        rule.onNodeWithTag("1")
-            .assertMainAxisSizeIsEqualTo(size)
+        rule.onNodeWithTag("1").assertMainAxisSizeIsEqualTo(size)
 
         onAnimationFrame { fraction ->
             assertPositions(
@@ -285,9 +251,7 @@
             }
         }
 
-        rule.runOnUiThread {
-            list = listOf(1, 2, 3, 4, 0)
-        }
+        rule.runOnUiThread { list = listOf(1, 2, 3, 4, 0) }
 
         onAnimationFrame { fraction ->
             assertPositions(
@@ -313,9 +277,7 @@
             }
         }
 
-        rule.runOnUiThread {
-            list = listOf(1, 2, 3, 4, 0)
-        }
+        rule.runOnUiThread { list = listOf(1, 2, 3, 4, 0) }
 
         onAnimationFrame(duration = Duration * 2) { fraction ->
             val shorterAnimFraction = (fraction * 2).coerceAtMost(1f)
@@ -349,9 +311,7 @@
             3 to itemSize * 3,
         )
 
-        rule.runOnUiThread {
-            list = listOf(2, 0)
-        }
+        rule.runOnUiThread { list = listOf(2, 0) }
 
         onAnimationFrame { fraction ->
             assertPositions(
@@ -376,9 +336,7 @@
             }
         }
 
-        rule.runOnUiThread {
-            list = listOf(2, 0)
-        }
+        rule.runOnUiThread { list = listOf(2, 0) }
 
         onAnimationFrame { fraction ->
             assertPositions(
@@ -400,9 +358,7 @@
                 minSize = itemSizeDp * 5,
                 maxSize = itemSizeDp * 5
             ) {
-                items(listOf(1, 2, 3), key = { it }) {
-                    Item(it)
-                }
+                items(listOf(1, 2, 3), key = { it }) { Item(it) }
             }
         }
 
@@ -412,9 +368,7 @@
             3 to itemSize * 3,
         )
 
-        rule.runOnUiThread {
-            arrangement = Arrangement.SpaceBetween
-        }
+        rule.runOnUiThread { arrangement = Arrangement.SpaceBetween }
         rule.mainClock.advanceTimeByFrame()
 
         onAnimationFrame { fraction ->
@@ -433,45 +387,33 @@
         val listSize = itemSize * 3
         val listSizeDp = with(rule.density) { listSize.toDp() }
         rule.setContent {
-            LazyList(maxSize = listSizeDp) {
-                items(list, key = { it }) {
-                    Item(it)
-                }
-            }
+            LazyList(maxSize = listSizeDp) { items(list, key = { it }) { Item(it) } }
         }
 
-        assertPositions(
-            0 to 0f,
-            1 to itemSize,
-            2 to itemSize * 2
-        )
+        assertPositions(0 to 0f, 1 to itemSize, 2 to itemSize * 2)
 
-        rule.runOnUiThread {
-            list = listOf(0, 4, 2, 3, 1, 5)
-        }
+        rule.runOnUiThread { list = listOf(0, 4, 2, 3, 1, 5) }
 
         onAnimationFrame { fraction ->
             // item 1 moves to and item 4 moves from `listSize`, right after the end edge
             val item1Offset = itemSize + (listSize - itemSize) * fraction
             val item4Offset = listSize - (listSize - itemSize) * fraction
-            val expected = mutableListOf<Pair<Any, Float>>().apply {
-                add(0 to 0f)
-                if (item1Offset < itemSize * 3) {
-                    add(1 to item1Offset)
-                } else {
-                    rule.onNodeWithTag("1").assertIsNotDisplayed()
+            val expected =
+                mutableListOf<Pair<Any, Float>>().apply {
+                    add(0 to 0f)
+                    if (item1Offset < itemSize * 3) {
+                        add(1 to item1Offset)
+                    } else {
+                        rule.onNodeWithTag("1").assertIsNotDisplayed()
+                    }
+                    add(2 to itemSize * 2)
+                    if (item4Offset < itemSize * 3) {
+                        add(4 to item4Offset)
+                    } else {
+                        rule.onNodeWithTag("4").assertIsNotDisplayed()
+                    }
                 }
-                add(2 to itemSize * 2)
-                if (item4Offset < itemSize * 3) {
-                    add(4 to item4Offset)
-                } else {
-                    rule.onNodeWithTag("4").assertIsNotDisplayed()
-                }
-            }
-            assertPositions(
-                expected = expected.toTypedArray(),
-                fraction = fraction
-            )
+            assertPositions(expected = expected.toTypedArray(), fraction = fraction)
         }
     }
 
@@ -480,44 +422,34 @@
         var list by mutableStateOf(listOf(0, 1, 2, 3, 4, 5))
         rule.setContent {
             LazyList(maxSize = itemSizeDp * 3f, startIndex = 3) {
-                items(list, key = { it }) {
-                    Item(it)
-                }
+                items(list, key = { it }) { Item(it) }
             }
         }
 
-        assertPositions(
-            3 to 0f,
-            4 to itemSize,
-            5 to itemSize * 2
-        )
+        assertPositions(3 to 0f, 4 to itemSize, 5 to itemSize * 2)
 
-        rule.runOnUiThread {
-            list = listOf(2, 4, 0, 3, 1, 5)
-        }
+        rule.runOnUiThread { list = listOf(2, 4, 0, 3, 1, 5) }
 
         onAnimationFrame { fraction ->
             // item 1 moves from and item 4 moves to `0 - itemSize`, right before the start edge
             val item1Offset = -itemSize + itemSize * 2 * fraction
             val item4Offset = itemSize - itemSize * 2 * fraction
-            val expected = mutableListOf<Pair<Any, Float>>().apply {
-                if (item4Offset > -itemSize) {
-                    add(4 to item4Offset)
-                } else {
-                    rule.onNodeWithTag("4").assertIsNotDisplayed()
+            val expected =
+                mutableListOf<Pair<Any, Float>>().apply {
+                    if (item4Offset > -itemSize) {
+                        add(4 to item4Offset)
+                    } else {
+                        rule.onNodeWithTag("4").assertIsNotDisplayed()
+                    }
+                    add(3 to 0f)
+                    if (item1Offset > -itemSize) {
+                        add(1 to item1Offset)
+                    } else {
+                        rule.onNodeWithTag("1").assertIsNotDisplayed()
+                    }
+                    add(5 to itemSize * 2)
                 }
-                add(3 to 0f)
-                if (item1Offset > -itemSize) {
-                    add(1 to item1Offset)
-                } else {
-                    rule.onNodeWithTag("1").assertIsNotDisplayed()
-                }
-                add(5 to itemSize * 2)
-            }
-            assertPositions(
-                expected = expected.toTypedArray(),
-                fraction = fraction
-            )
+            assertPositions(expected = expected.toTypedArray(), fraction = fraction)
         }
     }
 
@@ -530,42 +462,33 @@
                 // the existence of this header shouldn't affect the animation aside from
                 // the fact that we need to adjust startIndex because of it`s existence.
                 stickyHeader {}
-                items(list, key = { it }) {
-                    Item(it)
-                }
+                items(list, key = { it }) { Item(it) }
             }
         }
 
-        assertPositions(
-            3 to 0f,
-            4 to itemSize
-        )
+        assertPositions(3 to 0f, 4 to itemSize)
 
-        rule.runOnUiThread {
-            list = listOf(2, 4, 0, 3, 1)
-        }
+        rule.runOnUiThread { list = listOf(2, 4, 0, 3, 1) }
 
         onAnimationFrame { fraction ->
             // item 1 moves from and item 4 moves to `0 - itemSize`, right before the start edge
             val item1Offset = -itemSize + itemSize * 2 * fraction
             val item4Offset = itemSize - itemSize * 2 * fraction
-            val expected = mutableListOf<Pair<Any, Float>>().apply {
-                if (item4Offset > -itemSize) {
-                    add(4 to item4Offset)
-                } else {
-                    rule.onNodeWithTag("4").assertIsNotDisplayed()
+            val expected =
+                mutableListOf<Pair<Any, Float>>().apply {
+                    if (item4Offset > -itemSize) {
+                        add(4 to item4Offset)
+                    } else {
+                        rule.onNodeWithTag("4").assertIsNotDisplayed()
+                    }
+                    add(3 to 0f)
+                    if (item1Offset > -itemSize) {
+                        add(1 to item1Offset)
+                    } else {
+                        rule.onNodeWithTag("1").assertIsNotDisplayed()
+                    }
                 }
-                add(3 to 0f)
-                if (item1Offset > -itemSize) {
-                    add(1 to item1Offset)
-                } else {
-                    rule.onNodeWithTag("1").assertIsNotDisplayed()
-                }
-            }
-            assertPositions(
-                expected = expected.toTypedArray(),
-                fraction = fraction
-            )
+            assertPositions(expected = expected.toTypedArray(), fraction = fraction)
         }
     }
 
@@ -574,15 +497,11 @@
         var list by mutableStateOf(listOf(0, 1, 2, 3))
         rule.setContent {
             LazyList(arrangement = Arrangement.spacedBy(spacingDp)) {
-                items(list, key = { it }) {
-                    Item(it)
-                }
+                items(list, key = { it }) { Item(it) }
             }
         }
 
-        rule.runOnUiThread {
-            list = listOf(1, 2, 3, 0)
-        }
+        rule.runOnUiThread { list = listOf(1, 2, 3, 0) }
 
         onAnimationFrame { fraction ->
             assertPositions(
@@ -601,10 +520,7 @@
         val listSize = itemSize * 3
         val listSizeDp = with(rule.density) { listSize.toDp() }
         rule.setContent {
-            LazyList(
-                maxSize = listSizeDp,
-                startIndex = 3
-            ) {
+            LazyList(maxSize = listSizeDp, startIndex = 3) {
                 items(list, key = { it }) {
                     Item(it)
                     if (it != list.last()) {
@@ -614,25 +530,15 @@
             }
         }
 
-        assertPositions(
-            3 to 0f,
-            4 to itemSize,
-            5 to itemSize * 2
-        )
+        assertPositions(3 to 0f, 4 to itemSize, 5 to itemSize * 2)
 
         // move item 5 out of bounds
-        rule.runOnUiThread {
-            list = listOf(5, 0, 1, 2, 3, 4)
-        }
+        rule.runOnUiThread { list = listOf(5, 0, 1, 2, 3, 4) }
 
         // should not crash
         onAnimationFrame { fraction ->
             if (fraction == 1.0f) {
-                assertPositions(
-                    2 to 0f,
-                    3 to itemSize,
-                    4 to itemSize * 2
-                )
+                assertPositions(2 to 0f, 3 to itemSize, 4 to itemSize * 2)
             }
         }
     }
@@ -643,55 +549,42 @@
         val listSize = itemSize * 3 + spacing * 2
         val listSizeDp = with(rule.density) { listSize.toDp() }
         rule.setContent {
-            LazyList(
-                maxSize = listSizeDp,
-                arrangement = Arrangement.spacedBy(spacingDp)
-            ) {
-                items(list, key = { it }) {
-                    Item(it)
-                }
+            LazyList(maxSize = listSizeDp, arrangement = Arrangement.spacedBy(spacingDp)) {
+                items(list, key = { it }) { Item(it) }
             }
         }
 
-        assertPositions(
-            0 to 0f,
-            1 to itemSizePlusSpacing,
-            2 to itemSizePlusSpacing * 2
-        )
+        assertPositions(0 to 0f, 1 to itemSizePlusSpacing, 2 to itemSizePlusSpacing * 2)
 
-        rule.runOnUiThread {
-            list = listOf(0, 4, 2, 3, 1, 5)
-        }
+        rule.runOnUiThread { list = listOf(0, 4, 2, 3, 1, 5) }
 
         val afterLastVisibleItem = itemSize * 3 + spacing * 3
 
         onAnimationFrame { fraction ->
             // item 1 moves to and item 4 moves from `listSize`, right after the end edge
-            val item1Offset = if (isInLookaheadScope) {
-                itemSizePlusSpacing + 2 * itemSizePlusSpacing * fraction
-            } else
-                itemSizePlusSpacing + (afterLastVisibleItem - itemSizePlusSpacing) * fraction
+            val item1Offset =
+                if (isInLookaheadScope) {
+                    itemSizePlusSpacing + 2 * itemSizePlusSpacing * fraction
+                } else itemSizePlusSpacing + (afterLastVisibleItem - itemSizePlusSpacing) * fraction
             val item4Offset =
                 afterLastVisibleItem - (afterLastVisibleItem - itemSizePlusSpacing) * fraction
 
-            val expected = mutableListOf<Pair<Any, Float>>().apply {
-                add(0 to 0f)
-                if (item1Offset < afterLastVisibleItem) {
-                    add(1 to item1Offset)
-                } else {
-                    rule.onNodeWithTag("1").assertIsNotDisplayed()
+            val expected =
+                mutableListOf<Pair<Any, Float>>().apply {
+                    add(0 to 0f)
+                    if (item1Offset < afterLastVisibleItem) {
+                        add(1 to item1Offset)
+                    } else {
+                        rule.onNodeWithTag("1").assertIsNotDisplayed()
+                    }
+                    add(2 to itemSizePlusSpacing * 2)
+                    if (item4Offset < afterLastVisibleItem) {
+                        add(4 to item4Offset)
+                    } else {
+                        rule.onNodeWithTag("4").assertIsNotDisplayed()
+                    }
                 }
-                add(2 to itemSizePlusSpacing * 2)
-                if (item4Offset < afterLastVisibleItem) {
-                    add(4 to item4Offset)
-                } else {
-                    rule.onNodeWithTag("4").assertIsNotDisplayed()
-                }
-            }
-            assertPositions(
-                expected = expected.toTypedArray(),
-                fraction = fraction
-            )
+            assertPositions(expected = expected.toTypedArray(), fraction = fraction)
         }
     }
 
@@ -704,46 +597,34 @@
                 startIndex = 3,
                 arrangement = Arrangement.spacedBy(spacingDp)
             ) {
-                items(list, key = { it }) {
-                    Item(it)
-                }
+                items(list, key = { it }) { Item(it) }
             }
         }
 
-        assertPositions(
-            3 to 0f,
-            4 to itemSizePlusSpacing,
-            5 to itemSizePlusSpacing * 2
-        )
+        assertPositions(3 to 0f, 4 to itemSizePlusSpacing, 5 to itemSizePlusSpacing * 2)
 
-        rule.runOnUiThread {
-            list = listOf(2, 4, 0, 3, 1, 5, 6, 7)
-        }
+        rule.runOnUiThread { list = listOf(2, 4, 0, 3, 1, 5, 6, 7) }
 
         onAnimationFrame { fraction ->
             // item 4 moves to and item 1 moves from `-itemSize`, right before the start edge
-            val item1Offset =
-                -itemSizePlusSpacing + (2 * itemSizePlusSpacing) * fraction
-            val item4Offset =
-                itemSizePlusSpacing - (2 * itemSizePlusSpacing) * fraction
-            val expected = mutableListOf<Pair<Any, Float>>().apply {
-                if (item4Offset > -itemSize) {
-                    add(4 to item4Offset)
-                } else {
-                    rule.onNodeWithTag("4").assertIsNotDisplayed()
+            val item1Offset = -itemSizePlusSpacing + (2 * itemSizePlusSpacing) * fraction
+            val item4Offset = itemSizePlusSpacing - (2 * itemSizePlusSpacing) * fraction
+            val expected =
+                mutableListOf<Pair<Any, Float>>().apply {
+                    if (item4Offset > -itemSize) {
+                        add(4 to item4Offset)
+                    } else {
+                        rule.onNodeWithTag("4").assertIsNotDisplayed()
+                    }
+                    add(3 to 0f)
+                    if (item1Offset > -itemSize) {
+                        add(1 to item1Offset)
+                    } else {
+                        rule.onNodeWithTag("1").assertIsNotDisplayed()
+                    }
+                    add(5 to itemSizePlusSpacing * 2)
                 }
-                add(3 to 0f)
-                if (item1Offset > -itemSize) {
-                    add(1 to item1Offset)
-                } else {
-                    rule.onNodeWithTag("1").assertIsNotDisplayed()
-                }
-                add(5 to itemSizePlusSpacing * 2)
-            }
-            assertPositions(
-                expected = expected.toTypedArray(),
-                fraction = fraction
-            )
+            assertPositions(expected = expected.toTypedArray(), fraction = fraction)
         }
     }
 
@@ -762,11 +643,7 @@
 
         val item3Size = itemSize2
         val item4Size = itemSize
-        assertPositions(
-            3 to 0f,
-            4 to item3Size,
-            5 to item3Size + item4Size
-        )
+        assertPositions(3 to 0f, 4 to item3Size, 5 to item3Size + item4Size)
 
         rule.runOnUiThread {
             // swap 4 and 1
@@ -779,28 +656,25 @@
             val item1Size = itemSize3 /* the real size of the item 1 */
             // item 1 moves from and item 4 moves to `0 - item size`, right before the start edge
             val startItem1Offset = -item1Size
-            val item1Offset =
-                startItem1Offset + (itemSize2 - startItem1Offset) * fraction
+            val item1Offset = startItem1Offset + (itemSize2 - startItem1Offset) * fraction
             val endItem4Offset = -item4Size
             val item4Offset = item3Size - (item3Size - endItem4Offset) * fraction
-            val expected = mutableListOf<Pair<Any, Float>>().apply {
-                if (item4Offset > -item4Size) {
-                    add(4 to item4Offset)
-                } else {
-                    rule.onNodeWithTag("4").assertIsNotDisplayed()
+            val expected =
+                mutableListOf<Pair<Any, Float>>().apply {
+                    if (item4Offset > -item4Size) {
+                        add(4 to item4Offset)
+                    } else {
+                        rule.onNodeWithTag("4").assertIsNotDisplayed()
+                    }
+                    add(3 to 0f)
+                    if (item1Offset > -item1Size) {
+                        add(1 to item1Offset)
+                    } else {
+                        rule.onNodeWithTag("1").assertIsNotDisplayed()
+                    }
+                    add(5 to item3Size + item4Size - (item4Size - item1Size) * fraction)
                 }
-                add(3 to 0f)
-                if (item1Offset > -item1Size) {
-                    add(1 to item1Offset)
-                } else {
-                    rule.onNodeWithTag("1").assertIsNotDisplayed()
-                }
-                add(5 to item3Size + item4Size - (item4Size - item1Size) * fraction)
-            }
-            assertPositions(
-                expected = expected.toTypedArray(),
-                fraction = fraction
-            )
+            assertPositions(expected = expected.toTypedArray(), fraction = fraction)
         }
     }
 
@@ -821,45 +695,38 @@
 
         val item0Size = itemSize2
         val item1Size = itemSize
-        assertPositions(
-            0 to 0f,
-            1 to item0Size,
-            2 to item0Size + item1Size
-        )
+        assertPositions(0 to 0f, 1 to item0Size, 2 to item0Size + item1Size)
 
-        rule.runOnUiThread {
-            list = listOf(0, 4, 2, 3, 1, 5)
-        }
+        rule.runOnUiThread { list = listOf(0, 4, 2, 3, 1, 5) }
         val afterLastVisibleItem = itemSize2 + itemSize3 + itemSize
         onAnimationFrame { fraction ->
             val startItem4Offset = afterLastVisibleItem
             val endItem1Offset = afterLastVisibleItem
 
             val item4Size = itemSize3
-            val item1Offset = if (isInLookaheadScope) {
-                item0Size + (item4Size + itemSize) * fraction
-            } else {
-                item0Size + (endItem1Offset - item0Size) * fraction
-            }
+            val item1Offset =
+                if (isInLookaheadScope) {
+                    item0Size + (item4Size + itemSize) * fraction
+                } else {
+                    item0Size + (endItem1Offset - item0Size) * fraction
+                }
             val item4Offset = startItem4Offset - (startItem4Offset - item0Size) * fraction
-            val expected = mutableListOf<Pair<Any, Float>>().apply {
-                add(0 to 0f)
-                if (item1Offset < afterLastVisibleItem) {
-                    add(1 to item1Offset)
-                } else {
-                    rule.onNodeWithTag("1").assertIsNotDisplayed()
+            val expected =
+                mutableListOf<Pair<Any, Float>>().apply {
+                    add(0 to 0f)
+                    if (item1Offset < afterLastVisibleItem) {
+                        add(1 to item1Offset)
+                    } else {
+                        rule.onNodeWithTag("1").assertIsNotDisplayed()
+                    }
+                    add(2 to item0Size + item1Size - (item1Size - item4Size) * fraction)
+                    if (item4Offset < listSize) {
+                        add(4 to item4Offset)
+                    } else {
+                        rule.onNodeWithTag("4").assertIsNotDisplayed()
+                    }
                 }
-                add(2 to item0Size + item1Size - (item1Size - item4Size) * fraction)
-                if (item4Offset < listSize) {
-                    add(4 to item4Offset)
-                } else {
-                    rule.onNodeWithTag("4").assertIsNotDisplayed()
-                }
-            }
-            assertPositions(
-                expected = expected.toTypedArray(),
-                fraction = fraction
-            )
+            assertPositions(expected = expected.toTypedArray(), fraction = fraction)
         }
     }
 
@@ -867,10 +734,7 @@
     fun animateAlignmentChange() {
         var alignment by mutableStateOf(CrossAxisAlignment.End)
         rule.setContent {
-            LazyList(
-                crossAxisAlignment = alignment,
-                crossAxisSize = itemSizeDp
-            ) {
+            LazyList(crossAxisAlignment = alignment, crossAxisSize = itemSizeDp) {
                 items(listOf(1, 2, 3), key = { it }) {
                     val crossAxisSize =
                         if (it == 1) itemSizeDp else if (it == 2) itemSize2Dp else itemSize3Dp
@@ -885,16 +749,15 @@
             1 to 0f,
             2 to itemSize,
             3 to itemSize * 2,
-            crossAxis = listOf(
-                1 to 0f,
-                2 to item2Start,
-                3 to item3Start,
-            )
+            crossAxis =
+                listOf(
+                    1 to 0f,
+                    2 to item2Start,
+                    3 to item3Start,
+                )
         )
 
-        rule.runOnUiThread {
-            alignment = CrossAxisAlignment.Center
-        }
+        rule.runOnUiThread { alignment = CrossAxisAlignment.Center }
         rule.mainClock.advanceTimeByFrame()
 
         val item2End = itemSize / 2 - itemSize2 / 2
@@ -904,11 +767,12 @@
                 1 to 0f,
                 2 to itemSize,
                 3 to itemSize * 2,
-                crossAxis = listOf(
-                    1 to 0f,
-                    2 to item2Start + (item2End - item2Start) * fraction,
-                    3 to item3Start + (item3End - item3Start) * fraction,
-                ),
+                crossAxis =
+                    listOf(
+                        1 to 0f,
+                        2 to item2Start + (item2End - item2Start) * fraction,
+                        3 to item3Start + (item3End - item3Start) * fraction,
+                    ),
                 fraction = fraction
             )
         }
@@ -918,10 +782,7 @@
     fun animateAlignmentChange_multipleChildrenPerItem() {
         var alignment by mutableStateOf(CrossAxisAlignment.Start)
         rule.setContent {
-            LazyList(
-                crossAxisAlignment = alignment,
-                crossAxisSize = itemSizeDp * 2
-            ) {
+            LazyList(crossAxisAlignment = alignment, crossAxisSize = itemSizeDp * 2) {
                 items(1) {
                     listOf(1, 2, 3).forEach {
                         val crossAxisSize =
@@ -932,9 +793,7 @@
             }
         }
 
-        rule.runOnUiThread {
-            alignment = CrossAxisAlignment.End
-        }
+        rule.runOnUiThread { alignment = CrossAxisAlignment.End }
         rule.mainClock.advanceTimeByFrame()
 
         val containerSize = itemSize * 2
@@ -943,11 +802,12 @@
                 1 to 0f,
                 2 to itemSize,
                 3 to itemSize * 2,
-                crossAxis = listOf(
-                    1 to (containerSize - itemSize) * fraction,
-                    2 to (containerSize - itemSize2) * fraction,
-                    3 to (containerSize - itemSize3) * fraction
-                ),
+                crossAxis =
+                    listOf(
+                        1 to (containerSize - itemSize) * fraction,
+                        2 to (containerSize - itemSize2) * fraction,
+                        3 to (containerSize - itemSize3) * fraction
+                    ),
                 fraction = fraction
             )
         }
@@ -961,10 +821,7 @@
         var alignment by mutableStateOf(CrossAxisAlignment.End)
         rule.setContent {
             CompositionLocalProvider(LocalLayoutDirection provides LayoutDirection.Rtl) {
-                LazyList(
-                    crossAxisAlignment = alignment,
-                    crossAxisSize = itemSizeDp
-                ) {
+                LazyList(crossAxisAlignment = alignment, crossAxisSize = itemSizeDp) {
                     items(listOf(1, 2, 3), key = { it }) {
                         val crossAxisSize =
                             if (it == 1) itemSizeDp else if (it == 2) itemSize2Dp else itemSize3Dp
@@ -978,16 +835,15 @@
             1 to 0f,
             2 to itemSize,
             3 to itemSize * 2,
-            crossAxis = listOf(
-                1 to 0f,
-                2 to 0f,
-                3 to 0f,
-            )
+            crossAxis =
+                listOf(
+                    1 to 0f,
+                    2 to 0f,
+                    3 to 0f,
+                )
         )
 
-        rule.runOnUiThread {
-            alignment = CrossAxisAlignment.Center
-        }
+        rule.runOnUiThread { alignment = CrossAxisAlignment.Center }
         rule.mainClock.advanceTimeByFrame()
 
         onAnimationFrame { fraction ->
@@ -995,11 +851,12 @@
                 1 to 0f,
                 2 to itemSize,
                 3 to itemSize * 2,
-                crossAxis = listOf(
-                    1 to 0f,
-                    2 to (itemSize / 2 - itemSize2 / 2) * fraction,
-                    3 to (itemSize / 2 - itemSize3 / 2) * fraction
-                ),
+                crossAxis =
+                    listOf(
+                        1 to 0f,
+                        2 to (itemSize / 2 - itemSize2 / 2) * fraction,
+                        3 to (itemSize / 2 - itemSize3 / 2) * fraction
+                    ),
                 fraction = fraction
             )
         }
@@ -1010,14 +867,11 @@
         var list by mutableStateOf(listOf(0, 1, 2, 3, 4))
         val rawStartPadding = 8f
         val rawEndPadding = 12f
-        val (startPaddingDp, endPaddingDp) = with(rule.density) {
-            rawStartPadding.toDp() to rawEndPadding.toDp()
-        }
+        val (startPaddingDp, endPaddingDp) =
+            with(rule.density) { rawStartPadding.toDp() to rawEndPadding.toDp() }
         rule.setContent {
             LazyList(startPadding = startPaddingDp, endPadding = endPaddingDp) {
-                items(list, key = { it }) {
-                    Item(it)
-                }
+                items(list, key = { it }) { Item(it) }
             }
         }
 
@@ -1030,9 +884,7 @@
             4 to startPadding + itemSize * 4,
         )
 
-        rule.runOnUiThread {
-            list = listOf(0, 2, 3, 4, 1)
-        }
+        rule.runOnUiThread { list = listOf(0, 2, 3, 4, 1) }
 
         onAnimationFrame { fraction ->
             assertPositions(
@@ -1051,9 +903,8 @@
         var list by mutableStateOf(listOf(0, 1, 2, 3, 4))
         val rawStartPadding = 8f
         val rawEndPadding = 12f
-        val (startPaddingDp, endPaddingDp) = with(rule.density) {
-            rawStartPadding.toDp() to rawEndPadding.toDp()
-        }
+        val (startPaddingDp, endPaddingDp) =
+            with(rule.density) { rawStartPadding.toDp() to rawEndPadding.toDp() }
         rule.setContent {
             // only 4 items will be visible 0, 1, 2, 3
             LazyList(
@@ -1061,9 +912,7 @@
                 startPadding = startPaddingDp,
                 endPadding = endPaddingDp
             ) {
-                items(list, key = { it }) {
-                    Item(it)
-                }
+                items(list, key = { it }) { Item(it) }
             }
         }
 
@@ -1075,9 +924,7 @@
             3 to startPadding + itemSize * 3
         )
 
-        rule.runOnUiThread {
-            list = listOf(1, 2, 3, 4)
-        }
+        rule.runOnUiThread { list = listOf(1, 2, 3, 4) }
 
         onAnimationFrame { fraction ->
             assertPositions(
@@ -1096,22 +943,11 @@
 
         var measurePasses = 0
         rule.setContent {
-            LazyList {
-                items(list, key = { it }) {
-                    Item(it)
-                }
-            }
-            LaunchedEffect(Unit) {
-                snapshotFlow { state.layoutInfo }
-                    .collect {
-                        measurePasses++
-                    }
-            }
+            LazyList { items(list, key = { it }) { Item(it) } }
+            LaunchedEffect(Unit) { snapshotFlow { state.layoutInfo }.collect { measurePasses++ } }
         }
 
-        rule.runOnUiThread {
-            list = listOf(4, 1, 2, 3, 0)
-        }
+        rule.runOnUiThread { list = listOf(4, 1, 2, 3, 0) }
 
         var startMeasurePasses = Int.MIN_VALUE
         onAnimationFrame { fraction ->
@@ -1130,17 +966,11 @@
     fun noAnimationWhenScrolledToOtherPosition() {
         rule.setContent {
             LazyList(maxSize = itemSizeDp * 3) {
-                items(listOf(0, 1, 2, 3, 4, 5, 6, 7), key = { it }) {
-                    Item(it)
-                }
+                items(listOf(0, 1, 2, 3, 4, 5, 6, 7), key = { it }) { Item(it) }
             }
         }
 
-        rule.runOnUiThread {
-            runBlocking {
-                state.scrollToItem(0, (itemSize / 2).roundToInt())
-            }
-        }
+        rule.runOnUiThread { runBlocking { state.scrollToItem(0, (itemSize / 2).roundToInt()) } }
 
         onAnimationFrame { fraction ->
             assertPositions(
@@ -1157,17 +987,11 @@
     fun noAnimationWhenScrollForwardBySmallOffset() {
         rule.setContent {
             LazyList(maxSize = itemSizeDp * 3) {
-                items(listOf(0, 1, 2, 3, 4, 5, 6, 7), key = { it }) {
-                    Item(it)
-                }
+                items(listOf(0, 1, 2, 3, 4, 5, 6, 7), key = { it }) { Item(it) }
             }
         }
 
-        rule.runOnUiThread {
-            runBlocking {
-                state.scrollBy(itemSize / 2f)
-            }
-        }
+        rule.runOnUiThread { runBlocking { state.scrollBy(itemSize / 2f) } }
 
         onAnimationFrame { fraction ->
             assertPositions(
@@ -1184,17 +1008,11 @@
     fun noAnimationWhenScrollBackwardBySmallOffset() {
         rule.setContent {
             LazyList(maxSize = itemSizeDp * 3, startIndex = 2) {
-                items(listOf(0, 1, 2, 3, 4, 5, 6, 7), key = { it }) {
-                    Item(it)
-                }
+                items(listOf(0, 1, 2, 3, 4, 5, 6, 7), key = { it }) { Item(it) }
             }
         }
 
-        rule.runOnUiThread {
-            runBlocking {
-                state.scrollBy(-itemSize / 2f)
-            }
-        }
+        rule.runOnUiThread { runBlocking { state.scrollBy(-itemSize / 2f) } }
 
         onAnimationFrame { fraction ->
             assertPositions(
@@ -1211,17 +1029,11 @@
     fun noAnimationWhenScrollForwardByLargeOffset() {
         rule.setContent {
             LazyList(maxSize = itemSizeDp * 3) {
-                items(listOf(0, 1, 2, 3, 4, 5, 6, 7), key = { it }) {
-                    Item(it)
-                }
+                items(listOf(0, 1, 2, 3, 4, 5, 6, 7), key = { it }) { Item(it) }
             }
         }
 
-        rule.runOnUiThread {
-            runBlocking {
-                state.scrollBy(itemSize * 2.5f)
-            }
-        }
+        rule.runOnUiThread { runBlocking { state.scrollBy(itemSize * 2.5f) } }
 
         onAnimationFrame { fraction ->
             assertPositions(
@@ -1238,17 +1050,11 @@
     fun noAnimationWhenScrollBackwardByLargeOffset() {
         rule.setContent {
             LazyList(maxSize = itemSizeDp * 3, startIndex = 3) {
-                items(listOf(0, 1, 2, 3, 4, 5, 6, 7), key = { it }) {
-                    Item(it)
-                }
+                items(listOf(0, 1, 2, 3, 4, 5, 6, 7), key = { it }) { Item(it) }
             }
         }
 
-        rule.runOnUiThread {
-            runBlocking {
-                state.scrollBy(-itemSize * 2.5f)
-            }
-        }
+        rule.runOnUiThread { runBlocking { state.scrollBy(-itemSize * 2.5f) } }
 
         onAnimationFrame { fraction ->
             assertPositions(
@@ -1271,11 +1077,7 @@
             }
         }
 
-        rule.runOnUiThread {
-            runBlocking {
-                state.scrollBy(itemSize + itemSize2 + itemSize / 2f)
-            }
-        }
+        rule.runOnUiThread { runBlocking { state.scrollBy(itemSize + itemSize2 + itemSize / 2f) } }
 
         onAnimationFrame { fraction ->
             assertPositions(
@@ -1299,9 +1101,7 @@
         }
 
         rule.runOnUiThread {
-            runBlocking {
-                state.scrollBy(-(itemSize + itemSize2 + itemSize / 2f))
-            }
+            runBlocking { state.scrollBy(-(itemSize + itemSize2 + itemSize / 2f)) }
         }
 
         onAnimationFrame { fraction ->
@@ -1319,9 +1119,7 @@
     fun noAnimationWhenScrollForwardBySmallOffsetAndThenLargeOffset() {
         rule.setContent {
             LazyList(maxSize = itemSizeDp * 2.2f) {
-                items(listOf(0, 1, 2, 3, 4, 5, 6, 7), key = { it }) {
-                    Item(it)
-                }
+                items(listOf(0, 1, 2, 3, 4, 5, 6, 7), key = { it }) { Item(it) }
             }
         }
 
@@ -1351,31 +1149,25 @@
         val listSizeDp = with(rule.density) { listSize.toDp() }
         rule.setContent {
             LazyList(maxSize = listSizeDp) {
-                items(list, key = { it }) {
-                    Item(it, animSpec = if (it == 1) AnimSpec else null)
-                }
+                items(list, key = { it }) { Item(it, animSpec = if (it == 1) AnimSpec else null) }
             }
         }
 
-        rule.runOnUiThread {
-            list = listOf(0, 2, 3, 1)
-        }
+        rule.runOnUiThread { list = listOf(0, 2, 3, 1) }
 
         onAnimationFrame { fraction ->
             // item 1 moves to `listSize`
             val item1Offset = itemSize + (listSize - itemSize) * fraction
-            val expected = mutableListOf<Pair<Any, Float>>().apply {
-                add(0 to 0f)
-                if (item1Offset < listSize) {
-                    add(1 to item1Offset)
-                } else {
-                    rule.onNodeWithTag("1").assertIsNotDisplayed()
+            val expected =
+                mutableListOf<Pair<Any, Float>>().apply {
+                    add(0 to 0f)
+                    if (item1Offset < listSize) {
+                        add(1 to item1Offset)
+                    } else {
+                        rule.onNodeWithTag("1").assertIsNotDisplayed()
+                    }
                 }
-            }
-            assertPositions(
-                expected = expected.toTypedArray(),
-                fraction = fraction
-            )
+            assertPositions(expected = expected.toTypedArray(), fraction = fraction)
         }
     }
 
@@ -1384,21 +1176,13 @@
         var list by mutableStateOf(listOf(0, 1, 2, 3, 4, 5))
         rule.setContent {
             LazyList(maxSize = itemSizeDp * 3f, startIndex = 3) {
-                items(list, key = { it }) {
-                    Item(it)
-                }
+                items(list, key = { it }) { Item(it) }
             }
         }
 
-        assertPositions(
-            3 to 0f,
-            4 to itemSize,
-            5 to itemSize * 2
-        )
+        assertPositions(3 to 0f, 4 to itemSize, 5 to itemSize * 2)
 
-        rule.runOnUiThread {
-            list = listOf(0, 4, 5, 3, 1, 2)
-        }
+        rule.runOnUiThread { list = listOf(0, 4, 5, 3, 1, 2) }
 
         onAnimationFrame { fraction ->
             // item 2 moves from and item 5 moves to `-itemSize`, right before the start edge
@@ -1407,33 +1191,31 @@
             // item 1 moves from and item 4 moves to `-itemSize * 2`, right before item 2
             val item1Offset = -itemSize * 2 + itemSize * 3 * fraction
             val item4Offset = itemSize - itemSize * 3 * fraction
-            val expected = mutableListOf<Pair<Any, Float>>().apply {
-                if (item1Offset > -itemSize) {
-                    add(1 to item1Offset)
-                } else {
-                    rule.onNodeWithTag("1").assertIsNotDisplayed()
+            val expected =
+                mutableListOf<Pair<Any, Float>>().apply {
+                    if (item1Offset > -itemSize) {
+                        add(1 to item1Offset)
+                    } else {
+                        rule.onNodeWithTag("1").assertIsNotDisplayed()
+                    }
+                    if (item2Offset > -itemSize) {
+                        add(2 to item2Offset)
+                    } else {
+                        rule.onNodeWithTag("2").assertIsNotDisplayed()
+                    }
+                    add(3 to 0f)
+                    if (item4Offset > -itemSize) {
+                        add(4 to item4Offset)
+                    } else {
+                        rule.onNodeWithTag("4").assertIsNotDisplayed()
+                    }
+                    if (item5Offset > -itemSize) {
+                        add(5 to item5Offset)
+                    } else {
+                        rule.onNodeWithTag("5").assertIsNotDisplayed()
+                    }
                 }
-                if (item2Offset > -itemSize) {
-                    add(2 to item2Offset)
-                } else {
-                    rule.onNodeWithTag("2").assertIsNotDisplayed()
-                }
-                add(3 to 0f)
-                if (item4Offset > -itemSize) {
-                    add(4 to item4Offset)
-                } else {
-                    rule.onNodeWithTag("4").assertIsNotDisplayed()
-                }
-                if (item5Offset > -itemSize) {
-                    add(5 to item5Offset)
-                } else {
-                    rule.onNodeWithTag("5").assertIsNotDisplayed()
-                }
-            }
-            assertPositions(
-                expected = expected.toTypedArray(),
-                fraction = fraction
-            )
+            assertPositions(expected = expected.toTypedArray(), fraction = fraction)
         }
     }
 
@@ -1442,21 +1224,13 @@
         var list by mutableStateOf(listOf(0, 1, 2, 3, 4, 5))
         rule.setContent {
             LazyList(maxSize = itemSizeDp * 3f, startIndex = 3) {
-                items(list, key = { it }) {
-                    Item(it)
-                }
+                items(list, key = { it }) { Item(it) }
             }
         }
 
-        assertPositions(
-            3 to 0f,
-            4 to itemSize,
-            5 to itemSize * 2
-        )
+        assertPositions(3 to 0f, 4 to itemSize, 5 to itemSize * 2)
 
-        rule.runOnUiThread {
-            list = listOf(0, 5, 4, 3, 2, 1)
-        }
+        rule.runOnUiThread { list = listOf(0, 5, 4, 3, 2, 1) }
 
         onAnimationFrame { fraction ->
             // item 2 moves from and item 4 moves to `-itemSize`, right before the start edge
@@ -1465,33 +1239,31 @@
             // item 1 moves from and item 5 moves to `-itemSize * 2`, right before item 2
             val item1Offset = -itemSize * 2 + itemSize * 4 * fraction
             val item5Offset = itemSize * 2 - itemSize * 4 * fraction
-            val expected = mutableListOf<Pair<Any, Float>>().apply {
-                if (item1Offset > -itemSize) {
-                    add(1 to item1Offset)
-                } else {
-                    rule.onNodeWithTag("1").assertIsNotDisplayed()
+            val expected =
+                mutableListOf<Pair<Any, Float>>().apply {
+                    if (item1Offset > -itemSize) {
+                        add(1 to item1Offset)
+                    } else {
+                        rule.onNodeWithTag("1").assertIsNotDisplayed()
+                    }
+                    if (item2Offset > -itemSize) {
+                        add(2 to item2Offset)
+                    } else {
+                        rule.onNodeWithTag("2").assertIsNotDisplayed()
+                    }
+                    add(3 to 0f)
+                    if (item4Offset > -itemSize) {
+                        add(4 to item4Offset)
+                    } else {
+                        rule.onNodeWithTag("4").assertIsNotDisplayed()
+                    }
+                    if (item5Offset > -itemSize) {
+                        add(5 to item5Offset)
+                    } else {
+                        rule.onNodeWithTag("5").assertIsNotDisplayed()
+                    }
                 }
-                if (item2Offset > -itemSize) {
-                    add(2 to item2Offset)
-                } else {
-                    rule.onNodeWithTag("2").assertIsNotDisplayed()
-                }
-                add(3 to 0f)
-                if (item4Offset > -itemSize) {
-                    add(4 to item4Offset)
-                } else {
-                    rule.onNodeWithTag("4").assertIsNotDisplayed()
-                }
-                if (item5Offset > -itemSize) {
-                    add(5 to item5Offset)
-                } else {
-                    rule.onNodeWithTag("5").assertIsNotDisplayed()
-                }
-            }
-            assertPositions(
-                expected = expected.toTypedArray(),
-                fraction = fraction
-            )
+            assertPositions(expected = expected.toTypedArray(), fraction = fraction)
         }
     }
 
@@ -1501,22 +1273,12 @@
         val listSize = itemSize * 3
         val listSizeDp = with(rule.density) { listSize.toDp() }
         rule.setContent {
-            LazyList(maxSize = listSizeDp) {
-                items(list, key = { it }) {
-                    Item(it)
-                }
-            }
+            LazyList(maxSize = listSizeDp) { items(list, key = { it }) { Item(it) } }
         }
 
-        assertPositions(
-            0 to 0f,
-            1 to itemSize,
-            2 to itemSize * 2
-        )
+        assertPositions(0 to 0f, 1 to itemSize, 2 to itemSize * 2)
 
-        rule.runOnUiThread {
-            list = listOf(0, 3, 4, 1, 2)
-        }
+        rule.runOnUiThread { list = listOf(0, 3, 4, 1, 2) }
 
         onAnimationFrame { fraction ->
             // item 1 moves to and item 3 moves from `listSize`, right after the end edge
@@ -1525,33 +1287,31 @@
             // item 2 moves to and item 4 moves from `listSize + itemSize`, right after item 4
             val item2Offset = itemSize * 2 + (listSize - itemSize) * fraction
             val item4Offset = listSize + itemSize - (listSize - itemSize) * fraction
-            val expected = mutableListOf<Pair<Any, Float>>().apply {
-                add(0 to 0f)
-                if (item1Offset < listSize) {
-                    add(1 to item1Offset)
-                } else {
-                    rule.onNodeWithTag("1").assertIsNotDisplayed()
+            val expected =
+                mutableListOf<Pair<Any, Float>>().apply {
+                    add(0 to 0f)
+                    if (item1Offset < listSize) {
+                        add(1 to item1Offset)
+                    } else {
+                        rule.onNodeWithTag("1").assertIsNotDisplayed()
+                    }
+                    if (item2Offset < listSize) {
+                        add(2 to item2Offset)
+                    } else {
+                        rule.onNodeWithTag("2").assertIsNotDisplayed()
+                    }
+                    if (item3Offset < listSize) {
+                        add(3 to item3Offset)
+                    } else {
+                        rule.onNodeWithTag("3").assertIsNotDisplayed()
+                    }
+                    if (item4Offset < listSize) {
+                        add(4 to item4Offset)
+                    } else {
+                        rule.onNodeWithTag("4").assertIsNotDisplayed()
+                    }
                 }
-                if (item2Offset < listSize) {
-                    add(2 to item2Offset)
-                } else {
-                    rule.onNodeWithTag("2").assertIsNotDisplayed()
-                }
-                if (item3Offset < listSize) {
-                    add(3 to item3Offset)
-                } else {
-                    rule.onNodeWithTag("3").assertIsNotDisplayed()
-                }
-                if (item4Offset < listSize) {
-                    add(4 to item4Offset)
-                } else {
-                    rule.onNodeWithTag("4").assertIsNotDisplayed()
-                }
-            }
-            assertPositions(
-                expected = expected.toTypedArray(),
-                fraction = fraction
-            )
+            assertPositions(expected = expected.toTypedArray(), fraction = fraction)
         }
     }
 
@@ -1561,22 +1321,12 @@
         val listSize = itemSize * 3
         val listSizeDp = with(rule.density) { listSize.toDp() }
         rule.setContent {
-            LazyList(maxSize = listSizeDp) {
-                items(list, key = { it }) {
-                    Item(it)
-                }
-            }
+            LazyList(maxSize = listSizeDp) { items(list, key = { it }) { Item(it) } }
         }
 
-        assertPositions(
-            0 to 0f,
-            1 to itemSize,
-            2 to itemSize * 2
-        )
+        assertPositions(0 to 0f, 1 to itemSize, 2 to itemSize * 2)
 
-        rule.runOnUiThread {
-            list = listOf(0, 4, 3, 2, 1)
-        }
+        rule.runOnUiThread { list = listOf(0, 4, 3, 2, 1) }
 
         onAnimationFrame { fraction ->
             // item 2 moves to and item 3 moves from `listSize`, right after the end edge
@@ -1584,35 +1334,32 @@
             val item3Offset = listSize - (listSize - itemSize * 2) * fraction
             // item 1 moves to and item 4 moves from `listSize + itemSize`, right after item 4
             val item1Offset = itemSize + (listSize + itemSize - itemSize) * fraction
-            val item4Offset =
-                listSize + itemSize - (listSize + itemSize - itemSize) * fraction
-            val expected = mutableListOf<Pair<Any, Float>>().apply {
-                add(0 to 0f)
-                if (item1Offset < listSize) {
-                    add(1 to item1Offset)
-                } else {
-                    rule.onNodeWithTag("1").assertIsNotDisplayed()
+            val item4Offset = listSize + itemSize - (listSize + itemSize - itemSize) * fraction
+            val expected =
+                mutableListOf<Pair<Any, Float>>().apply {
+                    add(0 to 0f)
+                    if (item1Offset < listSize) {
+                        add(1 to item1Offset)
+                    } else {
+                        rule.onNodeWithTag("1").assertIsNotDisplayed()
+                    }
+                    if (item2Offset < listSize) {
+                        add(2 to item2Offset)
+                    } else {
+                        rule.onNodeWithTag("2").assertIsNotDisplayed()
+                    }
+                    if (item3Offset < listSize) {
+                        add(3 to item3Offset)
+                    } else {
+                        rule.onNodeWithTag("3").assertIsNotDisplayed()
+                    }
+                    if (item4Offset < listSize) {
+                        add(4 to item4Offset)
+                    } else {
+                        rule.onNodeWithTag("4").assertIsNotDisplayed()
+                    }
                 }
-                if (item2Offset < listSize) {
-                    add(2 to item2Offset)
-                } else {
-                    rule.onNodeWithTag("2").assertIsNotDisplayed()
-                }
-                if (item3Offset < listSize) {
-                    add(3 to item3Offset)
-                } else {
-                    rule.onNodeWithTag("3").assertIsNotDisplayed()
-                }
-                if (item4Offset < listSize) {
-                    add(4 to item4Offset)
-                } else {
-                    rule.onNodeWithTag("4").assertIsNotDisplayed()
-                }
-            }
-            assertPositions(
-                expected = expected.toTypedArray(),
-                fraction = fraction
-            )
+            assertPositions(expected = expected.toTypedArray(), fraction = fraction)
         }
     }
 
@@ -1620,23 +1367,13 @@
     fun noAnimationWhenParentSizeShrinks() {
         var size by mutableStateOf(itemSizeDp * 3)
         rule.setContent {
-            LazyList(maxSize = size) {
-                items(listOf(0, 1, 2), key = { it }) {
-                    Item(it)
-                }
-            }
+            LazyList(maxSize = size) { items(listOf(0, 1, 2), key = { it }) { Item(it) } }
         }
 
-        rule.runOnUiThread {
-            size = itemSizeDp * 2
-        }
+        rule.runOnUiThread { size = itemSizeDp * 2 }
 
         onAnimationFrame { fraction ->
-            assertPositions(
-                0 to 0f,
-                1 to itemSize,
-                fraction = fraction
-            )
+            assertPositions(0 to 0f, 1 to itemSize, fraction = fraction)
             rule.onNodeWithTag("2").assertIsNotDisplayed()
         }
     }
@@ -1645,24 +1382,13 @@
     fun noAnimationWhenParentSizeExpands() {
         var size by mutableStateOf(itemSizeDp * 2)
         rule.setContent {
-            LazyList(maxSize = size) {
-                items(listOf(0, 1, 2), key = { it }) {
-                    Item(it)
-                }
-            }
+            LazyList(maxSize = size) { items(listOf(0, 1, 2), key = { it }) { Item(it) } }
         }
 
-        rule.runOnUiThread {
-            size = itemSizeDp * 3
-        }
+        rule.runOnUiThread { size = itemSizeDp * 3 }
 
         onAnimationFrame { fraction ->
-            assertPositions(
-                0 to 0f,
-                1 to itemSize,
-                2 to itemSize * 2,
-                fraction = fraction
-            )
+            assertPositions(0 to 0f, 1 to itemSize, 2 to itemSize * 2, fraction = fraction)
         }
     }
 
@@ -1671,28 +1397,15 @@
         var list by mutableStateOf(listOf(0, 1, 2, 3))
         val scrollDelta = spacing
         rule.setContent {
-            LazyList(maxSize = itemSizeDp * 2) {
-                items(list, key = { it }) {
-                    Item(it)
-                }
-            }
+            LazyList(maxSize = itemSizeDp * 2) { items(list, key = { it }) { Item(it) } }
         }
 
-        rule.runOnUiThread {
-            list = listOf(0, 2, 1, 3)
-        }
+        rule.runOnUiThread { list = listOf(0, 2, 1, 3) }
 
         onAnimationFrame { fraction ->
             if (fraction == 0f) {
-                assertPositions(
-                    0 to 0f,
-                    1 to itemSize,
-                    2 to itemSize * 2,
-                    fraction = fraction
-                )
-                rule.runOnUiThread {
-                    runBlocking { state.scrollBy(scrollDelta) }
-                }
+                assertPositions(0 to 0f, 1 to itemSize, 2 to itemSize * 2, fraction = fraction)
+                rule.runOnUiThread { runBlocking { state.scrollBy(scrollDelta) } }
             }
             assertPositions(
                 0 to -scrollDelta,
@@ -1712,36 +1425,26 @@
         val containerSizeDp = itemSizeDp * 2
         val containerSize = itemSize * 2
         rule.setContent {
-            LazyList(maxSize = containerSizeDp) {
-                items(list, key = { it }) {
-                    Item(it)
-                }
-            }
+            LazyList(maxSize = containerSizeDp) { items(list, key = { it }) { Item(it) } }
         }
 
-        rule.runOnUiThread {
-            list = listOf(0, 4, 2, 3, 1)
-        }
+        rule.runOnUiThread { list = listOf(0, 4, 2, 3, 1) }
 
         onAnimationFrame { fraction ->
             if (fraction == 0f) {
-                assertPositions(
-                    0 to 0f,
-                    1 to itemSize,
-                    fraction = fraction
-                )
-                rule.runOnUiThread {
-                    runBlocking { state.scrollBy(scrollDelta) }
-                }
+                assertPositions(0 to 0f, 1 to itemSize, fraction = fraction)
+                rule.runOnUiThread { runBlocking { state.scrollBy(scrollDelta) } }
             }
             if (isInLookaheadScope) {
                 assertPositions(
                     0 to -scrollDelta,
-                    1 to spring<IntOffset>(stiffness = Spring.StiffnessMediumLow).getValueAtFrame(
-                        (fraction * Duration / FrameDuration).toInt(),
-                        from = itemSize - scrollDelta,
-                        to = itemSize * 3 - scrollDelta
-                    ),
+                    1 to
+                        spring<IntOffset>(stiffness = Spring.StiffnessMediumLow)
+                            .getValueAtFrame(
+                                (fraction * Duration / FrameDuration).toInt(),
+                                from = itemSize - scrollDelta,
+                                to = itemSize * 3 - scrollDelta
+                            ),
                     fraction = fraction
                 )
             } else {
@@ -1761,37 +1464,28 @@
         val containerSizeDp = itemSizeDp * 2
         rule.setContent {
             LazyList(maxSize = containerSizeDp, startIndex = 2) {
-                items(list, key = { it }) {
-                    Item(it)
-                }
+                items(list, key = { it }) { Item(it) }
             }
         }
 
-        rule.runOnUiThread {
-            list = listOf(3, 0, 1, 2, 4)
-        }
+        rule.runOnUiThread { list = listOf(3, 0, 1, 2, 4) }
 
         onAnimationFrame { fraction ->
             if (fraction == 0f) {
-                assertPositions(
-                    2 to 0f,
-                    3 to itemSize,
-                    fraction = fraction
-                )
-                rule.runOnUiThread {
-                    runBlocking { state.scrollBy(scrollDelta) }
-                }
+                assertPositions(2 to 0f, 3 to itemSize, fraction = fraction)
+                rule.runOnUiThread { runBlocking { state.scrollBy(scrollDelta) } }
             }
             if (isInLookaheadScope) {
                 // Expect interruption to lookahead placement animation on 0th frame, from
                 // an additional item (i.e. item with key = 1) being composed due to scrolling.
                 assertPositions(
                     2 to -scrollDelta,
-                    3 to interruptionSpec.getValueAtFrame(
-                        (Duration / FrameDuration * fraction).toInt(),
-                        from = itemSize,
-                        to = -2 * itemSize - scrollDelta
-                    ),
+                    3 to
+                        interruptionSpec.getValueAtFrame(
+                            (Duration / FrameDuration * fraction).toInt(),
+                            from = itemSize,
+                            to = -2 * itemSize - scrollDelta
+                        ),
                     fraction = fraction
                 )
             } else {
@@ -1810,27 +1504,15 @@
         val containerSizeDp = itemSizeDp * 2
         val scrollDelta = spacing
         rule.setContent {
-            LazyList(maxSize = containerSizeDp) {
-                items(list, key = { it }) {
-                    Item(it)
-                }
-            }
+            LazyList(maxSize = containerSizeDp) { items(list, key = { it }) { Item(it) } }
         }
 
-        rule.runOnUiThread {
-            list = listOf(0, 4, 2, 3, 1)
-        }
+        rule.runOnUiThread { list = listOf(0, 4, 2, 3, 1) }
 
         onAnimationFrame { fraction ->
             if (fraction == 0f) {
-                assertPositions(
-                    0 to 0f,
-                    1 to itemSize,
-                    fraction = fraction
-                )
-                rule.runOnUiThread {
-                    runBlocking { state.scrollBy(itemSize * 2) }
-                }
+                assertPositions(0 to 0f, 1 to itemSize, fraction = fraction)
+                rule.runOnUiThread { runBlocking { state.scrollBy(itemSize * 2) } }
                 val postFirstScrollItem2Offset = if (isInLookaheadScope) -itemSize else itemSize
                 assertPositions(
                     2 to 0f,
@@ -1840,9 +1522,7 @@
                     1 to postFirstScrollItem2Offset,
                     fraction = fraction
                 )
-                rule.runOnUiThread {
-                    runBlocking { state.scrollBy(scrollDelta) }
-                }
+                rule.runOnUiThread { runBlocking { state.scrollBy(scrollDelta) } }
                 assertPositions(
                     2 to 0f - scrollDelta,
                     3 to itemSize - scrollDelta,
@@ -1865,11 +1545,12 @@
                 assertPositions(
                     2 to -scrollDelta,
                     3 to itemSize - scrollDelta,
-                    1 to interruptionSpec.getValueAtFrame(
-                        (Duration / FrameDuration * fraction).toInt(),
-                        from = -itemSize - scrollDelta,
-                        to = 2 * itemSize - scrollDelta
-                    ),
+                    1 to
+                        interruptionSpec.getValueAtFrame(
+                            (Duration / FrameDuration * fraction).toInt(),
+                            from = -itemSize - scrollDelta,
+                            to = 2 * itemSize - scrollDelta
+                        ),
                     fraction = fraction
                 )
             }
@@ -1882,36 +1563,28 @@
         val listSize = itemSize * 2.5
         val listSizeDp = itemSizeDp * 3f
         rule.setContent {
-            LazyList(maxSize = listSizeDp) {
-                items(list, key = { it }) {
-                    Item(it)
-                }
-            }
+            LazyList(maxSize = listSizeDp) { items(list, key = { it }) { Item(it) } }
         }
 
         rule.runOnUiThread {
             list = listOf(0, 1, 2, 3)
-            runBlocking {
-                state.scrollToItem(0, 0)
-            }
+            runBlocking { state.scrollToItem(0, 0) }
         }
 
         onAnimationFrame { fraction ->
-            val expected = mutableListOf<Pair<Any, Float>>().apply {
-                add(0 to 0f)
-                add(1 to itemSize * fraction)
-                add(2 to itemSize + itemSize * fraction)
-                val item3Offset = itemSize * 2 + itemSize * fraction
-                if (item3Offset < listSize) {
-                    add(3 to item3Offset)
-                } else {
-                    rule.onNodeWithTag("4").assertIsNotDisplayed()
+            val expected =
+                mutableListOf<Pair<Any, Float>>().apply {
+                    add(0 to 0f)
+                    add(1 to itemSize * fraction)
+                    add(2 to itemSize + itemSize * fraction)
+                    val item3Offset = itemSize * 2 + itemSize * fraction
+                    if (item3Offset < listSize) {
+                        add(3 to item3Offset)
+                    } else {
+                        rule.onNodeWithTag("4").assertIsNotDisplayed()
+                    }
                 }
-            }
-            assertPositions(
-                expected = expected.toTypedArray(),
-                fraction = fraction
-            )
+            assertPositions(expected = expected.toTypedArray(), fraction = fraction)
         }
     }
 
@@ -1929,9 +1602,7 @@
             }
         }
 
-        rule.runOnUiThread {
-            item0Size = itemSize2Dp
-        }
+        rule.runOnUiThread { item0Size = itemSize2Dp }
 
         rule.waitForIdle()
         rule.mainClock.advanceTimeByFrame()
@@ -1946,9 +1617,7 @@
             }
         }
 
-        rule.runOnUiThread {
-            item0Size = 0.dp
-        }
+        rule.runOnUiThread { item0Size = 0.dp }
 
         rule.waitForIdle()
         val startValue = animSpec.getValueAtFrame(2, from = itemSize, to = itemSize2)
@@ -1958,12 +1627,13 @@
                 assertPositions(0 to 0f, 1 to startValue)
             } else {
                 assertThat(fraction).isEqualTo(1f)
-                val valueAfterThreeFrames = animSpec.getValueAtFrame(
-                    1,
-                    from = startValue,
-                    to = 0f,
-                    initialVelocity = startVelocity
-                )
+                val valueAfterThreeFrames =
+                    animSpec.getValueAtFrame(
+                        1,
+                        from = startValue,
+                        to = 0f,
+                        initialVelocity = startVelocity
+                    )
                 assertPositions(0 to 0f, 1 to valueAfterThreeFrames)
             }
         }
@@ -1976,47 +1646,55 @@
         autoReverse: Boolean = reverseLayout
     ) {
         val roundedExpected = expected.map { it.first to it.second.roundToInt() }
-        val actualBounds = rule.onAllNodes(NodesWithTagMatcher)
-            .fetchSemanticsNodes()
-            .associateBy(
-                keySelector = { it.config.get(SemanticsProperties.TestTag) },
-                valueTransform = { IntRect(it.positionInRoot.round(), it.size) }
-            )
-        val actualOffsets = expected.map {
-            it.first to actualBounds.getValue(it.first.toString()).let { bounds ->
-                if (isVertical) bounds.top else bounds.left
+        val actualBounds =
+            rule
+                .onAllNodes(NodesWithTagMatcher)
+                .fetchSemanticsNodes()
+                .associateBy(
+                    keySelector = { it.config.get(SemanticsProperties.TestTag) },
+                    valueTransform = { IntRect(it.positionInRoot.round(), it.size) }
+                )
+        val actualOffsets =
+            expected.map {
+                it.first to
+                    actualBounds.getValue(it.first.toString()).let { bounds ->
+                        if (isVertical) bounds.top else bounds.left
+                    }
             }
-        }
-        val subject = if (fraction == null) {
-            assertThat(actualOffsets)
-        } else {
-            assertWithMessage("Fraction=$fraction").that(actualOffsets)
-        }
+        val subject =
+            if (fraction == null) {
+                assertThat(actualOffsets)
+            } else {
+                assertWithMessage("Fraction=$fraction").that(actualOffsets)
+            }
         subject.isEqualTo(
             roundedExpected.let { list ->
                 if (!autoReverse) {
                     list
                 } else {
-                    val containerSize = actualBounds.getValue(ContainerTag).let { bounds ->
-                        if (isVertical) bounds.height else bounds.width
-                    }
-                    list.map {
-                        val itemSize = actualBounds.getValue(it.first.toString()).let { bounds ->
+                    val containerSize =
+                        actualBounds.getValue(ContainerTag).let { bounds ->
                             if (isVertical) bounds.height else bounds.width
                         }
+                    list.map {
+                        val itemSize =
+                            actualBounds.getValue(it.first.toString()).let { bounds ->
+                                if (isVertical) bounds.height else bounds.width
+                            }
                         it.first to (containerSize - itemSize - it.second)
                     }
                 }
             }
         )
         if (crossAxis != null) {
-            val actualCrossOffset = expected.map {
-                it.first to actualBounds.getValue(it.first.toString())
-                    .let { bounds -> if (isVertical) bounds.left else bounds.top }
-            }
-            assertWithMessage(
-                "CrossAxis" + if (fraction != null) "for fraction=$fraction" else ""
-            )
+            val actualCrossOffset =
+                expected.map {
+                    it.first to
+                        actualBounds.getValue(it.first.toString()).let { bounds ->
+                            if (isVertical) bounds.left else bounds.top
+                        }
+                }
+            assertWithMessage("CrossAxis" + if (fraction != null) "for fraction=$fraction" else "")
                 .that(actualCrossOffset)
                 .isEqualTo(crossAxis.map { it.first to it.second.roundToInt() })
         }
@@ -2024,16 +1702,13 @@
 
     private fun assertLayoutInfoPositions(vararg offsets: Pair<Any, Float>) {
         rule.runOnIdle {
-            assertThat(visibleItemsOffsets).isEqualTo(offsets.map {
-                it.first to it.second.roundToInt()
-            })
+            assertThat(visibleItemsOffsets)
+                .isEqualTo(offsets.map { it.first to it.second.roundToInt() })
         }
     }
 
     private val visibleItemsOffsets: List<Pair<Any, Int>>
-        get() = state.layoutInfo.visibleItemsInfo.map {
-            it.key to it.offset
-        }
+        get() = state.layoutInfo.visibleItemsInfo.map { it.key to it.offset }
 
     private fun onAnimationFrame(duration: Long = Duration, onFrame: (fraction: Float) -> Unit) {
         require(duration.mod(FrameDuration) == 0L)
@@ -2064,35 +1739,37 @@
         endPadding: Dp = 0.dp,
         content: LazyListScope.() -> Unit
     ) {
-        val container: @Composable (@Composable () -> Unit) -> Unit = if (isInLookaheadScope) {
-            { LookaheadScope { it() } }
-        } else {
-            { it() }
-        }
+        val container: @Composable (@Composable () -> Unit) -> Unit =
+            if (isInLookaheadScope) {
+                { LookaheadScope { it() } }
+            } else {
+                { it() }
+            }
         container {
             state = rememberLazyListState(startIndex)
             if (isVertical) {
                 val verticalArrangement =
                     arrangement ?: if (!reverseLayout) Arrangement.Top else Arrangement.Bottom
-                val horizontalAlignment = if (crossAxisAlignment == CrossAxisAlignment.Start) {
-                    Alignment.Start
-                } else if (crossAxisAlignment == CrossAxisAlignment.Center) {
-                    Alignment.CenterHorizontally
-                } else {
-                    Alignment.End
-                }
+                val horizontalAlignment =
+                    if (crossAxisAlignment == CrossAxisAlignment.Start) {
+                        Alignment.Start
+                    } else if (crossAxisAlignment == CrossAxisAlignment.Center) {
+                        Alignment.CenterHorizontally
+                    } else {
+                        Alignment.End
+                    }
                 LazyColumn(
                     state = state,
-                    modifier = Modifier
-                        .requiredHeightIn(min = minSize, max = maxSize)
-                        .then(
-                            if (crossAxisSize != Dp.Unspecified) {
-                                Modifier.requiredWidth(crossAxisSize)
-                            } else {
-                                Modifier.fillMaxWidth()
-                            }
-                        )
-                        .testTag(ContainerTag),
+                    modifier =
+                        Modifier.requiredHeightIn(min = minSize, max = maxSize)
+                            .then(
+                                if (crossAxisSize != Dp.Unspecified) {
+                                    Modifier.requiredWidth(crossAxisSize)
+                                } else {
+                                    Modifier.fillMaxWidth()
+                                }
+                            )
+                            .testTag(ContainerTag),
                     verticalArrangement = verticalArrangement,
                     horizontalAlignment = horizontalAlignment,
                     reverseLayout = reverseLayout,
@@ -2102,25 +1779,26 @@
             } else {
                 val horizontalArrangement =
                     arrangement ?: if (!reverseLayout) Arrangement.Start else Arrangement.End
-                val verticalAlignment = if (crossAxisAlignment == CrossAxisAlignment.Start) {
-                    Alignment.Top
-                } else if (crossAxisAlignment == CrossAxisAlignment.Center) {
-                    Alignment.CenterVertically
-                } else {
-                    Alignment.Bottom
-                }
+                val verticalAlignment =
+                    if (crossAxisAlignment == CrossAxisAlignment.Start) {
+                        Alignment.Top
+                    } else if (crossAxisAlignment == CrossAxisAlignment.Center) {
+                        Alignment.CenterVertically
+                    } else {
+                        Alignment.Bottom
+                    }
                 LazyRow(
                     state = state,
-                    modifier = Modifier
-                        .requiredWidthIn(min = minSize, max = maxSize)
-                        .then(
-                            if (crossAxisSize != Dp.Unspecified) {
-                                Modifier.requiredHeight(crossAxisSize)
-                            } else {
-                                Modifier.fillMaxHeight()
-                            }
-                        )
-                        .testTag(ContainerTag),
+                    modifier =
+                        Modifier.requiredWidthIn(min = minSize, max = maxSize)
+                            .then(
+                                if (crossAxisSize != Dp.Unspecified) {
+                                    Modifier.requiredHeight(crossAxisSize)
+                                } else {
+                                    Modifier.fillMaxHeight()
+                                }
+                            )
+                            .testTag(ContainerTag),
                     horizontalArrangement = horizontalArrangement,
                     verticalAlignment = verticalAlignment,
                     reverseLayout = reverseLayout,
@@ -2140,23 +1818,19 @@
     ) {
         Box(
             if (animSpec != null) {
-                Modifier.animateItem(
-                    fadeInSpec = null,
-                    fadeOutSpec = null,
-                    placementSpec = animSpec
-                )
-            } else {
-                Modifier
-            }
+                    Modifier.animateItem(
+                        fadeInSpec = null,
+                        fadeOutSpec = null,
+                        placementSpec = animSpec
+                    )
+                } else {
+                    Modifier
+                }
                 .then(
                     if (isVertical) {
-                        Modifier
-                            .requiredHeight(size)
-                            .requiredWidth(crossAxisSize)
+                        Modifier.requiredHeight(size).requiredWidth(crossAxisSize)
                     } else {
-                        Modifier
-                            .requiredWidth(size)
-                            .requiredHeight(crossAxisSize)
+                        Modifier.requiredWidth(size).requiredHeight(crossAxisSize)
                     }
                 )
                 .testTag(tag.toString())
@@ -2172,13 +1846,14 @@
     companion object {
         @JvmStatic
         @Parameterized.Parameters(name = "{0}")
-        fun params() = arrayOf(
-            Config(isVertical = true, reverseLayout = false, isInLookaheadScope = false),
-            Config(isVertical = false, reverseLayout = false, isInLookaheadScope = false),
-            Config(isVertical = true, reverseLayout = true, isInLookaheadScope = false),
-            Config(isVertical = false, reverseLayout = true, isInLookaheadScope = false),
-            Config(isVertical = true, reverseLayout = false, isInLookaheadScope = true)
-        )
+        fun params() =
+            arrayOf(
+                Config(isVertical = true, reverseLayout = false, isInLookaheadScope = false),
+                Config(isVertical = false, reverseLayout = false, isInLookaheadScope = false),
+                Config(isVertical = true, reverseLayout = true, isInLookaheadScope = false),
+                Config(isVertical = false, reverseLayout = true, isInLookaheadScope = false),
+                Config(isVertical = true, reverseLayout = false, isInLookaheadScope = true)
+            )
 
         class Config(
             val isVertical: Boolean,
@@ -2197,9 +1872,8 @@
 private val Duration = 64L // 4 frames, so we get 0f, 0.25f, 0.5f, 0.75f and 1f fractions
 private val AnimSpec = tween<IntOffset>(Duration.toInt(), easing = LinearEasing)
 private val ContainerTag = "container"
-private val NodesWithTagMatcher = SemanticsMatcher("NodesWithTag") {
-    it.config.contains(SemanticsProperties.TestTag)
-}
+private val NodesWithTagMatcher =
+    SemanticsMatcher("NodesWithTag") { it.config.contains(SemanticsProperties.TestTag) }
 
 private enum class CrossAxisAlignment {
     Start,
@@ -2216,19 +1890,16 @@
     val frameInNanos = TimeUnit.MILLISECONDS.toNanos(FrameDuration)
     val vectorized = vectorize(converter = IntOffset.VectorConverter)
     return IntOffset.VectorConverter.convertFromVector(
-        vectorized.getValueFromNanos(
-            playTimeNanos = frameInNanos * frameCount,
-            initialValue = IntOffset.VectorConverter.convertToVector(
-                IntOffset(0, from.toInt())
-            ),
-            targetValue = IntOffset.VectorConverter.convertToVector(
-                IntOffset(0, to.toInt())
-            ),
-            initialVelocity = IntOffset.VectorConverter.convertToVector(
-                initialVelocity
+            vectorized.getValueFromNanos(
+                playTimeNanos = frameInNanos * frameCount,
+                initialValue =
+                    IntOffset.VectorConverter.convertToVector(IntOffset(0, from.toInt())),
+                targetValue = IntOffset.VectorConverter.convertToVector(IntOffset(0, to.toInt())),
+                initialVelocity = IntOffset.VectorConverter.convertToVector(initialVelocity)
             )
         )
-    ).y.toFloat()
+        .y
+        .toFloat()
 }
 
 internal fun SpringSpec<IntOffset>.getVelocityAtFrame(
@@ -2242,15 +1913,9 @@
     return IntOffset.VectorConverter.convertFromVector(
         vectorized.getVelocityFromNanos(
             playTimeNanos = frameInNanos * frameCount,
-            initialValue = IntOffset.VectorConverter.convertToVector(
-                IntOffset(0, from.toInt())
-            ),
-            targetValue = IntOffset.VectorConverter.convertToVector(
-                IntOffset(0, to.toInt())
-            ),
-            initialVelocity = IntOffset.VectorConverter.convertToVector(
-                initialVelocity
-            )
+            initialValue = IntOffset.VectorConverter.convertToVector(IntOffset(0, from.toInt())),
+            targetValue = IntOffset.VectorConverter.convertToVector(IntOffset(0, to.toInt())),
+            initialVelocity = IntOffset.VectorConverter.convertToVector(initialVelocity)
         )
     )
 }
diff --git a/compose/foundation/foundation/integration-tests/lazy-tests/src/androidTest/kotlin/androidx/compose/foundation/lazy/list/LazyListLayoutInfoTest.kt b/compose/foundation/foundation/integration-tests/lazy-tests/src/androidTest/kotlin/androidx/compose/foundation/lazy/list/LazyListLayoutInfoTest.kt
index 09a592f..4e85c574 100644
--- a/compose/foundation/foundation/integration-tests/lazy-tests/src/androidTest/kotlin/androidx/compose/foundation/lazy/list/LazyListLayoutInfoTest.kt
+++ b/compose/foundation/foundation/integration-tests/lazy-tests/src/androidTest/kotlin/androidx/compose/foundation/lazy/list/LazyListLayoutInfoTest.kt
@@ -45,18 +45,18 @@
 
 @MediumTest
 @RunWith(Parameterized::class)
-class LazyListLayoutInfoTest(
-    param: LayoutInfoTestParam
-) : BaseLazyListTestWithOrientation(param.orientation) {
+class LazyListLayoutInfoTest(param: LayoutInfoTestParam) :
+    BaseLazyListTestWithOrientation(param.orientation) {
     companion object {
         @JvmStatic
         @Parameterized.Parameters(name = "{0}")
-        fun initParameters(): Array<Any> = arrayOf(
-            LayoutInfoTestParam(Orientation.Vertical, false),
-            LayoutInfoTestParam(Orientation.Vertical, true),
-            LayoutInfoTestParam(Orientation.Horizontal, false),
-            LayoutInfoTestParam(Orientation.Horizontal, true),
-        )
+        fun initParameters(): Array<Any> =
+            arrayOf(
+                LayoutInfoTestParam(Orientation.Vertical, false),
+                LayoutInfoTestParam(Orientation.Vertical, true),
+                LayoutInfoTestParam(Orientation.Horizontal, false),
+                LayoutInfoTestParam(Orientation.Horizontal, true),
+            )
     }
 
     private val reverseLayout = param.reverseLayout
@@ -66,9 +66,7 @@
 
     @Before
     fun before() {
-        with(rule.density) {
-            itemSizeDp = itemSizePx.toDp()
-        }
+        with(rule.density) { itemSizeDp = itemSizePx.toDp() }
     }
 
     @Test
@@ -80,15 +78,11 @@
                 reverseLayout = reverseLayout,
                 modifier = Modifier.requiredSize(itemSizeDp * 3.5f)
             ) {
-                items((0..5).toList()) {
-                    Box(Modifier.requiredSize(itemSizeDp))
-                }
+                items((0..5).toList()) { Box(Modifier.requiredSize(itemSizeDp)) }
             }
         }
 
-        rule.runOnIdle {
-            state.layoutInfo.assertVisibleItems(count = 4)
-        }
+        rule.runOnIdle { state.layoutInfo.assertVisibleItems(count = 4) }
     }
 
     @Test
@@ -100,16 +94,12 @@
                 reverseLayout = reverseLayout,
                 modifier = Modifier.requiredSize(itemSizeDp * 3.5f)
             ) {
-                items((0..5).toList()) {
-                    Box(Modifier.requiredSize(itemSizeDp))
-                }
+                items((0..5).toList()) { Box(Modifier.requiredSize(itemSizeDp)) }
             }
         }
 
         rule.runOnIdle {
-            runBlocking {
-                state.scrollToItem(1, 10)
-            }
+            runBlocking { state.scrollToItem(1, 10) }
             state.layoutInfo.assertVisibleItems(count = 4, startIndex = 1, startOffset = -10)
         }
     }
@@ -124,21 +114,18 @@
                 spacedBy = itemSizeDp,
                 modifier = Modifier.requiredSize(itemSizeDp * 3.5f)
             ) {
-                items((0..5).toList()) {
-                    Box(Modifier.requiredSize(itemSizeDp))
-                }
+                items((0..5).toList()) { Box(Modifier.requiredSize(itemSizeDp)) }
             }
         }
 
-        rule.runOnIdle {
-            state.layoutInfo.assertVisibleItems(count = 2, spacing = itemSizePx)
-        }
+        rule.runOnIdle { state.layoutInfo.assertVisibleItems(count = 2, spacing = itemSizePx) }
     }
 
     @Composable
     fun ObservingFun(state: LazyListState, currentInfo: StableRef<LazyListLayoutInfo?>) {
         currentInfo.value = state.layoutInfo
     }
+
     @Test
     fun visibleItemsAreObservableWhenWeScroll() {
         lateinit var state: LazyListState
@@ -149,9 +136,7 @@
                 reverseLayout = reverseLayout,
                 modifier = Modifier.requiredSize(itemSizeDp * 3.5f)
             ) {
-                items((0..5).toList()) {
-                    Box(Modifier.requiredSize(itemSizeDp))
-                }
+                items((0..5).toList()) { Box(Modifier.requiredSize(itemSizeDp)) }
             }
             ObservingFun(state, currentInfo)
         }
@@ -159,9 +144,7 @@
         rule.runOnIdle {
             // empty it here and scrolling should invoke observingFun again
             currentInfo.value = null
-            runBlocking {
-                state.scrollToItem(1, 0)
-            }
+            runBlocking { state.scrollToItem(1, 0) }
         }
 
         rule.runOnIdle {
@@ -184,9 +167,7 @@
                 reverseLayout = reverseLayout,
                 state = rememberLazyListState().also { state = it }
             ) {
-                item {
-                    Box(Modifier.requiredSize(size))
-                }
+                item { Box(Modifier.requiredSize(size)) }
             }
             observingFun()
         }
@@ -213,9 +194,7 @@
                 reverseLayout = reverseLayout,
                 state = rememberLazyListState().also { state = it }
             ) {
-                items((0 until count).toList()) {
-                    Box(Modifier.requiredSize(10.dp))
-                }
+                items((0 until count).toList()) { Box(Modifier.requiredSize(10.dp)) }
             }
         }
 
@@ -224,9 +203,7 @@
             count = 20
         }
 
-        rule.runOnIdle {
-            assertThat(state.layoutInfo.totalItemsCount).isEqualTo(20)
-        }
+        rule.runOnIdle { assertThat(state.layoutInfo.totalItemsCount).isEqualTo(20) }
     }
 
     @Test
@@ -240,18 +217,17 @@
                 reverseLayout = reverseLayout,
                 state = rememberLazyListState().also { state = it }
             ) {
-                items((0..3).toList()) {
-                    Box(Modifier.requiredSize(sizeDp))
-                }
+                items((0..3).toList()) { Box(Modifier.requiredSize(sizeDp)) }
             }
         }
 
         rule.runOnIdle {
             assertThat(state.layoutInfo.viewportStartOffset).isEqualTo(0)
             assertThat(state.layoutInfo.viewportEndOffset).isEqualTo(sizePx)
-            assertThat(state.layoutInfo.viewportSize).isEqualTo(
-                if (vertical) IntSize(sizePx * 2, sizePx) else IntSize(sizePx, sizePx * 2)
-            )
+            assertThat(state.layoutInfo.viewportSize)
+                .isEqualTo(
+                    if (vertical) IntSize(sizePx * 2, sizePx) else IntSize(sizePx, sizePx * 2)
+                )
         }
     }
 
@@ -261,28 +237,29 @@
         val startPaddingPx = 10
         val endPaddingPx = 15
         val sizeDp = with(rule.density) { sizePx.toDp() }
-        val beforeContentPaddingDp = with(rule.density) {
-            if (!reverseLayout) startPaddingPx.toDp() else endPaddingPx.toDp()
-        }
-        val afterContentPaddingDp = with(rule.density) {
-            if (!reverseLayout) endPaddingPx.toDp() else startPaddingPx.toDp()
-        }
+        val beforeContentPaddingDp =
+            with(rule.density) {
+                if (!reverseLayout) startPaddingPx.toDp() else endPaddingPx.toDp()
+            }
+        val afterContentPaddingDp =
+            with(rule.density) {
+                if (!reverseLayout) endPaddingPx.toDp() else startPaddingPx.toDp()
+            }
         lateinit var state: LazyListState
         rule.setContent {
             LazyColumnOrRow(
                 Modifier.mainAxisSize(sizeDp).crossAxisSize(sizeDp * 2),
-                contentPadding = PaddingValues(
-                    beforeContent = beforeContentPaddingDp,
-                    afterContent = afterContentPaddingDp,
-                    beforeContentCrossAxis = 2.dp,
-                    afterContentCrossAxis = 2.dp
-                ),
+                contentPadding =
+                    PaddingValues(
+                        beforeContent = beforeContentPaddingDp,
+                        afterContent = afterContentPaddingDp,
+                        beforeContentCrossAxis = 2.dp,
+                        afterContentCrossAxis = 2.dp
+                    ),
                 reverseLayout = reverseLayout,
                 state = rememberLazyListState().also { state = it }
             ) {
-                items((0..3).toList()) {
-                    Box(Modifier.requiredSize(sizeDp))
-                }
+                items((0..3).toList()) { Box(Modifier.requiredSize(sizeDp)) }
             }
         }
 
@@ -290,9 +267,10 @@
             assertThat(state.layoutInfo.viewportStartOffset).isEqualTo(-startPaddingPx)
             assertThat(state.layoutInfo.viewportEndOffset).isEqualTo(sizePx - startPaddingPx)
             assertThat(state.layoutInfo.afterContentPadding).isEqualTo(endPaddingPx)
-            assertThat(state.layoutInfo.viewportSize).isEqualTo(
-                if (vertical) IntSize(sizePx * 2, sizePx) else IntSize(sizePx, sizePx * 2)
-            )
+            assertThat(state.layoutInfo.viewportSize)
+                .isEqualTo(
+                    if (vertical) IntSize(sizePx * 2, sizePx) else IntSize(sizePx, sizePx * 2)
+                )
         }
     }
 
@@ -300,11 +278,9 @@
     fun emptyItemsInVisibleItemsInfo() {
         lateinit var state: LazyListState
         rule.setContent {
-            LazyColumnOrRow(
-                state = rememberLazyListState().also { state = it }
-            ) {
+            LazyColumnOrRow(state = rememberLazyListState().also { state = it }) {
                 item { Box(Modifier) }
-                item { }
+                item {}
             }
         }
 
@@ -322,23 +298,25 @@
         val startPaddingPx = 10
         val endPaddingPx = 15
         val sizeDp = with(rule.density) { sizePx.toDp() }
-        val beforeContentPaddingDp = with(rule.density) {
-            if (!reverseLayout) startPaddingPx.toDp() else endPaddingPx.toDp()
-        }
-        val afterContentPaddingDp = with(rule.density) {
-            if (!reverseLayout) endPaddingPx.toDp() else startPaddingPx.toDp()
-        }
+        val beforeContentPaddingDp =
+            with(rule.density) {
+                if (!reverseLayout) startPaddingPx.toDp() else endPaddingPx.toDp()
+            }
+        val afterContentPaddingDp =
+            with(rule.density) {
+                if (!reverseLayout) endPaddingPx.toDp() else startPaddingPx.toDp()
+            }
         rule.setContent {
             LazyColumnOrRow(
                 Modifier.mainAxisSize(sizeDp).crossAxisSize(sizeDp * 2),
                 state = rememberLazyListState().also { state = it },
                 reverseLayout = reverseLayout,
-                contentPadding = PaddingValues(
-                    beforeContent = beforeContentPaddingDp,
-                    afterContent = afterContentPaddingDp
-                )
-            ) {
-            }
+                contentPadding =
+                    PaddingValues(
+                        beforeContent = beforeContentPaddingDp,
+                        afterContent = afterContentPaddingDp
+                    )
+            ) {}
         }
 
         rule.runOnIdle {
@@ -346,9 +324,10 @@
             assertThat(state.layoutInfo.viewportEndOffset).isEqualTo(sizePx - startPaddingPx)
             assertThat(state.layoutInfo.beforeContentPadding).isEqualTo(startPaddingPx)
             assertThat(state.layoutInfo.afterContentPadding).isEqualTo(endPaddingPx)
-            assertThat(state.layoutInfo.viewportSize).isEqualTo(
-                if (vertical) IntSize(sizePx * 2, sizePx) else IntSize(sizePx, sizePx * 2)
-            )
+            assertThat(state.layoutInfo.viewportSize)
+                .isEqualTo(
+                    if (vertical) IntSize(sizePx * 2, sizePx) else IntSize(sizePx, sizePx * 2)
+                )
         }
     }
 
@@ -359,25 +338,26 @@
         val startPaddingPx = 10
         val endPaddingPx = 15
         val sizeDp = with(rule.density) { sizePx.toDp() }
-        val beforeContentPaddingDp = with(rule.density) {
-            if (!reverseLayout) startPaddingPx.toDp() else endPaddingPx.toDp()
-        }
-        val afterContentPaddingDp = with(rule.density) {
-            if (!reverseLayout) endPaddingPx.toDp() else startPaddingPx.toDp()
-        }
+        val beforeContentPaddingDp =
+            with(rule.density) {
+                if (!reverseLayout) startPaddingPx.toDp() else endPaddingPx.toDp()
+            }
+        val afterContentPaddingDp =
+            with(rule.density) {
+                if (!reverseLayout) endPaddingPx.toDp() else startPaddingPx.toDp()
+            }
         rule.setContent {
             LazyColumnOrRow(
                 Modifier.mainAxisSize(sizeDp).crossAxisSize(sizeDp * 2),
                 state = rememberLazyListState().also { state = it },
                 reverseLayout = reverseLayout,
-                contentPadding = PaddingValues(
-                    beforeContent = beforeContentPaddingDp,
-                    afterContent = afterContentPaddingDp
-                )
+                contentPadding =
+                    PaddingValues(
+                        beforeContent = beforeContentPaddingDp,
+                        afterContent = afterContentPaddingDp
+                    )
             ) {
-                item {
-                    Box(Modifier.size(sizeDp / 2))
-                }
+                item { Box(Modifier.size(sizeDp / 2)) }
             }
         }
 
@@ -386,9 +366,10 @@
             assertThat(state.layoutInfo.viewportEndOffset).isEqualTo(sizePx - startPaddingPx)
             assertThat(state.layoutInfo.beforeContentPadding).isEqualTo(startPaddingPx)
             assertThat(state.layoutInfo.afterContentPadding).isEqualTo(endPaddingPx)
-            assertThat(state.layoutInfo.viewportSize).isEqualTo(
-                if (vertical) IntSize(sizePx * 2, sizePx) else IntSize(sizePx, sizePx * 2)
-            )
+            assertThat(state.layoutInfo.viewportSize)
+                .isEqualTo(
+                    if (vertical) IntSize(sizePx * 2, sizePx) else IntSize(sizePx, sizePx * 2)
+                )
         }
     }
 
@@ -401,15 +382,11 @@
                 reverseLayout = reverseLayout,
                 modifier = Modifier.requiredSize(itemSizeDp * 3.5f)
             ) {
-                items((0..5).toList()) {
-                    Box(Modifier.requiredSize(itemSizeDp))
-                }
+                items((0..5).toList()) { Box(Modifier.requiredSize(itemSizeDp)) }
             }
         }
 
-        rule.runOnIdle {
-            assertThat(state.layoutInfo.reverseLayout).isEqualTo(reverseLayout)
-        }
+        rule.runOnIdle { assertThat(state.layoutInfo.reverseLayout).isEqualTo(reverseLayout) }
     }
 
     @Test
@@ -420,9 +397,7 @@
                 state = rememberLazyListState().also { state = it },
                 modifier = Modifier.requiredSize(itemSizeDp * 3.5f)
             ) {
-                items((0..5).toList()) {
-                    Box(Modifier.requiredSize(itemSizeDp))
-                }
+                items((0..5).toList()) { Box(Modifier.requiredSize(itemSizeDp)) }
             }
         }
 
@@ -443,12 +418,8 @@
                 state = rememberLazyListState().also { state = it },
                 modifier = Modifier.requiredSize(itemSizeDp * 3f)
             ) {
-                items(2, contentType = { it }) {
-                    Box(Modifier.requiredSize(itemSizeDp))
-                }
-                item {
-                    Box(Modifier.requiredSize(itemSizeDp))
-                }
+                items(2, contentType = { it }) { Box(Modifier.requiredSize(itemSizeDp)) }
+                item { Box(Modifier.requiredSize(itemSizeDp)) }
             }
         }
 
@@ -468,9 +439,7 @@
                 reverseArrangement = true,
                 state = state
             ) {
-                items(4) {
-                    Box(Modifier.requiredSize(itemSizeDp))
-                }
+                items(4) { Box(Modifier.requiredSize(itemSizeDp)) }
             }
         }
 
@@ -494,7 +463,8 @@
         var currentOffset = startOffset
         visibleItemsInfo.forEach {
             assertThat(it.index).isEqualTo(currentIndex)
-            assertWithMessage("Offset of item $currentIndex").that(it.offset)
+            assertWithMessage("Offset of item $currentIndex")
+                .that(it.offset)
                 .isEqualTo(currentOffset)
             assertThat(it.size).isEqualTo(expectedSize)
             currentIndex++
@@ -503,14 +473,10 @@
     }
 }
 
-class LayoutInfoTestParam(
-    val orientation: Orientation,
-    val reverseLayout: Boolean
-) {
+class LayoutInfoTestParam(val orientation: Orientation, val reverseLayout: Boolean) {
     override fun toString(): String {
         return "orientation=$orientation;reverseLayout=$reverseLayout"
     }
 }
 
-@Stable
-class StableRef<T>(var value: T)
+@Stable class StableRef<T>(var value: T)
diff --git a/compose/foundation/foundation/integration-tests/lazy-tests/src/androidTest/kotlin/androidx/compose/foundation/lazy/list/LazyListNestedPrefetchingTest.kt b/compose/foundation/foundation/integration-tests/lazy-tests/src/androidTest/kotlin/androidx/compose/foundation/lazy/list/LazyListNestedPrefetchingTest.kt
index 229f84a..d005438 100644
--- a/compose/foundation/foundation/integration-tests/lazy-tests/src/androidTest/kotlin/androidx/compose/foundation/lazy/list/LazyListNestedPrefetchingTest.kt
+++ b/compose/foundation/foundation/integration-tests/lazy-tests/src/androidTest/kotlin/androidx/compose/foundation/lazy/list/LazyListNestedPrefetchingTest.kt
@@ -45,17 +45,17 @@
 
 @LargeTest
 @RunWith(Parameterized::class)
-class LazyListNestedPrefetchingTest(
-    val config: Config
-) : BaseLazyListTestWithOrientation(config.orientation) {
+class LazyListNestedPrefetchingTest(val config: Config) :
+    BaseLazyListTestWithOrientation(config.orientation) {
 
     companion object {
         @JvmStatic
         @Parameterized.Parameters(name = "{0}")
-        fun initParameters(): Array<Any> = arrayOf(
-            Config(Orientation.Vertical),
-            Config(Orientation.Horizontal),
-        )
+        fun initParameters(): Array<Any> =
+            arrayOf(
+                Config(Orientation.Vertical),
+                Config(Orientation.Horizontal),
+            )
 
         class Config(
             val orientation: Orientation,
@@ -66,6 +66,7 @@
 
     sealed interface Action {
         data class Compose(val index: Int, val nestedIndex: Int? = null) : Action
+
         data class Measure(val index: Int, val nestedIndex: Int? = null) : Action
     }
 
@@ -75,9 +76,10 @@
     private val scheduler = TestPrefetchScheduler()
 
     @OptIn(ExperimentalFoundationApi::class)
-    private val strategy = object : LazyListPrefetchStrategy by LazyListPrefetchStrategy() {
-        override val prefetchScheduler: PrefetchScheduler = scheduler
-    }
+    private val strategy =
+        object : LazyListPrefetchStrategy by LazyListPrefetchStrategy() {
+            override val prefetchScheduler: PrefetchScheduler = scheduler
+        }
 
     @OptIn(ExperimentalFoundationApi::class)
     private fun createState(): LazyListState = LazyListState(prefetchStrategy = strategy)
@@ -89,34 +91,28 @@
 
         val prefetchIndex = 2
         val actions = trackingActions {
-            rule.runOnIdle {
-                runBlocking {
-                    state.scrollBy(5f)
-                }
-            }
+            rule.runOnIdle { runBlocking { state.scrollBy(5f) } }
 
             waitForPrefetch()
         }
 
         // We want to make sure nested children were precomposed before the parent was premeasured
         // (which would force them all to compose in a single block of work in premeasure)
-        assertThat(actions).containsExactly(
-            Action.Compose(prefetchIndex),
-            Action.Compose(prefetchIndex, 0),
-            Action.Compose(prefetchIndex, 1),
-            Action.Measure(prefetchIndex),
-            Action.Measure(prefetchIndex, 0),
-            Action.Measure(prefetchIndex, 1),
-        ).inOrder()
+        assertThat(actions)
+            .containsExactly(
+                Action.Compose(prefetchIndex),
+                Action.Compose(prefetchIndex, 0),
+                Action.Compose(prefetchIndex, 1),
+                Action.Measure(prefetchIndex),
+                Action.Measure(prefetchIndex, 0),
+                Action.Measure(prefetchIndex, 1),
+            )
+            .inOrder()
 
-        rule.onNodeWithTag(tagFor(prefetchIndex))
-            .assertExists()
-        rule.onNodeWithTag(tagFor(2, 0))
-            .assertExists()
-        rule.onNodeWithTag(tagFor(2, 1))
-            .assertExists()
-        rule.onNodeWithTag(tagFor(2, 2))
-            .assertDoesNotExist()
+        rule.onNodeWithTag(tagFor(prefetchIndex)).assertExists()
+        rule.onNodeWithTag(tagFor(2, 0)).assertExists()
+        rule.onNodeWithTag(tagFor(2, 1)).assertExists()
+        rule.onNodeWithTag(tagFor(2, 2)).assertDoesNotExist()
     }
 
     @Test
@@ -174,32 +170,29 @@
         composeList(
             state,
             createNestedLazyListState = {
-                LazyListState(
-                    prefetchStrategy = LazyListPrefetchStrategy(1)
-                )
-            })
+                LazyListState(prefetchStrategy = LazyListPrefetchStrategy(1))
+            }
+        )
 
         val prefetchIndex = 2
         val actions = trackingActions {
-            rule.runOnIdle {
-                runBlocking {
-                    state.scrollBy(5f)
-                }
-            }
+            rule.runOnIdle { runBlocking { state.scrollBy(5f) } }
 
             waitForPrefetch()
         }
 
         // Since the nested prefetch count on the strategy is 1, we only expect index 0 to be
         // precomposed before measure
-        assertThat(actions).containsExactly(
-            Action.Compose(prefetchIndex),
-            Action.Compose(prefetchIndex, 0),
-            Action.Measure(prefetchIndex),
-            Action.Measure(prefetchIndex, 0),
-            Action.Compose(prefetchIndex, 1),
-            Action.Measure(prefetchIndex, 1),
-        ).inOrder()
+        assertThat(actions)
+            .containsExactly(
+                Action.Compose(prefetchIndex),
+                Action.Compose(prefetchIndex, 0),
+                Action.Measure(prefetchIndex),
+                Action.Measure(prefetchIndex, 0),
+                Action.Compose(prefetchIndex, 1),
+                Action.Measure(prefetchIndex, 1),
+            )
+            .inOrder()
     }
 
     @OptIn(ExperimentalFoundationApi::class)
@@ -214,67 +207,58 @@
                 LazyListState(
                     prefetchStrategy = NestedPrefetchWithConstraintsStrategy(nestedConstraints)
                 )
-            })
+            }
+        )
 
         val prefetchIndex = 2
         val actions = trackingActions {
-            rule.runOnIdle {
-                runBlocking {
-                    state.scrollBy(5f)
-                }
-            }
+            rule.runOnIdle { runBlocking { state.scrollBy(5f) } }
 
             waitForPrefetch()
         }
 
-        assertThat(actions).containsExactly(
-            Action.Compose(prefetchIndex),
-            Action.Compose(prefetchIndex, 0),
-            Action.Measure(prefetchIndex, 0),
-            Action.Compose(prefetchIndex, 1),
-            Action.Measure(prefetchIndex, 1),
-            Action.Measure(prefetchIndex),
-            // Extra measure calls here since we didn't actually provide the right Constraints
-            Action.Measure(prefetchIndex, 0),
-            Action.Measure(prefetchIndex, 1),
-        ).inOrder()
+        assertThat(actions)
+            .containsExactly(
+                Action.Compose(prefetchIndex),
+                Action.Compose(prefetchIndex, 0),
+                Action.Measure(prefetchIndex, 0),
+                Action.Compose(prefetchIndex, 1),
+                Action.Measure(prefetchIndex, 1),
+                Action.Measure(prefetchIndex),
+                // Extra measure calls here since we didn't actually provide the right Constraints
+                Action.Measure(prefetchIndex, 0),
+                Action.Measure(prefetchIndex, 1),
+            )
+            .inOrder()
     }
 
     @Test
     fun nestedPrefetchStartsFromFirstVisibleItemIndex() {
         val state = createState()
-        composeList(
-            state,
-            createNestedLazyListState = {
-                LazyListState(firstVisibleItemIndex = 5)
-            })
+        composeList(state, createNestedLazyListState = { LazyListState(firstVisibleItemIndex = 5) })
 
         val prefetchIndex = 2
         val actions = trackingActions {
-            rule.runOnIdle {
-                runBlocking {
-                    state.scrollBy(5f)
-                }
-            }
+            rule.runOnIdle { runBlocking { state.scrollBy(5f) } }
 
             waitForPrefetch()
         }
 
-        assertThat(actions).containsExactly(
-            Action.Compose(prefetchIndex),
-            Action.Compose(prefetchIndex, 5),
-            Action.Compose(prefetchIndex, 6),
-            Action.Measure(prefetchIndex),
-            Action.Measure(prefetchIndex, 5),
-            Action.Measure(prefetchIndex, 6),
-        ).inOrder()
+        assertThat(actions)
+            .containsExactly(
+                Action.Compose(prefetchIndex),
+                Action.Compose(prefetchIndex, 5),
+                Action.Compose(prefetchIndex, 6),
+                Action.Measure(prefetchIndex),
+                Action.Measure(prefetchIndex, 5),
+                Action.Measure(prefetchIndex, 6),
+            )
+            .inOrder()
     }
 
     private var actions: MutableList<Action>? = null
 
-    /**
-     * Returns the list of Actions performed during block()
-     */
+    /** Returns the list of Actions performed during block() */
     private fun trackingActions(block: () -> Unit): List<Action> {
         return mutableListOf<Action>().apply {
             actions = this
@@ -284,9 +268,7 @@
     }
 
     private fun waitForPrefetch() {
-        rule.runOnIdle {
-            scheduler.executeActiveRequests()
-        }
+        rule.runOnIdle { scheduler.executeActiveRequests() }
     }
 
     fun tagFor(index: Int, nestedIndex: Int? = null): String {
@@ -310,19 +292,18 @@
                     TrackActiveNodesEffect(index)
                     val nestedState = remember(index) { createNestedLazyListState(index) }
                     LazyColumnOrRow(
-                        modifier = Modifier
-                            .crossAxisSize(itemsSizeDp * 1.5f)
-                            .mainAxisSize(itemsSizeDp)
-                            .testTag(tagFor(index))
-                            .trackWhenMeasured(index),
+                        modifier =
+                            Modifier.crossAxisSize(itemsSizeDp * 1.5f)
+                                .mainAxisSize(itemsSizeDp)
+                                .testTag(tagFor(index))
+                                .trackWhenMeasured(index),
                         state = nestedState,
                         isCrossAxis = true,
                     ) {
                         items(100) { nestedIndex ->
                             TrackActiveNodesEffect(index, nestedIndex)
                             Spacer(
-                                Modifier
-                                    .mainAxisSize(itemsSizeDp)
+                                Modifier.mainAxisSize(itemsSizeDp)
                                     .crossAxisSize(itemsSizeDp)
                                     .testTag(tagFor(index, nestedIndex))
                                     .trackWhenMeasured(index, nestedIndex)
@@ -340,20 +321,17 @@
         DisposableEffect(tag) {
             activeNodes.add(tag)
             actions?.add(Action.Compose(index, nestedIndex))
-            onDispose {
-                activeNodes.remove(tag)
-            }
+            onDispose { activeNodes.remove(tag) }
         }
     }
 
     private fun Modifier.trackWhenMeasured(index: Int, nestedIndex: Int? = null): Modifier {
-        return this then Modifier.layout { measurable, constraints ->
-            actions?.add(Action.Measure(index, nestedIndex))
-            val placeable = measurable.measure(constraints)
-            layout(placeable.width, placeable.height) {
-                placeable.place(0, 0)
+        return this then
+            Modifier.layout { measurable, constraints ->
+                actions?.add(Action.Measure(index, nestedIndex))
+                val placeable = measurable.measure(constraints)
+                layout(placeable.width, placeable.height) { placeable.place(0, 0) }
             }
-        }
     }
 
     @OptIn(ExperimentalFoundationApi::class)
@@ -361,11 +339,9 @@
         private val childConstraints: Constraints,
         private val nestedPrefetchItemCount: Int = 2
     ) : LazyListPrefetchStrategy {
-        override fun LazyListPrefetchScope.onScroll(delta: Float, layoutInfo: LazyListLayoutInfo) {
-        }
+        override fun LazyListPrefetchScope.onScroll(delta: Float, layoutInfo: LazyListLayoutInfo) {}
 
-        override fun LazyListPrefetchScope.onVisibleItemsUpdated(layoutInfo: LazyListLayoutInfo) {
-        }
+        override fun LazyListPrefetchScope.onVisibleItemsUpdated(layoutInfo: LazyListLayoutInfo) {}
 
         override fun NestedPrefetchScope.onNestedPrefetch(firstVisibleItemIndex: Int) {
             repeat(nestedPrefetchItemCount) { i ->
diff --git a/compose/foundation/foundation/integration-tests/lazy-tests/src/androidTest/kotlin/androidx/compose/foundation/lazy/list/LazyListPinnableContainerTest.kt b/compose/foundation/foundation/integration-tests/lazy-tests/src/androidTest/kotlin/androidx/compose/foundation/lazy/list/LazyListPinnableContainerTest.kt
index 30c436c..5432606 100644
--- a/compose/foundation/foundation/integration-tests/lazy-tests/src/androidTest/kotlin/androidx/compose/foundation/lazy/list/LazyListPinnableContainerTest.kt
+++ b/compose/foundation/foundation/integration-tests/lazy-tests/src/androidTest/kotlin/androidx/compose/foundation/lazy/list/LazyListPinnableContainerTest.kt
@@ -58,8 +58,7 @@
         fun params() = arrayOf(true, false)
     }
 
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
     private var pinnableContainer: PinnableContainer? = null
 
@@ -78,9 +77,7 @@
     ) {
         setContent {
             if (useLookaheadScope) {
-                LookaheadScope {
-                    content()
-                }
+                LookaheadScope { content() }
             } else {
                 content()
             }
@@ -89,16 +86,10 @@
 
     @Composable
     fun Item(index: Int) {
-        Box(
-            Modifier
-                .size(itemSize)
-                .testTag("$index")
-        )
+        Box(Modifier.size(itemSize).testTag("$index"))
         DisposableEffect(index) {
             composed.add(index)
-            onDispose {
-                composed.remove(index)
-            }
+            onDispose { composed.remove(index) }
         }
     }
 
@@ -117,15 +108,11 @@
             }
         }
 
-        rule.runOnIdle {
-            requireNotNull(pinnableContainer).pin()
-        }
+        rule.runOnIdle { requireNotNull(pinnableContainer).pin() }
 
         rule.runOnIdle {
             assertThat(composed).contains(1)
-            runBlocking {
-                state.scrollToItem(3)
-            }
+            runBlocking { state.scrollToItem(3) }
         }
 
         rule.waitUntil {
@@ -138,10 +125,7 @@
             assertThat(composed).contains(1)
         }
 
-        rule.onNodeWithTag("1")
-            .assertExists()
-            .assertIsNotDisplayed()
-            .assertIsPlaced()
+        rule.onNodeWithTag("1").assertExists().assertIsNotDisplayed().assertIsPlaced()
     }
 
     @Test
@@ -159,15 +143,9 @@
             }
         }
 
-        rule.runOnIdle {
-            requireNotNull(pinnableContainer).pin()
-        }
+        rule.runOnIdle { requireNotNull(pinnableContainer).pin() }
 
-        rule.runOnIdle {
-            runBlocking {
-                state.scrollToItem(4)
-            }
-        }
+        rule.runOnIdle { runBlocking { state.scrollToItem(4) } }
 
         rule.waitUntil {
             // not visible items were disposed
@@ -198,11 +176,7 @@
             }
         }
 
-        rule.runOnIdle {
-            runBlocking {
-                state.scrollToItem(4)
-            }
-        }
+        rule.runOnIdle { runBlocking { state.scrollToItem(4) } }
 
         rule.waitUntil {
             // wait for not visible items to be disposed
@@ -215,15 +189,11 @@
         }
 
         rule.runOnIdle {
-            runBlocking {
-                state.scrollToItem(0)
-            }
+            runBlocking { state.scrollToItem(0) }
             if (useLookaheadScope) {
                 // Force another lookahead measure pass, because lookahead pass by design keeps
                 // content from last measure pass until it's no longer needed in either pass.
-                runBlocking {
-                    state.scrollToItem(0)
-                }
+                runBlocking { state.scrollToItem(0) }
             }
         }
 
@@ -257,32 +227,23 @@
             }
         }
 
-        val handle = rule.runOnIdle {
-            requireNotNull(pinnableContainer).pin()
-        }
+        val handle = rule.runOnIdle { requireNotNull(pinnableContainer).pin() }
 
-        rule.runOnIdle {
-            runBlocking {
-                state.scrollToItem(3)
-            }
-        }
+        rule.runOnIdle { runBlocking { state.scrollToItem(3) } }
 
         rule.waitUntil {
             // wait for not visible items to be disposed
             !composed.contains(0)
         }
 
-        rule.runOnIdle {
-            handle.release()
-        }
+        rule.runOnIdle { handle.release() }
 
         rule.waitUntil {
             // wait for unpinned item to be disposed
             !composed.contains(1)
         }
 
-        rule.onNodeWithTag("1")
-            .assertIsNotPlaced()
+        rule.onNodeWithTag("1").assertIsNotPlaced()
     }
 
     @Test
@@ -306,9 +267,7 @@
             requireNotNull(pinnableContainer).pin()
         }
 
-        rule.runOnIdle {
-            list = listOf(0, 3, 4, 1, 2)
-        }
+        rule.runOnIdle { list = listOf(0, 3, 4, 1, 2) }
 
         rule.waitUntil {
             // wait for not visible item to be disposed
@@ -319,8 +278,7 @@
             assertThat(composed).containsExactly(0, 3, 4, 2) // 2 is pinned
         }
 
-        rule.onNodeWithTag("2")
-            .assertIsPlaced()
+        rule.onNodeWithTag("2").assertIsPlaced()
     }
 
     @Test
@@ -338,21 +296,15 @@
             }
         }
 
-        rule.runOnIdle {
-            requireNotNull(pinnableContainer).pin()
-        }
+        rule.runOnIdle { requireNotNull(pinnableContainer).pin() }
 
         rule.runOnIdle {
             assertThat(composed).contains(3)
-            runBlocking {
-                state.scrollToItem(0)
-            }
+            runBlocking { state.scrollToItem(0) }
             if (useLookaheadScope) {
                 // Force another lookahead measure pass, because lookahead pass by design keeps
                 // content from last measure pass until it's no longer needed in either pass.
-                runBlocking {
-                    state.scrollToItem(0)
-                }
+                runBlocking { state.scrollToItem(0) }
             }
         }
 
@@ -371,8 +323,7 @@
             !composed.contains(2)
         }
 
-        rule.onNodeWithTag("2")
-            .assertIsNotPlaced()
+        rule.onNodeWithTag("2").assertIsNotPlaced()
     }
 
     @Test
@@ -390,19 +341,13 @@
             }
         }
 
-        rule.runOnIdle {
-            state = LazyListState()
-        }
+        rule.runOnIdle { state = LazyListState() }
 
-        rule.runOnIdle {
-            requireNotNull(pinnableContainer).pin()
-        }
+        rule.runOnIdle { requireNotNull(pinnableContainer).pin() }
 
         rule.runOnIdle {
             assertThat(composed).contains(1)
-            runBlocking {
-                state.scrollToItem(2)
-            }
+            runBlocking { state.scrollToItem(2) }
         }
 
         rule.waitUntil {
@@ -410,9 +355,7 @@
             !composed.contains(1)
         }
 
-        rule.runOnIdle {
-            assertThat(composed).contains(0)
-        }
+        rule.runOnIdle { assertThat(composed).contains(0) }
     }
 
     @Test
@@ -432,15 +375,11 @@
             }
         }
 
-        rule.runOnIdle {
-            requireNotNull(pinnableContainer).pin()
-        }
+        rule.runOnIdle { requireNotNull(pinnableContainer).pin() }
 
         rule.runOnIdle {
             assertThat(composed).contains(4)
-            runBlocking {
-                state.scrollToItem(6)
-            }
+            runBlocking { state.scrollToItem(6) }
         }
 
         rule.waitUntil {
@@ -448,14 +387,9 @@
             !composed.contains(4)
         }
 
-        rule.runOnIdle {
-            assertThat(composed).contains(3)
-        }
+        rule.runOnIdle { assertThat(composed).contains(3) }
 
-        rule.onNodeWithTag("3")
-            .assertExists()
-            .assertIsNotDisplayed()
-            .assertIsPlaced()
+        rule.onNodeWithTag("3").assertExists().assertIsNotDisplayed().assertIsPlaced()
     }
 
     @Test
@@ -477,15 +411,11 @@
         rule.runOnIdle {
             requireNotNull(pinnableContainer).pin()
             assertThat(composed).contains(4)
-            runBlocking {
-                state.scrollToItem(0)
-            }
+            runBlocking { state.scrollToItem(0) }
             if (useLookaheadScope) {
                 // Force another lookahead measure pass, because lookahead pass by design keeps
                 // content from last measure pass until it's no longer needed in either pass.
-                runBlocking {
-                    state.scrollToItem(0)
-                }
+                runBlocking { state.scrollToItem(0) }
             }
         }
 
@@ -494,17 +424,14 @@
             !composed.contains(4)
         }
 
-        rule.runOnIdle {
-            itemCount = 3
-        }
+        rule.runOnIdle { itemCount = 3 }
 
         rule.waitUntil {
             // wait for pinned item to be disposed
             !composed.contains(3)
         }
 
-        rule.onNodeWithTag("3")
-            .assertIsNotPlaced()
+        rule.onNodeWithTag("3").assertIsNotPlaced()
     }
 
     @Test
@@ -523,21 +450,16 @@
             }
         }
 
-        rule.runOnIdle {
-            requireNotNull(pinnableContainer).pin()
-        }
+        rule.runOnIdle { requireNotNull(pinnableContainer).pin() }
 
-        rule.runOnIdle {
-            items = listOf(0, 2)
-        }
+        rule.runOnIdle { items = listOf(0, 2) }
 
         rule.waitUntil {
             // wait for pinned item to be disposed
             !composed.contains(1)
         }
 
-        rule.onNodeWithTag("1")
-            .assertIsNotPlaced()
+        rule.onNodeWithTag("1").assertIsNotPlaced()
     }
 
     @Test
@@ -565,9 +487,7 @@
             // pinned 3 times in total
             handles.add(requireNotNull(pinnableContainer).pin())
             assertThat(composed).contains(0)
-            runBlocking {
-                state.scrollToItem(3)
-            }
+            runBlocking { state.scrollToItem(3) }
         }
 
         rule.waitUntil {
@@ -591,12 +511,13 @@
     @Test
     fun pinningIsPropagatedToParentContainer() {
         var parentPinned = false
-        val parentContainer = object : PinnableContainer {
-            override fun pin(): PinnedHandle {
-                parentPinned = true
-                return PinnedHandle { parentPinned = false }
+        val parentContainer =
+            object : PinnableContainer {
+                override fun pin(): PinnedHandle {
+                    parentPinned = true
+                    return PinnedHandle { parentPinned = false }
+                }
             }
-        }
         // Arrange.
         rule.setContentParameterized {
             CompositionLocalProvider(LocalPinnableContainer provides parentContainer) {
@@ -609,36 +530,34 @@
             }
         }
 
-        val handle = rule.runOnIdle {
-            requireNotNull(pinnableContainer).pin()
-        }
+        val handle = rule.runOnIdle { requireNotNull(pinnableContainer).pin() }
 
         rule.runOnIdle {
             assertThat(parentPinned).isTrue()
             handle.release()
         }
 
-        rule.runOnIdle {
-            assertThat(parentPinned).isFalse()
-        }
+        rule.runOnIdle { assertThat(parentPinned).isFalse() }
     }
 
     @Test
     fun parentContainerChange_pinningIsMaintained() {
         var parent1Pinned = false
-        val parent1Container = object : PinnableContainer {
-            override fun pin(): PinnedHandle {
-                parent1Pinned = true
-                return PinnedHandle { parent1Pinned = false }
+        val parent1Container =
+            object : PinnableContainer {
+                override fun pin(): PinnedHandle {
+                    parent1Pinned = true
+                    return PinnedHandle { parent1Pinned = false }
+                }
             }
-        }
         var parent2Pinned = false
-        val parent2Container = object : PinnableContainer {
-            override fun pin(): PinnedHandle {
-                parent2Pinned = true
-                return PinnedHandle { parent2Pinned = false }
+        val parent2Container =
+            object : PinnableContainer {
+                override fun pin(): PinnedHandle {
+                    parent2Pinned = true
+                    return PinnedHandle { parent2Pinned = false }
+                }
             }
-        }
         var parentContainer by mutableStateOf<PinnableContainer>(parent1Container)
         // Arrange.
         rule.setContentParameterized {
@@ -652,9 +571,7 @@
             }
         }
 
-        rule.runOnIdle {
-            requireNotNull(pinnableContainer).pin()
-        }
+        rule.runOnIdle { requireNotNull(pinnableContainer).pin() }
 
         rule.runOnIdle {
             assertThat(parent1Pinned).isTrue()
@@ -689,19 +606,13 @@
             }
         }
 
-        rule.onNodeWithTag("1:1")
-            .assertIsPlaced()
+        rule.onNodeWithTag("1:1").assertIsPlaced()
 
-        rule.runOnIdle {
-            requireNotNull(pinnableContainer).pin()
-        }
+        rule.runOnIdle { requireNotNull(pinnableContainer).pin() }
 
-        rule.runOnIdle {
-            active = !active
-        }
+        rule.runOnIdle { active = !active }
 
-        rule.onNodeWithTag("1:1")
-            .assertIsNotPlaced()
+        rule.onNodeWithTag("1:1").assertIsNotPlaced()
     }
 }
 
diff --git a/compose/foundation/foundation/integration-tests/lazy-tests/src/androidTest/kotlin/androidx/compose/foundation/lazy/list/LazyListPrefetchStrategyTest.kt b/compose/foundation/foundation/integration-tests/lazy-tests/src/androidTest/kotlin/androidx/compose/foundation/lazy/list/LazyListPrefetchStrategyTest.kt
index 0d773c2..b7c37b0 100644
--- a/compose/foundation/foundation/integration-tests/lazy-tests/src/androidTest/kotlin/androidx/compose/foundation/lazy/list/LazyListPrefetchStrategyTest.kt
+++ b/compose/foundation/foundation/integration-tests/lazy-tests/src/androidTest/kotlin/androidx/compose/foundation/lazy/list/LazyListPrefetchStrategyTest.kt
@@ -49,17 +49,17 @@
 @LargeTest
 @RunWith(Parameterized::class)
 @OptIn(ExperimentalFoundationApi::class)
-class LazyListPrefetchStrategyTest(
-    val config: Config
-) : BaseLazyListTestWithOrientation(config.orientation) {
+class LazyListPrefetchStrategyTest(val config: Config) :
+    BaseLazyListTestWithOrientation(config.orientation) {
 
     companion object {
         @JvmStatic
         @Parameterized.Parameters(name = "{0}")
-        fun initParameters(): Array<Any> = arrayOf(
-            Config(Orientation.Vertical),
-            Config(Orientation.Horizontal),
-        )
+        fun initParameters(): Array<Any> =
+            arrayOf(
+                Config(Orientation.Vertical),
+                Config(Orientation.Horizontal),
+            )
 
         class Config(
             val orientation: Orientation,
@@ -83,25 +83,20 @@
 
         composeList(prefetchStrategy = strategy)
 
-        assertThat(strategy.callbacks).containsExactly(
-            Callback.OnVisibleItemsUpdated(
-                visibleIndices = listOf(0, 1)
-            ),
-        ).inOrder()
+        assertThat(strategy.callbacks)
+            .containsExactly(
+                Callback.OnVisibleItemsUpdated(visibleIndices = listOf(0, 1)),
+            )
+            .inOrder()
         strategy.reset()
 
-        rule.runOnIdle {
-            runBlocking {
-                state.scrollBy(5f)
-            }
-        }
+        rule.runOnIdle { runBlocking { state.scrollBy(5f) } }
 
-        assertThat(strategy.callbacks).containsExactly(
-            Callback.OnScroll(
-                delta = -5f,
-                visibleIndices = listOf(0, 1)
-            ),
-        ).inOrder()
+        assertThat(strategy.callbacks)
+            .containsExactly(
+                Callback.OnScroll(delta = -5f, visibleIndices = listOf(0, 1)),
+            )
+            .inOrder()
     }
 
     @Test
@@ -110,25 +105,20 @@
 
         composeList(firstItem = 10, itemOffset = 10, prefetchStrategy = strategy)
 
-        assertThat(strategy.callbacks).containsExactly(
-            Callback.OnVisibleItemsUpdated(
-                visibleIndices = listOf(10, 11)
-            ),
-        ).inOrder()
+        assertThat(strategy.callbacks)
+            .containsExactly(
+                Callback.OnVisibleItemsUpdated(visibleIndices = listOf(10, 11)),
+            )
+            .inOrder()
         strategy.reset()
 
-        rule.runOnIdle {
-            runBlocking {
-                state.scrollBy(-5f)
-            }
-        }
+        rule.runOnIdle { runBlocking { state.scrollBy(-5f) } }
 
-        assertThat(strategy.callbacks).containsExactly(
-            Callback.OnScroll(
-                delta = 5f,
-                visibleIndices = listOf(10, 11)
-            ),
-        ).inOrder()
+        assertThat(strategy.callbacks)
+            .containsExactly(
+                Callback.OnScroll(delta = 5f, visibleIndices = listOf(10, 11)),
+            )
+            .inOrder()
     }
 
     @Test
@@ -137,28 +127,21 @@
 
         composeList(prefetchStrategy = strategy)
 
-        assertThat(strategy.callbacks).containsExactly(
-            Callback.OnVisibleItemsUpdated(
-                visibleIndices = listOf(0, 1)
-            ),
-        ).inOrder()
+        assertThat(strategy.callbacks)
+            .containsExactly(
+                Callback.OnVisibleItemsUpdated(visibleIndices = listOf(0, 1)),
+            )
+            .inOrder()
         strategy.reset()
 
-        rule.runOnIdle {
-            runBlocking {
-                state.scrollBy(itemsSizePx + 5f)
-            }
-        }
+        rule.runOnIdle { runBlocking { state.scrollBy(itemsSizePx + 5f) } }
 
-        assertThat(strategy.callbacks).containsExactly(
-            Callback.OnVisibleItemsUpdated(
-                visibleIndices = listOf(1, 2)
-            ),
-            Callback.OnScroll(
-                delta = -(itemsSizePx + 5f),
-                visibleIndices = listOf(1, 2)
-            ),
-        ).inOrder()
+        assertThat(strategy.callbacks)
+            .containsExactly(
+                Callback.OnVisibleItemsUpdated(visibleIndices = listOf(1, 2)),
+                Callback.OnScroll(delta = -(itemsSizePx + 5f), visibleIndices = listOf(1, 2)),
+            )
+            .inOrder()
     }
 
     @Test
@@ -168,22 +151,22 @@
 
         composeList(prefetchStrategy = strategy, numItems = numItems)
 
-        assertThat(strategy.callbacks).containsExactly(
-            Callback.OnVisibleItemsUpdated(
-                visibleIndices = listOf(0, 1)
-            ),
-        ).inOrder()
+        assertThat(strategy.callbacks)
+            .containsExactly(
+                Callback.OnVisibleItemsUpdated(visibleIndices = listOf(0, 1)),
+            )
+            .inOrder()
         strategy.reset()
 
         numItems.value = 1
 
         rule.waitForIdle()
 
-        assertThat(strategy.callbacks).containsExactly(
-            Callback.OnVisibleItemsUpdated(
-                visibleIndices = listOf(0)
-            ),
-        ).inOrder()
+        assertThat(strategy.callbacks)
+            .containsExactly(
+                Callback.OnVisibleItemsUpdated(visibleIndices = listOf(0)),
+            )
+            .inOrder()
     }
 
     @Test
@@ -192,21 +175,14 @@
 
         composeList(prefetchStrategy = strategy)
 
-        rule.runOnIdle {
-            runBlocking {
-                state.scrollBy(5f)
-            }
-        }
+        rule.runOnIdle { runBlocking { state.scrollBy(5f) } }
 
         waitForPrefetch()
-        rule.onNodeWithTag("2")
-            .assertExists()
+        rule.onNodeWithTag("2").assertExists()
     }
 
     private fun waitForPrefetch() {
-        rule.runOnIdle {
-            scheduler.executeActiveRequests()
-        }
+        rule.runOnIdle { scheduler.executeActiveRequests() }
     }
 
     @OptIn(ExperimentalFoundationApi::class)
@@ -217,26 +193,24 @@
         prefetchStrategy: LazyListPrefetchStrategy = DefaultLazyListPrefetchStrategy()
     ) {
         rule.setContent {
-            state = rememberLazyListState(
-                initialFirstVisibleItemIndex = firstItem,
-                initialFirstVisibleItemScrollOffset = itemOffset,
-                prefetchStrategy = prefetchStrategy
-            )
+            state =
+                rememberLazyListState(
+                    initialFirstVisibleItemIndex = firstItem,
+                    initialFirstVisibleItemScrollOffset = itemOffset,
+                    prefetchStrategy = prefetchStrategy
+                )
             LazyColumnOrRow(
                 Modifier.mainAxisSize(itemsSizeDp * 1.5f),
                 state,
             ) {
                 items(numItems.value) {
                     Spacer(
-                        Modifier
-                            .mainAxisSize(itemsSizeDp)
+                        Modifier.mainAxisSize(itemsSizeDp)
                             .fillMaxCrossAxis()
                             .testTag("$it")
                             .layout { measurable, constraints ->
                                 val placeable = measurable.measure(constraints)
-                                layout(placeable.width, placeable.height) {
-                                    placeable.place(0, 0)
-                                }
+                                layout(placeable.width, placeable.height) { placeable.place(0, 0) }
                             }
                     )
                 }
@@ -244,15 +218,14 @@
         }
     }
 
-    /**
-     * LazyListPrefetchStrategy that just records callbacks without scheduling prefetches.
-     */
+    /** LazyListPrefetchStrategy that just records callbacks without scheduling prefetches. */
     private class RecordingLazyListPrefetchStrategy(
         override val prefetchScheduler: PrefetchScheduler?
     ) : LazyListPrefetchStrategy {
 
         sealed interface Callback {
             data class OnScroll(val delta: Float, val visibleIndices: List<Int>) : Callback
+
             data class OnVisibleItemsUpdated(val visibleIndices: List<Int>) : Callback
         }
 
diff --git a/compose/foundation/foundation/integration-tests/lazy-tests/src/androidTest/kotlin/androidx/compose/foundation/lazy/list/LazyListPrefetcherTest.kt b/compose/foundation/foundation/integration-tests/lazy-tests/src/androidTest/kotlin/androidx/compose/foundation/lazy/list/LazyListPrefetcherTest.kt
index ef1aed5..b9eefa9 100644
--- a/compose/foundation/foundation/integration-tests/lazy-tests/src/androidTest/kotlin/androidx/compose/foundation/lazy/list/LazyListPrefetcherTest.kt
+++ b/compose/foundation/foundation/integration-tests/lazy-tests/src/androidTest/kotlin/androidx/compose/foundation/lazy/list/LazyListPrefetcherTest.kt
@@ -46,26 +46,23 @@
 
 @LargeTest
 @RunWith(Parameterized::class)
-class LazyListPrefetcherTest(
-    val config: Config
-) : BaseLazyListTestWithOrientation(config.orientation) {
+class LazyListPrefetcherTest(val config: Config) :
+    BaseLazyListTestWithOrientation(config.orientation) {
 
     companion object {
         @JvmStatic
         @Parameterized.Parameters(name = "{0}")
-        fun initParameters(): Array<Any> = arrayOf(
-            Config(Orientation.Vertical, 0),
-            Config(Orientation.Vertical, 1),
-            Config(Orientation.Horizontal, 0),
-            Config(Orientation.Horizontal, 1)
-        )
+        fun initParameters(): Array<Any> =
+            arrayOf(
+                Config(Orientation.Vertical, 0),
+                Config(Orientation.Vertical, 1),
+                Config(Orientation.Horizontal, 0),
+                Config(Orientation.Horizontal, 1)
+            )
 
-        class Config(
-            val orientation: Orientation,
-            val beyondBoundsItemCount: Int
-        ) {
-            override fun toString() = "orientation=$orientation with" +
-                " $beyondBoundsItemCount non-visible items"
+        class Config(val orientation: Orientation, val beyondBoundsItemCount: Int) {
+            override fun toString() =
+                "orientation=$orientation with" + " $beyondBoundsItemCount non-visible items"
         }
     }
 
@@ -77,41 +74,36 @@
     private val scheduler = TestPrefetchScheduler()
 
     @OptIn(ExperimentalFoundationApi::class)
-    private val strategy = object : LazyListPrefetchStrategy by LazyListPrefetchStrategy() {
-        override val prefetchScheduler: PrefetchScheduler = scheduler
-    }
+    private val strategy =
+        object : LazyListPrefetchStrategy by LazyListPrefetchStrategy() {
+            override val prefetchScheduler: PrefetchScheduler = scheduler
+        }
 
     @Test
     fun notPrefetchingForwardInitially() {
         composeList()
 
-        rule.onNodeWithTag("${config.beyondBoundsItemCount + 2}")
-            .assertDoesNotExist()
+        rule.onNodeWithTag("${config.beyondBoundsItemCount + 2}").assertDoesNotExist()
     }
 
     @Test
     fun notPrefetchingBackwardInitially() {
         composeList(firstItem = 2)
 
-        rule.onNodeWithTag("0")
-            .assertDoesNotExist()
+        rule.onNodeWithTag("0").assertDoesNotExist()
     }
 
     @Test
     fun prefetchingForwardAfterSmallScroll() {
         composeList()
         val preFetchIndex = 2
-        rule.runOnIdle {
-            runBlocking {
-                state.scrollBy(5f)
-            }
-        }
+        rule.runOnIdle { runBlocking { state.scrollBy(5f) } }
 
         waitForPrefetch()
 
-        rule.onNodeWithTag("$preFetchIndex")
-            .assertExists()
-        rule.onNodeWithTag("${config.beyondBoundsItemCount + preFetchIndex + 1}")
+        rule.onNodeWithTag("$preFetchIndex").assertExists()
+        rule
+            .onNodeWithTag("${config.beyondBoundsItemCount + preFetchIndex + 1}")
             .assertDoesNotExist()
     }
 
@@ -119,18 +111,12 @@
     fun prefetchingBackwardAfterSmallScroll() {
         composeList(firstItem = 2, itemOffset = 10)
 
-        rule.runOnIdle {
-            runBlocking {
-                state.scrollBy(-5f)
-            }
-        }
+        rule.runOnIdle { runBlocking { state.scrollBy(-5f) } }
 
         waitForPrefetch()
 
-        rule.onNodeWithTag("1")
-            .assertExists()
-        rule.onNodeWithTag("0")
-            .assertDoesNotExist()
+        rule.onNodeWithTag("1").assertExists()
+        rule.onNodeWithTag("0").assertDoesNotExist()
     }
 
     @Test
@@ -138,17 +124,13 @@
         val initialIndex = 5
         composeList(firstItem = initialIndex)
 
-        rule.runOnIdle {
-            runBlocking {
-                state.scrollBy(5f)
-            }
-        }
+        rule.runOnIdle { runBlocking { state.scrollBy(5f) } }
         var prefetchIndex = initialIndex + 2
         waitForPrefetch()
 
-        rule.onNodeWithTag("$prefetchIndex")
-            .assertExists()
-        rule.onNodeWithTag("${prefetchIndex - config.beyondBoundsItemCount - 3}")
+        rule.onNodeWithTag("$prefetchIndex").assertExists()
+        rule
+            .onNodeWithTag("${prefetchIndex - config.beyondBoundsItemCount - 3}")
             .assertDoesNotExist()
 
         rule.runOnIdle {
@@ -161,9 +143,9 @@
         prefetchIndex -= 3
         waitForPrefetch()
 
-        rule.onNodeWithTag("$prefetchIndex")
-            .assertExists()
-        rule.onNodeWithTag("${prefetchIndex + config.beyondBoundsItemCount + 3}")
+        rule.onNodeWithTag("$prefetchIndex").assertExists()
+        rule
+            .onNodeWithTag("${prefetchIndex + config.beyondBoundsItemCount + 3}")
             .assertDoesNotExist()
     }
 
@@ -171,11 +153,7 @@
     fun prefetchingForwardTwice() {
         composeList()
 
-        rule.runOnIdle {
-            runBlocking {
-                state.scrollBy(5f)
-            }
-        }
+        rule.runOnIdle { runBlocking { state.scrollBy(5f) } }
 
         waitForPrefetch()
 
@@ -190,11 +168,10 @@
 
         waitForPrefetch()
 
-        rule.onNodeWithTag("${prefetchIndex - 1}")
-            .assertIsDisplayed()
-        rule.onNodeWithTag("$prefetchIndex")
-            .assertExists()
-        rule.onNodeWithTag("${prefetchIndex + config.beyondBoundsItemCount + 1}")
+        rule.onNodeWithTag("${prefetchIndex - 1}").assertIsDisplayed()
+        rule.onNodeWithTag("$prefetchIndex").assertExists()
+        rule
+            .onNodeWithTag("${prefetchIndex + config.beyondBoundsItemCount + 1}")
             .assertDoesNotExist()
     }
 
@@ -202,11 +179,7 @@
     fun prefetchingBackwardTwice() {
         composeList(firstItem = 4)
 
-        rule.runOnIdle {
-            runBlocking {
-                state.scrollBy(-5f)
-            }
-        }
+        rule.runOnIdle { runBlocking { state.scrollBy(-5f) } }
 
         waitForPrefetch()
 
@@ -219,12 +192,9 @@
 
         waitForPrefetch()
 
-        rule.onNodeWithTag("2")
-            .assertIsDisplayed()
-        rule.onNodeWithTag("1")
-            .assertExists()
-        rule.onNodeWithTag("0")
-            .assertDoesNotExist()
+        rule.onNodeWithTag("2").assertIsDisplayed()
+        rule.onNodeWithTag("1").assertExists()
+        rule.onNodeWithTag("0").assertDoesNotExist()
     }
 
     @Test
@@ -232,19 +202,15 @@
         val initialIndex = 5
         composeList(firstItem = initialIndex, reverseLayout = true)
 
-        rule.runOnIdle {
-            runBlocking {
-                state.scrollBy(5f)
-            }
-        }
+        rule.runOnIdle { runBlocking { state.scrollBy(5f) } }
 
         var prefetchIndex = initialIndex + 2
 
         waitForPrefetch()
 
-        rule.onNodeWithTag("$prefetchIndex")
-            .assertExists()
-        rule.onNodeWithTag("${prefetchIndex - config.beyondBoundsItemCount - 3}")
+        rule.onNodeWithTag("$prefetchIndex").assertExists()
+        rule
+            .onNodeWithTag("${prefetchIndex - config.beyondBoundsItemCount - 3}")
             .assertDoesNotExist()
 
         rule.runOnIdle {
@@ -257,9 +223,9 @@
         prefetchIndex -= 3
         waitForPrefetch()
 
-        rule.onNodeWithTag("$prefetchIndex")
-            .assertExists()
-        rule.onNodeWithTag("${prefetchIndex + config.beyondBoundsItemCount + 3}")
+        rule.onNodeWithTag("$prefetchIndex").assertExists()
+        rule
+            .onNodeWithTag("${prefetchIndex + config.beyondBoundsItemCount + 3}")
             .assertDoesNotExist()
     }
 
@@ -273,68 +239,57 @@
             contentPadding = PaddingValues(mainAxis = halfItemSize)
         )
 
-        rule.onNodeWithTag("${initialIndex - 1}")
-            .assertIsDisplayed()
-        rule.onNodeWithTag("$initialIndex")
-            .assertIsDisplayed()
-        rule.onNodeWithTag("${initialIndex + 1}")
-            .assertIsDisplayed()
-        rule.onNodeWithTag("${initialIndex - config.beyondBoundsItemCount - 2}")
+        rule.onNodeWithTag("${initialIndex - 1}").assertIsDisplayed()
+        rule.onNodeWithTag("$initialIndex").assertIsDisplayed()
+        rule.onNodeWithTag("${initialIndex + 1}").assertIsDisplayed()
+        rule
+            .onNodeWithTag("${initialIndex - config.beyondBoundsItemCount - 2}")
             .assertDoesNotExist()
-        rule.onNodeWithTag("${initialIndex + config.beyondBoundsItemCount + 2}")
+        rule
+            .onNodeWithTag("${initialIndex + config.beyondBoundsItemCount + 2}")
             .assertDoesNotExist()
 
-        rule.runOnIdle {
-            runBlocking {
-                state.scrollBy(5f)
-            }
-        }
+        rule.runOnIdle { runBlocking { state.scrollBy(5f) } }
 
         var prefetchIndex = initialIndex + 1
         waitForPrefetch()
 
-        rule.onNodeWithTag("${prefetchIndex + 1}")
-            .assertExists()
-        rule.onNodeWithTag("${prefetchIndex - config.beyondBoundsItemCount - 3}")
+        rule.onNodeWithTag("${prefetchIndex + 1}").assertExists()
+        rule
+            .onNodeWithTag("${prefetchIndex - config.beyondBoundsItemCount - 3}")
             .assertDoesNotExist()
 
-        rule.runOnIdle {
-            runBlocking {
-                state.scrollBy(-2f)
-            }
-        }
+        rule.runOnIdle { runBlocking { state.scrollBy(-2f) } }
 
         prefetchIndex -= 3
         waitForPrefetch()
 
-        rule.onNodeWithTag("$prefetchIndex")
-            .assertExists()
+        rule.onNodeWithTag("$prefetchIndex").assertExists()
     }
 
     @OptIn(ExperimentalFoundationApi::class)
     @Test
     fun prefetchingStickyHeaderItem() {
         rule.setContent {
-            state = rememberLazyListState(
-                initialFirstVisibleItemIndex = 1,
-                initialFirstVisibleItemScrollOffset = itemsSizePx / 2
-            )
+            state =
+                rememberLazyListState(
+                    initialFirstVisibleItemIndex = 1,
+                    initialFirstVisibleItemScrollOffset = itemsSizePx / 2
+                )
             LazyColumnOrRow(
                 Modifier.mainAxisSize(itemsSizeDp * 1.5f),
                 state,
             ) {
                 stickyHeader {
                     Spacer(
-                        Modifier
-                            .mainAxisSize(itemsSizeDp)
+                        Modifier.mainAxisSize(itemsSizeDp)
                             .then(fillParentMaxCrossAxis())
                             .testTag("header")
                     )
                 }
                 items(100) {
                     Spacer(
-                        Modifier
-                            .mainAxisSize(itemsSizeDp)
+                        Modifier.mainAxisSize(itemsSizeDp)
                             .then(fillParentMaxCrossAxis())
                             .testTag("$it")
                     )
@@ -342,18 +297,11 @@
             }
         }
 
-        rule.runOnIdle {
-            runBlocking {
-                state.scrollBy(-5f)
-            }
-        }
+        rule.runOnIdle { runBlocking { state.scrollBy(-5f) } }
 
-        rule.onNodeWithTag("header")
-            .assertIsDisplayed()
-        rule.onNodeWithTag("0")
-            .assertIsDisplayed()
-        rule.onNodeWithTag("1")
-            .assertIsDisplayed()
+        rule.onNodeWithTag("header").assertIsDisplayed()
+        rule.onNodeWithTag("0").assertIsDisplayed()
+        rule.onNodeWithTag("1").assertIsDisplayed()
     }
 
     @Test
@@ -362,48 +310,47 @@
         lateinit var remeasure: Remeasurement
         rule.setContent {
             SubcomposeLayout(
-                modifier = object : RemeasurementModifier {
-                    override fun onRemeasurementAvailable(remeasurement: Remeasurement) {
-                        remeasure = remeasurement
-                    }
-                }
-            ) { constraints ->
-                val placeable = if (emit) {
-                    subcompose(Unit) {
-                        state = rememberLazyListState()
-                        LazyColumnOrRow(
-                            Modifier.mainAxisSize(itemsSizeDp * 1.5f),
-                            state,
-                        ) {
-                            items(1000) {
-                                Spacer(
-                                    Modifier
-                                        .mainAxisSize(itemsSizeDp)
-                                        .then(fillParentMaxCrossAxis())
-                                )
-                            }
+                modifier =
+                    object : RemeasurementModifier {
+                        override fun onRemeasurementAvailable(remeasurement: Remeasurement) {
+                            remeasure = remeasurement
                         }
-                    }.first().measure(constraints)
-                } else {
-                    null
-                }
-                layout(constraints.maxWidth, constraints.maxHeight) {
-                    placeable?.place(0, 0)
-                }
+                    }
+            ) { constraints ->
+                val placeable =
+                    if (emit) {
+                        subcompose(Unit) {
+                                state = rememberLazyListState()
+                                LazyColumnOrRow(
+                                    Modifier.mainAxisSize(itemsSizeDp * 1.5f),
+                                    state,
+                                ) {
+                                    items(1000) {
+                                        Spacer(
+                                            Modifier.mainAxisSize(itemsSizeDp)
+                                                .then(fillParentMaxCrossAxis())
+                                        )
+                                    }
+                                }
+                            }
+                            .first()
+                            .measure(constraints)
+                    } else {
+                        null
+                    }
+                layout(constraints.maxWidth, constraints.maxHeight) { placeable?.place(0, 0) }
             }
         }
 
         rule.runOnIdle {
             // this will schedule the prefetching
-            runBlocking(AutoTestFrameClock()) {
-                state.scrollBy(itemsSizePx.toFloat())
-            }
+            runBlocking(AutoTestFrameClock()) { state.scrollBy(itemsSizePx.toFloat()) }
             // then we synchronously dispose LazyColumn
             emit = false
             remeasure.forceRemeasure()
         }
 
-        rule.runOnIdle { }
+        rule.runOnIdle {}
     }
 
     @Test
@@ -417,11 +364,7 @@
             ) {
                 items(1000) {
                     composedItems.add(it)
-                    Spacer(
-                        Modifier
-                            .mainAxisSize(itemsSizeDp)
-                            .then(fillParentMaxCrossAxis())
-                    )
+                    Spacer(Modifier.mainAxisSize(itemsSizeDp).then(fillParentMaxCrossAxis()))
                 }
             }
         }
@@ -443,9 +386,7 @@
         rule.waitForIdle()
         rule.waitForIdle()
 
-        rule.runOnIdle {
-            assertThat(composedItems).doesNotContain(3)
-        }
+        rule.runOnIdle { assertThat(composedItems).doesNotContain(3) }
     }
 
     @Test
@@ -477,15 +418,11 @@
             }
         }
 
-        rule.runOnIdle {
-            assertThat(activeNodes).doesNotContain(3)
-        }
+        rule.runOnIdle { assertThat(activeNodes).doesNotContain(3) }
     }
 
     private fun waitForPrefetch() {
-        rule.runOnIdle {
-            scheduler.executeActiveRequests()
-        }
+        rule.runOnIdle { scheduler.executeActiveRequests() }
     }
 
     private val activeNodes = mutableSetOf<Int>()
@@ -498,11 +435,12 @@
     ) {
         rule.setContent {
             @OptIn(ExperimentalFoundationApi::class)
-            state = rememberLazyListState(
-                initialFirstVisibleItemIndex = firstItem,
-                initialFirstVisibleItemScrollOffset = itemOffset,
-                prefetchStrategy = strategy
-            )
+            state =
+                rememberLazyListState(
+                    initialFirstVisibleItemIndex = firstItem,
+                    initialFirstVisibleItemScrollOffset = itemOffset,
+                    prefetchStrategy = strategy
+                )
             LazyColumnOrRow(
                 Modifier.mainAxisSize(itemsSizeDp * 1.5f),
                 state,
@@ -513,20 +451,15 @@
                 items(100) {
                     DisposableEffect(it) {
                         activeNodes.add(it)
-                        onDispose {
-                            activeNodes.remove(it)
-                        }
+                        onDispose { activeNodes.remove(it) }
                     }
                     Spacer(
-                        Modifier
-                            .mainAxisSize(itemsSizeDp)
+                        Modifier.mainAxisSize(itemsSizeDp)
                             .fillMaxCrossAxis()
                             .testTag("$it")
                             .layout { measurable, constraints ->
                                 val placeable = measurable.measure(constraints)
-                                layout(placeable.width, placeable.height) {
-                                    placeable.place(0, 0)
-                                }
+                                layout(placeable.width, placeable.height) { placeable.place(0, 0) }
                             }
                     )
                 }
diff --git a/compose/foundation/foundation/integration-tests/lazy-tests/src/androidTest/kotlin/androidx/compose/foundation/lazy/list/LazyListRequestScrollTest.kt b/compose/foundation/foundation/integration-tests/lazy-tests/src/androidTest/kotlin/androidx/compose/foundation/lazy/list/LazyListRequestScrollTest.kt
index 98db2bc..7ed539d 100644
--- a/compose/foundation/foundation/integration-tests/lazy-tests/src/androidTest/kotlin/androidx/compose/foundation/lazy/list/LazyListRequestScrollTest.kt
+++ b/compose/foundation/foundation/integration-tests/lazy-tests/src/androidTest/kotlin/androidx/compose/foundation/lazy/list/LazyListRequestScrollTest.kt
@@ -52,9 +52,7 @@
 class LazyListRequestScrollTest(private val orientation: Orientation) :
     BaseLazyListTestWithOrientation(orientation) {
 
-    private val itemSize = with(rule.density) {
-        100.toDp()
-    }
+    private val itemSize = with(rule.density) { 100.toDp() }
 
     @Test
     fun requestScrollToItem_withIndex0_itemsPrepended_scrollsToNewFirstItem() {
@@ -66,28 +64,20 @@
             state = rememberLazyListState()
 
             LazyColumnOrRow(Modifier.size(itemSize * 2.5f), state) {
-                items(list, key = { it }) {
-                    Item(remember { "$it" })
-                }
+                items(list, key = { it }) { Item(remember { "$it" }) }
 
-                Snapshot.withoutReadObservation {
-                    state.requestScrollToItem(index = 0)
-                }
+                Snapshot.withoutReadObservation { state.requestScrollToItem(index = 0) }
             }
         }
 
         // When the list is updated by prepending from 0 to 9, such that the new list contains
         // from 0 to 15.
-        rule.runOnIdle {
-            list = (0..15).toList()
-        }
+        rule.runOnIdle { list = (0..15).toList() }
 
         // Then we are scrolled to the start where the visible items are 0, 1, and 2.
         rule.runOnIdle {
             assertThat(state.firstVisibleItemIndex).isEqualTo(0)
-            assertThat(
-                state.visibleKeys
-            ).isEqualTo(listOf(0, 1, 2))
+            assertThat(state.visibleKeys).isEqualTo(listOf(0, 1, 2))
         }
     }
 
@@ -101,26 +91,26 @@
             state = rememberLazyListState()
 
             LazyColumnOrRow(Modifier.size(itemSize * 2.5f), state) {
-                items(list, key = { it }) {
-                    Item(remember { "$it" })
-                }
+                items(list, key = { it }) { Item(remember { "$it" }) }
 
-                Snapshot.withoutReadObservation {
-                    state.requestScrollToItem(index = 0)
-                }
+                Snapshot.withoutReadObservation { state.requestScrollToItem(index = 0) }
             }
         }
 
         // When we scroll towards the end very quickly.
         rule.onNode(hasScrollAction()).performTouchInput {
             swipeWithVelocity(
-                start = when (orientation) {
-                    Orientation.Vertical -> bottomCenter
-                    Orientation.Horizontal -> centerRight
-                }, end = when (orientation) {
-                    Orientation.Vertical -> topCenter
-                    Orientation.Horizontal -> centerLeft
-                }, endVelocity = 5_000F
+                start =
+                    when (orientation) {
+                        Orientation.Vertical -> bottomCenter
+                        Orientation.Horizontal -> centerRight
+                    },
+                end =
+                    when (orientation) {
+                        Orientation.Vertical -> topCenter
+                        Orientation.Horizontal -> centerLeft
+                    },
+                endVelocity = 5_000F
             )
         }
 
@@ -128,9 +118,7 @@
         // scrolled back to the start.
         rule.runOnIdle {
             assertThat(state.firstVisibleItemIndex).isNotEqualTo(0)
-            assertThat(
-                state.visibleKeys
-            ).isEqualTo(list.takeLast(3))
+            assertThat(state.visibleKeys).isEqualTo(list.takeLast(3))
         }
     }
 
@@ -157,22 +145,21 @@
             @Composable
             fun TestContent(list: List<Int>) {
                 LazyColumnOrRow(
-                    Modifier
-                        .width(listSize)
-                        .height(listSize), state, reverseLayout = true
+                    Modifier.width(listSize).height(listSize),
+                    state,
+                    reverseLayout = true
                 ) {
-                    items(list, key = { it }) {
-                        Item(remember { "$it" })
-                    }
+                    items(list, key = { it }) { Item(remember { "$it" }) }
                 }
 
                 SideEffect {
                     val firstMessageChanged = state.firstVisibleItemKey() != list.firstOrNull()
                     if (!state.canScrollBackward && firstMessageChanged) {
                         // This scrolls to the start of the first item.
-                        state.requestScrollToItem(index = 1, scrollOffset = with(rule.density) {
-                            -listSize.roundToPx()
-                        })
+                        state.requestScrollToItem(
+                            index = 1,
+                            scrollOffset = with(rule.density) { -listSize.roundToPx() }
+                        )
                     }
                 }
             }
@@ -182,9 +169,7 @@
         rule.onNode(hasScrollAction()).performScrollToIndex(0)
 
         // When the list is updated, prepending items 0 to 2 so the list contains from 0 to 30.
-        rule.runOnIdle {
-            list = (0..30).toList()
-        }
+        rule.runOnIdle { list = (0..30).toList() }
 
         // Then the first visible item has index 0, its key is 0, and it's scrolled to the start
         // of that item (since we're laying out from bottom-to-top/right-to-left, we want the offset
@@ -195,9 +180,7 @@
                 assertThat(state.firstVisibleItemScrollOffset)
                     .isEqualTo(itemSize.roundToPx() - listSize.roundToPx())
             }
-            assertThat(
-                state.visibleKeys
-            ).isEqualTo(listOf(0))
+            assertThat(state.visibleKeys).isEqualTo(listOf(0))
         }
     }
 
@@ -216,14 +199,10 @@
             @Composable
             fun TestContent(list: List<Int>) {
                 LazyColumnOrRow(Modifier.size(itemSize * 2.5f), state) {
-                    items(list, key = { it }) {
-                        Item(remember { "$it" })
-                    }
+                    items(list, key = { it }) { Item(remember { "$it" }) }
                 }
 
-                SideEffect {
-                    state.requestScrollToItem(index = state.firstVisibleItemIndex)
-                }
+                SideEffect { state.requestScrollToItem(index = state.firstVisibleItemIndex) }
             }
 
             TestContent(list = list)
@@ -231,16 +210,12 @@
         rule.onNode(hasScrollAction()).performScrollToIndex(5)
 
         // When we update list of ints to move item 5 to the end of the list.
-        rule.runOnIdle {
-            list = (0..4).toList() + (6..25).toList() + listOf(5)
-        }
+        rule.runOnIdle { list = (0..4).toList() + (6..25).toList() + listOf(5) }
 
         // Then first item is index is still 5, visible items now (6, 7, 8) instead of (24, 25, 5).
         rule.runOnIdle {
             assertThat(state.firstVisibleItemIndex).isEqualTo(5)
-            assertThat(
-                state.visibleKeys
-            ).isEqualTo(listOf(6, 7, 8))
+            assertThat(state.visibleKeys).isEqualTo(listOf(6, 7, 8))
         }
     }
 
@@ -259,9 +234,7 @@
             @Composable
             fun TestContent(list: List<Int>) {
                 LazyColumnOrRow(Modifier.size(itemSize * 2.5f), state) {
-                    items(list, key = { it }) {
-                        Item(remember { "$it" })
-                    }
+                    items(list, key = { it }) { Item(remember { "$it" }) }
                 }
 
                 SideEffect {
@@ -276,16 +249,12 @@
         rule.onNode(hasScrollAction()).performScrollToIndex(15)
 
         // When the list is updated with the first item removed (now from 1 to 35).
-        rule.runOnIdle {
-            list = (1..35).toList()
-        }
+        rule.runOnIdle { list = (1..35).toList() }
 
         // Then first item is index is still 15, the items have shifted back one to (16, 17, 18).
         rule.runOnIdle {
             assertThat(state.firstVisibleItemIndex).isEqualTo(15)
-            assertThat(
-                state.visibleKeys
-            ).isEqualTo(listOf(16, 17, 18))
+            assertThat(state.visibleKeys).isEqualTo(listOf(16, 17, 18))
         }
     }
 
@@ -299,9 +268,7 @@
             state = rememberLazyListState()
 
             LazyColumnOrRow(Modifier.size(itemSize * 2.5f), state) {
-                items(list, key = { it }) {
-                    Item(remember { "$it" })
-                }
+                items(list, key = { it }) { Item(remember { "$it" }) }
             }
         }
 
@@ -326,9 +293,7 @@
             state = rememberLazyListState()
 
             LazyColumnOrRow(Modifier.size(itemSize * 2.5f), state) {
-                items(list, key = { it }) {
-                    Item(remember { "$it" })
-                }
+                items(list, key = { it }) { Item(remember { "$it" }) }
             }
         }
 
@@ -345,9 +310,7 @@
         // Then we are scrolled to the end where the visible items are 28, 29, and 30.
         rule.runOnIdle {
             assertThat(state.firstVisibleItemIndex).isEqualTo(28)
-            assertThat(
-                state.visibleKeys
-            ).isEqualTo(listOf(28, 29, 30))
+            assertThat(state.visibleKeys).isEqualTo(listOf(28, 29, 30))
         }
     }
 
@@ -362,9 +325,7 @@
             scope = rememberCoroutineScope()
 
             LazyColumnOrRow(Modifier.size(itemSize), state) {
-                items(15, key = { it }) {
-                    Item(remember { "$it" })
-                }
+                items(15, key = { it }) { Item(remember { "$it" }) }
             }
         }
 
@@ -381,9 +342,7 @@
                 }
             }
         }
-        rule.runOnIdle {
-            state.requestScrollToItem(index = 0)
-        }
+        rule.runOnIdle { state.requestScrollToItem(index = 0) }
 
         // Then the scroll was canceled.
         rule.waitUntil { canceled }
@@ -401,9 +360,7 @@
             state = rememberLazyListState()
 
             LazyColumnOrRow(Modifier.size(itemSize * 2.5f), state) {
-                items(list, key = { it }) {
-                    Item(remember { "$it" })
-                }
+                items(list, key = { it }) { Item(remember { "$it" }) }
 
                 Snapshot.withoutReadObservation {
                     if (state.firstVisibleItemIndex == 0) {
@@ -412,22 +369,16 @@
                 }
             }
         }
-        rule.runOnIdle {
-            list = (0..20).toList()
-        }
+        rule.runOnIdle { list = (0..20).toList() }
         rule.onNode(hasScrollAction()).performScrollToIndex(1)
 
         // When item 1 moves to the end of the list.
-        rule.runOnIdle {
-            list = listOf(0) + (2..20).toList() + listOf(1)
-        }
+        rule.runOnIdle { list = listOf(0) + (2..20).toList() + listOf(1) }
 
         // Then we are scrolled to the end where the visible items are 19, 20, and 1.
         rule.runOnIdle {
             assertThat(state.firstVisibleItemIndex).isEqualTo(list.size - 3)
-            assertThat(
-                state.visibleKeys
-            ).isEqualTo(listOf(19, 20, 1))
+            assertThat(state.visibleKeys).isEqualTo(listOf(19, 20, 1))
         }
     }
 
@@ -435,11 +386,7 @@
 
     @Composable
     private fun Item(tag: String) {
-        Spacer(
-            Modifier
-                .testTag(tag)
-                .size(itemSize)
-        )
+        Spacer(Modifier.testTag(tag).size(itemSize))
     }
 
     companion object {
@@ -449,4 +396,5 @@
     }
 }
 
-private val LazyListState.visibleKeys: List<Any> get() = layoutInfo.visibleItemsInfo.map { it.key }
+private val LazyListState.visibleKeys: List<Any>
+    get() = layoutInfo.visibleItemsInfo.map { it.key }
diff --git a/compose/foundation/foundation/integration-tests/lazy-tests/src/androidTest/kotlin/androidx/compose/foundation/lazy/list/LazyListSlotsReuseTest.kt b/compose/foundation/foundation/integration-tests/lazy-tests/src/androidTest/kotlin/androidx/compose/foundation/lazy/list/LazyListSlotsReuseTest.kt
index f6e68b1..a952b29 100644
--- a/compose/foundation/foundation/integration-tests/lazy-tests/src/androidTest/kotlin/androidx/compose/foundation/lazy/list/LazyListSlotsReuseTest.kt
+++ b/compose/foundation/foundation/integration-tests/lazy-tests/src/androidTest/kotlin/androidx/compose/foundation/lazy/list/LazyListSlotsReuseTest.kt
@@ -45,8 +45,7 @@
 @RunWith(AndroidJUnit4::class)
 class LazyListSlotsReuseTest {
 
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
     val itemsSizePx = 30f
     val itemsSizeDp = with(rule.density) { itemsSizePx.toDp() }
@@ -56,29 +55,19 @@
         lateinit var state: LazyListState
         rule.setContent {
             state = rememberLazyListState()
-            LazyColumn(
-                Modifier.height(itemsSizeDp * 1.5f),
-                state
-            ) {
+            LazyColumn(Modifier.height(itemsSizeDp * 1.5f), state) {
                 items(100) {
                     Spacer(Modifier.height(itemsSizeDp).fillParentMaxWidth().testTag("$it"))
                 }
             }
         }
 
-        rule.onNodeWithTag("0")
-            .assertIsDisplayed()
+        rule.onNodeWithTag("0").assertIsDisplayed()
 
-        rule.runOnIdle {
-            runBlocking {
-                state.scrollToItem(1)
-            }
-        }
+        rule.runOnIdle { runBlocking { state.scrollToItem(1) } }
 
-        rule.onNodeWithTag("0")
-            .assertIsDeactivated()
-        rule.onNodeWithTag("1")
-            .assertIsDisplayed()
+        rule.onNodeWithTag("0").assertIsDeactivated()
+        rule.onNodeWithTag("1").assertIsDisplayed()
     }
 
     @Test
@@ -86,33 +75,21 @@
         lateinit var state: LazyListState
         rule.setContent {
             state = rememberLazyListState()
-            LazyColumn(
-                Modifier.height(itemsSizeDp * 1.5f),
-                state
-            ) {
+            LazyColumn(Modifier.height(itemsSizeDp * 1.5f), state) {
                 items(100) {
                     Spacer(Modifier.height(itemsSizeDp).fillParentMaxWidth().testTag("$it"))
                 }
             }
         }
 
-        rule.onNodeWithTag("0")
-            .assertIsDisplayed()
-        rule.onNodeWithTag("1")
-            .assertIsDisplayed()
+        rule.onNodeWithTag("0").assertIsDisplayed()
+        rule.onNodeWithTag("1").assertIsDisplayed()
 
-        rule.runOnIdle {
-            runBlocking {
-                state.scrollToItem(2)
-            }
-        }
+        rule.runOnIdle { runBlocking { state.scrollToItem(2) } }
 
-        rule.onNodeWithTag("0")
-            .assertIsDeactivated()
-        rule.onNodeWithTag("1")
-            .assertIsDeactivated()
-        rule.onNodeWithTag("2")
-            .assertIsDisplayed()
+        rule.onNodeWithTag("0").assertIsDeactivated()
+        rule.onNodeWithTag("1").assertIsDeactivated()
+        rule.onNodeWithTag("2").assertIsDisplayed()
     }
 
     @Test
@@ -120,30 +97,18 @@
         lateinit var state: LazyListState
         rule.setContent {
             state = rememberLazyListState()
-            LazyColumn(
-                Modifier.height(itemsSizeDp * (DefaultMaxItemsToRetain + 0.5f)),
-                state
-            ) {
+            LazyColumn(Modifier.height(itemsSizeDp * (DefaultMaxItemsToRetain + 0.5f)), state) {
                 items(100) {
                     Spacer(Modifier.height(itemsSizeDp).fillParentMaxWidth().testTag("$it"))
                 }
             }
         }
 
-        rule.runOnIdle {
-            runBlocking {
-                state.scrollToItem(DefaultMaxItemsToRetain + 1)
-            }
-        }
+        rule.runOnIdle { runBlocking { state.scrollToItem(DefaultMaxItemsToRetain + 1) } }
 
-        repeat(DefaultMaxItemsToRetain) {
-            rule.onNodeWithTag("$it")
-                .assertIsDeactivated()
-        }
-        rule.onNodeWithTag("$DefaultMaxItemsToRetain")
-            .assertDoesNotExist()
-        rule.onNodeWithTag("${DefaultMaxItemsToRetain + 1}")
-            .assertIsDisplayed()
+        repeat(DefaultMaxItemsToRetain) { rule.onNodeWithTag("$it").assertIsDeactivated() }
+        rule.onNodeWithTag("$DefaultMaxItemsToRetain").assertDoesNotExist()
+        rule.onNodeWithTag("${DefaultMaxItemsToRetain + 1}").assertIsDisplayed()
     }
 
     @Test
@@ -151,20 +116,15 @@
         lateinit var state: LazyListState
         rule.setContent {
             state = rememberLazyListState()
-            LazyColumn(
-                Modifier.height(itemsSizeDp * 1.5f),
-                state
-            ) {
+            LazyColumn(Modifier.height(itemsSizeDp * 1.5f), state) {
                 items(100) {
                     Spacer(Modifier.height(itemsSizeDp).fillParentMaxWidth().testTag("$it"))
                 }
             }
         }
 
-        rule.onNodeWithTag("0")
-            .assertIsDisplayed()
-        rule.onNodeWithTag("1")
-            .assertIsDisplayed()
+        rule.onNodeWithTag("0").assertIsDisplayed()
+        rule.onNodeWithTag("1").assertIsDisplayed()
 
         rule.runOnIdle {
             runBlocking {
@@ -178,20 +138,15 @@
         }
 
         // recycled
-        rule.onNodeWithTag("1")
-            .assertDoesNotExist()
+        rule.onNodeWithTag("1").assertDoesNotExist()
 
         // in buffer
-        rule.onNodeWithTag("0")
-            .assertIsDeactivated()
-        rule.onNodeWithTag("2")
-            .assertIsDeactivated()
+        rule.onNodeWithTag("0").assertIsDeactivated()
+        rule.onNodeWithTag("2").assertIsDeactivated()
 
         // visible
-        rule.onNodeWithTag("3")
-            .assertIsDisplayed()
-        rule.onNodeWithTag("4")
-            .assertIsDisplayed()
+        rule.onNodeWithTag("3").assertIsDisplayed()
+        rule.onNodeWithTag("4").assertIsDisplayed()
     }
 
     @Test
@@ -199,10 +154,7 @@
         lateinit var state: LazyListState
         rule.setContent {
             state = rememberLazyListState()
-            LazyColumn(
-                Modifier.height(itemsSizeDp * 1.5f),
-                state
-            ) {
+            LazyColumn(Modifier.height(itemsSizeDp * 1.5f), state) {
                 items(100) {
                     Spacer(Modifier.height(itemsSizeDp).fillParentMaxWidth().testTag("$it"))
                 }
@@ -218,22 +170,16 @@
         }
 
         // recycled
-        rule.onNodeWithTag("0")
-            .assertDoesNotExist()
-        rule.onNodeWithTag("1")
-            .assertDoesNotExist()
-        rule.onNodeWithTag("2")
-            .assertDoesNotExist()
+        rule.onNodeWithTag("0").assertDoesNotExist()
+        rule.onNodeWithTag("1").assertDoesNotExist()
+        rule.onNodeWithTag("2").assertDoesNotExist()
 
         // in buffer
-        rule.onNodeWithTag("3")
-            .assertIsDeactivated()
+        rule.onNodeWithTag("3").assertIsDeactivated()
 
         // visible
-        rule.onNodeWithTag("4")
-            .assertIsDisplayed()
-        rule.onNodeWithTag("5")
-            .assertIsDisplayed()
+        rule.onNodeWithTag("4").assertIsDisplayed()
+        rule.onNodeWithTag("5").assertIsDisplayed()
     }
 
     @Test
@@ -241,10 +187,7 @@
         lateinit var state: LazyListState
         rule.setContent {
             state = rememberLazyListState(10)
-            LazyColumn(
-                Modifier.height(itemsSizeDp * 1.5f),
-                state
-            ) {
+            LazyColumn(Modifier.height(itemsSizeDp * 1.5f), state) {
                 items(100) {
                     Spacer(Modifier.height(itemsSizeDp).fillParentMaxWidth().testTag("$it"))
                 }
@@ -257,16 +200,12 @@
         }
 
         // in buffer
-        rule.onNodeWithTag("10")
-            .assertIsDeactivated()
-        rule.onNodeWithTag("11")
-            .assertIsDeactivated()
+        rule.onNodeWithTag("10").assertIsDeactivated()
+        rule.onNodeWithTag("11").assertIsDeactivated()
 
         // visible
-        rule.onNodeWithTag("8")
-            .assertIsDisplayed()
-        rule.onNodeWithTag("9")
-            .assertIsDisplayed()
+        rule.onNodeWithTag("8").assertIsDisplayed()
+        rule.onNodeWithTag("9").assertIsDisplayed()
     }
 
     @Test
@@ -274,10 +213,7 @@
         lateinit var state: LazyListState
         rule.setContent {
             state = rememberLazyListState(10)
-            LazyColumn(
-                Modifier.height(itemsSizeDp * 1.5f),
-                state
-            ) {
+            LazyColumn(Modifier.height(itemsSizeDp * 1.5f), state) {
                 items(100) {
                     Spacer(Modifier.height(itemsSizeDp).fillParentMaxWidth().testTag("$it"))
                 }
@@ -292,14 +228,11 @@
         }
 
         // in buffer
-        rule.onNodeWithTag("8")
-            .assertIsDeactivated()
+        rule.onNodeWithTag("8").assertIsDeactivated()
 
         // visible
-        rule.onNodeWithTag("6")
-            .assertIsDisplayed()
-        rule.onNodeWithTag("7")
-            .assertIsDisplayed()
+        rule.onNodeWithTag("6").assertIsDisplayed()
+        rule.onNodeWithTag("7").assertIsDisplayed()
     }
 
     @Test
@@ -308,37 +241,32 @@
         var counter0 = 0
         var counter1 = 0
 
-        val measureCountModifier0 = Modifier.layout { measurable, constraints ->
-            counter0++
-            val placeable = measurable.measure(constraints)
-            layout(placeable.width, placeable.height) {
-                placeable.place(IntOffset.Zero)
+        val measureCountModifier0 =
+            Modifier.layout { measurable, constraints ->
+                counter0++
+                val placeable = measurable.measure(constraints)
+                layout(placeable.width, placeable.height) { placeable.place(IntOffset.Zero) }
             }
-        }
 
-        val measureCountModifier1 = Modifier.layout { measurable, constraints ->
-            counter1++
-            val placeable = measurable.measure(constraints)
-            layout(placeable.width, placeable.height) {
-                placeable.place(IntOffset.Zero)
+        val measureCountModifier1 =
+            Modifier.layout { measurable, constraints ->
+                counter1++
+                val placeable = measurable.measure(constraints)
+                layout(placeable.width, placeable.height) { placeable.place(IntOffset.Zero) }
             }
-        }
 
         rule.setContent {
             state = rememberLazyListState()
-            LazyColumn(
-                Modifier.height(itemsSizeDp * 1.5f),
-                state
-            ) {
+            LazyColumn(Modifier.height(itemsSizeDp * 1.5f), state) {
                 items(100) {
-                    val modifier = when (it) {
-                        0 -> measureCountModifier0
-                        1 -> measureCountModifier1
-                        else -> Modifier
-                    }
+                    val modifier =
+                        when (it) {
+                            0 -> measureCountModifier0
+                            1 -> measureCountModifier1
+                            else -> Modifier
+                        }
                     Spacer(
-                        Modifier
-                            .height(itemsSizeDp)
+                        Modifier.height(itemsSizeDp)
                             .fillParentMaxWidth()
                             .testTag("$it")
                             .then(modifier)
@@ -357,20 +285,18 @@
 
         rule.runOnIdle {
             Truth.assertWithMessage("Item 0 measured $counter0 times, expected 0.")
-                .that(counter0).isEqualTo(0)
+                .that(counter0)
+                .isEqualTo(0)
             Truth.assertWithMessage("Item 1 measured $counter1 times, expected 0.")
-                .that(counter1).isEqualTo(0)
+                .that(counter1)
+                .isEqualTo(0)
         }
 
-        rule.onNodeWithTag("0")
-            .assertIsDisplayed()
-        rule.onNodeWithTag("1")
-            .assertIsDisplayed()
+        rule.onNodeWithTag("0").assertIsDisplayed()
+        rule.onNodeWithTag("1").assertIsDisplayed()
 
-        rule.onNodeWithTag("2")
-            .assertIsDeactivated()
-        rule.onNodeWithTag("3")
-            .assertIsDeactivated()
+        rule.onNodeWithTag("2").assertIsDeactivated()
+        rule.onNodeWithTag("3").assertIsDeactivated()
     }
 
     @Test
@@ -380,48 +306,32 @@
         val startOfType1 = DefaultMaxItemsToRetain + 1
         rule.setContent {
             state = rememberLazyListState()
-            LazyColumn(
-                Modifier.height(itemsSizeDp * (visibleItemsCount - 0.5f)),
-                state
-            ) {
-                items(
-                    100,
-                    contentType = { if (it >= startOfType1) 1 else 0 }
-                ) {
+            LazyColumn(Modifier.height(itemsSizeDp * (visibleItemsCount - 0.5f)), state) {
+                items(100, contentType = { if (it >= startOfType1) 1 else 0 }) {
                     Spacer(Modifier.height(itemsSizeDp).fillMaxWidth().testTag("$it"))
                 }
             }
         }
 
         for (i in 0 until visibleItemsCount) {
-            rule.onNodeWithTag("$i")
-                .assertIsDisplayed()
+            rule.onNodeWithTag("$i").assertIsDisplayed()
         }
 
-        rule.runOnIdle {
-            runBlocking {
-                state.scrollToItem(visibleItemsCount)
-            }
-        }
+        rule.runOnIdle { runBlocking { state.scrollToItem(visibleItemsCount) } }
 
-        rule.onNodeWithTag("$visibleItemsCount")
-            .assertIsDisplayed()
+        rule.onNodeWithTag("$visibleItemsCount").assertIsDisplayed()
 
         // [DefaultMaxItemsToRetain] items of type 0 are left for reuse
         for (i in 0 until DefaultMaxItemsToRetain) {
-            rule.onNodeWithTag("$i")
-                .assertIsDeactivated()
+            rule.onNodeWithTag("$i").assertIsDeactivated()
         }
-        rule.onNodeWithTag("$DefaultMaxItemsToRetain")
-            .assertDoesNotExist()
+        rule.onNodeWithTag("$DefaultMaxItemsToRetain").assertDoesNotExist()
 
         // and 7 items of type 1
         for (i in startOfType1 until startOfType1 + DefaultMaxItemsToRetain) {
-            rule.onNodeWithTag("$i")
-                .assertIsDeactivated()
+            rule.onNodeWithTag("$i").assertIsDeactivated()
         }
-        rule.onNodeWithTag("${startOfType1 + DefaultMaxItemsToRetain}")
-            .assertDoesNotExist()
+        rule.onNodeWithTag("${startOfType1 + DefaultMaxItemsToRetain}").assertDoesNotExist()
     }
 
     @Test
@@ -429,22 +339,17 @@
         lateinit var state: LazyListState
         rule.setContent {
             state = rememberLazyListState()
-            LazyColumn(
-                Modifier.height(itemsSizeDp * 2.5f),
-                state
-            ) {
-                val content = @Composable { tag: String ->
-                    Spacer(Modifier.height(itemsSizeDp).width(10.dp).testTag(tag))
-                }
-                item(contentType = "not-to-reuse-0") {
-                    content("0")
-                }
-                item(contentType = "reuse") {
-                    content("1")
-                }
+            LazyColumn(Modifier.height(itemsSizeDp * 2.5f), state) {
+                val content =
+                    @Composable { tag: String ->
+                        Spacer(Modifier.height(itemsSizeDp).width(10.dp).testTag(tag))
+                    }
+                item(contentType = "not-to-reuse-0") { content("0") }
+                item(contentType = "reuse") { content("1") }
                 items(
                     List(100) { it + 2 },
-                    contentType = { if (it == 10) "reuse" else "not-to-reuse-$it" }) {
+                    contentType = { if (it == 10) "reuse" else "not-to-reuse-$it" }
+                ) {
                     content("$it")
                 }
             }
@@ -457,10 +362,8 @@
             }
         }
 
-        rule.onNodeWithTag("0")
-            .assertIsDeactivated()
-        rule.onNodeWithTag("1")
-            .assertIsDeactivated()
+        rule.onNodeWithTag("0").assertIsDeactivated()
+        rule.onNodeWithTag("1").assertIsDeactivated()
 
         rule.runOnIdle {
             runBlocking {
@@ -469,16 +372,11 @@
             }
         }
 
-        rule.onNodeWithTag("0")
-            .assertIsDeactivated()
-        rule.onNodeWithTag("1")
-            .assertDoesNotExist()
-        rule.onNodeWithTag("9")
-            .assertIsDisplayed()
-        rule.onNodeWithTag("10")
-            .assertIsDisplayed()
-        rule.onNodeWithTag("11")
-            .assertIsDisplayed()
+        rule.onNodeWithTag("0").assertIsDeactivated()
+        rule.onNodeWithTag("1").assertDoesNotExist()
+        rule.onNodeWithTag("9").assertIsDisplayed()
+        rule.onNodeWithTag("10").assertIsDisplayed()
+        rule.onNodeWithTag("11").assertIsDisplayed()
     }
 }
 
diff --git a/compose/foundation/foundation/integration-tests/lazy-tests/src/androidTest/kotlin/androidx/compose/foundation/lazy/list/LazyListTest.kt b/compose/foundation/foundation/integration-tests/lazy-tests/src/androidTest/kotlin/androidx/compose/foundation/lazy/list/LazyListTest.kt
index c7498dc..b7e858b 100644
--- a/compose/foundation/foundation/integration-tests/lazy-tests/src/androidTest/kotlin/androidx/compose/foundation/lazy/list/LazyListTest.kt
+++ b/compose/foundation/foundation/integration-tests/lazy-tests/src/androidTest/kotlin/androidx/compose/foundation/lazy/list/LazyListTest.kt
@@ -146,23 +146,17 @@
             LazyColumnOrRow(Modifier.mainAxisSize(200.dp)) {
                 item {
                     Spacer(
-                        Modifier
-                            .mainAxisSize(40.dp)
+                        Modifier.mainAxisSize(40.dp)
                             .then(fillParentMaxCrossAxis())
                             .testTag(itemTestTag)
                     )
                 }
                 items(items) {
-                    Spacer(
-                        Modifier
-                            .mainAxisSize(40.dp)
-                            .then(fillParentMaxCrossAxis())
-                            .testTag(it))
+                    Spacer(Modifier.mainAxisSize(40.dp).then(fillParentMaxCrossAxis()).testTag(it))
                 }
                 itemsIndexed(indexedItems) { index, item ->
                     Spacer(
-                        Modifier
-                            .mainAxisSize(41.dp)
+                        Modifier.mainAxisSize(41.dp)
                             .then(fillParentMaxCrossAxis())
                             .testTag("$index-$item")
                     )
@@ -170,23 +164,17 @@
             }
         }
 
-        rule.onNodeWithTag(itemTestTag)
-            .assertIsDisplayed()
+        rule.onNodeWithTag(itemTestTag).assertIsDisplayed()
 
-        rule.onNodeWithTag("1")
-            .assertIsDisplayed()
+        rule.onNodeWithTag("1").assertIsDisplayed()
 
-        rule.onNodeWithTag("2")
-            .assertIsDisplayed()
+        rule.onNodeWithTag("2").assertIsDisplayed()
 
-        rule.onNodeWithTag("0-3")
-            .assertIsDisplayed()
+        rule.onNodeWithTag("0-3").assertIsDisplayed()
 
-        rule.onNodeWithTag("1-4")
-            .assertIsDisplayed()
+        rule.onNodeWithTag("1-4").assertIsDisplayed()
 
-        rule.onNodeWithTag("2-5")
-            .assertDoesNotExist()
+        rule.onNodeWithTag("2-5").assertDoesNotExist()
     }
 
     @Test
@@ -195,18 +183,12 @@
 
         rule.setContentWithTestViewConfiguration {
             LazyColumnOrRow {
-                items(emptyList<Any>()) { }
-                item {
-                    Spacer(
-                        Modifier
-                            .size(10.dp)
-                            .testTag(itemTag))
-                }
+                items(emptyList<Any>()) {}
+                item { Spacer(Modifier.size(10.dp).testTag(itemTag)) }
             }
         }
 
-        rule.onNodeWithTag(itemTag)
-            .assertIsDisplayed()
+        rule.onNodeWithTag(itemTag).assertIsDisplayed()
     }
 
     @Test
@@ -219,15 +201,11 @@
                 items(items) {
                     if (it != null) {
                         Spacer(
-                            Modifier
-                                .mainAxisSize(101.dp)
-                                .then(fillParentMaxCrossAxis())
-                                .testTag(it)
+                            Modifier.mainAxisSize(101.dp).then(fillParentMaxCrossAxis()).testTag(it)
                         )
                     } else {
                         Spacer(
-                            Modifier
-                                .mainAxisSize(101.dp)
+                            Modifier.mainAxisSize(101.dp)
                                 .then(fillParentMaxCrossAxis())
                                 .testTag(nullTestTag)
                         )
@@ -236,14 +214,11 @@
             }
         }
 
-        rule.onNodeWithTag("1")
-            .assertIsDisplayed()
+        rule.onNodeWithTag("1").assertIsDisplayed()
 
-        rule.onNodeWithTag(nullTestTag)
-            .assertIsDisplayed()
+        rule.onNodeWithTag(nullTestTag).assertIsDisplayed()
 
-        rule.onNodeWithTag("3")
-            .assertDoesNotExist()
+        rule.onNodeWithTag("3").assertDoesNotExist()
     }
 
     @Test
@@ -255,27 +230,20 @@
                 LazyColumnOrRow(beyondBoundsItemCount = 0) {
                     items(items) {
                         Spacer(
-                            Modifier
-                                .mainAxisSize(101.dp)
-                                .then(fillParentMaxCrossAxis())
-                                .testTag(it)
+                            Modifier.mainAxisSize(101.dp).then(fillParentMaxCrossAxis()).testTag(it)
                         )
                     }
                 }
             }
         }
 
-        rule.onNodeWithTag("1")
-            .assertIsDisplayed()
+        rule.onNodeWithTag("1").assertIsDisplayed()
 
-        rule.onNodeWithTag("2")
-            .assertIsDisplayed()
+        rule.onNodeWithTag("2").assertIsDisplayed()
 
-        rule.onNodeWithTag("3")
-            .assertDoesNotExist()
+        rule.onNodeWithTag("3").assertDoesNotExist()
 
-        rule.onNodeWithTag("4")
-            .assertDoesNotExist()
+        rule.onNodeWithTag("4").assertDoesNotExist()
     }
 
     @Test
@@ -287,27 +255,20 @@
                 LazyColumnOrRow(beyondBoundsItemCount = 1) {
                     items(items) {
                         Spacer(
-                            Modifier
-                                .mainAxisSize(101.dp)
-                                .then(fillParentMaxCrossAxis())
-                                .testTag(it)
+                            Modifier.mainAxisSize(101.dp).then(fillParentMaxCrossAxis()).testTag(it)
                         )
                     }
                 }
             }
         }
 
-        rule.onNodeWithTag("1")
-            .assertIsDisplayed()
+        rule.onNodeWithTag("1").assertIsDisplayed()
 
-        rule.onNodeWithTag("2")
-            .assertIsDisplayed()
+        rule.onNodeWithTag("2").assertIsDisplayed()
 
-        rule.onNodeWithTag("3")
-            .assertIsNotDisplayed()
+        rule.onNodeWithTag("3").assertIsNotDisplayed()
 
-        rule.onNodeWithTag("4")
-            .assertDoesNotExist()
+        rule.onNodeWithTag("4").assertDoesNotExist()
     }
 
     @Test
@@ -319,30 +280,22 @@
                 LazyColumnOrRow(Modifier.testTag(LazyListTag)) {
                     items(items) {
                         Spacer(
-                            Modifier
-                                .mainAxisSize(101.dp)
-                                .then(fillParentMaxCrossAxis())
-                                .testTag(it)
+                            Modifier.mainAxisSize(101.dp).then(fillParentMaxCrossAxis()).testTag(it)
                         )
                     }
                 }
             }
         }
 
-        rule.onNodeWithTag(LazyListTag)
-            .scrollMainAxisBy(50.dp)
+        rule.onNodeWithTag(LazyListTag).scrollMainAxisBy(50.dp)
 
-        rule.onNodeWithTag("1")
-            .assertIsDisplayed()
+        rule.onNodeWithTag("1").assertIsDisplayed()
 
-        rule.onNodeWithTag("2")
-            .assertIsDisplayed()
+        rule.onNodeWithTag("2").assertIsDisplayed()
 
-        rule.onNodeWithTag("3")
-            .assertIsDisplayed()
+        rule.onNodeWithTag("3").assertIsDisplayed()
 
-        rule.onNodeWithTag("4")
-            .assertIsNotDisplayed()
+        rule.onNodeWithTag("4").assertIsNotDisplayed()
     }
 
     @Test
@@ -354,27 +307,20 @@
                 LazyColumnOrRow(Modifier.testTag(LazyListTag)) {
                     items(items) {
                         Spacer(
-                            Modifier
-                                .mainAxisSize(101.dp)
-                                .then(fillParentMaxCrossAxis())
-                                .testTag(it)
+                            Modifier.mainAxisSize(101.dp).then(fillParentMaxCrossAxis()).testTag(it)
                         )
                     }
                 }
             }
         }
 
-        rule.onNodeWithTag(LazyListTag)
-            .scrollMainAxisBy(105.dp)
+        rule.onNodeWithTag(LazyListTag).scrollMainAxisBy(105.dp)
 
-        rule.onNodeWithTag("1")
-            .assertIsNotDisplayed()
+        rule.onNodeWithTag("1").assertIsNotDisplayed()
 
-        rule.onNodeWithTag("2")
-            .assertIsDisplayed()
+        rule.onNodeWithTag("2").assertIsDisplayed()
 
-        rule.onNodeWithTag("3")
-            .assertIsDisplayed()
+        rule.onNodeWithTag("3").assertIsDisplayed()
     }
 
     @Test
@@ -386,96 +332,77 @@
                 LazyColumnOrRow(Modifier.testTag(LazyListTag)) {
                     items(items) {
                         Spacer(
-                            Modifier
-                                .mainAxisSize(101.dp)
-                                .then(fillParentMaxCrossAxis())
-                                .testTag(it)
+                            Modifier.mainAxisSize(101.dp).then(fillParentMaxCrossAxis()).testTag(it)
                         )
                     }
                 }
             }
         }
 
-        rule.onNodeWithTag(LazyListTag)
-            .scrollMainAxisBy(150.dp)
+        rule.onNodeWithTag(LazyListTag).scrollMainAxisBy(150.dp)
 
-        rule.onNodeWithTag("1")
-            .assertIsNotDisplayed()
+        rule.onNodeWithTag("1").assertIsNotDisplayed()
 
-        rule.onNodeWithTag("2")
-            .assertIsDisplayed()
+        rule.onNodeWithTag("2").assertIsDisplayed()
 
-        rule.onNodeWithTag("3")
-            .assertIsDisplayed()
+        rule.onNodeWithTag("3").assertIsDisplayed()
 
-        rule.onNodeWithTag("4")
-            .assertIsDisplayed()
+        rule.onNodeWithTag("4").assertIsDisplayed()
     }
 
     @Test
-    fun lazyListWrapsContent() = with(rule.density) {
-        val itemInsideLazyList = "itemInsideLazyList"
-        val itemOutsideLazyList = "itemOutsideLazyList"
-        var sameSizeItems by mutableStateOf(true)
+    fun lazyListWrapsContent() =
+        with(rule.density) {
+            val itemInsideLazyList = "itemInsideLazyList"
+            val itemOutsideLazyList = "itemOutsideLazyList"
+            var sameSizeItems by mutableStateOf(true)
 
-        rule.setContentWithTestViewConfiguration {
-            Column {
-                LazyColumnOrRow(Modifier.testTag(LazyListTag)) {
-                    items(listOf(1, 2)) {
-                        if (it == 1) {
-                            Spacer(
-                                Modifier
-                                    .size(50.dp)
-                                    .testTag(itemInsideLazyList))
-                        } else {
-                            Spacer(Modifier.size(if (sameSizeItems) 50.dp else 70.dp))
+            rule.setContentWithTestViewConfiguration {
+                Column {
+                    LazyColumnOrRow(Modifier.testTag(LazyListTag)) {
+                        items(listOf(1, 2)) {
+                            if (it == 1) {
+                                Spacer(Modifier.size(50.dp).testTag(itemInsideLazyList))
+                            } else {
+                                Spacer(Modifier.size(if (sameSizeItems) 50.dp else 70.dp))
+                            }
                         }
                     }
+                    Spacer(Modifier.size(50.dp).testTag(itemOutsideLazyList))
                 }
-                Spacer(
-                    Modifier
-                        .size(50.dp)
-                        .testTag(itemOutsideLazyList))
             }
+
+            rule.onNodeWithTag(itemInsideLazyList).assertIsDisplayed()
+
+            rule.onNodeWithTag(itemOutsideLazyList).assertIsDisplayed()
+
+            var lazyListBounds = rule.onNodeWithTag(LazyListTag).getUnclippedBoundsInRoot()
+            var mainAxisEndBound = if (vertical) lazyListBounds.bottom else lazyListBounds.right
+            var crossAxisEndBound = if (vertical) lazyListBounds.right else lazyListBounds.bottom
+
+            assertThat(lazyListBounds.left.roundToPx()).isWithin1PixelFrom(0.dp.roundToPx())
+            assertThat(mainAxisEndBound.roundToPx()).isWithin1PixelFrom(100.dp.roundToPx())
+            assertThat(lazyListBounds.top.roundToPx()).isWithin1PixelFrom(0.dp.roundToPx())
+            assertThat(crossAxisEndBound.roundToPx()).isWithin1PixelFrom(50.dp.roundToPx())
+
+            rule.runOnIdle { sameSizeItems = false }
+
+            rule.waitForIdle()
+
+            rule.onNodeWithTag(itemInsideLazyList).assertIsDisplayed()
+
+            rule.onNodeWithTag(itemOutsideLazyList).assertIsDisplayed()
+
+            lazyListBounds = rule.onNodeWithTag(LazyListTag).getUnclippedBoundsInRoot()
+            mainAxisEndBound = if (vertical) lazyListBounds.bottom else lazyListBounds.right
+            crossAxisEndBound = if (vertical) lazyListBounds.right else lazyListBounds.bottom
+
+            assertThat(lazyListBounds.left.roundToPx()).isWithin1PixelFrom(0.dp.roundToPx())
+            assertThat(mainAxisEndBound.roundToPx()).isWithin1PixelFrom(120.dp.roundToPx())
+            assertThat(lazyListBounds.top.roundToPx()).isWithin1PixelFrom(0.dp.roundToPx())
+            assertThat(crossAxisEndBound.roundToPx()).isWithin1PixelFrom(70.dp.roundToPx())
         }
 
-        rule.onNodeWithTag(itemInsideLazyList)
-            .assertIsDisplayed()
-
-        rule.onNodeWithTag(itemOutsideLazyList)
-            .assertIsDisplayed()
-
-        var lazyListBounds = rule.onNodeWithTag(LazyListTag).getUnclippedBoundsInRoot()
-        var mainAxisEndBound = if (vertical) lazyListBounds.bottom else lazyListBounds.right
-        var crossAxisEndBound = if (vertical) lazyListBounds.right else lazyListBounds.bottom
-
-        assertThat(lazyListBounds.left.roundToPx()).isWithin1PixelFrom(0.dp.roundToPx())
-        assertThat(mainAxisEndBound.roundToPx()).isWithin1PixelFrom(100.dp.roundToPx())
-        assertThat(lazyListBounds.top.roundToPx()).isWithin1PixelFrom(0.dp.roundToPx())
-        assertThat(crossAxisEndBound.roundToPx()).isWithin1PixelFrom(50.dp.roundToPx())
-
-        rule.runOnIdle {
-            sameSizeItems = false
-        }
-
-        rule.waitForIdle()
-
-        rule.onNodeWithTag(itemInsideLazyList)
-            .assertIsDisplayed()
-
-        rule.onNodeWithTag(itemOutsideLazyList)
-            .assertIsDisplayed()
-
-        lazyListBounds = rule.onNodeWithTag(LazyListTag).getUnclippedBoundsInRoot()
-        mainAxisEndBound = if (vertical) lazyListBounds.bottom else lazyListBounds.right
-        crossAxisEndBound = if (vertical) lazyListBounds.right else lazyListBounds.bottom
-
-        assertThat(lazyListBounds.left.roundToPx()).isWithin1PixelFrom(0.dp.roundToPx())
-        assertThat(mainAxisEndBound.roundToPx()).isWithin1PixelFrom(120.dp.roundToPx())
-        assertThat(lazyListBounds.top.roundToPx()).isWithin1PixelFrom(0.dp.roundToPx())
-        assertThat(crossAxisEndBound.roundToPx()).isWithin1PixelFrom(70.dp.roundToPx())
-    }
-
     @Test
     fun compositionsAreDisposed_whenNodesAreScrolledOff() {
         var composed: Boolean
@@ -485,19 +412,14 @@
 
         rule.setContentWithTestViewConfiguration {
             // Fixed size to eliminate device size as a factor
-            Box(
-                Modifier
-                    .testTag(LazyListTag)
-                    .mainAxisSize(300.dp)) {
+            Box(Modifier.testTag(LazyListTag).mainAxisSize(300.dp)) {
                 LazyColumnOrRow(Modifier.fillMaxSize()) {
                     items(50) {
                         DisposableEffect(NeverEqualObject) {
                             composed = true
                             // Signal when everything is done composing
                             latch.countDown()
-                            onDispose {
-                                disposed = true
-                            }
+                            onDispose { disposed = true }
                         }
 
                         // There will be 10 of these in the 300dp box
@@ -511,24 +433,28 @@
         composed = false
 
         assertWithMessage("Compositions were disposed before we did any scrolling")
-            .that(disposed).isFalse()
+            .that(disposed)
+            .isFalse()
 
         // Mostly a validity check, this is not part of the behavior under test
         assertWithMessage("Additional composition occurred for no apparent reason")
-            .that(composed).isFalse()
+            .that(composed)
+            .isFalse()
 
-        rule.onNodeWithTag(LazyListTag)
-            .performTouchInput { if (vertical) swipeUp() else swipeLeft() }
+        rule.onNodeWithTag(LazyListTag).performTouchInput {
+            if (vertical) swipeUp() else swipeLeft()
+        }
 
         rule.waitForIdle()
 
         assertWithMessage("No additional items were composed after scroll, scroll didn't work")
-            .that(composed).isTrue()
+            .that(composed)
+            .isTrue()
 
         // We may need to modify this test once we prefetch/cache items outside the viewport
-        assertWithMessage(
-            "No compositions were disposed after scrolling, compositions were leaked"
-        ).that(disposed).isTrue()
+        assertWithMessage("No compositions were disposed after scrolling, compositions were leaked")
+            .that(disposed)
+            .isTrue()
     }
 
     @Test
@@ -538,48 +464,32 @@
         var thirdHasSize by mutableStateOf(false)
 
         rule.setContentWithTestViewConfiguration {
-            LazyColumnOrRow(
-                Modifier
-                    .fillMaxCrossAxis()
-                    .mainAxisSize(100.dp)
-                    .testTag(LazyListTag)
-            ) {
+            LazyColumnOrRow(Modifier.fillMaxCrossAxis().mainAxisSize(100.dp).testTag(LazyListTag)) {
                 items(items) {
                     if (it == 3) {
                         Spacer(
-                            Modifier
-                                .testTag(thirdTag)
+                            Modifier.testTag(thirdTag)
                                 .then(fillParentMaxCrossAxis())
                                 .mainAxisSize(if (thirdHasSize) 60.dp else 0.dp)
                         )
                     } else {
-                        Spacer(
-                            Modifier
-                                .then(fillParentMaxCrossAxis())
-                                .mainAxisSize(60.dp))
+                        Spacer(Modifier.then(fillParentMaxCrossAxis()).mainAxisSize(60.dp))
                     }
                 }
             }
         }
 
-        rule.onNodeWithTag(LazyListTag)
-            .scrollMainAxisBy(21.dp)
+        rule.onNodeWithTag(LazyListTag).scrollMainAxisBy(21.dp)
 
-        rule.onNodeWithTag(thirdTag)
-            .assertExists()
-            .assertIsNotDisplayed()
+        rule.onNodeWithTag(thirdTag).assertExists().assertIsNotDisplayed()
 
-        rule.runOnIdle {
-            thirdHasSize = true
-        }
+        rule.runOnIdle { thirdHasSize = true }
 
         rule.waitForIdle()
 
-        rule.onNodeWithTag(LazyListTag)
-            .scrollMainAxisBy(10.dp)
+        rule.onNodeWithTag(LazyListTag).scrollMainAxisBy(10.dp)
 
-        rule.onNodeWithTag(thirdTag)
-            .assertIsDisplayed()
+        rule.onNodeWithTag(thirdTag).assertIsDisplayed()
     }
 
     @Test
@@ -588,18 +498,13 @@
             LazyColumnOrRow(Modifier.requiredSize(width = 100.dp, height = 150.dp)) {
                 items(listOf(0)) {
                     Spacer(
-                        Modifier
-                            .fillParentMaxWidth()
-                            .requiredHeight(50.dp)
-                            .testTag(firstItemTag)
+                        Modifier.fillParentMaxWidth().requiredHeight(50.dp).testTag(firstItemTag)
                     )
                 }
             }
         }
 
-        rule.onNodeWithTag(firstItemTag)
-            .assertWidthIsEqualTo(100.dp)
-            .assertHeightIsEqualTo(50.dp)
+        rule.onNodeWithTag(firstItemTag).assertWidthIsEqualTo(100.dp).assertHeightIsEqualTo(50.dp)
     }
 
     @Test
@@ -608,36 +513,24 @@
             LazyColumnOrRow(Modifier.requiredSize(width = 100.dp, height = 150.dp)) {
                 items(listOf(0)) {
                     Spacer(
-                        Modifier
-                            .requiredWidth(50.dp)
-                            .fillParentMaxHeight()
-                            .testTag(firstItemTag)
+                        Modifier.requiredWidth(50.dp).fillParentMaxHeight().testTag(firstItemTag)
                     )
                 }
             }
         }
 
-        rule.onNodeWithTag(firstItemTag)
-            .assertWidthIsEqualTo(50.dp)
-            .assertHeightIsEqualTo(150.dp)
+        rule.onNodeWithTag(firstItemTag).assertWidthIsEqualTo(50.dp).assertHeightIsEqualTo(150.dp)
     }
 
     @Test
     fun itemFillingParentSize() {
         rule.setContentWithTestViewConfiguration {
             LazyColumnOrRow(Modifier.requiredSize(width = 100.dp, height = 150.dp)) {
-                items(listOf(0)) {
-                    Spacer(
-                        Modifier
-                            .fillParentMaxSize()
-                            .testTag(firstItemTag))
-                }
+                items(listOf(0)) { Spacer(Modifier.fillParentMaxSize().testTag(firstItemTag)) }
             }
         }
 
-        rule.onNodeWithTag(firstItemTag)
-            .assertWidthIsEqualTo(100.dp)
-            .assertHeightIsEqualTo(150.dp)
+        rule.onNodeWithTag(firstItemTag).assertWidthIsEqualTo(100.dp).assertHeightIsEqualTo(150.dp)
     }
 
     @Test
@@ -646,8 +539,7 @@
             LazyColumnOrRow(Modifier.requiredSize(width = 100.dp, height = 150.dp)) {
                 items(listOf(0)) {
                     Spacer(
-                        Modifier
-                            .fillParentMaxWidth(0.7f)
+                        Modifier.fillParentMaxWidth(0.7f)
                             .requiredHeight(50.dp)
                             .testTag(firstItemTag)
                     )
@@ -655,9 +547,7 @@
             }
         }
 
-        rule.onNodeWithTag(firstItemTag)
-            .assertWidthIsEqualTo(70.dp)
-            .assertHeightIsEqualTo(50.dp)
+        rule.onNodeWithTag(firstItemTag).assertWidthIsEqualTo(70.dp).assertHeightIsEqualTo(50.dp)
     }
 
     @Test
@@ -666,8 +556,7 @@
             LazyColumnOrRow(Modifier.requiredSize(width = 100.dp, height = 150.dp)) {
                 items(listOf(0)) {
                     Spacer(
-                        Modifier
-                            .requiredWidth(50.dp)
+                        Modifier.requiredWidth(50.dp)
                             .fillParentMaxHeight(0.3f)
                             .testTag(firstItemTag)
                     )
@@ -675,27 +564,18 @@
             }
         }
 
-        rule.onNodeWithTag(firstItemTag)
-            .assertWidthIsEqualTo(50.dp)
-            .assertHeightIsEqualTo(45.dp)
+        rule.onNodeWithTag(firstItemTag).assertWidthIsEqualTo(50.dp).assertHeightIsEqualTo(45.dp)
     }
 
     @Test
     fun itemFillingParentSizeFraction() {
         rule.setContentWithTestViewConfiguration {
             LazyColumnOrRow(Modifier.requiredSize(width = 100.dp, height = 150.dp)) {
-                items(listOf(0)) {
-                    Spacer(
-                        Modifier
-                            .fillParentMaxSize(0.5f)
-                            .testTag(firstItemTag))
-                }
+                items(listOf(0)) { Spacer(Modifier.fillParentMaxSize(0.5f).testTag(firstItemTag)) }
             }
         }
 
-        rule.onNodeWithTag(firstItemTag)
-            .assertWidthIsEqualTo(50.dp)
-            .assertHeightIsEqualTo(75.dp)
+        rule.onNodeWithTag(firstItemTag).assertWidthIsEqualTo(50.dp).assertHeightIsEqualTo(75.dp)
     }
 
     @Test
@@ -703,34 +583,24 @@
         var parentSize by mutableStateOf(100.dp)
         rule.setContentWithTestViewConfiguration {
             LazyColumnOrRow(Modifier.requiredSize(parentSize)) {
-                items(listOf(0)) {
-                    Spacer(
-                        Modifier
-                            .fillParentMaxSize()
-                            .testTag(firstItemTag))
-                }
+                items(listOf(0)) { Spacer(Modifier.fillParentMaxSize().testTag(firstItemTag)) }
             }
         }
 
-        rule.runOnIdle {
-            parentSize = 150.dp
-        }
+        rule.runOnIdle { parentSize = 150.dp }
 
-        rule.onNodeWithTag(firstItemTag)
-            .assertWidthIsEqualTo(150.dp)
-            .assertHeightIsEqualTo(150.dp)
+        rule.onNodeWithTag(firstItemTag).assertWidthIsEqualTo(150.dp).assertHeightIsEqualTo(150.dp)
     }
 
     @Test
     fun itemFillingParentSizeParentRecomposed_noRemeasureOnReuse() {
         var counter = 0
-        val modifier = Modifier.layout { measurable, constraints ->
-            counter++
-            val placeable = measurable.measure(constraints)
-            layout(placeable.width, placeable.height) {
-                placeable.place(IntOffset.Zero)
+        val modifier =
+            Modifier.layout { measurable, constraints ->
+                counter++
+                val placeable = measurable.measure(constraints)
+                layout(placeable.width, placeable.height) { placeable.place(IntOffset.Zero) }
             }
-        }
 
         lateinit var state: LazyListState
         rule.setContentWithTestViewConfiguration {
@@ -738,11 +608,9 @@
             LazyColumnOrRow(state = state) {
                 items(2) {
                     Spacer(
-                        Modifier
-                            .fillParentMaxSize()
-                            .run {
-                                then(if (it == 0) modifier else Modifier)
-                            }
+                        Modifier.fillParentMaxSize().run {
+                            then(if (it == 0) modifier else Modifier)
+                        }
                     )
                 }
             }
@@ -764,60 +632,36 @@
     fun whenNotAnymoreAvailableItemWasDisplayed() {
         var items by mutableStateOf((1..30).toList())
         rule.setContentWithTestViewConfiguration {
-            LazyColumnOrRow(
-                Modifier
-                    .requiredSize(100.dp)
-                    .testTag(LazyListTag)) {
-                items(items) {
-                    Spacer(
-                        Modifier
-                            .requiredSize(20.dp)
-                            .testTag("$it"))
-                }
+            LazyColumnOrRow(Modifier.requiredSize(100.dp).testTag(LazyListTag)) {
+                items(items) { Spacer(Modifier.requiredSize(20.dp).testTag("$it")) }
             }
         }
 
         // after scroll we will display items 16-20
-        rule.onNodeWithTag(LazyListTag)
-            .scrollMainAxisBy(300.dp)
+        rule.onNodeWithTag(LazyListTag).scrollMainAxisBy(300.dp)
 
-        rule.runOnIdle {
-            items = (1..10).toList()
-        }
+        rule.runOnIdle { items = (1..10).toList() }
 
         // there is no item 16 anymore so we will just display the last items 6-10
-        rule.onNodeWithTag("6")
-            .assertStartPositionIsAlmost(0.dp)
+        rule.onNodeWithTag("6").assertStartPositionIsAlmost(0.dp)
     }
 
     @Test
     fun whenFewDisplayedItemsWereRemoved() {
         var items by mutableStateOf((1..10).toList())
         rule.setContentWithTestViewConfiguration {
-            LazyColumnOrRow(
-                Modifier
-                    .requiredSize(100.dp)
-                    .testTag(LazyListTag)) {
-                items(items) {
-                    Spacer(
-                        Modifier
-                            .requiredSize(20.dp)
-                            .testTag("$it"))
-                }
+            LazyColumnOrRow(Modifier.requiredSize(100.dp).testTag(LazyListTag)) {
+                items(items) { Spacer(Modifier.requiredSize(20.dp).testTag("$it")) }
             }
         }
 
         // after scroll we will display items 6-10
-        rule.onNodeWithTag(LazyListTag)
-            .scrollMainAxisBy(100.dp)
+        rule.onNodeWithTag(LazyListTag).scrollMainAxisBy(100.dp)
 
-        rule.runOnIdle {
-            items = (1..8).toList()
-        }
+        rule.runOnIdle { items = (1..8).toList() }
 
         // there are no more items 9 and 10, so we have to scroll back
-        rule.onNodeWithTag("4")
-            .assertStartPositionIsAlmost(0.dp)
+        rule.onNodeWithTag("4").assertStartPositionIsAlmost(0.dp)
     }
 
     @Test
@@ -825,93 +669,57 @@
         var items by mutableStateOf((1..10).toList())
         rule.setContentWithTestViewConfiguration {
             LazyColumnOrRow(
-                Modifier
-                    .requiredSizeIn(maxHeight = 100.dp, maxWidth = 100.dp)
-                    .testTag(LazyListTag)
+                Modifier.requiredSizeIn(maxHeight = 100.dp, maxWidth = 100.dp).testTag(LazyListTag)
             ) {
-                items(items) {
-                    Spacer(
-                        Modifier
-                            .requiredSize(20.dp)
-                            .testTag("$it"))
-                }
+                items(items) { Spacer(Modifier.requiredSize(20.dp).testTag("$it")) }
             }
         }
 
         // after scroll we will display items 2-6
-        rule.onNodeWithTag(LazyListTag)
-            .scrollMainAxisBy(20.dp)
+        rule.onNodeWithTag(LazyListTag).scrollMainAxisBy(20.dp)
 
-        rule.runOnIdle {
-            items = emptyList()
-        }
+        rule.runOnIdle { items = emptyList() }
 
         // there are no more items so the lazy list is zero sized
-        rule.onNodeWithTag(LazyListTag)
-            .assertWidthIsEqualTo(0.dp)
-            .assertHeightIsEqualTo(0.dp)
+        rule.onNodeWithTag(LazyListTag).assertWidthIsEqualTo(0.dp).assertHeightIsEqualTo(0.dp)
 
         // and has no children
-        rule.onNodeWithTag("1")
-            .assertIsNotPlaced()
-        rule.onNodeWithTag("2")
-            .assertIsNotPlaced()
+        rule.onNodeWithTag("1").assertIsNotPlaced()
+        rule.onNodeWithTag("2").assertIsNotPlaced()
     }
 
     @Test
     fun scrollBackAndForth() {
         val items by mutableStateOf((1..20).toList())
         rule.setContentWithTestViewConfiguration {
-            LazyColumnOrRow(
-                Modifier
-                    .requiredSize(100.dp)
-                    .testTag(LazyListTag)) {
-                items(items) {
-                    Spacer(
-                        Modifier
-                            .requiredSize(20.dp)
-                            .testTag("$it"))
-                }
+            LazyColumnOrRow(Modifier.requiredSize(100.dp).testTag(LazyListTag)) {
+                items(items) { Spacer(Modifier.requiredSize(20.dp).testTag("$it")) }
             }
         }
 
         // after scroll we will display items 6-10
-        rule.onNodeWithTag(LazyListTag)
-            .scrollMainAxisBy(100.dp)
+        rule.onNodeWithTag(LazyListTag).scrollMainAxisBy(100.dp)
 
         // and scroll back
-        rule.onNodeWithTag(LazyListTag)
-            .scrollMainAxisBy((-100).dp)
+        rule.onNodeWithTag(LazyListTag).scrollMainAxisBy((-100).dp)
 
-        rule.onNodeWithTag("1")
-            .assertStartPositionIsAlmost(0.dp)
+        rule.onNodeWithTag("1").assertStartPositionIsAlmost(0.dp)
     }
 
     @Test
     fun tryToScrollBackwardWhenAlreadyOnTop() {
         val items by mutableStateOf((1..20).toList())
         rule.setContentWithTestViewConfiguration {
-            LazyColumnOrRow(
-                Modifier
-                    .requiredSize(100.dp)
-                    .testTag(LazyListTag)) {
-                items(items) {
-                    Spacer(
-                        Modifier
-                            .requiredSize(20.dp)
-                            .testTag("$it"))
-                }
+            LazyColumnOrRow(Modifier.requiredSize(100.dp).testTag(LazyListTag)) {
+                items(items) { Spacer(Modifier.requiredSize(20.dp).testTag("$it")) }
             }
         }
 
         // we already displaying the first item, so this should do nothing
-        rule.onNodeWithTag(LazyListTag)
-            .scrollMainAxisBy((-50).dp)
+        rule.onNodeWithTag(LazyListTag).scrollMainAxisBy((-50).dp)
 
-        rule.onNodeWithTag("1")
-            .assertStartPositionIsAlmost(0.dp)
-        rule.onNodeWithTag("5")
-            .assertStartPositionIsAlmost(80.dp)
+        rule.onNodeWithTag("1").assertStartPositionIsAlmost(0.dp)
+        rule.onNodeWithTag("5").assertStartPositionIsAlmost(80.dp)
     }
 
     @Test
@@ -920,10 +728,7 @@
         var firstItemRecomposed = 0
         var secondItemRecomposed = 0
         rule.setContentWithTestViewConfiguration {
-            LazyColumnOrRow(
-                Modifier
-                    .requiredSize(100.dp)
-                    .testTag(LazyListTag)) {
+            LazyColumnOrRow(Modifier.requiredSize(100.dp).testTag(LazyListTag)) {
                 items(items) {
                     if (it.count == 1) {
                         firstItemRecomposed++
@@ -940,8 +745,7 @@
             assertThat(secondItemRecomposed).isEqualTo(1)
         }
 
-        rule.onNodeWithTag(LazyListTag)
-            .scrollMainAxisBy(50.dp)
+        rule.onNodeWithTag(LazyListTag).scrollMainAxisBy(50.dp)
 
         rule.runOnIdle {
             assertThat(firstItemRecomposed).isEqualTo(1)
@@ -956,28 +760,14 @@
         rule.setContentWithTestViewConfiguration {
             state = rememberLazyListState()
             state.prefetchingEnabled = false
-            LazyColumnOrRow(
-                Modifier
-                    .requiredSize(100.dp)
-                    .testTag(LazyListTag),
-                state = state
-            ) {
-                items(items) {
-                    Spacer(
-                        Modifier
-                            .requiredSize(20.dp)
-                            .testTag("$it"))
-                }
+            LazyColumnOrRow(Modifier.requiredSize(100.dp).testTag(LazyListTag), state = state) {
+                items(items) { Spacer(Modifier.requiredSize(20.dp).testTag("$it")) }
             }
         }
 
         val initialMeasurePasses = state.numMeasurePasses
 
-        rule.runOnIdle {
-            with(rule.density) {
-                state.onScroll(-110.dp.toPx())
-            }
-        }
+        rule.runOnIdle { with(rule.density) { state.onScroll(-110.dp.toPx()) } }
 
         rule.waitForIdle()
 
@@ -990,24 +780,12 @@
         lateinit var state: LazyListState
         rule.setContent {
             state = rememberLazyListState()
-            LazyColumnOrRow(
-                Modifier
-                    .requiredSize(100.dp)
-                    .testTag(LazyListTag),
-                state = state
-            ) {
-                items(items) {
-                    Spacer(
-                        Modifier
-                            .requiredSize(20.dp)
-                            .testTag("$it"))
-                }
+            LazyColumnOrRow(Modifier.requiredSize(100.dp).testTag(LazyListTag), state = state) {
+                items(items) { Spacer(Modifier.requiredSize(20.dp).testTag("$it")) }
             }
         }
 
-        rule.runOnIdle {
-            assertThat(state.numMeasurePasses).isEqualTo(1)
-        }
+        rule.runOnIdle { assertThat(state.numMeasurePasses).isEqualTo(1) }
     }
 
     @Test
@@ -1016,18 +794,8 @@
         lateinit var state: LazyListState
         rule.setContentWithTestViewConfiguration {
             state = rememberLazyListState()
-            LazyColumnOrRow(
-                Modifier
-                    .requiredSize(100.dp)
-                    .testTag(LazyListTag),
-                state = state
-            ) {
-                items(items) {
-                    Spacer(
-                        Modifier
-                            .requiredSize(20.dp)
-                            .testTag("$it"))
-                }
+            LazyColumnOrRow(Modifier.requiredSize(100.dp).testTag(LazyListTag), state = state) {
+                items(items) { Spacer(Modifier.requiredSize(20.dp).testTag("$it")) }
             }
         }
 
@@ -1036,14 +804,14 @@
             assertThat(state.firstVisibleItemScrollOffset).isEqualTo(0)
         }
 
-        rule.onNodeWithTag(LazyListTag)
-            .scrollMainAxisBy(30.dp)
+        rule.onNodeWithTag(LazyListTag).scrollMainAxisBy(30.dp)
 
         rule.runOnIdle {
             assertThat(state.firstVisibleItemIndex).isEqualTo(1)
 
             with(rule.density) {
-                // TODO(b/169232491): test scrolling doesn't appear to be scrolling exactly the right
+                // TODO(b/169232491): test scrolling doesn't appear to be scrolling exactly the
+                // right
                 //  number of pixels
                 val expectedOffset = 10.dp.roundToPx()
                 val tolerance = 2.dp.roundToPx()
@@ -1058,31 +826,19 @@
         lateinit var state: LazyListState
         rule.setContentWithTestViewConfiguration {
             state = rememberLazyListState()
-            LazyColumnOrRow(
-                Modifier
-                    .requiredSize(100.dp)
-                    .testTag(LazyListTag),
-                state = state
-            ) {
-                items(items) {
-                    Spacer(
-                        Modifier
-                            .requiredSize(20.dp)
-                            .testTag("$it"))
-                }
+            LazyColumnOrRow(Modifier.requiredSize(100.dp).testTag(LazyListTag), state = state) {
+                items(items) { Spacer(Modifier.requiredSize(20.dp).testTag("$it")) }
             }
         }
 
-        rule.onNodeWithTag(LazyListTag)
-            .scrollMainAxisBy(10.dp)
+        rule.onNodeWithTag(LazyListTag).scrollMainAxisBy(10.dp)
 
         rule.runOnIdle {
             assertThat(state.firstVisibleItemIndex).isEqualTo(0)
             with(rule.density) {
                 val expectedOffset = 10.dp.roundToPx()
                 val tolerance = 2.dp.roundToPx()
-                assertThat(state.firstVisibleItemScrollOffset)
-                    .isEqualTo(expectedOffset, tolerance)
+                assertThat(state.firstVisibleItemScrollOffset).isEqualTo(expectedOffset, tolerance)
             }
         }
     }
@@ -1091,32 +847,19 @@
     fun scroll_makeListSmaller_scroll() {
         var items by mutableStateOf((1..100).toList())
         rule.setContentWithTestViewConfiguration {
-            LazyColumnOrRow(
-                Modifier
-                    .requiredSize(100.dp)
-                    .testTag(LazyListTag)) {
-                items(items) {
-                    Spacer(
-                        Modifier
-                            .requiredSize(10.dp)
-                            .testTag("$it"))
-                }
+            LazyColumnOrRow(Modifier.requiredSize(100.dp).testTag(LazyListTag)) {
+                items(items) { Spacer(Modifier.requiredSize(10.dp).testTag("$it")) }
             }
         }
 
-        rule.onNodeWithTag(LazyListTag)
-            .scrollMainAxisBy(300.dp)
+        rule.onNodeWithTag(LazyListTag).scrollMainAxisBy(300.dp)
 
-        rule.runOnIdle {
-            items = (1..11).toList()
-        }
+        rule.runOnIdle { items = (1..11).toList() }
 
         // try to scroll after the data set has been updated. this was causing a crash previously
-        rule.onNodeWithTag(LazyListTag)
-            .scrollMainAxisBy((-10).dp)
+        rule.onNodeWithTag(LazyListTag).scrollMainAxisBy((-10).dp)
 
-        rule.onNodeWithTag("1")
-            .assertIsDisplayed()
+        rule.onNodeWithTag("1").assertIsDisplayed()
     }
 
     @Test
@@ -1126,18 +869,8 @@
         val expectedOffset = with(rule.density) { 10.dp.roundToPx() }
         rule.setContentWithTestViewConfiguration {
             state = rememberLazyListState(2, expectedOffset)
-            LazyColumnOrRow(
-                Modifier
-                    .requiredSize(100.dp)
-                    .testTag(LazyListTag),
-                state = state
-            ) {
-                items(items) {
-                    Spacer(
-                        Modifier
-                            .requiredSize(20.dp)
-                            .testTag("$it"))
-                }
+            LazyColumnOrRow(Modifier.requiredSize(100.dp).testTag(LazyListTag), state = state) {
+                items(items) { Spacer(Modifier.requiredSize(20.dp).testTag("$it")) }
             }
         }
 
@@ -1146,8 +879,7 @@
             assertThat(state.firstVisibleItemScrollOffset).isEqualTo(expectedOffset)
         }
 
-        rule.onNodeWithTag("2")
-            .assertStartPositionInRootIsEqualTo((-10).dp)
+        rule.onNodeWithTag("2").assertStartPositionInRootIsEqualTo((-10).dp)
     }
 
     @Test
@@ -1156,27 +888,15 @@
         var state: LazyListState? = null
         restorationTester.setContent {
             state = rememberLazyListState()
-            LazyColumnOrRow(
-                Modifier
-                    .requiredSize(100.dp)
-                    .testTag(LazyListTag),
-                state = state!!
-            ) {
-                items(20) {
-                    Spacer(
-                        Modifier
-                            .requiredSize(20.dp)
-                            .testTag("$it"))
-                }
+            LazyColumnOrRow(Modifier.requiredSize(100.dp).testTag(LazyListTag), state = state!!) {
+                items(20) { Spacer(Modifier.requiredSize(20.dp).testTag("$it")) }
             }
         }
 
-        rule.onNodeWithTag(LazyListTag)
-            .scrollMainAxisBy(30.dp)
+        rule.onNodeWithTag(LazyListTag).scrollMainAxisBy(30.dp)
 
-        val (index, scrollOffset) = rule.runOnIdle {
-            state!!.firstVisibleItemIndex to state!!.firstVisibleItemScrollOffset
-        }
+        val (index, scrollOffset) =
+            rule.runOnIdle { state!!.firstVisibleItemIndex to state!!.firstVisibleItemScrollOffset }
 
         state = null
 
@@ -1193,25 +913,13 @@
         lateinit var state: LazyListState
         rule.setContentWithTestViewConfiguration {
             state = rememberLazyListState()
-            LazyColumnOrRow(
-                Modifier
-                    .requiredSize(100.dp)
-                    .testTag(LazyListTag),
-                state = state
-            ) {
-                items(20) {
-                    Spacer(
-                        Modifier
-                            .requiredSize(20.dp)
-                            .testTag("$it"))
-                }
+            LazyColumnOrRow(Modifier.requiredSize(100.dp).testTag(LazyListTag), state = state) {
+                items(20) { Spacer(Modifier.requiredSize(20.dp).testTag("$it")) }
             }
         }
 
         rule.runOnIdle {
-            runBlocking {
-                state.scrollToItem(3, 10)
-            }
+            runBlocking { state.scrollToItem(3, 10) }
             assertThat(state.firstVisibleItemIndex).isEqualTo(3)
             assertThat(state.firstVisibleItemScrollOffset).isEqualTo(10)
         }
@@ -1223,28 +931,22 @@
         val redrawCount = Array(6) { 0 }
         rule.setContentWithTestViewConfiguration {
             LazyColumnOrRow(
-                modifier = Modifier
-                    .requiredSize(100.dp)
-                    .testTag(LazyListTag),
+                modifier = Modifier.requiredSize(100.dp).testTag(LazyListTag),
                 beyondBoundsItemCount = 0
             ) {
                 items(items) {
-                    Spacer(
-                        Modifier
-                            .requiredSize(20.dp)
-                            .drawBehind { redrawCount[it]++ }
-                    )
+                    Spacer(Modifier.requiredSize(20.dp).drawBehind { redrawCount[it]++ })
                 }
             }
         }
 
-        rule.onNodeWithTag(LazyListTag)
-            .scrollMainAxisBy(10.dp)
+        rule.onNodeWithTag(LazyListTag).scrollMainAxisBy(10.dp)
 
         rule.runOnIdle {
             redrawCount.forEachIndexed { index, i ->
                 assertWithMessage("Item with index $index was redrawn $i times")
-                    .that(i).isEqualTo(1)
+                    .that(i)
+                    .isEqualTo(1)
             }
         }
     }
@@ -1256,28 +958,22 @@
         val redrawCount = Array(6 + beyondBoundsItemCount) { 0 }
         rule.setContentWithTestViewConfiguration {
             LazyColumnOrRow(
-                modifier = Modifier
-                    .requiredSize(100.dp)
-                    .testTag(LazyListTag),
+                modifier = Modifier.requiredSize(100.dp).testTag(LazyListTag),
                 beyondBoundsItemCount = beyondBoundsItemCount
             ) {
                 items(items) {
-                    Spacer(
-                        Modifier
-                            .requiredSize(20.dp)
-                            .drawBehind { redrawCount[it]++ }
-                    )
+                    Spacer(Modifier.requiredSize(20.dp).drawBehind { redrawCount[it]++ })
                 }
             }
         }
 
-        rule.onNodeWithTag(LazyListTag)
-            .scrollMainAxisBy(10.dp)
+        rule.onNodeWithTag(LazyListTag).scrollMainAxisBy(10.dp)
 
         rule.runOnIdle {
             redrawCount.forEachIndexed { index, i ->
                 assertWithMessage("Item with index $index was redrawn $i times")
-                    .that(i).isEqualTo(1)
+                    .that(i)
+                    .isEqualTo(1)
             }
         }
     }
@@ -1287,20 +983,15 @@
         val redrawCount = Array(2) { 0 }
         var stateUsedInDrawScope by mutableStateOf(false)
         rule.setContentWithTestViewConfiguration {
-            LazyColumnOrRow(
-                Modifier
-                    .requiredSize(100.dp)
-                    .testTag(LazyListTag)) {
+            LazyColumnOrRow(Modifier.requiredSize(100.dp).testTag(LazyListTag)) {
                 items(2) {
                     Spacer(
-                        Modifier
-                            .requiredSize(50.dp)
-                            .drawBehind {
-                                redrawCount[it]++
-                                if (it == 1) {
-                                    stateUsedInDrawScope.hashCode()
-                                }
+                        Modifier.requiredSize(50.dp).drawBehind {
+                            redrawCount[it]++
+                            if (it == 1) {
+                                stateUsedInDrawScope.hashCode()
                             }
+                        }
                     )
                 }
             }
@@ -1309,15 +1000,15 @@
         // Due to b/302303969 there are no guarantees runOnIdle() will wait for drawing to happen
         rule.waitUntil { redrawCount[0] == 1 && redrawCount[1] == 1 }
 
-        rule.runOnIdle {
-            stateUsedInDrawScope = true
-        }
+        rule.runOnIdle { stateUsedInDrawScope = true }
 
         rule.runOnIdle {
             assertWithMessage("First items is not expected to be redrawn")
-                .that(redrawCount[0]).isEqualTo(1)
+                .that(redrawCount[0])
+                .isEqualTo(1)
             assertWithMessage("Second items is expected to be redrawn")
-                .that(redrawCount[1]).isEqualTo(2)
+                .that(redrawCount[1])
+                .isEqualTo(2)
         }
     }
 
@@ -1328,21 +1019,15 @@
         lateinit var state: LazyListState
         rule.setContentWithTestViewConfiguration {
             LazyColumnOrRow(
-                Modifier
-                    .mainAxisSize(itemSizeMinusOne)
-                    .testTag(LazyListTag),
+                Modifier.mainAxisSize(itemSizeMinusOne).testTag(LazyListTag),
                 state = rememberLazyListState().also { state = it }
             ) {
                 items(2) {
                     Spacer(
                         if (it == 0) {
-                            Modifier
-                                .crossAxisSize(30.dp)
-                                .mainAxisSize(itemSizeMinusOne)
+                            Modifier.crossAxisSize(30.dp).mainAxisSize(itemSizeMinusOne)
                         } else {
-                            Modifier
-                                .crossAxisSize(20.dp)
-                                .mainAxisSize(itemSize)
+                            Modifier.crossAxisSize(20.dp).mainAxisSize(itemSize)
                         }
                     )
                 }
@@ -1351,8 +1036,7 @@
 
         state.scrollBy(itemSize)
 
-        rule.onNodeWithTag(LazyListTag)
-            .assertCrossAxisSizeIsEqualTo(20.dp)
+        rule.onNodeWithTag(LazyListTag).assertCrossAxisSizeIsEqualTo(20.dp)
     }
 
     @Test
@@ -1362,25 +1046,17 @@
         lateinit var state: LazyListState
         rule.setContentWithTestViewConfiguration {
             LazyColumnOrRow(
-                Modifier
-                    .mainAxisSize(itemSize * 1.75f)
-                    .testTag(LazyListTag),
+                Modifier.mainAxisSize(itemSize * 1.75f).testTag(LazyListTag),
                 state = rememberLazyListState().also { state = it }
             ) {
                 items(items) {
                     Spacer(
                         if (it == 0) {
-                            Modifier
-                                .crossAxisSize(30.dp)
-                                .mainAxisSize(itemSize / 2)
+                            Modifier.crossAxisSize(30.dp).mainAxisSize(itemSize / 2)
                         } else if (it == 1) {
-                            Modifier
-                                .crossAxisSize(20.dp)
-                                .mainAxisSize(itemSize / 2)
+                            Modifier.crossAxisSize(20.dp).mainAxisSize(itemSize / 2)
                         } else {
-                            Modifier
-                                .crossAxisSize(20.dp)
-                                .mainAxisSize(itemSize)
+                            Modifier.crossAxisSize(20.dp).mainAxisSize(itemSize)
                         }
                     )
                 }
@@ -1389,8 +1065,7 @@
 
         state.scrollBy(itemSize)
 
-        rule.onNodeWithTag(LazyListTag)
-            .assertCrossAxisSizeIsEqualTo(30.dp)
+        rule.onNodeWithTag(LazyListTag).assertCrossAxisSizeIsEqualTo(30.dp)
     }
 
     @Test
@@ -1400,24 +1075,14 @@
         val itemSize = with(rule.density) { 15.toDp() }
 
         rule.setContentWithTestViewConfiguration {
-            LazyColumnOrRow {
-                items(items) {
-                    Spacer(
-                        Modifier
-                            .requiredSize(itemSize)
-                            .testTag(it))
-                }
-            }
+            LazyColumnOrRow { items(items) { Spacer(Modifier.requiredSize(itemSize).testTag(it)) } }
         }
 
-        rule.onNodeWithTag("1")
-            .assertStartPositionInRootIsEqualTo(0.dp)
+        rule.onNodeWithTag("1").assertStartPositionInRootIsEqualTo(0.dp)
 
-        rule.onNodeWithTag("2")
-            .assertStartPositionInRootIsEqualTo(itemSize)
+        rule.onNodeWithTag("2").assertStartPositionInRootIsEqualTo(itemSize)
 
-        rule.onNodeWithTag("3")
-            .assertStartPositionInRootIsEqualTo(itemSize * 2)
+        rule.onNodeWithTag("3").assertStartPositionInRootIsEqualTo(itemSize * 2)
     }
 
     @Test
@@ -1429,22 +1094,16 @@
         rule.setContentWithTestViewConfiguration {
             LazyColumnOrRow {
                 itemsIndexed(items) { index, item ->
-                    Spacer(
-                        Modifier
-                            .requiredSize(itemSize)
-                            .testTag("$index*$item"))
+                    Spacer(Modifier.requiredSize(itemSize).testTag("$index*$item"))
                 }
             }
         }
 
-        rule.onNodeWithTag("0*1")
-            .assertStartPositionInRootIsEqualTo(0.dp)
+        rule.onNodeWithTag("0*1").assertStartPositionInRootIsEqualTo(0.dp)
 
-        rule.onNodeWithTag("1*2")
-            .assertStartPositionInRootIsEqualTo(itemSize)
+        rule.onNodeWithTag("1*2").assertStartPositionInRootIsEqualTo(itemSize)
 
-        rule.onNodeWithTag("2*3")
-            .assertStartPositionInRootIsEqualTo(itemSize * 2)
+        rule.onNodeWithTag("2*3").assertStartPositionInRootIsEqualTo(itemSize * 2)
     }
 
     @Test
@@ -1454,10 +1113,7 @@
         val composedIndexes = mutableListOf<Int>()
         rule.setContent {
             state = rememberLazyListState()
-            LazyColumnOrRow(
-                Modifier
-                    .fillMaxCrossAxis()
-                    .mainAxisSize(10.dp), state) {
+            LazyColumnOrRow(Modifier.fillMaxCrossAxis().mainAxisSize(10.dp), state) {
                 items(count) { index ->
                     composedIndexes.add(index)
                     Box(Modifier.size(20.dp))
@@ -1468,12 +1124,8 @@
         rule.runOnIdle {
             composedIndexes.clear()
             count = 10
-            runBlocking(AutoTestFrameClock()) {
-                state.scrollToItem(50)
-            }
-            composedIndexes.forEach {
-                assertThat(it).isLessThan(count)
-            }
+            runBlocking(AutoTestFrameClock()) { state.scrollToItem(50) }
+            composedIndexes.forEach { assertThat(it).isLessThan(count) }
             assertThat(state.firstVisibleItemIndex).isEqualTo(9)
         }
     }
@@ -1485,84 +1137,55 @@
         val itemSizeDp = with(rule.density) { itemSizePx.toDp() }
         val containerSize = itemSizeDp * 5
         rule.setContentWithTestViewConfiguration {
-            Box(
-                Modifier
-                    .testTag(containerTag)
-                    .size(containerSize)
-            ) {
+            Box(Modifier.testTag(containerTag).size(containerSize)) {
                 LazyColumnOrRow(
-                    Modifier
-                        .testTag(LazyListTag)
-                        .background(Color.Blue),
+                    Modifier.testTag(LazyListTag).background(Color.Blue),
                     state = rememberLazyListState(2, 5)
                 ) {
                     items(100) {
-                        Box(
-                            Modifier
-                                .fillMaxCrossAxis()
-                                .mainAxisSize(itemSizeDp)
-                                .testTag("$it")
-                        )
+                        Box(Modifier.fillMaxCrossAxis().mainAxisSize(itemSizeDp).testTag("$it"))
                     }
                 }
             }
         }
 
-        rule.onNodeWithTag(LazyListTag)
-            .performTouchInput {
-                // we do move manually and not with swipe() utility because we want to have one
-                // drag gesture, not multiple smaller ones
-                down(center)
-                if (vertical) {
-                    moveBy(Offset(0f, -TestTouchSlop))
-                    moveBy(
-                        Offset(
-                            0f,
-                            itemSizePx * 15f // large value which makes us overscroll
-                        )
+        rule.onNodeWithTag(LazyListTag).performTouchInput {
+            // we do move manually and not with swipe() utility because we want to have one
+            // drag gesture, not multiple smaller ones
+            down(center)
+            if (vertical) {
+                moveBy(Offset(0f, -TestTouchSlop))
+                moveBy(
+                    Offset(
+                        0f,
+                        itemSizePx * 15f // large value which makes us overscroll
                     )
-                } else {
-                    moveBy(Offset(-TestTouchSlop, 0f))
-                    moveBy(
-                        Offset(
-                            itemSizePx * 15f, // large value which makes us overscroll
-                            0f
-                        )
+                )
+            } else {
+                moveBy(Offset(-TestTouchSlop, 0f))
+                moveBy(
+                    Offset(
+                        itemSizePx * 15f, // large value which makes us overscroll
+                        0f
                     )
-                }
-                up()
+                )
             }
+            up()
+        }
 
-        rule.onNodeWithTag(LazyListTag)
-            .assertMainAxisSizeIsEqualTo(containerSize)
+        rule.onNodeWithTag(LazyListTag).assertMainAxisSizeIsEqualTo(containerSize)
 
-        rule.onNodeWithTag("0")
-            .assertStartPositionInRootIsEqualTo(0.dp)
-        rule.onNodeWithTag("4")
-            .assertStartPositionInRootIsEqualTo(containerSize - itemSizeDp)
+        rule.onNodeWithTag("0").assertStartPositionInRootIsEqualTo(0.dp)
+        rule.onNodeWithTag("4").assertStartPositionInRootIsEqualTo(containerSize - itemSizeDp)
     }
 
     @SdkSuppress(minSdkVersion = Build.VERSION_CODES.O)
     @Test
     fun doesNotClipHorizontalOverdraw() {
         rule.setContent {
-            Box(
-                Modifier
-                    .size(60.dp)
-                    .testTag("container")
-                    .background(Color.Gray)) {
-                LazyColumnOrRow(
-                    Modifier
-                        .padding(20.dp)
-                        .fillMaxSize(),
-                    rememberLazyListState(1)
-                ) {
-                    items(4) {
-                        Box(
-                            Modifier
-                                .size(20.dp)
-                                .drawOutsideOfBounds())
-                    }
+            Box(Modifier.size(60.dp).testTag("container").background(Color.Gray)) {
+                LazyColumnOrRow(Modifier.padding(20.dp).fillMaxSize(), rememberLazyListState(1)) {
+                    items(4) { Box(Modifier.size(20.dp).drawOutsideOfBounds()) }
                 }
             }
         }
@@ -1570,7 +1193,8 @@
         val horizontalPadding = if (vertical) 0.dp else 20.dp
         val verticalPadding = if (vertical) 20.dp else 0.dp
 
-        rule.onNodeWithTag("container")
+        rule
+            .onNodeWithTag("container")
             .captureToImage()
             .assertShape(
                 density = rule.density,
@@ -1589,15 +1213,11 @@
         rule.setContent {
             state = rememberLazyListState(2, 10)
             LazyColumnOrRow(Modifier.fillMaxSize(), state) {
-                items(itemsCount) {
-                    Box(Modifier.size(20.dp))
-                }
+                items(itemsCount) { Box(Modifier.size(20.dp)) }
             }
         }
 
-        rule.runOnIdle {
-            itemsCount = 100
-        }
+        rule.runOnIdle { itemsCount = 100 }
 
         rule.runOnIdle {
             assertThat(state.firstVisibleItemIndex).isEqualTo(2)
@@ -1615,16 +1235,12 @@
             state = rememberLazyListState()
             LazyColumnOrRow(Modifier.fillMaxSize(), state) {
                 recomposeCounter.value
-                items(itemsCount) {
-                    Box(Modifier.size(20.dp))
-                }
+                items(itemsCount) { Box(Modifier.size(20.dp)) }
             }
         }
 
         rule.runOnIdle {
-            runBlocking {
-                state.scrollToItem(2, 10)
-            }
+            runBlocking { state.scrollToItem(2, 10) }
             itemsCount = 0
         }
 
@@ -1648,13 +1264,9 @@
         var reverse = false
         rule.setContent {
             val listState = rememberLazyListState()
-            SideEffect {
-                state = listState
-            }
+            SideEffect { state = listState }
             LazyColumnOrRow(Modifier.fillMaxSize(), listState) {
-                items(2500) { _ ->
-                    Box(Modifier.size(100.dp))
-                }
+                items(2500) { _ -> Box(Modifier.size(100.dp)) }
             }
 
             if (reverse) {
@@ -1668,9 +1280,7 @@
         listOf(500, 800, 1500, 1600, 1800).forEach {
             target = it
             rule.runOnIdle {
-                runBlocking(AutoTestFrameClock()) {
-                    state.animateScrollToItem(target)
-                }
+                runBlocking(AutoTestFrameClock()) { state.animateScrollToItem(target) }
             }
 
             rule.runOnIdle {
@@ -1684,9 +1294,7 @@
         listOf(1600, 1500, 800, 500, 0).forEach {
             target = it
             rule.runOnIdle {
-                runBlocking(AutoTestFrameClock()) {
-                    state.animateScrollToItem(target)
-                }
+                runBlocking(AutoTestFrameClock()) { state.animateScrollToItem(target) }
             }
 
             rule.runOnIdle {
@@ -1701,13 +1309,8 @@
         lateinit var state: LazyListState
         rule.setContent {
             state = rememberLazyListState()
-            LazyColumnOrRow(
-                Modifier
-                    .crossAxisSize(150.dp)
-                    .mainAxisSize(100.dp), state) {
-                items(20) {
-                    Box(Modifier.size(150.dp))
-                }
+            LazyColumnOrRow(Modifier.crossAxisSize(150.dp).mainAxisSize(100.dp), state) {
+                items(20) { Box(Modifier.size(150.dp)) }
             }
         }
 
@@ -1733,22 +1336,14 @@
         val countState = mutableStateOf(0)
         rule.setContent {
             val count = countState.value
-            LazyColumnOrRow {
-                item {
-                    BasicText(text = "Count $count")
-                }
-            }
+            LazyColumnOrRow { item { BasicText(text = "Count $count") } }
         }
 
-        rule.onNodeWithText("Count 0")
-            .assertIsDisplayed()
+        rule.onNodeWithText("Count 0").assertIsDisplayed()
 
-        rule.runOnIdle {
-            countState.value++
-        }
+        rule.runOnIdle { countState.value++ }
 
-        rule.onNodeWithText("Count 1")
-            .assertIsDisplayed()
+        rule.onNodeWithText("Count 1").assertIsDisplayed()
     }
 
     @Test
@@ -1758,9 +1353,7 @@
 
         rule.setContent {
             LazyColumnOrRow(Modifier.testTag(LazyListTag), state = state) {
-                items(50) {
-                    Box(Modifier.mainAxisSize(200.dp))
-                }
+                items(50) { Box(Modifier.mainAxisSize(200.dp)) }
             }
         }
 
@@ -1804,12 +1397,7 @@
                 modifier = Modifier.requiredSize(itemSize * 3),
                 state = LazyListState(firstVisibleItemIndex = Int.MAX_VALUE - 3)
             ) {
-                items(Int.MAX_VALUE) {
-                    Box(
-                        Modifier
-                            .size(itemSize)
-                            .testTag("$it"))
-                }
+                items(Int.MAX_VALUE) { Box(Modifier.size(itemSize).testTag("$it")) }
             }
         }
 
@@ -1830,17 +1418,11 @@
                 modifier = Modifier.requiredSize(itemSize),
                 state = LazyListState(firstVisibleItemIndex = Int.MAX_VALUE / 2)
             ) {
-                items(Int.MAX_VALUE, key = { it }) {
-                    Box(
-                        Modifier
-                            .size(itemSize)
-                            .testTag("$it"))
-                }
+                items(Int.MAX_VALUE, key = { it }) { Box(Modifier.size(itemSize).testTag("$it")) }
             }
         }
 
-        rule.onNodeWithTag("${Int.MAX_VALUE / 2}")
-            .assertStartPositionInRootIsEqualTo(0.dp)
+        rule.onNodeWithTag("${Int.MAX_VALUE / 2}").assertStartPositionInRootIsEqualTo(0.dp)
     }
 
     @Test
@@ -1852,20 +1434,13 @@
                 Modifier.mainAxisSize(itemSize * 3),
                 state = rememberLazyListState().also { state = it },
             ) {
-                items(5) {
-                    Spacer(
-                        Modifier
-                            .size(itemSize)
-                            .testTag("$it")
-                    )
-                }
+                items(5) { Spacer(Modifier.size(itemSize).testTag("$it")) }
             }
         }
 
         state.scrollBy(itemSize)
 
-        rule.onNodeWithTag("0")
-            .assertIsNotDisplayed()
+        rule.onNodeWithTag("0").assertIsNotDisplayed()
 
         rule.runOnIdle {
             assertThat(state.firstVisibleItemIndex).isEqualTo(1)
@@ -1878,24 +1453,16 @@
         val itemSize = with(rule.density) { 30.toDp() }
         rule.setContentWithTestViewConfiguration {
             LazyColumnOrRow(
-                Modifier
-                    .mainAxisSize(itemSize * 3)
-                    .testTag(LazyListTag),
+                Modifier.mainAxisSize(itemSize * 3).testTag(LazyListTag),
                 userScrollEnabled = true,
             ) {
-                items(5) {
-                    Spacer(
-                        Modifier
-                            .size(itemSize)
-                            .testTag("$it"))
-                }
+                items(5) { Spacer(Modifier.size(itemSize).testTag("$it")) }
             }
         }
 
         rule.onNodeWithTag(LazyListTag).scrollBy(itemSize)
 
-        rule.onNodeWithTag("1")
-            .assertStartPositionInRootIsEqualTo(0.dp)
+        rule.onNodeWithTag("1").assertStartPositionInRootIsEqualTo(0.dp)
     }
 
     @Test
@@ -1903,24 +1470,16 @@
         val itemSize = with(rule.density) { 30.toDp() }
         rule.setContentWithTestViewConfiguration {
             LazyColumnOrRow(
-                Modifier
-                    .mainAxisSize(itemSize * 3)
-                    .testTag(LazyListTag),
+                Modifier.mainAxisSize(itemSize * 3).testTag(LazyListTag),
                 userScrollEnabled = false,
             ) {
-                items(5) {
-                    Spacer(
-                        Modifier
-                            .size(itemSize)
-                            .testTag("$it"))
-                }
+                items(5) { Spacer(Modifier.size(itemSize).testTag("$it")) }
             }
         }
 
         rule.onNodeWithTag(LazyListTag).scrollBy(itemSize)
 
-        rule.onNodeWithTag("1")
-            .assertStartPositionInRootIsEqualTo(itemSize)
+        rule.onNodeWithTag("1").assertStartPositionInRootIsEqualTo(itemSize)
     }
 
     @Test
@@ -1933,19 +1492,13 @@
                 state = rememberLazyListState().also { state = it },
                 userScrollEnabled = false,
             ) {
-                items(5) {
-                    Spacer(
-                        Modifier
-                            .size(itemSize)
-                            .testTag("$it"))
-                }
+                items(5) { Spacer(Modifier.size(itemSize).testTag("$it")) }
             }
         }
 
         state.scrollBy(itemSize)
 
-        rule.onNodeWithTag("1")
-            .assertStartPositionInRootIsEqualTo(0.dp)
+        rule.onNodeWithTag("1").assertStartPositionInRootIsEqualTo(0.dp)
     }
 
     @Test
@@ -1953,21 +1506,15 @@
         val itemSize = with(rule.density) { 30.toDp() }
         rule.setContentWithTestViewConfiguration {
             LazyColumnOrRow(
-                Modifier
-                    .mainAxisSize(itemSize * 3)
-                    .testTag(LazyListTag),
+                Modifier.mainAxisSize(itemSize * 3).testTag(LazyListTag),
                 userScrollEnabled = false,
             ) {
-                items(5) {
-                    Spacer(
-                        Modifier
-                            .size(itemSize)
-                            .testTag("$it"))
-                }
+                items(5) { Spacer(Modifier.size(itemSize).testTag("$it")) }
             }
         }
 
-        rule.onNodeWithTag(LazyListTag)
+        rule
+            .onNodeWithTag(LazyListTag)
             .assert(keyNotDefined(SemanticsActions.ScrollBy))
             .assert(keyNotDefined(SemanticsActions.ScrollToIndex))
             // but we still have a read only scroll range property
@@ -1988,16 +1535,10 @@
         lateinit var state: LazyListState
         rule.setContent {
             state = rememberLazyListState()
-            LazyColumnOrRow(
-                modifier = Modifier.mainAxisSize(itemSize + 1.dp),
-                state = state
-            ) {
+            LazyColumnOrRow(modifier = Modifier.mainAxisSize(itemSize + 1.dp), state = state) {
                 items(4) {
                     if (it != 1) {
-                        Box(
-                            Modifier
-                                .size(itemSize)
-                                .testTag(it.toString()))
+                        Box(Modifier.size(itemSize).testTag(it.toString()))
                     }
                 }
             }
@@ -2006,11 +1547,7 @@
         rule.onNodeWithTag("0").assertIsDisplayed()
         rule.onNodeWithTag("2").assertIsDisplayed()
 
-        rule.runOnIdle {
-            runBlocking {
-                state.scrollToItem(1)
-            }
-        }
+        rule.runOnIdle { runBlocking { state.scrollToItem(1) } }
 
         rule.onNodeWithTag("0").assertIsNotDisplayed()
         rule.onNodeWithTag("2").assertIsDisplayed()
@@ -2020,44 +1557,33 @@
     @Test
     fun withZeroSizedFirstItem_shouldNotConsumedDrag() {
         var scrollConsumedAccumulator = Offset.Zero
-        val collectingDataConnection = object : NestedScrollConnection {
-            override fun onPostScroll(
-                consumed: Offset,
-                available: Offset,
-                source: NestedScrollSource
-            ): Offset {
-                scrollConsumedAccumulator += consumed
-                return Offset.Zero
+        val collectingDataConnection =
+            object : NestedScrollConnection {
+                override fun onPostScroll(
+                    consumed: Offset,
+                    available: Offset,
+                    source: NestedScrollSource
+                ): Offset {
+                    scrollConsumedAccumulator += consumed
+                    return Offset.Zero
+                }
             }
-        }
 
         rule.setContent {
             val state = rememberLazyListState()
             LazyColumnOrRow(
-                modifier = Modifier
-                    .testTag("mainList")
-                    .nestedScroll(collectingDataConnection),
+                modifier = Modifier.testTag("mainList").nestedScroll(collectingDataConnection),
                 state = state,
                 contentPadding = androidx.compose.foundation.layout.PaddingValues(all = 10.dp)
             ) {
-                item {
-                    Spacer(modifier = Modifier.size(size = 0.dp))
-                }
-                items(10) {
-                    Box(Modifier.fillMaxWidth()) {
-                        BasicText(text = it.toString())
-                    }
-                }
+                item { Spacer(modifier = Modifier.size(size = 0.dp)) }
+                items(10) { Box(Modifier.fillMaxWidth()) { BasicText(text = it.toString()) } }
             }
         }
 
-        rule.onNodeWithTag("mainList").performTouchInput {
-            swipeDown()
-        }
+        rule.onNodeWithTag("mainList").performTouchInput { swipeDown() }
 
-        rule.runOnIdle {
-            assertThat(scrollConsumedAccumulator).isEqualTo(Offset.Zero)
-        }
+        rule.runOnIdle { assertThat(scrollConsumedAccumulator).isEqualTo(Offset.Zero) }
     }
 
     @Test
@@ -2067,22 +1593,20 @@
         rule.setContent {
             val state = rememberLazyListState()
             LazyColumnOrRow(
-                modifier = Modifier
-                    .testTag("mainList"),
+                modifier = Modifier.testTag("mainList"),
                 state = state,
                 contentPadding = androidx.compose.foundation.layout.PaddingValues(all = 10.dp)
             ) {
                 item {
-                    Spacer(modifier = Modifier
-                        .testTag("firstItem")
-                        .size(size = firstItemSize.value)
-                        .background(Color.Black))
+                    Spacer(
+                        modifier =
+                            Modifier.testTag("firstItem")
+                                .size(size = firstItemSize.value)
+                                .background(Color.Black)
+                    )
                 }
                 items(10) {
-                    Box(
-                        Modifier
-                            .background(Color.Red)
-                            .fillMaxWidth()) {
+                    Box(Modifier.background(Color.Red).fillMaxWidth()) {
                         BasicText(text = it.toString())
                     }
                 }
@@ -2097,13 +1621,12 @@
     @Test
     fun recomposingWithNewComposedModifierObjectIsNotCausingRemeasure() {
         var remeasureCount = 0
-        val layoutModifier = Modifier.layout { measurable, constraints ->
-            remeasureCount++
-            val placeable = measurable.measure(constraints)
-            layout(placeable.width, placeable.height) {
-                placeable.place(0, 0)
+        val layoutModifier =
+            Modifier.layout { measurable, constraints ->
+                remeasureCount++
+                val placeable = measurable.measure(constraints)
+                layout(placeable.width, placeable.height) { placeable.place(0, 0) }
             }
-        }
         val counter = mutableStateOf(0)
 
         rule.setContentWithTestViewConfiguration {
@@ -2113,9 +1636,7 @@
                 // without causing remeasure
                 Modifier.composed { layoutModifier }
             ) {
-                items(1) {
-                    Spacer(Modifier.size(10.dp))
-                }
+                items(1) { Spacer(Modifier.size(10.dp)) }
             }
         }
 
@@ -2124,9 +1645,7 @@
             counter.value++
         }
 
-        rule.runOnIdle {
-            assertThat(remeasureCount).isEqualTo(1)
-        }
+        rule.runOnIdle { assertThat(remeasureCount).isEqualTo(1) }
     }
 
     @Test
@@ -2135,18 +1654,14 @@
         rule.setContentWithTestViewConfiguration {
             LazyColumnOrRow {
                 try {
-                    items(-1) {
-                        Box(Modifier)
-                    }
+                    items(-1) { Box(Modifier) }
                 } catch (e: Exception) {
                     exception = e
                 }
             }
         }
 
-        rule.runOnIdle {
-            assertThat(exception).isInstanceOf(IllegalArgumentException::class.java)
-        }
+        rule.runOnIdle { assertThat(exception).isInstanceOf(IllegalArgumentException::class.java) }
     }
 
     @Test
@@ -2163,23 +1678,17 @@
                 },
                 state
             ) {
-                items(1000) {
-                    Spacer(Modifier.size(10.dp))
-                }
+                items(1000) { Spacer(Modifier.size(10.dp)) }
             }
         }
 
         rule.runOnIdle {
             assertThat(recomposeCount).isEqualTo(1)
 
-            runBlocking {
-                state.scrollToItem(100)
-            }
+            runBlocking { state.scrollToItem(100) }
         }
 
-        rule.runOnIdle {
-            assertThat(recomposeCount).isEqualTo(1)
-        }
+        rule.runOnIdle { assertThat(recomposeCount).isEqualTo(1) }
     }
 
     @Test
@@ -2190,17 +1699,10 @@
 
         rule.setContentWithTestViewConfiguration {
             state = rememberLazyListState()
-            LazyColumnOrRow(
-                Modifier
-                    .testTag(LazyListTag)
-                    .mainAxisSize(100.dp),
-                state
-            ) {
+            LazyColumnOrRow(Modifier.testTag(LazyListTag).mainAxisSize(100.dp), state) {
                 items(1000) {
                     Spacer(Modifier.size(5.dp))
-                    SideEffect {
-                        recomposedItems[it] = (recomposedItems[it] ?: 0) + 1
-                    }
+                    SideEffect { recomposedItems[it] = (recomposedItems[it] ?: 0) + 1 }
                     DisposableEffect(it) {
                         onDispose {
                             val count = recomposedItems.remove(it)
@@ -2213,8 +1715,7 @@
             }
         }
 
-        rule.onNodeWithTag(LazyListTag)
-            .scrollMainAxisBy(250.dp) // 10 items, half a screen
+        rule.onNodeWithTag(LazyListTag).scrollMainAxisBy(250.dp) // 10 items, half a screen
 
         rule.runOnIdle {
             assertThat(composedMoreThanOnce).isEqualTo(0)
@@ -2230,15 +1731,10 @@
     @SdkSuppress(minSdkVersion = Build.VERSION_CODES.O)
     fun zIndexOnItemAffectsDrawingOrder() {
         rule.setContentWithTestViewConfiguration {
-            LazyColumnOrRow(
-                Modifier
-                    .size(6.dp)
-                    .testTag(LazyListTag)
-            ) {
+            LazyColumnOrRow(Modifier.size(6.dp).testTag(LazyListTag)) {
                 items(listOf(Color.Blue, Color.Green, Color.Red)) { color ->
                     Box(
-                        Modifier
-                            .mainAxisSize(2.dp)
+                        Modifier.mainAxisSize(2.dp)
                             .crossAxisSize(6.dp)
                             .zIndex(if (color == Color.Green) 1f else 0f)
                             .drawBehind {
@@ -2247,14 +1743,13 @@
                                     topLeft = Offset(-10.dp.toPx(), -10.dp.toPx()),
                                     size = Size(20.dp.toPx(), 20.dp.toPx())
                                 )
-                            })
+                            }
+                    )
                 }
             }
         }
 
-        rule.onNodeWithTag(LazyListTag)
-            .captureToImage()
-            .assertPixels { Color.Green }
+        rule.onNodeWithTag(LazyListTag).captureToImage().assertPixels { Color.Green }
     }
 
     @Test
@@ -2264,29 +1759,21 @@
                 val state = rememberLazyListState()
                 LazyColumnOrRow(
                     state = state,
-                    modifier = Modifier
-                        .mainAxisSize(100.dp)
-                        .fillMaxCrossAxis()
+                    modifier = Modifier.mainAxisSize(100.dp).fillMaxCrossAxis()
                 ) {
                     items(20) {
                         val tag = it.toString()
                         BasicText(
                             text = tag,
-                            modifier = Modifier
-                                .mainAxisSize(30.dp)
-                                .fillMaxCrossAxis()
-                                .testTag(tag)
+                            modifier = Modifier.mainAxisSize(30.dp).fillMaxCrossAxis().testTag(tag)
                         )
                     }
                 }
-                LaunchedEffect(state) {
-                    state.scrollToItem(10)
-                }
+                LaunchedEffect(state) { state.scrollToItem(10) }
             }
         }
 
-        rule.onNodeWithTag("10")
-            .assertStartPositionInRootIsEqualTo(0.dp)
+        rule.onNodeWithTag("10").assertStartPositionInRootIsEqualTo(0.dp)
     }
 
     @Test
@@ -2295,28 +1782,20 @@
             val state = rememberLazyListState()
             LazyColumnOrRow(
                 state = state,
-                modifier = Modifier
-                    .mainAxisSize(100.dp)
-                    .fillMaxCrossAxis()
+                modifier = Modifier.mainAxisSize(100.dp).fillMaxCrossAxis()
             ) {
                 items(20) {
                     val tag = it.toString()
                     BasicText(
                         text = tag,
-                        modifier = Modifier
-                            .mainAxisSize(30.dp)
-                            .fillMaxCrossAxis()
-                            .testTag(tag)
+                        modifier = Modifier.mainAxisSize(30.dp).fillMaxCrossAxis().testTag(tag)
                     )
                 }
             }
-            LaunchedEffect(state) {
-                state.scrollToItem(10)
-            }
+            LaunchedEffect(state) { state.scrollToItem(10) }
         }
 
-        rule.onNodeWithTag("10")
-            .assertStartPositionInRootIsEqualTo(0.dp)
+        rule.onNodeWithTag("10").assertStartPositionInRootIsEqualTo(0.dp)
     }
 
     @Test
@@ -2324,27 +1803,30 @@
         // arrange
         val tracker = VelocityTracker()
         var velocity = Velocity.Zero
-        val capturingScrollConnection = object : NestedScrollConnection {
-            override suspend fun onPreFling(available: Velocity): Velocity {
-                velocity += available
-                return Velocity.Zero
+        val capturingScrollConnection =
+            object : NestedScrollConnection {
+                override suspend fun onPreFling(available: Velocity): Velocity {
+                    velocity += available
+                    return Velocity.Zero
+                }
             }
-        }
         rule.setContent {
-            Box(modifier = Modifier
-                .background(Color.Yellow)
-                .nestedScroll(capturingScrollConnection)
-                .fillMaxWidth()
-                .pointerInput(Unit) {
-                    savePointerInputEvents(tracker, this)
-                }) {
+            Box(
+                modifier =
+                    Modifier.background(Color.Yellow)
+                        .nestedScroll(capturingScrollConnection)
+                        .fillMaxWidth()
+                        .pointerInput(Unit) { savePointerInputEvents(tracker, this) }
+            ) {
                 LazyColumnOrRow {
                     items(200) {
-                        Box(modifier = Modifier
-                            .fillMaxWidth()
-                            .height(48.dp)
-                            .padding(8.dp)
-                            .background(Color.Blue))
+                        Box(
+                            modifier =
+                                Modifier.fillMaxWidth()
+                                    .height(48.dp)
+                                    .padding(8.dp)
+                                    .background(Color.Blue)
+                        )
                     }
                 }
             }
@@ -2385,7 +1867,8 @@
         // extra recompositions
         val itemContent: @Composable LazyItemScope.(index: Int) -> Unit = {
             assertWithMessage("Item $it should be larger than $previousItem")
-                .that(it > previousItem).isTrue()
+                .that(it > previousItem)
+                .isTrue()
             previousItem = it
             BasicText("$it", Modifier.size(10.dp))
         }
@@ -2412,23 +1895,19 @@
         val state = LazyListState(1, 10)
         var constraints by mutableStateOf(Constraints.fixed(100, 100))
         rule.setContentWithTestViewConfiguration {
-            Layout(content = {
-                LazyColumnOrRow(state = state) {
-                    items(3) {
-                        Box(Modifier.fillParentMaxSize())
+            Layout(
+                content = {
+                    LazyColumnOrRow(state = state) {
+                        items(3) { Box(Modifier.fillParentMaxSize()) }
                     }
                 }
-            }) { measurables, _ ->
+            ) { measurables, _ ->
                 val placeable = measurables.first().measure(constraints)
-                layout(constraints.maxWidth, constraints.maxHeight) {
-                    placeable.place(0, 0)
-                }
+                layout(constraints.maxWidth, constraints.maxHeight) { placeable.place(0, 0) }
             }
         }
 
-        rule.runOnIdle {
-            constraints = Constraints.fixed(500, 500)
-        }
+        rule.runOnIdle { constraints = Constraints.fixed(500, 500) }
 
         rule.runOnIdle {
             assertThat(state.firstVisibleItemIndex).isEqualTo(1)
@@ -2470,30 +1949,16 @@
             scope = rememberCoroutineScope()
             LookaheadScope {
                 LazyColumnOrRow(Modifier.mainAxisSize(containerSizeDp), state = state) {
-                    repeat(20) {
-                        item {
-                            Box(
-                                Modifier
-                                    .size(itemSizeDp)
-                                    .testTag("$it")
-                            )
-                        }
-                    }
+                    repeat(20) { item { Box(Modifier.size(itemSizeDp).testTag("$it")) } }
                 }
             }
         }
 
-        rule.runOnIdle {
-            runBlocking {
-                scope.launch {
-                    state.scrollBy(scrollDelta)
-                }
-            }
-        }
+        rule.runOnIdle { runBlocking { scope.launch { state.scrollBy(scrollDelta) } } }
 
-        rule.onNodeWithTag("0")
-            .assertMainAxisStartPositionInRootIsEqualTo(-scrollDeltaDp)
-        rule.onNodeWithTag("1")
+        rule.onNodeWithTag("0").assertMainAxisStartPositionInRootIsEqualTo(-scrollDeltaDp)
+        rule
+            .onNodeWithTag("1")
             .assertMainAxisStartPositionInRootIsEqualTo(itemSizeDp - scrollDeltaDp)
     }
 
@@ -2567,15 +2032,11 @@
                 } else {
                     Modifier.requiredWidth(ItemSize.dp * (list.size - startingIndex))
                 },
-                state = rememberLazyListState(
-                    initialFirstVisibleItemIndex = startingIndex
-                ),
-
-                ) {
+                state = rememberLazyListState(initialFirstVisibleItemIndex = startingIndex),
+            ) {
                 items(list, key = { it }) { item ->
                     Box(
-                        Modifier
-                            .animateItem(
+                        Modifier.animateItem(
                                 fadeInSpec = null,
                                 fadeOutSpec = null,
                                 placementSpec = tween<IntOffset>(160)
@@ -2599,40 +2060,36 @@
         postLookaheadPosition: MutableMap<Int, Int>,
         lookaheadScope: LookaheadScope,
         item: Int
-    ): Modifier = this.layout { measurable, constraints ->
-        measurable
-            .measure(constraints)
-            .run {
+    ): Modifier =
+        this.layout { measurable, constraints ->
+            measurable.measure(constraints).run {
                 layout(width, height) {
                     if (isLookingAhead) {
                         lookaheadPosition[item] =
                             with(lookaheadScope) {
                                 coordinates!!
                                     .findRootCoordinates()
-                                    .localLookaheadPositionOf(
-                                        coordinates!!
-                                    )
+                                    .localLookaheadPositionOf(coordinates!!)
                                     .let {
                                         if (vertical) {
-                                            it.y
-                                        } else {
-                                            it.x
-                                        }.roundToInt()
+                                                it.y
+                                            } else {
+                                                it.x
+                                            }
+                                            .roundToInt()
                                     }
                             }
                     } else {
                         postLookaheadPosition[item] =
                             coordinates!!
                                 .positionInRoot()
-                                .let {
-                                    if (vertical) it.y else it.x
-                                }
+                                .let { if (vertical) it.y else it.x }
                                 .roundToInt()
                     }
                     place(0, 0)
                 }
             }
-    }
+        }
 
     @OptIn(ExperimentalComposeUiApi::class, ExperimentalFoundationApi::class)
     @Test
@@ -2647,8 +2104,7 @@
                     LazyColumnOrRow {
                         items(4, key = { it }) {
                             Box(
-                                Modifier
-                                    .animateItem(
+                                Modifier.animateItem(
                                         fadeInSpec = null,
                                         fadeOutSpec = null,
                                         placementSpec = tween<IntOffset>(160, easing = LinearEasing)
@@ -2660,9 +2116,9 @@
                                         it
                                     )
                                     .then(
-                                        if (animateSizeChange) Modifier.animateContentSize(
-                                            tween(160)
-                                        ) else Modifier
+                                        if (animateSizeChange)
+                                            Modifier.animateContentSize(tween(160))
+                                        else Modifier
                                     )
                                     .requiredSize(if (large) ItemSize.dp * 2 else ItemSize.dp)
                             )
@@ -2717,110 +2173,102 @@
     }
 
     @Test
-    fun animContentSize_resetOnReuse() = with(rule.density) {
-        val visBoxCount = 10
-        val maxItemCount = 10 * visBoxCount
-        val boxHeightPx = 100
-        val smallBoxPx = 100
-        val mediumBoxPx = 200
-        val largeBoxPx = 300
-        val maxHeightPx = visBoxCount * boxHeightPx
+    fun animContentSize_resetOnReuse() =
+        with(rule.density) {
+            val visBoxCount = 10
+            val maxItemCount = 10 * visBoxCount
+            val boxHeightPx = 100
+            val smallBoxPx = 100
+            val mediumBoxPx = 200
+            val largeBoxPx = 300
+            val maxHeightPx = visBoxCount * boxHeightPx
 
-        val mediumItemsStartIndex = 50
+            val mediumItemsStartIndex = 50
 
-        var assertedSmallItems = false
-        var assertedMediumItems = false
+            var assertedSmallItems = false
+            var assertedMediumItems = false
 
-        /**
-         * Since only the first item is expected to animate. This Modifier can check that all other
-         * items were only measure at their expected dimensions.
-         */
-        fun Modifier.assertMeasureCalls(index: Int): Modifier {
-            return this.layout { measurable, constraints ->
-                val placeable = measurable.measure(constraints)
-                when {
-                    index == 0 -> {
-                        // Do nothing
-                    }
-
-                    index >= mediumItemsStartIndex -> {
-                        assertedMediumItems = true
-                        assertEquals(mediumBoxPx, placeable.width)
-                        assertEquals(boxHeightPx, placeable.height)
-                    }
-
-                    else -> {
-                        assertedSmallItems = true
-                        assertEquals(smallBoxPx, placeable.width)
-                        assertEquals(boxHeightPx, placeable.height)
-                    }
-                }
-                layout(placeable.width, placeable.height) {
-                    placeable.place(0, 0)
-                }
-            }
-        }
-
-        val isFirstElementExpanded = mutableStateOf(false)
-
-        val listState = LazyListState()
-        rule.setContent {
-            LazyColumnOrRow(
-                modifier = Modifier.height(maxHeightPx.toDp()),
-                state = listState
-            ) {
-                items(maxItemCount) { index ->
-                    val modifier = when {
+            /**
+             * Since only the first item is expected to animate. This Modifier can check that all
+             * other items were only measure at their expected dimensions.
+             */
+            fun Modifier.assertMeasureCalls(index: Int): Modifier {
+                return this.layout { measurable, constraints ->
+                    val placeable = measurable.measure(constraints)
+                    when {
                         index == 0 -> {
-                            val sizeDp = if (isFirstElementExpanded.value) {
-                                largeBoxPx.toDp()
-                            } else {
-                                smallBoxPx.toDp()
-                            }
-                            Modifier.requiredSize(sizeDp)
+                            // Do nothing
                         }
-
                         index >= mediumItemsStartIndex -> {
-                            Modifier
-                                .requiredSize(mediumBoxPx.toDp(), boxHeightPx.toDp())
+                            assertedMediumItems = true
+                            assertEquals(mediumBoxPx, placeable.width)
+                            assertEquals(boxHeightPx, placeable.height)
                         }
-
                         else -> {
-                            Modifier
-                                .requiredSize(smallBoxPx.toDp(), boxHeightPx.toDp())
+                            assertedSmallItems = true
+                            assertEquals(smallBoxPx, placeable.width)
+                            assertEquals(boxHeightPx, placeable.height)
                         }
                     }
-                    Box(
-                        Modifier
-                            .wrapContentSize()
-                            .assertMeasureCalls(index)
-                            .animateContentSize()
-                    ) {
-                        Box(modifier)
+                    layout(placeable.width, placeable.height) { placeable.place(0, 0) }
+                }
+            }
+
+            val isFirstElementExpanded = mutableStateOf(false)
+
+            val listState = LazyListState()
+            rule.setContent {
+                LazyColumnOrRow(modifier = Modifier.height(maxHeightPx.toDp()), state = listState) {
+                    items(maxItemCount) { index ->
+                        val modifier =
+                            when {
+                                index == 0 -> {
+                                    val sizeDp =
+                                        if (isFirstElementExpanded.value) {
+                                            largeBoxPx.toDp()
+                                        } else {
+                                            smallBoxPx.toDp()
+                                        }
+                                    Modifier.requiredSize(sizeDp)
+                                }
+                                index >= mediumItemsStartIndex -> {
+                                    Modifier.requiredSize(mediumBoxPx.toDp(), boxHeightPx.toDp())
+                                }
+                                else -> {
+                                    Modifier.requiredSize(smallBoxPx.toDp(), boxHeightPx.toDp())
+                                }
+                            }
+                        Box(
+                            Modifier.wrapContentSize()
+                                .assertMeasureCalls(index)
+                                .animateContentSize()
+                        ) {
+                            Box(modifier)
+                        }
                     }
                 }
             }
+
+            // Wait for layout to settle
+            rule.waitForIdle()
+
+            // Trigger an animation on the first element and wait for completion
+            isFirstElementExpanded.value = true
+            rule.waitForIdle()
+
+            // Scroll to a different index and wait for layout to settle.
+            // At the selected index, ALL layout nodes will have a different size. If
+            // `animateContentSize` wasn't properly reset, it might have started more animations,
+            // caught
+            // with `assertMeasureCalls`.
+            listState.scrollTo(mediumItemsStartIndex)
+            rule.waitForIdle()
+
+            // Safety check to prevent silent failures (no UI was run)
+            assert(assertedMediumItems)
+            assert(assertedSmallItems)
         }
 
-        // Wait for layout to settle
-        rule.waitForIdle()
-
-        // Trigger an animation on the first element and wait for completion
-        isFirstElementExpanded.value = true
-        rule.waitForIdle()
-
-        // Scroll to a different index and wait for layout to settle.
-        // At the selected index, ALL layout nodes will have a different size. If
-        // `animateContentSize` wasn't properly reset, it might have started more animations, caught
-        // with `assertMeasureCalls`.
-        listState.scrollTo(mediumItemsStartIndex)
-        rule.waitForIdle()
-
-        // Safety check to prevent silent failures (no UI was run)
-        assert(assertedMediumItems)
-        assert(assertedSmallItems)
-    }
-
     @OptIn(ExperimentalComposeUiApi::class, ExperimentalFoundationApi::class)
     @Test
     fun animVisibilityWithPlacementAnimator() {
@@ -2834,14 +2282,11 @@
                         items(4, key = { it }) {
                             if (vertical) {
                                 Column(
-                                    Modifier
-                                        .animateItem(
+                                    Modifier.animateItem(
                                             fadeInSpec = null,
                                             fadeOutSpec = null,
-                                            placementSpec = tween<IntOffset>(
-                                                160,
-                                                easing = LinearEasing
-                                            )
+                                            placementSpec =
+                                                tween<IntOffset>(160, easing = LinearEasing)
                                         )
                                         .trackPositions(
                                             lookaheadPosition,
@@ -2857,14 +2302,11 @@
                                 }
                             } else {
                                 Row(
-                                    Modifier
-                                        .animateItem(
+                                    Modifier.animateItem(
                                             fadeInSpec = null,
                                             fadeOutSpec = null,
-                                            placementSpec = tween<IntOffset>(
-                                                160,
-                                                easing = LinearEasing
-                                            )
+                                            placementSpec =
+                                                tween<IntOffset>(160, easing = LinearEasing)
                                         )
                                         .trackPositions(
                                             lookaheadPosition,
@@ -2918,47 +2360,45 @@
         rule.setContent {
             LookaheadScope {
                 CompositionLocalProvider(LocalDensity provides Density(1f)) {
-                    LazyColumnOrRow(Modifier.layout { measurable, _ ->
-                        val constraints = if (isLookingAhead) {
-                            Constraints.fixed(4 * ItemSize, 4 * ItemSize)
-                        } else {
-                            Constraints.fixed(postLookaheadSize, postLookaheadSize)
-                        }
-                        measurable.measure(constraints).run {
-                            layout(width, height) {
-                                place(0, 0)
+                    LazyColumnOrRow(
+                        Modifier.layout { measurable, _ ->
+                            val constraints =
+                                if (isLookingAhead) {
+                                    Constraints.fixed(4 * ItemSize, 4 * ItemSize)
+                                } else {
+                                    Constraints.fixed(postLookaheadSize, postLookaheadSize)
+                                }
+                            measurable.measure(constraints).run {
+                                layout(width, height) { place(0, 0) }
                             }
                         }
-                    }) {
+                    ) {
                         items(4) {
                             Box(
-                                Modifier
-                                    .requiredSize(ItemSize.dp)
-                                    .layout { measurable, constraints ->
-                                        measurable
-                                            .measure(constraints)
-                                            .run {
-                                                layout(width, height) {
-                                                    if (isLookingAhead) {
-                                                        lookaheadPositions[it] = coordinates!!
-                                                            .findRootCoordinates()
-                                                            .localLookaheadPositionOf(coordinates!!)
-                                                    } else {
-                                                        postLookaheadPositions[it] =
-                                                            coordinates!!.positionInRoot()
-                                                    }
-                                                }
+                                Modifier.requiredSize(ItemSize.dp).layout { measurable, constraints
+                                    ->
+                                    measurable.measure(constraints).run {
+                                        layout(width, height) {
+                                            if (isLookingAhead) {
+                                                lookaheadPositions[it] =
+                                                    coordinates!!
+                                                        .findRootCoordinates()
+                                                        .localLookaheadPositionOf(coordinates!!)
+                                            } else {
+                                                postLookaheadPositions[it] =
+                                                    coordinates!!.positionInRoot()
                                             }
-                                    })
+                                        }
+                                    }
+                                }
+                            )
                         }
                     }
                 }
             }
         }
         rule.runOnIdle {
-            repeat(4) {
-                assertEquals(it * ItemSize, lookaheadPositions[it]?.mainAxisPosition)
-            }
+            repeat(4) { assertEquals(it * ItemSize, lookaheadPositions[it]?.mainAxisPosition) }
             assertEquals(0, postLookaheadPositions[0]?.mainAxisPosition)
             assertEquals(ItemSize, postLookaheadPositions[1]?.mainAxisPosition)
             assertEquals(null, postLookaheadPositions[2]?.mainAxisPosition)
@@ -2966,9 +2406,7 @@
         }
         postLookaheadSize = (2.9f * ItemSize).toInt()
         rule.runOnIdle {
-            repeat(4) {
-                assertEquals(it * ItemSize, lookaheadPositions[it]?.mainAxisPosition)
-            }
+            repeat(4) { assertEquals(it * ItemSize, lookaheadPositions[it]?.mainAxisPosition) }
             assertEquals(0, postLookaheadPositions[0]?.mainAxisPosition)
             assertEquals(ItemSize, postLookaheadPositions[1]?.mainAxisPosition)
             assertEquals(ItemSize * 2, postLookaheadPositions[2]?.mainAxisPosition)
@@ -2976,9 +2414,7 @@
         }
         postLookaheadSize = (3.4f * ItemSize).toInt()
         rule.runOnIdle {
-            repeat(4) {
-                assertEquals(it * ItemSize, lookaheadPositions[it]?.mainAxisPosition)
-            }
+            repeat(4) { assertEquals(it * ItemSize, lookaheadPositions[it]?.mainAxisPosition) }
             assertEquals(0, postLookaheadPositions[0]?.mainAxisPosition)
             assertEquals(ItemSize, postLookaheadPositions[1]?.mainAxisPosition)
             assertEquals(ItemSize * 2, postLookaheadPositions[2]?.mainAxisPosition)
@@ -2989,9 +2425,7 @@
         postLookaheadSize = (2.7f * ItemSize).toInt()
         postLookaheadPositions.clear()
         rule.runOnIdle {
-            repeat(4) {
-                assertEquals(it * ItemSize, lookaheadPositions[it]?.mainAxisPosition)
-            }
+            repeat(4) { assertEquals(it * ItemSize, lookaheadPositions[it]?.mainAxisPosition) }
             assertEquals(0, postLookaheadPositions[0]?.mainAxisPosition)
             assertEquals(ItemSize, postLookaheadPositions[1]?.mainAxisPosition)
             assertEquals(ItemSize * 2, postLookaheadPositions[2]?.mainAxisPosition)
@@ -3002,9 +2436,7 @@
         postLookaheadSize = (1.2f * ItemSize).toInt()
         postLookaheadPositions.clear()
         rule.runOnIdle {
-            repeat(4) {
-                assertEquals(it * ItemSize, lookaheadPositions[it]?.mainAxisPosition)
-            }
+            repeat(4) { assertEquals(it * ItemSize, lookaheadPositions[it]?.mainAxisPosition) }
             assertEquals(0, postLookaheadPositions[0]?.mainAxisPosition)
             assertEquals(ItemSize, postLookaheadPositions[1]?.mainAxisPosition)
             assertEquals(null, postLookaheadPositions[2]?.mainAxisPosition)
@@ -3022,38 +2454,38 @@
         rule.setContent {
             LookaheadScope {
                 CompositionLocalProvider(LocalDensity provides Density(1f)) {
-                    LazyColumnOrRow(Modifier.layout { measurable, _ ->
-                        val constraints = if (isLookingAhead) {
-                            Constraints.fixed(lookaheadSize, lookaheadSize)
-                        } else {
-                            Constraints.fixed(postLookaheadSize, postLookaheadSize)
-                        }
-                        measurable.measure(constraints).run {
-                            layout(width, height) {
-                                place(0, 0)
+                    LazyColumnOrRow(
+                        Modifier.layout { measurable, _ ->
+                            val constraints =
+                                if (isLookingAhead) {
+                                    Constraints.fixed(lookaheadSize, lookaheadSize)
+                                } else {
+                                    Constraints.fixed(postLookaheadSize, postLookaheadSize)
+                                }
+                            measurable.measure(constraints).run {
+                                layout(width, height) { place(0, 0) }
                             }
                         }
-                    }) {
+                    ) {
                         items(4) {
                             Box(
-                                Modifier
-                                    .requiredSize(ItemSize.dp)
-                                    .layout { measurable, constraints ->
-                                        measurable
-                                            .measure(constraints)
-                                            .run {
-                                                layout(width, height) {
-                                                    if (isLookingAhead) {
-                                                        lookaheadPositions[it] = coordinates!!
-                                                            .findRootCoordinates()
-                                                            .localLookaheadPositionOf(coordinates!!)
-                                                    } else {
-                                                        postLookaheadPositions[it] =
-                                                            coordinates!!.positionInRoot()
-                                                    }
-                                                }
+                                Modifier.requiredSize(ItemSize.dp).layout { measurable, constraints
+                                    ->
+                                    measurable.measure(constraints).run {
+                                        layout(width, height) {
+                                            if (isLookingAhead) {
+                                                lookaheadPositions[it] =
+                                                    coordinates!!
+                                                        .findRootCoordinates()
+                                                        .localLookaheadPositionOf(coordinates!!)
+                                            } else {
+                                                postLookaheadPositions[it] =
+                                                    coordinates!!.positionInRoot()
                                             }
-                                    })
+                                        }
+                                    }
+                                }
+                            )
                         }
                     }
                 }
@@ -3061,9 +2493,7 @@
         }
         // postLookaheadSize was initialized to 4 * ItemSize
         rule.runOnIdle {
-            repeat(4) {
-                assertEquals(it * ItemSize, lookaheadPositions[it]?.mainAxisPosition)
-            }
+            repeat(4) { assertEquals(it * ItemSize, lookaheadPositions[it]?.mainAxisPosition) }
             assertEquals(0, postLookaheadPositions[0]?.mainAxisPosition)
             assertEquals(ItemSize, postLookaheadPositions[1]?.mainAxisPosition)
             assertEquals(ItemSize * 2, postLookaheadPositions[2]?.mainAxisPosition)
@@ -3072,9 +2502,7 @@
         postLookaheadSize = (2.9f * ItemSize).toInt()
         postLookaheadPositions.clear()
         rule.runOnIdle {
-            repeat(4) {
-                assertEquals(it * ItemSize, lookaheadPositions[it]?.mainAxisPosition)
-            }
+            repeat(4) { assertEquals(it * ItemSize, lookaheadPositions[it]?.mainAxisPosition) }
             assertEquals(0, postLookaheadPositions[0]?.mainAxisPosition)
             assertEquals(ItemSize, postLookaheadPositions[1]?.mainAxisPosition)
             assertEquals(ItemSize * 2, postLookaheadPositions[2]?.mainAxisPosition)
@@ -3083,9 +2511,7 @@
         postLookaheadSize = 2 * ItemSize
         postLookaheadPositions.clear()
         rule.runOnIdle {
-            repeat(4) {
-                assertEquals(it * ItemSize, lookaheadPositions[it]?.mainAxisPosition)
-            }
+            repeat(4) { assertEquals(it * ItemSize, lookaheadPositions[it]?.mainAxisPosition) }
             assertEquals(0, postLookaheadPositions[0]?.mainAxisPosition)
             assertEquals(ItemSize, postLookaheadPositions[1]?.mainAxisPosition)
             assertEquals(null, postLookaheadPositions[2]?.mainAxisPosition)
@@ -3096,9 +2522,7 @@
         postLookaheadSize = (2.7f * ItemSize).toInt()
         postLookaheadPositions.clear()
         rule.runOnIdle {
-            repeat(4) {
-                assertEquals(it * ItemSize, lookaheadPositions[it]?.mainAxisPosition)
-            }
+            repeat(4) { assertEquals(it * ItemSize, lookaheadPositions[it]?.mainAxisPosition) }
             assertEquals(0, postLookaheadPositions[0]?.mainAxisPosition)
             assertEquals(ItemSize, postLookaheadPositions[1]?.mainAxisPosition)
             assertEquals(ItemSize * 2, postLookaheadPositions[2]?.mainAxisPosition)
@@ -3109,16 +2533,16 @@
         postLookaheadSize = (1.2f * ItemSize).toInt()
         postLookaheadPositions.clear()
         rule.runOnIdle {
-            repeat(4) {
-                assertEquals(it * ItemSize, lookaheadPositions[it]?.mainAxisPosition)
-            }
+            repeat(4) { assertEquals(it * ItemSize, lookaheadPositions[it]?.mainAxisPosition) }
             assertEquals(0, postLookaheadPositions[0]?.mainAxisPosition)
             assertEquals(ItemSize, postLookaheadPositions[1]?.mainAxisPosition)
             assertEquals(null, postLookaheadPositions[2]?.mainAxisPosition)
             assertEquals(null, postLookaheadPositions[3]?.mainAxisPosition)
         }
     }
-    private val Offset.mainAxisPosition get() = (if (vertical) y else x).roundToInt()
+
+    private val Offset.mainAxisPosition
+        get() = (if (vertical) y else x).roundToInt()
 
     @OptIn(ExperimentalComposeUiApi::class)
     @Test
@@ -3131,19 +2555,15 @@
                     LazyColumnOrRow(Modifier.requiredSize(300.dp), state) {
                         items(12, key = { it }) {
                             Box(
-                                Modifier
-                                    .testTag("$it")
+                                Modifier.testTag("$it")
                                     .then(
                                         if (it == 0) {
                                             Modifier.layout { measurable, constraints ->
                                                 val p = measurable.measure(constraints)
                                                 val size = if (isLookingAhead) 300 else 30
-                                                layout(size, size) {
-                                                    p.place(0, 0)
-                                                }
+                                                layout(size, size) { p.place(0, 0) }
                                             }
-                                        } else
-                                            Modifier.size(30.dp)
+                                        } else Modifier.size(30.dp)
                                     )
                             )
                         }
@@ -3156,12 +2576,10 @@
         // Based on lookahead item 0 would be the only item needed, but post-lookahead calculation
         // indicates 10 items will be needed to fill the viewport.
         for (i in 0 until 10) {
-            rule.onNodeWithTag("$i")
-                .assertIsPlaced()
+            rule.onNodeWithTag("$i").assertIsPlaced()
         }
         for (i in 10 until 12) {
-            rule.onNodeWithTag("$i")
-                .assertDoesNotExist()
+            rule.onNodeWithTag("$i").assertDoesNotExist()
         }
     }
 
@@ -3178,22 +2596,17 @@
                     LazyColumnOrRow(Modifier.requiredSize(300.dp), state) {
                         items(12, key = { it }) {
                             Box(
-                                Modifier
-                                    .testTag("$it")
+                                Modifier.testTag("$it")
                                     .then(
                                         if (it == 2) {
                                             Modifier.layout { measurable, constraints ->
                                                 val p = measurable.measure(constraints)
-                                                val size = if (isLookingAhead)
-                                                    lookaheadSize
-                                                else
-                                                    postLookaheadSize
-                                                layout(size, size) {
-                                                    p.place(0, 0)
-                                                }
+                                                val size =
+                                                    if (isLookingAhead) lookaheadSize
+                                                    else postLookaheadSize
+                                                layout(size, size) { p.place(0, 0) }
                                             }
-                                        } else
-                                            Modifier.size(30.dp)
+                                        } else Modifier.size(30.dp)
                                     )
                             )
                         }
@@ -3205,20 +2618,14 @@
 
         for (i in 0 until 12) {
             if (i < 10) {
-                rule.onNodeWithTag("$i")
-                    .assertIsPlaced()
+                rule.onNodeWithTag("$i").assertIsPlaced()
             } else {
-                rule.onNodeWithTag("$i")
-                    .assertDoesNotExist()
+                rule.onNodeWithTag("$i").assertDoesNotExist()
             }
         }
 
         lookaheadSize = 300
-        rule.runOnIdle {
-            runBlocking {
-                state.scrollBy(60f)
-            }
-        }
+        rule.runOnIdle { runBlocking { state.scrollBy(60f) } }
         rule.waitForIdle()
 
         rule.onNodeWithTag("0").assertIsNotPlaced()
@@ -3240,29 +2647,26 @@
     @Test
     fun usingFillParentMaxSizeOnInfinityConstraintsIsIgnored() {
         rule.setContentWithTestViewConfiguration {
-            Layout(content = {
-                LazyColumnOrRow {
-                    items(1) {
-                        Box(
-                            Modifier
-                                .fillParentMaxSize(0.95f)
-                                .testTag("item"))
+            Layout(
+                content = {
+                    LazyColumnOrRow {
+                        items(1) { Box(Modifier.fillParentMaxSize(0.95f).testTag("item")) }
                     }
                 }
-            }) { measurables, _ ->
-                val crossInfinityConstraints = if (vertical) {
-                    Constraints(maxWidth = Constraints.Infinity, maxHeight = 100)
-                } else {
-                    Constraints(maxWidth = 100, maxHeight = Constraints.Infinity)
-                }
+            ) { measurables, _ ->
+                val crossInfinityConstraints =
+                    if (vertical) {
+                        Constraints(maxWidth = Constraints.Infinity, maxHeight = 100)
+                    } else {
+                        Constraints(maxWidth = 100, maxHeight = Constraints.Infinity)
+                    }
                 val placeable = measurables.first().measure(crossInfinityConstraints)
-                layout(placeable.width, placeable.height) {
-                    placeable.place(0, 0)
-                }
+                layout(placeable.width, placeable.height) { placeable.place(0, 0) }
             }
         }
 
-        rule.onNodeWithTag("item")
+        rule
+            .onNodeWithTag("item")
             .assertMainAxisSizeIsEqualTo(with(rule.density) { (100 * 0.95f).roundToInt().toDp() })
             .assertCrossAxisSizeIsEqualTo(0.dp)
     }
@@ -3274,31 +2678,17 @@
         val itemSizePx = 5f
         val itemSize = with(rule.density) { itemSizePx.toDp() }
         rule.setContentWithTestViewConfiguration {
-            LazyColumnOrRow(
-                Modifier
-                    .testTag(LazyListTag)
-                    .mainAxisSize(itemSize),
-                state = state
-            ) {
+            LazyColumnOrRow(Modifier.testTag(LazyListTag).mainAxisSize(itemSize), state = state) {
                 items(3) { index ->
-                    Box(
-                        fillParentMaxMainAxis()
-                            .crossAxisSize(1.dp)
-                            .testTag("$index"))
+                    Box(fillParentMaxMainAxis().crossAxisSize(1.dp).testTag("$index"))
                 }
             }
         }
 
         repeat(3) { index ->
-            rule.onNodeWithTag("$index")
-                .assertIsDisplayed()
-            rule.onNodeWithTag("${index + 1}")
-                .assertDoesNotExist()
-            rule.runOnIdle {
-                runBlocking {
-                    state.scrollBy(itemSizePx)
-                }
-            }
+            rule.onNodeWithTag("$index").assertIsDisplayed()
+            rule.onNodeWithTag("${index + 1}").assertDoesNotExist()
+            rule.runOnIdle { runBlocking { state.scrollBy(itemSizePx) } }
         }
     }
 
@@ -3308,26 +2698,14 @@
         val itemSizePx = 5f
         val itemSize = with(rule.density) { itemSizePx.toDp() }
         rule.setContentWithTestViewConfiguration {
-            LazyColumnOrRow(
-                Modifier
-                    .testTag(LazyListTag)
-                    .mainAxisSize(itemSize),
-                state = state
-            ) {
-                items(5) { index ->
-                    Box(fillParentMaxMainAxis().crossAxisSize(index.dp))
-                }
+            LazyColumnOrRow(Modifier.testTag(LazyListTag).mainAxisSize(itemSize), state = state) {
+                items(5) { index -> Box(fillParentMaxMainAxis().crossAxisSize(index.dp)) }
             }
         }
 
         repeat(5) { index ->
-            rule.onNodeWithTag(LazyListTag)
-                .assertCrossAxisSizeIsEqualTo(index.dp)
-            rule.runOnIdle {
-                runBlocking {
-                    state.scrollBy(itemSizePx)
-                }
-            }
+            rule.onNodeWithTag(LazyListTag).assertCrossAxisSizeIsEqualTo(index.dp)
+            rule.runOnIdle { runBlocking { state.scrollBy(itemSizePx) } }
         }
     }
 
@@ -3337,39 +2715,32 @@
         var userScrollEnabled by mutableStateOf(true)
         rule.setContentWithTestViewConfiguration {
             LazyColumnOrRow(
-                Modifier
-                    .mainAxisSize(itemSize * 3)
+                Modifier.mainAxisSize(itemSize * 3)
                     .layout { measurable, constraints ->
                         val placeable = measurable.measure(constraints)
                         val itemSizePx = itemSize.roundToPx()
                         layout(placeable.width, placeable.height) {
-                            val offset = if (vertical) {
-                                IntOffset(0, itemSizePx)
-                            } else {
-                                IntOffset(itemSizePx, 0)
-                            }
+                            val offset =
+                                if (vertical) {
+                                    IntOffset(0, itemSizePx)
+                                } else {
+                                    IntOffset(itemSizePx, 0)
+                                }
                             placeable.place(offset)
                         }
                     }
                     .testTag(LazyListTag),
                 userScrollEnabled = true,
             ) {
-                items(5) {
-                    Spacer(
-                        Modifier
-                            .size(itemSize)
-                            .testTag("$it"))
-                }
+                items(5) { Spacer(Modifier.size(itemSize).testTag("$it")) }
             }
         }
 
-        rule.onNodeWithTag(LazyListTag)
-            .assertStartPositionInRootIsEqualTo(itemSize)
+        rule.onNodeWithTag(LazyListTag).assertStartPositionInRootIsEqualTo(itemSize)
 
         userScrollEnabled = false
 
-        rule.onNodeWithTag(LazyListTag)
-            .assertStartPositionInRootIsEqualTo(itemSize)
+        rule.onNodeWithTag(LazyListTag).assertStartPositionInRootIsEqualTo(itemSize)
     }
 
     // ********************* END OF TESTS *********************
@@ -3382,11 +2753,12 @@
     }
 }
 
-internal val NeverEqualObject = object {
-    override fun equals(other: Any?): Boolean {
-        return false
+internal val NeverEqualObject =
+    object {
+        override fun equals(other: Any?): Boolean {
+            return false
+        }
     }
-}
 
 private data class NotStable(val count: Int)
 
@@ -3403,9 +2775,7 @@
 internal fun ComposeContentTestRule.setContentWithTestViewConfiguration(
     composable: @Composable () -> Unit
 ) {
-    this.setContent {
-        WithTouchSlop(TestTouchSlop, composable)
-    }
+    this.setContent { WithTouchSlop(TestTouchSlop, composable) }
 }
 
 internal fun SemanticsNodeInteraction.scrollBy(x: Dp = 0.dp, y: Dp = 0.dp, density: Density) =
diff --git a/compose/foundation/foundation/integration-tests/lazy-tests/src/androidTest/kotlin/androidx/compose/foundation/lazy/list/LazyListsContentPaddingTest.kt b/compose/foundation/foundation/integration-tests/lazy-tests/src/androidTest/kotlin/androidx/compose/foundation/lazy/list/LazyListsContentPaddingTest.kt
index c46bf7d..6aa6e1c 100644
--- a/compose/foundation/foundation/integration-tests/lazy-tests/src/androidTest/kotlin/androidx/compose/foundation/lazy/list/LazyListsContentPaddingTest.kt
+++ b/compose/foundation/foundation/integration-tests/lazy-tests/src/androidTest/kotlin/androidx/compose/foundation/lazy/list/LazyListsContentPaddingTest.kt
@@ -76,18 +76,14 @@
         val largePaddingSize = itemSize
         rule.setContent {
             LazyColumnOrRow(
-                modifier = Modifier.requiredSize(containerSize)
-                    .testTag(LazyListTag),
+                modifier = Modifier.requiredSize(containerSize).testTag(LazyListTag),
                 state = rememberLazyListState().also { state = it },
-                contentPadding = PaddingValues(
-                    mainAxis = largePaddingSize,
-                    crossAxis = smallPaddingSize
-                )
+                contentPadding =
+                    PaddingValues(mainAxis = largePaddingSize, crossAxis = smallPaddingSize)
             ) {
                 items(listOf(1)) {
                     Spacer(
-                        Modifier
-                            .then(fillParentMaxCrossAxis())
+                        Modifier.then(fillParentMaxCrossAxis())
                             .mainAxisSize(itemSize)
                             .testTag(ItemTag)
                     )
@@ -95,7 +91,8 @@
             }
         }
 
-        rule.onNodeWithTag(ItemTag)
+        rule
+            .onNodeWithTag(ItemTag)
             .assertCrossAxisStartPositionInRootIsEqualTo(smallPaddingSize)
             .assertStartPositionInRootIsEqualTo(largePaddingSize)
             .assertCrossAxisSizeIsEqualTo(containerSize - smallPaddingSize * 2)
@@ -103,7 +100,8 @@
 
         state.scrollBy(largePaddingSize)
 
-        rule.onNodeWithTag(ItemTag)
+        rule
+            .onNodeWithTag(ItemTag)
             .assertStartPositionInRootIsEqualTo(0.dp)
             .assertMainAxisSizeIsEqualTo(itemSize)
     }
@@ -113,17 +111,16 @@
         lateinit var state: LazyListState
         rule.setContent {
             LazyColumnOrRow(
-                modifier = Modifier.requiredSize(itemSize * 2)
-                    .testTag(LazyListTag),
+                modifier = Modifier.requiredSize(itemSize * 2).testTag(LazyListTag),
                 state = rememberLazyListState().also { state = it },
                 contentPadding = PaddingValues(mainAxis = itemSize)
             ) {
                 items(listOf(1)) {
                     Spacer(
-                        Modifier
-                            .then(fillParentMaxCrossAxis())
+                        Modifier.then(fillParentMaxCrossAxis())
                             .mainAxisSize(itemSize)
-                            .testTag(ItemTag))
+                            .testTag(ItemTag)
+                    )
                 }
             }
         }
@@ -141,8 +138,7 @@
         val padding = itemSize * 1.5f
         rule.setContent {
             LazyColumnOrRow(
-                modifier = Modifier.requiredSize(padding * 2 + itemSize)
-                    .testTag(LazyListTag),
+                modifier = Modifier.requiredSize(padding * 2 + itemSize).testTag(LazyListTag),
                 state = rememberLazyListState().also { state = it },
                 contentPadding = PaddingValues(mainAxis = padding)
             ) {
@@ -152,25 +148,18 @@
             }
         }
 
-        rule.onNodeWithTag("0")
-            .assertStartPositionInRootIsEqualTo(padding)
-        rule.onNodeWithTag("1")
-            .assertStartPositionInRootIsEqualTo(itemSize + padding)
-        rule.onNodeWithTag("2")
-            .assertStartPositionInRootIsEqualTo(itemSize * 2 + padding)
+        rule.onNodeWithTag("0").assertStartPositionInRootIsEqualTo(padding)
+        rule.onNodeWithTag("1").assertStartPositionInRootIsEqualTo(itemSize + padding)
+        rule.onNodeWithTag("2").assertStartPositionInRootIsEqualTo(itemSize * 2 + padding)
 
         state.scrollBy(padding)
 
         state.assertScrollPosition(1, padding - itemSize)
 
-        rule.onNodeWithTag("0")
-            .assertStartPositionInRootIsEqualTo(0.dp)
-        rule.onNodeWithTag("1")
-            .assertStartPositionInRootIsEqualTo(itemSize)
-        rule.onNodeWithTag("2")
-            .assertStartPositionInRootIsEqualTo(itemSize * 2)
-        rule.onNodeWithTag("3")
-            .assertStartPositionInRootIsEqualTo(itemSize * 3)
+        rule.onNodeWithTag("0").assertStartPositionInRootIsEqualTo(0.dp)
+        rule.onNodeWithTag("1").assertStartPositionInRootIsEqualTo(itemSize)
+        rule.onNodeWithTag("2").assertStartPositionInRootIsEqualTo(itemSize * 2)
+        rule.onNodeWithTag("3").assertStartPositionInRootIsEqualTo(itemSize * 3)
     }
 
     @Test
@@ -179,8 +168,7 @@
         val padding = itemSize * 1.5f
         rule.setContent {
             LazyColumnOrRow(
-                modifier = Modifier.requiredSize(itemSize + padding * 2)
-                    .testTag(LazyListTag),
+                modifier = Modifier.requiredSize(itemSize + padding * 2).testTag(LazyListTag),
                 state = rememberLazyListState().also { state = it },
                 contentPadding = PaddingValues(mainAxis = padding)
             ) {
@@ -195,14 +183,10 @@
 
         state.assertScrollPosition(1, itemSize * 0.5f)
 
-        rule.onNodeWithTag("0")
-            .assertStartPositionInRootIsEqualTo(itemSize * 1.5f - padding)
-        rule.onNodeWithTag("1")
-            .assertStartPositionInRootIsEqualTo(itemSize * 2.5f - padding)
-        rule.onNodeWithTag("2")
-            .assertStartPositionInRootIsEqualTo(itemSize * 3.5f - padding)
-        rule.onNodeWithTag("3")
-            .assertStartPositionInRootIsEqualTo(itemSize * 4.5f - padding)
+        rule.onNodeWithTag("0").assertStartPositionInRootIsEqualTo(itemSize * 1.5f - padding)
+        rule.onNodeWithTag("1").assertStartPositionInRootIsEqualTo(itemSize * 2.5f - padding)
+        rule.onNodeWithTag("2").assertStartPositionInRootIsEqualTo(itemSize * 3.5f - padding)
+        rule.onNodeWithTag("3").assertStartPositionInRootIsEqualTo(itemSize * 4.5f - padding)
     }
 
     @Test
@@ -211,8 +195,7 @@
         val padding = itemSize * 1.5f
         rule.setContent {
             LazyColumnOrRow(
-                modifier = Modifier.requiredSize(padding * 2 + itemSize)
-                    .testTag(LazyListTag),
+                modifier = Modifier.requiredSize(padding * 2 + itemSize).testTag(LazyListTag),
                 state = rememberLazyListState().also { state = it },
                 contentPadding = PaddingValues(mainAxis = padding)
             ) {
@@ -226,24 +209,18 @@
 
         state.assertScrollPosition(3, 0.dp)
 
-        rule.onNodeWithTag("1")
-            .assertStartPositionInRootIsEqualTo(itemSize - padding)
-        rule.onNodeWithTag("2")
-            .assertStartPositionInRootIsEqualTo(itemSize * 2 - padding)
-        rule.onNodeWithTag("3")
-            .assertStartPositionInRootIsEqualTo(itemSize * 3 - padding)
+        rule.onNodeWithTag("1").assertStartPositionInRootIsEqualTo(itemSize - padding)
+        rule.onNodeWithTag("2").assertStartPositionInRootIsEqualTo(itemSize * 2 - padding)
+        rule.onNodeWithTag("3").assertStartPositionInRootIsEqualTo(itemSize * 3 - padding)
 
         // there are no space to scroll anymore, so it should change nothing
         state.scrollBy(10.dp)
 
         state.assertScrollPosition(3, 0.dp)
 
-        rule.onNodeWithTag("1")
-            .assertStartPositionInRootIsEqualTo(itemSize - padding)
-        rule.onNodeWithTag("2")
-            .assertStartPositionInRootIsEqualTo(itemSize * 2 - padding)
-        rule.onNodeWithTag("3")
-            .assertStartPositionInRootIsEqualTo(itemSize * 3 - padding)
+        rule.onNodeWithTag("1").assertStartPositionInRootIsEqualTo(itemSize - padding)
+        rule.onNodeWithTag("2").assertStartPositionInRootIsEqualTo(itemSize * 2 - padding)
+        rule.onNodeWithTag("3").assertStartPositionInRootIsEqualTo(itemSize * 3 - padding)
     }
 
     @Test
@@ -252,8 +229,7 @@
         val padding = itemSize * 1.5f
         rule.setContent {
             LazyColumnOrRow(
-                modifier = Modifier.requiredSize(padding * 2 + itemSize)
-                    .testTag(LazyListTag),
+                modifier = Modifier.requiredSize(padding * 2 + itemSize).testTag(LazyListTag),
                 state = rememberLazyListState().also { state = it },
                 contentPadding = PaddingValues(mainAxis = padding)
             ) {
@@ -268,12 +244,9 @@
 
         state.assertScrollPosition(2, itemSize / 2)
 
-        rule.onNodeWithTag("1")
-            .assertStartPositionInRootIsEqualTo(itemSize * 1.5f - padding)
-        rule.onNodeWithTag("2")
-            .assertStartPositionInRootIsEqualTo(itemSize * 2.5f - padding)
-        rule.onNodeWithTag("3")
-            .assertStartPositionInRootIsEqualTo(itemSize * 3.5f - padding)
+        rule.onNodeWithTag("1").assertStartPositionInRootIsEqualTo(itemSize * 1.5f - padding)
+        rule.onNodeWithTag("2").assertStartPositionInRootIsEqualTo(itemSize * 2.5f - padding)
+        rule.onNodeWithTag("3").assertStartPositionInRootIsEqualTo(itemSize * 3.5f - padding)
     }
 
     @Test
@@ -281,27 +254,28 @@
         rule.setContent {
             Box(modifier = Modifier.testTag(ContainerTag)) {
                 LazyColumnOrRow(
-                    contentPadding = PaddingValues(
-                        beforeContentCrossAxis = 2.dp,
-                        beforeContent = 4.dp,
-                        afterContentCrossAxis = 6.dp,
-                        afterContent = 8.dp
-                    )
+                    contentPadding =
+                        PaddingValues(
+                            beforeContentCrossAxis = 2.dp,
+                            beforeContent = 4.dp,
+                            afterContentCrossAxis = 6.dp,
+                            afterContent = 8.dp
+                        )
                 ) {
-                    items(listOf(1)) {
-                        Spacer(Modifier.requiredSize(itemSize).testTag(ItemTag))
-                    }
+                    items(listOf(1)) { Spacer(Modifier.requiredSize(itemSize).testTag(ItemTag)) }
                 }
             }
         }
 
-        rule.onNodeWithTag(ItemTag)
+        rule
+            .onNodeWithTag(ItemTag)
             .assertCrossAxisStartPositionInRootIsEqualTo(2.dp)
             .assertStartPositionInRootIsEqualTo(4.dp)
             .assertCrossAxisSizeIsEqualTo(itemSize)
             .assertMainAxisSizeIsEqualTo(itemSize)
 
-        rule.onNodeWithTag(ContainerTag)
+        rule
+            .onNodeWithTag(ContainerTag)
             .assertCrossAxisStartPositionInRootIsEqualTo(0.dp)
             .assertStartPositionInRootIsEqualTo(0.dp)
             .assertCrossAxisSizeIsEqualTo(itemSize + 2.dp + 6.dp)
@@ -313,17 +287,19 @@
         rule.setContent {
             Box(modifier = Modifier.testTag(ContainerTag)) {
                 LazyColumnOrRow(
-                    contentPadding = PaddingValues(
-                        beforeContentCrossAxis = 2.dp,
-                        beforeContent = 4.dp,
-                        afterContentCrossAxis = 6.dp,
-                        afterContent = 8.dp
-                    )
-                ) { }
+                    contentPadding =
+                        PaddingValues(
+                            beforeContentCrossAxis = 2.dp,
+                            beforeContent = 4.dp,
+                            afterContentCrossAxis = 6.dp,
+                            afterContent = 8.dp
+                        )
+                ) {}
             }
         }
 
-        rule.onNodeWithTag(ContainerTag)
+        rule
+            .onNodeWithTag(ContainerTag)
             .assertCrossAxisStartPositionInRootIsEqualTo(0.dp)
             .assertStartPositionInRootIsEqualTo(0.dp)
             .assertCrossAxisSizeIsEqualTo(8.dp)
@@ -335,19 +311,21 @@
         rule.setContent {
             Box(modifier = Modifier.testTag(ContainerTag)) {
                 LazyColumnOrRow(
-                    contentPadding = PaddingValues(
-                        beforeContentCrossAxis = 2.dp,
-                        beforeContent = 4.dp,
-                        afterContentCrossAxis = 6.dp,
-                        afterContent = 8.dp
-                    )
+                    contentPadding =
+                        PaddingValues(
+                            beforeContentCrossAxis = 2.dp,
+                            beforeContent = 4.dp,
+                            afterContentCrossAxis = 6.dp,
+                            afterContent = 8.dp
+                        )
                 ) {
-                    items(0) { }
+                    items(0) {}
                 }
             }
         }
 
-        rule.onNodeWithTag(ContainerTag)
+        rule
+            .onNodeWithTag(ContainerTag)
             .assertCrossAxisStartPositionInRootIsEqualTo(0.dp)
             .assertStartPositionInRootIsEqualTo(0.dp)
             .assertCrossAxisSizeIsEqualTo(8.dp)
@@ -365,24 +343,21 @@
                 reverseLayout = true,
                 state = rememberLazyListState().also { state = it },
                 modifier = Modifier.requiredSize(listSize),
-                contentPadding = PaddingValues(
-                    beforeContent = topPadding,
-                    afterContent = bottomPadding
-                ),
+                contentPadding =
+                    PaddingValues(beforeContent = topPadding, afterContent = bottomPadding),
             ) {
-                items(3) { index ->
-                    Box(Modifier.requiredSize(itemSize).testTag("$index"))
-                }
+                items(3) { index -> Box(Modifier.requiredSize(itemSize).testTag("$index")) }
             }
         }
 
-        rule.onNodeWithTag("0")
+        rule
+            .onNodeWithTag("0")
             .assertStartPositionInRootIsEqualTo(listSize - bottomPadding - itemSize)
-        rule.onNodeWithTag("1")
+        rule
+            .onNodeWithTag("1")
             .assertStartPositionInRootIsEqualTo(listSize - bottomPadding - itemSize * 2)
         // Partially visible.
-        rule.onNodeWithTag("2")
-            .assertStartPositionInRootIsEqualTo(-itemSize / 2)
+        rule.onNodeWithTag("2").assertStartPositionInRootIsEqualTo(-itemSize / 2)
 
         // Scroll to the top.
         state.scrollBy(itemSize * 2.5f)
@@ -404,19 +379,14 @@
                 reverseLayout = true,
                 state = rememberLazyListState().also { state = it },
                 modifier = Modifier.requiredSize(listSize),
-                contentPadding = PaddingValues(
-                    beforeContent = topPadding,
-                    afterContent = bottomPadding
-                ),
+                contentPadding =
+                    PaddingValues(beforeContent = topPadding, afterContent = bottomPadding),
             ) {
-                items(3) { index ->
-                    Box(Modifier.requiredSize(itemSize).testTag("$index"))
-                }
+                items(3) { index -> Box(Modifier.requiredSize(itemSize).testTag("$index")) }
             }
         }
 
-        rule.onNodeWithTag("0")
-            .assertStartPositionInRootIsEqualTo(0.dp)
+        rule.onNodeWithTag("0").assertStartPositionInRootIsEqualTo(0.dp)
         // Shouldn't be visible
         rule.onNodeWithTag("1").assertDoesNotExist()
 
@@ -439,18 +409,18 @@
                     state = state,
                     contentPadding = PaddingValues(mainAxis = smallPaddingSize)
                 ) {
-                    items(2) {
-                        Box(Modifier.testTag("$it").fillParentMaxSize())
-                    }
+                    items(2) { Box(Modifier.testTag("$it").fillParentMaxSize()) }
                 }
             }
         }
 
-        rule.onNodeWithTag("0")
+        rule
+            .onNodeWithTag("0")
             .assertStartPositionInRootIsEqualTo(smallPaddingSize)
             .assertMainAxisSizeIsEqualTo(itemSize)
 
-        rule.onNodeWithTag("1")
+        rule
+            .onNodeWithTag("1")
             .assertStartPositionInRootIsEqualTo(smallPaddingSize + itemSize)
             .assertMainAxisSizeIsEqualTo(itemSize)
 
@@ -463,11 +433,13 @@
             }
         }
 
-        rule.onNodeWithTag("1")
+        rule
+            .onNodeWithTag("1")
             .assertStartPositionInRootIsEqualTo(smallPaddingSize)
             .assertMainAxisSizeIsEqualTo(itemSize)
 
-        rule.onNodeWithTag("0")
+        rule
+            .onNodeWithTag("0")
             .assertStartPositionInRootIsEqualTo(smallPaddingSize - itemSize)
             .assertMainAxisSizeIsEqualTo(itemSize)
     }
@@ -482,18 +454,14 @@
                     state = state,
                     contentPadding = PaddingValues(mainAxis = itemSize)
                 ) {
-                    items(4) {
-                        Box(Modifier.testTag("$it").size(itemSize))
-                    }
+                    items(4) { Box(Modifier.testTag("$it").size(itemSize)) }
                 }
             }
         }
 
-        rule.onNodeWithTag("0")
-            .assertStartPositionInRootIsEqualTo(itemSize)
+        rule.onNodeWithTag("0").assertStartPositionInRootIsEqualTo(itemSize)
 
-        rule.onNodeWithTag("1")
-            .assertDoesNotExist()
+        rule.onNodeWithTag("1").assertDoesNotExist()
 
         rule.runOnIdle {
             state.assertScrollPosition(0, 0.dp)
@@ -512,23 +480,18 @@
                     state = state,
                     contentPadding = PaddingValues(mainAxis = itemSize)
                 ) {
-                    items(4) {
-                        Box(Modifier.testTag("$it").size(itemSize))
-                    }
+                    items(4) { Box(Modifier.testTag("$it").size(itemSize)) }
                 }
             }
         }
 
         state.scrollBy(itemSize)
 
-        rule.onNodeWithTag("0")
-            .assertStartPositionInRootIsEqualTo(0.dp)
+        rule.onNodeWithTag("0").assertStartPositionInRootIsEqualTo(0.dp)
 
-        rule.onNodeWithTag("1")
-            .assertStartPositionInRootIsEqualTo(itemSize)
+        rule.onNodeWithTag("1").assertStartPositionInRootIsEqualTo(itemSize)
 
-        rule.onNodeWithTag("2")
-            .assertIsNotDisplayed()
+        rule.onNodeWithTag("2").assertIsNotDisplayed()
 
         rule.runOnIdle {
             state.assertScrollPosition(1, 0.dp)
@@ -546,23 +509,18 @@
                     state = state,
                     contentPadding = PaddingValues(mainAxis = itemSize)
                 ) {
-                    items(4) {
-                        Box(Modifier.testTag("$it").size(itemSize))
-                    }
+                    items(4) { Box(Modifier.testTag("$it").size(itemSize)) }
                 }
             }
         }
 
         state.scrollTo(3)
 
-        rule.onNodeWithTag("1")
-            .assertDoesNotExist()
+        rule.onNodeWithTag("1").assertDoesNotExist()
 
-        rule.onNodeWithTag("2")
-            .assertStartPositionInRootIsEqualTo(0.dp)
+        rule.onNodeWithTag("2").assertStartPositionInRootIsEqualTo(0.dp)
 
-        rule.onNodeWithTag("3")
-            .assertStartPositionInRootIsEqualTo(itemSize)
+        rule.onNodeWithTag("3").assertStartPositionInRootIsEqualTo(itemSize)
 
         rule.runOnIdle {
             state.assertScrollPosition(3, 0.dp)
@@ -580,23 +538,18 @@
                     state = state,
                     contentPadding = PaddingValues(mainAxis = itemSize)
                 ) {
-                    items(4) {
-                        Box(Modifier.testTag("$it").size(itemSize))
-                    }
+                    items(4) { Box(Modifier.testTag("$it").size(itemSize)) }
                 }
             }
         }
 
         state.scrollBy(itemSize * 3)
 
-        rule.onNodeWithTag("1")
-            .assertIsNotDisplayed()
+        rule.onNodeWithTag("1").assertIsNotDisplayed()
 
-        rule.onNodeWithTag("2")
-            .assertStartPositionInRootIsEqualTo(0.dp)
+        rule.onNodeWithTag("2").assertStartPositionInRootIsEqualTo(0.dp)
 
-        rule.onNodeWithTag("3")
-            .assertStartPositionInRootIsEqualTo(itemSize)
+        rule.onNodeWithTag("3").assertStartPositionInRootIsEqualTo(itemSize)
 
         rule.runOnIdle {
             state.assertScrollPosition(3, 0.dp)
@@ -615,20 +568,16 @@
                     state = state,
                     contentPadding = PaddingValues(mainAxis = itemSize)
                 ) {
-                    items(4) {
-                        Box(Modifier.testTag("$it").size(itemSize))
-                    }
+                    items(4) { Box(Modifier.testTag("$it").size(itemSize)) }
                 }
             }
         }
 
         state.scrollBy(itemSize * 4.5f)
 
-        rule.onNodeWithTag("2")
-            .assertIsNotDisplayed()
+        rule.onNodeWithTag("2").assertIsNotDisplayed()
 
-        rule.onNodeWithTag("3")
-            .assertStartPositionInRootIsEqualTo(-itemSize * 0.5f)
+        rule.onNodeWithTag("3").assertStartPositionInRootIsEqualTo(-itemSize * 0.5f)
 
         rule.runOnIdle {
             state.assertScrollPosition(3, itemSize * 1.5f)
@@ -646,15 +595,12 @@
                     state = state,
                     contentPadding = PaddingValues(mainAxis = itemSize * 2)
                 ) {
-                    items(4) {
-                        Box(Modifier.testTag("$it").size(itemSize))
-                    }
+                    items(4) { Box(Modifier.testTag("$it").size(itemSize)) }
                 }
             }
         }
 
-        rule.onNodeWithTag("0")
-            .assertIsNotDisplayed()
+        rule.onNodeWithTag("0").assertIsNotDisplayed()
 
         rule.runOnIdle {
             state.assertScrollPosition(0, 0.dp)
@@ -673,23 +619,18 @@
                     state = state,
                     contentPadding = PaddingValues(mainAxis = itemSize * 2)
                 ) {
-                    items(4) {
-                        Box(Modifier.testTag("$it").size(itemSize))
-                    }
+                    items(4) { Box(Modifier.testTag("$it").size(itemSize)) }
                 }
             }
         }
 
         state.scrollBy(itemSize * 2)
 
-        rule.onNodeWithTag("0")
-            .assertStartPositionInRootIsEqualTo(0.dp)
+        rule.onNodeWithTag("0").assertStartPositionInRootIsEqualTo(0.dp)
 
-        rule.onNodeWithTag("1")
-            .assertStartPositionInRootIsEqualTo(itemSize)
+        rule.onNodeWithTag("1").assertStartPositionInRootIsEqualTo(itemSize)
 
-        rule.onNodeWithTag("2")
-            .assertIsNotDisplayed()
+        rule.onNodeWithTag("2").assertIsNotDisplayed()
 
         rule.runOnIdle {
             state.assertScrollPosition(2, 0.dp)
@@ -707,26 +648,20 @@
                     state = state,
                     contentPadding = PaddingValues(mainAxis = itemSize * 2)
                 ) {
-                    items(4) {
-                        Box(Modifier.testTag("$it").size(itemSize))
-                    }
+                    items(4) { Box(Modifier.testTag("$it").size(itemSize)) }
                 }
             }
         }
 
         state.scrollTo(3)
 
-        rule.onNodeWithTag("0")
-            .assertIsNotDisplayed()
+        rule.onNodeWithTag("0").assertIsNotDisplayed()
 
-        rule.onNodeWithTag("1")
-            .assertStartPositionInRootIsEqualTo(0.dp)
+        rule.onNodeWithTag("1").assertStartPositionInRootIsEqualTo(0.dp)
 
-        rule.onNodeWithTag("2")
-            .assertStartPositionInRootIsEqualTo(itemSize)
+        rule.onNodeWithTag("2").assertStartPositionInRootIsEqualTo(itemSize)
 
-        rule.onNodeWithTag("3")
-            .assertIsNotDisplayed()
+        rule.onNodeWithTag("3").assertIsNotDisplayed()
 
         rule.runOnIdle {
             state.assertScrollPosition(3, 0.dp)
@@ -744,26 +679,20 @@
                     state = state,
                     contentPadding = PaddingValues(mainAxis = itemSize * 2)
                 ) {
-                    items(4) {
-                        Box(Modifier.testTag("$it").size(itemSize))
-                    }
+                    items(4) { Box(Modifier.testTag("$it").size(itemSize)) }
                 }
             }
         }
 
         state.scrollBy(itemSize * 3)
 
-        rule.onNodeWithTag("0")
-            .assertIsNotDisplayed()
+        rule.onNodeWithTag("0").assertIsNotDisplayed()
 
-        rule.onNodeWithTag("1")
-            .assertStartPositionInRootIsEqualTo(0.dp)
+        rule.onNodeWithTag("1").assertStartPositionInRootIsEqualTo(0.dp)
 
-        rule.onNodeWithTag("2")
-            .assertStartPositionInRootIsEqualTo(itemSize)
+        rule.onNodeWithTag("2").assertStartPositionInRootIsEqualTo(itemSize)
 
-        rule.onNodeWithTag("3")
-            .assertIsNotDisplayed()
+        rule.onNodeWithTag("3").assertIsNotDisplayed()
 
         rule.runOnIdle {
             state.assertScrollPosition(3, 0.dp)
@@ -782,9 +711,7 @@
                     state = state,
                     contentPadding = PaddingValues(mainAxis = itemSize * 2)
                 ) {
-                    items(4) {
-                        Box(Modifier.testTag("$it").size(itemSize))
-                    }
+                    items(4) { Box(Modifier.testTag("$it").size(itemSize)) }
                 }
             }
         }
@@ -795,8 +722,7 @@
                 itemSize * 3 // all items
         )
 
-        rule.onNodeWithTag("3")
-            .assertIsNotDisplayed()
+        rule.onNodeWithTag("3").assertIsNotDisplayed()
 
         rule.runOnIdle {
             state.assertScrollPosition(3, itemSize * 3.5f)
@@ -812,19 +738,12 @@
             state = rememberLazyListState()
             CompositionLocalProvider(LocalLayoutDirection provides LayoutDirection.Rtl) {
                 LazyColumnOrRow(
-                    modifier = Modifier
-                        .testTag("list")
-                        .mainAxisSize(itemSize * 2),
+                    modifier = Modifier.testTag("list").mainAxisSize(itemSize * 2),
                     state = state,
                     contentPadding = padding
                 ) {
                     items(4) {
-                        Box(
-                            Modifier
-                                .testTag("$it")
-                                .background(Color.Red)
-                                .size(itemSize)
-                        ) {
+                        Box(Modifier.testTag("$it").background(Color.Red).size(itemSize)) {
                             BasicText("$it")
                         }
                     }
@@ -833,16 +752,17 @@
         }
 
         if (vertical) {
-            rule.onNodeWithTag("0")
+            rule
+                .onNodeWithTag("0")
                 .assertStartPositionInRootIsEqualTo(0.dp)
                 .assertCrossAxisStartPositionInRootIsEqualTo(
                     padding.calculateLeftPadding(LayoutDirection.Rtl)
                 )
 
-            rule.onNodeWithTag("list")
-                .assertWidthIsEqualTo(28.dp + itemSize)
+            rule.onNodeWithTag("list").assertWidthIsEqualTo(28.dp + itemSize)
         } else {
-            rule.onNodeWithTag("0")
+            rule
+                .onNodeWithTag("0")
                 .assertCrossAxisStartPositionInRootIsEqualTo(0.dp)
                 .assertStartPositionInRootIsEqualTo(
                     // list width - itemSize - padding
@@ -853,13 +773,15 @@
         state.scrollBy(itemSize * 4)
 
         if (vertical) {
-            rule.onNodeWithTag("3")
+            rule
+                .onNodeWithTag("3")
                 .assertStartPositionInRootIsEqualTo(itemSize)
                 .assertCrossAxisStartPositionInRootIsEqualTo(
                     padding.calculateLeftPadding(LayoutDirection.Rtl)
                 )
         } else {
-            rule.onNodeWithTag("3")
+            rule
+                .onNodeWithTag("3")
                 .assertCrossAxisStartPositionInRootIsEqualTo(0.dp)
                 .assertStartPositionInRootIsEqualTo(
                     padding.calculateLeftPadding(LayoutDirection.Rtl)
@@ -867,15 +789,17 @@
         }
     }
 
-    private fun LazyListState.assertScrollPosition(index: Int, offset: Dp) = with(rule.density) {
-        assertThat(firstVisibleItemIndex).isEqualTo(index)
-        assertThat(firstVisibleItemScrollOffset.toDp().value).isWithin(0.5f).of(offset.value)
-    }
+    private fun LazyListState.assertScrollPosition(index: Int, offset: Dp) =
+        with(rule.density) {
+            assertThat(firstVisibleItemIndex).isEqualTo(index)
+            assertThat(firstVisibleItemScrollOffset.toDp().value).isWithin(0.5f).of(offset.value)
+        }
 
-    private fun LazyListState.assertLayoutInfoOffsetRange(from: Dp, to: Dp) = with(rule.density) {
-        assertThat(layoutInfo.viewportStartOffset to layoutInfo.viewportEndOffset)
-            .isEqualTo(from.roundToPx() to to.roundToPx())
-    }
+    private fun LazyListState.assertLayoutInfoOffsetRange(from: Dp, to: Dp) =
+        with(rule.density) {
+            assertThat(layoutInfo.viewportStartOffset to layoutInfo.viewportEndOffset)
+                .isEqualTo(from.roundToPx() to to.roundToPx())
+        }
 
     private fun LazyListState.assertVisibleItems(vararg expected: Pair<Int, Dp>) =
         with(rule.density) {
diff --git a/compose/foundation/foundation/integration-tests/lazy-tests/src/androidTest/kotlin/androidx/compose/foundation/lazy/list/LazyListsIndexedTest.kt b/compose/foundation/foundation/integration-tests/lazy-tests/src/androidTest/kotlin/androidx/compose/foundation/lazy/list/LazyListsIndexedTest.kt
index d239d15..73eaa3eb 100644
--- a/compose/foundation/foundation/integration-tests/lazy-tests/src/androidTest/kotlin/androidx/compose/foundation/lazy/list/LazyListsIndexedTest.kt
+++ b/compose/foundation/foundation/integration-tests/lazy-tests/src/androidTest/kotlin/androidx/compose/foundation/lazy/list/LazyListsIndexedTest.kt
@@ -51,8 +51,7 @@
 
 class LazyListsIndexedTest {
 
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
     @Test
     fun lazyColumnShowsIndexedItems_zeroBeyondBoundsItemCount() {
@@ -60,25 +59,18 @@
         rule.setContent {
             LazyColumn(Modifier.height(200.dp), beyondBoundsItemCount = 0) {
                 itemsIndexed(items) { index, item ->
-                    Spacer(
-                        Modifier.height(101.dp).fillParentMaxWidth()
-                            .testTag("$index-$item")
-                    )
+                    Spacer(Modifier.height(101.dp).fillParentMaxWidth().testTag("$index-$item"))
                 }
             }
         }
 
-        rule.onNodeWithTag("0-1")
-            .assertIsDisplayed()
+        rule.onNodeWithTag("0-1").assertIsDisplayed()
 
-        rule.onNodeWithTag("1-2")
-            .assertIsDisplayed()
+        rule.onNodeWithTag("1-2").assertIsDisplayed()
 
-        rule.onNodeWithTag("2-3")
-            .assertDoesNotExist()
+        rule.onNodeWithTag("2-3").assertDoesNotExist()
 
-        rule.onNodeWithTag("3-4")
-            .assertDoesNotExist()
+        rule.onNodeWithTag("3-4").assertDoesNotExist()
     }
 
     @Test
@@ -87,25 +79,18 @@
         rule.setContent {
             LazyColumn(Modifier.height(200.dp), beyondBoundsItemCount = 1) {
                 itemsIndexed(items) { index, item ->
-                    Spacer(
-                        Modifier.height(101.dp).fillParentMaxWidth()
-                            .testTag("$index-$item")
-                    )
+                    Spacer(Modifier.height(101.dp).fillParentMaxWidth().testTag("$index-$item"))
                 }
             }
         }
 
-        rule.onNodeWithTag("0-1")
-            .assertIsDisplayed()
+        rule.onNodeWithTag("0-1").assertIsDisplayed()
 
-        rule.onNodeWithTag("1-2")
-            .assertIsDisplayed()
+        rule.onNodeWithTag("1-2").assertIsDisplayed()
 
-        rule.onNodeWithTag("2-3")
-            .assertExists()
+        rule.onNodeWithTag("2-3").assertExists()
 
-        rule.onNodeWithTag("3-4")
-            .assertDoesNotExist()
+        rule.onNodeWithTag("3-4").assertDoesNotExist()
     }
 
     @Test
@@ -115,17 +100,16 @@
             LazyColumn(Modifier.height(200.dp)) {
                 itemsIndexed(items) { index, item ->
                     BasicText(
-                        "${index}x$item", Modifier.fillParentMaxWidth().requiredHeight(100.dp)
+                        "${index}x$item",
+                        Modifier.fillParentMaxWidth().requiredHeight(100.dp)
                     )
                 }
             }
         }
 
-        rule.onNodeWithText("0x0")
-            .assertTopPositionInRootIsEqualTo(0.dp)
+        rule.onNodeWithText("0x0").assertTopPositionInRootIsEqualTo(0.dp)
 
-        rule.onNodeWithText("1x1")
-            .assertTopPositionInRootIsEqualTo(100.dp)
+        rule.onNodeWithText("1x1").assertTopPositionInRootIsEqualTo(100.dp)
     }
 
     @Test
@@ -134,25 +118,18 @@
         rule.setContent {
             LazyRow(Modifier.width(200.dp), beyondBoundsItemCount = 0) {
                 itemsIndexed(items) { index, item ->
-                    Spacer(
-                        Modifier.width(101.dp).fillParentMaxHeight()
-                            .testTag("$index-$item")
-                    )
+                    Spacer(Modifier.width(101.dp).fillParentMaxHeight().testTag("$index-$item"))
                 }
             }
         }
 
-        rule.onNodeWithTag("0-1")
-            .assertIsDisplayed()
+        rule.onNodeWithTag("0-1").assertIsDisplayed()
 
-        rule.onNodeWithTag("1-2")
-            .assertIsDisplayed()
+        rule.onNodeWithTag("1-2").assertIsDisplayed()
 
-        rule.onNodeWithTag("2-3")
-            .assertDoesNotExist()
+        rule.onNodeWithTag("2-3").assertDoesNotExist()
 
-        rule.onNodeWithTag("3-4")
-            .assertDoesNotExist()
+        rule.onNodeWithTag("3-4").assertDoesNotExist()
     }
 
     @Test
@@ -161,25 +138,18 @@
         rule.setContent {
             LazyRow(Modifier.width(200.dp), beyondBoundsItemCount = 1) {
                 itemsIndexed(items) { index, item ->
-                    Spacer(
-                        Modifier.width(101.dp).fillParentMaxHeight()
-                            .testTag("$index-$item")
-                    )
+                    Spacer(Modifier.width(101.dp).fillParentMaxHeight().testTag("$index-$item"))
                 }
             }
         }
 
-        rule.onNodeWithTag("0-1")
-            .assertIsDisplayed()
+        rule.onNodeWithTag("0-1").assertIsDisplayed()
 
-        rule.onNodeWithTag("1-2")
-            .assertIsDisplayed()
+        rule.onNodeWithTag("1-2").assertIsDisplayed()
 
-        rule.onNodeWithTag("2-3")
-            .assertExists()
+        rule.onNodeWithTag("2-3").assertExists()
 
-        rule.onNodeWithTag("3-4")
-            .assertDoesNotExist()
+        rule.onNodeWithTag("3-4").assertDoesNotExist()
     }
 
     @Test
@@ -190,17 +160,16 @@
             LazyRow(Modifier.width(200.dp)) {
                 itemsIndexed(items) { index, item ->
                     BasicText(
-                        "${index}x$item", Modifier.fillParentMaxHeight().requiredWidth(100.dp)
+                        "${index}x$item",
+                        Modifier.fillParentMaxHeight().requiredWidth(100.dp)
                     )
                 }
             }
         }
 
-        rule.onNodeWithText("0x0")
-            .assertLeftPositionInRootIsEqualTo(0.dp)
+        rule.onNodeWithText("0x0").assertLeftPositionInRootIsEqualTo(0.dp)
 
-        rule.onNodeWithText("1x1")
-            .assertLeftPositionInRootIsEqualTo(100.dp)
+        rule.onNodeWithText("1x1").assertLeftPositionInRootIsEqualTo(100.dp)
     }
 }
 
diff --git a/compose/foundation/foundation/integration-tests/lazy-tests/src/androidTest/kotlin/androidx/compose/foundation/lazy/list/LazyListsReverseLayoutTest.kt b/compose/foundation/foundation/integration-tests/lazy-tests/src/androidTest/kotlin/androidx/compose/foundation/lazy/list/LazyListsReverseLayoutTest.kt
index 3a47a97..e27a1d3 100644
--- a/compose/foundation/foundation/integration-tests/lazy-tests/src/androidTest/kotlin/androidx/compose/foundation/lazy/list/LazyListsReverseLayoutTest.kt
+++ b/compose/foundation/foundation/integration-tests/lazy-tests/src/androidTest/kotlin/androidx/compose/foundation/lazy/list/LazyListsReverseLayoutTest.kt
@@ -46,24 +46,19 @@
 
     private val ContainerTag = "ContainerTag"
 
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
     private var itemSize: Dp = Dp.Infinity
 
     @Before
     fun before() {
-        with(rule.density) {
-            itemSize = 50.toDp()
-        }
+        with(rule.density) { itemSize = 50.toDp() }
     }
 
     @Test
     fun column_emitTwoElementsAsOneItem_positionedReversed() {
         rule.setContentWithTestViewConfiguration {
-            LazyColumn(
-                reverseLayout = true
-            ) {
+            LazyColumn(reverseLayout = true) {
                 item {
                     Box(Modifier.requiredSize(itemSize).testTag("0"))
                     Box(Modifier.requiredSize(itemSize).testTag("1"))
@@ -71,31 +66,21 @@
             }
         }
 
-        rule.onNodeWithTag("1")
-            .assertTopPositionInRootIsEqualTo(0.dp)
-        rule.onNodeWithTag("0")
-            .assertTopPositionInRootIsEqualTo(itemSize)
+        rule.onNodeWithTag("1").assertTopPositionInRootIsEqualTo(0.dp)
+        rule.onNodeWithTag("0").assertTopPositionInRootIsEqualTo(itemSize)
     }
 
     @Test
     fun column_emitTwoItems_positionedReversed() {
         rule.setContentWithTestViewConfiguration {
-            LazyColumn(
-                reverseLayout = true
-            ) {
-                item {
-                    Box(Modifier.requiredSize(itemSize).testTag("0"))
-                }
-                item {
-                    Box(Modifier.requiredSize(itemSize).testTag("1"))
-                }
+            LazyColumn(reverseLayout = true) {
+                item { Box(Modifier.requiredSize(itemSize).testTag("0")) }
+                item { Box(Modifier.requiredSize(itemSize).testTag("1")) }
             }
         }
 
-        rule.onNodeWithTag("1")
-            .assertTopPositionInRootIsEqualTo(0.dp)
-        rule.onNodeWithTag("0")
-            .assertTopPositionInRootIsEqualTo(itemSize)
+        rule.onNodeWithTag("1").assertTopPositionInRootIsEqualTo(0.dp)
+        rule.onNodeWithTag("0").assertTopPositionInRootIsEqualTo(itemSize)
     }
 
     @Test
@@ -107,9 +92,7 @@
                 state = rememberLazyListState().also { state = it },
                 modifier = Modifier.requiredSize(itemSize * 2).testTag(ContainerTag)
             ) {
-                items((0..2).toList()) {
-                    Box(Modifier.requiredSize(itemSize).testTag("$it"))
-                }
+                items((0..2).toList()) { Box(Modifier.requiredSize(itemSize).testTag("$it")) }
             }
         }
 
@@ -128,25 +111,20 @@
                 state = rememberLazyListState().also { state = it },
                 modifier = Modifier.requiredSize(itemSize * 2).testTag(ContainerTag)
             ) {
-                items((0..2).toList()) {
-                    Box(Modifier.requiredSize(itemSize).testTag("$it"))
-                }
+                items((0..2).toList()) { Box(Modifier.requiredSize(itemSize).testTag("$it")) }
             }
         }
 
         // we scroll down and as the scrolling is reversed it shouldn't affect anything
-        rule.onNodeWithTag(ContainerTag)
-            .scrollBy(y = itemSize, density = rule.density)
+        rule.onNodeWithTag(ContainerTag).scrollBy(y = itemSize, density = rule.density)
 
         rule.runOnIdle {
             assertThat(state.firstVisibleItemScrollOffset).isEqualTo(0)
             assertThat(state.firstVisibleItemIndex).isEqualTo(0)
         }
 
-        rule.onNodeWithTag("1")
-            .assertTopPositionInRootIsEqualTo(0.dp)
-        rule.onNodeWithTag("0")
-            .assertTopPositionInRootIsEqualTo(itemSize)
+        rule.onNodeWithTag("1").assertTopPositionInRootIsEqualTo(0.dp)
+        rule.onNodeWithTag("0").assertTopPositionInRootIsEqualTo(itemSize)
     }
 
     @Test
@@ -158,27 +136,22 @@
                 state = rememberLazyListState().also { state = it },
                 modifier = Modifier.requiredSize(itemSize * 2).testTag(ContainerTag)
             ) {
-                items((0..2).toList()) {
-                    Box(Modifier.requiredSize(itemSize).testTag("$it"))
-                }
+                items((0..2).toList()) { Box(Modifier.requiredSize(itemSize).testTag("$it")) }
             }
         }
 
-        rule.onNodeWithTag(ContainerTag)
-            .scrollBy(y = -itemSize * 0.5f, density = rule.density)
+        rule.onNodeWithTag(ContainerTag).scrollBy(y = -itemSize * 0.5f, density = rule.density)
 
-        val scrolled = rule.runOnIdle {
-            assertThat(state.firstVisibleItemScrollOffset).isGreaterThan(0)
-            assertThat(state.firstVisibleItemIndex).isEqualTo(0)
-            with(rule.density) { state.firstVisibleItemScrollOffset.toDp() }
-        }
+        val scrolled =
+            rule.runOnIdle {
+                assertThat(state.firstVisibleItemScrollOffset).isGreaterThan(0)
+                assertThat(state.firstVisibleItemIndex).isEqualTo(0)
+                with(rule.density) { state.firstVisibleItemScrollOffset.toDp() }
+            }
 
-        rule.onNodeWithTag("2")
-            .assertTopPositionInRootIsEqualTo(-itemSize + scrolled)
-        rule.onNodeWithTag("1")
-            .assertTopPositionInRootIsEqualTo(scrolled)
-        rule.onNodeWithTag("0")
-            .assertTopPositionInRootIsEqualTo(itemSize + scrolled)
+        rule.onNodeWithTag("2").assertTopPositionInRootIsEqualTo(-itemSize + scrolled)
+        rule.onNodeWithTag("1").assertTopPositionInRootIsEqualTo(scrolled)
+        rule.onNodeWithTag("0").assertTopPositionInRootIsEqualTo(itemSize + scrolled)
     }
 
     @Test
@@ -190,36 +163,30 @@
                 state = rememberLazyListState().also { state = it },
                 modifier = Modifier.requiredSize(itemSize * 2).testTag(ContainerTag)
             ) {
-                items((0..3).toList()) {
-                    Box(Modifier.requiredSize(itemSize).testTag("$it"))
-                }
+                items((0..3).toList()) { Box(Modifier.requiredSize(itemSize).testTag("$it")) }
             }
         }
 
         // we scroll a bit more than it is possible just to make sure we would stop correctly
-        rule.onNodeWithTag(ContainerTag)
-            .scrollBy(y = -itemSize * 2.2f, density = rule.density)
+        rule.onNodeWithTag(ContainerTag).scrollBy(y = -itemSize * 2.2f, density = rule.density)
 
         rule.runOnIdle {
             with(rule.density) {
-                val realOffset = state.firstVisibleItemScrollOffset.toDp() +
-                    itemSize * state.firstVisibleItemIndex
+                val realOffset =
+                    state.firstVisibleItemScrollOffset.toDp() +
+                        itemSize * state.firstVisibleItemIndex
                 assertThat(realOffset).isEqualTo(itemSize * 2)
             }
         }
 
-        rule.onNodeWithTag("3")
-            .assertTopPositionInRootIsEqualTo(0.dp)
-        rule.onNodeWithTag("2")
-            .assertTopPositionInRootIsEqualTo(itemSize)
+        rule.onNodeWithTag("3").assertTopPositionInRootIsEqualTo(0.dp)
+        rule.onNodeWithTag("2").assertTopPositionInRootIsEqualTo(itemSize)
     }
 
     @Test
     fun row_emitTwoElementsAsOneItem_positionedReversed() {
         rule.setContentWithTestViewConfiguration {
-            LazyRow(
-                reverseLayout = true
-            ) {
+            LazyRow(reverseLayout = true) {
                 item {
                     Box(Modifier.requiredSize(itemSize).testTag("0"))
                     Box(Modifier.requiredSize(itemSize).testTag("1"))
@@ -227,31 +194,21 @@
             }
         }
 
-        rule.onNodeWithTag("1")
-            .assertLeftPositionInRootIsEqualTo(0.dp)
-        rule.onNodeWithTag("0")
-            .assertLeftPositionInRootIsEqualTo(itemSize)
+        rule.onNodeWithTag("1").assertLeftPositionInRootIsEqualTo(0.dp)
+        rule.onNodeWithTag("0").assertLeftPositionInRootIsEqualTo(itemSize)
     }
 
     @Test
     fun row_emitTwoItems_positionedReversed() {
         rule.setContentWithTestViewConfiguration {
-            LazyRow(
-                reverseLayout = true
-            ) {
-                item {
-                    Box(Modifier.requiredSize(itemSize).testTag("0"))
-                }
-                item {
-                    Box(Modifier.requiredSize(itemSize).testTag("1"))
-                }
+            LazyRow(reverseLayout = true) {
+                item { Box(Modifier.requiredSize(itemSize).testTag("0")) }
+                item { Box(Modifier.requiredSize(itemSize).testTag("1")) }
             }
         }
 
-        rule.onNodeWithTag("1")
-            .assertLeftPositionInRootIsEqualTo(0.dp)
-        rule.onNodeWithTag("0")
-            .assertLeftPositionInRootIsEqualTo(itemSize)
+        rule.onNodeWithTag("1").assertLeftPositionInRootIsEqualTo(0.dp)
+        rule.onNodeWithTag("0").assertLeftPositionInRootIsEqualTo(itemSize)
     }
 
     @Test
@@ -263,9 +220,7 @@
                 state = rememberLazyListState().also { state = it },
                 modifier = Modifier.requiredSize(itemSize * 2).testTag(ContainerTag)
             ) {
-                items((0..2).toList()) {
-                    Box(Modifier.requiredSize(itemSize).testTag("$it"))
-                }
+                items((0..2).toList()) { Box(Modifier.requiredSize(itemSize).testTag("$it")) }
             }
         }
 
@@ -284,25 +239,20 @@
                 state = rememberLazyListState().also { state = it },
                 modifier = Modifier.requiredSize(itemSize * 2).testTag(ContainerTag)
             ) {
-                items((0..2).toList()) {
-                    Box(Modifier.requiredSize(itemSize).testTag("$it"))
-                }
+                items((0..2).toList()) { Box(Modifier.requiredSize(itemSize).testTag("$it")) }
             }
         }
 
         // we scroll down and as the scrolling is reversed it shouldn't affect anything
-        rule.onNodeWithTag(ContainerTag)
-            .scrollBy(x = itemSize, density = rule.density)
+        rule.onNodeWithTag(ContainerTag).scrollBy(x = itemSize, density = rule.density)
 
         rule.runOnIdle {
             assertThat(state.firstVisibleItemScrollOffset).isEqualTo(0)
             assertThat(state.firstVisibleItemIndex).isEqualTo(0)
         }
 
-        rule.onNodeWithTag("1")
-            .assertLeftPositionInRootIsEqualTo(0.dp)
-        rule.onNodeWithTag("0")
-            .assertLeftPositionInRootIsEqualTo(itemSize)
+        rule.onNodeWithTag("1").assertLeftPositionInRootIsEqualTo(0.dp)
+        rule.onNodeWithTag("0").assertLeftPositionInRootIsEqualTo(itemSize)
     }
 
     @Test
@@ -314,27 +264,22 @@
                 state = rememberLazyListState().also { state = it },
                 modifier = Modifier.requiredSize(itemSize * 2).testTag(ContainerTag)
             ) {
-                items((0..2).toList()) {
-                    Box(Modifier.requiredSize(itemSize).testTag("$it"))
-                }
+                items((0..2).toList()) { Box(Modifier.requiredSize(itemSize).testTag("$it")) }
             }
         }
 
-        rule.onNodeWithTag(ContainerTag)
-            .scrollBy(x = -itemSize * 0.5f, density = rule.density)
+        rule.onNodeWithTag(ContainerTag).scrollBy(x = -itemSize * 0.5f, density = rule.density)
 
-        val scrolled = rule.runOnIdle {
-            assertThat(state.firstVisibleItemScrollOffset).isGreaterThan(0)
-            assertThat(state.firstVisibleItemIndex).isEqualTo(0)
-            with(rule.density) { state.firstVisibleItemScrollOffset.toDp() }
-        }
+        val scrolled =
+            rule.runOnIdle {
+                assertThat(state.firstVisibleItemScrollOffset).isGreaterThan(0)
+                assertThat(state.firstVisibleItemIndex).isEqualTo(0)
+                with(rule.density) { state.firstVisibleItemScrollOffset.toDp() }
+            }
 
-        rule.onNodeWithTag("2")
-            .assertLeftPositionInRootIsEqualTo(-itemSize + scrolled)
-        rule.onNodeWithTag("1")
-            .assertLeftPositionInRootIsEqualTo(scrolled)
-        rule.onNodeWithTag("0")
-            .assertLeftPositionInRootIsEqualTo(itemSize + scrolled)
+        rule.onNodeWithTag("2").assertLeftPositionInRootIsEqualTo(-itemSize + scrolled)
+        rule.onNodeWithTag("1").assertLeftPositionInRootIsEqualTo(scrolled)
+        rule.onNodeWithTag("0").assertLeftPositionInRootIsEqualTo(itemSize + scrolled)
     }
 
     @Test
@@ -346,37 +291,31 @@
                 state = rememberLazyListState().also { state = it },
                 modifier = Modifier.requiredSize(itemSize * 2).testTag(ContainerTag)
             ) {
-                items((0..3).toList()) {
-                    Box(Modifier.requiredSize(itemSize).testTag("$it"))
-                }
+                items((0..3).toList()) { Box(Modifier.requiredSize(itemSize).testTag("$it")) }
             }
         }
 
         // we scroll a bit more than it is possible just to make sure we would stop correctly
-        rule.onNodeWithTag(ContainerTag)
-            .scrollBy(x = -itemSize * 2.2f, density = rule.density)
+        rule.onNodeWithTag(ContainerTag).scrollBy(x = -itemSize * 2.2f, density = rule.density)
 
         rule.runOnIdle {
             with(rule.density) {
-                val realOffset = state.firstVisibleItemScrollOffset.toDp() +
-                    itemSize * state.firstVisibleItemIndex
+                val realOffset =
+                    state.firstVisibleItemScrollOffset.toDp() +
+                        itemSize * state.firstVisibleItemIndex
                 assertThat(realOffset).isEqualTo(itemSize * 2)
             }
         }
 
-        rule.onNodeWithTag("3")
-            .assertLeftPositionInRootIsEqualTo(0.dp)
-        rule.onNodeWithTag("2")
-            .assertLeftPositionInRootIsEqualTo(itemSize)
+        rule.onNodeWithTag("3").assertLeftPositionInRootIsEqualTo(0.dp)
+        rule.onNodeWithTag("2").assertLeftPositionInRootIsEqualTo(itemSize)
     }
 
     @Test
     fun row_rtl_emitTwoElementsAsOneItem_positionedReversed() {
         rule.setContentWithTestViewConfiguration {
             CompositionLocalProvider(LocalLayoutDirection provides LayoutDirection.Rtl) {
-                LazyRow(
-                    reverseLayout = true
-                ) {
+                LazyRow(reverseLayout = true) {
                     item {
                         Box(Modifier.requiredSize(itemSize).testTag("0"))
                         Box(Modifier.requiredSize(itemSize).testTag("1"))
@@ -385,33 +324,23 @@
             }
         }
 
-        rule.onNodeWithTag("1")
-            .assertLeftPositionInRootIsEqualTo(itemSize)
-        rule.onNodeWithTag("0")
-            .assertLeftPositionInRootIsEqualTo(0.dp)
+        rule.onNodeWithTag("1").assertLeftPositionInRootIsEqualTo(itemSize)
+        rule.onNodeWithTag("0").assertLeftPositionInRootIsEqualTo(0.dp)
     }
 
     @Test
     fun row_rtl_emitTwoItems_positionedReversed() {
         rule.setContentWithTestViewConfiguration {
             CompositionLocalProvider(LocalLayoutDirection provides LayoutDirection.Rtl) {
-                LazyRow(
-                    reverseLayout = true
-                ) {
-                    item {
-                        Box(Modifier.requiredSize(itemSize).testTag("0"))
-                    }
-                    item {
-                        Box(Modifier.requiredSize(itemSize).testTag("1"))
-                    }
+                LazyRow(reverseLayout = true) {
+                    item { Box(Modifier.requiredSize(itemSize).testTag("0")) }
+                    item { Box(Modifier.requiredSize(itemSize).testTag("1")) }
                 }
             }
         }
 
-        rule.onNodeWithTag("1")
-            .assertLeftPositionInRootIsEqualTo(itemSize)
-        rule.onNodeWithTag("0")
-            .assertLeftPositionInRootIsEqualTo(0.dp)
+        rule.onNodeWithTag("1").assertLeftPositionInRootIsEqualTo(itemSize)
+        rule.onNodeWithTag("0").assertLeftPositionInRootIsEqualTo(0.dp)
     }
 
     @Test
@@ -424,37 +353,30 @@
                     state = rememberLazyListState().also { state = it },
                     modifier = Modifier.requiredSize(itemSize * 2).testTag(ContainerTag)
                 ) {
-                    items((0..2).toList()) {
-                        Box(Modifier.requiredSize(itemSize).testTag("$it"))
-                    }
+                    items((0..2).toList()) { Box(Modifier.requiredSize(itemSize).testTag("$it")) }
                 }
             }
         }
 
-        rule.onNodeWithTag(ContainerTag)
-            .scrollBy(x = itemSize * 0.5f, density = rule.density)
+        rule.onNodeWithTag(ContainerTag).scrollBy(x = itemSize * 0.5f, density = rule.density)
 
-        val scrolled = rule.runOnIdle {
-            assertThat(state.firstVisibleItemScrollOffset).isGreaterThan(0)
-            assertThat(state.firstVisibleItemIndex).isEqualTo(0)
-            with(rule.density) { state.firstVisibleItemScrollOffset.toDp() }
-        }
+        val scrolled =
+            rule.runOnIdle {
+                assertThat(state.firstVisibleItemScrollOffset).isGreaterThan(0)
+                assertThat(state.firstVisibleItemIndex).isEqualTo(0)
+                with(rule.density) { state.firstVisibleItemScrollOffset.toDp() }
+            }
 
-        rule.onNodeWithTag("0")
-            .assertLeftPositionInRootIsEqualTo(-scrolled)
-        rule.onNodeWithTag("1")
-            .assertLeftPositionInRootIsEqualTo(itemSize - scrolled)
-        rule.onNodeWithTag("2")
-            .assertLeftPositionInRootIsEqualTo(itemSize * 2 - scrolled)
+        rule.onNodeWithTag("0").assertLeftPositionInRootIsEqualTo(-scrolled)
+        rule.onNodeWithTag("1").assertLeftPositionInRootIsEqualTo(itemSize - scrolled)
+        rule.onNodeWithTag("2").assertLeftPositionInRootIsEqualTo(itemSize * 2 - scrolled)
     }
 
     @Test
     fun column_whenParameterChanges() {
         var reverse by mutableStateOf(true)
         rule.setContentWithTestViewConfiguration {
-            LazyColumn(
-                reverseLayout = reverse
-            ) {
+            LazyColumn(reverseLayout = reverse) {
                 item {
                     Box(Modifier.requiredSize(itemSize).testTag("0"))
                     Box(Modifier.requiredSize(itemSize).testTag("1"))
@@ -462,28 +384,20 @@
             }
         }
 
-        rule.onNodeWithTag("1")
-            .assertTopPositionInRootIsEqualTo(0.dp)
-        rule.onNodeWithTag("0")
-            .assertTopPositionInRootIsEqualTo(itemSize)
+        rule.onNodeWithTag("1").assertTopPositionInRootIsEqualTo(0.dp)
+        rule.onNodeWithTag("0").assertTopPositionInRootIsEqualTo(itemSize)
 
-        rule.runOnIdle {
-            reverse = false
-        }
+        rule.runOnIdle { reverse = false }
 
-        rule.onNodeWithTag("0")
-            .assertTopPositionInRootIsEqualTo(0.dp)
-        rule.onNodeWithTag("1")
-            .assertTopPositionInRootIsEqualTo(itemSize)
+        rule.onNodeWithTag("0").assertTopPositionInRootIsEqualTo(0.dp)
+        rule.onNodeWithTag("1").assertTopPositionInRootIsEqualTo(itemSize)
     }
 
     @Test
     fun row_whenParameterChanges() {
         var reverse by mutableStateOf(true)
         rule.setContentWithTestViewConfiguration {
-            LazyRow(
-                reverseLayout = reverse
-            ) {
+            LazyRow(reverseLayout = reverse) {
                 item {
                     Box(Modifier.requiredSize(itemSize).testTag("0"))
                     Box(Modifier.requiredSize(itemSize).testTag("1"))
@@ -491,18 +405,12 @@
             }
         }
 
-        rule.onNodeWithTag("1")
-            .assertLeftPositionInRootIsEqualTo(0.dp)
-        rule.onNodeWithTag("0")
-            .assertLeftPositionInRootIsEqualTo(itemSize)
+        rule.onNodeWithTag("1").assertLeftPositionInRootIsEqualTo(0.dp)
+        rule.onNodeWithTag("0").assertLeftPositionInRootIsEqualTo(itemSize)
 
-        rule.runOnIdle {
-            reverse = false
-        }
+        rule.runOnIdle { reverse = false }
 
-        rule.onNodeWithTag("0")
-            .assertLeftPositionInRootIsEqualTo(0.dp)
-        rule.onNodeWithTag("1")
-            .assertLeftPositionInRootIsEqualTo(itemSize)
+        rule.onNodeWithTag("0").assertLeftPositionInRootIsEqualTo(0.dp)
+        rule.onNodeWithTag("1").assertLeftPositionInRootIsEqualTo(itemSize)
     }
 }
diff --git a/compose/foundation/foundation/integration-tests/lazy-tests/src/androidTest/kotlin/androidx/compose/foundation/lazy/list/LazyNestedScrollingTest.kt b/compose/foundation/foundation/integration-tests/lazy-tests/src/androidTest/kotlin/androidx/compose/foundation/lazy/list/LazyNestedScrollingTest.kt
index de06709..9fc882c 100644
--- a/compose/foundation/foundation/integration-tests/lazy-tests/src/androidTest/kotlin/androidx/compose/foundation/lazy/list/LazyNestedScrollingTest.kt
+++ b/compose/foundation/foundation/integration-tests/lazy-tests/src/androidTest/kotlin/androidx/compose/foundation/lazy/list/LazyNestedScrollingTest.kt
@@ -47,8 +47,7 @@
 class LazyNestedScrollingTest {
     private val LazyTag = "LazyTag"
 
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
     private val expectedDragOffset = 20f
     private val dragOffsetWithTouchSlop = expectedDragOffset + TestTouchSlop
@@ -62,36 +61,20 @@
             it
         }
         rule.setContentWithTestViewConfiguration {
-            Box(
-                Modifier.scrollable(
-                    orientation = Orientation.Vertical,
-                    state = scrollable
-                )
-            ) {
-                LazyColumn(
-                    Modifier
-                        .requiredSize(100.dp)
-                        .testTag(LazyTag)) {
-                    items(items) {
-                        Spacer(
-                            Modifier
-                                .requiredSize(50.dp)
-                                .testTag("$it"))
-                    }
+            Box(Modifier.scrollable(orientation = Orientation.Vertical, state = scrollable)) {
+                LazyColumn(Modifier.requiredSize(100.dp).testTag(LazyTag)) {
+                    items(items) { Spacer(Modifier.requiredSize(50.dp).testTag("$it")) }
                 }
             }
         }
 
-        rule.onNodeWithTag(LazyTag)
-            .performTouchInput {
-                down(Offset(x = 10f, y = 10f))
-                moveBy(Offset(x = 0f, y = 100f + TestTouchSlop))
-                up()
-            }
-
-        rule.runOnIdle {
-            Truth.assertThat(draggedOffset).isEqualTo(100f)
+        rule.onNodeWithTag(LazyTag).performTouchInput {
+            down(Offset(x = 10f, y = 10f))
+            moveBy(Offset(x = 0f, y = 100f + TestTouchSlop))
+            up()
         }
+
+        rule.runOnIdle { Truth.assertThat(draggedOffset).isEqualTo(100f) }
     }
 
     @Test
@@ -103,46 +86,28 @@
             it
         }
         rule.setContentWithTestViewConfiguration {
-            Box(
-                Modifier.scrollable(
-                    orientation = Orientation.Vertical,
-                    state = scrollable
-                )
-            ) {
-                LazyColumn(
-                    Modifier
-                        .requiredSize(100.dp)
-                        .testTag(LazyTag)) {
-                    items(items) {
-                        Spacer(
-                            Modifier
-                                .requiredSize(50.dp)
-                                .testTag("$it"))
-                    }
+            Box(Modifier.scrollable(orientation = Orientation.Vertical, state = scrollable)) {
+                LazyColumn(Modifier.requiredSize(100.dp).testTag(LazyTag)) {
+                    items(items) { Spacer(Modifier.requiredSize(50.dp).testTag("$it")) }
                 }
             }
         }
 
         // scroll forward
-        rule.onNodeWithTag(LazyTag)
-            .scrollBy(y = 20.dp, density = rule.density)
+        rule.onNodeWithTag(LazyTag).scrollBy(y = 20.dp, density = rule.density)
 
         // scroll back so we again on 0 position
         // we scroll one extra dp to prevent rounding issues
-        rule.onNodeWithTag(LazyTag)
-            .scrollBy(y = -(21.dp), density = rule.density)
+        rule.onNodeWithTag(LazyTag).scrollBy(y = -(21.dp), density = rule.density)
 
-        rule.onNodeWithTag(LazyTag)
-            .performTouchInput {
-                draggedOffset = 0f
-                down(Offset(x = 10f, y = 10f))
-                moveBy(Offset(x = 0f, y = dragOffsetWithTouchSlop))
-                up()
-            }
-
-        rule.runOnIdle {
-            Truth.assertThat(draggedOffset).isEqualTo(expectedDragOffset)
+        rule.onNodeWithTag(LazyTag).performTouchInput {
+            draggedOffset = 0f
+            down(Offset(x = 10f, y = 10f))
+            moveBy(Offset(x = 0f, y = dragOffsetWithTouchSlop))
+            up()
         }
+
+        rule.runOnIdle { Truth.assertThat(draggedOffset).isEqualTo(expectedDragOffset) }
     }
 
     @Test
@@ -154,36 +119,20 @@
             it
         }
         rule.setContentWithTestViewConfiguration {
-            Box(
-                Modifier.scrollable(
-                    orientation = Orientation.Vertical,
-                    state = scrollable
-                )
-            ) {
-                LazyColumn(
-                    Modifier
-                        .requiredSize(100.dp)
-                        .testTag(LazyTag)) {
-                    items(items) {
-                        Spacer(
-                            Modifier
-                                .requiredSize(40.dp)
-                                .testTag("$it"))
-                    }
+            Box(Modifier.scrollable(orientation = Orientation.Vertical, state = scrollable)) {
+                LazyColumn(Modifier.requiredSize(100.dp).testTag(LazyTag)) {
+                    items(items) { Spacer(Modifier.requiredSize(40.dp).testTag("$it")) }
                 }
             }
         }
 
-        rule.onNodeWithTag(LazyTag)
-            .performTouchInput {
-                down(Offset(x = 10f, y = 10f))
-                moveBy(Offset(x = 0f, y = -dragOffsetWithTouchSlop))
-                up()
-            }
-
-        rule.runOnIdle {
-            Truth.assertThat(draggedOffset).isEqualTo(-expectedDragOffset)
+        rule.onNodeWithTag(LazyTag).performTouchInput {
+            down(Offset(x = 10f, y = 10f))
+            moveBy(Offset(x = 0f, y = -dragOffsetWithTouchSlop))
+            up()
         }
+
+        rule.runOnIdle { Truth.assertThat(draggedOffset).isEqualTo(-expectedDragOffset) }
     }
 
     @Test
@@ -195,41 +144,24 @@
             it
         }
         rule.setContentWithTestViewConfiguration {
-            Box(
-                Modifier.scrollable(
-                    orientation = Orientation.Vertical,
-                    state = scrollable
-                )
-            ) {
-                LazyColumn(
-                    Modifier
-                        .requiredSize(100.dp)
-                        .testTag(LazyTag)) {
-                    items(items) {
-                        Spacer(
-                            Modifier
-                                .requiredSize(50.dp)
-                                .testTag("$it"))
-                    }
+            Box(Modifier.scrollable(orientation = Orientation.Vertical, state = scrollable)) {
+                LazyColumn(Modifier.requiredSize(100.dp).testTag(LazyTag)) {
+                    items(items) { Spacer(Modifier.requiredSize(50.dp).testTag("$it")) }
                 }
             }
         }
 
         // scroll till the end
-        rule.onNodeWithTag(LazyTag)
-            .scrollBy(y = 55.dp, density = rule.density)
+        rule.onNodeWithTag(LazyTag).scrollBy(y = 55.dp, density = rule.density)
 
-        rule.onNodeWithTag(LazyTag)
-            .performTouchInput {
-                draggedOffset = 0f
-                down(Offset(x = 10f, y = 10f))
-                moveBy(Offset(x = 0f, y = -dragOffsetWithTouchSlop))
-                up()
-            }
-
-        rule.runOnIdle {
-            Truth.assertThat(draggedOffset).isEqualTo(-expectedDragOffset)
+        rule.onNodeWithTag(LazyTag).performTouchInput {
+            draggedOffset = 0f
+            down(Offset(x = 10f, y = 10f))
+            moveBy(Offset(x = 0f, y = -dragOffsetWithTouchSlop))
+            up()
         }
+
+        rule.runOnIdle { Truth.assertThat(draggedOffset).isEqualTo(-expectedDragOffset) }
     }
 
     @Test
@@ -241,37 +173,20 @@
             it
         }
         rule.setContentWithTestViewConfiguration {
-            Box(
-                Modifier.scrollable(
-                    orientation = Orientation.Horizontal,
-                    state = scrollable
-                )
-            ) {
-                LazyRow(
-                    modifier = Modifier
-                        .requiredSize(100.dp)
-                        .testTag(LazyTag)
-                ) {
-                    items(items) {
-                        Spacer(
-                            Modifier
-                                .requiredSize(50.dp)
-                                .testTag("$it"))
-                    }
+            Box(Modifier.scrollable(orientation = Orientation.Horizontal, state = scrollable)) {
+                LazyRow(modifier = Modifier.requiredSize(100.dp).testTag(LazyTag)) {
+                    items(items) { Spacer(Modifier.requiredSize(50.dp).testTag("$it")) }
                 }
             }
         }
 
-        rule.onNodeWithTag(LazyTag)
-            .performTouchInput {
-                down(Offset(x = 10f, y = 10f))
-                moveBy(Offset(x = dragOffsetWithTouchSlop, y = 0f))
-                up()
-            }
-
-        rule.runOnIdle {
-            Truth.assertThat(draggedOffset).isEqualTo(expectedDragOffset)
+        rule.onNodeWithTag(LazyTag).performTouchInput {
+            down(Offset(x = 10f, y = 10f))
+            moveBy(Offset(x = dragOffsetWithTouchSlop, y = 0f))
+            up()
         }
+
+        rule.runOnIdle { Truth.assertThat(draggedOffset).isEqualTo(expectedDragOffset) }
     }
 
     @Test
@@ -283,47 +198,28 @@
             it
         }
         rule.setContentWithTestViewConfiguration {
-            Box(
-                Modifier.scrollable(
-                    orientation = Orientation.Horizontal,
-                    state = scrollable
-                )
-            ) {
-                LazyRow(
-                    modifier = Modifier
-                        .requiredSize(100.dp)
-                        .testTag(LazyTag)
-                ) {
-                    items(items) {
-                        Spacer(
-                            Modifier
-                                .requiredSize(50.dp)
-                                .testTag("$it"))
-                    }
+            Box(Modifier.scrollable(orientation = Orientation.Horizontal, state = scrollable)) {
+                LazyRow(modifier = Modifier.requiredSize(100.dp).testTag(LazyTag)) {
+                    items(items) { Spacer(Modifier.requiredSize(50.dp).testTag("$it")) }
                 }
             }
         }
 
         // scroll forward
-        rule.onNodeWithTag(LazyTag)
-            .scrollBy(x = 20.dp, density = rule.density)
+        rule.onNodeWithTag(LazyTag).scrollBy(x = 20.dp, density = rule.density)
 
         // scroll back so we again on 0 position
         // we scroll one extra dp to prevent rounding issues
-        rule.onNodeWithTag(LazyTag)
-            .scrollBy(x = -(21.dp), density = rule.density)
+        rule.onNodeWithTag(LazyTag).scrollBy(x = -(21.dp), density = rule.density)
 
-        rule.onNodeWithTag(LazyTag)
-            .performTouchInput {
-                draggedOffset = 0f
-                down(Offset(x = 10f, y = 10f))
-                moveBy(Offset(x = dragOffsetWithTouchSlop, y = 0f))
-                up()
-            }
-
-        rule.runOnIdle {
-            Truth.assertThat(draggedOffset).isEqualTo(expectedDragOffset)
+        rule.onNodeWithTag(LazyTag).performTouchInput {
+            draggedOffset = 0f
+            down(Offset(x = 10f, y = 10f))
+            moveBy(Offset(x = dragOffsetWithTouchSlop, y = 0f))
+            up()
         }
+
+        rule.runOnIdle { Truth.assertThat(draggedOffset).isEqualTo(expectedDragOffset) }
     }
 
     @Test
@@ -335,37 +231,20 @@
             it
         }
         rule.setContentWithTestViewConfiguration {
-            Box(
-                Modifier.scrollable(
-                    orientation = Orientation.Horizontal,
-                    state = scrollable
-                )
-            ) {
-                LazyRow(
-                    modifier = Modifier
-                        .requiredSize(100.dp)
-                        .testTag(LazyTag)
-                ) {
-                    items(items) {
-                        Spacer(
-                            Modifier
-                                .requiredSize(40.dp)
-                                .testTag("$it"))
-                    }
+            Box(Modifier.scrollable(orientation = Orientation.Horizontal, state = scrollable)) {
+                LazyRow(modifier = Modifier.requiredSize(100.dp).testTag(LazyTag)) {
+                    items(items) { Spacer(Modifier.requiredSize(40.dp).testTag("$it")) }
                 }
             }
         }
 
-        rule.onNodeWithTag(LazyTag)
-            .performTouchInput {
-                down(Offset(x = 10f, y = 10f))
-                moveBy(Offset(x = -dragOffsetWithTouchSlop, y = 0f))
-                up()
-            }
-
-        rule.runOnIdle {
-            Truth.assertThat(draggedOffset).isEqualTo(-expectedDragOffset)
+        rule.onNodeWithTag(LazyTag).performTouchInput {
+            down(Offset(x = 10f, y = 10f))
+            moveBy(Offset(x = -dragOffsetWithTouchSlop, y = 0f))
+            up()
         }
+
+        rule.runOnIdle { Truth.assertThat(draggedOffset).isEqualTo(-expectedDragOffset) }
     }
 
     @Test
@@ -377,42 +256,24 @@
             it
         }
         rule.setContentWithTestViewConfiguration {
-            Box(
-                Modifier.scrollable(
-                    orientation = Orientation.Horizontal,
-                    state = scrollable
-                )
-            ) {
-                LazyRow(
-                    modifier = Modifier
-                        .requiredSize(100.dp)
-                        .testTag(LazyTag)
-                ) {
-                    items(items) {
-                        Spacer(
-                            Modifier
-                                .requiredSize(50.dp)
-                                .testTag("$it"))
-                    }
+            Box(Modifier.scrollable(orientation = Orientation.Horizontal, state = scrollable)) {
+                LazyRow(modifier = Modifier.requiredSize(100.dp).testTag(LazyTag)) {
+                    items(items) { Spacer(Modifier.requiredSize(50.dp).testTag("$it")) }
                 }
             }
         }
 
         // scroll till the end
-        rule.onNodeWithTag(LazyTag)
-            .scrollBy(x = 55.dp, density = rule.density)
+        rule.onNodeWithTag(LazyTag).scrollBy(x = 55.dp, density = rule.density)
 
-        rule.onNodeWithTag(LazyTag)
-            .performTouchInput {
-                draggedOffset = 0f
-                down(Offset(x = 10f, y = 10f))
-                moveBy(Offset(x = -dragOffsetWithTouchSlop, y = 0f))
-                up()
-            }
-
-        rule.runOnIdle {
-            Truth.assertThat(draggedOffset).isEqualTo(-expectedDragOffset)
+        rule.onNodeWithTag(LazyTag).performTouchInput {
+            draggedOffset = 0f
+            down(Offset(x = 10f, y = 10f))
+            moveBy(Offset(x = -dragOffsetWithTouchSlop, y = 0f))
+            up()
         }
+
+        rule.runOnIdle { Truth.assertThat(draggedOffset).isEqualTo(-expectedDragOffset) }
     }
 
     @OptIn(ExperimentalTestApi::class)
@@ -428,47 +289,29 @@
         }
         rule.setContentWithTestViewConfiguration {
             Box(
-                Modifier.scrollable(
-                    orientation = Orientation.Vertical,
-                    state = scrollable
-                ).testTag(boxTab)
+                Modifier.scrollable(orientation = Orientation.Vertical, state = scrollable)
+                    .testTag(boxTab)
             ) {
-                LazyColumn(
-                    modifier = Modifier.requiredSize(200.dp)
-                ) {
+                LazyColumn(modifier = Modifier.requiredSize(200.dp)) {
                     item {
-                        LazyRow(
-                            modifier = Modifier
-                                .requiredSize(100.dp)
-                                .testTag(LazyTag)
-                        ) {
-                            items(items) {
-                                Spacer(Modifier.requiredSize(50.dp))
-                            }
+                        LazyRow(modifier = Modifier.requiredSize(100.dp).testTag(LazyTag)) {
+                            items(items) { Spacer(Modifier.requiredSize(50.dp)) }
                         }
                     }
-                    items(items) {
-                        Spacer(Modifier.requiredSize(50.dp))
-                    }
+                    items(items) { Spacer(Modifier.requiredSize(50.dp)) }
                 }
             }
         }
 
-        rule.onNodeWithTag(LazyTag).performMouseInput {
-            this.scroll(100f)
-        }
+        rule.onNodeWithTag(LazyTag).performMouseInput { this.scroll(100f) }
 
         rule.runOnIdle {
             // Mouse scroll is opposite, so we test is it less than zero (negative number).
             Truth.assertThat(total).isLessThan(0)
         }
 
-        rule.onNodeWithTag(boxTab).performMouseInput {
-            this.scroll(-100f)
-        }
+        rule.onNodeWithTag(boxTab).performMouseInput { this.scroll(-100f) }
 
-        rule.runOnIdle {
-            Truth.assertThat(total).isLessThan(0.01f)
-        }
+        rule.runOnIdle { Truth.assertThat(total).isLessThan(0.01f) }
     }
 }
diff --git a/compose/foundation/foundation/integration-tests/lazy-tests/src/androidTest/kotlin/androidx/compose/foundation/lazy/list/LazyRowTest.kt b/compose/foundation/foundation/integration-tests/lazy-tests/src/androidTest/kotlin/androidx/compose/foundation/lazy/list/LazyRowTest.kt
index 74535c5..be636a1 100644
--- a/compose/foundation/foundation/integration-tests/lazy-tests/src/androidTest/kotlin/androidx/compose/foundation/lazy/list/LazyRowTest.kt
+++ b/compose/foundation/foundation/integration-tests/lazy-tests/src/androidTest/kotlin/androidx/compose/foundation/lazy/list/LazyRowTest.kt
@@ -51,8 +51,7 @@
 class LazyRowTest {
     private val LazyListTag = "LazyListTag"
 
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
     private val firstItemTag = "firstItemTag"
     private val secondItemTag = "secondItemTag"
@@ -73,14 +72,11 @@
             }
         }
 
-        rule.onNodeWithTag(firstItemTag)
-            .assertIsDisplayed()
+        rule.onNodeWithTag(firstItemTag).assertIsDisplayed()
 
-        rule.onNodeWithTag(secondItemTag)
-            .assertIsDisplayed()
+        rule.onNodeWithTag(secondItemTag).assertIsDisplayed()
 
-        val lazyRowBounds = rule.onNodeWithTag(LazyListTag)
-            .getUnclippedBoundsInRoot()
+        val lazyRowBounds = rule.onNodeWithTag(LazyListTag).getUnclippedBoundsInRoot()
 
         with(rule.density) {
             // Verify the height of the row
@@ -93,33 +89,27 @@
     fun lazyRowAlignmentCenterVertically() {
         prepareLazyRowForAlignment(Alignment.CenterVertically)
 
-        rule.onNodeWithTag(firstItemTag)
-            .assertPositionInRootIsEqualTo(0.dp, 25.dp)
+        rule.onNodeWithTag(firstItemTag).assertPositionInRootIsEqualTo(0.dp, 25.dp)
 
-        rule.onNodeWithTag(secondItemTag)
-            .assertPositionInRootIsEqualTo(50.dp, 15.dp)
+        rule.onNodeWithTag(secondItemTag).assertPositionInRootIsEqualTo(50.dp, 15.dp)
     }
 
     @Test
     fun lazyRowAlignmentTop() {
         prepareLazyRowForAlignment(Alignment.Top)
 
-        rule.onNodeWithTag(firstItemTag)
-            .assertPositionInRootIsEqualTo(0.dp, 0.dp)
+        rule.onNodeWithTag(firstItemTag).assertPositionInRootIsEqualTo(0.dp, 0.dp)
 
-        rule.onNodeWithTag(secondItemTag)
-            .assertPositionInRootIsEqualTo(50.dp, 0.dp)
+        rule.onNodeWithTag(secondItemTag).assertPositionInRootIsEqualTo(50.dp, 0.dp)
     }
 
     @Test
     fun lazyRowAlignmentBottom() {
         prepareLazyRowForAlignment(Alignment.Bottom)
 
-        rule.onNodeWithTag(firstItemTag)
-            .assertPositionInRootIsEqualTo(0.dp, 50.dp)
+        rule.onNodeWithTag(firstItemTag).assertPositionInRootIsEqualTo(0.dp, 50.dp)
 
-        rule.onNodeWithTag(secondItemTag)
-            .assertPositionInRootIsEqualTo(50.dp, 30.dp)
+        rule.onNodeWithTag(secondItemTag).assertPositionInRootIsEqualTo(50.dp, 30.dp)
     }
 
     @Test
@@ -131,17 +121,14 @@
                     state = rememberLazyListState()
                     LazyRow(Modifier.testTag(LazyListTag), state) {
                         items(4) {
-                            Spacer(
-                                Modifier.width(101.dp).fillParentMaxHeight().testTag("$it")
-                            )
+                            Spacer(Modifier.width(101.dp).fillParentMaxHeight().testTag("$it"))
                         }
                     }
                 }
             }
         }
 
-        rule.onNodeWithTag(LazyListTag)
-            .scrollBy(x = (-150).dp, density = rule.density)
+        rule.onNodeWithTag(LazyListTag).scrollBy(x = (-150).dp, density = rule.density)
 
         rule.runOnIdle {
             assertThat(state.firstVisibleItemIndex).isEqualTo(1)
@@ -149,25 +136,24 @@
         }
     }
 
-   @Test
-   fun laysOutRtlCorrectlyWithLargerRow() {
-       val rowWidth = with(rule.density) { 300.toDp() }
-       val rowHeight = with(rule.density) { 100.toDp() }
-       val itemSize = with(rule.density) { 50.toDp() }
-       rule.setContent {
-           Column {
-               CompositionLocalProvider(LocalLayoutDirection provides LayoutDirection.Rtl) {
-                   LazyRow(modifier = Modifier.size(width = rowWidth, height = rowHeight)) {
-                       items(3) { index ->
-                           val label = index.toString()
-                           BasicText(label, Modifier.size(itemSize).testTag(label))
-                       }
-                   }
-               }
-           }
-       }
+    @Test
+    fun laysOutRtlCorrectlyWithLargerRow() {
+        val rowWidth = with(rule.density) { 300.toDp() }
+        val rowHeight = with(rule.density) { 100.toDp() }
+        val itemSize = with(rule.density) { 50.toDp() }
+        rule.setContent {
+            Column {
+                CompositionLocalProvider(LocalLayoutDirection provides LayoutDirection.Rtl) {
+                    LazyRow(modifier = Modifier.size(width = rowWidth, height = rowHeight)) {
+                        items(3) { index ->
+                            val label = index.toString()
+                            BasicText(label, Modifier.size(itemSize).testTag(label))
+                        }
+                    }
+                }
+            }
+        }
 
-       rule.onNodeWithTag("0")
-           .assertPositionInRootIsEqualTo(rowWidth - itemSize, 0.dp)
+        rule.onNodeWithTag("0").assertPositionInRootIsEqualTo(rowWidth - itemSize, 0.dp)
     }
 }
diff --git a/compose/foundation/foundation/integration-tests/lazy-tests/src/androidTest/kotlin/androidx/compose/foundation/lazy/list/LazyScrollAccessibilityTest.kt b/compose/foundation/foundation/integration-tests/lazy-tests/src/androidTest/kotlin/androidx/compose/foundation/lazy/list/LazyScrollAccessibilityTest.kt
index 15fd4f6..50bdc6d 100644
--- a/compose/foundation/foundation/integration-tests/lazy-tests/src/androidTest/kotlin/androidx/compose/foundation/lazy/list/LazyScrollAccessibilityTest.kt
+++ b/compose/foundation/foundation/integration-tests/lazy-tests/src/androidTest/kotlin/androidx/compose/foundation/lazy/list/LazyScrollAccessibilityTest.kt
@@ -64,11 +64,7 @@
 @MediumTest
 @RunWith(Parameterized::class)
 class LazyScrollAccessibilityTest(private val config: TestConfig) {
-    data class TestConfig(
-        val horizontal: Boolean,
-        val rtl: Boolean,
-        val reversed: Boolean
-    ) {
+    data class TestConfig(val horizontal: Boolean, val rtl: Boolean, val reversed: Boolean) {
         val vertical = !horizontal
 
         override fun toString(): String {
@@ -84,27 +80,26 @@
         fun params() =
             listOf(true, false).flatMap { horizontal ->
                 listOf(false, true).flatMap { rtl ->
-                    listOf(false, true).map { reversed ->
-                        TestConfig(horizontal, rtl, reversed)
-                    }
+                    listOf(false, true).map { reversed -> TestConfig(horizontal, rtl, reversed) }
                 }
             }
     }
 
-    @get:Rule
-    val rule = createAndroidComposeRule<ComponentActivity>()
+    @get:Rule val rule = createAndroidComposeRule<ComponentActivity>()
 
     private val scrollerTag = "ScrollerTest"
     private var composeView: View? = null
     private val accessibilityNodeProvider: AccessibilityNodeProvider
-        get() = checkNotNull(composeView) {
-            "composeView not initialized. Did `composeView = LocalView.current` not work?"
-        }.let { composeView ->
-            ViewCompat
-                .getAccessibilityDelegate(composeView)!!
-                .getAccessibilityNodeProvider(composeView)!!
-                .provider as AccessibilityNodeProvider
-        }
+        get() =
+            checkNotNull(composeView) {
+                    "composeView not initialized. Did `composeView = LocalView.current` not work?"
+                }
+                .let { composeView ->
+                    ViewCompat.getAccessibilityDelegate(composeView)!!.getAccessibilityNodeProvider(
+                            composeView
+                        )!!
+                        .provider as AccessibilityNodeProvider
+                }
 
     private val itemSize = 21
     private var itemSizeDp: Dp = Dp.Unspecified
@@ -164,10 +159,7 @@
     @Test
     fun verifyScrollActionsInMiddle() {
         createScrollableContent_StartInMiddle()
-        verifyNodeInfoScrollActions(
-            expectForward = true,
-            expectBackward = true
-        )
+        verifyNodeInfoScrollActions(expectForward = true, expectBackward = true)
     }
 
     @Test
@@ -180,12 +172,12 @@
     }
 
     /**
-     * Setup the test, run the given [accessibilityAction], and check if the [canonicalTarget]
-     * has been reached. The canonical target is the item that we expect to see when moving
-     * forward in a non-reversed scrollable (e.g. down in LazyColumn or right in LazyRow in LTR).
-     * The actual target is either the canonical target or the target that is as far from the
-     * middle of the lazy list as the canonical target, but on the other side of the middle,
-     * depending on the [configuration][config].
+     * Setup the test, run the given [accessibilityAction], and check if the [canonicalTarget] has
+     * been reached. The canonical target is the item that we expect to see when moving forward in a
+     * non-reversed scrollable (e.g. down in LazyColumn or right in LazyRow in LTR). The actual
+     * target is either the canonical target or the target that is as far from the middle of the
+     * lazy list as the canonical target, but on the other side of the middle, depending on the
+     * [configuration][config].
      */
     private fun testRelativeDirection(canonicalTarget: Int, accessibilityAction: Int) {
         val target = if (!config.reversed) canonicalTarget else 100 - canonicalTarget - 1
@@ -193,12 +185,12 @@
     }
 
     /**
-     * Setup the test, run the given [accessibilityAction], and check if the [canonicalTarget]
-     * has been reached (but only if we [expect][expectActionSuccess] the action to succeed).
-     * The canonical target is the item that we expect to see when moving forward in a
-     * non-reversed scrollable (e.g. down in LazyColumn or right in LazyRow in LTR). The actual
-     * target is either the canonical target or the target that is as far from the middle of the
-     * scrollable as the canonical target, but on the other side of the middle, depending on the
+     * Setup the test, run the given [accessibilityAction], and check if the [canonicalTarget] has
+     * been reached (but only if we [expect][expectActionSuccess] the action to succeed). The
+     * canonical target is the item that we expect to see when moving forward in a non-reversed
+     * scrollable (e.g. down in LazyColumn or right in LazyRow in LTR). The actual target is either
+     * the canonical target or the target that is as far from the middle of the scrollable as the
+     * canonical target, but on the other side of the middle, depending on the
      * [configuration][config].
      */
     private fun testAbsoluteDirection(
@@ -228,9 +220,10 @@
         createScrollableContent_StartInMiddle()
         rule.onNodeWithText("$target").assertDoesNotExist()
 
-        val returnValue = rule.onNodeWithTag(scrollerTag).withSemanticsNode {
-            accessibilityNodeProvider.performAction(id, accessibilityAction, null)
-        }
+        val returnValue =
+            rule.onNodeWithTag(scrollerTag).withSemanticsNode {
+                accessibilityNodeProvider.performAction(id, accessibilityAction, null)
+            }
 
         assertThat(returnValue).isEqualTo(expectActionSuccess)
         if (expectActionSuccess) {
@@ -247,11 +240,10 @@
      * [reversing][TestConfig.reversed].
      */
     private fun verifyNodeInfoScrollActions(expectForward: Boolean, expectBackward: Boolean) {
-        val nodeInfo = rule.onNodeWithTag(scrollerTag).withSemanticsNode {
-            rule.runOnUiThread {
-                accessibilityNodeProvider.createAccessibilityNodeInfo(id)!!
+        val nodeInfo =
+            rule.onNodeWithTag(scrollerTag).withSemanticsNode {
+                rule.runOnUiThread { accessibilityNodeProvider.createAccessibilityNodeInfo(id)!! }
             }
-        }
 
         val actions = nodeInfo.actionList.map { it.id }
 
@@ -292,9 +284,7 @@
         }
     }
 
-    /**
-     * Creates a Row/Column that starts in the middle, according to [createScrollableContent]
-     */
+    /** Creates a Row/Column that starts in the middle, according to [createScrollableContent] */
     private fun createScrollableContent_StartInMiddle() {
         createScrollableContent {
             // Start at the middle:
@@ -302,16 +292,11 @@
             // Viewport size: 200 rect - 50 padding on both sides = 100
             // Content outside viewport: 2100 - 100 = 2000
             // -> centered when 1000 on either side, which is 47 items + 13
-            rememberLazyListState(
-                47,
-                13
-            )
+            rememberLazyListState(47, 13)
         }
     }
 
-    /**
-     * Creates a Row/Column that starts at the last item, according to [createScrollableContent]
-     */
+    /** Creates a Row/Column that starts at the last item, according to [createScrollableContent] */
     private fun createScrollableContent_StartAtEnd() {
         createScrollableContent {
             // Start at the end:
@@ -319,18 +304,15 @@
             // Viewport size: 200 rect - 50 padding on both sides = 100
             // Content outside viewport: 2100 - 100 = 2000
             // -> at the end when offset at 2000, which is 95 items + 5
-            rememberLazyListState(
-                95,
-                5
-            )
+            rememberLazyListState(95, 5)
         }
     }
 
     /**
-     * Creates a Row/Column with a viewport of 100 px, containing 100 items each 21 px in size.
-     * The items have a text with their index (ASC), and where the viewport starts is determined
-     * by the given [lambda][rememberLazyListState]. All properties from [config] are applied.
-     * The viewport has padding around it to make sure scroll distance doesn't include padding.
+     * Creates a Row/Column with a viewport of 100 px, containing 100 items each 21 px in size. The
+     * items have a text with their index (ASC), and where the viewport starts is determined by the
+     * given [lambda][rememberLazyListState]. All properties from [config] are applied. The viewport
+     * has padding around it to make sure scroll distance doesn't include padding.
      */
     private fun createScrollableContent(rememberLazyListState: @Composable () -> LazyListState) {
         rule.setContent {
diff --git a/compose/foundation/foundation/integration-tests/lazy-tests/src/androidTest/kotlin/androidx/compose/foundation/lazy/list/LazyScrollTest.kt b/compose/foundation/foundation/integration-tests/lazy-tests/src/androidTest/kotlin/androidx/compose/foundation/lazy/list/LazyScrollTest.kt
index 4733ee5..9701bd0 100644
--- a/compose/foundation/foundation/integration-tests/lazy-tests/src/androidTest/kotlin/androidx/compose/foundation/lazy/list/LazyScrollTest.kt
+++ b/compose/foundation/foundation/integration-tests/lazy-tests/src/androidTest/kotlin/androidx/compose/foundation/lazy/list/LazyScrollTest.kt
@@ -60,8 +60,7 @@
 @MediumTest
 @RunWith(Parameterized::class)
 class LazyScrollTest(private val orientation: Orientation) {
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
     private val lazyListTag = "LazyList"
 
@@ -78,9 +77,7 @@
 
     @Before
     fun setup() {
-        with(rule.density) {
-            itemSizeDp = itemSizePx.toDp()
-        }
+        with(rule.density) { itemSizeDp = itemSizePx.toDp() }
     }
 
     private fun testScroll(
@@ -96,9 +93,7 @@
                 TestContent(spacingPx.toDp(), containerSizePx.toDp(), afterContentPaddingPx.toDp())
             }
         }
-        runBlocking {
-            assertBlock()
-        }
+        runBlocking { assertBlock() }
     }
 
     @Test
@@ -109,27 +104,21 @@
 
     @Test
     fun scrollToItem() = testScroll {
-        withContext(Dispatchers.Main + AutoTestFrameClock()) {
-            state.scrollToItem(3)
-        }
+        withContext(Dispatchers.Main + AutoTestFrameClock()) { state.scrollToItem(3) }
         assertThat(state.firstVisibleItemIndex).isEqualTo(3)
         assertThat(state.firstVisibleItemScrollOffset).isEqualTo(0)
     }
 
     @Test
     fun scrollToItemWithOffset() = testScroll {
-        withContext(Dispatchers.Main + AutoTestFrameClock()) {
-            state.scrollToItem(3, 10)
-        }
+        withContext(Dispatchers.Main + AutoTestFrameClock()) { state.scrollToItem(3, 10) }
         assertThat(state.firstVisibleItemIndex).isEqualTo(3)
         assertThat(state.firstVisibleItemScrollOffset).isEqualTo(10)
     }
 
     @Test
     fun scrollToItemWithNegativeOffset() = testScroll {
-        withContext(Dispatchers.Main + AutoTestFrameClock()) {
-            state.scrollToItem(3, -10)
-        }
+        withContext(Dispatchers.Main + AutoTestFrameClock()) { state.scrollToItem(3, -10) }
         assertThat(state.firstVisibleItemIndex).isEqualTo(2)
         val item3Offset = state.layoutInfo.visibleItemsInfo.first { it.index == 3 }.offset
         assertThat(item3Offset).isEqualTo(10)
@@ -155,9 +144,7 @@
 
     @Test
     fun scrollToItemWithIndexLargerThanItemsCount() = testScroll {
-        withContext(Dispatchers.Main + AutoTestFrameClock()) {
-            state.scrollToItem(itemsCount + 2)
-        }
+        withContext(Dispatchers.Main + AutoTestFrameClock()) { state.scrollToItem(itemsCount + 2) }
         assertThat(state.firstVisibleItemIndex).isEqualTo(itemsCount - 3)
     }
 
@@ -177,27 +164,21 @@
 
     @Test
     fun animateScrollToItem() = testScroll {
-        withContext(Dispatchers.Main + AutoTestFrameClock()) {
-            state.animateScrollToItem(5, 10)
-        }
+        withContext(Dispatchers.Main + AutoTestFrameClock()) { state.animateScrollToItem(5, 10) }
         assertThat(state.firstVisibleItemIndex).isEqualTo(5)
         assertThat(state.firstVisibleItemScrollOffset).isEqualTo(10)
     }
 
     @Test
     fun animateScrollToItemWithOffset() = testScroll {
-        withContext(Dispatchers.Main + AutoTestFrameClock()) {
-            state.animateScrollToItem(3, 10)
-        }
+        withContext(Dispatchers.Main + AutoTestFrameClock()) { state.animateScrollToItem(3, 10) }
         assertThat(state.firstVisibleItemIndex).isEqualTo(3)
         assertThat(state.firstVisibleItemScrollOffset).isEqualTo(10)
     }
 
     @Test
     fun animateScrollToItemWithNegativeOffset() = testScroll {
-        withContext(Dispatchers.Main + AutoTestFrameClock()) {
-            state.animateScrollToItem(3, -10)
-        }
+        withContext(Dispatchers.Main + AutoTestFrameClock()) { state.animateScrollToItem(3, -10) }
         assertThat(state.firstVisibleItemIndex).isEqualTo(2)
         val item3Offset = state.layoutInfo.visibleItemsInfo.first { it.index == 3 }.offset
         assertThat(item3Offset).isEqualTo(10)
@@ -231,58 +212,58 @@
 
     @Test
     fun animateScrollBySemantics() = testScroll {
-        val scrollAxisKey = if (vertical) {
-            SemanticsProperties.VerticalScrollAxisRange
-        } else {
-            SemanticsProperties.HorizontalScrollAxisRange
-        }
+        val scrollAxisKey =
+            if (vertical) {
+                SemanticsProperties.VerticalScrollAxisRange
+            } else {
+                SemanticsProperties.HorizontalScrollAxisRange
+            }
 
-        withContext(Dispatchers.Main + AutoTestFrameClock()) {
-            state.animateScrollBy(1f)
-        }
+        withContext(Dispatchers.Main + AutoTestFrameClock()) { state.animateScrollBy(1f) }
 
         var firstScrollAmount = 0
-        rule.onNodeWithTag(lazyListTag)
-            .assert(SemanticsMatcher("Scroll amount is nonzero") {
-                firstScrollAmount = it.config.get(scrollAxisKey).value().toInt()
-                firstScrollAmount != 0
-            })
-            .assert(SemanticsMatcher("Max scroll value is higher than scroll amount") {
-                with(it.config.get(scrollAxisKey)) {
-                    value().toInt() < maxValue().toInt()
+        rule
+            .onNodeWithTag(lazyListTag)
+            .assert(
+                SemanticsMatcher("Scroll amount is nonzero") {
+                    firstScrollAmount = it.config.get(scrollAxisKey).value().toInt()
+                    firstScrollAmount != 0
                 }
-            })
-
-        withContext(Dispatchers.Main + AutoTestFrameClock()) {
-            state.animateScrollBy(1f)
-        }
-
-        rule.onNodeWithTag(lazyListTag)
-            .assert(SemanticsMatcher("Second scroll amount is different from the first") {
-                it.config.get(scrollAxisKey).value().toInt() != firstScrollAmount
-            })
-            .assert(SemanticsMatcher("Max scroll value is higher than scroll amount") {
-                with(it.config.get(scrollAxisKey)) {
-                    value().toInt() < maxValue().toInt()
+            )
+            .assert(
+                SemanticsMatcher("Max scroll value is higher than scroll amount") {
+                    with(it.config.get(scrollAxisKey)) { value().toInt() < maxValue().toInt() }
                 }
-            })
+            )
 
-        withContext(Dispatchers.Main + AutoTestFrameClock()) {
-            state.animateScrollBy(10_000f)
-        }
+        withContext(Dispatchers.Main + AutoTestFrameClock()) { state.animateScrollBy(1f) }
 
-        rule.onNodeWithTag(lazyListTag)
-            .assert(SemanticsMatcher("Max scroll value is equal to scroll amount") {
-                with(it.config.get(scrollAxisKey)) {
-                    value().toInt() == maxValue().toInt()
+        rule
+            .onNodeWithTag(lazyListTag)
+            .assert(
+                SemanticsMatcher("Second scroll amount is different from the first") {
+                    it.config.get(scrollAxisKey).value().toInt() != firstScrollAmount
                 }
-            })
+            )
+            .assert(
+                SemanticsMatcher("Max scroll value is higher than scroll amount") {
+                    with(it.config.get(scrollAxisKey)) { value().toInt() < maxValue().toInt() }
+                }
+            )
+
+        withContext(Dispatchers.Main + AutoTestFrameClock()) { state.animateScrollBy(10_000f) }
+
+        rule
+            .onNodeWithTag(lazyListTag)
+            .assert(
+                SemanticsMatcher("Max scroll value is equal to scroll amount") {
+                    with(it.config.get(scrollAxisKey)) { value().toInt() == maxValue().toInt() }
+                }
+            )
     }
 
     @Test
-    fun animatePerFrameForwardToVisibleItem() = testScroll {
-        assertSpringAnimation(toIndex = 2)
-    }
+    fun animatePerFrameForwardToVisibleItem() = testScroll { assertSpringAnimation(toIndex = 2) }
 
     @Test
     fun animatePerFrameForwardToVisibleItemWithOffset() = testScroll {
@@ -290,9 +271,7 @@
     }
 
     @Test
-    fun animatePerFrameForwardToNotVisibleItem() = testScroll {
-        assertSpringAnimation(toIndex = 8)
-    }
+    fun animatePerFrameForwardToNotVisibleItem() = testScroll { assertSpringAnimation(toIndex = 8) }
 
     @Test
     fun animatePerFrameForwardToNotVisibleItemWithOffset() = testScroll {
@@ -300,9 +279,7 @@
     }
 
     @Test
-    fun animatePerFrameBackward() = testScroll {
-        assertSpringAnimation(toIndex = 1, fromIndex = 6)
-    }
+    fun animatePerFrameBackward() = testScroll { assertSpringAnimation(toIndex = 1, fromIndex = 6) }
 
     @Test
     fun animatePerFrameBackwardWithOffset() = testScroll {
@@ -342,9 +319,7 @@
 
     @Test
     fun canScrollBackward() = testScroll {
-        withContext(Dispatchers.Main + AutoTestFrameClock()) {
-            state.scrollToItem(itemsCount)
-        }
+        withContext(Dispatchers.Main + AutoTestFrameClock()) { state.scrollToItem(itemsCount) }
         assertThat(state.firstVisibleItemIndex).isEqualTo(itemsCount - 3)
         assertThat(state.canScrollForward).isFalse()
         assertThat(state.canScrollBackward).isTrue()
@@ -352,112 +327,112 @@
 
     @Test
     fun canScrollForwardAndBackward() = testScroll {
-        withContext(Dispatchers.Main + AutoTestFrameClock()) {
-            state.scrollToItem(1)
-        }
+        withContext(Dispatchers.Main + AutoTestFrameClock()) { state.scrollToItem(1) }
         assertThat(state.firstVisibleItemIndex).isEqualTo(1)
         assertThat(state.canScrollForward).isTrue()
         assertThat(state.canScrollBackward).isTrue()
     }
 
     @Test
-    fun canScrollForwardAndBackward_afterSmallScrollFromStart() = testScroll(
-        containerSizePx = (itemSizePx * 1.5f).roundToInt()
-    ) {
-        val delta = (itemSizePx / 3f).roundToInt()
-        withContext(Dispatchers.Main + AutoTestFrameClock()) {
-            // small enough scroll to not cause any new items to be composed or old ones disposed.
-            state.scrollBy(delta.toFloat())
+    fun canScrollForwardAndBackward_afterSmallScrollFromStart() =
+        testScroll(containerSizePx = (itemSizePx * 1.5f).roundToInt()) {
+            val delta = (itemSizePx / 3f).roundToInt()
+            withContext(Dispatchers.Main + AutoTestFrameClock()) {
+                // small enough scroll to not cause any new items to be composed or old ones
+                // disposed.
+                state.scrollBy(delta.toFloat())
+            }
+            rule.runOnIdle {
+                assertThat(state.firstVisibleItemScrollOffset).isEqualTo(delta)
+                assertThat(state.canScrollForward).isTrue()
+                assertThat(state.canScrollBackward).isTrue()
+            }
+            // and scroll back to start
+            withContext(Dispatchers.Main + AutoTestFrameClock()) {
+                state.scrollBy(-delta.toFloat())
+            }
+            rule.runOnIdle {
+                assertThat(state.canScrollForward).isTrue()
+                assertThat(state.canScrollBackward).isFalse()
+            }
         }
-        rule.runOnIdle {
-            assertThat(state.firstVisibleItemScrollOffset).isEqualTo(delta)
-            assertThat(state.canScrollForward).isTrue()
-            assertThat(state.canScrollBackward).isTrue()
-        }
-        // and scroll back to start
-        withContext(Dispatchers.Main + AutoTestFrameClock()) {
-            state.scrollBy(-delta.toFloat())
-        }
-        rule.runOnIdle {
-            assertThat(state.canScrollForward).isTrue()
-            assertThat(state.canScrollBackward).isFalse()
-        }
-    }
 
     @Test
-    fun canScrollForwardAndBackward_afterSmallScrollFromEnd() = testScroll(
-        containerSizePx = (itemSizePx * 1.5f).roundToInt()
-    ) {
-        val delta = -(itemSizePx / 3f).roundToInt()
-        withContext(Dispatchers.Main + AutoTestFrameClock()) {
-            // scroll to the end of the list.
-            state.scrollToItem(itemsCount)
-            // small enough scroll to not cause any new items to be composed or old ones disposed.
-            state.scrollBy(delta.toFloat())
+    fun canScrollForwardAndBackward_afterSmallScrollFromEnd() =
+        testScroll(containerSizePx = (itemSizePx * 1.5f).roundToInt()) {
+            val delta = -(itemSizePx / 3f).roundToInt()
+            withContext(Dispatchers.Main + AutoTestFrameClock()) {
+                // scroll to the end of the list.
+                state.scrollToItem(itemsCount)
+                // small enough scroll to not cause any new items to be composed or old ones
+                // disposed.
+                state.scrollBy(delta.toFloat())
+            }
+            rule.runOnIdle {
+                assertThat(state.canScrollForward).isTrue()
+                assertThat(state.canScrollBackward).isTrue()
+            }
+            // and scroll back to the end
+            withContext(Dispatchers.Main + AutoTestFrameClock()) {
+                state.scrollBy(-delta.toFloat())
+            }
+            rule.runOnIdle {
+                assertThat(state.canScrollForward).isFalse()
+                assertThat(state.canScrollBackward).isTrue()
+            }
         }
-        rule.runOnIdle {
-            assertThat(state.canScrollForward).isTrue()
-            assertThat(state.canScrollBackward).isTrue()
-        }
-        // and scroll back to the end
-        withContext(Dispatchers.Main + AutoTestFrameClock()) {
-            state.scrollBy(-delta.toFloat())
-        }
-        rule.runOnIdle {
-            assertThat(state.canScrollForward).isFalse()
-            assertThat(state.canScrollBackward).isTrue()
-        }
-    }
 
     @Test
-    fun canScrollForwardAndBackward_afterSmallScrollFromEnd_withContentPadding() = testScroll(
-        containerSizePx = (itemSizePx * 1.5f).roundToInt(),
-        afterContentPaddingPx = 2,
-    ) {
-        val delta = -(itemSizePx / 3f).roundToInt()
-        withContext(Dispatchers.Main + AutoTestFrameClock()) {
-            // scroll to the end of the list.
-            state.scrollToItem(itemsCount)
+    fun canScrollForwardAndBackward_afterSmallScrollFromEnd_withContentPadding() =
+        testScroll(
+            containerSizePx = (itemSizePx * 1.5f).roundToInt(),
+            afterContentPaddingPx = 2,
+        ) {
+            val delta = -(itemSizePx / 3f).roundToInt()
+            withContext(Dispatchers.Main + AutoTestFrameClock()) {
+                // scroll to the end of the list.
+                state.scrollToItem(itemsCount)
 
-            assertThat(state.canScrollForward).isFalse()
-            assertThat(state.canScrollBackward).isTrue()
+                assertThat(state.canScrollForward).isFalse()
+                assertThat(state.canScrollBackward).isTrue()
 
-            // small enough scroll to not cause any new items to be composed or old ones disposed.
-            state.scrollBy(delta.toFloat())
+                // small enough scroll to not cause any new items to be composed or old ones
+                // disposed.
+                state.scrollBy(delta.toFloat())
+            }
+            rule.runOnIdle {
+                assertThat(state.canScrollForward).isTrue()
+                assertThat(state.canScrollBackward).isTrue()
+            }
+            // and scroll back to the end
+            withContext(Dispatchers.Main + AutoTestFrameClock()) {
+                state.scrollBy(-delta.toFloat())
+            }
+            rule.runOnIdle {
+                assertThat(state.canScrollForward).isFalse()
+                assertThat(state.canScrollBackward).isTrue()
+            }
         }
-        rule.runOnIdle {
-            assertThat(state.canScrollForward).isTrue()
-            assertThat(state.canScrollBackward).isTrue()
-        }
-        // and scroll back to the end
-        withContext(Dispatchers.Main + AutoTestFrameClock()) {
-            state.scrollBy(-delta.toFloat())
-        }
-        rule.runOnIdle {
-            assertThat(state.canScrollForward).isFalse()
-            assertThat(state.canScrollBackward).isTrue()
-        }
-    }
 
     @Test
-    fun animatePerFrameWithSpacing() = testScroll(spacingPx = 10) {
-        assertSpringAnimation(toIndex = 8, spacingPx = 10)
-    }
+    fun animatePerFrameWithSpacing() =
+        testScroll(spacingPx = 10) { assertSpringAnimation(toIndex = 8, spacingPx = 10) }
 
     @Test
-    fun animatePerFrameWithNegativeSpacing() = testScroll(spacingPx = -10) {
-        assertSpringAnimation(toIndex = 8, spacingPx = -10)
-    }
+    fun animatePerFrameWithNegativeSpacing() =
+        testScroll(spacingPx = -10) { assertSpringAnimation(toIndex = 8, spacingPx = -10) }
 
     @Test
-    fun animatePerFrameBackwardWithSpacing() = testScroll(spacingPx = 10) {
-        assertSpringAnimation(toIndex = 1, fromIndex = 6, spacingPx = 10)
-    }
+    fun animatePerFrameBackwardWithSpacing() =
+        testScroll(spacingPx = 10) {
+            assertSpringAnimation(toIndex = 1, fromIndex = 6, spacingPx = 10)
+        }
 
     @Test
-    fun animatePerFrameBackwardWithNegativeSpacing() = testScroll(spacingPx = -10) {
-        assertSpringAnimation(toIndex = 1, fromIndex = 6, spacingPx = -10)
-    }
+    fun animatePerFrameBackwardWithNegativeSpacing() =
+        testScroll(spacingPx = -10) {
+            assertSpringAnimation(toIndex = 1, fromIndex = 6, spacingPx = -10)
+        }
 
     private fun assertSpringAnimation(
         toIndex: Int,
@@ -467,11 +442,7 @@
         spacingPx: Int = 0
     ) {
         if (fromIndex != 0 || fromOffset != 0) {
-            rule.runOnIdle {
-                runBlocking {
-                    state.scrollToItem(fromIndex, fromOffset)
-                }
-            }
+            rule.runOnIdle { runBlocking { state.scrollToItem(fromIndex, fromOffset) } }
         }
         rule.waitForIdle()
 
@@ -480,9 +451,7 @@
 
         rule.mainClock.autoAdvance = false
 
-        scope.launch {
-            state.animateScrollToItem(toIndex, toOffset)
-        }
+        scope.launch { state.animateScrollToItem(toIndex, toOffset) }
 
         while (!state.isScrollInProgress) {
             Thread.sleep(5)
@@ -499,15 +468,16 @@
         var expectedTime = rule.mainClock.currentTime
         for (i in 0..duration step FrameDuration) {
             val nanosTime = TimeUnit.MILLISECONDS.toNanos(i)
-            val expectedValue =
-                spec.getValueFromNanos(nanosTime, startOffset, endOffset, 0f)
-            val actualValue = (
-                state.firstVisibleItemIndex * itemSizeWSpacing + state.firstVisibleItemScrollOffset
-                )
+            val expectedValue = spec.getValueFromNanos(nanosTime, startOffset, endOffset, 0f)
+            val actualValue =
+                (state.firstVisibleItemIndex * itemSizeWSpacing +
+                    state.firstVisibleItemScrollOffset)
             assertWithMessage(
-                "On animation frame at $i index=${state.firstVisibleItemIndex} " +
-                    "offset=${state.firstVisibleItemScrollOffset} expectedValue=$expectedValue"
-            ).that(actualValue).isEqualTo(expectedValue.roundToInt(), tolerance = 1)
+                    "On animation frame at $i index=${state.firstVisibleItemIndex} " +
+                        "offset=${state.firstVisibleItemScrollOffset} expectedValue=$expectedValue"
+                )
+                .that(actualValue)
+                .isEqualTo(expectedValue.roundToInt(), tolerance = 1)
 
             rule.mainClock.advanceTimeBy(FrameDuration)
             expectedTime += FrameDuration
@@ -527,9 +497,7 @@
                 contentPadding = PaddingValues(bottom = afterContentPaddingDp),
                 verticalArrangement = Arrangement.spacedBy(spacingDp)
             ) {
-                items(itemsCount) {
-                    ItemContent()
-                }
+                items(itemsCount) { ItemContent() }
             }
         } else {
             LazyRow(
@@ -538,20 +506,19 @@
                 contentPadding = PaddingValues(end = afterContentPaddingDp),
                 horizontalArrangement = Arrangement.spacedBy(spacingDp)
             ) {
-                items(itemsCount) {
-                    ItemContent()
-                }
+                items(itemsCount) { ItemContent() }
             }
         }
     }
 
     @Composable
     private fun ItemContent() {
-        val modifier = if (vertical) {
-            Modifier.height(itemSizeDp)
-        } else {
-            Modifier.width(itemSizeDp)
-        }
+        val modifier =
+            if (vertical) {
+                Modifier.height(itemSizeDp)
+            } else {
+                Modifier.width(itemSizeDp)
+            }
         Spacer(modifier)
     }
 
diff --git a/compose/foundation/foundation/integration-tests/lazy-tests/src/androidTest/kotlin/androidx/compose/foundation/lazy/list/LazySemanticsTest.kt b/compose/foundation/foundation/integration-tests/lazy-tests/src/androidTest/kotlin/androidx/compose/foundation/lazy/list/LazySemanticsTest.kt
index e7fc7c84..473a399 100644
--- a/compose/foundation/foundation/integration-tests/lazy-tests/src/androidTest/kotlin/androidx/compose/foundation/lazy/list/LazySemanticsTest.kt
+++ b/compose/foundation/foundation/integration-tests/lazy-tests/src/androidTest/kotlin/androidx/compose/foundation/lazy/list/LazySemanticsTest.kt
@@ -47,11 +47,9 @@
  * - GetIndexForKey
  * - ScrollToIndex
  *
- * GetIndexForKey:
- * Create a lazy list, iterate over all indices, verify key of each of them
+ * GetIndexForKey: Create a lazy list, iterate over all indices, verify key of each of them
  *
- * ScrollToIndex:
- * Create a lazy list, scroll to an item off screen, verify shown items
+ * ScrollToIndex: Create a lazy list, scroll to an item off screen, verify shown items
  *
  * All tests performed in [runTest], scenarios set up in the test methods.
  */
@@ -63,20 +61,16 @@
     private val LazyListModifier = Modifier.testTag(LazyListTag).requiredSize(100.dp)
 
     private fun tag(index: Int): String = "tag_$index"
+
     private fun key(index: Int): String = "key_$index"
 
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
     @Test
     fun itemSemantics_column() {
         rule.setContent {
             LazyColumn(LazyListModifier) {
-                repeat(N) {
-                    item(key = key(it)) {
-                        SpacerInColumn(it)
-                    }
-                }
+                repeat(N) { item(key = key(it)) { SpacerInColumn(it) } }
             }
         }
         runTest()
@@ -86,9 +80,7 @@
     fun itemsSemantics_column() {
         rule.setContent {
             LazyColumn(LazyListModifier) {
-                items(items = List(N) { it }, key = { key(it) }) {
-                    SpacerInColumn(it)
-                }
+                items(items = List(N) { it }, key = { key(it) }) { SpacerInColumn(it) }
             }
         }
         runTest()
@@ -97,13 +89,7 @@
     @Test
     fun itemSemantics_row() {
         rule.setContent {
-            LazyRow(LazyListModifier) {
-                repeat(N) {
-                    item(key = key(it)) {
-                        SpacerInRow(it)
-                    }
-                }
-            }
+            LazyRow(LazyListModifier) { repeat(N) { item(key = key(it)) { SpacerInRow(it) } } }
         }
         runTest()
     }
@@ -112,9 +98,7 @@
     fun itemsSemantics_row() {
         rule.setContent {
             LazyRow(LazyListModifier) {
-                items(items = List(N) { it }, key = { key(it) }) {
-                    SpacerInRow(it)
-                }
+                items(items = List(N) { it }, key = { key(it) }) { SpacerInRow(it) }
             }
         }
         runTest()
@@ -124,16 +108,19 @@
         checkViewport(firstExpectedItem = 0, lastExpectedItem = 3)
 
         // Verify IndexForKey
-        rule.onNodeWithTag(LazyListTag).assert(
-            SemanticsMatcher.keyIsDefined(IndexForKey).and(
-                SemanticsMatcher("keys match") { node ->
-                    val actualIndex = node.config.getOrNull(IndexForKey)!!
-                    (0 until N).all { expectedIndex ->
-                        expectedIndex == actualIndex.invoke(key(expectedIndex))
-                    }
-                }
+        rule
+            .onNodeWithTag(LazyListTag)
+            .assert(
+                SemanticsMatcher.keyIsDefined(IndexForKey)
+                    .and(
+                        SemanticsMatcher("keys match") { node ->
+                            val actualIndex = node.config.getOrNull(IndexForKey)!!
+                            (0 until N).all { expectedIndex ->
+                                expectedIndex == actualIndex.invoke(key(expectedIndex))
+                            }
+                        }
+                    )
             )
-        )
 
         // Verify ScrollToIndex
         rule.onNodeWithTag(LazyListTag).assert(SemanticsMatcher.keyIsDefined(ScrollToIndex))
@@ -146,20 +133,16 @@
     }
 
     private fun invokeScrollToIndex(targetIndex: Int) {
-        val node = rule.onNodeWithTag(LazyListTag)
-            .fetchSemanticsNode("Failed: invoke ScrollToIndex")
-        rule.runOnUiThread {
-            node.config[ScrollToIndex].action!!.invoke(targetIndex)
-        }
+        val node =
+            rule.onNodeWithTag(LazyListTag).fetchSemanticsNode("Failed: invoke ScrollToIndex")
+        rule.runOnUiThread { node.config[ScrollToIndex].action!!.invoke(targetIndex) }
     }
 
     private fun checkViewport(firstExpectedItem: Int, lastExpectedItem: Int) {
         if (firstExpectedItem > 0) {
             rule.onNodeWithTag(tag(firstExpectedItem - 1)).assertDoesNotExist()
         }
-        (firstExpectedItem..lastExpectedItem).forEach {
-            rule.onNodeWithTag(tag(it)).assertExists()
-        }
+        (firstExpectedItem..lastExpectedItem).forEach { rule.onNodeWithTag(tag(it)).assertExists() }
         if (firstExpectedItem < N - 1) {
             rule.onNodeWithTag(tag(lastExpectedItem + 1)).assertDoesNotExist()
         }
diff --git a/compose/foundation/foundation/integration-tests/lazy-tests/src/androidTest/kotlin/androidx/compose/foundation/lazy/staggeredgrid/BaseLazyStaggeredGridWithOrientation.kt b/compose/foundation/foundation/integration-tests/lazy-tests/src/androidTest/kotlin/androidx/compose/foundation/lazy/staggeredgrid/BaseLazyStaggeredGridWithOrientation.kt
index 10931e1..aeee825 100644
--- a/compose/foundation/foundation/integration-tests/lazy-tests/src/androidTest/kotlin/androidx/compose/foundation/lazy/staggeredgrid/BaseLazyStaggeredGridWithOrientation.kt
+++ b/compose/foundation/foundation/integration-tests/lazy-tests/src/androidTest/kotlin/androidx/compose/foundation/lazy/staggeredgrid/BaseLazyStaggeredGridWithOrientation.kt
@@ -34,9 +34,8 @@
 import kotlinx.coroutines.runBlocking
 
 @OptIn(ExperimentalFoundationApi::class)
-open class BaseLazyStaggeredGridWithOrientation(
-    private val orientation: Orientation
-) : BaseLazyLayoutTestWithOrientation(orientation) {
+open class BaseLazyStaggeredGridWithOrientation(private val orientation: Orientation) :
+    BaseLazyLayoutTestWithOrientation(orientation) {
 
     internal fun LazyStaggeredGridState.scrollBy(offset: Dp) {
         runBlocking(Dispatchers.Main + AutoTestFrameClock()) {
@@ -45,9 +44,7 @@
     }
 
     internal fun LazyStaggeredGridState.scrollTo(index: Int) {
-        runBlocking(Dispatchers.Main + AutoTestFrameClock()) {
-            scrollToItem(index)
-        }
+        runBlocking(Dispatchers.Main + AutoTestFrameClock()) { scrollToItem(index) }
     }
 
     @Composable
diff --git a/compose/foundation/foundation/integration-tests/lazy-tests/src/androidTest/kotlin/androidx/compose/foundation/lazy/staggeredgrid/LazyStaggeredGridAnimatedScrollTest.kt b/compose/foundation/foundation/integration-tests/lazy-tests/src/androidTest/kotlin/androidx/compose/foundation/lazy/staggeredgrid/LazyStaggeredGridAnimatedScrollTest.kt
index f5e5bb5..ecaf915 100644
--- a/compose/foundation/foundation/integration-tests/lazy-tests/src/androidTest/kotlin/androidx/compose/foundation/lazy/staggeredgrid/LazyStaggeredGridAnimatedScrollTest.kt
+++ b/compose/foundation/foundation/integration-tests/lazy-tests/src/androidTest/kotlin/androidx/compose/foundation/lazy/staggeredgrid/LazyStaggeredGridAnimatedScrollTest.kt
@@ -46,16 +46,16 @@
 @OptIn(ExperimentalFoundationApi::class)
 @MediumTest
 @RunWith(Parameterized::class)
-class LazyStaggeredGridAnimatedScrollTest(
-    orientation: Orientation
-) : BaseLazyStaggeredGridWithOrientation(orientation) {
+class LazyStaggeredGridAnimatedScrollTest(orientation: Orientation) :
+    BaseLazyStaggeredGridWithOrientation(orientation) {
     companion object {
         @JvmStatic
         @Parameterized.Parameters(name = "{0}")
-        fun initParameters(): Array<Any> = arrayOf(
-            Orientation.Vertical,
-            Orientation.Horizontal,
-        )
+        fun initParameters(): Array<Any> =
+            arrayOf(
+                Orientation.Vertical,
+                Orientation.Horizontal,
+            )
     }
 
     internal lateinit var state: LazyStaggeredGridState
@@ -66,9 +66,7 @@
 
     @Before
     fun setUp() {
-        itemSizeDp = with(rule.density) {
-            itemSizePx.toDp()
-        }
+        itemSizeDp = with(rule.density) { itemSizePx.toDp() }
     }
 
     private fun testScroll(spacingPx: Int = 0, assertBlock: suspend () -> Unit) {
@@ -78,9 +76,7 @@
             TestContent(with(rule.density) { spacingPx.toDp() })
         }
         rule.waitForIdle()
-        runBlocking {
-            assertBlock()
-        }
+        runBlocking { assertBlock() }
     }
 
     @Test
@@ -99,27 +95,21 @@
 
     @Test
     fun animateScrollToItem_positiveOffset() = testScroll {
-        withContext(Dispatchers.Main + AutoTestFrameClock()) {
-            state.animateScrollToItem(10, 10)
-        }
+        withContext(Dispatchers.Main + AutoTestFrameClock()) { state.animateScrollToItem(10, 10) }
         assertThat(state.firstVisibleItemIndex).isEqualTo(10)
         assertThat(state.firstVisibleItemScrollOffset).isEqualTo(10)
     }
 
     @Test
     fun animateScrollToItem_positiveOffset_largerThanItem() = testScroll {
-        withContext(Dispatchers.Main + AutoTestFrameClock()) {
-            state.animateScrollToItem(10, 150)
-        }
+        withContext(Dispatchers.Main + AutoTestFrameClock()) { state.animateScrollToItem(10, 150) }
         assertThat(state.firstVisibleItemIndex).isEqualTo(12)
         assertThat(state.firstVisibleItemScrollOffset).isEqualTo(50)
     }
 
     @Test
     fun animateScrollToItem_negativeOffset() = testScroll {
-        withContext(Dispatchers.Main + AutoTestFrameClock()) {
-            state.animateScrollToItem(10, -10)
-        }
+        withContext(Dispatchers.Main + AutoTestFrameClock()) { state.animateScrollToItem(10, -10) }
         assertThat(state.firstVisibleItemIndex).isEqualTo(8)
         assertThat(state.firstVisibleItemScrollOffset).isEqualTo(itemSizePx - 10)
     }
@@ -136,9 +126,7 @@
 
     @Test
     fun animateScrollToItem_afterLastItem() = testScroll {
-        runBlocking(Dispatchers.Main + AutoTestFrameClock()) {
-            state.animateScrollToItem(100)
-        }
+        runBlocking(Dispatchers.Main + AutoTestFrameClock()) { state.animateScrollToItem(100) }
         rule.waitForIdle()
         assertThat(state.firstVisibleItemIndex).isEqualTo(91)
         assertThat(state.firstVisibleItemScrollOffset).isEqualTo(0)
@@ -146,9 +134,7 @@
 
     @Test
     fun animateScrollToItem_toFullSpan() = testScroll {
-        runBlocking(Dispatchers.Main + AutoTestFrameClock()) {
-            state.animateScrollToItem(50, 10)
-        }
+        runBlocking(Dispatchers.Main + AutoTestFrameClock()) { state.animateScrollToItem(50, 10) }
         rule.waitForIdle()
         assertThat(state.firstVisibleItemIndex).isEqualTo(50)
         assertThat(state.firstVisibleItemScrollOffset).isEqualTo(10)
@@ -156,33 +142,23 @@
 
     @Test
     fun animateScrollToItem_toFullSpan_andBack() = testScroll {
-        runBlocking(Dispatchers.Main + AutoTestFrameClock()) {
-            state.animateScrollToItem(50, 10)
-        }
+        runBlocking(Dispatchers.Main + AutoTestFrameClock()) { state.animateScrollToItem(50, 10) }
         rule.waitForIdle()
 
-        runBlocking(Dispatchers.Main + AutoTestFrameClock()) {
-            state.animateScrollToItem(45, 0)
-        }
+        runBlocking(Dispatchers.Main + AutoTestFrameClock()) { state.animateScrollToItem(45, 0) }
 
         assertThat(state.firstVisibleItemIndex).isEqualTo(44)
         assertThat(state.firstVisibleItemScrollOffset).isEqualTo(0)
     }
 
-    @Test
-    fun animateScrollToItem_inBounds() = testScroll {
-        assertSpringAnimation(2)
-    }
+    @Test fun animateScrollToItem_inBounds() = testScroll { assertSpringAnimation(2) }
 
     @Test
     fun animateScrollToItem_inBounds_withOffset() = testScroll {
         assertSpringAnimation(2, itemSizePx / 2)
     }
 
-    @Test
-    fun animateScrollToItem_outOfBounds() = testScroll {
-        assertSpringAnimation(10)
-    }
+    @Test fun animateScrollToItem_outOfBounds() = testScroll { assertSpringAnimation(10) }
 
     @Test
     fun animateScrollToItem_firstItem() = testScroll {
@@ -215,24 +191,24 @@
     }
 
     @Test
-    fun animateScrollToItem_outOfBounds_withSpacing() = testScroll(spacingPx = 10) {
-        assertSpringAnimation(20, spacingPx = 10)
-    }
+    fun animateScrollToItem_outOfBounds_withSpacing() =
+        testScroll(spacingPx = 10) { assertSpringAnimation(20, spacingPx = 10) }
 
     @Test
-    fun animateScrollToItem_outOfBounds_withNegativeSpacing() = testScroll(spacingPx = -10) {
-        assertSpringAnimation(20, spacingPx = -10)
-    }
+    fun animateScrollToItem_outOfBounds_withNegativeSpacing() =
+        testScroll(spacingPx = -10) { assertSpringAnimation(20, spacingPx = -10) }
 
     @Test
-    fun animateScrollToItem_backwards_withSpacing() = testScroll(spacingPx = 10) {
-        assertSpringAnimation(toIndex = 0, fromIndex = 20, spacingPx = 10)
-    }
+    fun animateScrollToItem_backwards_withSpacing() =
+        testScroll(spacingPx = 10) {
+            assertSpringAnimation(toIndex = 0, fromIndex = 20, spacingPx = 10)
+        }
 
     @Test
-    fun animateScrollToItem_backwards_withNegativeSpacing() = testScroll(spacingPx = -10) {
-        assertSpringAnimation(toIndex = 0, fromIndex = 20, spacingPx = -10)
-    }
+    fun animateScrollToItem_backwards_withNegativeSpacing() =
+        testScroll(spacingPx = -10) {
+            assertSpringAnimation(toIndex = 0, fromIndex = 20, spacingPx = -10)
+        }
 
     private fun assertSpringAnimation(
         toIndex: Int,
@@ -242,11 +218,7 @@
         spacingPx: Int = 0
     ) {
         if (fromIndex != 0 || fromOffset != 0) {
-            rule.runOnIdle {
-                runBlocking {
-                    state.scrollToItem(fromIndex, fromOffset)
-                }
-            }
+            rule.runOnIdle { runBlocking { state.scrollToItem(fromIndex, fromOffset) } }
         }
         rule.waitForIdle()
 
@@ -255,9 +227,7 @@
 
         rule.mainClock.autoAdvance = false
 
-        scope.launch {
-            state.animateScrollToItem(toIndex, toOffset)
-        }
+        scope.launch { state.animateScrollToItem(toIndex, toOffset) }
 
         while (!state.isScrollInProgress) {
             Thread.sleep(5)
@@ -276,15 +246,16 @@
         val frameDuration = 16L
         for (i in 0..duration step frameDuration) {
             val nanosTime = TimeUnit.MILLISECONDS.toNanos(i)
-            val expectedValue =
-                spec.getValueFromNanos(nanosTime, startOffset, endOffset, 0f)
+            val expectedValue = spec.getValueFromNanos(nanosTime, startOffset, endOffset, 0f)
             val actualValue =
                 (state.firstVisibleItemIndex / 2 * itemSizeWSpacing +
                     state.firstVisibleItemScrollOffset)
             assertWithMessage(
-                "On animation frame at ${i}ms index=${state.firstVisibleItemIndex} " +
-                    "offset=${state.firstVisibleItemScrollOffset} expectedValue=$expectedValue"
-            ).that(actualValue).isEqualTo(expectedValue.roundToInt(), tolerance = 1)
+                    "On animation frame at ${i}ms index=${state.firstVisibleItemIndex} " +
+                        "offset=${state.firstVisibleItemScrollOffset} expectedValue=$expectedValue"
+                )
+                .that(actualValue)
+                .isEqualTo(expectedValue.roundToInt(), tolerance = 1)
 
             rule.mainClock.advanceTimeBy(frameDuration)
             expectedTime += frameDuration
@@ -307,19 +278,11 @@
                 count = 100,
                 span = {
                     // mark a span to check scroll through
-                    if (it == 50)
-                        StaggeredGridItemSpan.FullLine
-                    else
-                        StaggeredGridItemSpan.SingleLane
+                    if (it == 50) StaggeredGridItemSpan.FullLine
+                    else StaggeredGridItemSpan.SingleLane
                 }
             ) {
-                BasicText(
-                    "$it",
-                    Modifier
-                        .mainAxisSize(itemSizeDp)
-                        .testTag("$it")
-                        .debugBorder()
-                )
+                BasicText("$it", Modifier.mainAxisSize(itemSizeDp).testTag("$it").debugBorder())
             }
         }
     }
diff --git a/compose/foundation/foundation/integration-tests/lazy-tests/src/androidTest/kotlin/androidx/compose/foundation/lazy/staggeredgrid/LazyStaggeredGridArrangementsTest.kt b/compose/foundation/foundation/integration-tests/lazy-tests/src/androidTest/kotlin/androidx/compose/foundation/lazy/staggeredgrid/LazyStaggeredGridArrangementsTest.kt
index 01f2c1c..d99f7d4 100644
--- a/compose/foundation/foundation/integration-tests/lazy-tests/src/androidTest/kotlin/androidx/compose/foundation/lazy/staggeredgrid/LazyStaggeredGridArrangementsTest.kt
+++ b/compose/foundation/foundation/integration-tests/lazy-tests/src/androidTest/kotlin/androidx/compose/foundation/lazy/staggeredgrid/LazyStaggeredGridArrangementsTest.kt
@@ -69,17 +69,17 @@
 
 @MediumTest
 @RunWith(Parameterized::class)
-class LazyStaggeredGridArrangementsTest(
-    orientation: Orientation
-) : BaseLazyStaggeredGridWithOrientation(orientation) {
+class LazyStaggeredGridArrangementsTest(orientation: Orientation) :
+    BaseLazyStaggeredGridWithOrientation(orientation) {
 
     companion object {
         @JvmStatic
         @Parameterized.Parameters(name = "{0}")
-        fun initParameters(): Array<Any> = arrayOf(
-            Orientation.Vertical,
-            Orientation.Horizontal,
-        )
+        fun initParameters(): Array<Any> =
+            arrayOf(
+                Orientation.Vertical,
+                Orientation.Horizontal,
+            )
 
         private const val LazyStaggeredGrid = "Lazy"
     }
@@ -91,9 +91,7 @@
 
     @Before
     fun setUp() {
-        with(rule.density) {
-            itemSizeDp = itemSizePx.toDp()
-        }
+        with(rule.density) { itemSizeDp = itemSizePx.toDp() }
     }
 
     @Test
@@ -102,41 +100,42 @@
         rule.setContent {
             LazyStaggeredGrid(
                 lanes = 2,
-                modifier = Modifier
-                    .testTag(LazyStaggeredGrid)
-                    .axisSize(itemSizeDp * 3, itemSizeDp * 5),
+                modifier =
+                    Modifier.testTag(LazyStaggeredGrid).axisSize(itemSizeDp * 3, itemSizeDp * 5),
                 state = state,
                 mainAxisSpacing = itemSizeDp,
                 crossAxisArrangement = Arrangement.spacedBy(itemSizeDp / 2)
             ) {
-                items(100) {
-                    Spacer(Modifier.testTag("$it").mainAxisSize(itemSizeDp))
-                }
+                items(100) { Spacer(Modifier.testTag("$it").mainAxisSize(itemSizeDp)) }
             }
         }
 
         val crossAxisSizeDp = (itemSizeDp * 2.5f) / 2
         val spacing = itemSizeDp / 2
 
-        rule.onNodeWithTag("0")
+        rule
+            .onNodeWithTag("0")
             .assertMainAxisStartPositionInRootIsEqualTo(0.dp)
             .assertMainAxisSizeIsEqualTo(itemSizeDp)
             .assertCrossAxisStartPositionInRootIsEqualTo(0.dp)
             .assertCrossAxisSizeIsEqualTo(crossAxisSizeDp)
 
-        rule.onNodeWithTag("1")
+        rule
+            .onNodeWithTag("1")
             .assertMainAxisStartPositionInRootIsEqualTo(0.dp)
             .assertMainAxisSizeIsEqualTo(itemSizeDp)
             .assertCrossAxisStartPositionInRootIsEqualTo(crossAxisSizeDp + spacing)
             .assertCrossAxisSizeIsEqualTo(crossAxisSizeDp)
 
-        rule.onNodeWithTag("2")
+        rule
+            .onNodeWithTag("2")
             .assertMainAxisStartPositionInRootIsEqualTo(itemSizeDp * 2) // item + spacing
             .assertMainAxisSizeIsEqualTo(itemSizeDp)
             .assertCrossAxisStartPositionInRootIsEqualTo(0.dp)
             .assertCrossAxisSizeIsEqualTo(crossAxisSizeDp)
 
-        rule.onNodeWithTag("3")
+        rule
+            .onNodeWithTag("3")
             .assertMainAxisStartPositionInRootIsEqualTo(itemSizeDp * 2) // item + spacing
             .assertMainAxisSizeIsEqualTo(itemSizeDp)
             .assertCrossAxisStartPositionInRootIsEqualTo(crossAxisSizeDp + spacing)
@@ -149,19 +148,15 @@
         rule.setContent {
             LazyStaggeredGrid(
                 lanes = 2,
-                modifier = Modifier
-                    .testTag(LazyStaggeredGrid)
-                    .axisSize(itemSizeDp * 2, itemSizeDp * 5),
+                modifier =
+                    Modifier.testTag(LazyStaggeredGrid).axisSize(itemSizeDp * 2, itemSizeDp * 5),
                 state = state,
                 mainAxisSpacing = itemSizeDp
             ) {
                 items(100) {
                     BasicText(
                         text = "$it",
-                        modifier = Modifier
-                            .testTag("$it")
-                            .mainAxisSize(itemSizeDp)
-                            .debugBorder()
+                        modifier = Modifier.testTag("$it").mainAxisSize(itemSizeDp).debugBorder()
                     )
                 }
             }
@@ -169,11 +164,13 @@
 
         state.scrollTo(100)
 
-        rule.onNodeWithTag("98")
+        rule
+            .onNodeWithTag("98")
             .assertMainAxisStartPositionInRootIsEqualTo(itemSizeDp * 5 - itemSizeDp)
             .assertCrossAxisStartPositionInRootIsEqualTo(0.dp)
 
-        rule.onNodeWithTag("99")
+        rule
+            .onNodeWithTag("99")
             .assertMainAxisStartPositionInRootIsEqualTo(itemSizeDp * 5 - itemSizeDp)
             .assertCrossAxisStartPositionInRootIsEqualTo(itemSizeDp)
     }
@@ -184,38 +181,39 @@
         rule.setContent {
             LazyStaggeredGrid(
                 lanes = 2,
-                modifier = Modifier
-                    .testTag(LazyStaggeredGrid)
-                    .axisSize(itemSizeDp * 2, itemSizeDp * 5),
+                modifier =
+                    Modifier.testTag(LazyStaggeredGrid).axisSize(itemSizeDp * 2, itemSizeDp * 5),
                 state = state,
                 mainAxisSpacing = -itemSizeDp
             ) {
                 items(100) {
                     BasicText(
                         text = "$it",
-                        modifier = Modifier
-                            .testTag("$it")
-                            .mainAxisSize(itemSizeDp * 2)
+                        modifier = Modifier.testTag("$it").mainAxisSize(itemSizeDp * 2)
                     )
                 }
             }
         }
 
-        rule.onNodeWithTag("0")
+        rule
+            .onNodeWithTag("0")
             .assertMainAxisStartPositionInRootIsEqualTo(0.dp)
             .assertMainAxisSizeIsEqualTo(itemSizeDp * 2)
 
-        rule.onNodeWithTag("2")
+        rule
+            .onNodeWithTag("2")
             .assertMainAxisStartPositionInRootIsEqualTo(itemSizeDp)
             .assertMainAxisSizeIsEqualTo(itemSizeDp * 2)
 
         state.scrollBy(itemSizeDp)
 
-        rule.onNodeWithTag("0")
+        rule
+            .onNodeWithTag("0")
             .assertMainAxisStartPositionInRootIsEqualTo(-itemSizeDp)
             .assertMainAxisSizeIsEqualTo(itemSizeDp * 2)
 
-        rule.onNodeWithTag("2")
+        rule
+            .onNodeWithTag("2")
             .assertMainAxisStartPositionInRootIsEqualTo(0.dp)
             .assertMainAxisSizeIsEqualTo(itemSizeDp * 2)
 
@@ -229,9 +227,8 @@
         rule.setContent {
             LazyStaggeredGrid(
                 lanes = 2,
-                modifier = Modifier
-                    .testTag(LazyStaggeredGrid)
-                    .axisSize(itemSizeDp * 2, itemSizeDp * 5),
+                modifier =
+                    Modifier.testTag(LazyStaggeredGrid).axisSize(itemSizeDp * 2, itemSizeDp * 5),
                 state = state,
                 mainAxisSpacing = -itemSizeDp,
                 contentPadding = PaddingValues(beforeContent = itemSizeDp)
@@ -239,29 +236,31 @@
                 items(100) {
                     BasicText(
                         text = "$it",
-                        modifier = Modifier
-                            .testTag("$it")
-                            .mainAxisSize(itemSizeDp * 2)
+                        modifier = Modifier.testTag("$it").mainAxisSize(itemSizeDp * 2)
                     )
                 }
             }
         }
 
-        rule.onNodeWithTag("0")
+        rule
+            .onNodeWithTag("0")
             .assertMainAxisStartPositionInRootIsEqualTo(itemSizeDp)
             .assertMainAxisSizeIsEqualTo(itemSizeDp * 2)
 
-        rule.onNodeWithTag("2")
+        rule
+            .onNodeWithTag("2")
             .assertMainAxisStartPositionInRootIsEqualTo(itemSizeDp * 2)
             .assertMainAxisSizeIsEqualTo(itemSizeDp * 2)
 
         state.scrollBy(itemSizeDp)
 
-        rule.onNodeWithTag("0")
+        rule
+            .onNodeWithTag("0")
             .assertMainAxisStartPositionInRootIsEqualTo(0.dp)
             .assertMainAxisSizeIsEqualTo(itemSizeDp * 2)
 
-        rule.onNodeWithTag("2")
+        rule
+            .onNodeWithTag("2")
             .assertMainAxisStartPositionInRootIsEqualTo(itemSizeDp)
             .assertMainAxisSizeIsEqualTo(itemSizeDp * 2)
 
@@ -280,16 +279,11 @@
                 mainAxisSpacing = -largerThanItemSize,
                 state = state
             ) {
-                items(8) { index ->
-                    Box(Modifier.size(itemSizeDp).testTag(index.toString()))
-                }
+                items(8) { index -> Box(Modifier.size(itemSizeDp).testTag(index.toString())) }
             }
         }
 
-        repeat(8) {
-            rule.onNodeWithTag("$it")
-                .assertMainAxisStartPositionInRootIsEqualTo(0.dp)
-        }
+        repeat(8) { rule.onNodeWithTag("$it").assertMainAxisStartPositionInRootIsEqualTo(0.dp) }
 
         rule.runOnIdle {
             assertThat(state.firstVisibleItemIndex).isEqualTo(0)
@@ -307,16 +301,16 @@
                 crossAxisArrangement = Arrangement.Center,
                 state = state
             ) {
-                items(10) { index ->
-                    Box(Modifier.size(itemSizeDp).testTag(index.toString()))
-                }
+                items(10) { index -> Box(Modifier.size(itemSizeDp).testTag(index.toString())) }
             }
         }
 
-        rule.onNodeWithTag("0")
+        rule
+            .onNodeWithTag("0")
             .assertCrossAxisStartPositionInRootIsEqualTo(itemSizeDp * 0.5f)
             .assertCrossAxisSizeIsEqualTo(itemSizeDp * 2)
-        rule.onNodeWithTag("1")
+        rule
+            .onNodeWithTag("1")
             .assertCrossAxisStartPositionInRootIsEqualTo(itemSizeDp * 2.5f)
             .assertCrossAxisSizeIsEqualTo(itemSizeDp * 2)
     }
@@ -328,27 +322,31 @@
             LazyStaggeredGrid(
                 cells = StaggeredGridCells.FixedSize(itemSizeDp * 2),
                 modifier = Modifier.axisSize(crossAxis = itemSizeDp * 5, mainAxis = itemSizeDp * 5),
-                crossAxisArrangement = object : Arrangement.HorizontalOrVertical,
-                    Arrangement.Horizontal by Arrangement.spacedBy(
-                        itemSizeDp * 0.5f, Alignment.End
-                    ),
-                    Arrangement.Vertical by Arrangement.spacedBy(
-                        itemSizeDp * 0.5f, Alignment.Bottom
-                    ) {
+                crossAxisArrangement =
+                    object :
+                        Arrangement.HorizontalOrVertical,
+                        Arrangement.Horizontal by Arrangement.spacedBy(
+                            itemSizeDp * 0.5f,
+                            Alignment.End
+                        ),
+                        Arrangement.Vertical by Arrangement.spacedBy(
+                            itemSizeDp * 0.5f,
+                            Alignment.Bottom
+                        ) {
                         override val spacing: Dp = itemSizeDp * 0.5f
                     },
                 state = state
             ) {
-                items(10) { index ->
-                    Box(Modifier.size(itemSizeDp).testTag(index.toString()))
-                }
+                items(10) { index -> Box(Modifier.size(itemSizeDp).testTag(index.toString())) }
             }
         }
 
-        rule.onNodeWithTag("0")
+        rule
+            .onNodeWithTag("0")
             .assertCrossAxisStartPositionInRootIsEqualTo(itemSizeDp * 0.5f)
             .assertCrossAxisSizeIsEqualTo(itemSizeDp * 2)
-        rule.onNodeWithTag("1")
+        rule
+            .onNodeWithTag("1")
             .assertCrossAxisStartPositionInRootIsEqualTo(itemSizeDp * 3f)
             .assertCrossAxisSizeIsEqualTo(itemSizeDp * 2)
     }
diff --git a/compose/foundation/foundation/integration-tests/lazy-tests/src/androidTest/kotlin/androidx/compose/foundation/lazy/staggeredgrid/LazyStaggeredGridBeyondBoundsTest.kt b/compose/foundation/foundation/integration-tests/lazy-tests/src/androidTest/kotlin/androidx/compose/foundation/lazy/staggeredgrid/LazyStaggeredGridBeyondBoundsTest.kt
index f6e2ad0..8f4da27 100644
--- a/compose/foundation/foundation/integration-tests/lazy-tests/src/androidTest/kotlin/androidx/compose/foundation/lazy/staggeredgrid/LazyStaggeredGridBeyondBoundsTest.kt
+++ b/compose/foundation/foundation/integration-tests/lazy-tests/src/androidTest/kotlin/androidx/compose/foundation/lazy/staggeredgrid/LazyStaggeredGridBeyondBoundsTest.kt
@@ -54,8 +54,7 @@
 @MediumTest
 class LazyStaggeredGridBeyondBoundsTest {
 
-    @get:Rule
-    val rule = createParameterizedComposeTestRule<Param>()
+    @get:Rule val rule = createParameterizedComposeTestRule<Param>()
 
     // We need to wrap the inline class parameter in another class because Java can't instantiate
     // the inline class.
@@ -64,9 +63,10 @@
         val reverseLayout: Boolean,
         val layoutDirection: LayoutDirection,
     ) {
-        override fun toString() = "beyondBoundsLayoutDirection=$beyondBoundsLayoutDirection " +
-            "reverseLayout=$reverseLayout " +
-            "layoutDirection=$layoutDirection"
+        override fun toString() =
+            "beyondBoundsLayoutDirection=$beyondBoundsLayoutDirection " +
+                "reverseLayout=$reverseLayout " +
+                "layoutDirection=$layoutDirection"
 
         internal fun placementComparator(): PlacementComparator {
             return PlacementComparator(beyondBoundsLayoutDirection, layoutDirection, reverseLayout)
@@ -99,13 +99,7 @@
     fun onlyOneVisibleItemIsPlaced() {
         // Arrange.
         rule.setLazyContent(size = 10.toDp(), firstVisibleItem = 0) {
-            items(100) { index ->
-                Box(
-                    Modifier
-                        .size(10.toDp())
-                        .trackPlaced(index)
-                )
-            }
+            items(100) { index -> Box(Modifier.size(10.toDp()).trackPlaced(index)) }
         }
 
         // Assert.
@@ -124,13 +118,7 @@
     fun onlyTwoVisibleItemsArePlaced() {
         // Arrange.
         rule.setLazyContent(size = 20.toDp(), firstVisibleItem = 0) {
-            items(100) { index ->
-                Box(
-                    Modifier
-                        .size(10.toDp())
-                        .trackPlaced(index)
-                )
-            }
+            items(100) { index -> Box(Modifier.size(10.toDp()).trackPlaced(index)) }
         }
 
         // Assert.
@@ -149,13 +137,7 @@
     fun onlyThreeVisibleItemsArePlaced() {
         // Arrange.
         rule.setLazyContent(size = 30.toDp(), firstVisibleItem = 0) {
-            items(100) { index ->
-                Box(
-                    Modifier
-                        .size(10.toDp())
-                        .trackPlaced(index)
-                )
-            }
+            items(100) { index -> Box(Modifier.size(10.toDp()).trackPlaced(index)) }
         }
 
         // Assert.
@@ -195,16 +177,15 @@
                 }
 
                 // Act.
-                val hasMoreContent = rule.runOnIdle {
-                    beyondBoundsLayoutRef.layout(param.beyondBoundsLayoutDirection) {
-                        hasMoreContent
+                val hasMoreContent =
+                    rule.runOnIdle {
+                        beyondBoundsLayoutRef.layout(param.beyondBoundsLayoutDirection) {
+                            hasMoreContent
+                        }
                     }
-                }
 
                 // Assert.
-                runOnIdle {
-                    assertThat(hasMoreContent).isFalse()
-                }
+                runOnIdle { assertThat(hasMoreContent).isFalse() }
                 resetTestCase()
                 addItems = true
             }
@@ -215,30 +196,15 @@
     fun oneExtraItemBeyondVisibleBounds() {
         // Arrange.
         rule.setLazyContent(size = 30.toDp(), firstVisibleItem = 5) {
-            items(5) { index ->
-                Box(
-                    Modifier
-                        .size(10.toDp())
-                        .trackPlaced(index)
-                )
-            }
+            items(5) { index -> Box(Modifier.size(10.toDp()).trackPlaced(index)) }
             item {
                 Box(
-                    Modifier
-                        .size(10.toDp())
-                        .trackPlaced(5)
-                        .modifierLocalConsumer {
-                            beyondBoundsLayout = ModifierLocalBeyondBoundsLayout.current
-                        }
+                    Modifier.size(10.toDp()).trackPlaced(5).modifierLocalConsumer {
+                        beyondBoundsLayout = ModifierLocalBeyondBoundsLayout.current
+                    }
                 )
             }
-            items(5) { index ->
-                Box(
-                    Modifier
-                        .size(10.toDp())
-                        .trackPlaced(index + 6)
-                )
-            }
+            items(5) { index -> Box(Modifier.size(10.toDp()).trackPlaced(index + 6)) }
         }
 
         // Act.
@@ -281,30 +247,15 @@
             // item | item  | x5
             // item | local | x1
             // item | item  | x5
-            items(11) { index ->
-                Box(
-                    Modifier
-                        .size(itemSizeDp)
-                        .trackPlaced(index)
-                )
-            }
+            items(11) { index -> Box(Modifier.size(itemSizeDp).trackPlaced(index)) }
             item {
                 Box(
-                    Modifier
-                        .size(itemSizeDp)
-                        .trackPlaced(11)
-                        .modifierLocalConsumer {
-                            beyondBoundsLayout = ModifierLocalBeyondBoundsLayout.current
-                        }
+                    Modifier.size(itemSizeDp).trackPlaced(11).modifierLocalConsumer {
+                        beyondBoundsLayout = ModifierLocalBeyondBoundsLayout.current
+                    }
                 )
             }
-            items(10) { index ->
-                Box(
-                    Modifier
-                        .size(itemSizeDp)
-                        .trackPlaced(index + 12)
-                )
-            }
+            items(10) { index -> Box(Modifier.size(itemSizeDp).trackPlaced(index + 12)) }
         }
 
         // Act.
@@ -356,26 +307,18 @@
             // |   | 8 |   |
             // -------------
             items(4) { index ->
-                Box(
-                    Modifier
-                        .size(itemSizeDp * if (index % 2 == 0) 2f else 1f)
-                        .trackPlaced(index)
-                )
+                Box(Modifier.size(itemSizeDp * if (index % 2 == 0) 2f else 1f).trackPlaced(index))
             }
             item(span = StaggeredGridItemSpan.FullLine) {
                 Box(
-                    Modifier
-                        .size(itemSizeDp)
-                        .trackPlaced(4)
-                        .modifierLocalConsumer {
-                            beyondBoundsLayout = ModifierLocalBeyondBoundsLayout.current
-                        }
+                    Modifier.size(itemSizeDp).trackPlaced(4).modifierLocalConsumer {
+                        beyondBoundsLayout = ModifierLocalBeyondBoundsLayout.current
+                    }
                 )
             }
             items(4) { index ->
                 Box(
-                    Modifier
-                        .size(itemSizeDp * if (index % 2 == 0) 2f else 1f)
+                    Modifier.size(itemSizeDp * if (index % 2 == 0) 2f else 1f)
                         .trackPlaced(index + 5)
                 )
             }
@@ -414,30 +357,15 @@
     fun twoExtraItemsBeyondVisibleBounds() {
         // Arrange.
         rule.setLazyContent(size = 30.toDp(), firstVisibleItem = 5) {
-            items(5) { index ->
-                Box(
-                    Modifier
-                        .size(10.toDp())
-                        .trackPlaced(index)
-                )
-            }
+            items(5) { index -> Box(Modifier.size(10.toDp()).trackPlaced(index)) }
             item {
                 Box(
-                    Modifier
-                        .size(10.toDp())
-                        .trackPlaced(5)
-                        .modifierLocalConsumer {
-                            beyondBoundsLayout = ModifierLocalBeyondBoundsLayout.current
-                        }
+                    Modifier.size(10.toDp()).trackPlaced(5).modifierLocalConsumer {
+                        beyondBoundsLayout = ModifierLocalBeyondBoundsLayout.current
+                    }
                 )
             }
-            items(5) { index ->
-                Box(
-                    Modifier
-                        .size(10.toDp())
-                        .trackPlaced(index + 6)
-                )
-            }
+            items(5) { index -> Box(Modifier.size(10.toDp()).trackPlaced(index + 6)) }
         }
 
         // Act.
@@ -480,30 +408,17 @@
     fun allBeyondBoundsItemsInSpecifiedDirection() {
         // Arrange.
         rule.setLazyContent(size = 30.toDp(), firstVisibleItem = 5) {
-            items(5) { index ->
-                Box(
-                    Modifier
-                        .size(10.toDp())
-                        .trackPlaced(index)
-                )
-            }
+            items(5) { index -> Box(Modifier.size(10.toDp()).trackPlaced(index)) }
             item {
                 Box(
-                    Modifier
-                        .size(10.toDp())
+                    Modifier.size(10.toDp())
                         .modifierLocalConsumer {
                             beyondBoundsLayout = ModifierLocalBeyondBoundsLayout.current
                         }
                         .trackPlaced(5)
                 )
             }
-            items(5) { index ->
-                Box(
-                    Modifier
-                        .size(10.toDp())
-                        .trackPlaced(index + 6)
-                )
-            }
+            items(5) { index -> Box(Modifier.size(10.toDp()).trackPlaced(index + 6)) }
         }
 
         // Act.
@@ -512,7 +427,8 @@
                 runOnUiThread {
                     beyondBoundsLayout!!.layout(param.beyondBoundsLayoutDirection) {
                         if (hasMoreContent) {
-                            // Just return null so that we keep adding more items till we reach the end.
+                            // Just return null so that we keep adding more items till we reach the
+                            // end.
                             null
                         } else {
                             // Assert that the beyond bounds items are present.
@@ -524,9 +440,8 @@
                             assertThat(visibleItems).containsExactly(5, 6, 7)
 
                             // Verify if the placed item offsets are in order.
-                            assertThat(
-                                placedItems.toSortedMap().values
-                            ).isInOrder(param.placementComparator())
+                            assertThat(placedItems.toSortedMap().values)
+                                .isInOrder(param.placementComparator())
 
                             // Return true to end the search.
                             true
@@ -535,9 +450,7 @@
                 }
 
                 // Assert that the beyond bounds items are removed.
-                runOnIdle {
-                    assertThat(placedItems.keys).containsExactly(5, 6, 7)
-                }
+                runOnIdle { assertThat(placedItems.keys).containsExactly(5, 6, 7) }
                 resetTestCase(5)
             }
         }
@@ -547,30 +460,15 @@
     fun beyondBoundsLayoutRequest_inDirectionPerpendicularToLazyListOrientation() {
         // Arrange.
         rule.setLazyContentInPerpendicularDirection(size = 30.toDp(), firstVisibleItem = 5) {
-            items(5) { index ->
-                Box(
-                    Modifier
-                        .size(10.toDp())
-                        .trackPlaced(index)
-                )
-            }
+            items(5) { index -> Box(Modifier.size(10.toDp()).trackPlaced(index)) }
             item {
                 Box(
-                    Modifier
-                        .size(10.toDp())
-                        .trackPlaced(5)
-                        .modifierLocalConsumer {
-                            beyondBoundsLayout = ModifierLocalBeyondBoundsLayout.current
-                        }
+                    Modifier.size(10.toDp()).trackPlaced(5).modifierLocalConsumer {
+                        beyondBoundsLayout = ModifierLocalBeyondBoundsLayout.current
+                    }
                 )
             }
-            items(5) { index ->
-                Box(
-                    Modifier
-                        .size(10.toDp())
-                        .trackPlaced(index + 6)
-                )
-            }
+            items(5) { index -> Box(Modifier.size(10.toDp()).trackPlaced(index + 6)) }
         }
         with(rule) {
             forEachParameter(ParamsToTest) { param ->
@@ -585,12 +483,15 @@
                     beyondBoundsLayout!!.layout(param.beyondBoundsLayoutDirection) {
                         beyondBoundsLayoutCount++
                         when (param.beyondBoundsLayoutDirection) {
-                            Left, Right, Above, Below -> {
+                            Left,
+                            Right,
+                            Above,
+                            Below -> {
                                 assertThat(placedItems.keys).containsExactly(5, 6, 7)
                                 assertThat(visibleItems).containsExactly(5, 6, 7)
                             }
-
-                            Before, After -> {
+                            Before,
+                            After -> {
                                 if (param.expectedExtraItemsBeforeVisibleBounds()) {
                                     assertThat(placedItems.keys).containsExactly(4, 5, 6, 7)
                                     assertThat(visibleItems).containsExactly(5, 6, 7)
@@ -608,18 +509,20 @@
 
                 runOnIdle {
                     when (param.beyondBoundsLayoutDirection) {
-                        Left, Right, Above, Below -> {
+                        Left,
+                        Right,
+                        Above,
+                        Below -> {
                             assertThat(beyondBoundsLayoutCount).isEqualTo(0)
                         }
-
-                        Before, After -> {
+                        Before,
+                        After -> {
                             assertThat(beyondBoundsLayoutCount).isEqualTo(1)
 
                             // Assert that the beyond bounds items are removed.
                             assertThat(placedItems.keys).containsExactly(5, 6, 7)
                             assertThat(visibleItems).containsExactly(5, 6, 7)
                         }
-
                         else -> error("Unsupported BeyondBoundsLayoutDirection")
                     }
                 }
@@ -632,30 +535,17 @@
     fun returningNullDoesNotCauseInfiniteLoop() {
         // Arrange.
         rule.setLazyContent(size = 30.toDp(), firstVisibleItem = 5) {
-            items(5) { index ->
-                Box(
-                    Modifier
-                        .size(10.toDp())
-                        .trackPlaced(index)
-                )
-            }
+            items(5) { index -> Box(Modifier.size(10.toDp()).trackPlaced(index)) }
             item {
                 Box(
-                    Modifier
-                        .size(10.toDp())
+                    Modifier.size(10.toDp())
                         .modifierLocalConsumer {
                             beyondBoundsLayout = ModifierLocalBeyondBoundsLayout.current
                         }
                         .trackPlaced(5)
                 )
             }
-            items(5) { index ->
-                Box(
-                    Modifier
-                        .size(10.toDp())
-                        .trackPlaced(index + 6)
-                )
-            }
+            items(5) { index -> Box(Modifier.size(10.toDp()).trackPlaced(index + 6)) }
         }
 
         // Act.
@@ -693,7 +583,10 @@
                 CompositionLocalProvider(LocalLayoutDirection provides it.layoutDirection) {
                     lazyStaggeredGridState = rememberLazyStaggeredGridState(firstVisibleItem)
                     when (it.beyondBoundsLayoutDirection) {
-                        Left, Right, Before, After ->
+                        Left,
+                        Right,
+                        Before,
+                        After ->
                             LazyHorizontalStaggeredGrid(
                                 rows = StaggeredGridCells.Fixed(cells),
                                 modifier = Modifier.size(size),
@@ -701,8 +594,8 @@
                                 reverseLayout = it.reverseLayout,
                                 content = content
                             )
-
-                        Above, Below ->
+                        Above,
+                        Below ->
                             LazyVerticalStaggeredGrid(
                                 columns = StaggeredGridCells.Fixed(cells),
                                 modifier = Modifier.size(size),
@@ -710,7 +603,6 @@
                                 reverseLayout = it.reverseLayout,
                                 content = content
                             )
-
                         else -> unsupportedDirection()
                     }
                 }
@@ -728,7 +620,10 @@
                 CompositionLocalProvider(LocalLayoutDirection provides it.layoutDirection) {
                     lazyStaggeredGridState = rememberLazyStaggeredGridState(firstVisibleItem)
                     when (it.beyondBoundsLayoutDirection) {
-                        Left, Right, Before, After ->
+                        Left,
+                        Right,
+                        Before,
+                        After ->
                             LazyVerticalStaggeredGrid(
                                 columns = StaggeredGridCells.Fixed(1),
                                 modifier = Modifier.size(size),
@@ -736,8 +631,8 @@
                                 reverseLayout = it.reverseLayout,
                                 content = content
                             )
-
-                        Above, Below ->
+                        Above,
+                        Below ->
                             LazyHorizontalStaggeredGrid(
                                 rows = StaggeredGridCells.Fixed(1),
                                 modifier = Modifier.size(size),
@@ -745,7 +640,6 @@
                                 reverseLayout = it.reverseLayout,
                                 content = content
                             )
-
                         else -> unsupportedDirection()
                     }
                 }
@@ -758,19 +652,19 @@
     private val visibleItems: List<Int>
         get() = lazyStaggeredGridState.layoutInfo.visibleItemsInfo.map { it.index }
 
-    private fun Param.expectedExtraItemsBeforeVisibleBounds() = when (beyondBoundsLayoutDirection) {
-        Right -> if (layoutDirection == Ltr) reverseLayout else !reverseLayout
-        Left -> if (layoutDirection == Ltr) !reverseLayout else reverseLayout
-        Above -> !reverseLayout
-        Below -> reverseLayout
-        After -> false
-        Before -> true
-        else -> error("Unsupported BeyondBoundsDirection")
-    }
+    private fun Param.expectedExtraItemsBeforeVisibleBounds() =
+        when (beyondBoundsLayoutDirection) {
+            Right -> if (layoutDirection == Ltr) reverseLayout else !reverseLayout
+            Left -> if (layoutDirection == Ltr) !reverseLayout else reverseLayout
+            Above -> !reverseLayout
+            Below -> reverseLayout
+            After -> false
+            Before -> true
+            else -> error("Unsupported BeyondBoundsDirection")
+        }
 
-    private fun unsupportedDirection(): Nothing = error(
-        "Lazy list does not support beyond bounds layout for the specified direction"
-    )
+    private fun unsupportedDirection(): Nothing =
+        error("Lazy list does not support beyond bounds layout for the specified direction")
 
     private fun Modifier.trackPlaced(index: Int): Modifier =
         this then TrackPlacedElement(index, placedItems)
diff --git a/compose/foundation/foundation/integration-tests/lazy-tests/src/androidTest/kotlin/androidx/compose/foundation/lazy/staggeredgrid/LazyStaggeredGridContentPaddingTest.kt b/compose/foundation/foundation/integration-tests/lazy-tests/src/androidTest/kotlin/androidx/compose/foundation/lazy/staggeredgrid/LazyStaggeredGridContentPaddingTest.kt
index 81589b6..46aa36f 100644
--- a/compose/foundation/foundation/integration-tests/lazy-tests/src/androidTest/kotlin/androidx/compose/foundation/lazy/staggeredgrid/LazyStaggeredGridContentPaddingTest.kt
+++ b/compose/foundation/foundation/integration-tests/lazy-tests/src/androidTest/kotlin/androidx/compose/foundation/lazy/staggeredgrid/LazyStaggeredGridContentPaddingTest.kt
@@ -35,17 +35,17 @@
 @OptIn(ExperimentalFoundationApi::class)
 @MediumTest
 @RunWith(Parameterized::class)
-class LazyStaggeredGridContentPaddingTest(
-    orientation: Orientation
-) : BaseLazyStaggeredGridWithOrientation(orientation) {
+class LazyStaggeredGridContentPaddingTest(orientation: Orientation) :
+    BaseLazyStaggeredGridWithOrientation(orientation) {
 
     companion object {
         @JvmStatic
         @Parameterized.Parameters(name = "{0}")
-        fun initParameters(): Array<Any> = arrayOf(
-            Orientation.Vertical,
-            Orientation.Horizontal,
-        )
+        fun initParameters(): Array<Any> =
+            arrayOf(
+                Orientation.Vertical,
+                Orientation.Horizontal,
+            )
 
         private const val LazyStaggeredGrid = "Lazy"
     }
@@ -57,9 +57,7 @@
 
     @Before
     fun setUp() {
-        with(rule.density) {
-            itemSizeDp = itemSizePx.toDp()
-        }
+        with(rule.density) { itemSizeDp = itemSizePx.toDp() }
     }
 
     @Test
@@ -67,39 +65,36 @@
         rule.setContent {
             LazyStaggeredGrid(
                 lanes = 2,
-                modifier = Modifier
-                    .axisSize(itemSizeDp * 4, itemSizeDp * 5)
-                    .testTag(LazyStaggeredGrid),
-                contentPadding = PaddingValues(
-                    mainAxis = itemSizeDp * 2,
-                    crossAxis = itemSizeDp
-                )
+                modifier =
+                    Modifier.axisSize(itemSizeDp * 4, itemSizeDp * 5).testTag(LazyStaggeredGrid),
+                contentPadding = PaddingValues(mainAxis = itemSizeDp * 2, crossAxis = itemSizeDp)
             ) {
-                items(4) {
-                    Spacer(Modifier.mainAxisSize(itemSizeDp).testTag("$it"))
-                }
+                items(4) { Spacer(Modifier.mainAxisSize(itemSizeDp).testTag("$it")) }
             }
         }
 
-        rule.onNodeWithTag("0")
+        rule
+            .onNodeWithTag("0")
             .assertMainAxisStartPositionInRootIsEqualTo(itemSizeDp * 2)
             .assertCrossAxisStartPositionInRootIsEqualTo(itemSizeDp)
             .assertCrossAxisSizeIsEqualTo(itemSizeDp)
 
-        rule.onNodeWithTag("1")
+        rule
+            .onNodeWithTag("1")
             .assertMainAxisStartPositionInRootIsEqualTo(itemSizeDp * 2)
             .assertCrossAxisStartPositionInRootIsEqualTo(itemSizeDp * 2)
             .assertCrossAxisSizeIsEqualTo(itemSizeDp)
 
-        rule.onNodeWithTag(LazyStaggeredGrid)
-            .scrollMainAxisBy(itemSizeDp * 100)
+        rule.onNodeWithTag(LazyStaggeredGrid).scrollMainAxisBy(itemSizeDp * 100)
 
-        rule.onNodeWithTag("2")
+        rule
+            .onNodeWithTag("2")
             .assertMainAxisStartPositionInRootIsEqualTo(itemSizeDp * 2)
             .assertCrossAxisStartPositionInRootIsEqualTo(itemSizeDp)
             .assertCrossAxisSizeIsEqualTo(itemSizeDp)
 
-        rule.onNodeWithTag("3")
+        rule
+            .onNodeWithTag("3")
             .assertMainAxisStartPositionInRootIsEqualTo(itemSizeDp * 2)
             .assertCrossAxisStartPositionInRootIsEqualTo(itemSizeDp * 2)
             .assertCrossAxisSizeIsEqualTo(itemSizeDp)
@@ -111,13 +106,9 @@
         rule.setContent {
             LazyStaggeredGrid(
                 lanes = 2,
-                modifier = Modifier
-                    .axisSize(itemSizeDp * 4, itemSizeDp * 5)
-                    .testTag(LazyStaggeredGrid),
-                contentPadding = PaddingValues(
-                    mainAxis = itemSizeDp * 2,
-                    crossAxis = itemSizeDp
-                ),
+                modifier =
+                    Modifier.axisSize(itemSizeDp * 4, itemSizeDp * 5).testTag(LazyStaggeredGrid),
+                contentPadding = PaddingValues(mainAxis = itemSizeDp * 2, crossAxis = itemSizeDp),
                 state = state
             ) {
                 items(100) {
@@ -130,21 +121,25 @@
         assertThat(state.firstVisibleItemScrollOffset).isEqualTo(0)
 
         // offset by content padding
-        rule.onNodeWithTag("10")
+        rule
+            .onNodeWithTag("10")
             .assertMainAxisStartPositionInRootIsEqualTo(itemSizeDp * 2)
             .assertCrossAxisStartPositionInRootIsEqualTo(itemSizeDp)
 
-        rule.onNodeWithTag("11")
+        rule
+            .onNodeWithTag("11")
             .assertMainAxisStartPositionInRootIsEqualTo(itemSizeDp * 2)
             .assertCrossAxisStartPositionInRootIsEqualTo(itemSizeDp * 2)
 
         state.scrollBy(itemSizeDp * 2)
 
-        rule.onNodeWithTag("10")
+        rule
+            .onNodeWithTag("10")
             .assertMainAxisStartPositionInRootIsEqualTo(0.dp)
             .assertCrossAxisStartPositionInRootIsEqualTo(itemSizeDp)
 
-        rule.onNodeWithTag("11")
+        rule
+            .onNodeWithTag("11")
             .assertMainAxisStartPositionInRootIsEqualTo(0.dp)
             .assertCrossAxisStartPositionInRootIsEqualTo(itemSizeDp * 2)
 
@@ -159,18 +154,12 @@
         rule.setContent {
             LazyStaggeredGrid(
                 lanes = 2,
-                modifier = Modifier
-                    .axisSize(itemSizeDp * 4, itemSizeDp * 5)
-                    .testTag(LazyStaggeredGrid),
-                contentPadding = PaddingValues(
-                    mainAxis = itemSizeDp * 2,
-                    crossAxis = itemSizeDp
-                ),
+                modifier =
+                    Modifier.axisSize(itemSizeDp * 4, itemSizeDp * 5).testTag(LazyStaggeredGrid),
+                contentPadding = PaddingValues(mainAxis = itemSizeDp * 2, crossAxis = itemSizeDp),
                 state = state
             ) {
-                items(100) {
-                    Spacer(Modifier.mainAxisSize(itemSizeDp).testTag("$it"))
-                }
+                items(100) { Spacer(Modifier.mainAxisSize(itemSizeDp).testTag("$it")) }
             }
         }
 
@@ -188,38 +177,28 @@
         rule.setContent {
             LazyStaggeredGrid(
                 lanes = 2,
-                modifier = Modifier
-                    .axisSize(itemSizeDp * 4, itemSizeDp * 5)
-                    .testTag(LazyStaggeredGrid),
-                contentPadding = PaddingValues(
-                    mainAxis = itemSizeDp * 2,
-                    crossAxis = itemSizeDp
-                ),
+                modifier =
+                    Modifier.axisSize(itemSizeDp * 4, itemSizeDp * 5).testTag(LazyStaggeredGrid),
+                contentPadding = PaddingValues(mainAxis = itemSizeDp * 2, crossAxis = itemSizeDp),
                 state = state
             ) {
-                items(10) {
-                    Spacer(Modifier.mainAxisSize(itemSizeDp).testTag("$it"))
-                }
+                items(10) { Spacer(Modifier.mainAxisSize(itemSizeDp).testTag("$it")) }
             }
         }
 
-        rule.onNodeWithTag("0")
-            .assertMainAxisStartPositionInRootIsEqualTo(itemSizeDp * 2)
+        rule.onNodeWithTag("0").assertMainAxisStartPositionInRootIsEqualTo(itemSizeDp * 2)
 
         state.scrollBy(itemSizeDp * 2.5f)
 
-        rule.onNodeWithTag("0")
-            .assertMainAxisStartPositionInRootIsEqualTo(itemSizeDp * -0.5f)
+        rule.onNodeWithTag("0").assertMainAxisStartPositionInRootIsEqualTo(itemSizeDp * -0.5f)
 
         state.scrollBy(itemSizeDp * 10)
 
-        rule.onNodeWithTag("9")
-            .assertMainAxisStartPositionInRootIsEqualTo(itemSizeDp * 2)
+        rule.onNodeWithTag("9").assertMainAxisStartPositionInRootIsEqualTo(itemSizeDp * 2)
 
         state.scrollBy(itemSizeDp * (-2.5f))
 
-        rule.onNodeWithTag("9")
-            .assertMainAxisStartPositionInRootIsEqualTo(itemSizeDp * 4.5f)
+        rule.onNodeWithTag("9").assertMainAxisStartPositionInRootIsEqualTo(itemSizeDp * 4.5f)
     }
 
     @Test
@@ -228,33 +207,27 @@
         rule.setContent {
             LazyStaggeredGrid(
                 lanes = 2,
-                modifier = Modifier
-                    .axisSize(itemSizeDp * 2, itemSizeDp * 5)
-                    .testTag(LazyStaggeredGrid),
-                contentPadding = PaddingValues(
-                    mainAxis = itemSizeDp * 6
-                ),
+                modifier =
+                    Modifier.axisSize(itemSizeDp * 2, itemSizeDp * 5).testTag(LazyStaggeredGrid),
+                contentPadding = PaddingValues(mainAxis = itemSizeDp * 6),
                 state = state
             ) {
-                items(10) {
-                    Spacer(Modifier.mainAxisSize(itemSizeDp).testTag("$it"))
-                }
+                items(10) { Spacer(Modifier.mainAxisSize(itemSizeDp).testTag("$it")) }
             }
         }
 
-        rule.onNodeWithTag("0")
-            .assertMainAxisStartPositionInRootIsEqualTo(itemSizeDp * 6)
+        rule.onNodeWithTag("0").assertMainAxisStartPositionInRootIsEqualTo(itemSizeDp * 6)
 
         assertThat(state.firstVisibleItemIndex).isEqualTo(0)
         assertThat(state.firstVisibleItemScrollOffset).isEqualTo(0)
 
         state.scrollBy(itemSizeDp * 20)
 
-        rule.onNodeWithTag("8")
-            .assertMainAxisStartPositionInRootIsEqualTo(itemSizeDp * -2f)
+        rule.onNodeWithTag("8").assertMainAxisStartPositionInRootIsEqualTo(itemSizeDp * -2f)
 
         assertThat(state.firstVisibleItemIndex).isEqualTo(8)
-        // normally this item is invisible, but being the last item in the lane, it is forced to stay
+        // normally this item is invisible, but being the last item in the lane, it is forced to
+        // stay
         assertThat(state.firstVisibleItemScrollOffset).isEqualTo(itemSizePx * 8)
     }
 
@@ -264,21 +237,16 @@
         rule.setContent {
             LazyStaggeredGrid(
                 lanes = 2,
-                modifier = Modifier
-                    .testTag(LazyStaggeredGrid),
-                contentPadding = PaddingValues(
-                    mainAxis = 10.dp,
-                    crossAxis = 2.dp
-                ),
+                modifier = Modifier.testTag(LazyStaggeredGrid),
+                contentPadding = PaddingValues(mainAxis = 10.dp, crossAxis = 2.dp),
                 state = state
             ) {
-                items(0) {
-                    Spacer(Modifier.mainAxisSize(itemSizeDp).testTag("$it"))
-                }
+                items(0) { Spacer(Modifier.mainAxisSize(itemSizeDp).testTag("$it")) }
             }
         }
 
-        rule.onNodeWithTag(LazyStaggeredGrid)
+        rule
+            .onNodeWithTag(LazyStaggeredGrid)
             .assertMainAxisSizeIsEqualTo(20.dp)
             .assertCrossAxisSizeIsEqualTo(4.dp)
     }
@@ -290,22 +258,17 @@
             Box(Modifier.crossAxisSize(itemSizeDp * 2)) {
                 LazyStaggeredGrid(
                     lanes = 2,
-                    modifier = Modifier
-                        .testTag(LazyStaggeredGrid),
-                    contentPadding = PaddingValues(
-                        mainAxis = 10.dp,
-                        crossAxis = 2.dp
-                    ),
+                    modifier = Modifier.testTag(LazyStaggeredGrid),
+                    contentPadding = PaddingValues(mainAxis = 10.dp, crossAxis = 2.dp),
                     state = state
                 ) {
-                    items(2) {
-                        Spacer(Modifier.mainAxisSize(0.dp).testTag("$it"))
-                    }
+                    items(2) { Spacer(Modifier.mainAxisSize(0.dp).testTag("$it")) }
                 }
             }
         }
 
-        rule.onNodeWithTag(LazyStaggeredGrid)
+        rule
+            .onNodeWithTag(LazyStaggeredGrid)
             .assertMainAxisSizeIsEqualTo(20.dp)
             .assertCrossAxisSizeIsEqualTo(itemSizeDp * 2)
     }
@@ -316,13 +279,9 @@
         rule.setContent {
             LazyStaggeredGrid(
                 lanes = 2,
-                modifier = Modifier
-                    .testTag(LazyStaggeredGrid)
-                    .axisSize(itemSizeDp * 2, itemSizeDp * 5),
-                contentPadding = PaddingValues(
-                    mainAxis = itemSizeDp * 2,
-                    crossAxis = 0.dp
-                ),
+                modifier =
+                    Modifier.testTag(LazyStaggeredGrid).axisSize(itemSizeDp * 2, itemSizeDp * 5),
+                contentPadding = PaddingValues(mainAxis = itemSizeDp * 2, crossAxis = 0.dp),
                 state = state
             ) {
                 items(1000, key = { it }) {
@@ -331,13 +290,9 @@
             }
         }
 
-        repeat(10) {
-            state.scrollBy(itemSizeDp * 20)
-        }
+        repeat(10) { state.scrollBy(itemSizeDp * 20) }
 
-        rule.runOnIdle {
-            assertThat(state.firstVisibleItemIndex).isEqualTo(400)
-        }
+        rule.runOnIdle { assertThat(state.firstVisibleItemIndex).isEqualTo(400) }
     }
 
     @Test
@@ -348,10 +303,7 @@
                 LazyStaggeredGrid(
                     lanes = 2,
                     modifier = Modifier.testTag(LazyStaggeredGrid),
-                    contentPadding = PaddingValues(
-                        mainAxis = itemSizeDp * 2,
-                        crossAxis = 0.dp
-                    ),
+                    contentPadding = PaddingValues(mainAxis = itemSizeDp * 2, crossAxis = 0.dp),
                     state = state
                 ) {
                     items(4, key = { it }) {
@@ -361,7 +313,6 @@
             }
         }
 
-        rule.onNodeWithTag(LazyStaggeredGrid)
-            .assertMainAxisSizeIsEqualTo(itemSizeDp * 6)
+        rule.onNodeWithTag(LazyStaggeredGrid).assertMainAxisSizeIsEqualTo(itemSizeDp * 6)
     }
 }
diff --git a/compose/foundation/foundation/integration-tests/lazy-tests/src/androidTest/kotlin/androidx/compose/foundation/lazy/staggeredgrid/LazyStaggeredGridCustomKeysTest.kt b/compose/foundation/foundation/integration-tests/lazy-tests/src/androidTest/kotlin/androidx/compose/foundation/lazy/staggeredgrid/LazyStaggeredGridCustomKeysTest.kt
index 554a393..640d189 100644
--- a/compose/foundation/foundation/integration-tests/lazy-tests/src/androidTest/kotlin/androidx/compose/foundation/lazy/staggeredgrid/LazyStaggeredGridCustomKeysTest.kt
+++ b/compose/foundation/foundation/integration-tests/lazy-tests/src/androidTest/kotlin/androidx/compose/foundation/lazy/staggeredgrid/LazyStaggeredGridCustomKeysTest.kt
@@ -44,12 +44,9 @@
 @RunWith(AndroidJUnit4::class)
 class LazyCustomKeysTest {
 
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
-    val itemSize = with(rule.density) {
-        100.toDp()
-    }
+    val itemSize = with(rule.density) { 100.toDp() }
     val columns = 2
 
     @Test
@@ -58,9 +55,7 @@
 
         rule.setContent {
             LazyVerticalStaggeredGrid(StaggeredGridCells.Fixed(columns)) {
-                items(list, key = { it.id }) {
-                    Item("${it.id}")
-                }
+                items(list, key = { it.id }) { Item("${it.id}") }
             }
         }
 
@@ -73,26 +68,18 @@
 
         rule.setContent {
             LazyVerticalStaggeredGrid(StaggeredGridCells.Fixed(columns)) {
-                items(list, key = { it.id }) {
-                    Item(remember { "${it.id}" })
-                }
+                items(list, key = { it.id }) { Item(remember { "${it.id}" }) }
             }
         }
 
-        rule.runOnIdle {
-            list = listOf(list[0], list[2])
-        }
+        rule.runOnIdle { list = listOf(list[0], list[2]) }
 
         assertItems("0", "2")
     }
 
     @Test
     fun reordering_statesAreMoved_list() {
-        testReordering { grid ->
-            items(grid, key = { it.id }) {
-                Item(remember { "${it.id}" })
-            }
-        }
+        testReordering { grid -> items(grid, key = { it.id }) { Item(remember { "${it.id}" }) } }
     }
 
     @Test
@@ -108,9 +95,7 @@
     fun reordering_statesAreMoved_array() {
         testReordering { grid ->
             val array = grid.toTypedArray()
-            items(array, key = { it.id }) {
-                Item(remember { "${it.id}" })
-            }
+            items(array, key = { it.id }) { Item(remember { "${it.id}" }) }
         }
     }
 
@@ -127,9 +112,7 @@
     @Test
     fun reordering_statesAreMoved_itemsWithCount() {
         testReordering { grid ->
-            items(grid.size, key = { grid[it].id }) {
-                Item(remember { "${grid[it].id}" })
-            }
+            items(grid.size, key = { grid[it].id }) { Item(remember { "${grid[it].id}" }) }
         }
     }
 
@@ -140,15 +123,11 @@
 
         rule.setContent {
             LazyVerticalStaggeredGrid(StaggeredGridCells.Fixed(columns)) {
-                items(list, key = { it.id }) {
-                    Item(remember { counter++ }.toString())
-                }
+                items(list, key = { it.id }) { Item(remember { counter++ }.toString()) }
             }
         }
 
-        rule.runOnIdle {
-            list = listOf(MyClass(3), MyClass(4), MyClass(5), MyClass(6))
-        }
+        rule.runOnIdle { list = listOf(MyClass(3), MyClass(4), MyClass(5), MyClass(6)) }
 
         assertItems("3", "4", "5", "6")
     }
@@ -160,15 +139,11 @@
 
         rule.setContent {
             LazyVerticalStaggeredGrid(StaggeredGridCells.Fixed(columns)) {
-                items(list, key = { it.id }) {
-                    Item(remember { counter++ }.toString())
-                }
+                items(list, key = { it.id }) { Item(remember { counter++ }.toString()) }
             }
         }
 
-        rule.runOnIdle {
-            list = listOf(MyClass(1))
-        }
+        rule.runOnIdle { list = listOf(MyClass(1)) }
 
         assertItems("1")
     }
@@ -180,15 +155,11 @@
 
         rule.setContent {
             LazyVerticalStaggeredGrid(StaggeredGridCells.Fixed(columns)) {
-                items(list, key = { it.id }) {
-                    Item(remember { counter++ }.toString())
-                }
+                items(list, key = { it.id }) { Item(remember { counter++ }.toString()) }
             }
         }
 
-        rule.runOnIdle {
-            list = listOf(MyClass(1), MyClass(3))
-        }
+        rule.runOnIdle { list = listOf(MyClass(1), MyClass(3)) }
 
         assertItems("1", "3")
     }
@@ -196,9 +167,7 @@
     @Test
     fun mixingKeyedItemsAndNot() {
         testReordering { list ->
-            item {
-                Item("${list.first().id}")
-            }
+            item { Item("${list.first().id}") }
             items(list.subList(fromIndex = 1, toIndex = list.size), key = { it.id }) {
                 Item(remember { "${it.id}" })
             }
@@ -210,24 +179,18 @@
         val state = mutableStateOf(emptyList<Int>())
 
         rule.setContent {
-            LaunchedEffect(Unit) {
-                state.value = listOf(4, 1, 3)
-            }
+            LaunchedEffect(Unit) { state.value = listOf(4, 1, 3) }
 
             val list = state.value
 
             LazyVerticalStaggeredGrid(StaggeredGridCells.Fixed(columns), Modifier.fillMaxSize()) {
-                items(list, key = { it }) {
-                    Item(it.toString())
-                }
+                items(list, key = { it }) { Item(it.toString()) }
             }
         }
 
         assertItems("4", "1", "3")
 
-        rule.runOnIdle {
-            state.value = listOf(2, 4, 6, 1, 3, 5)
-        }
+        rule.runOnIdle { state.value = listOf(2, 4, 6, 1, 3, 5) }
 
         assertItems("2", "4", "6", "1", "3", "5")
     }
@@ -238,15 +201,11 @@
 
         rule.setContent {
             LazyVerticalStaggeredGrid(StaggeredGridCells.Fixed(columns)) {
-                items(list, key = { it.id }) {
-                    Item(remember { "${it.id}" })
-                }
+                items(list, key = { it.id }) { Item(remember { "${it.id}" }) }
             }
         }
 
-        rule.runOnIdle {
-            list.add(list.removeAt(1))
-        }
+        rule.runOnIdle { list.add(list.removeAt(1)) }
 
         assertItems("0", "2", "1")
     }
@@ -259,17 +218,11 @@
         rule.setContent {
             state = rememberLazyStaggeredGridState()
             LazyVerticalStaggeredGrid(StaggeredGridCells.Fixed(columns), state = state) {
-                items(list, key = { it.id }) {
-                    Item(remember { "${it.id}" })
-                }
+                items(list, key = { it.id }) { Item(remember { "${it.id}" }) }
             }
         }
 
-        rule.runOnIdle {
-            assertThat(
-                state.visibleKeys
-            ).isEqualTo(listOf(0, 1, 2))
-        }
+        rule.runOnIdle { assertThat(state.visibleKeys).isEqualTo(listOf(0, 1, 2)) }
     }
 
     @Test
@@ -280,21 +233,13 @@
         rule.setContent {
             state = rememberLazyStaggeredGridState()
             LazyVerticalStaggeredGrid(columns = StaggeredGridCells.Fixed(columns), state = state) {
-                items(list, key = { it.id }) {
-                    Item(remember { "${it.id}" })
-                }
+                items(list, key = { it.id }) { Item(remember { "${it.id}" }) }
             }
         }
 
-        rule.runOnIdle {
-            list = listOf(list[0], list[2], list[1])
-        }
+        rule.runOnIdle { list = listOf(list[0], list[2], list[1]) }
 
-        rule.runOnIdle {
-            assertThat(
-                state.visibleKeys
-            ).isEqualTo(listOf(0, 2, 1))
-        }
+        rule.runOnIdle { assertThat(state.visibleKeys).isEqualTo(listOf(0, 2, 1)) }
     }
 
     @Test
@@ -309,19 +254,13 @@
                 Modifier.size(itemSize * 2.5f),
                 state
             ) {
-                items(list) {
-                    Item(remember { "$it" })
-                }
+                items(list) { Item(remember { "$it" }) }
             }
         }
 
-        rule.runOnIdle {
-            list = (0..15).toList()
-        }
+        rule.runOnIdle { list = (0..15).toList() }
 
-        rule.runOnIdle {
-            assertThat(state.firstVisibleItemIndex).isEqualTo(0)
-        }
+        rule.runOnIdle { assertThat(state.firstVisibleItemIndex).isEqualTo(0) }
     }
 
     @Test
@@ -336,21 +275,15 @@
                 Modifier.size(itemSize * 2.5f),
                 state
             ) {
-                items(list, key = { it }) {
-                    Item(remember { "$it" })
-                }
+                items(list, key = { it }) { Item(remember { "$it" }) }
             }
         }
 
-        rule.runOnIdle {
-            list = (0..15).toList()
-        }
+        rule.runOnIdle { list = (0..15).toList() }
 
         rule.runOnIdle {
             assertThat(state.firstVisibleItemIndex).isEqualTo(10)
-            assertThat(
-                state.visibleKeys
-            ).isEqualTo(listOf(10, 11, 12, 13, 14, 15))
+            assertThat(state.visibleKeys).isEqualTo(listOf(10, 11, 12, 13, 14, 15))
         }
     }
 
@@ -366,21 +299,15 @@
                 Modifier.size(itemSize * 2.5f),
                 state
             ) {
-                items(list, key = { it }) {
-                    Item(remember { "$it" })
-                }
+                items(list, key = { it }) { Item(remember { "$it" }) }
             }
         }
 
-        rule.runOnIdle {
-            list = (0..15).toList()
-        }
+        rule.runOnIdle { list = (0..15).toList() }
 
         rule.runOnIdle {
             assertThat(state.firstVisibleItemIndex).isEqualTo(5)
-            assertThat(
-                state.visibleKeys
-            ).isEqualTo(listOf(5, 6, 7))
+            assertThat(state.visibleKeys).isEqualTo(listOf(5, 6, 7))
         }
     }
 
@@ -396,21 +323,15 @@
                 Modifier.size(itemSize * 2.5f),
                 state
             ) {
-                items(list, key = { it }) {
-                    Item(remember { "$it" })
-                }
+                items(list, key = { it }) { Item(remember { "$it" }) }
             }
         }
 
-        rule.runOnIdle {
-            list = (0..30).toList()
-        }
+        rule.runOnIdle { list = (0..30).toList() }
 
         rule.runOnIdle {
             assertThat(state.firstVisibleItemIndex).isEqualTo(20)
-            assertThat(
-                state.visibleKeys
-            ).isEqualTo(listOf(20, 21, 22, 23, 24, 25))
+            assertThat(state.visibleKeys).isEqualTo(listOf(20, 21, 22, 23, 24, 25))
         }
     }
 
@@ -426,15 +347,11 @@
                 Modifier.size(itemSize * 2.5f),
                 state
             ) {
-                items(list, key = { it }) {
-                    Item(remember { "$it" })
-                }
+                items(list, key = { it }) { Item(remember { "$it" }) }
             }
         }
 
-        rule.runOnIdle {
-            list = (0..20) - 8
-        }
+        rule.runOnIdle { list = (0..20) - 8 }
 
         rule.runOnIdle {
             assertThat(state.firstVisibleItemIndex).isEqualTo(8)
@@ -448,32 +365,29 @@
 
         rule.setContent {
             LazyVerticalStaggeredGrid(StaggeredGridCells.Fixed(1)) {
-                items(1, key = {
-                    keyCalls++
-                    0
-                }) {
+                items(
+                    1,
+                    key = {
+                        keyCalls++
+                        0
+                    }
+                ) {
                     Item("item")
                 }
             }
         }
 
-        rule.runOnIdle {
-            assertThat(keyCalls).isEqualTo(1)
-        }
+        rule.runOnIdle { assertThat(keyCalls).isEqualTo(1) }
     }
 
     private fun testReordering(content: LazyStaggeredGridScope.(List<MyClass>) -> Unit) {
         var list by mutableStateOf(listOf(MyClass(0), MyClass(1), MyClass(2)))
 
         rule.setContent {
-            LazyVerticalStaggeredGrid(StaggeredGridCells.Fixed(columns)) {
-                content(list)
-            }
+            LazyVerticalStaggeredGrid(StaggeredGridCells.Fixed(columns)) { content(list) }
         }
 
-        rule.runOnIdle {
-            list = listOf(list[0], list[2], list[1])
-        }
+        rule.runOnIdle { list = listOf(list[0], list[2], list[1]) }
 
         assertItems("0", "2", "1")
     }
@@ -482,7 +396,8 @@
         var currentTop = 0.dp
         var column = 0
         tags.forEach {
-            rule.onNodeWithTag(it)
+            rule
+                .onNodeWithTag(it)
                 .assertTopPositionInRootIsEqualTo(currentTop)
                 .assertHeightIsEqualTo(itemSize)
             ++column
@@ -495,14 +410,11 @@
 
     @Composable
     private fun Item(tag: String) {
-        Spacer(
-            Modifier
-                .testTag(tag)
-                .size(itemSize)
-        )
+        Spacer(Modifier.testTag(tag).size(itemSize))
     }
 
     private class MyClass(val id: Int)
 }
 
-val LazyStaggeredGridState.visibleKeys: List<Any> get() = layoutInfo.visibleItemsInfo.map { it.key }
+val LazyStaggeredGridState.visibleKeys: List<Any>
+    get() = layoutInfo.visibleItemsInfo.map { it.key }
diff --git a/compose/foundation/foundation/integration-tests/lazy-tests/src/androidTest/kotlin/androidx/compose/foundation/lazy/staggeredgrid/LazyStaggeredGridItemAppearanceAnimationTest.kt b/compose/foundation/foundation/integration-tests/lazy-tests/src/androidTest/kotlin/androidx/compose/foundation/lazy/staggeredgrid/LazyStaggeredGridItemAppearanceAnimationTest.kt
index 4163ab5..114c6b5 100644
--- a/compose/foundation/foundation/integration-tests/lazy-tests/src/androidTest/kotlin/androidx/compose/foundation/lazy/staggeredgrid/LazyStaggeredGridItemAppearanceAnimationTest.kt
+++ b/compose/foundation/foundation/integration-tests/lazy-tests/src/androidTest/kotlin/androidx/compose/foundation/lazy/staggeredgrid/LazyStaggeredGridItemAppearanceAnimationTest.kt
@@ -55,8 +55,7 @@
 @SdkSuppress(minSdkVersion = Build.VERSION_CODES.O)
 class LazyStaggeredGridItemAppearanceAnimationTest {
 
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
     private val itemSize: Int = 4
     private var itemSizeDp: Dp = Dp.Infinity
@@ -80,16 +79,10 @@
     fun oneItemAdded() {
         var list by mutableStateOf(emptyList<Color>())
         rule.setContent {
-            LazyGrid(containerSize = itemSizeDp) {
-                items(list, key = { it.toArgb() }) {
-                    Item(it)
-                }
-            }
+            LazyGrid(containerSize = itemSizeDp) { items(list, key = { it.toArgb() }) { Item(it) } }
         }
 
-        rule.runOnUiThread {
-            list = listOf(Color.Black)
-        }
+        rule.runOnUiThread { list = listOf(Color.Black) }
 
         onAnimationFrame { fraction ->
             assertPixels(mainAxisSize = itemSize) { _, _ -> Color.Black.copy(alpha = fraction) }
@@ -100,9 +93,7 @@
     fun noAnimationForInitialList() {
         rule.setContent {
             LazyGrid(containerSize = itemSizeDp) {
-                items(listOf(Color.Black), key = { it.toArgb() }) {
-                    Item(it)
-                }
+                items(listOf(Color.Black), key = { it.toArgb() }) { Item(it) }
             }
         }
 
@@ -114,15 +105,11 @@
         var list by mutableStateOf(listOf(Color.Black))
         rule.setContent {
             LazyGrid(containerSize = itemSizeDp * 3) {
-                items(list, key = { it.toArgb() }) {
-                    Item(it)
-                }
+                items(list, key = { it.toArgb() }) { Item(it) }
             }
         }
 
-        rule.runOnUiThread {
-            list = listOf(Color.Black, Color.Red, Color.Green)
-        }
+        rule.runOnUiThread { list = listOf(Color.Black, Color.Red, Color.Green) }
 
         onAnimationFrame { fraction ->
             assertPixels(itemSize * 3) { _, offset ->
@@ -146,9 +133,7 @@
             }
         }
 
-        rule.runOnUiThread {
-            list = listOf(Color.Black, Color.Red)
-        }
+        rule.runOnUiThread { list = listOf(Color.Black, Color.Red) }
 
         onAnimationFrame { fraction ->
             assertPixels(itemSize * 2) { _, offset ->
@@ -165,9 +150,7 @@
         var list by mutableStateOf(listOf(Color.Black, Color.Red, Color.Green))
         rule.setContent {
             LazyGrid(containerSize = itemSizeDp * 2) {
-                items(list, key = { it.toArgb() }) {
-                    Item(it)
-                }
+                items(list, key = { it.toArgb() }) { Item(it) }
             }
         }
 
@@ -198,49 +181,31 @@
     fun animatedItemChangesTheContainerSize() {
         var list by mutableStateOf(listOf(Color.Black))
         rule.setContent {
-            LazyGrid(containerSize = null) {
-                items(list, key = { it.toArgb() }) {
-                    Item(it)
-                }
-            }
+            LazyGrid(containerSize = null) { items(list, key = { it.toArgb() }) { Item(it) } }
         }
 
-        rule.onNodeWithTag(ContainerTag)
-            .assertHeightIsEqualTo(itemSizeDp)
+        rule.onNodeWithTag(ContainerTag).assertHeightIsEqualTo(itemSizeDp)
 
-        rule.runOnUiThread {
-            list = listOf(Color.Black, Color.Red)
-        }
+        rule.runOnUiThread { list = listOf(Color.Black, Color.Red) }
 
-        onAnimationFrame {
-            rule.onNodeWithTag(ContainerTag)
-                .assertHeightIsEqualTo(itemSizeDp * 2)
-        }
+        onAnimationFrame { rule.onNodeWithTag(ContainerTag).assertHeightIsEqualTo(itemSizeDp * 2) }
     }
 
     @Test
     fun removeItemBeingAnimated() {
         var list by mutableStateOf(emptyList<Color>())
         rule.setContent {
-            LazyGrid(containerSize = itemSizeDp) {
-                items(list, key = { it.toArgb() }) {
-                    Item(it)
-                }
-            }
+            LazyGrid(containerSize = itemSizeDp) { items(list, key = { it.toArgb() }) { Item(it) } }
         }
 
-        rule.runOnUiThread {
-            list = listOf(Color.Black)
-        }
+        rule.runOnUiThread { list = listOf(Color.Black) }
 
         onAnimationFrame { fraction ->
             if (fraction < 0.5f) {
                 assertPixels(itemSize) { _, _ -> Color.Black.copy(alpha = fraction) }
             } else {
                 if (fraction.isCloseTo(0.5f)) {
-                    rule.runOnUiThread {
-                        list = emptyList()
-                    }
+                    rule.runOnUiThread { list = emptyList() }
                 }
                 assertPixels(itemSize) { _, _ -> Color.Transparent }
             }
@@ -252,9 +217,7 @@
         var list by mutableStateOf(listOf(Color.Black, Color.Green, Color.Blue, Color.Yellow))
         rule.setContent {
             LazyGrid(containerSize = itemSizeDp * 2) {
-                items(list, key = { it.toArgb() }) {
-                    Item(it)
-                }
+                items(list, key = { it.toArgb() }) { Item(it) }
             }
         }
 
@@ -286,11 +249,7 @@
                 }
             } else {
                 if (fraction.isCloseTo(0.75f)) {
-                    rule.runOnUiThread {
-                        runBlocking {
-                            state.scrollBy(-itemSize * 1.5f)
-                        }
-                    }
+                    rule.runOnUiThread { runBlocking { state.scrollBy(-itemSize * 1.5f) } }
                 }
                 assertPixels(itemSize * 2) { _, offset ->
                     // red item is not displayed anywhere
@@ -311,15 +270,11 @@
         val containerSizeDp = itemSizeDp * 2
         rule.setContent {
             LazyGrid(cells = 2, containerSize = containerSizeDp, crossAxisSize = containerSizeDp) {
-                items(list, key = { it.toArgb() }) {
-                    Item(it)
-                }
+                items(list, key = { it.toArgb() }) { Item(it) }
             }
         }
 
-        rule.runOnUiThread {
-            list = listOf(Color.Green, Color.Red, Color.Blue, Color.Black)
-        }
+        rule.runOnUiThread { list = listOf(Color.Green, Color.Red, Color.Blue, Color.Black) }
 
         onAnimationFrame { fraction ->
             assertPixels(containerSize, containerSize) { x, y ->
@@ -340,11 +295,11 @@
         crossAxisSize: Int = this.crossAxisSize,
         expectedColorProvider: (x: Int, y: Int) -> Color?
     ) {
-        rule.onNodeWithTag(ContainerTag)
-            .captureToImage()
-            .assertPixels(IntSize(crossAxisSize, mainAxisSize)) {
-                expectedColorProvider(it.x, it.y)?.compositeOver(Color.White)
-            }
+        rule.onNodeWithTag(ContainerTag).captureToImage().assertPixels(
+            IntSize(crossAxisSize, mainAxisSize)
+        ) {
+            expectedColorProvider(it.x, it.y)?.compositeOver(Color.White)
+        }
     }
 
     private fun onAnimationFrame(duration: Long = Duration, onFrame: (fraction: Float) -> Unit) {
@@ -376,23 +331,23 @@
         LazyVerticalStaggeredGrid(
             StaggeredGridCells.Fixed(cells),
             state = state,
-            modifier = Modifier
-                .then(
-                    if (containerSize != null) {
-                        Modifier.requiredHeight(containerSize)
-                    } else {
-                        Modifier
-                    }
-                )
-                .background(Color.White)
-                .then(
-                    if (crossAxisSize != Dp.Unspecified) {
-                        Modifier.requiredWidth(crossAxisSize)
-                    } else {
-                        Modifier.fillMaxWidth()
-                    }
-                )
-                .testTag(ContainerTag),
+            modifier =
+                Modifier.then(
+                        if (containerSize != null) {
+                            Modifier.requiredHeight(containerSize)
+                        } else {
+                            Modifier
+                        }
+                    )
+                    .background(Color.White)
+                    .then(
+                        if (crossAxisSize != Dp.Unspecified) {
+                            Modifier.requiredWidth(crossAxisSize)
+                        } else {
+                            Modifier.fillMaxWidth()
+                        }
+                    )
+                    .testTag(ContainerTag),
             content = content
         )
     }
@@ -405,12 +360,7 @@
         animSpec: FiniteAnimationSpec<Float>? = AnimSpec
     ) {
         Box(
-            Modifier
-                .animateItem(
-                    fadeInSpec = animSpec,
-                    placementSpec = null,
-                    fadeOutSpec = null
-                )
+            Modifier.animateItem(fadeInSpec = animSpec, placementSpec = null, fadeOutSpec = null)
                 .background(color)
                 .requiredHeight(size)
                 .requiredWidth(crossAxisSize)
diff --git a/compose/foundation/foundation/integration-tests/lazy-tests/src/androidTest/kotlin/androidx/compose/foundation/lazy/staggeredgrid/LazyStaggeredGridItemDisappearanceAnimationTest.kt b/compose/foundation/foundation/integration-tests/lazy-tests/src/androidTest/kotlin/androidx/compose/foundation/lazy/staggeredgrid/LazyStaggeredGridItemDisappearanceAnimationTest.kt
index 4b1a02c..86a5294 100644
--- a/compose/foundation/foundation/integration-tests/lazy-tests/src/androidTest/kotlin/androidx/compose/foundation/lazy/staggeredgrid/LazyStaggeredGridItemDisappearanceAnimationTest.kt
+++ b/compose/foundation/foundation/integration-tests/lazy-tests/src/androidTest/kotlin/androidx/compose/foundation/lazy/staggeredgrid/LazyStaggeredGridItemDisappearanceAnimationTest.kt
@@ -58,8 +58,7 @@
 @SdkSuppress(minSdkVersion = Build.VERSION_CODES.O)
 class LazyStaggeredGridItemDisappearanceAnimationTest {
 
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
     // the numbers should be divisible by 8 to avoid the rounding issues as we run 4 or 8 frames
     // of the animation.
@@ -85,16 +84,10 @@
     fun oneItemRemoved() {
         var list by mutableStateOf(listOf(Color.Black))
         rule.setContent {
-            LazyGrid(containerSize = itemSizeDp) {
-                items(list, key = { it.toArgb() }) {
-                    Item(it)
-                }
-            }
+            LazyGrid(containerSize = itemSizeDp) { items(list, key = { it.toArgb() }) { Item(it) } }
         }
 
-        rule.runOnUiThread {
-            list = emptyList()
-        }
+        rule.runOnUiThread { list = emptyList() }
 
         onAnimationFrame { fraction ->
             assertPixels(mainAxisSize = itemSize) { _, _ ->
@@ -108,15 +101,11 @@
         var list by mutableStateOf(listOf(Color.Black, Color.Red, Color.Green))
         rule.setContent {
             LazyGrid(containerSize = itemSizeDp * 3) {
-                items(list, key = { it.toArgb() }) {
-                    Item(it)
-                }
+                items(list, key = { it.toArgb() }) { Item(it) }
             }
         }
 
-        rule.runOnUiThread {
-            list = listOf(Color.Black)
-        }
+        rule.runOnUiThread { list = listOf(Color.Black) }
 
         onAnimationFrame { fraction ->
             assertPixels(itemSize * 3) { _, offset ->
@@ -135,15 +124,11 @@
         var list by mutableStateOf(listOf(Color.Black, Color.Red, Color.Green))
         rule.setContent {
             LazyGrid(containerSize = itemSizeDp * 3, reverseLayout = true) {
-                items(list, key = { it.toArgb() }) {
-                    Item(it)
-                }
+                items(list, key = { it.toArgb() }) { Item(it) }
             }
         }
 
-        rule.runOnUiThread {
-            list = listOf(Color.Black)
-        }
+        rule.runOnUiThread { list = listOf(Color.Black) }
 
         onAnimationFrame { fraction ->
             assertPixels(itemSize * 3) { _, offset ->
@@ -165,15 +150,11 @@
                 reverseLayout = true,
                 contentPadding = PaddingValues(bottom = itemSizeDp)
             ) {
-                items(list, key = { it.toArgb() }) {
-                    Item(it)
-                }
+                items(list, key = { it.toArgb() }) { Item(it) }
             }
         }
 
-        rule.runOnUiThread {
-            list = listOf(Color.Black)
-        }
+        rule.runOnUiThread { list = listOf(Color.Black) }
 
         onAnimationFrame { fraction ->
             assertPixels(itemSize * 3) { _, offset ->
@@ -197,9 +178,7 @@
             }
         }
 
-        rule.runOnUiThread {
-            list = emptyList()
-        }
+        rule.runOnUiThread { list = emptyList() }
 
         onAnimationFrame { fraction ->
             assertPixels(itemSize * 2) { _, offset ->
@@ -216,9 +195,7 @@
         var list by mutableStateOf(listOf(Color.Black, Color.Red, Color.Blue, Color.Green))
         rule.setContent {
             LazyGrid(containerSize = itemSizeDp * 2) {
-                items(list, key = { it.toArgb() }) {
-                    Item(it)
-                }
+                items(list, key = { it.toArgb() }) { Item(it) }
             }
         }
 
@@ -249,23 +226,15 @@
     fun itemsBeingRemovedAreAffectingTheContainerSizeForTheDurationOfAnimation() {
         var list by mutableStateOf(listOf(Color.Black, Color.Red))
         rule.setContent {
-            LazyGrid(containerSize = null) {
-                items(list, key = { it.toArgb() }) {
-                    Item(it)
-                }
-            }
+            LazyGrid(containerSize = null) { items(list, key = { it.toArgb() }) { Item(it) } }
         }
 
-        rule.onNodeWithTag(ContainerTag)
-            .assertHeightIsEqualTo(itemSizeDp * 2)
+        rule.onNodeWithTag(ContainerTag).assertHeightIsEqualTo(itemSizeDp * 2)
 
-        rule.runOnUiThread {
-            list = listOf(Color.Black)
-        }
+        rule.runOnUiThread { list = listOf(Color.Black) }
 
         onAnimationFrame { fraction ->
-            val heightDp = rule.onNodeWithTag(ContainerTag)
-                .getBoundsInRoot().height
+            val heightDp = rule.onNodeWithTag(ContainerTag).getBoundsInRoot().height
             val heightPx = with(rule.density) { heightDp.roundToPx() }
             Truth.assertWithMessage("Height on fraction=$fraction")
                 .that(heightPx)
@@ -289,14 +258,11 @@
         var list by mutableStateOf(listOf(Color.Black, Color.Red))
         rule.setContent {
             LazyGrid(containerSize = null, reverseLayout = true) {
-                items(list, key = { it.toArgb() }) {
-                    Item(it)
-                }
+                items(list, key = { it.toArgb() }) { Item(it) }
             }
         }
 
-        rule.onNodeWithTag(ContainerTag)
-            .assertHeightIsEqualTo(itemSizeDp * 2)
+        rule.onNodeWithTag(ContainerTag).assertHeightIsEqualTo(itemSizeDp * 2)
 
         assertPixels(itemSize * 2) { _, offset ->
             when (offset) {
@@ -305,13 +271,10 @@
             }
         }
 
-        rule.runOnUiThread {
-            list = listOf(Color.Black)
-        }
+        rule.runOnUiThread { list = listOf(Color.Black) }
 
         onAnimationFrame { fraction ->
-            val heightDp = rule.onNodeWithTag(ContainerTag)
-                .getBoundsInRoot().height
+            val heightDp = rule.onNodeWithTag(ContainerTag).getBoundsInRoot().height
             val heightPx = with(rule.density) { heightDp.roundToPx() }
             Truth.assertWithMessage("Height on fraction=$fraction")
                 .that(heightPx)
@@ -334,25 +297,17 @@
     fun reAddItemBeingAnimated_withoutAppearanceAnimation() {
         var list by mutableStateOf(listOf(Color.Black))
         rule.setContent {
-            LazyGrid(containerSize = itemSizeDp) {
-                items(list, key = { it.toArgb() }) {
-                    Item(it)
-                }
-            }
+            LazyGrid(containerSize = itemSizeDp) { items(list, key = { it.toArgb() }) { Item(it) } }
         }
 
-        rule.runOnUiThread {
-            list = emptyList()
-        }
+        rule.runOnUiThread { list = emptyList() }
 
         onAnimationFrame { fraction ->
             if (fraction < 0.5f) {
                 assertPixels(itemSize) { _, _ -> Color.Black.copy(alpha = 1f - fraction) }
             } else {
                 if (fraction.isCloseTo(0.5f)) {
-                    rule.runOnUiThread {
-                        list = listOf(Color.Black)
-                    }
+                    rule.runOnUiThread { list = listOf(Color.Black) }
                 }
                 assertPixels(itemSize) { _, _ -> Color.Black }
             }
@@ -370,22 +325,16 @@
             }
         }
 
-        rule.runOnUiThread {
-            list = emptyList()
-        }
+        rule.runOnUiThread { list = emptyList() }
 
         onAnimationFrame { fraction ->
             if (fraction < 0.5f) {
                 assertPixels(itemSize) { _, _ -> Color.Black.copy(alpha = 1f - fraction) }
             } else {
                 if (fraction.isCloseTo(0.5f)) {
-                    rule.runOnUiThread {
-                        list = listOf(Color.Black)
-                    }
+                    rule.runOnUiThread { list = listOf(Color.Black) }
                 }
-                assertPixels(itemSize) { _, _ ->
-                Color.Black.copy(alpha = fraction)
-                }
+                assertPixels(itemSize) { _, _ -> Color.Black.copy(alpha = fraction) }
             }
         }
     }
@@ -401,22 +350,16 @@
             }
         }
 
-        rule.runOnUiThread {
-            list = listOf(Color.Black)
-        }
+        rule.runOnUiThread { list = listOf(Color.Black) }
 
         onAnimationFrame { fraction ->
             if (fraction < 0.5f) {
                 assertPixels(itemSize) { _, _ -> Color.Black.copy(alpha = fraction) }
             } else {
                 if (fraction.isCloseTo(0.5f)) {
-                    rule.runOnUiThread {
-                        list = emptyList()
-                    }
+                    rule.runOnUiThread { list = emptyList() }
                 }
-                assertPixels(itemSize) { _, _ ->
-                    Color.Black.copy(alpha = 1f - fraction)
-                }
+                assertPixels(itemSize) { _, _ -> Color.Black.copy(alpha = 1f - fraction) }
             }
         }
     }
@@ -426,15 +369,11 @@
         var list by mutableStateOf(listOf(Color.Black, Color.Green))
         rule.setContent {
             LazyGrid(cells = 2, containerSize = itemSizeDp, crossAxisSize = itemSizeDp * 2) {
-                items(list, key = { it.toArgb() }) {
-                    Item(it)
-                }
+                items(list, key = { it.toArgb() }) { Item(it) }
             }
         }
 
-        rule.runOnUiThread {
-            list = emptyList()
-        }
+        rule.runOnUiThread { list = emptyList() }
 
         onAnimationFrame { fraction ->
             assertPixels(mainAxisSize = itemSize, crossAxisSize = itemSize * 2) { x, _ ->
@@ -452,11 +391,11 @@
         crossAxisSize: Int = this.crossAxisSize,
         expectedColorProvider: (x: Int, y: Int) -> Color?
     ) {
-        rule.onNodeWithTag(ContainerTag)
-            .captureToImage()
-            .assertPixels(IntSize(crossAxisSize, mainAxisSize)) {
-                expectedColorProvider(it.x, it.y)?.compositeOver(Color.White)
-            }
+        rule.onNodeWithTag(ContainerTag).captureToImage().assertPixels(
+            IntSize(crossAxisSize, mainAxisSize)
+        ) {
+            expectedColorProvider(it.x, it.y)?.compositeOver(Color.White)
+        }
     }
 
     private fun onAnimationFrame(duration: Long = Duration, onFrame: (fraction: Float) -> Unit) {
@@ -490,22 +429,23 @@
         LazyVerticalStaggeredGrid(
             StaggeredGridCells.Fixed(cells),
             state = state,
-            modifier = Modifier.then(
-                if (containerSize != null) {
-                    Modifier.requiredHeight(containerSize)
-                } else {
-                    Modifier
-                }
-            )
-                .background(Color.White)
-                .then(
-                    if (crossAxisSize != Dp.Unspecified) {
-                        Modifier.requiredWidth(crossAxisSize)
-                    } else {
-                        Modifier.fillMaxWidth()
-                    }
-                )
-                .testTag(ContainerTag),
+            modifier =
+                Modifier.then(
+                        if (containerSize != null) {
+                            Modifier.requiredHeight(containerSize)
+                        } else {
+                            Modifier
+                        }
+                    )
+                    .background(Color.White)
+                    .then(
+                        if (crossAxisSize != Dp.Unspecified) {
+                            Modifier.requiredWidth(crossAxisSize)
+                        } else {
+                            Modifier.fillMaxWidth()
+                        }
+                    )
+                    .testTag(ContainerTag),
             contentPadding = contentPadding,
             reverseLayout = reverseLayout,
             content = content
@@ -521,8 +461,7 @@
         appearanceSpec: FiniteAnimationSpec<Float>? = null
     ) {
         Box(
-            Modifier
-                .animateItem(
+            Modifier.animateItem(
                     fadeInSpec = appearanceSpec,
                     placementSpec = null,
                     fadeOutSpec = disappearanceSpec
diff --git a/compose/foundation/foundation/integration-tests/lazy-tests/src/androidTest/kotlin/androidx/compose/foundation/lazy/staggeredgrid/LazyStaggeredGridItemPlacementAnimationTest.kt b/compose/foundation/foundation/integration-tests/lazy-tests/src/androidTest/kotlin/androidx/compose/foundation/lazy/staggeredgrid/LazyStaggeredGridItemPlacementAnimationTest.kt
index d117e7f..da69f3b 100644
--- a/compose/foundation/foundation/integration-tests/lazy-tests/src/androidTest/kotlin/androidx/compose/foundation/lazy/staggeredgrid/LazyStaggeredGridItemPlacementAnimationTest.kt
+++ b/compose/foundation/foundation/integration-tests/lazy-tests/src/androidTest/kotlin/androidx/compose/foundation/lazy/staggeredgrid/LazyStaggeredGridItemPlacementAnimationTest.kt
@@ -67,11 +67,13 @@
 @RunWith(Parameterized::class)
 class LazyStaggeredGridItemPlacementAnimationTest(private val config: Config) {
 
-    private val isVertical: Boolean get() = config.isVertical
-    private val reverseLayout: Boolean get() = config.reverseLayout
+    private val isVertical: Boolean
+        get() = config.isVertical
 
-    @get:Rule
-    val rule = createComposeRule()
+    private val reverseLayout: Boolean
+        get() = config.reverseLayout
+
+    @get:Rule val rule = createComposeRule()
 
     // the numbers should be divisible by 8 to avoid the rounding issues as we run 4 or 8 frames
     // of the animation.
@@ -105,22 +107,11 @@
     @Test
     fun reorderTwoItems() {
         var list by mutableStateOf(listOf(0, 1))
-        rule.setContent {
-            LazyStaggeredGrid(1) {
-                items(list, key = { it }) {
-                    Item(it)
-                }
-            }
-        }
+        rule.setContent { LazyStaggeredGrid(1) { items(list, key = { it }) { Item(it) } } }
 
-        assertPositions(
-            0 to AxisOffset(0f, 0f),
-            1 to AxisOffset(0f, itemSize)
-        )
+        assertPositions(0 to AxisOffset(0f, 0f), 1 to AxisOffset(0f, itemSize))
 
-        rule.runOnUiThread {
-            list = listOf(1, 0)
-        }
+        rule.runOnUiThread { list = listOf(1, 0) }
 
         onAnimationFrame { fraction ->
             assertPositions(
@@ -134,13 +125,7 @@
     @Test
     fun reorderTwoByTwoItems() {
         var list by mutableStateOf(listOf(0, 1, 2, 3))
-        rule.setContent {
-            LazyStaggeredGrid(2) {
-                items(list, key = { it }) {
-                    Item(it)
-                }
-            }
-        }
+        rule.setContent { LazyStaggeredGrid(2) { items(list, key = { it }) { Item(it) } } }
 
         assertPositions(
             0 to AxisOffset(0f, 0f),
@@ -149,9 +134,7 @@
             3 to AxisOffset(itemSize, itemSize)
         )
 
-        rule.runOnUiThread {
-            list = listOf(3, 2, 1, 0)
-        }
+        rule.runOnUiThread { list = listOf(3, 2, 1, 0) }
 
         onAnimationFrame { fraction ->
             val increasing = 0 + itemSize * fraction
@@ -169,13 +152,7 @@
     @Test
     fun reorderTwoItems_layoutInfoHasFinalPositions() {
         var list by mutableStateOf(listOf(0, 1, 2, 3))
-        rule.setContent {
-            LazyStaggeredGrid(2) {
-                items(list, key = { it }) {
-                    Item(it)
-                }
-            }
-        }
+        rule.setContent { LazyStaggeredGrid(2) { items(list, key = { it }) { Item(it) } } }
 
         assertLayoutInfoPositions(
             0 to AxisOffset(0f, 0f),
@@ -184,9 +161,7 @@
             3 to AxisOffset(itemSize, itemSize)
         )
 
-        rule.runOnUiThread {
-            list = listOf(3, 2, 1, 0)
-        }
+        rule.runOnUiThread { list = listOf(3, 2, 1, 0) }
 
         onAnimationFrame {
             // fraction doesn't affect the offsets in layout info
@@ -202,13 +177,7 @@
     @Test
     fun reorderFirstAndLastItems() {
         var list by mutableStateOf(listOf(0, 1, 2, 3, 4))
-        rule.setContent {
-            LazyStaggeredGrid(1) {
-                items(list, key = { it }) {
-                    Item(it)
-                }
-            }
-        }
+        rule.setContent { LazyStaggeredGrid(1) { items(list, key = { it }) { Item(it) } } }
 
         assertPositions(
             0 to AxisOffset(0f, 0f),
@@ -218,9 +187,7 @@
             4 to AxisOffset(0f, itemSize * 4)
         )
 
-        rule.runOnUiThread {
-            list = listOf(4, 1, 2, 3, 0)
-        }
+        rule.runOnUiThread { list = listOf(4, 1, 2, 3, 0) }
 
         onAnimationFrame { fraction ->
             assertPositions(
@@ -237,13 +204,7 @@
     @Test
     fun moveFirstItemToEndCausingAllItemsToAnimate() {
         var list by mutableStateOf(listOf(0, 1, 2, 3, 4, 5))
-        rule.setContent {
-            LazyStaggeredGrid(2) {
-                items(list, key = { it }) {
-                    Item(it)
-                }
-            }
-        }
+        rule.setContent { LazyStaggeredGrid(2) { items(list, key = { it }) { Item(it) } } }
 
         assertPositions(
             0 to AxisOffset(0f, 0f),
@@ -254,9 +215,7 @@
             5 to AxisOffset(itemSize, itemSize * 2)
         )
 
-        rule.runOnUiThread {
-            list = listOf(1, 2, 3, 4, 5, 0)
-        }
+        rule.runOnUiThread { list = listOf(1, 2, 3, 4, 5, 0) }
 
         onAnimationFrame { fraction ->
             val increasingX = 0 + itemSize * fraction
@@ -284,13 +243,10 @@
             }
         }
 
-        rule.runOnUiThread {
-            size = itemSizeDp * 2
-        }
+        rule.runOnUiThread { size = itemSizeDp * 2 }
         rule.mainClock.advanceTimeByFrame()
 
-        rule.onNodeWithTag("1")
-            .assertMainAxisSizeIsEqualTo(size)
+        rule.onNodeWithTag("1").assertMainAxisSizeIsEqualTo(size)
 
         onAnimationFrame { fraction ->
             assertPositions(
@@ -314,9 +270,7 @@
             }
         }
 
-        rule.runOnUiThread {
-            list = listOf(1, 2, 3, 4, 0)
-        }
+        rule.runOnUiThread { list = listOf(1, 2, 3, 4, 0) }
 
         onAnimationFrame { fraction ->
             assertPositions(
@@ -342,9 +296,7 @@
             }
         }
 
-        rule.runOnUiThread {
-            list = listOf(1, 2, 3, 4, 0)
-        }
+        rule.runOnUiThread { list = listOf(1, 2, 3, 4, 0) }
 
         onAnimationFrame(duration = Duration * 2) { fraction ->
             val shorterAnimFraction = (fraction * 2).coerceAtMost(1f)
@@ -378,9 +330,7 @@
             3 to AxisOffset(0f, itemSize)
         )
 
-        rule.runOnUiThread {
-            list = listOf(2, 0)
-        }
+        rule.runOnUiThread { list = listOf(2, 0) }
 
         onAnimationFrame { fraction ->
             assertPositions(
@@ -405,9 +355,7 @@
             }
         }
 
-        rule.runOnUiThread {
-            list = listOf(2, 0)
-        }
+        rule.runOnUiThread { list = listOf(2, 0) }
 
         onAnimationFrame { fraction ->
             assertPositions(
@@ -424,13 +372,8 @@
     fun animateSpacingChange() {
         var currentSpacing by mutableStateOf(0.dp)
         rule.setContent {
-            LazyStaggeredGrid(
-                1,
-                spacing = currentSpacing
-            ) {
-                items(listOf(0, 1), key = { it }) {
-                    Item(it)
-                }
+            LazyStaggeredGrid(1, spacing = currentSpacing) {
+                items(listOf(0, 1), key = { it }) { Item(it) }
             }
         }
 
@@ -439,9 +382,7 @@
             1 to AxisOffset(0f, itemSize),
         )
 
-        rule.runOnUiThread {
-            currentSpacing = spacingDp
-        }
+        rule.runOnUiThread { currentSpacing = spacingDp }
         rule.mainClock.advanceTimeByFrame()
 
         onAnimationFrame { fraction ->
@@ -459,11 +400,7 @@
         val gridSize = itemSize * 3
         val gridSizeDp = with(rule.density) { gridSize.toDp() }
         rule.setContent {
-            LazyStaggeredGrid(2, maxSize = gridSizeDp) {
-                items(list, key = { it }) {
-                    Item(it)
-                }
-            }
+            LazyStaggeredGrid(2, maxSize = gridSizeDp) { items(list, key = { it }) { Item(it) } }
         }
 
         assertPositions(
@@ -475,36 +412,31 @@
             5 to AxisOffset(itemSize, itemSize * 2)
         )
 
-        rule.runOnUiThread {
-            list = listOf(0, 8, 2, 3, 4, 5, 6, 7, 1, 9, 10, 11)
-        }
+        rule.runOnUiThread { list = listOf(0, 8, 2, 3, 4, 5, 6, 7, 1, 9, 10, 11) }
 
         onAnimationFrame { fraction ->
             // item 1 moves to and item 8 moves from `gridSize`, right after the end edge
             val item1Offset = AxisOffset(itemSize, 0 + gridSize * fraction)
-            val item8Offset =
-                AxisOffset(itemSize, gridSize - gridSize * fraction)
-            val expected = mutableListOf<Pair<Any, Offset>>().apply {
-                add(0 to AxisOffset(0f, 0f))
-                if (item1Offset.mainAxis < itemSize * 3) {
-                    add(1 to item1Offset)
-                } else {
-                    rule.onNodeWithTag("1").assertIsNotDisplayed()
+            val item8Offset = AxisOffset(itemSize, gridSize - gridSize * fraction)
+            val expected =
+                mutableListOf<Pair<Any, Offset>>().apply {
+                    add(0 to AxisOffset(0f, 0f))
+                    if (item1Offset.mainAxis < itemSize * 3) {
+                        add(1 to item1Offset)
+                    } else {
+                        rule.onNodeWithTag("1").assertIsNotDisplayed()
+                    }
+                    add(2 to AxisOffset(0f, itemSize))
+                    add(3 to AxisOffset(itemSize, itemSize))
+                    add(4 to AxisOffset(0f, itemSize * 2))
+                    add(5 to AxisOffset(itemSize, itemSize * 2))
+                    if (item8Offset.mainAxis < itemSize * 3) {
+                        add(8 to item8Offset)
+                    } else {
+                        rule.onNodeWithTag("8").assertIsNotDisplayed()
+                    }
                 }
-                add(2 to AxisOffset(0f, itemSize))
-                add(3 to AxisOffset(itemSize, itemSize))
-                add(4 to AxisOffset(0f, itemSize * 2))
-                add(5 to AxisOffset(itemSize, itemSize * 2))
-                if (item8Offset.mainAxis < itemSize * 3) {
-                    add(8 to item8Offset)
-                } else {
-                    rule.onNodeWithTag("8").assertIsNotDisplayed()
-                }
-            }
-            assertPositions(
-                expected = expected.toTypedArray(),
-                fraction = fraction
-            )
+            assertPositions(expected = expected.toTypedArray(), fraction = fraction)
         }
     }
 
@@ -513,9 +445,7 @@
         var list by mutableStateOf(listOf(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11))
         rule.setContent {
             LazyStaggeredGrid(2, maxSize = itemSizeDp * 3, startIndex = 6) {
-                items(list, key = { it }) {
-                    Item(it)
-                }
+                items(list, key = { it }) { Item(it) }
             }
         }
 
@@ -528,35 +458,31 @@
             11 to AxisOffset(itemSize, itemSize * 2)
         )
 
-        rule.runOnUiThread {
-            list = listOf(0, 8, 2, 3, 4, 5, 6, 7, 1, 9, 10, 11)
-        }
+        rule.runOnUiThread { list = listOf(0, 8, 2, 3, 4, 5, 6, 7, 1, 9, 10, 11) }
 
         onAnimationFrame { fraction ->
             // item 1 moves from and item 8 moves to `0 - itemSize`, right before the start edge
             val item8Offset = AxisOffset(0f, itemSize - itemSize * 2 * fraction)
             val item1Offset = AxisOffset(0f, -itemSize + itemSize * 2 * fraction)
-            val expected = mutableListOf<Pair<Any, Offset>>().apply {
-                if (item1Offset.mainAxis > -itemSize) {
-                    add(1 to item1Offset)
-                } else {
-                    rule.onNodeWithTag("1").assertIsNotDisplayed()
+            val expected =
+                mutableListOf<Pair<Any, Offset>>().apply {
+                    if (item1Offset.mainAxis > -itemSize) {
+                        add(1 to item1Offset)
+                    } else {
+                        rule.onNodeWithTag("1").assertIsNotDisplayed()
+                    }
+                    add(6 to AxisOffset(0f, 0f))
+                    add(7 to AxisOffset(itemSize, 0f))
+                    if (item8Offset.mainAxis > -itemSize) {
+                        add(8 to item8Offset)
+                    } else {
+                        rule.onNodeWithTag("8").assertIsNotDisplayed()
+                    }
+                    add(9 to AxisOffset(itemSize, itemSize))
+                    add(10 to AxisOffset(0f, itemSize * 2))
+                    add(11 to AxisOffset(itemSize, itemSize * 2))
                 }
-                add(6 to AxisOffset(0f, 0f))
-                add(7 to AxisOffset(itemSize, 0f))
-                if (item8Offset.mainAxis > -itemSize) {
-                    add(8 to item8Offset)
-                } else {
-                    rule.onNodeWithTag("8").assertIsNotDisplayed()
-                }
-                add(9 to AxisOffset(itemSize, itemSize))
-                add(10 to AxisOffset(0f, itemSize * 2))
-                add(11 to AxisOffset(itemSize, itemSize * 2))
-            }
-            assertPositions(
-                expected = expected.toTypedArray(),
-                fraction = fraction
-            )
+            assertPositions(expected = expected.toTypedArray(), fraction = fraction)
         }
     }
 
@@ -564,16 +490,10 @@
     fun moveFirstItemToEndCausingAllItemsToAnimate_withSpacing() {
         var list by mutableStateOf(listOf(0, 1, 2, 3, 4, 5, 6, 7))
         rule.setContent {
-            LazyStaggeredGrid(2, spacing = spacingDp) {
-                items(list, key = { it }) {
-                    Item(it)
-                }
-            }
+            LazyStaggeredGrid(2, spacing = spacingDp) { items(list, key = { it }) { Item(it) } }
         }
 
-        rule.runOnUiThread {
-            list = listOf(1, 2, 3, 4, 5, 6, 7, 0)
-        }
+        rule.runOnUiThread { list = listOf(1, 2, 3, 4, 5, 6, 7, 0) }
 
         onAnimationFrame { fraction ->
             val increasingX = fraction * itemSize
@@ -581,20 +501,19 @@
             assertPositions(
                 0 to AxisOffset(increasingX, itemSizePlusSpacing * 3 * fraction),
                 1 to AxisOffset(decreasingX, 0f),
-                2 to AxisOffset(
-                    increasingX,
-                    itemSizePlusSpacing - itemSizePlusSpacing * fraction
-                ),
+                2 to AxisOffset(increasingX, itemSizePlusSpacing - itemSizePlusSpacing * fraction),
                 3 to AxisOffset(decreasingX, itemSizePlusSpacing),
-                4 to AxisOffset(
-                    increasingX,
-                    itemSizePlusSpacing * 2 - itemSizePlusSpacing * fraction
-                ),
+                4 to
+                    AxisOffset(
+                        increasingX,
+                        itemSizePlusSpacing * 2 - itemSizePlusSpacing * fraction
+                    ),
                 5 to AxisOffset(decreasingX, itemSizePlusSpacing * 2),
-                6 to AxisOffset(
-                    increasingX,
-                    itemSizePlusSpacing * 3 - itemSizePlusSpacing * fraction
-                ),
+                6 to
+                    AxisOffset(
+                        increasingX,
+                        itemSizePlusSpacing * 3 - itemSizePlusSpacing * fraction
+                    ),
                 7 to AxisOffset(decreasingX, itemSizePlusSpacing * 3),
                 fraction = fraction
             )
@@ -607,14 +526,8 @@
         val gridSize = itemSize * 3 + spacing * 2
         val gridSizeDp = with(rule.density) { gridSize.toDp() }
         rule.setContent {
-            LazyStaggeredGrid(
-                2,
-                maxSize = gridSizeDp,
-                spacing = spacingDp
-            ) {
-                items(list, key = { it }) {
-                    Item(it)
-                }
+            LazyStaggeredGrid(2, maxSize = gridSizeDp, spacing = spacingDp) {
+                items(list, key = { it }) { Item(it) }
             }
         }
 
@@ -627,9 +540,7 @@
             5 to AxisOffset(itemSize, itemSizePlusSpacing * 2)
         )
 
-        rule.runOnUiThread {
-            list = listOf(0, 8, 2, 3, 4, 5, 6, 7, 1, 9)
-        }
+        rule.runOnUiThread { list = listOf(0, 8, 2, 3, 4, 5, 6, 7, 1, 9) }
 
         val afterLastVisibleItem = itemSize * 3 + spacing * 3
         onAnimationFrame { fraction ->
@@ -638,23 +549,21 @@
             val item8Offset =
                 AxisOffset(itemSize, afterLastVisibleItem - afterLastVisibleItem * fraction)
             val screenSize = itemSize * 3 + spacing * 2
-            val expected = mutableListOf<Pair<Any, Offset>>().apply {
-                add(0 to AxisOffset(0f, 0f))
-                if (item1Offset.mainAxis < screenSize) {
-                    add(1 to item1Offset)
+            val expected =
+                mutableListOf<Pair<Any, Offset>>().apply {
+                    add(0 to AxisOffset(0f, 0f))
+                    if (item1Offset.mainAxis < screenSize) {
+                        add(1 to item1Offset)
+                    }
+                    add(2 to AxisOffset(0f, itemSizePlusSpacing))
+                    add(3 to AxisOffset(itemSize, itemSizePlusSpacing))
+                    add(4 to AxisOffset(0f, itemSizePlusSpacing * 2))
+                    add(5 to AxisOffset(itemSize, itemSizePlusSpacing * 2))
+                    if (item8Offset.mainAxis < screenSize) {
+                        add(8 to item8Offset)
+                    }
                 }
-                add(2 to AxisOffset(0f, itemSizePlusSpacing))
-                add(3 to AxisOffset(itemSize, itemSizePlusSpacing))
-                add(4 to AxisOffset(0f, itemSizePlusSpacing * 2))
-                add(5 to AxisOffset(itemSize, itemSizePlusSpacing * 2))
-                if (item8Offset.mainAxis < screenSize) {
-                    add(8 to item8Offset)
-                }
-            }
-            assertPositions(
-                expected = expected.toTypedArray(),
-                fraction = fraction
-            )
+            assertPositions(expected = expected.toTypedArray(), fraction = fraction)
         }
     }
 
@@ -668,9 +577,7 @@
                 spacing = spacingDp,
                 startIndex = 4
             ) {
-                items(list, key = { it }) {
-                    Item(it)
-                }
+                items(list, key = { it }) { Item(it) }
             }
         }
 
@@ -683,39 +590,30 @@
             9 to AxisOffset(itemSize, itemSizePlusSpacing * 2)
         )
 
-        rule.runOnUiThread {
-            list = listOf(0, 8, 2, 3, 4, 5, 6, 7, 1, 9, 10, 11)
-        }
+        rule.runOnUiThread { list = listOf(0, 8, 2, 3, 4, 5, 6, 7, 1, 9, 10, 11) }
 
         onAnimationFrame { fraction ->
             // item 8 moves to and item 1 moves from `-itemSizePlusSpacing`,
             // right before the start edge
-            val item1Offset = AxisOffset(
-                0f,
-                -itemSizePlusSpacing + (itemSizePlusSpacing * 3) * fraction
-            )
-            val item8Offset = AxisOffset(
-                0f,
-                itemSizePlusSpacing * 2 -
-                    (itemSizePlusSpacing * 3) * fraction
-            )
-            val expected = mutableListOf<Pair<Any, Offset>>().apply {
-                if (item1Offset.mainAxis > -itemSize) {
-                    add(1 to item1Offset)
+            val item1Offset =
+                AxisOffset(0f, -itemSizePlusSpacing + (itemSizePlusSpacing * 3) * fraction)
+            val item8Offset =
+                AxisOffset(0f, itemSizePlusSpacing * 2 - (itemSizePlusSpacing * 3) * fraction)
+            val expected =
+                mutableListOf<Pair<Any, Offset>>().apply {
+                    if (item1Offset.mainAxis > -itemSize) {
+                        add(1 to item1Offset)
+                    }
+                    add(4 to AxisOffset(0f, 0f))
+                    add(5 to AxisOffset(itemSize, 0f))
+                    add(6 to AxisOffset(0f, itemSizePlusSpacing))
+                    add(7 to AxisOffset(itemSize, itemSizePlusSpacing))
+                    if (item8Offset.mainAxis > -itemSize) {
+                        add(8 to item8Offset)
+                    }
+                    add(9 to AxisOffset(itemSize, itemSizePlusSpacing * 2))
                 }
-                add(4 to AxisOffset(0f, 0f))
-                add(5 to AxisOffset(itemSize, 0f))
-                add(6 to AxisOffset(0f, itemSizePlusSpacing))
-                add(7 to AxisOffset(itemSize, itemSizePlusSpacing))
-                if (item8Offset.mainAxis > -itemSize) {
-                    add(8 to item8Offset)
-                }
-                add(9 to AxisOffset(itemSize, itemSizePlusSpacing * 2))
-            }
-            assertPositions(
-                expected = expected.toTypedArray(),
-                fraction = fraction
-            )
+            assertPositions(expected = expected.toTypedArray(), fraction = fraction)
         }
     }
 
@@ -725,13 +623,15 @@
         rule.setContent {
             LazyStaggeredGrid(2, maxSize = itemSize2Dp * 2, startIndex = 6) {
                 items(list, key = { it }) {
-                    val height = when (it) {
-                        2 -> itemSize3Dp
-                        6, 9 -> itemSize2Dp
-                        7 -> itemSize3Dp
-                        8 -> itemSizeDp
-                        else -> itemSizeDp
-                    }
+                    val height =
+                        when (it) {
+                            2 -> itemSize3Dp
+                            6,
+                            9 -> itemSize2Dp
+                            7 -> itemSize3Dp
+                            8 -> itemSizeDp
+                            else -> itemSizeDp
+                        }
                     Item(it, size = height)
                 }
             }
@@ -759,29 +659,26 @@
             rule.onNodeWithTag("5").assertDoesNotExist()
             // item 2 moves from and item 8 moves to `0 - item size`, right before the start edge
             val startItem2Offset = -item2Size
-            val item2Offset =
-                startItem2Offset + (item7Size - startItem2Offset) * fraction
+            val item2Offset = startItem2Offset + (item7Size - startItem2Offset) * fraction
             val endItem8Offset = -item8Size
             val item8Offset = item7Size - (item7Size - endItem8Offset) * fraction
-            val expected = mutableListOf<Pair<Any, Offset>>().apply {
-                if (item8Offset > -item8Size) {
-                    add(8 to AxisOffset(itemSize, item8Offset))
-                } else {
-                    rule.onNodeWithTag("8").assertIsNotDisplayed()
+            val expected =
+                mutableListOf<Pair<Any, Offset>>().apply {
+                    if (item8Offset > -item8Size) {
+                        add(8 to AxisOffset(itemSize, item8Offset))
+                    } else {
+                        rule.onNodeWithTag("8").assertIsNotDisplayed()
+                    }
+                    add(6 to AxisOffset(0f, 0f))
+                    add(7 to AxisOffset(itemSize, 0f))
+                    if (item2Offset > -item2Size) {
+                        add(2 to AxisOffset(itemSize, item2Offset))
+                    } else {
+                        rule.onNodeWithTag("2").assertIsNotDisplayed()
+                    }
+                    add(9 to AxisOffset(0f, item6Size))
                 }
-                add(6 to AxisOffset(0f, 0f))
-                add(7 to AxisOffset(itemSize, 0f))
-                if (item2Offset > -item2Size) {
-                    add(2 to AxisOffset(itemSize, item2Offset))
-                } else {
-                    rule.onNodeWithTag("2").assertIsNotDisplayed()
-                }
-                add(9 to AxisOffset(0f, item6Size))
-            }
-            assertPositions(
-                expected = expected.toTypedArray(),
-                fraction = fraction
-            )
+            assertPositions(expected = expected.toTypedArray(), fraction = fraction)
         }
     }
 
@@ -793,13 +690,15 @@
         rule.setContent {
             LazyStaggeredGrid(2, maxSize = gridSizeDp) {
                 items(list, key = { it }) {
-                    val height = when (it) {
-                        0, 3 -> itemSize2Dp
-                        1 -> itemSize3Dp
-                        2 -> itemSizeDp
-                        8 -> itemSize3Dp
-                        else -> itemSizeDp
-                    }
+                    val height =
+                        when (it) {
+                            0,
+                            3 -> itemSize2Dp
+                            1 -> itemSize3Dp
+                            2 -> itemSizeDp
+                            8 -> itemSize3Dp
+                            else -> itemSizeDp
+                        }
                     Item(it, size = height)
                 }
             }
@@ -814,37 +713,31 @@
             3 to AxisOffset(0f, item0Size)
         )
 
-        rule.runOnUiThread {
-            list = listOf(0, 1, 8, 3, 4, 5, 6, 7, 2, 9, 10, 11)
-        }
+        rule.runOnUiThread { list = listOf(0, 1, 8, 3, 4, 5, 6, 7, 2, 9, 10, 11) }
         val afterLastVisibleItem = itemSize2 * 3
         onAnimationFrame { fraction ->
             // item 8 moves from and item 2 moves to `gridSize`, right after the end edge
             val startItem8Offset = afterLastVisibleItem
             val endItem2Offset = afterLastVisibleItem
-            val item2Offset =
-                item1Size + (endItem2Offset - item1Size) * fraction
-            val item8Offset =
-                startItem8Offset - (startItem8Offset - item1Size) * fraction
-            val expected = mutableListOf<Pair<Any, Offset>>().apply {
-                add(0 to AxisOffset(0f, 0f))
-                add(1 to AxisOffset(itemSize, 0f))
-                if (item8Offset < afterLastVisibleItem) {
-                    add(8 to AxisOffset(itemSize, item8Offset))
-                } else {
-                    rule.onNodeWithTag("8").assertIsNotDisplayed()
+            val item2Offset = item1Size + (endItem2Offset - item1Size) * fraction
+            val item8Offset = startItem8Offset - (startItem8Offset - item1Size) * fraction
+            val expected =
+                mutableListOf<Pair<Any, Offset>>().apply {
+                    add(0 to AxisOffset(0f, 0f))
+                    add(1 to AxisOffset(itemSize, 0f))
+                    if (item8Offset < afterLastVisibleItem) {
+                        add(8 to AxisOffset(itemSize, item8Offset))
+                    } else {
+                        rule.onNodeWithTag("8").assertIsNotDisplayed()
+                    }
+                    add(3 to AxisOffset(0f, item0Size))
+                    if (item2Offset < afterLastVisibleItem) {
+                        add(2 to AxisOffset(itemSize, item2Offset))
+                    } else {
+                        rule.onNodeWithTag("2").assertIsNotDisplayed()
+                    }
                 }
-                add(3 to AxisOffset(0f, item0Size))
-                if (item2Offset < afterLastVisibleItem) {
-                    add(2 to AxisOffset(itemSize, item2Offset))
-                } else {
-                    rule.onNodeWithTag("2").assertIsNotDisplayed()
-                }
-            }
-            assertPositions(
-                expected = expected.toTypedArray(),
-                fraction = fraction
-            )
+            assertPositions(expected = expected.toTypedArray(), fraction = fraction)
         }
     }
 
@@ -853,14 +746,11 @@
         var list by mutableStateOf(listOf(0, 1, 2, 3, 4))
         val rawStartPadding = 8f
         val rawEndPadding = 12f
-        val (startPaddingDp, endPaddingDp) = with(rule.density) {
-            rawStartPadding.toDp() to rawEndPadding.toDp()
-        }
+        val (startPaddingDp, endPaddingDp) =
+            with(rule.density) { rawStartPadding.toDp() to rawEndPadding.toDp() }
         rule.setContent {
             LazyStaggeredGrid(1, startPadding = startPaddingDp, endPadding = endPaddingDp) {
-                items(list, key = { it }) {
-                    Item(it)
-                }
+                items(list, key = { it }) { Item(it) }
             }
         }
 
@@ -873,29 +763,15 @@
             4 to AxisOffset(0f, startPadding + itemSize * 4),
         )
 
-        rule.runOnUiThread {
-            list = listOf(0, 2, 3, 4, 1)
-        }
+        rule.runOnUiThread { list = listOf(0, 2, 3, 4, 1) }
 
         onAnimationFrame { fraction ->
             assertPositions(
                 0 to AxisOffset(0f, startPadding),
-                1 to AxisOffset(
-                    0f,
-                    startPadding + itemSize + itemSize * 3 * fraction
-                ),
-                2 to AxisOffset(
-                    0f,
-                    startPadding + itemSize * 2 - itemSize * fraction
-                ),
-                3 to AxisOffset(
-                    0f,
-                    startPadding + itemSize * 3 - itemSize * fraction
-                ),
-                4 to AxisOffset(
-                    0f,
-                    startPadding + itemSize * 4 - itemSize * fraction
-                ),
+                1 to AxisOffset(0f, startPadding + itemSize + itemSize * 3 * fraction),
+                2 to AxisOffset(0f, startPadding + itemSize * 2 - itemSize * fraction),
+                3 to AxisOffset(0f, startPadding + itemSize * 3 - itemSize * fraction),
+                4 to AxisOffset(0f, startPadding + itemSize * 4 - itemSize * fraction),
                 fraction = fraction
             )
         }
@@ -907,22 +783,11 @@
 
         var measurePasses = 0
         rule.setContent {
-            LazyStaggeredGrid(1) {
-                items(list, key = { it }) {
-                    Item(it)
-                }
-            }
-            LaunchedEffect(Unit) {
-                snapshotFlow { state.layoutInfo }
-                    .collect {
-                        measurePasses++
-                    }
-            }
+            LazyStaggeredGrid(1) { items(list, key = { it }) { Item(it) } }
+            LaunchedEffect(Unit) { snapshotFlow { state.layoutInfo }.collect { measurePasses++ } }
         }
 
-        rule.runOnUiThread {
-            list = listOf(4, 1, 2, 3, 0)
-        }
+        rule.runOnUiThread { list = listOf(4, 1, 2, 3, 0) }
 
         var startMeasurePasses = Int.MIN_VALUE
         onAnimationFrame { fraction ->
@@ -941,17 +806,11 @@
     fun noAnimationWhenScrolledToOtherPosition() {
         rule.setContent {
             LazyStaggeredGrid(1, maxSize = itemSizeDp * 3) {
-                items(listOf(0, 1, 2, 3, 4, 5, 6, 7), key = { it }) {
-                    Item(it)
-                }
+                items(listOf(0, 1, 2, 3, 4, 5, 6, 7), key = { it }) { Item(it) }
             }
         }
 
-        rule.runOnUiThread {
-            runBlocking {
-                state.scrollToItem(0, (itemSize / 2).roundToInt())
-            }
-        }
+        rule.runOnUiThread { runBlocking { state.scrollToItem(0, (itemSize / 2).roundToInt()) } }
 
         onAnimationFrame { fraction ->
             assertPositions(
@@ -968,17 +827,11 @@
     fun noAnimationWhenScrollForwardBySmallOffset() {
         rule.setContent {
             LazyStaggeredGrid(1, maxSize = itemSizeDp * 3) {
-                items(listOf(0, 1, 2, 3, 4, 5, 6, 7), key = { it }) {
-                    Item(it)
-                }
+                items(listOf(0, 1, 2, 3, 4, 5, 6, 7), key = { it }) { Item(it) }
             }
         }
 
-        rule.runOnUiThread {
-            runBlocking {
-                state.scrollBy(itemSize / 2f)
-            }
-        }
+        rule.runOnUiThread { runBlocking { state.scrollBy(itemSize / 2f) } }
 
         onAnimationFrame { fraction ->
             assertPositions(
@@ -995,17 +848,11 @@
     fun noAnimationWhenScrollBackwardBySmallOffset() {
         rule.setContent {
             LazyStaggeredGrid(1, maxSize = itemSizeDp * 3, startIndex = 2) {
-                items(listOf(0, 1, 2, 3, 4, 5, 6, 7), key = { it }) {
-                    Item(it)
-                }
+                items(listOf(0, 1, 2, 3, 4, 5, 6, 7), key = { it }) { Item(it) }
             }
         }
 
-        rule.runOnUiThread {
-            runBlocking {
-                state.scrollBy(-itemSize / 2f)
-            }
-        }
+        rule.runOnUiThread { runBlocking { state.scrollBy(-itemSize / 2f) } }
 
         onAnimationFrame { fraction ->
             assertPositions(
@@ -1022,17 +869,11 @@
     fun noAnimationWhenScrollForwardByLargeOffset() {
         rule.setContent {
             LazyStaggeredGrid(1, maxSize = itemSizeDp * 3) {
-                items(listOf(0, 1, 2, 3, 4, 5, 6, 7), key = { it }) {
-                    Item(it)
-                }
+                items(listOf(0, 1, 2, 3, 4, 5, 6, 7), key = { it }) { Item(it) }
             }
         }
 
-        rule.runOnUiThread {
-            runBlocking {
-                state.scrollBy(itemSize * 2.5f)
-            }
-        }
+        rule.runOnUiThread { runBlocking { state.scrollBy(itemSize * 2.5f) } }
 
         onAnimationFrame { fraction ->
             assertPositions(
@@ -1049,17 +890,11 @@
     fun noAnimationWhenScrollBackwardByLargeOffset() {
         rule.setContent {
             LazyStaggeredGrid(1, maxSize = itemSizeDp * 3, startIndex = 3) {
-                items(listOf(0, 1, 2, 3, 4, 5, 6, 7), key = { it }) {
-                    Item(it)
-                }
+                items(listOf(0, 1, 2, 3, 4, 5, 6, 7), key = { it }) { Item(it) }
             }
         }
 
-        rule.runOnUiThread {
-            runBlocking {
-                state.scrollBy(-itemSize * 2.5f)
-            }
-        }
+        rule.runOnUiThread { runBlocking { state.scrollBy(-itemSize * 2.5f) } }
 
         onAnimationFrame { fraction ->
             assertPositions(
@@ -1082,11 +917,7 @@
             }
         }
 
-        rule.runOnUiThread {
-            runBlocking {
-                state.scrollBy(itemSize + itemSize2 + itemSize / 2f)
-            }
-        }
+        rule.runOnUiThread { runBlocking { state.scrollBy(itemSize + itemSize2 + itemSize / 2f) } }
 
         onAnimationFrame { fraction ->
             assertPositions(
@@ -1110,9 +941,7 @@
         }
 
         rule.runOnUiThread {
-            runBlocking {
-                state.scrollBy(-(itemSize + itemSize2 + itemSize / 2f))
-            }
+            runBlocking { state.scrollBy(-(itemSize + itemSize2 + itemSize / 2f)) }
         }
 
         onAnimationFrame { fraction ->
@@ -1130,9 +959,7 @@
     fun noAnimationWhenScrollForwardByLargeOffset_multipleCells() {
         rule.setContent {
             LazyStaggeredGrid(3, maxSize = itemSizeDp * 2) {
-                items(List(20) { it }, key = { it }) {
-                    Item(it)
-                }
+                items(List(20) { it }, key = { it }) { Item(it) }
             }
         }
 
@@ -1145,11 +972,7 @@
             5 to AxisOffset(itemSize * 2, itemSize)
         )
 
-        rule.runOnUiThread {
-            runBlocking {
-                state.scrollBy(itemSize * 2.5f)
-            }
-        }
+        rule.runOnUiThread { runBlocking { state.scrollBy(itemSize * 2.5f) } }
 
         onAnimationFrame { fraction ->
             assertPositions(
@@ -1171,9 +994,7 @@
     fun noAnimationWhenScrollBackwardByLargeOffset_multipleCells() {
         rule.setContent {
             LazyStaggeredGrid(3, maxSize = itemSizeDp * 2, startIndex = 9) {
-                items(List(20) { it }, key = { it }) {
-                    Item(it)
-                }
+                items(List(20) { it }, key = { it }) { Item(it) }
             }
         }
 
@@ -1186,11 +1007,7 @@
             14 to AxisOffset(itemSize * 2, itemSize)
         )
 
-        rule.runOnUiThread {
-            runBlocking {
-                state.scrollBy(-itemSize * 2.5f)
-            }
-        }
+        rule.runOnUiThread { runBlocking { state.scrollBy(-itemSize * 2.5f) } }
 
         onAnimationFrame { fraction ->
             assertPositions(
@@ -1235,11 +1052,7 @@
             3 to AxisOffset(itemSize, itemSize),
         )
 
-        rule.runOnUiThread {
-            runBlocking {
-                state.scrollBy(itemSize * 2.5f)
-            }
-        }
+        rule.runOnUiThread { runBlocking { state.scrollBy(itemSize * 2.5f) } }
 
         onAnimationFrame { fraction ->
             assertPositions(
@@ -1273,11 +1086,7 @@
             }
         }
 
-        rule.runOnUiThread {
-            runBlocking {
-                state.scrollBy(itemSize * 3f)
-            }
-        }
+        rule.runOnUiThread { runBlocking { state.scrollBy(itemSize * 3f) } }
 
         assertPositions(
             5 to AxisOffset(0f, 0f),
@@ -1286,11 +1095,7 @@
             8 to AxisOffset(itemSize, itemSize),
         )
 
-        rule.runOnUiThread {
-            runBlocking {
-                state.scrollBy(-itemSize * 2.5f)
-            }
-        }
+        rule.runOnUiThread { runBlocking { state.scrollBy(-itemSize * 2.5f) } }
 
         onAnimationFrame { fraction ->
             assertPositions(
@@ -1310,11 +1115,7 @@
         val gridSize = itemSize * 2
         val gridSizeDp = with(rule.density) { gridSize.toDp() }
         rule.setContent {
-            LazyStaggeredGrid(1, maxSize = gridSizeDp) {
-                items(list, key = { it }) {
-                    Item(it)
-                }
-            }
+            LazyStaggeredGrid(1, maxSize = gridSizeDp) { items(list, key = { it }) { Item(it) } }
         }
 
         assertLayoutInfoPositions(
@@ -1322,25 +1123,21 @@
             1 to AxisOffset(0f, itemSize),
         )
 
-        rule.runOnUiThread {
-            list = listOf(0, 6)
-        }
+        rule.runOnUiThread { list = listOf(0, 6) }
 
         onAnimationFrame { fraction ->
-            val expected = mutableListOf<Pair<Any, Offset>>().apply {
-                add(0 to AxisOffset(0f, 0f))
-                val item6MainAxis = gridSize - (gridSize - itemSize) * fraction
-                if (item6MainAxis < gridSize) {
-                    add(6 to AxisOffset(0f, item6MainAxis))
-                } else {
-                    rule.onNodeWithTag("6").assertIsNotDisplayed()
+            val expected =
+                mutableListOf<Pair<Any, Offset>>().apply {
+                    add(0 to AxisOffset(0f, 0f))
+                    val item6MainAxis = gridSize - (gridSize - itemSize) * fraction
+                    if (item6MainAxis < gridSize) {
+                        add(6 to AxisOffset(0f, item6MainAxis))
+                    } else {
+                        rule.onNodeWithTag("6").assertIsNotDisplayed()
+                    }
                 }
-            }
 
-            assertPositions(
-                expected = expected.toTypedArray(),
-                fraction = fraction
-            )
+            assertPositions(expected = expected.toTypedArray(), fraction = fraction)
         }
     }
 
@@ -1351,13 +1148,17 @@
         val gridSizeDp = with(rule.density) { gridSize.toDp() }
         rule.setContent {
             LazyStaggeredGrid(2, maxSize = gridSizeDp) {
-                items(list, key = { it }, span = {
-                    if (it == 6) {
-                        StaggeredGridItemSpan.FullLine
-                    } else {
-                        StaggeredGridItemSpan.SingleLane
+                items(
+                    list,
+                    key = { it },
+                    span = {
+                        if (it == 6) {
+                            StaggeredGridItemSpan.FullLine
+                        } else {
+                            StaggeredGridItemSpan.SingleLane
+                        }
                     }
-                }) {
+                ) {
                     Item(it)
                 }
             }
@@ -1370,37 +1171,29 @@
             3 to AxisOffset(itemSize, itemSize)
         )
 
-        rule.runOnUiThread {
-            list = listOf(0, 4, 6)
-        }
+        rule.runOnUiThread { list = listOf(0, 4, 6) }
 
         onAnimationFrame { fraction ->
-            val expected = mutableListOf<Pair<Any, Offset>>().apply {
-                add(0 to AxisOffset(0f, 0f))
-                // item 4 starts at gridSize
-                val item4MainAxis = gridSize - gridSize * fraction
-                if (item4MainAxis < gridSize) {
-                    add(
-                        4 to AxisOffset(itemSize, item4MainAxis)
-                    )
-                } else {
-                    rule.onNodeWithTag("4").assertIsNotDisplayed()
+            val expected =
+                mutableListOf<Pair<Any, Offset>>().apply {
+                    add(0 to AxisOffset(0f, 0f))
+                    // item 4 starts at gridSize
+                    val item4MainAxis = gridSize - gridSize * fraction
+                    if (item4MainAxis < gridSize) {
+                        add(4 to AxisOffset(itemSize, item4MainAxis))
+                    } else {
+                        rule.onNodeWithTag("4").assertIsNotDisplayed()
+                    }
+                    // item 6 starts below item 4 (gridSize + itemSize for the size of 4th item)
+                    val item6MainAxis = gridSize + itemSize - gridSize * fraction
+                    if (item6MainAxis < gridSize) {
+                        add(6 to AxisOffset(0f, item6MainAxis))
+                    } else {
+                        rule.onNodeWithTag("6").assertIsNotDisplayed()
+                    }
                 }
-                // item 6 starts below item 4 (gridSize + itemSize for the size of 4th item)
-                val item6MainAxis = gridSize + itemSize - gridSize * fraction
-                if (item6MainAxis < gridSize) {
-                    add(
-                        6 to AxisOffset(0f, item6MainAxis)
-                    )
-                } else {
-                    rule.onNodeWithTag("6").assertIsNotDisplayed()
-                }
-            }
 
-            assertPositions(
-                expected = expected.toTypedArray(),
-                fraction = fraction
-            )
+            assertPositions(expected = expected.toTypedArray(), fraction = fraction)
         }
     }
 
@@ -1411,31 +1204,25 @@
         val gridSizeDp = with(rule.density) { gridSize.toDp() }
         rule.setContent {
             LazyStaggeredGrid(1, maxSize = gridSizeDp) {
-                items(list, key = { it }) {
-                    Item(it, animSpec = if (it == 1) AnimSpec else null)
-                }
+                items(list, key = { it }) { Item(it, animSpec = if (it == 1) AnimSpec else null) }
             }
         }
 
-        rule.runOnUiThread {
-            list = listOf(0, 2, 3, 1)
-        }
+        rule.runOnUiThread { list = listOf(0, 2, 3, 1) }
 
         onAnimationFrame { fraction ->
             // item 1 moves to `gridSize`
             val item1Offset = itemSize + (gridSize - itemSize) * fraction
-            val expected = mutableListOf<Pair<Any, Offset>>().apply {
-                add(0 to AxisOffset(0f, 0f))
-                if (item1Offset < gridSize) {
-                    add(1 to AxisOffset(0f, item1Offset))
-                } else {
-                    rule.onNodeWithTag("1").assertIsNotDisplayed()
+            val expected =
+                mutableListOf<Pair<Any, Offset>>().apply {
+                    add(0 to AxisOffset(0f, 0f))
+                    if (item1Offset < gridSize) {
+                        add(1 to AxisOffset(0f, item1Offset))
+                    } else {
+                        rule.onNodeWithTag("1").assertIsNotDisplayed()
+                    }
                 }
-            }
-            assertPositions(
-                expected = expected.toTypedArray(),
-                fraction = fraction
-            )
+            assertPositions(expected = expected.toTypedArray(), fraction = fraction)
         }
     }
 
@@ -1444,9 +1231,7 @@
         var list by mutableStateOf(listOf(0, 1, 2, 3, 4, 5))
         rule.setContent {
             LazyStaggeredGrid(1, maxSize = itemSizeDp * 3f, startIndex = 3) {
-                items(list, key = { it }) {
-                    Item(it)
-                }
+                items(list, key = { it }) { Item(it) }
             }
         }
 
@@ -1456,9 +1241,7 @@
             5 to AxisOffset(0f, itemSize * 2)
         )
 
-        rule.runOnUiThread {
-            list = listOf(0, 4, 5, 3, 1, 2)
-        }
+        rule.runOnUiThread { list = listOf(0, 4, 5, 3, 1, 2) }
 
         onAnimationFrame { fraction ->
             // item 2 moves from and item 5 moves to `-itemSize`, right before the start edge
@@ -1467,33 +1250,31 @@
             // item 1 moves from and item 4 moves to `-itemSize * 2`, right before item 2
             val item1Offset = -itemSize * 2 + itemSize * 3 * fraction
             val item4Offset = itemSize - itemSize * 3 * fraction
-            val expected = mutableListOf<Pair<Any, Offset>>().apply {
-                if (item1Offset > -itemSize) {
-                    add(1 to AxisOffset(0f, item1Offset))
-                } else {
-                    rule.onNodeWithTag("1").assertIsNotDisplayed()
+            val expected =
+                mutableListOf<Pair<Any, Offset>>().apply {
+                    if (item1Offset > -itemSize) {
+                        add(1 to AxisOffset(0f, item1Offset))
+                    } else {
+                        rule.onNodeWithTag("1").assertIsNotDisplayed()
+                    }
+                    if (item2Offset > -itemSize) {
+                        add(2 to AxisOffset(0f, item2Offset))
+                    } else {
+                        rule.onNodeWithTag("2").assertIsNotDisplayed()
+                    }
+                    add(3 to AxisOffset(0f, 0f))
+                    if (item4Offset > -itemSize) {
+                        add(4 to AxisOffset(0f, item4Offset))
+                    } else {
+                        rule.onNodeWithTag("4").assertIsNotDisplayed()
+                    }
+                    if (item5Offset > -itemSize) {
+                        add(5 to AxisOffset(0f, item5Offset))
+                    } else {
+                        rule.onNodeWithTag("5").assertIsNotDisplayed()
+                    }
                 }
-                if (item2Offset > -itemSize) {
-                    add(2 to AxisOffset(0f, item2Offset))
-                } else {
-                    rule.onNodeWithTag("2").assertIsNotDisplayed()
-                }
-                add(3 to AxisOffset(0f, 0f))
-                if (item4Offset > -itemSize) {
-                    add(4 to AxisOffset(0f, item4Offset))
-                } else {
-                    rule.onNodeWithTag("4").assertIsNotDisplayed()
-                }
-                if (item5Offset > -itemSize) {
-                    add(5 to AxisOffset(0f, item5Offset))
-                } else {
-                    rule.onNodeWithTag("5").assertIsNotDisplayed()
-                }
-            }
-            assertPositions(
-                expected = expected.toTypedArray(),
-                fraction = fraction
-            )
+            assertPositions(expected = expected.toTypedArray(), fraction = fraction)
         }
     }
 
@@ -1502,9 +1283,7 @@
         var list by mutableStateOf(listOf(0, 1, 2, 3, 4, 5))
         rule.setContent {
             LazyStaggeredGrid(1, maxSize = itemSizeDp * 3f, startIndex = 3) {
-                items(list, key = { it }) {
-                    Item(it)
-                }
+                items(list, key = { it }) { Item(it) }
             }
         }
 
@@ -1514,9 +1293,7 @@
             5 to AxisOffset(0f, itemSize * 2)
         )
 
-        rule.runOnUiThread {
-            list = listOf(0, 5, 4, 3, 2, 1)
-        }
+        rule.runOnUiThread { list = listOf(0, 5, 4, 3, 2, 1) }
 
         onAnimationFrame { fraction ->
             // item 2 moves from and item 4 moves to `-itemSize`, right before the start edge
@@ -1525,33 +1302,31 @@
             // item 1 moves from and item 5 moves to `-itemSize * 2`, right before item 2
             val item1Offset = -itemSize * 2 + itemSize * 4 * fraction
             val item5Offset = itemSize * 2 - itemSize * 4 * fraction
-            val expected = mutableListOf<Pair<Any, Offset>>().apply {
-                if (item1Offset > -itemSize) {
-                    add(1 to AxisOffset(0f, item1Offset))
-                } else {
-                    rule.onNodeWithTag("1").assertIsNotDisplayed()
+            val expected =
+                mutableListOf<Pair<Any, Offset>>().apply {
+                    if (item1Offset > -itemSize) {
+                        add(1 to AxisOffset(0f, item1Offset))
+                    } else {
+                        rule.onNodeWithTag("1").assertIsNotDisplayed()
+                    }
+                    if (item2Offset > -itemSize) {
+                        add(2 to AxisOffset(0f, item2Offset))
+                    } else {
+                        rule.onNodeWithTag("2").assertIsNotDisplayed()
+                    }
+                    add(3 to AxisOffset(0f, 0f))
+                    if (item4Offset > -itemSize) {
+                        add(4 to AxisOffset(0f, item4Offset))
+                    } else {
+                        rule.onNodeWithTag("4").assertIsNotDisplayed()
+                    }
+                    if (item5Offset > -itemSize) {
+                        add(5 to AxisOffset(0f, item5Offset))
+                    } else {
+                        rule.onNodeWithTag("5").assertIsNotDisplayed()
+                    }
                 }
-                if (item2Offset > -itemSize) {
-                    add(2 to AxisOffset(0f, item2Offset))
-                } else {
-                    rule.onNodeWithTag("2").assertIsNotDisplayed()
-                }
-                add(3 to AxisOffset(0f, 0f))
-                if (item4Offset > -itemSize) {
-                    add(4 to AxisOffset(0f, item4Offset))
-                } else {
-                    rule.onNodeWithTag("4").assertIsNotDisplayed()
-                }
-                if (item5Offset > -itemSize) {
-                    add(5 to AxisOffset(0f, item5Offset))
-                } else {
-                    rule.onNodeWithTag("5").assertIsNotDisplayed()
-                }
-            }
-            assertPositions(
-                expected = expected.toTypedArray(),
-                fraction = fraction
-            )
+            assertPositions(expected = expected.toTypedArray(), fraction = fraction)
         }
     }
 
@@ -1560,9 +1335,7 @@
         var list by mutableStateOf(listOf(0, 1, 2, 3, 4, 5))
         rule.setContent {
             LazyStaggeredGrid(2, maxSize = itemSizeDp * 2f, startIndex = 2) {
-                items(list, key = { it }) {
-                    Item(it)
-                }
+                items(list, key = { it }) { Item(it) }
             }
         }
 
@@ -1573,37 +1346,33 @@
             5 to AxisOffset(itemSize, itemSize)
         )
 
-        rule.runOnUiThread {
-            list = listOf(4, 5, 2, 3, 0, 1)
-        }
+        rule.runOnUiThread { list = listOf(4, 5, 2, 3, 0, 1) }
 
         onAnimationFrame { fraction ->
             // items 0 and 1 moves from and items 4 and 5 moves to `-itemSize`,
             // right before the start edge
             val items0and1Offset = -itemSize + itemSize * 2 * fraction
             val items4and5Offset = itemSize - itemSize * 2 * fraction
-            val expected = mutableListOf<Pair<Any, Offset>>().apply {
-                if (items0and1Offset > -itemSize) {
-                    add(0 to AxisOffset(0f, items0and1Offset))
-                    add(1 to AxisOffset(itemSize, items0and1Offset))
-                } else {
-                    rule.onNodeWithTag("0").assertIsNotDisplayed()
-                    rule.onNodeWithTag("1").assertIsNotDisplayed()
+            val expected =
+                mutableListOf<Pair<Any, Offset>>().apply {
+                    if (items0and1Offset > -itemSize) {
+                        add(0 to AxisOffset(0f, items0and1Offset))
+                        add(1 to AxisOffset(itemSize, items0and1Offset))
+                    } else {
+                        rule.onNodeWithTag("0").assertIsNotDisplayed()
+                        rule.onNodeWithTag("1").assertIsNotDisplayed()
+                    }
+                    add(2 to AxisOffset(0f, 0f))
+                    add(3 to AxisOffset(itemSize, 0f))
+                    if (items4and5Offset > -itemSize) {
+                        add(4 to AxisOffset(0f, items4and5Offset))
+                        add(5 to AxisOffset(itemSize, items4and5Offset))
+                    } else {
+                        rule.onNodeWithTag("4").assertIsNotDisplayed()
+                        rule.onNodeWithTag("5").assertIsNotDisplayed()
+                    }
                 }
-                add(2 to AxisOffset(0f, 0f))
-                add(3 to AxisOffset(itemSize, 0f))
-                if (items4and5Offset > -itemSize) {
-                    add(4 to AxisOffset(0f, items4and5Offset))
-                    add(5 to AxisOffset(itemSize, items4and5Offset))
-                } else {
-                    rule.onNodeWithTag("4").assertIsNotDisplayed()
-                    rule.onNodeWithTag("5").assertIsNotDisplayed()
-                }
-            }
-            assertPositions(
-                expected = expected.toTypedArray(),
-                fraction = fraction
-            )
+            assertPositions(expected = expected.toTypedArray(), fraction = fraction)
         }
     }
 
@@ -1613,11 +1382,7 @@
         val gridSize = itemSize * 3
         val gridSizeDp = with(rule.density) { gridSize.toDp() }
         rule.setContent {
-            LazyStaggeredGrid(1, maxSize = gridSizeDp) {
-                items(list, key = { it }) {
-                    Item(it)
-                }
-            }
+            LazyStaggeredGrid(1, maxSize = gridSizeDp) { items(list, key = { it }) { Item(it) } }
         }
 
         assertPositions(
@@ -1626,9 +1391,7 @@
             2 to AxisOffset(0f, itemSize * 2)
         )
 
-        rule.runOnUiThread {
-            list = listOf(0, 3, 4, 1, 2)
-        }
+        rule.runOnUiThread { list = listOf(0, 3, 4, 1, 2) }
 
         onAnimationFrame { fraction ->
             // item 1 moves to and item 3 moves from `gridSize`, right after the end edge
@@ -1637,33 +1400,31 @@
             // item 2 moves to and item 4 moves from `gridSize + itemSize`, right after item 4
             val item2Offset = itemSize * 2 + (gridSize - itemSize) * fraction
             val item4Offset = gridSize + itemSize - (gridSize - itemSize) * fraction
-            val expected = mutableListOf<Pair<Any, Offset>>().apply {
-                add(0 to AxisOffset(0f, 0f))
-                if (item1Offset < gridSize) {
-                    add(1 to AxisOffset(0f, item1Offset))
-                } else {
-                    rule.onNodeWithTag("1").assertIsNotDisplayed()
+            val expected =
+                mutableListOf<Pair<Any, Offset>>().apply {
+                    add(0 to AxisOffset(0f, 0f))
+                    if (item1Offset < gridSize) {
+                        add(1 to AxisOffset(0f, item1Offset))
+                    } else {
+                        rule.onNodeWithTag("1").assertIsNotDisplayed()
+                    }
+                    if (item2Offset < gridSize) {
+                        add(2 to AxisOffset(0f, item2Offset))
+                    } else {
+                        rule.onNodeWithTag("2").assertIsNotDisplayed()
+                    }
+                    if (item3Offset < gridSize) {
+                        add(3 to AxisOffset(0f, item3Offset))
+                    } else {
+                        rule.onNodeWithTag("3").assertIsNotDisplayed()
+                    }
+                    if (item4Offset < gridSize) {
+                        add(4 to AxisOffset(0f, item4Offset))
+                    } else {
+                        rule.onNodeWithTag("4").assertIsNotDisplayed()
+                    }
                 }
-                if (item2Offset < gridSize) {
-                    add(2 to AxisOffset(0f, item2Offset))
-                } else {
-                    rule.onNodeWithTag("2").assertIsNotDisplayed()
-                }
-                if (item3Offset < gridSize) {
-                    add(3 to AxisOffset(0f, item3Offset))
-                } else {
-                    rule.onNodeWithTag("3").assertIsNotDisplayed()
-                }
-                if (item4Offset < gridSize) {
-                    add(4 to AxisOffset(0f, item4Offset))
-                } else {
-                    rule.onNodeWithTag("4").assertIsNotDisplayed()
-                }
-            }
-            assertPositions(
-                expected = expected.toTypedArray(),
-                fraction = fraction
-            )
+            assertPositions(expected = expected.toTypedArray(), fraction = fraction)
         }
     }
 
@@ -1673,11 +1434,7 @@
         val gridSize = itemSize * 3
         val gridSizeDp = with(rule.density) { gridSize.toDp() }
         rule.setContent {
-            LazyStaggeredGrid(1, maxSize = gridSizeDp) {
-                items(list, key = { it }) {
-                    Item(it)
-                }
-            }
+            LazyStaggeredGrid(1, maxSize = gridSizeDp) { items(list, key = { it }) { Item(it) } }
         }
 
         assertPositions(
@@ -1686,9 +1443,7 @@
             2 to AxisOffset(0f, itemSize * 2)
         )
 
-        rule.runOnUiThread {
-            list = listOf(0, 4, 3, 2, 1)
-        }
+        rule.runOnUiThread { list = listOf(0, 4, 3, 2, 1) }
 
         onAnimationFrame { fraction ->
             // item 2 moves to and item 3 moves from `gridSize`, right after the end edge
@@ -1696,35 +1451,32 @@
             val item3Offset = gridSize - (gridSize - itemSize * 2) * fraction
             // item 1 moves to and item 4 moves from `gridSize + itemSize`, right after item 4
             val item1Offset = itemSize + (gridSize + itemSize - itemSize) * fraction
-            val item4Offset =
-                gridSize + itemSize - (gridSize + itemSize - itemSize) * fraction
-            val expected = mutableListOf<Pair<Any, Offset>>().apply {
-                add(0 to AxisOffset(0f, 0f))
-                if (item1Offset < gridSize) {
-                    add(1 to AxisOffset(0f, item1Offset))
-                } else {
-                    rule.onNodeWithTag("1").assertIsNotDisplayed()
+            val item4Offset = gridSize + itemSize - (gridSize + itemSize - itemSize) * fraction
+            val expected =
+                mutableListOf<Pair<Any, Offset>>().apply {
+                    add(0 to AxisOffset(0f, 0f))
+                    if (item1Offset < gridSize) {
+                        add(1 to AxisOffset(0f, item1Offset))
+                    } else {
+                        rule.onNodeWithTag("1").assertIsNotDisplayed()
+                    }
+                    if (item2Offset < gridSize) {
+                        add(2 to AxisOffset(0f, item2Offset))
+                    } else {
+                        rule.onNodeWithTag("2").assertIsNotDisplayed()
+                    }
+                    if (item3Offset < gridSize) {
+                        add(3 to AxisOffset(0f, item3Offset))
+                    } else {
+                        rule.onNodeWithTag("3").assertIsNotDisplayed()
+                    }
+                    if (item4Offset < gridSize) {
+                        add(4 to AxisOffset(0f, item4Offset))
+                    } else {
+                        rule.onNodeWithTag("4").assertIsNotDisplayed()
+                    }
                 }
-                if (item2Offset < gridSize) {
-                    add(2 to AxisOffset(0f, item2Offset))
-                } else {
-                    rule.onNodeWithTag("2").assertIsNotDisplayed()
-                }
-                if (item3Offset < gridSize) {
-                    add(3 to AxisOffset(0f, item3Offset))
-                } else {
-                    rule.onNodeWithTag("3").assertIsNotDisplayed()
-                }
-                if (item4Offset < gridSize) {
-                    add(4 to AxisOffset(0f, item4Offset))
-                } else {
-                    rule.onNodeWithTag("4").assertIsNotDisplayed()
-                }
-            }
-            assertPositions(
-                expected = expected.toTypedArray(),
-                fraction = fraction
-            )
+            assertPositions(expected = expected.toTypedArray(), fraction = fraction)
         }
     }
 
@@ -1734,11 +1486,7 @@
         val gridSize = itemSize * 2
         val gridSizeDp = with(rule.density) { gridSize.toDp() }
         rule.setContent {
-            LazyStaggeredGrid(2, maxSize = gridSizeDp) {
-                items(list, key = { it }) {
-                    Item(it)
-                }
-            }
+            LazyStaggeredGrid(2, maxSize = gridSizeDp) { items(list, key = { it }) { Item(it) } }
         }
 
         assertPositions(
@@ -1748,37 +1496,33 @@
             3 to AxisOffset(itemSize, itemSize)
         )
 
-        rule.runOnUiThread {
-            list = listOf(0, 1, 4, 5, 2, 3)
-        }
+        rule.runOnUiThread { list = listOf(0, 1, 4, 5, 2, 3) }
 
         onAnimationFrame { fraction ->
             // items 4 and 5 moves from and items 2 and 3 moves to `gridSize`,
             // right before the start edge
             val items4and5Offset = gridSize - (gridSize - itemSize) * fraction
             val items2and3Offset = itemSize + (gridSize - itemSize) * fraction
-            val expected = mutableListOf<Pair<Any, Offset>>().apply {
-                add(0 to AxisOffset(0f, 0f))
-                add(1 to AxisOffset(itemSize, 0f))
-                if (items2and3Offset < gridSize) {
-                    add(2 to AxisOffset(0f, items2and3Offset))
-                    add(3 to AxisOffset(itemSize, items2and3Offset))
-                } else {
-                    rule.onNodeWithTag("2").assertIsNotDisplayed()
-                    rule.onNodeWithTag("3").assertIsNotDisplayed()
+            val expected =
+                mutableListOf<Pair<Any, Offset>>().apply {
+                    add(0 to AxisOffset(0f, 0f))
+                    add(1 to AxisOffset(itemSize, 0f))
+                    if (items2and3Offset < gridSize) {
+                        add(2 to AxisOffset(0f, items2and3Offset))
+                        add(3 to AxisOffset(itemSize, items2and3Offset))
+                    } else {
+                        rule.onNodeWithTag("2").assertIsNotDisplayed()
+                        rule.onNodeWithTag("3").assertIsNotDisplayed()
+                    }
+                    if (items4and5Offset < gridSize) {
+                        add(4 to AxisOffset(0f, items4and5Offset))
+                        add(5 to AxisOffset(itemSize, items4and5Offset))
+                    } else {
+                        rule.onNodeWithTag("4").assertIsNotDisplayed()
+                        rule.onNodeWithTag("5").assertIsNotDisplayed()
+                    }
                 }
-                if (items4and5Offset < gridSize) {
-                    add(4 to AxisOffset(0f, items4and5Offset))
-                    add(5 to AxisOffset(itemSize, items4and5Offset))
-                } else {
-                    rule.onNodeWithTag("4").assertIsNotDisplayed()
-                    rule.onNodeWithTag("5").assertIsNotDisplayed()
-                }
-            }
-            assertPositions(
-                expected = expected.toTypedArray(),
-                fraction = fraction
-            )
+            assertPositions(expected = expected.toTypedArray(), fraction = fraction)
         }
     }
 
@@ -1787,15 +1531,11 @@
         var size by mutableStateOf(itemSizeDp * 3)
         rule.setContent {
             LazyStaggeredGrid(1, maxSize = size) {
-                items(listOf(0, 1, 2), key = { it }) {
-                    Item(it)
-                }
+                items(listOf(0, 1, 2), key = { it }) { Item(it) }
             }
         }
 
-        rule.runOnUiThread {
-            size = itemSizeDp * 2
-        }
+        rule.runOnUiThread { size = itemSizeDp * 2 }
 
         onAnimationFrame { fraction ->
             assertPositions(
@@ -1812,15 +1552,11 @@
         var size by mutableStateOf(itemSizeDp * 2)
         rule.setContent {
             LazyStaggeredGrid(1, maxSize = size) {
-                items(listOf(0, 1, 2), key = { it }) {
-                    Item(it)
-                }
+                items(listOf(0, 1, 2), key = { it }) { Item(it) }
             }
         }
 
-        rule.runOnUiThread {
-            size = itemSizeDp * 3
-        }
+        rule.runOnUiThread { size = itemSizeDp * 3 }
 
         onAnimationFrame { fraction ->
             assertPositions(
@@ -1838,15 +1574,11 @@
         val scrollDelta = spacing
         rule.setContent {
             LazyStaggeredGrid(1, maxSize = itemSizeDp * 2) {
-                items(list, key = { it }) {
-                    Item(it)
-                }
+                items(list, key = { it }) { Item(it) }
             }
         }
 
-        rule.runOnUiThread {
-            list = listOf(0, 2, 1, 3)
-        }
+        rule.runOnUiThread { list = listOf(0, 2, 1, 3) }
 
         onAnimationFrame { fraction ->
             if (fraction == 0f) {
@@ -1856,9 +1588,7 @@
                     2 to AxisOffset(0f, itemSize * 2),
                     fraction = fraction
                 )
-                rule.runOnUiThread {
-                    runBlocking { state.scrollBy(scrollDelta) }
-                }
+                rule.runOnUiThread { runBlocking { state.scrollBy(scrollDelta) } }
             }
             assertPositions(
                 0 to AxisOffset(0f, -scrollDelta),
@@ -1877,15 +1607,11 @@
         val containerSize = itemSize * 2
         rule.setContent {
             LazyStaggeredGrid(1, maxSize = containerSizeDp) {
-                items(list, key = { it }) {
-                    Item(it)
-                }
+                items(list, key = { it }) { Item(it) }
             }
         }
 
-        rule.runOnUiThread {
-            list = listOf(0, 4, 2, 3, 1)
-        }
+        rule.runOnUiThread { list = listOf(0, 4, 2, 3, 1) }
 
         onAnimationFrame { fraction ->
             if (fraction == 0f) {
@@ -1894,9 +1620,7 @@
                     1 to AxisOffset(0f, itemSize),
                     fraction = fraction
                 )
-                rule.runOnUiThread {
-                    runBlocking { state.scrollBy(scrollDelta) }
-                }
+                rule.runOnUiThread { runBlocking { state.scrollBy(scrollDelta) } }
             }
             assertPositions(
                 0 to AxisOffset(0f, -scrollDelta),
@@ -1913,15 +1637,11 @@
         val containerSizeDp = itemSizeDp * 2
         rule.setContent {
             LazyStaggeredGrid(1, maxSize = containerSizeDp, startIndex = 2) {
-                items(list, key = { it }) {
-                    Item(it)
-                }
+                items(list, key = { it }) { Item(it) }
             }
         }
 
-        rule.runOnUiThread {
-            list = listOf(3, 0, 1, 2, 4)
-        }
+        rule.runOnUiThread { list = listOf(3, 0, 1, 2, 4) }
 
         onAnimationFrame { fraction ->
             if (fraction == 0f) {
@@ -1930,9 +1650,7 @@
                     3 to AxisOffset(0f, itemSize),
                     fraction = fraction
                 )
-                rule.runOnUiThread {
-                    runBlocking { state.scrollBy(scrollDelta) }
-                }
+                rule.runOnUiThread { runBlocking { state.scrollBy(scrollDelta) } }
             }
             assertPositions(
                 2 to AxisOffset(0f, -scrollDelta),
@@ -1949,15 +1667,11 @@
         val scrollDelta = spacing
         rule.setContent {
             LazyStaggeredGrid(1, maxSize = containerSizeDp) {
-                items(list, key = { it }) {
-                    Item(it)
-                }
+                items(list, key = { it }) { Item(it) }
             }
         }
 
-        rule.runOnUiThread {
-            list = listOf(0, 4, 2, 3, 1)
-        }
+        rule.runOnUiThread { list = listOf(0, 4, 2, 3, 1) }
 
         onAnimationFrame { fraction ->
             if (fraction == 0f) {
@@ -1966,9 +1680,7 @@
                     1 to AxisOffset(0f, itemSize),
                     fraction = fraction
                 )
-                rule.runOnUiThread {
-                    runBlocking { state.scrollBy(itemSize * 2) }
-                }
+                rule.runOnUiThread { runBlocking { state.scrollBy(itemSize * 2) } }
                 assertPositions(
                     2 to AxisOffset(0f, 0f),
                     3 to AxisOffset(0f, itemSize),
@@ -1977,9 +1689,7 @@
                     1 to AxisOffset(0f, itemSize),
                     fraction = fraction
                 )
-                rule.runOnUiThread {
-                    runBlocking { state.scrollBy(scrollDelta) }
-                }
+                rule.runOnUiThread { runBlocking { state.scrollBy(scrollDelta) } }
                 assertPositions(
                     2 to AxisOffset(0f, 0f - scrollDelta),
                     3 to AxisOffset(0f, itemSize - scrollDelta),
@@ -2011,54 +1721,39 @@
             }
         }
 
-        rule.runOnUiThread {
-            item0Size = itemSize2Dp
-        }
+        rule.runOnUiThread { item0Size = itemSize2Dp }
 
         rule.waitForIdle()
         rule.mainClock.advanceTimeByFrame()
         onAnimationFrame(duration = FrameDuration) { fraction ->
             if (fraction == 0f) {
-                assertPositions(
-                    0 to AxisOffset(0f, 0f),
-                    1 to AxisOffset(0f, itemSize)
-                )
+                assertPositions(0 to AxisOffset(0f, 0f), 1 to AxisOffset(0f, itemSize))
             } else {
                 assertThat(fraction).isEqualTo(1f)
                 val valueAfterOneFrame =
                     animSpec.getValueAtFrame(1, from = itemSize, to = itemSize2)
-                assertPositions(
-                    0 to AxisOffset(0f, 0f),
-                    1 to AxisOffset(0f, valueAfterOneFrame)
-                )
+                assertPositions(0 to AxisOffset(0f, 0f), 1 to AxisOffset(0f, valueAfterOneFrame))
             }
         }
 
-        rule.runOnUiThread {
-            item0Size = 0.dp
-        }
+        rule.runOnUiThread { item0Size = 0.dp }
 
         rule.waitForIdle()
         val startValue = animSpec.getValueAtFrame(2, from = itemSize, to = itemSize2)
         val startVelocity = animSpec.getVelocityAtFrame(2, from = itemSize, to = itemSize2)
         onAnimationFrame(duration = FrameDuration) { fraction ->
             if (fraction == 0f) {
-                assertPositions(
-                    0 to AxisOffset(0f, 0f),
-                    1 to AxisOffset(0f, startValue)
-                )
+                assertPositions(0 to AxisOffset(0f, 0f), 1 to AxisOffset(0f, startValue))
             } else {
                 assertThat(fraction).isEqualTo(1f)
-                val valueAfterThreeFrames = animSpec.getValueAtFrame(
-                    1,
-                    from = startValue,
-                    to = 0f,
-                    initialVelocity = startVelocity
-                )
-                assertPositions(
-                    0 to AxisOffset(0f, 0f),
-                    1 to AxisOffset(0f, valueAfterThreeFrames)
-                )
+                val valueAfterThreeFrames =
+                    animSpec.getValueAtFrame(
+                        1,
+                        from = startValue,
+                        to = 0f,
+                        initialVelocity = startVelocity
+                    )
+                assertPositions(0 to AxisOffset(0f, 0f), 1 to AxisOffset(0f, valueAfterThreeFrames))
             }
         }
     }
@@ -2073,22 +1768,15 @@
                 maxSize = itemSizeDp,
                 crossAxisSize = containerCrossAxisSize
             ) {
-                items(10, key = { it }) {
-                    Item(it)
-                }
+                items(10, key = { it }) { Item(it) }
             }
         }
 
-        rule.runOnUiThread {
-            columnCount = 1
-        }
+        rule.runOnUiThread { columnCount = 1 }
 
         onAnimationFrame { _ ->
             // todo: proper animations when removal is supported
-            assertPositions(
-                0 to AxisOffset(0f, 0f),
-                1 to AxisOffset(itemSize, 0f)
-            )
+            assertPositions(0 to AxisOffset(0f, 0f), 1 to AxisOffset(itemSize, 0f))
         }
     }
 
@@ -2099,42 +1787,37 @@
         val listSizeDp = itemSizeDp * 3f
         rule.setContent {
             LazyStaggeredGrid(cells = 1, maxSize = listSizeDp) {
-                items(list, key = { it }) {
-                    Item(it)
-                }
+                items(list, key = { it }) { Item(it) }
             }
         }
 
         rule.runOnUiThread {
             list = listOf(0, 1, 2, 3)
-            runBlocking {
-                state.scrollToItem(0, 0)
-            }
+            runBlocking { state.scrollToItem(0, 0) }
         }
 
         onAnimationFrame { fraction ->
-            val expected = mutableListOf<Pair<Any, Offset>>().apply {
-                add(0 to AxisOffset(0f, 0f))
-                add(1 to AxisOffset(0f, itemSize * fraction))
-                add(2 to AxisOffset(0f, itemSize + itemSize * fraction))
-                val item3Offset = itemSize * 2 + itemSize * fraction
-                if (item3Offset < listSize) {
-                    add(3 to AxisOffset(0f, item3Offset))
-                } else {
-                    rule.onNodeWithTag("4").assertIsNotDisplayed()
+            val expected =
+                mutableListOf<Pair<Any, Offset>>().apply {
+                    add(0 to AxisOffset(0f, 0f))
+                    add(1 to AxisOffset(0f, itemSize * fraction))
+                    add(2 to AxisOffset(0f, itemSize + itemSize * fraction))
+                    val item3Offset = itemSize * 2 + itemSize * fraction
+                    if (item3Offset < listSize) {
+                        add(3 to AxisOffset(0f, item3Offset))
+                    } else {
+                        rule.onNodeWithTag("4").assertIsNotDisplayed()
+                    }
                 }
-            }
-            assertPositions(
-                expected = expected.toTypedArray(),
-                fraction = fraction
-            )
+            assertPositions(expected = expected.toTypedArray(), fraction = fraction)
         }
     }
 
     private fun AxisOffset(crossAxis: Float, mainAxis: Float) =
         if (isVertical) Offset(crossAxis, mainAxis) else Offset(mainAxis, crossAxis)
 
-    private val Offset.mainAxis: Float get() = if (isVertical) y else x
+    private val Offset.mainAxis: Float
+        get() = if (isVertical) y else x
 
     private fun assertPositions(
         vararg expected: Pair<Any, Offset>,
@@ -2143,20 +1826,22 @@
         autoReverse: Boolean = reverseLayout
     ) {
         val roundedExpected = expected.map { it.first to it.second.round() }
-        val actualBounds = rule.onAllNodes(NodesWithTagMatcher)
-            .fetchSemanticsNodes()
-            .associateBy(
-                keySelector = { it.config[SemanticsProperties.TestTag] },
-                valueTransform = { IntRect(it.positionInRoot.round(), it.size) }
-            )
-        val actualPositions = expected.map {
-            it.first to actualBounds.getValue(it.first.toString()).topLeft
-        }
-        val subject = if (fraction == null) {
-            assertThat(actualPositions)
-        } else {
-            Truth.assertWithMessage("Fraction=$fraction").that(actualPositions)
-        }
+        val actualBounds =
+            rule
+                .onAllNodes(NodesWithTagMatcher)
+                .fetchSemanticsNodes()
+                .associateBy(
+                    keySelector = { it.config[SemanticsProperties.TestTag] },
+                    valueTransform = { IntRect(it.positionInRoot.round(), it.size) }
+                )
+        val actualPositions =
+            expected.map { it.first to actualBounds.getValue(it.first.toString()).topLeft }
+        val subject =
+            if (fraction == null) {
+                assertThat(actualPositions)
+            } else {
+                Truth.assertWithMessage("Fraction=$fraction").that(actualPositions)
+            }
         subject.isEqualTo(
             roundedExpected.let { list ->
                 if (!autoReverse) {
@@ -2183,13 +1868,16 @@
             }
         )
         if (crossAxis != null) {
-            val actualCross = expected.map {
-                it.first to actualBounds.getValue(it.first.toString()).topLeft
-                    .let { offset -> if (isVertical) offset.x else offset.y }
-            }
+            val actualCross =
+                expected.map {
+                    it.first to
+                        actualBounds.getValue(it.first.toString()).topLeft.let { offset ->
+                            if (isVertical) offset.x else offset.y
+                        }
+                }
             Truth.assertWithMessage(
-                "CrossAxis" + if (fraction != null) "for fraction=$fraction" else ""
-            )
+                    "CrossAxis" + if (fraction != null) "for fraction=$fraction" else ""
+                )
                 .that(actualCross)
                 .isEqualTo(crossAxis.map { it.first to it.second.roundToInt() })
         }
@@ -2202,9 +1890,7 @@
     }
 
     private val visibleItemsOffsets: List<Pair<Any, IntOffset>>
-        get() = state.layoutInfo.visibleItemsInfo.map {
-            it.key to it.offset
-        }
+        get() = state.layoutInfo.visibleItemsInfo.map { it.key to it.offset }
 
     private fun onAnimationFrame(duration: Long = Duration, onFrame: (fraction: Float) -> Unit) {
         require(duration.mod(FrameDuration) == 0L)
@@ -2238,8 +1924,7 @@
         if (isVertical) {
             LazyVerticalStaggeredGrid(
                 StaggeredGridCells.Fixed(cells),
-                Modifier
-                    .requiredHeightIn(minSize, maxSize)
+                Modifier.requiredHeightIn(minSize, maxSize)
                     .requiredWidth(crossAxisSize ?: (itemSizeDp * cells))
                     .testTag(ContainerTag),
                 state = state,
@@ -2251,8 +1936,7 @@
         } else {
             LazyHorizontalStaggeredGrid(
                 StaggeredGridCells.Fixed(cells),
-                Modifier
-                    .requiredWidthIn(minSize, maxSize)
+                Modifier.requiredWidthIn(minSize, maxSize)
                     .requiredHeight(itemSizeDp * cells)
                     .testTag(ContainerTag),
                 state = state,
@@ -2272,14 +1956,14 @@
     ) {
         Box(
             if (animSpec != null) {
-                Modifier.animateItem(
-                    fadeInSpec = null,
-                    fadeOutSpec = null,
-                    placementSpec = animSpec
-                )
-            } else {
-                Modifier
-            }
+                    Modifier.animateItem(
+                        fadeInSpec = null,
+                        fadeOutSpec = null,
+                        placementSpec = animSpec
+                    )
+                } else {
+                    Modifier
+                }
                 .then(
                     if (isVertical) {
                         Modifier.requiredHeight(size)
@@ -2300,17 +1984,15 @@
     companion object {
         @JvmStatic
         @Parameterized.Parameters(name = "{0}")
-        fun params() = arrayOf(
-            Config(isVertical = true, reverseLayout = false),
-            Config(isVertical = false, reverseLayout = false),
-            Config(isVertical = true, reverseLayout = true),
-            Config(isVertical = false, reverseLayout = true),
-        )
+        fun params() =
+            arrayOf(
+                Config(isVertical = true, reverseLayout = false),
+                Config(isVertical = false, reverseLayout = false),
+                Config(isVertical = true, reverseLayout = true),
+                Config(isVertical = false, reverseLayout = true),
+            )
 
-        class Config(
-            val isVertical: Boolean,
-            val reverseLayout: Boolean
-        ) {
+        class Config(val isVertical: Boolean, val reverseLayout: Boolean) {
             override fun toString() =
                 (if (isVertical) "LazyVerticalGrid" else "LazyHorizontalGrid") +
                     (if (reverseLayout) "(reverse)" else "")
@@ -2322,6 +2004,5 @@
 private val Duration = 64L // 4 frames, so we get 0f, 0.25f, 0.5f, 0.75f and 1f fractions
 private val AnimSpec = tween<IntOffset>(Duration.toInt(), easing = LinearEasing)
 private val ContainerTag = "container"
-private val NodesWithTagMatcher = SemanticsMatcher("NodesWithTag") {
-    it.config.contains(SemanticsProperties.TestTag)
-}
+private val NodesWithTagMatcher =
+    SemanticsMatcher("NodesWithTag") { it.config.contains(SemanticsProperties.TestTag) }
diff --git a/compose/foundation/foundation/integration-tests/lazy-tests/src/androidTest/kotlin/androidx/compose/foundation/lazy/staggeredgrid/LazyStaggeredGridLayoutInfoTest.kt b/compose/foundation/foundation/integration-tests/lazy-tests/src/androidTest/kotlin/androidx/compose/foundation/lazy/staggeredgrid/LazyStaggeredGridLayoutInfoTest.kt
index 43a3e85..363367c 100644
--- a/compose/foundation/foundation/integration-tests/lazy-tests/src/androidTest/kotlin/androidx/compose/foundation/lazy/staggeredgrid/LazyStaggeredGridLayoutInfoTest.kt
+++ b/compose/foundation/foundation/integration-tests/lazy-tests/src/androidTest/kotlin/androidx/compose/foundation/lazy/staggeredgrid/LazyStaggeredGridLayoutInfoTest.kt
@@ -36,17 +36,17 @@
 
 @MediumTest
 @RunWith(Parameterized::class)
-class LazyStaggeredGridLayoutInfoTest(
-    orientation: Orientation
-) : BaseLazyStaggeredGridWithOrientation(orientation) {
+class LazyStaggeredGridLayoutInfoTest(orientation: Orientation) :
+    BaseLazyStaggeredGridWithOrientation(orientation) {
 
     companion object {
         @JvmStatic
         @Parameterized.Parameters(name = "{0}")
-        fun initParameters(): Array<Any> = arrayOf(
-            Orientation.Vertical,
-            Orientation.Horizontal,
-        )
+        fun initParameters(): Array<Any> =
+            arrayOf(
+                Orientation.Vertical,
+                Orientation.Horizontal,
+            )
     }
 
     private var itemSizeDp: Dp = Dp.Unspecified
@@ -54,26 +54,16 @@
 
     @Before
     fun setUp() {
-        with(rule.density) {
-            itemSizeDp = itemSizePx.toDp()
-        }
+        with(rule.density) { itemSizeDp = itemSizePx.toDp() }
     }
 
     @Test
     fun contentTypeIsCorrect() {
         val state = LazyStaggeredGridState()
         rule.setContent {
-            LazyStaggeredGrid(
-                lanes = 1,
-                state = state,
-                modifier = Modifier.requiredSize(30.dp)
-            ) {
-                items(2, contentType = { it }) {
-                    Box(Modifier.size(10.dp))
-                }
-                item {
-                    Box(Modifier.size(10.dp))
-                }
+            LazyStaggeredGrid(lanes = 1, state = state, modifier = Modifier.requiredSize(30.dp)) {
+                items(2, contentType = { it }) { Box(Modifier.size(10.dp)) }
+                item { Box(Modifier.size(10.dp)) }
             }
         }
 
@@ -91,13 +81,9 @@
             LazyStaggeredGrid(
                 lanes = 2,
                 state = state,
-                modifier = Modifier
-                    .mainAxisSize(itemSizeDp * 1.5f)
-                    .crossAxisSize(itemSizeDp * 2)
+                modifier = Modifier.mainAxisSize(itemSizeDp * 1.5f).crossAxisSize(itemSizeDp * 2)
             ) {
-                items(100) {
-                    Spacer(Modifier.mainAxisSize(itemSizeDp))
-                }
+                items(100) { Spacer(Modifier.mainAxisSize(itemSizeDp)) }
             }
         }
 
@@ -106,14 +92,15 @@
                 state.scrollBy(10f)
                 assertThat(state.firstVisibleItemIndex).isEqualTo(0)
                 assertThat(state.firstVisibleItemScrollOffset).isEqualTo(10)
-                assertThat(state.layoutInfo.itemPairs).isEqualTo(
-                    listOf(
-                        0 to axisIntOffset(mainAxis = -10, crossAxis = 0),
-                        1 to axisIntOffset(mainAxis = -10, crossAxis = itemSizePx),
-                        2 to axisIntOffset(mainAxis = itemSizePx - 10, crossAxis = 0),
-                        3 to axisIntOffset(mainAxis = itemSizePx - 10, crossAxis = itemSizePx)
+                assertThat(state.layoutInfo.itemPairs)
+                    .isEqualTo(
+                        listOf(
+                            0 to axisIntOffset(mainAxis = -10, crossAxis = 0),
+                            1 to axisIntOffset(mainAxis = -10, crossAxis = itemSizePx),
+                            2 to axisIntOffset(mainAxis = itemSizePx - 10, crossAxis = 0),
+                            3 to axisIntOffset(mainAxis = itemSizePx - 10, crossAxis = itemSizePx)
+                        )
                     )
-                )
             }
         }
     }
@@ -123,19 +110,14 @@
         lateinit var state: LazyStaggeredGridState
         val startOffset = itemSizePx / 2
         rule.setContent {
-            state = rememberLazyStaggeredGridState(
-                initialFirstVisibleItemScrollOffset = startOffset
-            )
+            state =
+                rememberLazyStaggeredGridState(initialFirstVisibleItemScrollOffset = startOffset)
             LazyStaggeredGrid(
                 lanes = 2,
                 state = state,
-                modifier = Modifier
-                    .mainAxisSize(itemSizeDp * 1.5f)
-                    .crossAxisSize(itemSizeDp * 2)
+                modifier = Modifier.mainAxisSize(itemSizeDp * 1.5f).crossAxisSize(itemSizeDp * 2)
             ) {
-                items(100) {
-                    Spacer(Modifier.mainAxisSize(itemSizeDp))
-                }
+                items(100) { Spacer(Modifier.mainAxisSize(itemSizeDp)) }
             }
         }
 
@@ -145,17 +127,23 @@
                 assertThat(state.firstVisibleItemIndex).isEqualTo(0)
                 val expectedOffset = startOffset - 10
                 assertThat(state.firstVisibleItemScrollOffset).isEqualTo(expectedOffset)
-                assertThat(state.layoutInfo.itemPairs).isEqualTo(
-                    listOf(
-                        0 to axisIntOffset(mainAxis = -expectedOffset, crossAxis = 0),
-                        1 to axisIntOffset(mainAxis = -expectedOffset, crossAxis = itemSizePx),
-                        2 to axisIntOffset(mainAxis = itemSizePx - expectedOffset, crossAxis = 0),
-                        3 to axisIntOffset(
-                            mainAxis = itemSizePx - expectedOffset,
-                            crossAxis = itemSizePx
+                assertThat(state.layoutInfo.itemPairs)
+                    .isEqualTo(
+                        listOf(
+                            0 to axisIntOffset(mainAxis = -expectedOffset, crossAxis = 0),
+                            1 to axisIntOffset(mainAxis = -expectedOffset, crossAxis = itemSizePx),
+                            2 to
+                                axisIntOffset(
+                                    mainAxis = itemSizePx - expectedOffset,
+                                    crossAxis = 0
+                                ),
+                            3 to
+                                axisIntOffset(
+                                    mainAxis = itemSizePx - expectedOffset,
+                                    crossAxis = itemSizePx
+                                )
                         )
                     )
-                )
             }
         }
     }
@@ -168,27 +156,24 @@
             LazyStaggeredGrid(
                 lanes = 2,
                 state = state,
-                modifier = Modifier
-                    .mainAxisSize(itemSizeDp * 1.5f)
-                    .crossAxisSize(itemSizeDp * 2)
+                modifier = Modifier.mainAxisSize(itemSizeDp * 1.5f).crossAxisSize(itemSizeDp * 2)
             ) {
-                items(100) {
-                    Spacer(Modifier.mainAxisSize(itemSizeDp))
-                }
+                items(100) { Spacer(Modifier.mainAxisSize(itemSizeDp)) }
             }
         }
 
         rule.runOnIdle {
             runBlocking {
                 state.scrollBy(itemSizePx * 3f)
-                assertThat(state.layoutInfo.itemPairs).isEqualTo(
-                    listOf(
-                        6 to axisIntOffset(mainAxis = 0, crossAxis = 0),
-                        7 to axisIntOffset(mainAxis = 0, crossAxis = itemSizePx),
-                        8 to axisIntOffset(mainAxis = itemSizePx, crossAxis = 0),
-                        9 to axisIntOffset(mainAxis = itemSizePx, crossAxis = itemSizePx),
+                assertThat(state.layoutInfo.itemPairs)
+                    .isEqualTo(
+                        listOf(
+                            6 to axisIntOffset(mainAxis = 0, crossAxis = 0),
+                            7 to axisIntOffset(mainAxis = 0, crossAxis = itemSizePx),
+                            8 to axisIntOffset(mainAxis = itemSizePx, crossAxis = 0),
+                            9 to axisIntOffset(mainAxis = itemSizePx, crossAxis = itemSizePx),
+                        )
                     )
-                )
             }
         }
     }
@@ -201,27 +186,24 @@
             LazyStaggeredGrid(
                 lanes = 2,
                 state = state,
-                modifier = Modifier
-                    .mainAxisSize(itemSizeDp * 1.5f)
-                    .crossAxisSize(itemSizeDp * 2)
+                modifier = Modifier.mainAxisSize(itemSizeDp * 1.5f).crossAxisSize(itemSizeDp * 2)
             ) {
-                items(100) {
-                    Spacer(Modifier.mainAxisSize(itemSizeDp))
-                }
+                items(100) { Spacer(Modifier.mainAxisSize(itemSizeDp)) }
             }
         }
 
         rule.runOnIdle {
             runBlocking {
                 state.scrollBy(-itemSizePx * 3f)
-                assertThat(state.layoutInfo.itemPairs).isEqualTo(
-                    listOf(
-                        0 to axisIntOffset(mainAxis = 0, crossAxis = 0),
-                        1 to axisIntOffset(mainAxis = 0, crossAxis = itemSizePx),
-                        2 to axisIntOffset(mainAxis = itemSizePx, crossAxis = 0),
-                        3 to axisIntOffset(mainAxis = itemSizePx, crossAxis = itemSizePx),
+                assertThat(state.layoutInfo.itemPairs)
+                    .isEqualTo(
+                        listOf(
+                            0 to axisIntOffset(mainAxis = 0, crossAxis = 0),
+                            1 to axisIntOffset(mainAxis = 0, crossAxis = itemSizePx),
+                            2 to axisIntOffset(mainAxis = itemSizePx, crossAxis = 0),
+                            3 to axisIntOffset(mainAxis = itemSizePx, crossAxis = itemSizePx),
+                        )
                     )
-                )
             }
         }
     }
diff --git a/compose/foundation/foundation/integration-tests/lazy-tests/src/androidTest/kotlin/androidx/compose/foundation/lazy/staggeredgrid/LazyStaggeredGridPinnableContainerTest.kt b/compose/foundation/foundation/integration-tests/lazy-tests/src/androidTest/kotlin/androidx/compose/foundation/lazy/staggeredgrid/LazyStaggeredGridPinnableContainerTest.kt
index 8389142..89bb3bf 100644
--- a/compose/foundation/foundation/integration-tests/lazy-tests/src/androidTest/kotlin/androidx/compose/foundation/lazy/staggeredgrid/LazyStaggeredGridPinnableContainerTest.kt
+++ b/compose/foundation/foundation/integration-tests/lazy-tests/src/androidTest/kotlin/androidx/compose/foundation/lazy/staggeredgrid/LazyStaggeredGridPinnableContainerTest.kt
@@ -47,8 +47,7 @@
 @MediumTest
 class LazyStaggeredGridPinnableContainerTest {
 
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
     private var pinnableContainer: PinnableContainer? = null
 
@@ -64,16 +63,10 @@
 
     @Composable
     fun Item(index: Int) {
-        Box(
-            Modifier
-                .size(itemSize)
-                .testTag("$index")
-        )
+        Box(Modifier.size(itemSize).testTag("$index"))
         DisposableEffect(index) {
             composed.add(index)
-            onDispose {
-                composed.remove(index)
-            }
+            onDispose { composed.remove(index) }
         }
     }
 
@@ -96,15 +89,11 @@
             }
         }
 
-        rule.runOnIdle {
-            requireNotNull(pinnableContainer).pin()
-        }
+        rule.runOnIdle { requireNotNull(pinnableContainer).pin() }
 
         rule.runOnIdle {
             assertThat(composed).contains(1)
-            runBlocking {
-                state.scrollToItem(3)
-            }
+            runBlocking { state.scrollToItem(3) }
         }
 
         rule.waitUntil {
@@ -117,10 +106,7 @@
             assertThat(composed).contains(1)
         }
 
-        rule.onNodeWithTag("1")
-            .assertExists()
-            .assertIsNotDisplayed()
-            .assertIsPlaced()
+        rule.onNodeWithTag("1").assertExists().assertIsNotDisplayed().assertIsPlaced()
     }
 
     @Test
@@ -142,15 +128,9 @@
             }
         }
 
-        rule.runOnIdle {
-            requireNotNull(pinnableContainer).pin()
-        }
+        rule.runOnIdle { requireNotNull(pinnableContainer).pin() }
 
-        rule.runOnIdle {
-            runBlocking {
-                state.scrollToItem(4)
-            }
-        }
+        rule.runOnIdle { runBlocking { state.scrollToItem(4) } }
 
         rule.waitUntil {
             // not visible items were disposed
@@ -185,11 +165,7 @@
             }
         }
 
-        rule.runOnIdle {
-            runBlocking {
-                state.scrollToItem(4)
-            }
-        }
+        rule.runOnIdle { runBlocking { state.scrollToItem(4) } }
 
         rule.waitUntil {
             // wait for not visible items to be disposed
@@ -201,11 +177,7 @@
             assertThat(composed).contains(5)
         }
 
-        rule.runOnIdle {
-            runBlocking {
-                state.scrollToItem(0)
-            }
-        }
+        rule.runOnIdle { runBlocking { state.scrollToItem(0) } }
 
         rule.waitUntil {
             // wait for not visible items to be disposed
@@ -241,32 +213,23 @@
             }
         }
 
-        val handle = rule.runOnIdle {
-            requireNotNull(pinnableContainer).pin()
-        }
+        val handle = rule.runOnIdle { requireNotNull(pinnableContainer).pin() }
 
-        rule.runOnIdle {
-            runBlocking {
-                state.scrollToItem(3)
-            }
-        }
+        rule.runOnIdle { runBlocking { state.scrollToItem(3) } }
 
         rule.waitUntil {
             // wait for not visible items to be disposed
             !composed.contains(0)
         }
 
-        rule.runOnIdle {
-            handle.release()
-        }
+        rule.runOnIdle { handle.release() }
 
         rule.waitUntil {
             // wait for unpinned item to be disposed
             !composed.contains(1)
         }
 
-        rule.onNodeWithTag("1")
-            .assertIsNotPlaced()
+        rule.onNodeWithTag("1").assertIsNotPlaced()
     }
 
     @Test
@@ -294,9 +257,7 @@
             requireNotNull(pinnableContainer).pin()
         }
 
-        rule.runOnIdle {
-            list = listOf(0, 3, 4, 1, 2)
-        }
+        rule.runOnIdle { list = listOf(0, 3, 4, 1, 2) }
 
         rule.waitUntil {
             // wait for not visible item to be disposed
@@ -307,8 +268,7 @@
             assertThat(composed).containsExactly(0, 3, 4, 2) // 2 is pinned
         }
 
-        rule.onNodeWithTag("2")
-            .assertIsPlaced()
+        rule.onNodeWithTag("2").assertIsPlaced()
     }
 
     @Test
@@ -330,15 +290,11 @@
             }
         }
 
-        rule.runOnIdle {
-            requireNotNull(pinnableContainer).pin()
-        }
+        rule.runOnIdle { requireNotNull(pinnableContainer).pin() }
 
         rule.runOnIdle {
             assertThat(composed).contains(3)
-            runBlocking {
-                state.scrollToItem(0)
-            }
+            runBlocking { state.scrollToItem(0) }
         }
 
         rule.waitUntil {
@@ -356,8 +312,7 @@
             !composed.contains(2)
         }
 
-        rule.onNodeWithTag("2")
-            .assertIsNotPlaced()
+        rule.onNodeWithTag("2").assertIsNotPlaced()
     }
 
     @Test
@@ -379,19 +334,13 @@
             }
         }
 
-        rule.runOnIdle {
-            state = LazyStaggeredGridState()
-        }
+        rule.runOnIdle { state = LazyStaggeredGridState() }
 
-        rule.runOnIdle {
-            requireNotNull(pinnableContainer).pin()
-        }
+        rule.runOnIdle { requireNotNull(pinnableContainer).pin() }
 
         rule.runOnIdle {
             assertThat(composed).contains(1)
-            runBlocking {
-                state.scrollToItem(2)
-            }
+            runBlocking { state.scrollToItem(2) }
         }
 
         rule.waitUntil {
@@ -399,9 +348,7 @@
             !composed.contains(1)
         }
 
-        rule.runOnIdle {
-            assertThat(composed).contains(0)
-        }
+        rule.runOnIdle { assertThat(composed).contains(0) }
     }
 
     @Test
@@ -425,15 +372,11 @@
             }
         }
 
-        rule.runOnIdle {
-            requireNotNull(pinnableContainer).pin()
-        }
+        rule.runOnIdle { requireNotNull(pinnableContainer).pin() }
 
         rule.runOnIdle {
             assertThat(composed).contains(4)
-            runBlocking {
-                state.scrollToItem(6)
-            }
+            runBlocking { state.scrollToItem(6) }
         }
 
         rule.waitUntil {
@@ -441,14 +384,9 @@
             !composed.contains(4)
         }
 
-        rule.runOnIdle {
-            assertThat(composed).contains(3)
-        }
+        rule.runOnIdle { assertThat(composed).contains(3) }
 
-        rule.onNodeWithTag("3")
-            .assertExists()
-            .assertIsNotDisplayed()
-            .assertIsPlaced()
+        rule.onNodeWithTag("3").assertExists().assertIsNotDisplayed().assertIsPlaced()
     }
 
     @Test
@@ -474,9 +412,7 @@
         rule.runOnIdle {
             requireNotNull(pinnableContainer).pin()
             assertThat(composed).contains(4)
-            runBlocking {
-                state.scrollToItem(0)
-            }
+            runBlocking { state.scrollToItem(0) }
         }
 
         rule.waitUntil {
@@ -484,17 +420,14 @@
             !composed.contains(4)
         }
 
-        rule.runOnIdle {
-            itemCount = 3
-        }
+        rule.runOnIdle { itemCount = 3 }
 
         rule.waitUntil {
             // wait for pinned item to be disposed
             !composed.contains(3)
         }
 
-        rule.onNodeWithTag("3")
-            .assertIsNotPlaced()
+        rule.onNodeWithTag("3").assertIsNotPlaced()
     }
 
     @Test
@@ -517,21 +450,16 @@
             }
         }
 
-        rule.runOnIdle {
-            requireNotNull(pinnableContainer).pin()
-        }
+        rule.runOnIdle { requireNotNull(pinnableContainer).pin() }
 
-        rule.runOnIdle {
-            items = listOf(0, 2)
-        }
+        rule.runOnIdle { items = listOf(0, 2) }
 
         rule.waitUntil {
             // wait for pinned item to be disposed
             !composed.contains(1)
         }
 
-        rule.onNodeWithTag("1")
-            .assertIsNotPlaced()
+        rule.onNodeWithTag("1").assertIsNotPlaced()
     }
 
     @Test
@@ -563,9 +491,7 @@
             // pinned 3 times in total
             handles.add(requireNotNull(pinnableContainer).pin())
             assertThat(composed).contains(0)
-            runBlocking {
-                state.scrollToItem(3)
-            }
+            runBlocking { state.scrollToItem(3) }
         }
 
         rule.waitUntil {
@@ -589,12 +515,13 @@
     @Test
     fun pinningIsPropagatedToParentContainer() {
         var parentPinned = false
-        val parentContainer = object : PinnableContainer {
-            override fun pin(): PinnedHandle {
-                parentPinned = true
-                return PinnedHandle { parentPinned = false }
+        val parentContainer =
+            object : PinnableContainer {
+                override fun pin(): PinnedHandle {
+                    parentPinned = true
+                    return PinnedHandle { parentPinned = false }
+                }
             }
-        }
         // Arrange.
         rule.setContent {
             CompositionLocalProvider(LocalPinnableContainer provides parentContainer) {
@@ -607,36 +534,34 @@
             }
         }
 
-        val handle = rule.runOnIdle {
-            requireNotNull(pinnableContainer).pin()
-        }
+        val handle = rule.runOnIdle { requireNotNull(pinnableContainer).pin() }
 
         rule.runOnIdle {
             assertThat(parentPinned).isTrue()
             handle.release()
         }
 
-        rule.runOnIdle {
-            assertThat(parentPinned).isFalse()
-        }
+        rule.runOnIdle { assertThat(parentPinned).isFalse() }
     }
 
     @Test
     fun parentContainerChange_pinningIsMaintained() {
         var parent1Pinned = false
-        val parent1Container = object : PinnableContainer {
-            override fun pin(): PinnedHandle {
-                parent1Pinned = true
-                return PinnedHandle { parent1Pinned = false }
+        val parent1Container =
+            object : PinnableContainer {
+                override fun pin(): PinnedHandle {
+                    parent1Pinned = true
+                    return PinnedHandle { parent1Pinned = false }
+                }
             }
-        }
         var parent2Pinned = false
-        val parent2Container = object : PinnableContainer {
-            override fun pin(): PinnedHandle {
-                parent2Pinned = true
-                return PinnedHandle { parent2Pinned = false }
+        val parent2Container =
+            object : PinnableContainer {
+                override fun pin(): PinnedHandle {
+                    parent2Pinned = true
+                    return PinnedHandle { parent2Pinned = false }
+                }
             }
-        }
         var parentContainer by mutableStateOf<PinnableContainer>(parent1Container)
         // Arrange.
         rule.setContent {
@@ -650,9 +575,7 @@
             }
         }
 
-        rule.runOnIdle {
-            requireNotNull(pinnableContainer).pin()
-        }
+        rule.runOnIdle { requireNotNull(pinnableContainer).pin() }
 
         rule.runOnIdle {
             assertThat(parent1Pinned).isTrue()
diff --git a/compose/foundation/foundation/integration-tests/lazy-tests/src/androidTest/kotlin/androidx/compose/foundation/lazy/staggeredgrid/LazyStaggeredGridPrefetcherTest.kt b/compose/foundation/foundation/integration-tests/lazy-tests/src/androidTest/kotlin/androidx/compose/foundation/lazy/staggeredgrid/LazyStaggeredGridPrefetcherTest.kt
index 72084b7..42f61c3 100644
--- a/compose/foundation/foundation/integration-tests/lazy-tests/src/androidTest/kotlin/androidx/compose/foundation/lazy/staggeredgrid/LazyStaggeredGridPrefetcherTest.kt
+++ b/compose/foundation/foundation/integration-tests/lazy-tests/src/androidTest/kotlin/androidx/compose/foundation/lazy/staggeredgrid/LazyStaggeredGridPrefetcherTest.kt
@@ -51,17 +51,17 @@
 @OptIn(ExperimentalFoundationApi::class)
 @LargeTest
 @RunWith(Parameterized::class)
-class LazyStaggeredGridPrefetcherTest(
-    orientation: Orientation
-) : BaseLazyStaggeredGridWithOrientation(orientation) {
+class LazyStaggeredGridPrefetcherTest(orientation: Orientation) :
+    BaseLazyStaggeredGridWithOrientation(orientation) {
 
     companion object {
         @JvmStatic
         @Parameterized.Parameters(name = "{0}")
-        fun initParameters(): Array<Any> = arrayOf(
-            Orientation.Vertical,
-            Orientation.Horizontal,
-        )
+        fun initParameters(): Array<Any> =
+            arrayOf(
+                Orientation.Vertical,
+                Orientation.Horizontal,
+            )
     }
 
     val itemsSizePx = 30
@@ -87,102 +87,68 @@
     fun notPrefetchingForwardInitially() {
         composeStaggeredGrid()
 
-        rule.onNodeWithTag("4")
-            .assertDoesNotExist()
+        rule.onNodeWithTag("4").assertDoesNotExist()
     }
 
     @Test
     fun notPrefetchingBackwardInitially() {
         composeStaggeredGrid(firstItem = 4)
 
-        rule.onNodeWithTag("0")
-            .assertDoesNotExist()
+        rule.onNodeWithTag("0").assertDoesNotExist()
     }
 
     @Test
     fun prefetchingForwardAfterSmallScroll() {
         composeStaggeredGrid()
 
-        rule.runOnIdle {
-            runBlocking {
-                state.scrollBy(5f)
-            }
-        }
+        rule.runOnIdle { runBlocking { state.scrollBy(5f) } }
 
         waitForPrefetch()
 
-        rule.onNodeWithTag("4")
-            .assertExists()
-        rule.onNodeWithTag("5")
-            .assertExists()
-        rule.onNodeWithTag("6")
-            .assertDoesNotExist()
+        rule.onNodeWithTag("4").assertExists()
+        rule.onNodeWithTag("5").assertExists()
+        rule.onNodeWithTag("6").assertDoesNotExist()
     }
 
     @Test
     fun prefetchingBackwardAfterSmallScroll() {
         composeStaggeredGrid(firstItem = 4, itemOffset = 10)
 
-        rule.runOnIdle {
-            runBlocking {
-                state.scrollBy(-5f)
-            }
-        }
+        rule.runOnIdle { runBlocking { state.scrollBy(-5f) } }
 
         waitForPrefetch()
 
-        rule.onNodeWithTag("2")
-            .assertExists()
-        rule.onNodeWithTag("3")
-            .assertExists()
-        rule.onNodeWithTag("0")
-            .assertDoesNotExist()
+        rule.onNodeWithTag("2").assertExists()
+        rule.onNodeWithTag("3").assertExists()
+        rule.onNodeWithTag("0").assertDoesNotExist()
     }
 
     @Test
     fun prefetchingForwardAndBackward() {
         composeStaggeredGrid(firstItem = 4)
 
-        rule.runOnIdle {
-            runBlocking {
-                state.scrollBy(5f)
-            }
-        }
+        rule.runOnIdle { runBlocking { state.scrollBy(5f) } }
 
         waitForPrefetch()
 
-        rule.onNodeWithTag("8")
-            .assertExists()
-        rule.onNodeWithTag("9")
-            .assertExists()
-        rule.onNodeWithTag("0")
-            .assertDoesNotExist()
+        rule.onNodeWithTag("8").assertExists()
+        rule.onNodeWithTag("9").assertExists()
+        rule.onNodeWithTag("0").assertDoesNotExist()
 
-        rule.runOnIdle {
-            runBlocking {
-                state.scrollBy(-5f)
-            }
-        }
+        rule.runOnIdle { runBlocking { state.scrollBy(-5f) } }
 
         waitForPrefetch()
 
-        rule.onNodeWithTag("2")
-            .assertExists()
-        rule.onNodeWithTag("3")
-            .assertExists()
-        rule.onNodeWithTag("8")
-            .assertDoesNotExist()
+        rule.onNodeWithTag("2").assertExists()
+        rule.onNodeWithTag("3").assertExists()
+        rule.onNodeWithTag("8").assertDoesNotExist()
     }
 
     @Test
     fun prefetchingForwardTwice() {
         composeStaggeredGrid()
 
-        rule.runOnIdle {
-            runBlocking {
-                state.scrollBy(5f)
-            }
-        }
+        rule.runOnIdle { runBlocking { state.scrollBy(5f) } }
 
         waitForPrefetch()
 
@@ -195,23 +161,16 @@
 
         waitForPrefetch()
 
-        rule.onNodeWithTag("4")
-            .assertIsDisplayed()
-        rule.onNodeWithTag("6")
-            .assertExists()
-        rule.onNodeWithTag("8")
-            .assertDoesNotExist()
+        rule.onNodeWithTag("4").assertIsDisplayed()
+        rule.onNodeWithTag("6").assertExists()
+        rule.onNodeWithTag("8").assertDoesNotExist()
     }
 
     @Test
     fun prefetchingBackwardTwice() {
         composeStaggeredGrid(firstItem = 8)
 
-        rule.runOnIdle {
-            runBlocking {
-                state.scrollBy(-5f)
-            }
-        }
+        rule.runOnIdle { runBlocking { state.scrollBy(-5f) } }
 
         waitForPrefetch()
 
@@ -224,14 +183,10 @@
 
         waitForPrefetch()
 
-        rule.onNodeWithTag("4")
-            .assertIsDisplayed()
-        rule.onNodeWithTag("6")
-            .assertIsDisplayed()
-        rule.onNodeWithTag("2")
-            .assertExists()
-        rule.onNodeWithTag("0")
-            .assertDoesNotExist()
+        rule.onNodeWithTag("4").assertIsDisplayed()
+        rule.onNodeWithTag("6").assertIsDisplayed()
+        rule.onNodeWithTag("2").assertExists()
+        rule.onNodeWithTag("0").assertDoesNotExist()
     }
 
     @Test
@@ -247,102 +202,96 @@
 
         waitForPrefetch()
 
-        rule.onNodeWithTag("12")
-            .assertExists()
-            .assertIsNotDisplayed()
-        rule.onNodeWithTag("13")
-            .assertExists()
-            .assertIsNotDisplayed()
-        rule.onNodeWithTag("4")
-            .assertDoesNotExist()
-        rule.onNodeWithTag("5")
-            .assertDoesNotExist()
+        rule.onNodeWithTag("12").assertExists().assertIsNotDisplayed()
+        rule.onNodeWithTag("13").assertExists().assertIsNotDisplayed()
+        rule.onNodeWithTag("4").assertDoesNotExist()
+        rule.onNodeWithTag("5").assertDoesNotExist()
     }
 
-//    @Test
-//    fun prefetchingForwardAndBackwardReverseLayout() {
-//        composeStaggeredGrid(firstItem = 2, reverseLayout = true)
-//
-//        rule.runOnIdle {
-//            runBlocking {
-//                state.scrollBy(5f)
-//            }
-//        }
-//
-//        waitForPrefetch(6)
-//
-//        rule.onNodeWithTag("6")
-//            .assertExists()
-//        rule.onNodeWithTag("7")
-//            .assertExists()
-//        rule.onNodeWithTag("0")
-//            .assertDoesNotExist()
-//        rule.onNodeWithTag("1")
-//            .assertDoesNotExist()
-//
-//        rule.runOnIdle {
-//            runBlocking {
-//                state.scrollBy(-2f)
-//                state.scrollBy(-1f)
-//            }
-//        }
-//
-//        waitForPrefetch(0)
-//
-//        rule.onNodeWithTag("0")
-//            .assertExists()
-//        rule.onNodeWithTag("1")
-//            .assertExists()
-//        rule.onNodeWithTag("6")
-//            .assertDoesNotExist()
-//        rule.onNodeWithTag("7")
-//            .assertDoesNotExist()
-//    }
+    //    @Test
+    //    fun prefetchingForwardAndBackwardReverseLayout() {
+    //        composeStaggeredGrid(firstItem = 2, reverseLayout = true)
+    //
+    //        rule.runOnIdle {
+    //            runBlocking {
+    //                state.scrollBy(5f)
+    //            }
+    //        }
+    //
+    //        waitForPrefetch(6)
+    //
+    //        rule.onNodeWithTag("6")
+    //            .assertExists()
+    //        rule.onNodeWithTag("7")
+    //            .assertExists()
+    //        rule.onNodeWithTag("0")
+    //            .assertDoesNotExist()
+    //        rule.onNodeWithTag("1")
+    //            .assertDoesNotExist()
+    //
+    //        rule.runOnIdle {
+    //            runBlocking {
+    //                state.scrollBy(-2f)
+    //                state.scrollBy(-1f)
+    //            }
+    //        }
+    //
+    //        waitForPrefetch(0)
+    //
+    //        rule.onNodeWithTag("0")
+    //            .assertExists()
+    //        rule.onNodeWithTag("1")
+    //            .assertExists()
+    //        rule.onNodeWithTag("6")
+    //            .assertDoesNotExist()
+    //        rule.onNodeWithTag("7")
+    //            .assertDoesNotExist()
+    //    }
 
-//    @Test
-//    fun prefetchingForwardAndBackwardWithContentPadding() {
-//        val halfItemSize = itemsSizeDp / 2f
-//        composeStaggeredGrid(
-//            firstItem = 4,
-//            itemOffset = 5,
-//            contentPadding = PaddingValues(mainAxis = halfItemSize)
-//        )
-//
-//        rule.onNodeWithTag("2")
-//            .assertIsDisplayed()
-//        rule.onNodeWithTag("4")
-//            .assertIsDisplayed()
-//        rule.onNodeWithTag("6")
-//            .assertIsDisplayed()
-//        rule.onNodeWithTag("0")
-//            .assertDoesNotExist()
-//        rule.onNodeWithTag("8")
-//            .assertDoesNotExist()
-//
-//        rule.runOnIdle {
-//            runBlocking {
-//                state.scrollBy(5f)
-//            }
-//        }
-//
-//        waitForPrefetch(6)
-//
-//        rule.onNodeWithTag("8")
-//            .assertExists()
-//        rule.onNodeWithTag("0")
-//            .assertDoesNotExist()
-//
-//        rule.runOnIdle {
-//            runBlocking {
-//                state.scrollBy(-2f)
-//            }
-//        }
-//
-//        waitForPrefetch(0)
-//
-//        rule.onNodeWithTag("0")
-//            .assertExists()
-//    }
+    //    @Test
+    //    fun prefetchingForwardAndBackwardWithContentPadding() {
+    //        val halfItemSize = itemsSizeDp / 2f
+    //        composeStaggeredGrid(
+    //            firstItem = 4,
+    //            itemOffset = 5,
+    //            contentPadding = PaddingValues(mainAxis = halfItemSize)
+    //        )
+    //
+    //        rule.onNodeWithTag("2")
+    //            .assertIsDisplayed()
+    //        rule.onNodeWithTag("4")
+    //            .assertIsDisplayed()
+    //        rule.onNodeWithTag("6")
+    //            .assertIsDisplayed()
+    //        rule.onNodeWithTag("0")
+    //            .assertDoesNotExist()
+    //        rule.onNodeWithTag("8")
+    //            .assertDoesNotExist()
+    //
+    //        rule.runOnIdle {
+    //            runBlocking {
+    //                state.scrollBy(5f)
+    //            }
+    //        }
+    //
+    //        waitForPrefetch(6)
+    //
+    //        rule.onNodeWithTag("8")
+    //            .assertExists()
+    //        rule.onNodeWithTag("0")
+    //            .assertDoesNotExist()
+    //
+    //        rule.runOnIdle {
+    //            runBlocking {
+    //                state.scrollBy(-2f)
+    //            }
+    //        }
+    //
+    //        waitForPrefetch(0)
+    //
+    //        rule.onNodeWithTag("0")
+    //            .assertExists()
+    //    }
 
     @Test
     fun disposingWhilePrefetchingScheduled() {
@@ -351,46 +300,42 @@
         state = LazyStaggeredGridState()
         rule.setContent {
             SubcomposeLayout(
-                modifier = object : RemeasurementModifier {
-                    override fun onRemeasurementAvailable(remeasurement: Remeasurement) {
-                        remeasure = remeasurement
-                    }
-                }
-            ) { constraints ->
-                val placeable = if (emit) {
-                    subcompose(Unit) {
-                        LazyStaggeredGrid(
-                            2,
-                            Modifier.mainAxisSize(itemsSizeDp * 1.5f),
-                            state,
-                        ) {
-                            items(1000) {
-                                Spacer(
-                                    Modifier.mainAxisSize(itemsSizeDp)
-                                )
-                            }
+                modifier =
+                    object : RemeasurementModifier {
+                        override fun onRemeasurementAvailable(remeasurement: Remeasurement) {
+                            remeasure = remeasurement
                         }
-                    }.first().measure(constraints)
-                } else {
-                    null
-                }
-                layout(constraints.maxWidth, constraints.maxHeight) {
-                    placeable?.place(0, 0)
-                }
+                    }
+            ) { constraints ->
+                val placeable =
+                    if (emit) {
+                        subcompose(Unit) {
+                                LazyStaggeredGrid(
+                                    2,
+                                    Modifier.mainAxisSize(itemsSizeDp * 1.5f),
+                                    state,
+                                ) {
+                                    items(1000) { Spacer(Modifier.mainAxisSize(itemsSizeDp)) }
+                                }
+                            }
+                            .first()
+                            .measure(constraints)
+                    } else {
+                        null
+                    }
+                layout(constraints.maxWidth, constraints.maxHeight) { placeable?.place(0, 0) }
             }
         }
 
         rule.runOnIdle {
             // this will schedule the prefetching
-            runBlocking(AutoTestFrameClock()) {
-                state.scrollBy(itemsSizePx.toFloat())
-            }
+            runBlocking(AutoTestFrameClock()) { state.scrollBy(itemsSizePx.toFloat()) }
             // then we synchronously dispose
             emit = false
             remeasure.forceRemeasure()
         }
 
-        rule.runOnIdle { }
+        rule.runOnIdle {}
     }
 
     @Test
@@ -427,9 +372,7 @@
         rule.waitForIdle()
         rule.waitForIdle()
 
-        rule.runOnIdle {
-            assertThat(composedItems).doesNotContain(3)
-        }
+        rule.runOnIdle { assertThat(composedItems).doesNotContain(3) }
     }
 
     @Test
@@ -461,9 +404,7 @@
             }
         }
 
-        rule.runOnIdle {
-            assertThat(activeNodes).doesNotContain(6)
-        }
+        rule.runOnIdle { assertThat(activeNodes).doesNotContain(6) }
     }
 
     @Test
@@ -478,20 +419,15 @@
                 items(100) {
                     DisposableEffect(it) {
                         activeNodes.add(it)
-                        onDispose {
-                            activeNodes.remove(it)
-                        }
+                        onDispose { activeNodes.remove(it) }
                     }
                     Spacer(
-                        Modifier
-                            .mainAxisSize(if (it == 0) itemsSizeDp else itemsSizeDp * 2)
+                        Modifier.mainAxisSize(if (it == 0) itemsSizeDp else itemsSizeDp * 2)
                             .border(Dp.Hairline, Color.Black)
                             .testTag("$it")
                             .layout { measurable, constraints ->
                                 val placeable = measurable.measure(constraints)
-                                layout(placeable.width, placeable.height) {
-                                    placeable.place(0, 0)
-                                }
+                                layout(placeable.width, placeable.height) { placeable.place(0, 0) }
                             }
                     )
                 }
@@ -553,28 +489,21 @@
                 items(
                     count = 100,
                     span = {
-                        if (it % 10 == 0)
-                            StaggeredGridItemSpan.FullLine
-                        else
-                            StaggeredGridItemSpan.SingleLane
+                        if (it % 10 == 0) StaggeredGridItemSpan.FullLine
+                        else StaggeredGridItemSpan.SingleLane
                     }
                 ) {
                     DisposableEffect(it) {
                         activeNodes.add(it)
-                        onDispose {
-                            activeNodes.remove(it)
-                        }
+                        onDispose { activeNodes.remove(it) }
                     }
                     Spacer(
-                        Modifier
-                            .border(Dp.Hairline, Color.Black)
+                        Modifier.border(Dp.Hairline, Color.Black)
                             .testTag("$it")
                             .layout { measurable, constraints ->
                                 val placeable = measurable.measure(constraints)
                                 nodeConstraints.put(it, constraints)
-                                layout(placeable.width, placeable.height) {
-                                    placeable.place(0, 0)
-                                }
+                                layout(placeable.width, placeable.height) { placeable.place(0, 0) }
                             }
                             .mainAxisSize(if (it == 0) itemsSizeDp else itemsSizeDp * 2)
                     )
@@ -593,11 +522,12 @@
         assertThat(activeNodes).contains(9)
 
         waitForPrefetch()
-        val expectedConstraints = if (vertical) {
-            Constraints.fixedWidth(itemsSizePx * 2)
-        } else {
-            Constraints.fixedHeight(itemsSizePx * 2)
-        }
+        val expectedConstraints =
+            if (vertical) {
+                Constraints.fixedWidth(itemsSizePx * 2)
+            } else {
+                Constraints.fixedHeight(itemsSizePx * 2)
+            }
         assertThat(nodeConstraints[10]).isEqualTo(expectedConstraints)
     }
 
@@ -613,28 +543,21 @@
                 items(
                     count = 100,
                     span = {
-                        if (it % 10 == 0)
-                            StaggeredGridItemSpan.FullLine
-                        else
-                            StaggeredGridItemSpan.SingleLane
+                        if (it % 10 == 0) StaggeredGridItemSpan.FullLine
+                        else StaggeredGridItemSpan.SingleLane
                     }
                 ) {
                     DisposableEffect(it) {
                         activeNodes.add(it)
-                        onDispose {
-                            activeNodes.remove(it)
-                        }
+                        onDispose { activeNodes.remove(it) }
                     }
                     Spacer(
-                        Modifier
-                            .mainAxisSize(if (it == 0) itemsSizeDp else itemsSizeDp * 2)
+                        Modifier.mainAxisSize(if (it == 0) itemsSizeDp else itemsSizeDp * 2)
                             .border(Dp.Hairline, Color.Black)
                             .testTag("$it")
                             .layout { measurable, constraints ->
                                 val placeable = measurable.measure(constraints)
-                                layout(placeable.width, placeable.height) {
-                                    placeable.place(0, 0)
-                                }
+                                layout(placeable.width, placeable.height) { placeable.place(0, 0) }
                             }
                     )
                 }
@@ -664,9 +587,7 @@
     }
 
     private fun waitForPrefetch() {
-        rule.runOnIdle {
-            scheduler.executeActiveRequests()
-        }
+        rule.runOnIdle { scheduler.executeActiveRequests() }
     }
 
     private val activeNodes = mutableSetOf<Int>()
@@ -676,10 +597,11 @@
         itemOffset: Int = 0,
     ) {
         rule.setContent {
-            state = rememberState(
-                initialFirstVisibleItemIndex = firstItem,
-                initialFirstVisibleItemOffset = itemOffset
-            )
+            state =
+                rememberState(
+                    initialFirstVisibleItemIndex = firstItem,
+                    initialFirstVisibleItemOffset = itemOffset
+                )
             LazyStaggeredGrid(
                 2,
                 Modifier.mainAxisSize(itemsSizeDp * 1.5f),
@@ -688,20 +610,15 @@
                 items(100) {
                     DisposableEffect(it) {
                         activeNodes.add(it)
-                        onDispose {
-                            activeNodes.remove(it)
-                        }
+                        onDispose { activeNodes.remove(it) }
                     }
                     Spacer(
-                        Modifier
-                            .mainAxisSize(itemsSizeDp)
+                        Modifier.mainAxisSize(itemsSizeDp)
                             .border(Dp.Hairline, Color.Black)
                             .testTag("$it")
                             .layout { measurable, constraints ->
                                 val placeable = measurable.measure(constraints)
-                                layout(placeable.width, placeable.height) {
-                                    placeable.place(0, 0)
-                                }
+                                layout(placeable.width, placeable.height) { placeable.place(0, 0) }
                             }
                     )
                 }
diff --git a/compose/foundation/foundation/integration-tests/lazy-tests/src/androidTest/kotlin/androidx/compose/foundation/lazy/staggeredgrid/LazyStaggeredGridRequestScrollTest.kt b/compose/foundation/foundation/integration-tests/lazy-tests/src/androidTest/kotlin/androidx/compose/foundation/lazy/staggeredgrid/LazyStaggeredGridRequestScrollTest.kt
index f8a8ed5..8627275 100644
--- a/compose/foundation/foundation/integration-tests/lazy-tests/src/androidTest/kotlin/androidx/compose/foundation/lazy/staggeredgrid/LazyStaggeredGridRequestScrollTest.kt
+++ b/compose/foundation/foundation/integration-tests/lazy-tests/src/androidTest/kotlin/androidx/compose/foundation/lazy/staggeredgrid/LazyStaggeredGridRequestScrollTest.kt
@@ -49,9 +49,7 @@
 class LazyStaggeredGridRequestScrollTest(private val orientation: Orientation) :
     BaseLazyStaggeredGridWithOrientation(orientation) {
 
-    private val itemSize = with(rule.density) {
-        100.toDp()
-    }
+    private val itemSize = with(rule.density) { 100.toDp() }
 
     @Test
     fun requestScrollToItem_withIndex0_itemsPrepended_scrollsToNewFirstItem() {
@@ -67,28 +65,20 @@
                 cells = StaggeredGridCells.Fixed(3),
                 state = state
             ) {
-                items(list, key = { it }) {
-                    Item(remember { "$it" })
-                }
+                items(list, key = { it }) { Item(remember { "$it" }) }
 
-                Snapshot.withoutReadObservation {
-                    state.requestScrollToItem(index = 0)
-                }
+                Snapshot.withoutReadObservation { state.requestScrollToItem(index = 0) }
             }
         }
 
         // When the list is updated by prepending from 0 to 9, such that the new list contains
         // from 0 to 15.
-        rule.runOnIdle {
-            list = (0..15).toList()
-        }
+        rule.runOnIdle { list = (0..15).toList() }
 
         // Then we are scrolled to the start where the visible items are 0, 1, and 2.
         rule.runOnIdle {
             Truth.assertThat(state.firstVisibleItemIndex).isEqualTo(0)
-            Truth.assertThat(
-                state.visibleKeys
-            ).isEqualTo(listOf(0, 1, 2, 3, 4, 5, 6, 7, 8))
+            Truth.assertThat(state.visibleKeys).isEqualTo(listOf(0, 1, 2, 3, 4, 5, 6, 7, 8))
         }
     }
 
@@ -106,26 +96,26 @@
                 cells = StaggeredGridCells.Fixed(3),
                 state = state
             ) {
-                items(list, key = { it }) {
-                    Item(remember { "$it" })
-                }
+                items(list, key = { it }) { Item(remember { "$it" }) }
 
-                Snapshot.withoutReadObservation {
-                    state.requestScrollToItem(index = 0)
-                }
+                Snapshot.withoutReadObservation { state.requestScrollToItem(index = 0) }
             }
         }
 
         // When we scroll towards the end very quickly.
         rule.onNode(hasScrollAction()).performTouchInput {
             swipeWithVelocity(
-                start = when (orientation) {
-                    Orientation.Vertical -> bottomCenter
-                    Orientation.Horizontal -> centerRight
-                }, end = when (orientation) {
-                    Orientation.Vertical -> topCenter
-                    Orientation.Horizontal -> centerLeft
-                }, endVelocity = 5_000F
+                start =
+                    when (orientation) {
+                        Orientation.Vertical -> bottomCenter
+                        Orientation.Horizontal -> centerRight
+                    },
+                end =
+                    when (orientation) {
+                        Orientation.Vertical -> topCenter
+                        Orientation.Horizontal -> centerLeft
+                    },
+                endVelocity = 5_000F
             )
         }
 
@@ -133,9 +123,7 @@
         // scrolled back to the start.
         rule.runOnIdle {
             Truth.assertThat(state.firstVisibleItemIndex).isNotEqualTo(0)
-            Truth.assertThat(
-                state.visibleKeys
-            ).isEqualTo(list.takeLast(9))
+            Truth.assertThat(state.visibleKeys).isEqualTo(list.takeLast(9))
         }
     }
 
@@ -163,22 +151,21 @@
             fun TestContent(list: List<Int>) {
                 LazyStaggeredGrid(
                     cells = StaggeredGridCells.FixedSize(itemSize),
-                    modifier = Modifier
-                        .width(listSize)
-                        .height(listSize), state = state, reverseLayout = true
+                    modifier = Modifier.width(listSize).height(listSize),
+                    state = state,
+                    reverseLayout = true
                 ) {
-                    items(list, key = { it }) {
-                        Item(remember { "$it" })
-                    }
+                    items(list, key = { it }) { Item(remember { "$it" }) }
                 }
 
                 SideEffect {
                     val firstMessageChanged = state.firstVisibleItemKey() != list.firstOrNull()
                     if (!state.canScrollBackward && firstMessageChanged) {
                         // This scrolls to the start of the first item.
-                        state.requestScrollToItem(index = 1, scrollOffset = with(rule.density) {
-                            -listSize.roundToPx()
-                        })
+                        state.requestScrollToItem(
+                            index = 1,
+                            scrollOffset = with(rule.density) { -listSize.roundToPx() }
+                        )
                     }
                 }
             }
@@ -188,9 +175,7 @@
         rule.onNode(hasScrollAction()).performScrollToIndex(0)
 
         // When the list is updated, prepending items 0 to 2 so the list contains from 0 to 30.
-        rule.runOnIdle {
-            list = (0..30).toList()
-        }
+        rule.runOnIdle { list = (0..30).toList() }
 
         // Then the first visible item has index 0, its key is 0, and it's scrolled to the start
         // of that item (since we're laying out from bottom-to-top/right-to-left, we want the offset
@@ -201,9 +186,7 @@
                 Truth.assertThat(state.firstVisibleItemScrollOffset)
                     .isEqualTo(itemSize.roundToPx() - listSize.roundToPx())
             }
-            Truth.assertThat(
-                state.visibleKeys
-            ).isEqualTo(listOf(0))
+            Truth.assertThat(state.visibleKeys).isEqualTo(listOf(0))
         }
     }
 
@@ -226,14 +209,10 @@
                     cells = StaggeredGridCells.Fixed(3),
                     state = state
                 ) {
-                    items(list, key = { it }) {
-                        Item(remember { "$it" })
-                    }
+                    items(list, key = { it }) { Item(remember { "$it" }) }
                 }
 
-                SideEffect {
-                    state.requestScrollToItem(index = state.firstVisibleItemIndex)
-                }
+                SideEffect { state.requestScrollToItem(index = state.firstVisibleItemIndex) }
             }
 
             TestContent(list = list)
@@ -250,9 +229,7 @@
         // (24, 25, 5).
         rule.runOnIdle {
             Truth.assertThat(state.firstVisibleItemIndex).isEqualTo(6)
-            Truth.assertThat(
-                state.visibleKeys
-            ).isEqualTo(listOf(7, 8, 9, 10, 11, 12, 13, 14, 15))
+            Truth.assertThat(state.visibleKeys).isEqualTo(listOf(7, 8, 9, 10, 11, 12, 13, 14, 15))
         }
     }
 
@@ -275,9 +252,7 @@
                     modifier = Modifier.size(itemSize * 2.5f),
                     state = state
                 ) {
-                    items(list, key = { it }) {
-                        Item(remember { "$it" })
-                    }
+                    items(list, key = { it }) { Item(remember { "$it" }) }
                 }
 
                 SideEffect {
@@ -292,16 +267,13 @@
         rule.onNode(hasScrollAction()).performScrollToIndex(15)
 
         // When the list is updated with the first item removed (now from 1 to 35).
-        rule.runOnIdle {
-            list = (1..35).toList()
-        }
+        rule.runOnIdle { list = (1..35).toList() }
 
         // Then first item is index is still 15, the items have shifted back one to (16, 17, 18).
         rule.runOnIdle {
             Truth.assertThat(state.firstVisibleItemIndex).isEqualTo(15)
-            Truth.assertThat(
-                state.visibleKeys
-            ).isEqualTo(listOf(16, 17, 18, 19, 20, 21, 22, 23, 24))
+            Truth.assertThat(state.visibleKeys)
+                .isEqualTo(listOf(16, 17, 18, 19, 20, 21, 22, 23, 24))
         }
     }
 
@@ -319,9 +291,7 @@
                 cells = StaggeredGridCells.FixedSize(itemSize),
                 state = state
             ) {
-                items(list, key = { it }) {
-                    Item(remember { "$it" })
-                }
+                items(list, key = { it }) { Item(remember { "$it" }) }
             }
         }
 
@@ -350,9 +320,7 @@
                 cells = StaggeredGridCells.Fixed(3),
                 state = state
             ) {
-                items(list, key = { it }) {
-                    Item(remember { "$it" })
-                }
+                items(list, key = { it }) { Item(remember { "$it" }) }
             }
         }
 
@@ -370,9 +338,8 @@
         // 22, 23, 24, 25, 26, 27, 28, 29, 30
         rule.runOnIdle {
             Truth.assertThat(state.firstVisibleItemIndex).isEqualTo(21)
-            Truth.assertThat(
-                state.visibleKeys
-            ).isEqualTo(listOf(21, 22, 23, 24, 25, 26, 27, 28, 29))
+            Truth.assertThat(state.visibleKeys)
+                .isEqualTo(listOf(21, 22, 23, 24, 25, 26, 27, 28, 29))
         }
     }
 
@@ -391,9 +358,7 @@
                 cells = StaggeredGridCells.FixedSize(itemSize),
                 state = state
             ) {
-                items(15, key = { it }) {
-                    Item(remember { "$it" })
-                }
+                items(15, key = { it }) { Item(remember { "$it" }) }
             }
         }
 
@@ -410,9 +375,7 @@
                 }
             }
         }
-        rule.runOnIdle {
-            state.requestScrollToItem(index = 0)
-        }
+        rule.runOnIdle { state.requestScrollToItem(index = 0) }
 
         // Then the scroll was canceled.
         rule.waitUntil { canceled }
@@ -434,9 +397,7 @@
                 cells = StaggeredGridCells.Fixed(3),
                 state = state
             ) {
-                items(list, key = { it }) {
-                    Item(remember { "$it" })
-                }
+                items(list, key = { it }) { Item(remember { "$it" }) }
 
                 Snapshot.withoutReadObservation {
                     if (state.firstVisibleItemIndex == 0) {
@@ -445,36 +406,26 @@
                 }
             }
         }
-        rule.runOnIdle {
-            list = (0..20).toList()
-        }
+        rule.runOnIdle { list = (0..20).toList() }
         rule.onNode(hasScrollAction()).performScrollToIndex(3)
 
         // When item 3 moves to the end of the list.
-        rule.runOnIdle {
-            list = listOf(0, 1, 2) + (4..20).toList() + listOf(3)
-        }
+        rule.runOnIdle { list = listOf(0, 1, 2) + (4..20).toList() + listOf(3) }
 
         // Then we are scrolled to the end where the visible items are
         // 13, 14, 15, 16, 17, 18, 19, 20, 3.
         rule.runOnIdle {
             Truth.assertThat(state.firstVisibleItemIndex).isEqualTo(list.size - 9)
-            Truth.assertThat(
-                state.visibleKeys
-            ).isEqualTo(listOf(13, 14, 15, 16, 17, 18, 19, 20, 3))
+            Truth.assertThat(state.visibleKeys).isEqualTo(listOf(13, 14, 15, 16, 17, 18, 19, 20, 3))
         }
     }
 
-    private fun LazyStaggeredGridState
-        .firstVisibleItemKey() = layoutInfo.visibleItemsInfo.firstOrNull()?.key
+    private fun LazyStaggeredGridState.firstVisibleItemKey() =
+        layoutInfo.visibleItemsInfo.firstOrNull()?.key
 
     @Composable
     private fun Item(tag: String) {
-        Spacer(
-            Modifier
-                .testTag(tag)
-                .size(itemSize)
-        )
+        Spacer(Modifier.testTag(tag).size(itemSize))
     }
 
     companion object {
diff --git a/compose/foundation/foundation/integration-tests/lazy-tests/src/androidTest/kotlin/androidx/compose/foundation/lazy/staggeredgrid/LazyStaggeredGridReverseLayoutTest.kt b/compose/foundation/foundation/integration-tests/lazy-tests/src/androidTest/kotlin/androidx/compose/foundation/lazy/staggeredgrid/LazyStaggeredGridReverseLayoutTest.kt
index 3ce5850..9dc95ee 100644
--- a/compose/foundation/foundation/integration-tests/lazy-tests/src/androidTest/kotlin/androidx/compose/foundation/lazy/staggeredgrid/LazyStaggeredGridReverseLayoutTest.kt
+++ b/compose/foundation/foundation/integration-tests/lazy-tests/src/androidTest/kotlin/androidx/compose/foundation/lazy/staggeredgrid/LazyStaggeredGridReverseLayoutTest.kt
@@ -45,10 +45,11 @@
     companion object {
         @JvmStatic
         @Parameterized.Parameters(name = "{0}")
-        fun initOrientation(): Array<Any> = arrayOf(
-            Orientation.Vertical,
-            Orientation.Horizontal,
-        )
+        fun initOrientation(): Array<Any> =
+            arrayOf(
+                Orientation.Vertical,
+                Orientation.Horizontal,
+            )
     }
 
     private val StaggeredGridTag = "LazyStaggeredGrid"
@@ -58,9 +59,7 @@
 
     @Before
     fun before() {
-        with(rule.density) {
-            itemSize = itemSizePx.toDp()
-        }
+        with(rule.density) { itemSize = itemSizePx.toDp() }
     }
 
     @Test
@@ -78,11 +77,13 @@
             }
         }
 
-        rule.onNodeWithTag("0")
+        rule
+            .onNodeWithTag("0")
             .assertMainAxisStartPositionInRootIsEqualTo(itemSize * 2)
             .assertMainAxisSizeIsEqualTo(itemSize * 2)
 
-        rule.onNodeWithTag("1")
+        rule
+            .onNodeWithTag("1")
             .assertMainAxisStartPositionInRootIsEqualTo(itemSize * 3)
             .assertMainAxisSizeIsEqualTo(itemSize)
     }
@@ -95,22 +96,24 @@
                 modifier = Modifier.axisSize(itemSize * 2, itemSize * 4),
                 reverseLayout = true
             ) {
-                items(4) {
-                    Box(Modifier.size(itemSize).testTag("$it"))
-                }
+                items(4) { Box(Modifier.size(itemSize).testTag("$it")) }
             }
         }
 
-        rule.onNodeWithTag("0")
+        rule
+            .onNodeWithTag("0")
             .assertMainAxisStartPositionInRootIsEqualTo(itemSize * 3)
             .assertCrossAxisStartPositionInRootIsEqualTo(0.dp)
-        rule.onNodeWithTag("1")
+        rule
+            .onNodeWithTag("1")
             .assertMainAxisStartPositionInRootIsEqualTo(itemSize * 3)
             .assertCrossAxisStartPositionInRootIsEqualTo(itemSize)
-        rule.onNodeWithTag("2")
+        rule
+            .onNodeWithTag("2")
             .assertMainAxisStartPositionInRootIsEqualTo(itemSize * 2)
             .assertCrossAxisStartPositionInRootIsEqualTo(0.dp)
-        rule.onNodeWithTag("3")
+        rule
+            .onNodeWithTag("3")
             .assertMainAxisStartPositionInRootIsEqualTo(itemSize * 2)
             .assertCrossAxisStartPositionInRootIsEqualTo(itemSize)
     }
@@ -125,9 +128,7 @@
                 reverseLayout = true,
                 state = state
             ) {
-                items(4) {
-                    Box(Modifier.size(itemSize).testTag("$it"))
-                }
+                items(4) { Box(Modifier.size(itemSize).testTag("$it")) }
             }
         }
 
@@ -147,25 +148,20 @@
                 reverseLayout = true,
                 state = state
             ) {
-                items(4) {
-                    Box(Modifier.size(itemSize).testTag("$it"))
-                }
+                items(4) { Box(Modifier.size(itemSize).testTag("$it")) }
             }
         }
 
         //  scroll down and as the scrolling is reversed it shouldn't affect anything
-        rule.onNodeWithTag(StaggeredGridTag)
-            .scrollMainAxisBy(itemSize)
+        rule.onNodeWithTag(StaggeredGridTag).scrollMainAxisBy(itemSize)
 
         rule.runOnIdle {
             assertThat(state.firstVisibleItemScrollOffset).isEqualTo(0)
             assertThat(state.firstVisibleItemIndex).isEqualTo(0)
         }
 
-        rule.onNodeWithTag("0")
-            .assertMainAxisStartPositionInRootIsEqualTo(itemSize * 3)
-        rule.onNodeWithTag("1")
-            .assertMainAxisStartPositionInRootIsEqualTo(itemSize * 3)
+        rule.onNodeWithTag("0").assertMainAxisStartPositionInRootIsEqualTo(itemSize * 3)
+        rule.onNodeWithTag("1").assertMainAxisStartPositionInRootIsEqualTo(itemSize * 3)
     }
 
     @Test
@@ -174,20 +170,15 @@
         rule.setContent {
             LazyStaggeredGrid(
                 lanes = 2,
-                modifier = Modifier
-                    .axisSize(itemSize * 2, itemSize * 2)
-                    .testTag(StaggeredGridTag),
+                modifier = Modifier.axisSize(itemSize * 2, itemSize * 2).testTag(StaggeredGridTag),
                 reverseLayout = true,
                 state = state
             ) {
-                items(6) {
-                    Box(Modifier.size(itemSize).testTag("$it"))
-                }
+                items(6) { Box(Modifier.size(itemSize).testTag("$it")) }
             }
         }
 
-        rule.onNodeWithTag(StaggeredGridTag)
-            .scrollMainAxisBy(-itemSize * 0.5f)
+        rule.onNodeWithTag(StaggeredGridTag).scrollMainAxisBy(-itemSize * 0.5f)
 
         rule.runOnIdle {
             assertThat(state.firstVisibleItemIndex).isEqualTo(0)
@@ -196,17 +187,13 @@
 
         val scrolledByDp = with(rule.density) { state.firstVisibleItemScrollOffset.toDp() }
 
-        rule.onNodeWithTag("0")
-            .assertMainAxisStartPositionInRootIsEqualTo(itemSize + scrolledByDp)
+        rule.onNodeWithTag("0").assertMainAxisStartPositionInRootIsEqualTo(itemSize + scrolledByDp)
 
-        rule.onNodeWithTag("1")
-            .assertMainAxisStartPositionInRootIsEqualTo(itemSize + scrolledByDp)
+        rule.onNodeWithTag("1").assertMainAxisStartPositionInRootIsEqualTo(itemSize + scrolledByDp)
 
-        rule.onNodeWithTag("2")
-            .assertMainAxisStartPositionInRootIsEqualTo(scrolledByDp)
+        rule.onNodeWithTag("2").assertMainAxisStartPositionInRootIsEqualTo(scrolledByDp)
 
-        rule.onNodeWithTag("3")
-            .assertMainAxisStartPositionInRootIsEqualTo(scrolledByDp)
+        rule.onNodeWithTag("3").assertMainAxisStartPositionInRootIsEqualTo(scrolledByDp)
     }
 
     @Test
@@ -215,31 +202,24 @@
         rule.setContent {
             LazyStaggeredGrid(
                 lanes = 2,
-                modifier = Modifier
-                    .axisSize(itemSize * 2, itemSize * 2)
-                    .testTag(StaggeredGridTag),
+                modifier = Modifier.axisSize(itemSize * 2, itemSize * 2).testTag(StaggeredGridTag),
                 reverseLayout = true,
                 state = state
             ) {
-                items(6) {
-                    Box(Modifier.size(itemSize).testTag("$it"))
-                }
+                items(6) { Box(Modifier.size(itemSize).testTag("$it")) }
             }
         }
 
-        rule.onNodeWithTag(StaggeredGridTag)
-            .scrollMainAxisBy(-itemSize * 10)
+        rule.onNodeWithTag(StaggeredGridTag).scrollMainAxisBy(-itemSize * 10)
 
         rule.runOnIdle {
             assertThat(state.firstVisibleItemIndex).isEqualTo(2)
             assertThat(state.firstVisibleItemScrollOffset).isEqualTo(0)
         }
 
-        rule.onNodeWithTag("4")
-            .assertMainAxisStartPositionInRootIsEqualTo(0.dp)
+        rule.onNodeWithTag("4").assertMainAxisStartPositionInRootIsEqualTo(0.dp)
 
-        rule.onNodeWithTag("5")
-            .assertMainAxisStartPositionInRootIsEqualTo(0.dp)
+        rule.onNodeWithTag("5").assertMainAxisStartPositionInRootIsEqualTo(0.dp)
     }
 
     @Test
@@ -249,32 +229,33 @@
             CompositionLocalProvider(LocalLayoutDirection provides LayoutDirection.Rtl) {
                 LazyStaggeredGrid(
                     lanes = 2,
-                    modifier = Modifier
-                        .axisSize(itemSize * 2, itemSize * 2)
-                        .testTag(StaggeredGridTag),
+                    modifier =
+                        Modifier.axisSize(itemSize * 2, itemSize * 2).testTag(StaggeredGridTag),
                     reverseLayout = true,
                     state = state
                 ) {
-                    items(6) {
-                        Box(Modifier.size(itemSize).testTag("$it"))
-                    }
+                    items(6) { Box(Modifier.size(itemSize).testTag("$it")) }
                 }
             }
         }
 
         if (vertical) {
-            rule.onNodeWithTag("0")
+            rule
+                .onNodeWithTag("0")
                 .assertMainAxisStartPositionInRootIsEqualTo(itemSize)
                 .assertCrossAxisStartPositionInRootIsEqualTo(itemSize)
-            rule.onNodeWithTag("1")
+            rule
+                .onNodeWithTag("1")
                 .assertMainAxisStartPositionInRootIsEqualTo(itemSize)
                 .assertCrossAxisStartPositionInRootIsEqualTo(0.dp)
         } else {
             // double reverse horizontally
-            rule.onNodeWithTag("0")
+            rule
+                .onNodeWithTag("0")
                 .assertMainAxisStartPositionInRootIsEqualTo(0.dp)
                 .assertCrossAxisStartPositionInRootIsEqualTo(0.dp)
-            rule.onNodeWithTag("1")
+            rule
+                .onNodeWithTag("1")
                 .assertMainAxisStartPositionInRootIsEqualTo(0.dp)
                 .assertCrossAxisStartPositionInRootIsEqualTo(itemSize)
         }
@@ -287,22 +268,18 @@
             CompositionLocalProvider(LocalLayoutDirection provides LayoutDirection.Rtl) {
                 LazyStaggeredGrid(
                     lanes = 2,
-                    modifier = Modifier
-                        .axisSize(itemSize * 2, itemSize * 2)
-                        .testTag(StaggeredGridTag),
+                    modifier =
+                        Modifier.axisSize(itemSize * 2, itemSize * 2).testTag(StaggeredGridTag),
                     reverseLayout = true,
                     state = state
                 ) {
-                    items(6) {
-                        Box(Modifier.size(itemSize).testTag("$it"))
-                    }
+                    items(6) { Box(Modifier.size(itemSize).testTag("$it")) }
                 }
             }
         }
 
         val scrollBy = itemSize * 10
-        rule.onNodeWithTag(StaggeredGridTag)
-            .scrollMainAxisBy(if (vertical) -scrollBy else scrollBy)
+        rule.onNodeWithTag(StaggeredGridTag).scrollMainAxisBy(if (vertical) -scrollBy else scrollBy)
 
         rule.runOnIdle {
             assertThat(state.firstVisibleItemIndex).isEqualTo(2)
@@ -310,20 +287,24 @@
         }
 
         if (vertical) {
-            rule.onNodeWithTag("4")
+            rule
+                .onNodeWithTag("4")
                 .assertMainAxisStartPositionInRootIsEqualTo(0.dp)
                 .assertCrossAxisStartPositionInRootIsEqualTo(itemSize)
 
-            rule.onNodeWithTag("5")
+            rule
+                .onNodeWithTag("5")
                 .assertMainAxisStartPositionInRootIsEqualTo(0.dp)
                 .assertCrossAxisStartPositionInRootIsEqualTo(0.dp)
         } else {
             // double reverse from RTL
-            rule.onNodeWithTag("4")
+            rule
+                .onNodeWithTag("4")
                 .assertMainAxisStartPositionInRootIsEqualTo(itemSize)
                 .assertCrossAxisStartPositionInRootIsEqualTo(0.dp)
 
-            rule.onNodeWithTag("5")
+            rule
+                .onNodeWithTag("5")
                 .assertMainAxisStartPositionInRootIsEqualTo(itemSize)
                 .assertCrossAxisStartPositionInRootIsEqualTo(itemSize)
         }
@@ -336,15 +317,11 @@
         rule.setContent {
             LazyStaggeredGrid(
                 lanes = 2,
-                modifier = Modifier
-                    .axisSize(itemSize * 2, itemSize * 2)
-                    .testTag(StaggeredGridTag),
+                modifier = Modifier.axisSize(itemSize * 2, itemSize * 2).testTag(StaggeredGridTag),
                 reverseLayout = reverseLayout,
                 state = state
             ) {
-                items(6) {
-                    Box(Modifier.size(itemSize).testTag("$it"))
-                }
+                items(6) { Box(Modifier.size(itemSize).testTag("$it")) }
             }
         }
 
@@ -353,10 +330,8 @@
             assertThat(state.firstVisibleItemScrollOffset).isEqualTo(0)
         }
 
-        rule.onNodeWithTag("0")
-            .assertMainAxisStartPositionInRootIsEqualTo(0.dp)
-        rule.onNodeWithTag("1")
-            .assertMainAxisStartPositionInRootIsEqualTo(0.dp)
+        rule.onNodeWithTag("0").assertMainAxisStartPositionInRootIsEqualTo(0.dp)
+        rule.onNodeWithTag("1").assertMainAxisStartPositionInRootIsEqualTo(0.dp)
 
         reverseLayout = true
         rule.runOnIdle {
@@ -364,10 +339,8 @@
             assertThat(state.firstVisibleItemScrollOffset).isEqualTo(0)
         }
 
-        rule.onNodeWithTag("0")
-            .assertMainAxisStartPositionInRootIsEqualTo(itemSize)
-        rule.onNodeWithTag("1")
-            .assertMainAxisStartPositionInRootIsEqualTo(itemSize)
+        rule.onNodeWithTag("0").assertMainAxisStartPositionInRootIsEqualTo(itemSize)
+        rule.onNodeWithTag("1").assertMainAxisStartPositionInRootIsEqualTo(itemSize)
     }
 
     @Test
@@ -376,17 +349,13 @@
         rule.setContent {
             LazyStaggeredGrid(
                 lanes = 2,
-                modifier = Modifier
-                    .axisSize(itemSize * 2, itemSize * 5)
-                    .testTag(StaggeredGridTag),
+                modifier = Modifier.axisSize(itemSize * 2, itemSize * 5).testTag(StaggeredGridTag),
                 contentPadding =
                     PaddingValues(beforeContent = itemSize, afterContent = itemSize * 2),
                 reverseLayout = true,
                 state = state
             ) {
-                items(6) {
-                    Box(Modifier.size(itemSize).testTag("$it"))
-                }
+                items(6) { Box(Modifier.size(itemSize).testTag("$it")) }
             }
         }
 
@@ -396,10 +365,8 @@
         }
 
         // bottom padding applies instead of the top
-        rule.onNodeWithTag("0")
-            .assertMainAxisStartPositionInRootIsEqualTo(itemSize * 2)
-        rule.onNodeWithTag("1")
-            .assertMainAxisStartPositionInRootIsEqualTo(itemSize * 2)
+        rule.onNodeWithTag("0").assertMainAxisStartPositionInRootIsEqualTo(itemSize * 2)
+        rule.onNodeWithTag("1").assertMainAxisStartPositionInRootIsEqualTo(itemSize * 2)
     }
 
     @Test
@@ -408,16 +375,12 @@
         rule.setContent {
             LazyStaggeredGrid(
                 lanes = 2,
-                modifier = Modifier
-                    .axisSize(itemSize * 2, itemSize * 5)
-                    .testTag(StaggeredGridTag),
+                modifier = Modifier.axisSize(itemSize * 2, itemSize * 5).testTag(StaggeredGridTag),
                 contentPadding = PaddingValues(afterContent = itemSize * 2),
                 reverseLayout = true,
                 state = state
             ) {
-                items(6) {
-                    Box(Modifier.size(itemSize).testTag("$it"))
-                }
+                items(6) { Box(Modifier.size(itemSize).testTag("$it")) }
             }
         }
 
@@ -427,10 +390,8 @@
         }
 
         // bottom padding applies instead of the top
-        rule.onNodeWithTag("0")
-            .assertMainAxisStartPositionInRootIsEqualTo(itemSize * 2)
-        rule.onNodeWithTag("1")
-            .assertMainAxisStartPositionInRootIsEqualTo(itemSize * 2)
+        rule.onNodeWithTag("0").assertMainAxisStartPositionInRootIsEqualTo(itemSize * 2)
+        rule.onNodeWithTag("1").assertMainAxisStartPositionInRootIsEqualTo(itemSize * 2)
     }
 
     @Test
@@ -439,15 +400,11 @@
         rule.setContent {
             LazyStaggeredGrid(
                 lanes = 2,
-                modifier = Modifier
-                    .axisSize(itemSize * 2, itemSize * 2)
-                    .testTag(StaggeredGridTag),
+                modifier = Modifier.axisSize(itemSize * 2, itemSize * 2).testTag(StaggeredGridTag),
                 reverseLayout = true,
                 state = state
             ) {
-                items(6) {
-                    Box(Modifier.size(itemSize).testTag("$it"))
-                }
+                items(6) { Box(Modifier.size(itemSize).testTag("$it")) }
             }
         }
 
@@ -457,10 +414,8 @@
         }
 
         // bottom padding applies instead of the top
-        rule.onNodeWithTag("0")
-            .assertMainAxisStartPositionInRootIsEqualTo(itemSize * 1.5f)
-        rule.onNodeWithTag("1")
-            .assertMainAxisStartPositionInRootIsEqualTo(itemSize * 1.5f)
+        rule.onNodeWithTag("0").assertMainAxisStartPositionInRootIsEqualTo(itemSize * 1.5f)
+        rule.onNodeWithTag("1").assertMainAxisStartPositionInRootIsEqualTo(itemSize * 1.5f)
     }
     // initial position
 }
diff --git a/compose/foundation/foundation/integration-tests/lazy-tests/src/androidTest/kotlin/androidx/compose/foundation/lazy/staggeredgrid/LazyStaggeredGridScrollTest.kt b/compose/foundation/foundation/integration-tests/lazy-tests/src/androidTest/kotlin/androidx/compose/foundation/lazy/staggeredgrid/LazyStaggeredGridScrollTest.kt
index fa4a65e..9cdfb9c 100644
--- a/compose/foundation/foundation/integration-tests/lazy-tests/src/androidTest/kotlin/androidx/compose/foundation/lazy/staggeredgrid/LazyStaggeredGridScrollTest.kt
+++ b/compose/foundation/foundation/integration-tests/lazy-tests/src/androidTest/kotlin/androidx/compose/foundation/lazy/staggeredgrid/LazyStaggeredGridScrollTest.kt
@@ -42,16 +42,16 @@
 
 @MediumTest
 @RunWith(Parameterized::class)
-class LazyStaggeredGridScrollTest(
-    private val orientation: Orientation
-) : BaseLazyStaggeredGridWithOrientation(orientation) {
+class LazyStaggeredGridScrollTest(private val orientation: Orientation) :
+    BaseLazyStaggeredGridWithOrientation(orientation) {
     companion object {
         @JvmStatic
         @Parameterized.Parameters(name = "{0}")
-        fun initParameters(): Array<Any> = arrayOf(
-            Orientation.Vertical,
-            Orientation.Horizontal,
-        )
+        fun initParameters(): Array<Any> =
+            arrayOf(
+                Orientation.Vertical,
+                Orientation.Horizontal,
+            )
     }
 
     internal lateinit var state: LazyStaggeredGridState
@@ -62,20 +62,13 @@
 
     @Before
     fun initSizes() {
-        itemSizeDp = with(rule.density) {
-            itemSizePx.toDp()
-        }
+        itemSizeDp = with(rule.density) { itemSizePx.toDp() }
     }
 
-    fun setContent(
-        containerSizePx: Int = itemSizePx * 5,
-        afterContentPaddingPx: Int = 0
-    ) {
+    fun setContent(containerSizePx: Int = itemSizePx * 5, afterContentPaddingPx: Int = 0) {
         rule.setContent {
             state = rememberLazyStaggeredGridState()
-            with(rule.density) {
-                TestContent(containerSizePx.toDp(), afterContentPaddingPx.toDp())
-            }
+            with(rule.density) { TestContent(containerSizePx.toDp(), afterContentPaddingPx.toDp()) }
         }
     }
 
@@ -86,16 +79,13 @@
         assertThat(state.firstVisibleItemIndex).isEqualTo(0)
         assertThat(state.firstVisibleItemScrollOffset).isEqualTo(0)
 
-        rule.onNodeWithTag("0")
-            .assertIsDisplayed()
+        rule.onNodeWithTag("0").assertIsDisplayed()
     }
 
     @Test
     fun scrollToItem_byIndexAndOffset_outsideBounds() {
         setContent()
-        runBlocking(AutoTestFrameClock() + Dispatchers.Main) {
-            state.scrollToItem(10, 10)
-        }
+        runBlocking(AutoTestFrameClock() + Dispatchers.Main) { state.scrollToItem(10, 10) }
         assertThat(state.firstVisibleItemIndex).isEqualTo(10)
         assertThat(state.firstVisibleItemScrollOffset).isEqualTo(10)
     }
@@ -103,9 +93,7 @@
     @Test
     fun scrollToItem_byIndexAndOffset_inBounds() {
         setContent()
-        runBlocking(AutoTestFrameClock() + Dispatchers.Main) {
-            state.scrollToItem(2, 10)
-        }
+        runBlocking(AutoTestFrameClock() + Dispatchers.Main) { state.scrollToItem(2, 10) }
         assertThat(state.firstVisibleItemIndex).isEqualTo(1)
         assertThat(state.firstVisibleItemScrollOffset).isEqualTo(110)
     }
@@ -113,9 +101,7 @@
     @Test
     fun scrollToItem_byIndexAndOffset_inBounds_secondLane() {
         setContent()
-        runBlocking(AutoTestFrameClock() + Dispatchers.Main) {
-            state.scrollToItem(4, 10)
-        }
+        runBlocking(AutoTestFrameClock() + Dispatchers.Main) { state.scrollToItem(4, 10) }
 
         assertThat(state.firstVisibleItemIndex).isEqualTo(3)
         assertThat(state.firstVisibleItemScrollOffset).isEqualTo(10)
@@ -124,9 +110,7 @@
     @Test
     fun scrollToItem_byIndexAndNegativeOffset() {
         setContent()
-        runBlocking(AutoTestFrameClock() + Dispatchers.Main) {
-            state.scrollToItem(4, -10)
-        }
+        runBlocking(AutoTestFrameClock() + Dispatchers.Main) { state.scrollToItem(4, -10) }
 
         assertThat(state.firstVisibleItemIndex).isEqualTo(1)
         assertThat(state.firstVisibleItemScrollOffset).isEqualTo(itemSizePx * 2 - 10)
@@ -164,28 +148,28 @@
 
         val lastItem = state.layoutInfo.visibleItemsInfo.last()
         assertThat(lastItem.index).isEqualTo(99)
-        val mainAxisOffset = if (orientation == Orientation.Vertical) {
-            lastItem.offset.y
-        } else {
-            lastItem.offset.x
-        }
+        val mainAxisOffset =
+            if (orientation == Orientation.Vertical) {
+                lastItem.offset.y
+            } else {
+                lastItem.offset.x
+            }
         assertThat(mainAxisOffset).isEqualTo(itemSizePx * 3) // x5 (grid) - x2 (item)
     }
 
     @Test
     fun scrollToItem_beyondItemCount() {
         setContent()
-        runBlocking(AutoTestFrameClock() + Dispatchers.Main) {
-            state.scrollToItem(420)
-        }
+        runBlocking(AutoTestFrameClock() + Dispatchers.Main) { state.scrollToItem(420) }
 
         val lastItem = state.layoutInfo.visibleItemsInfo.last()
         assertThat(lastItem.index).isEqualTo(99)
-        val mainAxisOffset = if (orientation == Orientation.Vertical) {
-            lastItem.offset.y
-        } else {
-            lastItem.offset.x
-        }
+        val mainAxisOffset =
+            if (orientation == Orientation.Vertical) {
+                lastItem.offset.y
+            } else {
+                lastItem.offset.x
+            }
         assertThat(mainAxisOffset).isEqualTo(itemSizePx * 3) // x5 (grid) - x2 (item)
     }
 
@@ -203,15 +187,14 @@
     fun canScrollBackward() {
         setContent()
         runBlocking {
-            withContext(Dispatchers.Main + AutoTestFrameClock()) {
-                state.scrollToItem(99)
-            }
+            withContext(Dispatchers.Main + AutoTestFrameClock()) { state.scrollToItem(99) }
             val lastItem = state.layoutInfo.visibleItemsInfo.last()
-            val mainAxisOffset = if (orientation == Orientation.Vertical) {
-                lastItem.offset.y
-            } else {
-                lastItem.offset.x
-            }
+            val mainAxisOffset =
+                if (orientation == Orientation.Vertical) {
+                    lastItem.offset.y
+                } else {
+                    lastItem.offset.x
+                }
             assertThat(mainAxisOffset).isEqualTo(itemSizePx * 3) // x5 (grid) - x2 (item)
             assertThat(state.canScrollForward).isFalse()
             assertThat(state.canScrollBackward).isTrue()
@@ -222,9 +205,7 @@
     fun canScrollForwardAndBackward() {
         setContent()
         runBlocking {
-            withContext(Dispatchers.Main + AutoTestFrameClock()) {
-                state.scrollToItem(10)
-            }
+            withContext(Dispatchers.Main + AutoTestFrameClock()) { state.scrollToItem(10) }
             assertThat(state.firstVisibleItemIndex).isEqualTo(10)
             assertThat(state.canScrollForward).isTrue()
             assertThat(state.canScrollBackward).isTrue()
@@ -235,9 +216,7 @@
     fun scrollToItem_fullSpan() {
         setContent()
         runBlocking {
-            withContext(Dispatchers.Main + AutoTestFrameClock()) {
-                state.scrollToItem(49, 10)
-            }
+            withContext(Dispatchers.Main + AutoTestFrameClock()) { state.scrollToItem(49, 10) }
 
             assertThat(state.firstVisibleItemIndex).isEqualTo(49)
             assertThat(state.firstVisibleItemScrollOffset).isEqualTo(10)
@@ -251,7 +230,8 @@
         rule.runOnIdle {
             runBlocking {
                 withContext(AutoTestFrameClock()) {
-                    // small enough scroll to not cause any new items to be composed or old ones disposed.
+                    // small enough scroll to not cause any new items to be composed or old ones
+                    // disposed.
                     state.scrollBy(delta.toFloat())
                 }
             }
@@ -295,7 +275,8 @@
         rule.runOnIdle {
             runBlocking {
                 withContext(AutoTestFrameClock()) {
-                    // small enough scroll to not cause any new items to be composed or old ones disposed.
+                    // small enough scroll to not cause any new items to be composed or old ones
+                    // disposed.
                     state.scrollBy(delta.toFloat())
                 }
             }
@@ -307,9 +288,7 @@
         rule.runOnIdle {
             runBlocking {
                 // and scroll back to the end
-                withContext(AutoTestFrameClock()) {
-                    state.scrollBy(-delta.toFloat())
-                }
+                withContext(AutoTestFrameClock()) { state.scrollBy(-delta.toFloat()) }
             }
         }
         rule.runOnIdle {
@@ -334,7 +313,8 @@
                     assertThat(state.canScrollForward).isFalse()
                     assertThat(state.canScrollBackward).isTrue()
 
-                    // small enough scroll to not cause any new items to be composed or old ones disposed.
+                    // small enough scroll to not cause any new items to be composed or old ones
+                    // disposed.
                     state.scrollBy(delta.toFloat())
                 }
             }
@@ -368,13 +348,9 @@
                 mainAxisSpacing = spacingDp,
                 modifier = Modifier.size(itemSizeDp),
             ) {
-                item {
-                    Box(Modifier.size(itemSizeDp).testTag("0").debugBorder())
-                }
-                item { } // empty item surrounded by spacings
-                item {
-                    Box(Modifier.size(itemSizeDp).testTag("2").debugBorder())
-                }
+                item { Box(Modifier.size(itemSizeDp).testTag("0").debugBorder()) }
+                item {} // empty item surrounded by spacings
+                item { Box(Modifier.size(itemSizeDp).testTag("2").debugBorder()) }
             }
         }
         rule.runOnIdle {
@@ -386,7 +362,8 @@
                 state.scrollBy(20f)
             }
         }
-        rule.onNodeWithTag("2")
+        rule
+            .onNodeWithTag("2")
             .assertMainAxisStartPositionInRootIsEqualTo(
                 itemSizeDp - with(rule.density) { 20.toDp() }
             )
@@ -407,11 +384,12 @@
             lanes = 2,
             state = state,
             modifier = Modifier.axisSize(itemSizeDp * 2, containerSizeDp),
-            contentPadding = if (vertical) {
-                PaddingValues(bottom = afterContentPaddingDp)
-            } else {
-                PaddingValues(end = afterContentPaddingDp)
-            },
+            contentPadding =
+                if (vertical) {
+                    PaddingValues(bottom = afterContentPaddingDp)
+                } else {
+                    PaddingValues(end = afterContentPaddingDp)
+                },
         ) {
             items(
                 count = itemCount,
@@ -425,10 +403,7 @@
             ) {
                 BasicText(
                     "$it",
-                    Modifier
-                        .mainAxisSize(itemSizeDp * ((it % 2) + 1))
-                        .testTag("$it")
-                        .debugBorder()
+                    Modifier.mainAxisSize(itemSizeDp * ((it % 2) + 1)).testTag("$it").debugBorder()
                 )
             }
         }
diff --git a/compose/foundation/foundation/integration-tests/lazy-tests/src/androidTest/kotlin/androidx/compose/foundation/lazy/staggeredgrid/LazyStaggeredGridSemanticTest.kt b/compose/foundation/foundation/integration-tests/lazy-tests/src/androidTest/kotlin/androidx/compose/foundation/lazy/staggeredgrid/LazyStaggeredGridSemanticTest.kt
index 3ee1508..3204ad9 100644
--- a/compose/foundation/foundation/integration-tests/lazy-tests/src/androidTest/kotlin/androidx/compose/foundation/lazy/staggeredgrid/LazyStaggeredGridSemanticTest.kt
+++ b/compose/foundation/foundation/integration-tests/lazy-tests/src/androidTest/kotlin/androidx/compose/foundation/lazy/staggeredgrid/LazyStaggeredGridSemanticTest.kt
@@ -39,22 +39,23 @@
 @OptIn(ExperimentalFoundationApi::class)
 @MediumTest
 @RunWith(Parameterized::class)
-class LazyStaggeredGridSemanticTest(
-    private val orientation: Orientation
-) : BaseLazyStaggeredGridWithOrientation(orientation) {
+class LazyStaggeredGridSemanticTest(private val orientation: Orientation) :
+    BaseLazyStaggeredGridWithOrientation(orientation) {
     companion object {
         private const val LazyStaggeredGridTag = "LazyStaggeredGridTag"
         private const val ItemCount = 60
 
         @JvmStatic
         @Parameterized.Parameters(name = "{0}")
-        fun initParameters(): Array<Any> = arrayOf(
-            Orientation.Vertical,
-            Orientation.Horizontal,
-        )
+        fun initParameters(): Array<Any> =
+            arrayOf(
+                Orientation.Vertical,
+                Orientation.Horizontal,
+            )
     }
 
     private fun key(index: Int): String = "key_$index"
+
     private fun tag(index: Int): String = "tag_$index"
 
     private var itemSizeDp: Dp = Dp.Unspecified
@@ -62,9 +63,7 @@
 
     @Before
     fun setUp() {
-        with(rule.density) {
-            itemSizeDp = itemSizePx.toDp()
-        }
+        with(rule.density) { itemSizeDp = itemSizePx.toDp() }
     }
 
     @Test
@@ -72,10 +71,10 @@
         rule.setContent {
             LazyStaggeredGrid(
                 lanes = 2,
-                modifier = Modifier
-                    .testTag(LazyStaggeredGridTag)
-                    .mainAxisSize(itemSizeDp * 3 - 1.dp) // -1 to prevent laying out more items
-                    .crossAxisSize(itemSizeDp * 2)
+                modifier =
+                    Modifier.testTag(LazyStaggeredGridTag)
+                        .mainAxisSize(itemSizeDp * 3 - 1.dp) // -1 to prevent laying out more items
+                        .crossAxisSize(itemSizeDp * 2)
             ) {
                 repeat(ItemCount) {
                     item(key = key(it)) {
@@ -92,10 +91,10 @@
         rule.setContent {
             LazyStaggeredGrid(
                 lanes = 2,
-                modifier = Modifier
-                    .testTag(LazyStaggeredGridTag)
-                    .mainAxisSize(itemSizeDp * 3 - 1.dp) // -1 to prevent laying out more items
-                    .crossAxisSize(itemSizeDp * 2)
+                modifier =
+                    Modifier.testTag(LazyStaggeredGridTag)
+                        .mainAxisSize(itemSizeDp * 3 - 1.dp) // -1 to prevent laying out more items
+                        .crossAxisSize(itemSizeDp * 2)
             ) {
                 items(items = List(ItemCount) { it }, key = { key(it) }) {
                     BasicText("$it", Modifier.testTag(tag(it)).mainAxisSize(itemSizeDp))
@@ -109,19 +108,24 @@
         checkViewport(firstExpectedItem = 0, lastExpectedItem = 5)
 
         // Verify IndexForKey
-        rule.onNodeWithTag(LazyStaggeredGridTag).assert(
-            SemanticsMatcher.keyIsDefined(SemanticsProperties.IndexForKey).and(
-                SemanticsMatcher("keys match") { node ->
-                    val actualIndex = node.config.getOrNull(SemanticsProperties.IndexForKey)!!
-                    (0 until ItemCount).all { expectedIndex ->
-                        expectedIndex == actualIndex.invoke(key(expectedIndex))
-                    }
-                }
+        rule
+            .onNodeWithTag(LazyStaggeredGridTag)
+            .assert(
+                SemanticsMatcher.keyIsDefined(SemanticsProperties.IndexForKey)
+                    .and(
+                        SemanticsMatcher("keys match") { node ->
+                            val actualIndex =
+                                node.config.getOrNull(SemanticsProperties.IndexForKey)!!
+                            (0 until ItemCount).all { expectedIndex ->
+                                expectedIndex == actualIndex.invoke(key(expectedIndex))
+                            }
+                        }
+                    )
             )
-        )
 
         // Verify ScrollToIndex
-        rule.onNodeWithTag(LazyStaggeredGridTag)
+        rule
+            .onNodeWithTag(LazyStaggeredGridTag)
             .assert(SemanticsMatcher.keyIsDefined(SemanticsActions.ScrollToIndex))
 
         invokeScrollToIndex(targetIndex = 30)
@@ -132,8 +136,10 @@
     }
 
     private fun invokeScrollToIndex(targetIndex: Int) {
-        val node = rule.onNodeWithTag(LazyStaggeredGridTag)
-            .fetchSemanticsNode("Failed: invoke ScrollToIndex")
+        val node =
+            rule
+                .onNodeWithTag(LazyStaggeredGridTag)
+                .fetchSemanticsNode("Failed: invoke ScrollToIndex")
         rule.runOnUiThread {
             node.config[SemanticsActions.ScrollToIndex].action!!.invoke(targetIndex)
         }
@@ -143,9 +149,7 @@
         if (firstExpectedItem > 0) {
             rule.onNodeWithTag(tag(firstExpectedItem - 1)).assertDoesNotExist()
         }
-        (firstExpectedItem..lastExpectedItem).forEach {
-            rule.onNodeWithTag(tag(it)).assertExists()
-        }
+        (firstExpectedItem..lastExpectedItem).forEach { rule.onNodeWithTag(tag(it)).assertExists() }
         if (firstExpectedItem < ItemCount - 1) {
             rule.onNodeWithTag(tag(lastExpectedItem + 1)).assertDoesNotExist()
         }
diff --git a/compose/foundation/foundation/integration-tests/lazy-tests/src/androidTest/kotlin/androidx/compose/foundation/lazy/staggeredgrid/LazyStaggeredGridTest.kt b/compose/foundation/foundation/integration-tests/lazy-tests/src/androidTest/kotlin/androidx/compose/foundation/lazy/staggeredgrid/LazyStaggeredGridTest.kt
index aca7ac0..c411a8e 100644
--- a/compose/foundation/foundation/integration-tests/lazy-tests/src/androidTest/kotlin/androidx/compose/foundation/lazy/staggeredgrid/LazyStaggeredGridTest.kt
+++ b/compose/foundation/foundation/integration-tests/lazy-tests/src/androidTest/kotlin/androidx/compose/foundation/lazy/staggeredgrid/LazyStaggeredGridTest.kt
@@ -66,9 +66,8 @@
 @OptIn(ExperimentalFoundationApi::class)
 @MediumTest
 @RunWith(Parameterized::class)
-class LazyStaggeredGridTest(
-    private val orientation: Orientation
-) : BaseLazyStaggeredGridWithOrientation(orientation) {
+class LazyStaggeredGridTest(private val orientation: Orientation) :
+    BaseLazyStaggeredGridWithOrientation(orientation) {
     private val LazyStaggeredGridTag = "LazyStaggeredGridTag"
 
     internal lateinit var state: LazyStaggeredGridState
@@ -76,10 +75,11 @@
     companion object {
         @JvmStatic
         @Parameterized.Parameters(name = "{0}")
-        fun initParameters(): Array<Any> = arrayOf(
-            Orientation.Vertical,
-            Orientation.Horizontal,
-        )
+        fun initParameters(): Array<Any> =
+            arrayOf(
+                Orientation.Vertical,
+                Orientation.Horizontal,
+            )
     }
 
     private var itemSizeDp: Dp = Dp.Unspecified
@@ -87,9 +87,7 @@
 
     @Before
     fun setUp() {
-        with(rule.density) {
-            itemSizeDp = itemSizePx.toDp()
-        }
+        with(rule.density) { itemSizeDp = itemSizePx.toDp() }
     }
 
     @After
@@ -122,12 +120,10 @@
                 lanes = 3,
                 state = state,
                 modifier = Modifier.testTag(LazyStaggeredGridTag)
-            ) { }
+            ) {}
         }
 
-        rule.onNodeWithTag(LazyStaggeredGridTag)
-            .onChildren()
-            .assertCountEquals(0)
+        rule.onNodeWithTag(LazyStaggeredGridTag).onChildren().assertCountEquals(0)
 
         assertThat(state.firstVisibleItemIndex).isEqualTo(0)
         assertThat(state.firstVisibleItemScrollOffset).isEqualTo(0)
@@ -144,18 +140,11 @@
                 lanes = 3,
                 state = state,
             ) {
-                item {
-                    Spacer(
-                        Modifier
-                            .size(itemSizeDp)
-                            .testTag(itemTestTag)
-                    )
-                }
+                item { Spacer(Modifier.size(itemSizeDp).testTag(itemTestTag)) }
             }
         }
 
-        rule.onNodeWithTag(itemTestTag)
-            .assertIsDisplayed()
+        rule.onNodeWithTag(itemTestTag).assertIsDisplayed()
 
         assertThat(state.firstVisibleItemIndex).isEqualTo(0)
         assertThat(state.firstVisibleItemScrollOffset).isEqualTo(0)
@@ -168,27 +157,24 @@
                 lanes = 3,
                 modifier = Modifier.crossAxisSize(itemSizeDp * 3),
             ) {
-                items(3) {
-                    Spacer(
-                        Modifier
-                            .size(itemSizeDp)
-                            .testTag("$it")
-                    )
-                }
+                items(3) { Spacer(Modifier.size(itemSizeDp).testTag("$it")) }
             }
         }
 
-        rule.onNodeWithTag("0")
+        rule
+            .onNodeWithTag("0")
             .assertIsDisplayed()
             .assertMainAxisStartPositionInRootIsEqualTo(0.dp)
             .assertCrossAxisStartPositionInRootIsEqualTo(0.dp)
 
-        rule.onNodeWithTag("1")
+        rule
+            .onNodeWithTag("1")
             .assertIsDisplayed()
             .assertMainAxisStartPositionInRootIsEqualTo(0.dp)
             .assertCrossAxisStartPositionInRootIsEqualTo(itemSizeDp)
 
-        rule.onNodeWithTag("2")
+        rule
+            .onNodeWithTag("2")
             .assertIsDisplayed()
             .assertMainAxisStartPositionInRootIsEqualTo(0.dp)
             .assertCrossAxisStartPositionInRootIsEqualTo(itemSizeDp * 2)
@@ -203,48 +189,50 @@
             ) {
                 items(6) {
                     Spacer(
-                        Modifier
-                            .axisSize(
-                                crossAxis = itemSizeDp,
-                                mainAxis = itemSizeDp * (it + 1)
-                            )
+                        Modifier.axisSize(crossAxis = itemSizeDp, mainAxis = itemSizeDp * (it + 1))
                             .testTag("$it")
                     )
                 }
             }
         }
 
-        rule.onNodeWithTag("0")
+        rule
+            .onNodeWithTag("0")
             .assertIsDisplayed()
             .assertMainAxisStartPositionInRootIsEqualTo(0.dp)
             .assertCrossAxisStartPositionInRootIsEqualTo(0.dp)
 
         // [item, 0, 0]
-        rule.onNodeWithTag("1")
+        rule
+            .onNodeWithTag("1")
             .assertIsDisplayed()
             .assertMainAxisStartPositionInRootIsEqualTo(0.dp)
             .assertCrossAxisStartPositionInRootIsEqualTo(itemSizeDp)
 
         // [item, item x 2, 0]
-        rule.onNodeWithTag("2")
+        rule
+            .onNodeWithTag("2")
             .assertIsDisplayed()
             .assertMainAxisStartPositionInRootIsEqualTo(0.dp)
             .assertCrossAxisStartPositionInRootIsEqualTo(itemSizeDp * 2)
 
         // [item, item x 2, item x 3]
-        rule.onNodeWithTag("3")
+        rule
+            .onNodeWithTag("3")
             .assertIsDisplayed()
             .assertMainAxisStartPositionInRootIsEqualTo(itemSizeDp)
             .assertCrossAxisStartPositionInRootIsEqualTo(0.dp)
 
         // [item x 4, item x 2, item x 3]
-        rule.onNodeWithTag("4")
+        rule
+            .onNodeWithTag("4")
             .assertIsDisplayed()
             .assertMainAxisStartPositionInRootIsEqualTo(itemSizeDp * 2)
             .assertCrossAxisStartPositionInRootIsEqualTo(itemSizeDp)
 
         // [item x 4, item x 7, item x 3]
-        rule.onNodeWithTag("5")
+        rule
+            .onNodeWithTag("5")
             .assertIsDisplayed()
             .assertMainAxisStartPositionInRootIsEqualTo(itemSizeDp * 3)
             .assertCrossAxisStartPositionInRootIsEqualTo(itemSizeDp * 2)
@@ -263,36 +251,34 @@
             ) {
                 items(6) {
                     Spacer(
-                        Modifier
-                            .axisSize(
-                                crossAxis = itemSizeDp,
-                                mainAxis = itemSizeDp * (it + 1)
-                            )
+                        Modifier.axisSize(crossAxis = itemSizeDp, mainAxis = itemSizeDp * (it + 1))
                             .testTag("$it")
                     )
                 }
             }
         }
 
-        rule.onNodeWithTag("3")
-            .assertDoesNotExist()
+        rule.onNodeWithTag("3").assertDoesNotExist()
 
         state.scrollBy(itemSizeDp * 3)
 
         // [item, item x 2, item x 3]
-        rule.onNodeWithTag("3")
+        rule
+            .onNodeWithTag("3")
             .assertIsDisplayed()
             .assertMainAxisStartPositionInRootIsEqualTo(-itemSizeDp * 2)
             .assertCrossAxisStartPositionInRootIsEqualTo(0.dp)
 
         // [item x 4, item x 2, item x 3]
-        rule.onNodeWithTag("4")
+        rule
+            .onNodeWithTag("4")
             .assertIsDisplayed()
             .assertMainAxisStartPositionInRootIsEqualTo(-itemSizeDp)
             .assertCrossAxisStartPositionInRootIsEqualTo(itemSizeDp)
 
         // [item x 4, item x 7, item x 3]
-        rule.onNodeWithTag("5")
+        rule
+            .onNodeWithTag("5")
             .assertIsDisplayed()
             .assertMainAxisStartPositionInRootIsEqualTo(0.dp)
             .assertCrossAxisStartPositionInRootIsEqualTo(itemSizeDp * 2)
@@ -311,11 +297,7 @@
             ) {
                 items(6) {
                     Spacer(
-                        Modifier
-                            .axisSize(
-                                crossAxis = itemSizeDp,
-                                mainAxis = itemSizeDp * (it + 1)
-                            )
+                        Modifier.axisSize(crossAxis = itemSizeDp, mainAxis = itemSizeDp * (it + 1))
                             .testTag("$it")
                             .debugBorder()
                     )
@@ -354,15 +336,15 @@
             LazyStaggeredGrid(
                 lanes = 3,
                 state = state,
-                modifier = Modifier
-                    .axisSize(itemSizeDp * 3, itemSizeDp)
-                    .testTag(LazyStaggeredGridTag),
+                modifier =
+                    Modifier.axisSize(itemSizeDp * 3, itemSizeDp).testTag(LazyStaggeredGridTag),
             ) {
-                items(6) { }
+                items(6) {}
             }
         }
 
-        rule.onNodeWithTag(LazyStaggeredGridTag)
+        rule
+            .onNodeWithTag(LazyStaggeredGridTag)
             .assertIsDisplayed()
             .onChildren()
             .assertCountEquals(0)
@@ -379,30 +361,22 @@
             ) {
                 items(6) {
                     Spacer(
-                        Modifier
-                            .axisSize(
-                                crossAxis = itemSizeDp,
-                                mainAxis = itemSizeDp * (it + 1)
-                            )
+                        Modifier.axisSize(crossAxis = itemSizeDp, mainAxis = itemSizeDp * (it + 1))
                             .testTag("$it")
                     )
                 }
             }
         }
 
-        rule.onNodeWithTag("0")
-            .assertIsDisplayed()
+        rule.onNodeWithTag("0").assertIsDisplayed()
 
         state.scrollBy(itemSizeDp * 3)
 
-        rule.onNodeWithTag("0")
-            .assertIsNotDisplayed()
+        rule.onNodeWithTag("0").assertIsNotDisplayed()
 
-        rule.onNodeWithTag("1")
-            .assertIsNotDisplayed()
+        rule.onNodeWithTag("1").assertIsNotDisplayed()
 
-        rule.onNodeWithTag("2")
-            .assertIsNotDisplayed()
+        rule.onNodeWithTag("2").assertIsNotDisplayed()
     }
 
     @Test
@@ -416,25 +390,21 @@
             ) {
                 items(6) {
                     Spacer(
-                        Modifier
-                            .axisSize(
-                                crossAxis = itemSizeDp,
-                                mainAxis = itemSizeDp * (it + 1)
-                            )
+                        Modifier.axisSize(crossAxis = itemSizeDp, mainAxis = itemSizeDp * (it + 1))
                             .testTag("$it")
                     )
                 }
             }
         }
 
-        rule.onNodeWithTag("0")
-            .assertIsDisplayed()
+        rule.onNodeWithTag("0").assertIsDisplayed()
 
         state.scrollBy(itemSizeDp * 3)
         state.scrollBy(-itemSizeDp * 3)
 
         for (i in 0..2) {
-            rule.onNodeWithTag("$i")
+            rule
+                .onNodeWithTag("$i")
                 .assertIsDisplayed()
                 .assertMainAxisStartPositionInRootIsEqualTo(0.dp)
         }
@@ -448,15 +418,11 @@
             LazyStaggeredGrid(
                 lanes = 2,
                 state = state,
-                modifier = Modifier.axisSize(
-                    crossAxis = itemSizeDp * 2,
-                    mainAxis = itemSizeDp * 2
-                ),
+                modifier = Modifier.axisSize(crossAxis = itemSizeDp * 2, mainAxis = itemSizeDp * 2),
             ) {
                 item {
                     Spacer(
-                        Modifier
-                            .axisSize(
+                        Modifier.axisSize(
                                 crossAxis = itemSizeDp,
                                 mainAxis = if (expanded) itemSizeDp * 2 else itemSizeDp
                             )
@@ -465,26 +431,25 @@
                 }
                 items(5) {
                     Spacer(
-                        Modifier
-                            .axisSize(
-                                crossAxis = itemSizeDp,
-                                mainAxis = itemSizeDp
-                            )
+                        Modifier.axisSize(crossAxis = itemSizeDp, mainAxis = itemSizeDp)
                             .testTag("${it + 1}")
                     )
                 }
             }
         }
 
-        rule.onNodeWithTag("0")
+        rule
+            .onNodeWithTag("0")
             .assertMainAxisSizeIsEqualTo(itemSizeDp)
             .assertMainAxisStartPositionInRootIsEqualTo(0.dp)
 
-        rule.onNodeWithTag("1")
+        rule
+            .onNodeWithTag("1")
             .assertMainAxisSizeIsEqualTo(itemSizeDp)
             .assertMainAxisStartPositionInRootIsEqualTo(0.dp)
 
-        rule.onNodeWithTag("2")
+        rule
+            .onNodeWithTag("2")
             .assertMainAxisSizeIsEqualTo(itemSizeDp)
             .assertCrossAxisStartPositionInRootIsEqualTo(0.dp)
             .assertMainAxisStartPositionInRootIsEqualTo(itemSizeDp)
@@ -495,11 +460,13 @@
 
         state.scrollBy(-itemSizeDp * 3)
 
-        rule.onNodeWithTag("0")
+        rule
+            .onNodeWithTag("0")
             .assertCrossAxisStartPositionInRootIsEqualTo(0.dp)
             .assertMainAxisSizeIsEqualTo(itemSizeDp * 2)
 
-        rule.onNodeWithTag("2")
+        rule
+            .onNodeWithTag("2")
             .assertMainAxisSizeIsEqualTo(itemSizeDp)
             .assertCrossAxisStartPositionInRootIsEqualTo(itemSizeDp)
             .assertMainAxisStartPositionInRootIsEqualTo(itemSizeDp)
@@ -513,15 +480,11 @@
             LazyStaggeredGrid(
                 lanes = 2,
                 state = state,
-                modifier = Modifier.axisSize(
-                    crossAxis = itemSizeDp * 2,
-                    mainAxis = itemSizeDp * 2
-                ),
+                modifier = Modifier.axisSize(crossAxis = itemSizeDp * 2, mainAxis = itemSizeDp * 2),
             ) {
                 item {
                     Spacer(
-                        Modifier
-                            .axisSize(
+                        Modifier.axisSize(
                                 crossAxis = itemSizeDp,
                                 mainAxis = if (expanded) itemSizeDp * 2 else itemSizeDp
                             )
@@ -530,26 +493,25 @@
                 }
                 items(5) {
                     Spacer(
-                        Modifier
-                            .axisSize(
-                                crossAxis = itemSizeDp,
-                                mainAxis = itemSizeDp
-                            )
+                        Modifier.axisSize(crossAxis = itemSizeDp, mainAxis = itemSizeDp)
                             .testTag("${it + 1}")
                     )
                 }
             }
         }
 
-        rule.onNodeWithTag("0")
+        rule
+            .onNodeWithTag("0")
             .assertMainAxisSizeIsEqualTo(itemSizeDp * 2)
             .assertMainAxisStartPositionInRootIsEqualTo(0.dp)
 
-        rule.onNodeWithTag("1")
+        rule
+            .onNodeWithTag("1")
             .assertMainAxisSizeIsEqualTo(itemSizeDp)
             .assertMainAxisStartPositionInRootIsEqualTo(0.dp)
 
-        rule.onNodeWithTag("2")
+        rule
+            .onNodeWithTag("2")
             .assertMainAxisSizeIsEqualTo(itemSizeDp)
             .assertCrossAxisStartPositionInRootIsEqualTo(itemSizeDp)
             .assertMainAxisStartPositionInRootIsEqualTo(itemSizeDp)
@@ -560,11 +522,13 @@
 
         state.scrollBy(-itemSizeDp * 3)
 
-        rule.onNodeWithTag("0")
+        rule
+            .onNodeWithTag("0")
             .assertCrossAxisStartPositionInRootIsEqualTo(0.dp)
             .assertMainAxisSizeIsEqualTo(itemSizeDp)
 
-        rule.onNodeWithTag("2")
+        rule
+            .onNodeWithTag("2")
             .assertMainAxisSizeIsEqualTo(itemSizeDp)
             .assertCrossAxisStartPositionInRootIsEqualTo(0.dp)
             .assertMainAxisStartPositionInRootIsEqualTo(itemSizeDp)
@@ -578,79 +542,62 @@
             LazyStaggeredGrid(
                 lanes = 2,
                 state = state,
-                modifier = Modifier.axisSize(
-                    crossAxis = itemSizeDp * 2,
-                    mainAxis = itemSizeDp * 2
-                ),
+                modifier = Modifier.axisSize(crossAxis = itemSizeDp * 2, mainAxis = itemSizeDp * 2),
             ) {
-                items(itemCount) {
-                    Spacer(
-                        Modifier
-                            .mainAxisSize(itemSizeDp)
-                            .testTag("$it")
-                    )
-                }
+                items(itemCount) { Spacer(Modifier.mainAxisSize(itemSizeDp).testTag("$it")) }
             }
         }
 
-        rule.onNodeWithTag("0")
-            .assertDoesNotExist()
+        rule.onNodeWithTag("0").assertDoesNotExist()
 
         itemCount = 4
 
-        rule.onNodeWithTag("0")
-            .assertIsDisplayed()
+        rule.onNodeWithTag("0").assertIsDisplayed()
 
-        rule.onNodeWithTag("1")
-            .assertIsDisplayed()
+        rule.onNodeWithTag("1").assertIsDisplayed()
     }
 
     @Test
     fun itemsAreCorrectedWithWrongColumns() {
         rule.setContent {
             // intentionally wrong values, normally items should be [0, 1][2, 3][4, 5]
-            state = rememberLazyStaggeredGridState(
-                initialFirstVisibleItemIndex = 3,
-                initialFirstVisibleItemScrollOffset = itemSizePx / 2
-            )
+            state =
+                rememberLazyStaggeredGridState(
+                    initialFirstVisibleItemIndex = 3,
+                    initialFirstVisibleItemScrollOffset = itemSizePx / 2
+                )
             LazyStaggeredGrid(
                 lanes = 2,
                 state = state,
-                modifier = Modifier.axisSize(
-                    crossAxis = itemSizeDp * 2,
-                    mainAxis = itemSizeDp
-                ),
+                modifier = Modifier.axisSize(crossAxis = itemSizeDp * 2, mainAxis = itemSizeDp),
             ) {
                 items(6) {
                     Spacer(
-                        Modifier
-                            .axisSize(
-                                crossAxis = itemSizeDp,
-                                mainAxis = itemSizeDp
-                            )
+                        Modifier.axisSize(crossAxis = itemSizeDp, mainAxis = itemSizeDp)
                             .testTag("$it")
                     )
                 }
             }
         }
 
-        rule.onNodeWithTag("0")
-            .assertDoesNotExist()
+        rule.onNodeWithTag("0").assertDoesNotExist()
 
-        rule.onNodeWithTag("3")
-            .assertMainAxisStartPositionInRootIsEqualTo(-itemSizeDp / 2)
+        rule.onNodeWithTag("3").assertMainAxisStartPositionInRootIsEqualTo(-itemSizeDp / 2)
 
-        rule.onNodeWithTag("4")
+        rule
+            .onNodeWithTag("4")
             .assertMainAxisSizeIsEqualTo(itemSizeDp)
             .assertMainAxisStartPositionInRootIsEqualTo(-itemSizeDp / 2)
 
         state.scrollBy(-itemSizeDp * 3)
 
-        rule.onNodeWithTag("0")
+        rule
+            .onNodeWithTag("0")
             .assertCrossAxisStartPositionInRootIsEqualTo(0.dp)
             .assertMainAxisStartPositionInRootIsEqualTo(0.dp)
 
-        rule.onNodeWithTag("1")
+        rule
+            .onNodeWithTag("1")
             .assertCrossAxisStartPositionInRootIsEqualTo(itemSizeDp)
             .assertMainAxisStartPositionInRootIsEqualTo(0.dp)
     }
@@ -659,21 +606,18 @@
     fun itemsAreCorrectedWithAlignedOffsets() {
         var expanded by mutableStateOf(false)
         rule.setContent {
-            state = rememberLazyStaggeredGridState(
-                initialFirstVisibleItemIndex = 0,
-            )
+            state =
+                rememberLazyStaggeredGridState(
+                    initialFirstVisibleItemIndex = 0,
+                )
             LazyStaggeredGrid(
                 lanes = 2,
                 state = state,
-                modifier = Modifier.axisSize(
-                    crossAxis = itemSizeDp * 2,
-                    mainAxis = itemSizeDp
-                ),
+                modifier = Modifier.axisSize(crossAxis = itemSizeDp * 2, mainAxis = itemSizeDp),
             ) {
                 items(6) {
                     Spacer(
-                        Modifier
-                            .mainAxisSize(
+                        Modifier.mainAxisSize(
                                 if (it % 2 == 1 && expanded) itemSizeDp * 2 else itemSizeDp
                             )
                             .testTag("$it")
@@ -682,23 +626,22 @@
             }
         }
 
-        rule.onNodeWithTag("0")
-            .assertIsDisplayed()
+        rule.onNodeWithTag("0").assertIsDisplayed()
 
         state.scrollBy(itemSizeDp * 2)
 
-        rule.runOnIdle {
-            expanded = true
-        }
+        rule.runOnIdle { expanded = true }
 
         state.scrollBy(itemSizeDp * -2)
         state.scrollBy(-itemSizeDp)
 
-        rule.onNodeWithTag("0")
+        rule
+            .onNodeWithTag("0")
             .assertCrossAxisStartPositionInRootIsEqualTo(0.dp)
             .assertMainAxisStartPositionInRootIsEqualTo(0.dp)
 
-        rule.onNodeWithTag("1")
+        rule
+            .onNodeWithTag("1")
             .assertCrossAxisStartPositionInRootIsEqualTo(itemSizeDp)
             .assertMainAxisStartPositionInRootIsEqualTo(0.dp)
     }
@@ -707,21 +650,18 @@
     fun itemsAreCorrectedWhenItemIncreased() {
         var expanded by mutableStateOf(false)
         rule.setContent {
-            state = rememberLazyStaggeredGridState(
-                initialFirstVisibleItemIndex = 0,
-            )
+            state =
+                rememberLazyStaggeredGridState(
+                    initialFirstVisibleItemIndex = 0,
+                )
             LazyStaggeredGrid(
                 lanes = 2,
                 state = state,
-                modifier = Modifier.axisSize(
-                    crossAxis = itemSizeDp * 2,
-                    mainAxis = itemSizeDp
-                ),
+                modifier = Modifier.axisSize(crossAxis = itemSizeDp * 2, mainAxis = itemSizeDp),
             ) {
                 items(6) {
                     Spacer(
-                        Modifier
-                            .mainAxisSize(
+                        Modifier.mainAxisSize(
                                 if (it == 3 && expanded) itemSizeDp * 2 else itemSizeDp
                             )
                             .testTag("$it")
@@ -730,23 +670,22 @@
             }
         }
 
-        rule.onNodeWithTag("0")
-            .assertIsDisplayed()
+        rule.onNodeWithTag("0").assertIsDisplayed()
 
         state.scrollBy(itemSizeDp * 2)
 
-        rule.runOnIdle {
-            expanded = true
-        }
+        rule.runOnIdle { expanded = true }
 
         state.scrollBy(itemSizeDp * -2)
         state.scrollBy(-itemSizeDp)
 
-        rule.onNodeWithTag("0")
+        rule
+            .onNodeWithTag("0")
             .assertCrossAxisStartPositionInRootIsEqualTo(0.dp)
             .assertMainAxisStartPositionInRootIsEqualTo(0.dp)
 
-        rule.onNodeWithTag("1")
+        rule
+            .onNodeWithTag("1")
             .assertCrossAxisStartPositionInRootIsEqualTo(itemSizeDp)
             .assertMainAxisStartPositionInRootIsEqualTo(0.dp)
     }
@@ -759,29 +698,20 @@
             LazyStaggeredGrid(
                 lanes = 2,
                 state = state,
-                modifier = Modifier.axisSize(
-                    crossAxis = itemSizeDp * 2,
-                    mainAxis = itemSizeDp
-                ),
+                modifier = Modifier.axisSize(crossAxis = itemSizeDp * 2, mainAxis = itemSizeDp),
             ) {
                 items(itemsCount) {
                     Spacer(
-                        Modifier
-                            .axisSize(
-                                crossAxis = itemSizeDp,
-                                mainAxis = itemSizeDp
-                            )
+                        Modifier.axisSize(crossAxis = itemSizeDp, mainAxis = itemSizeDp)
                             .testTag("$it")
                     )
                 }
             }
         }
 
-        rule.onNodeWithTag("0")
-            .assertIsDisplayed()
+        rule.onNodeWithTag("0").assertIsDisplayed()
 
-        rule.onNodeWithTag("1")
-            .assertDoesNotExist()
+        rule.onNodeWithTag("1").assertDoesNotExist()
 
         itemsCount = 10
 
@@ -789,11 +719,9 @@
 
         state.scrollBy(itemSizeDp * 10)
 
-        rule.onNodeWithTag("8")
-            .assertIsDisplayed()
+        rule.onNodeWithTag("8").assertIsDisplayed()
 
-        rule.onNodeWithTag("9")
-            .assertIsDisplayed()
+        rule.onNodeWithTag("9").assertIsDisplayed()
 
         itemsCount = 20
 
@@ -801,11 +729,9 @@
 
         state.scrollBy(itemSizeDp * 10)
 
-        rule.onNodeWithTag("18")
-            .assertIsDisplayed()
+        rule.onNodeWithTag("18").assertIsDisplayed()
 
-        rule.onNodeWithTag("19")
-            .assertIsDisplayed()
+        rule.onNodeWithTag("19").assertIsDisplayed()
     }
 
     @Test
@@ -816,18 +742,11 @@
             LazyStaggeredGrid(
                 lanes = 2,
                 state = state,
-                modifier = Modifier.axisSize(
-                    crossAxis = itemSizeDp * 2,
-                    mainAxis = itemSizeDp
-                ),
+                modifier = Modifier.axisSize(crossAxis = itemSizeDp * 2, mainAxis = itemSizeDp),
             ) {
                 items(itemsCount) {
                     Spacer(
-                        Modifier
-                            .axisSize(
-                                crossAxis = itemSizeDp,
-                                mainAxis = itemSizeDp
-                            )
+                        Modifier.axisSize(crossAxis = itemSizeDp, mainAxis = itemSizeDp)
                             .testTag("$it")
                     )
                 }
@@ -836,26 +755,22 @@
 
         state.scrollBy(itemSizeDp * 20)
 
-        rule.onNodeWithTag("18")
-            .assertIsDisplayed()
+        rule.onNodeWithTag("18").assertIsDisplayed()
 
-        rule.onNodeWithTag("19")
-            .assertIsDisplayed()
+        rule.onNodeWithTag("19").assertIsDisplayed()
 
         itemsCount = 10
 
-        rule.onNodeWithTag("8")
-            .assertIsDisplayed()
+        rule.onNodeWithTag("8").assertIsDisplayed()
 
-        rule.onNodeWithTag("9")
-            .assertIsDisplayed()
+        rule.onNodeWithTag("9").assertIsDisplayed()
 
         itemsCount = 1
 
-        rule.onNodeWithTag("0")
-            .assertIsDisplayed()
+        rule.onNodeWithTag("0").assertIsDisplayed()
 
-        rule.onNodeWithTag("1")
+        rule
+            .onNodeWithTag("1")
             // seems like reuse keeps the node around?
             .assertIsNotDisplayed()
     }
@@ -863,86 +778,64 @@
     @Test
     fun resizingItems_maintainsScrollingRange() {
         val state = LazyStaggeredGridState()
-        var itemSizes by mutableStateOf(
-            List(10) {
-                itemSizeDp * (it % 4 + 1)
-            }
-        )
+        var itemSizes by mutableStateOf(List(10) { itemSizeDp * (it % 4 + 1) })
         rule.setContent {
             LazyStaggeredGrid(
                 lanes = 2,
                 state = state,
-                modifier = Modifier
-                    .axisSize(
-                        crossAxis = itemSizeDp * 2,
-                        mainAxis = itemSizeDp * 5
-                    )
-                    .testTag(LazyStaggeredGridTag)
-                    .border(1.dp, Color.Red),
+                modifier =
+                    Modifier.axisSize(crossAxis = itemSizeDp * 2, mainAxis = itemSizeDp * 5)
+                        .testTag(LazyStaggeredGridTag)
+                        .border(1.dp, Color.Red),
             ) {
                 items(itemSizes.size) {
                     Spacer(
-                        Modifier
-                            .axisSize(
-                                crossAxis = itemSizeDp,
-                                mainAxis = itemSizes[it]
-                            )
+                        Modifier.axisSize(crossAxis = itemSizeDp, mainAxis = itemSizes[it])
                             .testTag("$it")
                     )
                 }
             }
         }
 
-        rule.onNodeWithTag(LazyStaggeredGridTag)
-            .scrollMainAxisBy(itemSizeDp * 10)
+        rule.onNodeWithTag(LazyStaggeredGridTag).scrollMainAxisBy(itemSizeDp * 10)
 
-        rule.onNodeWithTag("8")
-            .assertMainAxisSizeIsEqualTo(itemSizes[8])
+        rule.onNodeWithTag("8").assertMainAxisSizeIsEqualTo(itemSizes[8])
 
-        rule.onNodeWithTag("9")
-            .assertMainAxisSizeIsEqualTo(itemSizes[9])
+        rule.onNodeWithTag("9").assertMainAxisSizeIsEqualTo(itemSizes[9])
 
         itemSizes = itemSizes.reversed()
 
-        rule.onNodeWithTag("8")
-            .assertIsDisplayed()
+        rule.onNodeWithTag("8").assertIsDisplayed()
 
-        rule.onNodeWithTag("9")
-            .assertIsDisplayed()
+        rule.onNodeWithTag("9").assertIsDisplayed()
 
-        rule.onNodeWithTag(LazyStaggeredGridTag)
-            .scrollMainAxisBy(-itemSizeDp * 10)
+        rule.onNodeWithTag(LazyStaggeredGridTag).scrollMainAxisBy(-itemSizeDp * 10)
 
-        rule.onNodeWithTag("0")
-            .assertMainAxisStartPositionInRootIsEqualTo(0.dp)
+        rule.onNodeWithTag("0").assertMainAxisStartPositionInRootIsEqualTo(0.dp)
 
-        rule.onNodeWithTag("1")
-            .assertMainAxisStartPositionInRootIsEqualTo(0.dp)
+        rule.onNodeWithTag("1").assertMainAxisStartPositionInRootIsEqualTo(0.dp)
     }
 
     @Test
     fun removingItems_maintainsCorrectOffsets() {
         var itemCount by mutableStateOf(20)
         rule.setContent {
-            state = rememberLazyStaggeredGridState(
-                initialFirstVisibleItemIndex = 10,
-                initialFirstVisibleItemScrollOffset = 0
-            )
+            state =
+                rememberLazyStaggeredGridState(
+                    initialFirstVisibleItemIndex = 10,
+                    initialFirstVisibleItemScrollOffset = 0
+                )
             LazyStaggeredGrid(
                 lanes = 2,
                 state = state,
-                modifier = Modifier
-                    .axisSize(
-                        crossAxis = itemSizeDp * 2,
-                        mainAxis = itemSizeDp * 5
-                    )
-                    .testTag(LazyStaggeredGridTag)
-                    .border(1.dp, Color.Red),
+                modifier =
+                    Modifier.axisSize(crossAxis = itemSizeDp * 2, mainAxis = itemSizeDp * 5)
+                        .testTag(LazyStaggeredGridTag)
+                        .border(1.dp, Color.Red),
             ) {
                 items(itemCount) {
                     Box(
-                        Modifier
-                            .axisSize(
+                        Modifier.axisSize(
                                 crossAxis = itemSizeDp,
                                 mainAxis = itemSizeDp * (it % 3 + 1)
                             )
@@ -959,48 +852,40 @@
 
         rule.waitForIdle()
 
-        rule.onNodeWithTag("0")
-            .assertMainAxisStartPositionInRootIsEqualTo(0.dp)
+        rule.onNodeWithTag("0").assertMainAxisStartPositionInRootIsEqualTo(0.dp)
 
-        rule.onNodeWithTag("1")
-            .assertMainAxisStartPositionInRootIsEqualTo(0.dp)
+        rule.onNodeWithTag("1").assertMainAxisStartPositionInRootIsEqualTo(0.dp)
     }
 
     @Test
     fun staggeredGrid_supportsLargeIndices() {
         rule.setContent {
-            state = rememberLazyStaggeredGridState(
-                initialFirstVisibleItemIndex = Int.MAX_VALUE / 2,
-                initialFirstVisibleItemScrollOffset = 0
-            )
+            state =
+                rememberLazyStaggeredGridState(
+                    initialFirstVisibleItemIndex = Int.MAX_VALUE / 2,
+                    initialFirstVisibleItemScrollOffset = 0
+                )
             LazyStaggeredGrid(
                 lanes = 2,
                 state = state,
-                modifier = Modifier
-                    .axisSize(
-                        crossAxis = itemSizeDp * 2,
-                        mainAxis = itemSizeDp * 5
-                    )
-                    .testTag(LazyStaggeredGridTag)
-                    .border(1.dp, Color.Red),
+                modifier =
+                    Modifier.axisSize(crossAxis = itemSizeDp * 2, mainAxis = itemSizeDp * 5)
+                        .testTag(LazyStaggeredGridTag)
+                        .border(1.dp, Color.Red),
             ) {
                 items(Int.MAX_VALUE) {
                     Spacer(
-                        Modifier
-                            .axisSize(
-                                crossAxis = itemSizeDp,
-                                mainAxis = itemSizeDp
-                            )
+                        Modifier.axisSize(crossAxis = itemSizeDp, mainAxis = itemSizeDp)
                             .testTag("$it")
                     )
                 }
             }
         }
 
-        rule.onNodeWithTag("${Int.MAX_VALUE / 2}")
-            .assertMainAxisStartPositionInRootIsEqualTo(0.dp)
+        rule.onNodeWithTag("${Int.MAX_VALUE / 2}").assertMainAxisStartPositionInRootIsEqualTo(0.dp)
 
-        rule.onNodeWithTag("${Int.MAX_VALUE / 2 + 1}")
+        rule
+            .onNodeWithTag("${Int.MAX_VALUE / 2 + 1}")
             .assertMainAxisStartPositionInRootIsEqualTo(0.dp)
 
         // check that scrolling back and forth doesn't crash
@@ -1011,10 +896,10 @@
 
         state.scrollBy(-delta)
 
-        rule.onNodeWithTag("${Int.MAX_VALUE / 2}")
-            .assertMainAxisStartPositionInRootIsEqualTo(0.dp)
+        rule.onNodeWithTag("${Int.MAX_VALUE / 2}").assertMainAxisStartPositionInRootIsEqualTo(0.dp)
 
-        rule.onNodeWithTag("${Int.MAX_VALUE / 2 + 1}")
+        rule
+            .onNodeWithTag("${Int.MAX_VALUE / 2 + 1}")
             .assertMainAxisStartPositionInRootIsEqualTo(0.dp)
     }
 
@@ -1028,31 +913,20 @@
             LazyStaggeredGrid(
                 lanes = 3,
                 state = state!!,
-                modifier = Modifier
-                    .mainAxisSize(itemSizeDp * 10)
-                    .testTag(LazyStaggeredGridTag)
+                modifier = Modifier.mainAxisSize(itemSizeDp * 10).testTag(LazyStaggeredGridTag)
             ) {
-                items(1000) {
-                    Spacer(
-                        Modifier
-                            .mainAxisSize(itemSizeDp)
-                            .testTag("$it")
-                    )
-                }
+                items(1000) { Spacer(Modifier.mainAxisSize(itemSizeDp).testTag("$it")) }
             }
         }
 
-        rule.onNodeWithTag(LazyStaggeredGridTag)
-            .scrollMainAxisBy(itemSizeDp * 10f)
+        rule.onNodeWithTag(LazyStaggeredGridTag).scrollMainAxisBy(itemSizeDp * 10f)
 
-        rule.onNodeWithTag("30")
-            .assertIsDisplayed()
+        rule.onNodeWithTag("30").assertIsDisplayed()
 
         state = null
         restorationTester.emulateSavedInstanceStateRestore()
 
-        rule.onNodeWithTag("30")
-            .assertIsDisplayed()
+        rule.onNodeWithTag("30").assertIsDisplayed()
     }
 
     @Test
@@ -1067,26 +941,16 @@
             LazyStaggeredGrid(
                 lanes = 3,
                 state = state,
-                modifier = Modifier
-                    .mainAxisSize(itemSizeDp * 10)
-                    .testTag(LazyStaggeredGridTag)
+                modifier = Modifier.mainAxisSize(itemSizeDp * 10).testTag(LazyStaggeredGridTag)
             ) {
                 recomposeCounter.value // read state to force recomposition
 
-                items(itemsCount) {
-                    Spacer(
-                        Modifier
-                            .mainAxisSize(itemSizeDp)
-                            .testTag("$it")
-                    )
-                }
+                items(itemsCount) { Spacer(Modifier.mainAxisSize(itemSizeDp).testTag("$it")) }
             }
         }
 
         rule.runOnIdle {
-            runBlocking {
-                state.scrollToItem(9, 10)
-            }
+            runBlocking { state.scrollToItem(9, 10) }
             itemsCount = 0
         }
 
@@ -1116,18 +980,12 @@
             LazyStaggeredGrid(
                 cells = StaggeredGridCells.Adaptive(itemSizeDp * 3),
                 state = state,
-                modifier = Modifier
-                    .mainAxisSize(mainAxis)
-                    .crossAxisSize(crossAxis)
-                    .testTag(LazyStaggeredGridTag)
+                modifier =
+                    Modifier.mainAxisSize(mainAxis)
+                        .crossAxisSize(crossAxis)
+                        .testTag(LazyStaggeredGridTag)
             ) {
-                item {
-                    Spacer(
-                        Modifier
-                            .mainAxisSize(itemSizeDp)
-                            .testTag("0")
-                    )
-                }
+                item { Spacer(Modifier.mainAxisSize(itemSizeDp).testTag("0")) }
             }
         }
 
@@ -1136,29 +994,17 @@
             assertThat(state.firstVisibleItemScrollOffset).isEqualTo(0)
         }
 
-        rule.runOnIdle {
-            rotated = true
-        }
+        rule.runOnIdle { rotated = true }
 
-        rule.runOnIdle {
-            verifyState()
-        }
+        rule.runOnIdle { verifyState() }
 
-        rule.runOnIdle {
-            rotated = false
-        }
+        rule.runOnIdle { rotated = false }
 
-        rule.runOnIdle {
-            verifyState()
-        }
+        rule.runOnIdle { verifyState() }
 
-        rule.runOnIdle {
-            rotated = true
-        }
+        rule.runOnIdle { rotated = true }
 
-        rule.runOnIdle {
-            verifyState()
-        }
+        rule.runOnIdle { verifyState() }
     }
 
     @Test
@@ -1174,18 +1020,12 @@
             LazyStaggeredGrid(
                 cells = StaggeredGridCells.Adaptive(itemSizeDp * 3),
                 state = state,
-                modifier = Modifier
-                    .mainAxisSize(mainAxis)
-                    .crossAxisSize(crossAxis)
-                    .testTag(LazyStaggeredGridTag)
+                modifier =
+                    Modifier.mainAxisSize(mainAxis)
+                        .crossAxisSize(crossAxis)
+                        .testTag(LazyStaggeredGridTag)
             ) {
-                items(2) {
-                    Spacer(
-                        Modifier
-                            .mainAxisSize(itemSizeDp)
-                            .testTag("$it")
-                    )
-                }
+                items(2) { Spacer(Modifier.mainAxisSize(itemSizeDp).testTag("$it")) }
             }
         }
 
@@ -1198,21 +1038,15 @@
             rule.onNodeWithTag("1").assertIsDisplayed()
         }
 
-        rule.runOnIdle {
-            rotated = true
-        }
+        rule.runOnIdle { rotated = true }
 
         verifyState()
 
-        rule.runOnIdle {
-            rotated = false
-        }
+        rule.runOnIdle { rotated = false }
 
         verifyState()
 
-        rule.runOnIdle {
-            rotated = true
-        }
+        rule.runOnIdle { rotated = true }
 
         verifyState()
     }
@@ -1225,20 +1059,13 @@
             LazyStaggeredGrid(
                 lanes = 3,
                 state = state,
-                modifier = Modifier
-                    .mainAxisSize(itemSizeDp * 10)
-                    .composed {
+                modifier =
+                    Modifier.mainAxisSize(itemSizeDp * 10).composed {
                         recomposed++
                         Modifier
                     }
             ) {
-                items(1000) {
-                    Spacer(
-                        Modifier
-                            .mainAxisSize(itemSizeDp)
-                            .testTag("$it")
-                    )
-                }
+                items(1000) { Spacer(Modifier.mainAxisSize(itemSizeDp).testTag("$it")) }
             }
         }
 
@@ -1258,19 +1085,9 @@
             LazyStaggeredGrid(
                 lanes = 3,
                 state = state,
-                modifier = Modifier
-                    .mainAxisSize(itemSizeDp * 10)
-                    .composed {
-                        Modifier
-                    }
+                modifier = Modifier.mainAxisSize(itemSizeDp * 10).composed { Modifier }
             ) {
-                items(1000) {
-                    Spacer(
-                        Modifier
-                            .mainAxisSize(itemSizeDp)
-                            .testTag("$it")
-                    )
-                }
+                items(1000) { Spacer(Modifier.mainAxisSize(itemSizeDp).testTag("$it")) }
             }
         }
 
@@ -1287,30 +1104,17 @@
         rule.setContentWithTestViewConfiguration {
             LazyStaggeredGrid(
                 1,
-                Modifier
-                    .testTag(LazyStaggeredGridTag)
-                    .mainAxisSize(itemSize),
+                Modifier.testTag(LazyStaggeredGridTag).mainAxisSize(itemSize),
                 state
             ) {
-                items(3) { index ->
-                    Box(
-                        Modifier
-                            .size(itemSize)
-                            .testTag("$index"))
-                }
+                items(3) { index -> Box(Modifier.size(itemSize).testTag("$index")) }
             }
         }
 
         repeat(3) { index ->
-            rule.onNodeWithTag("$index")
-                .assertIsDisplayed()
-            rule.onNodeWithTag("${index + 1}")
-                .assertDoesNotExist()
-            rule.runOnIdle {
-                runBlocking {
-                    state.scrollBy(itemSizePx)
-                }
-            }
+            rule.onNodeWithTag("$index").assertIsDisplayed()
+            rule.onNodeWithTag("${index + 1}").assertDoesNotExist()
+            rule.runOnIdle { runBlocking { state.scrollBy(itemSizePx) } }
         }
     }
 
@@ -1321,22 +1125,19 @@
         rule.setContentWithTestViewConfiguration {
             LazyStaggeredGrid(
                 3,
-                Modifier
-                    .testTag(LazyStaggeredGridTag)
+                Modifier.testTag(LazyStaggeredGridTag)
                     .crossAxisSize(itemSizeDp * 3)
                     .mainAxisSize(itemSizeDp * 10),
                 state
             ) {
                 item(span = StaggeredGridItemSpan.FullLine) {
-                    Box(
-                        Modifier
-                            .testTag("0")
-                            .mainAxisSize(itemSizeDp))
+                    Box(Modifier.testTag("0").mainAxisSize(itemSizeDp))
                 }
             }
         }
 
-        rule.onNodeWithTag("0")
+        rule
+            .onNodeWithTag("0")
             .assertMainAxisSizeIsEqualTo(itemSizeDp)
             .assertCrossAxisSizeIsEqualTo(itemSizeDp * 3)
             .assertPositionInRootIsEqualTo(0.dp, 0.dp)
@@ -1349,24 +1150,15 @@
         rule.setContentWithTestViewConfiguration {
             LazyStaggeredGrid(
                 3,
-                Modifier
-                    .testTag(LazyStaggeredGridTag)
+                Modifier.testTag(LazyStaggeredGridTag)
                     .crossAxisSize(itemSizeDp * 3)
                     .mainAxisSize(itemSizeDp * 10),
                 state
             ) {
-                items(2) {
-                    Box(
-                        Modifier
-                            .testTag("$it")
-                            .mainAxisSize(itemSizeDp))
-                }
+                items(2) { Box(Modifier.testTag("$it").mainAxisSize(itemSizeDp)) }
 
                 item(span = StaggeredGridItemSpan.FullLine) {
-                    Box(
-                        Modifier
-                            .testTag("full")
-                            .mainAxisSize(itemSizeDp))
+                    Box(Modifier.testTag("full").mainAxisSize(itemSizeDp))
                 }
             }
         }
@@ -1376,23 +1168,17 @@
         // ├─┴─┴─┤
         // │full │
         // └─────┘
-        rule.onNodeWithTag("0")
-            .assertAxisBounds(
-                DpOffset(0.dp, 0.dp),
-                DpSize(itemSizeDp, itemSizeDp)
-            )
+        rule
+            .onNodeWithTag("0")
+            .assertAxisBounds(DpOffset(0.dp, 0.dp), DpSize(itemSizeDp, itemSizeDp))
 
-        rule.onNodeWithTag("1")
-            .assertAxisBounds(
-                DpOffset(itemSizeDp, 0.dp),
-                DpSize(itemSizeDp, itemSizeDp)
-            )
+        rule
+            .onNodeWithTag("1")
+            .assertAxisBounds(DpOffset(itemSizeDp, 0.dp), DpSize(itemSizeDp, itemSizeDp))
 
-        rule.onNodeWithTag("full")
-            .assertAxisBounds(
-                DpOffset(0.dp, itemSizeDp),
-                DpSize(itemSizeDp * 3, itemSizeDp)
-            )
+        rule
+            .onNodeWithTag("full")
+            .assertAxisBounds(DpOffset(0.dp, itemSizeDp), DpSize(itemSizeDp * 3, itemSizeDp))
     }
 
     @Test
@@ -1402,24 +1188,17 @@
         rule.setContentWithTestViewConfiguration {
             LazyStaggeredGrid(
                 3,
-                Modifier
-                    .testTag(LazyStaggeredGridTag)
+                Modifier.testTag(LazyStaggeredGridTag)
                     .crossAxisSize(itemSizeDp * 3)
                     .mainAxisSize(itemSizeDp * 10),
                 state
             ) {
                 items(3) {
-                    Box(
-                        Modifier
-                            .testTag("$it")
-                            .mainAxisSize(itemSizeDp + itemSizeDp * it / 2))
+                    Box(Modifier.testTag("$it").mainAxisSize(itemSizeDp + itemSizeDp * it / 2))
                 }
 
                 item(span = StaggeredGridItemSpan.FullLine) {
-                    Box(
-                        Modifier
-                            .testTag("full")
-                            .mainAxisSize(itemSizeDp))
+                    Box(Modifier.testTag("full").mainAxisSize(itemSizeDp))
                 }
             }
         }
@@ -1431,29 +1210,21 @@
         // ├───────┴───┤
         // │   full    │
         // └───────────┘
-        rule.onNodeWithTag("0")
-            .assertAxisBounds(
-                DpOffset(0.dp, 0.dp),
-                DpSize(itemSizeDp, itemSizeDp)
-            )
+        rule
+            .onNodeWithTag("0")
+            .assertAxisBounds(DpOffset(0.dp, 0.dp), DpSize(itemSizeDp, itemSizeDp))
 
-        rule.onNodeWithTag("1")
-            .assertAxisBounds(
-                DpOffset(itemSizeDp, 0.dp),
-                DpSize(itemSizeDp, itemSizeDp * 1.5f)
-            )
+        rule
+            .onNodeWithTag("1")
+            .assertAxisBounds(DpOffset(itemSizeDp, 0.dp), DpSize(itemSizeDp, itemSizeDp * 1.5f))
 
-        rule.onNodeWithTag("2")
-            .assertAxisBounds(
-                DpOffset(itemSizeDp * 2, 0.dp),
-                DpSize(itemSizeDp, itemSizeDp * 2f)
-            )
+        rule
+            .onNodeWithTag("2")
+            .assertAxisBounds(DpOffset(itemSizeDp * 2, 0.dp), DpSize(itemSizeDp, itemSizeDp * 2f))
 
-        rule.onNodeWithTag("full")
-            .assertAxisBounds(
-                DpOffset(0.dp, itemSizeDp * 2f),
-                DpSize(itemSizeDp * 3, itemSizeDp)
-            )
+        rule
+            .onNodeWithTag("full")
+            .assertAxisBounds(DpOffset(0.dp, itemSizeDp * 2f), DpSize(itemSizeDp * 3, itemSizeDp))
     }
 
     @Test
@@ -1463,40 +1234,27 @@
         rule.setContentWithTestViewConfiguration {
             LazyStaggeredGrid(
                 3,
-                Modifier
-                    .testTag(LazyStaggeredGridTag)
+                Modifier.testTag(LazyStaggeredGridTag)
                     .crossAxisSize(itemSizeDp * 3)
                     .mainAxisSize(itemSizeDp * 2),
                 state
             ) {
                 items(3) {
-                    Box(
-                        Modifier
-                            .testTag("$it")
-                            .mainAxisSize(itemSizeDp + itemSizeDp * it / 2)
-                    )
+                    Box(Modifier.testTag("$it").mainAxisSize(itemSizeDp + itemSizeDp * it / 2))
                 }
 
                 item(span = StaggeredGridItemSpan.FullLine) {
-                    Box(
-                        Modifier
-                            .testTag("full")
-                            .mainAxisSize(itemSizeDp))
+                    Box(Modifier.testTag("full").mainAxisSize(itemSizeDp))
                 }
 
                 items(3) {
                     Box(
-                        Modifier
-                            .testTag("${it + 3}")
-                            .mainAxisSize(itemSizeDp + itemSizeDp * it / 2)
+                        Modifier.testTag("${it + 3}").mainAxisSize(itemSizeDp + itemSizeDp * it / 2)
                     )
                 }
 
                 item(span = StaggeredGridItemSpan.FullLine) {
-                    Box(
-                        Modifier
-                            .testTag("full-2")
-                            .mainAxisSize(itemSizeDp))
+                    Box(Modifier.testTag("full-2").mainAxisSize(itemSizeDp))
                 }
             }
         }
@@ -1514,14 +1272,11 @@
         // ├───────┴───┤
         // │   full-2  │
         // └───────────┘
-        rule.onNodeWithTag(LazyStaggeredGridTag)
-            .scrollMainAxisBy(itemSizeDp * 2f)
+        rule.onNodeWithTag(LazyStaggeredGridTag).scrollMainAxisBy(itemSizeDp * 2f)
 
-        rule.onNodeWithTag("full")
-            .assertAxisBounds(
-                DpOffset(0.dp, 0.dp),
-                DpSize(itemSizeDp * 3, itemSizeDp)
-            )
+        rule
+            .onNodeWithTag("full")
+            .assertAxisBounds(DpOffset(0.dp, 0.dp), DpSize(itemSizeDp * 3, itemSizeDp))
 
         assertThat(state.firstVisibleItemIndex).isEqualTo(3)
         assertThat(state.firstVisibleItemScrollOffset).isEqualTo(0)
@@ -1534,8 +1289,7 @@
         rule.setContentWithTestViewConfiguration {
             LazyStaggeredGrid(
                 3,
-                Modifier
-                    .testTag(LazyStaggeredGridTag)
+                Modifier.testTag(LazyStaggeredGridTag)
                     .crossAxisSize(itemSizeDp * 3)
                     .mainAxisSize(itemSizeDp * 2),
                 state
@@ -1543,17 +1297,13 @@
                 repeat(10) { repeatIndex ->
                     items(3) {
                         Box(
-                            Modifier
-                                .testTag("${repeatIndex * 3 + it}")
+                            Modifier.testTag("${repeatIndex * 3 + it}")
                                 .mainAxisSize(itemSizeDp + itemSizeDp * it / 2)
                         )
                     }
 
                     item(span = StaggeredGridItemSpan.FullLine) {
-                        Box(
-                            Modifier
-                                .testTag("full-$repeatIndex")
-                                .mainAxisSize(itemSizeDp))
+                        Box(Modifier.testTag("full-$repeatIndex").mainAxisSize(itemSizeDp))
                     }
                 }
             }
@@ -1572,26 +1322,19 @@
         // ├───────┴───┤  <-- end of screen
         // │   full-1  │
         // └───────────┘
-        rule.onNodeWithTag(LazyStaggeredGridTag)
-            .scrollMainAxisBy(itemSizeDp * 3f)
+        rule.onNodeWithTag(LazyStaggeredGridTag).scrollMainAxisBy(itemSizeDp * 3f)
 
-        rule.onNodeWithTag("3")
-            .assertAxisBounds(
-                DpOffset(0.dp, 0.dp),
-                DpSize(itemSizeDp, itemSizeDp)
-            )
+        rule
+            .onNodeWithTag("3")
+            .assertAxisBounds(DpOffset(0.dp, 0.dp), DpSize(itemSizeDp, itemSizeDp))
 
-        rule.onNodeWithTag("4")
-            .assertAxisBounds(
-                DpOffset(itemSizeDp, 0.dp),
-                DpSize(itemSizeDp, itemSizeDp * 1.5f)
-            )
+        rule
+            .onNodeWithTag("4")
+            .assertAxisBounds(DpOffset(itemSizeDp, 0.dp), DpSize(itemSizeDp, itemSizeDp * 1.5f))
 
-        rule.onNodeWithTag("5")
-            .assertAxisBounds(
-                DpOffset(itemSizeDp * 2, 0.dp),
-                DpSize(itemSizeDp, itemSizeDp * 2)
-            )
+        rule
+            .onNodeWithTag("5")
+            .assertAxisBounds(DpOffset(itemSizeDp * 2, 0.dp), DpSize(itemSizeDp, itemSizeDp * 2))
 
         assertThat(state.firstVisibleItemIndex).isEqualTo(4)
         assertThat(state.firstVisibleItemScrollOffset).isEqualTo(0)
@@ -1604,8 +1347,7 @@
         rule.setContentWithTestViewConfiguration {
             LazyStaggeredGrid(
                 3,
-                Modifier
-                    .testTag(LazyStaggeredGridTag)
+                Modifier.testTag(LazyStaggeredGridTag)
                     .crossAxisSize(itemSizeDp * 3)
                     .mainAxisSize(itemSizeDp * 2),
                 state
@@ -1613,27 +1355,21 @@
                 repeat(10) { repeatIndex ->
                     items(3) {
                         Box(
-                            Modifier
-                                .testTag("${repeatIndex * 3 + it}")
+                            Modifier.testTag("${repeatIndex * 3 + it}")
                                 .mainAxisSize(itemSizeDp + itemSizeDp * it / 2)
                         )
                     }
 
                     item(span = StaggeredGridItemSpan.FullLine) {
-                        Box(
-                            Modifier
-                                .testTag("full-$repeatIndex")
-                                .mainAxisSize(itemSizeDp))
+                        Box(Modifier.testTag("full-$repeatIndex").mainAxisSize(itemSizeDp))
                     }
                 }
             }
         }
 
-        rule.onNodeWithTag(LazyStaggeredGridTag)
-            .scrollMainAxisBy(itemSizeDp * 3f)
+        rule.onNodeWithTag(LazyStaggeredGridTag).scrollMainAxisBy(itemSizeDp * 3f)
 
-        rule.onNodeWithTag(LazyStaggeredGridTag)
-            .scrollMainAxisBy(-itemSizeDp * 3f)
+        rule.onNodeWithTag(LazyStaggeredGridTag).scrollMainAxisBy(-itemSizeDp * 3f)
 
         // ┌───┬───┬───┐  <-- scroll offset
         // │ 0 │ 1 │ 2 │
@@ -1649,23 +1385,17 @@
         // │   full-1  │
         // └───────────┘
 
-        rule.onNodeWithTag("0")
-            .assertAxisBounds(
-                DpOffset(0.dp, 0.dp),
-                DpSize(itemSizeDp, itemSizeDp)
-            )
+        rule
+            .onNodeWithTag("0")
+            .assertAxisBounds(DpOffset(0.dp, 0.dp), DpSize(itemSizeDp, itemSizeDp))
 
-        rule.onNodeWithTag("1")
-            .assertAxisBounds(
-                DpOffset(itemSizeDp, 0.dp),
-                DpSize(itemSizeDp, itemSizeDp * 1.5f)
-            )
+        rule
+            .onNodeWithTag("1")
+            .assertAxisBounds(DpOffset(itemSizeDp, 0.dp), DpSize(itemSizeDp, itemSizeDp * 1.5f))
 
-        rule.onNodeWithTag("2")
-            .assertAxisBounds(
-                DpOffset(itemSizeDp * 2, 0.dp),
-                DpSize(itemSizeDp, itemSizeDp * 2)
-            )
+        rule
+            .onNodeWithTag("2")
+            .assertAxisBounds(DpOffset(itemSizeDp * 2, 0.dp), DpSize(itemSizeDp, itemSizeDp * 2))
 
         assertThat(state.firstVisibleItemIndex).isEqualTo(0)
         assertThat(state.firstVisibleItemScrollOffset).isEqualTo(0)
@@ -1678,54 +1408,39 @@
         rule.setContentWithTestViewConfiguration {
             LazyStaggeredGrid(
                 3,
-                Modifier
-                    .testTag(LazyStaggeredGridTag)
+                Modifier.testTag(LazyStaggeredGridTag)
                     .crossAxisSize(itemSizeDp * 3)
                     .mainAxisSize(itemSizeDp * 2),
                 state
             ) {
                 items(10, span = { StaggeredGridItemSpan.FullLine }) {
-                    Box(
-                        Modifier
-                            .testTag("$it")
-                            .mainAxisSize(itemSizeDp)
-                    )
+                    Box(Modifier.testTag("$it").mainAxisSize(itemSizeDp))
                 }
             }
         }
 
-        rule.onNodeWithTag(LazyStaggeredGridTag)
-            .scrollMainAxisBy(itemSizeDp * 3f)
+        rule.onNodeWithTag(LazyStaggeredGridTag).scrollMainAxisBy(itemSizeDp * 3f)
 
-        rule.onNodeWithTag("3")
-            .assertAxisBounds(
-                DpOffset(0.dp, 0.dp),
-                DpSize(itemSizeDp * 3, itemSizeDp)
-            )
+        rule
+            .onNodeWithTag("3")
+            .assertAxisBounds(DpOffset(0.dp, 0.dp), DpSize(itemSizeDp * 3, itemSizeDp))
 
-        rule.onNodeWithTag("4")
-            .assertAxisBounds(
-                DpOffset(0.dp, itemSizeDp),
-                DpSize(itemSizeDp * 3, itemSizeDp)
-            )
+        rule
+            .onNodeWithTag("4")
+            .assertAxisBounds(DpOffset(0.dp, itemSizeDp), DpSize(itemSizeDp * 3, itemSizeDp))
 
         assertThat(state.firstVisibleItemIndex).isEqualTo(3)
         assertThat(state.firstVisibleItemScrollOffset).isEqualTo(0)
 
-        rule.onNodeWithTag(LazyStaggeredGridTag)
-            .scrollMainAxisBy(itemSizeDp * 10f)
+        rule.onNodeWithTag(LazyStaggeredGridTag).scrollMainAxisBy(itemSizeDp * 10f)
 
-        rule.onNodeWithTag("8")
-            .assertAxisBounds(
-                DpOffset(0.dp, 0.dp),
-                DpSize(itemSizeDp * 3, itemSizeDp)
-            )
+        rule
+            .onNodeWithTag("8")
+            .assertAxisBounds(DpOffset(0.dp, 0.dp), DpSize(itemSizeDp * 3, itemSizeDp))
 
-        rule.onNodeWithTag("9")
-            .assertAxisBounds(
-                DpOffset(0.dp, itemSizeDp),
-                DpSize(itemSizeDp * 3, itemSizeDp)
-            )
+        rule
+            .onNodeWithTag("9")
+            .assertAxisBounds(DpOffset(0.dp, itemSizeDp), DpSize(itemSizeDp * 3, itemSizeDp))
 
         assertThat(state.firstVisibleItemIndex).isEqualTo(8)
         assertThat(state.firstVisibleItemScrollOffset).isEqualTo(0)
@@ -1739,29 +1454,23 @@
                 LazyStaggeredGrid(
                     lanes = 3,
                     state = state,
-                    modifier = Modifier
-                        .crossAxisSize(itemSizeDp * 3)
-                        .testTag(LazyStaggeredGridTag),
+                    modifier = Modifier.crossAxisSize(itemSizeDp * 3).testTag(LazyStaggeredGridTag),
                 ) {
                     item(span = StaggeredGridItemSpan.FullLine) {
-                        Spacer(
-                            Modifier
-                                .testTag("full")
-                                .mainAxisSize(itemSizeDp * 2)
-                        )
+                        Spacer(Modifier.testTag("full").mainAxisSize(itemSizeDp * 2))
                     }
                     items(6) {
-                        val size = when (it) {
-                            0, 3 -> itemSizeDp * 2
-                            1, 4 -> itemSizeDp * 1.5f
-                            2, 5 -> itemSizeDp
-                            else -> error("unexpected item $it")
-                        }
-                        Spacer(
-                            Modifier
-                                .testTag("$it")
-                                .mainAxisSize(size)
-                        )
+                        val size =
+                            when (it) {
+                                0,
+                                3 -> itemSizeDp * 2
+                                1,
+                                4 -> itemSizeDp * 1.5f
+                                2,
+                                5 -> itemSizeDp
+                                else -> error("unexpected item $it")
+                            }
+                        Spacer(Modifier.testTag("$it").mainAxisSize(size))
                     }
                 }
             }
@@ -1779,40 +1488,42 @@
         // │ 5 │   │   │
         // └───┴───┴───┘ <-- end of grid
 
-        rule.onNodeWithTag("full")
+        rule
+            .onNodeWithTag("full")
+            .assertAxisBounds(DpOffset(0.dp, -itemSizeDp), DpSize(itemSizeDp * 3, itemSizeDp * 2))
+
+        rule
+            .onNodeWithTag("0")
+            .assertAxisBounds(DpOffset(0.dp, itemSizeDp), DpSize(itemSizeDp, itemSizeDp * 2f))
+
+        rule
+            .onNodeWithTag("1")
             .assertAxisBounds(
-                DpOffset(0.dp, -itemSizeDp), DpSize(itemSizeDp * 3, itemSizeDp * 2)
+                DpOffset(itemSizeDp, itemSizeDp),
+                DpSize(itemSizeDp, itemSizeDp * 1.5f)
             )
 
-        rule.onNodeWithTag("0")
+        rule
+            .onNodeWithTag("2")
+            .assertAxisBounds(DpOffset(itemSizeDp * 2f, itemSizeDp), DpSize(itemSizeDp, itemSizeDp))
+
+        rule
+            .onNodeWithTag("3")
             .assertAxisBounds(
-                DpOffset(0.dp, itemSizeDp), DpSize(itemSizeDp, itemSizeDp * 2f)
+                DpOffset(itemSizeDp * 2f, itemSizeDp * 2f),
+                DpSize(itemSizeDp, itemSizeDp * 2)
             )
 
-        rule.onNodeWithTag("1")
+        rule
+            .onNodeWithTag("4")
             .assertAxisBounds(
-                DpOffset(itemSizeDp, itemSizeDp), DpSize(itemSizeDp, itemSizeDp * 1.5f)
+                DpOffset(itemSizeDp, itemSizeDp * 2.5f),
+                DpSize(itemSizeDp, itemSizeDp * 1.5f)
             )
 
-        rule.onNodeWithTag("2")
-            .assertAxisBounds(
-                DpOffset(itemSizeDp * 2f, itemSizeDp), DpSize(itemSizeDp, itemSizeDp)
-            )
-
-        rule.onNodeWithTag("3")
-            .assertAxisBounds(
-                DpOffset(itemSizeDp * 2f, itemSizeDp * 2f), DpSize(itemSizeDp, itemSizeDp * 2)
-            )
-
-        rule.onNodeWithTag("4")
-            .assertAxisBounds(
-                DpOffset(itemSizeDp, itemSizeDp * 2.5f), DpSize(itemSizeDp, itemSizeDp * 1.5f)
-            )
-
-        rule.onNodeWithTag("5")
-            .assertAxisBounds(
-                DpOffset(0.dp, itemSizeDp * 3), DpSize(itemSizeDp, itemSizeDp)
-            )
+        rule
+            .onNodeWithTag("5")
+            .assertAxisBounds(DpOffset(0.dp, itemSizeDp * 3), DpSize(itemSizeDp, itemSizeDp))
     }
 
     @Test
@@ -1823,22 +1534,20 @@
                 LazyStaggeredGrid(
                     lanes = 3,
                     state = state,
-                    modifier = Modifier
-                        .crossAxisSize(itemSizeDp * 3)
-                        .testTag(LazyStaggeredGridTag),
+                    modifier = Modifier.crossAxisSize(itemSizeDp * 3).testTag(LazyStaggeredGridTag),
                 ) {
                     items(6) {
-                        val size = when (it) {
-                            0, 3 -> itemSizeDp * 2
-                            1, 4 -> itemSizeDp * 1.5f
-                            2, 5 -> itemSizeDp
-                            else -> error("unexpected item $it")
-                        }
-                        Spacer(
-                            Modifier
-                                .testTag("$it")
-                                .mainAxisSize(size)
-                        )
+                        val size =
+                            when (it) {
+                                0,
+                                3 -> itemSizeDp * 2
+                                1,
+                                4 -> itemSizeDp * 1.5f
+                                2,
+                                5 -> itemSizeDp
+                                else -> error("unexpected item $it")
+                            }
+                        Spacer(Modifier.testTag("$it").mainAxisSize(size))
                     }
                 }
             }
@@ -1852,57 +1561,46 @@
         // │ 5 │   │   │
         // └───┴───┴───┘
 
-        rule.onNodeWithTag(LazyStaggeredGridTag)
-            .assertMainAxisSizeIsEqualTo(itemSizeDp * 3)
+        rule.onNodeWithTag(LazyStaggeredGridTag).assertMainAxisSizeIsEqualTo(itemSizeDp * 3)
 
-        rule.onNodeWithTag("0")
+        rule
+            .onNodeWithTag("0")
+            .assertAxisBounds(DpOffset(0.dp, 0.dp), DpSize(itemSizeDp, itemSizeDp * 2f))
+
+        rule
+            .onNodeWithTag("1")
+            .assertAxisBounds(DpOffset(itemSizeDp, 0.dp), DpSize(itemSizeDp, itemSizeDp * 1.5f))
+
+        rule
+            .onNodeWithTag("2")
+            .assertAxisBounds(DpOffset(itemSizeDp * 2f, 0.dp), DpSize(itemSizeDp, itemSizeDp))
+
+        rule
+            .onNodeWithTag("3")
             .assertAxisBounds(
-                DpOffset(0.dp, 0.dp), DpSize(itemSizeDp, itemSizeDp * 2f)
+                DpOffset(itemSizeDp * 2f, itemSizeDp),
+                DpSize(itemSizeDp, itemSizeDp * 2)
             )
 
-        rule.onNodeWithTag("1")
+        rule
+            .onNodeWithTag("4")
             .assertAxisBounds(
-                DpOffset(itemSizeDp, 0.dp), DpSize(itemSizeDp, itemSizeDp * 1.5f)
+                DpOffset(itemSizeDp, itemSizeDp * 1.5f),
+                DpSize(itemSizeDp, itemSizeDp * 1.5f)
             )
 
-        rule.onNodeWithTag("2")
-            .assertAxisBounds(
-                DpOffset(itemSizeDp * 2f, 0.dp), DpSize(itemSizeDp, itemSizeDp)
-            )
-
-        rule.onNodeWithTag("3")
-            .assertAxisBounds(
-                DpOffset(itemSizeDp * 2f, itemSizeDp), DpSize(itemSizeDp, itemSizeDp * 2)
-            )
-
-        rule.onNodeWithTag("4")
-            .assertAxisBounds(
-                DpOffset(itemSizeDp, itemSizeDp * 1.5f), DpSize(itemSizeDp, itemSizeDp * 1.5f)
-            )
-
-        rule.onNodeWithTag("5")
-            .assertAxisBounds(
-                DpOffset(0.dp, itemSizeDp * 2), DpSize(itemSizeDp, itemSizeDp)
-            )
+        rule
+            .onNodeWithTag("5")
+            .assertAxisBounds(DpOffset(0.dp, itemSizeDp * 2), DpSize(itemSizeDp, itemSizeDp))
     }
 
     @Test
     fun changeItemsAndScrollImmediately() {
-        val keys = mutableStateListOf<Int>().also { list ->
-            repeat(10) {
-                list.add(it)
-            }
-        }
+        val keys = mutableStateListOf<Int>().also { list -> repeat(10) { list.add(it) } }
         rule.setContent {
             state = rememberLazyStaggeredGridState()
-            LazyStaggeredGrid(
-                lanes = 2,
-                Modifier.mainAxisSize(itemSizeDp),
-                state
-            ) {
-                items(keys, key = { it }) {
-                    Box(Modifier.size(itemSizeDp * 2))
-                }
+            LazyStaggeredGrid(lanes = 2, Modifier.mainAxisSize(itemSizeDp), state) {
+                items(keys, key = { it }) { Box(Modifier.size(itemSizeDp * 2)) }
             }
         }
 
@@ -1933,19 +1631,16 @@
                 modifier = Modifier.axisSize(crossAxis = itemSizeDp * 5, mainAxis = itemSizeDp * 5),
                 state = state
             ) {
-                items(10) { index ->
-                    Box(
-                        Modifier
-                            .size(itemSizeDp)
-                            .testTag(index.toString()))
-                }
+                items(10) { index -> Box(Modifier.size(itemSizeDp).testTag(index.toString())) }
             }
         }
 
-        rule.onNodeWithTag("0")
+        rule
+            .onNodeWithTag("0")
             .assertCrossAxisStartPositionInRootIsEqualTo(0.dp)
             .assertCrossAxisSizeIsEqualTo(itemSizeDp * 2)
-        rule.onNodeWithTag("1")
+        rule
+            .onNodeWithTag("1")
             .assertCrossAxisStartPositionInRootIsEqualTo(itemSizeDp * 2f)
             .assertCrossAxisSizeIsEqualTo(itemSizeDp * 2)
     }
@@ -1964,18 +1659,15 @@
                     Box(Modifier.size(itemSizeDp))
                 }
 
-                items(10) { index ->
-                    Box(
-                        Modifier
-                            .size(itemSizeDp)
-                            .testTag(index.toString()))
-                }
+                items(10) { index -> Box(Modifier.size(itemSizeDp).testTag(index.toString())) }
             }
         }
 
-        rule.onNodeWithTag("0")
+        rule
+            .onNodeWithTag("0")
             .assertAxisBounds(DpOffset(0.dp, itemSizeDp * 2), DpSize(itemSizeDp, itemSizeDp))
-        rule.onNodeWithTag("1")
+        rule
+            .onNodeWithTag("1")
             .assertAxisBounds(DpOffset(itemSizeDp, itemSizeDp * 2), DpSize(itemSizeDp, itemSizeDp))
     }
 
@@ -1987,27 +1679,18 @@
                 LazyStaggeredGrid(
                     lanes = 1,
                     state = state,
-                    modifier = Modifier.axisSize(
-                        crossAxis = itemSizeDp * 2,
-                        mainAxis = itemSizeDp * 5
-                    ),
+                    modifier =
+                        Modifier.axisSize(crossAxis = itemSizeDp * 2, mainAxis = itemSizeDp * 5),
                 ) {
                     items(20) {
-                        Spacer(
-                            modifier = Modifier
-                                .mainAxisSize(itemSizeDp)
-                                .testTag(it.toString())
-                        )
+                        Spacer(modifier = Modifier.mainAxisSize(itemSizeDp).testTag(it.toString()))
                     }
                 }
-                LaunchedEffect(state) {
-                    state.scrollToItem(10)
-                }
+                LaunchedEffect(state) { state.scrollToItem(10) }
             }
         }
 
-        rule.onNodeWithTag("10")
-            .assertStartPositionInRootIsEqualTo(0.dp)
+        rule.onNodeWithTag("10").assertStartPositionInRootIsEqualTo(0.dp)
     }
 
     @Test
@@ -2017,26 +1700,16 @@
             LazyStaggeredGrid(
                 lanes = 1,
                 state = state,
-                modifier = Modifier.axisSize(
-                    crossAxis = itemSizeDp * 2,
-                    mainAxis = itemSizeDp * 5
-                ),
+                modifier = Modifier.axisSize(crossAxis = itemSizeDp * 2, mainAxis = itemSizeDp * 5),
             ) {
                 items(20) {
-                    Spacer(
-                        modifier = Modifier
-                            .mainAxisSize(itemSizeDp)
-                            .testTag(it.toString())
-                    )
+                    Spacer(modifier = Modifier.mainAxisSize(itemSizeDp).testTag(it.toString()))
                 }
             }
-            LaunchedEffect(state) {
-                state.scrollToItem(10)
-            }
+            LaunchedEffect(state) { state.scrollToItem(10) }
         }
 
-        rule.onNodeWithTag("10")
-            .assertStartPositionInRootIsEqualTo(0.dp)
+        rule.onNodeWithTag("10").assertStartPositionInRootIsEqualTo(0.dp)
     }
 
     @Test
@@ -2047,43 +1720,26 @@
             LazyStaggeredGrid(
                 lanes = 2,
                 state = state,
-                modifier = Modifier.axisSize(
-                    crossAxis = itemSizeDp * 2,
-                    mainAxis = itemSizeDp * 2
-                ),
+                modifier = Modifier.axisSize(crossAxis = itemSizeDp * 2, mainAxis = itemSizeDp * 2),
             ) {
                 if (firstItemVisible) {
-                    item {
-                        Spacer(
-                            modifier = Modifier
-                                .mainAxisSize(itemSizeDp)
-                                .testTag("first")
-                        )
-                    }
+                    item { Spacer(modifier = Modifier.mainAxisSize(itemSizeDp).testTag("first")) }
                 }
 
                 items(
                     count = 20,
                     span = {
-                        if (it == 10)
-                            StaggeredGridItemSpan.FullLine
-                        else
-                            StaggeredGridItemSpan.SingleLane
+                        if (it == 10) StaggeredGridItemSpan.FullLine
+                        else StaggeredGridItemSpan.SingleLane
                     }
                 ) {
-                    Spacer(
-                        modifier = Modifier
-                            .mainAxisSize(itemSizeDp)
-                            .testTag(it.toString())
-                    )
+                    Spacer(modifier = Modifier.mainAxisSize(itemSizeDp).testTag(it.toString()))
                 }
             }
         }
 
         rule.runOnIdle {
-            runBlocking(AutoTestFrameClock()) {
-                state.scrollToItem(10)
-            }
+            runBlocking(AutoTestFrameClock()) { state.scrollToItem(10) }
 
             firstItemVisible = true
 
@@ -2094,8 +1750,7 @@
             }
         }
 
-        rule.onNodeWithTag("9")
-            .assertMainAxisStartPositionInRootIsEqualTo(0.dp)
+        rule.onNodeWithTag("9").assertMainAxisStartPositionInRootIsEqualTo(0.dp)
     }
 
     @Test
@@ -2107,9 +1762,7 @@
             LazyStaggeredGrid(
                 lanes = 2,
                 state = state,
-                modifier = Modifier
-                    .mainAxisSize(itemSizeDp * 1.5f)
-                    .crossAxisSize(itemSizeDp * 2)
+                modifier = Modifier.mainAxisSize(itemSizeDp * 1.5f).crossAxisSize(itemSizeDp * 2)
             ) {
                 items(100) {
                     Spacer(Modifier.mainAxisSize(itemSizeDp))
@@ -2132,9 +1785,7 @@
                 assertThat(state.firstVisibleItemScrollOffset).isEqualTo(10)
             }
         }
-        rule.runOnIdle {
-            assertThat(composedItems).isEqualTo(setOf(6, 7, 8, 9))
-        }
+        rule.runOnIdle { assertThat(composedItems).isEqualTo(setOf(6, 7, 8, 9)) }
     }
 
     @Test
@@ -2146,9 +1797,7 @@
             LazyStaggeredGrid(
                 lanes = 2,
                 state = state,
-                modifier = Modifier
-                    .mainAxisSize(itemSizeDp * 1.5f)
-                    .crossAxisSize(itemSizeDp * 2)
+                modifier = Modifier.mainAxisSize(itemSizeDp * 1.5f).crossAxisSize(itemSizeDp * 2)
             ) {
                 items(100) {
                     Spacer(Modifier.mainAxisSize(itemSizeDp))
@@ -2171,9 +1820,7 @@
                 assertThat(state.firstVisibleItemScrollOffset).isEqualTo(itemSizePx / 2 - 5)
             }
         }
-        rule.runOnIdle {
-            assertThat(composedItems).isEqualTo(setOf(0, 1, 2, 3))
-        }
+        rule.runOnIdle { assertThat(composedItems).isEqualTo(setOf(0, 1, 2, 3)) }
     }
 
     @Test
@@ -2185,41 +1832,37 @@
             LazyStaggeredGrid(
                 lanes = 2,
                 state = state,
-                modifier = Modifier
-                    .mainAxisSize(itemSizeDp * 2)
-                    .crossAxisSize(itemSizeDp * 2)
+                modifier = Modifier.mainAxisSize(itemSizeDp * 2).crossAxisSize(itemSizeDp * 2)
             ) {
                 repeat(10) { index ->
-                    items(2) {
-                        Spacer(Modifier.testTag("${index * 10 + it}"))
-                    }
-                    items(8) {
-                        Spacer(Modifier.mainAxisSize(itemSizeDp))
-                    }
+                    items(2) { Spacer(Modifier.testTag("${index * 10 + it}")) }
+                    items(8) { Spacer(Modifier.mainAxisSize(itemSizeDp)) }
                 }
             }
         }
 
-        rule.onNodeWithTag("0")
+        rule
+            .onNodeWithTag("0")
             .assertIsPlaced()
             .assertMainAxisStartPositionInRootIsEqualTo(0.dp)
             .assertMainAxisSizeIsEqualTo(0.dp)
 
-        rule.onNodeWithTag("1")
+        rule
+            .onNodeWithTag("1")
             .assertIsPlaced()
             .assertMainAxisStartPositionInRootIsEqualTo(0.dp)
             .assertMainAxisSizeIsEqualTo(0.dp)
 
-        runBlocking(Dispatchers.Main + AutoTestFrameClock()) {
-            state.scrollToItem(10, 0)
-        }
+        runBlocking(Dispatchers.Main + AutoTestFrameClock()) { state.scrollToItem(10, 0) }
 
-        rule.onNodeWithTag("10")
+        rule
+            .onNodeWithTag("10")
             .assertIsPlaced()
             .assertMainAxisStartPositionInRootIsEqualTo(0.dp)
             .assertMainAxisSizeIsEqualTo(0.dp)
 
-        rule.onNodeWithTag("11")
+        rule
+            .onNodeWithTag("11")
             .assertIsPlaced()
             .assertMainAxisStartPositionInRootIsEqualTo(0.dp)
             .assertMainAxisSizeIsEqualTo(0.dp)
@@ -2231,16 +1874,15 @@
         state = LazyStaggeredGridState()
         rule.setContent {
             LazyStaggeredGrid(
-                modifier = Modifier
-                    .mainAxisSize(gridHeight)
-                    .crossAxisSize(itemSizeDp * 2),
+                modifier = Modifier.mainAxisSize(gridHeight).crossAxisSize(itemSizeDp * 2),
                 state = state,
                 lanes = 2,
             ) {
                 items(20) {
                     Spacer(
-                        Modifier
-                            .mainAxisSize(if (it % 2 == 0) itemSizeDp * 5 else itemSizeDp * 0.5f)
+                        Modifier.mainAxisSize(
+                                if (it % 2 == 0) itemSizeDp * 5 else itemSizeDp * 0.5f
+                            )
                             .border(1.dp, Color.Red)
                             .testTag("$it")
                     )
@@ -2251,11 +1893,13 @@
         // scroll to bottom
         state.scrollBy(gridHeight * 2)
 
-        rule.onNodeWithTag("12")
+        rule
+            .onNodeWithTag("12")
             .assertCrossAxisStartPositionInRootIsEqualTo(0.dp)
             .assertMainAxisStartPositionInRootIsEqualTo(0.dp)
 
-        rule.onNodeWithTag("13")
+        rule
+            .onNodeWithTag("13")
             .assertCrossAxisStartPositionInRootIsEqualTo(itemSizeDp)
             .assertMainAxisStartPositionInRootIsEqualTo(0.dp)
 
@@ -2265,11 +1909,13 @@
         // scroll by a grid height
         state.scrollBy(gridHeight)
 
-        rule.onNodeWithTag("12")
+        rule
+            .onNodeWithTag("12")
             .assertCrossAxisStartPositionInRootIsEqualTo(0.dp)
             .assertMainAxisStartPositionInRootIsEqualTo(0.dp)
 
-        rule.onNodeWithTag("13")
+        rule
+            .onNodeWithTag("13")
             .assertCrossAxisStartPositionInRootIsEqualTo(itemSizeDp)
             .assertMainAxisStartPositionInRootIsEqualTo(0.dp)
     }
@@ -2285,13 +1931,7 @@
                     lanes = 2,
                     crossAxisArrangement = Arrangement.spacedBy(itemSizeDp * 2)
                 ) {
-                    items(20) {
-                        Spacer(
-                            Modifier
-                                .mainAxisSize(itemSizeDp)
-                                .testTag("$it")
-                        )
-                    }
+                    items(20) { Spacer(Modifier.mainAxisSize(itemSizeDp).testTag("$it")) }
                 }
             }
         }
diff --git a/compose/foundation/foundation/lint-baseline.xml b/compose/foundation/foundation/lint-baseline.xml
index 25edb88..82eb5b8 100644
--- a/compose/foundation/foundation/lint-baseline.xml
+++ b/compose/foundation/foundation/lint-baseline.xml
@@ -1,14 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<issues format="6" by="lint 8.4.0-alpha12" type="baseline" client="gradle" dependencies="false" name="AGP (8.4.0-alpha12)" variant="all" version="8.4.0-alpha12">
-
-    <issue
-        id="PrimitiveInCollection"
-        message="method genericClickableWithoutGesture has parameter currentKeyPressInteractions with type Map&lt;Key, Press>: replace with LongObjectMap"
-        errorLine1="    currentKeyPressInteractions: MutableMap&lt;Key, PressInteraction.Press>,"
-        errorLine2="                                 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/commonMain/kotlin/androidx/compose/foundation/Clickable.kt"/>
-    </issue>
+<issues format="6" by="lint 8.6.0-alpha03" type="baseline" client="gradle" dependencies="false" name="AGP (8.6.0-alpha03)" variant="all" version="8.6.0-alpha03">
 
     <issue
         id="PrimitiveInCollection"
@@ -22,8 +13,8 @@
     <issue
         id="PrimitiveInCollection"
         message="variable pinnedItems with type List&lt;? extends Integer>: replace with IntList"
-        errorLine1="        val pinnedItems = itemProvider.calculateLazyLayoutPinnedIndices("
-        errorLine2="        ^">
+        errorLine1="            val pinnedItems ="
+        errorLine2="            ^">
         <location
             file="src/commonMain/kotlin/androidx/compose/foundation/lazy/grid/LazyGrid.kt"/>
     </issue>
@@ -130,7 +121,7 @@
     <issue
         id="PrimitiveInCollection"
         message="field previousDefaultSpans with type List&lt;GridItemSpan>: replace with LongList"
-        errorLine1="    /**"
+        errorLine1="    /** List of 1x1 spans if we do not have custom spans. */"
         errorLine2="    ^">
         <location
             file="src/commonMain/kotlin/androidx/compose/foundation/lazy/grid/LazyGridSpanLayoutProvider.kt"/>
@@ -193,8 +184,8 @@
     <issue
         id="PrimitiveInCollection"
         message="variable pinnedItems with type List&lt;? extends Integer>: replace with IntList"
-        errorLine1="        val pinnedItems = itemProvider.calculateLazyLayoutPinnedIndices("
-        errorLine2="        ^">
+        errorLine1="            val pinnedItems ="
+        errorLine2="            ^">
         <location
             file="src/commonMain/kotlin/androidx/compose/foundation/lazy/LazyList.kt"/>
     </issue>
@@ -220,7 +211,7 @@
     <issue
         id="PrimitiveInCollection"
         message="return type List&lt;Integer> of getHeaderIndexes: replace with IntList"
-        errorLine1="    val headerIndexes: List&lt;Int> get() = _headerIndexes ?: emptyList()"
+        errorLine1="    val headerIndexes: List&lt;Int>"
         errorLine2="        ~~~~~~~~~~~~~">
         <location
             file="src/commonMain/kotlin/androidx/compose/foundation/lazy/LazyListIntervalContent.kt"/>
@@ -228,9 +219,9 @@
 
     <issue
         id="PrimitiveInCollection"
-        message="variable varb332e573 with type List&lt;Integer>: replace with IntList"
-        errorLine1="    val headerIndexes: List&lt;Int> get() = _headerIndexes ?: emptyList()"
-        errorLine2="                                         ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        message="variable varb332e6bb with type List&lt;Integer>: replace with IntList"
+        errorLine1="        get() = _headerIndexes ?: emptyList()"
+        errorLine2="                ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="src/commonMain/kotlin/androidx/compose/foundation/lazy/LazyListIntervalContent.kt"/>
     </issue>
@@ -238,17 +229,17 @@
     <issue
         id="PrimitiveInCollection"
         message="variable headersIndexes with type List&lt;Integer>: replace with IntList"
-        errorLine1="        val headersIndexes = _headerIndexes ?: mutableListOf&lt;Int>().also {"
-        errorLine2="        ^">
+        errorLine1="        val headersIndexes = _headerIndexes ?: mutableListOf&lt;Int>().also { _headerIndexes = it }"
+        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="src/commonMain/kotlin/androidx/compose/foundation/lazy/LazyListIntervalContent.kt"/>
     </issue>
 
     <issue
         id="PrimitiveInCollection"
-        message="variable varb3338ae4 with type List&lt;Integer>: replace with IntList"
-        errorLine1="        val headersIndexes = _headerIndexes ?: mutableListOf&lt;Int>().also {"
-        errorLine2="                             ^">
+        message="variable varb333823e with type List&lt;Integer>: replace with IntList"
+        errorLine1="        val headersIndexes = _headerIndexes ?: mutableListOf&lt;Int>().also { _headerIndexes = it }"
+        errorLine2="                             ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="src/commonMain/kotlin/androidx/compose/foundation/lazy/LazyListIntervalContent.kt"/>
     </issue>
@@ -337,8 +328,8 @@
     <issue
         id="PrimitiveInCollection"
         message="variable pinnedItems with type List&lt;? extends Integer>: replace with IntList"
-        errorLine1="        val pinnedItems = itemProvider.calculateLazyLayoutPinnedIndices("
-        errorLine2="        ^">
+        errorLine1="            val pinnedItems ="
+        errorLine2="            ^">
         <location
             file="src/commonMain/kotlin/androidx/compose/foundation/lazy/staggeredgrid/LazyStaggeredGridMeasurePolicy.kt"/>
     </issue>
@@ -400,8 +391,8 @@
     <issue
         id="PrimitiveInCollection"
         message="variable pinnedPages with type List&lt;? extends Integer>: replace with IntList"
-        errorLine1="        val pinnedPages = itemProvider.calculateLazyLayoutPinnedIndices("
-        errorLine2="        ^">
+        errorLine1="            val pinnedPages ="
+        errorLine2="            ^">
         <location
             file="src/commonMain/kotlin/androidx/compose/foundation/pager/PagerMeasurePolicy.kt"/>
     </issue>
diff --git a/compose/foundation/foundation/samples/src/main/java/androidx/compose/foundation/samples/AnchoredDraggableSample.kt b/compose/foundation/foundation/samples/src/main/java/androidx/compose/foundation/samples/AnchoredDraggableSample.kt
index 81a89a8..d28943f 100644
--- a/compose/foundation/foundation/samples/src/main/java/androidx/compose/foundation/samples/AnchoredDraggableSample.kt
+++ b/compose/foundation/foundation/samples/src/main/java/androidx/compose/foundation/samples/AnchoredDraggableSample.kt
@@ -62,7 +62,11 @@
 import kotlin.math.roundToInt
 
 private enum class AnchoredDraggableSampleValue {
-    Start, HalfStart, Center, HalfEnd, End
+    Start,
+    HalfStart,
+    Center,
+    HalfEnd,
+    End
 }
 
 @Composable
@@ -73,23 +77,25 @@
     val decayAnimationSpec = rememberSplineBasedDecay<Float>()
     val positionalThreshold = { distance: Float -> distance * 0.5f }
     val velocityThreshold = { with(density) { 125.dp.toPx() } }
-    val state = rememberSaveable(
-        density,
-        saver = AnchoredDraggableState.Saver(
-            snapAnimationSpec,
-            decayAnimationSpec,
-            positionalThreshold,
-            velocityThreshold
-        )
-    ) {
-        AnchoredDraggableState(
-            initialValue = Center,
-            positionalThreshold,
-            velocityThreshold,
-            snapAnimationSpec,
-            decayAnimationSpec
-        )
-    }
+    val state =
+        rememberSaveable(
+            density,
+            saver =
+                AnchoredDraggableState.Saver(
+                    snapAnimationSpec,
+                    decayAnimationSpec,
+                    positionalThreshold,
+                    velocityThreshold
+                )
+        ) {
+            AnchoredDraggableState(
+                initialValue = Center,
+                positionalThreshold,
+                velocityThreshold,
+                snapAnimationSpec,
+                decayAnimationSpec
+            )
+        }
     val draggableWidth = 70.dp
     val containerWidthPx = with(density) { draggableWidth.toPx() }
     // Our anchors depend on the density which is obtained from composition, so we update them using
@@ -105,15 +111,8 @@
     }
     Box(Modifier.width(draggableWidth)) {
         Box(
-            Modifier
-                .size(100.dp)
-                .offset {
-                    IntOffset(
-                        x = state
-                            .requireOffset()
-                            .roundToInt(), y = 0
-                    )
-                }
+            Modifier.size(100.dp)
+                .offset { IntOffset(x = state.requireOffset().roundToInt(), y = 0) }
                 .anchoredDraggable(state, Orientation.Horizontal)
                 .background(Color.Red)
         )
@@ -128,28 +127,29 @@
     val decayAnimationSpec = rememberSplineBasedDecay<Float>()
     val positionalThreshold = { distance: Float -> distance * 0.5f }
     val velocityThreshold = { with(density) { 125.dp.toPx() } }
-    val state = rememberSaveable(
-        density,
-        saver = AnchoredDraggableState.Saver(
-            snapAnimationSpec,
-            decayAnimationSpec,
-            positionalThreshold,
-            velocityThreshold
-        )
-    ) {
-        AnchoredDraggableState(
-            initialValue = Center,
-            positionalThreshold,
-            velocityThreshold,
-            snapAnimationSpec,
-            decayAnimationSpec
-        )
-    }
+    val state =
+        rememberSaveable(
+            density,
+            saver =
+                AnchoredDraggableState.Saver(
+                    snapAnimationSpec,
+                    decayAnimationSpec,
+                    positionalThreshold,
+                    velocityThreshold
+                )
+        ) {
+            AnchoredDraggableState(
+                initialValue = Center,
+                positionalThreshold,
+                velocityThreshold,
+                snapAnimationSpec,
+                decayAnimationSpec
+            )
+        }
     val draggableSize = 60.dp
     val draggableSizePx = with(LocalDensity.current) { draggableSize.toPx() }
     Box(
-        Modifier
-            .fillMaxWidth()
+        Modifier.fillMaxWidth()
             // Our anchors depend on this box's size, so we obtain the size from onSizeChanged and
             // use updateAnchors to let the state know about the new anchors
             .onSizeChanged { layoutSize ->
@@ -167,15 +167,8 @@
             .visualizeDraggableAnchors(state, Orientation.Horizontal)
     ) {
         Box(
-            Modifier
-                .size(draggableSize)
-                .offset {
-                    IntOffset(
-                        x = state
-                            .requireOffset()
-                            .roundToInt(), y = 0
-                    )
-                }
+            Modifier.size(draggableSize)
+                .offset { IntOffset(x = state.requireOffset().roundToInt(), y = 0) }
                 .anchoredDraggable(state, Orientation.Horizontal)
                 .background(Color.Red)
         )
@@ -221,39 +214,31 @@
     // Setting the duration of the snapAnimationSpec to 3000ms gives more time to attempt to press
     // or drag the settling box.
     val snapAnimationSpec = tween<Float>(durationMillis = 3000)
-    val state = AnchoredDraggableState(
-        initialValue = Start,
-        positionalThreshold = { distance: Float -> distance * 0.5f },
-        velocityThreshold = { with(density) { 125.dp.toPx() } },
-        snapAnimationSpec = snapAnimationSpec,
-        decayAnimationSpec = decayAnimationSpec
-    )
+    val state =
+        AnchoredDraggableState(
+            initialValue = Start,
+            positionalThreshold = { distance: Float -> distance * 0.5f },
+            velocityThreshold = { with(density) { 125.dp.toPx() } },
+            snapAnimationSpec = snapAnimationSpec,
+            decayAnimationSpec = decayAnimationSpec
+        )
 
     val draggableSize = 100.dp
     val draggableSizePx = with(LocalDensity.current) { draggableSize.toPx() }
     Box(
-        Modifier
-            .fillMaxWidth()
-            .onSizeChanged { layoutSize ->
-                val dragEndPoint = layoutSize.width - draggableSizePx
-                state.updateAnchors(
-                    DraggableAnchors {
-                        Start at 0f
-                        End at dragEndPoint
-                    }
-                )
-            }
+        Modifier.fillMaxWidth().onSizeChanged { layoutSize ->
+            val dragEndPoint = layoutSize.width - draggableSizePx
+            state.updateAnchors(
+                DraggableAnchors {
+                    Start at 0f
+                    End at dragEndPoint
+                }
+            )
+        }
     ) {
         Box(
-            Modifier
-                .size(draggableSize)
-                .offset {
-                    IntOffset(
-                        x = state
-                            .requireOffset()
-                            .roundToInt(), y = 0
-                    )
-                }
+            Modifier.size(draggableSize)
+                .offset { IntOffset(x = state.requireOffset().roundToInt(), y = 0) }
                 .anchoredDraggable(state, Orientation.Horizontal, startDragImmediately = false)
                 .background(Color.Red)
         )
@@ -273,48 +258,41 @@
     val positionalThreshold = { distance: Float -> distance * 0.5f }
     val velocityThreshold = { with(density) { 125.dp.toPx() } }
     val overscrollEffect = ScrollableDefaults.overscrollEffect()
-    val state = rememberSaveable(
-        density,
-        saver = AnchoredDraggableState.Saver(
-            animationSpec,
-            decayAnimationSpec,
-            positionalThreshold,
-            velocityThreshold,
-        )
-    ) {
-        AnchoredDraggableState(
-            initialValue = Center,
-            positionalThreshold,
-            velocityThreshold,
-            animationSpec,
-            decayAnimationSpec,
-        )
-    }
+    val state =
+        rememberSaveable(
+            density,
+            saver =
+                AnchoredDraggableState.Saver(
+                    animationSpec,
+                    decayAnimationSpec,
+                    positionalThreshold,
+                    velocityThreshold,
+                )
+        ) {
+            AnchoredDraggableState(
+                initialValue = Center,
+                positionalThreshold,
+                velocityThreshold,
+                animationSpec,
+                decayAnimationSpec,
+            )
+        }
 
     Box(
-        Modifier
-            .fillMaxWidth()
-            .onSizeChanged { layoutSize ->
-                val dragEndPoint = layoutSize.width - draggableSizePx
-                state.updateAnchors(
-                    DraggableAnchors {
-                        Start at 0f
-                        Center at dragEndPoint / 2f
-                        End at dragEndPoint
-                    }
-                )
-            }
+        Modifier.fillMaxWidth().onSizeChanged { layoutSize ->
+            val dragEndPoint = layoutSize.width - draggableSizePx
+            state.updateAnchors(
+                DraggableAnchors {
+                    Start at 0f
+                    Center at dragEndPoint / 2f
+                    End at dragEndPoint
+                }
+            )
+        }
     ) {
         Box(
-            Modifier
-                .size(draggableSize)
-                .offset {
-                    IntOffset(
-                        x = state
-                            .requireOffset()
-                            .roundToInt(), y = 0
-                    )
-                }
+            Modifier.size(draggableSize)
+                .offset { IntOffset(x = state.requireOffset().roundToInt(), y = 0) }
                 // pass the overscrollEffect to AnchoredDraggable
                 .anchoredDraggable(
                     state,
@@ -334,28 +312,29 @@
     val decayAnimationSpec = rememberSplineBasedDecay<Float>()
     val positionalThreshold = { distance: Float -> distance * 0.5f }
     val velocityThreshold = { with(density) { 125.dp.toPx() } }
-    val state = rememberSaveable(
-        density,
-        saver = AnchoredDraggableState.Saver(
-            snapAnimationSpec,
-            decayAnimationSpec,
-            positionalThreshold,
-            velocityThreshold
-        )
-    ) {
-        AnchoredDraggableState(
-            initialValue = Center,
-            positionalThreshold,
-            velocityThreshold,
-            snapAnimationSpec,
-            decayAnimationSpec
-        )
-    }
+    val state =
+        rememberSaveable(
+            density,
+            saver =
+                AnchoredDraggableState.Saver(
+                    snapAnimationSpec,
+                    decayAnimationSpec,
+                    positionalThreshold,
+                    velocityThreshold
+                )
+        ) {
+            AnchoredDraggableState(
+                initialValue = Center,
+                positionalThreshold,
+                velocityThreshold,
+                snapAnimationSpec,
+                decayAnimationSpec
+            )
+        }
     val draggableSize = 60.dp
     val draggableSizePx = with(LocalDensity.current) { draggableSize.toPx() }
     Column(
-        Modifier
-            .fillMaxWidth()
+        Modifier.fillMaxWidth()
             // Our anchors depend on this box's size, so we obtain the size from onSizeChanged and
             // use updateAnchors to let the state know about the new anchors
             .onSizeChanged { layoutSize ->
@@ -376,22 +355,14 @@
         val centerToEndProgress by derivedStateOf { state.progress(from = Center, to = End) }
         Box {
             Box(
-                Modifier
-                    .fillMaxWidth()
+                Modifier.fillMaxWidth()
                     .height(draggableSize)
                     .graphicsLayer { alpha = max(centerToStartProgress, centerToEndProgress) }
                     .background(Color.Black)
             )
             Box(
-                Modifier
-                    .size(draggableSize)
-                    .offset {
-                        IntOffset(
-                            x = state
-                                .requireOffset()
-                                .roundToInt(), y = 0
-                        )
-                    }
+                Modifier.size(draggableSize)
+                    .offset { IntOffset(x = state.requireOffset().roundToInt(), y = 0) }
                     .anchoredDraggable(state, Orientation.Horizontal)
                     .background(Color.Red)
             )
@@ -402,9 +373,8 @@
 /**
  * A [Modifier] that visualizes the anchors attached to an [AnchoredDraggableState] as lines along
  * the cross axis of the layout (start to end for [Orientation.Vertical], top to end for
- * [Orientation.Horizontal]).
- * This is useful to debug components with a complex set of anchors, or for AnchoredDraggable
- * development.
+ * [Orientation.Horizontal]). This is useful to debug components with a complex set of anchors, or
+ * for AnchoredDraggable development.
  *
  * @param state The state whose anchors to visualize
  * @param orientation The orientation of the [anchoredDraggable]
@@ -421,14 +391,16 @@
 ) = drawWithContent {
     drawContent()
     state.anchors.forEach { _, position ->
-        val startOffset = Offset(
-            x = if (orientation == Orientation.Horizontal) position else 0f,
-            y = if (orientation == Orientation.Vertical) position else 0f
-        )
-        val endOffset = Offset(
-            x = if (orientation == Orientation.Horizontal) startOffset.x else size.height,
-            y = if (orientation == Orientation.Vertical) startOffset.y else size.width
-        )
+        val startOffset =
+            Offset(
+                x = if (orientation == Orientation.Horizontal) position else 0f,
+                y = if (orientation == Orientation.Vertical) position else 0f
+            )
+        val endOffset =
+            Offset(
+                x = if (orientation == Orientation.Horizontal) startOffset.x else size.height,
+                y = if (orientation == Orientation.Vertical) startOffset.y else size.width
+            )
         drawLine(
             color = lineColor,
             start = startOffset,
diff --git a/compose/foundation/foundation/samples/src/main/java/androidx/compose/foundation/samples/AndroidExternalSurfaceSamples.kt b/compose/foundation/foundation/samples/src/main/java/androidx/compose/foundation/samples/AndroidExternalSurfaceSamples.kt
index 0e1d13e..dbac1db 100644
--- a/compose/foundation/foundation/samples/src/main/java/androidx/compose/foundation/samples/AndroidExternalSurfaceSamples.kt
+++ b/compose/foundation/foundation/samples/src/main/java/androidx/compose/foundation/samples/AndroidExternalSurfaceSamples.kt
@@ -34,9 +34,7 @@
 @Sampled
 @Composable
 fun AndroidExternalSurfaceColors() {
-    AndroidExternalSurface(
-        modifier = Modifier.fillMaxWidth().height(400.dp)
-    ) {
+    AndroidExternalSurface(modifier = Modifier.fillMaxWidth().height(400.dp)) {
         // Resources can be initialized/cached here
 
         // A surface is available, we can start rendering
@@ -57,8 +55,7 @@
             }
 
             // Cleanup if needed
-            surface.onDestroyed {
-            }
+            surface.onDestroyed {}
 
             // Render loop, automatically cancelled on surface destruction
             while (true) {
@@ -78,9 +75,7 @@
 @Sampled
 @Composable
 fun AndroidEmbeddedExternalSurfaceColors() {
-    AndroidEmbeddedExternalSurface(
-        modifier = Modifier.fillMaxWidth().height(400.dp)
-    ) {
+    AndroidEmbeddedExternalSurface(modifier = Modifier.fillMaxWidth().height(400.dp)) {
         // Resources can be initialized/cached here
 
         // A surface is available, we can start rendering
@@ -101,8 +96,7 @@
             }
 
             // Cleanup if needed
-            surface.onDestroyed {
-            }
+            surface.onDestroyed {}
 
             // Render loop, automatically cancelled on surface destruction
             while (true) {
diff --git a/compose/foundation/foundation/samples/src/main/java/androidx/compose/foundation/samples/BasicMarqueeSamples.kt b/compose/foundation/foundation/samples/src/main/java/androidx/compose/foundation/samples/BasicMarqueeSamples.kt
index 400d565..1322b60 100644
--- a/compose/foundation/foundation/samples/src/main/java/androidx/compose/foundation/samples/BasicMarqueeSamples.kt
+++ b/compose/foundation/foundation/samples/src/main/java/androidx/compose/foundation/samples/BasicMarqueeSamples.kt
@@ -53,9 +53,7 @@
 @Composable
 fun BasicMarqueeSample() {
     // Marquee only animates when the content doesn't fit in the max width.
-    Column(Modifier.width(30.dp)) {
-        Text("hello world", Modifier.basicMarquee())
-    }
+    Column(Modifier.width(30.dp)) { Text("hello world", Modifier.basicMarquee()) }
 }
 
 @Preview(showBackground = true)
@@ -66,11 +64,12 @@
 
     // Marquee only animates when the content doesn't fit in the max width.
     Column(Modifier.width(30.dp)) {
-        Text("hello world", Modifier
-            .clickable { focusRequester.requestFocus() }
-            .basicMarquee(animationMode = MarqueeAnimationMode.WhileFocused)
-            .focusRequester(focusRequester)
-            .focusable()
+        Text(
+            "hello world",
+            Modifier.clickable { focusRequester.requestFocus() }
+                .basicMarquee(animationMode = MarqueeAnimationMode.WhileFocused)
+                .focusRequester(focusRequester)
+                .focusable()
         )
     }
 }
@@ -85,19 +84,19 @@
         drawRect(
             topLeft = Offset(if (leftEdge) 0f else size.width - edgeWidthPx, 0f),
             size = Size(edgeWidthPx, size.height),
-            brush = Brush.horizontalGradient(
-                colors = listOf(Color.Transparent, Color.Black),
-                startX = if (leftEdge) 0f else size.width,
-                endX = if (leftEdge) edgeWidthPx else size.width - edgeWidthPx
-            ),
+            brush =
+                Brush.horizontalGradient(
+                    colors = listOf(Color.Transparent, Color.Black),
+                    startX = if (leftEdge) 0f else size.width,
+                    endX = if (leftEdge) edgeWidthPx else size.width - edgeWidthPx
+                ),
             blendMode = BlendMode.DstIn
         )
     }
 
     Text(
         "the quick brown fox jumped over the lazy dogs",
-        Modifier
-            .widthIn(max = edgeWidth * 4)
+        Modifier.widthIn(max = edgeWidth * 4)
             // Rendering to an offscreen buffer is required to get the faded edges' alpha to be
             // applied only to the text, and not whatever is drawn below this composable (e.g. the
             // window).
diff --git a/compose/foundation/foundation/samples/src/main/java/androidx/compose/foundation/samples/BasicTextFieldSamples.kt b/compose/foundation/foundation/samples/src/main/java/androidx/compose/foundation/samples/BasicTextFieldSamples.kt
index 231cde2..ff04f60 100644
--- a/compose/foundation/foundation/samples/src/main/java/androidx/compose/foundation/samples/BasicTextFieldSamples.kt
+++ b/compose/foundation/foundation/samples/src/main/java/androidx/compose/foundation/samples/BasicTextFieldSamples.kt
@@ -87,9 +87,8 @@
 @Sampled
 @Composable
 fun BasicTextFieldSample() {
-    var value by rememberSaveable(stateSaver = TextFieldValue.Saver) {
-        mutableStateOf(TextFieldValue())
-    }
+    var value by
+        rememberSaveable(stateSaver = TextFieldValue.Saver) { mutableStateOf(TextFieldValue()) }
     BasicTextField(
         value = value,
         onValueChange = {
@@ -119,10 +118,7 @@
 fun PlaceholderBasicTextFieldSample() {
     var value by rememberSaveable { mutableStateOf("initial value") }
     Box {
-        BasicTextField(
-            value = value,
-            onValueChange = { value = it }
-        )
+        BasicTextField(value = value, onValueChange = { value = it })
         if (value.isEmpty()) {
             Text(text = "Placeholder")
         }
@@ -142,8 +138,7 @@
             // Modifier.clickable to the Row anymore to bring the text field into focus when user
             // taps on a larger text field area which includes paddings and the icon areas.
             Row(
-                Modifier
-                    .background(Color.LightGray, RoundedCornerShape(percent = 30))
+                Modifier.background(Color.LightGray, RoundedCornerShape(percent = 30))
                     .padding(16.dp)
             ) {
                 Icon(Icons.Default.MailOutline, contentDescription = null)
@@ -158,31 +153,32 @@
 @Composable
 fun CreditCardSample() {
     /** The offset translator used for credit card input field */
-    val creditCardOffsetTranslator = object : OffsetMapping {
-        override fun originalToTransformed(offset: Int): Int {
-            return when {
-                offset < 4 -> offset
-                offset < 8 -> offset + 1
-                offset < 12 -> offset + 2
-                offset <= 16 -> offset + 3
-                else -> 19
+    val creditCardOffsetTranslator =
+        object : OffsetMapping {
+            override fun originalToTransformed(offset: Int): Int {
+                return when {
+                    offset < 4 -> offset
+                    offset < 8 -> offset + 1
+                    offset < 12 -> offset + 2
+                    offset <= 16 -> offset + 3
+                    else -> 19
+                }
             }
-        }
 
-        override fun transformedToOriginal(offset: Int): Int {
-            return when {
-                offset <= 4 -> offset
-                offset <= 9 -> offset - 1
-                offset <= 14 -> offset - 2
-                offset <= 19 -> offset - 3
-                else -> 16
+            override fun transformedToOriginal(offset: Int): Int {
+                return when {
+                    offset <= 4 -> offset
+                    offset <= 9 -> offset - 1
+                    offset <= 14 -> offset - 2
+                    offset <= 19 -> offset - 3
+                    else -> 16
+                }
             }
         }
-    }
 
     /**
-     * Converts up to 16 digits to hyphen connected 4 digits string. For example,
-     * "1234567890123456" will be shown as "1234-5678-9012-3456"
+     * Converts up to 16 digits to hyphen connected 4 digits string. For example, "1234567890123456"
+     * will be shown as "1234-5678-9012-3456"
      */
     val creditCardTransformation = VisualTransformation { text ->
         val trimmedText = if (text.text.length > 16) text.text.substring(0..15) else text.text
@@ -211,9 +207,7 @@
 
 @Sampled
 fun BasicTextFieldStateCompleteSample() {
-    class SearchViewModel(
-        val searchFieldState: TextFieldState = TextFieldState()
-    ) {
+    class SearchViewModel(val searchFieldState: TextFieldState = TextFieldState()) {
         private val queryValidationRegex = """\w+""".toRegex()
 
         // Use derived state to avoid recomposing every time the text changes, and only recompose
@@ -228,14 +222,16 @@
 
         /** Called while the view model is active, e.g. from a LaunchedEffect. */
         suspend fun run() {
-            snapshotFlow { searchFieldState.text }.collectLatest { queryText ->
-                // Start a new search every time the user types something valid. If the previous
-                // search is still being processed when the text is changed, it will be cancelled
-                // and this code will run again with the latest query text.
-                if (isQueryValid) {
-                    searchResults = performSearch(query = queryText)
+            snapshotFlow { searchFieldState.text }
+                .collectLatest { queryText ->
+                    // Start a new search every time the user types something valid. If the previous
+                    // search is still being processed when the text is changed, it will be
+                    // cancelled
+                    // and this code will run again with the latest query text.
+                    if (isQueryValid) {
+                        searchResults = performSearch(query = queryText)
+                    }
                 }
-            }
         }
 
         fun clearQuery() {
@@ -259,11 +255,7 @@
             if (!viewModel.isQueryValid) {
                 Text("Invalid query", style = TextStyle(color = Color.Red))
             }
-            LazyColumn {
-                items(viewModel.searchResults) {
-                    TODO()
-                }
-            }
+            LazyColumn { items(viewModel.searchResults) { TODO() } }
         }
     }
 }
@@ -320,57 +312,56 @@
 fun BasicTextFieldCustomInputTransformationSample() {
     // Demonstrates how to create a custom and relatively complex InputTransformation.
     val state = remember { TextFieldState() }
-    BasicTextField(state, inputTransformation = {
-        // A filter that always places newly-input text at the start of the string, after a
-        // prompt character, like a shell.
-        val promptChar = '>'
+    BasicTextField(
+        state,
+        inputTransformation = {
+            // A filter that always places newly-input text at the start of the string, after a
+            // prompt character, like a shell.
+            val promptChar = '>'
 
-        fun CharSequence.countPrefix(char: Char): Int {
-            var i = 0
-            while (i < length && get(i) == char) i++
-            return i
-        }
-
-        // Step one: Figure out the insertion point.
-        val newPromptChars = asCharSequence().countPrefix(promptChar)
-        val insertionPoint = if (newPromptChars == 0) 0 else 1
-
-        // Step two: Ensure text is placed at the insertion point.
-        if (changes.changeCount == 1) {
-            val insertedRange = changes.getRange(0)
-            val replacedRange = changes.getOriginalRange(0)
-            if (!replacedRange.collapsed && insertedRange.collapsed) {
-                // Text was deleted, delete forwards from insertion point.
-                delete(insertionPoint, insertionPoint + replacedRange.length)
+            fun CharSequence.countPrefix(char: Char): Int {
+                var i = 0
+                while (i < length && get(i) == char) i++
+                return i
             }
-        }
-        // Else text was replaced or there were multiple changes - don't handle.
 
-        // Step three: Ensure the prompt character is there.
-        if (newPromptChars == 0) {
-            insert(0, ">")
-        }
+            // Step one: Figure out the insertion point.
+            val newPromptChars = asCharSequence().countPrefix(promptChar)
+            val insertionPoint = if (newPromptChars == 0) 0 else 1
 
-        // Step four: Ensure the cursor is ready for the next input.
-        placeCursorAfterCharAt(0)
-    })
+            // Step two: Ensure text is placed at the insertion point.
+            if (changes.changeCount == 1) {
+                val insertedRange = changes.getRange(0)
+                val replacedRange = changes.getOriginalRange(0)
+                if (!replacedRange.collapsed && insertedRange.collapsed) {
+                    // Text was deleted, delete forwards from insertion point.
+                    delete(insertionPoint, insertionPoint + replacedRange.length)
+                }
+            }
+            // Else text was replaced or there were multiple changes - don't handle.
+
+            // Step three: Ensure the prompt character is there.
+            if (newPromptChars == 0) {
+                insert(0, ">")
+            }
+
+            // Step four: Ensure the cursor is ready for the next input.
+            placeCursorAfterCharAt(0)
+        }
+    )
 }
 
 @Sampled
 @Composable
 fun BasicTextFieldOutputTransformationSample() {
     @Stable
-    data class PhoneNumberOutputTransformation(
-        private val pad: Boolean
-    ) : OutputTransformation {
+    data class PhoneNumberOutputTransformation(private val pad: Boolean) : OutputTransformation {
         override fun TextFieldBuffer.transformOutput() {
             if (pad) {
                 // Pad the text with placeholder chars if too short.
                 // (___) ___-____
                 val padCount = 10 - length
-                repeat(padCount) {
-                    append('_')
-                }
+                repeat(padCount) { append('_') }
             }
 
             // (123) 456-7890
@@ -383,9 +374,8 @@
     val state = rememberTextFieldState()
     BasicTextField(
         state,
-        inputTransformation = InputTransformation
-            .maxLength(10)
-            .then {
+        inputTransformation =
+            InputTransformation.maxLength(10).then {
                 if (!TextUtils.isDigitsOnly(asCharSequence())) {
                     revertAllChanges()
                 }
@@ -401,9 +391,10 @@
     BasicTextField(
         state,
         // Convert tabs to spaces.
-        inputTransformation = InputTransformation.byValue { _, proposed ->
-            proposed.replace("""\t""".toRegex(), "  ")
-        }
+        inputTransformation =
+            InputTransformation.byValue { _, proposed ->
+                proposed.replace("""\t""".toRegex(), "  ")
+            }
     )
 }
 
@@ -414,9 +405,10 @@
     BasicTextField(
         state,
         // Reject whitespace.
-        inputTransformation = InputTransformation.byValue { current, proposed ->
-            if ("""\s""".toRegex() in proposed) current else proposed
-        }
+        inputTransformation =
+            InputTransformation.byValue { current, proposed ->
+                if ("""\s""".toRegex() in proposed) current else proposed
+            }
     )
 }
 
@@ -443,12 +435,15 @@
 @Composable
 fun BasicTextFieldChangeIterationSample() {
     // Print a log message every time the text is changed.
-    BasicTextField(state = rememberTextFieldState(), inputTransformation = {
-        changes.forEachChange { sourceRange, replacedLength ->
-            val newString = asCharSequence().substring(sourceRange)
-            println("""$replacedLength characters were replaced with "$newString"""")
+    BasicTextField(
+        state = rememberTextFieldState(),
+        inputTransformation = {
+            changes.forEachChange { sourceRange, replacedLength ->
+                val newString = asCharSequence().substring(sourceRange)
+                println("""$replacedLength characters were replaced with "$newString"""")
+            }
         }
-    })
+    )
 }
 
 @Sampled
@@ -456,17 +451,20 @@
 fun BasicTextFieldChangeReverseIterationSample() {
     // Make a text field behave in "insert mode" – inserted text overwrites the text ahead of it
     // instead of being inserted.
-    BasicTextField(state = rememberTextFieldState(), inputTransformation = {
-        changes.forEachChangeReversed { range, originalRange ->
-            if (!range.collapsed && originalRange.collapsed) {
-                // New text was inserted, delete the text ahead of it.
-                delete(
-                    range.end.coerceAtMost(length),
-                    (range.end + range.length).coerceAtMost(length)
-                )
+    BasicTextField(
+        state = rememberTextFieldState(),
+        inputTransformation = {
+            changes.forEachChangeReversed { range, originalRange ->
+                if (!range.collapsed && originalRange.collapsed) {
+                    // New text was inserted, delete the text ahead of it.
+                    delete(
+                        range.end.coerceAtMost(length),
+                        (range.end + range.length).coerceAtMost(length)
+                    )
+                }
             }
         }
-    })
+    )
 }
 
 @OptIn(FlowPreview::class)
@@ -485,9 +483,7 @@
                 .debounce(500)
                 // collectLatest cancels the previous search if it's still running when there's a
                 // new change.
-                .collectLatest { queryText ->
-                    searchResults = performSearch(query = queryText)
-                }
+                .collectLatest { queryText -> searchResults = performSearch(query = queryText) }
         }
 
         private suspend fun performSearch(query: CharSequence): List<String> {
@@ -499,11 +495,7 @@
     fun SearchScreen(viewModel: SearchViewModel) {
         Column {
             BasicTextField(viewModel.searchFieldState)
-            LazyColumn {
-                items(viewModel.searchResults) {
-                    TODO()
-                }
-            }
+            LazyColumn { items(viewModel.searchResults) { TODO() } }
         }
     }
 }
@@ -539,10 +531,10 @@
 
         BasicTextField(
             state = state,
-            modifier = Modifier
-                .fillMaxWidth()
-                .border(1.dp, Color.LightGray, RoundedCornerShape(6.dp))
-                .padding(8.dp),
+            modifier =
+                Modifier.fillMaxWidth()
+                    .border(1.dp, Color.LightGray, RoundedCornerShape(6.dp))
+                    .padding(8.dp),
             textStyle = TextStyle(fontSize = 16.sp)
         )
     }
@@ -561,8 +553,7 @@
             // `Modifier.clickable` to the Row anymore to bring the text field into focus when user
             // taps on a larger text field area which includes paddings and the icon areas.
             Row(
-                Modifier
-                    .background(Color.LightGray, RoundedCornerShape(percent = 30))
+                Modifier.background(Color.LightGray, RoundedCornerShape(percent = 30))
                     .padding(16.dp)
             ) {
                 Icon(Icons.Default.MailOutline, contentDescription = "Mail Icon")
diff --git a/compose/foundation/foundation/samples/src/main/java/androidx/compose/foundation/samples/BasicTextFieldValueSample.kt b/compose/foundation/foundation/samples/src/main/java/androidx/compose/foundation/samples/BasicTextFieldValueSample.kt
index ae20db1..900b5d9 100644
--- a/compose/foundation/foundation/samples/src/main/java/androidx/compose/foundation/samples/BasicTextFieldValueSample.kt
+++ b/compose/foundation/foundation/samples/src/main/java/androidx/compose/foundation/samples/BasicTextFieldValueSample.kt
@@ -41,10 +41,7 @@
     var text by remember { mutableStateOf("") }
     // A reference implementation that demonstrates how to create a TextField with the legacy
     // state hoisting design around `BasicTextField(TextFieldState)`
-    StringTextField(
-        value = text,
-        onValueChange = { text = it }
-    )
+    StringTextField(value = text, onValueChange = { text = it })
 }
 
 @Composable
@@ -65,29 +62,27 @@
     // This is effectively a rememberUpdatedState, but it combines the updated state (text) with
     // some state that is preserved across updates (selection).
     var valueWithSelection by remember {
-        mutableStateOf(
-            TextFieldValue(
-                text = value,
-                selection = TextRange(value.length)
-            )
-        )
+        mutableStateOf(TextFieldValue(text = value, selection = TextRange(value.length)))
     }
     valueWithSelection = valueWithSelection.copy(text = value)
 
     BasicTextField(
         state = state,
-        modifier = modifier.then(StateSyncingModifier(
-            state = state,
-            value = valueWithSelection,
-            onValueChanged = {
-                // Don't fire the callback if only the selection/cursor changed.
-                if (it.text != valueWithSelection.text) {
-                    onValueChange(it.text)
-                }
-                valueWithSelection = it
-            },
-            writeSelectionFromTextFieldValue = false
-        )),
+        modifier =
+            modifier.then(
+                StateSyncingModifier(
+                    state = state,
+                    value = valueWithSelection,
+                    onValueChanged = {
+                        // Don't fire the callback if only the selection/cursor changed.
+                        if (it.text != valueWithSelection.text) {
+                            onValueChange(it.text)
+                        }
+                        valueWithSelection = it
+                    },
+                    writeSelectionFromTextFieldValue = false
+                )
+            ),
         // other arguments
     )
 }
@@ -98,7 +93,7 @@
  * directly. Effectively a fancy `rememberUpdatedState`.
  *
  * @param writeSelectionFromTextFieldValue If true, [update] will synchronize the selection from the
- * [TextFieldValue] to the [TextFieldState]. The text will be synchronized regardless.
+ *   [TextFieldValue] to the [TextFieldState]. The text will be synchronized regardless.
  */
 @OptIn(ExperimentalFoundationApi::class)
 private class StateSyncingModifier(
@@ -200,11 +195,7 @@
     private fun observeTextState(fireOnValueChanged: Boolean = true) {
         lateinit var value: TextFieldValue
         observeReads {
-            value = TextFieldValue(
-                state.text.toString(),
-                state.selection,
-                state.composition
-            )
+            value = TextFieldValue(state.text.toString(), state.selection, state.composition)
         }
 
         // This code is outside of the observeReads lambda so we don't observe any state reads the
diff --git a/compose/foundation/foundation/samples/src/main/java/androidx/compose/foundation/samples/BorderSamples.kt b/compose/foundation/foundation/samples/src/main/java/androidx/compose/foundation/samples/BorderSamples.kt
index e42bb65..edde5f0 100644
--- a/compose/foundation/foundation/samples/src/main/java/androidx/compose/foundation/samples/BorderSamples.kt
+++ b/compose/foundation/foundation/samples/src/main/java/androidx/compose/foundation/samples/BorderSamples.kt
@@ -43,28 +43,23 @@
 @Composable
 @Sampled
 fun BorderSample() {
-    Text(
-        "Text with  square border",
-        modifier = Modifier
-            .border(4.dp, Color.Magenta)
-            .padding(10.dp)
-    )
+    Text("Text with  square border", modifier = Modifier.border(4.dp, Color.Magenta).padding(10.dp))
 }
 
 @Composable
 @Sampled
 fun BorderSampleWithBrush() {
-    val gradientBrush = Brush.horizontalGradient(
-        colors = listOf(Color.Red, Color.Blue, Color.Green),
-        startX = 0.0f,
-        endX = 500.0f,
-        tileMode = TileMode.Repeated
-    )
+    val gradientBrush =
+        Brush.horizontalGradient(
+            colors = listOf(Color.Red, Color.Blue, Color.Green),
+            startX = 0.0f,
+            endX = 500.0f,
+            tileMode = TileMode.Repeated
+        )
     Text(
         "Text with gradient border",
-        modifier = Modifier
-            .border(width = 2.dp, brush = gradientBrush, shape = CircleShape)
-            .padding(10.dp)
+        modifier =
+            Modifier.border(width = 2.dp, brush = gradientBrush, shape = CircleShape).padding(10.dp)
     )
 }
 
@@ -73,12 +68,9 @@
 fun BorderSampleWithDataClass() {
     Text(
         "Text with gradient border",
-        modifier = Modifier
-            .border(
-                border = BorderStroke(2.dp, Color.Blue),
-                shape = CutCornerShape(8.dp)
-            )
-            .padding(10.dp)
+        modifier =
+            Modifier.border(border = BorderStroke(2.dp, Color.Blue), shape = CutCornerShape(8.dp))
+                .padding(10.dp)
     )
 }
 
@@ -88,24 +80,23 @@
     val widthRange = (1..10)
     var width by remember { mutableStateOf((widthRange.random()).dp) }
 
-    val shapes = remember {
-        listOf(CutCornerShape(8.dp), CircleShape, RoundedCornerShape(20))
-    }
+    val shapes = remember { listOf(CutCornerShape(8.dp), CircleShape, RoundedCornerShape(20)) }
     var selectedShape by remember { mutableStateOf(shapes.random()) }
 
-    val colors = listOf(
-        Color.Black,
-        Color.DarkGray,
-        Color.Gray,
-        Color.LightGray,
-        Color.White,
-        Color.Red,
-        Color.Blue,
-        Color.Green,
-        Color.Yellow,
-        Color.Cyan,
-        Color.Magenta
-    )
+    val colors =
+        listOf(
+            Color.Black,
+            Color.DarkGray,
+            Color.Gray,
+            Color.LightGray,
+            Color.White,
+            Color.Red,
+            Color.Blue,
+            Color.Green,
+            Color.Yellow,
+            Color.Cyan,
+            Color.Magenta
+        )
     var gradientBrush by remember {
         mutableStateOf(
             Brush.horizontalGradient(
@@ -122,53 +113,36 @@
         Row {
             Button(
                 modifier = Modifier.width(60.dp),
-                onClick = {
-
-                    width = (widthRange.random()).dp
-                }
+                onClick = { width = (widthRange.random()).dp }
             ) {
-                Text(
-                    fontSize = 8.sp,
-                    text = "width"
-                )
+                Text(fontSize = 8.sp, text = "width")
             }
             Button(
                 modifier = Modifier.width(60.dp),
                 onClick = {
-                    gradientBrush = Brush.horizontalGradient(
-                        colors = listOf(colors.random(), colors.random(), colors.random()),
-                        startX = 0.0f,
-                        endX = 500.0f,
-                        tileMode = TileMode.Repeated
-                    )
+                    gradientBrush =
+                        Brush.horizontalGradient(
+                            colors = listOf(colors.random(), colors.random(), colors.random()),
+                            startX = 0.0f,
+                            endX = 500.0f,
+                            tileMode = TileMode.Repeated
+                        )
                 }
             ) {
-                Text(
-                    fontSize = 8.sp,
-                    text = "brush"
-                )
+                Text(fontSize = 8.sp, text = "brush")
             }
             Button(
                 modifier = Modifier.width(60.dp),
-                onClick = {
-                    selectedShape = shapes.random()
-                }
+                onClick = { selectedShape = shapes.random() }
             ) {
-                Text(
-                    fontSize = 8.sp,
-                    text = "shape"
-                )
+                Text(fontSize = 8.sp, text = "shape")
             }
         }
         Text(
             "Dynamic border",
-            modifier = Modifier
-                .border(
-                    width = width,
-                    brush = gradientBrush,
-                    shape = selectedShape
-                )
-                .padding(10.dp)
+            modifier =
+                Modifier.border(width = width, brush = gradientBrush, shape = selectedShape)
+                    .padding(10.dp)
         )
     }
 }
diff --git a/compose/foundation/foundation/samples/src/main/java/androidx/compose/foundation/samples/BringIntoViewSamples.kt b/compose/foundation/foundation/samples/src/main/java/androidx/compose/foundation/samples/BringIntoViewSamples.kt
index 49f37aa..111789a 100644
--- a/compose/foundation/foundation/samples/src/main/java/androidx/compose/foundation/samples/BringIntoViewSamples.kt
+++ b/compose/foundation/foundation/samples/src/main/java/androidx/compose/foundation/samples/BringIntoViewSamples.kt
@@ -80,14 +80,12 @@
         val coroutineScope = rememberCoroutineScope()
         Column {
             Box(
-                Modifier
-                    .border(2.dp, Color.Black)
+                Modifier.border(2.dp, Color.Black)
                     .size(500f.toDp())
                     .horizontalScroll(rememberScrollState())
             ) {
                 Canvas(
-                    Modifier
-                        .size(1500f.toDp(), 500f.toDp())
+                    Modifier.size(1500f.toDp(), 500f.toDp())
                         // This associates the RelocationRequester with a Composable that wants
                         // to be brought into view.
                         .bringIntoViewRequester(bringIntoViewRequester)
diff --git a/compose/foundation/foundation/samples/src/main/java/androidx/compose/foundation/samples/CanvasSamples.kt b/compose/foundation/foundation/samples/src/main/java/androidx/compose/foundation/samples/CanvasSamples.kt
index 7d407a1..5ae1886 100644
--- a/compose/foundation/foundation/samples/src/main/java/androidx/compose/foundation/samples/CanvasSamples.kt
+++ b/compose/foundation/foundation/samples/src/main/java/androidx/compose/foundation/samples/CanvasSamples.kt
@@ -51,10 +51,7 @@
         modifier = Modifier.size(300.dp)
     ) {
         // Apples (80%)
-        drawCircle(
-            color = Color.Red,
-            radius = size.width / 2
-        )
+        drawCircle(color = Color.Red, radius = size.width / 2)
 
         // Bananas (20%)
         drawArc(
diff --git a/compose/foundation/foundation/samples/src/main/java/androidx/compose/foundation/samples/ClickableTextSample.kt b/compose/foundation/foundation/samples/src/main/java/androidx/compose/foundation/samples/ClickableTextSample.kt
index 09579e6..faaec78 100644
--- a/compose/foundation/foundation/samples/src/main/java/androidx/compose/foundation/samples/ClickableTextSample.kt
+++ b/compose/foundation/foundation/samples/src/main/java/androidx/compose/foundation/samples/ClickableTextSample.kt
@@ -37,9 +37,7 @@
 fun ClickableText() {
     ClickableText(
         text = AnnotatedString("Click Me"),
-        onClick = { offset ->
-            Log.d("ClickableText", "$offset -th character is clicked.")
-        }
+        onClick = { offset -> Log.d("ClickableText", "$offset -th character is clicked.") }
     )
 }
 
@@ -56,15 +54,16 @@
     onLongClick: (offset: Int) -> Unit
 ) {
     val layoutResult = remember { mutableStateOf<TextLayoutResult?>(null) }
-    val gesture = Modifier.pointerInput(onLongClick) {
-        detectTapGestures(
-            onLongPress = { pos ->
-                layoutResult.value?.let { layout ->
-                    onLongClick(layout.getOffsetForPosition(pos))
+    val gesture =
+        Modifier.pointerInput(onLongClick) {
+            detectTapGestures(
+                onLongPress = { pos ->
+                    layoutResult.value?.let { layout ->
+                        onLongClick(layout.getOffsetForPosition(pos))
+                    }
                 }
-            }
-        )
-    }
+            )
+        }
 
     Text(
         text = text,
diff --git a/compose/foundation/foundation/samples/src/main/java/androidx/compose/foundation/samples/CustomTouchSlopSample.kt b/compose/foundation/foundation/samples/src/main/java/androidx/compose/foundation/samples/CustomTouchSlopSample.kt
index 7da06be..67ddcc4 100644
--- a/compose/foundation/foundation/samples/src/main/java/androidx/compose/foundation/samples/CustomTouchSlopSample.kt
+++ b/compose/foundation/foundation/samples/src/main/java/androidx/compose/foundation/samples/CustomTouchSlopSample.kt
@@ -48,15 +48,10 @@
 }
 
 @Composable
-fun CustomTouchSlopProvider(
-    newTouchSlop: Float,
-    content: @Composable () -> Unit
-) {
+fun CustomTouchSlopProvider(newTouchSlop: Float, content: @Composable () -> Unit) {
     CompositionLocalProvider(
-        LocalViewConfiguration provides CustomTouchSlopAngle(
-            newTouchSlop,
-            LocalViewConfiguration.current
-        )
+        LocalViewConfiguration provides
+            CustomTouchSlopAngle(newTouchSlop, LocalViewConfiguration.current)
     ) {
         content()
     }
diff --git a/compose/foundation/foundation/samples/src/main/java/androidx/compose/foundation/samples/DarkThemeSample.kt b/compose/foundation/foundation/samples/src/main/java/androidx/compose/foundation/samples/DarkThemeSample.kt
index ac765ec..6e4e73b 100644
--- a/compose/foundation/foundation/samples/src/main/java/androidx/compose/foundation/samples/DarkThemeSample.kt
+++ b/compose/foundation/foundation/samples/src/main/java/androidx/compose/foundation/samples/DarkThemeSample.kt
@@ -31,7 +31,5 @@
 fun DarkThemeSample() {
     val dark = isSystemInDarkTheme()
     val color = if (dark) Color.White else Color.Black
-    Box {
-        Box(Modifier.size(50.dp).background(color = color))
-    }
+    Box { Box(Modifier.size(50.dp).background(color = color)) }
 }
diff --git a/compose/foundation/foundation/samples/src/main/java/androidx/compose/foundation/samples/DragAndDropSamples.kt b/compose/foundation/foundation/samples/src/main/java/androidx/compose/foundation/samples/DragAndDropSamples.kt
index c8273ee..d3e1387 100644
--- a/compose/foundation/foundation/samples/src/main/java/androidx/compose/foundation/samples/DragAndDropSamples.kt
+++ b/compose/foundation/foundation/samples/src/main/java/androidx/compose/foundation/samples/DragAndDropSamples.kt
@@ -82,47 +82,26 @@
     var dragAndDropEventSummary by remember { mutableStateOf<String?>(null) }
 
     Column(
-        modifier = Modifier
-            .padding(16.dp)
-            .fillMaxSize(),
+        modifier = Modifier.padding(16.dp).fillMaxSize(),
         horizontalAlignment = Alignment.CenterHorizontally
     ) {
-
-        TextDragAndDropSourceSample(
-            modifier = Modifier
-                .fillMaxWidth()
-        )
+        TextDragAndDropSourceSample(modifier = Modifier.fillMaxWidth())
 
         Spacer(
             modifier = Modifier.height(24.dp),
         )
 
-        Box(
-            modifier = Modifier
-                .fillMaxWidth()
-                .weight(1f)
-        ) {
+        Box(modifier = Modifier.fillMaxWidth().weight(1f)) {
             TextDragAndDropTargetSample(
                 eventSummary = dragAndDropEventSummary,
-                onDragAndDropEventDropped = { event ->
-                    dragAndDropEventSummary = event.summary()
-                }
+                onDragAndDropEventDropped = { event -> dragAndDropEventSummary = event.summary() }
             )
             if (dragAndDropEventSummary != null) {
-                Box(
-                    modifier = Modifier
-                        .align(Alignment.TopEnd)
-                        .padding(16.dp)
-                ) {
+                Box(modifier = Modifier.align(Alignment.TopEnd).padding(16.dp)) {
                     IconButton(
-                        onClick = {
-                            dragAndDropEventSummary = null
-                        },
+                        onClick = { dragAndDropEventSummary = null },
                         content = {
-                            Icon(
-                                imageVector = Icons.Default.Clear,
-                                contentDescription = "Clear"
-                            )
+                            Icon(imageVector = Icons.Default.Clear, contentDescription = "Clear")
                         }
                     )
                 }
@@ -134,37 +113,34 @@
 @OptIn(ExperimentalFoundationApi::class)
 @Sampled
 @Composable
-fun TextDragAndDropSourceSample(
-    modifier: Modifier
-) {
+fun TextDragAndDropSourceSample(modifier: Modifier) {
     val label = remember { "Drag me" }
     Box(
-        modifier = modifier
-            .dragAndDropSource {
-                detectTapGestures(
-                    onLongPress = {
-                        startTransfer(
-                            DragAndDropTransferData(
-                                clipData = ClipData.newPlainText(label, label),
-                                flags = View.DRAG_FLAG_GLOBAL,
+        modifier =
+            modifier
+                .dragAndDropSource {
+                    detectTapGestures(
+                        onLongPress = {
+                            startTransfer(
+                                DragAndDropTransferData(
+                                    clipData = ClipData.newPlainText(label, label),
+                                    flags = View.DRAG_FLAG_GLOBAL,
+                                )
                             )
-                        )
-                    }
+                        }
+                    )
+                }
+                .border(
+                    border =
+                        BorderStroke(
+                            width = 4.dp,
+                            brush = Brush.linearGradient(listOf(Color.Magenta, Color.Magenta))
+                        ),
+                    shape = RoundedCornerShape(16.dp)
                 )
-            }
-            .border(
-                border = BorderStroke(
-                    width = 4.dp,
-                    brush = Brush.linearGradient(listOf(Color.Magenta, Color.Magenta))
-                ),
-                shape = RoundedCornerShape(16.dp)
-            )
-            .padding(24.dp),
+                .padding(24.dp),
     ) {
-        Text(
-            modifier = Modifier.align(Alignment.Center),
-            text = label
-        )
+        Text(modifier = Modifier.align(Alignment.Center), text = label)
     }
 }
 
@@ -186,55 +162,44 @@
     }
     var backgroundColor by remember { mutableStateOf(Color.Transparent) }
     Box(
-        modifier = Modifier
-            .fillMaxSize()
-            .dragAndDropTarget(
-                shouldStartDragAndDrop = accept@{ startEvent ->
-                    val hasValidMimeType = startEvent
-                        .mimeTypes()
-                        .any { eventMimeType ->
-                            validMimeTypePrefixes.any(eventMimeType::startsWith)
-                        }
-                    hasValidMimeType
-                },
-                target = object : DragAndDropTarget {
-                    override fun onStarted(event: DragAndDropEvent) {
-                        backgroundColor = Color.DarkGray.copy(alpha = 0.2f)
-                    }
+        modifier =
+            Modifier.fillMaxSize()
+                .dragAndDropTarget(
+                    shouldStartDragAndDrop = accept@{ startEvent ->
+                            val hasValidMimeType =
+                                startEvent.mimeTypes().any { eventMimeType ->
+                                    validMimeTypePrefixes.any(eventMimeType::startsWith)
+                                }
+                            hasValidMimeType
+                        },
+                    target =
+                        object : DragAndDropTarget {
+                            override fun onStarted(event: DragAndDropEvent) {
+                                backgroundColor = Color.DarkGray.copy(alpha = 0.2f)
+                            }
 
-                    override fun onDrop(event: DragAndDropEvent): Boolean {
-                        onDragAndDropEventDropped(event)
-                        return true
-                    }
+                            override fun onDrop(event: DragAndDropEvent): Boolean {
+                                onDragAndDropEventDropped(event)
+                                return true
+                            }
 
-                    override fun onEnded(event: DragAndDropEvent) {
-                        backgroundColor = Color.Transparent
-                    }
-                },
-            )
-            .background(backgroundColor)
-            .border(
-                width = 4.dp,
-                color = Color.Magenta,
-                shape = RoundedCornerShape(16.dp)
-            ),
+                            override fun onEnded(event: DragAndDropEvent) {
+                                backgroundColor = Color.Transparent
+                            }
+                        },
+                )
+                .background(backgroundColor)
+                .border(width = 4.dp, color = Color.Magenta, shape = RoundedCornerShape(16.dp)),
     ) {
         when (eventSummary) {
-            null -> Text(
-                modifier = Modifier
-                    .align(Alignment.Center),
-                text = "Drop anything here"
-            )
-
-            else -> Text(
-                modifier = Modifier
-                    .padding(
-                        horizontal = 16.dp,
-                        vertical = 24.dp
-                    )
-                    .verticalScroll(rememberScrollState()),
-                text = eventSummary
-            )
+            null -> Text(modifier = Modifier.align(Alignment.Center), text = "Drop anything here")
+            else ->
+                Text(
+                    modifier =
+                        Modifier.padding(horizontal = 16.dp, vertical = 24.dp)
+                            .verticalScroll(rememberScrollState()),
+                    text = eventSummary
+                )
         }
     }
 }
@@ -244,74 +209,59 @@
         .map(toAndroidDragEvent().clipData::getItemAt)
         .withIndex()
         .joinToString(separator = "\n\n") { (index, clipItem) ->
-            val mimeTypes = (0 until toAndroidDragEvent().clipData.description.mimeTypeCount)
-                .joinToString(
+            val mimeTypes =
+                (0 until toAndroidDragEvent().clipData.description.mimeTypeCount).joinToString(
                     separator = ", ",
                     transform = toAndroidDragEvent().clipData.description::getMimeType
                 )
             listOfNotNull(
-                "index: $index",
-                "mimeTypes: $mimeTypes",
-                clipItem.text
-                    ?.takeIf(CharSequence::isNotEmpty)
-                    ?.let {
-                        "text: $it"
+                    "index: $index",
+                    "mimeTypes: $mimeTypes",
+                    clipItem.text?.takeIf(CharSequence::isNotEmpty)?.let { "text: $it" },
+                    clipItem.htmlText?.takeIf(CharSequence::isNotEmpty)?.let { "html text: $it" },
+                    clipItem.uri?.toString()?.let { "uri: $it" },
+                    clipItem.intent?.let {
+                        "intent: action - ${it.action}; extras size: ${it.extras?.size()}"
                     },
-                clipItem.htmlText
-                    ?.takeIf(CharSequence::isNotEmpty)
-                    ?.let {
-                        "html text: $it"
-                    },
-                clipItem.uri?.toString()?.let {
-                    "uri: $it"
-                },
-                clipItem.intent?.let {
-                    "intent: action - ${it.action}; extras size: ${it.extras?.size()}"
-                },
-            ).joinToString(separator = "\n")
+                )
+                .joinToString(separator = "\n")
         }
 
 @Composable
 fun DragAndDropNestedSample() {
-    Column(
-        modifier = Modifier
-            .fillMaxSize()
-    ) {
+    Column(modifier = Modifier.fillMaxSize()) {
         TwoByTwoGrid(
-            modifier = Modifier
-                .padding(16.dp)
-                .weight(1f)
-                .fillMaxWidth()
-                .animatedDragAndDrop(
-                    prefix = "Main",
-                    level = 0,
-                    rowAndColumn = RowAndColumn(
-                        row = 0,
-                        column = 0
-                    )
-                ),
-        ) { outerRowAndColumn ->
-            TwoByTwoGrid(
-                modifier = Modifier
-                    .padding(16.dp)
+            modifier =
+                Modifier.padding(16.dp)
                     .weight(1f)
                     .fillMaxWidth()
                     .animatedDragAndDrop(
-                        prefix = "Outer",
-                        level = 1,
-                        rowAndColumn = outerRowAndColumn,
+                        prefix = "Main",
+                        level = 0,
+                        rowAndColumn = RowAndColumn(row = 0, column = 0)
                     ),
+        ) { outerRowAndColumn ->
+            TwoByTwoGrid(
+                modifier =
+                    Modifier.padding(16.dp)
+                        .weight(1f)
+                        .fillMaxWidth()
+                        .animatedDragAndDrop(
+                            prefix = "Outer",
+                            level = 1,
+                            rowAndColumn = outerRowAndColumn,
+                        ),
             ) { innerRowAndColumn ->
                 Box(
-                    modifier = Modifier
-                        .padding(16.dp)
-                        .weight(1f)
-                        .fillMaxSize()
-                        .animatedDragAndDrop(
-                            prefix = "Inner ",
-                            level = 2,
-                            rowAndColumn = innerRowAndColumn,
-                        ),
+                    modifier =
+                        Modifier.padding(16.dp)
+                            .weight(1f)
+                            .fillMaxSize()
+                            .animatedDragAndDrop(
+                                prefix = "Inner ",
+                                level = 2,
+                                rowAndColumn = innerRowAndColumn,
+                            ),
                 )
             }
         }
@@ -322,37 +272,27 @@
 @Composable
 private fun ColorSwatch() {
     Row(
-        modifier = Modifier
-            .padding(16.dp)
-            .height(56.dp)
-            .fillMaxWidth()
-            .horizontalScroll(rememberScrollState()),
+        modifier =
+            Modifier.padding(16.dp)
+                .height(56.dp)
+                .fillMaxWidth()
+                .horizontalScroll(rememberScrollState()),
         horizontalArrangement = Arrangement.SpaceEvenly,
     ) {
-        Colors.forEach { color ->
-            DragAndDropSourceWithColoredDragShadowSample(color)
-        }
+        Colors.forEach { color -> DragAndDropSourceWithColoredDragShadowSample(color) }
     }
 }
 
 @OptIn(ExperimentalFoundationApi::class)
 @Sampled
 @Composable
-fun DragAndDropSourceWithColoredDragShadowSample(
-    color: Color
-) {
+fun DragAndDropSourceWithColoredDragShadowSample(color: Color) {
     Box(
-        modifier = Modifier
-            .size(56.dp)
-            .background(color = color)
-            .dragAndDropSource(
-                drawDragDecoration = {
-                    drawRect(color)
-                },
+        modifier =
+            Modifier.size(56.dp).background(color = color).dragAndDropSource(
+                drawDragDecoration = { drawRect(color) },
             ) {
-                detectTapGestures(
-                    onLongPress = { startTransfer(color.toDragAndDropTransfer()) }
-                )
+                detectTapGestures(onLongPress = { startTransfer(color.toDragAndDropTransfer()) })
             }
     )
 }
@@ -362,18 +302,10 @@
     modifier: Modifier = Modifier,
     child: @Composable (RowScope.(rowAndColumn: RowAndColumn) -> Unit)
 ) {
-    Column(
-        modifier = modifier
-    ) {
+    Column(modifier = modifier) {
         repeat(2) { column ->
-            Row(
-                modifier = Modifier
-                    .weight(1f)
-                    .fillMaxSize()
-            ) {
-                repeat(2) { row ->
-                    child(RowAndColumn(row, column))
-                }
+            Row(modifier = Modifier.weight(1f).fillMaxSize()) {
+                repeat(2) { row -> child(RowAndColumn(row, column)) }
             }
         }
     }
@@ -385,15 +317,8 @@
     level: Int,
     rowAndColumn: RowAndColumn
 ): Modifier {
-    val state = remember {
-        State(
-            prefix = prefix,
-            level = level,
-            rowAndColumn = rowAndColumn
-        )
-    }
-    return this
-        .stateDragSource(state)
+    val state = remember { State(prefix = prefix, level = level, rowAndColumn = rowAndColumn) }
+    return this.stateDragSource(state)
         .stateDropTarget(state)
         .background(state.animatedColor)
         .rotate(state.animatedRotation)
@@ -401,61 +326,58 @@
 }
 
 @OptIn(ExperimentalFoundationApi::class)
-private fun Modifier.stateDragSource(
-    state: State
-) = dragAndDropSource(
-    drawDragDecoration = {
-        drawRoundRect(state.color)
-    },
-) {
-    detectTapGestures(
-        onLongPress = { startTransfer(state.color.toDragAndDropTransfer()) }
-    )
-}
+private fun Modifier.stateDragSource(state: State) =
+    dragAndDropSource(
+        drawDragDecoration = { drawRoundRect(state.color) },
+    ) {
+        detectTapGestures(onLongPress = { startTransfer(state.color.toDragAndDropTransfer()) })
+    }
 
 @OptIn(ExperimentalFoundationApi::class)
-private fun Modifier.stateDropTarget(
-    state: State
-) = dragAndDropTarget(
-    shouldStartDragAndDrop = { startEvent ->
-        startEvent.mimeTypes().contains(ClipDescription.MIMETYPE_TEXT_INTENT)
-    },
-    target = object : DragAndDropTarget {
-        override fun onStarted(event: DragAndDropEvent) {
-            state.onStarted()
-        }
+private fun Modifier.stateDropTarget(state: State) =
+    dragAndDropTarget(
+        shouldStartDragAndDrop = { startEvent ->
+            startEvent.mimeTypes().contains(ClipDescription.MIMETYPE_TEXT_INTENT)
+        },
+        target =
+            object : DragAndDropTarget {
+                override fun onStarted(event: DragAndDropEvent) {
+                    state.onStarted()
+                }
 
-        override fun onEntered(event: DragAndDropEvent) {
-            state.onEntered()
-            println("Entered ${state.name}")
-        }
+                override fun onEntered(event: DragAndDropEvent) {
+                    state.onEntered()
+                    println("Entered ${state.name}")
+                }
 
-        override fun onMoved(event: DragAndDropEvent) {
-            println("Moved in ${state.name}")
-        }
+                override fun onMoved(event: DragAndDropEvent) {
+                    println("Moved in ${state.name}")
+                }
 
-        override fun onExited(event: DragAndDropEvent) {
-            println("Exited ${state.name}")
-            state.onExited()
-        }
+                override fun onExited(event: DragAndDropEvent) {
+                    println("Exited ${state.name}")
+                    state.onExited()
+                }
 
-        override fun onEnded(event: DragAndDropEvent) {
-            println("Ended in ${state.name}")
-            state.onEnded()
-        }
+                override fun onEnded(event: DragAndDropEvent) {
+                    println("Ended in ${state.name}")
+                    state.onEnded()
+                }
 
-        override fun onDrop(event: DragAndDropEvent): Boolean {
-            println("Dropped items in ${state.name}")
-            return when (val transferredColor = event.toAndroidDragEvent().clipData.color()) {
-                null -> false
-                else -> {
-                    state.onDropped(transferredColor)
-                    true
+                override fun onDrop(event: DragAndDropEvent): Boolean {
+                    println("Dropped items in ${state.name}")
+                    return when (
+                        val transferredColor = event.toAndroidDragEvent().clipData.color()
+                    ) {
+                        null -> false
+                        else -> {
+                            state.onDropped(transferredColor)
+                            true
+                        }
+                    }
                 }
             }
-        }
-    }
-)
+    )
 
 @Stable
 private class State(
@@ -495,106 +417,93 @@
 }
 
 private val State.name
-    get() = with(rowAndColumn) {
-        "$prefix${Letters.circularGet(row)}, ${Numbers.circularGet(column)}"
-    }
+    get() =
+        with(rowAndColumn) { "$prefix${Letters.circularGet(row)}, ${Numbers.circularGet(column)}" }
 private val State.startColor
-    get() = when (level % 2) {
-        0 -> Colors.drop(Colors.size / 2)
-        else -> Colors.take(Colors.size / 2)
-    }.circularGet(colorIndex + level)
+    get() =
+        when (level % 2) {
+            0 -> Colors.drop(Colors.size / 2)
+            else -> Colors.take(Colors.size / 2)
+        }.circularGet(colorIndex + level)
 
 private val State.colorIndex
-    get() = with(rowAndColumn) {
-        (row * 2) + column
-    }
+    get() = with(rowAndColumn) { (row * 2) + column }
 
 private val State.animatedColor: Color
     @Composable
-    get() = rememberInfiniteTransition(
-        label = "color"
-    ).animateColor(
-        initialValue = color,
-        targetValue = if (isInside) Color.DarkGray else color,
-        animationSpec = infiniteRepeatable(
-            animation = tween(400),
-            repeatMode = RepeatMode.Reverse
-        ),
-        label = "background color"
-    ).value
+    get() =
+        rememberInfiniteTransition(label = "color")
+            .animateColor(
+                initialValue = color,
+                targetValue = if (isInside) Color.DarkGray else color,
+                animationSpec =
+                    infiniteRepeatable(animation = tween(400), repeatMode = RepeatMode.Reverse),
+                label = "background color"
+            )
+            .value
 
 private val State.animatedRotation: Float
     @Composable
-    get() = rememberInfiniteTransition(
-        label = "rotation"
-    ).animateFloat(
-        initialValue = if (isInDnD) -0.2f else 0f,
-        targetValue = if (isInDnD) 0.2f else 0f,
-        animationSpec = infiniteRepeatable(
-            animation = jiggleSpec(),
-            repeatMode = RepeatMode.Reverse
-        ),
-        label = "rotation"
-    ).value
+    get() =
+        rememberInfiniteTransition(label = "rotation")
+            .animateFloat(
+                initialValue = if (isInDnD) -0.2f else 0f,
+                targetValue = if (isInDnD) 0.2f else 0f,
+                animationSpec =
+                    infiniteRepeatable(animation = jiggleSpec(), repeatMode = RepeatMode.Reverse),
+                label = "rotation"
+            )
+            .value
 
 private val State.animatedTranslation: Dp
     @Composable
-    get() = rememberInfiniteTransition(
-        label = "translation"
-    ).animateFloat(
-        initialValue = if (isInDnD) -0.02f else 0f,
-        targetValue = if (isInDnD) 0.02f else 0f,
-        animationSpec = infiniteRepeatable(
-            animation = jiggleSpec(),
-            repeatMode = RepeatMode.Reverse
-        ),
-        label = "translation"
-    ).value.dp
+    get() =
+        rememberInfiniteTransition(label = "translation")
+            .animateFloat(
+                initialValue = if (isInDnD) -0.02f else 0f,
+                targetValue = if (isInDnD) 0.02f else 0f,
+                animationSpec =
+                    infiniteRepeatable(animation = jiggleSpec(), repeatMode = RepeatMode.Reverse),
+                label = "translation"
+            )
+            .value
+            .dp
 
 private fun jiggleSpec(): DurationBasedAnimationSpec<Float> =
     tween(durationMillis = 70 + (Random.nextInt(30)))
 
-private data class RowAndColumn(
-    val row: Int,
-    val column: Int
-)
+private data class RowAndColumn(val row: Int, val column: Int)
 
-private fun Color.toDragAndDropTransfer() = DragAndDropTransferData(
-    clipData = ClipData.newIntent(
-        "color transfer",
-        colorDragAndDropTransferIntent(this)
+private fun Color.toDragAndDropTransfer() =
+    DragAndDropTransferData(
+        clipData = ClipData.newIntent("color transfer", colorDragAndDropTransferIntent(this))
     )
-)
 
 private fun ClipData.color() =
-    (0 until itemCount)
-        .map(::getItemAt)
-        .firstNotNullOfOrNull { item ->
-            item?.intent
-                ?.getIntExtra(ColorTransferData, -1)
-                ?.takeIf { it != -1 }
-                ?.let(::Color)
-        }
+    (0 until itemCount).map(::getItemAt).firstNotNullOfOrNull { item ->
+        item?.intent?.getIntExtra(ColorTransferData, -1)?.takeIf { it != -1 }?.let(::Color)
+    }
 
-private fun colorDragAndDropTransferIntent(color: Color) = Intent(ColorTransferAction).apply {
-    putExtra(ColorTransferData, color.toArgb())
-}
+private fun colorDragAndDropTransferIntent(color: Color) =
+    Intent(ColorTransferAction).apply { putExtra(ColorTransferData, color.toArgb()) }
 
 private const val ColorTransferAction = "action.color.transfer"
 private const val ColorTransferData = "data.color.transfer"
 
 private fun <T> List<T>.circularGet(index: Int) = get(index % size)
+
 private val Letters = ('A'..'Z').toList()
 private val Numbers = ('1'..'9').toList()
 
-private val Colors = listOf(
-    Color(0xFF2980b9), // Belize Hole
-    Color(0xFF2c3e50), // Midnight Blue
-    Color(0xFFc0392b), // Pomegranate
-    Color(0xFF16a085), // Green Sea
-    Color(0xFF7f8c8d), // Concrete
-    Color(0xFFC6973B), // Mustard
-    Color(0xFFF6CAB7), // Blush
-    Color(0xFF6D4336), // Brown
-    Color(0xFF814063), // Plum
-)
+private val Colors =
+    listOf(
+        Color(0xFF2980b9), // Belize Hole
+        Color(0xFF2c3e50), // Midnight Blue
+        Color(0xFFc0392b), // Pomegranate
+        Color(0xFF16a085), // Green Sea
+        Color(0xFF7f8c8d), // Concrete
+        Color(0xFFC6973B), // Mustard
+        Color(0xFFF6CAB7), // Blush
+        Color(0xFF6D4336), // Brown
+        Color(0xFF814063), // Plum
+    )
diff --git a/compose/foundation/foundation/samples/src/main/java/androidx/compose/foundation/samples/DragGestureDetectorSamples.kt b/compose/foundation/foundation/samples/src/main/java/androidx/compose/foundation/samples/DragGestureDetectorSamples.kt
index d08b4cf..836a404 100644
--- a/compose/foundation/foundation/samples/src/main/java/androidx/compose/foundation/samples/DragGestureDetectorSamples.kt
+++ b/compose/foundation/foundation/samples/src/main/java/androidx/compose/foundation/samples/DragGestureDetectorSamples.kt
@@ -64,10 +64,7 @@
     val offsetX = remember { mutableStateOf(0f) }
     val offsetY = remember { mutableStateOf(0f) }
     var width by remember { mutableStateOf(0f) }
-    Box(
-        Modifier.fillMaxSize()
-            .onSizeChanged { width = it.width.toFloat() }
-    ) {
+    Box(Modifier.fillMaxSize().onSizeChanged { width = it.width.toFloat() }) {
         Box(
             Modifier.offset { IntOffset(offsetX.value.roundToInt(), offsetY.value.roundToInt()) }
                 .fillMaxHeight()
@@ -79,8 +76,7 @@
                         var change =
                             awaitHorizontalTouchSlopOrCancellation(down.id) { change, over ->
                                 val originalX = offsetX.value
-                                val newValue =
-                                    (originalX + over).coerceIn(0f, width - 50.dp.toPx())
+                                val newValue = (originalX + over).coerceIn(0f, width - 50.dp.toPx())
                                 change.consume()
                                 offsetX.value = newValue
                             }
@@ -88,8 +84,11 @@
                             change = awaitHorizontalDragOrCancellation(change.id)
                             if (change != null && change.pressed) {
                                 val originalX = offsetX.value
-                                val newValue = (originalX + change.positionChange().x)
-                                    .coerceIn(0f, width - 50.dp.toPx())
+                                val newValue =
+                                    (originalX + change.positionChange().x).coerceIn(
+                                        0f,
+                                        width - 50.dp.toPx()
+                                    )
                                 change.consume()
                                 offsetX.value = newValue
                             }
@@ -106,10 +105,7 @@
     val offsetX = remember { mutableStateOf(0f) }
     val offsetY = remember { mutableStateOf(0f) }
     var width by remember { mutableStateOf(0f) }
-    Box(
-        Modifier.fillMaxSize()
-            .onSizeChanged { width = it.width.toFloat() }
-    ) {
+    Box(Modifier.fillMaxSize().onSizeChanged { width = it.width.toFloat() }) {
         Box(
             Modifier.offset { IntOffset(offsetX.value.roundToInt(), offsetY.value.roundToInt()) }
                 .fillMaxHeight()
@@ -121,16 +117,18 @@
                         val change =
                             awaitHorizontalTouchSlopOrCancellation(down.id) { change, over ->
                                 val originalX = offsetX.value
-                                val newValue =
-                                    (originalX + over).coerceIn(0f, width - 50.dp.toPx())
+                                val newValue = (originalX + over).coerceIn(0f, width - 50.dp.toPx())
                                 change.consume()
                                 offsetX.value = newValue
                             }
                         if (change != null) {
                             horizontalDrag(change.id) {
                                 val originalX = offsetX.value
-                                val newValue = (originalX + it.positionChange().x)
-                                    .coerceIn(0f, width - 50.dp.toPx())
+                                val newValue =
+                                    (originalX + it.positionChange().x).coerceIn(
+                                        0f,
+                                        width - 50.dp.toPx()
+                                    )
                                 it.consume()
                                 offsetX.value = newValue
                             }
@@ -147,10 +145,7 @@
     val offsetX = remember { mutableStateOf(0f) }
     val offsetY = remember { mutableStateOf(0f) }
     var width by remember { mutableStateOf(0f) }
-    Box(
-        Modifier.fillMaxSize()
-            .onSizeChanged { width = it.width.toFloat() }
-    ) {
+    Box(Modifier.fillMaxSize().onSizeChanged { width = it.width.toFloat() }) {
         Box(
             Modifier.offset { IntOffset(offsetX.value.roundToInt(), offsetY.value.roundToInt()) }
                 .fillMaxHeight()
@@ -173,10 +168,7 @@
     val offsetX = remember { mutableStateOf(0f) }
     val offsetY = remember { mutableStateOf(0f) }
     var height by remember { mutableStateOf(0f) }
-    Box(
-        Modifier.fillMaxSize()
-            .onSizeChanged { height = it.height.toFloat() }
-    ) {
+    Box(Modifier.fillMaxSize().onSizeChanged { height = it.height.toFloat() }) {
         Box(
             Modifier.offset { IntOffset(offsetX.value.roundToInt(), offsetY.value.roundToInt()) }
                 .fillMaxWidth()
@@ -188,8 +180,8 @@
                         var change =
                             awaitVerticalTouchSlopOrCancellation(down.id) { change, over ->
                                 val originalY = offsetY.value
-                                val newValue = (originalY + over)
-                                    .coerceIn(0f, height - 50.dp.toPx())
+                                val newValue =
+                                    (originalY + over).coerceIn(0f, height - 50.dp.toPx())
                                 change.consume()
                                 offsetY.value = newValue
                             }
@@ -197,8 +189,11 @@
                             change = awaitVerticalDragOrCancellation(change.id)
                             if (change != null && change.pressed) {
                                 val originalY = offsetY.value
-                                val newValue = (originalY + change.positionChange().y)
-                                    .coerceIn(0f, height - 50.dp.toPx())
+                                val newValue =
+                                    (originalY + change.positionChange().y).coerceIn(
+                                        0f,
+                                        height - 50.dp.toPx()
+                                    )
                                 change.consume()
                                 offsetY.value = newValue
                             }
@@ -215,10 +210,7 @@
     val offsetX = remember { mutableStateOf(0f) }
     val offsetY = remember { mutableStateOf(0f) }
     var height by remember { mutableStateOf(0f) }
-    Box(
-        Modifier.fillMaxSize()
-            .onSizeChanged { height = it.height.toFloat() }
-    ) {
+    Box(Modifier.fillMaxSize().onSizeChanged { height = it.height.toFloat() }) {
         Box(
             Modifier.offset { IntOffset(offsetX.value.roundToInt(), offsetY.value.roundToInt()) }
                 .fillMaxWidth()
@@ -230,16 +222,19 @@
                         val change =
                             awaitVerticalTouchSlopOrCancellation(down.id) { change, over ->
                                 val originalY = offsetY.value
-                                val newValue = (originalY + over)
-                                    .coerceIn(0f, height - 50.dp.toPx())
+                                val newValue =
+                                    (originalY + over).coerceIn(0f, height - 50.dp.toPx())
                                 change.consume()
                                 offsetY.value = newValue
                             }
                         if (change != null) {
                             verticalDrag(change.id) {
                                 val originalY = offsetY.value
-                                val newValue = (originalY + it.positionChange().y)
-                                    .coerceIn(0f, height - 50.dp.toPx())
+                                val newValue =
+                                    (originalY + it.positionChange().y).coerceIn(
+                                        0f,
+                                        height - 50.dp.toPx()
+                                    )
                                 it.consume()
                                 offsetY.value = newValue
                             }
@@ -256,10 +251,7 @@
     val offsetX = remember { mutableStateOf(0f) }
     val offsetY = remember { mutableStateOf(0f) }
     var height by remember { mutableStateOf(0f) }
-    Box(
-        Modifier.fillMaxSize()
-            .onSizeChanged { height = it.height.toFloat() }
-    ) {
+    Box(Modifier.fillMaxSize().onSizeChanged { height = it.height.toFloat() }) {
         Box(
             Modifier.offset { IntOffset(offsetX.value.roundToInt(), offsetY.value.roundToInt()) }
                 .fillMaxWidth()
@@ -282,10 +274,7 @@
     val offsetX = remember { mutableStateOf(0f) }
     val offsetY = remember { mutableStateOf(0f) }
     var size by remember { mutableStateOf(Size.Zero) }
-    Box(
-        Modifier.fillMaxSize()
-            .onSizeChanged { size = it.toSize() }
-    ) {
+    Box(Modifier.fillMaxSize().onSizeChanged { size = it.toSize() }) {
         Box(
             Modifier.offset { IntOffset(offsetX.value.roundToInt(), offsetY.value.roundToInt()) }
                 .size(50.dp)
@@ -293,26 +282,29 @@
                 .pointerInput(Unit) {
                     awaitEachGesture {
                         val down = awaitFirstDown()
-                        var change = awaitTouchSlopOrCancellation(down.id) { change, over ->
-                            val original = Offset(offsetX.value, offsetY.value)
-                            val summed = original + over
-                            val newValue = Offset(
-                                x = summed.x.coerceIn(0f, size.width - 50.dp.toPx()),
-                                y = summed.y.coerceIn(0f, size.height - 50.dp.toPx())
-                            )
-                            change.consume()
-                            offsetX.value = newValue.x
-                            offsetY.value = newValue.y
-                        }
+                        var change =
+                            awaitTouchSlopOrCancellation(down.id) { change, over ->
+                                val original = Offset(offsetX.value, offsetY.value)
+                                val summed = original + over
+                                val newValue =
+                                    Offset(
+                                        x = summed.x.coerceIn(0f, size.width - 50.dp.toPx()),
+                                        y = summed.y.coerceIn(0f, size.height - 50.dp.toPx())
+                                    )
+                                change.consume()
+                                offsetX.value = newValue.x
+                                offsetY.value = newValue.y
+                            }
                         while (change != null && change.pressed) {
                             change = awaitDragOrCancellation(change.id)
                             if (change != null && change.pressed) {
                                 val original = Offset(offsetX.value, offsetY.value)
                                 val summed = original + change.positionChange()
-                                val newValue = Offset(
-                                    x = summed.x.coerceIn(0f, size.width - 50.dp.toPx()),
-                                    y = summed.y.coerceIn(0f, size.height - 50.dp.toPx())
-                                )
+                                val newValue =
+                                    Offset(
+                                        x = summed.x.coerceIn(0f, size.width - 50.dp.toPx()),
+                                        y = summed.y.coerceIn(0f, size.height - 50.dp.toPx())
+                                    )
                                 change.consume()
                                 offsetX.value = newValue.x
                                 offsetY.value = newValue.y
@@ -330,10 +322,7 @@
     val offsetX = remember { mutableStateOf(0f) }
     val offsetY = remember { mutableStateOf(0f) }
     var size by remember { mutableStateOf(Size.Zero) }
-    Box(
-        Modifier.fillMaxSize()
-            .onSizeChanged { size = it.toSize() }
-    ) {
+    Box(Modifier.fillMaxSize().onSizeChanged { size = it.toSize() }) {
         Box(
             Modifier.offset { IntOffset(offsetX.value.roundToInt(), offsetY.value.roundToInt()) }
                 .size(50.dp)
@@ -341,25 +330,28 @@
                 .pointerInput(Unit) {
                     awaitEachGesture {
                         val down = awaitFirstDown()
-                        val change = awaitTouchSlopOrCancellation(down.id) { change, over ->
-                            val original = Offset(offsetX.value, offsetY.value)
-                            val summed = original + over
-                            val newValue = Offset(
-                                x = summed.x.coerceIn(0f, size.width - 50.dp.toPx()),
-                                y = summed.y.coerceIn(0f, size.height - 50.dp.toPx())
-                            )
-                            change.consume()
-                            offsetX.value = newValue.x
-                            offsetY.value = newValue.y
-                        }
+                        val change =
+                            awaitTouchSlopOrCancellation(down.id) { change, over ->
+                                val original = Offset(offsetX.value, offsetY.value)
+                                val summed = original + over
+                                val newValue =
+                                    Offset(
+                                        x = summed.x.coerceIn(0f, size.width - 50.dp.toPx()),
+                                        y = summed.y.coerceIn(0f, size.height - 50.dp.toPx())
+                                    )
+                                change.consume()
+                                offsetX.value = newValue.x
+                                offsetY.value = newValue.y
+                            }
                         if (change != null) {
                             drag(change.id) {
                                 val original = Offset(offsetX.value, offsetY.value)
                                 val summed = original + it.positionChange()
-                                val newValue = Offset(
-                                    x = summed.x.coerceIn(0f, size.width - 50.dp.toPx()),
-                                    y = summed.y.coerceIn(0f, size.height - 50.dp.toPx())
-                                )
+                                val newValue =
+                                    Offset(
+                                        x = summed.x.coerceIn(0f, size.width - 50.dp.toPx()),
+                                        y = summed.y.coerceIn(0f, size.height - 50.dp.toPx())
+                                    )
                                 it.consume()
                                 offsetX.value = newValue.x
                                 offsetY.value = newValue.y
@@ -377,10 +369,7 @@
     val offsetX = remember { mutableStateOf(0f) }
     val offsetY = remember { mutableStateOf(0f) }
     var size by remember { mutableStateOf(Size.Zero) }
-    Box(
-        Modifier.fillMaxSize()
-            .onSizeChanged { size = it.toSize() }
-    ) {
+    Box(Modifier.fillMaxSize().onSizeChanged { size = it.toSize() }) {
         Box(
             Modifier.offset { IntOffset(offsetX.value.roundToInt(), offsetY.value.roundToInt()) }
                 .size(50.dp)
@@ -389,10 +378,11 @@
                     detectDragGestures { _, dragAmount ->
                         val original = Offset(offsetX.value, offsetY.value)
                         val summed = original + dragAmount
-                        val newValue = Offset(
-                            x = summed.x.coerceIn(0f, size.width - 50.dp.toPx()),
-                            y = summed.y.coerceIn(0f, size.height - 50.dp.toPx())
-                        )
+                        val newValue =
+                            Offset(
+                                x = summed.x.coerceIn(0f, size.width - 50.dp.toPx()),
+                                y = summed.y.coerceIn(0f, size.height - 50.dp.toPx())
+                            )
                         offsetX.value = newValue.x
                         offsetY.value = newValue.y
                     }
@@ -407,10 +397,7 @@
     val offsetX = remember { mutableStateOf(0f) }
     val offsetY = remember { mutableStateOf(0f) }
     var size by remember { mutableStateOf(Size.Zero) }
-    Box(
-        Modifier.fillMaxSize()
-            .onSizeChanged { size = it.toSize() }
-    ) {
+    Box(Modifier.fillMaxSize().onSizeChanged { size = it.toSize() }) {
         Box(
             Modifier.offset { IntOffset(offsetX.value.roundToInt(), offsetY.value.roundToInt()) }
                 .size(50.dp)
@@ -419,10 +406,11 @@
                     detectDragGesturesAfterLongPress { _, dragAmount ->
                         val original = Offset(offsetX.value, offsetY.value)
                         val summed = original + dragAmount
-                        val newValue = Offset(
-                            x = summed.x.coerceIn(0f, size.width - 50.dp.toPx()),
-                            y = summed.y.coerceIn(0f, size.height - 50.dp.toPx())
-                        )
+                        val newValue =
+                            Offset(
+                                x = summed.x.coerceIn(0f, size.width - 50.dp.toPx()),
+                                y = summed.y.coerceIn(0f, size.height - 50.dp.toPx())
+                            )
                         offsetX.value = newValue.x
                         offsetY.value = newValue.y
                     }
diff --git a/compose/foundation/foundation/samples/src/main/java/androidx/compose/foundation/samples/Draggable2DSamples.kt b/compose/foundation/foundation/samples/src/main/java/androidx/compose/foundation/samples/Draggable2DSamples.kt
index bfc11d3..b70018b 100644
--- a/compose/foundation/foundation/samples/src/main/java/androidx/compose/foundation/samples/Draggable2DSamples.kt
+++ b/compose/foundation/foundation/samples/src/main/java/androidx/compose/foundation/samples/Draggable2DSamples.kt
@@ -50,26 +50,23 @@
     var offsetPositionY by remember { mutableStateOf(0f) }
 
     Box(
-        modifier = Modifier
-            .width(max)
-            .height(max)
-            .draggable2D(
-                state = rememberDraggable2DState { delta ->
-                    val newValueX = offsetPositionX + delta.x
-                    val newValueY = offsetPositionY + delta.y
-                    offsetPositionX = newValueX.coerceIn(minPx, maxPx)
-                    offsetPositionY = newValueY.coerceIn(minPx, maxPx)
-                }
-            )
-            .background(Color.LightGray)
+        modifier =
+            Modifier.width(max)
+                .height(max)
+                .draggable2D(
+                    state =
+                        rememberDraggable2DState { delta ->
+                            val newValueX = offsetPositionX + delta.x
+                            val newValueY = offsetPositionY + delta.y
+                            offsetPositionX = newValueX.coerceIn(minPx, maxPx)
+                            offsetPositionY = newValueY.coerceIn(minPx, maxPx)
+                        }
+                )
+                .background(Color.LightGray)
     ) {
         Box(
-            Modifier
-                .offset {
-                    IntOffset(
-                        offsetPositionX.roundToInt(),
-                        offsetPositionY.roundToInt()
-                    )
+            Modifier.offset {
+                    IntOffset(offsetPositionX.roundToInt(), offsetPositionY.roundToInt())
                 }
                 .size(50.dp)
                 .background(Color.Red)
diff --git a/compose/foundation/foundation/samples/src/main/java/androidx/compose/foundation/samples/DraggableSamples.kt b/compose/foundation/foundation/samples/src/main/java/androidx/compose/foundation/samples/DraggableSamples.kt
index 2272be5..2c119c9 100644
--- a/compose/foundation/foundation/samples/src/main/java/androidx/compose/foundation/samples/DraggableSamples.kt
+++ b/compose/foundation/foundation/samples/src/main/java/androidx/compose/foundation/samples/DraggableSamples.kt
@@ -48,16 +48,17 @@
 
     // seekbar itself
     Box(
-        modifier = Modifier
-            .width(max)
-            .draggable(
-                orientation = Orientation.Horizontal,
-                state = rememberDraggableState { delta ->
-                    val newValue = offsetPosition.value + delta
-                    offsetPosition.value = newValue.coerceIn(minPx, maxPx)
-                }
-            )
-            .background(Color.Black)
+        modifier =
+            Modifier.width(max)
+                .draggable(
+                    orientation = Orientation.Horizontal,
+                    state =
+                        rememberDraggableState { delta ->
+                            val newValue = offsetPosition.value + delta
+                            offsetPosition.value = newValue.coerceIn(minPx, maxPx)
+                        }
+                )
+                .background(Color.Black)
     ) {
         Box(
             Modifier.offset { IntOffset(offsetPosition.value.roundToInt(), 0) }
diff --git a/compose/foundation/foundation/samples/src/main/java/androidx/compose/foundation/samples/DrawBackgroundSamples.kt b/compose/foundation/foundation/samples/src/main/java/androidx/compose/foundation/samples/DrawBackgroundSamples.kt
index 8e0b290..76ea32c 100644
--- a/compose/foundation/foundation/samples/src/main/java/androidx/compose/foundation/samples/DrawBackgroundSamples.kt
+++ b/compose/foundation/foundation/samples/src/main/java/androidx/compose/foundation/samples/DrawBackgroundSamples.kt
@@ -30,23 +30,20 @@
 @Composable
 @Sampled
 fun DrawBackgroundColor() {
-    Text(
-        "Text with background",
-        Modifier.background(color = Color.Magenta).padding(10.dp)
-    )
+    Text("Text with background", Modifier.background(color = Color.Magenta).padding(10.dp))
 }
 
 @Composable
 @Sampled
 fun DrawBackgroundShapedBrush() {
-    val gradientBrush = Brush.horizontalGradient(
-        colors = listOf(Color.Red, Color.Blue, Color.Green),
-        startX = 0.0f,
-        endX = 500.0f
-    )
+    val gradientBrush =
+        Brush.horizontalGradient(
+            colors = listOf(Color.Red, Color.Blue, Color.Green),
+            startX = 0.0f,
+            endX = 500.0f
+        )
     Text(
         "Text with gradient back",
-        Modifier.background(brush = gradientBrush, shape = CutCornerShape(8.dp))
-            .padding(10.dp)
+        Modifier.background(brush = gradientBrush, shape = CutCornerShape(8.dp)).padding(10.dp)
     )
 }
diff --git a/compose/foundation/foundation/samples/src/main/java/androidx/compose/foundation/samples/FocusableSample.kt b/compose/foundation/foundation/samples/src/main/java/androidx/compose/foundation/samples/FocusableSample.kt
index 11a3089..0b2eeea 100644
--- a/compose/foundation/foundation/samples/src/main/java/androidx/compose/foundation/samples/FocusableSample.kt
+++ b/compose/foundation/foundation/samples/src/main/java/androidx/compose/foundation/samples/FocusableSample.kt
@@ -46,19 +46,21 @@
 
     // text below will change when we focus it via button click
     val isFocused = interactionSource.collectIsFocusedAsState().value
-    val text = if (isFocused) {
-        "Focused! tap anywhere to free the focus"
-    } else {
-        "Bring focus to me by tapping the button below!"
-    }
+    val text =
+        if (isFocused) {
+            "Focused! tap anywhere to free the focus"
+        } else {
+            "Bring focus to me by tapping the button below!"
+        }
     Column {
         // this Text will change it's text parameter depending on the presence of a focus
         Text(
             text = text,
-            modifier = Modifier
-                // add focusRequester modifier before the focusable (or even in the parent)
-                .focusRequester(focusRequester)
-                .focusable(interactionSource = interactionSource)
+            modifier =
+                Modifier
+                    // add focusRequester modifier before the focusable (or even in the parent)
+                    .focusRequester(focusRequester)
+                    .focusable(interactionSource = interactionSource)
         )
         Button(onClick = { focusRequester.requestFocus() }) {
             Text("Bring focus to the text above")
@@ -88,14 +90,9 @@
 fun FocusableFocusGroupSample() {
     val interactionSource = remember { MutableInteractionSource() }
     LazyRow(
-        Modifier
-            .focusable(interactionSource = interactionSource)
+        Modifier.focusable(interactionSource = interactionSource)
             .border(1.dp, if (interactionSource.collectIsFocusedAsState().value) Red else Black)
     ) {
-        repeat(10) {
-            item {
-                Button({}) { Text("Button$it") }
-            }
-        }
+        repeat(10) { item { Button({}) { Text("Button$it") } } }
     }
 }
diff --git a/compose/foundation/foundation/samples/src/main/java/androidx/compose/foundation/samples/HandwritingDetectorSample.kt b/compose/foundation/foundation/samples/src/main/java/androidx/compose/foundation/samples/HandwritingDetectorSample.kt
index 1b329ff..c4365b9 100644
--- a/compose/foundation/foundation/samples/src/main/java/androidx/compose/foundation/samples/HandwritingDetectorSample.kt
+++ b/compose/foundation/foundation/samples/src/main/java/androidx/compose/foundation/samples/HandwritingDetectorSample.kt
@@ -61,10 +61,7 @@
     val focusRequester = remember { FocusRequester() }
 
     Column(
-        Modifier
-            .imePadding()
-            .requiredWidth(300.dp)
-            .verticalScroll(rememberScrollState()),
+        Modifier.imePadding().requiredWidth(300.dp).verticalScroll(rememberScrollState()),
         verticalArrangement = Arrangement.Center,
         horizontalAlignment = Alignment.CenterHorizontally
     ) {
@@ -73,9 +70,9 @@
                 "a stylus to write here."
         )
         Spacer(Modifier.size(16.dp))
-        Text("Fake text field",
-            Modifier
-                .fillMaxWidth()
+        Text(
+            "Fake text field",
+            Modifier.fillMaxWidth()
                 .handwritingDetector { openDialog = !openDialog }
                 .padding(4.dp)
                 .border(
@@ -84,14 +81,13 @@
                     RoundedCornerShape(4.dp)
                 )
                 .padding(16.dp),
-            color = MaterialTheme.colors.onSurface.copy(alpha = ContentAlpha.medium))
+            color = MaterialTheme.colors.onSurface.copy(alpha = ContentAlpha.medium)
+        )
     }
 
     if (openDialog) {
         Dialog(onDismissRequest = { openDialog = false }) {
-            Card(
-                modifier = Modifier.width(300.dp), shape = RoundedCornerShape(16.dp)
-            ) {
+            Card(modifier = Modifier.width(300.dp), shape = RoundedCornerShape(16.dp)) {
                 Column(
                     modifier = Modifier.padding(24.dp),
                     verticalArrangement = Arrangement.Center,
@@ -102,14 +98,13 @@
                     val state = remember { TextFieldState() }
                     BasicTextField(
                         state = state,
-                        modifier = Modifier
-                            .fillMaxWidth()
-                            .focusRequester(focusRequester)
-                            .handwritingHandler(),
+                        modifier =
+                            Modifier.fillMaxWidth()
+                                .focusRequester(focusRequester)
+                                .handwritingHandler(),
                         decorator = { innerTextField ->
                             Box(
-                                Modifier
-                                    .padding(4.dp)
+                                Modifier.padding(4.dp)
                                     .border(
                                         1.dp,
                                         MaterialTheme.colors.onSurface,
@@ -126,11 +121,12 @@
 
             val windowInfo = LocalWindowInfo.current
             LaunchedEffect(windowInfo) {
-                snapshotFlow { windowInfo.isWindowFocused }.collect { isWindowFocused ->
-                    if (isWindowFocused) {
-                        focusRequester.requestFocus()
+                snapshotFlow { windowInfo.isWindowFocused }
+                    .collect { isWindowFocused ->
+                        if (isWindowFocused) {
+                            focusRequester.requestFocus()
+                        }
                     }
-                }
             }
         }
     }
diff --git a/compose/foundation/foundation/samples/src/main/java/androidx/compose/foundation/samples/HoverableSample.kt b/compose/foundation/foundation/samples/src/main/java/androidx/compose/foundation/samples/HoverableSample.kt
index 1b12eeb..a936a40 100644
--- a/compose/foundation/foundation/samples/src/main/java/androidx/compose/foundation/samples/HoverableSample.kt
+++ b/compose/foundation/foundation/samples/src/main/java/androidx/compose/foundation/samples/HoverableSample.kt
@@ -41,10 +41,10 @@
 
     // the color will change depending on the presence of a hover
     Box(
-        modifier = Modifier
-            .size(128.dp)
-            .background(if (isHovered) Color.Red else Color.Blue)
-            .hoverable(interactionSource = interactionSource),
+        modifier =
+            Modifier.size(128.dp)
+                .background(if (isHovered) Color.Red else Color.Blue)
+                .hoverable(interactionSource = interactionSource),
         contentAlignment = Alignment.Center
     ) {
         Text(if (isHovered) "Hovered" else "Unhovered")
diff --git a/compose/foundation/foundation/samples/src/main/java/androidx/compose/foundation/samples/ImageSamples.kt b/compose/foundation/foundation/samples/src/main/java/androidx/compose/foundation/samples/ImageSamples.kt
index 45d87f3..2dcfe51 100644
--- a/compose/foundation/foundation/samples/src/main/java/androidx/compose/foundation/samples/ImageSamples.kt
+++ b/compose/foundation/foundation/samples/src/main/java/androidx/compose/foundation/samples/ImageSamples.kt
@@ -49,11 +49,7 @@
     val ImageBitmap = createTestImage()
     // Lays out and draws an image sized to the rectangular subsection of the ImageBitmap
     Image(
-        painter = BitmapPainter(
-            ImageBitmap,
-            IntOffset(10, 12),
-            IntSize(50, 60)
-        ),
+        painter = BitmapPainter(ImageBitmap, IntOffset(10, 12), IntSize(50, 60)),
         contentDescription = "Localized description"
     )
 }
@@ -80,14 +76,10 @@
     )
 }
 
-/**
- * Helper method to create an ImageBitmap with some content in it
- */
+/** Helper method to create an ImageBitmap with some content in it */
 private fun createTestImage(): ImageBitmap {
     val ImageBitmap = ImageBitmap(100, 100)
-    Canvas(ImageBitmap).drawCircle(
-        Offset(50.0f, 50.0f), 50.0f,
-        Paint().apply { this.color = Color.Cyan }
-    )
+    Canvas(ImageBitmap)
+        .drawCircle(Offset(50.0f, 50.0f), 50.0f, Paint().apply { this.color = Color.Cyan })
     return ImageBitmap
 }
diff --git a/compose/foundation/foundation/samples/src/main/java/androidx/compose/foundation/samples/IndicationSamples.kt b/compose/foundation/foundation/samples/src/main/java/androidx/compose/foundation/samples/IndicationSamples.kt
index 6ab2353..dccf0fe 100644
--- a/compose/foundation/foundation/samples/src/main/java/androidx/compose/foundation/samples/IndicationSamples.kt
+++ b/compose/foundation/foundation/samples/src/main/java/androidx/compose/foundation/samples/IndicationSamples.kt
@@ -38,24 +38,26 @@
     Column {
         Text(
             text = "Click me and my neighbour will indicate as well!",
-            modifier = Modifier
-                // clickable will dispatch events using MutableInteractionSource
-                .clickable(
-                    interactionSource = interactionSource,
-                    indication = LocalIndication.current
-                ) {
-                    /**do something */
-                }
-                .padding(10.dp)
+            modifier =
+                Modifier
+                    // clickable will dispatch events using MutableInteractionSource
+                    .clickable(
+                        interactionSource = interactionSource,
+                        indication = LocalIndication.current
+                    ) {
+                        /** do something */
+                    }
+                    .padding(10.dp)
         )
         Spacer(Modifier.requiredHeight(10.dp))
         Text(
             text = "I'm neighbour and I indicate when you click the other one",
-            modifier = Modifier
-                // this element doesn't have a click, but will show default indication from the
-                // CompositionLocal as it accepts the same MutableInteractionSource
-                .indication(interactionSource, LocalIndication.current)
-                .padding(10.dp)
+            modifier =
+                Modifier
+                    // this element doesn't have a click, but will show default indication from the
+                    // CompositionLocal as it accepts the same MutableInteractionSource
+                    .indication(interactionSource, LocalIndication.current)
+                    .padding(10.dp)
         )
     }
 }
diff --git a/compose/foundation/foundation/samples/src/main/java/androidx/compose/foundation/samples/InlineTextContentSample.kt b/compose/foundation/foundation/samples/src/main/java/androidx/compose/foundation/samples/InlineTextContentSample.kt
index 68195dc..f619468 100644
--- a/compose/foundation/foundation/samples/src/main/java/androidx/compose/foundation/samples/InlineTextContentSample.kt
+++ b/compose/foundation/foundation/samples/src/main/java/androidx/compose/foundation/samples/InlineTextContentSample.kt
@@ -41,27 +41,29 @@
         appendInlineContent(myId, "[myBox]")
     }
 
-    val inlineContent = mapOf(
-        Pair(
-            // This tells the [BasicText] to replace the placeholder string "[myBox]" by
-            // the composable given in the [InlineTextContent] object.
-            myId,
-            InlineTextContent(
-                // Placeholder tells text layout the expected size and vertical alignment of
-                // children composable.
-                Placeholder(
-                    width = 0.5.em,
-                    height = 0.5.em,
-                    placeholderVerticalAlign = PlaceholderVerticalAlign.AboveBaseline
-                )
-            ) {
-                // This [Box] will fill maximum size, which is specified by the [Placeholder]
-                // above. Notice the width and height in [Placeholder] are specified in TextUnit,
-                // and are converted into pixel by text layout.
-                Box(modifier = Modifier.fillMaxSize().background(color = Color.Red))
-            }
+    val inlineContent =
+        mapOf(
+            Pair(
+                // This tells the [BasicText] to replace the placeholder string "[myBox]" by
+                // the composable given in the [InlineTextContent] object.
+                myId,
+                InlineTextContent(
+                    // Placeholder tells text layout the expected size and vertical alignment of
+                    // children composable.
+                    Placeholder(
+                        width = 0.5.em,
+                        height = 0.5.em,
+                        placeholderVerticalAlign = PlaceholderVerticalAlign.AboveBaseline
+                    )
+                ) {
+                    // This [Box] will fill maximum size, which is specified by the [Placeholder]
+                    // above. Notice the width and height in [Placeholder] are specified in
+                    // TextUnit,
+                    // and are converted into pixel by text layout.
+                    Box(modifier = Modifier.fillMaxSize().background(color = Color.Red))
+                }
+            )
         )
-    )
 
     BasicText(text = text, inlineContent = inlineContent)
 }
diff --git a/compose/foundation/foundation/samples/src/main/java/androidx/compose/foundation/samples/InteractionSourceSample.kt b/compose/foundation/foundation/samples/src/main/java/androidx/compose/foundation/samples/InteractionSourceSample.kt
index ffe33b6..d85f4ee 100644
--- a/compose/foundation/foundation/samples/src/main/java/androidx/compose/foundation/samples/InteractionSourceSample.kt
+++ b/compose/foundation/foundation/samples/src/main/java/androidx/compose/foundation/samples/InteractionSourceSample.kt
@@ -59,46 +59,45 @@
 
     // Provide the MutableInteractionSource instances to the interactions we want to observe state
     // changes for
-    val draggable = Modifier.draggable(
-        interactionSource = interactionSource,
-        orientation = Orientation.Horizontal,
-        state = rememberDraggableState { /* update some business state here */ }
-    )
+    val draggable =
+        Modifier.draggable(
+            interactionSource = interactionSource,
+            orientation = Orientation.Horizontal,
+            state = rememberDraggableState { /* update some business state here */ }
+        )
 
-    val clickable = Modifier.clickable(
-        interactionSource = interactionSource,
-        indication = LocalIndication.current
-    ) { /* update some business state here */ }
+    val clickable =
+        Modifier.clickable(
+            interactionSource = interactionSource,
+            indication = LocalIndication.current
+        ) { /* update some business state here */
+        }
 
     // Observe changes to the binary state for these interactions
     val isDragged by interactionSource.collectIsDraggedAsState()
     val isPressed by interactionSource.collectIsPressedAsState()
 
     // Use the state to change our UI
-    val (text, color) = when {
-        isDragged && isPressed -> "Dragged and pressed" to Color.Red
-        isDragged -> "Dragged" to Color.Green
-        isPressed -> "Pressed" to Color.Blue
-        // Default / baseline state
-        else -> "Drag me horizontally, or press me!" to Color.Black
-    }
+    val (text, color) =
+        when {
+            isDragged && isPressed -> "Dragged and pressed" to Color.Red
+            isDragged -> "Dragged" to Color.Green
+            isPressed -> "Pressed" to Color.Blue
+            // Default / baseline state
+            else -> "Drag me horizontally, or press me!" to Color.Black
+        }
 
-    Box(
-        Modifier
-            .fillMaxSize()
-            .wrapContentSize()
-            .size(width = 240.dp, height = 80.dp)
-    ) {
+    Box(Modifier.fillMaxSize().wrapContentSize().size(width = 240.dp, height = 80.dp)) {
         Box(
-            Modifier
-                .fillMaxSize()
+            Modifier.fillMaxSize()
                 .then(clickable)
                 .then(draggable)
                 .border(BorderStroke(3.dp, color))
                 .padding(3.dp)
         ) {
             Text(
-                text, style = LocalTextStyle.current.copy(textAlign = TextAlign.Center),
+                text,
+                style = LocalTextStyle.current.copy(textAlign = TextAlign.Center),
                 modifier = Modifier.fillMaxSize().wrapContentSize()
             )
         }
@@ -113,20 +112,24 @@
 
     // Provide the MutableInteractionSource instances to the interactions we want to observe state
     // changes for
-    val draggable = Modifier.draggable(
-        interactionSource = interactionSource,
-        orientation = Orientation.Horizontal,
-        state = rememberDraggableState { /* update some business state here */ }
-    )
+    val draggable =
+        Modifier.draggable(
+            interactionSource = interactionSource,
+            orientation = Orientation.Horizontal,
+            state = rememberDraggableState { /* update some business state here */ }
+        )
 
-    val clickable = Modifier.clickable(
-        interactionSource = interactionSource,
-        // This component is a compound component where part of it is clickable and part of it is
-        // draggable. As a result we want to show indication for the _whole_ component, and not
-        // just for clickable area. We set `null` indication here and provide an explicit
-        // Modifier.indication instance later that will draw indication for the whole component.
-        indication = null
-    ) { /* update some business state here */ }
+    val clickable =
+        Modifier.clickable(
+            interactionSource = interactionSource,
+            // This component is a compound component where part of it is clickable and part of it
+            // is
+            // draggable. As a result we want to show indication for the _whole_ component, and not
+            // just for clickable area. We set `null` indication here and provide an explicit
+            // Modifier.indication instance later that will draw indication for the whole component.
+            indication = null
+        ) { /* update some business state here */
+        }
 
     // SnapshotStateList we will use to track incoming Interactions in the order they are emitted
     val interactions = remember { mutableStateListOf<Interaction>() }
@@ -148,17 +151,14 @@
     }
 
     // Display some text based on the most recent Interaction stored in `interactions`
-    val text = when (interactions.lastOrNull()) {
-        is DragInteraction.Start -> "Dragged"
-        is PressInteraction.Press -> "Pressed"
-        else -> "No state"
-    }
+    val text =
+        when (interactions.lastOrNull()) {
+            is DragInteraction.Start -> "Dragged"
+            is PressInteraction.Press -> "Pressed"
+            else -> "No state"
+        }
 
-    Column(
-        Modifier
-            .fillMaxSize()
-            .wrapContentSize()
-    ) {
+    Column(Modifier.fillMaxSize().wrapContentSize()) {
         Row(
             // Draw indication for the whole component, based on the Interactions dispatched by
             // our hoisted MutableInteractionSource
@@ -168,8 +168,7 @@
             )
         ) {
             Box(
-                Modifier
-                    .size(width = 240.dp, height = 80.dp)
+                Modifier.size(width = 240.dp, height = 80.dp)
                     .then(clickable)
                     .border(BorderStroke(3.dp, Color.Blue))
                     .padding(3.dp)
@@ -182,8 +181,7 @@
                 )
             }
             Box(
-                Modifier
-                    .size(width = 240.dp, height = 80.dp)
+                Modifier.size(width = 240.dp, height = 80.dp)
                     .then(draggable)
                     .border(BorderStroke(3.dp, Color.Red))
                     .padding(3.dp)
diff --git a/compose/foundation/foundation/samples/src/main/java/androidx/compose/foundation/samples/LazyDslSamples.kt b/compose/foundation/foundation/samples/src/main/java/androidx/compose/foundation/samples/LazyDslSamples.kt
index d57ab48..3db1162 100644
--- a/compose/foundation/foundation/samples/src/main/java/androidx/compose/foundation/samples/LazyDslSamples.kt
+++ b/compose/foundation/foundation/samples/src/main/java/androidx/compose/foundation/samples/LazyDslSamples.kt
@@ -50,17 +50,11 @@
     val itemsIndexedList = listOf("A", "B", "C")
 
     LazyColumn {
-        items(itemsList) {
-            Text("Item is $it")
-        }
+        items(itemsList) { Text("Item is $it") }
 
-        item {
-            Text("Single item")
-        }
+        item { Text("Single item") }
 
-        itemsIndexed(itemsIndexedList) { index, item ->
-            Text("Item at index $index is $item")
-        }
+        itemsIndexed(itemsIndexedList) { index, item -> Text("Item at index $index is $item") }
     }
 }
 
@@ -71,17 +65,11 @@
     val itemsIndexedList = listOf("A", "B", "C")
 
     LazyRow {
-        items(itemsList) {
-            Text("Item is $it")
-        }
+        items(itemsList) { Text("Item is $it") }
 
-        item {
-            Text("Single item")
-        }
+        item { Text("Single item") }
 
-        itemsIndexed(itemsIndexedList) { index, item ->
-            Text("Item at index $index is $item")
-        }
+        itemsIndexed(itemsIndexedList) { index, item -> Text("Item at index $index is $item") }
     }
 }
 
@@ -96,15 +84,10 @@
             stickyHeader {
                 Text(
                     "Section $section",
-                    Modifier
-                        .fillMaxWidth()
-                        .background(Color.LightGray)
-                        .padding(8.dp)
+                    Modifier.fillMaxWidth().background(Color.LightGray).padding(8.dp)
                 )
             }
-            items(10) {
-                Text("Item $it from the section $section")
-            }
+            items(10) { Text("Item $it from the section $section") }
         }
     }
 }
@@ -114,17 +97,9 @@
 fun AnimateItemSample() {
     var list by remember { mutableStateOf(listOf("1", "2", "3")) }
     Column {
-        Button(onClick = { list = list + "${list.count() + 1}" }) {
-            Text("Add new item")
-        }
-        Button(onClick = { list = list.shuffled() }) {
-            Text("Shuffle")
-        }
-        LazyColumn {
-            items(list, key = { it }) {
-                Text("Item $it", Modifier.animateItem())
-            }
-        }
+        Button(onClick = { list = list + "${list.count() + 1}" }) { Text("Add new item") }
+        Button(onClick = { list = list.shuffled() }) { Text("Shuffle") }
+        LazyColumn { items(list, key = { it }) { Text("Item $it", Modifier.animateItem()) } }
     }
 }
 
@@ -166,6 +141,4 @@
     }
 }
 
-@Composable
-private fun ScrollToTopButton(@Suppress("UNUSED_PARAMETER") listState: LazyListState) {
-}
+@Composable private fun ScrollToTopButton(@Suppress("UNUSED_PARAMETER") listState: LazyListState) {}
diff --git a/compose/foundation/foundation/samples/src/main/java/androidx/compose/foundation/samples/LazyGridSamples.kt b/compose/foundation/foundation/samples/src/main/java/androidx/compose/foundation/samples/LazyGridSamples.kt
index 5e79954..2025fc1 100644
--- a/compose/foundation/foundation/samples/src/main/java/androidx/compose/foundation/samples/LazyGridSamples.kt
+++ b/compose/foundation/foundation/samples/src/main/java/androidx/compose/foundation/samples/LazyGridSamples.kt
@@ -51,20 +51,11 @@
     val itemsList = (0..5).toList()
     val itemsIndexedList = listOf("A", "B", "C")
 
-    val itemModifier = Modifier
-        .border(1.dp, Color.Blue)
-        .height(80.dp)
-        .wrapContentSize()
+    val itemModifier = Modifier.border(1.dp, Color.Blue).height(80.dp).wrapContentSize()
 
-    LazyVerticalGrid(
-        columns = GridCells.Fixed(3)
-    ) {
-        items(itemsList) {
-            Text("Item is $it", itemModifier)
-        }
-        item {
-            Text("Single item", itemModifier)
-        }
+    LazyVerticalGrid(columns = GridCells.Fixed(3)) {
+        items(itemsList) { Text("Item is $it", itemModifier) }
+        item { Text("Single item", itemModifier) }
         itemsIndexed(itemsIndexedList) { index, item ->
             Text("Item at index $index is $item", itemModifier)
         }
@@ -84,10 +75,7 @@
             item(span = { GridItemSpan(maxLineSpan) }) {
                 Text(
                     "This is section $index",
-                    Modifier
-                        .border(1.dp, Color.Gray)
-                        .height(80.dp)
-                        .wrapContentSize()
+                    Modifier.border(1.dp, Color.Gray).height(80.dp).wrapContentSize()
                 )
             }
             items(
@@ -95,13 +83,7 @@
                 // not required as it is the default
                 span = { GridItemSpan(1) }
             ) {
-                Text(
-                    "Item $it",
-                    Modifier
-                        .border(1.dp, Color.Blue)
-                        .height(80.dp)
-                        .wrapContentSize()
-                )
+                Text("Item $it", Modifier.border(1.dp, Color.Blue).height(80.dp).wrapContentSize())
             }
         }
     }
@@ -113,23 +95,16 @@
     val itemsList = (0..5).toList()
     val itemsIndexedList = listOf("A", "B", "C")
 
-    val itemModifier = Modifier
-        .border(1.dp, Color.Blue)
-        .width(80.dp)
-        .wrapContentSize()
+    val itemModifier = Modifier.border(1.dp, Color.Blue).width(80.dp).wrapContentSize()
 
     LazyHorizontalGrid(
         rows = GridCells.Fixed(3),
         horizontalArrangement = Arrangement.spacedBy(16.dp),
         verticalArrangement = Arrangement.spacedBy(16.dp)
     ) {
-        items(itemsList) {
-            Text("Item is $it", itemModifier)
-        }
+        items(itemsList) { Text("Item is $it", itemModifier) }
 
-        item {
-            Text("Single item", itemModifier)
-        }
+        item { Text("Single item", itemModifier) }
 
         itemsIndexed(itemsIndexedList) { index, item ->
             Text("Item at index $index is $item", itemModifier)
@@ -150,10 +125,7 @@
             item(span = { GridItemSpan(maxLineSpan) }) {
                 Text(
                     "This is section $index",
-                    Modifier
-                        .border(1.dp, Color.Gray)
-                        .width(80.dp)
-                        .wrapContentSize()
+                    Modifier.border(1.dp, Color.Gray).width(80.dp).wrapContentSize()
                 )
             }
             items(
@@ -161,13 +133,7 @@
                 // not required as it is the default
                 span = { GridItemSpan(1) }
             ) {
-                Text(
-                    "Item $it",
-                    Modifier
-                        .border(1.dp, Color.Blue)
-                        .width(80.dp)
-                        .wrapContentSize()
-                )
+                Text("Item $it", Modifier.border(1.dp, Color.Blue).width(80.dp).wrapContentSize())
             }
         }
     }
@@ -216,20 +182,12 @@
 fun GridAnimateItemSample() {
     var list by remember { mutableStateOf(listOf("A", "B", "C")) }
     Column {
-        Button(onClick = { list = list + "D" }) {
-            Text("Add new item")
-        }
-        Button(onClick = { list = list.shuffled() }) {
-            Text("Shuffle")
-        }
+        Button(onClick = { list = list + "D" }) { Text("Add new item") }
+        Button(onClick = { list = list.shuffled() }) { Text("Shuffle") }
         LazyVerticalGrid(columns = GridCells.Fixed(1)) {
-            items(list, key = { it }) {
-                Text("Item $it", Modifier.animateItem())
-            }
+            items(list, key = { it }) { Text("Item $it", Modifier.animateItem()) }
         }
     }
 }
 
-@Composable
-private fun ScrollToTopButton(@Suppress("UNUSED_PARAMETER") gridState: LazyGridState) {
-}
+@Composable private fun ScrollToTopButton(@Suppress("UNUSED_PARAMETER") gridState: LazyGridState) {}
diff --git a/compose/foundation/foundation/samples/src/main/java/androidx/compose/foundation/samples/LazyStaggeredGridSamples.kt b/compose/foundation/foundation/samples/src/main/java/androidx/compose/foundation/samples/LazyStaggeredGridSamples.kt
index 9338267..5110d5c 100644
--- a/compose/foundation/foundation/samples/src/main/java/androidx/compose/foundation/samples/LazyStaggeredGridSamples.kt
+++ b/compose/foundation/foundation/samples/src/main/java/androidx/compose/foundation/samples/LazyStaggeredGridSamples.kt
@@ -51,15 +51,9 @@
 
     val itemModifier = Modifier.border(1.dp, Color.Blue).wrapContentSize()
 
-    LazyVerticalStaggeredGrid(
-        columns = StaggeredGridCells.Fixed(3)
-    ) {
-        items(itemsList) {
-            Text("Item is $it", itemModifier.height(80.dp))
-        }
-        item {
-            Text("Single item", itemModifier.height(100.dp))
-        }
+    LazyVerticalStaggeredGrid(columns = StaggeredGridCells.Fixed(3)) {
+        items(itemsList) { Text("Item is $it", itemModifier.height(80.dp)) }
+        item { Text("Single item", itemModifier.height(100.dp)) }
         itemsIndexed(itemsIndexedList) { index, item ->
             Text("Item at index $index is $item", itemModifier.height(60.dp))
         }
@@ -88,10 +82,7 @@
                 // not required as it is the default
                 span = { StaggeredGridItemSpan.SingleLane }
             ) {
-                Text(
-                    "Item $it",
-                    Modifier.border(1.dp, Color.Blue).height(80.dp).wrapContentSize()
-                )
+                Text("Item $it", Modifier.border(1.dp, Color.Blue).height(80.dp).wrapContentSize())
             }
         }
     }
@@ -106,15 +97,9 @@
 
     val itemModifier = Modifier.border(1.dp, Color.Blue).padding(16.dp).wrapContentSize()
 
-    LazyHorizontalStaggeredGrid(
-        rows = StaggeredGridCells.Fixed(3)
-    ) {
-        items(itemsList) {
-            Text("Item is $it", itemModifier)
-        }
-        item {
-            Text("Single item", itemModifier)
-        }
+    LazyHorizontalStaggeredGrid(rows = StaggeredGridCells.Fixed(3)) {
+        items(itemsList) { Text("Item is $it", itemModifier) }
+        item { Text("Single item", itemModifier) }
         itemsIndexed(itemsIndexedList) { index, item ->
             Text("Item at index $index is $item", itemModifier)
         }
@@ -143,10 +128,7 @@
                 // not required as it is the default
                 span = { StaggeredGridItemSpan.SingleLane }
             ) {
-                Text(
-                    "Item $it",
-                    Modifier.border(1.dp, Color.Blue).width(80.dp).wrapContentSize()
-                )
+                Text("Item $it", Modifier.border(1.dp, Color.Blue).width(80.dp).wrapContentSize())
             }
         }
     }
@@ -157,16 +139,10 @@
 fun StaggeredGridAnimateItemSample() {
     var list by remember { mutableStateOf(listOf("A", "B", "C")) }
     Column {
-        Button(onClick = { list = list + "D" }) {
-            Text("Add new item")
-        }
-        Button(onClick = { list = list.shuffled() }) {
-            Text("Shuffle")
-        }
+        Button(onClick = { list = list + "D" }) { Text("Add new item") }
+        Button(onClick = { list = list.shuffled() }) { Text("Shuffle") }
         LazyVerticalStaggeredGrid(columns = StaggeredGridCells.Fixed(1)) {
-            items(list, key = { it }) {
-                Text("Item $it", Modifier.animateItem())
-            }
+            items(list, key = { it }) { Text("Item $it", Modifier.animateItem()) }
         }
     }
 }
diff --git a/compose/foundation/foundation/samples/src/main/java/androidx/compose/foundation/samples/MagnifierSamples.kt b/compose/foundation/foundation/samples/src/main/java/androidx/compose/foundation/samples/MagnifierSamples.kt
index d928f08..c9188ec 100644
--- a/compose/foundation/foundation/samples/src/main/java/androidx/compose/foundation/samples/MagnifierSamples.kt
+++ b/compose/foundation/foundation/samples/src/main/java/androidx/compose/foundation/samples/MagnifierSamples.kt
@@ -45,11 +45,7 @@
         Text("Magnifier is not supported on this platform.")
     } else {
         Box(
-            Modifier
-                .magnifier(
-                    sourceCenter = { magnifierCenter },
-                    zoom = 2f
-                )
+            Modifier.magnifier(sourceCenter = { magnifierCenter }, zoom = 2f)
                 .pointerInput(Unit) {
                     detectDragGestures(
                         // Show the magnifier at the original pointer position.
@@ -64,11 +60,7 @@
                 .drawBehind {
                     // Some concentric circles to zoom in on.
                     for (diameter in 2 until size.maxDimension.toInt() step 10) {
-                        drawCircle(
-                            color = Color.Black,
-                            radius = diameter / 2f,
-                            style = Stroke()
-                        )
+                        drawCircle(color = Color.Black, radius = diameter / 2f, style = Stroke())
                     }
                 }
         )
diff --git a/compose/foundation/foundation/samples/src/main/java/androidx/compose/foundation/samples/MutatorMutexSamples.kt b/compose/foundation/foundation/samples/src/main/java/androidx/compose/foundation/samples/MutatorMutexSamples.kt
index 0826a15..cbe7bf2 100644
--- a/compose/foundation/foundation/samples/src/main/java/androidx/compose/foundation/samples/MutatorMutexSamples.kt
+++ b/compose/foundation/foundation/samples/src/main/java/androidx/compose/foundation/samples/MutatorMutexSamples.kt
@@ -52,38 +52,31 @@
 
         private val mutatorMutex = MutatorMutex()
 
-        /**
-         * Only one caller to [scroll] can be in progress at a time.
-         */
-        suspend fun <R> scroll(
-            block: suspend () -> R
-        ): R = mutatorMutex.mutate {
-            isScrolling = true
-            try {
-                block()
-            } finally {
-                // MutatorMutex.mutate ensures mutual exclusion between blocks.
-                // By setting back to false in the finally block inside mutate, we ensure that we
-                // reset the state upon cancellation before the next block starts to run (if any).
-                isScrolling = false
+        /** Only one caller to [scroll] can be in progress at a time. */
+        suspend fun <R> scroll(block: suspend () -> R): R =
+            mutatorMutex.mutate {
+                isScrolling = true
+                try {
+                    block()
+                } finally {
+                    // MutatorMutex.mutate ensures mutual exclusion between blocks.
+                    // By setting back to false in the finally block inside mutate, we ensure that
+                    // we
+                    // reset the state upon cancellation before the next block starts to run (if
+                    // any).
+                    isScrolling = false
+                }
             }
-        }
     }
 
-    /**
-     * Arbitrary animations can be defined as extensions using only public API
-     */
+    /** Arbitrary animations can be defined as extensions using only public API */
     suspend fun ScrollState.animateTo(target: Int) {
-        scroll {
-            animate(from = position, to = target) { newPosition ->
-                position = newPosition
-            }
-        }
+        scroll { animate(from = position, to = target) { newPosition -> position = newPosition } }
     }
 
     /**
-     * Presents two buttons for animating a scroll to the beginning or end of content.
-     * Pressing one will cancel any current animation in progress.
+     * Presents two buttons for animating a scroll to the beginning or end of content. Pressing one
+     * will cancel any current animation in progress.
      */
     @Composable
     fun ScrollControls(scrollState: ScrollState) {
@@ -108,12 +101,9 @@
 
         private val mutatorMutex = MutatorMutex()
 
-        /**
-         * Only [block] in a call to [scroll] may change the value of [position].
-         */
-        suspend fun <R> scroll(
-            block: suspend MutableState<Int>.() -> R
-        ): R = mutatorMutex.mutateWith(_position, block = block)
+        /** Only [block] in a call to [scroll] may change the value of [position]. */
+        suspend fun <R> scroll(block: suspend MutableState<Int>.() -> R): R =
+            mutatorMutex.mutateWith(_position, block = block)
     }
 }
 
diff --git a/compose/foundation/foundation/samples/src/main/java/androidx/compose/foundation/samples/OverscrollSample.kt b/compose/foundation/foundation/samples/src/main/java/androidx/compose/foundation/samples/OverscrollSample.kt
index 69c8e0c..43f3868 100644
--- a/compose/foundation/foundation/samples/src/main/java/androidx/compose/foundation/samples/OverscrollSample.kt
+++ b/compose/foundation/foundation/samples/src/main/java/androidx/compose/foundation/samples/OverscrollSample.kt
@@ -74,22 +74,21 @@
             // relaxation: when we are in progress of the overscroll and user scrolls in the
             // different direction = substract the overscroll first
             val sameDirection = sign(delta.y) == sign(overscrollOffset.value)
-            val consumedByPreScroll = if (abs(overscrollOffset.value) > 0.5 && !sameDirection) {
-                val prevOverscrollValue = overscrollOffset.value
-                val newOverscrollValue = overscrollOffset.value + delta.y
-                if (sign(prevOverscrollValue) != sign(newOverscrollValue)) {
-                    // sign changed, coerce to start scrolling and exit
-                    scope.launch { overscrollOffset.snapTo(0f) }
-                    Offset(x = 0f, y = delta.y + prevOverscrollValue)
-                } else {
-                    scope.launch {
-                        overscrollOffset.snapTo(overscrollOffset.value + delta.y)
+            val consumedByPreScroll =
+                if (abs(overscrollOffset.value) > 0.5 && !sameDirection) {
+                    val prevOverscrollValue = overscrollOffset.value
+                    val newOverscrollValue = overscrollOffset.value + delta.y
+                    if (sign(prevOverscrollValue) != sign(newOverscrollValue)) {
+                        // sign changed, coerce to start scrolling and exit
+                        scope.launch { overscrollOffset.snapTo(0f) }
+                        Offset(x = 0f, y = delta.y + prevOverscrollValue)
+                    } else {
+                        scope.launch { overscrollOffset.snapTo(overscrollOffset.value + delta.y) }
+                        delta.copy(x = 0f)
                     }
-                    delta.copy(x = 0f)
+                } else {
+                    Offset.Zero
                 }
-            } else {
-                Offset.Zero
-            }
             val leftForScroll = delta - consumedByPreScroll
             val consumedByScroll = performScroll(leftForScroll)
             val overscrollDelta = leftForScroll - consumedByScroll
@@ -121,9 +120,8 @@
             get() = overscrollOffset.value != 0f
 
         // as we're building an offset modifiers, let's offset of our value we calculated
-        override val effectModifier: Modifier = Modifier.offset {
-            IntOffset(x = 0, y = overscrollOffset.value.roundToInt())
-        }
+        override val effectModifier: Modifier =
+            Modifier.offset { IntOffset(x = 0, y = overscrollOffset.value.roundToInt()) }
     }
 
     val offset = remember { mutableStateOf(0f) }
@@ -133,18 +131,18 @@
     // let's build a scrollable that scroll until -512 to 512
     val scrollStateRange = (-512f).rangeTo(512f)
     Box(
-        Modifier
-            .size(150.dp)
+        Modifier.size(150.dp)
             .scrollable(
                 orientation = Orientation.Vertical,
-                state = rememberScrollableState { delta ->
-                    // use the scroll data and indicate how much this element consumed.
-                    val oldValue = offset.value
-                    // coerce to our range
-                    offset.value = (offset.value + delta).coerceIn(scrollStateRange)
+                state =
+                    rememberScrollableState { delta ->
+                        // use the scroll data and indicate how much this element consumed.
+                        val oldValue = offset.value
+                        // coerce to our range
+                        offset.value = (offset.value + delta).coerceIn(scrollStateRange)
 
-                    offset.value - oldValue // indicate that we consumed what's needed
-                },
+                        offset.value - oldValue // indicate that we consumed what's needed
+                    },
                 // pass the overscroll to the scrollable so the data is updated
                 overscrollEffect = overscroll
             )
@@ -154,9 +152,10 @@
         Text(
             offset.value.roundToInt().toString(),
             style = TextStyle(fontSize = 32.sp),
-            modifier = Modifier
-                // show the overscroll only on the text, not the containers (just for fun)
-                .overscroll(overscroll)
+            modifier =
+                Modifier
+                    // show the overscroll only on the text, not the containers (just for fun)
+                    .overscroll(overscroll)
         )
     }
 }
@@ -174,9 +173,7 @@
     }
 
     Box(
-        Modifier
-            .size(100.dp)
-            .draggable(draggableState, orientation = Orientation.Horizontal),
+        Modifier.size(100.dp).draggable(draggableState, orientation = Orientation.Horizontal),
         contentAlignment = Alignment.Center
     ) {
         Text("Drag position $dragPosition")
@@ -197,10 +194,8 @@
         // Horizontal, so convert the delta to a horizontal offset
         val deltaAsOffset = Offset(delta, 0f)
         // Wrap the original logic inside applyToScroll
-        overscrollEffect.applyToScroll(
-            deltaAsOffset,
-            NestedScrollSource.UserInput
-        ) { remainingOffset ->
+        overscrollEffect.applyToScroll(deltaAsOffset, NestedScrollSource.UserInput) {
+            remainingOffset ->
             val remainingDelta = remainingOffset.x
             val newPosition = (dragPosition + remainingDelta).coerceIn(minPosition, maxPosition)
             // Calculate how much delta we have consumed
diff --git a/compose/foundation/foundation/samples/src/main/java/androidx/compose/foundation/samples/PagerSamples.kt b/compose/foundation/foundation/samples/src/main/java/androidx/compose/foundation/samples/PagerSamples.kt
index 58dadbf..c07fcdc 100644
--- a/compose/foundation/foundation/samples/src/main/java/androidx/compose/foundation/samples/PagerSamples.kt
+++ b/compose/foundation/foundation/samples/src/main/java/androidx/compose/foundation/samples/PagerSamples.kt
@@ -70,11 +70,8 @@
         modifier = Modifier.fillMaxSize(),
     ) { page ->
         Box(
-            modifier = Modifier
-                .padding(10.dp)
-                .background(Color.Blue)
-                .fillMaxWidth()
-                .aspectRatio(1f),
+            modifier =
+                Modifier.padding(10.dp).background(Color.Blue).fillMaxWidth().aspectRatio(1f),
             contentAlignment = Alignment.Center
         ) {
             Text(text = page.toString(), fontSize = 32.sp)
@@ -87,16 +84,10 @@
 fun SimpleVerticalPagerSample() {
     // Creates a 1-pager/viewport vertical pager with single page snapping
     val state = rememberPagerState { 10 }
-    VerticalPager(
-        state = state,
-        modifier = Modifier.fillMaxSize()
-    ) { page ->
+    VerticalPager(state = state, modifier = Modifier.fillMaxSize()) { page ->
         Box(
-            modifier = Modifier
-                .padding(10.dp)
-                .background(Color.Blue)
-                .fillMaxWidth()
-                .aspectRatio(1f),
+            modifier =
+                Modifier.padding(10.dp).background(Color.Blue).fillMaxWidth().aspectRatio(1f),
             contentAlignment = Alignment.Center
         ) {
             Text(text = page.toString(), fontSize = 32.sp)
@@ -109,16 +100,10 @@
 fun PagerWithStateSample() {
     // You can use PagerState to define an initial page
     val state = rememberPagerState(initialPage = 5) { 10 }
-    HorizontalPager(
-        modifier = Modifier.fillMaxSize(),
-        state = state
-    ) { page ->
+    HorizontalPager(modifier = Modifier.fillMaxSize(), state = state) { page ->
         Box(
-            modifier = Modifier
-                .padding(10.dp)
-                .background(Color.Blue)
-                .fillMaxWidth()
-                .aspectRatio(1f),
+            modifier =
+                Modifier.padding(10.dp).background(Color.Blue).fillMaxWidth().aspectRatio(1f),
             contentAlignment = Alignment.Center
         ) {
             Text(text = page.toString(), fontSize = 32.sp)
@@ -131,11 +116,12 @@
 @Composable
 fun PagerCustomAnimateScrollToPage() {
     suspend fun PagerState.customAnimateScrollToPage(page: Int) {
-        val preJumpPosition = if (page > currentPage) {
-            (page - 1).coerceAtLeast(0)
-        } else {
-            (page + 1).coerceAtMost(pageCount)
-        }
+        val preJumpPosition =
+            if (page > currentPage) {
+                (page - 1).coerceAtLeast(0)
+            } else {
+                (page + 1).coerceAtMost(pageCount)
+            }
         scroll {
             // Update the target page
             updateTargetPage(page)
@@ -158,29 +144,17 @@
     val scope = rememberCoroutineScope()
 
     Column {
-        HorizontalPager(
-            modifier = Modifier
-                .fillMaxSize()
-                .weight(0.9f),
-            state = state
-        ) { page ->
+        HorizontalPager(modifier = Modifier.fillMaxSize().weight(0.9f), state = state) { page ->
             Box(
-                modifier = Modifier
-                    .padding(10.dp)
-                    .background(Color.Blue)
-                    .fillMaxWidth()
-                    .aspectRatio(1f),
+                modifier =
+                    Modifier.padding(10.dp).background(Color.Blue).fillMaxWidth().aspectRatio(1f),
                 contentAlignment = Alignment.Center
             ) {
                 Text(text = page.toString(), fontSize = 32.sp)
             }
         }
 
-        Button(onClick = {
-            scope.launch {
-                state.customAnimateScrollToPage(1)
-            }
-        }) {
+        Button(onClick = { scope.launch { state.customAnimateScrollToPage(1) } }) {
             Text(text = "Jump to Page 1")
         }
     }
@@ -192,30 +166,26 @@
 
     // [PageSize] should be defined as a top level constant in order to avoid unnecessary re-
     // creations.
-    val CustomPageSize = object : PageSize {
-        override fun Density.calculateMainAxisPageSize(
-            availableSpace: Int,
-            pageSpacing: Int
-        ): Int {
-            // [availableSpace] represents the whole Pager width (in this case), we'd like to have
-            // 3 pages per viewport, so we divide it by 3, taking into consideration the start
-            // and end spacings.
-            return (availableSpace - 2 * pageSpacing) / 3
+    val CustomPageSize =
+        object : PageSize {
+            override fun Density.calculateMainAxisPageSize(
+                availableSpace: Int,
+                pageSpacing: Int
+            ): Int {
+                // [availableSpace] represents the whole Pager width (in this case), we'd like to
+                // have
+                // 3 pages per viewport, so we divide it by 3, taking into consideration the start
+                // and end spacings.
+                return (availableSpace - 2 * pageSpacing) / 3
+            }
         }
-    }
 
     val state = rememberPagerState { 10 }
-    HorizontalPager(
-        state = state,
-        modifier = Modifier.fillMaxSize(),
-        pageSize = CustomPageSize
-    ) { page ->
+    HorizontalPager(state = state, modifier = Modifier.fillMaxSize(), pageSize = CustomPageSize) {
+        page ->
         Box(
-            modifier = Modifier
-                .padding(10.dp)
-                .background(Color.Blue)
-                .fillMaxWidth()
-                .aspectRatio(1f),
+            modifier =
+                Modifier.padding(10.dp).background(Color.Blue).fillMaxWidth().aspectRatio(1f),
             contentAlignment = Alignment.Center
         ) {
             Text(text = page.toString(), fontSize = 32.sp)
@@ -228,26 +198,16 @@
 fun ObservingStateChangesInPagerStateSample() {
     val pagerState = rememberPagerState { 10 }
     Column(modifier = Modifier.fillMaxSize()) {
-        HorizontalPager(
-            modifier = Modifier.weight(0.9f),
-            state = pagerState
-        ) { page ->
+        HorizontalPager(modifier = Modifier.weight(0.9f), state = pagerState) { page ->
             Box(
-                modifier = Modifier
-                    .padding(10.dp)
-                    .background(Color.Blue)
-                    .fillMaxWidth()
-                    .aspectRatio(1f),
+                modifier =
+                    Modifier.padding(10.dp).background(Color.Blue).fillMaxWidth().aspectRatio(1f),
                 contentAlignment = Alignment.Center
             ) {
                 Text(text = page.toString(), fontSize = 32.sp)
             }
         }
-        Column(
-            modifier = Modifier
-                .weight(0.1f)
-                .fillMaxWidth()
-        ) {
+        Column(modifier = Modifier.weight(0.1f).fillMaxWidth()) {
             Text(text = "Current Page: ${pagerState.currentPage}")
             Text(text = "Target Page: ${pagerState.targetPage}")
             Text(text = "Settled Page Offset: ${pagerState.settledPage}")
@@ -261,32 +221,22 @@
     val state = rememberPagerState { 10 }
     val animationScope = rememberCoroutineScope()
     Column {
-        HorizontalPager(
-            modifier = Modifier.weight(0.7f),
-            state = state
-        ) { page ->
+        HorizontalPager(modifier = Modifier.weight(0.7f), state = state) { page ->
             Box(
-                modifier = Modifier
-                    .padding(10.dp)
-                    .background(Color.Blue)
-                    .fillMaxWidth()
-                    .aspectRatio(1f),
+                modifier =
+                    Modifier.padding(10.dp).background(Color.Blue).fillMaxWidth().aspectRatio(1f),
                 contentAlignment = Alignment.Center
             ) {
                 Text(text = page.toString(), fontSize = 32.sp)
             }
         }
 
-        Box(
-            modifier = Modifier
-                .weight(0.3f)
-                .fillMaxWidth(), contentAlignment = Alignment.Center
-        ) {
-            Button(onClick = {
-                animationScope.launch {
-                    state.animateScrollToPage(state.currentPage + 1)
+        Box(modifier = Modifier.weight(0.3f).fillMaxWidth(), contentAlignment = Alignment.Center) {
+            Button(
+                onClick = {
+                    animationScope.launch { state.animateScrollToPage(state.currentPage + 1) }
                 }
-            }) {
+            ) {
                 Text(text = "Next Page")
             }
         }
@@ -299,16 +249,10 @@
     val state = rememberPagerState { 10 }
     val scrollScope = rememberCoroutineScope()
     Column {
-        HorizontalPager(
-            modifier = Modifier.height(400.dp),
-            state = state
-        ) { page ->
+        HorizontalPager(modifier = Modifier.height(400.dp), state = state) { page ->
             Box(
-                modifier = Modifier
-                    .padding(10.dp)
-                    .background(Color.Blue)
-                    .fillMaxWidth()
-                    .aspectRatio(1f),
+                modifier =
+                    Modifier.padding(10.dp).background(Color.Blue).fillMaxWidth().aspectRatio(1f),
                 contentAlignment = Alignment.Center
             ) {
                 Text(text = page.toString(), fontSize = 32.sp)
@@ -316,11 +260,9 @@
         }
 
         Box(modifier = Modifier.fillMaxWidth(), contentAlignment = Alignment.Center) {
-            androidx.compose.material.Button(onClick = {
-                scrollScope.launch {
-                    state.scrollToPage(state.currentPage + 1)
-                }
-            }) {
+            androidx.compose.material.Button(
+                onClick = { scrollScope.launch { state.scrollToPage(state.currentPage + 1) } }
+            ) {
                 Text(text = "Next Page")
             }
         }
@@ -350,15 +292,12 @@
         }
     }
 
-    Box(
-        modifier = Modifier
-            .fillMaxSize()
-            .nestedScroll(nestedScrollConnection)
-    ) {
+    Box(modifier = Modifier.fillMaxSize().nestedScroll(nestedScrollConnection)) {
         TopAppBar(
-            modifier = Modifier
-                .height(toolbarHeight)
-                .offset { IntOffset(x = 0, y = toolbarOffsetHeightPx.value.roundToInt()) },
+            modifier =
+                Modifier.height(toolbarHeight).offset {
+                    IntOffset(x = 0, y = toolbarOffsetHeightPx.value.roundToInt())
+                },
             title = { Text("Toolbar offset is ${toolbarOffsetHeightPx.value}") }
         )
 
@@ -370,18 +309,14 @@
             state = pagerState,
             contentPadding = PaddingValues(top = paddingOffset)
         ) {
-            Column(
-                modifier = Modifier
-                    .fillMaxWidth()
-                    .verticalScroll(rememberScrollState())
-            ) {
+            Column(modifier = Modifier.fillMaxWidth().verticalScroll(rememberScrollState())) {
                 repeat(20) {
                     Box(
-                        modifier = Modifier
-                            .fillMaxWidth()
-                            .height(64.dp)
-                            .padding(4.dp)
-                            .background(if (it % 2 == 0) Color.Black else Color.Yellow),
+                        modifier =
+                            Modifier.fillMaxWidth()
+                                .height(64.dp)
+                                .padding(4.dp)
+                                .background(if (it % 2 == 0) Color.Black else Color.Yellow),
                         contentAlignment = Alignment.Center
                     ) {
                         Text(
diff --git a/compose/foundation/foundation/samples/src/main/java/androidx/compose/foundation/samples/ProgressSemanticsSamples.kt b/compose/foundation/foundation/samples/src/main/java/androidx/compose/foundation/samples/ProgressSemanticsSamples.kt
index e23506f..2e40437 100644
--- a/compose/foundation/foundation/samples/src/main/java/androidx/compose/foundation/samples/ProgressSemanticsSamples.kt
+++ b/compose/foundation/foundation/samples/src/main/java/androidx/compose/foundation/samples/ProgressSemanticsSamples.kt
@@ -32,8 +32,7 @@
 fun DeterminateProgressSemanticsSample() {
     val progress = 0.5f // emulate progress from some state
     Box(
-        Modifier
-            .progressSemantics(progress)
+        Modifier.progressSemantics(progress)
             .size((progress * 100).dp, 4.dp)
             .background(color = Color.Cyan)
     )
diff --git a/compose/foundation/foundation/samples/src/main/java/androidx/compose/foundation/samples/ReceiveContentSamples.kt b/compose/foundation/foundation/samples/src/main/java/androidx/compose/foundation/samples/ReceiveContentSamples.kt
index 8027c60..3a67237 100644
--- a/compose/foundation/foundation/samples/src/main/java/androidx/compose/foundation/samples/ReceiveContentSamples.kt
+++ b/compose/foundation/foundation/samples/src/main/java/androidx/compose/foundation/samples/ReceiveContentSamples.kt
@@ -48,25 +48,25 @@
     val state = rememberTextFieldState()
     var images by remember { mutableStateOf<List<ImageBitmap>>(emptyList()) }
     Column {
-        Row {
-            images.forEach {
-                Image(bitmap = it, contentDescription = null)
-            }
-        }
+        Row { images.forEach { Image(bitmap = it, contentDescription = null) } }
         BasicTextField(
             state = state,
-            modifier = Modifier.contentReceiver { transferableContent ->
-                if (!transferableContent.hasMediaType(MediaType.Image)) {
-                    return@contentReceiver transferableContent
+            modifier =
+                Modifier.contentReceiver { transferableContent ->
+                    if (!transferableContent.hasMediaType(MediaType.Image)) {
+                        return@contentReceiver transferableContent
+                    }
+                    val newImages = mutableListOf<ImageBitmap>()
+                    transferableContent
+                        .consume { item ->
+                            // only consume this item if we can read an imageBitmap
+                            item.readImageBitmap()?.let {
+                                newImages += it
+                                true
+                            } ?: false
+                        }
+                        .also { images = newImages }
                 }
-                val newImages = mutableListOf<ImageBitmap>()
-                transferableContent.consume { item ->
-                    // only consume this item if we can read an imageBitmap
-                    item.readImageBitmap()?.let { newImages += it; true } ?: false
-                }.also {
-                    images = newImages
-                }
-            }
         )
     }
 }
@@ -80,60 +80,56 @@
     var dragging by remember { mutableStateOf(false) }
     var hovering by remember { mutableStateOf(false) }
     Column {
-        Row {
-            images.forEach {
-                Image(bitmap = it, contentDescription = null)
-            }
-        }
+        Row { images.forEach { Image(bitmap = it, contentDescription = null) } }
         BasicTextField(
             state = state,
-            modifier = Modifier
-                .background(
-                    when {
-                        dragging -> Color.Red
-                        hovering -> Color.Green
-                        else -> MaterialTheme.colors.background
-                    }
-                )
-                .contentReceiver(
-                    receiveContentListener = object : ReceiveContentListener {
-                        override fun onDragStart() {
-                            dragging = true
+            modifier =
+                Modifier.background(
+                        when {
+                            dragging -> Color.Red
+                            hovering -> Color.Green
+                            else -> MaterialTheme.colors.background
                         }
+                    )
+                    .contentReceiver(
+                        receiveContentListener =
+                            object : ReceiveContentListener {
+                                override fun onDragStart() {
+                                    dragging = true
+                                }
 
-                        override fun onDragEnd() {
-                            hovering = false
-                            dragging = false
-                        }
+                                override fun onDragEnd() {
+                                    hovering = false
+                                    dragging = false
+                                }
 
-                        override fun onDragEnter() {
-                            hovering = true
-                        }
+                                override fun onDragEnter() {
+                                    hovering = true
+                                }
 
-                        override fun onDragExit() {
-                            hovering = false
-                        }
+                                override fun onDragExit() {
+                                    hovering = false
+                                }
 
-                        override fun onReceive(
-                            transferableContent: TransferableContent
-                        ): TransferableContent? {
-                            if (!transferableContent.hasMediaType(MediaType.Image)) {
-                                return transferableContent
+                                override fun onReceive(
+                                    transferableContent: TransferableContent
+                                ): TransferableContent? {
+                                    if (!transferableContent.hasMediaType(MediaType.Image)) {
+                                        return transferableContent
+                                    }
+                                    val newImages = mutableListOf<ImageBitmap>()
+                                    return transferableContent
+                                        .consume { item ->
+                                            // only consume this item if we can read an imageBitmap
+                                            item.readImageBitmap()?.let {
+                                                newImages += it
+                                                true
+                                            } ?: false
+                                        }
+                                        .also { images = newImages }
+                                }
                             }
-                            val newImages = mutableListOf<ImageBitmap>()
-                            return transferableContent
-                                .consume { item ->
-                                    // only consume this item if we can read an imageBitmap
-                                    item
-                                        .readImageBitmap()
-                                        ?.let { newImages += it; true } ?: false
-                                }
-                                .also {
-                                    images = newImages
-                                }
-                        }
-                    }
-                )
+                    )
         )
     }
 }
diff --git a/compose/foundation/foundation/samples/src/main/java/androidx/compose/foundation/samples/ScrollableSamples.kt b/compose/foundation/foundation/samples/src/main/java/androidx/compose/foundation/samples/ScrollableSamples.kt
index fff4706..8586d8c 100644
--- a/compose/foundation/foundation/samples/src/main/java/androidx/compose/foundation/samples/ScrollableSamples.kt
+++ b/compose/foundation/foundation/samples/src/main/java/androidx/compose/foundation/samples/ScrollableSamples.kt
@@ -64,17 +64,17 @@
     // actual composable state that we will show on UI and update in `Scrollable`
     val offset = remember { mutableStateOf(0f) }
     Box(
-        Modifier
-            .size(150.dp)
+        Modifier.size(150.dp)
             .scrollable(
                 orientation = Orientation.Vertical,
                 // state for Scrollable, describes how consume scroll amount
-                state = rememberScrollableState { delta ->
-                    // use the scroll data and indicate how much this element consumed.
-                    // unconsumed deltas will be propagated to nested scrollables (if present)
-                    offset.value = offset.value + delta // update the state
-                    delta // indicate that we consumed all the pixels available
-                }
+                state =
+                    rememberScrollableState { delta ->
+                        // use the scroll data and indicate how much this element consumed.
+                        // unconsumed deltas will be propagated to nested scrollables (if present)
+                        offset.value = offset.value + delta // update the state
+                        delta // indicate that we consumed all the pixels available
+                    }
             )
             .background(Color.LightGray),
         contentAlignment = Alignment.Center
@@ -104,14 +104,8 @@
             Color.Red
         )
         val items = (1..100).toList()
-        LazyColumn(
-            Modifier
-                .weight(1f)
-                .fillMaxWidth(), state
-        ) {
-            items(items) {
-                Text("Item is $it")
-            }
+        LazyColumn(Modifier.weight(1f).fillMaxWidth(), state) {
+            items(items) { Text("Item is $it") }
         }
         Icon(
             Icons.Filled.KeyboardArrowDown,
@@ -132,53 +126,48 @@
 @Composable
 fun FocusScrollingInLazyRowSample() {
     // a bring into view spec that pivots around the center of the scrollable container
-    val customBringIntoViewSpec = object : BringIntoViewSpec {
-        override fun calculateScrollDistance(
-            offset: Float,
-            size: Float,
-            containerSize: Float
-        ): Float {
-            val trailingEdgeOfItemRequestingFocus = offset + size
+    val customBringIntoViewSpec =
+        object : BringIntoViewSpec {
+            override fun calculateScrollDistance(
+                offset: Float,
+                size: Float,
+                containerSize: Float
+            ): Float {
+                val trailingEdgeOfItemRequestingFocus = offset + size
 
-            val sizeOfItemRequestingFocus =
-                abs(trailingEdgeOfItemRequestingFocus - offset)
-            val childSmallerThanParent = sizeOfItemRequestingFocus <= containerSize
-            val initialTargetForLeadingEdge =
-                containerSize / 2f - (sizeOfItemRequestingFocus / 2f)
-            val spaceAvailableToShowItem = containerSize - initialTargetForLeadingEdge
+                val sizeOfItemRequestingFocus = abs(trailingEdgeOfItemRequestingFocus - offset)
+                val childSmallerThanParent = sizeOfItemRequestingFocus <= containerSize
+                val initialTargetForLeadingEdge =
+                    containerSize / 2f - (sizeOfItemRequestingFocus / 2f)
+                val spaceAvailableToShowItem = containerSize - initialTargetForLeadingEdge
 
-            val targetForLeadingEdge =
-                if (childSmallerThanParent &&
-                    spaceAvailableToShowItem < sizeOfItemRequestingFocus
-                ) {
-                    containerSize - sizeOfItemRequestingFocus
-                } else {
-                    initialTargetForLeadingEdge
-                }
+                val targetForLeadingEdge =
+                    if (
+                        childSmallerThanParent &&
+                            spaceAvailableToShowItem < sizeOfItemRequestingFocus
+                    ) {
+                        containerSize - sizeOfItemRequestingFocus
+                    } else {
+                        initialTargetForLeadingEdge
+                    }
 
-            return offset - targetForLeadingEdge
+                return offset - targetForLeadingEdge
+            }
         }
-    }
 
     // LocalBringIntoViewSpec will apply to all scrollables in the hierarchy.
     CompositionLocalProvider(LocalBringIntoViewSpec provides customBringIntoViewSpec) {
-        LazyRow(
-            modifier = Modifier
-                .fillMaxWidth()
-                .wrapContentHeight()
-        ) {
+        LazyRow(modifier = Modifier.fillMaxWidth().wrapContentHeight()) {
             items(100) {
                 var color by remember { mutableStateOf(Color.White) }
                 Box(
-                    modifier = Modifier
-                        .size(100.dp)
-                        .padding(4.dp)
-                        .background(Color.Gray)
-                        .onFocusChanged {
-                            color = if (it.isFocused) Color.Red else Color.White
-                        }
-                        .border(5.dp, color)
-                        .focusable(),
+                    modifier =
+                        Modifier.size(100.dp)
+                            .padding(4.dp)
+                            .background(Color.Gray)
+                            .onFocusChanged { color = if (it.isFocused) Color.Red else Color.White }
+                            .border(5.dp, color)
+                            .focusable(),
                     contentAlignment = Alignment.Center
                 ) {
                     Text(text = it.toString())
diff --git a/compose/foundation/foundation/samples/src/main/java/androidx/compose/foundation/samples/ScrollerSamples.kt b/compose/foundation/foundation/samples/src/main/java/androidx/compose/foundation/samples/ScrollerSamples.kt
index 9a1430e..9728bb0 100644
--- a/compose/foundation/foundation/samples/src/main/java/androidx/compose/foundation/samples/ScrollerSamples.kt
+++ b/compose/foundation/foundation/samples/src/main/java/androidx/compose/foundation/samples/ScrollerSamples.kt
@@ -42,24 +42,28 @@
 import androidx.compose.ui.unit.dp
 import kotlinx.coroutines.launch
 
-private val colors = listOf(
-    Color(0xFFffd7d7.toInt()),
-    Color(0xFFffe9d6.toInt()),
-    Color(0xFFfffbd0.toInt()),
-    Color(0xFFe3ffd9.toInt()),
-    Color(0xFFd0fff8.toInt())
-)
+private val colors =
+    listOf(
+        Color(0xFFffd7d7.toInt()),
+        Color(0xFFffe9d6.toInt()),
+        Color(0xFFfffbd0.toInt()),
+        Color(0xFFe3ffd9.toInt()),
+        Color(0xFFd0fff8.toInt())
+    )
 
 @Sampled
 @Composable
 fun HorizontalScrollSample() {
     val scrollState = rememberScrollState()
-    val gradient = Brush.horizontalGradient(
-        listOf(Color.Red, Color.Blue, Color.Green), 0.0f, 10000.0f, TileMode.Repeated
-    )
+    val gradient =
+        Brush.horizontalGradient(
+            listOf(Color.Red, Color.Blue, Color.Green),
+            0.0f,
+            10000.0f,
+            TileMode.Repeated
+        )
     Box(
-        Modifier
-            .horizontalScroll(scrollState)
+        Modifier.horizontalScroll(scrollState)
             .size(width = 10000.dp, height = 200.dp)
             .background(brush = gradient)
     )
@@ -69,12 +73,15 @@
 @Composable
 fun VerticalScrollExample() {
     val scrollState = rememberScrollState()
-    val gradient = Brush.verticalGradient(
-        listOf(Color.Red, Color.Blue, Color.Green), 0.0f, 10000.0f, TileMode.Repeated
-    )
+    val gradient =
+        Brush.verticalGradient(
+            listOf(Color.Red, Color.Blue, Color.Green),
+            0.0f,
+            10000.0f,
+            TileMode.Repeated
+        )
     Box(
-        Modifier
-            .verticalScroll(scrollState)
+        Modifier.verticalScroll(scrollState)
             .fillMaxWidth()
             .requiredHeight(10000.dp)
             .background(brush = gradient)
@@ -88,43 +95,23 @@
     val scrollState = rememberScrollState()
     val scope = rememberCoroutineScope()
     Column {
-        Row(Modifier.horizontalScroll(scrollState)) {
-            repeat(1000) { index ->
-                Square(index)
-            }
-        }
+        Row(Modifier.horizontalScroll(scrollState)) { repeat(1000) { index -> Square(index) } }
         // Controls for scrolling
         Row(verticalAlignment = Alignment.CenterVertically) {
             Text("Scroll")
-            Button(
-                onClick = {
-                    scope.launch { scrollState.scrollTo(scrollState.value - 1000) }
-                }
-            ) {
+            Button(onClick = { scope.launch { scrollState.scrollTo(scrollState.value - 1000) } }) {
                 Text("< -")
             }
-            Button(
-                onClick = {
-                    scope.launch { scrollState.scrollBy(10000f) }
-                }
-            ) {
-                Text("--- >")
-            }
+            Button(onClick = { scope.launch { scrollState.scrollBy(10000f) } }) { Text("--- >") }
         }
         Row(verticalAlignment = Alignment.CenterVertically) {
             Text("Smooth Scroll")
             Button(
-                onClick = {
-                    scope.launch { scrollState.animateScrollTo(scrollState.value - 1000) }
-                }
+                onClick = { scope.launch { scrollState.animateScrollTo(scrollState.value - 1000) } }
             ) {
                 Text("< -")
             }
-            Button(
-                onClick = {
-                    scope.launch { scrollState.animateScrollBy(10000f) }
-                }
-            ) {
+            Button(onClick = { scope.launch { scrollState.animateScrollBy(10000f) } }) {
                 Text("--- >")
             }
         }
@@ -149,5 +136,7 @@
             .clickable(onClick = onClick)
             .background(color = Color.LightGray),
         contentAlignment = Alignment.Center
-    ) { content() }
+    ) {
+        content()
+    }
 }
diff --git a/compose/foundation/foundation/samples/src/main/java/androidx/compose/foundation/samples/SelectableSamples.kt b/compose/foundation/foundation/samples/src/main/java/androidx/compose/foundation/samples/SelectableSamples.kt
index 887af98..512891d 100644
--- a/compose/foundation/foundation/samples/src/main/java/androidx/compose/foundation/samples/SelectableSamples.kt
+++ b/compose/foundation/foundation/samples/src/main/java/androidx/compose/foundation/samples/SelectableSamples.kt
@@ -45,13 +45,9 @@
             listOf(option1, option2).forEach { color ->
                 val selected = selectedOption == color
                 Box(
-                    Modifier
-                        .size(100.dp)
+                    Modifier.size(100.dp)
                         .background(color = color)
-                        .selectable(
-                            selected = selected,
-                            onClick = { selectedOption = color }
-                        )
+                        .selectable(selected = selected, onClick = { selectedOption = color })
                 )
             }
         }
diff --git a/compose/foundation/foundation/samples/src/main/java/androidx/compose/foundation/samples/SnapFlingBehaviorSample.kt b/compose/foundation/foundation/samples/src/main/java/androidx/compose/foundation/samples/SnapFlingBehaviorSample.kt
index 4d063ed..02fb1a0 100644
--- a/compose/foundation/foundation/samples/src/main/java/androidx/compose/foundation/samples/SnapFlingBehaviorSample.kt
+++ b/compose/foundation/foundation/samples/src/main/java/androidx/compose/foundation/samples/SnapFlingBehaviorSample.kt
@@ -53,11 +53,8 @@
     ) {
         items(200) {
             Box(
-                modifier = Modifier
-                    .height(400.dp)
-                    .width(200.dp)
-                    .padding(8.dp)
-                    .background(Color.Gray),
+                modifier =
+                    Modifier.height(400.dp).width(200.dp).padding(8.dp).background(Color.Gray),
                 contentAlignment = Alignment.Center
             ) {
                 Text(it.toString(), fontSize = 32.sp)
@@ -84,11 +81,8 @@
     ) {
         items(200) {
             Box(
-                modifier = Modifier
-                    .height(400.dp)
-                    .width(200.dp)
-                    .padding(8.dp)
-                    .background(Color.Gray),
+                modifier =
+                    Modifier.height(400.dp).width(200.dp).padding(8.dp).background(Color.Gray),
                 contentAlignment = Alignment.Center
             ) {
                 Text(it.toString(), fontSize = 32.sp)
@@ -106,21 +100,23 @@
 
     // Illustrate using a custom SnapPosition that will snap to a static location (200dp) after
     // the content padding.
-    val snappingLayout = remember(state, density) {
-        val snapPosition = object : SnapPosition {
-            override fun position(
-                layoutSize: Int,
-                itemSize: Int,
-                beforeContentPadding: Int,
-                afterContentPadding: Int,
-                itemIndex: Int,
-                itemCount: Int
-            ): Int {
-                return with(density) { beforeContentPadding + 200.dp.roundToPx() }
-            }
+    val snappingLayout =
+        remember(state, density) {
+            val snapPosition =
+                object : SnapPosition {
+                    override fun position(
+                        layoutSize: Int,
+                        itemSize: Int,
+                        beforeContentPadding: Int,
+                        afterContentPadding: Int,
+                        itemIndex: Int,
+                        itemCount: Int
+                    ): Int {
+                        return with(density) { beforeContentPadding + 200.dp.roundToPx() }
+                    }
+                }
+            SnapLayoutInfoProvider(state, snapPosition)
         }
-        SnapLayoutInfoProvider(state, snapPosition)
-    }
     val flingBehavior = rememberSnapFlingBehavior(snappingLayout)
 
     LazyRow(
@@ -131,11 +127,8 @@
     ) {
         items(200) {
             Box(
-                modifier = Modifier
-                    .height(400.dp)
-                    .width(200.dp)
-                    .padding(8.dp)
-                    .background(Color.Gray),
+                modifier =
+                    Modifier.height(400.dp).width(200.dp).padding(8.dp).background(Color.Gray),
                 contentAlignment = Alignment.Center
             ) {
                 Text(it.toString(), fontSize = 32.sp)
diff --git a/compose/foundation/foundation/samples/src/main/java/androidx/compose/foundation/samples/TapGestureSamples.kt b/compose/foundation/foundation/samples/src/main/java/androidx/compose/foundation/samples/TapGestureSamples.kt
index 08020bd..746c14a 100644
--- a/compose/foundation/foundation/samples/src/main/java/androidx/compose/foundation/samples/TapGestureSamples.kt
+++ b/compose/foundation/foundation/samples/src/main/java/androidx/compose/foundation/samples/TapGestureSamples.kt
@@ -41,9 +41,7 @@
 import androidx.compose.ui.input.pointer.pointerInput
 import androidx.compose.ui.unit.dp
 
-/**
- * Simple [awaitLongPressOrCancellation] demo.
- */
+/** Simple [awaitLongPressOrCancellation] demo. */
 @Composable
 @Sampled
 fun AwaitLongPressOrCancellationSample() {
@@ -58,9 +56,7 @@
                 .pointerInput(Unit) {
                     awaitEachGesture {
                         val down = awaitFirstDown(requireUnconsumed = false)
-                        awaitLongPressOrCancellation(down.id)?.let {
-                            count++
-                        }
+                        awaitLongPressOrCancellation(down.id)?.let { count++ }
                     }
                 }
                 .clipToBounds()
diff --git a/compose/foundation/foundation/samples/src/main/java/androidx/compose/foundation/samples/ToggleableSamples.kt b/compose/foundation/foundation/samples/src/main/java/androidx/compose/foundation/samples/ToggleableSamples.kt
index 0390aca..6157565 100644
--- a/compose/foundation/foundation/samples/src/main/java/androidx/compose/foundation/samples/ToggleableSamples.kt
+++ b/compose/foundation/foundation/samples/src/main/java/androidx/compose/foundation/samples/ToggleableSamples.kt
@@ -45,13 +45,15 @@
     var checked by remember { mutableStateOf(ToggleableState.Indeterminate) }
     // content that you want to make toggleable
     Text(
-        modifier = Modifier.triStateToggleable(
-            state = checked,
-            onClick = {
-                checked =
-                    if (checked == ToggleableState.On) ToggleableState.Off else ToggleableState.On
-            }
-        ),
+        modifier =
+            Modifier.triStateToggleable(
+                state = checked,
+                onClick = {
+                    checked =
+                        if (checked == ToggleableState.On) ToggleableState.Off
+                        else ToggleableState.On
+                }
+            ),
         text = checked.toString()
     )
 }
diff --git a/compose/foundation/foundation/samples/src/main/java/androidx/compose/foundation/samples/TransformGestureSamples.kt b/compose/foundation/foundation/samples/src/main/java/androidx/compose/foundation/samples/TransformGestureSamples.kt
index 1c9eddb..1227c94 100644
--- a/compose/foundation/foundation/samples/src/main/java/androidx/compose/foundation/samples/TransformGestureSamples.kt
+++ b/compose/foundation/foundation/samples/src/main/java/androidx/compose/foundation/samples/TransformGestureSamples.kt
@@ -71,8 +71,7 @@
     var angle by remember { mutableStateOf(0f) }
 
     Box(
-        Modifier
-            .pointerInput(Unit) {
+        Modifier.pointerInput(Unit) {
                 detectTransformGestures(
                     onGesture = { centroid, pan, gestureZoom, gestureRotate ->
                         val oldScale = zoom
@@ -84,8 +83,9 @@
                         // space), and then compute where it will be after this delta.
                         // We then compute what the new offset should be to keep the centroid
                         // visually stationary for rotating and zooming, and also apply the pan.
-                        offset = (offset + centroid / oldScale).rotateBy(gestureRotate) -
-                            (centroid / newScale + pan / oldScale)
+                        offset =
+                            (offset + centroid / oldScale).rotateBy(gestureRotate) -
+                                (centroid / newScale + pan / oldScale)
                         zoom = newScale
                         angle += gestureRotate
                     }
@@ -109,8 +109,7 @@
 fun CalculateRotation() {
     var angle by remember { mutableStateOf(0f) }
     Box(
-        Modifier
-            .graphicsLayer(rotationZ = angle)
+        Modifier.graphicsLayer(rotationZ = angle)
             .background(Color.Blue)
             .pointerInput(Unit) {
                 awaitEachGesture {
@@ -131,8 +130,7 @@
 fun CalculateZoom() {
     var zoom by remember { mutableStateOf(1f) }
     Box(
-        Modifier
-            .graphicsLayer(scaleX = zoom, scaleY = zoom)
+        Modifier.graphicsLayer(scaleX = zoom, scaleY = zoom)
             .background(Color.Blue)
             .pointerInput(Unit) {
                 awaitEachGesture {
@@ -153,8 +151,7 @@
     val offsetX = remember { mutableStateOf(0f) }
     val offsetY = remember { mutableStateOf(0f) }
     Box(
-        Modifier
-            .offset { IntOffset(offsetX.value.roundToInt(), offsetY.value.roundToInt()) }
+        Modifier.offset { IntOffset(offsetX.value.roundToInt(), offsetY.value.roundToInt()) }
             .graphicsLayer()
             .background(Color.Blue)
             .pointerInput(Unit) {
@@ -178,16 +175,13 @@
     var centroidSize by remember { mutableStateOf(0f) }
     var position by remember { mutableStateOf(Offset.Zero) }
     Box(
-        Modifier
-            .drawBehind {
+        Modifier.drawBehind {
                 // Draw a circle where the gesture is
                 drawCircle(Color.Blue, centroidSize, center = position)
             }
             .pointerInput(Unit) {
                 awaitEachGesture {
-                    awaitFirstDown().also {
-                        position = it.position
-                    }
+                    awaitFirstDown().also { position = it.position }
                     do {
                         val event = awaitPointerEvent()
                         val size = event.calculateCentroidSize()
diff --git a/compose/foundation/foundation/samples/src/main/java/androidx/compose/foundation/samples/TransformableSample.kt b/compose/foundation/foundation/samples/src/main/java/androidx/compose/foundation/samples/TransformableSample.kt
index cd45706..70c9293 100644
--- a/compose/foundation/foundation/samples/src/main/java/androidx/compose/foundation/samples/TransformableSample.kt
+++ b/compose/foundation/foundation/samples/src/main/java/androidx/compose/foundation/samples/TransformableSample.kt
@@ -55,12 +55,7 @@
 @Sampled
 @Composable
 fun TransformableSample() {
-    Box(
-        Modifier
-            .size(200.dp)
-            .clipToBounds()
-            .background(Color.LightGray)
-    ) {
+    Box(Modifier.size(200.dp).clipToBounds().background(Color.LightGray)) {
         // set up all transformation states
         var scale by remember { mutableStateOf(1f) }
         var rotation by remember { mutableStateOf(0f) }
@@ -83,9 +78,7 @@
                 // optional for example: add double click to zoom
                 .pointerInput(Unit) {
                     detectTapGestures(
-                        onDoubleTap = {
-                            coroutineScope.launch { state.animateZoomBy(4f) }
-                        }
+                        onDoubleTap = { coroutineScope.launch { state.animateZoomBy(4f) } }
                     )
                 }
                 .fillMaxSize()
@@ -96,11 +89,12 @@
                 "\uD83C\uDF55",
                 fontSize = 32.sp,
                 // apply other transformations like rotation and zoom on the pizza slice emoji
-                modifier = Modifier.graphicsLayer {
-                    scaleX = scale
-                    scaleY = scale
-                    rotationZ = rotation
-                }
+                modifier =
+                    Modifier.graphicsLayer {
+                        scaleX = scale
+                        scaleY = scale
+                        rotationZ = rotation
+                    }
             )
         }
     }
@@ -110,18 +104,9 @@
 @Sampled
 @Composable
 fun TransformableSampleInsideScroll() {
-    Row(
-        Modifier
-            .size(width = 120.dp, height = 100.dp)
-            .horizontalScroll(rememberScrollState())
-    ) {
+    Row(Modifier.size(width = 120.dp, height = 100.dp).horizontalScroll(rememberScrollState())) {
         // first child of the scrollable row is a transformable
-        Box(
-            Modifier
-                .size(100.dp)
-                .clipToBounds()
-                .background(Color.LightGray)
-        ) {
+        Box(Modifier.size(100.dp).clipToBounds().background(Color.LightGray)) {
             // set up all transformation states
             var scale by remember { mutableStateOf(1f) }
             var rotation by remember { mutableStateOf(0f) }
@@ -146,9 +131,7 @@
                     // optional for example: add double click to zoom
                     .pointerInput(Unit) {
                         detectTapGestures(
-                            onDoubleTap = {
-                                coroutineScope.launch { state.animateZoomBy(4f) }
-                            }
+                            onDoubleTap = { coroutineScope.launch { state.animateZoomBy(4f) } }
                         )
                     }
                     .fillMaxSize()
@@ -159,20 +142,16 @@
                     "\uD83C\uDF55",
                     fontSize = 32.sp,
                     // apply other transformations like rotation and zoom on the pizza slice emoji
-                    modifier = Modifier.graphicsLayer {
-                        scaleX = scale
-                        scaleY = scale
-                        rotationZ = rotation
-                    }
+                    modifier =
+                        Modifier.graphicsLayer {
+                            scaleX = scale
+                            scaleY = scale
+                            rotationZ = rotation
+                        }
                 )
             }
         }
         // other children are just colored boxes
-        Box(
-            Modifier
-                .size(100.dp)
-                .background(Color.Red)
-                .border(2.dp, Color.Black)
-        )
+        Box(Modifier.size(100.dp).background(Color.Red).border(2.dp, Color.Black))
     }
 }
diff --git a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/AndroidEmbeddedExternalSurfaceTest.kt b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/AndroidEmbeddedExternalSurfaceTest.kt
index aba6d0a..c2691df 100644
--- a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/AndroidEmbeddedExternalSurfaceTest.kt
+++ b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/AndroidEmbeddedExternalSurfaceTest.kt
@@ -57,8 +57,7 @@
 @SdkSuppress(minSdkVersion = Build.VERSION_CODES.O)
 @RunWith(AndroidJUnit4::class)
 class AndroidEmbeddedExternalSurfaceTest {
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
     val size = 48.dp
 
@@ -70,9 +69,7 @@
         var expectedSize = 0
 
         rule.setContent {
-            expectedSize = with(LocalDensity.current) {
-                size.toPx().roundToInt()
-            }
+            expectedSize = with(LocalDensity.current) { size.toPx().roundToInt() }
 
             AndroidEmbeddedExternalSurface(modifier = Modifier.size(size)) {
                 onSurface { surface, width, height ->
@@ -83,10 +80,7 @@
             }
         }
 
-        rule.onRoot()
-            .assertWidthIsEqualTo(size)
-            .assertHeightIsEqualTo(size)
-            .assertIsDisplayed()
+        rule.onRoot().assertWidthIsEqualTo(size).assertHeightIsEqualTo(size).assertIsDisplayed()
 
         rule.runOnIdle {
             assertNotNull(surfaceRef)
@@ -104,9 +98,7 @@
         var desiredSize by mutableStateOf(size)
 
         rule.setContent {
-            expectedSize = with(LocalDensity.current) {
-                desiredSize.toPx().roundToInt()
-            }
+            expectedSize = with(LocalDensity.current) { desiredSize.toPx().roundToInt() }
 
             AndroidEmbeddedExternalSurface(modifier = Modifier.size(desiredSize)) {
                 onSurface { surface, initWidth, initHeight ->
@@ -121,9 +113,7 @@
             }
         }
 
-        rule.onRoot()
-            .assertWidthIsEqualTo(desiredSize)
-            .assertHeightIsEqualTo(desiredSize)
+        rule.onRoot().assertWidthIsEqualTo(desiredSize).assertHeightIsEqualTo(desiredSize)
 
         rule.runOnIdle {
             assertEquals(expectedSize, surfaceWidth)
@@ -134,9 +124,7 @@
         val prevSurfaceWidth = surfaceWidth
         val prevSurfaceHeight = surfaceHeight
 
-        rule.onRoot()
-            .assertWidthIsEqualTo(desiredSize)
-            .assertHeightIsEqualTo(desiredSize)
+        rule.onRoot().assertWidthIsEqualTo(desiredSize).assertHeightIsEqualTo(desiredSize)
 
         rule.runOnIdle {
             assertNotEquals(prevSurfaceWidth, surfaceWidth)
@@ -157,23 +145,17 @@
                     onSurface { surface, _, _ ->
                         surfaceRef = surface
 
-                        surface.onDestroyed {
-                            surfaceRef = null
-                        }
+                        surface.onDestroyed { surfaceRef = null }
                     }
                 }
             }
         }
 
-        rule.runOnIdle {
-            assertNotNull(surfaceRef)
-        }
+        rule.runOnIdle { assertNotNull(surfaceRef) }
 
         visible = false
 
-        rule.runOnIdle {
-            assertNull(surfaceRef)
-        }
+        rule.runOnIdle { assertNull(surfaceRef) }
     }
 
     @Test
@@ -189,9 +171,7 @@
                 AndroidEmbeddedExternalSurface(modifier = Modifier.size(size)) {
                     onSurface { surface, _, _ ->
                         surfaceCreatedCount++
-                        surface.onDestroyed {
-                            surfaceDestroyedCount++
-                        }
+                        surface.onDestroyed { surfaceDestroyedCount++ }
                     }
                 }
             }
@@ -221,9 +201,7 @@
         var expectedSize = 0
 
         rule.setContent {
-            expectedSize = with(LocalDensity.current) {
-                size.toPx().roundToInt()
-            }
+            expectedSize = with(LocalDensity.current) { size.toPx().roundToInt() }
             AndroidEmbeddedExternalSurface(modifier = Modifier.size(size)) {
                 onSurface { surface, _, _ ->
                     surfaceRef = surface
@@ -235,13 +213,9 @@
             }
         }
 
-        rule.runOnIdle {
-            assertNotNull(surfaceRef)
-        }
+        rule.runOnIdle { assertNotNull(surfaceRef) }
 
-        surfaceRef!!
-            .captureToImage(expectedSize, expectedSize)
-            .assertPixels { Color.Blue }
+        surfaceRef!!.captureToImage(expectedSize, expectedSize).assertPixels { Color.Blue }
     }
 
     @Test
@@ -250,13 +224,9 @@
 
         rule.setContent {
             Box(modifier = Modifier.size(size)) {
-                Canvas(modifier = Modifier.size(size)) {
-                    drawRect(Color.White)
-                }
+                Canvas(modifier = Modifier.size(size)) { drawRect(Color.White) }
                 AndroidEmbeddedExternalSurface(
-                    modifier = Modifier
-                        .size(size)
-                        .testTag("EmbeddedExternalSurface"),
+                    modifier = Modifier.size(size).testTag("EmbeddedExternalSurface"),
                     isOpaque = false
                 ) {
                     onSurface { surface, _, _ ->
@@ -272,23 +242,18 @@
 
         val expectedColor = Color(ColorUtils.compositeColors(translucentRed, Color.White.toArgb()))
 
-        rule
-            .onNodeWithTag("EmbeddedExternalSurface")
-            .captureToImage()
-            .assertPixels { expectedColor }
+        rule.onNodeWithTag("EmbeddedExternalSurface").captureToImage().assertPixels {
+            expectedColor
+        }
     }
 
     @Test
     fun testOpaque() {
         rule.setContent {
             Box(modifier = Modifier.size(size)) {
-                Canvas(modifier = Modifier.size(size)) {
-                    drawRect(Color.Green)
-                }
+                Canvas(modifier = Modifier.size(size)) { drawRect(Color.Green) }
                 AndroidEmbeddedExternalSurface(
-                    modifier = Modifier
-                        .size(size)
-                        .testTag("EmbeddedExternalSurface")
+                    modifier = Modifier.size(size).testTag("EmbeddedExternalSurface")
                 ) {
                     onSurface { surface, _, _ ->
                         surface.lockHardwareCanvas().apply {
@@ -300,10 +265,7 @@
             }
         }
 
-        rule
-            .onNodeWithTag("EmbeddedExternalSurface")
-            .captureToImage()
-            .assertPixels { Color.Red }
+        rule.onNodeWithTag("EmbeddedExternalSurface").captureToImage().assertPixels { Color.Red }
     }
 
     @Test
@@ -311,19 +273,16 @@
         var expectedSize = 0
 
         rule.setContent {
-            expectedSize = with(LocalDensity.current) {
-                size.toPx().roundToInt()
-            }
+            expectedSize = with(LocalDensity.current) { size.toPx().roundToInt() }
             AndroidEmbeddedExternalSurface(
-                modifier = Modifier
-                    .size(size)
-                    .testTag("EmbeddedExternalSurface"),
-                transform = Matrix().apply {
-                    val s = expectedSize / 2.0f
-                    translate(s, s)
-                    rotateZ(180.0f)
-                    translate(-s, -s)
-                }
+                modifier = Modifier.size(size).testTag("EmbeddedExternalSurface"),
+                transform =
+                    Matrix().apply {
+                        val s = expectedSize / 2.0f
+                        translate(s, s)
+                        rotateZ(180.0f)
+                        translate(-s, -s)
+                    }
             ) {
                 onSurface { surface, _, _ ->
                     // Draw the top half in red, the bottom half in blue
@@ -347,9 +306,8 @@
         }
 
         val halfHeight = (expectedSize.toFloat() / 2.0f).roundToInt()
-        rule
-            .onNodeWithTag("EmbeddedExternalSurface")
-            .captureToImage()
-            .assertPixels { if (it.y < halfHeight) Color.Blue else Color.Red }
+        rule.onNodeWithTag("EmbeddedExternalSurface").captureToImage().assertPixels {
+            if (it.y < halfHeight) Color.Blue else Color.Red
+        }
     }
 }
diff --git a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/AndroidExternalSurfaceTest.kt b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/AndroidExternalSurfaceTest.kt
index 4d0efc2..505fc59 100644
--- a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/AndroidExternalSurfaceTest.kt
+++ b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/AndroidExternalSurfaceTest.kt
@@ -85,8 +85,7 @@
 @SdkSuppress(minSdkVersion = Build.VERSION_CODES.TIRAMISU)
 @RunWith(AndroidJUnit4::class)
 class AndroidExternalSurfaceTest {
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
     val size = 48.dp
 
@@ -98,9 +97,7 @@
         var expectedSize = 0
 
         rule.setContent {
-            expectedSize = with(LocalDensity.current) {
-                size.toPx().roundToInt()
-            }
+            expectedSize = with(LocalDensity.current) { size.toPx().roundToInt() }
 
             AndroidExternalSurface(modifier = Modifier.size(size)) {
                 onSurface { surface, width, height ->
@@ -111,10 +108,7 @@
             }
         }
 
-        rule.onRoot()
-            .assertWidthIsEqualTo(size)
-            .assertHeightIsEqualTo(size)
-            .assertIsDisplayed()
+        rule.onRoot().assertWidthIsEqualTo(size).assertHeightIsEqualTo(size).assertIsDisplayed()
 
         rule.runOnIdle {
             assertNotNull(surfaceRef)
@@ -132,9 +126,7 @@
         var desiredSize by mutableStateOf(size)
 
         rule.setContent {
-            expectedSize = with(LocalDensity.current) {
-                desiredSize.toPx().roundToInt()
-            }
+            expectedSize = with(LocalDensity.current) { desiredSize.toPx().roundToInt() }
 
             AndroidExternalSurface(modifier = Modifier.size(desiredSize)) {
                 onSurface { surface, _, _ ->
@@ -146,9 +138,7 @@
             }
         }
 
-        rule.onRoot()
-            .assertWidthIsEqualTo(desiredSize)
-            .assertHeightIsEqualTo(desiredSize)
+        rule.onRoot().assertWidthIsEqualTo(desiredSize).assertHeightIsEqualTo(desiredSize)
 
         // onChanged() hasn't been called yet
         rule.runOnIdle {
@@ -160,9 +150,7 @@
         val prevSurfaceWidth = surfaceWidth
         val prevSurfaceHeight = surfaceHeight
 
-        rule.onRoot()
-            .assertWidthIsEqualTo(desiredSize)
-            .assertHeightIsEqualTo(desiredSize)
+        rule.onRoot().assertWidthIsEqualTo(desiredSize).assertHeightIsEqualTo(desiredSize)
 
         rule.runOnIdle {
             assertNotEquals(prevSurfaceWidth, surfaceWidth)
@@ -183,23 +171,17 @@
                     onSurface { surface, _, _ ->
                         surfaceRef = surface
 
-                        surface.onDestroyed {
-                            surfaceRef = null
-                        }
+                        surface.onDestroyed { surfaceRef = null }
                     }
                 }
             }
         }
 
-        rule.runOnIdle {
-            assertNotNull(surfaceRef)
-        }
+        rule.runOnIdle { assertNotNull(surfaceRef) }
 
         visible = false
 
-        rule.runOnIdle {
-            assertNull(surfaceRef)
-        }
+        rule.runOnIdle { assertNull(surfaceRef) }
     }
 
     @Test
@@ -214,9 +196,7 @@
             AndroidExternalSurface(modifier = Modifier.size(size)) {
                 onSurface { surface, _, _ ->
                     surfaceCreatedCount++
-                    surface.onDestroyed {
-                        surfaceDestroyedCount++
-                    }
+                    surface.onDestroyed { surfaceDestroyedCount++ }
                 }
             }
         }
@@ -249,9 +229,7 @@
         var expectedSize = 0
 
         rule.setContent {
-            expectedSize = with(LocalDensity.current) {
-                size.toPx().roundToInt()
-            }
+            expectedSize = with(LocalDensity.current) { size.toPx().roundToInt() }
             AndroidExternalSurface(modifier = Modifier.size(size)) {
                 onSurface { surface, _, _ ->
                     surfaceRef = surface
@@ -263,13 +241,9 @@
             }
         }
 
-        rule.runOnIdle {
-            assertNotNull(surfaceRef)
-        }
+        rule.runOnIdle { assertNotNull(surfaceRef) }
 
-        surfaceRef!!
-            .captureToImage(expectedSize, expectedSize)
-            .assertPixels { Color.Blue }
+        surfaceRef!!.captureToImage(expectedSize, expectedSize).assertPixels { Color.Blue }
     }
 
     @Test
@@ -285,11 +259,7 @@
 
         rule.setContent {
             Box(modifier = Modifier.size(size)) {
-                AndroidExternalSurface(
-                    modifier = Modifier
-                        .size(size)
-                        .testTag("GraphicSurface")
-                ) {
+                AndroidExternalSurface(modifier = Modifier.size(size).testTag("GraphicSurface")) {
                     onSurface { surface, _, _ ->
                         // Draw > 3 frames to make sure the screenshot copy will pick up
                         // a SurfaceFlinger composition that includes our Surface
@@ -304,9 +274,7 @@
                         }
                     }
                 }
-                Canvas(modifier = Modifier.size(size)) {
-                    drawRect(Color.Green)
-                }
+                Canvas(modifier = Modifier.size(size)) { drawRect(Color.Green) }
             }
         }
 
@@ -314,10 +282,7 @@
             throw AssertionError("Failed waiting for render")
         }
 
-        rule
-            .onNodeWithTag("GraphicSurface")
-            .screenshotToImage()!!
-            .assertPixels { Color.Green }
+        rule.onNodeWithTag("GraphicSurface").screenshotToImage()!!.assertPixels { Color.Green }
     }
 
     @Test
@@ -352,9 +317,7 @@
                     }
                 }
                 AndroidExternalSurface(
-                    modifier = Modifier
-                        .size(size)
-                        .testTag("GraphicSurface"),
+                    modifier = Modifier.size(size).testTag("GraphicSurface"),
                     zOrder = AndroidExternalSurfaceZOrder.MediaOverlay
                 ) {
                     onSurface { surface, _, _ ->
@@ -376,10 +339,7 @@
             throw AssertionError("Failed waiting for render")
         }
 
-        rule
-            .onNodeWithTag("GraphicSurface")
-            .screenshotToImage()!!
-            .assertPixels { Color.Red }
+        rule.onNodeWithTag("GraphicSurface").screenshotToImage()!!.assertPixels { Color.Red }
     }
 
     @Test
@@ -396,9 +356,7 @@
         rule.setContent {
             Box(modifier = Modifier.size(size)) {
                 AndroidExternalSurface(
-                    modifier = Modifier
-                        .size(size)
-                        .testTag("GraphicSurface"),
+                    modifier = Modifier.size(size).testTag("GraphicSurface"),
                     zOrder = AndroidExternalSurfaceZOrder.OnTop
                 ) {
                     onSurface { surface, _, _ ->
@@ -415,9 +373,7 @@
                         }
                     }
                 }
-                Canvas(modifier = Modifier.size(size)) {
-                    drawRect(Color.Green)
-                }
+                Canvas(modifier = Modifier.size(size)) { drawRect(Color.Green) }
             }
         }
 
@@ -425,10 +381,7 @@
             throw AssertionError("Failed waiting for render")
         }
 
-        rule
-            .onNodeWithTag("GraphicSurface")
-            .screenshotToImage()!!
-            .assertPixels { Color.Blue }
+        rule.onNodeWithTag("GraphicSurface").screenshotToImage()!!.assertPixels { Color.Blue }
     }
 
     @Test
@@ -446,9 +399,7 @@
         rule.setContent {
             Box(modifier = Modifier.size(size)) {
                 AndroidExternalSurface(
-                    modifier = Modifier
-                        .size(size)
-                        .testTag("GraphicSurface"),
+                    modifier = Modifier.size(size).testTag("GraphicSurface"),
                     isOpaque = false,
                     zOrder = AndroidExternalSurfaceZOrder.OnTop
                 ) {
@@ -469,9 +420,7 @@
                         }
                     }
                 }
-                Canvas(modifier = Modifier.size(size)) {
-                    drawRect(Color.White)
-                }
+                Canvas(modifier = Modifier.size(size)) { drawRect(Color.White) }
             }
         }
 
@@ -481,10 +430,7 @@
 
         val expectedColor = Color(ColorUtils.compositeColors(translucentRed, Color.White.toArgb()))
 
-        rule
-            .onNodeWithTag("GraphicSurface")
-            .screenshotToImage()!!
-            .assertPixels { expectedColor }
+        rule.onNodeWithTag("GraphicSurface").screenshotToImage()!!.assertPixels { expectedColor }
     }
 
     @Test
@@ -500,9 +446,7 @@
 
         rule.setContent {
             AndroidExternalSurface(
-                modifier = Modifier
-                    .size(size)
-                    .testTag("GraphicSurface"),
+                modifier = Modifier.size(size).testTag("GraphicSurface"),
                 isSecure = true
             ) {
                 onSurface { surface, _, _ ->
@@ -525,9 +469,7 @@
             throw AssertionError("Failed waiting for render")
         }
 
-        val screen = rule
-            .onNodeWithTag("GraphicSurface")
-            .screenshotToImage(true)
+        val screen = rule.onNodeWithTag("GraphicSurface").screenshotToImage(true)
 
         // Before API 33 taking a screenshot with a secure surface returns null
         if (Build.VERSION.SDK_INT < Build.VERSION_CODES.TIRAMISU) {
@@ -539,8 +481,8 @@
 }
 
 /**
- * Returns an ImageBitmap containing a screenshot of the device. On API < 33,
- * a secure surface present on screen can cause this function to return null.
+ * Returns an ImageBitmap containing a screenshot of the device. On API < 33, a secure surface
+ * present on screen can cause this function to return null.
  */
 private fun SemanticsNodeInteraction.screenshotToImage(
     hasSecureSurfaces: Boolean = false
@@ -556,54 +498,57 @@
     return withDrawingEnabled {
         val bitmapFuture: ResolvableFuture<Bitmap> = ResolvableFuture.create()
 
-        var cleanup = { }
+        var cleanup = {}
 
         val mainExecutor = HandlerExecutor(Handler(Looper.getMainLooper()))
         mainExecutor.execute {
-            cleanup = view.waitForWindowManager {
-                Choreographer.getInstance().postFrameCallback {
-                    val location = IntArray(2)
-                    view.getLocationOnScreen(location)
+            cleanup =
+                view.waitForWindowManager {
+                    Choreographer.getInstance().postFrameCallback {
+                        val location = IntArray(2)
+                        view.getLocationOnScreen(location)
 
-                    val bounds = node.boundsInRoot.translate(
-                        location[0].toFloat(),
-                        location[1].toFloat()
-                    ).deflate(1.0f) // inset the rectangle to avoid rounding errors
+                        val bounds =
+                            node.boundsInRoot
+                                .translate(location[0].toFloat(), location[1].toFloat())
+                                .deflate(1.0f) // inset the rectangle to avoid rounding errors
 
-                    // do multiple retries of uiAutomation.takeScreenshot because it is
-                    // known to return null on API 31+ b/257274080
-                    var bitmap: Bitmap? = null
-                    var i = 0
-                    while (i < 3 && bitmap == null) {
-                        bitmap = uiAutomation.takeScreenshot()
-                        i++
-                    }
-
-                    if (bitmap != null) {
-                        bitmap = Bitmap.createBitmap(
-                            bitmap,
-                            bounds.left.toInt(),
-                            bounds.top.toInt(),
-                            bounds.width.toInt(),
-                            bounds.height.toInt()
-                        )
-                        bitmapFuture.set(bitmap)
-                    } else {
-                        if (hasSecureSurfaces) {
-                            // may be null on older API levels when a secure surface is showing
-                            bitmapFuture.set(null)
+                        // do multiple retries of uiAutomation.takeScreenshot because it is
+                        // known to return null on API 31+ b/257274080
+                        var bitmap: Bitmap? = null
+                        var i = 0
+                        while (i < 3 && bitmap == null) {
+                            bitmap = uiAutomation.takeScreenshot()
+                            i++
                         }
-                        // if we don't show secure surfaces, let the future timeout on get()
+
+                        if (bitmap != null) {
+                            bitmap =
+                                Bitmap.createBitmap(
+                                    bitmap,
+                                    bounds.left.toInt(),
+                                    bounds.top.toInt(),
+                                    bounds.width.toInt(),
+                                    bounds.height.toInt()
+                                )
+                            bitmapFuture.set(bitmap)
+                        } else {
+                            if (hasSecureSurfaces) {
+                                // may be null on older API levels when a secure surface is showing
+                                bitmapFuture.set(null)
+                            }
+                            // if we don't show secure surfaces, let the future timeout on get()
+                        }
                     }
                 }
-            }
         }
 
-        val bitmap = try {
-            bitmapFuture.get(5, TimeUnit.SECONDS)?.asImageBitmap()
-        } catch (e: ExecutionException) {
-            null
-        }
+        val bitmap =
+            try {
+                bitmapFuture.get(5, TimeUnit.SECONDS)?.asImageBitmap()
+            } catch (e: ExecutionException) {
+                null
+            }
 
         cleanup()
 
@@ -617,10 +562,11 @@
 
     val latch = CountDownLatch(1)
     var copyResult = 0
-    val onCopyFinished = PixelCopy.OnPixelCopyFinishedListener { result ->
-        copyResult = result
-        latch.countDown()
-    }
+    val onCopyFinished =
+        PixelCopy.OnPixelCopyFinishedListener { result ->
+            copyResult = result
+            latch.countDown()
+        }
 
     PixelCopy.request(
         this,
@@ -656,37 +602,37 @@
 }
 
 /**
- * Waits for the WindowManager to be "ready" and then runs [onWindowManagerReady].
- * The wait is implemented by creating a new window and waiting for its content to
- * draw once. Doing so should in theory guarantee that SurfaceViews from the parent
- * window are also ready and visible, and thus reduce flakes.
+ * Waits for the WindowManager to be "ready" and then runs [onWindowManagerReady]. The wait is
+ * implemented by creating a new window and waiting for its content to draw once. Doing so should in
+ * theory guarantee that SurfaceViews from the parent window are also ready and visible, and thus
+ * reduce flakes.
  *
- * This method returns a lambda that must be executed to perform cleanup before
- * the test finishes and the activity is torn down.
+ * This method returns a lambda that must be executed to perform cleanup before the test finishes
+ * and the activity is torn down.
  */
 @UiThread
 private fun View.waitForWindowManager(onWindowManagerReady: () -> Unit): () -> Unit {
-    val subWindow = TextView(context).apply {
-        text = "WM Ready"
-        setBackgroundColor(Color.White.toArgb())
-    }
+    val subWindow =
+        TextView(context).apply {
+            text = "WM Ready"
+            setBackgroundColor(Color.White.toArgb())
+        }
 
     val windowManager = context.getSystemService<WindowManager>()!!
     windowManager.addView(
         subWindow,
         WindowManager.LayoutParams(
-            WindowManager.LayoutParams.TYPE_APPLICATION_PANEL,
-            WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE
-        ).apply {
-            width = WindowManager.LayoutParams.WRAP_CONTENT
-            height = WindowManager.LayoutParams.WRAP_CONTENT
-            gravity = Gravity.RIGHT or Gravity.BOTTOM
-        }
+                WindowManager.LayoutParams.TYPE_APPLICATION_PANEL,
+                WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE
+            )
+            .apply {
+                width = WindowManager.LayoutParams.WRAP_CONTENT
+                height = WindowManager.LayoutParams.WRAP_CONTENT
+                gravity = Gravity.RIGHT or Gravity.BOTTOM
+            }
     )
 
-    subWindow.doOnPreDraw {
-        onWindowManagerReady()
-    }
+    subWindow.doOnPreDraw { onWindowManagerReady() }
 
     return { windowManager.removeView(subWindow) }
 }
diff --git a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/BackgroundTest.kt b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/BackgroundTest.kt
index 4e1ab73..ec0d5b9 100644
--- a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/BackgroundTest.kt
+++ b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/BackgroundTest.kt
@@ -65,22 +65,23 @@
 @RunWith(AndroidJUnit4::class)
 class BackgroundTest {
 
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
     private val contentTag = "Content"
 
-    private val rtlAwareShape = object : Shape {
-        override fun createOutline(
-            size: Size,
-            layoutDirection: LayoutDirection,
-            density: Density
-        ) = if (layoutDirection == LayoutDirection.Ltr) {
-            RectangleShape.createOutline(size, layoutDirection, density)
-        } else {
-            CircleShape.createOutline(size, layoutDirection, density)
+    private val rtlAwareShape =
+        object : Shape {
+            override fun createOutline(
+                size: Size,
+                layoutDirection: LayoutDirection,
+                density: Density
+            ) =
+                if (layoutDirection == LayoutDirection.Ltr) {
+                    RectangleShape.createOutline(size, layoutDirection, density)
+                } else {
+                    CircleShape.createOutline(size, layoutDirection, density)
+                }
         }
-    }
 
     @Before
     fun before() {
@@ -97,15 +98,10 @@
         rule.setContent {
             SemanticParent {
                 Box(
-                    Modifier
-                        .size(40f.toDp())
-                        .background(Color.Magenta),
+                    Modifier.size(40f.toDp()).background(Color.Magenta),
                     contentAlignment = Alignment.Center
                 ) {
-                    Box(
-                        Modifier
-                            .size(20f.toDp())
-                            .background(Color.White))
+                    Box(Modifier.size(20f.toDp()).background(Color.White))
                 }
             }
         }
@@ -125,16 +121,10 @@
         rule.setContent {
             SemanticParent {
                 Box(
-                    Modifier
-                        .size(40f.toDp())
-                        .background(Color.Magenta),
+                    Modifier.size(40f.toDp()).background(Color.Magenta),
                     contentAlignment = Alignment.Center
                 ) {
-                    Box(
-                        Modifier
-                            .size(20f.toDp())
-                            .background(SolidColor(Color.White))
-                    )
+                    Box(Modifier.size(20f.toDp()).background(SolidColor(Color.White)))
                 }
             }
         }
@@ -154,8 +144,7 @@
         rule.setContent {
             SemanticParent {
                 Box(
-                    Modifier
-                        .size(40f.toDp())
+                    Modifier.size(40f.toDp())
                         .background(Color.Magenta)
                         .background(color = Color.White, shape = CircleShape)
                 )
@@ -176,13 +165,9 @@
         rule.setContent {
             SemanticParent {
                 Box(
-                    Modifier
-                        .size(40f.toDp())
+                    Modifier.size(40f.toDp())
                         .background(Color.Magenta)
-                        .background(
-                            brush = SolidColor(Color.White),
-                            shape = CircleShape
-                        )
+                        .background(brush = SolidColor(Color.White), shape = CircleShape)
                 )
             }
         }
@@ -203,8 +188,7 @@
         rule.setContent {
             SemanticParent {
                 Box(
-                    Modifier
-                        .size(40f.toDp())
+                    Modifier.size(40f.toDp())
                         .background(Color.Magenta)
                         .background(color = Color.White, shape = shape)
                 )
@@ -237,25 +221,25 @@
     fun background_changeOutline_differentPaths_observableShape() {
         var roundCorners by mutableStateOf(false)
 
-        val shape = object : Shape {
-            override fun createOutline(
-                size: Size,
-                layoutDirection: LayoutDirection,
-                density: Density
-            ): Outline {
-                return if (roundCorners) {
-                    RoundedCornerShape(50f).createOutline(size, layoutDirection, density)
-                } else {
-                    RectangleShape.createOutline(size, layoutDirection, density)
+        val shape =
+            object : Shape {
+                override fun createOutline(
+                    size: Size,
+                    layoutDirection: LayoutDirection,
+                    density: Density
+                ): Outline {
+                    return if (roundCorners) {
+                        RoundedCornerShape(50f).createOutline(size, layoutDirection, density)
+                    } else {
+                        RectangleShape.createOutline(size, layoutDirection, density)
+                    }
                 }
             }
-        }
 
         rule.setContent {
             SemanticParent {
                 Box(
-                    Modifier
-                        .size(40f.toDp())
+                    Modifier.size(40f.toDp())
                         .background(Color.Magenta)
                         .background(color = Color.White, shape = shape)
                 )
@@ -301,28 +285,29 @@
         var roundCorners by mutableStateOf(false)
 
         val path = Path()
-        val shape = object : Shape {
-            override fun createOutline(
-                size: Size,
-                layoutDirection: LayoutDirection,
-                density: Density
-            ): Outline {
-                val outlineToAdd = if (roundCorners) {
-                    RoundedCornerShape(50f).createOutline(size, layoutDirection, density)
-                } else {
-                    RectangleShape.createOutline(size, layoutDirection, density)
+        val shape =
+            object : Shape {
+                override fun createOutline(
+                    size: Size,
+                    layoutDirection: LayoutDirection,
+                    density: Density
+                ): Outline {
+                    val outlineToAdd =
+                        if (roundCorners) {
+                            RoundedCornerShape(50f).createOutline(size, layoutDirection, density)
+                        } else {
+                            RectangleShape.createOutline(size, layoutDirection, density)
+                        }
+                    path.reset()
+                    path.addOutline(outlineToAdd)
+                    return Outline.Generic(path)
                 }
-                path.reset()
-                path.addOutline(outlineToAdd)
-                return Outline.Generic(path)
             }
-        }
 
         rule.setContent {
             SemanticParent {
                 Box(
-                    Modifier
-                        .size(40f.toDp())
+                    Modifier.size(40f.toDp())
                         .background(Color.Magenta)
                         .background(color = Color.White, shape = shape)
                 )
@@ -369,13 +354,9 @@
             SemanticParent {
                 CompositionLocalProvider(LocalLayoutDirection provides LayoutDirection.Rtl) {
                     Box(
-                        Modifier
-                            .size(40f.toDp())
+                        Modifier.size(40f.toDp())
                             .background(Color.Magenta)
-                            .background(
-                                brush = SolidColor(Color.White),
-                                shape = rtlAwareShape
-                            )
+                            .background(brush = SolidColor(Color.White), shape = rtlAwareShape)
                     )
                 }
             }
@@ -397,28 +378,25 @@
             SemanticParent {
                 CompositionLocalProvider(LocalLayoutDirection provides direction.value) {
                     Box(
-                        Modifier
-                            .size(40f.toDp())
+                        Modifier.size(40f.toDp())
                             .background(Color.Magenta)
-                            .background(
-                                brush = SolidColor(Color.White),
-                                shape = rtlAwareShape
-                            )
+                            .background(brush = SolidColor(Color.White), shape = rtlAwareShape)
                     )
                 }
             }
         }
 
-        rule.runOnIdle {
-            direction.value = LayoutDirection.Rtl
-        }
-        rule.onNodeWithTag(contentTag).captureToImage().assertShape(
-            density = rule.density,
-            backgroundColor = Color.Magenta,
-            shape = CircleShape,
-            shapeColor = Color.White,
-            shapeOverlapPixelCount = 2.0f
-        )
+        rule.runOnIdle { direction.value = LayoutDirection.Rtl }
+        rule
+            .onNodeWithTag(contentTag)
+            .captureToImage()
+            .assertShape(
+                density = rule.density,
+                backgroundColor = Color.Magenta,
+                shape = CircleShape,
+                shapeColor = Color.White,
+                shapeOverlapPixelCount = 2.0f
+            )
     }
 
     @Test
@@ -426,10 +404,11 @@
         val modifier = Modifier.background(Color.Magenta) as InspectableValue
         assertThat(modifier.nameFallback).isEqualTo("background")
         assertThat(modifier.valueOverride).isEqualTo(Color.Magenta)
-        assertThat(modifier.inspectableElements.asIterable()).containsExactly(
-            ValueElement("color", Color.Magenta),
-            ValueElement("shape", RectangleShape)
-        )
+        assertThat(modifier.inspectableElements.asIterable())
+            .containsExactly(
+                ValueElement("color", Color.Magenta),
+                ValueElement("shape", RectangleShape)
+            )
     }
 
     @Test
@@ -437,11 +416,12 @@
         val modifier = Modifier.background(SolidColor(Color.Red)) as InspectableValue
         assertThat(modifier.nameFallback).isEqualTo("background")
         assertThat(modifier.valueOverride).isNull()
-        assertThat(modifier.inspectableElements.asIterable()).containsExactly(
-            ValueElement("alpha", 1.0f),
-            ValueElement("brush", SolidColor(Color.Red)),
-            ValueElement("shape", RectangleShape)
-        )
+        assertThat(modifier.inspectableElements.asIterable())
+            .containsExactly(
+                ValueElement("alpha", 1.0f),
+                ValueElement("brush", SolidColor(Color.Red)),
+                ValueElement("shape", RectangleShape)
+            )
     }
 
     @Test
@@ -471,8 +451,6 @@
 
     @Composable
     private fun SemanticParent(content: @Composable Density.() -> Unit) {
-        Box(Modifier.testTag(contentTag)) {
-            LocalDensity.current.content()
-        }
+        Box(Modifier.testTag(contentTag)) { LocalDensity.current.content() }
     }
 }
diff --git a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/BaseLazyLayoutTestWithOrientation.kt b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/BaseLazyLayoutTestWithOrientation.kt
index 0425e5a..c170ad2 100644
--- a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/BaseLazyLayoutTestWithOrientation.kt
+++ b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/BaseLazyLayoutTestWithOrientation.kt
@@ -42,8 +42,7 @@
 import org.junit.Rule
 
 open class BaseLazyLayoutTestWithOrientation(private val orientation: Orientation) {
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
     val vertical: Boolean
         get() = orientation == Orientation.Vertical
@@ -111,11 +110,12 @@
         }
 
     fun SemanticsNodeInteraction.assertStartPositionIsAlmost(expected: Dp) {
-        val position = if (vertical) {
-            getUnclippedBoundsInRoot().top
-        } else {
-            getUnclippedBoundsInRoot().left
-        }
+        val position =
+            if (vertical) {
+                getUnclippedBoundsInRoot().top
+            } else {
+                getUnclippedBoundsInRoot().left
+            }
         position.assertIsEqualTo(expected, tolerance = 1.dp)
     }
 
@@ -140,45 +140,41 @@
             assertTopPositionInRootIsEqualTo(expectedStart)
         }
 
-    fun SemanticsNodeInteraction.assertAxisBounds(
-        offset: DpOffset,
-        size: DpSize
-    ) =
+    fun SemanticsNodeInteraction.assertAxisBounds(offset: DpOffset, size: DpSize) =
         assertMainAxisStartPositionInRootIsEqualTo(offset.y)
             .assertCrossAxisStartPositionInRootIsEqualTo(offset.x)
             .assertMainAxisSizeIsEqualTo(size.height)
             .assertCrossAxisSizeIsEqualTo(size.width)
 
-    fun PaddingValues(
-        mainAxis: Dp = 0.dp,
-        crossAxis: Dp = 0.dp
-    ) = PaddingValues(
-        beforeContent = mainAxis,
-        afterContent = mainAxis,
-        beforeContentCrossAxis = crossAxis,
-        afterContentCrossAxis = crossAxis
-    )
+    fun PaddingValues(mainAxis: Dp = 0.dp, crossAxis: Dp = 0.dp) =
+        PaddingValues(
+            beforeContent = mainAxis,
+            afterContent = mainAxis,
+            beforeContentCrossAxis = crossAxis,
+            afterContentCrossAxis = crossAxis
+        )
 
     fun PaddingValues(
         beforeContent: Dp = 0.dp,
         afterContent: Dp = 0.dp,
         beforeContentCrossAxis: Dp = 0.dp,
         afterContentCrossAxis: Dp = 0.dp,
-    ) = if (vertical) {
-        androidx.compose.foundation.layout.PaddingValues(
-            start = beforeContentCrossAxis,
-            top = beforeContent,
-            end = afterContentCrossAxis,
-            bottom = afterContent
-        )
-    } else {
-        androidx.compose.foundation.layout.PaddingValues(
-            start = beforeContent,
-            top = beforeContentCrossAxis,
-            end = afterContent,
-            bottom = afterContentCrossAxis
-        )
-    }
+    ) =
+        if (vertical) {
+            androidx.compose.foundation.layout.PaddingValues(
+                start = beforeContentCrossAxis,
+                top = beforeContent,
+                end = afterContentCrossAxis,
+                bottom = afterContent
+            )
+        } else {
+            androidx.compose.foundation.layout.PaddingValues(
+                start = beforeContent,
+                top = beforeContentCrossAxis,
+                end = afterContent,
+                bottom = afterContentCrossAxis
+            )
+        }
 
     internal fun Modifier.debugBorder(color: Color = Color.Black) = border(1.dp, color)
 
diff --git a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/BasicMarqueeTest.kt b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/BasicMarqueeTest.kt
index cf6ee92..63e5927 100644
--- a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/BasicMarqueeTest.kt
+++ b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/BasicMarqueeTest.kt
@@ -83,9 +83,10 @@
         private val BackgroundColor = Color.White
     }
 
-    private val motionDurationScale = object : MotionDurationScale {
-        override var scaleFactor: Float by mutableStateOf(1f)
-    }
+    private val motionDurationScale =
+        object : MotionDurationScale {
+            override var scaleFactor: Float by mutableStateOf(1f)
+        }
 
     @OptIn(ExperimentalTestApi::class)
     @get:Rule
@@ -107,30 +108,20 @@
 
     @Test
     fun initialState() {
-        rule.setContent {
-            TestMarqueeContent(Modifier.basicMarquee())
-        }
+        rule.setContent { TestMarqueeContent(Modifier.basicMarquee()) }
 
-        rule.onRoot().captureToImage()
-            .assertPixels { Color1 }
+        rule.onRoot().captureToImage().assertPixels { Color1 }
     }
 
     @Test
     fun doesNotAnimate_whenZeroIterations() {
-        rule.setContent {
-            TestMarqueeContent(
-                Modifier.basicMarqueeWithTestParams(
-                    iterations = 0
-                )
-            )
-        }
+        rule.setContent { TestMarqueeContent(Modifier.basicMarqueeWithTestParams(iterations = 0)) }
 
         // Color2 should never show up.
         repeat(5) {
             rule.mainClock.advanceTimeByFrame()
             rule.waitForIdle()
-            rule.onRoot().captureToImage()
-                .assertPixels { Color1 }
+            rule.onRoot().captureToImage().assertPixels { Color1 }
         }
     }
 
@@ -149,8 +140,7 @@
             )
         }
 
-        rule.onRoot().captureToImage()
-            .assertPixels(expectedSize = IntSize(100, 100)) { Color1 }
+        rule.onRoot().captureToImage().assertPixels(expectedSize = IntSize(100, 100)) { Color1 }
 
         // First stage of animation: show all the content.
         repeat(30) { frameNum ->
@@ -167,22 +157,18 @@
                     assertThat(edge1).isEqualTo(-1)
                     assertThat(edge2).isEqualTo(-1)
                 }
-
                 frameNum < 10 -> {
                     assertThat(edge1).isEqualTo(expectedEdge1)
                     assertThat(edge2).isEqualTo(-1)
                 }
-
                 frameNum == 10 -> {
                     assertThat(edge1).isEqualTo(-1)
                     assertThat(edge2).isEqualTo(-1)
                 }
-
                 frameNum < 20 -> {
                     assertThat(edge1).isEqualTo(-1)
                     assertThat(edge2).isEqualTo(expectedEdge2)
                 }
-
                 else -> {
                     // Nothing should happen after the animation finishes.
                     assertThat(edge1).isEqualTo(-1)
@@ -203,8 +189,7 @@
             )
         }
 
-        rule.onRoot().captureToImage()
-            .assertPixels(expectedSize = IntSize(100, 100)) { Color1 }
+        rule.onRoot().captureToImage().assertPixels(expectedSize = IntSize(100, 100)) { Color1 }
 
         // First stage of animation: show all the content.
         repeat(30) { frameNum ->
@@ -221,22 +206,18 @@
                     assertThat(edge1).isEqualTo(-1)
                     assertThat(edge2).isEqualTo(-1)
                 }
-
                 frameNum < 10 -> {
                     assertThat(edge1).isEqualTo(expectedEdge1)
                     assertThat(edge2).isEqualTo(-1)
                 }
-
                 frameNum == 10 -> {
                     assertThat(edge1).isEqualTo(-1)
                     assertThat(edge2).isEqualTo(-1)
                 }
-
                 frameNum < 20 -> {
                     assertThat(edge1).isEqualTo(-1)
                     assertThat(edge2).isEqualTo(expectedEdge2)
                 }
-
                 else -> {
                     // Nothing should happen after the animation finishes.
                     assertThat(edge1).isEqualTo(-1)
@@ -250,14 +231,11 @@
     fun animates_singleIteration_fixedSpace() {
         rule.setContent {
             TestMarqueeContent(
-                Modifier.basicMarqueeWithTestParams(
-                    spacing = MarqueeSpacing(10.toDp())
-                )
+                Modifier.basicMarqueeWithTestParams(spacing = MarqueeSpacing(10.toDp()))
             )
         }
 
-        rule.onRoot().captureToImage()
-            .assertPixels(expectedSize = IntSize(100, 100)) { Color1 }
+        rule.onRoot().captureToImage().assertPixels(expectedSize = IntSize(100, 100)) { Color1 }
 
         // First stage of animation: show all the content.
         repeat(30) { frameNum ->
@@ -277,37 +255,31 @@
                     assertThat(edge2).isEqualTo(-1)
                     assertThat(edge3).isEqualTo(-1)
                 }
-
                 frameNum < 10 -> {
                     assertThat(edge1).isEqualTo(expectedEdge1)
                     assertThat(edge2).isEqualTo(-1)
                     assertThat(edge3).isEqualTo(-1)
                 }
-
                 frameNum == 10 -> {
                     assertThat(edge1).isEqualTo(-1)
                     assertThat(edge2).isEqualTo(-1)
                     assertThat(edge3).isEqualTo(-1)
                 }
-
                 frameNum == 11 -> {
                     assertThat(edge1).isEqualTo(-1)
                     assertThat(edge2).isEqualTo(expectedEdge2)
                     assertThat(edge3).isEqualTo(-1)
                 }
-
                 frameNum < 20 -> {
                     assertThat(edge1).isEqualTo(-1)
                     assertThat(edge2).isEqualTo(expectedEdge2)
                     assertThat(edge3).isEqualTo(expectedEdge3)
                 }
-
                 frameNum == 20 -> {
                     assertThat(edge1).isEqualTo(-1)
                     assertThat(edge2).isEqualTo(-1)
                     assertThat(edge3).isEqualTo(expectedEdge3)
                 }
-
                 else -> {
                     // Nothing should happen after the animation finishes.
                     assertThat(edge1).isEqualTo(-1)
@@ -328,8 +300,7 @@
             )
         }
 
-        rule.onRoot().captureToImage()
-            .assertPixels(expectedSize = IntSize(100, 100)) { Color1 }
+        rule.onRoot().captureToImage().assertPixels(expectedSize = IntSize(100, 100)) { Color1 }
 
         // First stage of animation: show all the content.
         repeat(30) { frameNum ->
@@ -349,37 +320,31 @@
                     assertThat(edge2).isEqualTo(-1)
                     assertThat(edge3).isEqualTo(-1)
                 }
-
                 frameNum < 10 -> {
                     assertThat(edge1).isEqualTo(expectedEdge1)
                     assertThat(edge2).isEqualTo(-1)
                     assertThat(edge3).isEqualTo(-1)
                 }
-
                 frameNum == 10 -> {
                     assertThat(edge1).isEqualTo(-1)
                     assertThat(edge2).isEqualTo(-1)
                     assertThat(edge3).isEqualTo(-1)
                 }
-
                 frameNum == 11 -> {
                     assertThat(edge1).isEqualTo(-1)
                     assertThat(edge2).isEqualTo(expectedEdge2)
                     assertThat(edge3).isEqualTo(-1)
                 }
-
                 frameNum < 20 -> {
                     assertThat(edge1).isEqualTo(-1)
                     assertThat(edge2).isEqualTo(expectedEdge2)
                     assertThat(edge3).isEqualTo(expectedEdge3)
                 }
-
                 frameNum == 20 -> {
                     assertThat(edge1).isEqualTo(-1)
                     assertThat(edge2).isEqualTo(-1)
                     assertThat(edge3).isEqualTo(expectedEdge3)
                 }
-
                 else -> {
                     // Nothing should happen after the animation finishes.
                     assertThat(edge1).isEqualTo(-1)
@@ -402,8 +367,7 @@
             )
         }
 
-        rule.onRoot().captureToImage()
-            .assertPixels(expectedSize = IntSize(100, 100)) { Color1 }
+        rule.onRoot().captureToImage().assertPixels(expectedSize = IntSize(100, 100)) { Color1 }
 
         // First iteration.
         repeat(20) { frameNum ->
@@ -420,17 +384,14 @@
                     assertThat(edge1).isEqualTo(-1)
                     assertThat(edge2).isEqualTo(-1)
                 }
-
                 frameNum < 10 -> {
                     assertThat(edge1).isEqualTo(expectedEdge1)
                     assertThat(edge2).isEqualTo(-1)
                 }
-
                 frameNum == 10 -> {
                     assertThat(edge1).isEqualTo(-1)
                     assertThat(edge2).isEqualTo(-1)
                 }
-
                 frameNum < 20 -> {
                     assertThat(edge1).isEqualTo(-1)
                     assertThat(edge2).isEqualTo(expectedEdge2)
@@ -453,17 +414,14 @@
                     assertThat(edge1).isEqualTo(-1)
                     assertThat(edge2).isEqualTo(-1)
                 }
-
                 frameNum < 10 -> {
                     assertThat(edge1).isEqualTo(expectedEdge1)
                     assertThat(edge2).isEqualTo(-1)
                 }
-
                 frameNum == 10 -> {
                     assertThat(edge1).isEqualTo(-1)
                     assertThat(edge2).isEqualTo(-1)
                 }
-
                 frameNum < 20 -> {
                     assertThat(edge1).isEqualTo(-1)
                     assertThat(edge2).isEqualTo(expectedEdge2)
@@ -496,8 +454,7 @@
             )
         }
 
-        rule.onRoot().captureToImage()
-            .assertPixels(expectedSize = IntSize(100, 100)) { Color1 }
+        rule.onRoot().captureToImage().assertPixels(expectedSize = IntSize(100, 100)) { Color1 }
 
         repeat(initialFrameDelay) {
             rule.mainClock.advanceTimeByFrame()
@@ -525,17 +482,14 @@
                     assertThat(edge1).isEqualTo(-1)
                     assertThat(edge2).isEqualTo(-1)
                 }
-
                 frameNum < 10 -> {
                     assertThat(edge1).isEqualTo(expectedEdge1)
                     assertThat(edge2).isEqualTo(-1)
                 }
-
                 frameNum == 10 -> {
                     assertThat(edge1).isEqualTo(-1)
                     assertThat(edge2).isEqualTo(-1)
                 }
-
                 frameNum < 20 -> {
                     assertThat(edge1).isEqualTo(-1)
                     assertThat(edge2).isEqualTo(expectedEdge2)
@@ -558,17 +512,14 @@
                     assertThat(edge1).isEqualTo(-1)
                     assertThat(edge2).isEqualTo(-1)
                 }
-
                 frameNum < 10 -> {
                     assertThat(edge1).isEqualTo(expectedEdge1)
                     assertThat(edge2).isEqualTo(-1)
                 }
-
                 frameNum == 10 -> {
                     assertThat(edge1).isEqualTo(-1)
                     assertThat(edge2).isEqualTo(-1)
                 }
-
                 frameNum < 20 -> {
                     assertThat(edge1).isEqualTo(-1)
                     assertThat(edge2).isEqualTo(expectedEdge2)
@@ -601,8 +552,7 @@
             )
         }
 
-        rule.onRoot().captureToImage()
-            .assertPixels(expectedSize = IntSize(100, 100)) { Color1 }
+        rule.onRoot().captureToImage().assertPixels(expectedSize = IntSize(100, 100)) { Color1 }
 
         // First iteration.
         repeat(20) { frameNum ->
@@ -619,17 +569,14 @@
                     assertThat(edge1).isEqualTo(-1)
                     assertThat(edge2).isEqualTo(-1)
                 }
-
                 frameNum < 10 -> {
                     assertThat(edge1).isEqualTo(expectedEdge1)
                     assertThat(edge2).isEqualTo(-1)
                 }
-
                 frameNum == 10 -> {
                     assertThat(edge1).isEqualTo(-1)
                     assertThat(edge2).isEqualTo(-1)
                 }
-
                 frameNum < 20 -> {
                     assertThat(edge1).isEqualTo(-1)
                     assertThat(edge2).isEqualTo(expectedEdge2)
@@ -663,17 +610,14 @@
                     assertThat(edge1).isEqualTo(-1)
                     assertThat(edge2).isEqualTo(-1)
                 }
-
                 frameNum < 10 -> {
                     assertThat(edge1).isEqualTo(expectedEdge1)
                     assertThat(edge2).isEqualTo(-1)
                 }
-
                 frameNum == 10 -> {
                     assertThat(edge1).isEqualTo(-1)
                     assertThat(edge2).isEqualTo(-1)
                 }
-
                 frameNum < 20 -> {
                     assertThat(edge1).isEqualTo(-1)
                     assertThat(edge2).isEqualTo(expectedEdge2)
@@ -707,8 +651,7 @@
             )
         }
 
-        rule.onRoot().captureToImage()
-            .assertPixels(expectedSize = IntSize(100, 100)) { Color1 }
+        rule.onRoot().captureToImage().assertPixels(expectedSize = IntSize(100, 100)) { Color1 }
 
         repeat(initialFrameDelay) {
             rule.mainClock.advanceTimeByFrame()
@@ -736,17 +679,14 @@
                     assertThat(edge1).isEqualTo(-1)
                     assertThat(edge2).isEqualTo(-1)
                 }
-
                 frameNum < 10 -> {
                     assertThat(edge1).isEqualTo(expectedEdge1)
                     assertThat(edge2).isEqualTo(-1)
                 }
-
                 frameNum == 10 -> {
                     assertThat(edge1).isEqualTo(-1)
                     assertThat(edge2).isEqualTo(-1)
                 }
-
                 frameNum < 20 -> {
                     assertThat(edge1).isEqualTo(-1)
                     assertThat(edge2).isEqualTo(expectedEdge2)
@@ -780,17 +720,14 @@
                     assertThat(edge1).isEqualTo(-1)
                     assertThat(edge2).isEqualTo(-1)
                 }
-
                 frameNum < 10 -> {
                     assertThat(edge1).isEqualTo(expectedEdge1)
                     assertThat(edge2).isEqualTo(-1)
                 }
-
                 frameNum == 10 -> {
                     assertThat(edge1).isEqualTo(-1)
                     assertThat(edge2).isEqualTo(-1)
                 }
-
                 frameNum < 20 -> {
                     assertThat(edge1).isEqualTo(-1)
                     assertThat(edge2).isEqualTo(expectedEdge2)
@@ -820,8 +757,7 @@
             )
         }
 
-        rule.onRoot().captureToImage()
-            .assertPixels(expectedSize = IntSize(100, 100)) { Color1 }
+        rule.onRoot().captureToImage().assertPixels(expectedSize = IntSize(100, 100)) { Color1 }
 
         // First stage of animation: show all the content.
         repeat(30) { frameNum ->
@@ -838,22 +774,18 @@
                     assertThat(edge1).isEqualTo(-1)
                     assertThat(edge2).isEqualTo(-1)
                 }
-
                 frameNum < 10 -> {
                     assertThat(edge1).isEqualTo(expectedEdge1)
                     assertThat(edge2).isEqualTo(-1)
                 }
-
                 frameNum == 10 -> {
                     assertThat(edge1).isEqualTo(-1)
                     assertThat(edge2).isEqualTo(-1)
                 }
-
                 frameNum < 20 -> {
                     assertThat(edge1).isEqualTo(-1)
                     assertThat(edge2).isEqualTo(expectedEdge2)
                 }
-
                 else -> {
                     // Nothing should happen after the animation finishes.
                     assertThat(edge1).isEqualTo(-1)
@@ -871,8 +803,7 @@
             }
         }
 
-        rule.onRoot().captureToImage()
-            .assertPixels(expectedSize = IntSize(100, 100)) { Color2 }
+        rule.onRoot().captureToImage().assertPixels(expectedSize = IntSize(100, 100)) { Color2 }
 
         // First stage of animation: show all the content.
         repeat(30) { frameNum ->
@@ -889,22 +820,18 @@
                     assertThat(edge1).isEqualTo(-1)
                     assertThat(edge2).isEqualTo(-1)
                 }
-
                 frameNum < 10 -> {
                     assertThat(edge1).isEqualTo(expectedEdge1)
                     assertThat(edge2).isEqualTo(-1)
                 }
-
                 frameNum == 10 -> {
                     assertThat(edge1).isEqualTo(-1)
                     assertThat(edge2).isEqualTo(-1)
                 }
-
                 frameNum < 20 -> {
                     assertThat(edge1).isEqualTo(-1)
                     assertThat(edge2).isEqualTo(expectedEdge2)
                 }
-
                 else -> {
                     // Nothing should happen after the animation finishes.
                     assertThat(edge1).isEqualTo(-1)
@@ -921,8 +848,7 @@
         rule.setContent {
             focusManager = LocalFocusManager.current
             TestMarqueeContent(
-                Modifier
-                    .focusable() // extra focusable for initial focus.
+                Modifier.focusable() // extra focusable for initial focus.
                     .basicMarqueeWithTestParams(animationMode = WhileFocused)
                     .focusRequester(focusRequester)
                     .focusable()
@@ -932,13 +858,10 @@
         // Nothing should happen before focusing.
         repeat(10) {
             rule.mainClock.advanceTimeByFrame()
-            rule.onRoot().captureToImage()
-                .assertPixels(expectedSize = IntSize(100, 100)) { Color1 }
+            rule.onRoot().captureToImage().assertPixels(expectedSize = IntSize(100, 100)) { Color1 }
         }
 
-        rule.runOnIdle {
-            focusRequester.requestFocus()
-        }
+        rule.runOnIdle { focusRequester.requestFocus() }
 
         // Animation should start on next frame.
         repeat(5) { frameNum ->
@@ -952,22 +875,18 @@
                 0 -> {
                     assertThat(edge1).isEqualTo(-1)
                 }
-
                 else -> {
                     assertThat(edge1).isEqualTo(expectedEdge1)
                 }
             }
         }
 
-        rule.runOnIdle {
-            focusManager.clearFocus()
-        }
+        rule.runOnIdle { focusManager.clearFocus() }
 
         // Losing focus should cancel the animation and reset the offset.
         repeat(5) {
             rule.mainClock.advanceTimeByFrame()
-            rule.onRoot().captureToImage()
-                .assertPixels(expectedSize = IntSize(100, 100)) { Color1 }
+            rule.onRoot().captureToImage().assertPixels(expectedSize = IntSize(100, 100)) { Color1 }
         }
     }
 
@@ -1038,12 +957,8 @@
         }
 
         // Run the animation for a bit so we can tell when it resets.
-        repeat(3) {
-            rule.mainClock.advanceTimeByFrame()
-        }
-        rule.onRoot().captureToImage()
-            .assertContainsColor(Color1)
-            .assertContainsColor(Color2)
+        repeat(3) { rule.mainClock.advanceTimeByFrame() }
+        rule.onRoot().captureToImage().assertContainsColor(Color1).assertContainsColor(Color2)
 
         velocity += 1f
 
@@ -1054,12 +969,8 @@
         image.assertDoesNotContainColor(Color2)
 
         // Then ensure the animation is running again.
-        repeat(3) {
-            rule.mainClock.advanceTimeByFrame()
-        }
-        rule.onRoot().captureToImage()
-            .assertContainsColor(Color1)
-            .assertContainsColor(Color2)
+        repeat(3) { rule.mainClock.advanceTimeByFrame() }
+        rule.onRoot().captureToImage().assertContainsColor(Color1).assertContainsColor(Color2)
     }
 
     @Test
@@ -1070,16 +981,14 @@
 
         rule.setContent {
             Box(Modifier.drawBehind { outerDraws++ }) {
-                TestMarqueeContent(marqueeModifier = Modifier
-                    .basicMarqueeWithTestParams()
-                    .drawBehind { innerDraws++ }
+                TestMarqueeContent(
+                    marqueeModifier =
+                        Modifier.basicMarqueeWithTestParams().drawBehind { innerDraws++ }
                 )
             }
         }
 
-        repeat(iterations) {
-            rule.mainClock.advanceTimeByFrame()
-        }
+        repeat(iterations) { rule.mainClock.advanceTimeByFrame() }
 
         rule.runOnIdle {
             assertThat(outerDraws).isEqualTo(1)
@@ -1093,32 +1002,33 @@
         val childMaxIntrinsicWidth = 20
         val childMinIntrinsicHeight = 30
         val childMaxIntrinsicHeight = 40
-        val fixedIntrinsicsMeasurePolicy = object : MeasurePolicy {
-            override fun MeasureScope.measure(
-                measurables: List<Measurable>,
-                constraints: Constraints
-            ): MeasureResult = layout(0, 0) {}
+        val fixedIntrinsicsMeasurePolicy =
+            object : MeasurePolicy {
+                override fun MeasureScope.measure(
+                    measurables: List<Measurable>,
+                    constraints: Constraints
+                ): MeasureResult = layout(0, 0) {}
 
-            override fun IntrinsicMeasureScope.minIntrinsicWidth(
-                measurables: List<IntrinsicMeasurable>,
-                height: Int
-            ): Int = childMinIntrinsicWidth
+                override fun IntrinsicMeasureScope.minIntrinsicWidth(
+                    measurables: List<IntrinsicMeasurable>,
+                    height: Int
+                ): Int = childMinIntrinsicWidth
 
-            override fun IntrinsicMeasureScope.maxIntrinsicWidth(
-                measurables: List<IntrinsicMeasurable>,
-                height: Int
-            ): Int = childMaxIntrinsicWidth
+                override fun IntrinsicMeasureScope.maxIntrinsicWidth(
+                    measurables: List<IntrinsicMeasurable>,
+                    height: Int
+                ): Int = childMaxIntrinsicWidth
 
-            override fun IntrinsicMeasureScope.minIntrinsicHeight(
-                measurables: List<IntrinsicMeasurable>,
-                width: Int
-            ): Int = childMinIntrinsicHeight
+                override fun IntrinsicMeasureScope.minIntrinsicHeight(
+                    measurables: List<IntrinsicMeasurable>,
+                    width: Int
+                ): Int = childMinIntrinsicHeight
 
-            override fun IntrinsicMeasureScope.maxIntrinsicHeight(
-                measurables: List<IntrinsicMeasurable>,
-                width: Int
-            ): Int = childMaxIntrinsicHeight
-        }
+                override fun IntrinsicMeasureScope.maxIntrinsicHeight(
+                    measurables: List<IntrinsicMeasurable>,
+                    width: Int
+                ): Int = childMaxIntrinsicHeight
+            }
         var minIntrinsicWidth = -1
         var maxIntrinsicWidth = -1
         var minIntrinsicHeight = -1
@@ -1126,15 +1036,15 @@
 
         rule.setContent {
             Layout(
-                modifier = Modifier
-                    .layout { measurable, _ ->
-                        minIntrinsicWidth = measurable.minIntrinsicWidth(0)
-                        maxIntrinsicWidth = measurable.maxIntrinsicWidth(0)
-                        minIntrinsicHeight = measurable.minIntrinsicHeight(0)
-                        maxIntrinsicHeight = measurable.maxIntrinsicHeight(0)
-                        layout(0, 0) {}
-                    }
-                    .basicMarqueeWithTestParams(),
+                modifier =
+                    Modifier.layout { measurable, _ ->
+                            minIntrinsicWidth = measurable.minIntrinsicWidth(0)
+                            maxIntrinsicWidth = measurable.maxIntrinsicWidth(0)
+                            minIntrinsicHeight = measurable.minIntrinsicHeight(0)
+                            maxIntrinsicHeight = measurable.maxIntrinsicHeight(0)
+                            layout(0, 0) {}
+                        }
+                        .basicMarqueeWithTestParams(),
                 measurePolicy = fixedIntrinsicsMeasurePolicy
             )
         }
@@ -1154,8 +1064,7 @@
 
         rule.setContent {
             Box(
-                Modifier
-                    .width(10.dp)
+                Modifier.width(10.dp)
                     .layout { measurable, constraints ->
                         outerMeasures++
 
@@ -1164,9 +1073,7 @@
                         measurable.maxIntrinsicWidth(0)
 
                         val placeable = measurable.measure(constraints)
-                        layout(placeable.width, placeable.height) {
-                            placeable.place(0, 0)
-                        }
+                        layout(placeable.width, placeable.height) { placeable.place(0, 0) }
                     }
                     .basicMarqueeWithTestParams(
                         iterations = Int.MAX_VALUE,
@@ -1179,18 +1086,12 @@
             }
         }
 
-        rule.runOnIdle {
-            assertThat(outerMeasures).isEqualTo(2)
-        }
+        rule.runOnIdle { assertThat(outerMeasures).isEqualTo(2) }
 
         // Let the animation run for a few frames.
-        repeat(10) {
-            rule.mainClock.advanceTimeByFrame()
-        }
+        repeat(10) { rule.mainClock.advanceTimeByFrame() }
 
-        rule.runOnIdle {
-            assertThat(outerMeasures).isEqualTo(2)
-        }
+        rule.runOnIdle { assertThat(outerMeasures).isEqualTo(2) }
     }
 
     private fun testAnimationContinuity(
@@ -1211,17 +1112,11 @@
         modifierFactory: () -> Modifier,
         onChange: () -> Unit
     ) {
-        rule.setContent {
-            TestMarqueeContent(modifierFactory())
-        }
+        rule.setContent { TestMarqueeContent(modifierFactory()) }
 
         // Run the animation for a bit so we can tell when it resets.
-        repeat(3) {
-            rule.mainClock.advanceTimeByFrame()
-        }
-        rule.onRoot().captureToImage()
-            .assertContainsColor(Color1)
-            .assertContainsColor(Color2)
+        repeat(3) { rule.mainClock.advanceTimeByFrame() }
+        rule.onRoot().captureToImage().assertContainsColor(Color1).assertContainsColor(Color2)
 
         onChange()
 
@@ -1237,22 +1132,9 @@
 
     @Composable
     private fun TestMarqueeContent(marqueeModifier: Modifier) {
-        Row(
-            Modifier
-                .width(100.toDp())
-                .background(BackgroundColor)
-                .then(marqueeModifier)
-        ) {
-            Box(
-                Modifier
-                    .size(100.toDp())
-                    .background(Color1)
-            )
-            Box(
-                Modifier
-                    .size(100.toDp())
-                    .background(Color2)
-            )
+        Row(Modifier.width(100.toDp()).background(BackgroundColor).then(marqueeModifier)) {
+            Box(Modifier.size(100.toDp()).background(Color1))
+            Box(Modifier.size(100.toDp()).background(Color2))
         }
     }
 
@@ -1263,14 +1145,15 @@
         initialDelayMillis: Int = 0,
         spacing: MarqueeSpacing = MarqueeSpacing(0.toDp()),
         velocity: Dp = 10.pxPerFrame
-    ) = basicMarquee(
-        iterations = iterations,
-        animationMode = animationMode,
-        repeatDelayMillis = delayMillis,
-        initialDelayMillis = initialDelayMillis,
-        spacing = spacing,
-        velocity = velocity
-    )
+    ) =
+        basicMarquee(
+            iterations = iterations,
+            animationMode = animationMode,
+            repeatDelayMillis = delayMillis,
+            initialDelayMillis = initialDelayMillis,
+            spacing = spacing,
+            velocity = velocity
+        )
 
     /**
      * Finds the x coordinate in the image of the top row of pixels where the color first changes
diff --git a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/BasicTooltipTest.kt b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/BasicTooltipTest.kt
index 6653865..afe0afd 100644
--- a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/BasicTooltipTest.kt
+++ b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/BasicTooltipTest.kt
@@ -50,8 +50,7 @@
 @SdkSuppress(minSdkVersion = Build.VERSION_CODES.O)
 @RunWith(AndroidJUnit4::class)
 class BasicTooltipTest {
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
     @OptIn(ExperimentalTestApi::class)
     @Test
@@ -66,7 +65,9 @@
                 tooltip = {},
                 state = state,
                 modifier = Modifier.testTag(TOOLTIP_ANCHOR)
-            ) { Box(modifier = Modifier.requiredSize(1.dp)) {} }
+            ) {
+                Box(modifier = Modifier.requiredSize(1.dp)) {}
+            }
         }
 
         // Stop auto advance for test consistency
@@ -76,37 +77,26 @@
         Truth.assertThat(state.isVisible).isFalse()
 
         // Long press the anchor
-        rule.onNodeWithTag(TOOLTIP_ANCHOR, true)
-            .performTouchInput {
-                longClick()
-            }
+        rule.onNodeWithTag(TOOLTIP_ANCHOR, true).performTouchInput { longClick() }
 
         // Check that the tooltip is now showing
         rule.waitForIdle()
         Truth.assertThat(state.isVisible).isTrue()
 
         // Dismiss the tooltip and check that it dismissed
-        scope.launch {
-            state.dismiss()
-        }
+        scope.launch { state.dismiss() }
         rule.waitForIdle()
         Truth.assertThat(state.isVisible).isFalse()
 
         // Hover over the anchor with mouse input
-        rule.onNodeWithTag(TOOLTIP_ANCHOR)
-            .performMouseInput {
-                enter()
-            }
+        rule.onNodeWithTag(TOOLTIP_ANCHOR).performMouseInput { enter() }
 
         // Check that the tooltip is now showing
         rule.waitForIdle()
         Truth.assertThat(state.isVisible).isTrue()
 
         // Hover away from the anchor
-        rule.onNodeWithTag(TOOLTIP_ANCHOR)
-            .performMouseInput {
-                exit()
-            }
+        rule.onNodeWithTag(TOOLTIP_ANCHOR).performMouseInput { exit() }
 
         // Check that the tooltip is now dismissed
         rule.waitForIdle()
@@ -125,7 +115,9 @@
                 enableUserInput = false,
                 state = state,
                 modifier = Modifier.testTag(TOOLTIP_ANCHOR)
-            ) { Box(modifier = Modifier.requiredSize(1.dp)) {} }
+            ) {
+                Box(modifier = Modifier.requiredSize(1.dp)) {}
+            }
         }
 
         // Stop auto advance for test consistency
@@ -135,20 +127,14 @@
         Truth.assertThat(state.isVisible).isFalse()
 
         // Long press the anchor
-        rule.onNodeWithTag(TOOLTIP_ANCHOR)
-            .performTouchInput {
-                longClick()
-            }
+        rule.onNodeWithTag(TOOLTIP_ANCHOR).performTouchInput { longClick() }
 
         // Check that the tooltip is still not showing
         rule.waitForIdle()
         Truth.assertThat(state.isVisible).isFalse()
 
         // Hover over the anchor with mouse input
-        rule.onNodeWithTag(TOOLTIP_ANCHOR)
-            .performMouseInput {
-                enter()
-            }
+        rule.onNodeWithTag(TOOLTIP_ANCHOR).performMouseInput { enter() }
 
         // Check that the tooltip is still not showing
         rule.waitForIdle()
@@ -162,7 +148,9 @@
         windowSize: IntSize,
         layoutDirection: LayoutDirection,
         popupContentSize: IntSize
-    ): IntOffset { return IntOffset(0, 0) }
+    ): IntOffset {
+        return IntOffset(0, 0)
+    }
 }
 
 private const val TOOLTIP_ANCHOR = "anchor"
diff --git a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/BorderTest.kt b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/BorderTest.kt
index 8d8cb80..83f15e7 100644
--- a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/BorderTest.kt
+++ b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/BorderTest.kt
@@ -74,44 +74,45 @@
     companion object {
         @JvmStatic
         @Parameterized.Parameters(name = "{0}")
-        fun initShapes(): Array<Any> = arrayOf(
-            namedShape("Rectangle", RectangleShape),
-            namedShape("Circle", CircleShape),
-            namedShape("Rounded", RoundedCornerShape(5.0f))
-        )
+        fun initShapes(): Array<Any> =
+            arrayOf(
+                namedShape("Rectangle", RectangleShape),
+                namedShape("Circle", CircleShape),
+                namedShape("Rounded", RoundedCornerShape(5.0f))
+            )
 
-        private fun namedShape(name: String, shape: Shape): Shape = object : Shape by shape {
-            override fun toString(): String = name
-        }
+        private fun namedShape(name: String, shape: Shape): Shape =
+            object : Shape by shape {
+                override fun toString(): String = name
+            }
     }
 
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
     val testTag = "BorderParent"
 
-    private val rtlAwareShape = object : Shape {
-        override fun createOutline(
-            size: Size,
-            layoutDirection: LayoutDirection,
-            density: Density
-        ) = if (layoutDirection == LayoutDirection.Ltr) {
-            Outline.Rectangle(Rect(0f, 1f, 0f, 1f))
-        } else {
-            shape.createOutline(size, layoutDirection, density)
+    private val rtlAwareShape =
+        object : Shape {
+            override fun createOutline(
+                size: Size,
+                layoutDirection: LayoutDirection,
+                density: Density
+            ) =
+                if (layoutDirection == LayoutDirection.Ltr) {
+                    Outline.Rectangle(Rect(0f, 1f, 0f, 1f))
+                } else {
+                    shape.createOutline(size, layoutDirection, density)
+                }
         }
-    }
 
     @Test
     fun border_color() {
         rule.setContent {
             SemanticParent {
                 Box(
-                    Modifier
-                        .size(40.0f.toDp(), 40.0f.toDp())
+                    Modifier.size(40.0f.toDp(), 40.0f.toDp())
                         .background(color = Color.Blue)
                         .border(BorderStroke(10.0f.toDp(), Color.Red), shape)
-
                 ) {}
             }
         }
@@ -133,13 +134,9 @@
         rule.setContent {
             SemanticParent {
                 Box(
-                    Modifier
-                        .size(40.0f.toDp(), 40.0f.toDp())
+                    Modifier.size(40.0f.toDp(), 40.0f.toDp())
                         .background(color = Color.Blue)
-                        .border(
-                            BorderStroke(10.0f.toDp(), SolidColor(Color.Red)),
-                            shape
-                        )
+                        .border(BorderStroke(10.0f.toDp(), SolidColor(Color.Red)), shape)
                 ) {}
             }
         }
@@ -161,8 +158,7 @@
         rule.setContent {
             SemanticParent {
                 Box(
-                    Modifier
-                        .size(40.0f.toDp(), 40.0f.toDp())
+                    Modifier.size(40.0f.toDp(), 40.0f.toDp())
                         .background(color = Color.Blue)
                         .border(BorderStroke(1500.0f.toDp(), Color.Red), shape)
                 ) {}
@@ -184,8 +180,7 @@
         rule.setContent {
             SemanticParent {
                 Box(
-                    Modifier
-                        .size(40.0f.toDp(), 40.0f.toDp())
+                    Modifier.size(40.0f.toDp(), 40.0f.toDp())
                         .background(color = Color.Blue)
                         .border(BorderStroke(-5.0f.toDp(), Color.Red), shape)
                 ) {}
@@ -206,14 +201,9 @@
     fun border_zeroSizeLayout_drawsNothing() {
         rule.setContent {
             SemanticParent {
-                Box(
-                    Modifier
-                        .size(40.0f.toDp(), 40.0f.toDp())
-                        .background(Color.White)
-                ) {
+                Box(Modifier.size(40.0f.toDp(), 40.0f.toDp()).background(Color.White)) {
                     Box(
-                        Modifier
-                            .size(0.0f.toDp(), 40.0f.toDp())
+                        Modifier.size(0.0f.toDp(), 40.0f.toDp())
                             .border(BorderStroke(4.0f.toDp(), Color.Red), shape)
                     ) {}
                 }
@@ -245,8 +235,7 @@
                 borderWidthDp = (10f / density).dp
             }
             Box(
-                Modifier
-                    .testTag(testTag)
+                Modifier.testTag(testTag)
                     .requiredSize(triangleSizeDp, triangleSizeDp)
                     .background(Color.White)
                     .border(BorderStroke(borderWidthDp, Color.Red), triangle)
@@ -280,12 +269,9 @@
             val size = 50.dp
             val border = 10.dp
 
-            with(LocalDensity.current) {
-                borderPx = border.toPx()
-            }
+            with(LocalDensity.current) { borderPx = border.toPx() }
             Box(
-                Modifier
-                    .testTag(roundRectTag)
+                Modifier.testTag(roundRectTag)
                     .size(size)
                     .background(Color.White)
                     .border(
@@ -311,24 +297,15 @@
             assertEquals(Color.White, map[borderPx.toInt() + offset, borderPx.toInt() + offset])
             assertEquals(
                 Color.White,
-                map[
-                    map.width - borderPx.toInt() - offset,
-                    borderPx.toInt() + offset
-                ]
+                map[map.width - borderPx.toInt() - offset, borderPx.toInt() + offset]
             )
             assertEquals(
                 Color.White,
-                map[
-                    map.width - borderPx.toInt() - offset,
-                    map.height - borderPx.toInt() - offset
-                ]
+                map[map.width - borderPx.toInt() - offset, map.height - borderPx.toInt() - offset]
             )
             assertEquals(
                 Color.White,
-                map[
-                    borderPx.toInt() + offset,
-                    map.height - borderPx.toInt() - offset
-                ]
+                map[borderPx.toInt() + offset, map.height - borderPx.toInt() - offset]
             )
 
             val topRightOffset = (topRight / 2).roundToInt()
@@ -347,23 +324,25 @@
         rule.setContent {
             SemanticParent {
                 Box(
-                    Modifier
-                        .size(40.0f.toDp(), 40.0f.toDp())
+                    Modifier.size(40.0f.toDp(), 40.0f.toDp())
                         .background(color = Color.Blue)
                         .border(BorderStroke(10.0f.toDp(), Color.Red), rtlAwareShape)
                 ) {}
             }
         }
-        rule.onNodeWithTag(testTag).captureToImage().assertShape(
-            density = rule.density,
-            backgroundColor = Color.Red,
-            shape = shape,
-            backgroundShape = shape,
-            shapeSizeX = 20.0f,
-            shapeSizeY = 20.0f,
-            shapeColor = Color.Blue,
-            shapeOverlapPixelCount = 3.0f
-        )
+        rule
+            .onNodeWithTag(testTag)
+            .captureToImage()
+            .assertShape(
+                density = rule.density,
+                backgroundColor = Color.Red,
+                shape = shape,
+                backgroundShape = shape,
+                shapeSizeX = 20.0f,
+                shapeSizeY = 20.0f,
+                shapeColor = Color.Blue,
+                shapeOverlapPixelCount = 3.0f
+            )
     }
 
     @Test
@@ -373,8 +352,7 @@
             SemanticParent {
                 CompositionLocalProvider(LocalLayoutDirection provides direction.value) {
                     Box(
-                        Modifier
-                            .size(40.0f.toDp(), 40.0f.toDp())
+                        Modifier.size(40.0f.toDp(), 40.0f.toDp())
                             .background(color = Color.Blue)
                             .border(BorderStroke(10.0f.toDp(), Color.Red), rtlAwareShape)
                     ) {}
@@ -382,19 +360,20 @@
             }
         }
 
-        rule.runOnIdle {
-            direction.value = LayoutDirection.Rtl
-        }
-        rule.onNodeWithTag(testTag).captureToImage().assertShape(
-            density = rule.density,
-            backgroundColor = Color.Red,
-            shape = shape,
-            backgroundShape = shape,
-            shapeSizeX = 20.0f,
-            shapeSizeY = 20.0f,
-            shapeColor = Color.Blue,
-            shapeOverlapPixelCount = 3.0f
-        )
+        rule.runOnIdle { direction.value = LayoutDirection.Rtl }
+        rule
+            .onNodeWithTag(testTag)
+            .captureToImage()
+            .assertShape(
+                density = rule.density,
+                backgroundColor = Color.Red,
+                shape = shape,
+                backgroundShape = shape,
+                shapeSizeX = 20.0f,
+                shapeSizeY = 20.0f,
+                shapeColor = Color.Blue,
+                shapeOverlapPixelCount = 3.0f
+            )
     }
 
     @Test
@@ -404,8 +383,7 @@
         val borderColor = Color.Blue.copy(alpha = 0.5f)
         rule.setContent {
             Box(
-                Modifier
-                    .testTag(testTag)
+                Modifier.testTag(testTag)
                     .requiredSize(100.dp, 100.dp)
                     .background(background)
                     .border(
@@ -442,12 +420,13 @@
     fun border_generic_shape_color_to_brush() {
         // Verify that rendering with a solid color initially then with a gradient
         // updates the internal offscreen bitmap config to Argb8888 from Alpha8
-        val gradient = Brush.verticalGradient(
-            0.0f to Color.Red,
-            0.5f to Color.Red,
-            0.5f to Color.Blue,
-            1.0f to Color.Blue
-        )
+        val gradient =
+            Brush.verticalGradient(
+                0.0f to Color.Red,
+                0.5f to Color.Red,
+                0.5f to Color.Blue,
+                1.0f to Color.Blue
+            )
         val testTag = "testTag"
         val borderStrokeDp = 5.dp
         var borderStrokePx = 0f
@@ -456,12 +435,9 @@
             val testShape = GenericShape { size, _ ->
                 addRect(Rect(0f, 0f, size.width, size.height))
             }
-            with(LocalDensity.current) {
-                borderStrokePx = borderStrokeDp.toPx()
-            }
+            with(LocalDensity.current) { borderStrokePx = borderStrokeDp.toPx() }
             Box(
-                Modifier
-                    .testTag(testTag)
+                Modifier.testTag(testTag)
                     .requiredSize(20.dp, 20.dp)
                     .background(Color.White)
                     .border(
@@ -477,54 +453,28 @@
         val halfBorderStrokePx = (borderStrokePx / 2).toInt()
         rule.onNodeWithTag(testTag).captureToImage().apply {
             val pixelMap = toPixelMap()
-            assertEquals(
-                Color.Green,
-                pixelMap[halfBorderStrokePx, halfBorderStrokePx]
-            )
-            assertEquals(
-                Color.Green,
-                pixelMap[width - halfBorderStrokePx, halfBorderStrokePx]
-            )
-            assertEquals(
-                Color.Green,
-                pixelMap[halfBorderStrokePx, height - halfBorderStrokePx]
-            )
+            assertEquals(Color.Green, pixelMap[halfBorderStrokePx, halfBorderStrokePx])
+            assertEquals(Color.Green, pixelMap[width - halfBorderStrokePx, halfBorderStrokePx])
+            assertEquals(Color.Green, pixelMap[halfBorderStrokePx, height - halfBorderStrokePx])
             assertEquals(
                 Color.Green,
                 pixelMap[width - halfBorderStrokePx, height - halfBorderStrokePx]
             )
-            assertEquals(
-                Color.White,
-                pixelMap[width / 2, height / 2]
-            )
+            assertEquals(Color.White, pixelMap[width / 2, height / 2])
         }
 
-        rule.runOnIdle {
-            toggle.value = !toggle.value
-        }
+        rule.runOnIdle { toggle.value = !toggle.value }
 
         rule.onNodeWithTag(testTag).captureToImage().apply {
             val pixelMap = toPixelMap()
-            assertEquals(
-                Color.Red,
-                pixelMap[halfBorderStrokePx, halfBorderStrokePx]
-            )
-            assertEquals(
-                Color.Red,
-                pixelMap[width - halfBorderStrokePx, halfBorderStrokePx]
-            )
-            assertEquals(
-                Color.Blue,
-                pixelMap[halfBorderStrokePx, height - halfBorderStrokePx]
-            )
+            assertEquals(Color.Red, pixelMap[halfBorderStrokePx, halfBorderStrokePx])
+            assertEquals(Color.Red, pixelMap[width - halfBorderStrokePx, halfBorderStrokePx])
+            assertEquals(Color.Blue, pixelMap[halfBorderStrokePx, height - halfBorderStrokePx])
             assertEquals(
                 Color.Blue,
                 pixelMap[width - halfBorderStrokePx, height - halfBorderStrokePx]
             )
-            assertEquals(
-                Color.White,
-                pixelMap[width / 2, height / 2]
-            )
+            assertEquals(Color.White, pixelMap[width / 2, height / 2])
         }
     }
 
@@ -543,21 +493,20 @@
         var arrowLengthPx = 0f
         var borderStrokePx = 0f
         rule.setContent {
-            val bubbleWithArrow = calculateContainerShape(
-                LocalDensity.current,
-                arrowBaseWidthDp,
-                arrowTipDp,
-                arrowLengthDp
-            )
+            val bubbleWithArrow =
+                calculateContainerShape(
+                    LocalDensity.current,
+                    arrowBaseWidthDp,
+                    arrowTipDp,
+                    arrowLengthDp
+                )
             with(LocalDensity.current) {
-                val outline = bubbleWithArrow.createOutline(
-                    Size(
-                        bubbleWidthDp.toPx(),
-                        bubbleHeightDp.toPx()
-                    ),
-                    LayoutDirection.Ltr,
-                    this
-                ) as Outline.Generic
+                val outline =
+                    bubbleWithArrow.createOutline(
+                        Size(bubbleWidthDp.toPx(), bubbleHeightDp.toPx()),
+                        LayoutDirection.Ltr,
+                        this
+                    ) as Outline.Generic
 
                 val pathBounds = outline.path.getBounds()
                 offset = Offset(-pathBounds.left, -pathBounds.top)
@@ -568,8 +517,7 @@
                 borderStrokePx = borderWidthDp.toPx()
             }
             Box(
-                Modifier
-                    .testTag(testTag)
+                Modifier.testTag(testTag)
                     .requiredSize(bubbleWidthDp, bubbleHeightDp)
                     .background(Color.White)
                     .padding(top = arrowLengthDp)
@@ -583,40 +531,27 @@
 
             // point along the rounded rect but before the triangle is drawn with the border
             var currentX = arrowTipX + arrowBaseWidthPx / 2f - arrowBaseWidthPx
-            assertEquals(
-                Color.Red,
-                map[
-                    currentX.toInt(),
-                    (offset.y + borderStrokePx / 2).toInt()
-                ]
-            )
+            assertEquals(Color.Red, map[currentX.toInt(), (offset.y + borderStrokePx / 2).toInt()])
 
             // point halfway up the start of the triangle is drawn within the border
             assertEquals(
                 Color.Red,
                 map[
                     (currentX + arrowBaseWidthPx / 4).toInt(),
-                    (offset.y - arrowLengthPx / 2 + borderStrokePx / 2).toInt()
-                ]
+                    (offset.y - arrowLengthPx / 2 + borderStrokePx / 2).toInt()]
             )
 
             // Tip of the triangle is drawn within the border
             currentX += arrowBaseWidthPx / 2f
             assertEquals(
                 Color.Red,
-                map[
-                    currentX.toInt(),
-                    (offset.y - arrowLengthPx + borderStrokePx / 2).toInt()
-                ]
+                map[currentX.toInt(), (offset.y - arrowLengthPx + borderStrokePx / 2).toInt()]
             )
 
             // rounded rectangle directly below the triangle does not have the border rendered
             assertEquals(
                 Color.White,
-                map[
-                    currentX.toInt(),
-                    (offset.y + borderStrokePx / 2).toInt()
-                ]
+                map[currentX.toInt(), (offset.y + borderStrokePx / 2).toInt()]
             )
 
             // Midpoint of the end of the triangle being drawn back into the rounded rect
@@ -625,19 +560,12 @@
                 Color.Red,
                 map[
                     (currentX + arrowBaseWidthPx / 4f).toInt(),
-                    (offset.y - arrowLengthPx / 4 + borderStrokePx / 2).toInt()
-                ]
+                    (offset.y - arrowLengthPx / 4 + borderStrokePx / 2).toInt()]
             )
 
             // Base of the triangle on the rounded rect shape has the border rendered
             currentX += arrowBaseWidthPx / 2f
-            assertEquals(
-                Color.Red,
-                map[
-                    currentX.toInt(),
-                    (offset.y + borderStrokePx / 2).toInt()
-                ]
-            )
+            assertEquals(Color.Red, map[currentX.toInt(), (offset.y + borderStrokePx / 2).toInt()])
         }
     }
 
@@ -648,8 +576,7 @@
         rule.setContent {
             SemanticParent {
                 Box(
-                    Modifier
-                        .size(40.0f.toDp(), 40.0f.toDp())
+                    Modifier.size(40.0f.toDp(), 40.0f.toDp())
                         .background(color = Color.Blue)
                         .border(
                             BorderStroke(1f.toDp(), Color.Red),
@@ -667,9 +594,7 @@
             assertEquals(Color.Red, map[0, height - 1])
         }
 
-        rule.runOnIdle {
-            roundedCorners = true
-        }
+        rule.runOnIdle { roundedCorners = true }
 
         rule.onNodeWithTag(testTag).captureToImage().run {
             val map = toPixelMap()
@@ -684,37 +609,29 @@
     @Test
     fun border_changeOutline_outlineRounded_observableShape() {
         var roundedCorners by mutableStateOf(false)
-        val roundedCornersShape = object : Shape {
-            override fun createOutline(
-                size: Size,
-                layoutDirection: LayoutDirection,
-                density: Density
-            ): Outline {
-                val roundRect = if (roundedCorners) {
-                    RoundRect(
-                        Rect(Offset.Zero, size),
-                        cornerRadius = CornerRadius(5f)
-                    )
-                } else {
-                    RoundRect(
-                        Rect(Offset.Zero, size),
-                        cornerRadius = CornerRadius.Zero
-                    )
+        val roundedCornersShape =
+            object : Shape {
+                override fun createOutline(
+                    size: Size,
+                    layoutDirection: LayoutDirection,
+                    density: Density
+                ): Outline {
+                    val roundRect =
+                        if (roundedCorners) {
+                            RoundRect(Rect(Offset.Zero, size), cornerRadius = CornerRadius(5f))
+                        } else {
+                            RoundRect(Rect(Offset.Zero, size), cornerRadius = CornerRadius.Zero)
+                        }
+                    return Outline.Rounded(roundRect)
                 }
-                return Outline.Rounded(roundRect)
             }
-        }
 
         rule.setContent {
             SemanticParent {
                 Box(
-                    Modifier
-                        .size(40.0f.toDp(), 40.0f.toDp())
+                    Modifier.size(40.0f.toDp(), 40.0f.toDp())
                         .background(color = Color.Blue)
-                        .border(
-                            BorderStroke(1f.toDp(), Color.Red),
-                            roundedCornersShape
-                        )
+                        .border(BorderStroke(1f.toDp(), Color.Red), roundedCornersShape)
                 ) {}
             }
         }
@@ -727,9 +644,7 @@
             assertEquals(Color.Red, map[0, height - 1])
         }
 
-        rule.runOnIdle {
-            roundedCorners = true
-        }
+        rule.runOnIdle { roundedCorners = true }
 
         rule.onNodeWithTag(testTag).captureToImage().run {
             val map = toPixelMap()
@@ -744,40 +659,33 @@
     @Test
     fun border_changeOutline_outlineGeneric_samePath_observableShape() {
         var roundedCorners by mutableStateOf(false)
-        val roundedCornersShape = object : Shape {
-            val path = Path()
-            override fun createOutline(
-                size: Size,
-                layoutDirection: LayoutDirection,
-                density: Density
-            ): Outline {
-                val roundRect = if (roundedCorners) {
-                    RoundRect(
-                        Rect(Offset.Zero, size),
-                        cornerRadius = CornerRadius(50f)
-                    )
-                } else {
-                    RoundRect(
-                        Rect(Offset.Zero, size),
-                        cornerRadius = CornerRadius.Zero
-                    )
+        val roundedCornersShape =
+            object : Shape {
+                val path = Path()
+
+                override fun createOutline(
+                    size: Size,
+                    layoutDirection: LayoutDirection,
+                    density: Density
+                ): Outline {
+                    val roundRect =
+                        if (roundedCorners) {
+                            RoundRect(Rect(Offset.Zero, size), cornerRadius = CornerRadius(50f))
+                        } else {
+                            RoundRect(Rect(Offset.Zero, size), cornerRadius = CornerRadius.Zero)
+                        }
+                    path.reset()
+                    path.addRoundRect(roundRect)
+                    return Outline.Generic(path)
                 }
-                path.reset()
-                path.addRoundRect(roundRect)
-                return Outline.Generic(path)
             }
-        }
 
         rule.setContent {
             SemanticParent {
                 Box(
-                    Modifier
-                        .size(400.0f.toDp(), 400.0f.toDp())
+                    Modifier.size(400.0f.toDp(), 400.0f.toDp())
                         .background(color = Color.Blue)
-                        .border(
-                            BorderStroke(1f.toDp(), Color.Red),
-                            roundedCornersShape
-                        )
+                        .border(BorderStroke(1f.toDp(), Color.Red), roundedCornersShape)
                 ) {}
             }
         }
@@ -792,9 +700,7 @@
             assertEquals(Color.Red, map[0, height - 2])
         }
 
-        rule.runOnIdle {
-            roundedCorners = true
-        }
+        rule.runOnIdle { roundedCorners = true }
 
         rule.onNodeWithTag(testTag).captureToImage().run {
             val map = toPixelMap()
@@ -891,10 +797,6 @@
 
     @Composable
     fun SemanticParent(content: @Composable Density.() -> Unit) {
-        Box {
-            Box(modifier = Modifier.testTag(testTag)) {
-                LocalDensity.current.content()
-            }
-        }
+        Box { Box(modifier = Modifier.testTag(testTag)) { LocalDensity.current.content() } }
     }
 }
diff --git a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/CanvasTest.kt b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/CanvasTest.kt
index 0144d3d..353d65a 100644
--- a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/CanvasTest.kt
+++ b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/CanvasTest.kt
@@ -58,8 +58,7 @@
     val boxHeight = 100
     val containerSize = boxWidth
 
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
     @Test
     fun testCanvas() {
@@ -70,9 +69,10 @@
             val minWidth = (boxWidth / density).dp
             val minHeight = (boxHeight / density).dp
             Box(
-                modifier = Modifier.size(containerSize)
-                    .background(color = Color.White)
-                    .wrapContentSize(Alignment.Center)
+                modifier =
+                    Modifier.size(containerSize)
+                        .background(color = Color.White)
+                        .wrapContentSize(Alignment.Center)
             ) {
                 Canvas(modifier = Modifier.size(minWidth, minHeight)) {
                     drawLine(
@@ -96,69 +96,45 @@
             Assert.assertEquals(paintBoxColor, getPixel(imageStartX, imageStartY))
 
             // Top Left, to the left of the line
-            Assert.assertEquals(
-                containerBgColor,
-                getPixel(imageStartX - strokeOffset, imageStartY)
-            )
+            Assert.assertEquals(containerBgColor, getPixel(imageStartX - strokeOffset, imageStartY))
 
             // Top Left, to the right of the line
-            Assert.assertEquals(
-                containerBgColor,
-                getPixel(imageStartX + strokeOffset, imageStartY)
-            )
+            Assert.assertEquals(containerBgColor, getPixel(imageStartX + strokeOffset, imageStartY))
 
             // Bottom right
             Assert.assertEquals(
                 paintBoxColor,
-                getPixel(
-                    imageStartX + boxWidth - 1,
-                    imageStartY + boxHeight - 1
-                )
+                getPixel(imageStartX + boxWidth - 1, imageStartY + boxHeight - 1)
             )
 
             // Bottom right to the right of the line
             Assert.assertEquals(
                 containerBgColor,
-                getPixel(
-                    imageStartX + boxWidth + strokeOffset,
-                    imageStartY + boxHeight
-                )
+                getPixel(imageStartX + boxWidth + strokeOffset, imageStartY + boxHeight)
             )
 
             // Bottom right to the left of the line
             Assert.assertEquals(
                 containerBgColor,
-                getPixel(
-                    imageStartX + boxWidth - strokeOffset,
-                    imageStartY + boxHeight
-                )
+                getPixel(imageStartX + boxWidth - strokeOffset, imageStartY + boxHeight)
             )
 
             // Middle
             Assert.assertEquals(
                 paintBoxColor,
-                getPixel(
-                    imageStartX + boxWidth / 2,
-                    imageStartY + boxHeight / 2
-                )
+                getPixel(imageStartX + boxWidth / 2, imageStartY + boxHeight / 2)
             )
 
             // Middle to the left of the line
             Assert.assertEquals(
                 containerBgColor,
-                getPixel(
-                    imageStartX + boxWidth / 2 - strokeOffset,
-                    imageStartY + boxHeight / 2
-                )
+                getPixel(imageStartX + boxWidth / 2 - strokeOffset, imageStartY + boxHeight / 2)
             )
 
             // Middle to the right of the line
             Assert.assertEquals(
                 containerBgColor,
-                getPixel(
-                    imageStartX + boxWidth / 2 + strokeOffset,
-                    imageStartY + boxHeight / 2
-                )
+                getPixel(imageStartX + boxWidth / 2 + strokeOffset, imageStartY + boxHeight / 2)
             )
         }
     }
@@ -178,11 +154,8 @@
 
     @Test
     fun canvas_noSize_emptyCanvas() {
-        rule.setContentForSizeAssertions {
-            Canvas(modifier = Modifier) {
-                drawRect(Color.Black)
-            }
-        }
+        rule
+            .setContentForSizeAssertions { Canvas(modifier = Modifier) { drawRect(Color.Black) } }
             .assertHeightIsEqualTo(0.dp)
             .assertWidthIsEqualTo(0.dp)
     }
@@ -190,11 +163,8 @@
     @Test
     @LargeTest
     fun canvas_exactSizes() {
-        rule.setContentForSizeAssertions {
-            Canvas(Modifier.size(100.dp)) {
-                drawRect(Color.Red)
-            }
-        }
+        rule
+            .setContentForSizeAssertions { Canvas(Modifier.size(100.dp)) { drawRect(Color.Red) } }
             .assertWidthIsEqualTo(100.dp)
             .assertHeightIsEqualTo(100.dp)
             .captureToImage()
@@ -209,15 +179,13 @@
     @Test
     @LargeTest
     fun canvas_exactSizes_drawCircle() {
-        rule.setContentForSizeAssertions {
-            Canvas(Modifier.size(100.dp)) {
-                drawRect(Color.Red)
-                drawCircle(
-                    Color.Blue,
-                    radius = 10.0f
-                )
+        rule
+            .setContentForSizeAssertions {
+                Canvas(Modifier.size(100.dp)) {
+                    drawRect(Color.Red)
+                    drawCircle(Color.Blue, radius = 10.0f)
+                }
             }
-        }
             .assertWidthIsEqualTo(100.dp)
             .assertHeightIsEqualTo(100.dp)
             .captureToImage()
diff --git a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/ClickableInScrollableViewGroupTest.kt b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/ClickableInScrollableViewGroupTest.kt
index d0f5579..bc40cd9 100644
--- a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/ClickableInScrollableViewGroupTest.kt
+++ b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/ClickableInScrollableViewGroupTest.kt
@@ -44,15 +44,12 @@
 import org.junit.Test
 import org.junit.runner.RunWith
 
-/**
- * Test for [clickable] [PressInteraction] behavior in scrollable [ViewGroup]s.
- */
+/** Test for [clickable] [PressInteraction] behavior in scrollable [ViewGroup]s. */
 @MediumTest
 @RunWith(AndroidJUnit4::class)
 @OptIn(ExperimentalFoundationApi::class)
 class ClickableInScrollableViewGroupTest {
-    @get:Rule
-    val rule = createAndroidComposeRule<ComponentActivity>()
+    @get:Rule val rule = createAndroidComposeRule<ComponentActivity>()
 
     @Test
     fun clickable_scrollableViewGroup() {
@@ -74,9 +71,8 @@
                     Box {
                         BasicText(
                             "ClickableText",
-                            modifier = Modifier
-                                .testTag("myClickable")
-                                .combinedClickable(
+                            modifier =
+                                Modifier.testTag("myClickable").combinedClickable(
                                     interactionSource = interactionSource,
                                     indication = null
                                 ) {}
@@ -88,25 +84,18 @@
 
         val interactions = mutableListOf<Interaction>()
 
-        scope.launch {
-            interactionSource.interactions.collect { interactions.add(it) }
-        }
+        scope.launch { interactionSource.interactions.collect { interactions.add(it) } }
 
-        rule.runOnIdle {
-            assertThat(interactions).isEmpty()
-        }
+        rule.runOnIdle { assertThat(interactions).isEmpty() }
 
-        rule.onNodeWithTag("myClickable")
-            .performTouchInput { down(center) }
+        rule.onNodeWithTag("myClickable").performTouchInput { down(center) }
 
         val halfTapIndicationDelay = TapIndicationDelay / 2
 
         rule.mainClock.advanceTimeBy(halfTapIndicationDelay)
 
         // Haven't reached the tap delay yet, so we shouldn't have started a press
-        rule.runOnIdle {
-            assertThat(interactions).isEmpty()
-        }
+        rule.runOnIdle { assertThat(interactions).isEmpty() }
 
         // Advance past the tap delay
         rule.mainClock.advanceTimeBy(halfTapIndicationDelay)
@@ -116,8 +105,7 @@
             assertThat(interactions.first()).isInstanceOf(PressInteraction.Press::class.java)
         }
 
-        rule.onNodeWithTag("myClickable")
-            .performTouchInput { up() }
+        rule.onNodeWithTag("myClickable").performTouchInput { up() }
 
         rule.runOnIdle {
             assertThat(interactions).hasSize(2)
@@ -128,9 +116,7 @@
         }
     }
 
-    /**
-     * Test case for a [clickable] inside an [AndroidView] inside a scrollable Compose container
-     */
+    /** Test case for a [clickable] inside an [AndroidView] inside a scrollable Compose container */
     @Test
     fun clickable_androidViewInScrollableContainer() {
         val interactionSource = MutableInteractionSource()
@@ -142,45 +128,39 @@
         rule.setContent {
             scope = rememberCoroutineScope()
             Box(Modifier.verticalScroll(rememberScrollState())) {
-                AndroidView({ context -> ComposeView(context).apply {
-                    setContent {
-                        Box {
-                            BasicText(
-                                "ClickableText",
-                                modifier = Modifier
-                                    .testTag("myClickable")
-                                    .combinedClickable(
-                                        interactionSource = interactionSource,
-                                        indication = null
-                                    ) {}
-                            )
+                AndroidView({ context ->
+                    ComposeView(context).apply {
+                        setContent {
+                            Box {
+                                BasicText(
+                                    "ClickableText",
+                                    modifier =
+                                        Modifier.testTag("myClickable").combinedClickable(
+                                            interactionSource = interactionSource,
+                                            indication = null
+                                        ) {}
+                                )
+                            }
                         }
                     }
-                } })
+                })
             }
         }
 
         val interactions = mutableListOf<Interaction>()
 
-        scope.launch {
-            interactionSource.interactions.collect { interactions.add(it) }
-        }
+        scope.launch { interactionSource.interactions.collect { interactions.add(it) } }
 
-        rule.runOnIdle {
-            assertThat(interactions).isEmpty()
-        }
+        rule.runOnIdle { assertThat(interactions).isEmpty() }
 
-        rule.onNodeWithTag("myClickable")
-            .performTouchInput { down(center) }
+        rule.onNodeWithTag("myClickable").performTouchInput { down(center) }
 
         val halfTapIndicationDelay = TapIndicationDelay / 2
 
         rule.mainClock.advanceTimeBy(halfTapIndicationDelay)
 
         // Haven't reached the tap delay yet, so we shouldn't have started a press
-        rule.runOnIdle {
-            assertThat(interactions).isEmpty()
-        }
+        rule.runOnIdle { assertThat(interactions).isEmpty() }
 
         // Advance past the tap delay
         rule.mainClock.advanceTimeBy(halfTapIndicationDelay)
@@ -190,8 +170,7 @@
             assertThat(interactions.first()).isInstanceOf(PressInteraction.Press::class.java)
         }
 
-        rule.onNodeWithTag("myClickable")
-            .performTouchInput { up() }
+        rule.onNodeWithTag("myClickable").performTouchInput { up() }
 
         rule.runOnIdle {
             assertThat(interactions).hasSize(2)
@@ -220,36 +199,32 @@
         rule.setContent {
             scope = rememberCoroutineScope()
             Box {
-                AndroidView({ context -> ComposeView(context).apply {
-                    setContent {
-                        Box {
-                            BasicText(
-                                "ClickableText",
-                                modifier = Modifier
-                                    .testTag("myClickable")
-                                    .combinedClickable(
-                                        interactionSource = interactionSource,
-                                        indication = null
-                                    ) {}
-                            )
+                AndroidView({ context ->
+                    ComposeView(context).apply {
+                        setContent {
+                            Box {
+                                BasicText(
+                                    "ClickableText",
+                                    modifier =
+                                        Modifier.testTag("myClickable").combinedClickable(
+                                            interactionSource = interactionSource,
+                                            indication = null
+                                        ) {}
+                                )
+                            }
                         }
                     }
-                } })
+                })
             }
         }
 
         val interactions = mutableListOf<Interaction>()
 
-        scope.launch {
-            interactionSource.interactions.collect { interactions.add(it) }
-        }
+        scope.launch { interactionSource.interactions.collect { interactions.add(it) } }
 
-        rule.runOnIdle {
-            assertThat(interactions).isEmpty()
-        }
+        rule.runOnIdle { assertThat(interactions).isEmpty() }
 
-        rule.onNodeWithTag("myClickable")
-            .performTouchInput { down(center) }
+        rule.onNodeWithTag("myClickable").performTouchInput { down(center) }
 
         // No scrollable container, so there should be no delay and we should instantly appear
         // pressed
@@ -258,8 +233,7 @@
             assertThat(interactions.first()).isInstanceOf(PressInteraction.Press::class.java)
         }
 
-        rule.onNodeWithTag("myClickable")
-            .performTouchInput { up() }
+        rule.onNodeWithTag("myClickable").performTouchInput { up() }
 
         rule.runOnIdle {
             assertThat(interactions).hasSize(2)
diff --git a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/ClickableTest.kt b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/ClickableTest.kt
index ff03888..d7d1b0b 100644
--- a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/ClickableTest.kt
+++ b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/ClickableTest.kt
@@ -123,13 +123,13 @@
 @RunWith(AndroidJUnit4::class)
 class ClickableTest {
 
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
-    private val InstanceOf = Correspondence.from<Any, KClass<*>>(
-        { obj, clazz -> clazz?.isInstance(obj) ?: false },
-        "is an instance of"
-    )
+    private val InstanceOf =
+        Correspondence.from<Any, KClass<*>>(
+            { obj, clazz -> clazz?.isInstance(obj) ?: false },
+            "is an instance of"
+        )
 
     @Before
     fun before() {
@@ -143,24 +143,21 @@
 
     // TODO(b/267253920): Add a compose test API to set/reset InputMode.
     @After
-    fun resetTouchMode() = with(InstrumentationRegistry.getInstrumentation()) {
-        if (SDK_INT < 33) setInTouchMode(true) else resetInTouchMode()
-    }
+    fun resetTouchMode() =
+        with(InstrumentationRegistry.getInstrumentation()) {
+            if (SDK_INT < 33) setInTouchMode(true) else resetInTouchMode()
+        }
 
     @Test
     fun defaultSemantics() {
         rule.setContent {
             Box {
-                BasicText(
-                    "ClickableText",
-                    modifier = Modifier
-                        .testTag("myClickable")
-                        .clickable {}
-                )
+                BasicText("ClickableText", modifier = Modifier.testTag("myClickable").clickable {})
             }
         }
 
-        rule.onNodeWithTag("myClickable")
+        rule
+            .onNodeWithTag("myClickable")
             .assert(SemanticsMatcher.keyNotDefined(SemanticsProperties.Role))
             .assertIsEnabled()
             .assertHasClickAction()
@@ -172,14 +169,13 @@
             Box {
                 BasicText(
                     "ClickableText",
-                    modifier = Modifier
-                        .testTag("myClickable")
-                        .clickable(enabled = false) {}
+                    modifier = Modifier.testTag("myClickable").clickable(enabled = false) {}
                 )
             }
         }
 
-        rule.onNodeWithTag("myClickable")
+        rule
+            .onNodeWithTag("myClickable")
             .assert(SemanticsMatcher.keyNotDefined(SemanticsProperties.Role))
             .assertIsNotEnabled()
             .assertHasClickAction()
@@ -193,32 +189,30 @@
             Box {
                 BasicText(
                     "ClickableText",
-                    modifier = Modifier
-                        .testTag("myClickable")
-                        .clickable(enabled = enabled, role = role) {}
+                    modifier =
+                        Modifier.testTag("myClickable").clickable(enabled = enabled, role = role) {}
                 )
             }
         }
 
-        rule.onNodeWithTag("myClickable")
+        rule
+            .onNodeWithTag("myClickable")
             .assertIsEnabled()
             .assert(SemanticsMatcher.expectValue(SemanticsProperties.Role, Role.Button))
             .assertHasClickAction()
 
-        rule.runOnIdle {
-            role = null
-        }
+        rule.runOnIdle { role = null }
 
-        rule.onNodeWithTag("myClickable")
+        rule
+            .onNodeWithTag("myClickable")
             .assertIsEnabled()
             .assert(SemanticsMatcher.keyNotDefined(SemanticsProperties.Role))
             .assertHasClickAction()
 
-        rule.runOnIdle {
-            enabled = false
-        }
+        rule.runOnIdle { enabled = false }
 
-        rule.onNodeWithTag("myClickable")
+        rule
+            .onNodeWithTag("myClickable")
             .assertIsNotEnabled()
             .assert(SemanticsMatcher.keyNotDefined(SemanticsProperties.Role))
             .assertHasClickAction()
@@ -227,34 +221,24 @@
     @Test
     fun click() {
         var counter = 0
-        val onClick: () -> Unit = {
-            ++counter
-        }
+        val onClick: () -> Unit = { ++counter }
 
         rule.setContent {
             Box {
                 BasicText(
                     "ClickableText",
-                    modifier = Modifier
-                        .testTag("myClickable")
-                        .clickable(onClick = onClick)
+                    modifier = Modifier.testTag("myClickable").clickable(onClick = onClick)
                 )
             }
         }
 
-        rule.onNodeWithTag("myClickable")
-            .performClick()
+        rule.onNodeWithTag("myClickable").performClick()
 
-        rule.runOnIdle {
-            assertThat(counter).isEqualTo(1)
-        }
+        rule.runOnIdle { assertThat(counter).isEqualTo(1) }
 
-        rule.onNodeWithTag("myClickable")
-            .performClick()
+        rule.onNodeWithTag("myClickable").performClick()
 
-        rule.runOnIdle {
-            assertThat(counter).isEqualTo(2)
-        }
+        rule.runOnIdle { assertThat(counter).isEqualTo(2) }
     }
 
     @Test
@@ -266,11 +250,11 @@
         rule.setContent {
             inputModeManager = LocalInputModeManager.current
             BasicText(
-                    "ClickableText",
-                    modifier = Modifier
-                        .testTag("myClickable")
-                        .focusRequester(focusRequester)
-                        .clickable { counter++ }
+                "ClickableText",
+                modifier =
+                    Modifier.testTag("myClickable").focusRequester(focusRequester).clickable {
+                        counter++
+                    }
             )
         }
         rule.runOnIdle {
@@ -297,10 +281,10 @@
             inputModeManager = LocalInputModeManager.current
             BasicText(
                 "ClickableText",
-                modifier = Modifier
-                    .testTag("myClickable")
-                    .focusRequester(focusRequester)
-                    .clickable { counter++ }
+                modifier =
+                    Modifier.testTag("myClickable").focusRequester(focusRequester).clickable {
+                        counter++
+                    }
             )
         }
         rule.runOnIdle {
@@ -327,10 +311,10 @@
             inputModeManager = LocalInputModeManager.current
             BasicText(
                 "ClickableText",
-                modifier = Modifier
-                    .testTag("myClickable")
-                    .focusRequester(focusRequester)
-                    .clickable { counter++ }
+                modifier =
+                    Modifier.testTag("myClickable").focusRequester(focusRequester).clickable {
+                        counter++
+                    }
             )
         }
         rule.runOnIdle {
@@ -364,15 +348,11 @@
 
         rule.onNodeWithText("Foo", substring = true).performClick()
 
-        rule.runOnIdle {
-            assertThat(counter).isEqualTo(1)
-        }
+        rule.runOnIdle { assertThat(counter).isEqualTo(1) }
 
         rule.onNodeWithText("Bar", substring = true).performClick()
 
-        rule.runOnIdle {
-            assertThat(counter).isEqualTo(2)
-        }
+        rule.runOnIdle { assertThat(counter).isEqualTo(2) }
     }
 
     @Test
@@ -383,17 +363,10 @@
         lateinit var inputModeManager: InputModeManager
         rule.setContent {
             inputModeManager = LocalInputModeManager.current
-            Box(
-                Modifier
-                    .testTag(tag)
-                    .size(10.dp)
-                    .focusRequester(focusRequester)
-                    .clickable {}
-            )
+            Box(Modifier.testTag(tag).size(10.dp).focusRequester(focusRequester).clickable {})
         }
         rule.runOnIdle {
-            @OptIn(ExperimentalComposeUiApi::class)
-            inputModeManager.requestInputMode(Touch)
+            @OptIn(ExperimentalComposeUiApi::class) inputModeManager.requestInputMode(Touch)
         }
 
         // Act.
@@ -411,17 +384,10 @@
         lateinit var inputModeManager: InputModeManager
         rule.setContent {
             inputModeManager = LocalInputModeManager.current
-            Box(
-                Modifier
-                    .testTag(tag)
-                    .size(10.dp)
-                    .focusRequester(focusRequester)
-                    .clickable {}
-            )
+            Box(Modifier.testTag(tag).size(10.dp).focusRequester(focusRequester).clickable {})
         }
         rule.runOnIdle {
-            @OptIn(ExperimentalComposeUiApi::class)
-            inputModeManager.requestInputMode(Keyboard)
+            @OptIn(ExperimentalComposeUiApi::class) inputModeManager.requestInputMode(Keyboard)
         }
 
         // Act.
@@ -438,16 +404,10 @@
         lateinit var inputModeManager: InputModeManager
         rule.setContent {
             inputModeManager = LocalInputModeManager.current
-            Box(
-                Modifier
-                    .testTag(tag)
-                    .size(10.dp)
-                    .clickable {}
-            )
+            Box(Modifier.testTag(tag).size(10.dp).clickable {})
         }
         rule.runOnIdle {
-            @OptIn(ExperimentalComposeUiApi::class)
-            inputModeManager.requestInputMode(Touch)
+            @OptIn(ExperimentalComposeUiApi::class) inputModeManager.requestInputMode(Touch)
         }
 
         // Act.
@@ -465,17 +425,10 @@
         val focusRequester = FocusRequester()
         rule.setFocusableContent {
             inputModeManager = LocalInputModeManager.current
-            Box(
-                Modifier
-                    .focusRequester(focusRequester)
-                    .testTag(tag)
-                    .size(10.dp)
-                    .clickable {}
-            )
+            Box(Modifier.focusRequester(focusRequester).testTag(tag).size(10.dp).clickable {})
         }
         rule.runOnIdle {
-            @OptIn(ExperimentalComposeUiApi::class)
-            inputModeManager.requestInputMode(Keyboard)
+            @OptIn(ExperimentalComposeUiApi::class) inputModeManager.requestInputMode(Keyboard)
         }
 
         // Act.
@@ -498,9 +451,8 @@
             Box {
                 BasicText(
                     "ClickableText",
-                    modifier = Modifier
-                        .testTag("myClickable")
-                        .clickable(
+                    modifier =
+                        Modifier.testTag("myClickable").clickable(
                             interactionSource = interactionSource,
                             indication = null
                         ) {}
@@ -510,16 +462,11 @@
 
         val interactions = mutableListOf<Interaction>()
 
-        scope.launch {
-            interactionSource.interactions.collect { interactions.add(it) }
-        }
+        scope.launch { interactionSource.interactions.collect { interactions.add(it) } }
 
-        rule.runOnIdle {
-            assertThat(interactions).isEmpty()
-        }
+        rule.runOnIdle { assertThat(interactions).isEmpty() }
 
-        rule.onNodeWithTag("myClickable")
-            .performTouchInput { down(center) }
+        rule.onNodeWithTag("myClickable").performTouchInput { down(center) }
 
         // No scrollable container, so there should be no delay and we should instantly appear
         // pressed
@@ -528,8 +475,7 @@
             assertThat(interactions.first()).isInstanceOf(PressInteraction.Press::class.java)
         }
 
-        rule.onNodeWithTag("myClickable")
-            .performTouchInput { up() }
+        rule.onNodeWithTag("myClickable").performTouchInput { up() }
 
         rule.runOnIdle {
             assertThat(interactions).hasSize(2)
@@ -553,9 +499,8 @@
             Box {
                 BasicText(
                     "ClickableText",
-                    modifier = Modifier
-                        .testTag("myClickable")
-                        .clickable(
+                    modifier =
+                        Modifier.testTag("myClickable").clickable(
                             interactionSource = interactionSource,
                             indication = null
                         ) {}
@@ -565,19 +510,14 @@
 
         val interactions = mutableListOf<Interaction>()
 
-        scope.launch {
-            interactionSource.interactions.collect { interactions.add(it) }
-        }
+        scope.launch { interactionSource.interactions.collect { interactions.add(it) } }
 
-        rule.runOnIdle {
-            assertThat(interactions).isEmpty()
-        }
+        rule.runOnIdle { assertThat(interactions).isEmpty() }
 
-        rule.onNodeWithTag("myClickable")
-            .performTouchInput {
-                down(center)
-                up()
-            }
+        rule.onNodeWithTag("myClickable").performTouchInput {
+            down(center)
+            up()
+        }
 
         // Press finished so we should see both press and release
         rule.runOnIdle {
@@ -602,9 +542,8 @@
             Box {
                 BasicText(
                     "ClickableText",
-                    modifier = Modifier
-                        .testTag("myClickable")
-                        .clickable(
+                    modifier =
+                        Modifier.testTag("myClickable").clickable(
                             interactionSource = interactionSource,
                             indication = null
                         ) {}
@@ -614,19 +553,14 @@
 
         val interactions = mutableListOf<Interaction>()
 
-        scope.launch {
-            interactionSource.interactions.collect { interactions.add(it) }
-        }
+        scope.launch { interactionSource.interactions.collect { interactions.add(it) } }
 
-        rule.runOnIdle {
-            assertThat(interactions).isEmpty()
-        }
+        rule.runOnIdle { assertThat(interactions).isEmpty() }
 
-        rule.onNodeWithTag("myClickable")
-            .performTouchInput {
-                down(center)
-                cancel()
-            }
+        rule.onNodeWithTag("myClickable").performTouchInput {
+            down(center)
+            cancel()
+        }
 
         // We are not in a scrollable container, so we should see a press and immediate cancel
         rule.runOnIdle {
@@ -651,35 +585,27 @@
             Box {
                 BasicText(
                     "ClickableText",
-                    modifier = Modifier
-                        .testTag("myClickable")
-                        .draggable(
-                            state = rememberDraggableState {},
-                            orientation = Orientation.Horizontal
-                        )
-                        .clickable(
-                            interactionSource = interactionSource,
-                            indication = null
-                        ) {}
+                    modifier =
+                        Modifier.testTag("myClickable")
+                            .draggable(
+                                state = rememberDraggableState {},
+                                orientation = Orientation.Horizontal
+                            )
+                            .clickable(interactionSource = interactionSource, indication = null) {}
                 )
             }
         }
 
         val interactions = mutableListOf<Interaction>()
 
-        scope.launch {
-            interactionSource.interactions.collect { interactions.add(it) }
-        }
+        scope.launch { interactionSource.interactions.collect { interactions.add(it) } }
 
-        rule.runOnIdle {
-            assertThat(interactions).isEmpty()
-        }
+        rule.runOnIdle { assertThat(interactions).isEmpty() }
 
-        rule.onNodeWithTag("myClickable")
-            .performTouchInput {
-                down(centerLeft)
-                moveTo(centerRight)
-            }
+        rule.onNodeWithTag("myClickable").performTouchInput {
+            down(centerLeft)
+            moveTo(centerRight)
+        }
 
         // The press should fire, and then the drag should instantly cancel it
         rule.runOnIdle {
@@ -704,9 +630,8 @@
             Box(Modifier.verticalScroll(rememberScrollState())) {
                 BasicText(
                     "ClickableText",
-                    modifier = Modifier
-                        .testTag("myClickable")
-                        .clickable(
+                    modifier =
+                        Modifier.testTag("myClickable").clickable(
                             interactionSource = interactionSource,
                             indication = null
                         ) {}
@@ -716,25 +641,18 @@
 
         val interactions = mutableListOf<Interaction>()
 
-        scope.launch {
-            interactionSource.interactions.collect { interactions.add(it) }
-        }
+        scope.launch { interactionSource.interactions.collect { interactions.add(it) } }
 
-        rule.runOnIdle {
-            assertThat(interactions).isEmpty()
-        }
+        rule.runOnIdle { assertThat(interactions).isEmpty() }
 
-        rule.onNodeWithTag("myClickable")
-            .performTouchInput { down(center) }
+        rule.onNodeWithTag("myClickable").performTouchInput { down(center) }
 
         val halfTapIndicationDelay = TapIndicationDelay / 2
 
         rule.mainClock.advanceTimeBy(halfTapIndicationDelay)
 
         // Haven't reached the tap delay yet, so we shouldn't have started a press
-        rule.runOnIdle {
-            assertThat(interactions).isEmpty()
-        }
+        rule.runOnIdle { assertThat(interactions).isEmpty() }
 
         // Advance past the tap delay
         rule.mainClock.advanceTimeBy(halfTapIndicationDelay)
@@ -744,8 +662,7 @@
             assertThat(interactions.first()).isInstanceOf(PressInteraction.Press::class.java)
         }
 
-        rule.onNodeWithTag("myClickable")
-            .performTouchInput { up() }
+        rule.onNodeWithTag("myClickable").performTouchInput { up() }
 
         rule.runOnIdle {
             assertThat(interactions).hasSize(2)
@@ -769,9 +686,8 @@
             Box(Modifier.verticalScroll(rememberScrollState())) {
                 BasicText(
                     "ClickableText",
-                    modifier = Modifier
-                        .testTag("myClickable")
-                        .clickable(
+                    modifier =
+                        Modifier.testTag("myClickable").clickable(
                             interactionSource = interactionSource,
                             indication = null
                         ) {}
@@ -781,19 +697,14 @@
 
         val interactions = mutableListOf<Interaction>()
 
-        scope.launch {
-            interactionSource.interactions.collect { interactions.add(it) }
-        }
+        scope.launch { interactionSource.interactions.collect { interactions.add(it) } }
 
-        rule.runOnIdle {
-            assertThat(interactions).isEmpty()
-        }
+        rule.runOnIdle { assertThat(interactions).isEmpty() }
 
-        rule.onNodeWithTag("myClickable")
-            .performTouchInput {
-                down(center)
-                up()
-            }
+        rule.onNodeWithTag("myClickable").performTouchInput {
+            down(center)
+            up()
+        }
 
         // We haven't reached the tap delay, but we have finished a press so we should have
         // emitted both press and release
@@ -819,9 +730,8 @@
             Box(Modifier.verticalScroll(rememberScrollState())) {
                 BasicText(
                     "ClickableText",
-                    modifier = Modifier
-                        .testTag("myClickable")
-                        .clickable(
+                    modifier =
+                        Modifier.testTag("myClickable").clickable(
                             interactionSource = interactionSource,
                             indication = null
                         ) {}
@@ -831,25 +741,18 @@
 
         val interactions = mutableListOf<Interaction>()
 
-        scope.launch {
-            interactionSource.interactions.collect { interactions.add(it) }
-        }
+        scope.launch { interactionSource.interactions.collect { interactions.add(it) } }
 
-        rule.runOnIdle {
-            assertThat(interactions).isEmpty()
-        }
+        rule.runOnIdle { assertThat(interactions).isEmpty() }
 
-        rule.onNodeWithTag("myClickable")
-            .performTouchInput {
-                down(center)
-                cancel()
-            }
+        rule.onNodeWithTag("myClickable").performTouchInput {
+            down(center)
+            cancel()
+        }
 
         // We haven't reached the tap delay, and a cancel was emitted, so no press should ever be
         // shown
-        rule.runOnIdle {
-            assertThat(interactions).isEmpty()
-        }
+        rule.runOnIdle { assertThat(interactions).isEmpty() }
     }
 
     @Test
@@ -865,42 +768,32 @@
             Box(Modifier.verticalScroll(rememberScrollState())) {
                 BasicText(
                     "ClickableText",
-                    modifier = Modifier
-                        .testTag("myClickable")
-                        .draggable(
-                            state = rememberDraggableState {},
-                            orientation = Orientation.Horizontal
-                        )
-                        .clickable(
-                            interactionSource = interactionSource,
-                            indication = null
-                        ) {}
+                    modifier =
+                        Modifier.testTag("myClickable")
+                            .draggable(
+                                state = rememberDraggableState {},
+                                orientation = Orientation.Horizontal
+                            )
+                            .clickable(interactionSource = interactionSource, indication = null) {}
                 )
             }
         }
 
         val interactions = mutableListOf<Interaction>()
 
-        scope.launch {
-            interactionSource.interactions.collect { interactions.add(it) }
-        }
+        scope.launch { interactionSource.interactions.collect { interactions.add(it) } }
 
-        rule.runOnIdle {
-            assertThat(interactions).isEmpty()
-        }
+        rule.runOnIdle { assertThat(interactions).isEmpty() }
 
-        rule.onNodeWithTag("myClickable")
-            .performTouchInput {
-                down(centerLeft)
-                moveTo(centerRight)
-            }
+        rule.onNodeWithTag("myClickable").performTouchInput {
+            down(centerLeft)
+            moveTo(centerRight)
+        }
 
         rule.mainClock.advanceTimeBy(TapIndicationDelay)
 
         // We started a drag before the timeout, so no press should be emitted
-        rule.runOnIdle {
-            assertThat(interactions).isEmpty()
-        }
+        rule.runOnIdle { assertThat(interactions).isEmpty() }
     }
 
     @Test
@@ -916,34 +809,24 @@
             Box(Modifier.verticalScroll(rememberScrollState())) {
                 BasicText(
                     "ClickableText",
-                    modifier = Modifier
-                        .testTag("myClickable")
-                        .draggable(
-                            state = rememberDraggableState {},
-                            orientation = Orientation.Horizontal
-                        )
-                        .clickable(
-                            interactionSource = interactionSource,
-                            indication = null
-                        ) {}
+                    modifier =
+                        Modifier.testTag("myClickable")
+                            .draggable(
+                                state = rememberDraggableState {},
+                                orientation = Orientation.Horizontal
+                            )
+                            .clickable(interactionSource = interactionSource, indication = null) {}
                 )
             }
         }
 
         val interactions = mutableListOf<Interaction>()
 
-        scope.launch {
-            interactionSource.interactions.collect { interactions.add(it) }
-        }
+        scope.launch { interactionSource.interactions.collect { interactions.add(it) } }
 
-        rule.runOnIdle {
-            assertThat(interactions).isEmpty()
-        }
+        rule.runOnIdle { assertThat(interactions).isEmpty() }
 
-        rule.onNodeWithTag("myClickable")
-            .performTouchInput {
-                down(centerLeft)
-            }
+        rule.onNodeWithTag("myClickable").performTouchInput { down(centerLeft) }
 
         rule.mainClock.advanceTimeBy(TapIndicationDelay)
 
@@ -952,10 +835,7 @@
             assertThat(interactions.first()).isInstanceOf(PressInteraction.Press::class.java)
         }
 
-        rule.onNodeWithTag("myClickable")
-            .performTouchInput {
-                moveTo(centerRight)
-            }
+        rule.onNodeWithTag("myClickable").performTouchInput { moveTo(centerRight) }
 
         // The drag should cancel the press
         rule.runOnIdle {
@@ -980,9 +860,8 @@
             Box(Modifier.verticalScroll(rememberScrollState())) {
                 BasicText(
                     "ClickableText",
-                    modifier = Modifier
-                        .testTag("myClickable")
-                        .clickable(
+                    modifier =
+                        Modifier.testTag("myClickable").clickable(
                             interactionSource = interactionSource,
                             indication = null
                         ) {}
@@ -992,16 +871,11 @@
 
         val interactions = mutableListOf<Interaction>()
 
-        scope.launch {
-            interactionSource.interactions.collect { interactions.add(it) }
-        }
+        scope.launch { interactionSource.interactions.collect { interactions.add(it) } }
 
-        rule.runOnIdle {
-            assertThat(interactions).isEmpty()
-        }
+        rule.runOnIdle { assertThat(interactions).isEmpty() }
 
-        rule.onNodeWithTag("myClickable")
-            .performTouchInput { down(center) }
+        rule.onNodeWithTag("myClickable").performTouchInput { down(center) }
 
         rule.mainClock.advanceTimeBy(TapIndicationDelay)
 
@@ -1010,8 +884,7 @@
             assertThat(interactions.first()).isInstanceOf(PressInteraction.Press::class.java)
         }
 
-        rule.onNodeWithTag("myClickable")
-            .performTouchInput { cancel() }
+        rule.onNodeWithTag("myClickable").performTouchInput { cancel() }
 
         rule.runOnIdle {
             assertThat(interactions).hasSize(2)
@@ -1037,9 +910,8 @@
                 if (emitClickableText) {
                     BasicText(
                         "ClickableText",
-                        modifier = Modifier
-                            .testTag("myClickable")
-                            .clickable(
+                        modifier =
+                            Modifier.testTag("myClickable").clickable(
                                 interactionSource = interactionSource,
                                 indication = null
                             ) {}
@@ -1050,16 +922,11 @@
 
         val interactions = mutableListOf<Interaction>()
 
-        scope.launch {
-            interactionSource.interactions.collect { interactions.add(it) }
-        }
+        scope.launch { interactionSource.interactions.collect { interactions.add(it) } }
 
-        rule.runOnIdle {
-            assertThat(interactions).isEmpty()
-        }
+        rule.runOnIdle { assertThat(interactions).isEmpty() }
 
-        rule.onNodeWithTag("myClickable")
-            .performTouchInput { down(center) }
+        rule.onNodeWithTag("myClickable").performTouchInput { down(center) }
 
         rule.mainClock.advanceTimeBy(TapIndicationDelay)
 
@@ -1069,9 +936,7 @@
         }
 
         // Dispose clickable
-        rule.runOnIdle {
-            emitClickableText = false
-        }
+        rule.runOnIdle { emitClickableText = false }
 
         rule.mainClock.advanceTimeByFrame()
 
@@ -1099,9 +964,8 @@
                 ReusableContent(key) {
                     BasicText(
                         "ClickableText",
-                        modifier = Modifier
-                            .testTag("myClickable")
-                            .clickable(
+                        modifier =
+                            Modifier.testTag("myClickable").clickable(
                                 interactionSource = interactionSource,
                                 indication = null
                             ) {}
@@ -1112,16 +976,11 @@
 
         val interactions = mutableListOf<Interaction>()
 
-        scope.launch {
-            interactionSource.interactions.collect { interactions.add(it) }
-        }
+        scope.launch { interactionSource.interactions.collect { interactions.add(it) } }
 
-        rule.runOnIdle {
-            assertThat(interactions).isEmpty()
-        }
+        rule.runOnIdle { assertThat(interactions).isEmpty() }
 
-        rule.onNodeWithTag("myClickable")
-            .performTouchInput { down(center) }
+        rule.onNodeWithTag("myClickable").performTouchInput { down(center) }
 
         rule.mainClock.advanceTimeBy(TapIndicationDelay)
 
@@ -1131,9 +990,7 @@
         }
 
         // Change the key to trigger reuse
-        rule.runOnIdle {
-            key = false
-        }
+        rule.runOnIdle { key = false }
 
         rule.mainClock.advanceTimeByFrame()
 
@@ -1158,9 +1015,8 @@
         val content = movableContentOf {
             BasicText(
                 "ClickableText",
-                modifier = Modifier
-                    .testTag("myClickable")
-                    .clickable(
+                modifier =
+                    Modifier.testTag("myClickable").clickable(
                         interactionSource = interactionSource,
                         indication = null
                     ) {}
@@ -1170,28 +1026,19 @@
         rule.setContent {
             scope = rememberCoroutineScope()
             if (moveContent) {
-                Box {
-                    content()
-                }
+                Box { content() }
             } else {
-                Box {
-                    content()
-                }
+                Box { content() }
             }
         }
 
         val interactions = mutableListOf<Interaction>()
 
-        scope.launch {
-            interactionSource.interactions.collect { interactions.add(it) }
-        }
+        scope.launch { interactionSource.interactions.collect { interactions.add(it) } }
 
-        rule.runOnIdle {
-            assertThat(interactions).isEmpty()
-        }
+        rule.runOnIdle { assertThat(interactions).isEmpty() }
 
-        rule.onNodeWithTag("myClickable")
-            .performTouchInput { down(center) }
+        rule.onNodeWithTag("myClickable").performTouchInput { down(center) }
 
         rule.mainClock.advanceTimeBy(TapIndicationDelay)
 
@@ -1201,9 +1048,7 @@
         }
 
         // Move the content
-        rule.runOnIdle {
-            moveContent = true
-        }
+        rule.runOnIdle { moveContent = true }
 
         rule.mainClock.advanceTimeByFrame()
 
@@ -1228,9 +1073,8 @@
             Box {
                 BasicText(
                     "ClickableText",
-                    modifier = Modifier
-                        .testTag("myClickable")
-                        .clickable(
+                    modifier =
+                        Modifier.testTag("myClickable").clickable(
                             interactionSource = interactionSource,
                             indication = null
                         ) {}
@@ -1240,32 +1084,24 @@
 
         val interactions = mutableListOf<Interaction>()
 
-        scope.launch {
-            interactionSource.interactions.collect { interactions.add(it) }
-        }
+        scope.launch { interactionSource.interactions.collect { interactions.add(it) } }
 
-        rule.runOnIdle {
-            assertThat(interactions).isEmpty()
-        }
+        rule.runOnIdle { assertThat(interactions).isEmpty() }
 
-        rule.onNodeWithTag("myClickable")
-            .performMouseInput { enter(center) }
+        rule.onNodeWithTag("myClickable").performMouseInput { enter(center) }
 
         rule.runOnIdle {
             assertThat(interactions).hasSize(1)
             assertThat(interactions.first()).isInstanceOf(HoverInteraction.Enter::class.java)
         }
 
-        rule.onNodeWithTag("myClickable")
-            .performMouseInput { exit(Offset(-1f, -1f)) }
+        rule.onNodeWithTag("myClickable").performMouseInput { exit(Offset(-1f, -1f)) }
 
         rule.runOnIdle {
             assertThat(interactions).hasSize(2)
             assertThat(interactions.first()).isInstanceOf(HoverInteraction.Enter::class.java)
-            assertThat(interactions[1])
-                .isInstanceOf(HoverInteraction.Exit::class.java)
-            assertThat((interactions[1] as HoverInteraction.Exit).enter)
-                .isEqualTo(interactions[0])
+            assertThat(interactions[1]).isInstanceOf(HoverInteraction.Exit::class.java)
+            assertThat((interactions[1] as HoverInteraction.Exit).enter).isEqualTo(interactions[0])
         }
     }
 
@@ -1281,9 +1117,8 @@
             Box {
                 BasicText(
                     "ClickableText",
-                    modifier = Modifier
-                        .testTag("myClickable")
-                        .clickable(
+                    modifier =
+                        Modifier.testTag("myClickable").clickable(
                             interactionSource = interactionSource,
                             indication = null
                         ) {}
@@ -1293,20 +1128,15 @@
 
         val interactions = mutableListOf<Interaction>()
 
-        scope.launch {
-            interactionSource.interactions.collect { interactions.add(it) }
-        }
+        scope.launch { interactionSource.interactions.collect { interactions.add(it) } }
 
-        rule.runOnIdle {
-            assertThat(interactions).isEmpty()
-        }
+        rule.runOnIdle { assertThat(interactions).isEmpty() }
 
-        rule.onNodeWithTag("myClickable")
-            .performMouseInput {
-                enter(center)
-                click()
-                exit(Offset(-1f, -1f))
-            }
+        rule.onNodeWithTag("myClickable").performMouseInput {
+            enter(center)
+            click()
+            exit(Offset(-1f, -1f))
+        }
 
         rule.runOnIdle {
             assertThat(interactions).hasSize(4)
@@ -1316,8 +1146,7 @@
             assertThat(interactions[3]).isInstanceOf(HoverInteraction.Exit::class.java)
             assertThat((interactions[2] as PressInteraction.Release).press)
                 .isEqualTo(interactions[1])
-            assertThat((interactions[3] as HoverInteraction.Exit).enter)
-                .isEqualTo(interactions[0])
+            assertThat((interactions[3] as HoverInteraction.Exit).enter).isEqualTo(interactions[0])
         }
     }
 
@@ -1333,10 +1162,8 @@
             Box {
                 BasicText(
                     "ClickableText",
-                    modifier = Modifier
-                        .testTag("myClickable")
-                        .focusRequester(focusRequester)
-                        .clickable(
+                    modifier =
+                        Modifier.testTag("myClickable").focusRequester(focusRequester).clickable(
                             interactionSource = interactionSource,
                             indication = null
                         ) {}
@@ -1344,28 +1171,19 @@
             }
         }
         rule.runOnIdle {
-            @OptIn(ExperimentalComposeUiApi::class)
-            inputModeManager.requestInputMode(Touch)
+            @OptIn(ExperimentalComposeUiApi::class) inputModeManager.requestInputMode(Touch)
         }
 
         val interactions = mutableListOf<Interaction>()
 
-        scope.launch {
-            interactionSource.interactions.collect { interactions.add(it) }
-        }
+        scope.launch { interactionSource.interactions.collect { interactions.add(it) } }
 
-        rule.runOnIdle {
-            assertThat(interactions).isEmpty()
-        }
+        rule.runOnIdle { assertThat(interactions).isEmpty() }
 
-        rule.runOnIdle {
-            focusRequester.requestFocus()
-        }
+        rule.runOnIdle { focusRequester.requestFocus() }
 
         // Touch mode by default, so we shouldn't be focused
-        rule.runOnIdle {
-            assertThat(interactions).isEmpty()
-        }
+        rule.runOnIdle { assertThat(interactions).isEmpty() }
     }
 
     @Test
@@ -1382,31 +1200,25 @@
             Box {
                 BasicText(
                     "ClickableText",
-                    modifier = Modifier
-                        .testTag("myClickable")
-                        .focusRequester(focusRequester)
-                        .clickable(interactionSource = interactionSource, indication = null) {}
+                    modifier =
+                        Modifier.testTag("myClickable").focusRequester(focusRequester).clickable(
+                            interactionSource = interactionSource,
+                            indication = null
+                        ) {}
                 )
             }
         }
         rule.runOnIdle {
-            @OptIn(ExperimentalComposeUiApi::class)
-            inputModeManager.requestInputMode(Keyboard)
+            @OptIn(ExperimentalComposeUiApi::class) inputModeManager.requestInputMode(Keyboard)
         }
 
         val interactions = mutableListOf<Interaction>()
 
-        scope.launch {
-            interactionSource.interactions.collect { interactions.add(it) }
-        }
+        scope.launch { interactionSource.interactions.collect { interactions.add(it) } }
 
-        rule.runOnIdle {
-            assertThat(interactions).isEmpty()
-        }
+        rule.runOnIdle { assertThat(interactions).isEmpty() }
 
-        rule.runOnIdle {
-            focusRequester.requestFocus()
-        }
+        rule.runOnIdle { focusRequester.requestFocus() }
 
         // Keyboard mode, so we should now be focused and see an interaction
         rule.runOnIdle {
@@ -1415,9 +1227,7 @@
                 .containsExactly(FocusInteraction.Focus::class)
         }
 
-        rule.runOnIdle {
-            focusManager.clearFocus()
-        }
+        rule.runOnIdle { focusManager.clearFocus() }
 
         rule.runOnIdle {
             // TODO(b/308811852): Simplify the other assertions in FocusableTest, ClickableTest and
@@ -1442,15 +1252,14 @@
             Box(Modifier.clickable(onClick = onOuterClick)) {
                 BasicText(
                     "ClickableText",
-                    modifier = Modifier
-                        .testTag("myClickable")
-                        .clickable(enabled = enabled.value, onClick = onClick)
+                    modifier =
+                        Modifier.testTag("myClickable")
+                            .clickable(enabled = enabled.value, onClick = onClick)
                 )
             }
         }
 
-        rule.onNodeWithTag("myClickable")
-            .performClick()
+        rule.onNodeWithTag("myClickable").performClick()
 
         rule.runOnIdle {
             assertThat(clickCounter).isEqualTo(0)
@@ -1458,8 +1267,7 @@
             enabled.value = true
         }
 
-        rule.onNodeWithTag("myClickable")
-            .performClick()
+        rule.onNodeWithTag("myClickable").performClick()
 
         rule.runOnIdle {
             assertThat(clickCounter).isEqualTo(1)
@@ -1471,61 +1279,54 @@
     private fun Modifier.dynamicPointerInputModifier(
         enabled: Boolean,
         key: Any? = Unit,
-        onEnter: () -> Unit = { },
-        onMove: () -> Unit = { },
-        onPress: () -> Unit = { },
-        onRelease: () -> Unit = { },
-        onExit: () -> Unit = { },
-        ) = if (enabled) {
-        pointerInput(key) {
-            awaitPointerEventScope {
-                while (true) {
-                    val event = awaitPointerEvent()
-                    when (event.type) {
-                        PointerEventType.Enter -> {
-                            onEnter()
-                        }
-                        PointerEventType.Press -> {
-                            onPress()
-                        }
-                        PointerEventType.Move -> {
-                            onMove()
-                        }
-                        PointerEventType.Release -> {
-                            onRelease()
-                        }
-                        PointerEventType.Exit -> {
-                            onExit()
+        onEnter: () -> Unit = {},
+        onMove: () -> Unit = {},
+        onPress: () -> Unit = {},
+        onRelease: () -> Unit = {},
+        onExit: () -> Unit = {},
+    ) =
+        if (enabled) {
+            pointerInput(key) {
+                awaitPointerEventScope {
+                    while (true) {
+                        val event = awaitPointerEvent()
+                        when (event.type) {
+                            PointerEventType.Enter -> {
+                                onEnter()
+                            }
+                            PointerEventType.Press -> {
+                                onPress()
+                            }
+                            PointerEventType.Move -> {
+                                onMove()
+                            }
+                            PointerEventType.Release -> {
+                                onRelease()
+                            }
+                            PointerEventType.Exit -> {
+                                onExit()
+                            }
                         }
                     }
                 }
             }
-        }
-    } else this
+        } else this
 
     private fun Modifier.dynamicPointerInputModifierWithDetectTapGestures(
         enabled: Boolean,
         key: Any? = Unit,
-        onTap: () -> Unit = { }
-    ) = if (enabled) {
-        pointerInput(key) {
-            detectTapGestures {
-                onTap()
-            }
+        onTap: () -> Unit = {}
+    ) =
+        if (enabled) {
+            pointerInput(key) { detectTapGestures { onTap() } }
+        } else {
+            this
         }
-    } else {
-        this
-    }
 
-    private fun Modifier.dynamicClickableModifier(
-        enabled: Boolean,
-        onClick: () -> Unit
-    ) = if (enabled) {
-        clickable(
-            interactionSource = null,
-            indication = null
-        ) { onClick() }
-    } else this
+    private fun Modifier.dynamicClickableModifier(enabled: Boolean, onClick: () -> Unit) =
+        if (enabled) {
+            clickable(interactionSource = null, indication = null) { onClick() }
+        } else this
 
     // !!!!! MOUSE & TOUCH EVENTS TESTS WITH DYNAMIC MODIFIER INPUT TESTS SECTION (START) !!!!!
     // The next ~20 tests test enabling/disabling dynamic input modifiers (both pointer input and
@@ -1548,24 +1349,22 @@
         var activateDynamicClickable by mutableStateOf(false)
 
         rule.setContent {
-            Box(Modifier
-                .size(200.dp)
-                .testTag("myClickable")
-                .dynamicClickableModifier(activateDynamicClickable) {
-                    clickableClickCounter++
-                }
-                .pointerInput("unique_key_123") {
-                    awaitPointerEventScope {
-                        while (true) {
-                            val event = awaitPointerEvent()
-                            if (event.type == PointerEventType.Press) {
-                                pointerInputPressCounter++
-                            } else if (event.type == PointerEventType.Release) {
-                                activateDynamicClickable = true
+            Box(
+                Modifier.size(200.dp)
+                    .testTag("myClickable")
+                    .dynamicClickableModifier(activateDynamicClickable) { clickableClickCounter++ }
+                    .pointerInput("unique_key_123") {
+                        awaitPointerEventScope {
+                            while (true) {
+                                val event = awaitPointerEvent()
+                                if (event.type == PointerEventType.Press) {
+                                    pointerInputPressCounter++
+                                } else if (event.type == PointerEventType.Release) {
+                                    activateDynamicClickable = true
+                                }
                             }
                         }
                     }
-                }
             )
         }
 
@@ -1600,24 +1399,22 @@
         var activateDynamicClickable by mutableStateOf(false)
 
         rule.setContent {
-            Box(Modifier
-                .size(200.dp)
-                .testTag("myClickable")
-                .dynamicClickableModifier(activateDynamicClickable) {
-                    clickableClickCounter++
-                }
-                .pointerInput(Unit) {
-                    awaitPointerEventScope {
-                        while (true) {
-                            val event = awaitPointerEvent()
-                            if (event.type == PointerEventType.Press) {
-                                pointerInputPressCounter++
-                            } else if (event.type == PointerEventType.Release) {
-                                activateDynamicClickable = true
+            Box(
+                Modifier.size(200.dp)
+                    .testTag("myClickable")
+                    .dynamicClickableModifier(activateDynamicClickable) { clickableClickCounter++ }
+                    .pointerInput(Unit) {
+                        awaitPointerEventScope {
+                            while (true) {
+                                val event = awaitPointerEvent()
+                                if (event.type == PointerEventType.Press) {
+                                    pointerInputPressCounter++
+                                } else if (event.type == PointerEventType.Release) {
+                                    activateDynamicClickable = true
+                                }
                             }
                         }
                     }
-                }
             )
         }
 
@@ -1655,24 +1452,22 @@
         var activateDynamicClickable by mutableStateOf(false)
 
         rule.setContent {
-            Box(Modifier
-                .size(200.dp)
-                .testTag("myClickable")
-                .dynamicClickableModifier(activateDynamicClickable) {
-                    clickableClickCounter++
-                }
-                .pointerInput("unique_key_123") {
-                    awaitPointerEventScope {
-                        while (true) {
-                            val event = awaitPointerEvent()
-                            if (event.type == PointerEventType.Press) {
-                                pointerInputPressCounter++
-                            } else if (event.type == PointerEventType.Release) {
-                                activateDynamicClickable = true
+            Box(
+                Modifier.size(200.dp)
+                    .testTag("myClickable")
+                    .dynamicClickableModifier(activateDynamicClickable) { clickableClickCounter++ }
+                    .pointerInput("unique_key_123") {
+                        awaitPointerEventScope {
+                            while (true) {
+                                val event = awaitPointerEvent()
+                                if (event.type == PointerEventType.Press) {
+                                    pointerInputPressCounter++
+                                } else if (event.type == PointerEventType.Release) {
+                                    activateDynamicClickable = true
+                                }
                             }
                         }
                     }
-                }
             )
         }
 
@@ -1718,24 +1513,22 @@
         var activateDynamicClickable by mutableStateOf(false)
 
         rule.setContent {
-            Box(Modifier
-                .size(200.dp)
-                .testTag("myClickable")
-                .dynamicClickableModifier(activateDynamicClickable) {
-                    clickableClickCounter++
-                }
-                .pointerInput(Unit) {
-                    awaitPointerEventScope {
-                        while (true) {
-                            val event = awaitPointerEvent()
-                            if (event.type == PointerEventType.Press) {
-                                pointerInputPressCounter++
-                            } else if (event.type == PointerEventType.Release) {
-                                activateDynamicClickable = true
+            Box(
+                Modifier.size(200.dp)
+                    .testTag("myClickable")
+                    .dynamicClickableModifier(activateDynamicClickable) { clickableClickCounter++ }
+                    .pointerInput(Unit) {
+                        awaitPointerEventScope {
+                            while (true) {
+                                val event = awaitPointerEvent()
+                                if (event.type == PointerEventType.Press) {
+                                    pointerInputPressCounter++
+                                } else if (event.type == PointerEventType.Release) {
+                                    activateDynamicClickable = true
+                                }
                             }
                         }
                     }
-                }
             )
         }
 
@@ -1778,20 +1571,18 @@
         var activateDynamicPointerInput by mutableStateOf(false)
 
         rule.setContent {
-            Box(Modifier
-                .size(200.dp)
-                .testTag("myClickable")
-                .dynamicPointerInputModifier(
-                    enabled = activateDynamicPointerInput,
-                    key = "unique_key_123",
-                    onPress = {
-                        dynamicPressCounter++
+            Box(
+                Modifier.size(200.dp)
+                    .testTag("myClickable")
+                    .dynamicPointerInputModifier(
+                        enabled = activateDynamicPointerInput,
+                        key = "unique_key_123",
+                        onPress = { dynamicPressCounter++ }
+                    )
+                    .clickable {
+                        clickableClickCounter++
+                        activateDynamicPointerInput = true
                     }
-                )
-                .clickable {
-                    clickableClickCounter++
-                    activateDynamicPointerInput = true
-                }
             )
         }
 
@@ -1826,19 +1617,17 @@
         var activateDynamicPointerInput by mutableStateOf(false)
 
         rule.setContent {
-            Box(Modifier
-                .size(200.dp)
-                .testTag("myClickable")
-                .dynamicPointerInputModifier(
-                    enabled = activateDynamicPointerInput,
-                    onPress = {
-                        dynamicPressCounter++
+            Box(
+                Modifier.size(200.dp)
+                    .testTag("myClickable")
+                    .dynamicPointerInputModifier(
+                        enabled = activateDynamicPointerInput,
+                        onPress = { dynamicPressCounter++ }
+                    )
+                    .clickable {
+                        clickableClickCounter++
+                        activateDynamicPointerInput = true
                     }
-                )
-                .clickable {
-                    clickableClickCounter++
-                    activateDynamicPointerInput = true
-                }
             )
         }
 
@@ -1885,40 +1674,35 @@
         var originalPointerInputEventCounter by mutableStateOf(0)
 
         rule.setContent {
-            Box(Modifier
-                .size(200.dp)
-                .testTag("myClickable")
-                .dynamicPointerInputModifier(
-                    enabled = activeDynamicPointerInput,
-                    onPress = {
-                        dynamicPointerInputPressCounter++
-                    },
-                    onMove = {
-                        dynamicPointerInputMoveCounter++
-                    },
-                    onRelease = {
-                        dynamicPointerInputReleaseCounter++
-                        activeDynamicClickable = true
-                    }
-                )
-                .dynamicClickableModifier(activeDynamicClickable) {
-                    dynamicClickableCounter++
-                }
-                // Note the .background() above the static pointer input block
-                // TODO (jjw): Remove once bug fixed for when a dynamic pointer input follows
-                // directly after another pointer input (both using Unit key).
-                // Workaround: add a modifier between them OR use unique keys (that is, not Unit)
-                .background(Color.Green)
-                .pointerInput(Unit) {
-                    originalPointerInputLambdaExecutionCount++
-                    awaitPointerEventScope {
-                        while (true) {
-                            awaitPointerEvent()
-                            originalPointerInputEventCounter++
-                            activeDynamicPointerInput = true
+            Box(
+                Modifier.size(200.dp)
+                    .testTag("myClickable")
+                    .dynamicPointerInputModifier(
+                        enabled = activeDynamicPointerInput,
+                        onPress = { dynamicPointerInputPressCounter++ },
+                        onMove = { dynamicPointerInputMoveCounter++ },
+                        onRelease = {
+                            dynamicPointerInputReleaseCounter++
+                            activeDynamicClickable = true
+                        }
+                    )
+                    .dynamicClickableModifier(activeDynamicClickable) { dynamicClickableCounter++ }
+                    // Note the .background() above the static pointer input block
+                    // TODO (jjw): Remove once bug fixed for when a dynamic pointer input follows
+                    // directly after another pointer input (both using Unit key).
+                    // Workaround: add a modifier between them OR use unique keys (that is, not
+                    // Unit)
+                    .background(Color.Green)
+                    .pointerInput(Unit) {
+                        originalPointerInputLambdaExecutionCount++
+                        awaitPointerEventScope {
+                            while (true) {
+                                awaitPointerEvent()
+                                originalPointerInputEventCounter++
+                                activeDynamicPointerInput = true
+                            }
                         }
                     }
-                }
             )
         }
 
@@ -1939,9 +1723,7 @@
             assertEquals(0, dynamicClickableCounter)
         }
 
-        rule.onNodeWithTag("myClickable").performTouchInput {
-            down(Offset(0f, 0f))
-        }
+        rule.onNodeWithTag("myClickable").performTouchInput { down(Offset(0f, 0f)) }
 
         rule.runOnIdle {
             assertEquals(1, originalPointerInputLambdaExecutionCount)
@@ -1954,9 +1736,7 @@
             assertEquals(0, dynamicClickableCounter)
         }
 
-        rule.onNodeWithTag("myClickable").performTouchInput {
-            moveTo(Offset(1f, 1f))
-        }
+        rule.onNodeWithTag("myClickable").performTouchInput { moveTo(Offset(1f, 1f)) }
 
         rule.runOnIdle {
             assertEquals(1, originalPointerInputLambdaExecutionCount)
@@ -1969,9 +1749,7 @@
             assertEquals(0, dynamicClickableCounter)
         }
 
-        rule.onNodeWithTag("myClickable").performTouchInput {
-            up()
-        }
+        rule.onNodeWithTag("myClickable").performTouchInput { up() }
 
         rule.runOnIdle {
             assertEquals(1, originalPointerInputLambdaExecutionCount)
@@ -2019,20 +1797,18 @@
         var activateDynamicPointerInput by mutableStateOf(false)
 
         rule.setContent {
-            Box(Modifier
-                .size(200.dp)
-                .testTag("myClickable")
-                .dynamicPointerInputModifier(
-                    enabled = activateDynamicPointerInput,
-                    key = "unique_key_123",
-                    onPress = {
-                        dynamicPressCounter++
+            Box(
+                Modifier.size(200.dp)
+                    .testTag("myClickable")
+                    .dynamicPointerInputModifier(
+                        enabled = activateDynamicPointerInput,
+                        key = "unique_key_123",
+                        onPress = { dynamicPressCounter++ }
+                    )
+                    .clickable {
+                        clickableClickCounter++
+                        activateDynamicPointerInput = true
                     }
-                )
-                .clickable {
-                    clickableClickCounter++
-                    activateDynamicPointerInput = true
-                }
             )
         }
 
@@ -2077,19 +1853,17 @@
         var activateDynamicPointerInput by mutableStateOf(false)
 
         rule.setContent {
-            Box(Modifier
-                .size(200.dp)
-                .testTag("myClickable")
-                .dynamicPointerInputModifier(
-                    enabled = activateDynamicPointerInput,
-                    onPress = {
-                        dynamicPressCounter++
+            Box(
+                Modifier.size(200.dp)
+                    .testTag("myClickable")
+                    .dynamicPointerInputModifier(
+                        enabled = activateDynamicPointerInput,
+                        onPress = { dynamicPressCounter++ }
+                    )
+                    .clickable {
+                        clickableClickCounter++
+                        activateDynamicPointerInput = true
                     }
-                )
-                .clickable {
-                    clickableClickCounter++
-                    activateDynamicPointerInput = true
-                }
             )
         }
 
@@ -2143,35 +1917,29 @@
         var activateDynamicPointerInput by mutableStateOf(false)
 
         rule.setContent {
-            Box(Modifier
-                .size(200.dp)
-                .testTag("myClickable")
-                .dynamicPointerInputModifier(
-                    enabled = activateDynamicPointerInput,
-                    onPress = {
-                        dynamicPressCounter++
-                    },
-                    onRelease = {
-                        dynamicReleaseCounter++
-                    }
-                )
-                .background(Color.Green)
-                .pointerInput(Unit) {
-                    originalPointerInputLambdaExecutionCount++
-                    awaitPointerEventScope {
-                        while (true) {
-                            awaitPointerEvent()
-                            originalPointerInputEventCounter++
-                            activateDynamicPointerInput = true
+            Box(
+                Modifier.size(200.dp)
+                    .testTag("myClickable")
+                    .dynamicPointerInputModifier(
+                        enabled = activateDynamicPointerInput,
+                        onPress = { dynamicPressCounter++ },
+                        onRelease = { dynamicReleaseCounter++ }
+                    )
+                    .background(Color.Green)
+                    .pointerInput(Unit) {
+                        originalPointerInputLambdaExecutionCount++
+                        awaitPointerEventScope {
+                            while (true) {
+                                awaitPointerEvent()
+                                originalPointerInputEventCounter++
+                                activateDynamicPointerInput = true
+                            }
                         }
                     }
-                }
             )
         }
 
-        rule.onNodeWithTag("myClickable").performMouseInput {
-            enter()
-        }
+        rule.onNodeWithTag("myClickable").performMouseInput { enter() }
 
         rule.runOnIdle {
             assertEquals(1, originalPointerInputLambdaExecutionCount)
@@ -2180,9 +1948,7 @@
             assertEquals(0, dynamicReleaseCounter)
         }
 
-        rule.onNodeWithTag("myClickable").performMouseInput {
-            press()
-        }
+        rule.onNodeWithTag("myClickable").performMouseInput { press() }
 
         rule.runOnIdle {
             assertEquals(1, originalPointerInputLambdaExecutionCount)
@@ -2191,9 +1957,7 @@
             assertEquals(0, dynamicReleaseCounter)
         }
 
-        rule.onNodeWithTag("myClickable").performMouseInput {
-            release()
-        }
+        rule.onNodeWithTag("myClickable").performMouseInput { release() }
 
         rule.runOnIdle {
             assertEquals(1, originalPointerInputLambdaExecutionCount)
@@ -2202,9 +1966,7 @@
             assertEquals(1, dynamicReleaseCounter)
         }
 
-        rule.onNodeWithTag("myClickable").performMouseInput {
-            exit()
-        }
+        rule.onNodeWithTag("myClickable").performMouseInput { exit() }
 
         rule.runOnIdle {
             assertEquals(1, originalPointerInputLambdaExecutionCount)
@@ -2231,34 +1993,28 @@
         var activateDynamicPointerInput by mutableStateOf(false)
 
         rule.setContent {
-            Box(Modifier
-                .size(200.dp)
-                .testTag("myClickable")
-                .dynamicPointerInputModifier(
-                    enabled = activateDynamicPointerInput,
-                    onPress = {
-                        dynamicPressCounter++
+            Box(
+                Modifier.size(200.dp)
+                    .testTag("myClickable")
+                    .dynamicPointerInputModifier(
+                        enabled = activateDynamicPointerInput,
+                        onPress = { dynamicPressCounter++ }
+                    )
+                    .clickable {
+                        clickableClickCounter++
+                        activateDynamicPointerInput = true
                     }
-                )
-                .clickable {
-                    clickableClickCounter++
-                    activateDynamicPointerInput = true
-                }
             )
         }
 
-        rule.onNodeWithTag("myClickable").performMouseInput {
-            click()
-        }
+        rule.onNodeWithTag("myClickable").performMouseInput { click() }
 
         rule.runOnIdle {
             assertEquals(1, clickableClickCounter)
             assertEquals(0, dynamicPressCounter)
         }
 
-        rule.onNodeWithTag("myClickable").performMouseInput {
-            click()
-        }
+        rule.onNodeWithTag("myClickable").performMouseInput { click() }
 
         rule.runOnIdle {
             assertEquals(2, clickableClickCounter)
@@ -2298,39 +2054,31 @@
         var activateDynamicPointerInput by mutableStateOf(false)
 
         rule.setContent {
-            Box(Modifier
-                .size(200.dp)
-                .testTag("myClickable")
-                .background(Color.Green)
-                .pointerInput(Unit) {
-                    originalPointerInputLambdaExecutionCount++
-                    awaitPointerEventScope {
-                        while (true) {
-                            awaitPointerEvent()
-                            originalPointerInputEventCounter++
-                            activateDynamicPointerInput = true
+            Box(
+                Modifier.size(200.dp)
+                    .testTag("myClickable")
+                    .background(Color.Green)
+                    .pointerInput(Unit) {
+                        originalPointerInputLambdaExecutionCount++
+                        awaitPointerEventScope {
+                            while (true) {
+                                awaitPointerEvent()
+                                originalPointerInputEventCounter++
+                                activateDynamicPointerInput = true
+                            }
                         }
                     }
-                }
-                .dynamicPointerInputModifier(
-                    enabled = activateDynamicPointerInput,
-                    onPress = {
-                        dynamicPressCounter++
-                    },
-                    onRelease = {
-                        dynamicReleaseCounter++
-                    }
-                )
+                    .dynamicPointerInputModifier(
+                        enabled = activateDynamicPointerInput,
+                        onPress = { dynamicPressCounter++ },
+                        onRelease = { dynamicReleaseCounter++ }
+                    )
             )
         }
 
-        rule.runOnIdle {
-            assertFalse(activateDynamicPointerInput)
-        }
+        rule.runOnIdle { assertFalse(activateDynamicPointerInput) }
 
-        rule.onNodeWithTag("myClickable").performMouseInput {
-            enter()
-        }
+        rule.onNodeWithTag("myClickable").performMouseInput { enter() }
 
         rule.runOnIdle {
             assertTrue(activateDynamicPointerInput)
@@ -2340,9 +2088,7 @@
             assertEquals(0, dynamicReleaseCounter)
         }
 
-        rule.onNodeWithTag("myClickable").performMouseInput {
-            press()
-        }
+        rule.onNodeWithTag("myClickable").performMouseInput { press() }
 
         rule.runOnIdle {
             assertTrue(activateDynamicPointerInput)
@@ -2367,9 +2113,7 @@
             assertEquals(1, dynamicReleaseCounter)
         }
 
-        rule.onNodeWithTag("myClickable").performMouseInput {
-            exit()
-        }
+        rule.onNodeWithTag("myClickable").performMouseInput { exit() }
 
         rule.runOnIdle {
             assertTrue(activateDynamicPointerInput)
@@ -2398,39 +2142,31 @@
         var activateDynamicPointerInput by mutableStateOf(false)
 
         rule.setContent {
-            Box(Modifier
-                .size(200.dp)
-                .testTag("myClickable")
-                .background(Color.Green)
-                .pointerInput(Unit) {
-                    originalPointerInputLambdaExecutionCount++
-                    awaitPointerEventScope {
-                        while (true) {
-                            awaitPointerEvent()
-                            originalPointerInputEventCounter++
-                            activateDynamicPointerInput = true
+            Box(
+                Modifier.size(200.dp)
+                    .testTag("myClickable")
+                    .background(Color.Green)
+                    .pointerInput(Unit) {
+                        originalPointerInputLambdaExecutionCount++
+                        awaitPointerEventScope {
+                            while (true) {
+                                awaitPointerEvent()
+                                originalPointerInputEventCounter++
+                                activateDynamicPointerInput = true
+                            }
                         }
                     }
-                }
-                .dynamicPointerInputModifier(
-                    enabled = activateDynamicPointerInput,
-                    onPress = {
-                        dynamicPressCounter++
-                    },
-                    onRelease = {
-                        dynamicReleaseCounter++
-                    }
-                )
+                    .dynamicPointerInputModifier(
+                        enabled = activateDynamicPointerInput,
+                        onPress = { dynamicPressCounter++ },
+                        onRelease = { dynamicReleaseCounter++ }
+                    )
             )
         }
 
-        rule.runOnIdle {
-            assertFalse(activateDynamicPointerInput)
-        }
+        rule.runOnIdle { assertFalse(activateDynamicPointerInput) }
 
-        rule.onNodeWithTag("myClickable").performMouseInput {
-            click()
-        }
+        rule.onNodeWithTag("myClickable").performMouseInput { click() }
 
         rule.runOnIdle {
             assertTrue(activateDynamicPointerInput)
@@ -2440,9 +2176,7 @@
             assertEquals(0, dynamicReleaseCounter)
         }
 
-        rule.onNodeWithTag("myClickable").performMouseInput {
-            click()
-        }
+        rule.onNodeWithTag("myClickable").performMouseInput { click() }
 
         rule.runOnIdle {
             assertTrue(activateDynamicPointerInput)
@@ -2480,10 +2214,8 @@
 
         rule.setContent {
             Box(Modifier.size(100.dp).testTag("myClickable")) {
-                Box(Modifier
-                    .fillMaxSize()
-                    .background(Color.Green)
-                    .pointerInput(Unit) {
+                Box(
+                    Modifier.fillMaxSize().background(Color.Green).pointerInput(Unit) {
                         originalPointerInputLambdaExecutionCount++
                         awaitPointerEventScope {
                             while (true) {
@@ -2494,28 +2226,20 @@
                         }
                     }
                 )
-                Box(Modifier
-                    .fillMaxSize()
-                    .dynamicPointerInputModifier(
-                        enabled = activateDynamicPointerInput,
-                        onPress = {
-                            dynamicPressCounter++
-                        },
-                        onRelease = {
-                            dynamicReleaseCounter++
-                        }
-                    )
+                Box(
+                    Modifier.fillMaxSize()
+                        .dynamicPointerInputModifier(
+                            enabled = activateDynamicPointerInput,
+                            onPress = { dynamicPressCounter++ },
+                            onRelease = { dynamicReleaseCounter++ }
+                        )
                 )
             }
         }
 
-        rule.runOnIdle {
-            assertFalse(activateDynamicPointerInput)
-        }
+        rule.runOnIdle { assertFalse(activateDynamicPointerInput) }
 
-        rule.onNodeWithTag("myClickable").performMouseInput {
-            click()
-        }
+        rule.onNodeWithTag("myClickable").performMouseInput { click() }
 
         rule.runOnIdle {
             assertTrue(activateDynamicPointerInput)
@@ -2525,9 +2249,7 @@
             assertEquals(0, dynamicReleaseCounter)
         }
 
-        rule.onNodeWithTag("myClickable").performMouseInput {
-            click()
-        }
+        rule.onNodeWithTag("myClickable").performMouseInput { click() }
 
         rule.runOnIdle {
             assertTrue(activateDynamicPointerInput)
@@ -2557,10 +2279,8 @@
 
         rule.setContent {
             Box(Modifier.size(100.dp).testTag("myClickable")) {
-                Box(Modifier
-                    .fillMaxSize()
-                    .background(Color.Green)
-                    .pointerInput(Unit) {
+                Box(
+                    Modifier.fillMaxSize().background(Color.Green).pointerInput(Unit) {
                         originalPointerInputLambdaExecutionCount++
                         awaitPointerEventScope {
                             while (true) {
@@ -2586,30 +2306,24 @@
                         }
                     }
                 )
-                Box(Modifier
-                    .fillMaxSize()
-                    .background(Color.Cyan)
-                    .dynamicPointerInputModifier(
-                        enabled = activateDynamicPointerInput,
-                        onPress = {
-                            dynamicPressCounter++
-                        },
-                        onRelease = {
-                            dynamicReleaseCounter++
-                            activateDynamicPointerInput = false
-                        }
-                    )
+                Box(
+                    Modifier.fillMaxSize()
+                        .background(Color.Cyan)
+                        .dynamicPointerInputModifier(
+                            enabled = activateDynamicPointerInput,
+                            onPress = { dynamicPressCounter++ },
+                            onRelease = {
+                                dynamicReleaseCounter++
+                                activateDynamicPointerInput = false
+                            }
+                        )
                 )
             }
         }
 
-        rule.runOnIdle {
-            assertFalse(activateDynamicPointerInput)
-        }
+        rule.runOnIdle { assertFalse(activateDynamicPointerInput) }
 
-        rule.onNodeWithTag("myClickable").performMouseInput {
-            click()
-        }
+        rule.onNodeWithTag("myClickable").performMouseInput { click() }
 
         rule.runOnIdle {
             assertTrue(activateDynamicPointerInput)
@@ -2619,9 +2333,7 @@
             assertEquals(0, dynamicReleaseCounter)
         }
 
-        rule.onNodeWithTag("myClickable").performMouseInput {
-            click()
-        }
+        rule.onNodeWithTag("myClickable").performMouseInput { click() }
 
         rule.runOnIdle {
             assertFalse(activateDynamicPointerInput)
@@ -2651,10 +2363,8 @@
 
         rule.setContent {
             Box(Modifier.size(100.dp).testTag("myClickable")) {
-                Box(Modifier
-                    .fillMaxSize()
-                    .background(Color.Green)
-                    .pointerInput(Unit) {
+                Box(
+                    Modifier.fillMaxSize().background(Color.Green).pointerInput(Unit) {
                         originalPointerInputLambdaExecutionCount++
                         detectTapGestures {
                             originalPointerInputEventCounter++
@@ -2662,29 +2372,23 @@
                         }
                     }
                 )
-                Box(Modifier
-                    .fillMaxSize()
-                    .dynamicPointerInputModifier(
-                        enabled = activateDynamicPointerInput,
-                        onPress = {
-                            dynamicPressCounter++
-                        },
-                        onRelease = {
-                            dynamicReleaseCounter++
-                            activateDynamicPointerInput = false
-                        }
-                    )
+                Box(
+                    Modifier.fillMaxSize()
+                        .dynamicPointerInputModifier(
+                            enabled = activateDynamicPointerInput,
+                            onPress = { dynamicPressCounter++ },
+                            onRelease = {
+                                dynamicReleaseCounter++
+                                activateDynamicPointerInput = false
+                            }
+                        )
                 )
             }
         }
 
-        rule.runOnIdle {
-            assertFalse(activateDynamicPointerInput)
-        }
+        rule.runOnIdle { assertFalse(activateDynamicPointerInput) }
 
-        rule.onNodeWithTag("myClickable").performMouseInput {
-            click()
-        }
+        rule.onNodeWithTag("myClickable").performMouseInput { click() }
 
         rule.runOnIdle {
             assertTrue(activateDynamicPointerInput)
@@ -2694,9 +2398,7 @@
             assertEquals(0, dynamicReleaseCounter)
         }
 
-        rule.onNodeWithTag("myClickable").performMouseInput {
-            click()
-        }
+        rule.onNodeWithTag("myClickable").performMouseInput { click() }
 
         rule.runOnIdle {
             assertFalse(activateDynamicPointerInput)
@@ -2724,10 +2426,8 @@
 
         rule.setContent {
             Box(Modifier.size(100.dp).testTag("myClickable")) {
-                Box(Modifier
-                    .fillMaxSize()
-                    .background(Color.Green)
-                    .pointerInput("myUniqueKey1") {
+                Box(
+                    Modifier.fillMaxSize().background(Color.Green).pointerInput("myUniqueKey1") {
                         originalPointerInputLambdaExecutionCount++
 
                         detectTapGestures {
@@ -2736,23 +2436,21 @@
                         }
                     }
                 )
-                Box(Modifier
-                    .fillMaxSize()
-                    .dynamicPointerInputModifierWithDetectTapGestures(
-                        enabled = activateDynamicPointerInput,
-                        key = "myUniqueKey2",
-                        onTap = {
-                            dynamicTapGestureCounter++
-                            activateDynamicPointerInput = false
-                        }
-                    )
+                Box(
+                    Modifier.fillMaxSize()
+                        .dynamicPointerInputModifierWithDetectTapGestures(
+                            enabled = activateDynamicPointerInput,
+                            key = "myUniqueKey2",
+                            onTap = {
+                                dynamicTapGestureCounter++
+                                activateDynamicPointerInput = false
+                            }
+                        )
                 )
             }
         }
 
-        rule.runOnIdle {
-            assertFalse(activateDynamicPointerInput)
-        }
+        rule.runOnIdle { assertFalse(activateDynamicPointerInput) }
 
         // This command is the same as
         // rule.onNodeWithTag("myClickable").performTouchInput { click() }
@@ -2800,10 +2498,8 @@
 
         rule.setContent {
             Box(Modifier.size(100.dp).testTag("myClickable")) {
-                Box(Modifier
-                    .fillMaxSize()
-                    .background(Color.Green)
-                    .pointerInput("myUniqueKey1") {
+                Box(
+                    Modifier.fillMaxSize().background(Color.Green).pointerInput("myUniqueKey1") {
                         originalPointerInputLambdaExecutionCount++
 
                         detectTapGestures {
@@ -2812,23 +2508,21 @@
                         }
                     }
                 )
-                Box(Modifier
-                    .fillMaxSize()
-                    .dynamicPointerInputModifierWithDetectTapGestures(
-                        enabled = activateDynamicPointerInput,
-                        key = "myUniqueKey2",
-                        onTap = {
-                            dynamicTapGestureCounter++
-                            activateDynamicPointerInput = false
-                        }
-                    )
+                Box(
+                    Modifier.fillMaxSize()
+                        .dynamicPointerInputModifierWithDetectTapGestures(
+                            enabled = activateDynamicPointerInput,
+                            key = "myUniqueKey2",
+                            onTap = {
+                                dynamicTapGestureCounter++
+                                activateDynamicPointerInput = false
+                            }
+                        )
                 )
             }
         }
 
-        rule.runOnIdle {
-            assertTrue(activateDynamicPointerInput)
-        }
+        rule.runOnIdle { assertTrue(activateDynamicPointerInput) }
 
         rule.onNodeWithTag("myClickable").performClick()
 
@@ -2865,10 +2559,8 @@
 
         rule.setContent {
             Box(Modifier.size(100.dp).testTag("myClickable")) {
-                Box(Modifier
-                    .fillMaxSize()
-                    .background(Color.Green)
-                    .pointerInput(Unit) {
+                Box(
+                    Modifier.fillMaxSize().background(Color.Green).pointerInput(Unit) {
                         originalPointerInputLambdaExecutionCount++
 
                         detectTapGestures {
@@ -2877,23 +2569,21 @@
                         }
                     }
                 )
-                Box(Modifier
-                    .fillMaxSize()
-                    .dynamicPointerInputModifierWithDetectTapGestures(
-                        enabled = activateDynamicPointerInput,
-                        key = Unit,
-                        onTap = {
-                            dynamicTapGestureCounter++
-                            activateDynamicPointerInput = false
-                        }
-                    )
+                Box(
+                    Modifier.fillMaxSize()
+                        .dynamicPointerInputModifierWithDetectTapGestures(
+                            enabled = activateDynamicPointerInput,
+                            key = Unit,
+                            onTap = {
+                                dynamicTapGestureCounter++
+                                activateDynamicPointerInput = false
+                            }
+                        )
                 )
             }
         }
 
-        rule.runOnIdle {
-            assertTrue(activateDynamicPointerInput)
-        }
+        rule.runOnIdle { assertTrue(activateDynamicPointerInput) }
 
         rule.onNodeWithTag("myClickable").performClick()
 
@@ -2931,10 +2621,8 @@
 
         rule.setContent {
             Box(Modifier.size(100.dp).testTag("myClickable")) {
-                Box(Modifier
-                    .fillMaxSize()
-                    .background(Color.Green)
-                    .pointerInput("myUniqueKey1") {
+                Box(
+                    Modifier.fillMaxSize().background(Color.Green).pointerInput("myUniqueKey1") {
                         originalPointerInputLambdaExecutionCount++
 
                         detectTapGestures {
@@ -2943,23 +2631,21 @@
                         }
                     }
                 )
-                Box(Modifier
-                    .fillMaxSize()
-                    .dynamicPointerInputModifierWithDetectTapGestures(
-                        enabled = activateDynamicPointerInput,
-                        key = "myUniqueKey2",
-                        onTap = {
-                            dynamicTapGestureCounter++
-                            activateDynamicPointerInput = false
-                        }
-                    )
+                Box(
+                    Modifier.fillMaxSize()
+                        .dynamicPointerInputModifierWithDetectTapGestures(
+                            enabled = activateDynamicPointerInput,
+                            key = "myUniqueKey2",
+                            onTap = {
+                                dynamicTapGestureCounter++
+                                activateDynamicPointerInput = false
+                            }
+                        )
                 )
             }
         }
 
-        rule.runOnIdle {
-            assertTrue(activateDynamicPointerInput)
-        }
+        rule.runOnIdle { assertTrue(activateDynamicPointerInput) }
 
         rule.onNodeWithTag("myClickable").performMouseInput { click() }
 
@@ -2997,10 +2683,8 @@
 
         rule.setContent {
             Box(Modifier.size(100.dp).testTag("myClickable")) {
-                Box(Modifier
-                    .fillMaxSize()
-                    .background(Color.Green)
-                    .pointerInput(Unit) {
+                Box(
+                    Modifier.fillMaxSize().background(Color.Green).pointerInput(Unit) {
                         originalPointerInputLambdaExecutionCount++
 
                         detectTapGestures {
@@ -3009,23 +2693,21 @@
                         }
                     }
                 )
-                Box(Modifier
-                    .fillMaxSize()
-                    .dynamicPointerInputModifierWithDetectTapGestures(
-                        enabled = activateDynamicPointerInput,
-                        key = Unit,
-                        onTap = {
-                            dynamicTapGestureCounter++
-                            activateDynamicPointerInput = false
-                        }
-                    )
+                Box(
+                    Modifier.fillMaxSize()
+                        .dynamicPointerInputModifierWithDetectTapGestures(
+                            enabled = activateDynamicPointerInput,
+                            key = Unit,
+                            onTap = {
+                                dynamicTapGestureCounter++
+                                activateDynamicPointerInput = false
+                            }
+                        )
                 )
             }
         }
 
-        rule.runOnIdle {
-            assertTrue(activateDynamicPointerInput)
-        }
+        rule.runOnIdle { assertTrue(activateDynamicPointerInput) }
 
         rule.onNodeWithTag("myClickable").performMouseInput { click() }
 
@@ -3046,6 +2728,7 @@
             assertEquals(1, dynamicTapGestureCounter)
         }
     }
+
     // !!!!! MOUSE & TOUCH EVENTS TESTS WITH DYNAMIC MODIFIER INPUT TESTS SECTION (END) !!!!!
 
     // !!!!! HOVER EVENTS ONLY WITH DYNAMIC MODIFIER INPUT TESTS SECTION (START) !!!!!
@@ -3082,48 +2765,40 @@
         var activateDynamicPointerInput by mutableStateOf(false)
 
         rule.setContent {
-            Box(Modifier
-                .size(200.dp)
-                .testTag("myClickable")
-                .dynamicPointerInputModifier(
-                    enabled = activateDynamicPointerInput,
-                    onEnter = {
-                        dynamicEnterCounter++
-                    },
-                    onMove = {
-                        dynamicMoveCounter++
-                    },
-                    onExit = {
-                        dynamicExitCounter++
-                    }
-                )
-                .background(Color.Green)
-                .pointerInput(Unit) {
-                    originalPointerInputLambdaExecutionCount++
-                    awaitPointerEventScope {
-                        while (true) {
-                            val event = awaitPointerEvent()
-                            when (event.type) {
-                                PointerEventType.Enter -> {
-                                    originalPointerInputEnterEventCounter++
-                                    activateDynamicPointerInput = true
-                                }
-                                PointerEventType.Move -> {
-                                    originalPointerInputMoveEventCounter++
-                                }
-                                PointerEventType.Exit -> {
-                                    originalPointerInputExitEventCounter++
+            Box(
+                Modifier.size(200.dp)
+                    .testTag("myClickable")
+                    .dynamicPointerInputModifier(
+                        enabled = activateDynamicPointerInput,
+                        onEnter = { dynamicEnterCounter++ },
+                        onMove = { dynamicMoveCounter++ },
+                        onExit = { dynamicExitCounter++ }
+                    )
+                    .background(Color.Green)
+                    .pointerInput(Unit) {
+                        originalPointerInputLambdaExecutionCount++
+                        awaitPointerEventScope {
+                            while (true) {
+                                val event = awaitPointerEvent()
+                                when (event.type) {
+                                    PointerEventType.Enter -> {
+                                        originalPointerInputEnterEventCounter++
+                                        activateDynamicPointerInput = true
+                                    }
+                                    PointerEventType.Move -> {
+                                        originalPointerInputMoveEventCounter++
+                                    }
+                                    PointerEventType.Exit -> {
+                                        originalPointerInputExitEventCounter++
+                                    }
                                 }
                             }
                         }
                     }
-                }
             )
         }
 
-        rule.onNodeWithTag("myClickable").performMouseInput {
-            enter()
-        }
+        rule.onNodeWithTag("myClickable").performMouseInput { enter() }
 
         rule.runOnIdle {
             assertEquals(1, originalPointerInputLambdaExecutionCount)
@@ -3141,9 +2816,7 @@
         // event stream for the original modifier.)
         // Original pointer input:  Hover Exit event then a Hover Enter event
         // Dynamic pointer input:   Hover enter event
-        rule.onNodeWithTag("myClickable").performMouseInput {
-            moveBy(Offset(1.0f, 1.0f))
-        }
+        rule.onNodeWithTag("myClickable").performMouseInput { moveBy(Offset(1.0f, 1.0f)) }
 
         rule.runOnIdle {
             assertEquals(1, originalPointerInputLambdaExecutionCount)
@@ -3155,9 +2828,7 @@
             assertEquals(0, dynamicExitCounter)
         }
 
-        rule.onNodeWithTag("myClickable").performMouseInput {
-            moveBy(Offset(1.0f, 1.0f))
-        }
+        rule.onNodeWithTag("myClickable").performMouseInput { moveBy(Offset(1.0f, 1.0f)) }
 
         rule.runOnIdle {
             assertEquals(1, originalPointerInputLambdaExecutionCount)
@@ -3169,9 +2840,7 @@
             assertEquals(0, dynamicExitCounter)
         }
 
-        rule.onNodeWithTag("myClickable").performMouseInput {
-            exit()
-        }
+        rule.onNodeWithTag("myClickable").performMouseInput { exit() }
 
         rule.runOnIdle {
             assertEquals(1, originalPointerInputLambdaExecutionCount)
@@ -3198,49 +2867,41 @@
         var activateDynamicPointerInput by mutableStateOf(false)
 
         rule.setContent {
-            Box(Modifier
-                .size(200.dp)
-                .testTag("myClickable")
-                .dynamicPointerInputModifier(
-                    key = "unique_key_1234",
-                    enabled = activateDynamicPointerInput,
-                    onEnter = {
-                        dynamicEnterCounter++
-                    },
-                    onMove = {
-                        dynamicMoveCounter++
-                    },
-                    onExit = {
-                        dynamicExitCounter++
-                    }
-                )
-                .background(Color.Green)
-                .pointerInput("unique_key_5678") {
-                    originalPointerInputLambdaExecutionCount++
-                    awaitPointerEventScope {
-                        while (true) {
-                            val event = awaitPointerEvent()
-                            when (event.type) {
-                                PointerEventType.Enter -> {
-                                    originalPointerInputEnterEventCounter++
-                                    activateDynamicPointerInput = true
-                                }
-                                PointerEventType.Move -> {
-                                    originalPointerInputMoveEventCounter++
-                                }
-                                PointerEventType.Exit -> {
-                                    originalPointerInputExitEventCounter++
+            Box(
+                Modifier.size(200.dp)
+                    .testTag("myClickable")
+                    .dynamicPointerInputModifier(
+                        key = "unique_key_1234",
+                        enabled = activateDynamicPointerInput,
+                        onEnter = { dynamicEnterCounter++ },
+                        onMove = { dynamicMoveCounter++ },
+                        onExit = { dynamicExitCounter++ }
+                    )
+                    .background(Color.Green)
+                    .pointerInput("unique_key_5678") {
+                        originalPointerInputLambdaExecutionCount++
+                        awaitPointerEventScope {
+                            while (true) {
+                                val event = awaitPointerEvent()
+                                when (event.type) {
+                                    PointerEventType.Enter -> {
+                                        originalPointerInputEnterEventCounter++
+                                        activateDynamicPointerInput = true
+                                    }
+                                    PointerEventType.Move -> {
+                                        originalPointerInputMoveEventCounter++
+                                    }
+                                    PointerEventType.Exit -> {
+                                        originalPointerInputExitEventCounter++
+                                    }
                                 }
                             }
                         }
                     }
-                }
             )
         }
 
-        rule.onNodeWithTag("myClickable").performMouseInput {
-            enter()
-        }
+        rule.onNodeWithTag("myClickable").performMouseInput { enter() }
 
         rule.runOnIdle {
             assertEquals(1, originalPointerInputLambdaExecutionCount)
@@ -3258,9 +2919,7 @@
         // event stream for the original modifier.)
         // Original pointer input:  Hover Exit event then a Hover Enter event
         // Dynamic pointer input:   Hover enter event
-        rule.onNodeWithTag("myClickable").performMouseInput {
-            moveBy(Offset(1.0f, 1.0f))
-        }
+        rule.onNodeWithTag("myClickable").performMouseInput { moveBy(Offset(1.0f, 1.0f)) }
 
         rule.runOnIdle {
             assertEquals(1, originalPointerInputLambdaExecutionCount)
@@ -3272,9 +2931,7 @@
             assertEquals(0, dynamicExitCounter)
         }
 
-        rule.onNodeWithTag("myClickable").performMouseInput {
-            moveBy(Offset(1.0f, 1.0f))
-        }
+        rule.onNodeWithTag("myClickable").performMouseInput { moveBy(Offset(1.0f, 1.0f)) }
 
         rule.runOnIdle {
             assertEquals(1, originalPointerInputLambdaExecutionCount)
@@ -3286,9 +2943,7 @@
             assertEquals(0, dynamicExitCounter)
         }
 
-        rule.onNodeWithTag("myClickable").performMouseInput {
-            exit()
-        }
+        rule.onNodeWithTag("myClickable").performMouseInput { exit() }
 
         rule.runOnIdle {
             assertEquals(1, originalPointerInputLambdaExecutionCount)
@@ -3315,48 +2970,40 @@
         var activateDynamicPointerInput by mutableStateOf(false)
 
         rule.setContent {
-            Box(Modifier
-                .size(200.dp)
-                .testTag("myClickable")
-                .pointerInput(Unit) {
-                    originalPointerInputLambdaExecutionCount++
-                    awaitPointerEventScope {
-                        while (true) {
-                            val event = awaitPointerEvent()
-                            when (event.type) {
-                                PointerEventType.Enter -> {
-                                    originalPointerInputEnterEventCounter++
-                                    activateDynamicPointerInput = true
-                                }
-                                PointerEventType.Move -> {
-                                    originalPointerInputMoveEventCounter++
-                                }
-                                PointerEventType.Exit -> {
-                                    originalPointerInputExitEventCounter++
+            Box(
+                Modifier.size(200.dp)
+                    .testTag("myClickable")
+                    .pointerInput(Unit) {
+                        originalPointerInputLambdaExecutionCount++
+                        awaitPointerEventScope {
+                            while (true) {
+                                val event = awaitPointerEvent()
+                                when (event.type) {
+                                    PointerEventType.Enter -> {
+                                        originalPointerInputEnterEventCounter++
+                                        activateDynamicPointerInput = true
+                                    }
+                                    PointerEventType.Move -> {
+                                        originalPointerInputMoveEventCounter++
+                                    }
+                                    PointerEventType.Exit -> {
+                                        originalPointerInputExitEventCounter++
+                                    }
                                 }
                             }
                         }
                     }
-                }
-                .background(Color.Green)
-                .dynamicPointerInputModifier(
-                    enabled = activateDynamicPointerInput,
-                    onEnter = {
-                        dynamicEnterCounter++
-                    },
-                    onMove = {
-                        dynamicMoveCounter++
-                    },
-                    onExit = {
-                        dynamicExitCounter++
-                    }
-                )
+                    .background(Color.Green)
+                    .dynamicPointerInputModifier(
+                        enabled = activateDynamicPointerInput,
+                        onEnter = { dynamicEnterCounter++ },
+                        onMove = { dynamicMoveCounter++ },
+                        onExit = { dynamicExitCounter++ }
+                    )
             )
         }
 
-        rule.onNodeWithTag("myClickable").performMouseInput {
-            enter()
-        }
+        rule.onNodeWithTag("myClickable").performMouseInput { enter() }
 
         rule.runOnIdle {
             assertEquals(1, originalPointerInputLambdaExecutionCount)
@@ -3374,9 +3021,7 @@
         // event stream for the original modifier.)
         // Original pointer input:  Move event
         // Dynamic pointer input:   Hover enter event
-        rule.onNodeWithTag("myClickable").performMouseInput {
-            moveBy(Offset(1.0f, 1.0f))
-        }
+        rule.onNodeWithTag("myClickable").performMouseInput { moveBy(Offset(1.0f, 1.0f)) }
 
         rule.runOnIdle {
             assertEquals(1, originalPointerInputLambdaExecutionCount)
@@ -3388,9 +3033,7 @@
             assertEquals(0, dynamicExitCounter)
         }
 
-        rule.onNodeWithTag("myClickable").performMouseInput {
-            moveBy(Offset(1.0f, 1.0f))
-        }
+        rule.onNodeWithTag("myClickable").performMouseInput { moveBy(Offset(1.0f, 1.0f)) }
 
         rule.runOnIdle {
             assertEquals(1, originalPointerInputLambdaExecutionCount)
@@ -3402,9 +3045,7 @@
             assertEquals(0, dynamicExitCounter)
         }
 
-        rule.onNodeWithTag("myClickable").performMouseInput {
-            exit()
-        }
+        rule.onNodeWithTag("myClickable").performMouseInput { exit() }
 
         rule.runOnIdle {
             assertEquals(1, originalPointerInputLambdaExecutionCount)
@@ -3431,49 +3072,41 @@
         var activateDynamicPointerInput by mutableStateOf(false)
 
         rule.setContent {
-            Box(Modifier
-                .size(200.dp)
-                .testTag("myClickable")
-                .pointerInput("unique_key_5678") {
-                    originalPointerInputLambdaExecutionCount++
-                    awaitPointerEventScope {
-                        while (true) {
-                            val event = awaitPointerEvent()
-                            when (event.type) {
-                                PointerEventType.Enter -> {
-                                    originalPointerInputEnterEventCounter++
-                                    activateDynamicPointerInput = true
-                                }
-                                PointerEventType.Move -> {
-                                    originalPointerInputMoveEventCounter++
-                                }
-                                PointerEventType.Exit -> {
-                                    originalPointerInputExitEventCounter++
+            Box(
+                Modifier.size(200.dp)
+                    .testTag("myClickable")
+                    .pointerInput("unique_key_5678") {
+                        originalPointerInputLambdaExecutionCount++
+                        awaitPointerEventScope {
+                            while (true) {
+                                val event = awaitPointerEvent()
+                                when (event.type) {
+                                    PointerEventType.Enter -> {
+                                        originalPointerInputEnterEventCounter++
+                                        activateDynamicPointerInput = true
+                                    }
+                                    PointerEventType.Move -> {
+                                        originalPointerInputMoveEventCounter++
+                                    }
+                                    PointerEventType.Exit -> {
+                                        originalPointerInputExitEventCounter++
+                                    }
                                 }
                             }
                         }
                     }
-                }
-                .background(Color.Green)
-                .dynamicPointerInputModifier(
-                    key = "unique_key_1234",
-                    enabled = activateDynamicPointerInput,
-                    onEnter = {
-                        dynamicEnterCounter++
-                    },
-                    onMove = {
-                        dynamicMoveCounter++
-                    },
-                    onExit = {
-                        dynamicExitCounter++
-                    }
-                )
+                    .background(Color.Green)
+                    .dynamicPointerInputModifier(
+                        key = "unique_key_1234",
+                        enabled = activateDynamicPointerInput,
+                        onEnter = { dynamicEnterCounter++ },
+                        onMove = { dynamicMoveCounter++ },
+                        onExit = { dynamicExitCounter++ }
+                    )
             )
         }
 
-        rule.onNodeWithTag("myClickable").performMouseInput {
-            enter()
-        }
+        rule.onNodeWithTag("myClickable").performMouseInput { enter() }
 
         rule.runOnIdle {
             assertEquals(1, originalPointerInputLambdaExecutionCount)
@@ -3491,9 +3124,7 @@
         // event stream for the original modifier.)
         // Original pointer input:  Move event
         // Dynamic pointer input:   Hover enter event
-        rule.onNodeWithTag("myClickable").performMouseInput {
-            moveBy(Offset(1.0f, 1.0f))
-        }
+        rule.onNodeWithTag("myClickable").performMouseInput { moveBy(Offset(1.0f, 1.0f)) }
 
         rule.runOnIdle {
             assertEquals(1, originalPointerInputLambdaExecutionCount)
@@ -3505,9 +3136,7 @@
             assertEquals(0, dynamicExitCounter)
         }
 
-        rule.onNodeWithTag("myClickable").performMouseInput {
-            moveBy(Offset(1.0f, 1.0f))
-        }
+        rule.onNodeWithTag("myClickable").performMouseInput { moveBy(Offset(1.0f, 1.0f)) }
 
         rule.runOnIdle {
             assertEquals(1, originalPointerInputLambdaExecutionCount)
@@ -3519,9 +3148,7 @@
             assertEquals(0, dynamicExitCounter)
         }
 
-        rule.onNodeWithTag("myClickable").performMouseInput {
-            exit()
-        }
+        rule.onNodeWithTag("myClickable").performMouseInput { exit() }
 
         rule.runOnIdle {
             assertEquals(1, originalPointerInputLambdaExecutionCount)
@@ -3549,10 +3176,8 @@
 
         rule.setContent {
             Box(Modifier.size(100.dp).testTag("myClickable")) {
-                Box(Modifier
-                    .fillMaxSize()
-                    .background(Color.Green)
-                    .pointerInput(Unit) {
+                Box(
+                    Modifier.fillMaxSize().background(Color.Green).pointerInput(Unit) {
                         originalPointerInputLambdaExecutionCount++
                         awaitPointerEventScope {
                             while (true) {
@@ -3573,31 +3198,21 @@
                         }
                     }
                 )
-                Box(Modifier
-                    .fillMaxSize()
-                    .dynamicPointerInputModifier(
-                        enabled = activateDynamicPointerInput,
-                        onEnter = {
-                            dynamicEnterCounter++
-                        },
-                        onMove = {
-                            dynamicMoveCounter++
-                        },
-                        onExit = {
-                            dynamicExitCounter++
-                        }
-                    )
+                Box(
+                    Modifier.fillMaxSize()
+                        .dynamicPointerInputModifier(
+                            enabled = activateDynamicPointerInput,
+                            onEnter = { dynamicEnterCounter++ },
+                            onMove = { dynamicMoveCounter++ },
+                            onExit = { dynamicExitCounter++ }
+                        )
                 )
             }
         }
 
-        rule.runOnIdle {
-            assertFalse(activateDynamicPointerInput)
-        }
+        rule.runOnIdle { assertFalse(activateDynamicPointerInput) }
 
-        rule.onNodeWithTag("myClickable").performMouseInput {
-            enter()
-        }
+        rule.onNodeWithTag("myClickable").performMouseInput { enter() }
 
         rule.runOnIdle {
             assertEquals(1, originalPointerInputLambdaExecutionCount)
@@ -3609,9 +3224,7 @@
             assertEquals(0, dynamicExitCounter)
         }
 
-        rule.onNodeWithTag("myClickable").performMouseInput {
-            moveBy(Offset(1.0f, 1.0f))
-        }
+        rule.onNodeWithTag("myClickable").performMouseInput { moveBy(Offset(1.0f, 1.0f)) }
 
         rule.runOnIdle {
             assertEquals(1, originalPointerInputLambdaExecutionCount)
@@ -3623,9 +3236,7 @@
             assertEquals(0, dynamicExitCounter)
         }
 
-        rule.onNodeWithTag("myClickable").performMouseInput {
-            moveBy(Offset(1.0f, 1.0f))
-        }
+        rule.onNodeWithTag("myClickable").performMouseInput { moveBy(Offset(1.0f, 1.0f)) }
 
         rule.runOnIdle {
             assertEquals(1, originalPointerInputLambdaExecutionCount)
@@ -3637,9 +3248,7 @@
             assertEquals(0, dynamicExitCounter)
         }
 
-        rule.onNodeWithTag("myClickable").performMouseInput {
-            exit()
-        }
+        rule.onNodeWithTag("myClickable").performMouseInput { exit() }
 
         rule.runOnIdle {
             assertEquals(1, originalPointerInputLambdaExecutionCount)
@@ -3667,10 +3276,8 @@
 
         rule.setContent {
             Box(Modifier.size(100.dp).testTag("myClickable")) {
-                Box(Modifier
-                    .fillMaxSize()
-                    .background(Color.Green)
-                    .pointerInput("unique_key_1234") {
+                Box(
+                    Modifier.fillMaxSize().background(Color.Green).pointerInput("unique_key_1234") {
                         originalPointerInputLambdaExecutionCount++
                         awaitPointerEventScope {
                             while (true) {
@@ -3691,32 +3298,22 @@
                         }
                     }
                 )
-                Box(Modifier
-                    .fillMaxSize()
-                    .dynamicPointerInputModifier(
-                        key = "unique_key_5678",
-                        enabled = activateDynamicPointerInput,
-                        onEnter = {
-                            dynamicEnterCounter++
-                        },
-                        onMove = {
-                            dynamicMoveCounter++
-                        },
-                        onExit = {
-                            dynamicExitCounter++
-                        }
-                    )
+                Box(
+                    Modifier.fillMaxSize()
+                        .dynamicPointerInputModifier(
+                            key = "unique_key_5678",
+                            enabled = activateDynamicPointerInput,
+                            onEnter = { dynamicEnterCounter++ },
+                            onMove = { dynamicMoveCounter++ },
+                            onExit = { dynamicExitCounter++ }
+                        )
                 )
             }
         }
 
-        rule.runOnIdle {
-            assertFalse(activateDynamicPointerInput)
-        }
+        rule.runOnIdle { assertFalse(activateDynamicPointerInput) }
 
-        rule.onNodeWithTag("myClickable").performMouseInput {
-            enter()
-        }
+        rule.onNodeWithTag("myClickable").performMouseInput { enter() }
 
         rule.runOnIdle {
             assertEquals(1, originalPointerInputLambdaExecutionCount)
@@ -3728,9 +3325,7 @@
             assertEquals(0, dynamicExitCounter)
         }
 
-        rule.onNodeWithTag("myClickable").performMouseInput {
-            moveBy(Offset(1.0f, 1.0f))
-        }
+        rule.onNodeWithTag("myClickable").performMouseInput { moveBy(Offset(1.0f, 1.0f)) }
 
         rule.runOnIdle {
             assertEquals(1, originalPointerInputLambdaExecutionCount)
@@ -3742,9 +3337,7 @@
             assertEquals(0, dynamicExitCounter)
         }
 
-        rule.onNodeWithTag("myClickable").performMouseInput {
-            moveBy(Offset(1.0f, 1.0f))
-        }
+        rule.onNodeWithTag("myClickable").performMouseInput { moveBy(Offset(1.0f, 1.0f)) }
 
         rule.runOnIdle {
             assertEquals(1, originalPointerInputLambdaExecutionCount)
@@ -3756,9 +3349,7 @@
             assertEquals(0, dynamicExitCounter)
         }
 
-        rule.onNodeWithTag("myClickable").performMouseInput {
-            exit()
-        }
+        rule.onNodeWithTag("myClickable").performMouseInput { exit() }
 
         rule.runOnIdle {
             assertEquals(1, originalPointerInputLambdaExecutionCount)
@@ -3786,25 +3377,17 @@
 
         rule.setContent {
             Box(Modifier.size(100.dp).testTag("myClickable")) {
-                Box(Modifier
-                    .fillMaxSize()
-                    .dynamicPointerInputModifier(
-                        enabled = activateDynamicPointerInput,
-                        onEnter = {
-                            dynamicEnterCounter++
-                        },
-                        onMove = {
-                            dynamicMoveCounter++
-                        },
-                        onExit = {
-                            dynamicExitCounter++
-                        }
-                    )
+                Box(
+                    Modifier.fillMaxSize()
+                        .dynamicPointerInputModifier(
+                            enabled = activateDynamicPointerInput,
+                            onEnter = { dynamicEnterCounter++ },
+                            onMove = { dynamicMoveCounter++ },
+                            onExit = { dynamicExitCounter++ }
+                        )
                 )
-                Box(Modifier
-                    .fillMaxSize()
-                    .background(Color.Green)
-                    .pointerInput(Unit) {
+                Box(
+                    Modifier.fillMaxSize().background(Color.Green).pointerInput(Unit) {
                         originalPointerInputLambdaExecutionCount++
                         awaitPointerEventScope {
                             while (true) {
@@ -3828,13 +3411,9 @@
             }
         }
 
-        rule.runOnIdle {
-            assertFalse(activateDynamicPointerInput)
-        }
+        rule.runOnIdle { assertFalse(activateDynamicPointerInput) }
 
-        rule.onNodeWithTag("myClickable").performMouseInput {
-            enter()
-        }
+        rule.onNodeWithTag("myClickable").performMouseInput { enter() }
 
         rule.runOnIdle {
             assertEquals(1, originalPointerInputLambdaExecutionCount)
@@ -3846,9 +3425,7 @@
             assertEquals(0, dynamicExitCounter)
         }
 
-        rule.onNodeWithTag("myClickable").performMouseInput {
-            moveBy(Offset(1.0f, 1.0f))
-        }
+        rule.onNodeWithTag("myClickable").performMouseInput { moveBy(Offset(1.0f, 1.0f)) }
 
         rule.runOnIdle {
             assertEquals(1, originalPointerInputLambdaExecutionCount)
@@ -3860,9 +3437,7 @@
             assertEquals(0, dynamicExitCounter)
         }
 
-        rule.onNodeWithTag("myClickable").performMouseInput {
-            moveBy(Offset(1.0f, 1.0f))
-        }
+        rule.onNodeWithTag("myClickable").performMouseInput { moveBy(Offset(1.0f, 1.0f)) }
 
         rule.runOnIdle {
             assertEquals(1, originalPointerInputLambdaExecutionCount)
@@ -3874,9 +3449,7 @@
             assertEquals(0, dynamicExitCounter)
         }
 
-        rule.onNodeWithTag("myClickable").performMouseInput {
-            exit()
-        }
+        rule.onNodeWithTag("myClickable").performMouseInput { exit() }
 
         rule.runOnIdle {
             assertEquals(1, originalPointerInputLambdaExecutionCount)
@@ -3904,26 +3477,18 @@
 
         rule.setContent {
             Box(Modifier.size(100.dp).testTag("myClickable")) {
-                Box(Modifier
-                    .fillMaxSize()
-                    .dynamicPointerInputModifier(
-                        key = "unique_key_5678",
-                        enabled = activateDynamicPointerInput,
-                        onEnter = {
-                            dynamicEnterCounter++
-                        },
-                        onMove = {
-                            dynamicMoveCounter++
-                        },
-                        onExit = {
-                            dynamicExitCounter++
-                        }
-                    )
+                Box(
+                    Modifier.fillMaxSize()
+                        .dynamicPointerInputModifier(
+                            key = "unique_key_5678",
+                            enabled = activateDynamicPointerInput,
+                            onEnter = { dynamicEnterCounter++ },
+                            onMove = { dynamicMoveCounter++ },
+                            onExit = { dynamicExitCounter++ }
+                        )
                 )
-                Box(Modifier
-                    .fillMaxSize()
-                    .background(Color.Green)
-                    .pointerInput("unique_key_1234") {
+                Box(
+                    Modifier.fillMaxSize().background(Color.Green).pointerInput("unique_key_1234") {
                         originalPointerInputLambdaExecutionCount++
                         awaitPointerEventScope {
                             while (true) {
@@ -3947,13 +3512,9 @@
             }
         }
 
-        rule.runOnIdle {
-            assertFalse(activateDynamicPointerInput)
-        }
+        rule.runOnIdle { assertFalse(activateDynamicPointerInput) }
 
-        rule.onNodeWithTag("myClickable").performMouseInput {
-            enter()
-        }
+        rule.onNodeWithTag("myClickable").performMouseInput { enter() }
 
         rule.runOnIdle {
             assertEquals(1, originalPointerInputLambdaExecutionCount)
@@ -3965,9 +3526,7 @@
             assertEquals(0, dynamicExitCounter)
         }
 
-        rule.onNodeWithTag("myClickable").performMouseInput {
-            moveBy(Offset(1.0f, 1.0f))
-        }
+        rule.onNodeWithTag("myClickable").performMouseInput { moveBy(Offset(1.0f, 1.0f)) }
 
         rule.runOnIdle {
             assertEquals(1, originalPointerInputLambdaExecutionCount)
@@ -3979,9 +3538,7 @@
             assertEquals(0, dynamicExitCounter)
         }
 
-        rule.onNodeWithTag("myClickable").performMouseInput {
-            moveBy(Offset(1.0f, 1.0f))
-        }
+        rule.onNodeWithTag("myClickable").performMouseInput { moveBy(Offset(1.0f, 1.0f)) }
 
         rule.runOnIdle {
             assertEquals(1, originalPointerInputLambdaExecutionCount)
@@ -3993,9 +3550,7 @@
             assertEquals(0, dynamicExitCounter)
         }
 
-        rule.onNodeWithTag("myClickable").performMouseInput {
-            exit()
-        }
+        rule.onNodeWithTag("myClickable").performMouseInput { exit() }
 
         rule.runOnIdle {
             assertEquals(1, originalPointerInputLambdaExecutionCount)
@@ -4007,6 +3562,7 @@
             assertEquals(0, dynamicExitCounter)
         }
     }
+
     // !!!!! HOVER EVENTS ONLY WITH DYNAMIC MODIFIER INPUT TESTS SECTION (END) !!!!!
 
     @OptIn(ExperimentalTestApi::class)
@@ -4021,68 +3577,54 @@
         rule.setContent {
             scope = rememberCoroutineScope()
             BasicText(
-            "ClickableText",
-                modifier = Modifier
-                    .testTag("myClickable")
-                    .clickable(
-                        enabled = enabled.value,
-                        onClick = {},
-                        interactionSource = interactionSource,
-                        indication = null
-                    )
+                "ClickableText",
+                modifier =
+                    Modifier.testTag("myClickable")
+                        .clickable(
+                            enabled = enabled.value,
+                            onClick = {},
+                            interactionSource = interactionSource,
+                            indication = null
+                        )
             )
         }
 
         val interactions = mutableListOf<Interaction>()
 
-        scope.launch {
-            interactionSource.interactions.collect { interactions.add(it) }
-        }
+        scope.launch { interactionSource.interactions.collect { interactions.add(it) } }
 
-        rule.runOnIdle {
-            assertThat(interactions).isEmpty()
-        }
+        rule.runOnIdle { assertThat(interactions).isEmpty() }
 
-        rule.onNodeWithTag("myClickable")
-            .performMouseInput { enter(center) }
+        rule.onNodeWithTag("myClickable").performMouseInput { enter(center) }
 
         rule.runOnIdle {
             assertThat(interactions).hasSize(1)
             assertThat(interactions.first()).isInstanceOf(HoverInteraction.Enter::class.java)
         }
 
-        rule.onNodeWithTag("myClickable")
-            .performMouseInput { exit(Offset(-1f, -1f)) }
+        rule.onNodeWithTag("myClickable").performMouseInput { exit(Offset(-1f, -1f)) }
 
         rule.runOnIdle {
             interactions.clear()
             enabled.value = false
         }
 
-        rule.onNodeWithTag("myClickable")
-            .performMouseInput { enter(center) }
+        rule.onNodeWithTag("myClickable").performMouseInput { enter(center) }
 
-        rule.runOnIdle {
-            assertThat(interactions).isEmpty()
-        }
+        rule.runOnIdle { assertThat(interactions).isEmpty() }
 
-        rule.onNodeWithTag("myClickable")
-            .performMouseInput { exit(Offset(-1f, -1f)) }
+        rule.onNodeWithTag("myClickable").performMouseInput { exit(Offset(-1f, -1f)) }
 
-        rule.runOnIdle {
-            enabled.value = true
-        }
+        rule.runOnIdle { enabled.value = true }
 
-        rule.onNodeWithTag("myClickable")
-            .performMouseInput { enter(center) }
+        rule.onNodeWithTag("myClickable").performMouseInput { enter(center) }
 
         rule.runOnIdle {
             assertThat(interactions).hasSize(1)
             assertThat(interactions.first()).isInstanceOf(HoverInteraction.Enter::class.java)
         }
 
-        rule.onNodeWithTag("myClickable")
-            .performMouseInput { exit(Offset(-1f, -1f)) }
+        rule.onNodeWithTag("myClickable").performMouseInput { exit(Offset(-1f, -1f)) }
     }
 
     @OptIn(ExperimentalComposeUiApi::class)
@@ -4090,10 +3632,12 @@
     fun noFocus_whenDisabled() {
         val requester = FocusRequester()
         // Force clickable to always be in non-touch mode, so it should be focusable
-        val keyboardMockManager = object : InputModeManager {
-            override val inputMode = Keyboard
-            override fun requestInputMode(inputMode: InputMode) = true
-        }
+        val keyboardMockManager =
+            object : InputModeManager {
+                override val inputMode = Keyboard
+
+                override fun requestInputMode(inputMode: InputMode) = true
+            }
 
         val enabled = mutableStateOf(true)
         lateinit var focusState: FocusState
@@ -4103,11 +3647,11 @@
                 Box {
                     BasicText(
                         "ClickableText",
-                        modifier = Modifier
-                            .testTag("myClickable")
-                            .focusRequester(requester)
-                            .onFocusEvent { focusState = it }
-                            .clickable(enabled = enabled.value) {}
+                        modifier =
+                            Modifier.testTag("myClickable")
+                                .focusRequester(requester)
+                                .onFocusEvent { focusState = it }
+                                .clickable(enabled = enabled.value) {}
                     )
                 }
             }
@@ -4118,9 +3662,7 @@
             assertThat(focusState.isFocused).isTrue()
         }
 
-        rule.runOnIdle {
-            enabled.value = false
-        }
+        rule.runOnIdle { enabled.value = false }
 
         rule.runOnIdle {
             assertThat(focusState.isFocused).isFalse()
@@ -4129,18 +3671,18 @@
         }
     }
 
-    /**
-     * Test for b/269319898
-     */
+    /** Test for b/269319898 */
     @OptIn(ExperimentalComposeUiApi::class)
     @Test
     fun noFocusPropertiesSet_whenDisabled() {
         val requester = FocusRequester()
         // Force clickable to always be in non-touch mode, so it should be focusable
-        val keyboardMockManager = object : InputModeManager {
-            override val inputMode = Keyboard
-            override fun requestInputMode(inputMode: InputMode) = true
-        }
+        val keyboardMockManager =
+            object : InputModeManager {
+                override val inputMode = Keyboard
+
+                override fun requestInputMode(inputMode: InputMode) = true
+            }
 
         val enabled = mutableStateOf(true)
         lateinit var focusState: FocusState
@@ -4149,8 +3691,7 @@
             CompositionLocalProvider(LocalInputModeManager provides keyboardMockManager) {
                 Box(Modifier.clickable(enabled = enabled.value, onClick = {})) {
                     Box(
-                        Modifier
-                            .size(10.dp)
+                        Modifier.size(10.dp)
                             // If clickable is setting canFocus to true without a focus target, then
                             // that would override this property
                             .focusProperties { canFocus = false }
@@ -4170,9 +3711,7 @@
             assertThat(focusState.isFocused).isFalse()
         }
 
-        rule.runOnIdle {
-            enabled.value = false
-        }
+        rule.runOnIdle { enabled.value = false }
 
         rule.runOnIdle {
             // Clickable is disabled, it should not apply properties down the tree
@@ -4183,39 +3722,38 @@
 
     @Test
     fun testInspectorValue_noIndicationOverload() {
-        val onClick: () -> Unit = { }
+        val onClick: () -> Unit = {}
         rule.setContent {
             val modifier = Modifier.clickable(onClick = onClick) as InspectableValue
             assertThat(modifier.nameFallback).isEqualTo("clickable")
             assertThat(modifier.valueOverride).isNull()
-            assertThat(modifier.inspectableElements.map { it.name }.asIterable()).containsExactly(
-                "enabled",
-                "onClickLabel",
-                "role",
-                "onClick"
-            )
+            assertThat(modifier.inspectableElements.map { it.name }.asIterable())
+                .containsExactly("enabled", "onClickLabel", "role", "onClick")
         }
     }
 
     @Test
     fun testInspectorValue_fullParamsOverload() {
-        val onClick: () -> Unit = { }
+        val onClick: () -> Unit = {}
         rule.setContent {
-            val modifier = Modifier.clickable(
-                onClick = onClick,
-                interactionSource = remember { MutableInteractionSource() },
-                indication = null
-            ).first() as InspectableValue
+            val modifier =
+                Modifier.clickable(
+                        onClick = onClick,
+                        interactionSource = remember { MutableInteractionSource() },
+                        indication = null
+                    )
+                    .first() as InspectableValue
             assertThat(modifier.nameFallback).isEqualTo("clickable")
             assertThat(modifier.valueOverride).isNull()
-            assertThat(modifier.inspectableElements.map { it.name }.asIterable()).containsExactly(
-                "enabled",
-                "onClickLabel",
-                "onClick",
-                "role",
-                "indicationNodeFactory",
-                "interactionSource"
-            )
+            assertThat(modifier.inspectableElements.map { it.name }.asIterable())
+                .containsExactly(
+                    "enabled",
+                    "onClickLabel",
+                    "onClick",
+                    "role",
+                    "indicationNodeFactory",
+                    "interactionSource"
+                )
         }
     }
 
@@ -4225,21 +3763,13 @@
         val wasSuccess = mutableStateOf(false)
         rule.setContent {
             Box(
-                Modifier
-                    .size(100.dp)
-                    .testTag("myClickable")
-                    .pointerInput(Unit) {
-                        detectTapGestures(
-                            onPress = {
-                                wasSuccess.value = tryAwaitRelease()
-                            }
-                        )
-                    }
+                Modifier.size(100.dp).testTag("myClickable").pointerInput(Unit) {
+                    detectTapGestures(onPress = { wasSuccess.value = tryAwaitRelease() })
+                }
             )
         }
 
-        rule.onNodeWithTag("myClickable")
-            .performClick()
+        rule.onNodeWithTag("myClickable").performClick()
 
         assertThat(wasSuccess.value).isTrue()
     }
@@ -4250,26 +3780,22 @@
         val tag = "my clickable"
         rule.setContent {
             Box(
-                Modifier
-                    .requiredHeight(20.dp)
+                Modifier.requiredHeight(20.dp)
                     .requiredWidth(20.dp)
                     .clipToBounds()
                     .clickable { clicked = true }
                     .testTag(tag)
             )
         }
-        rule.onNodeWithTag(tag)
+        rule
+            .onNodeWithTag(tag)
             .assertWidthIsEqualTo(20.dp)
             .assertHeightIsEqualTo(20.dp)
             .assertTouchHeightIsEqualTo(48.dp)
             .assertTouchWidthIsEqualTo(48.dp)
-            .performTouchInput {
-                click(Offset(-1f, -1f))
-            }
+            .performTouchInput { click(Offset(-1f, -1f)) }
 
-        rule.runOnIdle {
-            assertThat(clicked).isTrue()
-        }
+        rule.runOnIdle { assertThat(clicked).isTrue() }
     }
 
     @Test
@@ -4278,26 +3804,22 @@
         val tag = "my clickable"
         rule.setContent {
             Box(
-                Modifier
-                    .requiredHeight(50.dp)
+                Modifier.requiredHeight(50.dp)
                     .requiredWidth(20.dp)
                     .clipToBounds()
                     .clickable { clicked = true }
                     .testTag(tag)
             )
         }
-        rule.onNodeWithTag(tag)
+        rule
+            .onNodeWithTag(tag)
             .assertWidthIsEqualTo(20.dp)
             .assertHeightIsEqualTo(50.dp)
             .assertTouchHeightIsEqualTo(50.dp)
             .assertTouchWidthIsEqualTo(48.dp)
-            .performTouchInput {
-                click(Offset(-1f, 0f))
-            }
+            .performTouchInput { click(Offset(-1f, 0f)) }
 
-        rule.runOnIdle {
-            assertThat(clicked).isTrue()
-        }
+        rule.runOnIdle { assertThat(clicked).isTrue() }
     }
 
     @Test
@@ -4306,26 +3828,22 @@
         val tag = "my clickable"
         rule.setContent {
             Box(
-                Modifier
-                    .requiredHeight(20.dp)
+                Modifier.requiredHeight(20.dp)
                     .requiredWidth(50.dp)
                     .clipToBounds()
                     .clickable { clicked = true }
                     .testTag(tag)
             )
         }
-        rule.onNodeWithTag(tag)
+        rule
+            .onNodeWithTag(tag)
             .assertWidthIsEqualTo(50.dp)
             .assertHeightIsEqualTo(20.dp)
             .assertTouchHeightIsEqualTo(48.dp)
             .assertTouchWidthIsEqualTo(50.dp)
-            .performTouchInput {
-                click(Offset(0f, -1f))
-            }
+            .performTouchInput { click(Offset(0f, -1f)) }
 
-        rule.runOnIdle {
-            assertThat(clicked).isTrue()
-        }
+        rule.runOnIdle { assertThat(clicked).isTrue() }
     }
 
     @Test
@@ -4339,11 +3857,10 @@
             scope = rememberCoroutineScope()
             inputModeManager = LocalInputModeManager.current
             Box(Modifier.padding(10.dp)) {
-                BasicText("ClickableText",
-                    modifier = Modifier
-                        .testTag("clickable")
-                        .focusRequester(focusRequester)
-                        .clickable(
+                BasicText(
+                    "ClickableText",
+                    modifier =
+                        Modifier.testTag("clickable").focusRequester(focusRequester).clickable(
                             interactionSource = interactionSource,
                             indication = null
                         ) {}
@@ -4356,9 +3873,7 @@
         }
 
         val interactions = mutableListOf<Interaction>()
-        scope.launch {
-            interactionSource.interactions.collect { interactions.add(it) }
-        }
+        scope.launch { interactionSource.interactions.collect { interactions.add(it) } }
 
         rule.onNodeWithTag("clickable").performKeyInput { keyDown(Key.Enter) }
 
@@ -4387,11 +3902,10 @@
             scope = rememberCoroutineScope()
             inputModeManager = LocalInputModeManager.current
             Box(Modifier.padding(10.dp)) {
-                BasicText("ClickableText",
-                    modifier = Modifier
-                        .testTag("clickable")
-                        .focusRequester(focusRequester)
-                        .clickable(
+                BasicText(
+                    "ClickableText",
+                    modifier =
+                        Modifier.testTag("clickable").focusRequester(focusRequester).clickable(
                             interactionSource = interactionSource,
                             indication = null
                         ) {}
@@ -4404,9 +3918,7 @@
         }
 
         val interactions = mutableListOf<Interaction>()
-        scope.launch {
-            interactionSource.interactions.collect { interactions.add(it) }
-        }
+        scope.launch { interactionSource.interactions.collect { interactions.add(it) } }
 
         rule.onNodeWithTag("clickable").performKeyInput { keyDown(Key.NumPadEnter) }
 
@@ -4435,11 +3947,10 @@
             scope = rememberCoroutineScope()
             inputModeManager = LocalInputModeManager.current
             Box(Modifier.padding(10.dp)) {
-                BasicText("ClickableText",
-                    modifier = Modifier
-                        .testTag("clickable")
-                        .focusRequester(focusRequester)
-                        .clickable(
+                BasicText(
+                    "ClickableText",
+                    modifier =
+                        Modifier.testTag("clickable").focusRequester(focusRequester).clickable(
                             interactionSource = interactionSource,
                             indication = null
                         ) {}
@@ -4453,9 +3964,7 @@
         rule.waitForIdle()
 
         val interactions = mutableListOf<Interaction>()
-        scope.launch {
-            interactionSource.interactions.collect { interactions.add(it) }
-        }
+        scope.launch { interactionSource.interactions.collect { interactions.add(it) } }
 
         rule.onNodeWithTag("clickable").performKeyInput { keyDown(Key.DirectionCenter) }
 
@@ -4484,11 +3993,10 @@
             scope = rememberCoroutineScope()
             inputModeManager = LocalInputModeManager.current
             Box(Modifier.padding(10.dp)) {
-                BasicText("ClickableText",
-                    modifier = Modifier
-                        .testTag("clickable")
-                        .focusRequester(focusRequester)
-                        .clickable(
+                BasicText(
+                    "ClickableText",
+                    modifier =
+                        Modifier.testTag("clickable").focusRequester(focusRequester).clickable(
                             interactionSource = interactionSource,
                             indication = null
                         ) {}
@@ -4501,14 +4009,10 @@
         }
 
         val interactions = mutableListOf<Interaction>()
-        scope.launch {
-            interactionSource.interactions.collect { interactions.add(it) }
-        }
+        scope.launch { interactionSource.interactions.collect { interactions.add(it) } }
 
         rule.onNodeWithTag("clickable").performKeyInput { pressKey(Key.Spacebar) }
-        rule.runOnIdle {
-            assertThat(interactions).isEmpty()
-        }
+        rule.runOnIdle { assertThat(interactions).isEmpty() }
     }
 
     @Test
@@ -4522,11 +4026,10 @@
             scope = rememberCoroutineScope()
             inputModeManager = LocalInputModeManager.current
             Box(Modifier.padding(10.dp)) {
-                BasicText("ClickableText",
-                    modifier = Modifier
-                        .testTag("clickable")
-                        .focusRequester(focusRequester)
-                        .clickable(
+                BasicText(
+                    "ClickableText",
+                    modifier =
+                        Modifier.testTag("clickable").focusRequester(focusRequester).clickable(
                             interactionSource = interactionSource,
                             indication = null
                         ) {}
@@ -4539,9 +4042,7 @@
         }
 
         val interactions = mutableListOf<Interaction>()
-        scope.launch {
-            interactionSource.interactions.collect { interactions.add(it) }
-        }
+        scope.launch { interactionSource.interactions.collect { interactions.add(it) } }
 
         val clickableNode = rule.onNodeWithTag("clickable")
 
@@ -4585,19 +4086,19 @@
             scope = rememberCoroutineScope()
             inputModeManager = LocalInputModeManager.current
             Box(Modifier.padding(10.dp)) {
-                BasicText("ClickableText",
-                    modifier = Modifier
-                        .testTag("clickable")
-                        .focusRequester(focusRequester)
-                        .onKeyEvent {
-                            if (it.nativeKeyEvent.repeatCount != 0)
-                                repeatCounter++
-                            false
-                        }
-                        .clickable(
-                            interactionSource = interactionSource,
-                            indication = null,
-                        ) {}
+                BasicText(
+                    "ClickableText",
+                    modifier =
+                        Modifier.testTag("clickable")
+                            .focusRequester(focusRequester)
+                            .onKeyEvent {
+                                if (it.nativeKeyEvent.repeatCount != 0) repeatCounter++
+                                false
+                            }
+                            .clickable(
+                                interactionSource = interactionSource,
+                                indication = null,
+                            ) {}
                 )
             }
         }
@@ -4607,9 +4108,7 @@
         }
 
         val interactions = mutableListOf<Interaction>()
-        scope.launch {
-            interactionSource.interactions.collect { interactions.add(it) }
-        }
+        scope.launch { interactionSource.interactions.collect { interactions.add(it) } }
 
         rule.onNodeWithTag("clickable").performKeyInput {
             keyDown(Key.Enter)
@@ -4646,11 +4145,10 @@
             scope = rememberCoroutineScope()
             inputModeManager = LocalInputModeManager.current
             Box(Modifier.padding(10.dp)) {
-                BasicText("ClickableText",
-                    modifier = Modifier
-                        .testTag("clickable")
-                        .focusRequester(focusRequester)
-                        .clickable(
+                BasicText(
+                    "ClickableText",
+                    modifier =
+                        Modifier.testTag("clickable").focusRequester(focusRequester).clickable(
                             interactionSource = interactionSource,
                             indication = null,
                             enabled = enabled.value
@@ -4664,9 +4162,7 @@
         }
 
         val interactions = mutableListOf<Interaction>()
-        scope.launch {
-            interactionSource.interactions.collect { interactions.add(it) }
-        }
+        scope.launch { interactionSource.interactions.collect { interactions.add(it) } }
 
         val clickableNode = rule.onNodeWithTag("clickable")
 
@@ -4708,19 +4204,17 @@
         val indication = TestIndication { created = true }
         rule.setContent {
             Box(Modifier.padding(10.dp)) {
-                BasicText("ClickableText",
-                    modifier = Modifier
-                        .testTag("clickable")
-                        .clickable(
+                BasicText(
+                    "ClickableText",
+                    modifier =
+                        Modifier.testTag("clickable").clickable(
                             interactionSource = interactionSource,
                             indication = indication
                         ) {}
                 )
             }
         }
-        rule.runOnIdle {
-            assertThat(created).isTrue()
-        }
+        rule.runOnIdle { assertThat(created).isTrue() }
     }
 
     @Test
@@ -4730,19 +4224,17 @@
         val indication = TestIndicationNodeFactory { _, _ -> created = true }
         rule.setContent {
             Box(Modifier.padding(10.dp)) {
-                BasicText("ClickableText",
-                    modifier = Modifier
-                        .testTag("clickable")
-                        .clickable(
+                BasicText(
+                    "ClickableText",
+                    modifier =
+                        Modifier.testTag("clickable").clickable(
                             interactionSource = interactionSource,
                             indication = indication
                         ) {}
                 )
             }
         }
-        rule.runOnIdle {
-            assertThat(created).isTrue()
-        }
+        rule.runOnIdle { assertThat(created).isTrue() }
     }
 
     // Indication (not IndicationNodeFactory) is always eagerly created
@@ -4756,8 +4248,8 @@
             interactionSource = it
             created = true
             scope.launch {
-                interactionSource.interactions.collect {
-                    interaction -> interactions.add(interaction)
+                interactionSource.interactions.collect { interaction ->
+                    interactions.add(interaction)
                 }
             }
         }
@@ -4765,10 +4257,10 @@
         rule.setContent {
             scope = rememberCoroutineScope()
             Box(Modifier.padding(10.dp)) {
-                BasicText("ClickableText",
-                    modifier = Modifier
-                        .testTag("clickable")
-                        .clickable(
+                BasicText(
+                    "ClickableText",
+                    modifier =
+                        Modifier.testTag("clickable").clickable(
                             interactionSource = null,
                             indication = indication
                         ) {}
@@ -4781,8 +4273,7 @@
             assertThat(interactions).isEmpty()
         }
 
-        rule.onNodeWithTag("clickable")
-            .performTouchInput { down(center) }
+        rule.onNodeWithTag("clickable").performTouchInput { down(center) }
 
         rule.runOnIdle {
             assertThat(interactions).hasSize(1)
@@ -4799,18 +4290,18 @@
             interactionSource = source
             created = true
             coroutineScope.launch {
-                interactionSource.interactions.collect {
-                    interaction -> interactions.add(interaction)
+                interactionSource.interactions.collect { interaction ->
+                    interactions.add(interaction)
                 }
             }
         }
 
         rule.setContent {
             Box(Modifier.padding(10.dp)) {
-                BasicText("ClickableText",
-                    modifier = Modifier
-                        .testTag("clickable")
-                        .clickable(
+                BasicText(
+                    "ClickableText",
+                    modifier =
+                        Modifier.testTag("clickable").clickable(
                             interactionSource = null,
                             indication = indication
                         ) {}
@@ -4818,13 +4309,10 @@
             }
         }
 
-        rule.runOnIdle {
-            assertThat(created).isFalse()
-        }
+        rule.runOnIdle { assertThat(created).isFalse() }
 
         // The touch event should cause the indication node to be created
-        rule.onNodeWithTag("clickable")
-            .performTouchInput { down(center) }
+        rule.onNodeWithTag("clickable").performTouchInput { down(center) }
 
         rule.runOnIdle {
             assertThat(created).isTrue()
@@ -4845,8 +4333,8 @@
             interactionSource = source
             created = true
             coroutineScope.launch {
-                interactionSource.interactions.collect {
-                    interaction -> interactions.add(interaction)
+                interactionSource.interactions.collect { interaction ->
+                    interactions.add(interaction)
                 }
             }
         }
@@ -4854,11 +4342,10 @@
         rule.setContent {
             inputModeManager = LocalInputModeManager.current
             Box(Modifier.padding(10.dp)) {
-                BasicText("ClickableText",
-                    modifier = Modifier
-                        .testTag("clickable")
-                        .focusRequester(focusRequester)
-                        .clickable(
+                BasicText(
+                    "ClickableText",
+                    modifier =
+                        Modifier.testTag("clickable").focusRequester(focusRequester).clickable(
                             interactionSource = null,
                             indication = indication
                         ) {}
@@ -4866,9 +4353,7 @@
             }
         }
 
-        rule.runOnIdle {
-            assertThat(created).isFalse()
-        }
+        rule.runOnIdle { assertThat(created).isFalse() }
 
         rule.runOnIdle {
             // Clickable is only focusable in non-touch mode
@@ -4903,8 +4388,8 @@
             interactionSource = source
             created = true
             coroutineScope.launch {
-                interactionSource.interactions.collect {
-                    interaction -> interactions.add(interaction)
+                interactionSource.interactions.collect { interaction ->
+                    interactions.add(interaction)
                 }
             }
         }
@@ -4913,22 +4398,15 @@
             inputModeManager = LocalInputModeManager.current
             // Add focusable to the top so that when initial focus is dispatched, the clickable
             // doesn't become focused
-            Box(
-                Modifier
-                    .padding(10.dp)
-                    .focusable()) {
+            Box(Modifier.padding(10.dp).focusable()) {
                 Box(
-                    modifier = Modifier
-                        .testTag("clickable")
-                        .clickable(
+                    modifier =
+                        Modifier.testTag("clickable").clickable(
                             interactionSource = null,
                             indication = indication
                         ) {}
                 ) {
-                    Box(
-                        Modifier
-                            .focusRequester(focusRequester)
-                            .focusable())
+                    Box(Modifier.focusRequester(focusRequester).focusable())
                 }
             }
         }
@@ -4967,8 +4445,8 @@
         val testIndicationNodeFactory = TestIndicationNodeFactory { _, coroutineScope ->
             nodeCreated = true
             coroutineScope.launch {
-                interactionSource.interactions.collect {
-                    interaction -> interactions.add(interaction)
+                interactionSource.interactions.collect { interaction ->
+                    interactions.add(interaction)
                 }
             }
         }
@@ -4977,10 +4455,10 @@
 
         rule.setContent {
             Box(Modifier.padding(10.dp)) {
-                BasicText("ClickableText",
-                    modifier = Modifier
-                        .testTag("clickable")
-                        .clickable(
+                BasicText(
+                    "ClickableText",
+                    modifier =
+                        Modifier.testTag("clickable").clickable(
                             interactionSource = interactionSource,
                             indication = indication
                         ) {}
@@ -4993,12 +4471,9 @@
             indication = testIndicationNodeFactory
         }
 
-        rule.runOnIdle {
-            assertThat(nodeCreated).isTrue()
-        }
+        rule.runOnIdle { assertThat(nodeCreated).isTrue() }
 
-        rule.onNodeWithTag("clickable")
-            .performTouchInput { down(center) }
+        rule.onNodeWithTag("clickable").performTouchInput { down(center) }
 
         rule.runOnIdle {
             assertThat(interactions).hasSize(1)
@@ -5021,8 +4496,8 @@
             interactionSource = source
             created1 = true
             coroutineScope.launch {
-                interactionSource.interactions.collect {
-                    interaction -> interactions.add(interaction)
+                interactionSource.interactions.collect { interaction ->
+                    interactions.add(interaction)
                 }
             }
         }
@@ -5030,8 +4505,8 @@
             interactionSource = source
             created2 = true
             coroutineScope.launch {
-                interactionSource.interactions.collect {
-                        interaction -> interactions.add(interaction)
+                interactionSource.interactions.collect { interaction ->
+                    interactions.add(interaction)
                 }
             }
         }
@@ -5040,10 +4515,10 @@
 
         rule.setContent {
             Box(Modifier.padding(10.dp)) {
-                BasicText("ClickableText",
-                    modifier = Modifier
-                        .testTag("clickable")
-                        .clickable(
+                BasicText(
+                    "ClickableText",
+                    modifier =
+                        Modifier.testTag("clickable").clickable(
                             interactionSource = null,
                             indication = indication
                         ) {}
@@ -5051,21 +4526,16 @@
             }
         }
 
-        rule.runOnIdle {
-            assertThat(created1).isFalse()
-        }
+        rule.runOnIdle { assertThat(created1).isFalse() }
 
-        rule.runOnIdle {
-            indication = indication2
-        }
+        rule.runOnIdle { indication = indication2 }
 
         rule.runOnIdle {
             // We should still not be created
             assertThat(created2).isFalse()
         }
 
-        rule.onNodeWithTag("clickable")
-            .performTouchInput { down(center) }
+        rule.onNodeWithTag("clickable").performTouchInput { down(center) }
 
         rule.runOnIdle {
             assertThat(created2).isTrue()
@@ -5076,8 +4546,8 @@
 
     /**
      * Test case for null InteractionSource with a provided indication: the indication should be
-     * lazily created, but then if we change indication after creation, the new indication should
-     * be created immediately
+     * lazily created, but then if we change indication after creation, the new indication should be
+     * created immediately
      */
     @Test
     fun indicationNodeFactory_changingIndication_afterCreation() {
@@ -5086,23 +4556,22 @@
         var created2 = false
         lateinit var interactionSource: InteractionSource
         val interactions = mutableListOf<Interaction>()
-        val indication1 = TestIndicationNodeFactory(
-            onDetach = { detached1 = true }
-        ) { source, coroutineScope ->
-            interactionSource = source
-            created1 = true
-            coroutineScope.launch {
-                interactionSource.interactions.collect {
-                    interaction -> interactions.add(interaction)
+        val indication1 =
+            TestIndicationNodeFactory(onDetach = { detached1 = true }) { source, coroutineScope ->
+                interactionSource = source
+                created1 = true
+                coroutineScope.launch {
+                    interactionSource.interactions.collect { interaction ->
+                        interactions.add(interaction)
+                    }
                 }
             }
-        }
         val indication2 = TestIndicationNodeFactory { source, coroutineScope ->
             interactionSource = source
             created2 = true
             coroutineScope.launch {
-                interactionSource.interactions.collect {
-                    interaction -> interactions.add(interaction)
+                interactionSource.interactions.collect { interaction ->
+                    interactions.add(interaction)
                 }
             }
         }
@@ -5111,10 +4580,10 @@
 
         rule.setContent {
             Box(Modifier.padding(10.dp)) {
-                BasicText("ClickableText",
-                    modifier = Modifier
-                        .testTag("clickable")
-                        .clickable(
+                BasicText(
+                    "ClickableText",
+                    modifier =
+                        Modifier.testTag("clickable").clickable(
                             interactionSource = null,
                             indication = indication
                         ) {}
@@ -5122,12 +4591,9 @@
             }
         }
 
-        rule.runOnIdle {
-            assertThat(created1).isFalse()
-        }
+        rule.runOnIdle { assertThat(created1).isFalse() }
 
-        rule.onNodeWithTag("clickable")
-            .performTouchInput { down(center) }
+        rule.onNodeWithTag("clickable").performTouchInput { down(center) }
 
         rule.runOnIdle {
             assertThat(created1).isTrue()
@@ -5135,8 +4601,7 @@
             assertThat(interactions.first()).isInstanceOf(PressInteraction.Press::class.java)
         }
 
-        rule.onNodeWithTag("clickable")
-            .performTouchInput { up() }
+        rule.onNodeWithTag("clickable").performTouchInput { up() }
 
         rule.runOnIdle {
             interactions.clear()
@@ -5150,8 +4615,7 @@
             assertThat(detached1).isTrue()
         }
 
-        rule.onNodeWithTag("clickable")
-            .performTouchInput { down(center) }
+        rule.onNodeWithTag("clickable").performTouchInput { down(center) }
 
         rule.runOnIdle {
             assertThat(interactions).hasSize(1)
@@ -5167,27 +4631,25 @@
     fun indicationNodeFactory_changingInteractionSourceToAnotherInteractionSource() {
         var created = false
         var detached = false
-        var interactionSource: MutableInteractionSource by mutableStateOf(
-            MutableInteractionSource()
-        )
+        var interactionSource: MutableInteractionSource by
+            mutableStateOf(MutableInteractionSource())
         val interactions = mutableListOf<Interaction>()
-        val indication = TestIndicationNodeFactory(
-            onDetach = { detached = true }
-        ) { _, coroutineScope ->
-            created = true
-            coroutineScope.launch {
-                interactionSource.interactions.collect {
-                    interaction -> interactions.add(interaction)
+        val indication =
+            TestIndicationNodeFactory(onDetach = { detached = true }) { _, coroutineScope ->
+                created = true
+                coroutineScope.launch {
+                    interactionSource.interactions.collect { interaction ->
+                        interactions.add(interaction)
+                    }
                 }
             }
-        }
 
         rule.setContent {
             Box(Modifier.padding(10.dp)) {
-                BasicText("ClickableText",
-                    modifier = Modifier
-                        .testTag("clickable")
-                        .clickable(
+                BasicText(
+                    "ClickableText",
+                    modifier =
+                        Modifier.testTag("clickable").clickable(
                             interactionSource = interactionSource,
                             indication = indication
                         ) {}
@@ -5208,8 +4670,7 @@
             assertThat(created).isTrue()
         }
 
-        rule.onNodeWithTag("clickable")
-            .performTouchInput { down(center) }
+        rule.onNodeWithTag("clickable").performTouchInput { down(center) }
 
         rule.runOnIdle {
             assertThat(interactions).hasSize(1)
@@ -5229,18 +4690,18 @@
         val indication = TestIndicationNodeFactory { _, coroutineScope ->
             created = true
             coroutineScope.launch {
-                interactionSource!!.interactions.collect {
-                    interaction -> interactions.add(interaction)
+                interactionSource!!.interactions.collect { interaction ->
+                    interactions.add(interaction)
                 }
             }
         }
 
         rule.setContent {
             Box(Modifier.padding(10.dp)) {
-                BasicText("ClickableText",
-                    modifier = Modifier
-                        .testTag("clickable")
-                        .clickable(
+                BasicText(
+                    "ClickableText",
+                    modifier =
+                        Modifier.testTag("clickable").clickable(
                             interactionSource = interactionSource,
                             indication = indication
                         ) {}
@@ -5258,8 +4719,7 @@
             assertThat(created).isTrue()
         }
 
-        rule.onNodeWithTag("clickable")
-            .performTouchInput { down(center) }
+        rule.onNodeWithTag("clickable").performTouchInput { down(center) }
 
         rule.runOnIdle {
             assertThat(interactions).hasSize(1)
@@ -5275,29 +4735,27 @@
     fun indicationNodeFactory_changingInteractionSourceToNull() {
         var created = false
         var detached = false
-        var interactionSource: MutableInteractionSource? by mutableStateOf(
-            MutableInteractionSource()
-        )
+        var interactionSource: MutableInteractionSource? by
+            mutableStateOf(MutableInteractionSource())
         var internalInteractionSource: InteractionSource?
         val interactions = mutableListOf<Interaction>()
-        val indication = TestIndicationNodeFactory(
-            onDetach = { detached = true }
-        ) { source, coroutineScope ->
-            internalInteractionSource = source
-            created = true
-            coroutineScope.launch {
-                internalInteractionSource?.interactions?.collect {
-                    interaction -> interactions.add(interaction)
+        val indication =
+            TestIndicationNodeFactory(onDetach = { detached = true }) { source, coroutineScope ->
+                internalInteractionSource = source
+                created = true
+                coroutineScope.launch {
+                    internalInteractionSource?.interactions?.collect { interaction ->
+                        interactions.add(interaction)
+                    }
                 }
             }
-        }
 
         rule.setContent {
             Box(Modifier.padding(10.dp)) {
-                BasicText("ClickableText",
-                    modifier = Modifier
-                        .testTag("clickable")
-                        .clickable(
+                BasicText(
+                    "ClickableText",
+                    modifier =
+                        Modifier.testTag("clickable").clickable(
                             interactionSource = interactionSource,
                             indication = indication
                         ) {}
@@ -5318,8 +4776,7 @@
             assertThat(created).isTrue()
         }
 
-        rule.onNodeWithTag("clickable")
-            .performTouchInput { down(center) }
+        rule.onNodeWithTag("clickable").performTouchInput { down(center) }
 
         rule.runOnIdle {
             assertThat(interactions).hasSize(1)
@@ -5333,17 +4790,18 @@
         var detachedCount = 0
         val interactionSources = mutableListOf<InteractionSource>()
         val interactions = mutableListOf<Interaction>()
-        val indication = TestIndicationNodeFactory(
-            onDetach = { detachedCount++ }
-        ) { interactionSource, coroutineScope ->
-            attachedCount++
-            interactionSources += interactionSource
-            coroutineScope.launch {
-                interactionSource.interactions.collect {
-                    interaction -> interactions.add(interaction)
+        val indication =
+            TestIndicationNodeFactory(onDetach = { detachedCount++ }) {
+                interactionSource,
+                coroutineScope ->
+                attachedCount++
+                interactionSources += interactionSource
+                coroutineScope.launch {
+                    interactionSource.interactions.collect { interaction ->
+                        interactions.add(interaction)
+                    }
                 }
             }
-        }
 
         var key by mutableStateOf(true)
 
@@ -5352,9 +4810,8 @@
                 ReusableContent(key) {
                     BasicText(
                         "ClickableText",
-                        modifier = Modifier
-                            .testTag("clickable")
-                            .clickable(
+                        modifier =
+                            Modifier.testTag("clickable").clickable(
                                 interactionSource = null,
                                 indication = indication
                             ) {}
@@ -5363,13 +4820,10 @@
             }
         }
 
-        rule.runOnIdle {
-            assertThat(attachedCount).isEqualTo(0)
-        }
+        rule.runOnIdle { assertThat(attachedCount).isEqualTo(0) }
 
         // The touch event should cause the indication node to be created
-        rule.onNodeWithTag("clickable")
-            .performTouchInput { down(center) }
+        rule.onNodeWithTag("clickable").performTouchInput { down(center) }
 
         rule.runOnIdle {
             assertThat(attachedCount).isEqualTo(1)
@@ -5396,12 +4850,11 @@
         }
 
         // The touch event should cause a new indication node and interaction source to be created
-        rule.onNodeWithTag("clickable")
-            .performTouchInput {
-                // Need to reset the previous down
-                up()
-                down(center)
-            }
+        rule.onNodeWithTag("clickable").performTouchInput {
+            // Need to reset the previous down
+            up()
+            down(center)
+        }
 
         rule.runOnIdle {
             // The new node should be created now
@@ -5425,17 +4878,18 @@
         lateinit var inputModeManager: InputModeManager
         val interactionSources = mutableListOf<InteractionSource>()
         val interactions = mutableListOf<Interaction>()
-        val indication = TestIndicationNodeFactory(
-            onDetach = { detachedCount++ }
-        ) { interactionSource, coroutineScope ->
-            attachedCount++
-            interactionSources += interactionSource
-            coroutineScope.launch {
-                interactionSource.interactions.collect {
-                    interaction -> interactions.add(interaction)
+        val indication =
+            TestIndicationNodeFactory(onDetach = { detachedCount++ }) {
+                interactionSource,
+                coroutineScope ->
+                attachedCount++
+                interactionSources += interactionSource
+                coroutineScope.launch {
+                    interactionSource.interactions.collect { interaction ->
+                        interactions.add(interaction)
+                    }
                 }
             }
-        }
 
         var key by mutableStateOf(true)
 
@@ -5447,10 +4901,8 @@
                 ReusableContent(key) {
                     BasicText(
                         "ClickableText",
-                        modifier = Modifier
-                            .testTag("clickable")
-                            .focusRequester(focusRequester)
-                            .clickable(
+                        modifier =
+                            Modifier.testTag("clickable").focusRequester(focusRequester).clickable(
                                 interactionSource = null,
                                 indication = indication
                             ) {}
@@ -5459,9 +4911,7 @@
             }
         }
 
-        rule.runOnIdle {
-            assertThat(attachedCount).isEqualTo(0)
-        }
+        rule.runOnIdle { assertThat(attachedCount).isEqualTo(0) }
 
         rule.runOnIdle {
             // Clickable is only focusable in non-touch mode
@@ -5518,26 +4968,26 @@
         var detachedCount = 0
         val interactionSources = mutableListOf<InteractionSource>()
         val interactions = mutableListOf<Interaction>()
-        val indication = TestIndicationNodeFactory(
-            onDetach = { detachedCount++ }
-        ) { interactionSource, coroutineScope ->
-            attachedCount++
-            interactionSources += interactionSource
-            coroutineScope.launch {
-                interactionSource.interactions.collect {
-                    interaction -> interactions.add(interaction)
+        val indication =
+            TestIndicationNodeFactory(onDetach = { detachedCount++ }) {
+                interactionSource,
+                coroutineScope ->
+                attachedCount++
+                interactionSources += interactionSource
+                coroutineScope.launch {
+                    interactionSource.interactions.collect { interaction ->
+                        interactions.add(interaction)
+                    }
                 }
             }
-        }
 
         var moveContent by mutableStateOf(false)
 
         val content = movableContentOf {
             BasicText(
                 "ClickableText",
-                modifier = Modifier
-                    .testTag("clickable")
-                    .clickable(
+                modifier =
+                    Modifier.testTag("clickable").clickable(
                         interactionSource = null,
                         indication = indication
                     ) {}
@@ -5546,23 +4996,16 @@
 
         rule.setContent {
             if (moveContent) {
-                Box {
-                    content()
-                }
+                Box { content() }
             } else {
-                Box {
-                    content()
-                }
+                Box { content() }
             }
         }
 
-        rule.runOnIdle {
-            assertThat(attachedCount).isEqualTo(0)
-        }
+        rule.runOnIdle { assertThat(attachedCount).isEqualTo(0) }
 
         // The touch event should cause the indication node to be created
-        rule.onNodeWithTag("clickable")
-            .performTouchInput { down(center) }
+        rule.onNodeWithTag("clickable").performTouchInput { down(center) }
 
         rule.runOnIdle {
             assertThat(attachedCount).isEqualTo(1)
@@ -5589,12 +5032,11 @@
         }
 
         // The touch event should cause a new indication node and interaction source to be created
-        rule.onNodeWithTag("clickable")
-            .performTouchInput {
-                // Need to reset the previous down
-                up()
-                down(center)
-            }
+        rule.onNodeWithTag("clickable").performTouchInput {
+            // Need to reset the previous down
+            up()
+            down(center)
+        }
 
         rule.runOnIdle {
             // The new node should be created now
@@ -5618,27 +5060,26 @@
         lateinit var inputModeManager: InputModeManager
         val interactionSources = mutableListOf<InteractionSource>()
         val interactions = mutableListOf<Interaction>()
-        val indication = TestIndicationNodeFactory(
-            onDetach = { detachedCount++ }
-        ) { interactionSource, coroutineScope ->
-            attachedCount++
-            interactionSources += interactionSource
-            coroutineScope.launch {
-                interactionSource.interactions.collect {
-                    interaction -> interactions.add(interaction)
+        val indication =
+            TestIndicationNodeFactory(onDetach = { detachedCount++ }) {
+                interactionSource,
+                coroutineScope ->
+                attachedCount++
+                interactionSources += interactionSource
+                coroutineScope.launch {
+                    interactionSource.interactions.collect { interaction ->
+                        interactions.add(interaction)
+                    }
                 }
             }
-        }
 
         var moveContent by mutableStateOf(false)
 
         val content = movableContentOf {
             BasicText(
                 "ClickableText",
-                modifier = Modifier
-                    .testTag("clickable")
-                    .focusRequester(focusRequester)
-                    .clickable(
+                modifier =
+                    Modifier.testTag("clickable").focusRequester(focusRequester).clickable(
                         interactionSource = null,
                         indication = indication
                     ) {}
@@ -5650,19 +5091,13 @@
         rule.setFocusableContent {
             inputModeManager = LocalInputModeManager.current
             if (moveContent) {
-                Box {
-                    content()
-                }
+                Box { content() }
             } else {
-                Box {
-                    content()
-                }
+                Box { content() }
             }
         }
 
-        rule.runOnIdle {
-            assertThat(attachedCount).isEqualTo(0)
-        }
+        rule.runOnIdle { assertThat(attachedCount).isEqualTo(0) }
 
         rule.runOnIdle {
             // Clickable is only focusable in non-touch mode
@@ -5768,16 +5203,10 @@
     fun nullInteractionSourceNonNullIndication_nonEquality() {
         val onClick = {}
         val indication = TestIndication {}
-        val modifier1 = Modifier.clickable(
-            interactionSource = null,
-            indication = indication,
-            onClick = onClick
-        )
-        val modifier2 = Modifier.clickable(
-            interactionSource = null,
-            indication = indication,
-            onClick = onClick
-        )
+        val modifier1 =
+            Modifier.clickable(interactionSource = null, indication = indication, onClick = onClick)
+        val modifier2 =
+            Modifier.clickable(interactionSource = null, indication = indication, onClick = onClick)
 
         // Indication requires composed, so cannot compare equal
         assertThat(modifier1).isNotEqualTo(modifier2)
@@ -5803,16 +5232,18 @@
         val onClick = {}
         val interactionSource = MutableInteractionSource()
         val indication = TestIndication {}
-        val modifier1 = Modifier.clickable(
-            interactionSource = interactionSource,
-            indication = indication,
-            onClick = onClick
-        )
-        val modifier2 = Modifier.clickable(
-            interactionSource = interactionSource,
-            indication = indication,
-            onClick = onClick
-        )
+        val modifier1 =
+            Modifier.clickable(
+                interactionSource = interactionSource,
+                indication = indication,
+                onClick = onClick
+            )
+        val modifier2 =
+            Modifier.clickable(
+                interactionSource = interactionSource,
+                indication = indication,
+                onClick = onClick
+            )
 
         // Indication requires composed, so cannot compare equal
         assertThat(modifier1).isNotEqualTo(modifier2)
@@ -5823,13 +5254,7 @@
         // Arrange.
         val tag = "testClickable"
         rule.setContent {
-            Box(
-                Modifier
-                    .size(10.dp)
-                    .testTag(tag)
-                    .focusProperties { canFocus = true }
-                    .clickable {}
-            )
+            Box(Modifier.size(10.dp).testTag(tag).focusProperties { canFocus = true }.clickable {})
         }
 
         // Act.
@@ -5845,8 +5270,7 @@
         val tag = "testClickable"
         rule.setContent {
             Box(
-                Modifier
-                    .size(10.dp)
+                Modifier.size(10.dp)
                     .testTag(tag)
                     .focusProperties { canFocus = true }
                     .clickable(enabled = false) {}
@@ -5871,8 +5295,7 @@
         rule.setContent {
             focusManager = LocalFocusManager.current
             Box(
-                Modifier
-                    .size(10.dp)
+                Modifier.size(10.dp)
                     .testTag(tag)
                     .focusProperties { canFocus = true }
                     .clickable(enabled = enabled) {}
@@ -5918,10 +5341,10 @@
             val content = remember {
                 movableContentOf {
                     BoxWithConstraints {
-                        BasicText("ClickableText",
-                            modifier = Modifier
-                                .testTag("clickable")
-                                .clickable(
+                        BasicText(
+                            "ClickableText",
+                            modifier =
+                                Modifier.testTag("clickable").clickable(
                                     role = if (moveContent) Role.Button else Role.Checkbox,
                                     onClickLabel = moveContent.toString()
                                 ) {}
@@ -5930,20 +5353,18 @@
                 }
             }
 
-            key(moveContent) {
-                content()
-            }
+            key(moveContent) { content() }
         }
 
-        rule.onNodeWithTag("clickable")
+        rule
+            .onNodeWithTag("clickable")
             .assert(SemanticsMatcher.expectValue(SemanticsProperties.Role, Role.Checkbox))
             .assertOnClickLabelMatches("false")
 
-        rule.runOnIdle {
-            moveContent = true
-        }
+        rule.runOnIdle { moveContent = true }
 
-        rule.onNodeWithTag("clickable")
+        rule
+            .onNodeWithTag("clickable")
             .assert(SemanticsMatcher.expectValue(SemanticsProperties.Role, Role.Button))
             .assertOnClickLabelMatches("true")
     }
@@ -6006,9 +5427,12 @@
     }
 }
 
-internal fun SemanticsNodeInteraction.assertOnClickLabelMatches(expectedValue: String):
-    SemanticsNodeInteraction {
-        return assert(SemanticsMatcher("onClickLabel = '$expectedValue'") {
+internal fun SemanticsNodeInteraction.assertOnClickLabelMatches(
+    expectedValue: String
+): SemanticsNodeInteraction {
+    return assert(
+        SemanticsMatcher("onClickLabel = '$expectedValue'") {
             it.config.getOrElseNullable(SemanticsActions.OnClick) { null }?.label == expectedValue
-        })
-    }
+        }
+    )
+}
diff --git a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/ClickableWithDynamicConfigChangesTest.kt b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/ClickableWithDynamicConfigChangesTest.kt
index 72e74a5..afa6a21 100644
--- a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/ClickableWithDynamicConfigChangesTest.kt
+++ b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/ClickableWithDynamicConfigChangesTest.kt
@@ -58,24 +58,16 @@
             Box {
                 BasicText(
                     "ClickableText",
-                    modifier = Modifier
-                        .testTag("myClickable")
-                        .clickable {
-                            ++counter
-                        }
+                    modifier = Modifier.testTag("myClickable").clickable { ++counter }
                 )
             }
         }
 
         rule.onNodeWithTag("myClickable").performClick()
 
-        rule.runOnIdle {
-            assertThat(counter).isEqualTo(1)
-        }
+        rule.runOnIdle { assertThat(counter).isEqualTo(1) }
 
-        rule.runOnUiThread {
-            grandParent.removeView(parentComposeView)
-        }
+        rule.runOnUiThread { grandParent.removeView(parentComposeView) }
 
         rule.runOnUiThread {
             (rule as? AndroidComposeTestRule<*, *>)?.cancelAndRecreateRecomposer()
@@ -86,14 +78,10 @@
             parentComposeView.setParentCompositionContext(null)
         }
 
-        rule.runOnUiThread {
-            grandParent.addView(parentComposeView)
-        }
+        rule.runOnUiThread { grandParent.addView(parentComposeView) }
 
         rule.onNodeWithTag("myClickable").performClick()
 
-        rule.runOnIdle {
-            assertThat(counter).isEqualTo(2)
-        }
+        rule.runOnIdle { assertThat(counter).isEqualTo(2) }
     }
 }
diff --git a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/CombinedClickableTest.kt b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/CombinedClickableTest.kt
index ef97634..24c5110 100644
--- a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/CombinedClickableTest.kt
+++ b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/CombinedClickableTest.kt
@@ -107,8 +107,7 @@
 @OptIn(ExperimentalFoundationApi::class)
 class CombinedClickableTest {
 
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
     @Before
     fun before() {
@@ -122,9 +121,10 @@
 
     // TODO(b/267253920): Add a compose test API to set/reset InputMode.
     @After
-    fun resetTouchMode() = with(InstrumentationRegistry.getInstrumentation()) {
-        if (SDK_INT < 33) setInTouchMode(true) else resetInTouchMode()
-    }
+    fun resetTouchMode() =
+        with(InstrumentationRegistry.getInstrumentation()) {
+            if (SDK_INT < 33) setInTouchMode(true) else resetInTouchMode()
+        }
 
     @Test
     fun defaultSemantics() {
@@ -137,7 +137,8 @@
             }
         }
 
-        rule.onNodeWithTag("myClickable")
+        rule
+            .onNodeWithTag("myClickable")
             .assert(SemanticsMatcher.keyNotDefined(SemanticsProperties.Role))
             .assertIsEnabled()
             .assertHasClickAction()
@@ -154,7 +155,8 @@
             }
         }
 
-        rule.onNodeWithTag("myClickable")
+        rule
+            .onNodeWithTag("myClickable")
             .assert(SemanticsMatcher.keyNotDefined(SemanticsProperties.Role))
             .assertIsNotEnabled()
             .assertHasClickAction()
@@ -169,27 +171,24 @@
             Box {
                 BasicText(
                     "ClickableText",
-                    modifier = Modifier
-                        .testTag("myClickable")
-                        .combinedClickable(onLongClick = onLongClick) {}
+                    modifier =
+                        Modifier.testTag("myClickable").combinedClickable(
+                            onLongClick = onLongClick
+                        ) {}
                 )
             }
         }
 
-        rule.onNodeWithTag("myClickable")
+        rule
+            .onNodeWithTag("myClickable")
             .assertIsEnabled()
             .assert(SemanticsMatcher.keyIsDefined(SemanticsActions.OnLongClick))
 
-        rule.runOnIdle {
-            assertThat(counter).isEqualTo(0)
-        }
+        rule.runOnIdle { assertThat(counter).isEqualTo(0) }
 
-        rule.onNodeWithTag("myClickable")
-            .performSemanticsAction(SemanticsActions.OnLongClick)
+        rule.onNodeWithTag("myClickable").performSemanticsAction(SemanticsActions.OnLongClick)
 
-        rule.runOnIdle {
-            assertThat(counter).isEqualTo(1)
-        }
+        rule.runOnIdle { assertThat(counter).isEqualTo(1) }
     }
 
     @Test
@@ -201,14 +200,16 @@
             Box {
                 BasicText(
                     "ClickableText",
-                    modifier = Modifier
-                        .testTag("myClickable")
-                        .combinedClickable(onLongClick = onLongClick) {}
+                    modifier =
+                        Modifier.testTag("myClickable").combinedClickable(
+                            onLongClick = onLongClick
+                        ) {}
                 )
             }
         }
 
-        rule.onNodeWithTag("myClickable")
+        rule
+            .onNodeWithTag("myClickable")
             .assertIsEnabled()
             .assert(SemanticsMatcher.keyNotDefined(SemanticsActions.OnLongClick))
 
@@ -217,7 +218,8 @@
             onLongClick = { /* no-op */ }
         }
 
-        rule.onNodeWithTag("myClickable")
+        rule
+            .onNodeWithTag("myClickable")
             .assertIsEnabled()
             .assert(SemanticsMatcher.keyIsDefined(SemanticsActions.OnLongClick))
             .performSemanticsAction(SemanticsActions.OnLongClick)
@@ -229,8 +231,7 @@
             onLongClick = { ++counter }
         }
 
-        rule.onNodeWithTag("myClickable")
-            .performSemanticsAction(SemanticsActions.OnLongClick)
+        rule.onNodeWithTag("myClickable").performSemanticsAction(SemanticsActions.OnLongClick)
 
         rule.runOnIdle {
             // Changes should now be applied
@@ -239,7 +240,8 @@
             onLongClick = null
         }
 
-        rule.onNodeWithTag("myClickable")
+        rule
+            .onNodeWithTag("myClickable")
             .assertIsEnabled()
             // Long click action should be removed
             .assert(SemanticsMatcher.keyNotDefined(SemanticsActions.OnLongClick))
@@ -248,9 +250,7 @@
     @Test
     fun click() {
         var counter = 0
-        val onClick: () -> Unit = {
-            ++counter
-        }
+        val onClick: () -> Unit = { ++counter }
 
         rule.setContent {
             Box {
@@ -261,19 +261,13 @@
             }
         }
 
-        rule.onNodeWithTag("myClickable")
-            .performClick()
+        rule.onNodeWithTag("myClickable").performClick()
 
-        rule.runOnIdle {
-            assertThat(counter).isEqualTo(1)
-        }
+        rule.runOnIdle { assertThat(counter).isEqualTo(1) }
 
-        rule.onNodeWithTag("myClickable")
-            .performClick()
+        rule.onNodeWithTag("myClickable").performClick()
 
-        rule.runOnIdle {
-            assertThat(counter).isEqualTo(2)
-        }
+        rule.runOnIdle { assertThat(counter).isEqualTo(2) }
     }
 
     @Test
@@ -285,9 +279,9 @@
         rule.setContent {
             inputModeManager = LocalInputModeManager.current
             BasicText(
-                    "ClickableText",
-                    modifier = Modifier
-                        .testTag("myClickable")
+                "ClickableText",
+                modifier =
+                    Modifier.testTag("myClickable")
                         .focusRequester(focusRequester)
                         .combinedClickable { counter++ }
             )
@@ -316,10 +310,10 @@
             inputModeManager = LocalInputModeManager.current
             BasicText(
                 "ClickableText",
-                modifier = Modifier
-                    .testTag("myClickable")
-                    .focusRequester(focusRequester)
-                    .combinedClickable { counter++ }
+                modifier =
+                    Modifier.testTag("myClickable")
+                        .focusRequester(focusRequester)
+                        .combinedClickable { counter++ }
             )
         }
         rule.runOnIdle {
@@ -346,10 +340,10 @@
             inputModeManager = LocalInputModeManager.current
             BasicText(
                 "ClickableText",
-                modifier = Modifier
-                    .testTag("myClickable")
-                    .focusRequester(focusRequester)
-                    .combinedClickable { counter++ }
+                modifier =
+                    Modifier.testTag("myClickable")
+                        .focusRequester(focusRequester)
+                        .combinedClickable { counter++ }
             )
         }
         rule.runOnIdle {
@@ -383,15 +377,11 @@
 
         rule.onNodeWithText("Foo", substring = true).performClick()
 
-        rule.runOnIdle {
-            assertThat(counter).isEqualTo(1)
-        }
+        rule.runOnIdle { assertThat(counter).isEqualTo(1) }
 
         rule.onNodeWithText("Bar", substring = true).performClick()
 
-        rule.runOnIdle {
-            assertThat(counter).isEqualTo(2)
-        }
+        rule.runOnIdle { assertThat(counter).isEqualTo(2) }
     }
 
     @Test
@@ -404,30 +394,19 @@
             Box {
                 BasicText(
                     "ClickableText",
-                    modifier = Modifier
-                        .testTag("myClickable")
-                        .combinedClickable(onLongClick = onClick) {}
+                    modifier =
+                        Modifier.testTag("myClickable").combinedClickable(onLongClick = onClick) {}
                 )
             }
         }
 
-        rule.onNodeWithTag("myClickable")
-            .performTouchInput {
-                longClick()
-            }
+        rule.onNodeWithTag("myClickable").performTouchInput { longClick() }
 
-        rule.runOnIdle {
-            assertThat(counter).isEqualTo(1)
-        }
+        rule.runOnIdle { assertThat(counter).isEqualTo(1) }
 
-        rule.onNodeWithTag("myClickable")
-            .performTouchInput {
-                longClick()
-            }
+        rule.onNodeWithTag("myClickable").performTouchInput { longClick() }
 
-        rule.runOnIdle {
-            assertThat(counter).isEqualTo(2)
-        }
+        rule.runOnIdle { assertThat(counter).isEqualTo(2) }
     }
 
     @Test
@@ -441,30 +420,21 @@
             Box {
                 BasicText(
                     "ClickableText",
-                    modifier = Modifier
-                        .testTag("myClickable")
-                        .combinedClickable(
-                            onLongClick = onLongClick,
-                            onClick = onClick
-                        )
+                    modifier =
+                        Modifier.testTag("myClickable")
+                            .combinedClickable(onLongClick = onLongClick, onClick = onClick)
                 )
             }
         }
 
-        rule.onNodeWithTag("myClickable")
-            .performTouchInput {
-                click()
-            }
+        rule.onNodeWithTag("myClickable").performTouchInput { click() }
 
         rule.runOnIdle {
             assertThat(clickCounter).isEqualTo(1)
             assertThat(longClickCounter).isEqualTo(0)
         }
 
-        rule.onNodeWithTag("myClickable")
-            .performTouchInput {
-                longClick()
-            }
+        rule.onNodeWithTag("myClickable").performTouchInput { longClick() }
 
         rule.runOnIdle {
             assertThat(clickCounter).isEqualTo(1)
@@ -483,18 +453,14 @@
             Box {
                 BasicText(
                     "ClickableText",
-                    modifier = Modifier
-                        .testTag("myClickable")
-                        .combinedClickable(
-                            onDoubleClick = onDoubleClick,
-                            onClick = onClick
-                        )
+                    modifier =
+                        Modifier.testTag("myClickable")
+                            .combinedClickable(onDoubleClick = onDoubleClick, onClick = onClick)
                 )
             }
         }
 
-        rule.onNodeWithTag("myClickable")
-            .performClick()
+        rule.onNodeWithTag("myClickable").performClick()
 
         rule.mainClock.advanceTimeUntil { clickCounter == 1 }
         rule.runOnIdle {
@@ -502,10 +468,7 @@
             assertThat(doubleClickCounter).isEqualTo(0)
         }
 
-        rule.onNodeWithTag("myClickable")
-            .performTouchInput {
-                doubleClick()
-            }
+        rule.onNodeWithTag("myClickable").performTouchInput { doubleClick() }
 
         rule.runOnIdle {
             assertThat(doubleClickCounter).isEqualTo(1)
@@ -527,19 +490,18 @@
             Box {
                 BasicText(
                     "ClickableText",
-                    modifier = Modifier
-                        .testTag("myClickable")
-                        .combinedClickable(
-                            onDoubleClick = onDoubleClick,
-                            onLongClick = onLongClick,
-                            onClick = onClick
-                        )
+                    modifier =
+                        Modifier.testTag("myClickable")
+                            .combinedClickable(
+                                onDoubleClick = onDoubleClick,
+                                onLongClick = onLongClick,
+                                onClick = onClick
+                            )
                 )
             }
         }
 
-        rule.onNodeWithTag("myClickable")
-            .performClick()
+        rule.onNodeWithTag("myClickable").performClick()
 
         rule.mainClock.advanceTimeUntil { clickCounter == 1 }
         rule.runOnIdle {
@@ -548,10 +510,7 @@
             assertThat(clickCounter).isEqualTo(1)
         }
 
-        rule.onNodeWithTag("myClickable")
-            .performTouchInput {
-                doubleClick()
-            }
+        rule.onNodeWithTag("myClickable").performTouchInput { doubleClick() }
 
         rule.mainClock.advanceTimeUntil { doubleClickCounter == 1 }
         rule.runOnIdle {
@@ -560,10 +519,7 @@
             assertThat(clickCounter).isEqualTo(1)
         }
 
-        rule.onNodeWithTag("myClickable")
-            .performTouchInput {
-                longClick()
-            }
+        rule.onNodeWithTag("myClickable").performTouchInput { longClick() }
 
         rule.mainClock.advanceTimeUntil { longClickCounter == 1 }
         rule.runOnIdle {
@@ -582,24 +538,19 @@
             Box {
                 BasicText(
                     "ClickableText",
-                    modifier = Modifier
-                        .testTag("myClickable")
-                        .combinedClickable(onDoubleClick = onClick) {}
+                    modifier =
+                        Modifier.testTag("myClickable").combinedClickable(
+                            onDoubleClick = onClick
+                        ) {}
                 )
             }
         }
 
-        rule.onNodeWithTag("myClickable")
-            .performTouchInput {
-                doubleClick()
-            }
+        rule.onNodeWithTag("myClickable").performTouchInput { doubleClick() }
 
         rule.mainClock.advanceTimeUntil { counter == 1 }
 
-        rule.onNodeWithTag("myClickable")
-            .performTouchInput {
-                doubleClick()
-            }
+        rule.onNodeWithTag("myClickable").performTouchInput { doubleClick() }
 
         rule.mainClock.advanceTimeUntil { counter == 2 }
     }
@@ -617,9 +568,8 @@
             Box {
                 BasicText(
                     "ClickableText",
-                    modifier = Modifier
-                        .testTag("myClickable")
-                        .combinedClickable(
+                    modifier =
+                        Modifier.testTag("myClickable").combinedClickable(
                             interactionSource = interactionSource,
                             indication = null
                         ) {}
@@ -629,16 +579,11 @@
 
         val interactions = mutableListOf<Interaction>()
 
-        scope.launch {
-            interactionSource.interactions.collect { interactions.add(it) }
-        }
+        scope.launch { interactionSource.interactions.collect { interactions.add(it) } }
 
-        rule.runOnIdle {
-            assertThat(interactions).isEmpty()
-        }
+        rule.runOnIdle { assertThat(interactions).isEmpty() }
 
-        rule.onNodeWithTag("myClickable")
-            .performTouchInput { down(center) }
+        rule.onNodeWithTag("myClickable").performTouchInput { down(center) }
 
         // No scrollable container, so there should be no delay and we should instantly appear
         // pressed
@@ -647,8 +592,7 @@
             assertThat(interactions.first()).isInstanceOf(PressInteraction.Press::class.java)
         }
 
-        rule.onNodeWithTag("myClickable")
-            .performTouchInput { up() }
+        rule.onNodeWithTag("myClickable").performTouchInput { up() }
 
         rule.runOnIdle {
             assertThat(interactions).hasSize(2)
@@ -672,9 +616,8 @@
             Box {
                 BasicText(
                     "ClickableText",
-                    modifier = Modifier
-                        .testTag("myClickable")
-                        .combinedClickable(
+                    modifier =
+                        Modifier.testTag("myClickable").combinedClickable(
                             interactionSource = interactionSource,
                             indication = null
                         ) {}
@@ -684,19 +627,14 @@
 
         val interactions = mutableListOf<Interaction>()
 
-        scope.launch {
-            interactionSource.interactions.collect { interactions.add(it) }
-        }
+        scope.launch { interactionSource.interactions.collect { interactions.add(it) } }
 
-        rule.runOnIdle {
-            assertThat(interactions).isEmpty()
-        }
+        rule.runOnIdle { assertThat(interactions).isEmpty() }
 
-        rule.onNodeWithTag("myClickable")
-            .performTouchInput {
-                down(center)
-                up()
-            }
+        rule.onNodeWithTag("myClickable").performTouchInput {
+            down(center)
+            up()
+        }
 
         // Press finished so we should see both press and release
         rule.runOnIdle {
@@ -721,9 +659,8 @@
             Box {
                 BasicText(
                     "ClickableText",
-                    modifier = Modifier
-                        .testTag("myClickable")
-                        .combinedClickable(
+                    modifier =
+                        Modifier.testTag("myClickable").combinedClickable(
                             interactionSource = interactionSource,
                             indication = null
                         ) {}
@@ -733,19 +670,14 @@
 
         val interactions = mutableListOf<Interaction>()
 
-        scope.launch {
-            interactionSource.interactions.collect { interactions.add(it) }
-        }
+        scope.launch { interactionSource.interactions.collect { interactions.add(it) } }
 
-        rule.runOnIdle {
-            assertThat(interactions).isEmpty()
-        }
+        rule.runOnIdle { assertThat(interactions).isEmpty() }
 
-        rule.onNodeWithTag("myClickable")
-            .performTouchInput {
-                down(center)
-                cancel()
-            }
+        rule.onNodeWithTag("myClickable").performTouchInput {
+            down(center)
+            cancel()
+        }
 
         // We are not in a scrollable container, so we should see a press and immediate cancel
         rule.runOnIdle {
@@ -770,35 +702,30 @@
             Box {
                 BasicText(
                     "ClickableText",
-                    modifier = Modifier
-                        .testTag("myClickable")
-                        .draggable(
-                            state = rememberDraggableState {},
-                            orientation = Orientation.Horizontal
-                        )
-                        .combinedClickable(
-                            interactionSource = interactionSource,
-                            indication = null
-                        ) {}
+                    modifier =
+                        Modifier.testTag("myClickable")
+                            .draggable(
+                                state = rememberDraggableState {},
+                                orientation = Orientation.Horizontal
+                            )
+                            .combinedClickable(
+                                interactionSource = interactionSource,
+                                indication = null
+                            ) {}
                 )
             }
         }
 
         val interactions = mutableListOf<Interaction>()
 
-        scope.launch {
-            interactionSource.interactions.collect { interactions.add(it) }
-        }
+        scope.launch { interactionSource.interactions.collect { interactions.add(it) } }
 
-        rule.runOnIdle {
-            assertThat(interactions).isEmpty()
-        }
+        rule.runOnIdle { assertThat(interactions).isEmpty() }
 
-        rule.onNodeWithTag("myClickable")
-            .performTouchInput {
-                down(centerLeft)
-                moveTo(centerRight)
-            }
+        rule.onNodeWithTag("myClickable").performTouchInput {
+            down(centerLeft)
+            moveTo(centerRight)
+        }
 
         // The press should fire, and then the drag should instantly cancel it
         rule.runOnIdle {
@@ -823,9 +750,8 @@
             Box(Modifier.verticalScroll(rememberScrollState())) {
                 BasicText(
                     "ClickableText",
-                    modifier = Modifier
-                        .testTag("myClickable")
-                        .combinedClickable(
+                    modifier =
+                        Modifier.testTag("myClickable").combinedClickable(
                             interactionSource = interactionSource,
                             indication = null
                         ) {}
@@ -835,25 +761,18 @@
 
         val interactions = mutableListOf<Interaction>()
 
-        scope.launch {
-            interactionSource.interactions.collect { interactions.add(it) }
-        }
+        scope.launch { interactionSource.interactions.collect { interactions.add(it) } }
 
-        rule.runOnIdle {
-            assertThat(interactions).isEmpty()
-        }
+        rule.runOnIdle { assertThat(interactions).isEmpty() }
 
-        rule.onNodeWithTag("myClickable")
-            .performTouchInput { down(center) }
+        rule.onNodeWithTag("myClickable").performTouchInput { down(center) }
 
         val halfTapIndicationDelay = TapIndicationDelay / 2
 
         rule.mainClock.advanceTimeBy(halfTapIndicationDelay)
 
         // Haven't reached the tap delay yet, so we shouldn't have started a press
-        rule.runOnIdle {
-            assertThat(interactions).isEmpty()
-        }
+        rule.runOnIdle { assertThat(interactions).isEmpty() }
 
         // Advance past the tap delay
         rule.mainClock.advanceTimeBy(halfTapIndicationDelay)
@@ -863,8 +782,7 @@
             assertThat(interactions.first()).isInstanceOf(PressInteraction.Press::class.java)
         }
 
-        rule.onNodeWithTag("myClickable")
-            .performTouchInput { up() }
+        rule.onNodeWithTag("myClickable").performTouchInput { up() }
 
         rule.runOnIdle {
             assertThat(interactions).hasSize(2)
@@ -888,9 +806,8 @@
             Box(Modifier.verticalScroll(rememberScrollState())) {
                 BasicText(
                     "ClickableText",
-                    modifier = Modifier
-                        .testTag("myClickable")
-                        .combinedClickable(
+                    modifier =
+                        Modifier.testTag("myClickable").combinedClickable(
                             interactionSource = interactionSource,
                             indication = null
                         ) {}
@@ -900,19 +817,14 @@
 
         val interactions = mutableListOf<Interaction>()
 
-        scope.launch {
-            interactionSource.interactions.collect { interactions.add(it) }
-        }
+        scope.launch { interactionSource.interactions.collect { interactions.add(it) } }
 
-        rule.runOnIdle {
-            assertThat(interactions).isEmpty()
-        }
+        rule.runOnIdle { assertThat(interactions).isEmpty() }
 
-        rule.onNodeWithTag("myClickable")
-            .performTouchInput {
-                down(center)
-                up()
-            }
+        rule.onNodeWithTag("myClickable").performTouchInput {
+            down(center)
+            up()
+        }
 
         // We haven't reached the tap delay, but we have finished a press so we should have
         // emitted both press and release
@@ -938,9 +850,8 @@
             Box(Modifier.verticalScroll(rememberScrollState())) {
                 BasicText(
                     "ClickableText",
-                    modifier = Modifier
-                        .testTag("myClickable")
-                        .combinedClickable(
+                    modifier =
+                        Modifier.testTag("myClickable").combinedClickable(
                             interactionSource = interactionSource,
                             indication = null
                         ) {}
@@ -950,25 +861,18 @@
 
         val interactions = mutableListOf<Interaction>()
 
-        scope.launch {
-            interactionSource.interactions.collect { interactions.add(it) }
-        }
+        scope.launch { interactionSource.interactions.collect { interactions.add(it) } }
 
-        rule.runOnIdle {
-            assertThat(interactions).isEmpty()
-        }
+        rule.runOnIdle { assertThat(interactions).isEmpty() }
 
-        rule.onNodeWithTag("myClickable")
-            .performTouchInput {
-                down(center)
-                cancel()
-            }
+        rule.onNodeWithTag("myClickable").performTouchInput {
+            down(center)
+            cancel()
+        }
 
         // We haven't reached the tap delay, and a cancel was emitted, so no press should ever be
         // shown
-        rule.runOnIdle {
-            assertThat(interactions).isEmpty()
-        }
+        rule.runOnIdle { assertThat(interactions).isEmpty() }
     }
 
     @Test
@@ -984,42 +888,35 @@
             Box(Modifier.verticalScroll(rememberScrollState())) {
                 BasicText(
                     "ClickableText",
-                    modifier = Modifier
-                        .testTag("myClickable")
-                        .draggable(
-                            state = rememberDraggableState {},
-                            orientation = Orientation.Horizontal
-                        )
-                        .combinedClickable(
-                            interactionSource = interactionSource,
-                            indication = null
-                        ) {}
+                    modifier =
+                        Modifier.testTag("myClickable")
+                            .draggable(
+                                state = rememberDraggableState {},
+                                orientation = Orientation.Horizontal
+                            )
+                            .combinedClickable(
+                                interactionSource = interactionSource,
+                                indication = null
+                            ) {}
                 )
             }
         }
 
         val interactions = mutableListOf<Interaction>()
 
-        scope.launch {
-            interactionSource.interactions.collect { interactions.add(it) }
-        }
+        scope.launch { interactionSource.interactions.collect { interactions.add(it) } }
 
-        rule.runOnIdle {
-            assertThat(interactions).isEmpty()
-        }
+        rule.runOnIdle { assertThat(interactions).isEmpty() }
 
-        rule.onNodeWithTag("myClickable")
-            .performTouchInput {
-                down(centerLeft)
-                moveTo(centerRight)
-            }
+        rule.onNodeWithTag("myClickable").performTouchInput {
+            down(centerLeft)
+            moveTo(centerRight)
+        }
 
         rule.mainClock.advanceTimeBy(TapIndicationDelay)
 
         // We started a drag before the timeout, so no press should be emitted
-        rule.runOnIdle {
-            assertThat(interactions).isEmpty()
-        }
+        rule.runOnIdle { assertThat(interactions).isEmpty() }
     }
 
     @Test
@@ -1035,34 +932,27 @@
             Box(Modifier.verticalScroll(rememberScrollState())) {
                 BasicText(
                     "ClickableText",
-                    modifier = Modifier
-                        .testTag("myClickable")
-                        .draggable(
-                            state = rememberDraggableState {},
-                            orientation = Orientation.Horizontal
-                        )
-                        .combinedClickable(
-                            interactionSource = interactionSource,
-                            indication = null
-                        ) {}
+                    modifier =
+                        Modifier.testTag("myClickable")
+                            .draggable(
+                                state = rememberDraggableState {},
+                                orientation = Orientation.Horizontal
+                            )
+                            .combinedClickable(
+                                interactionSource = interactionSource,
+                                indication = null
+                            ) {}
                 )
             }
         }
 
         val interactions = mutableListOf<Interaction>()
 
-        scope.launch {
-            interactionSource.interactions.collect { interactions.add(it) }
-        }
+        scope.launch { interactionSource.interactions.collect { interactions.add(it) } }
 
-        rule.runOnIdle {
-            assertThat(interactions).isEmpty()
-        }
+        rule.runOnIdle { assertThat(interactions).isEmpty() }
 
-        rule.onNodeWithTag("myClickable")
-            .performTouchInput {
-                down(centerLeft)
-            }
+        rule.onNodeWithTag("myClickable").performTouchInput { down(centerLeft) }
 
         rule.mainClock.advanceTimeBy(TapIndicationDelay)
 
@@ -1071,10 +961,7 @@
             assertThat(interactions.first()).isInstanceOf(PressInteraction.Press::class.java)
         }
 
-        rule.onNodeWithTag("myClickable")
-            .performTouchInput {
-                moveTo(centerRight)
-            }
+        rule.onNodeWithTag("myClickable").performTouchInput { moveTo(centerRight) }
 
         // The drag should cancel the press
         rule.runOnIdle {
@@ -1099,9 +986,8 @@
             Box(Modifier.verticalScroll(rememberScrollState())) {
                 BasicText(
                     "ClickableText",
-                    modifier = Modifier
-                        .testTag("myClickable")
-                        .combinedClickable(
+                    modifier =
+                        Modifier.testTag("myClickable").combinedClickable(
                             interactionSource = interactionSource,
                             indication = null
                         ) {}
@@ -1111,16 +997,11 @@
 
         val interactions = mutableListOf<Interaction>()
 
-        scope.launch {
-            interactionSource.interactions.collect { interactions.add(it) }
-        }
+        scope.launch { interactionSource.interactions.collect { interactions.add(it) } }
 
-        rule.runOnIdle {
-            assertThat(interactions).isEmpty()
-        }
+        rule.runOnIdle { assertThat(interactions).isEmpty() }
 
-        rule.onNodeWithTag("myClickable")
-            .performTouchInput { down(center) }
+        rule.onNodeWithTag("myClickable").performTouchInput { down(center) }
 
         rule.mainClock.advanceTimeBy(TapIndicationDelay)
 
@@ -1129,8 +1010,7 @@
             assertThat(interactions.first()).isInstanceOf(PressInteraction.Press::class.java)
         }
 
-        rule.onNodeWithTag("myClickable")
-            .performTouchInput { cancel() }
+        rule.onNodeWithTag("myClickable").performTouchInput { cancel() }
 
         rule.runOnIdle {
             assertThat(interactions).hasSize(2)
@@ -1156,9 +1036,8 @@
                 if (emitClickableText) {
                     BasicText(
                         "ClickableText",
-                        modifier = Modifier
-                            .testTag("myClickable")
-                            .combinedClickable(
+                        modifier =
+                            Modifier.testTag("myClickable").combinedClickable(
                                 interactionSource = interactionSource,
                                 indication = null
                             ) {}
@@ -1169,16 +1048,11 @@
 
         val interactions = mutableListOf<Interaction>()
 
-        scope.launch {
-            interactionSource.interactions.collect { interactions.add(it) }
-        }
+        scope.launch { interactionSource.interactions.collect { interactions.add(it) } }
 
-        rule.runOnIdle {
-            assertThat(interactions).isEmpty()
-        }
+        rule.runOnIdle { assertThat(interactions).isEmpty() }
 
-        rule.onNodeWithTag("myClickable")
-            .performTouchInput { down(center) }
+        rule.onNodeWithTag("myClickable").performTouchInput { down(center) }
 
         rule.mainClock.advanceTimeBy(TapIndicationDelay)
 
@@ -1188,9 +1062,7 @@
         }
 
         // Dispose clickable
-        rule.runOnIdle {
-            emitClickableText = false
-        }
+        rule.runOnIdle { emitClickableText = false }
 
         rule.mainClock.advanceTimeByFrame()
 
@@ -1215,9 +1087,8 @@
             Box {
                 BasicText(
                     "ClickableText",
-                    modifier = Modifier
-                        .testTag("myClickable")
-                        .combinedClickable(
+                    modifier =
+                        Modifier.testTag("myClickable").combinedClickable(
                             interactionSource = interactionSource,
                             indication = null
                         ) {}
@@ -1227,32 +1098,24 @@
 
         val interactions = mutableListOf<Interaction>()
 
-        scope.launch {
-            interactionSource.interactions.collect { interactions.add(it) }
-        }
+        scope.launch { interactionSource.interactions.collect { interactions.add(it) } }
 
-        rule.runOnIdle {
-            assertThat(interactions).isEmpty()
-        }
+        rule.runOnIdle { assertThat(interactions).isEmpty() }
 
-        rule.onNodeWithTag("myClickable")
-            .performMouseInput { enter(center) }
+        rule.onNodeWithTag("myClickable").performMouseInput { enter(center) }
 
         rule.runOnIdle {
             assertThat(interactions).hasSize(1)
             assertThat(interactions.first()).isInstanceOf(HoverInteraction.Enter::class.java)
         }
 
-        rule.onNodeWithTag("myClickable")
-            .performMouseInput { exit(Offset(-1f, -1f)) }
+        rule.onNodeWithTag("myClickable").performMouseInput { exit(Offset(-1f, -1f)) }
 
         rule.runOnIdle {
             assertThat(interactions).hasSize(2)
             assertThat(interactions.first()).isInstanceOf(HoverInteraction.Enter::class.java)
-            assertThat(interactions[1])
-                .isInstanceOf(HoverInteraction.Exit::class.java)
-            assertThat((interactions[1] as HoverInteraction.Exit).enter)
-                .isEqualTo(interactions[0])
+            assertThat(interactions[1]).isInstanceOf(HoverInteraction.Exit::class.java)
+            assertThat((interactions[1] as HoverInteraction.Exit).enter).isEqualTo(interactions[0])
         }
     }
 
@@ -1268,9 +1131,8 @@
             Box {
                 BasicText(
                     "ClickableText",
-                    modifier = Modifier
-                        .testTag("myClickable")
-                        .combinedClickable(
+                    modifier =
+                        Modifier.testTag("myClickable").combinedClickable(
                             interactionSource = interactionSource,
                             indication = null
                         ) {}
@@ -1280,20 +1142,15 @@
 
         val interactions = mutableListOf<Interaction>()
 
-        scope.launch {
-            interactionSource.interactions.collect { interactions.add(it) }
-        }
+        scope.launch { interactionSource.interactions.collect { interactions.add(it) } }
 
-        rule.runOnIdle {
-            assertThat(interactions).isEmpty()
-        }
+        rule.runOnIdle { assertThat(interactions).isEmpty() }
 
-        rule.onNodeWithTag("myClickable")
-            .performMouseInput {
-                enter(center)
-                click()
-                exit(Offset(-1f, -1f))
-            }
+        rule.onNodeWithTag("myClickable").performMouseInput {
+            enter(center)
+            click()
+            exit(Offset(-1f, -1f))
+        }
 
         rule.runOnIdle {
             assertThat(interactions).hasSize(4)
@@ -1303,8 +1160,7 @@
             assertThat(interactions[3]).isInstanceOf(HoverInteraction.Exit::class.java)
             assertThat((interactions[2] as PressInteraction.Release).press)
                 .isEqualTo(interactions[1])
-            assertThat((interactions[3] as HoverInteraction.Exit).enter)
-                .isEqualTo(interactions[0])
+            assertThat((interactions[3] as HoverInteraction.Exit).enter).isEqualTo(interactions[0])
         }
     }
 
@@ -1320,39 +1176,30 @@
             Box {
                 BasicText(
                     "ClickableText",
-                    modifier = Modifier
-                        .testTag("myClickable")
-                        .focusRequester(focusRequester)
-                        .combinedClickable(
-                            interactionSource = interactionSource,
-                            indication = null
-                        ) {}
+                    modifier =
+                        Modifier.testTag("myClickable")
+                            .focusRequester(focusRequester)
+                            .combinedClickable(
+                                interactionSource = interactionSource,
+                                indication = null
+                            ) {}
                 )
             }
         }
         rule.runOnIdle {
-            @OptIn(ExperimentalComposeUiApi::class)
-            inputModeManager.requestInputMode(Touch)
+            @OptIn(ExperimentalComposeUiApi::class) inputModeManager.requestInputMode(Touch)
         }
 
         val interactions = mutableListOf<Interaction>()
 
-        scope.launch {
-            interactionSource.interactions.collect { interactions.add(it) }
-        }
+        scope.launch { interactionSource.interactions.collect { interactions.add(it) } }
 
-        rule.runOnIdle {
-            assertThat(interactions).isEmpty()
-        }
+        rule.runOnIdle { assertThat(interactions).isEmpty() }
 
-        rule.runOnIdle {
-            focusRequester.requestFocus()
-        }
+        rule.runOnIdle { focusRequester.requestFocus() }
 
         // Touch mode by default, so we shouldn't be focused
-        rule.runOnIdle {
-            assertThat(interactions).isEmpty()
-        }
+        rule.runOnIdle { assertThat(interactions).isEmpty() }
     }
 
     @Test
@@ -1366,37 +1213,30 @@
             scope = rememberCoroutineScope()
             focusManager = LocalFocusManager.current
             inputModeManager = LocalInputModeManager.current
-                Box {
-                    BasicText(
-                        "ClickableText",
-                        modifier = Modifier
-                            .testTag("myClickable")
+            Box {
+                BasicText(
+                    "ClickableText",
+                    modifier =
+                        Modifier.testTag("myClickable")
                             .focusRequester(focusRequester)
                             .combinedClickable(
                                 interactionSource = interactionSource,
                                 indication = null
                             ) {}
-                    )
-                }
+                )
+            }
         }
         rule.runOnIdle {
-            @OptIn(ExperimentalComposeUiApi::class)
-            inputModeManager.requestInputMode(Keyboard)
+            @OptIn(ExperimentalComposeUiApi::class) inputModeManager.requestInputMode(Keyboard)
         }
 
         val interactions = mutableListOf<Interaction>()
 
-        scope.launch {
-            interactionSource.interactions.collect { interactions.add(it) }
-        }
+        scope.launch { interactionSource.interactions.collect { interactions.add(it) } }
 
-        rule.runOnIdle {
-            assertThat(interactions).isEmpty()
-        }
+        rule.runOnIdle { assertThat(interactions).isEmpty() }
 
-        rule.runOnIdle {
-            focusRequester.requestFocus()
-        }
+        rule.runOnIdle { focusRequester.requestFocus() }
 
         // Keyboard mode, so we should now be focused and see an interaction
         rule.runOnIdle {
@@ -1404,15 +1244,12 @@
             assertThat(interactions.first()).isInstanceOf(FocusInteraction.Focus::class.java)
         }
 
-        rule.runOnIdle {
-            focusManager.clearFocus()
-        }
+        rule.runOnIdle { focusManager.clearFocus() }
 
         rule.runOnIdle {
             assertThat(interactions).hasSize(2)
             assertThat(interactions.first()).isInstanceOf(FocusInteraction.Focus::class.java)
-            assertThat(interactions[1])
-                .isInstanceOf(FocusInteraction.Unfocus::class.java)
+            assertThat(interactions[1]).isInstanceOf(FocusInteraction.Unfocus::class.java)
             assertThat((interactions[1] as FocusInteraction.Unfocus).focus)
                 .isEqualTo(interactions[0])
         }
@@ -1447,9 +1284,8 @@
             Box {
                 BasicText(
                     "ClickableText",
-                    modifier = Modifier
-                        .testTag("myClickable")
-                        .combinedClickable(
+                    modifier =
+                        Modifier.testTag("myClickable").combinedClickable(
                             onLongClick = onLongClick,
                             interactionSource = interactionSource,
                             indication = null
@@ -1460,17 +1296,14 @@
 
         val interactions = mutableListOf<Interaction>()
 
-        scope.launch {
-            interactionSource.interactions.collect { interactions.add(it) }
-        }
+        scope.launch { interactionSource.interactions.collect { interactions.add(it) } }
 
         rule.runOnIdle {
             assertThat(interactions).isEmpty()
             assertThat(onLongClick).isEqualTo(initialLongClick)
         }
 
-        rule.onNodeWithTag("myClickable")
-            .performTouchInput { down(center) }
+        rule.onNodeWithTag("myClickable").performTouchInput { down(center) }
 
         // Simulate a long click
         rule.mainClock.advanceTimeBy(1000)
@@ -1485,8 +1318,7 @@
             assertThat(onLongClick).isEqualTo(finalLongClick)
         }
 
-        rule.onNodeWithTag("myClickable")
-            .performTouchInput { up() }
+        rule.onNodeWithTag("myClickable").performTouchInput { up() }
 
         // The up should now cause a release
         rule.runOnIdle {
@@ -1523,9 +1355,8 @@
             Box {
                 BasicText(
                     "ClickableText",
-                    modifier = Modifier
-                        .testTag("myClickable")
-                        .combinedClickable(
+                    modifier =
+                        Modifier.testTag("myClickable").combinedClickable(
                             onLongClick = onLongClick,
                             interactionSource = interactionSource,
                             indication = null
@@ -1536,17 +1367,14 @@
 
         val interactions = mutableListOf<Interaction>()
 
-        scope.launch {
-            interactionSource.interactions.collect { interactions.add(it) }
-        }
+        scope.launch { interactionSource.interactions.collect { interactions.add(it) } }
 
         rule.runOnIdle {
             assertThat(interactions).isEmpty()
             assertThat(onLongClick).isEqualTo(initialLongClick)
         }
 
-        rule.onNodeWithTag("myClickable")
-            .performTouchInput { down(center) }
+        rule.onNodeWithTag("myClickable").performTouchInput { down(center) }
 
         // Initial press
         rule.mainClock.advanceTimeBy(100)
@@ -1588,20 +1416,19 @@
             Box {
                 BasicText(
                     "ClickableText",
-                    modifier = Modifier
-                        .testTag("myClickable")
-                        .combinedClickable(
-                            enabled = enabled.value,
-                            onDoubleClick = onDoubleClick,
-                            onLongClick = onLongClick,
-                            onClick = onClick
-                        )
+                    modifier =
+                        Modifier.testTag("myClickable")
+                            .combinedClickable(
+                                enabled = enabled.value,
+                                onDoubleClick = onDoubleClick,
+                                onLongClick = onLongClick,
+                                onClick = onClick
+                            )
                 )
             }
         }
 
-        rule.onNodeWithTag("myClickable")
-            .performClick()
+        rule.onNodeWithTag("myClickable").performClick()
 
         // Process gestures
         rule.mainClock.advanceTimeBy(1000)
@@ -1612,10 +1439,7 @@
             assertThat(clickCounter).isEqualTo(0)
         }
 
-        rule.onNodeWithTag("myClickable")
-            .performTouchInput {
-                doubleClick()
-            }
+        rule.onNodeWithTag("myClickable").performTouchInput { doubleClick() }
 
         // Process gestures
         rule.mainClock.advanceTimeBy(1000)
@@ -1626,10 +1450,7 @@
             assertThat(clickCounter).isEqualTo(0)
         }
 
-        rule.onNodeWithTag("myClickable")
-            .performTouchInput {
-                longClick()
-            }
+        rule.onNodeWithTag("myClickable").performTouchInput { longClick() }
 
         // Process gestures
         rule.mainClock.advanceTimeBy(1000)
@@ -1641,8 +1462,7 @@
             enabled.value = true
         }
 
-        rule.onNodeWithTag("myClickable")
-            .performClick()
+        rule.onNodeWithTag("myClickable").performClick()
 
         rule.mainClock.advanceTimeUntil { clickCounter == 1 }
 
@@ -1652,10 +1472,7 @@
             assertThat(clickCounter).isEqualTo(1)
         }
 
-        rule.onNodeWithTag("myClickable")
-            .performTouchInput {
-                doubleClick()
-            }
+        rule.onNodeWithTag("myClickable").performTouchInput { doubleClick() }
 
         rule.mainClock.advanceTimeUntil { doubleClickCounter == 1 }
 
@@ -1665,10 +1482,7 @@
             assertThat(clickCounter).isEqualTo(1)
         }
 
-        rule.onNodeWithTag("myClickable")
-            .performTouchInput {
-                longClick()
-            }
+        rule.onNodeWithTag("myClickable").performTouchInput { longClick() }
 
         rule.mainClock.advanceTimeUntil { longClickCounter == 1 }
 
@@ -1706,20 +1520,19 @@
             ) {
                 BasicText(
                     "ClickableText",
-                    modifier = Modifier
-                        .testTag("myClickable")
-                        .combinedClickable(
-                            enabled = enabled.value,
-                            onDoubleClick = onDoubleClick,
-                            onLongClick = onLongClick,
-                            onClick = onClick
-                        )
+                    modifier =
+                        Modifier.testTag("myClickable")
+                            .combinedClickable(
+                                enabled = enabled.value,
+                                onDoubleClick = onDoubleClick,
+                                onLongClick = onLongClick,
+                                onClick = onClick
+                            )
                 )
             }
         }
 
-        rule.onNodeWithTag("myClickable")
-            .performClick()
+        rule.onNodeWithTag("myClickable").performClick()
 
         // Process gestures
         rule.mainClock.advanceTimeBy(1000)
@@ -1733,10 +1546,7 @@
             assertThat(outerClickCounter).isEqualTo(0)
         }
 
-        rule.onNodeWithTag("myClickable")
-            .performTouchInput {
-                doubleClick()
-            }
+        rule.onNodeWithTag("myClickable").performTouchInput { doubleClick() }
 
         // Process gestures
         rule.mainClock.advanceTimeBy(1000)
@@ -1750,10 +1560,7 @@
             assertThat(outerClickCounter).isEqualTo(0)
         }
 
-        rule.onNodeWithTag("myClickable")
-            .performTouchInput {
-                longClick()
-            }
+        rule.onNodeWithTag("myClickable").performTouchInput { longClick() }
 
         // Process gestures
         rule.mainClock.advanceTimeBy(1000)
@@ -1768,8 +1575,7 @@
             enabled.value = true
         }
 
-        rule.onNodeWithTag("myClickable")
-            .performClick()
+        rule.onNodeWithTag("myClickable").performClick()
 
         rule.mainClock.advanceTimeUntil { clickCounter == 1 }
 
@@ -1782,10 +1588,7 @@
             assertThat(outerClickCounter).isEqualTo(0)
         }
 
-        rule.onNodeWithTag("myClickable")
-            .performTouchInput {
-                doubleClick()
-            }
+        rule.onNodeWithTag("myClickable").performTouchInput { doubleClick() }
 
         rule.mainClock.advanceTimeUntil { doubleClickCounter == 1 }
 
@@ -1798,10 +1601,7 @@
             assertThat(outerClickCounter).isEqualTo(0)
         }
 
-        rule.onNodeWithTag("myClickable")
-            .performTouchInput {
-                longClick()
-            }
+        rule.onNodeWithTag("myClickable").performTouchInput { longClick() }
 
         rule.mainClock.advanceTimeUntil { longClickCounter == 1 }
 
@@ -1828,67 +1628,53 @@
             scope = rememberCoroutineScope()
             BasicText(
                 "ClickableText",
-                modifier = Modifier
-                    .testTag("myClickable")
-                    .combinedClickable(
-                        enabled = enabled.value,
-                        onClick = {},
-                        interactionSource = interactionSource,
-                        indication = null
-                    )
+                modifier =
+                    Modifier.testTag("myClickable")
+                        .combinedClickable(
+                            enabled = enabled.value,
+                            onClick = {},
+                            interactionSource = interactionSource,
+                            indication = null
+                        )
             )
         }
 
         val interactions = mutableListOf<Interaction>()
 
-        scope.launch {
-            interactionSource.interactions.collect { interactions.add(it) }
-        }
+        scope.launch { interactionSource.interactions.collect { interactions.add(it) } }
 
-        rule.runOnIdle {
-            assertThat(interactions).isEmpty()
-        }
+        rule.runOnIdle { assertThat(interactions).isEmpty() }
 
-        rule.onNodeWithTag("myClickable")
-            .performMouseInput { enter(center) }
+        rule.onNodeWithTag("myClickable").performMouseInput { enter(center) }
 
         rule.runOnIdle {
             assertThat(interactions).hasSize(1)
             assertThat(interactions.first()).isInstanceOf(HoverInteraction.Enter::class.java)
         }
 
-        rule.onNodeWithTag("myClickable")
-            .performMouseInput { exit(Offset(-1f, -1f)) }
+        rule.onNodeWithTag("myClickable").performMouseInput { exit(Offset(-1f, -1f)) }
 
         rule.runOnIdle {
             interactions.clear()
             enabled.value = false
         }
 
-        rule.onNodeWithTag("myClickable")
-            .performMouseInput { enter(center) }
+        rule.onNodeWithTag("myClickable").performMouseInput { enter(center) }
 
-        rule.runOnIdle {
-            assertThat(interactions).isEmpty()
-        }
+        rule.runOnIdle { assertThat(interactions).isEmpty() }
 
-        rule.onNodeWithTag("myClickable")
-            .performMouseInput { exit(Offset(-1f, -1f)) }
+        rule.onNodeWithTag("myClickable").performMouseInput { exit(Offset(-1f, -1f)) }
 
-        rule.runOnIdle {
-            enabled.value = true
-        }
+        rule.runOnIdle { enabled.value = true }
 
-        rule.onNodeWithTag("myClickable")
-            .performMouseInput { enter(center) }
+        rule.onNodeWithTag("myClickable").performMouseInput { enter(center) }
 
         rule.runOnIdle {
             assertThat(interactions).hasSize(1)
             assertThat(interactions.first()).isInstanceOf(HoverInteraction.Enter::class.java)
         }
 
-        rule.onNodeWithTag("myClickable")
-            .performMouseInput { exit(Offset(-1f, -1f)) }
+        rule.onNodeWithTag("myClickable").performMouseInput { exit(Offset(-1f, -1f)) }
     }
 
     @OptIn(ExperimentalComposeUiApi::class)
@@ -1896,10 +1682,12 @@
     fun noFocus_whenDisabled() {
         val requester = FocusRequester()
         // Force clickable to always be in non-touch mode, so it should be focusable
-        val keyboardMockManager = object : InputModeManager {
-            override val inputMode = Keyboard
-            override fun requestInputMode(inputMode: InputMode) = true
-        }
+        val keyboardMockManager =
+            object : InputModeManager {
+                override val inputMode = Keyboard
+
+                override fun requestInputMode(inputMode: InputMode) = true
+            }
 
         val enabled = mutableStateOf(true)
         lateinit var focusState: FocusState
@@ -1909,11 +1697,11 @@
                 Box {
                     BasicText(
                         "ClickableText",
-                        modifier = Modifier
-                            .testTag("myClickable")
-                            .focusRequester(requester)
-                            .onFocusEvent { focusState = it }
-                            .combinedClickable(enabled = enabled.value) {}
+                        modifier =
+                            Modifier.testTag("myClickable")
+                                .focusRequester(requester)
+                                .onFocusEvent { focusState = it }
+                                .combinedClickable(enabled = enabled.value) {}
                     )
                 }
             }
@@ -1924,9 +1712,7 @@
             assertThat(focusState.isFocused).isTrue()
         }
 
-        rule.runOnIdle {
-            enabled.value = false
-        }
+        rule.runOnIdle { enabled.value = false }
 
         rule.runOnIdle {
             assertThat(focusState.isFocused).isFalse()
@@ -1935,18 +1721,18 @@
         }
     }
 
-    /**
-     * Test for b/269319898
-     */
+    /** Test for b/269319898 */
     @OptIn(ExperimentalComposeUiApi::class)
     @Test
     fun noFocusPropertiesSet_whenDisabled() {
         val requester = FocusRequester()
         // Force clickable to always be in non-touch mode, so it should be focusable
-        val keyboardMockManager = object : InputModeManager {
-            override val inputMode = Keyboard
-            override fun requestInputMode(inputMode: InputMode) = true
-        }
+        val keyboardMockManager =
+            object : InputModeManager {
+                override val inputMode = Keyboard
+
+                override fun requestInputMode(inputMode: InputMode) = true
+            }
 
         val enabled = mutableStateOf(true)
         lateinit var focusState: FocusState
@@ -1955,8 +1741,7 @@
             CompositionLocalProvider(LocalInputModeManager provides keyboardMockManager) {
                 Box(Modifier.combinedClickable(enabled = enabled.value, onClick = {})) {
                     Box(
-                        Modifier
-                            .size(10.dp)
+                        Modifier.size(10.dp)
                             // If clickable is setting canFocus to true without a focus target, then
                             // that would override this property
                             .focusProperties { canFocus = false }
@@ -1976,9 +1761,7 @@
             assertThat(focusState.isFocused).isFalse()
         }
 
-        rule.runOnIdle {
-            enabled.value = false
-        }
+        rule.runOnIdle { enabled.value = false }
 
         rule.runOnIdle {
             // Clickable is disabled, it should not apply properties down the tree
@@ -1989,45 +1772,49 @@
 
     @Test
     fun testInspectorValue_noIndicationOverload() {
-        val onClick: () -> Unit = { }
+        val onClick: () -> Unit = {}
         rule.setContent {
             val modifier = Modifier.combinedClickable(onClick = onClick) as InspectableValue
             assertThat(modifier.nameFallback).isEqualTo("combinedClickable")
             assertThat(modifier.valueOverride).isNull()
-            assertThat(modifier.inspectableElements.map { it.name }.asIterable()).containsExactly(
-                "enabled",
-                "onClickLabel",
-                "role",
-                "onClick",
-                "onDoubleClick",
-                "onLongClick",
-                "onLongClickLabel"
-            )
+            assertThat(modifier.inspectableElements.map { it.name }.asIterable())
+                .containsExactly(
+                    "enabled",
+                    "onClickLabel",
+                    "role",
+                    "onClick",
+                    "onDoubleClick",
+                    "onLongClick",
+                    "onLongClickLabel"
+                )
         }
     }
 
     @Test
     fun testInspectorValue_fullParamsOverload() {
-        val onClick: () -> Unit = { }
+        val onClick: () -> Unit = {}
         rule.setContent {
-            val modifier = Modifier.combinedClickable(
-                onClick = onClick,
-                interactionSource = remember { MutableInteractionSource() },
-                indication = null
-            ).first() as InspectableValue
+            val modifier =
+                Modifier.combinedClickable(
+                        onClick = onClick,
+                        interactionSource = remember { MutableInteractionSource() },
+                        indication = null
+                    )
+                    .first() as InspectableValue
             assertThat(modifier.nameFallback).isEqualTo("combinedClickable")
             assertThat(modifier.valueOverride).isNull()
-            assertThat(modifier.inspectableElements.map { it.name }.asIterable()).containsExactly(
-                "enabled",
-                "onClickLabel",
-                "onClick",
-                "role",
-                "onDoubleClick",
-                "onLongClick",
-                "onLongClickLabel",
-                "indicationNodeFactory",
-                "interactionSource"
-            )
+            assertThat(modifier.inspectableElements.map { it.name }.asIterable())
+                .containsExactly(
+                    "enabled",
+                    "onClickLabel",
+                    "onClick",
+                    "role",
+                    "onDoubleClick",
+                    "onLongClick",
+                    "onLongClickLabel",
+                    "indicationNodeFactory",
+                    "interactionSource"
+                )
         }
     }
 
@@ -2037,26 +1824,22 @@
         val tag = "my clickable"
         rule.setContent {
             Box(
-                Modifier
-                    .requiredHeight(20.dp)
+                Modifier.requiredHeight(20.dp)
                     .requiredWidth(20.dp)
                     .clipToBounds()
                     .combinedClickable { clicked = true }
                     .testTag(tag)
             )
         }
-        rule.onNodeWithTag(tag)
+        rule
+            .onNodeWithTag(tag)
             .assertWidthIsEqualTo(20.dp)
             .assertHeightIsEqualTo(20.dp)
             .assertTouchHeightIsEqualTo(48.dp)
             .assertTouchWidthIsEqualTo(48.dp)
-            .performTouchInput {
-                click(Offset(-1f, -1f))
-            }
+            .performTouchInput { click(Offset(-1f, -1f)) }
 
-        rule.runOnIdle {
-            assertThat(clicked).isTrue()
-        }
+        rule.runOnIdle { assertThat(clicked).isTrue() }
     }
 
     @Test
@@ -2065,26 +1848,22 @@
         val tag = "my clickable"
         rule.setContent {
             Box(
-                Modifier
-                    .requiredHeight(50.dp)
+                Modifier.requiredHeight(50.dp)
                     .requiredWidth(20.dp)
                     .clipToBounds()
                     .combinedClickable { clicked = true }
                     .testTag(tag)
             )
         }
-        rule.onNodeWithTag(tag)
+        rule
+            .onNodeWithTag(tag)
             .assertWidthIsEqualTo(20.dp)
             .assertHeightIsEqualTo(50.dp)
             .assertTouchHeightIsEqualTo(50.dp)
             .assertTouchWidthIsEqualTo(48.dp)
-            .performTouchInput {
-                click(Offset(-1f, 0f))
-            }
+            .performTouchInput { click(Offset(-1f, 0f)) }
 
-        rule.runOnIdle {
-            assertThat(clicked).isTrue()
-        }
+        rule.runOnIdle { assertThat(clicked).isTrue() }
     }
 
     @Test
@@ -2093,26 +1872,22 @@
         val tag = "my clickable"
         rule.setContent {
             Box(
-                Modifier
-                    .requiredHeight(20.dp)
+                Modifier.requiredHeight(20.dp)
                     .requiredWidth(50.dp)
                     .clipToBounds()
                     .combinedClickable { clicked = true }
                     .testTag(tag)
             )
         }
-        rule.onNodeWithTag(tag)
+        rule
+            .onNodeWithTag(tag)
             .assertWidthIsEqualTo(50.dp)
             .assertHeightIsEqualTo(20.dp)
             .assertTouchHeightIsEqualTo(48.dp)
             .assertTouchWidthIsEqualTo(50.dp)
-            .performTouchInput {
-                click(Offset(0f, -1f))
-            }
+            .performTouchInput { click(Offset(0f, -1f)) }
 
-        rule.runOnIdle {
-            assertThat(clicked).isTrue()
-        }
+        rule.runOnIdle { assertThat(clicked).isTrue() }
     }
 
     @Test
@@ -2126,14 +1901,15 @@
             scope = rememberCoroutineScope()
             inputModeManager = LocalInputModeManager.current
             Box(Modifier.padding(10.dp)) {
-                BasicText("ClickableText",
-                    modifier = Modifier
-                        .testTag("clickable")
-                        .focusRequester(focusRequester)
-                        .combinedClickable(
-                            interactionSource = interactionSource,
-                            indication = null
-                        ) {}
+                BasicText(
+                    "ClickableText",
+                    modifier =
+                        Modifier.testTag("clickable")
+                            .focusRequester(focusRequester)
+                            .combinedClickable(
+                                interactionSource = interactionSource,
+                                indication = null
+                            ) {}
                 )
             }
         }
@@ -2143,9 +1919,7 @@
         }
 
         val interactions = mutableListOf<Interaction>()
-        scope.launch {
-            interactionSource.interactions.collect { interactions.add(it) }
-        }
+        scope.launch { interactionSource.interactions.collect { interactions.add(it) } }
 
         rule.onNodeWithTag("clickable").performKeyInput { keyDown(Key.Enter) }
 
@@ -2174,14 +1948,15 @@
             scope = rememberCoroutineScope()
             inputModeManager = LocalInputModeManager.current
             Box(Modifier.padding(10.dp)) {
-                BasicText("ClickableText",
-                    modifier = Modifier
-                        .testTag("clickable")
-                        .focusRequester(focusRequester)
-                        .combinedClickable(
-                            interactionSource = interactionSource,
-                            indication = null
-                        ) {}
+                BasicText(
+                    "ClickableText",
+                    modifier =
+                        Modifier.testTag("clickable")
+                            .focusRequester(focusRequester)
+                            .combinedClickable(
+                                interactionSource = interactionSource,
+                                indication = null
+                            ) {}
                 )
             }
         }
@@ -2191,9 +1966,7 @@
         }
 
         val interactions = mutableListOf<Interaction>()
-        scope.launch {
-            interactionSource.interactions.collect { interactions.add(it) }
-        }
+        scope.launch { interactionSource.interactions.collect { interactions.add(it) } }
 
         rule.onNodeWithTag("clickable").performKeyInput { keyDown(Key.NumPadEnter) }
 
@@ -2222,14 +1995,15 @@
             scope = rememberCoroutineScope()
             inputModeManager = LocalInputModeManager.current
             Box(Modifier.padding(10.dp)) {
-                BasicText("ClickableText",
-                    modifier = Modifier
-                        .testTag("clickable")
-                        .focusRequester(focusRequester)
-                        .combinedClickable(
-                            interactionSource = interactionSource,
-                            indication = null
-                        ) {}
+                BasicText(
+                    "ClickableText",
+                    modifier =
+                        Modifier.testTag("clickable")
+                            .focusRequester(focusRequester)
+                            .combinedClickable(
+                                interactionSource = interactionSource,
+                                indication = null
+                            ) {}
                 )
             }
         }
@@ -2240,9 +2014,7 @@
         rule.waitForIdle()
 
         val interactions = mutableListOf<Interaction>()
-        scope.launch {
-            interactionSource.interactions.collect { interactions.add(it) }
-        }
+        scope.launch { interactionSource.interactions.collect { interactions.add(it) } }
 
         rule.onNodeWithTag("clickable").performKeyInput { keyDown(Key.DirectionCenter) }
 
@@ -2271,14 +2043,15 @@
             scope = rememberCoroutineScope()
             inputModeManager = LocalInputModeManager.current
             Box(Modifier.padding(10.dp)) {
-                BasicText("ClickableText",
-                    modifier = Modifier
-                        .testTag("clickable")
-                        .focusRequester(focusRequester)
-                        .combinedClickable(
-                            interactionSource = interactionSource,
-                            indication = null
-                        ) {}
+                BasicText(
+                    "ClickableText",
+                    modifier =
+                        Modifier.testTag("clickable")
+                            .focusRequester(focusRequester)
+                            .combinedClickable(
+                                interactionSource = interactionSource,
+                                indication = null
+                            ) {}
                 )
             }
         }
@@ -2288,14 +2061,10 @@
         }
 
         val interactions = mutableListOf<Interaction>()
-        scope.launch {
-            interactionSource.interactions.collect { interactions.add(it) }
-        }
+        scope.launch { interactionSource.interactions.collect { interactions.add(it) } }
 
         rule.onNodeWithTag("clickable").performKeyInput { pressKey(Key.Spacebar) }
-        rule.runOnIdle {
-            assertThat(interactions).isEmpty()
-        }
+        rule.runOnIdle { assertThat(interactions).isEmpty() }
     }
 
     @Test
@@ -2309,14 +2078,15 @@
             scope = rememberCoroutineScope()
             inputModeManager = LocalInputModeManager.current
             Box(Modifier.padding(10.dp)) {
-                BasicText("ClickableText",
-                    modifier = Modifier
-                        .testTag("clickable")
-                        .focusRequester(focusRequester)
-                        .combinedClickable(
-                            interactionSource = interactionSource,
-                            indication = null
-                        ) {}
+                BasicText(
+                    "ClickableText",
+                    modifier =
+                        Modifier.testTag("clickable")
+                            .focusRequester(focusRequester)
+                            .combinedClickable(
+                                interactionSource = interactionSource,
+                                indication = null
+                            ) {}
                 )
             }
         }
@@ -2326,9 +2096,7 @@
         }
 
         val interactions = mutableListOf<Interaction>()
-        scope.launch {
-            interactionSource.interactions.collect { interactions.add(it) }
-        }
+        scope.launch { interactionSource.interactions.collect { interactions.add(it) } }
 
         val clickableNode = rule.onNodeWithTag("clickable")
 
@@ -2372,19 +2140,19 @@
             scope = rememberCoroutineScope()
             inputModeManager = LocalInputModeManager.current
             Box(Modifier.padding(10.dp)) {
-                BasicText("ClickableText",
-                    modifier = Modifier
-                        .testTag("clickable")
-                        .focusRequester(focusRequester)
-                        .onKeyEvent {
-                            if (it.nativeKeyEvent.repeatCount != 0)
-                                repeatCounter++
-                            false
-                        }
-                        .combinedClickable(
-                            interactionSource = interactionSource,
-                            indication = null,
-                        ) {}
+                BasicText(
+                    "ClickableText",
+                    modifier =
+                        Modifier.testTag("clickable")
+                            .focusRequester(focusRequester)
+                            .onKeyEvent {
+                                if (it.nativeKeyEvent.repeatCount != 0) repeatCounter++
+                                false
+                            }
+                            .combinedClickable(
+                                interactionSource = interactionSource,
+                                indication = null,
+                            ) {}
                 )
             }
         }
@@ -2394,9 +2162,7 @@
         }
 
         val interactions = mutableListOf<Interaction>()
-        scope.launch {
-            interactionSource.interactions.collect { interactions.add(it) }
-        }
+        scope.launch { interactionSource.interactions.collect { interactions.add(it) } }
 
         rule.onNodeWithTag("clickable").performKeyInput {
             keyDown(Key.Enter)
@@ -2433,15 +2199,16 @@
             scope = rememberCoroutineScope()
             inputModeManager = LocalInputModeManager.current
             Box(Modifier.padding(10.dp)) {
-                BasicText("ClickableText",
-                    modifier = Modifier
-                        .testTag("clickable")
-                        .focusRequester(focusRequester)
-                        .combinedClickable(
-                            interactionSource = interactionSource,
-                            indication = null,
-                            enabled = enabled.value
-                        ) {}
+                BasicText(
+                    "ClickableText",
+                    modifier =
+                        Modifier.testTag("clickable")
+                            .focusRequester(focusRequester)
+                            .combinedClickable(
+                                interactionSource = interactionSource,
+                                indication = null,
+                                enabled = enabled.value
+                            ) {}
                 )
             }
         }
@@ -2451,9 +2218,7 @@
         }
 
         val interactions = mutableListOf<Interaction>()
-        scope.launch {
-            interactionSource.interactions.collect { interactions.add(it) }
-        }
+        scope.launch { interactionSource.interactions.collect { interactions.add(it) } }
 
         val clickableNode = rule.onNodeWithTag("clickable")
 
@@ -2496,10 +2261,10 @@
             val content = remember {
                 movableContentOf {
                     BoxWithConstraints {
-                        BasicText("ClickableText",
-                            modifier = Modifier
-                                .testTag("clickable")
-                                .combinedClickable(
+                        BasicText(
+                            "ClickableText",
+                            modifier =
+                                Modifier.testTag("clickable").combinedClickable(
                                     role = if (moveContent) Role.Button else Role.Checkbox,
                                     onClickLabel = moveContent.toString(),
                                     onLongClick = {},
@@ -2510,30 +2275,32 @@
                 }
             }
 
-            key(moveContent) {
-                content()
-            }
+            key(moveContent) { content() }
         }
 
-        rule.onNodeWithTag("clickable")
+        rule
+            .onNodeWithTag("clickable")
             .assert(SemanticsMatcher.expectValue(SemanticsProperties.Role, Role.Checkbox))
             .assertOnClickLabelMatches("false")
             .assertOnLongClickLabelMatches("false")
 
-        rule.runOnIdle {
-            moveContent = true
-        }
+        rule.runOnIdle { moveContent = true }
 
-        rule.onNodeWithTag("clickable")
+        rule
+            .onNodeWithTag("clickable")
             .assert(SemanticsMatcher.expectValue(SemanticsProperties.Role, Role.Button))
             .assertOnClickLabelMatches("true")
             .assertOnLongClickLabelMatches("true")
     }
 }
 
-private fun SemanticsNodeInteraction.assertOnLongClickLabelMatches(expectedValue: String):
-    SemanticsNodeInteraction {
-    return assert(SemanticsMatcher("onLongClickLabel = '$expectedValue'") {
-        it.config.getOrElseNullable(SemanticsActions.OnLongClick) { null }?.label == expectedValue
-    })
+private fun SemanticsNodeInteraction.assertOnLongClickLabelMatches(
+    expectedValue: String
+): SemanticsNodeInteraction {
+    return assert(
+        SemanticsMatcher("onLongClickLabel = '$expectedValue'") {
+            it.config.getOrElseNullable(SemanticsActions.OnLongClick) { null }?.label ==
+                expectedValue
+        }
+    )
 }
diff --git a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/Draggable2DTest.kt b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/Draggable2DTest.kt
index 80a290d..0ad4ee8 100644
--- a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/Draggable2DTest.kt
+++ b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/Draggable2DTest.kt
@@ -76,8 +76,7 @@
 @RunWith(AndroidJUnit4::class)
 class Draggable2DTest {
 
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
     private val draggable2DBoxTag = "drag2DTag"
 
@@ -94,9 +93,7 @@
     @Test
     fun draggable2D_2d_drag() {
         var total = Offset.Zero
-        setDraggable2DContent {
-            Modifier.draggable2D { total += it }
-        }
+        setDraggable2DContent { Modifier.draggable2D { total += it } }
         rule.onNodeWithTag(draggable2DBoxTag).performTouchInput {
             down(center)
             moveBy(Offset(100f, 100f))
@@ -105,9 +102,7 @@
             assertThat(total.x).isGreaterThan(0)
             assertThat(total.y).isGreaterThan(0)
         }
-        rule.onNodeWithTag(draggable2DBoxTag).performTouchInput {
-            moveBy(Offset(-100f, -100f))
-        }
+        rule.onNodeWithTag(draggable2DBoxTag).performTouchInput { moveBy(Offset(-100f, -100f)) }
         rule.runOnIdle {
             assertThat(total.x).isLessThan(0.01f)
             assertThat(total.y).isLessThan(0.01f)
@@ -143,36 +138,27 @@
     fun draggable2D_disableWontCallLambda() {
         var total = Offset.Zero
         val enabled = mutableStateOf(true)
-        setDraggable2DContent {
-            Modifier.draggable2D(enabled = enabled.value) {
-                total += it
-            }
-        }
+        setDraggable2DContent { Modifier.draggable2D(enabled = enabled.value) { total += it } }
         rule.onNodeWithTag(draggable2DBoxTag).performTouchInput {
             down(center)
             moveBy(Offset(100f, 100f))
         }
-        val prevTotal = rule.runOnIdle {
-            assertThat(total.x).isGreaterThan(0f)
-            assertThat(total.y).isGreaterThan(0f)
-            enabled.value = false
-            total
-        }
-        rule.onNodeWithTag(draggable2DBoxTag).performTouchInput {
-            moveBy(Offset(100f, 100f))
-        }
-        rule.runOnIdle {
-            assertThat(total).isEqualTo(prevTotal)
-        }
+        val prevTotal =
+            rule.runOnIdle {
+                assertThat(total.x).isGreaterThan(0f)
+                assertThat(total.y).isGreaterThan(0f)
+                enabled.value = false
+                total
+            }
+        rule.onNodeWithTag(draggable2DBoxTag).performTouchInput { moveBy(Offset(100f, 100f)) }
+        rule.runOnIdle { assertThat(total).isEqualTo(prevTotal) }
     }
 
     @Test
     fun draggable2D_velocityProxy() {
         var velocityTriggered = Velocity.Zero
         setDraggable2DContent {
-            Modifier.draggable2D(
-                onDragStopped = { velocityTriggered = it }
-            ) {}
+            Modifier.draggable2D(onDragStopped = { velocityTriggered = it }) {}
         }
         rule.onNodeWithTag(draggable2DBoxTag).performTouchInput {
             down(center)
@@ -187,11 +173,7 @@
     @Test
     fun draggable2D_startWithoutSlop_ifAnimating() {
         var total = Offset.Zero
-        setDraggable2DContent {
-            Modifier.draggable2D(startDragImmediately = true) {
-                total += it
-            }
-        }
+        setDraggable2DContent { Modifier.draggable2D(startDragImmediately = true) { total += it } }
         rule.onNodeWithTag(draggable2DBoxTag).performTouchInput {
             down(center)
             moveBy(Offset(100f, 100f))
@@ -212,7 +194,9 @@
                 Modifier.draggable2D(
                     onDragStopped = { dragStopped += 1 },
                     startDragImmediately = true
-                ) { total += it }
+                ) {
+                    total += it
+                }
             } else Modifier
         }
         rule.onNodeWithTag(draggable2DBoxTag).performTouchInput {
@@ -237,31 +221,22 @@
                 onDragStopped = { dragStopped += 1 },
                 onDragStarted = { dragStarted += 1 },
                 startDragImmediately = true
-            ) { total += it }
+            ) {
+                total += it
+            }
         }
-        rule.onNodeWithTag(draggable2DBoxTag).performMouseInput {
-            this.press()
-        }
-        rule.runOnIdle {
-            assertThat(dragStarted).isEqualTo(1f)
-        }
-        rule.onNodeWithTag(draggable2DBoxTag).performMouseInput {
-            this.release()
-        }
-        rule.runOnIdle {
-            assertThat(dragStopped).isEqualTo(1f)
-        }
+        rule.onNodeWithTag(draggable2DBoxTag).performMouseInput { this.press() }
+        rule.runOnIdle { assertThat(dragStarted).isEqualTo(1f) }
+        rule.onNodeWithTag(draggable2DBoxTag).performMouseInput { this.release() }
+        rule.runOnIdle { assertThat(dragStopped).isEqualTo(1f) }
     }
 
     @Test
     fun draggable2D_callsDragStop_whenNewState() {
         var dragStopped = 0f
-        val state = mutableStateOf(Draggable2DState { })
+        val state = mutableStateOf(Draggable2DState {})
         setDraggable2DContent {
-            Modifier.draggable2D(
-                onDragStopped = { dragStopped += 1 },
-                state = state.value
-            )
+            Modifier.draggable2D(onDragStopped = { dragStopped += 1 }, state = state.value)
         }
         rule.onNodeWithTag(draggable2DBoxTag).performTouchInput {
             down(center)
@@ -271,9 +246,7 @@
             assertThat(dragStopped).isEqualTo(0f)
             state.value = Draggable2DState { /* Do nothing */ }
         }
-        rule.runOnIdle {
-            assertThat(dragStopped).isEqualTo(1f)
-        }
+        rule.runOnIdle { assertThat(dragStopped).isEqualTo(1f) }
     }
 
     @Test
@@ -295,9 +268,7 @@
             assertThat(dragStopped).isEqualTo(0f)
             enabled = false
         }
-        rule.runOnIdle {
-            assertThat(dragStopped).isEqualTo(1f)
-        }
+        rule.runOnIdle { assertThat(dragStopped).isEqualTo(1f) }
     }
 
     @Test
@@ -319,9 +290,7 @@
             assertThat(dragStopped).isEqualTo(0f)
             reverseDirection = true
         }
-        rule.runOnIdle {
-            assertThat(dragStopped).isEqualTo(1f)
-        }
+        rule.runOnIdle { assertThat(dragStopped).isEqualTo(1f) }
     }
 
     @Test
@@ -351,9 +320,7 @@
             moveBy(Offset(delta, delta))
             up()
         }
-        rule.runOnIdle {
-            assertThat(total).isEqualTo(Offset(delta, delta))
-        }
+        rule.runOnIdle { assertThat(total).isEqualTo(Offset(delta, delta)) }
     }
 
     @Test
@@ -363,10 +330,7 @@
         var onDragStarted2Calls = 0
         var onDragStarted: (Offset) -> Unit by mutableStateOf({ onDragStarted1Calls += 1 })
         setDraggable2DContent {
-            Modifier.draggable2D(
-                onDrag = { total += it },
-                onDragStarted = onDragStarted
-            )
+            Modifier.draggable2D(onDrag = { total += it }, onDragStarted = onDragStarted)
         }
         rule.onNodeWithTag(draggable2DBoxTag).performTouchInput {
             down(center)
@@ -396,10 +360,7 @@
         var onDragStopped2Calls = 0
         var onDragStopped: (Velocity) -> Unit by mutableStateOf({ onDragStopped1Calls += 1 })
         setDraggable2DContent {
-            Modifier.draggable2D(
-                onDrag = { total += it },
-                onDragStopped = onDragStopped
-            )
+            Modifier.draggable2D(onDrag = { total += it }, onDragStopped = onDragStopped)
         }
         rule.onNodeWithTag(draggable2DBoxTag).performTouchInput {
             down(center)
@@ -410,9 +371,7 @@
             assertThat(onDragStopped2Calls).isEqualTo(0)
             onDragStopped = { onDragStopped2Calls += 1 }
         }
-        rule.onNodeWithTag(draggable2DBoxTag).performTouchInput {
-            up()
-        }
+        rule.onNodeWithTag(draggable2DBoxTag).performTouchInput { up() }
         rule.runOnIdle {
             // We changed the lambda before we ever stopped dragging, so only the new one should be
             // called
@@ -427,23 +386,19 @@
         var dragStopped = 0f
         val state = Draggable2DState { total += it }
         setDraggable2DContent {
-            Modifier.draggable2D(
-                onDragStopped = { dragStopped += 1 },
-                state = state
-            )
+            Modifier.draggable2D(onDragStopped = { dragStopped += 1 }, state = state)
         }
         rule.onNodeWithTag(draggable2DBoxTag).performTouchInput {
             down(center)
             moveBy(Offset(100f, 100f))
         }
-        val prevTotal = rule.runOnIdle {
-            assertThat(total.x).isGreaterThan(0f)
-            assertThat(total.y).isGreaterThan(0f)
-            total
-        }
-        state.drag(MutatePriority.PreventUserInput) {
-            dragBy(Offset(123f, 123f))
-        }
+        val prevTotal =
+            rule.runOnIdle {
+                assertThat(total.x).isGreaterThan(0f)
+                assertThat(total.y).isGreaterThan(0f)
+                total
+            }
+        state.drag(MutatePriority.PreventUserInput) { dragBy(Offset(123f, 123f)) }
         rule.runOnIdle {
             assertThat(total).isEqualTo(prevTotal + Offset(123f, 123f))
             assertThat(dragStopped).isEqualTo(1f)
@@ -468,19 +423,14 @@
             Box {
                 Box(
                     contentAlignment = Alignment.Center,
-                    modifier = Modifier
-                        .testTag(draggable2DBoxTag)
-                        .size(300.dp)
-                        .draggable2D {
+                    modifier =
+                        Modifier.testTag(draggable2DBoxTag).size(300.dp).draggable2D {
                             outerDrag += it
                         }
                 ) {
                     Box(
-                        modifier = Modifier
-                            .size(300.dp)
-                            .draggable2D { delta ->
-                                innerDrag += delta / 2f
-                            }
+                        modifier =
+                            Modifier.size(300.dp).draggable2D { delta -> innerDrag += delta / 2f }
                     )
                 }
             }
@@ -505,19 +455,16 @@
             Box {
                 Box(
                     contentAlignment = Alignment.Center,
-                    modifier = Modifier
-                        .testTag(draggable2DBoxTag)
-                        .size(300.dp)
-                        .draggable(Orientation.Horizontal) {
+                    modifier =
+                        Modifier.testTag(draggable2DBoxTag).size(300.dp).draggable(
+                            Orientation.Horizontal
+                        ) {
                             outerDrag += it
                         }
                 ) {
                     Box(
-                        modifier = Modifier
-                            .size(300.dp)
-                            .draggable2D { delta ->
-                                innerDrag2D += delta / 2f
-                            }
+                        modifier =
+                            Modifier.size(300.dp).draggable2D { delta -> innerDrag2D += delta / 2f }
                     )
                 }
             }
@@ -542,43 +489,32 @@
 
         setDraggable2DContent {
             scope = rememberCoroutineScope()
-            Modifier.draggable2D(
-                interactionSource = interactionSource
-            ) {}
+            Modifier.draggable2D(interactionSource = interactionSource) {}
         }
 
         val interactions = mutableListOf<Interaction>()
 
-        scope!!.launch {
-            interactionSource.interactions.collect { interactions.add(it) }
-        }
+        scope!!.launch { interactionSource.interactions.collect { interactions.add(it) } }
 
-        rule.runOnIdle {
-            assertThat(interactions).isEmpty()
-        }
+        rule.runOnIdle { assertThat(interactions).isEmpty() }
 
-        rule.onNodeWithTag(draggable2DBoxTag)
-            .performTouchInput {
-                down(Offset(visibleSize.width / 4f, visibleSize.height / 4f))
-                moveBy(Offset(visibleSize.width / 2f, visibleSize.height / 2f))
-            }
+        rule.onNodeWithTag(draggable2DBoxTag).performTouchInput {
+            down(Offset(visibleSize.width / 4f, visibleSize.height / 4f))
+            moveBy(Offset(visibleSize.width / 2f, visibleSize.height / 2f))
+        }
 
         rule.runOnIdle {
             assertThat(interactions).hasSize(1)
             assertThat(interactions.first()).isInstanceOf(DragInteraction.Start::class.java)
         }
 
-        rule.onNodeWithTag(draggable2DBoxTag)
-            .performTouchInput {
-                up()
-            }
+        rule.onNodeWithTag(draggable2DBoxTag).performTouchInput { up() }
 
         rule.runOnIdle {
             assertThat(interactions).hasSize(2)
             assertThat(interactions.first()).isInstanceOf(DragInteraction.Start::class.java)
             assertThat(interactions[1]).isInstanceOf(DragInteraction.Stop::class.java)
-            assertThat((interactions[1] as DragInteraction.Stop).start)
-                .isEqualTo(interactions[0])
+            assertThat((interactions[1] as DragInteraction.Stop).start).isEqualTo(interactions[0])
         }
     }
 
@@ -594,10 +530,8 @@
             Box {
                 if (emitDraggableBox) {
                     Box(
-                        modifier = Modifier
-                            .testTag(draggable2DBoxTag)
-                            .size(100.dp)
-                            .draggable2D(
+                        modifier =
+                            Modifier.testTag(draggable2DBoxTag).size(100.dp).draggable2D(
                                 interactionSource = interactionSource
                             ) {}
                     )
@@ -607,19 +541,14 @@
 
         val interactions = mutableListOf<Interaction>()
 
-        scope!!.launch {
-            interactionSource.interactions.collect { interactions.add(it) }
-        }
+        scope!!.launch { interactionSource.interactions.collect { interactions.add(it) } }
 
-        rule.runOnIdle {
-            assertThat(interactions).isEmpty()
-        }
+        rule.runOnIdle { assertThat(interactions).isEmpty() }
 
-        rule.onNodeWithTag(draggable2DBoxTag)
-            .performTouchInput {
-                down(Offset(visibleSize.width / 4f, visibleSize.height / 4f))
-                moveBy(Offset(visibleSize.width / 2f, visibleSize.height / 2f))
-            }
+        rule.onNodeWithTag(draggable2DBoxTag).performTouchInput {
+            down(Offset(visibleSize.width / 4f, visibleSize.height / 4f))
+            moveBy(Offset(visibleSize.width / 2f, visibleSize.height / 2f))
+        }
 
         rule.runOnIdle {
             assertThat(interactions).hasSize(1)
@@ -627,16 +556,13 @@
         }
 
         // Dispose draggable
-        rule.runOnIdle {
-            emitDraggableBox = false
-        }
+        rule.runOnIdle { emitDraggableBox = false }
 
         rule.runOnIdle {
             assertThat(interactions).hasSize(2)
             assertThat(interactions.first()).isInstanceOf(DragInteraction.Start::class.java)
             assertThat(interactions[1]).isInstanceOf(DragInteraction.Cancel::class.java)
-            assertThat((interactions[1] as DragInteraction.Cancel).start)
-                .isEqualTo(interactions[0])
+            assertThat((interactions[1] as DragInteraction.Cancel).start).isEqualTo(interactions[0])
         }
     }
 
@@ -657,35 +583,27 @@
 
         val interactions = mutableListOf<Interaction>()
 
-        scope!!.launch {
-            interactionSource.interactions.collect { interactions.add(it) }
-        }
+        scope!!.launch { interactionSource.interactions.collect { interactions.add(it) } }
 
-        rule.runOnIdle {
-            assertThat(interactions).isEmpty()
-        }
+        rule.runOnIdle { assertThat(interactions).isEmpty() }
 
-        rule.onNodeWithTag(draggable2DBoxTag)
-            .performTouchInput {
-                down(Offset(visibleSize.width / 4f, visibleSize.height / 4f))
-                moveBy(Offset(visibleSize.width / 2f, visibleSize.height / 2f))
-            }
+        rule.onNodeWithTag(draggable2DBoxTag).performTouchInput {
+            down(Offset(visibleSize.width / 4f, visibleSize.height / 4f))
+            moveBy(Offset(visibleSize.width / 2f, visibleSize.height / 2f))
+        }
 
         rule.runOnIdle {
             assertThat(interactions).hasSize(1)
             assertThat(interactions.first()).isInstanceOf(DragInteraction.Start::class.java)
         }
 
-        rule.runOnIdle {
-            enabledState.value = false
-        }
+        rule.runOnIdle { enabledState.value = false }
 
         rule.runOnIdle {
             assertThat(interactions).hasSize(2)
             assertThat(interactions.first()).isInstanceOf(DragInteraction.Start::class.java)
             assertThat(interactions[1]).isInstanceOf(DragInteraction.Cancel::class.java)
-            assertThat((interactions[1] as DragInteraction.Cancel).start)
-                .isEqualTo(interactions[0])
+            assertThat((interactions[1] as DragInteraction.Cancel).start).isEqualTo(interactions[0])
         }
     }
 
@@ -696,19 +614,18 @@
 
         rule.setContent {
             val viewConfig = LocalViewConfiguration.current
-            val newConfig = object : ViewConfiguration by viewConfig {
-                override val maximumFlingVelocity: Float get() = maxVelocity
-            }
+            val newConfig =
+                object : ViewConfiguration by viewConfig {
+                    override val maximumFlingVelocity: Float
+                        get() = maxVelocity
+                }
             CompositionLocalProvider(LocalViewConfiguration provides newConfig) {
                 Box {
                     Box(
-                        modifier = Modifier
-                            .testTag(draggable2DBoxTag)
-                            .size(100.dp)
-                            .draggable2D(
-                                onDragStopped = {
-                                    latestVelocity = it
-                                }) {}
+                        modifier =
+                            Modifier.testTag(draggable2DBoxTag).size(100.dp).draggable2D(
+                                onDragStopped = { latestVelocity = it }
+                            ) {}
                     )
                 }
             }
@@ -721,9 +638,7 @@
                 endVelocity = 2000f
             )
         }
-        rule.runOnIdle {
-            assertThat(latestVelocity).isEqualTo(Velocity(maxVelocity, maxVelocity))
-        }
+        rule.runOnIdle { assertThat(latestVelocity).isEqualTo(Velocity(maxVelocity, maxVelocity)) }
     }
 
     @Test
@@ -736,28 +651,23 @@
 
         setDraggable2DContent {
             scope = rememberCoroutineScope()
-            Modifier.draggable2D(
-                interactionSource = interactionSourceState.value
-            ) {}
+            Modifier.draggable2D(interactionSource = interactionSourceState.value) {}
         }
 
         val interactions1 = mutableListOf<Interaction>()
         val interactions2 = mutableListOf<Interaction>()
 
-        scope!!.launch {
-            interactionSource1.interactions.collect { interactions1.add(it) }
-        }
+        scope!!.launch { interactionSource1.interactions.collect { interactions1.add(it) } }
 
         rule.runOnIdle {
             assertThat(interactions1).isEmpty()
             assertThat(interactions2).isEmpty()
         }
 
-        rule.onNodeWithTag(draggable2DBoxTag)
-            .performTouchInput {
-                down(Offset(visibleSize.width / 4f, visibleSize.height / 4f))
-                moveBy(Offset(visibleSize.width / 2f, visibleSize.height / 2f))
-            }
+        rule.onNodeWithTag(draggable2DBoxTag).performTouchInput {
+            down(Offset(visibleSize.width / 4f, visibleSize.height / 4f))
+            moveBy(Offset(visibleSize.width / 2f, visibleSize.height / 2f))
+        }
 
         rule.runOnIdle {
             assertThat(interactions1).hasSize(1)
@@ -765,9 +675,7 @@
             assertThat(interactions2).isEmpty()
         }
 
-        rule.runOnIdle {
-            interactionSourceState.value = interactionSource2
-        }
+        rule.runOnIdle { interactionSourceState.value = interactionSource2 }
 
         rule.runOnIdle {
             assertThat(interactions1).hasSize(2)
@@ -786,9 +694,7 @@
     fun draggable2D_cancelMidDown_shouldContinueWithNextDown() {
         var total = Offset.Zero
 
-        setDraggable2DContent {
-            Modifier.draggable2D(startDragImmediately = true) { total += it }
-        }
+        setDraggable2DContent { Modifier.draggable2D(startDragImmediately = true) { total += it } }
 
         rule.onNodeWithTag(draggable2DBoxTag).performMouseInput {
             enter()
@@ -824,9 +730,7 @@
         setDraggable2DContent {
             Modifier.draggable2D(
                 state = rememberDraggable2DState {},
-                onDragStopped = { velocity ->
-                    flingVelocity = velocity
-                }
+                onDragStopped = { velocity -> flingVelocity = velocity }
             )
         }
         // Drag, stop and release. The resulting velocity should be zero because we lost the
@@ -834,16 +738,12 @@
         rule.onNodeWithTag(draggable2DBoxTag).performTouchInput {
             down(center)
             // generate various move events
-            repeat(30) {
-                moveBy(Offset(delta, delta), delayMillis = 16L)
-            }
+            repeat(30) { moveBy(Offset(delta, delta), delayMillis = 16L) }
             // stop for a moment
             advanceEventTime(3000L)
             up()
         }
-        rule.runOnIdle {
-            Assert.assertEquals(Velocity.Zero, flingVelocity)
-        }
+        rule.runOnIdle { Assert.assertEquals(Velocity.Zero, flingVelocity) }
     }
 
     @Test
@@ -853,16 +753,17 @@
         rule.setContent {
             val scope = rememberCoroutineScope()
             Box(
-                modifier = Modifier
-                    .testTag(draggable2DBoxTag)
-                    .size(100.dp)
-                    .draggable2D(
-                        enabled = enabled.value,
-                        state = rememberDraggable2DState { },
-                        onDragStopped = { _ ->
-                            runningJob = scope.launch { delay(10_000L) } // long running operation
-                        }
-                    )
+                modifier =
+                    Modifier.testTag(draggable2DBoxTag)
+                        .size(100.dp)
+                        .draggable2D(
+                            enabled = enabled.value,
+                            state = rememberDraggable2DState {},
+                            onDragStopped = { _ ->
+                                runningJob =
+                                    scope.launch { delay(10_000L) } // long running operation
+                            }
+                        )
             )
         }
 
@@ -890,17 +791,15 @@
             touchSlop = LocalViewConfiguration.current.touchSlop
 
             Box(
-                modifier = Modifier
-                    .testTag(draggable2DBoxTag)
-                    .size(100.dp)
-                    .draggable2D(
-                        enabled = true,
-                        state = rememberDraggable2DState { },
-                        onDragStarted = { offset ->
-                            onDragStartedOffset = offset
-                        },
-                        startDragImmediately = false
-                    )
+                modifier =
+                    Modifier.testTag(draggable2DBoxTag)
+                        .size(100.dp)
+                        .draggable2D(
+                            enabled = true,
+                            state = rememberDraggable2DState {},
+                            onDragStarted = { offset -> onDragStartedOffset = offset },
+                            startDragImmediately = false
+                        )
             )
         }
 
@@ -928,26 +827,26 @@
     @Test
     fun testInspectableValue() {
         rule.setContent {
-            val modifier = Modifier.draggable2D(
-                state = rememberDraggable2DState { }
-            ) as InspectableValue
+            val modifier =
+                Modifier.draggable2D(state = rememberDraggable2DState {}) as InspectableValue
             assertThat(modifier.nameFallback).isEqualTo("draggable2D")
             assertThat(modifier.valueOverride).isNull()
-            assertThat(modifier.inspectableElements.map { it.name }.asIterable()).containsExactly(
-                "enabled",
-                "reverseDirection",
-                "interactionSource",
-                "startDragImmediately",
-                "onDragStarted",
-                "onDragStopped",
-                "state",
-            )
+            assertThat(modifier.inspectableElements.map { it.name }.asIterable())
+                .containsExactly(
+                    "enabled",
+                    "reverseDirection",
+                    "interactionSource",
+                    "startDragImmediately",
+                    "onDragStarted",
+                    "onDragStopped",
+                    "state",
+                )
         }
     }
 
     @Test
     fun equalInputs_shouldResolveToEquals() {
-        val state = Draggable2DState { }
+        val state = Draggable2DState {}
 
         assertModifierIsPure { toggleInput ->
             if (toggleInput) {
@@ -962,12 +861,7 @@
         rule.setContent {
             Box {
                 val draggable2D = draggable2DFactory()
-                Box(
-                    modifier = Modifier
-                        .testTag(draggable2DBoxTag)
-                        .size(100.dp)
-                        .then(draggable2D)
-                )
+                Box(modifier = Modifier.testTag(draggable2DBoxTag).size(100.dp).then(draggable2D))
             }
         }
     }
diff --git a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/DraggableTest.kt b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/DraggableTest.kt
index ffdc1b1..b4595a4 100644
--- a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/DraggableTest.kt
+++ b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/DraggableTest.kt
@@ -71,8 +71,7 @@
 @RunWith(AndroidJUnit4::class)
 class DraggableTest {
 
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
     private val draggableBoxTag = "dragTag"
 
@@ -89,9 +88,7 @@
     @Test
     fun draggable_horizontalDrag() {
         var total = 0f
-        setDraggableContent {
-            Modifier.draggable(Orientation.Horizontal) { total += it }
-        }
+        setDraggableContent { Modifier.draggable(Orientation.Horizontal) { total += it } }
         rule.onNodeWithTag(draggableBoxTag).performTouchInput {
             this.swipe(
                 start = this.center,
@@ -99,10 +96,11 @@
                 durationMillis = 100
             )
         }
-        val lastTotal = rule.runOnIdle {
-            assertThat(total).isGreaterThan(0)
-            total
-        }
+        val lastTotal =
+            rule.runOnIdle {
+                assertThat(total).isGreaterThan(0)
+                total
+            }
         rule.onNodeWithTag(draggableBoxTag).performTouchInput {
             this.swipe(
                 start = this.center,
@@ -110,9 +108,7 @@
                 durationMillis = 100
             )
         }
-        rule.runOnIdle {
-            assertThat(total).isEqualTo(lastTotal)
-        }
+        rule.runOnIdle { assertThat(total).isEqualTo(lastTotal) }
         rule.onNodeWithTag(draggableBoxTag).performTouchInput {
             this.swipe(
                 start = this.center,
@@ -120,17 +116,13 @@
                 durationMillis = 100
             )
         }
-        rule.runOnIdle {
-            assertThat(total).isLessThan(0.01f)
-        }
+        rule.runOnIdle { assertThat(total).isLessThan(0.01f) }
     }
 
     @Test
     fun draggable_verticalDrag() {
         var total = 0f
-        setDraggableContent {
-            Modifier.draggable(Orientation.Vertical) { total += it }
-        }
+        setDraggableContent { Modifier.draggable(Orientation.Vertical) { total += it } }
         rule.onNodeWithTag(draggableBoxTag).performTouchInput {
             this.swipe(
                 start = this.center,
@@ -138,10 +130,11 @@
                 durationMillis = 100
             )
         }
-        val lastTotal = rule.runOnIdle {
-            assertThat(total).isGreaterThan(0)
-            total
-        }
+        val lastTotal =
+            rule.runOnIdle {
+                assertThat(total).isGreaterThan(0)
+                total
+            }
         rule.onNodeWithTag(draggableBoxTag).performTouchInput {
             this.swipe(
                 start = this.center,
@@ -149,9 +142,7 @@
                 durationMillis = 100
             )
         }
-        rule.runOnIdle {
-            assertThat(total).isEqualTo(lastTotal)
-        }
+        rule.runOnIdle { assertThat(total).isEqualTo(lastTotal) }
         rule.onNodeWithTag(draggableBoxTag).performTouchInput {
             this.swipe(
                 start = this.center,
@@ -159,18 +150,14 @@
                 durationMillis = 100
             )
         }
-        rule.runOnIdle {
-            assertThat(total).isLessThan(0.01f)
-        }
+        rule.runOnIdle { assertThat(total).isLessThan(0.01f) }
     }
 
     @Test
     @Ignore("b/303237627")
     fun draggable_verticalDrag_newState() {
         var total = 0f
-        setDraggableContent {
-            Modifier.draggable(Orientation.Vertical) { total += it }
-        }
+        setDraggableContent { Modifier.draggable(Orientation.Vertical) { total += it } }
         rule.onNodeWithTag(draggableBoxTag).performTouchInput {
             this.swipe(
                 start = this.center,
@@ -178,10 +165,11 @@
                 durationMillis = 100
             )
         }
-        val lastTotal = rule.runOnIdle {
-            assertThat(total).isGreaterThan(0)
-            total
-        }
+        val lastTotal =
+            rule.runOnIdle {
+                assertThat(total).isGreaterThan(0)
+                total
+            }
         rule.onNodeWithTag(draggableBoxTag).performTouchInput {
             this.swipe(
                 start = this.center,
@@ -189,9 +177,7 @@
                 durationMillis = 100
             )
         }
-        rule.runOnIdle {
-            assertThat(total).isEqualTo(lastTotal)
-        }
+        rule.runOnIdle { assertThat(total).isEqualTo(lastTotal) }
         rule.onNodeWithTag(draggableBoxTag).performTouchInput {
             this.swipe(
                 start = this.center,
@@ -199,9 +185,7 @@
                 durationMillis = 100
             )
         }
-        rule.runOnIdle {
-            assertThat(total).isLessThan(0.01f)
-        }
+        rule.runOnIdle { assertThat(total).isLessThan(0.01f) }
     }
 
     @Test
@@ -237,10 +221,21 @@
         var total = 0f
         val enabled = mutableStateOf(true)
         setDraggableContent {
-            Modifier.draggable(Orientation.Horizontal, enabled = enabled.value) {
-                total += it
+            Modifier.draggable(Orientation.Horizontal, enabled = enabled.value) { total += it }
+        }
+        rule.onNodeWithTag(draggableBoxTag).performTouchInput {
+            this.swipe(
+                start = this.center,
+                end = Offset(this.center.x + 100f, this.center.y),
+                durationMillis = 100
+            )
+        }
+        val prevTotal =
+            rule.runOnIdle {
+                assertThat(total).isGreaterThan(0f)
+                enabled.value = false
+                total
             }
-        }
         rule.onNodeWithTag(draggableBoxTag).performTouchInput {
             this.swipe(
                 start = this.center,
@@ -248,21 +243,7 @@
                 durationMillis = 100
             )
         }
-        val prevTotal = rule.runOnIdle {
-            assertThat(total).isGreaterThan(0f)
-            enabled.value = false
-            total
-        }
-        rule.onNodeWithTag(draggableBoxTag).performTouchInput {
-            this.swipe(
-                start = this.center,
-                end = Offset(this.center.x + 100f, this.center.y),
-                durationMillis = 100
-            )
-        }
-        rule.runOnIdle {
-            assertThat(total).isEqualTo(prevTotal)
-        }
+        rule.runOnIdle { assertThat(total).isEqualTo(prevTotal) }
     }
 
     @Test
@@ -271,9 +252,7 @@
         setDraggableContent {
             Modifier.draggable(
                 Orientation.Horizontal,
-                onDragStopped = {
-                    velocityTriggered = it
-                }
+                onDragStopped = { velocityTriggered = it }
             ) {}
         }
         rule.onNodeWithTag(draggableBoxTag).performTouchInput {
@@ -282,21 +261,16 @@
                 end = Offset(this.center.x + 100f, this.center.y),
                 endVelocity = 112f,
                 durationMillis = 100
-
             )
         }
-        rule.runOnIdle {
-            assertThat(velocityTriggered - 112f).isLessThan(0.1f)
-        }
+        rule.runOnIdle { assertThat(velocityTriggered - 112f).isLessThan(0.1f) }
     }
 
     @Test
     fun draggable_startWithoutSlop_ifAnimating() {
         var total = 0f
         setDraggableContent {
-            Modifier.draggable(Orientation.Horizontal, startDragImmediately = true) {
-                total += it
-            }
+            Modifier.draggable(Orientation.Horizontal, startDragImmediately = true) { total += it }
         }
         rule.onNodeWithTag(draggableBoxTag).performTouchInput {
             this.swipe(
@@ -322,7 +296,9 @@
                     Orientation.Horizontal,
                     onDragStopped = { dragStopped += 1 },
                     startDragImmediately = true
-                ) { total += it }
+                ) {
+                    total += it
+                }
             } else Modifier
         }
         rule.onNodeWithTag(draggableBoxTag).performTouchInput {
@@ -348,26 +324,20 @@
                 onDragStopped = { dragStopped += 1 },
                 onDragStarted = { dragStarted += 1 },
                 startDragImmediately = true
-            ) { total += it }
+            ) {
+                total += it
+            }
         }
-        rule.onNodeWithTag(draggableBoxTag).performMouseInput {
-            this.press()
-        }
-        rule.runOnIdle {
-            assertThat(dragStarted).isEqualTo(1f)
-        }
-        rule.onNodeWithTag(draggableBoxTag).performMouseInput {
-            this.release()
-        }
-        rule.runOnIdle {
-            assertThat(dragStopped).isEqualTo(1f)
-        }
+        rule.onNodeWithTag(draggableBoxTag).performMouseInput { this.press() }
+        rule.runOnIdle { assertThat(dragStarted).isEqualTo(1f) }
+        rule.onNodeWithTag(draggableBoxTag).performMouseInput { this.release() }
+        rule.runOnIdle { assertThat(dragStopped).isEqualTo(1f) }
     }
 
     @Test
     fun draggable_callsDragStop_whenNewState() {
         var dragStopped = 0f
-        val state = mutableStateOf(DraggableState { })
+        val state = mutableStateOf(DraggableState {})
         setDraggableContent {
             Modifier.draggable(
                 orientation = Orientation.Horizontal,
@@ -383,9 +353,7 @@
             assertThat(dragStopped).isEqualTo(0f)
             state.value = DraggableState { /* do nothing */ }
         }
-        rule.runOnIdle {
-            assertThat(dragStopped).isEqualTo(1f)
-        }
+        rule.runOnIdle { assertThat(dragStopped).isEqualTo(1f) }
     }
 
     @Test
@@ -407,9 +375,7 @@
             assertThat(dragStopped).isEqualTo(0f)
             orientation = Orientation.Vertical
         }
-        rule.runOnIdle {
-            assertThat(dragStopped).isEqualTo(1f)
-        }
+        rule.runOnIdle { assertThat(dragStopped).isEqualTo(1f) }
     }
 
     @Test
@@ -432,9 +398,7 @@
             assertThat(dragStopped).isEqualTo(0f)
             enabled = false
         }
-        rule.runOnIdle {
-            assertThat(dragStopped).isEqualTo(1f)
-        }
+        rule.runOnIdle { assertThat(dragStopped).isEqualTo(1f) }
     }
 
     @Test
@@ -457,9 +421,7 @@
             assertThat(dragStopped).isEqualTo(0f)
             reverseDirection = true
         }
-        rule.runOnIdle {
-            assertThat(dragStopped).isEqualTo(1f)
-        }
+        rule.runOnIdle { assertThat(dragStopped).isEqualTo(1f) }
     }
 
     @Test
@@ -490,9 +452,7 @@
             moveBy(Offset(delta, 0f))
             up()
         }
-        rule.runOnIdle {
-            assertThat(total).isEqualTo(delta)
-        }
+        rule.runOnIdle { assertThat(total).isEqualTo(delta) }
     }
 
     @Test
@@ -551,9 +511,7 @@
             assertThat(onDragStopped2Calls).isEqualTo(0)
             onDragStopped = { onDragStopped2Calls += 1 }
         }
-        rule.onNodeWithTag(draggableBoxTag).performTouchInput {
-            up()
-        }
+        rule.onNodeWithTag(draggableBoxTag).performTouchInput { up() }
         rule.runOnIdle {
             // We changed the lambda before we ever stopped dragging, so only the new one should be
             // called
@@ -567,9 +525,7 @@
     fun draggable_resumesNormally_whenInterruptedWithHigherPriority() = runBlocking {
         var total = 0f
         var dragStopped = 0f
-        val state = DraggableState {
-            total += it
-        }
+        val state = DraggableState { total += it }
         setDraggableContent {
             if (total < 20f) {
                 Modifier.draggable(
@@ -583,14 +539,13 @@
             down(center)
             moveBy(Offset(100f, 100f))
         }
-        val prevTotal = rule.runOnIdle {
-            assertThat(dragStopped).isEqualTo(0f)
-            assertThat(total).isGreaterThan(0f)
-            total
-        }
-        state.drag(MutatePriority.PreventUserInput) {
-            dragBy(123f)
-        }
+        val prevTotal =
+            rule.runOnIdle {
+                assertThat(dragStopped).isEqualTo(0f)
+                assertThat(total).isGreaterThan(0f)
+                total
+            }
+        state.drag(MutatePriority.PreventUserInput) { dragBy(123f) }
         rule.runOnIdle {
             assertThat(total).isEqualTo(prevTotal + 123f)
             assertThat(dragStopped).isEqualTo(1f)
@@ -601,9 +556,7 @@
             moveBy(Offset(100f, 100f))
             up()
         }
-        rule.runOnIdle {
-            assertThat(total).isGreaterThan(prevTotal + 123f)
-        }
+        rule.runOnIdle { assertThat(total).isGreaterThan(prevTotal + 123f) }
     }
 
     @Test
@@ -614,17 +567,16 @@
             Box {
                 Box(
                     contentAlignment = Alignment.Center,
-                    modifier = Modifier
-                        .testTag(draggableBoxTag)
-                        .size(300.dp)
-                        .draggable(Orientation.Horizontal) {
+                    modifier =
+                        Modifier.testTag(draggableBoxTag).size(300.dp).draggable(
+                            Orientation.Horizontal
+                        ) {
                             outerDrag += it
                         }
                 ) {
                     Box(
-                        modifier = Modifier
-                            .size(300.dp)
-                            .draggable(Orientation.Horizontal) { delta ->
+                        modifier =
+                            Modifier.size(300.dp).draggable(Orientation.Horizontal) { delta ->
                                 innerDrag += delta / 2
                             }
                     )
@@ -653,44 +605,32 @@
 
         setDraggableContent {
             scope = rememberCoroutineScope()
-            Modifier.draggable(
-                Orientation.Horizontal,
-                interactionSource = interactionSource
-            ) {}
+            Modifier.draggable(Orientation.Horizontal, interactionSource = interactionSource) {}
         }
 
         val interactions = mutableListOf<Interaction>()
 
-        scope!!.launch {
-            interactionSource.interactions.collect { interactions.add(it) }
-        }
+        scope!!.launch { interactionSource.interactions.collect { interactions.add(it) } }
 
-        rule.runOnIdle {
-            assertThat(interactions).isEmpty()
-        }
+        rule.runOnIdle { assertThat(interactions).isEmpty() }
 
-        rule.onNodeWithTag(draggableBoxTag)
-            .performTouchInput {
-                down(Offset(visibleSize.width / 4f, visibleSize.height / 2f))
-                moveBy(Offset(visibleSize.width / 2f, 0f))
-            }
+        rule.onNodeWithTag(draggableBoxTag).performTouchInput {
+            down(Offset(visibleSize.width / 4f, visibleSize.height / 2f))
+            moveBy(Offset(visibleSize.width / 2f, 0f))
+        }
 
         rule.runOnIdle {
             assertThat(interactions).hasSize(1)
             assertThat(interactions.first()).isInstanceOf(DragInteraction.Start::class.java)
         }
 
-        rule.onNodeWithTag(draggableBoxTag)
-            .performTouchInput {
-                up()
-            }
+        rule.onNodeWithTag(draggableBoxTag).performTouchInput { up() }
 
         rule.runOnIdle {
             assertThat(interactions).hasSize(2)
             assertThat(interactions.first()).isInstanceOf(DragInteraction.Start::class.java)
             assertThat(interactions[1]).isInstanceOf(DragInteraction.Stop::class.java)
-            assertThat((interactions[1] as DragInteraction.Stop).start)
-                .isEqualTo(interactions[0])
+            assertThat((interactions[1] as DragInteraction.Stop).start).isEqualTo(interactions[0])
         }
     }
 
@@ -706,10 +646,8 @@
             Box {
                 if (emitDraggableBox) {
                     Box(
-                        modifier = Modifier
-                            .testTag(draggableBoxTag)
-                            .size(100.dp)
-                            .draggable(
+                        modifier =
+                            Modifier.testTag(draggableBoxTag).size(100.dp).draggable(
                                 orientation = Orientation.Horizontal,
                                 interactionSource = interactionSource
                             ) {}
@@ -720,19 +658,14 @@
 
         val interactions = mutableListOf<Interaction>()
 
-        scope!!.launch {
-            interactionSource.interactions.collect { interactions.add(it) }
-        }
+        scope!!.launch { interactionSource.interactions.collect { interactions.add(it) } }
 
-        rule.runOnIdle {
-            assertThat(interactions).isEmpty()
-        }
+        rule.runOnIdle { assertThat(interactions).isEmpty() }
 
-        rule.onNodeWithTag(draggableBoxTag)
-            .performTouchInput {
-                down(Offset(visibleSize.width / 4f, visibleSize.height / 2f))
-                moveBy(Offset(visibleSize.width / 2f, 0f))
-            }
+        rule.onNodeWithTag(draggableBoxTag).performTouchInput {
+            down(Offset(visibleSize.width / 4f, visibleSize.height / 2f))
+            moveBy(Offset(visibleSize.width / 2f, 0f))
+        }
 
         rule.runOnIdle {
             assertThat(interactions).hasSize(1)
@@ -740,16 +673,13 @@
         }
 
         // Dispose draggable
-        rule.runOnIdle {
-            emitDraggableBox = false
-        }
+        rule.runOnIdle { emitDraggableBox = false }
 
         rule.runOnIdle {
             assertThat(interactions).hasSize(2)
             assertThat(interactions.first()).isInstanceOf(DragInteraction.Start::class.java)
             assertThat(interactions[1]).isInstanceOf(DragInteraction.Cancel::class.java)
-            assertThat((interactions[1] as DragInteraction.Cancel).start)
-                .isEqualTo(interactions[0])
+            assertThat((interactions[1] as DragInteraction.Cancel).start).isEqualTo(interactions[0])
         }
     }
 
@@ -771,35 +701,27 @@
 
         val interactions = mutableListOf<Interaction>()
 
-        scope!!.launch {
-            interactionSource.interactions.collect { interactions.add(it) }
-        }
+        scope!!.launch { interactionSource.interactions.collect { interactions.add(it) } }
 
-        rule.runOnIdle {
-            assertThat(interactions).isEmpty()
-        }
+        rule.runOnIdle { assertThat(interactions).isEmpty() }
 
-        rule.onNodeWithTag(draggableBoxTag)
-            .performTouchInput {
-                down(Offset(visibleSize.width / 4f, visibleSize.height / 2f))
-                moveBy(Offset(visibleSize.width / 2f, 0f))
-            }
+        rule.onNodeWithTag(draggableBoxTag).performTouchInput {
+            down(Offset(visibleSize.width / 4f, visibleSize.height / 2f))
+            moveBy(Offset(visibleSize.width / 2f, 0f))
+        }
 
         rule.runOnIdle {
             assertThat(interactions).hasSize(1)
             assertThat(interactions.first()).isInstanceOf(DragInteraction.Start::class.java)
         }
 
-        rule.runOnIdle {
-            enabledState.value = false
-        }
+        rule.runOnIdle { enabledState.value = false }
 
         rule.runOnIdle {
             assertThat(interactions).hasSize(2)
             assertThat(interactions.first()).isInstanceOf(DragInteraction.Start::class.java)
             assertThat(interactions[1]).isInstanceOf(DragInteraction.Cancel::class.java)
-            assertThat((interactions[1] as DragInteraction.Cancel).start)
-                .isEqualTo(interactions[0])
+            assertThat((interactions[1] as DragInteraction.Cancel).start).isEqualTo(interactions[0])
         }
     }
 
@@ -810,18 +732,22 @@
 
         rule.setContent {
             val viewConfig = LocalViewConfiguration.current
-            val newConfig = object : ViewConfiguration by viewConfig {
-                override val maximumFlingVelocity: Float get() = maxVelocity
-            }
+            val newConfig =
+                object : ViewConfiguration by viewConfig {
+                    override val maximumFlingVelocity: Float
+                        get() = maxVelocity
+                }
             CompositionLocalProvider(LocalViewConfiguration provides newConfig) {
                 Box {
                     Box(
-                        modifier = Modifier
-                            .testTag(draggableBoxTag)
-                            .size(100.dp)
-                            .draggable(orientation = Orientation.Horizontal, onDragStopped = {
-                                latestVelocity = it
-                            }, onDrag = {})
+                        modifier =
+                            Modifier.testTag(draggableBoxTag)
+                                .size(100.dp)
+                                .draggable(
+                                    orientation = Orientation.Horizontal,
+                                    onDragStopped = { latestVelocity = it },
+                                    onDrag = {}
+                                )
                     )
                 }
             }
@@ -834,9 +760,7 @@
                 endVelocity = 2000f
             )
         }
-        rule.runOnIdle {
-            assertThat(latestVelocity).isEqualTo(maxVelocity)
-        }
+        rule.runOnIdle { assertThat(latestVelocity).isEqualTo(maxVelocity) }
     }
 
     @Test
@@ -858,20 +782,17 @@
         val interactions1 = mutableListOf<Interaction>()
         val interactions2 = mutableListOf<Interaction>()
 
-        scope!!.launch {
-            interactionSource1.interactions.collect { interactions1.add(it) }
-        }
+        scope!!.launch { interactionSource1.interactions.collect { interactions1.add(it) } }
 
         rule.runOnIdle {
             assertThat(interactions1).isEmpty()
             assertThat(interactions2).isEmpty()
         }
 
-        rule.onNodeWithTag(draggableBoxTag)
-            .performTouchInput {
-                down(Offset(visibleSize.width / 4f, visibleSize.height / 2f))
-                moveBy(Offset(visibleSize.width / 2f, 0f))
-            }
+        rule.onNodeWithTag(draggableBoxTag).performTouchInput {
+            down(Offset(visibleSize.width / 4f, visibleSize.height / 2f))
+            moveBy(Offset(visibleSize.width / 2f, 0f))
+        }
 
         rule.runOnIdle {
             assertThat(interactions1).hasSize(1)
@@ -879,9 +800,7 @@
             assertThat(interactions2).isEmpty()
         }
 
-        rule.runOnIdle {
-            interactionSourceState.value = interactionSource2
-        }
+        rule.runOnIdle { interactionSourceState.value = interactionSource2 }
 
         rule.runOnIdle {
             assertThat(interactions1).hasSize(2)
@@ -900,9 +819,7 @@
     fun draggable_cancelMidDown_shouldContinueWithNextDown() {
         var total = 0f
 
-        setDraggableContent {
-            Modifier.draggable(Orientation.Horizontal) { total += it }
-        }
+        setDraggableContent { Modifier.draggable(Orientation.Horizontal) { total += it } }
 
         rule.onNodeWithTag(draggableBoxTag).performMouseInput {
             enter()
@@ -935,14 +852,11 @@
         val delta = -10f
         var flingVelocity = Float.NaN
         setDraggableContent {
-            Modifier
-                .draggable(
-                    state = rememberDraggableState { },
-                    orientation = Orientation.Vertical,
-                    onDragStopped = { velocity ->
-                        flingVelocity = velocity
-                    }
-                )
+            Modifier.draggable(
+                state = rememberDraggableState {},
+                orientation = Orientation.Vertical,
+                onDragStopped = { velocity -> flingVelocity = velocity }
+            )
         }
 
         // Drag, stop and release. The resulting velocity should be zero because we lost the
@@ -950,16 +864,12 @@
         rule.onNodeWithTag(draggableBoxTag).performTouchInput {
             down(center)
             // generate various move events
-            repeat(30) {
-                moveBy(Offset(0f, delta), delayMillis = 16L)
-            }
+            repeat(30) { moveBy(Offset(0f, delta), delayMillis = 16L) }
             // stop for a moment
             advanceEventTime(3000L)
             up()
         }
-        rule.runOnIdle {
-            Assert.assertEquals(0f, flingVelocity)
-        }
+        rule.runOnIdle { Assert.assertEquals(0f, flingVelocity) }
     }
 
     @Test
@@ -968,17 +878,17 @@
         lateinit var runningJob: Job
         rule.setContent {
             Box(
-                modifier = Modifier
-                    .testTag(draggableBoxTag)
-                    .size(100.dp)
-                    .draggable(
-                        enabled = enabled.value,
-                        state = rememberDraggableState { },
-                        orientation = Orientation.Vertical,
-                        onDragStopped = { _ ->
-                            runningJob = launch { delay(10_000L) } // long running operation
-                        }
-                    )
+                modifier =
+                    Modifier.testTag(draggableBoxTag)
+                        .size(100.dp)
+                        .draggable(
+                            enabled = enabled.value,
+                            state = rememberDraggableState {},
+                            orientation = Orientation.Vertical,
+                            onDragStopped = { _ ->
+                                runningJob = launch { delay(10_000L) } // long running operation
+                            }
+                        )
             )
         }
 
@@ -1003,18 +913,16 @@
         var downEventPosition = Offset.Unspecified
         rule.setContent {
             Box(
-                modifier = Modifier
-                    .testTag(draggableBoxTag)
-                    .size(100.dp)
-                    .draggable(
-                        enabled = true,
-                        state = rememberDraggableState { },
-                        orientation = Orientation.Vertical,
-                        onDragStarted = { offset ->
-                            onDragStartedOffset = offset
-                        },
-                        startDragImmediately = true
-                    )
+                modifier =
+                    Modifier.testTag(draggableBoxTag)
+                        .size(100.dp)
+                        .draggable(
+                            enabled = true,
+                            state = rememberDraggableState {},
+                            orientation = Orientation.Vertical,
+                            onDragStarted = { offset -> onDragStartedOffset = offset },
+                            startDragImmediately = true
+                        )
             )
         }
 
@@ -1025,9 +933,7 @@
             up()
         }
 
-        rule.runOnIdle {
-            assertEquals(downEventPosition, onDragStartedOffset)
-        }
+        rule.runOnIdle { assertEquals(downEventPosition, onDragStartedOffset) }
     }
 
     @Test
@@ -1039,18 +945,16 @@
             touchSlop = LocalViewConfiguration.current.touchSlop
 
             Box(
-                modifier = Modifier
-                    .testTag(draggableBoxTag)
-                    .size(100.dp)
-                    .draggable(
-                        enabled = true,
-                        state = rememberDraggableState { },
-                        orientation = Orientation.Vertical,
-                        onDragStarted = { offset ->
-                            onDragStartedOffset = offset
-                        },
-                        startDragImmediately = false
-                    )
+                modifier =
+                    Modifier.testTag(draggableBoxTag)
+                        .size(100.dp)
+                        .draggable(
+                            enabled = true,
+                            state = rememberDraggableState {},
+                            orientation = Orientation.Vertical,
+                            onDragStarted = { offset -> onDragStartedOffset = offset },
+                            startDragImmediately = false
+                        )
             )
         }
 
@@ -1061,9 +965,7 @@
             up()
         }
 
-        rule.runOnIdle {
-            assertEquals(downEventPosition.y + touchSlop, onDragStartedOffset.y)
-        }
+        rule.runOnIdle { assertEquals(downEventPosition.y + touchSlop, onDragStartedOffset.y) }
     }
 
     @Test
@@ -1075,18 +977,16 @@
             touchSlop = LocalViewConfiguration.current.touchSlop
 
             Box(
-                modifier = Modifier
-                    .testTag(draggableBoxTag)
-                    .size(100.dp)
-                    .draggable(
-                        enabled = true,
-                        state = rememberDraggableState { },
-                        orientation = Orientation.Horizontal,
-                        onDragStarted = { offset ->
-                            onDragStartedOffset = offset
-                        },
-                        startDragImmediately = false
-                    )
+                modifier =
+                    Modifier.testTag(draggableBoxTag)
+                        .size(100.dp)
+                        .draggable(
+                            enabled = true,
+                            state = rememberDraggableState {},
+                            orientation = Orientation.Horizontal,
+                            onDragStarted = { offset -> onDragStartedOffset = offset },
+                            startDragImmediately = false
+                        )
             )
         }
 
@@ -1097,36 +997,36 @@
             up()
         }
 
-        rule.runOnIdle {
-            assertEquals(downEventPosition.x + touchSlop, onDragStartedOffset.x)
-        }
+        rule.runOnIdle { assertEquals(downEventPosition.x + touchSlop, onDragStartedOffset.x) }
     }
 
     @Test
     fun testInspectableValue() {
         rule.setContent {
-            val modifier = Modifier.draggable(
-                orientation = Orientation.Horizontal,
-                state = rememberDraggableState { }
-            ) as InspectableValue
+            val modifier =
+                Modifier.draggable(
+                    orientation = Orientation.Horizontal,
+                    state = rememberDraggableState {}
+                ) as InspectableValue
             assertThat(modifier.nameFallback).isEqualTo("draggable")
             assertThat(modifier.valueOverride).isNull()
-            assertThat(modifier.inspectableElements.map { it.name }.asIterable()).containsExactly(
-                "orientation",
-                "enabled",
-                "reverseDirection",
-                "interactionSource",
-                "startDragImmediately",
-                "onDragStarted",
-                "onDragStopped",
-                "state",
-            )
+            assertThat(modifier.inspectableElements.map { it.name }.asIterable())
+                .containsExactly(
+                    "orientation",
+                    "enabled",
+                    "reverseDirection",
+                    "interactionSource",
+                    "startDragImmediately",
+                    "onDragStarted",
+                    "onDragStopped",
+                    "state",
+                )
         }
     }
 
     @Test
     fun equalInputs_shouldResolveToEquals() {
-        val state = DraggableState { }
+        val state = DraggableState {}
 
         assertModifierIsPure { toggleInput ->
             if (toggleInput) {
@@ -1141,12 +1041,7 @@
         rule.setContent {
             Box {
                 val draggable = draggableFactory()
-                Box(
-                    modifier = Modifier
-                        .testTag(draggableBoxTag)
-                        .size(100.dp)
-                        .then(draggable)
-                )
+                Box(modifier = Modifier.testTag(draggableBoxTag).size(100.dp).then(draggable))
             }
         }
     }
diff --git a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/FocusGroupTest.kt b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/FocusGroupTest.kt
index c3a3610..32874d65 100644
--- a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/FocusGroupTest.kt
+++ b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/FocusGroupTest.kt
@@ -48,8 +48,7 @@
 @MediumTest
 @RunWith(AndroidJUnit4::class)
 class FocusGroupTest {
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
     private val initialFocus = FocusRequester()
     private lateinit var focusManager: FocusManager
@@ -61,8 +60,7 @@
         var isFocused = false
         rule.setContent {
             Box(
-                Modifier
-                    .focusRequester(focusRequester)
+                Modifier.focusRequester(focusRequester)
                     .onFocusChanged { isFocused = it.isFocused }
                     .focusGroup()
             ) {
@@ -84,8 +82,7 @@
         var isFocused = false
         rule.setContent {
             Box(
-                Modifier
-                    .focusRequester(focusRequester)
+                Modifier.focusRequester(focusRequester)
                     .onFocusChanged { isFocused = it.isFocused }
                     .focusGroup()
             ) {
@@ -107,8 +104,7 @@
         var isFocused = false
         rule.setContent {
             Box(
-                Modifier
-                    .focusRequester(focusRequester)
+                Modifier.focusRequester(focusRequester)
                     .onFocusChanged { isFocused = it.isFocused }
                     .focusProperties { canFocus = true }
                     .focusGroup()
@@ -132,8 +128,7 @@
         var internalIsFocused = false
         rule.setContent {
             BoxWithFocusGroup(
-                Modifier
-                    .focusRequester(focusRequester)
+                Modifier.focusRequester(focusRequester)
                     .onFocusChanged { isFocused = it.isFocused }
                     .focusable()
                     .onFocusChanged { internalIsFocused = it.isFocused }
@@ -211,8 +206,7 @@
                     Box(Modifier.focusRequester(initialFocus).focusable())
                 }
                 Column(
-                    Modifier
-                        .onFocusChanged { expectedFocus = it }
+                    Modifier.onFocusChanged { expectedFocus = it }
                         .focusProperties { canFocus = true }
                         .focusGroup()
                 ) {
@@ -259,22 +253,16 @@
         lateinit var expectedFocus: FocusState
         rule.setContentWithInitialFocus {
             Box(
-                Modifier
-                    .focusRequester(initialFocus)
+                Modifier.focusRequester(initialFocus)
                     .focusProperties { canFocus = true }
                     .focusGroup()
             ) {
-                Box(
-                    Modifier
-                        .onFocusChanged { expectedFocus = it }
-                        .focusable()
-                )
+                Box(Modifier.onFocusChanged { expectedFocus = it }.focusable())
             }
         }
 
         // Act.
-        @OptIn(ExperimentalComposeUiApi::class)
-        rule.runOnIdle { focusManager.moveFocus(Enter) }
+        @OptIn(ExperimentalComposeUiApi::class) rule.runOnIdle { focusManager.moveFocus(Enter) }
 
         // Assert.
         rule.runOnIdle { assertThat(expectedFocus.isFocused).isTrue() }
@@ -286,22 +274,16 @@
         lateinit var expectedFocus: FocusState
         rule.setContentWithInitialFocus {
             Box(
-                Modifier
-                    .onFocusChanged { expectedFocus = it }
+                Modifier.onFocusChanged { expectedFocus = it }
                     .focusProperties { canFocus = true }
                     .focusGroup()
             ) {
-                Box(
-                    Modifier
-                        .focusRequester(initialFocus)
-                        .focusable()
-                )
+                Box(Modifier.focusRequester(initialFocus).focusable())
             }
         }
 
         // Act.
-        @OptIn(ExperimentalComposeUiApi::class)
-        rule.runOnIdle { focusManager.moveFocus(Exit) }
+        @OptIn(ExperimentalComposeUiApi::class) rule.runOnIdle { focusManager.moveFocus(Exit) }
 
         // Assert.
         rule.runOnIdle { assertThat(expectedFocus.isFocused).isTrue() }
@@ -342,8 +324,7 @@
                     Box(Modifier.focusable())
                 }
                 Column(
-                    Modifier
-                        .onFocusChanged { expectedFocus = it }
+                    Modifier.onFocusChanged { expectedFocus = it }
                         .focusProperties { canFocus = true }
                         .focusGroup()
                 ) {
@@ -367,16 +348,14 @@
         rule.setContentWithInitialFocus {
             Row {
                 Column(
-                    Modifier
-                        .focusRequester(initialFocus)
+                    Modifier.focusRequester(initialFocus)
                         .focusProperties { canFocus = true }
                         .focusGroup()
                 ) {
                     Box(Modifier.focusable())
                 }
                 Column(
-                    Modifier
-                        .onFocusChanged { expectedFocus = it }
+                    Modifier.onFocusChanged { expectedFocus = it }
                         .focusProperties { canFocus = true }
                         .focusGroup()
                 ) {
@@ -401,17 +380,12 @@
         lateinit var expectedFocus: FocusState
         rule.setContentWithInitialFocus {
             Row {
-                Column(
-                    Modifier
-                        .focusProperties { canFocus = true }
-                        .focusGroup()
-                ) {
+                Column(Modifier.focusProperties { canFocus = true }.focusGroup()) {
                     Box(Modifier.focusRequester(initialFocus).focusable())
                     Box(Modifier.focusable())
                 }
                 Column(
-                    Modifier
-                        .onFocusChanged { expectedFocus = it }
+                    Modifier.onFocusChanged { expectedFocus = it }
                         .focusProperties { canFocus = true }
                         .focusGroup()
                 ) {
@@ -438,14 +412,8 @@
     // Using this helper function because both initial focus (From Android) and focus search need
     // the items to have a non-zero size.
     @Composable
-    private fun Box(
-        modifier: Modifier = Modifier,
-        content: @Composable BoxScope.() -> Unit = {}
-    ) {
-        androidx.compose.foundation.layout.Box(
-            modifier = modifier.size(10.dp),
-            content = content
-        )
+    private fun Box(modifier: Modifier = Modifier, content: @Composable BoxScope.() -> Unit = {}) {
+        androidx.compose.foundation.layout.Box(modifier = modifier.size(10.dp), content = content)
     }
 
     @Suppress("NOTHING_TO_INLINE")
@@ -454,7 +422,6 @@
         modifier: Modifier = Modifier,
         noinline content: @Composable BoxScope.() -> Unit = {}
     ) {
-        @OptIn(ExperimentalFoundationApi::class)
-        Box(modifier.focusGroup(), content)
+        @OptIn(ExperimentalFoundationApi::class) Box(modifier.focusGroup(), content)
     }
 }
diff --git a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/FocusableBoundsTest.kt b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/FocusableBoundsTest.kt
index 0490fb6..eb70838 100644
--- a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/FocusableBoundsTest.kt
+++ b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/FocusableBoundsTest.kt
@@ -50,8 +50,7 @@
 @RunWith(AndroidJUnit4::class)
 class FocusableBoundsTest {
 
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
     private lateinit var parentCoordinates: LayoutCoordinates
     private val focusedBounds = mutableListOf<Rect?>()
@@ -64,8 +63,7 @@
         val focusRequester = FocusRequester()
         rule.setContent {
             Box(
-                Modifier
-                    .onGloballyPositioned { parentCoordinates = it }
+                Modifier.onGloballyPositioned { parentCoordinates = it }
                     .onFocusedBoundsChanged { childCoordinates ->
                         focusedBounds +=
                             childCoordinates?.let { parentCoordinates.localBoundingBoxOf(it) }
@@ -82,9 +80,7 @@
             focusRequester.requestFocus()
         }
 
-        rule.runOnIdle {
-            assertThat(focusedBounds).containsExactly(Rect(0f, 0f, size, size))
-        }
+        rule.runOnIdle { assertThat(focusedBounds).containsExactly(Rect(0f, 0f, size, size)) }
     }
 
     @Ignore // b/278258427
@@ -93,23 +89,20 @@
         val (focusRequester1, focusRequester2) = FocusRequester.createRefs()
         rule.setContent {
             Column(
-                Modifier
-                    .onGloballyPositioned { parentCoordinates = it }
+                Modifier.onGloballyPositioned { parentCoordinates = it }
                     .onFocusedBoundsChanged { childCoordinates ->
                         focusedBounds +=
                             childCoordinates?.let { parentCoordinates.localBoundingBoxOf(it) }
                     }
             ) {
                 Box(
-                    Modifier
-                        .focusRequester(focusRequester1)
+                    Modifier.focusRequester(focusRequester1)
                         .focusable()
                         // Needs a size to participate in layout.
                         .size(sizeDp)
                 )
                 Box(
-                    Modifier
-                        .focusRequester(focusRequester2)
+                    Modifier.focusRequester(focusRequester2)
                         .focusable()
                         // Needs a size to participate in layout.
                         .size(sizeDp)
@@ -117,20 +110,18 @@
             }
         }
 
-        rule.runOnIdle {
-            focusRequester1.requestFocus()
-        }
-        rule.runOnIdle {
-            focusRequester2.requestFocus()
-        }
+        rule.runOnIdle { focusRequester1.requestFocus() }
+        rule.runOnIdle { focusRequester2.requestFocus() }
 
         rule.runOnIdle {
-            assertThat(focusedBounds).containsExactly(
-                Rect(0f, 0f, size, size),
-                // First child sends null when it loses focus before the second child gains it.
-                null,
-                Rect(0f, size, size, size * 2)
-            ).inOrder()
+            assertThat(focusedBounds)
+                .containsExactly(
+                    Rect(0f, 0f, size, size),
+                    // First child sends null when it loses focus before the second child gains it.
+                    null,
+                    Rect(0f, size, size, size * 2)
+                )
+                .inOrder()
         }
     }
 
@@ -142,8 +133,7 @@
 
         rule.setContent {
             Box(
-                Modifier
-                    .onGloballyPositioned { parentCoordinates = it }
+                Modifier.onGloballyPositioned { parentCoordinates = it }
                     .onFocusedBoundsChanged { childCoordinates ->
                         focusedBounds +=
                             childCoordinates?.let {
@@ -164,19 +154,17 @@
             }
         }
 
-        rule.runOnIdle {
-            focusRequester.requestFocus()
-        }
+        rule.runOnIdle { focusRequester.requestFocus() }
+
+        rule.runOnIdle { childOffset += IntOffset(1, 2) }
 
         rule.runOnIdle {
-            childOffset += IntOffset(1, 2)
-        }
-
-        rule.runOnIdle {
-            assertThat(focusedBounds).containsAtLeast(
-                Rect(Offset.Zero, Size(size, size)),
-                Rect(Offset(1f, 2f), Size(size, size))
-            ).inOrder()
+            assertThat(focusedBounds)
+                .containsAtLeast(
+                    Rect(Offset.Zero, Size(size, size)),
+                    Rect(Offset(1f, 2f), Size(size, size))
+                )
+                .inOrder()
         }
     }
 
@@ -186,8 +174,7 @@
         var includeFocusableModifier by mutableStateOf(false)
         rule.setContent {
             Box(
-                Modifier
-                    .onGloballyPositioned { parentCoordinates = it }
+                Modifier.onGloballyPositioned { parentCoordinates = it }
                     .onFocusedBoundsChanged { childCoordinates ->
                         focusedBounds +=
                             childCoordinates?.let { parentCoordinates.localBoundingBoxOf(it) }
@@ -198,17 +185,11 @@
                     .size(sizeDp)
             )
         }
-        rule.runOnIdle {
-            focusRequester.requestFocus()
-        }
+        rule.runOnIdle { focusRequester.requestFocus() }
 
-        rule.runOnIdle {
-            includeFocusableModifier = true
-        }
+        rule.runOnIdle { includeFocusableModifier = true }
 
-        rule.runOnIdle {
-            assertThat(focusedBounds).isEmpty()
-        }
+        rule.runOnIdle { assertThat(focusedBounds).isEmpty() }
     }
 
     @Ignore // b/278258427
@@ -218,8 +199,7 @@
         var includeFocusableModifier by mutableStateOf(true)
         rule.setContent {
             Box(
-                Modifier
-                    .onGloballyPositioned { parentCoordinates = it }
+                Modifier.onGloballyPositioned { parentCoordinates = it }
                     .onFocusedBoundsChanged { childCoordinates ->
                         focusedBounds +=
                             childCoordinates?.let { parentCoordinates.localBoundingBoxOf(it) }
@@ -230,19 +210,12 @@
                     .size(sizeDp)
             )
         }
-        rule.runOnIdle {
-            focusRequester.requestFocus()
-        }
+        rule.runOnIdle { focusRequester.requestFocus() }
+
+        rule.runOnIdle { includeFocusableModifier = false }
 
         rule.runOnIdle {
-            includeFocusableModifier = false
-        }
-
-        rule.runOnIdle {
-            assertThat(focusedBounds).containsExactly(
-                Rect(0f, 0f, size, size),
-                null
-            ).inOrder()
+            assertThat(focusedBounds).containsExactly(Rect(0f, 0f, size, size), null).inOrder()
         }
     }
 
@@ -253,8 +226,7 @@
         var focusableEnabled by mutableStateOf(true)
         rule.setContent {
             Box(
-                Modifier
-                    .onGloballyPositioned { parentCoordinates = it }
+                Modifier.onGloballyPositioned { parentCoordinates = it }
                     .onFocusedBoundsChanged { childCoordinates ->
                         focusedBounds +=
                             childCoordinates?.let { parentCoordinates.localBoundingBoxOf(it) }
@@ -266,19 +238,12 @@
             )
         }
 
-        rule.runOnIdle {
-            focusRequester.requestFocus()
-        }
+        rule.runOnIdle { focusRequester.requestFocus() }
+
+        rule.runOnIdle { focusableEnabled = false }
 
         rule.runOnIdle {
-            focusableEnabled = false
-        }
-
-        rule.runOnIdle {
-            assertThat(focusedBounds).containsExactly(
-                Rect(0f, 0f, size, size),
-                null
-            ).inOrder()
+            assertThat(focusedBounds).containsExactly(Rect(0f, 0f, size, size), null).inOrder()
         }
     }
 
@@ -290,8 +255,7 @@
         rule.setContent {
             focusManager = LocalFocusManager.current
             Box(
-                Modifier
-                    .onGloballyPositioned { parentCoordinates = it }
+                Modifier.onGloballyPositioned { parentCoordinates = it }
                     .onFocusedBoundsChanged { childCoordinates ->
                         focusedBounds +=
                             childCoordinates?.let { parentCoordinates.localBoundingBoxOf(it) }
@@ -303,18 +267,11 @@
             )
         }
 
-        rule.runOnIdle {
-            focusRequester.requestFocus()
-        }
-        rule.runOnIdle {
-            focusManager.clearFocus()
-        }
+        rule.runOnIdle { focusRequester.requestFocus() }
+        rule.runOnIdle { focusManager.clearFocus() }
 
         rule.runOnIdle {
-            assertThat(focusedBounds).containsExactly(
-                Rect(0f, 0f, size, size),
-                null
-            ).inOrder()
+            assertThat(focusedBounds).containsExactly(Rect(0f, 0f, size, size), null).inOrder()
         }
     }
 
@@ -325,8 +282,7 @@
         rule.setContent {
             Column {
                 Box(
-                    Modifier
-                        .onGloballyPositioned { parentCoordinates = it }
+                    Modifier.onGloballyPositioned { parentCoordinates = it }
                         .onFocusedBoundsChanged { childCoordinates ->
                             focusedBounds +=
                                 childCoordinates?.let { parentCoordinates.localBoundingBoxOf(it) }
@@ -337,8 +293,7 @@
                         .size(sizeDp)
                 )
                 Box(
-                    Modifier
-                        .focusRequester(focusRequester2)
+                    Modifier.focusRequester(focusRequester2)
                         .focusable()
                         // Needs a size to participate in layout.
                         .size(sizeDp)
@@ -346,18 +301,11 @@
             }
         }
 
-        rule.runOnIdle {
-            focusRequester1.requestFocus()
-        }
-        rule.runOnIdle {
-            focusRequester2.requestFocus()
-        }
+        rule.runOnIdle { focusRequester1.requestFocus() }
+        rule.runOnIdle { focusRequester2.requestFocus() }
 
         rule.runOnIdle {
-            assertThat(focusedBounds).containsExactly(
-                Rect(0f, 0f, size, size),
-                null
-            ).inOrder()
+            assertThat(focusedBounds).containsExactly(Rect(0f, 0f, size, size), null).inOrder()
         }
     }
 
@@ -369,19 +317,20 @@
 
         rule.setContent {
             Box(
-                Modifier
-                    .onGloballyPositioned { parentCoordinates = it }
+                Modifier.onGloballyPositioned { parentCoordinates = it }
                     .onFocusedBoundsChanged { childCoordinates ->
-                        focusedBounds += Pair(
-                            0,
-                            childCoordinates?.let { parentCoordinates.localBoundingBoxOf(it) }
-                        )
+                        focusedBounds +=
+                            Pair(
+                                0,
+                                childCoordinates?.let { parentCoordinates.localBoundingBoxOf(it) }
+                            )
                     }
                     .onFocusedBoundsChanged { childCoordinates ->
-                        focusedBounds += Pair(
-                            1,
-                            childCoordinates?.let { parentCoordinates.localBoundingBoxOf(it) }
-                        )
+                        focusedBounds +=
+                            Pair(
+                                1,
+                                childCoordinates?.let { parentCoordinates.localBoundingBoxOf(it) }
+                            )
                     }
                     .focusRequester(focusRequester)
                     .focusable()
@@ -390,15 +339,15 @@
             )
         }
 
-        rule.runOnIdle {
-            focusRequester.requestFocus()
-        }
+        rule.runOnIdle { focusRequester.requestFocus() }
 
         rule.runOnIdle {
-            assertThat(focusedBounds).containsExactly(
-                Pair(1, Rect(0f, 0f, size, size)),
-                Pair(0, Rect(0f, 0f, size, size)),
-            ).inOrder()
+            assertThat(focusedBounds)
+                .containsExactly(
+                    Pair(1, Rect(0f, 0f, size, size)),
+                    Pair(0, Rect(0f, 0f, size, size)),
+                )
+                .inOrder()
         }
     }
 
@@ -410,8 +359,7 @@
 
         rule.setContent {
             Box(
-                Modifier
-                    .onGloballyPositioned { parentCoordinates = it }
+                Modifier.onGloballyPositioned { parentCoordinates = it }
                     .then(
                         if (includeObserver) {
                             Modifier.onFocusedBoundsChanged { childCoordinates ->
@@ -429,9 +377,7 @@
             )
         }
 
-        rule.runOnIdle {
-            focusRequester.requestFocus()
-        }
+        rule.runOnIdle { focusRequester.requestFocus() }
 
         rule.runOnIdle {
             assertThat(focusedBounds).isEmpty()
@@ -439,9 +385,7 @@
         }
 
         rule.runOnIdle {
-            assertThat(focusedBounds).containsExactly(
-                Rect(0f, 0f, size, size)
-            ).inOrder()
+            assertThat(focusedBounds).containsExactly(Rect(0f, 0f, size, size)).inOrder()
         }
     }
 
@@ -454,27 +398,26 @@
 
         rule.setContent {
             Box(
-                Modifier
-                    .onGloballyPositioned { parentCoordinates = it }
+                Modifier.onGloballyPositioned { parentCoordinates = it }
                     .then(
                         if (includeSecondObserver) {
                             Modifier.onFocusedBoundsChanged { childCoordinates ->
-                                focusedBounds += Pair(
-                                    0,
-                                    childCoordinates?.let {
-                                        parentCoordinates.localBoundingBoxOf(it)
-                                    }
-                                )
+                                focusedBounds +=
+                                    Pair(
+                                        0,
+                                        childCoordinates?.let {
+                                            parentCoordinates.localBoundingBoxOf(it)
+                                        }
+                                    )
                             }
                         } else Modifier
                     )
                     .onFocusedBoundsChanged { childCoordinates ->
-                        focusedBounds += Pair(
-                            1,
-                            childCoordinates?.let {
-                                parentCoordinates.localBoundingBoxOf(it)
-                            }
-                        )
+                        focusedBounds +=
+                            Pair(
+                                1,
+                                childCoordinates?.let { parentCoordinates.localBoundingBoxOf(it) }
+                            )
                     }
                     .focusRequester(focusRequester)
                     .focusable()
@@ -483,20 +426,18 @@
             )
         }
 
-        rule.runOnIdle {
-            focusRequester.requestFocus()
-        }
+        rule.runOnIdle { focusRequester.requestFocus() }
+
+        rule.runOnIdle { includeSecondObserver = true }
 
         rule.runOnIdle {
-            includeSecondObserver = true
-        }
-
-        rule.runOnIdle {
-            assertThat(focusedBounds).containsExactly(
-                Pair(1, Rect(0f, 0f, size, size)),
-                Pair(1, Rect(0f, 0f, size, size)),
-                Pair(0, Rect(0f, 0f, size, size)),
-            ).inOrder()
+            assertThat(focusedBounds)
+                .containsExactly(
+                    Pair(1, Rect(0f, 0f, size, size)),
+                    Pair(1, Rect(0f, 0f, size, size)),
+                    Pair(0, Rect(0f, 0f, size, size)),
+                )
+                .inOrder()
         }
     }
 
@@ -509,25 +450,24 @@
 
         rule.setContent {
             Box(
-                Modifier
-                    .onGloballyPositioned { parentCoordinates = it }
+                Modifier.onGloballyPositioned { parentCoordinates = it }
                     .onFocusedBoundsChanged { childCoordinates ->
-                        focusedBounds += Pair(
-                            0,
-                            childCoordinates?.let {
-                                parentCoordinates.localBoundingBoxOf(it)
-                            }
-                        )
+                        focusedBounds +=
+                            Pair(
+                                0,
+                                childCoordinates?.let { parentCoordinates.localBoundingBoxOf(it) }
+                            )
                     }
                     .then(
                         if (includeSecondObserver) {
                             Modifier.onFocusedBoundsChanged { childCoordinates ->
-                                focusedBounds += Pair(
-                                    1,
-                                    childCoordinates?.let {
-                                        parentCoordinates.localBoundingBoxOf(it)
-                                    }
-                                )
+                                focusedBounds +=
+                                    Pair(
+                                        1,
+                                        childCoordinates?.let {
+                                            parentCoordinates.localBoundingBoxOf(it)
+                                        }
+                                    )
                             }
                         } else Modifier
                     )
@@ -538,20 +478,18 @@
             )
         }
 
-        rule.runOnIdle {
-            focusRequester.requestFocus()
-        }
+        rule.runOnIdle { focusRequester.requestFocus() }
+
+        rule.runOnIdle { includeSecondObserver = true }
 
         rule.runOnIdle {
-            includeSecondObserver = true
-        }
-
-        rule.runOnIdle {
-            assertThat(focusedBounds).containsExactly(
-                Pair(0, Rect(0f, 0f, size, size)),
-                Pair(1, Rect(0f, 0f, size, size)),
-                Pair(0, Rect(0f, 0f, size, size)),
-            ).inOrder()
+            assertThat(focusedBounds)
+                .containsExactly(
+                    Pair(0, Rect(0f, 0f, size, size)),
+                    Pair(1, Rect(0f, 0f, size, size)),
+                    Pair(0, Rect(0f, 0f, size, size)),
+                )
+                .inOrder()
         }
     }
 }
diff --git a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/FocusableTest.kt b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/FocusableTest.kt
index 0c7e22b..21523de 100644
--- a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/FocusableTest.kt
+++ b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/FocusableTest.kt
@@ -84,8 +84,7 @@
 @RunWith(AndroidJUnit4::class)
 class FocusableTest {
 
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
     private val focusTag = "myFocusable"
 
@@ -102,19 +101,10 @@
     @Test
     fun focusable_defaultSemantics() {
         rule.setFocusableContent {
-            Box {
-                BasicText(
-                    "focusableText",
-                    modifier = Modifier
-                        .testTag(focusTag)
-                        .focusable()
-                )
-            }
+            Box { BasicText("focusableText", modifier = Modifier.testTag(focusTag).focusable()) }
         }
 
-        rule.onNodeWithTag(focusTag)
-            .assertIsEnabled()
-            .assert(isFocusable())
+        rule.onNodeWithTag(focusTag).assertIsEnabled().assert(isFocusable())
     }
 
     @Test
@@ -123,15 +113,12 @@
             Box {
                 BasicText(
                     "focusableText",
-                    modifier = Modifier
-                        .testTag(focusTag)
-                        .focusable(enabled = false)
+                    modifier = Modifier.testTag(focusTag).focusable(enabled = false)
                 )
             }
         }
 
-        rule.onNodeWithTag(focusTag)
-            .assert(isNotFocusable())
+        rule.onNodeWithTag(focusTag).assert(isNotFocusable())
     }
 
     @Test
@@ -141,13 +128,7 @@
         lateinit var inputModeManager: InputModeManager
         rule.setContent {
             inputModeManager = LocalInputModeManager.current
-            Box(
-                Modifier
-                    .testTag(focusTag)
-                    .size(10.dp)
-                    .focusRequester(focusRequester)
-                    .focusable()
-            )
+            Box(Modifier.testTag(focusTag).size(10.dp).focusRequester(focusRequester).focusable())
         }
         rule.runOnIdle {
             @OptIn(ExperimentalComposeUiApi::class)
@@ -168,13 +149,7 @@
         lateinit var inputModeManager: InputModeManager
         rule.setContent {
             inputModeManager = LocalInputModeManager.current
-            Box(
-                Modifier
-                    .testTag(focusTag)
-                    .size(10.dp)
-                    .focusRequester(focusRequester)
-                    .focusable()
-            )
+            Box(Modifier.testTag(focusTag).size(10.dp).focusRequester(focusRequester).focusable())
         }
         rule.runOnIdle {
             @OptIn(ExperimentalComposeUiApi::class)
@@ -194,12 +169,7 @@
         lateinit var inputModeManager: InputModeManager
         rule.setContent {
             inputModeManager = LocalInputModeManager.current
-            Box(
-                Modifier
-                    .testTag(focusTag)
-                    .size(10.dp)
-                    .focusable()
-            )
+            Box(Modifier.testTag(focusTag).size(10.dp).focusable())
         }
         rule.runOnIdle {
             @OptIn(ExperimentalComposeUiApi::class)
@@ -220,13 +190,7 @@
         val focusRequester = FocusRequester()
         rule.setFocusableContent {
             inputModeManager = LocalInputModeManager.current
-            Box(
-                Modifier
-                    .focusRequester(focusRequester)
-                    .testTag(focusTag)
-                    .size(10.dp)
-                    .focusable()
-            )
+            Box(Modifier.focusRequester(focusRequester).testTag(focusTag).size(10.dp).focusable())
         }
         rule.runOnIdle {
             @OptIn(ExperimentalComposeUiApi::class)
@@ -247,36 +211,24 @@
             Box {
                 BasicText(
                     "focusableText",
-                    modifier = Modifier
-                        .testTag(focusTag)
-                        .focusRequester(focusRequester)
-                        .focusable()
+                    modifier = Modifier.testTag(focusTag).focusRequester(focusRequester).focusable()
                 )
                 BasicText(
                     "otherFocusableText",
-                    modifier = Modifier
-                        .focusRequester(otherFocusRequester)
-                        .focusable()
+                    modifier = Modifier.focusRequester(otherFocusRequester).focusable()
                 )
             }
         }
 
-        rule.onNodeWithTag(focusTag)
-            .assertIsNotFocused()
+        rule.onNodeWithTag(focusTag).assertIsNotFocused()
 
-        rule.runOnIdle {
-            focusRequester.requestFocus()
-        }
+        rule.runOnIdle { focusRequester.requestFocus() }
 
-        rule.onNodeWithTag(focusTag)
-            .assertIsFocused()
+        rule.onNodeWithTag(focusTag).assertIsFocused()
 
-        rule.runOnIdle {
-            otherFocusRequester.requestFocus()
-        }
+        rule.runOnIdle { otherFocusRequester.requestFocus() }
 
-        rule.onNodeWithTag(focusTag)
-            .assertIsNotFocused()
+        rule.onNodeWithTag(focusTag).assertIsNotFocused()
     }
 
     @Test
@@ -291,48 +243,37 @@
             Box {
                 BasicText(
                     "focusableText",
-                    modifier = Modifier
-                        .testTag(focusTag)
-                        .focusRequester(focusRequester)
-                        .focusable(interactionSource = interactionSource)
+                    modifier =
+                        Modifier.testTag(focusTag)
+                            .focusRequester(focusRequester)
+                            .focusable(interactionSource = interactionSource)
                 )
                 BasicText(
                     "otherFocusableText",
-                    modifier = Modifier
-                        .focusRequester(otherFocusRequester)
-                        .focusable()
+                    modifier = Modifier.focusRequester(otherFocusRequester).focusable()
                 )
             }
         }
 
         val interactions = mutableListOf<Interaction>()
 
-        scope.launch {
-            interactionSource.interactions.collect { interactions.add(it) }
-        }
+        scope.launch { interactionSource.interactions.collect { interactions.add(it) } }
 
-        rule.runOnIdle {
-            assertThat(interactions).isEmpty()
-        }
+        rule.runOnIdle { assertThat(interactions).isEmpty() }
 
-        rule.runOnIdle {
-            focusRequester.requestFocus()
-        }
+        rule.runOnIdle { focusRequester.requestFocus() }
 
         rule.runOnIdle {
             assertThat(interactions).hasSize(1)
             assertThat(interactions.first()).isInstanceOf(FocusInteraction.Focus::class.java)
         }
 
-        rule.runOnIdle {
-            otherFocusRequester.requestFocus()
-        }
+        rule.runOnIdle { otherFocusRequester.requestFocus() }
 
         rule.runOnIdle {
             assertThat(interactions).hasSize(2)
             assertThat(interactions.first()).isInstanceOf(FocusInteraction.Focus::class.java)
-            assertThat(interactions[1])
-                .isInstanceOf(FocusInteraction.Unfocus::class.java)
+            assertThat(interactions[1]).isInstanceOf(FocusInteraction.Unfocus::class.java)
             assertThat((interactions[1] as FocusInteraction.Unfocus).focus)
                 .isEqualTo(interactions[0])
         }
@@ -351,27 +292,21 @@
             Box {
                 BasicText(
                     "focusableText",
-                    modifier = Modifier
-                        .testTag(focusTag)
-                        .focusRequester(focusRequester)
-                        .focusable(enabled = enabled, interactionSource)
+                    modifier =
+                        Modifier.testTag(focusTag)
+                            .focusRequester(focusRequester)
+                            .focusable(enabled = enabled, interactionSource)
                 )
             }
         }
 
         val interactions = mutableListOf<Interaction>()
 
-        scope.launch {
-            interactionSource.interactions.collect { interactions.add(it) }
-        }
+        scope.launch { interactionSource.interactions.collect { interactions.add(it) } }
 
-        rule.runOnIdle {
-            assertThat(interactions).isEmpty()
-        }
+        rule.runOnIdle { assertThat(interactions).isEmpty() }
 
-        rule.runOnIdle {
-            focusRequester.requestFocus()
-        }
+        rule.runOnIdle { focusRequester.requestFocus() }
 
         rule.runOnIdle {
             assertThat(interactions).hasSize(1)
@@ -379,9 +314,7 @@
         }
 
         // Make focusable disabled, Interaction should be gone
-        rule.runOnIdle {
-            enabled = false
-        }
+        rule.runOnIdle { enabled = false }
 
         rule.runOnIdle {
             assertThat(interactions).hasSize(2)
@@ -406,10 +339,10 @@
                 if (emitFocusableText) {
                     BasicText(
                         "focusableText",
-                        modifier = Modifier
-                            .testTag(focusTag)
-                            .focusRequester(focusRequester)
-                            .focusable(interactionSource = interactionSource)
+                        modifier =
+                            Modifier.testTag(focusTag)
+                                .focusRequester(focusRequester)
+                                .focusable(interactionSource = interactionSource)
                     )
                 }
             }
@@ -417,17 +350,11 @@
 
         val interactions = mutableListOf<Interaction>()
 
-        scope.launch {
-            interactionSource.interactions.collect { interactions.add(it) }
-        }
+        scope.launch { interactionSource.interactions.collect { interactions.add(it) } }
 
-        rule.runOnIdle {
-            assertThat(interactions).isEmpty()
-        }
+        rule.runOnIdle { assertThat(interactions).isEmpty() }
 
-        rule.runOnIdle {
-            focusRequester.requestFocus()
-        }
+        rule.runOnIdle { focusRequester.requestFocus() }
 
         rule.runOnIdle {
             assertThat(interactions).hasSize(1)
@@ -435,9 +362,7 @@
         }
 
         // Dispose focusable, Interaction should be gone
-        rule.runOnIdle {
-            emitFocusableText = false
-        }
+        rule.runOnIdle { emitFocusableText = false }
 
         rule.runOnIdle {
             assertThat(interactions).hasSize(2)
@@ -453,32 +378,24 @@
         // Arrange.
         val focusRequester = FocusRequester()
         var onPinInvoked = false
-        val pinnableContainer = object : PinnableContainer {
-            override fun pin(): PinnedHandle {
-                onPinInvoked = true
-                return PinnedHandle {}
+        val pinnableContainer =
+            object : PinnableContainer {
+                override fun pin(): PinnedHandle {
+                    onPinInvoked = true
+                    return PinnedHandle {}
+                }
             }
-        }
         rule.setFocusableContent {
             CompositionLocalProvider(LocalPinnableContainer provides pinnableContainer) {
-                Box(
-                    Modifier
-                        .size(100.dp)
-                        .focusRequester(focusRequester)
-                        .focusable()
-                )
+                Box(Modifier.size(100.dp).focusRequester(focusRequester).focusable())
             }
         }
 
         // Act.
-        rule.runOnUiThread {
-            focusRequester.requestFocus()
-        }
+        rule.runOnUiThread { focusRequester.requestFocus() }
 
         // Assert.
-        rule.runOnIdle {
-            assertThat(onPinInvoked).isTrue()
-        }
+        rule.runOnIdle { assertThat(onPinInvoked).isTrue() }
     }
 
     @Test
@@ -487,41 +404,28 @@
         val focusRequester = FocusRequester()
         val focusRequester2 = FocusRequester()
         var onUnpinInvoked = false
-        val pinnableContainer = object : PinnableContainer {
-            override fun pin(): PinnedHandle {
-                return PinnedHandle { onUnpinInvoked = true }
+        val pinnableContainer =
+            object : PinnableContainer {
+                override fun pin(): PinnedHandle {
+                    return PinnedHandle { onUnpinInvoked = true }
+                }
             }
-        }
         rule.setFocusableContent {
             CompositionLocalProvider(LocalPinnableContainer provides pinnableContainer) {
-                Box(
-                    Modifier
-                        .size(100.dp)
-                        .focusRequester(focusRequester)
-                        .focusable()
-                )
+                Box(Modifier.size(100.dp).focusRequester(focusRequester).focusable())
             }
-            Box(
-                Modifier
-                    .size(100.dp)
-                    .focusRequester(focusRequester2)
-                    .focusable()
-            )
+            Box(Modifier.size(100.dp).focusRequester(focusRequester2).focusable())
         }
 
         // Act.
-        rule.runOnUiThread {
-            focusRequester.requestFocus()
-        }
+        rule.runOnUiThread { focusRequester.requestFocus() }
         rule.runOnIdle {
             assertThat(onUnpinInvoked).isFalse()
             focusRequester2.requestFocus()
         }
 
         // Assert.
-        rule.runOnIdle {
-            assertThat(onUnpinInvoked).isTrue()
-        }
+        rule.runOnIdle { assertThat(onUnpinInvoked).isTrue() }
     }
 
     @Test
@@ -530,10 +434,7 @@
         assertThat(modifier.nameFallback).isEqualTo("focusable")
         assertThat(modifier.valueOverride).isNull()
         assertThat(modifier.inspectableElements.map { it.name }.asIterable())
-            .containsExactly(
-                "enabled",
-                "interactionSource"
-            )
+            .containsExactly("enabled", "interactionSource")
     }
 
     @Test
@@ -551,19 +452,20 @@
     fun focusable_requestsBringIntoView_whenFocused() {
         // Arrange.
         val requestedRects = mutableListOf<Rect?>()
-        val bringIntoViewResponder = object : BringIntoViewResponder {
-            override fun calculateRectForParent(localRect: Rect): Rect = localRect
-            override suspend fun bringChildIntoView(localRect: () -> Rect?) {
-                requestedRects += localRect()
+        val bringIntoViewResponder =
+            object : BringIntoViewResponder {
+                override fun calculateRectForParent(localRect: Rect): Rect = localRect
+
+                override suspend fun bringChildIntoView(localRect: () -> Rect?) {
+                    requestedRects += localRect()
+                }
             }
-        }
         val focusRequester = FocusRequester()
 
         rule.setFocusableContent {
             with(rule.density) {
                 Box(
-                    Modifier
-                        .bringIntoViewResponder(bringIntoViewResponder)
+                    Modifier.bringIntoViewResponder(bringIntoViewResponder)
                         .focusRequester(focusRequester)
                         .focusable()
                         // Needs a non-zero size.
@@ -572,20 +474,17 @@
             }
         }
 
-        rule.runOnIdle {
-            assertThat(requestedRects).isEmpty()
-        }
+        rule.runOnIdle { assertThat(requestedRects).isEmpty() }
 
         // Act.
-        rule.runOnIdle {
-            focusRequester.requestFocus()
-        }
+        rule.runOnIdle { focusRequester.requestFocus() }
 
         // Assert.
         rule.runOnIdle {
             assertThat(requestedRects).containsExactly(Rect(Offset.Zero, Size(1f, 1f)))
         }
     }
+
     // This test also verifies that the internal API autoInvalidateRemovedNode()
     // is called when a modifier node is disposed.
     @Test
@@ -599,18 +498,11 @@
             state = rememberLazyListState()
             coroutineScope = rememberCoroutineScope()
             LazyRow(
-                modifier = Modifier
-                    .requiredSize(100.dp)
-                    .onFocusChanged { lazyRowHasFocus = it.hasFocus },
+                modifier =
+                    Modifier.requiredSize(100.dp).onFocusChanged { lazyRowHasFocus = it.hasFocus },
                 state = state
             ) {
-                items(items.size) {
-                    Box(
-                        Modifier
-                            .requiredSize(10.dp)
-                            .testTag("$it")
-                            .focusable())
-                }
+                items(items.size) { Box(Modifier.requiredSize(10.dp).testTag("$it").focusable()) }
             }
         }
         rule.runOnIdle { coroutineScope.launch { state.scrollToItem(19) } }
@@ -620,9 +512,7 @@
         rule.runOnIdle { items = (1..11).toList() }
 
         // Assert.
-        rule.runOnIdle {
-            assertThat(lazyRowHasFocus).isFalse()
-        }
+        rule.runOnIdle { assertThat(lazyRowHasFocus).isFalse() }
     }
 
     @Test
@@ -632,20 +522,15 @@
         var itemVisible by mutableStateOf(true)
         rule.setFocusableContent {
             SubcomposeLayout(
-                modifier = Modifier
-                    .requiredSize(100.dp)
-                    .onFocusChanged { hasFocus = it.hasFocus },
+                modifier = Modifier.requiredSize(100.dp).onFocusChanged { hasFocus = it.hasFocus },
             ) { constraints ->
-                val measurable = if (itemVisible) {
-                    subcompose(Unit) {
-                        Box(
-                            Modifier
-                                .requiredSize(10.dp)
-                                .testTag("0")
-                                .focusable()
-                        )
-                    }.single()
-                } else null
+                val measurable =
+                    if (itemVisible) {
+                        subcompose(Unit) {
+                                Box(Modifier.requiredSize(10.dp).testTag("0").focusable())
+                            }
+                            .single()
+                    } else null
                 val placeable = measurable?.measure(constraints)
                 layout(constraints.minWidth, constraints.minHeight) {
                     placeable?.place(IntOffset.Zero)
@@ -658,9 +543,7 @@
         rule.runOnIdle { itemVisible = false }
 
         // Assert.
-        rule.runOnIdle {
-            assertThat(hasFocus).isFalse()
-        }
+        rule.runOnIdle { assertThat(hasFocus).isFalse() }
     }
 
     @Test
@@ -668,35 +551,30 @@
         // Arrange.
         val focusRequester = FocusRequester()
         var container1Pinned = false
-        val pinnableContainer1 = object : PinnableContainer {
-            override fun pin(): PinnedHandle {
-                container1Pinned = true
-                return PinnedHandle { container1Pinned = false }
+        val pinnableContainer1 =
+            object : PinnableContainer {
+                override fun pin(): PinnedHandle {
+                    container1Pinned = true
+                    return PinnedHandle { container1Pinned = false }
+                }
             }
-        }
         var container2Pinned = false
-        val pinnableContainer2 = object : PinnableContainer {
-            override fun pin(): PinnedHandle {
-                container2Pinned = true
-                return PinnedHandle { container2Pinned = false }
+        val pinnableContainer2 =
+            object : PinnableContainer {
+                override fun pin(): PinnedHandle {
+                    container2Pinned = true
+                    return PinnedHandle { container2Pinned = false }
+                }
             }
-        }
         var pinnableContainer by mutableStateOf<PinnableContainer>(pinnableContainer1)
         rule.setFocusableContent {
             CompositionLocalProvider(LocalPinnableContainer provides pinnableContainer) {
-                Box(
-                    Modifier
-                        .size(100.dp)
-                        .focusRequester(focusRequester)
-                        .focusable()
-                )
+                Box(Modifier.size(100.dp).focusRequester(focusRequester).focusable())
             }
         }
 
         // Act.
-        rule.runOnUiThread {
-            focusRequester.requestFocus()
-        }
+        rule.runOnUiThread { focusRequester.requestFocus() }
         rule.runOnIdle {
             assertThat(container1Pinned).isTrue()
             assertThat(container2Pinned).isFalse()
@@ -720,11 +598,11 @@
             ReusableContent(key) {
                 BasicText(
                     "focusableText",
-                    modifier = Modifier
-                        .testTag(focusTag)
-                        .focusRequester(focusRequester)
-                        .onFocusEvent { state = it }
-                        .focusable()
+                    modifier =
+                        Modifier.testTag(focusTag)
+                            .focusRequester(focusRequester)
+                            .onFocusEvent { state = it }
+                            .focusable()
                 )
             }
         }
@@ -732,20 +610,14 @@
             focusRequester.requestFocus()
             assertThat(state.isFocused).isTrue()
         }
-        rule.onNodeWithTag(focusTag)
-            .assertIsFocused()
+        rule.onNodeWithTag(focusTag).assertIsFocused()
 
         // Act.
-        rule.runOnIdle {
-            key = 1
-        }
+        rule.runOnIdle { key = 1 }
 
         // Assert.
-        rule.runOnIdle {
-            assertThat(state.isFocused).isFalse()
-        }
-        rule.onNodeWithTag(focusTag)
-            .assertIsNotFocused()
+        rule.runOnIdle { assertThat(state.isFocused).isFalse() }
+        rule.onNodeWithTag(focusTag).assertIsNotFocused()
     }
 
     @Test
@@ -757,8 +629,7 @@
         lateinit var scope: CoroutineScope
         val content = movableContentOf {
             Box(
-                Modifier
-                    .testTag(focusTag)
+                Modifier.testTag(focusTag)
                     .size(5.dp)
                     .focusRequester(focusRequester)
                     .onFocusEvent { state = it }
@@ -769,25 +640,17 @@
         rule.setFocusableContent {
             scope = rememberCoroutineScope()
             if (moveContent) {
-                Box(Modifier.size(5.dp)) {
-                    content()
-                }
+                Box(Modifier.size(5.dp)) { content() }
             } else {
-                Box(Modifier.size(10.dp)) {
-                    content()
-                }
+                Box(Modifier.size(10.dp)) { content() }
             }
         }
 
         val interactions = mutableListOf<Interaction>()
 
-        scope.launch {
-            interactionSource.interactions.collect { interactions.add(it) }
-        }
+        scope.launch { interactionSource.interactions.collect { interactions.add(it) } }
 
-        rule.runOnIdle {
-            assertThat(interactions).isEmpty()
-        }
+        rule.runOnIdle { assertThat(interactions).isEmpty() }
 
         rule.runOnIdle {
             focusRequester.requestFocus() // request focus
@@ -799,19 +662,15 @@
             assertThat(interactions.first()).isInstanceOf(FocusInteraction.Focus::class.java)
         }
 
-        rule.onNodeWithTag(focusTag)
-            .assertIsFocused()
+        rule.onNodeWithTag(focusTag).assertIsFocused()
 
         rule.runOnIdle {
             moveContent = true // moving content
         }
 
         // Assert that focus is reset
-        rule.runOnIdle {
-            assertThat(state.isFocused).isFalse()
-        }
-        rule.onNodeWithTag(focusTag)
-            .assertIsNotFocused()
+        rule.runOnIdle { assertThat(state.isFocused).isFalse() }
+        rule.onNodeWithTag(focusTag).assertIsNotFocused()
 
         rule.runOnIdle {
             assertThat(interactions.first()).isInstanceOf(FocusInteraction.Focus::class.java)
diff --git a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/FoundationTest.kt b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/FoundationTest.kt
index 2b7ab2b..72057d1 100644
--- a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/FoundationTest.kt
+++ b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/FoundationTest.kt
@@ -27,9 +27,7 @@
 import androidx.compose.ui.unit.Dp
 import androidx.compose.ui.unit.dp
 
-/**
- * Constant to emulate very big but finite constraints
- */
+/** Constant to emulate very big but finite constraints */
 val BigTestMaxWidth = 5000.dp
 val BigTestMaxHeight = 5000.dp
 
diff --git a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/FoundationTestUtils.kt b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/FoundationTestUtils.kt
index 990aaec..e958439 100644
--- a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/FoundationTestUtils.kt
+++ b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/FoundationTestUtils.kt
@@ -29,10 +29,10 @@
  * [View.requestFocus()][android.view.View.requestFocus] will not take focus if the view has no
  * size.
  *
- * @param extraItemForInitialFocus Includes an extra item that takes focus initially. This is
- * useful in cases where we need tests that could be affected by initial focus. Eg. When there is
- * only one focusable item and we clear focus, that item could end up being focused on again by the
- * initial focus logic.
+ * @param extraItemForInitialFocus Includes an extra item that takes focus initially. This is useful
+ *   in cases where we need tests that could be affected by initial focus. Eg. When there is only
+ *   one focusable item and we clear focus, that item could end up being focused on again by the
+ *   initial focus logic.
  */
 internal fun ComposeContentTestRule.setFocusableContent(
     extraItemForInitialFocus: Boolean = true,
diff --git a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/HoverableTest.kt b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/HoverableTest.kt
index 2aa4d31..e93bfb3 100644
--- a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/HoverableTest.kt
+++ b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/HoverableTest.kt
@@ -56,8 +56,7 @@
 @RunWith(AndroidJUnit4::class)
 class HoverableTest {
 
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
     val hoverTag = "myHoverable"
 
@@ -79,10 +78,7 @@
             Truth.assertThat(modifier.nameFallback).isEqualTo("hoverable")
             Truth.assertThat(modifier.valueOverride).isNull()
             Truth.assertThat(modifier.inspectableElements.map { it.name }.asIterable())
-                .containsExactly(
-                    "interactionSource",
-                    "enabled"
-                )
+                .containsExactly("interactionSource", "enabled")
         }
     }
 
@@ -105,19 +101,12 @@
         val interactionSource = MutableInteractionSource()
 
         rule.setContent {
-            Box(
-                modifier = Modifier
-                    .size(128.dp)
-                    .testTag(hoverTag)
-                    .hoverable(interactionSource)
-            )
+            Box(modifier = Modifier.size(128.dp).testTag(hoverTag).hoverable(interactionSource))
 
             isHovered = interactionSource.collectIsHoveredAsState().value
         }
 
-        rule.onNodeWithTag(hoverTag).performMouseInput {
-            enter(Offset(64.dp.toPx(), 64.dp.toPx()))
-        }
+        rule.onNodeWithTag(hoverTag).performMouseInput { enter(Offset(64.dp.toPx(), 64.dp.toPx())) }
 
         rule.waitForIdle()
         Truth.assertThat(isHovered).isTrue()
@@ -155,26 +144,20 @@
         rule.setContent {
             scope = rememberCoroutineScope()
             Box(
-                modifier = Modifier
-                    .size(128.dp)
-                    .testTag(hoverTag)
-                    .hoverable(interactionSource = interactionSource)
+                modifier =
+                    Modifier.size(128.dp)
+                        .testTag(hoverTag)
+                        .hoverable(interactionSource = interactionSource)
             )
         }
 
         val interactions = mutableListOf<Interaction>()
 
-        scope!!.launch {
-            interactionSource.interactions.collect { interactions.add(it) }
-        }
+        scope!!.launch { interactionSource.interactions.collect { interactions.add(it) } }
 
-        rule.runOnIdle {
-            Truth.assertThat(interactions).isEmpty()
-        }
+        rule.runOnIdle { Truth.assertThat(interactions).isEmpty() }
 
-        rule.onNodeWithTag(hoverTag).performMouseInput {
-            enter(Offset(64.dp.toPx(), 64.dp.toPx()))
-        }
+        rule.onNodeWithTag(hoverTag).performMouseInput { enter(Offset(64.dp.toPx(), 64.dp.toPx())) }
 
         rule.runOnIdle {
             Truth.assertThat(interactions).hasSize(1)
@@ -188,8 +171,7 @@
         rule.runOnIdle {
             Truth.assertThat(interactions).hasSize(2)
             Truth.assertThat(interactions.first()).isInstanceOf(HoverInteraction.Enter::class.java)
-            Truth.assertThat(interactions[1])
-                .isInstanceOf(HoverInteraction.Exit::class.java)
+            Truth.assertThat(interactions[1]).isInstanceOf(HoverInteraction.Exit::class.java)
             Truth.assertThat((interactions[1] as HoverInteraction.Exit).enter)
                 .isEqualTo(interactions[0])
         }
@@ -208,10 +190,10 @@
             Box {
                 if (emitHoverable) {
                     Box(
-                        modifier = Modifier
-                            .size(128.dp)
-                            .testTag(hoverTag)
-                            .hoverable(interactionSource = interactionSource)
+                        modifier =
+                            Modifier.size(128.dp)
+                                .testTag(hoverTag)
+                                .hoverable(interactionSource = interactionSource)
                     )
                 }
             }
@@ -219,17 +201,11 @@
 
         val interactions = mutableListOf<Interaction>()
 
-        scope!!.launch {
-            interactionSource.interactions.collect { interactions.add(it) }
-        }
+        scope!!.launch { interactionSource.interactions.collect { interactions.add(it) } }
 
-        rule.runOnIdle {
-            Truth.assertThat(interactions).isEmpty()
-        }
+        rule.runOnIdle { Truth.assertThat(interactions).isEmpty() }
 
-        rule.onNodeWithTag(hoverTag).performMouseInput {
-            enter(Offset(64.dp.toPx(), 64.dp.toPx()))
-        }
+        rule.onNodeWithTag(hoverTag).performMouseInput { enter(Offset(64.dp.toPx(), 64.dp.toPx())) }
 
         rule.runOnIdle {
             Truth.assertThat(interactions).hasSize(1)
@@ -237,15 +213,12 @@
         }
 
         // Dispose hoverable, Interaction should be gone
-        rule.runOnIdle {
-            emitHoverable = false
-        }
+        rule.runOnIdle { emitHoverable = false }
 
         rule.runOnIdle {
             Truth.assertThat(interactions).hasSize(2)
             Truth.assertThat(interactions.first()).isInstanceOf(HoverInteraction.Enter::class.java)
-            Truth.assertThat(interactions[1])
-                .isInstanceOf(HoverInteraction.Exit::class.java)
+            Truth.assertThat(interactions[1]).isInstanceOf(HoverInteraction.Exit::class.java)
             Truth.assertThat((interactions[1] as HoverInteraction.Exit).enter)
                 .isEqualTo(interactions[0])
         }
@@ -264,10 +237,10 @@
             Box {
                 ReusableContent(key) {
                     Box(
-                        modifier = Modifier
-                            .size(128.dp)
-                            .testTag(hoverTag)
-                            .hoverable(interactionSource = interactionSource)
+                        modifier =
+                            Modifier.size(128.dp)
+                                .testTag(hoverTag)
+                                .hoverable(interactionSource = interactionSource)
                     )
                 }
             }
@@ -275,17 +248,11 @@
 
         val interactions = mutableListOf<Interaction>()
 
-        scope!!.launch {
-            interactionSource.interactions.collect { interactions.add(it) }
-        }
+        scope!!.launch { interactionSource.interactions.collect { interactions.add(it) } }
 
-        rule.runOnIdle {
-            Truth.assertThat(interactions).isEmpty()
-        }
+        rule.runOnIdle { Truth.assertThat(interactions).isEmpty() }
 
-        rule.onNodeWithTag(hoverTag).performMouseInput {
-            enter(Offset(64.dp.toPx(), 64.dp.toPx()))
-        }
+        rule.onNodeWithTag(hoverTag).performMouseInput { enter(Offset(64.dp.toPx(), 64.dp.toPx())) }
 
         rule.runOnIdle {
             Truth.assertThat(interactions).hasSize(1)
@@ -293,15 +260,12 @@
         }
 
         // Change the key to trigger reuse
-        rule.runOnIdle {
-            key = false
-        }
+        rule.runOnIdle { key = false }
 
         rule.runOnIdle {
             Truth.assertThat(interactions).hasSize(2)
             Truth.assertThat(interactions.first()).isInstanceOf(HoverInteraction.Enter::class.java)
-            Truth.assertThat(interactions[1])
-                .isInstanceOf(HoverInteraction.Exit::class.java)
+            Truth.assertThat(interactions[1]).isInstanceOf(HoverInteraction.Exit::class.java)
             Truth.assertThat((interactions[1] as HoverInteraction.Exit).enter)
                 .isEqualTo(interactions[0])
         }
@@ -317,39 +281,29 @@
 
         val content = movableContentOf {
             Box(
-                modifier = Modifier
-                    .size(128.dp)
-                    .testTag(hoverTag)
-                    .hoverable(interactionSource = interactionSource)
+                modifier =
+                    Modifier.size(128.dp)
+                        .testTag(hoverTag)
+                        .hoverable(interactionSource = interactionSource)
             )
         }
 
         rule.setContent {
             scope = rememberCoroutineScope()
             if (moveContent) {
-                Box {
-                    content()
-                }
+                Box { content() }
             } else {
-                Box {
-                    content()
-                }
+                Box { content() }
             }
         }
 
         val interactions = mutableListOf<Interaction>()
 
-        scope!!.launch {
-            interactionSource.interactions.collect { interactions.add(it) }
-        }
+        scope!!.launch { interactionSource.interactions.collect { interactions.add(it) } }
 
-        rule.runOnIdle {
-            Truth.assertThat(interactions).isEmpty()
-        }
+        rule.runOnIdle { Truth.assertThat(interactions).isEmpty() }
 
-        rule.onNodeWithTag(hoverTag).performMouseInput {
-            enter(Offset(64.dp.toPx(), 64.dp.toPx()))
-        }
+        rule.onNodeWithTag(hoverTag).performMouseInput { enter(Offset(64.dp.toPx(), 64.dp.toPx())) }
 
         rule.runOnIdle {
             Truth.assertThat(interactions).hasSize(1)
@@ -357,15 +311,12 @@
         }
 
         // Move the content
-        rule.runOnIdle {
-            moveContent = true
-        }
+        rule.runOnIdle { moveContent = true }
 
         rule.runOnIdle {
             Truth.assertThat(interactions).hasSize(2)
             Truth.assertThat(interactions.first()).isInstanceOf(HoverInteraction.Enter::class.java)
-            Truth.assertThat(interactions[1])
-                .isInstanceOf(HoverInteraction.Exit::class.java)
+            Truth.assertThat(interactions[1]).isInstanceOf(HoverInteraction.Exit::class.java)
             Truth.assertThat((interactions[1] as HoverInteraction.Exit).enter)
                 .isEqualTo(interactions[0])
         }
@@ -382,31 +333,23 @@
             scope = rememberCoroutineScope()
             Box {
                 Box(
-                    modifier = Modifier
-                        .size(128.dp)
-                        .testTag(hoverTag)
-                        .hoverable(interactionSource = interactionSource, enabled = false)
+                    modifier =
+                        Modifier.size(128.dp)
+                            .testTag(hoverTag)
+                            .hoverable(interactionSource = interactionSource, enabled = false)
                 )
             }
         }
 
         val interactions = mutableListOf<Interaction>()
 
-        scope!!.launch {
-            interactionSource.interactions.collect { interactions.add(it) }
-        }
+        scope!!.launch { interactionSource.interactions.collect { interactions.add(it) } }
 
-        rule.runOnIdle {
-            Truth.assertThat(interactions).isEmpty()
-        }
+        rule.runOnIdle { Truth.assertThat(interactions).isEmpty() }
 
-        rule.onNodeWithTag(hoverTag).performMouseInput {
-            enter(Offset(64.dp.toPx(), 64.dp.toPx()))
-        }
+        rule.onNodeWithTag(hoverTag).performMouseInput { enter(Offset(64.dp.toPx(), 64.dp.toPx())) }
 
-        rule.runOnIdle {
-            Truth.assertThat(interactions).isEmpty()
-        }
+        rule.runOnIdle { Truth.assertThat(interactions).isEmpty() }
     }
 
     @OptIn(ExperimentalTestApi::class)
@@ -421,27 +364,24 @@
             scope = rememberCoroutineScope()
             Box {
                 Box(
-                    modifier = Modifier
-                        .size(128.dp)
-                        .testTag(hoverTag)
-                        .hoverable(interactionSource = interactionSource, enabled = enableHoverable)
+                    modifier =
+                        Modifier.size(128.dp)
+                            .testTag(hoverTag)
+                            .hoverable(
+                                interactionSource = interactionSource,
+                                enabled = enableHoverable
+                            )
                 )
             }
         }
 
         val interactions = mutableListOf<Interaction>()
 
-        scope!!.launch {
-            interactionSource.interactions.collect { interactions.add(it) }
-        }
+        scope!!.launch { interactionSource.interactions.collect { interactions.add(it) } }
 
-        rule.runOnIdle {
-            Truth.assertThat(interactions).isEmpty()
-        }
+        rule.runOnIdle { Truth.assertThat(interactions).isEmpty() }
 
-        rule.onNodeWithTag(hoverTag).performMouseInput {
-            enter(Offset(64.dp.toPx(), 64.dp.toPx()))
-        }
+        rule.onNodeWithTag(hoverTag).performMouseInput { enter(Offset(64.dp.toPx(), 64.dp.toPx())) }
 
         rule.runOnIdle {
             Truth.assertThat(interactions).hasSize(1)
@@ -449,15 +389,12 @@
         }
 
         // Disable hoverable, Interaction should be gone
-        rule.runOnIdle {
-            enableHoverable = false
-        }
+        rule.runOnIdle { enableHoverable = false }
 
         rule.runOnIdle {
             Truth.assertThat(interactions).hasSize(2)
             Truth.assertThat(interactions.first()).isInstanceOf(HoverInteraction.Enter::class.java)
-            Truth.assertThat(interactions[1])
-                .isInstanceOf(HoverInteraction.Exit::class.java)
+            Truth.assertThat(interactions[1]).isInstanceOf(HoverInteraction.Exit::class.java)
             Truth.assertThat((interactions[1] as HoverInteraction.Exit).enter)
                 .isEqualTo(interactions[0])
         }
diff --git a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/ImageTest.kt b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/ImageTest.kt
index 131103e..d1a4255 100644
--- a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/ImageTest.kt
+++ b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/ImageTest.kt
@@ -92,23 +92,20 @@
     val bgColor = Color.Blue
     val pathColor = Color.Red
 
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
     private fun createImageBitmap(): ImageBitmap {
         val image = ImageBitmap(imageWidth, imageHeight)
-        val path = Path().apply {
-            lineTo(imageWidth.toFloat(), imageHeight.toFloat())
-            lineTo(0.0f, imageHeight.toFloat())
-            close()
-        }
+        val path =
+            Path().apply {
+                lineTo(imageWidth.toFloat(), imageHeight.toFloat())
+                lineTo(0.0f, imageHeight.toFloat())
+                close()
+            }
         val paint = Paint()
         Canvas(image).apply {
             paint.color = bgColor
-            drawRect(
-                Rect(Offset.Zero, Size(imageWidth.toFloat(), imageHeight.toFloat())),
-                paint
-            )
+            drawRect(Rect(Offset.Zero, Size(imageWidth.toFloat(), imageHeight.toFloat())), paint)
 
             paint.color = pathColor
             drawPath(path, paint)
@@ -143,17 +140,11 @@
             Assert.assertEquals(pathArgb, getPixel(imageStartX, imageStartY + 1))
             Assert.assertEquals(
                 pathArgb,
-                getPixel(
-                    imageStartX + (imageWidth / 2) - 1,
-                    imageStartY + (imageHeight / 2) + 1
-                )
+                getPixel(imageStartX + (imageWidth / 2) - 1, imageStartY + (imageHeight / 2) + 1)
             )
             Assert.assertEquals(
                 bgColorArgb,
-                getPixel(
-                    imageStartX + (imageWidth / 2) - 2,
-                    imageStartY + (imageHeight / 2) - 5
-                )
+                getPixel(imageStartX + (imageWidth / 2) - 2, imageStartY + (imageHeight / 2) - 5)
             )
             Assert.assertEquals(pathArgb, getPixel(imageStartX, imageStartY + imageHeight - 1))
         }
@@ -219,14 +210,8 @@
                 boxBgArgb,
                 getPixel(imageStartX + subsectionWidth - 1, imageStartY - 1)
             )
-            Assert.assertEquals(
-                boxBgArgb,
-                getPixel(imageStartX + subsectionWidth, imageStartY - 1)
-            )
-            Assert.assertEquals(
-                boxBgArgb,
-                getPixel(imageStartX + subsectionWidth, imageStartY)
-            )
+            Assert.assertEquals(boxBgArgb, getPixel(imageStartX + subsectionWidth, imageStartY - 1))
+            Assert.assertEquals(boxBgArgb, getPixel(imageStartX + subsectionWidth, imageStartY))
 
             // Verify bottom left region outside the subsection has a white background
             Assert.assertEquals(
@@ -237,10 +222,7 @@
                 boxBgArgb,
                 getPixel(imageStartX - 1, imageStartY + subsectionHeight)
             )
-            Assert.assertEquals(
-                boxBgArgb,
-                getPixel(imageStartX, imageStartY + subsectionHeight)
-            )
+            Assert.assertEquals(boxBgArgb, getPixel(imageStartX, imageStartY + subsectionHeight))
 
             // Verify bottom right region outside the subsection has a white background
             Assert.assertEquals(
@@ -276,12 +258,12 @@
                 Image(
                     bitmap = createImageBitmap(),
                     contentDescription = null,
-                    modifier = Modifier
-                        .testTag(contentTag)
-                        .size(
-                            (imageComposableWidth / density).dp,
-                            (imageComposableHeight / density).dp
-                        )
+                    modifier =
+                        Modifier.testTag(contentTag)
+                            .size(
+                                (imageComposableWidth / density).dp,
+                                (imageComposableHeight / density).dp
+                            )
                 )
             }
         }
@@ -309,11 +291,7 @@
             )
             Assert.assertEquals(
                 pathArgb,
-                getPixel(
-                    imageStartX,
-                    imageStartY +
-                        imageComposableHeight - 1
-                )
+                getPixel(imageStartX, imageStartY + imageComposableHeight - 1)
             )
         }
     }
@@ -344,12 +322,12 @@
                 Image(
                     bitmap = ImageBitmap,
                     contentDescription = null,
-                    modifier = Modifier
-                        .testTag(contentTag)
-                        .size(
-                            (imageComposableWidth / density.density).dp,
-                            (imageComposableHeight / density.density).dp
-                        ),
+                    modifier =
+                        Modifier.testTag(contentTag)
+                            .size(
+                                (imageComposableWidth / density.density).dp,
+                                (imageComposableHeight / density.density).dp
+                            ),
                     // Scale the image non-uniformly within the bounds of the composable
                     contentScale = ContentScale.FillBounds,
                     alignment = Alignment.BottomEnd
@@ -377,12 +355,12 @@
                 Image(
                     bitmap = createImageBitmap(),
                     contentDescription = null,
-                    modifier = Modifier
-                        .testTag(contentTag)
-                        .size(
-                            (imageComposableWidth / density).dp,
-                            (imageComposableHeight / density).dp
-                        ),
+                    modifier =
+                        Modifier.testTag(contentTag)
+                            .size(
+                                (imageComposableWidth / density).dp,
+                                (imageComposableHeight / density).dp
+                            ),
                     // Intentionally do not scale up the contents of the ImageBitmap
                     contentScale = ContentScale.Inside,
                     alignment = Alignment.BottomEnd
@@ -401,17 +379,11 @@
             Assert.assertEquals(pathArgb, getPixel(imageStartX, imageStartY + 1))
             Assert.assertEquals(
                 pathArgb,
-                getPixel(
-                    imageStartX + (imageWidth / 2) - 1,
-                    imageStartY + (imageHeight / 2) + 1
-                )
+                getPixel(imageStartX + (imageWidth / 2) - 1, imageStartY + (imageHeight / 2) + 1)
             )
             Assert.assertEquals(
                 bgColorArgb,
-                getPixel(
-                    imageStartX + (imageWidth / 2) - 2,
-                    imageStartY + (imageHeight / 2) - 5
-                )
+                getPixel(imageStartX + (imageWidth / 2) - 2, imageStartY + (imageHeight / 2) - 5)
             )
             Assert.assertEquals(pathArgb, getPixel(imageStartX, imageStartY + imageHeight - 1))
         }
@@ -437,11 +409,10 @@
                 Image(
                     painterResource(R.drawable.ic_vector_asset_test),
                     null,
-                    modifier = Modifier.sizeIn(
-                        minWidth = minWidth,
-                        minHeight = minHeight
-                    )
-                        .drawBehind { vectorDrawn = true }
+                    modifier =
+                        Modifier.sizeIn(minWidth = minWidth, minHeight = minHeight).drawBehind {
+                            vectorDrawn = true
+                        }
                 )
             }
         }
@@ -456,50 +427,27 @@
             Assert.assertEquals(containerBgColor, getPixel(imageStartX - 1, imageStartY - 1))
             Assert.assertEquals(
                 containerBgColor,
-                getPixel(
-                    imageStartX + boxWidth + 1,
-                    imageStartY - 1
-                )
+                getPixel(imageStartX + boxWidth + 1, imageStartY - 1)
             )
             Assert.assertEquals(
                 containerBgColor,
-                getPixel(
-                    imageStartX + boxWidth + 1,
-                    imageStartY + boxHeight + 1
-                )
+                getPixel(imageStartX + boxWidth + 1, imageStartY + boxHeight + 1)
             )
             Assert.assertEquals(
                 containerBgColor,
-                getPixel(
-                    imageStartX - 1,
-                    imageStartY +
-                        boxHeight + 1
-                )
+                getPixel(imageStartX - 1, imageStartY + boxHeight + 1)
             )
 
             Assert.assertEquals(imageColor, getPixel(imageStartX, imageStartY + 15))
             Assert.assertEquals(
                 containerBgColor,
-                getPixel(
-                    imageStartX + boxWidth - 2,
-                    imageStartY - 1
-                )
+                getPixel(imageStartX + boxWidth - 2, imageStartY - 1)
             )
             Assert.assertEquals(
                 imageColor,
-                getPixel(
-                    imageStartX + boxWidth - 10,
-                    imageStartY + boxHeight - 2
-                )
+                getPixel(imageStartX + boxWidth - 10, imageStartY + boxHeight - 2)
             )
-            Assert.assertEquals(
-                imageColor,
-                getPixel(
-                    imageStartX,
-                    imageStartY +
-                        boxHeight - 2
-                )
-            )
+            Assert.assertEquals(imageColor, getPixel(imageStartX, imageStartY + boxHeight - 2))
         }
     }
 
@@ -507,25 +455,23 @@
     fun testContentScaleCropRespectsMaxDimension() {
         val testTag = "testTag"
         rule.setContent {
-            val asset = with(ImageBitmap(100, 100)) {
-                with(Canvas(this)) {
-                    val paint = Paint().apply { this.color = Color.Blue }
-                    drawRect(0f, 0f, 100f, 100f, paint)
-                    drawRect(
-                        25f, 25f, 75f, 75f,
-                        paint.apply { this.color = Color.Red }
-                    )
+            val asset =
+                with(ImageBitmap(100, 100)) {
+                    with(Canvas(this)) {
+                        val paint = Paint().apply { this.color = Color.Blue }
+                        drawRect(0f, 0f, 100f, 100f, paint)
+                        drawRect(25f, 25f, 75f, 75f, paint.apply { this.color = Color.Red })
+                    }
+                    this
                 }
-                this
-            }
             val heightDp = asset.height / LocalDensity.current.density
             Image(
                 asset,
                 null,
-                modifier = Modifier
-                    .testTag(testTag)
-                    .background(Color.Green)
-                    .heightIn(max = (heightDp / 2f).dp),
+                modifier =
+                    Modifier.testTag(testTag)
+                        .background(Color.Green)
+                        .heightIn(max = (heightDp / 2f).dp),
                 contentScale = ContentScale.Crop
             )
         }
@@ -547,19 +493,20 @@
         var imageColor = Color(0.023529412f, 0.0f, 1.0f, 1.0f) // ic_image_test color
 
         rule.setContent {
-            val painterId = remember {
-                mutableStateOf(R.drawable.ic_vector_square_asset_test)
-            }
+            val painterId = remember { mutableStateOf(R.drawable.ic_vector_square_asset_test) }
             Image(
                 painterResource(painterId.value),
                 null,
-                modifier = Modifier.testTag(testTag).clickable {
-                    if (painterId.value == R.drawable.ic_vector_square_asset_test) {
-                        painterId.value = R.drawable.ic_image_test
-                    } else {
-                        painterId.value = R.drawable.ic_vector_square_asset_test
-                    }
-                }.size(50.dp),
+                modifier =
+                    Modifier.testTag(testTag)
+                        .clickable {
+                            if (painterId.value == R.drawable.ic_vector_square_asset_test) {
+                                painterId.value = R.drawable.ic_image_test
+                            } else {
+                                painterId.value = R.drawable.ic_vector_square_asset_test
+                            }
+                        }
+                        .size(50.dp),
                 contentScale = ContentScale.FillBounds
             )
         }
@@ -583,7 +530,8 @@
                 contentDescription = "asdf"
             )
         }
-        rule.onNodeWithTag(testTag)
+        rule
+            .onNodeWithTag(testTag)
             .assert(SemanticsMatcher.expectValue(SemanticsProperties.Role, Role.Image))
             .assertContentDescriptionEquals("asdf")
     }
@@ -609,10 +557,7 @@
         rule.setContent {
             // Intentionally force a size of zero to ensure we do not crash
             Box(modifier = Modifier.requiredSize(0.dp)) {
-                Image(
-                    painter = ColorPainter(Color.Red),
-                    contentDescription = null
-                )
+                Image(painter = ColorPainter(Color.Red), contentDescription = null)
             }
         }
     }
@@ -621,9 +566,7 @@
     fun testImageFilterQualityNone() {
         val sampleBitmap = ImageBitmap(2, 2)
         val canvas = androidx.compose.ui.graphics.Canvas(sampleBitmap)
-        val samplePaint = Paint().apply {
-            color = Color.White
-        }
+        val samplePaint = Paint().apply { color = Color.White }
 
         canvas.drawRect(0f, 0f, 2f, 2f, samplePaint)
 
@@ -665,15 +608,13 @@
         val testTag = "imageTag"
         var bitmapDrawable: BitmapDrawable? = null
         rule.setContent {
-            bitmapDrawable = LocalContext.current.getDrawable(R.drawable.webp_test)
-                as BitmapDrawable
+            bitmapDrawable =
+                LocalContext.current.getDrawable(R.drawable.webp_test) as BitmapDrawable
             Image(
                 painter = painterResource(id = R.drawable.webp_test),
                 null,
                 contentScale = ContentScale.None,
-                modifier = Modifier
-                    .wrapContentSize()
-                    .testTag(testTag)
+                modifier = Modifier.wrapContentSize().testTag(testTag)
             )
         }
 
diff --git a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/IndicationTest.kt b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/IndicationTest.kt
index 2eeb8d1..ebe4552 100644
--- a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/IndicationTest.kt
+++ b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/IndicationTest.kt
@@ -55,8 +55,7 @@
 @RunWith(AndroidJUnit4::class)
 class IndicationTest {
 
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
     val testTag = "indication"
 
@@ -74,15 +73,9 @@
     fun indication_drawIsCalled() {
         val interactionSource = MutableInteractionSource()
         val countDownLatch = CountDownLatch(1)
-        val indication = TestPressIndication {
-            countDownLatch.countDown()
-        }
+        val indication = TestPressIndication { countDownLatch.countDown() }
         rule.setContent {
-            Box(
-                Modifier
-                    .testTag(testTag)
-                    .size(100.dp)
-                    .indication(interactionSource, indication))
+            Box(Modifier.testTag(testTag).size(100.dp).indication(interactionSource, indication))
         }
         assertThat(countDownLatch.await(1000, TimeUnit.MILLISECONDS)).isTrue()
     }
@@ -91,15 +84,10 @@
     fun indicationNodeFactory_drawIsCalled() {
         val interactionSource = MutableInteractionSource()
         val countDownLatch = CountDownLatch(1)
-        val indication = TestPressIndicationNodeFactory(onCreate = null, onDraw = {
-            countDownLatch.countDown()
-        })
+        val indication =
+            TestPressIndicationNodeFactory(onCreate = null, onDraw = { countDownLatch.countDown() })
         rule.setContent {
-            Box(
-                Modifier
-                    .testTag(testTag)
-                    .size(100.dp)
-                    .indication(interactionSource, indication))
+            Box(Modifier.testTag(testTag).size(100.dp).indication(interactionSource, indication))
         }
         assertThat(countDownLatch.await(1000, TimeUnit.MILLISECONDS)).isTrue()
     }
@@ -113,9 +101,7 @@
 
         val interactionSource = MutableInteractionSource()
 
-        val indication = TestPressIndication {
-            drawCalls++
-        }
+        val indication = TestPressIndication { drawCalls++ }
 
         rule.setContent {
             Box(Modifier.testTag(testTag).size(100.dp).indication(interactionSource, indication))
@@ -124,20 +110,12 @@
         // Due to b/302303969 there are no guarantees runOnIdle() will wait for drawing to happen
         rule.waitUntil { drawCalls == 1 }
 
-        rule.runOnUiThread {
-            runBlocking {
-                interactionSource.emit(press)
-            }
-        }
+        rule.runOnUiThread { runBlocking { interactionSource.emit(press) } }
 
         // Due to b/302303969 there are no guarantees runOnIdle() will wait for drawing to happen
         rule.waitUntil { drawCalls == 2 }
 
-        rule.runOnUiThread {
-            runBlocking {
-                interactionSource.emit(release)
-            }
-        }
+        rule.runOnUiThread { runBlocking { interactionSource.emit(release) } }
 
         // Due to b/302303969 there are no guarantees runOnIdle() will wait for drawing to happen
         rule.waitUntil { drawCalls == 3 }
@@ -152,12 +130,7 @@
 
         val interactionSource = MutableInteractionSource()
 
-        val indication = TestPressIndicationNodeFactory(
-            onDraw = {
-                drawCalls++
-            },
-            onCreate = null
-        )
+        val indication = TestPressIndicationNodeFactory(onDraw = { drawCalls++ }, onCreate = null)
 
         rule.setContent {
             Box(Modifier.testTag(testTag).size(100.dp).indication(interactionSource, indication))
@@ -166,20 +139,12 @@
         // Due to b/302303969 there are no guarantees runOnIdle() will wait for drawing to happen
         rule.waitUntil { drawCalls == 1 }
 
-        rule.runOnUiThread {
-            runBlocking {
-                interactionSource.emit(press)
-            }
-        }
+        rule.runOnUiThread { runBlocking { interactionSource.emit(press) } }
 
         // Due to b/302303969 there are no guarantees runOnIdle() will wait for drawing to happen
         rule.waitUntil { drawCalls == 2 }
 
-        rule.runOnUiThread {
-            runBlocking {
-                interactionSource.emit(release)
-            }
-        }
+        rule.runOnUiThread { runBlocking { interactionSource.emit(release) } }
 
         // Due to b/302303969 there are no guarantees runOnIdle() will wait for drawing to happen
         rule.waitUntil { drawCalls == 3 }
@@ -193,10 +158,8 @@
             val modifier = Modifier.indication(state, indication) as InspectableValue
             assertThat(modifier.nameFallback).isEqualTo("indication")
             assertThat(modifier.valueOverride).isNull()
-            assertThat(modifier.inspectableElements.map { it.name }.asIterable()).containsExactly(
-                "indication",
-                "interactionSource"
-            )
+            assertThat(modifier.inspectableElements.map { it.name }.asIterable())
+                .containsExactly("indication", "interactionSource")
         }
     }
 
@@ -208,10 +171,8 @@
             val modifier = Modifier.indication(state, indication) as InspectableValue
             assertThat(modifier.nameFallback).isEqualTo("indication")
             assertThat(modifier.valueOverride).isNull()
-            assertThat(modifier.inspectableElements.map { it.name }.asIterable()).containsExactly(
-                "indication",
-                "interactionSource"
-            )
+            assertThat(modifier.inspectableElements.map { it.name }.asIterable())
+                .containsExactly("indication", "interactionSource")
         }
     }
 
@@ -220,19 +181,11 @@
         var interactionSource by mutableStateOf(MutableInteractionSource())
         var createCalls = 0
         var drawCalls = 0
-        val indication = TestPressIndicationNodeFactory(
-            onCreate = {
-                createCalls++
-            },
-            onDraw = {
-                drawCalls++
-            }
-        )
+        val indication =
+            TestPressIndicationNodeFactory(onCreate = { createCalls++ }, onDraw = { drawCalls++ })
 
         rule.setContent {
-            Box(
-                Modifier.testTag(testTag).size(100.dp).indication(interactionSource, indication)
-            )
+            Box(Modifier.testTag(testTag).size(100.dp).indication(interactionSource, indication))
         }
 
         // Due to b/302303969 there are no guarantees runOnIdle() will wait for drawing to happen
@@ -260,23 +213,15 @@
     fun indicationNodeFactory_reuse_sameIndicationInstance() {
         val interactionSource = MutableInteractionSource()
         var createCalls = 0
-        val onCreate: () -> Unit = {
-            createCalls++
-        }
-        val indication = TestPressIndicationNodeFactory(
-            onCreate = onCreate,
-            onDraw = null
-        )
+        val onCreate: () -> Unit = { createCalls++ }
+        val indication = TestPressIndicationNodeFactory(onCreate = onCreate, onDraw = null)
 
         var state by mutableStateOf(false)
 
         rule.setContent {
             // state read to force recomposition
-            @Suppress("UNUSED_VARIABLE")
-            val readState = state
-            Box(
-                Modifier.testTag(testTag).size(100.dp).indication(interactionSource, indication)
-            )
+            @Suppress("UNUSED_VARIABLE") val readState = state
+            Box(Modifier.testTag(testTag).size(100.dp).indication(interactionSource, indication))
         }
 
         rule.runOnIdle {
@@ -295,18 +240,12 @@
     fun indicationNodeFactory_reuse_differentIndicationInstance_comparesEqual() {
         val interactionSource = MutableInteractionSource()
         var createCalls = 0
-        val onCreate: () -> Unit = {
-            createCalls++
-        }
-        var indication by mutableStateOf(TestPressIndicationNodeFactory(
-            onCreate = onCreate,
-            onDraw = null
-        ))
+        val onCreate: () -> Unit = { createCalls++ }
+        var indication by
+            mutableStateOf(TestPressIndicationNodeFactory(onCreate = onCreate, onDraw = null))
 
         rule.setContent {
-            Box(
-                Modifier.testTag(testTag).size(100.dp).indication(interactionSource, indication)
-            )
+            Box(Modifier.testTag(testTag).size(100.dp).indication(interactionSource, indication))
         }
 
         rule.runOnIdle {
@@ -326,19 +265,16 @@
         val interactionSource = MutableInteractionSource()
         var createCalls = 0
         var drawnNode = 0
-        var indication by mutableStateOf(TestPressIndicationNodeFactory(
-            onCreate = {
-                createCalls++
-            },
-            onDraw = {
-                 drawnNode = 1
-            }
-        ))
+        var indication by
+            mutableStateOf(
+                TestPressIndicationNodeFactory(
+                    onCreate = { createCalls++ },
+                    onDraw = { drawnNode = 1 }
+                )
+            )
 
         rule.setContent {
-            Box(
-                Modifier.testTag(testTag).size(100.dp).indication(interactionSource, indication)
-            )
+            Box(Modifier.testTag(testTag).size(100.dp).indication(interactionSource, indication))
         }
 
         // Due to b/302303969 there are no guarantees runOnIdle() will wait for drawing to happen
@@ -350,14 +286,11 @@
             // Reset drawn node
             drawnNode = 0
             // Create a new indication instance that should not compare equal
-            indication = TestPressIndicationNodeFactory(
-                onCreate = {
-                    createCalls++
-                },
-                onDraw = {
-                    drawnNode = 2
-                }
-            )
+            indication =
+                TestPressIndicationNodeFactory(
+                    onCreate = { createCalls++ },
+                    onDraw = { drawnNode = 2 }
+                )
         }
 
         // Due to b/302303969 there are no guarantees runOnIdle() will wait for drawing to happen
@@ -373,8 +306,8 @@
 }
 
 /**
- * Simple [Indication] that draws a black overlay for pressed state. [rememberUpdatedInstance]
- * is deprecated, but this exists to test the backwards compat path for older indication
+ * Simple [Indication] that draws a black overlay for pressed state. [rememberUpdatedInstance] is
+ * deprecated, but this exists to test the backwards compat path for older indication
  * implementations.
  *
  * @param onDraw lambda executed when draw is called for the created instance
@@ -419,8 +352,7 @@
                     val pressInteractions = mutableListOf<PressInteraction.Press>()
                     interactionSource.interactions.collect { interaction ->
                         when (interaction) {
-                            is PressInteraction.Press ->
-                                pressInteractions.add(interaction)
+                            is PressInteraction.Press -> pressInteractions.add(interaction)
                             is PressInteraction.Release ->
                                 pressInteractions.remove(interaction.press)
                             is PressInteraction.Cancel ->
diff --git a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/InteractionSourceTest.kt b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/InteractionSourceTest.kt
index 37f2f63..9eb578a 100644
--- a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/InteractionSourceTest.kt
+++ b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/InteractionSourceTest.kt
@@ -45,11 +45,12 @@
 @RunWith(AndroidJUnit4::class)
 class InteractionSourceTest {
 
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
     private object TestInteraction1 : Interaction
+
     private object TestInteraction2 : Interaction
+
     private object TestInteraction3 : Interaction
 
     @OptIn(ExperimentalCoroutinesApi::class)
@@ -61,11 +62,7 @@
 
         val scope = TestScope(UnconfinedTestDispatcher())
 
-        scope.launch {
-            interactionSource.interactions.collect {
-                interactions.add(it)
-            }
-        }
+        scope.launch { interactionSource.interactions.collect { interactions.add(it) } }
 
         scope.launch {
             interactionSource.emit(TestInteraction1)
@@ -74,15 +71,11 @@
 
         rule.runOnIdle {
             assertThat(interactions)
-                .containsExactlyElementsIn(
-                    listOf(TestInteraction1, TestInteraction2)
-                )
+                .containsExactlyElementsIn(listOf(TestInteraction1, TestInteraction2))
                 .inOrder()
         }
 
-        scope.launch {
-            interactionSource.emit(TestInteraction3)
-        }
+        scope.launch { interactionSource.emit(TestInteraction3) }
 
         rule.runOnIdle {
             assertThat(interactions)
@@ -105,9 +98,7 @@
             isDragged = interactionSource.collectIsDraggedAsState()
         }
 
-        rule.runOnIdle {
-            assertThat(isDragged!!.value).isFalse()
-        }
+        rule.runOnIdle { assertThat(isDragged!!.value).isFalse() }
 
         var dragStart: DragInteraction.Start? = null
 
@@ -116,17 +107,11 @@
             interactionSource.emit(dragStart!!)
         }
 
-        rule.runOnIdle {
-            assertThat(isDragged!!.value).isTrue()
-        }
+        rule.runOnIdle { assertThat(isDragged!!.value).isTrue() }
 
-        scope!!.launch {
-            interactionSource.emit(DragInteraction.Stop(dragStart!!))
-        }
+        scope!!.launch { interactionSource.emit(DragInteraction.Stop(dragStart!!)) }
 
-        rule.runOnIdle {
-            assertThat(isDragged!!.value).isFalse()
-        }
+        rule.runOnIdle { assertThat(isDragged!!.value).isFalse() }
     }
 
     @Test
@@ -141,9 +126,7 @@
             isDragged = interactionSource.collectIsDraggedAsState()
         }
 
-        rule.runOnIdle {
-            assertThat(isDragged!!.value).isFalse()
-        }
+        rule.runOnIdle { assertThat(isDragged!!.value).isFalse() }
 
         var dragStart: DragInteraction.Start? = null
 
@@ -152,9 +135,7 @@
             interactionSource.emit(dragStart!!)
         }
 
-        rule.runOnIdle {
-            assertThat(isDragged!!.value).isTrue()
-        }
+        rule.runOnIdle { assertThat(isDragged!!.value).isTrue() }
 
         var dragStart2: DragInteraction.Start? = null
 
@@ -163,25 +144,15 @@
             interactionSource.emit(dragStart2!!)
         }
 
-        rule.runOnIdle {
-            assertThat(isDragged!!.value).isTrue()
-        }
+        rule.runOnIdle { assertThat(isDragged!!.value).isTrue() }
 
-        scope!!.launch {
-            interactionSource.emit(DragInteraction.Stop(dragStart!!))
-        }
+        scope!!.launch { interactionSource.emit(DragInteraction.Stop(dragStart!!)) }
 
-        rule.runOnIdle {
-            assertThat(isDragged!!.value).isTrue()
-        }
+        rule.runOnIdle { assertThat(isDragged!!.value).isTrue() }
 
-        scope!!.launch {
-            interactionSource.emit(DragInteraction.Cancel(dragStart2!!))
-        }
+        scope!!.launch { interactionSource.emit(DragInteraction.Cancel(dragStart2!!)) }
 
-        rule.runOnIdle {
-            assertThat(isDragged!!.value).isFalse()
-        }
+        rule.runOnIdle { assertThat(isDragged!!.value).isFalse() }
     }
 
     @Test
@@ -196,9 +167,7 @@
             isFocused = interactionSource.collectIsFocusedAsState()
         }
 
-        rule.runOnIdle {
-            assertThat(isFocused!!.value).isFalse()
-        }
+        rule.runOnIdle { assertThat(isFocused!!.value).isFalse() }
 
         var focus: FocusInteraction.Focus? = null
 
@@ -207,17 +176,11 @@
             interactionSource.emit(focus!!)
         }
 
-        rule.runOnIdle {
-            assertThat(isFocused!!.value).isTrue()
-        }
+        rule.runOnIdle { assertThat(isFocused!!.value).isTrue() }
 
-        scope!!.launch {
-            interactionSource.emit(FocusInteraction.Unfocus(focus!!))
-        }
+        scope!!.launch { interactionSource.emit(FocusInteraction.Unfocus(focus!!)) }
 
-        rule.runOnIdle {
-            assertThat(isFocused!!.value).isFalse()
-        }
+        rule.runOnIdle { assertThat(isFocused!!.value).isFalse() }
     }
 
     @Test
@@ -232,9 +195,7 @@
             isFocused = interactionSource.collectIsFocusedAsState()
         }
 
-        rule.runOnIdle {
-            assertThat(isFocused!!.value).isFalse()
-        }
+        rule.runOnIdle { assertThat(isFocused!!.value).isFalse() }
 
         var focus: FocusInteraction.Focus? = null
 
@@ -243,9 +204,7 @@
             interactionSource.emit(focus!!)
         }
 
-        rule.runOnIdle {
-            assertThat(isFocused!!.value).isTrue()
-        }
+        rule.runOnIdle { assertThat(isFocused!!.value).isTrue() }
 
         var focus2: FocusInteraction.Focus? = null
 
@@ -254,25 +213,15 @@
             interactionSource.emit(focus2!!)
         }
 
-        rule.runOnIdle {
-            assertThat(isFocused!!.value).isTrue()
-        }
+        rule.runOnIdle { assertThat(isFocused!!.value).isTrue() }
 
-        scope!!.launch {
-            interactionSource.emit(FocusInteraction.Unfocus(focus!!))
-        }
+        scope!!.launch { interactionSource.emit(FocusInteraction.Unfocus(focus!!)) }
 
-        rule.runOnIdle {
-            assertThat(isFocused!!.value).isTrue()
-        }
+        rule.runOnIdle { assertThat(isFocused!!.value).isTrue() }
 
-        scope!!.launch {
-            interactionSource.emit(FocusInteraction.Unfocus(focus2!!))
-        }
+        scope!!.launch { interactionSource.emit(FocusInteraction.Unfocus(focus2!!)) }
 
-        rule.runOnIdle {
-            assertThat(isFocused!!.value).isFalse()
-        }
+        rule.runOnIdle { assertThat(isFocused!!.value).isFalse() }
     }
 
     @Test
@@ -287,9 +236,7 @@
             isPressed = interactionSource.collectIsPressedAsState()
         }
 
-        rule.runOnIdle {
-            assertThat(isPressed!!.value).isFalse()
-        }
+        rule.runOnIdle { assertThat(isPressed!!.value).isFalse() }
 
         var press: PressInteraction.Press? = null
 
@@ -298,17 +245,11 @@
             interactionSource.emit(press!!)
         }
 
-        rule.runOnIdle {
-            assertThat(isPressed!!.value).isTrue()
-        }
+        rule.runOnIdle { assertThat(isPressed!!.value).isTrue() }
 
-        scope!!.launch {
-            interactionSource.emit(PressInteraction.Release(press!!))
-        }
+        scope!!.launch { interactionSource.emit(PressInteraction.Release(press!!)) }
 
-        rule.runOnIdle {
-            assertThat(isPressed!!.value).isFalse()
-        }
+        rule.runOnIdle { assertThat(isPressed!!.value).isFalse() }
     }
 
     @Test
@@ -323,9 +264,7 @@
             isPressed = interactionSource.collectIsPressedAsState()
         }
 
-        rule.runOnIdle {
-            assertThat(isPressed!!.value).isFalse()
-        }
+        rule.runOnIdle { assertThat(isPressed!!.value).isFalse() }
 
         var press: PressInteraction.Press? = null
 
@@ -334,9 +273,7 @@
             interactionSource.emit(press!!)
         }
 
-        rule.runOnIdle {
-            assertThat(isPressed!!.value).isTrue()
-        }
+        rule.runOnIdle { assertThat(isPressed!!.value).isTrue() }
 
         var press2: PressInteraction.Press? = null
 
@@ -345,24 +282,14 @@
             interactionSource.emit(press2!!)
         }
 
-        rule.runOnIdle {
-            assertThat(isPressed!!.value).isTrue()
-        }
+        rule.runOnIdle { assertThat(isPressed!!.value).isTrue() }
 
-        scope!!.launch {
-            interactionSource.emit(PressInteraction.Release(press!!))
-        }
+        scope!!.launch { interactionSource.emit(PressInteraction.Release(press!!)) }
 
-        rule.runOnIdle {
-            assertThat(isPressed!!.value).isTrue()
-        }
+        rule.runOnIdle { assertThat(isPressed!!.value).isTrue() }
 
-        scope!!.launch {
-            interactionSource.emit(PressInteraction.Cancel(press2!!))
-        }
+        scope!!.launch { interactionSource.emit(PressInteraction.Cancel(press2!!)) }
 
-        rule.runOnIdle {
-            assertThat(isPressed!!.value).isFalse()
-        }
+        rule.runOnIdle { assertThat(isPressed!!.value).isFalse() }
     }
 }
diff --git a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/LazyListFocusableInteractionTest.kt b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/LazyListFocusableInteractionTest.kt
index 4a83d52..fc72a33 100644
--- a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/LazyListFocusableInteractionTest.kt
+++ b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/LazyListFocusableInteractionTest.kt
@@ -84,14 +84,14 @@
     companion object {
         @JvmStatic
         @Parameterized.Parameters(name = "{0}")
-        fun initParameters() = arrayOf(
-            arrayOf(Vertical),
-            arrayOf(Horizontal),
-        )
+        fun initParameters() =
+            arrayOf(
+                arrayOf(Vertical),
+                arrayOf(Horizontal),
+            )
     }
 
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
     private val scrollableAreaTag = "scrollableArea"
     private val focusableTag = "focusable"
@@ -116,13 +116,12 @@
         rule.setContentForTest {
             ScrollableRowOrColumn(size = viewportSize) {
                 // Put a focusable at the end of the viewport.
-                WithSpacerBefore(size = 90.toDp()) {
-                    TestFocusable(size = 10.toDp())
-                }
+                WithSpacerBefore(size = 90.toDp()) { TestFocusable(size = 10.toDp()) }
             }
         }
         requestFocusAndScrollToStart()
-        rule.onNodeWithTag(focusableTag)
+        rule
+            .onNodeWithTag(focusableTag)
             .assertScrollAxisPositionInRootIsEqualTo(90.toDp())
             .assertIsDisplayed()
             .assertIsFocused()
@@ -130,7 +129,8 @@
         // Act: Shrink the viewport.
         viewportSize = 50.toDp()
 
-        rule.onNodeWithTag(focusableTag)
+        rule
+            .onNodeWithTag(focusableTag)
             .assertScrollAxisPositionInRootIsEqualTo(40.toDp())
             .assertIsDisplayed()
     }
@@ -142,13 +142,12 @@
         rule.setContentForTest {
             ScrollableRowOrColumn(size = viewportSize) {
                 // Put a focusable in the bottom of the viewport.
-                WithSpacerBefore(90.toDp()) {
-                    TestFocusable(size = 10.toDp())
-                }
+                WithSpacerBefore(90.toDp()) { TestFocusable(size = 10.toDp()) }
             }
         }
         requestFocusAndScrollToStart()
-        rule.onNodeWithTag(focusableTag)
+        rule
+            .onNodeWithTag(focusableTag)
             .assertScrollAxisPositionInRootIsEqualTo(90.toDp())
             .assertIsDisplayed()
             .assertIsFocused()
@@ -156,7 +155,8 @@
         // Act: Shrink the viewport.
         viewportSize = 95.toDp()
 
-        rule.onNodeWithTag(focusableTag)
+        rule
+            .onNodeWithTag(focusableTag)
             .assertScrollAxisPositionInRootIsEqualTo(85.toDp())
             .assertIsDisplayed()
     }
@@ -168,13 +168,12 @@
         rule.setContentForTest {
             ScrollableRowOrColumn(size = viewportSize) {
                 // Put a focusable in the bottom of the viewport.
-                WithSpacerBefore(size = 90.toDp()) {
-                    TestFocusable(size = 10.toDp())
-                }
+                WithSpacerBefore(size = 90.toDp()) { TestFocusable(size = 10.toDp()) }
             }
         }
         requestFocusAndScrollToStart()
-        rule.onNodeWithTag(focusableTag)
+        rule
+            .onNodeWithTag(focusableTag)
             .assertScrollAxisPositionInRootIsEqualTo(90.toDp())
             .assertIsDisplayed()
             .assertIsFocused()
@@ -182,7 +181,8 @@
         // Act: Shrink the viewport.
         viewportSize = 91.toDp()
 
-        rule.onNodeWithTag(focusableTag)
+        rule
+            .onNodeWithTag(focusableTag)
             .assertScrollAxisPositionInRootIsEqualTo(90.toDp())
             .assertIsDisplayed()
     }
@@ -193,13 +193,12 @@
 
         rule.setContentForTest {
             ScrollableRowOrColumn(size = viewportSize) {
-                WithSpacerBefore(90.toDp()) {
-                    TestFocusable(size = 10.toDp())
-                }
+                WithSpacerBefore(90.toDp()) { TestFocusable(size = 10.toDp()) }
             }
         }
         requestFocusAndScrollToStart()
-        rule.onNodeWithTag(focusableTag)
+        rule
+            .onNodeWithTag(focusableTag)
             .assertScrollAxisPositionInRootIsEqualTo(90.toDp())
             .assertIsDisplayed()
             .assertIsFocused()
@@ -207,7 +206,8 @@
         // Act: Shrink the viewport.
         viewportSize = 90.toDp()
 
-        rule.onNodeWithTag(focusableTag)
+        rule
+            .onNodeWithTag(focusableTag)
             .assertScrollAxisPositionInRootIsEqualTo(90.toDp())
             .assertIsNotDisplayed()
     }
@@ -229,27 +229,23 @@
                     // Manually execute an "animation" that shrinks the viewport by twice the
                     // focusable's size on every frame, for a few frames. The underlying bug in
                     // b/230756508 would lose track of the focusable after the second frame.
-                    withFrameNanos {
-                        viewportSize = 80.toDp()
-                    }
-                    withFrameNanos {
-                        viewportSize = 60.toDp()
-                    }
-                    withFrameNanos {
-                        viewportSize = 40.toDp()
-                    }
+                    withFrameNanos { viewportSize = 80.toDp() }
+                    withFrameNanos { viewportSize = 60.toDp() }
+                    withFrameNanos { viewportSize = 40.toDp() }
                 }
             }
         }
         requestFocusAndScrollToStart()
-        rule.onNodeWithTag(focusableTag)
+        rule
+            .onNodeWithTag(focusableTag)
             .assertScrollAxisPositionInRootIsEqualTo(90.toDp())
             .assertIsDisplayed()
             .assertIsFocused()
 
         animate = true
 
-        rule.onNodeWithTag(focusableTag)
+        rule
+            .onNodeWithTag(focusableTag)
             .assertScrollAxisPositionInRootIsEqualTo(30.toDp())
             .assertIsDisplayed()
     }
@@ -266,7 +262,8 @@
             }
         }
         requestFocusAndScrollToStart()
-        rule.onNodeWithTag(focusableTag)
+        rule
+            .onNodeWithTag(focusableTag)
             .assertScrollAxisPositionInRootIsEqualTo(90.toDp())
             .assertIsDisplayed()
             .assertIsFocused()
@@ -279,26 +276,24 @@
         rule.waitForIdle()
 
         // Interrupt the scroll by manually dragging.
-        rule.onNodeWithTag(scrollableAreaTag)
-            .performTouchInput {
-                down(center)
-                moveBy(Offset(viewConfiguration.touchSlop + 1, viewConfiguration.touchSlop + 1))
-                up()
-            }
+        rule.onNodeWithTag(scrollableAreaTag).performTouchInput {
+            down(center)
+            moveBy(Offset(viewConfiguration.touchSlop + 1, viewConfiguration.touchSlop + 1))
+            up()
+        }
 
         // Resume the clock. The animation scroll animation should have been interrupted and not
         // continue.
         rule.mainClock.advanceTimeByFrame()
         rule.mainClock.autoAdvance = true
 
-        rule.onNodeWithTag(focusableTag)
-            .assertIsNotDisplayed()
+        rule.onNodeWithTag(focusableTag).assertIsNotDisplayed()
     }
 
     /**
      * This test ensures that scrollable correctly cleans up its state when the scroll animation
-     * triggered by shrinking the viewport is interrupted by something other than another shrink
-     * and the focusable child does not change. If it's cleaned up correctly, expanding then re-
+     * triggered by shrinking the viewport is interrupted by something other than another shrink and
+     * the focusable child does not change. If it's cleaned up correctly, expanding then re-
      * shrinking the viewport should trigger another animation.
      */
     @Test
@@ -313,7 +308,8 @@
             }
         }
         requestFocusAndScrollToStart()
-        rule.onNodeWithTag(focusableTag)
+        rule
+            .onNodeWithTag(focusableTag)
             .assertScrollAxisPositionInRootIsEqualTo(90.toDp())
             .assertIsDisplayed()
             .assertIsFocused()
@@ -326,21 +322,18 @@
         rule.waitForIdle()
 
         // Interrupt the scroll by manually dragging.
-        rule.onNodeWithTag(scrollableAreaTag)
-            .performTouchInput {
-                down(center)
-                moveBy(Offset(viewConfiguration.touchSlop + 1, viewConfiguration.touchSlop + 1))
-                up()
-            }
+        rule.onNodeWithTag(scrollableAreaTag).performTouchInput {
+            down(center)
+            moveBy(Offset(viewConfiguration.touchSlop + 1, viewConfiguration.touchSlop + 1))
+            up()
+        }
 
         // Resume the clock. The animation scroll animation should have been interrupted and not
         // continue.
         rule.mainClock.advanceTimeByFrame()
         rule.mainClock.autoAdvance = true
         rule.waitForIdle()
-        rule.onNodeWithTag(focusableTag)
-            .assertIsFocused()
-            .assertIsNotDisplayed()
+        rule.onNodeWithTag(focusableTag).assertIsFocused().assertIsNotDisplayed()
 
         // Expand the viewport back to its original size to bring the focusable back into view.
         viewportSize = 100.toDp()
@@ -351,8 +344,7 @@
         viewportSize = 50.toDp()
         rule.waitForIdle()
 
-        rule.onNodeWithTag(focusableTag)
-            .assertIsDisplayed()
+        rule.onNodeWithTag(focusableTag).assertIsDisplayed()
     }
 
     @Test
@@ -363,29 +355,21 @@
         rule.setContentForTest {
             ScrollableRowOrColumn(viewportSize) {
                 // Put a focusable just out of view.
-                WithSpacerBefore(size = gapSize) {
-                    TestFocusable(10.toDp())
-                }
+                WithSpacerBefore(size = gapSize) { TestFocusable(10.toDp()) }
             }
         }
-        runBlockingOnIdle {
-            scrollState.scrollToItem(1)
-        }
+        runBlockingOnIdle { scrollState.scrollToItem(1) }
         requestFocus()
         rule.waitForIdle()
         scrollToStart()
 
-        rule.onNodeWithTag(focusableTag)
-            .assertIsNotDisplayed()
-            .assertIsFocused()
+        rule.onNodeWithTag(focusableTag).assertIsNotDisplayed().assertIsFocused()
 
         // Act: Shrink the viewport.
         viewportSize = 50.toDp()
 
         // Focusable should not have moved since it was never in view.
-        rule.onNodeWithTag(focusableTag)
-            .assertIsNotDisplayed()
-            .assertIsFocused()
+        rule.onNodeWithTag(focusableTag).assertIsNotDisplayed().assertIsFocused()
     }
 
     @Test
@@ -395,12 +379,11 @@
         rule.setContent {
             ScrollableRowOrColumn(size = viewportSize) {
                 // Put a focusable in the bottom of the viewport.
-                WithSpacerBefore(size = 90.toDp()) {
-                    TestFocusable(size = 10.toDp())
-                }
+                WithSpacerBefore(size = 90.toDp()) { TestFocusable(size = 10.toDp()) }
             }
         }
-        rule.onNodeWithTag(focusableTag)
+        rule
+            .onNodeWithTag(focusableTag)
             .assertScrollAxisPositionInRootIsEqualTo(90.toDp())
             .assertIsDisplayed()
             .assertIsNotFocused()
@@ -408,8 +391,7 @@
         // Act: Shrink the viewport.
         viewportSize = 50.toDp()
 
-        rule.onNodeWithTag(focusableTag)
-            .assertIsNotDisplayed()
+        rule.onNodeWithTag(focusableTag).assertIsNotDisplayed()
     }
 
     @Test
@@ -428,9 +410,7 @@
             }
         }
         // Scroll the item to the end of the viewport so we can request focus.
-        runBlockingOnIdle {
-            scrollState.scrollToItem(1, scrollOffset = -(viewportSize - itemSize))
-        }
+        runBlockingOnIdle { scrollState.scrollToItem(1, scrollOffset = -(viewportSize - itemSize)) }
         requestFocus()
 
         // Requesting focus will bring the entire focused item into view (at the end of the
@@ -441,7 +421,8 @@
             scrollState.scrollBy(-halfFocusableSize)
         }
 
-        rule.onNodeWithTag(focusableTag)
+        rule
+            .onNodeWithTag(focusableTag)
             .assertScrollAxisPositionInRootIsEqualTo((initialViewPortSize - (itemSize / 2)).toDp())
             .assertIsDisplayed()
             .assertIsFocused()
@@ -449,7 +430,8 @@
         // Act: Grow the viewport.
         viewportSize *= 2
 
-        rule.onNodeWithTag(focusableTag)
+        rule
+            .onNodeWithTag(focusableTag)
             .assertScrollAxisPositionInRootIsEqualTo((initialViewPortSize - (itemSize / 2)).toDp())
             .assertIsDisplayed()
     }
@@ -460,24 +442,12 @@
 
         @Composable
         fun Focusable1() {
-            Box(
-                Modifier
-                    .size(10.toDp())
-                    .background(Color.Blue)
-                    .testTag("focusable1")
-                    .focusable()
-            )
+            Box(Modifier.size(10.toDp()).background(Color.Blue).testTag("focusable1").focusable())
         }
 
         @Composable
         fun Focusable2() {
-            Box(
-                Modifier
-                    .size(10.toDp())
-                    .background(Color.Blue)
-                    .testTag("focusable2")
-                    .focusable()
-            )
+            Box(Modifier.size(10.toDp()).background(Color.Blue).testTag("focusable2").focusable())
         }
 
         rule.setContentForTest {
@@ -488,37 +458,27 @@
             }
         }
         // When focusable2 gets focus, focusable1 should be scrolled out of view.
-        runBlockingOnIdle {
-            scrollState.scrollToItem(2)
-        }
+        runBlockingOnIdle { scrollState.scrollToItem(2) }
         requestFocus("focusable2")
         rule.onNodeWithTag("focusable1").assertIsNotDisplayed()
-        rule.onNodeWithTag("focusable2")
-            .assertIsDisplayed()
-            .assertIsFocused()
+        rule.onNodeWithTag("focusable2").assertIsDisplayed().assertIsFocused()
         // Pause the clock because we need to do some work in the middle of an animation.
         rule.mainClock.autoAdvance = false
 
         // Shrink the viewport, which should scroll to keep focusable2 in-view.
-        rule.runOnIdle {
-            viewportSize = 20.toDp()
-        }
+        rule.runOnIdle { viewportSize = 20.toDp() }
 
         // Tick the clock forward to let the animation start and run a bit.
         repeat(3) { rule.mainClock.advanceTimeByFrame() }
         rule.onNodeWithTag("focusable1").assertIsNotDisplayed()
         rule.onNodeWithTag("focusable2").assertIsNotDisplayed()
 
-        rule.runOnIdle {
-            focusManager.moveFocus(Previous)
-        }
+        rule.runOnIdle { focusManager.moveFocus(Previous) }
         // Resume the clock, allow animation to finish.
         rule.mainClock.autoAdvance = true
 
         rule.onNodeWithTag("focusable2").assertIsNotDisplayed()
-        rule.onNodeWithTag("focusable1")
-            .assertIsDisplayed()
-            .assertIsFocused()
+        rule.onNodeWithTag("focusable1").assertIsDisplayed().assertIsFocused()
     }
 
     @Test
@@ -567,9 +527,7 @@
         }
 
         // Assert.
-        rule.onNodeWithTag("finalFocusable")
-            .assertIsDisplayed()
-            .assertIsFocused()
+        rule.onNodeWithTag("finalFocusable").assertIsDisplayed().assertIsFocused()
         rule.runOnIdle {
             assertThat(scrollState.firstVisibleItemIndex).isEqualTo(1)
             assertThat(scrollState.firstVisibleItemScrollOffset).isEqualTo(0)
@@ -590,9 +548,7 @@
         requestFocus("2")
 
         // Act.
-        rule.runOnIdle {
-            focusManager.moveFocus(Next)
-        }
+        rule.runOnIdle { focusManager.moveFocus(Next) }
 
         // Assert.
         rule.onNodeWithTag("finalFocusable").assertIsDisplayed()
@@ -600,9 +556,7 @@
         rule.runOnIdle { assertThat(scrollState.firstVisibleItemScrollOffset).isEqualTo(0) }
     }
 
-    private fun ComposeContentTestRule.setContentForTest(
-        composable: @Composable () -> Unit
-    ) {
+    private fun ComposeContentTestRule.setContentForTest(composable: @Composable () -> Unit) {
         setContent {
             scope = rememberCoroutineScope()
             focusManager = LocalFocusManager.current
@@ -611,53 +565,32 @@
     }
 
     @Composable
-    private fun ScrollableRowOrColumn(
-        size: Dp,
-        content: LazyListScope.() -> Unit
-    ) {
-        val modifier = Modifier
-            .testTag(scrollableAreaTag)
-            .size(size)
-            .border(2.toDp(), Color.Black)
+    private fun ScrollableRowOrColumn(size: Dp, content: LazyListScope.() -> Unit) {
+        val modifier = Modifier.testTag(scrollableAreaTag).size(size).border(2.toDp(), Color.Black)
 
         when (orientation) {
             Vertical -> {
-                LazyColumn(
-                    state = scrollState,
-                    modifier = modifier,
-                    content = content
-                )
+                LazyColumn(state = scrollState, modifier = modifier, content = content)
             }
-
             Horizontal -> {
-                LazyRow(
-                    state = scrollState,
-                    modifier = modifier,
-                    content = content
-                )
+                LazyRow(state = scrollState, modifier = modifier, content = content)
             }
         }
     }
 
-    /**
-     * Places a spacer before [content].
-     */
+    /** Places a spacer before [content]. */
     private fun LazyListScope.WithSpacerBefore(size: Dp, content: @Composable () -> Unit) {
         item { Spacer(Modifier.size(size)) }
         item { content() }
     }
 
     @Composable
-    private fun TestFocusable(
-        size: Dp,
-        tag: String = focusableTag
-    ) {
+    private fun TestFocusable(size: Dp, tag: String = focusableTag) {
         val interactionSource = remember { MutableInteractionSource() }
         val isFocused by interactionSource.collectIsFocusedAsState()
 
         Box(
-            Modifier
-                .testTag(tag)
+            Modifier.testTag(tag)
                 .size(size)
                 .border(1.dp, Color.White)
                 .background(if (isFocused) Color.Blue else Color.Black)
@@ -666,9 +599,9 @@
     }
 
     /**
-     * Sizes and offsets of the composables in these tests must be specified using this function.
-     * If they're specified using `xx.dp` syntax, a rounding error somewhere in the layout system
-     * will cause the pixel values to be off-by-one.
+     * Sizes and offsets of the composables in these tests must be specified using this function. If
+     * they're specified using `xx.dp` syntax, a rounding error somewhere in the layout system will
+     * cause the pixel values to be off-by-one.
      */
     private fun Int.toDp(): Dp = with(rule.density) { this@toDp.toDp() }
 
@@ -683,15 +616,11 @@
     }
 
     private fun scrollToStart() {
-        runBlockingOnIdle {
-            scrollState.scrollToItem(0, 0)
-        }
+        runBlockingOnIdle { scrollState.scrollToItem(0, 0) }
     }
 
     private fun runBlockingOnIdle(block: suspend CoroutineScope.() -> Unit) {
-        val job = rule.runOnIdle {
-            scope.launch(block = block)
-        }
+        val job = rule.runOnIdle { scope.launch(block = block) }
         runBlocking { job.join() }
     }
 
diff --git a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/MagnifierTest.kt b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/MagnifierTest.kt
index c49618d5..340553a 100644
--- a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/MagnifierTest.kt
+++ b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/MagnifierTest.kt
@@ -58,8 +58,7 @@
 @RunWith(AndroidJUnit4::class)
 class MagnifierTest {
 
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
     @Before
     fun setUp() {
@@ -76,21 +75,24 @@
     fun magnifier_inspectorValue_whenSupported() {
         val sourceCenterLambda: Density.() -> Offset = { Offset(42f, 42f) }
         val magnifierCenterLambda: Density.() -> Offset = { Offset(42f, 42f) }
-        val modifier = Modifier.magnifier(
-            sourceCenter = sourceCenterLambda,
-            magnifierCenter = magnifierCenterLambda
-        ).findInspectableValue()!!
+        val modifier =
+            Modifier.magnifier(
+                    sourceCenter = sourceCenterLambda,
+                    magnifierCenter = magnifierCenterLambda
+                )
+                .findInspectableValue()!!
         assertThat(modifier.nameFallback).isEqualTo("magnifier")
         assertThat(modifier.valueOverride).isNull()
-        assertThat(modifier.inspectableElements.toList()).containsExactly(
-            ValueElement("sourceCenter", sourceCenterLambda),
-            ValueElement("magnifierCenter", magnifierCenterLambda),
-            ValueElement("zoom", Float.NaN),
-            ValueElement("size", DpSize.Unspecified),
-            ValueElement("cornerRadius", Dp.Unspecified),
-            ValueElement("elevation", Dp.Unspecified),
-            ValueElement("clippingEnabled", true),
-        )
+        assertThat(modifier.inspectableElements.toList())
+            .containsExactly(
+                ValueElement("sourceCenter", sourceCenterLambda),
+                ValueElement("magnifierCenter", magnifierCenterLambda),
+                ValueElement("zoom", Float.NaN),
+                ValueElement("size", DpSize.Unspecified),
+                ValueElement("cornerRadius", Dp.Unspecified),
+                ValueElement("elevation", Dp.Unspecified),
+                ValueElement("clippingEnabled", true),
+            )
     }
 
     @SdkSuppress(maxSdkVersion = 27)
@@ -121,15 +123,11 @@
             }
         }
 
-        rule.runOnIdle {
-            assertThat(magnifierFactory.creationCount).isEqualTo(1)
-        }
+        rule.runOnIdle { assertThat(magnifierFactory.creationCount).isEqualTo(1) }
 
         density = Density(density.density * 2)
 
-        rule.runOnIdle {
-            assertThat(magnifierFactory.creationCount).isEqualTo(2)
-        }
+        rule.runOnIdle { assertThat(magnifierFactory.creationCount).isEqualTo(2) }
     }
 
     @SdkSuppress(minSdkVersion = 28)
@@ -150,15 +148,11 @@
             )
         }
 
-        rule.runOnIdle {
-            assertThat(magnifierFactory.creationCount).isEqualTo(1)
-        }
+        rule.runOnIdle { assertThat(magnifierFactory.creationCount).isEqualTo(1) }
 
         elevation *= 2
 
-        rule.runOnIdle {
-            assertThat(magnifierFactory.creationCount).isEqualTo(2)
-        }
+        rule.runOnIdle { assertThat(magnifierFactory.creationCount).isEqualTo(2) }
     }
 
     @SdkSuppress(minSdkVersion = 28)
@@ -179,15 +173,11 @@
             )
         }
 
-        rule.runOnIdle {
-            assertThat(magnifierFactory.creationCount).isEqualTo(1)
-        }
+        rule.runOnIdle { assertThat(magnifierFactory.creationCount).isEqualTo(1) }
 
         useTextDefault = true
 
-        rule.runOnIdle {
-            assertThat(magnifierFactory.creationCount).isEqualTo(2)
-        }
+        rule.runOnIdle { assertThat(magnifierFactory.creationCount).isEqualTo(2) }
     }
 
     @SdkSuppress(minSdkVersion = 28)
@@ -207,15 +197,11 @@
             )
         }
 
-        rule.runOnIdle {
-            assertThat(magnifierFactory.creationCount).isEqualTo(1)
-        }
+        rule.runOnIdle { assertThat(magnifierFactory.creationCount).isEqualTo(1) }
 
         zoom += 2
 
-        rule.runOnIdle {
-            assertThat(magnifierFactory.creationCount).isEqualTo(2)
-        }
+        rule.runOnIdle { assertThat(magnifierFactory.creationCount).isEqualTo(2) }
     }
 
     @SdkSuppress(minSdkVersion = 28)
@@ -231,20 +217,15 @@
                     zoom = zoom,
                     onSizeChanged = null,
                     platformMagnifierFactory = magnifierFactory
-
                 )
             )
         }
 
-        rule.runOnIdle {
-            assertThat(magnifierFactory.creationCount).isEqualTo(1)
-        }
+        rule.runOnIdle { assertThat(magnifierFactory.creationCount).isEqualTo(1) }
 
         zoom += 2
 
-        rule.runOnIdle {
-            assertThat(magnifierFactory.creationCount).isEqualTo(1)
-        }
+        rule.runOnIdle { assertThat(magnifierFactory.creationCount).isEqualTo(1) }
     }
 
     @SdkSuppress(minSdkVersion = 28)
@@ -278,9 +259,7 @@
 
         drawTrigger++
 
-        rule.runOnIdle {
-            assertThat(platformMagnifier.contentUpdateCount).isEqualTo(2)
-        }
+        rule.runOnIdle { assertThat(platformMagnifier.contentUpdateCount).isEqualTo(2) }
     }
 
     @SdkSuppress(minSdkVersion = 28)
@@ -307,15 +286,11 @@
             )
         }
 
-        rule.runOnIdle {
-            assertThat(platformMagnifier.propertyUpdateCount).isEqualTo(1)
-        }
+        rule.runOnIdle { assertThat(platformMagnifier.propertyUpdateCount).isEqualTo(1) }
 
         drawTrigger++
 
-        rule.runOnIdle {
-            assertThat(platformMagnifier.propertyUpdateCount).isEqualTo(1)
-        }
+        rule.runOnIdle { assertThat(platformMagnifier.propertyUpdateCount).isEqualTo(1) }
     }
 
     @SdkSuppress(minSdkVersion = 28)
@@ -325,8 +300,7 @@
         val platformMagnifier = CountingPlatformMagnifier()
         rule.setContent {
             Box(
-                Modifier
-                    .offset { layoutOffset }
+                Modifier.offset { layoutOffset }
                     .magnifier(
                         sourceCenter = { Offset.Zero },
                         magnifierCenter = { Offset.Unspecified },
@@ -337,15 +311,11 @@
             )
         }
 
-        rule.runOnIdle {
-            assertThat(platformMagnifier.propertyUpdateCount).isEqualTo(1)
-        }
+        rule.runOnIdle { assertThat(platformMagnifier.propertyUpdateCount).isEqualTo(1) }
 
         layoutOffset += IntOffset(10, 1)
 
-        rule.runOnIdle {
-            assertThat(platformMagnifier.propertyUpdateCount).isEqualTo(2)
-        }
+        rule.runOnIdle { assertThat(platformMagnifier.propertyUpdateCount).isEqualTo(2) }
     }
 
     @SdkSuppress(minSdkVersion = 28)
@@ -365,15 +335,11 @@
             )
         }
 
-        rule.runOnIdle {
-            assertThat(platformMagnifier.propertyUpdateCount).isEqualTo(1)
-        }
+        rule.runOnIdle { assertThat(platformMagnifier.propertyUpdateCount).isEqualTo(1) }
 
         sourceCenter += Offset(1f, 1f)
 
-        rule.runOnIdle {
-            assertThat(platformMagnifier.propertyUpdateCount).isEqualTo(2)
-        }
+        rule.runOnIdle { assertThat(platformMagnifier.propertyUpdateCount).isEqualTo(2) }
     }
 
     @SdkSuppress(minSdkVersion = 28)
@@ -393,15 +359,11 @@
             )
         }
 
-        rule.runOnIdle {
-            assertThat(platformMagnifier.propertyUpdateCount).isEqualTo(1)
-        }
+        rule.runOnIdle { assertThat(platformMagnifier.propertyUpdateCount).isEqualTo(1) }
 
         magnifierCenter += Offset(1f, 1f)
 
-        rule.runOnIdle {
-            assertThat(platformMagnifier.propertyUpdateCount).isEqualTo(2)
-        }
+        rule.runOnIdle { assertThat(platformMagnifier.propertyUpdateCount).isEqualTo(2) }
     }
 
     @SdkSuppress(minSdkVersion = 29)
@@ -409,10 +371,7 @@
     fun platformMagnifierModifier_updatesProperties_whenZoomChanged() {
         var zoom by mutableStateOf(1f)
         val platformMagnifier = CountingPlatformMagnifier()
-        val factory = PlatformMagnifierFactory(
-            platformMagnifier,
-            canUpdateZoom = true
-        )
+        val factory = PlatformMagnifierFactory(platformMagnifier, canUpdateZoom = true)
         rule.setContent {
             Box(
                 Modifier.magnifier(
@@ -425,15 +384,11 @@
             )
         }
 
-        rule.runOnIdle {
-            assertThat(platformMagnifier.propertyUpdateCount).isEqualTo(1)
-        }
+        rule.runOnIdle { assertThat(platformMagnifier.propertyUpdateCount).isEqualTo(1) }
 
         zoom += 1f
 
-        rule.runOnIdle {
-            assertThat(platformMagnifier.propertyUpdateCount).isEqualTo(2)
-        }
+        rule.runOnIdle { assertThat(platformMagnifier.propertyUpdateCount).isEqualTo(2) }
     }
 
     @SdkSuppress(minSdkVersion = 28)
@@ -485,9 +440,7 @@
             )
         }
 
-        rule.runOnIdle {
-            assertThat(platformMagnifier.propertyUpdateCount).isEqualTo(1)
-        }
+        rule.runOnIdle { assertThat(platformMagnifier.propertyUpdateCount).isEqualTo(1) }
         val initialDismissCount = rule.runOnIdle { platformMagnifier.dismissCount }
 
         // Now update with an unspecified sourceCenter to hide it.
@@ -531,9 +484,7 @@
     fun platformMagnifierModifier_firesOnSizeChanged_initially() {
         val magnifierSize = IntSize(10, 11)
         val sizeEvents = mutableListOf<DpSize>()
-        val platformMagnifier = CountingPlatformMagnifier().apply {
-            size = magnifierSize
-        }
+        val platformMagnifier = CountingPlatformMagnifier().apply { size = magnifierSize }
         rule.setContent {
             Box(
                 Modifier.magnifier(
@@ -547,11 +498,8 @@
         }
 
         rule.runOnIdle {
-            assertThat(sizeEvents).containsExactly(
-                with(rule.density) {
-                    magnifierSize.toSize().toDpSize()
-                }
-            )
+            assertThat(sizeEvents)
+                .containsExactly(with(rule.density) { magnifierSize.toSize().toDpSize() })
         }
     }
 
@@ -560,9 +508,7 @@
     fun platformMagnifierModifier_doesNotFireOnSizeChanged_initially_whenSourceCenterUnspecified() {
         val magnifierSize = IntSize(10, 11)
         val sizeEvents = mutableListOf<DpSize>()
-        val platformMagnifier = CountingPlatformMagnifier().apply {
-            size = magnifierSize
-        }
+        val platformMagnifier = CountingPlatformMagnifier().apply { size = magnifierSize }
         rule.setContent {
             Box(
                 Modifier.magnifier(
@@ -583,9 +529,7 @@
     fun platformMagnifierModifier_firesOnSizeChanged_afterSourceCenterIsSpecified() {
         val magnifierSize = IntSize(10, 11)
         val sizeEvents = mutableListOf<DpSize>()
-        val platformMagnifier = CountingPlatformMagnifier().apply {
-            size = magnifierSize
-        }
+        val platformMagnifier = CountingPlatformMagnifier().apply { size = magnifierSize }
         var sourceCenter by mutableStateOf(Offset.Unspecified)
         rule.setContent {
             Box(
@@ -604,11 +548,8 @@
         sourceCenter = Offset(1f, 1f)
 
         rule.runOnIdle {
-            assertThat(sizeEvents).containsExactly(
-                with(rule.density) {
-                    magnifierSize.toSize().toDpSize()
-                }
-            )
+            assertThat(sizeEvents)
+                .containsExactly(with(rule.density) { magnifierSize.toSize().toDpSize() })
         }
     }
 
@@ -619,14 +560,10 @@
         val size2 = size1 * 2
         var magnifierSize by mutableStateOf(size1)
         val magnifierDpSize by derivedStateOf {
-            with(rule.density) {
-                magnifierSize.toSize().toDpSize()
-            }
+            with(rule.density) { magnifierSize.toSize().toDpSize() }
         }
         val sizeEvents = mutableListOf<DpSize>()
-        val platformMagnifier = CountingPlatformMagnifier().apply {
-            size = magnifierSize
-        }
+        val platformMagnifier = CountingPlatformMagnifier().apply { size = magnifierSize }
         rule.setContent {
             Box(
                 Modifier.magnifier(
@@ -648,11 +585,11 @@
         }
 
         rule.runOnIdle {
-            assertThat(sizeEvents).containsExactlyElementsIn(
-                listOf(size1, size2).map {
-                    with(rule.density) { it.toSize().toDpSize() }
-                }
-            ).inOrder()
+            assertThat(sizeEvents)
+                .containsExactlyElementsIn(
+                    listOf(size1, size2).map { with(rule.density) { it.toSize().toDpSize() } }
+                )
+                .inOrder()
         }
     }
 
@@ -660,50 +597,47 @@
     @Test
     fun platformMagnifierModifier_reportsSemantics() {
         var magnifierOffset by mutableStateOf(Offset.Zero)
-        rule.setContent {
-            Box(Modifier.magnifier(sourceCenter = { magnifierOffset }))
-        }
-        val getPosition = rule.onNode(keyIsDefined(MagnifierPositionInRoot))
-            .fetchSemanticsNode()
-            .config[MagnifierPositionInRoot]
+        rule.setContent { Box(Modifier.magnifier(sourceCenter = { magnifierOffset })) }
+        val getPosition =
+            rule
+                .onNode(keyIsDefined(MagnifierPositionInRoot))
+                .fetchSemanticsNode()
+                .config[MagnifierPositionInRoot]
 
-        rule.runOnIdle {
-            assertThat(getPosition()).isEqualTo(magnifierOffset)
-        }
+        rule.runOnIdle { assertThat(getPosition()).isEqualTo(magnifierOffset) }
 
         // Move the modifier, same function should return new value.
         magnifierOffset = Offset(42f, 24f)
 
-        rule.runOnIdle {
-            assertThat(getPosition()).isEqualTo(magnifierOffset)
-        }
+        rule.runOnIdle { assertThat(getPosition()).isEqualTo(magnifierOffset) }
     }
 
     private fun PlatformMagnifierFactory(
         platformMagnifier: PlatformMagnifier,
         canUpdateZoom: Boolean = false
-    ) = object : PlatformMagnifierFactory {
-        override val canUpdateZoom: Boolean = canUpdateZoom
-        override fun create(
-            view: View,
-            useTextDefault: Boolean,
-            size: DpSize,
-            cornerRadius: Dp,
-            elevation: Dp,
-            clippingEnabled: Boolean,
-            density: Density,
-            initialZoom: Float
-        ): PlatformMagnifier {
-            return platformMagnifier
+    ) =
+        object : PlatformMagnifierFactory {
+            override val canUpdateZoom: Boolean = canUpdateZoom
+
+            override fun create(
+                view: View,
+                useTextDefault: Boolean,
+                size: DpSize,
+                cornerRadius: Dp,
+                elevation: Dp,
+                clippingEnabled: Boolean,
+                density: Density,
+                initialZoom: Float
+            ): PlatformMagnifier {
+                return platformMagnifier
+            }
         }
-    }
 
     private fun Modifier.findInspectableValue(): InspectableValue? =
         foldIn<InspectableValue?>(null) { acc, element -> acc ?: element as? InspectableValue }
 
-    private class CountingPlatformMagnifierFactory(
-        override val canUpdateZoom: Boolean = false
-    ) : PlatformMagnifierFactory {
+    private class CountingPlatformMagnifierFactory(override val canUpdateZoom: Boolean = false) :
+        PlatformMagnifierFactory {
         var creationCount = 0
 
         override fun create(
@@ -724,18 +658,11 @@
     private object NoopPlatformMagnifier : PlatformMagnifier {
         override val size: IntSize = IntSize.Zero
 
-        override fun updateContent() {
-        }
+        override fun updateContent() {}
 
-        override fun update(
-            sourceCenter: Offset,
-            magnifierCenter: Offset,
-            zoom: Float
-        ) {
-        }
+        override fun update(sourceCenter: Offset, magnifierCenter: Offset, zoom: Float) {}
 
-        override fun dismiss() {
-        }
+        override fun dismiss() {}
     }
 
     private class CountingPlatformMagnifier : PlatformMagnifier {
@@ -749,11 +676,7 @@
             contentUpdateCount++
         }
 
-        override fun update(
-            sourceCenter: Offset,
-            magnifierCenter: Offset,
-            zoom: Float
-        ) {
+        override fun update(sourceCenter: Offset, magnifierCenter: Offset, zoom: Float) {
             propertyUpdateCount++
         }
 
diff --git a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/OverscrollScreenshotTest.kt b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/OverscrollScreenshotTest.kt
index 317a96a..8c44a81 100644
--- a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/OverscrollScreenshotTest.kt
+++ b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/OverscrollScreenshotTest.kt
@@ -50,11 +50,9 @@
 @RunWith(AndroidJUnit4::class)
 @SdkSuppress(minSdkVersion = Build.VERSION_CODES.O)
 class OverscrollScreenshotTest {
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
-    @get:Rule
-    val screenshotRule = AndroidXScreenshotTestRule(GOLDEN_UI)
+    @get:Rule val screenshotRule = AndroidXScreenshotTestRule(GOLDEN_UI)
 
     @get:Rule
     val animationScaleRule: AnimationDurationScaleRule =
@@ -66,20 +64,16 @@
     @Ignore("b/197325932 no animations in screenshot tests")
     fun overscroll_dragTop() {
         animationScaleRule.setAnimationDurationScale(1f)
-        rule.setContent {
-            VerticalScrollable()
+        rule.setContent { VerticalScrollable() }
+
+        rule.onNodeWithTag(overscrollTag).performTouchInput {
+            down(Offset(centerX + width / 2 - 10, centerY))
+            moveBy(Offset(0f, 500f))
+            repeat(5) { moveBy(Offset(0f, 200f)) }
         }
 
-        rule.onNodeWithTag(overscrollTag)
-            .performTouchInput {
-                down(Offset(centerX + width / 2 - 10, centerY))
-                moveBy(Offset(0f, 500f))
-                repeat(5) {
-                    moveBy(Offset(0f, 200f))
-                }
-            }
-
-        rule.onNodeWithTag(overscrollTag)
+        rule
+            .onNodeWithTag(overscrollTag)
             .captureToImage()
             .assertAgainstGolden(screenshotRule, "overscroll_top_origin")
     }
@@ -88,20 +82,16 @@
     @Ignore("b/197325932 no animations in screenshot tests")
     fun overscroll_dragBottom() {
         animationScaleRule.setAnimationDurationScale(1f)
-        rule.setContent {
-            VerticalScrollable()
+        rule.setContent { VerticalScrollable() }
+
+        rule.onNodeWithTag(overscrollTag).performTouchInput {
+            down(Offset(centerX + width / 2 - 10, centerY))
+            moveBy(Offset(0f, -500f))
+            repeat(5) { moveBy(Offset(0f, -200f)) }
         }
 
-        rule.onNodeWithTag(overscrollTag)
-            .performTouchInput {
-                down(Offset(centerX + width / 2 - 10, centerY))
-                moveBy(Offset(0f, -500f))
-                repeat(5) {
-                    moveBy(Offset(0f, -200f))
-                }
-            }
-
-        rule.onNodeWithTag(overscrollTag)
+        rule
+            .onNodeWithTag(overscrollTag)
             .captureToImage()
             .assertAgainstGolden(screenshotRule, "overscroll_bottom_origin")
     }
@@ -110,20 +100,16 @@
     @Ignore("b/197325932 no animations in screenshot tests")
     fun overscroll_dragLeft() {
         animationScaleRule.setAnimationDurationScale(1f)
-        rule.setContent {
-            HorizontalScrollable()
+        rule.setContent { HorizontalScrollable() }
+
+        rule.onNodeWithTag(overscrollTag).performTouchInput {
+            down(Offset(centerX, centerY + height / 2 - 10))
+            moveBy(Offset(500f, 0f))
+            repeat(5) { moveBy(Offset(200f, 0f)) }
         }
 
-        rule.onNodeWithTag(overscrollTag)
-            .performTouchInput {
-                down(Offset(centerX, centerY + height / 2 - 10))
-                moveBy(Offset(500f, 0f))
-                repeat(5) {
-                    moveBy(Offset(200f, 0f))
-                }
-            }
-
-        rule.onNodeWithTag(overscrollTag)
+        rule
+            .onNodeWithTag(overscrollTag)
             .captureToImage()
             .assertAgainstGolden(screenshotRule, "overscroll_left_origin")
     }
@@ -132,20 +118,16 @@
     @Ignore("b/197325932 no animations in screenshot tests")
     fun overscroll_dragRight() {
         animationScaleRule.setAnimationDurationScale(1f)
-        rule.setContent {
-            HorizontalScrollable()
+        rule.setContent { HorizontalScrollable() }
+
+        rule.onNodeWithTag(overscrollTag).performTouchInput {
+            down(Offset(centerX, centerY + height / 2 - 10))
+            moveBy(Offset(-500f, 0f))
+            repeat(5) { moveBy(Offset(-200f, 0f)) }
         }
 
-        rule.onNodeWithTag(overscrollTag)
-            .performTouchInput {
-                down(Offset(centerX, centerY + height / 2 - 10))
-                moveBy(Offset(-500f, 0f))
-                repeat(5) {
-                    moveBy(Offset(-200f, 0f))
-                }
-            }
-
-        rule.onNodeWithTag(overscrollTag)
+        rule
+            .onNodeWithTag(overscrollTag)
             .captureToImage()
             .assertAgainstGolden(screenshotRule, "overscroll_right_origin")
     }
@@ -154,24 +136,16 @@
     @Composable
     fun VerticalScrollable() {
         CompositionLocalProvider(
-            LocalOverscrollConfiguration provides OverscrollConfiguration(
-                glowColor = Color.Red,
-                drawPadding = PaddingValues(10.dp)
-            )
+            LocalOverscrollConfiguration provides
+                OverscrollConfiguration(glowColor = Color.Red, drawPadding = PaddingValues(10.dp))
         ) {
-            Box(
-                Modifier
-                    .wrapContentSize(Alignment.TopStart)
-            ) {
+            Box(Modifier.wrapContentSize(Alignment.TopStart)) {
                 LazyColumn(
-                    Modifier
-                        .border(5.dp, Color.Black)
+                    Modifier.border(5.dp, Color.Black)
                         .size(width = 400.dp, height = 200.dp)
                         .testTag(overscrollTag)
                 ) {
-                    items(7) {
-                        Box(Modifier.size(400.dp, 50.dp))
-                    }
+                    items(7) { Box(Modifier.size(400.dp, 50.dp)) }
                 }
             }
         }
@@ -181,24 +155,16 @@
     @Composable
     fun HorizontalScrollable() {
         CompositionLocalProvider(
-            LocalOverscrollConfiguration provides OverscrollConfiguration(
-                glowColor = Color.Red,
-                drawPadding = PaddingValues(10.dp)
-            )
+            LocalOverscrollConfiguration provides
+                OverscrollConfiguration(glowColor = Color.Red, drawPadding = PaddingValues(10.dp))
         ) {
-            Box(
-                Modifier
-                    .wrapContentSize(Alignment.TopStart)
-            ) {
+            Box(Modifier.wrapContentSize(Alignment.TopStart)) {
                 LazyRow(
-                    Modifier
-                        .border(5.dp, Color.Black)
+                    Modifier.border(5.dp, Color.Black)
                         .size(width = 200.dp, height = 400.dp)
                         .testTag(overscrollTag)
                 ) {
-                    items(7) {
-                        Box(Modifier.size(50.dp, 400.dp))
-                    }
+                    items(7) { Box(Modifier.size(50.dp, 400.dp)) }
                 }
             }
         }
diff --git a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/OverscrollTest.kt b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/OverscrollTest.kt
index 7276c9f..c68cb3e 100644
--- a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/OverscrollTest.kt
+++ b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/OverscrollTest.kt
@@ -78,8 +78,7 @@
 @RunWith(AndroidJUnit4::class)
 @OptIn(ExperimentalFoundationApi::class)
 class OverscrollTest {
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
     @get:Rule
     val animationScaleRule: AnimationDurationScaleRule =
@@ -127,11 +126,7 @@
         rule.onNodeWithTag(boxTag).assertExists()
 
         rule.onNodeWithTag(boxTag).performTouchInput {
-            swipeWithVelocity(
-                center,
-                Offset(centerX + 10800, centerY),
-                endVelocity = 30000f
-            )
+            swipeWithVelocity(center, Offset(centerX + 10800, centerY), endVelocity = 30000f)
         }
 
         rule.runOnIdle {
@@ -148,10 +143,11 @@
             acummulatedScroll += delta
             delta
         }
-        val viewConfig = rule.setOverscrollContentAndReturnViewConfig(
-            scrollableState = scrollableState,
-            overscrollEffect = controller
-        )
+        val viewConfig =
+            rule.setOverscrollContentAndReturnViewConfig(
+                scrollableState = scrollableState,
+                overscrollEffect = controller
+            )
 
         rule.waitUntil { controller.drawCallsCount == 1 }
 
@@ -169,9 +165,7 @@
             assertThat(controller.lastNestedScrollSource).isEqualTo(NestedScrollSource.UserInput)
         }
 
-        rule.onNodeWithTag(boxTag).performTouchInput {
-            up()
-        }
+        rule.onNodeWithTag(boxTag).performTouchInput { up() }
     }
 
     @Test
@@ -186,15 +180,18 @@
             delta
         }
 
-        val viewConfig = rule.setOverscrollContentAndReturnViewConfig(
-            scrollableState = object : ScrollableState by scrollableState {
-                override val canScrollForward: Boolean
-                    get() = canScroll
-                override val canScrollBackward: Boolean
-                    get() = canScroll
-            },
-            overscrollEffect = controller
-        )
+        val viewConfig =
+            rule.setOverscrollContentAndReturnViewConfig(
+                scrollableState =
+                    object : ScrollableState by scrollableState {
+                        override val canScrollForward: Boolean
+                            get() = canScroll
+
+                        override val canScrollBackward: Boolean
+                            get() = canScroll
+                    },
+                overscrollEffect = controller
+            )
 
         rule.onNodeWithTag(boxTag).performTouchInput {
             down(center)
@@ -213,9 +210,7 @@
         }
 
         // Inform scrollable that we cannot scroll anymore
-        rule.runOnIdle {
-            canScroll = false
-        }
+        rule.runOnIdle { canScroll = false }
 
         rule.onNodeWithTag(boxTag).performTouchInput {
             down(center)
@@ -238,12 +233,13 @@
             acummulatedScroll += delta
             delta
         }
-        val flingBehavior = object : FlingBehavior {
-            override suspend fun ScrollScope.performFling(initialVelocity: Float): Float {
-                lastFlingReceived = initialVelocity
-                return initialVelocity
+        val flingBehavior =
+            object : FlingBehavior {
+                override suspend fun ScrollScope.performFling(initialVelocity: Float): Float {
+                    lastFlingReceived = initialVelocity
+                    return initialVelocity
+                }
             }
-        }
         rule.setOverscrollContentAndReturnViewConfig(
             scrollableState = scrollableState,
             overscrollEffect = controller,
@@ -255,11 +251,7 @@
         rule.onNodeWithTag(boxTag).assertExists()
 
         rule.onNodeWithTag(boxTag).performTouchInput {
-            swipeWithVelocity(
-                center,
-                Offset(centerX + 10800, centerY),
-                endVelocity = 30000f
-            )
+            swipeWithVelocity(center, Offset(centerX + 10800, centerY), endVelocity = 30000f)
         }
 
         rule.runOnIdle {
@@ -276,10 +268,11 @@
             acummulatedScroll += delta
             delta
         }
-        val viewConfiguration = rule.setOverscrollContentAndReturnViewConfig(
-            scrollableState = scrollableState,
-            overscrollEffect = controller
-        )
+        val viewConfiguration =
+            rule.setOverscrollContentAndReturnViewConfig(
+                scrollableState = scrollableState,
+                overscrollEffect = controller
+            )
 
         rule.runOnIdle {
             // no down events, hence 0 animation stops
@@ -292,15 +285,15 @@
             up()
         }
 
-        val lastAccScroll = rule.runOnIdle {
-            assertThat(controller.isInProgressCallCount).isEqualTo(1)
-            // respect touch slop if overscroll animation is not running
-            assertThat(acummulatedScroll)
-                .isEqualTo(500f - viewConfiguration.touchSlop)
-            // pretend we're settling the overscroll animation
-            controller.animationRunning = true
-            acummulatedScroll
-        }
+        val lastAccScroll =
+            rule.runOnIdle {
+                assertThat(controller.isInProgressCallCount).isEqualTo(1)
+                // respect touch slop if overscroll animation is not running
+                assertThat(acummulatedScroll).isEqualTo(500f - viewConfiguration.touchSlop)
+                // pretend we're settling the overscroll animation
+                controller.animationRunning = true
+                acummulatedScroll
+            }
 
         rule.onNodeWithTag(boxTag).performTouchInput {
             down(center)
@@ -311,19 +304,18 @@
         // ignores touch slop if overscroll animation is on progress while pointer goes down
         assertThat(acummulatedScroll - lastAccScroll).isEqualTo(500f)
 
-        rule.runOnIdle {
-            assertThat(controller.isInProgressCallCount).isEqualTo(2)
-        }
+        rule.runOnIdle { assertThat(controller.isInProgressCallCount).isEqualTo(2) }
     }
 
     @Test
     fun modifierIsProducingEqualsModifiersForTheSameInput() {
         var overscrollEffect: OverscrollEffect? = null
         rule.setContent {
-            overscrollEffect = AndroidEdgeEffectOverscrollEffect(
-                LocalView.current.context,
-                OverscrollConfiguration(Color.Gray)
-            )
+            overscrollEffect =
+                AndroidEdgeEffectOverscrollEffect(
+                    LocalView.current.context,
+                    OverscrollConfiguration(Color.Gray)
+                )
         }
 
         val first = Modifier.overscroll(overscrollEffect!!)
@@ -341,48 +333,37 @@
             Box {
                 controller = rememberOverscrollEffect() as AndroidEdgeEffectOverscrollEffect
                 Box(
-                    Modifier
-                        .fillMaxSize()
+                    Modifier.fillMaxSize()
                         .wrapContentSize(Alignment.Center)
                         .background(Color.Red)
                         .testTag(tag)
                 ) {
                     Box(
-                        Modifier
-                            .padding(10.dp)
-                            .size(10.dp)
-                            .overscroll(controller)
-                            .drawBehind {
-                                val extraOffset = 10.dp
-                                    .roundToPx()
-                                    .toFloat()
-                                // Draw a green box over the entire red parent container
-                                drawRect(
-                                    Color.Green,
-                                    Offset(-extraOffset, -extraOffset),
-                                    size = Size(
+                        Modifier.padding(10.dp).size(10.dp).overscroll(controller).drawBehind {
+                            val extraOffset = 10.dp.roundToPx().toFloat()
+                            // Draw a green box over the entire red parent container
+                            drawRect(
+                                Color.Green,
+                                Offset(-extraOffset, -extraOffset),
+                                size =
+                                    Size(
                                         size.width + extraOffset * 2,
                                         size.height + extraOffset * 2
                                     )
-                                )
-                            }
+                            )
+                        }
                     )
                 }
             }
         }
 
         // Overscroll is not displayed, so the content should be entirely green (no clipping)
-        rule.onNodeWithTag(tag)
-            .captureToImage()
-            .assertPixels { Color.Green }
+        rule.onNodeWithTag(tag).captureToImage().assertPixels { Color.Green }
 
         // Pull vertically down
         rule.runOnIdle {
             val offset = Offset(x = 0f, y = 50f)
-            controller.applyToScroll(
-                offset,
-                source = NestedScrollSource.UserInput
-            ) { Offset.Zero }
+            controller.applyToScroll(offset, source = NestedScrollSource.UserInput) { Offset.Zero }
             // we have to disable further invalidation requests as otherwise while the overscroll
             // effect is considered active (as it is in a pulled state) this will infinitely
             // schedule next invalidation right from the drawing. this will make our test infra
@@ -393,9 +374,7 @@
 
         // We don't want to assert that the content is entirely green as the glow effect will
         // change this, so instead we assert that no red from the parent box is visible.
-        rule.onNodeWithTag(tag)
-            .captureToImage()
-            .assertHasNoColor(Color.Red)
+        rule.onNodeWithTag(tag).captureToImage().assertHasNoColor(Color.Red)
     }
 
     @OptIn(ExperimentalFoundationApi::class)
@@ -408,15 +387,13 @@
             Box {
                 controller = rememberOverscrollEffect() as AndroidEdgeEffectOverscrollEffect
                 Box(
-                    Modifier
-                        .fillMaxSize()
+                    Modifier.fillMaxSize()
                         .wrapContentSize(Alignment.Center)
                         .background(Color.Red)
                         .testTag(tag)
                 ) {
                     Box(
-                        Modifier
-                            .padding(10.dp)
+                        Modifier.padding(10.dp)
                             .size(10.dp)
                             // Stretch overscroll will apply the stretch to the surrounding canvas,
                             // so add a graphics layer to get a canvas sized to the content. The
@@ -427,17 +404,16 @@
                             .graphicsLayer()
                             .overscroll(controller)
                             .drawBehind {
-                                val extraOffset = 10.dp
-                                    .roundToPx()
-                                    .toFloat()
+                                val extraOffset = 10.dp.roundToPx().toFloat()
                                 // Draw a green box over the entire red parent container
                                 drawRect(
                                     Color.Green,
                                     Offset(-extraOffset, -extraOffset),
-                                    size = Size(
-                                        size.width + extraOffset * 2,
-                                        size.height + extraOffset * 2
-                                    )
+                                    size =
+                                        Size(
+                                            size.width + extraOffset * 2,
+                                            size.height + extraOffset * 2
+                                        )
                                 )
                             }
                     )
@@ -446,17 +422,12 @@
         }
 
         // Overscroll is not displayed, so the content should be entirely green (no clipping)
-        rule.onNodeWithTag(tag)
-            .captureToImage()
-            .assertPixels { Color.Green }
+        rule.onNodeWithTag(tag).captureToImage().assertPixels { Color.Green }
 
         // Stretch vertically down
         rule.runOnIdle {
             val offset = Offset(x = 0f, y = 50f)
-            controller.applyToScroll(
-                offset,
-                source = NestedScrollSource.UserInput
-            ) { Offset.Zero }
+            controller.applyToScroll(offset, source = NestedScrollSource.UserInput) { Offset.Zero }
             // we have to disable further invalidation requests as otherwise while the overscroll
             // effect is considered active (as it is in a pulled state) this will infinitely
             // schedule next invalidation right from the drawing. this will make our test infra
@@ -479,53 +450,17 @@
         // +---+---+---+
         with(rule.onNodeWithTag(tag).captureToImage().toPixelMap()) {
             // Top left, top middle, top right should be red, as we clip vertically
-            assertPixelColor(
-                expected = Color.Red,
-                x = (width / 6) * 1,
-                y = (height / 6) * 1
-            )
-            assertPixelColor(
-                expected = Color.Red,
-                x = (width / 6) * 3,
-                y = (height / 6) * 1
-            )
-            assertPixelColor(
-                expected = Color.Red,
-                x = (width / 6) * 5,
-                y = (height / 6) * 1
-            )
+            assertPixelColor(expected = Color.Red, x = (width / 6) * 1, y = (height / 6) * 1)
+            assertPixelColor(expected = Color.Red, x = (width / 6) * 3, y = (height / 6) * 1)
+            assertPixelColor(expected = Color.Red, x = (width / 6) * 5, y = (height / 6) * 1)
             // Middle left, middle, middle right should be green, as we don't clip horizontally
-            assertPixelColor(
-                expected = Color.Green,
-                x = (width / 6) * 1,
-                y = (height / 6) * 3
-            )
-            assertPixelColor(
-                expected = Color.Green,
-                x = (width / 6) * 3,
-                y = (height / 6) * 3
-            )
-            assertPixelColor(
-                expected = Color.Green,
-                x = (width / 6) * 5,
-                y = (height / 6) * 3
-            )
+            assertPixelColor(expected = Color.Green, x = (width / 6) * 1, y = (height / 6) * 3)
+            assertPixelColor(expected = Color.Green, x = (width / 6) * 3, y = (height / 6) * 3)
+            assertPixelColor(expected = Color.Green, x = (width / 6) * 5, y = (height / 6) * 3)
             // Bottom left, bottom middle, bottom right should be red, as we clip vertically
-            assertPixelColor(
-                expected = Color.Red,
-                x = (width / 6) * 1,
-                y = (height / 6) * 5
-            )
-            assertPixelColor(
-                expected = Color.Red,
-                x = (width / 6) * 3,
-                y = (height / 6) * 5
-            )
-            assertPixelColor(
-                expected = Color.Red,
-                x = (width / 6) * 5,
-                y = (height / 6) * 5
-            )
+            assertPixelColor(expected = Color.Red, x = (width / 6) * 1, y = (height / 6) * 5)
+            assertPixelColor(expected = Color.Red, x = (width / 6) * 3, y = (height / 6) * 5)
+            assertPixelColor(expected = Color.Red, x = (width / 6) * 5, y = (height / 6) * 5)
         }
     }
 
@@ -539,15 +474,13 @@
             Box {
                 controller = rememberOverscrollEffect() as AndroidEdgeEffectOverscrollEffect
                 Box(
-                    Modifier
-                        .fillMaxSize()
+                    Modifier.fillMaxSize()
                         .wrapContentSize(Alignment.Center)
                         .background(Color.Red)
                         .testTag(tag)
                 ) {
                     Box(
-                        Modifier
-                            .padding(10.dp)
+                        Modifier.padding(10.dp)
                             .size(10.dp)
                             // Stretch overscroll will apply the stretch to the surrounding canvas,
                             // so add a graphics layer to get a canvas sized to the content. The
@@ -558,17 +491,16 @@
                             .graphicsLayer()
                             .overscroll(controller)
                             .drawBehind {
-                                val extraOffset = 10.dp
-                                    .roundToPx()
-                                    .toFloat()
+                                val extraOffset = 10.dp.roundToPx().toFloat()
                                 // Draw a green box over the entire red parent container
                                 drawRect(
                                     Color.Green,
                                     Offset(-extraOffset, -extraOffset),
-                                    size = Size(
-                                        size.width + extraOffset * 2,
-                                        size.height + extraOffset * 2
-                                    )
+                                    size =
+                                        Size(
+                                            size.width + extraOffset * 2,
+                                            size.height + extraOffset * 2
+                                        )
                                 )
                             }
                     )
@@ -577,17 +509,12 @@
         }
 
         // Overscroll is not displayed, so the content should be entirely green (no clipping)
-        rule.onNodeWithTag(tag)
-            .captureToImage()
-            .assertPixels { Color.Green }
+        rule.onNodeWithTag(tag).captureToImage().assertPixels { Color.Green }
 
         // Stretch horizontally right
         rule.runOnIdle {
             val offset = Offset(x = 50f, y = 0f)
-            controller.applyToScroll(
-                offset,
-                source = NestedScrollSource.UserInput
-            ) { Offset.Zero }
+            controller.applyToScroll(offset, source = NestedScrollSource.UserInput) { Offset.Zero }
             // we have to disable further invalidation requests as otherwise while the overscroll
             // effect is considered active (as it is in a pulled state) this will infinitely
             // schedule next invalidation right from the drawing. this will make our test infra
@@ -610,53 +537,17 @@
         // +---+---+---+
         with(rule.onNodeWithTag(tag).captureToImage().toPixelMap()) {
             // Top left, top middle, top right should be red, green, red
-            assertPixelColor(
-                expected = Color.Red,
-                x = (width / 6) * 1,
-                y = (height / 6) * 1
-            )
-            assertPixelColor(
-                expected = Color.Green,
-                x = (width / 6) * 3,
-                y = (height / 6) * 1
-            )
-            assertPixelColor(
-                expected = Color.Red,
-                x = (width / 6) * 5,
-                y = (height / 6) * 1
-            )
+            assertPixelColor(expected = Color.Red, x = (width / 6) * 1, y = (height / 6) * 1)
+            assertPixelColor(expected = Color.Green, x = (width / 6) * 3, y = (height / 6) * 1)
+            assertPixelColor(expected = Color.Red, x = (width / 6) * 5, y = (height / 6) * 1)
             // Middle left, middle, middle right should be red, green, red
-            assertPixelColor(
-                expected = Color.Red,
-                x = (width / 6) * 1,
-                y = (height / 6) * 3
-            )
-            assertPixelColor(
-                expected = Color.Green,
-                x = (width / 6) * 3,
-                y = (height / 6) * 3
-            )
-            assertPixelColor(
-                expected = Color.Red,
-                x = (width / 6) * 5,
-                y = (height / 6) * 3
-            )
+            assertPixelColor(expected = Color.Red, x = (width / 6) * 1, y = (height / 6) * 3)
+            assertPixelColor(expected = Color.Green, x = (width / 6) * 3, y = (height / 6) * 3)
+            assertPixelColor(expected = Color.Red, x = (width / 6) * 5, y = (height / 6) * 3)
             // Bottom left, bottom middle, bottom right should be red, green, red
-            assertPixelColor(
-                expected = Color.Red,
-                x = (width / 6) * 1,
-                y = (height / 6) * 5
-            )
-            assertPixelColor(
-                expected = Color.Green,
-                x = (width / 6) * 3,
-                y = (height / 6) * 5
-            )
-            assertPixelColor(
-                expected = Color.Red,
-                x = (width / 6) * 5,
-                y = (height / 6) * 5
-            )
+            assertPixelColor(expected = Color.Red, x = (width / 6) * 1, y = (height / 6) * 5)
+            assertPixelColor(expected = Color.Green, x = (width / 6) * 3, y = (height / 6) * 5)
+            assertPixelColor(expected = Color.Red, x = (width / 6) * 5, y = (height / 6) * 5)
         }
     }
 
@@ -670,15 +561,13 @@
             Box {
                 controller = rememberOverscrollEffect() as AndroidEdgeEffectOverscrollEffect
                 Box(
-                    Modifier
-                        .fillMaxSize()
+                    Modifier.fillMaxSize()
                         .wrapContentSize(Alignment.Center)
                         .background(Color.Red)
                         .testTag(tag)
                 ) {
                     Box(
-                        Modifier
-                            .padding(10.dp)
+                        Modifier.padding(10.dp)
                             .size(10.dp)
                             // Stretch overscroll will apply the stretch to the surrounding canvas,
                             // so add a graphics layer to get a canvas sized to the content. The
@@ -689,17 +578,16 @@
                             .graphicsLayer()
                             .overscroll(controller)
                             .drawBehind {
-                                val extraOffset = 10.dp
-                                    .roundToPx()
-                                    .toFloat()
+                                val extraOffset = 10.dp.roundToPx().toFloat()
                                 // Draw a green box over the entire red parent container
                                 drawRect(
                                     Color.Green,
                                     Offset(-extraOffset, -extraOffset),
-                                    size = Size(
-                                        size.width + extraOffset * 2,
-                                        size.height + extraOffset * 2
-                                    )
+                                    size =
+                                        Size(
+                                            size.width + extraOffset * 2,
+                                            size.height + extraOffset * 2
+                                        )
                                 )
                             }
                     )
@@ -708,17 +596,12 @@
         }
 
         // Overscroll is not displayed, so the content should be entirely green (no clipping)
-        rule.onNodeWithTag(tag)
-            .captureToImage()
-            .assertPixels { Color.Green }
+        rule.onNodeWithTag(tag).captureToImage().assertPixels { Color.Green }
 
         // Stretch horizontally and vertically to the bottom right
         rule.runOnIdle {
             val offset = Offset(x = 50f, y = 50f)
-            controller.applyToScroll(
-                offset,
-                source = NestedScrollSource.UserInput
-            ) { Offset.Zero }
+            controller.applyToScroll(offset, source = NestedScrollSource.UserInput) { Offset.Zero }
             // we have to disable further invalidation requests as otherwise while the overscroll
             // effect is considered active (as it is in a pulled state) this will infinitely
             // schedule next invalidation right from the drawing. this will make our test infra
@@ -740,53 +623,17 @@
         // +---+---+---+
         with(rule.onNodeWithTag(tag).captureToImage().toPixelMap()) {
             // Top left, top middle, top right should be red
-            assertPixelColor(
-                expected = Color.Red,
-                x = (width / 6) * 1,
-                y = (height / 6) * 1
-            )
-            assertPixelColor(
-                expected = Color.Red,
-                x = (width / 6) * 3,
-                y = (height / 6) * 1
-            )
-            assertPixelColor(
-                expected = Color.Red,
-                x = (width / 6) * 5,
-                y = (height / 6) * 1
-            )
+            assertPixelColor(expected = Color.Red, x = (width / 6) * 1, y = (height / 6) * 1)
+            assertPixelColor(expected = Color.Red, x = (width / 6) * 3, y = (height / 6) * 1)
+            assertPixelColor(expected = Color.Red, x = (width / 6) * 5, y = (height / 6) * 1)
             // Middle left, middle, middle right should be red, green, red
-            assertPixelColor(
-                expected = Color.Red,
-                x = (width / 6) * 1,
-                y = (height / 6) * 3
-            )
-            assertPixelColor(
-                expected = Color.Green,
-                x = (width / 6) * 3,
-                y = (height / 6) * 3
-            )
-            assertPixelColor(
-                expected = Color.Red,
-                x = (width / 6) * 5,
-                y = (height / 6) * 3
-            )
+            assertPixelColor(expected = Color.Red, x = (width / 6) * 1, y = (height / 6) * 3)
+            assertPixelColor(expected = Color.Green, x = (width / 6) * 3, y = (height / 6) * 3)
+            assertPixelColor(expected = Color.Red, x = (width / 6) * 5, y = (height / 6) * 3)
             // Bottom left, bottom middle, bottom right should be red
-            assertPixelColor(
-                expected = Color.Red,
-                x = (width / 6) * 1,
-                y = (height / 6) * 5
-            )
-            assertPixelColor(
-                expected = Color.Red,
-                x = (width / 6) * 3,
-                y = (height / 6) * 5
-            )
-            assertPixelColor(
-                expected = Color.Red,
-                x = (width / 6) * 5,
-                y = (height / 6) * 5
-            )
+            assertPixelColor(expected = Color.Red, x = (width / 6) * 1, y = (height / 6) * 5)
+            assertPixelColor(expected = Color.Red, x = (width / 6) * 3, y = (height / 6) * 5)
+            assertPixelColor(expected = Color.Red, x = (width / 6) * 5, y = (height / 6) * 5)
         }
     }
 
@@ -807,15 +654,13 @@
             Box {
                 controller = rememberOverscrollEffect() as AndroidEdgeEffectOverscrollEffect
                 Box(
-                    Modifier
-                        .fillMaxSize()
+                    Modifier.fillMaxSize()
                         .wrapContentSize(Alignment.Center)
                         .background(Color.Red)
                         .testTag(tag)
                 ) {
                     Box(
-                        Modifier
-                            .size(10.dp)
+                        Modifier.size(10.dp)
                             // Stretch overscroll will apply the stretch to the surrounding canvas,
                             // so add a graphics layer to get a canvas sized to the content. The
                             // expected usage is for this to be clipScrollableContainer() or
@@ -833,17 +678,12 @@
         }
 
         // Overscroll is not displayed, so the content should be entirely green
-        rule.onNodeWithTag(tag)
-            .captureToImage()
-            .assertPixels { Color.Green }
+        rule.onNodeWithTag(tag).captureToImage().assertPixels { Color.Green }
 
         // Stretch vertically down
         rule.runOnIdle {
             val offset = Offset(x = 0f, y = 50f)
-            controller.applyToScroll(
-                offset,
-                source = NestedScrollSource.UserInput
-            ) { Offset.Zero }
+            controller.applyToScroll(offset, source = NestedScrollSource.UserInput) { Offset.Zero }
             // we have to disable further invalidation requests as otherwise while the overscroll
             // effect is considered active (as it is in a pulled state) this will infinitely
             // schedule next invalidation right from the drawing. this will make our test infra
@@ -854,9 +694,7 @@
 
         // We don't want to assert that the content is entirely green as the stretch effect will
         // change this a bit, so instead we assert that no red from the parent box is visible.
-        rule.onNodeWithTag(tag)
-            .captureToImage()
-            .assertHasNoColor(Color.Red)
+        rule.onNodeWithTag(tag).captureToImage().assertHasNoColor(Color.Red)
     }
 
     @OptIn(ExperimentalFoundationApi::class)
@@ -869,15 +707,13 @@
             Box {
                 controller = rememberOverscrollEffect() as AndroidEdgeEffectOverscrollEffect
                 Box(
-                    Modifier
-                        .fillMaxSize()
+                    Modifier.fillMaxSize()
                         .wrapContentSize(Alignment.Center)
                         .background(Color.Red)
                         .testTag(tag)
                 ) {
                     Box(
-                        Modifier
-                            .size(10.dp)
+                        Modifier.size(10.dp)
                             // Stretch overscroll will apply the stretch to the surrounding canvas,
                             // so add a graphics layer to get a canvas sized to the content. The
                             // expected usage is for this to be clipScrollableContainer() or
@@ -895,17 +731,12 @@
         }
 
         // Overscroll is not displayed, so the content should be entirely green
-        rule.onNodeWithTag(tag)
-            .captureToImage()
-            .assertPixels { Color.Green }
+        rule.onNodeWithTag(tag).captureToImage().assertPixels { Color.Green }
 
         // Stretch horizontally right
         rule.runOnIdle {
             val offset = Offset(x = 50f, y = 0f)
-            controller.applyToScroll(
-                offset,
-                source = NestedScrollSource.UserInput
-            ) { Offset.Zero }
+            controller.applyToScroll(offset, source = NestedScrollSource.UserInput) { Offset.Zero }
             // we have to disable further invalidation requests as otherwise while the overscroll
             // effect is considered active (as it is in a pulled state) this will infinitely
             // schedule next invalidation right from the drawing. this will make our test infra
@@ -916,9 +747,7 @@
 
         // We don't want to assert that the content is entirely green as the stretch effect will
         // change this a bit, so instead we assert that no red from the parent box is visible.
-        rule.onNodeWithTag(tag)
-            .captureToImage()
-            .assertHasNoColor(Color.Red)
+        rule.onNodeWithTag(tag).captureToImage().assertHasNoColor(Color.Red)
     }
 
     @OptIn(ExperimentalFoundationApi::class)
@@ -931,15 +760,13 @@
             Box {
                 controller = rememberOverscrollEffect() as AndroidEdgeEffectOverscrollEffect
                 Box(
-                    Modifier
-                        .fillMaxSize()
+                    Modifier.fillMaxSize()
                         .wrapContentSize(Alignment.Center)
                         .background(Color.Red)
                         .testTag(tag)
                 ) {
                     Box(
-                        Modifier
-                            .size(10.dp)
+                        Modifier.size(10.dp)
                             // Stretch overscroll will apply the stretch to the surrounding canvas,
                             // so add a graphics layer to get a canvas sized to the content. The
                             // expected usage is for this to be clipScrollableContainer() or
@@ -957,17 +784,12 @@
         }
 
         // Overscroll is not displayed, so the content should be entirely green
-        rule.onNodeWithTag(tag)
-            .captureToImage()
-            .assertPixels { Color.Green }
+        rule.onNodeWithTag(tag).captureToImage().assertPixels { Color.Green }
 
         // Stretch horizontally and vertically to the bottom right
         rule.runOnIdle {
             val offset = Offset(x = 50f, y = 50f)
-            controller.applyToScroll(
-                offset,
-                source = NestedScrollSource.UserInput
-            ) { Offset.Zero }
+            controller.applyToScroll(offset, source = NestedScrollSource.UserInput) { Offset.Zero }
             // we have to disable further invalidation requests as otherwise while the overscroll
             // effect is considered active (as it is in a pulled state) this will infinitely
             // schedule next invalidation right from the drawing. this will make our test infra
@@ -978,9 +800,7 @@
 
         // We don't want to assert that the content is entirely green as the stretch effect will
         // change this a bit, so instead we assert that no red from the parent box is visible.
-        rule.onNodeWithTag(tag)
-            .captureToImage()
-            .assertHasNoColor(Color.Red)
+        rule.onNodeWithTag(tag).captureToImage().assertHasNoColor(Color.Red)
     }
 
     @OptIn(ExperimentalFoundationApi::class)
@@ -991,11 +811,7 @@
         rule.setContent {
             Box {
                 effect = rememberOverscrollEffect()
-                Box(
-                    Modifier
-                        .overscroll(effect)
-                        .size(0.dp)
-                )
+                Box(Modifier.overscroll(effect).size(0.dp))
             }
         }
 
@@ -1028,9 +844,7 @@
     @SdkSuppress(minSdkVersion = Build.VERSION_CODES.O)
     fun notAttachedEffectIsNotConsumingOffsetsAndVelocity() {
         lateinit var effect: OverscrollEffect
-        rule.setContent {
-            effect = rememberOverscrollEffect()
-        }
+        rule.setContent { effect = rememberOverscrollEffect() }
 
         rule.runOnIdle {
             repeat(2) {
@@ -1071,11 +885,7 @@
         rule.onNodeWithTag(boxTag).assertExists()
 
         rule.onNodeWithTag(boxTag).performTouchInput {
-            swipeWithVelocity(
-                center,
-                Offset(centerX + 10800, centerY),
-                endVelocity = 30000f
-            )
+            swipeWithVelocity(center, Offset(centerX + 10800, centerY), endVelocity = 30000f)
         }
 
         rule.runOnIdle {
@@ -1111,11 +921,7 @@
         rule.onNodeWithTag(boxTag).assertExists()
 
         rule.onNodeWithTag(boxTag).performTouchInput {
-            swipeWithVelocity(
-                center,
-                Offset(centerX, centerY + 10800),
-                endVelocity = 30000f
-            )
+            swipeWithVelocity(center, Offset(centerX, centerY + 10800), endVelocity = 30000f)
         }
 
         rule.runOnIdle {
@@ -1155,9 +961,7 @@
             up()
         }
 
-        rule.runOnIdle {
-            assertThat(inspectableConnection.preScrollOffset.x).isEqualTo(0f)
-        }
+        rule.runOnIdle { assertThat(inspectableConnection.preScrollOffset.x).isEqualTo(0f) }
     }
 
     @Test
@@ -1177,9 +981,7 @@
             swipeWithVelocity(center, center + Offset(100f, 100f), endVelocity = 1000f)
         }
 
-        rule.runOnIdle {
-            assertThat(inspectableConnection.preScrollVelocity.x).isEqualTo(0)
-        }
+        rule.runOnIdle { assertThat(inspectableConnection.preScrollVelocity.x).isEqualTo(0) }
     }
 
     @Test
@@ -1201,9 +1003,7 @@
             up()
         }
 
-        rule.runOnIdle {
-            assertThat(inspectableConnection.preScrollOffset.y).isEqualTo(0f)
-        }
+        rule.runOnIdle { assertThat(inspectableConnection.preScrollOffset.y).isEqualTo(0f) }
     }
 
     @Test
@@ -1225,9 +1025,7 @@
             }
         }
 
-        rule.runOnIdle {
-            assertThat(inspectableConnection.preScrollVelocity.y).isEqualTo(0)
-        }
+        rule.runOnIdle { assertThat(inspectableConnection.preScrollVelocity.y).isEqualTo(0) }
     }
 
     private fun assertSingleAxisValue(mainAxis: Float, crossAxis: Float) {
@@ -1322,13 +1120,9 @@
             assertThat(controller.lastOverscrollDelta).isEqualTo(Offset.Zero)
         }
 
-        rule.onNodeWithTag(boxTag).performTouchInput {
-            up()
-        }
+        rule.onNodeWithTag(boxTag).performTouchInput { up() }
 
-        rule.runOnIdle {
-            consumeOnlyHalf = true
-        }
+        rule.runOnIdle { consumeOnlyHalf = true }
 
         rule.onNodeWithTag(boxTag).performTouchInput {
             down(center)
@@ -1343,9 +1137,7 @@
             assertThat(controller.lastNestedScrollSource).isEqualTo(NestedScrollSource.UserInput)
         }
 
-        rule.onNodeWithTag(boxTag).performTouchInput {
-            up()
-        }
+        rule.onNodeWithTag(boxTag).performTouchInput { up() }
 
         rule.runOnIdle {
             assertThat(controller.lastVelocity.x).isWithin(0.01f).of(0f)
@@ -1363,8 +1155,7 @@
             val scrollableState = ScrollableState { delta -> delta }
             Box(Modifier.nestedScroll(NoOpConnection)) {
                 Box(
-                    Modifier
-                        .testTag(boxTag)
+                    Modifier.testTag(boxTag)
                         .size(300.dp)
                         .overscroll(overscrollController)
                         .scrollable(
@@ -1390,17 +1181,14 @@
         var drawCount = 0
         rule.setContent {
             Spacer(
-                modifier = Modifier.testTag(boxTag)
-                    .size(100.dp)
-                    .overscroll(ScrollableDefaults.overscrollEffect())
-                    .drawBehind {
-                        drawCount++
-                    }
+                modifier =
+                    Modifier.testTag(boxTag)
+                        .size(100.dp)
+                        .overscroll(ScrollableDefaults.overscrollEffect())
+                        .drawBehind { drawCount++ }
             )
         }
-        rule.runOnIdle {
-            assertEquals(1, drawCount)
-        }
+        rule.runOnIdle { assertEquals(1, drawCount) }
     }
 
     @OptIn(ExperimentalTestApi::class)
@@ -1414,8 +1202,7 @@
             val scrollableState = ScrollableState { delta -> delta }
             Box(Modifier.nestedScroll(NoOpConnection)) {
                 Box(
-                    Modifier
-                        .testTag(boxTag)
+                    Modifier.testTag(boxTag)
                         .size(300.dp)
                         .overscroll(overscrollController)
                         .scrollable(
@@ -1457,8 +1244,7 @@
         viewConfiguration = LocalViewConfiguration.current
         Box(Modifier.nestedScroll(inspectableConnection)) {
             Box(
-                Modifier
-                    .testTag("box")
+                Modifier.testTag("box")
                     .size(300.dp)
                     .overscroll(overscrollEffect)
                     .scrollable(
@@ -1478,9 +1264,9 @@
     val pixel = toPixelMap()
     for (x in 0 until width) {
         for (y in 0 until height) {
-            assertWithMessage(
-                "Pixel at [$x,$y] was equal to $color"
-            ).that(pixel[x, y]).isNotEqualTo(color)
+            assertWithMessage("Pixel at [$x,$y] was equal to $color")
+                .that(pixel[x, y])
+                .isNotEqualTo(color)
         }
     }
 }
@@ -1530,7 +1316,5 @@
     }
 
     override val isInProgress: Boolean = false
-    override val effectModifier: Modifier = Modifier.offset {
-        IntOffset(x = 0, y = 0)
-    }
+    override val effectModifier: Modifier = Modifier.offset { IntOffset(x = 0, y = 0) }
 }
diff --git a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/PlatformMagnifierTest.kt b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/PlatformMagnifierTest.kt
index b2c7a87..285f639 100644
--- a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/PlatformMagnifierTest.kt
+++ b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/PlatformMagnifierTest.kt
@@ -46,8 +46,7 @@
 @RunWith(AndroidJUnit4::class)
 class PlatformMagnifierTest {
 
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
     @SdkSuppress(minSdkVersion = 29)
     @Test
@@ -61,9 +60,7 @@
             )
         }
 
-        rule.runOnIdle {
-            assertThat(magnifier.magnifier.position).isEqualTo(Point(0, 0))
-        }
+        rule.runOnIdle { assertThat(magnifier.magnifier.position).isEqualTo(Point(0, 0)) }
     }
 
     @SdkSuppress(minSdkVersion = 29)
@@ -175,9 +172,10 @@
     @Test
     fun androidPlatformMagnifier_usesRequestedSize() {
         val magnifierSize = IntSize(10, 11)
-        val magnifier = with(rule.density) {
-            createAndroidPlatformMagnifier(size = magnifierSize.toSize().toDpSize())
-        }
+        val magnifier =
+            with(rule.density) {
+                createAndroidPlatformMagnifier(size = magnifierSize.toSize().toDpSize())
+            }
         assertThat(magnifier.size).isEqualTo(magnifierSize)
     }
 
@@ -194,16 +192,18 @@
                 val density = LocalDensity.current
 
                 DisposableEffect(Unit) {
-                    magnifier = PlatformMagnifierFactory.getForCurrentPlatform().create(
-                        view = currentView,
-                        density = density,
-                        initialZoom = Float.NaN,
-                        useTextDefault = false,
-                        size = size,
-                        cornerRadius = Dp.Unspecified,
-                        elevation = Dp.Unspecified,
-                        clippingEnabled = true,
-                    ) as PlatformMagnifierFactoryApi28Impl.PlatformMagnifierImpl
+                    magnifier =
+                        PlatformMagnifierFactory.getForCurrentPlatform()
+                            .create(
+                                view = currentView,
+                                density = density,
+                                initialZoom = Float.NaN,
+                                useTextDefault = false,
+                                size = size,
+                                cornerRadius = Dp.Unspecified,
+                                elevation = Dp.Unspecified,
+                                clippingEnabled = true,
+                            ) as PlatformMagnifierFactoryApi28Impl.PlatformMagnifierImpl
                     onDispose {}
                 }
             }
diff --git a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/PreferKeepClearTest.kt b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/PreferKeepClearTest.kt
index d6a405f..ec1ada4 100644
--- a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/PreferKeepClearTest.kt
+++ b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/PreferKeepClearTest.kt
@@ -43,25 +43,20 @@
 import org.junit.Test
 import org.junit.runner.RunWith
 
-/**
- * Testing the support for Android Views in Compose UI.
- */
+/** Testing the support for Android Views in Compose UI. */
 @MediumTest
 @RunWith(AndroidJUnit4::class)
 class PreferKeepClearTest {
-    @get:Rule
-    val rule = createAndroidComposeRule<TestActivity>()
+    @get:Rule val rule = createAndroidComposeRule<TestActivity>()
 
     /**
-     * Make sure that when an rect using the bounds of a layout is used, the
-     * bounds should be marked as prefer keep clear.
+     * Make sure that when an rect using the bounds of a layout is used, the bounds should be marked
+     * as prefer keep clear.
      */
     @SdkSuppress(minSdkVersion = Build.VERSION_CODES.TIRAMISU)
     @Test
     fun preferClearBounds() {
-        val composeView = setComposeContent {
-            Box(Modifier.size(50.dp).preferKeepClear())
-        }
+        val composeView = setComposeContent { Box(Modifier.size(50.dp).preferKeepClear()) }
         rule.runOnIdle {
             assertThat(composeView.preferKeepClearRects).isNotNull()
             assertThat(composeView.preferKeepClearRects).hasSize(1)
@@ -72,16 +67,14 @@
     }
 
     /**
-     * Make sure that when an area using a supplied rect, the
-     * rect should be marked as prefer keep clear.
+     * Make sure that when an area using a supplied rect, the rect should be marked as prefer keep
+     * clear.
      */
     @SdkSuppress(minSdkVersion = Build.VERSION_CODES.TIRAMISU)
     @Test
     fun preferClearWithRect() {
         val composeView = setComposeContent {
-            Box(Modifier.size(50.dp).preferKeepClear {
-                Rect(0f, 0f, 10f, 20f)
-            })
+            Box(Modifier.size(50.dp).preferKeepClear { Rect(0f, 0f, 10f, 20f) })
         }
         rule.runOnIdle {
             assertThat(composeView.preferKeepClearRects).isNotNull()
@@ -108,9 +101,7 @@
             assertThat(composeView.preferKeepClearRects[0]).isEqualTo(expectedRect)
         }
         setPreferClear = false
-        rule.runOnIdle {
-            assertThat(composeView.preferKeepClearRects).isEmpty()
-        }
+        rule.runOnIdle { assertThat(composeView.preferKeepClearRects).isEmpty() }
     }
 
     @SdkSuppress(minSdkVersion = Build.VERSION_CODES.TIRAMISU)
@@ -118,9 +109,9 @@
     fun removeWhenModifierRemovedRect() {
         var setPreferClear by mutableStateOf(true)
         val composeView = setComposeContent {
-            val modifier = if (setPreferClear) Modifier.preferKeepClear {
-                Rect(0f, 0f, 10f, 20f)
-            } else Modifier
+            val modifier =
+                if (setPreferClear) Modifier.preferKeepClear { Rect(0f, 0f, 10f, 20f) }
+                else Modifier
             Box(Modifier.size(50.dp).then(modifier))
         }
         rule.runOnUiThread {
@@ -131,9 +122,7 @@
             assertThat(composeView.preferKeepClearRects[0]).isEqualTo(expectedRect)
         }
         setPreferClear = false
-        rule.runOnIdle {
-            assertThat(composeView.preferKeepClearRects).isEmpty()
-        }
+        rule.runOnIdle { assertThat(composeView.preferKeepClearRects).isEmpty() }
     }
 
     @SdkSuppress(minSdkVersion = Build.VERSION_CODES.TIRAMISU)
@@ -175,9 +164,10 @@
     fun markPreferClearMultipleBoundsSingleComposable() {
         val composeView = setComposeContent {
             Column(Modifier.wrapContentSize()) {
-                Box(Modifier.size(100.dp)
-                    .preferKeepClear { Rect(0f, 0f, 100f, 50f) }
-                    .preferKeepClear { Rect(0f, 50f, 100f, 100f) }
+                Box(
+                    Modifier.size(100.dp)
+                        .preferKeepClear { Rect(0f, 0f, 100f, 50f) }
+                        .preferKeepClear { Rect(0f, 50f, 100f, 100f) }
                 )
             }
         }
@@ -217,9 +207,7 @@
                 Box(Modifier.size(50.dp).preferKeepClear())
             }
         }
-        rule.runOnIdle {
-            setPreferClear = false
-        }
+        rule.runOnIdle { setPreferClear = false }
         rule.runOnIdle {
             assertThat(composeView.preferKeepClearRects).hasSize(1)
             val rect = composeView.preferKeepClearRects[0]
@@ -233,18 +221,13 @@
         var useEmpty by mutableStateOf(false)
         val composeView = setComposeContent {
             Column(Modifier.wrapContentSize()) {
-                val lambda: (LayoutCoordinates) -> Rect = if (useEmpty) { _ ->
-                    Rect.Zero
-                } else { _ ->
-                    Rect(0f, 0f, 10f, 10f)
-                }
+                val lambda: (LayoutCoordinates) -> Rect =
+                    if (useEmpty) { _ -> Rect.Zero } else { _ -> Rect(0f, 0f, 10f, 10f) }
                 Box(Modifier.size(50.dp).preferKeepClear(lambda))
                 Box(Modifier.size(50.dp).preferKeepClear())
             }
         }
-        rule.runOnIdle {
-            useEmpty = true
-        }
+        rule.runOnIdle { useEmpty = true }
         rule.runOnIdle {
             assertThat(composeView.preferKeepClearRects).hasSize(1)
             val rect = composeView.preferKeepClearRects[0]
@@ -258,17 +241,13 @@
         var useFirst by mutableStateOf(true)
         val composeView = setComposeContent {
             Column(Modifier.wrapContentSize()) {
-                val lambda: (LayoutCoordinates) -> Rect = if (useFirst) { _ ->
-                    Rect(0f, 10f, 10f, 5f)
-                } else { _ ->
-                    Rect(0f, 0f, 10f, 10f)
-                }
+                val lambda: (LayoutCoordinates) -> Rect =
+                    if (useFirst) { _ -> Rect(0f, 10f, 10f, 5f) }
+                    else { _ -> Rect(0f, 0f, 10f, 10f) }
                 Box(Modifier.size(50.dp).preferKeepClear(lambda))
             }
         }
-        rule.runOnIdle {
-            useFirst = false
-        }
+        rule.runOnIdle { useFirst = false }
         rule.runOnIdle {
             assertThat(composeView.preferKeepClearRects).hasSize(1)
             val rect = composeView.preferKeepClearRects[0]
diff --git a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/ProgressSemanticsTest.kt b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/ProgressSemanticsTest.kt
index 3392a48..d8e821f 100644
--- a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/ProgressSemanticsTest.kt
+++ b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/ProgressSemanticsTest.kt
@@ -41,8 +41,7 @@
 @RunWith(AndroidJUnit4::class)
 class ProgressSemanticsTest {
 
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
     @Test
     fun determinateProgress_testSemantics() {
@@ -51,30 +50,22 @@
 
         rule.setContent {
             Box(
-                Modifier
-                    .testTag(tag)
+                Modifier.testTag(tag)
                     .progressSemantics(progress.value)
                     .size(50.dp)
                     .background(color = Color.Cyan)
             )
         }
 
-        rule.onNodeWithTag(tag)
-            .assertRangeInfoEquals(ProgressBarRangeInfo(0f, 0f..1f))
+        rule.onNodeWithTag(tag).assertRangeInfoEquals(ProgressBarRangeInfo(0f, 0f..1f))
 
-        rule.runOnUiThread {
-            progress.value = 0.005f
-        }
+        rule.runOnUiThread { progress.value = 0.005f }
 
-        rule.onNodeWithTag(tag)
-            .assertRangeInfoEquals(ProgressBarRangeInfo(0.005f, 0f..1f))
+        rule.onNodeWithTag(tag).assertRangeInfoEquals(ProgressBarRangeInfo(0.005f, 0f..1f))
 
-        rule.runOnUiThread {
-            progress.value = 0.5f
-        }
+        rule.runOnUiThread { progress.value = 0.5f }
 
-        rule.onNodeWithTag(tag)
-            .assertRangeInfoEquals(ProgressBarRangeInfo(0.5f, 0f..1f))
+        rule.onNodeWithTag(tag).assertRangeInfoEquals(ProgressBarRangeInfo(0.5f, 0f..1f))
     }
 
     @Test
@@ -83,15 +74,12 @@
 
         rule.setContent {
             Box(
-                Modifier
-                    .testTag(tag)
-                    .progressSemantics()
-                    .size(50.dp)
-                    .background(color = Color.Cyan)
+                Modifier.testTag(tag).progressSemantics().size(50.dp).background(color = Color.Cyan)
             )
         }
 
-        rule.onNodeWithTag(tag)
+        rule
+            .onNodeWithTag(tag)
             .assert(
                 SemanticsMatcher("progress is ProgressBarRangeInfo.Indeterminate") {
                     val progress = it.config.getOrNull(SemanticsProperties.ProgressBarRangeInfo)
diff --git a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/ScrollAccessibilityTest.kt b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/ScrollAccessibilityTest.kt
index dea797b..c2f5673 100644
--- a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/ScrollAccessibilityTest.kt
+++ b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/ScrollAccessibilityTest.kt
@@ -61,11 +61,7 @@
 @MediumTest
 @RunWith(Parameterized::class)
 class ScrollAccessibilityTest(private val config: TestConfig) {
-    data class TestConfig(
-        val horizontal: Boolean,
-        val rtl: Boolean,
-        val reversed: Boolean
-    ) {
+    data class TestConfig(val horizontal: Boolean, val rtl: Boolean, val reversed: Boolean) {
         val vertical = !horizontal
 
         override fun toString(): String {
@@ -81,27 +77,26 @@
         fun params() =
             listOf(true, false).flatMap { horizontal ->
                 listOf(false, true).flatMap { rtl ->
-                    listOf(false, true).map { reversed ->
-                        TestConfig(horizontal, rtl, reversed)
-                    }
+                    listOf(false, true).map { reversed -> TestConfig(horizontal, rtl, reversed) }
                 }
             }
     }
 
-    @get:Rule
-    val rule = createAndroidComposeRule<ComponentActivity>()
+    @get:Rule val rule = createAndroidComposeRule<ComponentActivity>()
 
     private val scrollerTag = "ScrollerTest"
     private var composeView: View? = null
     private val accessibilityNodeProvider: AccessibilityNodeProvider
-        get() = checkNotNull(composeView) {
-            "composeView not initialized. Did `composeView = LocalView.current` not work?"
-        }.let { composeView ->
-            ViewCompat
-                .getAccessibilityDelegate(composeView)!!
-                .getAccessibilityNodeProvider(composeView)!!
-                .provider as AccessibilityNodeProvider
-        }
+        get() =
+            checkNotNull(composeView) {
+                    "composeView not initialized. Did `composeView = LocalView.current` not work?"
+                }
+                .let { composeView ->
+                    ViewCompat.getAccessibilityDelegate(composeView)!!.getAccessibilityNodeProvider(
+                            composeView
+                        )!!
+                        .provider as AccessibilityNodeProvider
+                }
 
     @Test
     fun scrollForward() {
@@ -145,10 +140,7 @@
     @Test
     fun verifyScrollActionsInMiddle() {
         createScrollableContent_StartInMiddle()
-        verifyNodeInfoScrollActions(
-            expectForward = true,
-            expectBackward = true
-        )
+        verifyNodeInfoScrollActions(expectForward = true, expectBackward = true)
     }
 
     @Test
@@ -161,14 +153,14 @@
     }
 
     /**
-     * Setup the test, run the given [accessibilityAction], and check if the [canonicalTarget]
-     * has been reached (but only if we [expect][expectActionSuccess] the action to succeed).
-     * The canonical target is the item that we expect to see when moving forward in a
-     * non-reversed scrollable (e.g. down in vertical orientation or right in horizontal
-     * orientation in LTR). The actual target is either the canonical target or the target that
-     * is as far from the middle of the scrollable as the canonical target, but on the other side
-     * of the middle. For testing absolute directions, this mirroring is done for
-     * [horizontal][TestConfig.horizontal] [RTL][TestConfig.rtl] tests.
+     * Setup the test, run the given [accessibilityAction], and check if the [canonicalTarget] has
+     * been reached (but only if we [expect][expectActionSuccess] the action to succeed). The
+     * canonical target is the item that we expect to see when moving forward in a non-reversed
+     * scrollable (e.g. down in vertical orientation or right in horizontal orientation in LTR). The
+     * actual target is either the canonical target or the target that is as far from the middle of
+     * the scrollable as the canonical target, but on the other side of the middle. For testing
+     * absolute directions, this mirroring is done for [horizontal][TestConfig.horizontal]
+     * [RTL][TestConfig.rtl] tests.
      */
     private fun testAbsoluteDirection(
         canonicalTarget: Int,
@@ -192,9 +184,10 @@
         createScrollableContent_StartInMiddle()
         rule.onNodeWithText("$target").assertIsNotDisplayed()
 
-        val returnValue = rule.onNodeWithTag(scrollerTag).withSemanticsNode {
-            accessibilityNodeProvider.performAction(id, accessibilityAction, null)
-        }
+        val returnValue =
+            rule.onNodeWithTag(scrollerTag).withSemanticsNode {
+                accessibilityNodeProvider.performAction(id, accessibilityAction, null)
+            }
 
         assertThat(returnValue).isEqualTo(expectActionSuccess)
         if (expectActionSuccess) {
@@ -211,11 +204,10 @@
      * [reversing][TestConfig.reversed].
      */
     private fun verifyNodeInfoScrollActions(expectForward: Boolean, expectBackward: Boolean) {
-        val nodeInfo = rule.onNodeWithTag(scrollerTag).withSemanticsNode {
-            rule.runOnUiThread {
-                accessibilityNodeProvider.createAccessibilityNodeInfo(id)!!
+        val nodeInfo =
+            rule.onNodeWithTag(scrollerTag).withSemanticsNode {
+                rule.runOnUiThread { accessibilityNodeProvider.createAccessibilityNodeInfo(id)!! }
             }
-        }
 
         val actions = nodeInfo.actionList.map { it.id }
 
@@ -245,9 +237,7 @@
         }
     }
 
-    /**
-     * Creates a Row/Column that starts at offset 0, according to [createScrollableContent]
-     */
+    /** Creates a Row/Column that starts at offset 0, according to [createScrollableContent] */
     private fun createScrollableContent_StartAtStart() {
         createScrollableContent {
             // Start at the start:
@@ -256,9 +246,7 @@
         }
     }
 
-    /**
-     * Creates a Row/Column that starts in the middle, according to [createScrollableContent]
-     */
+    /** Creates a Row/Column that starts in the middle, according to [createScrollableContent] */
     private fun createScrollableContent_StartInMiddle() {
         createScrollableContent {
             with(LocalDensity.current) {
@@ -293,21 +281,22 @@
     }
 
     /**
-     * Creates a Row/Column with a viewport of 100.dp, containing 100 items each 17.dp in size.
-     * The items have a text with their index (ASC), and where the viewport starts is determined
-     * by the given [lambda][rememberScrollState]. All properties from [config] are applied. The
-     * viewport has padding around it to make sure scroll distance doesn't include padding.
+     * Creates a Row/Column with a viewport of 100.dp, containing 100 items each 17.dp in size. The
+     * items have a text with their index (ASC), and where the viewport starts is determined by the
+     * given [lambda][rememberScrollState]. All properties from [config] are applied. The viewport
+     * has padding around it to make sure scroll distance doesn't include padding.
      */
     private fun createScrollableContent(rememberScrollState: @Composable () -> ScrollState) {
         rule.setContent {
             composeView = LocalView.current
-            val content = @Composable {
-                repeat(100) {
-                    Box(Modifier.requiredSize(17.dp)) {
-                        BasicText("$it", Modifier.align(Alignment.Center))
+            val content =
+                @Composable {
+                    repeat(100) {
+                        Box(Modifier.requiredSize(17.dp)) {
+                            BasicText("$it", Modifier.align(Alignment.Center))
+                        }
                     }
                 }
-            }
 
             val state = rememberScrollState()
 
@@ -316,7 +305,9 @@
                     val direction = if (config.rtl) LayoutDirection.Rtl else LayoutDirection.Ltr
                     CompositionLocalProvider(LocalLayoutDirection provides direction) {
                         Row(
-                            Modifier.testTag(scrollerTag).align(Alignment.Center).padding(100.dp)
+                            Modifier.testTag(scrollerTag)
+                                .align(Alignment.Center)
+                                .padding(100.dp)
                                 .horizontalScroll(state, reverseScrolling = config.reversed)
                         ) {
                             content()
@@ -324,7 +315,9 @@
                     }
                 } else {
                     Column(
-                        Modifier.testTag(scrollerTag).align(Alignment.Center).padding(100.dp)
+                        Modifier.testTag(scrollerTag)
+                            .align(Alignment.Center)
+                            .padding(100.dp)
                             .verticalScroll(state, reverseScrolling = config.reversed)
                     ) {
                         content()
diff --git a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/ScrollTest.kt b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/ScrollTest.kt
index 3c4ec9c..0eab2a6 100644
--- a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/ScrollTest.kt
+++ b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/ScrollTest.kt
@@ -127,32 +127,33 @@
     companion object {
         @JvmStatic
         @Parameterized.Parameters(name = "{0}")
-        fun data(): List<Config> = listOf(
-            // Don't need to check both directions for vertical scrolling.
-            Config(Vertical, Ltr),
-            Config(Horizontal, Ltr),
-            Config(Horizontal, Rtl),
-        )
+        fun data(): List<Config> =
+            listOf(
+                // Don't need to check both directions for vertical scrolling.
+                Config(Vertical, Ltr),
+                Config(Horizontal, Ltr),
+                Config(Horizontal, Rtl),
+            )
     }
 
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
     private val scrollerTag = "ScrollerTest"
 
     private val defaultCrossAxisSize = 45
     private val defaultMainAxisSize = 40
     private val defaultCellSize = 5
-    private val colors = listOf(
-        Color(red = 0xFF, green = 0, blue = 0, alpha = 0xFF),
-        Color(red = 0xFF, green = 0xA5, blue = 0, alpha = 0xFF),
-        Color(red = 0xFF, green = 0xFF, blue = 0, alpha = 0xFF),
-        Color(red = 0xA5, green = 0xFF, blue = 0, alpha = 0xFF),
-        Color(red = 0, green = 0xFF, blue = 0, alpha = 0xFF),
-        Color(red = 0, green = 0xFF, blue = 0xA5, alpha = 0xFF),
-        Color(red = 0, green = 0, blue = 0xFF, alpha = 0xFF),
-        Color(red = 0xA5, green = 0, blue = 0xFF, alpha = 0xFF)
-    )
+    private val colors =
+        listOf(
+            Color(red = 0xFF, green = 0, blue = 0, alpha = 0xFF),
+            Color(red = 0xFF, green = 0xA5, blue = 0, alpha = 0xFF),
+            Color(red = 0xFF, green = 0xFF, blue = 0, alpha = 0xFF),
+            Color(red = 0xA5, green = 0xFF, blue = 0, alpha = 0xFF),
+            Color(red = 0, green = 0xFF, blue = 0, alpha = 0xFF),
+            Color(red = 0, green = 0xFF, blue = 0xA5, alpha = 0xFF),
+            Color(red = 0, green = 0, blue = 0xFF, alpha = 0xFF),
+            Color(red = 0xA5, green = 0, blue = 0xFF, alpha = 0xFF)
+        )
 
     @get:Rule
     val animationScaleRule: AnimationDurationScaleRule =
@@ -192,9 +193,7 @@
 
         composeScroller(scrollState)
 
-        rule.runOnIdle {
-            assertTrue(scrollState.maxValue == 0)
-        }
+        rule.runOnIdle { assertTrue(scrollState.maxValue == 0) }
     }
 
     @SdkSuppress(minSdkVersion = 26)
@@ -220,9 +219,7 @@
 
         rule.waitForIdle()
         assertEquals(scrollDistance, scrollState.maxValue)
-        scope.launch {
-            scrollState.scrollTo(scrollDistance)
-        }
+        scope.launch { scrollState.scrollTo(scrollDistance) }
 
         validateScroller(offset = scrollDistance, mainAxis = size)
     }
@@ -249,9 +246,7 @@
 
         composeScroller(scrollState, mainAxisSize = size, isReversed = true)
 
-        scope.launch {
-            scrollState.scrollTo(scrollDistance)
-        }
+        scope.launch { scrollState.scrollTo(scrollDistance) }
 
         validateScroller(offset = expectedOffset, mainAxis = size)
     }
@@ -260,35 +255,23 @@
     fun scrollTo_scrollForward() {
         createScrollableContent()
 
-        rule.onNodeWithText("50")
-            .assertIsNotDisplayed()
-            .performScrollTo()
-            .assertIsDisplayed()
+        rule.onNodeWithText("50").assertIsNotDisplayed().performScrollTo().assertIsDisplayed()
     }
 
     @Test
     fun reversed_scrollTo_scrollForward() {
         createScrollableContent(isReversed = true)
 
-        rule.onNodeWithText("50")
-            .assertIsNotDisplayed()
-            .performScrollTo()
-            .assertIsDisplayed()
+        rule.onNodeWithText("50").assertIsNotDisplayed().performScrollTo().assertIsDisplayed()
     }
 
     @Test
     fun scrollTo_scrollBack() {
         createScrollableContent()
 
-        rule.onNodeWithText("50")
-            .assertIsNotDisplayed()
-            .performScrollTo()
-            .assertIsDisplayed()
+        rule.onNodeWithText("50").assertIsNotDisplayed().performScrollTo().assertIsDisplayed()
 
-        rule.onNodeWithText("20")
-            .assertIsNotDisplayed()
-            .performScrollTo()
-            .assertIsDisplayed()
+        rule.onNodeWithText("20").assertIsNotDisplayed().performScrollTo().assertIsDisplayed()
     }
 
     @Test
@@ -307,16 +290,12 @@
         val scrollState = ScrollState(initial = 0)
 
         fun scrollBy(delta: Float) {
-            scope.launch {
-                scrollState.scrollBy(delta)
-            }
+            scope.launch { scrollState.scrollBy(delta) }
             rule.waitForIdle()
         }
 
         fun scrollTo(position: Int) {
-            scope.launch {
-                scrollState.scrollTo(position)
-            }
+            scope.launch { scrollState.scrollTo(position) }
             rule.waitForIdle()
         }
 
@@ -350,19 +329,14 @@
         val scrollState = ScrollState(initial = 0)
         val itemCount = mutableStateOf(100)
 
-        createScrollableContent(
-            scrollState = scrollState,
-            itemCount = { itemCount.value }
-        )
+        createScrollableContent(scrollState = scrollState, itemCount = { itemCount.value })
 
         rule.waitForIdle()
         assertThat(scrollState.value).isEqualTo(0)
         assertThat(scrollState.maxValue).isGreaterThan(0)
         val max = scrollState.maxValue
 
-        scope.launch {
-            scrollState.scrollTo(max)
-        }
+        scope.launch { scrollState.scrollTo(max) }
         rule.waitForIdle()
         itemCount.value -= 2
 
@@ -377,16 +351,12 @@
         val scrollState = ScrollState(initial = 0)
 
         fun animateScrollTo(delta: Int) {
-            scope.launch {
-                scrollState.animateScrollTo(delta)
-            }
+            scope.launch { scrollState.animateScrollTo(delta) }
             rule.waitForIdle()
         }
 
         fun animateScrollBy(delta: Float) {
-            scope.launch {
-                scrollState.animateScrollBy(delta)
-            }
+            scope.launch { scrollState.animateScrollBy(delta) }
             rule.waitForIdle()
         }
 
@@ -423,10 +393,7 @@
         assertThat(scrollState.value).isEqualTo(0)
         assertThat(scrollState.isScrollInProgress).isEqualTo(false)
 
-        rule.onNodeWithTag(scrollerTag)
-            .performTouchInput {
-                configAwareSwipe()
-            }
+        rule.onNodeWithTag(scrollerTag).performTouchInput { configAwareSwipe() }
 
         assertThat(scrollState.isScrollInProgress).isEqualTo(true)
         val scrollAtFlingStart = scrollState.value
@@ -437,8 +404,7 @@
         // Interrupt the fling
         val scrollWhenInterruptFling = scrollState.value
         assertThat(scrollWhenInterruptFling).isGreaterThan(scrollAtFlingStart)
-        rule.onNodeWithTag(scrollerTag)
-            .performTouchInput { down(center) }
+        rule.onNodeWithTag(scrollerTag).performTouchInput { down(center) }
 
         // The fling has been stopped:
         rule.mainClock.advanceTimeBy(100)
@@ -454,40 +420,27 @@
             ExtractCoroutineScope()
             val actualState = rememberScrollState()
             SideEffect { scrollState = actualState }
-            val content = @Composable {
-                repeat(50) {
-                    Box(Modifier.size(100.dp))
-                }
-            }
+            val content = @Composable { repeat(50) { Box(Modifier.size(100.dp)) } }
             when (config.orientation) {
                 Vertical -> {
-                    Column(Modifier.verticalScroll(actualState)) {
-                        content()
-                    }
+                    Column(Modifier.verticalScroll(actualState)) { content() }
                 }
-
                 Horizontal -> {
                     CompositionLocalProvider(LocalLayoutDirection provides config.layoutDirection) {
-                        Row(Modifier.horizontalScroll(actualState)) {
-                            content()
-                        }
+                        Row(Modifier.horizontalScroll(actualState)) { content() }
                     }
                 }
             }
         }
 
         rule.waitForIdle()
-        scope.launch {
-            scrollState!!.scrollTo(70)
-        }
+        scope.launch { scrollState!!.scrollTo(70) }
         rule.waitForIdle()
         scrollState = null
 
         restorationTester.emulateSavedInstanceStateRestore()
 
-        rule.runOnIdle {
-            assertThat(scrollState!!.value).isEqualTo(70)
-        }
+        rule.runOnIdle { assertThat(scrollState!!.value).isEqualTo(70) }
     }
 
     @Test
@@ -534,8 +487,11 @@
         assertThat(scrollState.value).isEqualTo(0)
         assertThat(scrollState.maxValue).isGreaterThan(100) // If this fails, just add more items
 
-        val action = rule.onNodeWithTag(scrollerTag)
-            .fetchSemanticsNode().config[SemanticsActions.ScrollByOffset]
+        val action =
+            rule
+                .onNodeWithTag(scrollerTag)
+                .fetchSemanticsNode()
+                .config[SemanticsActions.ScrollByOffset]
         scope.launch(start = CoroutineStart.UNDISPATCHED) {
             when (config.orientation) {
                 Vertical -> action(Offset(0f, 100f))
@@ -569,22 +525,27 @@
         assertThat(scrollState.value).isEqualTo(0)
         assertThat(scrollState.maxValue).isGreaterThan(100) // If this fails, just add more items
 
-        val action = rule.onNodeWithTag(scrollerTag).fetchSemanticsNode()
-            .config[SemanticsActions.ScrollByOffset]
+        val action =
+            rule
+                .onNodeWithTag(scrollerTag)
+                .fetchSemanticsNode()
+                .config[SemanticsActions.ScrollByOffset]
 
         scope.launch {
-            consumedScroll = when (config.orientation) {
-                Vertical -> action(Offset(0f, 100f))
-                Horizontal -> action(Offset(100f, 0f))
-            }
+            consumedScroll =
+                when (config.orientation) {
+                    Vertical -> action(Offset(0f, 100f))
+                    Horizontal -> action(Offset(100f, 0f))
+                }
         }
         rule.runOnIdle {
-            assertThat(consumedScroll).isEqualTo(
-                when (config.orientation) {
-                    Vertical -> Offset(0f, 100f)
-                    Horizontal -> Offset(100f, 0f)
-                }
-            )
+            assertThat(consumedScroll)
+                .isEqualTo(
+                    when (config.orientation) {
+                        Vertical -> Offset(0f, 100f)
+                        Horizontal -> Offset(100f, 0f)
+                    }
+                )
         }
 
         // Try to scroll again, only consume part.
@@ -592,18 +553,20 @@
         val impossibleScrollRequest = scrollState.maxValue + 10f
         // b/330698760
         scope.launch(DisableAnimationMotionDurationScale) {
-            consumedScroll = when (config.orientation) {
-                Vertical -> action(Offset(0f, impossibleScrollRequest))
-                Horizontal -> action(Offset(impossibleScrollRequest, 0f))
-            }
+            consumedScroll =
+                when (config.orientation) {
+                    Vertical -> action(Offset(0f, impossibleScrollRequest))
+                    Horizontal -> action(Offset(impossibleScrollRequest, 0f))
+                }
         }
         rule.runOnIdle {
-            assertThat(consumedScroll).isEqualTo(
-                when (config.orientation) {
-                    Vertical -> Offset(0f, expectedConsumed.toFloat())
-                    Horizontal -> Offset(expectedConsumed.toFloat(), 0f)
-                }
-            )
+            assertThat(consumedScroll)
+                .isEqualTo(
+                    when (config.orientation) {
+                        Vertical -> Offset(0f, expectedConsumed.toFloat())
+                        Horizontal -> Offset(expectedConsumed.toFloat(), 0f)
+                    }
+                )
         }
     }
 
@@ -612,19 +575,18 @@
         val scrollState = ScrollState(initial = 0)
         val scrollNode = rule.onNodeWithTag(scrollerTag)
         createScrollableContent(scrollState = scrollState)
-        val yScrollState = scrollNode
-            .fetchSemanticsNode()
-            .config
-            .getOrNull(
-                when (config.orientation) {
-                    Vertical -> SemanticsProperties.VerticalScrollAxisRange
-                    Horizontal -> SemanticsProperties.HorizontalScrollAxisRange
-                }
-            )
+        val yScrollState =
+            scrollNode
+                .fetchSemanticsNode()
+                .config
+                .getOrNull(
+                    when (config.orientation) {
+                        Vertical -> SemanticsProperties.VerticalScrollAxisRange
+                        Horizontal -> SemanticsProperties.HorizontalScrollAxisRange
+                    }
+                )
 
-        scrollNode.performTouchInput {
-            configAwareSwipe()
-        }
+        scrollNode.performTouchInput { configAwareSwipe() }
 
         assertThat(yScrollState?.value?.invoke()).isEqualTo(scrollState.value)
     }
@@ -633,23 +595,19 @@
     fun scroller_touchInputDisabled_shouldHaveSemanticsInfo() {
         val scrollState = ScrollState(initial = 0)
         val scrollNode = rule.onNodeWithTag(scrollerTag)
-        createScrollableContent(
-            scrollState = scrollState,
-            touchInputEnabled = false
-        )
-        val scrollSemantics = scrollNode
-            .fetchSemanticsNode()
-            .config
-            .getOrNull(
-                when (config.orientation) {
-                    Vertical -> SemanticsProperties.VerticalScrollAxisRange
-                    Horizontal -> SemanticsProperties.HorizontalScrollAxisRange
-                }
-            )
+        createScrollableContent(scrollState = scrollState, touchInputEnabled = false)
+        val scrollSemantics =
+            scrollNode
+                .fetchSemanticsNode()
+                .config
+                .getOrNull(
+                    when (config.orientation) {
+                        Vertical -> SemanticsProperties.VerticalScrollAxisRange
+                        Horizontal -> SemanticsProperties.HorizontalScrollAxisRange
+                    }
+                )
 
-        scrollNode.performTouchInput {
-            configAwareSwipe()
-        }
+        scrollNode.performTouchInput { configAwareSwipe() }
 
         assertThat(scrollSemantics?.value?.invoke()).isEqualTo(scrollState.value)
     }
@@ -667,32 +625,20 @@
                     when (config.orientation) {
                         Vertical -> {
                             Column(
-                                Modifier
-                                    .testTag(scrollerTag)
-                                    .verticalScroll(state = scrollState)
+                                Modifier.testTag(scrollerTag).verticalScroll(state = scrollState)
                             ) {
-                                Box(
-                                    Modifier
-                                        .height(contentSize)
-                                        .fillMaxWidth()
-                                )
+                                Box(Modifier.height(contentSize).fillMaxWidth())
                             }
                         }
-
                         Horizontal -> {
                             CompositionLocalProvider(
                                 LocalLayoutDirection provides config.layoutDirection
                             ) {
                                 Row(
-                                    Modifier
-                                        .testTag(scrollerTag)
+                                    Modifier.testTag(scrollerTag)
                                         .horizontalScroll(state = scrollState)
                                 ) {
-                                    Box(
-                                        Modifier
-                                            .width(contentSize)
-                                            .fillMaxHeight()
-                                    )
+                                    Box(Modifier.width(contentSize).fillMaxHeight())
                                 }
                             }
                         }
@@ -701,33 +647,31 @@
             }
         }
 
-        rule.onNodeWithTag(scrollerTag)
-            .performTouchInput {
-                configAwareSwipe()
-            }
+        rule.onNodeWithTag(scrollerTag).performTouchInput { configAwareSwipe() }
 
-        rule.runOnIdle {
-            assertThat(scrollState.value).isEqualTo(10)
-        }
+        rule.runOnIdle { assertThat(scrollState.value).isEqualTo(10) }
     }
 
     @Test
     fun testInspectorValue() {
         val state = ScrollState(initial = 0)
         rule.setContent {
-            val modifier = when (config.orientation) {
-                Vertical -> Modifier.verticalScroll(state)
-                Horizontal -> Modifier.horizontalScroll(state)
-            } as InspectableValue
+            val modifier =
+                when (config.orientation) {
+                    Vertical -> Modifier.verticalScroll(state)
+                    Horizontal -> Modifier.horizontalScroll(state)
+                }
+                    as InspectableValue
             assertThat(modifier.nameFallback).isEqualTo("scroll")
             assertThat(modifier.valueOverride).isNull()
-            assertThat(modifier.inspectableElements.map { it.name }.asIterable()).containsExactly(
-                "state",
-                "reverseScrolling",
-                "flingBehavior",
-                "isScrollable",
-                "isVertical"
-            )
+            assertThat(modifier.inspectableElements.map { it.name }.asIterable())
+                .containsExactly(
+                    "state",
+                    "reverseScrolling",
+                    "flingBehavior",
+                    "isScrollable",
+                    "isVertical"
+                )
         }
     }
 
@@ -736,42 +680,21 @@
     fun doesNotClipOverdraw() {
         rule.setContent {
             val scrollState = rememberScrollState(20)
-            Box(
-                Modifier
-                    .size(60.dp)
-                    .testTag("container")
-                    .background(Color.Gray)
-            ) {
-                val content = @Composable {
-                    repeat(4) {
-                        Box(
-                            Modifier
-                                .size(20.dp)
-                                .drawOutsideOfBounds()
-                        )
-                    }
-                }
+            Box(Modifier.size(60.dp).testTag("container").background(Color.Gray)) {
+                val content =
+                    @Composable { repeat(4) { Box(Modifier.size(20.dp).drawOutsideOfBounds()) } }
                 when (config.orientation) {
                     Vertical -> {
-                        Column(
-                            Modifier
-                                .padding(20.dp)
-                                .fillMaxSize()
-                                .verticalScroll(scrollState)
-                        ) {
+                        Column(Modifier.padding(20.dp).fillMaxSize().verticalScroll(scrollState)) {
                             content()
                         }
                     }
-
                     Horizontal -> {
                         CompositionLocalProvider(
                             LocalLayoutDirection provides config.layoutDirection
                         ) {
                             Row(
-                                Modifier
-                                    .padding(20.dp)
-                                    .fillMaxSize()
-                                    .horizontalScroll(scrollState)
+                                Modifier.padding(20.dp).fillMaxSize().horizontalScroll(scrollState)
                             ) {
                                 content()
                             }
@@ -781,12 +704,14 @@
             }
         }
 
-        val (horizontalPadding, verticalPadding) = when (config.orientation) {
-            Vertical -> Pair(0.dp, 20.dp)
-            Horizontal -> Pair(20.dp, 0.dp)
-        }
+        val (horizontalPadding, verticalPadding) =
+            when (config.orientation) {
+                Vertical -> Pair(0.dp, 20.dp)
+                Horizontal -> Pair(20.dp, 0.dp)
+            }
 
-        rule.onNodeWithTag("container")
+        rule
+            .onNodeWithTag("container")
             .captureToImage()
             .assertShape(
                 density = rule.density,
@@ -799,57 +724,74 @@
     }
 
     @Test
-    fun intrinsicMeasurements() = with(rule.density) {
-        rule.setContent {
-            Layout(
-                content = {
-                    CompositionLocalProvider(LocalLayoutDirection provides config.layoutDirection) {
-                        Layout(
-                            content = {},
-                            modifier = when (config.orientation) {
-                                Vertical -> Modifier.verticalScroll(rememberScrollState())
-                                Horizontal -> Modifier.horizontalScroll(rememberScrollState())
-                            },
-                            object : MeasurePolicy {
-                                override fun MeasureScope.measure(
-                                    measurables: List<Measurable>,
-                                    constraints: Constraints,
-                                ) = layout(0, 0) {}
+    fun intrinsicMeasurements() =
+        with(rule.density) {
+            rule.setContent {
+                Layout(
+                    content = {
+                        CompositionLocalProvider(
+                            LocalLayoutDirection provides config.layoutDirection
+                        ) {
+                            Layout(
+                                content = {},
+                                modifier =
+                                    when (config.orientation) {
+                                        Vertical -> Modifier.verticalScroll(rememberScrollState())
+                                        Horizontal ->
+                                            Modifier.horizontalScroll(rememberScrollState())
+                                    },
+                                object : MeasurePolicy {
+                                    override fun MeasureScope.measure(
+                                        measurables: List<Measurable>,
+                                        constraints: Constraints,
+                                    ) = layout(0, 0) {}
 
-                                override fun IntrinsicMeasureScope.minIntrinsicWidth(
-                                    measurables: List<IntrinsicMeasurable>,
-                                    height: Int,
-                                ) = 10.dp.roundToPx()
+                                    override fun IntrinsicMeasureScope.minIntrinsicWidth(
+                                        measurables: List<IntrinsicMeasurable>,
+                                        height: Int,
+                                    ) = 10.dp.roundToPx()
 
-                                override fun IntrinsicMeasureScope.minIntrinsicHeight(
-                                    measurables: List<IntrinsicMeasurable>,
-                                    width: Int,
-                                ) = 20.dp.roundToPx()
+                                    override fun IntrinsicMeasureScope.minIntrinsicHeight(
+                                        measurables: List<IntrinsicMeasurable>,
+                                        width: Int,
+                                    ) = 20.dp.roundToPx()
 
-                                override fun IntrinsicMeasureScope.maxIntrinsicWidth(
-                                    measurables: List<IntrinsicMeasurable>,
-                                    height: Int,
-                                ) = 30.dp.roundToPx()
+                                    override fun IntrinsicMeasureScope.maxIntrinsicWidth(
+                                        measurables: List<IntrinsicMeasurable>,
+                                        height: Int,
+                                    ) = 30.dp.roundToPx()
 
-                                override fun IntrinsicMeasureScope.maxIntrinsicHeight(
-                                    measurables: List<IntrinsicMeasurable>,
-                                    width: Int,
-                                ) = 40.dp.roundToPx()
-                            }
-                        )
+                                    override fun IntrinsicMeasureScope.maxIntrinsicHeight(
+                                        measurables: List<IntrinsicMeasurable>,
+                                        width: Int,
+                                    ) = 40.dp.roundToPx()
+                                }
+                            )
+                        }
                     }
+                ) { measurables, _ ->
+                    val measurable = measurables.first()
+                    assertEquals(
+                        10.dp.roundToPx(),
+                        measurable.minIntrinsicWidth(Constraints.Infinity)
+                    )
+                    assertEquals(
+                        20.dp.roundToPx(),
+                        measurable.minIntrinsicHeight(Constraints.Infinity)
+                    )
+                    assertEquals(
+                        30.dp.roundToPx(),
+                        measurable.maxIntrinsicWidth(Constraints.Infinity)
+                    )
+                    assertEquals(
+                        40.dp.roundToPx(),
+                        measurable.maxIntrinsicHeight(Constraints.Infinity)
+                    )
+                    layout(0, 0) {}
                 }
-            ) { measurables, _ ->
-                val measurable = measurables.first()
-                assertEquals(10.dp.roundToPx(), measurable.minIntrinsicWidth(Constraints.Infinity))
-                assertEquals(20.dp.roundToPx(), measurable.minIntrinsicHeight(Constraints.Infinity))
-                assertEquals(30.dp.roundToPx(), measurable.maxIntrinsicWidth(Constraints.Infinity))
-                assertEquals(40.dp.roundToPx(), measurable.maxIntrinsicHeight(Constraints.Infinity))
-                layout(0, 0) {}
             }
+            rule.waitForIdle()
         }
-        rule.waitForIdle()
-    }
 
     @Test
     fun scrollStateMaxValue_changesOnResize_beforePlacement() {
@@ -866,14 +808,11 @@
             with(LocalDensity.current) {
                 CompositionLocalProvider(LocalLayoutDirection provides config.layoutDirection) {
                     Box(
-                        Modifier
-                            .size(100.toDp())
+                        Modifier.size(100.toDp())
                             // This callback is invoked after the measure pass but before the
                             // placement pass. The initial max value should have been set by
                             // this time.
-                            .onSizeChanged {
-                                maxScrollValues += scrollState.maxValue
-                            }
+                            .onSizeChanged { maxScrollValues += scrollState.maxValue }
                             .then(
                                 when (config.orientation) {
                                     Vertical -> Modifier.verticalScroll(scrollState)
@@ -887,49 +826,42 @@
             }
         }
 
-        rule.runOnIdle {
-            assertThat(maxScrollValues).containsExactly(
-                Int.MAX_VALUE,
-                0
-            ).inOrder()
-        }
+        rule.runOnIdle { assertThat(maxScrollValues).containsExactly(Int.MAX_VALUE, 0).inOrder() }
     }
 
     @Test
     fun minIntrinsic_mainAxis() {
         var sizeParam by mutableStateOf(0)
 
-        val layoutModifier = object : LayoutModifier {
-            override fun MeasureScope.measure(
-                measurable: Measurable,
-                constraints: Constraints
-            ): MeasureResult {
-                val p = measurable.measure(constraints)
-                return layout(p.width, p.height) {
-                    p.place(0, 0)
+        val layoutModifier =
+            object : LayoutModifier {
+                override fun MeasureScope.measure(
+                    measurable: Measurable,
+                    constraints: Constraints
+                ): MeasureResult {
+                    val p = measurable.measure(constraints)
+                    return layout(p.width, p.height) { p.place(0, 0) }
+                }
+
+                override fun IntrinsicMeasureScope.minIntrinsicWidth(
+                    measurable: IntrinsicMeasurable,
+                    height: Int
+                ): Int {
+                    sizeParam = height
+                    return measurable.minIntrinsicWidth(height)
+                }
+
+                override fun IntrinsicMeasureScope.minIntrinsicHeight(
+                    measurable: IntrinsicMeasurable,
+                    width: Int
+                ): Int {
+                    sizeParam = width
+                    return measurable.minIntrinsicHeight(width)
                 }
             }
-
-            override fun IntrinsicMeasureScope.minIntrinsicWidth(
-                measurable: IntrinsicMeasurable,
-                height: Int
-            ): Int {
-                sizeParam = height
-                return measurable.minIntrinsicWidth(height)
-            }
-
-            override fun IntrinsicMeasureScope.minIntrinsicHeight(
-                measurable: IntrinsicMeasurable,
-                width: Int
-            ): Int {
-                sizeParam = width
-                return measurable.minIntrinsicHeight(width)
-            }
-        }
         rule.setContent {
             Box(
-                Modifier
-                    .intrinsicMainAxisSize(IntrinsicSize.Min)
+                Modifier.intrinsicMainAxisSize(IntrinsicSize.Min)
                     .scrollerWithOrientation()
                     .then(layoutModifier)
             )
@@ -942,37 +874,35 @@
     fun minIntrinsic_crossAxis() {
         var sizeParam by mutableStateOf(0)
 
-        val layoutModifier = object : LayoutModifier {
-            override fun MeasureScope.measure(
-                measurable: Measurable,
-                constraints: Constraints
-            ): MeasureResult {
-                val p = measurable.measure(constraints)
-                return layout(p.width, p.height) {
-                    p.place(0, 0)
+        val layoutModifier =
+            object : LayoutModifier {
+                override fun MeasureScope.measure(
+                    measurable: Measurable,
+                    constraints: Constraints
+                ): MeasureResult {
+                    val p = measurable.measure(constraints)
+                    return layout(p.width, p.height) { p.place(0, 0) }
+                }
+
+                override fun IntrinsicMeasureScope.minIntrinsicWidth(
+                    measurable: IntrinsicMeasurable,
+                    height: Int
+                ): Int {
+                    sizeParam = height
+                    return measurable.minIntrinsicWidth(height)
+                }
+
+                override fun IntrinsicMeasureScope.minIntrinsicHeight(
+                    measurable: IntrinsicMeasurable,
+                    width: Int
+                ): Int {
+                    sizeParam = width
+                    return measurable.minIntrinsicHeight(width)
                 }
             }
-
-            override fun IntrinsicMeasureScope.minIntrinsicWidth(
-                measurable: IntrinsicMeasurable,
-                height: Int
-            ): Int {
-                sizeParam = height
-                return measurable.minIntrinsicWidth(height)
-            }
-
-            override fun IntrinsicMeasureScope.minIntrinsicHeight(
-                measurable: IntrinsicMeasurable,
-                width: Int
-            ): Int {
-                sizeParam = width
-                return measurable.minIntrinsicHeight(width)
-            }
-        }
         rule.setContent {
             Box(
-                Modifier
-                    .intrinsicCrossAxisSize(IntrinsicSize.Min)
+                Modifier.intrinsicCrossAxisSize(IntrinsicSize.Min)
                     .scrollerWithOrientation()
                     .then(layoutModifier)
             )
@@ -985,37 +915,35 @@
     fun maxIntrinsic_mainAxis() {
         var sizeParam by mutableStateOf(0)
 
-        val layoutModifier = object : LayoutModifier {
-            override fun MeasureScope.measure(
-                measurable: Measurable,
-                constraints: Constraints
-            ): MeasureResult {
-                val p = measurable.measure(constraints)
-                return layout(p.width, p.height) {
-                    p.place(0, 0)
+        val layoutModifier =
+            object : LayoutModifier {
+                override fun MeasureScope.measure(
+                    measurable: Measurable,
+                    constraints: Constraints
+                ): MeasureResult {
+                    val p = measurable.measure(constraints)
+                    return layout(p.width, p.height) { p.place(0, 0) }
+                }
+
+                override fun IntrinsicMeasureScope.maxIntrinsicWidth(
+                    measurable: IntrinsicMeasurable,
+                    height: Int
+                ): Int {
+                    sizeParam = height
+                    return measurable.minIntrinsicWidth(height)
+                }
+
+                override fun IntrinsicMeasureScope.maxIntrinsicHeight(
+                    measurable: IntrinsicMeasurable,
+                    width: Int
+                ): Int {
+                    sizeParam = width
+                    return measurable.minIntrinsicHeight(width)
                 }
             }
-
-            override fun IntrinsicMeasureScope.maxIntrinsicWidth(
-                measurable: IntrinsicMeasurable,
-                height: Int
-            ): Int {
-                sizeParam = height
-                return measurable.minIntrinsicWidth(height)
-            }
-
-            override fun IntrinsicMeasureScope.maxIntrinsicHeight(
-                measurable: IntrinsicMeasurable,
-                width: Int
-            ): Int {
-                sizeParam = width
-                return measurable.minIntrinsicHeight(width)
-            }
-        }
         rule.setContent {
             Box(
-                Modifier
-                    .intrinsicMainAxisSize(IntrinsicSize.Max)
+                Modifier.intrinsicMainAxisSize(IntrinsicSize.Max)
                     .scrollerWithOrientation()
                     .then(layoutModifier)
             )
@@ -1028,37 +956,35 @@
     fun maxIntrinsic_crossAxis() {
         var sizeParam by mutableStateOf(0)
 
-        val layoutModifier = object : LayoutModifier {
-            override fun MeasureScope.measure(
-                measurable: Measurable,
-                constraints: Constraints
-            ): MeasureResult {
-                val p = measurable.measure(constraints)
-                return layout(p.width, p.height) {
-                    p.place(0, 0)
+        val layoutModifier =
+            object : LayoutModifier {
+                override fun MeasureScope.measure(
+                    measurable: Measurable,
+                    constraints: Constraints
+                ): MeasureResult {
+                    val p = measurable.measure(constraints)
+                    return layout(p.width, p.height) { p.place(0, 0) }
+                }
+
+                override fun IntrinsicMeasureScope.maxIntrinsicWidth(
+                    measurable: IntrinsicMeasurable,
+                    height: Int
+                ): Int {
+                    sizeParam = height
+                    return measurable.minIntrinsicWidth(height)
+                }
+
+                override fun IntrinsicMeasureScope.maxIntrinsicHeight(
+                    measurable: IntrinsicMeasurable,
+                    width: Int
+                ): Int {
+                    sizeParam = width
+                    return measurable.minIntrinsicHeight(width)
                 }
             }
-
-            override fun IntrinsicMeasureScope.maxIntrinsicWidth(
-                measurable: IntrinsicMeasurable,
-                height: Int
-            ): Int {
-                sizeParam = height
-                return measurable.minIntrinsicWidth(height)
-            }
-
-            override fun IntrinsicMeasureScope.maxIntrinsicHeight(
-                measurable: IntrinsicMeasurable,
-                width: Int
-            ): Int {
-                sizeParam = width
-                return measurable.minIntrinsicHeight(width)
-            }
-        }
         rule.setContent {
             Box(
-                Modifier
-                    .intrinsicCrossAxisSize(IntrinsicSize.Max)
+                Modifier.intrinsicCrossAxisSize(IntrinsicSize.Max)
                     .scrollerWithOrientation()
                     .then(layoutModifier)
             )
@@ -1111,9 +1037,7 @@
 
         rule.waitForIdle()
         assertEquals(scrollDistance, scrollState.maxValue)
-        scope.launch {
-            scrollState.scrollTo(scrollDistance)
-        }
+        scope.launch { scrollState.scrollTo(scrollDistance) }
 
         rule.runOnIdle {
             assertTrue(scrollState.value == scrollDistance)
@@ -1136,9 +1060,7 @@
 
         rule.waitForIdle()
         assertEquals(scrollDistance, scrollState.maxValue / 2)
-        scope.launch {
-            scrollState.scrollTo(scrollDistance)
-        }
+        scope.launch { scrollState.scrollTo(scrollDistance) }
 
         rule.runOnIdle {
             assertTrue(scrollState.value == scrollDistance)
@@ -1169,30 +1091,20 @@
         var measurements = 0
         lateinit var scrollState: ScrollState
 
-        val sizeModifiers = if (config.orientation == Horizontal) {
-            Modifier
-                .fillMaxWidth()
-                .height(100.dp)
-        } else {
-            Modifier
-                .width(100.dp)
-                .fillMaxHeight()
-        }
+        val sizeModifiers =
+            if (config.orientation == Horizontal) {
+                Modifier.fillMaxWidth().height(100.dp)
+            } else {
+                Modifier.width(100.dp).fillMaxHeight()
+            }
 
-        val wrapperModifiers = Modifier
-            .testTag(scrollerTag)
-            .then(sizeModifiers)
-            .then(CountMeasureModifier { measurements++ })
+        val wrapperModifiers =
+            Modifier.testTag(scrollerTag)
+                .then(sizeModifiers)
+                .then(CountMeasureModifier { measurements++ })
 
         val content: @Composable () -> Unit = {
-            repeat(25) {
-                Box(
-                    modifier = Modifier
-                        .size(100.dp)
-                        .padding(2.dp)
-                        .background(Color.Red)
-                )
-            }
+            repeat(25) { Box(modifier = Modifier.size(100.dp).padding(2.dp).background(Color.Red)) }
         }
 
         rule.setContent {
@@ -1201,16 +1113,12 @@
             CompositionLocalProvider(LocalLayoutDirection provides config.layoutDirection) {
                 if (config.orientation == Horizontal) {
                     Row(
-                        Modifier
-                            .horizontalScroll(scrollState)
-                            .then(wrapperModifiers),
+                        Modifier.horizontalScroll(scrollState).then(wrapperModifiers),
                         content = { content() }
                     )
                 } else {
                     Column(
-                        Modifier
-                            .verticalScroll(scrollState)
-                            .then(wrapperModifiers),
+                        Modifier.verticalScroll(scrollState).then(wrapperModifiers),
                         content = { content() }
                     )
                 }
@@ -1219,10 +1127,7 @@
 
         val previousMeasurement = measurements
 
-        rule.onNodeWithTag(scrollerTag)
-            .performTouchInput {
-                configAwareSwipe()
-            }
+        rule.onNodeWithTag(scrollerTag).performTouchInput { configAwareSwipe() }
 
         rule.runOnIdle {
             assertThat(scrollState.value).isNotEqualTo(0) // check we scrolled
@@ -1253,16 +1158,17 @@
         }
 
     /**
-     * Swipes forward (up/left) or backward given the current orientation and layout direction
-     * of the test config.
+     * Swipes forward (up/left) or backward given the current orientation and layout direction of
+     * the test config.
      */
     private fun TouchInjectionScope.configAwareSwipe(forward: Boolean = true) =
         when (config.orientation) {
             Vertical -> if (forward) swipeUp() else swipeDown()
-            Horizontal -> when (config.layoutDirection) {
-                Ltr -> if (forward) swipeLeft() else swipeRight()
-                Rtl -> if (forward) swipeRight() else swipeLeft()
-            }
+            Horizontal ->
+                when (config.layoutDirection) {
+                    Ltr -> if (forward) swipeLeft() else swipeRight()
+                    Rtl -> if (forward) swipeRight() else swipeLeft()
+                }
         }
 
     private fun composeScroller(
@@ -1273,21 +1179,22 @@
         cellSize: Int = defaultCellSize
     ) {
         when (config.orientation) {
-            Vertical -> composeVerticalScroller(
-                scrollState = scrollState,
-                isReversed = isReversed,
-                width = crossAxisSize,
-                height = mainAxisSize,
-                rowHeight = cellSize
-            )
-
-            Horizontal -> composeHorizontalScroller(
-                scrollState = scrollState,
-                isReversed = isReversed,
-                width = mainAxisSize,
-                height = crossAxisSize,
-                isRtl = config.layoutDirection == Rtl
-            )
+            Vertical ->
+                composeVerticalScroller(
+                    scrollState = scrollState,
+                    isReversed = isReversed,
+                    width = crossAxisSize,
+                    height = mainAxisSize,
+                    rowHeight = cellSize
+                )
+            Horizontal ->
+                composeHorizontalScroller(
+                    scrollState = scrollState,
+                    isReversed = isReversed,
+                    width = mainAxisSize,
+                    height = crossAxisSize,
+                    isRtl = config.layoutDirection == Rtl
+                )
         }
     }
 
@@ -1305,20 +1212,13 @@
                 ExtractCoroutineScope()
                 Box {
                     Column(
-                        modifier = Modifier
-                            .size(width.toDp(), height.toDp())
-                            .testTag(scrollerTag)
-                            .verticalScroll(
-                                resolvedState,
-                                reverseScrolling = isReversed
-                            )
+                        modifier =
+                            Modifier.size(width.toDp(), height.toDp())
+                                .testTag(scrollerTag)
+                                .verticalScroll(resolvedState, reverseScrolling = isReversed)
                     ) {
                         colors.forEach { color ->
-                            Box(
-                                Modifier
-                                    .size(width.toDp(), rowHeight.toDp())
-                                    .background(color)
-                            )
+                            Box(Modifier.size(width.toDp(), rowHeight.toDp()).background(color))
                         }
                     }
                 }
@@ -1342,18 +1242,14 @@
                 CompositionLocalProvider(LocalLayoutDirection provides direction) {
                     Box {
                         Row(
-                            modifier = Modifier
-                                .size(width.toDp(), height.toDp())
-                                .testTag(scrollerTag)
-                                .horizontalScroll(
-                                    resolvedState,
-                                    reverseScrolling = isReversed
-                                )
+                            modifier =
+                                Modifier.size(width.toDp(), height.toDp())
+                                    .testTag(scrollerTag)
+                                    .horizontalScroll(resolvedState, reverseScrolling = isReversed)
                         ) {
                             colors.forEach { color ->
                                 Box(
-                                    Modifier
-                                        .size(defaultCellSize.toDp(), height.toDp())
+                                    Modifier.size(defaultCellSize.toDp(), height.toDp())
                                         .background(color)
                                 )
                             }
@@ -1372,19 +1268,20 @@
         cellSize: Int = 5
     ) {
         when (config.orientation) {
-            Vertical -> validateVerticalScroller(
-                offset = offset,
-                width = crossAxis,
-                height = mainAxis,
-                rowHeight = cellSize
-            )
-
-            Horizontal -> validateHorizontalScroller(
-                offset = offset,
-                width = mainAxis,
-                height = crossAxis,
-                checkInRtl = config.layoutDirection == Rtl
-            )
+            Vertical ->
+                validateVerticalScroller(
+                    offset = offset,
+                    width = crossAxis,
+                    height = mainAxis,
+                    rowHeight = cellSize
+                )
+            Horizontal ->
+                validateHorizontalScroller(
+                    offset = offset,
+                    width = mainAxis,
+                    height = crossAxis,
+                    checkInRtl = config.layoutDirection == Rtl
+                )
         }
     }
 
@@ -1395,12 +1292,12 @@
         height: Int = 40,
         rowHeight: Int = 5
     ) {
-        rule.onNodeWithTag(scrollerTag)
-            .captureToImage()
-            .assertPixels(expectedSize = IntSize(width, height)) { pos ->
-                val colorIndex = (offset + pos.y) / rowHeight
-                colors[colorIndex]
-            }
+        rule.onNodeWithTag(scrollerTag).captureToImage().assertPixels(
+            expectedSize = IntSize(width, height)
+        ) { pos ->
+            val colorIndex = (offset + pos.y) / rowHeight
+            colors[colorIndex]
+        }
     }
 
     @RequiresApi(api = 26)
@@ -1412,12 +1309,12 @@
     ) {
         val scrollerWidth = colors.size * defaultCellSize
         val absoluteOffset = if (checkInRtl) scrollerWidth - width - offset else offset
-        rule.onNodeWithTag(scrollerTag)
-            .captureToImage()
-            .assertPixels(expectedSize = IntSize(width, height)) { pos ->
-                val colorIndex = (absoluteOffset + pos.x) / defaultCellSize
-                if (checkInRtl) colors[colors.size - 1 - colorIndex] else colors[colorIndex]
-            }
+        rule.onNodeWithTag(scrollerTag).captureToImage().assertPixels(
+            expectedSize = IntSize(width, height)
+        ) { pos ->
+            val colorIndex = (absoluteOffset + pos.x) / defaultCellSize
+            if (checkInRtl) colors[colors.size - 1 - colorIndex] else colors[colorIndex]
+        }
     }
 
     private fun createScrollableContent(
@@ -1433,21 +1330,12 @@
         val resolvedState = scrollState ?: ScrollState(initial = 0)
         rule.setContent {
             ExtractCoroutineScope()
-            val content = @Composable {
-                repeat(itemCount()) {
-                    BasicText(text = "$it")
-                }
-            }
+            val content = @Composable { repeat(itemCount()) { BasicText(text = "$it") } }
             Box {
-                Box(
-                    Modifier
-                        .size(width, height)
-                        .background(Color.White)
-                ) {
+                Box(Modifier.size(width, height).background(Color.White)) {
                     if (isVertical) {
                         Column(
-                            Modifier
-                                .testTag(scrollerTag)
+                            Modifier.testTag(scrollerTag)
                                 .verticalScroll(
                                     resolvedState,
                                     enabled = touchInputEnabled,
@@ -1460,8 +1348,7 @@
                         val direction = if (isRtl) Rtl else Ltr
                         CompositionLocalProvider(LocalLayoutDirection provides direction) {
                             Row(
-                                Modifier
-                                    .testTag(scrollerTag)
+                                Modifier.testTag(scrollerTag)
                                     .horizontalScroll(
                                         resolvedState,
                                         enabled = touchInputEnabled,
@@ -1483,17 +1370,20 @@
     ): SemanticsNodeInteraction {
         val latch = CountDownLatch(1)
         val handler = Handler(Looper.getMainLooper())
-        handler.post(object : Runnable {
-            override fun run() {
-                if (scroller.isScrollInProgress) {
-                    handler.post(this)
-                } else {
-                    latch.countDown()
+        handler.post(
+            object : Runnable {
+                override fun run() {
+                    if (scroller.isScrollInProgress) {
+                        handler.post(this)
+                    } else {
+                        latch.countDown()
+                    }
                 }
             }
-        })
+        )
         assertWithMessage("Scroll didn't finish after 20 seconds")
-            .that(latch.await(20, TimeUnit.SECONDS)).isTrue()
+            .that(latch.await(20, TimeUnit.SECONDS))
+            .isTrue()
         return this
     }
 
@@ -1510,24 +1400,20 @@
 
         assertThat(scrollState.value).isEqualTo(0)
 
-        rule.onNodeWithTag(scrollerTag)
-            .performTouchInput { firstSwipe() }
+        rule.onNodeWithTag(scrollerTag).performTouchInput { firstSwipe() }
 
         rule.mainClock.advanceTimeBy(5000)
 
-        rule.onNodeWithTag(scrollerTag)
-            .awaitScrollAnimation(scrollState)
+        rule.onNodeWithTag(scrollerTag).awaitScrollAnimation(scrollState)
 
         val scrolledValue = scrollState.value
         assertThat(scrolledValue).isGreaterThan(0)
 
-        rule.onNodeWithTag(scrollerTag)
-            .performTouchInput { secondSwipe() }
+        rule.onNodeWithTag(scrollerTag).performTouchInput { secondSwipe() }
 
         rule.mainClock.advanceTimeBy(5000)
 
-        rule.onNodeWithTag(scrollerTag)
-            .awaitScrollAnimation(scrollState)
+        rule.onNodeWithTag(scrollerTag).awaitScrollAnimation(scrollState)
 
         assertThat(scrollState.value).isLessThan(scrolledValue)
     }
diff --git a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/ScrollableFocusableInteractionTest.kt b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/ScrollableFocusableInteractionTest.kt
index 986b0cc..47dadf2 100644
--- a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/ScrollableFocusableInteractionTest.kt
+++ b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/ScrollableFocusableInteractionTest.kt
@@ -80,16 +80,16 @@
     companion object {
         @JvmStatic
         @Parameterized.Parameters(name = "{0} reverseScrolling={1}")
-        fun initParameters() = arrayOf(
-            arrayOf(Vertical, true),
-            arrayOf(Vertical, false),
-            arrayOf(Horizontal, true),
-            arrayOf(Horizontal, false),
-        )
+        fun initParameters() =
+            arrayOf(
+                arrayOf(Vertical, true),
+                arrayOf(Vertical, false),
+                arrayOf(Horizontal, true),
+                arrayOf(Horizontal, false),
+            )
     }
 
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
     private val scrollableAreaTag = "scrollableArea"
     private val focusableTag = "focusable"
@@ -118,7 +118,8 @@
             }
         }
         requestFocusAndScrollToTop()
-        rule.onNodeWithTag(focusableTag)
+        rule
+            .onNodeWithTag(focusableTag)
             .assertScrollAxisPositionInRootIsEqualTo(90.toDp())
             .assertIsDisplayed()
             .assertIsFocused()
@@ -126,7 +127,8 @@
         // Act: Shrink the viewport.
         viewportSize = 50.toDp()
 
-        rule.onNodeWithTag(focusableTag)
+        rule
+            .onNodeWithTag(focusableTag)
             .assertScrollAxisPositionInRootIsEqualTo(40.toDp())
             .assertIsDisplayed()
     }
@@ -143,7 +145,8 @@
             }
         }
         requestFocusAndScrollToTop()
-        rule.onNodeWithTag(focusableTag)
+        rule
+            .onNodeWithTag(focusableTag)
             .assertScrollAxisPositionInRootIsEqualTo(90.toDp())
             .assertIsDisplayed()
             .assertIsFocused()
@@ -151,7 +154,8 @@
         // Act: Shrink the viewport.
         viewportSize = 95.toDp()
 
-        rule.onNodeWithTag(focusableTag)
+        rule
+            .onNodeWithTag(focusableTag)
             .assertScrollAxisPositionInRootIsEqualTo(85.toDp())
             .assertIsDisplayed()
     }
@@ -163,13 +167,12 @@
         rule.setContent {
             ScrollableRowOrColumn(size = viewportSize) {
                 // Put a focusable in the bottom of the viewport.
-                WithSpacerBefore(size = 90.toDp()) {
-                    TestFocusable(size = 10.toDp())
-                }
+                WithSpacerBefore(size = 90.toDp()) { TestFocusable(size = 10.toDp()) }
             }
         }
         requestFocusAndScrollToTop()
-        rule.onNodeWithTag(focusableTag)
+        rule
+            .onNodeWithTag(focusableTag)
             .assertScrollAxisPositionInRootIsEqualTo(
                 if (reverseScrolling) (-5).toDp() else 90.toDp()
             )
@@ -179,7 +182,8 @@
         // Act: Shrink the viewport.
         viewportSize = 91.toDp()
 
-        rule.onNodeWithTag(focusableTag)
+        rule
+            .onNodeWithTag(focusableTag)
             .assertScrollAxisPositionInRootIsEqualTo(
                 if (reverseScrolling) (-5 - 4).toDp() else 90.toDp()
             )
@@ -192,13 +196,12 @@
 
         rule.setContent {
             ScrollableRowOrColumn(size = viewportSize) {
-                WithSpacerBefore(90.toDp()) {
-                    TestFocusable(size = 10.toDp())
-                }
+                WithSpacerBefore(90.toDp()) { TestFocusable(size = 10.toDp()) }
             }
         }
         requestFocusAndScrollToTop()
-        rule.onNodeWithTag(focusableTag)
+        rule
+            .onNodeWithTag(focusableTag)
             .assertScrollAxisPositionInRootIsEqualTo(
                 if (reverseScrolling) (-5).toDp() else 90.toDp()
             )
@@ -208,7 +211,8 @@
         // Act: Shrink the viewport.
         viewportSize = 90.toDp()
 
-        rule.onNodeWithTag(focusableTag)
+        rule
+            .onNodeWithTag(focusableTag)
             .assertScrollAxisPositionInRootIsEqualTo(
                 // When reversing scrolling, shrinking the viewport will move the child as well by
                 // the amount it shrunk – 5px.
@@ -234,27 +238,23 @@
                     // Manually execute an "animation" that shrinks the viewport by twice the
                     // focusable's size on every frame, for a few frames. The underlying bug in
                     // b/230756508 would lose track of the focusable after the second frame.
-                    withFrameNanos {
-                        viewportSize = 80.toDp()
-                    }
-                    withFrameNanos {
-                        viewportSize = 60.toDp()
-                    }
-                    withFrameNanos {
-                        viewportSize = 40.toDp()
-                    }
+                    withFrameNanos { viewportSize = 80.toDp() }
+                    withFrameNanos { viewportSize = 60.toDp() }
+                    withFrameNanos { viewportSize = 40.toDp() }
                 }
             }
         }
         requestFocusAndScrollToTop()
-        rule.onNodeWithTag(focusableTag)
+        rule
+            .onNodeWithTag(focusableTag)
             .assertScrollAxisPositionInRootIsEqualTo(90.toDp())
             .assertIsDisplayed()
             .assertIsFocused()
 
         animate = true
 
-        rule.onNodeWithTag(focusableTag)
+        rule
+            .onNodeWithTag(focusableTag)
             .assertScrollAxisPositionInRootIsEqualTo(30.toDp())
             .assertIsDisplayed()
     }
@@ -271,7 +271,8 @@
             }
         }
         requestFocusAndScrollToTop()
-        rule.onNodeWithTag(focusableTag)
+        rule
+            .onNodeWithTag(focusableTag)
             .assertScrollAxisPositionInRootIsEqualTo(90.toDp())
             .assertIsDisplayed()
             .assertIsFocused()
@@ -284,26 +285,24 @@
         rule.waitForIdle()
 
         // Interrupt the scroll by manually dragging.
-        rule.onNodeWithTag(scrollableAreaTag)
-            .performTouchInput {
-                down(center)
-                moveBy(Offset(viewConfiguration.touchSlop + 1, viewConfiguration.touchSlop + 1))
-                up()
-            }
+        rule.onNodeWithTag(scrollableAreaTag).performTouchInput {
+            down(center)
+            moveBy(Offset(viewConfiguration.touchSlop + 1, viewConfiguration.touchSlop + 1))
+            up()
+        }
 
         // Resume the clock. The animation scroll animation should have been interrupted and not
         // continue.
         rule.mainClock.advanceTimeByFrame()
         rule.mainClock.autoAdvance = true
 
-        rule.onNodeWithTag(focusableTag)
-            .assertIsNotDisplayed()
+        rule.onNodeWithTag(focusableTag).assertIsNotDisplayed()
     }
 
     /**
      * This test ensures that scrollable correctly cleans up its state when the scroll animation
-     * triggered by shrinking the viewport is interrupted by something other than another shrink
-     * and the focusable child does not change. If it's cleaned up correctly, expanding then re-
+     * triggered by shrinking the viewport is interrupted by something other than another shrink and
+     * the focusable child does not change. If it's cleaned up correctly, expanding then re-
      * shrinking the viewport should trigger another animation.
      */
     @Test
@@ -318,7 +317,8 @@
             }
         }
         requestFocusAndScrollToTop()
-        rule.onNodeWithTag(focusableTag)
+        rule
+            .onNodeWithTag(focusableTag)
             .assertScrollAxisPositionInRootIsEqualTo(90.toDp())
             .assertIsDisplayed()
             .assertIsFocused()
@@ -331,21 +331,18 @@
         rule.waitForIdle()
 
         // Interrupt the scroll by manually dragging.
-        rule.onNodeWithTag(scrollableAreaTag)
-            .performTouchInput {
-                down(center)
-                moveBy(Offset(viewConfiguration.touchSlop + 1, viewConfiguration.touchSlop + 1))
-                up()
-            }
+        rule.onNodeWithTag(scrollableAreaTag).performTouchInput {
+            down(center)
+            moveBy(Offset(viewConfiguration.touchSlop + 1, viewConfiguration.touchSlop + 1))
+            up()
+        }
 
         // Resume the clock. The animation scroll animation should have been interrupted and not
         // continue.
         rule.mainClock.advanceTimeByFrame()
         rule.mainClock.autoAdvance = true
         rule.waitForIdle()
-        rule.onNodeWithTag(focusableTag)
-            .assertIsFocused()
-            .assertIsNotDisplayed()
+        rule.onNodeWithTag(focusableTag).assertIsFocused().assertIsNotDisplayed()
 
         // Expand the viewport back to its original size to bring the focusable back into view.
         viewportSize = 100.toDp()
@@ -356,8 +353,7 @@
         viewportSize = 50.toDp()
         rule.waitForIdle()
 
-        rule.onNodeWithTag(focusableTag)
-            .assertIsDisplayed()
+        rule.onNodeWithTag(focusableTag).assertIsDisplayed()
     }
 
     @Test
@@ -368,14 +364,13 @@
         rule.setContent {
             ScrollableRowOrColumn(viewportSize) {
                 // Put a focusable just out of view.
-                WithSpacerBefore(size = gapSize) {
-                    TestFocusable(10.toDp())
-                }
+                WithSpacerBefore(size = gapSize) { TestFocusable(10.toDp()) }
             }
         }
         requestFocusAndScrollToTop()
 
-        rule.onNodeWithTag(focusableTag)
+        rule
+            .onNodeWithTag(focusableTag)
             .assertScrollAxisPositionInRootIsEqualTo(
                 if (reverseScrolling) (-10).toDp() else gapSize
             )
@@ -386,7 +381,8 @@
         viewportSize = 50.toDp()
 
         // Focusable should not have moved since it was never in view.
-        rule.onNodeWithTag(focusableTag)
+        rule
+            .onNodeWithTag(focusableTag)
             .assertScrollAxisPositionInRootIsEqualTo(
                 // Focusable size minus the change in viewport size.
                 if (reverseScrolling) (-10 - 50).toDp() else gapSize
@@ -401,22 +397,20 @@
         rule.setContent {
             ScrollableRowOrColumn(size = viewportSize) {
                 // Put a focusable in the bottom of the viewport.
-                WithSpacerBefore(size = 90.toDp()) {
-                    TestFocusable(size = 10.toDp())
-                }
+                WithSpacerBefore(size = 90.toDp()) { TestFocusable(size = 10.toDp()) }
             }
         }
-        rule.onNodeWithTag(focusableTag)
-            .assertScrollAxisPositionInRootIsEqualTo(
-                if (reverseScrolling) 0.toDp() else 90.toDp()
-            )
+        rule
+            .onNodeWithTag(focusableTag)
+            .assertScrollAxisPositionInRootIsEqualTo(if (reverseScrolling) 0.toDp() else 90.toDp())
             .assertIsDisplayed()
             .assertIsNotFocused()
 
         // Act: Shrink the viewport.
         viewportSize = 50.toDp()
 
-        rule.onNodeWithTag(focusableTag)
+        rule
+            .onNodeWithTag(focusableTag)
             .assertScrollAxisPositionInRootIsEqualTo(
                 if (reverseScrolling) (-50).toDp() else 90.toDp()
             )
@@ -449,7 +443,8 @@
             scrollState.scrollBy(-halfFocusableSize)
         }
 
-        rule.onNodeWithTag(focusableTag)
+        rule
+            .onNodeWithTag(focusableTag)
             .assertScrollAxisPositionInRootIsEqualTo(
                 if (reverseScrolling) -itemSize / 2 else initialViewPortSize - (itemSize / 2)
             )
@@ -459,7 +454,8 @@
         // Act: Grow the viewport.
         viewportSize *= 2
 
-        rule.onNodeWithTag(focusableTag)
+        rule
+            .onNodeWithTag(focusableTag)
             .assertScrollAxisPositionInRootIsEqualTo(initialViewPortSize - (itemSize / 2))
             .assertIsDisplayed()
     }
@@ -472,24 +468,12 @@
 
         @Composable
         fun Focusable1() {
-            Box(
-                Modifier
-                    .size(10.toDp())
-                    .background(Color.Blue)
-                    .testTag(focusable1)
-                    .focusable()
-            )
+            Box(Modifier.size(10.toDp()).background(Color.Blue).testTag(focusable1).focusable())
         }
 
         @Composable
         fun Focusable2() {
-            Box(
-                Modifier
-                    .size(10.toDp())
-                    .background(Color.Blue)
-                    .testTag(focusable2)
-                    .focusable()
-            )
+            Box(Modifier.size(10.toDp()).background(Color.Blue).testTag(focusable2).focusable())
         }
 
         rule.setContent {
@@ -507,9 +491,7 @@
         rule.mainClock.autoAdvance = false
 
         // Shrink the viewport, which should scroll to keep focusable2 in-view.
-        rule.runOnIdle {
-            viewportSize = 20.toDp()
-        }
+        rule.runOnIdle { viewportSize = 20.toDp() }
 
         // Tick the clock forward to let the animation start and run a bit.
         repeat(3) { rule.mainClock.advanceTimeByFrame() }
@@ -586,9 +568,7 @@
         rule.runOnIdle { assertThat(scrollState.value).isEqualTo(100) }
     }
 
-    private fun ComposeContentTestRule.setContentForTest(
-        composable: @Composable () -> Unit
-    ) {
+    private fun ComposeContentTestRule.setContentForTest(composable: @Composable () -> Unit) {
         setContent {
             focusManager = LocalFocusManager.current
             composable()
@@ -596,14 +576,8 @@
     }
 
     @Composable
-    private fun ScrollableRowOrColumn(
-        size: Dp,
-        content: @Composable () -> Unit
-    ) {
-        val modifier = Modifier
-            .testTag(scrollableAreaTag)
-            .size(size)
-            .border(2.toDp(), Color.Black)
+    private fun ScrollableRowOrColumn(size: Dp, content: @Composable () -> Unit) {
+        val modifier = Modifier.testTag(scrollableAreaTag).size(size).border(2.toDp(), Color.Black)
 
         when (orientation) {
             Vertical -> {
@@ -613,9 +587,10 @@
                         state = scrollState,
                         reverseScrolling = reverseScrolling
                     )
-                ) { content() }
+                ) {
+                    content()
+                }
             }
-
             Horizontal -> {
                 Row(
                     // Uses scrollable under the hood.
@@ -623,14 +598,14 @@
                         state = scrollState,
                         reverseScrolling = reverseScrolling
                     )
-                ) { content() }
+                ) {
+                    content()
+                }
             }
         }
     }
 
-    /**
-     * Places a spacer before or after [content], depending on [reverseScrolling].
-     */
+    /** Places a spacer before or after [content], depending on [reverseScrolling]. */
     @Composable
     fun WithSpacerBefore(size: Dp, content: @Composable () -> Unit) {
         if (!reverseScrolling) {
@@ -648,8 +623,7 @@
         val isFocused by interactionSource.collectIsFocusedAsState()
 
         Box(
-            Modifier
-                .testTag(tag)
+            Modifier.testTag(tag)
                 .size(size)
                 .border(1.dp, Color.White)
                 .background(if (isFocused) Color.Blue else Color.Black)
@@ -658,9 +632,9 @@
     }
 
     /**
-     * Sizes and offsets of the composables in these tests must be specified using this function.
-     * If they're specified using `xx.dp` syntax, a rounding error somewhere in the layout system
-     * will cause the pixel values to be off-by-one.
+     * Sizes and offsets of the composables in these tests must be specified using this function. If
+     * they're specified using `xx.dp` syntax, a rounding error somewhere in the layout system will
+     * cause the pixel values to be off-by-one.
      */
     private fun Int.toDp(): Dp = with(rule.density) { this@toDp.toDp() }
 
@@ -676,9 +650,7 @@
     private fun scrollToTop() {
         rule.waitForIdle()
         // Reset scroll to top since requesting focus will scroll it.
-        runBlocking {
-            scrollState.scrollTo(if (reverseScrolling) -scrollState.maxValue else 0)
-        }
+        runBlocking { scrollState.scrollTo(if (reverseScrolling) -scrollState.maxValue else 0) }
     }
 
     private fun SemanticsNodeInteraction.assertScrollAxisPositionInRootIsEqualTo(expected: Dp) =
diff --git a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/ScrollableTest.kt b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/ScrollableTest.kt
index 33e55b0..eff03e9 100644
--- a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/ScrollableTest.kt
+++ b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/ScrollableTest.kt
@@ -147,8 +147,7 @@
 @RunWith(AndroidJUnit4::class)
 class ScrollableTest {
 
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
     private val scrollableBoxTag = "scrollableBox"
 
@@ -175,17 +174,15 @@
     @Test
     fun scrollable_horizontalScroll() {
         var total = 0f
-        val controller = ScrollableState(
-            consumeScrollDelta = {
-                total += it
-                it
-            }
-        )
-        setScrollableContent {
-            Modifier.scrollable(
-                state = controller,
-                orientation = Orientation.Horizontal
+        val controller =
+            ScrollableState(
+                consumeScrollDelta = {
+                    total += it
+                    it
+                }
             )
+        setScrollableContent {
+            Modifier.scrollable(state = controller, orientation = Orientation.Horizontal)
         }
         rule.onNodeWithTag(scrollableBoxTag).performTouchInput {
             this.swipe(
@@ -195,10 +192,11 @@
             )
         }
 
-        val lastTotal = rule.runOnIdle {
-            assertThat(total).isGreaterThan(0)
-            total
-        }
+        val lastTotal =
+            rule.runOnIdle {
+                assertThat(total).isGreaterThan(0)
+                total
+            }
         rule.onNodeWithTag(scrollableBoxTag).performTouchInput {
             this.swipe(
                 start = this.center,
@@ -207,9 +205,7 @@
             )
         }
 
-        rule.runOnIdle {
-            assertThat(total).isEqualTo(lastTotal)
-        }
+        rule.runOnIdle { assertThat(total).isEqualTo(lastTotal) }
         rule.onNodeWithTag(scrollableBoxTag).performTouchInput {
             this.swipe(
                 start = this.center,
@@ -217,66 +213,57 @@
                 durationMillis = 100
             )
         }
-        rule.runOnIdle {
-            assertThat(total).isLessThan(0.01f)
-        }
+        rule.runOnIdle { assertThat(total).isLessThan(0.01f) }
     }
 
     @OptIn(ExperimentalTestApi::class)
     @Test
     fun scrollable_horizontalScroll_mouseWheel() {
         var total = 0f
-        val controller = ScrollableState(
-            consumeScrollDelta = {
-                total += it
-                it
-            }
-        )
-        setScrollableContent {
-            Modifier.scrollable(
-                state = controller,
-                orientation = Orientation.Horizontal
+        val controller =
+            ScrollableState(
+                consumeScrollDelta = {
+                    total += it
+                    it
+                }
             )
+        setScrollableContent {
+            Modifier.scrollable(state = controller, orientation = Orientation.Horizontal)
         }
         rule.onNodeWithTag(scrollableBoxTag).performMouseInput {
             this.scroll(-100f, ScrollWheel.Horizontal)
         }
 
-        val lastTotal = rule.runOnIdle {
-            assertThat(total).isGreaterThan(0)
-            total
-        }
+        val lastTotal =
+            rule.runOnIdle {
+                assertThat(total).isGreaterThan(0)
+                total
+            }
 
         rule.onNodeWithTag(scrollableBoxTag).performMouseInput {
             this.scroll(-100f, ScrollWheel.Vertical)
         }
 
-        rule.runOnIdle {
-            assertThat(total).isEqualTo(lastTotal)
-        }
+        rule.runOnIdle { assertThat(total).isEqualTo(lastTotal) }
         rule.onNodeWithTag(scrollableBoxTag).performMouseInput {
             this.scroll(100f, ScrollWheel.Horizontal)
         }
-        rule.runOnIdle {
-            assertThat(total).isLessThan(0.01f)
-        }
+        rule.runOnIdle { assertThat(total).isLessThan(0.01f) }
     }
 
     @OptIn(ExperimentalTestApi::class)
     @Test
     fun scrollable_horizontalScroll_mouseWheel_badMotionEvent() {
         var total = 0f
-        val controller = ScrollableState(
-            consumeScrollDelta = {
-                total += it
-                it
-            }
-        )
-        setScrollableContent {
-            Modifier.scrollable(
-                state = controller,
-                orientation = Orientation.Horizontal
+        val controller =
+            ScrollableState(
+                consumeScrollDelta = {
+                    total += it
+                    it
+                }
             )
+        setScrollableContent {
+            Modifier.scrollable(state = controller, orientation = Orientation.Horizontal)
         }
         rule.onNodeWithTag(scrollableBoxTag).performMouseInput {
             this.scroll(Float.NaN, ScrollWheel.Horizontal)
@@ -295,51 +282,46 @@
     fun scrollable_horizontalScroll_keyboardPageUpAndDown() {
         var scrollAmount = 0f
 
-        val scrollableState = ScrollableState(
-            consumeScrollDelta = {
-                scrollAmount += it
-                it
-            }
-        )
+        val scrollableState =
+            ScrollableState(
+                consumeScrollDelta = {
+                    scrollAmount += it
+                    it
+                }
+            )
 
         rule.setContent {
             Row(
-                Modifier
-                    .fillMaxHeight()
+                Modifier.fillMaxHeight()
                     .wrapContentWidth()
                     .background(Color.Red)
-                    .scrollable(
-                        state = scrollableState,
-                        orientation = Orientation.Horizontal
-                    )
+                    .scrollable(state = scrollableState, orientation = Orientation.Horizontal)
                     .padding(10.dp)
             ) {
                 Box(
-                    modifier = Modifier
-                        .fillMaxHeight()
-                        .testTag(scrollableBoxTag)
-                        .width(50.dp)
-                        .background(Color.Blue)
-                        // Required for keyboard scrolling (page up/down keys) to work.
-                        .focusable()
-                        .padding(10.dp)
+                    modifier =
+                        Modifier.fillMaxHeight()
+                            .testTag(scrollableBoxTag)
+                            .width(50.dp)
+                            .background(Color.Blue)
+                            // Required for keyboard scrolling (page up/down keys) to work.
+                            .focusable()
+                            .padding(10.dp)
                 )
 
                 Spacer(modifier = Modifier.size(10.dp))
 
                 for (i in 0 until 40) {
-                    val color = if (i % 2 == 0) {
-                        Color.Yellow
-                    } else {
-                        Color.Green
-                    }
+                    val color =
+                        if (i % 2 == 0) {
+                            Color.Yellow
+                        } else {
+                            Color.Green
+                        }
 
                     Box(
-                        modifier = Modifier
-                            .fillMaxHeight()
-                            .width(50.dp)
-                            .background(color)
-                            .padding(10.dp)
+                        modifier =
+                            Modifier.fillMaxHeight().width(50.dp).background(color).padding(10.dp)
                     )
                     Spacer(modifier = Modifier.size(10.dp))
                 }
@@ -347,34 +329,27 @@
         }
 
         rule.onNodeWithTag(scrollableBoxTag).requestFocus()
-        rule.onNodeWithTag(scrollableBoxTag).performKeyInput {
-            pressKey(Key.PageDown)
-        }
+        rule.onNodeWithTag(scrollableBoxTag).performKeyInput { pressKey(Key.PageDown) }
 
-        rule.runOnIdle {
-            assertThat(scrollAmount).isLessThan(0f)
-        }
+        rule.runOnIdle { assertThat(scrollAmount).isLessThan(0f) }
 
         scrollAmount = 0f
 
-        rule.onNodeWithTag(scrollableBoxTag).performKeyInput {
-            pressKey(Key.PageUp)
-        }
+        rule.onNodeWithTag(scrollableBoxTag).performKeyInput { pressKey(Key.PageUp) }
 
-        rule.runOnIdle {
-            assertThat(scrollAmount).isGreaterThan(0f)
-        }
+        rule.runOnIdle { assertThat(scrollAmount).isGreaterThan(0f) }
     }
 
     @Test
     fun scrollable_horizontalScroll_reverse() {
         var total = 0f
-        val controller = ScrollableState(
-            consumeScrollDelta = {
-                total += it
-                it
-            }
-        )
+        val controller =
+            ScrollableState(
+                consumeScrollDelta = {
+                    total += it
+                    it
+                }
+            )
         setScrollableContent {
             Modifier.scrollable(
                 reverseDirection = true,
@@ -390,10 +365,11 @@
             )
         }
 
-        val lastTotal = rule.runOnIdle {
-            assertThat(total).isLessThan(0)
-            total
-        }
+        val lastTotal =
+            rule.runOnIdle {
+                assertThat(total).isLessThan(0)
+                total
+            }
         rule.onNodeWithTag(scrollableBoxTag).performTouchInput {
             this.swipe(
                 start = this.center,
@@ -402,9 +378,7 @@
             )
         }
 
-        rule.runOnIdle {
-            assertThat(total).isEqualTo(lastTotal)
-        }
+        rule.runOnIdle { assertThat(total).isEqualTo(lastTotal) }
         rule.onNodeWithTag(scrollableBoxTag).performTouchInput {
             this.swipe(
                 start = this.center,
@@ -412,21 +386,20 @@
                 durationMillis = 100
             )
         }
-        rule.runOnIdle {
-            assertThat(total).isLessThan(0.01f)
-        }
+        rule.runOnIdle { assertThat(total).isLessThan(0.01f) }
     }
 
     @OptIn(ExperimentalTestApi::class)
     @Test
     fun scrollable_horizontalScroll_reverse_mouseWheel() {
         var total = 0f
-        val controller = ScrollableState(
-            consumeScrollDelta = {
-                total += it
-                it
-            }
-        )
+        val controller =
+            ScrollableState(
+                consumeScrollDelta = {
+                    total += it
+                    it
+                }
+            )
         setScrollableContent {
             Modifier.scrollable(
                 reverseDirection = true,
@@ -438,39 +411,34 @@
             this.scroll(-100f, ScrollWheel.Horizontal)
         }
 
-        val lastTotal = rule.runOnIdle {
-            assertThat(total).isLessThan(0)
-            total
-        }
+        val lastTotal =
+            rule.runOnIdle {
+                assertThat(total).isLessThan(0)
+                total
+            }
         rule.onNodeWithTag(scrollableBoxTag).performMouseInput {
             this.scroll(-100f, ScrollWheel.Vertical)
         }
 
-        rule.runOnIdle {
-            assertThat(total).isEqualTo(lastTotal)
-        }
+        rule.runOnIdle { assertThat(total).isEqualTo(lastTotal) }
         rule.onNodeWithTag(scrollableBoxTag).performMouseInput {
             this.scroll(100f, ScrollWheel.Horizontal)
         }
-        rule.runOnIdle {
-            assertThat(total).isLessThan(0.01f)
-        }
+        rule.runOnIdle { assertThat(total).isLessThan(0.01f) }
     }
 
     @Test
     fun scrollable_verticalScroll() {
         var total = 0f
-        val controller = ScrollableState(
-            consumeScrollDelta = {
-                total += it
-                it
-            }
-        )
-        setScrollableContent {
-            Modifier.scrollable(
-                state = controller,
-                orientation = Orientation.Vertical
+        val controller =
+            ScrollableState(
+                consumeScrollDelta = {
+                    total += it
+                    it
+                }
             )
+        setScrollableContent {
+            Modifier.scrollable(state = controller, orientation = Orientation.Vertical)
         }
         rule.onNodeWithTag(scrollableBoxTag).performTouchInput {
             this.swipe(
@@ -480,10 +448,11 @@
             )
         }
 
-        val lastTotal = rule.runOnIdle {
-            assertThat(total).isGreaterThan(0)
-            total
-        }
+        val lastTotal =
+            rule.runOnIdle {
+                assertThat(total).isGreaterThan(0)
+                total
+            }
         rule.onNodeWithTag(scrollableBoxTag).performTouchInput {
             this.swipe(
                 start = this.center,
@@ -492,9 +461,7 @@
             )
         }
 
-        rule.runOnIdle {
-            assertThat(total).isEqualTo(lastTotal)
-        }
+        rule.runOnIdle { assertThat(total).isEqualTo(lastTotal) }
         rule.onNodeWithTag(scrollableBoxTag).performTouchInput {
             this.swipe(
                 start = this.center,
@@ -502,65 +469,56 @@
                 durationMillis = 100
             )
         }
-        rule.runOnIdle {
-            assertThat(total).isLessThan(0.01f)
-        }
+        rule.runOnIdle { assertThat(total).isLessThan(0.01f) }
     }
 
     @OptIn(ExperimentalTestApi::class)
     @Test
     fun scrollable_verticalScroll_mouseWheel() {
         var total = 0f
-        val controller = ScrollableState(
-            consumeScrollDelta = {
-                total += it
-                it
-            }
-        )
-        setScrollableContent {
-            Modifier.scrollable(
-                state = controller,
-                orientation = Orientation.Vertical
+        val controller =
+            ScrollableState(
+                consumeScrollDelta = {
+                    total += it
+                    it
+                }
             )
+        setScrollableContent {
+            Modifier.scrollable(state = controller, orientation = Orientation.Vertical)
         }
         rule.onNodeWithTag(scrollableBoxTag).performMouseInput {
             this.scroll(-100f, ScrollWheel.Vertical)
         }
 
-        val lastTotal = rule.runOnIdle {
-            assertThat(total).isGreaterThan(0)
-            total
-        }
+        val lastTotal =
+            rule.runOnIdle {
+                assertThat(total).isGreaterThan(0)
+                total
+            }
         rule.onNodeWithTag(scrollableBoxTag).performMouseInput {
             this.scroll(-100f, ScrollWheel.Horizontal)
         }
 
-        rule.runOnIdle {
-            assertThat(total).isEqualTo(lastTotal)
-        }
+        rule.runOnIdle { assertThat(total).isEqualTo(lastTotal) }
         rule.onNodeWithTag(scrollableBoxTag).performMouseInput {
             this.scroll(100f, ScrollWheel.Vertical)
         }
-        rule.runOnIdle {
-            assertThat(total).isLessThan(0.01f)
-        }
+        rule.runOnIdle { assertThat(total).isLessThan(0.01f) }
     }
 
     @OptIn(ExperimentalTestApi::class)
     @Test
     fun scrollable_verticalScroll_mouseWheel_badMotionEvent() {
         var total = 0f
-        val controller = ScrollableState(
-            consumeScrollDelta = {
-                total += it
-                it
-            }
-        )
-        setScrollableContent {
-            Modifier.scrollable(
-                state = controller,
-                orientation = Orientation.Vertical
+        val controller =
+            ScrollableState(
+                consumeScrollDelta = {
+                    total += it
+                    it
+                }
             )
+        setScrollableContent {
+            Modifier.scrollable(state = controller, orientation = Orientation.Vertical)
         }
         rule.onNodeWithTag(scrollableBoxTag).performMouseInput {
             this.scroll(Float.NaN, ScrollWheel.Vertical)
@@ -579,50 +537,45 @@
     fun scrollable_verticalScroll_keyboardPageUpAndDown() {
         var scrollAmount = 0f
 
-        val scrollableState = ScrollableState(
-            consumeScrollDelta = {
-                scrollAmount += it
-                it
-            }
-        )
+        val scrollableState =
+            ScrollableState(
+                consumeScrollDelta = {
+                    scrollAmount += it
+                    it
+                }
+            )
 
         rule.setContent {
             Column(
-                Modifier
-                    .fillMaxWidth()
+                Modifier.fillMaxWidth()
                     .background(Color.Red)
-                    .scrollable(
-                        state = scrollableState,
-                        orientation = Orientation.Vertical
-                    )
+                    .scrollable(state = scrollableState, orientation = Orientation.Vertical)
                     .padding(10.dp)
             ) {
                 Box(
-                    modifier = Modifier
-                        .fillMaxWidth()
-                        .testTag(scrollableBoxTag)
-                        .height(50.dp)
-                        .background(Color.Blue)
-                        // Required for keyboard scrolling (page up/down keys) to work.
-                        .focusable()
-                        .padding(10.dp)
+                    modifier =
+                        Modifier.fillMaxWidth()
+                            .testTag(scrollableBoxTag)
+                            .height(50.dp)
+                            .background(Color.Blue)
+                            // Required for keyboard scrolling (page up/down keys) to work.
+                            .focusable()
+                            .padding(10.dp)
                 )
 
                 Spacer(modifier = Modifier.size(10.dp))
 
                 for (i in 0 until 40) {
-                    val color = if (i % 2 == 0) {
-                        Color.Yellow
-                    } else {
-                        Color.Green
-                    }
+                    val color =
+                        if (i % 2 == 0) {
+                            Color.Yellow
+                        } else {
+                            Color.Green
+                        }
 
                     Box(
-                        modifier = Modifier
-                            .fillMaxWidth()
-                            .height(50.dp)
-                            .background(color)
-                            .padding(10.dp)
+                        modifier =
+                            Modifier.fillMaxWidth().height(50.dp).background(color).padding(10.dp)
                     )
                     Spacer(modifier = Modifier.size(10.dp))
                 }
@@ -630,34 +583,27 @@
         }
 
         rule.onNodeWithTag(scrollableBoxTag).requestFocus()
-        rule.onNodeWithTag(scrollableBoxTag).performKeyInput {
-            pressKey(Key.PageDown)
-        }
+        rule.onNodeWithTag(scrollableBoxTag).performKeyInput { pressKey(Key.PageDown) }
 
-        rule.runOnIdle {
-            assertThat(scrollAmount).isLessThan(0f)
-        }
+        rule.runOnIdle { assertThat(scrollAmount).isLessThan(0f) }
 
         scrollAmount = 0f
 
-        rule.onNodeWithTag(scrollableBoxTag).performKeyInput {
-            pressKey(Key.PageUp)
-        }
+        rule.onNodeWithTag(scrollableBoxTag).performKeyInput { pressKey(Key.PageUp) }
 
-        rule.runOnIdle {
-            assertThat(scrollAmount).isGreaterThan(0f)
-        }
+        rule.runOnIdle { assertThat(scrollAmount).isGreaterThan(0f) }
     }
 
     @Test
     fun scrollable_verticalScroll_reversed() {
         var total = 0f
-        val controller = ScrollableState(
-            consumeScrollDelta = {
-                total += it
-                it
-            }
-        )
+        val controller =
+            ScrollableState(
+                consumeScrollDelta = {
+                    total += it
+                    it
+                }
+            )
         setScrollableContent {
             Modifier.scrollable(
                 reverseDirection = true,
@@ -673,10 +619,11 @@
             )
         }
 
-        val lastTotal = rule.runOnIdle {
-            assertThat(total).isLessThan(0)
-            total
-        }
+        val lastTotal =
+            rule.runOnIdle {
+                assertThat(total).isLessThan(0)
+                total
+            }
         rule.onNodeWithTag(scrollableBoxTag).performTouchInput {
             this.swipe(
                 start = this.center,
@@ -685,9 +632,7 @@
             )
         }
 
-        rule.runOnIdle {
-            assertThat(total).isEqualTo(lastTotal)
-        }
+        rule.runOnIdle { assertThat(total).isEqualTo(lastTotal) }
         rule.onNodeWithTag(scrollableBoxTag).performTouchInput {
             this.swipe(
                 start = this.center,
@@ -695,21 +640,20 @@
                 durationMillis = 100
             )
         }
-        rule.runOnIdle {
-            assertThat(total).isLessThan(0.01f)
-        }
+        rule.runOnIdle { assertThat(total).isLessThan(0.01f) }
     }
 
     @OptIn(ExperimentalTestApi::class)
     @Test
     fun scrollable_verticalScroll_reversed_mouseWheel() {
         var total = 0f
-        val controller = ScrollableState(
-            consumeScrollDelta = {
-                total += it
-                it
-            }
-        )
+        val controller =
+            ScrollableState(
+                consumeScrollDelta = {
+                    total += it
+                    it
+                }
+            )
         setScrollableContent {
             Modifier.scrollable(
                 reverseDirection = true,
@@ -721,36 +665,34 @@
             this.scroll(-100f, ScrollWheel.Vertical)
         }
 
-        val lastTotal = rule.runOnIdle {
-            assertThat(total).isLessThan(0)
-            total
-        }
+        val lastTotal =
+            rule.runOnIdle {
+                assertThat(total).isLessThan(0)
+                total
+            }
 
         rule.onNodeWithTag(scrollableBoxTag).performMouseInput {
             this.scroll(-100f, ScrollWheel.Horizontal)
         }
 
-        rule.runOnIdle {
-            assertThat(total).isEqualTo(lastTotal)
-        }
+        rule.runOnIdle { assertThat(total).isEqualTo(lastTotal) }
         rule.onNodeWithTag(scrollableBoxTag).performMouseInput {
             this.scroll(100f, ScrollWheel.Vertical)
         }
-        rule.runOnIdle {
-            assertThat(total).isLessThan(0.01f)
-        }
+        rule.runOnIdle { assertThat(total).isLessThan(0.01f) }
     }
 
     @Test
     fun scrollable_disabledWontCallLambda() {
         val enabled = mutableStateOf(true)
         var total = 0f
-        val controller = ScrollableState(
-            consumeScrollDelta = {
-                total += it
-                it
-            }
-        )
+        val controller =
+            ScrollableState(
+                consumeScrollDelta = {
+                    total += it
+                    it
+                }
+            )
         setScrollableContent {
             Modifier.scrollable(
                 state = controller,
@@ -765,11 +707,12 @@
                 durationMillis = 100
             )
         }
-        val prevTotal = rule.runOnIdle {
-            assertThat(total).isGreaterThan(0f)
-            enabled.value = false
-            total
-        }
+        val prevTotal =
+            rule.runOnIdle {
+                assertThat(total).isGreaterThan(0f)
+                enabled.value = false
+                total
+            }
         rule.onNodeWithTag(scrollableBoxTag).performTouchInput {
             this.swipe(
                 start = this.center,
@@ -777,26 +720,22 @@
                 durationMillis = 100
             )
         }
-        rule.runOnIdle {
-            assertThat(total).isEqualTo(prevTotal)
-        }
+        rule.runOnIdle { assertThat(total).isEqualTo(prevTotal) }
     }
 
     @Test
     fun scrollable_startWithoutSlop_ifFlinging() {
         rule.mainClock.autoAdvance = false
         var total = 0f
-        val controller = ScrollableState(
-            consumeScrollDelta = {
-                total += it
-                it
-            }
-        )
-        setScrollableContent {
-            Modifier.scrollable(
-                state = controller,
-                orientation = Orientation.Horizontal
+        val controller =
+            ScrollableState(
+                consumeScrollDelta = {
+                    total += it
+                    it
+                }
             )
+        setScrollableContent {
+            Modifier.scrollable(state = controller, orientation = Orientation.Horizontal)
         }
         rule.onNodeWithTag(scrollableBoxTag).performTouchInput {
             swipeWithVelocity(
@@ -827,28 +766,24 @@
     fun scrollable_blocksDownEvents_ifFlingingCaught() {
         rule.mainClock.autoAdvance = false
         var total = 0f
-        val controller = ScrollableState(
-            consumeScrollDelta = {
-                total += it
-                it
-            }
-        )
+        val controller =
+            ScrollableState(
+                consumeScrollDelta = {
+                    total += it
+                    it
+                }
+            )
         rule.setContent {
             Box {
                 Box(
                     contentAlignment = Alignment.Center,
-                    modifier = Modifier
-                        .size(300.dp)
-                        .scrollable(
-                            orientation = Orientation.Horizontal,
-                            state = controller
-                        )
+                    modifier =
+                        Modifier.size(300.dp)
+                            .scrollable(orientation = Orientation.Horizontal, state = controller)
                 ) {
                     Box(
-                        modifier = Modifier
-                            .size(300.dp)
-                            .testTag(scrollableBoxTag)
-                            .clickable {
+                        modifier =
+                            Modifier.size(300.dp).testTag(scrollableBoxTag).clickable {
                                 assertWithMessage("Clickable shouldn't click when fling caught")
                                     .fail()
                             }
@@ -882,30 +817,24 @@
     @Test
     fun scrollable_snappingScrolling() {
         var total = 0f
-        val controller = ScrollableState(
-            consumeScrollDelta = {
-                total += it
-                it
-            }
-        )
-        setScrollableContent {
-            Modifier.scrollable(
-                orientation = Orientation.Vertical,
-                state = controller
+        val controller =
+            ScrollableState(
+                consumeScrollDelta = {
+                    total += it
+                    it
+                }
             )
+        setScrollableContent {
+            Modifier.scrollable(orientation = Orientation.Vertical, state = controller)
         }
         rule.waitForIdle()
         assertThat(total).isEqualTo(0f)
 
-        scope.launch {
-            controller.animateScrollBy(1000f)
-        }
+        scope.launch { controller.animateScrollBy(1000f) }
         rule.waitForIdle()
         assertThat(total).isWithin(0.001f).of(1000f)
 
-        scope.launch {
-            controller.animateScrollBy(-200f)
-        }
+        scope.launch { controller.animateScrollBy(-200f) }
         rule.waitForIdle()
         assertThat(total).isWithin(0.001f).of(800f)
     }
@@ -916,19 +845,19 @@
         val emit = mutableStateOf(true)
         val expectEmission = mutableStateOf(true)
         var total = 0f
-        val controller = ScrollableState(
-            consumeScrollDelta = {
-                assertWithMessage("Animating after dispose!").that(expectEmission.value).isTrue()
-                total += it
-                it
-            }
-        )
+        val controller =
+            ScrollableState(
+                consumeScrollDelta = {
+                    assertWithMessage("Animating after dispose!")
+                        .that(expectEmission.value)
+                        .isTrue()
+                    total += it
+                    it
+                }
+            )
         setScrollableContent {
             if (emit.value) {
-                Modifier.scrollable(
-                    orientation = Orientation.Horizontal,
-                    state = controller
-                )
+                Modifier.scrollable(orientation = Orientation.Horizontal, state = controller)
             } else {
                 Modifier
             }
@@ -947,16 +876,12 @@
         rule.mainClock.advanceTimeByFrame()
         rule.mainClock.advanceTimeByFrame()
         // flip the emission
-        rule.runOnUiThread {
-            emit.value = false
-        }
+        rule.runOnUiThread { emit.value = false }
         // propagate the emit flip and record the value
         rule.mainClock.advanceTimeByFrame()
         val prevTotal = total
         // make sure we don't receive any deltas
-        rule.runOnUiThread {
-            expectEmission.value = false
-        }
+        rule.runOnUiThread { expectEmission.value = false }
 
         // pump the clock until idle
         rule.mainClock.autoAdvance = true
@@ -970,38 +895,37 @@
     fun scrollable_nestedDrag() {
         var innerDrag = 0f
         var outerDrag = 0f
-        val outerState = ScrollableState(
-            consumeScrollDelta = {
-                outerDrag += it
-                it
-            }
-        )
-        val innerState = ScrollableState(
-            consumeScrollDelta = {
-                innerDrag += it / 2
-                it / 2
-            }
-        )
+        val outerState =
+            ScrollableState(
+                consumeScrollDelta = {
+                    outerDrag += it
+                    it
+                }
+            )
+        val innerState =
+            ScrollableState(
+                consumeScrollDelta = {
+                    innerDrag += it / 2
+                    it / 2
+                }
+            )
 
         rule.setContentAndGetScope {
             Box {
                 Box(
                     contentAlignment = Alignment.Center,
-                    modifier = Modifier
-                        .size(300.dp)
-                        .scrollable(
-                            state = outerState,
-                            orientation = Orientation.Horizontal
-                        )
+                    modifier =
+                        Modifier.size(300.dp)
+                            .scrollable(state = outerState, orientation = Orientation.Horizontal)
                 ) {
                     Box(
-                        modifier = Modifier
-                            .testTag(scrollableBoxTag)
-                            .size(300.dp)
-                            .scrollable(
-                                state = innerState,
-                                orientation = Orientation.Horizontal
-                            )
+                        modifier =
+                            Modifier.testTag(scrollableBoxTag)
+                                .size(300.dp)
+                                .scrollable(
+                                    state = innerState,
+                                    orientation = Orientation.Horizontal
+                                )
                     )
                 }
             }
@@ -1014,13 +938,14 @@
                 endVelocity = 0f
             )
         }
-        val lastEqualDrag = rule.runOnIdle {
-            assertThat(innerDrag).isGreaterThan(0f)
-            assertThat(outerDrag).isGreaterThan(0f)
-            // we consumed half delta in child, so exactly half should go to the parent
-            assertThat(outerDrag).isEqualTo(innerDrag)
-            innerDrag
-        }
+        val lastEqualDrag =
+            rule.runOnIdle {
+                assertThat(innerDrag).isGreaterThan(0f)
+                assertThat(outerDrag).isGreaterThan(0f)
+                // we consumed half delta in child, so exactly half should go to the parent
+                assertThat(outerDrag).isEqualTo(innerDrag)
+                innerDrag
+            }
         rule.runOnIdle {
             // values should be the same since no fling
             assertThat(innerDrag).isEqualTo(lastEqualDrag)
@@ -1033,40 +958,39 @@
     fun scrollable_nestedScroll_childPartialConsumptionForMouseWheel() {
         var innerDrag = 0f
         var outerDrag = 0f
-        val outerState = ScrollableState(
-            consumeScrollDelta = {
-                // Since the child has already consumed half, the parent will consume the rest.
-                outerDrag += it
-                it
-            }
-        )
-        val innerState = ScrollableState(
-            consumeScrollDelta = {
-                // Child consumes half, leaving the rest for the parent to consume.
-                innerDrag += it / 2
-                it / 2
-            }
-        )
+        val outerState =
+            ScrollableState(
+                consumeScrollDelta = {
+                    // Since the child has already consumed half, the parent will consume the rest.
+                    outerDrag += it
+                    it
+                }
+            )
+        val innerState =
+            ScrollableState(
+                consumeScrollDelta = {
+                    // Child consumes half, leaving the rest for the parent to consume.
+                    innerDrag += it / 2
+                    it / 2
+                }
+            )
 
         rule.setContentAndGetScope {
             Box {
                 Box(
                     contentAlignment = Alignment.Center,
-                    modifier = Modifier
-                        .size(300.dp)
-                        .scrollable(
-                            state = outerState,
-                            orientation = Orientation.Horizontal
-                        )
+                    modifier =
+                        Modifier.size(300.dp)
+                            .scrollable(state = outerState, orientation = Orientation.Horizontal)
                 ) {
                     Box(
-                        modifier = Modifier
-                            .testTag(scrollableBoxTag)
-                            .size(300.dp)
-                            .scrollable(
-                                state = innerState,
-                                orientation = Orientation.Horizontal
-                            )
+                        modifier =
+                            Modifier.testTag(scrollableBoxTag)
+                                .size(300.dp)
+                                .scrollable(
+                                    state = innerState,
+                                    orientation = Orientation.Horizontal
+                                )
                     )
                 }
             }
@@ -1094,46 +1018,45 @@
     fun scrollable_nestedScroll_childPartialConsumptionForKeyboardPageUpAndDown() {
         var innerDrag = 0f
         var outerDrag = 0f
-        val outerState = ScrollableState(
-            consumeScrollDelta = {
-                // Since the child has already consumed half, the parent will consume the rest.
-                outerDrag += it
-                it
-            }
-        )
-        val innerState = ScrollableState(
-            consumeScrollDelta = {
-                // Child consumes half, leaving the rest for the parent to consume.
-                innerDrag += it / 2
-                it / 2
-            }
-        )
+        val outerState =
+            ScrollableState(
+                consumeScrollDelta = {
+                    // Since the child has already consumed half, the parent will consume the rest.
+                    outerDrag += it
+                    it
+                }
+            )
+        val innerState =
+            ScrollableState(
+                consumeScrollDelta = {
+                    // Child consumes half, leaving the rest for the parent to consume.
+                    innerDrag += it / 2
+                    it / 2
+                }
+            )
 
         rule.setContent {
             Box {
                 Box(
                     contentAlignment = Alignment.Center,
-                    modifier = Modifier
-                        .size(300.dp)
-                        .scrollable(
-                            state = outerState,
-                            orientation = Orientation.Horizontal
-                        )
+                    modifier =
+                        Modifier.size(300.dp)
+                            .scrollable(state = outerState, orientation = Orientation.Horizontal)
                 ) {
                     Box(
-                        modifier = Modifier
-                            .size(300.dp)
-                            .scrollable(
-                                state = innerState,
-                                orientation = Orientation.Horizontal
-                            )
+                        modifier =
+                            Modifier.size(300.dp)
+                                .scrollable(
+                                    state = innerState,
+                                    orientation = Orientation.Horizontal
+                                )
                     ) {
                         Box(
-                            modifier = Modifier
-                                .testTag(scrollableBoxTag)
-                                // Required for keyboard scrolling (page up/down keys) to work.
-                                .focusable()
-                                .size(300.dp)
+                            modifier =
+                                Modifier.testTag(scrollableBoxTag)
+                                    // Required for keyboard scrolling (page up/down keys) to work.
+                                    .focusable()
+                                    .size(300.dp)
                         )
                     }
                 }
@@ -1141,9 +1064,7 @@
         }
 
         rule.onNodeWithTag(scrollableBoxTag).requestFocus()
-        rule.onNodeWithTag(scrollableBoxTag).performKeyInput {
-            pressKey(Key.PageDown)
-        }
+        rule.onNodeWithTag(scrollableBoxTag).performKeyInput { pressKey(Key.PageDown) }
 
         rule.runOnIdle {
             assertThat(outerDrag).isLessThan(0f)
@@ -1156,9 +1077,7 @@
         outerDrag = 0f
         innerDrag = 0f
 
-        rule.onNodeWithTag(scrollableBoxTag).performKeyInput {
-            pressKey(Key.PageUp)
-        }
+        rule.onNodeWithTag(scrollableBoxTag).performKeyInput { pressKey(Key.PageUp) }
 
         rule.runOnIdle {
             assertThat(outerDrag).isGreaterThan(0f)
@@ -1173,40 +1092,39 @@
     fun scrollable_nestedScroll_childPartialConsumptionForSemantics_horizontal() {
         var innerDrag = 0f
         var outerDrag = 0f
-        val outerState = ScrollableState(
-            consumeScrollDelta = {
-                // Since the child has already consumed half, the parent will consume the rest.
-                outerDrag += it
-                it
-            }
-        )
-        val innerState = ScrollableState(
-            consumeScrollDelta = {
-                // Child consumes half, leaving the rest for the parent to consume.
-                innerDrag += it / 2
-                it / 2
-            }
-        )
+        val outerState =
+            ScrollableState(
+                consumeScrollDelta = {
+                    // Since the child has already consumed half, the parent will consume the rest.
+                    outerDrag += it
+                    it
+                }
+            )
+        val innerState =
+            ScrollableState(
+                consumeScrollDelta = {
+                    // Child consumes half, leaving the rest for the parent to consume.
+                    innerDrag += it / 2
+                    it / 2
+                }
+            )
 
         rule.setContentAndGetScope {
             Box {
                 Box(
                     contentAlignment = Alignment.Center,
-                    modifier = Modifier
-                        .size(300.dp)
-                        .scrollable(
-                            state = outerState,
-                            orientation = Orientation.Horizontal
-                        )
+                    modifier =
+                        Modifier.size(300.dp)
+                            .scrollable(state = outerState, orientation = Orientation.Horizontal)
                 ) {
                     Box(
-                        modifier = Modifier
-                            .testTag(scrollableBoxTag)
-                            .size(300.dp)
-                            .scrollable(
-                                state = innerState,
-                                orientation = Orientation.Horizontal
-                            )
+                        modifier =
+                            Modifier.testTag(scrollableBoxTag)
+                                .size(300.dp)
+                                .scrollable(
+                                    state = innerState,
+                                    orientation = Orientation.Horizontal
+                                )
                     )
                 }
             }
@@ -1227,38 +1145,34 @@
     fun scrollable_nestedScroll_childPartialConsumptionForSemantics_vertical() {
         var innerDrag = 0f
         var outerDrag = 0f
-        val outerState = ScrollableState(
-            consumeScrollDelta = {
-                outerDrag += it
-                it
-            }
-        )
-        val innerState = ScrollableState(
-            consumeScrollDelta = {
-                innerDrag += it / 2
-                it / 2
-            }
-        )
+        val outerState =
+            ScrollableState(
+                consumeScrollDelta = {
+                    outerDrag += it
+                    it
+                }
+            )
+        val innerState =
+            ScrollableState(
+                consumeScrollDelta = {
+                    innerDrag += it / 2
+                    it / 2
+                }
+            )
 
         rule.setContentAndGetScope {
             Box {
                 Box(
                     contentAlignment = Alignment.Center,
-                    modifier = Modifier
-                        .size(300.dp)
-                        .scrollable(
-                            state = outerState,
-                            orientation = Orientation.Vertical
-                        )
+                    modifier =
+                        Modifier.size(300.dp)
+                            .scrollable(state = outerState, orientation = Orientation.Vertical)
                 ) {
                     Box(
-                        modifier = Modifier
-                            .testTag(scrollableBoxTag)
-                            .size(300.dp)
-                            .scrollable(
-                                state = innerState,
-                                orientation = Orientation.Vertical
-                            )
+                        modifier =
+                            Modifier.testTag(scrollableBoxTag)
+                                .size(300.dp)
+                                .scrollable(state = innerState, orientation = Orientation.Vertical)
                     )
                 }
             }
@@ -1281,43 +1195,29 @@
     fun focusScroll_nestedScroll_childPartialConsumptionForSemantics() {
         var outerDrag = 0f
         val requester = BringIntoViewRequester()
-        val connection = object : NestedScrollConnection {
-            override fun onPreScroll(available: Offset, source: NestedScrollSource): Offset {
-                outerDrag += available.x
-                return super.onPreScroll(available, source)
+        val connection =
+            object : NestedScrollConnection {
+                override fun onPreScroll(available: Offset, source: NestedScrollSource): Offset {
+                    outerDrag += available.x
+                    return super.onPreScroll(available, source)
+                }
             }
-        }
         val scrollState = ScrollState(0)
         rule.setContentAndGetScope {
             Box(Modifier.nestedScroll(connection)) {
-                Row(
-                    modifier = Modifier
-                        .size(300.dp)
-                        .horizontalScroll(scrollState)
-                ) {
-                    repeat(5) {
-                        Box(
-                            modifier = Modifier
-                                .testTag(scrollableBoxTag)
-                                .size(100.dp)
-                        )
-                    }
+                Row(modifier = Modifier.size(300.dp).horizontalScroll(scrollState)) {
+                    repeat(5) { Box(modifier = Modifier.testTag(scrollableBoxTag).size(100.dp)) }
                     Box(
-                        modifier = Modifier
-                            .testTag(scrollableBoxTag)
-                            .size(100.dp)
-                            .bringIntoViewRequester(requester)
-
+                        modifier =
+                            Modifier.testTag(scrollableBoxTag)
+                                .size(100.dp)
+                                .bringIntoViewRequester(requester)
                     )
                 }
             }
         }
 
-        rule.runOnIdle {
-            scope.launch {
-                requester.bringIntoView()
-            }
-        }
+        rule.runOnIdle { scope.launch { requester.bringIntoView() } }
 
         rule.runOnIdle {
             assertThat(outerDrag).isNonZero()
@@ -1329,38 +1229,37 @@
     fun scrollable_nestedFling() {
         var innerDrag = 0f
         var outerDrag = 0f
-        val outerState = ScrollableState(
-            consumeScrollDelta = {
-                outerDrag += it
-                it
-            }
-        )
-        val innerState = ScrollableState(
-            consumeScrollDelta = {
-                innerDrag += it / 2
-                it / 2
-            }
-        )
+        val outerState =
+            ScrollableState(
+                consumeScrollDelta = {
+                    outerDrag += it
+                    it
+                }
+            )
+        val innerState =
+            ScrollableState(
+                consumeScrollDelta = {
+                    innerDrag += it / 2
+                    it / 2
+                }
+            )
 
         rule.setContentAndGetScope {
             Box {
                 Box(
                     contentAlignment = Alignment.Center,
-                    modifier = Modifier
-                        .size(300.dp)
-                        .scrollable(
-                            state = outerState,
-                            orientation = Orientation.Horizontal
-                        )
+                    modifier =
+                        Modifier.size(300.dp)
+                            .scrollable(state = outerState, orientation = Orientation.Horizontal)
                 ) {
                     Box(
-                        modifier = Modifier
-                            .testTag(scrollableBoxTag)
-                            .size(300.dp)
-                            .scrollable(
-                                state = innerState,
-                                orientation = Orientation.Horizontal
-                            )
+                        modifier =
+                            Modifier.testTag(scrollableBoxTag)
+                                .size(300.dp)
+                                .scrollable(
+                                    state = innerState,
+                                    orientation = Orientation.Horizontal
+                                )
                     )
                 }
             }
@@ -1390,42 +1289,42 @@
         var value = 0f
         var lastReceivedPreScrollAvailable = 0f
         val preConsumeFraction = 0.7f
-        val controller = ScrollableState(
-            consumeScrollDelta = {
-                val expected = lastReceivedPreScrollAvailable * (1 - preConsumeFraction)
-                assertThat(it - expected).isWithin(0.01f)
-                value += it
-                it
-            }
-        )
-        val preConsumingParent = object : NestedScrollConnection {
-            override fun onPreScroll(available: Offset, source: NestedScrollSource): Offset {
-                lastReceivedPreScrollAvailable = available.x
-                return available * preConsumeFraction
-            }
+        val controller =
+            ScrollableState(
+                consumeScrollDelta = {
+                    val expected = lastReceivedPreScrollAvailable * (1 - preConsumeFraction)
+                    assertThat(it - expected).isWithin(0.01f)
+                    value += it
+                    it
+                }
+            )
+        val preConsumingParent =
+            object : NestedScrollConnection {
+                override fun onPreScroll(available: Offset, source: NestedScrollSource): Offset {
+                    lastReceivedPreScrollAvailable = available.x
+                    return available * preConsumeFraction
+                }
 
-            override suspend fun onPreFling(available: Velocity): Velocity {
-                // consume all velocity
-                return available
+                override suspend fun onPreFling(available: Velocity): Velocity {
+                    // consume all velocity
+                    return available
+                }
             }
-        }
 
         rule.setContentAndGetScope {
             Box {
                 Box(
                     contentAlignment = Alignment.Center,
-                    modifier = Modifier
-                        .size(300.dp)
-                        .nestedScroll(preConsumingParent)
+                    modifier = Modifier.size(300.dp).nestedScroll(preConsumingParent)
                 ) {
                     Box(
-                        modifier = Modifier
-                            .size(300.dp)
-                            .testTag(scrollableBoxTag)
-                            .scrollable(
-                                state = controller,
-                                orientation = Orientation.Horizontal
-                            )
+                        modifier =
+                            Modifier.size(300.dp)
+                                .testTag(scrollableBoxTag)
+                                .scrollable(
+                                    state = controller,
+                                    orientation = Orientation.Horizontal
+                                )
                     )
                 }
             }
@@ -1452,52 +1351,52 @@
         var value = 0f
         var expectedLeft = 0f
         val velocityFlung = 5000f
-        val controller = ScrollableState(
-            consumeScrollDelta = {
-                val toConsume = it * 0.345f
-                value += toConsume
-                expectedLeft = it - toConsume
-                toConsume
-            }
-        )
-        val parent = object : NestedScrollConnection {
-            override fun onPostScroll(
-                consumed: Offset,
-                available: Offset,
-                source: NestedScrollSource
-            ): Offset {
-                // we should get in post scroll as much as left in controller callback
-                assertThat(available.x).isEqualTo(expectedLeft)
-                return if (source == NestedScrollSource.SideEffect) Offset.Zero else available
-            }
+        val controller =
+            ScrollableState(
+                consumeScrollDelta = {
+                    val toConsume = it * 0.345f
+                    value += toConsume
+                    expectedLeft = it - toConsume
+                    toConsume
+                }
+            )
+        val parent =
+            object : NestedScrollConnection {
+                override fun onPostScroll(
+                    consumed: Offset,
+                    available: Offset,
+                    source: NestedScrollSource
+                ): Offset {
+                    // we should get in post scroll as much as left in controller callback
+                    assertThat(available.x).isEqualTo(expectedLeft)
+                    return if (source == NestedScrollSource.SideEffect) Offset.Zero else available
+                }
 
-            override suspend fun onPostFling(
-                consumed: Velocity,
-                available: Velocity
-            ): Velocity {
-                val expected = velocityFlung - consumed.x
-                assertThat(consumed.x).isLessThan(velocityFlung)
-                assertThat(abs(available.x - expected)).isLessThan(0.1f)
-                return available
+                override suspend fun onPostFling(
+                    consumed: Velocity,
+                    available: Velocity
+                ): Velocity {
+                    val expected = velocityFlung - consumed.x
+                    assertThat(consumed.x).isLessThan(velocityFlung)
+                    assertThat(abs(available.x - expected)).isLessThan(0.1f)
+                    return available
+                }
             }
-        }
 
         rule.setContentAndGetScope {
             Box {
                 Box(
                     contentAlignment = Alignment.Center,
-                    modifier = Modifier
-                        .size(300.dp)
-                        .nestedScroll(parent)
+                    modifier = Modifier.size(300.dp).nestedScroll(parent)
                 ) {
                     Box(
-                        modifier = Modifier
-                            .size(300.dp)
-                            .testTag(scrollableBoxTag)
-                            .scrollable(
-                                state = controller,
-                                orientation = Orientation.Horizontal
-                            )
+                        modifier =
+                            Modifier.size(300.dp)
+                                .testTag(scrollableBoxTag)
+                                .scrollable(
+                                    state = controller,
+                                    orientation = Orientation.Horizontal
+                                )
                     )
                 }
             }
@@ -1521,53 +1420,53 @@
         var value = 0f
         var expectedLeft = 0f
         val velocityFlung = 5000f
-        val controller = ScrollableState(
-            consumeScrollDelta = {
-                val toConsume = it * 0.345f
-                value += toConsume
-                expectedLeft = it - toConsume
-                toConsume
-            }
-        )
-        val parent = object : NestedScrollConnection {
-            override fun onPostScroll(
-                consumed: Offset,
-                available: Offset,
-                source: NestedScrollSource
-            ): Offset {
-                // we should get in post scroll as much as left in controller callback
-                assertThat(available.x).isEqualTo(-expectedLeft)
-                return if (source == NestedScrollSource.SideEffect) Offset.Zero else available
-            }
+        val controller =
+            ScrollableState(
+                consumeScrollDelta = {
+                    val toConsume = it * 0.345f
+                    value += toConsume
+                    expectedLeft = it - toConsume
+                    toConsume
+                }
+            )
+        val parent =
+            object : NestedScrollConnection {
+                override fun onPostScroll(
+                    consumed: Offset,
+                    available: Offset,
+                    source: NestedScrollSource
+                ): Offset {
+                    // we should get in post scroll as much as left in controller callback
+                    assertThat(available.x).isEqualTo(-expectedLeft)
+                    return if (source == NestedScrollSource.SideEffect) Offset.Zero else available
+                }
 
-            override suspend fun onPostFling(
-                consumed: Velocity,
-                available: Velocity
-            ): Velocity {
-                val expected = velocityFlung - consumed.x
-                assertThat(consumed.x).isLessThan(velocityFlung)
-                assertThat(abs(available.x - expected)).isLessThan(0.1f)
-                return available
+                override suspend fun onPostFling(
+                    consumed: Velocity,
+                    available: Velocity
+                ): Velocity {
+                    val expected = velocityFlung - consumed.x
+                    assertThat(consumed.x).isLessThan(velocityFlung)
+                    assertThat(abs(available.x - expected)).isLessThan(0.1f)
+                    return available
+                }
             }
-        }
 
         rule.setContentAndGetScope {
             Box {
                 Box(
                     contentAlignment = Alignment.Center,
-                    modifier = Modifier
-                        .size(300.dp)
-                        .nestedScroll(parent)
+                    modifier = Modifier.size(300.dp).nestedScroll(parent)
                 ) {
                     Box(
-                        modifier = Modifier
-                            .size(300.dp)
-                            .testTag(scrollableBoxTag)
-                            .scrollable(
-                                state = controller,
-                                reverseDirection = true,
-                                orientation = Orientation.Horizontal
-                            )
+                        modifier =
+                            Modifier.size(300.dp)
+                                .testTag(scrollableBoxTag)
+                                .scrollable(
+                                    state = controller,
+                                    reverseDirection = true,
+                                    orientation = Orientation.Horizontal
+                                )
                     )
                 }
             }
@@ -1590,29 +1489,26 @@
     fun scrollable_nestedScrollBelow_listensDispatches() {
         var value = 0f
         var expectedConsumed = 0f
-        val controller = ScrollableState(
-            consumeScrollDelta = {
-                expectedConsumed = it * 0.3f
-                value += expectedConsumed
-                expectedConsumed
-            }
-        )
+        val controller =
+            ScrollableState(
+                consumeScrollDelta = {
+                    expectedConsumed = it * 0.3f
+                    value += expectedConsumed
+                    expectedConsumed
+                }
+            )
         val child = object : NestedScrollConnection {}
         val dispatcher = NestedScrollDispatcher()
 
         rule.setContentAndGetScope {
             Box {
                 Box(
-                    modifier = Modifier
-                        .size(300.dp)
-                        .scrollable(
-                            state = controller,
-                            orientation = Orientation.Horizontal
-                        )
+                    modifier =
+                        Modifier.size(300.dp)
+                            .scrollable(state = controller, orientation = Orientation.Horizontal)
                 ) {
                     Box(
-                        Modifier
-                            .size(200.dp)
+                        Modifier.size(200.dp)
                             .testTag(scrollableBoxTag)
                             .nestedScroll(child, dispatcher)
                     )
@@ -1620,20 +1516,22 @@
             }
         }
 
-        val lastValueBeforeFling = rule.runOnIdle {
-            val preScrollConsumed = dispatcher
-                .dispatchPreScroll(Offset(20f, 20f), NestedScrollSource.UserInput)
-            // scrollable is not interested in pre scroll
-            assertThat(preScrollConsumed).isEqualTo(Offset.Zero)
+        val lastValueBeforeFling =
+            rule.runOnIdle {
+                val preScrollConsumed =
+                    dispatcher.dispatchPreScroll(Offset(20f, 20f), NestedScrollSource.UserInput)
+                // scrollable is not interested in pre scroll
+                assertThat(preScrollConsumed).isEqualTo(Offset.Zero)
 
-            val consumed = dispatcher.dispatchPostScroll(
-                Offset(20f, 20f),
-                Offset(50f, 50f),
-                NestedScrollSource.UserInput
-            )
-            assertThat(consumed.x - expectedConsumed).isWithin(0.001f)
-            value
-        }
+                val consumed =
+                    dispatcher.dispatchPostScroll(
+                        Offset(20f, 20f),
+                        Offset(50f, 50f),
+                        NestedScrollSource.UserInput
+                    )
+                assertThat(consumed.x - expectedConsumed).isWithin(0.001f)
+                value
+            }
 
         scope.launch {
             val preFlingConsumed = dispatcher.dispatchPreFling(Velocity(50f, 50f))
@@ -1643,10 +1541,7 @@
         rule.waitForIdle()
 
         scope.launch {
-            dispatcher.dispatchPostFling(
-                Velocity(1000f, 1000f),
-                Velocity(2000f, 2000f)
-            )
+            dispatcher.dispatchPostFling(Velocity(1000f, 1000f), Velocity(2000f, 2000f))
         }
 
         rule.runOnIdle {
@@ -1659,32 +1554,33 @@
     fun scrollable_nestedScroll_allowParentWhenDisabled() {
         var childValue = 0f
         var parentValue = 0f
-        val childController = ScrollableState(
-            consumeScrollDelta = {
-                childValue += it
-                it
-            }
-        )
-        val parentController = ScrollableState(
-            consumeScrollDelta = {
-                parentValue += it
-                it
-            }
-        )
+        val childController =
+            ScrollableState(
+                consumeScrollDelta = {
+                    childValue += it
+                    it
+                }
+            )
+        val parentController =
+            ScrollableState(
+                consumeScrollDelta = {
+                    parentValue += it
+                    it
+                }
+            )
 
         rule.setContentAndGetScope {
             Box {
                 Box(
-                    modifier = Modifier
-                        .size(300.dp)
-                        .scrollable(
-                            state = parentController,
-                            orientation = Orientation.Horizontal
-                        )
+                    modifier =
+                        Modifier.size(300.dp)
+                            .scrollable(
+                                state = parentController,
+                                orientation = Orientation.Horizontal
+                            )
                 ) {
                     Box(
-                        Modifier
-                            .size(200.dp)
+                        Modifier.size(200.dp)
                             .testTag(scrollableBoxTag)
                             .scrollable(
                                 enabled = false,
@@ -1701,10 +1597,9 @@
             assertThat(childValue).isEqualTo(0f)
         }
 
-        rule.onNodeWithTag(scrollableBoxTag)
-            .performTouchInput {
-                swipe(center, center.copy(x = center.x + 100f))
-            }
+        rule.onNodeWithTag(scrollableBoxTag).performTouchInput {
+            swipe(center, center.copy(x = center.x + 100f))
+        }
 
         rule.runOnIdle {
             assertThat(childValue).isEqualTo(0f)
@@ -1717,38 +1612,40 @@
         var childValue = 0f
         var parentValue = 0f
         var selfValue = 0f
-        val childController = ScrollableState(
-            consumeScrollDelta = {
-                childValue += it / 2
-                it / 2
-            }
-        )
-        val middleController = ScrollableState(
-            consumeScrollDelta = {
-                selfValue += it / 2
-                it / 2
-            }
-        )
-        val parentController = ScrollableState(
-            consumeScrollDelta = {
-                parentValue += it / 2
-                it / 2
-            }
-        )
+        val childController =
+            ScrollableState(
+                consumeScrollDelta = {
+                    childValue += it / 2
+                    it / 2
+                }
+            )
+        val middleController =
+            ScrollableState(
+                consumeScrollDelta = {
+                    selfValue += it / 2
+                    it / 2
+                }
+            )
+        val parentController =
+            ScrollableState(
+                consumeScrollDelta = {
+                    parentValue += it / 2
+                    it / 2
+                }
+            )
 
         rule.setContentAndGetScope {
             Box {
                 Box(
-                    modifier = Modifier
-                        .size(300.dp)
-                        .scrollable(
-                            state = parentController,
-                            orientation = Orientation.Horizontal
-                        )
+                    modifier =
+                        Modifier.size(300.dp)
+                            .scrollable(
+                                state = parentController,
+                                orientation = Orientation.Horizontal
+                            )
                 ) {
                     Box(
-                        Modifier
-                            .size(200.dp)
+                        Modifier.size(200.dp)
                             .scrollable(
                                 enabled = false,
                                 orientation = Orientation.Horizontal,
@@ -1756,8 +1653,7 @@
                             )
                     ) {
                         Box(
-                            Modifier
-                                .size(200.dp)
+                            Modifier.size(200.dp)
                                 .testTag(scrollableBoxTag)
                                 .scrollable(
                                     orientation = Orientation.Horizontal,
@@ -1775,10 +1671,9 @@
             assertThat(childValue).isEqualTo(0f)
         }
 
-        rule.onNodeWithTag(scrollableBoxTag)
-            .performTouchInput {
-                swipe(center, center.copy(x = center.x + 100f))
-            }
+        rule.onNodeWithTag(scrollableBoxTag).performTouchInput {
+            swipe(center, center.copy(x = center.x + 100f))
+        }
 
         rule.runOnIdle {
             assertThat(childValue).isGreaterThan(0f)
@@ -1797,27 +1692,28 @@
             childDeltas += it
             it
         }
-        val flingCancellationParent = object : NestedScrollConnection {
-            override fun onPostScroll(
-                consumed: Offset,
-                available: Offset,
-                source: NestedScrollSource
-            ): Offset {
-                if (source == NestedScrollSource.SideEffect && available != Offset.Zero) {
-                    throw CancellationException()
+        val flingCancellationParent =
+            object : NestedScrollConnection {
+                override fun onPostScroll(
+                    consumed: Offset,
+                    available: Offset,
+                    source: NestedScrollSource
+                ): Offset {
+                    if (source == NestedScrollSource.SideEffect && available != Offset.Zero) {
+                        throw CancellationException()
+                    }
+                    return Offset.Zero
                 }
-                return Offset.Zero
             }
-        }
 
         rule.setContent {
             touchSlop = LocalViewConfiguration.current.touchSlop
             Box(modifier = Modifier.nestedScroll(flingCancellationParent)) {
                 Box(
-                    modifier = Modifier
-                        .size(600.dp)
-                        .testTag("childScrollable")
-                        .scrollable(childController, Orientation.Horizontal)
+                    modifier =
+                        Modifier.size(600.dp)
+                            .testTag("childScrollable")
+                            .scrollable(childController, Orientation.Horizontal)
                 )
             }
         }
@@ -1829,9 +1725,7 @@
             up()
         }
 
-        rule.runOnIdle {
-            assertThat(childDeltas).isEqualTo(100f - touchSlop)
-        }
+        rule.runOnIdle { assertThat(childDeltas).isEqualTo(100f - touchSlop) }
 
         childDeltas = 0f
         var dragged = 0f
@@ -1849,43 +1743,42 @@
         val velocityFlung = 5000f
         val outerState = ScrollableState(consumeScrollDelta = { 0f })
         val innerState = ScrollableState(consumeScrollDelta = { 0f })
-        val innerFlingBehavior = object : FlingBehavior {
-            override suspend fun ScrollScope.performFling(initialVelocity: Float): Float {
-                return initialVelocity
+        val innerFlingBehavior =
+            object : FlingBehavior {
+                override suspend fun ScrollScope.performFling(initialVelocity: Float): Float {
+                    return initialVelocity
+                }
             }
-        }
-        val parent = object : NestedScrollConnection {
-            override suspend fun onPostFling(
-                consumed: Velocity,
-                available: Velocity
-            ): Velocity {
-                assertThat(consumed.x).isEqualTo(0f)
-                assertThat(available.x).isWithin(0.1f).of(velocityFlung)
-                return available
+        val parent =
+            object : NestedScrollConnection {
+                override suspend fun onPostFling(
+                    consumed: Velocity,
+                    available: Velocity
+                ): Velocity {
+                    assertThat(consumed.x).isEqualTo(0f)
+                    assertThat(available.x).isWithin(0.1f).of(velocityFlung)
+                    return available
+                }
             }
-        }
 
         rule.setContentAndGetScope {
             Box {
                 Box(
                     contentAlignment = Alignment.Center,
-                    modifier = Modifier
-                        .size(300.dp)
-                        .nestedScroll(parent)
-                        .scrollable(
-                            state = outerState,
-                            orientation = Orientation.Vertical
-                        )
+                    modifier =
+                        Modifier.size(300.dp)
+                            .nestedScroll(parent)
+                            .scrollable(state = outerState, orientation = Orientation.Vertical)
                 ) {
                     Box(
-                        modifier = Modifier
-                            .size(300.dp)
-                            .testTag(scrollableBoxTag)
-                            .scrollable(
-                                state = innerState,
-                                flingBehavior = innerFlingBehavior,
-                                orientation = Orientation.Horizontal
-                            )
+                        modifier =
+                            Modifier.size(300.dp)
+                                .testTag(scrollableBoxTag)
+                                .scrollable(
+                                    state = innerState,
+                                    flingBehavior = innerFlingBehavior,
+                                    orientation = Orientation.Horizontal
+                                )
                     )
                 }
             }
@@ -1908,12 +1801,13 @@
     fun scrollable_interactionSource() {
         val interactionSource = MutableInteractionSource()
         var total = 0f
-        val controller = ScrollableState(
-            consumeScrollDelta = {
-                total += it
-                it
-            }
-        )
+        val controller =
+            ScrollableState(
+                consumeScrollDelta = {
+                    total += it
+                    it
+                }
+            )
 
         setScrollableContent {
             Modifier.scrollable(
@@ -1925,36 +1819,27 @@
 
         val interactions = mutableListOf<Interaction>()
 
-        scope.launch {
-            interactionSource.interactions.collect { interactions.add(it) }
-        }
+        scope.launch { interactionSource.interactions.collect { interactions.add(it) } }
 
-        rule.runOnIdle {
-            assertThat(interactions).isEmpty()
-        }
+        rule.runOnIdle { assertThat(interactions).isEmpty() }
 
-        rule.onNodeWithTag(scrollableBoxTag)
-            .performTouchInput {
-                down(Offset(visibleSize.width / 4f, visibleSize.height / 2f))
-                moveBy(Offset(visibleSize.width / 2f, 0f))
-            }
+        rule.onNodeWithTag(scrollableBoxTag).performTouchInput {
+            down(Offset(visibleSize.width / 4f, visibleSize.height / 2f))
+            moveBy(Offset(visibleSize.width / 2f, 0f))
+        }
 
         rule.runOnIdle {
             assertThat(interactions).hasSize(1)
             assertThat(interactions.first()).isInstanceOf(DragInteraction.Start::class.java)
         }
 
-        rule.onNodeWithTag(scrollableBoxTag)
-            .performTouchInput {
-                up()
-            }
+        rule.onNodeWithTag(scrollableBoxTag).performTouchInput { up() }
 
         rule.runOnIdle {
             assertThat(interactions).hasSize(2)
             assertThat(interactions.first()).isInstanceOf(DragInteraction.Start::class.java)
             assertThat(interactions[1]).isInstanceOf(DragInteraction.Stop::class.java)
-            assertThat((interactions[1] as DragInteraction.Stop).start)
-                .isEqualTo(interactions[0])
+            assertThat((interactions[1] as DragInteraction.Stop).start).isEqualTo(interactions[0])
         }
     }
 
@@ -1963,25 +1848,26 @@
         val interactionSource = MutableInteractionSource()
         var emitScrollableBox by mutableStateOf(true)
         var total = 0f
-        val controller = ScrollableState(
-            consumeScrollDelta = {
-                total += it
-                it
-            }
-        )
+        val controller =
+            ScrollableState(
+                consumeScrollDelta = {
+                    total += it
+                    it
+                }
+            )
 
         rule.setContentAndGetScope {
             Box {
                 if (emitScrollableBox) {
                     Box(
-                        modifier = Modifier
-                            .testTag(scrollableBoxTag)
-                            .size(100.dp)
-                            .scrollable(
-                                interactionSource = interactionSource,
-                                orientation = Orientation.Horizontal,
-                                state = controller
-                            )
+                        modifier =
+                            Modifier.testTag(scrollableBoxTag)
+                                .size(100.dp)
+                                .scrollable(
+                                    interactionSource = interactionSource,
+                                    orientation = Orientation.Horizontal,
+                                    state = controller
+                                )
                     )
                 }
             }
@@ -1989,19 +1875,14 @@
 
         val interactions = mutableListOf<Interaction>()
 
-        scope.launch {
-            interactionSource.interactions.collect { interactions.add(it) }
-        }
+        scope.launch { interactionSource.interactions.collect { interactions.add(it) } }
 
-        rule.runOnIdle {
-            assertThat(interactions).isEmpty()
-        }
+        rule.runOnIdle { assertThat(interactions).isEmpty() }
 
-        rule.onNodeWithTag(scrollableBoxTag)
-            .performTouchInput {
-                down(Offset(visibleSize.width / 4f, visibleSize.height / 2f))
-                moveBy(Offset(visibleSize.width / 2f, 0f))
-            }
+        rule.onNodeWithTag(scrollableBoxTag).performTouchInput {
+            down(Offset(visibleSize.width / 4f, visibleSize.height / 2f))
+            moveBy(Offset(visibleSize.width / 2f, 0f))
+        }
 
         rule.runOnIdle {
             assertThat(interactions).hasSize(1)
@@ -2009,37 +1890,36 @@
         }
 
         // Dispose scrollable
-        rule.runOnIdle {
-            emitScrollableBox = false
-        }
+        rule.runOnIdle { emitScrollableBox = false }
 
         rule.runOnIdle {
             assertThat(interactions).hasSize(2)
             assertThat(interactions.first()).isInstanceOf(DragInteraction.Start::class.java)
             assertThat(interactions[1]).isInstanceOf(DragInteraction.Cancel::class.java)
-            assertThat((interactions[1] as DragInteraction.Cancel).start)
-                .isEqualTo(interactions[0])
+            assertThat((interactions[1] as DragInteraction.Cancel).start).isEqualTo(interactions[0])
         }
     }
 
     @Test
     fun scrollable_flingBehaviourCalled_whenVelocity0() {
         var total = 0f
-        val controller = ScrollableState(
-            consumeScrollDelta = {
-                total += it
-                it
-            }
-        )
+        val controller =
+            ScrollableState(
+                consumeScrollDelta = {
+                    total += it
+                    it
+                }
+            )
         var flingCalled = 0
         var flingVelocity: Float = Float.MAX_VALUE
-        val flingBehaviour = object : FlingBehavior {
-            override suspend fun ScrollScope.performFling(initialVelocity: Float): Float {
-                flingCalled++
-                flingVelocity = initialVelocity
-                return 0f
+        val flingBehaviour =
+            object : FlingBehavior {
+                override suspend fun ScrollScope.performFling(initialVelocity: Float): Float {
+                    flingCalled++
+                    flingVelocity = initialVelocity
+                    return 0f
+                }
             }
-        }
         setScrollableContent {
             Modifier.scrollable(
                 state = controller,
@@ -2060,21 +1940,23 @@
     @Test
     fun scrollable_flingBehaviourCalled() {
         var total = 0f
-        val controller = ScrollableState(
-            consumeScrollDelta = {
-                total += it
-                it
-            }
-        )
+        val controller =
+            ScrollableState(
+                consumeScrollDelta = {
+                    total += it
+                    it
+                }
+            )
         var flingCalled = 0
         var flingVelocity: Float = Float.MAX_VALUE
-        val flingBehaviour = object : FlingBehavior {
-            override suspend fun ScrollScope.performFling(initialVelocity: Float): Float {
-                flingCalled++
-                flingVelocity = initialVelocity
-                return 0f
+        val flingBehaviour =
+            object : FlingBehavior {
+                override suspend fun ScrollScope.performFling(initialVelocity: Float): Float {
+                    flingCalled++
+                    flingVelocity = initialVelocity
+                    return 0f
+                }
             }
-        }
         setScrollableContent {
             Modifier.scrollable(
                 state = controller,
@@ -2083,11 +1965,7 @@
             )
         }
         rule.onNodeWithTag(scrollableBoxTag).performTouchInput {
-            swipeWithVelocity(
-                this.center,
-                this.center + Offset(115f, 0f),
-                endVelocity = 1000f
-            )
+            swipeWithVelocity(this.center, this.center + Offset(115f, 0f), endVelocity = 1000f)
         }
         assertThat(flingCalled).isEqualTo(1)
         assertThat(flingVelocity).isWithin(5f).of(1000f)
@@ -2096,21 +1974,23 @@
     @Test
     fun scrollable_flingBehaviourCalled_reversed() {
         var total = 0f
-        val controller = ScrollableState(
-            consumeScrollDelta = {
-                total += it
-                it
-            }
-        )
+        val controller =
+            ScrollableState(
+                consumeScrollDelta = {
+                    total += it
+                    it
+                }
+            )
         var flingCalled = 0
         var flingVelocity: Float = Float.MAX_VALUE
-        val flingBehaviour = object : FlingBehavior {
-            override suspend fun ScrollScope.performFling(initialVelocity: Float): Float {
-                flingCalled++
-                flingVelocity = initialVelocity
-                return 0f
+        val flingBehaviour =
+            object : FlingBehavior {
+                override suspend fun ScrollScope.performFling(initialVelocity: Float): Float {
+                    flingCalled++
+                    flingVelocity = initialVelocity
+                    return 0f
+                }
             }
-        }
         setScrollableContent {
             Modifier.scrollable(
                 state = controller,
@@ -2120,11 +2000,7 @@
             )
         }
         rule.onNodeWithTag(scrollableBoxTag).performTouchInput {
-            swipeWithVelocity(
-                this.center,
-                this.center + Offset(115f, 0f),
-                endVelocity = 1000f
-            )
+            swipeWithVelocity(this.center, this.center + Offset(115f, 0f), endVelocity = 1000f)
         }
         assertThat(flingCalled).isEqualTo(1)
         assertThat(flingVelocity).isWithin(5f).of(-1000f)
@@ -2134,18 +2010,20 @@
     fun scrollable_flingBehaviourCalled_correctScope() {
         var total = 0f
         var returned = 0f
-        val controller = ScrollableState(
-            consumeScrollDelta = {
-                total += it
-                it
+        val controller =
+            ScrollableState(
+                consumeScrollDelta = {
+                    total += it
+                    it
+                }
+            )
+        val flingBehaviour =
+            object : FlingBehavior {
+                override suspend fun ScrollScope.performFling(initialVelocity: Float): Float {
+                    returned = scrollBy(123f)
+                    return 0f
+                }
             }
-        )
-        val flingBehaviour = object : FlingBehavior {
-            override suspend fun ScrollScope.performFling(initialVelocity: Float): Float {
-                returned = scrollBy(123f)
-                return 0f
-            }
-        }
         setScrollableContent {
             Modifier.scrollable(
                 state = controller,
@@ -2158,14 +2036,13 @@
             moveBy(Offset(x = 100f, y = 0f))
         }
 
-        val prevTotal = rule.runOnIdle {
-            assertThat(total).isGreaterThan(0f)
-            total
-        }
+        val prevTotal =
+            rule.runOnIdle {
+                assertThat(total).isGreaterThan(0f)
+                total
+            }
 
-        rule.onNodeWithTag(scrollableBoxTag).performTouchInput {
-            up()
-        }
+        rule.onNodeWithTag(scrollableBoxTag).performTouchInput { up() }
 
         rule.runOnIdle {
             assertThat(total).isEqualTo(prevTotal + 123)
@@ -2177,18 +2054,20 @@
     fun scrollable_flingBehaviourCalled_reversed_correctScope() {
         var total = 0f
         var returned = 0f
-        val controller = ScrollableState(
-            consumeScrollDelta = {
-                total += it
-                it
+        val controller =
+            ScrollableState(
+                consumeScrollDelta = {
+                    total += it
+                    it
+                }
+            )
+        val flingBehaviour =
+            object : FlingBehavior {
+                override suspend fun ScrollScope.performFling(initialVelocity: Float): Float {
+                    returned = scrollBy(123f)
+                    return 0f
+                }
             }
-        )
-        val flingBehaviour = object : FlingBehavior {
-            override suspend fun ScrollScope.performFling(initialVelocity: Float): Float {
-                returned = scrollBy(123f)
-                return 0f
-            }
-        }
         setScrollableContent {
             Modifier.scrollable(
                 state = controller,
@@ -2202,14 +2081,13 @@
             moveBy(Offset(x = 100f, y = 0f))
         }
 
-        val prevTotal = rule.runOnIdle {
-            assertThat(total).isLessThan(0f)
-            total
-        }
+        val prevTotal =
+            rule.runOnIdle {
+                assertThat(total).isLessThan(0f)
+                total
+            }
 
-        rule.onNodeWithTag(scrollableBoxTag).performTouchInput {
-            up()
-        }
+        rule.onNodeWithTag(scrollableBoxTag).performTouchInput { up() }
 
         rule.runOnIdle {
             assertThat(total).isEqualTo(prevTotal + 123)
@@ -2226,23 +2104,20 @@
         rule.setContent {
             Box {
                 Box(
-                    modifier = Modifier
-                        .testTag(scrollableBoxTag)
-                        .size(100.dp)
-                        .then(
-                            ScrollableContainerReaderNodeElement {
-                                isOuterInScrollableContainer = it
-                            }
-                        )
-                        .scrollable(
-                            state = controller,
-                            orientation = Orientation.Horizontal
-                        )
-                        .then(
-                            ScrollableContainerReaderNodeElement {
-                                isInnerInScrollableContainer = it
-                            }
-                        )
+                    modifier =
+                        Modifier.testTag(scrollableBoxTag)
+                            .size(100.dp)
+                            .then(
+                                ScrollableContainerReaderNodeElement {
+                                    isOuterInScrollableContainer = it
+                                }
+                            )
+                            .scrollable(state = controller, orientation = Orientation.Horizontal)
+                            .then(
+                                ScrollableContainerReaderNodeElement {
+                                    isInnerInScrollableContainer = it
+                                }
+                            )
                 )
             }
         }
@@ -2262,24 +2137,24 @@
         rule.setContent {
             Box {
                 Box(
-                    modifier = Modifier
-                        .testTag(scrollableBoxTag)
-                        .size(100.dp)
-                        .then(
-                            ScrollableContainerReaderNodeElement {
-                                isOuterInScrollableContainer = it
-                            }
-                        )
-                        .scrollable(
-                            state = controller,
-                            orientation = Orientation.Horizontal,
-                            enabled = false
-                        )
-                        .then(
-                            ScrollableContainerReaderNodeElement {
-                                isInnerInScrollableContainer = it
-                            }
-                        )
+                    modifier =
+                        Modifier.testTag(scrollableBoxTag)
+                            .size(100.dp)
+                            .then(
+                                ScrollableContainerReaderNodeElement {
+                                    isOuterInScrollableContainer = it
+                                }
+                            )
+                            .scrollable(
+                                state = controller,
+                                orientation = Orientation.Horizontal,
+                                enabled = false
+                            )
+                            .then(
+                                ScrollableContainerReaderNodeElement {
+                                    isInnerInScrollableContainer = it
+                                }
+                            )
                 )
             }
         }
@@ -2299,34 +2174,28 @@
         rule.setContent {
             Box {
                 Box(
-                    modifier = Modifier
-                        .testTag(scrollableBoxTag)
-                        .size(100.dp)
-                        .scrollable(
-                            state = controller,
-                            orientation = Orientation.Horizontal,
-                            enabled = enabled.value
-                        )
-                        .then(
-                            ScrollableContainerReaderNodeElement {
-                                isInnerInScrollableContainer = it
-                            }
-                        )
+                    modifier =
+                        Modifier.testTag(scrollableBoxTag)
+                            .size(100.dp)
+                            .scrollable(
+                                state = controller,
+                                orientation = Orientation.Horizontal,
+                                enabled = enabled.value
+                            )
+                            .then(
+                                ScrollableContainerReaderNodeElement {
+                                    isInnerInScrollableContainer = it
+                                }
+                            )
                 )
             }
         }
 
-        rule.runOnIdle {
-            assertThat(isInnerInScrollableContainer).isTrue()
-        }
+        rule.runOnIdle { assertThat(isInnerInScrollableContainer).isTrue() }
 
-        rule.runOnIdle {
-            enabled.value = false
-        }
+        rule.runOnIdle { enabled.value = false }
 
-        rule.runOnIdle {
-            assertThat(isInnerInScrollableContainer).isFalse()
-        }
+        rule.runOnIdle { assertThat(isInnerInScrollableContainer).isFalse() }
     }
 
     @Test
@@ -2334,20 +2203,18 @@
         rule.mainClock.autoAdvance = false
 
         var total = 0f
-        val controller = ScrollableState(
-            consumeScrollDelta = {
-                total += it
-                it
-            }
-        )
+        val controller =
+            ScrollableState(
+                consumeScrollDelta = {
+                    total += it
+                    it
+                }
+            )
         rule.setContentAndGetScope {
             Box(
-                modifier = Modifier
-                    .size(100.dp)
-                    .scrollable(
-                        state = controller,
-                        orientation = Orientation.Horizontal
-                    )
+                modifier =
+                    Modifier.size(100.dp)
+                        .scrollable(state = controller, orientation = Orientation.Horizontal)
             )
         }
 
@@ -2414,45 +2281,34 @@
         rule.mainClock.autoAdvance = false
 
         var total = 0f
-        val controller = ScrollableState(
-            consumeScrollDelta = {
-                total += it
-                it
-            }
-        )
+        val controller =
+            ScrollableState(
+                consumeScrollDelta = {
+                    total += it
+                    it
+                }
+            )
         rule.setContentAndGetScope {
             Box(
-                modifier = Modifier
-                    .size(100.dp)
-                    .scrollable(
-                        state = controller,
-                        orientation = Orientation.Horizontal
-                    )
+                modifier =
+                    Modifier.size(100.dp)
+                        .scrollable(state = controller, orientation = Orientation.Horizontal)
             )
         }
 
         lateinit var animateJob: Job
 
         rule.runOnIdle {
-            animateJob = scope.launch {
-                controller.animateScrollBy(
-                    100f,
-                    tween(1000)
-                )
-            }
+            animateJob = scope.launch { controller.animateScrollBy(100f, tween(1000)) }
         }
 
         rule.mainClock.advanceTimeBy(500)
-        rule.runOnIdle {
-            assertThat(controller.isScrollInProgress).isTrue()
-        }
+        rule.runOnIdle { assertThat(controller.isScrollInProgress).isTrue() }
 
         // Stop halfway through the animation
         animateJob.cancel()
 
-        rule.runOnIdle {
-            assertThat(controller.isScrollInProgress).isFalse()
-        }
+        rule.runOnIdle { assertThat(controller.isScrollInProgress).isFalse() }
     }
 
     @Test
@@ -2460,48 +2316,32 @@
         rule.mainClock.autoAdvance = false
 
         var total = 0f
-        val controller = ScrollableState(
-            consumeScrollDelta = {
-                total += it
-                it
-            }
-        )
+        val controller =
+            ScrollableState(
+                consumeScrollDelta = {
+                    total += it
+                    it
+                }
+            )
         rule.setContentAndGetScope {
             Box(
-                modifier = Modifier
-                    .size(100.dp)
-                    .scrollable(
-                        state = controller,
-                        orientation = Orientation.Horizontal
-                    )
+                modifier =
+                    Modifier.size(100.dp)
+                        .scrollable(state = controller, orientation = Orientation.Horizontal)
             )
         }
 
-        rule.runOnIdle {
-            scope.launch {
-                controller.animateScrollBy(
-                    100f,
-                    tween(1000)
-                )
-            }
-        }
+        rule.runOnIdle { scope.launch { controller.animateScrollBy(100f, tween(1000)) } }
 
         rule.mainClock.advanceTimeBy(500)
         rule.runOnIdle {
             assertThat(total).isGreaterThan(0f)
             assertThat(total).isLessThan(100f)
             assertThat(controller.isScrollInProgress).isTrue()
-            scope.launch {
-                controller.animateScrollBy(
-                    -100f,
-                    tween(1000)
-                )
-            }
+            scope.launch { controller.animateScrollBy(-100f, tween(1000)) }
         }
 
-        rule.runOnIdle {
-            assertThat(controller.isScrollInProgress).isTrue()
-        }
+        rule.runOnIdle { assertThat(controller.isScrollInProgress).isTrue() }
 
         rule.mainClock.advanceTimeBy(1000)
         rule.mainClock.advanceTimeByFrame()
@@ -2536,33 +2376,22 @@
 
         rule.setContentAndGetScope {
             Box(
-                modifier = Modifier
-                    .testTag("outerScrollable")
-                    .size(300.dp)
-                    .scrollable(
-                        outerStateController,
-                        orientation = Orientation.Horizontal
-                    )
-
+                modifier =
+                    Modifier.testTag("outerScrollable")
+                        .size(300.dp)
+                        .scrollable(outerStateController, orientation = Orientation.Horizontal)
             ) {
                 Box(
-                    modifier = Modifier
-                        .testTag("middleScrollable")
-                        .size(300.dp)
-                        .scrollable(
-                            middleController,
-                            orientation = Orientation.Vertical
-                        )
-
+                    modifier =
+                        Modifier.testTag("middleScrollable")
+                            .size(300.dp)
+                            .scrollable(middleController, orientation = Orientation.Vertical)
                 ) {
                     Box(
-                        modifier = Modifier
-                            .testTag("innerScrollable")
-                            .size(300.dp)
-                            .scrollable(
-                                innerController,
-                                orientation = Orientation.Horizontal
-                            )
+                        modifier =
+                            Modifier.testTag("innerScrollable")
+                                .size(300.dp)
+                                .scrollable(innerController, orientation = Orientation.Horizontal)
                     )
                 }
             }
@@ -2607,45 +2436,34 @@
         rule.setContentAndGetScope {
             touchSlop = LocalViewConfiguration.current.touchSlop
             Box(
-                modifier = Modifier
-                    .testTag("outerScrollable")
-                    .size(600.dp)
-                    .background(Color.Red)
-                    .scrollable(
-                        outerStateController,
-                        orientation = Orientation.Vertical
-                    ),
+                modifier =
+                    Modifier.testTag("outerScrollable")
+                        .size(600.dp)
+                        .background(Color.Red)
+                        .scrollable(outerStateController, orientation = Orientation.Vertical),
                 contentAlignment = Alignment.BottomStart
             ) {
                 Box(
-                    modifier = Modifier
-                        .testTag("middleScrollable")
-                        .size(300.dp)
-                        .background(Color.Blue)
-                        .scrollable(
-                            middleController,
-                            orientation = Orientation.Vertical
-                        ),
+                    modifier =
+                        Modifier.testTag("middleScrollable")
+                            .size(300.dp)
+                            .background(Color.Blue)
+                            .scrollable(middleController, orientation = Orientation.Vertical),
                     contentAlignment = Alignment.BottomStart
                 ) {
                     Box(
-                        modifier = Modifier
-                            .testTag("innerScrollable")
-                            .size(50.dp)
-                            .background(Color.Yellow)
-                            .scrollable(
-                                innerController,
-                                orientation = Orientation.Vertical
-                            )
+                        modifier =
+                            Modifier.testTag("innerScrollable")
+                                .size(50.dp)
+                                .background(Color.Yellow)
+                                .scrollable(innerController, orientation = Orientation.Vertical)
                     )
                 }
             }
         }
 
         rule.mainClock.autoAdvance = false
-        rule.onNodeWithTag("innerScrollable").performTouchInput {
-            swipeUp()
-        }
+        rule.onNodeWithTag("innerScrollable").performTouchInput { swipeUp() }
 
         rule.mainClock.advanceTimeByFrame()
         rule.mainClock.advanceTimeByFrame()
@@ -2660,9 +2478,7 @@
 
         rule.mainClock.autoAdvance = true
 
-        rule.runOnIdle {
-            assertThat(outerDelta).isEqualTo(previousOuter + touchSlop / 2)
-        }
+        rule.runOnIdle { assertThat(outerDelta).isEqualTo(previousOuter + touchSlop / 2) }
     }
 
     @Test
@@ -2671,42 +2487,30 @@
         rule.setContentAndGetScope {
             LazyColumn(Modifier.testTag("column")) {
                 item {
-                    Box(modifier = Modifier
-                        .size(20.dp)
-                        .background(Color.Red)
-                        .clickable { clicked++ })
+                    Box(
+                        modifier =
+                            Modifier.size(20.dp).background(Color.Red).clickable { clicked++ }
+                    )
                 }
                 item {
                     LazyRow(Modifier.testTag("list")) {
-                        items(100) {
-                            Box(
-                                modifier = Modifier
-                                    .size(20.dp)
-                                    .background(Color.Blue)
-                            )
-                        }
+                        items(100) { Box(modifier = Modifier.size(20.dp).background(Color.Blue)) }
                     }
                 }
             }
         }
 
         rule.mainClock.autoAdvance = false
-        rule.onNodeWithTag("list", useUnmergedTree = true).performTouchInput {
-            swipeLeft()
-        }
+        rule.onNodeWithTag("list", useUnmergedTree = true).performTouchInput { swipeLeft() }
 
         rule.mainClock.advanceTimeByFrame()
         rule.mainClock.advanceTimeByFrame()
 
-        rule.onNodeWithTag("column").performTouchInput {
-            click(Offset(10f, 10f))
-        }
+        rule.onNodeWithTag("column").performTouchInput { click(Offset(10f, 10f)) }
 
         rule.mainClock.autoAdvance = true
 
-        rule.runOnIdle {
-            assertThat(clicked).isEqualTo(1)
-        }
+        rule.runOnIdle { assertThat(clicked).isEqualTo(1) }
     }
 
     // b/179417109 Double checks that in a nested scroll cycle, the parent post scroll
@@ -2731,44 +2535,38 @@
             it / 2
         }
 
-        val connection = object : NestedScrollConnection {
-            override fun onPreScroll(available: Offset, source: NestedScrollSource): Offset {
-                preScrollAvailable += available
-                return Offset.Zero
-            }
+        val connection =
+            object : NestedScrollConnection {
+                override fun onPreScroll(available: Offset, source: NestedScrollSource): Offset {
+                    preScrollAvailable += available
+                    return Offset.Zero
+                }
 
-            override fun onPostScroll(
-                consumed: Offset,
-                available: Offset,
-                source: NestedScrollSource
-            ): Offset {
-                consumedPostScroll += consumed
-                postScrollAvailable += available
-                return Offset.Zero
+                override fun onPostScroll(
+                    consumed: Offset,
+                    available: Offset,
+                    source: NestedScrollSource
+                ): Offset {
+                    consumedPostScroll += consumed
+                    postScrollAvailable += available
+                    return Offset.Zero
+                }
             }
-        }
 
         rule.setContent {
             touchSlop = LocalViewConfiguration.current.touchSlop
             Box(modifier = Modifier.nestedScroll(connection)) {
                 Box(
-                    modifier = Modifier
-                        .testTag("outerScrollable")
-                        .size(300.dp)
-                        .scrollable(
-                            outerStateController,
-                            orientation = Orientation.Horizontal
-                        )
-
+                    modifier =
+                        Modifier.testTag("outerScrollable")
+                            .size(300.dp)
+                            .scrollable(outerStateController, orientation = Orientation.Horizontal)
                 ) {
                     Box(
-                        modifier = Modifier
-                            .testTag("innerScrollable")
-                            .size(300.dp)
-                            .scrollable(
-                                innerController,
-                                orientation = Orientation.Horizontal
-                            )
+                        modifier =
+                            Modifier.testTag("innerScrollable")
+                                .size(300.dp)
+                                .scrollable(innerController, orientation = Orientation.Horizontal)
                     )
                 }
             }
@@ -2795,24 +2593,23 @@
 
     @Test
     fun testInspectorValue() {
-        val controller = ScrollableState(
-            consumeScrollDelta = { it }
-        )
+        val controller = ScrollableState(consumeScrollDelta = { it })
         rule.setContentAndGetScope {
             val modifier =
                 Modifier.scrollable(controller, Orientation.Vertical).first() as InspectableValue
             assertThat(modifier.nameFallback).isEqualTo("scrollable")
             assertThat(modifier.valueOverride).isNull()
-            assertThat(modifier.inspectableElements.map { it.name }.asIterable()).containsExactly(
-                "orientation",
-                "state",
-                "overscrollEffect",
-                "enabled",
-                "reverseDirection",
-                "flingBehavior",
-                "interactionSource",
-                "bringIntoViewSpec",
-            )
+            assertThat(modifier.inspectableElements.map { it.name }.asIterable())
+                .containsExactly(
+                    "orientation",
+                    "state",
+                    "overscrollEffect",
+                    "enabled",
+                    "reverseDirection",
+                    "flingBehavior",
+                    "interactionSource",
+                    "bringIntoViewSpec",
+                )
         }
     }
 
@@ -2825,13 +2622,10 @@
 
         rule.setContent {
             counter.value // just to trigger recomposition
-            materialized = currentComposer.materialize(
-                Modifier.scrollable(
-                    state,
-                    Orientation.Vertical,
-                    NoOpOverscrollEffect
+            materialized =
+                currentComposer.materialize(
+                    Modifier.scrollable(state, Orientation.Vertical, NoOpOverscrollEffect)
                 )
-            )
         }
 
         lateinit var first: Modifier
@@ -2855,29 +2649,16 @@
         rule.setContent {
             focusManager = LocalFocusManager.current
             Column {
-                Column(
-                    Modifier
-                        .size(10.dp)
-                        .verticalScroll(rememberScrollState())
-                ) {
-                    Box(
-                        Modifier
-                            .size(10.dp)
-                            .focusRequester(initialFocus)
-                            .focusable()
-                    )
+                Column(Modifier.size(10.dp).verticalScroll(rememberScrollState())) {
+                    Box(Modifier.size(10.dp).focusRequester(initialFocus).focusable())
                     Box(Modifier.size(10.dp))
                     Box(
-                        Modifier
-                            .size(10.dp)
+                        Modifier.size(10.dp)
                             .onFocusChanged { nextItemIsFocused = it.isFocused }
-                            .focusable())
+                            .focusable()
+                    )
                 }
-                Box(
-                    Modifier
-                        .size(10.dp)
-                        .focusable()
-                )
+                Box(Modifier.size(10.dp).focusable())
             }
         }
 
@@ -2892,27 +2673,23 @@
         // arrange
         val tracker = VelocityTracker()
         var velocity = Velocity.Zero
-        val capturingScrollConnection = object : NestedScrollConnection {
-            override suspend fun onPreFling(available: Velocity): Velocity {
-                velocity += available
-                return Velocity.Zero
+        val capturingScrollConnection =
+            object : NestedScrollConnection {
+                override suspend fun onPreFling(available: Velocity): Velocity {
+                    velocity += available
+                    return Velocity.Zero
+                }
             }
-        }
         val controller = ScrollableState { _ -> 0f }
 
         setScrollableContent {
-            Modifier
-                .pointerInput(Unit) {
-                    savePointerInputEvents(tracker, this)
-                }
+            Modifier.pointerInput(Unit) { savePointerInputEvents(tracker, this) }
                 .nestedScroll(capturingScrollConnection)
                 .scrollable(controller, Orientation.Vertical)
         }
 
         // act
-        rule.onNodeWithTag(scrollableBoxTag).performTouchInput {
-            swipeUp()
-        }
+        rule.onNodeWithTag(scrollableBoxTag).performTouchInput { swipeUp() }
 
         // assert
         rule.runOnIdle {
@@ -2923,9 +2700,7 @@
         velocity = Velocity.Zero
 
         // act
-        rule.onNodeWithTag(scrollableBoxTag).performTouchInput {
-            swipeDown()
-        }
+        rule.onNodeWithTag(scrollableBoxTag).performTouchInput { swipeDown() }
 
         // assert
         rule.runOnIdle {
@@ -2939,27 +2714,23 @@
         // arrange
         val tracker = VelocityTracker()
         var velocity = Velocity.Zero
-        val capturingScrollConnection = object : NestedScrollConnection {
-            override suspend fun onPreFling(available: Velocity): Velocity {
-                velocity += available
-                return Velocity.Zero
+        val capturingScrollConnection =
+            object : NestedScrollConnection {
+                override suspend fun onPreFling(available: Velocity): Velocity {
+                    velocity += available
+                    return Velocity.Zero
+                }
             }
-        }
         val controller = ScrollableState { _ -> 0f }
 
         setScrollableContent {
-            Modifier
-                .pointerInput(Unit) {
-                    savePointerInputEvents(tracker, this)
-                }
+            Modifier.pointerInput(Unit) { savePointerInputEvents(tracker, this) }
                 .nestedScroll(capturingScrollConnection)
                 .scrollable(controller, Orientation.Horizontal)
         }
 
         // act
-        rule.onNodeWithTag(scrollableBoxTag).performTouchInput {
-            swipeLeft()
-        }
+        rule.onNodeWithTag(scrollableBoxTag).performTouchInput { swipeLeft() }
 
         // assert
         rule.runOnIdle {
@@ -2970,9 +2741,7 @@
         velocity = Velocity.Zero
 
         // act
-        rule.onNodeWithTag(scrollableBoxTag).performTouchInput {
-            swipeRight()
-        }
+        rule.onNodeWithTag(scrollableBoxTag).performTouchInput { swipeRight() }
 
         // assert
         rule.runOnIdle {
@@ -2987,32 +2756,28 @@
         var velocity = Velocity.Zero
         val fullScreen = mutableStateOf(false)
         lateinit var scrollState: LazyListState
-        val capturingScrollConnection = object : NestedScrollConnection {
-            override suspend fun onPreFling(available: Velocity): Velocity {
-                velocity += available
-                return Velocity.Zero
+        val capturingScrollConnection =
+            object : NestedScrollConnection {
+                override suspend fun onPreFling(available: Velocity): Velocity {
+                    velocity += available
+                    return Velocity.Zero
+                }
             }
-        }
         rule.setContent {
             scrollState = rememberLazyListState()
             Column(modifier = Modifier.nestedScroll(capturingScrollConnection)) {
                 if (!fullScreen.value) {
-                    Box(
-                        modifier = Modifier
-                            .fillMaxWidth()
-                            .background(Color.Black)
-                            .height(400.dp)
-                    )
+                    Box(modifier = Modifier.fillMaxWidth().background(Color.Black).height(400.dp))
                 }
 
                 LazyColumn(state = scrollState) {
                     items(100) {
                         Box(
-                            modifier = Modifier
-                                .padding(10.dp)
-                                .background(Color.Red)
-                                .fillMaxWidth()
-                                .height(50.dp)
+                            modifier =
+                                Modifier.padding(10.dp)
+                                    .background(Color.Red)
+                                    .fillMaxWidth()
+                                    .height(50.dp)
                         )
                     }
                 }
@@ -3026,20 +2791,14 @@
         velocity = Velocity.Zero
         // Remove offset and restart scroll
         fullScreen.value = true
-        rule.runOnIdle {
-            runBlocking {
-                scrollState.scrollToItem(0)
-            }
-        }
+        rule.runOnIdle { runBlocking { scrollState.scrollToItem(0) } }
         rule.waitForIdle()
         // Register generated velocity without offset, should be larger as there was more
         // screen to cover.
         composeViewSwipeUp()
 
         // assert
-        rule.runOnIdle {
-            assertThat(abs(previousVelocity.y)).isNotEqualTo(abs(velocity.y))
-        }
+        rule.runOnIdle { assertThat(abs(previousVelocity.y)).isNotEqualTo(abs(velocity.y)) }
     }
 
     @Test
@@ -3057,11 +2816,7 @@
         }
 
         scope.launch {
-            controller.scroll {
-                defaultFlingBehavior?.let {
-                    with(it) { performFling(1000f) }
-                }
-            }
+            controller.scroll { defaultFlingBehavior?.let { with(it) { performFling(1000f) } } }
         }
 
         rule.runOnIdle {
@@ -3072,9 +2827,7 @@
         scope.launch {
             controller.scroll {
                 withContext(TestScrollMotionDurationScale(0f)) {
-                    defaultFlingBehavior?.let {
-                        with(it) { performFling(1000f) }
-                    }
+                    defaultFlingBehavior?.let { with(it) { performFling(1000f) } }
                 }
             }
         }
@@ -3097,37 +2850,33 @@
                 defaultFlingBehavior =
                     DefaultFlingBehavior(flingSpec, TestScrollMotionDurationScale(1f))
                 Box(
-                    modifier = Modifier
-                        .testTag(scrollableBoxTag)
-                        .size(100.dp)
-                        .scrollable(
-                            state = controller,
-                            orientation = Orientation.Horizontal,
-                            flingBehavior = defaultFlingBehavior
-                        )
+                    modifier =
+                        Modifier.testTag(scrollableBoxTag)
+                            .size(100.dp)
+                            .scrollable(
+                                state = controller,
+                                orientation = Orientation.Horizontal,
+                                flingBehavior = defaultFlingBehavior
+                            )
                 )
             } else {
                 defaultFlingBehavior =
                     DefaultFlingBehavior(flingSpec, TestScrollMotionDurationScale(0f))
                 Box(
-                    modifier = Modifier
-                        .testTag(scrollableBoxTag)
-                        .size(100.dp)
-                        .scrollable(
-                            state = controller,
-                            orientation = Orientation.Horizontal,
-                            flingBehavior = defaultFlingBehavior
-                        )
+                    modifier =
+                        Modifier.testTag(scrollableBoxTag)
+                            .size(100.dp)
+                            .scrollable(
+                                state = controller,
+                                orientation = Orientation.Horizontal,
+                                flingBehavior = defaultFlingBehavior
+                            )
                 )
             }
         }
 
         scope.launch {
-            controller.scroll {
-                defaultFlingBehavior?.let {
-                    with(it) { performFling(1000f) }
-                }
-            }
+            controller.scroll { defaultFlingBehavior?.let { with(it) { performFling(1000f) } } }
         }
 
         rule.runOnIdle {
@@ -3138,16 +2887,10 @@
         rule.waitForIdle()
 
         scope.launch {
-            controller.scroll {
-                defaultFlingBehavior?.let {
-                    with(it) { performFling(1000f) }
-                }
-            }
+            controller.scroll { defaultFlingBehavior?.let { with(it) { performFling(1000f) } } }
         }
 
-        rule.runOnIdle {
-            assertThat(defaultFlingBehavior?.lastAnimationCycleCount).isEqualTo(1)
-        }
+        rule.runOnIdle { assertThat(defaultFlingBehavior?.lastAnimationCycleCount).isEqualTo(1) }
     }
 
     @Test
@@ -3184,11 +2927,12 @@
             0f
         }
 
-        val nanGenerator = object : FlingBehavior {
-            override suspend fun ScrollScope.performFling(initialVelocity: Float): Float {
-                return scrollBy(Float.NaN)
+        val nanGenerator =
+            object : FlingBehavior {
+                override suspend fun ScrollScope.performFling(initialVelocity: Float): Float {
+                    return scrollBy(Float.NaN)
+                }
             }
-        }
 
         setScrollableContent {
             Modifier.scrollable(
@@ -3198,9 +2942,7 @@
             )
         }
 
-        rule.onNodeWithTag(scrollableBoxTag).performTouchInput {
-            swipeLeft()
-        }
+        rule.onNodeWithTag(scrollableBoxTag).performTouchInput { swipeLeft() }
     }
 
     @Test
@@ -3218,15 +2960,10 @@
 
     @Test
     fun scrollableState_checkLastScrollDirection() {
-        val controller = ScrollableState {
-            it
-        }
+        val controller = ScrollableState { it }
 
         setScrollableContent {
-            Modifier.scrollable(
-                orientation = Orientation.Horizontal,
-                state = controller
-            )
+            Modifier.scrollable(orientation = Orientation.Horizontal, state = controller)
         }
 
         // Assert both isLastScrollForward and isLastScrollBackward are false before any scroll
@@ -3238,17 +2975,13 @@
         lateinit var animateJob: Job
 
         rule.runOnIdle {
-            animateJob = scope.launch {
-                controller.animateScrollBy(
-                    100f,
-                    tween(1000)
-                )
-            }
+            animateJob = scope.launch { controller.animateScrollBy(100f, tween(1000)) }
         }
 
         rule.mainClock.advanceTimeBy(500)
 
-        // Assert isLastScrollForward is true during forward-scroll and isLastScrollBackward is false
+        // Assert isLastScrollForward is true during forward-scroll and isLastScrollBackward is
+        // false
         rule.runOnIdle {
             assertThat(controller.lastScrolledForward).isTrue()
             assertThat(controller.lastScrolledBackward).isFalse()
@@ -3264,17 +2997,13 @@
         }
 
         rule.runOnIdle {
-            animateJob = scope.launch {
-                controller.animateScrollBy(
-                    -100f,
-                    tween(1000)
-                )
-            }
+            animateJob = scope.launch { controller.animateScrollBy(-100f, tween(1000)) }
         }
 
         rule.mainClock.advanceTimeBy(500)
 
-        // Assert isLastScrollForward is false during backward-scroll and isLastScrollBackward is true
+        // Assert isLastScrollForward is false during backward-scroll and isLastScrollBackward is
+        // true
         rule.runOnIdle {
             assertThat(controller.lastScrolledForward).isFalse()
             assertThat(controller.lastScrolledBackward).isTrue()
@@ -3283,7 +3012,8 @@
         // Stop halfway through the animation
         animateJob.cancel()
 
-        // Assert isLastScrollForward is false after backward-scroll and isLastScrollBackward is true
+        // Assert isLastScrollForward is false after backward-scroll and isLastScrollBackward is
+        // true
         rule.runOnIdle {
             assertThat(controller.lastScrolledForward).isFalse()
             assertThat(controller.lastScrolledBackward).isTrue()
@@ -3295,38 +3025,40 @@
         var enabled by mutableStateOf(true)
         rule.setContentAndGetScope {
             Box(
-                modifier = Modifier
-                    .testTag(scrollableBoxTag)
-                    .size(100.dp)
-                    .scrollable(
-                        state = rememberScrollableState { it },
-                        orientation = Orientation.Horizontal,
-                        enabled = enabled
-                    )
+                modifier =
+                    Modifier.testTag(scrollableBoxTag)
+                        .size(100.dp)
+                        .scrollable(
+                            state = rememberScrollableState { it },
+                            orientation = Orientation.Horizontal,
+                            enabled = enabled
+                        )
             )
         }
 
-        rule.onNodeWithTag(scrollableBoxTag)
+        rule
+            .onNodeWithTag(scrollableBoxTag)
             .assert(SemanticsMatcher.keyIsDefined(SemanticsActions.ScrollBy))
-        rule.onNodeWithTag(scrollableBoxTag)
+        rule
+            .onNodeWithTag(scrollableBoxTag)
             .assert(SemanticsMatcher.keyIsDefined(SemanticsActions.ScrollByOffset))
 
-        rule.runOnIdle {
-            enabled = false
-        }
+        rule.runOnIdle { enabled = false }
 
-        rule.onNodeWithTag(scrollableBoxTag)
+        rule
+            .onNodeWithTag(scrollableBoxTag)
             .assert(SemanticsMatcher.keyNotDefined(SemanticsActions.ScrollBy))
-        rule.onNodeWithTag(scrollableBoxTag)
+        rule
+            .onNodeWithTag(scrollableBoxTag)
             .assert(SemanticsMatcher.keyNotDefined(SemanticsActions.ScrollByOffset))
 
-        rule.runOnIdle {
-            enabled = true
-        }
+        rule.runOnIdle { enabled = true }
 
-        rule.onNodeWithTag(scrollableBoxTag)
+        rule
+            .onNodeWithTag(scrollableBoxTag)
             .assert(SemanticsMatcher.keyIsDefined(SemanticsActions.ScrollBy))
-        rule.onNodeWithTag(scrollableBoxTag)
+        rule
+            .onNodeWithTag(scrollableBoxTag)
             .assert(SemanticsMatcher.keyIsDefined(SemanticsActions.ScrollByOffset))
     }
 
@@ -3334,12 +3066,7 @@
         rule.setContentAndGetScope {
             Box {
                 val scrollable = scrollableModifierFactory()
-                Box(
-                    modifier = Modifier
-                        .testTag(scrollableBoxTag)
-                        .size(100.dp)
-                        .then(scrollable)
-                )
+                Box(modifier = Modifier.testTag(scrollableBoxTag).size(100.dp).then(scrollable))
             }
         }
     }
@@ -3367,17 +3094,13 @@
                 while (true) {
                     var event: PointerInputChange? = awaitFirstDown()
                     while (event != null && !event.changedToUpIgnoreConsumed()) {
-                        val currentEvent = awaitPointerEvent().changes
-                            .firstOrNull()
+                        val currentEvent = awaitPointerEvent().changes.firstOrNull()
 
                         if (currentEvent != null && !currentEvent.changedToUpIgnoreConsumed()) {
                             currentEvent.historical.fastForEach {
                                 tracker.addPosition(it.uptimeMillis, it.position)
                             }
-                            tracker.addPosition(
-                                currentEvent.uptimeMillis,
-                                currentEvent.position
-                            )
+                            tracker.addPosition(currentEvent.uptimeMillis, currentEvent.position)
                         }
 
                         event = currentEvent
@@ -3400,17 +3123,13 @@
                     var event = awaitFirstDown()
                     tracker.addPosition(event.uptimeMillis, event.position)
                     while (!event.changedToUpIgnoreConsumed()) {
-                        val currentEvent = awaitPointerEvent().changes
-                            .firstOrNull()
+                        val currentEvent = awaitPointerEvent().changes.firstOrNull()
 
                         if (currentEvent != null) {
                             currentEvent.historical.fastForEach {
                                 tracker.addPosition(it.uptimeMillis, it.position)
                             }
-                            tracker.addPosition(
-                                currentEvent.uptimeMillis,
-                                currentEvent.position
-                            )
+                            tracker.addPosition(currentEvent.uptimeMillis, currentEvent.position)
                             event = currentEvent
                         }
                     }
@@ -3422,52 +3141,29 @@
 
 internal fun composeViewSwipeUp() {
     onView(allOf(instanceOf(AbstractComposeView::class.java)))
-        .perform(
-            espressoSwipe(
-                GeneralLocation.CENTER,
-                GeneralLocation.TOP_CENTER
-            )
-        )
+        .perform(espressoSwipe(GeneralLocation.CENTER, GeneralLocation.TOP_CENTER))
 }
 
 internal fun composeViewSwipeDown() {
     onView(allOf(instanceOf(AbstractComposeView::class.java)))
-        .perform(
-            espressoSwipe(
-                GeneralLocation.CENTER,
-                GeneralLocation.BOTTOM_CENTER
-            )
-        )
+        .perform(espressoSwipe(GeneralLocation.CENTER, GeneralLocation.BOTTOM_CENTER))
 }
 
 internal fun composeViewSwipeLeft() {
     onView(allOf(instanceOf(AbstractComposeView::class.java)))
-        .perform(
-            espressoSwipe(
-                GeneralLocation.CENTER,
-                GeneralLocation.CENTER_LEFT
-            )
-        )
+        .perform(espressoSwipe(GeneralLocation.CENTER, GeneralLocation.CENTER_LEFT))
 }
 
 internal fun composeViewSwipeRight() {
     onView(allOf(instanceOf(AbstractComposeView::class.java)))
-        .perform(
-            espressoSwipe(
-                GeneralLocation.CENTER,
-                GeneralLocation.CENTER_RIGHT
-            )
-        )
+        .perform(espressoSwipe(GeneralLocation.CENTER, GeneralLocation.CENTER_RIGHT))
 }
 
 private fun espressoSwipe(
     start: CoordinatesProvider,
     end: CoordinatesProvider
 ): GeneralSwipeAction {
-    return GeneralSwipeAction(
-        Swipe.FAST, start, end,
-        Press.FINGER
-    )
+    return GeneralSwipeAction(Swipe.FAST, start, end, Press.FINGER)
 }
 
 internal class TestScrollMotionDurationScale(override val scaleFactor: Float) : MotionDurationScale
@@ -3499,8 +3195,7 @@
 }
 
 private class ScrollableContainerReaderNode(var hasScrollableBlock: (Boolean) -> Unit) :
-    Modifier.Node(),
-    TraversableNode {
+    Modifier.Node(), TraversableNode {
     override val traverseKey: Any = TraverseKey
 
     override fun onAttach() {
diff --git a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/StretchOverscrollTest.kt b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/StretchOverscrollTest.kt
index 3feaf98..d2daef8 100644
--- a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/StretchOverscrollTest.kt
+++ b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/StretchOverscrollTest.kt
@@ -49,8 +49,7 @@
 @SdkSuppress(minSdkVersion = Build.VERSION_CODES.S)
 @RunWith(AndroidJUnit4::class)
 class StretchOverscrollTest {
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
     @get:Rule
     val animationScaleRule: AnimationDurationScaleRule =
@@ -223,8 +222,7 @@
             WithTouchSlop(touchSlop = 0f) {
                 val overscroll = ScrollableDefaults.overscrollEffect()
                 Box(
-                    Modifier
-                        .testTag(OverscrollBox)
+                    Modifier.testTag(OverscrollBox)
                         .size(100.dp)
                         .scrollable(
                             state = state,
@@ -239,9 +237,7 @@
     }
 }
 
-/**
- * Returns a default [ScrollableState] with a [scrollPosition] clamped between 0f and 1000f.
- */
+/** Returns a default [ScrollableState] with a [scrollPosition] clamped between 0f and 1000f. */
 private class TestScrollableState : ScrollableState {
     var scrollPosition by mutableStateOf(0f)
         private set
diff --git a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/SystemGestureExclusionTest.kt b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/SystemGestureExclusionTest.kt
index bd9753d..b931b75 100644
--- a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/SystemGestureExclusionTest.kt
+++ b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/SystemGestureExclusionTest.kt
@@ -43,25 +43,20 @@
 import org.junit.Test
 import org.junit.runner.RunWith
 
-/**
- * Testing the support for Android Views in Compose UI.
- */
+/** Testing the support for Android Views in Compose UI. */
 @MediumTest
 @RunWith(AndroidJUnit4::class)
 class SystemGestureExclusionTest {
-    @get:Rule
-    val rule = createAndroidComposeRule<TestActivity>()
+    @get:Rule val rule = createAndroidComposeRule<TestActivity>()
 
     /**
-     * Make sure that when an exclusion rect using the bounds of a layout is used, the
-     * gesture should not be consumed by the system.
+     * Make sure that when an exclusion rect using the bounds of a layout is used, the gesture
+     * should not be consumed by the system.
      */
     @SdkSuppress(minSdkVersion = Build.VERSION_CODES.Q)
     @Test
     fun excludeBounds() {
-        val composeView = setComposeContent {
-            Box(Modifier.size(50.dp).systemGestureExclusion())
-        }
+        val composeView = setComposeContent { Box(Modifier.size(50.dp).systemGestureExclusion()) }
         rule.runOnIdle {
             assertThat(composeView.systemGestureExclusionRects).isNotNull()
             assertThat(composeView.systemGestureExclusionRects).hasSize(1)
@@ -72,16 +67,14 @@
     }
 
     /**
-     * Make sure that when an exclusion rect using a supplied rect, the
-     * gesture should not be consumed by the system.
+     * Make sure that when an exclusion rect using a supplied rect, the gesture should not be
+     * consumed by the system.
      */
     @SdkSuppress(minSdkVersion = Build.VERSION_CODES.Q)
     @Test
     fun excludeRect() {
         val composeView = setComposeContent {
-            Box(Modifier.size(50.dp).systemGestureExclusion {
-                Rect(0f, 0f, 10f, 20f)
-            })
+            Box(Modifier.size(50.dp).systemGestureExclusion { Rect(0f, 0f, 10f, 20f) })
         }
         rule.runOnIdle {
             assertThat(composeView.systemGestureExclusionRects).isNotNull()
@@ -108,9 +101,7 @@
             assertThat(composeView.systemGestureExclusionRects[0]).isEqualTo(expectedRect)
         }
         setExclusion = false
-        rule.runOnIdle {
-            assertThat(composeView.systemGestureExclusionRects).isEmpty()
-        }
+        rule.runOnIdle { assertThat(composeView.systemGestureExclusionRects).isEmpty() }
     }
 
     @SdkSuppress(minSdkVersion = Build.VERSION_CODES.Q)
@@ -118,9 +109,9 @@
     fun removeWhenModifierRemovedRect() {
         var setExclusion by mutableStateOf(true)
         val composeView = setComposeContent {
-            val modifier = if (setExclusion) Modifier.systemGestureExclusion {
-                Rect(0f, 0f, 10f, 20f)
-            } else Modifier
+            val modifier =
+                if (setExclusion) Modifier.systemGestureExclusion { Rect(0f, 0f, 10f, 20f) }
+                else Modifier
             Box(Modifier.size(50.dp).then(modifier))
         }
         rule.runOnUiThread {
@@ -131,9 +122,7 @@
             assertThat(composeView.systemGestureExclusionRects[0]).isEqualTo(expectedRect)
         }
         setExclusion = false
-        rule.runOnIdle {
-            assertThat(composeView.systemGestureExclusionRects).isEmpty()
-        }
+        rule.runOnIdle { assertThat(composeView.systemGestureExclusionRects).isEmpty() }
     }
 
     @SdkSuppress(minSdkVersion = Build.VERSION_CODES.Q)
@@ -181,9 +170,7 @@
                 Box(Modifier.size(50.dp).systemGestureExclusion())
             }
         }
-        rule.runOnIdle {
-            setExclusion = false
-        }
+        rule.runOnIdle { setExclusion = false }
         rule.runOnIdle {
             assertThat(composeView.systemGestureExclusionRects).hasSize(1)
             val rect = composeView.systemGestureExclusionRects[0]
@@ -197,18 +184,13 @@
         var useEmpty by mutableStateOf(false)
         val composeView = setComposeContent {
             Column(Modifier.wrapContentSize()) {
-                val lambda: (LayoutCoordinates) -> Rect = if (useEmpty) { _ ->
-                    Rect.Zero
-                } else { _ ->
-                    Rect(0f, 0f, 10f, 10f)
-                }
+                val lambda: (LayoutCoordinates) -> Rect =
+                    if (useEmpty) { _ -> Rect.Zero } else { _ -> Rect(0f, 0f, 10f, 10f) }
                 Box(Modifier.size(50.dp).systemGestureExclusion(lambda))
                 Box(Modifier.size(50.dp).systemGestureExclusion())
             }
         }
-        rule.runOnIdle {
-            useEmpty = true
-        }
+        rule.runOnIdle { useEmpty = true }
         rule.runOnIdle {
             assertThat(composeView.systemGestureExclusionRects).hasSize(1)
             val rect = composeView.systemGestureExclusionRects[0]
diff --git a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/TransformableTest.kt b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/TransformableTest.kt
index 7883b43..6586dfc 100644
--- a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/TransformableTest.kt
+++ b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/TransformableTest.kt
@@ -68,9 +68,7 @@
 @MediumTest
 @RunWith(AndroidJUnit4::class)
 class TransformableTest {
-    @Suppress("DEPRECATION")
-    @get:Rule
-    val rule = createComposeRule()
+    @Suppress("DEPRECATION") @get:Rule val rule = createComposeRule()
 
     private lateinit var scope: CoroutineScope
 
@@ -98,9 +96,7 @@
 
         setTransformableContent {
             Modifier.transformable(
-                state = rememberTransformableState { zoom, _, _ ->
-                    cumulativeScale *= zoom
-                }
+                state = rememberTransformableState { zoom, _, _ -> cumulativeScale *= zoom }
             )
         }
 
@@ -131,9 +127,7 @@
         setTransformableContent {
             touchSlop = LocalViewConfiguration.current.touchSlop
             Modifier.transformable(
-                state = rememberTransformableState { _, pan, _ ->
-                    cumulativePan += pan
-                }
+                state = rememberTransformableState { _, pan, _ -> cumulativePan += pan }
             )
         }
 
@@ -161,9 +155,7 @@
         setTransformableContent {
             touchSlop = LocalViewConfiguration.current.touchSlop
             Modifier.transformable(
-                state = rememberTransformableState { _, pan, _ ->
-                    cumulativePan += pan
-                }
+                state = rememberTransformableState { _, pan, _ -> cumulativePan += pan }
             )
         }
 
@@ -186,16 +178,11 @@
         var cumulativePan = Offset.Zero
         var touchSlop = 0f
         val canStartPanState = mutableStateOf(false)
-        val state = TransformableState { _, pan, _ ->
-            cumulativePan += pan
-        }
+        val state = TransformableState { _, pan, _ -> cumulativePan += pan }
 
         setTransformableContent {
             touchSlop = LocalViewConfiguration.current.touchSlop
-            Modifier.transformable(
-                state = state,
-                canPan = { canStartPanState.value }
-            )
+            Modifier.transformable(state = state, canPan = { canStartPanState.value })
         }
 
         val expected = Offset(50f + touchSlop, 0f)
@@ -221,7 +208,8 @@
 
         rule.runOnIdle {
             assertWithMessage("Should have panned the amount equal to finger move")
-                .that(cumulativePan).isEqualTo(expected)
+                .that(cumulativePan)
+                .isEqualTo(expected)
         }
     }
 
@@ -233,20 +221,15 @@
 
         rule.setContent {
             touchSlop = LocalViewConfiguration.current.touchSlop
-            Column(
-                Modifier
-                    .size(100.dp)
-                    .testTag(TEST_TAG)
-                    .verticalScroll(scrollState)
-            ) {
+            Column(Modifier.size(100.dp).testTag(TEST_TAG).verticalScroll(scrollState)) {
                 repeat(3) {
                     Box(
-                        Modifier
-                            .size(100.dp)
+                        Modifier.size(100.dp)
                             .transformable(
-                                state = rememberTransformableState { _, _, _ ->
-                                    // no-op
-                                },
+                                state =
+                                    rememberTransformableState { _, _, _ ->
+                                        // no-op
+                                    },
                                 canPan = { false }
                             )
                     )
@@ -262,9 +245,7 @@
             up(1)
         }
 
-        rule.runOnIdle {
-            assertThat(scrollState.value).isEqualTo(50)
-        }
+        rule.runOnIdle { assertThat(scrollState.value).isEqualTo(50) }
     }
 
     @OptIn(ExperimentalFoundationApi::class)
@@ -273,19 +254,15 @@
         var lastCanPanOffset = Offset.Zero
 
         rule.setContent {
-            Column(
-                Modifier
-                    .size(100.dp)
-                    .testTag(TEST_TAG)
-            ) {
+            Column(Modifier.size(100.dp).testTag(TEST_TAG)) {
                 repeat(3) {
                     Box(
-                        Modifier
-                            .size(100.dp)
+                        Modifier.size(100.dp)
                             .transformable(
-                                state = rememberTransformableState { _, _, _ ->
-                                    // no-op
-                                },
+                                state =
+                                    rememberTransformableState { _, _, _ ->
+                                        // no-op
+                                    },
                                 canPan = { offset ->
                                     lastCanPanOffset = offset
                                     false
@@ -303,23 +280,15 @@
             moveBy(1, expected)
         }
 
-        rule.runOnIdle {
-            assertThat(lastCanPanOffset).isEqualTo(expected)
-        }
+        rule.runOnIdle { assertThat(lastCanPanOffset).isEqualTo(expected) }
 
         val expected2 = Offset(30f, 0f)
 
-        rule.onNodeWithTag(TEST_TAG).performTouchInput {
-            moveBy(1, expected2)
-        }
+        rule.onNodeWithTag(TEST_TAG).performTouchInput { moveBy(1, expected2) }
 
-        rule.runOnIdle {
-            assertThat(lastCanPanOffset).isEqualTo(expected2)
-        }
+        rule.runOnIdle { assertThat(lastCanPanOffset).isEqualTo(expected2) }
 
-        rule.onNodeWithTag(TEST_TAG).performTouchInput {
-            up(1)
-        }
+        rule.onNodeWithTag(TEST_TAG).performTouchInput { up(1) }
     }
 
     @Test
@@ -328,9 +297,8 @@
 
         setTransformableContent {
             Modifier.transformable(
-                state = rememberTransformableState { _, _, rotation ->
-                    cumulativeRotation += rotation
-                }
+                state =
+                    rememberTransformableState { _, _, rotation -> cumulativeRotation += rotation }
             )
         }
 
@@ -357,9 +325,8 @@
             touchSlop = LocalViewConfiguration.current.touchSlop
             Modifier.transformable(
                 lockRotationOnZoomPan = rotationLock.value,
-                state = rememberTransformableState { _, _, rotation ->
-                    cumulativeRotation += rotation
-                }
+                state =
+                    rememberTransformableState { _, _, rotation -> cumulativeRotation += rotation }
             )
         }
 
@@ -413,9 +380,7 @@
 
         setTransformableContent {
             Modifier.transformable(
-                state = rememberTransformableState { zoom, _, _ ->
-                    cumulativeScale *= zoom
-                }
+                state = rememberTransformableState { zoom, _, _ -> cumulativeScale *= zoom }
             )
         }
 
@@ -443,9 +408,7 @@
     @Test
     fun transformable_startStop_notify() {
         var cumulativeScale = 1.0f
-        val state = TransformableState { zoom, _, _ ->
-            cumulativeScale *= zoom
-        }
+        val state = TransformableState { zoom, _, _ -> cumulativeScale *= zoom }
         var slop: Float = 0f
 
         setTransformableContent {
@@ -453,9 +416,7 @@
             Modifier.transformable(state = state)
         }
 
-        rule.runOnIdle {
-            assertThat(state.isTransformInProgress).isEqualTo(false)
-        }
+        rule.runOnIdle { assertThat(state.isTransformInProgress).isEqualTo(false) }
 
         rule.onNodeWithTag(TEST_TAG).performTouchInput {
             down(pointerId = 1, center)
@@ -470,9 +431,7 @@
             up(pointerId = 2)
         }
 
-        rule.runOnIdle {
-            assertThat(state.isTransformInProgress).isEqualTo(false)
-        }
+        rule.runOnIdle { assertThat(state.isTransformInProgress).isEqualTo(false) }
     }
 
     @Test
@@ -483,9 +442,7 @@
         setTransformableContent {
             Modifier.transformable(
                 enabled = enabled.value,
-                state = rememberTransformableState { zoom, _, _ ->
-                    cumulativeScale *= zoom
-                }
+                state = rememberTransformableState { zoom, _, _ -> cumulativeScale *= zoom }
             )
         }
 
@@ -503,10 +460,13 @@
             )
         }
 
-        val prevScale = rule.runOnIdle {
-            assertWithMessage("Should have scaled at least 4x").that(cumulativeScale).isAtLeast(4f)
-            cumulativeScale
-        }
+        val prevScale =
+            rule.runOnIdle {
+                assertWithMessage("Should have scaled at least 4x")
+                    .that(cumulativeScale)
+                    .isAtLeast(4f)
+                cumulativeScale
+            }
         enabled.value = false
         rule.waitForIdle()
 
@@ -532,113 +492,124 @@
     }
 
     @Test
-    fun transformable_animateTo_zoom() = runBlocking(AutoTestFrameClock()) {
-        rule.mainClock.autoAdvance = false
-        var cumulativeScale = 1.0f
-        var callbackCount = 0
-        val state = TransformableState { zoom, _, _ ->
-            cumulativeScale *= zoom
-            callbackCount += 1
+    fun transformable_animateTo_zoom() =
+        runBlocking(AutoTestFrameClock()) {
+            rule.mainClock.autoAdvance = false
+            var cumulativeScale = 1.0f
+            var callbackCount = 0
+            val state = TransformableState { zoom, _, _ ->
+                cumulativeScale *= zoom
+                callbackCount += 1
+            }
+            setTransformableContent { Modifier.transformable(state) }
+
+            state.animateZoomBy(4f)
+
+            rule.mainClock.advanceTimeByFrame()
+
+            rule.runOnIdle {
+                assertWithMessage("Zoom should have been smooth").that(callbackCount).isAtLeast(1)
+            }
+
+            rule.mainClock.advanceTimeByFrame()
+
+            rule.runOnIdle {
+                assertWithMessage("Zoom should have been smooth").that(callbackCount).isAtLeast(2)
+            }
+
+            rule.mainClock.advanceTimeBy(milliseconds = 100000)
+
+            rule.runOnIdle {
+                assertWithMessage("Zoom should have been smooth").that(callbackCount).isAtLeast(3)
+                // Include a bit of tolerance for floating point discrepancies.
+                assertWithMessage("Should have scaled ~4x").that(cumulativeScale).isAtLeast(3.9f)
+            }
         }
-        setTransformableContent {
-            Modifier.transformable(state)
-        }
-
-        state.animateZoomBy(4f)
-
-        rule.mainClock.advanceTimeByFrame()
-
-        rule.runOnIdle {
-            assertWithMessage("Zoom should have been smooth").that(callbackCount).isAtLeast(1)
-        }
-
-        rule.mainClock.advanceTimeByFrame()
-
-        rule.runOnIdle {
-            assertWithMessage("Zoom should have been smooth").that(callbackCount).isAtLeast(2)
-        }
-
-        rule.mainClock.advanceTimeBy(milliseconds = 100000)
-
-        rule.runOnIdle {
-            assertWithMessage("Zoom should have been smooth").that(callbackCount).isAtLeast(3)
-            // Include a bit of tolerance for floating point discrepancies.
-            assertWithMessage("Should have scaled ~4x").that(cumulativeScale).isAtLeast(3.9f)
-        }
-    }
 
     @Test
-    fun transformable_animateTo_rotate() = runBlocking(AutoTestFrameClock()) {
-        rule.mainClock.autoAdvance = false
-        var totalRotation = 0f
-        var callbackCount = 0
-        val state = TransformableState { _, _, rotation ->
-            totalRotation += rotation
-            callbackCount += 1
+    fun transformable_animateTo_rotate() =
+        runBlocking(AutoTestFrameClock()) {
+            rule.mainClock.autoAdvance = false
+            var totalRotation = 0f
+            var callbackCount = 0
+            val state = TransformableState { _, _, rotation ->
+                totalRotation += rotation
+                callbackCount += 1
+            }
+            setTransformableContent { Modifier.transformable(state) }
+
+            state.animateRotateBy(180f)
+
+            rule.mainClock.advanceTimeByFrame()
+
+            rule.runOnIdle {
+                assertWithMessage("Rotation should have been smooth")
+                    .that(callbackCount)
+                    .isAtLeast(1)
+            }
+
+            rule.mainClock.advanceTimeByFrame()
+
+            rule.runOnIdle {
+                assertWithMessage("Rotation should have been smooth")
+                    .that(callbackCount)
+                    .isAtLeast(2)
+            }
+
+            rule.mainClock.advanceTimeBy(milliseconds = 100000)
+
+            rule.runOnIdle {
+                assertWithMessage("Rotation should have been smooth")
+                    .that(callbackCount)
+                    .isAtLeast(3)
+                // Include a bit of tolerance for floating point discrepancies.
+                assertWithMessage("Should have rotated 180").that(totalRotation).isAtLeast(179f)
+            }
         }
-        setTransformableContent {
-            Modifier.transformable(state)
-        }
-
-        state.animateRotateBy(180f)
-
-        rule.mainClock.advanceTimeByFrame()
-
-        rule.runOnIdle {
-            assertWithMessage("Rotation should have been smooth").that(callbackCount).isAtLeast(1)
-        }
-
-        rule.mainClock.advanceTimeByFrame()
-
-        rule.runOnIdle {
-            assertWithMessage("Rotation should have been smooth").that(callbackCount).isAtLeast(2)
-        }
-
-        rule.mainClock.advanceTimeBy(milliseconds = 100000)
-
-        rule.runOnIdle {
-            assertWithMessage("Rotation should have been smooth").that(callbackCount).isAtLeast(3)
-            // Include a bit of tolerance for floating point discrepancies.
-            assertWithMessage("Should have rotated 180").that(totalRotation).isAtLeast(179f)
-        }
-    }
 
     @Test
-    fun transformable_animateTo_pan() = runBlocking(AutoTestFrameClock()) {
-        rule.mainClock.autoAdvance = false
-        var totalPan = Offset.Zero
-        var callbackCount = 0
-        val state = TransformableState { _, pan, _ ->
-            totalPan += pan
-            callbackCount += 1
+    fun transformable_animateTo_pan() =
+        runBlocking(AutoTestFrameClock()) {
+            rule.mainClock.autoAdvance = false
+            var totalPan = Offset.Zero
+            var callbackCount = 0
+            val state = TransformableState { _, pan, _ ->
+                totalPan += pan
+                callbackCount += 1
+            }
+            setTransformableContent { Modifier.transformable(state) }
+
+            val expected = Offset(100f, 80f)
+            state.animatePanBy(expected)
+
+            rule.mainClock.advanceTimeByFrame()
+
+            rule.runOnIdle {
+                assertWithMessage("Panning should have been smooth")
+                    .that(callbackCount)
+                    .isAtLeast(1)
+            }
+
+            rule.mainClock.advanceTimeByFrame()
+
+            rule.runOnIdle {
+                assertWithMessage("Panning should have been smooth")
+                    .that(callbackCount)
+                    .isAtLeast(2)
+            }
+
+            rule.mainClock.advanceTimeBy(milliseconds = 100000)
+
+            rule.runOnIdle {
+                assertWithMessage("Panning should have been smooth")
+                    .that(callbackCount)
+                    .isAtLeast(3)
+                // Include a bit of tolerance for floating point discrepancies.
+                assertWithMessage("Should have panned to 100 / 80")
+                    .that(totalPan)
+                    .isEqualTo(expected)
+            }
         }
-        setTransformableContent {
-            Modifier.transformable(state)
-        }
-
-        val expected = Offset(100f, 80f)
-        state.animatePanBy(expected)
-
-        rule.mainClock.advanceTimeByFrame()
-
-        rule.runOnIdle {
-            assertWithMessage("Panning should have been smooth").that(callbackCount).isAtLeast(1)
-        }
-
-        rule.mainClock.advanceTimeByFrame()
-
-        rule.runOnIdle {
-            assertWithMessage("Panning should have been smooth").that(callbackCount).isAtLeast(2)
-        }
-
-        rule.mainClock.advanceTimeBy(milliseconds = 100000)
-
-        rule.runOnIdle {
-            assertWithMessage("Panning should have been smooth").that(callbackCount).isAtLeast(3)
-            // Include a bit of tolerance for floating point discrepancies.
-            assertWithMessage("Should have panned to 100 / 80").that(totalPan).isEqualTo(expected)
-        }
-    }
 
     @Test
     fun transformable_snapTo_zoom() = runBlocking {
@@ -648,9 +619,7 @@
             cumulativeScale *= zoom
             callbackCount += 1
         }
-        setTransformableContent {
-            Modifier.transformable(state)
-        }
+        setTransformableContent { Modifier.transformable(state) }
 
         state.zoomBy(4f)
 
@@ -667,9 +636,7 @@
             totalRotation += rotation
             callbackCount += 1
         }
-        setTransformableContent {
-            Modifier.transformable(state)
-        }
+        setTransformableContent { Modifier.transformable(state) }
 
         state.rotateBy(180f)
 
@@ -686,9 +653,7 @@
             totalPan += pan
             callbackCount += 1
         }
-        setTransformableContent {
-            Modifier.transformable(state)
-        }
+        setTransformableContent { Modifier.transformable(state) }
 
         val expected = Offset(100f, 80f)
         state.panBy(expected)
@@ -699,71 +664,68 @@
     }
 
     @Test
-    fun transformable_stopTransformations() = runBlocking(AutoTestFrameClock()) {
-        rule.mainClock.autoAdvance = false
-        var totalRotation = 0f
-        var callbackCount = 0
-        val state = TransformableState { _, _, rotation ->
-            totalRotation += rotation
-            callbackCount += 1
+    fun transformable_stopTransformations() =
+        runBlocking(AutoTestFrameClock()) {
+            rule.mainClock.autoAdvance = false
+            var totalRotation = 0f
+            var callbackCount = 0
+            val state = TransformableState { _, _, rotation ->
+                totalRotation += rotation
+                callbackCount += 1
+            }
+            setTransformableContent { Modifier.transformable(state) }
+
+            state.animateRotateBy(180f)
+
+            rule.mainClock.advanceTimeByFrame()
+
+            rule.runOnIdle {
+                assertWithMessage("Rotation should have been smooth")
+                    .that(callbackCount)
+                    .isAtLeast(1)
+            }
+
+            rule.mainClock.advanceTimeByFrame()
+
+            val lastCallbackCount =
+                rule.runOnIdle {
+                    assertWithMessage("Rotation should have been smooth")
+                        .that(callbackCount)
+                        .isAtLeast(2)
+                    callbackCount
+                }
+
+            state.stopTransformation()
+
+            rule.mainClock.advanceTimeBy(milliseconds = 100000)
+
+            rule.runOnIdle {
+                assertWithMessage("Rotation should have been stopped")
+                    .that(callbackCount)
+                    .isEqualTo(lastCallbackCount)
+            }
         }
-        setTransformableContent {
-            Modifier.transformable(state)
-        }
-
-        state.animateRotateBy(180f)
-
-        rule.mainClock.advanceTimeByFrame()
-
-        rule.runOnIdle {
-            assertWithMessage("Rotation should have been smooth").that(callbackCount).isAtLeast(1)
-        }
-
-        rule.mainClock.advanceTimeByFrame()
-
-        val lastCallbackCount = rule.runOnIdle {
-            assertWithMessage("Rotation should have been smooth").that(callbackCount).isAtLeast(2)
-            callbackCount
-        }
-
-        state.stopTransformation()
-
-        rule.mainClock.advanceTimeBy(milliseconds = 100000)
-
-        rule.runOnIdle {
-            assertWithMessage("Rotation should have been stopped").that(callbackCount)
-                .isEqualTo(lastCallbackCount)
-        }
-    }
 
     @Test
     fun transformable_animateCancelledUpdatesIsTransformInProgress() {
         rule.mainClock.autoAdvance = false
         val state = TransformableState { _, _, _ -> }
-        setTransformableContent {
-            Modifier.transformable(state)
-        }
+        setTransformableContent { Modifier.transformable(state) }
 
         lateinit var animateJob: Job
 
         rule.runOnIdle {
             assertThat(state.isTransformInProgress).isFalse()
-            animateJob = scope.launch {
-                state.animateZoomBy(4f, tween(1000))
-            }
+            animateJob = scope.launch { state.animateZoomBy(4f, tween(1000)) }
         }
 
         rule.mainClock.advanceTimeBy(500)
 
-        rule.runOnIdle {
-            assertThat(state.isTransformInProgress).isTrue()
-        }
+        rule.runOnIdle { assertThat(state.isTransformInProgress).isTrue() }
 
         animateJob.cancel()
 
-        rule.runOnIdle {
-            assertThat(state.isTransformInProgress).isFalse()
-        }
+        rule.runOnIdle { assertThat(state.isTransformInProgress).isFalse() }
     }
 
     @Test
@@ -773,23 +735,14 @@
             val modifier = Modifier.transformable(state) as InspectableValue
             assertThat(modifier.nameFallback).isEqualTo("transformable")
             assertThat(modifier.valueOverride).isNull()
-            assertThat(modifier.inspectableElements.map { it.name }.asIterable()).containsExactly(
-                "state",
-                "lockRotationOnZoomPan",
-                "enabled",
-                "canPan"
-            )
+            assertThat(modifier.inspectableElements.map { it.name }.asIterable())
+                .containsExactly("state", "lockRotationOnZoomPan", "enabled", "canPan")
         }
     }
 
     private fun setTransformableContent(getModifier: @Composable () -> Modifier) {
         rule.setContentAndGetScope {
-            Box(
-                Modifier
-                    .size(600.dp)
-                    .testTag(TEST_TAG)
-                    .then(getModifier())
-            )
+            Box(Modifier.size(600.dp).testTag(TEST_TAG).then(getModifier()))
         }
     }
 }
diff --git a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/anchoredDraggable/AnchoredDraggableGestureTest.kt b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/anchoredDraggable/AnchoredDraggableGestureTest.kt
index 9d7e078..f15cb51 100644
--- a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/anchoredDraggable/AnchoredDraggableGestureTest.kt
+++ b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/anchoredDraggable/AnchoredDraggableGestureTest.kt
@@ -78,21 +78,21 @@
 @OptIn(ExperimentalFoundationApi::class)
 class AnchoredDraggableGestureTest {
 
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
     private val AnchoredDraggableTestTag = "dragbox"
     private val AnchoredDraggableBoxSize = 200.dp
 
     @Test
     fun anchoredDraggable_swipe_horizontal() {
-        val state = AnchoredDraggableState(
-            initialValue = A,
-            positionalThreshold = DefaultPositionalThreshold,
-            velocityThreshold = DefaultVelocityThreshold,
-            snapAnimationSpec = tween(),
-            decayAnimationSpec = DefaultDecayAnimationSpec
-        )
+        val state =
+            AnchoredDraggableState(
+                initialValue = A,
+                positionalThreshold = DefaultPositionalThreshold,
+                velocityThreshold = DefaultVelocityThreshold,
+                snapAnimationSpec = tween(),
+                decayAnimationSpec = DefaultDecayAnimationSpec
+            )
         val anchors = DraggableAnchors {
             A at 0f
             B at AnchoredDraggableBoxSize.value / 2f
@@ -105,20 +105,13 @@
                 WithTouchSlop(0f) {
                     Box(Modifier.fillMaxSize()) {
                         Box(
-                            Modifier
-                                .requiredSize(AnchoredDraggableBoxSize)
+                            Modifier.requiredSize(AnchoredDraggableBoxSize)
                                 .testTag(AnchoredDraggableTestTag)
                                 .anchoredDraggable(
                                     state = state,
                                     orientation = Orientation.Horizontal
                                 )
-                                .offset {
-                                    IntOffset(
-                                        state
-                                            .requireOffset()
-                                            .roundToInt(), 0
-                                    )
-                                }
+                                .offset { IntOffset(state.requireOffset().roundToInt(), 0) }
                                 .background(Color.Red)
                         )
                     }
@@ -128,28 +121,32 @@
 
         assertThat(state.currentValue).isEqualTo(A)
 
-        rule.onNodeWithTag(AnchoredDraggableTestTag)
-            .performTouchInput { swipeRight(endX = right / 2) }
+        rule.onNodeWithTag(AnchoredDraggableTestTag).performTouchInput {
+            swipeRight(endX = right / 2)
+        }
         rule.waitForIdle()
 
         assertThat(state.currentValue).isEqualTo(B)
         assertThat(state.offset).isEqualTo(anchors.positionOf(B))
 
-        rule.onNodeWithTag(AnchoredDraggableTestTag)
-            .performTouchInput { swipeRight(startX = right / 2, endX = right) }
+        rule.onNodeWithTag(AnchoredDraggableTestTag).performTouchInput {
+            swipeRight(startX = right / 2, endX = right)
+        }
         rule.waitForIdle()
         assertThat(state.currentValue).isEqualTo(C)
         assertThat(state.offset).isEqualTo(anchors.positionOf(C))
 
-        rule.onNodeWithTag(AnchoredDraggableTestTag)
-            .performTouchInput { swipeLeft(endX = right / 2) }
+        rule.onNodeWithTag(AnchoredDraggableTestTag).performTouchInput {
+            swipeLeft(endX = right / 2)
+        }
         rule.waitForIdle()
 
         assertThat(state.currentValue).isEqualTo(B)
         assertThat(state.offset).isEqualTo(anchors.positionOf(B))
 
-        rule.onNodeWithTag(AnchoredDraggableTestTag)
-            .performTouchInput { swipeLeft(startX = right / 2) }
+        rule.onNodeWithTag(AnchoredDraggableTestTag).performTouchInput {
+            swipeLeft(startX = right / 2)
+        }
         rule.waitForIdle()
 
         assertThat(state.currentValue).isEqualTo(A)
@@ -158,13 +155,14 @@
 
     @Test
     fun anchoredDraggable_swipe_vertical() {
-        val state = AnchoredDraggableState(
-            initialValue = A,
-            positionalThreshold = DefaultPositionalThreshold,
-            velocityThreshold = DefaultVelocityThreshold,
-            snapAnimationSpec = tween(),
-            decayAnimationSpec = DefaultDecayAnimationSpec
-        )
+        val state =
+            AnchoredDraggableState(
+                initialValue = A,
+                positionalThreshold = DefaultPositionalThreshold,
+                velocityThreshold = DefaultVelocityThreshold,
+                snapAnimationSpec = tween(),
+                decayAnimationSpec = DefaultDecayAnimationSpec
+            )
         val anchors = DraggableAnchors {
             A at 0f
             B at AnchoredDraggableBoxSize.value / 2f
@@ -177,20 +175,13 @@
                 WithTouchSlop(0f) {
                     Box(Modifier.fillMaxSize()) {
                         Box(
-                            Modifier
-                                .requiredSize(AnchoredDraggableBoxSize)
+                            Modifier.requiredSize(AnchoredDraggableBoxSize)
                                 .testTag(AnchoredDraggableTestTag)
                                 .anchoredDraggable(
                                     state = state,
                                     orientation = Orientation.Vertical
                                 )
-                                .offset {
-                                    IntOffset(
-                                        state
-                                            .requireOffset()
-                                            .roundToInt(), 0
-                                    )
-                                }
+                                .offset { IntOffset(state.requireOffset().roundToInt(), 0) }
                                 .background(Color.Red)
                         )
                     }
@@ -200,28 +191,32 @@
 
         assertThat(state.currentValue).isEqualTo(A)
 
-        rule.onNodeWithTag(AnchoredDraggableTestTag)
-            .performTouchInput { swipeDown(startY = top, endY = bottom / 2) }
+        rule.onNodeWithTag(AnchoredDraggableTestTag).performTouchInput {
+            swipeDown(startY = top, endY = bottom / 2)
+        }
         rule.waitForIdle()
 
         assertThat(state.currentValue).isEqualTo(B)
         assertThat(state.offset).isEqualTo(anchors.positionOf(B))
 
-        rule.onNodeWithTag(AnchoredDraggableTestTag)
-            .performTouchInput { swipeDown(startY = bottom / 2, endY = bottom) }
+        rule.onNodeWithTag(AnchoredDraggableTestTag).performTouchInput {
+            swipeDown(startY = bottom / 2, endY = bottom)
+        }
         rule.waitForIdle()
         assertThat(state.currentValue).isEqualTo(C)
         assertThat(state.offset).isEqualTo(anchors.positionOf(C))
 
-        rule.onNodeWithTag(AnchoredDraggableTestTag)
-            .performTouchInput { swipeUp(startY = bottom, endY = bottom / 2) }
+        rule.onNodeWithTag(AnchoredDraggableTestTag).performTouchInput {
+            swipeUp(startY = bottom, endY = bottom / 2)
+        }
         rule.waitForIdle()
 
         assertThat(state.currentValue).isEqualTo(B)
         assertThat(state.offset).isEqualTo(anchors.positionOf(B))
 
-        rule.onNodeWithTag(AnchoredDraggableTestTag)
-            .performTouchInput { swipeUp(startY = bottom / 2, endY = top) }
+        rule.onNodeWithTag(AnchoredDraggableTestTag).performTouchInput {
+            swipeUp(startY = bottom / 2, endY = top)
+        }
         rule.waitForIdle()
 
         assertThat(state.currentValue).isEqualTo(A)
@@ -230,13 +225,14 @@
 
     @Test
     fun anchoredDraggable_swipe_disabled_horizontal() {
-        val state = AnchoredDraggableState(
-            initialValue = A,
-            positionalThreshold = DefaultPositionalThreshold,
-            velocityThreshold = DefaultVelocityThreshold,
-            snapAnimationSpec = tween(),
-            decayAnimationSpec = DefaultDecayAnimationSpec
-        )
+        val state =
+            AnchoredDraggableState(
+                initialValue = A,
+                positionalThreshold = DefaultPositionalThreshold,
+                velocityThreshold = DefaultVelocityThreshold,
+                snapAnimationSpec = tween(),
+                decayAnimationSpec = DefaultDecayAnimationSpec
+            )
         val anchors = DraggableAnchors {
             A at 0f
             B at 250f
@@ -249,21 +245,14 @@
                 WithTouchSlop(0f) {
                     Box(Modifier.fillMaxSize()) {
                         Box(
-                            Modifier
-                                .requiredSize(AnchoredDraggableBoxSize)
+                            Modifier.requiredSize(AnchoredDraggableBoxSize)
                                 .testTag(AnchoredDraggableTestTag)
                                 .anchoredDraggable(
                                     state = state,
                                     orientation = Orientation.Horizontal,
                                     enabled = false
                                 )
-                                .offset {
-                                    IntOffset(
-                                        state
-                                            .requireOffset()
-                                            .roundToInt(), 0
-                                    )
-                                }
+                                .offset { IntOffset(state.requireOffset().roundToInt(), 0) }
                                 .background(Color.Red)
                         )
                     }
@@ -273,8 +262,9 @@
 
         assertThat(state.currentValue).isEqualTo(A)
 
-        rule.onNodeWithTag(AnchoredDraggableTestTag)
-            .performTouchInput { swipeRight(startX = left, endX = right) }
+        rule.onNodeWithTag(AnchoredDraggableTestTag).performTouchInput {
+            swipeRight(startX = left, endX = right)
+        }
         rule.waitForIdle()
 
         assertThat(state.currentValue).isEqualTo(A)
@@ -283,13 +273,14 @@
 
     @Test
     fun anchoredDraggable_swipe_disabled_vertical() {
-        val state = AnchoredDraggableState(
-            initialValue = A,
-            positionalThreshold = DefaultPositionalThreshold,
-            velocityThreshold = DefaultVelocityThreshold,
-            snapAnimationSpec = tween(),
-            decayAnimationSpec = DefaultDecayAnimationSpec
-        )
+        val state =
+            AnchoredDraggableState(
+                initialValue = A,
+                positionalThreshold = DefaultPositionalThreshold,
+                velocityThreshold = DefaultVelocityThreshold,
+                snapAnimationSpec = tween(),
+                decayAnimationSpec = DefaultDecayAnimationSpec
+            )
         val anchors = DraggableAnchors {
             A at 0f
             B at 250f
@@ -302,21 +293,14 @@
                 WithTouchSlop(0f) {
                     Box(Modifier.fillMaxSize()) {
                         Box(
-                            Modifier
-                                .requiredSize(AnchoredDraggableBoxSize)
+                            Modifier.requiredSize(AnchoredDraggableBoxSize)
                                 .testTag(AnchoredDraggableTestTag)
                                 .anchoredDraggable(
                                     state = state,
                                     orientation = Orientation.Vertical,
                                     enabled = false
                                 )
-                                .offset {
-                                    IntOffset(
-                                        state
-                                            .requireOffset()
-                                            .roundToInt(), 0
-                                    )
-                                }
+                                .offset { IntOffset(state.requireOffset().roundToInt(), 0) }
                                 .background(Color.Red)
                         )
                     }
@@ -326,8 +310,9 @@
 
         assertThat(state.currentValue).isEqualTo(A)
 
-        rule.onNodeWithTag(AnchoredDraggableTestTag)
-            .performTouchInput { swipeDown(startY = top, endY = bottom) }
+        rule.onNodeWithTag(AnchoredDraggableTestTag).performTouchInput {
+            swipeDown(startY = top, endY = bottom)
+        }
         rule.waitForIdle()
 
         assertThat(state.currentValue).isEqualTo(A)
@@ -338,23 +323,20 @@
     fun anchoredDraggable_negative_offset_targetState() {
         val positionalThreshold = 0.5f
         val absThreshold = abs(positionalThreshold)
-        val state = AnchoredDraggableState(
-            initialValue = A,
-            positionalThreshold = { distance -> distance * positionalThreshold },
-            velocityThreshold = DefaultVelocityThreshold,
-            snapAnimationSpec = tween(),
-            decayAnimationSpec = DefaultDecayAnimationSpec
-        )
+        val state =
+            AnchoredDraggableState(
+                initialValue = A,
+                positionalThreshold = { distance -> distance * positionalThreshold },
+                velocityThreshold = DefaultVelocityThreshold,
+                snapAnimationSpec = tween(),
+                decayAnimationSpec = DefaultDecayAnimationSpec
+            )
         rule.setContent {
             Box(Modifier.fillMaxSize()) {
                 Box(
-                    Modifier
-                        .requiredSize(AnchoredDraggableBoxSize)
+                    Modifier.requiredSize(AnchoredDraggableBoxSize)
                         .testTag(AnchoredDraggableTestTag)
-                        .anchoredDraggable(
-                            state = state,
-                            orientation = Orientation.Horizontal
-                        )
+                        .anchoredDraggable(state = state, orientation = Orientation.Horizontal)
                         .onSizeChanged { layoutSize ->
                             val anchors = DraggableAnchors {
                                 A at 0f
@@ -362,13 +344,7 @@
                             }
                             state.updateAnchors(anchors)
                         }
-                        .offset {
-                            IntOffset(
-                                state
-                                    .requireOffset()
-                                    .roundToInt(), 0
-                            )
-                        }
+                        .offset { IntOffset(state.requireOffset().roundToInt(), 0) }
                         .background(Color.Red)
                 )
             }
@@ -378,8 +354,9 @@
         val positionOfB = state.anchors.positionOf(B)
         val distance = abs(positionOfA - positionOfB)
 
-        rule.onNodeWithTag(AnchoredDraggableTestTag)
-            .performTouchInput { swipeLeft(startX = right, endX = left) }
+        rule.onNodeWithTag(AnchoredDraggableTestTag).performTouchInput {
+            swipeLeft(startX = right, endX = left)
+        }
         rule.waitForIdle()
 
         assertThat(state.currentValue).isEqualTo(B)
@@ -401,23 +378,20 @@
     fun anchoredDraggable_positionalThresholds_fractional_targetState() {
         val positionalThreshold = 0.5f
         val absThreshold = abs(positionalThreshold)
-        val state = AnchoredDraggableState(
-            initialValue = A,
-            positionalThreshold = { totalDistance -> totalDistance * positionalThreshold },
-            velocityThreshold = DefaultVelocityThreshold,
-            snapAnimationSpec = tween(),
-            decayAnimationSpec = DefaultDecayAnimationSpec
-        )
+        val state =
+            AnchoredDraggableState(
+                initialValue = A,
+                positionalThreshold = { totalDistance -> totalDistance * positionalThreshold },
+                velocityThreshold = DefaultVelocityThreshold,
+                snapAnimationSpec = tween(),
+                decayAnimationSpec = DefaultDecayAnimationSpec
+            )
         rule.setContent {
             Box(Modifier.fillMaxSize()) {
                 Box(
-                    Modifier
-                        .requiredSize(AnchoredDraggableBoxSize)
+                    Modifier.requiredSize(AnchoredDraggableBoxSize)
                         .testTag(AnchoredDraggableTestTag)
-                        .anchoredDraggable(
-                            state = state,
-                            orientation = Orientation.Horizontal
-                        )
+                        .anchoredDraggable(state = state, orientation = Orientation.Horizontal)
                         .onSizeChanged { layoutSize ->
                             val anchors = DraggableAnchors {
                                 A at 0f
@@ -426,13 +400,7 @@
                             }
                             state.updateAnchors(anchors)
                         }
-                        .offset {
-                            IntOffset(
-                                state
-                                    .requireOffset()
-                                    .roundToInt(), 0
-                            )
-                        }
+                        .offset { IntOffset(state.requireOffset().roundToInt(), 0) }
                         .background(Color.Red)
                 )
             }
@@ -482,23 +450,20 @@
     fun anchoredDraggable_positionalThresholds_fractional_negativeThreshold_targetState() {
         val positionalThreshold = -0.5f
         val absThreshold = abs(positionalThreshold)
-        val state = AnchoredDraggableState(
-            initialValue = A,
-            positionalThreshold = { totalDistance -> totalDistance * positionalThreshold },
-            velocityThreshold = DefaultVelocityThreshold,
-            snapAnimationSpec = tween(),
-            decayAnimationSpec = DefaultDecayAnimationSpec
-        )
+        val state =
+            AnchoredDraggableState(
+                initialValue = A,
+                positionalThreshold = { totalDistance -> totalDistance * positionalThreshold },
+                velocityThreshold = DefaultVelocityThreshold,
+                snapAnimationSpec = tween(),
+                decayAnimationSpec = DefaultDecayAnimationSpec
+            )
         rule.setContent {
             Box(Modifier.fillMaxSize()) {
                 Box(
-                    Modifier
-                        .requiredSize(AnchoredDraggableBoxSize)
+                    Modifier.requiredSize(AnchoredDraggableBoxSize)
                         .testTag(AnchoredDraggableTestTag)
-                        .anchoredDraggable(
-                            state = state,
-                            orientation = Orientation.Horizontal
-                        )
+                        .anchoredDraggable(state = state, orientation = Orientation.Horizontal)
                         .onSizeChanged { layoutSize ->
                             val anchors = DraggableAnchors {
                                 A at 0f
@@ -507,13 +472,7 @@
                             }
                             state.updateAnchors(anchors)
                         }
-                        .offset {
-                            IntOffset(
-                                state
-                                    .requireOffset()
-                                    .roundToInt(), 0
-                            )
-                        }
+                        .offset { IntOffset(state.requireOffset().roundToInt(), 0) }
                         .background(Color.Red)
                 )
             }
@@ -564,13 +523,14 @@
         runBlocking(AutoTestFrameClock()) {
             val velocity = 100.dp
             val velocityPx = with(rule.density) { velocity.toPx() }
-            val state = AnchoredDraggableState(
-                initialValue = A,
-                positionalThreshold = DefaultPositionalThreshold,
-                velocityThreshold = { velocityPx / 2f },
-                snapAnimationSpec = tween(),
-                decayAnimationSpec = DefaultDecayAnimationSpec
-            )
+            val state =
+                AnchoredDraggableState(
+                    initialValue = A,
+                    positionalThreshold = DefaultPositionalThreshold,
+                    velocityThreshold = { velocityPx / 2f },
+                    snapAnimationSpec = tween(),
+                    decayAnimationSpec = DefaultDecayAnimationSpec
+                )
             state.updateAnchors(
                 DraggableAnchors {
                     A at 0f
@@ -589,13 +549,14 @@
         runBlocking(AutoTestFrameClock()) {
             val velocity = 100.dp
             val velocityPx = with(rule.density) { velocity.toPx() }
-            val state = AnchoredDraggableState(
-                initialValue = A,
-                velocityThreshold = { velocityPx },
-                positionalThreshold = { Float.POSITIVE_INFINITY },
-                snapAnimationSpec = tween(),
-                decayAnimationSpec = DefaultDecayAnimationSpec
-            )
+            val state =
+                AnchoredDraggableState(
+                    initialValue = A,
+                    velocityThreshold = { velocityPx },
+                    positionalThreshold = { Float.POSITIVE_INFINITY },
+                    snapAnimationSpec = tween(),
+                    decayAnimationSpec = DefaultDecayAnimationSpec
+                )
             state.updateAnchors(
                 DraggableAnchors {
                     A at 0f
@@ -613,13 +574,14 @@
         runBlocking(AutoTestFrameClock()) {
             val velocity = 100.dp
             val velocityPx = with(rule.density) { velocity.toPx() }
-            val state = AnchoredDraggableState(
-                initialValue = B,
-                velocityThreshold = { velocityPx },
-                positionalThreshold = { 0f },
-                snapAnimationSpec = tween(),
-                decayAnimationSpec = DefaultDecayAnimationSpec
-            )
+            val state =
+                AnchoredDraggableState(
+                    initialValue = B,
+                    velocityThreshold = { velocityPx },
+                    positionalThreshold = { 0f },
+                    snapAnimationSpec = tween(),
+                    decayAnimationSpec = DefaultDecayAnimationSpec
+                )
             state.updateAnchors(
                 DraggableAnchors {
                     A at 0f
@@ -648,23 +610,20 @@
     @Test
     fun anchoredDraggable_velocityThreshold_swipe_velocityHigherThanThreshold_advances() {
         val velocityThreshold = 100.dp
-        val state = AnchoredDraggableState(
-            initialValue = A,
-            positionalThreshold = DefaultPositionalThreshold,
-            velocityThreshold = { with(rule.density) { velocityThreshold.toPx() } },
-            snapAnimationSpec = tween(),
-            decayAnimationSpec = DefaultDecayAnimationSpec
-        )
+        val state =
+            AnchoredDraggableState(
+                initialValue = A,
+                positionalThreshold = DefaultPositionalThreshold,
+                velocityThreshold = { with(rule.density) { velocityThreshold.toPx() } },
+                snapAnimationSpec = tween(),
+                decayAnimationSpec = DefaultDecayAnimationSpec
+            )
         rule.setContent {
             Box(Modifier.fillMaxSize()) {
                 Box(
-                    Modifier
-                        .requiredSize(AnchoredDraggableBoxSize)
+                    Modifier.requiredSize(AnchoredDraggableBoxSize)
                         .testTag(AnchoredDraggableTestTag)
-                        .anchoredDraggable(
-                            state = state,
-                            orientation = Orientation.Horizontal
-                        )
+                        .anchoredDraggable(state = state, orientation = Orientation.Horizontal)
                         .onSizeChanged { layoutSize ->
                             val anchors = DraggableAnchors {
                                 A at 0f
@@ -673,26 +632,19 @@
                             }
                             state.updateAnchors(anchors)
                         }
-                        .offset {
-                            IntOffset(
-                                state
-                                    .requireOffset()
-                                    .roundToInt(), 0
-                            )
-                        }
+                        .offset { IntOffset(state.requireOffset().roundToInt(), 0) }
                         .background(Color.Red)
                 )
             }
         }
 
-        rule.onNodeWithTag(AnchoredDraggableTestTag)
-            .performTouchInput {
-                swipeWithVelocity(
-                    start = Offset(left, 0f),
-                    end = Offset(right / 2, 0f),
-                    endVelocity = with(rule.density) { velocityThreshold.toPx() } * 1.1f
-                )
-            }
+        rule.onNodeWithTag(AnchoredDraggableTestTag).performTouchInput {
+            swipeWithVelocity(
+                start = Offset(left, 0f),
+                end = Offset(right / 2, 0f),
+                endVelocity = with(rule.density) { velocityThreshold.toPx() } * 1.1f
+            )
+        }
 
         rule.waitForIdle()
         assertThat(state.currentValue).isEqualTo(B)
@@ -701,23 +653,20 @@
     @Test
     fun anchoredDraggable_velocityThreshold_swipe_velocityLowerThanThreshold_doesntAdvance() {
         val velocityThreshold = 100.dp
-        val state = AnchoredDraggableState(
-            initialValue = A,
-            velocityThreshold = { with(rule.density) { velocityThreshold.toPx() } },
-            positionalThreshold = { Float.POSITIVE_INFINITY },
-            snapAnimationSpec = tween(),
-            decayAnimationSpec = DefaultDecayAnimationSpec
-        )
+        val state =
+            AnchoredDraggableState(
+                initialValue = A,
+                velocityThreshold = { with(rule.density) { velocityThreshold.toPx() } },
+                positionalThreshold = { Float.POSITIVE_INFINITY },
+                snapAnimationSpec = tween(),
+                decayAnimationSpec = DefaultDecayAnimationSpec
+            )
         rule.setContent {
             Box(Modifier.fillMaxSize()) {
                 Box(
-                    Modifier
-                        .requiredSize(AnchoredDraggableBoxSize)
+                    Modifier.requiredSize(AnchoredDraggableBoxSize)
                         .testTag(AnchoredDraggableTestTag)
-                        .anchoredDraggable(
-                            state = state,
-                            orientation = Orientation.Horizontal
-                        )
+                        .anchoredDraggable(state = state, orientation = Orientation.Horizontal)
                         .onSizeChanged { layoutSize ->
                             val anchors = DraggableAnchors {
                                 A at 0f
@@ -726,26 +675,19 @@
                             }
                             state.updateAnchors(anchors)
                         }
-                        .offset {
-                            IntOffset(
-                                state
-                                    .requireOffset()
-                                    .roundToInt(), 0
-                            )
-                        }
+                        .offset { IntOffset(state.requireOffset().roundToInt(), 0) }
                         .background(Color.Red)
                 )
             }
         }
 
-        rule.onNodeWithTag(AnchoredDraggableTestTag)
-            .performTouchInput {
-                swipeWithVelocity(
-                    start = Offset(left, 0f),
-                    end = Offset(right / 4, 0f),
-                    endVelocity = with(rule.density) { velocityThreshold.toPx() } * 0.9f
-                )
-            }
+        rule.onNodeWithTag(AnchoredDraggableTestTag).performTouchInput {
+            swipeWithVelocity(
+                start = Offset(left, 0f),
+                end = Offset(right / 4, 0f),
+                endVelocity = with(rule.density) { velocityThreshold.toPx() } * 0.9f
+            )
+        }
 
         rule.waitForIdle()
         assertThat(state.settledValue).isEqualTo(A)
@@ -757,31 +699,22 @@
             A at 0f
             C at 500f
         }
-        val state = AnchoredDraggableState(
-            initialValue = A,
-            positionalThreshold = DefaultPositionalThreshold,
-            velocityThreshold = { 0f },
-            snapAnimationSpec = tween(),
-            decayAnimationSpec = DefaultDecayAnimationSpec
-        )
+        val state =
+            AnchoredDraggableState(
+                initialValue = A,
+                positionalThreshold = DefaultPositionalThreshold,
+                velocityThreshold = { 0f },
+                snapAnimationSpec = tween(),
+                decayAnimationSpec = DefaultDecayAnimationSpec
+            )
         state.updateAnchors(anchors)
         rule.setContent {
             Box(Modifier.fillMaxSize()) {
                 Box(
-                    Modifier
-                        .requiredSize(AnchoredDraggableBoxSize)
+                    Modifier.requiredSize(AnchoredDraggableBoxSize)
                         .testTag(AnchoredDraggableTestTag)
-                        .anchoredDraggable(
-                            state = state,
-                            orientation = Orientation.Horizontal
-                        )
-                        .offset {
-                            IntOffset(
-                                state
-                                    .requireOffset()
-                                    .roundToInt(), 0
-                            )
-                        }
+                        .anchoredDraggable(state = state, orientation = Orientation.Horizontal)
+                        .offset { IntOffset(state.requireOffset().roundToInt(), 0) }
                         .background(Color.Red)
                 )
             }
@@ -790,12 +723,11 @@
         val overdrag = 100f
         val maxBound = state.anchors.positionOf(C)
 
-        rule.onNodeWithTag(AnchoredDraggableTestTag)
-            .performTouchInput {
-                down(Offset(0f, 0f))
-                moveBy(Offset(x = maxBound + overdrag, y = 0f))
-                moveBy(Offset(x = -overdrag, y = 0f))
-            }
+        rule.onNodeWithTag(AnchoredDraggableTestTag).performTouchInput {
+            down(Offset(0f, 0f))
+            moveBy(Offset(x = maxBound + overdrag, y = 0f))
+            moveBy(Offset(x = -overdrag, y = 0f))
+        }
 
         rule.waitForIdle()
 
@@ -814,34 +746,25 @@
             B at 250f
             C at 500f
         }
-        val state = AnchoredDraggableState(
-            initialValue = A,
-            positionalThreshold = { totalDistance -> totalDistance * 0.5f },
-            velocityThreshold = DefaultVelocityThreshold,
-            snapAnimationSpec = tween(),
-            anchors = anchors,
-            decayAnimationSpec = DefaultDecayAnimationSpec
-        )
+        val state =
+            AnchoredDraggableState(
+                initialValue = A,
+                positionalThreshold = { totalDistance -> totalDistance * 0.5f },
+                velocityThreshold = DefaultVelocityThreshold,
+                snapAnimationSpec = tween(),
+                anchors = anchors,
+                decayAnimationSpec = DefaultDecayAnimationSpec
+            )
         lateinit var scope: CoroutineScope
         rule.setContent {
             WithTouchSlop(touchSlop = 0f) {
                 scope = rememberCoroutineScope()
                 Box(Modifier.fillMaxSize()) {
                     Box(
-                        Modifier
-                            .requiredSize(AnchoredDraggableBoxSize)
+                        Modifier.requiredSize(AnchoredDraggableBoxSize)
                             .testTag(AnchoredDraggableTestTag)
-                            .anchoredDraggable(
-                                state = state,
-                                orientation = Orientation.Horizontal
-                            )
-                            .offset {
-                                IntOffset(
-                                    state
-                                        .requireOffset()
-                                        .roundToInt(), 0
-                                )
-                            }
+                            .anchoredDraggable(state = state, orientation = Orientation.Horizontal)
+                            .offset { IntOffset(state.requireOffset().roundToInt(), 0) }
                             .background(Color.Red)
                     )
                 }
@@ -858,10 +781,7 @@
         } // Advance until our closest anchor is B
         assertThat(state.targetValue).isEqualTo(C)
 
-        rule.onNodeWithTag(AnchoredDraggableTestTag)
-            .performTouchInput {
-                down(Offset.Zero)
-            }
+        rule.onNodeWithTag(AnchoredDraggableTestTag).performTouchInput { down(Offset.Zero) }
         rule.waitForIdle()
 
         assertThat(state.targetValue).isEqualTo(B) // B is the closest now so we should target it
@@ -875,35 +795,29 @@
             B at 250f
             C at 500f
         }
-        val state = AnchoredDraggableState(
-            initialValue = A,
-            positionalThreshold = { totalDistance -> totalDistance * 0.5f },
-            velocityThreshold = DefaultVelocityThreshold,
-            snapAnimationSpec = tween(),
-            anchors = anchors,
-            decayAnimationSpec = DefaultDecayAnimationSpec
-        )
+        val state =
+            AnchoredDraggableState(
+                initialValue = A,
+                positionalThreshold = { totalDistance -> totalDistance * 0.5f },
+                velocityThreshold = DefaultVelocityThreshold,
+                snapAnimationSpec = tween(),
+                anchors = anchors,
+                decayAnimationSpec = DefaultDecayAnimationSpec
+            )
         lateinit var scope: CoroutineScope
         rule.setContent {
             WithTouchSlop(touchSlop = 0f) {
                 scope = rememberCoroutineScope()
                 Box(Modifier.fillMaxSize()) {
                     Box(
-                        Modifier
-                            .requiredSize(AnchoredDraggableBoxSize)
+                        Modifier.requiredSize(AnchoredDraggableBoxSize)
                             .testTag(AnchoredDraggableTestTag)
                             .anchoredDraggable(
                                 state = state,
                                 orientation = Orientation.Horizontal,
                                 startDragImmediately = false,
                             )
-                            .offset {
-                                IntOffset(
-                                    state
-                                        .requireOffset()
-                                        .roundToInt(), 0
-                                )
-                            }
+                            .offset { IntOffset(state.requireOffset().roundToInt(), 0) }
                             .background(Color.Red)
                     )
                 }
@@ -919,10 +833,7 @@
         } // Advance until our closest anchor is B
         assertThat(state.targetValue).isEqualTo(C)
 
-        rule.onNodeWithTag(AnchoredDraggableTestTag)
-            .performTouchInput {
-                down(Offset.Zero)
-            }
+        rule.onNodeWithTag(AnchoredDraggableTestTag).performTouchInput { down(Offset.Zero) }
         rule.waitForIdle()
 
         assertThat(state.targetValue).isEqualTo(C) // Animation will continue to C
@@ -931,29 +842,33 @@
     @Test
     fun anchoredDraggable_updatesState() {
         val positionalThreshold = 0.5f
-        val state1 = AnchoredDraggableState(
-            initialValue = A,
-            anchors = DraggableAnchors {
-                A at 0f
-                B at 250f
-                C at 500f
-            },
-            positionalThreshold = { totalDistance -> totalDistance * positionalThreshold },
-            velocityThreshold = DefaultVelocityThreshold,
-            snapAnimationSpec = tween(),
-            decayAnimationSpec = DefaultDecayAnimationSpec
-        )
-        val state2 = AnchoredDraggableState(
-            initialValue = B,
-            anchors = DraggableAnchors {
-                A at 0f
-                B at 250f
-            },
-            positionalThreshold = { totalDistance -> totalDistance * positionalThreshold },
-            velocityThreshold = DefaultVelocityThreshold,
-            snapAnimationSpec = tween(),
-            decayAnimationSpec = DefaultDecayAnimationSpec
-        )
+        val state1 =
+            AnchoredDraggableState(
+                initialValue = A,
+                anchors =
+                    DraggableAnchors {
+                        A at 0f
+                        B at 250f
+                        C at 500f
+                    },
+                positionalThreshold = { totalDistance -> totalDistance * positionalThreshold },
+                velocityThreshold = DefaultVelocityThreshold,
+                snapAnimationSpec = tween(),
+                decayAnimationSpec = DefaultDecayAnimationSpec
+            )
+        val state2 =
+            AnchoredDraggableState(
+                initialValue = B,
+                anchors =
+                    DraggableAnchors {
+                        A at 0f
+                        B at 250f
+                    },
+                positionalThreshold = { totalDistance -> totalDistance * positionalThreshold },
+                velocityThreshold = DefaultVelocityThreshold,
+                snapAnimationSpec = tween(),
+                decayAnimationSpec = DefaultDecayAnimationSpec
+            )
 
         var state by mutableStateOf(state1)
 
@@ -961,20 +876,10 @@
             WithTouchSlop(0f) {
                 Box(Modifier.fillMaxSize()) {
                     Box(
-                        Modifier
-                            .requiredSize(AnchoredDraggableBoxSize)
+                        Modifier.requiredSize(AnchoredDraggableBoxSize)
                             .testTag(AnchoredDraggableTestTag)
-                            .anchoredDraggable(
-                                state = state,
-                                orientation = Orientation.Horizontal
-                            )
-                            .offset {
-                                IntOffset(
-                                    state
-                                        .requireOffset()
-                                        .roundToInt(), 0
-                                )
-                            }
+                            .anchoredDraggable(state = state, orientation = Orientation.Horizontal)
+                            .offset { IntOffset(state.requireOffset().roundToInt(), 0) }
                             .background(Color.Red)
                     )
                 }
@@ -986,12 +891,11 @@
         val distance = abs(positionOfA - positionOfB)
 
         // dragging across the positional threshold to settle at anchor B
-        rule.onNodeWithTag(AnchoredDraggableTestTag)
-            .performTouchInput {
-                down(Offset(0f, 0f))
-                moveBy(Offset(x = distance * positionalThreshold * 1.1f, y = 0f))
-                up()
-            }
+        rule.onNodeWithTag(AnchoredDraggableTestTag).performTouchInput {
+            down(Offset(0f, 0f))
+            moveBy(Offset(x = distance * positionalThreshold * 1.1f, y = 0f))
+            up()
+        }
         rule.waitForIdle()
 
         // assert that changes reflected on state1
@@ -1002,12 +906,11 @@
         rule.waitForIdle()
 
         // dragging across the positional threshold to settle at anchor A
-        rule.onNodeWithTag(AnchoredDraggableTestTag)
-            .performTouchInput {
-                down(Offset(0f, 0f))
-                moveBy(Offset(x = -distance * positionalThreshold * 1.1f, y = 0f))
-                up()
-            }
+        rule.onNodeWithTag(AnchoredDraggableTestTag).performTouchInput {
+            down(Offset(0f, 0f))
+            moveBy(Offset(x = -distance * positionalThreshold * 1.1f, y = 0f))
+            up()
+        }
         rule.waitForIdle()
 
         // assert that no more changes reflected on state1
@@ -1018,37 +921,32 @@
 
     @Test
     fun anchoredDraggable_reverseDirection_true_reversesDeltas() {
-        val state = AnchoredDraggableState(
-            initialValue = B,
-            anchors = DraggableAnchors {
-                A at 0f
-                B at 250f
-                C at 500f
-            },
-            positionalThreshold = DefaultPositionalThreshold,
-            velocityThreshold = DefaultVelocityThreshold,
-            snapAnimationSpec = tween(),
-            decayAnimationSpec = DefaultDecayAnimationSpec
-        )
+        val state =
+            AnchoredDraggableState(
+                initialValue = B,
+                anchors =
+                    DraggableAnchors {
+                        A at 0f
+                        B at 250f
+                        C at 500f
+                    },
+                positionalThreshold = DefaultPositionalThreshold,
+                velocityThreshold = DefaultVelocityThreshold,
+                snapAnimationSpec = tween(),
+                decayAnimationSpec = DefaultDecayAnimationSpec
+            )
         rule.setContent {
             WithTouchSlop(0f) {
                 Box(Modifier.fillMaxSize()) {
                     Box(
-                        Modifier
-                            .requiredSize(AnchoredDraggableBoxSize)
+                        Modifier.requiredSize(AnchoredDraggableBoxSize)
                             .testTag(AnchoredDraggableTestTag)
                             .anchoredDraggable(
                                 state = state,
                                 orientation = Orientation.Horizontal,
                                 reverseDirection = true
                             )
-                            .offset {
-                                IntOffset(
-                                    state
-                                        .requireOffset()
-                                        .roundToInt(), 0
-                                )
-                            }
+                            .offset { IntOffset(state.requireOffset().roundToInt(), 0) }
                             .background(Color.Red)
                     )
                 }
@@ -1067,38 +965,33 @@
 
     @Test
     fun anchoredDraggable_reverseDirection_defaultValue_reversesDeltasInRTL() {
-        val state = AnchoredDraggableState(
-            initialValue = A,
-            anchors = DraggableAnchors {
-                A at 0f
-                B at 250f
-                C at 500f
-            },
-            positionalThreshold = DefaultPositionalThreshold,
-            velocityThreshold = DefaultVelocityThreshold,
-            snapAnimationSpec = tween(),
-            decayAnimationSpec = DefaultDecayAnimationSpec
-        )
+        val state =
+            AnchoredDraggableState(
+                initialValue = A,
+                anchors =
+                    DraggableAnchors {
+                        A at 0f
+                        B at 250f
+                        C at 500f
+                    },
+                positionalThreshold = DefaultPositionalThreshold,
+                velocityThreshold = DefaultVelocityThreshold,
+                snapAnimationSpec = tween(),
+                decayAnimationSpec = DefaultDecayAnimationSpec
+            )
         var layoutDirection by mutableStateOf(LayoutDirection.Ltr)
         rule.setContent {
             CompositionLocalProvider(LocalLayoutDirection provides layoutDirection) {
                 WithTouchSlop(0f) {
                     Box(Modifier.fillMaxSize()) {
                         Box(
-                            Modifier
-                                .requiredSize(AnchoredDraggableBoxSize)
+                            Modifier.requiredSize(AnchoredDraggableBoxSize)
                                 .testTag(AnchoredDraggableTestTag)
                                 .anchoredDraggable(
                                     state = state,
                                     orientation = Orientation.Horizontal
                                 )
-                                .offset {
-                                    IntOffset(
-                                        state
-                                            .requireOffset()
-                                            .roundToInt(), 0
-                                    )
-                                }
+                                .offset { IntOffset(state.requireOffset().roundToInt(), 0) }
                                 .background(Color.Red)
                         )
                     }
@@ -1138,7 +1031,8 @@
         SplineBasedFloatDecayAnimationSpec(rule.density).generateDecayAnimationSpec()
 }
 
-private val NoOpDensity = object : Density {
-    override val density = 1f
-    override val fontScale = 1f
-}
+private val NoOpDensity =
+    object : Density {
+        override val density = 1f
+        override val fontScale = 1f
+    }
diff --git a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/anchoredDraggable/AnchoredDraggableOverscrollTest.kt b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/anchoredDraggable/AnchoredDraggableOverscrollTest.kt
index 5cbdb10..13fad78 100644
--- a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/anchoredDraggable/AnchoredDraggableOverscrollTest.kt
+++ b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/anchoredDraggable/AnchoredDraggableOverscrollTest.kt
@@ -66,8 +66,7 @@
 @OptIn(ExperimentalFoundationApi::class)
 class AnchoredDraggableOverscrollTest {
 
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
     private val AnchoredDraggableTestTag = "dragbox"
     private val AnchoredDraggableBoxSize = 200.dp
@@ -75,40 +74,31 @@
     @Test
     fun anchoredDraggable_scrollOutOfBounds_haveDeltaForOverscroll() {
         val overscrollEffect = TestOverscrollEffect()
-        val state = AnchoredDraggableState(
-            initialValue = A,
-            positionalThreshold = DefaultPositionalThreshold,
-            velocityThreshold = DefaultVelocityThreshold,
-            anchors = DraggableAnchors {
-                A at 0f
-                B at 250f
-            },
-            snapAnimationSpec = tween(),
-            decayAnimationSpec = DefaultDecayAnimationSpec
-        )
+        val state =
+            AnchoredDraggableState(
+                initialValue = A,
+                positionalThreshold = DefaultPositionalThreshold,
+                velocityThreshold = DefaultVelocityThreshold,
+                anchors =
+                    DraggableAnchors {
+                        A at 0f
+                        B at 250f
+                    },
+                snapAnimationSpec = tween(),
+                decayAnimationSpec = DefaultDecayAnimationSpec
+            )
         rule.setContent {
             WithTouchSlop(0f) {
-                Box(
-                    Modifier
-                        .fillMaxSize()
-                        .overscroll(overscrollEffect)
-                ) {
+                Box(Modifier.fillMaxSize().overscroll(overscrollEffect)) {
                     Box(
-                        Modifier
-                            .requiredSize(AnchoredDraggableBoxSize)
+                        Modifier.requiredSize(AnchoredDraggableBoxSize)
                             .testTag(AnchoredDraggableTestTag)
                             .anchoredDraggable(
                                 state = state,
                                 orientation = Orientation.Horizontal,
                                 overscrollEffect = overscrollEffect
                             )
-                            .offset {
-                                IntOffset(
-                                    state
-                                        .requireOffset()
-                                        .roundToInt(), 0
-                                )
-                            }
+                            .offset { IntOffset(state.requireOffset().roundToInt(), 0) }
                     )
                 }
             }
@@ -123,12 +113,11 @@
         assertThat(overscrollEffect.scrollOverscrollDelta.x).isEqualTo(0f)
 
         // drag to positionB + overDrag
-        rule.onNodeWithTag(AnchoredDraggableTestTag)
-            .performTouchInput {
-                down(Offset(0f, 0f))
-                moveBy(Offset(x = maxBound + overDrag, y = 0f))
-                up()
-            }
+        rule.onNodeWithTag(AnchoredDraggableTestTag).performTouchInput {
+            down(Offset(0f, 0f))
+            moveBy(Offset(x = maxBound + overDrag, y = 0f))
+            up()
+        }
         rule.waitForIdle()
 
         // assert the component settled at anchor B
@@ -145,41 +134,32 @@
     fun anchoredDraggable_swipeWithVelocity_haveVelocityForOverscroll() {
         val endVelocity = 4000f
         val overscrollEffect = TestOverscrollEffect()
-        val state = AnchoredDraggableState(
-            initialValue = A,
-            positionalThreshold = DefaultPositionalThreshold,
-            velocityThreshold = DefaultVelocityThreshold,
-            snapAnimationSpec = tween(),
-            decayAnimationSpec = DefaultDecayAnimationSpec,
-            anchors = DraggableAnchors {
-                A at 0f
-                B at 250f
-            }
-        )
+        val state =
+            AnchoredDraggableState(
+                initialValue = A,
+                positionalThreshold = DefaultPositionalThreshold,
+                velocityThreshold = DefaultVelocityThreshold,
+                snapAnimationSpec = tween(),
+                decayAnimationSpec = DefaultDecayAnimationSpec,
+                anchors =
+                    DraggableAnchors {
+                        A at 0f
+                        B at 250f
+                    }
+            )
 
         rule.setContent {
             WithTouchSlop(0f) {
-                Box(
-                    Modifier
-                        .fillMaxSize()
-                        .overscroll(overscrollEffect)
-                ) {
+                Box(Modifier.fillMaxSize().overscroll(overscrollEffect)) {
                     Box(
-                        Modifier
-                            .requiredSize(AnchoredDraggableBoxSize)
+                        Modifier.requiredSize(AnchoredDraggableBoxSize)
                             .testTag(AnchoredDraggableTestTag)
                             .anchoredDraggable(
                                 state = state,
                                 orientation = Orientation.Horizontal,
                                 overscrollEffect = overscrollEffect
                             )
-                            .offset {
-                                IntOffset(
-                                    state
-                                        .requireOffset()
-                                        .roundToInt(), 0
-                                )
-                            }
+                            .offset { IntOffset(state.requireOffset().roundToInt(), 0) }
                             .background(Color.Red)
                     )
                 }
@@ -193,14 +173,13 @@
         assertThat(state.offset).isEqualTo(positionA)
         assertThat(overscrollEffect.applyToFlingCalledCount).isEqualTo(0)
 
-        rule.onNodeWithTag(AnchoredDraggableTestTag)
-            .performTouchInput {
-                swipeWithVelocity(
-                    start = Offset(left, 0f),
-                    end = Offset(right / 2, 0f),
-                    endVelocity = endVelocity
-                )
-            }
+        rule.onNodeWithTag(AnchoredDraggableTestTag).performTouchInput {
+            swipeWithVelocity(
+                start = Offset(left, 0f),
+                end = Offset(right / 2, 0f),
+                endVelocity = endVelocity
+            )
+        }
 
         rule.waitForIdle()
 
@@ -214,7 +193,8 @@
         // [flingOverscrollVelocity] would be slightly less than [endVelocity] as one animation
         // frame would be executed, which consumes some velocity
         assertThat(abs(overscrollEffect.flingOverscrollVelocity.x))
-            .isWithin(endVelocity * 0.005f).of(endVelocity)
+            .isWithin(endVelocity * 0.005f)
+            .of(endVelocity)
     }
 
     @Test
@@ -222,43 +202,34 @@
         val positionalThreshold = 0.5f
         val absThreshold = abs(positionalThreshold)
         val overscrollEffect = TestOverscrollEffect()
-        val state = AnchoredDraggableState(
-            initialValue = A,
-            positionalThreshold = { distance -> absThreshold * distance },
-            velocityThreshold = DefaultVelocityThreshold,
-            snapAnimationSpec = tween(),
-            decayAnimationSpec = DefaultDecayAnimationSpec,
-            anchors = DraggableAnchors {
-                A at 0f
-                B at 250f
-                C at 500f
-            }
-        )
+        val state =
+            AnchoredDraggableState(
+                initialValue = A,
+                positionalThreshold = { distance -> absThreshold * distance },
+                velocityThreshold = DefaultVelocityThreshold,
+                snapAnimationSpec = tween(),
+                decayAnimationSpec = DefaultDecayAnimationSpec,
+                anchors =
+                    DraggableAnchors {
+                        A at 0f
+                        B at 250f
+                        C at 500f
+                    }
+            )
 
         rule.setContent {
             CompositionLocalProvider(LocalDensity provides NoOpDensity) {
                 WithTouchSlop(0f) {
-                    Box(
-                        Modifier
-                            .fillMaxSize()
-                            .overscroll(overscrollEffect)
-                    ) {
+                    Box(Modifier.fillMaxSize().overscroll(overscrollEffect)) {
                         Box(
-                            Modifier
-                                .requiredSize(AnchoredDraggableBoxSize)
+                            Modifier.requiredSize(AnchoredDraggableBoxSize)
                                 .testTag(AnchoredDraggableTestTag)
                                 .anchoredDraggable(
                                     state = state,
                                     orientation = Orientation.Horizontal,
                                     overscrollEffect = overscrollEffect
                                 )
-                                .offset {
-                                    IntOffset(
-                                        state
-                                            .requireOffset()
-                                            .roundToInt(), 0
-                                    )
-                                }
+                                .offset { IntOffset(state.requireOffset().roundToInt(), 0) }
                                 .background(Color.Red)
                         )
                     }
@@ -276,14 +247,9 @@
         assertThat(state.offset).isEqualTo(positionA)
         assertThat(overscrollEffect.applyToFlingCalledCount).isEqualTo(0)
 
-        rule.onNodeWithTag(AnchoredDraggableTestTag)
-            .performTouchInput {
-                swipeWithVelocity(
-                    start = Offset(0f, 0f),
-                    end = Offset(delta, 0f),
-                    endVelocity = 4000f
-                )
-            }
+        rule.onNodeWithTag(AnchoredDraggableTestTag).performTouchInput {
+            swipeWithVelocity(start = Offset(0f, 0f), end = Offset(delta, 0f), endVelocity = 4000f)
+        }
 
         rule.waitForIdle()
 
@@ -301,41 +267,32 @@
     @Test
     fun anchoredDraggable_swipeWithVelocity_notEnoughVelocityForOverscroll() {
         val overscrollEffect = TestOverscrollEffect()
-        val state = AnchoredDraggableState(
-            initialValue = A,
-            positionalThreshold = DefaultPositionalThreshold,
-            velocityThreshold = DefaultVelocityThreshold,
-            snapAnimationSpec = tween(),
-            decayAnimationSpec = DefaultDecayAnimationSpec,
-            anchors = DraggableAnchors {
-                A at 0f
-                B at 250f
-            }
-        )
+        val state =
+            AnchoredDraggableState(
+                initialValue = A,
+                positionalThreshold = DefaultPositionalThreshold,
+                velocityThreshold = DefaultVelocityThreshold,
+                snapAnimationSpec = tween(),
+                decayAnimationSpec = DefaultDecayAnimationSpec,
+                anchors =
+                    DraggableAnchors {
+                        A at 0f
+                        B at 250f
+                    }
+            )
 
         rule.setContent {
             WithTouchSlop(0f) {
-                Box(
-                    Modifier
-                        .fillMaxSize()
-                        .overscroll(overscrollEffect)
-                ) {
+                Box(Modifier.fillMaxSize().overscroll(overscrollEffect)) {
                     Box(
-                        Modifier
-                            .requiredSize(AnchoredDraggableBoxSize)
+                        Modifier.requiredSize(AnchoredDraggableBoxSize)
                             .testTag(AnchoredDraggableTestTag)
                             .anchoredDraggable(
                                 state = state,
                                 orientation = Orientation.Horizontal,
                                 overscrollEffect = overscrollEffect
                             )
-                            .offset {
-                                IntOffset(
-                                    state
-                                        .requireOffset()
-                                        .roundToInt(), 0
-                                )
-                            }
+                            .offset { IntOffset(state.requireOffset().roundToInt(), 0) }
                             .background(Color.Red)
                     )
                 }
@@ -349,14 +306,9 @@
         assertThat(state.offset).isEqualTo(positionA)
         assertThat(overscrollEffect.applyToFlingCalledCount).isEqualTo(0)
 
-        rule.onNodeWithTag(AnchoredDraggableTestTag)
-            .performTouchInput {
-                swipeWithVelocity(
-                    start = Offset(left, 0f),
-                    end = Offset(right, 0f),
-                    endVelocity = 0f
-                )
-            }
+        rule.onNodeWithTag(AnchoredDraggableTestTag).performTouchInput {
+            swipeWithVelocity(start = Offset(left, 0f), end = Offset(right, 0f), endVelocity = 0f)
+        }
 
         rule.waitForIdle()
 
@@ -419,7 +371,8 @@
     override val effectModifier: Modifier = Modifier
 }
 
-private val NoOpDensity = object : Density {
-    override val density = 1f
-    override val fontScale = 1f
-}
+private val NoOpDensity =
+    object : Density {
+        override val density = 1f
+        override val fontScale = 1f
+    }
diff --git a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/anchoredDraggable/AnchoredDraggableStateTest.kt b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/anchoredDraggable/AnchoredDraggableStateTest.kt
index 626442f..b874fb0 100644
--- a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/anchoredDraggable/AnchoredDraggableStateTest.kt
+++ b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/anchoredDraggable/AnchoredDraggableStateTest.kt
@@ -95,31 +95,27 @@
 @OptIn(ExperimentalFoundationApi::class)
 class AnchoredDraggableStateTest {
 
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
     private val AnchoredDraggableTestTag = "dragbox"
     private val AnchoredDraggableBoxSize = 200.dp
 
     @Test
     fun anchoredDraggable_state_canSkipStateByFling() {
-        val state = AnchoredDraggableState(
-            initialValue = A,
-            positionalThreshold = defaultPositionalThreshold,
-            velocityThreshold = defaultVelocityThreshold,
-            snapAnimationSpec = defaultAnimationSpec,
-            decayAnimationSpec = defaultDecayAnimationSpec
-        )
+        val state =
+            AnchoredDraggableState(
+                initialValue = A,
+                positionalThreshold = defaultPositionalThreshold,
+                velocityThreshold = defaultVelocityThreshold,
+                snapAnimationSpec = defaultAnimationSpec,
+                decayAnimationSpec = defaultDecayAnimationSpec
+            )
         rule.setContent {
             Box(Modifier.fillMaxSize()) {
                 Box(
-                    Modifier
-                        .requiredSize(AnchoredDraggableBoxSize)
+                    Modifier.requiredSize(AnchoredDraggableBoxSize)
                         .testTag(AnchoredDraggableTestTag)
-                        .anchoredDraggable(
-                            state = state,
-                            orientation = Orientation.Vertical
-                        )
+                        .anchoredDraggable(state = state, orientation = Orientation.Vertical)
                         .onSizeChanged { layoutSize ->
                             state.updateAnchors(
                                 DraggableAnchors {
@@ -129,20 +125,13 @@
                                 }
                             )
                         }
-                        .offset {
-                            IntOffset(
-                                state
-                                    .requireOffset()
-                                    .roundToInt(), 0
-                            )
-                        }
+                        .offset { IntOffset(state.requireOffset().roundToInt(), 0) }
                         .background(Color.Red)
                 )
             }
         }
 
-        rule.onNodeWithTag(AnchoredDraggableTestTag)
-            .performTouchInput { swipeDown() }
+        rule.onNodeWithTag(AnchoredDraggableTestTag).performTouchInput { swipeDown() }
 
         rule.waitForIdle()
 
@@ -151,23 +140,20 @@
 
     @Test
     fun anchoredDraggable_targetState_updatedOnSwipe() {
-        val state = AnchoredDraggableState(
-            initialValue = A,
-            positionalThreshold = defaultPositionalThreshold,
-            velocityThreshold = defaultVelocityThreshold,
-            snapAnimationSpec = defaultAnimationSpec,
-            decayAnimationSpec = defaultDecayAnimationSpec
-        )
+        val state =
+            AnchoredDraggableState(
+                initialValue = A,
+                positionalThreshold = defaultPositionalThreshold,
+                velocityThreshold = defaultVelocityThreshold,
+                snapAnimationSpec = defaultAnimationSpec,
+                decayAnimationSpec = defaultDecayAnimationSpec
+            )
         rule.setContent {
             Box(Modifier.fillMaxSize()) {
                 Box(
-                    Modifier
-                        .requiredSize(AnchoredDraggableBoxSize)
+                    Modifier.requiredSize(AnchoredDraggableBoxSize)
                         .testTag(AnchoredDraggableTestTag)
-                        .anchoredDraggable(
-                            state = state,
-                            orientation = Orientation.Vertical
-                        )
+                        .anchoredDraggable(state = state, orientation = Orientation.Vertical)
                         .onSizeChanged { layoutSize ->
                             state.updateAnchors(
                                 DraggableAnchors {
@@ -177,42 +163,41 @@
                                 }
                             )
                         }
-                        .offset {
-                            IntOffset(
-                                state
-                                    .requireOffset()
-                                    .roundToInt(), 0
-                            )
-                        }
+                        .offset { IntOffset(state.requireOffset().roundToInt(), 0) }
                         .background(Color.Red)
                 )
             }
         }
 
-        rule.onNodeWithTag(AnchoredDraggableTestTag)
-            .performTouchInput { swipeDown(endY = bottom * 0.45f) }
+        rule.onNodeWithTag(AnchoredDraggableTestTag).performTouchInput {
+            swipeDown(endY = bottom * 0.45f)
+        }
         rule.waitForIdle()
         assertThat(state.targetValue).isEqualTo(B)
 
         // Assert that swipe below threshold upward settles at current state
-        rule.onNodeWithTag(AnchoredDraggableTestTag)
-            .performTouchInput { swipeUp(endY = bottom * 0.95f, durationMillis = 1000) }
+        rule.onNodeWithTag(AnchoredDraggableTestTag).performTouchInput {
+            swipeUp(endY = bottom * 0.95f, durationMillis = 1000)
+        }
         rule.waitForIdle()
         assertThat(state.targetValue).isEqualTo(B)
 
         // Assert that swipe below threshold downward settles at current state
-        rule.onNodeWithTag(AnchoredDraggableTestTag)
-            .performTouchInput { swipeDown(endY = bottom * 0.05f) }
+        rule.onNodeWithTag(AnchoredDraggableTestTag).performTouchInput {
+            swipeDown(endY = bottom * 0.05f)
+        }
         rule.waitForIdle()
         assertThat(state.targetValue).isEqualTo(B)
 
-        rule.onNodeWithTag(AnchoredDraggableTestTag)
-            .performTouchInput { swipeDown(endY = bottom * 0.9f) }
+        rule.onNodeWithTag(AnchoredDraggableTestTag).performTouchInput {
+            swipeDown(endY = bottom * 0.9f)
+        }
         rule.waitForIdle()
         assertThat(state.targetValue).isEqualTo(C)
 
-        rule.onNodeWithTag(AnchoredDraggableTestTag)
-            .performTouchInput { swipeUp(endY = top * 1.1f) }
+        rule.onNodeWithTag(AnchoredDraggableTestTag).performTouchInput {
+            swipeUp(endY = top * 1.1f)
+        }
         rule.waitForIdle()
         assertThat(state.targetValue).isEqualTo(A)
     }
@@ -222,25 +207,22 @@
         rule.mainClock.autoAdvance = false
         val animationDuration = 300
         val frameLengthMillis = 16L
-        val state = AnchoredDraggableState(
-            initialValue = A,
-            snapAnimationSpec = tween(animationDuration, easing = LinearEasing),
-            positionalThreshold = { distance -> distance * 0.5f },
-            velocityThreshold = defaultVelocityThreshold,
-            decayAnimationSpec = defaultDecayAnimationSpec
-        )
+        val state =
+            AnchoredDraggableState(
+                initialValue = A,
+                snapAnimationSpec = tween(animationDuration, easing = LinearEasing),
+                positionalThreshold = { distance -> distance * 0.5f },
+                velocityThreshold = defaultVelocityThreshold,
+                decayAnimationSpec = defaultDecayAnimationSpec
+            )
         lateinit var scope: CoroutineScope
         rule.setContent {
             scope = rememberCoroutineScope()
             Box(Modifier.fillMaxSize()) {
                 Box(
-                    Modifier
-                        .requiredSize(AnchoredDraggableBoxSize)
+                    Modifier.requiredSize(AnchoredDraggableBoxSize)
                         .testTag(AnchoredDraggableTestTag)
-                        .anchoredDraggable(
-                            state = state,
-                            orientation = Orientation.Vertical
-                        )
+                        .anchoredDraggable(state = state, orientation = Orientation.Vertical)
                         .onSizeChanged { layoutSize ->
                             state.updateAnchors(
                                 DraggableAnchors {
@@ -250,55 +232,41 @@
                                 }
                             )
                         }
-                        .offset {
-                            IntOffset(
-                                state
-                                    .requireOffset()
-                                    .roundToInt(), 0
-                            )
-                        }
+                        .offset { IntOffset(state.requireOffset().roundToInt(), 0) }
                         .background(Color.Red)
                 )
             }
         }
 
-        scope.launch {
-            state.animateTo(targetValue = B)
-        }
+        scope.launch { state.animateTo(targetValue = B) }
         rule.mainClock.advanceTimeBy(1 * frameLengthMillis)
 
-        assertWithMessage("Current state")
-            .that(state.currentValue)
-            .isEqualTo(A)
-        assertWithMessage("Target state")
-            .that(state.targetValue)
-            .isEqualTo(B)
+        assertWithMessage("Current state").that(state.currentValue).isEqualTo(A)
+        assertWithMessage("Target state").that(state.targetValue).isEqualTo(B)
 
         rule.mainClock.autoAdvance = true
         rule.waitForIdle()
 
-        assertWithMessage("Current state")
-            .that(state.currentValue)
-            .isEqualTo(B)
-        assertWithMessage("Target state")
-            .that(state.targetValue)
-            .isEqualTo(B)
+        assertWithMessage("Current state").that(state.currentValue).isEqualTo(B)
+        assertWithMessage("Target state").that(state.targetValue).isEqualTo(B)
     }
 
     @Test
     fun anchoredDraggable_targetState_updatedWithDeltaDispatch() {
-        val state = AnchoredDraggableState(
-            initialValue = A,
-            positionalThreshold = { it / 2f },
-            velocityThreshold = defaultVelocityThreshold,
-            snapAnimationSpec = tween(),
-            decayAnimationSpec = defaultDecayAnimationSpec,
-            anchors = DraggableAnchors {
-                A at 0f
-                B at 200f
-                C at 400f
-            }
-        )
+        val state =
+            AnchoredDraggableState(
+                initialValue = A,
+                positionalThreshold = { it / 2f },
+                velocityThreshold = defaultVelocityThreshold,
+                snapAnimationSpec = tween(),
+                decayAnimationSpec = defaultDecayAnimationSpec,
+                anchors =
+                    DraggableAnchors {
+                        A at 0f
+                        B at 200f
+                        C at 400f
+                    }
+            )
 
         val initialOffset = state.requireOffset()
 
@@ -341,18 +309,20 @@
     @Test
     fun anchoredDraggable_currentValue_updatedWithDeltaDispatch() =
         runBlocking(AutoTestFrameClock()) {
-            val state = AnchoredDraggableState(
-                initialValue = A,
-                positionalThreshold = defaultPositionalThreshold,
-                velocityThreshold = defaultVelocityThreshold,
-                snapAnimationSpec = defaultAnimationSpec,
-                decayAnimationSpec = defaultDecayAnimationSpec,
-                anchors = DraggableAnchors {
-                    A at 0f
-                    B at 20f
-                    C at 40f
-                }
-            )
+            val state =
+                AnchoredDraggableState(
+                    initialValue = A,
+                    positionalThreshold = defaultPositionalThreshold,
+                    velocityThreshold = defaultVelocityThreshold,
+                    snapAnimationSpec = defaultAnimationSpec,
+                    decayAnimationSpec = defaultDecayAnimationSpec,
+                    anchors =
+                        DraggableAnchors {
+                            A at 0f
+                            B at 20f
+                            C at 40f
+                        }
+                )
 
             state.testProgression(from = A, to = B, valueUnderTest = { currentValue })
             state.testProgression(from = B, to = C, valueUnderTest = { currentValue })
@@ -366,25 +336,22 @@
         val animationDuration = 320
         val frameLengthMillis = 16
         val amountOfFramesForAnimation = animationDuration / frameLengthMillis
-        val state = AnchoredDraggableState(
-            initialValue = A,
-            snapAnimationSpec = tween(animationDuration, easing = LinearEasing),
-            positionalThreshold = { distance -> distance * 0.5f },
-            velocityThreshold = defaultVelocityThreshold,
-            decayAnimationSpec = defaultDecayAnimationSpec
-        )
+        val state =
+            AnchoredDraggableState(
+                initialValue = A,
+                snapAnimationSpec = tween(animationDuration, easing = LinearEasing),
+                positionalThreshold = { distance -> distance * 0.5f },
+                velocityThreshold = defaultVelocityThreshold,
+                decayAnimationSpec = defaultDecayAnimationSpec
+            )
         lateinit var scope: CoroutineScope
         rule.setContent {
             scope = rememberCoroutineScope()
             Box(Modifier.fillMaxSize()) {
                 Box(
-                    Modifier
-                        .requiredSize(AnchoredDraggableBoxSize)
+                    Modifier.requiredSize(AnchoredDraggableBoxSize)
                         .testTag(AnchoredDraggableTestTag)
-                        .anchoredDraggable(
-                            state = state,
-                            orientation = Orientation.Vertical
-                        )
+                        .anchoredDraggable(state = state, orientation = Orientation.Vertical)
                         .onSizeChanged { layoutSize ->
                             state.updateAnchors(
                                 DraggableAnchors {
@@ -394,13 +361,7 @@
                                 }
                             )
                         }
-                        .offset {
-                            IntOffset(
-                                state
-                                    .requireOffset()
-                                    .roundToInt(), 0
-                            )
-                        }
+                        .offset { IntOffset(state.requireOffset().roundToInt(), 0) }
                         .background(Color.Red)
                 )
             }
@@ -442,23 +403,20 @@
 
     @Test
     fun anchoredDraggable_snapTo_updatesImmediately() = runBlocking {
-        val state = AnchoredDraggableState(
-            initialValue = A,
-            positionalThreshold = defaultPositionalThreshold,
-            velocityThreshold = defaultVelocityThreshold,
-            snapAnimationSpec = defaultAnimationSpec,
-            decayAnimationSpec = defaultDecayAnimationSpec
-        )
+        val state =
+            AnchoredDraggableState(
+                initialValue = A,
+                positionalThreshold = defaultPositionalThreshold,
+                velocityThreshold = defaultVelocityThreshold,
+                snapAnimationSpec = defaultAnimationSpec,
+                decayAnimationSpec = defaultDecayAnimationSpec
+            )
         rule.setContent {
             Box(Modifier.fillMaxSize()) {
                 Box(
-                    Modifier
-                        .requiredSize(AnchoredDraggableBoxSize)
+                    Modifier.requiredSize(AnchoredDraggableBoxSize)
                         .testTag(AnchoredDraggableTestTag)
-                        .anchoredDraggable(
-                            state = state,
-                            orientation = Orientation.Vertical
-                        )
+                        .anchoredDraggable(state = state, orientation = Orientation.Vertical)
                         .onSizeChanged { layoutSize ->
                             state.updateAnchors(
                                 DraggableAnchors {
@@ -468,21 +426,14 @@
                                 }
                             )
                         }
-                        .offset {
-                            IntOffset(
-                                state
-                                    .requireOffset()
-                                    .roundToInt(), 0
-                            )
-                        }
+                        .offset { IntOffset(state.requireOffset().roundToInt(), 0) }
                         .background(Color.Red)
                 )
             }
         }
 
         state.snapTo(C)
-        assertThat(state.currentValue)
-            .isEqualTo(C)
+        assertThat(state.currentValue).isEqualTo(C)
     }
 
     @Test
@@ -491,13 +442,14 @@
 
         val initialState = C
         val snapAnimationSpec = tween<Float>(durationMillis = 1000)
-        val state = AnchoredDraggableState(
-            initialValue = initialState,
-            positionalThreshold = defaultPositionalThreshold,
-            velocityThreshold = defaultVelocityThreshold,
-            snapAnimationSpec = snapAnimationSpec,
-            decayAnimationSpec = defaultDecayAnimationSpec
-        )
+        val state =
+            AnchoredDraggableState(
+                initialValue = initialState,
+                positionalThreshold = defaultPositionalThreshold,
+                velocityThreshold = defaultVelocityThreshold,
+                snapAnimationSpec = snapAnimationSpec,
+                decayAnimationSpec = defaultDecayAnimationSpec
+            )
         lateinit var scope: CoroutineScope
 
         restorationTester.setContent {
@@ -518,9 +470,7 @@
         assertThat(state.currentValue).isEqualTo(initialState)
         assertThat(state.snapAnimationSpec).isEqualTo(snapAnimationSpec)
 
-        scope.launch {
-            state.animateTo(B)
-        }
+        scope.launch { state.animateTo(B) }
         rule.waitForIdle()
         assertThat(state.currentValue).isEqualTo(B)
 
@@ -541,18 +491,12 @@
                     decayAnimationSpec = defaultDecayAnimationSpec
                 )
             }
-            LaunchedEffect(state.targetValue) {
-                targetState = state.targetValue
-            }
+            LaunchedEffect(state.targetValue) { targetState = state.targetValue }
             Box(Modifier.fillMaxSize()) {
                 Box(
-                    Modifier
-                        .requiredSize(AnchoredDraggableBoxSize)
+                    Modifier.requiredSize(AnchoredDraggableBoxSize)
                         .testTag(AnchoredDraggableTestTag)
-                        .anchoredDraggable(
-                            state = state,
-                            orientation = Orientation.Horizontal
-                        )
+                        .anchoredDraggable(state = state, orientation = Orientation.Horizontal)
                         .onSizeChanged { layoutSize ->
                             state.updateAnchors(
                                 DraggableAnchors {
@@ -562,13 +506,7 @@
                                 }
                             )
                         }
-                        .offset {
-                            IntOffset(
-                                state
-                                    .requireOffset()
-                                    .roundToInt(), 0
-                            )
-                        }
+                        .offset { IntOffset(state.requireOffset().roundToInt(), 0) }
                         .background(Color.Red)
                 )
             }
@@ -591,18 +529,12 @@
                 )
             }
             val latestProgress = state.progress(from = A, to = B)
-            LaunchedEffect(latestProgress) {
-                progress = latestProgress
-            }
+            LaunchedEffect(latestProgress) { progress = latestProgress }
             Box(Modifier.fillMaxSize()) {
                 Box(
-                    Modifier
-                        .requiredSize(AnchoredDraggableBoxSize)
+                    Modifier.requiredSize(AnchoredDraggableBoxSize)
                         .testTag(AnchoredDraggableTestTag)
-                        .anchoredDraggable(
-                            state = state,
-                            orientation = Orientation.Horizontal
-                        )
+                        .anchoredDraggable(state = state, orientation = Orientation.Horizontal)
                         .onSizeChanged { layoutSize ->
                             state.updateAnchors(
                                 DraggableAnchors {
@@ -612,13 +544,7 @@
                                 }
                             )
                         }
-                        .offset {
-                            IntOffset(
-                                state
-                                    .requireOffset()
-                                    .roundToInt(), 0
-                            )
-                        }
+                        .offset { IntOffset(state.requireOffset().roundToInt(), 0) }
                         .background(Color.Red)
                 )
             }
@@ -631,24 +557,21 @@
     @Ignore("Todo: Fix differences between tests and real code - this shouldn't work :)")
     fun anchoredDraggable_requireOffset_accessedInInitialComposition_throws() {
         var exception: Throwable? = null
-        val state = AnchoredDraggableState(
-            initialValue = B,
-            positionalThreshold = defaultPositionalThreshold,
-            velocityThreshold = defaultVelocityThreshold,
-            snapAnimationSpec = defaultAnimationSpec,
-            decayAnimationSpec = defaultDecayAnimationSpec
-        )
+        val state =
+            AnchoredDraggableState(
+                initialValue = B,
+                positionalThreshold = defaultPositionalThreshold,
+                velocityThreshold = defaultVelocityThreshold,
+                snapAnimationSpec = defaultAnimationSpec,
+                decayAnimationSpec = defaultDecayAnimationSpec
+            )
         var offset: Float? = null
         rule.setContent {
             Box(Modifier.fillMaxSize()) {
                 Box(
-                    Modifier
-                        .requiredSize(AnchoredDraggableBoxSize)
+                    Modifier.requiredSize(AnchoredDraggableBoxSize)
                         .testTag(AnchoredDraggableTestTag)
-                        .anchoredDraggable(
-                            state = state,
-                            orientation = Orientation.Horizontal
-                        )
+                        .anchoredDraggable(state = state, orientation = Orientation.Horizontal)
                         .onSizeChanged { layoutSize ->
                             state.updateAnchors(
                                 DraggableAnchors {
@@ -658,13 +581,7 @@
                                 }
                             )
                         }
-                        .offset {
-                            IntOffset(
-                                state
-                                    .requireOffset()
-                                    .roundToInt(), 0
-                            )
-                        }
+                        .offset { IntOffset(state.requireOffset().roundToInt(), 0) }
                         .background(Color.Red)
                 )
             }
@@ -711,50 +628,40 @@
         }
 
         val snapAnimationSpec = FloatSpringSpec(dampingRatio = Spring.DampingRatioHighBouncy)
-        val animationDuration = snapAnimationSpec.getDurationNanos(
-            initialValue = minBound,
-            targetValue = maxBound,
-            initialVelocity = 0f
-        ).let { TimeUnit.NANOSECONDS.toMillis(it) }
+        val animationDuration =
+            snapAnimationSpec
+                .getDurationNanos(
+                    initialValue = minBound,
+                    targetValue = maxBound,
+                    initialVelocity = 0f
+                )
+                .let { TimeUnit.NANOSECONDS.toMillis(it) }
 
-        val state = AnchoredDraggableState(
-            initialValue = A,
-            positionalThreshold = defaultPositionalThreshold,
-            velocityThreshold = defaultVelocityThreshold,
-            snapAnimationSpec = snapAnimationSpec,
-            decayAnimationSpec = defaultDecayAnimationSpec
-        )
+        val state =
+            AnchoredDraggableState(
+                initialValue = A,
+                positionalThreshold = defaultPositionalThreshold,
+                velocityThreshold = defaultVelocityThreshold,
+                snapAnimationSpec = snapAnimationSpec,
+                decayAnimationSpec = defaultDecayAnimationSpec
+            )
         lateinit var scope: CoroutineScope
 
         rule.setContent {
             scope = rememberCoroutineScope()
-            SideEffect {
-                state.updateAnchors(anchors)
-            }
+            SideEffect { state.updateAnchors(anchors) }
             Box(Modifier.fillMaxSize()) {
                 Box(
-                    Modifier
-                        .requiredSize(AnchoredDraggableBoxSize)
+                    Modifier.requiredSize(AnchoredDraggableBoxSize)
                         .testTag(AnchoredDraggableTestTag)
-                        .anchoredDraggable(
-                            state = state,
-                            orientation = Orientation.Vertical
-                        )
-                        .offset {
-                            IntOffset(
-                                state
-                                    .requireOffset()
-                                    .roundToInt(), 0
-                            )
-                        }
+                        .anchoredDraggable(state = state, orientation = Orientation.Vertical)
+                        .offset { IntOffset(state.requireOffset().roundToInt(), 0) }
                         .background(Color.Red)
                 )
             }
         }
 
-        scope.launch {
-            state.animateTo(C)
-        }
+        scope.launch { state.animateTo(C) }
         var highestOffset = 0f
         for (i in 0..animationDuration step 16) {
             highestOffset = state.requireOffset()
@@ -765,13 +672,14 @@
 
     @Test
     fun anchoredDraggable_targetNotInAnchors_animateTo_updatesCurrentValue() {
-        val state = AnchoredDraggableState(
-            initialValue = A,
-            positionalThreshold = defaultPositionalThreshold,
-            velocityThreshold = defaultVelocityThreshold,
-            snapAnimationSpec = defaultAnimationSpec,
-            decayAnimationSpec = defaultDecayAnimationSpec
-        )
+        val state =
+            AnchoredDraggableState(
+                initialValue = A,
+                positionalThreshold = defaultPositionalThreshold,
+                velocityThreshold = defaultVelocityThreshold,
+                snapAnimationSpec = defaultAnimationSpec,
+                decayAnimationSpec = defaultDecayAnimationSpec
+            )
         assertThat(state.anchors.size).isEqualTo(0)
         assertThat(state.currentValue).isEqualTo(A)
         runBlocking { state.animateTo(B) }
@@ -780,13 +688,14 @@
 
     @Test
     fun anchoredDraggable_targetNotInAnchors_snapTo_updatesCurrentValue() {
-        val state = AnchoredDraggableState(
-            initialValue = A,
-            positionalThreshold = defaultPositionalThreshold,
-            velocityThreshold = defaultVelocityThreshold,
-            snapAnimationSpec = defaultAnimationSpec,
-            decayAnimationSpec = defaultDecayAnimationSpec
-        )
+        val state =
+            AnchoredDraggableState(
+                initialValue = A,
+                positionalThreshold = defaultPositionalThreshold,
+                velocityThreshold = defaultVelocityThreshold,
+                snapAnimationSpec = defaultAnimationSpec,
+                decayAnimationSpec = defaultDecayAnimationSpec
+            )
         assertThat(state.anchors.size).isEqualTo(0)
         assertThat(state.currentValue).isEqualTo(A)
         runBlocking { state.snapTo(B) }
@@ -795,13 +704,14 @@
 
     @Test
     fun anchoredDraggable_updateAnchors_noOngoingDrag_shouldUpdateOffset() {
-        val anchoredDraggableState = AnchoredDraggableState(
-            initialValue = A,
-            positionalThreshold = defaultPositionalThreshold,
-            velocityThreshold = defaultVelocityThreshold,
-            snapAnimationSpec = defaultAnimationSpec,
-            decayAnimationSpec = defaultDecayAnimationSpec
-        )
+        val anchoredDraggableState =
+            AnchoredDraggableState(
+                initialValue = A,
+                positionalThreshold = defaultPositionalThreshold,
+                velocityThreshold = defaultVelocityThreshold,
+                snapAnimationSpec = defaultAnimationSpec,
+                decayAnimationSpec = defaultDecayAnimationSpec
+            )
 
         assertThat(anchoredDraggableState.currentValue).isEqualTo(A)
         assertThat(anchoredDraggableState.targetValue).isEqualTo(A)
@@ -809,10 +719,11 @@
 
         val offsetAtB = 100f
         anchoredDraggableState.updateAnchors(
-            newAnchors = DraggableAnchors {
-                A at 0f
-                B at offsetAtB
-            },
+            newAnchors =
+                DraggableAnchors {
+                    A at 0f
+                    B at offsetAtB
+                },
             newTarget = B
         )
         assertThat(anchoredDraggableState.currentValue).isEqualTo(B)
@@ -824,13 +735,14 @@
     @Test
     fun anchoredDraggable_updateAnchors_ongoingDrag_shouldRestartDrag() = runTest {
         // Given an anchored draggable state
-        val anchoredDraggableState = AnchoredDraggableState(
-            initialValue = 1,
-            defaultPositionalThreshold,
-            defaultVelocityThreshold,
-            snapAnimationSpec = defaultAnimationSpec,
-            decayAnimationSpec = defaultDecayAnimationSpec
-        )
+        val anchoredDraggableState =
+            AnchoredDraggableState(
+                initialValue = 1,
+                defaultPositionalThreshold,
+                defaultVelocityThreshold,
+                snapAnimationSpec = defaultAnimationSpec,
+                decayAnimationSpec = defaultDecayAnimationSpec
+            )
 
         val anchorUpdates = Channel<DraggableAnchors<Int>>()
         val dragJob = launch {
@@ -848,9 +760,7 @@
             1 at 100f
             2 at 200f
         }
-        Snapshot.withMutableSnapshot {
-            anchoredDraggableState.updateAnchors(newAnchors)
-        }
+        Snapshot.withMutableSnapshot { anchoredDraggableState.updateAnchors(newAnchors) }
 
         // Then the block should be invoked with the new anchors
         assertThat(dragJob.isActive).isTrue()
@@ -863,21 +773,23 @@
     @Test
     fun anchoredDraggable_updateAnchors_anchoredDrag_invokedWithLatestAnchors() = runTest {
         // Given an anchored draggable state
-        val anchoredDraggableState = AnchoredDraggableState(
-            initialValue = 1,
-            defaultPositionalThreshold,
-            defaultVelocityThreshold,
-            snapAnimationSpec = defaultAnimationSpec,
-            decayAnimationSpec = defaultDecayAnimationSpec
-        )
+        val anchoredDraggableState =
+            AnchoredDraggableState(
+                initialValue = 1,
+                defaultPositionalThreshold,
+                defaultVelocityThreshold,
+                snapAnimationSpec = defaultAnimationSpec,
+                decayAnimationSpec = defaultDecayAnimationSpec
+            )
 
         val anchorUpdates = Channel<DraggableAnchors<Int>>()
-        val dragJob = launch(Dispatchers.Unconfined) {
-            anchoredDraggableState.anchoredDrag { newAnchors ->
-                anchorUpdates.send(newAnchors)
-                suspendIndefinitely()
+        val dragJob =
+            launch(Dispatchers.Unconfined) {
+                anchoredDraggableState.anchoredDrag { newAnchors ->
+                    anchorUpdates.send(newAnchors)
+                    suspendIndefinitely()
+                }
             }
-        }
 
         val firstAnchors = anchorUpdates.receive()
         assertThat(firstAnchors.size).isZero()
@@ -887,9 +799,7 @@
             1 at 100f
             2 at 200f
         }
-        Snapshot.withMutableSnapshot {
-            anchoredDraggableState.updateAnchors(newAnchors)
-        }
+        Snapshot.withMutableSnapshot { anchoredDraggableState.updateAnchors(newAnchors) }
 
         // Then the block should be invoked with the new anchors
         assertThat(dragJob.isActive).isTrue()
@@ -901,13 +811,14 @@
     @OptIn(ExperimentalCoroutinesApi::class)
     @Test
     fun anchoredDraggable_updateAnchors_anchoredDrag_invokedWithLatestTarget() = runTest {
-        val anchoredDraggableState = AnchoredDraggableState(
-            initialValue = A,
-            defaultPositionalThreshold,
-            defaultVelocityThreshold,
-            snapAnimationSpec = defaultAnimationSpec,
-            decayAnimationSpec = defaultDecayAnimationSpec
-        )
+        val anchoredDraggableState =
+            AnchoredDraggableState(
+                initialValue = A,
+                defaultPositionalThreshold,
+                defaultVelocityThreshold,
+                snapAnimationSpec = defaultAnimationSpec,
+                decayAnimationSpec = defaultDecayAnimationSpec
+            )
         anchoredDraggableState.updateAnchors(
             DraggableAnchors {
                 A at 0f
@@ -919,12 +830,13 @@
 
         val firstExpectedTarget = B
         val targetUpdates = Channel<AnchoredDraggableTestValue>()
-        val dragJob = launch(Dispatchers.Unconfined) {
-            anchoredDraggableState.anchoredDrag(firstExpectedTarget) { _, latestTarget ->
-                targetUpdates.send(latestTarget)
-                suspendIndefinitely()
+        val dragJob =
+            launch(Dispatchers.Unconfined) {
+                anchoredDraggableState.anchoredDrag(firstExpectedTarget) { _, latestTarget ->
+                    targetUpdates.send(latestTarget)
+                    suspendIndefinitely()
+                }
             }
-        }
 
         val firstTarget = targetUpdates.receive()
         assertThat(firstTarget).isEqualTo(firstExpectedTarget)
@@ -935,9 +847,7 @@
             A at 100f
             B at 200f
         }
-        Snapshot.withMutableSnapshot {
-            anchoredDraggableState.updateAnchors(newAnchors, newTarget)
-        }
+        Snapshot.withMutableSnapshot { anchoredDraggableState.updateAnchors(newAnchors, newTarget) }
 
         // Then the block should be invoked with the new anchors
         val secondTarget = targetUpdates.receive()
@@ -948,13 +858,14 @@
     @OptIn(ExperimentalCoroutinesApi::class)
     @Test
     fun anchoredDraggable_dragCompletesExceptionally_cleansUp() = runTest {
-        val anchoredDraggableState = AnchoredDraggableState(
-            initialValue = A,
-            defaultPositionalThreshold,
-            defaultVelocityThreshold,
-            snapAnimationSpec = defaultAnimationSpec,
-            decayAnimationSpec = defaultDecayAnimationSpec
-        )
+        val anchoredDraggableState =
+            AnchoredDraggableState(
+                initialValue = A,
+                defaultPositionalThreshold,
+                defaultVelocityThreshold,
+                snapAnimationSpec = defaultAnimationSpec,
+                decayAnimationSpec = defaultDecayAnimationSpec
+            )
         val cancellationSignal = CompletableDeferred(false)
         val anchoredDragUpdates = Channel<Unit>()
         val dragJob = launch {
@@ -974,42 +885,41 @@
 
     @Test
     fun anchoredDraggable_customDrag_doesNotSnapToClosestAnchor() = runBlocking {
-        val state = AnchoredDraggableState(
-            initialValue = A,
-            positionalThreshold = defaultPositionalThreshold,
-            velocityThreshold = defaultVelocityThreshold,
-            snapAnimationSpec = defaultAnimationSpec,
-            decayAnimationSpec = defaultDecayAnimationSpec,
-            anchors = DraggableAnchors {
-                A at 0f
-                B at 200f
-                C at 300f
-            }
-        )
+        val state =
+            AnchoredDraggableState(
+                initialValue = A,
+                positionalThreshold = defaultPositionalThreshold,
+                velocityThreshold = defaultVelocityThreshold,
+                snapAnimationSpec = defaultAnimationSpec,
+                decayAnimationSpec = defaultDecayAnimationSpec,
+                anchors =
+                    DraggableAnchors {
+                        A at 0f
+                        B at 200f
+                        C at 300f
+                    }
+            )
 
-        state.anchoredDrag {
-            dragTo(150f)
-        }
+        state.anchoredDrag { dragTo(150f) }
 
         assertThat(state.currentValue).isEqualTo(B)
         assertThat(state.requireOffset()).isEqualTo(150f)
 
-        state.anchoredDrag {
-            dragTo(260f)
-        }
+        state.anchoredDrag { dragTo(260f) }
         assertThat(state.currentValue).isEqualTo(C)
         assertThat(state.requireOffset()).isEqualTo(260f)
     }
 
     @Test
     fun anchoredDraggable_customDrag_updatesVelocity() = runBlocking {
-        val state = AnchoredDraggableState(
-            initialValue = A,
-            positionalThreshold = defaultPositionalThreshold,
-            velocityThreshold = defaultVelocityThreshold,
-            snapAnimationSpec = defaultAnimationSpec,
-            decayAnimationSpec = defaultDecayAnimationSpec
-        )
+        val state =
+            AnchoredDraggableState(
+                initialValue = A,
+                positionalThreshold = defaultPositionalThreshold,
+                velocityThreshold = defaultVelocityThreshold,
+                snapAnimationSpec = defaultAnimationSpec,
+                decayAnimationSpec = defaultDecayAnimationSpec
+            )
         val anchors = DraggableAnchors {
             A at 0f
             B at 200f
@@ -1017,9 +927,7 @@
         }
 
         state.updateAnchors(anchors)
-        state.anchoredDrag {
-            dragTo(150f, lastKnownVelocity = 454f)
-        }
+        state.anchoredDrag { dragTo(150f, lastKnownVelocity = 454f) }
         assertThat(state.lastVelocity).isEqualTo(454f)
     }
 
@@ -1028,13 +936,14 @@
         val clock = HandPumpTestFrameClock()
         val dragScope = CoroutineScope(clock)
 
-        val state = AnchoredDraggableState(
-            initialValue = A,
-            positionalThreshold = defaultPositionalThreshold,
-            velocityThreshold = defaultVelocityThreshold,
-            snapAnimationSpec = defaultAnimationSpec,
-            decayAnimationSpec = defaultDecayAnimationSpec
-        )
+        val state =
+            AnchoredDraggableState(
+                initialValue = A,
+                positionalThreshold = defaultPositionalThreshold,
+                velocityThreshold = defaultVelocityThreshold,
+                snapAnimationSpec = defaultAnimationSpec,
+                decayAnimationSpec = defaultDecayAnimationSpec
+            )
         val anchors = DraggableAnchors {
             A at 0f
             B at 200f
@@ -1045,9 +954,7 @@
         dragScope.launch(start = CoroutineStart.UNDISPATCHED) {
             state.anchoredDrag(targetValue = C) { _, _ ->
                 while (isActive) {
-                    withFrameNanos {
-                        dragTo(200f)
-                    }
+                    withFrameNanos { dragTo(200f) }
                 }
             }
         }
@@ -1063,14 +970,15 @@
             A at initialValueOffset
             B at 200f
         }
-        val state = AnchoredDraggableState(
-            initialValue = A,
-            anchors = anchors,
-            positionalThreshold = defaultPositionalThreshold,
-            velocityThreshold = defaultVelocityThreshold,
-            snapAnimationSpec = defaultAnimationSpec,
-            decayAnimationSpec = defaultDecayAnimationSpec
-        )
+        val state =
+            AnchoredDraggableState(
+                initialValue = A,
+                anchors = anchors,
+                positionalThreshold = defaultPositionalThreshold,
+                velocityThreshold = defaultVelocityThreshold,
+                snapAnimationSpec = defaultAnimationSpec,
+                decayAnimationSpec = defaultDecayAnimationSpec
+            )
         assertThat(state.anchors).isEqualTo(anchors)
         assertThat(state.offset).isEqualTo(initialValueOffset)
     }
@@ -1078,14 +986,15 @@
     @Test
     fun anchoredDraggable_constructorWithAnchors_initialValueNotInAnchors_updatesCurrentValue() {
         val anchors = DraggableAnchors { B at 200f }
-        val state = AnchoredDraggableState(
-            initialValue = A,
-            anchors = anchors,
-            positionalThreshold = defaultPositionalThreshold,
-            velocityThreshold = defaultVelocityThreshold,
-            snapAnimationSpec = defaultAnimationSpec,
-            decayAnimationSpec = defaultDecayAnimationSpec
-        )
+        val state =
+            AnchoredDraggableState(
+                initialValue = A,
+                anchors = anchors,
+                positionalThreshold = defaultPositionalThreshold,
+                velocityThreshold = defaultVelocityThreshold,
+                snapAnimationSpec = defaultAnimationSpec,
+                decayAnimationSpec = defaultDecayAnimationSpec
+            )
         assertThat(state.anchors).isEqualTo(anchors)
         assertThat(state.offset).isNaN()
     }
@@ -1094,19 +1003,18 @@
     fun anchoredDraggable_customDrag_settleOnInvalidState_shouldRespectConfirmValueChange() =
         runBlocking {
             var shouldBlockValueC = false
-            val state = AnchoredDraggableState(
-                initialValue = B,
-                positionalThreshold = defaultPositionalThreshold,
-                velocityThreshold = defaultVelocityThreshold,
-                snapAnimationSpec = defaultAnimationSpec,
-                confirmValueChange = {
-                    if (shouldBlockValueC)
-                        it != C // block state value C
-                    else
-                        true
-                },
-                decayAnimationSpec = defaultDecayAnimationSpec
-            )
+            val state =
+                AnchoredDraggableState(
+                    initialValue = B,
+                    positionalThreshold = defaultPositionalThreshold,
+                    velocityThreshold = defaultVelocityThreshold,
+                    snapAnimationSpec = defaultAnimationSpec,
+                    confirmValueChange = {
+                        if (shouldBlockValueC) it != C // block state value C
+                        else true
+                    },
+                    decayAnimationSpec = defaultDecayAnimationSpec
+                )
             val anchors = DraggableAnchors {
                 A at 0f
                 B at 200f
@@ -1114,25 +1022,19 @@
             }
 
             state.updateAnchors(anchors)
-            state.anchoredDrag {
-                dragTo(300f)
-            }
+            state.anchoredDrag { dragTo(300f) }
 
             // confirm we can actually go to C
             assertThat(state.currentValue).isEqualTo(C)
 
             // go back to B
-            state.anchoredDrag {
-                dragTo(200f)
-            }
+            state.anchoredDrag { dragTo(200f) }
             assertThat(state.currentValue).isEqualTo(B)
 
             // disallow C
             shouldBlockValueC = true
 
-            state.anchoredDrag {
-                dragTo(300f)
-            }
+            state.anchoredDrag { dragTo(300f) }
             assertThat(state.currentValue).isNotEqualTo(C)
         }
 
@@ -1143,17 +1045,19 @@
             val inspectDecayAnimationSpec =
                 InspectSplineAnimationSpec(SplineBasedFloatDecayAnimationSpec(rule.density))
             val tweenAnimationSpec = InspectSpringAnimationSpec(tween(easing = LinearEasing))
-            val state = AnchoredDraggableState(
-                initialValue = A,
-                velocityThreshold = defaultVelocityThreshold,
-                positionalThreshold = { totalDistance -> totalDistance * positionalThreshold },
-                anchors = DraggableAnchors {
-                    A at 0f
-                    B at 200f
-                },
-                snapAnimationSpec = tweenAnimationSpec,
-                decayAnimationSpec = inspectDecayAnimationSpec.generateDecayAnimationSpec()
-            )
+            val state =
+                AnchoredDraggableState(
+                    initialValue = A,
+                    velocityThreshold = defaultVelocityThreshold,
+                    positionalThreshold = { totalDistance -> totalDistance * positionalThreshold },
+                    anchors =
+                        DraggableAnchors {
+                            A at 0f
+                            B at 200f
+                        },
+                    snapAnimationSpec = tweenAnimationSpec,
+                    decayAnimationSpec = inspectDecayAnimationSpec.generateDecayAnimationSpec()
+                )
             val positionOfA = state.anchors.positionOf(A)
             val positionOfB = state.anchors.positionOf(B)
             val distance = abs(positionOfA - positionOfB)
@@ -1183,17 +1087,19 @@
             val decayAnimationSpec: DecayAnimationSpec<Float> =
                 inspectDecayAnimationSpec.generateDecayAnimationSpec()
             val tweenAnimationSpec = InspectSpringAnimationSpec(tween(easing = LinearEasing))
-            val state = AnchoredDraggableState(
-                initialValue = A,
-                velocityThreshold = defaultVelocityThreshold,
-                positionalThreshold = { totalDistance -> totalDistance * positionalThreshold },
-                anchors = DraggableAnchors {
-                    A at 0f
-                    B at 200f
-                },
-                snapAnimationSpec = tweenAnimationSpec,
-                decayAnimationSpec = decayAnimationSpec
-            )
+            val state =
+                AnchoredDraggableState(
+                    initialValue = A,
+                    velocityThreshold = defaultVelocityThreshold,
+                    positionalThreshold = { totalDistance -> totalDistance * positionalThreshold },
+                    anchors =
+                        DraggableAnchors {
+                            A at 0f
+                            B at 200f
+                        },
+                    snapAnimationSpec = tweenAnimationSpec,
+                    decayAnimationSpec = decayAnimationSpec
+                )
 
             val positionOfA = state.anchors.positionOf(A)
             val positionOfB = state.anchors.positionOf(B)
@@ -1229,17 +1135,19 @@
             val decayAnimationSpec: DecayAnimationSpec<Float> =
                 inspectDecayAnimationSpec.generateDecayAnimationSpec()
             val tweenAnimationSpec = InspectSpringAnimationSpec(tween(easing = LinearEasing))
-            val state = AnchoredDraggableState(
-                initialValue = B,
-                velocityThreshold = defaultVelocityThreshold,
-                positionalThreshold = { totalDistance -> totalDistance * positionalThreshold },
-                anchors = DraggableAnchors {
-                    A at 0f
-                    B at 200f
-                },
-                snapAnimationSpec = tweenAnimationSpec,
-                decayAnimationSpec = decayAnimationSpec
-            )
+            val state =
+                AnchoredDraggableState(
+                    initialValue = B,
+                    velocityThreshold = defaultVelocityThreshold,
+                    positionalThreshold = { totalDistance -> totalDistance * positionalThreshold },
+                    anchors =
+                        DraggableAnchors {
+                            A at 0f
+                            B at 200f
+                        },
+                    snapAnimationSpec = tweenAnimationSpec,
+                    decayAnimationSpec = decayAnimationSpec
+                )
 
             val positionOfA = state.anchors.positionOf(A)
             val positionOfB = state.anchors.positionOf(B)
@@ -1274,17 +1182,19 @@
             val decayAnimationSpec: DecayAnimationSpec<Float> =
                 inspectDecayAnimationSpec.generateDecayAnimationSpec()
             val tweenAnimationSpec = InspectSpringAnimationSpec(tween(easing = LinearEasing))
-            val state = AnchoredDraggableState(
-                initialValue = A,
-                velocityThreshold = defaultVelocityThreshold,
-                positionalThreshold = { totalDistance -> totalDistance * positionalThreshold },
-                anchors = DraggableAnchors {
-                    A at 0f
-                    B at 200f
-                },
-                snapAnimationSpec = tweenAnimationSpec,
-                decayAnimationSpec = decayAnimationSpec
-            )
+            val state =
+                AnchoredDraggableState(
+                    initialValue = A,
+                    velocityThreshold = defaultVelocityThreshold,
+                    positionalThreshold = { totalDistance -> totalDistance * positionalThreshold },
+                    anchors =
+                        DraggableAnchors {
+                            A at 0f
+                            B at 200f
+                        },
+                    snapAnimationSpec = tweenAnimationSpec,
+                    decayAnimationSpec = decayAnimationSpec
+                )
 
             val positionOfA = state.anchors.positionOf(A)
             val positionOfB = state.anchors.positionOf(B)
@@ -1319,17 +1229,19 @@
             val decayAnimationSpec: DecayAnimationSpec<Float> =
                 inspectDecayAnimationSpec.generateDecayAnimationSpec()
             val tweenAnimationSpec = InspectSpringAnimationSpec(tween(easing = LinearEasing))
-            val state = AnchoredDraggableState(
-                initialValue = B,
-                velocityThreshold = defaultVelocityThreshold,
-                positionalThreshold = { totalDistance -> totalDistance * positionalThreshold },
-                anchors = DraggableAnchors {
-                    A at 0f
-                    B at 200f
-                },
-                snapAnimationSpec = tweenAnimationSpec,
-                decayAnimationSpec = decayAnimationSpec
-            )
+            val state =
+                AnchoredDraggableState(
+                    initialValue = B,
+                    velocityThreshold = defaultVelocityThreshold,
+                    positionalThreshold = { totalDistance -> totalDistance * positionalThreshold },
+                    anchors =
+                        DraggableAnchors {
+                            A at 0f
+                            B at 200f
+                        },
+                    snapAnimationSpec = tweenAnimationSpec,
+                    decayAnimationSpec = decayAnimationSpec
+                )
 
             val positionOfA = state.anchors.positionOf(A)
             val positionOfB = state.anchors.positionOf(B)
@@ -1365,17 +1277,19 @@
             val decayAnimationSpec: DecayAnimationSpec<Float> =
                 inspectDecayAnimationSpec.generateDecayAnimationSpec()
             val tweenAnimationSpec = InspectSpringAnimationSpec(tween(easing = LinearEasing))
-            val state = AnchoredDraggableState(
-                initialValue = A,
-                velocityThreshold = { velocityPx },
-                positionalThreshold = { totalDistance -> totalDistance * positionalThreshold },
-                anchors = DraggableAnchors {
-                    A at 0f
-                    B at 200f
-                },
-                snapAnimationSpec = tweenAnimationSpec,
-                decayAnimationSpec = decayAnimationSpec
-            )
+            val state =
+                AnchoredDraggableState(
+                    initialValue = A,
+                    velocityThreshold = { velocityPx },
+                    positionalThreshold = { totalDistance -> totalDistance * positionalThreshold },
+                    anchors =
+                        DraggableAnchors {
+                            A at 0f
+                            B at 200f
+                        },
+                    snapAnimationSpec = tweenAnimationSpec,
+                    decayAnimationSpec = decayAnimationSpec
+                )
 
             val positionOfA = state.anchors.positionOf(A)
             val positionOfB = state.anchors.positionOf(B)
@@ -1415,17 +1329,19 @@
             val decayAnimationSpec: DecayAnimationSpec<Float> =
                 inspectDecayAnimationSpec.generateDecayAnimationSpec()
             val tweenAnimationSpec = InspectSpringAnimationSpec(tween(easing = LinearEasing))
-            val state = AnchoredDraggableState(
-                initialValue = B,
-                velocityThreshold = { velocityPx },
-                positionalThreshold = { totalDistance -> totalDistance * positionalThreshold },
-                anchors = DraggableAnchors {
-                    A at 0f
-                    B at 200f
-                },
-                snapAnimationSpec = tweenAnimationSpec,
-                decayAnimationSpec = decayAnimationSpec
-            )
+            val state =
+                AnchoredDraggableState(
+                    initialValue = B,
+                    velocityThreshold = { velocityPx },
+                    positionalThreshold = { totalDistance -> totalDistance * positionalThreshold },
+                    anchors =
+                        DraggableAnchors {
+                            A at 0f
+                            B at 200f
+                        },
+                    snapAnimationSpec = tweenAnimationSpec,
+                    decayAnimationSpec = decayAnimationSpec
+                )
 
             val positionOfA = state.anchors.positionOf(A)
             val positionOfB = state.anchors.positionOf(B)
@@ -1464,17 +1380,19 @@
             val decayAnimationSpec: DecayAnimationSpec<Float> =
                 inspectDecayAnimationSpec.generateDecayAnimationSpec()
             val tweenAnimationSpec = InspectSpringAnimationSpec(tween(easing = LinearEasing))
-            val state = AnchoredDraggableState(
-                initialValue = A,
-                velocityThreshold = { velocityPx },
-                positionalThreshold = { totalDistance -> totalDistance * positionalThreshold },
-                anchors = DraggableAnchors {
-                    A at 0f
-                    B at -200f
-                },
-                snapAnimationSpec = tweenAnimationSpec,
-                decayAnimationSpec = decayAnimationSpec
-            )
+            val state =
+                AnchoredDraggableState(
+                    initialValue = A,
+                    velocityThreshold = { velocityPx },
+                    positionalThreshold = { totalDistance -> totalDistance * positionalThreshold },
+                    anchors =
+                        DraggableAnchors {
+                            A at 0f
+                            B at -200f
+                        },
+                    snapAnimationSpec = tweenAnimationSpec,
+                    decayAnimationSpec = decayAnimationSpec
+                )
 
             val positionOfA = state.anchors.positionOf(A)
             val positionOfB = state.anchors.positionOf(B)
@@ -1513,17 +1431,19 @@
             val decayAnimationSpec: DecayAnimationSpec<Float> =
                 inspectDecayAnimationSpec.generateDecayAnimationSpec()
             val tweenAnimationSpec = InspectSpringAnimationSpec(tween(easing = LinearEasing))
-            val state = AnchoredDraggableState(
-                initialValue = B,
-                velocityThreshold = { velocityPx },
-                positionalThreshold = { totalDistance -> totalDistance * positionalThreshold },
-                anchors = DraggableAnchors {
-                    A at 0f
-                    B at -200f
-                },
-                snapAnimationSpec = tweenAnimationSpec,
-                decayAnimationSpec = decayAnimationSpec
-            )
+            val state =
+                AnchoredDraggableState(
+                    initialValue = B,
+                    velocityThreshold = { velocityPx },
+                    positionalThreshold = { totalDistance -> totalDistance * positionalThreshold },
+                    anchors =
+                        DraggableAnchors {
+                            A at 0f
+                            B at -200f
+                        },
+                    snapAnimationSpec = tweenAnimationSpec,
+                    decayAnimationSpec = decayAnimationSpec
+                )
 
             val positionOfA = state.anchors.positionOf(A)
             val positionOfB = state.anchors.positionOf(B)
@@ -1560,17 +1480,19 @@
             val decayAnimationSpec: DecayAnimationSpec<Float> =
                 inspectDecayAnimationSpec.generateDecayAnimationSpec()
             val tweenAnimationSpec = InspectSpringAnimationSpec(tween(easing = LinearEasing))
-            val state = AnchoredDraggableState(
-                initialValue = A,
-                positionalThreshold = defaultPositionalThreshold,
-                velocityThreshold = defaultVelocityThreshold,
-                snapAnimationSpec = tweenAnimationSpec,
-                decayAnimationSpec = decayAnimationSpec,
-                anchors = DraggableAnchors {
-                    A at 0f
-                    B at 250f
-                }
-            )
+            val state =
+                AnchoredDraggableState(
+                    initialValue = A,
+                    positionalThreshold = defaultPositionalThreshold,
+                    velocityThreshold = defaultVelocityThreshold,
+                    snapAnimationSpec = tweenAnimationSpec,
+                    decayAnimationSpec = decayAnimationSpec,
+                    anchors =
+                        DraggableAnchors {
+                            A at 0f
+                            B at 250f
+                        }
+                )
 
             val positionA = state.anchors.positionOf(A)
             val positionB = state.anchors.positionOf(B)
@@ -1595,18 +1517,20 @@
 
     @Test
     fun anchoredDraggable_animateTo_alreadyAtTarget_noOps() {
-        val state = AnchoredDraggableState(
-            initialValue = B,
-            positionalThreshold = defaultPositionalThreshold,
-            velocityThreshold = defaultVelocityThreshold,
-            snapAnimationSpec = defaultAnimationSpec,
-            decayAnimationSpec = defaultDecayAnimationSpec,
-            anchors = DraggableAnchors {
-                A at 0f
-                B at 200f
-                C at 300f
-            }
-        )
+        val state =
+            AnchoredDraggableState(
+                initialValue = B,
+                positionalThreshold = defaultPositionalThreshold,
+                velocityThreshold = defaultVelocityThreshold,
+                snapAnimationSpec = defaultAnimationSpec,
+                decayAnimationSpec = defaultDecayAnimationSpec,
+                anchors =
+                    DraggableAnchors {
+                        A at 0f
+                        B at 200f
+                        C at 300f
+                    }
+            )
         val clock = HandPumpTestFrameClock()
         val scope = CoroutineScope(clock)
 
@@ -1618,33 +1542,31 @@
 
     @Test
     fun anchoredDraggable_animateToWithDecay_alreadyAtTarget_noOps() {
-        val state = AnchoredDraggableState(
-            initialValue = B,
-            positionalThreshold = defaultPositionalThreshold,
-            velocityThreshold = defaultVelocityThreshold,
-            snapAnimationSpec = defaultAnimationSpec,
-            decayAnimationSpec = defaultDecayAnimationSpec,
-            anchors = DraggableAnchors {
-                A at 0f
-                B at 200f
-                C at 300f
-            }
-        )
+        val state =
+            AnchoredDraggableState(
+                initialValue = B,
+                positionalThreshold = defaultPositionalThreshold,
+                velocityThreshold = defaultVelocityThreshold,
+                snapAnimationSpec = defaultAnimationSpec,
+                decayAnimationSpec = defaultDecayAnimationSpec,
+                anchors =
+                    DraggableAnchors {
+                        A at 0f
+                        B at 200f
+                        C at 300f
+                    }
+            )
         val clock = HandPumpTestFrameClock()
         val scope = CoroutineScope(clock)
 
         assertThat(state.offset).isEqualTo(200f)
-        scope.launch {
-            state.animateToWithDecay(B, velocity = 100f)
-        }
+        scope.launch { state.animateToWithDecay(B, velocity = 100f) }
         runBlocking { clock.advanceByFrame() } // Advance only one frame, we should be done
         assertThat(state.offset).isEqualTo(200f)
     }
 
-    /**
-     * Test the [valueUnderTest] progressively for each delta from [from] to [to].
-     */
-    private suspend fun<T> AnchoredDraggableState<T>.testProgression(
+    /** Test the [valueUnderTest] progressively for each delta from [from] to [to]. */
+    private suspend fun <T> AnchoredDraggableState<T>.testProgression(
         valueUnderTest: AnchoredDraggableState<T>.() -> Any,
         from: T,
         to: T
@@ -1657,15 +1579,17 @@
                 dragTo(value.toFloat())
                 val expectedCurrentValue = if (value < origin + (distance / 2)) from else to
                 assertWithMessage(
-                    "Going from $from@$origin to $to@$destination (distance $distance). " +
-                        "Dragged to $value, offset is now $offset but value is unexpected."
-                ).that(valueUnderTest()).isEqualTo(expectedCurrentValue)
+                        "Going from $from@$origin to $to@$destination (distance $distance). " +
+                            "Dragged to $value, offset is now $offset but value is unexpected."
+                    )
+                    .that(valueUnderTest())
+                    .isEqualTo(expectedCurrentValue)
             }
         }
         settle(0f)
     }
 
-    private suspend fun suspendIndefinitely() = suspendCancellableCoroutine<Unit> { }
+    private suspend fun suspendIndefinitely() = suspendCancellableCoroutine<Unit> {}
 
     private class HandPumpTestFrameClock : MonotonicFrameClock {
         private val frameCh = Channel<Long>(1)
@@ -1679,9 +1603,8 @@
         }
     }
 
-    private class InspectSpringAnimationSpec(
-        private val animation: AnimationSpec<Float>
-    ) : AnimationSpec<Float> {
+    private class InspectSpringAnimationSpec(private val animation: AnimationSpec<Float>) :
+        AnimationSpec<Float> {
 
         var animationWasExecutions = 0
 
diff --git a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/anchoredDraggable/AnchoredDraggableTestValue.kt b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/anchoredDraggable/AnchoredDraggableTestValue.kt
index e238c58..c8246d0 100644
--- a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/anchoredDraggable/AnchoredDraggableTestValue.kt
+++ b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/anchoredDraggable/AnchoredDraggableTestValue.kt
@@ -16,4 +16,8 @@
 
 package androidx.compose.foundation.anchoredDraggable
 
-internal enum class AnchoredDraggableTestValue { A, B, C }
+internal enum class AnchoredDraggableTestValue {
+    A,
+    B,
+    C
+}
diff --git a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/content/ClipDataSubject.kt b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/content/ClipDataSubject.kt
index 6c176a0..513315d 100644
--- a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/content/ClipDataSubject.kt
+++ b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/content/ClipDataSubject.kt
@@ -22,17 +22,16 @@
 import com.google.common.truth.Subject
 import com.google.common.truth.Truth
 
-/**
- * Truth extension for ClipData.
- */
-internal class ClipDataSubject private constructor(
-    failureMetadata: FailureMetadata?,
-    private val subject: ClipData?
-) : Subject(failureMetadata, subject) {
+/** Truth extension for ClipData. */
+internal class ClipDataSubject
+private constructor(failureMetadata: FailureMetadata?, private val subject: ClipData?) :
+    Subject(failureMetadata, subject) {
 
     companion object {
         internal val SUBJECT_FACTORY: Factory<ClipDataSubject?, ClipData?> =
-            Factory { failureMetadata, subject -> ClipDataSubject(failureMetadata, subject) }
+            Factory { failureMetadata, subject ->
+                ClipDataSubject(failureMetadata, subject)
+            }
     }
 
     /**
@@ -40,24 +39,26 @@
      *
      * @param clipData the [ClipData] to be matched.
      */
-    fun isEqualToClipData(
-        clipData: ClipData,
-        ignoreClipDescription: Boolean = false
-    ) {
+    fun isEqualToClipData(clipData: ClipData, ignoreClipDescription: Boolean = false) {
         if (subject === clipData) return
         check("isNotNull()").that(subject).isNotNull()
         check("getItemCount()").that(subject!!.itemCount).isEqualTo(clipData.itemCount)
         for (i in 0 until subject.itemCount) {
-            check("getItemAt($i).getUri()").that(subject.getItemAt(i).uri)
+            check("getItemAt($i).getUri()")
+                .that(subject.getItemAt(i).uri)
                 .isEqualTo(clipData.getItemAt(i).uri)
-            check("getItemAt($i).getText()").that(subject.getItemAt(i).text)
+            check("getItemAt($i).getText()")
+                .that(subject.getItemAt(i).text)
                 .isEqualTo(clipData.getItemAt(i).text)
-            check("getItemAt($i).getHtmlText()").that(subject.getItemAt(i).htmlText)
+            check("getItemAt($i).getHtmlText()")
+                .that(subject.getItemAt(i).htmlText)
                 .isEqualTo(clipData.getItemAt(i).htmlText)
-            check("getItemAt($i).getIntent()").that(subject.getItemAt(i).intent)
+            check("getItemAt($i).getIntent()")
+                .that(subject.getItemAt(i).intent)
                 .isEqualTo(clipData.getItemAt(i).intent)
             if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) {
-                check("getItemAt($i).getTextLinks()").that(subject.getItemAt(i).textLinks)
+                check("getItemAt($i).getTextLinks()")
+                    .that(subject.getItemAt(i).textLinks)
                     .isEqualTo(clipData.getItemAt(i).textLinks)
             }
         }
diff --git a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/content/ClipDescriptionSubject.kt b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/content/ClipDescriptionSubject.kt
index 71f98b8..e76f8c6 100644
--- a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/content/ClipDescriptionSubject.kt
+++ b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/content/ClipDescriptionSubject.kt
@@ -22,17 +22,16 @@
 import com.google.common.truth.Subject
 import com.google.common.truth.Truth
 
-/**
- * Truth extension for ClipDescription.
- */
-internal class ClipDescriptionSubject private constructor(
-    failureMetadata: FailureMetadata?,
-    private val subject: ClipDescription?
-) : Subject(failureMetadata, subject) {
+/** Truth extension for ClipDescription. */
+internal class ClipDescriptionSubject
+private constructor(failureMetadata: FailureMetadata?, private val subject: ClipDescription?) :
+    Subject(failureMetadata, subject) {
 
     companion object {
         internal val SUBJECT_FACTORY: Factory<ClipDescriptionSubject?, ClipDescription?> =
-            Factory { failureMetadata, subject -> ClipDescriptionSubject(failureMetadata, subject) }
+            Factory { failureMetadata, subject ->
+                ClipDescriptionSubject(failureMetadata, subject)
+            }
     }
 
     /**
@@ -43,10 +42,12 @@
     fun isEqualToClipDescription(clipDescription: ClipDescription) {
         if (subject === clipDescription) return
         check("isNotNull()").that(subject).isNotNull()
-        check("getMimeTypeCount()").that(subject!!.mimeTypeCount)
+        check("getMimeTypeCount()")
+            .that(subject!!.mimeTypeCount)
             .isEqualTo(clipDescription.mimeTypeCount)
         for (i in 0 until subject.mimeTypeCount) {
-            check("getMimeType($i)").that(subject.getMimeType(i))
+            check("getMimeType($i)")
+                .that(subject.getMimeType(i))
                 .isEqualTo(clipDescription.getMimeType(i))
         }
         if (Build.VERSION.SDK_INT >= 24) {
@@ -54,9 +55,11 @@
         }
         check("getLabel()").that(subject.label).isEqualTo(clipDescription.label)
         if (Build.VERSION.SDK_INT >= 31) {
-            check("isStyledText()").that(subject.isStyledText)
+            check("isStyledText()")
+                .that(subject.isStyledText)
                 .isEqualTo(clipDescription.isStyledText)
-            check("getClassificationStatus()").that(subject.classificationStatus)
+            check("getClassificationStatus()")
+                .that(subject.classificationStatus)
                 .isEqualTo(clipDescription.classificationStatus)
         }
     }
diff --git a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/content/ReceiveContentTest.kt b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/content/ReceiveContentTest.kt
index bc469a1..7b0b81a 100644
--- a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/content/ReceiveContentTest.kt
+++ b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/content/ReceiveContentTest.kt
@@ -53,30 +53,39 @@
 @OptIn(ExperimentalFoundationApi::class, ExperimentalComposeUiApi::class)
 class ReceiveContentTest {
 
-    @get:Rule
-    val rule = createAndroidComposeRule<TestActivity>()
+    @get:Rule val rule = createAndroidComposeRule<TestActivity>()
 
     @Test
     fun receiveContentConfiguration_isMergedBottomToTop() {
         var calculatedReceiveContent: ReceiveContentConfiguration?
         val listenerCalls = mutableListOf<Int>()
         rule.setContent {
-            Box(modifier = Modifier
-                .contentReceiver { listenerCalls += 3; it }
-                .contentReceiver { listenerCalls += 2; it }
-                .contentReceiver { listenerCalls += 1; it }
-                .then(TestElement {
-                    calculatedReceiveContent = it.getReceiveContentConfiguration()
-                    calculatedReceiveContent
-                        ?.receiveContentListener
-                        ?.onReceive(TransferableContent(createClipData()))
-                })
+            Box(
+                modifier =
+                    Modifier.contentReceiver {
+                            listenerCalls += 3
+                            it
+                        }
+                        .contentReceiver {
+                            listenerCalls += 2
+                            it
+                        }
+                        .contentReceiver {
+                            listenerCalls += 1
+                            it
+                        }
+                        .then(
+                            TestElement {
+                                calculatedReceiveContent = it.getReceiveContentConfiguration()
+                                calculatedReceiveContent
+                                    ?.receiveContentListener
+                                    ?.onReceive(TransferableContent(createClipData()))
+                            }
+                        )
             )
         }
 
-        rule.runOnIdle {
-            assertThat(listenerCalls).isEqualTo(listOf(1, 2, 3))
-        }
+        rule.runOnIdle { assertThat(listenerCalls).isEqualTo(listOf(1, 2, 3)) }
     }
 
     @Test
@@ -85,110 +94,121 @@
         var audioReceived: TransferableContent? = null
         var textReceived: TransferableContent? = null
         rule.setContent {
-            Box(modifier = Modifier
-                .contentReceiver { transferable ->
-                    videoReceived = transferable
-                    transferable.consume {
-                        it.uri
-                            ?.toString()
-                            ?.contains("video") ?: false
-                    }
-                }
-                .contentReceiver { transferable ->
-                    audioReceived = transferable
-                    transferable.consume {
-                        it.uri
-                            ?.toString()
-                            ?.contains("audio") ?: false
-                    }
-                }
-                .contentReceiver { transferable ->
-                    textReceived = transferable
-                    transferable.consume { it.text != null }
-                }
-                .then(TestElement {
-                    it.getReceiveContentConfiguration()
-                        ?.receiveContentListener
-                        ?.onReceive(TransferableContent(createClipData {
-                            addText()
-                            addUri(Uri.parse("content://video"), "video/mp4")
-                            addUri(Uri.parse("content://audio"), "audio/ogg")
-                        }))
-                })
+            Box(
+                modifier =
+                    Modifier.contentReceiver { transferable ->
+                            videoReceived = transferable
+                            transferable.consume { it.uri?.toString()?.contains("video") ?: false }
+                        }
+                        .contentReceiver { transferable ->
+                            audioReceived = transferable
+                            transferable.consume { it.uri?.toString()?.contains("audio") ?: false }
+                        }
+                        .contentReceiver { transferable ->
+                            textReceived = transferable
+                            transferable.consume { it.text != null }
+                        }
+                        .then(
+                            TestElement {
+                                it.getReceiveContentConfiguration()
+                                    ?.receiveContentListener
+                                    ?.onReceive(
+                                        TransferableContent(
+                                            createClipData {
+                                                addText()
+                                                addUri(Uri.parse("content://video"), "video/mp4")
+                                                addUri(Uri.parse("content://audio"), "audio/ogg")
+                                            }
+                                        )
+                                    )
+                            }
+                        )
             )
         }
 
         rule.runOnIdle {
-            assertClipData(videoReceived!!.clipEntry.clipData).isEqualToClipData(createClipData {
-                addUri(Uri.parse("content://video"), "video/mp4")
-            }, ignoreClipDescription = true)
-            assertClipData(audioReceived!!.clipEntry.clipData).isEqualToClipData(createClipData {
-                addUri(Uri.parse("content://video"), "video/mp4")
-                addUri(Uri.parse("content://audio"), "audio/ogg")
-            }, ignoreClipDescription = true)
-            assertClipData(textReceived!!.clipEntry.clipData).isEqualToClipData(createClipData {
-                addText()
-                addUri(Uri.parse("content://video"), "video/mp4")
-                addUri(Uri.parse("content://audio"), "audio/ogg")
-            }, ignoreClipDescription = true)
+            assertClipData(videoReceived!!.clipEntry.clipData)
+                .isEqualToClipData(
+                    createClipData { addUri(Uri.parse("content://video"), "video/mp4") },
+                    ignoreClipDescription = true
+                )
+            assertClipData(audioReceived!!.clipEntry.clipData)
+                .isEqualToClipData(
+                    createClipData {
+                        addUri(Uri.parse("content://video"), "video/mp4")
+                        addUri(Uri.parse("content://audio"), "audio/ogg")
+                    },
+                    ignoreClipDescription = true
+                )
+            assertClipData(textReceived!!.clipEntry.clipData)
+                .isEqualToClipData(
+                    createClipData {
+                        addText()
+                        addUri(Uri.parse("content://video"), "video/mp4")
+                        addUri(Uri.parse("content://audio"), "audio/ogg")
+                    },
+                    ignoreClipDescription = true
+                )
         }
     }
 
     @Test
     fun receiveContentConfiguration_returnsNullIfNotDefined() {
-        var calculatedReceiveContent: ReceiveContentConfiguration? = ReceiveContentConfiguration(
-            ReceiveContentListener { null }
-        )
+        var calculatedReceiveContent: ReceiveContentConfiguration? =
+            ReceiveContentConfiguration(ReceiveContentListener { null })
         rule.setContent {
             Box(
-                modifier = Modifier.then(TestElement {
-                    calculatedReceiveContent = it.getReceiveContentConfiguration()
-                })
+                modifier =
+                    Modifier.then(
+                        TestElement {
+                            calculatedReceiveContent = it.getReceiveContentConfiguration()
+                        }
+                    )
             )
         }
 
-        rule.runOnIdle {
-            assertThat(calculatedReceiveContent).isNull()
-        }
+        rule.runOnIdle { assertThat(calculatedReceiveContent).isNull() }
     }
 
     @Test
     fun receiveContentConfiguration_returnsNullIfDefined_atSiblingNode() {
-        var calculatedReceiveContent: ReceiveContentConfiguration? = ReceiveContentConfiguration(
-            ReceiveContentListener { null }
-        )
+        var calculatedReceiveContent: ReceiveContentConfiguration? =
+            ReceiveContentConfiguration(ReceiveContentListener { null })
         rule.setContent {
             Box {
-                Box(modifier = Modifier.then(TestElement {
-                    calculatedReceiveContent = it.getReceiveContentConfiguration()
-                }))
+                Box(
+                    modifier =
+                        Modifier.then(
+                            TestElement {
+                                calculatedReceiveContent = it.getReceiveContentConfiguration()
+                            }
+                        )
+                )
                 Box(modifier = Modifier.contentReceiver { it })
             }
         }
 
-        rule.runOnIdle {
-            assertThat(calculatedReceiveContent).isNull()
-        }
+        rule.runOnIdle { assertThat(calculatedReceiveContent).isNull() }
     }
 
     @Test
     fun receiveContentConfiguration_returnsNullIfDefined_atChildNode() {
-        var calculatedReceiveContent: ReceiveContentConfiguration? = ReceiveContentConfiguration(
-            ReceiveContentListener { null }
-        )
+        var calculatedReceiveContent: ReceiveContentConfiguration? =
+            ReceiveContentConfiguration(ReceiveContentListener { null })
         rule.setContent {
             Box(
-                modifier = Modifier.then(TestElement {
-                    calculatedReceiveContent = it.getReceiveContentConfiguration()
-                })
+                modifier =
+                    Modifier.then(
+                        TestElement {
+                            calculatedReceiveContent = it.getReceiveContentConfiguration()
+                        }
+                    )
             ) {
                 Box(modifier = Modifier.contentReceiver { it })
             }
         }
 
-        rule.runOnIdle {
-            assertThat(calculatedReceiveContent).isNull()
-        }
+        rule.runOnIdle { assertThat(calculatedReceiveContent).isNull() }
     }
 
     @Test
@@ -197,28 +217,42 @@
         var attached by mutableStateOf(true)
         val called = mutableListOf<Int>()
         rule.setContent {
-            Box(modifier = Modifier
-                .contentReceiver { called += 1; it }
-                .then(if (attached) {
-                    Modifier.contentReceiver { called += 2; it }
-                } else {
-                    Modifier
-                })
-                .contentReceiver { called += 3; it }
-                .then(TestElement {
-                    getReceiveContentConfiguration = {
-                        it.getReceiveContentConfiguration()
-                    }
-                })
+            Box(
+                modifier =
+                    Modifier.contentReceiver {
+                            called += 1
+                            it
+                        }
+                        .then(
+                            if (attached) {
+                                Modifier.contentReceiver {
+                                    called += 2
+                                    it
+                                }
+                            } else {
+                                Modifier
+                            }
+                        )
+                        .contentReceiver {
+                            called += 3
+                            it
+                        }
+                        .then(
+                            TestElement {
+                                getReceiveContentConfiguration = {
+                                    it.getReceiveContentConfiguration()
+                                }
+                            }
+                        )
             )
         }
 
         rule.runOnIdle {
             val receiveContentConfiguration = getReceiveContentConfiguration?.invoke()
             assertThat(receiveContentConfiguration).isNotNull()
-            receiveContentConfiguration!!.receiveContentListener.onReceive(
-                TransferableContent(createClipData())
-            )
+            receiveContentConfiguration!!
+                .receiveContentListener
+                .onReceive(TransferableContent(createClipData()))
             assertThat(called).isEqualTo(listOf(3, 2, 1))
         }
 
@@ -228,9 +262,9 @@
         rule.runOnIdle {
             val receiveContentConfiguration = getReceiveContentConfiguration?.invoke()
             assertThat(receiveContentConfiguration).isNotNull()
-            receiveContentConfiguration!!.receiveContentListener.onReceive(
-                TransferableContent(createClipData())
-            )
+            receiveContentConfiguration!!
+                .receiveContentListener
+                .onReceive(TransferableContent(createClipData()))
             assertThat(called).isEqualTo(listOf(3, 1))
         }
     }
@@ -242,28 +276,42 @@
         val called = mutableListOf<Int>()
 
         rule.setContent {
-            Box(modifier = Modifier
-                .contentReceiver { called += 1; it }
-                .then(if (attached) {
-                    Modifier.contentReceiver { called += 2; it }
-                } else {
-                    Modifier
-                })
-                .contentReceiver { called += 3; it }
-                .then(TestElement {
-                    getReceiveContentConfiguration = {
-                        it.getReceiveContentConfiguration()
-                    }
-                })
+            Box(
+                modifier =
+                    Modifier.contentReceiver {
+                            called += 1
+                            it
+                        }
+                        .then(
+                            if (attached) {
+                                Modifier.contentReceiver {
+                                    called += 2
+                                    it
+                                }
+                            } else {
+                                Modifier
+                            }
+                        )
+                        .contentReceiver {
+                            called += 3
+                            it
+                        }
+                        .then(
+                            TestElement {
+                                getReceiveContentConfiguration = {
+                                    it.getReceiveContentConfiguration()
+                                }
+                            }
+                        )
             )
         }
 
         rule.runOnIdle {
             val receiveContentConfiguration = getReceiveContentConfiguration?.invoke()
             assertThat(receiveContentConfiguration).isNotNull()
-            receiveContentConfiguration!!.receiveContentListener.onReceive(
-                TransferableContent(createClipData())
-            )
+            receiveContentConfiguration!!
+                .receiveContentListener
+                .onReceive(TransferableContent(createClipData()))
             assertThat(called).isEqualTo(listOf(3, 1))
         }
 
@@ -273,9 +321,9 @@
         rule.runOnIdle {
             val receiveContentConfiguration = getReceiveContentConfiguration?.invoke()
             assertThat(receiveContentConfiguration).isNotNull()
-            receiveContentConfiguration!!.receiveContentListener.onReceive(
-                TransferableContent(createClipData())
-            )
+            receiveContentConfiguration!!
+                .receiveContentListener
+                .onReceive(TransferableContent(createClipData()))
             assertThat(called).isEqualTo(listOf(3, 2, 1))
         }
     }
@@ -286,22 +334,20 @@
         lateinit var view: View
         rule.setContent {
             view = LocalView.current
-            Box(modifier = Modifier
-                .size(200.dp)
-                .contentReceiver { it }
-                .size(100.dp)
-                .contentReceiver { it }
-                .size(50.dp)
-                .contentReceiver { it }
+            Box(
+                modifier =
+                    Modifier.size(200.dp)
+                        .contentReceiver { it }
+                        .size(100.dp)
+                        .contentReceiver { it }
+                        .size(50.dp)
+                        .contentReceiver { it }
             )
         }
 
         val draggingUri = Uri.parse("content://com.example/content.jpg")
         testDragAndDrop(view, rule.density) {
-            drag(
-                Offset(25.dp.toPx(), 25.dp.toPx()),
-                draggingUri
-            )
+            drag(Offset(25.dp.toPx(), 25.dp.toPx()), draggingUri)
             drop()
         }
 
@@ -318,27 +364,24 @@
         var transferableContent: TransferableContent? = null
         rule.setContent {
             view = LocalView.current
-            Box(modifier = Modifier
-                .size(100.dp)
-                .contentReceiver {
-                    transferableContent = it
-                    null // consume all
-                })
+            Box(
+                modifier =
+                    Modifier.size(100.dp).contentReceiver {
+                        transferableContent = it
+                        null // consume all
+                    }
+            )
         }
 
         val draggingUri = Uri.parse("content://com.example/content.jpg")
         testDragAndDrop(view, rule.density) {
-            drag(
-                Offset(50.dp.toPx(), 50.dp.toPx()),
-                draggingUri
-            )
+            drag(Offset(50.dp.toPx(), 50.dp.toPx()), draggingUri)
             drop()
         }
 
         rule.runOnIdle {
             assertThat(transferableContent).isNotNull()
-            assertThat(transferableContent?.clipEntry?.firstUriOrNull())
-                .isEqualTo(draggingUri)
+            assertThat(transferableContent?.clipEntry?.firstUriOrNull()).isEqualTo(draggingUri)
             assertThat(transferableContent?.source)
                 .isEqualTo(TransferableContent.Source.DragAndDrop)
         }
@@ -350,27 +393,24 @@
         var transferableContent: TransferableContent? = null
         rule.setContent {
             view = LocalView.current
-            Box(modifier = Modifier
-                .size(100.dp)
-                .contentReceiver {
-                    transferableContent = it
-                    null // consume all
-                })
+            Box(
+                modifier =
+                    Modifier.size(100.dp).contentReceiver {
+                        transferableContent = it
+                        null // consume all
+                    }
+            )
         }
 
         val draggingUri = Uri.parse("content://com.example/content.jpg")
         testDragAndDrop(view, rule.density) {
-            drag(
-                Offset(50.dp.toPx(), 50.dp.toPx()),
-                draggingUri
-            )
+            drag(Offset(50.dp.toPx(), 50.dp.toPx()), draggingUri)
             drop()
         }
 
         rule.runOnIdle {
             assertThat(transferableContent).isNotNull()
-            assertThat(transferableContent?.clipEntry?.firstUriOrNull())
-                .isEqualTo(draggingUri)
+            assertThat(transferableContent?.clipEntry?.firstUriOrNull()).isEqualTo(draggingUri)
             assertThat(transferableContent?.source)
                 .isEqualTo(TransferableContent.Source.DragAndDrop)
         }
@@ -383,28 +423,26 @@
         var parentTransferableContent: TransferableContent? = null
         rule.setContent {
             view = LocalView.current
-            Box(modifier = Modifier
-                .size(200.dp)
-                .contentReceiver {
-                    parentTransferableContent = it
-                    null
-                }) {
-                Box(modifier = Modifier
-                    .align(Alignment.Center)
-                    .size(100.dp)
-                    .contentReceiver {
-                        childTransferableContent = it
-                        it // don't consume anything
-                    })
+            Box(
+                modifier =
+                    Modifier.size(200.dp).contentReceiver {
+                        parentTransferableContent = it
+                        null
+                    }
+            ) {
+                Box(
+                    modifier =
+                        Modifier.align(Alignment.Center).size(100.dp).contentReceiver {
+                            childTransferableContent = it
+                            it // don't consume anything
+                        }
+                )
             }
         }
 
         val draggingUri = Uri.parse("content://com.example/content.jpg")
         testDragAndDrop(view, rule.density) {
-            drag(
-                Offset(100.dp.toPx(), 100.dp.toPx()),
-                draggingUri
-            )
+            drag(Offset(100.dp.toPx(), 100.dp.toPx()), draggingUri)
             drop()
         }
 
@@ -416,8 +454,7 @@
                 .isEqualTo(TransferableContent.Source.DragAndDrop)
 
             assertThat(childTransferableContent).isNotNull()
-            assertThat(childTransferableContent?.clipEntry?.firstUriOrNull())
-                .isEqualTo(draggingUri)
+            assertThat(childTransferableContent?.clipEntry?.firstUriOrNull()).isEqualTo(draggingUri)
             assertThat(childTransferableContent?.source)
                 .isEqualTo(TransferableContent.Source.DragAndDrop)
         }
@@ -431,36 +468,34 @@
         var grandParentTransferableContent: TransferableContent? = null
         rule.setContent {
             view = LocalView.current
-            Box(modifier = Modifier
-                .size(200.dp)
-                .contentReceiver {
-                    grandParentTransferableContent = it
-                    null
-                }) {
-                Box(modifier = Modifier
-                    .align(Alignment.Center)
-                    .size(100.dp)
-                    .contentReceiver {
-                        parentTransferableContent = it
-                        it // don't consume anything
-                    }) {
-                    Box(modifier = Modifier
-                        .align(Alignment.Center)
-                        .size(50.dp)
-                        .contentReceiver {
-                            childTransferableContent = it
+            Box(
+                modifier =
+                    Modifier.size(200.dp).contentReceiver {
+                        grandParentTransferableContent = it
+                        null
+                    }
+            ) {
+                Box(
+                    modifier =
+                        Modifier.align(Alignment.Center).size(100.dp).contentReceiver {
+                            parentTransferableContent = it
                             it // don't consume anything
-                        })
+                        }
+                ) {
+                    Box(
+                        modifier =
+                            Modifier.align(Alignment.Center).size(50.dp).contentReceiver {
+                                childTransferableContent = it
+                                it // don't consume anything
+                            }
+                    )
                 }
             }
         }
 
         val draggingUri = Uri.parse("content://com.example/content.jpg")
         testDragAndDrop(view, rule.density) {
-            drag(
-                Offset(60.dp.toPx(), 60.dp.toPx()),
-                draggingUri
-            )
+            drag(Offset(60.dp.toPx(), 60.dp.toPx()), draggingUri)
             drop()
         }
 
@@ -478,24 +513,26 @@
         rule.setContent {
             view = LocalView.current
             Box(
-                modifier = Modifier
-                    .size(100.dp)
-                    .contentReceiver(object : ReceiveContentListener {
-                        override fun onDragEnter() {
-                            calls += "enter"
-                        }
+                modifier =
+                    Modifier.size(100.dp)
+                        .contentReceiver(
+                            object : ReceiveContentListener {
+                                override fun onDragEnter() {
+                                    calls += "enter"
+                                }
 
-                        override fun onDragExit() {
-                            calls += "exit"
-                        }
+                                override fun onDragExit() {
+                                    calls += "exit"
+                                }
 
-                        override fun onReceive(
-                            transferableContent: TransferableContent
-                        ): TransferableContent? {
-                            calls += "receive"
-                            return null
-                        }
-                    })
+                                override fun onReceive(
+                                    transferableContent: TransferableContent
+                                ): TransferableContent? {
+                                    calls += "receive"
+                                    return null
+                                }
+                            }
+                        )
             )
         }
 
@@ -513,9 +550,7 @@
             drop()
         }
 
-        rule.runOnIdle {
-            assertThat(calls).isEqualTo(listOf("enter", "exit", "enter", "receive"))
-        }
+        rule.runOnIdle { assertThat(calls).isEqualTo(listOf("enter", "exit", "enter", "receive")) }
     }
 
     @Test
@@ -525,57 +560,63 @@
         rule.setContent {
             view = LocalView.current
             Box(
-                modifier = Modifier
-                    .size(200.dp)
-                    .contentReceiver(object : ReceiveContentListener {
-                        override fun onDragEnter() {
-                            calls += "enter-1"
-                        }
-
-                        override fun onDragExit() {
-                            calls += "exit-1"
-                        }
-
-                        override fun onReceive(
-                            transferableContent: TransferableContent
-                        ): TransferableContent = transferableContent
-                    })
-            ) {
-                Box(
-                    modifier = Modifier
-                        .align(Alignment.Center)
-                        .size(100.dp)
-                        .contentReceiver(object : ReceiveContentListener {
-                            override fun onDragEnter() {
-                                calls += "enter-2"
-                            }
-
-                            override fun onDragExit() {
-                                calls += "exit-2"
-                            }
-
-                            override fun onReceive(
-                                transferableContent: TransferableContent
-                            ): TransferableContent = transferableContent
-                        })
-                ) {
-                    Box(
-                        modifier = Modifier
-                            .align(Alignment.Center)
-                            .size(50.dp)
-                            .contentReceiver(object : ReceiveContentListener {
+                modifier =
+                    Modifier.size(200.dp)
+                        .contentReceiver(
+                            object : ReceiveContentListener {
                                 override fun onDragEnter() {
-                                    calls += "enter-3"
+                                    calls += "enter-1"
                                 }
 
                                 override fun onDragExit() {
-                                    calls += "exit-3"
+                                    calls += "exit-1"
                                 }
 
                                 override fun onReceive(
                                     transferableContent: TransferableContent
                                 ): TransferableContent = transferableContent
-                            })
+                            }
+                        )
+            ) {
+                Box(
+                    modifier =
+                        Modifier.align(Alignment.Center)
+                            .size(100.dp)
+                            .contentReceiver(
+                                object : ReceiveContentListener {
+                                    override fun onDragEnter() {
+                                        calls += "enter-2"
+                                    }
+
+                                    override fun onDragExit() {
+                                        calls += "exit-2"
+                                    }
+
+                                    override fun onReceive(
+                                        transferableContent: TransferableContent
+                                    ): TransferableContent = transferableContent
+                                }
+                            )
+                ) {
+                    Box(
+                        modifier =
+                            Modifier.align(Alignment.Center)
+                                .size(50.dp)
+                                .contentReceiver(
+                                    object : ReceiveContentListener {
+                                        override fun onDragEnter() {
+                                            calls += "enter-3"
+                                        }
+
+                                        override fun onDragExit() {
+                                            calls += "exit-3"
+                                        }
+
+                                        override fun onReceive(
+                                            transferableContent: TransferableContent
+                                        ): TransferableContent = transferableContent
+                                    }
+                                )
                     )
                 }
             }
@@ -595,18 +636,19 @@
         }
 
         rule.runOnIdle {
-            assertThat(calls).isEqualTo(
-                listOf(
-                    "enter-1",
-                    "enter-2",
-                    "exit-2",
-                    "enter-2",
-                    "enter-3",
-                    "exit-1",
-                    "exit-2",
-                    "exit-3"
+            assertThat(calls)
+                .isEqualTo(
+                    listOf(
+                        "enter-1",
+                        "enter-2",
+                        "exit-2",
+                        "enter-2",
+                        "enter-3",
+                        "exit-1",
+                        "exit-2",
+                        "exit-3"
+                    )
                 )
-            )
         }
     }
 
@@ -617,21 +659,23 @@
         rule.setContent {
             view = LocalView.current
             Box(
-                modifier = Modifier
-                    .size(100.dp)
-                    .contentReceiver(object : ReceiveContentListener {
-                        override fun onDragStart() {
-                            calls += "start"
-                        }
+                modifier =
+                    Modifier.size(100.dp)
+                        .contentReceiver(
+                            object : ReceiveContentListener {
+                                override fun onDragStart() {
+                                    calls += "start"
+                                }
 
-                        override fun onDragEnd() {
-                            calls += "end"
-                        }
+                                override fun onDragEnd() {
+                                    calls += "end"
+                                }
 
-                        override fun onReceive(
-                            transferableContent: TransferableContent
-                        ): TransferableContent? = null
-                    })
+                                override fun onReceive(
+                                    transferableContent: TransferableContent
+                                ): TransferableContent? = null
+                            }
+                        )
             )
         }
 
@@ -641,9 +685,7 @@
             cancelDrag()
         }
 
-        rule.runOnIdle {
-            assertThat(calls).isEqualTo(listOf("start", "end"))
-        }
+        rule.runOnIdle { assertThat(calls).isEqualTo(listOf("start", "end")) }
 
         calls.clear()
 
@@ -652,9 +694,7 @@
             cancelDrag()
         }
 
-        rule.runOnIdle {
-            assertThat(calls).isEqualTo(listOf("start", "end"))
-        }
+        rule.runOnIdle { assertThat(calls).isEqualTo(listOf("start", "end")) }
     }
 
     @Test
@@ -664,57 +704,63 @@
         rule.setContent {
             view = LocalView.current
             Box(
-                modifier = Modifier
-                    .size(200.dp)
-                    .contentReceiver(object : ReceiveContentListener {
-                        override fun onDragStart() {
-                            calls += "start-1"
-                        }
-
-                        override fun onDragEnd() {
-                            calls += "end-1"
-                        }
-
-                        override fun onReceive(
-                            transferableContent: TransferableContent
-                        ): TransferableContent = transferableContent
-                    })
-            ) {
-                Box(
-                    modifier = Modifier
-                        .align(Alignment.Center)
-                        .size(100.dp)
-                        .contentReceiver(object : ReceiveContentListener {
-                            override fun onDragStart() {
-                                calls += "start-2"
-                            }
-
-                            override fun onDragEnd() {
-                                calls += "end-2"
-                            }
-
-                            override fun onReceive(
-                                transferableContent: TransferableContent
-                            ): TransferableContent = transferableContent
-                        })
-                ) {
-                    Box(
-                        modifier = Modifier
-                            .align(Alignment.Center)
-                            .size(50.dp)
-                            .contentReceiver(object : ReceiveContentListener {
+                modifier =
+                    Modifier.size(200.dp)
+                        .contentReceiver(
+                            object : ReceiveContentListener {
                                 override fun onDragStart() {
-                                    calls += "start-3"
+                                    calls += "start-1"
                                 }
 
                                 override fun onDragEnd() {
-                                    calls += "end-3"
+                                    calls += "end-1"
                                 }
 
                                 override fun onReceive(
                                     transferableContent: TransferableContent
                                 ): TransferableContent = transferableContent
-                            })
+                            }
+                        )
+            ) {
+                Box(
+                    modifier =
+                        Modifier.align(Alignment.Center)
+                            .size(100.dp)
+                            .contentReceiver(
+                                object : ReceiveContentListener {
+                                    override fun onDragStart() {
+                                        calls += "start-2"
+                                    }
+
+                                    override fun onDragEnd() {
+                                        calls += "end-2"
+                                    }
+
+                                    override fun onReceive(
+                                        transferableContent: TransferableContent
+                                    ): TransferableContent = transferableContent
+                                }
+                            )
+                ) {
+                    Box(
+                        modifier =
+                            Modifier.align(Alignment.Center)
+                                .size(50.dp)
+                                .contentReceiver(
+                                    object : ReceiveContentListener {
+                                        override fun onDragStart() {
+                                            calls += "start-3"
+                                        }
+
+                                        override fun onDragEnd() {
+                                            calls += "end-3"
+                                        }
+
+                                        override fun onReceive(
+                                            transferableContent: TransferableContent
+                                        ): TransferableContent = transferableContent
+                                    }
+                                )
                     )
                 }
             }
@@ -727,27 +773,23 @@
         }
 
         rule.runOnIdle {
-            assertThat(calls.take(3)).containsExactlyElementsIn(
-                listOf("start-1", "start-2", "start-3")
-            )
-            assertThat(calls.drop(3)).containsExactlyElementsIn(
-                listOf("end-1", "end-2", "end-3")
-            )
+            assertThat(calls.take(3))
+                .containsExactlyElementsIn(listOf("start-1", "start-2", "start-3"))
+            assertThat(calls.drop(3)).containsExactlyElementsIn(listOf("end-1", "end-2", "end-3"))
         }
     }
 
-    private data class TestElement(
-        val onNode: (TestNode) -> Unit
-    ) : ModifierNodeElement<TestNode>() {
+    private data class TestElement(val onNode: (TestNode) -> Unit) :
+        ModifierNodeElement<TestNode>() {
         override fun create(): TestNode = TestNode(onNode)
+
         override fun update(node: TestNode) {
             node.onNode = onNode
         }
     }
 
-    private class TestNode(
-        var onNode: (TestNode) -> Unit
-    ) : Modifier.Node(), ModifierLocalModifierNode {
+    private class TestNode(var onNode: (TestNode) -> Unit) :
+        Modifier.Node(), ModifierLocalModifierNode {
 
         override fun onAttach() {
             onNode(this)
@@ -764,12 +806,14 @@
         builder.block()
         builder.build(label)
     } else {
-        builder.apply {
-            addText()
-            addUri()
-            addHtmlText()
-            addIntent()
-        }.build(label)
+        builder
+            .apply {
+                addText()
+                addUri()
+                addHtmlText()
+                addIntent()
+            }
+            .build(label)
     }
 }
 
@@ -798,10 +842,7 @@
         mimeTypes.add(mimeType)
     }
 
-    fun addUri(
-        uri: Uri = defaultUri,
-        mimeType: String = "image/png"
-    ) {
+    fun addUri(uri: Uri = defaultUri, mimeType: String = "image/png") {
         items.add(ClipData.Item(uri))
         mimeTypes.add(mimeType)
     }
@@ -825,10 +866,7 @@
 }
 
 private val defaultLabel = "label"
-private val defaultIntent = Intent(
-    Intent.ACTION_VIEW,
-    Uri.parse("https://example.com")
-)
+private val defaultIntent = Intent(Intent.ACTION_VIEW, Uri.parse("https://example.com"))
 private val defaultUri = Uri.parse("content://com.example.app/image")
 
 @OptIn(ExperimentalFoundationApi::class)
diff --git a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/content/TestDragAndDrop.kt b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/content/TestDragAndDrop.kt
index 71883a6..dc3df53 100644
--- a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/content/TestDragAndDrop.kt
+++ b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/content/TestDragAndDrop.kt
@@ -24,46 +24,32 @@
 import androidx.compose.ui.geometry.Offset
 import androidx.compose.ui.unit.Density
 
-/**
- * A helper to test multi-window Drag And Drop interactions.
- */
+/** A helper to test multi-window Drag And Drop interactions. */
 internal fun testDragAndDrop(view: View, density: Density, block: DragAndDropScope.() -> Unit) {
     DragAndDropScopeImpl(view, density).block()
 }
 
 internal interface DragAndDropScope : Density {
 
-    /**
-     * Drags an item with ClipData that only holds the given [text] to the [offset] location.
-     */
+    /** Drags an item with ClipData that only holds the given [text] to the [offset] location. */
     fun drag(offset: Offset, text: String): Boolean
 
-    /**
-     * Drags an item with ClipData that only holds the given [uri] to the [offset] location.
-     */
+    /** Drags an item with ClipData that only holds the given [uri] to the [offset] location. */
     fun drag(offset: Offset, uri: Uri): Boolean
 
-    /**
-     * Drags an item with [clipData] payload to the [offset] location.
-     */
+    /** Drags an item with [clipData] payload to the [offset] location. */
     fun drag(offset: Offset, clipData: ClipData): Boolean
 
-    /**
-     * Drops the previously declared dragging item.
-     */
+    /** Drops the previously declared dragging item. */
     fun drop(): Boolean
 
-    /**
-     * Cancels the ongoing drag without dropping it.
-     */
+    /** Cancels the ongoing drag without dropping it. */
     fun cancelDrag()
 }
 
 @Suppress("DELEGATED_MEMBER_HIDES_SUPERTYPE_OVERRIDE")
-private class DragAndDropScopeImpl(
-    val view: View,
-    density: Density
-) : DragAndDropScope, Density by density {
+private class DragAndDropScopeImpl(val view: View, density: Density) :
+    DragAndDropScope, Density by density {
     private var lastDraggingOffsetAndItem: Pair<Offset, Any>? = null
 
     override fun drag(offset: Offset, text: String): Boolean = dragAny(offset, text)
@@ -72,24 +58,20 @@
 
     override fun drag(offset: Offset, clipData: ClipData): Boolean = dragAny(offset, clipData)
 
-    /**
-     * @param item Can be only [String], [Uri], or [ClipData].
-     */
+    /** @param item Can be only [String], [Uri], or [ClipData]. */
     private fun dragAny(offset: Offset, item: Any): Boolean {
         val _lastDraggingItem = lastDraggingOffsetAndItem
         var result = false
         if (_lastDraggingItem == null || _lastDraggingItem.second != item) {
-            result = view.dispatchDragEvent(
-                makeDragEvent(action = DragEvent.ACTION_DRAG_STARTED, item = item)
-            ) || result
+            result =
+                view.dispatchDragEvent(
+                    makeDragEvent(action = DragEvent.ACTION_DRAG_STARTED, item = item)
+                ) || result
         }
-        result = view.dispatchDragEvent(
-            makeDragEvent(
-                action = DragEvent.ACTION_DRAG_LOCATION,
-                item = item,
-                offset = offset
-            )
-        ) || result
+        result =
+            view.dispatchDragEvent(
+                makeDragEvent(action = DragEvent.ACTION_DRAG_LOCATION, item = item, offset = offset)
+            ) || result
         lastDraggingOffsetAndItem = offset to item
         return result
     }
@@ -110,29 +92,20 @@
 
     override fun cancelDrag() {
         lastDraggingOffsetAndItem = null
-        view.dispatchDragEvent(
-            DragAndDropTestUtils.makeTextDragEvent(DragEvent.ACTION_DRAG_ENDED)
-        )
+        view.dispatchDragEvent(DragAndDropTestUtils.makeTextDragEvent(DragEvent.ACTION_DRAG_ENDED))
     }
 
-    private fun makeDragEvent(
-        action: Int,
-        item: Any,
-        offset: Offset = Offset.Zero
-    ): DragEvent {
+    private fun makeDragEvent(action: Int, item: Any, offset: Offset = Offset.Zero): DragEvent {
         return when (item) {
             is String -> {
                 DragAndDropTestUtils.makeTextDragEvent(action, item, offset)
             }
-
             is Uri -> {
                 DragAndDropTestUtils.makeImageDragEvent(action, item, offset)
             }
-
             is ClipData -> {
                 DragAndDropTestUtils.makeDragEvent(action, item, offset)
             }
-
             else -> {
                 throw IllegalArgumentException(
                     "{item=$item} can only be one of [String], [Uri], or [ClipData]"
diff --git a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/content/TransferableContentTest.kt b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/content/TransferableContentTest.kt
index d97f989..4fee61b 100644
--- a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/content/TransferableContentTest.kt
+++ b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/content/TransferableContentTest.kt
@@ -35,9 +35,8 @@
 
     @Test
     fun hasMediaType_genericNonText() {
-        val transferableContent = TransferableContent(createClipData {
-            addUri(mimeType = "image/png")
-        })
+        val transferableContent =
+            TransferableContent(createClipData { addUri(mimeType = "image/png") })
         assertTrue(transferableContent.hasMediaType(MediaType.Image))
         assertTrue(transferableContent.hasMediaType(MediaType("image/png")))
         assertFalse(transferableContent.hasMediaType(MediaType("image/jpeg")))
@@ -45,10 +44,13 @@
 
     @Test
     fun hasMediaType_genericText() {
-        val transferableContent = TransferableContent(createClipData {
-            addText()
-            addUri(mimeType = "image/png")
-        })
+        val transferableContent =
+            TransferableContent(
+                createClipData {
+                    addText()
+                    addUri(mimeType = "image/png")
+                }
+            )
         assertTrue(transferableContent.hasMediaType(MediaType.Text))
         assertTrue(transferableContent.hasMediaType(MediaType.PlainText))
         assertFalse(transferableContent.hasMediaType(MediaType.HtmlText))
@@ -57,32 +59,41 @@
 
     @Test
     fun readPlainText_concatsTextContent() {
-        val transferableContent = TransferableContent(createClipData {
-            addText("a")
-            addText("b")
-            addText("c")
-        })
+        val transferableContent =
+            TransferableContent(
+                createClipData {
+                    addText("a")
+                    addText("b")
+                    addText("c")
+                }
+            )
 
         assertThat(transferableContent.clipEntry.readPlainText()).isEqualTo("a\nb\nc")
     }
 
     @Test
     fun readPlainText_returnsNull_ifNoText() {
-        val transferableContent = TransferableContent(createClipData {
-            addUri()
-            addUri()
-        })
+        val transferableContent =
+            TransferableContent(
+                createClipData {
+                    addUri()
+                    addUri()
+                }
+            )
 
         assertThat(transferableContent.clipEntry.readPlainText()).isNull()
     }
 
     @Test
     fun readPlainText_singleItem_doesNotHaveNewLine() {
-        val transferableContent = TransferableContent(createClipData {
-            addText("abc")
-            addUri()
-            addIntent()
-        })
+        val transferableContent =
+            TransferableContent(
+                createClipData {
+                    addText("abc")
+                    addUri()
+                    addIntent()
+                }
+            )
 
         assertThat(transferableContent.clipEntry.readPlainText()).isEqualTo("abc")
     }
@@ -103,11 +114,14 @@
 
     @Test
     fun consumeEach_remainingMimeTypes_includeConsumedItems() {
-        val transferableContent = TransferableContent(createClipData {
-            addText()
-            addUri(mimeType = "video/mp4")
-            addUri(mimeType = "image/gif")
-        })
+        val transferableContent =
+            TransferableContent(
+                createClipData {
+                    addText()
+                    addUri(mimeType = "video/mp4")
+                    addUri(mimeType = "image/gif")
+                }
+            )
         // only text would remain
         val remaining = transferableContent.consume { it.uri != null }
         assertThat(remaining?.clipEntry?.clipData?.itemCount).isEqualTo(1)
diff --git a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/content/internal/DragAndDropRequestPermissionTest.kt b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/content/internal/DragAndDropRequestPermissionTest.kt
index 368e64c..f4748fa 100644
--- a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/content/internal/DragAndDropRequestPermissionTest.kt
+++ b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/content/internal/DragAndDropRequestPermissionTest.kt
@@ -38,9 +38,7 @@
 @SmallTest
 class DragAndDropRequestPermissionTest {
 
-    @Suppress("DEPRECATION")
-    @get:Rule
-    val rule = createAndroidComposeRule<TestActivity>()
+    @Suppress("DEPRECATION") @get:Rule val rule = createAndroidComposeRule<TestActivity>()
 
     private lateinit var testNode: TestNode
 
@@ -48,14 +46,14 @@
     @Test
     fun asksPermission_ifAllRequirementsAreMet() {
         // setup
-        rule.setContent {
-            Box(Modifier.then(TestElement { testNode = it }))
-        }
-        val event = DragAndDropEvent(
-            DragAndDropTestUtils.makeImageDragEvent(
-            DragEvent.ACTION_DROP,
-            Uri.parse("content://com.example/content.png")
-        ))
+        rule.setContent { Box(Modifier.then(TestElement { testNode = it })) }
+        val event =
+            DragAndDropEvent(
+                DragAndDropTestUtils.makeImageDragEvent(
+                    DragEvent.ACTION_DROP,
+                    Uri.parse("content://com.example/content.png")
+                )
+            )
 
         // act
         testNode.dragAndDropRequestPermission(event)
@@ -68,14 +66,14 @@
     @Test
     fun doesNotAskPermission_ifNoContentUri() {
         // setup
-        rule.setContent {
-            Box(Modifier.then(TestElement { testNode = it }))
-        }
-        val event = DragAndDropEvent(
-            DragAndDropTestUtils.makeImageDragEvent(
-            DragEvent.ACTION_DROP,
-            Uri.parse("file://com.example/content.png")
-        ))
+        rule.setContent { Box(Modifier.then(TestElement { testNode = it })) }
+        val event =
+            DragAndDropEvent(
+                DragAndDropTestUtils.makeImageDragEvent(
+                    DragEvent.ACTION_DROP,
+                    Uri.parse("file://com.example/content.png")
+                )
+            )
 
         // act
         testNode.dragAndDropRequestPermission(event)
@@ -94,11 +92,13 @@
                 Box(Modifier.then(TestElement { testNode = it }))
             }
         }
-        val event = DragAndDropEvent(
-            DragAndDropTestUtils.makeImageDragEvent(
-            DragEvent.ACTION_DROP,
-            Uri.parse("file://com.example/content.png")
-        ))
+        val event =
+            DragAndDropEvent(
+                DragAndDropTestUtils.makeImageDragEvent(
+                    DragEvent.ACTION_DROP,
+                    Uri.parse("file://com.example/content.png")
+                )
+            )
 
         toggle = false
 
@@ -109,18 +109,17 @@
         Truth.assertThat(rule.activity.requestedDragAndDropPermissions).isEmpty()
     }
 
-    private data class TestElement(
-        val onNode: (TestNode) -> Unit
-    ) : ModifierNodeElement<TestNode>() {
+    private data class TestElement(val onNode: (TestNode) -> Unit) :
+        ModifierNodeElement<TestNode>() {
         override fun create(): TestNode = TestNode(onNode)
+
         override fun update(node: TestNode) {
             node.onNode = onNode
         }
     }
 
-    private class TestNode(
-        var onNode: (TestNode) -> Unit
-    ) : Modifier.Node(), CompositionLocalConsumerModifierNode {
+    private class TestNode(var onNode: (TestNode) -> Unit) :
+        Modifier.Node(), CompositionLocalConsumerModifierNode {
 
         override fun onAttach() {
             onNode(this)
diff --git a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/contextmenu/ContextMenuAreaTest.kt b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/contextmenu/ContextMenuAreaTest.kt
index 2404cce..c1d3f99 100644
--- a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/contextmenu/ContextMenuAreaTest.kt
+++ b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/contextmenu/ContextMenuAreaTest.kt
@@ -63,8 +63,7 @@
 @RunWith(AndroidJUnit4::class)
 @MediumTest
 class ContextMenuAreaTest {
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
     private val tag = "testTag"
     private val itemTag = "itemTag"
@@ -123,22 +122,16 @@
         lateinit var menuLayout: LayoutCoordinates
         rule.setContent {
             // move our actual layout from the edge of screen
-            Box(
-                modifier = Modifier
-                    .fillMaxSize()
-                    .padding(32.dp)
-            ) {
+            Box(modifier = Modifier.fillMaxSize().padding(32.dp)) {
                 Box(
-                    Modifier
-                        .size(100.dp)
-                        .testTag(contentTag)
-                        .onGloballyPositioned { contentLayout = it }
+                    Modifier.size(100.dp).testTag(contentTag).onGloballyPositioned {
+                        contentLayout = it
+                    }
                 ) {
                     TestMenu(
                         state = state,
-                        modifier = Modifier
-                            .testTag(menuTag)
-                            .onGloballyPositioned { menuLayout = it }
+                        modifier =
+                            Modifier.testTag(menuTag).onGloballyPositioned { menuLayout = it }
                     )
                 }
             }
@@ -182,9 +175,7 @@
     fun whenContextMenu_clickOffPopup_closesPopup() {
         val state = ContextMenuState(Status.Open(Offset.Zero))
         rule.setContent {
-            Box(Modifier.fillMaxSize()) {
-                TestMenu(state = state, onDismiss = { state.close() })
-            }
+            Box(Modifier.fillMaxSize()) { TestMenu(state = state, onDismiss = { state.close() }) }
         }
 
         val interaction = rule.onNodeWithTag(tag)
@@ -194,9 +185,8 @@
         // Need the click to register above Compose's test framework,
         // else it won't be directed to the popup properly. So,
         // we use a different way of dispatching the click.
-        val rootRect = with(rule.density) {
-            rule.onAllNodes(isRoot()).onFirst().getBoundsInRoot().toRect()
-        }
+        val rootRect =
+            with(rule.density) { rule.onAllNodes(isRoot()).onFirst().getBoundsInRoot().toRect() }
         val offset = rootRect.roundToIntRect().bottomRight - IntOffset(1, 1)
         UiDevice.getInstance(InstrumentationRegistry.getInstrumentation()).click(offset.x, offset.y)
         rule.waitForIdle()
@@ -204,6 +194,7 @@
         assertThatContextMenuState(state).statusIsClosed()
         interaction.assertDoesNotExist()
     }
+
     // endregion ContextMenu Tests
 
     // region ContextMenuArea Tests
@@ -230,20 +221,14 @@
     fun whenContextMenuArea_toggleOpenClose_displayedAsExpected() {
         val state = ContextMenuState()
         rule.setContent {
-            Box(
-                modifier = Modifier
-                    .fillMaxSize()
-                    .wrapContentSize()
-            ) {
+            Box(modifier = Modifier.fillMaxSize().wrapContentSize()) {
                 TestArea(
                     state = state,
                     contextMenuBuilderBlock = { testItem(modifier = Modifier.testTag(itemTag)) },
                 ) {
                     Spacer(
-                        modifier = Modifier
-                            .background(Color.LightGray)
-                            .size(100.dp)
-                            .testTag(contentTag)
+                        modifier =
+                            Modifier.background(Color.LightGray).size(100.dp).testTag(contentTag)
                     )
                 }
             }
@@ -278,11 +263,7 @@
         val sideLength = 100.dp
         rule.setContent {
             TestArea(modifier = Modifier.size(sideLength)) {
-                Box(
-                    modifier = Modifier
-                        .background(Color.LightGray)
-                        .testTag(contentTag)
-                )
+                Box(modifier = Modifier.background(Color.LightGray).testTag(contentTag))
             }
         }
 
@@ -299,9 +280,7 @@
             TestArea(
                 state = state,
                 contextMenuBuilderBlock = { testItem(modifier = Modifier.testTag(itemTag)) },
-                modifier = Modifier
-                    .background(Color.LightGray)
-                    .size(100.dp)
+                modifier = Modifier.background(Color.LightGray).size(100.dp)
             )
         }
 
@@ -318,9 +297,7 @@
                 contextMenuBuilderBlock = {
                     testItem(modifier = Modifier.testTag(itemTag)) { state.close() }
                 },
-                modifier = Modifier
-                    .background(Color.LightGray)
-                    .size(100.dp)
+                modifier = Modifier.background(Color.LightGray).size(100.dp)
             )
         }
 
@@ -343,9 +320,7 @@
                 contextMenuBuilderBlock = {
                     testItem(modifier = Modifier.testTag(itemTag)) { state.close() }
                 },
-                modifier = Modifier
-                    .background(Color.LightGray)
-                    .size(100.dp)
+                modifier = Modifier.background(Color.LightGray).size(100.dp)
             )
         }
 
diff --git a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/contextmenu/ContextMenuCommon.kt b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/contextmenu/ContextMenuCommon.kt
index 0b3760d..52d4514 100644
--- a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/contextmenu/ContextMenuCommon.kt
+++ b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/contextmenu/ContextMenuCommon.kt
@@ -70,10 +70,9 @@
 internal fun assertThatContextMenuState(state: ContextMenuState): ContextMenuStateSubject =
     assertAbout(ContextMenuStateSubject.SUBJECT_FACTORY).that(state)!!
 
-internal class ContextMenuStateSubject internal constructor(
-    failureMetadata: FailureMetadata?,
-    private val subject: ContextMenuState
-) : Subject(failureMetadata, subject) {
+internal class ContextMenuStateSubject
+internal constructor(failureMetadata: FailureMetadata?, private val subject: ContextMenuState) :
+    Subject(failureMetadata, subject) {
     companion object {
         internal val SUBJECT_FACTORY: Factory<ContextMenuStateSubject?, ContextMenuState> =
             Factory { failureMetadata, subject ->
@@ -118,9 +117,10 @@
     private val subject: Color,
 ) : Subject(failureMetadata, subject) {
     companion object {
-        val INSTANCE = Factory<ColorSubject, Color> { failureMetadata, subject ->
-            ColorSubject(failureMetadata, subject)
-        }
+        val INSTANCE =
+            Factory<ColorSubject, Color> { failureMetadata, subject ->
+                ColorSubject(failureMetadata, subject)
+            }
     }
 
     fun isFuzzyEqualTo(expected: Color, tolerance: Float = 0.001f) {
@@ -140,8 +140,8 @@
 }
 
 /**
- * In order to trigger `Popup.onDismiss`, the click has to come from above compose's test
- * framework. This method will send the click in this way.
+ * In order to trigger `Popup.onDismiss`, the click has to come from above compose's test framework.
+ * This method will send the click in this way.
  *
  * @param offsetPicker Given the root rect bounds, select an offset to click at.
  */
@@ -149,9 +149,8 @@
     // Need the click to register above Compose's test framework,
     // else it won't be directed to the popup properly. So,
     // we use a different way of dispatching the click.
-    val rootRect = with(density) {
-        onAllNodes(isRoot()).onFirst().getBoundsInRoot().toRect().roundToIntRect()
-    }
+    val rootRect =
+        with(density) { onAllNodes(isRoot()).onFirst().getBoundsInRoot().toRect().roundToIntRect() }
     val offset = offsetPicker(rootRect)
     UiDevice.getInstance(InstrumentationRegistry.getInstrumentation()).click(offset.x, offset.y)
     waitForIdle()
@@ -168,12 +167,16 @@
     label: String,
 ): SemanticsNodeInteraction = onNode(matcher = hasAnyAncestor(isPopup()) and hasText(label))
 
-internal enum class ContextMenuItemState { ENABLED, DISABLED, DOES_NOT_EXIST }
+internal enum class ContextMenuItemState {
+    ENABLED,
+    DISABLED,
+    DOES_NOT_EXIST
+}
 
 /**
- * Various asserts for checking enable/disable status of the context menu.
- * Always checks that the popup exists and that all the items exist.
- * Each boolean parameter represents whether the item is expected to be enabled or not.
+ * Various asserts for checking enable/disable status of the context menu. Always checks that the
+ * popup exists and that all the items exist. Each boolean parameter represents whether the item is
+ * expected to be enabled or not.
  */
 internal fun ComposeTestRule.assertContextMenuItems(
     cutState: ContextMenuItemState,
diff --git a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/contextmenu/ContextMenuGestureTest.kt b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/contextmenu/ContextMenuGestureTest.kt
index 1a244fd..af4bc92 100644
--- a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/contextmenu/ContextMenuGestureTest.kt
+++ b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/contextmenu/ContextMenuGestureTest.kt
@@ -56,8 +56,7 @@
 @RunWith(AndroidJUnit4::class)
 @MediumTest
 class ContextMenuGestureTest {
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
     private val tag = "testTag"
 
@@ -67,12 +66,7 @@
         val state = ContextMenuState()
         val touchPosition = Offset(10f, 10f)
         rule.setContent {
-            Box(
-                modifier = Modifier
-                    .testTag(tag)
-                    .size(100.dp)
-                    .contextMenuGestures(state)
-            )
+            Box(modifier = Modifier.testTag(tag).size(100.dp).contextMenuGestures(state))
         }
 
         assertThatContextMenuState(state).statusIsClosed()
@@ -94,22 +88,22 @@
         var enableContextMenuGesture by mutableStateOf(false)
         var pressCount = 0
         rule.setContent {
-            val maybeAdditionalPointerInput = if (enableContextMenuGesture)
-                Modifier.contextMenuGestures(state) else Modifier
+            val maybeAdditionalPointerInput =
+                if (enableContextMenuGesture) Modifier.contextMenuGestures(state) else Modifier
             Box(
-                modifier = Modifier
-                    .testTag(tag)
-                    .size(100.dp)
-                    .then(maybeAdditionalPointerInput)
-                    .pointerInput(Unit) {
-                        // increment counter on a down, don't consume event.
-                        awaitEachGesture {
-                            val event = awaitPointerEvent()
-                            if (event.changes.fastAll { it.changedToDown() }) {
-                                pressCount++
+                modifier =
+                    Modifier.testTag(tag)
+                        .size(100.dp)
+                        .then(maybeAdditionalPointerInput)
+                        .pointerInput(Unit) {
+                            // increment counter on a down, don't consume event.
+                            awaitEachGesture {
+                                val event = awaitPointerEvent()
+                                if (event.changes.fastAll { it.changedToDown() }) {
+                                    pressCount++
+                                }
                             }
                         }
-                    }
             )
         }
 
@@ -127,6 +121,7 @@
         assertThatContextMenuState(state).statusIsOpen()
         assertThat(pressCount).isEqualTo(2)
     }
+
     // endregion Modifier.contextMenuGestures Tests
 
     // region PointerInputScope.onRightClickDown Tests
@@ -135,11 +130,10 @@
         onClick: (Offset) -> Unit,
     ) {
         Box(
-            modifier = Modifier
-                .background(Color.LightGray)
-                .size(100.dp)
-                .testTag(tag)
-                .pointerInput(Unit) { onRightClickDown(onClick) }
+            modifier =
+                Modifier.background(Color.LightGray).size(100.dp).testTag(tag).pointerInput(Unit) {
+                    onRightClickDown(onClick)
+                }
         )
     }
 
@@ -185,16 +179,12 @@
     fun whenOnRightClickDown_alreadyConsumed_doesNotTrigger() {
         var clickCount = 0
         rule.setContent {
-            Box(
-                modifier = Modifier
-                    .pointerInput(Unit) { onRightClickDown { clickCount++ } }
-            ) {
+            Box(modifier = Modifier.pointerInput(Unit) { onRightClickDown { clickCount++ } }) {
                 Box(
-                    modifier = Modifier
-                        .background(Color.LightGray)
-                        .size(100.dp)
-                        .testTag(tag)
-                        .pointerInput(Unit) {
+                    modifier =
+                        Modifier.background(Color.LightGray).size(100.dp).testTag(tag).pointerInput(
+                            Unit
+                        ) {
                             awaitPointerEventScope {
                                 while (true) {
                                     awaitPointerEvent().changes.fastForEach { it.consume() }
@@ -215,29 +205,26 @@
             awaitPointerEventScope {
                 while (true) {
                     val event = awaitPointerEvent()
-                    assertThat(event.changes.fastMap { it.isConsumed }.toSet())
-                        .run {
-                            when (event.type) {
-                                PointerEventType.Press,
-                                PointerEventType.Release -> containsExactly(true)
-
-                                else -> containsExactly(false)
-                            }
+                    assertThat(event.changes.fastMap { it.isConsumed }.toSet()).run {
+                        when (event.type) {
+                            PointerEventType.Press,
+                            PointerEventType.Release -> containsExactly(true)
+                            else -> containsExactly(false)
                         }
+                    }
                 }
             }
         }
 
         rule.setContent {
-            Box(
-                modifier = Modifier.pointerInput(Unit) { assertCorrectlyConsumed() }
-            ) {
+            Box(modifier = Modifier.pointerInput(Unit) { assertCorrectlyConsumed() }) {
                 Box(
-                    modifier = Modifier
-                        .background(Color.LightGray)
-                        .size(100.dp)
-                        .testTag(tag)
-                        .pointerInput(Unit) { onRightClickDown { /* Nothing */ } }
+                    modifier =
+                        Modifier.background(Color.LightGray).size(100.dp).testTag(tag).pointerInput(
+                            Unit
+                        ) {
+                            onRightClickDown { /* Nothing */ }
+                        }
                 )
             }
         }
diff --git a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/contextmenu/ContextMenuUiTest.kt b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/contextmenu/ContextMenuUiTest.kt
index d8621a1..db11637 100644
--- a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/contextmenu/ContextMenuUiTest.kt
+++ b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/contextmenu/ContextMenuUiTest.kt
@@ -72,21 +72,22 @@
 import org.junit.runner.RunWith
 
 private fun IntOffset.dx(dx: Int): IntOffset = copy(x = x + dx)
+
 private fun IntOffset.dy(dy: Int): IntOffset = copy(y = y + dy)
 
-private val TestColors = ContextMenuColors(
-    backgroundColor = Color.White,
-    textColor = Color.Black,
-    iconColor = Color.Blue,
-    disabledTextColor = Color.Red,
-    disabledIconColor = Color.Green,
-)
+private val TestColors =
+    ContextMenuColors(
+        backgroundColor = Color.White,
+        textColor = Color.Black,
+        iconColor = Color.Blue,
+        disabledTextColor = Color.Red,
+        disabledIconColor = Color.Green,
+    )
 
 @RunWith(AndroidJUnit4::class)
 @MediumTest
 class ContextMenuUiTest {
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
     private val tag = "testTag"
     private val longText = "M ".repeat(200).trimEnd()
@@ -129,9 +130,7 @@
     @Test
     fun whenContextMenuItem_enabled_isClicked_onClickTriggers() {
         var onClickCount = 0
-        rule.setContent {
-            TestItem(label = "Test") { onClickCount++ }
-        }
+        rule.setContent { TestItem(label = "Test") { onClickCount++ } }
 
         rule.onNodeWithTag(tag).performClick()
         assertThat(onClickCount).isEqualTo(1)
@@ -140,9 +139,7 @@
     @Test
     fun whenContextMenuItem_disabled_isClicked_noActions() {
         var onClickCount = 0
-        rule.setContent {
-            TestItem(label = "Test", enabled = false) { onClickCount++ }
-        }
+        rule.setContent { TestItem(label = "Test", enabled = false) { onClickCount++ } }
 
         rule.onNodeWithTag(tag).performClick()
         assertThat(onClickCount).isEqualTo(0)
@@ -152,9 +149,7 @@
     fun whenContextMenuItem_withMinSize_sizeIsAsExpected() {
         rule.setContent {
             // emulate the context menu column asking for max intrinsic width
-            Box(Modifier.width(IntrinsicSize.Max)) {
-                TestItem(label = "M")
-            }
+            Box(Modifier.width(IntrinsicSize.Max)) { TestItem(label = "M") }
         }
 
         rule.onNodeWithTag(tag).run {
@@ -171,11 +166,7 @@
                 TestItem(
                     label = "M".repeat(200),
                     leadingIcon = { color ->
-                        Box(
-                            modifier = Modifier
-                                .background(color)
-                                .fillMaxSize()
-                        )
+                        Box(modifier = Modifier.background(color).fillMaxSize())
                     },
                 )
             }
@@ -195,12 +186,7 @@
                 TestItem(
                     modifier = Modifier,
                     leadingIcon = { color ->
-                        Box(
-                            modifier = Modifier
-                                .testTag(tag)
-                                .background(color)
-                                .fillMaxSize()
-                        )
+                        Box(modifier = Modifier.testTag(tag).background(color).fillMaxSize())
                     },
                 )
             }
@@ -211,9 +197,10 @@
         interaction.assertHeightIsEqualTo(ContextMenuSpec.IconSize)
 
         // Assumption: The immediate parent of the tagged composable is the box with requiredSizeIn.
-        val parentSize = interaction.fetchSemanticsNode().layoutInfo.parentInfo?.run {
-            with(density) { DpSize(width.toDp(), height.toDp()) }
-        } ?: fail("Parent layout of empty box not found.")
+        val parentSize =
+            interaction.fetchSemanticsNode().layoutInfo.parentInfo?.run {
+                with(density) { DpSize(width.toDp(), height.toDp()) }
+            } ?: fail("Parent layout of empty box not found.")
 
         parentSize.width.assertIsEqualTo(ContextMenuSpec.IconSize, subject = "parent.width")
         parentSize.height.assertIsEqualTo(ContextMenuSpec.IconSize, subject = "parent.height")
@@ -233,9 +220,10 @@
         interaction.assertHeightIsEqualTo(0.dp)
 
         // Assumption: The immediate parent of the tagged composable is the box with requiredSizeIn.
-        val parentSize = interaction.fetchSemanticsNode().layoutInfo.parentInfo?.run {
-            with(density) { DpSize(width.toDp(), height.toDp()) }
-        } ?: fail("Parent layout of empty box not found.")
+        val parentSize =
+            interaction.fetchSemanticsNode().layoutInfo.parentInfo?.run {
+                with(density) { DpSize(width.toDp(), height.toDp()) }
+            } ?: fail("Parent layout of empty box not found.")
 
         parentSize.width.assertIsEqualTo(ContextMenuSpec.IconSize, subject = "parent.width")
         parentSize.height.assertIsEqualTo(0.dp, subject = "parent.height")
@@ -245,9 +233,7 @@
     fun whenContextMenuItem_enabled_semanticsIsCorrect() {
         var onClickCount = 0
         val label = "Test"
-        rule.setContent {
-            TestItem(label = label) { onClickCount++ }
-        }
+        rule.setContent { TestItem(label = label) { onClickCount++ } }
 
         rule.onNodeWithTag(tag).apply {
             assertHasClickAction()
@@ -268,9 +254,7 @@
     fun whenContextMenuItem_disabled_semanticsIsCorrect() {
         var onClickCount = 0
         val label = "Test"
-        rule.setContent {
-            TestItem(label = label, enabled = false) { onClickCount++ }
-        }
+        rule.setContent { TestItem(label = label, enabled = false) { onClickCount++ } }
 
         rule.onNodeWithTag(tag).apply {
             assertHasClickAction()
@@ -291,8 +275,8 @@
     fun whenContextMenuItem_withLongLabel_doesNotWrap() {
         rule.setContent { TestItem(label = longText) }
 
-        val textLayoutResult = rule.onNode(hasText(longText), useUnmergedTree = true)
-            .fetchTextLayoutResult()
+        val textLayoutResult =
+            rule.onNode(hasText(longText), useUnmergedTree = true).fetchTextLayoutResult()
 
         assertThat(textLayoutResult.lineCount).isEqualTo(1)
     }
@@ -344,17 +328,14 @@
         }
         assertThat(iconColor).isEqualTo(TestColors.disabledIconColor)
     }
+
     // endregion ContextMenuItem Tests
 
     // region ContextMenuColumn Tests
     @Test
     fun whenContextMenuColumn_usedNormally_allInputItemsAreRendered() {
         val labelFunction: (Int) -> String = { "Item $it" }
-        rule.setContent {
-            TestColumn {
-                repeat(5) { testItem(label = labelFunction(it)) }
-            }
-        }
+        rule.setContent { TestColumn { repeat(5) { testItem(label = labelFunction(it)) } } }
 
         rule.onNodeWithTag(tag).assertIsDisplayed()
         repeat(5) { rule.onNode(hasText(labelFunction(it))).assertExists() }
@@ -366,9 +347,8 @@
         val containerTag = "containerTag"
         rule.setContent {
             Box(
-                modifier = Modifier
-                    .testTag(containerTag)
-                    .padding(ContextMenuSpec.MenuContainerElevation)
+                modifier =
+                    Modifier.testTag(containerTag).padding(ContextMenuSpec.MenuContainerElevation)
             ) {
                 TestColumn { testItem() }
             }
@@ -400,13 +380,7 @@
     @Test
     fun whenContextMenuColumn_allInputItemsAreRendered() {
         val labelFunction: (Int) -> String = { "Item $it" }
-        rule.setContent {
-            TestColumn {
-                repeat(5) {
-                    testItem(label = labelFunction(it))
-                }
-            }
-        }
+        rule.setContent { TestColumn { repeat(5) { testItem(label = labelFunction(it)) } } }
 
         rule.onNodeWithTag(tag).assertIsDisplayed()
         repeat(5) { rule.onNode(hasText(labelFunction(it))).assertExists() }
@@ -415,11 +389,7 @@
     @Test
     fun whenContextMenuColumn_5ItemsMaxWidth_sizeIsAsExpected() {
         rule.setContent {
-            TestColumn {
-                repeat(5) {
-                    testItem(label = "Item ${it.toString().repeat(100)}")
-                }
-            }
+            TestColumn { repeat(5) { testItem(label = "Item ${it.toString().repeat(100)}") } }
         }
 
         rule.onNodeWithTag(tag).run {
@@ -433,9 +403,7 @@
 
     @Test
     fun whenContextMenuColumn_1ItemMinWidth_sizeIsAsExpected() {
-        rule.setContent {
-            TestColumn { testItem() }
-        }
+        rule.setContent { TestColumn { testItem() } }
 
         rule.onNodeWithTag(tag).run {
             // 1 item and the vertical padding.
@@ -448,13 +416,7 @@
 
     @Test
     fun whenContextMenuColumn_with100Items_scrolls() {
-        rule.setContent {
-            TestColumn {
-                repeat(100) {
-                    testItem(label = "Item ${it + 1}")
-                }
-            }
-        }
+        rule.setContent { TestColumn { repeat(100) { testItem(label = "Item ${it + 1}") } } }
 
         val firstItemMatcher = hasText("Item 1")
         val lastItemMatcher = hasText("Item 100")
@@ -499,6 +461,7 @@
             .asList()
             .containsExactly(1, 1, 1, 1, 1)
     }
+
     // endregion ContextMenuColumn Tests
 
     // region ContextMenuColor Tests
@@ -513,23 +476,24 @@
         iconColor: Color = Color.Transparent,
         disabledTextColor: Color = Color.Transparent,
         disabledIconColor: Color = Color.Transparent,
-    ): ContextMenuColors = ContextMenuColors(
-        backgroundColor = backgroundColor,
-        textColor = textColor,
-        iconColor = iconColor,
-        disabledTextColor = disabledTextColor,
-        disabledIconColor = disabledIconColor,
-    )
+    ): ContextMenuColors =
+        ContextMenuColors(
+            backgroundColor = backgroundColor,
+            textColor = textColor,
+            iconColor = iconColor,
+            disabledTextColor = disabledTextColor,
+            disabledIconColor = disabledIconColor,
+        )
 
     /**
-     * Threshold % of pixels that must match a certain color.
-     * This filters out outlier colors resulting from anti-aliasing.
+     * Threshold % of pixels that must match a certain color. This filters out outlier colors
+     * resulting from anti-aliasing.
      */
     private val filterThresholdPercentage = 0.02f
 
     /**
-     * Gets all the colors in the tagged node.
-     * Removes any padding and outlier colors from anti-aliasing from the result.
+     * Gets all the colors in the tagged node. Removes any padding and outlier colors from
+     * anti-aliasing from the result.
      */
     @RequiresApi(Build.VERSION_CODES.O)
     private fun getColors(): Set<Color> {
@@ -538,25 +502,25 @@
         val density = node.fetchSemanticsNode().layoutInfo.density
 
         // Ignore some padding around the edges where the shadow/rounded corners are.
-        val padding = with(density) {
-            ContextMenuSpec.CornerRadius.toPx().times(4f).ceilToIntPx()
-        }
+        val padding = with(density) { ContextMenuSpec.CornerRadius.toPx().times(4f).ceilToIntPx() }
 
-        val pixelMap = bitmap.toPixelMap(
-            startX = padding,
-            startY = padding,
-            width = bitmap.width - padding,
-            height = bitmap.height - padding,
-        )
+        val pixelMap =
+            bitmap.toPixelMap(
+                startX = padding,
+                startY = padding,
+                width = bitmap.width - padding,
+                height = bitmap.height - padding,
+            )
 
-        val pixelColorHistogram = buildMap<Color, Int> {
-            for (x in 0 until pixelMap.width) {
-                for (y in 0 until pixelMap.height) {
-                    val pixelColor = pixelMap[x, y]
-                    merge(pixelColor, 1) { old, new -> old + new }
+        val pixelColorHistogram =
+            buildMap<Color, Int> {
+                for (x in 0 until pixelMap.width) {
+                    for (y in 0 until pixelMap.height) {
+                        val pixelColor = pixelMap[x, y]
+                        merge(pixelColor, 1) { old, new -> old + new }
+                    }
                 }
             }
-        }
 
         val threshold = pixelMap.width * pixelMap.height * filterThresholdPercentage
         return pixelColorHistogram.filterValues { it >= threshold }.keys
@@ -585,9 +549,7 @@
     @Test
     fun whenContextMenuColors_transparentExceptDisabledText_textColorIsAsExpected() {
         val colors = transparentColors(disabledTextColor = testColor)
-        rule.setContent {
-            TestColumn(colors) { testItem(label = "M".repeat(10), enabled = false) }
-        }
+        rule.setContent { TestColumn(colors) { testItem(label = "M".repeat(10), enabled = false) } }
         assertThatColors(getNonBackgroundColors()).containsExactly(testColor)
     }
 
@@ -599,11 +561,7 @@
             TestColumn(colors) {
                 testItem(
                     leadingIcon = { iconColor ->
-                        Box(
-                            Modifier
-                                .background(iconColor)
-                                .fillMaxSize()
-                        )
+                        Box(Modifier.background(iconColor).fillMaxSize())
                     },
                 )
             }
@@ -620,11 +578,7 @@
                 testItem(
                     enabled = false,
                     leadingIcon = { iconColor ->
-                        Box(
-                            Modifier
-                                .background(iconColor)
-                                .fillMaxSize()
-                        )
+                        Box(Modifier.background(iconColor).fillMaxSize())
                     },
                 )
             }
@@ -637,12 +591,13 @@
     fun whenContextMenuColors_enabledToggled_colorsChangeAsExpected() {
         val enabledColor = Color.Red
         val disabledColor = Color.Blue
-        val colors = transparentColors(
-            textColor = enabledColor,
-            iconColor = enabledColor,
-            disabledTextColor = disabledColor,
-            disabledIconColor = disabledColor,
-        )
+        val colors =
+            transparentColors(
+                textColor = enabledColor,
+                iconColor = enabledColor,
+                disabledTextColor = disabledColor,
+                disabledIconColor = disabledColor,
+            )
 
         var enabled by mutableStateOf(true)
         rule.setContent {
@@ -651,11 +606,7 @@
                     label = "M".repeat(5),
                     enabled = enabled,
                     leadingIcon = { iconColor ->
-                        Box(
-                            Modifier
-                                .background(iconColor)
-                                .fillMaxSize()
-                        )
+                        Box(Modifier.background(iconColor).fillMaxSize())
                     },
                 )
             }
@@ -671,17 +622,19 @@
             assertThatColors(getNonBackgroundColors()).containsExactly(disabledColor)
         }
     }
+
     // endregion ContextMenuColor Tests
 
     // region ContextMenuPopup Tests
-    private val centeringPopupPositionProvider = object : PopupPositionProvider {
-        override fun calculatePosition(
-            anchorBounds: IntRect,
-            windowSize: IntSize,
-            layoutDirection: LayoutDirection,
-            popupContentSize: IntSize
-        ): IntOffset = windowSize.center - popupContentSize.center
-    }
+    private val centeringPopupPositionProvider =
+        object : PopupPositionProvider {
+            override fun calculatePosition(
+                anchorBounds: IntRect,
+                windowSize: IntSize,
+                layoutDirection: LayoutDirection,
+                popupContentSize: IntSize
+            ): IntOffset = windowSize.center - popupContentSize.center
+        }
 
     @Test
     fun whenContextMenuPopup_removedAndReAdded_appearsAsExpected() {
@@ -729,11 +682,7 @@
                     label = "M".repeat(10),
                     enabled = enabled,
                     leadingIcon = { iconColor ->
-                        Box(
-                            Modifier
-                                .background(iconColor)
-                                .fillMaxSize()
-                        )
+                        Box(Modifier.background(iconColor).fillMaxSize())
                     },
                 )
             }
@@ -742,21 +691,24 @@
         repeat(2) {
             enabled = true
             rule.waitForIdle()
-            assertThatColors(getColors()).containsExactly(
-                TestColors.backgroundColor,
-                TestColors.textColor,
-                TestColors.iconColor
-            )
+            assertThatColors(getColors())
+                .containsExactly(
+                    TestColors.backgroundColor,
+                    TestColors.textColor,
+                    TestColors.iconColor
+                )
 
             enabled = false
             rule.waitForIdle()
-            assertThatColors(getColors()).containsExactly(
-                TestColors.backgroundColor,
-                TestColors.disabledTextColor,
-                TestColors.disabledIconColor
-            )
+            assertThatColors(getColors())
+                .containsExactly(
+                    TestColors.backgroundColor,
+                    TestColors.disabledTextColor,
+                    TestColors.disabledIconColor
+                )
         }
     }
+
     // endregion ContextMenuPopup Tests
 
     // region computeContextMenuColors Tests
@@ -767,10 +719,11 @@
     fun computeContextMenuColors_resolvesStylesAsExpected() {
         lateinit var actualColors: ContextMenuColors
         rule.setContent {
-            actualColors = computeContextMenuColors(
-                backgroundStyleId = testStyleId,
-                foregroundStyleId = testStyleId,
-            )
+            actualColors =
+                computeContextMenuColors(
+                    backgroundStyleId = testStyleId,
+                    foregroundStyleId = testStyleId,
+                )
         }
 
         assertThatColor(actualColors.backgroundColor).isFuzzyEqualTo(Color.Red)
@@ -784,10 +737,11 @@
     fun computeContextMenuColors_defaultsAsExpected() {
         lateinit var actualColors: ContextMenuColors
         rule.setContent {
-            actualColors = computeContextMenuColors(
-                backgroundStyleId = emptyStyleId,
-                foregroundStyleId = emptyStyleId,
-            )
+            actualColors =
+                computeContextMenuColors(
+                    backgroundStyleId = emptyStyleId,
+                    foregroundStyleId = emptyStyleId,
+                )
         }
 
         assertThatColor(actualColors.backgroundColor)
diff --git a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/draganddrop/DragDropTargetTest.kt b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/draganddrop/DragDropTargetTest.kt
index d5f51f1..a60394c 100644
--- a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/draganddrop/DragDropTargetTest.kt
+++ b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/draganddrop/DragDropTargetTest.kt
@@ -47,8 +47,7 @@
 @MediumTest
 class DragDropTargetTest {
 
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
     @Test
     fun dragAndDropTarget_changingTarget_updatesModifier() {
@@ -58,18 +57,18 @@
         rule.setContent {
             view = LocalView.current
             Box(
-                Modifier
-                    .size(60.dp)
+                Modifier.size(60.dp)
                     .background(Color.Blue)
                     .testTag("target")
                     .dragAndDropTarget(
                         shouldStartDragAndDrop = { true },
-                        target = remember(targetKey) {
-                            DragAndDropTarget {
-                                dropEvents.add(targetKey)
-                                return@DragAndDropTarget true
+                        target =
+                            remember(targetKey) {
+                                DragAndDropTarget {
+                                    dropEvents.add(targetKey)
+                                    return@DragAndDropTarget true
+                                }
                             }
-                        }
                     )
             )
         }
@@ -118,18 +117,18 @@
         rule.setContent {
             view = LocalView.current
             Box(
-                Modifier
-                    .size(60.dp)
+                Modifier.size(60.dp)
                     .background(Color.Blue)
                     .testTag("target")
                     .dragAndDropTarget(
                         shouldStartDragAndDrop = { true },
-                        target = remember(targetKey) {
-                            DragAndDropTarget {
-                                dropEvents.add(targetKey)
-                                return@DragAndDropTarget true
+                        target =
+                            remember(targetKey) {
+                                DragAndDropTarget {
+                                    dropEvents.add(targetKey)
+                                    return@DragAndDropTarget true
+                                }
                             }
-                        }
                     )
             )
         }
@@ -156,18 +155,23 @@
         rule.setContent {
             view = LocalView.current
             Box(
-                Modifier
-                    .size(60.dp)
+                Modifier.size(60.dp)
                     .background(Color.Blue)
                     .testTag("target")
                     .dragAndDropTarget(
-                        shouldStartDragAndDrop = remember(shouldStartDragAndDropKey) {
-                            {
-                                shouldStartDragAndDropInvocations.add(shouldStartDragAndDropKey)
-                                true
+                        shouldStartDragAndDrop =
+                            remember(shouldStartDragAndDropKey) {
+                                {
+                                    shouldStartDragAndDropInvocations.add(shouldStartDragAndDropKey)
+                                    true
+                                }
+                            },
+                        target =
+                            remember {
+                                DragAndDropTarget {
+                                    return@DragAndDropTarget true
+                                }
                             }
-                        },
-                        target = remember { DragAndDropTarget { return@DragAndDropTarget true } }
                     )
             )
         }
@@ -198,10 +202,14 @@
     private fun DragAndDropTarget(
         onEvent: (Boolean) -> Unit = {},
         onDrop: (DragAndDropEvent) -> Boolean
-    ) = object : DragAndDropTarget {
-        override fun onEntered(event: DragAndDropEvent) = onEvent(true)
-        override fun onExited(event: DragAndDropEvent) = onEvent(false)
-        override fun onEnded(event: DragAndDropEvent) = onEvent(false)
-        override fun onDrop(event: DragAndDropEvent) = onDrop(event)
-    }
+    ) =
+        object : DragAndDropTarget {
+            override fun onEntered(event: DragAndDropEvent) = onEvent(true)
+
+            override fun onExited(event: DragAndDropEvent) = onEvent(false)
+
+            override fun onEnded(event: DragAndDropEvent) = onEvent(false)
+
+            override fun onDrop(event: DragAndDropEvent) = onDrop(event)
+        }
 }
diff --git a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/gestures/AwaitEachGestureTest.kt b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/gestures/AwaitEachGestureTest.kt
index a55a110..48b90d1 100644
--- a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/gestures/AwaitEachGestureTest.kt
+++ b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/gestures/AwaitEachGestureTest.kt
@@ -45,8 +45,7 @@
 @MediumTest
 @RunWith(AndroidJUnit4::class)
 class AwaitEachGestureTest {
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
     private val tag = "pointerInputTag"
 
@@ -55,29 +54,34 @@
         val inputLatch = CountDownLatch(1)
         rule.setContent {
             Box(
-                Modifier.testTag(tag).pointerInput(Unit) {
-                    try {
-                        var count = 0
-                        coroutineScope {
-                            awaitEachGesture {
-                                when (count++) {
-                                    0 -> Unit // continue
-                                    1 -> throw CancellationException("internal exception")
-                                    else -> {
-                                        // detectGestures will loop infinitely with nothing in the
-                                        // middle so wait for cancellation
-                                        cancel("really canceled")
+                Modifier.testTag(tag)
+                    .pointerInput(Unit) {
+                        try {
+                            var count = 0
+                            coroutineScope {
+                                awaitEachGesture {
+                                    when (count++) {
+                                        0 -> Unit // continue
+                                        1 -> throw CancellationException("internal exception")
+                                        else -> {
+                                            // detectGestures will loop infinitely with nothing in
+                                            // the
+                                            // middle so wait for cancellation
+                                            cancel("really canceled")
+                                        }
                                     }
                                 }
                             }
+                        } catch (cancellationException: CancellationException) {
+                            assertWithMessage(
+                                    "The internal exception shouldn't cancel detectGestures"
+                                )
+                                .that(cancellationException.message)
+                                .isEqualTo("really canceled")
                         }
-                    } catch (cancellationException: CancellationException) {
-                        assertWithMessage("The internal exception shouldn't cancel detectGestures")
-                            .that(cancellationException.message)
-                            .isEqualTo("really canceled")
+                        inputLatch.countDown()
                     }
-                    inputLatch.countDown()
-                }.size(10.dp)
+                    .size(10.dp)
             )
         }
         rule.waitForIdle()
@@ -91,14 +95,12 @@
         val tag = "input rect"
         rule.setContent {
             Box(
-                Modifier.fillMaxSize()
-                    .testTag(tag)
-                    .pointerInput(Unit) {
-                        awaitEachGesture {
-                            val event = awaitPointerEvent()
-                            events += event.type
-                        }
+                Modifier.fillMaxSize().testTag(tag).pointerInput(Unit) {
+                    awaitEachGesture {
+                        val event = awaitPointerEvent()
+                        events += event.type
                     }
+                }
             )
         }
 
diff --git a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/gestures/AwaitTouchEventTest.kt b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/gestures/AwaitTouchEventTest.kt
index 72e6b01..3d2c626 100644
--- a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/gestures/AwaitTouchEventTest.kt
+++ b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/gestures/AwaitTouchEventTest.kt
@@ -44,8 +44,7 @@
 @RunWith(AndroidJUnit4::class)
 class AwaitTouchEventTest {
 
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
     @Before
     fun before() {
@@ -67,32 +66,22 @@
             Box {
                 BasicText(
                     "LongPressText",
-                    modifier = Modifier
-                        .testTag("myLongPress")
-                        .pointerInput(Unit) {
+                    modifier =
+                        Modifier.testTag("myLongPress").pointerInput(Unit) {
                             awaitEachGesture {
                                 val down = awaitFirstDown(requireUnconsumed = false)
-                                awaitLongPressOrCancellation(down.id)?.let {
-                                    counter++
-                                }
+                                awaitLongPressOrCancellation(down.id)?.let { counter++ }
                             }
                         }
                 )
             }
         }
 
-        rule.runOnIdle {
-            Truth.assertThat(counter).isEqualTo(0)
-        }
+        rule.runOnIdle { Truth.assertThat(counter).isEqualTo(0) }
 
-        rule.onNodeWithTag("myLongPress")
-            .performTouchInput {
-                longClick()
-            }
+        rule.onNodeWithTag("myLongPress").performTouchInput { longClick() }
 
-        rule.runOnIdle {
-            Truth.assertThat(counter).isEqualTo(1)
-        }
+        rule.runOnIdle { Truth.assertThat(counter).isEqualTo(1) }
     }
 
     @Test
@@ -103,32 +92,22 @@
             Box {
                 BasicText(
                     "LongPressText",
-                    modifier = Modifier
-                        .testTag("myLongPress")
-                        .pointerInput(Unit) {
+                    modifier =
+                        Modifier.testTag("myLongPress").pointerInput(Unit) {
                             awaitEachGesture {
                                 val down = awaitFirstDown(requireUnconsumed = false)
-                                awaitLongPressOrCancellation(down.id)?.let {
-                                    counter++
-                                }
+                                awaitLongPressOrCancellation(down.id)?.let { counter++ }
                             }
                         }
                 )
             }
         }
 
-        rule.runOnIdle {
-            Truth.assertThat(counter).isEqualTo(0)
-        }
+        rule.runOnIdle { Truth.assertThat(counter).isEqualTo(0) }
 
-        rule.onNodeWithTag("myLongPress")
-            .performTouchInput {
-                click()
-            }
+        rule.onNodeWithTag("myLongPress").performTouchInput { click() }
 
-        rule.runOnIdle {
-            Truth.assertThat(counter).isEqualTo(0)
-        }
+        rule.runOnIdle { Truth.assertThat(counter).isEqualTo(0) }
     }
 
     @Test
@@ -139,42 +118,31 @@
             Box {
                 BasicText(
                     "LongPressText",
-                    modifier = Modifier
-                        .testTag("myLongPress")
-                        .pointerInput(Unit) {
+                    modifier =
+                        Modifier.testTag("myLongPress").pointerInput(Unit) {
                             awaitEachGesture {
                                 val down = awaitFirstDown(requireUnconsumed = false)
-                                awaitLongPressOrCancellation(down.id)?.let {
-                                    counter++
-                                }
+                                awaitLongPressOrCancellation(down.id)?.let { counter++ }
                             }
                         }
                 )
             }
         }
 
-        rule.runOnIdle {
-            Truth.assertThat(counter).isEqualTo(0)
-        }
+        rule.runOnIdle { Truth.assertThat(counter).isEqualTo(0) }
 
-        rule.onNodeWithTag("myLongPress")
-            .performTouchInput {
-                down(center)
-            }
+        rule.onNodeWithTag("myLongPress").performTouchInput { down(center) }
 
         rule.mainClock.advanceTimeBy(100L)
 
-        rule.onNodeWithTag("myLongPress")
-            .performTouchInput {
-                move()
-                up()
-            }
+        rule.onNodeWithTag("myLongPress").performTouchInput {
+            move()
+            up()
+        }
 
         rule.mainClock.advanceTimeBy(400L)
 
-        rule.runOnIdle {
-            Truth.assertThat(counter).isEqualTo(0)
-        }
+        rule.runOnIdle { Truth.assertThat(counter).isEqualTo(0) }
     }
 
     @Test
@@ -185,42 +153,31 @@
             Box {
                 BasicText(
                     "LongPressText",
-                    modifier = Modifier
-                        .testTag("myLongPress")
-                        .pointerInput(Unit) {
+                    modifier =
+                        Modifier.testTag("myLongPress").pointerInput(Unit) {
                             awaitEachGesture {
                                 val down = awaitFirstDown(requireUnconsumed = false)
-                                awaitLongPressOrCancellation(down.id)?.let {
-                                    counter++
-                                }
+                                awaitLongPressOrCancellation(down.id)?.let { counter++ }
                             }
                         }
                 )
             }
         }
 
-        rule.runOnIdle {
-            Truth.assertThat(counter).isEqualTo(0)
-        }
+        rule.runOnIdle { Truth.assertThat(counter).isEqualTo(0) }
 
-        rule.onNodeWithTag("myLongPress")
-            .performTouchInput {
-                down(center)
-            }
+        rule.onNodeWithTag("myLongPress").performTouchInput { down(center) }
 
         rule.mainClock.advanceTimeBy(100L)
 
-        rule.onNodeWithTag("myLongPress")
-            .performTouchInput {
-                move()
-                cancel()
-            }
+        rule.onNodeWithTag("myLongPress").performTouchInput {
+            move()
+            cancel()
+        }
 
         rule.mainClock.advanceTimeBy(400L)
 
-        rule.runOnIdle {
-            Truth.assertThat(counter).isEqualTo(0)
-        }
+        rule.runOnIdle { Truth.assertThat(counter).isEqualTo(0) }
     }
 
     @Test
@@ -231,44 +188,31 @@
             Box {
                 BasicText(
                     "LongPressText",
-                    modifier = Modifier
-                        .testTag("myLongPress")
-                        .pointerInput(Unit) {
+                    modifier =
+                        Modifier.testTag("myLongPress").pointerInput(Unit) {
                             awaitEachGesture {
                                 val down = awaitFirstDown(requireUnconsumed = false)
-                                awaitLongPressOrCancellation(down.id)?.let {
-                                    counter++
-                                }
+                                awaitLongPressOrCancellation(down.id)?.let { counter++ }
                             }
                         }
                 )
             }
         }
 
-        rule.runOnIdle {
-            Truth.assertThat(counter).isEqualTo(0)
-        }
+        rule.runOnIdle { Truth.assertThat(counter).isEqualTo(0) }
 
         val firstFingerId = 1
         val secondFingerId = 2
 
-        rule.onNodeWithTag("myLongPress")
-            .performTouchInput {
-                down(firstFingerId, center)
-            }
+        rule.onNodeWithTag("myLongPress").performTouchInput { down(firstFingerId, center) }
 
         rule.mainClock.advanceTimeBy(100L)
 
-        rule.onNodeWithTag("myLongPress")
-            .performTouchInput {
-                down(secondFingerId, centerRight)
-            }
+        rule.onNodeWithTag("myLongPress").performTouchInput { down(secondFingerId, centerRight) }
 
         rule.mainClock.advanceTimeBy(400L)
 
-        rule.runOnIdle {
-            Truth.assertThat(counter).isEqualTo(1)
-        }
+        rule.runOnIdle { Truth.assertThat(counter).isEqualTo(1) }
     }
 
     // Tests this set of events:
@@ -285,51 +229,35 @@
             Box {
                 BasicText(
                     "LongPressText",
-                    modifier = Modifier
-                        .testTag("myLongPress")
-                        .pointerInput(Unit) {
+                    modifier =
+                        Modifier.testTag("myLongPress").pointerInput(Unit) {
                             awaitEachGesture {
                                 val down = awaitFirstDown(requireUnconsumed = false)
-                                awaitLongPressOrCancellation(down.id)?.let {
-                                    counter++
-                                }
+                                awaitLongPressOrCancellation(down.id)?.let { counter++ }
                             }
                         }
                 )
             }
         }
 
-        rule.runOnIdle {
-            Truth.assertThat(counter).isEqualTo(0)
-        }
+        rule.runOnIdle { Truth.assertThat(counter).isEqualTo(0) }
 
         val firstFinger = 1
         val secondFinger = 2
 
-        rule.onNodeWithTag("myLongPress")
-            .performTouchInput {
-                down(firstFinger, center)
-            }
+        rule.onNodeWithTag("myLongPress").performTouchInput { down(firstFinger, center) }
 
         rule.mainClock.advanceTimeBy(100L)
 
-        rule.onNodeWithTag("myLongPress")
-            .performTouchInput {
-                down(secondFinger, centerRight)
-            }
+        rule.onNodeWithTag("myLongPress").performTouchInput { down(secondFinger, centerRight) }
 
         rule.mainClock.advanceTimeBy(100L)
 
-        rule.onNodeWithTag("myLongPress")
-            .performTouchInput {
-                up(firstFinger)
-            }
+        rule.onNodeWithTag("myLongPress").performTouchInput { up(firstFinger) }
 
         rule.mainClock.advanceTimeBy(300L)
 
-        rule.runOnIdle {
-            Truth.assertThat(counter).isEqualTo(1)
-        }
+        rule.runOnIdle { Truth.assertThat(counter).isEqualTo(1) }
     }
 
     @Test
@@ -340,44 +268,33 @@
             Box {
                 BasicText(
                     "LongPressText",
-                    modifier = Modifier
-                        .testTag("myLongPress")
-                        .pointerInput(Unit) {
+                    modifier =
+                        Modifier.testTag("myLongPress").pointerInput(Unit) {
                             awaitEachGesture {
                                 val down = awaitFirstDown(requireUnconsumed = false)
-                                awaitLongPressOrCancellation(down.id)?.let {
-                                    counter++
-                                }
+                                awaitLongPressOrCancellation(down.id)?.let { counter++ }
                             }
                         }
                 )
             }
         }
 
-        rule.runOnIdle {
-            Truth.assertThat(counter).isEqualTo(0)
-        }
+        rule.runOnIdle { Truth.assertThat(counter).isEqualTo(0) }
 
-        rule.onNodeWithTag("myLongPress")
-            .performTouchInput {
-                down(center)
-            }
+        rule.onNodeWithTag("myLongPress").performTouchInput { down(center) }
 
         rule.mainClock.advanceTimeBy(100L)
 
-        rule.onNodeWithTag("myLongPress")
-            .performTouchInput {
-                // Moves touch outside of bounds
-                moveTo(Offset(right + 10, centerY))
-            }
+        rule.onNodeWithTag("myLongPress").performTouchInput {
+            // Moves touch outside of bounds
+            moveTo(Offset(right + 10, centerY))
+        }
 
         // With this time change, time will have passed the long press threshold, but because the
         // touch moved outside the bounds, it won't have been counted.
         rule.mainClock.advanceTimeBy(400L)
 
-        rule.runOnIdle {
-            Truth.assertThat(counter).isEqualTo(0)
-        }
+        rule.runOnIdle { Truth.assertThat(counter).isEqualTo(0) }
     }
 
     @Test
@@ -386,9 +303,8 @@
 
         rule.setContent {
             Box(
-                modifier = Modifier
-                    .testTag("MyLongPressParent")
-                    .pointerInput(Unit) {
+                modifier =
+                    Modifier.testTag("MyLongPressParent").pointerInput(Unit) {
                         awaitEachGesture {
                             while (true) {
                                 val event = awaitPointerEvent(PointerEventPass.Final)
@@ -401,34 +317,26 @@
             ) {
                 BasicText(
                     "LongPressText",
-                    modifier = Modifier
-                        .testTag("myLongPress")
-                        .pointerInput(Unit) {
+                    modifier =
+                        Modifier.testTag("myLongPress").pointerInput(Unit) {
                             awaitEachGesture {
                                 val down = awaitFirstDown(requireUnconsumed = false)
-                                awaitLongPressOrCancellation(down.id)?.let {
-                                    counter++
-                                }
+                                awaitLongPressOrCancellation(down.id)?.let { counter++ }
                             }
                         }
                 )
             }
         }
 
-        rule.runOnIdle {
-            Truth.assertThat(counter).isEqualTo(0)
-        }
+        rule.runOnIdle { Truth.assertThat(counter).isEqualTo(0) }
 
-        rule.onNodeWithTag("myLongPress")
-            .performTouchInput {
-                down(center)
-                moveTo(centerRight)
-            }
+        rule.onNodeWithTag("myLongPress").performTouchInput {
+            down(center)
+            moveTo(centerRight)
+        }
 
         rule.mainClock.advanceTimeBy(400L)
 
-        rule.runOnIdle {
-            Truth.assertThat(counter).isEqualTo(0)
-        }
+        rule.runOnIdle { Truth.assertThat(counter).isEqualTo(0) }
     }
 }
diff --git a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/gestures/DragGestureDetectorTest.kt b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/gestures/DragGestureDetectorTest.kt
index 6119530..21de95b 100644
--- a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/gestures/DragGestureDetectorTest.kt
+++ b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/gestures/DragGestureDetectorTest.kt
@@ -55,8 +55,7 @@
 @RunWith(Parameterized::class)
 class DragGestureDetectorTest(dragType: GestureType) {
 
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
     enum class GestureType {
         VerticalDrag,
@@ -69,9 +68,7 @@
     }
 
     companion object {
-        @JvmStatic
-        @Parameterized.Parameters
-        fun parameters() = GestureType.values()
+        @JvmStatic @Parameterized.Parameters fun parameters() = GestureType.values()
     }
 
     private var dragDistance = 0f
@@ -163,13 +160,14 @@
     private val AwaitVerticalDragUtil = layoutWithGestureDetector {
         awaitEachGesture {
             val down = awaitFirstDown()
-            val slopChange = awaitVerticalTouchSlopOrCancellation(down.id) { change, overSlop ->
-                if (change.positionChange().y > 0f || !consumePositiveOnly) {
-                    dragged = true
-                    dragDistance = overSlop
-                    change.consume()
+            val slopChange =
+                awaitVerticalTouchSlopOrCancellation(down.id) { change, overSlop ->
+                    if (change.positionChange().y > 0f || !consumePositiveOnly) {
+                        dragged = true
+                        dragDistance = overSlop
+                        change.consume()
+                    }
                 }
-            }
             if (slopChange != null || sloppyDetector) {
                 gestureStarted = true
                 var pointer = if (sloppyDetector) down.id else slopChange!!.id
@@ -224,14 +222,15 @@
     private val AwaitDragUtil = layoutWithGestureDetector {
         awaitEachGesture {
             val down = awaitFirstDown()
-            val slopChange = awaitTouchSlopOrCancellation(down.id) { change, overSlop ->
-                val positionChange = change.positionChange()
-                if (positionChange.x > 0f || positionChange.y > 0f || !consumePositiveOnly) {
-                    dragged = true
-                    dragDistance = overSlop.getDistance()
-                    change.consume()
+            val slopChange =
+                awaitTouchSlopOrCancellation(down.id) { change, overSlop ->
+                    val positionChange = change.positionChange()
+                    if (positionChange.x > 0f || positionChange.y > 0f || !consumePositiveOnly) {
+                        dragged = true
+                        dragDistance = overSlop.getDistance()
+                        change.consume()
+                    }
                 }
-            }
             if (slopChange != null || sloppyDetector) {
                 gestureStarted = true
                 var pointer = if (sloppyDetector) down.id else slopChange!!.id
@@ -252,43 +251,48 @@
         }
     }
 
-    private val content = when (dragType) {
-        GestureType.VerticalDrag -> VerticalTouchSlopUtil
-        GestureType.HorizontalDrag -> HorizontalTouchSlopUtil
-        GestureType.AwaitVerticalDragOrCancel -> AwaitVerticalDragUtil
-        GestureType.AwaitHorizontalDragOrCancel -> AwaitHorizontalDragUtil
-        GestureType.AwaitDragOrCancel -> AwaitDragUtil
-        GestureType.DragWithVertical -> DragTouchSlopUtil
-        GestureType.DragWithHorizontal -> DragTouchSlopUtil
-    }
+    private val content =
+        when (dragType) {
+            GestureType.VerticalDrag -> VerticalTouchSlopUtil
+            GestureType.HorizontalDrag -> HorizontalTouchSlopUtil
+            GestureType.AwaitVerticalDragOrCancel -> AwaitVerticalDragUtil
+            GestureType.AwaitHorizontalDragOrCancel -> AwaitHorizontalDragUtil
+            GestureType.AwaitDragOrCancel -> AwaitDragUtil
+            GestureType.DragWithVertical -> DragTouchSlopUtil
+            GestureType.DragWithHorizontal -> DragTouchSlopUtil
+        }
 
-    private val dragMotion = when (dragType) {
-        GestureType.VerticalDrag,
-        GestureType.AwaitVerticalDragOrCancel,
-        GestureType.DragWithVertical -> Offset(0f, 18f)
-        else -> Offset(18f, 0f)
-    }
+    private val dragMotion =
+        when (dragType) {
+            GestureType.VerticalDrag,
+            GestureType.AwaitVerticalDragOrCancel,
+            GestureType.DragWithVertical -> Offset(0f, 18f)
+            else -> Offset(18f, 0f)
+        }
 
-    private val crossDragMotion = when (dragType) {
-        GestureType.VerticalDrag,
-        GestureType.AwaitVerticalDragOrCancel,
-        GestureType.DragWithVertical -> Offset(18f, 0f)
-        else -> Offset(0f, 18f)
-    }
+    private val crossDragMotion =
+        when (dragType) {
+            GestureType.VerticalDrag,
+            GestureType.AwaitVerticalDragOrCancel,
+            GestureType.DragWithVertical -> Offset(18f, 0f)
+            else -> Offset(0f, 18f)
+        }
 
-    private val twoAxisDrag = when (dragType) {
-        GestureType.DragWithVertical,
-        GestureType.DragWithHorizontal,
-        GestureType.AwaitDragOrCancel -> true
-        else -> false
-    }
+    private val twoAxisDrag =
+        when (dragType) {
+            GestureType.DragWithVertical,
+            GestureType.DragWithHorizontal,
+            GestureType.AwaitDragOrCancel -> true
+            else -> false
+        }
 
-    private val supportsSloppyGesture = when (dragType) {
-        GestureType.AwaitVerticalDragOrCancel,
-        GestureType.AwaitHorizontalDragOrCancel,
-        GestureType.AwaitDragOrCancel -> true
-        else -> false
-    }
+    private val supportsSloppyGesture =
+        when (dragType) {
+            GestureType.AwaitVerticalDragOrCancel,
+            GestureType.AwaitHorizontalDragOrCancel,
+            GestureType.AwaitDragOrCancel -> true
+            else -> false
+        }
 
     private val nothingHandler: PointerInputChange.() -> Unit = {}
 
@@ -309,14 +313,12 @@
     ): @Composable () -> Unit = {
         CompositionLocalProvider(
             LocalDensity provides Density(1f),
-            LocalViewConfiguration provides TestViewConfiguration(
-                minimumTouchTargetSize = DpSize.Zero
-            )
+            LocalViewConfiguration provides
+                TestViewConfiguration(minimumTouchTargetSize = DpSize.Zero)
         ) {
             with(LocalDensity.current) {
                 Box(
-                    Modifier
-                        .fillMaxSize()
+                    Modifier.fillMaxSize()
                         .pointerInput(Unit) {
                             // Some tests execute a lambda before the initial and final passes
                             // so they are called here, higher up the chain, so that the
@@ -326,13 +328,9 @@
                             awaitPointerEventScope {
                                 while (true) {
                                     val event = awaitPointerEvent(PointerEventPass.Initial)
-                                    event.changes.forEach {
-                                        initialPass(it)
-                                    }
+                                    event.changes.forEach { initialPass(it) }
                                     awaitPointerEvent(PointerEventPass.Final)
-                                    event.changes.forEach {
-                                        finalPass(it)
-                                    }
+                                    event.changes.forEach { finalPass(it) }
                                 }
                             }
                         }
@@ -346,9 +344,9 @@
     }
 
     /**
-     * Executes [block] on the [TargetTag] layout. The optional [initialPass] is executed
-     * prior to the [PointerEventPass.Initial] and [finalPass] is executed before
-     * [PointerEventPass.Final] of the gesture detector.
+     * Executes [block] on the [TargetTag] layout. The optional [initialPass] is executed prior to
+     * the [PointerEventPass.Initial] and [finalPass] is executed before [PointerEventPass.Final] of
+     * the gesture detector.
      */
     private fun performTouch(
         initialPass: PointerInputChange.() -> Unit = nothingHandler,
@@ -363,9 +361,7 @@
         this.finalPass = nothingHandler
     }
 
-    /**
-     * A normal drag, just to ensure that the drag worked.
-     */
+    /** A normal drag, just to ensure that the drag worked. */
     @Test
     fun normalDrag() {
         performTouch {
@@ -375,18 +371,14 @@
         assertTrue(gestureStarted)
         assertTrue(dragged)
         assertEquals(0f, dragDistance)
-        performTouch {
-            moveBy(dragMotion)
-        }
+        performTouch { moveBy(dragMotion) }
         assertEquals(18f, dragDistance)
         assertFalse(gestureEnded)
         performTouch { up() }
         assertTrue(gestureEnded)
     }
 
-    /**
-     * A drag in the opposite direction doesn't cause a drag event.
-     */
+    /** A drag in the opposite direction doesn't cause a drag event. */
     @Test
     fun crossDrag() {
         if (!twoAxisDrag) {
@@ -412,9 +404,7 @@
         }
     }
 
-    /**
-     * Use two fingers and lift the finger before the touch slop is reached.
-     */
+    /** Use two fingers and lift the finger before the touch slop is reached. */
     @Test
     fun twoFingerDrag_upBeforeSlop() {
         performTouch {
@@ -423,17 +413,13 @@
         }
 
         // second finger shouldn't cause a drag. It should follow finger1
-        performTouch {
-            moveBy(1, dragMotion)
-        }
+        performTouch { moveBy(1, dragMotion) }
 
         assertFalse(gestureStarted)
         assertFalse(dragged)
 
         // now it should move to finger 2
-        performTouch {
-            up(0)
-        }
+        performTouch { up(0) }
 
         performTouch {
             moveBy(1, dragMotion)
@@ -446,9 +432,7 @@
         assertTrue(gestureEnded)
     }
 
-    /**
-     * Use two fingers and lift the finger after the touch slop is reached.
-     */
+    /** Use two fingers and lift the finger after the touch slop is reached. */
     @Test
     fun twoFingerDrag_upAfterSlop() {
         performTouch {
@@ -472,41 +456,27 @@
         assertTrue(gestureEnded)
     }
 
-    /**
-     * Cancel drag during touch slop
-     */
+    /** Cancel drag during touch slop */
     @Test
     fun cancelDragDuringSlop() {
-        performTouch {
-            down(Offset.Zero)
-        }
-        performTouch(initialPass = { consume() }) {
-            moveBy(dragMotion)
-        }
-        performTouch {
-            up()
-        }
+        performTouch { down(Offset.Zero) }
+        performTouch(initialPass = { consume() }) { moveBy(dragMotion) }
+        performTouch { up() }
         assertFalse(gestureStarted)
         assertFalse(dragged)
         assertFalse(gestureEnded)
         assertFalse(gestureCanceled) // only canceled if the touch slop was crossed first
     }
 
-    /**
-     * Cancel drag after touch slop
-     */
+    /** Cancel drag after touch slop */
     @Test
     fun cancelDragAfterSlop() {
         performTouch {
             down(Offset.Zero)
             moveBy(dragMotion)
         }
-        performTouch(initialPass = { consume() }) {
-            moveBy(dragMotion)
-        }
-        performTouch {
-            up()
-        }
+        performTouch(initialPass = { consume() }) { moveBy(dragMotion) }
+        performTouch { up() }
         assertTrue(gestureStarted)
         assertTrue(dragged)
         assertFalse(gestureEnded)
@@ -515,22 +485,18 @@
     }
 
     /**
-     * When this drag direction is more than the other drag direction, it should have priority
-     * in locking the orientation.
+     * When this drag direction is more than the other drag direction, it should have priority in
+     * locking the orientation.
      */
     @Test
     fun dragLockedWithPriority() {
         if (!twoAxisDrag) {
-            performTouch {
-                down(Offset.Zero)
-            }
+            performTouch { down(Offset.Zero) }
             // This should have priority because it has moved more than the other direction.
             performTouch(finalPass = { assertTrue(isConsumed) }) {
                 moveBy((dragMotion * 2f) + crossDragMotion)
             }
-            performTouch {
-                up()
-            }
+            performTouch { up() }
             assertTrue(gestureStarted)
             assertTrue(dragged)
             assertTrue(gestureEnded)
@@ -540,8 +506,8 @@
     }
 
     /**
-     * When a drag is not consumed, it should lead to the touch slop being reset. This is
-     * important when you drag your finger to
+     * When a drag is not consumed, it should lead to the touch slop being reset. This is important
+     * when you drag your finger to
      */
     @Test
     fun dragBackAndForth() {
@@ -570,8 +536,8 @@
     }
 
     /**
-     * When gesture detectors use the wrong pointer for the drag, it should just not
-     * detect the touch.
+     * When gesture detectors use the wrong pointer for the drag, it should just not detect the
+     * touch.
      */
     @Test
     fun pointerUpTooQuickly() {
@@ -603,9 +569,7 @@
                 moveBy(Offset(50f, 50f))
             }
             assertTrue(startOrder < dragOrder)
-            performTouch {
-                up()
-            }
+            performTouch { up() }
             assertTrue(startOrder < dragOrder)
             assertTrue(dragOrder < endOrder)
             assertTrue(cancelOrder == -1)
@@ -619,9 +583,7 @@
                 down(Offset.Zero)
                 moveBy(dragMotion)
             }
-            performTouch(initialPass = { consume() }) {
-                moveBy(dragMotion)
-            }
+            performTouch(initialPass = { consume() }) { moveBy(dragMotion) }
             assertTrue(startOrder < dragOrder)
             assertTrue(dragOrder < cancelOrder)
             assertTrue(endOrder == -1)
diff --git a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/gestures/ForEachGestureTest.kt b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/gestures/ForEachGestureTest.kt
index cd68863..0fb26c7 100644
--- a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/gestures/ForEachGestureTest.kt
+++ b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/gestures/ForEachGestureTest.kt
@@ -46,14 +46,13 @@
 @MediumTest
 @RunWith(AndroidJUnit4::class)
 class ForEachGestureTest {
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
     private val tag = "pointerInputTag"
 
     /**
-     * Make sure that a single `forEachGesture` block does not cause a crash.
-     * Note: Is is no longer possible for an empty gesture since pointerInput() is started lazily.
+     * Make sure that a single `forEachGesture` block does not cause a crash. Note: Is is no longer
+     * possible for an empty gesture since pointerInput() is started lazily.
      */
     // TODO (jjw): Check with George that this test is needed anymore.
     @Test
@@ -62,23 +61,26 @@
         val latch2 = CountDownLatch(1)
         rule.setContent {
             Box(
-                Modifier.testTag(tag).pointerInput(Unit) {
-                    forEachGesture {
-                        if (latch1.count == 0L) {
-                            // forEachGesture will loop infinitely with nothing in the middle
-                            // so wait for cancellation
-                            awaitCancellation()
+                Modifier.testTag(tag)
+                    .pointerInput(Unit) {
+                        forEachGesture {
+                            if (latch1.count == 0L) {
+                                // forEachGesture will loop infinitely with nothing in the middle
+                                // so wait for cancellation
+                                awaitCancellation()
+                            }
+                            latch1.countDown()
                         }
-                        latch1.countDown()
                     }
-                }.pointerInput(Unit) {
-                    awaitPointerEventScope {
-                        // there is no awaitPointerEvent() / loop here, so it will only
-                        // execute once.
-                        assertTrue(currentEvent.changes.size == 1)
-                        latch2.countDown()
+                    .pointerInput(Unit) {
+                        awaitPointerEventScope {
+                            // there is no awaitPointerEvent() / loop here, so it will only
+                            // execute once.
+                            assertTrue(currentEvent.changes.size == 1)
+                            latch2.countDown()
+                        }
                     }
-                }.size(10.dp)
+                    .size(10.dp)
             )
         }
         rule.waitForIdle()
@@ -93,26 +95,29 @@
         rule.setContent {
             Box(
                 Modifier.pointerInput(Unit) {
-                    try {
-                        var count = 0
+                        try {
+                            var count = 0
 
-                        forEachGesture {
-                            when (count++) {
-                                0 -> Unit // continue
-                                1 -> throw CancellationException("internal exception")
-                                else -> {
-                                    // forEachGesture will loop infinitely with nothing in the
-                                    // middle so wait for cancellation
-                                    awaitCancellation()
+                            forEachGesture {
+                                when (count++) {
+                                    0 -> Unit // continue
+                                    1 -> throw CancellationException("internal exception")
+                                    else -> {
+                                        // forEachGesture will loop infinitely with nothing in the
+                                        // middle so wait for cancellation
+                                        awaitCancellation()
+                                    }
                                 }
                             }
+                        } catch (cancellationException: CancellationException) {
+                            assertWithMessage(
+                                    "The internal exception shouldn't cancel forEachGesture"
+                                )
+                                .that(cancellationException.message)
+                                .isNotEqualTo("internal exception")
                         }
-                    } catch (cancellationException: CancellationException) {
-                        assertWithMessage("The internal exception shouldn't cancel forEachGesture")
-                            .that(cancellationException.message)
-                            .isNotEqualTo("internal exception")
                     }
-                }.size(10.dp)
+                    .size(10.dp)
             )
         }
     }
@@ -122,20 +127,24 @@
         rule.setContent {
             Box(
                 Modifier.pointerInput(Unit) {
-                    coroutineScope {
-                        val job = launch(Dispatchers.Unconfined) {
-                            forEachGesture {
-                                // forEachGesture will loop infinitely with nothing in the middle
-                                // so wait for cancellation
-                                awaitCancellation()
-                            }
+                        coroutineScope {
+                            val job =
+                                launch(Dispatchers.Unconfined) {
+                                    forEachGesture {
+                                        // forEachGesture will loop infinitely with nothing in the
+                                        // middle
+                                        // so wait for cancellation
+                                        awaitCancellation()
+                                    }
 
-                            assertWithMessage("forEachGesture should have been cancelled").fail()
+                                    assertWithMessage("forEachGesture should have been cancelled")
+                                        .fail()
+                                }
+
+                            job.cancel()
                         }
-
-                        job.cancel()
                     }
-                }.size(10.dp)
+                    .size(10.dp)
             )
         }
     }
diff --git a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/gestures/TapGestureDetectorTest.kt b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/gestures/TapGestureDetectorTest.kt
index f7fa9de..253dd19 100644
--- a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/gestures/TapGestureDetectorTest.kt
+++ b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/gestures/TapGestureDetectorTest.kt
@@ -52,8 +52,7 @@
 @RunWith(JUnit4::class)
 class TapGestureDetectorTest {
 
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
     private var pressed = false
     private var released = false
@@ -66,8 +65,8 @@
     private val LongPressTimeoutMillis: Long = 500L
 
     /**
-     * The maximum time from the start of the first tap to the start of the second
-     * tap in a double-tap gesture.
+     * The maximum time from the start of the first tap to the start of the second tap in a
+     * double-tap gesture.
      */
     // TODO(shepshapard): In Android, this is actually the time from the first's up event
     // to the second's down event, according to the ViewConfiguration docs.
@@ -83,9 +82,7 @@
                     canceled = true
                 }
             },
-            onTap = {
-                tapped = true
-            }
+            onTap = { tapped = true }
         )
     }
 
@@ -99,9 +96,7 @@
                     canceled = true
                 }
             },
-            onTap = {
-                tapped = true
-            }
+            onTap = { tapped = true }
         )
     }
 
@@ -142,14 +137,12 @@
     ): @Composable () -> Unit = {
         CompositionLocalProvider(
             LocalDensity provides Density(1f),
-            LocalViewConfiguration provides TestViewConfiguration(
-                minimumTouchTargetSize = DpSize.Zero
-            )
+            LocalViewConfiguration provides
+                TestViewConfiguration(minimumTouchTargetSize = DpSize.Zero)
         ) {
             with(LocalDensity.current) {
                 Box(
-                    Modifier
-                        .fillMaxSize()
+                    Modifier.fillMaxSize()
                         // Some tests execute a lambda before the initial and final passes
                         // so they are called here, higher up the chain, so that the
                         // calls happen prior to the gestureDetector below. The lambdas
@@ -159,13 +152,9 @@
                             awaitPointerEventScope {
                                 while (true) {
                                     val event = awaitPointerEvent(PointerEventPass.Initial)
-                                    event.changes.forEach {
-                                        initialPass(it)
-                                    }
+                                    event.changes.forEach { initialPass(it) }
                                     awaitPointerEvent(PointerEventPass.Final)
-                                    event.changes.forEach {
-                                        finalPass(it)
-                                    }
+                                    event.changes.forEach { finalPass(it) }
                                 }
                             }
                         }
@@ -191,16 +180,12 @@
         this.finalPass = nothingHandler
     }
 
-    /**
-     * Clicking in the region should result in the callback being invoked.
-     */
+    /** Clicking in the region should result in the callback being invoked. */
     @Test
     fun normalTap() {
         rule.setContent(util)
 
-        performTouch(finalPass = { assertTrue(isConsumed) }) {
-            down(0, Offset(5f, 5f))
-        }
+        performTouch(finalPass = { assertTrue(isConsumed) }) { down(0, Offset(5f, 5f)) }
 
         assertTrue(pressed)
         assertFalse(tapped)
@@ -208,25 +193,19 @@
 
         rule.mainClock.advanceTimeBy(50)
 
-        performTouch(finalPass = { assertTrue(isConsumed) }) {
-            up(0)
-        }
+        performTouch(finalPass = { assertTrue(isConsumed) }) { up(0) }
 
         assertTrue(tapped)
         assertTrue(released)
         assertFalse(canceled)
     }
 
-    /**
-     * Clicking in the region should result in the callback being invoked.
-     */
+    /** Clicking in the region should result in the callback being invoked. */
     @Test
     fun normalTap_withShortcut() {
         rule.setContent(utilWithShortcut)
 
-        performTouch(finalPass = { assertTrue(isConsumed) }) {
-            down(0, Offset(5f, 5f))
-        }
+        performTouch(finalPass = { assertTrue(isConsumed) }) { down(0, Offset(5f, 5f)) }
 
         assertTrue(pressed)
         assertFalse(tapped)
@@ -234,33 +213,25 @@
 
         rule.mainClock.advanceTimeBy(50)
 
-        performTouch(finalPass = { assertTrue(isConsumed) }) {
-            up(0)
-        }
+        performTouch(finalPass = { assertTrue(isConsumed) }) { up(0) }
 
         assertTrue(tapped)
         assertTrue(released)
         assertFalse(canceled)
     }
 
-    /**
-     * Clicking in the region should result in the callback being invoked.
-     */
+    /** Clicking in the region should result in the callback being invoked. */
     @Test
     fun normalTapWithAllGestures() {
         rule.setContent(allGestures)
 
-        performTouch(finalPass = { assertTrue(isConsumed) }) {
-            down(0, Offset(5f, 5f))
-        }
+        performTouch(finalPass = { assertTrue(isConsumed) }) { down(0, Offset(5f, 5f)) }
 
         assertTrue(pressed)
 
         rule.mainClock.advanceTimeBy(50)
 
-        performTouch(finalPass = { assertTrue(isConsumed) }) {
-            up(0)
-        }
+        performTouch(finalPass = { assertTrue(isConsumed) }) { up(0) }
 
         assertTrue(released)
 
@@ -275,19 +246,13 @@
         assertFalse(doubleTapped)
     }
 
-    /**
-     * Clicking in the region should result in the callback being invoked.
-     */
+    /** Clicking in the region should result in the callback being invoked. */
     @Test
     fun normalDoubleTap() {
         rule.setContent(allGestures)
 
-        performTouch {
-            down(0, Offset(5f, 5f))
-        }
-        performTouch(finalPass = { assertTrue(isConsumed) }) {
-            up(0)
-        }
+        performTouch { down(0, Offset(5f, 5f)) }
+        performTouch(finalPass = { assertTrue(isConsumed) }) { up(0) }
 
         assertTrue(pressed)
         assertTrue(released)
@@ -299,12 +264,8 @@
 
         rule.mainClock.advanceTimeBy(50)
 
-        performTouch {
-            down(0, Offset(5f, 5f))
-        }
-        performTouch(finalPass = { assertTrue(isConsumed) }) {
-            up(0)
-        }
+        performTouch { down(0, Offset(5f, 5f)) }
+        performTouch(finalPass = { assertTrue(isConsumed) }) { up(0) }
 
         assertFalse(tapped)
         assertTrue(doubleTapped)
@@ -312,16 +273,12 @@
         assertTrue(released)
     }
 
-    /**
-     * Long press in the region should result in the callback being invoked.
-     */
+    /** Long press in the region should result in the callback being invoked. */
     @Test
     fun normalLongPress() {
         rule.setContent(allGestures)
 
-        performTouch(finalPass = { assertTrue(isConsumed) }) {
-            down(0, Offset(5f, 5f))
-        }
+        performTouch(finalPass = { assertTrue(isConsumed) }) { down(0, Offset(5f, 5f)) }
 
         assertTrue(pressed)
 
@@ -331,9 +288,7 @@
 
         rule.mainClock.advanceTimeBy(500)
 
-        performTouch(finalPass = { assertTrue(isConsumed) }) {
-            up(0)
-        }
+        performTouch(finalPass = { assertTrue(isConsumed) }) { up(0) }
 
         assertFalse(tapped)
         assertFalse(doubleTapped)
@@ -342,8 +297,8 @@
     }
 
     /**
-     * Pressing in the region, sliding out and then lifting should result in
-     * the callback not being invoked
+     * Pressing in the region, sliding out and then lifting should result in the callback not being
+     * invoked
      */
     @Test
     fun tapMiss() {
@@ -354,9 +309,7 @@
             moveTo(0, Offset(15f, 15f))
         }
 
-        performTouch(finalPass = { assertFalse(isConsumed) }) {
-            up(0)
-        }
+        performTouch(finalPass = { assertFalse(isConsumed) }) { up(0) }
 
         assertTrue(pressed)
         assertTrue(canceled)
@@ -365,8 +318,8 @@
     }
 
     /**
-     * Pressing in the region, sliding out and then lifting should result in
-     * the callback not being invoked
+     * Pressing in the region, sliding out and then lifting should result in the callback not being
+     * invoked
      */
     @Test
     fun tapMiss_withShortcut() {
@@ -377,9 +330,7 @@
             moveTo(0, Offset(15f, 15f))
         }
 
-        performTouch(finalPass = { assertFalse(isConsumed) }) {
-            up(0)
-        }
+        performTouch(finalPass = { assertFalse(isConsumed) }) { up(0) }
 
         assertTrue(pressed)
         assertTrue(canceled)
@@ -388,8 +339,8 @@
     }
 
     /**
-     * Pressing in the region, sliding out and then lifting should result in
-     * the callback not being invoked
+     * Pressing in the region, sliding out and then lifting should result in the callback not being
+     * invoked
      */
     @Test
     fun longPressMiss() {
@@ -402,9 +353,7 @@
 
         rule.mainClock.advanceTimeBy(LongPressTimeoutMillis + 10)
 
-        performTouch(finalPass = { assertFalse(isConsumed) }) {
-            up(0)
-        }
+        performTouch(finalPass = { assertFalse(isConsumed) }) { up(0) }
 
         assertTrue(pressed)
         assertFalse(released)
@@ -415,8 +364,8 @@
     }
 
     /**
-     * Pressing in the region, sliding out and then lifting should result in
-     * the callback not being invoked for double-tap
+     * Pressing in the region, sliding out and then lifting should result in the callback not being
+     * invoked for double-tap
      */
     @Test
     fun doubleTapMiss() {
@@ -441,9 +390,7 @@
             moveTo(1, Offset(15f, 15f))
         }
 
-        performTouch(finalPass = { assertFalse(isConsumed) }) {
-            up(1)
-        }
+        performTouch(finalPass = { assertFalse(isConsumed) }) { up(1) }
 
         assertTrue(pressed)
         assertFalse(released)
@@ -454,8 +401,8 @@
     }
 
     /**
-     * Pressing in the region, sliding out, then back in, then lifting
-     * should result the gesture being canceled.
+     * Pressing in the region, sliding out, then back in, then lifting should result the gesture
+     * being canceled.
      */
     @Test
     fun tapOutAndIn() {
@@ -467,9 +414,7 @@
             moveTo(0, Offset(6f, 6f))
         }
 
-        performTouch(finalPass = { assertFalse(isConsumed) }) {
-            up(0)
-        }
+        performTouch(finalPass = { assertFalse(isConsumed) }) { up(0) }
 
         assertFalse(tapped)
         assertTrue(pressed)
@@ -478,8 +423,8 @@
     }
 
     /**
-     * Pressing in the region, sliding out, then back in, then lifting
-     * should result the gesture being canceled.
+     * Pressing in the region, sliding out, then back in, then lifting should result the gesture
+     * being canceled.
      */
     @Test
     fun tapOutAndIn_withShortcut() {
@@ -491,9 +436,7 @@
             moveTo(0, Offset(6f, 6f))
         }
 
-        performTouch(finalPass = { assertFalse(isConsumed) }) {
-            up(0)
-        }
+        performTouch(finalPass = { assertFalse(isConsumed) }) { up(0) }
 
         assertFalse(tapped)
         assertTrue(pressed)
@@ -501,9 +444,7 @@
         assertTrue(canceled)
     }
 
-    /**
-     * After a first tap, a second tap should also be detected.
-     */
+    /** After a first tap, a second tap should also be detected. */
     @Test
     fun secondTap() {
         rule.setContent(util)
@@ -532,9 +473,7 @@
         assertFalse(canceled)
     }
 
-    /**
-     * After a first tap, a second tap should also be detected.
-     */
+    /** After a first tap, a second tap should also be detected. */
     @Test
     fun secondTap_withShortcut() {
         rule.setContent(utilWithShortcut)
@@ -564,23 +503,19 @@
     }
 
     /**
-     * Clicking in the region with the up already consumed should result in the callback not
-     * being invoked.
+     * Clicking in the region with the up already consumed should result in the callback not being
+     * invoked.
      */
     @Test
     fun consumedUpTap() {
         rule.setContent(util)
 
-        performTouch {
-            down(0, Offset(5f, 5f))
-        }
+        performTouch { down(0, Offset(5f, 5f)) }
 
         assertFalse(tapped)
         assertTrue(pressed)
 
-        performTouch(initialPass = { if (pressed != previousPressed) consume() }) {
-            up(0)
-        }
+        performTouch(initialPass = { if (pressed != previousPressed) consume() }) { up(0) }
 
         assertFalse(tapped)
         assertFalse(released)
@@ -588,23 +523,19 @@
     }
 
     /**
-     * Clicking in the region with the up already consumed should result in the callback not
-     * being invoked.
+     * Clicking in the region with the up already consumed should result in the callback not being
+     * invoked.
      */
     @Test
     fun consumedUpTap_withShortcut() {
         rule.setContent(utilWithShortcut)
 
-        performTouch {
-            down(0, Offset(5f, 5f))
-        }
+        performTouch { down(0, Offset(5f, 5f)) }
 
         assertFalse(tapped)
         assertTrue(pressed)
 
-        performTouch(initialPass = { if (pressed != previousPressed) consume() }) {
-            up(0)
-        }
+        performTouch(initialPass = { if (pressed != previousPressed) consume() }) { up(0) }
 
         assertFalse(tapped)
         assertFalse(released)
@@ -612,26 +543,20 @@
     }
 
     /**
-     * Clicking in the region with the motion consumed should result in the callback not
-     * being invoked.
+     * Clicking in the region with the motion consumed should result in the callback not being
+     * invoked.
      */
     @Test
     fun consumedMotionTap() {
         rule.setContent(util)
 
-        performTouch {
-            down(0, Offset(5f, 5f))
-        }
+        performTouch { down(0, Offset(5f, 5f)) }
 
-        performTouch(initialPass = { consume() }) {
-            moveTo(0, Offset(6f, 2f))
-        }
+        performTouch(initialPass = { consume() }) { moveTo(0, Offset(6f, 2f)) }
 
         rule.mainClock.advanceTimeBy(50)
 
-        performTouch {
-            up(0)
-        }
+        performTouch { up(0) }
 
         assertFalse(tapped)
         assertTrue(pressed)
@@ -640,26 +565,20 @@
     }
 
     /**
-     * Clicking in the region with the motion consumed should result in the callback not
-     * being invoked.
+     * Clicking in the region with the motion consumed should result in the callback not being
+     * invoked.
      */
     @Test
     fun consumedMotionTap_withShortcut() {
         rule.setContent(utilWithShortcut)
 
-        performTouch {
-            down(0, Offset(5f, 5f))
-        }
+        performTouch { down(0, Offset(5f, 5f)) }
 
-        performTouch(initialPass = { consume() }) {
-            moveTo(0, Offset(6f, 2f))
-        }
+        performTouch(initialPass = { consume() }) { moveTo(0, Offset(6f, 2f)) }
 
         rule.mainClock.advanceTimeBy(50)
 
-        performTouch {
-            up(0)
-        }
+        performTouch { up(0) }
 
         assertFalse(tapped)
         assertTrue(pressed)
@@ -671,19 +590,13 @@
     fun consumedChange_MotionTap() {
         rule.setContent(util)
 
-        performTouch {
-            down(0, Offset(5f, 5f))
-        }
+        performTouch { down(0, Offset(5f, 5f)) }
 
-        performTouch(initialPass = { consume() }) {
-            moveTo(0, Offset(6f, 2f))
-        }
+        performTouch(initialPass = { consume() }) { moveTo(0, Offset(6f, 2f)) }
 
         rule.mainClock.advanceTimeBy(50)
 
-        performTouch {
-            up(0)
-        }
+        performTouch { up(0) }
 
         assertFalse(tapped)
         assertTrue(pressed)
@@ -692,174 +605,124 @@
     }
 
     /**
-     * Clicking in the region with the up already consumed should result in the callback not
-     * being invoked.
+     * Clicking in the region with the up already consumed should result in the callback not being
+     * invoked.
      */
     @Test
     fun consumedChange_upTap() {
         rule.setContent(util)
 
-        performTouch {
-            down(0, Offset(5f, 5f))
-        }
+        performTouch { down(0, Offset(5f, 5f)) }
 
         assertFalse(tapped)
         assertTrue(pressed)
 
-        performTouch(initialPass = { consume() }) {
-            up(0)
-        }
+        performTouch(initialPass = { consume() }) { up(0) }
 
         assertFalse(tapped)
         assertFalse(released)
         assertTrue(canceled)
     }
 
-    /**
-     * Ensure that two-finger taps work.
-     */
+    /** Ensure that two-finger taps work. */
     @Test
     fun twoFingerTap() {
         rule.setContent(util)
 
-        performTouch(finalPass = { assertTrue(isConsumed) }) {
-            down(0, Offset(1f, 1f))
-        }
+        performTouch(finalPass = { assertTrue(isConsumed) }) { down(0, Offset(1f, 1f)) }
 
         assertTrue(pressed)
         pressed = false
 
-        performTouch(finalPass = { assertFalse(isConsumed) }) {
-            down(1, Offset(9f, 5f))
-        }
+        performTouch(finalPass = { assertFalse(isConsumed) }) { down(1, Offset(9f, 5f)) }
 
         assertFalse(pressed)
 
-        performTouch(finalPass = { assertFalse(isConsumed) }) {
-            up(0)
-        }
+        performTouch(finalPass = { assertFalse(isConsumed) }) { up(0) }
 
         assertFalse(tapped)
         assertFalse(released)
 
-        performTouch(finalPass = { assertTrue(isConsumed) }) {
-            up(1)
-        }
+        performTouch(finalPass = { assertTrue(isConsumed) }) { up(1) }
 
         assertTrue(tapped)
         assertTrue(released)
         assertFalse(canceled)
     }
 
-    /**
-     * Ensure that two-finger taps work.
-     */
+    /** Ensure that two-finger taps work. */
     @Test
     fun twoFingerTap_withShortcut() {
         rule.setContent(utilWithShortcut)
 
-        performTouch(finalPass = { assertTrue(isConsumed) }) {
-            down(0, Offset(1f, 1f))
-        }
+        performTouch(finalPass = { assertTrue(isConsumed) }) { down(0, Offset(1f, 1f)) }
 
         assertTrue(pressed)
         pressed = false
 
-        performTouch(finalPass = { assertFalse(isConsumed) }) {
-            down(1, Offset(9f, 5f))
-        }
+        performTouch(finalPass = { assertFalse(isConsumed) }) { down(1, Offset(9f, 5f)) }
 
         assertFalse(pressed)
 
-        performTouch(finalPass = { assertFalse(isConsumed) }) {
-            up(0)
-        }
+        performTouch(finalPass = { assertFalse(isConsumed) }) { up(0) }
 
         assertFalse(tapped)
         assertFalse(released)
 
-        performTouch(finalPass = { assertTrue(isConsumed) }) {
-            up(1)
-        }
+        performTouch(finalPass = { assertTrue(isConsumed) }) { up(1) }
 
         assertTrue(tapped)
         assertTrue(released)
         assertFalse(canceled)
     }
 
-    /**
-     * A position change consumption on any finger should cause tap to cancel.
-     */
+    /** A position change consumption on any finger should cause tap to cancel. */
     @Test
     fun twoFingerTapCancel() {
         rule.setContent(util)
 
-        performTouch {
-            down(0, Offset(1f, 1f))
-        }
+        performTouch { down(0, Offset(1f, 1f)) }
         assertTrue(pressed)
 
-        performTouch {
-            down(1, Offset(9f, 5f))
-        }
+        performTouch { down(1, Offset(9f, 5f)) }
 
-        performTouch(initialPass = { consume() }) {
-            moveTo(0, Offset(5f, 5f))
-        }
-        performTouch(finalPass = { assertFalse(isConsumed) }) {
-            up(0)
-        }
+        performTouch(initialPass = { consume() }) { moveTo(0, Offset(5f, 5f)) }
+        performTouch(finalPass = { assertFalse(isConsumed) }) { up(0) }
 
         assertFalse(tapped)
         assertTrue(canceled)
 
         rule.mainClock.advanceTimeBy(50)
-        performTouch(finalPass = { assertFalse(isConsumed) }) {
-            up(1)
-        }
+        performTouch(finalPass = { assertFalse(isConsumed) }) { up(1) }
 
         assertFalse(tapped)
         assertFalse(released)
     }
 
-    /**
-     * A position change consumption on any finger should cause tap to cancel.
-     */
+    /** A position change consumption on any finger should cause tap to cancel. */
     @Test
     fun twoFingerTapCancel_withShortcut() {
         rule.setContent(utilWithShortcut)
-        performTouch {
-            down(0, Offset(1f, 1f))
-        }
+        performTouch { down(0, Offset(1f, 1f)) }
 
         assertTrue(pressed)
 
-        performTouch {
-            down(1, Offset(9f, 5f))
-        }
+        performTouch { down(1, Offset(9f, 5f)) }
 
-        performTouch(initialPass = { consume() }) {
-            moveTo(0, Offset(5f, 5f))
-        }
-        performTouch(finalPass = { assertFalse(isConsumed) }) {
-            up(0)
-        }
+        performTouch(initialPass = { consume() }) { moveTo(0, Offset(5f, 5f)) }
+        performTouch(finalPass = { assertFalse(isConsumed) }) { up(0) }
 
         assertFalse(tapped)
         assertTrue(canceled)
 
         rule.mainClock.advanceTimeBy(50)
-        performTouch(finalPass = { assertFalse(isConsumed) }) {
-            up(1)
-        }
+        performTouch(finalPass = { assertFalse(isConsumed) }) { up(1) }
 
         assertFalse(tapped)
         assertFalse(released)
     }
 
-    /**
-     * Detect the second tap as long press.
-     */
+    /** Detect the second tap as long press. */
     @Test
     fun secondTapLongPress() {
         rule.setContent(allGestures)
@@ -880,9 +743,7 @@
         released = false
 
         rule.mainClock.advanceTimeBy(50)
-        performTouch {
-            down(1, Offset(5f, 5f))
-        }
+        performTouch { down(1, Offset(5f, 5f)) }
 
         assertTrue(pressed)
 
@@ -894,9 +755,7 @@
         assertFalse(canceled)
 
         rule.mainClock.advanceTimeBy(500)
-        performTouch {
-            up(1)
-        }
+        performTouch { up(1) }
         assertTrue(released)
     }
 }
diff --git a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/gestures/TransformGestureDetectorTest.kt b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/gestures/TransformGestureDetectorTest.kt
index 9434406..03bf34a 100644
--- a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/gestures/TransformGestureDetectorTest.kt
+++ b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/gestures/TransformGestureDetectorTest.kt
@@ -54,13 +54,10 @@
 @RunWith(Parameterized::class)
 class TransformGestureDetectorTest(val panZoomLock: Boolean) {
 
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
     companion object {
-        @JvmStatic
-        @Parameterized.Parameters
-        fun parameters() = arrayOf(false, true)
+        @JvmStatic @Parameterized.Parameters fun parameters() = arrayOf(false, true)
     }
 
     private var centroid = Offset.Zero
@@ -72,9 +69,7 @@
     private var zoomAmount = 1f
 
     private val util = layoutWithGestureDetector {
-        detectTransformGestures(
-            panZoomLock = panZoomLock
-        ) { c, pan, gestureZoom, gestureAngle ->
+        detectTransformGestures(panZoomLock = panZoomLock) { c, pan, gestureZoom, gestureAngle ->
             centroid = c
             if (gestureAngle != 0f) {
                 rotated = true
@@ -111,14 +106,12 @@
     ): @Composable () -> Unit = {
         CompositionLocalProvider(
             LocalDensity provides Density(1f),
-            LocalViewConfiguration provides TestViewConfiguration(
-                minimumTouchTargetSize = DpSize.Zero
-            )
+            LocalViewConfiguration provides
+                TestViewConfiguration(minimumTouchTargetSize = DpSize.Zero)
         ) {
             with(LocalDensity.current) {
                 Box(
-                    Modifier
-                        .fillMaxSize()
+                    Modifier.fillMaxSize()
                         // Some tests execute a lambda before the initial and final passes
                         // so they are called here, higher up the chain, so that the
                         // calls happen prior to the gestureDetector below. The lambdas
@@ -128,13 +121,9 @@
                             awaitPointerEventScope {
                                 while (true) {
                                     val event = awaitPointerEvent(PointerEventPass.Initial)
-                                    event.changes.forEach {
-                                        initialPass(it)
-                                    }
+                                    event.changes.forEach { initialPass(it) }
                                     awaitPointerEvent(PointerEventPass.Final)
-                                    event.changes.forEach {
-                                        finalPass(it)
-                                    }
+                                    event.changes.forEach { finalPass(it) }
                                 }
                             }
                         }
@@ -160,28 +149,20 @@
         this.finalPass = nothingHandler
     }
 
-    /**
-     * Single finger pan.
-     */
+    /** Single finger pan. */
     @Test
     fun singleFingerPan() {
         rule.setContent(util)
 
-        performTouch(finalPass = { assertFalse(isConsumed) }) {
-            down(0, Offset(5f, 5f))
-        }
+        performTouch(finalPass = { assertFalse(isConsumed) }) { down(0, Offset(5f, 5f)) }
 
         assertFalse(panned)
 
-        performTouch(finalPass = { assertFalse(isConsumed) }) {
-            moveBy(0, Offset(12.7f, 12.7f))
-        }
+        performTouch(finalPass = { assertFalse(isConsumed) }) { moveBy(0, Offset(12.7f, 12.7f)) }
 
         assertFalse(panned)
 
-        performTouch(finalPass = { assertTrue(isConsumed) }) {
-            moveBy(0, Offset(0.1f, 0.1f))
-        }
+        performTouch(finalPass = { assertTrue(isConsumed) }) { moveBy(0, Offset(0.1f, 0.1f)) }
 
         assertEquals(17.7f, centroid.x, 0.1f)
         assertEquals(17.7f, centroid.y, 0.1f)
@@ -193,23 +174,17 @@
 
         panAmount = Offset.Zero
 
-        performTouch(finalPass = { assertTrue(isConsumed) }) {
-            moveBy(0, Offset(1f, 0f))
-        }
+        performTouch(finalPass = { assertTrue(isConsumed) }) { moveBy(0, Offset(1f, 0f)) }
 
         assertEquals(Offset(1f, 0f), panAmount)
 
-        performTouch(finalPass = { assertFalse(isConsumed) }) {
-            up(0)
-        }
+        performTouch(finalPass = { assertFalse(isConsumed) }) { up(0) }
 
         assertFalse(rotated)
         assertFalse(zoomed)
     }
 
-    /**
-     * Multi-finger pan
-     */
+    /** Multi-finger pan */
     @Test
     fun multiFingerPanZoom() {
         rule.setContent(util)
@@ -240,9 +215,7 @@
 
         assertFalse(panned)
 
-        performTouch(finalPass = { assertFalse(isConsumed) }) {
-            moveBy(0, Offset(13f, 13f))
-        }
+        performTouch(finalPass = { assertFalse(isConsumed) }) { moveBy(0, Offset(13f, 13f)) }
 
         // With the move below, we've now averaged enough movement (touchSlop is around 18.0)
         performTouch(
@@ -270,9 +243,7 @@
         }
     }
 
-    /**
-     * 2-pointer zoom
-     */
+    /** 2-pointer zoom */
     @Test
     fun zoom2Pointer() {
         rule.setContent(util)
@@ -363,16 +334,12 @@
         }
     }
 
-    /**
-     * 4-pointer zoom
-     */
+    /** 4-pointer zoom */
     @Test
     fun zoom4Pointer() {
         rule.setContent(util)
 
-        performTouch {
-            down(0, Offset(0f, 50f))
-        }
+        performTouch { down(0, Offset(0f, 50f)) }
 
         // just get past the touch slop
         performTouch {
@@ -418,9 +385,7 @@
         }
     }
 
-    /**
-     * 2 pointer rotation.
-     */
+    /** 2 pointer rotation. */
     @Test
     fun rotation2Pointer() {
         rule.setContent(util)
@@ -459,16 +424,12 @@
         assertEquals(1f, zoomAmount, 0.1f)
     }
 
-    /**
-     * 2 pointer rotation, with early panning.
-     */
+    /** 2 pointer rotation, with early panning. */
     @Test
     fun rotation2PointerLock() {
         rule.setContent(util)
 
-        performTouch {
-            down(0, Offset(0f, 50f))
-        }
+        performTouch { down(0, Offset(0f, 50f)) }
 
         // just get past the touch slop with panning
         performTouch {
@@ -476,9 +437,7 @@
             moveBy(0, Offset(1000f, 0f))
         }
 
-        performTouch {
-            down(1, Offset(100f, 50f))
-        }
+        performTouch { down(1, Offset(100f, 50f)) }
 
         // now do the rotation:
         performTouch {
@@ -502,9 +461,7 @@
         assertEquals(1f, zoomAmount, 0.1f)
     }
 
-    /**
-     * Adding or removing a pointer won't change the current values
-     */
+    /** Adding or removing a pointer won't change the current values */
     @Test
     fun noChangeOnPointerDownUp() {
         rule.setContent(util)
@@ -522,17 +479,13 @@
         panned = false
         zoomed = false
 
-        performTouch {
-            down(2, Offset(0f, 50f))
-        }
+        performTouch { down(2, Offset(0f, 50f)) }
 
         assertFalse(rotated)
         assertFalse(panned)
         assertFalse(zoomed)
 
-        performTouch {
-            down(3, Offset(100f, 50f))
-        }
+        performTouch { down(3, Offset(100f, 50f)) }
 
         assertFalse(rotated)
         assertFalse(panned)
@@ -550,52 +503,34 @@
         assertFalse(zoomed)
     }
 
-    /**
-     * Consuming position during touch slop will cancel the current gesture.
-     */
+    /** Consuming position during touch slop will cancel the current gesture. */
     @Test
     fun touchSlopCancel() {
         rule.setContent(util)
 
-        performTouch {
-            down(0, Offset(5f, 5f))
-        }
+        performTouch { down(0, Offset(5f, 5f)) }
 
-        performTouch(initialPass = { consume() }) {
-            moveBy(0, Offset(50f, 0f))
-        }
+        performTouch(initialPass = { consume() }) { moveBy(0, Offset(50f, 0f)) }
 
-        performTouch {
-            up(0)
-        }
+        performTouch { up(0) }
 
         assertFalse(panned)
         assertFalse(zoomed)
         assertFalse(rotated)
     }
 
-    /**
-     * Consuming position after touch slop will cancel the current gesture.
-     */
+    /** Consuming position after touch slop will cancel the current gesture. */
     @Test
     fun afterTouchSlopCancel() {
         rule.setContent(util)
 
-        performTouch {
-            down(0, Offset(5f, 5f))
-        }
+        performTouch { down(0, Offset(5f, 5f)) }
 
-        performTouch {
-            moveBy(0, Offset(50f, 0f))
-        }
+        performTouch { moveBy(0, Offset(50f, 0f)) }
 
-        performTouch(initialPass = { consume() }) {
-            moveBy(0, Offset(50f, 0f))
-        }
+        performTouch(initialPass = { consume() }) { moveBy(0, Offset(50f, 0f)) }
 
-        performTouch {
-            up(0)
-        }
+        performTouch { up(0) }
 
         assertTrue(panned)
         assertFalse(zoomed)
diff --git a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/gestures/snapping/LazyGridSnapFlingBehaviorTest.kt b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/gestures/snapping/LazyGridSnapFlingBehaviorTest.kt
index 5f4c65d..d30e686 100644
--- a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/gestures/snapping/LazyGridSnapFlingBehaviorTest.kt
+++ b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/gestures/snapping/LazyGridSnapFlingBehaviorTest.kt
@@ -124,10 +124,7 @@
 
         // act
         onMainList().performTouchInput {
-            swipeMainAxisWithVelocity(
-                stepSize,
-                velocityThreshold / 2
-            )
+            swipeMainAxisWithVelocity(stepSize, velocityThreshold / 2)
         }
 
         // assert
@@ -159,10 +156,7 @@
 
         // act
         onMainList().performTouchInput {
-            swipeMainAxisWithVelocity(
-                stepSize / 2,
-                velocityThreshold * 2
-            )
+            swipeMainAxisWithVelocity(stepSize / 2, velocityThreshold * 2)
         }
 
         // assert
@@ -195,11 +189,7 @@
 
         // act
         onMainList().performTouchInput {
-            swipeMainAxisWithVelocity(
-                stepSize / 2,
-                velocityThreshold * 2,
-                true
-            )
+            swipeMainAxisWithVelocity(stepSize / 2, velocityThreshold * 2, true)
         }
 
         // assert
@@ -231,10 +221,7 @@
 
         // act
         onMainList().performTouchInput {
-            swipeMainAxisWithVelocity(
-                1.5f * stepSize,
-                velocityThreshold * 3
-            )
+            swipeMainAxisWithVelocity(1.5f * stepSize, velocityThreshold * 3)
         }
 
         // assert
@@ -249,39 +236,32 @@
         var stepSize = 0f
         var latestAvailableVelocity = Velocity.Zero
         lateinit var lazyGridState: LazyGridState
-        val inspectingNestedScrollConnection = object : NestedScrollConnection {
-            override suspend fun onPostFling(consumed: Velocity, available: Velocity): Velocity {
-                latestAvailableVelocity = available
-                return Velocity.Zero
+        val inspectingNestedScrollConnection =
+            object : NestedScrollConnection {
+                override suspend fun onPostFling(
+                    consumed: Velocity,
+                    available: Velocity
+                ): Velocity {
+                    latestAvailableVelocity = available
+                    return Velocity.Zero
+                }
             }
-        }
 
         // arrange
         rule.setContent {
             val density = LocalDensity.current
             lazyGridState = rememberLazyGridState(180) // almost at the end
             stepSize = with(density) { ItemSize.toPx() }
-            Box(
-                modifier = Modifier
-                    .fillMaxSize()
-                    .nestedScroll(inspectingNestedScrollConnection)
-            ) {
+            Box(modifier = Modifier.fillMaxSize().nestedScroll(inspectingNestedScrollConnection)) {
                 MainLayout(state = lazyGridState)
             }
         }
 
         // act
-        onMainList().performTouchInput {
-            swipeMainAxisWithVelocity(
-                1.5f * stepSize,
-                15000f
-            )
-        }
+        onMainList().performTouchInput { swipeMainAxisWithVelocity(1.5f * stepSize, 15000f) }
 
         // assert
-        rule.runOnIdle {
-            assertNotEquals(latestAvailableVelocity.toAbsoluteFloat(), 0f)
-        }
+        rule.runOnIdle { assertNotEquals(latestAvailableVelocity.toAbsoluteFloat(), 0f) }
 
         // arrange
         rule.runOnIdle {
@@ -293,17 +273,10 @@
         latestAvailableVelocity = Velocity.Zero
 
         // act
-        onMainList().performTouchInput {
-            swipeMainAxisWithVelocity(
-                -1.5f * stepSize,
-                15000f
-            )
-        }
+        onMainList().performTouchInput { swipeMainAxisWithVelocity(-1.5f * stepSize, 15000f) }
 
         // assert
-        rule.runOnIdle {
-            assertNotEquals(latestAvailableVelocity.toAbsoluteFloat(), 0f)
-        }
+        rule.runOnIdle { assertNotEquals(latestAvailableVelocity.toAbsoluteFloat(), 0f) }
     }
 
     @Test
@@ -311,23 +284,23 @@
         var stepSize = 0f
         var latestAvailableVelocity = Velocity.Zero
         lateinit var lazyGridState: LazyGridState
-        val inspectingNestedScrollConnection = object : NestedScrollConnection {
-            override suspend fun onPostFling(consumed: Velocity, available: Velocity): Velocity {
-                latestAvailableVelocity = available
-                return Velocity.Zero
+        val inspectingNestedScrollConnection =
+            object : NestedScrollConnection {
+                override suspend fun onPostFling(
+                    consumed: Velocity,
+                    available: Velocity
+                ): Velocity {
+                    latestAvailableVelocity = available
+                    return Velocity.Zero
+                }
             }
-        }
 
         // arrange
         rule.setContent {
             val density = LocalDensity.current
             lazyGridState = rememberLazyGridState(100) // middle of the grid
             stepSize = with(density) { ItemSize.toPx() }
-            Box(
-                modifier = Modifier
-                    .fillMaxSize()
-                    .nestedScroll(inspectingNestedScrollConnection)
-            ) {
+            Box(modifier = Modifier.fillMaxSize().nestedScroll(inspectingNestedScrollConnection)) {
                 MainLayout(state = lazyGridState)
             }
         }
@@ -341,9 +314,7 @@
         }
 
         // assert
-        rule.runOnIdle {
-            assertEquals(latestAvailableVelocity.toAbsoluteFloat(), 0f)
-        }
+        rule.runOnIdle { assertEquals(latestAvailableVelocity.toAbsoluteFloat(), 0f) }
 
         // arrange
         rule.runOnIdle {
@@ -363,9 +334,7 @@
         }
 
         // assert
-        rule.runOnIdle {
-            assertEquals(latestAvailableVelocity.toAbsoluteFloat(), 0f)
-        }
+        rule.runOnIdle { assertEquals(latestAvailableVelocity.toAbsoluteFloat(), 0f) }
     }
 
     @Test
@@ -385,12 +354,7 @@
         rule.mainClock.autoAdvance = false
         // act
         val velocity = velocityThreshold * 3
-        onMainList().performTouchInput {
-            swipeMainAxisWithVelocity(
-                1.5f * stepSize,
-                velocity
-            )
-        }
+        onMainList().performTouchInput { swipeMainAxisWithVelocity(1.5f * stepSize, velocity) }
         rule.mainClock.advanceTimeByFrame()
 
         // act and assert: next calculated offset is the first value emitted by
@@ -401,9 +365,7 @@
         rule.mainClock.autoAdvance = true
 
         // assert: value settles back to zero
-        rule.runOnIdle {
-            Truth.assertThat(scrollOffset.last()).isEqualTo(0f)
-        }
+        rule.runOnIdle { Truth.assertThat(scrollOffset.last()).isEqualTo(0f) }
     }
 
     private fun onMainList() = rule.onNodeWithTag(TestTag)
@@ -413,9 +375,10 @@
         snapLayoutInfoProvider = remember(state) { SnapLayoutInfoProvider(state) }
         val innerFlingBehavior =
             rememberSnapFlingBehavior(snapLayoutInfoProvider = snapLayoutInfoProvider)
-        snapFlingBehavior = remember(innerFlingBehavior) {
-            QuerySnapFlingBehavior(innerFlingBehavior) { scrollOffset.add(it) }
-        }
+        snapFlingBehavior =
+            remember(innerFlingBehavior) {
+                QuerySnapFlingBehavior(innerFlingBehavior) { scrollOffset.add(it) }
+            }
         LazyGrid(
             cells = GridCells.FixedSize(ItemSize),
             state = state,
@@ -423,11 +386,7 @@
             flingBehavior = snapFlingBehavior
         ) {
             items(200) {
-                Box(
-                    modifier = Modifier
-                        .size(ItemSize)
-                        .background(Color.Yellow)
-                ) {
+                Box(modifier = Modifier.size(ItemSize).background(Color.Yellow)) {
                     BasicText(text = it.toString())
                 }
             }
@@ -457,16 +416,17 @@
         var minDistance = Float.POSITIVE_INFINITY
         val layoutInfo = state.layoutInfo
         (state.layoutInfo.visibleItemsInfo).forEach {
-            val distance = calculateDistanceToDesiredSnapPosition(
-                mainAxisViewPortSize = layoutInfo.singleAxisViewportSize,
-                beforeContentPadding = layoutInfo.beforeContentPadding,
-                afterContentPadding = layoutInfo.afterContentPadding,
-                itemSize = it.sizeOnMainAxis(orientation = layoutInfo.orientation),
-                itemOffset = it.offsetOnMainAxis(orientation = layoutInfo.orientation),
-                itemIndex = it.index,
-                snapPosition = Center,
-                itemCount = layoutInfo.totalItemsCount
-            )
+            val distance =
+                calculateDistanceToDesiredSnapPosition(
+                    mainAxisViewPortSize = layoutInfo.singleAxisViewportSize,
+                    beforeContentPadding = layoutInfo.beforeContentPadding,
+                    afterContentPadding = layoutInfo.afterContentPadding,
+                    itemSize = it.sizeOnMainAxis(orientation = layoutInfo.orientation),
+                    itemOffset = it.offsetOnMainAxis(orientation = layoutInfo.orientation),
+                    itemIndex = it.index,
+                    snapPosition = Center,
+                    itemCount = layoutInfo.totalItemsCount
+                )
             if (abs(distance) < minDistance) {
                 minDistance = abs(distance)
                 itemIndex = it.index
@@ -480,16 +440,13 @@
         endVelocity: Float,
         reversed: Boolean = false
     ) {
-        val (start, end) = if (orientation == Orientation.Vertical) {
-            bottomCenter to bottomCenter.copy(y = bottomCenter.y - scrollSize)
-        } else {
-            centerRight to centerRight.copy(x = centerRight.x - scrollSize)
-        }
-        swipeWithVelocity(
-            if (reversed) end else start,
-            if (reversed) start else end,
-            endVelocity
-        )
+        val (start, end) =
+            if (orientation == Orientation.Vertical) {
+                bottomCenter to bottomCenter.copy(y = bottomCenter.y - scrollSize)
+            } else {
+                centerRight to centerRight.copy(x = centerRight.x - scrollSize)
+            }
+        swipeWithVelocity(if (reversed) end else start, if (reversed) start else end, endVelocity)
     }
 
     private fun Velocity.toAbsoluteFloat(): Float {
diff --git a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/gestures/snapping/LazyGridSnapLayoutInfoProviderTest.kt b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/gestures/snapping/LazyGridSnapLayoutInfoProviderTest.kt
index b023790..a0187b37 100644
--- a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/gestures/snapping/LazyGridSnapLayoutInfoProviderTest.kt
+++ b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/gestures/snapping/LazyGridSnapLayoutInfoProviderTest.kt
@@ -75,15 +75,13 @@
 
         rule.runOnIdle {
             val offset = state.layoutInfo.visibleItemsInfo.first { it.index == 100 }.offset
-            val expectedResult = if (vertical) {
-                offset.y
-            } else {
-                offset.x
-            }
-            assertEquals(
-                layoutInfoProvider.calculateSnapOffset(0f).roundToInt(),
-                expectedResult
-            )
+            val expectedResult =
+                if (vertical) {
+                    offset.y
+                } else {
+                    offset.x
+                }
+            assertEquals(layoutInfoProvider.calculateSnapOffset(0f).roundToInt(), expectedResult)
         }
     }
 
@@ -107,16 +105,19 @@
         rule.mainClock.advanceTimeUntil { state.firstVisibleItemScrollOffset != 0 } // apply scroll
 
         rule.runOnIdle {
-            val offset = state
-                .layoutInfo
-                .visibleItemsInfo.first { it.index == state.firstVisibleItemIndex + 3 }.offset
-            val expectedResult = if (vertical) {
-                offset.y
-            } else {
-                offset.x
-            }
+            val offset =
+                state.layoutInfo.visibleItemsInfo
+                    .first { it.index == state.firstVisibleItemIndex + 3 }
+                    .offset
+            val expectedResult =
+                if (vertical) {
+                    offset.y
+                } else {
+                    offset.x
+                }
             assertEquals(
-                layoutInfoProvider.calculateSnapOffset(2 * minVelocityThreshold.toFloat())
+                layoutInfoProvider
+                    .calculateSnapOffset(2 * minVelocityThreshold.toFloat())
                     .roundToInt(),
                 expectedResult
             )
@@ -143,17 +144,19 @@
         rule.mainClock.advanceTimeUntil { state.firstVisibleItemScrollOffset != 0 } // apply scroll
 
         rule.runOnIdle {
-            val offset = state
-                .layoutInfo
-                .visibleItemsInfo
-                .first { it.index == state.firstVisibleItemIndex }.offset
-            val expectedResult = if (vertical) {
-                offset.y
-            } else {
-                offset.x
-            }
+            val offset =
+                state.layoutInfo.visibleItemsInfo
+                    .first { it.index == state.firstVisibleItemIndex }
+                    .offset
+            val expectedResult =
+                if (vertical) {
+                    offset.y
+                } else {
+                    offset.x
+                }
             assertEquals(
-                layoutInfoProvider.calculateSnapOffset(-2 * minVelocityThreshold.toFloat())
+                layoutInfoProvider
+                    .calculateSnapOffset(-2 * minVelocityThreshold.toFloat())
                     .roundToInt(),
                 expectedResult
             )
@@ -167,9 +170,7 @@
             state = state,
             flingBehavior = rememberSnapFlingBehavior(layoutInfoProvider)
         ) {
-            items(200) {
-                Box(modifier = Modifier.size(itemSizeDp))
-            }
+            items(200) { Box(modifier = Modifier.size(itemSizeDp)) }
         }
     }
 
diff --git a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/gestures/snapping/LazyListSnapFlingBehaviorTest.kt b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/gestures/snapping/LazyListSnapFlingBehaviorTest.kt
index 529265e..b95edb7 100644
--- a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/gestures/snapping/LazyListSnapFlingBehaviorTest.kt
+++ b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/gestures/snapping/LazyListSnapFlingBehaviorTest.kt
@@ -120,10 +120,7 @@
 
         // act
         onMainList().performTouchInput {
-            swipeMainAxisWithVelocity(
-                itemSize,
-                velocityThreshold / 2
-            )
+            swipeMainAxisWithVelocity(itemSize, velocityThreshold / 2)
         }
 
         // assert
@@ -155,10 +152,7 @@
 
         // act
         onMainList().performTouchInput {
-            swipeMainAxisWithVelocity(
-                itemSize / 2,
-                velocityThreshold * 2
-            )
+            swipeMainAxisWithVelocity(itemSize / 2, velocityThreshold * 2)
         }
 
         // assert
@@ -190,11 +184,7 @@
 
         // act
         onMainList().performTouchInput {
-            swipeMainAxisWithVelocity(
-                itemSize / 2,
-                velocityThreshold * 2,
-                true
-            )
+            swipeMainAxisWithVelocity(itemSize / 2, velocityThreshold * 2, true)
         }
 
         // assert
@@ -226,10 +216,7 @@
 
         // act
         onMainList().performTouchInput {
-            swipeMainAxisWithVelocity(
-                1.5f * itemSize,
-                velocityThreshold * 3
-            )
+            swipeMainAxisWithVelocity(1.5f * itemSize, velocityThreshold * 3)
         }
 
         // assert
@@ -244,39 +231,32 @@
         var itemSize = 0f
         var latestAvailableVelocity = Velocity.Zero
         lateinit var lazyListState: LazyListState
-        val inspectingNestedScrollConnection = object : NestedScrollConnection {
-            override suspend fun onPostFling(consumed: Velocity, available: Velocity): Velocity {
-                latestAvailableVelocity = available
-                return Velocity.Zero
+        val inspectingNestedScrollConnection =
+            object : NestedScrollConnection {
+                override suspend fun onPostFling(
+                    consumed: Velocity,
+                    available: Velocity
+                ): Velocity {
+                    latestAvailableVelocity = available
+                    return Velocity.Zero
+                }
             }
-        }
 
         // arrange
         rule.setContent {
             val density = LocalDensity.current
             lazyListState = rememberLazyListState(180) // almost at the end
             itemSize = with(density) { ItemSize.toPx() }
-            Box(
-                modifier = Modifier
-                    .fillMaxSize()
-                    .nestedScroll(inspectingNestedScrollConnection)
-            ) {
+            Box(modifier = Modifier.fillMaxSize().nestedScroll(inspectingNestedScrollConnection)) {
                 MainLayout(state = lazyListState)
             }
         }
 
         // act
-        onMainList().performTouchInput {
-            swipeMainAxisWithVelocity(
-                1.5f * itemSize,
-                15000f
-            )
-        }
+        onMainList().performTouchInput { swipeMainAxisWithVelocity(1.5f * itemSize, 15000f) }
 
         // assert
-        rule.runOnIdle {
-            assertNotEquals(latestAvailableVelocity.toAbsoluteFloat(), 0f)
-        }
+        rule.runOnIdle { assertNotEquals(latestAvailableVelocity.toAbsoluteFloat(), 0f) }
 
         // arrange
         rule.runOnIdle {
@@ -288,17 +268,10 @@
         latestAvailableVelocity = Velocity.Zero
 
         // act
-        onMainList().performTouchInput {
-            swipeMainAxisWithVelocity(
-                -1.5f * itemSize,
-                15000f
-            )
-        }
+        onMainList().performTouchInput { swipeMainAxisWithVelocity(-1.5f * itemSize, 15000f) }
 
         // assert
-        rule.runOnIdle {
-            assertNotEquals(latestAvailableVelocity.toAbsoluteFloat(), 0f)
-        }
+        rule.runOnIdle { assertNotEquals(latestAvailableVelocity.toAbsoluteFloat(), 0f) }
     }
 
     @Test
@@ -306,23 +279,23 @@
         var itemSize = 0f
         var latestAvailableVelocity = Velocity.Zero
         lateinit var lazyListState: LazyListState
-        val inspectingNestedScrollConnection = object : NestedScrollConnection {
-            override suspend fun onPostFling(consumed: Velocity, available: Velocity): Velocity {
-                latestAvailableVelocity = available
-                return Velocity.Zero
+        val inspectingNestedScrollConnection =
+            object : NestedScrollConnection {
+                override suspend fun onPostFling(
+                    consumed: Velocity,
+                    available: Velocity
+                ): Velocity {
+                    latestAvailableVelocity = available
+                    return Velocity.Zero
+                }
             }
-        }
 
         // arrange
         rule.setContent {
             val density = LocalDensity.current
             lazyListState = rememberLazyListState(100) // middle of the list
             itemSize = with(density) { ItemSize.toPx() }
-            Box(
-                modifier = Modifier
-                    .fillMaxSize()
-                    .nestedScroll(inspectingNestedScrollConnection)
-            ) {
+            Box(modifier = Modifier.fillMaxSize().nestedScroll(inspectingNestedScrollConnection)) {
                 MainLayout(state = lazyListState)
             }
         }
@@ -336,9 +309,7 @@
         }
 
         // assert
-        rule.runOnIdle {
-            assertEquals(latestAvailableVelocity.toAbsoluteFloat(), 0f)
-        }
+        rule.runOnIdle { assertEquals(latestAvailableVelocity.toAbsoluteFloat(), 0f) }
 
         // arrange
         rule.runOnIdle {
@@ -358,9 +329,7 @@
         }
 
         // assert
-        rule.runOnIdle {
-            assertEquals(latestAvailableVelocity.toAbsoluteFloat(), 0f)
-        }
+        rule.runOnIdle { assertEquals(latestAvailableVelocity.toAbsoluteFloat(), 0f) }
     }
 
     @Test
@@ -380,12 +349,7 @@
         rule.mainClock.autoAdvance = false
         // act
         val velocity = velocityThreshold * 3
-        onMainList().performTouchInput {
-            swipeMainAxisWithVelocity(
-                1.5f * itemSize,
-                velocity
-            )
-        }
+        onMainList().performTouchInput { swipeMainAxisWithVelocity(1.5f * itemSize, velocity) }
         rule.mainClock.advanceTimeByFrame()
 
         // act and assert: next calculated offset is the first value emitted by
@@ -397,9 +361,7 @@
         rule.mainClock.autoAdvance = true
 
         // assert: value settles back to zero
-        rule.runOnIdle {
-            Truth.assertThat(scrollOffset.last()).isEqualTo(0f)
-        }
+        rule.runOnIdle { Truth.assertThat(scrollOffset.last()).isEqualTo(0f) }
     }
 
     private fun onMainList() = rule.onNodeWithTag(TestTag)
@@ -409,19 +371,16 @@
         snapLayoutInfoProvider = remember(state) { SnapLayoutInfoProvider(state) }
         val innerFlingBehavior =
             rememberSnapFlingBehavior(snapLayoutInfoProvider = snapLayoutInfoProvider)
-        snapFlingBehavior = remember(innerFlingBehavior) {
-            QuerySnapFlingBehavior(innerFlingBehavior) {
-                scrollOffset.add(it)
+        snapFlingBehavior =
+            remember(innerFlingBehavior) {
+                QuerySnapFlingBehavior(innerFlingBehavior) { scrollOffset.add(it) }
             }
-        }
         LazyColumnOrRow(
             state = state,
             modifier = Modifier.testTag(TestTag),
             flingBehavior = snapFlingBehavior
         ) {
-            items(200) {
-                Box(modifier = Modifier.size(ItemSize))
-            }
+            items(200) { Box(modifier = Modifier.size(ItemSize)) }
         }
     }
 
@@ -441,16 +400,17 @@
         var minDistance = Float.POSITIVE_INFINITY
         val layoutInfo = state.layoutInfo
         (state.layoutInfo.visibleItemsInfo).forEach {
-            val distance = calculateDistanceToDesiredSnapPosition(
-                mainAxisViewPortSize = layoutInfo.singleAxisViewportSize,
-                beforeContentPadding = layoutInfo.beforeContentPadding,
-                afterContentPadding = layoutInfo.afterContentPadding,
-                itemSize = it.size,
-                itemOffset = it.offset,
-                itemIndex = it.index,
-                snapPosition = SnapPosition.Center,
-                itemCount = layoutInfo.totalItemsCount
-            )
+            val distance =
+                calculateDistanceToDesiredSnapPosition(
+                    mainAxisViewPortSize = layoutInfo.singleAxisViewportSize,
+                    beforeContentPadding = layoutInfo.beforeContentPadding,
+                    afterContentPadding = layoutInfo.afterContentPadding,
+                    itemSize = it.size,
+                    itemOffset = it.offset,
+                    itemIndex = it.index,
+                    snapPosition = SnapPosition.Center,
+                    itemCount = layoutInfo.totalItemsCount
+                )
             if (abs(distance) < minDistance) {
                 minDistance = abs(distance)
                 itemIndex = it.index
@@ -464,16 +424,13 @@
         endVelocity: Float,
         reversed: Boolean = false
     ) {
-        val (start, end) = if (orientation == Orientation.Vertical) {
-            bottomCenter to bottomCenter.copy(y = bottomCenter.y - scrollSize)
-        } else {
-            centerRight to centerRight.copy(x = centerRight.x - scrollSize)
-        }
-        swipeWithVelocity(
-            if (reversed) end else start,
-            if (reversed) start else end,
-            endVelocity
-        )
+        val (start, end) =
+            if (orientation == Orientation.Vertical) {
+                bottomCenter to bottomCenter.copy(y = bottomCenter.y - scrollSize)
+            } else {
+                centerRight to centerRight.copy(x = centerRight.x - scrollSize)
+            }
+        swipeWithVelocity(if (reversed) end else start, if (reversed) start else end, endVelocity)
     }
 
     private fun Velocity.toAbsoluteFloat(): Float {
@@ -496,8 +453,6 @@
     val onAnimationStep: (Float) -> Unit
 ) : FlingBehavior {
     override suspend fun ScrollScope.performFling(initialVelocity: Float): Float {
-        return with(snapFlingBehavior) {
-            performFling(initialVelocity, onAnimationStep)
-        }
+        return with(snapFlingBehavior) { performFling(initialVelocity, onAnimationStep) }
     }
 }
diff --git a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/gestures/snapping/LazyListSnapLayoutInfoProviderTest.kt b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/gestures/snapping/LazyListSnapLayoutInfoProviderTest.kt
index 47e2214..28ad641 100644
--- a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/gestures/snapping/LazyListSnapLayoutInfoProviderTest.kt
+++ b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/gestures/snapping/LazyListSnapLayoutInfoProviderTest.kt
@@ -100,12 +100,13 @@
         rule.mainClock.advanceTimeUntil { state.firstVisibleItemScrollOffset != 0 } // apply scroll
 
         rule.runOnIdle {
-            val offset = state
-                .layoutInfo
-                .visibleItemsInfo
-                .firstOrNull { it.index == state.firstVisibleItemIndex + 1 }?.offset
+            val offset =
+                state.layoutInfo.visibleItemsInfo
+                    .firstOrNull { it.index == state.firstVisibleItemIndex + 1 }
+                    ?.offset
             assertEquals(
-                layoutInfoProvider.calculateSnapOffset(2 * minVelocityThreshold.toFloat())
+                layoutInfoProvider
+                    .calculateSnapOffset(2 * minVelocityThreshold.toFloat())
                     .roundToInt(),
                 offset ?: 0
             )
@@ -132,12 +133,13 @@
         rule.mainClock.advanceTimeUntil { state.firstVisibleItemScrollOffset != 0 } // apply scroll
 
         rule.runOnIdle {
-            val offset = state
-                .layoutInfo
-                .visibleItemsInfo
-                .firstOrNull { it.index == state.firstVisibleItemIndex }?.offset
+            val offset =
+                state.layoutInfo.visibleItemsInfo
+                    .firstOrNull { it.index == state.firstVisibleItemIndex }
+                    ?.offset
             assertEquals(
-                layoutInfoProvider.calculateSnapOffset(-2 * minVelocityThreshold.toFloat())
+                layoutInfoProvider
+                    .calculateSnapOffset(-2 * minVelocityThreshold.toFloat())
                     .roundToInt(),
                 offset ?: 0
             )
@@ -150,9 +152,7 @@
             state = state,
             flingBehavior = rememberSnapFlingBehavior(layoutInfoProvider)
         ) {
-            items(200) {
-                Box(modifier = Modifier.size(itemSizeDp))
-            }
+            items(200) { Box(modifier = Modifier.size(itemSizeDp)) }
         }
     }
 
diff --git a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/gestures/snapping/SnapFlingBehaviorTest.kt b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/gestures/snapping/SnapFlingBehaviorTest.kt
index e6d37c8..2ef6ba5 100644
--- a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/gestures/snapping/SnapFlingBehaviorTest.kt
+++ b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/gestures/snapping/SnapFlingBehaviorTest.kt
@@ -70,8 +70,7 @@
 @RunWith(AndroidJUnit4::class)
 @OptIn(ExperimentalFoundationApi::class)
 class SnapFlingBehaviorTest {
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
     private val inspectSpringAnimationSpec = InspectSpringAnimationSpec(spring())
 
@@ -102,16 +101,12 @@
     @Test
     fun remainingScrollOffset_canApproach_shouldRepresentApproachAndSnapOffsets() {
         val approachOffset = 50f
-        val testLayoutInfoProvider =
-            TestLayoutInfoProvider(approachOffset = approachOffset)
+        val testLayoutInfoProvider = TestLayoutInfoProvider(approachOffset = approachOffset)
         lateinit var testFlingBehavior: TargetedFlingBehavior
         val scrollOffset = mutableListOf<Float>()
         rule.setContent {
             testFlingBehavior = rememberSnapFlingBehavior(testLayoutInfoProvider)
-            VelocityEffect(
-                testFlingBehavior,
-                TestVelocity
-            ) { remainingScrollOffset ->
+            VelocityEffect(testFlingBehavior, TestVelocity) { remainingScrollOffset ->
                 scrollOffset.add(remainingScrollOffset)
             }
         }
@@ -127,17 +122,13 @@
     fun remainingScrollOffset_targetShouldChangeInAccordanceWithAnimation() {
         // Arrange
         val initialOffset = 50f
-        val testLayoutInfoProvider =
-            TestLayoutInfoProvider(approachOffset = initialOffset)
+        val testLayoutInfoProvider = TestLayoutInfoProvider(approachOffset = initialOffset)
         lateinit var testFlingBehavior: TargetedFlingBehavior
         val scrollOffset = mutableListOf<Float>()
         rule.mainClock.autoAdvance = false
         rule.setContent {
             testFlingBehavior = rememberSnapFlingBehavior(testLayoutInfoProvider)
-            VelocityEffect(
-                testFlingBehavior,
-                TestVelocity
-            ) { remainingScrollOffset ->
+            VelocityEffect(testFlingBehavior, TestVelocity) { remainingScrollOffset ->
                 scrollOffset.add(remainingScrollOffset)
             }
         }
@@ -147,15 +138,11 @@
         assertEquals(scrollOffset.first(), initialOffset)
 
         // Act: Advance until we reach the maxOffset.
-        rule.mainClock.advanceTimeUntil {
-            scrollOffset.last() == testLayoutInfoProvider.maxOffset
-        }
+        rule.mainClock.advanceTimeUntil { scrollOffset.last() == testLayoutInfoProvider.maxOffset }
 
         rule.mainClock.autoAdvance = true
         // Assert
-        rule.runOnIdle {
-            assertEquals(scrollOffset.last(), 0f)
-        }
+        rule.runOnIdle { assertEquals(scrollOffset.last(), 0f) }
     }
 
     @Test
@@ -168,16 +155,12 @@
 
             LaunchedEffect(Unit) {
                 scrollableState.scroll {
-                    afterFlingVelocity = with(testFlingBehavior) {
-                        performFling(50000f)
-                    }
+                    afterFlingVelocity = with(testFlingBehavior) { performFling(50000f) }
                 }
             }
         }
 
-        rule.runOnIdle {
-            assertEquals(NoVelocity, afterFlingVelocity)
-        }
+        rule.runOnIdle { assertEquals(NoVelocity, afterFlingVelocity) }
     }
 
     @Test
@@ -191,16 +174,12 @@
 
             LaunchedEffect(Unit) {
                 scrollableState.scroll {
-                    afterFlingVelocity = with(testFlingBehavior) {
-                        performFling(50000f)
-                    }
+                    afterFlingVelocity = with(testFlingBehavior) { performFling(50000f) }
                 }
             }
         }
 
-        rule.runOnIdle {
-            assertNotEquals(NoVelocity, afterFlingVelocity)
-        }
+        rule.runOnIdle { assertNotEquals(NoVelocity, afterFlingVelocity) }
     }
 
     @Test
@@ -213,12 +192,14 @@
     @Test
     fun findClosestOffset_flingDirection_shouldReturnCorrectBound() {
         val testLayoutInfoProvider = TestLayoutInfoProvider()
-        val forwardOffset = testLayoutInfoProvider.calculateSnapOffset(with(rule.density) {
-            MinFlingVelocityDp.toPx()
-        })
-        val backwardOffset = testLayoutInfoProvider.calculateSnapOffset(-with(rule.density) {
-            MinFlingVelocityDp.toPx()
-        })
+        val forwardOffset =
+            testLayoutInfoProvider.calculateSnapOffset(
+                with(rule.density) { MinFlingVelocityDp.toPx() }
+            )
+        val backwardOffset =
+            testLayoutInfoProvider.calculateSnapOffset(
+                -with(rule.density) { MinFlingVelocityDp.toPx() }
+            )
         assertEquals(forwardOffset, MaxOffset)
         assertEquals(backwardOffset, MinOffset)
     }
@@ -229,17 +210,16 @@
             InspectSplineAnimationSpec(SplineBasedFloatDecayAnimationSpec(rule.density))
         val decaySpec: DecayAnimationSpec<Float> = splineAnimationSpec.generateDecayAnimationSpec()
         val canNotDecayApproach = decaySpec.calculateTargetValue(0.0f, TestVelocity) + 1
-        val testLayoutInfoProvider = TestLayoutInfoProvider(
-            maxOffset = 100f,
-            approachOffset = canNotDecayApproach
-        )
+        val testLayoutInfoProvider =
+            TestLayoutInfoProvider(maxOffset = 100f, approachOffset = canNotDecayApproach)
 
         rule.setContent {
-            val testFlingBehavior = rememberSnapFlingBehavior(
-                snapLayoutInfoProvider = testLayoutInfoProvider,
-                highVelocityApproachSpec = decaySpec,
-                snapAnimationSpec = inspectSpringAnimationSpec
-            )
+            val testFlingBehavior =
+                rememberSnapFlingBehavior(
+                    snapLayoutInfoProvider = testLayoutInfoProvider,
+                    highVelocityApproachSpec = decaySpec,
+                    snapAnimationSpec = inspectSpringAnimationSpec
+                )
             VelocityEffect(testFlingBehavior, TestVelocity)
         }
 
@@ -255,17 +235,16 @@
             InspectSplineAnimationSpec(SplineBasedFloatDecayAnimationSpec(rule.density))
         val decaySpec: DecayAnimationSpec<Float> = splineAnimationSpec.generateDecayAnimationSpec()
         val canDecayApproach = decaySpec.calculateTargetValue(0.0f, TestVelocity) - 1
-        val testLayoutInfoProvider = TestLayoutInfoProvider(
-            maxOffset = 100f,
-            approachOffset = canDecayApproach
-        )
+        val testLayoutInfoProvider =
+            TestLayoutInfoProvider(maxOffset = 100f, approachOffset = canDecayApproach)
 
         rule.setContent {
-            val testFlingBehavior = rememberSnapFlingBehavior(
-                snapLayoutInfoProvider = testLayoutInfoProvider,
-                highVelocityApproachSpec = decaySpec,
-                snapAnimationSpec = inspectSpringAnimationSpec
-            )
+            val testFlingBehavior =
+                rememberSnapFlingBehavior(
+                    snapLayoutInfoProvider = testLayoutInfoProvider,
+                    highVelocityApproachSpec = decaySpec,
+                    snapAnimationSpec = inspectSpringAnimationSpec
+                )
             VelocityEffect(testFlingBehavior, TestVelocity)
         }
 
@@ -284,11 +263,12 @@
         val testLayoutInfoProvider = TestLayoutInfoProvider(approachOffset = Float.NaN)
 
         rule.setContent {
-            val testFlingBehavior = rememberSnapFlingBehavior(
-                snapLayoutInfoProvider = testLayoutInfoProvider,
-                highVelocityApproachSpec = decaySpec,
-                snapAnimationSpec = inspectSpringAnimationSpec
-            )
+            val testFlingBehavior =
+                rememberSnapFlingBehavior(
+                    snapLayoutInfoProvider = testLayoutInfoProvider,
+                    highVelocityApproachSpec = decaySpec,
+                    snapAnimationSpec = inspectSpringAnimationSpec
+                )
             VelocityEffect(testFlingBehavior, 5 * TestVelocity)
         }
 
@@ -311,11 +291,12 @@
         rule.mainClock.autoAdvance = false
 
         rule.setContent {
-            val testFlingBehavior = rememberSnapFlingBehavior(
-                snapLayoutInfoProvider = testLayoutInfoProvider,
-                highVelocityApproachSpec = decaySpec,
-                snapAnimationSpec = inspectSpringAnimationSpec
-            )
+            val testFlingBehavior =
+                rememberSnapFlingBehavior(
+                    snapLayoutInfoProvider = testLayoutInfoProvider,
+                    highVelocityApproachSpec = decaySpec,
+                    snapAnimationSpec = inspectSpringAnimationSpec
+                )
             VelocityEffect(testFlingBehavior, flingVelocity) {
                 actualApproachOffset = it // note approach offset
             }
@@ -334,17 +315,16 @@
         val splineAnimationSpec =
             InspectSplineAnimationSpec(SplineBasedFloatDecayAnimationSpec(rule.density))
         val decaySpec: DecayAnimationSpec<Float> = splineAnimationSpec.generateDecayAnimationSpec()
-        val testLayoutInfoProvider = TestLayoutInfoProvider(
-            approachOffset = MaxOffset
-        )
+        val testLayoutInfoProvider = TestLayoutInfoProvider(approachOffset = MaxOffset)
 
         var animationOffset = 0f
         rule.setContent {
-            val testFlingBehavior = rememberSnapFlingBehavior(
-                snapLayoutInfoProvider = testLayoutInfoProvider,
-                highVelocityApproachSpec = decaySpec,
-                snapAnimationSpec = inspectSpringAnimationSpec
-            )
+            val testFlingBehavior =
+                rememberSnapFlingBehavior(
+                    snapLayoutInfoProvider = testLayoutInfoProvider,
+                    highVelocityApproachSpec = decaySpec,
+                    snapAnimationSpec = inspectSpringAnimationSpec
+                )
             VelocityEffect(testFlingBehavior, TestVelocity) {
                 // note animation offset
                 if (it > animationOffset) {
@@ -381,17 +361,11 @@
 
         // Act: Stop clock and fling, one frame should not settle immediately.
         rule.mainClock.autoAdvance = false
-        scope.launch {
-            state.scroll {
-                with(defaultFlingBehavior) { performFling(10000f) }
-            }
-        }
+        scope.launch { state.scroll { with(defaultFlingBehavior) { performFling(10000f) } } }
         rule.mainClock.advanceTimeByFrame()
 
         // Assert
-        rule.runOnIdle {
-            Truth.assertThat(state.firstVisibleItemIndex).isEqualTo(0)
-        }
+        rule.runOnIdle { Truth.assertThat(state.firstVisibleItemIndex).isEqualTo(0) }
 
         rule.mainClock.autoAdvance = true
 
@@ -408,24 +382,16 @@
 
         // Act: Stop clock and fling, one frame should not settle immediately.
         rule.mainClock.autoAdvance = false
-        scope.launch {
-            state.scroll {
-                with(defaultFlingBehavior) { performFling(10000f) }
-            }
-        }
+        scope.launch { state.scroll { with(defaultFlingBehavior) { performFling(10000f) } } }
         rule.mainClock.advanceTimeByFrame()
 
         // Assert
-        rule.runOnIdle {
-            Truth.assertThat(state.firstVisibleItemIndex).isEqualTo(previousIndex)
-        }
+        rule.runOnIdle { Truth.assertThat(state.firstVisibleItemIndex).isEqualTo(previousIndex) }
 
         rule.mainClock.autoAdvance = true
 
         // Assert: let it settle
-        rule.runOnIdle {
-            Truth.assertThat(state.firstVisibleItemIndex).isNotEqualTo(previousIndex)
-        }
+        rule.runOnIdle { Truth.assertThat(state.firstVisibleItemIndex).isNotEqualTo(previousIndex) }
     }
 
     @Suppress("Deprecation")
@@ -441,16 +407,12 @@
             defaultFlingBehavior = rememberSnapFlingBehavior(state) as SnapFlingBehavior
 
             LazyRow(
-                modifier = Modifier
-                    .testTag("snappingList")
-                    .fillMaxSize(),
+                modifier = Modifier.testTag("snappingList").fillMaxSize(),
                 state = state,
                 flingBehavior = defaultFlingBehavior as FlingBehavior
             ) {
                 items(200) {
-                    Box(modifier = Modifier.size(150.dp)) {
-                        BasicText(text = it.toString())
-                    }
+                    Box(modifier = Modifier.size(150.dp)) { BasicText(text = it.toString()) }
                 }
             }
 
@@ -469,9 +431,7 @@
         rule.mainClock.advanceTimeByFrame()
 
         // Assert
-        rule.runOnIdle {
-            Truth.assertThat(state.firstVisibleItemIndex).isGreaterThan(0)
-        }
+        rule.runOnIdle { Truth.assertThat(state.firstVisibleItemIndex).isGreaterThan(0) }
 
         // Arrange
         rule.mainClock.autoAdvance = true
@@ -481,23 +441,15 @@
         val previousIndex = state.firstVisibleItemIndex
         // Act: Stop clock and fling, one frame should not settle.
         rule.mainClock.autoAdvance = false
-        scope.launch {
-            state.scroll {
-                with(defaultFlingBehavior) { performFling(10000f) }
-            }
-        }
+        scope.launch { state.scroll { with(defaultFlingBehavior) { performFling(10000f) } } }
 
         // Assert: First index hasn't changed because animation hasn't started
         rule.mainClock.advanceTimeByFrame()
-        rule.runOnIdle {
-            Truth.assertThat(state.firstVisibleItemIndex).isEqualTo(previousIndex)
-        }
+        rule.runOnIdle { Truth.assertThat(state.firstVisibleItemIndex).isEqualTo(previousIndex) }
         rule.mainClock.autoAdvance = true
 
         // Wait for settling
-        rule.runOnIdle {
-            Truth.assertThat(state.firstVisibleItemIndex).isNotEqualTo(previousIndex)
-        }
+        rule.runOnIdle { Truth.assertThat(state.firstVisibleItemIndex).isNotEqualTo(previousIndex) }
     }
 
     inner class TestLayoutInfoProvider(
@@ -515,17 +467,10 @@
         }
 
         override fun calculateSnapOffset(velocity: Float): Float {
-            return calculateFinalOffset(
-                calculateFinalSnappingItem(velocity),
-                minOffset,
-                maxOffset
-            )
+            return calculateFinalOffset(calculateFinalSnappingItem(velocity), minOffset, maxOffset)
         }
 
-        override fun calculateApproachOffset(
-            velocity: Float,
-            decayOffset: Float
-        ): Float {
+        override fun calculateApproachOffset(velocity: Float, decayOffset: Float): Float {
             return if (approachOffset.isNaN()) (decayOffset) else approachOffset
         }
     }
@@ -549,9 +494,8 @@
     }
 }
 
-private class InspectSpringAnimationSpec(
-    private val animation: AnimationSpec<Float>
-) : AnimationSpec<Float> {
+private class InspectSpringAnimationSpec(private val animation: AnimationSpec<Float>) :
+    AnimationSpec<Float> {
 
     var animationWasExecutions = 0
 
@@ -601,10 +545,7 @@
     snapAnimationSpec: AnimationSpec<Float>
 ): FlingBehavior {
 
-    return remember(
-        snapLayoutInfoProvider,
-        highVelocityApproachSpec
-    ) {
+    return remember(snapLayoutInfoProvider, highVelocityApproachSpec) {
         snapFlingBehavior(
             snapLayoutInfoProvider = snapLayoutInfoProvider,
             decayAnimationSpec = highVelocityApproachSpec,
diff --git a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/lazy/grid/BaseLazyGridTestWithOrientation.kt b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/lazy/grid/BaseLazyGridTestWithOrientation.kt
index 0bf7bf5..18b78f9 100644
--- a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/lazy/grid/BaseLazyGridTestWithOrientation.kt
+++ b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/lazy/grid/BaseLazyGridTestWithOrientation.kt
@@ -33,9 +33,8 @@
 import kotlinx.coroutines.Dispatchers
 import kotlinx.coroutines.runBlocking
 
-open class BaseLazyGridTestWithOrientation(
-    orientation: Orientation
-) : BaseLazyLayoutTestWithOrientation(orientation) {
+open class BaseLazyGridTestWithOrientation(orientation: Orientation) :
+    BaseLazyLayoutTestWithOrientation(orientation) {
 
     fun LazyGridState.scrollBy(offset: Dp) {
         runBlocking(Dispatchers.Main + AutoTestFrameClock()) {
@@ -44,9 +43,7 @@
     }
 
     fun LazyGridState.scrollTo(index: Int) {
-        runBlocking(Dispatchers.Main + AutoTestFrameClock()) {
-            scrollToItem(index)
-        }
+        runBlocking(Dispatchers.Main + AutoTestFrameClock()) { scrollToItem(index) }
     }
 
     fun SemanticsNodeInteraction.scrollBy(offset: Dp) = scrollMainAxisBy(offset)
@@ -64,19 +61,20 @@
         crossAxisSpacedBy: Dp = 0.dp,
         mainAxisSpacedBy: Dp = 0.dp,
         content: LazyGridScope.() -> Unit
-    ) = LazyGrid(
-        GridCells.Fixed(cells),
-        modifier,
-        state,
-        contentPadding,
-        reverseLayout,
-        reverseArrangement,
-        flingBehavior,
-        userScrollEnabled,
-        crossAxisSpacedBy,
-        mainAxisSpacedBy,
-        content
-    )
+    ) =
+        LazyGrid(
+            GridCells.Fixed(cells),
+            modifier,
+            state,
+            contentPadding,
+            reverseLayout,
+            reverseArrangement,
+            flingBehavior,
+            userScrollEnabled,
+            crossAxisSpacedBy,
+            mainAxisSpacedBy,
+            content
+        )
 
     @Composable
     fun LazyGrid(
@@ -93,15 +91,17 @@
         content: LazyGridScope.() -> Unit
     ) {
         if (vertical) {
-            val verticalArrangement = when {
-                mainAxisSpacedBy != 0.dp -> Arrangement.spacedBy(mainAxisSpacedBy)
-                reverseLayout xor reverseArrangement -> Arrangement.Bottom
-                else -> Arrangement.Top
-            }
-            val horizontalArrangement = when {
-                crossAxisSpacedBy != 0.dp -> Arrangement.spacedBy(crossAxisSpacedBy)
-                else -> Arrangement.Start
-            }
+            val verticalArrangement =
+                when {
+                    mainAxisSpacedBy != 0.dp -> Arrangement.spacedBy(mainAxisSpacedBy)
+                    reverseLayout xor reverseArrangement -> Arrangement.Bottom
+                    else -> Arrangement.Top
+                }
+            val horizontalArrangement =
+                when {
+                    crossAxisSpacedBy != 0.dp -> Arrangement.spacedBy(crossAxisSpacedBy)
+                    else -> Arrangement.Start
+                }
             LazyVerticalGrid(
                 columns = cells,
                 modifier = modifier,
@@ -115,15 +115,17 @@
                 content = content
             )
         } else {
-            val horizontalArrangement = when {
-                mainAxisSpacedBy != 0.dp -> Arrangement.spacedBy(mainAxisSpacedBy)
-                reverseLayout xor reverseArrangement -> Arrangement.End
-                else -> Arrangement.Start
-            }
-            val verticalArrangement = when {
-                crossAxisSpacedBy != 0.dp -> Arrangement.spacedBy(crossAxisSpacedBy)
-                else -> Arrangement.Top
-            }
+            val horizontalArrangement =
+                when {
+                    mainAxisSpacedBy != 0.dp -> Arrangement.spacedBy(mainAxisSpacedBy)
+                    reverseLayout xor reverseArrangement -> Arrangement.End
+                    else -> Arrangement.Start
+                }
+            val verticalArrangement =
+                when {
+                    crossAxisSpacedBy != 0.dp -> Arrangement.spacedBy(crossAxisSpacedBy)
+                    else -> Arrangement.Top
+                }
             LazyHorizontalGrid(
                 rows = cells,
                 modifier = modifier,
diff --git a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/lazy/list/BaseLazyListTestWithOrientation.kt b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/lazy/list/BaseLazyListTestWithOrientation.kt
index a1110337..7e7cff4 100644
--- a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/lazy/list/BaseLazyListTestWithOrientation.kt
+++ b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/lazy/list/BaseLazyListTestWithOrientation.kt
@@ -50,9 +50,8 @@
 import kotlinx.coroutines.Dispatchers
 import kotlinx.coroutines.runBlocking
 
-open class BaseLazyListTestWithOrientation(
-    private val orientation: Orientation
-) : BaseLazyLayoutTestWithOrientation(orientation) {
+open class BaseLazyListTestWithOrientation(private val orientation: Orientation) :
+    BaseLazyLayoutTestWithOrientation(orientation) {
 
     fun Modifier.fillMaxCrossAxis() =
         if (vertical) {
@@ -82,16 +81,15 @@
     }
 
     fun LazyListState.scrollTo(index: Int) {
-        runBlocking(Dispatchers.Main + AutoTestFrameClock()) {
-            scrollToItem(index)
-        }
+        runBlocking(Dispatchers.Main + AutoTestFrameClock()) { scrollToItem(index) }
     }
 
-    fun SemanticsNodeInteraction.scrollBy(offset: Dp) = scrollBy(
-        x = if (vertical) 0.dp else offset,
-        y = if (!vertical) 0.dp else offset,
-        density = rule.density
-    )
+    fun SemanticsNodeInteraction.scrollBy(offset: Dp) =
+        scrollBy(
+            x = if (vertical) 0.dp else offset,
+            y = if (!vertical) 0.dp else offset,
+            density = rule.density
+        )
 
     fun composeViewSwipeForward() {
         if (orientation == Orientation.Vertical) {
@@ -126,11 +124,12 @@
         content: LazyListScope.() -> Unit
     ) {
         if (vertical) {
-            val verticalArrangement = when {
-                spacedBy != 0.dp -> Arrangement.spacedBy(spacedBy)
-                reverseLayout xor reverseArrangement -> Arrangement.Bottom
-                else -> Arrangement.Top
-            }
+            val verticalArrangement =
+                when {
+                    spacedBy != 0.dp -> Arrangement.spacedBy(spacedBy)
+                    reverseLayout xor reverseArrangement -> Arrangement.Bottom
+                    else -> Arrangement.Top
+                }
             LazyColumn(
                 modifier = modifier,
                 state = state,
@@ -142,11 +141,12 @@
                 content = content
             )
         } else {
-            val horizontalArrangement = when {
-                spacedBy != 0.dp -> Arrangement.spacedBy(spacedBy)
-                reverseLayout xor reverseArrangement -> Arrangement.End
-                else -> Arrangement.Start
-            }
+            val horizontalArrangement =
+                when {
+                    spacedBy != 0.dp -> Arrangement.spacedBy(spacedBy)
+                    reverseLayout xor reverseArrangement -> Arrangement.End
+                    else -> Arrangement.Start
+                }
             LazyRow(
                 modifier = modifier,
                 state = state,
@@ -174,11 +174,12 @@
         content: LazyListScope.() -> Unit
     ) {
         if (vertical) {
-            val verticalArrangement = when {
-                spacedBy != 0.dp -> Arrangement.spacedBy(spacedBy)
-                reverseLayout xor reverseArrangement -> Arrangement.Bottom
-                else -> Arrangement.Top
-            }
+            val verticalArrangement =
+                when {
+                    spacedBy != 0.dp -> Arrangement.spacedBy(spacedBy)
+                    reverseLayout xor reverseArrangement -> Arrangement.Bottom
+                    else -> Arrangement.Top
+                }
             LazyColumn(
                 modifier = modifier,
                 state = state,
@@ -191,11 +192,12 @@
                 content = content
             )
         } else {
-            val horizontalArrangement = when {
-                spacedBy != 0.dp -> Arrangement.spacedBy(spacedBy)
-                reverseLayout xor reverseArrangement -> Arrangement.End
-                else -> Arrangement.Start
-            }
+            val horizontalArrangement =
+                when {
+                    spacedBy != 0.dp -> Arrangement.spacedBy(spacedBy)
+                    reverseLayout xor reverseArrangement -> Arrangement.End
+                    else -> Arrangement.Start
+                }
             LazyRow(
                 modifier = modifier,
                 state = state,
diff --git a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/pager/BasePagerTest.kt b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/pager/BasePagerTest.kt
index dd8c1ce..896baac 100644
--- a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/pager/BasePagerTest.kt
+++ b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/pager/BasePagerTest.kt
@@ -80,15 +80,16 @@
     lateinit var pagerState: PagerState
 
     fun TouchInjectionScope.swipeWithVelocityAcrossMainAxis(velocity: Float, delta: Float? = null) {
-        val end = if (delta == null) {
-            layoutEnd
-        } else {
-            if (vertical) {
-                layoutStart.copy(y = layoutStart.y + delta)
+        val end =
+            if (delta == null) {
+                layoutEnd
             } else {
-                layoutStart.copy(x = layoutStart.x + delta)
+                if (vertical) {
+                    layoutStart.copy(y = layoutStart.y + delta)
+                } else {
+                    layoutStart.copy(x = layoutStart.x + delta)
+                }
             }
-        }
         swipeWithVelocity(layoutStart, end, velocity)
     }
 
@@ -96,15 +97,16 @@
         velocity: Float,
         delta: Float? = null
     ) {
-        val end = if (delta == null) {
-            layoutEnd
-        } else {
-            if (vertical) {
-                layoutStart.copy(x = layoutStart.x + delta)
+        val end =
+            if (delta == null) {
+                layoutEnd
             } else {
-                layoutStart.copy(y = layoutStart.y + delta)
+                if (vertical) {
+                    layoutStart.copy(x = layoutStart.x + delta)
+                } else {
+                    layoutStart.copy(y = layoutStart.y + delta)
+                }
             }
-        }
         swipeWithVelocity(layoutStart, end, velocity)
     }
 
@@ -138,15 +140,18 @@
     ) {
 
         rule.setContent {
-            val state = if (prefetchScheduler == null) {
-                rememberPagerState(initialPage, initialPageOffsetFraction, pageCount)
-            } else {
-                remember {
-                    object : PagerState(initialPage, initialPageOffsetFraction, prefetchScheduler) {
-                        override val pageCount: Int get() = pageCount()
+            val state =
+                if (prefetchScheduler == null) {
+                    rememberPagerState(initialPage, initialPageOffsetFraction, pageCount)
+                } else {
+                    remember {
+                        object :
+                            PagerState(initialPage, initialPageOffsetFraction, prefetchScheduler) {
+                            override val pageCount: Int
+                                get() = pageCount()
+                        }
                     }
                 }
-            }
             pagerState = state
             composeView = LocalView.current
             focusManager = LocalFocusManager.current
@@ -154,24 +159,23 @@
                 LocalLayoutDirection provides config.layoutDirection,
                 LocalOverscrollConfiguration provides null
             ) {
-                val resolvedFlingBehavior = flingBehavior ?: PagerDefaults.flingBehavior(
-                    state = state,
-                    pagerSnapDistance = snappingPage,
-                    snapPositionalThreshold = snapPositionalThreshold
-                )
+                val resolvedFlingBehavior =
+                    flingBehavior
+                        ?: PagerDefaults.flingBehavior(
+                            state = state,
+                            pagerSnapDistance = snappingPage,
+                            snapPositionalThreshold = snapPositionalThreshold
+                        )
 
                 scope = rememberCoroutineScope()
-                Box(
-                    modifier = Modifier
-                        .fillMaxSize()
-                        .nestedScroll(nestedScrollConnection)
-                ) {
+                Box(modifier = Modifier.fillMaxSize().nestedScroll(nestedScrollConnection)) {
                     HorizontalOrVerticalPager(
                         state = state,
                         beyondViewportPageCount = beyondViewportPageCount,
-                        modifier = modifier
-                            .testTag(PagerTestTag)
-                            .onSizeChanged { pagerSize = if (vertical) it.height else it.width },
+                        modifier =
+                            modifier.testTag(PagerTestTag).onSizeChanged {
+                                pagerSize = if (vertical) it.height else it.width
+                            },
                         pageSize = pageSize(),
                         userScrollEnabled = userScrollEnabled,
                         reverseLayout = reverseLayout,
@@ -190,27 +194,29 @@
 
     @Composable
     internal fun Page(index: Int, initialFocusedItemIndex: Int = 0) {
-        val focusRequester = FocusRequester().also {
-            if (index == initialFocusedItemIndex) initialFocusedItem = it
-            focusRequesters[index] = it
-        }
-        Box(modifier = Modifier
-            .focusRequester(focusRequester)
-            .onPlaced {
-                placed.add(index)
-                pageSize = if (vertical) it.size.height else it.size.width
+        val focusRequester =
+            FocusRequester().also {
+                if (index == initialFocusedItemIndex) initialFocusedItem = it
+                focusRequesters[index] = it
             }
-            .fillMaxSize()
-            .background(Color.Blue)
-            .testTag("$index")
-            .onFocusChanged {
-                if (it.isFocused) {
-                    focused.add(index)
-                } else {
-                    focused.remove(index)
-                }
-            }
-            .focusable(),
+        Box(
+            modifier =
+                Modifier.focusRequester(focusRequester)
+                    .onPlaced {
+                        placed.add(index)
+                        pageSize = if (vertical) it.size.height else it.size.width
+                    }
+                    .fillMaxSize()
+                    .background(Color.Blue)
+                    .testTag("$index")
+                    .onFocusChanged {
+                        if (it.isFocused) {
+                            focused.add(index)
+                        } else {
+                            focused.remove(index)
+                        }
+                    }
+                    .focusable(),
             contentAlignment = Alignment.Center
         ) {
             BasicText(text = index.toString())
@@ -222,73 +228,76 @@
     }
 
     internal val scrollForwardSign: Int
-        get() = if (vertical) {
-            if (config.reverseLayout && config.layoutDirection == LayoutDirection.Rtl) {
-                1
-            } else if (!config.reverseLayout && config.layoutDirection == LayoutDirection.Rtl) {
-                -1
-            } else if (config.reverseLayout && config.layoutDirection == LayoutDirection.Ltr) {
-                1
+        get() =
+            if (vertical) {
+                if (config.reverseLayout && config.layoutDirection == LayoutDirection.Rtl) {
+                    1
+                } else if (!config.reverseLayout && config.layoutDirection == LayoutDirection.Rtl) {
+                    -1
+                } else if (config.reverseLayout && config.layoutDirection == LayoutDirection.Ltr) {
+                    1
+                } else {
+                    -1
+                }
             } else {
-                -1
+                if (config.reverseLayout && config.layoutDirection == LayoutDirection.Rtl) {
+                    -1
+                } else if (!config.reverseLayout && config.layoutDirection == LayoutDirection.Rtl) {
+                    1
+                } else if (config.reverseLayout && config.layoutDirection == LayoutDirection.Ltr) {
+                    1
+                } else {
+                    -1
+                }
             }
-        } else {
-            if (config.reverseLayout && config.layoutDirection == LayoutDirection.Rtl) {
-                -1
-            } else if (!config.reverseLayout && config.layoutDirection == LayoutDirection.Rtl) {
-                1
-            } else if (config.reverseLayout && config.layoutDirection == LayoutDirection.Ltr) {
-                1
-            } else {
-                -1
-            }
-        }
 
     internal val TouchInjectionScope.layoutStart: Offset
-        get() = if (vertical) {
-            if (config.reverseLayout && config.layoutDirection == LayoutDirection.Rtl) {
-                topCenter
-            } else if (!config.reverseLayout && config.layoutDirection == LayoutDirection.Rtl) {
-                bottomCenter
-            } else if (config.reverseLayout && config.layoutDirection == LayoutDirection.Ltr) {
-                topCenter
+        get() =
+            if (vertical) {
+                if (config.reverseLayout && config.layoutDirection == LayoutDirection.Rtl) {
+                    topCenter
+                } else if (!config.reverseLayout && config.layoutDirection == LayoutDirection.Rtl) {
+                    bottomCenter
+                } else if (config.reverseLayout && config.layoutDirection == LayoutDirection.Ltr) {
+                    topCenter
+                } else {
+                    bottomCenter
+                }
             } else {
-                bottomCenter
+                if (config.reverseLayout && config.layoutDirection == LayoutDirection.Rtl) {
+                    centerRight
+                } else if (!config.reverseLayout && config.layoutDirection == LayoutDirection.Rtl) {
+                    centerLeft
+                } else if (config.reverseLayout && config.layoutDirection == LayoutDirection.Ltr) {
+                    centerLeft
+                } else {
+                    centerRight
+                }
             }
-        } else {
-            if (config.reverseLayout && config.layoutDirection == LayoutDirection.Rtl) {
-                centerRight
-            } else if (!config.reverseLayout && config.layoutDirection == LayoutDirection.Rtl) {
-                centerLeft
-            } else if (config.reverseLayout && config.layoutDirection == LayoutDirection.Ltr) {
-                centerLeft
-            } else {
-                centerRight
-            }
-        }
 
     internal val TouchInjectionScope.layoutEnd: Offset
-        get() = if (vertical) {
-            if (config.reverseLayout && config.layoutDirection == LayoutDirection.Rtl) {
-                bottomCenter
-            } else if (!config.reverseLayout && config.layoutDirection == LayoutDirection.Rtl) {
-                topCenter
-            } else if (config.reverseLayout && config.layoutDirection == LayoutDirection.Ltr) {
-                bottomCenter
+        get() =
+            if (vertical) {
+                if (config.reverseLayout && config.layoutDirection == LayoutDirection.Rtl) {
+                    bottomCenter
+                } else if (!config.reverseLayout && config.layoutDirection == LayoutDirection.Rtl) {
+                    topCenter
+                } else if (config.reverseLayout && config.layoutDirection == LayoutDirection.Ltr) {
+                    bottomCenter
+                } else {
+                    topCenter
+                }
             } else {
-                topCenter
+                if (config.reverseLayout && config.layoutDirection == LayoutDirection.Rtl) {
+                    centerLeft
+                } else if (!config.reverseLayout && config.layoutDirection == LayoutDirection.Rtl) {
+                    centerRight
+                } else if (config.reverseLayout && config.layoutDirection == LayoutDirection.Ltr) {
+                    centerRight
+                } else {
+                    centerLeft
+                }
             }
-        } else {
-            if (config.reverseLayout && config.layoutDirection == LayoutDirection.Rtl) {
-                centerLeft
-            } else if (!config.reverseLayout && config.layoutDirection == LayoutDirection.Rtl) {
-                centerRight
-            } else if (config.reverseLayout && config.layoutDirection == LayoutDirection.Ltr) {
-                centerRight
-            } else {
-                centerLeft
-            }
-        }
 
     @OptIn(ExperimentalFoundationApi::class)
     @Composable
@@ -348,20 +357,22 @@
             config.mainAxisContentPadding.calculateLeftPadding(config.layoutDirection)
         val topContentPadding = config.mainAxisContentPadding.calculateTopPadding()
 
-        val (left, top) = with(rule.density) {
-            val spacings = config.pageSpacing.roundToPx()
-            val initialPageOffset = currentPageIndex * (pageSize + spacings)
+        val (left, top) =
+            with(rule.density) {
+                val spacings = config.pageSpacing.roundToPx()
+                val initialPageOffset = currentPageIndex * (pageSize + spacings)
 
-            val position = pageToVerifyPosition * (pageSize + spacings) - initialPageOffset
-            val positionWithOffset =
-                position + (pageSize + spacings) * pageOffset * scrollForwardSign
-            if (vertical) {
-                0.dp to positionWithOffset.toDp()
-            } else {
-                positionWithOffset.toDp() to 0.dp
+                val position = pageToVerifyPosition * (pageSize + spacings) - initialPageOffset
+                val positionWithOffset =
+                    position + (pageSize + spacings) * pageOffset * scrollForwardSign
+                if (vertical) {
+                    0.dp to positionWithOffset.toDp()
+                } else {
+                    positionWithOffset.toDp() to 0.dp
+                }
             }
-        }
-        rule.onNodeWithTag("$pageToVerifyPosition")
+        rule
+            .onNodeWithTag("$pageToVerifyPosition")
             .assertPositionInRootIsEqualTo(left + leftContentPadding, top + topContentPadding)
     }
 
@@ -407,26 +418,28 @@
 internal val TestOrientation = listOf(Orientation.Vertical, Orientation.Horizontal)
 
 @OptIn(ExperimentalFoundationApi::class)
-internal val AllOrientationsParams = mutableListOf<ParamConfig>().apply {
-    for (orientation in TestOrientation) {
-        add(ParamConfig(orientation = orientation))
+internal val AllOrientationsParams =
+    mutableListOf<ParamConfig>().apply {
+        for (orientation in TestOrientation) {
+            add(ParamConfig(orientation = orientation))
+        }
     }
-}
 internal val TestReverseLayout = listOf(false, true)
 internal val TestLayoutDirection = listOf(LayoutDirection.Rtl, LayoutDirection.Ltr)
 internal val TestPageSpacing = listOf(0.dp, 8.dp)
 
-internal val TestSnapPosition = listOf(
-    SnapPosition.Start to "Start",
-    SnapPosition.Center to "Center",
-    SnapPosition.End to "End"
-)
+internal val TestSnapPosition =
+    listOf(
+        SnapPosition.Start to "Start",
+        SnapPosition.Center to "Center",
+        SnapPosition.End to "End"
+    )
 
-internal fun testContentPaddings(orientation: Orientation) = listOf(
-    PaddingValues(0.dp),
-    if (orientation == Orientation.Vertical)
-        PaddingValues(vertical = 16.dp)
-    else PaddingValues(horizontal = 16.dp),
-    PaddingValues(start = 16.dp),
-    PaddingValues(end = 16.dp)
-)
+internal fun testContentPaddings(orientation: Orientation) =
+    listOf(
+        PaddingValues(0.dp),
+        if (orientation == Orientation.Vertical) PaddingValues(vertical = 16.dp)
+        else PaddingValues(horizontal = 16.dp),
+        PaddingValues(start = 16.dp),
+        PaddingValues(end = 16.dp)
+    )
diff --git a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/pager/PageCountTest.kt b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/pager/PageCountTest.kt
index 759a6b2..7ecc150 100644
--- a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/pager/PageCountTest.kt
+++ b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/pager/PageCountTest.kt
@@ -47,88 +47,60 @@
 
     @Test
     fun pageCountIsMax_shouldAllowScroll() {
-        createPager(pageCount = { Int.MAX_VALUE }, modifier = Modifier.size(500.dp), pageSize = {
-            PageSize.Fixed(200.dp)
-        })
+        createPager(
+            pageCount = { Int.MAX_VALUE },
+            modifier = Modifier.size(500.dp),
+            pageSize = { PageSize.Fixed(200.dp) }
+        )
         val initialPage = pagerState.currentPage
-        onPager().performTouchInput {
-            swipeWithVelocityAcrossMainAxis(2000f)
-        }
+        onPager().performTouchInput { swipeWithVelocityAcrossMainAxis(2000f) }
 
-        rule.runOnIdle {
-            Truth.assertThat(initialPage).isNotEqualTo(pagerState.currentPage)
-        }
+        rule.runOnIdle { Truth.assertThat(initialPage).isNotEqualTo(pagerState.currentPage) }
     }
 
     @Test
     fun pageCountIsMax_shouldNotAllowScrollBeyondMax_fullPages() {
         createPager(pageCount = { Int.MAX_VALUE }, modifier = Modifier.fillMaxSize())
-        rule.runOnIdle {
-            runBlocking {
-                pagerState.scrollToPage(Int.MAX_VALUE)
-            }
-        }
+        rule.runOnIdle { runBlocking { pagerState.scrollToPage(Int.MAX_VALUE) } }
 
-        rule.runOnIdle {
-            Truth.assertThat(pagerState.currentPage).isEqualTo(Int.MAX_VALUE - 1)
-        }
+        rule.runOnIdle { Truth.assertThat(pagerState.currentPage).isEqualTo(Int.MAX_VALUE - 1) }
 
-        onPager().performTouchInput {
-            swipeWithVelocityAcrossMainAxis(20000f)
-        }
+        onPager().performTouchInput { swipeWithVelocityAcrossMainAxis(20000f) }
 
-        rule.runOnIdle {
-            Truth.assertThat(pagerState.currentPage).isEqualTo(Int.MAX_VALUE - 1)
-        }
+        rule.runOnIdle { Truth.assertThat(pagerState.currentPage).isEqualTo(Int.MAX_VALUE - 1) }
     }
 
     @Test
     fun pageCountIsMax_shouldNotAllowScrollBeyondMax_fixesSizedPages() {
-        createPager(pageCount = { Int.MAX_VALUE }, pageSize = {
-            PageSize.Fixed(100.dp)
-        }, modifier = Modifier.size(500.dp))
-        rule.runOnIdle {
-            runBlocking {
-                pagerState.scrollToPage(Int.MAX_VALUE)
-            }
-        }
+        createPager(
+            pageCount = { Int.MAX_VALUE },
+            pageSize = { PageSize.Fixed(100.dp) },
+            modifier = Modifier.size(500.dp)
+        )
+        rule.runOnIdle { runBlocking { pagerState.scrollToPage(Int.MAX_VALUE) } }
 
         val currentPage = pagerState.currentPage
 
-        onPager().performTouchInput {
-            swipeWithVelocityAcrossMainAxis(20000f)
-        }
+        onPager().performTouchInput { swipeWithVelocityAcrossMainAxis(20000f) }
 
-        rule.runOnIdle {
-            Truth.assertThat(pagerState.currentPage).isEqualTo(currentPage)
-        }
+        rule.runOnIdle { Truth.assertThat(pagerState.currentPage).isEqualTo(currentPage) }
     }
 
     @Test
     fun pageCountIsMax_shouldSettleAfterSmallScroll() {
         createPager(pageCount = { Int.MAX_VALUE }, modifier = Modifier.fillMaxSize())
-        rule.runOnIdle {
-            runBlocking {
-                pagerState.scrollToPage(Int.MAX_VALUE)
-            }
-        }
+        rule.runOnIdle { runBlocking { pagerState.scrollToPage(Int.MAX_VALUE) } }
 
-        rule.runOnIdle {
-            Truth.assertThat(pagerState.currentPage).isEqualTo(Int.MAX_VALUE - 1)
-        }
+        rule.runOnIdle { Truth.assertThat(pagerState.currentPage).isEqualTo(Int.MAX_VALUE - 1) }
 
         onPager().performTouchInput {
             swipeWithVelocityAcrossMainAxis(100f, delta = pageSize * 0.2f * scrollForwardSign * -1)
         }
 
-        rule.runOnIdle {
-            Truth.assertThat(pagerState.currentPage).isEqualTo(Int.MAX_VALUE - 1)
-        }
+        rule.runOnIdle { Truth.assertThat(pagerState.currentPage).isEqualTo(Int.MAX_VALUE - 1) }
     }
 
     companion object {
-        @JvmStatic
-        @Parameterized.Parameters(name = "{0}")
-        fun params() = AllOrientationsParams
+        @JvmStatic @Parameterized.Parameters(name = "{0}") fun params() = AllOrientationsParams
     }
 }
diff --git a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/pager/PageLayoutPositionOnScrollingTest.kt b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/pager/PageLayoutPositionOnScrollingTest.kt
index ae0fde7..f364011c 100644
--- a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/pager/PageLayoutPositionOnScrollingTest.kt
+++ b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/pager/PageLayoutPositionOnScrollingTest.kt
@@ -36,88 +36,86 @@
     }
 
     @Test
-    fun swipeForwardAndBackward_verifyPagesAreLaidOutCorrectly() = with(rule) {
-        // Arrange
-        setContent {
-            ParameterizedPager(
-                modifier = Modifier.fillMaxSize(),
-                orientation = it.orientation,
-                layoutDirection = it.layoutDirection,
-                pageSpacing = it.pageSpacing,
-                contentPadding = it.mainAxisContentPadding,
-                reverseLayout = it.reverseLayout
-            )
-        }
-
-        forEachParameter(ParamsToTest) { param ->
-            val delta = pagerSize * 0.4f * param.scrollForwardSign
-
-            // Act and Assert - forward
-            repeat(DefaultAnimationRepetition) {
-                onNodeWithTag(it.toString()).assertIsDisplayed()
-                param.confirmPageIsInCorrectPosition(it)
-                runAndWaitForPageSettling {
-                    onNodeWithTag(it.toString()).performTouchInput {
-                        with(param) {
-                            swipeWithVelocityAcrossMainAxis(
-                                with(rule.density) { 1.5f * MinFlingVelocityDp.toPx() },
-                                delta
-                            )
-                        }
-                    }
-                }
+    fun swipeForwardAndBackward_verifyPagesAreLaidOutCorrectly() =
+        with(rule) {
+            // Arrange
+            setContent {
+                ParameterizedPager(
+                    modifier = Modifier.fillMaxSize(),
+                    orientation = it.orientation,
+                    layoutDirection = it.layoutDirection,
+                    pageSpacing = it.pageSpacing,
+                    contentPadding = it.mainAxisContentPadding,
+                    reverseLayout = it.reverseLayout
+                )
             }
 
-            // Act - backward
-            repeat(DefaultAnimationRepetition) {
-                val countDown = DefaultAnimationRepetition - it
-                onNodeWithTag(countDown.toString()).assertIsDisplayed()
-                param.confirmPageIsInCorrectPosition(countDown)
-                runAndWaitForPageSettling {
-                    rule.onNodeWithTag(countDown.toString()).performTouchInput {
-                        with(param) {
-                            swipeWithVelocityAcrossMainAxis(
-                                with(rule.density) { 1.5f * MinFlingVelocityDp.toPx() },
-                                delta * -1f
-                            )
-                        }
-                    }
-                }
-            }
+            forEachParameter(ParamsToTest) { param ->
+                val delta = pagerSize * 0.4f * param.scrollForwardSign
 
-            resetTestCase()
-        }
-    }
-
-    private fun resetTestCase() {
-        rule.runOnIdle {
-            runBlocking {
-                pagerState.scrollToPage(0)
-            }
-        }
-    }
-
-    companion object {
-        val ParamsToTest = mutableListOf<SingleParamConfig>().apply {
-            for (orientation in TestOrientation) {
-                for (pageSpacing in TestPageSpacing) {
-                    for (reverseLayout in TestReverseLayout) {
-                        for (layoutDirection in TestLayoutDirection) {
-                            for (contentPadding in testContentPaddings(orientation)) {
-                                add(
-                                    SingleParamConfig(
-                                        orientation = orientation,
-                                        mainAxisContentPadding = contentPadding,
-                                        reverseLayout = reverseLayout,
-                                        layoutDirection = layoutDirection,
-                                        pageSpacing = pageSpacing
-                                    )
+                // Act and Assert - forward
+                repeat(DefaultAnimationRepetition) {
+                    onNodeWithTag(it.toString()).assertIsDisplayed()
+                    param.confirmPageIsInCorrectPosition(it)
+                    runAndWaitForPageSettling {
+                        onNodeWithTag(it.toString()).performTouchInput {
+                            with(param) {
+                                swipeWithVelocityAcrossMainAxis(
+                                    with(rule.density) { 1.5f * MinFlingVelocityDp.toPx() },
+                                    delta
                                 )
                             }
                         }
                     }
                 }
+
+                // Act - backward
+                repeat(DefaultAnimationRepetition) {
+                    val countDown = DefaultAnimationRepetition - it
+                    onNodeWithTag(countDown.toString()).assertIsDisplayed()
+                    param.confirmPageIsInCorrectPosition(countDown)
+                    runAndWaitForPageSettling {
+                        rule.onNodeWithTag(countDown.toString()).performTouchInput {
+                            with(param) {
+                                swipeWithVelocityAcrossMainAxis(
+                                    with(rule.density) { 1.5f * MinFlingVelocityDp.toPx() },
+                                    delta * -1f
+                                )
+                            }
+                        }
+                    }
+                }
+
+                resetTestCase()
             }
         }
+
+    private fun resetTestCase() {
+        rule.runOnIdle { runBlocking { pagerState.scrollToPage(0) } }
+    }
+
+    companion object {
+        val ParamsToTest =
+            mutableListOf<SingleParamConfig>().apply {
+                for (orientation in TestOrientation) {
+                    for (pageSpacing in TestPageSpacing) {
+                        for (reverseLayout in TestReverseLayout) {
+                            for (layoutDirection in TestLayoutDirection) {
+                                for (contentPadding in testContentPaddings(orientation)) {
+                                    add(
+                                        SingleParamConfig(
+                                            orientation = orientation,
+                                            mainAxisContentPadding = contentPadding,
+                                            reverseLayout = reverseLayout,
+                                            layoutDirection = layoutDirection,
+                                            pageSpacing = pageSpacing
+                                        )
+                                    )
+                                }
+                            }
+                        }
+                    }
+                }
+            }
     }
 }
diff --git a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/pager/PageSizeTest.kt b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/pager/PageSizeTest.kt
index eb25ebc..d27e8fcc 100644
--- a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/pager/PageSizeTest.kt
+++ b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/pager/PageSizeTest.kt
@@ -50,14 +50,15 @@
     @Test
     fun pagerSizeCustom_visibleItemsAreWithinViewport() {
         // Arrange
-        val pagerMode = object : PageSize {
-            override fun Density.calculateMainAxisPageSize(
-                availableSpace: Int,
-                pageSpacing: Int
-            ): Int {
-                return 100.dp.roundToPx() + pageSpacing
+        val pagerMode =
+            object : PageSize {
+                override fun Density.calculateMainAxisPageSize(
+                    availableSpace: Int,
+                    pageSpacing: Int
+                ): Int {
+                    return 100.dp.roundToPx() + pageSpacing
+                }
             }
-        }
 
         // Act
         createPager(
@@ -70,9 +71,8 @@
         // Assert
         rule.runOnIdle {
             val visibleItems = pagerState.layoutInfo.visiblePagesInfo.size
-            val pageCount = with(rule.density) {
-                (pagerSize / (pageSize + config.pageSpacing.roundToPx()))
-            } + 1
+            val pageCount =
+                with(rule.density) { (pagerSize / (pageSize + config.pageSpacing.roundToPx())) } + 1
             Truth.assertThat(visibleItems).isEqualTo(pageCount)
         }
 
@@ -84,17 +84,13 @@
     companion object {
         @JvmStatic
         @Parameterized.Parameters(name = "{0}")
-        fun params() = mutableListOf<ParamConfig>().apply {
-            for (orientation in TestOrientation) {
-                for (pageSpacing in TestPageSpacing) {
-                    add(
-                        ParamConfig(
-                            orientation = orientation,
-                            pageSpacing = pageSpacing
-                        )
-                    )
+        fun params() =
+            mutableListOf<ParamConfig>().apply {
+                for (orientation in TestOrientation) {
+                    for (pageSpacing in TestPageSpacing) {
+                        add(ParamConfig(orientation = orientation, pageSpacing = pageSpacing))
+                    }
                 }
             }
-        }
     }
 }
diff --git a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/pager/PagerAccessibilityTest.kt b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/pager/PagerAccessibilityTest.kt
index c925ece..db9f974 100644
--- a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/pager/PagerAccessibilityTest.kt
+++ b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/pager/PagerAccessibilityTest.kt
@@ -48,14 +48,14 @@
 class PagerAccessibilityTest(config: ParamConfig) : BasePagerTest(config = config) {
 
     private val accessibilityNodeProvider: AccessibilityNodeProvider
-        get() = checkNotNull(composeView) {
-            "composeView not initialized."
-        }.let { composeView ->
-            ViewCompat
-                .getAccessibilityDelegate(composeView)!!
-                .getAccessibilityNodeProvider(composeView)!!
-                .provider as AccessibilityNodeProvider
-        }
+        get() =
+            checkNotNull(composeView) { "composeView not initialized." }
+                .let { composeView ->
+                    ViewCompat.getAccessibilityDelegate(composeView)!!.getAccessibilityNodeProvider(
+                            composeView
+                        )!!
+                        .provider as AccessibilityNodeProvider
+                }
 
     @Test
     fun scrollBySemantics_shouldScrollCorrectly() {
@@ -63,9 +63,7 @@
 
         assertThat(pagerState.currentPage).isEqualTo(5)
 
-        rule.onNodeWithTag(PagerTestTag).performSemanticsAction(ScrollBy) {
-            it.invoke(100f, 100f)
-        }
+        rule.onNodeWithTag(PagerTestTag).performSemanticsAction(ScrollBy) { it.invoke(100f, 100f) }
 
         rule.runOnIdle {
             assertThat(pagerState.currentPageOffsetFraction).isWithin(0.001f).of(100f / pageSize)
@@ -93,18 +91,15 @@
 
         assertThat(pagerState.currentPage).isEqualTo(5)
 
-        val actionBackward = if (vertical) {
-            android.R.id.accessibilityActionPageUp
-        } else {
-            android.R.id.accessibilityActionPageLeft
-        }
+        val actionBackward =
+            if (vertical) {
+                android.R.id.accessibilityActionPageUp
+            } else {
+                android.R.id.accessibilityActionPageLeft
+            }
 
         rule.onNodeWithTag(PagerTestTag).withSemanticsNode {
-            accessibilityNodeProvider.performAction(
-                id,
-                actionBackward,
-                null
-            )
+            accessibilityNodeProvider.performAction(id, actionBackward, null)
         }
 
         // Go to the previous page
@@ -113,18 +108,15 @@
             assertThat(pagerState.currentPageOffsetFraction).isEqualTo(0.0f)
         }
 
-        val actionForward = if (vertical) {
-            android.R.id.accessibilityActionPageDown
-        } else {
-            android.R.id.accessibilityActionPageRight
-        }
+        val actionForward =
+            if (vertical) {
+                android.R.id.accessibilityActionPageDown
+            } else {
+                android.R.id.accessibilityActionPageRight
+            }
 
         rule.onNodeWithTag(PagerTestTag).withSemanticsNode {
-            accessibilityNodeProvider.performAction(
-                id,
-                actionForward,
-                null
-            )
+            accessibilityNodeProvider.performAction(id, actionForward, null)
         }
 
         // Go to the next page
@@ -183,7 +175,8 @@
         createPager(
             modifier = Modifier.size(210.dp), // make sure one page is halfway shown
             pageCount = { DefaultPageCount },
-            pageSize = { PageSize.Fixed(50.dp) })
+            pageSize = { PageSize.Fixed(50.dp) }
+        )
         val lastVisibleItem = pagerState.layoutInfo.visiblePagesInfo.last().index
         rule.runOnUiThread { focusRequesters[lastVisibleItem - 1]?.requestFocus() }
         rule.waitForIdle()
@@ -214,19 +207,16 @@
     @Test
     fun focusScroll_forwardAndBackward_pageContentIsFocusable_fullPage_shouldScrollFullPage() {
         // Arrange
-        createPager(pageCount = { DefaultPageCount }, pageContent = { page ->
-            val focusRequester = FocusRequester().also {
-                if (page == 0) initialFocusedItem = it
+        createPager(
+            pageCount = { DefaultPageCount },
+            pageContent = { page ->
+                val focusRequester =
+                    FocusRequester().also { if (page == 0) initialFocusedItem = it }
+                Box(modifier = Modifier.fillMaxSize(), contentAlignment = Alignment.Center) {
+                    Box(modifier = Modifier.size(30.dp).focusRequester(focusRequester).focusable())
+                }
             }
-            Box(modifier = Modifier.fillMaxSize(), contentAlignment = Alignment.Center) {
-                Box(
-                    modifier = Modifier
-                        .size(30.dp)
-                        .focusRequester(focusRequester)
-                        .focusable()
-                )
-            }
-        })
+        )
         rule.runOnUiThread { initialFocusedItem.requestFocus() }
         rule.waitForIdle()
 
@@ -257,19 +247,13 @@
             pageCount = { DefaultPageCount },
             pageSize = { PageSize.Fixed(50.dp) },
             pageContent = { page ->
-                val focusRequester = FocusRequester().also {
-                    focusRequesters[page] = it
-                }
+                val focusRequester = FocusRequester().also { focusRequesters[page] = it }
                 Box(modifier = Modifier.fillMaxSize(), contentAlignment = Alignment.Center) {
                     // focus bounds is smaller than page itself
-                    Box(
-                        modifier = Modifier
-                            .size(30.dp)
-                            .focusRequester(focusRequester)
-                            .focusable()
-                    )
+                    Box(modifier = Modifier.size(30.dp).focusRequester(focusRequester).focusable())
                 }
-            })
+            }
+        )
         val lastVisibleItem = pagerState.layoutInfo.visiblePagesInfo.last().index
         rule.runOnUiThread { focusRequesters[lastVisibleItem - 1]?.requestFocus() }
 
@@ -375,18 +359,15 @@
 
         assertThat(pagerState.currentPage).isEqualTo(0)
 
-        val actionBackward = if (vertical) {
-            android.R.id.accessibilityActionScrollDown
-        } else {
-            android.R.id.accessibilityActionScrollRight
-        }
+        val actionBackward =
+            if (vertical) {
+                android.R.id.accessibilityActionScrollDown
+            } else {
+                android.R.id.accessibilityActionScrollRight
+            }
 
         rule.onNodeWithTag(PagerTestTag).withSemanticsNode {
-            accessibilityNodeProvider.performAction(
-                id,
-                actionBackward,
-                null
-            )
+            accessibilityNodeProvider.performAction(id, actionBackward, null)
         }
 
         rule.runOnIdle {
@@ -401,18 +382,15 @@
 
         assertThat(pagerState.currentPage).isEqualTo(1)
 
-        val actionBackward = if (vertical) {
-            android.R.id.accessibilityActionScrollUp
-        } else {
-            android.R.id.accessibilityActionScrollLeft
-        }
+        val actionBackward =
+            if (vertical) {
+                android.R.id.accessibilityActionScrollUp
+            } else {
+                android.R.id.accessibilityActionScrollLeft
+            }
 
         rule.onNodeWithTag(PagerTestTag).withSemanticsNode {
-            accessibilityNodeProvider.performAction(
-                id,
-                actionBackward,
-                null
-            )
+            accessibilityNodeProvider.performAction(id, actionBackward, null)
         }
 
         rule.runOnIdle {
@@ -426,8 +404,6 @@
     }
 
     companion object {
-        @JvmStatic
-        @Parameterized.Parameters(name = "{0}")
-        fun params() = AllOrientationsParams
+        @JvmStatic @Parameterized.Parameters(name = "{0}") fun params() = AllOrientationsParams
     }
 }
diff --git a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/pager/PagerContentPaddingTest.kt b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/pager/PagerContentPaddingTest.kt
index 18e67ca..f7c92c5 100644
--- a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/pager/PagerContentPaddingTest.kt
+++ b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/pager/PagerContentPaddingTest.kt
@@ -78,25 +78,17 @@
         val largePaddingSize = pageTotalSize
 
         createPager(
-            modifier = Modifier
-                .requiredSize(containerSize)
-                .testTag(PagerTag),
-            contentPadding = PaddingValues(
-                mainAxis = largePaddingSize,
-                crossAxis = smallPaddingSize
-            ),
+            modifier = Modifier.requiredSize(containerSize).testTag(PagerTag),
+            contentPadding =
+                PaddingValues(mainAxis = largePaddingSize, crossAxis = smallPaddingSize),
             pageCount = { 1 },
             pageSize = { PageSize.Fixed(pageTotalSize) }
         ) {
-            Spacer(
-                Modifier
-                    .fillMaxCrossAxis()
-                    .mainAxisSize(pageTotalSize)
-                    .testTag(PageTag)
-            )
+            Spacer(Modifier.fillMaxCrossAxis().mainAxisSize(pageTotalSize).testTag(PageTag))
         }
 
-        rule.onNodeWithTag(PageTag)
+        rule
+            .onNodeWithTag(PageTag)
             .assertCrossAxisStartPositionInRootIsEqualTo(smallPaddingSize)
             .assertStartPositionInRootIsEqualTo(largePaddingSize)
             .assertCrossAxisSizeIsEqualTo(containerSize - smallPaddingSize * 2)
@@ -104,7 +96,8 @@
 
         pagerState.scrollBy(largePaddingSize)
 
-        rule.onNodeWithTag(PageTag)
+        rule
+            .onNodeWithTag(PageTag)
             .assertStartPositionInRootIsEqualTo(0.dp)
             .assertMainAxisSizeIsEqualTo(pageTotalSize)
     }
@@ -112,19 +105,12 @@
     @Test
     fun contentPaddingIsNotAffectingScrollPosition() {
         createPager(
-            modifier = Modifier
-                .requiredSize(pageTotalSize * 2)
-                .testTag(PagerTag),
+            modifier = Modifier.requiredSize(pageTotalSize * 2).testTag(PagerTag),
             contentPadding = PaddingValues(mainAxis = pageTotalSize),
             pageCount = { 1 },
             pageSize = { PageSize.Fixed(pageTotalSize) }
         ) {
-            Spacer(
-                Modifier
-                    .fillMaxCrossAxis()
-                    .mainAxisSize(pageTotalSize)
-                    .testTag(PageTag)
-            )
+            Spacer(Modifier.fillMaxCrossAxis().mainAxisSize(pageTotalSize).testTag(PageTag))
         }
 
         pagerState.assertScrollPosition(0, 0.dp)
@@ -138,57 +124,38 @@
     fun scrollForwardItemWithinStartPaddingDisplayed() {
         val padding = pageTotalSize * 1.5f
         createPager(
-            modifier = Modifier
-                .requiredSize(padding * 2 + pageTotalSize)
-                .testTag(PagerTag),
+            modifier = Modifier.requiredSize(padding * 2 + pageTotalSize).testTag(PagerTag),
             contentPadding = PaddingValues(mainAxis = padding),
             pageCount = { 4 },
             pageSize = { PageSize.Fixed(pageTotalSize) }
         ) {
-            Spacer(
-                Modifier
-                    .requiredSize(pageTotalSize)
-                    .testTag(it.toString())
-            )
+            Spacer(Modifier.requiredSize(pageTotalSize).testTag(it.toString()))
         }
 
-        rule.onNodeWithTag("0")
-            .assertStartPositionInRootIsEqualTo(padding)
-        rule.onNodeWithTag("1")
-            .assertStartPositionInRootIsEqualTo(pageTotalSize + padding)
-        rule.onNodeWithTag("2")
-            .assertStartPositionInRootIsEqualTo(pageTotalSize * 2 + padding)
+        rule.onNodeWithTag("0").assertStartPositionInRootIsEqualTo(padding)
+        rule.onNodeWithTag("1").assertStartPositionInRootIsEqualTo(pageTotalSize + padding)
+        rule.onNodeWithTag("2").assertStartPositionInRootIsEqualTo(pageTotalSize * 2 + padding)
 
         pagerState.scrollBy(padding)
 
         pagerState.assertScrollPosition(1, padding - pageTotalSize)
 
-        rule.onNodeWithTag("0")
-            .assertStartPositionInRootIsEqualTo(0.dp)
-        rule.onNodeWithTag("1")
-            .assertStartPositionInRootIsEqualTo(pageTotalSize)
-        rule.onNodeWithTag("2")
-            .assertStartPositionInRootIsEqualTo(pageTotalSize * 2)
-        rule.onNodeWithTag("3")
-            .assertStartPositionInRootIsEqualTo(pageTotalSize * 3)
+        rule.onNodeWithTag("0").assertStartPositionInRootIsEqualTo(0.dp)
+        rule.onNodeWithTag("1").assertStartPositionInRootIsEqualTo(pageTotalSize)
+        rule.onNodeWithTag("2").assertStartPositionInRootIsEqualTo(pageTotalSize * 2)
+        rule.onNodeWithTag("3").assertStartPositionInRootIsEqualTo(pageTotalSize * 3)
     }
 
     @Test
     fun scrollBackwardItemWithinStartPaddingDisplayed() {
         val padding = pageTotalSize * 1.5f
         createPager(
-            modifier = Modifier
-                .requiredSize(padding * 2 + pageTotalSize)
-                .testTag(PagerTag),
+            modifier = Modifier.requiredSize(padding * 2 + pageTotalSize).testTag(PagerTag),
             contentPadding = PaddingValues(mainAxis = padding),
             pageCount = { 4 },
             pageSize = { PageSize.Fixed(pageTotalSize) }
         ) {
-            Spacer(
-                Modifier
-                    .requiredSize(pageTotalSize)
-                    .testTag(it.toString())
-            )
+            Spacer(Modifier.requiredSize(pageTotalSize).testTag(it.toString()))
         }
 
         pagerState.scrollBy(pageTotalSize * 3)
@@ -196,74 +163,52 @@
 
         pagerState.assertScrollPosition(1, pageTotalSize * 0.5f)
 
-        rule.onNodeWithTag("0")
-            .assertStartPositionInRootIsEqualTo(pageTotalSize * 1.5f - padding)
-        rule.onNodeWithTag("1")
-            .assertStartPositionInRootIsEqualTo(pageTotalSize * 2.5f - padding)
-        rule.onNodeWithTag("2")
-            .assertStartPositionInRootIsEqualTo(pageTotalSize * 3.5f - padding)
-        rule.onNodeWithTag("3")
-            .assertStartPositionInRootIsEqualTo(pageTotalSize * 4.5f - padding)
+        rule.onNodeWithTag("0").assertStartPositionInRootIsEqualTo(pageTotalSize * 1.5f - padding)
+        rule.onNodeWithTag("1").assertStartPositionInRootIsEqualTo(pageTotalSize * 2.5f - padding)
+        rule.onNodeWithTag("2").assertStartPositionInRootIsEqualTo(pageTotalSize * 3.5f - padding)
+        rule.onNodeWithTag("3").assertStartPositionInRootIsEqualTo(pageTotalSize * 4.5f - padding)
     }
 
     @Test
     fun scrollForwardTillTheEnd() {
         val padding = pageTotalSize * 1.5f
         createPager(
-            modifier = Modifier
-                .requiredSize(padding * 2 + pageTotalSize)
-                .testTag(PagerTag),
+            modifier = Modifier.requiredSize(padding * 2 + pageTotalSize).testTag(PagerTag),
             contentPadding = PaddingValues(mainAxis = padding),
             pageCount = { 4 },
             pageSize = { PageSize.Fixed(pageTotalSize) }
         ) {
-            Spacer(
-                Modifier
-                    .requiredSize(pageTotalSize)
-                    .testTag(it.toString())
-            )
+            Spacer(Modifier.requiredSize(pageTotalSize).testTag(it.toString()))
         }
 
         pagerState.scrollBy(pageTotalSize * 3)
 
         pagerState.assertScrollPosition(3, 0.dp)
 
-        rule.onNodeWithTag("1")
-            .assertStartPositionInRootIsEqualTo(pageTotalSize - padding)
-        rule.onNodeWithTag("2")
-            .assertStartPositionInRootIsEqualTo(pageTotalSize * 2 - padding)
-        rule.onNodeWithTag("3")
-            .assertStartPositionInRootIsEqualTo(pageTotalSize * 3 - padding)
+        rule.onNodeWithTag("1").assertStartPositionInRootIsEqualTo(pageTotalSize - padding)
+        rule.onNodeWithTag("2").assertStartPositionInRootIsEqualTo(pageTotalSize * 2 - padding)
+        rule.onNodeWithTag("3").assertStartPositionInRootIsEqualTo(pageTotalSize * 3 - padding)
 
         // there are no space to scroll anymore, so it should change nothing
         pagerState.scrollBy(10.dp)
 
         pagerState.assertScrollPosition(3, 0.dp)
 
-        rule.onNodeWithTag("1")
-            .assertStartPositionInRootIsEqualTo(pageTotalSize - padding)
-        rule.onNodeWithTag("2")
-            .assertStartPositionInRootIsEqualTo(pageTotalSize * 2 - padding)
-        rule.onNodeWithTag("3")
-            .assertStartPositionInRootIsEqualTo(pageTotalSize * 3 - padding)
+        rule.onNodeWithTag("1").assertStartPositionInRootIsEqualTo(pageTotalSize - padding)
+        rule.onNodeWithTag("2").assertStartPositionInRootIsEqualTo(pageTotalSize * 2 - padding)
+        rule.onNodeWithTag("3").assertStartPositionInRootIsEqualTo(pageTotalSize * 3 - padding)
     }
 
     @Test
     fun scrollForwardTillTheEndAndABitBack() {
         val padding = pageTotalSize * 1.5f
         createPager(
-            modifier = Modifier
-                .requiredSize(padding * 2 + pageTotalSize)
-                .testTag(PagerTag),
+            modifier = Modifier.requiredSize(padding * 2 + pageTotalSize).testTag(PagerTag),
             contentPadding = PaddingValues(mainAxis = padding),
             pageCount = { 4 },
             pageSize = { PageSize.Fixed(pageTotalSize) }
         ) {
-            Spacer(
-                Modifier
-                    .requiredSize(pageTotalSize)
-                    .testTag(it.toString())
-            )
+            Spacer(Modifier.requiredSize(pageTotalSize).testTag(it.toString()))
         }
 
         pagerState.scrollBy(pageTotalSize * 3)
@@ -271,12 +216,9 @@
 
         pagerState.assertScrollPosition(2, pageTotalSize / 2)
 
-        rule.onNodeWithTag("1")
-            .assertStartPositionInRootIsEqualTo(pageTotalSize * 1.5f - padding)
-        rule.onNodeWithTag("2")
-            .assertStartPositionInRootIsEqualTo(pageTotalSize * 2.5f - padding)
-        rule.onNodeWithTag("3")
-            .assertStartPositionInRootIsEqualTo(pageTotalSize * 3.5f - padding)
+        rule.onNodeWithTag("1").assertStartPositionInRootIsEqualTo(pageTotalSize * 1.5f - padding)
+        rule.onNodeWithTag("2").assertStartPositionInRootIsEqualTo(pageTotalSize * 2.5f - padding)
+        rule.onNodeWithTag("3").assertStartPositionInRootIsEqualTo(pageTotalSize * 3.5f - padding)
     }
 
     @Test
@@ -286,30 +228,29 @@
             Box(modifier = Modifier.testTag(ContainerTag)) {
                 HorizontalOrVerticalPager(
                     state = state,
-                    contentPadding = PaddingValues(
-                        beforeContentCrossAxis = 2.dp,
-                        beforeContent = 4.dp,
-                        afterContentCrossAxis = 6.dp,
-                        afterContent = 8.dp
-                    ),
+                    contentPadding =
+                        PaddingValues(
+                            beforeContentCrossAxis = 2.dp,
+                            beforeContent = 4.dp,
+                            afterContentCrossAxis = 6.dp,
+                            afterContent = 8.dp
+                        ),
                     pageSize = PageSize.Fixed(pageTotalSize)
                 ) {
-                    Spacer(
-                        Modifier
-                            .requiredSize(pageTotalSize)
-                            .testTag(PageTag)
-                    )
+                    Spacer(Modifier.requiredSize(pageTotalSize).testTag(PageTag))
                 }
             }
         }
 
-        rule.onNodeWithTag(PageTag)
+        rule
+            .onNodeWithTag(PageTag)
             .assertCrossAxisStartPositionInRootIsEqualTo(2.dp)
             .assertStartPositionInRootIsEqualTo(4.dp)
             .assertCrossAxisSizeIsEqualTo(pageTotalSize)
             .assertMainAxisSizeIsEqualTo(pageTotalSize)
 
-        rule.onNodeWithTag(ContainerTag)
+        rule
+            .onNodeWithTag(ContainerTag)
             .assertCrossAxisStartPositionInRootIsEqualTo(0.dp)
             .assertStartPositionInRootIsEqualTo(0.dp)
             .assertCrossAxisSizeIsEqualTo(pageTotalSize + 2.dp + 6.dp)
@@ -323,18 +264,20 @@
             Box(modifier = Modifier.testTag(ContainerTag)) {
                 HorizontalOrVerticalPager(
                     state = state,
-                    contentPadding = PaddingValues(
-                        beforeContentCrossAxis = 2.dp,
-                        beforeContent = 4.dp,
-                        afterContentCrossAxis = 6.dp,
-                        afterContent = 8.dp
-                    ),
+                    contentPadding =
+                        PaddingValues(
+                            beforeContentCrossAxis = 2.dp,
+                            beforeContent = 4.dp,
+                            afterContentCrossAxis = 6.dp,
+                            afterContent = 8.dp
+                        ),
                     pageSize = PageSize.Fixed(pageTotalSize)
-                ) { }
+                ) {}
             }
         }
 
-        rule.onNodeWithTag(ContainerTag)
+        rule
+            .onNodeWithTag(ContainerTag)
             .assertCrossAxisStartPositionInRootIsEqualTo(0.dp)
             .assertStartPositionInRootIsEqualTo(0.dp)
             .assertCrossAxisSizeIsEqualTo(8.dp)
@@ -348,20 +291,22 @@
             Box(modifier = Modifier.testTag(ContainerTag)) {
                 HorizontalOrVerticalPager(
                     state = state,
-                    contentPadding = PaddingValues(
-                        beforeContentCrossAxis = 2.dp,
-                        beforeContent = 4.dp,
-                        afterContentCrossAxis = 6.dp,
-                        afterContent = 8.dp
-                    ),
+                    contentPadding =
+                        PaddingValues(
+                            beforeContentCrossAxis = 2.dp,
+                            beforeContent = 4.dp,
+                            afterContentCrossAxis = 6.dp,
+                            afterContent = 8.dp
+                        ),
                     pageSize = PageSize.Fixed(0.dp)
                 ) {
-                    Box { }
+                    Box {}
                 }
             }
         }
 
-        rule.onNodeWithTag(ContainerTag)
+        rule
+            .onNodeWithTag(ContainerTag)
             .assertCrossAxisStartPositionInRootIsEqualTo(0.dp)
             .assertStartPositionInRootIsEqualTo(0.dp)
             .assertCrossAxisSizeIsEqualTo(8.dp)
@@ -376,27 +321,22 @@
         createPager(
             reverseLayout = true,
             modifier = Modifier.requiredSize(listSize),
-            contentPadding = PaddingValues(
-                beforeContent = topPadding,
-                afterContent = bottomPadding
-            ),
+            contentPadding =
+                PaddingValues(beforeContent = topPadding, afterContent = bottomPadding),
             pageSize = { PageSize.Fixed(pageTotalSize) },
             pageCount = { 3 }
         ) { page ->
-            Box(
-                Modifier
-                    .requiredSize(pageTotalSize)
-                    .testTag("$page")
-            )
+            Box(Modifier.requiredSize(pageTotalSize).testTag("$page"))
         }
 
-        rule.onNodeWithTag("0")
+        rule
+            .onNodeWithTag("0")
             .assertStartPositionInRootIsEqualTo(listSize - bottomPadding - pageTotalSize)
-        rule.onNodeWithTag("1")
+        rule
+            .onNodeWithTag("1")
             .assertStartPositionInRootIsEqualTo(listSize - bottomPadding - pageTotalSize * 2)
         // Partially visible.
-        rule.onNodeWithTag("2")
-            .assertStartPositionInRootIsEqualTo(-pageTotalSize / 2)
+        rule.onNodeWithTag("2").assertStartPositionInRootIsEqualTo(-pageTotalSize / 2)
 
         // Scroll to the top.
         pagerState.scrollBy(pageTotalSize * 2.5f)
@@ -415,22 +355,15 @@
         createPager(
             reverseLayout = true,
             modifier = Modifier.requiredSize(listSize),
-            contentPadding = PaddingValues(
-                beforeContent = topPadding,
-                afterContent = bottomPadding
-            ),
+            contentPadding =
+                PaddingValues(beforeContent = topPadding, afterContent = bottomPadding),
             pageSize = { PageSize.Fixed(pageTotalSize) },
             pageCount = { 3 }
         ) { page ->
-            Box(
-                Modifier
-                    .requiredSize(pageTotalSize)
-                    .testTag("$page")
-            )
+            Box(Modifier.requiredSize(pageTotalSize).testTag("$page"))
         }
 
-        rule.onNodeWithTag("0")
-            .assertStartPositionInRootIsEqualTo(0.dp)
+        rule.onNodeWithTag("0").assertStartPositionInRootIsEqualTo(0.dp)
         // Shouldn't be visible
         rule.onNodeWithTag("1").assertDoesNotExist()
 
@@ -449,29 +382,25 @@
         rule.setContent {
             state = rememberPagerState { 2 }
             Box(
-                modifier = Modifier
-                    .testTag(ContainerTag)
-                    .size(pageTotalSize + smallPaddingSize * 2)
+                modifier = Modifier.testTag(ContainerTag).size(pageTotalSize + smallPaddingSize * 2)
             ) {
                 HorizontalOrVerticalPager(
                     state = state,
                     contentPadding = PaddingValues(mainAxis = smallPaddingSize),
                     pageSize = PageSize.Fixed(pageTotalSize)
                 ) {
-                    Box(
-                        Modifier
-                            .testTag("$it")
-                            .fillMaxSize()
-                    )
+                    Box(Modifier.testTag("$it").fillMaxSize())
                 }
             }
         }
 
-        rule.onNodeWithTag("0")
+        rule
+            .onNodeWithTag("0")
             .assertStartPositionInRootIsEqualTo(smallPaddingSize)
             .assertMainAxisSizeIsEqualTo(pageTotalSize)
 
-        rule.onNodeWithTag("1")
+        rule
+            .onNodeWithTag("1")
             .assertStartPositionInRootIsEqualTo(smallPaddingSize + pageTotalSize)
             .assertMainAxisSizeIsEqualTo(pageTotalSize)
 
@@ -484,11 +413,13 @@
             }
         }
 
-        rule.onNodeWithTag("1")
+        rule
+            .onNodeWithTag("1")
             .assertStartPositionInRootIsEqualTo(smallPaddingSize)
             .assertMainAxisSizeIsEqualTo(pageTotalSize)
 
-        rule.onNodeWithTag("0")
+        rule
+            .onNodeWithTag("0")
             .assertStartPositionInRootIsEqualTo(smallPaddingSize - pageTotalSize)
             .assertMainAxisSizeIsEqualTo(pageTotalSize)
     }
@@ -498,30 +429,20 @@
         lateinit var state: PagerState
         rule.setContent {
             state = rememberPagerState { 4 }
-            Box(
-                modifier = Modifier
-                    .testTag(ContainerTag)
-                    .size(pageTotalSize * 1.5f)
-            ) {
+            Box(modifier = Modifier.testTag(ContainerTag).size(pageTotalSize * 1.5f)) {
                 HorizontalOrVerticalPager(
                     state = state,
                     contentPadding = PaddingValues(mainAxis = pageTotalSize),
                     pageSize = PageSize.Fixed(pageTotalSize)
                 ) {
-                    Box(
-                        Modifier
-                            .testTag("$it")
-                            .size(pageTotalSize)
-                    )
+                    Box(Modifier.testTag("$it").size(pageTotalSize))
                 }
             }
         }
 
-        rule.onNodeWithTag("0")
-            .assertStartPositionInRootIsEqualTo(pageTotalSize)
+        rule.onNodeWithTag("0").assertStartPositionInRootIsEqualTo(pageTotalSize)
 
-        rule.onNodeWithTag("1")
-            .assertDoesNotExist()
+        rule.onNodeWithTag("1").assertDoesNotExist()
 
         rule.runOnIdle {
             state.assertScrollPosition(0, 0.dp)
@@ -535,35 +456,24 @@
         lateinit var state: PagerState
         rule.setContent {
             state = rememberPagerState { 4 }
-            Box(
-                modifier = Modifier
-                    .testTag(ContainerTag)
-                    .size(pageTotalSize * 1.5f)
-            ) {
+            Box(modifier = Modifier.testTag(ContainerTag).size(pageTotalSize * 1.5f)) {
                 HorizontalOrVerticalPager(
                     state = state,
                     contentPadding = PaddingValues(mainAxis = pageTotalSize),
                     pageSize = PageSize.Fixed(pageTotalSize)
                 ) {
-                    Box(
-                        Modifier
-                            .testTag("$it")
-                            .size(pageTotalSize)
-                    )
+                    Box(Modifier.testTag("$it").size(pageTotalSize))
                 }
             }
         }
 
         state.scrollBy(pageTotalSize)
 
-        rule.onNodeWithTag("0")
-            .assertStartPositionInRootIsEqualTo(0.dp)
+        rule.onNodeWithTag("0").assertStartPositionInRootIsEqualTo(0.dp)
 
-        rule.onNodeWithTag("1")
-            .assertStartPositionInRootIsEqualTo(pageTotalSize)
+        rule.onNodeWithTag("1").assertStartPositionInRootIsEqualTo(pageTotalSize)
 
-        rule.onNodeWithTag("2")
-            .assertIsNotDisplayed()
+        rule.onNodeWithTag("2").assertIsNotDisplayed()
 
         rule.runOnIdle {
             state.assertScrollPosition(1, 0.dp)
@@ -576,35 +486,24 @@
         lateinit var state: PagerState
         rule.setContent {
             state = rememberPagerState { 4 }
-            Box(
-                modifier = Modifier
-                    .testTag(ContainerTag)
-                    .size(pageTotalSize * 1.5f)
-            ) {
+            Box(modifier = Modifier.testTag(ContainerTag).size(pageTotalSize * 1.5f)) {
                 HorizontalOrVerticalPager(
                     state = state,
                     contentPadding = PaddingValues(mainAxis = pageTotalSize),
                     pageSize = PageSize.Fixed(pageTotalSize)
                 ) {
-                    Box(
-                        Modifier
-                            .testTag("$it")
-                            .size(pageTotalSize)
-                    )
+                    Box(Modifier.testTag("$it").size(pageTotalSize))
                 }
             }
         }
 
         state.runScrollToPage(3)
 
-        rule.onNodeWithTag("1")
-            .assertDoesNotExist()
+        rule.onNodeWithTag("1").assertDoesNotExist()
 
-        rule.onNodeWithTag("2")
-            .assertStartPositionInRootIsEqualTo(0.dp)
+        rule.onNodeWithTag("2").assertStartPositionInRootIsEqualTo(0.dp)
 
-        rule.onNodeWithTag("3")
-            .assertStartPositionInRootIsEqualTo(pageTotalSize)
+        rule.onNodeWithTag("3").assertStartPositionInRootIsEqualTo(pageTotalSize)
 
         rule.runOnIdle {
             state.assertScrollPosition(3, 0.dp)
@@ -617,35 +516,24 @@
         lateinit var state: PagerState
         rule.setContent {
             state = rememberPagerState { 4 }
-            Box(
-                modifier = Modifier
-                    .testTag(ContainerTag)
-                    .size(pageTotalSize * 1.5f)
-            ) {
+            Box(modifier = Modifier.testTag(ContainerTag).size(pageTotalSize * 1.5f)) {
                 HorizontalOrVerticalPager(
                     state = state,
                     contentPadding = PaddingValues(mainAxis = pageTotalSize),
                     pageSize = PageSize.Fixed(pageTotalSize),
                 ) {
-                    Box(
-                        Modifier
-                            .testTag("$it")
-                            .size(pageTotalSize)
-                    )
+                    Box(Modifier.testTag("$it").size(pageTotalSize))
                 }
             }
         }
 
         state.scrollBy(pageTotalSize * 3)
 
-        rule.onNodeWithTag("1")
-            .assertIsNotDisplayed()
+        rule.onNodeWithTag("1").assertIsNotDisplayed()
 
-        rule.onNodeWithTag("2")
-            .assertStartPositionInRootIsEqualTo(0.dp)
+        rule.onNodeWithTag("2").assertStartPositionInRootIsEqualTo(0.dp)
 
-        rule.onNodeWithTag("3")
-            .assertStartPositionInRootIsEqualTo(pageTotalSize)
+        rule.onNodeWithTag("3").assertStartPositionInRootIsEqualTo(pageTotalSize)
 
         rule.runOnIdle {
             state.assertScrollPosition(3, 0.dp)
@@ -659,32 +547,22 @@
         lateinit var state: PagerState
         rule.setContent {
             state = rememberPagerState { 4 }
-            Box(
-                modifier = Modifier
-                    .testTag(ContainerTag)
-                    .size(pageTotalSize * 1.5f)
-            ) {
+            Box(modifier = Modifier.testTag(ContainerTag).size(pageTotalSize * 1.5f)) {
                 HorizontalOrVerticalPager(
                     state = state,
                     contentPadding = PaddingValues(mainAxis = pageTotalSize),
                     pageSize = PageSize.Fixed(pageTotalSize)
                 ) {
-                    Box(
-                        Modifier
-                            .testTag("$it")
-                            .size(pageTotalSize)
-                    )
+                    Box(Modifier.testTag("$it").size(pageTotalSize))
                 }
             }
         }
 
         state.scrollBy(pageTotalSize * 4.5f)
 
-        rule.onNodeWithTag("2")
-            .assertIsNotDisplayed()
+        rule.onNodeWithTag("2").assertIsNotDisplayed()
 
-        rule.onNodeWithTag("3")
-            .assertStartPositionInRootIsEqualTo(-pageTotalSize * 0.5f)
+        rule.onNodeWithTag("3").assertStartPositionInRootIsEqualTo(-pageTotalSize * 0.5f)
 
         rule.runOnIdle {
             state.assertScrollPosition(3, pageTotalSize * 1.5f)
@@ -697,27 +575,18 @@
         lateinit var state: PagerState
         rule.setContent {
             state = rememberPagerState { 4 }
-            Box(
-                modifier = Modifier
-                    .testTag(ContainerTag)
-                    .size(pageTotalSize * 1.5f)
-            ) {
+            Box(modifier = Modifier.testTag(ContainerTag).size(pageTotalSize * 1.5f)) {
                 HorizontalOrVerticalPager(
                     state = state,
                     contentPadding = PaddingValues(mainAxis = pageTotalSize * 2),
                     pageSize = PageSize.Fixed(pageTotalSize)
                 ) {
-                    Box(
-                        Modifier
-                            .testTag("$it")
-                            .size(pageTotalSize)
-                    )
+                    Box(Modifier.testTag("$it").size(pageTotalSize))
                 }
             }
         }
 
-        rule.onNodeWithTag("0")
-            .assertIsNotDisplayed()
+        rule.onNodeWithTag("0").assertIsNotDisplayed()
 
         rule.runOnIdle {
             state.assertScrollPosition(0, 0.dp)
@@ -731,35 +600,24 @@
         lateinit var state: PagerState
         rule.setContent {
             state = rememberPagerState { 4 }
-            Box(
-                modifier = Modifier
-                    .testTag(ContainerTag)
-                    .size(pageTotalSize * 1.5f)
-            ) {
+            Box(modifier = Modifier.testTag(ContainerTag).size(pageTotalSize * 1.5f)) {
                 HorizontalOrVerticalPager(
                     state = state,
                     contentPadding = PaddingValues(mainAxis = pageTotalSize * 2),
                     pageSize = PageSize.Fixed(pageTotalSize)
                 ) {
-                    Box(
-                        Modifier
-                            .testTag("$it")
-                            .size(pageTotalSize)
-                    )
+                    Box(Modifier.testTag("$it").size(pageTotalSize))
                 }
             }
         }
 
         state.scrollBy(pageTotalSize * 2)
 
-        rule.onNodeWithTag("0")
-            .assertStartPositionInRootIsEqualTo(0.dp)
+        rule.onNodeWithTag("0").assertStartPositionInRootIsEqualTo(0.dp)
 
-        rule.onNodeWithTag("1")
-            .assertStartPositionInRootIsEqualTo(pageTotalSize)
+        rule.onNodeWithTag("1").assertStartPositionInRootIsEqualTo(pageTotalSize)
 
-        rule.onNodeWithTag("2")
-            .assertIsNotDisplayed()
+        rule.onNodeWithTag("2").assertIsNotDisplayed()
 
         rule.runOnIdle {
             state.assertScrollPosition(2, 0.dp)
@@ -772,38 +630,26 @@
         lateinit var state: PagerState
         rule.setContent {
             state = rememberPagerState { 4 }
-            Box(
-                modifier = Modifier
-                    .testTag(ContainerTag)
-                    .size(pageTotalSize * 1.5f)
-            ) {
+            Box(modifier = Modifier.testTag(ContainerTag).size(pageTotalSize * 1.5f)) {
                 HorizontalOrVerticalPager(
                     state = state,
                     contentPadding = PaddingValues(mainAxis = pageTotalSize * 2),
                     pageSize = PageSize.Fixed(pageTotalSize)
                 ) {
-                    Box(
-                        Modifier
-                            .testTag("$it")
-                            .size(pageTotalSize)
-                    )
+                    Box(Modifier.testTag("$it").size(pageTotalSize))
                 }
             }
         }
 
         state.runScrollToPage(3)
 
-        rule.onNodeWithTag("0")
-            .assertIsNotDisplayed()
+        rule.onNodeWithTag("0").assertIsNotDisplayed()
 
-        rule.onNodeWithTag("1")
-            .assertStartPositionInRootIsEqualTo(0.dp)
+        rule.onNodeWithTag("1").assertStartPositionInRootIsEqualTo(0.dp)
 
-        rule.onNodeWithTag("2")
-            .assertStartPositionInRootIsEqualTo(pageTotalSize)
+        rule.onNodeWithTag("2").assertStartPositionInRootIsEqualTo(pageTotalSize)
 
-        rule.onNodeWithTag("3")
-            .assertIsNotDisplayed()
+        rule.onNodeWithTag("3").assertIsNotDisplayed()
 
         rule.runOnIdle {
             state.assertScrollPosition(3, 0.dp)
@@ -816,38 +662,26 @@
         lateinit var state: PagerState
         rule.setContent {
             state = rememberPagerState { 4 }
-            Box(
-                modifier = Modifier
-                    .testTag(ContainerTag)
-                    .size(pageTotalSize * 1.5f)
-            ) {
+            Box(modifier = Modifier.testTag(ContainerTag).size(pageTotalSize * 1.5f)) {
                 HorizontalOrVerticalPager(
                     state = state,
                     contentPadding = PaddingValues(mainAxis = pageTotalSize * 2),
                     pageSize = PageSize.Fixed(pageTotalSize)
                 ) {
-                    Box(
-                        Modifier
-                            .testTag("$it")
-                            .size(pageTotalSize)
-                    )
+                    Box(Modifier.testTag("$it").size(pageTotalSize))
                 }
             }
         }
 
         state.scrollBy(pageTotalSize * 3)
 
-        rule.onNodeWithTag("0")
-            .assertIsNotDisplayed()
+        rule.onNodeWithTag("0").assertIsNotDisplayed()
 
-        rule.onNodeWithTag("1")
-            .assertStartPositionInRootIsEqualTo(0.dp)
+        rule.onNodeWithTag("1").assertStartPositionInRootIsEqualTo(0.dp)
 
-        rule.onNodeWithTag("2")
-            .assertStartPositionInRootIsEqualTo(pageTotalSize)
+        rule.onNodeWithTag("2").assertStartPositionInRootIsEqualTo(pageTotalSize)
 
-        rule.onNodeWithTag("3")
-            .assertIsNotDisplayed()
+        rule.onNodeWithTag("3").assertIsNotDisplayed()
 
         rule.runOnIdle {
             state.assertScrollPosition(3, 0.dp)
@@ -861,21 +695,13 @@
         lateinit var state: PagerState
         rule.setContent {
             state = rememberPagerState { 4 }
-            Box(
-                modifier = Modifier
-                    .testTag(ContainerTag)
-                    .size(pageTotalSize * 1.5f)
-            ) {
+            Box(modifier = Modifier.testTag(ContainerTag).size(pageTotalSize * 1.5f)) {
                 HorizontalOrVerticalPager(
                     state = state,
                     contentPadding = PaddingValues(mainAxis = pageTotalSize * 2),
                     pageSize = PageSize.Fixed(pageTotalSize)
                 ) {
-                    Box(
-                        Modifier
-                            .testTag("$it")
-                            .size(pageTotalSize)
-                    )
+                    Box(Modifier.testTag("$it").size(pageTotalSize))
                 }
             }
         }
@@ -886,8 +712,7 @@
                 pageTotalSize * 3 // all pages
         )
 
-        rule.onNodeWithTag("3")
-            .assertIsNotDisplayed()
+        rule.onNodeWithTag("3").assertIsNotDisplayed()
 
         rule.runOnIdle {
             state.assertScrollPosition(3, pageTotalSize * 3.5f)
@@ -903,19 +728,12 @@
             state = rememberPagerState { 4 }
             CompositionLocalProvider(LocalLayoutDirection provides LayoutDirection.Rtl) {
                 HorizontalOrVerticalPager(
-                    modifier = Modifier
-                        .testTag("list")
-                        .mainAxisSize(pageTotalSize * 2),
+                    modifier = Modifier.testTag("list").mainAxisSize(pageTotalSize * 2),
                     state = state,
                     contentPadding = padding,
                     pageSize = PageSize.Fixed(pageTotalSize)
                 ) {
-                    Box(
-                        Modifier
-                            .testTag("$it")
-                            .background(Color.Red)
-                            .size(pageTotalSize)
-                    ) {
+                    Box(Modifier.testTag("$it").background(Color.Red).size(pageTotalSize)) {
                         BasicText("$it")
                     }
                 }
@@ -923,20 +741,22 @@
         }
 
         if (vertical) {
-            rule.onNodeWithTag("0")
+            rule
+                .onNodeWithTag("0")
                 .assertStartPositionInRootIsEqualTo(0.dp)
                 .assertCrossAxisStartPositionInRootIsEqualTo(
                     padding.calculateLeftPadding(LayoutDirection.Rtl)
                 )
 
-            rule.onNodeWithTag("list")
-                .assertWidthIsEqualTo(28.dp + pageTotalSize)
+            rule.onNodeWithTag("list").assertWidthIsEqualTo(28.dp + pageTotalSize)
         } else {
-            rule.onNodeWithTag("0")
+            rule
+                .onNodeWithTag("0")
                 .assertCrossAxisStartPositionInRootIsEqualTo(0.dp)
                 .assertStartPositionInRootIsEqualTo(
                     // list width - pageSize - padding
-                    pageTotalSize * 2 - pageTotalSize -
+                    pageTotalSize * 2 -
+                        pageTotalSize -
                         padding.calculateRightPadding(LayoutDirection.Rtl)
                 )
         }
@@ -944,13 +764,15 @@
         state.scrollBy(pageTotalSize * 4)
 
         if (vertical) {
-            rule.onNodeWithTag("3")
+            rule
+                .onNodeWithTag("3")
                 .assertStartPositionInRootIsEqualTo(pageTotalSize)
                 .assertCrossAxisStartPositionInRootIsEqualTo(
                     padding.calculateLeftPadding(LayoutDirection.Rtl)
                 )
         } else {
-            rule.onNodeWithTag("3")
+            rule
+                .onNodeWithTag("3")
                 .assertCrossAxisStartPositionInRootIsEqualTo(0.dp)
                 .assertStartPositionInRootIsEqualTo(
                     padding.calculateLeftPadding(LayoutDirection.Rtl)
@@ -966,20 +788,20 @@
     }
 
     private fun PagerState.runScrollToPage(page: Int) {
-        runBlocking(Dispatchers.Main + AutoTestFrameClock()) {
-            scrollToPage(page)
+        runBlocking(Dispatchers.Main + AutoTestFrameClock()) { scrollToPage(page) }
+    }
+
+    private fun PagerState.assertScrollPosition(index: Int, offset: Dp) =
+        with(rule.density) {
+            assertThat(firstVisiblePage).isEqualTo(index)
+            assertThat(firstVisiblePageOffset.toDp().value).isWithin(0.5f).of(offset.value)
         }
-    }
 
-    private fun PagerState.assertScrollPosition(index: Int, offset: Dp) = with(rule.density) {
-        assertThat(firstVisiblePage).isEqualTo(index)
-        assertThat(firstVisiblePageOffset.toDp().value).isWithin(0.5f).of(offset.value)
-    }
-
-    private fun PagerState.assertLayoutInfoOffsetRange(from: Dp, to: Dp) = with(rule.density) {
-        assertThat(layoutInfo.viewportStartOffset to layoutInfo.viewportEndOffset)
-            .isEqualTo(from.roundToPx() to to.roundToPx())
-    }
+    private fun PagerState.assertLayoutInfoOffsetRange(from: Dp, to: Dp) =
+        with(rule.density) {
+            assertThat(layoutInfo.viewportStartOffset to layoutInfo.viewportEndOffset)
+                .isEqualTo(from.roundToPx() to to.roundToPx())
+        }
 
     private fun PagerState.assertVisibleItems(vararg expected: Pair<Int, Dp>) =
         with(rule.density) {
@@ -988,8 +810,6 @@
         }
 
     companion object {
-        @JvmStatic
-        @Parameterized.Parameters(name = "{0}")
-        fun params() = AllOrientationsParams
+        @JvmStatic @Parameterized.Parameters(name = "{0}") fun params() = AllOrientationsParams
     }
 }
diff --git a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/pager/PagerContentTest.kt b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/pager/PagerContentTest.kt
index a55a2a4..96dc082 100644
--- a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/pager/PagerContentTest.kt
+++ b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/pager/PagerContentTest.kt
@@ -52,8 +52,7 @@
 
 class PagerContentTest {
 
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
     @OptIn(ExperimentalFoundationApi::class)
     @Test
@@ -65,16 +64,12 @@
                 state = rememberPagerState { 10 }.also { state = it },
                 contentPadding = PaddingValues(horizontal = 32.dp),
                 pageSpacing = 4.dp,
-                modifier = Modifier
-                    .fillMaxSize()
-                    .testTag("pager"),
+                modifier = Modifier.fillMaxSize().testTag("pager"),
                 pageSize = PageSize.Fill
             ) { page ->
                 Box(
-                    modifier = Modifier
-                        .background(Color.Black)
-                        .size(100.dp)
-                        .testTag(page.toString())
+                    modifier =
+                        Modifier.background(Color.Black).size(100.dp).testTag(page.toString())
                 )
             }
         }
@@ -83,9 +78,7 @@
             swipe(bottomRight, bottomLeft) // swipe outside bounds of pages
         }
 
-        rule.runOnIdle {
-            assertTrue { state.currentPage != 0 }
-        }
+        rule.runOnIdle { assertTrue { state.currentPage != 0 } }
     }
 
     @OptIn(ExperimentalFoundationApi::class)
@@ -97,83 +90,57 @@
         rule.setContent {
             HorizontalPager(
                 state = rememberPagerState { colors.size },
-                modifier = Modifier
-                    .width(6.dp)
-                    .testTag(PagerTestTag),
+                modifier = Modifier.width(6.dp).testTag(PagerTestTag),
                 pageSize = PageSize.Fixed(2.dp)
             ) { page ->
                 val color = colors[page]
                 Box(
-                    modifier = Modifier
-                        .testTag(page.toString())
-                        .width(2.dp)
-                        .height(6.dp)
-                        .zIndex(if (color == Color.Green) 1f else 0f)
-                        .drawBehind {
-                            drawRect(
-                                color,
-                                topLeft = Offset(-10.dp.toPx(), -10.dp.toPx()),
-                                size = Size(20.dp.toPx(), 20.dp.toPx())
-                            )
-                        }
+                    modifier =
+                        Modifier.testTag(page.toString())
+                            .width(2.dp)
+                            .height(6.dp)
+                            .zIndex(if (color == Color.Green) 1f else 0f)
+                            .drawBehind {
+                                drawRect(
+                                    color,
+                                    topLeft = Offset(-10.dp.toPx(), -10.dp.toPx()),
+                                    size = Size(20.dp.toPx(), 20.dp.toPx())
+                                )
+                            }
                 )
             }
         }
 
-        rule.onNodeWithTag(PagerTestTag)
-            .captureToImage()
-            .assertPixels { Color.Green }
+        rule.onNodeWithTag(PagerTestTag).captureToImage().assertPixels { Color.Green }
     }
 
     @OptIn(ExperimentalFoundationApi::class)
     @Test
     fun scrollableState_isScrollableWhenChangingPages() {
         val states = mutableMapOf<Int, ScrollState>()
-        val pagerState = PagerState(
-            currentPage = 0,
-            currentPageOffsetFraction = 0.0f,
-            pageCount = { 2 })
+        val pagerState =
+            PagerState(currentPage = 0, currentPageOffsetFraction = 0.0f, pageCount = { 2 })
         rule.setContent {
             HorizontalPager(
                 state = pagerState,
-                modifier = Modifier
-                    .testTag("pager")
-                    .fillMaxSize()
+                modifier = Modifier.testTag("pager").fillMaxSize()
             ) { page ->
                 Column(
-                    modifier = Modifier
-                        .testTag("$page")
-                        .verticalScroll(rememberScrollState().also {
-                            states[page] = it
-                        })
+                    modifier =
+                        Modifier.testTag("$page")
+                            .verticalScroll(rememberScrollState().also { states[page] = it })
                 ) {
-                    repeat(100) {
-                        Box(
-                            modifier = Modifier
-                                .height(200.dp)
-                                .fillMaxWidth()
-                        )
-                    }
+                    repeat(100) { Box(modifier = Modifier.height(200.dp).fillMaxWidth()) }
                 }
             }
         }
-        rule.onNodeWithTag("0").performTouchInput {
-            swipe(bottomCenter, topCenter)
-        }
-        rule.runOnIdle {
-            Truth.assertThat(states[0]!!.value).isNotEqualTo(0f)
-        }
+        rule.onNodeWithTag("0").performTouchInput { swipe(bottomCenter, topCenter) }
+        rule.runOnIdle { Truth.assertThat(states[0]!!.value).isNotEqualTo(0f) }
         val previousScrollStateValue = states[0]!!.value
-        rule.onNodeWithTag("pager").performTouchInput {
-            swipe(centerRight, centerLeft)
-        }
+        rule.onNodeWithTag("pager").performTouchInput { swipe(centerRight, centerLeft) }
 
-        rule.onNodeWithTag("pager").performTouchInput {
-            swipe(centerLeft, centerRight)
-        }
-        rule.onNodeWithTag("0").performTouchInput {
-            swipe(bottomCenter, topCenter)
-        }
+        rule.onNodeWithTag("pager").performTouchInput { swipe(centerLeft, centerRight) }
+        rule.onNodeWithTag("0").performTouchInput { swipe(bottomCenter, topCenter) }
         rule.runOnIdle {
             Truth.assertThat(previousScrollStateValue).isNotEqualTo(states[0]!!.value)
         }
diff --git a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/pager/PagerCrossAxisTest.kt b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/pager/PagerCrossAxisTest.kt
index cf91ee7..112a18f 100644
--- a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/pager/PagerCrossAxisTest.kt
+++ b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/pager/PagerCrossAxisTest.kt
@@ -55,20 +55,14 @@
             InfiniteAxisRootComposable {
                 HorizontalOrVerticalPager(
                     state = rememberPagerState(pageCount = { DefaultPageCount }),
-                    modifier = Modifier
-                        .fillMaxHeight()
-                        .fillMaxWidth()
-                        .testTag(PagerTestTag),
+                    modifier = Modifier.fillMaxHeight().fillMaxWidth().testTag(PagerTestTag),
                 ) {
-                    val fillModifier = if (vertical) {
-                        Modifier
-                            .fillMaxHeight()
-                            .width(200.dp)
-                    } else {
-                        Modifier
-                            .fillMaxWidth()
-                            .height(200.dp)
-                    }
+                    val fillModifier =
+                        if (vertical) {
+                            Modifier.fillMaxHeight().width(200.dp)
+                        } else {
+                            Modifier.fillMaxWidth().height(200.dp)
+                        }
                     Box(fillModifier)
                 }
             }
@@ -79,11 +73,13 @@
 
         // Assert: Max Cross Axis size is handled well by wrapping content
         if (vertical) {
-            rule.onNodeWithTag(PagerTestTag)
+            rule
+                .onNodeWithTag(PagerTestTag)
                 .assertHeightIsEqualTo(rootBounds.height)
                 .assertWidthIsEqualTo(200.dp)
         } else {
-            rule.onNodeWithTag(PagerTestTag)
+            rule
+                .onNodeWithTag(PagerTestTag)
                 .assertWidthIsEqualTo(rootBounds.width)
                 .assertHeightIsEqualTo(200.dp)
         }
@@ -92,19 +88,13 @@
     @Composable
     private fun InfiniteAxisRootComposable(content: @Composable () -> Unit) {
         if (vertical) {
-            Row(Modifier.horizontalScroll(rememberScrollState())) {
-                content()
-            }
+            Row(Modifier.horizontalScroll(rememberScrollState())) { content() }
         } else {
-            Column(Modifier.verticalScroll(rememberScrollState())) {
-                content()
-            }
+            Column(Modifier.verticalScroll(rememberScrollState())) { content() }
         }
     }
 
     companion object {
-        @JvmStatic
-        @Parameterized.Parameters(name = "{0}")
-        fun params() = AllOrientationsParams
+        @JvmStatic @Parameterized.Parameters(name = "{0}") fun params() = AllOrientationsParams
     }
 }
diff --git a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/pager/PagerCustomKeyTest.kt b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/pager/PagerCustomKeyTest.kt
index 5e3afed..1ef2d56 100644
--- a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/pager/PagerCustomKeyTest.kt
+++ b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/pager/PagerCustomKeyTest.kt
@@ -33,8 +33,7 @@
 @RunWith(AndroidJUnit4::class)
 class PagerCustomKeyTest {
 
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
     @Test
     fun keysLambdaIsCalledOnlyOnce() {
@@ -52,8 +51,6 @@
             }
         }
 
-        rule.runOnIdle {
-            Truth.assertThat(keyCalls).isEqualTo(1)
-        }
+        rule.runOnIdle { Truth.assertThat(keyCalls).isEqualTo(1) }
     }
 }
diff --git a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/pager/PagerGestureTest.kt b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/pager/PagerGestureTest.kt
index 0881231..8519f84 100644
--- a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/pager/PagerGestureTest.kt
+++ b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/pager/PagerGestureTest.kt
@@ -49,16 +49,12 @@
             }
         }
 
-        rule.onNodeWithTag(
-            max(
-                0,
-                initialPage - paramConfig.beyondViewportPageCount - 1
-            ).toString()
-        ).assertDoesNotExist()
+        rule
+            .onNodeWithTag(max(0, initialPage - paramConfig.beyondViewportPageCount - 1).toString())
+            .assertDoesNotExist()
     }
+
     companion object {
-        @JvmStatic
-        @Parameterized.Parameters(name = "{0}")
-        fun params() = AllOrientationsParams
+        @JvmStatic @Parameterized.Parameters(name = "{0}") fun params() = AllOrientationsParams
     }
 }
diff --git a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/pager/PagerLayoutInfoTest.kt b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/pager/PagerLayoutInfoTest.kt
index ac4b3f79..f6f40a0 100644
--- a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/pager/PagerLayoutInfoTest.kt
+++ b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/pager/PagerLayoutInfoTest.kt
@@ -65,9 +65,7 @@
         ) {
             Box(Modifier.requiredSize(pageSizeDp))
         }
-        rule.runOnIdle {
-            pagerState.layoutInfo.assertVisiblePages(count = 4)
-        }
+        rule.runOnIdle { pagerState.layoutInfo.assertVisiblePages(count = 4) }
     }
 
     @Test
@@ -88,11 +86,7 @@
         }
 
         rule.runOnIdle {
-            pagerState.layoutInfo.assertVisiblePages(
-                count = 4,
-                startIndex = 1,
-                startOffset = -10
-            )
+            pagerState.layoutInfo.assertVisiblePages(count = 4, startIndex = 1, startOffset = -10)
         }
     }
 
@@ -107,9 +101,7 @@
             Box(Modifier.requiredSize(pageSizeDp))
         }
 
-        rule.runOnIdle {
-            pagerState.layoutInfo.assertVisiblePages(count = 2, spacing = pageSizePx)
-        }
+        rule.runOnIdle { pagerState.layoutInfo.assertVisiblePages(count = 2, spacing = pageSizePx) }
     }
 
     @Test
@@ -121,9 +113,7 @@
             pageSize = { PageSize.Fixed(pageSizeDp) },
             additionalContent = {
                 LaunchedEffect(key1 = pagerState) {
-                    snapshotFlow { pagerState.layoutInfo }.collect {
-                        currentInfo.value = it
-                    }
+                    snapshotFlow { pagerState.layoutInfo }.collect { currentInfo.value = it }
                 }
             }
         ) {
@@ -133,9 +123,7 @@
         rule.runOnIdle {
             // empty it here and scrolling should invoke observingFun again
             currentInfo.value = null
-            runBlocking {
-                pagerState.scrollToPage(1)
-            }
+            runBlocking { pagerState.scrollToPage(1) }
         }
 
         rule.runOnIdle {
@@ -166,7 +154,8 @@
             assertThat(currentInfo).isNotNull()
             currentInfo!!.assertVisiblePages(
                 count = 1,
-                pageSize = with(rule.density) { pageSizeDp.roundToPx() * 2 })
+                pageSize = with(rule.density) { pageSizeDp.roundToPx() * 2 }
+            )
             currentInfo = null
             pageSize = PageSize.Fixed(pageSizeDp)
         }
@@ -182,9 +171,7 @@
         val sizePx = 45
         val sizeDp = with(rule.density) { sizePx.toDp() }
         createPager(
-            modifier = Modifier
-                .mainAxisSize(sizeDp)
-                .crossAxisSize(sizeDp * 2),
+            modifier = Modifier.mainAxisSize(sizeDp).crossAxisSize(sizeDp * 2),
             pageCount = { 3 },
             pageSize = { PageSize.Fixed(sizeDp) }
         ) {
@@ -194,9 +181,10 @@
         rule.runOnIdle {
             assertThat(pagerState.layoutInfo.viewportStartOffset).isEqualTo(0)
             assertThat(pagerState.layoutInfo.viewportEndOffset).isEqualTo(sizePx)
-            assertThat(pagerState.layoutInfo.viewportSize).isEqualTo(
-                if (vertical) IntSize(sizePx * 2, sizePx) else IntSize(sizePx, sizePx * 2)
-            )
+            assertThat(pagerState.layoutInfo.viewportSize)
+                .isEqualTo(
+                    if (vertical) IntSize(sizePx * 2, sizePx) else IntSize(sizePx, sizePx * 2)
+                )
         }
     }
 
@@ -207,25 +195,26 @@
         val startPaddingPx = 10
         val endPaddingPx = 15
         val sizeDp = with(rule.density) { sizePx.toDp() }
-        val beforeContentPaddingDp = with(rule.density) {
-            if (!reverseLayout) startPaddingPx.toDp() else endPaddingPx.toDp()
-        }
-        val afterContentPaddingDp = with(rule.density) {
-            if (!reverseLayout) endPaddingPx.toDp() else startPaddingPx.toDp()
-        }
+        val beforeContentPaddingDp =
+            with(rule.density) {
+                if (!reverseLayout) startPaddingPx.toDp() else endPaddingPx.toDp()
+            }
+        val afterContentPaddingDp =
+            with(rule.density) {
+                if (!reverseLayout) endPaddingPx.toDp() else startPaddingPx.toDp()
+            }
 
         createPager(
-            modifier = Modifier
-                .mainAxisSize(sizeDp)
-                .crossAxisSize(sizeDp * 2),
+            modifier = Modifier.mainAxisSize(sizeDp).crossAxisSize(sizeDp * 2),
             pageCount = { 3 },
             pageSize = { PageSize.Fixed(sizeDp) },
-            contentPadding = PaddingValues(
-                beforeContent = beforeContentPaddingDp,
-                afterContent = afterContentPaddingDp,
-                beforeContentCrossAxis = 2.dp,
-                afterContentCrossAxis = 2.dp
-            )
+            contentPadding =
+                PaddingValues(
+                    beforeContent = beforeContentPaddingDp,
+                    afterContent = afterContentPaddingDp,
+                    beforeContentCrossAxis = 2.dp,
+                    afterContentCrossAxis = 2.dp
+                )
         ) {
             Box(Modifier.requiredSize(sizeDp))
         }
@@ -234,20 +223,16 @@
             assertThat(pagerState.layoutInfo.viewportStartOffset).isEqualTo(-startPaddingPx)
             assertThat(pagerState.layoutInfo.viewportEndOffset).isEqualTo(sizePx - startPaddingPx)
             assertThat(pagerState.layoutInfo.afterContentPadding).isEqualTo(endPaddingPx)
-            assertThat(pagerState.layoutInfo.viewportSize).isEqualTo(
-                if (vertical) IntSize(sizePx * 2, sizePx) else IntSize(sizePx, sizePx * 2)
-            )
+            assertThat(pagerState.layoutInfo.viewportSize)
+                .isEqualTo(
+                    if (vertical) IntSize(sizePx * 2, sizePx) else IntSize(sizePx, sizePx * 2)
+                )
         }
     }
 
     @Test
     fun emptyPagesInVisiblePagesInfo() {
-        createPager(
-            pageCount = { 2 },
-            pageSize = { PageSize.Fixed(pageSizeDp) }
-        ) {
-            Box(Modifier)
-        }
+        createPager(pageCount = { 2 }, pageSize = { PageSize.Fixed(pageSizeDp) }) { Box(Modifier) }
 
         rule.runOnIdle {
             assertThat(pagerState.layoutInfo.visiblePagesInfo.size).isEqualTo(2)
@@ -263,25 +248,26 @@
         val startPaddingPx = 10
         val endPaddingPx = 15
         val sizeDp = with(rule.density) { sizePx.toDp() }
-        val beforeContentPaddingDp = with(rule.density) {
-            if (!reverseLayout) startPaddingPx.toDp() else endPaddingPx.toDp()
-        }
-        val afterContentPaddingDp = with(rule.density) {
-            if (!reverseLayout) endPaddingPx.toDp() else startPaddingPx.toDp()
-        }
+        val beforeContentPaddingDp =
+            with(rule.density) {
+                if (!reverseLayout) startPaddingPx.toDp() else endPaddingPx.toDp()
+            }
+        val afterContentPaddingDp =
+            with(rule.density) {
+                if (!reverseLayout) endPaddingPx.toDp() else startPaddingPx.toDp()
+            }
 
         createPager(
-            modifier = Modifier
-                .mainAxisSize(sizeDp)
-                .crossAxisSize(sizeDp * 2),
+            modifier = Modifier.mainAxisSize(sizeDp).crossAxisSize(sizeDp * 2),
             pageCount = { 0 },
             pageSize = { PageSize.Fixed(sizeDp) },
-            contentPadding = PaddingValues(
-                beforeContent = beforeContentPaddingDp,
-                afterContent = afterContentPaddingDp,
-                beforeContentCrossAxis = 2.dp,
-                afterContentCrossAxis = 2.dp
-            )
+            contentPadding =
+                PaddingValues(
+                    beforeContent = beforeContentPaddingDp,
+                    afterContent = afterContentPaddingDp,
+                    beforeContentCrossAxis = 2.dp,
+                    afterContentCrossAxis = 2.dp
+                )
         ) {}
 
         rule.runOnIdle {
@@ -289,9 +275,10 @@
             assertThat(pagerState.layoutInfo.viewportEndOffset).isEqualTo(sizePx - startPaddingPx)
             assertThat(pagerState.layoutInfo.beforeContentPadding).isEqualTo(startPaddingPx)
             assertThat(pagerState.layoutInfo.afterContentPadding).isEqualTo(endPaddingPx)
-            assertThat(pagerState.layoutInfo.viewportSize).isEqualTo(
-                if (vertical) IntSize(sizePx * 2, sizePx) else IntSize(sizePx, sizePx * 2)
-            )
+            assertThat(pagerState.layoutInfo.viewportSize)
+                .isEqualTo(
+                    if (vertical) IntSize(sizePx * 2, sizePx) else IntSize(sizePx, sizePx * 2)
+                )
         }
     }
 
@@ -302,25 +289,26 @@
         val startPaddingPx = 10
         val endPaddingPx = 15
         val sizeDp = with(rule.density) { sizePx.toDp() }
-        val beforeContentPaddingDp = with(rule.density) {
-            if (!reverseLayout) startPaddingPx.toDp() else endPaddingPx.toDp()
-        }
-        val afterContentPaddingDp = with(rule.density) {
-            if (!reverseLayout) endPaddingPx.toDp() else startPaddingPx.toDp()
-        }
+        val beforeContentPaddingDp =
+            with(rule.density) {
+                if (!reverseLayout) startPaddingPx.toDp() else endPaddingPx.toDp()
+            }
+        val afterContentPaddingDp =
+            with(rule.density) {
+                if (!reverseLayout) endPaddingPx.toDp() else startPaddingPx.toDp()
+            }
 
         createPager(
-            modifier = Modifier
-                .mainAxisSize(sizeDp)
-                .crossAxisSize(sizeDp * 2),
+            modifier = Modifier.mainAxisSize(sizeDp).crossAxisSize(sizeDp * 2),
             pageCount = { 1 },
             pageSize = { PageSize.Fixed(sizeDp) },
-            contentPadding = PaddingValues(
-                beforeContent = beforeContentPaddingDp,
-                afterContent = afterContentPaddingDp,
-                beforeContentCrossAxis = 2.dp,
-                afterContentCrossAxis = 2.dp
-            )
+            contentPadding =
+                PaddingValues(
+                    beforeContent = beforeContentPaddingDp,
+                    afterContent = afterContentPaddingDp,
+                    beforeContentCrossAxis = 2.dp,
+                    afterContentCrossAxis = 2.dp
+                )
         ) {
             Box(Modifier.size(sizeDp / 2))
         }
@@ -330,9 +318,10 @@
             assertThat(pagerState.layoutInfo.viewportEndOffset).isEqualTo(sizePx - startPaddingPx)
             assertThat(pagerState.layoutInfo.beforeContentPadding).isEqualTo(startPaddingPx)
             assertThat(pagerState.layoutInfo.afterContentPadding).isEqualTo(endPaddingPx)
-            assertThat(pagerState.layoutInfo.viewportSize).isEqualTo(
-                if (vertical) IntSize(sizePx * 2, sizePx) else IntSize(sizePx, sizePx * 2)
-            )
+            assertThat(pagerState.layoutInfo.viewportSize)
+                .isEqualTo(
+                    if (vertical) IntSize(sizePx * 2, sizePx) else IntSize(sizePx, sizePx * 2)
+                )
         }
     }
 
@@ -380,7 +369,8 @@
         var currentOffset = startOffset
         visiblePagesInfo.forEach {
             assertThat(it.index).isEqualTo(currentIndex)
-            assertWithMessage("Offset of page $currentIndex").that(it.offset)
+            assertWithMessage("Offset of page $currentIndex")
+                .that(it.offset)
                 .isEqualTo(currentOffset)
             currentIndex++
             currentOffset += pageSize + spacing
@@ -390,15 +380,15 @@
     companion object {
         @JvmStatic
         @Parameterized.Parameters(name = "{0}")
-        fun params() = mutableListOf<ParamConfig>().apply {
-            for (orientation in TestOrientation) {
-                for (reverseLayout in TestReverseLayout) {
-                    add(ParamConfig(orientation = orientation, reverseLayout = reverseLayout))
+        fun params() =
+            mutableListOf<ParamConfig>().apply {
+                for (orientation in TestOrientation) {
+                    for (reverseLayout in TestReverseLayout) {
+                        add(ParamConfig(orientation = orientation, reverseLayout = reverseLayout))
+                    }
                 }
             }
-        }
     }
 }
 
-@Stable
-class StableRef<T>(var value: T)
+@Stable class StableRef<T>(var value: T)
diff --git a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/pager/PagerNestedScrollContentTest.kt b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/pager/PagerNestedScrollContentTest.kt
index 5954476..3e5badf 100644
--- a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/pager/PagerNestedScrollContentTest.kt
+++ b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/pager/PagerNestedScrollContentTest.kt
@@ -67,9 +67,7 @@
 @OptIn(ExperimentalFoundationApi::class)
 @LargeTest
 @RunWith(Parameterized::class)
-class PagerNestedScrollContentTest(
-    config: ParamConfig
-) : BasePagerTest(config = config) {
+class PagerNestedScrollContentTest(config: ParamConfig) : BasePagerTest(config = config) {
 
     @OptIn(ExperimentalFoundationApi::class)
     @Test
@@ -90,9 +88,7 @@
                 horizontalAlignment = Alignment.Start
             ) {
                 items(10) {
-                    Box(modifier = Modifier.size(100.dp)) {
-                        BasicText(text = it.toString())
-                    }
+                    Box(modifier = Modifier.size(100.dp)) { BasicText(text = it.toString()) }
                 }
             }
         }
@@ -116,14 +112,13 @@
         rule.mainClock.autoAdvance = false
         val defaultFlingBehavior = DefaultFlingBehavior(splineBasedDecay(rule.density))
         var flingTriggered = false
-        val flingInspector = object : FlingBehavior {
-            override suspend fun ScrollScope.performFling(initialVelocity: Float): Float {
-                flingTriggered = true
-                return with(defaultFlingBehavior) {
-                    performFling(initialVelocity)
+        val flingInspector =
+            object : FlingBehavior {
+                override suspend fun ScrollScope.performFling(initialVelocity: Float): Float {
+                    flingTriggered = true
+                    return with(defaultFlingBehavior) { performFling(initialVelocity) }
                 }
             }
-        }
         createPager(pageCount = { DefaultPageCount }) {
             LazyList(
                 modifier = Modifier.fillMaxSize(),
@@ -139,9 +134,7 @@
                 horizontalAlignment = Alignment.Start
             ) {
                 items(10) {
-                    Box(modifier = Modifier.size(100.dp)) {
-                        BasicText(text = it.toString())
-                    }
+                    Box(modifier = Modifier.size(100.dp)) { BasicText(text = it.toString()) }
                 }
             }
         }
@@ -167,21 +160,25 @@
         // Arrange
         var scrollAvailable = Offset.Zero
         var postFlingVelocity = Velocity.Zero
-        val dataCapturingConnection = object : NestedScrollConnection {
-            override fun onPostScroll(
-                consumed: Offset,
-                available: Offset,
-                source: NestedScrollSource
-            ): Offset {
-                scrollAvailable += available
-                return Offset.Zero
-            }
+        val dataCapturingConnection =
+            object : NestedScrollConnection {
+                override fun onPostScroll(
+                    consumed: Offset,
+                    available: Offset,
+                    source: NestedScrollSource
+                ): Offset {
+                    scrollAvailable += available
+                    return Offset.Zero
+                }
 
-            override suspend fun onPostFling(consumed: Velocity, available: Velocity): Velocity {
-                postFlingVelocity = available
-                return Velocity.Zero
+                override suspend fun onPostFling(
+                    consumed: Velocity,
+                    available: Velocity
+                ): Velocity {
+                    postFlingVelocity = available
+                    return Velocity.Zero
+                }
             }
-        }
         createPager(
             pageCount = { DefaultPageCount },
             nestedScrollConnection = dataCapturingConnection
@@ -200,9 +197,7 @@
                 horizontalAlignment = Alignment.Start
             ) {
                 items(10) {
-                    Box(modifier = Modifier.size(100.dp)) {
-                        BasicText(text = it.toString())
-                    }
+                    Box(modifier = Modifier.size(100.dp)) { BasicText(text = it.toString()) }
                 }
             }
         }
@@ -246,9 +241,7 @@
                 horizontalAlignment = Alignment.Start
             ) {
                 items(10) {
-                    Box(modifier = Modifier.size(100.dp)) {
-                        BasicText(text = it.toString())
-                    }
+                    Box(modifier = Modifier.size(100.dp)) { BasicText(text = it.toString()) }
                 }
             }
         }
@@ -265,11 +258,7 @@
         assertThat(pagerState.currentPageOffsetFraction).isEqualTo(0f)
 
         // reset inner list
-        rule.runOnIdle {
-            runBlocking {
-                lazyListState.scrollToItem(0)
-            }
-        }
+        rule.runOnIdle { runBlocking { lazyListState.scrollToItem(0) } }
 
         // Act: Scroll More than Half an Item
         val backwardDelta = pagerSize * 0.6f * scrollForwardSign.toFloat() * -1f
@@ -305,9 +294,7 @@
                 horizontalAlignment = Alignment.Start
             ) {
                 items(10) {
-                    Box(modifier = Modifier.size(100.dp)) {
-                        BasicText(text = it.toString())
-                    }
+                    Box(modifier = Modifier.size(100.dp)) { BasicText(text = it.toString()) }
                 }
             }
         }
@@ -324,9 +311,8 @@
         // Assert: Inner list won't consume scroll and pager moved
         rule.runOnIdle {
             assertThat(abs(pagerState.currentPageOffsetFraction - 0.4f)).isLessThan(0.001f)
-            assertThat(
-                lazyListState.firstVisibleItemScrollOffset
-            ).isEqualTo(firstLazyListItemOffset)
+            assertThat(lazyListState.firstVisibleItemScrollOffset)
+                .isEqualTo(firstLazyListItemOffset)
             assertThat(lazyListState.firstVisibleItemIndex).isEqualTo(firstLazyListItem)
         }
         rule.onNodeWithTag(TestTag).performTouchInput {
@@ -339,15 +325,12 @@
         // assert: pager moved, but list is still at 0 after direction change
         rule.runOnIdle {
             assertThat(abs(pagerState.currentPageOffsetFraction - 0.2f)).isLessThan(0.001f)
-            assertThat(
-                lazyListState.firstVisibleItemScrollOffset
-            ).isEqualTo(firstLazyListItemOffset)
+            assertThat(lazyListState.firstVisibleItemScrollOffset)
+                .isEqualTo(firstLazyListItemOffset)
             assertThat(lazyListState.firstVisibleItemIndex).isEqualTo(firstLazyListItem)
         }
 
-        rule.onNodeWithTag(TestTag).performTouchInput {
-            up()
-        }
+        rule.onNodeWithTag(TestTag).performTouchInput { up() }
     }
 
     @OptIn(ExperimentalFoundationApi::class)
@@ -359,9 +342,7 @@
         createPager(pageCount = { DefaultPageCount }) { page ->
             touchSlop = LocalViewConfiguration.current.touchSlop
             LazyList(
-                modifier = Modifier
-                    .fillMaxSize()
-                    .testTag("InnerListPage$page"),
+                modifier = Modifier.fillMaxSize().testTag("InnerListPage$page"),
                 contentPadding = PaddingValues(0.dp),
                 flingBehavior = ScrollableDefaults.flingBehavior(),
                 isVertical = !vertical, // scrollable content on opposite direction of pager
@@ -374,9 +355,7 @@
                 horizontalAlignment = Alignment.Start
             ) {
                 items(10) {
-                    Box(modifier = Modifier.size(100.dp)) {
-                        BasicText(text = it.toString())
-                    }
+                    Box(modifier = Modifier.size(100.dp)) { BasicText(text = it.toString()) }
                 }
             }
         }
@@ -394,9 +373,8 @@
         // Assert: Inner list won't consume scroll and pager moved
         rule.runOnIdle {
             assertThat(abs(pagerState.currentPageOffsetFraction)).isLessThan(0.001f)
-            assertThat(
-                lazyListState.firstVisibleItemScrollOffset
-            ).isEqualTo(firstLazyListItemOffset)
+            assertThat(lazyListState.firstVisibleItemScrollOffset)
+                .isEqualTo(firstLazyListItemOffset)
             assertThat(lazyListState.firstVisibleItemIndex).isEqualTo(firstLazyListItem)
         }
 
@@ -411,9 +389,7 @@
         }
 
         // assert: pager did not move
-        rule.runOnIdle {
-            assertThat(abs(pagerState.currentPageOffsetFraction)).isLessThan(0.001f)
-        }
+        rule.runOnIdle { assertThat(abs(pagerState.currentPageOffsetFraction)).isLessThan(0.001f) }
     }
 
     @Test
@@ -424,19 +400,20 @@
         val focusItems = mutableSetOf<String>()
         val rowColumnContent: @Composable (Int) -> Unit = { page ->
             repeat(DefaultPageCount) { item ->
-                val columnFocusRequester = FocusRequester().apply {
-                    if (item == 3 && page == 5) innerListFocusRequester = this
-                }
+                val columnFocusRequester =
+                    FocusRequester().apply {
+                        if (item == 3 && page == 5) innerListFocusRequester = this
+                    }
                 Box(
-                    modifier = Modifier
-                        .focusRequester(columnFocusRequester)
-                        .onFocusChanged {
-                            if (it.isFocused) {
-                                focusItems.add("page=$page-item=$item")
+                    modifier =
+                        Modifier.focusRequester(columnFocusRequester)
+                            .onFocusChanged {
+                                if (it.isFocused) {
+                                    focusItems.add("page=$page-item=$item")
+                                }
                             }
-                        }
-                        .size(150.dp)
-                        .focusable(),
+                            .size(150.dp)
+                            .focusable(),
                     contentAlignment = Alignment.Center
                 ) {
                     BasicText(text = "page=$page-item=$item")
@@ -447,27 +424,17 @@
             modifier = Modifier.fillMaxSize(),
             pageCount = { DefaultPageCount },
             initialPage = 3,
-            pageSize = { PageSize.Fixed(100.dp) }) { page ->
-            val focusRequester = FocusRequester().apply {
-                if (page == 5) pagerFocusRequester = this
-            }
+            pageSize = { PageSize.Fixed(100.dp) }
+        ) { page ->
+            val focusRequester =
+                FocusRequester().apply { if (page == 5) pagerFocusRequester = this }
             val rowColumnModifier =
-                Modifier
-                    .focusRequester(focusRequester)
-                    .verticalScroll(rememberScrollState())
+                Modifier.focusRequester(focusRequester).verticalScroll(rememberScrollState())
 
             if (vertical) {
-                Row(
-                    modifier = rowColumnModifier
-                ) {
-                    rowColumnContent(page)
-                }
+                Row(modifier = rowColumnModifier) { rowColumnContent(page) }
             } else {
-                Column(
-                    modifier = rowColumnModifier
-                ) {
-                    rowColumnContent(page)
-                }
+                Column(modifier = rowColumnModifier) { rowColumnContent(page) }
             }
         }
 
@@ -475,9 +442,7 @@
         rule.runOnIdle { pagerFocusRequester.requestFocus() }
 
         // Assert: Check we're settled.
-        rule.runOnIdle {
-            assertThat(pagerState.currentPageOffsetFraction).isEqualTo(0.0f)
-        }
+        rule.runOnIdle { assertThat(pagerState.currentPageOffsetFraction).isEqualTo(0.0f) }
 
         // Act: Focus scroll inner scrollable
         rule.runOnIdle { innerListFocusRequester.requestFocus() }
@@ -535,18 +500,11 @@
             initialPage = 3
         ) { page ->
             val focusRequester = remember {
-                FocusRequester().apply {
-                    if (page == 5) pagerFocusRequester = this
-                }
+                FocusRequester().apply { if (page == 5) pagerFocusRequester = this }
             }
 
             Box(modifier = Modifier.fillMaxSize(), contentAlignment = Alignment.Center) {
-                Box(
-                    modifier = Modifier
-                        .size(64.dp)
-                        .focusRequester(focusRequester)
-                        .focusable()
-                )
+                Box(modifier = Modifier.size(64.dp).focusRequester(focusRequester).focusable())
             }
         }
 
@@ -555,20 +513,14 @@
         assertThat(pagerState.currentPage).isEqualTo(3)
 
         // Scroll to a page
-        rule.runOnIdle {
-            scope.launch {
-                pagerState.scrollToPage(5)
-            }
-        }
+        rule.runOnIdle { scope.launch { pagerState.scrollToPage(5) } }
 
         // Assert: Pager is settled
         assertThat(pagerState.currentPageOffsetFraction).isEqualTo(0.0f)
         assertThat(pagerState.currentPage).isEqualTo(5)
 
         // Act: Request focus.
-        rule.runOnIdle {
-            pagerFocusRequester.requestFocus()
-        }
+        rule.runOnIdle { pagerFocusRequester.requestFocus() }
 
         // Assert: Pager is settled
         rule.runOnIdle {
@@ -578,9 +530,7 @@
     }
 
     companion object {
-        @JvmStatic
-        @Parameterized.Parameters(name = "{0}")
-        fun params() = AllOrientationsParams
+        @JvmStatic @Parameterized.Parameters(name = "{0}") fun params() = AllOrientationsParams
     }
 }
 
diff --git a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/pager/PagerOffscreenPageLimitPlacingTest.kt b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/pager/PagerOffscreenPageLimitPlacingTest.kt
index c25d9cf..17b7c16 100644
--- a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/pager/PagerOffscreenPageLimitPlacingTest.kt
+++ b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/pager/PagerOffscreenPageLimitPlacingTest.kt
@@ -41,192 +41,198 @@
     }
 
     @Test
-    fun offscreenPageLimitIsUsed_shouldPlaceMoreItemsThanVisibleOnesAsWeScroll() = with(rule) {
-        // Arrange
-        setContent {
-            ParameterizedPager(
-                pageCount = { DefaultPageCount },
-                modifier = Modifier.fillMaxSize(),
-                beyondViewportPageCount = 1,
-                orientation = it.orientation,
-                pageSpacing = it.pageSpacing,
-                contentPadding = it.mainAxisContentPadding
-            )
-        }
+    fun offscreenPageLimitIsUsed_shouldPlaceMoreItemsThanVisibleOnesAsWeScroll() =
+        with(rule) {
+            // Arrange
+            setContent {
+                ParameterizedPager(
+                    pageCount = { DefaultPageCount },
+                    modifier = Modifier.fillMaxSize(),
+                    beyondViewportPageCount = 1,
+                    orientation = it.orientation,
+                    pageSpacing = it.pageSpacing,
+                    contentPadding = it.mainAxisContentPadding
+                )
+            }
 
-        forEachParameter(ParamsToTest) { param ->
-            runBlocking {
-                val delta = pagerSize * 1.4f * param.scrollForwardSign
+            forEachParameter(ParamsToTest) { param ->
+                runBlocking {
+                    val delta = pagerSize * 1.4f * param.scrollForwardSign
 
-                repeat(DefaultAnimationRepetition) {
-                    // Act
-                    onPager().performTouchInput {
-                        with(param) {
-                            swipeWithVelocityAcrossMainAxis(0f, delta)
+                    repeat(DefaultAnimationRepetition) {
+                        // Act
+                        onPager().performTouchInput {
+                            with(param) { swipeWithVelocityAcrossMainAxis(0f, delta) }
+                        }
+
+                        // Next page was placed
+                        rule.runOnIdle {
+                            Truth.assertThat(placed)
+                                .contains(
+                                    (pagerState.currentPage + 1).coerceAtMost(DefaultPageCount - 1)
+                                )
                         }
                     }
 
-                    // Next page was placed
-                    rule.runOnIdle {
-                        Truth.assertThat(placed).contains(
-                            (pagerState.currentPage + 1)
-                                .coerceAtMost(DefaultPageCount - 1)
-                        )
+                    param.confirmPageIsInCorrectPosition(pagerState.currentPage)
+                    resetTestCase()
+                }
+            }
+        }
+
+    @Test
+    fun offscreenPageLimitIsUsed_shouldPlaceMoreItemsThanVisibleOnes() =
+        with(rule) {
+            // Arrange
+            val initialIndex = 5
+
+            // Act
+            setContent {
+                ParameterizedPager(
+                    initialPage = initialIndex,
+                    pageCount = { DefaultPageCount },
+                    modifier = Modifier.fillMaxSize(),
+                    beyondViewportPageCount = 2,
+                    orientation = it.orientation,
+                    pageSpacing = it.pageSpacing,
+                    contentPadding = it.mainAxisContentPadding
+                )
+            }
+
+            forEachParameter(ParamsToTest) { param ->
+                val firstVisible = pagerState.layoutInfo.visiblePagesInfo.first().index
+                val lastVisible = pagerState.layoutInfo.visiblePagesInfo.last().index
+                // Assert
+                runOnIdle {
+                    Truth.assertThat(placed).contains(firstVisible - 2)
+                    Truth.assertThat(placed).contains(firstVisible - 1)
+                    Truth.assertThat(placed).contains(lastVisible + 1)
+                    Truth.assertThat(placed).contains(lastVisible + 2)
+                }
+                param.confirmPageIsInCorrectPosition(initialIndex, firstVisible - 2)
+                param.confirmPageIsInCorrectPosition(initialIndex, firstVisible - 1)
+                param.confirmPageIsInCorrectPosition(initialIndex, lastVisible + 1)
+                param.confirmPageIsInCorrectPosition(initialIndex, lastVisible + 2)
+                runBlocking { resetTestCase(5) }
+            }
+        }
+
+    @Test
+    fun offscreenPageLimitIsNotUsed_shouldNotPlaceMoreItemsThanVisibleOnes() =
+        with(rule) {
+            // Arrange
+            // Act
+            setContent {
+                ParameterizedPager(
+                    initialPage = 5,
+                    pageCount = { DefaultPageCount },
+                    modifier = Modifier.fillMaxSize(),
+                    beyondViewportPageCount = 0,
+                    orientation = it.orientation,
+                    pageSpacing = it.pageSpacing,
+                    contentPadding = it.mainAxisContentPadding
+                )
+            }
+
+            forEachParameter(ParamsToTest) { param ->
+                // Assert
+                val firstVisible = pagerState.layoutInfo.visiblePagesInfo.first().index
+                val lastVisible = pagerState.layoutInfo.visiblePagesInfo.last().index
+                Truth.assertThat(placed).doesNotContain(firstVisible - 1)
+                Truth.assertThat(placed).contains(5)
+                Truth.assertThat(placed).doesNotContain(lastVisible + 1)
+                param.confirmPageIsInCorrectPosition(5)
+                runBlocking { resetTestCase(5) }
+            }
+        }
+
+    @Test
+    fun offsetPageLimitIsUsed_visiblePagesDidNotChange_shouldNotRemeasure() =
+        with(rule) {
+            val pageSizePx = 100
+            val pageSizeDp = with(rule.density) { pageSizePx.toDp() }
+
+            val delta = (pageSizePx / 3f).roundToInt()
+            val initialIndex = 0
+            setContent {
+                ParameterizedPager(
+                    initialPage = initialIndex,
+                    pageCount = { DefaultPageCount },
+                    modifier = Modifier.size(pageSizeDp * 1.5f),
+                    pageSize = PageSize.Fixed(pageSizeDp),
+                    beyondViewportPageCount = it.beyondViewportPageCount,
+                    orientation = it.orientation,
+                    pageSpacing = it.pageSpacing
+                )
+            }
+
+            val Params =
+                mutableListOf<SingleParamConfig>().apply {
+                    for (orientation in TestOrientation) {
+                        for (pageSpacing in TestPageSpacing) {
+                            add(
+                                SingleParamConfig(
+                                    orientation = orientation,
+                                    pageSpacing = pageSpacing,
+                                    beyondViewportPageCount = 2
+                                )
+                            )
+                        }
                     }
                 }
 
-                param.confirmPageIsInCorrectPosition(pagerState.currentPage)
-                resetTestCase()
-            }
-        }
-    }
-
-    @Test
-    fun offscreenPageLimitIsUsed_shouldPlaceMoreItemsThanVisibleOnes() = with(rule) {
-        // Arrange
-        val initialIndex = 5
-
-        // Act
-        setContent {
-            ParameterizedPager(
-                initialPage = initialIndex,
-                pageCount = { DefaultPageCount },
-                modifier = Modifier.fillMaxSize(),
-                beyondViewportPageCount = 2,
-                orientation = it.orientation,
-                pageSpacing = it.pageSpacing,
-                contentPadding = it.mainAxisContentPadding
-            )
-        }
-
-        forEachParameter(ParamsToTest) { param ->
-            val firstVisible = pagerState.layoutInfo.visiblePagesInfo.first().index
-            val lastVisible = pagerState.layoutInfo.visiblePagesInfo.last().index
-            // Assert
-            runOnIdle {
-                Truth.assertThat(placed).contains(firstVisible - 2)
-                Truth.assertThat(placed).contains(firstVisible - 1)
-                Truth.assertThat(placed).contains(lastVisible + 1)
-                Truth.assertThat(placed).contains(lastVisible + 2)
-            }
-            param.confirmPageIsInCorrectPosition(initialIndex, firstVisible - 2)
-            param.confirmPageIsInCorrectPosition(initialIndex, firstVisible - 1)
-            param.confirmPageIsInCorrectPosition(initialIndex, lastVisible + 1)
-            param.confirmPageIsInCorrectPosition(initialIndex, lastVisible + 2)
-            runBlocking { resetTestCase(5) }
-        }
-    }
-
-    @Test
-    fun offscreenPageLimitIsNotUsed_shouldNotPlaceMoreItemsThanVisibleOnes() = with(rule) {
-        // Arrange
-        // Act
-        setContent {
-            ParameterizedPager(
-                initialPage = 5,
-                pageCount = { DefaultPageCount },
-                modifier = Modifier.fillMaxSize(),
-                beyondViewportPageCount = 0,
-                orientation = it.orientation,
-                pageSpacing = it.pageSpacing,
-                contentPadding = it.mainAxisContentPadding
-            )
-        }
-
-        forEachParameter(ParamsToTest) { param ->
-            // Assert
-            val firstVisible = pagerState.layoutInfo.visiblePagesInfo.first().index
-            val lastVisible = pagerState.layoutInfo.visiblePagesInfo.last().index
-            Truth.assertThat(placed).doesNotContain(firstVisible - 1)
-            Truth.assertThat(placed).contains(5)
-            Truth.assertThat(placed).doesNotContain(lastVisible + 1)
-            param.confirmPageIsInCorrectPosition(5)
-            runBlocking { resetTestCase(5) }
-        }
-    }
-
-    @Test
-    fun offsetPageLimitIsUsed_visiblePagesDidNotChange_shouldNotRemeasure() = with(rule) {
-        val pageSizePx = 100
-        val pageSizeDp = with(rule.density) { pageSizePx.toDp() }
-
-        val delta = (pageSizePx / 3f).roundToInt()
-        val initialIndex = 0
-        setContent {
-            ParameterizedPager(
-                initialPage = initialIndex,
-                pageCount = { DefaultPageCount },
-                modifier = Modifier.size(pageSizeDp * 1.5f),
-                pageSize = PageSize.Fixed(pageSizeDp),
-                beyondViewportPageCount = it.beyondViewportPageCount,
-                orientation = it.orientation,
-                pageSpacing = it.pageSpacing
-            )
-        }
-
-        val Params = mutableListOf<SingleParamConfig>().apply {
-            for (orientation in TestOrientation) {
-                for (pageSpacing in TestPageSpacing) {
-                    add(SingleParamConfig(
-                        orientation = orientation,
-                        pageSpacing = pageSpacing,
-                        beyondViewportPageCount = 2
-                    ))
-                }
-            }
-        }
-
-        forEachParameter(Params) { param ->
-            val lastVisible = pagerState.layoutInfo.visiblePagesInfo.last().index
-            // Assert
-            rule.runOnIdle {
-                Truth.assertThat(placed).contains(lastVisible + 1)
-                Truth.assertThat(placed).contains(lastVisible + 2)
-            }
-            val previousNumberOfRemeasurementPasses = pagerState.layoutWithMeasurement
-            runBlocking {
-                withContext(Dispatchers.Main + AutoTestFrameClock()) {
-                    // small enough scroll to not cause any new items to be composed or
-                    // old ones disposed.
-                    pagerState.scrollBy(delta.toFloat())
-                }
+            forEachParameter(Params) { param ->
+                val lastVisible = pagerState.layoutInfo.visiblePagesInfo.last().index
+                // Assert
                 rule.runOnIdle {
-                    Truth.assertThat(pagerState.firstVisiblePageOffset).isEqualTo(delta)
-                    Truth.assertThat(pagerState.layoutWithMeasurement)
-                        .isEqualTo(previousNumberOfRemeasurementPasses)
+                    Truth.assertThat(placed).contains(lastVisible + 1)
+                    Truth.assertThat(placed).contains(lastVisible + 2)
                 }
+                val previousNumberOfRemeasurementPasses = pagerState.layoutWithMeasurement
+                runBlocking {
+                    withContext(Dispatchers.Main + AutoTestFrameClock()) {
+                        // small enough scroll to not cause any new items to be composed or
+                        // old ones disposed.
+                        pagerState.scrollBy(delta.toFloat())
+                    }
+                    rule.runOnIdle {
+                        Truth.assertThat(pagerState.firstVisiblePageOffset).isEqualTo(delta)
+                        Truth.assertThat(pagerState.layoutWithMeasurement)
+                            .isEqualTo(previousNumberOfRemeasurementPasses)
+                    }
 
-                // verify that out of bounds pages are correctly placed
-                param.confirmPageIsInCorrectPosition(
-                    pagerState.currentPage,
-                    lastVisible + 1,
-                    pagerState.currentPageOffsetFraction
-                )
-                param.confirmPageIsInCorrectPosition(
-                    pagerState.currentPage,
-                    lastVisible + 2,
-                    pagerState.currentPageOffsetFraction
-                )
-                resetTestCase(initialIndex)
+                    // verify that out of bounds pages are correctly placed
+                    param.confirmPageIsInCorrectPosition(
+                        pagerState.currentPage,
+                        lastVisible + 1,
+                        pagerState.currentPageOffsetFraction
+                    )
+                    param.confirmPageIsInCorrectPosition(
+                        pagerState.currentPage,
+                        lastVisible + 2,
+                        pagerState.currentPageOffsetFraction
+                    )
+                    resetTestCase(initialIndex)
+                }
             }
         }
-    }
 
     companion object {
-        val ParamsToTest = mutableListOf<SingleParamConfig>().apply {
-            for (orientation in TestOrientation) {
-                for (pageSpacing in TestPageSpacing) {
-                    for (contentPadding in testContentPaddings(orientation)) {
-                        add(
-                            SingleParamConfig(
-                                orientation = orientation,
-                                pageSpacing = pageSpacing,
-                                mainAxisContentPadding = contentPadding
+        val ParamsToTest =
+            mutableListOf<SingleParamConfig>().apply {
+                for (orientation in TestOrientation) {
+                    for (pageSpacing in TestPageSpacing) {
+                        for (contentPadding in testContentPaddings(orientation)) {
+                            add(
+                                SingleParamConfig(
+                                    orientation = orientation,
+                                    pageSpacing = pageSpacing,
+                                    mainAxisContentPadding = contentPadding
+                                )
                             )
-                        )
+                        }
                     }
                 }
             }
-        }
     }
 }
diff --git a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/pager/PagerPinnableContainerTest.kt b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/pager/PagerPinnableContainerTest.kt
index 762f095..314820a 100644
--- a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/pager/PagerPinnableContainerTest.kt
+++ b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/pager/PagerPinnableContainerTest.kt
@@ -52,8 +52,7 @@
 @MediumTest
 class PagerPinnableContainerTest {
 
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
     private var pinnableContainer: PinnableContainer? = null
 
@@ -69,18 +68,10 @@
 
     @Composable
     fun PageWithEffect(index: Int) {
-        Box(
-            Modifier
-                .size(pageSizeDp)
-                .padding(2.dp)
-                .background(Color.Black)
-                .testTag("$index")
-        )
+        Box(Modifier.size(pageSizeDp).padding(2.dp).background(Color.Black).testTag("$index"))
         DisposableEffect(index) {
             composed.add(index)
-            onDispose {
-                composed.remove(index)
-            }
+            onDispose { composed.remove(index) }
         }
     }
 
@@ -100,15 +91,11 @@
             }
         }
 
-        rule.runOnIdle {
-            requireNotNull(pinnableContainer).pin()
-        }
+        rule.runOnIdle { requireNotNull(pinnableContainer).pin() }
 
         rule.runOnIdle {
             assertThat(composed).contains(1)
-            runBlocking {
-                pagerState.scrollToPage(3)
-            }
+            runBlocking { pagerState.scrollToPage(3) }
         }
 
         rule.waitUntil {
@@ -121,10 +108,7 @@
             assertThat(composed).contains(1)
         }
 
-        rule.onNodeWithTag("1")
-            .assertExists()
-            .assertIsNotDisplayed()
-            .assertIsPlaced()
+        rule.onNodeWithTag("1").assertExists().assertIsNotDisplayed().assertIsPlaced()
     }
 
     @Test
@@ -143,15 +127,9 @@
             }
         }
 
-        rule.runOnIdle {
-            requireNotNull(pinnableContainer).pin()
-        }
+        rule.runOnIdle { requireNotNull(pinnableContainer).pin() }
 
-        rule.runOnIdle {
-            runBlocking {
-                pagerState.scrollToPage(4)
-            }
-        }
+        rule.runOnIdle { runBlocking { pagerState.scrollToPage(4) } }
 
         rule.waitUntil {
             // not visible pages were disposed
@@ -183,11 +161,7 @@
             }
         }
 
-        rule.runOnIdle {
-            runBlocking {
-                pagerState.scrollToPage(4)
-            }
-        }
+        rule.runOnIdle { runBlocking { pagerState.scrollToPage(4) } }
 
         rule.waitUntil {
             // wait for not visible pages to be disposed
@@ -199,11 +173,7 @@
             assertThat(composed).contains(5)
         }
 
-        rule.runOnIdle {
-            runBlocking {
-                pagerState.scrollToPage(0)
-            }
-        }
+        rule.runOnIdle { runBlocking { pagerState.scrollToPage(0) } }
 
         rule.waitUntil {
             // wait for not visible pages to be disposed
@@ -236,50 +206,37 @@
             }
         }
 
-        val handle = rule.runOnIdle {
-            requireNotNull(pinnableContainer).pin()
-        }
+        val handle = rule.runOnIdle { requireNotNull(pinnableContainer).pin() }
 
-        rule.runOnIdle {
-            runBlocking {
-                pagerState.scrollToPage(3)
-            }
-        }
+        rule.runOnIdle { runBlocking { pagerState.scrollToPage(3) } }
 
         rule.waitUntil {
             // wait for not visible pages to be disposed
             !composed.contains(0)
         }
 
-        rule.runOnIdle {
-            handle.release()
-        }
+        rule.runOnIdle { handle.release() }
 
         rule.waitUntil {
             // wait for unpinned page to be disposed
             !composed.contains(1)
         }
 
-        rule.onNodeWithTag("1")
-            .assertIsNotPlaced()
+        rule.onNodeWithTag("1").assertIsNotPlaced()
     }
 
     @Test
     fun pinnedPageIsStillPinnedWhenReorderedAndNotVisibleAnymore() {
         var list by mutableStateOf(listOf(0, 1, 2, 3, 4))
         // Arrange.
-        rule.setContent {
-            Pager(list, 2, 3)
-        }
+        rule.setContent { Pager(list, 2, 3) }
 
         rule.runOnIdle {
             assertThat(composed).containsExactly(0, 1, 2)
             requireNotNull(pinnableContainer).pin()
         }
 
-        rule.runOnIdle {
-            list = listOf(0, 3, 4, 1, 2)
-        }
+        rule.runOnIdle { list = listOf(0, 3, 4, 1, 2) }
 
         rule.waitUntil {
             // wait for not visible page to be disposed
@@ -290,8 +247,7 @@
             assertThat(composed).containsExactly(0, 3, 4, 2) // 2 is pinned
         }
 
-        rule.onNodeWithTag("2")
-            .assertIsPlaced()
+        rule.onNodeWithTag("2").assertIsPlaced()
     }
 
     @Composable
@@ -311,12 +267,10 @@
 
     @Test
     fun unpinnedWhenPagerStateChanges() {
-        var state by mutableStateOf(
-            PagerState(
-                currentPage = 2,
-                currentPageOffsetFraction = 0f,
-                pageCount = { 100 })
-        )
+        var state by
+            mutableStateOf(
+                PagerState(currentPage = 2, currentPageOffsetFraction = 0f, pageCount = { 100 })
+            )
         // Arrange.
         rule.setContent {
             HorizontalPager(
@@ -331,15 +285,11 @@
             }
         }
 
-        rule.runOnIdle {
-            requireNotNull(pinnableContainer).pin()
-        }
+        rule.runOnIdle { requireNotNull(pinnableContainer).pin() }
 
         rule.runOnIdle {
             assertThat(composed).contains(3)
-            runBlocking {
-                state.scrollToPage(0)
-            }
+            runBlocking { state.scrollToPage(0) }
         }
 
         rule.waitUntil {
@@ -349,10 +299,7 @@
 
         rule.runOnIdle {
             assertThat(composed).contains(2)
-            state = PagerState(
-                currentPage = 0,
-                currentPageOffsetFraction = 0f,
-                pageCount = { 100 })
+            state = PagerState(currentPage = 0, currentPageOffsetFraction = 0f, pageCount = { 100 })
         }
 
         rule.waitUntil {
@@ -360,18 +307,15 @@
             !composed.contains(2)
         }
 
-        rule.onNodeWithTag("2")
-            .assertIsNotPlaced()
+        rule.onNodeWithTag("2").assertIsNotPlaced()
     }
 
     @Test
     fun pinAfterPagerStateChange() {
-        var state by mutableStateOf(
-            PagerState(
-                currentPage = 0,
-                currentPageOffsetFraction = 0f,
-                pageCount = { 100 })
-        )
+        var state by
+            mutableStateOf(
+                PagerState(currentPage = 0, currentPageOffsetFraction = 0f, pageCount = { 100 })
+            )
         // Arrange.
         rule.setContent {
             HorizontalPager(
@@ -387,21 +331,14 @@
         }
 
         rule.runOnIdle {
-            state = PagerState(
-                currentPage = 0,
-                currentPageOffsetFraction = 0f,
-                pageCount = { 100 })
+            state = PagerState(currentPage = 0, currentPageOffsetFraction = 0f, pageCount = { 100 })
         }
 
-        rule.runOnIdle {
-            requireNotNull(pinnableContainer).pin()
-        }
+        rule.runOnIdle { requireNotNull(pinnableContainer).pin() }
 
         rule.runOnIdle {
             assertThat(composed).contains(1)
-            runBlocking {
-                state.scrollToPage(2)
-            }
+            runBlocking { state.scrollToPage(2) }
         }
 
         rule.waitUntil {
@@ -409,9 +346,7 @@
             !composed.contains(1)
         }
 
-        rule.runOnIdle {
-            assertThat(composed).contains(0)
-        }
+        rule.runOnIdle { assertThat(composed).contains(0) }
     }
 
     @Test
@@ -431,15 +366,11 @@
             }
         }
 
-        rule.runOnIdle {
-            requireNotNull(pinnableContainer).pin()
-        }
+        rule.runOnIdle { requireNotNull(pinnableContainer).pin() }
 
         rule.runOnIdle {
             assertThat(composed).contains(4)
-            runBlocking {
-                state.scrollToPage(6)
-            }
+            runBlocking { state.scrollToPage(6) }
         }
 
         rule.waitUntil {
@@ -447,14 +378,9 @@
             !composed.contains(4)
         }
 
-        rule.runOnIdle {
-            assertThat(composed).contains(3)
-        }
+        rule.runOnIdle { assertThat(composed).contains(3) }
 
-        rule.onNodeWithTag("3")
-            .assertExists()
-            .assertIsNotDisplayed()
-            .assertIsPlaced()
+        rule.onNodeWithTag("3").assertExists().assertIsNotDisplayed().assertIsPlaced()
     }
 
     @Test
@@ -478,9 +404,7 @@
         rule.runOnIdle {
             requireNotNull(pinnableContainer).pin()
             assertThat(composed).contains(4)
-            runBlocking {
-                state.scrollToPage(0)
-            }
+            runBlocking { state.scrollToPage(0) }
         }
 
         rule.waitUntil {
@@ -488,42 +412,32 @@
             !composed.contains(4)
         }
 
-        rule.runOnIdle {
-            pageCount = 3
-        }
+        rule.runOnIdle { pageCount = 3 }
 
         rule.waitUntil {
             // wait for pinned page to be disposed
             !composed.contains(3)
         }
 
-        rule.onNodeWithTag("3")
-            .assertIsNotPlaced()
+        rule.onNodeWithTag("3").assertIsNotPlaced()
     }
 
     @Test
     fun pinnedPageIsRemovedWhenVisible() {
         var pages by mutableStateOf(listOf(0, 1, 2))
         // Arrange.
-        rule.setContent {
-            Pager(dataset = pages, pinnedPage = 1, visiblePages = 2)
-        }
+        rule.setContent { Pager(dataset = pages, pinnedPage = 1, visiblePages = 2) }
 
-        rule.runOnIdle {
-            requireNotNull(pinnableContainer).pin()
-        }
+        rule.runOnIdle { requireNotNull(pinnableContainer).pin() }
 
-        rule.runOnIdle {
-            pages = listOf(0, 2)
-        }
+        rule.runOnIdle { pages = listOf(0, 2) }
 
         rule.waitUntil {
             // wait for pinned page to be disposed
             !composed.contains(1)
         }
 
-        rule.onNodeWithTag("1")
-            .assertIsNotPlaced()
+        rule.onNodeWithTag("1").assertIsNotPlaced()
     }
 
     @Test
@@ -552,9 +466,7 @@
             // pinned 3 times in total
             handles.add(requireNotNull(pinnableContainer).pin())
             assertThat(composed).contains(0)
-            runBlocking {
-                pagerState.scrollToPage(3)
-            }
+            runBlocking { pagerState.scrollToPage(3) }
         }
 
         rule.waitUntil {
@@ -578,12 +490,13 @@
     @Test
     fun pinningIsPropagatedToParentContainer() {
         var parentPinned = false
-        val parentContainer = object : PinnableContainer {
-            override fun pin(): PinnedHandle {
-                parentPinned = true
-                return PinnedHandle { parentPinned = false }
+        val parentContainer =
+            object : PinnableContainer {
+                override fun pin(): PinnedHandle {
+                    parentPinned = true
+                    return PinnedHandle { parentPinned = false }
+                }
             }
-        }
         // Arrange.
         rule.setContent {
             CompositionLocalProvider(LocalPinnableContainer provides parentContainer) {
@@ -597,36 +510,34 @@
             }
         }
 
-        val handle = rule.runOnIdle {
-            requireNotNull(pinnableContainer).pin()
-        }
+        val handle = rule.runOnIdle { requireNotNull(pinnableContainer).pin() }
 
         rule.runOnIdle {
             assertThat(parentPinned).isTrue()
             handle.release()
         }
 
-        rule.runOnIdle {
-            assertThat(parentPinned).isFalse()
-        }
+        rule.runOnIdle { assertThat(parentPinned).isFalse() }
     }
 
     @Test
     fun parentContainerChange_pinningIsMaintained() {
         var parent1Pinned = false
-        val parent1Container = object : PinnableContainer {
-            override fun pin(): PinnedHandle {
-                parent1Pinned = true
-                return PinnedHandle { parent1Pinned = false }
+        val parent1Container =
+            object : PinnableContainer {
+                override fun pin(): PinnedHandle {
+                    parent1Pinned = true
+                    return PinnedHandle { parent1Pinned = false }
+                }
             }
-        }
         var parent2Pinned = false
-        val parent2Container = object : PinnableContainer {
-            override fun pin(): PinnedHandle {
-                parent2Pinned = true
-                return PinnedHandle { parent2Pinned = false }
+        val parent2Container =
+            object : PinnableContainer {
+                override fun pin(): PinnedHandle {
+                    parent2Pinned = true
+                    return PinnedHandle { parent2Pinned = false }
+                }
             }
-        }
         var parentContainer by mutableStateOf<PinnableContainer>(parent1Container)
         // Arrange.
         rule.setContent {
@@ -641,9 +552,7 @@
             }
         }
 
-        rule.runOnIdle {
-            requireNotNull(pinnableContainer).pin()
-        }
+        rule.runOnIdle { requireNotNull(pinnableContainer).pin() }
 
         rule.runOnIdle {
             assertThat(parent1Pinned).isTrue()
diff --git a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/pager/PagerPrefetcherTest.kt b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/pager/PagerPrefetcherTest.kt
index f9414d3..5b9efe3 100644
--- a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/pager/PagerPrefetcherTest.kt
+++ b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/pager/PagerPrefetcherTest.kt
@@ -49,9 +49,7 @@
 @OptIn(ExperimentalFoundationApi::class)
 @LargeTest
 @RunWith(Parameterized::class)
-class PagerPrefetcherTest(
-    private val paramConfig: ParamConfig
-) : BasePagerTest(paramConfig) {
+class PagerPrefetcherTest(private val paramConfig: ParamConfig) : BasePagerTest(paramConfig) {
 
     var pageSizePx = 300
     val pageSizeDp = with(rule.density) { pageSizePx.toDp() }
@@ -62,33 +60,27 @@
     fun notPrefetchingForwardInitially() {
         composePager()
 
-        rule.onNodeWithTag("${paramConfig.beyondViewportPageCount + 2}")
-            .assertDoesNotExist()
+        rule.onNodeWithTag("${paramConfig.beyondViewportPageCount + 2}").assertDoesNotExist()
     }
 
     @Test
     fun notPrefetchingBackwardInitially() {
         composePager(initialPage = 2)
 
-        rule.onNodeWithTag("0")
-            .assertDoesNotExist()
+        rule.onNodeWithTag("0").assertDoesNotExist()
     }
 
     @Test
     fun prefetchingForwardAfterSmallScroll_programmatically() {
         composePager()
         val preFetchIndex = 2
-        rule.runOnIdle {
-            runBlocking {
-                pagerState.scrollBy(5f)
-            }
-        }
+        rule.runOnIdle { runBlocking { pagerState.scrollBy(5f) } }
 
         waitForPrefetch()
 
-        rule.onNodeWithTag("$preFetchIndex")
-            .assertExists()
-        rule.onNodeWithTag("${paramConfig.beyondViewportPageCount + preFetchIndex + 1}")
+        rule.onNodeWithTag("$preFetchIndex").assertExists()
+        rule
+            .onNodeWithTag("${paramConfig.beyondViewportPageCount + preFetchIndex + 1}")
             .assertDoesNotExist()
     }
 
@@ -97,17 +89,13 @@
         composePager(initialPage = 5, initialPageOffsetFraction = 10 / pageSizePx.toFloat())
 
         val preFetchIndex = 4
-        rule.runOnIdle {
-            runBlocking {
-                pagerState.scrollBy(-5f)
-            }
-        }
+        rule.runOnIdle { runBlocking { pagerState.scrollBy(-5f) } }
 
         waitForPrefetch()
 
-        rule.onNodeWithTag("$preFetchIndex")
-            .assertExists()
-        rule.onNodeWithTag("${preFetchIndex - paramConfig.beyondViewportPageCount - 1}")
+        rule.onNodeWithTag("$preFetchIndex").assertExists()
+        rule
+            .onNodeWithTag("${preFetchIndex - paramConfig.beyondViewportPageCount - 1}")
             .assertDoesNotExist()
     }
 
@@ -129,9 +117,9 @@
 
         waitForPrefetch()
 
-        rule.onNodeWithTag("$preFetchIndex")
-            .assertExists()
-        rule.onNodeWithTag("${paramConfig.beyondViewportPageCount + preFetchIndex + 1}")
+        rule.onNodeWithTag("$preFetchIndex").assertExists()
+        rule
+            .onNodeWithTag("${paramConfig.beyondViewportPageCount + preFetchIndex + 1}")
             .assertDoesNotExist()
     }
 
@@ -154,9 +142,9 @@
 
         waitForPrefetch()
 
-        rule.onNodeWithTag("$preFetchIndex")
-            .assertExists()
-        rule.onNodeWithTag("${preFetchIndex - paramConfig.beyondViewportPageCount - 1}")
+        rule.onNodeWithTag("$preFetchIndex").assertExists()
+        rule
+            .onNodeWithTag("${preFetchIndex - paramConfig.beyondViewportPageCount - 1}")
             .assertDoesNotExist()
     }
 
@@ -165,17 +153,13 @@
         val initialIndex = 5
         composePager(initialPage = initialIndex)
 
-        rule.runOnIdle {
-            runBlocking {
-                pagerState.scrollBy(5f)
-            }
-        }
+        rule.runOnIdle { runBlocking { pagerState.scrollBy(5f) } }
         var prefetchIndex = initialIndex + 2
         waitForPrefetch()
 
-        rule.onNodeWithTag("$prefetchIndex")
-            .assertExists()
-        rule.onNodeWithTag("${prefetchIndex - paramConfig.beyondViewportPageCount - 3}")
+        rule.onNodeWithTag("$prefetchIndex").assertExists()
+        rule
+            .onNodeWithTag("${prefetchIndex - paramConfig.beyondViewportPageCount - 3}")
             .assertDoesNotExist()
 
         rule.runOnIdle {
@@ -188,9 +172,9 @@
         prefetchIndex -= 3
         waitForPrefetch()
 
-        rule.onNodeWithTag("$prefetchIndex")
-            .assertExists()
-        rule.onNodeWithTag("${prefetchIndex + paramConfig.beyondViewportPageCount + 3}")
+        rule.onNodeWithTag("$prefetchIndex").assertExists()
+        rule
+            .onNodeWithTag("${prefetchIndex + paramConfig.beyondViewportPageCount + 3}")
             .assertDoesNotExist()
     }
 
@@ -198,11 +182,7 @@
     fun prefetchingForwardTwice() {
         composePager()
 
-        rule.runOnIdle {
-            runBlocking {
-                pagerState.scrollBy(5f)
-            }
-        }
+        rule.runOnIdle { runBlocking { pagerState.scrollBy(5f) } }
 
         waitForPrefetch()
 
@@ -217,11 +197,10 @@
 
         waitForPrefetch()
 
-        rule.onNodeWithTag("${prefetchIndex - 1}")
-            .assertIsDisplayed()
-        rule.onNodeWithTag("$prefetchIndex")
-            .assertExists()
-        rule.onNodeWithTag("${prefetchIndex + paramConfig.beyondViewportPageCount + 1}")
+        rule.onNodeWithTag("${prefetchIndex - 1}").assertIsDisplayed()
+        rule.onNodeWithTag("$prefetchIndex").assertExists()
+        rule
+            .onNodeWithTag("${prefetchIndex + paramConfig.beyondViewportPageCount + 1}")
             .assertDoesNotExist()
     }
 
@@ -231,11 +210,7 @@
 
         val preFetchIndex = 3
 
-        rule.runOnIdle {
-            runBlocking {
-                pagerState.scrollBy(-5f)
-            }
-        }
+        rule.runOnIdle { runBlocking { pagerState.scrollBy(-5f) } }
 
         waitForPrefetch()
 
@@ -248,11 +223,10 @@
 
         waitForPrefetch()
 
-        rule.onNodeWithTag("$preFetchIndex")
-            .assertIsDisplayed()
-        rule.onNodeWithTag("${preFetchIndex - 1}")
-            .assertExists()
-        rule.onNodeWithTag("${preFetchIndex - 1 - paramConfig.beyondViewportPageCount - 1}")
+        rule.onNodeWithTag("$preFetchIndex").assertIsDisplayed()
+        rule.onNodeWithTag("${preFetchIndex - 1}").assertExists()
+        rule
+            .onNodeWithTag("${preFetchIndex - 1 - paramConfig.beyondViewportPageCount - 1}")
             .assertDoesNotExist()
     }
 
@@ -261,19 +235,15 @@
         val initialIndex = 5
         composePager(initialPage = initialIndex, reverseLayout = true)
 
-        rule.runOnIdle {
-            runBlocking {
-                pagerState.scrollBy(5f)
-            }
-        }
+        rule.runOnIdle { runBlocking { pagerState.scrollBy(5f) } }
 
         var prefetchIndex = initialIndex + 2
 
         waitForPrefetch()
 
-        rule.onNodeWithTag("$prefetchIndex")
-            .assertExists()
-        rule.onNodeWithTag("${prefetchIndex - paramConfig.beyondViewportPageCount - 3}")
+        rule.onNodeWithTag("$prefetchIndex").assertExists()
+        rule
+            .onNodeWithTag("${prefetchIndex - paramConfig.beyondViewportPageCount - 3}")
             .assertDoesNotExist()
 
         rule.runOnIdle {
@@ -286,9 +256,9 @@
         prefetchIndex -= 3
         waitForPrefetch()
 
-        rule.onNodeWithTag("$prefetchIndex")
-            .assertExists()
-        rule.onNodeWithTag("${prefetchIndex + paramConfig.beyondViewportPageCount + 3}")
+        rule.onNodeWithTag("$prefetchIndex").assertExists()
+        rule
+            .onNodeWithTag("${prefetchIndex + paramConfig.beyondViewportPageCount + 3}")
             .assertDoesNotExist()
     }
 
@@ -302,42 +272,32 @@
             contentPadding = PaddingValues(mainAxis = halfItemSize)
         )
 
-        rule.onNodeWithTag("${initialIndex - 1}")
-            .assertIsDisplayed()
-        rule.onNodeWithTag("$initialIndex")
-            .assertIsDisplayed()
-        rule.onNodeWithTag("${initialIndex + 1}")
-            .assertIsDisplayed()
-        rule.onNodeWithTag("${initialIndex - paramConfig.beyondViewportPageCount - 2}")
+        rule.onNodeWithTag("${initialIndex - 1}").assertIsDisplayed()
+        rule.onNodeWithTag("$initialIndex").assertIsDisplayed()
+        rule.onNodeWithTag("${initialIndex + 1}").assertIsDisplayed()
+        rule
+            .onNodeWithTag("${initialIndex - paramConfig.beyondViewportPageCount - 2}")
             .assertDoesNotExist()
-        rule.onNodeWithTag("${initialIndex + paramConfig.beyondViewportPageCount + 2}")
+        rule
+            .onNodeWithTag("${initialIndex + paramConfig.beyondViewportPageCount + 2}")
             .assertDoesNotExist()
 
-        rule.runOnIdle {
-            runBlocking {
-                pagerState.scrollBy(5f)
-            }
-        }
+        rule.runOnIdle { runBlocking { pagerState.scrollBy(5f) } }
 
         var prefetchIndex = initialIndex + 1
         waitForPrefetch()
 
-        rule.onNodeWithTag("${prefetchIndex + 1}")
-            .assertExists()
-        rule.onNodeWithTag("${prefetchIndex - paramConfig.beyondViewportPageCount - 3}")
+        rule.onNodeWithTag("${prefetchIndex + 1}").assertExists()
+        rule
+            .onNodeWithTag("${prefetchIndex - paramConfig.beyondViewportPageCount - 3}")
             .assertDoesNotExist()
 
-        rule.runOnIdle {
-            runBlocking {
-                pagerState.scrollBy(-2f)
-            }
-        }
+        rule.runOnIdle { runBlocking { pagerState.scrollBy(-2f) } }
 
         prefetchIndex -= 3
         waitForPrefetch()
 
-        rule.onNodeWithTag("$prefetchIndex")
-            .assertExists()
+        rule.onNodeWithTag("$prefetchIndex").assertExists()
     }
 
     @Test
@@ -346,45 +306,42 @@
         lateinit var remeasure: Remeasurement
         rule.setContent {
             SubcomposeLayout(
-                modifier = object : RemeasurementModifier {
-                    override fun onRemeasurementAvailable(remeasurement: Remeasurement) {
-                        remeasure = remeasurement
-                    }
-                }
-            ) { constraints ->
-                val placeable = if (emit) {
-                    subcompose(Unit) {
-                        pagerState = rememberPagerState { 1000 }
-                        HorizontalOrVerticalPager(
-                            modifier = Modifier.mainAxisSize(pageSizeDp * 1.5f),
-                            state = pagerState
-                        ) {
-                            Spacer(
-                                Modifier
-                                    .mainAxisSize(pageSizeDp)
-                                    .then(
-                                        if (vertical)
-                                            Modifier.fillMaxWidth()
-                                        else
-                                            Modifier.fillMaxHeight()
-                                    )
-                            )
+                modifier =
+                    object : RemeasurementModifier {
+                        override fun onRemeasurementAvailable(remeasurement: Remeasurement) {
+                            remeasure = remeasurement
                         }
-                    }.first().measure(constraints)
-                } else {
-                    null
-                }
-                layout(constraints.maxWidth, constraints.maxHeight) {
-                    placeable?.place(0, 0)
-                }
+                    }
+            ) { constraints ->
+                val placeable =
+                    if (emit) {
+                        subcompose(Unit) {
+                                pagerState = rememberPagerState { 1000 }
+                                HorizontalOrVerticalPager(
+                                    modifier = Modifier.mainAxisSize(pageSizeDp * 1.5f),
+                                    state = pagerState
+                                ) {
+                                    Spacer(
+                                        Modifier.mainAxisSize(pageSizeDp)
+                                            .then(
+                                                if (vertical) Modifier.fillMaxWidth()
+                                                else Modifier.fillMaxHeight()
+                                            )
+                                    )
+                                }
+                            }
+                            .first()
+                            .measure(constraints)
+                    } else {
+                        null
+                    }
+                layout(constraints.maxWidth, constraints.maxHeight) { placeable?.place(0, 0) }
             }
         }
 
         rule.runOnIdle {
             // this will schedule the prefetching
-            runBlocking(AutoTestFrameClock()) {
-                pagerState.scrollBy(pageSize.toFloat())
-            }
+            runBlocking(AutoTestFrameClock()) { pagerState.scrollBy(pageSize.toFloat()) }
             // then we synchronously dispose LazyColumn
             emit = false
             remeasure.forceRemeasure()
@@ -404,14 +361,8 @@
             ) {
                 composedItems.add(it)
                 Spacer(
-                    Modifier
-                        .mainAxisSize(pageSizeDp)
-                        .then(
-                            if (vertical)
-                                Modifier.fillMaxWidth()
-                            else
-                                Modifier.fillMaxHeight()
-                        )
+                    Modifier.mainAxisSize(pageSizeDp)
+                        .then(if (vertical) Modifier.fillMaxWidth() else Modifier.fillMaxHeight())
                 )
             }
         }
@@ -433,9 +384,7 @@
         rule.waitForIdle()
         rule.waitForIdle()
 
-        rule.runOnIdle {
-            assertThat(composedItems).doesNotContain(3)
-        }
+        rule.runOnIdle { assertThat(composedItems).doesNotContain(3) }
     }
 
     @Test
@@ -467,21 +416,17 @@
             }
         }
 
-        rule.runOnIdle {
-            assertThat(activeNodes).doesNotContain(3)
-        }
+        rule.runOnIdle { assertThat(activeNodes).doesNotContain(3) }
     }
 
     private suspend fun PagerState.scrollBy(delta: Float): Float {
         val consumed = (this as ScrollableState).scrollBy(delta)
-        scroll { } // cancel fling animation
+        scroll {} // cancel fling animation
         return consumed
     }
 
     private fun waitForPrefetch() {
-        rule.runOnIdle {
-            scheduler.executeActiveRequests()
-        }
+        rule.runOnIdle { scheduler.executeActiveRequests() }
     }
 
     private val activeNodes = mutableSetOf<Int>()
@@ -515,22 +460,16 @@
             touchSlope = LocalViewConfiguration.current.touchSlop
             DisposableEffect(it) {
                 activeNodes.add(it)
-                onDispose {
-                    activeNodes.remove(it)
-                }
+                onDispose { activeNodes.remove(it) }
             }
 
             Spacer(
-                Modifier
-                    .mainAxisSize(pageSizeDp)
-                    .fillMaxCrossAxis()
-                    .testTag("$it")
-                    .layout { measurable, constraints ->
-                        val placeable = measurable.measure(constraints)
-                        layout(placeable.width, placeable.height) {
-                            placeable.place(0, 0)
-                        }
-                    }
+                Modifier.mainAxisSize(pageSizeDp).fillMaxCrossAxis().testTag("$it").layout {
+                    measurable,
+                    constraints ->
+                    val placeable = measurable.measure(constraints)
+                    layout(placeable.width, placeable.height) { placeable.place(0, 0) }
+                }
             )
         }
     }
@@ -538,11 +477,12 @@
     companion object {
         @JvmStatic
         @Parameterized.Parameters(name = "{0}")
-        fun params(): Array<Any> = arrayOf(
-            ParamConfig(Orientation.Vertical, beyondViewportPageCount = 0),
-            ParamConfig(Orientation.Vertical, beyondViewportPageCount = 1),
-            ParamConfig(Orientation.Horizontal, beyondViewportPageCount = 0),
-            ParamConfig(Orientation.Horizontal, beyondViewportPageCount = 1)
-        )
+        fun params(): Array<Any> =
+            arrayOf(
+                ParamConfig(Orientation.Vertical, beyondViewportPageCount = 0),
+                ParamConfig(Orientation.Vertical, beyondViewportPageCount = 1),
+                ParamConfig(Orientation.Horizontal, beyondViewportPageCount = 0),
+                ParamConfig(Orientation.Horizontal, beyondViewportPageCount = 1)
+            )
     }
 }
diff --git a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/pager/PagerRequestScrollTest.kt b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/pager/PagerRequestScrollTest.kt
index ea34d6e..d435f78 100644
--- a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/pager/PagerRequestScrollTest.kt
+++ b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/pager/PagerRequestScrollTest.kt
@@ -46,9 +46,7 @@
 class PagerRequestScrollTest(private val orientation: Orientation) :
     BasePagerTest(ParamConfig(orientation)) {
 
-    private val proposedPageSize = with(rule.density) {
-        100.toDp()
-    }
+    private val proposedPageSize = with(rule.density) { 100.toDp() }
 
     @Test
     fun requestScrollToPage_withIndex0_pagesPrepended_scrollsToNewCurrentPage() {
@@ -63,27 +61,22 @@
                 modifier = Modifier.size(proposedPageSize * 2.5f).testTag(PagerTestTag),
                 pageSize = PageSize.Fixed(proposedPageSize),
                 state = state,
-                key = { it }) {
+                key = { it }
+            ) {
                 Page(remember { "$it" })
 
-                Snapshot.withoutReadObservation {
-                    state.requestScrollToPage(page = 0)
-                }
+                Snapshot.withoutReadObservation { state.requestScrollToPage(page = 0) }
             }
         }
 
         // When the list is updated by prepending from 0 to 9, such that the new list contains
         // from 0 to 15.
-        rule.runOnIdle {
-            list = (0..15).toList()
-        }
+        rule.runOnIdle { list = (0..15).toList() }
 
         // Then we are scrolled to the start where the visible pages are 0, 1, and 2.
         rule.runOnIdle {
             Truth.assertThat(state.currentPage).isEqualTo(0)
-            Truth.assertThat(
-                state.visibleKeys
-            ).isEqualTo(listOf(0, 1, 2))
+            Truth.assertThat(state.visibleKeys).isEqualTo(listOf(0, 1, 2))
         }
     }
 
@@ -109,10 +102,7 @@
             fun TestContent(list: List<Int>) {
                 state = rememberPagerState { list.size }
                 HorizontalOrVerticalPager(
-                    modifier = Modifier
-                        .width(listSize)
-                        .height(listSize)
-                        .testTag(PagerTestTag),
+                    modifier = Modifier.width(listSize).height(listSize).testTag(PagerTestTag),
                     pageSize = PageSize.Fixed(proposedPageSize),
                     state = state,
                     reverseLayout = true,
@@ -127,9 +117,11 @@
                         // This scrolls to the start of the first page.
                         state.requestScrollToPage(
                             page = 1,
-                            pageOffsetFraction = with(rule.density) {
-                                -listSize.roundToPx() / state.pageSizeWithSpacing.toFloat()
-                            })
+                            pageOffsetFraction =
+                                with(rule.density) {
+                                    -listSize.roundToPx() / state.pageSizeWithSpacing.toFloat()
+                                }
+                        )
                     }
                 }
             }
@@ -139,9 +131,7 @@
         onPager().performScrollToIndex(0)
 
         // When the list is updated, prepending pages 0 to 2 so the list contains from 0 to 30.
-        rule.runOnIdle {
-            list = (0..30).toList()
-        }
+        rule.runOnIdle { list = (0..30).toList() }
 
         // Then the current page has index 0, its key is 0, and it's scrolled to the start
         // of that page (since we're laying out from bottom-to-top/right-to-left, we want the offset
@@ -155,9 +145,7 @@
                             state.pageSizeWithSpacing
                     )
             }
-            Truth.assertThat(
-                state.visibleKeys
-            ).isEqualTo(listOf(0))
+            Truth.assertThat(state.visibleKeys).isEqualTo(listOf(0))
         }
     }
 
@@ -184,9 +172,7 @@
                     Page(remember { "$it" })
                 }
 
-                SideEffect {
-                    state.requestScrollToPage(page = state.currentPage)
-                }
+                SideEffect { state.requestScrollToPage(page = state.currentPage) }
             }
 
             TestContent(list = list)
@@ -194,16 +180,13 @@
         onPager().performScrollToIndex(5)
 
         // When we update list of ints to move page 5 to the end of the list.
-        rule.runOnIdle {
-            list = (0..4).toList() + (6..25).toList() + listOf(5)
-        }
+        rule.runOnIdle { list = (0..4).toList() + (6..25).toList() + listOf(5) }
 
-        // Then current page is index is still 5, visible pages now (6, 7, 8) instead of (24, 25, 5).
+        // Then current page is index is still 5, visible pages now (6, 7, 8) instead of (24, 25,
+        // 5).
         rule.runOnIdle {
             Truth.assertThat(state.currentPage).isEqualTo(5)
-            Truth.assertThat(
-                state.visibleKeys
-            ).isEqualTo(listOf(6, 7, 8))
+            Truth.assertThat(state.visibleKeys).isEqualTo(listOf(6, 7, 8))
         }
     }
 
@@ -250,9 +233,7 @@
         // Then current page is index is still 15, the pages have shifted back one to (16, 17, 18).
         rule.runOnIdle {
             Truth.assertThat(state.currentPage).isEqualTo(15)
-            Truth.assertThat(
-                state.visibleKeys
-            ).isEqualTo(listOf(16, 17, 18))
+            Truth.assertThat(state.visibleKeys).isEqualTo(listOf(16, 17, 18))
         }
     }
 
@@ -269,7 +250,8 @@
                 modifier = Modifier.size(proposedPageSize * 2.5f).testTag(PagerTestTag),
                 pageSize = PageSize.Fixed(proposedPageSize),
                 state = state,
-                key = { list[it] }) {
+                key = { list[it] }
+            ) {
                 Page(remember { "$it" })
             }
         }
@@ -298,7 +280,8 @@
                 modifier = Modifier.size(proposedPageSize * 2.5f).testTag(PagerTestTag),
                 pageSize = PageSize.Fixed(proposedPageSize),
                 state = state,
-                key = { list[it] }) {
+                key = { list[it] }
+            ) {
                 Page(remember { "$it" })
             }
         }
@@ -311,8 +294,8 @@
                 // trigger a remeasure.
                 state.requestScrollToPage(
                     page = 0,
-                    pageOffsetFraction = proposedPageSize.roundToPx() * 30f /
-                        state.pageSizeWithSpacing
+                    pageOffsetFraction =
+                        proposedPageSize.roundToPx() * 30f / state.pageSizeWithSpacing
                 )
             }
         }
@@ -320,9 +303,7 @@
         // Then we are scrolled to the end where the visible pages are 28, 29, and 30.
         rule.runOnIdle {
             Truth.assertThat(state.currentPage).isEqualTo(28)
-            Truth.assertThat(
-                state.visibleKeys
-            ).isEqualTo(listOf(28, 29, 30))
+            Truth.assertThat(state.visibleKeys).isEqualTo(listOf(28, 29, 30))
         }
     }
 
@@ -340,7 +321,8 @@
                 modifier = Modifier.size(proposedPageSize).testTag(PagerTestTag),
                 pageSize = PageSize.Fixed(proposedPageSize),
                 state = state,
-                key = { it }) {
+                key = { it }
+            ) {
                 Page(remember { "$it" })
             }
         }
@@ -358,9 +340,7 @@
                 }
             }
         }
-        rule.runOnIdle {
-            state.requestScrollToPage(page = 0)
-        }
+        rule.runOnIdle { state.requestScrollToPage(page = 0) }
 
         // Then the scroll was canceled.
         rule.waitUntil { canceled }
@@ -381,7 +361,8 @@
                 modifier = Modifier.size(proposedPageSize * 2.5f).testTag(PagerTestTag),
                 pageSize = PageSize.Fixed(proposedPageSize),
                 state = state,
-                key = { list[it] }) {
+                key = { list[it] }
+            ) {
                 Page(remember { "$it" })
 
                 Snapshot.withoutReadObservation {
@@ -391,36 +372,27 @@
                 }
             }
         }
-        rule.runOnIdle {
-            list = (0..20).toList()
-        }
+        rule.runOnIdle { list = (0..20).toList() }
         onPager().performScrollToIndex(1)
 
         // When page 1 moves to the end of the list.
-        rule.runOnIdle {
-            list = listOf(0) + (2..20).toList() + listOf(1)
-        }
+        rule.runOnIdle { list = listOf(0) + (2..20).toList() + listOf(1) }
 
         // Then we are scrolled to the end where the visible pages are 19, 20, and 1.
         rule.runOnIdle {
             Truth.assertThat(state.currentPage).isEqualTo(list.size - 3)
-            Truth.assertThat(
-                state.visibleKeys
-            ).isEqualTo(listOf(19, 20, 1))
+            Truth.assertThat(state.visibleKeys).isEqualTo(listOf(19, 20, 1))
         }
     }
 
     private fun PagerState.firstVisiblePageKey() = layoutInfo.visiblePagesInfo.firstOrNull()?.key
+
     private val PagerState.visibleKeys
         get() = layoutInfo.visiblePagesInfo.map { it.key }
 
     @Composable
     private fun Page(tag: String) {
-        Spacer(
-            Modifier
-                .testTag(tag)
-                .size(proposedPageSize)
-        )
+        Spacer(Modifier.testTag(tag).size(proposedPageSize))
     }
 
     companion object {
diff --git a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/pager/PagerScrollingTest.kt b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/pager/PagerScrollingTest.kt
index ed5fa25..88ef13a 100644
--- a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/pager/PagerScrollingTest.kt
+++ b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/pager/PagerScrollingTest.kt
@@ -37,9 +37,7 @@
 class PagerScrollingTest : SingleParamBasePagerTest() {
 
     private fun resetTestCase(initialPage: Int = 0) {
-        rule.runOnIdle {
-            runBlocking { pagerState.scrollToPage(initialPage) }
-        }
+        rule.runOnIdle { runBlocking { pagerState.scrollToPage(initialPage) } }
     }
 
     @Test
@@ -62,10 +60,7 @@
                 // Act - forward
                 onPager().performTouchInput {
                     with(param) {
-                        swipeWithVelocityAcrossMainAxis(
-                            0.5f * MinFlingVelocityDp.toPx(),
-                            delta
-                        )
+                        swipeWithVelocityAcrossMainAxis(0.5f * MinFlingVelocityDp.toPx(), delta)
                     }
                 }
                 waitForIdle()
@@ -112,11 +107,12 @@
 
                 // Act - forward
                 onPager().performTouchInput {
-                    val (start, end) = if (param.orientation == Orientation.Vertical) {
-                        topCenter to topCenter.copy(y = topCenter.y + delta)
-                    } else {
-                        centerRight to centerRight.copy(x = centerRight.x - delta)
-                    }
+                    val (start, end) =
+                        if (param.orientation == Orientation.Vertical) {
+                            topCenter to topCenter.copy(y = topCenter.y + delta)
+                        } else {
+                            centerRight to centerRight.copy(x = centerRight.x - delta)
+                        }
                     swipeWithVelocity(start, end, 0.5f * MinFlingVelocityDp.toPx())
                 }
                 waitForIdle()
@@ -127,11 +123,12 @@
 
                 // Act - backward
                 onPager().performTouchInput {
-                    val (start, end) = if (param.orientation == Orientation.Vertical) {
-                        topCenter to topCenter.copy(y = topCenter.y - delta)
-                    } else {
-                        centerRight to centerRight.copy(x = centerRight.x + delta)
-                    }
+                    val (start, end) =
+                        if (param.orientation == Orientation.Vertical) {
+                            topCenter to topCenter.copy(y = topCenter.y - delta)
+                        } else {
+                            centerRight to centerRight.copy(x = centerRight.x + delta)
+                        }
                     swipeWithVelocity(start, end, 0.5f * MinFlingVelocityDp.toPx())
                 }
                 waitForIdle()
@@ -165,10 +162,7 @@
                 runAndWaitForPageSettling {
                     onPager().performTouchInput {
                         with(param) {
-                            swipeWithVelocityAcrossMainAxis(
-                                0.5f * MinFlingVelocityDp.toPx(),
-                                delta
-                            )
+                            swipeWithVelocityAcrossMainAxis(0.5f * MinFlingVelocityDp.toPx(), delta)
                         }
                     }
                 }
@@ -218,10 +212,7 @@
                 runAndWaitForPageSettling {
                     onPager().performTouchInput {
                         with(param) {
-                            swipeWithVelocityAcrossMainAxis(
-                                0.5f * MinFlingVelocityDp.toPx(),
-                                delta
-                            )
+                            swipeWithVelocityAcrossMainAxis(0.5f * MinFlingVelocityDp.toPx(), delta)
                         }
                     }
                 }
@@ -260,7 +251,6 @@
                     pageSize = PageSize.Fixed(200.dp),
                     orientation = it.orientation,
                     pageSpacing = it.pageSpacing
-
                 )
             }
 
@@ -269,10 +259,7 @@
                 // Act - forward
                 onPager().performTouchInput {
                     with(param) {
-                        swipeWithVelocityAcrossMainAxis(
-                            0.5f * MinFlingVelocityDp.toPx(),
-                            delta
-                        )
+                        swipeWithVelocityAcrossMainAxis(0.5f * MinFlingVelocityDp.toPx(), delta)
                     }
                 }
                 waitForIdle()
@@ -300,42 +287,40 @@
         }
 
     @Test
-    fun swipeWithLowVelocity_atTheEndOfTheList_shouldNotMove() = with(rule) {
-        // Arrange
-        mainClock.autoAdvance = false
-        setContent {
-            ParameterizedPager(
-                initialPage = DefaultPageCount - 1,
-                modifier = Modifier.size(125.dp),
-                pageSize = PageSize.Fixed(50.dp),
-                orientation = it.orientation,
-                pageSpacing = it.pageSpacing
-            )
-        }
+    fun swipeWithLowVelocity_atTheEndOfTheList_shouldNotMove() =
+        with(rule) {
+            // Arrange
+            mainClock.autoAdvance = false
+            setContent {
+                ParameterizedPager(
+                    initialPage = DefaultPageCount - 1,
+                    modifier = Modifier.size(125.dp),
+                    pageSize = PageSize.Fixed(50.dp),
+                    orientation = it.orientation,
+                    pageSpacing = it.pageSpacing
+                )
+            }
 
-        forEachParameter(ParamsToTest) { param ->
-            val swipeValue = 0.1f
-            val delta =
-                pagerSize * swipeValue * param.scrollForwardSign * -1 // scroll a bit at the end
+            forEachParameter(ParamsToTest) { param ->
+                val swipeValue = 0.1f
+                val delta =
+                    pagerSize * swipeValue * param.scrollForwardSign * -1 // scroll a bit at the end
 
-            // Act - forward
-            onPager().performTouchInput {
-                with(param) {
-                    swipeWithVelocityAcrossMainAxis(
-                        0.5f * MinFlingVelocityDp.toPx(),
-                        delta
-                    )
+                // Act - forward
+                onPager().performTouchInput {
+                    with(param) {
+                        swipeWithVelocityAcrossMainAxis(0.5f * MinFlingVelocityDp.toPx(), delta)
+                    }
                 }
-            }
 
-            // Assert
-            runOnIdle {
-                // page is out of snap
-                assertThat(pagerState.currentPageOffsetFraction).isNotEqualTo(0.0f)
+                // Assert
+                runOnIdle {
+                    // page is out of snap
+                    assertThat(pagerState.currentPageOffsetFraction).isNotEqualTo(0.0f)
+                }
+                resetTestCase(DefaultPageCount - 1)
             }
-            resetTestCase(DefaultPageCount - 1)
         }
-    }
 
     @Test
     fun swipeWithLowVelocity_positionalThresholdOverDefaultThreshold_shouldGoToNextPage() =
@@ -357,10 +342,7 @@
                 // Act - forward
                 onPager().performTouchInput {
                     with(param) {
-                        swipeWithVelocityAcrossMainAxis(
-                            0.5f * MinFlingVelocityDp.toPx(),
-                            delta
-                        )
+                        swipeWithVelocityAcrossMainAxis(0.5f * MinFlingVelocityDp.toPx(), delta)
                     }
                 }
                 waitForIdle()
@@ -388,54 +370,52 @@
         }
 
     @Test
-    fun swipeWithLowVelocity_positionalThresholdOverLowThreshold_shouldGoToNextPage() = with(rule) {
-        // Arrange
-        setContent {
-            ParameterizedPager(
-                initialPage = 5,
-                modifier = Modifier.fillMaxSize(),
-                snapPositionalThreshold = 0.2f,
-                orientation = it.orientation,
-                pageSpacing = it.pageSpacing
-            )
-        }
-
-        forEachParameter(ParamsToTest) { param ->
-            val swipeValue = 0.21f
-            val delta = pagerSize * swipeValue * param.scrollForwardSign
-
-            // Act - forward
-            onPager().performTouchInput {
-                with(param) {
-                    swipeWithVelocityAcrossMainAxis(
-                        0.5f * MinFlingVelocityDp.toPx(),
-                        delta
-                    )
-                }
+    fun swipeWithLowVelocity_positionalThresholdOverLowThreshold_shouldGoToNextPage() =
+        with(rule) {
+            // Arrange
+            setContent {
+                ParameterizedPager(
+                    initialPage = 5,
+                    modifier = Modifier.fillMaxSize(),
+                    snapPositionalThreshold = 0.2f,
+                    orientation = it.orientation,
+                    pageSpacing = it.pageSpacing
+                )
             }
-            waitForIdle()
 
-            // Assert
-            onNodeWithTag("6").assertIsDisplayed()
-            param.confirmPageIsInCorrectPosition(6)
+            forEachParameter(ParamsToTest) { param ->
+                val swipeValue = 0.21f
+                val delta = pagerSize * swipeValue * param.scrollForwardSign
 
-            // Act - backward
-            onPager().performTouchInput {
-                with(param) {
-                    swipeWithVelocityAcrossMainAxis(
-                        0.5f * MinFlingVelocityDp.toPx(),
-                        delta * -1
-                    )
+                // Act - forward
+                onPager().performTouchInput {
+                    with(param) {
+                        swipeWithVelocityAcrossMainAxis(0.5f * MinFlingVelocityDp.toPx(), delta)
+                    }
                 }
-            }
-            waitForIdle()
+                waitForIdle()
 
-            // Assert
-            onNodeWithTag("5").assertIsDisplayed()
-            param.confirmPageIsInCorrectPosition(5)
-            resetTestCase(5)
+                // Assert
+                onNodeWithTag("6").assertIsDisplayed()
+                param.confirmPageIsInCorrectPosition(6)
+
+                // Act - backward
+                onPager().performTouchInput {
+                    with(param) {
+                        swipeWithVelocityAcrossMainAxis(
+                            0.5f * MinFlingVelocityDp.toPx(),
+                            delta * -1
+                        )
+                    }
+                }
+                waitForIdle()
+
+                // Assert
+                onNodeWithTag("5").assertIsDisplayed()
+                param.confirmPageIsInCorrectPosition(5)
+                resetTestCase(5)
+            }
         }
-    }
 
     @Test
     fun swipeWithLowVelocity_onEdgeOfList_smallDeltas_shouldGoToClosestPage_backward() =
@@ -493,58 +473,59 @@
         }
 
     @Test
-    fun swipeWithLowVelocity_onEdgeOfList_smallDeltas_shouldGoToClosestPage_forward() = with(rule) {
-        // Arrange
-        setContent {
-            ParameterizedPager(
-                modifier = Modifier.fillMaxSize(),
-                initialPage = DefaultPageCount - 1,
-                orientation = it.orientation,
-                pageSpacing = it.pageSpacing
-            )
-        }
-        forEachParameter(ParamsToTest) { param ->
-            val delta = 10f * param.scrollForwardSign
-
-            onPager().performTouchInput {
-                down(center)
-                // series of backward delta on edge
-                moveBy(
-                    Offset(
-                        if (param.vertical) 0.0f else delta,
-                        if (param.vertical) delta else 0.0f
-                    )
+    fun swipeWithLowVelocity_onEdgeOfList_smallDeltas_shouldGoToClosestPage_forward() =
+        with(rule) {
+            // Arrange
+            setContent {
+                ParameterizedPager(
+                    modifier = Modifier.fillMaxSize(),
+                    initialPage = DefaultPageCount - 1,
+                    orientation = it.orientation,
+                    pageSpacing = it.pageSpacing
                 )
-                moveBy(
-                    Offset(
-                        if (param.vertical) 0.0f else delta,
-                        if (param.vertical) delta else 0.0f
-                    )
-                )
-                moveBy(
-                    Offset(
-                        if (param.vertical) 0.0f else delta,
-                        if (param.vertical) delta else 0.0f
-                    )
-                )
-
-                // single delta on opposite direction
-                moveBy(
-                    Offset(
-                        if (param.vertical) 0.0f else -delta,
-                        if (param.vertical) -delta else 0.0f
-                    )
-                )
-                up()
             }
-            mainClock.advanceTimeUntil { !pagerState.isScrollInProgress }
+            forEachParameter(ParamsToTest) { param ->
+                val delta = 10f * param.scrollForwardSign
 
-            // Assert
-            onNodeWithTag("${DefaultPageCount - 1}").assertIsDisplayed()
-            param.confirmPageIsInCorrectPosition(DefaultPageCount - 1)
-            resetTestCase(DefaultPageCount - 1)
+                onPager().performTouchInput {
+                    down(center)
+                    // series of backward delta on edge
+                    moveBy(
+                        Offset(
+                            if (param.vertical) 0.0f else delta,
+                            if (param.vertical) delta else 0.0f
+                        )
+                    )
+                    moveBy(
+                        Offset(
+                            if (param.vertical) 0.0f else delta,
+                            if (param.vertical) delta else 0.0f
+                        )
+                    )
+                    moveBy(
+                        Offset(
+                            if (param.vertical) 0.0f else delta,
+                            if (param.vertical) delta else 0.0f
+                        )
+                    )
+
+                    // single delta on opposite direction
+                    moveBy(
+                        Offset(
+                            if (param.vertical) 0.0f else -delta,
+                            if (param.vertical) -delta else 0.0f
+                        )
+                    )
+                    up()
+                }
+                mainClock.advanceTimeUntil { !pagerState.isScrollInProgress }
+
+                // Assert
+                onNodeWithTag("${DefaultPageCount - 1}").assertIsDisplayed()
+                param.confirmPageIsInCorrectPosition(DefaultPageCount - 1)
+                resetTestCase(DefaultPageCount - 1)
+            }
         }
-    }
 
     @Test
     fun swipeWithLowVelocity_positionalThresholdOverThreshold_customPage_shouldGoToNextPage() =
@@ -566,10 +547,7 @@
                 // Act - forward
                 onPager().performTouchInput {
                     with(param) {
-                        swipeWithVelocityAcrossMainAxis(
-                            0.5f * MinFlingVelocityDp.toPx(),
-                            delta
-                        )
+                        swipeWithVelocityAcrossMainAxis(0.5f * MinFlingVelocityDp.toPx(), delta)
                     }
                 }
                 waitForIdle()
@@ -618,10 +596,7 @@
                 runAndWaitForPageSettling {
                     onPager().performTouchInput {
                         with(param) {
-                            swipeWithVelocityAcrossMainAxis(
-                                0.5f * MinFlingVelocityDp.toPx(),
-                                delta
-                            )
+                            swipeWithVelocityAcrossMainAxis(0.5f * MinFlingVelocityDp.toPx(), delta)
                         }
                     }
                 }
@@ -650,291 +625,262 @@
         }
 
     @Test
-    fun swipeWithHighVelocity_defaultVelocityThreshold_shouldGoToNextPage() = with(rule) {
-        // Arrange
-        setContent {
-            ParameterizedPager(
-                initialPage = 5,
-                modifier = Modifier.fillMaxSize(),
-                orientation = it.orientation,
-                pageSpacing = it.pageSpacing
-            )
-        }
-        forEachParameter(ParamsToTest) { param ->
-            // make sure the scroll distance is not enough to go to next page
-            val delta = pagerSize * 0.4f * param.scrollForwardSign
+    fun swipeWithHighVelocity_defaultVelocityThreshold_shouldGoToNextPage() =
+        with(rule) {
+            // Arrange
+            setContent {
+                ParameterizedPager(
+                    initialPage = 5,
+                    modifier = Modifier.fillMaxSize(),
+                    orientation = it.orientation,
+                    pageSpacing = it.pageSpacing
+                )
+            }
+            forEachParameter(ParamsToTest) { param ->
+                // make sure the scroll distance is not enough to go to next page
+                val delta = pagerSize * 0.4f * param.scrollForwardSign
 
-            // Act - forward
-            runAndWaitForPageSettling {
-                onPager().performTouchInput {
-                    with(param) {
-                        swipeWithVelocityAcrossMainAxis(
-                            1.1f * MinFlingVelocityDp.toPx(),
-                            delta
-                        )
+                // Act - forward
+                runAndWaitForPageSettling {
+                    onPager().performTouchInput {
+                        with(param) {
+                            swipeWithVelocityAcrossMainAxis(1.1f * MinFlingVelocityDp.toPx(), delta)
+                        }
                     }
                 }
-            }
 
-            // Assert
-            onNodeWithTag("6").assertIsDisplayed()
-            param.confirmPageIsInCorrectPosition(6)
+                // Assert
+                onNodeWithTag("6").assertIsDisplayed()
+                param.confirmPageIsInCorrectPosition(6)
 
-            // Act - backward
-            runAndWaitForPageSettling {
-                onPager().performTouchInput {
-                    with(param) {
-                        swipeWithVelocityAcrossMainAxis(
-                            1.1f * MinFlingVelocityDp.toPx(),
-                            delta * -1
-                        )
+                // Act - backward
+                runAndWaitForPageSettling {
+                    onPager().performTouchInput {
+                        with(param) {
+                            swipeWithVelocityAcrossMainAxis(
+                                1.1f * MinFlingVelocityDp.toPx(),
+                                delta * -1
+                            )
+                        }
                     }
                 }
-            }
 
-            // Assert
-            onNodeWithTag("5").assertIsDisplayed()
-            param.confirmPageIsInCorrectPosition(5)
-            resetTestCase(5)
+                // Assert
+                onNodeWithTag("5").assertIsDisplayed()
+                param.confirmPageIsInCorrectPosition(5)
+                resetTestCase(5)
+            }
         }
-    }
 
     @Test
-    fun swipeWithHighVelocity_overHalfPage_shouldGoToNextPage() = with(rule) {
-        // Arrange
-        setContent {
-            ParameterizedPager(
-                initialPage = 5,
-                modifier = Modifier.fillMaxSize(),
-                orientation = it.orientation,
-                pageSpacing = it.pageSpacing
-            )
-        }
-        forEachParameter(ParamsToTest) { param ->
-            // make sure the scroll distance is not enough to go to next page
-            val delta = pagerSize * 0.8f * param.scrollForwardSign
+    fun swipeWithHighVelocity_overHalfPage_shouldGoToNextPage() =
+        with(rule) {
+            // Arrange
+            setContent {
+                ParameterizedPager(
+                    initialPage = 5,
+                    modifier = Modifier.fillMaxSize(),
+                    orientation = it.orientation,
+                    pageSpacing = it.pageSpacing
+                )
+            }
+            forEachParameter(ParamsToTest) { param ->
+                // make sure the scroll distance is not enough to go to next page
+                val delta = pagerSize * 0.8f * param.scrollForwardSign
 
-            // Act - forward
-            runAndWaitForPageSettling {
-                onPager().performTouchInput {
-                    with(param) {
-                        swipeWithVelocityAcrossMainAxis(
-                            1.1f * MinFlingVelocityDp.toPx(),
-                            delta
-                        )
+                // Act - forward
+                runAndWaitForPageSettling {
+                    onPager().performTouchInput {
+                        with(param) {
+                            swipeWithVelocityAcrossMainAxis(1.1f * MinFlingVelocityDp.toPx(), delta)
+                        }
                     }
                 }
-            }
 
-            // Assert
-            onNodeWithTag("6").assertIsDisplayed()
-            param.confirmPageIsInCorrectPosition(6)
+                // Assert
+                onNodeWithTag("6").assertIsDisplayed()
+                param.confirmPageIsInCorrectPosition(6)
 
-            // Act - backward
-            runAndWaitForPageSettling {
-                onPager().performTouchInput {
-                    with(param) {
-                        swipeWithVelocityAcrossMainAxis(
-                            1.1f * MinFlingVelocityDp.toPx(),
-                            delta * -1
-                        )
+                // Act - backward
+                runAndWaitForPageSettling {
+                    onPager().performTouchInput {
+                        with(param) {
+                            swipeWithVelocityAcrossMainAxis(
+                                1.1f * MinFlingVelocityDp.toPx(),
+                                delta * -1
+                            )
+                        }
                     }
                 }
-            }
 
-            // Assert
-            onNodeWithTag("5").assertIsDisplayed()
-            param.confirmPageIsInCorrectPosition(5)
-            resetTestCase(5)
+                // Assert
+                onNodeWithTag("5").assertIsDisplayed()
+                param.confirmPageIsInCorrectPosition(5)
+                resetTestCase(5)
+            }
         }
-    }
 
     @Test
-    fun scrollWithoutVelocity_shouldSettlingInClosestPage() = with(rule) {
-        // Arrange
-        setContent {
-            ParameterizedPager(
-                initialPage = 5,
-                modifier = Modifier.fillMaxSize(),
-                orientation = it.orientation,
-                pageSpacing = it.pageSpacing
-            )
-        }
-        forEachParameter(ParamsToTest) { param ->
-            // This will scroll 1 whole page before flinging
-            val delta = pagerSize * 1.4f * param.scrollForwardSign
+    fun scrollWithoutVelocity_shouldSettlingInClosestPage() =
+        with(rule) {
+            // Arrange
+            setContent {
+                ParameterizedPager(
+                    initialPage = 5,
+                    modifier = Modifier.fillMaxSize(),
+                    orientation = it.orientation,
+                    pageSpacing = it.pageSpacing
+                )
+            }
+            forEachParameter(ParamsToTest) { param ->
+                // This will scroll 1 whole page before flinging
+                val delta = pagerSize * 1.4f * param.scrollForwardSign
 
-            // Act - forward
-            runAndWaitForPageSettling {
-                onPager().performTouchInput {
-                    with(param) {
-                        swipeWithVelocityAcrossMainAxis(0f, delta)
+                // Act - forward
+                runAndWaitForPageSettling {
+                    onPager().performTouchInput {
+                        with(param) { swipeWithVelocityAcrossMainAxis(0f, delta) }
                     }
                 }
-            }
 
-            // Assert
-            assertThat(pagerState.currentPage).isAtMost(7)
-            onNodeWithTag("${pagerState.currentPage}").assertIsDisplayed()
-            param.confirmPageIsInCorrectPosition(pagerState.currentPage)
+                // Assert
+                assertThat(pagerState.currentPage).isAtMost(7)
+                onNodeWithTag("${pagerState.currentPage}").assertIsDisplayed()
+                param.confirmPageIsInCorrectPosition(pagerState.currentPage)
 
-            // Act - backward
-            runAndWaitForPageSettling {
-                onPager().performTouchInput {
-                    with(param) {
-                        swipeWithVelocityAcrossMainAxis(0f, delta * -1)
+                // Act - backward
+                runAndWaitForPageSettling {
+                    onPager().performTouchInput {
+                        with(param) { swipeWithVelocityAcrossMainAxis(0f, delta * -1) }
                     }
                 }
-            }
 
-            // Assert
-            assertThat(pagerState.currentPage).isAtLeast(5)
-            onNodeWithTag("${pagerState.currentPage}").assertIsDisplayed()
-            param.confirmPageIsInCorrectPosition(pagerState.currentPage)
-            resetTestCase(5)
+                // Assert
+                assertThat(pagerState.currentPage).isAtLeast(5)
+                onNodeWithTag("${pagerState.currentPage}").assertIsDisplayed()
+                param.confirmPageIsInCorrectPosition(pagerState.currentPage)
+                resetTestCase(5)
+            }
         }
-    }
 
     @Test
-    fun scrollWithSameVelocity_shouldYieldSameResult_forward() = with(rule) {
-        // Arrange
-        var initialPage = 1
-        setContent {
-            ParameterizedPager(
-                pageSize = PageSize.Fixed(200.dp),
-                initialPage = initialPage,
-                modifier = Modifier.fillMaxSize(),
-                pageCount = { 100 },
-                snappingPage = PagerSnapDistance.atMost(3),
-                orientation = it.orientation,
-                pageSpacing = it.pageSpacing
-            )
+    fun scrollWithSameVelocity_shouldYieldSameResult_forward() =
+        with(rule) {
+            // Arrange
+            var initialPage = 1
+            setContent {
+                ParameterizedPager(
+                    pageSize = PageSize.Fixed(200.dp),
+                    initialPage = initialPage,
+                    modifier = Modifier.fillMaxSize(),
+                    pageCount = { 100 },
+                    snappingPage = PagerSnapDistance.atMost(3),
+                    orientation = it.orientation,
+                    pageSpacing = it.pageSpacing
+                )
+            }
+
+            forEachParameter(ParamsToTest) { param ->
+                // This will scroll 0.5 page before flinging
+                val delta = pagerSize * 0.5f * param.scrollForwardSign
+
+                // Act - forward
+                onPager().performTouchInput {
+                    with(param) { swipeWithVelocityAcrossMainAxis(2000f, delta) }
+                }
+                waitForIdle()
+
+                val pageDisplacement = pagerState.currentPage - initialPage
+
+                // Repeat starting from different places
+                // reset
+                initialPage = 10
+                runOnIdle { runBlocking { pagerState.scrollToPage(initialPage) } }
+
+                onPager().performTouchInput {
+                    with(param) { swipeWithVelocityAcrossMainAxis(2000f, delta) }
+                }
+                waitForIdle()
+
+                assertThat(pagerState.currentPage - initialPage).isEqualTo(pageDisplacement)
+
+                initialPage = 50
+                runOnIdle { runBlocking { pagerState.scrollToPage(initialPage) } }
+
+                onPager().performTouchInput {
+                    with(param) { swipeWithVelocityAcrossMainAxis(2000f, delta) }
+                }
+                waitForIdle()
+
+                assertThat(pagerState.currentPage - initialPage).isEqualTo(pageDisplacement)
+                initialPage = 1
+                resetTestCase(initialPage)
+            }
         }
 
-        forEachParameter(ParamsToTest) { param ->
-            // This will scroll 0.5 page before flinging
-            val delta = pagerSize * 0.5f * param.scrollForwardSign
-
-            // Act - forward
-            onPager().performTouchInput {
-                with(param) {
-                    swipeWithVelocityAcrossMainAxis(2000f, delta)
-                }
-            }
-            waitForIdle()
-
-            val pageDisplacement = pagerState.currentPage - initialPage
-
-            // Repeat starting from different places
-            // reset
-            initialPage = 10
-            runOnIdle {
-                runBlocking { pagerState.scrollToPage(initialPage) }
-            }
-
-            onPager().performTouchInput {
-                with(param) {
-                    swipeWithVelocityAcrossMainAxis(2000f, delta)
-                }
-            }
-            waitForIdle()
-
-            assertThat(pagerState.currentPage - initialPage).isEqualTo(pageDisplacement)
-
-            initialPage = 50
-            runOnIdle {
-                runBlocking { pagerState.scrollToPage(initialPage) }
-            }
-
-            onPager().performTouchInput {
-                with(param) {
-                    swipeWithVelocityAcrossMainAxis(2000f, delta)
-                }
-            }
-            waitForIdle()
-
-            assertThat(pagerState.currentPage - initialPage).isEqualTo(pageDisplacement)
-            initialPage = 1
-            resetTestCase(initialPage)
-        }
-    }
-
     @Test
-    fun scrollWithSameVelocity_shouldYieldSameResult_backward() = with(rule) {
-        // Arrange
-        var initialPage = 90
-        setContent {
-            ParameterizedPager(
-                pageSize = PageSize.Fixed(200.dp),
-                initialPage = initialPage,
-                modifier = Modifier.fillMaxSize(),
-                pageCount = { 100 },
-                snappingPage = PagerSnapDistance.atMost(3),
-                orientation = it.orientation,
-                pageSpacing = it.pageSpacing
-            )
+    fun scrollWithSameVelocity_shouldYieldSameResult_backward() =
+        with(rule) {
+            // Arrange
+            var initialPage = 90
+            setContent {
+                ParameterizedPager(
+                    pageSize = PageSize.Fixed(200.dp),
+                    initialPage = initialPage,
+                    modifier = Modifier.fillMaxSize(),
+                    pageCount = { 100 },
+                    snappingPage = PagerSnapDistance.atMost(3),
+                    orientation = it.orientation,
+                    pageSpacing = it.pageSpacing
+                )
+            }
+
+            forEachParameter(ParamsToTest) { param ->
+                // This will scroll 0.5 page before flinging
+                val delta = pagerSize * -0.5f * param.scrollForwardSign
+
+                // Act - forward
+                onPager().performTouchInput {
+                    with(param) { swipeWithVelocityAcrossMainAxis(2000f, delta) }
+                }
+                waitForIdle()
+
+                val pageDisplacement = pagerState.currentPage - initialPage
+
+                // Repeat starting from different places
+                // reset
+                initialPage = 70
+                runOnIdle { runBlocking { pagerState.scrollToPage(initialPage) } }
+
+                onPager().performTouchInput {
+                    with(param) { swipeWithVelocityAcrossMainAxis(2000f, delta) }
+                }
+                waitForIdle()
+
+                assertThat(pagerState.currentPage - initialPage).isEqualTo(pageDisplacement)
+
+                initialPage = 30
+                runOnIdle { runBlocking { pagerState.scrollToPage(initialPage) } }
+
+                onPager().performTouchInput {
+                    with(param) { swipeWithVelocityAcrossMainAxis(2000f, delta) }
+                }
+                waitForIdle()
+
+                assertThat(pagerState.currentPage - initialPage).isEqualTo(pageDisplacement)
+                initialPage = 90
+                resetTestCase(initialPage)
+            }
         }
 
-        forEachParameter(ParamsToTest) { param ->
-            // This will scroll 0.5 page before flinging
-            val delta = pagerSize * -0.5f * param.scrollForwardSign
-
-            // Act - forward
-            onPager().performTouchInput {
-                with(param) {
-                    swipeWithVelocityAcrossMainAxis(2000f, delta)
-                }
-            }
-            waitForIdle()
-
-            val pageDisplacement = pagerState.currentPage - initialPage
-
-            // Repeat starting from different places
-            // reset
-            initialPage = 70
-            runOnIdle {
-                runBlocking { pagerState.scrollToPage(initialPage) }
-            }
-
-            onPager().performTouchInput {
-                with(param) {
-                    swipeWithVelocityAcrossMainAxis(2000f, delta)
-                }
-            }
-            waitForIdle()
-
-            assertThat(pagerState.currentPage - initialPage).isEqualTo(pageDisplacement)
-
-            initialPage = 30
-            runOnIdle {
-                runBlocking { pagerState.scrollToPage(initialPage) }
-            }
-
-            onPager().performTouchInput {
-                with(param) {
-                    swipeWithVelocityAcrossMainAxis(2000f, delta)
-                }
-            }
-            waitForIdle()
-
-            assertThat(pagerState.currentPage - initialPage).isEqualTo(pageDisplacement)
-            initialPage = 90
-            resetTestCase(initialPage)
-        }
-    }
-
     companion object {
-        val ParamsToTest = mutableListOf<SingleParamConfig>().apply {
-            for (orientation in TestOrientation) {
-                for (pageSpacing in TestPageSpacing) {
-                    add(
-                        SingleParamConfig(
-                            orientation = orientation,
-                            pageSpacing = pageSpacing
-                        )
-                    )
+        val ParamsToTest =
+            mutableListOf<SingleParamConfig>().apply {
+                for (orientation in TestOrientation) {
+                    for (pageSpacing in TestPageSpacing) {
+                        add(SingleParamConfig(orientation = orientation, pageSpacing = pageSpacing))
+                    }
                 }
             }
-        }
     }
 }
diff --git a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/pager/PagerSnapPositionTest.kt b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/pager/PagerSnapPositionTest.kt
index 35c36ed..324c52a 100644
--- a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/pager/PagerSnapPositionTest.kt
+++ b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/pager/PagerSnapPositionTest.kt
@@ -35,51 +35,52 @@
 class PagerSnapPositionTest : SingleParamBasePagerTest() {
 
     @Test
-    fun snapPosition_shouldNotInfluenceMaxScroll() = with(rule) {
-        val PageSize = object : PageSize {
-            override fun Density.calculateMainAxisPageSize(
-                availableSpace: Int,
-                pageSpacing: Int
-            ): Int {
-                return (availableSpace + pageSpacing) / 2
-            }
-        }
-        setContent {
-            ParameterizedPager(
-                modifier = Modifier.fillMaxSize(),
-                pageSize = PageSize,
-                orientation = it.orientation,
-                snapPosition = it.snapPosition.first
-            )
-        }
-
-        forEachParameter(ParamsToTest) { param ->
-            runBlocking { resetTestCase(DefaultPageCount - 2) }
-            val velocity = with(density) { 2 * MinFlingVelocityDp.roundToPx() }.toFloat()
-            val forwardDelta = (pageSize) * param.scrollForwardSign
-            onPager().performTouchInput {
-                with(param) {
-                    swipeWithVelocityAcrossMainAxis(velocity, forwardDelta.toFloat())
+    fun snapPosition_shouldNotInfluenceMaxScroll() =
+        with(rule) {
+            val PageSize =
+                object : PageSize {
+                    override fun Density.calculateMainAxisPageSize(
+                        availableSpace: Int,
+                        pageSpacing: Int
+                    ): Int {
+                        return (availableSpace + pageSpacing) / 2
+                    }
                 }
+            setContent {
+                ParameterizedPager(
+                    modifier = Modifier.fillMaxSize(),
+                    pageSize = PageSize,
+                    orientation = it.orientation,
+                    snapPosition = it.snapPosition.first
+                )
             }
 
-            runOnIdle {
-                assertThat(pagerState.canScrollForward).isFalse()
+            forEachParameter(ParamsToTest) { param ->
+                runBlocking { resetTestCase(DefaultPageCount - 2) }
+                val velocity = with(density) { 2 * MinFlingVelocityDp.roundToPx() }.toFloat()
+                val forwardDelta = (pageSize) * param.scrollForwardSign
+                onPager().performTouchInput {
+                    with(param) {
+                        swipeWithVelocityAcrossMainAxis(velocity, forwardDelta.toFloat())
+                    }
+                }
+
+                runOnIdle { assertThat(pagerState.canScrollForward).isFalse() }
             }
         }
-    }
 
     @Test
     fun pagerAtBounds_flingTowardsBound_doesNotMove() {
         rule.setContent {
             ParameterizedPager(
                 modifier = Modifier.fillMaxSize(),
-                pageSize = object : PageSize {
-                    override fun Density.calculateMainAxisPageSize(
-                        availableSpace: Int,
-                        pageSpacing: Int
-                    ) = ((availableSpace - 2 * pageSpacing) / 2.5).roundToInt()
-                },
+                pageSize =
+                    object : PageSize {
+                        override fun Density.calculateMainAxisPageSize(
+                            availableSpace: Int,
+                            pageSpacing: Int
+                        ) = ((availableSpace - 2 * pageSpacing) / 2.5).roundToInt()
+                    },
                 orientation = it.orientation,
                 snapPosition = it.snapPosition.first
             )
@@ -109,15 +110,14 @@
             rule.waitForIdle()
 
             assertWithMessage("currentPageOffsetFraction should not have changed")
-                .that(pagerState.currentPageOffsetFraction).isEqualTo(fractionBeforeFirstSwipe)
+                .that(pagerState.currentPageOffsetFraction)
+                .isEqualTo(fractionBeforeFirstSwipe)
             assertThat(pagerState.currentPage).isEqualTo(pageBeforeFirstSwipe)
             assertThat(pagerState.canScrollForward).isTrue()
             assertThat(pagerState.canScrollBackward).isFalse()
 
             // Scroll to the end of the layout
-            rule.runOnUiThread {
-                runBlocking { pagerState.scrollToPage(DefaultPageCount - 1) }
-            }
+            rule.runOnUiThread { runBlocking { pagerState.scrollToPage(DefaultPageCount - 1) } }
             rule.waitForIdle()
 
             // When we are at the end of the layout, we should only be able to move backwards
@@ -138,7 +138,8 @@
             rule.waitForIdle()
 
             assertWithMessage("currentPageOffsetFraction should not have changed")
-                .that(pagerState.currentPageOffsetFraction).isEqualTo(fractionBeforeSecondSwipe)
+                .that(pagerState.currentPageOffsetFraction)
+                .isEqualTo(fractionBeforeSecondSwipe)
             assertThat(pagerState.currentPage).isEqualTo(pageBeforeSecondSwipe)
             assertThat(pagerState.canScrollForward).isFalse()
             assertThat(pagerState.canScrollBackward).isTrue()
@@ -152,17 +153,18 @@
     }
 
     companion object {
-        val ParamsToTest = mutableListOf<SingleParamConfig>().apply {
-            for (orientation in TestOrientation) {
-                for (snapPosition in TestSnapPosition) {
-                    add(
-                        SingleParamConfig(
-                            orientation = orientation,
-                            snapPosition = snapPosition
+        val ParamsToTest =
+            mutableListOf<SingleParamConfig>().apply {
+                for (orientation in TestOrientation) {
+                    for (snapPosition in TestSnapPosition) {
+                        add(
+                            SingleParamConfig(
+                                orientation = orientation,
+                                snapPosition = snapPosition
+                            )
                         )
-                    )
+                    }
                 }
             }
-        }
     }
 }
diff --git a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/pager/PagerStateNonGestureScrollingTest.kt b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/pager/PagerStateNonGestureScrollingTest.kt
index b39ac82..43072ec 100644
--- a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/pager/PagerStateNonGestureScrollingTest.kt
+++ b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/pager/PagerStateNonGestureScrollingTest.kt
@@ -73,10 +73,10 @@
         rule.setContent {
             HorizontalOrVerticalPager(
                 state = state,
-                modifier = Modifier
-                    .fillMaxSize()
-                    .testTag(PagerTestTag)
-                    .onSizeChanged { pagerSize = if (vertical) it.height else it.width },
+                modifier =
+                    Modifier.fillMaxSize().testTag(PagerTestTag).onSizeChanged {
+                        pagerSize = if (vertical) it.height else it.width
+                    },
                 pageSize = PageSize.Fill,
                 reverseLayout = config.reverseLayout,
                 pageSpacing = config.pageSpacing,
@@ -99,25 +99,24 @@
     @Test
     fun pageSizeIsZero_offsetFractionShouldNotBeNan() {
         // Arrange
-        val zeroPageSize = object : PageSize {
-            override fun Density.calculateMainAxisPageSize(
-                availableSpace: Int,
-                pageSpacing: Int
-            ): Int {
-                return 0
+        val zeroPageSize =
+            object : PageSize {
+                override fun Density.calculateMainAxisPageSize(
+                    availableSpace: Int,
+                    pageSpacing: Int
+                ): Int {
+                    return 0
+                }
             }
-        }
 
         rule.setContent {
-            pagerState = rememberPagerState {
-                DefaultPageCount
-            }
+            pagerState = rememberPagerState { DefaultPageCount }
             HorizontalOrVerticalPager(
                 state = pagerState,
-                modifier = Modifier
-                    .size(0.dp)
-                    .testTag(PagerTestTag)
-                    .onSizeChanged { pagerSize = if (vertical) it.height else it.width },
+                modifier =
+                    Modifier.size(0.dp).testTag(PagerTestTag).onSizeChanged {
+                        pagerSize = if (vertical) it.height else it.width
+                    },
                 pageSize = zeroPageSize,
                 reverseLayout = config.reverseLayout,
                 pageSpacing = config.pageSpacing,
@@ -127,9 +126,7 @@
             }
         }
 
-        rule.runOnIdle {
-            Truth.assertThat(pagerState.currentPageOffsetFraction).isNotNaN()
-        }
+        rule.runOnIdle { Truth.assertThat(pagerState.currentPageOffsetFraction).isNotNaN() }
     }
 
     @Test
@@ -154,20 +151,11 @@
         tester.setContent {
             state = rememberPagerState(pageCount = { DefaultPageCount })
             scope = rememberCoroutineScope()
-            HorizontalOrVerticalPager(
-                state = state,
-                modifier = Modifier.fillMaxSize()
-            ) {
-                Page(it)
-            }
+            HorizontalOrVerticalPager(state = state, modifier = Modifier.fillMaxSize()) { Page(it) }
         }
 
         // Act
-        rule.runOnIdle {
-            scope.launch {
-                state.scrollToPage(5, 0.2f)
-            }
-        }
+        rule.runOnIdle { scope.launch { state.scrollToPage(5, 0.2f) } }
 
         val previousPage = state.currentPage
         val previousOffset = state.currentPageOffsetFraction
@@ -186,9 +174,7 @@
             val state = rememberPagerState(pageCount = { 10 })
             // Read state in composition, should never be Nan
             assertFalse { state.currentPageOffsetFraction.isNaN() }
-            HorizontalOrVerticalPager(state = state) {
-                Page(index = it)
-            }
+            HorizontalOrVerticalPager(state = state) { Page(index = it) }
         }
     }
 
@@ -197,17 +183,9 @@
         // Arrange
         class Data(val id: Int, val item: String)
 
-        val data = mutableListOf(
-            Data(3, "A"),
-            Data(4, "B"),
-            Data(5, "C")
-        )
+        val data = mutableListOf(Data(3, "A"), Data(4, "B"), Data(5, "C"))
 
-        val extraData = mutableListOf(
-            Data(0, "D"),
-            Data(1, "E"),
-            Data(2, "F")
-        )
+        val extraData = mutableListOf(Data(0, "D"), Data(1, "E"), Data(2, "F"))
 
         val dataset = mutableStateOf<List<Data>>(data)
 
@@ -215,16 +193,12 @@
             modifier = Modifier.fillMaxSize(),
             initialPage = 1,
             key = { dataset.value[it].id },
-            pageCount = {
-                dataset.value.size
-            }, pageContent = {
+            pageCount = { dataset.value.size },
+            pageContent = {
                 val item = dataset.value[it]
-                Box(
-                    modifier = Modifier
-                        .fillMaxSize()
-                        .testTag(item.item)
-                )
-            })
+                Box(modifier = Modifier.fillMaxSize().testTag(item.item))
+            }
+        )
 
         Truth.assertThat(dataset.value[pagerState.currentPage].item).isEqualTo("B")
 
@@ -257,11 +231,9 @@
     @Test
     fun scrollToPage_usingLaunchedEffect() {
 
-        createPager(additionalContent = {
-            LaunchedEffect(pagerState) {
-                pagerState.scrollToPage(10)
-            }
-        })
+        createPager(
+            additionalContent = { LaunchedEffect(pagerState) { pagerState.scrollToPage(10) } }
+        )
 
         Truth.assertThat(pagerState.currentPage).isEqualTo(10)
         confirmPageIsInCorrectPosition(10)
@@ -269,11 +241,9 @@
 
     @Test
     fun scrollToPageWithOffset_usingLaunchedEffect() {
-        createPager(additionalContent = {
-            LaunchedEffect(pagerState) {
-                pagerState.scrollToPage(10, 0.4f)
-            }
-        })
+        createPager(
+            additionalContent = { LaunchedEffect(pagerState) { pagerState.scrollToPage(10, 0.4f) } }
+        )
 
         Truth.assertThat(pagerState.currentPage).isEqualTo(10)
         confirmPageIsInCorrectPosition(10, pageOffset = 0.4f)
@@ -282,11 +252,11 @@
     @Test
     fun animatedScrollToPage_usingLaunchedEffect() {
 
-        createPager(additionalContent = {
-            LaunchedEffect(pagerState) {
-                pagerState.animateScrollToPage(10)
+        createPager(
+            additionalContent = {
+                LaunchedEffect(pagerState) { pagerState.animateScrollToPage(10) }
             }
-        })
+        )
 
         Truth.assertThat(pagerState.currentPage).isEqualTo(10)
         confirmPageIsInCorrectPosition(10)
@@ -294,22 +264,23 @@
 
     @Test
     fun animatedScrollToPage_emptyPager_shouldNotReact() {
-        createPager(pageCount = { 0 }, additionalContent = {
-            LaunchedEffect(pagerState) {
-                pagerState.animateScrollToPage(10)
+        createPager(
+            pageCount = { 0 },
+            additionalContent = {
+                LaunchedEffect(pagerState) { pagerState.animateScrollToPage(10) }
             }
-        })
+        )
         Truth.assertThat(pagerState.currentPage).isEqualTo(0)
     }
 
     @Test
     fun animatedScrollToPageWithOffset_usingLaunchedEffect() {
 
-        createPager(additionalContent = {
-            LaunchedEffect(pagerState) {
-                pagerState.animateScrollToPage(10, 0.4f)
+        createPager(
+            additionalContent = {
+                LaunchedEffect(pagerState) { pagerState.animateScrollToPage(10, 0.4f) }
             }
-        })
+        )
 
         Truth.assertThat(pagerState.currentPage).isEqualTo(10)
         confirmPageIsInCorrectPosition(10, pageOffset = 0.4f)
@@ -318,11 +289,11 @@
     @Test
     fun animatedScrollToPage_viewPortNumberOfPages_usingLaunchedEffect_shouldNotPlaceALlPages() {
 
-        createPager(additionalContent = {
-            LaunchedEffect(pagerState) {
-                pagerState.animateScrollToPage(DefaultPageCount - 1)
+        createPager(
+            additionalContent = {
+                LaunchedEffect(pagerState) { pagerState.animateScrollToPage(DefaultPageCount - 1) }
             }
-        })
+        )
 
         // Assert
         rule.runOnIdle {
@@ -341,11 +312,10 @@
         rule.mainClock.autoAdvance = false
 
         // Act
-        createPager(modifier = Modifier.fillMaxSize(), additionalContent = {
-            LaunchedEffect(pagerState) {
-                pagerState.scrollToPage(5)
-            }
-        })
+        createPager(
+            modifier = Modifier.fillMaxSize(),
+            additionalContent = { LaunchedEffect(pagerState) { pagerState.scrollToPage(5) } }
+        )
 
         // Assert
         Truth.assertThat(pagerState.currentPage).isEqualTo(5)
@@ -357,19 +327,9 @@
 
         Truth.assertThat(pagerState.currentPage).isEqualTo(0)
 
-        rule.runOnUiThread {
-            scope.launch {
-                with(pagerState) {
-                    scroll {
-                        updateCurrentPage(5)
-                    }
-                }
-            }
-        }
+        rule.runOnUiThread { scope.launch { with(pagerState) { scroll { updateCurrentPage(5) } } } }
 
-        rule.runOnIdle {
-            Truth.assertThat(pagerState.currentPage).isEqualTo(5)
-        }
+        rule.runOnIdle { Truth.assertThat(pagerState.currentPage).isEqualTo(5) }
     }
 
     @Test
@@ -379,13 +339,7 @@
         Truth.assertThat(pagerState.currentPage).isEqualTo(0)
 
         rule.runOnUiThread {
-            scope.launch {
-                with(pagerState) {
-                    scroll {
-                        updateCurrentPage(5, 0.3f)
-                    }
-                }
-            }
+            scope.launch { with(pagerState) { scroll { updateCurrentPage(5, 0.3f) } } }
         }
 
         rule.runOnIdle {
@@ -423,20 +377,19 @@
     @Test
     fun currentPage_shouldUpdateWithSnapPositionInLayout() {
         // snap position is 200dp from edge of Pager
-        val customSnapPosition = object : SnapPosition {
-            override fun position(
-                layoutSize: Int,
-                itemSize: Int,
-                beforeContentPadding: Int,
-                afterContentPadding: Int,
-                itemIndex: Int,
-                itemCount: Int
-            ): Int {
-                return with(rule.density) {
-                    200.dp.roundToPx()
+        val customSnapPosition =
+            object : SnapPosition {
+                override fun position(
+                    layoutSize: Int,
+                    itemSize: Int,
+                    beforeContentPadding: Int,
+                    afterContentPadding: Int,
+                    itemIndex: Int,
+                    itemCount: Int
+                ): Int {
+                    return with(rule.density) { 200.dp.roundToPx() }
                 }
             }
-        }
 
         createPager(
             modifier = Modifier.fillMaxSize(),
@@ -452,20 +405,25 @@
 
         with(pagerState.layoutInfo) {
             val viewPortSize = if (vertical) viewportSize.height else viewportSize.width
-            assertThat(pagerState.currentPage).isEqualTo(visiblePagesInfo.fastMaxBy {
-                -abs(
-                    calculateDistanceToDesiredSnapPosition(
-                        mainAxisViewPortSize = viewPortSize,
-                        beforeContentPadding = beforeContentPadding,
-                        afterContentPadding = afterContentPadding,
-                        itemSize = pageSize,
-                        itemOffset = it.offset,
-                        itemIndex = it.index,
-                        snapPosition = customSnapPosition,
-                        itemCount = pagerState.pageCount
-                    )
+            assertThat(pagerState.currentPage)
+                .isEqualTo(
+                    visiblePagesInfo
+                        .fastMaxBy {
+                            -abs(
+                                calculateDistanceToDesiredSnapPosition(
+                                    mainAxisViewPortSize = viewPortSize,
+                                    beforeContentPadding = beforeContentPadding,
+                                    afterContentPadding = afterContentPadding,
+                                    itemSize = pageSize,
+                                    itemOffset = it.offset,
+                                    itemIndex = it.index,
+                                    snapPosition = customSnapPosition,
+                                    itemCount = pagerState.pageCount
+                                )
+                            )
+                        }
+                        ?.index
                 )
-            }?.index)
         }
     }
 
@@ -493,8 +451,7 @@
                 .isEqualTo(pagerState.layoutInfo.visiblePagesInfo.first().index)
 
             // offset should be zero
-            Truth.assertThat(pagerState.layoutInfo.visiblePagesInfo.first().offset)
-                .isEqualTo(0)
+            Truth.assertThat(pagerState.layoutInfo.visiblePagesInfo.first().offset).isEqualTo(0)
         }
     }
 
@@ -516,9 +473,10 @@
 
         rule.runOnIdle {
             // find page whose offset is closest to the centre
-            val candidatePage = pagerState.layoutInfo.visiblePagesInfo.fastMaxBy {
-                -(abs(it.offset - pagerSize / 2))
-            }
+            val candidatePage =
+                pagerState.layoutInfo.visiblePagesInfo.fastMaxBy {
+                    -(abs(it.offset - pagerSize / 2))
+                }
 
             // check we moved
             Truth.assertThat(pagerState.firstVisiblePage).isNotEqualTo(0)
@@ -556,13 +514,15 @@
         val pageSizeDp = with(rule.density) { pageSizePx.toDp() }
         createPager(
             modifier = Modifier.size(pageSizeDp * 1.5f),
-            pageSize = { PageSize.Fixed(pageSizeDp) })
+            pageSize = { PageSize.Fixed(pageSizeDp) }
+        )
 
         val delta = (pageSizePx / 3f).roundToInt()
 
         runBlocking {
             withContext(Dispatchers.Main + AutoTestFrameClock()) {
-                // small enough scroll to not cause any new items to be composed or old ones disposed.
+                // small enough scroll to not cause any new items to be composed or old ones
+                // disposed.
                 pagerState.scrollBy(delta.toFloat())
             }
             rule.runOnIdle {
@@ -587,13 +547,15 @@
         val pageSizeDp = with(rule.density) { pageSizePx.toDp() }
         createPager(
             modifier = Modifier.size(pageSizeDp * 1.5f),
-            pageSize = { PageSize.Fixed(pageSizeDp) })
+            pageSize = { PageSize.Fixed(pageSizeDp) }
+        )
         val delta = -(pageSizePx / 3f).roundToInt()
         runBlocking {
             withContext(Dispatchers.Main + AutoTestFrameClock()) {
                 // scroll to the end of the list.
                 pagerState.scrollToPage(DefaultPageCount)
-                // small enough scroll to not cause any new items to be composed or old ones disposed.
+                // small enough scroll to not cause any new items to be composed or old ones
+                // disposed.
                 pagerState.scrollBy(delta.toFloat())
             }
             rule.runOnIdle {
@@ -631,7 +593,8 @@
                 assertThat(pagerState.canScrollForward).isFalse()
                 assertThat(pagerState.canScrollBackward).isTrue()
 
-                // small enough scroll to not cause any new pages to be composed or old ones disposed.
+                // small enough scroll to not cause any new pages to be composed or old ones
+                // disposed.
                 pagerState.scrollBy(delta.toFloat())
             }
             rule.runOnIdle {
@@ -652,10 +615,11 @@
     companion object {
         @JvmStatic
         @Parameterized.Parameters(name = "{0}")
-        fun params() = mutableListOf<ParamConfig>().apply {
-            for (orientation in TestOrientation) {
-                add(ParamConfig(orientation = orientation))
+        fun params() =
+            mutableListOf<ParamConfig>().apply {
+                for (orientation in TestOrientation) {
+                    add(ParamConfig(orientation = orientation))
+                }
             }
-        }
     }
 }
diff --git a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/pager/PagerStateTest.kt b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/pager/PagerStateTest.kt
index 0b35a76..8534555 100644
--- a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/pager/PagerStateTest.kt
+++ b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/pager/PagerStateTest.kt
@@ -118,11 +118,7 @@
                 scrollToPageWithOffset(12, -0.4f)
 
                 // Assert
-                param.confirmPageIsInCorrectPosition(
-                    pagerState.currentPage,
-                    12,
-                    pageOffset = -0.4f
-                )
+                param.confirmPageIsInCorrectPosition(pagerState.currentPage, 12, pageOffset = -0.4f)
 
                 // Act
                 scrollToPageWithOffset(DefaultPageCount - 1, 0.5f)
@@ -333,9 +329,7 @@
                 }
 
                 // Act
-                withContext(Dispatchers.Main + AutoTestFrameClock()) {
-                    pagerState.scrollToPage(-1)
-                }
+                withContext(Dispatchers.Main + AutoTestFrameClock()) { pagerState.scrollToPage(-1) }
 
                 // Assert
                 rule.runOnIdle { assertThat(pagerState.currentPage).isEqualTo(0) }
@@ -438,10 +432,7 @@
                     assertThat(pagerState.currentPage).isEqualTo(it)
                     val nextPage = pagerState.currentPage + 1
                     withContext(Dispatchers.Main + AutoTestFrameClock()) {
-                        pagerState.animateScrollToPage(
-                            nextPage,
-                            animationSpec = differentAnimation
-                        )
+                        pagerState.animateScrollToPage(nextPage, animationSpec = differentAnimation)
                     }
                     rule.waitForIdle()
                     assertTrue { pagerState.currentPage == nextPage }
@@ -480,15 +471,11 @@
             }
 
             // Assert
-            rule.runOnIdle {
-                assertThat(pagerState.currentPage).isEqualTo(previousCurrentPage)
-            }
+            rule.runOnIdle { assertThat(pagerState.currentPage).isEqualTo(previousCurrentPage) }
             // Release pointer
             onPager().performTouchInput { up() }
 
-            rule.runOnIdle {
-                previousCurrentPage = pagerState.currentPage
-            }
+            rule.runOnIdle { previousCurrentPage = pagerState.currentPage }
             param.confirmPageIsInCorrectPosition(pagerState.currentPage)
 
             // Arrange
@@ -506,9 +493,7 @@
             }
 
             // Assert
-            rule.runOnIdle {
-                assertThat(pagerState.currentPage).isEqualTo(previousCurrentPage + 1)
-            }
+            rule.runOnIdle { assertThat(pagerState.currentPage).isEqualTo(previousCurrentPage + 1) }
 
             onPager().performTouchInput { up() }
             rule.waitForIdle()
@@ -538,9 +523,9 @@
             rule.mainClock.autoAdvance = false
             // Act
             // Moving less than threshold
-            val forwardDelta = param.scrollForwardSign.toFloat() * with(rule.density) {
-                DefaultPositionThreshold.toPx() / 2
-            }
+            val forwardDelta =
+                param.scrollForwardSign.toFloat() *
+                    with(rule.density) { DefaultPositionThreshold.toPx() / 2 }
 
             var previousTargetPage = pagerState.targetPage
 
@@ -559,9 +544,9 @@
 
             // Act
             // Moving more than threshold
-            val backwardDelta = param.scrollForwardSign.toFloat() * with(rule.density) {
-                -DefaultPositionThreshold.toPx() / 2
-            }
+            val backwardDelta =
+                param.scrollForwardSign.toFloat() *
+                    with(rule.density) { -DefaultPositionThreshold.toPx() / 2 }
 
             previousTargetPage = pagerState.targetPage
 
@@ -613,11 +598,7 @@
             rule.mainClock.autoAdvance = true
             onPager().performTouchInput { up() }
             rule.runOnIdle { assertThat(pagerState.targetPage).isEqualTo(pagerState.currentPage) }
-            rule.runOnIdle {
-                scope.launch {
-                    pagerState.scrollToPage(5)
-                }
-            }
+            rule.runOnIdle { scope.launch { pagerState.scrollToPage(5) } }
 
             rule.mainClock.autoAdvance = false
             // Act
@@ -656,9 +637,7 @@
             )
         }
         rule.forEachParameter(PagerStateTestParams) { param ->
-            rule.runOnIdle {
-                assertThat(pagerState.targetPage).isEqualTo(pagerState.currentPage)
-            }
+            rule.runOnIdle { assertThat(pagerState.targetPage).isEqualTo(pagerState.currentPage) }
 
             rule.mainClock.autoAdvance = false
             // Act
@@ -666,12 +645,7 @@
             var previousTarget = pagerState.targetPage
             val forwardDelta = pagerSize * param.scrollForwardSign.toFloat()
             onPager().performTouchInput {
-                with(param) {
-                    swipeWithVelocityAcrossMainAxis(
-                        20000f,
-                        forwardDelta
-                    )
-                }
+                with(param) { swipeWithVelocityAcrossMainAxis(20000f, forwardDelta) }
             }
             rule.mainClock.advanceTimeUntil { pagerState.targetPage != previousTarget }
             var flingOriginIndex = pagerState.firstVisiblePage
@@ -680,21 +654,14 @@
             assertThat(pagerState.targetPage).isNotEqualTo(pagerState.currentPage)
 
             rule.mainClock.autoAdvance = true
-            rule.runOnIdle {
-                assertThat(pagerState.targetPage).isEqualTo(pagerState.currentPage)
-            }
+            rule.runOnIdle { assertThat(pagerState.targetPage).isEqualTo(pagerState.currentPage) }
             rule.mainClock.autoAdvance = false
             // Act
             // Moving backward
             previousTarget = pagerState.targetPage
             val backwardDelta = -pagerSize * param.scrollForwardSign.toFloat()
             onPager().performTouchInput {
-                with(param) {
-                    swipeWithVelocityAcrossMainAxis(
-                        20000f,
-                        backwardDelta
-                    )
-                }
+                with(param) { swipeWithVelocityAcrossMainAxis(20000f, backwardDelta) }
             }
             rule.mainClock.advanceTimeUntil { pagerState.targetPage != previousTarget }
 
@@ -704,9 +671,7 @@
             assertThat(pagerState.targetPage).isNotEqualTo(pagerState.currentPage)
 
             rule.mainClock.autoAdvance = true
-            rule.runOnIdle {
-                assertThat(pagerState.targetPage).isEqualTo(pagerState.currentPage)
-            }
+            rule.runOnIdle { assertThat(pagerState.targetPage).isEqualTo(pagerState.currentPage) }
             runBlocking { resetTestCase() }
         }
     }
@@ -715,42 +680,41 @@
     fun targetPage_performingFlingWithCustomFling_shouldGoToPredictedPage() {
         // Arrange
         var flingPredictedPage = -1
-        val myCustomFling = object : TargetedFlingBehavior {
-            val decay = splineBasedDecay<Float>(rule.density)
+        val myCustomFling =
+            object : TargetedFlingBehavior {
+                val decay = splineBasedDecay<Float>(rule.density)
 
-            override suspend fun ScrollScope.performFling(
-                initialVelocity: Float,
-                onRemainingDistanceUpdated: (Float) -> Unit
-            ): Float {
-                val finalOffset = decay.calculateTargetValue(
-                    0.0f,
-                    initialVelocity
-                )
-                val pageDisplacement = finalOffset / pagerState.pageSizeWithSpacing
-                val targetPage = pageDisplacement.roundToInt() + pagerState.currentPage
-                flingPredictedPage = targetPage
-                return if (abs(initialVelocity) > 1f) {
-                    var velocityLeft = initialVelocity
-                    var lastValue = 0f
-                    val animationState = AnimationState(
-                        initialValue = 0f,
-                        initialVelocity = initialVelocity,
-                    )
-                    animationState.animateDecay(decay) {
-                        onRemainingDistanceUpdated(finalOffset - value)
-                        val delta = value - lastValue
-                        val consumed = scrollBy(delta)
-                        lastValue = value
-                        velocityLeft = this.velocity
-                        // avoid rounding errors and stop if anything is unconsumed
-                        if (abs(delta - consumed) > 0.5f) this.cancelAnimation()
+                override suspend fun ScrollScope.performFling(
+                    initialVelocity: Float,
+                    onRemainingDistanceUpdated: (Float) -> Unit
+                ): Float {
+                    val finalOffset = decay.calculateTargetValue(0.0f, initialVelocity)
+                    val pageDisplacement = finalOffset / pagerState.pageSizeWithSpacing
+                    val targetPage = pageDisplacement.roundToInt() + pagerState.currentPage
+                    flingPredictedPage = targetPage
+                    return if (abs(initialVelocity) > 1f) {
+                        var velocityLeft = initialVelocity
+                        var lastValue = 0f
+                        val animationState =
+                            AnimationState(
+                                initialValue = 0f,
+                                initialVelocity = initialVelocity,
+                            )
+                        animationState.animateDecay(decay) {
+                            onRemainingDistanceUpdated(finalOffset - value)
+                            val delta = value - lastValue
+                            val consumed = scrollBy(delta)
+                            lastValue = value
+                            velocityLeft = this.velocity
+                            // avoid rounding errors and stop if anything is unconsumed
+                            if (abs(delta - consumed) > 0.5f) this.cancelAnimation()
+                        }
+                        velocityLeft
+                    } else {
+                        initialVelocity
                     }
-                    velocityLeft
-                } else {
-                    initialVelocity
                 }
             }
-        }
 
         // Arrange
         rule.setContent { config ->
@@ -765,21 +729,14 @@
             )
         }
         rule.forEachParameter(PagerStateTestParams) { param ->
-            rule.runOnIdle {
-                assertThat(pagerState.targetPage).isEqualTo(pagerState.currentPage)
-            }
+            rule.runOnIdle { assertThat(pagerState.targetPage).isEqualTo(pagerState.currentPage) }
 
             // Act
             // Moving forward
             rule.mainClock.autoAdvance = false
             val forwardDelta = pagerSize * param.scrollForwardSign.toFloat()
             onPager().performTouchInput {
-                with(param) {
-                    swipeWithVelocityAcrossMainAxis(
-                        20000f,
-                        forwardDelta
-                    )
-                }
+                with(param) { swipeWithVelocityAcrossMainAxis(20000f, forwardDelta) }
             }
             rule.mainClock.advanceTimeUntil { flingPredictedPage != -1 }
             var targetPage = pagerState.targetPage
@@ -789,18 +746,10 @@
 
             // Assert
             // Check if target page changed
-            rule.runOnIdle {
-                assertThat(pagerState.targetPage).isEqualTo(
-                    flingPredictedPage
-                )
-            }
+            rule.runOnIdle { assertThat(pagerState.targetPage).isEqualTo(flingPredictedPage) }
             rule.mainClock.autoAdvance = true // let time run
             // Check if we actually stopped in the predicted page
-            rule.runOnIdle {
-                assertThat(pagerState.currentPage).isEqualTo(
-                    flingPredictedPage
-                )
-            }
+            rule.runOnIdle { assertThat(pagerState.currentPage).isEqualTo(flingPredictedPage) }
 
             // Act
             // Moving backward
@@ -808,12 +757,7 @@
             rule.mainClock.autoAdvance = false
             val backwardDelta = -pagerSize * param.scrollForwardSign.toFloat()
             onPager().performTouchInput {
-                with(param) {
-                    swipeWithVelocityAcrossMainAxis(
-                        20000f,
-                        backwardDelta
-                    )
-                }
+                with(param) { swipeWithVelocityAcrossMainAxis(20000f, backwardDelta) }
             }
             rule.mainClock.advanceTimeUntil { flingPredictedPage != -1 }
             targetPage = pagerState.targetPage
@@ -823,18 +767,10 @@
 
             // Assert
             // Check if target page changed
-            rule.runOnIdle {
-                assertThat(pagerState.targetPage).isEqualTo(
-                    flingPredictedPage
-                )
-            }
+            rule.runOnIdle { assertThat(pagerState.targetPage).isEqualTo(flingPredictedPage) }
             rule.mainClock.autoAdvance = true // let time run
             // Check if we actually stopped in the predicted page
-            rule.runOnIdle {
-                assertThat(pagerState.currentPage).isEqualTo(
-                    flingPredictedPage
-                )
-            }
+            rule.runOnIdle { assertThat(pagerState.currentPage).isEqualTo(flingPredictedPage) }
             runBlocking { resetTestCase() }
         }
     }
@@ -859,11 +795,7 @@
             // Act
             // Moving forward
             var previousTarget = pagerState.targetPage
-            rule.runOnIdle {
-                scope.launch {
-                    pagerState.animateScrollToPage(DefaultPageCount - 1)
-                }
-            }
+            rule.runOnIdle { scope.launch { pagerState.animateScrollToPage(DefaultPageCount - 1) } }
             rule.mainClock.advanceTimeUntil { pagerState.targetPage != previousTarget }
 
             // Assert
@@ -877,11 +809,7 @@
             // Act
             // Moving backward
             previousTarget = pagerState.targetPage
-            rule.runOnIdle {
-                scope.launch {
-                    pagerState.animateScrollToPage(0)
-                }
-            }
+            rule.runOnIdle { scope.launch { pagerState.animateScrollToPage(0) } }
             rule.mainClock.advanceTimeUntil { pagerState.targetPage != previousTarget }
 
             // Assert
@@ -929,9 +857,7 @@
             // Moving forward
             var previousTarget = pagerState.targetPage
             rule.runOnIdle {
-                scope.launch {
-                    pagerState.customAnimateScrollToPage(DefaultPageCount - 1)
-                }
+                scope.launch { pagerState.customAnimateScrollToPage(DefaultPageCount - 1) }
             }
             rule.mainClock.advanceTimeUntil { pagerState.targetPage != previousTarget }
 
@@ -946,11 +872,7 @@
             // Act
             // Moving backward
             previousTarget = pagerState.targetPage
-            rule.runOnIdle {
-                scope.launch {
-                    pagerState.customAnimateScrollToPage(0)
-                }
-            }
+            rule.runOnIdle { scope.launch { pagerState.customAnimateScrollToPage(0) } }
             rule.mainClock.advanceTimeUntil { pagerState.targetPage != previousTarget }
 
             // Assert
@@ -996,9 +918,7 @@
 
             onPager().performTouchInput { up() }
 
-            rule.runOnIdle {
-                previousCurrentPage = pagerState.currentPage
-            }
+            rule.runOnIdle { previousCurrentPage = pagerState.currentPage }
 
             val backwardDelta = (pagerSize * 0.7f) * param.scrollForwardSign * -1
             onPager().performTouchInput {
@@ -1083,29 +1003,21 @@
                 reverseLayout = config.reverseLayout,
                 snapPosition = config.snapPosition.first,
                 additionalContent = {
-                    LaunchedEffect(key1 = pagerState.settledPage) {
-                        settledPageChanges++
-                    }
+                    LaunchedEffect(key1 = pagerState.settledPage) { settledPageChanges++ }
                 }
             )
         }
 
         rule.forEachParameter(PagerStateTestParams) {
             // Settle page changed once for first composition
-            rule.runOnIdle {
-                assertThat(pagerState.settledPage).isEqualTo(pagerState.currentPage)
-            }
+            rule.runOnIdle { assertThat(pagerState.settledPage).isEqualTo(pagerState.currentPage) }
 
             settledPageChanges = 0
             val previousSettled = pagerState.settledPage
             rule.mainClock.autoAdvance = false
             // Act
             // Moving forward
-            rule.runOnIdle {
-                scope.launch {
-                    pagerState.animateScrollToPage(DefaultPageCount - 1)
-                }
-            }
+            rule.runOnIdle { scope.launch { pagerState.animateScrollToPage(DefaultPageCount - 1) } }
 
             // Settled page shouldn't change whilst scroll is in progress.
             assertTrue { pagerState.isScrollInProgress }
@@ -1136,9 +1048,7 @@
                 reverseLayout = config.reverseLayout,
                 snapPosition = config.snapPosition.first,
                 additionalContent = {
-                    LaunchedEffect(key1 = pagerState.settledPage) {
-                        settledPageChanges++
-                    }
+                    LaunchedEffect(key1 = pagerState.settledPage) { settledPageChanges++ }
                 }
             )
         }
@@ -1151,12 +1061,7 @@
             // Moving forward
             val forwardDelta = pagerSize / 2f * param.scrollForwardSign.toFloat()
             onPager().performTouchInput {
-                with(param) {
-                    swipeWithVelocityAcrossMainAxis(
-                        10000f,
-                        forwardDelta
-                    )
-                }
+                with(param) { swipeWithVelocityAcrossMainAxis(10000f, forwardDelta) }
             }
 
             // Settled page shouldn't change whilst scroll is in progress.
@@ -1215,11 +1120,7 @@
             rule.waitForIdle()
 
             // Reset
-            rule.runOnIdle {
-                scope.launch {
-                    pagerState.scrollToPage(DefaultPageCount / 2)
-                }
-            }
+            rule.runOnIdle { scope.launch { pagerState.scrollToPage(DefaultPageCount / 2) } }
 
             // No offset initially (again)
             rule.runOnIdle {
@@ -1253,13 +1154,14 @@
         rule.setContent { config ->
             ParameterizedPager(
                 initialPage = 5,
-                modifier = Modifier.layout { measurable, constraints ->
-                    layoutCount++
-                    val placeables = measurable.measure(constraints)
-                    layout(constraints.maxWidth, constraints.maxHeight) {
-                        placeables.place(0, 0)
-                    }
-                },
+                modifier =
+                    Modifier.layout { measurable, constraints ->
+                        layoutCount++
+                        val placeables = measurable.measure(constraints)
+                        layout(constraints.maxWidth, constraints.maxHeight) {
+                            placeables.place(0, 0)
+                        }
+                    },
                 layoutDirection = config.layoutDirection,
                 reverseLayout = config.reverseLayout,
                 snapPosition = config.snapPosition.first
@@ -1271,9 +1173,7 @@
             val previousMeasurementCount = layoutCount
             val previousOffsetFraction = pagerState.currentPageOffsetFraction
             rule.runOnIdle {
-                runBlocking {
-                    pagerState.scrollBy((pageSize * 0.2f) * param.scrollForwardSign)
-                }
+                runBlocking { pagerState.scrollBy((pageSize * 0.2f) * param.scrollForwardSign) }
             }
             rule.runOnIdle {
                 assertThat(pagerState.currentPageOffsetFraction)
@@ -1293,31 +1193,34 @@
     }
 
     companion object {
-        val PagerStateTestParams = mutableSetOf<SingleParamConfig>().apply {
-            for (orientation in TestOrientation) {
-                for (snapPosition in TestSnapPosition) {
-                    add(
-                        SingleParamConfig(
-                            orientation = orientation,
-                            snapPosition = snapPosition
-                        )
-                    )
-                }
-            }
-
-            for (orientation in TestOrientation) {
-                for (reverseLayout in TestReverseLayout) {
-                    for (layoutDirection in TestLayoutDirection) {
-                        add(
-                            SingleParamConfig(
-                                orientation = orientation,
-                                reverseLayout = reverseLayout,
-                                layoutDirection = layoutDirection
+        val PagerStateTestParams =
+            mutableSetOf<SingleParamConfig>()
+                .apply {
+                    for (orientation in TestOrientation) {
+                        for (snapPosition in TestSnapPosition) {
+                            add(
+                                SingleParamConfig(
+                                    orientation = orientation,
+                                    snapPosition = snapPosition
+                                )
                             )
-                        )
+                        }
+                    }
+
+                    for (orientation in TestOrientation) {
+                        for (reverseLayout in TestReverseLayout) {
+                            for (layoutDirection in TestLayoutDirection) {
+                                add(
+                                    SingleParamConfig(
+                                        orientation = orientation,
+                                        reverseLayout = reverseLayout,
+                                        layoutDirection = layoutDirection
+                                    )
+                                )
+                            }
+                        }
                     }
                 }
-            }
-        }.toList()
+                .toList()
     }
 }
diff --git a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/pager/PagerSwipeEdgeTest.kt b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/pager/PagerSwipeEdgeTest.kt
index cf2aad1..11e451d 100644
--- a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/pager/PagerSwipeEdgeTest.kt
+++ b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/pager/PagerSwipeEdgeTest.kt
@@ -34,9 +34,7 @@
 @OptIn(ExperimentalFoundationApi::class)
 @LargeTest
 @RunWith(Parameterized::class)
-class PagerSwipeEdgeTest(
-    val config: ParamConfig
-) : BasePagerTest(config) {
+class PagerSwipeEdgeTest(val config: ParamConfig) : BasePagerTest(config) {
 
     @Test
     fun swipePageTowardsEdge_shouldNotMove() {
@@ -94,20 +92,21 @@
     companion object {
         @JvmStatic
         @Parameterized.Parameters(name = "{0}")
-        fun params() = mutableListOf<ParamConfig>().apply {
-            for (orientation in TestOrientation) {
-                for (reverseLayout in TestReverseLayout) {
-                    for (layoutDirection in TestLayoutDirection) {
-                        add(
-                            ParamConfig(
-                                orientation = orientation,
-                                reverseLayout = reverseLayout,
-                                layoutDirection = layoutDirection
+        fun params() =
+            mutableListOf<ParamConfig>().apply {
+                for (orientation in TestOrientation) {
+                    for (reverseLayout in TestReverseLayout) {
+                        for (layoutDirection in TestLayoutDirection) {
+                            add(
+                                ParamConfig(
+                                    orientation = orientation,
+                                    reverseLayout = reverseLayout,
+                                    layoutDirection = layoutDirection
+                                )
                             )
-                        )
+                        }
                     }
                 }
             }
-        }
     }
 }
diff --git a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/pager/PagerTest.kt b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/pager/PagerTest.kt
index e95d5b8..fec402c 100644
--- a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/pager/PagerTest.kt
+++ b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/pager/PagerTest.kt
@@ -60,18 +60,13 @@
     fun userScrollEnabledIsOff_shouldNotAllowGestureScroll() {
         // Arrange
 
-        createPager(
-            userScrollEnabled = false,
-            modifier = Modifier.fillMaxSize()
-        )
+        createPager(userScrollEnabled = false, modifier = Modifier.fillMaxSize())
 
         // Act
         onPager().performTouchInput { swipeWithVelocityAcrossMainAxis(1000f) }
 
         // Assert
-        rule.runOnIdle {
-            assertThat(pagerState.currentPage).isEqualTo(0)
-        }
+        rule.runOnIdle { assertThat(pagerState.currentPage).isEqualTo(0) }
 
         confirmPageIsInCorrectPosition(0, 0)
     }
@@ -80,39 +75,24 @@
     fun userScrollEnabledIsOff_shouldAllowAnimationScroll() {
         // Arrange
 
-        createPager(
-            userScrollEnabled = false,
-            modifier = Modifier.fillMaxSize()
-        )
+        createPager(userScrollEnabled = false, modifier = Modifier.fillMaxSize())
 
         // Act
-        rule.runOnIdle {
-            scope.launch {
-                pagerState.animateScrollToPage(5)
-            }
-        }
+        rule.runOnIdle { scope.launch { pagerState.animateScrollToPage(5) } }
 
         // Assert
-        rule.runOnIdle {
-            assertThat(pagerState.currentPage).isEqualTo(5)
-        }
+        rule.runOnIdle { assertThat(pagerState.currentPage).isEqualTo(5) }
         confirmPageIsInCorrectPosition(5)
     }
 
     @Test
     fun userScrollEnabledIsOn_shouldAllowGestureScroll() {
         // Arrange
-        createPager(
-            initialPage = 5,
-            userScrollEnabled = true,
-            modifier = Modifier.fillMaxSize()
-        )
+        createPager(initialPage = 5, userScrollEnabled = true, modifier = Modifier.fillMaxSize())
 
         onPager().performTouchInput { swipeWithVelocityAcrossMainAxis(1000f) }
 
-        rule.runOnIdle {
-            assertThat(pagerState.currentPage).isNotEqualTo(5)
-        }
+        rule.runOnIdle { assertThat(pagerState.currentPage).isNotEqualTo(5) }
         confirmPageIsInCorrectPosition(pagerState.currentPage)
     }
 
@@ -126,13 +106,7 @@
         // Assert
         repeat(DefaultPageCount) {
             rule.onNodeWithTag("$it").assertIsDisplayed()
-            rule.runOnIdle {
-                scope.launch {
-                    pagerState.scroll {
-                        scrollBy(pagerSize.toFloat())
-                    }
-                }
-            }
+            rule.runOnIdle { scope.launch { pagerState.scroll { scrollBy(pagerSize.toFloat()) } } }
             rule.waitForIdle()
         }
         rule.onNodeWithTag("$DefaultPageCount").assertDoesNotExist()
@@ -156,13 +130,7 @@
         // Assert
         repeat(DefaultPageCount) {
             rule.onNodeWithTag("$it").assertIsDisplayed()
-            rule.runOnIdle {
-                scope.launch {
-                    pagerState.scroll {
-                        scrollBy(pagerSize.toFloat())
-                    }
-                }
-            }
+            rule.runOnIdle { scope.launch { pagerState.scroll { scrollBy(pagerSize.toFloat()) } } }
             rule.waitForIdle()
         }
     }
@@ -176,10 +144,10 @@
         rule.setContent {
             HorizontalOrVerticalPager(
                 state = state,
-                modifier = Modifier
-                    .fillMaxSize()
-                    .testTag(PagerTestTag)
-                    .onSizeChanged { pagerSize = if (vertical) it.height else it.width },
+                modifier =
+                    Modifier.fillMaxSize().testTag(PagerTestTag).onSizeChanged {
+                        pagerSize = if (vertical) it.height else it.width
+                    },
                 pageSize = PageSize.Fill,
                 reverseLayout = config.reverseLayout,
                 pageSpacing = config.pageSpacing,
@@ -204,10 +172,8 @@
         rule.setContent {
             HorizontalOrVerticalPager(
                 state = state,
-                modifier = Modifier
-                    .fillMaxSize()
-                    .testTag(PagerTestTag)
-                    .composed {
+                modifier =
+                    Modifier.fillMaxSize().testTag(PagerTestTag).composed {
                         recomposeCount++
                         Modifier
                     },
@@ -236,9 +202,7 @@
         rule.setContent {
             HorizontalOrVerticalPager(
                 state = state,
-                modifier = Modifier
-                    .fillMaxSize()
-                    .testTag(PagerTestTag),
+                modifier = Modifier.fillMaxSize().testTag(PagerTestTag),
                 pageSize = PageSize.Fill,
                 reverseLayout = config.reverseLayout,
                 pageSpacing = config.pageSpacing,
@@ -248,11 +212,7 @@
             }
         }
 
-        rule.runOnIdle {
-            runBlocking {
-                state.scrollToPage(3)
-            }
-        }
+        rule.runOnIdle { runBlocking { state.scrollToPage(3) } }
         rule.runOnIdle { assertThat(state.currentPage).isEqualTo(3) }
         pageCount.value = 2 // change count, less than current page
         rule.runOnIdle {
@@ -269,11 +229,7 @@
         createPager(modifier = Modifier.fillMaxSize(), pageCount = { Int.MAX_VALUE })
 
         // Assert
-        rule.runOnIdle {
-            scope.launch {
-                pagerState.scrollToPage(Int.MAX_VALUE)
-            }
-        }
+        rule.runOnIdle { scope.launch { pagerState.scrollToPage(Int.MAX_VALUE) } }
         rule.waitForIdle()
         rule.onNodeWithTag("${Int.MAX_VALUE - 1}").assertIsDisplayed()
     }
@@ -287,36 +243,23 @@
         fun MyComposable(data: List<Int>) {
             pagerState = rememberPagerState { data.size }
             HorizontalPager(
-                modifier = Modifier
-                    .fillMaxSize()
-                    .testTag("pager"),
+                modifier = Modifier.fillMaxSize().testTag("pager"),
                 state = pagerState,
                 key = { data[it] }
             ) {
-                Spacer(
-                    Modifier
-                        .fillMaxSize()
-                )
+                Spacer(Modifier.fillMaxSize())
             }
         }
 
-        rule.setContent {
-            MyComposable(listA.value)
-        }
+        rule.setContent { MyComposable(listA.value) }
 
-        rule.runOnIdle {
-            listA.value = listOf(1, 2)
-        }
+        rule.runOnIdle { listA.value = listOf(1, 2) }
 
         assertThat(listA.value.size).isEqualTo(2)
 
-        rule.onNodeWithTag("pager").performTouchInput {
-            swipeLeft()
-        }
+        rule.onNodeWithTag("pager").performTouchInput { swipeLeft() }
 
-        rule.runOnIdle {
-            assertThat(pagerState.currentPage).isEqualTo(1)
-        }
+        rule.runOnIdle { assertThat(pagerState.currentPage).isEqualTo(1) }
     }
 
     @Test
@@ -326,25 +269,22 @@
         val stateHolder = mutableStateOf(PagerState(0, 0.0f) { 10 })
         rule.setContent {
             HorizontalOrVerticalPager(
-                modifier = Modifier
-                    .fillMaxSize()
-                    .testTag(PagerTestTag),
+                modifier = Modifier.fillMaxSize().testTag(PagerTestTag),
                 state = stateHolder.value,
                 pageSize = PageSize.Fill,
-                flingBehavior = PagerDefaults.flingBehavior(state = stateHolder.value).also {
-                    latestFlingBehavior = it
-                    if (previousFlingBehavior == null) {
-                        previousFlingBehavior = it
+                flingBehavior =
+                    PagerDefaults.flingBehavior(state = stateHolder.value).also {
+                        latestFlingBehavior = it
+                        if (previousFlingBehavior == null) {
+                            previousFlingBehavior = it
+                        }
                     }
-                }
             ) {
                 Page(index = it)
             }
         }
 
-        rule.runOnIdle {
-            stateHolder.value = PagerState(0, 0.0f) { 20 }
-        }
+        rule.runOnIdle { stateHolder.value = PagerState(0, 0.0f) { 20 } }
 
         rule.waitForIdle()
         assertThat(previousFlingBehavior).isNotEqualTo(latestFlingBehavior)
@@ -356,7 +296,8 @@
         createPager(
             modifier = Modifier.size(500.dp),
             pageSize = { PageSize.Fixed(100.dp) },
-            pageCount = { 3 })
+            pageCount = { 3 }
+        )
 
         confirmPageIsInCorrectPosition(0, pageToVerifyPosition = 0)
         confirmPageIsInCorrectPosition(0, pageToVerifyPosition = 1)
@@ -368,15 +309,11 @@
         val snapPosition = mutableStateOf<SnapPosition>(SnapPosition.Start)
         rule.setContent {
             HorizontalOrVerticalPager(
-                modifier = Modifier
-                    .fillMaxSize()
-                    .testTag(PagerTestTag)
-                    .onSizeChanged { pagerSize = if (vertical) it.height else it.width },
-                state = rememberPagerState(initialPage = 5) {
-                    40
-                }.also {
-                    pagerState = it
-                },
+                modifier =
+                    Modifier.fillMaxSize().testTag(PagerTestTag).onSizeChanged {
+                        pagerSize = if (vertical) it.height else it.width
+                    },
+                state = rememberPagerState(initialPage = 5) { 40 }.also { pagerState = it },
                 pageSize = PageSize.Fixed(250.dp), // make sure pages bleed in the layout
                 snapPosition = snapPosition.value
             ) {
@@ -390,9 +327,7 @@
             assertThat(pagerState.layoutInfo.visiblePagesInfo.first().offset).isEqualTo(0)
         }
 
-        rule.runOnUiThread {
-            snapPosition.value = SnapPosition.End
-        }
+        rule.runOnUiThread { snapPosition.value = SnapPosition.End }
 
         rule.runOnIdle {
             assertThat(pagerState.currentPage).isEqualTo(5)
@@ -407,15 +342,11 @@
         val pagerSizeDp = mutableStateOf(500.dp)
         rule.setContent {
             HorizontalOrVerticalPager(
-                modifier = Modifier
-                    .mainAxisSize(pagerSizeDp.value)
-                    .testTag(PagerTestTag)
-                    .onSizeChanged { pagerSize = if (vertical) it.height else it.width },
-                state = rememberPagerState(initialPage = 5) {
-                    40
-                }.also {
-                    pagerState = it
-                },
+                modifier =
+                    Modifier.mainAxisSize(pagerSizeDp.value).testTag(PagerTestTag).onSizeChanged {
+                        pagerSize = if (vertical) it.height else it.width
+                    },
+                state = rememberPagerState(initialPage = 5) { 40 }.also { pagerState = it },
                 pageSize = PageSize.Fixed(100.dp),
                 snapPosition = SnapPosition.Center // snap position that depends on pager size
             ) {
@@ -431,9 +362,7 @@
         }
 
         val previousPagerSize = pagerSize
-        rule.runOnUiThread {
-            pagerSizeDp.value = 300.dp
-        }
+        rule.runOnUiThread { pagerSizeDp.value = 300.dp }
 
         // make sure we continue in the same place
         rule.runOnIdle {
@@ -450,15 +379,11 @@
         val pageSizeDp = mutableStateOf(PageSize.Fixed(200.dp))
         rule.setContent {
             HorizontalOrVerticalPager(
-                modifier = Modifier
-                    .fillMaxSize()
-                    .testTag(PagerTestTag)
-                    .onSizeChanged { pagerSize = if (vertical) it.height else it.width },
-                state = rememberPagerState(initialPage = 5) {
-                    40
-                }.also {
-                    pagerState = it
-                },
+                modifier =
+                    Modifier.fillMaxSize().testTag(PagerTestTag).onSizeChanged {
+                        pagerSize = if (vertical) it.height else it.width
+                    },
+                state = rememberPagerState(initialPage = 5) { 40 }.also { pagerState = it },
                 pageSize = pageSizeDp.value,
                 snapPosition = SnapPosition.End // snap position that depends on page size
             ) {
@@ -474,9 +399,7 @@
         }
 
         val previousPageSize = pageSize
-        rule.runOnUiThread {
-            pageSizeDp.value = PageSize.Fixed(250.dp)
-        }
+        rule.runOnUiThread { pageSizeDp.value = PageSize.Fixed(250.dp) }
 
         // make sure we continue in the same place
         rule.runOnIdle {
@@ -490,12 +413,13 @@
 
     @Test
     fun flingOnUnattachedPager_shouldNotCrash() {
-        val pageSize = object : PageSize {
-            override fun Density.calculateMainAxisPageSize(
-                availableSpace: Int,
-                pageSpacing: Int
-            ): Int = 0
-        }
+        val pageSize =
+            object : PageSize {
+                override fun Density.calculateMainAxisPageSize(
+                    availableSpace: Int,
+                    pageSpacing: Int
+                ): Int = 0
+            }
 
         createPager(pageSize = { pageSize }, modifier = Modifier.fillMaxSize())
 
@@ -509,17 +433,9 @@
         createPager(modifier = Modifier.fillMaxSize())
 
         val measurements = pagerState.numMeasurePasses
-        rule.runOnIdle {
-            runBlocking {
-                pagerState.scrollBy(0f)
-            }
-        }
+        rule.runOnIdle { runBlocking { pagerState.scrollBy(0f) } }
         assertThat(measurements).isEqualTo(pagerState.numMeasurePasses)
-        rule.runOnIdle {
-            runBlocking {
-                pagerState.scrollBy(-0f)
-            }
-        }
+        rule.runOnIdle { runBlocking { pagerState.scrollBy(-0f) } }
         assertThat(measurements).isEqualTo(pagerState.numMeasurePasses)
     }
 
@@ -552,8 +468,6 @@
     }
 
     companion object {
-        @JvmStatic
-        @Parameterized.Parameters(name = "{0}")
-        fun params() = AllOrientationsParams
+        @JvmStatic @Parameterized.Parameters(name = "{0}") fun params() = AllOrientationsParams
     }
 }
diff --git a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/pager/SingleParamBasePagerTest.kt b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/pager/SingleParamBasePagerTest.kt
index 751d4a1..3d6910e 100644
--- a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/pager/SingleParamBasePagerTest.kt
+++ b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/pager/SingleParamBasePagerTest.kt
@@ -68,8 +68,7 @@
 @OptIn(ExperimentalFoundationApi::class)
 open class SingleParamBasePagerTest {
 
-    @get:Rule
-    val rule = createParameterizedComposeTestRule<SingleParamConfig>()
+    @get:Rule val rule = createParameterizedComposeTestRule<SingleParamConfig>()
 
     lateinit var scope: CoroutineScope
     var pagerSize: Int = 0
@@ -93,7 +92,7 @@
         userScrollEnabled: Boolean = true,
         snappingPage: PagerSnapDistance = PagerSnapDistance.atMost(1),
         nestedScrollConnection: NestedScrollConnection = object : NestedScrollConnection {},
-        additionalContent: @Composable () -> Unit = { },
+        additionalContent: @Composable () -> Unit = {},
         contentPadding: PaddingValues = PaddingValues(0.dp),
         pageSpacing: Dp = 0.dp,
         reverseLayout: Boolean = false,
@@ -103,15 +102,13 @@
         flingBehavior: TargetedFlingBehavior? = null,
         layoutDirection: LayoutDirection = LayoutDirection.Ltr,
         pageContent: @Composable PagerScope.(page: Int) -> Unit = { page ->
-            Page(
-                index = page,
-                orientation = orientation
-            )
+            Page(index = page, orientation = orientation)
         }
     ) {
-        val state = rememberPagerState(initialPage, initialPageOffsetFraction, pageCount).also {
-            pagerState = it
-        }
+        val state =
+            rememberPagerState(initialPage, initialPageOffsetFraction, pageCount).also {
+                pagerState = it
+            }
         composeView = LocalView.current
         focusManager = LocalFocusManager.current
 
@@ -119,25 +116,22 @@
             LocalLayoutDirection provides layoutDirection,
             LocalOverscrollConfiguration provides null
         ) {
-            val resolvedFlingBehavior = flingBehavior ?: PagerDefaults.flingBehavior(
-                state = state,
-                pagerSnapDistance = snappingPage,
-                snapPositionalThreshold = snapPositionalThreshold
-            )
+            val resolvedFlingBehavior =
+                flingBehavior
+                    ?: PagerDefaults.flingBehavior(
+                        state = state,
+                        pagerSnapDistance = snappingPage,
+                        snapPositionalThreshold = snapPositionalThreshold
+                    )
 
             scope = rememberCoroutineScope()
-            Box(
-                modifier = Modifier
-                    .fillMaxSize()
-                    .nestedScroll(nestedScrollConnection)
-            ) {
+            Box(modifier = Modifier.fillMaxSize().nestedScroll(nestedScrollConnection)) {
                 HorizontalOrVerticalPager(
                     state = state,
                     beyondViewportPageCount = beyondViewportPageCount,
                     orientation = orientation,
-                    modifier = modifier
-                        .testTag(PagerTestTag)
-                        .onSizeChanged {
+                    modifier =
+                        modifier.testTag(PagerTestTag).onSizeChanged {
                             pagerSize =
                                 if (orientation == Orientation.Vertical) it.height else it.width
                         },
@@ -158,27 +152,28 @@
 
     @Composable
     internal fun Page(index: Int, orientation: Orientation, initialFocusedItemIndex: Int = 0) {
-        val focusRequester = FocusRequester().also {
-            if (index == initialFocusedItemIndex) initialFocusedItem = it
-        }
-        Box(modifier = Modifier
-            .focusRequester(focusRequester)
-            .onPlaced {
-                placed.add(index)
-                pageSize =
-                    if (orientation == Orientation.Vertical) it.size.height else it.size.width
-            }
-            .fillMaxSize()
-            .background(if (index % 2 == 0) Color.Blue else Color.Red)
-            .testTag("$index")
-            .onFocusChanged {
-                if (it.isFocused) {
-                    focused.add(index)
-                } else {
-                    focused.remove(index)
-                }
-            }
-            .focusable(),
+        val focusRequester =
+            FocusRequester().also { if (index == initialFocusedItemIndex) initialFocusedItem = it }
+        Box(
+            modifier =
+                Modifier.focusRequester(focusRequester)
+                    .onPlaced {
+                        placed.add(index)
+                        pageSize =
+                            if (orientation == Orientation.Vertical) it.size.height
+                            else it.size.width
+                    }
+                    .fillMaxSize()
+                    .background(if (index % 2 == 0) Color.Blue else Color.Red)
+                    .testTag("$index")
+                    .onFocusChanged {
+                        if (it.isFocused) {
+                            focused.add(index)
+                        } else {
+                            focused.remove(index)
+                        }
+                    }
+                    .focusable(),
             contentAlignment = Alignment.Center
         ) {
             BasicText(text = index.toString())
@@ -243,24 +238,25 @@
         pageToVerifyPosition: Int = currentPageIndex,
         pageOffset: Float = 0f,
     ) {
-        val leftContentPadding =
-            mainAxisContentPadding.calculateLeftPadding(layoutDirection)
+        val leftContentPadding = mainAxisContentPadding.calculateLeftPadding(layoutDirection)
         val topContentPadding = mainAxisContentPadding.calculateTopPadding()
 
-        val (left, top) = with(rule.density) {
-            val spacings = pageSpacing.roundToPx()
-            val initialPageOffset = currentPageIndex * (pageSize + spacings)
+        val (left, top) =
+            with(rule.density) {
+                val spacings = pageSpacing.roundToPx()
+                val initialPageOffset = currentPageIndex * (pageSize + spacings)
 
-            val position = pageToVerifyPosition * (pageSize + spacings) - initialPageOffset
-            val positionWithOffset =
-                position + (pageSize + spacings) * pageOffset * scrollForwardSign
-            if (orientation == Orientation.Vertical) {
-                0.dp to positionWithOffset.toDp()
-            } else {
-                positionWithOffset.toDp() to 0.dp
+                val position = pageToVerifyPosition * (pageSize + spacings) - initialPageOffset
+                val positionWithOffset =
+                    position + (pageSize + spacings) * pageOffset * scrollForwardSign
+                if (orientation == Orientation.Vertical) {
+                    0.dp to positionWithOffset.toDp()
+                } else {
+                    positionWithOffset.toDp() to 0.dp
+                }
             }
-        }
-        rule.onNodeWithTag("$pageToVerifyPosition")
+        rule
+            .onNodeWithTag("$pageToVerifyPosition")
             .assertPositionInRootIsEqualTo(left + leftContentPadding, top + topContentPadding)
     }
 
@@ -288,19 +284,17 @@
     val beyondViewportPageCount: Int = 0,
     val snapPosition: Pair<SnapPosition, String> = SnapPosition.Start to "Start",
 ) {
-    fun TouchInjectionScope.swipeWithVelocityAcrossMainAxis(
-        velocity: Float,
-        delta: Float? = null
-    ) {
-        val end = if (delta == null) {
-            layoutEnd
-        } else {
-            if (orientation == Orientation.Vertical) {
-                layoutStart.copy(y = layoutStart.y + delta)
+    fun TouchInjectionScope.swipeWithVelocityAcrossMainAxis(velocity: Float, delta: Float? = null) {
+        val end =
+            if (delta == null) {
+                layoutEnd
             } else {
-                layoutStart.copy(x = layoutStart.x + delta)
+                if (orientation == Orientation.Vertical) {
+                    layoutStart.copy(y = layoutStart.y + delta)
+                } else {
+                    layoutStart.copy(x = layoutStart.x + delta)
+                }
             }
-        }
         swipeWithVelocity(layoutStart, end, velocity)
     }
 
@@ -353,27 +347,28 @@
             }
 
     val scrollForwardSign: Int
-        get() = if (orientation == Orientation.Vertical) {
-            if (reverseLayout && layoutDirection == LayoutDirection.Rtl) {
-                1
-            } else if (!reverseLayout && layoutDirection == LayoutDirection.Rtl) {
-                -1
-            } else if (reverseLayout && layoutDirection == LayoutDirection.Ltr) {
-                1
+        get() =
+            if (orientation == Orientation.Vertical) {
+                if (reverseLayout && layoutDirection == LayoutDirection.Rtl) {
+                    1
+                } else if (!reverseLayout && layoutDirection == LayoutDirection.Rtl) {
+                    -1
+                } else if (reverseLayout && layoutDirection == LayoutDirection.Ltr) {
+                    1
+                } else {
+                    -1
+                }
             } else {
-                -1
+                if (reverseLayout && layoutDirection == LayoutDirection.Rtl) {
+                    -1
+                } else if (!reverseLayout && layoutDirection == LayoutDirection.Rtl) {
+                    1
+                } else if (reverseLayout && layoutDirection == LayoutDirection.Ltr) {
+                    1
+                } else {
+                    -1
+                }
             }
-        } else {
-            if (reverseLayout && layoutDirection == LayoutDirection.Rtl) {
-                -1
-            } else if (!reverseLayout && layoutDirection == LayoutDirection.Rtl) {
-                1
-            } else if (reverseLayout && layoutDirection == LayoutDirection.Ltr) {
-                1
-            } else {
-                -1
-            }
-        }
 
     val vertical: Boolean
         get() = orientation == Orientation.Vertical
diff --git a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/pager/TestPrefetchScheduler.kt b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/pager/TestPrefetchScheduler.kt
index 04c60b750..ee02702 100644
--- a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/pager/TestPrefetchScheduler.kt
+++ b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/pager/TestPrefetchScheduler.kt
@@ -25,18 +25,18 @@
 internal class TestPrefetchScheduler : PrefetchScheduler {
 
     private var activeRequests = mutableListOf<PrefetchRequest>()
+
     override fun schedulePrefetch(prefetchRequest: PrefetchRequest) {
         activeRequests.add(prefetchRequest)
     }
 
     fun executeActiveRequests() {
-        activeRequests.forEach {
-            with(it) { scope.execute() }
-        }
+        activeRequests.forEach { with(it) { scope.execute() } }
         activeRequests.clear()
     }
 
-    private val scope = object : PrefetchRequestScope {
-        override fun availableTimeNanos(): Long = Long.MAX_VALUE
-    }
+    private val scope =
+        object : PrefetchRequestScope {
+            override fun availableTimeNanos(): Long = Long.MAX_VALUE
+        }
 }
diff --git a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/relocation/BringIntoViewRequesterViewIntegrationTest.kt b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/relocation/BringIntoViewRequesterViewIntegrationTest.kt
index a39b9af..9eb384f 100644
--- a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/relocation/BringIntoViewRequesterViewIntegrationTest.kt
+++ b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/relocation/BringIntoViewRequesterViewIntegrationTest.kt
@@ -50,8 +50,7 @@
 @RunWith(AndroidJUnit4::class)
 class BringIntoViewRequesterViewIntegrationTest {
 
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
     @Test
     fun bringIntoView_callsViewRequestRectangleOnScreen_whenNoResponder() {
@@ -81,9 +80,7 @@
         }
 
         rule.waitForIdle()
-        scope.launch {
-            bringIntoViewRequester.bringIntoView(rectangleToRequest)
-        }
+        scope.launch { bringIntoViewRequester.bringIntoView(rectangleToRequest) }
 
         rule.runOnIdle {
             val request = parent.requests.single()
@@ -108,11 +105,7 @@
                 val child = ComposeView(context)
                 parent += child
                 child.setContent {
-                    Box(
-                        Modifier
-                            .size(10.dp)
-                            .fakeScrollable(scrollOffset) {}
-                    ) {
+                    Box(Modifier.size(10.dp).fakeScrollable(scrollOffset) {}) {
                         Box(
                             Modifier
                                 // Make it bigger than the scrollable so it can actually scroll.
@@ -129,9 +122,7 @@
         }
 
         rule.waitForIdle()
-        scope.launch {
-            bringIntoViewRequester.bringIntoView(rectangleToRequest)
-        }
+        scope.launch { bringIntoViewRequester.bringIntoView(rectangleToRequest) }
 
         rule.runOnIdle {
             val request = parent.requests.single()
@@ -152,9 +143,10 @@
         rule.setContent {
             scope = rememberCoroutineScope()
             AndroidView(
-                modifier = Modifier
-                    // This offset needs to be non-zero or it won't see the request at all.
-                    .fakeScrollable { requests += it() },
+                modifier =
+                    Modifier
+                        // This offset needs to be non-zero or it won't see the request at all.
+                        .fakeScrollable { requests += it() },
                 factory = { context ->
                     val parent = FakeScrollable(context)
                     val child = ComposeView(context)
@@ -174,23 +166,16 @@
         }
 
         rule.waitForIdle()
-        scope.launch {
-            bringIntoViewRequester.bringIntoView(rectangleToRequest)
-        }
+        scope.launch { bringIntoViewRequester.bringIntoView(rectangleToRequest) }
 
-        rule.runOnIdle {
-            assertThat(requests.single()).isEqualTo(expectedRectangle)
-        }
+        rule.runOnIdle { assertThat(requests.single()).isEqualTo(expectedRectangle) }
     }
 
     /** A view that records calls to [requestChildRectangleOnScreen] for testing. */
     private class FakeScrollable(context: Context) : FrameLayout(context) {
         val requests = mutableListOf<RectangleRequest>()
 
-        data class RectangleRequest(
-            val rectangle: AndroidRect,
-            val immediate: Boolean
-        )
+        data class RectangleRequest(val rectangle: AndroidRect, val immediate: Boolean)
 
         override fun requestChildRectangleOnScreen(
             child: View,
diff --git a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/relocation/BringIntoViewResponderTest.kt b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/relocation/BringIntoViewResponderTest.kt
index 80ab99a..da17d00 100644
--- a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/relocation/BringIntoViewResponderTest.kt
+++ b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/relocation/BringIntoViewResponderTest.kt
@@ -49,8 +49,7 @@
 @RunWith(AndroidJUnit4::class)
 class BringIntoViewResponderTest {
 
-    @get:Rule
-    val rule = createAndroidComposeRule<TestActivity>()
+    @get:Rule val rule = createAndroidComposeRule<TestActivity>()
 
     private fun Float.toDp(): Dp = with(rule.density) { this@toDp.toDp() }
 
@@ -61,21 +60,16 @@
         var requestedRect: Rect? = null
         rule.setContent {
             Box(
-                Modifier
-                    .fakeScrollable { requestedRect = it() }
+                Modifier.fakeScrollable { requestedRect = it() }
                     .bringIntoViewRequester(bringIntoViewRequester)
             )
         }
 
         // Act.
-        runBlocking {
-            bringIntoViewRequester.bringIntoView()
-        }
+        runBlocking { bringIntoViewRequester.bringIntoView() }
 
         // Assert.
-        rule.runOnIdle {
-            assertThat(requestedRect).isEqualTo(Rect.Zero)
-        }
+        rule.runOnIdle { assertThat(requestedRect).isEqualTo(Rect.Zero) }
     }
 
     @Test
@@ -85,8 +79,7 @@
         var requestedRect: Rect? = null
         rule.setContent {
             Box(
-                Modifier
-                    .fakeScrollable { requestedRect = it() }
+                Modifier.fakeScrollable { requestedRect = it() }
                     .bringIntoViewRequester(bringIntoViewRequester)
             )
         }
@@ -95,9 +88,7 @@
         runBlocking { bringIntoViewRequester.bringIntoView(Rect(1f, 2f, 3f, 4f)) }
 
         // Assert.
-        rule.runOnIdle {
-            assertThat(requestedRect).isEqualTo(Rect(1f, 2f, 3f, 4f))
-        }
+        rule.runOnIdle { assertThat(requestedRect).isEqualTo(Rect(1f, 2f, 3f, 4f)) }
     }
 
     @Test
@@ -108,8 +99,7 @@
         rule.setContent {
             Box(Modifier) {
                 Box(
-                    Modifier
-                        .fakeScrollable { requestedRect = it() }
+                    Modifier.fakeScrollable { requestedRect = it() }
                         .size(20f.toDp(), 10f.toDp())
                         .offset { IntOffset(40, 30) }
                         .bringIntoViewRequester(bringIntoViewRequester)
@@ -121,9 +111,7 @@
         runBlocking { bringIntoViewRequester.bringIntoView() }
 
         // Assert.
-        rule.runOnIdle {
-            assertThat(requestedRect).isEqualTo(Rect(40f, 30f, 60f, 40f))
-        }
+        rule.runOnIdle { assertThat(requestedRect).isEqualTo(Rect(40f, 30f, 60f, 40f)) }
     }
 
     @Test
@@ -133,8 +121,7 @@
         var requestedRect: Rect? = null
         rule.setContent {
             Box(
-                Modifier
-                    .size(1f.toDp())
+                Modifier.size(1f.toDp())
                     .fakeScrollable { requestedRect = it() }
                     .bringIntoViewRequester(bringIntoViewRequester)
                     .size(20f.toDp(), 10f.toDp())
@@ -145,9 +132,7 @@
         runBlocking { bringIntoViewRequester.bringIntoView() }
 
         // Assert.
-        rule.runOnIdle {
-            assertThat(requestedRect).isEqualTo(Rect(0f, 0f, 20f, 10f))
-        }
+        rule.runOnIdle { assertThat(requestedRect).isEqualTo(Rect(0f, 0f, 20f, 10f)) }
     }
 
     @Test
@@ -158,8 +143,7 @@
         val bringIntoViewRequester = BringIntoViewRequester()
         rule.setContent {
             Box(
-                Modifier
-                    .fakeScrollable { parentRequest = it() }
+                Modifier.fakeScrollable { parentRequest = it() }
                     .bringIntoViewRequester(bringIntoViewRequester)
                     .fakeScrollable { childRequest = it() }
             )
@@ -183,8 +167,7 @@
         val bringIntoViewRequester = BringIntoViewRequester()
         rule.setContent {
             Box(
-                Modifier
-                    .fakeScrollable { parentRequest = it() }
+                Modifier.fakeScrollable { parentRequest = it() }
                     .fakeScrollable { childRequest = it() }
                     .bringIntoViewRequester(bringIntoViewRequester)
             )
@@ -207,8 +190,7 @@
         val bringIntoViewRequester = BringIntoViewRequester()
         rule.setContent {
             Box(
-                Modifier
-                    .fakeScrollable { requestedRect = it() }
+                Modifier.fakeScrollable { requestedRect = it() }
                     .fakeScrollable(Offset(2f, 3f)) {}
                     .bringIntoViewRequester(bringIntoViewRequester)
             )
@@ -218,9 +200,7 @@
         runBlocking { bringIntoViewRequester.bringIntoView() }
 
         // Assert.
-        rule.runOnIdle {
-            assertThat(requestedRect).isEqualTo(Rect(2f, 3f, 2f, 3f))
-        }
+        rule.runOnIdle { assertThat(requestedRect).isEqualTo(Rect(2f, 3f, 2f, 3f)) }
     }
 
     @Test
@@ -231,25 +211,18 @@
         val requestScope = TestScope()
         rule.setContent {
             Box(
-                Modifier
-                    .fakeScrollable {
-                        suspendCancellableCoroutine { requests += it }
-                    }
+                Modifier.fakeScrollable { suspendCancellableCoroutine { requests += it } }
                     .bringIntoViewRequester(bringIntoViewRequester)
             )
         }
 
         // Act.
-        requestScope.launch {
-            bringIntoViewRequester.bringIntoView(rect = Rect(0f, 0f, 10f, 10f))
-        }
+        requestScope.launch { bringIntoViewRequester.bringIntoView(rect = Rect(0f, 0f, 10f, 10f)) }
         requestScope.advanceUntilIdle()
         val initialRequest = requests.single()
         assertThat(initialRequest.isActive).isTrue()
 
-        requestScope.launch {
-            bringIntoViewRequester.bringIntoView(rect = Rect(5f, 5f, 15f, 15f))
-        }
+        requestScope.launch { bringIntoViewRequester.bringIntoView(rect = Rect(5f, 5f, 15f, 15f)) }
         requestScope.advanceUntilIdle()
         assertThat(requests).hasSize(2)
         val newRequest = requests.last()
@@ -265,18 +238,13 @@
         val requestScope = TestScope()
         rule.setContent {
             Box(
-                Modifier
-                    .fakeScrollable {
-                        suspendCancellableCoroutine { requests += it }
-                    }
+                Modifier.fakeScrollable { suspendCancellableCoroutine { requests += it } }
                     .bringIntoViewRequester(bringIntoViewRequester)
             )
         }
 
         // Act.
-        requestScope.launch {
-            bringIntoViewRequester.bringIntoView(rect = Rect(0f, 0f, 10f, 10f))
-        }
+        requestScope.launch { bringIntoViewRequester.bringIntoView(rect = Rect(0f, 0f, 10f, 10f)) }
         requestScope.advanceUntilIdle()
         val initialRequest = requests.single()
         assertThat(initialRequest.isActive).isTrue()
@@ -303,16 +271,11 @@
         val requestScope = TestScope()
         rule.setContent {
             Box(
-                Modifier
-                    .fakeScrollable {
-                        suspendCancellableCoroutine { requests += it }
-                    }
+                Modifier.fakeScrollable { suspendCancellableCoroutine { requests += it } }
                     .bringIntoViewRequester(bringIntoViewRequester)
             )
         }
-        requestScope.launch {
-            bringIntoViewRequester.bringIntoView(rect = Rect(0f, 0f, 10f, 10f))
-        }
+        requestScope.launch { bringIntoViewRequester.bringIntoView(rect = Rect(0f, 0f, 10f, 10f)) }
         requestScope.advanceUntilIdle()
         assertThat(requests).hasSize(1)
 
@@ -337,19 +300,12 @@
         val requestScope = TestScope()
         rule.setContent {
             Box(
-                Modifier
-                    .fakeScrollable {
-                        suspendCancellableCoroutine { parentRequests += it }
-                    }
-                    .fakeScrollable {
-                        suspendCancellableCoroutine { childRequests += it }
-                    }
+                Modifier.fakeScrollable { suspendCancellableCoroutine { parentRequests += it } }
+                    .fakeScrollable { suspendCancellableCoroutine { childRequests += it } }
                     .bringIntoViewRequester(bringIntoViewRequester)
             )
         }
-        requestScope.launch {
-            bringIntoViewRequester.bringIntoView(rect = Rect(0f, 0f, 10f, 10f))
-        }
+        requestScope.launch { bringIntoViewRequester.bringIntoView(rect = Rect(0f, 0f, 10f, 10f)) }
         requestScope.advanceUntilIdle()
         assertThat(childRequests).hasSize(1)
         assertThat(parentRequests).hasSize(1)
@@ -370,19 +326,12 @@
         val requestScope = TestScope()
         rule.setContent {
             Box(
-                Modifier
-                    .fakeScrollable {
-                        suspendCancellableCoroutine { parentRequests += it }
-                    }
-                    .fakeScrollable {
-                        suspendCancellableCoroutine { childRequests += it }
-                    }
+                Modifier.fakeScrollable { suspendCancellableCoroutine { parentRequests += it } }
+                    .fakeScrollable { suspendCancellableCoroutine { childRequests += it } }
                     .bringIntoViewRequester(bringIntoViewRequester)
             )
         }
-        requestScope.launch {
-            bringIntoViewRequester.bringIntoView(rect = Rect(0f, 0f, 10f, 10f))
-        }
+        requestScope.launch { bringIntoViewRequester.bringIntoView(rect = Rect(0f, 0f, 10f, 10f)) }
         requestScope.advanceUntilIdle()
         assertThat(childRequests).hasSize(1)
         assertThat(parentRequests).hasSize(1)
@@ -402,16 +351,11 @@
         val requestScope = TestScope()
         rule.setContent {
             Box(
-                Modifier
-                    .fakeScrollable {
-                        suspendCancellableCoroutine { requests += it }
-                    }
+                Modifier.fakeScrollable { suspendCancellableCoroutine { requests += it } }
                     .bringIntoViewRequester(bringIntoViewRequester)
             )
         }
-        requestScope.launch {
-            bringIntoViewRequester.bringIntoView(rect = Rect(0f, 0f, 10f, 10f))
-        }
+        requestScope.launch { bringIntoViewRequester.bringIntoView(rect = Rect(0f, 0f, 10f, 10f)) }
         requestScope.advanceUntilIdle()
         assertThat(requests).hasSize(1)
 
@@ -436,10 +380,7 @@
         val requestScope = TestScope()
         rule.setContent {
             Box(
-                Modifier
-                    .fakeScrollable {
-                        suspendCancellableCoroutine { requests += it }
-                    }
+                Modifier.fakeScrollable { suspendCancellableCoroutine { requests += it } }
                     .fakeScrollable {
                         // Child never completes requests.
                         suspendCancellableCoroutine {}
@@ -447,9 +388,7 @@
                     .bringIntoViewRequester(bringIntoViewRequester)
             )
         }
-        requestScope.launch {
-            bringIntoViewRequester.bringIntoView(rect = Rect(0f, 0f, 10f, 10f))
-        }
+        requestScope.launch { bringIntoViewRequester.bringIntoView(rect = Rect(0f, 0f, 10f, 10f)) }
         requestScope.advanceUntilIdle()
         assertThat(requests).hasSize(1)
 
@@ -471,8 +410,7 @@
         val bringIntoViewRequester = BringIntoViewRequester()
         rule.setContent {
             Box(
-                Modifier
-                    .fakeScrollable(Offset.Zero) { requestedRect = it() }
+                Modifier.fakeScrollable(Offset.Zero) { requestedRect = it() }
                     .bringIntoViewRequester(bringIntoViewRequester)
             )
         }
@@ -481,9 +419,7 @@
         runBlocking { bringIntoViewRequester.bringIntoView() }
 
         // Assert.
-        rule.runOnIdle {
-            assertThat(requestedRect).isEqualTo(Rect.Zero)
-        }
+        rule.runOnIdle { assertThat(requestedRect).isEqualTo(Rect.Zero) }
     }
 
     @OptIn(ExperimentalCoroutinesApi::class)
@@ -497,8 +433,7 @@
         val bringIntoViewRequester = BringIntoViewRequester()
         rule.setContent {
             Box(
-                Modifier
-                    .fakeScrollable {
+                Modifier.fakeScrollable {
                         parentStarted = true
                         try {
                             awaitCancellation()
@@ -518,9 +453,7 @@
             )
         }
         val testScope = TestScope()
-        val requestJob = testScope.launch {
-            bringIntoViewRequester.bringIntoView()
-        }
+        val requestJob = testScope.launch { bringIntoViewRequester.bringIntoView() }
         rule.waitForIdle()
 
         assertThat(childStarted).isFalse()
diff --git a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/relocation/BringIntoViewScrollableInteractionTest.kt b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/relocation/BringIntoViewScrollableInteractionTest.kt
index e39a9c9..627465c 100644
--- a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/relocation/BringIntoViewScrollableInteractionTest.kt
+++ b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/relocation/BringIntoViewScrollableInteractionTest.kt
@@ -79,16 +79,14 @@
 @RunWith(Parameterized::class)
 class BringIntoViewScrollableInteractionTest(private val orientation: Orientation) {
 
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
     private val parentBox = "parent box"
     private val childBox = "child box"
 
     /**
-     * Captures a scope from inside the composition for [runBlockingAndAwaitIdle].
-     * Make sure to call [setContentAndInitialize] instead of calling `rule.setContent` to
-     * initialize this.
+     * Captures a scope from inside the composition for [runBlockingAndAwaitIdle]. Make sure to call
+     * [setContentAndInitialize] instead of calling `rule.setContent` to initialize this.
      */
     private lateinit var testScope: CoroutineScope
 
@@ -104,8 +102,7 @@
         val bringIntoViewRequester = BringIntoViewRequester()
         setContentAndInitialize {
             Box(
-                Modifier
-                    .then(
+                Modifier.then(
                         when (orientation) {
                             Horizontal -> Modifier.size(100.toDp(), 50.toDp())
                             Vertical -> Modifier.size(50.toDp(), 100.toDp())
@@ -115,8 +112,7 @@
                     .background(LightGray)
             ) {
                 Box(
-                    Modifier
-                        .size(50.toDp())
+                    Modifier.size(50.toDp())
                         .background(Blue)
                         .bringIntoViewRequester(bringIntoViewRequester)
                         .testTag(childBox)
@@ -139,8 +135,7 @@
         val bringIntoViewRequester = BringIntoViewRequester()
         setContentAndInitialize {
             Box(
-                Modifier
-                    .then(
+                Modifier.then(
                         when (orientation) {
                             Horizontal -> Modifier.size(100.toDp(), 50.toDp())
                             Vertical -> Modifier.size(50.toDp(), 100.toDp())
@@ -150,8 +145,7 @@
                     .background(LightGray)
             ) {
                 Box(
-                    Modifier
-                        .then(
+                    Modifier.then(
                             when (orientation) {
                                 Horizontal -> Modifier.offset(x = 150.toDp())
                                 Vertical -> Modifier.offset(y = 150.toDp())
@@ -180,26 +174,21 @@
         val bringIntoViewRequester = BringIntoViewRequester()
         setContentAndInitialize {
             Box(
-                Modifier
-                    .testTag(parentBox)
+                Modifier.testTag(parentBox)
                     .background(LightGray)
                     .then(
                         when (orientation) {
                             Horizontal ->
-                                Modifier
-                                    .size(100.toDp(), 50.toDp())
+                                Modifier.size(100.toDp(), 50.toDp())
                                     .horizontalScroll(rememberScrollState())
-
                             Vertical ->
-                                Modifier
-                                    .size(50.toDp(), 100.toDp())
+                                Modifier.size(50.toDp(), 100.toDp())
                                     .verticalScroll(rememberScrollState())
                         }
                     )
             ) {
                 Box(
-                    Modifier
-                        .size(50.toDp())
+                    Modifier.size(50.toDp())
                         .background(Blue)
                         .bringIntoViewRequester(bringIntoViewRequester)
                         .testTag(childBox)
@@ -222,26 +211,21 @@
         val bringIntoViewRequester = BringIntoViewRequester()
         setContentAndInitialize {
             Box(
-                Modifier
-                    .testTag(parentBox)
+                Modifier.testTag(parentBox)
                     .background(LightGray)
                     .then(
                         when (orientation) {
                             Horizontal ->
-                                Modifier
-                                    .size(100.toDp(), 50.toDp())
+                                Modifier.size(100.toDp(), 50.toDp())
                                     .horizontalScroll(rememberScrollState())
-
                             Vertical ->
-                                Modifier
-                                    .size(50.toDp(), 100.toDp())
+                                Modifier.size(50.toDp(), 100.toDp())
                                     .verticalScroll(rememberScrollState())
                         }
                     )
             ) {
                 Box(
-                    Modifier
-                        .then(
+                    Modifier.then(
                             when (orientation) {
                                 Horizontal -> Modifier.offset(x = 50.toDp())
                                 Vertical -> Modifier.offset(y = 50.toDp())
@@ -270,26 +254,21 @@
         val bringIntoViewRequester = BringIntoViewRequester()
         setContentAndInitialize {
             Box(
-                Modifier
-                    .testTag(parentBox)
+                Modifier.testTag(parentBox)
                     .background(LightGray)
                     .then(
                         when (orientation) {
                             Horizontal ->
-                                Modifier
-                                    .size(100.toDp(), 50.toDp())
+                                Modifier.size(100.toDp(), 50.toDp())
                                     .horizontalScroll(rememberScrollState())
-
                             Vertical ->
-                                Modifier
-                                    .size(50.toDp(), 100.toDp())
+                                Modifier.size(50.toDp(), 100.toDp())
                                     .verticalScroll(rememberScrollState())
                         }
                     )
             ) {
                 Box(
-                    Modifier
-                        .then(
+                    Modifier.then(
                             when (orientation) {
                                 Horizontal -> Modifier.offset(x = 25.toDp())
                                 Vertical -> Modifier.offset(y = 25.toDp())
@@ -318,8 +297,7 @@
         val bringIntoViewRequester = BringIntoViewRequester()
         setContentAndInitialize {
             Box(
-                Modifier
-                    .size(50.toDp())
+                Modifier.size(50.toDp())
                     .testTag(parentBox)
                     .background(LightGray)
                     .then(
@@ -332,25 +310,11 @@
                 // Using a multi-colored item to make sure we can assert that the right part of
                 // the item is visible.
                 RowOrColumn(
-                    Modifier
-                        .bringIntoViewRequester(bringIntoViewRequester)
-                        .testTag(childBox)
+                    Modifier.bringIntoViewRequester(bringIntoViewRequester).testTag(childBox)
                 ) {
-                    Box(
-                        Modifier
-                            .size(50.toDp())
-                            .background(Blue)
-                    )
-                    Box(
-                        Modifier
-                            .size(50.toDp())
-                            .background(Green)
-                    )
-                    Box(
-                        Modifier
-                            .size(50.toDp())
-                            .background(Red)
-                    )
+                    Box(Modifier.size(50.toDp()).background(Blue))
+                    Box(Modifier.size(50.toDp()).background(Green))
+                    Box(Modifier.size(50.toDp()).background(Red))
                 }
             }
         }
@@ -372,8 +336,7 @@
         setContentAndInitialize {
             scrollState = rememberScrollState()
             Box(
-                Modifier
-                    .size(50.toDp())
+                Modifier.size(50.toDp())
                     .testTag(parentBox)
                     .background(LightGray)
                     .then(
@@ -386,25 +349,11 @@
                 // Using a multi-colored item to make sure we can assert that the right part of
                 // the item is visible.
                 RowOrColumn(
-                    Modifier
-                        .bringIntoViewRequester(bringIntoViewRequester)
-                        .testTag(childBox)
+                    Modifier.bringIntoViewRequester(bringIntoViewRequester).testTag(childBox)
                 ) {
-                    Box(
-                        Modifier
-                            .size(50.toDp())
-                            .background(Red)
-                    )
-                    Box(
-                        Modifier
-                            .size(50.toDp())
-                            .background(Green)
-                    )
-                    Box(
-                        Modifier
-                            .size(50.toDp())
-                            .background(Blue)
-                    )
+                    Box(Modifier.size(50.toDp()).background(Red))
+                    Box(Modifier.size(50.toDp()).background(Green))
+                    Box(Modifier.size(50.toDp()).background(Blue))
                 }
             }
         }
@@ -427,8 +376,7 @@
         setContentAndInitialize {
             scrollState = rememberScrollState()
             Box(
-                Modifier
-                    .size(50.toDp())
+                Modifier.size(50.toDp())
                     .testTag(parentBox)
                     .background(LightGray)
                     .then(
@@ -441,25 +389,11 @@
                 // Using a multi-colored item to make sure we can assert that the right part of
                 // the item is visible.
                 RowOrColumn(
-                    Modifier
-                        .bringIntoViewRequester(bringIntoViewRequester)
-                        .testTag(childBox)
+                    Modifier.bringIntoViewRequester(bringIntoViewRequester).testTag(childBox)
                 ) {
-                    Box(
-                        Modifier
-                            .size(50.toDp())
-                            .background(Green)
-                    )
-                    Box(
-                        Modifier
-                            .size(50.toDp())
-                            .background(Blue)
-                    )
-                    Box(
-                        Modifier
-                            .size(50.toDp())
-                            .background(Red)
-                    )
+                    Box(Modifier.size(50.toDp()).background(Green))
+                    Box(Modifier.size(50.toDp()).background(Blue))
+                    Box(Modifier.size(50.toDp()).background(Red))
                 }
             }
         }
@@ -482,20 +416,14 @@
         setContentAndInitialize {
             scrollState = rememberScrollState()
             Box(
-                Modifier
-                    .testTag(parentBox)
+                Modifier.testTag(parentBox)
                     .background(LightGray)
                     .then(
                         when (orientation) {
                             Horizontal ->
-                                Modifier
-                                    .size(100.toDp(), 50.toDp())
-                                    .horizontalScroll(scrollState)
-
+                                Modifier.size(100.toDp(), 50.toDp()).horizontalScroll(scrollState)
                             Vertical ->
-                                Modifier
-                                    .size(50.toDp(), 100.toDp())
-                                    .verticalScroll(scrollState)
+                                Modifier.size(50.toDp(), 100.toDp()).verticalScroll(scrollState)
                         }
                     )
             ) {
@@ -506,8 +434,7 @@
                     }
                 ) {
                     Box(
-                        Modifier
-                            .then(
+                        Modifier.then(
                                 when (orientation) {
                                     Horizontal -> Modifier.offset(x = 50.toDp())
                                     Vertical -> Modifier.offset(y = 50.toDp())
@@ -539,20 +466,14 @@
         setContentAndInitialize {
             scrollState = rememberScrollState()
             Box(
-                Modifier
-                    .testTag(parentBox)
+                Modifier.testTag(parentBox)
                     .background(LightGray)
                     .then(
                         when (orientation) {
                             Horizontal ->
-                                Modifier
-                                    .size(100.toDp(), 50.toDp())
-                                    .horizontalScroll(scrollState)
-
+                                Modifier.size(100.toDp(), 50.toDp()).horizontalScroll(scrollState)
                             Vertical ->
-                                Modifier
-                                    .size(50.toDp(), 100.toDp())
-                                    .verticalScroll(scrollState)
+                                Modifier.size(50.toDp(), 100.toDp()).verticalScroll(scrollState)
                         }
                     )
             ) {
@@ -563,8 +484,7 @@
                     }
                 ) {
                     Box(
-                        Modifier
-                            .then(
+                        Modifier.then(
                                 when (orientation) {
                                     Horizontal -> Modifier.offset(x = 150.toDp())
                                     Vertical -> Modifier.offset(y = 150.toDp())
@@ -584,10 +504,12 @@
         runBlockingAndAwaitIdle { bringIntoViewRequester.bringIntoView() }
 
         // Assert.
-        rule.onNodeWithTag(childBox).assertPositionInRootIsEqualTo(
-            expectedLeft = if (orientation == Horizontal) 50.toDp() else 0.toDp(),
-            expectedTop = if (orientation == Horizontal) 0.toDp() else 50.toDp()
-        )
+        rule
+            .onNodeWithTag(childBox)
+            .assertPositionInRootIsEqualTo(
+                expectedLeft = if (orientation == Horizontal) 50.toDp() else 0.toDp(),
+                expectedTop = if (orientation == Horizontal) 0.toDp() else 50.toDp()
+            )
         assertChildMaxInView()
     }
 
@@ -599,27 +521,20 @@
         setContentAndInitialize {
             scrollState = rememberScrollState()
             Box(
-                Modifier
-                    .testTag(parentBox)
+                Modifier.testTag(parentBox)
                     .background(LightGray)
                     .then(
                         when (orientation) {
                             Horizontal ->
-                                Modifier
-                                    .size(100.toDp(), 50.toDp())
-                                    .horizontalScroll(scrollState)
-
+                                Modifier.size(100.toDp(), 50.toDp()).horizontalScroll(scrollState)
                             Vertical ->
-                                Modifier
-                                    .size(50.toDp(), 100.toDp())
-                                    .verticalScroll(scrollState)
+                                Modifier.size(50.toDp(), 100.toDp()).verticalScroll(scrollState)
                         }
                     )
             ) {
                 Box(Modifier.size(200.toDp())) {
                     Box(
-                        Modifier
-                            .then(
+                        Modifier.then(
                                 when (orientation) {
                                     Horizontal -> Modifier.offset(x = 25.toDp())
                                     Vertical -> Modifier.offset(y = 25.toDp())
@@ -651,20 +566,14 @@
         setContentAndInitialize {
             scrollState = rememberScrollState()
             Box(
-                Modifier
-                    .testTag(parentBox)
+                Modifier.testTag(parentBox)
                     .background(LightGray)
                     .then(
                         when (orientation) {
                             Horizontal ->
-                                Modifier
-                                    .size(100.toDp(), 50.toDp())
-                                    .horizontalScroll(scrollState)
-
+                                Modifier.size(100.toDp(), 50.toDp()).horizontalScroll(scrollState)
                             Vertical ->
-                                Modifier
-                                    .size(50.toDp(), 100.toDp())
-                                    .verticalScroll(scrollState)
+                                Modifier.size(50.toDp(), 100.toDp()).verticalScroll(scrollState)
                         }
                     )
             ) {
@@ -675,8 +584,7 @@
                     }
                 ) {
                     Box(
-                        Modifier
-                            .then(
+                        Modifier.then(
                                 when (orientation) {
                                     Horizontal -> Modifier.offset(x = 150.toDp())
                                     Vertical -> Modifier.offset(y = 150.toDp())
@@ -696,10 +604,12 @@
         runBlockingAndAwaitIdle { bringIntoViewRequester.bringIntoView() }
 
         // Assert.
-        rule.onNodeWithTag(childBox).assertPositionInRootIsEqualTo(
-            expectedLeft = if (orientation == Horizontal) 50.toDp() else 0.toDp(),
-            expectedTop = if (orientation == Horizontal) 0.toDp() else 50.toDp()
-        )
+        rule
+            .onNodeWithTag(childBox)
+            .assertPositionInRootIsEqualTo(
+                expectedLeft = if (orientation == Horizontal) 50.toDp() else 0.toDp(),
+                expectedTop = if (orientation == Horizontal) 0.toDp() else 50.toDp()
+            )
         assertChildMaxInView()
     }
 
@@ -713,36 +623,28 @@
             parentScrollState = rememberScrollState()
             grandParentScrollState = rememberScrollState()
             Box(
-                Modifier
-                    .testTag(parentBox)
+                Modifier.testTag(parentBox)
                     .background(LightGray)
                     .then(
                         when (orientation) {
                             Horizontal ->
-                                Modifier
-                                    .size(100.toDp(), 50.toDp())
+                                Modifier.size(100.toDp(), 50.toDp())
                                     .horizontalScroll(grandParentScrollState)
-
                             Vertical ->
-                                Modifier
-                                    .size(50.toDp(), 100.toDp())
+                                Modifier.size(50.toDp(), 100.toDp())
                                     .verticalScroll(grandParentScrollState)
                         }
                     )
             ) {
                 Box(
-                    Modifier
-                        .background(LightGray)
+                    Modifier.background(LightGray)
                         .then(
                             when (orientation) {
                                 Horizontal ->
-                                    Modifier
-                                        .size(200.toDp(), 50.toDp())
+                                    Modifier.size(200.toDp(), 50.toDp())
                                         .horizontalScroll(parentScrollState)
-
                                 Vertical ->
-                                    Modifier
-                                        .size(50.toDp(), 200.toDp())
+                                    Modifier.size(50.toDp(), 200.toDp())
                                         .verticalScroll(parentScrollState)
                             }
                         )
@@ -754,8 +656,7 @@
                         }
                     ) {
                         Box(
-                            Modifier
-                                .then(
+                            Modifier.then(
                                     when (orientation) {
                                         Horizontal -> Modifier.offset(x = 25.toDp())
                                         Vertical -> Modifier.offset(y = 25.toDp())
@@ -791,26 +692,21 @@
             parentScrollState = rememberScrollState()
             grandParentScrollState = rememberScrollState()
             Box(
-                Modifier
-                    .testTag(parentBox)
+                Modifier.testTag(parentBox)
                     .background(LightGray)
                     .then(
                         when (orientation) {
                             Horizontal ->
-                                Modifier
-                                    .size(100.toDp(), 50.toDp())
+                                Modifier.size(100.toDp(), 50.toDp())
                                     .verticalScroll(grandParentScrollState)
-
                             Vertical ->
-                                Modifier
-                                    .size(50.toDp(), 100.toDp())
+                                Modifier.size(50.toDp(), 100.toDp())
                                     .horizontalScroll(grandParentScrollState)
                         }
                     )
             ) {
                 Box(
-                    Modifier
-                        .size(100.toDp())
+                    Modifier.size(100.toDp())
                         .background(LightGray)
                         .then(
                             when (orientation) {
@@ -821,8 +717,7 @@
                 ) {
                     Box(Modifier.size(200.toDp())) {
                         Box(
-                            Modifier
-                                .offset(x = 25.toDp(), y = 25.toDp())
+                            Modifier.offset(x = 25.toDp(), y = 25.toDp())
                                 .size(50.toDp())
                                 .background(Blue)
                                 .bringIntoViewRequester(bringIntoViewRequester)
@@ -851,8 +746,7 @@
         setContentAndInitialize {
             density = LocalDensity.current
             Box(
-                Modifier
-                    .testTag(parentBox)
+                Modifier.testTag(parentBox)
                     .size(50.toDp())
                     .background(LightGray)
                     .then(
@@ -863,8 +757,7 @@
                     )
             ) {
                 Box(
-                    Modifier
-                        .then(
+                    Modifier.then(
                             when (orientation) {
                                 Horizontal -> Modifier.size(150.toDp(), 50.toDp())
                                 Vertical -> Modifier.size(50.toDp(), 150.toDp())
@@ -873,8 +766,7 @@
                         .bringIntoViewRequester(bringIntoViewRequester)
                 ) {
                     Box(
-                        Modifier
-                            .size(50.toDp())
+                        Modifier.size(50.toDp())
                             .then(
                                 when (orientation) {
                                     Horizontal -> Modifier.offset(50.toDp(), 0.toDp())
@@ -890,12 +782,13 @@
 
         // Act.
         runBlockingAndAwaitIdle {
-            val rect = with(density) {
-                when (orientation) {
-                    Horizontal -> DpRect(50.toDp(), 0.toDp(), 100.toDp(), 50.toDp()).toRect()
-                    Vertical -> DpRect(0.toDp(), 50.toDp(), 50.toDp(), 100.toDp()).toRect()
+            val rect =
+                with(density) {
+                    when (orientation) {
+                        Horizontal -> DpRect(50.toDp(), 0.toDp(), 100.toDp(), 50.toDp()).toRect()
+                        Vertical -> DpRect(0.toDp(), 50.toDp(), 50.toDp(), 100.toDp()).toRect()
+                    }
                 }
-            }
             bringIntoViewRequester.bringIntoView(rect)
         }
 
@@ -908,24 +801,25 @@
     @Test
     fun doesNotCrashWhenCoordinatesDetachedDuringOperation() {
         val requests = mutableListOf<() -> Rect?>()
-        val responder = object : BringIntoViewResponder {
-            override fun calculateRectForParent(localRect: Rect): Rect = localRect
+        val responder =
+            object : BringIntoViewResponder {
+                override fun calculateRectForParent(localRect: Rect): Rect = localRect
 
-            override suspend fun bringChildIntoView(localRect: () -> Rect?) {
-                requests += localRect
+                override suspend fun bringChildIntoView(localRect: () -> Rect?) {
+                    requests += localRect
+                }
             }
-        }
         val requester = BringIntoViewRequester()
         var coordinates: LayoutCoordinates? = null
         var attach by mutableStateOf(true)
         setContentAndInitialize {
             if (attach) {
                 Box(
-                    modifier = Modifier
-                        .bringIntoViewResponder(responder)
-                        .bringIntoViewRequester(requester)
-                        .onPlaced { coordinates = it }
-                        .size(10.toDp())
+                    modifier =
+                        Modifier.bringIntoViewResponder(responder)
+                            .bringIntoViewRequester(requester)
+                            .onPlaced { coordinates = it }
+                            .size(10.toDp())
                 )
 
                 LaunchedEffect(Unit) {
@@ -960,8 +854,7 @@
         val completedRequests = mutableListOf<BringIntoViewRequester>()
         setContentAndInitialize {
             Box(
-                Modifier
-                    .testTag(parentBox)
+                Modifier.testTag(parentBox)
                     .size(100.toDp())
                     .background(LightGray)
                     .then(
@@ -973,8 +866,7 @@
             ) {
                 // Nested boxes each with their own requester.
                 Box(
-                    Modifier
-                        .then(
+                    Modifier.then(
                             when (orientation) {
                                 Horizontal -> Modifier.padding(start = 100.toDp())
                                 Vertical -> Modifier.padding(top = 100.toDp())
@@ -985,15 +877,13 @@
                         .bringIntoViewRequester(childA)
                 ) {
                     Box(
-                        Modifier
-                            .align(Alignment.TopStart)
+                        Modifier.align(Alignment.TopStart)
                             .size(50.toDp())
                             .background(Green.copy(alpha = 0.25f))
                             .bringIntoViewRequester(childB)
                     ) {
                         Box(
-                            Modifier
-                                .align(Alignment.TopStart)
+                            Modifier.align(Alignment.TopStart)
                                 .size(25.toDp())
                                 .background(Green.copy(alpha = 0.25f))
                                 .bringIntoViewRequester(childC)
@@ -1016,9 +906,9 @@
         // Assert.
         // The innermost request will be the first one to fully come into view, so it should
         // complete first, and the outermost one should complete last.
-        assertThat(completedRequests).containsExactlyElementsIn(
-            listOf(childC, childB, childA)
-        ).inOrder()
+        assertThat(completedRequests)
+            .containsExactlyElementsIn(listOf(childC, childB, childA))
+            .inOrder()
     }
 
     @Test
@@ -1030,8 +920,7 @@
         val completedRequests = mutableListOf<BringIntoViewRequester>()
         setContentAndInitialize {
             Box(
-                Modifier
-                    .testTag(parentBox)
+                Modifier.testTag(parentBox)
                     .size(100.toDp())
                     .background(LightGray)
                     .then(
@@ -1043,8 +932,7 @@
             ) {
                 // Nested boxes each with their own requester.
                 Box(
-                    Modifier
-                        .then(
+                    Modifier.then(
                             when (orientation) {
                                 Horizontal -> Modifier.padding(start = 100.toDp())
                                 Vertical -> Modifier.padding(top = 100.toDp())
@@ -1055,15 +943,13 @@
                         .bringIntoViewRequester(childA)
                 ) {
                     Box(
-                        Modifier
-                            .align(Alignment.TopStart)
+                        Modifier.align(Alignment.TopStart)
                             .size(50.toDp())
                             .background(Green.copy(alpha = 0.25f))
                             .bringIntoViewRequester(childB)
                     ) {
                         Box(
-                            Modifier
-                                .align(Alignment.TopStart)
+                            Modifier.align(Alignment.TopStart)
                                 .size(25.toDp())
                                 .background(Green.copy(alpha = 0.25f))
                                 .bringIntoViewRequester(childC)
@@ -1086,9 +972,9 @@
         // Assert.
         // The innermost request will be the first one to fully come into view, so it should
         // complete first, and the outermost one should complete last.
-        assertThat(completedRequests).containsExactlyElementsIn(
-            listOf(childC, childB, childA)
-        ).inOrder()
+        assertThat(completedRequests)
+            .containsExactlyElementsIn(listOf(childC, childB, childA))
+            .inOrder()
     }
 
     @Test
@@ -1102,15 +988,12 @@
             expectedChildSize = 10.dp // child is visible
         ) {
             Box(
-                modifier = Modifier
-                    .size(10.dp)
-                    .onPlaced { bringIntoViewItemCoordinates.value = it }
-                    .bringIntoViewRequester(bringIntoViewRequester)
+                modifier =
+                    Modifier.size(10.dp)
+                        .onPlaced { bringIntoViewItemCoordinates.value = it }
+                        .bringIntoViewRequester(bringIntoViewRequester)
             )
-            Box(
-                modifier = Modifier
-                    .size(100.dp)
-            )
+            Box(modifier = Modifier.size(100.dp))
         }
     }
 
@@ -1124,20 +1007,14 @@
             childCoordinates = bringIntoViewItemCoordinates,
             expectedChildSize = 10.dp // child is visible
         ) {
+            Box(modifier = Modifier.size(100.dp))
             Box(
-                modifier = Modifier
-                    .size(100.dp)
+                modifier =
+                    Modifier.size(10.dp)
+                        .onPlaced { bringIntoViewItemCoordinates.value = it }
+                        .bringIntoViewRequester(bringIntoViewRequester)
             )
-            Box(
-                modifier = Modifier
-                    .size(10.dp)
-                    .onPlaced { bringIntoViewItemCoordinates.value = it }
-                    .bringIntoViewRequester(bringIntoViewRequester)
-            )
-            Box(
-                modifier = Modifier
-                    .size(100.dp)
-            )
+            Box(modifier = Modifier.size(100.dp))
         }
     }
 
@@ -1151,15 +1028,12 @@
             childCoordinates = bringIntoViewItemCoordinates,
             expectedChildSize = 10.dp // child is part visible
         ) {
+            Box(modifier = Modifier.size(195.dp))
             Box(
-                modifier = Modifier
-                    .size(195.dp)
-            )
-            Box(
-                modifier = Modifier
-                    .size(10.dp)
-                    .onPlaced { bringIntoViewItemCoordinates.value = it }
-                    .bringIntoViewRequester(bringIntoViewRequester)
+                modifier =
+                    Modifier.size(10.dp)
+                        .onPlaced { bringIntoViewItemCoordinates.value = it }
+                        .bringIntoViewRequester(bringIntoViewRequester)
             )
         }
     }
@@ -1174,15 +1048,12 @@
             childCoordinates = bringIntoViewItemCoordinates,
             expectedChildSize = 10.dp // child is not visible
         ) {
+            Box(modifier = Modifier.size(205.dp))
             Box(
-                modifier = Modifier
-                    .size(205.dp)
-            )
-            Box(
-                modifier = Modifier
-                    .size(10.dp)
-                    .onPlaced { bringIntoViewItemCoordinates.value = it }
-                    .bringIntoViewRequester(bringIntoViewRequester)
+                modifier =
+                    Modifier.size(10.dp)
+                        .onPlaced { bringIntoViewItemCoordinates.value = it }
+                        .bringIntoViewRequester(bringIntoViewRequester)
             )
         }
     }
@@ -1198,47 +1069,47 @@
 
         fun calculateExpectedChildOffset(): Int {
             return if (orientation == Horizontal) {
-                childCoordinates.value?.positionInParent()?.x
-            } else {
-                childCoordinates.value?.positionInParent()?.y
-            }?.toInt() ?: 0
+                    childCoordinates.value?.positionInParent()?.x
+                } else {
+                    childCoordinates.value?.positionInParent()?.y
+                }
+                ?.toInt() ?: 0
         }
 
         val expectedContainerSize = with(rule.density) { containerSize.roundToPx() }
-        val customBringIntoViewSpec = object : BringIntoViewSpec {
-            override fun calculateScrollDistance(
-                offset: Float,
-                size: Float,
-                containerSize: Float
-            ): Float {
-                assertThat(containerSize).isEqualTo(expectedContainerSize)
-                assertThat(size).isEqualTo(with(rule.density) { expectedChildSize.roundToPx() })
-                assertThat(offset).isEqualTo(calculateExpectedChildOffset())
-                return 0f
+        val customBringIntoViewSpec =
+            object : BringIntoViewSpec {
+                override fun calculateScrollDistance(
+                    offset: Float,
+                    size: Float,
+                    containerSize: Float
+                ): Float {
+                    assertThat(containerSize).isEqualTo(expectedContainerSize)
+                    assertThat(size).isEqualTo(with(rule.density) { expectedChildSize.roundToPx() })
+                    assertThat(offset).isEqualTo(calculateExpectedChildOffset())
+                    return 0f
+                }
             }
-        }
 
         rule.setContent {
             testScope = rememberCoroutineScope()
             val state = rememberScrollState()
             RowOrColumn(
-                modifier = Modifier
-                    .size(containerSize)
-                    .scrollable(
-                        state = state,
-                        overscrollEffect = null,
-                        orientation = orientation,
-                        bringIntoViewSpec = customBringIntoViewSpec
-                    )
-                    .then(ScrollingLayoutElement(state, false, orientation == Vertical))
+                modifier =
+                    Modifier.size(containerSize)
+                        .scrollable(
+                            state = state,
+                            overscrollEffect = null,
+                            orientation = orientation,
+                            bringIntoViewSpec = customBringIntoViewSpec
+                        )
+                        .then(ScrollingLayoutElement(state, false, orientation == Vertical))
             ) {
                 content()
             }
         }
 
-        testScope.launch {
-            requester.bringIntoView()
-        }
+        testScope.launch { requester.bringIntoView() }
 
         rule.waitForIdle()
     }
@@ -1248,48 +1119,44 @@
         val bringIntoViewRequests = listOf(300f, 150f, 0f)
         val scrollState = ScrollState(0)
         var requestsFulfilledScroll = 0
-        val customBringIntoViewSpec = object : BringIntoViewSpec {
-            var index = 0
-            override fun calculateScrollDistance(
-                offset: Float,
-                size: Float,
-                containerSize: Float
-            ): Float {
-                return bringIntoViewRequests[index].also {
-                    index = (index + 1)
-                    if (index > 2) {
-                        requestsFulfilledScroll = scrollState.value
-                        index = 2
+        val customBringIntoViewSpec =
+            object : BringIntoViewSpec {
+                var index = 0
+
+                override fun calculateScrollDistance(
+                    offset: Float,
+                    size: Float,
+                    containerSize: Float
+                ): Float {
+                    return bringIntoViewRequests[index].also {
+                        index = (index + 1)
+                        if (index > 2) {
+                            requestsFulfilledScroll = scrollState.value
+                            index = 2
+                        }
                     }
                 }
             }
-        }
 
         val requester = BringIntoViewRequester()
 
         rule.setContent {
             testScope = rememberCoroutineScope()
             Box(
-                modifier = Modifier
-                    .size(200.dp)
-                    .scrollable(
-                        state = scrollState,
-                        overscrollEffect = null,
-                        orientation = orientation,
-                        bringIntoViewSpec = customBringIntoViewSpec
-                    )
+                modifier =
+                    Modifier.size(200.dp)
+                        .scrollable(
+                            state = scrollState,
+                            overscrollEffect = null,
+                            orientation = orientation,
+                            bringIntoViewSpec = customBringIntoViewSpec
+                        )
             ) {
-                Box(
-                    modifier = Modifier
-                        .size(10.dp)
-                        .bringIntoViewRequester(requester)
-                )
+                Box(modifier = Modifier.size(10.dp).bringIntoViewRequester(requester))
             }
         }
 
-        testScope.launch {
-            requester.bringIntoView()
-        }
+        testScope.launch { requester.bringIntoView() }
 
         rule.waitForIdle()
 
@@ -1308,9 +1175,9 @@
     }
 
     /**
-     * Sizes and offsets of the composables in these tests must be specified using this function.
-     * If they're specified using `xx.dp` syntax, a rounding error somewhere in the layout system
-     * will cause the pixel values to be off-by-one.
+     * Sizes and offsets of the composables in these tests must be specified using this function. If
+     * they're specified using `xx.dp` syntax, a rounding error somewhere in the layout system will
+     * cause the pixel values to be off-by-one.
      */
     private fun Int.toDp(): Dp = with(rule.density) { this@toDp.toDp() }
 
@@ -1324,10 +1191,7 @@
     }
 
     @Composable
-    private fun RowOrColumn(
-        modifier: Modifier = Modifier,
-        content: @Composable () -> Unit
-    ) {
+    private fun RowOrColumn(modifier: Modifier = Modifier, content: @Composable () -> Unit) {
         when (orientation) {
             Horizontal -> Row(modifier) { content() }
             Vertical -> Column(modifier) { content() }
@@ -1337,9 +1201,7 @@
     private fun runBlockingAndAwaitIdle(block: suspend CoroutineScope.() -> Unit) {
         val job = testScope.launch(block = block)
         rule.waitForIdle()
-        runBlocking {
-            job.join()
-        }
+        runBlocking { job.join() }
     }
 
     /**
@@ -1352,13 +1214,13 @@
         val childNode = rule.onNodeWithTag(childBox).fetchSemanticsNode()
 
         // BoundsInRoot returns the clipped bounds.
-        val visibleBounds: IntSize = childNode.boundsInRoot.size.run {
-            IntSize(width.roundToInt(), height.roundToInt())
-        }
-        val expectedVisibleBounds = IntSize(
-            width = minOf(parentNode.size.width, childNode.size.width),
-            height = minOf(parentNode.size.height, childNode.size.height)
-        )
+        val visibleBounds: IntSize =
+            childNode.boundsInRoot.size.run { IntSize(width.roundToInt(), height.roundToInt()) }
+        val expectedVisibleBounds =
+            IntSize(
+                width = minOf(parentNode.size.width, childNode.size.width),
+                height = minOf(parentNode.size.height, childNode.size.height)
+            )
 
         assertThat(visibleBounds).isEqualTo(expectedVisibleBounds)
     }
diff --git a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/relocation/FakeScrollable.kt b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/relocation/FakeScrollable.kt
index c01ce98..7720cd2 100644
--- a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/relocation/FakeScrollable.kt
+++ b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/relocation/FakeScrollable.kt
@@ -27,20 +27,21 @@
  * Returns a [bringIntoViewResponder] modifier that implements [BringIntoViewResponder] by
  * offsetting the local rect by [parentOffset] and handling the request by calling
  * [onBringIntoView]. Note that [onBringIntoView] will not be called if [parentOffset] is zero,
- * since that means the scrollable doesn't actually need to scroll anything to satisfy the
- * request.
+ * since that means the scrollable doesn't actually need to scroll anything to satisfy the request.
  */
 @OptIn(ExperimentalFoundationApi::class)
 internal fun Modifier.fakeScrollable(
     parentOffset: Offset = Offset.Zero,
     onBringIntoView: suspend (() -> Rect?) -> Unit
-): Modifier = bringIntoViewResponder(
-    object : BringIntoViewResponder {
-        override fun calculateRectForParent(localRect: Rect): Rect =
-            localRect.translate(parentOffset)
+): Modifier =
+    bringIntoViewResponder(
+            object : BringIntoViewResponder {
+                override fun calculateRectForParent(localRect: Rect): Rect =
+                    localRect.translate(parentOffset)
 
-        override suspend fun bringChildIntoView(localRect: () -> Rect?) {
-            onBringIntoView(localRect)
-        }
-    })
-    .wrapContentSize(align = Alignment.TopStart, unbounded = true)
+                override suspend fun bringChildIntoView(localRect: () -> Rect?) {
+                    onBringIntoView(localRect)
+                }
+            }
+        )
+        .wrapContentSize(align = Alignment.TopStart, unbounded = true)
diff --git a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/selection/SelectableTest.kt b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/selection/SelectableTest.kt
index effaf84..44fcb68 100644
--- a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/selection/SelectableTest.kt
+++ b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/selection/SelectableTest.kt
@@ -90,8 +90,7 @@
 @RunWith(AndroidJUnit4::class)
 class SelectableTest {
 
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
     @Before
     fun before() {
@@ -105,20 +104,19 @@
 
     // TODO(b/267253920): Add a compose test API to set/reset InputMode.
     @After
-    fun resetTouchMode() = with(InstrumentationRegistry.getInstrumentation()) {
-        if (SDK_INT < 33) setInTouchMode(true) else resetInTouchMode()
-    }
+    fun resetTouchMode() =
+        with(InstrumentationRegistry.getInstrumentation()) {
+            if (SDK_INT < 33) setInTouchMode(true) else resetInTouchMode()
+        }
 
     @Test
     fun selectable_defaultSemantics() {
         rule.setContent {
-            BasicText(
-                "Text in item",
-                modifier = Modifier.selectable(selected = true, onClick = {})
-            )
+            BasicText("Text in item", modifier = Modifier.selectable(selected = true, onClick = {}))
         }
 
-        rule.onAllNodes(isSelectable())
+        rule
+            .onAllNodes(isSelectable())
             .assertCountEquals(1)
             .onFirst()
             .assert(SemanticsMatcher.keyNotDefined(SemanticsProperties.Role))
@@ -131,14 +129,16 @@
             val state = remember { mutableStateOf(false) }
             BasicText(
                 "Text in item",
-                modifier = Modifier.selectable(
-                    selected = state.value,
-                    onClick = { state.value = !state.value }
-                )
+                modifier =
+                    Modifier.selectable(
+                        selected = state.value,
+                        onClick = { state.value = !state.value }
+                    )
             )
         }
 
-        rule.onNode(isSelectable())
+        rule
+            .onNode(isSelectable())
             .assertIsNotSelected()
             .performClick()
             .assertIsSelected()
@@ -152,17 +152,11 @@
             val (selected, _) = remember { mutableStateOf(false) }
             BasicText(
                 "Text in item",
-                modifier = Modifier.selectable(
-                    selected = selected,
-                    onClick = {}
-                )
+                modifier = Modifier.selectable(selected = selected, onClick = {})
             )
         }
 
-        rule.onNode(isSelectable())
-            .assertIsNotSelected()
-            .performClick()
-            .assertIsNotSelected()
+        rule.onNode(isSelectable()).assertIsNotSelected().performClick().assertIsNotSelected()
     }
 
     @Test
@@ -172,8 +166,7 @@
             val state = remember { mutableStateOf(false) }
             val outerState = remember { mutableStateOf(false) }
             Box(
-                Modifier
-                    .testTag("outerBox")
+                Modifier.testTag("outerBox")
                     .selectable(
                         selected = outerState.value,
                         onClick = { outerState.value = !outerState.value }
@@ -181,30 +174,28 @@
             ) {
                 BasicText(
                     "Text in item",
-                    modifier = Modifier.selectable(
-                        selected = state.value,
-                        onClick = { state.value = !state.value },
-                        enabled = enabled.value
-                    )
+                    modifier =
+                        Modifier.selectable(
+                            selected = state.value,
+                            onClick = { state.value = !state.value },
+                            enabled = enabled.value
+                        )
                 )
             }
         }
 
-        rule.onNodeWithText("Text in item")
+        rule
+            .onNodeWithText("Text in item")
             .assertIsNotSelected()
             .performClick()
             .assertIsNotSelected()
 
-        rule.onNodeWithTag("outerBox")
-            .assertIsNotSelected()
+        rule.onNodeWithTag("outerBox").assertIsNotSelected()
         rule.runOnIdle { enabled.value = true }
 
-        rule.onNodeWithText("Text in item")
-            .performClick()
-            .assertIsSelected()
+        rule.onNodeWithText("Text in item").performClick().assertIsSelected()
 
-        rule.onNodeWithTag("outerBox")
-            .assertIsNotSelected()
+        rule.onNodeWithTag("outerBox").assertIsNotSelected()
     }
 
     @Test
@@ -233,24 +224,18 @@
 
         val interactions = mutableListOf<Interaction>()
 
-        scope.launch {
-            interactionSource.interactions.collect { interactions.add(it) }
-        }
+        scope.launch { interactionSource.interactions.collect { interactions.add(it) } }
 
-        rule.runOnIdle {
-            assertThat(interactions).isEmpty()
-        }
+        rule.runOnIdle { assertThat(interactions).isEmpty() }
 
-        rule.onNodeWithText("SelectableText")
-            .performTouchInput { down(center) }
+        rule.onNodeWithText("SelectableText").performTouchInput { down(center) }
 
         rule.runOnIdle {
             assertThat(interactions).hasSize(1)
             assertThat(interactions.first()).isInstanceOf(PressInteraction.Press::class.java)
         }
 
-        rule.onNodeWithText("SelectableText")
-            .performTouchInput { up() }
+        rule.onNodeWithText("SelectableText").performTouchInput { up() }
 
         rule.runOnIdle {
             assertThat(interactions).hasSize(2)
@@ -290,16 +275,11 @@
 
         val interactions = mutableListOf<Interaction>()
 
-        scope.launch {
-            interactionSource.interactions.collect { interactions.add(it) }
-        }
+        scope.launch { interactionSource.interactions.collect { interactions.add(it) } }
 
-        rule.runOnIdle {
-            assertThat(interactions).isEmpty()
-        }
+        rule.runOnIdle { assertThat(interactions).isEmpty() }
 
-        rule.onNodeWithText("SelectableText")
-            .performTouchInput { down(center) }
+        rule.onNodeWithText("SelectableText").performTouchInput { down(center) }
 
         rule.runOnIdle {
             assertThat(interactions).hasSize(1)
@@ -307,9 +287,7 @@
         }
 
         // Dispose selectable
-        rule.runOnIdle {
-            emitSelectableText = false
-        }
+        rule.runOnIdle { emitSelectableText = false }
 
         rule.mainClock.advanceTimeByFrame()
 
@@ -348,16 +326,11 @@
 
         val interactions = mutableListOf<Interaction>()
 
-        scope.launch {
-            interactionSource.interactions.collect { interactions.add(it) }
-        }
+        scope.launch { interactionSource.interactions.collect { interactions.add(it) } }
 
-        rule.runOnIdle {
-            assertThat(interactions).isEmpty()
-        }
+        rule.runOnIdle { assertThat(interactions).isEmpty() }
 
-        rule.onNodeWithText("SelectableText")
-            .performTouchInput { down(center) }
+        rule.onNodeWithText("SelectableText").performTouchInput { down(center) }
 
         // Advance past the tap timeout
         rule.mainClock.advanceTimeBy(TapIndicationDelay)
@@ -367,8 +340,7 @@
             assertThat(interactions.first()).isInstanceOf(PressInteraction.Press::class.java)
         }
 
-        rule.onNodeWithText("SelectableText")
-            .performTouchInput { up() }
+        rule.onNodeWithText("SelectableText").performTouchInput { up() }
 
         rule.runOnIdle {
             assertThat(interactions).hasSize(2)
@@ -408,16 +380,11 @@
 
         val interactions = mutableListOf<Interaction>()
 
-        scope.launch {
-            interactionSource.interactions.collect { interactions.add(it) }
-        }
+        scope.launch { interactionSource.interactions.collect { interactions.add(it) } }
 
-        rule.runOnIdle {
-            assertThat(interactions).isEmpty()
-        }
+        rule.runOnIdle { assertThat(interactions).isEmpty() }
 
-        rule.onNodeWithText("SelectableText")
-            .performTouchInput { down(center) }
+        rule.onNodeWithText("SelectableText").performTouchInput { down(center) }
 
         // Advance past the tap timeout
         rule.mainClock.advanceTimeBy(TapIndicationDelay)
@@ -428,9 +395,7 @@
         }
 
         // Dispose selectable
-        rule.runOnIdle {
-            emitSelectableText = false
-        }
+        rule.runOnIdle { emitSelectableText = false }
 
         rule.mainClock.advanceTimeByFrame()
 
@@ -468,32 +433,24 @@
 
         val interactions = mutableListOf<Interaction>()
 
-        scope.launch {
-            interactionSource.interactions.collect { interactions.add(it) }
-        }
+        scope.launch { interactionSource.interactions.collect { interactions.add(it) } }
 
-        rule.runOnIdle {
-            assertThat(interactions).isEmpty()
-        }
+        rule.runOnIdle { assertThat(interactions).isEmpty() }
 
-        rule.onNodeWithText("SelectableText")
-            .performMouseInput { enter(center) }
+        rule.onNodeWithText("SelectableText").performMouseInput { enter(center) }
 
         rule.runOnIdle {
             assertThat(interactions).hasSize(1)
             assertThat(interactions.first()).isInstanceOf(HoverInteraction.Enter::class.java)
         }
 
-        rule.onNodeWithText("SelectableText")
-            .performMouseInput { exit(Offset(-1f, -1f)) }
+        rule.onNodeWithText("SelectableText").performMouseInput { exit(Offset(-1f, -1f)) }
 
         rule.runOnIdle {
             assertThat(interactions).hasSize(2)
             assertThat(interactions.first()).isInstanceOf(HoverInteraction.Enter::class.java)
-            assertThat(interactions[1])
-                .isInstanceOf(HoverInteraction.Exit::class.java)
-            assertThat((interactions[1] as HoverInteraction.Exit).enter)
-                .isEqualTo(interactions[0])
+            assertThat(interactions[1]).isInstanceOf(HoverInteraction.Exit::class.java)
+            assertThat((interactions[1] as HoverInteraction.Exit).enter).isEqualTo(interactions[0])
         }
     }
 
@@ -509,8 +466,7 @@
             inputModeManager = LocalInputModeManager.current
             Box {
                 Box(
-                    Modifier
-                        .focusRequester(focusRequester)
+                    Modifier.focusRequester(focusRequester)
                         .selectable(
                             selected = true,
                             interactionSource = interactionSource,
@@ -525,24 +481,17 @@
 
         val interactions = mutableListOf<Interaction>()
 
-        scope.launch {
-            interactionSource.interactions.collect { interactions.add(it) }
-        }
+        scope.launch { interactionSource.interactions.collect { interactions.add(it) } }
+
+        rule.runOnIdle { assertThat(interactions).isEmpty() }
 
         rule.runOnIdle {
-            assertThat(interactions).isEmpty()
-        }
-
-        rule.runOnIdle {
-            @OptIn(ExperimentalComposeUiApi::class)
-            inputModeManager.requestInputMode(Touch)
+            @OptIn(ExperimentalComposeUiApi::class) inputModeManager.requestInputMode(Touch)
             focusRequester.requestFocus()
         }
 
         // Touch mode by default, so we shouldn't be focused
-        rule.runOnIdle {
-            assertThat(interactions).isEmpty()
-        }
+        rule.runOnIdle { assertThat(interactions).isEmpty() }
     }
 
     @Test
@@ -557,35 +506,29 @@
             scope = rememberCoroutineScope()
             focusManager = LocalFocusManager.current
             inputModeManager = LocalInputModeManager.current
-                Box {
-                    Box(
-                        Modifier
-                            .focusRequester(focusRequester)
-                            .selectable(
-                                selected = true,
-                                interactionSource = interactionSource,
-                                indication = null,
-                                onClick = {}
-                            )
-                    ) {
-                        BasicText("SelectableText")
-                    }
+            Box {
+                Box(
+                    Modifier.focusRequester(focusRequester)
+                        .selectable(
+                            selected = true,
+                            interactionSource = interactionSource,
+                            indication = null,
+                            onClick = {}
+                        )
+                ) {
+                    BasicText("SelectableText")
                 }
+            }
         }
 
         val interactions = mutableListOf<Interaction>()
 
-        scope.launch {
-            interactionSource.interactions.collect { interactions.add(it) }
-        }
+        scope.launch { interactionSource.interactions.collect { interactions.add(it) } }
+
+        rule.runOnIdle { assertThat(interactions).isEmpty() }
 
         rule.runOnIdle {
-            assertThat(interactions).isEmpty()
-        }
-
-        rule.runOnIdle {
-            @OptIn(ExperimentalComposeUiApi::class)
-            inputModeManager.requestInputMode(Keyboard)
+            @OptIn(ExperimentalComposeUiApi::class) inputModeManager.requestInputMode(Keyboard)
             focusRequester.requestFocus()
         }
 
@@ -595,15 +538,12 @@
             assertThat(interactions.first()).isInstanceOf(FocusInteraction.Focus::class.java)
         }
 
-        rule.runOnIdle {
-            focusManager.clearFocus()
-        }
+        rule.runOnIdle { focusManager.clearFocus() }
 
         rule.runOnIdle {
             assertThat(interactions).hasSize(2)
             assertThat(interactions.first()).isInstanceOf(FocusInteraction.Focus::class.java)
-            assertThat(interactions[1])
-                .isInstanceOf(FocusInteraction.Unfocus::class.java)
+            assertThat(interactions[1]).isInstanceOf(FocusInteraction.Unfocus::class.java)
             assertThat((interactions[1] as FocusInteraction.Unfocus).focus)
                 .isEqualTo(interactions[0])
         }
@@ -618,33 +558,32 @@
             val modifier = Modifier.selectable(false) {} as InspectableValue
             assertThat(modifier.nameFallback).isEqualTo("selectable")
             assertThat(modifier.valueOverride).isNull()
-            assertThat(modifier.inspectableElements.map { it.name }.asIterable()).containsExactly(
-                "selected",
-                "enabled",
-                "role",
-                "onClick"
-            )
+            assertThat(modifier.inspectableElements.map { it.name }.asIterable())
+                .containsExactly("selected", "enabled", "role", "onClick")
         }
     }
 
     @Test
     fun selectableTest_testInspectorValue_fullParams() {
         rule.setContent {
-            val modifier = Modifier.selectable(
-                false,
-                interactionSource = remember { MutableInteractionSource() },
-                indication = null
-            ) {}.first() as InspectableValue
+            val modifier =
+                Modifier.selectable(
+                        false,
+                        interactionSource = remember { MutableInteractionSource() },
+                        indication = null
+                    ) {}
+                    .first() as InspectableValue
             assertThat(modifier.nameFallback).isEqualTo("selectable")
             assertThat(modifier.valueOverride).isNull()
-            assertThat(modifier.inspectableElements.map { it.name }.asIterable()).containsExactly(
-                "selected",
-                "interactionSource",
-                "indicationNodeFactory",
-                "enabled",
-                "role",
-                "onClick"
-            )
+            assertThat(modifier.inspectableElements.map { it.name }.asIterable())
+                .containsExactly(
+                    "selected",
+                    "interactionSource",
+                    "indicationNodeFactory",
+                    "enabled",
+                    "role",
+                    "onClick"
+                )
         }
     }
 
@@ -659,16 +598,17 @@
             inputModeManager = LocalInputModeManager.current
             BasicText(
                 "SelectableText",
-                modifier = Modifier
-                    .testTag("selectable")
-                    .focusRequester(focusRequester)
-                    .selectable(selected = false) { counter++ }
+                modifier =
+                    Modifier.testTag("selectable").focusRequester(focusRequester).selectable(
+                        selected = false
+                    ) {
+                        counter++
+                    }
             )
         }
 
         rule.runOnIdle {
-            @OptIn(ExperimentalComposeUiApi::class)
-            inputModeManager.requestInputMode(Keyboard)
+            @OptIn(ExperimentalComposeUiApi::class) inputModeManager.requestInputMode(Keyboard)
             focusRequester.requestFocus()
         }
 
@@ -692,16 +632,17 @@
             inputModeManager = LocalInputModeManager.current
             BasicText(
                 "SelectableText",
-                modifier = Modifier
-                    .testTag("selectable")
-                    .focusRequester(focusRequester)
-                    .selectable(selected = false) { counter++ }
+                modifier =
+                    Modifier.testTag("selectable").focusRequester(focusRequester).selectable(
+                        selected = false
+                    ) {
+                        counter++
+                    }
             )
         }
 
         rule.runOnIdle {
-            @OptIn(ExperimentalComposeUiApi::class)
-            inputModeManager.requestInputMode(Keyboard)
+            @OptIn(ExperimentalComposeUiApi::class) inputModeManager.requestInputMode(Keyboard)
             focusRequester.requestFocus()
         }
 
@@ -725,16 +666,17 @@
             inputModeManager = LocalInputModeManager.current
             BasicText(
                 "SelectableText",
-                modifier = Modifier
-                    .testTag("selectable")
-                    .focusRequester(focusRequester)
-                    .selectable(selected = false) { counter++ }
+                modifier =
+                    Modifier.testTag("selectable").focusRequester(focusRequester).selectable(
+                        selected = false
+                    ) {
+                        counter++
+                    }
             )
         }
 
         rule.runOnIdle {
-            @OptIn(ExperimentalComposeUiApi::class)
-            inputModeManager.requestInputMode(Keyboard)
+            @OptIn(ExperimentalComposeUiApi::class) inputModeManager.requestInputMode(Keyboard)
             focusRequester.requestFocus()
         }
 
@@ -759,11 +701,10 @@
             scope = rememberCoroutineScope()
             inputModeManager = LocalInputModeManager.current
             Box(Modifier.padding(10.dp)) {
-                BasicText("SelectableText",
-                    modifier = Modifier
-                        .testTag("selectable")
-                        .focusRequester(focusRequester)
-                        .selectable(
+                BasicText(
+                    "SelectableText",
+                    modifier =
+                        Modifier.testTag("selectable").focusRequester(focusRequester).selectable(
                             selected = true,
                             interactionSource = interactionSource,
                             indication = null
@@ -773,15 +714,12 @@
         }
 
         rule.runOnIdle {
-            @OptIn(ExperimentalComposeUiApi::class)
-            inputModeManager.requestInputMode(Keyboard)
+            @OptIn(ExperimentalComposeUiApi::class) inputModeManager.requestInputMode(Keyboard)
             focusRequester.requestFocus()
         }
 
         val interactions = mutableListOf<Interaction>()
-        scope.launch {
-            interactionSource.interactions.collect { interactions.add(it) }
-        }
+        scope.launch { interactionSource.interactions.collect { interactions.add(it) } }
 
         rule.onNodeWithTag("selectable").performKeyInput { keyDown(Key.Enter) }
 
@@ -811,11 +749,10 @@
             scope = rememberCoroutineScope()
             inputModeManager = LocalInputModeManager.current
             Box(Modifier.padding(10.dp)) {
-                BasicText("SelectableText",
-                    modifier = Modifier
-                        .testTag("selectable")
-                        .focusRequester(focusRequester)
-                        .selectable(
+                BasicText(
+                    "SelectableText",
+                    modifier =
+                        Modifier.testTag("selectable").focusRequester(focusRequester).selectable(
                             selected = true,
                             interactionSource = interactionSource,
                             indication = null
@@ -825,15 +762,12 @@
         }
 
         rule.runOnIdle {
-            @OptIn(ExperimentalComposeUiApi::class)
-            inputModeManager.requestInputMode(Keyboard)
+            @OptIn(ExperimentalComposeUiApi::class) inputModeManager.requestInputMode(Keyboard)
             focusRequester.requestFocus()
         }
 
         val interactions = mutableListOf<Interaction>()
-        scope.launch {
-            interactionSource.interactions.collect { interactions.add(it) }
-        }
+        scope.launch { interactionSource.interactions.collect { interactions.add(it) } }
 
         rule.onNodeWithTag("selectable").performKeyInput { keyDown(Key.NumPadEnter) }
 
@@ -863,11 +797,10 @@
             scope = rememberCoroutineScope()
             inputModeManager = LocalInputModeManager.current
             Box(Modifier.padding(10.dp)) {
-                BasicText("SelectableText",
-                    modifier = Modifier
-                        .testTag("selectable")
-                        .focusRequester(focusRequester)
-                        .selectable(
+                BasicText(
+                    "SelectableText",
+                    modifier =
+                        Modifier.testTag("selectable").focusRequester(focusRequester).selectable(
                             selected = true,
                             interactionSource = interactionSource,
                             indication = null
@@ -877,16 +810,13 @@
         }
 
         rule.runOnIdle {
-            @OptIn(ExperimentalComposeUiApi::class)
-            inputModeManager.requestInputMode(Keyboard)
+            @OptIn(ExperimentalComposeUiApi::class) inputModeManager.requestInputMode(Keyboard)
             focusRequester.requestFocus()
         }
         rule.waitForIdle()
 
         val interactions = mutableListOf<Interaction>()
-        scope.launch {
-            interactionSource.interactions.collect { interactions.add(it) }
-        }
+        scope.launch { interactionSource.interactions.collect { interactions.add(it) } }
 
         rule.onNodeWithTag("selectable").performKeyInput { keyDown(Key.DirectionCenter) }
 
@@ -916,11 +846,10 @@
             scope = rememberCoroutineScope()
             inputModeManager = LocalInputModeManager.current
             Box(Modifier.padding(10.dp)) {
-                BasicText("SelectableText",
-                    modifier = Modifier
-                        .testTag("selectable")
-                        .focusRequester(focusRequester)
-                        .selectable(
+                BasicText(
+                    "SelectableText",
+                    modifier =
+                        Modifier.testTag("selectable").focusRequester(focusRequester).selectable(
                             selected = true,
                             interactionSource = interactionSource,
                             indication = null
@@ -930,20 +859,15 @@
         }
 
         rule.runOnIdle {
-            @OptIn(ExperimentalComposeUiApi::class)
-            inputModeManager.requestInputMode(Keyboard)
+            @OptIn(ExperimentalComposeUiApi::class) inputModeManager.requestInputMode(Keyboard)
             focusRequester.requestFocus()
         }
 
         val interactions = mutableListOf<Interaction>()
-        scope.launch {
-            interactionSource.interactions.collect { interactions.add(it) }
-        }
+        scope.launch { interactionSource.interactions.collect { interactions.add(it) } }
 
         rule.onNodeWithTag("selectable").performKeyInput { pressKey(Key.Spacebar) }
-        rule.runOnIdle {
-            assertThat(interactions).isEmpty()
-        }
+        rule.runOnIdle { assertThat(interactions).isEmpty() }
     }
 
     @Test
@@ -958,11 +882,10 @@
             scope = rememberCoroutineScope()
             inputModeManager = LocalInputModeManager.current
             Box(Modifier.padding(10.dp)) {
-                BasicText("SelectableText",
-                    modifier = Modifier
-                        .testTag("selectable")
-                        .focusRequester(focusRequester)
-                        .selectable(
+                BasicText(
+                    "SelectableText",
+                    modifier =
+                        Modifier.testTag("selectable").focusRequester(focusRequester).selectable(
                             selected = true,
                             interactionSource = interactionSource,
                             indication = null
@@ -972,15 +895,12 @@
         }
 
         rule.runOnIdle {
-            @OptIn(ExperimentalComposeUiApi::class)
-            inputModeManager.requestInputMode(Keyboard)
+            @OptIn(ExperimentalComposeUiApi::class) inputModeManager.requestInputMode(Keyboard)
             focusRequester.requestFocus()
         }
 
         val interactions = mutableListOf<Interaction>()
-        scope.launch {
-            interactionSource.interactions.collect { interactions.add(it) }
-        }
+        scope.launch { interactionSource.interactions.collect { interactions.add(it) } }
 
         val selectableNode = rule.onNodeWithTag("selectable")
 
@@ -1025,34 +945,31 @@
             scope = rememberCoroutineScope()
             inputModeManager = LocalInputModeManager.current
             Box(Modifier.padding(10.dp)) {
-                BasicText("SelectableText",
-                    modifier = Modifier
-                        .testTag("selectable")
-                        .focusRequester(focusRequester)
-                        .onKeyEvent {
-                            if (it.nativeKeyEvent.repeatCount != 0)
-                                repeatCounter++
-                            false
-                        }
-                        .selectable(
-                            selected = true,
-                            interactionSource = interactionSource,
-                            indication = null,
-                        ) {}
+                BasicText(
+                    "SelectableText",
+                    modifier =
+                        Modifier.testTag("selectable")
+                            .focusRequester(focusRequester)
+                            .onKeyEvent {
+                                if (it.nativeKeyEvent.repeatCount != 0) repeatCounter++
+                                false
+                            }
+                            .selectable(
+                                selected = true,
+                                interactionSource = interactionSource,
+                                indication = null,
+                            ) {}
                 )
             }
         }
 
         rule.runOnIdle {
-            @OptIn(ExperimentalComposeUiApi::class)
-            inputModeManager.requestInputMode(Keyboard)
+            @OptIn(ExperimentalComposeUiApi::class) inputModeManager.requestInputMode(Keyboard)
             focusRequester.requestFocus()
         }
 
         val interactions = mutableListOf<Interaction>()
-        scope.launch {
-            interactionSource.interactions.collect { interactions.add(it) }
-        }
+        scope.launch { interactionSource.interactions.collect { interactions.add(it) } }
 
         rule.onNodeWithTag("selectable").performKeyInput {
             keyDown(Key.Enter)
@@ -1068,9 +985,7 @@
             assertThat(interactions.first()).isInstanceOf(PressInteraction.Press::class.java)
         }
 
-        rule.onNodeWithTag("selectable").performKeyInput {
-            keyUp(Key.Enter)
-        }
+        rule.onNodeWithTag("selectable").performKeyInput { keyUp(Key.Enter) }
 
         rule.runOnIdle {
             assertThat(interactions).hasSize(2)
@@ -1092,11 +1007,10 @@
             scope = rememberCoroutineScope()
             inputModeManager = LocalInputModeManager.current
             Box(Modifier.padding(10.dp)) {
-                BasicText("SelectableText",
-                    modifier = Modifier
-                        .testTag("selectable")
-                        .focusRequester(focusRequester)
-                        .selectable(
+                BasicText(
+                    "SelectableText",
+                    modifier =
+                        Modifier.testTag("selectable").focusRequester(focusRequester).selectable(
                             selected = true,
                             interactionSource = interactionSource,
                             indication = null,
@@ -1107,15 +1021,12 @@
         }
 
         rule.runOnIdle {
-            @OptIn(ExperimentalComposeUiApi::class)
-            inputModeManager.requestInputMode(Keyboard)
+            @OptIn(ExperimentalComposeUiApi::class) inputModeManager.requestInputMode(Keyboard)
             focusRequester.requestFocus()
         }
 
         val interactions = mutableListOf<Interaction>()
-        scope.launch {
-            interactionSource.interactions.collect { interactions.add(it) }
-        }
+        scope.launch { interactionSource.interactions.collect { interactions.add(it) } }
 
         val selectableNode = rule.onNodeWithTag("selectable")
 
@@ -1159,18 +1070,18 @@
             interactionSource = source
             created = true
             coroutineScope.launch {
-                interactionSource.interactions.collect {
-                    interaction -> interactions.add(interaction)
+                interactionSource.interactions.collect { interaction ->
+                    interactions.add(interaction)
                 }
             }
         }
 
         rule.setContent {
             Box(Modifier.padding(10.dp)) {
-                BasicText("SelectableText",
-                    modifier = Modifier
-                        .testTag("selectable")
-                        .selectable(
+                BasicText(
+                    "SelectableText",
+                    modifier =
+                        Modifier.testTag("selectable").selectable(
                             selected = false,
                             interactionSource = null,
                             indication = indication
@@ -1179,13 +1090,10 @@
             }
         }
 
-        rule.runOnIdle {
-            assertThat(created).isFalse()
-        }
+        rule.runOnIdle { assertThat(created).isFalse() }
 
         // The touch event should cause the indication node to be created
-        rule.onNodeWithTag("selectable")
-            .performTouchInput { down(center) }
+        rule.onNodeWithTag("selectable").performTouchInput { down(center) }
 
         rule.runOnIdle {
             assertThat(created).isTrue()
@@ -1249,18 +1157,20 @@
     fun nullInteractionSourceNonNullIndication_nonEquality() {
         val onClick = {}
         val indication = TestIndication {}
-        val modifier1 = Modifier.selectable(
-            selected = true,
-            interactionSource = null,
-            indication = indication,
-            onClick = onClick
-        )
-        val modifier2 = Modifier.selectable(
-            selected = true,
-            interactionSource = null,
-            indication = indication,
-            onClick = onClick
-        )
+        val modifier1 =
+            Modifier.selectable(
+                selected = true,
+                interactionSource = null,
+                indication = indication,
+                onClick = onClick
+            )
+        val modifier2 =
+            Modifier.selectable(
+                selected = true,
+                interactionSource = null,
+                indication = indication,
+                onClick = onClick
+            )
 
         // Indication requires composed, so cannot compare equal
         assertThat(modifier1).isNotEqualTo(modifier2)
@@ -1286,18 +1196,20 @@
         val onClick = {}
         val interactionSource = MutableInteractionSource()
         val indication = TestIndication {}
-        val modifier1 = Modifier.selectable(
-            selected = true,
-            interactionSource = interactionSource,
-            indication = indication,
-            onClick = onClick
-        )
-        val modifier2 = Modifier.selectable(
-            selected = true,
-            interactionSource = interactionSource,
-            indication = indication,
-            onClick = onClick
-        )
+        val modifier1 =
+            Modifier.selectable(
+                selected = true,
+                interactionSource = interactionSource,
+                indication = indication,
+                onClick = onClick
+            )
+        val modifier2 =
+            Modifier.selectable(
+                selected = true,
+                interactionSource = interactionSource,
+                indication = indication,
+                onClick = onClick
+            )
 
         // Indication requires composed, so cannot compare equal
         assertThat(modifier1).isNotEqualTo(modifier2)
diff --git a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/selection/ToggleableTest.kt b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/selection/ToggleableTest.kt
index e95c2bd9..c29a6c0 100644
--- a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/selection/ToggleableTest.kt
+++ b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/selection/ToggleableTest.kt
@@ -99,8 +99,7 @@
 @RunWith(AndroidJUnit4::class)
 class ToggleableTest {
 
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
     @Before
     fun before() {
@@ -114,60 +113,56 @@
 
     // TODO(b/267253920): Add a compose test API to set/reset InputMode.
     @After
-    fun resetTouchMode() = with(InstrumentationRegistry.getInstrumentation()) {
-        if (SDK_INT < 33) setInTouchMode(true) else resetInTouchMode()
-    }
+    fun resetTouchMode() =
+        with(InstrumentationRegistry.getInstrumentation()) {
+            if (SDK_INT < 33) setInTouchMode(true) else resetInTouchMode()
+        }
 
     @Test
     fun toggleableTest_defaultSemantics() {
         rule.setContent {
             Column {
                 Box(
-                    Modifier
-                        .triStateToggleable(state = ToggleableState.On, onClick = {})
+                    Modifier.triStateToggleable(state = ToggleableState.On, onClick = {})
                         .testTag("checkedToggleable"),
-                    content = {
-                        BasicText("ToggleableText")
-                    }
+                    content = { BasicText("ToggleableText") }
                 )
                 Box(
-                    Modifier
-                        .triStateToggleable(state = ToggleableState.Off, onClick = {})
+                    Modifier.triStateToggleable(state = ToggleableState.Off, onClick = {})
                         .testTag("unCheckedToggleable"),
-                    content = {
-                        BasicText("ToggleableText")
-                    }
+                    content = { BasicText("ToggleableText") }
                 )
                 Box(
-                    Modifier
-                        .triStateToggleable(state = ToggleableState.Indeterminate, onClick = {})
+                    Modifier.triStateToggleable(state = ToggleableState.Indeterminate, onClick = {})
                         .testTag("indeterminateToggleable"),
-                    content = {
-                        BasicText("ToggleableText")
-                    }
+                    content = { BasicText("ToggleableText") }
                 )
             }
         }
 
-        fun hasIndeterminateState(): SemanticsMatcher = SemanticsMatcher.expectValue(
-            SemanticsProperties.ToggleableState, ToggleableState.Indeterminate
-        )
+        fun hasIndeterminateState(): SemanticsMatcher =
+            SemanticsMatcher.expectValue(
+                SemanticsProperties.ToggleableState,
+                ToggleableState.Indeterminate
+            )
 
-        fun roleNotSet(): SemanticsMatcher = SemanticsMatcher.keyNotDefined(
-            SemanticsProperties.Role
-        )
+        fun roleNotSet(): SemanticsMatcher =
+            SemanticsMatcher.keyNotDefined(SemanticsProperties.Role)
 
-        rule.onNodeWithTag("checkedToggleable")
+        rule
+            .onNodeWithTag("checkedToggleable")
             .assert(roleNotSet())
             .assertIsEnabled()
             .assertIsOn()
             .assertHasClickAction()
-        rule.onNodeWithTag("unCheckedToggleable")
+        rule
+            .onNodeWithTag("unCheckedToggleable")
             .assert(roleNotSet())
             .assertIsEnabled()
             .assertIsOff()
             .assertHasClickAction()
-        rule.onNodeWithTag("indeterminateToggleable")
+        rule
+            .onNodeWithTag("indeterminateToggleable")
             .assert(roleNotSet())
             .assertIsEnabled()
             .assert(hasIndeterminateState())
@@ -179,29 +174,25 @@
         rule.setContent {
             Column {
                 Box(
-                    Modifier
-                        .toggleable(value = true, onValueChange = {})
+                    Modifier.toggleable(value = true, onValueChange = {})
                         .testTag("checkedToggleable"),
-                    content = {
-                        BasicText("ToggleableText")
-                    }
+                    content = { BasicText("ToggleableText") }
                 )
                 Box(
-                    Modifier
-                        .toggleable(value = false, onValueChange = {})
+                    Modifier.toggleable(value = false, onValueChange = {})
                         .testTag("unCheckedToggleable"),
-                    content = {
-                        BasicText("ToggleableText")
-                    }
+                    content = { BasicText("ToggleableText") }
                 )
             }
         }
 
-        rule.onNodeWithTag("checkedToggleable")
+        rule
+            .onNodeWithTag("checkedToggleable")
             .assertIsEnabled()
             .assertIsOn()
             .assertHasClickAction()
-        rule.onNodeWithTag("unCheckedToggleable")
+        rule
+            .onNodeWithTag("unCheckedToggleable")
             .assertIsEnabled()
             .assertIsOff()
             .assertHasClickAction()
@@ -217,16 +208,12 @@
                         onClick = {},
                         enabled = false
                     ),
-                    content = {
-                        BasicText("ToggleableText")
-                    }
+                    content = { BasicText("ToggleableText") }
                 )
             }
         }
 
-        rule.onNode(isToggleable())
-            .assertIsNotEnabled()
-            .assertHasClickAction()
+        rule.onNode(isToggleable()).assertIsNotEnabled().assertHasClickAction()
     }
 
     @Test
@@ -238,19 +225,14 @@
             Box {
                 Box(
                     Modifier.toggleable(value = checked, onValueChange = onCheckedChange),
-                    content = {
-                        BasicText("ToggleableText")
-                    }
+                    content = { BasicText("ToggleableText") }
                 )
             }
         }
 
-        rule.onNode(isToggleable())
-            .performClick()
+        rule.onNode(isToggleable()).performClick()
 
-        rule.runOnIdle {
-            assertThat(checked).isEqualTo(false)
-        }
+        rule.runOnIdle { assertThat(checked).isEqualTo(false) }
     }
 
     @Test
@@ -262,27 +244,21 @@
         val outerOnCheckedChange: (Boolean) -> Unit = { outerChecked = it }
 
         rule.setContent {
-            Box(
-                Modifier.toggleable(
-                    value = outerChecked,
-                    onValueChange = outerOnCheckedChange
-                )
-            ) {
+            Box(Modifier.toggleable(value = outerChecked, onValueChange = outerOnCheckedChange)) {
                 BasicText(
                     "ToggleableText",
-                    modifier = Modifier
-                        .testTag("myToggleable")
-                        .toggleable(
-                            value = checked,
-                            onValueChange = onCheckedChange,
-                            enabled = enabled.value
-                        )
+                    modifier =
+                        Modifier.testTag("myToggleable")
+                            .toggleable(
+                                value = checked,
+                                onValueChange = onCheckedChange,
+                                enabled = enabled.value
+                            )
                 )
             }
         }
 
-        rule.onNodeWithTag("myToggleable")
-            .performClick()
+        rule.onNodeWithTag("myToggleable").performClick()
 
         rule.runOnIdle {
             assertThat(checked).isTrue()
@@ -290,8 +266,7 @@
             enabled.value = true
         }
 
-        rule.onNodeWithTag("myToggleable")
-            .performClick()
+        rule.onNodeWithTag("myToggleable").performClick()
 
         rule.runOnIdle {
             assertThat(checked).isFalse()
@@ -325,24 +300,18 @@
 
         val interactions = mutableListOf<Interaction>()
 
-        scope.launch {
-            interactionSource.interactions.collect { interactions.add(it) }
-        }
+        scope.launch { interactionSource.interactions.collect { interactions.add(it) } }
 
-        rule.runOnIdle {
-            assertThat(interactions).isEmpty()
-        }
+        rule.runOnIdle { assertThat(interactions).isEmpty() }
 
-        rule.onNodeWithText("ToggleableText")
-            .performTouchInput { down(center) }
+        rule.onNodeWithText("ToggleableText").performTouchInput { down(center) }
 
         rule.runOnIdle {
             assertThat(interactions).hasSize(1)
             assertThat(interactions.first()).isInstanceOf(PressInteraction.Press::class.java)
         }
 
-        rule.onNodeWithText("ToggleableText")
-            .performTouchInput { up() }
+        rule.onNodeWithText("ToggleableText").performTouchInput { up() }
 
         rule.runOnIdle {
             assertThat(interactions).hasSize(2)
@@ -382,16 +351,11 @@
 
         val interactions = mutableListOf<Interaction>()
 
-        scope.launch {
-            interactionSource.interactions.collect { interactions.add(it) }
-        }
+        scope.launch { interactionSource.interactions.collect { interactions.add(it) } }
 
-        rule.runOnIdle {
-            assertThat(interactions).isEmpty()
-        }
+        rule.runOnIdle { assertThat(interactions).isEmpty() }
 
-        rule.onNodeWithText("ToggleableText")
-            .performTouchInput { down(center) }
+        rule.onNodeWithText("ToggleableText").performTouchInput { down(center) }
 
         rule.runOnIdle {
             assertThat(interactions).hasSize(1)
@@ -399,9 +363,7 @@
         }
 
         // Dispose toggleable
-        rule.runOnIdle {
-            emitToggleableText = false
-        }
+        rule.runOnIdle { emitToggleableText = false }
 
         rule.mainClock.advanceTimeByFrame()
 
@@ -440,16 +402,11 @@
 
         val interactions = mutableListOf<Interaction>()
 
-        scope.launch {
-            interactionSource.interactions.collect { interactions.add(it) }
-        }
+        scope.launch { interactionSource.interactions.collect { interactions.add(it) } }
 
-        rule.runOnIdle {
-            assertThat(interactions).isEmpty()
-        }
+        rule.runOnIdle { assertThat(interactions).isEmpty() }
 
-        rule.onNodeWithText("ToggleableText")
-            .performTouchInput { down(center) }
+        rule.onNodeWithText("ToggleableText").performTouchInput { down(center) }
 
         // Advance past the tap timeout
         rule.mainClock.advanceTimeBy(TapIndicationDelay)
@@ -459,8 +416,7 @@
             assertThat(interactions.first()).isInstanceOf(PressInteraction.Press::class.java)
         }
 
-        rule.onNodeWithText("ToggleableText")
-            .performTouchInput { up() }
+        rule.onNodeWithText("ToggleableText").performTouchInput { up() }
 
         rule.runOnIdle {
             assertThat(interactions).hasSize(2)
@@ -500,16 +456,11 @@
 
         val interactions = mutableListOf<Interaction>()
 
-        scope.launch {
-            interactionSource.interactions.collect { interactions.add(it) }
-        }
+        scope.launch { interactionSource.interactions.collect { interactions.add(it) } }
 
-        rule.runOnIdle {
-            assertThat(interactions).isEmpty()
-        }
+        rule.runOnIdle { assertThat(interactions).isEmpty() }
 
-        rule.onNodeWithText("ToggleableText")
-            .performTouchInput { down(center) }
+        rule.onNodeWithText("ToggleableText").performTouchInput { down(center) }
 
         // Advance past the tap timeout
         rule.mainClock.advanceTimeBy(TapIndicationDelay)
@@ -520,9 +471,7 @@
         }
 
         // Dispose toggleable
-        rule.runOnIdle {
-            emitToggleableText = false
-        }
+        rule.runOnIdle { emitToggleableText = false }
 
         rule.mainClock.advanceTimeByFrame()
 
@@ -560,32 +509,24 @@
 
         val interactions = mutableListOf<Interaction>()
 
-        scope.launch {
-            interactionSource.interactions.collect { interactions.add(it) }
-        }
+        scope.launch { interactionSource.interactions.collect { interactions.add(it) } }
 
-        rule.runOnIdle {
-            assertThat(interactions).isEmpty()
-        }
+        rule.runOnIdle { assertThat(interactions).isEmpty() }
 
-        rule.onNodeWithText("ToggleableText")
-            .performMouseInput { enter(center) }
+        rule.onNodeWithText("ToggleableText").performMouseInput { enter(center) }
 
         rule.runOnIdle {
             assertThat(interactions).hasSize(1)
             assertThat(interactions.first()).isInstanceOf(HoverInteraction.Enter::class.java)
         }
 
-        rule.onNodeWithText("ToggleableText")
-            .performMouseInput { exit(Offset(-1f, -1f)) }
+        rule.onNodeWithText("ToggleableText").performMouseInput { exit(Offset(-1f, -1f)) }
 
         rule.runOnIdle {
             assertThat(interactions).hasSize(2)
             assertThat(interactions.first()).isInstanceOf(HoverInteraction.Enter::class.java)
-            assertThat(interactions[1])
-                .isInstanceOf(HoverInteraction.Exit::class.java)
-            assertThat((interactions[1] as HoverInteraction.Exit).enter)
-                .isEqualTo(interactions[0])
+            assertThat(interactions[1]).isInstanceOf(HoverInteraction.Exit::class.java)
+            assertThat((interactions[1] as HoverInteraction.Exit).enter).isEqualTo(interactions[0])
         }
     }
 
@@ -601,8 +542,7 @@
             inputModeManager = LocalInputModeManager.current
             Box {
                 Box(
-                    Modifier
-                        .focusRequester(focusRequester)
+                    Modifier.focusRequester(focusRequester)
                         .toggleable(
                             value = true,
                             interactionSource = interactionSource,
@@ -617,24 +557,17 @@
 
         val interactions = mutableListOf<Interaction>()
 
-        scope.launch {
-            interactionSource.interactions.collect { interactions.add(it) }
-        }
+        scope.launch { interactionSource.interactions.collect { interactions.add(it) } }
+
+        rule.runOnIdle { assertThat(interactions).isEmpty() }
 
         rule.runOnIdle {
-            assertThat(interactions).isEmpty()
-        }
-
-        rule.runOnIdle {
-            @OptIn(ExperimentalComposeUiApi::class)
-            inputModeManager.requestInputMode(Touch)
+            @OptIn(ExperimentalComposeUiApi::class) inputModeManager.requestInputMode(Touch)
             focusRequester.requestFocus()
         }
 
         // Touch mode by default, so we shouldn't be focused
-        rule.runOnIdle {
-            assertThat(interactions).isEmpty()
-        }
+        rule.runOnIdle { assertThat(interactions).isEmpty() }
     }
 
     @Test
@@ -650,34 +583,28 @@
             focusManager = LocalFocusManager.current
             inputModeManager = LocalInputModeManager.current
             Box {
-                    Box(
-                        Modifier
-                            .focusRequester(focusRequester)
-                            .toggleable(
-                                value = true,
-                                interactionSource = interactionSource,
-                                indication = null,
-                                onValueChange = {}
-                            )
-                    ) {
-                        BasicText("ToggleableText")
-                    }
+                Box(
+                    Modifier.focusRequester(focusRequester)
+                        .toggleable(
+                            value = true,
+                            interactionSource = interactionSource,
+                            indication = null,
+                            onValueChange = {}
+                        )
+                ) {
+                    BasicText("ToggleableText")
                 }
+            }
         }
 
         val interactions = mutableListOf<Interaction>()
 
-        scope.launch {
-            interactionSource.interactions.collect { interactions.add(it) }
-        }
+        scope.launch { interactionSource.interactions.collect { interactions.add(it) } }
+
+        rule.runOnIdle { assertThat(interactions).isEmpty() }
 
         rule.runOnIdle {
-            assertThat(interactions).isEmpty()
-        }
-
-        rule.runOnIdle {
-            @OptIn(ExperimentalComposeUiApi::class)
-            inputModeManager.requestInputMode(Keyboard)
+            @OptIn(ExperimentalComposeUiApi::class) inputModeManager.requestInputMode(Keyboard)
             focusRequester.requestFocus()
         }
 
@@ -687,15 +614,12 @@
             assertThat(interactions.first()).isInstanceOf(FocusInteraction.Focus::class.java)
         }
 
-        rule.runOnIdle {
-            focusManager.clearFocus()
-        }
+        rule.runOnIdle { focusManager.clearFocus() }
 
         rule.runOnIdle {
             assertThat(interactions).hasSize(2)
             assertThat(interactions.first()).isInstanceOf(FocusInteraction.Focus::class.java)
-            assertThat(interactions[1])
-                .isInstanceOf(FocusInteraction.Unfocus::class.java)
+            assertThat(interactions[1]).isInstanceOf(FocusInteraction.Unfocus::class.java)
             assertThat((interactions[1] as FocusInteraction.Unfocus).focus)
                 .isEqualTo(interactions[0])
         }
@@ -710,72 +634,81 @@
             val modifier = Modifier.toggleable(value = true, onValueChange = {}) as InspectableValue
             assertThat(modifier.nameFallback).isEqualTo("toggleable")
             assertThat(modifier.valueOverride).isNull()
-            assertThat(modifier.inspectableElements.map { it.name }.asIterable()).containsExactly(
-                "value",
-                "enabled",
-                "role",
-                "onValueChange",
-            )
+            assertThat(modifier.inspectableElements.map { it.name }.asIterable())
+                .containsExactly(
+                    "value",
+                    "enabled",
+                    "role",
+                    "onValueChange",
+                )
         }
     }
 
     @Test
     fun toggleableTest_testInspectorValue_fullParams() {
         rule.setContent {
-            val modifier = Modifier.toggleable(
-                value = true,
-                onValueChange = {},
-                interactionSource = remember { MutableInteractionSource() },
-                indication = null
-            ).first() as InspectableValue
+            val modifier =
+                Modifier.toggleable(
+                        value = true,
+                        onValueChange = {},
+                        interactionSource = remember { MutableInteractionSource() },
+                        indication = null
+                    )
+                    .first() as InspectableValue
             assertThat(modifier.nameFallback).isEqualTo("toggleable")
             assertThat(modifier.valueOverride).isNull()
-            assertThat(modifier.inspectableElements.map { it.name }.asIterable()).containsExactly(
-                "value",
-                "indicationNodeFactory",
-                "interactionSource",
-                "enabled",
-                "role",
-                "onValueChange"
-            )
+            assertThat(modifier.inspectableElements.map { it.name }.asIterable())
+                .containsExactly(
+                    "value",
+                    "indicationNodeFactory",
+                    "interactionSource",
+                    "enabled",
+                    "role",
+                    "onValueChange"
+                )
         }
     }
 
     @Test
     fun toggleableTest_testInspectorValueTriState_noIndication() {
         rule.setContent {
-            val modifier = Modifier.triStateToggleable(state = ToggleableState.On, onClick = {})
-                as InspectableValue
+            val modifier =
+                Modifier.triStateToggleable(state = ToggleableState.On, onClick = {})
+                    as InspectableValue
             assertThat(modifier.nameFallback).isEqualTo("triStateToggleable")
             assertThat(modifier.valueOverride).isNull()
-            assertThat(modifier.inspectableElements.map { it.name }.asIterable()).containsExactly(
-                "state",
-                "enabled",
-                "role",
-                "onClick",
-            )
+            assertThat(modifier.inspectableElements.map { it.name }.asIterable())
+                .containsExactly(
+                    "state",
+                    "enabled",
+                    "role",
+                    "onClick",
+                )
         }
     }
 
     @Test
     fun toggleableTest_testInspectorValueTriState_fullParams() {
         rule.setContent {
-            val modifier = Modifier.triStateToggleable(
-                state = ToggleableState.On,
-                interactionSource = remember { MutableInteractionSource() },
-                indication = null,
-                onClick = {}
-            ).first() as InspectableValue
+            val modifier =
+                Modifier.triStateToggleable(
+                        state = ToggleableState.On,
+                        interactionSource = remember { MutableInteractionSource() },
+                        indication = null,
+                        onClick = {}
+                    )
+                    .first() as InspectableValue
             assertThat(modifier.nameFallback).isEqualTo("triStateToggleable")
             assertThat(modifier.valueOverride).isNull()
-            assertThat(modifier.inspectableElements.map { it.name }.asIterable()).containsExactly(
-                "state",
-                "indicationNodeFactory",
-                "interactionSource",
-                "enabled",
-                "role",
-                "onClick"
-            )
+            assertThat(modifier.inspectableElements.map { it.name }.asIterable())
+                .containsExactly(
+                    "state",
+                    "indicationNodeFactory",
+                    "interactionSource",
+                    "enabled",
+                    "role",
+                    "onClick"
+                )
         }
     }
 
@@ -818,26 +751,25 @@
         }
     }
 
-    private fun testToggleableMinTouchTarget(modifier: () -> Modifier): Unit = with(rule.density) {
-        val tag = "toggleable"
-        rule.setContent {
-            Box(Modifier.fillMaxSize()) {
-                Box(modifier().requiredSize(2.dp).testTag(tag)) {
-                    BasicText("ToggleableText")
+    private fun testToggleableMinTouchTarget(modifier: () -> Modifier): Unit =
+        with(rule.density) {
+            val tag = "toggleable"
+            rule.setContent {
+                Box(Modifier.fillMaxSize()) {
+                    Box(modifier().requiredSize(2.dp).testTag(tag)) { BasicText("ToggleableText") }
                 }
             }
-        }
 
-        rule.onNodeWithTag(tag)
-            .assertIsOff()
-            .assertWidthIsEqualTo(2.dp)
-            .assertHeightIsEqualTo(2.dp)
-            .assertTouchWidthIsEqualTo(48.dp)
-            .assertTouchHeightIsEqualTo(48.dp)
-            .performTouchInput {
-                click(position = Offset(-1f, -1f))
-            }.assertIsOn()
-    }
+            rule
+                .onNodeWithTag(tag)
+                .assertIsOff()
+                .assertWidthIsEqualTo(2.dp)
+                .assertHeightIsEqualTo(2.dp)
+                .assertTouchWidthIsEqualTo(48.dp)
+                .assertTouchHeightIsEqualTo(48.dp)
+                .performTouchInput { click(position = Offset(-1f, -1f)) }
+                .assertIsOn()
+        }
 
     @Test
     @OptIn(ExperimentalTestApi::class, ExperimentalComposeUiApi::class)
@@ -849,16 +781,17 @@
             inputModeManager = LocalInputModeManager.current
             BasicText(
                 "ToggleableText",
-                modifier = Modifier
-                    .testTag("toggleable")
-                    .focusRequester(focusRequester)
-                    .toggleable(value = toggled) { toggled = it }
+                modifier =
+                    Modifier.testTag("toggleable").focusRequester(focusRequester).toggleable(
+                        value = toggled
+                    ) {
+                        toggled = it
+                    }
             )
         }
 
         rule.runOnIdle {
-            @OptIn(ExperimentalComposeUiApi::class)
-            inputModeManager.requestInputMode(Keyboard)
+            @OptIn(ExperimentalComposeUiApi::class) inputModeManager.requestInputMode(Keyboard)
             focusRequester.requestFocus()
         }
 
@@ -882,16 +815,17 @@
             inputModeManager = LocalInputModeManager.current
             BasicText(
                 "ToggleableText",
-                modifier = Modifier
-                    .testTag("toggleable")
-                    .focusRequester(focusRequester)
-                    .toggleable(value = toggled) { toggled = it }
+                modifier =
+                    Modifier.testTag("toggleable").focusRequester(focusRequester).toggleable(
+                        value = toggled
+                    ) {
+                        toggled = it
+                    }
             )
         }
 
         rule.runOnIdle {
-            @OptIn(ExperimentalComposeUiApi::class)
-            inputModeManager.requestInputMode(Keyboard)
+            @OptIn(ExperimentalComposeUiApi::class) inputModeManager.requestInputMode(Keyboard)
             focusRequester.requestFocus()
         }
 
@@ -915,16 +849,17 @@
             inputModeManager = LocalInputModeManager.current
             BasicText(
                 "ToggleableText",
-                modifier = Modifier
-                    .testTag("toggleable")
-                    .focusRequester(focusRequester)
-                    .toggleable(value = toggled) { toggled = it }
+                modifier =
+                    Modifier.testTag("toggleable").focusRequester(focusRequester).toggleable(
+                        value = toggled
+                    ) {
+                        toggled = it
+                    }
             )
         }
 
         rule.runOnIdle {
-            @OptIn(ExperimentalComposeUiApi::class)
-            inputModeManager.requestInputMode(Keyboard)
+            @OptIn(ExperimentalComposeUiApi::class) inputModeManager.requestInputMode(Keyboard)
             focusRequester.requestFocus()
         }
 
@@ -948,16 +883,15 @@
             inputModeManager = LocalInputModeManager.current
             BasicText(
                 "ToggleableText",
-                modifier = Modifier
-                    .testTag("toggleable")
-                    .focusRequester(focusRequester)
-                    .triStateToggleable(ToggleableState(toggled)) { toggled = !toggled }
+                modifier =
+                    Modifier.testTag("toggleable")
+                        .focusRequester(focusRequester)
+                        .triStateToggleable(ToggleableState(toggled)) { toggled = !toggled }
             )
         }
 
         rule.runOnIdle {
-            @OptIn(ExperimentalComposeUiApi::class)
-            inputModeManager.requestInputMode(Keyboard)
+            @OptIn(ExperimentalComposeUiApi::class) inputModeManager.requestInputMode(Keyboard)
             focusRequester.requestFocus()
         }
 
@@ -982,11 +916,10 @@
             inputModeManager = LocalInputModeManager.current
             scope = rememberCoroutineScope()
             Box(Modifier.padding(10.dp)) {
-                BasicText("ToggleableText",
-                    modifier = Modifier
-                        .testTag("toggleable")
-                        .focusRequester(focusRequester)
-                        .toggleable(
+                BasicText(
+                    "ToggleableText",
+                    modifier =
+                        Modifier.testTag("toggleable").focusRequester(focusRequester).toggleable(
                             value = false,
                             interactionSource = interactionSource,
                             indication = null
@@ -996,15 +929,12 @@
         }
 
         rule.runOnIdle {
-            @OptIn(ExperimentalComposeUiApi::class)
-            inputModeManager.requestInputMode(Keyboard)
+            @OptIn(ExperimentalComposeUiApi::class) inputModeManager.requestInputMode(Keyboard)
             focusRequester.requestFocus()
         }
 
         val interactions = mutableListOf<Interaction>()
-        scope.launch {
-            interactionSource.interactions.collect { interactions.add(it) }
-        }
+        scope.launch { interactionSource.interactions.collect { interactions.add(it) } }
 
         rule.onNodeWithTag("toggleable").performKeyInput { keyDown(Key.Enter) }
 
@@ -1034,11 +964,10 @@
             scope = rememberCoroutineScope()
             inputModeManager = LocalInputModeManager.current
             Box(Modifier.padding(10.dp)) {
-                BasicText("ToggleableText",
-                    modifier = Modifier
-                        .testTag("toggleable")
-                        .focusRequester(focusRequester)
-                        .toggleable(
+                BasicText(
+                    "ToggleableText",
+                    modifier =
+                        Modifier.testTag("toggleable").focusRequester(focusRequester).toggleable(
                             value = false,
                             interactionSource = interactionSource,
                             indication = null
@@ -1048,15 +977,12 @@
         }
 
         rule.runOnIdle {
-            @OptIn(ExperimentalComposeUiApi::class)
-            inputModeManager.requestInputMode(Keyboard)
+            @OptIn(ExperimentalComposeUiApi::class) inputModeManager.requestInputMode(Keyboard)
             focusRequester.requestFocus()
         }
 
         val interactions = mutableListOf<Interaction>()
-        scope.launch {
-            interactionSource.interactions.collect { interactions.add(it) }
-        }
+        scope.launch { interactionSource.interactions.collect { interactions.add(it) } }
 
         rule.onNodeWithTag("toggleable").performKeyInput { keyDown(Key.NumPadEnter) }
 
@@ -1085,11 +1011,10 @@
             scope = rememberCoroutineScope()
             inputModeManager = LocalInputModeManager.current
             Box(Modifier.padding(10.dp)) {
-                BasicText("ToggleableText",
-                    modifier = Modifier
-                        .testTag("toggleable")
-                        .focusRequester(focusRequester)
-                        .toggleable(
+                BasicText(
+                    "ToggleableText",
+                    modifier =
+                        Modifier.testTag("toggleable").focusRequester(focusRequester).toggleable(
                             value = false,
                             interactionSource = interactionSource,
                             indication = null
@@ -1099,16 +1024,13 @@
         }
 
         rule.runOnIdle {
-            @OptIn(ExperimentalComposeUiApi::class)
-            inputModeManager.requestInputMode(Keyboard)
+            @OptIn(ExperimentalComposeUiApi::class) inputModeManager.requestInputMode(Keyboard)
             focusRequester.requestFocus()
         }
         rule.waitForIdle()
 
         val interactions = mutableListOf<Interaction>()
-        scope.launch {
-            interactionSource.interactions.collect { interactions.add(it) }
-        }
+        scope.launch { interactionSource.interactions.collect { interactions.add(it) } }
 
         rule.onNodeWithTag("toggleable").performKeyInput { keyDown(Key.DirectionCenter) }
 
@@ -1137,11 +1059,10 @@
             scope = rememberCoroutineScope()
             inputModeManager = LocalInputModeManager.current
             Box(Modifier.padding(10.dp)) {
-                BasicText("ToggleableText",
-                    modifier = Modifier
-                        .testTag("toggleable")
-                        .focusRequester(focusRequester)
-                        .toggleable(
+                BasicText(
+                    "ToggleableText",
+                    modifier =
+                        Modifier.testTag("toggleable").focusRequester(focusRequester).toggleable(
                             value = false,
                             interactionSource = interactionSource,
                             indication = null
@@ -1151,20 +1072,15 @@
         }
 
         rule.runOnIdle {
-            @OptIn(ExperimentalComposeUiApi::class)
-            inputModeManager.requestInputMode(Keyboard)
+            @OptIn(ExperimentalComposeUiApi::class) inputModeManager.requestInputMode(Keyboard)
             focusRequester.requestFocus()
         }
 
         val interactions = mutableListOf<Interaction>()
-        scope.launch {
-            interactionSource.interactions.collect { interactions.add(it) }
-        }
+        scope.launch { interactionSource.interactions.collect { interactions.add(it) } }
 
         rule.onNodeWithTag("toggleable").performKeyInput { pressKey(Key.Spacebar) }
-        rule.runOnIdle {
-            assertThat(interactions).isEmpty()
-        }
+        rule.runOnIdle { assertThat(interactions).isEmpty() }
     }
 
     @Test
@@ -1178,11 +1094,10 @@
             scope = rememberCoroutineScope()
             inputModeManager = LocalInputModeManager.current
             Box(Modifier.padding(10.dp)) {
-                BasicText("ToggleableText",
-                    modifier = Modifier
-                        .testTag("toggleable")
-                        .focusRequester(focusRequester)
-                        .toggleable(
+                BasicText(
+                    "ToggleableText",
+                    modifier =
+                        Modifier.testTag("toggleable").focusRequester(focusRequester).toggleable(
                             value = false,
                             interactionSource = interactionSource,
                             indication = null
@@ -1192,15 +1107,12 @@
         }
 
         rule.runOnIdle {
-            @OptIn(ExperimentalComposeUiApi::class)
-            inputModeManager.requestInputMode(Keyboard)
+            @OptIn(ExperimentalComposeUiApi::class) inputModeManager.requestInputMode(Keyboard)
             focusRequester.requestFocus()
         }
 
         val interactions = mutableListOf<Interaction>()
-        scope.launch {
-            interactionSource.interactions.collect { interactions.add(it) }
-        }
+        scope.launch { interactionSource.interactions.collect { interactions.add(it) } }
 
         val toggleableNode = rule.onNodeWithTag("toggleable")
 
@@ -1244,34 +1156,31 @@
             scope = rememberCoroutineScope()
             inputModeManager = LocalInputModeManager.current
             Box(Modifier.padding(10.dp)) {
-                BasicText("ToggleableText",
-                    modifier = Modifier
-                        .testTag("toggleable")
-                        .focusRequester(focusRequester)
-                        .onKeyEvent {
-                            if (it.nativeKeyEvent.repeatCount != 0)
-                                repeatCounter++
-                            false
-                        }
-                        .toggleable(
-                            value = false,
-                            interactionSource = interactionSource,
-                            indication = null,
-                        ) {}
+                BasicText(
+                    "ToggleableText",
+                    modifier =
+                        Modifier.testTag("toggleable")
+                            .focusRequester(focusRequester)
+                            .onKeyEvent {
+                                if (it.nativeKeyEvent.repeatCount != 0) repeatCounter++
+                                false
+                            }
+                            .toggleable(
+                                value = false,
+                                interactionSource = interactionSource,
+                                indication = null,
+                            ) {}
                 )
             }
         }
 
         rule.runOnIdle {
-            @OptIn(ExperimentalComposeUiApi::class)
-            inputModeManager.requestInputMode(Keyboard)
+            @OptIn(ExperimentalComposeUiApi::class) inputModeManager.requestInputMode(Keyboard)
             focusRequester.requestFocus()
         }
 
         val interactions = mutableListOf<Interaction>()
-        scope.launch {
-            interactionSource.interactions.collect { interactions.add(it) }
-        }
+        scope.launch { interactionSource.interactions.collect { interactions.add(it) } }
 
         rule.onNodeWithTag("toggleable").performKeyInput {
             keyDown(Key.Enter)
@@ -1309,11 +1218,10 @@
             scope = rememberCoroutineScope()
             inputModeManager = LocalInputModeManager.current
             Box(Modifier.padding(10.dp)) {
-                BasicText("ToggleableText",
-                    modifier = Modifier
-                        .testTag("toggleable")
-                        .focusRequester(focusRequester)
-                        .toggleable(
+                BasicText(
+                    "ToggleableText",
+                    modifier =
+                        Modifier.testTag("toggleable").focusRequester(focusRequester).toggleable(
                             value = false,
                             interactionSource = interactionSource,
                             indication = null,
@@ -1324,15 +1232,12 @@
         }
 
         rule.runOnIdle {
-            @OptIn(ExperimentalComposeUiApi::class)
-            inputModeManager.requestInputMode(Keyboard)
+            @OptIn(ExperimentalComposeUiApi::class) inputModeManager.requestInputMode(Keyboard)
             focusRequester.requestFocus()
         }
 
         val interactions = mutableListOf<Interaction>()
-        scope.launch {
-            interactionSource.interactions.collect { interactions.add(it) }
-        }
+        scope.launch { interactionSource.interactions.collect { interactions.add(it) } }
 
         val toggleableNode = rule.onNodeWithTag("toggleable")
 
@@ -1376,18 +1281,18 @@
             interactionSource = source
             created = true
             coroutineScope.launch {
-                interactionSource.interactions.collect {
-                    interaction -> interactions.add(interaction)
+                interactionSource.interactions.collect { interaction ->
+                    interactions.add(interaction)
                 }
             }
         }
 
         rule.setContent {
             Box(Modifier.padding(10.dp)) {
-                BasicText("Toggleable",
-                    modifier = Modifier
-                        .testTag("toggleable")
-                        .toggleable(
+                BasicText(
+                    "Toggleable",
+                    modifier =
+                        Modifier.testTag("toggleable").toggleable(
                             value = false,
                             interactionSource = null,
                             indication = indication
@@ -1396,13 +1301,10 @@
             }
         }
 
-        rule.runOnIdle {
-            assertThat(created).isFalse()
-        }
+        rule.runOnIdle { assertThat(created).isFalse() }
 
         // The touch event should cause the indication node to be created
-        rule.onNodeWithTag("toggleable")
-            .performTouchInput { down(center) }
+        rule.onNodeWithTag("toggleable").performTouchInput { down(center) }
 
         rule.runOnIdle {
             assertThat(created).isTrue()
@@ -1421,18 +1323,18 @@
             interactionSource = source
             created = true
             coroutineScope.launch {
-                interactionSource.interactions.collect {
-                        interaction -> interactions.add(interaction)
+                interactionSource.interactions.collect { interaction ->
+                    interactions.add(interaction)
                 }
             }
         }
 
         rule.setContent {
             Box(Modifier.padding(10.dp)) {
-                BasicText("Toggleable",
-                    modifier = Modifier
-                        .testTag("toggleable")
-                        .triStateToggleable(
+                BasicText(
+                    "Toggleable",
+                    modifier =
+                        Modifier.testTag("toggleable").triStateToggleable(
                             state = state,
                             interactionSource = null,
                             indication = indication
@@ -1441,13 +1343,10 @@
             }
         }
 
-        rule.runOnIdle {
-            assertThat(created).isFalse()
-        }
+        rule.runOnIdle { assertThat(created).isFalse() }
 
         // The touch event should cause the indication node to be created
-        rule.onNodeWithTag("toggleable")
-            .performTouchInput { down(center) }
+        rule.onNodeWithTag("toggleable").performTouchInput { down(center) }
 
         rule.runOnIdle {
             assertThat(created).isTrue()
@@ -1511,18 +1410,20 @@
     fun toggleable_nullInteractionSourceNonNullIndication_nonEquality() {
         val onValueChange: (Boolean) -> Unit = {}
         val indication = TestIndication {}
-        val modifier1 = Modifier.toggleable(
-            value = true,
-            interactionSource = null,
-            indication = indication,
-            onValueChange = onValueChange
-        )
-        val modifier2 = Modifier.toggleable(
-            value = true,
-            interactionSource = null,
-            indication = indication,
-            onValueChange = onValueChange
-        )
+        val modifier1 =
+            Modifier.toggleable(
+                value = true,
+                interactionSource = null,
+                indication = indication,
+                onValueChange = onValueChange
+            )
+        val modifier2 =
+            Modifier.toggleable(
+                value = true,
+                interactionSource = null,
+                indication = indication,
+                onValueChange = onValueChange
+            )
 
         // Indication requires composed, so cannot compare equal
         assertThat(modifier1).isNotEqualTo(modifier2)
@@ -1548,18 +1449,20 @@
         val onValueChange: (Boolean) -> Unit = {}
         val interactionSource = MutableInteractionSource()
         val indication = TestIndication {}
-        val modifier1 = Modifier.toggleable(
-            value = true,
-            interactionSource = interactionSource,
-            indication = indication,
-            onValueChange = onValueChange
-        )
-        val modifier2 = Modifier.toggleable(
-            value = true,
-            interactionSource = interactionSource,
-            indication = indication,
-            onValueChange = onValueChange
-        )
+        val modifier1 =
+            Modifier.toggleable(
+                value = true,
+                interactionSource = interactionSource,
+                indication = indication,
+                onValueChange = onValueChange
+            )
+        val modifier2 =
+            Modifier.toggleable(
+                value = true,
+                interactionSource = interactionSource,
+                indication = indication,
+                onValueChange = onValueChange
+            )
 
         // Indication requires composed, so cannot compare equal
         assertThat(modifier1).isNotEqualTo(modifier2)
@@ -1620,18 +1523,20 @@
     fun triStateToggleable_nullInteractionSourceNonNullIndication_nonEquality() {
         val onClick = {}
         val indication = TestIndication {}
-        val modifier1 = Modifier.triStateToggleable(
-            state = ToggleableState.On,
-            interactionSource = null,
-            indication = indication,
-            onClick = onClick
-        )
-        val modifier2 = Modifier.triStateToggleable(
-            state = ToggleableState.On,
-            interactionSource = null,
-            indication = indication,
-            onClick = onClick
-        )
+        val modifier1 =
+            Modifier.triStateToggleable(
+                state = ToggleableState.On,
+                interactionSource = null,
+                indication = indication,
+                onClick = onClick
+            )
+        val modifier2 =
+            Modifier.triStateToggleable(
+                state = ToggleableState.On,
+                interactionSource = null,
+                indication = indication,
+                onClick = onClick
+            )
 
         // Indication requires composed, so cannot compare equal
         assertThat(modifier1).isNotEqualTo(modifier2)
@@ -1657,18 +1562,20 @@
         val onClick = {}
         val interactionSource = MutableInteractionSource()
         val indication = TestIndication {}
-        val modifier1 = Modifier.triStateToggleable(
-            state = ToggleableState.On,
-            interactionSource = interactionSource,
-            indication = indication,
-            onClick = onClick
-        )
-        val modifier2 = Modifier.triStateToggleable(
-            state = ToggleableState.On,
-            interactionSource = interactionSource,
-            indication = indication,
-            onClick = onClick
-        )
+        val modifier1 =
+            Modifier.triStateToggleable(
+                state = ToggleableState.On,
+                interactionSource = interactionSource,
+                indication = indication,
+                onClick = onClick
+            )
+        val modifier2 =
+            Modifier.triStateToggleable(
+                state = ToggleableState.On,
+                interactionSource = interactionSource,
+                indication = indication,
+                onClick = onClick
+            )
 
         // Indication requires composed, so cannot compare equal
         assertThat(modifier1).isNotEqualTo(modifier2)
diff --git a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/shape/AbsoluteCutCornerShapeTest.kt b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/shape/AbsoluteCutCornerShapeTest.kt
index 2fef2cd..7f3227e 100644
--- a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/shape/AbsoluteCutCornerShapeTest.kt
+++ b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/shape/AbsoluteCutCornerShapeTest.kt
@@ -37,10 +37,8 @@
     companion object {
         @JvmStatic
         @Parameterized.Parameters(name = "{0}")
-        fun initParameters(): Array<LayoutDirection> = arrayOf(
-            LayoutDirection.Ltr,
-            LayoutDirection.Rtl
-        )
+        fun initParameters(): Array<LayoutDirection> =
+            arrayOf(LayoutDirection.Ltr, LayoutDirection.Rtl)
     }
 
     private val density = Density(2f)
@@ -73,12 +71,7 @@
         val size2 = 22f
         val size3 = 32f
         val size4 = 42f
-        val cut = AbsoluteCutCornerShape(
-            size1,
-            size2,
-            size3,
-            size4
-        )
+        val cut = AbsoluteCutCornerShape(size1, size2, size3, size4)
 
         val outline = cut.toOutline() as Outline.Generic
         assertPathsEquals(
@@ -99,90 +92,80 @@
 
     @Test
     fun createsRectangleOutlineForZeroSizedCorners() {
-        val rounded = AbsoluteCutCornerShape(
-            0.0f,
-            0.0f,
-            0.0f,
-            0.0f
-        )
+        val rounded = AbsoluteCutCornerShape(0.0f, 0.0f, 0.0f, 0.0f)
 
-        assertThat(rounded.toOutline())
-            .isEqualTo(Outline.Rectangle(size.toRect()))
+        assertThat(rounded.toOutline()).isEqualTo(Outline.Rectangle(size.toRect()))
     }
 
     @Test
     fun cutCornerShapesAreEquals() {
-        assertThat(AbsoluteCutCornerShape(10.0f))
-            .isEqualTo(AbsoluteCutCornerShape(10.0f))
+        assertThat(AbsoluteCutCornerShape(10.0f)).isEqualTo(AbsoluteCutCornerShape(10.0f))
     }
 
     @Test
     fun cutCornerUpdateAllCornerSize() {
-        assertThat(
-            AbsoluteCutCornerShape(10.0f).copy(
-                CornerSize(
-                    5.0f
-                )
-            )
-        )
+        assertThat(AbsoluteCutCornerShape(10.0f).copy(CornerSize(5.0f)))
             .isEqualTo(AbsoluteCutCornerShape(5.0f))
     }
 
     @Test
     fun cutCornerUpdateTwoCornerSizes() {
         assertThat(
-            AbsoluteCutCornerShape(10.0f).copy(
-                topEnd = CornerSize(3.dp),
-                bottomEnd = CornerSize(50)
+                AbsoluteCutCornerShape(10.0f)
+                    .copy(topEnd = CornerSize(3.dp), bottomEnd = CornerSize(50))
             )
-        ).isEqualTo(
-            AbsoluteCutCornerShape(
-                topLeft = CornerSize(10.0f),
-                topRight = CornerSize(3.dp),
-                bottomLeft = CornerSize(10.0f),
-                bottomRight = CornerSize(50)
+            .isEqualTo(
+                AbsoluteCutCornerShape(
+                    topLeft = CornerSize(10.0f),
+                    topRight = CornerSize(3.dp),
+                    bottomLeft = CornerSize(10.0f),
+                    bottomRight = CornerSize(50)
+                )
             )
-        )
     }
 
     @Test
     fun objectsWithTheSameCornersAreEquals() {
         @Suppress("ReplaceCallWithBinaryOperator")
         assertThat(
-            AbsoluteCutCornerShape(
-                topLeft = CornerSize(4.0f),
-                topRight = CornerSize(3.0f),
-                bottomLeft = CornerSize(3.dp),
-                bottomRight = CornerSize(50)
-            ).equals(
                 AbsoluteCutCornerShape(
-                    topLeft = CornerSize(4.0f),
-                    topRight = CornerSize(3.0f),
-                    bottomLeft = CornerSize(3.dp),
-                    bottomRight = CornerSize(50)
-                )
+                        topLeft = CornerSize(4.0f),
+                        topRight = CornerSize(3.0f),
+                        bottomLeft = CornerSize(3.dp),
+                        bottomRight = CornerSize(50)
+                    )
+                    .equals(
+                        AbsoluteCutCornerShape(
+                            topLeft = CornerSize(4.0f),
+                            topRight = CornerSize(3.0f),
+                            bottomLeft = CornerSize(3.dp),
+                            bottomRight = CornerSize(50)
+                        )
+                    )
             )
-        ).isTrue()
+            .isTrue()
     }
 
     @Test
     fun objectsWithDifferentCornersAreNotEquals() {
         @Suppress("ReplaceCallWithBinaryOperator")
         assertThat(
-            AbsoluteCutCornerShape(
-                topLeft = CornerSize(4.0f),
-                topRight = CornerSize(3.0f),
-                bottomLeft = CornerSize(3.dp),
-                bottomRight = CornerSize(50)
-            ).equals(
                 AbsoluteCutCornerShape(
-                    topLeft = CornerSize(4.0f),
-                    topRight = CornerSize(5.0f),
-                    bottomLeft = CornerSize(3.dp),
-                    bottomRight = CornerSize(50)
-                )
+                        topLeft = CornerSize(4.0f),
+                        topRight = CornerSize(3.0f),
+                        bottomLeft = CornerSize(3.dp),
+                        bottomRight = CornerSize(50)
+                    )
+                    .equals(
+                        AbsoluteCutCornerShape(
+                            topLeft = CornerSize(4.0f),
+                            topRight = CornerSize(5.0f),
+                            bottomLeft = CornerSize(3.dp),
+                            bottomRight = CornerSize(50)
+                        )
+                    )
             )
-        ).isFalse()
+            .isFalse()
     }
 
     @Test
@@ -195,11 +178,12 @@
                 bottomLeft = 4.dp
             ),
             AbsoluteCutCornerShape(
-                topLeft = 1.dp,
-                topRight = 2.dp,
-                bottomRight = 3.dp,
-                bottomLeft = 4.dp
-            ).copy(topStart = CornerSize(5.dp), topEnd = CornerSize(6.dp))
+                    topLeft = 1.dp,
+                    topRight = 2.dp,
+                    bottomRight = 3.dp,
+                    bottomLeft = 4.dp
+                )
+                .copy(topStart = CornerSize(5.dp), topEnd = CornerSize(6.dp))
         )
         assertEquals(
             AbsoluteCutCornerShape(
@@ -209,14 +193,14 @@
                 bottomLeft = 6.dp
             ),
             AbsoluteCutCornerShape(
-                topLeft = 1.dp,
-                topRight = 2.dp,
-                bottomRight = 3.dp,
-                bottomLeft = 4.dp
-            ).copy(bottomEnd = CornerSize(5.dp), bottomStart = CornerSize(6.dp))
+                    topLeft = 1.dp,
+                    topRight = 2.dp,
+                    bottomRight = 3.dp,
+                    bottomLeft = 4.dp
+                )
+                .copy(bottomEnd = CornerSize(5.dp), bottomStart = CornerSize(6.dp))
         )
     }
 
-    private fun Shape.toOutline() =
-        createOutline(size, layoutDirection, density)
+    private fun Shape.toOutline() = createOutline(size, layoutDirection, density)
 }
diff --git a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/shape/AbsoluteRoundedCornerShapeTest.kt b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/shape/AbsoluteRoundedCornerShapeTest.kt
index 8774e9e..6649916 100644
--- a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/shape/AbsoluteRoundedCornerShapeTest.kt
+++ b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/shape/AbsoluteRoundedCornerShapeTest.kt
@@ -38,10 +38,8 @@
     companion object {
         @JvmStatic
         @Parameterized.Parameters(name = "{0}")
-        fun initParameters(): Array<LayoutDirection> = arrayOf(
-            LayoutDirection.Ltr,
-            LayoutDirection.Rtl
-        )
+        fun initParameters(): Array<LayoutDirection> =
+            arrayOf(LayoutDirection.Ltr, LayoutDirection.Rtl)
     }
 
     private val density = Density(2f)
@@ -53,9 +51,7 @@
 
         val expectedRadius = CornerRadius(25f)
         val outline = rounded.toOutline() as Outline.Rounded
-        assertThat(outline.roundRect).isEqualTo(
-            RoundRect(size.toRect(), expectedRadius)
-        )
+        assertThat(outline.roundRect).isEqualTo(RoundRect(size.toRect(), expectedRadius))
     }
 
     @Test
@@ -64,141 +60,127 @@
         val radius2 = 22f
         val radius3 = 32f
         val radius4 = 42f
-        val rounded = AbsoluteRoundedCornerShape(
-            radius1,
-            radius2,
-            radius3,
-            radius4
-        )
+        val rounded = AbsoluteRoundedCornerShape(radius1, radius2, radius3, radius4)
 
         val outline = rounded.toOutline() as Outline.Rounded
-        assertThat(outline.roundRect).isEqualTo(
-            RoundRect(
-                size.toRect(),
-                CornerRadius(radius1),
-                CornerRadius(radius2),
-                CornerRadius(radius3),
-                CornerRadius(radius4)
+        assertThat(outline.roundRect)
+            .isEqualTo(
+                RoundRect(
+                    size.toRect(),
+                    CornerRadius(radius1),
+                    CornerRadius(radius2),
+                    CornerRadius(radius3),
+                    CornerRadius(radius4)
+                )
             )
-        )
     }
 
     @Test
     fun createsRectangleOutlineForZeroSizedCorners() {
-        val rounded = AbsoluteRoundedCornerShape(
-            0.0f,
-            0.0f,
-            0.0f,
-            0.0f
-        )
+        val rounded = AbsoluteRoundedCornerShape(0.0f, 0.0f, 0.0f, 0.0f)
 
-        assertThat(rounded.toOutline())
-            .isEqualTo(Outline.Rectangle(size.toRect()))
+        assertThat(rounded.toOutline()).isEqualTo(Outline.Rectangle(size.toRect()))
     }
 
     @Test
     fun roundedCornerShapesAreEquals() {
-        assertThat(AbsoluteRoundedCornerShape(12.dp))
-            .isEqualTo(AbsoluteRoundedCornerShape(12.dp))
+        assertThat(AbsoluteRoundedCornerShape(12.dp)).isEqualTo(AbsoluteRoundedCornerShape(12.dp))
     }
 
     @Test
     fun roundedCornerUpdateAllCornerSize() {
-        assertThat(
-            AbsoluteRoundedCornerShape(10.0f).copy(
-                CornerSize(
-                    5.dp
-                )
-            )
-        )
+        assertThat(AbsoluteRoundedCornerShape(10.0f).copy(CornerSize(5.dp)))
             .isEqualTo(AbsoluteRoundedCornerShape(5.dp))
     }
 
     @Test
     fun roundedCornerUpdateTwoCornerSizes() {
-        val original = AbsoluteRoundedCornerShape(10.0f)
-            .copy(
-                topStart = CornerSize(3.dp),
-                bottomEnd = CornerSize(50)
-            )
+        val original =
+            AbsoluteRoundedCornerShape(10.0f)
+                .copy(topStart = CornerSize(3.dp), bottomEnd = CornerSize(50))
 
         assertEquals(CornerSize(3.dp), original.topStart)
         assertEquals(CornerSize(10.0f), original.topEnd)
         assertEquals(CornerSize(50), original.bottomEnd)
         assertEquals(CornerSize(10f), original.bottomStart)
         assertThat(
-            AbsoluteRoundedCornerShape(10.0f).copy(
-                topStart = CornerSize(3.dp),
-                bottomEnd = CornerSize(50)
+                AbsoluteRoundedCornerShape(10.0f)
+                    .copy(topStart = CornerSize(3.dp), bottomEnd = CornerSize(50))
             )
-        ).isEqualTo(
-            AbsoluteRoundedCornerShape(
-                topLeft = CornerSize(3.dp),
-                topRight = CornerSize(10.0f),
-                bottomRight = CornerSize(50),
-                bottomLeft = CornerSize(10.0f)
+            .isEqualTo(
+                AbsoluteRoundedCornerShape(
+                    topLeft = CornerSize(3.dp),
+                    topRight = CornerSize(10.0f),
+                    bottomRight = CornerSize(50),
+                    bottomLeft = CornerSize(10.0f)
+                )
             )
-        )
     }
 
     @Test
     fun objectsWithTheSameCornersAreEquals() {
         @Suppress("ReplaceCallWithBinaryOperator")
         assertThat(
-            AbsoluteRoundedCornerShape(
-                topLeft = CornerSize(4.0f),
-                topRight = CornerSize(3.0f),
-                bottomRight = CornerSize(3.dp),
-                bottomLeft = CornerSize(50)
-            ).equals(
                 AbsoluteRoundedCornerShape(
-                    topLeft = CornerSize(4.0f),
-                    topRight = CornerSize(3.0f),
-                    bottomRight = CornerSize(3.dp),
-                    bottomLeft = CornerSize(50)
-                )
+                        topLeft = CornerSize(4.0f),
+                        topRight = CornerSize(3.0f),
+                        bottomRight = CornerSize(3.dp),
+                        bottomLeft = CornerSize(50)
+                    )
+                    .equals(
+                        AbsoluteRoundedCornerShape(
+                            topLeft = CornerSize(4.0f),
+                            topRight = CornerSize(3.0f),
+                            bottomRight = CornerSize(3.dp),
+                            bottomLeft = CornerSize(50)
+                        )
+                    )
             )
-        ).isTrue()
+            .isTrue()
     }
 
     @Test
     fun objectsWithDifferentCornersAreNotEquals() {
         @Suppress("ReplaceCallWithBinaryOperator")
         assertThat(
-            AbsoluteRoundedCornerShape(
-                topLeft = CornerSize(4.0f),
-                topRight = CornerSize(3.0f),
-                bottomRight = CornerSize(3.dp),
-                bottomLeft = CornerSize(50)
-            ).equals(
                 AbsoluteRoundedCornerShape(
-                    topLeft = CornerSize(4.0f),
-                    topRight = CornerSize(5.0f),
-                    bottomRight = CornerSize(3.dp),
-                    bottomLeft = CornerSize(50)
-                )
+                        topLeft = CornerSize(4.0f),
+                        topRight = CornerSize(3.0f),
+                        bottomRight = CornerSize(3.dp),
+                        bottomLeft = CornerSize(50)
+                    )
+                    .equals(
+                        AbsoluteRoundedCornerShape(
+                            topLeft = CornerSize(4.0f),
+                            topRight = CornerSize(5.0f),
+                            bottomRight = CornerSize(3.dp),
+                            bottomLeft = CornerSize(50)
+                        )
+                    )
             )
-        ).isFalse()
+            .isFalse()
     }
 
     @Test
     fun notEqualsToCutCornersWithTheSameSizes() {
         @Suppress("ReplaceCallWithBinaryOperator")
         assertThat(
-            AbsoluteRoundedCornerShape(
-                topLeft = CornerSize(4.0f),
-                topRight = CornerSize(3.0f),
-                bottomRight = CornerSize(3.dp),
-                bottomLeft = CornerSize(50)
-            ).equals(
-                AbsoluteCutCornerShape(
-                    topLeft = CornerSize(4.0f),
-                    topRight = CornerSize(3.0f),
-                    bottomRight = CornerSize(3.dp),
-                    bottomLeft = CornerSize(50)
-                )
+                AbsoluteRoundedCornerShape(
+                        topLeft = CornerSize(4.0f),
+                        topRight = CornerSize(3.0f),
+                        bottomRight = CornerSize(3.dp),
+                        bottomLeft = CornerSize(50)
+                    )
+                    .equals(
+                        AbsoluteCutCornerShape(
+                            topLeft = CornerSize(4.0f),
+                            topRight = CornerSize(3.0f),
+                            bottomRight = CornerSize(3.dp),
+                            bottomLeft = CornerSize(50)
+                        )
+                    )
             )
-        ).isFalse()
+            .isFalse()
     }
 
     @Test
@@ -211,11 +193,12 @@
                 bottomLeft = 4.dp
             ),
             AbsoluteRoundedCornerShape(
-                topLeft = 1.dp,
-                topRight = 2.dp,
-                bottomRight = 3.dp,
-                bottomLeft = 4.dp
-            ).copy(topStart = CornerSize(5.dp), topEnd = CornerSize(6.dp))
+                    topLeft = 1.dp,
+                    topRight = 2.dp,
+                    bottomRight = 3.dp,
+                    bottomLeft = 4.dp
+                )
+                .copy(topStart = CornerSize(5.dp), topEnd = CornerSize(6.dp))
         )
         assertEquals(
             AbsoluteRoundedCornerShape(
@@ -225,14 +208,14 @@
                 bottomLeft = 6.dp
             ),
             AbsoluteRoundedCornerShape(
-                topLeft = 1.dp,
-                topRight = 2.dp,
-                bottomRight = 3.dp,
-                bottomLeft = 4.dp
-            ).copy(bottomEnd = CornerSize(5.dp), bottomStart = CornerSize(6.dp))
+                    topLeft = 1.dp,
+                    topRight = 2.dp,
+                    bottomRight = 3.dp,
+                    bottomLeft = 4.dp
+                )
+                .copy(bottomEnd = CornerSize(5.dp), bottomStart = CornerSize(6.dp))
         )
     }
 
-    private fun Shape.toOutline() =
-        createOutline(size, layoutDirection, density)
+    private fun Shape.toOutline() = createOutline(size, layoutDirection, density)
 }
diff --git a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/shape/CornerBasedShapeTest.kt b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/shape/CornerBasedShapeTest.kt
index 58285ba..d20b446 100644
--- a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/shape/CornerBasedShapeTest.kt
+++ b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/shape/CornerBasedShapeTest.kt
@@ -37,27 +37,30 @@
         val density = Density(2f, 1f)
         val passedSize = Size(100.0f, 50.0f)
         var assertionExecuted = false
-        val assertSizes = { size: Size,
-            topStart: Float,
-            topEnd: Float,
-            bottomEnd: Float,
-            bottomStart: Float,
-            ld: LayoutDirection ->
-            assertThat(size).isEqualTo(passedSize)
-            assertThat(topStart).isEqualTo(4.0f)
-            assertThat(topEnd).isEqualTo(3.0f)
-            assertThat(bottomEnd).isEqualTo(6.0f)
-            assertThat(bottomStart).isEqualTo(25.0f)
-            assertThat(ld).isEqualTo(LayoutDirection.Ltr)
-            assertionExecuted = true
-        }
-        val impl = Impl(
-            topStart = CornerSize(4.0f),
-            topEnd = CornerSize(3.0f),
-            bottomEnd = CornerSize(3.dp),
-            bottomStart = CornerSize(50),
-            onOutlineRequested = assertSizes
-        )
+        val assertSizes =
+            {
+                size: Size,
+                topStart: Float,
+                topEnd: Float,
+                bottomEnd: Float,
+                bottomStart: Float,
+                ld: LayoutDirection ->
+                assertThat(size).isEqualTo(passedSize)
+                assertThat(topStart).isEqualTo(4.0f)
+                assertThat(topEnd).isEqualTo(3.0f)
+                assertThat(bottomEnd).isEqualTo(6.0f)
+                assertThat(bottomStart).isEqualTo(25.0f)
+                assertThat(ld).isEqualTo(LayoutDirection.Ltr)
+                assertionExecuted = true
+            }
+        val impl =
+            Impl(
+                topStart = CornerSize(4.0f),
+                topEnd = CornerSize(3.0f),
+                bottomEnd = CornerSize(3.dp),
+                bottomStart = CornerSize(50),
+                onOutlineRequested = assertSizes
+            )
 
         assertThat(impl.createOutline(passedSize, LayoutDirection.Ltr, density))
             .isEqualTo(Outline.Rectangle(passedSize.toRect()))
@@ -72,27 +75,30 @@
         val sizeWithLargerHeight = Size(4.0f, 6.0f)
 
         val sizesList = mutableListOf<Size>()
-        val assertSizes = { size: Size,
-            topStart: Float,
-            topEnd: Float,
-            bottomEnd: Float,
-            bottomStart: Float,
-            ld: LayoutDirection ->
-            sizesList.add(size)
-            assertThat(topStart).isEqualTo(4.0f)
-            assertThat(topEnd).isEqualTo(4.0f)
-            assertThat(bottomEnd).isEqualTo(0.0f)
-            assertThat(bottomStart).isEqualTo(0.0f)
-            assertThat(ld).isEqualTo(LayoutDirection.Ltr)
-        }
+        val assertSizes =
+            {
+                size: Size,
+                topStart: Float,
+                topEnd: Float,
+                bottomEnd: Float,
+                bottomStart: Float,
+                ld: LayoutDirection ->
+                sizesList.add(size)
+                assertThat(topStart).isEqualTo(4.0f)
+                assertThat(topEnd).isEqualTo(4.0f)
+                assertThat(bottomEnd).isEqualTo(0.0f)
+                assertThat(bottomStart).isEqualTo(0.0f)
+                assertThat(ld).isEqualTo(LayoutDirection.Ltr)
+            }
 
-        val impl = Impl(
-            topStart = CornerSize(10.0f),
-            topEnd = CornerSize(10.0f),
-            bottomEnd = CornerSize(0f),
-            bottomStart = CornerSize(0f),
-            onOutlineRequested = assertSizes
-        )
+        val impl =
+            Impl(
+                topStart = CornerSize(10.0f),
+                topEnd = CornerSize(10.0f),
+                bottomEnd = CornerSize(0f),
+                bottomStart = CornerSize(0f),
+                onOutlineRequested = assertSizes
+            )
 
         impl.createOutline(sizeWithLargerWidth, LayoutDirection.Ltr, density)
         impl.createOutline(sizeWithLargerHeight, LayoutDirection.Ltr, density)
@@ -107,27 +113,30 @@
         val sizeWithLargerHeight = Size(4.0f, 6.0f)
 
         val sizesList = mutableListOf<Size>()
-        val assertSizes = { size: Size,
-            topStart: Float,
-            topEnd: Float,
-            bottomEnd: Float,
-            bottomStart: Float,
-            ld: LayoutDirection ->
-            sizesList.add(size)
-            assertThat(topStart).isEqualTo(4.0f)
-            assertThat(topEnd).isEqualTo(4.0f)
-            assertThat(bottomEnd).isEqualTo(0.0f)
-            assertThat(bottomStart).isEqualTo(0.0f)
-            assertThat(ld).isEqualTo(LayoutDirection.Ltr)
-        }
+        val assertSizes =
+            {
+                size: Size,
+                topStart: Float,
+                topEnd: Float,
+                bottomEnd: Float,
+                bottomStart: Float,
+                ld: LayoutDirection ->
+                sizesList.add(size)
+                assertThat(topStart).isEqualTo(4.0f)
+                assertThat(topEnd).isEqualTo(4.0f)
+                assertThat(bottomEnd).isEqualTo(0.0f)
+                assertThat(bottomStart).isEqualTo(0.0f)
+                assertThat(ld).isEqualTo(LayoutDirection.Ltr)
+            }
 
-        val impl = Impl(
-            topStart = CornerSize(100),
-            topEnd = CornerSize(100),
-            bottomEnd = CornerSize(0),
-            bottomStart = CornerSize(0),
-            onOutlineRequested = assertSizes
-        )
+        val impl =
+            Impl(
+                topStart = CornerSize(100),
+                topEnd = CornerSize(100),
+                bottomEnd = CornerSize(0),
+                bottomStart = CornerSize(0),
+                onOutlineRequested = assertSizes
+            )
 
         impl.createOutline(sizeWithLargerWidth, LayoutDirection.Ltr, density)
         impl.createOutline(sizeWithLargerHeight, LayoutDirection.Ltr, density)
@@ -137,20 +146,14 @@
 
     @Test
     fun copyingUsesCorrectDefaults() {
-        val impl = Impl(
-            topStart = CornerSize(4.0f),
-            topEnd = CornerSize(3.0f),
-            bottomEnd = CornerSize(3.dp),
-            bottomStart = CornerSize(50)
-        )
-        assertThat(impl)
-            .isEqualTo(
-                impl.copy(
-                    bottomEnd = CornerSize(
-                        3.dp
-                    )
-                )
+        val impl =
+            Impl(
+                topStart = CornerSize(4.0f),
+                topEnd = CornerSize(3.0f),
+                bottomEnd = CornerSize(3.dp),
+                bottomStart = CornerSize(50)
             )
+        assertThat(impl).isEqualTo(impl.copy(bottomEnd = CornerSize(3.dp)))
     }
 
     @Test
@@ -158,28 +161,30 @@
         val density = Density(2f, 1f)
         val passedSize = Size(100.0f, 50.0f)
         var assertionExecuted = false
-        val assertSizes = {
-            size: Size,
-            topStart: Float,
-            topEnd: Float,
-            bottomEnd: Float,
-            bottomStart: Float,
-            ld: LayoutDirection ->
-            assertThat(size).isEqualTo(passedSize)
-            assertThat(topStart).isEqualTo(4.0f)
-            assertThat(topEnd).isEqualTo(3.0f)
-            assertThat(bottomEnd).isEqualTo(6.0f)
-            assertThat(bottomStart).isEqualTo(25.0f)
-            assertThat(ld).isEqualTo(LayoutDirection.Rtl)
-            assertionExecuted = true
-        }
-        val impl = Impl(
-            topStart = CornerSize(4.0f),
-            topEnd = CornerSize(3.0f),
-            bottomEnd = CornerSize(3.dp),
-            bottomStart = CornerSize(50),
-            onOutlineRequested = assertSizes
-        )
+        val assertSizes =
+            {
+                size: Size,
+                topStart: Float,
+                topEnd: Float,
+                bottomEnd: Float,
+                bottomStart: Float,
+                ld: LayoutDirection ->
+                assertThat(size).isEqualTo(passedSize)
+                assertThat(topStart).isEqualTo(4.0f)
+                assertThat(topEnd).isEqualTo(3.0f)
+                assertThat(bottomEnd).isEqualTo(6.0f)
+                assertThat(bottomStart).isEqualTo(25.0f)
+                assertThat(ld).isEqualTo(LayoutDirection.Rtl)
+                assertionExecuted = true
+            }
+        val impl =
+            Impl(
+                topStart = CornerSize(4.0f),
+                topEnd = CornerSize(3.0f),
+                bottomEnd = CornerSize(3.dp),
+                bottomStart = CornerSize(50),
+                onOutlineRequested = assertSizes
+            )
 
         assertThat(impl.createOutline(passedSize, LayoutDirection.Rtl, density))
             .isEqualTo(Outline.Rectangle(passedSize.toRect()))
@@ -194,27 +199,30 @@
         val sizeWithLargerHeight = Size(4.0f, 6.0f)
 
         val sizesList = mutableListOf<Size>()
-        val assertSizes = { size: Size,
-            topStart: Float,
-            topEnd: Float,
-            bottomEnd: Float,
-            bottomStart: Float,
-            ld: LayoutDirection ->
-            sizesList.add(size)
-            assertThat(topStart).isEqualTo(2.0f)
-            assertThat(topEnd).isEqualTo(2.0f)
-            assertThat(bottomEnd).isEqualTo(2.0f)
-            assertThat(bottomStart).isEqualTo(2.0f)
-            assertThat(ld).isEqualTo(LayoutDirection.Ltr)
-        }
+        val assertSizes =
+            {
+                size: Size,
+                topStart: Float,
+                topEnd: Float,
+                bottomEnd: Float,
+                bottomStart: Float,
+                ld: LayoutDirection ->
+                sizesList.add(size)
+                assertThat(topStart).isEqualTo(2.0f)
+                assertThat(topEnd).isEqualTo(2.0f)
+                assertThat(bottomEnd).isEqualTo(2.0f)
+                assertThat(bottomStart).isEqualTo(2.0f)
+                assertThat(ld).isEqualTo(LayoutDirection.Ltr)
+            }
 
-        val impl = Impl(
-            topStart = CornerSize(75),
-            topEnd = CornerSize(75),
-            bottomEnd = CornerSize(75),
-            bottomStart = CornerSize(75),
-            onOutlineRequested = assertSizes
-        )
+        val impl =
+            Impl(
+                topStart = CornerSize(75),
+                topEnd = CornerSize(75),
+                bottomEnd = CornerSize(75),
+                bottomStart = CornerSize(75),
+                onOutlineRequested = assertSizes
+            )
 
         impl.createOutline(sizeWithLargerWidth, LayoutDirection.Ltr, density)
         impl.createOutline(sizeWithLargerHeight, LayoutDirection.Ltr, density)
@@ -229,27 +237,30 @@
         val sizeWithLargerHeight = Size(10.0f, 15.0f)
 
         val sizesList = mutableListOf<Size>()
-        val assertSizes = { size: Size,
-            topStart: Float,
-            topEnd: Float,
-            bottomEnd: Float,
-            bottomStart: Float,
-            ld: LayoutDirection ->
-            sizesList.add(size)
-            assertThat(topStart).isEqualTo(7.5f)
-            assertThat(topEnd).isEqualTo(2.5f)
-            assertThat(bottomEnd).isEqualTo(7.5f)
-            assertThat(bottomStart).isEqualTo(2.5f)
-            assertThat(ld).isEqualTo(LayoutDirection.Ltr)
-        }
+        val assertSizes =
+            {
+                size: Size,
+                topStart: Float,
+                topEnd: Float,
+                bottomEnd: Float,
+                bottomStart: Float,
+                ld: LayoutDirection ->
+                sizesList.add(size)
+                assertThat(topStart).isEqualTo(7.5f)
+                assertThat(topEnd).isEqualTo(2.5f)
+                assertThat(bottomEnd).isEqualTo(7.5f)
+                assertThat(bottomStart).isEqualTo(2.5f)
+                assertThat(ld).isEqualTo(LayoutDirection.Ltr)
+            }
 
-        val impl = Impl(
-            topStart = CornerSize(90),
-            topEnd = CornerSize(30),
-            bottomEnd = CornerSize(90),
-            bottomStart = CornerSize(30),
-            onOutlineRequested = assertSizes
-        )
+        val impl =
+            Impl(
+                topStart = CornerSize(90),
+                topEnd = CornerSize(30),
+                bottomEnd = CornerSize(90),
+                bottomStart = CornerSize(30),
+                onOutlineRequested = assertSizes
+            )
 
         impl.createOutline(sizeWithLargerWidth, LayoutDirection.Ltr, density)
         impl.createOutline(sizeWithLargerHeight, LayoutDirection.Ltr, density)
@@ -263,8 +274,8 @@
     topEnd: CornerSize,
     bottomEnd: CornerSize,
     bottomStart: CornerSize,
-    private val onOutlineRequested:
-        ((Size, Float, Float, Float, Float, LayoutDirection) -> Unit)? = null
+    private val onOutlineRequested: ((Size, Float, Float, Float, Float, LayoutDirection) -> Unit)? =
+        null
 ) : CornerBasedShape(topStart, topEnd, bottomEnd, bottomStart) {
 
     override fun createOutline(
diff --git a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/shape/CornerSizeTest.kt b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/shape/CornerSizeTest.kt
index 6bd5c4c..a8633e4 100644
--- a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/shape/CornerSizeTest.kt
+++ b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/shape/CornerSizeTest.kt
@@ -63,16 +63,12 @@
 
     @Test
     fun pxCornersAreEquals() {
-        assertThat(CornerSize(24.0f)).isEqualTo(
-            CornerSize(24.0f)
-        )
+        assertThat(CornerSize(24.0f)).isEqualTo(CornerSize(24.0f))
     }
 
     @Test
     fun dpCornersAreEquals() {
-        assertThat(CornerSize(8.dp)).isEqualTo(
-            CornerSize(8.dp)
-        )
+        assertThat(CornerSize(8.dp)).isEqualTo(CornerSize(8.dp))
     }
 
     private fun CornerSize.inspectorValue() = (this as InspectableValue).valueOverride
diff --git a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/shape/CutCornerShapeTest.kt b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/shape/CutCornerShapeTest.kt
index 6bfffcf..5fa0593b 100644
--- a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/shape/CutCornerShapeTest.kt
+++ b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/shape/CutCornerShapeTest.kt
@@ -67,12 +67,7 @@
         val size2 = 22f
         val size3 = 32f
         val size4 = 42f
-        val cut = CutCornerShape(
-            size1,
-            size2,
-            size3,
-            size4
-        )
+        val cut = CutCornerShape(size1, size2, size3, size4)
 
         val outline = cut.toOutline() as Outline.Generic
         assertPathsEquals(
@@ -97,12 +92,7 @@
         val size2 = 22f
         val size3 = 32f
         val size4 = 42f
-        val cut = CutCornerShape(
-            size1,
-            size2,
-            size3,
-            size4
-        )
+        val cut = CutCornerShape(size1, size2, size3, size4)
 
         val outline = cut.toOutline(LayoutDirection.Rtl) as Outline.Generic
         assertPathsEquals(
@@ -123,121 +113,91 @@
 
     @Test
     fun createsRectangleOutlineForZeroSizedCorners() {
-        val rounded = CutCornerShape(
-            0.0f,
-            0.0f,
-            0.0f,
-            0.0f
-        )
+        val rounded = CutCornerShape(0.0f, 0.0f, 0.0f, 0.0f)
 
-        assertThat(rounded.toOutline())
-            .isEqualTo(Outline.Rectangle(size.toRect()))
+        assertThat(rounded.toOutline()).isEqualTo(Outline.Rectangle(size.toRect()))
     }
 
     @Test
     fun cutCornerShapesAreEquals() {
-        assertThat(CutCornerShape(10.0f))
-            .isEqualTo(CutCornerShape(10.0f))
+        assertThat(CutCornerShape(10.0f)).isEqualTo(CutCornerShape(10.0f))
     }
 
     @Test
     fun cutCornerUpdateAllCornerSize() {
-        assertThat(
-            CutCornerShape(10.0f).copy(
-                CornerSize(
-                    5.0f
-                )
-            )
-        )
-            .isEqualTo(CutCornerShape(5.0f))
+        assertThat(CutCornerShape(10.0f).copy(CornerSize(5.0f))).isEqualTo(CutCornerShape(5.0f))
     }
 
     @Test
     fun cutCornerUpdateTwoCornerSizes() {
         assertThat(
-            CutCornerShape(10.0f).copy(
-                topEnd = CornerSize(3.dp),
-                bottomEnd = CornerSize(50)
+                CutCornerShape(10.0f).copy(topEnd = CornerSize(3.dp), bottomEnd = CornerSize(50))
             )
-        ).isEqualTo(
-            CutCornerShape(
-                topStart = CornerSize(10.0f),
-                topEnd = CornerSize(3.dp),
-                bottomStart = CornerSize(10.0f),
-                bottomEnd = CornerSize(50)
+            .isEqualTo(
+                CutCornerShape(
+                    topStart = CornerSize(10.0f),
+                    topEnd = CornerSize(3.dp),
+                    bottomStart = CornerSize(10.0f),
+                    bottomEnd = CornerSize(50)
+                )
             )
-        )
     }
 
     @Test
     fun objectsWithTheSameCornersAreEquals() {
         @Suppress("ReplaceCallWithBinaryOperator")
         assertThat(
-            CutCornerShape(
-                topStart = CornerSize(4.0f),
-                topEnd = CornerSize(3.0f),
-                bottomStart = CornerSize(3.dp),
-                bottomEnd = CornerSize(50)
-            ).equals(
                 CutCornerShape(
-                    topStart = CornerSize(4.0f),
-                    topEnd = CornerSize(3.0f),
-                    bottomStart = CornerSize(3.dp),
-                    bottomEnd = CornerSize(50)
-                )
+                        topStart = CornerSize(4.0f),
+                        topEnd = CornerSize(3.0f),
+                        bottomStart = CornerSize(3.dp),
+                        bottomEnd = CornerSize(50)
+                    )
+                    .equals(
+                        CutCornerShape(
+                            topStart = CornerSize(4.0f),
+                            topEnd = CornerSize(3.0f),
+                            bottomStart = CornerSize(3.dp),
+                            bottomEnd = CornerSize(50)
+                        )
+                    )
             )
-        ).isTrue()
+            .isTrue()
     }
 
     @Test
     fun objectsWithDifferentCornersAreNotEquals() {
         @Suppress("ReplaceCallWithBinaryOperator")
         assertThat(
-            CutCornerShape(
-                topStart = CornerSize(4.0f),
-                topEnd = CornerSize(3.0f),
-                bottomStart = CornerSize(3.dp),
-                bottomEnd = CornerSize(50)
-            ).equals(
                 CutCornerShape(
-                    topStart = CornerSize(4.0f),
-                    topEnd = CornerSize(5.0f),
-                    bottomStart = CornerSize(3.dp),
-                    bottomEnd = CornerSize(50)
-                )
+                        topStart = CornerSize(4.0f),
+                        topEnd = CornerSize(3.0f),
+                        bottomStart = CornerSize(3.dp),
+                        bottomEnd = CornerSize(50)
+                    )
+                    .equals(
+                        CutCornerShape(
+                            topStart = CornerSize(4.0f),
+                            topEnd = CornerSize(5.0f),
+                            bottomStart = CornerSize(3.dp),
+                            bottomEnd = CornerSize(50)
+                        )
+                    )
             )
-        ).isFalse()
+            .isFalse()
     }
 
     @Test
     fun copyHasCorrectDefaults() {
         assertEquals(
-            CutCornerShape(
-                topStart = 5.dp,
-                topEnd = 6.dp,
-                bottomEnd = 3.dp,
-                bottomStart = 4.dp
-            ),
-            CutCornerShape(
-                topStart = 1.dp,
-                topEnd = 2.dp,
-                bottomEnd = 3.dp,
-                bottomStart = 4.dp
-            ).copy(topStart = CornerSize(5.dp), topEnd = CornerSize(6.dp))
+            CutCornerShape(topStart = 5.dp, topEnd = 6.dp, bottomEnd = 3.dp, bottomStart = 4.dp),
+            CutCornerShape(topStart = 1.dp, topEnd = 2.dp, bottomEnd = 3.dp, bottomStart = 4.dp)
+                .copy(topStart = CornerSize(5.dp), topEnd = CornerSize(6.dp))
         )
         assertEquals(
-            CutCornerShape(
-                topStart = 1.dp,
-                topEnd = 2.dp,
-                bottomEnd = 5.dp,
-                bottomStart = 6.dp
-            ),
-            CutCornerShape(
-                topStart = 1.dp,
-                topEnd = 2.dp,
-                bottomEnd = 3.dp,
-                bottomStart = 4.dp
-            ).copy(bottomEnd = CornerSize(5.dp), bottomStart = CornerSize(6.dp))
+            CutCornerShape(topStart = 1.dp, topEnd = 2.dp, bottomEnd = 5.dp, bottomStart = 6.dp),
+            CutCornerShape(topStart = 1.dp, topEnd = 2.dp, bottomEnd = 3.dp, bottomStart = 4.dp)
+                .copy(bottomEnd = CornerSize(5.dp), bottomStart = CornerSize(6.dp))
         )
     }
 
diff --git a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/shape/RoundedCornerShapeTest.kt b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/shape/RoundedCornerShapeTest.kt
index 0189d22..332d642 100644
--- a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/shape/RoundedCornerShapeTest.kt
+++ b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/shape/RoundedCornerShapeTest.kt
@@ -45,9 +45,7 @@
 
         val expectedRadius = CornerRadius(25f)
         val outline = rounded.toOutline() as Outline.Rounded
-        assertThat(outline.roundRect).isEqualTo(
-            RoundRect(size.toRect(), expectedRadius)
-        )
+        assertThat(outline.roundRect).isEqualTo(RoundRect(size.toRect(), expectedRadius))
     }
 
     @Test
@@ -56,23 +54,19 @@
         val radius2 = 22f
         val radius3 = 32f
         val radius4 = 42f
-        val rounded = RoundedCornerShape(
-            radius1,
-            radius2,
-            radius3,
-            radius4
-        )
+        val rounded = RoundedCornerShape(radius1, radius2, radius3, radius4)
 
         val outline = rounded.toOutline() as Outline.Rounded
-        assertThat(outline.roundRect).isEqualTo(
-            RoundRect(
-                size.toRect(),
-                CornerRadius(radius1),
-                CornerRadius(radius2),
-                CornerRadius(radius3),
-                CornerRadius(radius4)
+        assertThat(outline.roundRect)
+            .isEqualTo(
+                RoundRect(
+                    size.toRect(),
+                    CornerRadius(radius1),
+                    CornerRadius(radius2),
+                    CornerRadius(radius3),
+                    CornerRadius(radius4)
+                )
             )
-        )
     }
 
     @Test
@@ -81,141 +75,126 @@
         val radius2 = 22f
         val radius3 = 32f
         val radius4 = 42f
-        val rounded = RoundedCornerShape(
-            radius1,
-            radius2,
-            radius3,
-            radius4
-        )
+        val rounded = RoundedCornerShape(radius1, radius2, radius3, radius4)
 
         val outline = rounded.toOutline(LayoutDirection.Rtl) as Outline.Rounded
-        assertThat(outline.roundRect).isEqualTo(
-            RoundRect(
-                size.toRect(),
-                CornerRadius(radius2),
-                CornerRadius(radius1),
-                CornerRadius(radius4),
-                CornerRadius(radius3)
+        assertThat(outline.roundRect)
+            .isEqualTo(
+                RoundRect(
+                    size.toRect(),
+                    CornerRadius(radius2),
+                    CornerRadius(radius1),
+                    CornerRadius(radius4),
+                    CornerRadius(radius3)
+                )
             )
-        )
     }
 
     @Test
     fun createsRectangleOutlineForZeroSizedCorners() {
-        val rounded = RoundedCornerShape(
-            0.0f,
-            0.0f,
-            0.0f,
-            0.0f
-        )
+        val rounded = RoundedCornerShape(0.0f, 0.0f, 0.0f, 0.0f)
 
-        assertThat(rounded.toOutline())
-            .isEqualTo(Outline.Rectangle(size.toRect()))
+        assertThat(rounded.toOutline()).isEqualTo(Outline.Rectangle(size.toRect()))
     }
 
     @Test
     fun roundedCornerShapesAreEquals() {
-        assertThat(RoundedCornerShape(12.dp))
-            .isEqualTo(RoundedCornerShape(12.dp))
+        assertThat(RoundedCornerShape(12.dp)).isEqualTo(RoundedCornerShape(12.dp))
     }
 
     @Test
     fun roundedCornerUpdateAllCornerSize() {
-        assertThat(
-            RoundedCornerShape(10.0f).copy(
-                CornerSize(
-                    5.dp
-                )
-            )
-        )
+        assertThat(RoundedCornerShape(10.0f).copy(CornerSize(5.dp)))
             .isEqualTo(RoundedCornerShape(5.dp))
     }
 
     @Test
     fun roundedCornerUpdateTwoCornerSizes() {
-        val original = RoundedCornerShape(10.0f)
-            .copy(
-                topStart = CornerSize(3.dp),
-                bottomEnd = CornerSize(50)
-            )
+        val original =
+            RoundedCornerShape(10.0f).copy(topStart = CornerSize(3.dp), bottomEnd = CornerSize(50))
 
         assertEquals(CornerSize(3.dp), original.topStart)
         assertEquals(CornerSize(10.0f), original.topEnd)
         assertEquals(CornerSize(50), original.bottomEnd)
         assertEquals(CornerSize(10.0f), original.bottomStart)
         assertThat(
-            RoundedCornerShape(10.0f).copy(
-                topStart = CornerSize(3.dp),
-                bottomEnd = CornerSize(50)
+                RoundedCornerShape(10.0f)
+                    .copy(topStart = CornerSize(3.dp), bottomEnd = CornerSize(50))
             )
-        ).isEqualTo(
-            RoundedCornerShape(
-                topStart = CornerSize(3.dp),
-                topEnd = CornerSize(10.0f),
-                bottomEnd = CornerSize(50),
-                bottomStart = CornerSize(10.0f)
+            .isEqualTo(
+                RoundedCornerShape(
+                    topStart = CornerSize(3.dp),
+                    topEnd = CornerSize(10.0f),
+                    bottomEnd = CornerSize(50),
+                    bottomStart = CornerSize(10.0f)
+                )
             )
-        )
     }
 
     @Test
     fun objectsWithTheSameCornersAreEquals() {
         @Suppress("ReplaceCallWithBinaryOperator")
         assertThat(
-            RoundedCornerShape(
-                topStart = CornerSize(4.0f),
-                topEnd = CornerSize(3.0f),
-                bottomEnd = CornerSize(3.dp),
-                bottomStart = CornerSize(50)
-            ).equals(
                 RoundedCornerShape(
-                    topStart = CornerSize(4.0f),
-                    topEnd = CornerSize(3.0f),
-                    bottomEnd = CornerSize(3.dp),
-                    bottomStart = CornerSize(50)
-                )
+                        topStart = CornerSize(4.0f),
+                        topEnd = CornerSize(3.0f),
+                        bottomEnd = CornerSize(3.dp),
+                        bottomStart = CornerSize(50)
+                    )
+                    .equals(
+                        RoundedCornerShape(
+                            topStart = CornerSize(4.0f),
+                            topEnd = CornerSize(3.0f),
+                            bottomEnd = CornerSize(3.dp),
+                            bottomStart = CornerSize(50)
+                        )
+                    )
             )
-        ).isTrue()
+            .isTrue()
     }
 
     @Test
     fun objectsWithDifferentCornersAreNotEquals() {
         @Suppress("ReplaceCallWithBinaryOperator")
         assertThat(
-            RoundedCornerShape(
-                topStart = CornerSize(4.0f),
-                topEnd = CornerSize(3.0f),
-                bottomEnd = CornerSize(3.dp),
-                bottomStart = CornerSize(50)
-            ).equals(
                 RoundedCornerShape(
-                    topStart = CornerSize(4.0f),
-                    topEnd = CornerSize(5.0f),
-                    bottomEnd = CornerSize(3.dp),
-                    bottomStart = CornerSize(50)
-                )
+                        topStart = CornerSize(4.0f),
+                        topEnd = CornerSize(3.0f),
+                        bottomEnd = CornerSize(3.dp),
+                        bottomStart = CornerSize(50)
+                    )
+                    .equals(
+                        RoundedCornerShape(
+                            topStart = CornerSize(4.0f),
+                            topEnd = CornerSize(5.0f),
+                            bottomEnd = CornerSize(3.dp),
+                            bottomStart = CornerSize(50)
+                        )
+                    )
             )
-        ).isFalse()
+            .isFalse()
     }
 
     @Test
     fun notEqualsToCutCornersWithTheSameSizes() {
         @Suppress("ReplaceCallWithBinaryOperator")
         assertThat(
-            RoundedCornerShape(
-                topStart = CornerSize(4.0f),
-                topEnd = CornerSize(3.0f),
-                bottomEnd = CornerSize(3.dp),
-                bottomStart = CornerSize(50)
-            ).equals(
-                CutCornerShape(
-                    topStart = CornerSize(4.0f),
-                    topEnd = CornerSize(3.0f),
-                    bottomEnd = CornerSize(3.dp),
-                    bottomStart = CornerSize(50)
-                )
+                RoundedCornerShape(
+                        topStart = CornerSize(4.0f),
+                        topEnd = CornerSize(3.0f),
+                        bottomEnd = CornerSize(3.dp),
+                        bottomStart = CornerSize(50)
+                    )
+                    .equals(
+                        CutCornerShape(
+                            topStart = CornerSize(4.0f),
+                            topEnd = CornerSize(3.0f),
+                            bottomEnd = CornerSize(3.dp),
+                            bottomStart = CornerSize(50)
+                        )
+                    )
             )
-        ).isFalse()
+            .isFalse()
     }
 
     @Test
@@ -227,12 +206,8 @@
                 bottomEnd = 3.dp,
                 bottomStart = 4.dp
             ),
-            RoundedCornerShape(
-                topStart = 1.dp,
-                topEnd = 2.dp,
-                bottomEnd = 3.dp,
-                bottomStart = 4.dp
-            ).copy(topStart = CornerSize(5.dp), topEnd = CornerSize(6.dp))
+            RoundedCornerShape(topStart = 1.dp, topEnd = 2.dp, bottomEnd = 3.dp, bottomStart = 4.dp)
+                .copy(topStart = CornerSize(5.dp), topEnd = CornerSize(6.dp))
         )
         assertEquals(
             RoundedCornerShape(
@@ -241,12 +216,8 @@
                 bottomEnd = 5.dp,
                 bottomStart = 6.dp
             ),
-            RoundedCornerShape(
-                topStart = 1.dp,
-                topEnd = 2.dp,
-                bottomEnd = 3.dp,
-                bottomStart = 4.dp
-            ).copy(bottomEnd = CornerSize(5.dp), bottomStart = CornerSize(6.dp))
+            RoundedCornerShape(topStart = 1.dp, topEnd = 2.dp, bottomEnd = 3.dp, bottomStart = 4.dp)
+                .copy(bottomEnd = CornerSize(5.dp), bottomStart = CornerSize(6.dp))
         )
     }
 
diff --git a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/BasicTextBrushTest.kt b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/BasicTextBrushTest.kt
index 7dc136e..bd2c16c 100644
--- a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/BasicTextBrushTest.kt
+++ b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/BasicTextBrushTest.kt
@@ -52,8 +52,7 @@
 @RunWith(AndroidJUnit4::class)
 class BasicTextBrushTest {
 
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
     private val TAG = "TAG"
 
@@ -65,14 +64,13 @@
             CompositionLocalProvider(LocalDensity provides Density(1f)) {
                 BasicText(
                     text = "Hello",
-                    style = TextStyle(
-                        brush = colorState.value,
-                        fontFamily = TEST_FONT_FAMILY,
-                        fontSize = 20.sp
-                    ),
-                    modifier = Modifier
-                        .background(Color.Black)
-                        .testTag(TAG)
+                    style =
+                        TextStyle(
+                            brush = colorState.value,
+                            fontFamily = TEST_FONT_FAMILY,
+                            fontSize = 20.sp
+                        ),
+                    modifier = Modifier.background(Color.Black).testTag(TAG)
                 )
             }
         }
@@ -100,14 +98,13 @@
             CompositionLocalProvider(LocalDensity provides Density(1f)) {
                 BasicText(
                     text = "Hello",
-                    style = TextStyle(
-                        brush = brushState.value,
-                        fontFamily = TEST_FONT_FAMILY,
-                        fontSize = 20.sp
-                    ),
-                    modifier = Modifier
-                        .background(Color.Black)
-                        .testTag(TAG)
+                    style =
+                        TextStyle(
+                            brush = brushState.value,
+                            fontFamily = TEST_FONT_FAMILY,
+                            fontSize = 20.sp
+                        ),
+                    modifier = Modifier.background(Color.Black).testTag(TAG)
                 )
             }
         }
@@ -131,27 +128,23 @@
     @Test
     fun toggleCustomShaderBrush() {
         var color by mutableStateOf(Color.Red)
-        val brush = object : ShaderBrush() {
-            override fun createShader(size: Size): Shader {
-                return LinearGradientShader(
-                    Offset.Zero,
-                    Offset(200f, 200f),
-                    listOf(color, color),
-                )
+        val brush =
+            object : ShaderBrush() {
+                override fun createShader(size: Size): Shader {
+                    return LinearGradientShader(
+                        Offset.Zero,
+                        Offset(200f, 200f),
+                        listOf(color, color),
+                    )
+                }
             }
-        }
         rule.setContent {
             CompositionLocalProvider(LocalDensity provides Density(1f)) {
                 BasicText(
                     text = "Hello",
-                    style = TextStyle(
-                        brush = brush,
-                        fontFamily = TEST_FONT_FAMILY,
-                        fontSize = 20.sp
-                    ),
-                    modifier = Modifier
-                        .background(Color.Black)
-                        .testTag(TAG)
+                    style =
+                        TextStyle(brush = brush, fontFamily = TEST_FONT_FAMILY, fontSize = 20.sp),
+                    modifier = Modifier.background(Color.Black).testTag(TAG)
                 )
             }
         }
diff --git a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/BasicTextDensityTest.kt b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/BasicTextDensityTest.kt
index 93226fb..c4b5876 100644
--- a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/BasicTextDensityTest.kt
+++ b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/BasicTextDensityTest.kt
@@ -42,8 +42,7 @@
 @RunWith(AndroidJUnit4::class)
 class BasicTextDensityTest {
 
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
     @Test
     fun simpleParagraph_densityChange() {
@@ -53,13 +52,11 @@
         var textSize: IntSize? = null
         var ruleDensity by mutableStateOf(density1)
         rule.setContent {
-            CompositionLocalProvider(
-                LocalDensity provides ruleDensity
-            ) {
+            CompositionLocalProvider(LocalDensity provides ruleDensity) {
                 BasicText(
                     "Hello World!",
-                    modifier = Modifier
-                        .onGloballyPositioned {
+                    modifier =
+                        Modifier.onGloballyPositioned {
                             // do not read the size from onTextLayout, it takes a different path
                             textSize = it.size
                         }
@@ -87,21 +84,16 @@
         var textSize: IntSize? = null
         var ruleDensity by mutableStateOf(density1)
         rule.setContent {
-            CompositionLocalProvider(
-                LocalDensity provides ruleDensity
-            ) {
+            CompositionLocalProvider(LocalDensity provides ruleDensity) {
                 BasicText(
                     // forces BasicText to generate a MultiParagraph
-                    text = buildAnnotatedString {
-                        withStyle(ParagraphStyle(lineHeight = 20.sp)) {
-                            append("Hello")
-                        }
-                        withStyle(ParagraphStyle(lineHeight = 15.sp)) {
-                            append("World")
-                        }
-                    },
-                    modifier = Modifier
-                        .onGloballyPositioned {
+                    text =
+                        buildAnnotatedString {
+                            withStyle(ParagraphStyle(lineHeight = 20.sp)) { append("Hello") }
+                            withStyle(ParagraphStyle(lineHeight = 15.sp)) { append("World") }
+                        },
+                    modifier =
+                        Modifier.onGloballyPositioned {
                             // do not read the size from onTextLayout, it takes a different path
                             textSize = it.size
                         }
@@ -129,16 +121,14 @@
         var textSize: IntSize? = null
         var ruleDensity by mutableStateOf(density1)
         rule.setContent {
-            CompositionLocalProvider(
-                LocalDensity provides ruleDensity
-            ) {
+            CompositionLocalProvider(LocalDensity provides ruleDensity) {
                 SelectionContainer {
                     // this should internally use the same cache but selectable text takes
                     // a slightly different path. Include a test to make sure everything goes right.
                     BasicText(
                         "Hello World!",
-                        modifier = Modifier
-                            .onGloballyPositioned {
+                        modifier =
+                            Modifier.onGloballyPositioned {
                                 // do not read the size from onTextLayout, it takes a different path
                                 textSize = it.size
                             }
diff --git a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/BasicTextGraphicsLayerTest.kt b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/BasicTextGraphicsLayerTest.kt
index 9c1ba16..042d31c 100644
--- a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/BasicTextGraphicsLayerTest.kt
+++ b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/BasicTextGraphicsLayerTest.kt
@@ -32,14 +32,11 @@
 @RunWith(AndroidJUnit4::class)
 class BasicTextGraphicsLayerTest {
 
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
     @Test
     fun modifiersExposeGraphicsLayer() {
-        rule.setContent {
-            BasicText("Ok")
-        }
+        rule.setContent { BasicText("Ok") }
         // ui-inspector 3d view requires this to be emitted
         val owners = rule.onNodeWithText("Ok").fetchGraphicsLayerOwnerViewId()
         assertThat(owners).hasSize(1)
@@ -47,9 +44,7 @@
 
     @Test
     fun modifiersExposeGraphicsLayer_annotatedString() {
-        rule.setContent {
-            BasicText(AnnotatedString("Ok"))
-        }
+        rule.setContent { BasicText(AnnotatedString("Ok")) }
         // ui-inspector 3d view requires this to be emitted
         val owners = rule.onNodeWithText("Ok").fetchGraphicsLayerOwnerViewId()
         assertThat(owners).hasSize(1)
diff --git a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/BasicTextHoverTest.kt b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/BasicTextHoverTest.kt
index b3e5f13..be3ae4f 100644
--- a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/BasicTextHoverTest.kt
+++ b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/BasicTextHoverTest.kt
@@ -51,8 +51,7 @@
 @SdkSuppress(minSdkVersion = Build.VERSION_CODES.N)
 @RunWith(AndroidJUnit4::class)
 class BasicTextHoverTest {
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
     @Test
     fun whenSelectableText_andDefaultIcon_inBoxWithDefaultIcon_textIconIsUsed() =
@@ -77,10 +76,8 @@
         runSelectableTest(
             selectionContainerIconModifier = Modifier,
             expectedSelectionContainerIcon = TYPE_DEFAULT,
-            textIconModifier = Modifier.pointerHoverIcon(
-                icon = PointerIcon.Crosshair,
-                overrideDescendants = true
-            ),
+            textIconModifier =
+                Modifier.pointerHoverIcon(icon = PointerIcon.Crosshair, overrideDescendants = true),
             expectedTextIcon = TYPE_CROSSHAIR
         )
 
@@ -107,10 +104,8 @@
         runSelectableTest(
             selectionContainerIconModifier = Modifier.pointerHoverIcon(PointerIcon.Hand),
             expectedSelectionContainerIcon = TYPE_HAND,
-            textIconModifier = Modifier.pointerHoverIcon(
-                icon = PointerIcon.Crosshair,
-                overrideDescendants = true
-            ),
+            textIconModifier =
+                Modifier.pointerHoverIcon(icon = PointerIcon.Crosshair, overrideDescendants = true),
             expectedTextIcon = TYPE_CROSSHAIR
         )
 
@@ -119,29 +114,28 @@
         expectedSelectionContainerIcon: Int,
         textIconModifier: Modifier,
         expectedTextIcon: Int,
-    ) = runTest(
-        selectionContainerIconModifier,
-        expectedSelectionContainerIcon,
-        textIconModifier,
-        expectedTextIcon,
-    ) { containerTag: String, textTag: String, boxModifier: Modifier, textModifier: Modifier ->
-        SelectionContainer {
-            Box(
-                modifier = Modifier
-                    .requiredSize(200.dp)
-                    .then(boxModifier)
-                    .border(BorderStroke(2.dp, SolidColor(Color.Red)))
-                    .testTag(containerTag)
-            ) {
-                BasicText(
-                    text = "this is selectable text",
-                    modifier = Modifier
-                        .then(textModifier)
-                        .testTag(textTag)
-                )
+    ) =
+        runTest(
+            selectionContainerIconModifier,
+            expectedSelectionContainerIcon,
+            textIconModifier,
+            expectedTextIcon,
+        ) { containerTag: String, textTag: String, boxModifier: Modifier, textModifier: Modifier ->
+            SelectionContainer {
+                Box(
+                    modifier =
+                        Modifier.requiredSize(200.dp)
+                            .then(boxModifier)
+                            .border(BorderStroke(2.dp, SolidColor(Color.Red)))
+                            .testTag(containerTag)
+                ) {
+                    BasicText(
+                        text = "this is selectable text",
+                        modifier = Modifier.then(textModifier).testTag(textTag)
+                    )
+                }
             }
         }
-    }
 
     @Test
     fun whenNonSelectableText_andDefaultIcon_inBoxWithDefaultIcon_textIconIsUsed() =
@@ -166,10 +160,8 @@
         runNonSelectableTest(
             selectionContainerIconModifier = Modifier,
             expectedSelectionContainerIcon = TYPE_DEFAULT,
-            textIconModifier = Modifier.pointerHoverIcon(
-                icon = PointerIcon.Crosshair,
-                overrideDescendants = true
-            ),
+            textIconModifier =
+                Modifier.pointerHoverIcon(icon = PointerIcon.Crosshair, overrideDescendants = true),
             expectedTextIcon = TYPE_CROSSHAIR
         )
 
@@ -196,10 +188,8 @@
         runNonSelectableTest(
             selectionContainerIconModifier = Modifier.pointerHoverIcon(PointerIcon.Hand),
             expectedSelectionContainerIcon = TYPE_HAND,
-            textIconModifier = Modifier.pointerHoverIcon(
-                icon = PointerIcon.Crosshair,
-                overrideDescendants = true
-            ),
+            textIconModifier =
+                Modifier.pointerHoverIcon(icon = PointerIcon.Crosshair, overrideDescendants = true),
             expectedTextIcon = TYPE_CROSSHAIR
         )
 
@@ -208,27 +198,26 @@
         expectedSelectionContainerIcon: Int,
         textIconModifier: Modifier,
         expectedTextIcon: Int,
-    ) = runTest(
-        selectionContainerIconModifier,
-        expectedSelectionContainerIcon,
-        textIconModifier,
-        expectedTextIcon,
-    ) { containerTag: String, textTag: String, boxModifier: Modifier, textModifier: Modifier ->
-        Box(
-            modifier = Modifier
-                .requiredSize(200.dp)
-                .then(boxModifier)
-                .border(BorderStroke(2.dp, SolidColor(Color.Red)))
-                .testTag(containerTag)
-        ) {
-            BasicText(
-                text = "this is selectable text",
-                modifier = Modifier
-                    .then(textModifier)
-                    .testTag(textTag)
-            )
+    ) =
+        runTest(
+            selectionContainerIconModifier,
+            expectedSelectionContainerIcon,
+            textIconModifier,
+            expectedTextIcon,
+        ) { containerTag: String, textTag: String, boxModifier: Modifier, textModifier: Modifier ->
+            Box(
+                modifier =
+                    Modifier.requiredSize(200.dp)
+                        .then(boxModifier)
+                        .border(BorderStroke(2.dp, SolidColor(Color.Red)))
+                        .testTag(containerTag)
+            ) {
+                BasicText(
+                    text = "this is selectable text",
+                    modifier = Modifier.then(textModifier).testTag(textTag)
+                )
+            }
         }
-    }
 
     @Test
     fun whenDisabledSelectionText_andDefaultIcon_inBoxWithDefaultIcon_textIconIsUsed() =
@@ -253,10 +242,8 @@
         runDisabledSelectionText(
             selectionContainerIconModifier = Modifier,
             expectedSelectionContainerIcon = TYPE_DEFAULT,
-            textIconModifier = Modifier.pointerHoverIcon(
-                icon = PointerIcon.Crosshair,
-                overrideDescendants = true
-            ),
+            textIconModifier =
+                Modifier.pointerHoverIcon(icon = PointerIcon.Crosshair, overrideDescendants = true),
             expectedTextIcon = TYPE_CROSSHAIR
         )
 
@@ -283,10 +270,8 @@
         runDisabledSelectionText(
             selectionContainerIconModifier = Modifier.pointerHoverIcon(PointerIcon.Hand),
             expectedSelectionContainerIcon = TYPE_HAND,
-            textIconModifier = Modifier.pointerHoverIcon(
-                icon = PointerIcon.Crosshair,
-                overrideDescendants = true
-            ),
+            textIconModifier =
+                Modifier.pointerHoverIcon(icon = PointerIcon.Crosshair, overrideDescendants = true),
             expectedTextIcon = TYPE_CROSSHAIR
         )
 
@@ -295,66 +280,65 @@
         expectedSelectionContainerIcon: Int,
         textIconModifier: Modifier,
         expectedTextIcon: Int,
-    ) = runTest(
-        selectionContainerIconModifier,
-        expectedSelectionContainerIcon,
-        textIconModifier,
-        expectedTextIcon,
-    ) { containerTag: String, textTag: String, boxModifier: Modifier, textModifier: Modifier ->
-        SelectionContainer {
-            Box(
-                modifier = Modifier
-                    .requiredSize(200.dp)
-                    .then(boxModifier)
-                    .border(BorderStroke(2.dp, SolidColor(Color.Red)))
-                    .testTag(containerTag)
-            ) {
-                DisableSelection {
-                    BasicText(
-                        text = "this is selectable text",
-                        modifier = Modifier
-                            .then(textModifier)
-                            .testTag(textTag)
-                    )
+    ) =
+        runTest(
+            selectionContainerIconModifier,
+            expectedSelectionContainerIcon,
+            textIconModifier,
+            expectedTextIcon,
+        ) { containerTag: String, textTag: String, boxModifier: Modifier, textModifier: Modifier ->
+            SelectionContainer {
+                Box(
+                    modifier =
+                        Modifier.requiredSize(200.dp)
+                            .then(boxModifier)
+                            .border(BorderStroke(2.dp, SolidColor(Color.Red)))
+                            .testTag(containerTag)
+                ) {
+                    DisableSelection {
+                        BasicText(
+                            text = "this is selectable text",
+                            modifier = Modifier.then(textModifier).testTag(textTag)
+                        )
+                    }
                 }
             }
         }
-    }
 
     private fun runTest(
         selectionContainerIconModifier: Modifier,
         expectedSelectionContainerIcon: Int,
         textIconModifier: Modifier,
         expectedTextIcon: Int,
-        contentBlock: @Composable (
-            containerTag: String,
-            textTag: String,
-            boxModifier: Modifier,
-            textModifier: Modifier
-        ) -> Unit,
-    ) = with(PointerIconTestScope(rule)) {
-        val selectionContainerTag = "container"
-        val textTag = "text"
+        contentBlock:
+            @Composable
+            (
+                containerTag: String, textTag: String, boxModifier: Modifier, textModifier: Modifier
+            ) -> Unit,
+    ) =
+        with(PointerIconTestScope(rule)) {
+            val selectionContainerTag = "container"
+            val textTag = "text"
 
-        setContent {
-            contentBlock(
-                selectionContainerTag,
-                textTag,
-                selectionContainerIconModifier,
-                textIconModifier,
-            )
+            setContent {
+                contentBlock(
+                    selectionContainerTag,
+                    textTag,
+                    selectionContainerIconModifier,
+                    textIconModifier,
+                )
+            }
+
+            // Hover over text
+            rule.onNodeWithTag(textTag).performMouseInput { enter(bottomRight) }
+            assertIcon(expectedTextIcon)
+
+            // Move cursor to hover over portion of the parent box not covered by any descendants
+            rule.onNodeWithTag(selectionContainerTag).performMouseInput { moveTo(bottomRight) }
+            assertIcon(expectedSelectionContainerIcon)
+
+            // Exit hovering over element
+            rule.onNodeWithTag(selectionContainerTag).performMouseInput { exit() }
+            assertIcon(TYPE_DEFAULT)
         }
-
-        // Hover over text
-        rule.onNodeWithTag(textTag).performMouseInput { enter(bottomRight) }
-        assertIcon(expectedTextIcon)
-
-        // Move cursor to hover over portion of the parent box not covered by any descendants
-        rule.onNodeWithTag(selectionContainerTag).performMouseInput { moveTo(bottomRight) }
-        assertIcon(expectedSelectionContainerIcon)
-
-        // Exit hovering over element
-        rule.onNodeWithTag(selectionContainerTag).performMouseInput { exit() }
-        assertIcon(TYPE_DEFAULT)
-    }
 }
diff --git a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/BasicTextLayoutTest.kt b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/BasicTextLayoutTest.kt
index b45e79b..50e20d7 100644
--- a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/BasicTextLayoutTest.kt
+++ b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/BasicTextLayoutTest.kt
@@ -35,8 +35,7 @@
 @RunWith(AndroidJUnit4::class)
 class BasicTextLayoutTest {
 
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
     @Test
     fun simple_layoutText_doesNotThrow_when2shl14char() {
@@ -50,9 +49,8 @@
         }
         rule.waitForIdle()
 
-        assertThat(textLayoutResult?.multiParagraph?.height).isGreaterThan(
-            UnfocusedDimensionConstraintMax
-        )
+        assertThat(textLayoutResult?.multiParagraph?.height)
+            .isGreaterThan(UnfocusedDimensionConstraintMax)
     }
 
     @Test
@@ -66,8 +64,7 @@
             )
         }
         rule.waitForIdle()
-        assertThat(textLayoutResult?.multiParagraph?.height).isGreaterThan(
-            UnfocusedDimensionConstraintMax
-        )
+        assertThat(textLayoutResult?.multiParagraph?.height)
+            .isGreaterThan(UnfocusedDimensionConstraintMax)
     }
 }
diff --git a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/BasicTextLinkTest.kt b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/BasicTextLinkTest.kt
index 72f2465..eb1c29c 100644
--- a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/BasicTextLinkTest.kt
+++ b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/BasicTextLinkTest.kt
@@ -95,19 +95,19 @@
 @RunWith(AndroidJUnit4::class)
 @MediumTest
 class BasicTextLinkTest {
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
     private val fontSize = 20.sp
     private val focusRequester = FocusRequester()
     private lateinit var focusManager: FocusManager
     private var openedUri: String? = null
     private var layoutResult: TextLayoutResult? = null
-    private val uriHandler = object : UriHandler {
-        override fun openUri(uri: String) {
-            openedUri = uri
+    private val uriHandler =
+        object : UriHandler {
+            override fun openUri(uri: String) {
+                openedUri = uri
+            }
         }
-    }
 
     private val Url1 = "link1"
     private val Url2 = "link2"
@@ -170,9 +170,7 @@
             click(boundingBox.center)
         }
 
-        rule.runOnIdle {
-            assertThat(openedUri).isEqualTo(Url1)
-        }
+        rule.runOnIdle { assertThat(openedUri).isEqualTo(Url1) }
     }
 
     @Test
@@ -185,9 +183,7 @@
             click(boundingBox.center)
         }
 
-        rule.runOnIdle {
-            assertThat(openedUri).isEqualTo(Url2)
-        }
+        rule.runOnIdle { assertThat(openedUri).isEqualTo(Url2) }
     }
 
     @Test
@@ -213,9 +209,7 @@
             click(boundingBox.center)
         }
 
-        rule.runOnIdle {
-            assertThat(openedUri).isNull()
-        }
+        rule.runOnIdle { assertThat(openedUri).isNull() }
     }
 
     @Test
@@ -228,9 +222,7 @@
             click(boundingBox.center)
         }
 
-        rule.runOnIdle {
-            assertThat(openedUri).isEqualTo(Url2)
-        }
+        rule.runOnIdle { assertThat(openedUri).isEqualTo(Url2) }
     }
 
     @Test
@@ -243,9 +235,7 @@
             click(boundingBox.center)
         }
 
-        rule.runOnIdle {
-            assertThat(openedUri).isEqualTo(Url1)
-        }
+        rule.runOnIdle { assertThat(openedUri).isEqualTo(Url1) }
     }
 
     @Test
@@ -258,9 +248,7 @@
             click(boundingBox.center)
         }
 
-        rule.runOnIdle {
-            assertThat(openedUri).isEqualTo(Url2)
-        }
+        rule.runOnIdle { assertThat(openedUri).isEqualTo(Url2) }
     }
 
     @Test
@@ -273,9 +261,7 @@
             click(boundingBox.center)
         }
 
-        rule.runOnIdle {
-            assertThat(openedUri).isEqualTo(null)
-        }
+        rule.runOnIdle { assertThat(openedUri).isEqualTo(null) }
     }
 
     @Test
@@ -288,9 +274,7 @@
             click(boundingBox.center)
         }
 
-        rule.runOnIdle {
-            assertThat(openedUri).isEqualTo(null)
-        }
+        rule.runOnIdle { assertThat(openedUri).isEqualTo(null) }
     }
 
     @Test
@@ -303,9 +287,7 @@
             click(boundingBox.center)
         }
 
-        rule.runOnIdle {
-            assertThat(openedUri).isEqualTo(Url1)
-        }
+        rule.runOnIdle { assertThat(openedUri).isEqualTo(Url1) }
     }
 
     @Test
@@ -318,59 +300,39 @@
             click(boundingBox.center)
         }
 
-        rule.runOnIdle {
-            assertThat(openedUri).isEqualTo(null)
-        }
+        rule.runOnIdle { assertThat(openedUri).isEqualTo(null) }
     }
 
     @Test
     fun link_andInlineContent_onClick_opensUrl() {
         setupContent {
-            /***
-             * +--------------------+
-             * | link text [ ] text |
-             * +--------------------+
-             */
+            /** +--------------------+ | link text [ ] text | +--------------------+ */
             val text = buildAnnotatedString {
                 withLink(Url(Url1)) { append("link") }
                 append(" text ")
                 appendInlineContent("box")
                 append(" text")
             }
-            val inlineTextContent = InlineTextContent(
-                placeholder = Placeholder(
-                    fontSize,
-                    fontSize,
-                    PlaceholderVerticalAlign.Center
-                )
-            ) {
-                Box(
-                    modifier = Modifier
-                        .fillMaxSize()
-                        .testTag("box")
-                )
-            }
-            BasicText(
-                text = text,
-                inlineContent = mapOf("box" to inlineTextContent)
-            )
+            val inlineTextContent =
+                InlineTextContent(
+                    placeholder = Placeholder(fontSize, fontSize, PlaceholderVerticalAlign.Center)
+                ) {
+                    Box(modifier = Modifier.fillMaxSize().testTag("box"))
+                }
+            BasicText(text = text, inlineContent = mapOf("box" to inlineTextContent))
         }
 
         rule.onAllNodes(hasClickAction(), useUnmergedTree = true)[0].performClick()
 
         rule.onNodeWithTag("box", useUnmergedTree = true).assertExists()
-        rule.runOnIdle {
-            assertThat(openedUri).isEqualTo(Url1)
-        }
+        rule.runOnIdle { assertThat(openedUri).isEqualTo(Url1) }
     }
 
     @Test
     fun link_withTranslatedString() {
         val originalText = buildAnnotatedString {
             append("text ")
-            withLink(Url(Url1)) {
-                append("link")
-            }
+            withLink(Url(Url1)) { append("link") }
         }
         setupContent { BasicText(originalText) }
 
@@ -389,9 +351,7 @@
         rule.waitForIdle()
 
         rule.onFirstText().performClick()
-        rule.runOnIdle {
-            assertThat(openedUri).isEqualTo(null)
-        }
+        rule.runOnIdle { assertThat(openedUri).isEqualTo(null) }
     }
 
     @Test
@@ -399,26 +359,19 @@
         setupContent {
             Column {
                 // initial focus
-                Box(
-                    Modifier
-                        .testTag("box")
-                        .size(10.dp)
-                        .focusRequester(focusRequester)
-                        .focusable()
-                )
+                Box(Modifier.testTag("box").size(10.dp).focusRequester(focusRequester).focusable())
 
                 val color = remember { mutableStateOf(Color.Red) }
                 BasicText(
                     buildAnnotatedString {
                         withLink(Url(Url1)) {
-                            withStyle(SpanStyle(color = color.value)) {
-                                append("link")
-                            }
+                            withStyle(SpanStyle(color = color.value)) { append("link") }
                         }
                     },
-                    modifier = Modifier.onFocusChanged {
-                        color.value = if (it.hasFocus) Color.Green else Color.Red
-                    }
+                    modifier =
+                        Modifier.onFocusChanged {
+                            color.value = if (it.hasFocus) Color.Green else Color.Red
+                        }
                 )
             }
         }
@@ -451,17 +404,14 @@
     @SdkSuppress(minSdkVersion = Build.VERSION_CODES.O)
     fun link_styleFromAnnotationUsed() {
         val textWithLink = buildAnnotatedString {
-            withLink(
-                Url("link",
-                    TextLinkStyles(style = SpanStyle(color = Color.Red))
-                )
-            ) { append("text") }
+            withLink(Url("link", TextLinkStyles(style = SpanStyle(color = Color.Red)))) {
+                append("text")
+            }
         }
-        setupContent {
-            BasicText(text = textWithLink, style = TextStyle(color = Color.White))
-        }
+        setupContent { BasicText(text = textWithLink, style = TextStyle(color = Color.White)) }
 
-        rule.onNode(hasClickAction(), useUnmergedTree = true)
+        rule
+            .onNode(hasClickAction(), useUnmergedTree = true)
             .captureToImage()
             .assertContainsColor(Color.Red)
     }
@@ -476,11 +426,10 @@
                 }
             }
         }
-        setupContent {
-            BasicText(text = textWithLink, style = TextStyle(color = Color.White))
-        }
+        setupContent { BasicText(text = textWithLink, style = TextStyle(color = Color.White)) }
 
-        rule.onNode(hasClickAction(), useUnmergedTree = true)
+        rule
+            .onNode(hasClickAction(), useUnmergedTree = true)
             .captureToImage()
             .assertContainsColor(Color.Green)
             .assertContainsColor(Color.Red)
@@ -492,19 +441,21 @@
     fun link_onHover_hoveredStyleUsed() {
         val textWithLink = buildAnnotatedString {
             withLink(
-                Url("link",
+                Url(
+                    "link",
                     TextLinkStyles(
                         style = SpanStyle(background = Color.Red),
                         hoveredStyle = SpanStyle(background = Color.Green)
                     )
                 )
-            ) { append("text") }
+            ) {
+                append("text")
+            }
         }
-        setupContent {
-            BasicText(text = textWithLink, style = TextStyle(color = Color.White))
-        }
+        setupContent { BasicText(text = textWithLink, style = TextStyle(color = Color.White)) }
 
-        rule.onNode(hasClickAction(), useUnmergedTree = true)
+        rule
+            .onNode(hasClickAction(), useUnmergedTree = true)
             .performMouseInput { moveTo(this.center) }
             .captureToImage()
             .assertContainsColor(Color.Green)
@@ -525,14 +476,15 @@
                             hoveredStyle = SpanStyle(background = Color.Green)
                         )
                     )
-                ) { append("text") }
+                ) {
+                    append("text")
+                }
             }
         }
-        setupContent {
-            BasicText(text = textWithLink, style = TextStyle(color = Color.White))
-        }
+        setupContent { BasicText(text = textWithLink, style = TextStyle(color = Color.White)) }
 
-        rule.onNode(hasClickAction(), useUnmergedTree = true)
+        rule
+            .onNode(hasClickAction(), useUnmergedTree = true)
             .performMouseInput { moveTo(this.center) }
             .captureToImage()
             .assertContainsColor(Color.Green)
@@ -546,19 +498,21 @@
     fun link_onHover_hoveredStyle_mergedIntoNormal() {
         val textWithLink = buildAnnotatedString {
             withLink(
-                Url("link",
+                Url(
+                    "link",
                     TextLinkStyles(
                         style = SpanStyle(color = Color.Red),
                         hoveredStyle = SpanStyle(background = Color.Green)
                     )
                 )
-            ) { append("text") }
+            ) {
+                append("text")
+            }
         }
-        setupContent {
-            BasicText(text = textWithLink, style = TextStyle(color = Color.White))
-        }
+        setupContent { BasicText(text = textWithLink, style = TextStyle(color = Color.White)) }
 
-        rule.onNode(hasClickAction(), useUnmergedTree = true)
+        rule
+            .onNode(hasClickAction(), useUnmergedTree = true)
             .performMouseInput { moveTo(this.center) }
             .captureToImage()
             .assertContainsColor(Color.Green)
@@ -570,19 +524,21 @@
     fun link_onFocus_focusedStyleUsed() {
         val textWithLink = buildAnnotatedString {
             withLink(
-                Url("link",
+                Url(
+                    "link",
                     TextLinkStyles(
                         style = SpanStyle(background = Color.Red),
                         focusedStyle = SpanStyle(background = Color.Blue)
                     )
                 )
-            ) { append("text") }
+            ) {
+                append("text")
+            }
         }
-        setupContent {
-            BasicText(text = textWithLink, style = TextStyle(color = Color.White))
-        }
+        setupContent { BasicText(text = textWithLink, style = TextStyle(color = Color.White)) }
 
-        rule.onNode(hasClickAction(), useUnmergedTree = true)
+        rule
+            .onNode(hasClickAction(), useUnmergedTree = true)
             .requestFocus()
             .captureToImage()
             .assertContainsColor(Color.Blue)
@@ -602,14 +558,15 @@
                             focusedStyle = SpanStyle(background = Color.Blue)
                         )
                     )
-                ) { append("text") }
+                ) {
+                    append("text")
+                }
             }
         }
-        setupContent {
-            BasicText(text = textWithLink, style = TextStyle(color = Color.White))
-        }
+        setupContent { BasicText(text = textWithLink, style = TextStyle(color = Color.White)) }
 
-        rule.onNode(hasClickAction(), useUnmergedTree = true)
+        rule
+            .onNode(hasClickAction(), useUnmergedTree = true)
             .requestFocus()
             .captureToImage()
             .assertContainsColor(Color.Blue)
@@ -622,19 +579,21 @@
     fun link_onFocus_focusedStyle_mergedIntoNormal() {
         val textWithLink = buildAnnotatedString {
             withLink(
-                Url("link",
+                Url(
+                    "link",
                     TextLinkStyles(
                         style = SpanStyle(color = Color.Red),
                         focusedStyle = SpanStyle(background = Color.Blue)
                     )
                 )
-            ) { append("text") }
+            ) {
+                append("text")
+            }
         }
-        setupContent {
-            BasicText(text = textWithLink, style = TextStyle(color = Color.White))
-        }
+        setupContent { BasicText(text = textWithLink, style = TextStyle(color = Color.White)) }
 
-        rule.onNode(hasClickAction(), useUnmergedTree = true)
+        rule
+            .onNode(hasClickAction(), useUnmergedTree = true)
             .requestFocus()
             .captureToImage()
             .assertContainsColor(Color.Blue)
@@ -647,19 +606,21 @@
     fun link_onFocus_onHovered_onHoveredStyleUsed() {
         val textWithLink = buildAnnotatedString {
             withLink(
-                Url("link",
+                Url(
+                    "link",
                     TextLinkStyles(
                         hoveredStyle = SpanStyle(background = Color.Green),
                         focusedStyle = SpanStyle(background = Color.Blue)
                     )
                 )
-            ) { append("text") }
+            ) {
+                append("text")
+            }
         }
-        setupContent {
-            BasicText(text = textWithLink, style = TextStyle(color = Color.White))
-        }
+        setupContent { BasicText(text = textWithLink, style = TextStyle(color = Color.White)) }
 
-        rule.onNode(hasClickAction(), useUnmergedTree = true)
+        rule
+            .onNode(hasClickAction(), useUnmergedTree = true)
             .requestFocus()
             .performMouseInput { moveTo(this.center) }
             .captureToImage()
@@ -673,19 +634,21 @@
     fun link_onHovered_onFocus_onHoveredStyleUsed() {
         val textWithLink = buildAnnotatedString {
             withLink(
-                Url("link",
+                Url(
+                    "link",
                     TextLinkStyles(
                         hoveredStyle = SpanStyle(background = Color.Green),
                         focusedStyle = SpanStyle(background = Color.Blue)
                     )
                 )
-            ) { append("text") }
+            ) {
+                append("text")
+            }
         }
-        setupContent {
-            BasicText(text = textWithLink, style = TextStyle(color = Color.White))
-        }
+        setupContent { BasicText(text = textWithLink, style = TextStyle(color = Color.White)) }
 
-        rule.onNode(hasClickAction(), useUnmergedTree = true)
+        rule
+            .onNode(hasClickAction(), useUnmergedTree = true)
             .performMouseInput { moveTo(this.center) }
             .requestFocus()
             .captureToImage()
@@ -699,19 +662,21 @@
     fun link_hoveredAndFocused_mergedStyle() {
         val textWithLink = buildAnnotatedString {
             withLink(
-                Url("link",
+                Url(
+                    "link",
                     TextLinkStyles(
                         hoveredStyle = SpanStyle(color = Color.Green),
                         focusedStyle = SpanStyle(background = Color.Blue)
                     )
                 )
-            ) { append("text") }
+            ) {
+                append("text")
+            }
         }
-        setupContent {
-            BasicText(text = textWithLink, style = TextStyle(color = Color.White))
-        }
+        setupContent { BasicText(text = textWithLink, style = TextStyle(color = Color.White)) }
 
-        rule.onNode(hasClickAction(), useUnmergedTree = true)
+        rule
+            .onNode(hasClickAction(), useUnmergedTree = true)
             .performMouseInput { moveTo(this.center) }
             .requestFocus()
             .captureToImage()
@@ -723,17 +688,14 @@
     @SdkSuppress(minSdkVersion = Build.VERSION_CODES.O)
     fun link_onPressed_pressedStyleUsed() {
         val textWithLink = buildAnnotatedString {
-            withLink(
-                Url("link",
-                    TextLinkStyles(pressedStyle = SpanStyle(color = Color.Green))
-                )
-            ) { append("text") }
+            withLink(Url("link", TextLinkStyles(pressedStyle = SpanStyle(color = Color.Green)))) {
+                append("text")
+            }
         }
-        setupContent {
-            BasicText(text = textWithLink, style = TextStyle(color = Color.White))
-        }
+        setupContent { BasicText(text = textWithLink, style = TextStyle(color = Color.White)) }
 
-        rule.onNode(hasClickAction(), useUnmergedTree = true)
+        rule
+            .onNode(hasClickAction(), useUnmergedTree = true)
             .performTouchInput { longPress(this.center) }
             .captureToImage()
             .assertContainsColor(Color.Green)
@@ -745,18 +707,16 @@
         val textWithLink = buildAnnotatedString {
             withStyle(SpanStyle(color = Color.Green)) {
                 withLink(
-                    Url(
-                        "link",
-                        TextLinkStyles(pressedStyle = SpanStyle(color = Color.Blue))
-                    )
-                ) { append("text") }
+                    Url("link", TextLinkStyles(pressedStyle = SpanStyle(color = Color.Blue)))
+                ) {
+                    append("text")
+                }
             }
         }
-        setupContent {
-            BasicText(text = textWithLink, style = TextStyle(color = Color.White))
-        }
+        setupContent { BasicText(text = textWithLink, style = TextStyle(color = Color.White)) }
 
-        rule.onNode(hasClickAction(), useUnmergedTree = true)
+        rule
+            .onNode(hasClickAction(), useUnmergedTree = true)
             .performTouchInput { longPress(this.center) }
             .captureToImage()
             .assertDoesNotContainColor(Color.Green)
@@ -769,20 +729,22 @@
     fun link_onPressed_whenHoveredAndFocused_pressedStyleUsed() {
         val textWithLink = buildAnnotatedString {
             withLink(
-                Url("link",
+                Url(
+                    "link",
                     TextLinkStyles(
                         focusedStyle = SpanStyle(color = Color.Red),
                         hoveredStyle = SpanStyle(color = Color.Green),
                         pressedStyle = SpanStyle(color = Color.Blue)
                     )
                 )
-            ) { append("text") }
+            ) {
+                append("text")
+            }
         }
-        setupContent {
-            BasicText(text = textWithLink, style = TextStyle(color = Color.White))
-        }
+        setupContent { BasicText(text = textWithLink, style = TextStyle(color = Color.White)) }
 
-        rule.onNode(hasClickAction(), useUnmergedTree = true)
+        rule
+            .onNode(hasClickAction(), useUnmergedTree = true)
             .requestFocus()
             .performMouseInput { moveTo(this.center) }
             .performTouchInput { longPress(this.center) }
@@ -797,19 +759,21 @@
     fun link_onPressed_whenFocused_mergedStyle() {
         val textWithLink = buildAnnotatedString {
             withLink(
-                Url("link",
+                Url(
+                    "link",
                     TextLinkStyles(
                         focusedStyle = SpanStyle(background = Color.Green),
                         pressedStyle = SpanStyle(color = Color.Blue)
                     )
                 )
-            ) { append("text") }
+            ) {
+                append("text")
+            }
         }
-        setupContent {
-            BasicText(text = textWithLink, style = TextStyle(color = Color.White))
-        }
+        setupContent { BasicText(text = textWithLink, style = TextStyle(color = Color.White)) }
 
-        rule.onNode(hasClickAction(), useUnmergedTree = true)
+        rule
+            .onNode(hasClickAction(), useUnmergedTree = true)
             .requestFocus()
             .performTouchInput { longPress(this.center) }
             .captureToImage()
@@ -823,10 +787,7 @@
         setupContent {
             BasicText(
                 buildAnnotatedString {
-                    withLink(Url("qwerty") {
-                            clickedUrlAnnotation = it as Url
-                        }
-                    ) { append("link") }
+                    withLink(Url("qwerty") { clickedUrlAnnotation = it as Url }) { append("link") }
                 }
             )
         }
@@ -846,10 +807,13 @@
         setupContent {
             BasicText(
                 buildAnnotatedString {
-                    withLink(LinkAnnotation.Clickable("qwerty") {
+                    withLink(
+                        LinkAnnotation.Clickable("qwerty") {
                             clickedAnnotation = it as LinkAnnotation.Clickable
                         }
-                    ) { append("link") }
+                    ) {
+                        append("link")
+                    }
                 }
             )
         }
@@ -863,53 +827,42 @@
     }
 
     @Composable
-    private fun TextWithLinks() = with(rule.density) {
-        Column {
-            /***
-             * +-----------------------+
-             * | text link text a long |
-             * | link text             |
-             * | text link             |
-             * | [ ]                   |
-             * +-----------------------+
-             */
-            val style = TextStyle(fontSize = fontSize, fontFamily = TEST_FONT_FAMILY)
+    private fun TextWithLinks() =
+        with(rule.density) {
+            Column {
+                /**
+                 * +-----------------------+ | text link text a long | | link text | | text link | |
+                 * [ ] | +-----------------------+
+                 */
+                val style = TextStyle(fontSize = fontSize, fontFamily = TEST_FONT_FAMILY)
 
-            val text = buildAnnotatedString {
-                append("text ")
-                withLink(Url(Url1)) {
-                    append("link ")
+                val text = buildAnnotatedString {
+                    append("text ")
+                    withLink(Url(Url1)) { append("link ") }
+                    append("text ")
+                    withLink(Url(Url2)) { append("a long link ") }
+                    append("text")
                 }
-                append("text ")
-                withLink(Url(Url2)) {
-                    append("a long link ")
-                }
-                append("text")
+                val widthDp = (fontSize * 22).toDp() // to fit text in the middle of the second link
+                BasicText(
+                    text = text,
+                    modifier = Modifier.width(widthDp),
+                    onTextLayout = { layoutResult = it },
+                    style = style
+                )
+
+                BasicText(
+                    buildAnnotatedString {
+                        append("text ")
+                        withLink(Url(Url3)) { append("link ") }
+                    },
+                    style = style
+                )
+
+                // initial focus
+                Box(Modifier.size(10.dp).focusRequester(focusRequester).focusTarget())
             }
-            val widthDp = (fontSize * 22).toDp() // to fit text in the middle of the second link
-            BasicText(
-                text = text,
-                modifier = Modifier.width(widthDp),
-                onTextLayout = { layoutResult = it },
-                style = style
-            )
-
-            BasicText(buildAnnotatedString {
-                append("text ")
-                withLink(Url(Url3)) {
-                    append("link ")
-                }
-            }, style = style)
-
-            // initial focus
-            Box(
-                Modifier
-                    .size(10.dp)
-                    .focusRequester(focusRequester)
-                    .focusTarget()
-            )
         }
-    }
 
     @Composable
     private fun BidiTextWithLinks() {
@@ -926,9 +879,7 @@
         val text = buildAnnotatedString {
             withLink(Url(Url1)) { append("\u05D0\u05D1 \u05D2\u05D3 \u05D0\u05D1") }
             append(" \u05D0\u05D1 \u05D2\u05D3 \u05D0\u05D1 \u05D0\u05D1 \u05D2\u05D3")
-            withLink(Url(Url2)) {
-                append(" \u05D0\u05D1 \u05D2\u05D3 \u05D0\u05D1")
-            }
+            withLink(Url(Url2)) { append(" \u05D0\u05D1 \u05D2\u05D3 \u05D0\u05D1") }
             append("\u05D0\u05D1 \u05D2\u05D3")
         }
         BasicText(text, onTextLayout = { layoutResult = it })
@@ -936,16 +887,16 @@
 
     @OptIn(ExperimentalComposeUiApi::class)
     private fun setupContent(content: @Composable () -> Unit) {
-        val keyboardMockManager = object : InputModeManager {
-            override val inputMode = InputMode.Keyboard
-            override fun requestInputMode(inputMode: InputMode) = true
-        }
+        val keyboardMockManager =
+            object : InputModeManager {
+                override val inputMode = InputMode.Keyboard
+
+                override fun requestInputMode(inputMode: InputMode) = true
+            }
         rule.setContent {
             focusManager = LocalFocusManager.current
-            val viewConfiguration = DelegatedViewConfiguration(
-                LocalViewConfiguration.current,
-                DpSize.Zero
-            )
+            val viewConfiguration =
+                DelegatedViewConfiguration(LocalViewConfiguration.current, DpSize.Zero)
             CompositionLocalProvider(
                 LocalUriHandler provides uriHandler,
                 LocalViewConfiguration provides viewConfiguration,
diff --git a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/BasicTextMinMaxLinesTest.kt b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/BasicTextMinMaxLinesTest.kt
index aad39c5..139de7c 100644
--- a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/BasicTextMinMaxLinesTest.kt
+++ b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/BasicTextMinMaxLinesTest.kt
@@ -31,8 +31,7 @@
 @RunWith(AndroidJUnit4::class)
 class BasicTextMinMaxLinesTest {
 
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
     private val longText = "Lorem ipsum\n".repeat(10)
     private val shortText = "Lorem ipsum"
@@ -51,24 +50,18 @@
                 shortText,
                 minLines = minLines1,
                 maxLines = maxLines1,
-                onTextLayout = {
-                    size1 = it.size.height
-                }
+                onTextLayout = { size1 = it.size.height }
             )
 
             BasicText(
                 shortText,
                 minLines = minLines2,
                 maxLines = maxLines2,
-                onTextLayout = {
-                    size2 = it.size.height
-                }
+                onTextLayout = { size2 = it.size.height }
             )
         }
 
-        rule.runOnIdle {
-            assertThat(size2).isGreaterThan(size1)
-        }
+        rule.runOnIdle { assertThat(size2).isGreaterThan(size1) }
     }
 
     @Test
@@ -85,24 +78,18 @@
                 longText,
                 minLines = minLines1,
                 maxLines = maxLines1,
-                onTextLayout = {
-                    size1 = it.size.height
-                }
+                onTextLayout = { size1 = it.size.height }
             )
 
             BasicText(
                 longText,
                 minLines = minLines2,
                 maxLines = maxLines2,
-                onTextLayout = {
-                    size2 = it.size.height
-                }
+                onTextLayout = { size2 = it.size.height }
             )
         }
 
-        rule.runOnIdle {
-            assertThat(size2).isLessThan(size1)
-        }
+        rule.runOnIdle { assertThat(size2).isLessThan(size1) }
     }
 
     @Test
@@ -111,13 +98,7 @@
         var minLines by mutableStateOf(2)
 
         rule.setContent {
-            BasicText(
-                shortText,
-                minLines = minLines,
-                onTextLayout = {
-                    size += it.size.height
-                }
-            )
+            BasicText(shortText, minLines = minLines, onTextLayout = { size += it.size.height })
         }
 
         minLines += 1
@@ -134,13 +115,7 @@
         var maxLines by mutableStateOf(5)
 
         rule.setContent {
-            BasicText(
-                longText,
-                maxLines = maxLines,
-                onTextLayout = {
-                    size += it.size.height
-                }
-            )
+            BasicText(longText, maxLines = maxLines, onTextLayout = { size += it.size.height })
         }
 
         maxLines -= 1
@@ -157,13 +132,7 @@
         var minLines by mutableStateOf(1)
 
         rule.setContent {
-            BasicText(
-                shortText,
-                minLines = minLines,
-                onTextLayout = {
-                    size += it.size.height
-                }
-            )
+            BasicText(shortText, minLines = minLines, onTextLayout = { size += it.size.height })
         }
 
         minLines += 1
@@ -180,13 +149,7 @@
         var maxLines by mutableStateOf(Int.MAX_VALUE)
 
         rule.setContent {
-            BasicText(
-                longText,
-                maxLines = maxLines,
-                onTextLayout = {
-                    size += it.size.height
-                }
-            )
+            BasicText(longText, maxLines = maxLines, onTextLayout = { size += it.size.height })
         }
 
         maxLines = 2
@@ -199,34 +162,16 @@
 
     @Test(expected = IllegalArgumentException::class)
     fun validateMaxLinesGreaterThanMinLines() {
-        rule.setContent {
-            BasicText(
-                shortText,
-                minLines = 2,
-                maxLines = 1
-            )
-        }
+        rule.setContent { BasicText(shortText, minLines = 2, maxLines = 1) }
     }
 
     @Test(expected = IllegalArgumentException::class)
     fun validateMinLinesPositive() {
-        rule.setContent {
-            BasicText(
-                shortText,
-                minLines = 0,
-                maxLines = 1
-            )
-        }
+        rule.setContent { BasicText(shortText, minLines = 0, maxLines = 1) }
     }
 
     @Test(expected = IllegalArgumentException::class)
     fun validateMaxLinesPositive() {
-        rule.setContent {
-            BasicText(
-                shortText,
-                minLines = 1,
-                maxLines = 0
-            )
-        }
+        rule.setContent { BasicText(shortText, minLines = 1, maxLines = 0) }
     }
 }
diff --git a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/BasicTextMinSizeTest.kt b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/BasicTextMinSizeTest.kt
index 346bc69..214a605 100644
--- a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/BasicTextMinSizeTest.kt
+++ b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/BasicTextMinSizeTest.kt
@@ -38,17 +38,14 @@
 @RunWith(AndroidJUnit4::class)
 class BasicTextMinSizeTest {
 
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
     @Test
     fun changingMinSizeConstraint_shrinksLayout() {
         var isBig by mutableStateOf(true)
         val widths = mutableListOf<Int>()
         rule.setContent {
-            MinSizeChangeLayout(isBig = { isBig }, onMeasure = { widths += it }) {
-                BasicText("A")
-            }
+            MinSizeChangeLayout(isBig = { isBig }, onMeasure = { widths += it }) { BasicText("A") }
         }
         rule.waitForIdle()
         isBig = !isBig
@@ -85,20 +82,22 @@
     Layout(
         modifier = Modifier.fillMaxWidth(),
         measurePolicy = { measurables, constraints ->
-            val newConstraints = Constraints(
-                minWidth = if (isBig()) { constraints.maxWidth } else { constraints.maxWidth / 2 },
-                maxWidth = constraints.maxWidth,
-                minHeight = 0,
-                maxHeight = constraints.maxHeight
-            )
-            val placeables = measurables.map {
-                it.measure(newConstraints)
-            }
+            val newConstraints =
+                Constraints(
+                    minWidth =
+                        if (isBig()) {
+                            constraints.maxWidth
+                        } else {
+                            constraints.maxWidth / 2
+                        },
+                    maxWidth = constraints.maxWidth,
+                    minHeight = 0,
+                    maxHeight = constraints.maxHeight
+                )
+            val placeables = measurables.map { it.measure(newConstraints) }
             onMeasure(placeables.first().width)
             layout(constraints.minWidth, placeables[0].height) {
-                placeables.forEachIndexed { _, it ->
-                    it.place(0, 0)
-                }
+                placeables.forEachIndexed { _, it -> it.place(0, 0) }
             }
         },
         content = content
diff --git a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/BasicTextScreenshotTest.kt b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/BasicTextScreenshotTest.kt
index e53b47f..c5820cf 100644
--- a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/BasicTextScreenshotTest.kt
+++ b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/BasicTextScreenshotTest.kt
@@ -43,11 +43,9 @@
 @RunWith(AndroidJUnit4::class)
 @SdkSuppress(minSdkVersion = Build.VERSION_CODES.O)
 class BasicTextScreenshotTest {
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
-    @get:Rule
-    val screenshotRule = AndroidXScreenshotTestRule(GOLDEN_UI)
+    @get:Rule val screenshotRule = AndroidXScreenshotTestRule(GOLDEN_UI)
 
     private val textTag = "text"
 
@@ -55,21 +53,24 @@
     fun multiStyleText_setFontWeight() {
         rule.setContent {
             BasicText(
-                text = buildAnnotatedString {
-                    append("Hello ")
-                    pushStyle(SpanStyle(fontWeight = FontWeight.Bold))
-                    append("World")
-                    pop()
-                },
+                text =
+                    buildAnnotatedString {
+                        append("Hello ")
+                        pushStyle(SpanStyle(fontWeight = FontWeight.Bold))
+                        append("World")
+                        pop()
+                    },
                 modifier = Modifier.testTag(textTag),
-                style = TextStyle(
-                    fontSize = 24.sp,
-                    fontStyle = FontStyle.Italic,
-                    fontFamily = FontFamily.Monospace
-                )
+                style =
+                    TextStyle(
+                        fontSize = 24.sp,
+                        fontStyle = FontStyle.Italic,
+                        fontFamily = FontFamily.Monospace
+                    )
             )
         }
-        rule.onNodeWithTag(textTag)
+        rule
+            .onNodeWithTag(textTag)
             .captureToImage()
             .assertAgainstGolden(screenshotRule, "multiStyleText_setFontWeight")
     }
@@ -78,22 +79,25 @@
     fun multiStyleText_setFontFamily() {
         rule.setContent {
             BasicText(
-                text = buildAnnotatedString {
-                    append("Hello ")
-                    pushStyle(SpanStyle(fontFamily = FontFamily.SansSerif))
-                    append("World")
-                    pop()
-                },
+                text =
+                    buildAnnotatedString {
+                        append("Hello ")
+                        pushStyle(SpanStyle(fontFamily = FontFamily.SansSerif))
+                        append("World")
+                        pop()
+                    },
                 modifier = Modifier.testTag(textTag),
-                style = TextStyle(
-                    fontSize = 24.sp,
-                    fontStyle = FontStyle.Italic,
-                    fontWeight = FontWeight.Bold,
-                    fontFamily = FontFamily.Monospace
-                )
+                style =
+                    TextStyle(
+                        fontSize = 24.sp,
+                        fontStyle = FontStyle.Italic,
+                        fontWeight = FontWeight.Bold,
+                        fontFamily = FontFamily.Monospace
+                    )
             )
         }
-        rule.onNodeWithTag(textTag)
+        rule
+            .onNodeWithTag(textTag)
             .captureToImage()
             .assertAgainstGolden(screenshotRule, "multiStyleText_setFontFamily")
     }
@@ -102,21 +106,24 @@
     fun multiStyleText_setFontStyle() {
         rule.setContent {
             BasicText(
-                text = buildAnnotatedString {
-                    append("Hello ")
-                    pushStyle(SpanStyle(fontStyle = FontStyle.Italic))
-                    append("World")
-                    pop()
-                },
+                text =
+                    buildAnnotatedString {
+                        append("Hello ")
+                        pushStyle(SpanStyle(fontStyle = FontStyle.Italic))
+                        append("World")
+                        pop()
+                    },
                 modifier = Modifier.testTag(textTag),
-                style = TextStyle(
-                    fontSize = 24.sp,
-                    fontWeight = FontWeight.Bold,
-                    fontFamily = FontFamily.Monospace
-                )
+                style =
+                    TextStyle(
+                        fontSize = 24.sp,
+                        fontWeight = FontWeight.Bold,
+                        fontFamily = FontFamily.Monospace
+                    )
             )
         }
-        rule.onNodeWithTag(textTag)
+        rule
+            .onNodeWithTag(textTag)
             .captureToImage()
             .assertAgainstGolden(screenshotRule, "multiStyleText_setFontStyle")
     }
diff --git a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/BasicTextSemanticsTest.kt b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/BasicTextSemanticsTest.kt
index 7765353..7d5f986 100644
--- a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/BasicTextSemanticsTest.kt
+++ b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/BasicTextSemanticsTest.kt
@@ -32,15 +32,12 @@
 @RunWith(AndroidJUnit4::class)
 class BasicTextSemanticsTest {
 
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
     @Test
     fun semanticsTextChanges_String() {
         var text by mutableStateOf("before")
-        rule.setContent {
-            BasicText(text)
-        }
+        rule.setContent { BasicText(text) }
         rule.onNodeWithText("before").assertExists()
         text = "after"
         rule.onNodeWithText("after").assertExists()
@@ -49,9 +46,7 @@
     @Test
     fun semanticsTextChanges_AnnotatedString() {
         var text by mutableStateOf("before")
-        rule.setContent {
-            BasicText(AnnotatedString(text))
-        }
+        rule.setContent { BasicText(AnnotatedString(text)) }
         rule.onNodeWithText("before").assertExists()
         text = "after"
         rule.onNodeWithText("after").assertExists()
diff --git a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/ClickableTextTest.kt b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/ClickableTextTest.kt
index 88a9550..be3905e 100644
--- a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/ClickableTextTest.kt
+++ b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/ClickableTextTest.kt
@@ -44,8 +44,7 @@
 @RunWith(AndroidJUnit4::class)
 @Suppress("Deprecation")
 class ClickableTextTest {
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
     @Test
     fun onclick_callback() {
@@ -60,9 +59,7 @@
 
         rule.onNodeWithTag("clickableText").performClick()
 
-        rule.runOnIdle {
-            verify(onClick, times(1)).invoke(any())
-        }
+        rule.runOnIdle { verify(onClick, times(1)).invoke(any()) }
     }
 
     @Test
@@ -102,15 +99,14 @@
             )
         }
 
-        rule.onNodeWithTag("clickableText")
-            .performMouseInput {
-                moveTo(Offset(-1f, -1f), 0) // outside bounds
-                moveTo(Offset(1f, 1f), 0) // inside bounds
-                moveTo(Offset(-1f, -1f), 0) // outside bounds again
-                moveTo(Offset(1f, 1f), 0) // inside bounds again
-                moveTo(Offset(1f, 2f), 0) // move but stay on the same character
-                moveTo(Offset(50f, 1f), 0) // move to different character
-            }
+        rule.onNodeWithTag("clickableText").performMouseInput {
+            moveTo(Offset(-1f, -1f), 0) // outside bounds
+            moveTo(Offset(1f, 1f), 0) // inside bounds
+            moveTo(Offset(-1f, -1f), 0) // outside bounds again
+            moveTo(Offset(1f, 1f), 0) // inside bounds again
+            moveTo(Offset(1f, 2f), 0) // move but stay on the same character
+            moveTo(Offset(50f, 1f), 0) // move to different character
+        }
 
         rule.runOnIdle {
             onHover.inOrder {
diff --git a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/CoreTextFieldFocusTest.kt b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/CoreTextFieldFocusTest.kt
index ce5800b..9ec616f 100644
--- a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/CoreTextFieldFocusTest.kt
+++ b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/CoreTextFieldFocusTest.kt
@@ -46,8 +46,7 @@
 @MediumTest
 @RunWith(AndroidJUnit4::class)
 class CoreTextFieldFocusTest {
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
     private val inputMethodInterceptor = InputMethodInterceptor(rule)
 
@@ -93,9 +92,7 @@
         rule.onNodeWithTag("TextField").requestFocus()
         inputMethodInterceptor.assertSessionActive()
 
-        rule.runOnIdle {
-            focusManager.clearFocus()
-        }
+        rule.runOnIdle { focusManager.clearFocus() }
 
         inputMethodInterceptor.assertNoSessionActive()
     }
diff --git a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/CoreTextFieldHandwritingBoundsTest.kt b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/CoreTextFieldHandwritingBoundsTest.kt
index d0e5b20..0dcf7fe 100644
--- a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/CoreTextFieldHandwritingBoundsTest.kt
+++ b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/CoreTextFieldHandwritingBoundsTest.kt
@@ -54,46 +54,46 @@
 @MediumTest
 @RunWith(AndroidJUnit4::class)
 class CoreTextFieldHandwritingBoundsTest {
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
     private val inputMethodInterceptor = InputMethodInterceptor(rule)
 
-    private val fakeImm = object : InputMethodManager {
-        private var stylusHandwritingStartCount = 0
+    private val fakeImm =
+        object : InputMethodManager {
+            private var stylusHandwritingStartCount = 0
 
-        fun expectStylusHandwriting(started: Boolean) {
-            if (started) {
-                assertThat(stylusHandwritingStartCount).isEqualTo(1)
-                stylusHandwritingStartCount = 0
-            } else {
-                assertThat(stylusHandwritingStartCount).isZero()
+            fun expectStylusHandwriting(started: Boolean) {
+                if (started) {
+                    assertThat(stylusHandwritingStartCount).isEqualTo(1)
+                    stylusHandwritingStartCount = 0
+                } else {
+                    assertThat(stylusHandwritingStartCount).isZero()
+                }
+            }
+
+            override fun isActive(): Boolean = true
+
+            override fun restartInput() {}
+
+            override fun showSoftInput() {}
+
+            override fun hideSoftInput() {}
+
+            override fun updateExtractedText(token: Int, extractedText: ExtractedText) {}
+
+            override fun updateSelection(
+                selectionStart: Int,
+                selectionEnd: Int,
+                compositionStart: Int,
+                compositionEnd: Int
+            ) {}
+
+            override fun updateCursorAnchorInfo(cursorAnchorInfo: CursorAnchorInfo) {}
+
+            override fun startStylusHandwriting() {
+                ++stylusHandwritingStartCount
             }
         }
 
-        override fun isActive(): Boolean = true
-
-        override fun restartInput() {}
-
-        override fun showSoftInput() {}
-
-        override fun hideSoftInput() {}
-
-        override fun updateExtractedText(token: Int, extractedText: ExtractedText) {}
-
-        override fun updateSelection(
-            selectionStart: Int,
-            selectionEnd: Int,
-            compositionStart: Int,
-            compositionEnd: Int
-        ) {}
-
-        override fun updateCursorAnchorInfo(cursorAnchorInfo: CursorAnchorInfo) {}
-
-        override fun startStylusHandwriting() {
-            ++stylusHandwritingStartCount
-        }
-    }
-
     @Before
     fun setup() {
         // Test is only meaningful when stylusHandwriting is supported.
@@ -134,9 +134,10 @@
             Column(Modifier.safeContentPadding()) {
                 EditLine(Modifier.testTag(editorTag1))
                 Spacer(
-                    modifier = Modifier.fillMaxWidth()
-                        .height(HandwritingBoundsVerticalOffset)
-                        .testTag(spacerTag)
+                    modifier =
+                        Modifier.fillMaxWidth()
+                            .height(HandwritingBoundsVerticalOffset)
+                            .testTag(spacerTag)
                 )
                 EditLine(Modifier.testTag(editorTag2))
             }
@@ -169,11 +170,12 @@
         CoreTextField(
             value = value,
             onValueChange = { value = it },
-            modifier = modifier
-                .fillMaxWidth()
-                // make the size of TextFields equal to padding, so that touch bounds of editors
-                // in the same column/row are overlapping.
-                .height(HandwritingBoundsVerticalOffset)
+            modifier =
+                modifier
+                    .fillMaxWidth()
+                    // make the size of TextFields equal to padding, so that touch bounds of editors
+                    // in the same column/row are overlapping.
+                    .height(HandwritingBoundsVerticalOffset)
         )
     }
 
@@ -182,9 +184,7 @@
         content: @Composable () -> Unit
     ) {
         rule.setFocusableContent(extraItemForInitialFocus) {
-            inputMethodInterceptor.Content {
-                content()
-            }
+            inputMethodInterceptor.Content { content() }
         }
     }
 }
diff --git a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/CoreTextFieldHandwritingGestureTest.kt b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/CoreTextFieldHandwritingGestureTest.kt
index 37c4219..d917e80 100644
--- a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/CoreTextFieldHandwritingGestureTest.kt
+++ b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/CoreTextFieldHandwritingGestureTest.kt
@@ -78,8 +78,7 @@
 @RequiresApi(34)
 @SdkSuppress(minSdkVersion = 34)
 class CoreTextFieldHandwritingGestureTest {
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
     private val inputMethodInterceptor = InputMethodInterceptor(rule)
 
     private val Tag = "CoreTextField"
@@ -589,13 +588,11 @@
         testHandwritingGesture(
             text = text,
             gestureFactory = { textLayoutResult ->
-                val startArea = textLayoutResult.boundingBoxOf("c").let {
-                    localToScreen(it).toAndroidRectF()
-                }
+                val startArea =
+                    textLayoutResult.boundingBoxOf("c").let { localToScreen(it).toAndroidRectF() }
 
-                val endArea = textLayoutResult.boundingBoxOf("d").let {
-                    localToScreen(it).toAndroidRectF()
-                }
+                val endArea =
+                    textLayoutResult.boundingBoxOf("d").let { localToScreen(it).toAndroidRectF() }
 
                 SelectRangeGesture.Builder()
                     .setSelectionStartArea(startArea)
@@ -619,13 +616,11 @@
             text = text,
             initialSelection = TextRange(initialCursor),
             gestureFactory = { textLayoutResult ->
-                val startArea = textLayoutResult.boundingBoxOf("c").let {
-                    localToScreen(it).toAndroidRectF()
-                }
+                val startArea =
+                    textLayoutResult.boundingBoxOf("c").let { localToScreen(it).toAndroidRectF() }
 
-                val endArea = textLayoutResult.boundingBoxOf("d").let {
-                    localToScreen(it).toAndroidRectF()
-                }
+                val endArea =
+                    textLayoutResult.boundingBoxOf("d").let { localToScreen(it).toAndroidRectF() }
 
                 SelectRangeGesture.Builder()
                     .setSelectionStartArea(startArea)
@@ -649,13 +644,11 @@
         testHandwritingGesture(
             text = text,
             gestureFactory = { textLayoutResult ->
-                val startArea = textLayoutResult.boundingBoxOf("b").let {
-                    localToScreen(it).toAndroidRectF()
-                }
+                val startArea =
+                    textLayoutResult.boundingBoxOf("b").let { localToScreen(it).toAndroidRectF() }
 
-                val endArea = textLayoutResult.boundingBoxOf("e").let {
-                    localToScreen(it).toAndroidRectF()
-                }
+                val endArea =
+                    textLayoutResult.boundingBoxOf("e").let { localToScreen(it).toAndroidRectF() }
 
                 SelectRangeGesture.Builder()
                     .setSelectionStartArea(startArea)
@@ -679,13 +672,11 @@
             text = text,
             initialSelection = TextRange(initialCursor),
             gestureFactory = { textLayoutResult ->
-                val startArea = textLayoutResult.boundingBoxOf("b").let {
-                    localToScreen(it).toAndroidRectF()
-                }
+                val startArea =
+                    textLayoutResult.boundingBoxOf("b").let { localToScreen(it).toAndroidRectF() }
 
-                val endArea = textLayoutResult.boundingBoxOf("e").let {
-                    localToScreen(it).toAndroidRectF()
-                }
+                val endArea =
+                    textLayoutResult.boundingBoxOf("e").let { localToScreen(it).toAndroidRectF() }
 
                 SelectRangeGesture.Builder()
                     .setSelectionStartArea(startArea)
@@ -715,9 +706,8 @@
             text = text,
             initialSelection = TextRange(initialCursor),
             gestureFactory = { textLayoutResult ->
-                val endArea = textLayoutResult.boundingBoxOf("d").let {
-                    localToScreen(it).toAndroidRectF()
-                }
+                val endArea =
+                    textLayoutResult.boundingBoxOf("d").let { localToScreen(it).toAndroidRectF() }
                 // The startArea selects nothing, but the endArea contains one character, it
                 // should still fallback.
                 SelectRangeGesture.Builder()
@@ -746,9 +736,8 @@
             text = text,
             initialSelection = TextRange(initialCursor),
             gestureFactory = { textLayoutResult ->
-                val startArea = textLayoutResult.boundingBoxOf("c").let {
-                    localToScreen(it).toAndroidRectF()
-                }
+                val startArea =
+                    textLayoutResult.boundingBoxOf("c").let { localToScreen(it).toAndroidRectF() }
                 // The endArea selects nothing, but the start contains one character, it
                 // should still fallback.
                 SelectRangeGesture.Builder()
@@ -776,9 +765,8 @@
             text = text,
             initialSelection = TextRange(initialCursor),
             gestureFactory = { textLayoutResult ->
-                val endArea = textLayoutResult.boundingBoxOf("d").let {
-                    localToScreen(it).toAndroidRectF()
-                }
+                val endArea =
+                    textLayoutResult.boundingBoxOf("d").let { localToScreen(it).toAndroidRectF() }
                 // The startArea selects nothing, but the endArea contains one character, it
                 // should still fallback.
                 SelectRangeGesture.Builder()
@@ -823,12 +811,10 @@
         testHandwritingGesture(
             text = text,
             gestureFactory = { textLayoutResult ->
-                val startArea = textLayoutResult.boundingBoxOf("c").let {
-                    localToScreen(it).toAndroidRectF()
-                }
-                val endArea = textLayoutResult.boundingBoxOf("d").let {
-                    localToScreen(it).toAndroidRectF()
-                }
+                val startArea =
+                    textLayoutResult.boundingBoxOf("c").let { localToScreen(it).toAndroidRectF() }
+                val endArea =
+                    textLayoutResult.boundingBoxOf("d").let { localToScreen(it).toAndroidRectF() }
 
                 DeleteRangeGesture.Builder()
                     .setDeletionStartArea(startArea)
@@ -854,12 +840,10 @@
             text = text,
             initialSelection = TextRange(initialCursor),
             gestureFactory = { textLayoutResult ->
-                val startArea = textLayoutResult.boundingBoxOf("c").let {
-                    localToScreen(it).toAndroidRectF()
-                }
-                val endArea = textLayoutResult.boundingBoxOf("d").let {
-                    localToScreen(it).toAndroidRectF()
-                }
+                val startArea =
+                    textLayoutResult.boundingBoxOf("c").let { localToScreen(it).toAndroidRectF() }
+                val endArea =
+                    textLayoutResult.boundingBoxOf("d").let { localToScreen(it).toAndroidRectF() }
 
                 DeleteRangeGesture.Builder()
                     .setDeletionStartArea(startArea)
@@ -883,12 +867,10 @@
         testHandwritingGesture(
             text = text,
             gestureFactory = { textLayoutResult ->
-                val startArea = textLayoutResult.boundingBoxOf("e").let {
-                    localToScreen(it).toAndroidRectF()
-                }
-                val endArea = textLayoutResult.boundingBoxOf("h").let {
-                    localToScreen(it).toAndroidRectF()
-                }
+                val startArea =
+                    textLayoutResult.boundingBoxOf("e").let { localToScreen(it).toAndroidRectF() }
+                val endArea =
+                    textLayoutResult.boundingBoxOf("h").let { localToScreen(it).toAndroidRectF() }
 
                 DeleteRangeGesture.Builder()
                     .setDeletionStartArea(startArea)
@@ -913,12 +895,10 @@
             text = text,
             initialSelection = TextRange(initialCursor),
             gestureFactory = { textLayoutResult ->
-                val startArea = textLayoutResult.boundingBoxOf("e").let {
-                    localToScreen(it).toAndroidRectF()
-                }
-                val endArea = textLayoutResult.boundingBoxOf("h").let {
-                    localToScreen(it).toAndroidRectF()
-                }
+                val startArea =
+                    textLayoutResult.boundingBoxOf("e").let { localToScreen(it).toAndroidRectF() }
+                val endArea =
+                    textLayoutResult.boundingBoxOf("h").let { localToScreen(it).toAndroidRectF() }
 
                 DeleteRangeGesture.Builder()
                     .setDeletionStartArea(startArea)
@@ -929,7 +909,8 @@
             preview = true,
             imageAssertion = { imageBitmap, textLayoutResult ->
                 imageBitmap.assertDeletionPreviewHighlight(
-                    textLayoutResult, text.rangeOf("def\n jhi")
+                    textLayoutResult,
+                    text.rangeOf("def\n jhi")
                 )
             }
         ) { textFieldValue, _, _ ->
@@ -947,9 +928,8 @@
             text = text,
             initialSelection = TextRange(initialCursor),
             gestureFactory = { textLayoutResult ->
-                val endArea = textLayoutResult.boundingBoxOf("d").let {
-                    localToScreen(it).toAndroidRectF()
-                }
+                val endArea =
+                    textLayoutResult.boundingBoxOf("d").let { localToScreen(it).toAndroidRectF() }
                 // The startArea selects nothing, but the endArea contains one character, it
                 // should still fallback.
                 DeleteRangeGesture.Builder()
@@ -978,9 +958,8 @@
             text = text,
             initialSelection = TextRange(initialCursor),
             gestureFactory = { textLayoutResult ->
-                val startArea = textLayoutResult.boundingBoxOf("c").let {
-                    localToScreen(it).toAndroidRectF()
-                }
+                val startArea =
+                    textLayoutResult.boundingBoxOf("c").let { localToScreen(it).toAndroidRectF() }
                 // The endArea selects nothing, but the start contains one character, it
                 // should still fallback.
                 DeleteRangeGesture.Builder()
@@ -1008,9 +987,8 @@
             text = text,
             initialSelection = TextRange(initialCursor),
             gestureFactory = { textLayoutResult ->
-                val endArea = textLayoutResult.boundingBoxOf("d").let {
-                    localToScreen(it).toAndroidRectF()
-                }
+                val endArea =
+                    textLayoutResult.boundingBoxOf("d").let { localToScreen(it).toAndroidRectF() }
                 // The startArea selects nothing, but the endArea contains one character, it
                 // should still fallback.
                 DeleteRangeGesture.Builder()
@@ -1058,9 +1036,7 @@
                 // Perform the gesture before 'd'.
                 val point = textLayoutResult.boundingBoxOf("d").centerLeft
                 val screenPoint = localToScreen(point).toPointF()
-                JoinOrSplitGesture.Builder()
-                    .setJoinOrSplitPoint(screenPoint)
-                    .build()
+                JoinOrSplitGesture.Builder().setJoinOrSplitPoint(screenPoint).build()
             }
         ) { textFieldValue, resultCode, textToolbar ->
             assertThat(resultCode).isEqualTo(InputConnection.HANDWRITING_GESTURE_RESULT_SUCCESS)
@@ -1109,9 +1085,7 @@
                 // Perform the gesture after 'c'.
                 val point = textLayoutResult.boundingBoxOf("c").centerRight
                 val screenPoint = localToScreen(point).toPointF()
-                JoinOrSplitGesture.Builder()
-                    .setJoinOrSplitPoint(screenPoint)
-                    .build()
+                JoinOrSplitGesture.Builder().setJoinOrSplitPoint(screenPoint).build()
             }
         ) { textFieldValue, resultCode, textToolbar ->
             assertThat(resultCode).isEqualTo(InputConnection.HANDWRITING_GESTURE_RESULT_FAILED)
@@ -1130,9 +1104,7 @@
                 // Perform the gesture before 'd'.
                 val point = textLayoutResult.boundingBoxOf("d").centerLeft
                 val screenPoint = localToScreen(point).toPointF()
-                JoinOrSplitGesture.Builder()
-                    .setJoinOrSplitPoint(screenPoint)
-                    .build()
+                JoinOrSplitGesture.Builder().setJoinOrSplitPoint(screenPoint).build()
             }
         ) { textFieldValue, resultCode, textToolbar ->
             assertThat(resultCode).isEqualTo(InputConnection.HANDWRITING_GESTURE_RESULT_SUCCESS)
@@ -1152,9 +1124,7 @@
                 // Perform the gesture after 'd'.
                 val point = textLayoutResult.boundingBoxOf("c").centerRight
                 val screenPoint = localToScreen(point).toPointF()
-                JoinOrSplitGesture.Builder()
-                    .setJoinOrSplitPoint(screenPoint)
-                    .build()
+                JoinOrSplitGesture.Builder().setJoinOrSplitPoint(screenPoint).build()
             }
         ) { textFieldValue, resultCode, textToolbar ->
             assertThat(resultCode).isEqualTo(InputConnection.HANDWRITING_GESTURE_RESULT_SUCCESS)
@@ -1174,9 +1144,7 @@
                 // Perform the gesture before 'd'.
                 val point = textLayoutResult.boundingBoxOf("d").centerLeft
                 val screenPoint = localToScreen(point).toPointF()
-                JoinOrSplitGesture.Builder()
-                    .setJoinOrSplitPoint(screenPoint)
-                    .build()
+                JoinOrSplitGesture.Builder().setJoinOrSplitPoint(screenPoint).build()
             }
         ) { textFieldValue, resultCode, textToolbar ->
             assertThat(resultCode).isEqualTo(InputConnection.HANDWRITING_GESTURE_RESULT_SUCCESS)
@@ -1196,9 +1164,7 @@
                 // Perform the gesture before 'd'.
                 val point = textLayoutResult.boundingBoxOf("c").centerRight
                 val screenPoint = localToScreen(point).toPointF()
-                JoinOrSplitGesture.Builder()
-                    .setJoinOrSplitPoint(screenPoint)
-                    .build()
+                JoinOrSplitGesture.Builder().setJoinOrSplitPoint(screenPoint).build()
             }
         ) { textFieldValue, resultCode, textToolbar ->
             assertThat(resultCode).isEqualTo(InputConnection.HANDWRITING_GESTURE_RESULT_SUCCESS)
@@ -1218,9 +1184,7 @@
                 // Perform the gesture in the middle of the spaces.
                 val point = textLayoutResult.boundingBoxOf("   ").center
                 val screenPoint = localToScreen(point).toPointF()
-                JoinOrSplitGesture.Builder()
-                    .setJoinOrSplitPoint(screenPoint)
-                    .build()
+                JoinOrSplitGesture.Builder().setJoinOrSplitPoint(screenPoint).build()
             }
         ) { textFieldValue, resultCode, textToolbar ->
             assertThat(resultCode).isEqualTo(InputConnection.HANDWRITING_GESTURE_RESULT_SUCCESS)
@@ -1241,9 +1205,10 @@
             initialSelection = TextRange(initialCursor),
             gestureFactory = { textLayoutResult ->
                 // Perform the gesture 20 pixels above the line.
-                val point = textLayoutResult.boundingBoxOf("d").topLeft.let {
-                    Offset(it.x, it.y - lineMargin - 1)
-                }
+                val point =
+                    textLayoutResult.boundingBoxOf("d").topLeft.let {
+                        Offset(it.x, it.y - lineMargin - 1)
+                    }
                 val screenPoint = localToScreen(point).toPointF()
                 JoinOrSplitGesture.Builder()
                     .setJoinOrSplitPoint(screenPoint)
@@ -1268,13 +1233,12 @@
             text = text,
             gestureFactory = { textLayoutResult ->
                 // Perform the gesture 20 pixels above the line.
-                val point = textLayoutResult.boundingBoxOf("d").topLeft.let {
-                    Offset(it.x, it.y - lineMargin - 1)
-                }
+                val point =
+                    textLayoutResult.boundingBoxOf("d").topLeft.let {
+                        Offset(it.x, it.y - lineMargin - 1)
+                    }
                 val screenPoint = localToScreen(point).toPointF()
-                JoinOrSplitGesture.Builder()
-                    .setJoinOrSplitPoint(screenPoint)
-                    .build()
+                JoinOrSplitGesture.Builder().setJoinOrSplitPoint(screenPoint).build()
             }
         ) { textFieldValue, resultCode, textToolbar ->
             assertThat(resultCode).isEqualTo(InputConnection.HANDWRITING_GESTURE_RESULT_FAILED)
@@ -1319,9 +1283,10 @@
             initialSelection = TextRange(initialCursor),
             gestureFactory = { textLayoutResult ->
                 // Perform the gesture 20 pixels above the line.
-                val point = textLayoutResult.boundingBoxOf("d").topLeft.let {
-                    Offset(it.x, it.y - lineMargin - 1)
-                }
+                val point =
+                    textLayoutResult.boundingBoxOf("d").topLeft.let {
+                        Offset(it.x, it.y - lineMargin - 1)
+                    }
                 val screenPoint = localToScreen(point).toPointF()
                 InsertGesture.Builder()
                     .setInsertionPoint(screenPoint)
@@ -1347,14 +1312,12 @@
             text = text,
             gestureFactory = { textLayoutResult ->
                 // Perform the gesture 20 pixels above the line.
-                val point = textLayoutResult.boundingBoxOf("d").topLeft.let {
-                    Offset(it.x, it.y - lineMargin - 1)
-                }
+                val point =
+                    textLayoutResult.boundingBoxOf("d").topLeft.let {
+                        Offset(it.x, it.y - lineMargin - 1)
+                    }
                 val screenPoint = localToScreen(point).toPointF()
-                InsertGesture.Builder()
-                    .setInsertionPoint(screenPoint)
-                    .setTextToInsert("")
-                    .build()
+                InsertGesture.Builder().setInsertionPoint(screenPoint).setTextToInsert("").build()
             }
         ) { textFieldState, resultCode, textToolbar ->
             assertThat(resultCode).isEqualTo(InputConnection.HANDWRITING_GESTURE_RESULT_FAILED)
@@ -1371,16 +1334,16 @@
             text = text,
             gestureFactory = { textLayoutResult ->
                 // The given gestures should remove spaces within the range of "cd ef".
-                val startPoint = textLayoutResult.boundingBoxOf("c").centerLeft.let {
-                    localToScreen(it).toPointF()
-                }
-                val endPoint = textLayoutResult.boundingBoxOf("f").centerRight.let {
-                    localToScreen(it).toPointF()
-                }
+                val startPoint =
+                    textLayoutResult.boundingBoxOf("c").centerLeft.let {
+                        localToScreen(it).toPointF()
+                    }
+                val endPoint =
+                    textLayoutResult.boundingBoxOf("f").centerRight.let {
+                        localToScreen(it).toPointF()
+                    }
 
-                RemoveSpaceGesture.Builder()
-                    .setPoints(startPoint, endPoint)
-                    .build()
+                RemoveSpaceGesture.Builder().setPoints(startPoint, endPoint).build()
             }
         ) { textFieldState, resultCode, textToolbar ->
             assertThat(resultCode).isEqualTo(InputConnection.HANDWRITING_GESTURE_RESULT_SUCCESS)
@@ -1402,16 +1365,16 @@
                 // This gestures only works for single line. When the given points touches multiple
                 // lines, it should only remove spaces at the first line. In this case, it'll be
                 // remove spaces within the range of "b cd e" ('e' is at the top of 'k').
-                val startPoint = textLayoutResult.boundingBoxOf("b").centerLeft.let {
-                    localToScreen(it).toPointF()
-                }
-                val endPoint = textLayoutResult.boundingBoxOf("k").centerRight.let {
-                    localToScreen(it).toPointF()
-                }
+                val startPoint =
+                    textLayoutResult.boundingBoxOf("b").centerLeft.let {
+                        localToScreen(it).toPointF()
+                    }
+                val endPoint =
+                    textLayoutResult.boundingBoxOf("k").centerRight.let {
+                        localToScreen(it).toPointF()
+                    }
 
-                RemoveSpaceGesture.Builder()
-                    .setPoints(startPoint, endPoint)
-                    .build()
+                RemoveSpaceGesture.Builder().setPoints(startPoint, endPoint).build()
             }
         ) { textFieldState, resultCode, textToolbar ->
             assertThat(resultCode).isEqualTo(InputConnection.HANDWRITING_GESTURE_RESULT_SUCCESS)
@@ -1431,16 +1394,16 @@
             text = text,
             gestureFactory = { textLayoutResult ->
                 // The gesture covers spaces only, between 'b' and 'c'.
-                val startPoint = textLayoutResult.boundingBoxOf("b").centerRight.let {
-                    localToScreen(it).toPointF()
-                }
-                val endPoint = textLayoutResult.boundingBoxOf("c").centerLeft.let {
-                    localToScreen(it).toPointF()
-                }
+                val startPoint =
+                    textLayoutResult.boundingBoxOf("b").centerRight.let {
+                        localToScreen(it).toPointF()
+                    }
+                val endPoint =
+                    textLayoutResult.boundingBoxOf("c").centerLeft.let {
+                        localToScreen(it).toPointF()
+                    }
 
-                RemoveSpaceGesture.Builder()
-                    .setPoints(startPoint, endPoint)
-                    .build()
+                RemoveSpaceGesture.Builder().setPoints(startPoint, endPoint).build()
             }
         ) { textFieldState, resultCode, textToolbar ->
             assertThat(resultCode).isEqualTo(InputConnection.HANDWRITING_GESTURE_RESULT_SUCCESS)
@@ -1463,12 +1426,14 @@
             initialSelection = TextRange(initialCursor),
             gestureFactory = { textLayoutResult ->
                 // The gesture covers "cdef" which contains no spaces.
-                val startPoint = textLayoutResult.boundingBoxOf("c").centerLeft.let {
-                    localToScreen(it).toPointF()
-                }
-                val endPoint = textLayoutResult.boundingBoxOf("f").centerRight.let {
-                    localToScreen(it).toPointF()
-                }
+                val startPoint =
+                    textLayoutResult.boundingBoxOf("c").centerLeft.let {
+                        localToScreen(it).toPointF()
+                    }
+                val endPoint =
+                    textLayoutResult.boundingBoxOf("f").centerRight.let {
+                        localToScreen(it).toPointF()
+                    }
 
                 RemoveSpaceGesture.Builder()
                     .setPoints(startPoint, endPoint)
@@ -1493,16 +1458,16 @@
             text = text,
             gestureFactory = { textLayoutResult ->
                 // The gesture covers "cdef" which contains no spaces.
-                val startPoint = textLayoutResult.boundingBoxOf("c").centerLeft.let {
-                    localToScreen(it).toPointF()
-                }
-                val endPoint = textLayoutResult.boundingBoxOf("f").centerRight.let {
-                    localToScreen(it).toPointF()
-                }
+                val startPoint =
+                    textLayoutResult.boundingBoxOf("c").centerLeft.let {
+                        localToScreen(it).toPointF()
+                    }
+                val endPoint =
+                    textLayoutResult.boundingBoxOf("f").centerRight.let {
+                        localToScreen(it).toPointF()
+                    }
 
-                RemoveSpaceGesture.Builder()
-                    .setPoints(startPoint, endPoint)
-                    .build()
+                RemoveSpaceGesture.Builder().setPoints(startPoint, endPoint).build()
             }
         ) { textFieldState, resultCode, textToolbar ->
             assertThat(resultCode).isEqualTo(InputConnection.HANDWRITING_GESTURE_RESULT_FAILED)
@@ -1522,17 +1487,17 @@
                 // The start point is out of line margin. and endPoint is now used to select
                 // the target line (the 2nd line).
                 // It'll remove the spaces between "h ij k".('h' is under 'b')
-                val startPoint = textLayoutResult.boundingBoxOf("b").topLeft.let {
-                    val offset = it.copy(y = it.y - lineMargin - 1)
-                    localToScreen(offset).toPointF()
-                }
-                val endPoint = textLayoutResult.boundingBoxOf("k").centerRight.let {
-                    localToScreen(it).toPointF()
-                }
+                val startPoint =
+                    textLayoutResult.boundingBoxOf("b").topLeft.let {
+                        val offset = it.copy(y = it.y - lineMargin - 1)
+                        localToScreen(offset).toPointF()
+                    }
+                val endPoint =
+                    textLayoutResult.boundingBoxOf("k").centerRight.let {
+                        localToScreen(it).toPointF()
+                    }
 
-                RemoveSpaceGesture.Builder()
-                    .setPoints(startPoint, endPoint)
-                    .build()
+                RemoveSpaceGesture.Builder().setPoints(startPoint, endPoint).build()
             }
         ) { textFieldState, resultCode, textToolbar ->
             assertThat(resultCode).isEqualTo(InputConnection.HANDWRITING_GESTURE_RESULT_SUCCESS)
@@ -1554,17 +1519,17 @@
                 // The end point is out of line margin. and startPoint is now used to select
                 // the target line (the 2nd line).
                 // It'll remove the spaces between "h ij k". ('k' is under 'e')
-                val startPoint = textLayoutResult.boundingBoxOf("h").centerLeft.let {
-                    localToScreen(it).toPointF()
-                }
-                val endPoint = textLayoutResult.boundingBoxOf("e").topRight.let {
-                    val offset = it.copy(y = it.y - lineMargin - 1)
-                    localToScreen(offset).toPointF()
-                }
+                val startPoint =
+                    textLayoutResult.boundingBoxOf("h").centerLeft.let {
+                        localToScreen(it).toPointF()
+                    }
+                val endPoint =
+                    textLayoutResult.boundingBoxOf("e").topRight.let {
+                        val offset = it.copy(y = it.y - lineMargin - 1)
+                        localToScreen(offset).toPointF()
+                    }
 
-                RemoveSpaceGesture.Builder()
-                    .setPoints(startPoint, endPoint)
-                    .build()
+                RemoveSpaceGesture.Builder().setPoints(startPoint, endPoint).build()
             }
         ) { textFieldState, resultCode, textToolbar ->
             assertThat(resultCode).isEqualTo(InputConnection.HANDWRITING_GESTURE_RESULT_SUCCESS)
@@ -1587,14 +1552,16 @@
             initialSelection = TextRange(initialCursor),
             gestureFactory = { textLayoutResult ->
                 // The gesture covers "cdef" which contains no spaces.
-                val startPoint = textLayoutResult.boundingBoxOf("c").topLeft.let {
-                    val offset = it.copy(y = it.y - lineMargin - 1f)
-                    localToScreen(offset).toPointF()
-                }
-                val endPoint = textLayoutResult.boundingBoxOf("f").bottomRight.let {
-                    val offset = it.copy(y = it.y + lineMargin + 1f)
-                    localToScreen(offset).toPointF()
-                }
+                val startPoint =
+                    textLayoutResult.boundingBoxOf("c").topLeft.let {
+                        val offset = it.copy(y = it.y - lineMargin - 1f)
+                        localToScreen(offset).toPointF()
+                    }
+                val endPoint =
+                    textLayoutResult.boundingBoxOf("f").bottomRight.let {
+                        val offset = it.copy(y = it.y + lineMargin + 1f)
+                        localToScreen(offset).toPointF()
+                    }
 
                 RemoveSpaceGesture.Builder()
                     .setPoints(startPoint, endPoint)
@@ -1619,18 +1586,18 @@
             text = text,
             gestureFactory = { textLayoutResult ->
                 // The gesture covers "cdef" which contains no spaces.
-                val startPoint = textLayoutResult.boundingBoxOf("c").topLeft.let {
-                    val offset = it.copy(y = it.y - lineMargin - 1f)
-                    localToScreen(offset).toPointF()
-                }
-                val endPoint = textLayoutResult.boundingBoxOf("f").bottomRight.let {
-                    val offset = it.copy(y = it.y + lineMargin + 1f)
-                    localToScreen(offset).toPointF()
-                }
+                val startPoint =
+                    textLayoutResult.boundingBoxOf("c").topLeft.let {
+                        val offset = it.copy(y = it.y - lineMargin - 1f)
+                        localToScreen(offset).toPointF()
+                    }
+                val endPoint =
+                    textLayoutResult.boundingBoxOf("f").bottomRight.let {
+                        val offset = it.copy(y = it.y + lineMargin + 1f)
+                        localToScreen(offset).toPointF()
+                    }
 
-                RemoveSpaceGesture.Builder()
-                    .setPoints(startPoint, endPoint)
-                    .build()
+                RemoveSpaceGesture.Builder().setPoints(startPoint, endPoint).build()
             }
         ) { textFieldState, resultCode, textToolbar ->
             assertThat(resultCode).isEqualTo(InputConnection.HANDWRITING_GESTURE_RESULT_FAILED)
@@ -1654,14 +1621,13 @@
         val textToolbar = FakeTextToolbar()
 
         setContent {
-            val viewConfiguration = object : ViewConfiguration by LocalViewConfiguration.current {
-                override val handwritingGestureLineMargin: Float = lineMargin
-            }
+            val viewConfiguration =
+                object : ViewConfiguration by LocalViewConfiguration.current {
+                    override val handwritingGestureLineMargin: Float = lineMargin
+                }
             CompositionLocalProvider(
-                LocalTextSelectionColors provides TextSelectionColors(
-                    selectionColor,
-                    selectionColor
-                ),
+                LocalTextSelectionColors provides
+                    TextSelectionColors(selectionColor, selectionColor),
                 LocalTextToolbar provides textToolbar,
                 LocalViewConfiguration provides viewConfiguration
             ) {
@@ -1669,14 +1635,12 @@
                     value = textFieldValue,
                     onValueChange = { textFieldValue = it },
                     textStyle = TextStyle(color = textColor),
-                    modifier = Modifier
-                        .fillMaxSize()
-                        .background(backgroundColor)
-                        .testTag(Tag)
-                        .onGloballyPositioned { layoutCoordinates = it },
-                    onTextLayout = {
-                        textLayoutResult = it
-                    }
+                    modifier =
+                        Modifier.fillMaxSize()
+                            .background(backgroundColor)
+                            .testTag(Tag)
+                            .onGloballyPositioned { layoutCoordinates = it },
+                    onTextLayout = { textLayoutResult = it }
                 )
             }
         }
@@ -1694,9 +1658,7 @@
             }
         }
 
-        rule.runOnIdle {
-            assertion.invoke(textFieldValue, resultCode, textToolbar)
-        }
+        rule.runOnIdle { assertion.invoke(textFieldValue, resultCode, textToolbar) }
 
         if (imageAssertion != null) {
             imageAssertion(rule.onNodeWithTag(Tag).captureToImage(), textLayoutResult!!)
@@ -1708,9 +1670,7 @@
         content: @Composable () -> Unit
     ) {
         rule.setFocusableContent(extraItemForInitialFocus) {
-            inputMethodInterceptor.Content {
-                content()
-            }
+            inputMethodInterceptor.Content { content() }
         }
     }
 
@@ -1731,12 +1691,10 @@
         range: TextRange
     ) {
         val deletionPreviewColor = textColor.copy(alpha = textColor.alpha * 0.2f)
-        val compositeColor = Color(
-            ColorUtils.compositeColors(
-                deletionPreviewColor.toArgb(),
-                backgroundColor.toArgb()
+        val compositeColor =
+            Color(
+                ColorUtils.compositeColors(deletionPreviewColor.toArgb(), backgroundColor.toArgb())
             )
-        )
         assertHighlight(textLayoutResult, range, compositeColor)
     }
 
diff --git a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/CoreTextFieldHandwritingTest.kt b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/CoreTextFieldHandwritingTest.kt
index cc08160..07de86e 100644
--- a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/CoreTextFieldHandwritingTest.kt
+++ b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/CoreTextFieldHandwritingTest.kt
@@ -54,49 +54,49 @@
 @MediumTest
 @RunWith(AndroidJUnit4::class)
 class CoreTextFieldHandwritingTest {
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
     private val inputMethodInterceptor = InputMethodInterceptor(rule)
     private val keyboardHelper = KeyboardHelper(rule)
 
     private val Tag = "CoreTextField"
 
-    private val fakeImm = object : InputMethodManager {
-        private var stylusHandwritingStartCount = 0
+    private val fakeImm =
+        object : InputMethodManager {
+            private var stylusHandwritingStartCount = 0
 
-        fun expectStylusHandwriting(started: Boolean) {
-            if (started) {
-                assertThat(stylusHandwritingStartCount).isEqualTo(1)
-                stylusHandwritingStartCount = 0
-            } else {
-                assertThat(stylusHandwritingStartCount).isZero()
+            fun expectStylusHandwriting(started: Boolean) {
+                if (started) {
+                    assertThat(stylusHandwritingStartCount).isEqualTo(1)
+                    stylusHandwritingStartCount = 0
+                } else {
+                    assertThat(stylusHandwritingStartCount).isZero()
+                }
+            }
+
+            override fun isActive(): Boolean = true
+
+            override fun restartInput() {}
+
+            override fun showSoftInput() {}
+
+            override fun hideSoftInput() {}
+
+            override fun updateExtractedText(token: Int, extractedText: ExtractedText) {}
+
+            override fun updateSelection(
+                selectionStart: Int,
+                selectionEnd: Int,
+                compositionStart: Int,
+                compositionEnd: Int
+            ) {}
+
+            override fun updateCursorAnchorInfo(cursorAnchorInfo: CursorAnchorInfo) {}
+
+            override fun startStylusHandwriting() {
+                ++stylusHandwritingStartCount
             }
         }
 
-        override fun isActive(): Boolean = true
-
-        override fun restartInput() {}
-
-        override fun showSoftInput() {}
-
-        override fun hideSoftInput() {}
-
-        override fun updateExtractedText(token: Int, extractedText: ExtractedText) {}
-
-        override fun updateSelection(
-            selectionStart: Int,
-            selectionEnd: Int,
-            compositionStart: Int,
-            compositionEnd: Int
-        ) {}
-
-        override fun updateCursorAnchorInfo(cursorAnchorInfo: CursorAnchorInfo) {}
-
-        override fun startStylusHandwriting() {
-            ++stylusHandwritingStartCount
-        }
-    }
-
     @Before
     fun setup() {
         // Test is only meaningful when stylusHandwriting is supported.
@@ -105,16 +105,12 @@
 
     @Test
     fun coreTextField_startHandwriting_unfocused() {
-        testStylusHandwriting(stylusHandwritingStarted = true) {
-            performStylusHandwriting()
-        }
+        testStylusHandwriting(stylusHandwritingStarted = true) { performStylusHandwriting() }
     }
 
     @Test
     fun coreTextField_startStylusHandwriting_unfocused() {
-        testStylusHandwriting(stylusHandwritingStarted = true) {
-            performStylusHandwriting()
-        }
+        testStylusHandwriting(stylusHandwritingStarted = true) { performStylusHandwriting() }
     }
 
     @Test
@@ -127,23 +123,17 @@
 
     @Test
     fun coreTextField_click_notStartStylusHandwriting() {
-        testStylusHandwriting(stylusHandwritingStarted = false) {
-            performStylusClick()
-        }
+        testStylusHandwriting(stylusHandwritingStarted = false) { performStylusClick() }
     }
 
     @Test
     fun coreTextField_longClick_notStartStylusHandwriting() {
-        testStylusHandwriting(stylusHandwritingStarted = false) {
-            performStylusLongClick()
-        }
+        testStylusHandwriting(stylusHandwritingStarted = false) { performStylusLongClick() }
     }
 
     @Test
     fun coreTextField_longPressAndDrag_notStartStylusHandwriting() {
-        testStylusHandwriting(stylusHandwritingStarted = false) {
-            performStylusLongPressAndDrag()
-        }
+        testStylusHandwriting(stylusHandwritingStarted = false) { performStylusLongPressAndDrag() }
     }
 
     @Test
@@ -156,10 +146,8 @@
             val value = remember { TextFieldValue() }
             CoreTextField(
                 value = value,
-                onValueChange = { },
-                modifier = Modifier
-                    .fillMaxSize()
-                    .testTag(Tag),
+                onValueChange = {},
+                modifier = Modifier.fillMaxSize().testTag(Tag),
                 enabled = enabled
             )
         }
@@ -186,10 +174,8 @@
             val value = remember { TextFieldValue() }
             CoreTextField(
                 value = value,
-                onValueChange = { },
-                modifier = Modifier
-                    .fillMaxSize()
-                    .testTag(Tag),
+                onValueChange = {},
+                modifier = Modifier.fillMaxSize().testTag(Tag),
                 readOnly = readOnly
             )
         }
@@ -212,22 +198,19 @@
         inputMethodManagerFactory = { fakeImm }
 
         val focusWindow = mutableStateOf(true)
-        fun createWindowInfo(focused: Boolean) = object : WindowInfo {
-            override val isWindowFocused: Boolean
-                get() = focused
-        }
+        fun createWindowInfo(focused: Boolean) =
+            object : WindowInfo {
+                override val isWindowFocused: Boolean
+                    get() = focused
+            }
 
         setContent {
-            CompositionLocalProvider(
-                LocalWindowInfo provides createWindowInfo(focusWindow.value)
-            ) {
+            CompositionLocalProvider(LocalWindowInfo provides createWindowInfo(focusWindow.value)) {
                 val value = remember { TextFieldValue() }
                 CoreTextField(
                     value = value,
-                    onValueChange = { },
-                    modifier = Modifier
-                        .fillMaxSize()
-                        .testTag(Tag),
+                    onValueChange = {},
+                    modifier = Modifier.fillMaxSize().testTag(Tag),
                 )
             }
         }
@@ -251,11 +234,9 @@
             val value = remember { TextFieldValue() }
             CoreTextField(
                 value = value,
-                onValueChange = { },
+                onValueChange = {},
                 imeOptions = ImeOptions(keyboardType = KeyboardType.Password),
-                modifier = Modifier
-                    .fillMaxSize()
-                    .testTag(Tag),
+                modifier = Modifier.fillMaxSize().testTag(Tag),
             )
         }
 
@@ -270,11 +251,9 @@
             val value = remember { TextFieldValue() }
             CoreTextField(
                 value = value,
-                onValueChange = { },
+                onValueChange = {},
                 imeOptions = ImeOptions(keyboardType = KeyboardType.NumberPassword),
-                modifier = Modifier
-                    .fillMaxSize()
-                    .testTag(Tag),
+                modifier = Modifier.fillMaxSize().testTag(Tag),
             )
         }
 
@@ -288,11 +267,9 @@
             val value = remember { TextFieldValue() }
             CoreTextField(
                 value = value,
-                onValueChange = { },
+                onValueChange = {},
                 imeOptions = ImeOptions(keyboardType = KeyboardType.Password),
-                modifier = Modifier
-                    .fillMaxSize()
-                    .testTag(Tag),
+                modifier = Modifier.fillMaxSize().testTag(Tag),
             )
         }
 
@@ -308,11 +285,9 @@
             val value = remember { TextFieldValue() }
             CoreTextField(
                 value = value,
-                onValueChange = { },
+                onValueChange = {},
                 imeOptions = ImeOptions(keyboardType = KeyboardType.NumberPassword),
-                modifier = Modifier
-                    .fillMaxSize()
-                    .testTag(Tag),
+                modifier = Modifier.fillMaxSize().testTag(Tag),
             )
         }
 
@@ -331,10 +306,8 @@
             val value = remember { TextFieldValue() }
             CoreTextField(
                 value = value,
-                onValueChange = { },
-                modifier = Modifier
-                    .fillMaxSize()
-                    .testTag(Tag)
+                onValueChange = {},
+                modifier = Modifier.fillMaxSize().testTag(Tag)
             )
         }
 
@@ -348,9 +321,7 @@
         content: @Composable () -> Unit
     ) {
         rule.setFocusableContent(extraItemForInitialFocus) {
-            inputMethodInterceptor.Content {
-                content()
-            }
+            inputMethodInterceptor.Content { content() }
         }
     }
 
diff --git a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/CoreTextFieldHoverTest.kt b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/CoreTextFieldHoverTest.kt
index ee5806e..1d28132 100644
--- a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/CoreTextFieldHoverTest.kt
+++ b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/CoreTextFieldHoverTest.kt
@@ -52,102 +52,104 @@
 @SdkSuppress(minSdkVersion = Build.VERSION_CODES.N)
 @RunWith(AndroidJUnit4::class)
 class CoreTextFieldHoverTest {
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
     @Test
-    fun whenDefaultIcon_inBoxWithDefaultIcon_textIconIsUsed() = runTest(
-        boxIconModifier = Modifier,
-        expectedBoxIcon = TYPE_DEFAULT,
-        textFieldIconModifier = Modifier,
-        expectedTextIcon = TYPE_TEXT
-    )
+    fun whenDefaultIcon_inBoxWithDefaultIcon_textIconIsUsed() =
+        runTest(
+            boxIconModifier = Modifier,
+            expectedBoxIcon = TYPE_DEFAULT,
+            textFieldIconModifier = Modifier,
+            expectedTextIcon = TYPE_TEXT
+        )
 
     @Test
-    fun whenSetIcon_inBoxWithDefaultIcon_textIconIsUsed() = runTest(
-        boxIconModifier = Modifier,
-        expectedBoxIcon = TYPE_DEFAULT,
-        textFieldIconModifier = Modifier.pointerHoverIcon(PointerIcon.Crosshair),
-        expectedTextIcon = TYPE_TEXT
-    )
+    fun whenSetIcon_inBoxWithDefaultIcon_textIconIsUsed() =
+        runTest(
+            boxIconModifier = Modifier,
+            expectedBoxIcon = TYPE_DEFAULT,
+            textFieldIconModifier = Modifier.pointerHoverIcon(PointerIcon.Crosshair),
+            expectedTextIcon = TYPE_TEXT
+        )
 
     @Test
-    fun whenSetIcon_withOverride_inBoxWithDefaultIcon_setIconIsUsed() = runTest(
-        boxIconModifier = Modifier,
-        expectedBoxIcon = TYPE_DEFAULT,
-        textFieldIconModifier = Modifier.pointerHoverIcon(
-            icon = PointerIcon.Crosshair,
-            overrideDescendants = true
-        ),
-        expectedTextIcon = TYPE_CROSSHAIR
-    )
+    fun whenSetIcon_withOverride_inBoxWithDefaultIcon_setIconIsUsed() =
+        runTest(
+            boxIconModifier = Modifier,
+            expectedBoxIcon = TYPE_DEFAULT,
+            textFieldIconModifier =
+                Modifier.pointerHoverIcon(icon = PointerIcon.Crosshair, overrideDescendants = true),
+            expectedTextIcon = TYPE_CROSSHAIR
+        )
 
     @Test
-    fun whenDefaultIcon_inBoxWithSetIcon_textIconIsUsed() = runTest(
-        boxIconModifier = Modifier.pointerHoverIcon(PointerIcon.Hand),
-        expectedBoxIcon = TYPE_HAND,
-        textFieldIconModifier = Modifier,
-        expectedTextIcon = TYPE_TEXT
-    )
+    fun whenDefaultIcon_inBoxWithSetIcon_textIconIsUsed() =
+        runTest(
+            boxIconModifier = Modifier.pointerHoverIcon(PointerIcon.Hand),
+            expectedBoxIcon = TYPE_HAND,
+            textFieldIconModifier = Modifier,
+            expectedTextIcon = TYPE_TEXT
+        )
 
     @Test
-    fun whenSetIcon_inBoxWithSetIcon_textIconIsUsed() = runTest(
-        boxIconModifier = Modifier.pointerHoverIcon(PointerIcon.Hand),
-        expectedBoxIcon = TYPE_HAND,
-        textFieldIconModifier = Modifier.pointerHoverIcon(PointerIcon.Crosshair),
-        expectedTextIcon = TYPE_TEXT
-    )
+    fun whenSetIcon_inBoxWithSetIcon_textIconIsUsed() =
+        runTest(
+            boxIconModifier = Modifier.pointerHoverIcon(PointerIcon.Hand),
+            expectedBoxIcon = TYPE_HAND,
+            textFieldIconModifier = Modifier.pointerHoverIcon(PointerIcon.Crosshair),
+            expectedTextIcon = TYPE_TEXT
+        )
 
     @Test
-    fun whenSetIcon_withOverride_inBoxWithSetIcon_setIconIsUsed() = runTest(
-        boxIconModifier = Modifier.pointerHoverIcon(PointerIcon.Hand),
-        expectedBoxIcon = TYPE_HAND,
-        textFieldIconModifier = Modifier.pointerHoverIcon(
-            icon = PointerIcon.Crosshair,
-            overrideDescendants = true
-        ),
-        expectedTextIcon = TYPE_CROSSHAIR
-    )
+    fun whenSetIcon_withOverride_inBoxWithSetIcon_setIconIsUsed() =
+        runTest(
+            boxIconModifier = Modifier.pointerHoverIcon(PointerIcon.Hand),
+            expectedBoxIcon = TYPE_HAND,
+            textFieldIconModifier =
+                Modifier.pointerHoverIcon(icon = PointerIcon.Crosshair, overrideDescendants = true),
+            expectedTextIcon = TYPE_CROSSHAIR
+        )
 
     private fun runTest(
         boxIconModifier: Modifier,
         expectedBoxIcon: Int,
         textFieldIconModifier: Modifier,
         expectedTextIcon: Int,
-    ) = with(PointerIconTestScope(rule)) {
-        val boxTag = "myParentIcon"
-        val textFieldTag = "myCoreTextField"
+    ) =
+        with(PointerIconTestScope(rule)) {
+            val boxTag = "myParentIcon"
+            val textFieldTag = "myCoreTextField"
 
-        var value by mutableStateOf(TextFieldValue("initial text"))
-        setContent {
-            Box(
-                modifier = Modifier
-                    .requiredSize(200.dp)
-                    .then(boxIconModifier)
-                    .border(BorderStroke(2.dp, SolidColor(Color.Red)))
-                    .testTag(boxTag)
-            ) {
-                CoreTextField(
-                    value = value,
-                    onValueChange = { value = it },
-                    modifier = Modifier
-                        .requiredSize(50.dp)
-                        .then(textFieldIconModifier)
-                        .testTag(textFieldTag)
-                )
+            var value by mutableStateOf(TextFieldValue("initial text"))
+            setContent {
+                Box(
+                    modifier =
+                        Modifier.requiredSize(200.dp)
+                            .then(boxIconModifier)
+                            .border(BorderStroke(2.dp, SolidColor(Color.Red)))
+                            .testTag(boxTag)
+                ) {
+                    CoreTextField(
+                        value = value,
+                        onValueChange = { value = it },
+                        modifier =
+                            Modifier.requiredSize(50.dp)
+                                .then(textFieldIconModifier)
+                                .testTag(textFieldTag)
+                    )
+                }
             }
+
+            // Hover over CoreTextField
+            rule.onNodeWithTag(textFieldTag).performMouseInput { enter(bottomRight) }
+            assertIcon(expectedTextIcon)
+
+            // Move cursor to hover over portion of the parent box not covered by any descendants
+            rule.onNodeWithTag(boxTag).performMouseInput { moveTo(bottomRight) }
+            assertIcon(expectedBoxIcon)
+
+            // Exit hovering over element
+            rule.onNodeWithTag(boxTag).performMouseInput { exit() }
+            assertIcon(TYPE_DEFAULT)
         }
-
-        // Hover over CoreTextField
-        rule.onNodeWithTag(textFieldTag).performMouseInput { enter(bottomRight) }
-        assertIcon(expectedTextIcon)
-
-        // Move cursor to hover over portion of the parent box not covered by any descendants
-        rule.onNodeWithTag(boxTag).performMouseInput { moveTo(bottomRight) }
-        assertIcon(expectedBoxIcon)
-
-        // Exit hovering over element
-        rule.onNodeWithTag(boxTag).performMouseInput { exit() }
-        assertIcon(TYPE_DEFAULT)
-    }
 }
diff --git a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/CoreTextFieldInputServiceIntegrationTest.kt b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/CoreTextFieldInputServiceIntegrationTest.kt
index cd007e1..4f6b65f 100644
--- a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/CoreTextFieldInputServiceIntegrationTest.kt
+++ b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/CoreTextFieldInputServiceIntegrationTest.kt
@@ -71,8 +71,7 @@
 @RunWith(AndroidJUnit4::class)
 class CoreTextFieldInputServiceIntegrationTest {
 
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
     private lateinit var focusManager: FocusManager
     private val inputMethodInterceptor = InputMethodInterceptor(rule)
@@ -81,20 +80,20 @@
     fun textField_ImeOptions_isPassedTo_platformTextInputService() {
         val testTag = "KeyboardOption"
         val value = TextFieldValue("abc")
-        val imeOptions = ImeOptions(
-            singleLine = true,
-            capitalization = KeyboardCapitalization.Words,
-            autoCorrect = false,
-            keyboardType = KeyboardType.Phone,
-            imeAction = ImeAction.Search
-        )
+        val imeOptions =
+            ImeOptions(
+                singleLine = true,
+                capitalization = KeyboardCapitalization.Words,
+                autoCorrect = false,
+                keyboardType = KeyboardType.Phone,
+                imeAction = ImeAction.Search
+            )
 
         setContent {
             CoreTextField(
                 value = value,
                 imeOptions = imeOptions,
-                modifier = Modifier
-                    .testTag(testTag),
+                modifier = Modifier.testTag(testTag),
                 onValueChange = {}
             )
         }
@@ -131,14 +130,10 @@
                 )
             }
         }
-        rule.runOnIdle {
-            focusRequester1.requestFocus()
-        }
+        rule.runOnIdle { focusRequester1.requestFocus() }
 
         // Focus the other field. The IME connection should restart only once.
-        rule.runOnIdle {
-            focusRequester2.requestFocus()
-        }
+        rule.runOnIdle { focusRequester2.requestFocus() }
 
         inputMethodInterceptor.assertSessionActive()
         inputMethodInterceptor.assertThatSessionCount().isEqualTo(2)
@@ -206,15 +201,16 @@
     @Test
     fun keyboardShownAfterDismissingKeyboardAndClickingAgain() {
         var keyboardShown = false
-        val fakeKeyboardController = object : SoftwareKeyboardController {
-            override fun show() {
-                keyboardShown = true
-            }
+        val fakeKeyboardController =
+            object : SoftwareKeyboardController {
+                override fun show() {
+                    keyboardShown = true
+                }
 
-            override fun hide() {
-                keyboardShown = false
+                override fun hide() {
+                    keyboardShown = false
+                }
             }
-        }
 
         // Arrange.
         setContent {
@@ -372,14 +368,12 @@
             CoreTextField(
                 value = value,
                 modifier = Modifier.focusRequester(focusRequester),
-                onValueChange = { },
+                onValueChange = {},
                 onTextLayout = { textLayoutResult = it }
             )
         }
 
-        rule.runOnUiThread {
-            focusRequester.requestFocus()
-        }
+        rule.runOnUiThread { focusRequester.requestFocus() }
 
         assertFocusedRect(textLayoutResult.getBoundingBox(6).roundToIntRect())
     }
@@ -396,15 +390,13 @@
                 CoreTextField(
                     value = value,
                     modifier = Modifier.focusRequester(focusRequester),
-                    onValueChange = { },
+                    onValueChange = {},
                     onTextLayout = { textLayoutResult = it }
                 )
             }
         }
 
-        rule.runOnUiThread {
-            focusRequester.requestFocus()
-        }
+        rule.runOnUiThread { focusRequester.requestFocus() }
 
         assertFocusedRect(
             textLayoutResult.getBoundingBox(6).translate(offset.toOffset()).roundToIntRect()
@@ -438,53 +430,49 @@
         }
 
         value = TextFieldValue("a", TextRange(1))
-        rule.runOnIdle {
-            assertFocusedRect(textLayoutResult.getBoundingBox(0).roundToIntRect())
-        }
+        rule.runOnIdle { assertFocusedRect(textLayoutResult.getBoundingBox(0).roundToIntRect()) }
 
         value = TextFieldValue("a\nbc", TextRange(4))
-        rule.runOnIdle {
-            assertFocusedRect(textLayoutResult.getBoundingBox(3).roundToIntRect())
-        }
+        rule.runOnIdle { assertFocusedRect(textLayoutResult.getBoundingBox(3).roundToIntRect()) }
 
         value = TextFieldValue("a\nbc", TextRange(3))
-        rule.runOnIdle {
-            assertFocusedRect(textLayoutResult.getBoundingBox(3).roundToIntRect())
-        }
+        rule.runOnIdle { assertFocusedRect(textLayoutResult.getBoundingBox(3).roundToIntRect()) }
 
         value = TextFieldValue("a\nbc", TextRange(2))
-        rule.runOnIdle {
-            assertFocusedRect(textLayoutResult.getBoundingBox(2).roundToIntRect())
-        }
+        rule.runOnIdle { assertFocusedRect(textLayoutResult.getBoundingBox(2).roundToIntRect()) }
 
         value = TextFieldValue("a\nbc", TextRange(0))
-        rule.runOnIdle {
-            assertFocusedRect(textLayoutResult.getBoundingBox(0).roundToIntRect())
-        }
+        rule.runOnIdle { assertFocusedRect(textLayoutResult.getBoundingBox(0).roundToIntRect()) }
     }
 
     @Test
     fun cursorAnchorInfoIsUpdated_whenMonitoringAndGlobalOffsetChanges() {
         val cursorAnchorInfos = mutableListOf<CursorAnchorInfo>()
-        val fakeInputMethodManager = object : InputMethodManager {
-            override fun updateCursorAnchorInfo(cursorAnchorInfo: CursorAnchorInfo) {
-                cursorAnchorInfos += cursorAnchorInfo
-            }
+        val fakeInputMethodManager =
+            object : InputMethodManager {
+                override fun updateCursorAnchorInfo(cursorAnchorInfo: CursorAnchorInfo) {
+                    cursorAnchorInfos += cursorAnchorInfo
+                }
 
-            override fun startStylusHandwriting() {}
-            override fun isActive(): Boolean = true
-            override fun restartInput() {}
-            override fun showSoftInput() {}
-            override fun hideSoftInput() {}
-            override fun updateExtractedText(token: Int, extractedText: ExtractedText) {}
-            override fun updateSelection(
-                selectionStart: Int,
-                selectionEnd: Int,
-                compositionStart: Int,
-                compositionEnd: Int
-            ) {
+                override fun startStylusHandwriting() {}
+
+                override fun isActive(): Boolean = true
+
+                override fun restartInput() {}
+
+                override fun showSoftInput() {}
+
+                override fun hideSoftInput() {}
+
+                override fun updateExtractedText(token: Int, extractedText: ExtractedText) {}
+
+                override fun updateSelection(
+                    selectionStart: Int,
+                    selectionEnd: Int,
+                    compositionStart: Int,
+                    compositionEnd: Int
+                ) {}
             }
-        }
         inputMethodManagerFactory = { fakeInputMethodManager }
         var offset by mutableStateOf(IntOffset(0, 10))
         val value = TextFieldValue("abc\nefg", TextRange(6))
@@ -495,28 +483,22 @@
                 CoreTextField(
                     value = value,
                     modifier = Modifier.focusRequester(focusRequester),
-                    onValueChange = { },
+                    onValueChange = {},
                 )
             }
         }
-        rule.runOnUiThread {
-            focusRequester.requestFocus()
-        }
+        rule.runOnUiThread { focusRequester.requestFocus() }
 
         // Need to turn on monitoring to get notified.
         inputMethodInterceptor.withInputConnection {
             requestCursorUpdates(InputConnection.CURSOR_UPDATE_MONITOR)
         }
 
-        rule.runOnIdle {
-            assertThat(cursorAnchorInfos).isEmpty()
-        }
+        rule.runOnIdle { assertThat(cursorAnchorInfos).isEmpty() }
 
         offset = IntOffset(10, 20)
 
-        rule.runOnIdle {
-            assertThat(cursorAnchorInfos).hasSize(1)
-        }
+        rule.runOnIdle { assertThat(cursorAnchorInfos).hasSize(1) }
     }
 
     @Test
@@ -525,15 +507,14 @@
         val focusRequester = FocusRequester()
 
         val focusWindow = mutableStateOf(true)
-        fun createWindowInfo(focused: Boolean) = object : WindowInfo {
-            override val isWindowFocused: Boolean
-                get() = focused
-        }
+        fun createWindowInfo(focused: Boolean) =
+            object : WindowInfo {
+                override val isWindowFocused: Boolean
+                    get() = focused
+            }
 
         setContent {
-            CompositionLocalProvider(
-                LocalWindowInfo provides createWindowInfo(focusWindow.value)
-            ) {
+            CompositionLocalProvider(LocalWindowInfo provides createWindowInfo(focusWindow.value)) {
                 CoreTextField(
                     value = value,
                     onValueChange = {},
@@ -542,23 +523,15 @@
             }
         }
 
-        rule.runOnUiThread {
-            focusRequester.requestFocus()
-        }
+        rule.runOnUiThread { focusRequester.requestFocus() }
 
-        rule.runOnIdle {
-            inputMethodInterceptor.assertSessionActive()
-        }
+        rule.runOnIdle { inputMethodInterceptor.assertSessionActive() }
 
         focusWindow.value = false
-        rule.runOnIdle {
-            inputMethodInterceptor.assertNoSessionActive()
-        }
+        rule.runOnIdle { inputMethodInterceptor.assertNoSessionActive() }
 
         focusWindow.value = true
-        rule.runOnIdle {
-            inputMethodInterceptor.assertSessionActive()
-        }
+        rule.runOnIdle { inputMethodInterceptor.assertSessionActive() }
     }
 
     private fun setContent(
diff --git a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/CoreTextFieldKeyboardScrollableInteractionTest.kt b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/CoreTextFieldKeyboardScrollableInteractionTest.kt
index 71e3ac8..7934daf 100644
--- a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/CoreTextFieldKeyboardScrollableInteractionTest.kt
+++ b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/CoreTextFieldKeyboardScrollableInteractionTest.kt
@@ -82,15 +82,15 @@
     companion object {
         @JvmStatic
         @Parameters(name = "scrollableType={0}, softInputMode={1}, withDecorationPadding={2}")
-        fun parameters(): Iterable<Array<*>> = crossProductOf(
-            ScrollableType.values(),
-            SoftInputMode.values(),
-            arrayOf(false, true), // withDecorationPadding
-        )
+        fun parameters(): Iterable<Array<*>> =
+            crossProductOf(
+                ScrollableType.values(),
+                SoftInputMode.values(),
+                arrayOf(false, true), // withDecorationPadding
+            )
     }
 
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
     private val ListTag = "list"
     private val keyboardHelper = KeyboardHelper(rule)
@@ -106,11 +106,10 @@
         // This test is all about the keyboard going from hidden to shown, so hide it to start.
         keyboardHelper.hideKeyboardIfShown()
 
-        rule.onNodeWithTag(ListTag)
-            .performTouchInput {
-                // Click one pixel above the bottom of the list.
-                click(bottomCenter - Offset(0f, 1f))
-            }
+        rule.onNodeWithTag(ListTag).performTouchInput {
+            // Click one pixel above the bottom of the list.
+            click(bottomCenter - Offset(0f, 1f))
+        }
         keyboardHelper.waitForKeyboardVisibility(visible = true)
 
         rule.onNode(isFocused()).assertIsDisplayed()
@@ -129,21 +128,13 @@
         val itemCount = 100
         when (scrollableType) {
             ScrollableColumn -> {
-                Column(
-                    Modifier
-                        .testTag(ListTag)
-                        .verticalScroll(rememberScrollState())
-                ) {
-                    repeat(itemCount) { index ->
-                        TestTextField(index)
-                    }
+                Column(Modifier.testTag(ListTag).verticalScroll(rememberScrollState())) {
+                    repeat(itemCount) { index -> TestTextField(index) }
                 }
             }
             LazyList -> {
                 LazyColumn(Modifier.testTag(ListTag)) {
-                    items(itemCount) { index ->
-                        TestTextField(index)
-                    }
+                    items(itemCount) { index -> TestTextField(index) }
                 }
             }
         }
@@ -155,21 +146,19 @@
         CoreTextField(
             value = TextFieldValue(text = index.toString()),
             onValueChange = {},
-            modifier = Modifier
-                .fillMaxWidth()
-                .drawWithContent {
-                    drawContent()
-                    if (isFocused) {
-                        drawRect(Color.Blue, style = Stroke(2.dp.toPx()))
+            modifier =
+                Modifier.fillMaxWidth()
+                    .drawWithContent {
+                        drawContent()
+                        if (isFocused) {
+                            drawRect(Color.Blue, style = Stroke(2.dp.toPx()))
+                        }
                     }
-                }
-                .onFocusChanged { isFocused = it.isFocused }
-                .testTag(index.toString()),
+                    .onFocusChanged { isFocused = it.isFocused }
+                    .testTag(index.toString()),
             decorationBox = { inner ->
                 if (withDecorationPadding) {
-                    Box(Modifier.padding(vertical = 24.dp)) {
-                        inner()
-                    }
+                    Box(Modifier.padding(vertical = 24.dp)) { inner() }
                 } else {
                     inner()
                 }
@@ -184,31 +173,27 @@
             val activity = context.findActivityOrNull() ?: return@DisposableEffect onDispose {}
             val originalMode = activity.window.attributes.softInputMode
             activity.window.setSoftInputMode(mode)
-            onDispose {
-                activity.window.setSoftInputMode(originalMode)
-            }
+            onDispose { activity.window.setSoftInputMode(originalMode) }
         }
     }
 
     private tailrec fun Context.findActivityOrNull(): Activity? {
-        return (this as? Activity)
-            ?: (this as? ContextWrapper)?.baseContext?.findActivityOrNull()
+        return (this as? Activity) ?: (this as? ContextWrapper)?.baseContext?.findActivityOrNull()
     }
 }
 
 private fun crossProductOf(vararg values: Array<*>): List<Array<*>> =
-    crossProductOf(values.map { it.asSequence() })
-        .map { it.toList().toTypedArray() }
-        .toList()
+    crossProductOf(values.map { it.asSequence() }).map { it.toList().toTypedArray() }.toList()
 
 private fun crossProductOf(values: List<Sequence<*>>): Sequence<Sequence<*>> =
     when (values.size) {
         0 -> emptySequence()
         1 -> values[0].map { sequenceOf(it) }
-        else -> sequence {
-            for (subProduct in crossProductOf(values.subList(1, values.size)))
-                for (firstValue in values[0]) {
+        else ->
+            sequence {
+                for (subProduct in
+                    crossProductOf(values.subList(1, values.size))) for (firstValue in values[0]) {
                     yield(sequenceOf(firstValue) + subProduct)
                 }
-        }
+            }
     }
diff --git a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/CoreTextFieldSelectionOnBackTest.kt b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/CoreTextFieldSelectionOnBackTest.kt
index d7abf71..b93ab65 100644
--- a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/CoreTextFieldSelectionOnBackTest.kt
+++ b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/CoreTextFieldSelectionOnBackTest.kt
@@ -52,22 +52,13 @@
 @RunWith(AndroidJUnit4::class)
 class CoreTextFieldSelectionOnBackTest : FocusedWindowTest {
 
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
     private val Tag = "textField"
-    private val backKeyDown = KeyEvent(
-        NativeKeyEvent(
-            NativeKeyEvent.ACTION_DOWN,
-            NativeKeyEvent.KEYCODE_BACK
-        )
-    )
-    private val backKeyUp = KeyEvent(
-        NativeKeyEvent(
-            NativeKeyEvent.ACTION_UP,
-            NativeKeyEvent.KEYCODE_BACK
-        )
-    )
+    private val backKeyDown =
+        KeyEvent(NativeKeyEvent(NativeKeyEvent.ACTION_DOWN, NativeKeyEvent.KEYCODE_BACK))
+    private val backKeyUp =
+        KeyEvent(NativeKeyEvent(NativeKeyEvent.ACTION_UP, NativeKeyEvent.KEYCODE_BACK))
 
     @Test
     fun whenBackPressed_andReleased_coreTextFieldClearsSelection() {
@@ -81,8 +72,7 @@
         }
 
         val textNode = rule.onNodeWithTag(Tag)
-        val middleCharPosition =
-            textNode.fetchTextLayoutResult().getBoundingBox(2).centerLeft
+        val middleCharPosition = textNode.fetchTextLayoutResult().getBoundingBox(2).centerLeft
 
         textNode.performTouchInput { longClick(middleCharPosition) }
         rule.waitForIdle()
@@ -106,14 +96,12 @@
             BasicTextField(
                 "hello world",
                 onValueChange = {},
-                Modifier
-                    .testTag(Tag)
-                    .onKeyEvent {
-                        if (it.type == KeyEventType.KeyUp && it.key == Key.Back) {
-                            backPressCount++
-                        }
-                        false
+                Modifier.testTag(Tag).onKeyEvent {
+                    if (it.type == KeyEventType.KeyUp && it.key == Key.Back) {
+                        backPressCount++
                     }
+                    false
+                }
             )
         }
 
@@ -124,18 +112,14 @@
 
             // Hide the keyboard before pressing back, since the first back should be consumed by
             // the keyboard.
-            rule.runOnUiThread {
-                softwareKeyboardController!!.hide()
-            }
+            rule.runOnUiThread { softwareKeyboardController!!.hide() }
 
             // Press back.
             performKeyPress(backKeyDown)
             performKeyPress(backKeyUp)
 
             // Ensure back event was propagated up past the text field.
-            rule.runOnIdle {
-                assertThat(backPressCount).isEqualTo(1)
-            }
+            rule.runOnIdle { assertThat(backPressCount).isEqualTo(1) }
         }
     }
 }
diff --git a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/CoreTextFieldSoftWrapTest.kt b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/CoreTextFieldSoftWrapTest.kt
index be99b34..39f4693 100644
--- a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/CoreTextFieldSoftWrapTest.kt
+++ b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/CoreTextFieldSoftWrapTest.kt
@@ -41,8 +41,7 @@
 
     private val fontFamily = TEST_FONT_FAMILY
 
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
     @Test
     fun textField_softWrapFalse_returnsSizeForMaxIntrinsicWidth() {
@@ -63,8 +62,8 @@
                     textStyle = textStyle,
                     softWrap = false,
                     onTextLayout = { textLayout = it },
-                    modifier = Modifier.requiredWidth(composableWidth)
-                        .onGloballyPositioned {
+                    modifier =
+                        Modifier.requiredWidth(composableWidth).onGloballyPositioned {
                             width = it.size.width
                         }
                 )
@@ -100,8 +99,8 @@
                     textStyle = textStyle,
                     softWrap = true,
                     onTextLayout = { textLayout = it },
-                    modifier = Modifier.requiredWidth(composableWidth)
-                        .onGloballyPositioned {
+                    modifier =
+                        Modifier.requiredWidth(composableWidth).onGloballyPositioned {
                             width = it.size.width
                         }
                 )
diff --git a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/CoreTextInlineContentTest.kt b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/CoreTextInlineContentTest.kt
index aa22933..1b477e9 100644
--- a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/CoreTextInlineContentTest.kt
+++ b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/CoreTextInlineContentTest.kt
@@ -53,8 +53,7 @@
 @RunWith(AndroidJUnit4::class)
 class CoreTextInlineContentTest {
 
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
     private val fontSize = 10
 
@@ -67,25 +66,26 @@
         var size by mutableStateOf(IntSize(50, 50))
 
         rule.setContent {
-            val inlineTextContent = InlineTextContent(
-                placeholder = Placeholder(
-                    size.width.sp,
-                    size.height.sp,
-                    PlaceholderVerticalAlign.AboveBaseline
-                )
-            ) {
-                Box(modifier = Modifier.fillMaxSize().onSizeChanged(onSizeChanged))
-            }
+            val inlineTextContent =
+                InlineTextContent(
+                    placeholder =
+                        Placeholder(
+                            size.width.sp,
+                            size.height.sp,
+                            PlaceholderVerticalAlign.AboveBaseline
+                        )
+                ) {
+                    Box(modifier = Modifier.fillMaxSize().onSizeChanged(onSizeChanged))
+                }
 
-            CompositionLocalProvider(
-                LocalDensity provides Density(density = 1f, fontScale = 1f)
-            ) {
+            CompositionLocalProvider(LocalDensity provides Density(density = 1f, fontScale = 1f)) {
                 BasicText(
-                    text = buildAnnotatedString {
-                        append("Hello")
-                        appendInlineContent("box")
-                        append("World")
-                    },
+                    text =
+                        buildAnnotatedString {
+                            append("Hello")
+                            appendInlineContent("box")
+                            append("World")
+                        },
                     style = TextStyle(fontSize = 100.sp),
                     inlineContent = mapOf("box" to inlineTextContent),
                     maxLines = Int.MAX_VALUE,
@@ -129,10 +129,7 @@
     fun rtlTextContent_inlineContent_placement() {
         rule.setContent {
             // RTL character, supported by sample_font
-            TestContent(
-                predicate = "\u05D1\u05D1\u05D1\u05D1\u05D1",
-                suffix = "\u05D1\u05D1\u05D1"
-            )
+            TestContent(predicate = "\u05D1\u05D1\u05D1\u05D1\u05D1", suffix = "\u05D1\u05D1\u05D1")
         }
 
         // Expected text layout; "a" is LTR, "b" is RTL"
@@ -160,10 +157,7 @@
     fun bidiText_inlineContent_placement() {
         rule.setContent {
             // RTL and LTR characters, supported by sample_font
-            TestContent(
-                predicate = "\u05D1\u05D1\u05D1\u0061\u0061",
-                suffix = "\u0061\u0061\u0061"
-            )
+            TestContent(predicate = "\u05D1\u05D1\u05D1\u0061\u0061", suffix = "\u0061\u0061\u0061")
         }
 
         // Expected text layout; "a" is LTR, "b" is RTL"
@@ -175,10 +169,7 @@
     fun bidiText_2_inlineContent_placement() {
         rule.setContent {
             // RTL and LTR characters, supported by sample_font
-            TestContent(
-                predicate = "\u0061\u0061\u0061\u05D1\u05D1",
-                suffix = "\u05D1\u05D1\u05D1"
-            )
+            TestContent(predicate = "\u0061\u0061\u0061\u05D1\u05D1", suffix = "\u05D1\u05D1\u05D1")
         }
 
         // Expected text layout; "a" is LTR, "b" is RTL"
@@ -192,25 +183,26 @@
         suffix: String,
         textStyle: TextStyle = this.textStyle
     ) {
-        CompositionLocalProvider(
-            LocalDensity provides Density(density = 1f, fontScale = 1f)
-        ) {
-            val inlineTextContent = InlineTextContent(
-                placeholder = Placeholder(
-                    fontSize.sp,
-                    fontSize.sp,
-                    PlaceholderVerticalAlign.AboveBaseline
-                )
-            ) {
-                Box(modifier = Modifier.fillMaxSize().testTag("box"))
-            }
+        CompositionLocalProvider(LocalDensity provides Density(density = 1f, fontScale = 1f)) {
+            val inlineTextContent =
+                InlineTextContent(
+                    placeholder =
+                        Placeholder(
+                            fontSize.sp,
+                            fontSize.sp,
+                            PlaceholderVerticalAlign.AboveBaseline
+                        )
+                ) {
+                    Box(modifier = Modifier.fillMaxSize().testTag("box"))
+                }
 
             BasicText(
-                text = buildAnnotatedString {
-                    append(predicate)
-                    appendInlineContent("box")
-                    append(suffix)
-                },
+                text =
+                    buildAnnotatedString {
+                        append(predicate)
+                        appendInlineContent("box")
+                        append(suffix)
+                    },
                 modifier = Modifier.testTag("text"),
                 style = textStyle,
                 inlineContent = mapOf("box" to inlineTextContent),
@@ -220,14 +212,14 @@
     }
 
     private fun expectInlineContentPosition(left: Int, right: Int) {
-        val (boxLeft, boxRight) = with(
-            rule.onNodeWithTag("box", useUnmergedTree = true).fetchSemanticsNode()
-        ) {
-            Pair(positionInRoot.x, positionInRoot.x + size.width)
-        }
-        val (textLeft, textRight) = with(rule.onNodeWithTag("text").fetchSemanticsNode()) {
-            Pair(positionInRoot.x, positionInRoot.x + size.width)
-        }
+        val (boxLeft, boxRight) =
+            with(rule.onNodeWithTag("box", useUnmergedTree = true).fetchSemanticsNode()) {
+                Pair(positionInRoot.x, positionInRoot.x + size.width)
+            }
+        val (textLeft, textRight) =
+            with(rule.onNodeWithTag("text").fetchSemanticsNode()) {
+                Pair(positionInRoot.x, positionInRoot.x + size.width)
+            }
 
         rule.waitForIdle()
 
diff --git a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/DeadKeyCombinerTest.kt b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/DeadKeyCombinerTest.kt
index c690db0..7f2d8a5 100644
--- a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/DeadKeyCombinerTest.kt
+++ b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/DeadKeyCombinerTest.kt
@@ -28,16 +28,17 @@
 @RunWith(JUnit4::class)
 class DeadKeyCombinerTest {
 
-    private val keyEventUmlaut = KeyEvent(
-        NativeKeyEvent(
-            0,
-            0,
-            NativeKeyEvent.ACTION_DOWN,
-            NativeKeyEvent.KEYCODE_U,
-            0,
-            NativeKeyEvent.META_ALT_ON
+    private val keyEventUmlaut =
+        KeyEvent(
+            NativeKeyEvent(
+                0,
+                0,
+                NativeKeyEvent.ACTION_DOWN,
+                NativeKeyEvent.KEYCODE_U,
+                0,
+                NativeKeyEvent.META_ALT_ON
+            )
         )
-    )
 
     private val keyEventSpace =
         KeyEvent(NativeKeyEvent(NativeKeyEvent.ACTION_DOWN, NativeKeyEvent.KEYCODE_SPACE))
diff --git a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/DefaultKeyboardActionsTest.kt b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/DefaultKeyboardActionsTest.kt
index ca78f4d..c8274ef 100644
--- a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/DefaultKeyboardActionsTest.kt
+++ b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/DefaultKeyboardActionsTest.kt
@@ -52,8 +52,7 @@
 @LargeTest
 @RunWith(Parameterized::class)
 class DefaultKeyboardActionsTest(param: Param) {
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
     private val inputMethodInterceptor = InputMethodInterceptor(rule)
 
@@ -68,10 +67,16 @@
     companion object {
         @JvmStatic
         @Parameterized.Parameters(name = "ImeAction = {0}")
-        fun initParameters() = listOf(
-            // OS never shows a Default or None ImeAction.
-            Param(Go), Param(Search), Param(Send), Param(Previous), Param(Next), Param(Done)
-        )
+        fun initParameters() =
+            listOf(
+                // OS never shows a Default or None ImeAction.
+                Param(Go),
+                Param(Search),
+                Param(Send),
+                Param(Previous),
+                Param(Next),
+                Param(Done)
+            )
     }
 
     @Test
@@ -85,33 +90,36 @@
         val keyboardController = TestSoftwareKeyboardController(rule)
 
         inputMethodInterceptor.setContent {
-            CompositionLocalProvider(
-                LocalSoftwareKeyboardController provides keyboardController
-            ) {
+            CompositionLocalProvider(LocalSoftwareKeyboardController provides keyboardController) {
                 Column {
                     CoreTextField(
                         value = value1,
                         onValueChange = {},
-                        modifier = Modifier
-                            .focusRequester(textField1)
-                            .onFocusChanged { focusState1 = it.isFocused }
+                        modifier =
+                            Modifier.focusRequester(textField1).onFocusChanged {
+                                focusState1 = it.isFocused
+                            }
                     )
                     CoreTextField(
                         value = value2,
                         onValueChange = {},
-                        modifier = Modifier
-                            .testTag(initialTextField)
-                            .focusRequester(textField2)
-                            .focusProperties { previous = textField1; next = textField3 }
-                            .onFocusChanged { focusState2 = it.isFocused },
+                        modifier =
+                            Modifier.testTag(initialTextField)
+                                .focusRequester(textField2)
+                                .focusProperties {
+                                    previous = textField1
+                                    next = textField3
+                                }
+                                .onFocusChanged { focusState2 = it.isFocused },
                         imeOptions = ImeOptions(imeAction = imeAction)
                     )
                     CoreTextField(
                         value = value3,
                         onValueChange = {},
-                        modifier = Modifier
-                            .focusRequester(textField3)
-                            .onFocusChanged { focusState3 = it.isFocused }
+                        modifier =
+                            Modifier.focusRequester(textField3).onFocusChanged {
+                                focusState3 = it.isFocused
+                            }
                     )
                 }
             }
@@ -168,41 +176,45 @@
         val keyboardController = TestSoftwareKeyboardController(rule)
 
         inputMethodInterceptor.setContent {
-            CompositionLocalProvider(
-                LocalSoftwareKeyboardController provides keyboardController
-            ) {
+            CompositionLocalProvider(LocalSoftwareKeyboardController provides keyboardController) {
                 Column {
                     CoreTextField(
                         value = value1,
                         onValueChange = {},
-                        modifier = Modifier
-                            .focusRequester(textField1)
-                            .onFocusChanged { focusState1 = it.isFocused }
+                        modifier =
+                            Modifier.focusRequester(textField1).onFocusChanged {
+                                focusState1 = it.isFocused
+                            }
                     )
                     CoreTextField(
                         value = value2,
                         onValueChange = {},
-                        modifier = Modifier
-                            .testTag(initialTextField)
-                            .focusRequester(textField2)
-                            .focusProperties { previous = textField1; next = textField3 }
-                            .onFocusChanged { focusState2 = it.isFocused },
+                        modifier =
+                            Modifier.testTag(initialTextField)
+                                .focusRequester(textField2)
+                                .focusProperties {
+                                    previous = textField1
+                                    next = textField3
+                                }
+                                .onFocusChanged { focusState2 = it.isFocused },
                         imeOptions = ImeOptions(imeAction = imeAction),
-                        keyboardActions = KeyboardActions(
-                            onDone = { defaultKeyboardAction(Done) },
-                            onGo = { defaultKeyboardAction(Go) },
-                            onNext = { defaultKeyboardAction(Next) },
-                            onPrevious = { defaultKeyboardAction(Previous) },
-                            onSearch = { defaultKeyboardAction(Search) },
-                            onSend = { defaultKeyboardAction(Send) },
-                        )
+                        keyboardActions =
+                            KeyboardActions(
+                                onDone = { defaultKeyboardAction(Done) },
+                                onGo = { defaultKeyboardAction(Go) },
+                                onNext = { defaultKeyboardAction(Next) },
+                                onPrevious = { defaultKeyboardAction(Previous) },
+                                onSearch = { defaultKeyboardAction(Search) },
+                                onSend = { defaultKeyboardAction(Send) },
+                            )
                     )
                     CoreTextField(
                         value = value3,
                         onValueChange = {},
-                        modifier = Modifier
-                            .focusRequester(textField3)
-                            .onFocusChanged { focusState3 = it.isFocused }
+                        modifier =
+                            Modifier.focusRequester(textField3).onFocusChanged {
+                                focusState3 = it.isFocused
+                            }
                     )
                 }
             }
@@ -262,27 +274,29 @@
                 CoreTextField(
                     value = value1,
                     onValueChange = {},
-                    modifier = Modifier
-                        .testTag(initialTextField)
-                        .focusRequester(textField1)
-                        .focusProperties { next = textField2 }
-                        .onFocusChanged { focusState1 = it.isFocused },
+                    modifier =
+                        Modifier.testTag(initialTextField)
+                            .focusRequester(textField1)
+                            .focusProperties { next = textField2 }
+                            .onFocusChanged { focusState1 = it.isFocused },
                     imeOptions = ImeOptions(imeAction = imeAction),
-                    keyboardActions = KeyboardActions(
-                        onDone = { defaultKeyboardAction(Next) },
-                        onGo = { defaultKeyboardAction(Next) },
-                        onNext = { defaultKeyboardAction(Next) },
-                        onPrevious = { defaultKeyboardAction(Next) },
-                        onSearch = { defaultKeyboardAction(Next) },
-                        onSend = { defaultKeyboardAction(Next) },
-                    )
+                    keyboardActions =
+                        KeyboardActions(
+                            onDone = { defaultKeyboardAction(Next) },
+                            onGo = { defaultKeyboardAction(Next) },
+                            onNext = { defaultKeyboardAction(Next) },
+                            onPrevious = { defaultKeyboardAction(Next) },
+                            onSearch = { defaultKeyboardAction(Next) },
+                            onSend = { defaultKeyboardAction(Next) },
+                        )
                 )
                 CoreTextField(
                     value = value2,
                     onValueChange = {},
-                    modifier = Modifier
-                        .focusRequester(textField2)
-                        .onFocusChanged { focusState2 = it.isFocused }
+                    modifier =
+                        Modifier.focusRequester(textField2).onFocusChanged {
+                            focusState2 = it.isFocused
+                        }
                 )
             }
         }
diff --git a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/DetectDownAndDragGesturesWithObserverInitializationTest.kt b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/DetectDownAndDragGesturesWithObserverInitializationTest.kt
index b3f45a0..878d371 100644
--- a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/DetectDownAndDragGesturesWithObserverInitializationTest.kt
+++ b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/DetectDownAndDragGesturesWithObserverInitializationTest.kt
@@ -50,13 +50,11 @@
 
     /**
      * The regular test dispatcher will already run the [kotlinx.coroutines.launch]es as if they
-     * were [kotlinx.coroutines.CoroutineStart.UNDISPATCHED], so overwrite it with a standard
-     * single parallelism dispatcher. Without this, a regression on this functionality would
-     * not be caught in this test.
+     * were [kotlinx.coroutines.CoroutineStart.UNDISPATCHED], so overwrite it with a standard single
+     * parallelism dispatcher. Without this, a regression on this functionality would not be caught
+     * in this test.
      */
-    @OptIn(ExperimentalTestApi::class)
-    @get:Rule
-    val rule = createComposeRule(Dispatchers.Main)
+    @OptIn(ExperimentalTestApi::class) @get:Rule val rule = createComposeRule(Dispatchers.Main)
 
     private val testTag = "testTag"
     private val observer = RecordingTextDragObserver()
@@ -66,21 +64,22 @@
     fun setup() {
         rule.setContent {
             CompositionLocalProvider(
-                LocalViewConfiguration provides TestViewConfiguration(
-                    minimumTouchTargetSize = DpSize.Zero,
-                    touchSlop = Float.MIN_VALUE,
-                )
+                LocalViewConfiguration provides
+                    TestViewConfiguration(
+                        minimumTouchTargetSize = DpSize.Zero,
+                        touchSlop = Float.MIN_VALUE,
+                    )
             ) {
                 Box(modifier = Modifier.fillMaxSize()) {
                     Box(
-                        modifier = Modifier
-                            .size(10.dp, 10.dp)
-                            .background(Color.Black)
-                            .align(Alignment.Center)
-                            .pointerInput(Unit) {
-                                detectDownAndDragGesturesWithObserver(observer)
-                            }
-                            .testTag(testTag)
+                        modifier =
+                            Modifier.size(10.dp, 10.dp)
+                                .background(Color.Black)
+                                .align(Alignment.Center)
+                                .pointerInput(Unit) {
+                                    detectDownAndDragGesturesWithObserver(observer)
+                                }
+                                .testTag(testTag)
                     )
                 }
             }
@@ -98,17 +97,20 @@
 
         rule.waitForIdle()
 
-        assertThat(records)
-            .containsExactly("down", "start", "drag", "drag", "stop", "up")
-            .inOrder()
+        assertThat(records).containsExactly("down", "start", "drag", "drag", "stop", "up").inOrder()
     }
 
     private inner class RecordingTextDragObserver : TextDragObserver {
         override fun onDown(point: Offset) = add("down")
+
         override fun onUp() = add("up")
+
         override fun onStart(startPoint: Offset) = add("start")
+
         override fun onDrag(delta: Offset) = add("drag")
+
         override fun onStop() = add("stop")
+
         override fun onCancel() = add("cancel")
 
         private fun add(str: String) {
diff --git a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/DrawPhaseAttributesToggleTest.kt b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/DrawPhaseAttributesToggleTest.kt
index 157a7cb..f8d50d5 100644
--- a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/DrawPhaseAttributesToggleTest.kt
+++ b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/DrawPhaseAttributesToggleTest.kt
@@ -60,126 +60,116 @@
     companion object {
         @Parameterized.Parameters(name = "{0}")
         @JvmStatic
-        fun parameters() = arrayOf(
-            Config(
-                "color unspecified/color/unspecified",
-                initializeStyle = { it.copy(color = Color.Unspecified) },
-                updateStyle = { it.copy(color = Color.Blue) },
-            ),
-            Config(
-                "color colorA/colorB/colorA",
-                initializeStyle = { it.copy(color = Color.Black) },
-                updateStyle = { it.copy(color = Color.Blue) },
-            ),
-            Config(
-                "color colorA/brushA/colorA",
-                initializeStyle = {
-                    it.copy(color = Color.Red)
-                },
-                updateStyle = {
-                    it.copy(brush = Brush.verticalGradient(listOf(Color.Blue, Color.Magenta)))
-                }
-            ),
-            Config(
-                "brush brushA/brushB/brushA",
-                initializeStyle = {
-                    it.copy(brush = Brush.horizontalGradient(listOf(Color.Black, Color.Blue)))
-                },
-                updateStyle = {
-                    it.copy(brush = Brush.verticalGradient(listOf(Color.Red, Color.Blue)))
-                }
-            ),
-            Config(
-                "brush brushA/colorA/brushA",
-                initializeStyle = {
-                    it.copy(brush = Brush.horizontalGradient(listOf(Color.Black, Color.Blue)))
-                },
-                updateStyle = {
-                    it.copy(color = Color.Red)
-                }
-            ),
-            Config(
-                "alpha",
-                initializeStyle = {
-                    it.copy(
-                        alpha = 1f,
-                        brush = Brush.verticalGradient(0f to Color.Blue, 1f to Color.Magenta)
-                    )
-                },
-                updateStyle = { it.copy(alpha = 0.5f, brush = it.brush) },
-            ),
-            Config(
-                "textDecoration none/lineThrough/none",
-                initializeStyle = { it.copy(textDecoration = TextDecoration.None) },
-                updateStyle = { it.copy(textDecoration = TextDecoration.LineThrough) }
-            ),
-            Config(
-                "textDecoration lineThrough/none/lineThrough",
-                initializeStyle = { it.copy(textDecoration = TextDecoration.LineThrough) },
-                updateStyle = { it.copy(textDecoration = TextDecoration.None) }
-            ),
-            Config(
-                "textDecoration null/lineThrough/null",
-                initializeStyle = { it.copy(textDecoration = null) },
-                updateStyle = { it.copy(textDecoration = TextDecoration.LineThrough) }
-            ),
-            Config(
-                "shadow null/shadow/null",
-                initializeStyle = { it.copy(shadow = null) },
-                updateStyle = { it.copy(shadow = Shadow(Color.Black, blurRadius = 4f)) }
-            ),
-            Config(
-                "shadow shadowA/shadowB/shadowA",
-                initializeStyle = { it.copy(shadow = Shadow(Color.Black, blurRadius = 1f)) },
-                updateStyle = { it.copy(shadow = Shadow(Color.Black, blurRadius = 4f)) }
-            ),
-            Config(
-                "shadow shadowA/null/shadowA",
-                initializeStyle = { it.copy(shadow = Shadow(Color.Black, blurRadius = 1f)) },
-                updateStyle = { it.copy(shadow = null) }
-            ),
-            Config(
-                "drawStyle null/drawStyle/null",
-                initializeStyle = { it.copy(drawStyle = null) },
-                updateStyle = { it.copy(drawStyle = Stroke(width = 2f)) }
-            ),
-            Config(
-                "drawStyle drawStyleA/drawStyleB/drawStyleA",
-                initializeStyle = { it.copy(drawStyle = Stroke(width = 1f)) },
-                updateStyle = { it.copy(drawStyle = Stroke(width = 2f)) }
-            ),
-            Config(
-                "drawStyle drawStyle/null/drawStyle",
-                initializeStyle = { it.copy(drawStyle = Stroke(width = 1f)) },
-                updateStyle = { it.copy(drawStyle = null) }
-            ),
-            Config(
-                "drawStyle stroke/fill/stroke",
-                initializeStyle = { it.copy(drawStyle = Stroke(width = 1f)) },
-                updateStyle = { it.copy(drawStyle = Fill) }
+        fun parameters() =
+            arrayOf(
+                Config(
+                    "color unspecified/color/unspecified",
+                    initializeStyle = { it.copy(color = Color.Unspecified) },
+                    updateStyle = { it.copy(color = Color.Blue) },
+                ),
+                Config(
+                    "color colorA/colorB/colorA",
+                    initializeStyle = { it.copy(color = Color.Black) },
+                    updateStyle = { it.copy(color = Color.Blue) },
+                ),
+                Config(
+                    "color colorA/brushA/colorA",
+                    initializeStyle = { it.copy(color = Color.Red) },
+                    updateStyle = {
+                        it.copy(brush = Brush.verticalGradient(listOf(Color.Blue, Color.Magenta)))
+                    }
+                ),
+                Config(
+                    "brush brushA/brushB/brushA",
+                    initializeStyle = {
+                        it.copy(brush = Brush.horizontalGradient(listOf(Color.Black, Color.Blue)))
+                    },
+                    updateStyle = {
+                        it.copy(brush = Brush.verticalGradient(listOf(Color.Red, Color.Blue)))
+                    }
+                ),
+                Config(
+                    "brush brushA/colorA/brushA",
+                    initializeStyle = {
+                        it.copy(brush = Brush.horizontalGradient(listOf(Color.Black, Color.Blue)))
+                    },
+                    updateStyle = { it.copy(color = Color.Red) }
+                ),
+                Config(
+                    "alpha",
+                    initializeStyle = {
+                        it.copy(
+                            alpha = 1f,
+                            brush = Brush.verticalGradient(0f to Color.Blue, 1f to Color.Magenta)
+                        )
+                    },
+                    updateStyle = { it.copy(alpha = 0.5f, brush = it.brush) },
+                ),
+                Config(
+                    "textDecoration none/lineThrough/none",
+                    initializeStyle = { it.copy(textDecoration = TextDecoration.None) },
+                    updateStyle = { it.copy(textDecoration = TextDecoration.LineThrough) }
+                ),
+                Config(
+                    "textDecoration lineThrough/none/lineThrough",
+                    initializeStyle = { it.copy(textDecoration = TextDecoration.LineThrough) },
+                    updateStyle = { it.copy(textDecoration = TextDecoration.None) }
+                ),
+                Config(
+                    "textDecoration null/lineThrough/null",
+                    initializeStyle = { it.copy(textDecoration = null) },
+                    updateStyle = { it.copy(textDecoration = TextDecoration.LineThrough) }
+                ),
+                Config(
+                    "shadow null/shadow/null",
+                    initializeStyle = { it.copy(shadow = null) },
+                    updateStyle = { it.copy(shadow = Shadow(Color.Black, blurRadius = 4f)) }
+                ),
+                Config(
+                    "shadow shadowA/shadowB/shadowA",
+                    initializeStyle = { it.copy(shadow = Shadow(Color.Black, blurRadius = 1f)) },
+                    updateStyle = { it.copy(shadow = Shadow(Color.Black, blurRadius = 4f)) }
+                ),
+                Config(
+                    "shadow shadowA/null/shadowA",
+                    initializeStyle = { it.copy(shadow = Shadow(Color.Black, blurRadius = 1f)) },
+                    updateStyle = { it.copy(shadow = null) }
+                ),
+                Config(
+                    "drawStyle null/drawStyle/null",
+                    initializeStyle = { it.copy(drawStyle = null) },
+                    updateStyle = { it.copy(drawStyle = Stroke(width = 2f)) }
+                ),
+                Config(
+                    "drawStyle drawStyleA/drawStyleB/drawStyleA",
+                    initializeStyle = { it.copy(drawStyle = Stroke(width = 1f)) },
+                    updateStyle = { it.copy(drawStyle = Stroke(width = 2f)) }
+                ),
+                Config(
+                    "drawStyle drawStyle/null/drawStyle",
+                    initializeStyle = { it.copy(drawStyle = Stroke(width = 1f)) },
+                    updateStyle = { it.copy(drawStyle = null) }
+                ),
+                Config(
+                    "drawStyle stroke/fill/stroke",
+                    initializeStyle = { it.copy(drawStyle = Stroke(width = 1f)) },
+                    updateStyle = { it.copy(drawStyle = Fill) }
+                )
             )
-        )
     }
 
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
     @Test
     fun basicText() {
-        var style by mutableStateOf(
-            TextStyle(
-                color = Color.Black,
-                textDecoration = null,
-                shadow = null
-            ).let(config.initializeStyle)
-        )
+        var style by
+            mutableStateOf(
+                TextStyle(color = Color.Black, textDecoration = null, shadow = null)
+                    .let(config.initializeStyle)
+            )
 
         rule.setContent {
-            BasicText(
-                "TextPainter",
-                style = style,
-                modifier = Modifier.testTag(textTag)
-            )
+            BasicText("TextPainter", style = style, modifier = Modifier.testTag(textTag))
         }
 
         rule.waitForIdle()
@@ -202,13 +192,11 @@
 
     @Test
     fun basicText_annotatedString() {
-        var style by mutableStateOf(
-            TextStyle(
-                color = Color.Black,
-                textDecoration = null,
-                shadow = null
-            ).let(config.initializeStyle)
-        )
+        var style by
+            mutableStateOf(
+                TextStyle(color = Color.Black, textDecoration = null, shadow = null)
+                    .let(config.initializeStyle)
+            )
 
         rule.setContent {
             BasicText(
diff --git a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/FocusedWindowTest.kt b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/FocusedWindowTest.kt
index 90e5276..fc5baae 100644
--- a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/FocusedWindowTest.kt
+++ b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/FocusedWindowTest.kt
@@ -30,12 +30,11 @@
  * calls replaced with "rule.setContent".
  */
 interface FocusedWindowTest {
-    fun ComposeContentTestRule.setTextFieldTestContent(
-        content: @Composable () -> Unit
-    ) {
-        val focusedWindowInfo = object : WindowInfo {
-            override val isWindowFocused = true
-        }
+    fun ComposeContentTestRule.setTextFieldTestContent(content: @Composable () -> Unit) {
+        val focusedWindowInfo =
+            object : WindowInfo {
+                override val isWindowFocused = true
+            }
         this.setContent {
             CompositionLocalProvider(LocalWindowInfo provides focusedWindowInfo, content)
         }
diff --git a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/FontScalingScreenshotTest.kt b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/FontScalingScreenshotTest.kt
index f83cf84..01ddcd8 100644
--- a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/FontScalingScreenshotTest.kt
+++ b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/FontScalingScreenshotTest.kt
@@ -57,11 +57,9 @@
 @RunWith(AndroidJUnit4::class)
 @SdkSuppress(minSdkVersion = Build.VERSION_CODES.Q)
 class FontScalingScreenshotTest {
-    @get:Rule
-    val rule = createAndroidComposeRule<ComponentActivity>()
+    @get:Rule val rule = createAndroidComposeRule<ComponentActivity>()
 
-    @get:Rule
-    val screenshotRule = AndroidXScreenshotTestRule(GOLDEN_UI)
+    @get:Rule val screenshotRule = AndroidXScreenshotTestRule(GOLDEN_UI)
 
     private val containerTag = "container"
 
@@ -75,10 +73,9 @@
         AndroidFontScaleHelper.setSystemFontScale(1f, rule.activityRule.scenario)
         rule.waitForIdle()
 
-        rule.setContent {
-            TestLayout(lineHeight = 28.sp)
-        }
-        rule.onNodeWithTag(containerTag)
+        rule.setContent { TestLayout(lineHeight = 28.sp) }
+        rule
+            .onNodeWithTag(containerTag)
             .captureToImage()
             .assertAgainstGolden(screenshotRule, "fontScaling1x_lineHeightDoubleSp")
     }
@@ -88,10 +85,9 @@
         AndroidFontScaleHelper.setSystemFontScale(2f, rule.activityRule.scenario)
         rule.waitForIdle()
 
-        rule.setContent {
-            TestLayout(lineHeight = 28.sp)
-        }
-        rule.onNodeWithTag(containerTag)
+        rule.setContent { TestLayout(lineHeight = 28.sp) }
+        rule
+            .onNodeWithTag(containerTag)
             .captureToImage()
             .assertAgainstGolden(screenshotRule, "fontScaling2x_lineHeightDoubleSp")
     }
@@ -107,7 +103,8 @@
                 lineHeightStyle = LineHeightStyle(Alignment.Bottom, Trim.Both)
             )
         }
-        rule.onNodeWithTag(containerTag)
+        rule
+            .onNodeWithTag(containerTag)
             .captureToImage()
             .assertAgainstGolden(screenshotRule, "fontScaling1x_lineHeightStyleDoubleSp")
     }
@@ -123,7 +120,8 @@
                 lineHeightStyle = LineHeightStyle(Alignment.Bottom, Trim.Both)
             )
         }
-        rule.onNodeWithTag(containerTag)
+        rule
+            .onNodeWithTag(containerTag)
             .captureToImage()
             .assertAgainstGolden(screenshotRule, "fontScaling2x_lineHeightStyleDoubleSp")
     }
@@ -133,10 +131,9 @@
         AndroidFontScaleHelper.setSystemFontScale(1f, rule.activityRule.scenario)
         rule.waitForIdle()
 
-        rule.setContent {
-            TestLayout(lineHeight = 2.em)
-        }
-        rule.onNodeWithTag(containerTag)
+        rule.setContent { TestLayout(lineHeight = 2.em) }
+        rule
+            .onNodeWithTag(containerTag)
             .captureToImage()
             .assertAgainstGolden(screenshotRule, "fontScaling1x_lineHeightDoubleEm")
     }
@@ -146,10 +143,9 @@
         AndroidFontScaleHelper.setSystemFontScale(2f, rule.activityRule.scenario)
         rule.waitForIdle()
 
-        rule.setContent {
-            TestLayout(lineHeight = 2.em)
-        }
-        rule.onNodeWithTag(containerTag)
+        rule.setContent { TestLayout(lineHeight = 2.em) }
+        rule
+            .onNodeWithTag(containerTag)
             .captureToImage()
             .assertAgainstGolden(screenshotRule, "fontScaling2x_lineHeightDoubleEm")
     }
@@ -159,10 +155,9 @@
         AndroidFontScaleHelper.setSystemFontScale(1f, rule.activityRule.scenario)
         rule.waitForIdle()
 
-        rule.setContent {
-            TestDrawTextLayout()
-        }
-        rule.onNodeWithTag(containerTag)
+        rule.setContent { TestDrawTextLayout() }
+        rule
+            .onNodeWithTag(containerTag)
             .captureToImage()
             .assertAgainstGolden(screenshotRule, "fontScaling1x_drawText")
     }
@@ -172,10 +167,9 @@
         AndroidFontScaleHelper.setSystemFontScale(2f, rule.activityRule.scenario)
         rule.waitForIdle()
 
-        rule.setContent {
-            TestDrawTextLayout()
-        }
-        rule.onNodeWithTag(containerTag)
+        rule.setContent { TestDrawTextLayout() }
+        rule
+            .onNodeWithTag(containerTag)
             .captureToImage()
             .assertAgainstGolden(screenshotRule, "fontScaling2x_drawText")
     }
@@ -189,35 +183,30 @@
             modifier = Modifier.testTag(containerTag),
         ) {
             BasicText(
-                text = buildAnnotatedString {
-                    append("Hello ")
-                    pushStyle(SpanStyle(
-                        fontSize = 28.sp,
-                        fontWeight = FontWeight.Bold
-                    ))
-                    append("Accessibility")
-                    pop()
-                },
-                style = TextStyle(
-                    fontSize = 36.sp,
-                    fontStyle = FontStyle.Italic,
-                    fontFamily = FontFamily.Monospace
-                )
+                text =
+                    buildAnnotatedString {
+                        append("Hello ")
+                        pushStyle(SpanStyle(fontSize = 28.sp, fontWeight = FontWeight.Bold))
+                        append("Accessibility")
+                        pop()
+                    },
+                style =
+                    TextStyle(
+                        fontSize = 36.sp,
+                        fontStyle = FontStyle.Italic,
+                        fontFamily = FontFamily.Monospace
+                    )
             )
-            BasicText(
-                text = "Here's a subtitle",
-                style = TextStyle(
-                    fontSize = 20.sp
-                )
-            )
+            BasicText(text = "Here's a subtitle", style = TextStyle(fontSize = 20.sp))
             BasicText(
                 text = sampleText,
-                style = TextStyle(
-                    fontSize = 14.sp,
-                    fontStyle = FontStyle.Italic,
-                    lineHeight = lineHeight,
-                    lineHeightStyle = lineHeightStyle
-                )
+                style =
+                    TextStyle(
+                        fontSize = 14.sp,
+                        fontStyle = FontStyle.Italic,
+                        lineHeight = lineHeight,
+                        lineHeightStyle = lineHeightStyle
+                    )
             )
         }
     }
@@ -230,20 +219,18 @@
             modifier = Modifier.testTag(containerTag),
         ) {
             Canvas(Modifier.fillMaxSize()) {
-                 drawText(
-                     textMeasurer = textMeasurer,
-                     style = TextStyle(
-                        fontSize = 14.sp,
-                        lineHeight = 28.sp
-                     ),
-                     text = sampleText
+                drawText(
+                    textMeasurer = textMeasurer,
+                    style = TextStyle(fontSize = 14.sp, lineHeight = 28.sp),
+                    text = sampleText
                 )
             }
         }
     }
 
     companion object {
-        private val sampleText = """
+        private val sampleText =
+            """
 Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore
 et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut
 aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse
@@ -259,6 +246,7 @@
 ad minima veniam, quis nostrum exercitationem ullam corporis suscipit laboriosam, nisi ut aliquid
 ex ea commodi consequatur? Quis autem vel eum iure reprehenderit qui in ea voluptate velit esse
 quam nihil molestiae consequatur, vel illum qui dolorem eum fugiat quo voluptas nulla pariatur?
-    """.trimIndent()
+    """
+                .trimIndent()
     }
 }
diff --git a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/HandwritingTestUtils.kt b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/HandwritingTestUtils.kt
index 5888282..831beb3 100644
--- a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/HandwritingTestUtils.kt
+++ b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/HandwritingTestUtils.kt
@@ -37,9 +37,8 @@
 // We don't have StylusInjectionScope at the moment. This is a simplified implementation for
 // the basic use cases in this test. It only supports single stylus pointer, and the pointerId
 // is totally ignored.
-internal class HandwritingTestStylusInjectScope(
-    semanticsNode: SemanticsNode
-) : TouchInjectionScope, Density by semanticsNode.layoutInfo.density {
+internal class HandwritingTestStylusInjectScope(semanticsNode: SemanticsNode) :
+    TouchInjectionScope, Density by semanticsNode.layoutInfo.density {
     private val root = semanticsNode.root as ViewRootForTest
     private val downTime: Long = System.currentTimeMillis()
 
@@ -50,8 +49,7 @@
     override val visibleSize: IntSize =
         IntSize(boundsInRoot.width.roundToInt(), boundsInRoot.height.roundToInt())
 
-    override val viewConfiguration: ViewConfiguration =
-        semanticsNode.layoutInfo.viewConfiguration
+    override val viewConfiguration: ViewConfiguration = semanticsNode.layoutInfo.viewConfiguration
 
     private fun localToRoot(position: Offset): Offset {
         return position + boundsInRoot.topLeft
@@ -101,46 +99,49 @@
     }
 
     private fun sendTouchEvent(action: Int) {
-        val motionEvent = MotionEvent.obtain(
-            /* downTime = */ downTime,
-            /* eventTime = */ currentTime,
-            /* action = */ action,
-            /* pointerCount = */ 1,
-            /* pointerProperties = */ arrayOf(
-                MotionEvent.PointerProperties().apply {
-                    id = 0
-                    toolType = MotionEvent.TOOL_TYPE_STYLUS
-                }
-            ),
-            /* pointerCoords = */ arrayOf(
-                MotionEvent.PointerCoords().apply {
-                    val startOffset = lastPosition
-
-                    // Allows for non-valid numbers/Offsets to be passed along to Compose to
-                    // test if it handles them properly (versus breaking here and we not knowing
-                    // if Compose properly handles these values).
-                    x = if (startOffset.isValid()) {
-                        startOffset.x
-                    } else {
-                        Float.NaN
+        val motionEvent =
+            MotionEvent.obtain(
+                /* downTime = */ downTime,
+                /* eventTime = */ currentTime,
+                /* action = */ action,
+                /* pointerCount = */ 1,
+                /* pointerProperties = */ arrayOf(
+                    MotionEvent.PointerProperties().apply {
+                        id = 0
+                        toolType = MotionEvent.TOOL_TYPE_STYLUS
                     }
+                ),
+                /* pointerCoords = */ arrayOf(
+                    MotionEvent.PointerCoords().apply {
+                        val startOffset = lastPosition
 
-                    y = if (startOffset.isValid()) {
-                        startOffset.y
-                    } else {
-                        Float.NaN
+                        // Allows for non-valid numbers/Offsets to be passed along to Compose to
+                        // test if it handles them properly (versus breaking here and we not knowing
+                        // if Compose properly handles these values).
+                        x =
+                            if (startOffset.isValid()) {
+                                startOffset.x
+                            } else {
+                                Float.NaN
+                            }
+
+                        y =
+                            if (startOffset.isValid()) {
+                                startOffset.y
+                            } else {
+                                Float.NaN
+                            }
                     }
-                }
-            ),
-            /* metaState = */ 0,
-            /* buttonState = */ 0,
-            /* xPrecision = */ 1f,
-            /* yPrecision = */ 1f,
-            /* deviceId = */ 0,
-            /* edgeFlags = */ 0,
-            /* source = */ InputDeviceCompat.SOURCE_TOUCHSCREEN,
-            /* flags = */ 0
-        )
+                ),
+                /* metaState = */ 0,
+                /* buttonState = */ 0,
+                /* xPrecision = */ 1f,
+                /* yPrecision = */ 1f,
+                /* deviceId = */ 0,
+                /* edgeFlags = */ 0,
+                /* source = */ InputDeviceCompat.SOURCE_TOUCHSCREEN,
+                /* flags = */ 0
+            )
 
         InstrumentationRegistry.getInstrumentation().runOnMainSync {
             root.view.dispatchTouchEvent(motionEvent)
@@ -179,10 +180,7 @@
         val startPosition = visibleSize.center.toOffset()
         down(visibleSize.center.toOffset())
         val position = startPosition + Offset(viewConfiguration.handwritingSlop * 2, 0f)
-        moveTo(
-            position = position,
-            delayMillis = viewConfiguration.longPressTimeoutMillis + 1
-        )
+        moveTo(position = position, delayMillis = viewConfiguration.longPressTimeoutMillis + 1)
         up()
     }
 }
@@ -190,8 +188,7 @@
 private fun SemanticsNodeInteraction.performStylusInput(
     block: TouchInjectionScope.() -> Unit
 ): SemanticsNodeInteraction {
-    @OptIn(ExperimentalTestApi::class)
-    invokeGlobalAssertions()
+    @OptIn(ExperimentalTestApi::class) invokeGlobalAssertions()
     val node = fetchSemanticsNode("Failed to inject stylus input.")
     val stylusInjectionScope = HandwritingTestStylusInjectScope(node)
     block.invoke(stylusInjectionScope)
diff --git a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/KeyEventHelpersTest.kt b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/KeyEventHelpersTest.kt
index 3b9dcce..eb847f1 100644
--- a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/KeyEventHelpersTest.kt
+++ b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/KeyEventHelpersTest.kt
@@ -29,34 +29,21 @@
 class KeyEventHelpersTest {
     @Test
     fun whenBackAndUp_cancels() {
-        val event = KeyEvent(
-            NativeKeyEvent(
-                NativeKeyEvent.ACTION_UP,
-                NativeKeyEvent.KEYCODE_BACK
-            )
-        )
+        val event = KeyEvent(NativeKeyEvent(NativeKeyEvent.ACTION_UP, NativeKeyEvent.KEYCODE_BACK))
         assertThat(event.cancelsTextSelection()).isTrue()
     }
 
     @Test
     fun whenBackAndDown_ignores() {
-        val event = KeyEvent(
-            NativeKeyEvent(
-                NativeKeyEvent.ACTION_DOWN,
-                NativeKeyEvent.KEYCODE_BACK
-            )
-        )
+        val event =
+            KeyEvent(NativeKeyEvent(NativeKeyEvent.ACTION_DOWN, NativeKeyEvent.KEYCODE_BACK))
         assertThat(event.cancelsTextSelection()).isFalse()
     }
 
     @Test
     fun whenNotBack_ignores() {
-        val event = KeyEvent(
-            NativeKeyEvent(
-                NativeKeyEvent.ACTION_DOWN,
-                NativeKeyEvent.KEYCODE_HOME
-            )
-        )
+        val event =
+            KeyEvent(NativeKeyEvent(NativeKeyEvent.ACTION_DOWN, NativeKeyEvent.KEYCODE_HOME))
         assertThat(event.cancelsTextSelection()).isFalse()
     }
 }
diff --git a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/KeyboardActionsTest.kt b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/KeyboardActionsTest.kt
index 0418c0e..a843c45 100644
--- a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/KeyboardActionsTest.kt
+++ b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/KeyboardActionsTest.kt
@@ -43,8 +43,7 @@
 @LargeTest
 @RunWith(Parameterized::class)
 class KeyboardActionsTest(param: Param) {
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
     // We need to wrap the inline class parameter in another class because Java can't instantiate
     // the inline class.
@@ -57,10 +56,16 @@
     companion object {
         @JvmStatic
         @Parameterized.Parameters(name = "ImeAction = {0}")
-        fun initParameters() = listOf(
-            // OS never shows a Default or None ImeAction.
-            Param(Go), Param(Search), Param(Send), Param(Previous), Param(Next), Param(Done)
-        )
+        fun initParameters() =
+            listOf(
+                // OS never shows a Default or None ImeAction.
+                Param(Go),
+                Param(Search),
+                Param(Send),
+                Param(Previous),
+                Param(Next),
+                Param(Done)
+            )
     }
 
     @Test
@@ -77,14 +82,15 @@
                 onValueChange = {},
                 modifier = Modifier.testTag(initialTextField),
                 imeOptions = ImeOptions(imeAction = imeAction),
-                keyboardActions = KeyboardActions(
-                    onDone = { actionTriggerLog[Done] = true },
-                    onGo = { actionTriggerLog[Go] = true },
-                    onNext = { actionTriggerLog[Next] = true },
-                    onPrevious = { actionTriggerLog[Previous] = true },
-                    onSearch = { actionTriggerLog[Search] = true },
-                    onSend = { actionTriggerLog[Send] = true }
-                )
+                keyboardActions =
+                    KeyboardActions(
+                        onDone = { actionTriggerLog[Done] = true },
+                        onGo = { actionTriggerLog[Go] = true },
+                        onNext = { actionTriggerLog[Next] = true },
+                        onPrevious = { actionTriggerLog[Previous] = true },
+                        onSearch = { actionTriggerLog[Search] = true },
+                        onSend = { actionTriggerLog[Send] = true }
+                    )
             )
         }
 
@@ -116,12 +122,12 @@
             CoreTextField(
                 value = textFieldValue,
                 onValueChange = {},
-                modifier = Modifier
-                    .testTag(initialTextField),
+                modifier = Modifier.testTag(initialTextField),
                 imeOptions = ImeOptions(imeAction = Done),
-                keyboardActions = KeyboardActions(
-                    onDone = { wasCallbackTriggered = true },
-                )
+                keyboardActions =
+                    KeyboardActions(
+                        onDone = { wasCallbackTriggered = true },
+                    )
             )
         }
 
diff --git a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/KeyboardHelper.kt b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/KeyboardHelper.kt
index 1e5776d..84772f3 100644
--- a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/KeyboardHelper.kt
+++ b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/KeyboardHelper.kt
@@ -37,8 +37,8 @@
 import java.util.concurrent.TimeUnit
 
 /**
- * Helper methods for hiding and showing the keyboard in tests.
- * Call [initialize] from your test rule's content before calling any other methods on this class.
+ * Helper methods for hiding and showing the keyboard in tests. Call [initialize] from your test
+ * rule's content before calling any other methods on this class.
  */
 class KeyboardHelper(
     private val composeRule: ComposeContentTestRule,
@@ -53,17 +53,13 @@
         view.context.getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager
     }
 
-    /**
-     * Call this at the top of your test composition before using the helper.
-     */
+    /** Call this at the top of your test composition before using the helper. */
     @Composable
     fun initialize() {
         view = LocalView.current
     }
 
-    /**
-     * Requests the keyboard to be hidden without waiting for it.
-     */
+    /** Requests the keyboard to be hidden without waiting for it. */
     fun hideKeyboard() {
         composeRule.runOnIdle {
             // Use both techniques to hide it, at least one of them will hopefully work.
@@ -73,13 +69,11 @@
     }
 
     /**
-     * Blocks until the [timeout] or the keyboard's visibility matches [visible].
-     * May be called from the test thread or the main thread.
+     * Blocks until the [timeout] or the keyboard's visibility matches [visible]. May be called from
+     * the test thread or the main thread.
      */
     fun waitForKeyboardVisibility(visible: Boolean, timeout: Long = this.timeout) {
-        waitUntil(timeout) {
-            isSoftwareKeyboardShown() == visible
-        }
+        waitUntil(timeout) { isSoftwareKeyboardShown() == visible }
     }
 
     fun hideKeyboardIfShown() {
@@ -111,13 +105,13 @@
     }
 
     private fun hideKeyboardWithImm() {
-        view.post {
-            imm.hideSoftInputFromWindow(view.windowToken, 0)
-        }
+        view.post { imm.hideSoftInputFromWindow(view.windowToken, 0) }
     }
 
     private fun hideKeyboardWithInsets() {
-        view.findWindow()?.let { WindowInsetsControllerCompat(it, view) }
+        view
+            .findWindow()
+            ?.let { WindowInsetsControllerCompat(it, view) }
             ?.hide(WindowInsetsCompat.Type.ime())
     }
 
@@ -131,8 +125,7 @@
 
     // TODO(b/221889664) Replace with composition local when available.
     private fun View.findWindow(): Window? =
-        (parent as? DialogWindowProvider)?.window
-            ?: context.findWindow()
+        (parent as? DialogWindowProvider)?.window ?: context.findWindow()
 
     private tailrec fun Context.findWindow(): Window? =
         when (this) {
@@ -165,8 +158,10 @@
         // else wait for condition to be met
         val conditionMet = latch.await(timeoutMillis, TimeUnit.MILLISECONDS)
         assertWithMessage(
-            "After waiting for $timeoutMillis ms, window insets condition is still false"
-        ).that(conditionMet).isTrue()
+                "After waiting for $timeoutMillis ms, window insets condition is still false"
+            )
+            .that(conditionMet)
+            .isTrue()
     }
 }
 
diff --git a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/PointerIconTestScope.kt b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/PointerIconTestScope.kt
index 81e2ddc..37ba9f3 100644
--- a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/PointerIconTestScope.kt
+++ b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/PointerIconTestScope.kt
@@ -28,32 +28,27 @@
 import androidx.compose.ui.test.junit4.ComposeContentTestRule
 import com.google.common.truth.Truth
 
-/**
- * Scope for testing pointer icon is acting as expected.
- */
+/** Scope for testing pointer icon is acting as expected. */
 class PointerIconTestScope(val rule: ComposeContentTestRule) {
     private lateinit var view: View
 
     /**
      * Set the content on the rule.
      *
-     * Required to call this in your test if you are using
-     * [PointerIconTestScope.assertIcon].
+     * Required to call this in your test if you are using [PointerIconTestScope.assertIcon].
      */
     fun setContent(contentBlock: @Composable () -> Unit) {
         rule.setContent {
             view = LocalView.current
             // If nothing sets the pointer icon, then it can end up null in assertIcon.
             // Instead, let's just always have the top level icon be default.
-            Box(Modifier.pointerHoverIcon(PointerIcon.Default)) {
-                contentBlock()
-            }
+            Box(Modifier.pointerHoverIcon(PointerIcon.Default)) { contentBlock() }
         }
     }
 
     /**
-     * See the `TYPE_*` constants in [android.view.PointerIcon],
-     * such as [android.view.PointerIcon.TYPE_DEFAULT].
+     * See the `TYPE_*` constants in [android.view.PointerIcon], such as
+     * [android.view.PointerIcon.TYPE_DEFAULT].
      */
     @RequiresApi(Build.VERSION_CODES.N)
     fun assertIcon(iconType: Int) {
diff --git a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/PointerMoveDetectorTest.kt b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/PointerMoveDetectorTest.kt
index a7b9fc5..24b0aa4 100644
--- a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/PointerMoveDetectorTest.kt
+++ b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/PointerMoveDetectorTest.kt
@@ -53,14 +53,11 @@
 @RunWith(JUnit4::class)
 class PointerMoveDetectorTest {
 
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
     private val actualMoves = mutableListOf<Offset>()
 
-    private val util = layoutWithGestureDetector {
-        detectMoves { actualMoves.add(it) }
-    }
+    private val util = layoutWithGestureDetector { detectMoves { actualMoves.add(it) } }
 
     private val nothingHandler: PointerInputChange.() -> Unit = {}
 
@@ -77,14 +74,12 @@
     ): @Composable () -> Unit = {
         CompositionLocalProvider(
             LocalDensity provides Density(1f),
-            LocalViewConfiguration provides TestViewConfiguration(
-                minimumTouchTargetSize = DpSize.Zero
-            )
+            LocalViewConfiguration provides
+                TestViewConfiguration(minimumTouchTargetSize = DpSize.Zero)
         ) {
             with(LocalDensity.current) {
                 Box(
-                    Modifier
-                        .fillMaxSize()
+                    Modifier.fillMaxSize()
                         // Some tests execute a lambda before the initial and final passes
                         // so they are called here, higher up the chain, so that the
                         // calls happen prior to the gestureDetector below. The lambdas
@@ -94,13 +89,9 @@
                             awaitPointerEventScope {
                                 while (true) {
                                     val event = awaitPointerEvent(PointerEventPass.Initial)
-                                    event.changes.forEach {
-                                        initialPass(it)
-                                    }
+                                    event.changes.forEach { initialPass(it) }
                                     awaitPointerEvent(PointerEventPass.Final)
-                                    event.changes.forEach {
-                                        finalPass(it)
-                                    }
+                                    event.changes.forEach { finalPass(it) }
                                 }
                             }
                         }
@@ -141,14 +132,15 @@
             up(0)
         }
 
-        assertThat(actualMoves).hasEqualOffsets(
-            listOf(
-                Offset(4f, 4f),
-                Offset(3f, 3f),
-                Offset(2f, 2f),
-                Offset(1f, 1f),
+        assertThat(actualMoves)
+            .hasEqualOffsets(
+                listOf(
+                    Offset(4f, 4f),
+                    Offset(3f, 3f),
+                    Offset(2f, 2f),
+                    Offset(1f, 1f),
+                )
             )
-        )
     }
 
     @Test
@@ -175,14 +167,15 @@
             up(1)
         }
 
-        assertThat(actualMoves).hasEqualOffsets(
-            listOf(
-                Offset(4f, 4f),
-                Offset(3f, 3f),
-                Offset(2f, 2f),
-                Offset(1f, 1f),
+        assertThat(actualMoves)
+            .hasEqualOffsets(
+                listOf(
+                    Offset(4f, 4f),
+                    Offset(3f, 3f),
+                    Offset(2f, 2f),
+                    Offset(1f, 1f),
+                )
             )
-        )
     }
 
     @Test
@@ -208,14 +201,15 @@
             up(1) // ignored because not a move
         }
 
-        assertThat(actualMoves).hasEqualOffsets(
-            listOf(
-                Offset(4f, 4f),
-                Offset(3f, 3f),
-                Offset(2f, 2f),
-                Offset(1f, 1f),
+        assertThat(actualMoves)
+            .hasEqualOffsets(
+                listOf(
+                    Offset(4f, 4f),
+                    Offset(3f, 3f),
+                    Offset(2f, 2f),
+                    Offset(1f, 1f),
+                )
             )
-        )
     }
 
     private fun IterableSubject.hasEqualOffsets(expectedMoves: List<Offset>) {
@@ -224,8 +218,9 @@
             .inOrder()
     }
 
-    private val offsetCorrespondence: Correspondence<Offset, Offset> = Correspondence.from(
-        { o1, o2 -> o1!!.x == o2!!.x && o1.y == o2.y },
-        "has the offset of",
-    )
+    private val offsetCorrespondence: Correspondence<Offset, Offset> =
+        Correspondence.from(
+            { o1, o2 -> o1!!.x == o2!!.x && o1.y == o2.y },
+            "has the offset of",
+        )
 }
diff --git a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/TextDelegateIntegrationTest.kt b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/TextDelegateIntegrationTest.kt
index 8c80b3c..c2aa256 100644
--- a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/TextDelegateIntegrationTest.kt
+++ b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/TextDelegateIntegrationTest.kt
@@ -51,12 +51,13 @@
             val text = "Hello"
             val spanStyle = SpanStyle(fontSize = fontSize, fontFamily = fontFamily)
             val annotatedString = AnnotatedString(text, spanStyle)
-            val textDelegate = TextDelegate(
-                text = annotatedString,
-                style = TextStyle.Default,
-                density = this,
-                fontFamilyResolver = fontFamilyResolver
-            )
+            val textDelegate =
+                TextDelegate(
+                    text = annotatedString,
+                    style = TextStyle.Default,
+                    density = this,
+                    fontFamilyResolver = fontFamilyResolver
+                )
 
             textDelegate.layoutIntrinsics(LayoutDirection.Ltr)
 
@@ -72,12 +73,13 @@
             val text = "Hello"
             val spanStyle = SpanStyle(fontSize = fontSize, fontFamily = fontFamily)
             val annotatedString = AnnotatedString(text, spanStyle)
-            val textDelegate = TextDelegate(
-                text = annotatedString,
-                style = TextStyle.Default,
-                density = this,
-                fontFamilyResolver = fontFamilyResolver
-            )
+            val textDelegate =
+                TextDelegate(
+                    text = annotatedString,
+                    style = TextStyle.Default,
+                    density = this,
+                    fontFamilyResolver = fontFamilyResolver
+                )
 
             textDelegate.layoutIntrinsics(LayoutDirection.Ltr)
 
@@ -88,12 +90,13 @@
 
     @Test
     fun TextLayoutInput_reLayout_withDifferentHeight() {
-        val textDelegate = TextDelegate(
-            text = AnnotatedString(text = "Hello World!"),
-            style = TextStyle.Default,
-            density = density,
-            fontFamilyResolver = fontFamilyResolver
-        )
+        val textDelegate =
+            TextDelegate(
+                text = AnnotatedString(text = "Hello World!"),
+                style = TextStyle.Default,
+                density = density,
+                fontFamilyResolver = fontFamilyResolver
+            )
         val width = 200
         val heightFirstLayout = 100
         val heightSecondLayout = 200
@@ -103,22 +106,20 @@
         assertThat(resultFirstLayout.layoutInput.constraints).isEqualTo(constraintsFirstLayout)
 
         val constraintsSecondLayout = Constraints.fixed(width, heightSecondLayout)
-        val resultSecondLayout = textDelegate.layout(
-            constraintsSecondLayout,
-            LayoutDirection.Ltr,
-            resultFirstLayout
-        )
+        val resultSecondLayout =
+            textDelegate.layout(constraintsSecondLayout, LayoutDirection.Ltr, resultFirstLayout)
         assertThat(resultSecondLayout.layoutInput.constraints).isEqualTo(constraintsSecondLayout)
     }
 
     @Test
     fun TextLayoutResult_reLayout_withDifferentHeight() {
-        val textDelegate = TextDelegate(
-            text = AnnotatedString(text = "Hello World!"),
-            style = TextStyle.Default,
-            density = density,
-            fontFamilyResolver = fontFamilyResolver
-        )
+        val textDelegate =
+            TextDelegate(
+                text = AnnotatedString(text = "Hello World!"),
+                style = TextStyle.Default,
+                density = density,
+                fontFamilyResolver = fontFamilyResolver
+            )
         val width = 200
         val heightFirstLayout = 100
         val heightSecondLayout = 200
@@ -128,11 +129,8 @@
         assertThat(resultFirstLayout.size.height).isEqualTo(heightFirstLayout)
 
         val constraintsSecondLayout = Constraints.fixed(width, heightSecondLayout)
-        val resultSecondLayout = textDelegate.layout(
-            constraintsSecondLayout,
-            LayoutDirection.Ltr,
-            resultFirstLayout
-        )
+        val resultSecondLayout =
+            textDelegate.layout(constraintsSecondLayout, LayoutDirection.Ltr, resultFirstLayout)
         assertThat(resultSecondLayout.size.height).isEqualTo(heightSecondLayout)
     }
 
@@ -140,14 +138,15 @@
     fun TextLayoutResult_layout_withEllipsis_withoutSoftWrap() {
         val fontSize = 20f
         val text = AnnotatedString(text = "Hello World! Hello World! Hello World! Hello World!")
-        val textDelegate = TextDelegate(
-            text = text,
-            style = TextStyle(fontSize = fontSize.sp),
-            softWrap = false,
-            overflow = TextOverflow.Ellipsis,
-            density = density,
-            fontFamilyResolver = fontFamilyResolver
-        )
+        val textDelegate =
+            TextDelegate(
+                text = text,
+                style = TextStyle(fontSize = fontSize.sp),
+                softWrap = false,
+                overflow = TextOverflow.Ellipsis,
+                density = density,
+                fontFamilyResolver = fontFamilyResolver
+            )
         textDelegate.layoutIntrinsics(LayoutDirection.Ltr)
         // Makes width smaller than needed.
         val width = textDelegate.maxIntrinsicWidth / 2
@@ -162,19 +161,21 @@
     fun TextLayoutResult_layoutWithLimitedHeight_withEllipsis() {
         val fontSize = 20f
         val text = AnnotatedString(text = "Hello World! Hello World! Hello World! Hello World!")
-        val textDelegate = TextDelegate(
-            text = text,
-            style = TextStyle(fontSize = fontSize.sp),
-            overflow = TextOverflow.Ellipsis,
-            density = density,
-            fontFamilyResolver = fontFamilyResolver
-        )
+        val textDelegate =
+            TextDelegate(
+                text = text,
+                style = TextStyle(fontSize = fontSize.sp),
+                overflow = TextOverflow.Ellipsis,
+                density = density,
+                fontFamilyResolver = fontFamilyResolver
+            )
         textDelegate.layoutIntrinsics(LayoutDirection.Ltr)
 
-        val constraints = Constraints(
-            maxWidth = textDelegate.maxIntrinsicWidth / 4,
-            maxHeight = (fontSize * 2.7).roundToInt() // fully fits at most 2 lines
-        )
+        val constraints =
+            Constraints(
+                maxWidth = textDelegate.maxIntrinsicWidth / 4,
+                maxHeight = (fontSize * 2.7).roundToInt() // fully fits at most 2 lines
+            )
         val layoutResult = textDelegate.layout(constraints, LayoutDirection.Ltr)
 
         assertThat(layoutResult.lineCount).isEqualTo(2)
@@ -185,13 +186,14 @@
     fun TextLayoutResult_sameWidth_inRtlAndLtr_withLetterSpacing() {
         val fontSize = 20f
         val text = AnnotatedString(text = "Hello World")
-        val textDelegate = TextDelegate(
-            text = text,
-            style = TextStyle(fontSize = fontSize.sp, letterSpacing = 0.5.sp),
-            overflow = TextOverflow.Ellipsis,
-            density = density,
-            fontFamilyResolver = fontFamilyResolver
-        )
+        val textDelegate =
+            TextDelegate(
+                text = text,
+                style = TextStyle(fontSize = fontSize.sp, letterSpacing = 0.5.sp),
+                overflow = TextOverflow.Ellipsis,
+                density = density,
+                fontFamilyResolver = fontFamilyResolver
+            )
         val layoutResultLtr = textDelegate.layout(Constraints(), LayoutDirection.Ltr)
         val layoutResultRtl = textDelegate.layout(Constraints(), LayoutDirection.Rtl)
 
@@ -200,24 +202,23 @@
 
     @Test
     fun layoutText_doesntThrow_when2shl14char() {
-        val textDelegate = TextDelegate(
-            text = AnnotatedString(text = "a".repeat(2 shl 14)),
-            style = TextStyle.Default,
-            density = density,
-            fontFamilyResolver = fontFamilyResolver
-        )
-        val subject = textDelegate.layout(
-            Constraints() /* unbounded */,
-            layoutDirection = LayoutDirection.Ltr,
-            null
-        )
+        val textDelegate =
+            TextDelegate(
+                text = AnnotatedString(text = "a".repeat(2 shl 14)),
+                style = TextStyle.Default,
+                density = density,
+                fontFamilyResolver = fontFamilyResolver
+            )
+        val subject =
+            textDelegate.layout(
+                Constraints() /* unbounded */,
+                layoutDirection = LayoutDirection.Ltr,
+                null
+            )
         assertThat(subject.size.width).isGreaterThan(0)
         assertThat(subject.size.height).isGreaterThan(0)
     }
 }
 
-private fun TextLayoutResult.toBitmap() = Bitmap.createBitmap(
-    size.width,
-    size.height,
-    Bitmap.Config.ARGB_8888
-)
+private fun TextLayoutResult.toBitmap() =
+    Bitmap.createBitmap(size.width, size.height, Bitmap.Config.ARGB_8888)
diff --git a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/TextDelegateWidthWithLetterSpacingTest.kt b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/TextDelegateWidthWithLetterSpacingTest.kt
index 2bf69a4..b357972 100644
--- a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/TextDelegateWidthWithLetterSpacingTest.kt
+++ b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/TextDelegateWidthWithLetterSpacingTest.kt
@@ -36,9 +36,7 @@
 class TextDelegateWidthWithLetterSpacingTest {
     private val fontFamily = TEST_FONT_FAMILY
 
-    /**
-     * values are exact values for the repro case (on Pixel4, Android 11)
-     */
+    /** values are exact values for the repro case (on Pixel4, Android 11) */
     private val density = Density(3.051f, 1.15f)
     private val letterSpacing = 0.4.sp
     private val lineHeight = 16.sp
@@ -48,9 +46,7 @@
 
     @Test
     fun letterSpacing_and_lineHeight() {
-        assertLineCount(
-            TextStyle(letterSpacing = letterSpacing, lineHeight = lineHeight)
-        )
+        assertLineCount(TextStyle(letterSpacing = letterSpacing, lineHeight = lineHeight))
     }
 
     @Test
@@ -69,17 +65,15 @@
     }
 
     private fun assertLineCount(style: TextStyle) {
-        val textDelegate = TextDelegate(
-            text = AnnotatedString(text = "This is a callout message"),
-            style = style.copy(
-                fontFamily = fontFamily,
-                fontSize = fontSize
-            ),
-            softWrap = true,
-            overflow = TextOverflow.Clip,
-            density = density,
-            fontFamilyResolver = fontFamilyResolver
-        )
+        val textDelegate =
+            TextDelegate(
+                text = AnnotatedString(text = "This is a callout message"),
+                style = style.copy(fontFamily = fontFamily, fontSize = fontSize),
+                softWrap = true,
+                overflow = TextOverflow.Clip,
+                density = density,
+                fontFamilyResolver = fontFamilyResolver
+            )
         val layoutResult = textDelegate.layout(Constraints(), LayoutDirection.Ltr)
         assertThat(layoutResult.lineCount).isEqualTo(1)
     }
diff --git a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/TextFieldDelegateIntegrationTest.kt b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/TextFieldDelegateIntegrationTest.kt
index c5dd825..e98f1d6 100644
--- a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/TextFieldDelegateIntegrationTest.kt
+++ b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/TextFieldDelegateIntegrationTest.kt
@@ -47,13 +47,14 @@
 
     @Test
     fun draw_selection_test() {
-        val textDelegate = TextDelegate(
-            text = AnnotatedString("Hello, World"),
-            style = TextStyle.Default,
-            maxLines = 2,
-            density = density,
-            fontFamilyResolver = fontFamilyResolver
-        )
+        val textDelegate =
+            TextDelegate(
+                text = AnnotatedString("Hello, World"),
+                style = TextStyle.Default,
+                maxLines = 2,
+                density = density,
+                fontFamilyResolver = fontFamilyResolver
+            )
         val selection = TextRange(0, 1)
         val selectionColor = Color.Blue
         val layoutResult = textDelegate.layout(Constraints.fixedWidth(1024), layoutDirection)
@@ -83,13 +84,14 @@
 
     @Test
     fun draw_highlight_test() {
-        val textDelegate = TextDelegate(
-            text = AnnotatedString("Hello, World"),
-            style = TextStyle.Default,
-            maxLines = 2,
-            density = density,
-            fontFamilyResolver = fontFamilyResolver
-        )
+        val textDelegate =
+            TextDelegate(
+                text = AnnotatedString("Hello, World"),
+                style = TextStyle.Default,
+                maxLines = 2,
+                density = density,
+                fontFamilyResolver = fontFamilyResolver
+            )
         val layoutResult = textDelegate.layout(Constraints.fixedWidth(1024), layoutDirection)
         val deletionPreviewHighlightRange = TextRange(3, 5)
 
@@ -117,82 +119,90 @@
 
     @Test
     fun layout_height_constraint_max_height() {
-        val textDelegate = TextDelegate(
-            text = AnnotatedString("Hello, World"),
-            style = TextStyle.Default,
-            maxLines = 2,
-            density = density,
-            fontFamilyResolver = fontFamilyResolver
-        )
+        val textDelegate =
+            TextDelegate(
+                text = AnnotatedString("Hello, World"),
+                style = TextStyle.Default,
+                maxLines = 2,
+                density = density,
+                fontFamilyResolver = fontFamilyResolver
+            )
         val layoutResult = textDelegate.layout(Constraints.fixedWidth(1024), layoutDirection)
         val requestHeight = layoutResult.size.height / 2
 
-        val (_, height, _) = TextFieldDelegate.layout(
-            textDelegate,
-            Constraints.fixedHeight(requestHeight),
-            layoutDirection
-        )
+        val (_, height, _) =
+            TextFieldDelegate.layout(
+                textDelegate,
+                Constraints.fixedHeight(requestHeight),
+                layoutDirection
+            )
 
         assertThat(height).isEqualTo(requestHeight)
     }
 
     @Test
     fun layout_height_constraint_min_height() {
-        val textDelegate = TextDelegate(
-            text = AnnotatedString("Hello, World"),
-            style = TextStyle.Default,
-            maxLines = 2,
-            density = density,
-            fontFamilyResolver = fontFamilyResolver
-        )
+        val textDelegate =
+            TextDelegate(
+                text = AnnotatedString("Hello, World"),
+                style = TextStyle.Default,
+                maxLines = 2,
+                density = density,
+                fontFamilyResolver = fontFamilyResolver
+            )
         val layoutResult = textDelegate.layout(Constraints.fixedWidth(1024), layoutDirection)
         val requestHeight = layoutResult.size.height * 2
 
-        val (_, height, _) = TextFieldDelegate.layout(
-            textDelegate,
-            Constraints.fixedHeight(requestHeight),
-            layoutDirection
-        )
+        val (_, height, _) =
+            TextFieldDelegate.layout(
+                textDelegate,
+                Constraints.fixedHeight(requestHeight),
+                layoutDirection
+            )
 
         assertThat(height).isEqualTo(requestHeight)
     }
 
     @Test
     fun layout_empty_text_height_constraint_min_height() {
-        val textDelegate = TextDelegate(
-            text = AnnotatedString(""),
-            style = TextStyle.Default,
-            density = density,
-            fontFamilyResolver = fontFamilyResolver
-        )
+        val textDelegate =
+            TextDelegate(
+                text = AnnotatedString(""),
+                style = TextStyle.Default,
+                density = density,
+                fontFamilyResolver = fontFamilyResolver
+            )
         val layoutResult = textDelegate.layout(Constraints.fixedWidth(1024), layoutDirection)
         val requestHeight = layoutResult.size.height * 2
 
-        val (_, height, _) = TextFieldDelegate.layout(
-            textDelegate,
-            Constraints.fixedHeight(requestHeight),
-            layoutDirection
-        )
+        val (_, height, _) =
+            TextFieldDelegate.layout(
+                textDelegate,
+                Constraints.fixedHeight(requestHeight),
+                layoutDirection
+            )
 
         assertThat(height).isEqualTo(requestHeight)
     }
 
     @Test
     fun layout_empty_text_height_constraint_max_height() {
-        val textDelegate = TextDelegate(
-            text = AnnotatedString(""),
-            style = TextStyle.Default,
-            density = density,
-            fontFamilyResolver = fontFamilyResolver
-        )
+        val textDelegate =
+            TextDelegate(
+                text = AnnotatedString(""),
+                style = TextStyle.Default,
+                density = density,
+                fontFamilyResolver = fontFamilyResolver
+            )
         val layoutResult = textDelegate.layout(Constraints.fixedWidth(1024), layoutDirection)
         val requestHeight = layoutResult.size.height / 2
 
-        val (_, height, _) = TextFieldDelegate.layout(
-            textDelegate,
-            Constraints.fixedHeight(requestHeight),
-            layoutDirection
-        )
+        val (_, height, _) =
+            TextFieldDelegate.layout(
+                textDelegate,
+                Constraints.fixedHeight(requestHeight),
+                layoutDirection
+            )
 
         assertThat(height).isEqualTo(requestHeight)
     }
@@ -202,36 +212,31 @@
         // choose a text that is wider than default min width
         val text = AnnotatedString("H".repeat(DefaultWidthCharCount * 2))
 
-        val textDelegate = TextDelegate(
-            text = text,
-            style = TextStyle.Default,
-            density = density,
-            fontFamilyResolver = fontFamilyResolver
-        )
+        val textDelegate =
+            TextDelegate(
+                text = text,
+                style = TextStyle.Default,
+                density = density,
+                fontFamilyResolver = fontFamilyResolver
+            )
 
         val layoutResult = textDelegate.layout(Constraints(), layoutDirection)
 
         // choose constraints to be larger than layout width and height
-        val constraints = Constraints(
-            minWidth = 0,
-            maxWidth = layoutResult.size.width * 2,
-            minHeight = 0,
-            maxHeight = layoutResult.size.height * 2
-        )
+        val constraints =
+            Constraints(
+                minWidth = 0,
+                maxWidth = layoutResult.size.width * 2,
+                minHeight = 0,
+                maxHeight = layoutResult.size.height * 2
+            )
 
-        val (width, height) = TextFieldDelegate.layout(
-            textDelegate,
-            constraints,
-            layoutDirection
-        )
+        val (width, height) = TextFieldDelegate.layout(textDelegate, constraints, layoutDirection)
 
         assertThat(width.toFloat()).isEqualTo(layoutResult.size.width)
         assertThat(height.toFloat()).isEqualTo(layoutResult.size.height)
     }
 }
 
-private fun TextLayoutResult.toBitmap() = Bitmap.createBitmap(
-    size.width,
-    size.height,
-    Bitmap.Config.ARGB_8888
-)
+private fun TextLayoutResult.toBitmap() =
+    Bitmap.createBitmap(size.width, size.height, Bitmap.Config.ARGB_8888)
diff --git a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/TextFieldInteractionsTest.kt b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/TextFieldInteractionsTest.kt
index ba7a6ac..719e46b 100644
--- a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/TextFieldInteractionsTest.kt
+++ b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/TextFieldInteractionsTest.kt
@@ -50,8 +50,7 @@
 @RunWith(AndroidJUnit4::class)
 class TextFieldInteractionsTest {
 
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
     val testTag = "textField"
 
@@ -71,25 +70,15 @@
         }
         val interactions = mutableListOf<Interaction>()
 
-        scope!!.launch {
-            interactionSource.interactions.collect { interactions.add(it) }
-        }
+        scope!!.launch { interactionSource.interactions.collect { interactions.add(it) } }
 
-        rule.runOnIdle {
-            assertThat(interactions).isEmpty()
-        }
-        rule.onNodeWithTag(testTag)
-            .performTouchInput {
-                down(center)
-            }
+        rule.runOnIdle { assertThat(interactions).isEmpty() }
+        rule.onNodeWithTag(testTag).performTouchInput { down(center) }
         rule.runOnIdle {
             // Not asserting total size as we have other interactions here too
             assertThat(interactions.filterIsInstance<PressInteraction.Press>()).hasSize(1)
         }
-        rule.onNodeWithTag(testTag)
-            .performTouchInput {
-                up()
-            }
+        rule.onNodeWithTag(testTag).performTouchInput { up() }
         rule.runOnIdle {
             // Not asserting total size as we have other interactions here too
             assertThat(interactions.filterIsInstance<PressInteraction.Press>()).hasSize(1)
@@ -113,25 +102,15 @@
         }
         val interactions = mutableListOf<Interaction>()
 
-        scope!!.launch {
-            interactionSource.interactions.collect { interactions.add(it) }
-        }
+        scope!!.launch { interactionSource.interactions.collect { interactions.add(it) } }
 
-        rule.runOnIdle {
-            assertThat(interactions).isEmpty()
-        }
-        rule.onNodeWithTag(testTag)
-            .performTouchInput {
-                down(center)
-            }
+        rule.runOnIdle { assertThat(interactions).isEmpty() }
+        rule.onNodeWithTag(testTag).performTouchInput { down(center) }
         rule.runOnIdle {
             // Not asserting total size as we have other interactions here too
             assertThat(interactions.filterIsInstance<PressInteraction.Press>()).hasSize(1)
         }
-        rule.onNodeWithTag(testTag)
-            .performTouchInput {
-                cancel()
-            }
+        rule.onNodeWithTag(testTag).performTouchInput { cancel() }
         rule.runOnIdle {
             // Not asserting total size as we have other interactions here too
             assertThat(interactions.filterIsInstance<PressInteraction.Press>()).hasSize(1)
@@ -159,15 +138,10 @@
         }
         val interactions = mutableListOf<Interaction>()
 
-        scope!!.launch {
-            interactionSource.interactions.collect { interactions.add(it) }
-        }
+        scope!!.launch { interactionSource.interactions.collect { interactions.add(it) } }
 
-        rule.runOnIdle {
-            assertThat(interactions).isEmpty()
-        }
-        rule.onNodeWithTag(testTag)
-            .performClick()
+        rule.runOnIdle { assertThat(interactions).isEmpty() }
+        rule.onNodeWithTag(testTag).performClick()
         rule.runOnIdle {
             // Not asserting total size as we have other interactions here too
             assertThat(interactions.filterIsInstance<FocusInteraction.Focus>()).hasSize(1)
@@ -200,26 +174,18 @@
         }
         val interactions = mutableListOf<Interaction>()
 
-        scope!!.launch {
-            interactionSource.interactions.collect { interactions.add(it) }
-        }
+        scope!!.launch { interactionSource.interactions.collect { interactions.add(it) } }
 
-        rule.runOnIdle {
-            assertThat(interactions).isEmpty()
+        rule.runOnIdle { assertThat(interactions).isEmpty() }
+        rule.onNodeWithTag(testTag).performTouchInput {
+            down(center)
+            moveBy(Offset(x = 100f, y = 0f))
         }
-        rule.onNodeWithTag(testTag)
-            .performTouchInput {
-                down(center)
-                moveBy(Offset(x = 100f, y = 0f))
-            }
         rule.runOnIdle {
             // Not asserting total size as we have other interactions here too
             assertThat(interactions.filterIsInstance<DragInteraction.Start>()).hasSize(1)
         }
-        rule.onNodeWithTag(testTag)
-            .performTouchInput {
-                up()
-            }
+        rule.onNodeWithTag(testTag).performTouchInput { up() }
         rule.runOnIdle {
             // Not asserting total size as we have other interactions here too
             assertThat(interactions.filterIsInstance<DragInteraction.Start>()).hasSize(1)
@@ -244,26 +210,18 @@
         }
         val interactions = mutableListOf<Interaction>()
 
-        scope!!.launch {
-            interactionSource.interactions.collect { interactions.add(it) }
-        }
+        scope!!.launch { interactionSource.interactions.collect { interactions.add(it) } }
 
-        rule.runOnIdle {
-            assertThat(interactions).isEmpty()
+        rule.runOnIdle { assertThat(interactions).isEmpty() }
+        rule.onNodeWithTag(testTag).performTouchInput {
+            down(center)
+            moveBy(Offset(x = 100f, y = 0f))
         }
-        rule.onNodeWithTag(testTag)
-            .performTouchInput {
-                down(center)
-                moveBy(Offset(x = 100f, y = 0f))
-            }
         rule.runOnIdle {
             // Not asserting total size as we have other interactions here too
             assertThat(interactions.filterIsInstance<DragInteraction.Start>()).hasSize(1)
         }
-        rule.onNodeWithTag(testTag)
-            .performTouchInput {
-                cancel()
-            }
+        rule.onNodeWithTag(testTag).performTouchInput { cancel() }
         rule.runOnIdle {
             // Not asserting total size as we have other interactions here too
             assertThat(interactions.filterIsInstance<DragInteraction.Start>()).hasSize(1)
@@ -288,26 +246,18 @@
         }
         val interactions = mutableListOf<Interaction>()
 
-        scope!!.launch {
-            interactionSource.interactions.collect { interactions.add(it) }
-        }
+        scope!!.launch { interactionSource.interactions.collect { interactions.add(it) } }
 
-        rule.runOnIdle {
-            assertThat(interactions).isEmpty()
+        rule.runOnIdle { assertThat(interactions).isEmpty() }
+        rule.onNodeWithTag(testTag).performTouchInput {
+            down(center)
+            moveBy(Offset(x = 0f, y = 150f))
         }
-        rule.onNodeWithTag(testTag)
-            .performTouchInput {
-                down(center)
-                moveBy(Offset(x = 0f, y = 150f))
-            }
         rule.runOnIdle {
             // Not asserting total size as we have other interactions here too
             assertThat(interactions.filterIsInstance<DragInteraction.Start>()).hasSize(1)
         }
-        rule.onNodeWithTag(testTag)
-            .performTouchInput {
-                up()
-            }
+        rule.onNodeWithTag(testTag).performTouchInput { up() }
         rule.runOnIdle {
             // Not asserting total size as we have other interactions here too
             assertThat(interactions.filterIsInstance<DragInteraction.Start>()).hasSize(1)
@@ -332,26 +282,18 @@
         }
         val interactions = mutableListOf<Interaction>()
 
-        scope!!.launch {
-            interactionSource.interactions.collect { interactions.add(it) }
-        }
+        scope!!.launch { interactionSource.interactions.collect { interactions.add(it) } }
 
-        rule.runOnIdle {
-            assertThat(interactions).isEmpty()
+        rule.runOnIdle { assertThat(interactions).isEmpty() }
+        rule.onNodeWithTag(testTag).performTouchInput {
+            down(center)
+            moveBy(Offset(x = 0f, y = 150f))
         }
-        rule.onNodeWithTag(testTag)
-            .performTouchInput {
-                down(center)
-                moveBy(Offset(x = 0f, y = 150f))
-            }
         rule.runOnIdle {
             // Not asserting total size as we have other interactions here too
             assertThat(interactions.filterIsInstance<DragInteraction.Start>()).hasSize(1)
         }
-        rule.onNodeWithTag(testTag)
-            .performTouchInput {
-                cancel()
-            }
+        rule.onNodeWithTag(testTag).performTouchInput { cancel() }
         rule.runOnIdle {
             // Not asserting total size as we have other interactions here too
             assertThat(interactions.filterIsInstance<DragInteraction.Start>()).hasSize(1)
diff --git a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/TextLayoutDirectionTest.kt b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/TextLayoutDirectionTest.kt
index d61ae29..ef68827 100644
--- a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/TextLayoutDirectionTest.kt
+++ b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/TextLayoutDirectionTest.kt
@@ -31,8 +31,7 @@
 @RunWith(AndroidJUnit4::class)
 @MediumTest
 class TextLayoutDirectionTest {
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
     @Test
     fun testCoreTextField_getsCorrectLayoutDirection() {
diff --git a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/TextLayoutResultIntegrationTest.kt b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/TextLayoutResultIntegrationTest.kt
index 3b03af5..11b7f80 100644
--- a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/TextLayoutResultIntegrationTest.kt
+++ b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/TextLayoutResultIntegrationTest.kt
@@ -52,18 +52,17 @@
             val text = "Hello"
             val spanStyle = SpanStyle(fontSize = fontSize, fontFamily = fontFamily)
             val annotatedString = AnnotatedString(text, spanStyle)
-            val textDelegate = TextDelegate(
-                text = annotatedString,
-                style = TextStyle.Default,
-                density = this,
-                fontFamilyResolver = fontFamilyResolver
-            )
+            val textDelegate =
+                TextDelegate(
+                    text = annotatedString,
+                    style = TextStyle.Default,
+                    density = this,
+                    fontFamilyResolver = fontFamilyResolver
+                )
 
             val layoutResult = textDelegate.layout(Constraints(0, 200), layoutDirection)
 
-            assertThat(layoutResult.size.width).isEqualTo(
-                (fontSize.toPx() * text.length).toIntPx()
-            )
+            assertThat(layoutResult.size.width).isEqualTo((fontSize.toPx() * text.length).toIntPx())
         }
     }
 
@@ -73,12 +72,13 @@
         val width = 80
         val spanStyle = SpanStyle(fontSize = 20.sp, fontFamily = fontFamily)
         val annotatedString = AnnotatedString(text, spanStyle)
-        val textDelegate = TextDelegate(
-            text = annotatedString,
-            style = TextStyle.Default,
-            density = density,
-            fontFamilyResolver = fontFamilyResolver
-        )
+        val textDelegate =
+            TextDelegate(
+                text = annotatedString,
+                style = TextStyle.Default,
+                density = density,
+                fontFamilyResolver = fontFamilyResolver
+            )
 
         val layoutResult = textDelegate.layout(Constraints(maxWidth = width), layoutDirection)
 
@@ -92,12 +92,13 @@
             val spanStyle = SpanStyle(fontSize = fontSize, fontFamily = fontFamily)
             val text = "hello"
             val annotatedString = AnnotatedString(text, spanStyle)
-            val textDelegate = TextDelegate(
-                text = annotatedString,
-                style = TextStyle.Default,
-                density = this,
-                fontFamilyResolver = fontFamilyResolver
-            )
+            val textDelegate =
+                TextDelegate(
+                    text = annotatedString,
+                    style = TextStyle.Default,
+                    density = this,
+                    fontFamilyResolver = fontFamilyResolver
+                )
 
             val layoutResult = textDelegate.layout(Constraints(), layoutDirection)
 
@@ -107,12 +108,13 @@
 
     @Test
     fun layout_build_layoutResult() {
-        val textDelegate = TextDelegate(
-            text = AnnotatedString(text = "Hello"),
-            style = TextStyle.Default,
-            density = density,
-            fontFamilyResolver = fontFamilyResolver
-        )
+        val textDelegate =
+            TextDelegate(
+                text = AnnotatedString(text = "Hello"),
+                style = TextStyle.Default,
+                density = density,
+                fontFamilyResolver = fontFamilyResolver
+            )
 
         val layoutResult = textDelegate.layout(Constraints(0, 20), layoutDirection)
 
@@ -122,17 +124,16 @@
     @Test
     fun getPositionForOffset_First_Character() {
         val text = "Hello"
-        val annotatedString = AnnotatedString(
-            text,
-            SpanStyle(fontSize = 20.sp, fontFamily = fontFamily)
-        )
+        val annotatedString =
+            AnnotatedString(text, SpanStyle(fontSize = 20.sp, fontFamily = fontFamily))
 
-        val textDelegate = TextDelegate(
-            text = annotatedString,
-            style = TextStyle.Default,
-            density = density,
-            fontFamilyResolver = fontFamilyResolver
-        )
+        val textDelegate =
+            TextDelegate(
+                text = annotatedString,
+                style = TextStyle.Default,
+                density = density,
+                fontFamilyResolver = fontFamilyResolver
+            )
         val layoutResult = textDelegate.layout(Constraints(), layoutDirection)
 
         val selection = layoutResult.getOffsetForPosition(Offset.Zero)
@@ -147,22 +148,22 @@
             val characterIndex = 2 // Start from 0.
             val text = "Hello"
 
-            val annotatedString = AnnotatedString(
-                text,
-                SpanStyle(fontSize = fontSize, fontFamily = fontFamily)
-            )
+            val annotatedString =
+                AnnotatedString(text, SpanStyle(fontSize = fontSize, fontFamily = fontFamily))
 
-            val textDelegate = TextDelegate(
-                text = annotatedString,
-                style = TextStyle.Default,
-                density = this,
-                fontFamilyResolver = fontFamilyResolver
-            )
+            val textDelegate =
+                TextDelegate(
+                    text = annotatedString,
+                    style = TextStyle.Default,
+                    density = this,
+                    fontFamilyResolver = fontFamilyResolver
+                )
             val layoutResult = textDelegate.layout(Constraints(), layoutDirection)
 
-            val selection = layoutResult.getOffsetForPosition(
-                position = Offset((fontSize.toPx() * characterIndex + 1), 0f)
-            )
+            val selection =
+                layoutResult.getOffsetForPosition(
+                    position = Offset((fontSize.toPx() * characterIndex + 1), 0f)
+                )
 
             assertThat(selection).isEqualTo(characterIndex)
         }
@@ -173,12 +174,13 @@
         val text = "Hello"
         val spanStyle = SpanStyle(fontSize = 20.sp, fontFamily = fontFamily)
         val annotatedString = AnnotatedString(text, spanStyle)
-        val textDelegate = TextDelegate(
-            text = annotatedString,
-            style = TextStyle.Default,
-            density = density,
-            fontFamilyResolver = fontFamilyResolver
-        )
+        val textDelegate =
+            TextDelegate(
+                text = annotatedString,
+                style = TextStyle.Default,
+                density = density,
+                fontFamilyResolver = fontFamilyResolver
+            )
 
         val layoutResult = textDelegate.layout(Constraints(), layoutDirection)
 
@@ -195,21 +197,19 @@
         val annotatedString = AnnotatedString(text, spanStyle)
         val maxLines = 3
 
-        val textDelegate = TextDelegate(
-            text = annotatedString,
-            style = TextStyle.Default,
-            maxLines = maxLines,
-            density = density,
-            fontFamilyResolver = fontFamilyResolver
-        )
+        val textDelegate =
+            TextDelegate(
+                text = annotatedString,
+                style = TextStyle.Default,
+                maxLines = maxLines,
+                density = density,
+                fontFamilyResolver = fontFamilyResolver
+            )
 
         textDelegate.layoutIntrinsics(layoutDirection)
         // Tries to make 5 lines of text, which exceeds the given maxLines(3).
         val maxWidth = textDelegate.maxIntrinsicWidth / 5
-        val layoutResult = textDelegate.layout(
-            Constraints(maxWidth = maxWidth),
-            layoutDirection
-        )
+        val layoutResult = textDelegate.layout(Constraints(maxWidth = maxWidth), layoutDirection)
 
         assertThat(layoutResult.didOverflowHeight).isTrue()
     }
@@ -221,21 +221,19 @@
         val annotatedString = AnnotatedString(text, spanStyle)
         val maxLines = 10
 
-        val textDelegate = TextDelegate(
-            text = annotatedString,
-            style = TextStyle.Default,
-            maxLines = maxLines,
-            density = density,
-            fontFamilyResolver = fontFamilyResolver
-        )
+        val textDelegate =
+            TextDelegate(
+                text = annotatedString,
+                style = TextStyle.Default,
+                maxLines = maxLines,
+                density = density,
+                fontFamilyResolver = fontFamilyResolver
+            )
 
         textDelegate.layoutIntrinsics(layoutDirection)
         // Tries to make 5 lines of text, which doesn't exceed the given maxLines(10).
         val maxWidth = textDelegate.maxIntrinsicWidth / 5
-        val layoutResult = textDelegate.layout(
-            Constraints(maxWidth = maxWidth),
-            layoutDirection
-        )
+        val layoutResult = textDelegate.layout(Constraints(maxWidth = maxWidth), layoutDirection)
 
         assertThat(layoutResult.didOverflowHeight).isFalse()
     }
@@ -246,24 +244,20 @@
         val spanStyle = SpanStyle(fontSize = 20.sp, fontFamily = fontFamily)
         val annotatedString = AnnotatedString(text, spanStyle)
 
-        val textDelegate = TextDelegate(
-            text = annotatedString,
-            style = TextStyle.Default,
-            density = density,
-            fontFamilyResolver = fontFamilyResolver
-        )
+        val textDelegate =
+            TextDelegate(
+                text = annotatedString,
+                style = TextStyle.Default,
+                density = density,
+                fontFamilyResolver = fontFamilyResolver
+            )
 
-        val maxIntrinsicsHeight = textDelegate.layout(
-            Constraints(),
-            layoutDirection
-        ).multiParagraph.height
+        val maxIntrinsicsHeight =
+            textDelegate.layout(Constraints(), layoutDirection).multiParagraph.height
 
         // Make maxHeight smaller than needed.
         val maxHeight = floor(maxIntrinsicsHeight / 2).toInt()
-        val layoutResult = textDelegate.layout(
-            Constraints(maxHeight = maxHeight),
-            layoutDirection
-        )
+        val layoutResult = textDelegate.layout(Constraints(maxHeight = maxHeight), layoutDirection)
 
         assertThat(layoutResult.didOverflowHeight).isTrue()
     }
@@ -274,24 +268,20 @@
         val spanStyle = SpanStyle(fontSize = 20.sp, fontFamily = fontFamily)
         val annotatedString = AnnotatedString(text, spanStyle)
 
-        val textDelegate = TextDelegate(
-            text = annotatedString,
-            style = TextStyle.Default,
-            density = density,
-            fontFamilyResolver = fontFamilyResolver
-        )
+        val textDelegate =
+            TextDelegate(
+                text = annotatedString,
+                style = TextStyle.Default,
+                density = density,
+                fontFamilyResolver = fontFamilyResolver
+            )
 
-        val maxIntrinsicsHeight = textDelegate.layout(
-            Constraints(),
-            layoutDirection
-        ).multiParagraph.height
+        val maxIntrinsicsHeight =
+            textDelegate.layout(Constraints(), layoutDirection).multiParagraph.height
 
         // Make max height larger than the needed.
         val maxHeight = floor(maxIntrinsicsHeight * 2).toInt()
-        val layoutResult = textDelegate.layout(
-            Constraints(maxHeight = maxHeight),
-            layoutDirection
-        )
+        val layoutResult = textDelegate.layout(Constraints(maxHeight = maxHeight), layoutDirection)
 
         assertThat(layoutResult.didOverflowHeight).isFalse()
     }
diff --git a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/TextLayoutTest.kt b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/TextLayoutTest.kt
index 2c21952..ea44113 100644
--- a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/TextLayoutTest.kt
+++ b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/TextLayoutTest.kt
@@ -51,8 +51,7 @@
 @RunWith(AndroidJUnit4::class)
 @MediumTest
 class TextLayoutTest {
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
     @Test
     fun textLayout() {
@@ -61,15 +60,17 @@
         rule.setContent {
             TestingText(
                 "aa",
-                modifier = Modifier.onGloballyPositioned { coordinates ->
-                    textSize.value = coordinates.size
-                }
+                modifier =
+                    Modifier.onGloballyPositioned { coordinates ->
+                        textSize.value = coordinates.size
+                    }
             )
             TestingText(
                 "aaaa",
-                modifier = Modifier.onGloballyPositioned { coordinates ->
-                    doubleTextSize.value = coordinates.size
-                }
+                modifier =
+                    Modifier.onGloballyPositioned { coordinates ->
+                        doubleTextSize.value = coordinates.size
+                    }
             )
         }
 
@@ -90,51 +91,42 @@
         var textMeasurable by mutableStateOf<Measurable?>(null)
 
         rule.setContent {
-            TestingText(
-                "aa ",
-                modifier = Modifier.onSizeChanged { textSize.value = it }
-            )
-            TestingText(
-                "aa aa ",
-                modifier = Modifier.onSizeChanged { doubleTextSize.value = it }
-            )
+            TestingText("aa ", modifier = Modifier.onSizeChanged { textSize.value = it })
+            TestingText("aa aa ", modifier = Modifier.onSizeChanged { doubleTextSize.value = it })
 
             Layout(
-                content = {
-                    TestingText("aa aa ")
-                },
-                measurePolicy = object : MeasurePolicy {
-                    override fun MeasureScope.measure(
-                        measurables: List<Measurable>,
-                        constraints: Constraints
-                    ): MeasureResult {
-                        measurables.forEach {
-                            it.measure(constraints)
+                content = { TestingText("aa aa ") },
+                measurePolicy =
+                    object : MeasurePolicy {
+                        override fun MeasureScope.measure(
+                            measurables: List<Measurable>,
+                            constraints: Constraints
+                        ): MeasureResult {
+                            measurables.forEach { it.measure(constraints) }
+                            textMeasurable = measurables.first()
+                            return layout(0, 0) {}
                         }
-                        textMeasurable = measurables.first()
-                        return layout(0, 0) {}
+
+                        override fun IntrinsicMeasureScope.minIntrinsicWidth(
+                            measurables: List<IntrinsicMeasurable>,
+                            height: Int
+                        ) = 0
+
+                        override fun IntrinsicMeasureScope.minIntrinsicHeight(
+                            measurables: List<IntrinsicMeasurable>,
+                            width: Int
+                        ) = 0
+
+                        override fun IntrinsicMeasureScope.maxIntrinsicWidth(
+                            measurables: List<IntrinsicMeasurable>,
+                            height: Int
+                        ) = 0
+
+                        override fun IntrinsicMeasureScope.maxIntrinsicHeight(
+                            measurables: List<IntrinsicMeasurable>,
+                            width: Int
+                        ) = 0
                     }
-
-                    override fun IntrinsicMeasureScope.minIntrinsicWidth(
-                        measurables: List<IntrinsicMeasurable>,
-                        height: Int
-                    ) = 0
-
-                    override fun IntrinsicMeasureScope.minIntrinsicHeight(
-                        measurables: List<IntrinsicMeasurable>,
-                        width: Int
-                    ) = 0
-
-                    override fun IntrinsicMeasureScope.maxIntrinsicWidth(
-                        measurables: List<IntrinsicMeasurable>,
-                        height: Int
-                    ) = 0
-
-                    override fun IntrinsicMeasureScope.maxIntrinsicHeight(
-                        measurables: List<IntrinsicMeasurable>,
-                        width: Int
-                    ) = 0
-                }
             )
         }
 
@@ -147,20 +139,16 @@
                 // Min width.
                 assertThat(textWidth).isEqualTo(textMeasurable.minIntrinsicWidth(0))
                 // Min height.
-                assertThat(textMeasurable.minIntrinsicHeight(textWidth))
-                    .isGreaterThan(textHeight)
-                assertThat(textHeight)
-                    .isEqualTo(textMeasurable.minIntrinsicHeight(doubleTextWidth))
+                assertThat(textMeasurable.minIntrinsicHeight(textWidth)).isGreaterThan(textHeight)
+                assertThat(textHeight).isEqualTo(textMeasurable.minIntrinsicHeight(doubleTextWidth))
                 assertThat(textHeight)
                     .isEqualTo(textMeasurable.minIntrinsicHeight(Constraints.Infinity))
 
                 // Max width.
                 assertThat(doubleTextWidth).isEqualTo(textMeasurable.maxIntrinsicWidth(0))
                 // Max height.
-                assertThat(textMeasurable.maxIntrinsicHeight(textWidth))
-                    .isGreaterThan(textHeight)
-                assertThat(textHeight)
-                    .isEqualTo(textMeasurable.maxIntrinsicHeight(doubleTextWidth))
+                assertThat(textMeasurable.maxIntrinsicHeight(textWidth)).isGreaterThan(textHeight)
+                assertThat(textHeight).isEqualTo(textMeasurable.maxIntrinsicHeight(doubleTextWidth))
                 assertThat(textHeight)
                     .isEqualTo(textMeasurable.maxIntrinsicHeight(Constraints.Infinity))
             }
@@ -173,9 +161,7 @@
         var lastBaseline by mutableStateOf(-1)
 
         rule.setContent {
-            Layout({
-                TestingText("aa")
-            }) { measurables, _ ->
+            Layout({ TestingText("aa") }) { measurables, _ ->
                 val placeable = measurables.first().measure(Constraints())
                 firstBaseline = placeable[FirstBaseline]
                 lastBaseline = placeable[LastBaseline]
@@ -196,9 +182,7 @@
         var lastBaseline by mutableStateOf(-1)
 
         rule.setContent {
-            Layout({
-                TestingText("aa")
-            }) { measurables, _ ->
+            Layout({ TestingText("aa") }) { measurables, _ ->
                 val placeable = measurables.first().measure(Constraints(maxWidth = 0))
                 firstBaseline = placeable[FirstBaseline]
                 lastBaseline = placeable[LastBaseline]
@@ -216,13 +200,9 @@
     @Test
     fun textLayout_OnTextLayoutCallback() {
         val resultsFromCallback = mutableListOf<TextLayoutResult>()
-        rule.setContent {
-            TestingText("aa", onTextLayout = { resultsFromCallback += it })
-        }
+        rule.setContent { TestingText("aa", onTextLayout = { resultsFromCallback += it }) }
 
-        rule.runOnIdle {
-            assertThat(resultsFromCallback).hasSize(1)
-        }
+        rule.runOnIdle { assertThat(resultsFromCallback).hasSize(1) }
     }
 }
 
@@ -232,9 +212,7 @@
     modifier: Modifier = Modifier,
     onTextLayout: (TextLayoutResult) -> Unit = {}
 ) {
-    val textStyle = remember {
-        TextStyle(fontFamily = TEST_FONT_FAMILY)
-    }
+    val textStyle = remember { TextStyle(fontFamily = TEST_FONT_FAMILY) }
     BasicText(
         AnnotatedString(text),
         style = textStyle,
diff --git a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/TextOverflowTest.kt b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/TextOverflowTest.kt
index 56e8833..22de2cb 100644
--- a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/TextOverflowTest.kt
+++ b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/TextOverflowTest.kt
@@ -56,8 +56,7 @@
 @LargeTest
 @RunWith(AndroidJUnit4::class)
 class TextOverflowTest {
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
     private val density = Density(1f)
     private val fontFamilyResolver =
@@ -83,16 +82,17 @@
                 Box(Modifier.testTag(BoxTag).size(boxWidth.dp, boxHeight.dp)) {
                     BasicText(
                         text = text,
-                        modifier = Modifier
-                            .fillMaxWidth()
-                            .heightIn(max = (2 * lineHeight).dp)
-                            .padding(bottom = lineHeight.dp),
-                        style = TextStyle(
-                            fontSize = 20.sp,
-                            fontFamily = fontFamily,
-                            color = Color.Red,
-                            lineHeight = 20.sp
-                        ),
+                        modifier =
+                            Modifier.fillMaxWidth()
+                                .heightIn(max = (2 * lineHeight).dp)
+                                .padding(bottom = lineHeight.dp),
+                        style =
+                            TextStyle(
+                                fontSize = 20.sp,
+                                fontFamily = fontFamily,
+                                color = Color.Red,
+                                lineHeight = 20.sp
+                            ),
                         overflow = TextOverflow.Visible
                     )
                 }
@@ -100,13 +100,8 @@
         }
 
         val boxBitmap = rule.onNodeWithTag(BoxTag).captureToImage().asAndroidBitmap()
-        val croppedBoxBitmap = Bitmap.createBitmap(
-            boxBitmap,
-            0,
-            2 * lineHeight,
-            boxWidth,
-            boxHeight - 2 * lineHeight
-        )
+        val croppedBoxBitmap =
+            Bitmap.createBitmap(boxBitmap, 0, 2 * lineHeight, boxWidth, boxHeight - 2 * lineHeight)
         croppedBoxBitmap.asImageBitmap().assertContainsColor(Color.Red)
     }
 
@@ -115,9 +110,7 @@
     fun paint_multiParagraph_withVisibleOverflow() {
         val text = buildAnnotatedString {
             append("Hello\nHello")
-            withStyle(ParagraphStyle(textAlign = TextAlign.Center)) {
-                append("Hello\nHello")
-            }
+            withStyle(ParagraphStyle(textAlign = TextAlign.Center)) { append("Hello\nHello") }
         }
         val lineHeight = 20
         val boxHeight = 100
@@ -131,16 +124,17 @@
                 Box(Modifier.testTag(BoxTag).size(boxWidth.dp, boxHeight.dp)) {
                     BasicText(
                         text = text,
-                        modifier = Modifier
-                            .fillMaxWidth()
-                            .heightIn(max = (2 * lineHeight).dp)
-                            .padding(bottom = lineHeight.dp),
-                        style = TextStyle(
-                            fontSize = 20.sp,
-                            fontFamily = fontFamily,
-                            color = Color.Red,
-                            lineHeight = 20.sp
-                        ),
+                        modifier =
+                            Modifier.fillMaxWidth()
+                                .heightIn(max = (2 * lineHeight).dp)
+                                .padding(bottom = lineHeight.dp),
+                        style =
+                            TextStyle(
+                                fontSize = 20.sp,
+                                fontFamily = fontFamily,
+                                color = Color.Red,
+                                lineHeight = 20.sp
+                            ),
                         overflow = TextOverflow.Visible
                     )
                 }
@@ -148,13 +142,8 @@
         }
 
         val boxBitmap = rule.onNodeWithTag(BoxTag).captureToImage().asAndroidBitmap()
-        val croppedBoxBitmap = Bitmap.createBitmap(
-            boxBitmap,
-            0,
-            2 * lineHeight,
-            boxWidth,
-            boxHeight - 2 * lineHeight
-        )
+        val croppedBoxBitmap =
+            Bitmap.createBitmap(boxBitmap, 0, 2 * lineHeight, boxWidth, boxHeight - 2 * lineHeight)
         croppedBoxBitmap.asImageBitmap().assertContainsColor(Color.Red)
     }
 }
diff --git a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/TextPreparedSelectionTest.kt b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/TextPreparedSelectionTest.kt
index 78956dc..9f6cd5a 100644
--- a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/TextPreparedSelectionTest.kt
+++ b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/TextPreparedSelectionTest.kt
@@ -36,8 +36,7 @@
 @RunWith(AndroidJUnit4::class)
 @MediumTest
 class TextPreparedSelectionTest {
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
     @Test
     fun textSelection_leftRightMovements() {
@@ -210,22 +209,16 @@
         val prepared: BaseTextPreparedSelection<T>
     ) {
         fun expectedText(text: String) {
-            rule.runOnIdle {
-                Truth.assertThat(prepared.text).isEqualTo(text)
-            }
+            rule.runOnIdle { Truth.assertThat(prepared.text).isEqualTo(text) }
         }
 
         fun expectedSelection(selection: TextRange) {
-            rule.runOnIdle {
-                Truth.assertThat(prepared.selection).isEqualTo(selection)
-            }
+            rule.runOnIdle { Truth.assertThat(prepared.selection).isEqualTo(selection) }
         }
 
-        fun cursorAt(char: Char) =
-            TextRange(prepared.text.indexOf(char))
+        fun cursorAt(char: Char) = TextRange(prepared.text.indexOf(char))
 
-        fun cursorAfter(char: Char) =
-            TextRange(prepared.text.indexOf(char) + 1)
+        fun cursorAfter(char: Char) = TextRange(prepared.text.indexOf(char) + 1)
     }
 
     private fun selectionTest(
@@ -235,11 +228,12 @@
         test: SelectionScope<TextPreparedSelection>.(TextPreparedSelection) -> Unit
     ) {
         var textLayout: TextLayoutResult? = null
-        val direction = if (rtl) {
-            LayoutDirection.Rtl
-        } else {
-            LayoutDirection.Ltr
-        }
+        val direction =
+            if (rtl) {
+                LayoutDirection.Rtl
+            } else {
+                LayoutDirection.Ltr
+            }
         rule.setContent {
             CompositionLocalProvider(LocalLayoutDirection provides direction) {
                 BasicText(
@@ -250,11 +244,12 @@
             }
         }
 
-        val prepared = TextPreparedSelection(
-            originalText = AnnotatedString(initText),
-            originalSelection = initSelection,
-            layoutResult = textLayout!!
-        )
+        val prepared =
+            TextPreparedSelection(
+                originalText = AnnotatedString(initText),
+                originalSelection = initSelection,
+                layoutResult = textLayout!!
+            )
 
         test(SelectionScope(prepared), prepared)
     }
diff --git a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/TextStyleInvalidationTest.kt b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/TextStyleInvalidationTest.kt
index 43d1d2b..50278b3 100644
--- a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/TextStyleInvalidationTest.kt
+++ b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/TextStyleInvalidationTest.kt
@@ -69,232 +69,244 @@
         override fun toString(): String = buildString {
             append(description)
             listOfNotNull(
-                "measure".takeIf { invalidatesMeasure },
-                "placement".takeIf { invalidatesPlacement },
-                "draw".takeIf { invalidatesDraw },
-            ).joinTo(this, prefix = " ", separator = ", ") { "invalidates $it" }
+                    "measure".takeIf { invalidatesMeasure },
+                    "placement".takeIf { invalidatesPlacement },
+                    "draw".takeIf { invalidatesDraw },
+                )
+                .joinTo(this, prefix = " ", separator = ", ") { "invalidates $it" }
         }
     }
 
     companion object {
         @Parameters(name = "{0}")
         @JvmStatic
-        fun parameters() = arrayOf(
-            Config("nothing", { it }, recompose = false),
-            Config(
-                "color",
-                { it.copy(color = Color.Blue) },
-                invalidatesDraw = true,
-            ),
-            Config(
-                "to brush",
-                { it.copy(brush = Brush.verticalGradient(0f to Color.Blue, 1f to Color.Magenta)) },
-                invalidatesDraw = true,
-            ),
-            Config(
-                "from brush to brush",
-                initializeStyle = {
-                    it.copy(brush = Brush.verticalGradient(0f to Color.Black, 1f to Color.Magenta))
-                },
-                updateStyle = {
-                    it.copy(brush = Brush.verticalGradient(0f to Color.Blue, 1f to Color.Magenta))
-                },
-                invalidatesDraw = true,
-            ),
-            Config(
-                "alpha",
-                initializeStyle = {
-                    it.copy(
-                        alpha = 1f,
-                        brush = Brush.verticalGradient(0f to Color.Blue, 1f to Color.Magenta)
-                    )
-                },
-                updateStyle = { it.copy(alpha = 0.5f, brush = it.brush) },
-                invalidatesDraw = true,
-            ),
-            Config(
-                "fontSize",
-                { it.copy(fontSize = it.fontSize * 2) },
-                invalidatesMeasure = true,
-                invalidatesDraw = true,
-            ),
-            Config(
-                "fontWeight",
-                { it.copy(fontWeight = FontWeight(it.fontWeight!!.weight * 2)) },
-                invalidatesMeasure = true,
-                invalidatesDraw = true,
-            ),
-            Config(
-                "fontStyle",
-                { it.copy(fontStyle = FontStyle.Italic) },
-                invalidatesMeasure = true,
-                invalidatesDraw = true
-            ),
-            Config(
-                "fontSynthesis",
-                { it.copy(fontSynthesis = FontSynthesis.All) },
-                invalidatesMeasure = true,
-                invalidatesDraw = true,
-            ),
-            Config(
-                "fontFamily",
-                { it.copy(fontFamily = FontFamily.Cursive) },
-                invalidatesMeasure = true,
-                invalidatesDraw = true,
-            ),
-            Config(
-                "fontFeatureSettings",
-                initializeStyle = { it.copy(fontFeatureSettings = "a") },
-                updateStyle = { it.copy(fontFeatureSettings = "b") },
-                invalidatesMeasure = true,
-                invalidatesDraw = true,
-            ),
-            Config(
-                "letterSpacing",
-                { it.copy(letterSpacing = it.letterSpacing * 2) },
-                invalidatesMeasure = true,
-                invalidatesDraw = true,
-            ),
-            Config(
-                "baselineShift",
-                { it.copy(baselineShift = BaselineShift.Superscript) },
-                invalidatesMeasure = true,
-                invalidatesDraw = true,
-            ),
-            Config(
-                "textGeometricTransform",
-                { it.copy(textGeometricTransform = TextGeometricTransform(scaleX = 2f)) },
-                invalidatesMeasure = true,
-                invalidatesDraw = true,
-            ),
-            Config(
-                "localeList",
-                initializeStyle = { it.copy(localeList = LocaleList("en-US")) },
-                updateStyle = { it.copy(localeList = LocaleList("en-GB")) },
-                invalidatesMeasure = true,
-                invalidatesDraw = true,
-            ),
-            Config(
-                "background",
-                { it.copy(background = Color.Blue) },
-                invalidatesDraw = true,
-            ),
-            Config(
-                "textDecoration",
-                { it.copy(textDecoration = TextDecoration.LineThrough) },
-                invalidatesDraw = true,
-            ),
-            Config(
-                "to shadow",
-                { it.copy(shadow = Shadow(Color.Black, blurRadius = 4f)) },
-                invalidatesDraw = true,
-            ),
-            Config(
-                "from shadow to shadow",
-                initializeStyle = { it.copy(shadow = Shadow(Color.Black, blurRadius = 1f)) },
-                updateStyle = { it.copy(shadow = Shadow(Color.Black, blurRadius = 4f)) },
-                invalidatesDraw = true,
-            ),
-            Config(
-                "to drawStyle",
-                { it.copy(drawStyle = Stroke(width = 1f)) },
-                invalidatesDraw = true,
-            ),
-            Config(
-                "from drawStyle to drawStyle",
-                initializeStyle = { it.copy(drawStyle = Stroke(width = 0f)) },
-                updateStyle = { it.copy(drawStyle = Stroke(width = 1f)) },
-                invalidatesDraw = true,
-            ),
-            Config(
-                "textAlign",
-                { it.copy(textAlign = TextAlign.Justify) },
-                invalidatesDraw = true,
-            ),
-            Config(
-                "textDirection",
-                { it.copy(textDirection = TextDirection.Rtl) },
-                invalidatesDraw = true,
-            ),
-            Config(
-                "lineHeight",
-                { it.copy(lineHeight = it.lineHeight * 2) },
-                invalidatesMeasure = true,
-                invalidatesDraw = true,
-            ),
-            Config(
-                "textIndent",
-                { it.copy(textIndent = TextIndent(firstLine = 5.sp)) },
-                invalidatesMeasure = true,
-                invalidatesDraw = true,
-            ),
-            Config(
-                "platformStyle",
-                initializeStyle = {
-                    it.copy(platformStyle = PlatformTextStyle(includeFontPadding = true))
-                },
-                updateStyle = {
-                    it.copy(platformStyle = PlatformTextStyle(includeFontPadding = false))
-                },
-                invalidatesMeasure = true,
-                invalidatesDraw = true,
-            ),
-            Config(
-                "lineHeightStyle",
-                {
-                    it.copy(
-                        lineHeightStyle = LineHeightStyle(
-                            alignment = LineHeightStyle.Alignment.Center,
-                            trim = LineHeightStyle.Trim.FirstLineTop
+        fun parameters() =
+            arrayOf(
+                Config("nothing", { it }, recompose = false),
+                Config(
+                    "color",
+                    { it.copy(color = Color.Blue) },
+                    invalidatesDraw = true,
+                ),
+                Config(
+                    "to brush",
+                    {
+                        it.copy(
+                            brush = Brush.verticalGradient(0f to Color.Blue, 1f to Color.Magenta)
                         )
-                    )
-                },
-                invalidatesMeasure = true,
-                invalidatesDraw = true,
-            ),
-            Config(
-                "lineBreak",
-                { it.copy(lineBreak = LineBreak.Heading) },
-                invalidatesMeasure = true,
-                invalidatesDraw = true,
-            ),
-            Config(
-                "hyphens",
-                { it.copy(hyphens = Hyphens.Auto) },
-                invalidatesMeasure = true,
-                invalidatesDraw = true,
-            ),
-        )
+                    },
+                    invalidatesDraw = true,
+                ),
+                Config(
+                    "from brush to brush",
+                    initializeStyle = {
+                        it.copy(
+                            brush = Brush.verticalGradient(0f to Color.Black, 1f to Color.Magenta)
+                        )
+                    },
+                    updateStyle = {
+                        it.copy(
+                            brush = Brush.verticalGradient(0f to Color.Blue, 1f to Color.Magenta)
+                        )
+                    },
+                    invalidatesDraw = true,
+                ),
+                Config(
+                    "alpha",
+                    initializeStyle = {
+                        it.copy(
+                            alpha = 1f,
+                            brush = Brush.verticalGradient(0f to Color.Blue, 1f to Color.Magenta)
+                        )
+                    },
+                    updateStyle = { it.copy(alpha = 0.5f, brush = it.brush) },
+                    invalidatesDraw = true,
+                ),
+                Config(
+                    "fontSize",
+                    { it.copy(fontSize = it.fontSize * 2) },
+                    invalidatesMeasure = true,
+                    invalidatesDraw = true,
+                ),
+                Config(
+                    "fontWeight",
+                    { it.copy(fontWeight = FontWeight(it.fontWeight!!.weight * 2)) },
+                    invalidatesMeasure = true,
+                    invalidatesDraw = true,
+                ),
+                Config(
+                    "fontStyle",
+                    { it.copy(fontStyle = FontStyle.Italic) },
+                    invalidatesMeasure = true,
+                    invalidatesDraw = true
+                ),
+                Config(
+                    "fontSynthesis",
+                    { it.copy(fontSynthesis = FontSynthesis.All) },
+                    invalidatesMeasure = true,
+                    invalidatesDraw = true,
+                ),
+                Config(
+                    "fontFamily",
+                    { it.copy(fontFamily = FontFamily.Cursive) },
+                    invalidatesMeasure = true,
+                    invalidatesDraw = true,
+                ),
+                Config(
+                    "fontFeatureSettings",
+                    initializeStyle = { it.copy(fontFeatureSettings = "a") },
+                    updateStyle = { it.copy(fontFeatureSettings = "b") },
+                    invalidatesMeasure = true,
+                    invalidatesDraw = true,
+                ),
+                Config(
+                    "letterSpacing",
+                    { it.copy(letterSpacing = it.letterSpacing * 2) },
+                    invalidatesMeasure = true,
+                    invalidatesDraw = true,
+                ),
+                Config(
+                    "baselineShift",
+                    { it.copy(baselineShift = BaselineShift.Superscript) },
+                    invalidatesMeasure = true,
+                    invalidatesDraw = true,
+                ),
+                Config(
+                    "textGeometricTransform",
+                    { it.copy(textGeometricTransform = TextGeometricTransform(scaleX = 2f)) },
+                    invalidatesMeasure = true,
+                    invalidatesDraw = true,
+                ),
+                Config(
+                    "localeList",
+                    initializeStyle = { it.copy(localeList = LocaleList("en-US")) },
+                    updateStyle = { it.copy(localeList = LocaleList("en-GB")) },
+                    invalidatesMeasure = true,
+                    invalidatesDraw = true,
+                ),
+                Config(
+                    "background",
+                    { it.copy(background = Color.Blue) },
+                    invalidatesDraw = true,
+                ),
+                Config(
+                    "textDecoration",
+                    { it.copy(textDecoration = TextDecoration.LineThrough) },
+                    invalidatesDraw = true,
+                ),
+                Config(
+                    "to shadow",
+                    { it.copy(shadow = Shadow(Color.Black, blurRadius = 4f)) },
+                    invalidatesDraw = true,
+                ),
+                Config(
+                    "from shadow to shadow",
+                    initializeStyle = { it.copy(shadow = Shadow(Color.Black, blurRadius = 1f)) },
+                    updateStyle = { it.copy(shadow = Shadow(Color.Black, blurRadius = 4f)) },
+                    invalidatesDraw = true,
+                ),
+                Config(
+                    "to drawStyle",
+                    { it.copy(drawStyle = Stroke(width = 1f)) },
+                    invalidatesDraw = true,
+                ),
+                Config(
+                    "from drawStyle to drawStyle",
+                    initializeStyle = { it.copy(drawStyle = Stroke(width = 0f)) },
+                    updateStyle = { it.copy(drawStyle = Stroke(width = 1f)) },
+                    invalidatesDraw = true,
+                ),
+                Config(
+                    "textAlign",
+                    { it.copy(textAlign = TextAlign.Justify) },
+                    invalidatesDraw = true,
+                ),
+                Config(
+                    "textDirection",
+                    { it.copy(textDirection = TextDirection.Rtl) },
+                    invalidatesDraw = true,
+                ),
+                Config(
+                    "lineHeight",
+                    { it.copy(lineHeight = it.lineHeight * 2) },
+                    invalidatesMeasure = true,
+                    invalidatesDraw = true,
+                ),
+                Config(
+                    "textIndent",
+                    { it.copy(textIndent = TextIndent(firstLine = 5.sp)) },
+                    invalidatesMeasure = true,
+                    invalidatesDraw = true,
+                ),
+                Config(
+                    "platformStyle",
+                    initializeStyle = {
+                        it.copy(platformStyle = PlatformTextStyle(includeFontPadding = true))
+                    },
+                    updateStyle = {
+                        it.copy(platformStyle = PlatformTextStyle(includeFontPadding = false))
+                    },
+                    invalidatesMeasure = true,
+                    invalidatesDraw = true,
+                ),
+                Config(
+                    "lineHeightStyle",
+                    {
+                        it.copy(
+                            lineHeightStyle =
+                                LineHeightStyle(
+                                    alignment = LineHeightStyle.Alignment.Center,
+                                    trim = LineHeightStyle.Trim.FirstLineTop
+                                )
+                        )
+                    },
+                    invalidatesMeasure = true,
+                    invalidatesDraw = true,
+                ),
+                Config(
+                    "lineBreak",
+                    { it.copy(lineBreak = LineBreak.Heading) },
+                    invalidatesMeasure = true,
+                    invalidatesDraw = true,
+                ),
+                Config(
+                    "hyphens",
+                    { it.copy(hyphens = Hyphens.Auto) },
+                    invalidatesMeasure = true,
+                    invalidatesDraw = true,
+                ),
+            )
     }
 
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
     @Test
     fun changing() {
         // Don't leave any TextUnits Unspecified so test cases can double them to invalidate.
-        var style by mutableStateOf(
-            TextStyle(
-                color = Color.Black,
-                fontSize = 12.sp,
-                fontWeight = FontWeight.Normal,
-                fontStyle = null,
-                fontSynthesis = null,
-                fontFamily = TEST_FONT_FAMILY,
-                fontFeatureSettings = null,
-                letterSpacing = 12.sp,
-                baselineShift = null,
-                textGeometricTransform = null,
-                localeList = null,
-                background = Color.White,
-                textDecoration = null,
-                shadow = null,
-                textAlign = TextAlign.Start,
-                textDirection = TextDirection.Ltr,
-                lineHeight = 12.sp,
-                textIndent = null,
-            ).let(config.initializeStyle)
-        )
+        var style by
+            mutableStateOf(
+                TextStyle(
+                        color = Color.Black,
+                        fontSize = 12.sp,
+                        fontWeight = FontWeight.Normal,
+                        fontStyle = null,
+                        fontSynthesis = null,
+                        fontFamily = TEST_FONT_FAMILY,
+                        fontFeatureSettings = null,
+                        letterSpacing = 12.sp,
+                        baselineShift = null,
+                        textGeometricTransform = null,
+                        localeList = null,
+                        background = Color.White,
+                        textDecoration = null,
+                        shadow = null,
+                        textAlign = TextAlign.Start,
+                        textDirection = TextDirection.Ltr,
+                        lineHeight = 12.sp,
+                        textIndent = null,
+                    )
+                    .let(config.initializeStyle)
+            )
         var compositions = 0
         var measures = 0
         var placements = 0
@@ -304,18 +316,16 @@
             BasicText(
                 "a",
                 style = style,
-                modifier = Modifier
-                    .layout { measurable, constraints ->
-                        measures++
-                        val placeable = measurable.measure(constraints)
-                        layout(placeable.width, placeable.height) {
-                            placements++
-                            placeable.place(IntOffset.Zero)
+                modifier =
+                    Modifier.layout { measurable, constraints ->
+                            measures++
+                            val placeable = measurable.measure(constraints)
+                            layout(placeable.width, placeable.height) {
+                                placements++
+                                placeable.place(IntOffset.Zero)
+                            }
                         }
-                    }
-                    .drawBehind {
-                        draws++
-                    }
+                        .drawBehind { draws++ }
             )
             compositions++
         }
@@ -335,17 +345,18 @@
 
             if (config.invalidatesMeasure) {
                 assertWithMessage("invalidate measure")
-                    .that(measures).isGreaterThan(initialMeasures)
+                    .that(measures)
+                    .isGreaterThan(initialMeasures)
             }
             if (config.invalidatesPlacement) {
                 assertWithMessage("invalidate placements")
-                    .that(placements).isGreaterThan(initialPlacements)
+                    .that(placements)
+                    .isGreaterThan(initialPlacements)
 
                 // If measure is invalidated, placement will also always be invalidated, so ensure
                 // that placement was also invalidated separately from measurement.
                 if (config.invalidatesMeasure) {
-                    assertWithMessage("invalidate measure")
-                        .that(placements).isGreaterThan(measures)
+                    assertWithMessage("invalidate measure").that(placements).isGreaterThan(measures)
                 }
             }
             if (config.invalidatesDraw) {
diff --git a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/TextTestExtensions.kt b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/TextTestExtensions.kt
index 5cacf47..6a5fff7 100644
--- a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/TextTestExtensions.kt
+++ b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/TextTestExtensions.kt
@@ -30,46 +30,33 @@
 
 fun Float.toIntPx(): Int = ceil(this).roundToInt()
 
-val TEST_FONT = Font(
-    resId = R.font.sample_font,
-    weight = FontWeight.Normal,
-    style = FontStyle.Normal
-)
+val TEST_FONT =
+    Font(resId = R.font.sample_font, weight = FontWeight.Normal, style = FontStyle.Normal)
 
 val TEST_FONT_FAMILY = TEST_FONT.toFontFamily()
 
-/**
- * Insert the given [string] at the given [index].
- */
+/** Insert the given [string] at the given [index]. */
 internal fun String.insert(index: Int, string: String): String {
     return substring(0, index) + string + substring(index)
 }
 
-/**
- * Helper function that returns the minimal [Rect] which contains the given [substring].
- */
+/** Helper function that returns the minimal [Rect] which contains the given [substring]. */
 internal fun TextLayoutResult.boundingBoxOf(substring: String): Rect {
     val index = layoutInput.text.indexOf(substring)
 
     return boundingBoxOf(*Array(substring.length) { getBoundingBox(index + it) })
 }
 
-/**
- * Convert an Offset to android PointF.
- */
+/** Convert an Offset to android PointF. */
 internal fun Offset.toPointF(): PointF = PointF(x, y)
 
-/**
- * Helper function that returns the [TextRange] of the given string.
- */
+/** Helper function that returns the [TextRange] of the given string. */
 internal fun CharSequence.rangeOf(string: String): TextRange {
     val index = indexOf(string)
     return TextRange(index, index + string.length)
 }
 
-/**
- * Helper function that returns the minimal [Rect] which contains all the given [rects].
- */
+/** Helper function that returns the minimal [Rect] which contains all the given [rects]. */
 private fun boundingBoxOf(vararg rects: Rect): Rect {
     return Rect(
         left = rects.minOf { it.left },
diff --git a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/TextUsingModifierMinMaxLinesTest.kt b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/TextUsingModifierMinMaxLinesTest.kt
index 5b88a91..9c24370 100644
--- a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/TextUsingModifierMinMaxLinesTest.kt
+++ b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/TextUsingModifierMinMaxLinesTest.kt
@@ -35,8 +35,7 @@
 @LargeTest
 @RunWith(AndroidJUnit4::class)
 class TextUsingModifierMinMaxLinesTest {
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
     @Test
     fun whenMaxLines_isBoundOnLineHeight() {
@@ -48,30 +47,18 @@
         val textStyle = TextStyle(fontFamily = TEST_FONT_FAMILY)
         rule.setContent {
             for (i in sizes.indices) {
-                Box(
-                    Modifier
-                        .onSizeChanged { sizes[i] = it }
-                        .width(5.dp)) {
+                Box(Modifier.onSizeChanged { sizes[i] = it }.width(5.dp)) {
                     BasicText(
                         text,
                         style = textStyle,
                         maxLines = i + 1,
-                        onTextLayout = {
-                            layouts[i] = it
-                        }
+                        onTextLayout = { layouts[i] = it }
                     )
                 }
             }
 
-            Box(
-                Modifier
-                    .onSizeChanged { unboundedTextSize = it }
-                    .width(5.dp)) {
-                BasicText(
-                    text,
-                    style = textStyle,
-                    maxLines = Int.MAX_VALUE
-                )
+            Box(Modifier.onSizeChanged { unboundedTextSize = it }.width(5.dp)) {
+                BasicText(text, style = textStyle, maxLines = Int.MAX_VALUE)
             }
         }
         rule.runOnIdle {
@@ -94,29 +81,18 @@
         val textStyle = TextStyle(fontFamily = TEST_FONT_FAMILY)
         rule.setContent {
             for (i in sizes.indices) {
-                Box(
-                    Modifier
-                        .onSizeChanged { sizes[i] = it }
-                        .width(5.dp)) {
+                Box(Modifier.onSizeChanged { sizes[i] = it }.width(5.dp)) {
                     BasicText(
                         text,
                         style = textStyle,
                         minLines = i + 1,
-                        onTextLayout = {
-                            layouts[i] = it
-                        }
+                        onTextLayout = { layouts[i] = it }
                     )
                 }
             }
 
-            Box(
-                Modifier
-                    .onSizeChanged { unboundedTextSize = it }
-                    .width(5.dp)) {
-                BasicText(
-                    text,
-                    style = textStyle
-                )
+            Box(Modifier.onSizeChanged { unboundedTextSize = it }.width(5.dp)) {
+                BasicText(text, style = textStyle)
             }
         }
         rule.runOnIdle {
@@ -131,22 +107,16 @@
 
     @Test(expected = IllegalArgumentException::class)
     fun negativeMinLines_throws() {
-        rule.setContent {
-            BasicText(text = "", minLines = -1)
-        }
+        rule.setContent { BasicText(text = "", minLines = -1) }
     }
 
     @Test(expected = IllegalArgumentException::class)
     fun negativeMaxLines_throws() {
-        rule.setContent {
-            BasicText(text = "", maxLines = -1)
-        }
+        rule.setContent { BasicText(text = "", maxLines = -1) }
     }
 
     @Test(expected = IllegalArgumentException::class)
     fun crossedMinMaxLines_throws() {
-        rule.setContent {
-            BasicText(text = "", minLines = 10, maxLines = 5)
-        }
+        rule.setContent { BasicText(text = "", minLines = 10, maxLines = 5) }
     }
 }
diff --git a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/input/BasicSecureTextFieldTest.kt b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/input/BasicSecureTextFieldTest.kt
index 0aa4592..4b09568 100644
--- a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/input/BasicSecureTextFieldTest.kt
+++ b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/input/BasicSecureTextFieldTest.kt
@@ -65,13 +65,9 @@
 
     // Keyboard shortcut tests for BasicSecureTextField are in TextFieldKeyEventTest
 
-    @get:Rule
-    val rule = createComposeRule().apply {
-        mainClock.autoAdvance = false
-    }
+    @get:Rule val rule = createComposeRule().apply { mainClock.autoAdvance = false }
 
-    @get:Rule
-    val immRule = ComposeInputMethodManagerTestRule()
+    @get:Rule val immRule = ComposeInputMethodManagerTestRule()
 
     private val inputMethodInterceptor = InputMethodInterceptor(rule)
 
@@ -87,9 +83,7 @@
     fun passwordSemanticsAreSet() {
         inputMethodInterceptor.setContent {
             BasicSecureTextField(
-                state = remember {
-                    TextFieldState("Hello", initialSelection = TextRange(0, 1))
-                },
+                state = remember { TextFieldState("Hello", initialSelection = TextRange(0, 1)) },
                 modifier = Modifier.testTag(Tag)
             )
         }
@@ -106,10 +100,7 @@
     @Test
     fun lastTypedCharacterIsRevealedTemporarily() {
         inputMethodInterceptor.setContent {
-            BasicSecureTextField(
-                state = rememberTextFieldState(),
-                modifier = Modifier.testTag(Tag)
-            )
+            BasicSecureTextField(state = rememberTextFieldState(), modifier = Modifier.testTag(Tag))
         }
 
         with(rule.onNodeWithTag(Tag)) {
@@ -124,10 +115,7 @@
     @Test
     fun lastTypedCharacterIsRevealed_hidesAfterAnotherCharacterIsTyped() {
         inputMethodInterceptor.setContent {
-            BasicSecureTextField(
-                state = rememberTextFieldState(),
-                modifier = Modifier.testTag(Tag)
-            )
+            BasicSecureTextField(state = rememberTextFieldState(), modifier = Modifier.testTag(Tag))
         }
 
         with(rule.onNodeWithTag(Tag)) {
@@ -144,10 +132,7 @@
     @Test
     fun lastTypedCharacterIsRevealed_whenInsertedInMiddle() {
         inputMethodInterceptor.setContent {
-            BasicSecureTextField(
-                state = rememberTextFieldState(),
-                modifier = Modifier.testTag(Tag)
-            )
+            BasicSecureTextField(state = rememberTextFieldState(), modifier = Modifier.testTag(Tag))
         }
 
         with(rule.onNodeWithTag(Tag)) {
@@ -171,12 +156,7 @@
                     state = rememberTextFieldState(),
                     modifier = Modifier.testTag(Tag)
                 )
-                Box(
-                    modifier = Modifier
-                        .size(1.dp)
-                        .testTag("otherFocusable")
-                        .focusable()
-                )
+                Box(modifier = Modifier.size(1.dp).testTag("otherFocusable").focusable())
             }
         }
 
@@ -184,8 +164,7 @@
             performTextInput("a")
             rule.mainClock.advanceTimeBy(200)
             assertThat(fetchTextLayoutResult().layoutInput.text.text).isEqualTo("a")
-            rule.onNodeWithTag("otherFocusable")
-                .requestFocus()
+            rule.onNodeWithTag("otherFocusable").requestFocus()
             rule.mainClock.advanceTimeBy(50)
             assertThat(fetchTextLayoutResult().layoutInput.text.text).isEqualTo("\u2022")
         }
@@ -194,10 +173,7 @@
     @Test
     fun lastTypedCharacterIsRevealed_hidesAfterAnotherCharacterRemoved() {
         inputMethodInterceptor.setContent {
-            BasicSecureTextField(
-                state = rememberTextFieldState(),
-                modifier = Modifier.testTag(Tag)
-            )
+            BasicSecureTextField(state = rememberTextFieldState(), modifier = Modifier.testTag(Tag))
         }
 
         with(rule.onNodeWithTag(Tag)) {
@@ -226,11 +202,9 @@
         with(rule.onNodeWithTag(Tag)) {
             performTextInput("abc")
             rule.mainClock.advanceTimeBy(200)
-            assertThat(fetchTextLayoutResult().layoutInput.text.text)
-                .isEqualTo("abc")
+            assertThat(fetchTextLayoutResult().layoutInput.text.text).isEqualTo("abc")
             rule.mainClock.advanceTimeBy(1500)
-            assertThat(fetchTextLayoutResult().layoutInput.text.text)
-                .isEqualTo("abc")
+            assertThat(fetchTextLayoutResult().layoutInput.text.text).isEqualTo("abc")
         }
     }
 
@@ -252,8 +226,7 @@
                 .isEqualTo("\u2022\u2022\u2022")
             obfuscationMode = TextObfuscationMode.Visible
             rule.mainClock.advanceTimeByFrame()
-            assertThat(fetchTextLayoutResult().layoutInput.text.text)
-                .isEqualTo("abc")
+            assertThat(fetchTextLayoutResult().layoutInput.text.text).isEqualTo("abc")
         }
     }
 
@@ -293,8 +266,7 @@
         with(rule.onNodeWithTag(Tag)) {
             performTextInput("abc")
             rule.mainClock.advanceTimeByFrame()
-            assertThat(fetchTextLayoutResult().layoutInput.text.text)
-                .isEqualTo("abc")
+            assertThat(fetchTextLayoutResult().layoutInput.text.text).isEqualTo("abc")
             obfuscationMode = TextObfuscationMode.Hidden
             rule.mainClock.advanceTimeByFrame()
             assertThat(fetchTextLayoutResult().layoutInput.text.text)
@@ -316,12 +288,10 @@
         with(rule.onNodeWithTag(Tag)) {
             performTextInput("abc")
             rule.mainClock.advanceTimeByFrame()
-            assertThat(fetchTextLayoutResult().layoutInput.text.text)
-                .isEqualTo("&&&")
+            assertThat(fetchTextLayoutResult().layoutInput.text.text).isEqualTo("&&&")
             performTextInput("d")
             rule.mainClock.advanceTimeByFrame()
-            assertThat(fetchTextLayoutResult().layoutInput.text.text)
-                .isEqualTo("&&&&")
+            assertThat(fetchTextLayoutResult().layoutInput.text.text).isEqualTo("&&&&")
         }
     }
 
@@ -360,12 +330,10 @@
         with(rule.onNodeWithTag(Tag)) {
             performTextInput("abc")
             rule.mainClock.advanceTimeByFrame()
-            assertThat(fetchTextLayoutResult().layoutInput.text.text)
-                .isEqualTo("***")
+            assertThat(fetchTextLayoutResult().layoutInput.text.text).isEqualTo("***")
             character = '&'
             rule.mainClock.advanceTimeByFrame()
-            assertThat(fetchTextLayoutResult().layoutInput.text.text)
-                .isEqualTo("&&&")
+            assertThat(fetchTextLayoutResult().layoutInput.text.text).isEqualTo("&&&")
         }
     }
 
@@ -405,19 +373,14 @@
         val clipboardManager = FakeClipboardManager("initial")
         inputMethodInterceptor.setContent {
             CompositionLocalProvider(LocalClipboardManager provides clipboardManager) {
-                BasicSecureTextField(
-                    state = state,
-                    modifier = Modifier.testTag(Tag)
-                )
+                BasicSecureTextField(state = state, modifier = Modifier.testTag(Tag))
             }
         }
 
         rule.onNodeWithTag(Tag).performTextInputSelection(TextRange(0, 5))
         rule.onNodeWithTag(Tag).performSemanticsAction(SemanticsActions.CopyText)
 
-        rule.runOnIdle {
-            assertThat(clipboardManager.getText()?.toString()).isEqualTo("initial")
-        }
+        rule.runOnIdle { assertThat(clipboardManager.getText()?.toString()).isEqualTo("initial") }
     }
 
     @OptIn(ExperimentalTestApi::class)
@@ -427,10 +390,7 @@
         val clipboardManager = FakeClipboardManager("initial")
         inputMethodInterceptor.setContent {
             CompositionLocalProvider(LocalClipboardManager provides clipboardManager) {
-                BasicSecureTextField(
-                    state = state,
-                    modifier = Modifier.testTag(Tag)
-                )
+                BasicSecureTextField(state = state, modifier = Modifier.testTag(Tag))
             }
         }
 
@@ -448,21 +408,19 @@
         var copyOptionAvailable = false
         var cutOptionAvailable = false
         var showMenuRequested = false
-        val textToolbar = FakeTextToolbar(
-            onShowMenu = { _, onCopyRequested, _, onCutRequested, _ ->
-                showMenuRequested = true
-                copyOptionAvailable = onCopyRequested != null
-                cutOptionAvailable = onCutRequested != null
-            },
-            onHideMenu = {}
-        )
+        val textToolbar =
+            FakeTextToolbar(
+                onShowMenu = { _, onCopyRequested, _, onCutRequested, _ ->
+                    showMenuRequested = true
+                    copyOptionAvailable = onCopyRequested != null
+                    cutOptionAvailable = onCutRequested != null
+                },
+                onHideMenu = {}
+            )
         val state = TextFieldState("Hello")
         inputMethodInterceptor.setContent {
             CompositionLocalProvider(LocalTextToolbar provides textToolbar) {
-                BasicSecureTextField(
-                    state = state,
-                    modifier = Modifier.testTag(Tag)
-                )
+                BasicSecureTextField(state = state, modifier = Modifier.testTag(Tag))
             }
         }
 
@@ -483,10 +441,7 @@
     fun inputMethod_doesNotRestart_inResponseToKeyEvents() {
         val state = TextFieldState("hello", initialSelection = TextRange(5))
         inputMethodInterceptor.setContent {
-            BasicSecureTextField(
-                state = state,
-                modifier = Modifier.testTag(Tag)
-            )
+            BasicSecureTextField(state = state, modifier = Modifier.testTag(Tag))
         }
 
         with(rule.onNodeWithTag(Tag)) {
diff --git a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/input/BasicTextFieldDrawPhaseToggleTest.kt b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/input/BasicTextFieldDrawPhaseToggleTest.kt
index d06b95c..9b3cb56 100644
--- a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/input/BasicTextFieldDrawPhaseToggleTest.kt
+++ b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/input/BasicTextFieldDrawPhaseToggleTest.kt
@@ -45,16 +45,12 @@
 
 class BasicTextFieldDrawPhaseToggleTest {
 
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
     private lateinit var state: TextFieldState
 
     private val fontSize = 20.sp
-    private val textStyle = TextStyle(
-        fontSize = fontSize,
-        fontFamily = TEST_FONT_FAMILY
-    )
+    private val textStyle = TextStyle(fontSize = fontSize, fontFamily = TEST_FONT_FAMILY)
 
     @Test
     @SdkSuppress(minSdkVersion = Build.VERSION_CODES.O)
@@ -69,7 +65,8 @@
             )
         }
 
-        rule.onNode(hasSetTextAction())
+        rule
+            .onNode(hasSetTextAction())
             .captureToImage()
             .assertContainsColor(Color.Red)
             .assertContainsColor(Color.White)
@@ -77,7 +74,8 @@
 
         color = Color.Blue
 
-        rule.onNode(hasSetTextAction())
+        rule
+            .onNode(hasSetTextAction())
             .captureToImage()
             .assertContainsColor(Color.Blue)
             .assertContainsColor(Color.White)
@@ -88,9 +86,10 @@
     @SdkSuppress(minSdkVersion = Build.VERSION_CODES.O)
     fun brushChange_reflectsOnView() {
         state = TextFieldState("abc")
-        var brush by mutableStateOf(
-            Brush.linearGradient(listOf(Color.Red, Color.Blue), end = Offset(20f, 20f))
-        )
+        var brush by
+            mutableStateOf(
+                Brush.linearGradient(listOf(Color.Red, Color.Blue), end = Offset(20f, 20f))
+            )
         rule.setContent {
             BasicTextField(
                 state = state,
@@ -100,21 +99,17 @@
             )
         }
 
-        rule.onNode(hasSetTextAction())
-            .captureToImage()
-            .assertPixelConsistency { color ->
-                // gradient should not contain any discernible level of green channel
-                color.green <= 0.02f
-            }
+        rule.onNode(hasSetTextAction()).captureToImage().assertPixelConsistency { color ->
+            // gradient should not contain any discernible level of green channel
+            color.green <= 0.02f
+        }
 
         brush = Brush.linearGradient(listOf(Color.Red, Color.Green), end = Offset(20f, 20f))
 
-        rule.onNode(hasSetTextAction())
-            .captureToImage()
-            .assertPixelConsistency { color ->
-                // gradient should not contain any discernible level of blue channel
-                color.blue <= 0.02f
-            }
+        rule.onNode(hasSetTextAction()).captureToImage().assertPixelConsistency { color ->
+            // gradient should not contain any discernible level of blue channel
+            color.blue <= 0.02f
+        }
     }
 
     @Test
@@ -130,11 +125,9 @@
             )
         }
 
-        rule.onNode(hasSetTextAction())
-            .captureToImage()
-            .assertPixelConsistency { color ->
-                color == Color.White
-            }
+        rule.onNode(hasSetTextAction()).captureToImage().assertPixelConsistency { color ->
+            color == Color.White
+        }
 
         shadow = Shadow(blurRadius = 8f)
 
@@ -155,9 +148,7 @@
         rule.setContent {
             BasicTextField(
                 state = state,
-                textStyle = textStyle.copy(
-                    textDecoration = textDecoration
-                ),
+                textStyle = textStyle.copy(textDecoration = textDecoration),
                 modifier = Modifier.background(Color.White)
             )
         }
@@ -180,9 +171,7 @@
  * Instead of looking for an exact match of pixel values, this assertion provides the ability to
  * judge each pixel individually to whether it fits a predefined filter.
  */
-internal inline fun ImageBitmap.assertPixelConsistency(
-    filter: (color: Color) -> Boolean
-) {
+internal inline fun ImageBitmap.assertPixelConsistency(filter: (color: Color) -> Boolean) {
     val pixel = toPixelMap()
     for (x in 0 until width) {
         for (y in 0 until height) {
diff --git a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/input/BasicTextFieldHandwritingGestureTest.kt b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/input/BasicTextFieldHandwritingGestureTest.kt
index e80daa5..e94229c 100644
--- a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/input/BasicTextFieldHandwritingGestureTest.kt
+++ b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/input/BasicTextFieldHandwritingGestureTest.kt
@@ -67,11 +67,9 @@
 @RequiresApi(34)
 @SdkSuppress(minSdkVersion = 34)
 internal class BasicTextFieldHandwritingGestureTest {
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
-    @get:Rule
-    val immRule = ComposeInputMethodManagerTestRule()
+    @get:Rule val immRule = ComposeInputMethodManagerTestRule()
 
     private val inputMethodInterceptor = InputMethodInterceptor(rule)
 
@@ -109,8 +107,10 @@
             gestureFactory = { textLayoutResult ->
                 val localBoundingBox = textLayoutResult.boundingBoxOf("b")
                 val screenBoundingBox = localToScreen(localBoundingBox).toAndroidRectF()
-                SelectGesture.Builder().setSelectionArea(screenBoundingBox)
-                    .setGranularity(HandwritingGesture.GRANULARITY_WORD).build()
+                SelectGesture.Builder()
+                    .setSelectionArea(screenBoundingBox)
+                    .setGranularity(HandwritingGesture.GRANULARITY_WORD)
+                    .build()
             },
             preview = true
         ) { textFieldState, _ ->
@@ -633,13 +633,11 @@
         testTextFieldHandwritingGesture(
             text = text,
             gestureFactory = { textLayoutResult ->
-                val startArea = textLayoutResult.boundingBoxOf("c").let {
-                    localToScreen(it).toAndroidRectF()
-                }
+                val startArea =
+                    textLayoutResult.boundingBoxOf("c").let { localToScreen(it).toAndroidRectF() }
 
-                val endArea = textLayoutResult.boundingBoxOf("d").let {
-                    localToScreen(it).toAndroidRectF()
-                }
+                val endArea =
+                    textLayoutResult.boundingBoxOf("d").let { localToScreen(it).toAndroidRectF() }
 
                 SelectRangeGesture.Builder()
                     .setSelectionStartArea(startArea)
@@ -659,13 +657,11 @@
         testTextFieldHandwritingGesture(
             text = text,
             gestureFactory = { textLayoutResult ->
-                val startArea = textLayoutResult.boundingBoxOf("c").let {
-                    localToScreen(it).toAndroidRectF()
-                }
+                val startArea =
+                    textLayoutResult.boundingBoxOf("c").let { localToScreen(it).toAndroidRectF() }
 
-                val endArea = textLayoutResult.boundingBoxOf("d").let {
-                    localToScreen(it).toAndroidRectF()
-                }
+                val endArea =
+                    textLayoutResult.boundingBoxOf("d").let { localToScreen(it).toAndroidRectF() }
 
                 SelectRangeGesture.Builder()
                     .setSelectionStartArea(startArea)
@@ -689,13 +685,11 @@
         testTextFieldHandwritingGesture(
             text = text,
             gestureFactory = { textLayoutResult ->
-                val startArea = textLayoutResult.boundingBoxOf("b").let {
-                    localToScreen(it).toAndroidRectF()
-                }
+                val startArea =
+                    textLayoutResult.boundingBoxOf("b").let { localToScreen(it).toAndroidRectF() }
 
-                val endArea = textLayoutResult.boundingBoxOf("e").let {
-                    localToScreen(it).toAndroidRectF()
-                }
+                val endArea =
+                    textLayoutResult.boundingBoxOf("e").let { localToScreen(it).toAndroidRectF() }
 
                 SelectRangeGesture.Builder()
                     .setSelectionStartArea(startArea)
@@ -716,13 +710,11 @@
         testTextFieldHandwritingGesture(
             text = text,
             gestureFactory = { textLayoutResult ->
-                val startArea = textLayoutResult.boundingBoxOf("b").let {
-                    localToScreen(it).toAndroidRectF()
-                }
+                val startArea =
+                    textLayoutResult.boundingBoxOf("b").let { localToScreen(it).toAndroidRectF() }
 
-                val endArea = textLayoutResult.boundingBoxOf("e").let {
-                    localToScreen(it).toAndroidRectF()
-                }
+                val endArea =
+                    textLayoutResult.boundingBoxOf("e").let { localToScreen(it).toAndroidRectF() }
 
                 SelectRangeGesture.Builder()
                     .setSelectionStartArea(startArea)
@@ -749,9 +741,8 @@
             text = text,
             initialSelection = TextRange(initialCursor),
             gestureFactory = { textLayoutResult ->
-                val endArea = textLayoutResult.boundingBoxOf("d").let {
-                    localToScreen(it).toAndroidRectF()
-                }
+                val endArea =
+                    textLayoutResult.boundingBoxOf("d").let { localToScreen(it).toAndroidRectF() }
                 // The startArea selects nothing, but the endArea contains one character, it
                 // should still fallback.
                 SelectRangeGesture.Builder()
@@ -779,9 +770,8 @@
             text = text,
             initialSelection = TextRange(initialCursor),
             gestureFactory = { textLayoutResult ->
-                val startArea = textLayoutResult.boundingBoxOf("c").let {
-                    localToScreen(it).toAndroidRectF()
-                }
+                val startArea =
+                    textLayoutResult.boundingBoxOf("c").let { localToScreen(it).toAndroidRectF() }
                 // The endArea selects nothing, but the start contains one character, it
                 // should still fallback.
                 SelectRangeGesture.Builder()
@@ -809,9 +799,8 @@
             text = text,
             initialSelection = TextRange(initialCursor),
             gestureFactory = { textLayoutResult ->
-                val endArea = textLayoutResult.boundingBoxOf("d").let {
-                    localToScreen(it).toAndroidRectF()
-                }
+                val endArea =
+                    textLayoutResult.boundingBoxOf("d").let { localToScreen(it).toAndroidRectF() }
                 // The startArea selects nothing, but the endArea contains one character, it
                 // should still fallback.
                 SelectRangeGesture.Builder()
@@ -854,12 +843,10 @@
         testTextFieldHandwritingGesture(
             text = text,
             gestureFactory = { textLayoutResult ->
-                val startArea = textLayoutResult.boundingBoxOf("c").let {
-                    localToScreen(it).toAndroidRectF()
-                }
-                val endArea = textLayoutResult.boundingBoxOf("d").let {
-                    localToScreen(it).toAndroidRectF()
-                }
+                val startArea =
+                    textLayoutResult.boundingBoxOf("c").let { localToScreen(it).toAndroidRectF() }
+                val endArea =
+                    textLayoutResult.boundingBoxOf("d").let { localToScreen(it).toAndroidRectF() }
 
                 DeleteRangeGesture.Builder()
                     .setDeletionStartArea(startArea)
@@ -882,12 +869,10 @@
         testTextFieldHandwritingGesture(
             text = text,
             gestureFactory = { textLayoutResult ->
-                val startArea = textLayoutResult.boundingBoxOf("c").let {
-                    localToScreen(it).toAndroidRectF()
-                }
-                val endArea = textLayoutResult.boundingBoxOf("d").let {
-                    localToScreen(it).toAndroidRectF()
-                }
+                val startArea =
+                    textLayoutResult.boundingBoxOf("c").let { localToScreen(it).toAndroidRectF() }
+                val endArea =
+                    textLayoutResult.boundingBoxOf("d").let { localToScreen(it).toAndroidRectF() }
 
                 DeleteRangeGesture.Builder()
                     .setDeletionStartArea(startArea)
@@ -911,12 +896,10 @@
         testTextFieldHandwritingGesture(
             text = text,
             gestureFactory = { textLayoutResult ->
-                val startArea = textLayoutResult.boundingBoxOf("e").let {
-                    localToScreen(it).toAndroidRectF()
-                }
-                val endArea = textLayoutResult.boundingBoxOf("h").let {
-                    localToScreen(it).toAndroidRectF()
-                }
+                val startArea =
+                    textLayoutResult.boundingBoxOf("e").let { localToScreen(it).toAndroidRectF() }
+                val endArea =
+                    textLayoutResult.boundingBoxOf("h").let { localToScreen(it).toAndroidRectF() }
 
                 DeleteRangeGesture.Builder()
                     .setDeletionStartArea(startArea)
@@ -938,12 +921,10 @@
         testTextFieldHandwritingGesture(
             text = text,
             gestureFactory = { textLayoutResult ->
-                val startArea = textLayoutResult.boundingBoxOf("e").let {
-                    localToScreen(it).toAndroidRectF()
-                }
-                val endArea = textLayoutResult.boundingBoxOf("h").let {
-                    localToScreen(it).toAndroidRectF()
-                }
+                val startArea =
+                    textLayoutResult.boundingBoxOf("e").let { localToScreen(it).toAndroidRectF() }
+                val endArea =
+                    textLayoutResult.boundingBoxOf("h").let { localToScreen(it).toAndroidRectF() }
 
                 DeleteRangeGesture.Builder()
                     .setDeletionStartArea(startArea)
@@ -970,9 +951,8 @@
             text = text,
             initialSelection = TextRange(initialCursor),
             gestureFactory = { textLayoutResult ->
-                val endArea = textLayoutResult.boundingBoxOf("d").let {
-                    localToScreen(it).toAndroidRectF()
-                }
+                val endArea =
+                    textLayoutResult.boundingBoxOf("d").let { localToScreen(it).toAndroidRectF() }
                 // The startArea selects nothing, but the endArea contains one character, it
                 // should still fallback.
                 DeleteRangeGesture.Builder()
@@ -1000,9 +980,8 @@
             text = text,
             initialSelection = TextRange(initialCursor),
             gestureFactory = { textLayoutResult ->
-                val startArea = textLayoutResult.boundingBoxOf("c").let {
-                    localToScreen(it).toAndroidRectF()
-                }
+                val startArea =
+                    textLayoutResult.boundingBoxOf("c").let { localToScreen(it).toAndroidRectF() }
                 // The endArea selects nothing, but the start contains one character, it
                 // should still fallback.
                 DeleteRangeGesture.Builder()
@@ -1029,9 +1008,8 @@
             text = text,
             initialSelection = TextRange(initialCursor),
             gestureFactory = { textLayoutResult ->
-                val endArea = textLayoutResult.boundingBoxOf("d").let {
-                    localToScreen(it).toAndroidRectF()
-                }
+                val endArea =
+                    textLayoutResult.boundingBoxOf("d").let { localToScreen(it).toAndroidRectF() }
                 // The startArea selects nothing, but the endArea contains one character, it
                 // should still fallback.
                 DeleteRangeGesture.Builder()
@@ -1076,9 +1054,7 @@
                 // Perform the gesture before 'd'.
                 val point = textLayoutResult.boundingBoxOf("d").centerLeft
                 val screenPoint = localToScreen(point).toPointF()
-                JoinOrSplitGesture.Builder()
-                    .setJoinOrSplitPoint(screenPoint)
-                    .build()
+                JoinOrSplitGesture.Builder().setJoinOrSplitPoint(screenPoint).build()
             }
         ) { textFieldState, resultCode ->
             assertThat(resultCode).isEqualTo(InputConnection.HANDWRITING_GESTURE_RESULT_SUCCESS)
@@ -1125,9 +1101,7 @@
                 // Perform the gesture after 'c'.
                 val point = textLayoutResult.boundingBoxOf("c").centerRight
                 val screenPoint = localToScreen(point).toPointF()
-                JoinOrSplitGesture.Builder()
-                    .setJoinOrSplitPoint(screenPoint)
-                    .build()
+                JoinOrSplitGesture.Builder().setJoinOrSplitPoint(screenPoint).build()
             }
         ) { textFieldState, resultCode ->
             assertThat(resultCode).isEqualTo(InputConnection.HANDWRITING_GESTURE_RESULT_FAILED)
@@ -1145,9 +1119,7 @@
                 // Perform the gesture before 'd'.
                 val point = textLayoutResult.boundingBoxOf("d").centerLeft
                 val screenPoint = localToScreen(point).toPointF()
-                JoinOrSplitGesture.Builder()
-                    .setJoinOrSplitPoint(screenPoint)
-                    .build()
+                JoinOrSplitGesture.Builder().setJoinOrSplitPoint(screenPoint).build()
             }
         ) { textFieldState, resultCode ->
             assertThat(resultCode).isEqualTo(InputConnection.HANDWRITING_GESTURE_RESULT_SUCCESS)
@@ -1166,9 +1138,7 @@
                 // Perform the gesture after 'd'.
                 val point = textLayoutResult.boundingBoxOf("c").centerRight
                 val screenPoint = localToScreen(point).toPointF()
-                JoinOrSplitGesture.Builder()
-                    .setJoinOrSplitPoint(screenPoint)
-                    .build()
+                JoinOrSplitGesture.Builder().setJoinOrSplitPoint(screenPoint).build()
             }
         ) { textFieldState, resultCode ->
             assertThat(resultCode).isEqualTo(InputConnection.HANDWRITING_GESTURE_RESULT_SUCCESS)
@@ -1187,9 +1157,7 @@
                 // Perform the gesture before 'd'.
                 val point = textLayoutResult.boundingBoxOf("d").centerLeft
                 val screenPoint = localToScreen(point).toPointF()
-                JoinOrSplitGesture.Builder()
-                    .setJoinOrSplitPoint(screenPoint)
-                    .build()
+                JoinOrSplitGesture.Builder().setJoinOrSplitPoint(screenPoint).build()
             }
         ) { textFieldState, resultCode ->
             assertThat(resultCode).isEqualTo(InputConnection.HANDWRITING_GESTURE_RESULT_SUCCESS)
@@ -1208,9 +1176,7 @@
                 // Perform the gesture before 'd'.
                 val point = textLayoutResult.boundingBoxOf("c").centerRight
                 val screenPoint = localToScreen(point).toPointF()
-                JoinOrSplitGesture.Builder()
-                    .setJoinOrSplitPoint(screenPoint)
-                    .build()
+                JoinOrSplitGesture.Builder().setJoinOrSplitPoint(screenPoint).build()
             }
         ) { textFieldState, resultCode ->
             assertThat(resultCode).isEqualTo(InputConnection.HANDWRITING_GESTURE_RESULT_SUCCESS)
@@ -1229,9 +1195,7 @@
                 // Perform the gesture in the middle of the spaces.
                 val point = textLayoutResult.boundingBoxOf("   ").center
                 val screenPoint = localToScreen(point).toPointF()
-                JoinOrSplitGesture.Builder()
-                    .setJoinOrSplitPoint(screenPoint)
-                    .build()
+                JoinOrSplitGesture.Builder().setJoinOrSplitPoint(screenPoint).build()
             }
         ) { textFieldState, resultCode ->
             assertThat(resultCode).isEqualTo(InputConnection.HANDWRITING_GESTURE_RESULT_SUCCESS)
@@ -1251,9 +1215,10 @@
             initialSelection = TextRange(initialCursor),
             gestureFactory = { textLayoutResult ->
                 // Perform the gesture 20 pixels above the line.
-                val point = textLayoutResult.boundingBoxOf("d").topLeft.let {
-                    Offset(it.x, it.y - lineMargin - 1)
-                }
+                val point =
+                    textLayoutResult.boundingBoxOf("d").topLeft.let {
+                        Offset(it.x, it.y - lineMargin - 1)
+                    }
                 val screenPoint = localToScreen(point).toPointF()
                 JoinOrSplitGesture.Builder()
                     .setJoinOrSplitPoint(screenPoint)
@@ -1277,13 +1242,12 @@
             text = text,
             gestureFactory = { textLayoutResult ->
                 // Perform the gesture 20 pixels above the line.
-                val point = textLayoutResult.boundingBoxOf("d").topLeft.let {
-                    Offset(it.x, it.y - lineMargin - 1)
-                }
+                val point =
+                    textLayoutResult.boundingBoxOf("d").topLeft.let {
+                        Offset(it.x, it.y - lineMargin - 1)
+                    }
                 val screenPoint = localToScreen(point).toPointF()
-                JoinOrSplitGesture.Builder()
-                    .setJoinOrSplitPoint(screenPoint)
-                    .build()
+                JoinOrSplitGesture.Builder().setJoinOrSplitPoint(screenPoint).build()
             }
         ) { textFieldState, resultCode ->
             assertThat(resultCode).isEqualTo(InputConnection.HANDWRITING_GESTURE_RESULT_FAILED)
@@ -1326,9 +1290,10 @@
             initialSelection = TextRange(initialCursor),
             gestureFactory = { textLayoutResult ->
                 // Perform the gesture 20 pixels above the line.
-                val point = textLayoutResult.boundingBoxOf("d").topLeft.let {
-                    Offset(it.x, it.y - lineMargin - 1)
-                }
+                val point =
+                    textLayoutResult.boundingBoxOf("d").topLeft.let {
+                        Offset(it.x, it.y - lineMargin - 1)
+                    }
                 val screenPoint = localToScreen(point).toPointF()
                 InsertGesture.Builder()
                     .setInsertionPoint(screenPoint)
@@ -1353,14 +1318,12 @@
             text = text,
             gestureFactory = { textLayoutResult ->
                 // Perform the gesture 20 pixels above the line.
-                val point = textLayoutResult.boundingBoxOf("d").topLeft.let {
-                    Offset(it.x, it.y - lineMargin - 1)
-                }
+                val point =
+                    textLayoutResult.boundingBoxOf("d").topLeft.let {
+                        Offset(it.x, it.y - lineMargin - 1)
+                    }
                 val screenPoint = localToScreen(point).toPointF()
-                InsertGesture.Builder()
-                    .setInsertionPoint(screenPoint)
-                    .setTextToInsert("")
-                    .build()
+                InsertGesture.Builder().setInsertionPoint(screenPoint).setTextToInsert("").build()
             }
         ) { textFieldState, resultCode ->
             assertThat(resultCode).isEqualTo(InputConnection.HANDWRITING_GESTURE_RESULT_FAILED)
@@ -1376,16 +1339,16 @@
             text = text,
             gestureFactory = { textLayoutResult ->
                 // The given gestures should remove spaces within the range of "cd ef".
-                val startPoint = textLayoutResult.boundingBoxOf("c").centerLeft.let {
-                    localToScreen(it).toPointF()
-                }
-                val endPoint = textLayoutResult.boundingBoxOf("f").centerRight.let {
-                    localToScreen(it).toPointF()
-                }
+                val startPoint =
+                    textLayoutResult.boundingBoxOf("c").centerLeft.let {
+                        localToScreen(it).toPointF()
+                    }
+                val endPoint =
+                    textLayoutResult.boundingBoxOf("f").centerRight.let {
+                        localToScreen(it).toPointF()
+                    }
 
-                RemoveSpaceGesture.Builder()
-                    .setPoints(startPoint, endPoint)
-                    .build()
+                RemoveSpaceGesture.Builder().setPoints(startPoint, endPoint).build()
             }
         ) { textFieldState, resultCode ->
             assertThat(resultCode).isEqualTo(InputConnection.HANDWRITING_GESTURE_RESULT_SUCCESS)
@@ -1406,16 +1369,16 @@
                 // This gestures only works for single line. When the given points touches multiple
                 // lines, it should only remove spaces at the first line. In this case, it'll be
                 // remove spaces within the range of "b cd e" ('e' is at the top of 'k').
-                val startPoint = textLayoutResult.boundingBoxOf("b").centerLeft.let {
-                    localToScreen(it).toPointF()
-                }
-                val endPoint = textLayoutResult.boundingBoxOf("k").centerRight.let {
-                    localToScreen(it).toPointF()
-                }
+                val startPoint =
+                    textLayoutResult.boundingBoxOf("b").centerLeft.let {
+                        localToScreen(it).toPointF()
+                    }
+                val endPoint =
+                    textLayoutResult.boundingBoxOf("k").centerRight.let {
+                        localToScreen(it).toPointF()
+                    }
 
-                RemoveSpaceGesture.Builder()
-                    .setPoints(startPoint, endPoint)
-                    .build()
+                RemoveSpaceGesture.Builder().setPoints(startPoint, endPoint).build()
             }
         ) { textFieldState, resultCode ->
             assertThat(resultCode).isEqualTo(InputConnection.HANDWRITING_GESTURE_RESULT_SUCCESS)
@@ -1434,16 +1397,16 @@
             text = text,
             gestureFactory = { textLayoutResult ->
                 // The gesture covers spaces only, between 'b' and 'c'.
-                val startPoint = textLayoutResult.boundingBoxOf("b").centerRight.let {
-                    localToScreen(it).toPointF()
-                }
-                val endPoint = textLayoutResult.boundingBoxOf("c").centerLeft.let {
-                    localToScreen(it).toPointF()
-                }
+                val startPoint =
+                    textLayoutResult.boundingBoxOf("b").centerRight.let {
+                        localToScreen(it).toPointF()
+                    }
+                val endPoint =
+                    textLayoutResult.boundingBoxOf("c").centerLeft.let {
+                        localToScreen(it).toPointF()
+                    }
 
-                RemoveSpaceGesture.Builder()
-                    .setPoints(startPoint, endPoint)
-                    .build()
+                RemoveSpaceGesture.Builder().setPoints(startPoint, endPoint).build()
             }
         ) { textFieldState, resultCode ->
             assertThat(resultCode).isEqualTo(InputConnection.HANDWRITING_GESTURE_RESULT_SUCCESS)
@@ -1465,12 +1428,14 @@
             initialSelection = TextRange(initialCursor),
             gestureFactory = { textLayoutResult ->
                 // The gesture covers "cdef" which contains no spaces.
-                val startPoint = textLayoutResult.boundingBoxOf("c").centerLeft.let {
-                    localToScreen(it).toPointF()
-                }
-                val endPoint = textLayoutResult.boundingBoxOf("f").centerRight.let {
-                    localToScreen(it).toPointF()
-                }
+                val startPoint =
+                    textLayoutResult.boundingBoxOf("c").centerLeft.let {
+                        localToScreen(it).toPointF()
+                    }
+                val endPoint =
+                    textLayoutResult.boundingBoxOf("f").centerRight.let {
+                        localToScreen(it).toPointF()
+                    }
 
                 RemoveSpaceGesture.Builder()
                     .setPoints(startPoint, endPoint)
@@ -1494,16 +1459,16 @@
             text = text,
             gestureFactory = { textLayoutResult ->
                 // The gesture covers "cdef" which contains no spaces.
-                val startPoint = textLayoutResult.boundingBoxOf("c").centerLeft.let {
-                    localToScreen(it).toPointF()
-                }
-                val endPoint = textLayoutResult.boundingBoxOf("f").centerRight.let {
-                    localToScreen(it).toPointF()
-                }
+                val startPoint =
+                    textLayoutResult.boundingBoxOf("c").centerLeft.let {
+                        localToScreen(it).toPointF()
+                    }
+                val endPoint =
+                    textLayoutResult.boundingBoxOf("f").centerRight.let {
+                        localToScreen(it).toPointF()
+                    }
 
-                RemoveSpaceGesture.Builder()
-                    .setPoints(startPoint, endPoint)
-                    .build()
+                RemoveSpaceGesture.Builder().setPoints(startPoint, endPoint).build()
             }
         ) { textFieldState, resultCode ->
             assertThat(resultCode).isEqualTo(InputConnection.HANDWRITING_GESTURE_RESULT_FAILED)
@@ -1522,17 +1487,17 @@
                 // The start point is out of line margin. and endPoint is now used to select
                 // the target line (the 2nd line).
                 // It'll remove the spaces between "h ij k".('h' is under 'b')
-                val startPoint = textLayoutResult.boundingBoxOf("b").topLeft.let {
-                    val offset = it.copy(y = it.y - lineMargin - 1)
-                    localToScreen(offset).toPointF()
-                }
-                val endPoint = textLayoutResult.boundingBoxOf("k").centerRight.let {
-                    localToScreen(it).toPointF()
-                }
+                val startPoint =
+                    textLayoutResult.boundingBoxOf("b").topLeft.let {
+                        val offset = it.copy(y = it.y - lineMargin - 1)
+                        localToScreen(offset).toPointF()
+                    }
+                val endPoint =
+                    textLayoutResult.boundingBoxOf("k").centerRight.let {
+                        localToScreen(it).toPointF()
+                    }
 
-                RemoveSpaceGesture.Builder()
-                    .setPoints(startPoint, endPoint)
-                    .build()
+                RemoveSpaceGesture.Builder().setPoints(startPoint, endPoint).build()
             }
         ) { textFieldState, resultCode ->
             assertThat(resultCode).isEqualTo(InputConnection.HANDWRITING_GESTURE_RESULT_SUCCESS)
@@ -1553,17 +1518,17 @@
                 // The end point is out of line margin. and startPoint is now used to select
                 // the target line (the 2nd line).
                 // It'll remove the spaces between "h ij k". ('k' is under 'e')
-                val startPoint = textLayoutResult.boundingBoxOf("h").centerLeft.let {
-                    localToScreen(it).toPointF()
-                }
-                val endPoint = textLayoutResult.boundingBoxOf("e").topRight.let {
-                    val offset = it.copy(y = it.y - lineMargin - 1)
-                    localToScreen(offset).toPointF()
-                }
+                val startPoint =
+                    textLayoutResult.boundingBoxOf("h").centerLeft.let {
+                        localToScreen(it).toPointF()
+                    }
+                val endPoint =
+                    textLayoutResult.boundingBoxOf("e").topRight.let {
+                        val offset = it.copy(y = it.y - lineMargin - 1)
+                        localToScreen(offset).toPointF()
+                    }
 
-                RemoveSpaceGesture.Builder()
-                    .setPoints(startPoint, endPoint)
-                    .build()
+                RemoveSpaceGesture.Builder().setPoints(startPoint, endPoint).build()
             }
         ) { textFieldState, resultCode ->
             assertThat(resultCode).isEqualTo(InputConnection.HANDWRITING_GESTURE_RESULT_SUCCESS)
@@ -1585,14 +1550,16 @@
             initialSelection = TextRange(initialCursor),
             gestureFactory = { textLayoutResult ->
                 // The gesture covers "cdef" which contains no spaces.
-                val startPoint = textLayoutResult.boundingBoxOf("c").topLeft.let {
-                    val offset = it.copy(y = it.y - lineMargin - 1f)
-                    localToScreen(offset).toPointF()
-                }
-                val endPoint = textLayoutResult.boundingBoxOf("f").bottomRight.let {
-                    val offset = it.copy(y = it.y + lineMargin + 1f)
-                    localToScreen(offset).toPointF()
-                }
+                val startPoint =
+                    textLayoutResult.boundingBoxOf("c").topLeft.let {
+                        val offset = it.copy(y = it.y - lineMargin - 1f)
+                        localToScreen(offset).toPointF()
+                    }
+                val endPoint =
+                    textLayoutResult.boundingBoxOf("f").bottomRight.let {
+                        val offset = it.copy(y = it.y + lineMargin + 1f)
+                        localToScreen(offset).toPointF()
+                    }
 
                 RemoveSpaceGesture.Builder()
                     .setPoints(startPoint, endPoint)
@@ -1616,18 +1583,18 @@
             text = text,
             gestureFactory = { textLayoutResult ->
                 // The gesture covers "cdef" which contains no spaces.
-                val startPoint = textLayoutResult.boundingBoxOf("c").topLeft.let {
-                    val offset = it.copy(y = it.y - lineMargin - 1f)
-                    localToScreen(offset).toPointF()
-                }
-                val endPoint = textLayoutResult.boundingBoxOf("f").bottomRight.let {
-                    val offset = it.copy(y = it.y + lineMargin + 1f)
-                    localToScreen(offset).toPointF()
-                }
+                val startPoint =
+                    textLayoutResult.boundingBoxOf("c").topLeft.let {
+                        val offset = it.copy(y = it.y - lineMargin - 1f)
+                        localToScreen(offset).toPointF()
+                    }
+                val endPoint =
+                    textLayoutResult.boundingBoxOf("f").bottomRight.let {
+                        val offset = it.copy(y = it.y + lineMargin + 1f)
+                        localToScreen(offset).toPointF()
+                    }
 
-                RemoveSpaceGesture.Builder()
-                    .setPoints(startPoint, endPoint)
-                    .build()
+                RemoveSpaceGesture.Builder().setPoints(startPoint, endPoint).build()
             }
         ) { textFieldState, resultCode ->
             assertThat(resultCode).isEqualTo(InputConnection.HANDWRITING_GESTURE_RESULT_FAILED)
@@ -1649,24 +1616,20 @@
         var layoutCoordinates: LayoutCoordinates? = null
 
         inputMethodInterceptor.setTextFieldTestContent {
-            val viewConfiguration = object : ViewConfiguration by LocalViewConfiguration.current {
-                override val handwritingGestureLineMargin: Float = lineMargin
-            }
+            val viewConfiguration =
+                object : ViewConfiguration by LocalViewConfiguration.current {
+                    override val handwritingGestureLineMargin: Float = lineMargin
+                }
             CompositionLocalProvider(value = LocalViewConfiguration provides viewConfiguration) {
                 BasicTextField(
                     state = textFieldState,
-                    modifier = Modifier
-                        .fillMaxSize()
-                        .testTag(Tag)
-                        .onGloballyPositioned { layoutCoordinates = it },
-                    textStyle = TextStyle(
-                        fontSize = 10.sp,
-                        fontFamily = TEST_FONT_FAMILY
-                    ),
+                    modifier =
+                        Modifier.fillMaxSize().testTag(Tag).onGloballyPositioned {
+                            layoutCoordinates = it
+                        },
+                    textStyle = TextStyle(fontSize = 10.sp, fontFamily = TEST_FONT_FAMILY),
                     outputTransformation = outputTransformation,
-                    onTextLayout = {
-                        getTextLayoutResult = it
-                    }
+                    onTextLayout = { getTextLayoutResult = it }
                 )
             }
         }
@@ -1680,16 +1643,15 @@
         inputMethodInterceptor.withInputConnection {
             if (preview) {
                 previewHandwritingGesture(
-                    gesture as PreviewableHandwritingGesture, cancellationSignal
+                    gesture as PreviewableHandwritingGesture,
+                    cancellationSignal
                 )
             } else {
                 performHandwritingGesture(gesture, /* executor= */ null) { resultCode = it }
             }
         }
 
-        rule.runOnIdle {
-            assertion.invoke(textFieldState, resultCode)
-        }
+        rule.runOnIdle { assertion.invoke(textFieldState, resultCode) }
     }
 
     private fun LayoutCoordinates.localToScreen(rect: Rect): Rect {
diff --git a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/input/BasicTextFieldHandwritingTest.kt b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/input/BasicTextFieldHandwritingTest.kt
index aec9491..fb0dca2 100644
--- a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/input/BasicTextFieldHandwritingTest.kt
+++ b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/input/BasicTextFieldHandwritingTest.kt
@@ -48,11 +48,9 @@
 @LargeTest
 @RunWith(AndroidJUnit4::class)
 internal class BasicTextFieldHandwritingTest {
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
-    @get:Rule
-    val immRule = ComposeInputMethodManagerTestRule()
+    @get:Rule val immRule = ComposeInputMethodManagerTestRule()
 
     private val inputMethodInterceptor = InputMethodInterceptor(rule)
 
@@ -70,9 +68,7 @@
 
     @Test
     fun textField_startStylusHandwriting_unfocused() {
-        testStylusHandwriting(stylusHandwritingStarted = true) {
-            performStylusHandwriting()
-        }
+        testStylusHandwriting(stylusHandwritingStarted = true) { performStylusHandwriting() }
     }
 
     @Test
@@ -85,23 +81,17 @@
 
     @Test
     fun textField_click_notStartStylusHandwriting() {
-        testStylusHandwriting(stylusHandwritingStarted = false) {
-            performStylusClick()
-        }
+        testStylusHandwriting(stylusHandwritingStarted = false) { performStylusClick() }
     }
 
     @Test
     fun textField_longClick_notStartStylusHandwriting() {
-        testStylusHandwriting(stylusHandwritingStarted = false) {
-            performStylusLongClick()
-        }
+        testStylusHandwriting(stylusHandwritingStarted = false) { performStylusLongClick() }
     }
 
     @Test
     fun textField_longPressAndDrag_notStartStylusHandwriting() {
-        testStylusHandwriting(stylusHandwritingStarted = false) {
-            performStylusLongPressAndDrag()
-        }
+        testStylusHandwriting(stylusHandwritingStarted = false) { performStylusLongPressAndDrag() }
     }
 
     @Test
@@ -118,9 +108,7 @@
 
         rule.onNodeWithTag(Tag).performStylusHandwriting()
 
-        rule.runOnIdle {
-            imm.expectNoMoreCalls()
-        }
+        rule.runOnIdle { imm.expectNoMoreCalls() }
     }
 
     @Test
@@ -137,9 +125,7 @@
 
         rule.onNodeWithTag(Tag).performStylusHandwriting()
 
-        rule.runOnIdle {
-            imm.expectNoMoreCalls()
-        }
+        rule.runOnIdle { imm.expectNoMoreCalls() }
     }
 
     @Test
@@ -265,10 +251,7 @@
         immRule.setFactory { imm }
         inputMethodInterceptor.setTextFieldTestContent {
             val state = remember { TextFieldState() }
-            BasicTextField(
-                state = state,
-                modifier = Modifier.fillMaxSize().testTag(Tag)
-            )
+            BasicTextField(state = state, modifier = Modifier.fillMaxSize().testTag(Tag))
         }
 
         interaction.invoke(rule.onNodeWithTag(Tag))
diff --git a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/input/BasicTextFieldImeSelectionChangesTest.kt b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/input/BasicTextFieldImeSelectionChangesTest.kt
index d24cec3..ba39d8a 100644
--- a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/input/BasicTextFieldImeSelectionChangesTest.kt
+++ b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/input/BasicTextFieldImeSelectionChangesTest.kt
@@ -36,18 +36,16 @@
 import org.junit.runner.RunWith
 
 /**
- * This class tests different ways of updating selection in TextFieldState and asserts that
- * IME gets updated for all of them.
+ * This class tests different ways of updating selection in TextFieldState and asserts that IME gets
+ * updated for all of them.
  */
 @LargeTest
 @RunWith(AndroidJUnit4::class)
 internal class BasicTextFieldImeSelectionChangesTest {
 
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
-    @get:Rule
-    val immRule = ComposeInputMethodManagerTestRule()
+    @get:Rule val immRule = ComposeInputMethodManagerTestRule()
 
     private val inputMethodInterceptor = InputMethodInterceptor(rule)
 
@@ -83,9 +81,7 @@
         }
         rule.onNodeWithTag(Tag).requestFocus()
 
-        inputMethodInterceptor.withInputConnection {
-            setSelection(1, 3)
-        }
+        inputMethodInterceptor.withInputConnection { setSelection(1, 3) }
 
         imm.expectCall("updateSelection(1, 3, -1, -1)")
     }
diff --git a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/input/BasicTextFieldImmIntegrationTest.kt b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/input/BasicTextFieldImmIntegrationTest.kt
index b3124db..fb6cc28 100644
--- a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/input/BasicTextFieldImmIntegrationTest.kt
+++ b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/input/BasicTextFieldImmIntegrationTest.kt
@@ -58,11 +58,9 @@
 @RunWith(AndroidJUnit4::class)
 internal class BasicTextFieldImmIntegrationTest {
 
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
-    @get:Rule
-    val immRule = ComposeInputMethodManagerTestRule()
+    @get:Rule val immRule = ComposeInputMethodManagerTestRule()
 
     private val inputMethodInterceptor = InputMethodInterceptor(rule)
 
@@ -98,9 +96,7 @@
             BasicTextField(state, Modifier.testTag(Tag))
         }
         requestFocus(Tag)
-        rule.runOnIdle {
-            focusManager.clearFocus()
-        }
+        rule.runOnIdle { focusManager.clearFocus() }
         inputMethodInterceptor.assertNoSessionActive()
     }
 
@@ -109,16 +105,18 @@
         val state = TextFieldState()
         var windowFocus by mutableStateOf(true)
         inputMethodInterceptor.setContent {
-            CompositionLocalProvider(LocalWindowInfo provides object : WindowInfo {
-                override val isWindowFocused: Boolean get() = windowFocus
-            }) {
+            CompositionLocalProvider(
+                LocalWindowInfo provides
+                    object : WindowInfo {
+                        override val isWindowFocused: Boolean
+                            get() = windowFocus
+                    }
+            ) {
                 BasicTextField(state, Modifier.testTag(Tag))
             }
         }
         requestFocus(Tag)
-        rule.runOnIdle {
-            windowFocus = false
-        }
+        rule.runOnIdle { windowFocus = false }
         inputMethodInterceptor.assertSessionActive()
     }
 
@@ -182,9 +180,7 @@
             }
         }
         requestFocus(Tag)
-        rule.runOnIdle {
-            compose = false
-        }
+        rule.runOnIdle { compose = false }
 
         inputMethodInterceptor.assertNoSessionActive()
     }
@@ -266,9 +262,7 @@
             assertThat(state.text.toString()).isEqualTo("helloworld")
         }
 
-        rule.runOnIdle {
-            imm.expectNoMoreCalls()
-        }
+        rule.runOnIdle { imm.expectNoMoreCalls() }
     }
 
     @Test
@@ -290,9 +284,7 @@
 
         rule.onNodeWithTag(Tag).performKeyInput { pressKey(Key.A) }
 
-        rule.runOnIdle {
-            imm.expectNoMoreCalls()
-        }
+        rule.runOnIdle { imm.expectNoMoreCalls() }
     }
 
     @Test
@@ -321,9 +313,7 @@
     @Test
     fun immNotUpdated_whenEditOnlyChangesText() {
         val state = TextFieldState()
-        inputMethodInterceptor.setContent {
-            BasicTextField(state, Modifier.testTag(Tag))
-        }
+        inputMethodInterceptor.setContent { BasicTextField(state, Modifier.testTag(Tag)) }
         requestFocus(Tag)
         rule.runOnIdle {
             imm.resetCalls()
@@ -334,24 +324,18 @@
             }
         }
 
-        rule.runOnIdle {
-            imm.expectNoMoreCalls()
-        }
+        rule.runOnIdle { imm.expectNoMoreCalls() }
     }
 
     @Test
     fun immUpdated_whenEditChangesSelection() {
         val state = TextFieldState("hello", initialSelection = TextRange(0))
-        inputMethodInterceptor.setContent {
-            BasicTextField(state, Modifier.testTag(Tag))
-        }
+        inputMethodInterceptor.setContent { BasicTextField(state, Modifier.testTag(Tag)) }
         requestFocus(Tag)
         rule.runOnIdle {
             imm.resetCalls()
 
-            state.edit {
-                placeCursorAtEnd()
-            }
+            state.edit { placeCursorAtEnd() }
         }
 
         rule.runOnIdle {
@@ -363,9 +347,7 @@
     @Test
     fun immUpdated_whenEditChangesTextAndSelection() {
         val state = TextFieldState()
-        inputMethodInterceptor.setContent {
-            BasicTextField(state, Modifier.testTag(Tag))
-        }
+        inputMethodInterceptor.setContent { BasicTextField(state, Modifier.testTag(Tag)) }
         requestFocus(Tag)
         rule.runOnIdle {
             imm.resetCalls()
@@ -388,9 +370,7 @@
         // Following edits are simulated as if they are coming from IME through InputConnection.
         // We expect calls to `updateSelection` but never `restartInput`
         val state = TextFieldState("Hello")
-        inputMethodInterceptor.setContent {
-            BasicTextField(state, Modifier.testTag(Tag))
-        }
+        inputMethodInterceptor.setContent { BasicTextField(state, Modifier.testTag(Tag)) }
         requestFocus(Tag)
         inputMethodInterceptor.withInputConnection {
             beginBatchEdit()
@@ -447,14 +427,15 @@
             BasicTextField(
                 state = state,
                 modifier = Modifier.testTag(Tag),
-                inputTransformation = object : InputTransformation {
-                    override val keyboardOptions: KeyboardOptions =
-                        KeyboardOptions(keyboardType = KeyboardType.Password)
+                inputTransformation =
+                    object : InputTransformation {
+                        override val keyboardOptions: KeyboardOptions =
+                            KeyboardOptions(keyboardType = KeyboardType.Password)
 
-                    override fun TextFieldBuffer.transformInput() {
-                        append('A')
+                        override fun TextFieldBuffer.transformInput() {
+                            append('A')
+                        }
                     }
-                }
             )
         }
         requestFocus(Tag)
@@ -490,25 +471,20 @@
         }
     }
 
-    private fun requestFocus(tag: String) =
-        rule.onNodeWithTag(tag).requestFocus()
+    private fun requestFocus(tag: String) = rule.onNodeWithTag(tag).requestFocus()
 }
 
 // sets the WindowInfo with isWindowFocused is true
-internal fun InputMethodInterceptor.setTextFieldTestContent(
-    content: @Composable () -> Unit
-) {
-    val windowInfo = object : WindowInfo {
-        override val isWindowFocused = true
-    }
+internal fun InputMethodInterceptor.setTextFieldTestContent(content: @Composable () -> Unit) {
+    val windowInfo =
+        object : WindowInfo {
+            override val isWindowFocused = true
+        }
     this.setContent {
         CompositionLocalProvider(LocalWindowInfo provides windowInfo) {
             Row {
                 // Extra focusable that takes initial focus when focus is cleared.
-                Box(
-                    Modifier
-                        .size(10.dp)
-                        .focusable())
+                Box(Modifier.size(10.dp).focusable())
                 Box { content() }
             }
         }
diff --git a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/input/BasicTextFieldLayoutPhaseToggleTest.kt b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/input/BasicTextFieldLayoutPhaseToggleTest.kt
index b7f00c2..da1ea4fb 100644
--- a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/input/BasicTextFieldLayoutPhaseToggleTest.kt
+++ b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/input/BasicTextFieldLayoutPhaseToggleTest.kt
@@ -42,16 +42,12 @@
 
 class BasicTextFieldLayoutPhaseToggleTest {
 
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
     private lateinit var state: TextFieldState
 
     private val fontSize = 20.sp
-    private val textStyle = TextStyle(
-        fontSize = fontSize,
-        fontFamily = TEST_FONT_FAMILY
-    )
+    private val textStyle = TextStyle(fontSize = fontSize, fontFamily = TEST_FONT_FAMILY)
 
     @Test
     @SdkSuppress(minSdkVersion = Build.VERSION_CODES.O)
diff --git a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/input/BasicTextFieldSemanticsTest.kt b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/input/BasicTextFieldSemanticsTest.kt
index b15a8c3..ee93cda 100644
--- a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/input/BasicTextFieldSemanticsTest.kt
+++ b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/input/BasicTextFieldSemanticsTest.kt
@@ -75,8 +75,7 @@
 @LargeTest
 @RunWith(AndroidJUnit4::class)
 class BasicTextFieldSemanticsTest : FocusedWindowTest {
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
     private val Tag = "TextField"
 
@@ -95,7 +94,8 @@
             )
         }
 
-        rule.onNodeWithTag(Tag)
+        rule
+            .onNodeWithTag(Tag)
             .assertEditableTextEquals("")
             .assertTextEquals("label", includeEditableText = false)
             .assert(isEditable())
@@ -104,10 +104,7 @@
             .assert(hasImeAction(ImeAction.Default))
             .assert(isNotFocused())
             .assert(
-                SemanticsMatcher.expectValue(
-                    SemanticsProperties.TextSelectionRange,
-                    TextRange.Zero
-                )
+                SemanticsMatcher.expectValue(SemanticsProperties.TextSelectionRange, TextRange.Zero)
             )
             .assert(SemanticsMatcher.keyIsDefined(SemanticsActions.SetText))
             .assert(SemanticsMatcher.keyIsDefined(SemanticsActions.PasteText))
@@ -116,8 +113,9 @@
             .assert(SemanticsMatcher.keyIsDefined(SemanticsActions.GetTextLayoutResult))
 
         val textLayoutResults = mutableListOf<TextLayoutResult>()
-        rule.onNodeWithTag(Tag)
-            .performSemanticsAction(SemanticsActions.GetTextLayoutResult) { it(textLayoutResults) }
+        rule.onNodeWithTag(Tag).performSemanticsAction(SemanticsActions.GetTextLayoutResult) {
+            it(textLayoutResults)
+        }
         assert(textLayoutResults.size == 1) { "TextLayoutResult is null" }
     }
 
@@ -126,39 +124,24 @@
         var enabled by mutableStateOf(true)
         rule.setContent {
             val state = remember { TextFieldState() }
-            BasicTextField(
-                state = state,
-                modifier = Modifier.testTag(Tag),
-                enabled = enabled
-            )
+            BasicTextField(state = state, modifier = Modifier.testTag(Tag), enabled = enabled)
         }
 
-        rule.onNodeWithTag(Tag)
-            .assert(isEnabled())
+        rule.onNodeWithTag(Tag).assert(isEnabled())
 
         enabled = false
         rule.waitForIdle()
 
-        rule.onNodeWithTag(Tag)
-            .assert(isNotEnabled())
+        rule.onNodeWithTag(Tag).assert(isNotEnabled())
     }
 
     @Test
     fun semantics_setTextAction() {
         val state = TextFieldState()
-        rule.setContent {
-            BasicTextField(
-                state = state,
-                modifier = Modifier.testTag(Tag)
-            )
-        }
+        rule.setContent { BasicTextField(state = state, modifier = Modifier.testTag(Tag)) }
 
-        rule.onNodeWithTag(Tag)
-            .assert(isNotFocused())
-            .performTextReplacement("Hello")
-        rule.onNodeWithTag(Tag)
-            .assert(isFocused())
-            .assertTextEquals("Hello")
+        rule.onNodeWithTag(Tag).assert(isNotFocused()).performTextReplacement("Hello")
+        rule.onNodeWithTag(Tag).assert(isFocused()).assertTextEquals("Hello")
 
         assertThat(state.text.toString()).isEqualTo("Hello")
     }
@@ -167,15 +150,10 @@
     fun semantics_performSetTextAction_whenReadOnly() {
         val state = TextFieldState("", initialSelection = TextRange(1))
         rule.setContent {
-            BasicTextField(
-                state = state,
-                modifier = Modifier.testTag(Tag),
-                readOnly = true
-            )
+            BasicTextField(state = state, modifier = Modifier.testTag(Tag), readOnly = true)
         }
 
-        rule.onNodeWithTag(Tag)
-            .performTextReplacement("hello")
+        rule.onNodeWithTag(Tag).performTextReplacement("hello")
 
         assertThat(state.text.toString()).isEqualTo("")
     }
@@ -196,12 +174,8 @@
             )
         }
 
-        rule.onNodeWithTag(Tag)
-            .assert(isNotFocused())
-            .performTextReplacement("Hello")
-        rule.onNodeWithTag(Tag)
-            .assert(isFocused())
-            .assertTextEquals("H-e-l-l-o")
+        rule.onNodeWithTag(Tag).assert(isNotFocused()).performTextReplacement("Hello")
+        rule.onNodeWithTag(Tag).assert(isFocused()).assertTextEquals("H-e-l-l-o")
 
         assertThat(state.text.toString()).isEqualTo("H-e-l-l-o")
     }
@@ -209,19 +183,10 @@
     @Test
     fun semantics_performTextInputAction() {
         val state = TextFieldState("Hello", initialSelection = TextRange(1))
-        rule.setContent {
-            BasicTextField(
-                state = state,
-                modifier = Modifier.testTag(Tag)
-            )
-        }
+        rule.setContent { BasicTextField(state = state, modifier = Modifier.testTag(Tag)) }
 
-        rule.onNodeWithTag(Tag)
-            .assert(isNotFocused())
-            .performTextInput("a")
-        rule.onNodeWithTag(Tag)
-            .assert(isFocused())
-            .assertTextEquals("Haello")
+        rule.onNodeWithTag(Tag).assert(isNotFocused()).performTextInput("a")
+        rule.onNodeWithTag(Tag).assert(isFocused()).assertTextEquals("Haello")
 
         assertThat(state.text.toString()).isEqualTo("Haello")
     }
@@ -230,15 +195,10 @@
     fun semantics_performTextInputAction_whenReadOnly() {
         val state = TextFieldState("", initialSelection = TextRange(1))
         rule.setContent {
-            BasicTextField(
-                state = state,
-                modifier = Modifier.testTag(Tag),
-                readOnly = true
-            )
+            BasicTextField(state = state, modifier = Modifier.testTag(Tag), readOnly = true)
         }
 
-        rule.onNodeWithTag(Tag)
-            .performTextInput("hello")
+        rule.onNodeWithTag(Tag).performTextInput("hello")
 
         assertThat(state.text.toString()).isEqualTo("")
     }
@@ -257,12 +217,8 @@
             )
         }
 
-        rule.onNodeWithTag(Tag)
-            .assert(isNotFocused())
-            .performTextInput("abc")
-        rule.onNodeWithTag(Tag)
-            .assert(isFocused())
-            .assertTextEquals("Hbcello")
+        rule.onNodeWithTag(Tag).assert(isNotFocused()).performTextInput("abc")
+        rule.onNodeWithTag(Tag).assert(isFocused()).assertTextEquals("Hbcello")
 
         assertThat(state.text.toString()).isEqualTo("Hbcello")
     }
@@ -271,17 +227,14 @@
     fun semantics_clickAction() {
         rule.setContent {
             val state = remember { TextFieldState() }
-            BasicTextField(
-                state = state,
-                modifier = Modifier.testTag(Tag)
-            )
+            BasicTextField(state = state, modifier = Modifier.testTag(Tag))
         }
 
-        rule.onNodeWithTag(Tag)
+        rule
+            .onNodeWithTag(Tag)
             .assert(isNotFocused())
             .performSemanticsAction(SemanticsActions.OnClick)
-        rule.onNodeWithTag(Tag)
-            .assert(isFocused())
+        rule.onNodeWithTag(Tag).assert(isFocused())
     }
 
     @Test
@@ -301,12 +254,7 @@
     @Test
     fun contentSemanticsAreSet_inTheFirstComposition() {
         val state = TextFieldState("hello")
-        rule.setContent {
-            BasicTextField(
-                state = state,
-                modifier = Modifier.testTag(Tag)
-            )
-        }
+        rule.setContent { BasicTextField(state = state, modifier = Modifier.testTag(Tag)) }
 
         rule.onNodeWithTag(Tag).assertTextEquals("hello")
     }
@@ -314,12 +262,7 @@
     @Test
     fun contentSemanticsAreSet_afterRecomposition() {
         val state = TextFieldState("hello")
-        rule.setContent {
-            BasicTextField(
-                state = state,
-                modifier = Modifier.testTag(Tag)
-            )
-        }
+        rule.setContent { BasicTextField(state = state, modifier = Modifier.testTag(Tag)) }
 
         rule.onNodeWithTag(Tag).assertTextEquals("hello")
 
@@ -331,12 +274,7 @@
     @Test
     fun selectionSemanticsAreSet_inTheFirstComposition() {
         val state = TextFieldState("hello", initialSelection = TextRange(2))
-        rule.setContent {
-            BasicTextField(
-                state = state,
-                modifier = Modifier.testTag(Tag)
-            )
-        }
+        rule.setContent { BasicTextField(state = state, modifier = Modifier.testTag(Tag)) }
 
         with(rule.onNodeWithTag(Tag)) {
             assertTextEquals("hello")
@@ -347,21 +285,14 @@
     @Test
     fun selectionSemanticsAreSet_afterRecomposition() {
         val state = TextFieldState("hello", initialSelection = TextRange.Zero)
-        rule.setContent {
-            BasicTextField(
-                state = state,
-                modifier = Modifier.testTag(Tag)
-            )
-        }
+        rule.setContent { BasicTextField(state = state, modifier = Modifier.testTag(Tag)) }
 
         with(rule.onNodeWithTag(Tag)) {
             assertTextEquals("hello")
             assertSelection(TextRange.Zero)
         }
 
-        state.edit {
-            selection = TextRange(2)
-        }
+        state.edit { selection = TextRange(2) }
 
         with(rule.onNodeWithTag(Tag)) {
             assertTextEquals("hello")
@@ -374,10 +305,7 @@
     fun inputSelection_changesSelectionState() {
         val state = TextFieldState("hello")
         rule.setTextFieldTestContent {
-            BasicTextField(
-                state = state,
-                modifier = Modifier.testTag(Tag)
-            )
+            BasicTextField(state = state, modifier = Modifier.testTag(Tag))
         }
 
         rule.onNodeWithTag(Tag).performTextInputSelection(TextRange(2, 3))
@@ -385,9 +313,7 @@
         rule.onNode(isSelectionHandle(Handle.SelectionStart)).assertIsDisplayed()
         rule.onNode(isSelectionHandle(Handle.SelectionEnd)).assertIsDisplayed()
 
-        rule.runOnIdle {
-            assertThat(state.selection).isEqualTo(TextRange(2, 3))
-        }
+        rule.runOnIdle { assertThat(state.selection).isEqualTo(TextRange(2, 3)) }
     }
 
     @OptIn(ExperimentalTestApi::class)
@@ -398,29 +324,19 @@
             BasicTextField(
                 state = state,
                 modifier = Modifier.testTag(Tag),
-                inputTransformation = {
-                    revertAllChanges()
-                }
+                inputTransformation = { revertAllChanges() }
             )
         }
 
         rule.onNodeWithTag(Tag).performTextInputSelection(TextRange(2))
 
-        rule.runOnIdle {
-            assertThat(state.selection).isEqualTo(TextRange(5))
-        }
+        rule.runOnIdle { assertThat(state.selection).isEqualTo(TextRange(5)) }
     }
 
     @Test
     fun textLayoutResultSemanticsAreSet_inTheFirstComposition() {
         val state = TextFieldState("hello")
-        rule.setContent {
-            BasicTextField(
-                state = state,
-                modifier = Modifier
-                    .testTag(Tag)
-            )
-        }
+        rule.setContent { BasicTextField(state = state, modifier = Modifier.testTag(Tag)) }
 
         rule.onNodeWithTag(Tag).assertTextEquals("hello")
         assertThat(rule.onNodeWithTag(Tag).fetchTextLayoutResult().layoutInput.text.text)
@@ -430,13 +346,7 @@
     @Test
     fun textLayoutResultSemanticsAreUpdated_afterRecomposition() {
         val state = TextFieldState()
-        rule.setContent {
-            BasicTextField(
-                state = state,
-                modifier = Modifier
-                    .testTag(Tag)
-            )
-        }
+        rule.setContent { BasicTextField(state = state, modifier = Modifier.testTag(Tag)) }
 
         rule.onNodeWithTag(Tag).assertTextEquals("")
         rule.onNodeWithTag(Tag).performTextInput("hello")
@@ -507,10 +417,7 @@
         val clipboardManager = FakeClipboardManager("Hello")
         rule.setContent {
             CompositionLocalProvider(LocalClipboardManager provides clipboardManager) {
-                BasicTextField(
-                    state = state,
-                    modifier = Modifier.testTag(Tag)
-                )
+                BasicTextField(state = state, modifier = Modifier.testTag(Tag))
             }
         }
 
@@ -561,30 +468,20 @@
         val clipboardManager = FakeClipboardManager()
         rule.setContent {
             CompositionLocalProvider(LocalClipboardManager provides clipboardManager) {
-                BasicTextField(
-                    state = state,
-                    modifier = Modifier.testTag(Tag)
-                )
+                BasicTextField(state = state, modifier = Modifier.testTag(Tag))
             }
         }
 
         rule.onNodeWithTag(Tag).performTextInputSelection(TextRange(0, 5))
         rule.onNodeWithTag(Tag).performSemanticsAction(SemanticsActions.CopyText)
 
-        rule.runOnIdle {
-            assertThat(clipboardManager.getText()?.toString()).isEqualTo("Hello")
-        }
+        rule.runOnIdle { assertThat(clipboardManager.getText()?.toString()).isEqualTo("Hello") }
     }
 
     @Test
     fun semantics_copy_disabled_whenSelectionCollapsed() {
         val state = TextFieldState("Hello World!")
-        rule.setContent {
-            BasicTextField(
-                state = state,
-                modifier = Modifier.testTag(Tag)
-            )
-        }
+        rule.setContent { BasicTextField(state = state, modifier = Modifier.testTag(Tag)) }
 
         rule.onNodeWithTag(Tag).assert(SemanticsMatcher.keyNotDefined(SemanticsActions.CopyText))
     }
@@ -610,9 +507,7 @@
 
         rule.onNodeWithTag(Tag).performSemanticsAction(SemanticsActions.CopyText)
 
-        rule.runOnIdle {
-            assertThat(state.selection).isEqualTo(TextRange(0, 5))
-        }
+        rule.runOnIdle { assertThat(state.selection).isEqualTo(TextRange(0, 5)) }
     }
 
     @Test
@@ -621,10 +516,7 @@
         val clipboardManager = FakeClipboardManager()
         rule.setContent {
             CompositionLocalProvider(LocalClipboardManager provides clipboardManager) {
-                BasicTextField(
-                    state = state,
-                    modifier = Modifier.testTag(Tag)
-                )
+                BasicTextField(state = state, modifier = Modifier.testTag(Tag))
             }
         }
 
@@ -646,9 +538,7 @@
                 BasicTextField(
                     state = state,
                     modifier = Modifier.testTag(Tag),
-                    inputTransformation = {
-                        revertAllChanges()
-                    }
+                    inputTransformation = { revertAllChanges() }
                 )
             }
         }
@@ -730,13 +620,14 @@
     fun inputTransformationSemantics_areApplied() {
         val state = TextFieldState()
         val semanticsPropertyKey = SemanticsPropertyKey<Int>("InputTransformation")
-        val transformation = object : InputTransformation {
-            override fun SemanticsPropertyReceiver.applySemantics() {
-                this[semanticsPropertyKey] = 2
-            }
+        val transformation =
+            object : InputTransformation {
+                override fun SemanticsPropertyReceiver.applySemantics() {
+                    this[semanticsPropertyKey] = 2
+                }
 
-            override fun TextFieldBuffer.transformInput() = Unit
-        }
+                override fun TextFieldBuffer.transformInput() = Unit
+            }
         rule.setContent {
             BasicTextField(
                 state = state,
@@ -752,13 +643,14 @@
         val state = TextFieldState()
         var number by mutableIntStateOf(1)
         val semanticsPropertyKey = SemanticsPropertyKey<Int>("InputTransformation")
-        val transformation = object : InputTransformation {
-            override fun SemanticsPropertyReceiver.applySemantics() {
-                this[semanticsPropertyKey] = number
-            }
+        val transformation =
+            object : InputTransformation {
+                override fun SemanticsPropertyReceiver.applySemantics() {
+                    this[semanticsPropertyKey] = number
+                }
 
-            override fun TextFieldBuffer.transformInput() = Unit
-        }
+                override fun TextFieldBuffer.transformInput() = Unit
+            }
         rule.setContent {
             BasicTextField(
                 state = state,
@@ -800,7 +692,6 @@
 }
 
 internal fun SemanticsNodeInteraction.assertSelection(expected: TextRange) {
-    val selection = fetchSemanticsNode().config
-        .getOrNull(SemanticsProperties.TextSelectionRange)
+    val selection = fetchSemanticsNode().config.getOrNull(SemanticsProperties.TextSelectionRange)
     assertThat(selection).isEqualTo(expected)
 }
diff --git a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/input/BasicTextFieldSendKeyEventTest.kt b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/input/BasicTextFieldSendKeyEventTest.kt
index e3c3a42..add6b16 100644
--- a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/input/BasicTextFieldSendKeyEventTest.kt
+++ b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/input/BasicTextFieldSendKeyEventTest.kt
@@ -38,11 +38,9 @@
 @RunWith(AndroidJUnit4::class)
 internal class BasicTextFieldSendKeyEventTest {
 
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
-    @get:Rule
-    val immRule = ComposeInputMethodManagerTestRule()
+    @get:Rule val immRule = ComposeInputMethodManagerTestRule()
 
     private val inputMethodInterceptor = InputMethodInterceptor(rule)
 
@@ -53,22 +51,21 @@
         lateinit var imm: FakeInputMethodManager
         lateinit var originalFactory: ((View) -> ComposeInputMethodManager)
 
-        originalFactory = immRule.setFactory {
-            val actualImm = originalFactory(it)
-            imm = object : FakeInputMethodManager() {
-                override fun sendKeyEvent(event: KeyEvent) {
-                    actualImm.sendKeyEvent(event)
-                }
+        originalFactory =
+            immRule.setFactory {
+                val actualImm = originalFactory(it)
+                imm =
+                    object : FakeInputMethodManager() {
+                        override fun sendKeyEvent(event: KeyEvent) {
+                            actualImm.sendKeyEvent(event)
+                        }
+                    }
+                imm
             }
-            imm
-        }
 
         val state = TextFieldState()
         inputMethodInterceptor.setContent {
-            BasicTextField(
-                state = state,
-                modifier = Modifier.testTag(Tag)
-            )
+            BasicTextField(state = state, modifier = Modifier.testTag(Tag))
         }
         requestFocus()
 
@@ -90,22 +87,21 @@
         lateinit var imm: FakeInputMethodManager
         lateinit var originalFactory: ((View) -> ComposeInputMethodManager)
 
-        originalFactory = immRule.setFactory {
-            val actualImm = originalFactory(it)
-            imm = object : FakeInputMethodManager() {
-                override fun sendKeyEvent(event: KeyEvent) {
-                    actualImm.sendKeyEvent(event)
-                }
+        originalFactory =
+            immRule.setFactory {
+                val actualImm = originalFactory(it)
+                imm =
+                    object : FakeInputMethodManager() {
+                        override fun sendKeyEvent(event: KeyEvent) {
+                            actualImm.sendKeyEvent(event)
+                        }
+                    }
+                imm
             }
-            imm
-        }
 
         val state = TextFieldState("abc")
         inputMethodInterceptor.setContent {
-            BasicTextField(
-                state = state,
-                modifier = Modifier.testTag(Tag)
-            )
+            BasicTextField(state = state, modifier = Modifier.testTag(Tag))
         }
         requestFocus()
 
@@ -125,18 +121,23 @@
     private fun requestFocus() = rule.onNodeWithTag(Tag).requestFocus()
 }
 
-/**
- * Creates a native [KeyEvent] instance that originates from IME.
- */
+/** Creates a native [KeyEvent] instance that originates from IME. */
 private fun softKeyEvent(keyCode: Int, keyEventType: KeyEventType): KeyEvent {
-    val action = when (keyEventType) {
-        KeyEventType.KeyDown -> KeyEvent.ACTION_DOWN
-        KeyEventType.KeyUp -> KeyEvent.ACTION_UP
-        else -> error("Unknown key event type")
-    }
+    val action =
+        when (keyEventType) {
+            KeyEventType.KeyDown -> KeyEvent.ACTION_DOWN
+            KeyEventType.KeyUp -> KeyEvent.ACTION_UP
+            else -> error("Unknown key event type")
+        }
     return KeyEvent(
-        0L, 0L, action, keyCode, 0, 0,
-        KeyCharacterMap.VIRTUAL_KEYBOARD, 0,
+        0L,
+        0L,
+        action,
+        keyCode,
+        0,
+        0,
+        KeyCharacterMap.VIRTUAL_KEYBOARD,
+        0,
         KeyEvent.FLAG_SOFT_KEYBOARD or KeyEvent.FLAG_KEEP_TOUCH_MODE
     )
 }
diff --git a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/input/BasicTextFieldTest.kt b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/input/BasicTextFieldTest.kt
index a514d99..df4d246 100644
--- a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/input/BasicTextFieldTest.kt
+++ b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/input/BasicTextFieldTest.kt
@@ -115,11 +115,9 @@
 @LargeTest
 @RunWith(AndroidJUnit4::class)
 internal class BasicTextFieldTest {
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
-    @get:Rule
-    val immRule = ComposeInputMethodManagerTestRule()
+    @get:Rule val immRule = ComposeInputMethodManagerTestRule()
 
     private val inputMethodInterceptor = InputMethodInterceptor(rule)
 
@@ -149,31 +147,19 @@
     fun textFieldState_textChange_updatesState() {
         val state = TextFieldState("Hello ", TextRange(Int.MAX_VALUE))
         inputMethodInterceptor.setTextFieldTestContent {
-            BasicTextField(
-                state = state,
-                modifier = Modifier
-                    .fillMaxSize()
-                    .testTag(Tag)
-            )
+            BasicTextField(state = state, modifier = Modifier.fillMaxSize().testTag(Tag))
         }
 
         rule.onNodeWithTag(Tag).performTextInput("World!")
 
-        rule.runOnIdle {
-            assertThat(state.text.toString()).isEqualTo("Hello World!")
-        }
+        rule.runOnIdle { assertThat(state.text.toString()).isEqualTo("Hello World!") }
     }
 
     @Test
     fun textFieldState_textChange_updatesSemantics() {
         val state = TextFieldState("Hello ", TextRange(Int.MAX_VALUE))
         inputMethodInterceptor.setTextFieldTestContent {
-            BasicTextField(
-                state = state,
-                modifier = Modifier
-                    .fillMaxSize()
-                    .testTag(Tag)
-            )
+            BasicTextField(state = state, modifier = Modifier.fillMaxSize().testTag(Tag))
         }
 
         rule.onNodeWithTag(Tag).performTextInput("World!")
@@ -194,9 +180,7 @@
             compositionCount++
             BasicTextField(
                 state = state,
-                modifier = Modifier
-                    .fillMaxSize()
-                    .testTag(Tag),
+                modifier = Modifier.fillMaxSize().testTag(Tag),
             )
         }
 
@@ -204,9 +188,7 @@
         rule.onNodeWithTag(Tag).performTextInput("world")
 
         rule.onNodeWithTag(Tag).assertTextEquals("helloworld")
-        rule.runOnIdle {
-            assertThat(compositionCount).isEqualTo(1)
-        }
+        rule.runOnIdle { assertThat(compositionCount).isEqualTo(1) }
     }
 
     @Test
@@ -218,9 +200,7 @@
         inputMethodInterceptor.setTextFieldTestContent {
             BasicTextField(
                 state = state,
-                modifier = Modifier
-                    .fillMaxSize()
-                    .testTag(Tag),
+                modifier = Modifier.fillMaxSize().testTag(Tag),
                 textStyle = style,
                 onTextLayout = { textLayoutResultState = it }
             )
@@ -251,9 +231,7 @@
         inputMethodInterceptor.setTextFieldTestContent {
             BasicTextField(
                 state = state,
-                modifier = Modifier
-                    .fillMaxSize()
-                    .testTag(Tag),
+                modifier = Modifier.fillMaxSize().testTag(Tag),
                 textStyle = style,
                 onTextLayout = { textLayoutResultState = it }
             )
@@ -282,14 +260,15 @@
         var textLayoutResultState: (() -> TextLayoutResult?)? by mutableStateOf(null)
         val textLayoutResults = mutableListOf<TextLayoutResult?>()
         inputMethodInterceptor.setTextFieldTestContent {
-            CompositionLocalProvider(LocalWindowInfo provides object : WindowInfo {
-                override val isWindowFocused = true
-            }) {
+            CompositionLocalProvider(
+                LocalWindowInfo provides
+                    object : WindowInfo {
+                        override val isWindowFocused = true
+                    }
+            ) {
                 BasicTextField(
                     state = state,
-                    modifier = Modifier
-                        .fillMaxSize()
-                        .testTag(Tag),
+                    modifier = Modifier.fillMaxSize().testTag(Tag),
                     onTextLayout = { textLayoutResultState = it }
                 )
             }
@@ -314,12 +293,7 @@
     fun textField_focus_showsSoftwareKeyboard() {
         val state = TextFieldState()
         inputMethodInterceptor.setTextFieldTestContent {
-            BasicTextField(
-                state = state,
-                modifier = Modifier
-                    .fillMaxSize()
-                    .testTag(Tag)
-            )
+            BasicTextField(state = state, modifier = Modifier.fillMaxSize().testTag(Tag))
         }
 
         rule.onNodeWithTag(Tag).performClick()
@@ -335,9 +309,7 @@
             BasicTextField(
                 state = state,
                 enabled = false,
-                modifier = Modifier
-                    .fillMaxSize()
-                    .testTag(Tag)
+                modifier = Modifier.fillMaxSize().testTag(Tag)
             )
         }
 
@@ -354,9 +326,7 @@
             BasicTextField(
                 state = state,
                 readOnly = true,
-                modifier = Modifier
-                    .fillMaxSize()
-                    .testTag(Tag)
+                modifier = Modifier.fillMaxSize().testTag(Tag)
             )
         }
 
@@ -374,15 +344,10 @@
             BasicTextField(
                 state = state,
                 keyboardOptions = KeyboardOptions(showKeyboardOnFocus = false),
-                modifier = Modifier
-                    .fillMaxSize()
-                    .testTag(Tag)
-                    .focusRequester(focusRequester)
+                modifier = Modifier.fillMaxSize().testTag(Tag).focusRequester(focusRequester)
             )
         }
-        rule.runOnUiThread {
-            focusRequester.requestFocus()
-        }
+        rule.runOnUiThread { focusRequester.requestFocus() }
         rule.waitForIdle()
         rule.onNodeWithTag(Tag).assertIsFocused()
 
@@ -397,15 +362,10 @@
             BasicTextField(
                 state = state,
                 keyboardOptions = KeyboardOptions(showKeyboardOnFocus = false),
-                modifier = Modifier
-                    .fillMaxSize()
-                    .testTag(Tag)
-                    .focusRequester(focusRequester)
+                modifier = Modifier.fillMaxSize().testTag(Tag).focusRequester(focusRequester)
             )
         }
-        rule.runOnUiThread {
-            focusRequester.requestFocus()
-        }
+        rule.runOnUiThread { focusRequester.requestFocus() }
         rule.waitForIdle()
         rule.onNodeWithTag(Tag).assertIsFocused()
         rule.onNodeWithTag(Tag).performClick()
@@ -419,10 +379,7 @@
         var toggle by mutableStateOf(true)
         inputMethodInterceptor.setContent {
             if (toggle) {
-                BasicTextField(
-                    state = state,
-                    modifier = Modifier.testTag("TextField")
-                )
+                BasicTextField(state = state, modifier = Modifier.testTag("TextField"))
             }
         }
 
@@ -442,14 +399,8 @@
             focusManager = LocalFocusManager.current
             Row {
                 // Extra focusable that takes initial focus when focus is cleared.
-                Box(
-                    Modifier
-                        .size(10.dp)
-                        .focusable())
-                BasicTextField(
-                    state = state,
-                    modifier = Modifier.testTag("TextField")
-                )
+                Box(Modifier.size(10.dp).focusable())
+                BasicTextField(state = state, modifier = Modifier.testTag("TextField"))
             }
         }
 
@@ -457,9 +408,7 @@
 
         inputMethodInterceptor.assertSessionActive()
 
-        rule.runOnIdle {
-            focusManager.clearFocus()
-        }
+        rule.runOnIdle { focusManager.clearFocus() }
 
         inputMethodInterceptor.assertNoSessionActive()
     }
@@ -474,9 +423,7 @@
             BasicTextField(
                 state = state,
                 enabled = true,
-                modifier = Modifier
-                    .fillMaxSize()
-                    .testTag(Tag)
+                modifier = Modifier.fillMaxSize().testTag(Tag)
             )
         }
 
@@ -495,9 +442,7 @@
             BasicTextField(
                 state = state,
                 enabled = true,
-                modifier = Modifier
-                    .fillMaxSize()
-                    .testTag(Tag)
+                modifier = Modifier.fillMaxSize().testTag(Tag)
             )
         }
 
@@ -522,11 +467,12 @@
                 state = state,
                 modifier = Modifier.testTag(Tag),
                 // We don't need to test all combinations here, that is tested in EditorInfoTest.
-                keyboardOptions = KeyboardOptions(
-                    capitalization = KeyboardCapitalization.Characters,
-                    keyboardType = KeyboardType.Email,
-                    imeAction = ImeAction.Previous
-                )
+                keyboardOptions =
+                    KeyboardOptions(
+                        capitalization = KeyboardCapitalization.Characters,
+                        keyboardType = KeyboardType.Email,
+                        imeAction = ImeAction.Previous
+                    )
             )
         }
         requestFocus(Tag)
@@ -566,9 +512,7 @@
         }
         requestFocus(Tag)
 
-        inputMethodInterceptor.withInputConnection {
-            setComposingText("hello", 1)
-        }
+        inputMethodInterceptor.withInputConnection { setComposingText("hello", 1) }
         rule.onNodeWithTag(Tag).assertTextEquals("")
         assertThat(state.composition).isNull()
     }
@@ -917,12 +861,10 @@
 
     @Test
     fun textField_filterKeyboardOptions_sentToIme() {
-        val filter = KeyboardOptionsFilter(
-            KeyboardOptions(
-                keyboardType = KeyboardType.Email,
-                imeAction = ImeAction.Previous
+        val filter =
+            KeyboardOptionsFilter(
+                KeyboardOptions(keyboardType = KeyboardType.Email, imeAction = ImeAction.Previous)
             )
-        )
         inputMethodInterceptor.setTextFieldTestContent {
             BasicTextField(
                 state = rememberTextFieldState(),
@@ -977,18 +919,22 @@
 
     @Test
     fun textField_filterKeyboardOptions_applyWhenFilterChanged() {
-        var filter by mutableStateOf(
-            KeyboardOptionsFilter(
-                KeyboardOptions(
-                    keyboardType = KeyboardType.Email,
-                    imeAction = ImeAction.Previous
+        var filter by
+            mutableStateOf(
+                KeyboardOptionsFilter(
+                    KeyboardOptions(
+                        keyboardType = KeyboardType.Email,
+                        imeAction = ImeAction.Previous
+                    )
                 )
             )
-        )
         inputMethodInterceptor.setTextFieldTestContent {
-            CompositionLocalProvider(LocalWindowInfo provides object : WindowInfo {
-                override val isWindowFocused = true
-            }) {
+            CompositionLocalProvider(
+                LocalWindowInfo provides
+                    object : WindowInfo {
+                        override val isWindowFocused = true
+                    }
+            ) {
                 BasicTextField(
                     state = rememberTextFieldState(),
                     modifier = Modifier.testTag(Tag),
@@ -1003,12 +949,10 @@
             assertThat(inputType and InputType.TYPE_TEXT_VARIATION_EMAIL_ADDRESS).isNotEqualTo(0)
         }
 
-        filter = KeyboardOptionsFilter(
-            KeyboardOptions(
-                keyboardType = KeyboardType.Decimal,
-                imeAction = ImeAction.Search
+        filter =
+            KeyboardOptionsFilter(
+                KeyboardOptions(keyboardType = KeyboardType.Decimal, imeAction = ImeAction.Search)
             )
-        )
 
         inputMethodInterceptor.withEditorInfo {
             assertThat(imeOptions and EditorInfo.IME_ACTION_SEARCH).isNotEqualTo(0)
@@ -1024,10 +968,7 @@
             CompositionLocalProvider(
                 LocalSoftwareKeyboardController provides testKeyboardController
             ) {
-                BasicTextField(
-                    state = rememberTextFieldState(),
-                    modifier = Modifier.testTag(Tag)
-                )
+                BasicTextField(state = rememberTextFieldState(), modifier = Modifier.testTag(Tag))
             }
         }
         // Focusing the field will show the keyboard without using the SoftwareKeyboardController.
@@ -1044,10 +985,7 @@
     @Test
     fun swipingThroughTextField_doesNotGainFocus() {
         inputMethodInterceptor.setTextFieldTestContent {
-            BasicTextField(
-                state = rememberTextFieldState(),
-                modifier = Modifier.testTag(Tag)
-            )
+            BasicTextField(state = rememberTextFieldState(), modifier = Modifier.testTag(Tag))
         }
 
         rule.onNodeWithTag(Tag).performTouchInput {
@@ -1061,15 +999,8 @@
     fun swipingTextFieldInScrollableContainer_doesNotGainFocus() {
         val scrollState = ScrollState(0)
         inputMethodInterceptor.setTextFieldTestContent {
-            Column(
-                Modifier
-                    .height(100.dp)
-                    .verticalScroll(scrollState)
-            ) {
-                BasicTextField(
-                    state = rememberTextFieldState(),
-                    modifier = Modifier.testTag(Tag)
-                )
+            Column(Modifier.height(100.dp).verticalScroll(scrollState)) {
+                BasicTextField(state = rememberTextFieldState(), modifier = Modifier.testTag(Tag))
                 Box(Modifier.height(200.dp))
             }
         }
@@ -1088,10 +1019,7 @@
             CompositionLocalProvider(LocalDensity provides density) {
                 BasicTextField(
                     state = state,
-                    textStyle = TextStyle(
-                        fontFamily = TEST_FONT_FAMILY,
-                        fontSize = fontSize
-                    ),
+                    textStyle = TextStyle(fontFamily = TEST_FONT_FAMILY, fontSize = fontSize),
                     modifier = Modifier.testTag(Tag)
                 )
             }
@@ -1114,17 +1042,18 @@
         val shortText = "Text".repeat(2)
 
         lateinit var tfs: TextFieldState
-        val clipboardManager = object : ClipboardManager {
-            var contents: AnnotatedString? = null
+        val clipboardManager =
+            object : ClipboardManager {
+                var contents: AnnotatedString? = null
 
-            override fun setText(annotatedString: AnnotatedString) {
-                contents = annotatedString
-            }
+                override fun setText(annotatedString: AnnotatedString) {
+                    contents = annotatedString
+                }
 
-            override fun getText(): AnnotatedString? {
-                return contents
+                override fun getText(): AnnotatedString? {
+                    return contents
+                }
             }
-        }
         inputMethodInterceptor.setTextFieldTestContent {
             tfs = rememberTextFieldState(shortText)
             CompositionLocalProvider(LocalClipboardManager provides clipboardManager) {
@@ -1153,10 +1082,7 @@
         immRule.setFactory { imm }
         val state = TextFieldState("Hello")
         inputMethodInterceptor.setTextFieldTestContent {
-            BasicTextField(
-                state = state,
-                modifier = Modifier.testTag(Tag)
-            )
+            BasicTextField(state = state, modifier = Modifier.testTag(Tag))
         }
 
         requestFocus(Tag)
@@ -1177,18 +1103,13 @@
         val state = TextFieldState("Hello", initialSelection = TextRange(0, 2))
         inputMethodInterceptor.setTextFieldTestContent {
             CompositionLocalProvider(LocalClipboardManager provides clipboardManager) {
-                BasicTextField(
-                    state = state,
-                    modifier = Modifier.testTag(Tag)
-                )
+                BasicTextField(state = state, modifier = Modifier.testTag(Tag))
             }
         }
 
         requestFocus(Tag)
 
-        inputMethodInterceptor.withInputConnection {
-            performContextMenuAction(android.R.id.cut)
-        }
+        inputMethodInterceptor.withInputConnection { performContextMenuAction(android.R.id.cut) }
 
         rule.runOnIdle {
             assertThat(clipboardManager.getText()?.text).isEqualTo("He")
@@ -1202,22 +1123,15 @@
         val state = TextFieldState("Hello", initialSelection = TextRange(0, 2))
         inputMethodInterceptor.setTextFieldTestContent {
             CompositionLocalProvider(LocalClipboardManager provides clipboardManager) {
-                BasicTextField(
-                    state = state,
-                    modifier = Modifier.testTag(Tag)
-                )
+                BasicTextField(state = state, modifier = Modifier.testTag(Tag))
             }
         }
 
         requestFocus(Tag)
 
-        inputMethodInterceptor.withInputConnection {
-            performContextMenuAction(android.R.id.copy)
-        }
+        inputMethodInterceptor.withInputConnection { performContextMenuAction(android.R.id.copy) }
 
-        rule.runOnIdle {
-            assertThat(clipboardManager.getText()?.text).isEqualTo("He")
-        }
+        rule.runOnIdle { assertThat(clipboardManager.getText()?.text).isEqualTo("He") }
     }
 
     @Test
@@ -1226,18 +1140,13 @@
         val state = TextFieldState("Hello", initialSelection = TextRange(0, 4))
         inputMethodInterceptor.setTextFieldTestContent {
             CompositionLocalProvider(LocalClipboardManager provides clipboardManager) {
-                BasicTextField(
-                    state = state,
-                    modifier = Modifier.testTag(Tag)
-                )
+                BasicTextField(state = state, modifier = Modifier.testTag(Tag))
             }
         }
 
         requestFocus(Tag)
 
-        inputMethodInterceptor.withInputConnection {
-            performContextMenuAction(android.R.id.paste)
-        }
+        inputMethodInterceptor.withInputConnection { performContextMenuAction(android.R.id.paste) }
 
         rule.runOnIdle {
             assertThat(state.text.toString()).isEqualTo("Worldo")
@@ -1250,12 +1159,13 @@
     fun textField_textAlignCenter_defaultWidth() {
         val fontSize = 50
         val density = Density(1f, 1f)
-        val textStyle = TextStyle(
-            textAlign = TextAlign.Center,
-            color = Color.Black,
-            fontFamily = TEST_FONT_FAMILY,
-            fontSize = fontSize.sp
-        )
+        val textStyle =
+            TextStyle(
+                textAlign = TextAlign.Center,
+                color = Color.Black,
+                fontFamily = TEST_FONT_FAMILY,
+                fontSize = fontSize.sp
+            )
         rule.setContent {
             CompositionLocalProvider(LocalDensity provides density) {
                 BasicTextField(
@@ -1276,26 +1186,27 @@
     fun textField_textAlignCenter_widthSmallerThanDefaultWidth() {
         val fontSize = 50
         val density = Density(1f, 1f)
-        val textStyle = TextStyle(
-            textAlign = TextAlign.Center,
-            color = Color.Black,
-            fontFamily = TEST_FONT_FAMILY,
-            fontSize = fontSize.sp
-        )
+        val textStyle =
+            TextStyle(
+                textAlign = TextAlign.Center,
+                color = Color.Black,
+                fontFamily = TEST_FONT_FAMILY,
+                fontSize = fontSize.sp
+            )
         rule.setContent {
             val fontFamilyResolver = LocalFontFamilyResolver.current
-            val defaultWidth = computeSizeForDefaultText(
-                style = textStyle,
-                density = density,
-                fontFamilyResolver = fontFamilyResolver,
-                maxLines = 1
-            ).width
+            val defaultWidth =
+                computeSizeForDefaultText(
+                        style = textStyle,
+                        density = density,
+                        fontFamilyResolver = fontFamilyResolver,
+                        maxLines = 1
+                    )
+                    .width
 
             CompositionLocalProvider(LocalDensity provides density) {
                 BasicTextField(
-                    modifier = Modifier
-                        .testTag(Tag)
-                        .width(defaultWidth.dp / 2),
+                    modifier = Modifier.testTag(Tag).width(defaultWidth.dp / 2),
                     state = rememberTextFieldState("A"),
                     textStyle = textStyle,
                     lineLimits = TextFieldLineLimits.SingleLine
@@ -1312,26 +1223,27 @@
     fun textField_textAlignCenter_widthLargerThanDefaultWidth() {
         val fontSize = 50
         val density = Density(1f, 1f)
-        val textStyle = TextStyle(
-            textAlign = TextAlign.Center,
-            color = Color.Black,
-            fontFamily = TEST_FONT_FAMILY,
-            fontSize = fontSize.sp
-        )
+        val textStyle =
+            TextStyle(
+                textAlign = TextAlign.Center,
+                color = Color.Black,
+                fontFamily = TEST_FONT_FAMILY,
+                fontSize = fontSize.sp
+            )
         rule.setContent {
             val fontFamilyResolver = LocalFontFamilyResolver.current
-            val defaultWidth = computeSizeForDefaultText(
-                style = textStyle,
-                density = density,
-                fontFamilyResolver = fontFamilyResolver,
-                maxLines = 1
-            ).width
+            val defaultWidth =
+                computeSizeForDefaultText(
+                        style = textStyle,
+                        density = density,
+                        fontFamilyResolver = fontFamilyResolver,
+                        maxLines = 1
+                    )
+                    .width
 
             CompositionLocalProvider(LocalDensity provides density) {
                 BasicTextField(
-                    modifier = Modifier
-                        .testTag(Tag)
-                        .width(defaultWidth.dp * 2),
+                    modifier = Modifier.testTag(Tag).width(defaultWidth.dp * 2),
                     state = rememberTextFieldState("A"),
                     textStyle = textStyle,
                     lineLimits = TextFieldLineLimits.SingleLine
@@ -1401,18 +1313,17 @@
         }
 
         requestFocus(Tag)
-        inputMethodInterceptor.withInputConnection {
-            setComposingRegion(0, 5)
-        }
+        inputMethodInterceptor.withInputConnection { setComposingRegion(0, 5) }
         rule.runOnIdle {
             val currentTextLayout = textLayoutProvider?.invoke()
             assertThat(currentTextLayout).isNotNull()
 
-            val expectedSpan = AnnotatedString.Range(
-                item = SpanStyle(textDecoration = TextDecoration.Underline),
-                start = 0,
-                end = 5
-            )
+            val expectedSpan =
+                AnnotatedString.Range(
+                    item = SpanStyle(textDecoration = TextDecoration.Underline),
+                    start = 0,
+                    end = 5
+                )
             assertThat(currentTextLayout!!.multiParagraph.intrinsics.annotatedString.spanStyles)
                 .contains(expectedSpan)
         }
@@ -1439,41 +1350,40 @@
             val initialTextLayout = textLayoutProvider?.invoke()
             assertThat(initialTextLayout).isNotNull()
 
-            val expectedSpan = AnnotatedString.Range(
-                item = SpanStyle(textDecoration = TextDecoration.Underline),
-                start = 0,
-                end = 5
-            )
+            val expectedSpan =
+                AnnotatedString.Range(
+                    item = SpanStyle(textDecoration = TextDecoration.Underline),
+                    start = 0,
+                    end = 5
+                )
             assertThat(initialTextLayout!!.multiParagraph.intrinsics.annotatedString.spanStyles)
                 .contains(expectedSpan)
         }
 
         // change composing region
-        inputMethodInterceptor.withInputConnection {
-            setComposingRegion(7, 12)
-        }
+        inputMethodInterceptor.withInputConnection { setComposingRegion(7, 12) }
 
         // assert the changed region
         rule.runOnIdle {
             val currentTextLayout = textLayoutProvider?.invoke()
             assertThat(currentTextLayout).isNotNull()
 
-            val expectedSpan = AnnotatedString.Range(
-                item = SpanStyle(textDecoration = TextDecoration.Underline),
-                start = 7,
-                end = 12
-            )
+            val expectedSpan =
+                AnnotatedString.Range(
+                    item = SpanStyle(textDecoration = TextDecoration.Underline),
+                    start = 7,
+                    end = 12
+                )
             assertThat(currentTextLayout!!.multiParagraph.intrinsics.annotatedString.spanStyles)
                 .contains(expectedSpan)
         }
     }
 
-    private fun requestFocus(tag: String) =
-        rule.onNodeWithTag(tag).requestFocus()
+    private fun requestFocus(tag: String) = rule.onNodeWithTag(tag).requestFocus()
 
     private fun assertTextSelection(expected: TextRange) {
-        val selection = rule.onNodeWithTag(Tag).fetchSemanticsNode()
-            .config.getOrNull(TextSelectionRange)
+        val selection =
+            rule.onNodeWithTag(Tag).fetchSemanticsNode().config.getOrNull(TextSelectionRange)
         assertThat(selection).isEqualTo(expected)
     }
 
@@ -1499,8 +1409,8 @@
 }
 
 /**
- * Checks whether the given image is horizontally symmetrical where a region that has the width
- * of [excludedWidth] around the center is excluded.
+ * Checks whether the given image is horizontally symmetrical where a region that has the width of
+ * [excludedWidth] around the center is excluded.
  */
 private fun ImageBitmap.assertHorizontallySymmetrical(excludedWidth: Int) {
     val pixel = toPixelMap()
diff --git a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/input/ComposeInputMethodManagerTestRule.kt b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/input/ComposeInputMethodManagerTestRule.kt
index baab893..2e65703 100644
--- a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/input/ComposeInputMethodManagerTestRule.kt
+++ b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/input/ComposeInputMethodManagerTestRule.kt
@@ -34,7 +34,7 @@
      * Replaces the [ComposeInputMethodManager] factory with the given [factory].
      *
      * @return The initial factory that can be used to delegate select calls to not fully override
-     * the default [ComposeInputMethodManager].
+     *   the default [ComposeInputMethodManager].
      */
     fun setFactory(
         factory: (View) -> ComposeInputMethodManager
diff --git a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/input/DecorationBoxTest.kt b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/input/DecorationBoxTest.kt
index 0783b23..bebafcc 100644
--- a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/input/DecorationBoxTest.kt
+++ b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/input/DecorationBoxTest.kt
@@ -59,8 +59,7 @@
 @RunWith(AndroidJUnit4::class)
 class DecorationBoxTest {
 
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
     private val Tag = "BasicTextField"
     private val DecorationTag = "DecorationBox"
@@ -74,10 +73,10 @@
                 modifier = Modifier.testTag(Tag),
                 decorator = { innerTextField ->
                     Box(
-                        modifier = Modifier
-                            .border(BorderStroke(2.dp, SolidColor(Color.Red)))
-                            .padding(16.dp)
-                            .testTag(DecorationTag)
+                        modifier =
+                            Modifier.border(BorderStroke(2.dp, SolidColor(Color.Red)))
+                                .padding(16.dp)
+                                .testTag(DecorationTag)
                     ) {
                         innerTextField()
                     }
@@ -101,10 +100,10 @@
                 modifier = Modifier.testTag(Tag),
                 decorator = { innerTextField ->
                     Box(
-                        modifier = Modifier
-                            .border(BorderStroke(2.dp, SolidColor(Color.Red)))
-                            .padding(16.dp)
-                            .testTag(DecorationTag)
+                        modifier =
+                            Modifier.border(BorderStroke(2.dp, SolidColor(Color.Red)))
+                                .padding(16.dp)
+                                .testTag(DecorationTag)
                     ) {
                         innerTextField()
                     }
@@ -128,10 +127,10 @@
                 modifier = Modifier.testTag(Tag),
                 decorator = { innerTextField ->
                     Box(
-                        modifier = Modifier
-                            .border(BorderStroke(2.dp, SolidColor(Color.Red)))
-                            .padding(16.dp)
-                            .testTag(DecorationTag)
+                        modifier =
+                            Modifier.border(BorderStroke(2.dp, SolidColor(Color.Red)))
+                                .padding(16.dp)
+                                .testTag(DecorationTag)
                     ) {
                         innerTextField()
                     }
@@ -158,9 +157,9 @@
                 modifier = Modifier.testTag(Tag),
                 decorator = {
                     Box(
-                        modifier = Modifier
-                            .border(BorderStroke(2.dp, SolidColor(Color.Red)))
-                            .padding(16.dp)
+                        modifier =
+                            Modifier.border(BorderStroke(2.dp, SolidColor(Color.Red)))
+                                .padding(16.dp)
                     )
                 }
             )
@@ -172,9 +171,7 @@
             performTextInput("hello")
         }
 
-        rule.runOnIdle {
-            assertThat(state.text.toString()).isEqualTo("hello")
-        }
+        rule.runOnIdle { assertThat(state.text.toString()).isEqualTo("hello") }
     }
 
     @OptIn(ExperimentalTestApi::class)
@@ -187,9 +184,9 @@
                 modifier = Modifier.testTag(Tag),
                 decorator = {
                     Box(
-                        modifier = Modifier
-                            .border(BorderStroke(2.dp, SolidColor(Color.Red)))
-                            .padding(16.dp)
+                        modifier =
+                            Modifier.border(BorderStroke(2.dp, SolidColor(Color.Red)))
+                                .padding(16.dp)
                     )
                 }
             )
@@ -207,9 +204,7 @@
             }
         }
 
-        rule.runOnIdle {
-            assertThat(state.text.toString()).isEqualTo("hello")
-        }
+        rule.runOnIdle { assertThat(state.text.toString()).isEqualTo("hello") }
     }
 
     @Test
@@ -231,13 +226,10 @@
 
         rule.waitForIdle()
 
-        assertThat(decorationBoxConstraints?.minWidth)
-            .isNotEqualTo(0)
-        assertThat(decorationBoxConstraints?.minWidth)
-            .isEqualTo(decorationBoxConstraints?.maxWidth)
+        assertThat(decorationBoxConstraints?.minWidth).isNotEqualTo(0)
+        assertThat(decorationBoxConstraints?.minWidth).isEqualTo(decorationBoxConstraints?.maxWidth)
 
-        assertThat(decorationBoxConstraints?.minHeight)
-            .isNotEqualTo(0)
+        assertThat(decorationBoxConstraints?.minHeight).isNotEqualTo(0)
         assertThat(decorationBoxConstraints?.minHeight)
             .isEqualTo(decorationBoxConstraints?.maxHeight)
     }
@@ -252,10 +244,10 @@
                 modifier = Modifier.testTag(Tag),
                 decorator = { innerTextField ->
                     Box(
-                        modifier = Modifier
-                            .border(BorderStroke(2.dp, SolidColor(Color.Red)))
-                            .padding(16.dp)
-                            .testTag(DecorationTag)
+                        modifier =
+                            Modifier.border(BorderStroke(2.dp, SolidColor(Color.Red)))
+                                .padding(16.dp)
+                                .testTag(DecorationTag)
                     ) {
                         innerTextField()
                     }
@@ -270,8 +262,6 @@
         }
 
         // assertThat selection happened
-        rule.runOnIdle {
-            assertThat(state.selection).isEqualTo(TextRange(0, 5))
-        }
+        rule.runOnIdle { assertThat(state.selection).isEqualTo(TextRange(0, 5)) }
     }
 }
diff --git a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/input/FakeInputMethodManager.kt b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/input/FakeInputMethodManager.kt
index 924e5b1..ce78be4 100644
--- a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/input/FakeInputMethodManager.kt
+++ b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/input/FakeInputMethodManager.kt
@@ -59,8 +59,9 @@
         compositionStart: Int,
         compositionEnd: Int
     ) {
-        calls += "updateSelection($selectionStart, $selectionEnd, " +
-            "$compositionStart, $compositionEnd)"
+        calls +=
+            "updateSelection($selectionStart, $selectionEnd, " +
+                "$compositionStart, $compositionEnd)"
     }
 
     override fun updateCursorAnchorInfo(info: CursorAnchorInfo) {
diff --git a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/input/HandwritingDetectorTest.kt b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/input/HandwritingDetectorTest.kt
index 3de2da2..bdc32865 100644
--- a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/input/HandwritingDetectorTest.kt
+++ b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/input/HandwritingDetectorTest.kt
@@ -44,11 +44,9 @@
 @MediumTest
 @RunWith(AndroidJUnit4::class)
 internal class HandwritingDetectorTest {
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
-    @get:Rule
-    val immRule = ComposeInputMethodManagerTestRule()
+    @get:Rule val immRule = ComposeInputMethodManagerTestRule()
 
     private val imm = FakeInputMethodManager()
 
@@ -70,25 +68,25 @@
         rule.setContent {
             Column(Modifier.safeContentPadding()) {
                 Spacer(
-                    modifier = Modifier
-                        .fillMaxWidth()
-                        .height(HandwritingBoundsVerticalOffset)
-                        .handwritingDetector { callbackCount++ }
-                        .testTag(detectorTag)
+                    modifier =
+                        Modifier.fillMaxWidth()
+                            .height(HandwritingBoundsVerticalOffset)
+                            .handwritingDetector { callbackCount++ }
+                            .testTag(detectorTag)
                 )
                 // This spacer is within the extended handwriting bounds of the detector
                 Spacer(
-                    modifier = Modifier
-                        .fillMaxWidth()
-                        .height(HandwritingBoundsVerticalOffset)
-                        .testTag(insideSpacerTag)
+                    modifier =
+                        Modifier.fillMaxWidth()
+                            .height(HandwritingBoundsVerticalOffset)
+                            .testTag(insideSpacerTag)
                 )
                 // This spacer is outside the extended handwriting bounds of the detector
                 Spacer(
-                    modifier = Modifier
-                        .fillMaxWidth()
-                        .height(HandwritingBoundsVerticalOffset)
-                        .testTag(outsideSpacerTag)
+                    modifier =
+                        Modifier.fillMaxWidth()
+                            .height(HandwritingBoundsVerticalOffset)
+                            .testTag(outsideSpacerTag)
                 )
             }
         }
diff --git a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/input/HandwritingHandlerTest.kt b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/input/HandwritingHandlerTest.kt
index 62e72ca..8551d6b 100644
--- a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/input/HandwritingHandlerTest.kt
+++ b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/input/HandwritingHandlerTest.kt
@@ -38,11 +38,9 @@
 @MediumTest
 @RunWith(AndroidJUnit4::class)
 internal class HandwritingHandlerTest {
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
-    @get:Rule
-    val immRule = ComposeInputMethodManagerTestRule()
+    @get:Rule val immRule = ComposeInputMethodManagerTestRule()
 
     @Before
     fun setup() {
@@ -64,8 +62,7 @@
             )
         }
 
-        rule.onNodeWithTag(tag)
-            .performSemanticsAction(SemanticsActions.RequestFocus)
+        rule.onNodeWithTag(tag).performSemanticsAction(SemanticsActions.RequestFocus)
 
         rule.runOnIdle {
             imm.expectCall("acceptStylusHandwritingDelegation")
diff --git a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/input/HeightInLinesModifierTest.kt b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/input/HeightInLinesModifierTest.kt
index 6d0af70..0129b23 100644
--- a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/input/HeightInLinesModifierTest.kt
+++ b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/input/HeightInLinesModifierTest.kt
@@ -64,16 +64,16 @@
 @RunWith(AndroidJUnit4::class)
 class HeightInLinesModifierTest {
 
-    private val longText = "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do " +
-        "eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam," +
-        " quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. " +
-        "Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu " +
-        "fugiat nulla pariatur."
+    private val longText =
+        "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do " +
+            "eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam," +
+            " quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. " +
+            "Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu " +
+            "fugiat nulla pariatur."
 
     private val context = InstrumentationRegistry.getInstrumentation().context
 
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
     @Test
     fun minLines_shortInputText() {
@@ -89,9 +89,7 @@
                     subjectHeight = it
                     positionedLatch.countDown()
                 },
-                onTextLayoutResult = {
-                    subjectLayout = it
-                },
+                onTextLayoutResult = { subjectLayout = it },
                 text = "abc",
                 lineLimits = MultiLine(minHeightInLines = 2)
             )
@@ -117,10 +115,8 @@
 
     @Test
     fun maxLines_shortInputText() {
-        val (textLayoutResult, height) = setTextFieldWithMaxLines(
-            text = "abc",
-            lines = MultiLine(maxHeightInLines = 5)
-        )
+        val (textLayoutResult, height) =
+            setTextFieldWithMaxLines(text = "abc", lines = MultiLine(maxHeightInLines = 5))
 
         rule.runOnIdle {
             assertThat(textLayoutResult).isNotNull()
@@ -143,18 +139,14 @@
     @Test(expected = IllegalArgumentException::class)
     fun minLines_invalidValue() {
         rule.setContent {
-            Box(
-                modifier = Modifier.heightInLines(textStyle = TextStyle.Default, minLines = 0)
-            )
+            Box(modifier = Modifier.heightInLines(textStyle = TextStyle.Default, minLines = 0))
         }
     }
 
     @Test(expected = IllegalArgumentException::class)
     fun maxLines_invalidValue() {
         rule.setContent {
-            Box(
-                modifier = Modifier.heightInLines(textStyle = TextStyle.Default, maxLines = 0)
-            )
+            Box(modifier = Modifier.heightInLines(textStyle = TextStyle.Default, maxLines = 0))
         }
     }
 
@@ -162,21 +154,20 @@
     fun minLines_greaterThan_maxLines_invalidValue() {
         rule.setContent {
             Box(
-                modifier = Modifier.heightInLines(
-                    textStyle = TextStyle.Default,
-                    minLines = 2,
-                    maxLines = 1
-                )
+                modifier =
+                    Modifier.heightInLines(
+                        textStyle = TextStyle.Default,
+                        minLines = 2,
+                        maxLines = 1
+                    )
             )
         }
     }
 
     @Test
     fun minLines_longInputText() {
-        val (textLayoutResult, height) = setTextFieldWithMaxLines(
-            text = longText,
-            MultiLine(minHeightInLines = 2)
-        )
+        val (textLayoutResult, height) =
+            setTextFieldWithMaxLines(text = longText, MultiLine(minHeightInLines = 2))
 
         rule.runOnIdle {
             assertThat(textLayoutResult).isNotNull()
@@ -200,9 +191,7 @@
                     subjectHeight = it
                     positionedLatch.countDown()
                 },
-                onTextLayoutResult = {
-                    subjectLayout = it
-                },
+                onTextLayoutResult = { subjectLayout = it },
                 text = longText,
                 lineLimits = MultiLine(maxHeightInLines = 2)
             )
@@ -234,21 +223,24 @@
         val resolver = createFontFamilyResolver(context, testDispatcher)
 
         val typefaceDeferred = CompletableDeferred<Typeface>()
-        val asyncLoader = object : AndroidFont.TypefaceLoader {
-            override fun loadBlocking(context: Context, font: AndroidFont): Typeface =
-                TODO("Not yet implemented")
+        val asyncLoader =
+            object : AndroidFont.TypefaceLoader {
+                override fun loadBlocking(context: Context, font: AndroidFont): Typeface =
+                    TODO("Not yet implemented")
 
-            override suspend fun awaitLoad(context: Context, font: AndroidFont): Typeface {
-                return typefaceDeferred.await()
+                override suspend fun awaitLoad(context: Context, font: AndroidFont): Typeface {
+                    return typefaceDeferred.await()
+                }
             }
-        }
-        val fontFamily = FontFamily(
-            object : AndroidFont(FontLoadingStrategy.Async, asyncLoader, FontVariation.Settings()) {
-                override val weight: FontWeight = FontWeight.Normal
-                override val style: FontStyle = FontStyle.Normal
-            },
-            TEST_FONT
-        )
+        val fontFamily =
+            FontFamily(
+                object :
+                    AndroidFont(FontLoadingStrategy.Async, asyncLoader, FontVariation.Settings()) {
+                    override val weight: FontWeight = FontWeight.Normal
+                    override val style: FontStyle = FontStyle.Normal
+                },
+                TEST_FONT
+            )
 
         val heights = mutableListOf<Int>()
 
@@ -258,16 +250,11 @@
                 LocalDensity provides Density(1.0f, 1f)
             ) {
                 HeightObservingText(
-                    onGlobalHeightPositioned = {
-                        heights.add(it)
-                    },
+                    onGlobalHeightPositioned = { heights.add(it) },
                     onTextLayoutResult = {},
                     text = longText,
                     lineLimits = MultiLine(maxHeightInLines = 10),
-                    textStyle = TextStyle.Default.copy(
-                        fontFamily = fontFamily,
-                        fontSize = 80.sp
-                    )
+                    textStyle = TextStyle.Default.copy(fontFamily = fontFamily, fontSize = 80.sp)
                 )
             }
         }
@@ -285,17 +272,16 @@
     fun testInspectableValue() {
         isDebugInspectorInfoEnabled = true
 
-        val modifier = Modifier.heightInLines(
-            textStyle = TextStyle.Default,
-            minLines = 5,
-            maxLines = 10
-        ) as InspectableValue
+        val modifier =
+            Modifier.heightInLines(textStyle = TextStyle.Default, minLines = 5, maxLines = 10)
+                as InspectableValue
         assertThat(modifier.nameFallback).isEqualTo("heightInLines")
-        assertThat(modifier.inspectableElements.asIterable()).containsExactly(
-            ValueElement("minLines", 5),
-            ValueElement("maxLines", 10),
-            ValueElement("textStyle", TextStyle.Default)
-        )
+        assertThat(modifier.inspectableElements.asIterable())
+            .containsExactly(
+                ValueElement("minLines", 5),
+                ValueElement("maxLines", 10),
+                ValueElement("textStyle", TextStyle.Default)
+            )
 
         isDebugInspectorInfoEnabled = false
     }
@@ -314,9 +300,7 @@
                     height = it
                     positionedLatch.countDown()
                 },
-                onTextLayoutResult = {
-                    textLayoutResult = it
-                },
+                onTextLayoutResult = { textLayoutResult = it },
                 text = text,
                 lineLimits = lines
             )
@@ -334,11 +318,7 @@
         lineLimits: MultiLine,
         textStyle: TextStyle = TextStyle.Default
     ) {
-        Box(
-            Modifier.onGloballyPositioned {
-                onGlobalHeightPositioned(it.size.height)
-            }
-        ) {
+        Box(Modifier.onGloballyPositioned { onGlobalHeightPositioned(it.size.height) }) {
             BasicTextField(
                 state = remember { TextFieldState(text) },
                 textStyle = textStyle,
diff --git a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/input/InputMethodInterceptor.kt b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/input/InputMethodInterceptor.kt
index 45bf7d6..89077c7 100644
--- a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/input/InputMethodInterceptor.kt
+++ b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/input/InputMethodInterceptor.kt
@@ -71,7 +71,8 @@
     fun assertSessionActive() {
         runOnIdle {
             assertWithMessage("Expected a text input session to be active")
-                .that(currentRequest).isNotNull()
+                .that(currentRequest)
+                .isNotNull()
         }
     }
 
@@ -83,7 +84,8 @@
     fun assertNoSessionActive() {
         runOnIdle {
             assertWithMessage("Expected no text input session to be active")
-                .that(currentRequest).isNull()
+                .that(currentRequest)
+                .isNull()
         }
     }
 
@@ -94,8 +96,8 @@
     fun assertThatSessionCount(): IntegerSubject = assertThat(runOnIdle { sessionCount })
 
     /**
-     * Runs [block] on the main thread and passes it the [PlatformTextInputMethodRequest]
-     * for the current input session.
+     * Runs [block] on the main thread and passes it the [PlatformTextInputMethodRequest] for the
+     * current input session.
      *
      * @throws AssertionError if no session is active.
      */
@@ -106,8 +108,8 @@
     }
 
     /**
-     * Runs [block] on the main thread and passes it the [PlatformTextInputMethodRequest]
-     * for the current input session.
+     * Runs [block] on the main thread and passes it the [PlatformTextInputMethodRequest] for the
+     * current input session.
      *
      * @throws AssertionError if no session is active.
      */
@@ -119,8 +121,7 @@
             val currentRequest =
                 assertNotNull(currentRequest, "Expected a text input session to be active")
             assertThat(currentRequest).isInstanceOf(asClass.java)
-            @Suppress("UNCHECKED_CAST")
-            block(currentRequest as T)
+            @Suppress("UNCHECKED_CAST") block(currentRequest as T)
         }
     }
 
@@ -133,7 +134,8 @@
     fun withEditorInfo(block: EditorInfo.() -> Unit) {
         runOnIdle {
             assertWithMessage("Expected a text input session to be active")
-                .that(currentRequest).isNotNull()
+                .that(currentRequest)
+                .isNotNull()
             block(editorInfo)
         }
     }
@@ -146,9 +148,10 @@
      */
     fun withInputConnection(block: InputConnection.() -> Unit) {
         runOnIdle {
-            val inputConnection = checkNotNull(inputConnection) {
-                "Tried to read inputConnection while no session was active"
-            }
+            val inputConnection =
+                checkNotNull(inputConnection) {
+                    "Tried to read inputConnection while no session was active"
+                }
             block(inputConnection)
         }
     }
@@ -160,9 +163,7 @@
      * [Content] method yourself.
      */
     fun setContent(content: @Composable () -> Unit) {
-        rule.setContent {
-            Content(content)
-        }
+        rule.setContent { Content(content) }
     }
 
     /**
diff --git a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/input/RememberTextFieldStateTest.kt b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/input/RememberTextFieldStateTest.kt
index 4d5e863..b5300f1 100644
--- a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/input/RememberTextFieldStateTest.kt
+++ b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/input/RememberTextFieldStateTest.kt
@@ -31,8 +31,7 @@
 @RunWith(AndroidJUnit4::class)
 class RememberTextFieldStateTest {
 
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
     private val restorationTester = StateRestorationTester(rule)
 
@@ -40,10 +39,7 @@
     fun rememberTextFieldState_withInitialTextAndSelection() {
         lateinit var state: TextFieldState
         rule.setContent {
-            state = rememberTextFieldState(
-                initialText = "hello",
-                initialSelection = TextRange(2)
-            )
+            state = rememberTextFieldState(initialText = "hello", initialSelection = TextRange(2))
         }
 
         rule.runOnIdle {
@@ -86,10 +82,11 @@
         lateinit var restoredState: TextFieldState
         var rememberCount = 0
         restorationTester.setContent {
-            val state = rememberTextFieldState(
-                initialText = "this should be ignored",
-                initialSelection = TextRange.Zero
-            )
+            val state =
+                rememberTextFieldState(
+                    initialText = "this should be ignored",
+                    initialSelection = TextRange.Zero
+                )
             if (remember { rememberCount++ } == 0) {
                 originalState = state
             } else {
diff --git a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/input/TestSoftwareKeyboardController.kt b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/input/TestSoftwareKeyboardController.kt
index b84b1ca..84de49f 100644
--- a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/input/TestSoftwareKeyboardController.kt
+++ b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/input/TestSoftwareKeyboardController.kt
@@ -20,9 +20,8 @@
 import androidx.compose.ui.test.junit4.ComposeTestRule
 import com.google.common.truth.Truth.assertWithMessage
 
-class TestSoftwareKeyboardController(
-    private val rule: ComposeTestRule
-) : SoftwareKeyboardController {
+class TestSoftwareKeyboardController(private val rule: ComposeTestRule) :
+    SoftwareKeyboardController {
     private var shown = false
 
     override fun show() {
@@ -36,14 +35,16 @@
     fun assertShown() {
         rule.runOnIdle {
             assertWithMessage("Expected last call on SoftwareKeyboardController to be show")
-                .that(shown).isTrue()
+                .that(shown)
+                .isTrue()
         }
     }
 
     fun assertHidden() {
         rule.runOnIdle {
             assertWithMessage("Expected last call on SoftwareKeyboardController to be hide")
-                .that(shown).isFalse()
+                .that(shown)
+                .isFalse()
         }
     }
 }
diff --git a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/input/TextFieldCodepointTransformationTest.kt b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/input/TextFieldCodepointTransformationTest.kt
index 5b556d0..86f6868 100644
--- a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/input/TextFieldCodepointTransformationTest.kt
+++ b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/input/TextFieldCodepointTransformationTest.kt
@@ -54,8 +54,7 @@
 @RunWith(AndroidJUnit4::class)
 class TextFieldCodepointTransformationTest {
 
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
     private val inputMethodInterceptor = InputMethodInterceptor(rule)
 
@@ -138,9 +137,8 @@
     fun textField_removingCodepointTransformation_rendersTextNormally() {
         val state = TextFieldState()
         state.setTextAndPlaceCursorAtEnd("Hello")
-        var codepointTransformation by mutableStateOf<CodepointTransformation?>(
-            CodepointTransformation.mask('*')
-        )
+        var codepointTransformation by
+            mutableStateOf<CodepointTransformation?>(CodepointTransformation.mask('*'))
         rule.setContent {
             BasicTextField(
                 state = state,
@@ -363,12 +361,14 @@
                 modifier = Modifier.testTag(Tag),
                 codepointTransformation = { i, codepoint ->
                     when (codepoint) {
-                        'a'.code, 'c'.code -> SurrogateCodepoint
+                        'a'.code,
+                        'c'.code -> SurrogateCodepoint
                         SurrogateCodepoint -> 'b'.code
-                        else -> fail(
-                            "unrecognized codepoint at index $i: " +
-                                String(intArrayOf(codepoint), 0, 1)
-                        )
+                        else ->
+                            fail(
+                                "unrecognized codepoint at index $i: " +
+                                    String(intArrayOf(codepoint), 0, 1)
+                            )
                     }
                 }
             )
@@ -421,10 +421,11 @@
                         'a'.code -> SurrogateCodepoint
                         SurrogateCodepoint -> 'b'.code
                         'c'.code -> SurrogateCodepoint
-                        else -> fail(
-                            "unrecognized codepoint at index $i: " +
-                                String(intArrayOf(codepoint), 0, 1)
-                        )
+                        else ->
+                            fail(
+                                "unrecognized codepoint at index $i: " +
+                                    String(intArrayOf(codepoint), 0, 1)
+                            )
                     }
                 }
             )
@@ -436,11 +437,10 @@
         listOf(0, 1, 3, 4).forEachIndexed { i, expectedCursor ->
             rule.runOnIdle {
                 assertWithMessage("After pressing right arrow $i times")
-                    .that(state.selection).isEqualTo(TextRange(expectedCursor))
+                    .that(state.selection)
+                    .isEqualTo(TextRange(expectedCursor))
             }
-            rule.onNodeWithTag(Tag).performKeyInput {
-                pressKey(Key.DirectionRight)
-            }
+            rule.onNodeWithTag(Tag).performKeyInput { pressKey(Key.DirectionRight) }
         }
     }
 
@@ -456,10 +456,11 @@
                         'a'.code -> SurrogateCodepoint
                         SurrogateCodepoint -> 'b'.code
                         'c'.code -> SurrogateCodepoint
-                        else -> fail(
-                            "unrecognized codepoint at index $i: " +
-                                String(intArrayOf(codepoint), 0, 1)
-                        )
+                        else ->
+                            fail(
+                                "unrecognized codepoint at index $i: " +
+                                    String(intArrayOf(codepoint), 0, 1)
+                            )
                     }
                 }
             )
@@ -468,20 +469,16 @@
         rule.onNodeWithTag(Tag).requestFocus()
         rule.onNodeWithTag(Tag).performTextInputSelection(TextRange(0))
 
-        listOf(
-            TextRange(0),
-            TextRange(0, 1),
-            TextRange(0, 3),
-            TextRange(0, 4)
-        ).forEachIndexed { i, expectedSelection ->
+        listOf(TextRange(0), TextRange(0, 1), TextRange(0, 3), TextRange(0, 4)).forEachIndexed {
+            i,
+            expectedSelection ->
             rule.runOnIdle {
                 assertWithMessage("After pressing shift+right arrow $i times")
-                    .that(state.selection).isEqualTo(expectedSelection)
+                    .that(state.selection)
+                    .isEqualTo(expectedSelection)
             }
             rule.onNodeWithTag(Tag).performKeyInput {
-                withKeyDown(Key.ShiftLeft) {
-                    pressKey(Key.DirectionRight)
-                }
+                withKeyDown(Key.ShiftLeft) { pressKey(Key.DirectionRight) }
             }
         }
     }
@@ -498,10 +495,11 @@
                         'a'.code -> SurrogateCodepoint
                         SurrogateCodepoint -> 'b'.code
                         'c'.code -> SurrogateCodepoint
-                        else -> fail(
-                            "unrecognized codepoint at index $i: " +
-                                String(intArrayOf(codepoint), 0, 1)
-                        )
+                        else ->
+                            fail(
+                                "unrecognized codepoint at index $i: " +
+                                    String(intArrayOf(codepoint), 0, 1)
+                            )
                     }
                 }
             )
@@ -510,20 +508,16 @@
         rule.onNodeWithTag(Tag).requestFocus()
         rule.onNodeWithTag(Tag).performTextInputSelection(TextRange(4))
 
-        listOf(
-            TextRange(4),
-            TextRange(4, 3),
-            TextRange(4, 1),
-            TextRange(4, 0)
-        ).forEachIndexed { i, expectedSelection ->
+        listOf(TextRange(4), TextRange(4, 3), TextRange(4, 1), TextRange(4, 0)).forEachIndexed {
+            i,
+            expectedSelection ->
             rule.runOnIdle {
                 assertWithMessage("After pressing shift+left arrow $i times")
-                    .that(state.selection).isEqualTo(expectedSelection)
+                    .that(state.selection)
+                    .isEqualTo(expectedSelection)
             }
             rule.onNodeWithTag(Tag).performKeyInput {
-                withKeyDown(Key.ShiftLeft) {
-                    pressKey(Key.DirectionLeft)
-                }
+                withKeyDown(Key.ShiftLeft) { pressKey(Key.DirectionLeft) }
             }
         }
     }
@@ -709,9 +703,7 @@
         rule.onNodeWithTag(Tag).requestFocus()
         rule.onNodeWithTag(Tag).performTextInputSelection(TextRange(6))
 
-        rule.onNodeWithTag(Tag).performKeyInput {
-            pressKey(Key.Backspace)
-        }
+        rule.onNodeWithTag(Tag).performKeyInput { pressKey(Key.Backspace) }
 
         rule.runOnIdle {
             assertThat(state.text.toString())
@@ -733,13 +725,10 @@
         rule.onNodeWithTag(Tag).requestFocus()
         rule.onNodeWithTag(Tag).performTextInputSelection(TextRange(6))
 
-        rule.onNodeWithTag(Tag).performKeyInput {
-            pressKey(Key.Backspace)
-        }
+        rule.onNodeWithTag(Tag).performKeyInput { pressKey(Key.Backspace) }
 
         rule.runOnIdle {
-            assertThat(state.text.toString())
-                .isEqualTo("aa$SingleSurrogateCodepointString")
+            assertThat(state.text.toString()).isEqualTo("aa$SingleSurrogateCodepointString")
         }
         assertVisualTextLength(3)
     }
@@ -757,9 +746,7 @@
         rule.onNodeWithTag(Tag).requestFocus()
         rule.onNodeWithTag(Tag).performTextInputSelection(TextRange(6))
 
-        rule.onNodeWithTag(Tag).performKeyInput {
-            pressKey(Key.Backspace)
-        }
+        rule.onNodeWithTag(Tag).performKeyInput { pressKey(Key.Backspace) }
 
         rule.runOnIdle {
             assertThat(state.text.toString())
@@ -781,13 +768,10 @@
         rule.onNodeWithTag(Tag).requestFocus()
         rule.onNodeWithTag(Tag).performTextInputSelection(TextRange(6))
 
-        rule.onNodeWithTag(Tag).performKeyInput {
-            pressKey(Key.Backspace)
-        }
+        rule.onNodeWithTag(Tag).performKeyInput { pressKey(Key.Backspace) }
 
         rule.runOnIdle {
-            assertThat(state.text.toString())
-                .isEqualTo("aa$SingleSurrogateCodepointString")
+            assertThat(state.text.toString()).isEqualTo("aa$SingleSurrogateCodepointString")
         }
         assertVisualTextLength(6)
     }
@@ -806,15 +790,20 @@
         vararg mappings: Pair<TextRange, TextRange>
     ) {
         mappings.forEach { (write, expected) ->
-            val existingSelection = rule.onNodeWithTag(Tag)
-                .fetchSemanticsNode().config[SemanticsProperties.TextSelectionRange]
+            val existingSelection =
+                rule
+                    .onNodeWithTag(Tag)
+                    .fetchSemanticsNode()
+                    .config[SemanticsProperties.TextSelectionRange]
             // Setting the selection to the current selection will return false.
             if (existingSelection != write) {
                 assertWithMessage("Expected to be able to select $write")
-                    .that(performSelectionOnVisualText(write)).isTrue()
+                    .that(performSelectionOnVisualText(write))
+                    .isTrue()
                 rule.runOnIdle {
                     assertWithMessage("Visual selection $write to mapped")
-                        .that(selection).isEqualTo(expected)
+                        .that(selection)
+                        .isEqualTo(expected)
                 }
             }
         }
diff --git a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/input/TextFieldCursorTest.kt b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/input/TextFieldCursorTest.kt
index 31b2464..41a50b8 100644
--- a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/input/TextFieldCursorTest.kt
+++ b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/input/TextFieldCursorTest.kt
@@ -94,15 +94,17 @@
 @LargeTest
 class TextFieldCursorTest : FocusedWindowTest {
 
-    private val motionDurationScale = object : MotionDurationScale {
-        override var scaleFactor: Float by mutableStateOf(1f)
-    }
+    private val motionDurationScale =
+        object : MotionDurationScale {
+            override var scaleFactor: Float by mutableStateOf(1f)
+        }
 
     @OptIn(ExperimentalTestApi::class)
     @get:Rule
-    val rule = createComposeRule(effectContext = motionDurationScale).also {
-        it.mainClock.autoAdvance = false
-    }
+    val rule =
+        createComposeRule(effectContext = motionDurationScale).also {
+            it.mainClock.autoAdvance = false
+        }
 
     private lateinit var state: TextFieldState
 
@@ -113,29 +115,25 @@
     private val contentColor = Color.White
     private val cursorColor = Color.Red
     private val fontSize = 10.sp
-    private val textStyle = TextStyle(
-        color = contentColor,
-        background = contentColor,
-        fontSize = fontSize,
-        fontFamily = TEST_FONT_FAMILY
-    )
+    private val textStyle =
+        TextStyle(
+            color = contentColor,
+            background = contentColor,
+            fontSize = fontSize,
+            fontFamily = TEST_FONT_FAMILY
+        )
 
     private var isFocused = false
     private var textLayoutResult: (() -> TextLayoutResult?)? = null
     private val cursorRect: Rect
         // assume selection is collapsed
-        get() = textLayoutResult?.invoke()?.getCursorRect(state.selection.start)
-            ?: Rect.Zero
+        get() = textLayoutResult?.invoke()?.getCursorRect(state.selection.start) ?: Rect.Zero
 
     private val cursorSize: DpSize by lazy {
-        with(rule.density) {
-            DpSize(DefaultCursorThickness, fontSize.toDp())
-        }
+        with(rule.density) { DpSize(DefaultCursorThickness, fontSize.toDp()) }
     }
 
-    private val cursorSizePx: Size by lazy {
-        with(rule.density) { cursorSize.toSize() }
-    }
+    private val cursorSizePx: Size by lazy { with(rule.density) { cursorSize.toSize() } }
 
     private val cursorTopCenterInLtr: Offset
         // assume selection is collapsed
@@ -149,23 +147,17 @@
     private val focusModifier = Modifier.onFocusChanged { if (it.isFocused) isFocused = true }
 
     // default TextFieldModifier
-    private val textFieldModifier = Modifier
-        .then(backgroundModifier)
-        .then(focusModifier)
+    private val textFieldModifier = Modifier.then(backgroundModifier).then(focusModifier)
 
     // default onTextLayout to capture cursor boundaries.
     private val onTextLayout: Density.(() -> TextLayoutResult?) -> Unit = { textLayoutResult = it }
 
-    private fun ComposeContentTestRule.setTestContent(
-        content: @Composable () -> Unit
-    ) {
+    private fun ComposeContentTestRule.setTestContent(content: @Composable () -> Unit) {
         this.setTextFieldTestContent {
             // The padding helps if the test is run accidentally in landscape. Landscape makes
             // the cursor to be next to the navigation bar which affects the red color to be a
             // bit different - possibly anti-aliasing.
-            Box(Modifier.padding(boxPadding)) {
-                content()
-            }
+            Box(Modifier.padding(boxPadding)) { content() }
         }
     }
 
@@ -187,9 +179,7 @@
 
         rule.mainClock.advanceTimeBy(100)
 
-        rule.onNode(hasSetTextAction())
-            .captureToImage()
-            .assertCursor(cursorTopCenterInLtr)
+        rule.onNode(hasSetTextAction()).captureToImage().assertCursor(cursorTopCenterInLtr)
     }
 
     @Test
@@ -214,9 +204,7 @@
 
         // an empty text layout will be placed on the right side of 30.dp-width area
         // cursor will be at the most right side
-        rule.onNode(hasSetTextAction())
-            .captureToImage()
-            .assertCursor(cursorTopCenterInRtl)
+        rule.onNode(hasSetTextAction()).captureToImage().assertCursor(cursorTopCenterInRtl)
     }
 
     @Test
@@ -237,9 +225,7 @@
 
         rule.mainClock.advanceTimeBy(100)
 
-        rule.onNode(hasSetTextAction())
-            .captureToImage()
-            .assertCursor(cursorTopCenterInLtr)
+        rule.onNode(hasSetTextAction()).captureToImage().assertCursor(cursorTopCenterInLtr)
     }
 
     @Test
@@ -262,7 +248,8 @@
 
         rule.mainClock.advanceTimeBy(100)
 
-        rule.onNode(hasSetTextAction())
+        rule
+            .onNode(hasSetTextAction())
             .captureToImage()
             // 20 - 2(cursor)
             .assertCursor(cursorTopCenterInRtl)
@@ -286,7 +273,8 @@
 
         rule.mainClock.advanceTimeBy(100)
 
-        rule.onNode(hasSetTextAction())
+        rule
+            .onNode(hasSetTextAction())
             .captureToImage()
             .assertCursor(cursorTopCenterInLtr - Offset(cursorSizePx.width, 0f))
     }
@@ -311,7 +299,8 @@
 
         rule.mainClock.advanceTimeBy(100)
 
-        rule.onNode(hasSetTextAction())
+        rule
+            .onNode(hasSetTextAction())
             .captureToImage()
             .assertCursor(cursorTopCenterInRtl + Offset(cursorSizePx.width, 0f))
     }
@@ -324,21 +313,14 @@
             BasicTextField(
                 state = state,
                 textStyle = textStyle.copy(fontSize = textStyle.fontSize * 2),
-                modifier = Modifier
-                    .then(backgroundModifier)
-                    .then(focusModifier),
-                cursorBrush = Brush.verticalGradient(
-                    // make a brush double/triple color at the beginning and end so we have
-                    // stable colors at the ends.
-                    // Without triple bottom, the bottom color never hits to the provided color.
-                    listOf(
-                        Color.Blue,
-                        Color.Blue,
-                        Color.Green,
-                        Color.Green,
-                        Color.Green
-                    )
-                ),
+                modifier = Modifier.then(backgroundModifier).then(focusModifier),
+                cursorBrush =
+                    Brush.verticalGradient(
+                        // make a brush double/triple color at the beginning and end so we have
+                        // stable colors at the ends.
+                        // Without triple bottom, the bottom color never hits to the provided color.
+                        listOf(Color.Blue, Color.Blue, Color.Green, Color.Green, Color.Green)
+                    ),
                 onTextLayout = onTextLayout
             )
         }
@@ -347,8 +329,7 @@
 
         rule.mainClock.advanceTimeBy(100)
 
-        val bitmap = rule.onNode(hasSetTextAction())
-            .captureToImage().toPixelMap()
+        val bitmap = rule.onNode(hasSetTextAction()).captureToImage().toPixelMap()
 
         val cursorLeft = ceil(cursorRect.left).toInt() + 1
         val cursorTop = ceil(cursorRect.top).toInt() + 1
@@ -375,13 +356,12 @@
 
         // cursor visible first 500 ms
         rule.mainClock.advanceTimeBy(100)
-        rule.onNode(hasSetTextAction())
-            .captureToImage()
-            .assertCursor(cursorTopCenterInLtr)
+        rule.onNode(hasSetTextAction()).captureToImage().assertCursor(cursorTopCenterInLtr)
 
         // cursor invisible during next 500 ms
         rule.mainClock.advanceTimeBy(700)
-        rule.onNode(hasSetTextAction())
+        rule
+            .onNode(hasSetTextAction())
             .captureToImage()
             .assertShape(
                 density = rule.density,
@@ -414,13 +394,12 @@
 
         // cursor visible first 500 ms
         rule.mainClock.advanceTimeBy(100)
-        rule.onNode(hasSetTextAction())
-            .captureToImage()
-            .assertCursor(cursorTopCenterInLtr)
+        rule.onNode(hasSetTextAction()).captureToImage().assertCursor(cursorTopCenterInLtr)
 
         // cursor invisible during next 500 ms
         rule.mainClock.advanceTimeBy(700)
-        rule.onNode(hasSetTextAction())
+        rule
+            .onNode(hasSetTextAction())
             .captureToImage()
             .assertShape(
                 density = rule.density,
@@ -447,7 +426,8 @@
         focusAndWait()
 
         // no cursor when usually shown
-        rule.onNode(hasSetTextAction())
+        rule
+            .onNode(hasSetTextAction())
             .captureToImage()
             .assertShape(
                 density = rule.density,
@@ -459,7 +439,8 @@
 
         // no cursor when should be no cursor
         rule.mainClock.advanceTimeBy(700)
-        rule.onNode(hasSetTextAction())
+        rule
+            .onNode(hasSetTextAction())
             .captureToImage()
             .assertShape(
                 density = rule.density,
@@ -490,15 +471,12 @@
         rule.mainClock.advanceTimeBy(500)
 
         // change text field value
-        rule.onNode(hasSetTextAction())
-            .performTextInput("s")
+        rule.onNode(hasSetTextAction()).performTextInput("s")
 
         // cursor would have been invisible during next 500 ms if cursor blinks while typing.
         // To prevent blinking while typing we restart animation when new symbol is typed.
         rule.mainClock.advanceTimeBy(300)
-        rule.onNode(hasSetTextAction())
-            .captureToImage()
-            .assertCursor(cursorTopCenterInLtr)
+        rule.onNode(hasSetTextAction()).captureToImage().assertCursor(cursorTopCenterInLtr)
     }
 
     @Test
@@ -521,15 +499,12 @@
         rule.mainClock.advanceTimeBy(500)
         rule.mainClock.advanceTimeByFrame()
 
-        rule.onNode(hasSetTextAction())
-            .performTextInputSelection(TextRange(0))
+        rule.onNode(hasSetTextAction()).performTextInputSelection(TextRange(0))
 
         // necessary for animation to start (shows cursor again)
         rule.mainClock.advanceTimeByFrame()
 
-        rule.onNode(hasSetTextAction())
-            .captureToImage()
-            .assertCursor(cursorTopCenterInLtr)
+        rule.onNode(hasSetTextAction()).captureToImage().assertCursor(cursorTopCenterInLtr)
     }
 
     @Ignore // b/327235206
@@ -547,13 +522,9 @@
                 onTextLayout = onTextLayout,
                 decorator = {
                     if (toggle) {
-                        Row {
-                            it()
-                        }
+                        Row { it() }
                     } else {
-                        Column {
-                            it()
-                        }
+                        Column { it() }
                     }
                 }
             )
@@ -566,7 +537,8 @@
         rule.mainClock.advanceTimeByFrame()
 
         // assert no cursor visible
-        rule.onNode(hasSetTextAction())
+        rule
+            .onNode(hasSetTextAction())
             .captureToImage()
             .assertShape(
                 density = rule.density,
@@ -580,9 +552,7 @@
         // necessary for animation to start (shows cursor again)
         rule.mainClock.advanceTimeByFrame()
 
-        rule.onNode(hasSetTextAction())
-            .captureToImage()
-            .assertCursor(cursorTopCenterInLtr)
+        rule.onNode(hasSetTextAction()).captureToImage().assertCursor(cursorTopCenterInLtr)
 
         toggle = !toggle
 
@@ -590,7 +560,8 @@
         rule.mainClock.advanceTimeByFrame()
 
         // assert no cursor visible
-        rule.onNode(hasSetTextAction())
+        rule
+            .onNode(hasSetTextAction())
             .captureToImage()
             .assertShape(
                 density = rule.density,
@@ -624,7 +595,8 @@
         cursorBrush = SolidColor(Color.Green)
         rule.mainClock.advanceTimeByFrame()
 
-        rule.onNode(hasSetTextAction())
+        rule
+            .onNode(hasSetTextAction())
             .captureToImage()
             .assertShape(
                 density = rule.density,
@@ -647,9 +619,7 @@
                 BasicTextField(
                     state = state,
                     // make sure that background is not obstructing selection
-                    textStyle = textStyle.copy(
-                        background = Color.Unspecified
-                    ),
+                    textStyle = textStyle.copy(background = Color.Unspecified),
                     modifier = textFieldModifier,
                     cursorBrush = SolidColor(cursorColor),
                     onTextLayout = onTextLayout
@@ -663,9 +633,7 @@
         rule.mainClock.advanceTimeBy(300)
         rule.mainClock.advanceTimeByFrame()
 
-        rule.onNode(hasSetTextAction())
-            .captureToImage()
-            .assertDoesNotContainColor(cursorColor)
+        rule.onNode(hasSetTextAction()).captureToImage().assertDoesNotContainColor(cursorColor)
     }
 
     @Test
@@ -682,11 +650,7 @@
                     cursorBrush = SolidColor(cursorColor),
                     onTextLayout = onTextLayout
                 )
-                Box(
-                    modifier = Modifier
-                        .focusable(true)
-                        .testTag("box")
-                )
+                Box(modifier = Modifier.focusable(true).testTag("box"))
             }
         }
 
@@ -695,15 +659,14 @@
         rule.mainClock.advanceTimeBy(100)
         rule.mainClock.advanceTimeByFrame()
 
-        rule.onNode(hasSetTextAction())
-            .captureToImage()
-            .assertCursor(cursorTopCenterInLtr)
+        rule.onNode(hasSetTextAction()).captureToImage().assertCursor(cursorTopCenterInLtr)
 
         rule.onNodeWithTag("box").requestFocus()
         rule.mainClock.advanceTimeByFrame()
 
         // cursor should hide immediately.
-        rule.onNode(hasSetTextAction())
+        rule
+            .onNode(hasSetTextAction())
             .captureToImage()
             .assertShape(
                 density = rule.density,
@@ -734,9 +697,7 @@
         rule.mainClock.advanceTimeBy(100)
         rule.mainClock.advanceTimeByFrame()
 
-        rule.onNode(hasSetTextAction())
-            .captureToImage()
-            .assertDoesNotContainColor(cursorColor)
+        rule.onNode(hasSetTextAction()).captureToImage().assertDoesNotContainColor(cursorColor)
     }
 
     @Test
@@ -760,16 +721,12 @@
         rule.mainClock.advanceTimeBy(100)
         rule.mainClock.advanceTimeByFrame()
 
-        rule.onNode(hasSetTextAction())
-            .captureToImage()
-            .assertDoesNotContainColor(cursorColor)
+        rule.onNode(hasSetTextAction()).captureToImage().assertDoesNotContainColor(cursorColor)
 
         readOnly = false
         rule.mainClock.advanceTimeByFrame()
 
-        rule.onNode(hasSetTextAction())
-            .captureToImage()
-            .assertCursor(cursorTopCenterInLtr)
+        rule.onNode(hasSetTextAction()).captureToImage().assertCursor(cursorTopCenterInLtr)
     }
 
     @Test
@@ -777,10 +734,11 @@
     fun cursorNotBlinking_whenWindowLostFocus() {
         state = TextFieldState()
         val focusWindow = mutableStateOf(true)
-        fun createWindowInfo(focused: Boolean) = object : WindowInfo {
-            override val isWindowFocused: Boolean
-                get() = focused
-        }
+        fun createWindowInfo(focused: Boolean) =
+            object : WindowInfo {
+                override val isWindowFocused: Boolean
+                    get() = focused
+            }
 
         rule.setTestContent {
             CompositionLocalProvider(LocalWindowInfo provides createWindowInfo(focusWindow.value)) {
@@ -800,9 +758,7 @@
 
         // cursor visible first 500ms
         rule.mainClock.advanceTimeBy(100)
-        rule.onNode(hasSetTextAction())
-            .captureToImage()
-            .assertContainsColor(cursorColor)
+        rule.onNode(hasSetTextAction()).captureToImage().assertContainsColor(cursorColor)
 
         // window loses focus
         focusWindow.value = false
@@ -810,9 +766,7 @@
 
         // check that text field cursor disappeared even within visible 500ms
         rule.mainClock.advanceTimeBy(300)
-        rule.onNode(hasSetTextAction())
-            .captureToImage()
-            .assertDoesNotContainColor(cursorColor)
+        rule.onNode(hasSetTextAction()).captureToImage().assertDoesNotContainColor(cursorColor)
     }
 
     @Test
@@ -820,10 +774,11 @@
     fun focusedTextField_resumeBlinking_whenWindowRegainsFocus() {
         state = TextFieldState()
         val focusWindow = mutableStateOf(true)
-        fun createWindowInfo(focused: Boolean) = object : WindowInfo {
-            override val isWindowFocused: Boolean
-                get() = focused
-        }
+        fun createWindowInfo(focused: Boolean) =
+            object : WindowInfo {
+                override val isWindowFocused: Boolean
+                    get() = focused
+            }
 
         rule.setTestContent {
             CompositionLocalProvider(LocalWindowInfo provides createWindowInfo(focusWindow.value)) {
@@ -847,16 +802,15 @@
 
         // check that text field cursor disappeared even within visible 500ms
         rule.mainClock.advanceTimeBy(100)
-        rule.onNode(hasSetTextAction())
-            .captureToImage()
-            .assertDoesNotContainColor(cursorColor)
+        rule.onNode(hasSetTextAction()).captureToImage().assertDoesNotContainColor(cursorColor)
 
         // window regains focus within 500ms
         focusWindow.value = true
         rule.waitForIdle()
 
         rule.mainClock.advanceTimeBy(100)
-        rule.onNode(hasSetTextAction())
+        rule
+            .onNode(hasSetTextAction())
             .captureToImage()
             .assertContainsColor(cursorColor)
             .assertCursor(cursorTopCenterInLtr)
@@ -868,18 +822,17 @@
         state = TextFieldState("hello", initialSelection = TextRange(0, 5))
         val selectionColor = Color.Blue
         val focusWindow = mutableStateOf(true)
-        val windowInfo = object : WindowInfo {
-            override val isWindowFocused: Boolean
-                get() = focusWindow.value
-        }
+        val windowInfo =
+            object : WindowInfo {
+                override val isWindowFocused: Boolean
+                    get() = focusWindow.value
+            }
 
         rule.setTestContent {
             CompositionLocalProvider(
                 LocalWindowInfo provides windowInfo,
-                LocalTextSelectionColors provides TextSelectionColors(
-                    selectionColor,
-                    selectionColor
-                )
+                LocalTextSelectionColors provides
+                    TextSelectionColors(selectionColor, selectionColor)
             ) {
                 BasicTextField(
                     state = state,
@@ -892,17 +845,13 @@
             }
         }
 
-        rule.onNode(hasSetTextAction())
-            .captureToImage()
-            .assertContainsColor(selectionColor)
+        rule.onNode(hasSetTextAction()).captureToImage().assertContainsColor(selectionColor)
 
         // window lost focus, make sure selection still drawn
         focusWindow.value = false
         rule.waitForIdle()
 
-        rule.onNode(hasSetTextAction())
-            .captureToImage()
-            .assertContainsColor(selectionColor)
+        rule.onNode(hasSetTextAction()).captureToImage().assertContainsColor(selectionColor)
     }
 
     @Test
@@ -926,10 +875,11 @@
         rule.runOnIdle {
             val startEvent = makeTextDragEvent(DragEvent.ACTION_DRAG_STARTED)
             val enterEvent = makeTextDragEvent(DragEvent.ACTION_DRAG_ENTERED)
-            val moveEvent = makeTextDragEvent(
-                action = DragEvent.ACTION_DRAG_LOCATION,
-                offset = Offset(with(rule.density) { fontSize.toPx() * 3 }, 5f)
-            )
+            val moveEvent =
+                makeTextDragEvent(
+                    action = DragEvent.ACTION_DRAG_LOCATION,
+                    offset = Offset(with(rule.density) { fontSize.toPx() * 3 }, 5f)
+                )
 
             view?.dispatchDragEvent(startEvent)
             view?.dispatchDragEvent(enterEvent)
@@ -938,9 +888,7 @@
 
         rule.mainClock.advanceTimeBy(100)
 
-        rule.onNode(hasSetTextAction())
-            .captureToImage()
-            .assertCursor(cursorTopCenterInLtr)
+        rule.onNode(hasSetTextAction()).captureToImage().assertCursor(cursorTopCenterInLtr)
     }
 
     @Test
@@ -964,10 +912,11 @@
         rule.runOnIdle {
             val startEvent = makeTextDragEvent(DragEvent.ACTION_DRAG_STARTED)
             val enterEvent = makeTextDragEvent(DragEvent.ACTION_DRAG_ENTERED)
-            val moveEvent = makeTextDragEvent(
-                action = DragEvent.ACTION_DRAG_LOCATION,
-                offset = Offset(with(rule.density) { fontSize.toPx() * 3 }, 5f)
-            )
+            val moveEvent =
+                makeTextDragEvent(
+                    action = DragEvent.ACTION_DRAG_LOCATION,
+                    offset = Offset(with(rule.density) { fontSize.toPx() * 3 }, 5f)
+                )
 
             view?.dispatchDragEvent(startEvent)
             view?.dispatchDragEvent(enterEvent)
@@ -976,7 +925,8 @@
 
         rule.mainClock.advanceTimeBy(500)
 
-        rule.onNode(hasSetTextAction())
+        rule
+            .onNode(hasSetTextAction())
             .captureToImage()
             .assertShape(
                 density = rule.density,
@@ -1008,10 +958,11 @@
         rule.runOnIdle {
             val startEvent = makeTextDragEvent(DragEvent.ACTION_DRAG_STARTED)
             val enterEvent = makeTextDragEvent(DragEvent.ACTION_DRAG_ENTERED)
-            val moveEvent = makeTextDragEvent(
-                action = DragEvent.ACTION_DRAG_LOCATION,
-                offset = Offset(with(rule.density) { fontSize.toPx() * 3 }, 5f)
-            )
+            val moveEvent =
+                makeTextDragEvent(
+                    action = DragEvent.ACTION_DRAG_LOCATION,
+                    offset = Offset(with(rule.density) { fontSize.toPx() * 3 }, 5f)
+                )
 
             view?.dispatchDragEvent(startEvent)
             view?.dispatchDragEvent(enterEvent)
@@ -1020,20 +971,17 @@
 
         rule.mainClock.advanceTimeBy(300)
 
-        rule.onNode(hasSetTextAction())
-            .captureToImage()
-            .assertCursor(cursorTopCenterInLtr)
+        rule.onNode(hasSetTextAction()).captureToImage().assertCursor(cursorTopCenterInLtr)
 
-        val moveEvent2 = makeTextDragEvent(
-            action = DragEvent.ACTION_DRAG_LOCATION,
-            offset = Offset(with(rule.density) { fontSize.toPx() * 4 }, 5f)
-        )
+        val moveEvent2 =
+            makeTextDragEvent(
+                action = DragEvent.ACTION_DRAG_LOCATION,
+                offset = Offset(with(rule.density) { fontSize.toPx() * 4 }, 5f)
+            )
         view?.dispatchDragEvent(moveEvent2)
         rule.mainClock.advanceTimeBy(400)
 
-        rule.onNode(hasSetTextAction())
-            .captureToImage()
-            .assertCursor(cursorTopCenterInLtr)
+        rule.onNode(hasSetTextAction()).captureToImage().assertCursor(cursorTopCenterInLtr)
     }
 
     @Test
@@ -1059,10 +1007,11 @@
         rule.runOnIdle {
             val startEvent = makeTextDragEvent(DragEvent.ACTION_DRAG_STARTED)
             val enterEvent = makeTextDragEvent(DragEvent.ACTION_DRAG_ENTERED)
-            val moveEvent = makeTextDragEvent(
-                action = DragEvent.ACTION_DRAG_LOCATION,
-                offset = Offset(with(rule.density) { fontSize.toPx() * 3 }, 5f)
-            )
+            val moveEvent =
+                makeTextDragEvent(
+                    action = DragEvent.ACTION_DRAG_LOCATION,
+                    offset = Offset(with(rule.density) { fontSize.toPx() * 3 }, 5f)
+                )
 
             view?.dispatchDragEvent(startEvent)
             view?.dispatchDragEvent(enterEvent)
@@ -1071,9 +1020,7 @@
 
         rule.mainClock.advanceTimeBy(100)
 
-        rule.onNode(hasSetTextAction())
-            .captureToImage()
-            .assertCursor(cursorTopCenterInLtr)
+        rule.onNode(hasSetTextAction()).captureToImage().assertCursor(cursorTopCenterInLtr)
     }
 
     private fun focusAndWait() {
@@ -1081,9 +1028,7 @@
         rule.mainClock.advanceTimeUntil { isFocused }
     }
 
-    /**
-     * @param cursorPosition Top center of cursor rectangle
-     */
+    /** @param cursorPosition Top center of cursor rectangle */
     private fun ImageBitmap.assertCursor(cursorPosition: Offset) {
         assertThat(cursorPosition.x).isAtLeast(0f)
         assertThat(cursorPosition.y).isAtLeast(0f)
@@ -1093,26 +1038,26 @@
         assertThat(cursorSizePx.width).isGreaterThan(2)
 
         // shrink the check are by 1px for left, top, right, bottom
-        val checkRect = Rect(
-            ceil(cursorPosition.x - cursorSizePx.width / 2) + 1,
-            ceil(cursorPosition.y) + 1,
-            floor(cursorPosition.x + cursorSizePx.width / 2) - 1,
-            floor(cursorPosition.y + cursorSizePx.height) - 1
-        )
+        val checkRect =
+            Rect(
+                ceil(cursorPosition.x - cursorSizePx.width / 2) + 1,
+                ceil(cursorPosition.y) + 1,
+                floor(cursorPosition.x + cursorSizePx.width / 2) - 1,
+                floor(cursorPosition.y + cursorSizePx.height) - 1
+            )
 
         // skip an expanded rectangle that is 1px larger than cursor rectangle due to antialiasing
-        val skipRect = Rect(
-            floor(cursorPosition.x - cursorSizePx.width / 2) - 1,
-            floor(cursorPosition.y) - 1,
-            ceil(cursorPosition.x + cursorSizePx.width / 2) + 1,
-            ceil(cursorPosition.y + cursorSizePx.height) + 1
-        )
+        val skipRect =
+            Rect(
+                floor(cursorPosition.x - cursorSizePx.width / 2) - 1,
+                floor(cursorPosition.y) - 1,
+                ceil(cursorPosition.x + cursorSizePx.width / 2) + 1,
+                ceil(cursorPosition.y + cursorSizePx.height) + 1
+            )
 
         val width = width
         val height = height
-        this.assertPixels(
-            IntSize(width, height)
-        ) { position ->
+        this.assertPixels(IntSize(width, height)) { position ->
             if (checkRect.contains(position.toOffset())) {
                 // cursor
                 cursorColor
@@ -1134,19 +1079,18 @@
                 BasicTextField(
                     state = state,
                     textStyle = textStyle,
-                    modifier = textFieldModifier.layout { measurable, constraints ->
-                        // change the state during layout so draw can read the new state
-                        val currValue = state.text
-                        if (currValue.isNotEmpty()) {
-                            val newText = currValue.dropLast(1)
-                            state.setTextAndPlaceCursorAtEnd(newText.toString())
-                        }
+                    modifier =
+                        textFieldModifier.layout { measurable, constraints ->
+                            // change the state during layout so draw can read the new state
+                            val currValue = state.text
+                            if (currValue.isNotEmpty()) {
+                                val newText = currValue.dropLast(1)
+                                state.setTextAndPlaceCursorAtEnd(newText.toString())
+                            }
 
-                        val p = measurable.measure(constraints)
-                        layout(p.width, p.height) {
-                            p.place(0, 0)
-                        }
-                    },
+                            val p = measurable.measure(constraints)
+                            layout(p.width, p.height) { p.place(0, 0) }
+                        },
                     cursorBrush = SolidColor(cursorColor),
                     onTextLayout = onTextLayout
                 )
diff --git a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/input/TextFieldDragAndDropTest.kt b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/input/TextFieldDragAndDropTest.kt
index 7c185a0..1f2300b 100644
--- a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/input/TextFieldDragAndDropTest.kt
+++ b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/input/TextFieldDragAndDropTest.kt
@@ -71,8 +71,7 @@
 @RunWith(AndroidJUnit4::class)
 class TextFieldDragAndDropTest {
 
-    @get:Rule
-    val rule = createAndroidComposeRule<TestActivity>()
+    @get:Rule val rule = createAndroidComposeRule<TestActivity>()
 
     @Test
     fun nonTextContent_isNotAccepted() {
@@ -105,11 +104,7 @@
 
     @Test
     fun draggingNonText_updatesSelection_withReceiveContent() {
-        rule.setContentAndTestDragAndDrop(
-            modifier = Modifier.contentReceiver {
-                null
-            }
-        ) {
+        rule.setContentAndTestDragAndDrop(modifier = Modifier.contentReceiver { null }) {
             drag(Offset(fontSize.toPx() * 1, 10f), defaultUri)
             assertThat(state.selection).isEqualTo(TextRange(1))
             drag(Offset(fontSize.toPx() * 2, 10f), defaultUri)
@@ -204,44 +199,46 @@
             view = LocalView.current
             CompositionLocalProvider(
                 LocalDensity provides density,
-                LocalWindowInfo provides object : WindowInfo {
-                    override val isWindowFocused = false
-                }
+                LocalWindowInfo provides
+                    object : WindowInfo {
+                        override val isWindowFocused = false
+                    }
             ) {
                 Box(
-                    modifier = Modifier
-                        .size(200.dp)
-                        .contentReceiver(object : ReceiveContentListener {
-                            override fun onDragStart() {
-                                calls += "start"
-                            }
+                    modifier =
+                        Modifier.size(200.dp)
+                            .contentReceiver(
+                                object : ReceiveContentListener {
+                                    override fun onDragStart() {
+                                        calls += "start"
+                                    }
 
-                            override fun onDragEnd() {
-                                calls += "end"
-                            }
+                                    override fun onDragEnd() {
+                                        calls += "end"
+                                    }
 
-                            override fun onDragEnter() {
-                                calls += "enter"
-                            }
+                                    override fun onDragEnter() {
+                                        calls += "enter"
+                                    }
 
-                            override fun onDragExit() {
-                                calls += "exit"
-                            }
+                                    override fun onDragExit() {
+                                        calls += "exit"
+                                    }
 
-                            override fun onReceive(c: TransferableContent): TransferableContent? {
-                                calls += "receive"
-                                return null
-                            }
-                        })
+                                    override fun onReceive(
+                                        c: TransferableContent
+                                    ): TransferableContent? {
+                                        calls += "receive"
+                                        return null
+                                    }
+                                }
+                            )
                 ) {
                     BasicTextField(
                         state = rememberTextFieldState(),
                         textStyle = TextStyle(fontFamily = TEST_FONT_FAMILY, fontSize = 20.sp),
                         lineLimits = TextFieldLineLimits.SingleLine,
-                        modifier = Modifier
-                            .width(100.dp)
-                            .height(40.dp)
-                            .align(Alignment.Center)
+                        modifier = Modifier.width(100.dp).height(40.dp).align(Alignment.Center)
                     )
                 }
             }
@@ -277,44 +274,46 @@
             view = LocalView.current
             CompositionLocalProvider(
                 LocalDensity provides density,
-                LocalWindowInfo provides object : WindowInfo {
-                    override val isWindowFocused = false
-                }
+                LocalWindowInfo provides
+                    object : WindowInfo {
+                        override val isWindowFocused = false
+                    }
             ) {
                 Box(
-                    modifier = Modifier
-                        .size(200.dp)
-                        .contentReceiver(object : ReceiveContentListener {
-                            override fun onDragStart() {
-                                calls += "start"
-                            }
+                    modifier =
+                        Modifier.size(200.dp)
+                            .contentReceiver(
+                                object : ReceiveContentListener {
+                                    override fun onDragStart() {
+                                        calls += "start"
+                                    }
 
-                            override fun onDragEnd() {
-                                calls += "end"
-                            }
+                                    override fun onDragEnd() {
+                                        calls += "end"
+                                    }
 
-                            override fun onDragEnter() {
-                                calls += "enter"
-                            }
+                                    override fun onDragEnter() {
+                                        calls += "enter"
+                                    }
 
-                            override fun onDragExit() {
-                                calls += "exit"
-                            }
+                                    override fun onDragExit() {
+                                        calls += "exit"
+                                    }
 
-                            override fun onReceive(c: TransferableContent): TransferableContent? {
-                                calls += "receive"
-                                return null
-                            }
-                        })
+                                    override fun onReceive(
+                                        c: TransferableContent
+                                    ): TransferableContent? {
+                                        calls += "receive"
+                                        return null
+                                    }
+                                }
+                            )
                 ) {
                     BasicTextField(
                         state = rememberTextFieldState(),
                         textStyle = TextStyle(fontFamily = TEST_FONT_FAMILY, fontSize = 20.sp),
                         lineLimits = TextFieldLineLimits.SingleLine,
-                        modifier = Modifier
-                            .width(100.dp)
-                            .height(40.dp)
-                            .align(Alignment.Center)
+                        modifier = Modifier.width(100.dp).height(40.dp).align(Alignment.Center)
                     )
                 }
             }
@@ -335,10 +334,7 @@
     @Test
     fun droppedText_insertsAtCursor() {
         rule.setContentAndTestDragAndDrop("Hello World!") {
-            drag(
-                Offset(fontSize.toPx() * 5, 10f),
-                " Awesome"
-            )
+            drag(Offset(fontSize.toPx() * 5, 10f), " Awesome")
             drop()
             assertThat(state.selection).isEqualTo(TextRange("Hello Awesome".length))
             assertThat(state.text.toString()).isEqualTo("Hello Awesome World!")
@@ -350,13 +346,14 @@
         lateinit var receivedContent: TransferableContent
         rule.setContentAndTestDragAndDrop(
             "Hello World!",
-            modifier = Modifier.contentReceiver { content ->
-                receivedContent = content
-                receivedContent.consume {
-                    // do not consume text
-                    it.uri != null
+            modifier =
+                Modifier.contentReceiver { content ->
+                    receivedContent = content
+                    receivedContent.consume {
+                        // do not consume text
+                        it.uri != null
+                    }
                 }
-            }
         ) {
             val clipData = createClipData {
                 addText(" Awesome")
@@ -376,11 +373,12 @@
         lateinit var receivedContent: TransferableContent
         rule.setContentAndTestDragAndDrop(
             "Hello World!",
-            modifier = Modifier.contentReceiver {
-                receivedContent = it
-                // consume everything
-                null
-            }
+            modifier =
+                Modifier.contentReceiver {
+                    receivedContent = it
+                    // consume everything
+                    null
+                }
         ) {
             val clipData = createClipData {
                 addText(" Awesome")
@@ -400,17 +398,16 @@
         lateinit var receivedContent: TransferableContent
         rule.setContentAndTestDragAndDrop(
             "Hello World!",
-            modifier = Modifier.contentReceiver {
-                receivedContent = it
-                val uri = receivedContent.clipEntry.firstUriOrNull()
-                // replace the content
-                val clipData = createClipData { addText(uri.toString()) }
-                TransferableContent(clipData)
-            }
+            modifier =
+                Modifier.contentReceiver {
+                    receivedContent = it
+                    val uri = receivedContent.clipEntry.firstUriOrNull()
+                    // replace the content
+                    val clipData = createClipData { addText(uri.toString()) }
+                    TransferableContent(clipData)
+                }
         ) {
-            val clipData = createClipData {
-                addUri(defaultUri)
-            }
+            val clipData = createClipData { addUri(defaultUri) }
             drag(Offset(fontSize.toPx() * 5, 10f), clipData)
             drop()
             assertThat(state.text.toString()).isEqualTo("Hello$defaultUri World!")
@@ -434,10 +431,13 @@
     @Test
     fun droppedItem_doesNotRequestPermission_ifNoReceiveContent() {
         rule.setContentAndTestDragAndDrop("Hello World!") {
-            drag(Offset(fontSize.toPx() * 5, 10f), createClipData {
-                addText()
-                addUri()
-            })
+            drag(
+                Offset(fontSize.toPx() * 5, 10f),
+                createClipData {
+                    addText()
+                    addUri()
+                }
+            )
             drop()
             assertThat(rule.activity.requestedDragAndDropPermissions).isEmpty()
         }
@@ -466,24 +466,19 @@
         modifier: Modifier = Modifier,
         block: DragAndDropTestScope.() -> Unit
     ) {
-        val state = TextFieldState(
-            textContent,
-            initialSelection = TextRange.Zero
-        )
+        val state = TextFieldState(textContent, initialSelection = TextRange.Zero)
         var view: View? = null
         val density = Density(1f, 1f)
-        val mergedStyle = TextStyle(
-            fontFamily = TEST_FONT_FAMILY,
-            fontSize = 20.sp
-        ).merge(style)
+        val mergedStyle = TextStyle(fontFamily = TEST_FONT_FAMILY, fontSize = 20.sp).merge(style)
         var isHovered: State<Boolean>? = null
         setContent { // Do not use setTextFieldTestContent for DnD tests.
             view = LocalView.current
             CompositionLocalProvider(
                 LocalDensity provides density,
-                LocalWindowInfo provides object : WindowInfo {
-                    override val isWindowFocused = isWindowFocused
-                }
+                LocalWindowInfo provides
+                    object : WindowInfo {
+                        override val isWindowFocused = isWindowFocused
+                    }
             ) {
                 isHovered = interactionSource?.collectIsHoveredAsState()
                 BasicTextField(
diff --git a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/input/TextFieldFocusTest.kt b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/input/TextFieldFocusTest.kt
index 1acdc25..6718e56 100644
--- a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/input/TextFieldFocusTest.kt
+++ b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/input/TextFieldFocusTest.kt
@@ -85,8 +85,7 @@
 @LargeTest
 @RunWith(AndroidJUnit4::class)
 internal class TextFieldFocusTest {
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
     private val inputMethodInterceptor = InputMethodInterceptor(rule)
 
     private val testKeyboardController = TestSoftwareKeyboardController(rule)
@@ -97,10 +96,10 @@
             val state = remember { TextFieldState() }
             BasicTextField(
                 state = state,
-                modifier = Modifier
-                    .focusRequester(data.focusRequester)
-                    .onFocusChanged { data.focused = it.isFocused }
-                    .requiredWidth(10.dp)
+                modifier =
+                    Modifier.focusRequester(data.focusRequester)
+                        .onFocusChanged { data.focused = it.isFocused }
+                        .requiredWidth(10.dp)
             )
         }
     }
@@ -112,11 +111,12 @@
         lateinit var testDataList: List<FocusTestData>
 
         rule.setContent {
-            testDataList = listOf(
-                FocusTestData(FocusRequester()),
-                FocusTestData(FocusRequester()),
-                FocusTestData(FocusRequester())
-            )
+            testDataList =
+                listOf(
+                    FocusTestData(FocusRequester()),
+                    FocusTestData(FocusRequester()),
+                    FocusTestData(FocusRequester())
+                )
 
             TextFieldApp(testDataList)
         }
@@ -164,9 +164,7 @@
 
         val interactions = mutableListOf<Interaction>()
 
-        scope.launch {
-            interactionSource.interactions.collect { interactions.add(it) }
-        }
+        scope.launch { interactionSource.interactions.collect { interactions.add(it) } }
 
         rule.onNodeWithTag(tag).requestFocus()
 
@@ -191,42 +189,30 @@
             BasicTextField(
                 state = state,
                 enabled = enabled.value,
-                modifier = Modifier
-                    .testTag(tag)
-                    .onFocusChanged {
-                        focused = it.isFocused
-                    }
-                    .requiredWidth(10.dp)
+                modifier =
+                    Modifier.testTag(tag)
+                        .onFocusChanged { focused = it.isFocused }
+                        .requiredWidth(10.dp)
             )
         }
         // bring enabled text field into focus
         rule.onNodeWithTag(tag).performClick()
-        rule.runOnIdle {
-            assertThat(focused).isTrue()
-        }
+        rule.runOnIdle { assertThat(focused).isTrue() }
 
         // make text field disabled
         enabled.value = false
-        rule.runOnIdle {
-            assertThat(focused).isFalse()
-        }
+        rule.runOnIdle { assertThat(focused).isFalse() }
 
         // make text field enabled again, it must not crash
         enabled.value = true
-        rule.runOnIdle {
-            assertThat(focused).isFalse()
-        }
+        rule.runOnIdle { assertThat(focused).isFalse() }
     }
 
     @SdkSuppress(minSdkVersion = 22) // b/266742195
     @Test
     fun textInputStarted_forFieldInActivity_whenFocusRequestedImmediately_fromLaunchedEffect() {
         textInputStarted_whenFocusRequestedImmediately_fromEffect(
-            runEffect = {
-                LaunchedEffect(Unit) {
-                    it()
-                }
-            }
+            runEffect = { LaunchedEffect(Unit) { it() } }
         )
     }
 
@@ -249,11 +235,7 @@
     @Test
     fun textInputStarted_forFieldInDialog_whenFocusRequestedImmediately_fromLaunchedEffect() {
         textInputStarted_whenFocusRequestedImmediately_fromEffect(
-            runEffect = {
-                LaunchedEffect(Unit) {
-                    it()
-                }
-            },
+            runEffect = { LaunchedEffect(Unit) { it() } },
             wrapContent = {
                 Dialog(onDismissRequest = {}) {
                     // Need to explicitly install the interceptor in the dialog as well.
@@ -293,14 +275,9 @@
 
         inputMethodInterceptor.setContent {
             wrapContent {
-                runEffect {
-                    focusRequester.requestFocus()
-                }
+                runEffect { focusRequester.requestFocus() }
 
-                BasicTextField(
-                    state = state,
-                    modifier = Modifier.focusRequester(focusRequester)
-                )
+                BasicTextField(state = state, modifier = Modifier.focusRequester(focusRequester))
             }
         }
 
@@ -503,12 +480,13 @@
 
         // Move focus to the next focusable element via shift+tab
         assertThat(
-            keyPressOnKeyboardInputDevice(
-                rule,
-                NativeKeyEvent.KEYCODE_TAB,
-                metaState = KeyEvent.META_SHIFT_ON
+                keyPressOnKeyboardInputDevice(
+                    rule,
+                    NativeKeyEvent.KEYCODE_TAB,
+                    metaState = KeyEvent.META_SHIFT_ON
+                )
             )
-        ).isTrue()
+            .isTrue()
 
         // Check if the element to the left of text field gains focus
         rule.onNodeWithTag("test-button-left").assertIsFocused()
@@ -523,17 +501,31 @@
         // event is actually null.
         val invalidDeviceId = -2
         val keyCode = NativeKeyEvent.KEYCODE_DPAD_CENTER
-        val keyEventDown = KeyEvent(
-            SystemClock.uptimeMillis(), SystemClock.uptimeMillis(),
-            KeyEvent.ACTION_DOWN, keyCode, 0, 0, invalidDeviceId, 0
-        )
+        val keyEventDown =
+            KeyEvent(
+                SystemClock.uptimeMillis(),
+                SystemClock.uptimeMillis(),
+                KeyEvent.ACTION_DOWN,
+                keyCode,
+                0,
+                0,
+                invalidDeviceId,
+                0
+            )
         assertThat(keyEventDown.device).isNull()
         rule.onRoot().performKeyPress(androidx.compose.ui.input.key.KeyEvent(keyEventDown))
         rule.waitForIdle()
-        val keyEventUp = KeyEvent(
-            SystemClock.uptimeMillis(), SystemClock.uptimeMillis(),
-            KeyEvent.ACTION_UP, keyCode, 0, 0, invalidDeviceId, 0
-        )
+        val keyEventUp =
+            KeyEvent(
+                SystemClock.uptimeMillis(),
+                SystemClock.uptimeMillis(),
+                KeyEvent.ACTION_UP,
+                keyCode,
+                0,
+                0,
+                invalidDeviceId,
+                0
+            )
         rule.onRoot().performKeyPress(androidx.compose.ui.input.key.KeyEvent(keyEventUp))
         rule.waitForIdle()
     }
@@ -589,52 +581,40 @@
 
     @Composable
     private fun TestFocusableElement(id: String) {
-        var isFocused by remember {
-            mutableStateOf(false)
-        }
+        var isFocused by remember { mutableStateOf(false) }
         BasicText(
             text = "test-button-$id",
-            modifier = Modifier
-                .testTag("test-button-$id")
-                .padding(10.dp)
-                .onFocusChanged {
-                    isFocused = it.hasFocus
-                }
-                .focusable()
-                .border(2.dp, if (isFocused) Color.Green else Color.Cyan)
+            modifier =
+                Modifier.testTag("test-button-$id")
+                    .padding(10.dp)
+                    .onFocusChanged { isFocused = it.hasFocus }
+                    .focusable()
+                    .border(2.dp, if (isFocused) Color.Green else Color.Cyan)
         )
     }
 
     @Composable
-    private fun TestBasicTextField(
-        id: String,
-        singleLine: Boolean,
-        requestFocus: Boolean = false
-    ) {
+    private fun TestBasicTextField(id: String, singleLine: Boolean, requestFocus: Boolean = false) {
         val state = rememberTextFieldState()
-        var isFocused by remember {
-            mutableStateOf(false)
-        }
-        val focusRequester = remember {
-            FocusRequester()
-        }
+        var isFocused by remember { mutableStateOf(false) }
+        val focusRequester = remember { FocusRequester() }
         val modifier = if (requestFocus) Modifier.focusRequester(focusRequester) else Modifier
 
         BasicTextField(
             state = state,
-            lineLimits = if (singleLine) {
-                TextFieldLineLimits.SingleLine
-            } else {
-                TextFieldLineLimits.Default
-            },
+            lineLimits =
+                if (singleLine) {
+                    TextFieldLineLimits.SingleLine
+                } else {
+                    TextFieldLineLimits.Default
+                },
             keyboardOptions = KeyboardOptions(imeAction = ImeAction.Next),
-            modifier = modifier
-                .testTag("test-text-field-$id")
-                .padding(10.dp)
-                .onFocusChanged {
-                    isFocused = it.isFocused || it.hasFocus
-                }
-                .border(2.dp, if (isFocused) Color.Red else Color.Transparent)
+            modifier =
+                modifier
+                    .testTag("test-text-field-$id")
+                    .padding(10.dp)
+                    .onFocusChanged { isFocused = it.isFocused || it.hasFocus }
+                    .border(2.dp, if (isFocused) Color.Red else Color.Transparent)
         )
 
         LaunchedEffect(requestFocus, focusRequester) {
@@ -664,20 +644,37 @@
         count: Int = 1,
         metaState: Int = 0,
     ): Boolean {
-        val deviceId = InputDevice.getDeviceIds().firstOrNull { id ->
-            InputDevice.getDevice(id)?.isVirtual?.not() ?: false &&
-                InputDevice.getDevice(id)?.supportsSource(source) ?: false
-        } ?: return false
-        val keyEventDown = KeyEvent(
-            SystemClock.uptimeMillis(), SystemClock.uptimeMillis(),
-            KeyEvent.ACTION_DOWN, keyCode, 0, metaState,
-            deviceId, 0, 0, source
-        )
-        val keyEventUp = KeyEvent(
-            SystemClock.uptimeMillis(), SystemClock.uptimeMillis(),
-            KeyEvent.ACTION_UP, keyCode, 0, metaState,
-            deviceId, 0, 0, source
-        )
+        val deviceId =
+            InputDevice.getDeviceIds().firstOrNull { id ->
+                InputDevice.getDevice(id)?.isVirtual?.not() ?: false &&
+                    InputDevice.getDevice(id)?.supportsSource(source) ?: false
+            } ?: return false
+        val keyEventDown =
+            KeyEvent(
+                SystemClock.uptimeMillis(),
+                SystemClock.uptimeMillis(),
+                KeyEvent.ACTION_DOWN,
+                keyCode,
+                0,
+                metaState,
+                deviceId,
+                0,
+                0,
+                source
+            )
+        val keyEventUp =
+            KeyEvent(
+                SystemClock.uptimeMillis(),
+                SystemClock.uptimeMillis(),
+                KeyEvent.ACTION_UP,
+                keyCode,
+                0,
+                metaState,
+                deviceId,
+                0,
+                0,
+                source
+            )
 
         repeat(count) {
             rule.onRoot().performKeyPress(androidx.compose.ui.input.key.KeyEvent(keyEventDown))
@@ -690,9 +687,7 @@
     /** Triggers a key press on the virtual keyboard. */
     private fun keyPressOnVirtualKeyboard(keyCode: Int, count: Int = 1) {
         rule.waitForIdle()
-        repeat(count) {
-            InstrumentationRegistry.getInstrumentation().sendKeyDownUpSync(keyCode)
-        }
+        repeat(count) { InstrumentationRegistry.getInstrumentation().sendKeyDownUpSync(keyCode) }
         rule.waitForIdle()
     }
 }
diff --git a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/input/TextFieldKeyEventTest.kt b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/input/TextFieldKeyEventTest.kt
index aed3655..5350717 100644
--- a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/input/TextFieldKeyEventTest.kt
+++ b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/input/TextFieldKeyEventTest.kt
@@ -59,8 +59,7 @@
 @RunWith(AndroidJUnit4::class)
 @OptIn(ExperimentalTestApi::class)
 class TextFieldKeyEventTest {
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
     private val tag = "TextFieldTestTag"
 
@@ -480,10 +479,7 @@
 
     @Test
     fun textField_pageNavigationDown() {
-        keysSequenceTest(
-            initText = "A\nB\nC\nD\nE",
-            modifier = Modifier.requiredSize(73.dp)
-        ) {
+        keysSequenceTest(initText = "A\nB\nC\nD\nE", modifier = Modifier.requiredSize(73.dp)) {
             pressKey(Key.PageDown)
             expectedSelection(TextRange(4))
         }
@@ -705,28 +701,22 @@
         }
 
         fun expectedText(text: String) {
-            rule.runOnIdle {
-                assertThat(state.text.toString()).isEqualTo(text)
-            }
+            rule.runOnIdle { assertThat(state.text.toString()).isEqualTo(text) }
         }
 
         fun expectedSelection(selection: TextRange) {
-            rule.runOnIdle {
-                assertThat(state.selection).isEqualTo(selection)
-            }
+            rule.runOnIdle { assertThat(state.selection).isEqualTo(selection) }
         }
 
         fun expectedClipboardText(text: String) {
-            rule.runOnIdle {
-                assertThat(clipboardManager.getText()?.text).isEqualTo(text)
-            }
+            rule.runOnIdle { assertThat(clipboardManager.getText()?.text).isEqualTo(text) }
         }
     }
 
     /**
-     * @param noTextLayout Whether the BasicTextField under test should calculate its text layout.
-     * A text layout calculation can be prevented by specifying a decorator but not calling the
-     * inner text field.
+     * @param noTextLayout Whether the BasicTextField under test should calculate its text layout. A
+     *   text layout calculation can be prevented by specifying a decorator but not calling the
+     *   inner text field.
      */
     private fun keysSequenceTest(
         initText: String = "",
@@ -748,30 +738,24 @@
                 if (!secure) {
                     BasicTextField(
                         state = state,
-                        textStyle = TextStyle(
-                            fontFamily = TEST_FONT_FAMILY,
-                            fontSize = 30.sp
-                        ),
-                        modifier = modifier
-                            .focusRequester(focusRequester)
-                            .testTag(tag),
+                        textStyle = TextStyle(fontFamily = TEST_FONT_FAMILY, fontSize = 30.sp),
+                        modifier = modifier.focusRequester(focusRequester).testTag(tag),
                         lineLimits = if (singleLine) SingleLine else MultiLine(),
                         decorator = {
-                            if (!noTextLayout) { it() }
+                            if (!noTextLayout) {
+                                it()
+                            }
                         }
                     )
                 } else {
                     BasicSecureTextField(
                         state = state,
-                        textStyle = TextStyle(
-                            fontFamily = TEST_FONT_FAMILY,
-                            fontSize = 30.sp
-                        ),
-                        modifier = modifier
-                            .focusRequester(focusRequester)
-                            .testTag(tag),
+                        textStyle = TextStyle(fontFamily = TEST_FONT_FAMILY, fontSize = 30.sp),
+                        modifier = modifier.focusRequester(focusRequester).testTag(tag),
                         decorator = {
-                            if (!noTextLayout) { it() }
+                            if (!noTextLayout) {
+                                it()
+                            }
                         }
                     )
                 }
diff --git a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/input/TextFieldKeyboardActionsTest.kt b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/input/TextFieldKeyboardActionsTest.kt
index 6a8dc55..75fff35 100644
--- a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/input/TextFieldKeyboardActionsTest.kt
+++ b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/input/TextFieldKeyboardActionsTest.kt
@@ -61,8 +61,7 @@
 @RunWith(AndroidJUnit4::class)
 class TextFieldKeyboardActionsTest : FocusedWindowTest {
 
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
     private val inputMethodInterceptor = InputMethodInterceptor(rule)
 
@@ -73,9 +72,7 @@
             BasicTextField(
                 state = TextFieldState(),
                 keyboardOptions = KeyboardOptions(imeAction = ImeAction.Send),
-                onKeyboardAction = {
-                    called = true
-                }
+                onKeyboardAction = { called = true }
             )
         }
 
@@ -91,9 +88,7 @@
             BasicTextField(
                 state = TextFieldState(),
                 keyboardOptions = KeyboardOptions(imeAction = ImeAction.Send),
-                onKeyboardAction = {
-                    called = true
-                }
+                onKeyboardAction = { called = true }
             )
         }
 
@@ -112,9 +107,7 @@
             BasicTextField(
                 state = TextFieldState(),
                 keyboardOptions = KeyboardOptions(imeAction = ImeAction.Send),
-                onKeyboardAction = {
-                    called = true
-                }
+                onKeyboardAction = { called = true }
             )
         }
 
@@ -130,20 +123,12 @@
     fun textField_performsDefaultBehavior_forFocusNext() {
         rule.setTextFieldTestContent {
             Column {
-                Box(
-                    Modifier
-                        .size(1.dp)
-                        .focusable()
-                        .testTag("box1"))
+                Box(Modifier.size(1.dp).focusable().testTag("box1"))
                 BasicTextField(
                     state = TextFieldState(),
                     keyboardOptions = KeyboardOptions(imeAction = ImeAction.Next)
                 )
-                Box(
-                    Modifier
-                        .size(1.dp)
-                        .focusable()
-                        .testTag("box2"))
+                Box(Modifier.size(1.dp).focusable().testTag("box2"))
             }
         }
 
@@ -156,20 +141,12 @@
     fun textField_performsDefaultBehavior_forFocusPrevious() {
         rule.setTextFieldTestContent {
             Column {
-                Box(
-                    Modifier
-                        .size(1.dp)
-                        .focusable()
-                        .testTag("box1"))
+                Box(Modifier.size(1.dp).focusable().testTag("box1"))
                 BasicTextField(
                     state = TextFieldState(),
                     keyboardOptions = KeyboardOptions(imeAction = ImeAction.Previous)
                 )
-                Box(
-                    Modifier
-                        .size(1.dp)
-                        .focusable()
-                        .testTag("box2"))
+                Box(Modifier.size(1.dp).focusable().testTag("box2"))
             }
         }
 
@@ -203,11 +180,7 @@
     fun textField_canOverrideDefaultBehavior() {
         rule.setTextFieldTestContent {
             Column {
-                Box(
-                    Modifier
-                        .size(1.dp)
-                        .focusable()
-                        .testTag("box1"))
+                Box(Modifier.size(1.dp).focusable().testTag("box1"))
                 BasicTextField(
                     state = TextFieldState(),
                     keyboardOptions = KeyboardOptions(imeAction = ImeAction.Next),
@@ -215,11 +188,7 @@
                         // don't call default action
                     }
                 )
-                Box(
-                    Modifier
-                        .size(1.dp)
-                        .focusable()
-                        .testTag("box2"))
+                Box(Modifier.size(1.dp).focusable().testTag("box2"))
             }
         }
 
@@ -233,23 +202,13 @@
     fun textField_canRequestDefaultBehavior() {
         rule.setTextFieldTestContent {
             Column {
-                Box(
-                    Modifier
-                        .size(1.dp)
-                        .focusable()
-                        .testTag("box1"))
+                Box(Modifier.size(1.dp).focusable().testTag("box1"))
                 BasicTextField(
                     state = TextFieldState(),
                     keyboardOptions = KeyboardOptions(imeAction = ImeAction.Next),
-                    onKeyboardAction = {
-                        it()
-                    }
+                    onKeyboardAction = { it() }
                 )
-                Box(
-                    Modifier
-                        .size(1.dp)
-                        .focusable()
-                        .testTag("box2"))
+                Box(Modifier.size(1.dp).focusable().testTag("box2"))
             }
         }
 
@@ -290,9 +249,7 @@
             BasicTextField(
                 state = TextFieldState(),
                 keyboardOptions = KeyboardOptions(imeAction = ImeAction.Go),
-                onKeyboardAction = {
-                    called = true
-                },
+                onKeyboardAction = { called = true },
                 lineLimits = SingleLine
             )
         }
@@ -312,9 +269,7 @@
             BasicTextField(
                 state = TextFieldState(),
                 keyboardOptions = KeyboardOptions(imeAction = ImeAction.Go),
-                onKeyboardAction = {
-                    called = true
-                },
+                onKeyboardAction = { called = true },
                 lineLimits = MultiLine(maxHeightInLines = 1)
             )
         }
@@ -331,21 +286,13 @@
     fun textField_singleLinePressEnter_triggersDefaultBehavior() {
         rule.setTextFieldTestContent {
             Column {
-                Box(
-                    Modifier
-                        .size(1.dp)
-                        .focusable()
-                        .testTag("box1"))
+                Box(Modifier.size(1.dp).focusable().testTag("box1"))
                 BasicTextField(
                     state = TextFieldState(),
                     keyboardOptions = KeyboardOptions(imeAction = ImeAction.Next),
                     lineLimits = SingleLine
                 )
-                Box(
-                    Modifier
-                        .size(1.dp)
-                        .focusable()
-                        .testTag("box2"))
+                Box(Modifier.size(1.dp).focusable().testTag("box2"))
             }
         }
 
@@ -364,9 +311,7 @@
             BasicTextField(
                 state = TextFieldState(),
                 keyboardOptions = KeyboardOptions(imeAction = ImeAction.None),
-                onKeyboardAction = {
-                    called = true
-                }
+                onKeyboardAction = { called = true }
             )
         }
 
@@ -382,9 +327,7 @@
             BasicTextField(
                 state = TextFieldState(),
                 keyboardOptions = KeyboardOptions(imeAction = ImeAction.Default),
-                onKeyboardAction = {
-                    called = true
-                }
+                onKeyboardAction = { called = true }
             )
         }
 
diff --git a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/input/TextFieldOutputTransformationGesturesIntegrationTest.kt b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/input/TextFieldOutputTransformationGesturesIntegrationTest.kt
index 5d07337..cf3b37c 100644
--- a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/input/TextFieldOutputTransformationGesturesIntegrationTest.kt
+++ b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/input/TextFieldOutputTransformationGesturesIntegrationTest.kt
@@ -43,8 +43,7 @@
 @RunWith(AndroidJUnit4::class)
 class TextFieldOutputTransformationGesturesIntegrationTest {
 
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
     private val inputMethodInterceptor = InputMethodInterceptor(rule)
 
@@ -57,11 +56,12 @@
             BasicTextField(
                 state = text,
                 modifier = Modifier.testTag(Tag),
-                textStyle = TextStyle(
-                    textAlign = TextAlign.Center,
-                    fontFamily = TEST_FONT_FAMILY,
-                    fontSize = 10.sp
-                ),
+                textStyle =
+                    TextStyle(
+                        textAlign = TextAlign.Center,
+                        fontFamily = TEST_FONT_FAMILY,
+                        fontSize = 10.sp
+                    ),
                 outputTransformation = {
                     replace(1, 2, "bbbb") // "zbbbbz"
                 }
@@ -73,9 +73,7 @@
             // Click 1 pixel to the right of center.
             click(center + Offset(1f, 0f))
         }
-        rule.runOnIdle {
-            assertThat(text.selection).isEqualTo(TextRange(2))
-        }
+        rule.runOnIdle { assertThat(text.selection).isEqualTo(TextRange(2)) }
 
         rule.onNodeWithTag(Tag).performTouchInput {
             // Add a delay to avoid triggering double-click.
@@ -83,9 +81,7 @@
             // Click 1 pixel to the left of center.
             click(center + Offset(-1f, 0f))
         }
-        rule.runOnIdle {
-            assertThat(text.selection).isEqualTo(TextRange(1))
-        }
+        rule.runOnIdle { assertThat(text.selection).isEqualTo(TextRange(1)) }
     }
 
     @Test
@@ -105,24 +101,19 @@
             BasicTextField(
                 state = text,
                 modifier = Modifier.testTag(Tag),
-                textStyle = TextStyle(
-                    textAlign = TextAlign.Left,
-                    fontFamily = TEST_FONT_FAMILY,
-                    fontSize = 10.sp
-                ),
-                outputTransformation = {
-                    replace(indexOfA, indexOfA + 1, replacement)
-                }
+                textStyle =
+                    TextStyle(
+                        textAlign = TextAlign.Left,
+                        fontFamily = TEST_FONT_FAMILY,
+                        fontSize = 10.sp
+                    ),
+                outputTransformation = { replace(indexOfA, indexOfA + 1, replacement) }
             )
         }
         rule.onNodeWithTag(Tag).assertTextEquals("zzzzzzzz${replacement}z")
 
-        rule.onNodeWithTag(Tag).performTouchInput {
-            click(topRight)
-        }
-        rule.runOnIdle {
-            assertThat(text.selection).isEqualTo(TextRange(indexOfA))
-        }
+        rule.onNodeWithTag(Tag).performTouchInput { click(topRight) }
+        rule.runOnIdle { assertThat(text.selection).isEqualTo(TextRange(indexOfA)) }
         assertCursor(indexOfA)
 
         rule.onNodeWithTag(Tag).performTouchInput {
@@ -130,10 +121,7 @@
             advanceEventTime(1000)
             click(bottomLeft)
         }
-        rule.runOnIdle {
-            assertThat(text.selection)
-                .isEqualTo(TextRange(indexOfA + 1))
-        }
+        rule.runOnIdle { assertThat(text.selection).isEqualTo(TextRange(indexOfA + 1)) }
         assertCursor(indexOfA + replacement.length)
     }
 
@@ -144,11 +132,12 @@
             BasicTextField(
                 state = text,
                 modifier = Modifier.testTag(Tag),
-                textStyle = TextStyle(
-                    textAlign = TextAlign.Center,
-                    fontFamily = TEST_FONT_FAMILY,
-                    fontSize = 10.sp
-                ),
+                textStyle =
+                    TextStyle(
+                        textAlign = TextAlign.Center,
+                        fontFamily = TEST_FONT_FAMILY,
+                        fontSize = 10.sp
+                    ),
                 outputTransformation = {
                     insert(1, "bbbb") // "zbbbbz"
                 }
@@ -160,9 +149,7 @@
             // Click 1 pixel to the right of center.
             click(center + Offset(1f, 0f))
         }
-        rule.runOnIdle {
-            assertThat(text.selection).isEqualTo(TextRange(1))
-        }
+        rule.runOnIdle { assertThat(text.selection).isEqualTo(TextRange(1)) }
         assertCursor(5)
 
         rule.onNodeWithTag(Tag).performTouchInput {
@@ -171,9 +158,7 @@
             // Click 1 pixel to the left of center.
             click(center + Offset(-1f, 0f))
         }
-        rule.runOnIdle {
-            assertThat(text.selection).isEqualTo(TextRange(1))
-        }
+        rule.runOnIdle { assertThat(text.selection).isEqualTo(TextRange(1)) }
         assertCursor(1)
     }
 
diff --git a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/input/TextFieldOutputTransformationHardwareKeysIntegrationTest.kt b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/input/TextFieldOutputTransformationHardwareKeysIntegrationTest.kt
index 4f86493..72989ba 100644
--- a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/input/TextFieldOutputTransformationHardwareKeysIntegrationTest.kt
+++ b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/input/TextFieldOutputTransformationHardwareKeysIntegrationTest.kt
@@ -42,8 +42,7 @@
 @RunWith(AndroidJUnit4::class)
 class TextFieldOutputTransformationHardwareKeysIntegrationTest {
 
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
     private val inputMethodInterceptor = InputMethodInterceptor(rule)
 
@@ -53,7 +52,8 @@
     fun replacement_visualText() {
         val text = TextFieldState("abcd", initialSelection = TextRange(0))
         inputMethodInterceptor.setContent {
-            BasicTextField(state = text,
+            BasicTextField(
+                state = text,
                 modifier = Modifier.testTag(Tag),
                 outputTransformation = {
                     replace(1, 3, "efg") // "aefgd"
@@ -68,7 +68,8 @@
     fun replacement_cursorMovement_leftToRight_byCharacter_stateOffsets() {
         val text = TextFieldState("abcd", initialSelection = TextRange(0))
         inputMethodInterceptor.setContent {
-            BasicTextField(state = text,
+            BasicTextField(
+                state = text,
                 modifier = Modifier.testTag(Tag),
                 outputTransformation = {
                     replace(1, 3, "efg") // "aefgd"
@@ -90,7 +91,8 @@
     fun replacement_cursorMovement_rightToLeft_byCharacter_stateOffsets() {
         val text = TextFieldState("abcd", initialSelection = TextRange(4))
         inputMethodInterceptor.setContent {
-            BasicTextField(state = text,
+            BasicTextField(
+                state = text,
                 modifier = Modifier.testTag(Tag),
                 outputTransformation = {
                     replace(1, 3, "efg") // "aefgd"
@@ -112,7 +114,8 @@
     fun replacement_cursorMovement_leftToRight_byCharacter_semanticsOffsets() {
         val text = TextFieldState("abcd", initialSelection = TextRange(0))
         inputMethodInterceptor.setContent {
-            BasicTextField(state = text,
+            BasicTextField(
+                state = text,
                 modifier = Modifier.testTag(Tag),
                 outputTransformation = {
                     replace(1, 3, "efg") // "aefgd"
@@ -134,7 +137,8 @@
     fun replacement_cursorMovement_rightToLeft_byCharacter_semanticsOffsets() {
         val text = TextFieldState("abcd", initialSelection = TextRange(4))
         inputMethodInterceptor.setContent {
-            BasicTextField(state = text,
+            BasicTextField(
+                state = text,
                 modifier = Modifier.testTag(Tag),
                 outputTransformation = {
                     replace(1, 3, "efg") // "aefgd"
@@ -156,7 +160,8 @@
     fun insert_visualText() {
         val text = TextFieldState("ab", initialSelection = TextRange(0))
         inputMethodInterceptor.setContent {
-            BasicTextField(state = text,
+            BasicTextField(
+                state = text,
                 modifier = Modifier.testTag(Tag),
                 outputTransformation = {
                     insert(1, "efg") // "aefgb"
@@ -171,7 +176,8 @@
     fun insert_cursorMovement_leftToRight_byCharacter_stateOffsets() {
         val text = TextFieldState("ab", initialSelection = TextRange(0))
         inputMethodInterceptor.setContent {
-            BasicTextField(state = text,
+            BasicTextField(
+                state = text,
                 modifier = Modifier.testTag(Tag),
                 outputTransformation = {
                     insert(1, "efg") // "aefgb"
@@ -193,7 +199,8 @@
     fun insert_cursorMovement_rightToLeft_byCharacter_stateOffsets() {
         val text = TextFieldState("ab", initialSelection = TextRange(2))
         inputMethodInterceptor.setContent {
-            BasicTextField(state = text,
+            BasicTextField(
+                state = text,
                 modifier = Modifier.testTag(Tag),
                 outputTransformation = {
                     insert(1, "efg") // "aefgb"
@@ -215,7 +222,8 @@
     fun insert_cursorMovement_leftToRight_byCharacter_semanticsOffsets() {
         val text = TextFieldState("ab", initialSelection = TextRange(0))
         inputMethodInterceptor.setContent {
-            BasicTextField(state = text,
+            BasicTextField(
+                state = text,
                 modifier = Modifier.testTag(Tag),
                 outputTransformation = {
                     insert(1, "efg") // "aefgb"
@@ -237,7 +245,8 @@
     fun insert_cursorMovement_rightToLeft_byCharacter_semanticsOffsets() {
         val text = TextFieldState("ab", initialSelection = TextRange(2))
         inputMethodInterceptor.setContent {
-            BasicTextField(state = text,
+            BasicTextField(
+                state = text,
                 modifier = Modifier.testTag(Tag),
                 outputTransformation = {
                     insert(1, "efg") // "aefgb"
diff --git a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/input/TextFieldReceiveContentTest.kt b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/input/TextFieldReceiveContentTest.kt
index 777350e..41a0cf14 100644
--- a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/input/TextFieldReceiveContentTest.kt
+++ b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/input/TextFieldReceiveContentTest.kt
@@ -56,16 +56,13 @@
 import org.junit.Test
 import org.junit.runner.RunWith
 
-/**
- * Tests InputConnection#commitContent calls from BasicTextField to receiveContent modifier.
- */
+/** Tests InputConnection#commitContent calls from BasicTextField to receiveContent modifier. */
 @MediumTest
 @RunWith(AndroidJUnit4::class)
 @OptIn(ExperimentalFoundationApi::class)
 class TextFieldReceiveContentTest {
 
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
     private val inputMethodInterceptor = InputMethodInterceptor(rule)
 
@@ -80,11 +77,7 @@
         rule.onNodeWithTag(tag).requestFocus()
         inputMethodInterceptor.withInputConnection {
             assertFalse(
-                commitContent(
-                    createInputContentInfo().unwrap() as InputContentInfo,
-                    0,
-                    null
-                )
+                commitContent(createInputContentInfo().unwrap() as InputContentInfo, 0, null)
             )
         }
     }
@@ -117,9 +110,7 @@
         inputMethodInterceptor.setContent {
             BasicTextField(
                 state = rememberTextFieldState(),
-                modifier = Modifier
-                    .testTag(tag)
-                    .contentReceiver { null }
+                modifier = Modifier.testTag(tag).contentReceiver { null }
             )
         }
         rule.onNodeWithTag(tag).requestFocus()
@@ -135,9 +126,8 @@
         inputMethodInterceptor.setContent {
             BasicTextField(
                 state = rememberTextFieldState(),
-                modifier = Modifier
-                    .testTag(tag)
-                    .contentReceiver {
+                modifier =
+                    Modifier.testTag(tag).contentReceiver {
                         transferableContent = it
                         null
                     }
@@ -167,10 +157,8 @@
             assertThat(transferableContent?.clipEntry?.clipData?.getItemAt(0)?.uri)
                 .isEqualTo(DEFAULT_CONTENT_URI)
 
-            assertThat(transferableContent?.platformTransferableContent?.linkUri)
-                .isEqualTo(linkUri)
-            assertThat(transferableContent?.platformTransferableContent?.extras)
-                .isEqualTo(bundle)
+            assertThat(transferableContent?.platformTransferableContent?.linkUri).isEqualTo(linkUri)
+            assertThat(transferableContent?.platformTransferableContent?.extras).isEqualTo(bundle)
         }
     }
 
@@ -181,9 +169,8 @@
         inputMethodInterceptor.setContent {
             BasicTextField(
                 state = rememberTextFieldState(),
-                modifier = Modifier
-                    .testTag(tag)
-                    .contentReceiver {
+                modifier =
+                    Modifier.testTag(tag).contentReceiver {
                         transferableContent = it
                         null
                     }
@@ -206,7 +193,8 @@
         rule.runOnIdle {
             assertThat(transferableContent).isNotNull()
             assertTrue(
-                transferableContent?.platformTransferableContent
+                transferableContent
+                    ?.platformTransferableContent
                     ?.extras
                     ?.containsKey("EXTRA_INPUT_CONTENT_INFO") ?: false
             )
@@ -220,16 +208,16 @@
         inputMethodInterceptor.setContent {
             BasicTextField(
                 state = rememberTextFieldState(),
-                modifier = Modifier
-                    .testTag(tag)
-                    .contentReceiver {
-                        parentTransferableContent = it
-                        null
-                    }
-                    .contentReceiver {
-                        childTransferableContent = it
-                        it
-                    }
+                modifier =
+                    Modifier.testTag(tag)
+                        .contentReceiver {
+                            parentTransferableContent = it
+                            null
+                        }
+                        .contentReceiver {
+                            childTransferableContent = it
+                            it
+                        }
             )
         }
         rule.onNodeWithTag(tag).requestFocus()
@@ -265,16 +253,16 @@
         inputMethodInterceptor.setContent {
             BasicTextField(
                 state = rememberTextFieldState(),
-                modifier = Modifier
-                    .testTag(tag)
-                    .contentReceiver {
-                        parentTransferableContent = it
-                        null
-                    }
-                    .contentReceiver {
-                        childTransferableContent = it
-                        null
-                    }
+                modifier =
+                    Modifier.testTag(tag)
+                        .contentReceiver {
+                            parentTransferableContent = it
+                            null
+                        }
+                        .contentReceiver {
+                            childTransferableContent = it
+                            null
+                        }
             )
         }
         rule.onNodeWithTag(tag).requestFocus()
@@ -304,9 +292,8 @@
             CompositionLocalProvider(LocalClipboardManager provides clipboardManager) {
                 BasicTextField(
                     state = rememberTextFieldState(),
-                    modifier = Modifier
-                        .testTag(tag)
-                        .contentReceiver {
+                    modifier =
+                        Modifier.testTag(tag).contentReceiver {
                             transferableContent = it
                             null
                         }
@@ -325,21 +312,22 @@
     @Test
     fun semanticsPasteContent_pastesLeftOverText() {
         val clipboardManager = FakeClipboardManager(supportsClipEntry = true)
-        val clipEntry = createClipData {
-            addText("some text")
-            addUri()
-            addIntent()
-            addText("more text")
-        }.toClipEntry()
+        val clipEntry =
+            createClipData {
+                    addText("some text")
+                    addUri()
+                    addIntent()
+                    addText("more text")
+                }
+                .toClipEntry()
         clipboardManager.setClip(clipEntry)
         val state = TextFieldState()
         rule.setContent {
             CompositionLocalProvider(LocalClipboardManager provides clipboardManager) {
                 BasicTextField(
                     state = state,
-                    modifier = Modifier
-                        .testTag(tag)
-                        .contentReceiver {
+                    modifier =
+                        Modifier.testTag(tag).contentReceiver {
                             it.consume { item ->
                                 // only consume if there's no text
                                 item.text == null
@@ -351,20 +339,20 @@
 
         rule.onNode(hasSetTextAction()).performSemanticsAction(SemanticsActions.PasteText)
 
-        rule.runOnIdle {
-            assertThat(state.text.toString()).isEqualTo("some text\nmore text")
-        }
+        rule.runOnIdle { assertThat(state.text.toString()).isEqualTo("some text\nmore text") }
     }
 
     @Test
     fun semanticsPasteContent_goesFromChildToParent() {
         val clipboardManager = FakeClipboardManager(supportsClipEntry = true)
-        val clipEntry = createClipData {
-            addText("a")
-            addText("b")
-            addText("c")
-            addText("d")
-        }.toClipEntry()
+        val clipEntry =
+            createClipData {
+                    addText("a")
+                    addText("b")
+                    addText("c")
+                    addText("d")
+                }
+                .toClipEntry()
         clipboardManager.setClip(clipEntry)
 
         lateinit var transferableContent1: TransferableContent
@@ -376,26 +364,20 @@
             CompositionLocalProvider(LocalClipboardManager provides clipboardManager) {
                 BasicTextField(
                     state = state,
-                    modifier = Modifier
-                        .testTag(tag)
-                        .contentReceiver { content ->
-                            transferableContent1 = content
-                            content.consume {
-                                it.text.contains("a")
+                    modifier =
+                        Modifier.testTag(tag)
+                            .contentReceiver { content ->
+                                transferableContent1 = content
+                                content.consume { it.text.contains("a") }
                             }
-                        }
-                        .contentReceiver { content ->
-                            transferableContent2 = content
-                            content.consume {
-                                it.text.contains("b")
+                            .contentReceiver { content ->
+                                transferableContent2 = content
+                                content.consume { it.text.contains("b") }
                             }
-                        }
-                        .contentReceiver { content ->
-                            transferableContent3 = content
-                            content.consume {
-                                it.text.contains("c")
+                            .contentReceiver { content ->
+                                transferableContent3 = content
+                                content.consume { it.text.contains("c") }
                             }
-                        }
                 )
             }
         }
@@ -416,12 +398,11 @@
         val clipEntry = createClipData().toClipEntry()
         clipboardManager.setClip(clipEntry)
         var pasteOption: (() -> Unit)? = null
-        val textToolbar = FakeTextToolbar(
-            onShowMenu = { _, _, onPasteRequested, _, _ ->
-                pasteOption = onPasteRequested
-            },
-            onHideMenu = {}
-        )
+        val textToolbar =
+            FakeTextToolbar(
+                onShowMenu = { _, _, onPasteRequested, _, _ -> pasteOption = onPasteRequested },
+                onHideMenu = {}
+            )
         lateinit var transferableContent: TransferableContent
         rule.setContent {
             CompositionLocalProvider(
@@ -430,9 +411,8 @@
             ) {
                 BasicTextField(
                     state = rememberTextFieldState(),
-                    modifier = Modifier
-                        .testTag(tag)
-                        .contentReceiver {
+                    modifier =
+                        Modifier.testTag(tag).contentReceiver {
                             transferableContent = it
                             null
                         }
@@ -440,9 +420,7 @@
             }
         }
 
-        rule.runOnIdle {
-            pasteOption?.invoke()
-        }
+        rule.runOnIdle { pasteOption?.invoke() }
 
         rule.onNode(hasSetTextAction()).performSemanticsAction(SemanticsActions.PasteText)
 
@@ -464,9 +442,7 @@
 
         private fun InputMethodInterceptor.onIdle(block: (EditorInfo, InputConnection) -> Unit) {
             withInputConnection {
-                withEditorInfo {
-                    block(this@withEditorInfo, this@withInputConnection)
-                }
+                withEditorInfo { block(this@withEditorInfo, this@withInputConnection) }
             }
         }
     }
diff --git a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/input/TextFieldScrollTest.kt b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/input/TextFieldScrollTest.kt
index 552f7ff..04ae851 100644
--- a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/input/TextFieldScrollTest.kt
+++ b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/input/TextFieldScrollTest.kt
@@ -96,14 +96,14 @@
 
     private val TextfieldTag = "textField"
 
-    private val longText = "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do " +
-        "eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam," +
-        " quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. " +
-        "Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu " +
-        "fugiat nulla pariatur."
+    private val longText =
+        "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do " +
+            "eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam," +
+            " quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. " +
+            "Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu " +
+            "fugiat nulla pariatur."
 
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
     private lateinit var testScope: CoroutineScope
 
@@ -122,7 +122,9 @@
         val scrollState = ScrollState(0)
 
         rule.setupHorizontallyScrollableContent(
-            TextFieldState(longText), scrollState, Modifier.size(width = 300.dp, height = 50.dp)
+            TextFieldState(longText),
+            scrollState,
+            Modifier.size(width = 300.dp, height = 50.dp)
         )
 
         rule.runOnIdle {
@@ -174,9 +176,7 @@
             modifier = Modifier.size(width = 300.dp, height = 50.dp)
         )
 
-        rule.runOnIdle {
-            assertThat(scrollState.maxValue).isEqualTo(0)
-        }
+        rule.runOnIdle { assertThat(scrollState.maxValue).isEqualTo(0) }
     }
 
     @Test
@@ -189,9 +189,7 @@
             modifier = Modifier.size(width = 300.dp, height = 100.dp)
         )
 
-        rule.runOnIdle {
-            assertThat(scrollState.maxValue).isEqualTo(0)
-        }
+        rule.runOnIdle { assertThat(scrollState.maxValue).isEqualTo(0) }
     }
 
     @Test
@@ -203,12 +201,7 @@
 
         with(rule.density) {
             rule.setContent {
-                Box(
-                    Modifier
-                        .size(parentSize.toDp())
-                        .background(color = Color.White)
-                        .testTag(tag)
-                ) {
+                Box(Modifier.size(parentSize.toDp()).background(color = Color.White).testTag(tag)) {
                     ScrollableContent(
                         state = TextFieldState(longText),
                         modifier = Modifier.size(textFieldSize.toDp()),
@@ -221,11 +214,11 @@
 
         rule.waitForIdle()
 
-        rule.onNodeWithTag(tag)
-            .captureToImage()
-            .assertPixels(expectedSize = IntSize(parentSize, parentSize)) { position ->
-                if (position.x > textFieldSize || position.y > textFieldSize) Color.White else null
-            }
+        rule.onNodeWithTag(tag).captureToImage().assertPixels(
+            expectedSize = IntSize(parentSize, parentSize)
+        ) { position ->
+            if (position.x > textFieldSize || position.y > textFieldSize) Color.White else null
+        }
     }
 
     @Test
@@ -237,12 +230,7 @@
 
         with(rule.density) {
             rule.setContent {
-                Box(
-                    Modifier
-                        .size(parentSize.toDp())
-                        .background(color = Color.White)
-                        .testTag(tag)
-                ) {
+                Box(Modifier.size(parentSize.toDp()).background(color = Color.White).testTag(tag)) {
                     ScrollableContent(
                         state = TextFieldState(longText),
                         modifier = Modifier.size(textFieldSize.toDp()),
@@ -255,11 +243,11 @@
 
         rule.waitForIdle()
 
-        rule.onNodeWithTag(tag)
-            .captureToImage()
-            .assertPixels(expectedSize = IntSize(parentSize, parentSize)) { position ->
-                if (position.x > textFieldSize || position.y > textFieldSize) Color.White else null
-            }
+        rule.onNodeWithTag(tag).captureToImage().assertPixels(
+            expectedSize = IntSize(parentSize, parentSize)
+        ) { position ->
+            if (position.x > textFieldSize || position.y > textFieldSize) Color.White else null
+        }
     }
 
     @Test
@@ -272,23 +260,15 @@
             modifier = Modifier.size(width = 300.dp, height = 50.dp)
         )
 
-        rule.runOnIdle {
-            assertThat(scrollState.value).isEqualTo(0)
-        }
+        rule.runOnIdle { assertThat(scrollState.value).isEqualTo(0) }
 
-        rule.onNodeWithTag(TextfieldTag)
-            .performTouchInput { swipeLeft() }
+        rule.onNodeWithTag(TextfieldTag).performTouchInput { swipeLeft() }
 
-        val firstSwipePosition = rule.runOnIdle {
-            scrollState.value
-        }
+        val firstSwipePosition = rule.runOnIdle { scrollState.value }
         assertThat(firstSwipePosition).isGreaterThan(0)
 
-        rule.onNodeWithTag(TextfieldTag)
-            .performTouchInput { swipeRight() }
-        rule.runOnIdle {
-            assertThat(scrollState.value).isLessThan(firstSwipePosition)
-        }
+        rule.onNodeWithTag(TextfieldTag).performTouchInput { swipeRight() }
+        rule.runOnIdle { assertThat(scrollState.value).isLessThan(firstSwipePosition) }
     }
 
     @Test
@@ -301,23 +281,15 @@
             modifier = Modifier.size(width = 300.dp, height = 50.dp)
         )
 
-        rule.runOnIdle {
-            assertThat(scrollState.value).isEqualTo(0)
-        }
+        rule.runOnIdle { assertThat(scrollState.value).isEqualTo(0) }
 
-        rule.onNodeWithTag(TextfieldTag)
-            .performTouchInput { swipeUp() }
+        rule.onNodeWithTag(TextfieldTag).performTouchInput { swipeUp() }
 
-        val firstSwipePosition = rule.runOnIdle {
-            scrollState.value
-        }
+        val firstSwipePosition = rule.runOnIdle { scrollState.value }
         assertThat(firstSwipePosition).isGreaterThan(0)
 
-        rule.onNodeWithTag(TextfieldTag)
-            .performTouchInput { swipeDown() }
-        rule.runOnIdle {
-            assertThat(scrollState.value).isLessThan(firstSwipePosition)
-        }
+        rule.onNodeWithTag(TextfieldTag).performTouchInput { swipeDown() }
+        rule.runOnIdle { assertThat(scrollState.value).isLessThan(firstSwipePosition) }
     }
 
     @Test
@@ -335,8 +307,7 @@
             )
         }
 
-        rule.onNodeWithTag(TextfieldTag)
-            .performTouchInput { swipeLeft() }
+        rule.onNodeWithTag(TextfieldTag).performTouchInput { swipeLeft() }
 
         val swipePosition = rule.runOnIdle { scrollState!!.value }
         assertThat(swipePosition).isGreaterThan(0)
@@ -348,9 +319,7 @@
 
         restorationTester.emulateSavedInstanceStateRestore()
 
-        rule.runOnIdle {
-            assertThat(scrollState!!.value).isEqualTo(swipePosition)
-        }
+        rule.runOnIdle { assertThat(scrollState!!.value).isEqualTo(swipePosition) }
     }
 
     @Test
@@ -379,9 +348,7 @@
 
         rule.onNodeWithTag(TextfieldTag).performTouchInput { swipeLeft() }
 
-        rule.runOnIdle {
-            assertThat(scrollState1.value).isGreaterThan(0)
-        }
+        rule.runOnIdle { assertThat(scrollState1.value).isGreaterThan(0) }
 
         stateToggle = false
 
@@ -409,13 +376,9 @@
         rule.onNodeWithTag(TextfieldTag).assertIsNotFocused()
 
         // move cursor to the end
-        state.edit {
-            placeCursorAtEnd()
-        }
+        state.edit { placeCursorAtEnd() }
 
-        rule.runOnIdle {
-            assertThat(scrollState.value).isEqualTo(0)
-        }
+        rule.runOnIdle { assertThat(scrollState.value).isEqualTo(0) }
     }
 
     @Test
@@ -438,9 +401,7 @@
             state.edit { placeCursorAtEnd() }
         }
 
-        rule.runOnIdle {
-            assertThat(scrollState.value).isEqualTo(scrollState.maxValue)
-        }
+        rule.runOnIdle { assertThat(scrollState.value).isEqualTo(scrollState.maxValue) }
     }
 
     @Test
@@ -478,9 +439,7 @@
             isRtl = true
         )
 
-        rule.runOnIdle {
-            assertThat(scrollState.value).isEqualTo(0)
-        }
+        rule.runOnIdle { assertThat(scrollState.value).isEqualTo(0) }
 
         rule.onNodeWithTag(TextfieldTag).performTouchInput { swipeLeft() }
 
@@ -489,20 +448,20 @@
         assertThat(firstSwipePosition).isEqualTo(0)
 
         rule.onNodeWithTag(TextfieldTag).performTouchInput { swipeRight() }
-        rule.runOnIdle {
-            assertThat(scrollState.value).isGreaterThan(firstSwipePosition)
-        }
+        rule.runOnIdle { assertThat(scrollState.value).isGreaterThan(firstSwipePosition) }
     }
 
     @Test
     fun textFieldScroll_testNestedScrolling() = runBlocking {
         val size = 300.dp
-        val text = """
+        val text =
+            """
             First Line
             Second Line
             Third Line
             Fourth Line
-        """.trimIndent()
+        """
+                .trimIndent()
 
         val textFieldScrollState = ScrollState(0)
         val columnScrollState = ScrollState(0)
@@ -511,11 +470,7 @@
 
         rule.setContent {
             touchSlop = LocalViewConfiguration.current.touchSlop
-            Column(
-                Modifier
-                    .size(size)
-                    .verticalScroll(columnScrollState)
-            ) {
+            Column(Modifier.size(size).verticalScroll(columnScrollState)) {
                 ScrollableContent(
                     state = TextFieldState(text),
                     modifier = Modifier.size(size, height),
@@ -539,10 +494,7 @@
             val slopStartY = minOf(desiredY + touchSlop, nearEdge.toPx())
             val slopStart = Offset(x, slopStartY)
             val end = Offset(x, 0f)
-            rule.onNodeWithTag(TextfieldTag)
-                .performTouchInput {
-                    swipe(slopStart, end)
-                }
+            rule.onNodeWithTag(TextfieldTag).performTouchInput { swipe(slopStart, end) }
         }
 
         assertThat(textFieldScrollState.value).isGreaterThan(0)
@@ -560,12 +512,7 @@
         val columnScrollState = ScrollState(0)
 
         rule.setContent {
-            Column(
-                Modifier
-                    .size(containerSize)
-                    .padding(8.dp)
-                    .verticalScroll(columnScrollState)
-            ) {
+            Column(Modifier.size(containerSize).padding(8.dp).verticalScroll(columnScrollState)) {
                 Box(Modifier.size(topItemSize))
                 ScrollableContent(
                     modifier = Modifier.fillMaxWidth(),
@@ -580,9 +527,7 @@
         assertThat(textFieldScrollState.maxValue).isEqualTo(0)
         assertThat(columnScrollState.value).isEqualTo(0)
 
-        rule.onNodeWithTag(TextfieldTag).performTouchInput {
-            click(Offset(1f, 1f))
-        }
+        rule.onNodeWithTag(TextfieldTag).performTouchInput { click(Offset(1f, 1f)) }
 
         rule.waitForIdle()
 
@@ -632,12 +577,7 @@
         val rowScrollState = ScrollState(0)
 
         rule.setContent {
-            Row(
-                Modifier
-                    .size(containerSize)
-                    .padding(8.dp)
-                    .horizontalScroll(rowScrollState)
-            ) {
+            Row(Modifier.size(containerSize).padding(8.dp).horizontalScroll(rowScrollState)) {
                 Box(Modifier.size(startItemSize))
                 ScrollableContent(
                     modifier = Modifier.fillMaxHeight(),
@@ -652,9 +592,7 @@
         assertThat(textFieldScrollState.maxValue).isEqualTo(0)
         assertThat(rowScrollState.value).isEqualTo(0)
 
-        rule.onNodeWithTag(TextfieldTag).performTouchInput {
-            click(Offset(1f, 1f))
-        }
+        rule.onNodeWithTag(TextfieldTag).performTouchInput { click(Offset(1f, 1f)) }
 
         rule.waitForIdle()
 
@@ -706,11 +644,13 @@
                 state,
                 scrollState = scrollState,
                 lineLimits = SingleLine,
-                modifier = Modifier
-                    // Force the field to be scrollable.
-                    // Must be at least as wide as the cursor rectangle for the assertions to work.
-                    .requiredWidth(10.dp)
-                    .testTag("field")
+                modifier =
+                    Modifier
+                        // Force the field to be scrollable.
+                        // Must be at least as wide as the cursor rectangle for the assertions to
+                        // work.
+                        .requiredWidth(10.dp)
+                        .testTag("field")
             )
         }
         rule.onNodeWithTag("field").requestFocus()
@@ -719,23 +659,13 @@
             // assertion easier to write since we don't have to know the width of the glyph to
             // calculate the expected scroll offset. We have to do this after requesting focus since
             // the cursor will move change when focus is gained.
-            state.edit {
-                placeCursorBeforeCharAt(1)
-            }
+            state.edit { placeCursorBeforeCharAt(1) }
         }
-        rule.runOnIdle {
-            coroutineScope.launch {
-                scrollState.scrollTo(scrollState.maxValue)
-            }
-        }
-        rule.runOnIdle {
-            assertThat(scrollState.value).isEqualTo(scrollState.maxValue)
-        }
+        rule.runOnIdle { coroutineScope.launch { scrollState.scrollTo(scrollState.maxValue) } }
+        rule.runOnIdle { assertThat(scrollState.value).isEqualTo(scrollState.maxValue) }
         rule.onNodeWithTag("field").assertTextEquals("baaaaaaaaaa")
 
-        rule.onNodeWithTag("field").performKeyInput {
-            pressKey(Key.Backspace)
-        }
+        rule.onNodeWithTag("field").performKeyInput { pressKey(Key.Backspace) }
 
         rule.onNodeWithTag("field").assertTextEquals("aaaaaaaaaa")
         rule.waitUntil(
@@ -755,16 +685,16 @@
                 state,
                 scrollState = scrollState,
                 lineLimits = SingleLine,
-                modifier = Modifier
-                    // Force the field to be scrollable.
-                    // Must be at least as wide as the cursor rectangle for the assertions to work.
-                    .requiredWidth(10.dp)
-                    .testTag("field")
+                modifier =
+                    Modifier
+                        // Force the field to be scrollable.
+                        // Must be at least as wide as the cursor rectangle for the assertions to
+                        // work.
+                        .requiredWidth(10.dp)
+                        .testTag("field")
             )
         }
-        rule.runOnIdle {
-            assertThat(scrollState.value).isEqualTo(0)
-        }
+        rule.runOnIdle { assertThat(scrollState.value).isEqualTo(0) }
 
         rule.onNodeWithTag("field").performTextInput("b")
 
@@ -788,15 +718,11 @@
                 modifier = Modifier.testTag("field")
             )
         }
-        rule.runOnIdle {
-            assertThat(scrollState.value).isEqualTo(scrollState.maxValue)
-        }
+        rule.runOnIdle { assertThat(scrollState.value).isEqualTo(scrollState.maxValue) }
 
         rule.onNodeWithTag("field").performTextInput("b")
 
-        rule.waitUntil("scrollState.value (${scrollState.value}) == 0") {
-            scrollState.value == 0
-        }
+        rule.waitUntil("scrollState.value (${scrollState.value}) == 0") { scrollState.value == 0 }
     }
 
     @Test
@@ -811,9 +737,7 @@
                 modifier = Modifier.testTag("field")
             )
         }
-        rule.runOnIdle {
-            assertThat(scrollState.value).isEqualTo(0)
-        }
+        rule.runOnIdle { assertThat(scrollState.value).isEqualTo(0) }
 
         rule.onNodeWithTag("field").performTextInput("b")
 
@@ -838,9 +762,7 @@
             )
         }
         rule.onNodeWithTag("field").requestFocus()
-        rule.runOnIdle {
-            assertThat(scrollState.value).isEqualTo(scrollState.maxValue)
-        }
+        rule.runOnIdle { assertThat(scrollState.value).isEqualTo(scrollState.maxValue) }
 
         // At this point the field is scrolled all the way to the bottom, but then we enter a
         // newline, which will push the cursor below the bottom of the field. It should scroll up
@@ -863,8 +785,7 @@
         var containerHeight by mutableStateOf(0.dp)
         rule.setContent {
             Box(
-                Modifier
-                    .requiredHeight(containerHeight)
+                Modifier.requiredHeight(containerHeight)
                     .fillMaxWidth()
                     .border(1.dp, Color.Red)
                     .verticalScroll(scrollState)
@@ -873,16 +794,12 @@
                     state,
                     // The field should never scroll internally.
                     lineLimits = MultiLine(maxHeightInLines = Int.MAX_VALUE),
-                    modifier = Modifier
-                        .testTag("field")
-                        .border(1.dp, Color.Blue)
+                    modifier = Modifier.testTag("field").border(1.dp, Color.Blue)
                 )
             }
         }
         rule.onNodeWithTag("field").requestFocus()
-        rule.runOnIdle {
-            assertThat(scrollState.value).isEqualTo(0)
-        }
+        rule.runOnIdle { assertThat(scrollState.value).isEqualTo(0) }
 
         // Make the container height equal to the size of the single-line text field.
         with(rule.density) {
@@ -912,15 +829,9 @@
             BasicTextField(
                 state,
                 lineLimits = MultiLine(maxHeightInLines = 3),
-                modifier = Modifier
-                    .testTag("field")
-                    .border(1.dp, Color.Blue),
+                modifier = Modifier.testTag("field").border(1.dp, Color.Blue),
                 scrollState = scrollState,
-                decorator = {
-                    Box(modifier = Modifier.padding(16.dp)) {
-                        it()
-                    }
-                }
+                decorator = { Box(modifier = Modifier.padding(16.dp)) { it() } }
             )
         }
         // Enter 3 lines which will grow the TextField to its maximum allowed height in lines.
@@ -955,9 +866,7 @@
                 state,
                 // The field should never scroll internally.
                 lineLimits = MultiLine(maxHeightInLines = Int.MAX_VALUE),
-                modifier = Modifier
-                    .testTag("field")
-                    .border(1.dp, Color.Blue)
+                modifier = Modifier.testTag("field").border(1.dp, Color.Blue)
             )
         }
         rule.onNodeWithTag("field").requestFocus()
@@ -1029,8 +938,6 @@
     private fun runBlockingAndAwaitIdle(block: suspend CoroutineScope.() -> Unit) {
         val job = testScope.launch(block = block)
         rule.waitForIdle()
-        runBlocking {
-            job.join()
-        }
+        runBlocking { job.join() }
     }
 }
diff --git a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/input/TextFieldSingleLineHeightTest.kt b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/input/TextFieldSingleLineHeightTest.kt
index b589fe0..ce14531 100644
--- a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/input/TextFieldSingleLineHeightTest.kt
+++ b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/input/TextFieldSingleLineHeightTest.kt
@@ -46,8 +46,7 @@
     // Arabic and Thai characters combined for super tall script
     private val tallText = "\u0627\u0644\u0646\u0635\u0E17\u0E35\u0E48"
 
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
     @Test
     fun singleLineTextField_fromEmptyToTallText_updatesHeight() {
@@ -57,9 +56,7 @@
             BasicTextField(
                 state = state,
                 lineLimits = TextFieldLineLimits.SingleLine,
-                modifier = Modifier.onSizeChanged {
-                    reportedSize = it
-                }
+                modifier = Modifier.onSizeChanged { reportedSize = it }
             )
         }
 
@@ -82,9 +79,7 @@
             BasicTextField(
                 state = state,
                 lineLimits = TextFieldLineLimits.SingleLine,
-                modifier = Modifier.onSizeChanged {
-                    reportedSize = it
-                }
+                modifier = Modifier.onSizeChanged { reportedSize = it }
             )
         }
 
diff --git a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/input/internal/AndroidTextInputSessionTest.kt b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/input/internal/AndroidTextInputSessionTest.kt
index 333c607..83473b3 100644
--- a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/input/internal/AndroidTextInputSessionTest.kt
+++ b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/input/internal/AndroidTextInputSessionTest.kt
@@ -58,8 +58,7 @@
 @RunWith(AndroidJUnit4::class)
 class AndroidTextInputSessionTest {
 
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
     private lateinit var coroutineScope: CoroutineScope
     private lateinit var hostView: View
@@ -70,13 +69,7 @@
         rule.setContent {
             coroutineScope = rememberCoroutineScope()
             hostView = LocalView.current
-            Box(
-                modifier = Modifier
-                    .size(1.dp)
-                    .testTag("tag")
-                    .then(TestTextElement())
-                    .focusable()
-            )
+            Box(modifier = Modifier.size(1.dp).testTag("tag").then(TestTextElement()).focusable())
         }
         rule.onNodeWithTag("tag").requestFocus()
         rule.waitForIdle()
@@ -88,21 +81,18 @@
         launchInputSessionWithDefaultsForTest(state)
         val editorInfo = EditorInfo()
 
-        rule.runOnUiThread {
-            hostView.onCreateInputConnection(editorInfo)
-        }
+        rule.runOnUiThread { hostView.onCreateInputConnection(editorInfo) }
 
         Truth.assertThat(editorInfo.initialSelStart).isEqualTo(0)
         Truth.assertThat(editorInfo.initialSelEnd).isEqualTo(5)
-        Truth.assertThat(editorInfo.inputType).isEqualTo(
-            InputType.TYPE_CLASS_TEXT or
-                InputType.TYPE_TEXT_FLAG_MULTI_LINE or
-                InputType.TYPE_TEXT_FLAG_AUTO_CORRECT
-        )
-        Truth.assertThat(editorInfo.imeOptions).isEqualTo(
-            EditorInfo.IME_FLAG_NO_FULLSCREEN or
-                EditorInfo.IME_FLAG_NO_ENTER_ACTION
-        )
+        Truth.assertThat(editorInfo.inputType)
+            .isEqualTo(
+                InputType.TYPE_CLASS_TEXT or
+                    InputType.TYPE_TEXT_FLAG_MULTI_LINE or
+                    InputType.TYPE_TEXT_FLAG_AUTO_CORRECT
+            )
+        Truth.assertThat(editorInfo.imeOptions)
+            .isEqualTo(EditorInfo.IME_FLAG_NO_FULLSCREEN or EditorInfo.IME_FLAG_NO_ENTER_ACTION)
     }
 
     @Test
@@ -112,8 +102,7 @@
         launchInputSessionWithDefaultsForTest(state1)
 
         rule.runOnIdle {
-            hostView.onCreateInputConnection(EditorInfo())
-                .commitText("hello", 1)
+            hostView.onCreateInputConnection(EditorInfo()).commitText("hello", 1)
 
             Truth.assertThat(state1.text.toString()).isEqualTo("hello")
             Truth.assertThat(state2.text.toString()).isEqualTo("")
@@ -122,8 +111,7 @@
         launchInputSessionWithDefaultsForTest(state2)
 
         rule.runOnIdle {
-            hostView.onCreateInputConnection(EditorInfo())
-                .commitText("world", 1)
+            hostView.onCreateInputConnection(EditorInfo()).commitText("world", 1)
 
             Truth.assertThat(state1.text.toString()).isEqualTo("hello")
             Truth.assertThat(state2.text.toString()).isEqualTo("world")
@@ -141,7 +129,8 @@
         )
 
         rule.runOnIdle {
-            hostView.onCreateInputConnection(EditorInfo())
+            hostView
+                .onCreateInputConnection(EditorInfo())
                 .performEditorAction(EditorInfo.IME_ACTION_DONE)
 
             Truth.assertThat(imeActionFromOne).isEqualTo(ImeAction.Done)
@@ -154,7 +143,8 @@
         )
 
         rule.runOnIdle {
-            hostView.onCreateInputConnection(EditorInfo())
+            hostView
+                .onCreateInputConnection(EditorInfo())
                 .performEditorAction(EditorInfo.IME_ACTION_GO)
 
             Truth.assertThat(imeActionFromOne).isEqualTo(ImeAction.Done)
@@ -165,28 +155,27 @@
     @Test
     fun createInputConnection_updatesEditorInfo() {
         launchInputSessionWithDefaultsForTest(
-            imeOptions = ImeOptions(
-                singleLine = true,
-                keyboardType = KeyboardType.Email,
-                autoCorrect = false,
-                imeAction = ImeAction.Search,
-                capitalization = KeyboardCapitalization.Words
-            )
+            imeOptions =
+                ImeOptions(
+                    singleLine = true,
+                    keyboardType = KeyboardType.Email,
+                    autoCorrect = false,
+                    imeAction = ImeAction.Search,
+                    capitalization = KeyboardCapitalization.Words
+                )
         )
         val editorInfo = EditorInfo()
 
-        rule.runOnIdle {
-            hostView.onCreateInputConnection(editorInfo)
-        }
+        rule.runOnIdle { hostView.onCreateInputConnection(editorInfo) }
 
-        Truth.assertThat(editorInfo.inputType).isEqualTo(
-            InputType.TYPE_CLASS_TEXT or
-                InputType.TYPE_TEXT_VARIATION_EMAIL_ADDRESS or
-                InputType.TYPE_TEXT_FLAG_CAP_WORDS
-        )
-        Truth.assertThat(editorInfo.imeOptions).isEqualTo(
-            EditorInfo.IME_ACTION_SEARCH or EditorInfo.IME_FLAG_NO_FULLSCREEN
-        )
+        Truth.assertThat(editorInfo.inputType)
+            .isEqualTo(
+                InputType.TYPE_CLASS_TEXT or
+                    InputType.TYPE_TEXT_VARIATION_EMAIL_ADDRESS or
+                    InputType.TYPE_TEXT_FLAG_CAP_WORDS
+            )
+        Truth.assertThat(editorInfo.imeOptions)
+            .isEqualTo(EditorInfo.IME_ACTION_SEARCH or EditorInfo.IME_FLAG_NO_FULLSCREEN)
     }
 
     @Test
@@ -228,11 +217,7 @@
                         composeImm = composeImm
                     )
                 } else {
-                    inputSessionWithDefaultsForTest(
-                        state,
-                        imeOptions,
-                        onImeAction
-                    )
+                    inputSessionWithDefaultsForTest(state, imeOptions, onImeAction)
                 }
             }
         }
@@ -244,25 +229,30 @@
         onImeAction: (ImeAction) -> Unit = {},
         receiveContentConfiguration: ReceiveContentConfiguration? = null,
         composeImm: ComposeInputMethodManager = ComposeInputMethodManager(view)
-    ): Nothing = platformSpecificTextInputSession(
-        state = TransformedTextFieldState(
-            textFieldState = state,
-            inputTransformation = null,
-            codepointTransformation = null
-        ),
-        layoutState = TextLayoutState(),
-        imeOptions = imeOptions,
-        composeImm = composeImm,
-        receiveContentConfiguration = receiveContentConfiguration,
-        onImeAction = onImeAction,
-        stylusHandwritingTrigger = null,
-        viewConfiguration = null
-    )
+    ): Nothing =
+        platformSpecificTextInputSession(
+            state =
+                TransformedTextFieldState(
+                    textFieldState = state,
+                    inputTransformation = null,
+                    codepointTransformation = null
+                ),
+            layoutState = TextLayoutState(),
+            imeOptions = imeOptions,
+            composeImm = composeImm,
+            receiveContentConfiguration = receiveContentConfiguration,
+            onImeAction = onImeAction,
+            stylusHandwritingTrigger = null,
+            viewConfiguration = null
+        )
 
     private inner class TestTextElement : ModifierNodeElement<TestTextNode>() {
         override fun create(): TestTextNode = TestTextNode()
+
         override fun update(node: TestTextNode) {}
+
         override fun hashCode(): Int = 0
+
         override fun equals(other: Any?): Boolean = other is TestTextElement
     }
 
diff --git a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/input/internal/AsyncTestFonts.kt b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/input/internal/AsyncTestFonts.kt
index 95140e4..ba81186 100644
--- a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/input/internal/AsyncTestFonts.kt
+++ b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/input/internal/AsyncTestFonts.kt
@@ -30,8 +30,7 @@
 @Suppress("MemberVisibilityCanBePrivate") // visible for testing
 class AsyncTestTypefaceLoader : AndroidFont.TypefaceLoader {
     private val callbackLock = Object()
-    @Volatile
-    private var asyncLoadCallback: ((AndroidFont) -> Unit)? = null
+    @Volatile private var asyncLoadCallback: ((AndroidFont) -> Unit)? = null
     private val requests =
         mutableMapOf<AsyncFauxFont, MutableList<CompletableDeferred<Typeface?>>>()
     internal val completedAsyncRequests = mutableListOf<AsyncFauxFont>()
@@ -41,18 +40,17 @@
     }
 
     override suspend fun awaitLoad(context: Context, font: AndroidFont): Typeface? {
-        val result = when (font) {
-            is AsyncFauxFont -> {
-                val deferred = CompletableDeferred<Typeface?>()
-                val list = requests.getOrPut(font) { mutableListOf() }
-                list.add(deferred)
-                synchronized(callbackLock) {
-                    asyncLoadCallback?.invoke(font)
+        val result =
+            when (font) {
+                is AsyncFauxFont -> {
+                    val deferred = CompletableDeferred<Typeface?>()
+                    val list = requests.getOrPut(font) { mutableListOf() }
+                    list.add(deferred)
+                    synchronized(callbackLock) { asyncLoadCallback?.invoke(font) }
+                    deferred.await()
                 }
-                deferred.await()
+                else -> null
             }
-            else -> null
-        }
         return result
     }
 
diff --git a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/input/internal/BackspaceCommandTest.kt b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/input/internal/BackspaceCommandTest.kt
index 5f64d12..c54694e 100644
--- a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/input/internal/BackspaceCommandTest.kt
+++ b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/input/internal/BackspaceCommandTest.kt
@@ -120,10 +120,7 @@
     @Test
     @SdkSuppress(minSdkVersion = 26)
     fun test_delete_with_composition_zwj_emoji() {
-        val eb = EditingBuffer(
-            "$ZWJ_EMOJI$ZWJ_EMOJI",
-            TextRange(ZWJ_EMOJI.length)
-        )
+        val eb = EditingBuffer("$ZWJ_EMOJI$ZWJ_EMOJI", TextRange(ZWJ_EMOJI.length))
 
         eb.backspace()
 
diff --git a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/input/internal/BasicTextFieldHoverTest.kt b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/input/internal/BasicTextFieldHoverTest.kt
index 5d6b02b..d40d80c 100644
--- a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/input/internal/BasicTextFieldHoverTest.kt
+++ b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/input/internal/BasicTextFieldHoverTest.kt
@@ -51,101 +51,103 @@
 @SdkSuppress(minSdkVersion = Build.VERSION_CODES.N)
 @RunWith(AndroidJUnit4::class)
 class BasicTextFieldHoverTest {
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
     @Test
-    fun whenDefaultIcon_inBoxWithDefaultIcon_textIconIsUsed() = runTest(
-        boxIconModifier = Modifier,
-        expectedBoxIcon = TYPE_DEFAULT,
-        textFieldIconModifier = Modifier,
-        expectedTextIcon = TYPE_TEXT
-    )
+    fun whenDefaultIcon_inBoxWithDefaultIcon_textIconIsUsed() =
+        runTest(
+            boxIconModifier = Modifier,
+            expectedBoxIcon = TYPE_DEFAULT,
+            textFieldIconModifier = Modifier,
+            expectedTextIcon = TYPE_TEXT
+        )
 
     @Test
-    fun whenSetIcon_inBoxWithDefaultIcon_textIconIsUsed() = runTest(
-        boxIconModifier = Modifier,
-        expectedBoxIcon = TYPE_DEFAULT,
-        textFieldIconModifier = Modifier.pointerHoverIcon(PointerIcon.Crosshair),
-        expectedTextIcon = TYPE_TEXT
-    )
+    fun whenSetIcon_inBoxWithDefaultIcon_textIconIsUsed() =
+        runTest(
+            boxIconModifier = Modifier,
+            expectedBoxIcon = TYPE_DEFAULT,
+            textFieldIconModifier = Modifier.pointerHoverIcon(PointerIcon.Crosshair),
+            expectedTextIcon = TYPE_TEXT
+        )
 
     @Test
-    fun whenSetIcon_withOverride_inBoxWithDefaultIcon_setIconIsUsed() = runTest(
-        boxIconModifier = Modifier,
-        expectedBoxIcon = TYPE_DEFAULT,
-        textFieldIconModifier = Modifier.pointerHoverIcon(
-            icon = PointerIcon.Crosshair,
-            overrideDescendants = true
-        ),
-        expectedTextIcon = TYPE_CROSSHAIR
-    )
+    fun whenSetIcon_withOverride_inBoxWithDefaultIcon_setIconIsUsed() =
+        runTest(
+            boxIconModifier = Modifier,
+            expectedBoxIcon = TYPE_DEFAULT,
+            textFieldIconModifier =
+                Modifier.pointerHoverIcon(icon = PointerIcon.Crosshair, overrideDescendants = true),
+            expectedTextIcon = TYPE_CROSSHAIR
+        )
 
     @Test
-    fun whenDefaultIcon_inBoxWithSetIcon_textIconIsUsed() = runTest(
-        boxIconModifier = Modifier.pointerHoverIcon(PointerIcon.Hand),
-        expectedBoxIcon = TYPE_HAND,
-        textFieldIconModifier = Modifier,
-        expectedTextIcon = TYPE_TEXT
-    )
+    fun whenDefaultIcon_inBoxWithSetIcon_textIconIsUsed() =
+        runTest(
+            boxIconModifier = Modifier.pointerHoverIcon(PointerIcon.Hand),
+            expectedBoxIcon = TYPE_HAND,
+            textFieldIconModifier = Modifier,
+            expectedTextIcon = TYPE_TEXT
+        )
 
     @Test
-    fun whenSetIcon_inBoxWithSetIcon_textIconIsUsed() = runTest(
-        boxIconModifier = Modifier.pointerHoverIcon(PointerIcon.Hand),
-        expectedBoxIcon = TYPE_HAND,
-        textFieldIconModifier = Modifier.pointerHoverIcon(PointerIcon.Crosshair),
-        expectedTextIcon = TYPE_TEXT
-    )
+    fun whenSetIcon_inBoxWithSetIcon_textIconIsUsed() =
+        runTest(
+            boxIconModifier = Modifier.pointerHoverIcon(PointerIcon.Hand),
+            expectedBoxIcon = TYPE_HAND,
+            textFieldIconModifier = Modifier.pointerHoverIcon(PointerIcon.Crosshair),
+            expectedTextIcon = TYPE_TEXT
+        )
 
     @Test
-    fun whenSetIcon_withOverride_inBoxWithSetIcon_setIconIsUsed() = runTest(
-        boxIconModifier = Modifier.pointerHoverIcon(PointerIcon.Hand),
-        expectedBoxIcon = TYPE_HAND,
-        textFieldIconModifier = Modifier.pointerHoverIcon(
-            icon = PointerIcon.Crosshair,
-            overrideDescendants = true
-        ),
-        expectedTextIcon = TYPE_CROSSHAIR
-    )
+    fun whenSetIcon_withOverride_inBoxWithSetIcon_setIconIsUsed() =
+        runTest(
+            boxIconModifier = Modifier.pointerHoverIcon(PointerIcon.Hand),
+            expectedBoxIcon = TYPE_HAND,
+            textFieldIconModifier =
+                Modifier.pointerHoverIcon(icon = PointerIcon.Crosshair, overrideDescendants = true),
+            expectedTextIcon = TYPE_CROSSHAIR
+        )
 
     private fun runTest(
         boxIconModifier: Modifier,
         expectedBoxIcon: Int,
         textFieldIconModifier: Modifier,
         expectedTextIcon: Int,
-    ) = with(PointerIconTestScope(rule)) {
-        val boxTag = "myParentIcon"
-        val textFieldTag = "myCoreTextField"
+    ) =
+        with(PointerIconTestScope(rule)) {
+            val boxTag = "myParentIcon"
+            val textFieldTag = "myCoreTextField"
 
-        setContent {
-            val tfs = rememberTextFieldState("initial text")
-            Box(
-                modifier = Modifier
-                    .requiredSize(200.dp)
-                    .then(boxIconModifier)
-                    .border(BorderStroke(2.dp, SolidColor(Color.Red)))
-                    .testTag(boxTag)
-            ) {
-                BasicTextField(
-                    state = tfs,
-                    modifier = Modifier
-                        .requiredSize(50.dp)
-                        .then(textFieldIconModifier)
-                        .testTag(textFieldTag)
-                )
+            setContent {
+                val tfs = rememberTextFieldState("initial text")
+                Box(
+                    modifier =
+                        Modifier.requiredSize(200.dp)
+                            .then(boxIconModifier)
+                            .border(BorderStroke(2.dp, SolidColor(Color.Red)))
+                            .testTag(boxTag)
+                ) {
+                    BasicTextField(
+                        state = tfs,
+                        modifier =
+                            Modifier.requiredSize(50.dp)
+                                .then(textFieldIconModifier)
+                                .testTag(textFieldTag)
+                    )
+                }
             }
+
+            // Hover over CoreTextField
+            rule.onNodeWithTag(textFieldTag).performMouseInput { enter(bottomRight) }
+            assertIcon(expectedTextIcon)
+
+            // Move cursor to hover over portion of the parent box not covered by any descendants
+            rule.onNodeWithTag(boxTag).performMouseInput { moveTo(bottomRight) }
+            assertIcon(expectedBoxIcon)
+
+            // Exit hovering over element
+            rule.onNodeWithTag(boxTag).performMouseInput { exit() }
+            assertIcon(TYPE_DEFAULT)
         }
-
-        // Hover over CoreTextField
-        rule.onNodeWithTag(textFieldTag).performMouseInput { enter(bottomRight) }
-        assertIcon(expectedTextIcon)
-
-        // Move cursor to hover over portion of the parent box not covered by any descendants
-        rule.onNodeWithTag(boxTag).performMouseInput { moveTo(bottomRight) }
-        assertIcon(expectedBoxIcon)
-
-        // Exit hovering over element
-        rule.onNodeWithTag(boxTag).performMouseInput { exit() }
-        assertIcon(TYPE_DEFAULT)
-    }
 }
diff --git a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/input/internal/ComposeInputMethodManagerTest.kt b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/input/internal/ComposeInputMethodManagerTest.kt
index 19e7e08..e1676ef 100644
--- a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/input/internal/ComposeInputMethodManagerTest.kt
+++ b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/input/internal/ComposeInputMethodManagerTest.kt
@@ -33,8 +33,7 @@
 @RunWith(AndroidJUnit4::class)
 class ComposeInputMethodManagerTest {
 
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
     @Test
     fun restartInput_startsNewInputConnection() {
@@ -42,15 +41,18 @@
         var imm: ComposeInputMethodManager? = null
         var view: View? = null
         rule.setContent {
-            AndroidView(factory = { context ->
-                TestView(context) { editorInfo ->
-                    calledCreateInputConnection = editorInfo
-                    null
-                }.also {
-                    view = it
-                    imm = ComposeInputMethodManager(it)
+            AndroidView(
+                factory = { context ->
+                    TestView(context) { editorInfo ->
+                            calledCreateInputConnection = editorInfo
+                            null
+                        }
+                        .also {
+                            view = it
+                            imm = ComposeInputMethodManager(it)
+                        }
                 }
-            })
+            )
         }
 
         rule.runOnUiThread {
@@ -58,9 +60,7 @@
             imm?.restartInput()
         }
 
-        rule.runOnIdle {
-            Truth.assertThat(calledCreateInputConnection).isNotNull()
-        }
+        rule.runOnIdle { Truth.assertThat(calledCreateInputConnection).isNotNull() }
     }
 
     @Test
@@ -69,15 +69,18 @@
         var imm: ComposeInputMethodManager? = null
         var view: View? = null
         rule.setContent {
-            AndroidView(factory = { context ->
-                TestView(context) {
-                    createInputConnectionCalled++
-                    null
-                }.also {
-                    view = it
-                    imm = ComposeInputMethodManager(it)
+            AndroidView(
+                factory = { context ->
+                    TestView(context) {
+                            createInputConnectionCalled++
+                            null
+                        }
+                        .also {
+                            view = it
+                            imm = ComposeInputMethodManager(it)
+                        }
                 }
-            })
+            )
         }
 
         rule.runOnUiThread {
@@ -85,9 +88,7 @@
             imm?.restartInput()
         }
 
-        rule.waitUntil {
-            createInputConnectionCalled >= 1
-        }
+        rule.waitUntil { createInputConnectionCalled >= 1 }
         rule.runOnIdle {
             // when first time we start input, checkFocus in platform code causes
             // onCreateInputConnection to be called twice. However, this is not guaranteed.
@@ -95,9 +96,7 @@
         }
 
         val previousCreateInputConnectionCalled = createInputConnectionCalled
-        rule.runOnUiThread {
-            imm?.restartInput()
-        }
+        rule.runOnUiThread { imm?.restartInput() }
 
         rule.runOnIdle {
             Truth.assertThat(createInputConnectionCalled)
diff --git a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/input/internal/CursorAnchorInfoBuilderTest.kt b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/input/internal/CursorAnchorInfoBuilderTest.kt
index 8f8a561..b79b6e3 100644
--- a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/input/internal/CursorAnchorInfoBuilderTest.kt
+++ b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/input/internal/CursorAnchorInfoBuilderTest.kt
@@ -98,13 +98,7 @@
 
         val cursorAnchorInfo =
             CursorAnchorInfo.Builder()
-                .build(
-                    text,
-                    selection,
-                    composition,
-                    getTextLayoutResult(text),
-                    matrix
-                )
+                .build(text, selection, composition, getTextLayoutResult(text), matrix)
 
         Truth.assertThat(cursorAnchorInfo.selectionStart).isEqualTo(1)
         Truth.assertThat(cursorAnchorInfo.selectionEnd).isEqualTo(2)
@@ -118,13 +112,7 @@
 
         val cursorAnchorInfo =
             CursorAnchorInfo.Builder()
-                .build(
-                    text,
-                    selection,
-                    composition,
-                    getTextLayoutResult(text),
-                    matrix
-                )
+                .build(text, selection, composition, getTextLayoutResult(text), matrix)
 
         Truth.assertThat(cursorAnchorInfo.composingTextStart).isEqualTo(-1)
         Truth.assertThat(cursorAnchorInfo.composingText).isNull()
@@ -138,13 +126,7 @@
 
         val cursorAnchorInfo =
             CursorAnchorInfo.Builder()
-                .build(
-                    text,
-                    selection,
-                    composition,
-                    getTextLayoutResult(text),
-                    matrix
-                )
+                .build(text, selection, composition, getTextLayoutResult(text), matrix)
 
         Truth.assertThat(cursorAnchorInfo.composingTextStart).isEqualTo(0)
         Truth.assertThat(cursorAnchorInfo.composingText.toString()).isEqualTo(text)
@@ -161,13 +143,7 @@
 
         val cursorAnchorInfo =
             CursorAnchorInfo.Builder()
-                .build(
-                    text,
-                    selection,
-                    composition,
-                    getTextLayoutResult(text),
-                    matrix
-                )
+                .build(text, selection, composition, getTextLayoutResult(text), matrix)
 
         Truth.assertThat(cursorAnchorInfo.composingTextStart).isEqualTo(word1.length)
         Truth.assertThat(cursorAnchorInfo.composingText.toString()).isEqualTo(word2)
@@ -205,13 +181,7 @@
         val builder = CursorAnchorInfo.Builder()
 
         val cursorAnchorInfo =
-            builder.build(
-                text,
-                selection,
-                composition,
-                getTextLayoutResult(text),
-                matrix
-            )
+            builder.build(text, selection, composition, getTextLayoutResult(text), matrix)
 
         Truth.assertThat(cursorAnchorInfo.composingText.toString()).isEqualTo(text)
         Truth.assertThat(cursorAnchorInfo.composingTextStart).isEqualTo(composition.min)
@@ -261,13 +231,7 @@
             builder.build(text, selection, composition, textLayoutResult, matrix)
 
         val cursorAnchorInfo2 =
-            builder.build(
-                text,
-                selection = TextRange(1),
-                composition,
-                textLayoutResult,
-                matrix
-            )
+            builder.build(text, selection = TextRange(1), composition, textLayoutResult, matrix)
 
         Truth.assertThat(cursorAnchorInfo1.insertionMarkerHorizontal)
             .isEqualTo(cursorAnchorInfo2.insertionMarkerHorizontal)
@@ -290,8 +254,7 @@
         val selection = TextRange(5)
         val composition: TextRange? = null
         val width = 4 * fontSizeInPx
-        val textLayoutResult =
-            getTextLayoutResult(text, fontSize = fontSize, width = width)
+        val textLayoutResult = getTextLayoutResult(text, fontSize = fontSize, width = width)
 
         val cursorAnchorInfo =
             CursorAnchorInfo.Builder().build(text, selection, composition, textLayoutResult, matrix)
@@ -314,8 +277,7 @@
         val selection = TextRange(0)
         val composition: TextRange? = null
         val width = 3 * fontSizeInPx
-        val textLayoutResult =
-            getTextLayoutResult(text, fontSize = fontSize, width = width)
+        val textLayoutResult = getTextLayoutResult(text, fontSize = fontSize, width = width)
 
         val cursorAnchorInfo =
             CursorAnchorInfo.Builder().build(text, selection, composition, textLayoutResult, matrix)
@@ -392,7 +354,7 @@
         Truth.assertThat(cursorAnchorInfo.insertionMarkerFlags)
             .isEqualTo(
                 CursorAnchorInfo.FLAG_HAS_VISIBLE_REGION or
-                CursorAnchorInfo.FLAG_HAS_INVISIBLE_REGION
+                    CursorAnchorInfo.FLAG_HAS_INVISIBLE_REGION
             )
     }
 
@@ -431,8 +393,7 @@
         // Composition is on "bc"
         val composition = TextRange(2, 4)
         val width = text.length * fontSizeInPx
-        val textLayoutResult =
-            getTextLayoutResult(text, fontSize = fontSize, width = width)
+        val textLayoutResult = getTextLayoutResult(text, fontSize = fontSize, width = width)
 
         val cursorAnchorInfo =
             CursorAnchorInfo.Builder().build(text, selection, composition, textLayoutResult, matrix)
@@ -461,8 +422,7 @@
         // Composition is on "\u05D1\u05D2"
         val composition = TextRange(2, 4)
         val width = text.length * fontSizeInPx
-        val textLayoutResult =
-            getTextLayoutResult(text, fontSize = fontSize, width = width)
+        val textLayoutResult = getTextLayoutResult(text, fontSize = fontSize, width = width)
 
         val cursorAnchorInfo =
             CursorAnchorInfo.Builder().build(text, selection, composition, textLayoutResult, matrix)
@@ -480,8 +440,7 @@
                     )
                 Truth.assertThat(cursorAnchorInfo.getCharacterBoundsFlags(index))
                     .isEqualTo(
-                        CursorAnchorInfo.FLAG_HAS_VISIBLE_REGION or
-                            CursorAnchorInfo.FLAG_IS_RTL
+                        CursorAnchorInfo.FLAG_HAS_VISIBLE_REGION or CursorAnchorInfo.FLAG_IS_RTL
                     )
             } else {
                 Truth.assertThat(cursorAnchorInfo.getCharacterBounds(index)).isNull()
@@ -499,8 +458,7 @@
         // Composition is on "bc"
         val composition = TextRange(2, 4)
         val width = text.length * fontSizeInPx
-        val textLayoutResult =
-            getTextLayoutResult(text, fontSize = fontSize, width = width)
+        val textLayoutResult = getTextLayoutResult(text, fontSize = fontSize, width = width)
         val innerTextFieldBounds = Rect(3.5f * fontSizeInPx, 0f, 4f * fontSizeInPx, fontSizeInPx)
 
         val cursorAnchorInfo =
@@ -537,8 +495,7 @@
         // Composition is on "bc"
         val composition = TextRange(2, 4)
         val width = text.length * fontSizeInPx
-        val textLayoutResult =
-            getTextLayoutResult(text, fontSize = fontSize, width = width)
+        val textLayoutResult = getTextLayoutResult(text, fontSize = fontSize, width = width)
 
         val cursorAnchorInfo =
             CursorAnchorInfo.Builder()
diff --git a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/input/internal/DragAndDropTestUtils.kt b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/input/internal/DragAndDropTestUtils.kt
index c54cdea..50ac2cd 100644
--- a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/input/internal/DragAndDropTestUtils.kt
+++ b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/input/internal/DragAndDropTestUtils.kt
@@ -63,19 +63,16 @@
     ): DragEvent {
         return makeDragEvent(
             action = action,
-            clipData = createClipData {
-                // We're not actually resolving Uris in these tests, so this can be anything:
-                addUri(item, mimeType = "image/png")
-            },
+            clipData =
+                createClipData {
+                    // We're not actually resolving Uris in these tests, so this can be anything:
+                    addUri(item, mimeType = "image/png")
+                },
             offset = offset
         )
     }
 
-    fun makeDragEvent(
-        action: Int,
-        clipData: ClipData,
-        offset: Offset = Offset.Zero
-    ): DragEvent {
+    fun makeDragEvent(action: Int, clipData: ClipData, offset: Offset = Offset.Zero): DragEvent {
         val parcel = Parcel.obtain()
 
         parcel.writeInt(action)
diff --git a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/input/internal/EditorInfoTest.kt b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/input/internal/EditorInfoTest.kt
index a60e03e..73d2ddf 100644
--- a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/input/internal/EditorInfoTest.kt
+++ b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/input/internal/EditorInfoTest.kt
@@ -46,233 +46,172 @@
     @Test
     fun test_fill_editor_info_text() {
         val info = EditorInfo()
-        info.update(
-            ImeOptions(
-                keyboardType = KeyboardType.Text,
-                imeAction = ImeAction.Default
-            )
-        )
+        info.update(ImeOptions(keyboardType = KeyboardType.Text, imeAction = ImeAction.Default))
 
         assertThat((InputType.TYPE_CLASS_TEXT and info.inputType) != 0).isTrue()
         assertThat(
-            (EditorInfo.IME_MASK_ACTION and info.imeOptions)
-                == EditorInfo.IME_ACTION_UNSPECIFIED
-        ).isTrue()
+                (EditorInfo.IME_MASK_ACTION and info.imeOptions) ==
+                    EditorInfo.IME_ACTION_UNSPECIFIED
+            )
+            .isTrue()
     }
 
     @Test
     fun test_fill_editor_info_ascii() {
         val info = EditorInfo()
-        info.update(
-            ImeOptions(
-                keyboardType = KeyboardType.Ascii,
-                imeAction = ImeAction.Default
-            )
-        )
+        info.update(ImeOptions(keyboardType = KeyboardType.Ascii, imeAction = ImeAction.Default))
 
         assertThat((InputType.TYPE_CLASS_TEXT and info.inputType) != 0).isTrue()
         assertThat((EditorInfo.IME_FLAG_FORCE_ASCII and info.imeOptions) != 0).isTrue()
         assertThat(
-            (EditorInfo.IME_MASK_ACTION and info.imeOptions)
-                == EditorInfo.IME_ACTION_UNSPECIFIED
-        ).isTrue()
+                (EditorInfo.IME_MASK_ACTION and info.imeOptions) ==
+                    EditorInfo.IME_ACTION_UNSPECIFIED
+            )
+            .isTrue()
     }
 
     @Test
     fun test_fill_editor_info_number() {
         val info = EditorInfo()
-        info.update(
-            ImeOptions(
-                keyboardType = KeyboardType.Number,
-                imeAction = ImeAction.Default
-            )
-        )
+        info.update(ImeOptions(keyboardType = KeyboardType.Number, imeAction = ImeAction.Default))
 
         assertThat((InputType.TYPE_CLASS_NUMBER and info.inputType) != 0).isTrue()
         assertThat(
-            (EditorInfo.IME_MASK_ACTION and info.imeOptions)
-                == EditorInfo.IME_ACTION_UNSPECIFIED
-        ).isTrue()
+                (EditorInfo.IME_MASK_ACTION and info.imeOptions) ==
+                    EditorInfo.IME_ACTION_UNSPECIFIED
+            )
+            .isTrue()
     }
 
     @Test
     fun test_fill_editor_info_phone() {
         val info = EditorInfo()
-        info.update(
-            ImeOptions(
-                keyboardType = KeyboardType.Phone,
-                imeAction = ImeAction.Default
-            )
-        )
+        info.update(ImeOptions(keyboardType = KeyboardType.Phone, imeAction = ImeAction.Default))
 
         assertThat((InputType.TYPE_CLASS_PHONE and info.inputType) != 0).isTrue()
         assertThat(
-            (EditorInfo.IME_MASK_ACTION and info.imeOptions)
-                == EditorInfo.IME_ACTION_UNSPECIFIED
-        ).isTrue()
+                (EditorInfo.IME_MASK_ACTION and info.imeOptions) ==
+                    EditorInfo.IME_ACTION_UNSPECIFIED
+            )
+            .isTrue()
     }
 
     @Test
     fun test_fill_editor_info_uri() {
         val info = EditorInfo()
-        info.update(
-            ImeOptions(
-                keyboardType = KeyboardType.Uri,
-                imeAction = ImeAction.Default
-            )
-        )
+        info.update(ImeOptions(keyboardType = KeyboardType.Uri, imeAction = ImeAction.Default))
 
         assertThat((InputType.TYPE_CLASS_TEXT and info.inputType) != 0).isTrue()
         assertThat((InputType.TYPE_TEXT_VARIATION_URI and info.inputType) != 0).isTrue()
         assertThat(
-            (EditorInfo.IME_MASK_ACTION and info.imeOptions)
-                == EditorInfo.IME_ACTION_UNSPECIFIED
-        ).isTrue()
+                (EditorInfo.IME_MASK_ACTION and info.imeOptions) ==
+                    EditorInfo.IME_ACTION_UNSPECIFIED
+            )
+            .isTrue()
     }
 
     @Test
     fun test_fill_editor_info_email() {
         val info = EditorInfo()
-        info.update(
-            ImeOptions(
-                keyboardType = KeyboardType.Email,
-                imeAction = ImeAction.Default
-            )
-        )
+        info.update(ImeOptions(keyboardType = KeyboardType.Email, imeAction = ImeAction.Default))
 
         assertThat((InputType.TYPE_CLASS_TEXT and info.inputType) != 0).isTrue()
-        assertThat((InputType.TYPE_TEXT_VARIATION_EMAIL_ADDRESS and info.inputType) != 0)
-            .isTrue()
+        assertThat((InputType.TYPE_TEXT_VARIATION_EMAIL_ADDRESS and info.inputType) != 0).isTrue()
         assertThat(
-            (EditorInfo.IME_MASK_ACTION and info.imeOptions)
-                == EditorInfo.IME_ACTION_UNSPECIFIED
-        ).isTrue()
+                (EditorInfo.IME_MASK_ACTION and info.imeOptions) ==
+                    EditorInfo.IME_ACTION_UNSPECIFIED
+            )
+            .isTrue()
     }
 
     @Test
     fun test_fill_editor_info_password() {
         val info = EditorInfo()
-        info.update(
-            ImeOptions(
-                keyboardType = KeyboardType.Password,
-                imeAction = ImeAction.Default
-            )
-        )
+        info.update(ImeOptions(keyboardType = KeyboardType.Password, imeAction = ImeAction.Default))
 
         assertThat((InputType.TYPE_CLASS_TEXT and info.inputType) != 0).isTrue()
         assertThat((InputType.TYPE_TEXT_VARIATION_PASSWORD and info.inputType) != 0).isTrue()
         assertThat(
-            (EditorInfo.IME_MASK_ACTION and info.imeOptions)
-                == EditorInfo.IME_ACTION_UNSPECIFIED
-        ).isTrue()
+                (EditorInfo.IME_MASK_ACTION and info.imeOptions) ==
+                    EditorInfo.IME_ACTION_UNSPECIFIED
+            )
+            .isTrue()
     }
 
     @Test
     fun test_fill_editor_info_number_password() {
         val info = EditorInfo()
         info.update(
-            ImeOptions(
-                keyboardType = KeyboardType.NumberPassword,
-                imeAction = ImeAction.Default
-            )
+            ImeOptions(keyboardType = KeyboardType.NumberPassword, imeAction = ImeAction.Default)
         )
 
         assertThat((InputType.TYPE_CLASS_NUMBER and info.inputType) != 0).isTrue()
         assertThat((InputType.TYPE_NUMBER_VARIATION_PASSWORD and info.inputType) != 0).isTrue()
         assertThat(
-            (EditorInfo.IME_MASK_ACTION and info.imeOptions)
-                == EditorInfo.IME_ACTION_UNSPECIFIED
-        ).isTrue()
+                (EditorInfo.IME_MASK_ACTION and info.imeOptions) ==
+                    EditorInfo.IME_ACTION_UNSPECIFIED
+            )
+            .isTrue()
     }
 
     @Test
     fun test_fill_editor_info_decimal_number() {
         val info = EditorInfo()
-        info.update(
-            ImeOptions(
-                keyboardType = KeyboardType.Decimal,
-                imeAction = ImeAction.Default
-            )
-        )
+        info.update(ImeOptions(keyboardType = KeyboardType.Decimal, imeAction = ImeAction.Default))
 
         assertThat((InputType.TYPE_CLASS_NUMBER and info.inputType) != 0).isTrue()
         assertThat((InputType.TYPE_NUMBER_FLAG_DECIMAL and info.inputType) != 0).isTrue()
         assertThat(
-            (EditorInfo.IME_MASK_ACTION and info.imeOptions)
-                == EditorInfo.IME_ACTION_UNSPECIFIED
-        ).isTrue()
+                (EditorInfo.IME_MASK_ACTION and info.imeOptions) ==
+                    EditorInfo.IME_ACTION_UNSPECIFIED
+            )
+            .isTrue()
     }
 
     @Test
     fun test_fill_editor_info_action_none() {
         val info = EditorInfo()
-        info.update(
-            ImeOptions(
-                keyboardType = KeyboardType.Ascii,
-                imeAction = ImeAction.None
-            )
-        )
+        info.update(ImeOptions(keyboardType = KeyboardType.Ascii, imeAction = ImeAction.None))
 
         assertThat((InputType.TYPE_CLASS_TEXT and info.inputType) != 0).isTrue()
         assertThat((EditorInfo.IME_FLAG_FORCE_ASCII and info.imeOptions) != 0).isTrue()
-        assertThat(
-            (EditorInfo.IME_MASK_ACTION and info.imeOptions)
-                == EditorInfo.IME_ACTION_NONE
-        ).isTrue()
+        assertThat((EditorInfo.IME_MASK_ACTION and info.imeOptions) == EditorInfo.IME_ACTION_NONE)
+            .isTrue()
     }
 
     @Test
     fun test_fill_editor_info_action_go() {
         val info = EditorInfo()
-        info.update(
-            ImeOptions(
-                keyboardType = KeyboardType.Ascii,
-                imeAction = ImeAction.Go
-            )
-        )
+        info.update(ImeOptions(keyboardType = KeyboardType.Ascii, imeAction = ImeAction.Go))
 
         assertThat((InputType.TYPE_CLASS_TEXT and info.inputType) != 0).isTrue()
         assertThat((EditorInfo.IME_FLAG_FORCE_ASCII and info.imeOptions) != 0).isTrue()
-        assertThat(
-            (EditorInfo.IME_MASK_ACTION and info.imeOptions)
-                == EditorInfo.IME_ACTION_GO
-        ).isTrue()
+        assertThat((EditorInfo.IME_MASK_ACTION and info.imeOptions) == EditorInfo.IME_ACTION_GO)
+            .isTrue()
     }
 
     @Test
     fun test_fill_editor_info_action_next() {
         val info = EditorInfo()
-        info.update(
-            ImeOptions(
-                keyboardType = KeyboardType.Ascii,
-                imeAction = ImeAction.Next
-            )
-        )
+        info.update(ImeOptions(keyboardType = KeyboardType.Ascii, imeAction = ImeAction.Next))
 
         assertThat((InputType.TYPE_CLASS_TEXT and info.inputType) != 0).isTrue()
         assertThat((EditorInfo.IME_FLAG_FORCE_ASCII and info.imeOptions) != 0).isTrue()
-        assertThat(
-            (EditorInfo.IME_MASK_ACTION and info.imeOptions)
-                == EditorInfo.IME_ACTION_NEXT
-        ).isTrue()
+        assertThat((EditorInfo.IME_MASK_ACTION and info.imeOptions) == EditorInfo.IME_ACTION_NEXT)
+            .isTrue()
     }
 
     @Test
     fun test_fill_editor_info_action_previous() {
         val info = EditorInfo()
-        info.update(
-            ImeOptions(
-                keyboardType = KeyboardType.Ascii,
-                imeAction = ImeAction.Previous
-            )
-        )
+        info.update(ImeOptions(keyboardType = KeyboardType.Ascii, imeAction = ImeAction.Previous))
 
         assertThat((InputType.TYPE_CLASS_TEXT and info.inputType) != 0).isTrue()
         assertThat((EditorInfo.IME_FLAG_FORCE_ASCII and info.imeOptions) != 0).isTrue()
         assertThat(
-            (EditorInfo.IME_MASK_ACTION and info.imeOptions)
-                == EditorInfo.IME_ACTION_PREVIOUS
-        ).isTrue()
+                (EditorInfo.IME_MASK_ACTION and info.imeOptions) == EditorInfo.IME_ACTION_PREVIOUS
+            )
+            .isTrue()
     }
 
     @Test
@@ -287,46 +226,30 @@
 
         assertThat((InputType.TYPE_CLASS_TEXT and info.inputType) != 0).isTrue()
         assertThat((EditorInfo.IME_FLAG_FORCE_ASCII and info.imeOptions) != 0).isTrue()
-        assertThat(
-            (EditorInfo.IME_MASK_ACTION and info.imeOptions)
-                == EditorInfo.IME_ACTION_SEARCH
-        ).isTrue()
+        assertThat((EditorInfo.IME_MASK_ACTION and info.imeOptions) == EditorInfo.IME_ACTION_SEARCH)
+            .isTrue()
     }
 
     @Test
     fun test_fill_editor_info_action_send() {
         val info = EditorInfo()
-        info.update(
-            ImeOptions(
-                keyboardType = KeyboardType.Ascii,
-                imeAction = ImeAction.Send
-            )
-        )
+        info.update(ImeOptions(keyboardType = KeyboardType.Ascii, imeAction = ImeAction.Send))
 
         assertThat((InputType.TYPE_CLASS_TEXT and info.inputType) != 0).isTrue()
         assertThat((EditorInfo.IME_FLAG_FORCE_ASCII and info.imeOptions) != 0).isTrue()
-        assertThat(
-            (EditorInfo.IME_MASK_ACTION and info.imeOptions)
-                == EditorInfo.IME_ACTION_SEND
-        ).isTrue()
+        assertThat((EditorInfo.IME_MASK_ACTION and info.imeOptions) == EditorInfo.IME_ACTION_SEND)
+            .isTrue()
     }
 
     @Test
     fun test_fill_editor_info_action_done() {
         val info = EditorInfo()
-        info.update(
-            ImeOptions(
-                keyboardType = KeyboardType.Ascii,
-                imeAction = ImeAction.Done
-            )
-        )
+        info.update(ImeOptions(keyboardType = KeyboardType.Ascii, imeAction = ImeAction.Done))
 
         assertThat((InputType.TYPE_CLASS_TEXT and info.inputType) != 0).isTrue()
         assertThat((EditorInfo.IME_FLAG_FORCE_ASCII and info.imeOptions) != 0).isTrue()
-        assertThat(
-            (EditorInfo.IME_MASK_ACTION and info.imeOptions)
-                == EditorInfo.IME_ACTION_DONE
-        ).isTrue()
+        assertThat((EditorInfo.IME_MASK_ACTION and info.imeOptions) == EditorInfo.IME_ACTION_DONE)
+            .isTrue()
     }
 
     @Test
@@ -621,12 +544,7 @@
     @Test
     fun stylusHandwritingEnabled_fromAndroidV_password_returnsFalse() {
         val info = EditorInfo()
-        info.update(
-            ImeOptions(
-                keyboardType = KeyboardType.Password,
-                imeAction = ImeAction.Default
-            )
-        )
+        info.update(ImeOptions(keyboardType = KeyboardType.Password, imeAction = ImeAction.Default))
 
         assertThat(EditorInfoCompat.isStylusHandwritingEnabled(info)).isFalse()
     }
@@ -637,15 +555,16 @@
         val info = EditorInfo()
         info.update(ImeOptions.Default)
 
-        assertThat(info.supportedHandwritingGestures).containsExactly(
-            SelectGesture::class.java,
-            DeleteGesture::class.java,
-            SelectRangeGesture::class.java,
-            DeleteRangeGesture::class.java,
-            JoinOrSplitGesture::class.java,
-            InsertGesture::class.java,
-            RemoveSpaceGesture::class.java,
-        )
+        assertThat(info.supportedHandwritingGestures)
+            .containsExactly(
+                SelectGesture::class.java,
+                DeleteGesture::class.java,
+                SelectRangeGesture::class.java,
+                DeleteRangeGesture::class.java,
+                JoinOrSplitGesture::class.java,
+                InsertGesture::class.java,
+                RemoveSpaceGesture::class.java,
+            )
     }
 
     @SdkSuppress(minSdkVersion = 34)
@@ -654,18 +573,16 @@
         val info = EditorInfo()
         info.update(ImeOptions.Default)
 
-        assertThat(info.supportedHandwritingGesturePreviews).containsExactly(
-            SelectGesture::class.java,
-            DeleteGesture::class.java,
-            SelectRangeGesture::class.java,
-            DeleteRangeGesture::class.java,
-        )
+        assertThat(info.supportedHandwritingGesturePreviews)
+            .containsExactly(
+                SelectGesture::class.java,
+                DeleteGesture::class.java,
+                SelectRangeGesture::class.java,
+                DeleteRangeGesture::class.java,
+            )
     }
 
-    private fun EditorInfo.update(
-        imeOptions: ImeOptions,
-        contentMimeTypes: Array<String>? = null
-    ) {
+    private fun EditorInfo.update(imeOptions: ImeOptions, contentMimeTypes: Array<String>? = null) {
         this.update("", TextRange.Zero, imeOptions, contentMimeTypes)
     }
 }
diff --git a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/input/internal/LegacyCursorAnchorInfoBuilderTest.kt b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/input/internal/LegacyCursorAnchorInfoBuilderTest.kt
index 0b4fb84..341e2ec 100644
--- a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/input/internal/LegacyCursorAnchorInfoBuilderTest.kt
+++ b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/input/internal/LegacyCursorAnchorInfoBuilderTest.kt
@@ -276,10 +276,13 @@
     fun testInsertionMarkerWithVisualTransformation() {
         val fontSize = 10.sp
         val textFieldValue = TextFieldValue("abcde", selection = TextRange(2))
-        val offsetMapping = object : OffsetMapping {
-            override fun originalToTransformed(offset: Int) = if (offset < 2) offset else offset + 3
-            override fun transformedToOriginal(offset: Int) = throw NotImplementedError()
-        }
+        val offsetMapping =
+            object : OffsetMapping {
+                override fun originalToTransformed(offset: Int) =
+                    if (offset < 2) offset else offset + 3
+
+                override fun transformedToOriginal(offset: Int) = throw NotImplementedError()
+            }
         val textLayoutResult = getTextLayoutResult("ab---cde", fontSize = fontSize)
 
         val cursorAnchorInfo =
@@ -441,10 +444,12 @@
         val text = "abcd"
         // Composition is on "bc"
         val composition = TextRange(2, 4)
-        val offsetMapping = object : OffsetMapping {
-            override fun originalToTransformed(offset: Int) = 2 * offset
-            override fun transformedToOriginal(offset: Int) = throw NotImplementedError()
-        }
+        val offsetMapping =
+            object : OffsetMapping {
+                override fun originalToTransformed(offset: Int) = 2 * offset
+
+                override fun transformedToOriginal(offset: Int) = throw NotImplementedError()
+            }
         val transformedText = "a-b-c-d-"
         val textFieldValue = TextFieldValue(text, composition = composition)
         val width = transformedText.length * fontSizeInPx
diff --git a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/input/internal/LegacyEditorInfoTest.kt b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/input/internal/LegacyEditorInfoTest.kt
index 53336bc..35395f2 100644
--- a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/input/internal/LegacyEditorInfoTest.kt
+++ b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/input/internal/LegacyEditorInfoTest.kt
@@ -37,233 +37,172 @@
     @Test
     fun test_fill_editor_info_text() {
         val info = EditorInfo()
-        info.update(
-            ImeOptions(
-                keyboardType = KeyboardType.Text,
-                imeAction = ImeAction.Default
-            )
-        )
+        info.update(ImeOptions(keyboardType = KeyboardType.Text, imeAction = ImeAction.Default))
 
         assertThat((InputType.TYPE_CLASS_TEXT and info.inputType) != 0).isTrue()
         assertThat(
-            (EditorInfo.IME_MASK_ACTION and info.imeOptions)
-                == EditorInfo.IME_ACTION_UNSPECIFIED
-        ).isTrue()
+                (EditorInfo.IME_MASK_ACTION and info.imeOptions) ==
+                    EditorInfo.IME_ACTION_UNSPECIFIED
+            )
+            .isTrue()
     }
 
     @Test
     fun test_fill_editor_info_ascii() {
         val info = EditorInfo()
-        info.update(
-            ImeOptions(
-                keyboardType = KeyboardType.Ascii,
-                imeAction = ImeAction.Default
-            )
-        )
+        info.update(ImeOptions(keyboardType = KeyboardType.Ascii, imeAction = ImeAction.Default))
 
         assertThat((InputType.TYPE_CLASS_TEXT and info.inputType) != 0).isTrue()
         assertThat((EditorInfo.IME_FLAG_FORCE_ASCII and info.imeOptions) != 0).isTrue()
         assertThat(
-            (EditorInfo.IME_MASK_ACTION and info.imeOptions)
-                == EditorInfo.IME_ACTION_UNSPECIFIED
-        ).isTrue()
+                (EditorInfo.IME_MASK_ACTION and info.imeOptions) ==
+                    EditorInfo.IME_ACTION_UNSPECIFIED
+            )
+            .isTrue()
     }
 
     @Test
     fun test_fill_editor_info_number() {
         val info = EditorInfo()
-        info.update(
-            ImeOptions(
-                keyboardType = KeyboardType.Number,
-                imeAction = ImeAction.Default
-            )
-        )
+        info.update(ImeOptions(keyboardType = KeyboardType.Number, imeAction = ImeAction.Default))
 
         assertThat((InputType.TYPE_CLASS_NUMBER and info.inputType) != 0).isTrue()
         assertThat(
-            (EditorInfo.IME_MASK_ACTION and info.imeOptions)
-                == EditorInfo.IME_ACTION_UNSPECIFIED
-        ).isTrue()
+                (EditorInfo.IME_MASK_ACTION and info.imeOptions) ==
+                    EditorInfo.IME_ACTION_UNSPECIFIED
+            )
+            .isTrue()
     }
 
     @Test
     fun test_fill_editor_info_phone() {
         val info = EditorInfo()
-        info.update(
-            ImeOptions(
-                keyboardType = KeyboardType.Phone,
-                imeAction = ImeAction.Default
-            )
-        )
+        info.update(ImeOptions(keyboardType = KeyboardType.Phone, imeAction = ImeAction.Default))
 
         assertThat((InputType.TYPE_CLASS_PHONE and info.inputType) != 0).isTrue()
         assertThat(
-            (EditorInfo.IME_MASK_ACTION and info.imeOptions)
-                == EditorInfo.IME_ACTION_UNSPECIFIED
-        ).isTrue()
+                (EditorInfo.IME_MASK_ACTION and info.imeOptions) ==
+                    EditorInfo.IME_ACTION_UNSPECIFIED
+            )
+            .isTrue()
     }
 
     @Test
     fun test_fill_editor_info_uri() {
         val info = EditorInfo()
-        info.update(
-            ImeOptions(
-                keyboardType = KeyboardType.Uri,
-                imeAction = ImeAction.Default
-            )
-        )
+        info.update(ImeOptions(keyboardType = KeyboardType.Uri, imeAction = ImeAction.Default))
 
         assertThat((InputType.TYPE_CLASS_TEXT and info.inputType) != 0).isTrue()
         assertThat((InputType.TYPE_TEXT_VARIATION_URI and info.inputType) != 0).isTrue()
         assertThat(
-            (EditorInfo.IME_MASK_ACTION and info.imeOptions)
-                == EditorInfo.IME_ACTION_UNSPECIFIED
-        ).isTrue()
+                (EditorInfo.IME_MASK_ACTION and info.imeOptions) ==
+                    EditorInfo.IME_ACTION_UNSPECIFIED
+            )
+            .isTrue()
     }
 
     @Test
     fun test_fill_editor_info_email() {
         val info = EditorInfo()
-        info.update(
-            ImeOptions(
-                keyboardType = KeyboardType.Email,
-                imeAction = ImeAction.Default
-            )
-        )
+        info.update(ImeOptions(keyboardType = KeyboardType.Email, imeAction = ImeAction.Default))
 
         assertThat((InputType.TYPE_CLASS_TEXT and info.inputType) != 0).isTrue()
-        assertThat((InputType.TYPE_TEXT_VARIATION_EMAIL_ADDRESS and info.inputType) != 0)
-            .isTrue()
+        assertThat((InputType.TYPE_TEXT_VARIATION_EMAIL_ADDRESS and info.inputType) != 0).isTrue()
         assertThat(
-            (EditorInfo.IME_MASK_ACTION and info.imeOptions)
-                == EditorInfo.IME_ACTION_UNSPECIFIED
-        ).isTrue()
+                (EditorInfo.IME_MASK_ACTION and info.imeOptions) ==
+                    EditorInfo.IME_ACTION_UNSPECIFIED
+            )
+            .isTrue()
     }
 
     @Test
     fun test_fill_editor_info_password() {
         val info = EditorInfo()
-        info.update(
-            ImeOptions(
-                keyboardType = KeyboardType.Password,
-                imeAction = ImeAction.Default
-            )
-        )
+        info.update(ImeOptions(keyboardType = KeyboardType.Password, imeAction = ImeAction.Default))
 
         assertThat((InputType.TYPE_CLASS_TEXT and info.inputType) != 0).isTrue()
         assertThat((InputType.TYPE_TEXT_VARIATION_PASSWORD and info.inputType) != 0).isTrue()
         assertThat(
-            (EditorInfo.IME_MASK_ACTION and info.imeOptions)
-                == EditorInfo.IME_ACTION_UNSPECIFIED
-        ).isTrue()
+                (EditorInfo.IME_MASK_ACTION and info.imeOptions) ==
+                    EditorInfo.IME_ACTION_UNSPECIFIED
+            )
+            .isTrue()
     }
 
     @Test
     fun test_fill_editor_info_number_password() {
         val info = EditorInfo()
         info.update(
-            ImeOptions(
-                keyboardType = KeyboardType.NumberPassword,
-                imeAction = ImeAction.Default
-            )
+            ImeOptions(keyboardType = KeyboardType.NumberPassword, imeAction = ImeAction.Default)
         )
 
         assertThat((InputType.TYPE_CLASS_NUMBER and info.inputType) != 0).isTrue()
         assertThat((InputType.TYPE_NUMBER_VARIATION_PASSWORD and info.inputType) != 0).isTrue()
         assertThat(
-            (EditorInfo.IME_MASK_ACTION and info.imeOptions)
-                == EditorInfo.IME_ACTION_UNSPECIFIED
-        ).isTrue()
+                (EditorInfo.IME_MASK_ACTION and info.imeOptions) ==
+                    EditorInfo.IME_ACTION_UNSPECIFIED
+            )
+            .isTrue()
     }
 
     @Test
     fun test_fill_editor_info_decimal_number() {
         val info = EditorInfo()
-        info.update(
-            ImeOptions(
-                keyboardType = KeyboardType.Decimal,
-                imeAction = ImeAction.Default
-            )
-        )
+        info.update(ImeOptions(keyboardType = KeyboardType.Decimal, imeAction = ImeAction.Default))
 
         assertThat((InputType.TYPE_CLASS_NUMBER and info.inputType) != 0).isTrue()
         assertThat((InputType.TYPE_NUMBER_FLAG_DECIMAL and info.inputType) != 0).isTrue()
         assertThat(
-            (EditorInfo.IME_MASK_ACTION and info.imeOptions)
-                == EditorInfo.IME_ACTION_UNSPECIFIED
-        ).isTrue()
+                (EditorInfo.IME_MASK_ACTION and info.imeOptions) ==
+                    EditorInfo.IME_ACTION_UNSPECIFIED
+            )
+            .isTrue()
     }
 
     @Test
     fun test_fill_editor_info_action_none() {
         val info = EditorInfo()
-        info.update(
-            ImeOptions(
-                keyboardType = KeyboardType.Ascii,
-                imeAction = ImeAction.None
-            )
-        )
+        info.update(ImeOptions(keyboardType = KeyboardType.Ascii, imeAction = ImeAction.None))
 
         assertThat((InputType.TYPE_CLASS_TEXT and info.inputType) != 0).isTrue()
         assertThat((EditorInfo.IME_FLAG_FORCE_ASCII and info.imeOptions) != 0).isTrue()
-        assertThat(
-            (EditorInfo.IME_MASK_ACTION and info.imeOptions)
-                == EditorInfo.IME_ACTION_NONE
-        ).isTrue()
+        assertThat((EditorInfo.IME_MASK_ACTION and info.imeOptions) == EditorInfo.IME_ACTION_NONE)
+            .isTrue()
     }
 
     @Test
     fun test_fill_editor_info_action_go() {
         val info = EditorInfo()
-        info.update(
-            ImeOptions(
-                keyboardType = KeyboardType.Ascii,
-                imeAction = ImeAction.Go
-            )
-        )
+        info.update(ImeOptions(keyboardType = KeyboardType.Ascii, imeAction = ImeAction.Go))
 
         assertThat((InputType.TYPE_CLASS_TEXT and info.inputType) != 0).isTrue()
         assertThat((EditorInfo.IME_FLAG_FORCE_ASCII and info.imeOptions) != 0).isTrue()
-        assertThat(
-            (EditorInfo.IME_MASK_ACTION and info.imeOptions)
-                == EditorInfo.IME_ACTION_GO
-        ).isTrue()
+        assertThat((EditorInfo.IME_MASK_ACTION and info.imeOptions) == EditorInfo.IME_ACTION_GO)
+            .isTrue()
     }
 
     @Test
     fun test_fill_editor_info_action_next() {
         val info = EditorInfo()
-        info.update(
-            ImeOptions(
-                keyboardType = KeyboardType.Ascii,
-                imeAction = ImeAction.Next
-            )
-        )
+        info.update(ImeOptions(keyboardType = KeyboardType.Ascii, imeAction = ImeAction.Next))
 
         assertThat((InputType.TYPE_CLASS_TEXT and info.inputType) != 0).isTrue()
         assertThat((EditorInfo.IME_FLAG_FORCE_ASCII and info.imeOptions) != 0).isTrue()
-        assertThat(
-            (EditorInfo.IME_MASK_ACTION and info.imeOptions)
-                == EditorInfo.IME_ACTION_NEXT
-        ).isTrue()
+        assertThat((EditorInfo.IME_MASK_ACTION and info.imeOptions) == EditorInfo.IME_ACTION_NEXT)
+            .isTrue()
     }
 
     @Test
     fun test_fill_editor_info_action_previous() {
         val info = EditorInfo()
-        info.update(
-            ImeOptions(
-                keyboardType = KeyboardType.Ascii,
-                imeAction = ImeAction.Previous
-            )
-        )
+        info.update(ImeOptions(keyboardType = KeyboardType.Ascii, imeAction = ImeAction.Previous))
 
         assertThat((InputType.TYPE_CLASS_TEXT and info.inputType) != 0).isTrue()
         assertThat((EditorInfo.IME_FLAG_FORCE_ASCII and info.imeOptions) != 0).isTrue()
         assertThat(
-            (EditorInfo.IME_MASK_ACTION and info.imeOptions)
-                == EditorInfo.IME_ACTION_PREVIOUS
-        ).isTrue()
+                (EditorInfo.IME_MASK_ACTION and info.imeOptions) == EditorInfo.IME_ACTION_PREVIOUS
+            )
+            .isTrue()
     }
 
     @Test
@@ -278,46 +217,30 @@
 
         assertThat((InputType.TYPE_CLASS_TEXT and info.inputType) != 0).isTrue()
         assertThat((EditorInfo.IME_FLAG_FORCE_ASCII and info.imeOptions) != 0).isTrue()
-        assertThat(
-            (EditorInfo.IME_MASK_ACTION and info.imeOptions)
-                == EditorInfo.IME_ACTION_SEARCH
-        ).isTrue()
+        assertThat((EditorInfo.IME_MASK_ACTION and info.imeOptions) == EditorInfo.IME_ACTION_SEARCH)
+            .isTrue()
     }
 
     @Test
     fun test_fill_editor_info_action_send() {
         val info = EditorInfo()
-        info.update(
-            ImeOptions(
-                keyboardType = KeyboardType.Ascii,
-                imeAction = ImeAction.Send
-            )
-        )
+        info.update(ImeOptions(keyboardType = KeyboardType.Ascii, imeAction = ImeAction.Send))
 
         assertThat((InputType.TYPE_CLASS_TEXT and info.inputType) != 0).isTrue()
         assertThat((EditorInfo.IME_FLAG_FORCE_ASCII and info.imeOptions) != 0).isTrue()
-        assertThat(
-            (EditorInfo.IME_MASK_ACTION and info.imeOptions)
-                == EditorInfo.IME_ACTION_SEND
-        ).isTrue()
+        assertThat((EditorInfo.IME_MASK_ACTION and info.imeOptions) == EditorInfo.IME_ACTION_SEND)
+            .isTrue()
     }
 
     @Test
     fun test_fill_editor_info_action_done() {
         val info = EditorInfo()
-        info.update(
-            ImeOptions(
-                keyboardType = KeyboardType.Ascii,
-                imeAction = ImeAction.Done
-            )
-        )
+        info.update(ImeOptions(keyboardType = KeyboardType.Ascii, imeAction = ImeAction.Done))
 
         assertThat((InputType.TYPE_CLASS_TEXT and info.inputType) != 0).isTrue()
         assertThat((EditorInfo.IME_FLAG_FORCE_ASCII and info.imeOptions) != 0).isTrue()
-        assertThat(
-            (EditorInfo.IME_MASK_ACTION and info.imeOptions)
-                == EditorInfo.IME_ACTION_DONE
-        ).isTrue()
+        assertThat((EditorInfo.IME_MASK_ACTION and info.imeOptions) == EditorInfo.IME_ACTION_DONE)
+            .isTrue()
     }
 
     @Test
@@ -540,11 +463,7 @@
     fun test_privateImeOptions_is_set() {
         val info = EditorInfo()
         val privateImeOptions = "testOptions"
-        info.update(
-            ImeOptions(
-                platformImeOptions = PlatformImeOptions(privateImeOptions)
-            )
-        )
+        info.update(ImeOptions(platformImeOptions = PlatformImeOptions(privateImeOptions)))
 
         assertThat(info.privateImeOptions).isEqualTo(privateImeOptions)
     }
diff --git a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/input/internal/LegacyTextInputMethodRequestCursorAnchorInfoTest.kt b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/input/internal/LegacyTextInputMethodRequestCursorAnchorInfoTest.kt
index 1be5916d..694f85a 100644
--- a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/input/internal/LegacyTextInputMethodRequestCursorAnchorInfoTest.kt
+++ b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/input/internal/LegacyTextInputMethodRequestCursorAnchorInfoTest.kt
@@ -91,15 +91,16 @@
     @Before
     fun setup() {
         inputMethodManager = mock { on { isActive() } doReturn true }
-        textInputService = LegacyTextInputMethodRequest(
-            view = View(context),
-            localToScreen = { matrix ->
-                (textLayoutOffset + decorationBoxBounds.topLeft).let {
-                    matrix.translate(it.x, it.y)
-                }
-            },
-            inputMethodManager = inputMethodManager
-        )
+        textInputService =
+            LegacyTextInputMethodRequest(
+                view = View(context),
+                localToScreen = { matrix ->
+                    (textLayoutOffset + decorationBoxBounds.topLeft).let {
+                        matrix.translate(it.x, it.y)
+                    }
+                },
+                inputMethodManager = inputMethodManager
+            )
         textInputService.startInput(
             value = TextFieldValue(""),
             textInputNode = null,
diff --git a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/input/internal/LegacyTextInputMethodRequestEmojiTest.kt b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/input/internal/LegacyTextInputMethodRequestEmojiTest.kt
index f8d8b55..611ad2c 100644
--- a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/input/internal/LegacyTextInputMethodRequestEmojiTest.kt
+++ b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/input/internal/LegacyTextInputMethodRequestEmojiTest.kt
@@ -44,11 +44,12 @@
     fun whenEmojiCompat_addsEditorInfo() = runTest {
         val emojiCompat = mock<EmojiCompat>()
         EmojiCompat.reset(emojiCompat)
-        val textInputService = LegacyTextInputMethodRequest(
-            view = View(getInstrumentation().targetContext),
-            localToScreen = {},
-            inputMethodManager = mock<InputMethodManager>()
-        )
+        val textInputService =
+            LegacyTextInputMethodRequest(
+                view = View(getInstrumentation().targetContext),
+                localToScreen = {},
+                inputMethodManager = mock<InputMethodManager>()
+            )
         textInputService.startInput(TextFieldValue(""), null, ImeOptions.Default, {}, {})
 
         val info = EditorInfo()
diff --git a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/input/internal/LegacyTextInputMethodRequestOnStateUpdateTest.kt b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/input/internal/LegacyTextInputMethodRequestOnStateUpdateTest.kt
index ddbd941a..3da5a31 100644
--- a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/input/internal/LegacyTextInputMethodRequestOnStateUpdateTest.kt
+++ b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/input/internal/LegacyTextInputMethodRequestOnStateUpdateTest.kt
@@ -52,11 +52,12 @@
     @Before
     fun setup() {
         inputMethodManager = mock<InputMethodManager>()
-        textInputService = LegacyTextInputMethodRequest(
-            view = View(getInstrumentation().targetContext),
-            localToScreen = {},
-            inputMethodManager = inputMethodManager
-        )
+        textInputService =
+            LegacyTextInputMethodRequest(
+                view = View(getInstrumentation().targetContext),
+                localToScreen = {},
+                inputMethodManager = inputMethodManager
+            )
         textInputService.startInput(
             value = TextFieldValue(""),
             textInputNode = null,
@@ -75,10 +76,7 @@
     @Test
     fun onUpdateState_resetInputCalled_whenOnlyTextChanged() {
         val newValue = TextFieldValue("b")
-        textInputService.updateState(
-            oldValue = TextFieldValue("a"),
-            newValue = newValue
-        )
+        textInputService.updateState(oldValue = TextFieldValue("a"), newValue = newValue)
 
         verify(inputMethodManager, times(1)).restartInput()
         verify(inputMethodManager, never()).updateSelection(any(), any(), any(), any())
@@ -126,10 +124,7 @@
         // We still need to call IMM.updateSelection in this case, for more info please check:
         // https://developer.android.com/reference/android/view/inputmethod/InputMethodManager#updateSelection(android.view.View,%20int,%20int,%20int,%20int)
         val value = TextFieldValue("a", TextRange(1), null)
-        textInputService.updateState(
-            oldValue = value,
-            newValue = value
-        )
+        textInputService.updateState(oldValue = value, newValue = value)
 
         verify(inputMethodManager, never()).restartInput()
         verify(inputMethodManager, times(1)).updateSelection(any(), any(), any(), any())
@@ -142,10 +137,7 @@
     fun onUpdateState_updateSelectionCalled_whenCompositionIsDifferentFromState() {
         // set the initial state, composition active on text, cursor in the middle
         val value1 = TextFieldValue("ab", TextRange(1), TextRange(0, 2))
-        textInputService.updateState(
-            oldValue = value1,
-            newValue = value1
-        )
+        textInputService.updateState(oldValue = value1, newValue = value1)
 
         reset(inputMethodManager)
 
@@ -153,15 +145,11 @@
         // change and old and new values are the same. However they will be different than the
         // last stored TextFieldValue in TextInputService which is value1
         val value2 = value1.copy(composition = null)
-        textInputService.updateState(
-            oldValue = value2,
-            newValue = value2
-        )
+        textInputService.updateState(oldValue = value2, newValue = value2)
 
         verify(inputMethodManager, never()).restartInput()
-        verify(inputMethodManager, times(1)).updateSelection(
-            eq(value2.selection.min), eq(value2.selection.max), eq(-1), eq(-1)
-        )
+        verify(inputMethodManager, times(1))
+            .updateSelection(eq(value2.selection.min), eq(value2.selection.max), eq(-1), eq(-1))
     }
 
     @Test
@@ -182,10 +170,7 @@
     @Test
     fun onUpdateState_resetInputNotCalled_whenValuesAreSame() {
         val value = TextFieldValue("a")
-        textInputService.updateState(
-            oldValue = value,
-            newValue = value
-        )
+        textInputService.updateState(oldValue = value, newValue = value)
 
         verify(inputMethodManager, never()).restartInput()
         verify(inputMethodManager, never()).updateSelection(any(), any(), any(), any())
@@ -197,10 +182,7 @@
     @Test
     fun onUpdateState_recreateInputConnection_createsWithCorrectValue() {
         val value = TextFieldValue("a")
-        textInputService.updateState(
-            oldValue = value,
-            newValue = value
-        )
+        textInputService.updateState(oldValue = value, newValue = value)
 
         verify(inputMethodManager, never()).restartInput()
         verify(inputMethodManager, never()).updateSelection(any(), any(), any(), any())
diff --git a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/input/internal/RecordingInputConnectionTest.kt b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/input/internal/RecordingInputConnectionTest.kt
index fa6cdd5..13e6238 100644
--- a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/input/internal/RecordingInputConnectionTest.kt
+++ b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/input/internal/RecordingInputConnectionTest.kt
@@ -55,11 +55,12 @@
     @Before
     fun setup() {
         mCallback = mock()
-        ic = RecordingInputConnection(
-            initState = TextFieldValue("", TextRange.Zero),
-            eventCallback = mCallback,
-            autoCorrect = true
-        )
+        ic =
+            RecordingInputConnection(
+                initState = TextFieldValue("", TextRange.Zero),
+                eventCallback = mCallback,
+                autoCorrect = true
+            )
     }
 
     @Test
@@ -68,28 +69,19 @@
         assertThat(ic.getTextAfterCursor(100, 0)).isEqualTo("")
 
         // Set "Hello, World", and place the cursor at the beginning of the text.
-        ic.textFieldValue = TextFieldValue(
-            text = "Hello, World",
-            selection = TextRange.Zero
-        )
+        ic.textFieldValue = TextFieldValue(text = "Hello, World", selection = TextRange.Zero)
 
         assertThat(ic.getTextBeforeCursor(100, 0)).isEqualTo("")
         assertThat(ic.getTextAfterCursor(100, 0)).isEqualTo("Hello, World")
 
         // Set "Hello, World", and place the cursor between "H" and "e".
-        ic.textFieldValue = TextFieldValue(
-            text = "Hello, World",
-            selection = TextRange(1)
-        )
+        ic.textFieldValue = TextFieldValue(text = "Hello, World", selection = TextRange(1))
 
         assertThat(ic.getTextBeforeCursor(100, 0)).isEqualTo("H")
         assertThat(ic.getTextAfterCursor(100, 0)).isEqualTo("ello, World")
 
         // Set "Hello, World", and place the cursor at the end of the text.
-        ic.textFieldValue = TextFieldValue(
-            text = "Hello, World",
-            selection = TextRange(12)
-        )
+        ic.textFieldValue = TextFieldValue(text = "Hello, World", selection = TextRange(12))
 
         assertThat(ic.getTextBeforeCursor(100, 0)).isEqualTo("Hello, World")
         assertThat(ic.getTextAfterCursor(100, 0)).isEqualTo("")
@@ -98,28 +90,19 @@
     @Test
     fun getTextBeforeAndAfterCursorTest_maxCharTest() {
         // Set "Hello, World", and place the cursor at the beginning of the text.
-        ic.textFieldValue = TextFieldValue(
-            text = "Hello, World",
-            selection = TextRange.Zero
-        )
+        ic.textFieldValue = TextFieldValue(text = "Hello, World", selection = TextRange.Zero)
 
         assertThat(ic.getTextBeforeCursor(5, 0)).isEqualTo("")
         assertThat(ic.getTextAfterCursor(5, 0)).isEqualTo("Hello")
 
         // Set "Hello, World", and place the cursor between "H" and "e".
-        ic.textFieldValue = TextFieldValue(
-            text = "Hello, World",
-            selection = TextRange(1)
-        )
+        ic.textFieldValue = TextFieldValue(text = "Hello, World", selection = TextRange(1))
 
         assertThat(ic.getTextBeforeCursor(5, 0)).isEqualTo("H")
         assertThat(ic.getTextAfterCursor(5, 0)).isEqualTo("ello,")
 
         // Set "Hello, World", and place the cursor at the end of the text.
-        ic.textFieldValue = TextFieldValue(
-            text = "Hello, World",
-            selection = TextRange(12)
-        )
+        ic.textFieldValue = TextFieldValue(text = "Hello, World", selection = TextRange(12))
 
         assertThat(ic.getTextBeforeCursor(5, 0)).isEqualTo("World")
         assertThat(ic.getTextAfterCursor(5, 0)).isEqualTo("")
@@ -128,26 +111,17 @@
     @Test
     fun getSelectedTextTest() {
         // Set "Hello, World", and place the cursor at the beginning of the text.
-        ic.textFieldValue = TextFieldValue(
-            text = "Hello, World",
-            selection = TextRange.Zero
-        )
+        ic.textFieldValue = TextFieldValue(text = "Hello, World", selection = TextRange.Zero)
 
         assertThat(ic.getSelectedText(0)).isNull()
 
         // Set "Hello, World", and place the cursor between "H" and "e".
-        ic.textFieldValue = TextFieldValue(
-            text = "Hello, World",
-            selection = TextRange(0, 1)
-        )
+        ic.textFieldValue = TextFieldValue(text = "Hello, World", selection = TextRange(0, 1))
 
         assertThat(ic.getSelectedText(0)).isEqualTo("H")
 
         // Set "Hello, World", and place the cursor at the end of the text.
-        ic.textFieldValue = TextFieldValue(
-            text = "Hello, World",
-            selection = TextRange(0, 12)
-        )
+        ic.textFieldValue = TextFieldValue(text = "Hello, World", selection = TextRange(0, 12))
 
         assertThat(ic.getSelectedText(0)).isEqualTo("Hello, World")
     }
@@ -601,11 +575,12 @@
 
     @Test
     fun commitCorrection_returns_true_when_autoCorrect_is_on() {
-        val inputConnection = RecordingInputConnection(
-            initState = TextFieldValue(),
-            eventCallback = mCallback,
-            autoCorrect = true
-        )
+        val inputConnection =
+            RecordingInputConnection(
+                initState = TextFieldValue(),
+                eventCallback = mCallback,
+                autoCorrect = true
+            )
         val anyCorrectionInfo = CorrectionInfo(0, "", "")
 
         assertThat(inputConnection.commitCorrection(anyCorrectionInfo)).isTrue()
@@ -613,11 +588,12 @@
 
     @Test
     fun commitCorrection_returns_false_when_autoCorrect_is_off() {
-        val inputConnection = RecordingInputConnection(
-            initState = TextFieldValue(),
-            eventCallback = mCallback,
-            autoCorrect = false
-        )
+        val inputConnection =
+            RecordingInputConnection(
+                initState = TextFieldValue(),
+                eventCallback = mCallback,
+                autoCorrect = false
+            )
         val anyCorrectionInfo = CorrectionInfo(0, "", "")
 
         assertThat(inputConnection.commitCorrection(anyCorrectionInfo)).isFalse()
diff --git a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/input/internal/StatelessInputConnectionTest.kt b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/input/internal/StatelessInputConnectionTest.kt
index 64ca899..0a36e88 100644
--- a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/input/internal/StatelessInputConnectionTest.kt
+++ b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/input/internal/StatelessInputConnectionTest.kt
@@ -54,45 +54,45 @@
 @RunWith(AndroidJUnit4::class)
 class StatelessInputConnectionTest {
 
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
     private lateinit var ic: StatelessInputConnection
-    private val activeSession: TextInputSession = object : TextInputSession {
-        override val text: TextFieldCharSequence
-            get() = this@StatelessInputConnectionTest.value
+    private val activeSession: TextInputSession =
+        object : TextInputSession {
+            override val text: TextFieldCharSequence
+                get() = this@StatelessInputConnectionTest.value
 
-        override fun onImeAction(imeAction: ImeAction) {
-            this@StatelessInputConnectionTest.onImeAction?.invoke(imeAction)
-        }
+            override fun onImeAction(imeAction: ImeAction) {
+                this@StatelessInputConnectionTest.onImeAction?.invoke(imeAction)
+            }
 
-        override fun requestEdit(block: EditingBuffer.() -> Unit) {
-            onRequestEdit?.invoke(block)
-        }
+            override fun requestEdit(block: EditingBuffer.() -> Unit) {
+                onRequestEdit?.invoke(block)
+            }
 
-        override fun sendKeyEvent(keyEvent: KeyEvent) {
-            onSendKeyEvent?.invoke(keyEvent)
-        }
+            override fun sendKeyEvent(keyEvent: KeyEvent) {
+                onSendKeyEvent?.invoke(keyEvent)
+            }
 
-        override fun requestCursorUpdates(cursorUpdateMode: Int) {
-        }
+            override fun requestCursorUpdates(cursorUpdateMode: Int) {}
 
-        override fun onCommitContent(transferableContent: TransferableContent): Boolean {
-            return this@StatelessInputConnectionTest.onCommitContent?.invoke(transferableContent)
-                ?: false
-        }
+            override fun onCommitContent(transferableContent: TransferableContent): Boolean {
+                return this@StatelessInputConnectionTest.onCommitContent?.invoke(
+                    transferableContent
+                ) ?: false
+            }
 
-        override fun performHandwritingGesture(gesture: HandwritingGesture): Int {
-            return InputConnection.HANDWRITING_GESTURE_RESULT_UNSUPPORTED
-        }
+            override fun performHandwritingGesture(gesture: HandwritingGesture): Int {
+                return InputConnection.HANDWRITING_GESTURE_RESULT_UNSUPPORTED
+            }
 
-        override fun previewHandwritingGesture(
-            gesture: PreviewableHandwritingGesture,
-            cancellationSignal: CancellationSignal?
-        ): Boolean {
-            return false
+            override fun previewHandwritingGesture(
+                gesture: PreviewableHandwritingGesture,
+                cancellationSignal: CancellationSignal?
+            ): Boolean {
+                return false
+            }
         }
-    }
 
     private var state: TextFieldState = TextFieldState()
     private var value: TextFieldCharSequence = TextFieldCharSequence()
@@ -100,6 +100,7 @@
             field = value
             state = TextFieldState(value.toString(), value.selection)
         }
+
     private var onRequestEdit: ((EditingBuffer.() -> Unit) -> Unit)? = null
     private var onSendKeyEvent: ((KeyEvent) -> Unit)? = null
     private var onImeAction: ((ImeAction) -> Unit)? = null
@@ -116,28 +117,19 @@
         Truth.assertThat(ic.getTextAfterCursor(100, 0)).isEqualTo("")
 
         // Set "Hello, World", and place the cursor at the beginning of the text.
-        value = TextFieldCharSequence(
-            text = "Hello, World",
-            selection = TextRange.Zero
-        )
+        value = TextFieldCharSequence(text = "Hello, World", selection = TextRange.Zero)
 
         Truth.assertThat(ic.getTextBeforeCursor(100, 0)).isEqualTo("")
         Truth.assertThat(ic.getTextAfterCursor(100, 0)).isEqualTo("Hello, World")
 
         // Set "Hello, World", and place the cursor between "H" and "e".
-        value = TextFieldCharSequence(
-            text = "Hello, World",
-            selection = TextRange(1)
-        )
+        value = TextFieldCharSequence(text = "Hello, World", selection = TextRange(1))
 
         Truth.assertThat(ic.getTextBeforeCursor(100, 0)).isEqualTo("H")
         Truth.assertThat(ic.getTextAfterCursor(100, 0)).isEqualTo("ello, World")
 
         // Set "Hello, World", and place the cursor at the end of the text.
-        value = TextFieldCharSequence(
-            text = "Hello, World",
-            selection = TextRange(12)
-        )
+        value = TextFieldCharSequence(text = "Hello, World", selection = TextRange(12))
 
         Truth.assertThat(ic.getTextBeforeCursor(100, 0)).isEqualTo("Hello, World")
         Truth.assertThat(ic.getTextAfterCursor(100, 0)).isEqualTo("")
@@ -146,28 +138,19 @@
     @Test
     fun getTextBeforeAndAfterCursorTest_maxCharTest() {
         // Set "Hello, World", and place the cursor at the beginning of the text.
-        value = TextFieldCharSequence(
-            text = "Hello, World",
-            selection = TextRange.Zero
-        )
+        value = TextFieldCharSequence(text = "Hello, World", selection = TextRange.Zero)
 
         Truth.assertThat(ic.getTextBeforeCursor(5, 0)).isEqualTo("")
         Truth.assertThat(ic.getTextAfterCursor(5, 0)).isEqualTo("Hello")
 
         // Set "Hello, World", and place the cursor between "H" and "e".
-        value = TextFieldCharSequence(
-            text = "Hello, World",
-            selection = TextRange(1)
-        )
+        value = TextFieldCharSequence(text = "Hello, World", selection = TextRange(1))
 
         Truth.assertThat(ic.getTextBeforeCursor(5, 0)).isEqualTo("H")
         Truth.assertThat(ic.getTextAfterCursor(5, 0)).isEqualTo("ello,")
 
         // Set "Hello, World", and place the cursor at the end of the text.
-        value = TextFieldCharSequence(
-            text = "Hello, World",
-            selection = TextRange(12)
-        )
+        value = TextFieldCharSequence(text = "Hello, World", selection = TextRange(12))
 
         Truth.assertThat(ic.getTextBeforeCursor(5, 0)).isEqualTo("World")
         Truth.assertThat(ic.getTextAfterCursor(5, 0)).isEqualTo("")
@@ -176,26 +159,17 @@
     @Test
     fun getSelectedTextTest() {
         // Set "Hello, World", and place the cursor at the beginning of the text.
-        value = TextFieldCharSequence(
-            text = "Hello, World",
-            selection = TextRange.Zero
-        )
+        value = TextFieldCharSequence(text = "Hello, World", selection = TextRange.Zero)
 
         Truth.assertThat(ic.getSelectedText(0)).isNull()
 
         // Set "Hello, World", and place the cursor between "H" and "e".
-        value = TextFieldCharSequence(
-            text = "Hello, World",
-            selection = TextRange(0, 1)
-        )
+        value = TextFieldCharSequence(text = "Hello, World", selection = TextRange(0, 1))
 
         Truth.assertThat(ic.getSelectedText(0)).isEqualTo("H")
 
         // Set "Hello, World", and place the cursor at the end of the text.
-        value = TextFieldCharSequence(
-            text = "Hello, World",
-            selection = TextRange(0, 12)
-        )
+        value = TextFieldCharSequence(text = "Hello, World", selection = TextRange(0, 12))
 
         Truth.assertThat(ic.getSelectedText(0)).isEqualTo("Hello, World")
     }
@@ -239,11 +213,12 @@
         val linkUri = Uri.parse("https://example.com")
         val description = ClipDescription("label", arrayOf("text/plain"))
         val extras = Bundle().apply { putString("key", "value") }
-        val result = ic.commitContent(
-            InputContentInfo(contentUri, description, linkUri),
-            InputConnectionCompat.INPUT_CONTENT_GRANT_READ_URI_PERMISSION,
-            extras
-        )
+        val result =
+            ic.commitContent(
+                InputContentInfo(contentUri, description, linkUri),
+                InputConnectionCompat.INPUT_CONTENT_GRANT_READ_URI_PERMISSION,
+                extras
+            )
 
         Truth.assertThat(transferableContent).isNotNull()
         Truth.assertThat(transferableContent?.clipEntry).isNotNull()
@@ -266,9 +241,7 @@
     @SdkSuppress(minSdkVersion = 25)
     @Test
     fun commitContent_returnsResultIfFalse() {
-        onCommitContent = {
-            false
-        }
+        onCommitContent = { false }
         val contentUri = Uri.parse("content://com.example/content")
         val description = ClipDescription("label", arrayOf("text/plain"))
         val result = ic.commitContent(InputContentInfo(contentUri, description), 0, null)
@@ -307,13 +280,14 @@
         val description = ClipDescription("label", arrayOf("text/plain"))
         val extras = Bundle().apply { putString("key", "value") }
         // this will internally call performPrivateCommand when SDK <= 24
-        val result = InputConnectionCompat.commitContent(
-            ic,
-            editorInfo,
-            InputContentInfoCompat(contentUri, description, linkUri),
-            InputConnectionCompat.INPUT_CONTENT_GRANT_READ_URI_PERMISSION,
-            extras
-        )
+        val result =
+            InputConnectionCompat.commitContent(
+                ic,
+                editorInfo,
+                InputContentInfoCompat(contentUri, description, linkUri),
+                InputConnectionCompat.INPUT_CONTENT_GRANT_READ_URI_PERMISSION,
+                extras
+            )
 
         Truth.assertThat(transferableContent).isNotNull()
         Truth.assertThat(transferableContent?.clipEntry).isNotNull()
@@ -388,9 +362,7 @@
     @Test
     fun sendKeyEvent_whenIMERequests() {
         val keyEvents = mutableListOf<KeyEvent>()
-        onSendKeyEvent = {
-            keyEvents += it
-        }
+        onSendKeyEvent = { keyEvents += it }
         val keyEvent1 = KeyEvent(KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_0)
         val keyEvent2 = KeyEvent(KeyEvent.ACTION_UP, KeyEvent.KEYCODE_0)
         ic.sendKeyEvent(keyEvent1)
@@ -404,9 +376,7 @@
     @Test
     fun performImeAction_whenIMERequests() {
         val receivedImeActions = mutableListOf<ImeAction>()
-        onImeAction = {
-            receivedImeActions += it
-        }
+        onImeAction = { receivedImeActions += it }
         ic.performEditorAction(EditorInfo.IME_ACTION_DONE)
         ic.performEditorAction(EditorInfo.IME_ACTION_GO)
         ic.performEditorAction(EditorInfo.IME_ACTION_NEXT)
@@ -417,17 +387,20 @@
         ic.performEditorAction(EditorInfo.IME_ACTION_UNSPECIFIED)
         ic.performEditorAction(-1)
 
-        Truth.assertThat(receivedImeActions).isEqualTo(listOf(
-            ImeAction.Done,
-            ImeAction.Go,
-            ImeAction.Next,
-            ImeAction.Default, // None is evaluated back to Default.
-            ImeAction.Previous,
-            ImeAction.Search,
-            ImeAction.Send,
-            ImeAction.Default, // Unspecified is evaluated back to Default.
-            ImeAction.Default // Unrecognized is evaluated back to Default.
-        ))
+        Truth.assertThat(receivedImeActions)
+            .isEqualTo(
+                listOf(
+                    ImeAction.Done,
+                    ImeAction.Go,
+                    ImeAction.Next,
+                    ImeAction.Default, // None is evaluated back to Default.
+                    ImeAction.Previous,
+                    ImeAction.Search,
+                    ImeAction.Send,
+                    ImeAction.Default, // Unspecified is evaluated back to Default.
+                    ImeAction.Default // Unrecognized is evaluated back to Default.
+                )
+            )
     }
 
     @Test
diff --git a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/input/internal/TextFieldLayoutStateCacheTest.kt b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/input/internal/TextFieldLayoutStateCacheTest.kt
index c39ef51..d0c705d 100644
--- a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/input/internal/TextFieldLayoutStateCacheTest.kt
+++ b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/input/internal/TextFieldLayoutStateCacheTest.kt
@@ -57,15 +57,15 @@
 @MediumTest
 class TextFieldLayoutStateCacheTest {
 
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
     private var textFieldState = TextFieldState()
-    private var transformedTextFieldState = TransformedTextFieldState(
-        textFieldState,
-        inputTransformation = null,
-        codepointTransformation = null
-    )
+    private var transformedTextFieldState =
+        TransformedTextFieldState(
+            textFieldState,
+            inputTransformation = null,
+            codepointTransformation = null
+        )
     private var textStyle = TextStyle()
     private var singleLine = false
     private var softWrap = false
@@ -80,9 +80,8 @@
 
     @Before
     fun setUp() {
-        globalWriteObserverHandle = Snapshot.registerGlobalWriteObserver {
-            Snapshot.sendApplyNotifications()
-        }
+        globalWriteObserverHandle =
+            Snapshot.registerGlobalWriteObserver { Snapshot.sendApplyNotifications() }
     }
 
     @After
@@ -118,22 +117,19 @@
             append("hello")
             placeCursorBeforeCharAt(0)
         }
-        assertInvalidationsOnChange(1) {
-            textFieldState.edit {
-                placeCursorBeforeCharAt(1)
-            }
-        }
+        assertInvalidationsOnChange(1) { textFieldState.edit { placeCursorBeforeCharAt(1) } }
     }
 
     @Test
     fun updateNonMeasureInputs_invalidatesSnapshot_whenCodepointTransformationChanged() {
         assertInvalidationsOnChange(1) {
             val codepointTransformation = CodepointTransformation { _, codepoint -> codepoint }
-            transformedTextFieldState = TransformedTextFieldState(
-                textFieldState,
-                inputTransformation = null,
-                codepointTransformation
-            )
+            transformedTextFieldState =
+                TransformedTextFieldState(
+                    textFieldState,
+                    inputTransformation = null,
+                    codepointTransformation
+                )
             updateNonMeasureInputs()
         }
     }
@@ -221,11 +217,13 @@
     @Test
     fun updateMeasureInputs_invalidatesSnapshot_whenDensityValueChangedWithSameInstance() {
         var densityValue = 1f
-        density = object : Density {
-            override val density: Float
-                get() = densityValue
-            override val fontScale: Float = 1f
-        }
+        density =
+            object : Density {
+                override val density: Float
+                    get() = densityValue
+
+                override val fontScale: Float = 1f
+            }
         assertInvalidationsOnChange(1) {
             densityValue = 2f
             updateMeasureInputs()
@@ -235,11 +233,12 @@
     @Test
     fun updateMeasureInputs_invalidatesSnapshot_whenFontScaleChangedWithSameInstance() {
         var fontScale = 1f
-        density = object : Density {
-            override val density: Float = 1f
-            override val fontScale: Float
-                get() = fontScale
-        }
+        density =
+            object : Density {
+                override val density: Float = 1f
+                override val fontScale: Float
+                    get() = fontScale
+            }
         assertInvalidationsOnChange(1) {
             fontScale = 2f
             updateMeasureInputs()
@@ -269,9 +268,7 @@
     fun updateMeasureInputs_invalidatesSnapshot_whenFontFamilyResolverFontChanged() {
         fontFamilyResolver =
             createFontFamilyResolver(InstrumentationRegistry.getInstrumentation().context)
-        assertInvalidationsOnChange(1) {
-            TODO("b/294443266: make fonts stale")
-        }
+        assertInvalidationsOnChange(1) { TODO("b/294443266: make fonts stale") }
     }
 
     @Test
@@ -308,14 +305,15 @@
         var transformationInvocations = 0
         val codepointTransformation = CodepointTransformation { _, codepoint ->
             transformationInvocations++
-            @Suppress("UNUSED_EXPRESSION")
-            transformationState
+            @Suppress("UNUSED_EXPRESSION") transformationState
             codepoint + 1
         }
-        transformedTextFieldState = TransformedTextFieldState(
-            textFieldState, inputTransformation = null,
-            codepointTransformation
-        )
+        transformedTextFieldState =
+            TransformedTextFieldState(
+                textFieldState,
+                inputTransformation = null,
+                codepointTransformation
+            )
         // Transformation isn't applied if there's no text. Keep this at 1 char to make the math
         // simpler.
         textFieldState.setTextAndPlaceCursorAtEnd("h")
@@ -337,17 +335,27 @@
             secondaryObserver.start()
 
             // This will compute the initial layout.
-            primaryObserver.observeReads(Unit, onValueChangedForScope = {
-                primaryInvalidations++
+            primaryObserver.observeReads(
+                Unit,
+                onValueChangedForScope = {
+                    primaryInvalidations++
+                    assertVisualText()
+                }
+            ) {
                 assertVisualText()
-            }) { assertVisualText() }
+            }
             Truth.assertThat(transformationInvocations).isEqualTo(1)
 
             // This should be a full cache hit.
-            secondaryObserver.observeReads(Unit, onValueChangedForScope = {
-                secondaryInvalidations++
+            secondaryObserver.observeReads(
+                Unit,
+                onValueChangedForScope = {
+                    secondaryInvalidations++
+                    assertVisualText()
+                }
+            ) {
                 assertVisualText()
-            }) { assertVisualText() }
+            }
             Truth.assertThat(transformationInvocations).isEqualTo(1)
 
             // Invalidate the transformation.
@@ -372,11 +380,12 @@
             transformationInvocations++
             codepoint + transformationState
         }
-        transformedTextFieldState = TransformedTextFieldState(
-            textFieldState,
-            inputTransformation = null,
-            codepointTransformation
-        )
+        transformedTextFieldState =
+            TransformedTextFieldState(
+                textFieldState,
+                inputTransformation = null,
+                codepointTransformation
+            )
         // Transformation isn't applied if there's no text. Keep this at 1 char to make the math
         // simpler.
         textFieldState.setTextAndPlaceCursorAtEnd("h")
@@ -398,17 +407,27 @@
             secondaryObserver.start()
 
             // This will compute the initial layout.
-            primaryObserver.observeReads(Unit, onValueChangedForScope = {
-                primaryInvalidations++
+            primaryObserver.observeReads(
+                Unit,
+                onValueChangedForScope = {
+                    primaryInvalidations++
+                    assertVisualText()
+                }
+            ) {
                 assertVisualText()
-            }) { assertVisualText() }
+            }
             Truth.assertThat(transformationInvocations).isEqualTo(1)
 
             // This should be a full cache hit.
-            secondaryObserver.observeReads(Unit, onValueChangedForScope = {
-                secondaryInvalidations++
+            secondaryObserver.observeReads(
+                Unit,
+                onValueChangedForScope = {
+                    secondaryInvalidations++
+                    assertVisualText()
+                }
+            ) {
                 assertVisualText()
-            }) { assertVisualText() }
+            }
             Truth.assertThat(transformationInvocations).isEqualTo(1)
 
             // Invalidate the transformation.
@@ -453,21 +472,21 @@
         }
         assertLayoutChange(
             change = {
-                textFieldState.editAsUser(inputTransformation = null) {
-                    setComposingRegion(2, 3)
-                }
+                textFieldState.editAsUser(inputTransformation = null) { setComposingRegion(2, 3) }
             },
         ) { old, new ->
             Truth.assertThat(
-                old.multiParagraph.intrinsics.annotatedString.spanStyles.any {
-                    it.item.textDecoration == TextDecoration.Underline
-                }
-            ).isFalse()
+                    old.multiParagraph.intrinsics.annotatedString.spanStyles.any {
+                        it.item.textDecoration == TextDecoration.Underline
+                    }
+                )
+                .isFalse()
             Truth.assertThat(
-                new.multiParagraph.intrinsics.annotatedString.spanStyles.any {
-                    it.item.textDecoration == TextDecoration.Underline
-                }
-            ).isTrue()
+                    new.multiParagraph.intrinsics.annotatedString.spanStyles.any {
+                        it.item.textDecoration == TextDecoration.Underline
+                    }
+                )
+                .isTrue()
         }
     }
 
@@ -477,13 +496,9 @@
             replace(0, length, "hello")
             placeCursorBeforeCharAt(0)
         }
-        assertLayoutChange(
-            change = {
-                textFieldState.edit {
-                    placeCursorBeforeCharAt(1)
-                }
-            }
-        ) { old, new ->
+        assertLayoutChange(change = { textFieldState.edit { placeCursorBeforeCharAt(1) } }) {
+            old,
+            new ->
             Truth.assertThat(new).isSameInstanceAs(old)
         }
     }
@@ -492,19 +507,21 @@
     fun value_returnsNewLayout_whenCodepointTransformationInstanceChangedWithDifferentOutput() {
         textFieldState.setTextAndPlaceCursorAtEnd("h")
         var codepointTransformation = CodepointTransformation { _, codepoint -> codepoint }
-        transformedTextFieldState = TransformedTextFieldState(
-            textFieldState,
-            inputTransformation = null,
-            codepointTransformation
-        )
+        transformedTextFieldState =
+            TransformedTextFieldState(
+                textFieldState,
+                inputTransformation = null,
+                codepointTransformation
+            )
         assertLayoutChange(
             change = {
                 codepointTransformation = CodepointTransformation { _, codepoint -> codepoint + 1 }
-                transformedTextFieldState = TransformedTextFieldState(
-                    textFieldState,
-                    inputTransformation = null,
-                    codepointTransformation
-                )
+                transformedTextFieldState =
+                    TransformedTextFieldState(
+                        textFieldState,
+                        inputTransformation = null,
+                        codepointTransformation
+                    )
                 updateNonMeasureInputs()
             }
         ) { old, new ->
@@ -517,19 +534,21 @@
     fun value_returnsCachedLayout_whenCodepointTransformationInstanceChangedWithSameOutput() {
         textFieldState.setTextAndPlaceCursorAtEnd("h")
         var codepointTransformation = CodepointTransformation { _, codepoint -> codepoint }
-        transformedTextFieldState = TransformedTextFieldState(
-            textFieldState,
-            inputTransformation = null,
-            codepointTransformation
-        )
+        transformedTextFieldState =
+            TransformedTextFieldState(
+                textFieldState,
+                inputTransformation = null,
+                codepointTransformation
+            )
         assertLayoutChange(
             change = {
                 codepointTransformation = CodepointTransformation { _, codepoint -> codepoint }
-                transformedTextFieldState = TransformedTextFieldState(
-                    textFieldState,
-                    inputTransformation = null,
-                    codepointTransformation
-                )
+                transformedTextFieldState =
+                    TransformedTextFieldState(
+                        textFieldState,
+                        inputTransformation = null,
+                        codepointTransformation
+                    )
                 updateNonMeasureInputs()
             }
         ) { old, new ->
@@ -596,11 +615,13 @@
     @Test
     fun value_returnsNewLayout_whenDensityValueChangedWithSameInstance() {
         var densityValue = 1f
-        density = object : Density {
-            override val density: Float
-                get() = densityValue
-            override val fontScale: Float = 1f
-        }
+        density =
+            object : Density {
+                override val density: Float
+                    get() = densityValue
+
+                override val fontScale: Float = 1f
+            }
         assertLayoutChange(
             change = {
                 densityValue = 2f
@@ -614,11 +635,12 @@
     @Test
     fun value_returnsNewLayout_whenFontScaleChangedWithSameInstance() {
         var fontScale = 1f
-        density = object : Density {
-            override val density: Float = 1f
-            override val fontScale: Float
-                get() = fontScale
-        }
+        density =
+            object : Density {
+                override val density: Float = 1f
+                override val fontScale: Float
+                    get() = fontScale
+            }
         assertLayoutChange(
             change = {
                 fontScale = 2f
@@ -674,11 +696,7 @@
     fun value_returnsNewLayout_whenFontFamilyResolverFontChanged() {
         fontFamilyResolver =
             createFontFamilyResolver(InstrumentationRegistry.getInstrumentation().context)
-        assertLayoutChange(
-            change = {
-                TODO("b/294443266: make fonts stale")
-            }
-        ) { old, new ->
+        assertLayoutChange(change = { TODO("b/294443266: make fonts stale") }) { old, new ->
             Truth.assertThat(new).isNotSameInstanceAs(old)
         }
     }
@@ -852,7 +870,8 @@
         }
 
         Truth.assertWithMessage("Expected $expectedInvalidations invalidations")
-            .that(invalidations).isEqualTo(expectedInvalidations)
+            .that(invalidations)
+            .isEqualTo(expectedInvalidations)
     }
 
     private fun updateNonMeasureInputs() {
diff --git a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/input/internal/TextInputServiceAndroidCursorAnchorInfoTest.kt b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/input/internal/TextInputServiceAndroidCursorAnchorInfoTest.kt
index b84cf4f..190aa44 100644
--- a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/input/internal/TextInputServiceAndroidCursorAnchorInfoTest.kt
+++ b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/input/internal/TextInputServiceAndroidCursorAnchorInfoTest.kt
@@ -60,13 +60,10 @@
 @RunWith(AndroidJUnit4::class)
 internal class TextInputServiceAndroidCursorAnchorInfoTest {
 
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
     @get:Rule
-    val composeImmRule = ComposeInputMethodManagerTestRule().apply {
-        setFactory { composeImm }
-    }
+    val composeImmRule = ComposeInputMethodManagerTestRule().apply { setFactory { composeImm } }
 
     private val context = InstrumentationRegistry.getInstrumentation().context
     private val defaultDensity = Density(density = 1f)
@@ -74,60 +71,71 @@
     private val androidMatrix = android.graphics.Matrix()
     private val reportedCursorAnchorInfos = mutableListOf<CursorAnchorInfo>()
 
-    private val composeImm = object : ComposeInputMethodManager {
-        override fun updateCursorAnchorInfo(info: CursorAnchorInfo) {
-            reportedCursorAnchorInfos += info
-        }
+    private val composeImm =
+        object : ComposeInputMethodManager {
+            override fun updateCursorAnchorInfo(info: CursorAnchorInfo) {
+                reportedCursorAnchorInfos += info
+            }
 
-        override fun restartInput() {}
-        override fun showSoftInput() {}
-        override fun hideSoftInput() {}
-        override fun updateExtractedText(token: Int, extractedText: ExtractedText) {}
-        override fun updateSelection(
-            selectionStart: Int,
-            selectionEnd: Int,
-            compositionStart: Int,
-            compositionEnd: Int
-        ) {
-        }
+            override fun restartInput() {}
 
-        override fun sendKeyEvent(event: KeyEvent) {}
-        override fun startStylusHandwriting() {}
-        override fun prepareStylusHandwritingDelegation() {}
-        override fun acceptStylusHandwritingDelegation() {}
-    }
+            override fun showSoftInput() {}
+
+            override fun hideSoftInput() {}
+
+            override fun updateExtractedText(token: Int, extractedText: ExtractedText) {}
+
+            override fun updateSelection(
+                selectionStart: Int,
+                selectionEnd: Int,
+                compositionStart: Int,
+                compositionEnd: Int
+            ) {}
+
+            override fun sendKeyEvent(event: KeyEvent) {}
+
+            override fun startStylusHandwriting() {}
+
+            override fun prepareStylusHandwritingDelegation() {}
+
+            override fun acceptStylusHandwritingDelegation() {}
+        }
 
     private lateinit var inputConnection: InputConnection
-    private val session = object : PlatformTextInputSession {
-        override val view = View(InstrumentationRegistry.getInstrumentation().context)
-        override suspend fun startInputMethod(
-            request: PlatformTextInputMethodRequest
-        ): Nothing {
-            inputConnection = request.createInputConnection(EditorInfo())
-            awaitCancellation()
+    private val session =
+        object : PlatformTextInputSession {
+            override val view = View(InstrumentationRegistry.getInstrumentation().context)
+
+            override suspend fun startInputMethod(
+                request: PlatformTextInputMethodRequest
+            ): Nothing {
+                inputConnection = request.createInputConnection(EditorInfo())
+                awaitCancellation()
+            }
         }
-    }
 
     private val layoutOffset = Offset(98f, 47f)
     private val coreNodeOffset = Offset(73f, 50f)
     private val coreNodeSize = IntSize(25, 51)
     private val decoratorNodeOffset = Offset(84f, 59f)
     private val decoratorNodeSize = IntSize(19, 66)
-    private val layoutState = TextLayoutState().apply {
-        textLayoutNodeCoordinates =
-            TestLayoutCoordinates(windowOffset = layoutOffset, isAttached = true)
-        coreNodeCoordinates = TestLayoutCoordinates(
-            windowOffset = coreNodeOffset,
-            size = coreNodeSize,
-            isAttached = true
-        )
-        decoratorNodeCoordinates =
-            TestLayoutCoordinates(
-                windowOffset = decoratorNodeOffset,
-                size = decoratorNodeSize,
-                isAttached = true
-            )
-    }
+    private val layoutState =
+        TextLayoutState().apply {
+            textLayoutNodeCoordinates =
+                TestLayoutCoordinates(windowOffset = layoutOffset, isAttached = true)
+            coreNodeCoordinates =
+                TestLayoutCoordinates(
+                    windowOffset = coreNodeOffset,
+                    size = coreNodeSize,
+                    isAttached = true
+                )
+            decoratorNodeCoordinates =
+                TestLayoutCoordinates(
+                    windowOffset = decoratorNodeOffset,
+                    size = decoratorNodeSize,
+                    isAttached = true
+                )
+        }
 
     @Test
     fun requestCursorUpdates_immediate() = runTest {
@@ -138,18 +146,17 @@
         inputConnection.requestCursorUpdates(InputConnection.CURSOR_UPDATE_IMMEDIATE)
 
         // Immediate update.
-        val expectedInfo = builder.build(
-            text = textFieldState.text,
-            selection = textFieldState.selection,
-            composition = textFieldState.composition,
-            textLayoutResult = layoutState.layoutResult!!,
-            matrix = getAndroidMatrix(layoutOffset),
-            innerTextFieldBounds = Rect(coreNodeOffset - layoutOffset, coreNodeSize.toSize()),
-            decorationBoxBounds = Rect(
-                decoratorNodeOffset - layoutOffset,
-                decoratorNodeSize.toSize()
-            ),
-        )
+        val expectedInfo =
+            builder.build(
+                text = textFieldState.text,
+                selection = textFieldState.selection,
+                composition = textFieldState.composition,
+                textLayoutResult = layoutState.layoutResult!!,
+                matrix = getAndroidMatrix(layoutOffset),
+                innerTextFieldBounds = Rect(coreNodeOffset - layoutOffset, coreNodeSize.toSize()),
+                decorationBoxBounds =
+                    Rect(decoratorNodeOffset - layoutOffset, decoratorNodeSize.toSize()),
+            )
         Truth.assertThat(reportedCursorAnchorInfos).containsExactly(expectedInfo)
         reportedCursorAnchorInfos.clear()
 
@@ -164,11 +171,12 @@
     @Test
     fun requestCursorUpdates_immediate_beforeUpdateTextLayoutResult() = runTest {
         val textFieldState = TextFieldState("abc", initialSelection = TextRange(2))
-        val transformedState = TransformedTextFieldState(
-            textFieldState = textFieldState,
-            inputTransformation = null,
-            codepointTransformation = null
-        )
+        val transformedState =
+            TransformedTextFieldState(
+                textFieldState = textFieldState,
+                inputTransformation = null,
+                codepointTransformation = null
+            )
 
         backgroundScope.launch(Dispatchers.Unconfined) {
             session.platformSpecificTextInputSession(
@@ -203,18 +211,18 @@
             TestLayoutCoordinates(windowOffset = newLayoutOffset, isAttached = true)
 
         // Monitoring update.
-        val expectedInfo = builder.build(
-            text = textFieldState.text,
-            selection = textFieldState.selection,
-            composition = textFieldState.composition,
-            textLayoutResult = layoutState.layoutResult!!,
-            matrix = getAndroidMatrix(newLayoutOffset),
-            innerTextFieldBounds = Rect(coreNodeOffset - newLayoutOffset, coreNodeSize.toSize()),
-            decorationBoxBounds = Rect(
-                decoratorNodeOffset - newLayoutOffset,
-                decoratorNodeSize.toSize()
-            ),
-        )
+        val expectedInfo =
+            builder.build(
+                text = textFieldState.text,
+                selection = textFieldState.selection,
+                composition = textFieldState.composition,
+                textLayoutResult = layoutState.layoutResult!!,
+                matrix = getAndroidMatrix(newLayoutOffset),
+                innerTextFieldBounds =
+                    Rect(coreNodeOffset - newLayoutOffset, coreNodeSize.toSize()),
+                decorationBoxBounds =
+                    Rect(decoratorNodeOffset - newLayoutOffset, decoratorNodeSize.toSize()),
+            )
         Truth.assertThat(reportedCursorAnchorInfos).containsExactly(expectedInfo)
     }
 
@@ -228,18 +236,17 @@
         )
 
         // Immediate update.
-        val expectedInfo = builder.build(
-            text = textFieldState.text,
-            selection = textFieldState.selection,
-            composition = textFieldState.composition,
-            textLayoutResult = layoutState.layoutResult!!,
-            matrix = getAndroidMatrix(layoutOffset),
-            innerTextFieldBounds = Rect(coreNodeOffset - layoutOffset, coreNodeSize.toSize()),
-            decorationBoxBounds = Rect(
-                decoratorNodeOffset - layoutOffset,
-                decoratorNodeSize.toSize()
-            ),
-        )
+        val expectedInfo =
+            builder.build(
+                text = textFieldState.text,
+                selection = textFieldState.selection,
+                composition = textFieldState.composition,
+                textLayoutResult = layoutState.layoutResult!!,
+                matrix = getAndroidMatrix(layoutOffset),
+                innerTextFieldBounds = Rect(coreNodeOffset - layoutOffset, coreNodeSize.toSize()),
+                decorationBoxBounds =
+                    Rect(decoratorNodeOffset - layoutOffset, decoratorNodeSize.toSize()),
+            )
         Truth.assertThat(reportedCursorAnchorInfos).containsExactly(expectedInfo)
         reportedCursorAnchorInfos.clear()
 
@@ -249,18 +256,18 @@
             TestLayoutCoordinates(windowOffset = newLayoutOffset, isAttached = true)
 
         // Monitoring update.
-        val expectedInfo2 = builder.build(
-            text = textFieldState.text,
-            selection = textFieldState.selection,
-            composition = textFieldState.composition,
-            textLayoutResult = layoutState.layoutResult!!,
-            matrix = getAndroidMatrix(newLayoutOffset),
-            innerTextFieldBounds = Rect(coreNodeOffset - newLayoutOffset, coreNodeSize.toSize()),
-            decorationBoxBounds = Rect(
-                decoratorNodeOffset - newLayoutOffset,
-                decoratorNodeSize.toSize()
-            ),
-        )
+        val expectedInfo2 =
+            builder.build(
+                text = textFieldState.text,
+                selection = textFieldState.selection,
+                composition = textFieldState.composition,
+                textLayoutResult = layoutState.layoutResult!!,
+                matrix = getAndroidMatrix(newLayoutOffset),
+                innerTextFieldBounds =
+                    Rect(coreNodeOffset - newLayoutOffset, coreNodeSize.toSize()),
+                decorationBoxBounds =
+                    Rect(decoratorNodeOffset - newLayoutOffset, decoratorNodeSize.toSize()),
+            )
         Truth.assertThat(reportedCursorAnchorInfos).containsExactly(expectedInfo2)
     }
 
@@ -274,18 +281,17 @@
         )
 
         // Immediate update.
-        val expectedInfo = builder.build(
-            text = textFieldState.text,
-            selection = textFieldState.selection,
-            composition = textFieldState.composition,
-            textLayoutResult = layoutState.layoutResult!!,
-            matrix = getAndroidMatrix(layoutOffset),
-            innerTextFieldBounds = Rect(coreNodeOffset - layoutOffset, coreNodeSize.toSize()),
-            decorationBoxBounds = Rect(
-                decoratorNodeOffset - layoutOffset,
-                decoratorNodeSize.toSize()
-            ),
-        )
+        val expectedInfo =
+            builder.build(
+                text = textFieldState.text,
+                selection = textFieldState.selection,
+                composition = textFieldState.composition,
+                textLayoutResult = layoutState.layoutResult!!,
+                matrix = getAndroidMatrix(layoutOffset),
+                innerTextFieldBounds = Rect(coreNodeOffset - layoutOffset, coreNodeSize.toSize()),
+                decorationBoxBounds =
+                    Rect(decoratorNodeOffset - layoutOffset, decoratorNodeSize.toSize()),
+            )
         Truth.assertThat(reportedCursorAnchorInfos).containsExactly(expectedInfo)
         reportedCursorAnchorInfos.clear()
 
@@ -305,9 +311,7 @@
             // Bootstrap the snapshot observation system.
             lateinit var handle: ObserverHandle
             try {
-                handle = Snapshot.registerGlobalWriteObserver {
-                    Snapshot.sendApplyNotifications()
-                }
+                handle = Snapshot.registerGlobalWriteObserver { Snapshot.sendApplyNotifications() }
                 testBody()
             } finally {
                 handle.dispose()
@@ -316,11 +320,12 @@
     }
 
     private fun CoroutineScope.startFakeTextInputSession(textFieldState: TextFieldState) {
-        val transformedState = TransformedTextFieldState(
-            textFieldState = textFieldState,
-            inputTransformation = null,
-            codepointTransformation = null
-        )
+        val transformedState =
+            TransformedTextFieldState(
+                textFieldState = textFieldState,
+                inputTransformation = null,
+                codepointTransformation = null
+            )
 
         launch(Dispatchers.Unconfined) {
             session.platformSpecificTextInputSession(
@@ -358,10 +363,14 @@
         override var isAttached: Boolean = false,
     ) : LayoutCoordinates {
         override fun get(alignmentLine: AlignmentLine): Int = AlignmentLine.Unspecified
+
         override fun windowToLocal(relativeToWindow: Offset): Offset =
             relativeToWindow - windowOffset
+
         override fun localToWindow(relativeToLocal: Offset): Offset = relativeToLocal + windowOffset
+
         override fun localToRoot(relativeToLocal: Offset): Offset = relativeToLocal
+
         override fun localPositionOf(
             sourceCoordinates: LayoutCoordinates,
             relativeToSource: Offset
diff --git a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/input/internal/selection/PressDownTest.kt b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/input/internal/selection/PressDownTest.kt
index d22250e..0ad2a20 100644
--- a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/input/internal/selection/PressDownTest.kt
+++ b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/input/internal/selection/PressDownTest.kt
@@ -51,13 +51,11 @@
 @RunWith(JUnit4::class)
 class PressDownTest {
 
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
     /**
-     * null; gesture detector has never seen a down event.
-     * true; at least a pointer is currently down.
-     * false; there was at least one down event but right now all pointers are up. Also, this
+     * null; gesture detector has never seen a down event. true; at least a pointer is currently
+     * down. false; there was at least one down event but right now all pointers are up. Also, this
      * requires onUp to be defined.
      */
     private var down: Boolean? = null
@@ -67,10 +65,7 @@
     }
 
     private val downUpDetector = layoutWithGestureDetector {
-        detectPressDownGesture(
-            onDown = { down = true },
-            onUp = { down = false }
-        )
+        detectPressDownGesture(onDown = { down = true }, onUp = { down = false })
     }
 
     private val nothingHandler: PointerInputChange.() -> Unit = {}
@@ -88,14 +83,12 @@
     ): @Composable () -> Unit = {
         CompositionLocalProvider(
             LocalDensity provides Density(1f),
-            LocalViewConfiguration provides TestViewConfiguration(
-                minimumTouchTargetSize = DpSize.Zero
-            )
+            LocalViewConfiguration provides
+                TestViewConfiguration(minimumTouchTargetSize = DpSize.Zero)
         ) {
             with(LocalDensity.current) {
                 Box(
-                    Modifier
-                        .fillMaxSize()
+                    Modifier.fillMaxSize()
                         // Some tests execute a lambda before the initial and final passes
                         // so they are called here, higher up the chain, so that the
                         // calls happen prior to the gestureDetector below. The lambdas
@@ -105,13 +98,9 @@
                             awaitPointerEventScope {
                                 while (true) {
                                     val event = awaitPointerEvent(PointerEventPass.Initial)
-                                    event.changes.forEach {
-                                        initialPass(it)
-                                    }
+                                    event.changes.forEach { initialPass(it) }
                                     awaitPointerEvent(PointerEventPass.Final)
-                                    event.changes.forEach {
-                                        finalPass(it)
-                                    }
+                                    event.changes.forEach { finalPass(it) }
                                 }
                             }
                         }
@@ -141,17 +130,13 @@
     fun normalDown() {
         rule.setContent(downUpDetector)
 
-        performTouch(finalPass = { Assert.assertFalse(isConsumed) }) {
-            down(0, Offset(5f, 5f))
-        }
+        performTouch(finalPass = { Assert.assertFalse(isConsumed) }) { down(0, Offset(5f, 5f)) }
 
         Assert.assertTrue(down!!)
 
         rule.mainClock.advanceTimeBy(50)
 
-        performTouch(finalPass = { Assert.assertFalse(isConsumed) }) {
-            up(0)
-        }
+        performTouch(finalPass = { Assert.assertFalse(isConsumed) }) { up(0) }
 
         Assert.assertFalse(down!!)
     }
@@ -160,15 +145,11 @@
     fun normalDown_upNotSpecified() {
         rule.setContent(downDetector)
 
-        performTouch(finalPass = { Assert.assertFalse(isConsumed) }) {
-            down(0, Offset(5f, 5f))
-        }
+        performTouch(finalPass = { Assert.assertFalse(isConsumed) }) { down(0, Offset(5f, 5f)) }
 
         rule.mainClock.advanceTimeBy(50)
 
-        performTouch(finalPass = { Assert.assertFalse(isConsumed) }) {
-            up(0)
-        }
+        performTouch(finalPass = { Assert.assertFalse(isConsumed) }) { up(0) }
 
         Assert.assertTrue(down!!)
     }
@@ -192,9 +173,7 @@
     fun downLongPress() {
         rule.setContent(downUpDetector)
 
-        performTouch(finalPass = { Assert.assertFalse(isConsumed) }) {
-            down(0, Offset(5f, 5f))
-        }
+        performTouch(finalPass = { Assert.assertFalse(isConsumed) }) { down(0, Offset(5f, 5f)) }
 
         Assert.assertTrue(down!!)
 
@@ -204,9 +183,7 @@
 
         rule.mainClock.advanceTimeBy(500)
 
-        performTouch(finalPass = { Assert.assertFalse(isConsumed) }) {
-            up(0)
-        }
+        performTouch(finalPass = { Assert.assertFalse(isConsumed) }) { up(0) }
 
         Assert.assertFalse(down!!)
     }
@@ -220,9 +197,7 @@
             moveTo(0, Offset(15f, 15f))
         }
 
-        performTouch(finalPass = { Assert.assertFalse(isConsumed) }) {
-            up(0)
-        }
+        performTouch(finalPass = { Assert.assertFalse(isConsumed) }) { up(0) }
 
         Assert.assertFalse(down!!)
     }
diff --git a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/input/internal/selection/TextFieldClickToMoveCursorTest.kt b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/input/internal/selection/TextFieldClickToMoveCursorTest.kt
index 7410588..0f29ba5 100644
--- a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/input/internal/selection/TextFieldClickToMoveCursorTest.kt
+++ b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/input/internal/selection/TextFieldClickToMoveCursorTest.kt
@@ -52,8 +52,7 @@
 @LargeTest
 class TextFieldClickToMoveCursorTest : FocusedWindowTest {
 
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
     private lateinit var state: TextFieldState
 
@@ -71,10 +70,7 @@
             BasicTextField(
                 state = state,
                 textStyle = defaultTextStyle,
-                modifier = Modifier
-                    .testTag(TAG)
-                    .width(50.dp)
-                    .height(15.dp)
+                modifier = Modifier.testTag(TAG).width(50.dp).height(15.dp)
             )
         }
 
@@ -99,10 +95,7 @@
             BasicTextField(
                 state = state,
                 textStyle = defaultTextStyle,
-                modifier = Modifier
-                    .testTag(TAG)
-                    .width(50.dp)
-                    .height(15.dp)
+                modifier = Modifier.testTag(TAG).width(50.dp).height(15.dp)
             )
         }
 
@@ -120,10 +113,7 @@
                 BasicTextField(
                     state = state,
                     textStyle = defaultTextStyle,
-                    modifier = Modifier
-                        .testTag(TAG)
-                        .width(50.dp)
-                        .height(15.dp)
+                    modifier = Modifier.testTag(TAG).width(50.dp).height(15.dp)
                 )
             }
         }
@@ -142,10 +132,7 @@
                 BasicTextField(
                     state = state,
                     textStyle = defaultTextStyle,
-                    modifier = Modifier
-                        .testTag(TAG)
-                        .width(50.dp)
-                        .height(15.dp)
+                    modifier = Modifier.testTag(TAG).width(50.dp).height(15.dp)
                 )
             }
         }
@@ -163,10 +150,7 @@
             BasicTextField(
                 state = state,
                 textStyle = defaultTextStyle,
-                modifier = Modifier
-                    .testTag(TAG)
-                    .width(50.dp)
-                    .height(15.dp)
+                modifier = Modifier.testTag(TAG).width(50.dp).height(15.dp)
             )
         }
 
@@ -183,10 +167,7 @@
             BasicTextField(
                 state = state,
                 textStyle = defaultTextStyle,
-                modifier = Modifier
-                    .testTag(TAG)
-                    .width(50.dp)
-                    .height(15.dp)
+                modifier = Modifier.testTag(TAG).width(50.dp).height(15.dp)
             )
         }
 
@@ -204,10 +185,7 @@
                 BasicTextField(
                     state = state,
                     textStyle = defaultTextStyle,
-                    modifier = Modifier
-                        .testTag(TAG)
-                        .width(50.dp)
-                        .height(15.dp)
+                    modifier = Modifier.testTag(TAG).width(50.dp).height(15.dp)
                 )
             }
         }
@@ -228,16 +206,11 @@
                 textStyle = defaultTextStyle,
                 lineLimits = TextFieldLineLimits.SingleLine,
                 scrollState = scrollState,
-                modifier = Modifier
-                    .testTag(TAG)
-                    .width(57.dp)
-                    .height(12.dp)
+                modifier = Modifier.testTag(TAG).width(57.dp).height(12.dp)
             )
         }
 
-        rule.onNodeWithTag(TAG).performTouchInput {
-            click(Offset(right - 1f, height / 2f))
-        }
+        rule.onNodeWithTag(TAG).performTouchInput { click(Offset(right - 1f, height / 2f)) }
 
         rule.runOnIdle {
             assertThat(state.selection).isEqualTo(TextRange(6))
@@ -255,10 +228,7 @@
                 textStyle = defaultTextStyle,
                 lineLimits = TextFieldLineLimits.MultiLine(maxHeightInLines = 2),
                 scrollState = scrollState,
-                modifier = Modifier
-                    .testTag(TAG)
-                    .width(50.dp)
-                    .height(17.dp)
+                modifier = Modifier.testTag(TAG).width(50.dp).height(17.dp)
             )
         }
 
@@ -278,10 +248,7 @@
                 state = state,
                 textStyle = defaultTextStyle,
                 readOnly = true,
-                modifier = Modifier
-                    .testTag(TAG)
-                    .width(50.dp)
-                    .height(15.dp)
+                modifier = Modifier.testTag(TAG).width(50.dp).height(15.dp)
             )
         }
 
@@ -303,14 +270,10 @@
                     BasicTextField(
                         state = state,
                         textStyle = defaultTextStyle,
-                        modifier = Modifier
-                            .fillMaxWidth()
-                            .testTag(TAG)
-                            .focusRequester(focusRequester),
+                        modifier =
+                            Modifier.fillMaxWidth().testTag(TAG).focusRequester(focusRequester),
                     )
-                    LaunchedEffect(Unit) {
-                        focusRequester.requestFocus()
-                    }
+                    LaunchedEffect(Unit) { focusRequester.requestFocus() }
                 }
             )
         }
diff --git a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/input/internal/selection/TextFieldCursorHandleTest.kt b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/input/internal/selection/TextFieldCursorHandleTest.kt
index 59adeb8..aad428a 100644
--- a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/input/internal/selection/TextFieldCursorHandleTest.kt
+++ b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/input/internal/selection/TextFieldCursorHandleTest.kt
@@ -77,8 +77,7 @@
 @LargeTest
 class TextFieldCursorHandleTest : FocusedWindowTest {
 
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
     private lateinit var state: TextFieldState
 
@@ -111,37 +110,40 @@
 
         assertThat(state.selection).isEqualTo(TextRange(2))
 
-        rule.onNode(isSelectionHandle(Handle.Cursor)).assertHandlePositionMatches(
-            (2 * fontSize.value).dp + cursorWidth / 2,
-            fontSize.value.dp
-        )
+        rule
+            .onNode(isSelectionHandle(Handle.Cursor))
+            .assertHandlePositionMatches(
+                (2 * fontSize.value).dp + cursorWidth / 2,
+                fontSize.value.dp
+            )
     }
 
     @Test
-    fun cursorHandle_hasMinimumTouchSizeArea() = with(rule.density) {
-        state = TextFieldState("hello")
-        rule.setTextFieldTestContent {
-            BasicTextField(
-                state,
-                textStyle = TextStyle(fontSize = fontSize, fontFamily = TEST_FONT_FAMILY),
-                modifier = Modifier.width(100.dp).testTag(TAG)
-            )
+    fun cursorHandle_hasMinimumTouchSizeArea() =
+        with(rule.density) {
+            state = TextFieldState("hello")
+            rule.setTextFieldTestContent {
+                BasicTextField(
+                    state,
+                    textStyle = TextStyle(fontSize = fontSize, fontFamily = TEST_FONT_FAMILY),
+                    modifier = Modifier.width(100.dp).testTag(TAG)
+                )
+            }
+
+            focusAndWait()
+
+            rule.onNodeWithTag(TAG).performTouchInput { click() }
+
+            var actualBottomRight = Offset.Zero
+            rule.onNode(isSelectionHandle(Handle.Cursor)).performTouchInput {
+                actualBottomRight = bottomRight
+            }
+
+            val expectedBottomRight = Offset(40.dp.toPx(), 40.dp.toPx())
+            assertThat(actualBottomRight.x).isWithin(1f).of(expectedBottomRight.x)
+            assertThat(actualBottomRight.y).isWithin(1f).of(expectedBottomRight.y)
         }
 
-        focusAndWait()
-
-        rule.onNodeWithTag(TAG).performTouchInput { click() }
-
-        var actualBottomRight = Offset.Zero
-        rule.onNode(isSelectionHandle(Handle.Cursor)).performTouchInput {
-            actualBottomRight = bottomRight
-        }
-
-        val expectedBottomRight = Offset(40.dp.toPx(), 40.dp.toPx())
-        assertThat(actualBottomRight.x).isWithin(1f).of(expectedBottomRight.x)
-        assertThat(actualBottomRight.y).isWithin(1f).of(expectedBottomRight.y)
-    }
-
     @Test
     fun tapTextField_cursorHandleFiltered() {
         state = TextFieldState("hello")
@@ -149,9 +151,7 @@
             BasicTextField(
                 state,
                 textStyle = TextStyle(fontSize = fontSize, fontFamily = TEST_FONT_FAMILY),
-                inputTransformation = {
-                    selection = TextRange(4)
-                },
+                inputTransformation = { selection = TextRange(4) },
                 modifier = Modifier.testTag(TAG)
             )
         }
@@ -172,9 +172,7 @@
             BasicTextField(
                 state,
                 textStyle = TextStyle(fontSize = fontSize, fontFamily = TEST_FONT_FAMILY),
-                modifier = Modifier
-                    .testTag(TAG)
-                    .width(100.dp)
+                modifier = Modifier.testTag(TAG).width(100.dp)
             )
         }
 
@@ -186,10 +184,9 @@
 
         assertThat(state.selection).isEqualTo(TextRange(5))
 
-        rule.onNode(isSelectionHandle(Handle.Cursor)).assertHandlePositionMatches(
-            5 * fontSizeDp + cursorWidth / 2,
-            fontSizeDp
-        )
+        rule
+            .onNode(isSelectionHandle(Handle.Cursor))
+            .assertHandlePositionMatches(5 * fontSizeDp + cursorWidth / 2, fontSizeDp)
     }
 
     @Test
@@ -200,9 +197,7 @@
                 BasicTextField(
                     state,
                     textStyle = TextStyle(fontSize = fontSize, fontFamily = TEST_FONT_FAMILY),
-                    modifier = Modifier
-                        .testTag(TAG)
-                        .width(fontSize.value.dp * 5)
+                    modifier = Modifier.testTag(TAG).width(fontSize.value.dp * 5)
                 )
             }
         }
@@ -215,10 +210,12 @@
 
         assertThat(state.selection).isEqualTo(TextRange(3))
 
-        rule.onNode(isSelectionHandle(Handle.Cursor)).assertHandlePositionMatches(
-            (2 * fontSize.value).dp + cursorWidth / 2,
-            fontSize.value.dp
-        )
+        rule
+            .onNode(isSelectionHandle(Handle.Cursor))
+            .assertHandlePositionMatches(
+                (2 * fontSize.value).dp + cursorWidth / 2,
+                fontSize.value.dp
+            )
     }
 
     @Test
@@ -228,9 +225,7 @@
             BasicTextField(
                 state,
                 textStyle = TextStyle(fontSize = fontSize, fontFamily = TEST_FONT_FAMILY),
-                modifier = Modifier
-                    .testTag(TAG)
-                    .width(100.dp)
+                modifier = Modifier.testTag(TAG).width(100.dp)
             )
         }
 
@@ -242,10 +237,12 @@
 
         assertThat(state.selection).isEqualTo(TextRange(5))
 
-        rule.onNode(isSelectionHandle(Handle.Cursor)).assertHandlePositionMatches(
-            (5 * fontSize.value).dp + cursorWidth / 2,
-            fontSize.value.dp
-        )
+        rule
+            .onNode(isSelectionHandle(Handle.Cursor))
+            .assertHandlePositionMatches(
+                (5 * fontSize.value).dp + cursorWidth / 2,
+                fontSize.value.dp
+            )
     }
 
     @Test
@@ -341,20 +338,23 @@
 
         state.edit { placeCursorBeforeCharAt(2) }
         rule.onNode(isSelectionHandle(Handle.Cursor)).assertIsDisplayed()
-        rule.onNode(isSelectionHandle(Handle.Cursor)).assertHandlePositionMatches(
-            (2 * fontSize.value).dp + cursorWidth / 2,
-            fontSize.value.dp
-        )
+        rule
+            .onNode(isSelectionHandle(Handle.Cursor))
+            .assertHandlePositionMatches(
+                (2 * fontSize.value).dp + cursorWidth / 2,
+                fontSize.value.dp
+            )
     }
 
     @Test
     fun cursorHandle_disappears_whenWindowLosesFocus() {
         state = TextFieldState("hello")
         val focusWindow = mutableStateOf(true)
-        val windowInfo = object : WindowInfo {
-            override val isWindowFocused: Boolean
-                get() = focusWindow.value
-        }
+        val windowInfo =
+            object : WindowInfo {
+                override val isWindowFocused: Boolean
+                    get() = focusWindow.value
+            }
         rule.setContent {
             CompositionLocalProvider(LocalWindowInfo provides windowInfo) {
                 BasicTextField(
@@ -383,10 +383,10 @@
             BasicTextField(
                 state,
                 textStyle = TextStyle(fontSize = fontSize, fontFamily = TEST_FONT_FAMILY),
-                modifier = Modifier
-                    .testTag(TAG)
-                    // Make this TextField guaranteed to be wider than the text content
-                    .width(fontSizeDp * 10)
+                modifier =
+                    Modifier.testTag(TAG)
+                        // Make this TextField guaranteed to be wider than the text content
+                        .width(fontSizeDp * 10)
             )
         }
 
@@ -398,67 +398,74 @@
         }
 
         val characterSize = fontSizeDp // width and height is the same.
-        rule.onNode(isSelectionHandle(Handle.Cursor)).assertHandlePositionMatches(
-            cursorWidth / 2,
-            characterSize
-        )
+        rule
+            .onNode(isSelectionHandle(Handle.Cursor))
+            .assertHandlePositionMatches(cursorWidth / 2, characterSize)
 
         rule.runOnIdle {
             state.edit { selection = TextRange(5) } // move cursor to the end of text
         }
 
-        rule.onNode(isSelectionHandle(Handle.Cursor)).assertHandlePositionMatches(
-            // Move 5 characters to right (5 * character), finally account for the center of
-            // cursor (cursorWidth / 2).
-            5 * characterSize + cursorWidth / 2,
-            fontSizeDp
-        )
+        rule
+            .onNode(isSelectionHandle(Handle.Cursor))
+            .assertHandlePositionMatches(
+                // Move 5 characters to right (5 * character), finally account for the center of
+                // cursor (cursorWidth / 2).
+                5 * characterSize + cursorWidth / 2,
+                fontSizeDp
+            )
     }
 
     @Test
-    fun cursorHandle_coercesAtBoundaries_rtl() = with(rule.density) {
-        state = TextFieldState("\u05D0\u05D1\u05D2\u05D3\u05D4")
-        var width = 0
-        rule.setTextFieldTestContent {
-            CompositionLocalProvider(LocalLayoutDirection provides LayoutDirection.Rtl) {
-                BasicTextField(
-                    state,
-                    textStyle = TextStyle(fontSize = fontSize, fontFamily = TEST_FONT_FAMILY),
-                    modifier = Modifier
-                        .testTag(TAG)
-                        // Make this TextField guaranteed to be wider than the text content
-                        .width(fontSizeDp * 10)
-                        .onSizeChanged { width = it.width }
-                )
+    fun cursorHandle_coercesAtBoundaries_rtl() =
+        with(rule.density) {
+            state = TextFieldState("\u05D0\u05D1\u05D2\u05D3\u05D4")
+            var width = 0
+            rule.setTextFieldTestContent {
+                CompositionLocalProvider(LocalLayoutDirection provides LayoutDirection.Rtl) {
+                    BasicTextField(
+                        state,
+                        textStyle = TextStyle(fontSize = fontSize, fontFamily = TEST_FONT_FAMILY),
+                        modifier =
+                            Modifier.testTag(TAG)
+                                // Make this TextField guaranteed to be wider than the text content
+                                .width(fontSizeDp * 10)
+                                .onSizeChanged { width = it.width }
+                    )
+                }
             }
+
+            focusAndWait()
+
+            rule.onNodeWithTag(TAG).performClick() // cursor handle appears
+
+            rule.runOnIdle {
+                state.edit { selection = TextRange(0) } // move cursor to the start of text
+            }
+
+            val characterSize = fontSizeDp // width and height is the same.
+            rule
+                .onNode(isSelectionHandle(Handle.Cursor))
+                .assertHandlePositionMatches(
+                    width.toDp() - cursorWidth / 2, // Should align to the right
+                    characterSize
+                )
+
+            rule.runOnIdle {
+                state.edit { selection = TextRange(5) } // move cursor to the end of text
+            }
+
+            rule
+                .onNode(isSelectionHandle(Handle.Cursor))
+                .assertHandlePositionMatches(
+                    // Start from right (width), move 5 characters to left (5 * character), finally
+                    // account
+                    // for the center of cursor (cursorWidth / 2).
+                    width.toDp() - 5 * characterSize - cursorWidth / 2,
+                    fontSizeDp
+                )
         }
 
-        focusAndWait()
-
-        rule.onNodeWithTag(TAG).performClick() // cursor handle appears
-
-        rule.runOnIdle {
-            state.edit { selection = TextRange(0) } // move cursor to the start of text
-        }
-
-        val characterSize = fontSizeDp // width and height is the same.
-        rule.onNode(isSelectionHandle(Handle.Cursor)).assertHandlePositionMatches(
-            width.toDp() - cursorWidth / 2, // Should align to the right
-            characterSize
-        )
-
-        rule.runOnIdle {
-            state.edit { selection = TextRange(5) } // move cursor to the end of text
-        }
-
-        rule.onNode(isSelectionHandle(Handle.Cursor)).assertHandlePositionMatches(
-            // Start from right (width), move 5 characters to left (5 * character), finally account
-            // for the center of cursor (cursorWidth / 2).
-            width.toDp() - 5 * characterSize - cursorWidth / 2,
-            fontSizeDp
-        )
-    }
-
     @Test
     fun cursorHandle_disappearsOnVerticalScroll() {
         state = TextFieldState("hello hello hello hello", initialSelection = TextRange.Zero)
@@ -472,9 +479,7 @@
                 // scrollable but still only show maximum one line in its viewport
                 lineLimits = TextFieldLineLimits.MultiLine(maxHeightInLines = 1),
                 scrollState = scrollState,
-                modifier = Modifier
-                    .testTag(TAG)
-                    .width(fontSizeDp * 5)
+                modifier = Modifier.testTag(TAG).width(fontSizeDp * 5)
             )
         }
 
@@ -483,9 +488,7 @@
         rule.onNodeWithTag(TAG).performClick()
         rule.onNode(isSelectionHandle(Handle.Cursor)).assertIsDisplayed()
 
-        scope.runBlockingOnIdle {
-            scrollState.scrollTo(scrollState.maxValue)
-        }
+        scope.runBlockingOnIdle { scrollState.scrollTo(scrollState.maxValue) }
 
         rule.onNode(isSelectionHandle(Handle.Cursor)).assertDoesNotExist()
     }
@@ -503,9 +506,7 @@
                 // scrollable but still only show maximum one line in its viewport
                 lineLimits = TextFieldLineLimits.SingleLine,
                 scrollState = scrollState,
-                modifier = Modifier
-                    .testTag(TAG)
-                    .width(fontSizeDp * 10)
+                modifier = Modifier.testTag(TAG).width(fontSizeDp * 10)
             )
         }
 
@@ -514,9 +515,7 @@
         rule.onNodeWithTag(TAG).performClick()
         rule.onNode(isSelectionHandle(Handle.Cursor)).assertIsDisplayed()
 
-        scope.runBlockingOnIdle {
-            scrollState.scrollTo(scrollState.maxValue)
-        }
+        scope.runBlockingOnIdle { scrollState.scrollTo(scrollState.maxValue) }
 
         rule.onNode(isSelectionHandle(Handle.Cursor)).assertDoesNotExist()
     }
@@ -532,9 +531,7 @@
                 // scrollable but still only show maximum one line in its viewport
                 lineLimits = TextFieldLineLimits.MultiLine(maxHeightInLines = 1),
                 scrollState = scrollState,
-                modifier = Modifier
-                    .testTag(TAG)
-                    .width(fontSizeDp * 5)
+                modifier = Modifier.testTag(TAG).width(fontSizeDp * 5)
             )
         }
 
@@ -571,9 +568,7 @@
                 // scrollable but still only show maximum one line in its viewport
                 lineLimits = TextFieldLineLimits.SingleLine,
                 scrollState = scrollState,
-                modifier = Modifier
-                    .testTag(TAG)
-                    .width(fontSizeDp * 5)
+                modifier = Modifier.testTag(TAG).width(fontSizeDp * 5)
             )
         }
 
@@ -598,12 +593,8 @@
             BasicTextField(
                 state,
                 textStyle = TextStyle(fontSize = fontSize, fontFamily = TEST_FONT_FAMILY),
-                inputTransformation = {
-                    selection = TextRange.Zero
-                },
-                modifier = Modifier
-                    .testTag(TAG)
-                    .width(fontSizeDp * 10)
+                inputTransformation = { selection = TextRange.Zero },
+                modifier = Modifier.testTag(TAG).width(fontSizeDp * 10)
             )
         }
 
@@ -626,9 +617,7 @@
             BasicTextField(
                 state,
                 textStyle = TextStyle(fontSize = fontSize, fontFamily = TEST_FONT_FAMILY),
-                modifier = Modifier
-                    .testTag(TAG)
-                    .width(fontSizeDp * 10)
+                modifier = Modifier.testTag(TAG).width(fontSizeDp * 10)
             )
         }
 
@@ -650,9 +639,7 @@
             BasicTextField(
                 state,
                 textStyle = TextStyle(fontSize = fontSize, fontFamily = TEST_FONT_FAMILY),
-                modifier = Modifier
-                    .testTag(TAG)
-                    .width(fontSizeDp * 10)
+                modifier = Modifier.testTag(TAG).width(fontSizeDp * 10)
             )
         }
 
@@ -663,9 +650,7 @@
 
         swipeToLeft(fontSizePx)
 
-        rule.runOnIdle {
-            assertThat(state.selection).isEqualTo(TextRange(2))
-        }
+        rule.runOnIdle { assertThat(state.selection).isEqualTo(TextRange(2)) }
     }
 
     @Test
@@ -675,9 +660,7 @@
             BasicTextField(
                 state,
                 textStyle = TextStyle(fontSize = fontSize, fontFamily = TEST_FONT_FAMILY),
-                modifier = Modifier
-                    .testTag(TAG)
-                    .width(fontSizeDp * 5)
+                modifier = Modifier.testTag(TAG).width(fontSizeDp * 5)
             )
         }
 
@@ -699,9 +682,7 @@
             BasicTextField(
                 state,
                 textStyle = TextStyle(fontSize = fontSize, fontFamily = TEST_FONT_FAMILY),
-                modifier = Modifier
-                    .testTag(TAG)
-                    .width(fontSizeDp * 5)
+                modifier = Modifier.testTag(TAG).width(fontSizeDp * 5)
             )
         }
 
@@ -718,18 +699,17 @@
 
     @Test
     fun moveCursorHandleToRight_ltr_outOfBounds_scrollable_continuesDrag() {
-        state = TextFieldState(
-            initialText = "abcd abcd abcd abcd abcd",
-            initialSelection = TextRange.Zero
-        )
+        state =
+            TextFieldState(
+                initialText = "abcd abcd abcd abcd abcd",
+                initialSelection = TextRange.Zero
+            )
         rule.setTextFieldTestContent {
             BasicTextField(
                 state,
                 textStyle = TextStyle(fontSize = fontSize, fontFamily = TEST_FONT_FAMILY),
                 lineLimits = TextFieldLineLimits.SingleLine,
-                modifier = Modifier
-                    .testTag(TAG)
-                    .width(fontSizeDp * 10)
+                modifier = Modifier.testTag(TAG).width(fontSizeDp * 10)
             )
         }
 
@@ -746,18 +726,17 @@
 
     @Test
     fun moveCursorHandleToRight_ltr_outOfBounds_scrollable() {
-        state = TextFieldState(
-            initialText = "abcd abcd abcd abcd abcd",
-            initialSelection = TextRange.Zero
-        )
+        state =
+            TextFieldState(
+                initialText = "abcd abcd abcd abcd abcd",
+                initialSelection = TextRange.Zero
+            )
         rule.setTextFieldTestContent {
             BasicTextField(
                 state,
                 textStyle = TextStyle(fontSize = fontSize, fontFamily = TEST_FONT_FAMILY),
                 lineLimits = TextFieldLineLimits.SingleLine,
-                modifier = Modifier
-                    .testTag(TAG)
-                    .width(fontSizeDp * 10)
+                modifier = Modifier.testTag(TAG).width(fontSizeDp * 10)
             )
         }
 
@@ -767,14 +746,10 @@
         rule.onNode(isSelectionHandle(Handle.Cursor)).assertIsDisplayed()
 
         swipeToRight(fontSizePx * 12, durationMillis = 1)
-        rule.runOnIdle {
-            assertThat(state.selection).isEqualTo(TextRange(12))
-        }
+        rule.runOnIdle { assertThat(state.selection).isEqualTo(TextRange(12)) }
 
         swipeToRight(fontSizePx * 2, durationMillis = 1)
-        rule.runOnIdle {
-            assertThat(state.selection).isEqualTo(TextRange(14))
-        }
+        rule.runOnIdle { assertThat(state.selection).isEqualTo(TextRange(14)) }
     }
 
     // endregion
@@ -788,9 +763,7 @@
                 BasicTextField(
                     state,
                     textStyle = TextStyle(fontSize = fontSize, fontFamily = TEST_FONT_FAMILY),
-                    modifier = Modifier
-                        .testTag(TAG)
-                        .width(fontSizeDp * 10)
+                    modifier = Modifier.testTag(TAG).width(fontSizeDp * 10)
                 )
             }
         }
@@ -814,9 +787,7 @@
                 BasicTextField(
                     state,
                     textStyle = TextStyle(fontSize = fontSize, fontFamily = TEST_FONT_FAMILY),
-                    modifier = Modifier
-                        .testTag(TAG)
-                        .width(fontSizeDp * 10)
+                    modifier = Modifier.testTag(TAG).width(fontSizeDp * 10)
                 )
             }
         }
@@ -840,9 +811,7 @@
                 BasicTextField(
                     state,
                     textStyle = TextStyle(fontSize = fontSize, fontFamily = TEST_FONT_FAMILY),
-                    modifier = Modifier
-                        .testTag(TAG)
-                        .width(fontSizeDp * 5)
+                    modifier = Modifier.testTag(TAG).width(fontSizeDp * 5)
                 )
             }
         }
@@ -866,9 +835,7 @@
                 BasicTextField(
                     state,
                     textStyle = TextStyle(fontSize = fontSize, fontFamily = TEST_FONT_FAMILY),
-                    modifier = Modifier
-                        .testTag(TAG)
-                        .width(fontSizeDp * 5)
+                    modifier = Modifier.testTag(TAG).width(fontSizeDp * 5)
                 )
             }
         }
@@ -886,21 +853,20 @@
 
     @Test
     fun moveCursorHandleToLeft_rtl_outOfBounds_scrollable_continuesDrag() {
-        state = TextFieldState(
-            "\u05D0\u05D1\u05D2\u05D3 " +
+        state =
+            TextFieldState(
                 "\u05D0\u05D1\u05D2\u05D3 " +
-                "\u05D0\u05D1\u05D2\u05D3 " +
-                "\u05D0\u05D1\u05D2\u05D3"
-        )
+                    "\u05D0\u05D1\u05D2\u05D3 " +
+                    "\u05D0\u05D1\u05D2\u05D3 " +
+                    "\u05D0\u05D1\u05D2\u05D3"
+            )
         rule.setTextFieldTestContent {
             CompositionLocalProvider(LocalLayoutDirection provides LayoutDirection.Rtl) {
                 BasicTextField(
                     state,
                     textStyle = TextStyle(fontSize = fontSize, fontFamily = TEST_FONT_FAMILY),
                     lineLimits = TextFieldLineLimits.SingleLine,
-                    modifier = Modifier
-                        .testTag(TAG)
-                        .width(fontSizeDp * 10)
+                    modifier = Modifier.testTag(TAG).width(fontSizeDp * 10)
                 )
             }
         }
@@ -919,13 +885,15 @@
     @Test
     fun moveCursorHandleToLeft_rtl_outOfBounds_scrollable() {
         val scrollState = ScrollState(0)
-        state = TextFieldState(
-            initialText = "\u05D0\u05D1\u05D2\u05D3 " +
-                "\u05D0\u05D1\u05D2\u05D3 " +
-                "\u05D0\u05D1\u05D2\u05D3 " +
-                "\u05D0\u05D1\u05D2\u05D3",
-            initialSelection = TextRange.Zero
-        )
+        state =
+            TextFieldState(
+                initialText =
+                    "\u05D0\u05D1\u05D2\u05D3 " +
+                        "\u05D0\u05D1\u05D2\u05D3 " +
+                        "\u05D0\u05D1\u05D2\u05D3 " +
+                        "\u05D0\u05D1\u05D2\u05D3",
+                initialSelection = TextRange.Zero
+            )
         rule.setTextFieldTestContent {
             CompositionLocalProvider(LocalLayoutDirection provides LayoutDirection.Rtl) {
                 BasicTextField(
@@ -933,9 +901,7 @@
                     textStyle = TextStyle(fontSize = fontSize, fontFamily = TEST_FONT_FAMILY),
                     lineLimits = TextFieldLineLimits.SingleLine,
                     scrollState = scrollState,
-                    modifier = Modifier
-                        .testTag(TAG)
-                        .width(fontSizeDp * 10f)
+                    modifier = Modifier.testTag(TAG).width(fontSizeDp * 10f)
                 )
             }
         }
@@ -946,14 +912,10 @@
         rule.onNode(isSelectionHandle(Handle.Cursor)).assertIsDisplayed()
 
         swipeToLeft(fontSizePx * 12, durationMillis = 1)
-        rule.runOnIdle {
-            assertThat(state.selection).isEqualTo(TextRange(12))
-        }
+        rule.runOnIdle { assertThat(state.selection).isEqualTo(TextRange(12)) }
 
         swipeToLeft(fontSizePx * 2, durationMillis = 1)
-        rule.runOnIdle {
-            assertThat(state.selection).isEqualTo(TextRange(14))
-        }
+        rule.runOnIdle { assertThat(state.selection).isEqualTo(TextRange(14)) }
     }
 
     // endregion
@@ -1043,14 +1005,11 @@
         }
     }
 
-    private fun getTextFieldWidth() = rule.onNodeWithTag(TAG)
-        .fetchSemanticsNode()
-        .boundsInRoot.width
+    private fun getTextFieldWidth() =
+        rule.onNodeWithTag(TAG).fetchSemanticsNode().boundsInRoot.width
 
     private fun CoroutineScope.runBlockingOnIdle(block: suspend CoroutineScope.() -> Unit) {
-        val job = rule.runOnIdle {
-            launch(block = block)
-        }
+        val job = rule.runOnIdle { launch(block = block) }
         runBlocking { job.join() }
     }
 }
diff --git a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/input/internal/selection/TextFieldInteractionSourcePressTest.kt b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/input/internal/selection/TextFieldInteractionSourcePressTest.kt
index 664736f..7a70540 100644
--- a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/input/internal/selection/TextFieldInteractionSourcePressTest.kt
+++ b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/input/internal/selection/TextFieldInteractionSourcePressTest.kt
@@ -51,8 +51,7 @@
 @LargeTest
 class TextFieldInteractionSourcePressTest : FocusedWindowTest {
 
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
     private val TAG = "BasicTextField"
 
@@ -142,9 +141,7 @@
                 modifier = Modifier.testTag(TAG),
                 textStyle = defaultTextStyle,
                 interactionSource = interactionSource,
-                decorator = {
-                    Box(modifier = Modifier.size(100.dp))
-                }
+                decorator = { Box(modifier = Modifier.size(100.dp)) }
             )
         }
 
@@ -226,9 +223,7 @@
             }
         }
 
-        rule.onNodeWithTag(TAG).performTouchInput {
-            doubleClick()
-        }
+        rule.onNodeWithTag(TAG).performTouchInput { doubleClick() }
 
         rule.runOnIdle {
             assertThat(interactions.size).isEqualTo(4)
diff --git a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/input/internal/selection/TextFieldLongPressTest.kt b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/input/internal/selection/TextFieldLongPressTest.kt
index 60f49f7..a123b16 100644
--- a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/input/internal/selection/TextFieldLongPressTest.kt
+++ b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/input/internal/selection/TextFieldLongPressTest.kt
@@ -62,14 +62,11 @@
 import org.junit.Rule
 import org.junit.Test
 
-/**
- * Tests for long click interactions on BasicTextField.
- */
+/** Tests for long click interactions on BasicTextField. */
 @LargeTest
 class TextFieldLongPressTest : FocusedWindowTest {
 
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
     private val TAG = "BasicTextField"
 
@@ -103,9 +100,7 @@
             )
         }
 
-        rule.onNodeWithTag(TAG).performTouchInput {
-            longPress(center)
-        }
+        rule.onNodeWithTag(TAG).performTouchInput { longPress(center) }
 
         rule.onNodeWithTag(TAG).assertIsNotFocused()
         rule.onNode(isSelectionHandle(Handle.SelectionStart)).assertIsNotDisplayed()
@@ -124,15 +119,11 @@
             )
         }
 
-        rule.onNodeWithTag(TAG).performTouchInput {
-            longPress(center)
-        }
+        rule.onNodeWithTag(TAG).performTouchInput { longPress(center) }
 
         rule.onNodeWithTag(TAG).assertIsNotFocused()
 
-        rule.onNodeWithTag(TAG).performTouchInput {
-            up()
-        }
+        rule.onNodeWithTag(TAG).performTouchInput { up() }
 
         rule.onNodeWithTag(TAG).assertIsFocused()
     }
@@ -144,9 +135,7 @@
             BasicTextField(
                 state = state,
                 textStyle = defaultTextStyle,
-                modifier = Modifier
-                    .testTag(TAG)
-                    .width(100.dp)
+                modifier = Modifier.testTag(TAG).width(100.dp)
             )
         }
 
@@ -162,11 +151,8 @@
     fun longPressOnEmptyRegion_showsTextToolbar() {
         val state = TextFieldState("abc")
         var showMenuCalled = 0
-        val textToolbar = FakeTextToolbar(
-            onShowMenu = { _, _, _, _, _ ->
-                showMenuCalled++
-            }, onHideMenu = {}
-        )
+        val textToolbar =
+            FakeTextToolbar(onShowMenu = { _, _, _, _, _ -> showMenuCalled++ }, onHideMenu = {})
         val clipboardManager = FakeClipboardManager("hello")
         rule.setTextFieldTestContent {
             CompositionLocalProvider(
@@ -176,9 +162,7 @@
                 BasicTextField(
                     state = state,
                     textStyle = defaultTextStyle,
-                    modifier = Modifier
-                        .testTag(TAG)
-                        .width(100.dp)
+                    modifier = Modifier.testTag(TAG).width(100.dp)
                 )
             }
         }
@@ -187,9 +171,7 @@
             longClick(Offset(fontSize.toPx() * 5, fontSize.toPx() / 2))
         }
 
-        rule.runOnIdle {
-            assertThat(showMenuCalled).isEqualTo(1)
-        }
+        rule.runOnIdle { assertThat(showMenuCalled).isEqualTo(1) }
     }
 
     @Test
@@ -245,9 +227,7 @@
                 textStyle = defaultTextStyle,
                 scrollState = scrollState,
                 lineLimits = TextFieldLineLimits.SingleLine,
-                modifier = Modifier
-                    .testTag(TAG)
-                    .width(30.dp)
+                modifier = Modifier.testTag(TAG).width(30.dp)
             )
         }
 
@@ -269,11 +249,7 @@
                 state = state,
                 textStyle = defaultTextStyle,
                 modifier = Modifier.testTag(TAG),
-                decorator = {
-                    Box(modifier = Modifier.padding(32.dp)) {
-                        it()
-                    }
-                }
+                decorator = { Box(modifier = Modifier.padding(32.dp)) { it() } }
             )
         }
 
@@ -378,9 +354,7 @@
             BasicTextField(
                 state = state,
                 textStyle = defaultTextStyle,
-                modifier = Modifier
-                    .testTag(TAG)
-                    .width(100.dp)
+                modifier = Modifier.testTag(TAG).width(100.dp)
             )
         }
 
@@ -400,26 +374,20 @@
             BasicTextField(
                 state = state,
                 textStyle = TextStyle(),
-                modifier = Modifier
-                    .testTag(TAG)
-                    .width(200.dp)
+                modifier = Modifier.testTag(TAG).width(200.dp)
             )
         }
 
         rule.onNodeWithTag(TAG).performTouchInput {
             longPress(bottomRight)
-            repeat((bottomRight - topRight).y.roundToInt()) {
-                moveBy(Offset(0f, -1f))
-            }
+            repeat((bottomRight - topRight).y.roundToInt()) { moveBy(Offset(0f, -1f)) }
             up()
         }
 
-        rule.runOnIdle {
-            assertThat(state.selection).isEqualTo(TextRange(4, 23))
-        }
+        rule.runOnIdle { assertThat(state.selection).isEqualTo(TextRange(4, 23)) }
     }
 
-    //region RTL
+    // region RTL
 
     @Test
     fun longPress_dragToRight_selectsCurrentAndPreviousWord_rtl() {
@@ -509,9 +477,7 @@
                 BasicTextField(
                     state = state,
                     textStyle = defaultTextStyle,
-                    modifier = Modifier
-                        .testTag(TAG)
-                        .width(100.dp)
+                    modifier = Modifier.testTag(TAG).width(100.dp)
                 )
             }
         }
@@ -533,24 +499,18 @@
                 BasicTextField(
                     state = state,
                     textStyle = TextStyle(),
-                    modifier = Modifier
-                        .testTag(TAG)
-                        .width(200.dp)
+                    modifier = Modifier.testTag(TAG).width(200.dp)
                 )
             }
         }
 
         rule.onNodeWithTag(TAG).performTouchInput {
             longPress(bottomLeft)
-            repeat((bottomLeft - topLeft).y.roundToInt()) {
-                moveBy(Offset(0f, -1f))
-            }
+            repeat((bottomLeft - topLeft).y.roundToInt()) { moveBy(Offset(0f, -1f)) }
             up()
         }
 
-        rule.runOnIdle {
-            assertThat(state.selection).isEqualTo(TextRange(4, 23))
-        }
+        rule.runOnIdle { assertThat(state.selection).isEqualTo(TextRange(4, 23)) }
     }
 
     @Test
@@ -561,15 +521,11 @@
                 state = state,
                 textStyle = defaultTextStyle,
                 lineLimits = TextFieldLineLimits.SingleLine,
-                modifier = Modifier
-                    .testTag(TAG)
-                    .width(100.dp)
+                modifier = Modifier.testTag(TAG).width(100.dp)
             )
         }
 
-        rule.onNodeWithTag(TAG).performTouchInput {
-            click(center)
-        }
+        rule.onNodeWithTag(TAG).performTouchInput { click(center) }
 
         rule.onNodeWithTag(TAG).performTouchInput {
             longPress(Offset(fontSize.toPx(), fontSize.toPx() / 2))
@@ -589,15 +545,11 @@
                 state = state,
                 textStyle = defaultTextStyle,
                 lineLimits = TextFieldLineLimits.SingleLine,
-                modifier = Modifier
-                    .testTag(TAG)
-                    .width(100.dp)
+                modifier = Modifier.testTag(TAG).width(100.dp)
             )
         }
 
-        rule.onNodeWithTag(TAG).performTouchInput {
-            click(center)
-        }
+        rule.onNodeWithTag(TAG).performTouchInput { click(center) }
 
         rule.onNodeWithTag(TAG).performTouchInput {
             longPress(Offset(fontSize.toPx(), fontSize.toPx() / 2))
@@ -626,15 +578,11 @@
                 state = state,
                 textStyle = defaultTextStyle,
                 lineLimits = TextFieldLineLimits.MultiLine(1, 3),
-                modifier = Modifier
-                    .testTag(TAG)
-                    .width(100.dp)
+                modifier = Modifier.testTag(TAG).width(100.dp)
             )
         }
 
-        rule.onNodeWithTag(TAG).performTouchInput {
-            click(center)
-        }
+        rule.onNodeWithTag(TAG).performTouchInput { click(center) }
 
         rule.onNodeWithTag(TAG).performTouchInput {
             longPress(Offset(fontSize.toPx(), fontSize.toPx() / 2))
@@ -654,15 +602,11 @@
                 state = state,
                 textStyle = defaultTextStyle,
                 lineLimits = TextFieldLineLimits.MultiLine(1, 3),
-                modifier = Modifier
-                    .testTag(TAG)
-                    .width(100.dp)
+                modifier = Modifier.testTag(TAG).width(100.dp)
             )
         }
 
-        rule.onNodeWithTag(TAG).performTouchInput {
-            click(center)
-        }
+        rule.onNodeWithTag(TAG).performTouchInput { click(center) }
 
         rule.onNodeWithTag(TAG).performTouchInput {
             longPress(Offset(fontSize.toPx(), fontSize.toPx() / 2))
@@ -691,9 +635,7 @@
                 state = state,
                 textStyle = defaultTextStyle,
                 lineLimits = TextFieldLineLimits.SingleLine,
-                modifier = Modifier
-                    .testTag(TAG)
-                    .width(100.dp)
+                modifier = Modifier.testTag(TAG).width(100.dp)
             )
         }
 
@@ -723,9 +665,7 @@
                 state = state,
                 textStyle = defaultTextStyle,
                 lineLimits = TextFieldLineLimits.SingleLine,
-                modifier = Modifier
-                    .testTag(TAG)
-                    .width(100.dp)
+                modifier = Modifier.testTag(TAG).width(100.dp)
             )
         }
 
@@ -764,9 +704,7 @@
                 state = state,
                 textStyle = defaultTextStyle,
                 lineLimits = TextFieldLineLimits.MultiLine(1, 3),
-                modifier = Modifier
-                    .testTag(TAG)
-                    .width(100.dp)
+                modifier = Modifier.testTag(TAG).width(100.dp)
             )
         }
 
@@ -796,9 +734,7 @@
                 state = state,
                 textStyle = defaultTextStyle,
                 lineLimits = TextFieldLineLimits.MultiLine(1, 3),
-                modifier = Modifier
-                    .testTag(TAG)
-                    .width(100.dp)
+                modifier = Modifier.testTag(TAG).width(100.dp)
             )
         }
 
@@ -829,7 +765,7 @@
         rule.onNode(isSelectionHandle(Handle.SelectionEnd)).assertDoesNotExist()
     }
 
-    //endregion
+    // endregion
 
     companion object {
         private const val rtlText2 = "\u05D0\u05D1\u05D2 \u05D3\u05D4\u05D5"
diff --git a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/input/internal/selection/TextFieldMagnifierTest.kt b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/input/internal/selection/TextFieldMagnifierTest.kt
index 23d34ba..c6726f7 100644
--- a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/input/internal/selection/TextFieldMagnifierTest.kt
+++ b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/input/internal/selection/TextFieldMagnifierTest.kt
@@ -109,18 +109,12 @@
 
     @Test
     fun magnifier_staysAtLineEnd_whenCursorDraggedPastStart() {
-        checkMagnifierConstrainedToLineHorizontalBounds(
-            Handle.Cursor,
-            checkStart = true
-        )
+        checkMagnifierConstrainedToLineHorizontalBounds(Handle.Cursor, checkStart = true)
     }
 
     @Test
     fun magnifier_staysAtLineEnd_whenCursorDraggedPastEnd() {
-        checkMagnifierConstrainedToLineHorizontalBounds(
-            Handle.Cursor,
-            checkStart = false
-        )
+        checkMagnifierConstrainedToLineHorizontalBounds(Handle.Cursor, checkStart = false)
     }
 
     @Test
@@ -170,10 +164,11 @@
         rule.runOnIdle {
             val startEvent = makeTextDragEvent(DragEvent.ACTION_DRAG_STARTED)
             val enterEvent = makeTextDragEvent(DragEvent.ACTION_DRAG_ENTERED)
-            val moveEvent = makeTextDragEvent(
-                action = DragEvent.ACTION_DRAG_LOCATION,
-                offset = Offset(40f, 10f)
-            )
+            val moveEvent =
+                makeTextDragEvent(
+                    action = DragEvent.ACTION_DRAG_LOCATION,
+                    offset = Offset(40f, 10f)
+                )
 
             view.dispatchDragEvent(startEvent)
             view.dispatchDragEvent(enterEvent)
@@ -190,10 +185,8 @@
         rule.runOnIdle {
             val startEvent = makeImageDragEvent(DragEvent.ACTION_DRAG_STARTED)
             val enterEvent = makeImageDragEvent(DragEvent.ACTION_DRAG_ENTERED)
-            val moveEvent = makeImageDragEvent(
-                DragEvent.ACTION_DRAG_LOCATION,
-                offset = Offset(40f, 10f)
-            )
+            val moveEvent =
+                makeImageDragEvent(DragEvent.ACTION_DRAG_LOCATION, offset = Offset(40f, 10f))
 
             view.dispatchDragEvent(startEvent)
             view.dispatchDragEvent(enterEvent)
@@ -210,10 +203,11 @@
         rule.runOnIdle {
             val startEvent = makeTextDragEvent(DragEvent.ACTION_DRAG_STARTED)
             val enterEvent = makeTextDragEvent(DragEvent.ACTION_DRAG_ENTERED)
-            val moveEvent = makeTextDragEvent(
-                action = DragEvent.ACTION_DRAG_LOCATION,
-                offset = Offset(40f, 10f)
-            )
+            val moveEvent =
+                makeTextDragEvent(
+                    action = DragEvent.ACTION_DRAG_LOCATION,
+                    offset = Offset(40f, 10f)
+                )
 
             view.dispatchDragEvent(startEvent)
             view.dispatchDragEvent(enterEvent)
@@ -223,10 +217,11 @@
         assertMagnifierExists(rule)
 
         rule.runOnIdle {
-            val moveEvent2 = makeTextDragEvent(
-                action = DragEvent.ACTION_DRAG_LOCATION,
-                offset = Offset(40f, 40f) // force it out of BTF2's hit box
-            )
+            val moveEvent2 =
+                makeTextDragEvent(
+                    action = DragEvent.ACTION_DRAG_LOCATION,
+                    offset = Offset(40f, 40f) // force it out of BTF2's hit box
+                )
             view.dispatchDragEvent(moveEvent2)
         }
 
@@ -236,10 +231,7 @@
     @Test
     fun magnifier_insideDecorationBox() {
         val tag = "BasicTextField"
-        val state = TextFieldState(
-            "aaaa",
-            initialSelection = TextRange.Zero
-        )
+        val state = TextFieldState("aaaa", initialSelection = TextRange.Zero)
 
         rule.setTextFieldTestContent {
             CompositionLocalProvider(LocalDensity provides Density(1f, 1f)) {
@@ -248,36 +240,26 @@
                     Modifier.testTag(tag),
                     textStyle = TextStyle(fontFamily = TEST_FONT_FAMILY, fontSize = 20.sp),
                     lineLimits = TextFieldLineLimits.SingleLine,
-                    decorator = {
-                        Box(modifier = Modifier.padding(8.dp)) {
-                            it()
-                        }
-                    }
+                    decorator = { Box(modifier = Modifier.padding(8.dp)) { it() } }
                 )
             }
         }
 
-        rule.onNodeWithTag(tag).performTouchInput {
-            click(topLeft)
-        }
+        rule.onNodeWithTag(tag).performTouchInput { click(topLeft) }
 
         rule.onNode(isSelectionHandle(Handle.Cursor)).performTouchInput {
             down(center)
             movePastSlopBy(Offset(-0.1f, 0.1f))
         }
 
-        Truth.assertThat(getMagnifierCenterOffset(rule)).isEqualTo(
-            Offset(0f, 10f) + Offset(8f, 8f)
-        )
+        Truth.assertThat(getMagnifierCenterOffset(rule)).isEqualTo(Offset(0f, 10f) + Offset(8f, 8f))
     }
 
     @Test
     fun magnifier_insideDecorationBox_scrolledVertically() {
         val tag = "BasicTextField"
-        val state = TextFieldState(
-            "aaaa\naaaa\naaaa\n".repeat(5),
-            initialSelection = TextRange.Zero
-        )
+        val state =
+            TextFieldState("aaaa\naaaa\naaaa\n".repeat(5), initialSelection = TextRange.Zero)
         val scrollState = ScrollState(0)
         var coroutineScope: CoroutineScope? = null
 
@@ -290,41 +272,28 @@
                     textStyle = TextStyle(fontFamily = TEST_FONT_FAMILY, fontSize = 20.sp),
                     lineLimits = TextFieldLineLimits.MultiLine(1, 2),
                     scrollState = scrollState,
-                    decorator = {
-                        Box(modifier = Modifier.padding(8.dp)) {
-                            it()
-                        }
-                    }
+                    decorator = { Box(modifier = Modifier.padding(8.dp)) { it() } }
                 )
             }
         }
 
         rule.waitForIdle()
-        coroutineScope?.launch {
-            scrollState.scrollTo(scrollState.maxValue)
-        }
+        coroutineScope?.launch { scrollState.scrollTo(scrollState.maxValue) }
 
-        rule.onNodeWithTag(tag).performTouchInput {
-            click(bottomLeft)
-        }
+        rule.onNodeWithTag(tag).performTouchInput { click(bottomLeft) }
 
         rule.onNode(isSelectionHandle(Handle.Cursor)).performTouchInput {
             down(center)
             movePastSlopBy(Offset(0.1f, 0.1f))
         }
 
-        Truth.assertThat(getMagnifierCenterOffset(rule)).isEqualTo(
-            Offset(0f, 30f) + Offset(8f, 8f)
-        )
+        Truth.assertThat(getMagnifierCenterOffset(rule)).isEqualTo(Offset(0f, 30f) + Offset(8f, 8f))
     }
 
     @Test
     fun magnifier_insideDecorationBox_scrolledHorizontally() {
         val tag = "BasicTextField"
-        val state = TextFieldState(
-            "aaaa aaaa aaaa ".repeat(5),
-            initialSelection = TextRange.Zero
-        )
+        val state = TextFieldState("aaaa aaaa aaaa ".repeat(5), initialSelection = TextRange.Zero)
         val scrollState = ScrollState(0)
         var coroutineScope: CoroutineScope? = null
 
@@ -337,33 +306,26 @@
                     textStyle = TextStyle(fontFamily = TEST_FONT_FAMILY, fontSize = 20.sp),
                     lineLimits = TextFieldLineLimits.SingleLine,
                     scrollState = scrollState,
-                    decorator = {
-                        Box(modifier = Modifier.padding(8.dp)) {
-                            it()
-                        }
-                    }
+                    decorator = { Box(modifier = Modifier.padding(8.dp)) { it() } }
                 )
             }
         }
 
         rule.waitForIdle()
-        coroutineScope?.launch {
-            scrollState.scrollTo(scrollState.maxValue)
-        }
+        coroutineScope?.launch { scrollState.scrollTo(scrollState.maxValue) }
 
-        rule.onNodeWithTag(tag).performTouchInput {
-            click(centerRight)
-        }
+        rule.onNodeWithTag(tag).performTouchInput { click(centerRight) }
 
         rule.onNode(isSelectionHandle(Handle.Cursor)).performTouchInput {
             down(center)
             movePastSlopBy(Offset(0.1f, 0.1f))
         }
 
-        Truth.assertThat(getMagnifierCenterOffset(rule)).isEqualTo(
-            // x: drag threshold, y: line center(2nd line in view) + x: padding, y: padding
-            Offset(100f - 16f, 10f) + Offset(8f, 8f)
-        )
+        Truth.assertThat(getMagnifierCenterOffset(rule))
+            .isEqualTo(
+                // x: drag threshold, y: line center(2nd line in view) + x: padding, y: padding
+                Offset(100f - 16f, 10f) + Offset(8f, 8f)
+            )
     }
 
     // regression - When dragging to the final empty line, the magnifier appeared on the second
@@ -376,11 +338,12 @@
         rule.setTextFieldTestContent {
             Content(
                 text = "a\n\n",
-                modifier = Modifier
-                    // Center the text to give the magnifier lots of room to move.
-                    .fillMaxSize()
-                    .wrapContentSize()
-                    .testTag(tag),
+                modifier =
+                    Modifier
+                        // Center the text to give the magnifier lots of room to move.
+                        .fillMaxSize()
+                        .wrapContentSize()
+                        .testTag(tag),
                 onTextLayout = { textLayout = it }
             )
         }
@@ -398,30 +361,26 @@
         }
 
         // start selection at first character
-        rule.onNodeWithTag(tag).performTouchInput {
-            longPress(firstPressOffset)
-        }
+        rule.onNodeWithTag(tag).performTouchInput { longPress(firstPressOffset) }
         assertMagnifierAt(firstPressOffset)
 
-        fun getOffsetAtLine(line: Int): Offset = Offset(
-            x = firstPressOffset.x,
-            y = lerp(
-                start = textLayout.getLineTop(lineIndex = line),
-                stop = textLayout.getLineBottom(lineIndex = line),
-                fraction = 0.5f
+        fun getOffsetAtLine(line: Int): Offset =
+            Offset(
+                x = firstPressOffset.x,
+                y =
+                    lerp(
+                        start = textLayout.getLineTop(lineIndex = line),
+                        stop = textLayout.getLineBottom(lineIndex = line),
+                        fraction = 0.5f
+                    )
             )
-        )
 
         val secondOffset = getOffsetAtLine(1)
-        rule.onNodeWithTag(tag).performTouchInput {
-            moveTo(secondOffset)
-        }
+        rule.onNodeWithTag(tag).performTouchInput { moveTo(secondOffset) }
         assertMagnifierAt(Offset(0f, secondOffset.y))
 
         val thirdOffset = getOffsetAtLine(2)
-        rule.onNodeWithTag(tag).performTouchInput {
-            moveTo(thirdOffset)
-        }
+        rule.onNodeWithTag(tag).performTouchInput { moveTo(thirdOffset) }
         assertMagnifierAt(Offset(0f, thirdOffset.y))
     }
 
@@ -437,16 +396,20 @@
         lateinit var textLayout: TextLayoutResult
         rule.setTextFieldTestContent {
             Content(
-                text = """
+                text =
+                    """
                     $rtlWord $ltrWord
                     $ltrWord $rtlWord
                     $rtlWord $ltrWord
-                """.trimIndent().trim(),
-                modifier = Modifier
-                    // Center the text to give the magnifier lots of room to move.
-                    .fillMaxSize()
-                    .wrapContentHeight()
-                    .testTag(tag),
+                """
+                        .trimIndent()
+                        .trim(),
+                modifier =
+                    Modifier
+                        // Center the text to give the magnifier lots of room to move.
+                        .fillMaxSize()
+                        .wrapContentHeight()
+                        .testTag(tag),
                 onTextLayout = { textLayout = it }
             )
         }
@@ -471,9 +434,7 @@
 
         val secondLineCenterY = getCenterForLine(1)
         val secondOffset = Offset(farRightX, secondLineCenterY)
-        rule.onNodeWithTag(tag).performTouchInput {
-            moveTo(secondOffset)
-        }
+        rule.onNodeWithTag(tag).performTouchInput { moveTo(secondOffset) }
         rule.waitForIdle()
         Truth.assertWithMessage("Magnifier should not be shown")
             .that(getMagnifierCenterOffset(rule).isUnspecified)
@@ -481,9 +442,7 @@
 
         val lineRightX = textLayout.getLineRight(1)
         val thirdOffset = Offset(lineRightX + 1f, secondLineCenterY)
-        rule.onNodeWithTag(tag).performTouchInput {
-            moveTo(thirdOffset)
-        }
+        rule.onNodeWithTag(tag).performTouchInput { moveTo(thirdOffset) }
         rule.waitForIdle()
         val actual = getMagnifierCenterOffset(rule, requireSpecified = true) - placedPosition
         assertThatOffset(actual).equalsWithTolerance(Offset(lineRightX, secondLineCenterY))
@@ -497,23 +456,21 @@
         var screenSize = Size.Zero
         val dragDirection = if (layoutDirection == LayoutDirection.Rtl) -1f else 1f
         val directionVector = Offset(1f, 0f) * dragDirection
-        val fillerWord = if (layoutDirection == LayoutDirection.Ltr)
-            "aaaa"
-        else
-            "\u05D0\u05D1\u05D2\u05D3"
+        val fillerWord =
+            if (layoutDirection == LayoutDirection.Ltr) "aaaa" else "\u05D0\u05D1\u05D2\u05D3"
 
         val tag = "BasicTextField"
-        val state = TextFieldState(
-            "$fillerWord $fillerWord $fillerWord ".repeat(10),
-            initialSelection = TextRange.Zero
-        )
+        val state =
+            TextFieldState(
+                "$fillerWord $fillerWord $fillerWord ".repeat(10),
+                initialSelection = TextRange.Zero
+            )
 
         rule.setTextFieldTestContent {
             CompositionLocalProvider(LocalLayoutDirection provides layoutDirection) {
                 BasicTextField(
                     state = state,
-                    Modifier
-                        .fillMaxWidth()
+                    Modifier.fillMaxWidth()
                         .onSizeChanged { screenSize = it.toSize() }
                         .wrapContentSize()
                         .testTag(tag),
@@ -540,19 +497,18 @@
         val magnifierInitialPosition = getMagnifierCenterOffset(rule, requireSpecified = true)
 
         // Drag all the way past the end of the line.
-        rule.onNode(isSelectionHandle(handle))
-            .performTouchInput {
-                val delta = Offset(
+        rule.onNode(isSelectionHandle(handle)).performTouchInput {
+            val delta =
+                Offset(
                     x = screenSize.width * directionVector.x,
                     y = screenSize.height * directionVector.y
                 )
-                moveBy(delta)
-            }
+            moveBy(delta)
+        }
 
         val x = if (layoutDirection == LayoutDirection.Ltr) screenSize.width else 0f
-        Truth.assertThat(getMagnifierCenterOffset(rule)).isEqualTo(
-            Offset(x, magnifierInitialPosition.y)
-        )
+        Truth.assertThat(getMagnifierCenterOffset(rule))
+            .isEqualTo(Offset(x, magnifierInitialPosition.y))
     }
 
     /**
@@ -571,31 +527,30 @@
         rule.setTextFieldTestContent {
             Content(
                 text = "$word $word $word",
-                modifier = Modifier
-                    // Center the text to give the magnifier lots of room to move.
-                    .fillMaxSize()
-                    .wrapContentSize()
-                    .testTag(tag)
+                modifier =
+                    Modifier
+                        // Center the text to give the magnifier lots of room to move.
+                        .fillMaxSize()
+                        .wrapContentSize()
+                        .testTag(tag)
             )
         }
 
         // Initiate selection.
-        rule.onNodeWithTag(tag)
-            .performTouchInput {
-                down(center)
-                moveBy(Offset.Zero, delayMillis = viewConfiguration.longPressTimeoutMillis + 100)
-            }
+        rule.onNodeWithTag(tag).performTouchInput {
+            down(center)
+            moveBy(Offset.Zero, delayMillis = viewConfiguration.longPressTimeoutMillis + 100)
+        }
 
         // Magnifier should show after long-press starts.
         val magnifierInitialPosition = getMagnifierCenterOffset(rule, requireSpecified = true)
 
         // Drag horizontally - the magnifier should follow.
-        rule.onNodeWithTag(tag)
-            .performTouchInput {
-                // Don't need to worry about touch slop for this test since the drag starts as soon
-                // as the long click is detected.
-                moveBy(dragDistance * dragDirection)
-            }
+        rule.onNodeWithTag(tag).performTouchInput {
+            // Don't need to worry about touch slop for this test since the drag starts as soon
+            // as the long click is detected.
+            moveBy(dragDistance * dragDirection)
+        }
 
         // make the assertion without sending an `up` event which would cause an input session
         // to start and keyboard to show up.
@@ -604,18 +559,16 @@
     }
 
     private fun setupDragAndDropContent(): View {
-        val state = TextFieldState(
-            "aaaa",
-            initialSelection = TextRange.Zero
-        )
+        val state = TextFieldState("aaaa", initialSelection = TextRange.Zero)
         var view: View? = null
         rule.setContent { // Do not use setTextFieldTestContent for DnD tests.
             view = LocalView.current
             CompositionLocalProvider(
                 LocalDensity provides Density(1f, 1f),
-                LocalWindowInfo provides object : WindowInfo {
-                    override val isWindowFocused = false
-                }
+                LocalWindowInfo provides
+                    object : WindowInfo {
+                        override val isWindowFocused = false
+                    }
             ) {
                 BasicTextField(
                     state = state,
diff --git a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/input/internal/selection/TextFieldSelectionHandlesTest.kt b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/input/internal/selection/TextFieldSelectionHandlesTest.kt
index aae14e4..419412c 100644
--- a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/input/internal/selection/TextFieldSelectionHandlesTest.kt
+++ b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/input/internal/selection/TextFieldSelectionHandlesTest.kt
@@ -86,8 +86,7 @@
 @LargeTest
 class TextFieldSelectionHandlesTest : FocusedWindowTest {
 
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
     private lateinit var state: TextFieldState
 
@@ -103,9 +102,7 @@
             BasicTextField(
                 state,
                 textStyle = TextStyle(fontSize = fontSize, fontFamily = TEST_FONT_FAMILY),
-                modifier = Modifier
-                    .testTag(TAG)
-                    .width(100.dp)
+                modifier = Modifier.testTag(TAG).width(100.dp)
             )
         }
 
@@ -113,35 +110,34 @@
     }
 
     @Test
-    fun selectionHandles_haveMinimumTouchSizeArea() = with(rule.density) {
-        state = TextFieldState("hello, world", initialSelection = TextRange(2, 5))
-        rule.setContent {
-            BasicTextField(
-                state,
-                textStyle = TextStyle(fontSize = fontSize, fontFamily = TEST_FONT_FAMILY),
-                modifier = Modifier
-                    .testTag(TAG)
-                    .width(100.dp)
-            )
-        }
+    fun selectionHandles_haveMinimumTouchSizeArea() =
+        with(rule.density) {
+            state = TextFieldState("hello, world", initialSelection = TextRange(2, 5))
+            rule.setContent {
+                BasicTextField(
+                    state,
+                    textStyle = TextStyle(fontSize = fontSize, fontFamily = TEST_FONT_FAMILY),
+                    modifier = Modifier.testTag(TAG).width(100.dp)
+                )
+            }
 
-        focusAndWait()
+            focusAndWait()
 
-        var actualStartBottomRight = Offset.Zero
-        var actualEndBottomRight = Offset.Zero
-        rule.onNode(isSelectionHandle(Handle.SelectionStart)).performTouchInput {
-            actualStartBottomRight = bottomRight
-        }
-        rule.onNode(isSelectionHandle(Handle.SelectionEnd)).performTouchInput {
-            actualEndBottomRight = bottomRight
-        }
+            var actualStartBottomRight = Offset.Zero
+            var actualEndBottomRight = Offset.Zero
+            rule.onNode(isSelectionHandle(Handle.SelectionStart)).performTouchInput {
+                actualStartBottomRight = bottomRight
+            }
+            rule.onNode(isSelectionHandle(Handle.SelectionEnd)).performTouchInput {
+                actualEndBottomRight = bottomRight
+            }
 
-        val expectedBottomRight = Offset(40.dp.toPx(), 40.dp.toPx())
-        assertThat(actualStartBottomRight.x).isWithin(1f).of(expectedBottomRight.x)
-        assertThat(actualStartBottomRight.y).isWithin(1f).of(expectedBottomRight.y)
-        assertThat(actualEndBottomRight.x).isWithin(1f).of(expectedBottomRight.x)
-        assertThat(actualEndBottomRight.y).isWithin(1f).of(expectedBottomRight.y)
-    }
+            val expectedBottomRight = Offset(40.dp.toPx(), 40.dp.toPx())
+            assertThat(actualStartBottomRight.x).isWithin(1f).of(expectedBottomRight.x)
+            assertThat(actualStartBottomRight.y).isWithin(1f).of(expectedBottomRight.y)
+            assertThat(actualEndBottomRight.x).isWithin(1f).of(expectedBottomRight.x)
+            assertThat(actualEndBottomRight.y).isWithin(1f).of(expectedBottomRight.y)
+        }
 
     @Test
     fun selectionHandles_appears_whenFieldGetsFocused() {
@@ -150,9 +146,7 @@
             BasicTextField(
                 state,
                 textStyle = TextStyle(fontSize = fontSize, fontFamily = TEST_FONT_FAMILY),
-                modifier = Modifier
-                    .testTag(TAG)
-                    .width(100.dp)
+                modifier = Modifier.testTag(TAG).width(100.dp)
             )
         }
 
@@ -166,26 +160,18 @@
         val focusRequester = FocusRequester()
         rule.setTextFieldTestContent {
             Column {
-                Box(
-                    Modifier
-                        .size(100.dp)
-                        .focusRequester(focusRequester)
-                        .focusable())
+                Box(Modifier.size(100.dp).focusRequester(focusRequester).focusable())
                 BasicTextField(
                     state,
                     textStyle = TextStyle(fontSize = fontSize, fontFamily = TEST_FONT_FAMILY),
-                    modifier = Modifier
-                        .testTag(TAG)
-                        .width(100.dp)
+                    modifier = Modifier.testTag(TAG).width(100.dp)
                 )
             }
         }
 
         focusAndWait()
         assertHandlesDisplayed()
-        rule.runOnIdle {
-            focusRequester.requestFocus()
-        }
+        rule.runOnIdle { focusRequester.requestFocus() }
         assertHandlesNotExist()
     }
 
@@ -195,12 +181,13 @@
         rule.setTextFieldTestContent {
             BasicTextField(
                 state,
-                textStyle = TextStyle(
-                    fontSize = fontSize,
-                    fontFamily = TEST_FONT_FAMILY,
-                    textAlign = TextAlign.End,
-                    letterSpacing = 1.2.sp,
-                ),
+                textStyle =
+                    TextStyle(
+                        fontSize = fontSize,
+                        fontFamily = TEST_FONT_FAMILY,
+                        textAlign = TextAlign.End,
+                        letterSpacing = 1.2.sp,
+                    ),
                 modifier = Modifier.testTag(TAG).fillMaxWidth()
             )
         }
@@ -213,10 +200,11 @@
     fun textField_noSelectionHandles_whenWindowLosesFocus() {
         state = TextFieldState("hello, world", initialSelection = TextRange(2, 5))
         val focusWindow = mutableStateOf(true)
-        val windowInfo = object : WindowInfo {
-            override val isWindowFocused: Boolean
-                get() = focusWindow.value
-        }
+        val windowInfo =
+            object : WindowInfo {
+                override val isWindowFocused: Boolean
+                    get() = focusWindow.value
+            }
 
         rule.setContent {
             CompositionLocalProvider(LocalWindowInfo provides windowInfo) {
@@ -243,10 +231,11 @@
     fun textField_redisplaysSelectionHandlesAndToolbar_whenWindowRegainsFocus() {
         state = TextFieldState("hello, world", initialSelection = TextRange(2, 5))
         val focusWindow = mutableStateOf(true)
-        val windowInfo = object : WindowInfo {
-            override val isWindowFocused: Boolean
-                get() = focusWindow.value
-        }
+        val windowInfo =
+            object : WindowInfo {
+                override val isWindowFocused: Boolean
+                    get() = focusWindow.value
+            }
 
         rule.setContent {
             CompositionLocalProvider(LocalWindowInfo provides windowInfo) {
@@ -283,27 +272,19 @@
             BasicTextField(
                 state,
                 textStyle = TextStyle(fontSize = fontSize, fontFamily = TEST_FONT_FAMILY),
-                modifier = Modifier
-                    .testTag(TAG)
-                    .width(100.dp)
+                modifier = Modifier.testTag(TAG).width(100.dp)
             )
         }
 
         focusAndWait()
 
         with(rule.onNode(isSelectionHandle(Handle.SelectionStart))) {
-            assertHandlePositionMatches(
-                (2 * fontSize.value).dp,
-                fontSize.value.dp
-            )
+            assertHandlePositionMatches((2 * fontSize.value).dp, fontSize.value.dp)
             assertHandleAnchorMatches(SelectionHandleAnchor.Left)
         }
 
         with(rule.onNode(isSelectionHandle(Handle.SelectionEnd))) {
-            assertHandlePositionMatches(
-                (5 * fontSize.value).dp,
-                fontSize.value.dp
-            )
+            assertHandlePositionMatches((5 * fontSize.value).dp, fontSize.value.dp)
             assertHandleAnchorMatches(SelectionHandleAnchor.Right)
         }
     }
@@ -316,27 +297,19 @@
             BasicTextField(
                 state,
                 textStyle = TextStyle(fontSize = fontSize, fontFamily = TEST_FONT_FAMILY),
-                modifier = Modifier
-                    .testTag(TAG)
-                    .width(100.dp)
+                modifier = Modifier.testTag(TAG).width(100.dp)
             )
         }
 
         focusAndWait()
 
         with(rule.onNode(isSelectionHandle(Handle.SelectionStart))) {
-            assertHandlePositionMatches(
-                (1 * fontSize.value).dp,
-                fontSize.value.dp
-            )
+            assertHandlePositionMatches((1 * fontSize.value).dp, fontSize.value.dp)
             assertHandleAnchorMatches(SelectionHandleAnchor.Left)
         }
 
         with(rule.onNode(isSelectionHandle(Handle.SelectionEnd))) {
-            assertHandlePositionMatches(
-                (5 * fontSize.value).dp,
-                fontSize.value.dp
-            )
+            assertHandlePositionMatches((5 * fontSize.value).dp, fontSize.value.dp)
             assertHandleAnchorMatches(SelectionHandleAnchor.Left)
         }
     }
@@ -350,9 +323,7 @@
                 state,
                 textStyle = TextStyle(fontSize = fontSize, fontFamily = TEST_FONT_FAMILY),
                 lineLimits = TextFieldLineLimits.SingleLine,
-                modifier = Modifier
-                    .testTag(TAG)
-                    .width(100.dp)
+                modifier = Modifier.testTag(TAG).width(100.dp)
             )
         }
 
@@ -361,15 +332,11 @@
 
         rule.onNodeWithTag(TAG).performTouchInput { swipeLeft() }
         assertHandlesNotExist()
-        rule.runOnIdle {
-            assertThat(state.selection).isEqualTo(TextRange(1, 2))
-        }
+        rule.runOnIdle { assertThat(state.selection).isEqualTo(TextRange(1, 2)) }
 
         rule.onNodeWithTag(TAG).performTouchInput { swipeRight() }
         assertHandlesDisplayed()
-        rule.runOnIdle {
-            assertThat(state.selection).isEqualTo(TextRange(1, 2))
-        }
+        rule.runOnIdle { assertThat(state.selection).isEqualTo(TextRange(1, 2)) }
     }
 
     @Test
@@ -381,30 +348,20 @@
                 state,
                 textStyle = TextStyle(fontSize = fontSize, fontFamily = TEST_FONT_FAMILY),
                 lineLimits = TextFieldLineLimits.MultiLine(maxHeightInLines = 2),
-                modifier = Modifier
-                    .testTag(TAG)
-                    .width(100.dp)
+                modifier = Modifier.testTag(TAG).width(100.dp)
             )
         }
 
         focusAndWait()
         assertHandlesDisplayed()
 
-        rule.onNodeWithTag(TAG).performTouchInput {
-            swipeUp()
-        }
+        rule.onNodeWithTag(TAG).performTouchInput { swipeUp() }
         assertHandlesNotExist()
-        rule.runOnIdle {
-            assertThat(state.selection).isEqualTo(TextRange(1, 2))
-        }
+        rule.runOnIdle { assertThat(state.selection).isEqualTo(TextRange(1, 2)) }
 
-        rule.onNodeWithTag(TAG).performTouchInput {
-            swipeDown()
-        }
+        rule.onNodeWithTag(TAG).performTouchInput { swipeDown() }
         assertHandlesDisplayed()
-        rule.runOnIdle {
-            assertThat(state.selection).isEqualTo(TextRange(1, 2))
-        }
+        rule.runOnIdle { assertThat(state.selection).isEqualTo(TextRange(1, 2)) }
     }
 
     @Test
@@ -413,42 +370,31 @@
         val containerTag = "container"
         state = TextFieldState("hello", initialSelection = TextRange(1, 2))
         rule.setTextFieldTestContent {
-            Row(modifier = Modifier
-                .width(200.dp)
-                .horizontalScroll(rememberScrollState())
-                .testTag(containerTag)
+            Row(
+                modifier =
+                    Modifier.width(200.dp)
+                        .horizontalScroll(rememberScrollState())
+                        .testTag(containerTag)
             ) {
                 BasicTextField(
                     state,
                     textStyle = TextStyle(fontSize = fontSize, fontFamily = TEST_FONT_FAMILY),
-                    modifier = Modifier
-                        .testTag(TAG)
-                        .width(100.dp)
+                    modifier = Modifier.testTag(TAG).width(100.dp)
                 )
-                Box(modifier = Modifier
-                    .height(12.dp)
-                    .width(400.dp))
+                Box(modifier = Modifier.height(12.dp).width(400.dp))
             }
         }
 
         focusAndWait()
         assertHandlesDisplayed()
 
-        rule.onNodeWithTag(containerTag).performTouchInput {
-            swipeLeft()
-        }
+        rule.onNodeWithTag(containerTag).performTouchInput { swipeLeft() }
         assertHandlesNotExist()
-        rule.runOnIdle {
-            assertThat(state.selection).isEqualTo(TextRange(1, 2))
-        }
+        rule.runOnIdle { assertThat(state.selection).isEqualTo(TextRange(1, 2)) }
 
-        rule.onNodeWithTag(containerTag).performTouchInput {
-            swipeRight()
-        }
+        rule.onNodeWithTag(containerTag).performTouchInput { swipeRight() }
         assertHandlesDisplayed()
-        rule.runOnIdle {
-            assertThat(state.selection).isEqualTo(TextRange(1, 2))
-        }
+        rule.runOnIdle { assertThat(state.selection).isEqualTo(TextRange(1, 2)) }
     }
 
     @Test
@@ -457,42 +403,31 @@
         val containerTag = "container"
         state = TextFieldState("hello", initialSelection = TextRange(1, 2))
         rule.setTextFieldTestContent {
-            Column(modifier = Modifier
-                .height(200.dp)
-                .verticalScroll(rememberScrollState())
-                .testTag(containerTag)
+            Column(
+                modifier =
+                    Modifier.height(200.dp)
+                        .verticalScroll(rememberScrollState())
+                        .testTag(containerTag)
             ) {
                 BasicTextField(
                     state,
                     textStyle = TextStyle(fontSize = fontSize, fontFamily = TEST_FONT_FAMILY),
-                    modifier = Modifier
-                        .testTag(TAG)
-                        .height(100.dp)
+                    modifier = Modifier.testTag(TAG).height(100.dp)
                 )
-                Box(modifier = Modifier
-                    .width(12.dp)
-                    .height(400.dp))
+                Box(modifier = Modifier.width(12.dp).height(400.dp))
             }
         }
 
         focusAndWait()
         assertHandlesDisplayed()
 
-        rule.onNodeWithTag(containerTag).performTouchInput {
-            swipeUp()
-        }
+        rule.onNodeWithTag(containerTag).performTouchInput { swipeUp() }
         assertHandlesNotExist()
-        rule.runOnIdle {
-            assertThat(state.selection).isEqualTo(TextRange(1, 2))
-        }
+        rule.runOnIdle { assertThat(state.selection).isEqualTo(TextRange(1, 2)) }
 
-        rule.onNodeWithTag(containerTag).performTouchInput {
-            swipeDown()
-        }
+        rule.onNodeWithTag(containerTag).performTouchInput { swipeDown() }
         assertHandlesDisplayed()
-        rule.runOnIdle {
-            assertThat(state.selection).isEqualTo(TextRange(1, 2))
-        }
+        rule.runOnIdle { assertThat(state.selection).isEqualTo(TextRange(1, 2)) }
     }
 
     @Test
@@ -502,18 +437,14 @@
             BasicTextField(
                 state,
                 textStyle = TextStyle(fontSize = fontSize, fontFamily = TEST_FONT_FAMILY),
-                modifier = Modifier
-                    .testTag(TAG)
-                    .width(200.dp)
+                modifier = Modifier.testTag(TAG).width(200.dp)
             )
         }
 
         focusAndWait()
 
         swipeToLeft(Handle.SelectionStart, fontSizePx * 4)
-        rule.runOnIdle {
-            assertThat(state.selection).isEqualTo(TextRange(0, 7))
-        }
+        rule.runOnIdle { assertThat(state.selection).isEqualTo(TextRange(0, 7)) }
     }
 
     @Test
@@ -523,18 +454,14 @@
             BasicTextField(
                 state,
                 textStyle = TextStyle(fontSize = fontSize, fontFamily = TEST_FONT_FAMILY),
-                modifier = Modifier
-                    .testTag(TAG)
-                    .width(200.dp)
+                modifier = Modifier.testTag(TAG).width(200.dp)
             )
         }
 
         focusAndWait()
 
         swipeToRight(Handle.SelectionEnd, fontSizePx * 4)
-        rule.runOnIdle {
-            assertThat(state.selection).isEqualTo(TextRange(4, 11))
-        }
+        rule.runOnIdle { assertThat(state.selection).isEqualTo(TextRange(4, 11)) }
     }
 
     @Test
@@ -544,9 +471,7 @@
             BasicTextField(
                 state,
                 textStyle = TextStyle(fontSize = fontSize, fontFamily = TEST_FONT_FAMILY),
-                modifier = Modifier
-                    .testTag(TAG)
-                    .width(200.dp)
+                modifier = Modifier.testTag(TAG).width(200.dp)
             )
         }
 
@@ -555,9 +480,7 @@
         rule.onNodeWithTag(TAG).performTouchInput {
             doubleClick(Offset(fontSizePx * 5, fontSizePx / 2)) // middle word
         }
-        rule.runOnIdle {
-            assertThat(state.selection).isEqualTo(TextRange(4, 7))
-        }
+        rule.runOnIdle { assertThat(state.selection).isEqualTo(TextRange(4, 7)) }
     }
 
     @SdkSuppress(minSdkVersion = 23)
@@ -568,9 +491,7 @@
             BasicTextField(
                 state,
                 textStyle = TextStyle(fontSize = fontSize, fontFamily = TEST_FONT_FAMILY),
-                modifier = Modifier
-                    .testTag(TAG)
-                    .width(200.dp)
+                modifier = Modifier.testTag(TAG).width(200.dp)
             )
         }
 
@@ -598,9 +519,7 @@
                 textStyle = TextStyle(fontSize = fontSize, fontFamily = TEST_FONT_FAMILY),
                 lineLimits = TextFieldLineLimits.SingleLine,
                 scrollState = scrollState,
-                modifier = Modifier
-                    .testTag(TAG)
-                    .width(100.dp)
+                modifier = Modifier.testTag(TAG).width(100.dp)
             )
         }
 
@@ -608,12 +527,8 @@
         scope.launch { scrollState.scrollTo(scrollState.maxValue) } // scroll to the most right
         focusAndWait() // selection handles show up
 
-        repeat(80) {
-            swipeToLeft(Handle.SelectionStart, fontSizePx)
-        }
-        rule.runOnIdle {
-            assertThat(state.selection).isEqualTo(TextRange(0, 80))
-        }
+        repeat(80) { swipeToLeft(Handle.SelectionStart, fontSizePx) }
+        rule.runOnIdle { assertThat(state.selection).isEqualTo(TextRange(0, 80)) }
     }
 
     @Test
@@ -628,9 +543,7 @@
                 textStyle = TextStyle(fontSize = fontSize, fontFamily = TEST_FONT_FAMILY),
                 lineLimits = TextFieldLineLimits.MultiLine(maxHeightInLines = 3),
                 scrollState = scrollState,
-                modifier = Modifier
-                    .testTag(TAG)
-                    .width(50.dp)
+                modifier = Modifier.testTag(TAG).width(50.dp)
             )
         }
 
@@ -641,9 +554,7 @@
         swipeUp(Handle.SelectionStart, scrollState.maxValue.toFloat() * 2)
         // make sure that we also swipe to start on the first line
         swipeToLeft(Handle.SelectionStart, fontSizePx * 10)
-        rule.runOnIdle {
-            assertThat(state.selection).isEqualTo(TextRange(0, 80))
-        }
+        rule.runOnIdle { assertThat(state.selection).isEqualTo(TextRange(0, 80)) }
     }
 
     @Test
@@ -654,21 +565,15 @@
                 state,
                 textStyle = TextStyle(fontSize = fontSize, fontFamily = TEST_FONT_FAMILY),
                 lineLimits = TextFieldLineLimits.SingleLine,
-                modifier = Modifier
-                    .testTag(TAG)
-                    .width(100.dp)
+                modifier = Modifier.testTag(TAG).width(100.dp)
             )
         }
 
         rule.waitForIdle()
         focusAndWait() // selection handles show up
 
-        repeat(80) {
-            swipeToRight(Handle.SelectionEnd, fontSizePx)
-        }
-        rule.runOnIdle {
-            assertThat(state.selection).isEqualTo(TextRange(0, 80))
-        }
+        repeat(80) { swipeToRight(Handle.SelectionEnd, fontSizePx) }
+        rule.runOnIdle { assertThat(state.selection).isEqualTo(TextRange(0, 80)) }
     }
 
     @Test
@@ -681,9 +586,7 @@
                 textStyle = TextStyle(fontSize = fontSize, fontFamily = TEST_FONT_FAMILY),
                 lineLimits = TextFieldLineLimits.MultiLine(maxHeightInLines = 3),
                 onTextLayout = { layoutResult = it },
-                modifier = Modifier
-                    .testTag(TAG)
-                    .width(100.dp)
+                modifier = Modifier.testTag(TAG).width(100.dp)
             )
         }
 
@@ -695,9 +598,7 @@
             swipeDown(Handle.SelectionEnd, layoutResult.size.height.toFloat())
             swipeToRight(Handle.SelectionEnd, layoutResult.size.width.toFloat())
         }
-        rule.runOnIdle {
-            assertThat(state.selection).isEqualTo(TextRange(0, 80))
-        }
+        rule.runOnIdle { assertThat(state.selection).isEqualTo(TextRange(0, 80)) }
     }
 
     @Test
@@ -707,9 +608,7 @@
             BasicTextField(
                 state,
                 textStyle = TextStyle(fontSize = fontSize, fontFamily = TEST_FONT_FAMILY),
-                modifier = Modifier
-                    .testTag(TAG)
-                    .width(200.dp)
+                modifier = Modifier.testTag(TAG).width(200.dp)
             )
         }
 
@@ -729,9 +628,7 @@
             BasicTextField(
                 state,
                 textStyle = TextStyle(fontSize = fontSize, fontFamily = TEST_FONT_FAMILY),
-                modifier = Modifier
-                    .testTag(TAG)
-                    .width(200.dp)
+                modifier = Modifier.testTag(TAG).width(200.dp)
             )
         }
 
@@ -751,9 +648,7 @@
             BasicTextField(
                 state,
                 textStyle = TextStyle(fontSize = fontSize, fontFamily = TEST_FONT_FAMILY),
-                modifier = Modifier
-                    .testTag(TAG)
-                    .width(200.dp)
+                modifier = Modifier.testTag(TAG).width(200.dp)
             )
         }
 
@@ -773,9 +668,7 @@
             BasicTextField(
                 state,
                 textStyle = TextStyle(fontSize = fontSize, fontFamily = TEST_FONT_FAMILY),
-                modifier = Modifier
-                    .testTag(TAG)
-                    .width(200.dp)
+                modifier = Modifier.testTag(TAG).width(200.dp)
             )
         }
 
@@ -795,18 +688,14 @@
             BasicTextField(
                 state,
                 textStyle = TextStyle(fontSize = fontSize, fontFamily = TEST_FONT_FAMILY),
-                modifier = Modifier
-                    .testTag(TAG)
-                    .width(200.dp)
+                modifier = Modifier.testTag(TAG).width(200.dp)
             )
         }
 
         focusAndWait()
 
         swipeToRight(Handle.SelectionStart, fontSizePx * 7)
-        rule.runOnIdle {
-            assertThat(state.selection).isEqualTo(TextRange(11, 7))
-        }
+        rule.runOnIdle { assertThat(state.selection).isEqualTo(TextRange(11, 7)) }
     }
 
     @Test
@@ -816,18 +705,14 @@
             BasicTextField(
                 state,
                 textStyle = TextStyle(fontSize = fontSize, fontFamily = TEST_FONT_FAMILY),
-                modifier = Modifier
-                    .testTag(TAG)
-                    .width(200.dp)
+                modifier = Modifier.testTag(TAG).width(200.dp)
             )
         }
 
         focusAndWait()
 
         swipeToLeft(Handle.SelectionEnd, fontSizePx * 7)
-        rule.runOnIdle {
-            assertThat(state.selection).isEqualTo(TextRange(4, 0))
-        }
+        rule.runOnIdle { assertThat(state.selection).isEqualTo(TextRange(4, 0)) }
     }
 
     @Test
diff --git a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/input/internal/selection/TextFieldSelectionOnBackTest.kt b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/input/internal/selection/TextFieldSelectionOnBackTest.kt
index 2c5062b..e680d56 100644
--- a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/input/internal/selection/TextFieldSelectionOnBackTest.kt
+++ b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/input/internal/selection/TextFieldSelectionOnBackTest.kt
@@ -52,30 +52,20 @@
 @RunWith(AndroidJUnit4::class)
 class TextFieldSelectionOnBackTest : FocusedWindowTest {
 
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
     private val Tag = "BasicTextField"
 
     @Test
     fun whenBackPressed_andReleased_textFieldClearsSelection() {
         val state = TextFieldState("hello", TextRange(0, 0))
-        rule.setContent {
-            BasicTextField(
-                state,
-                Modifier
-                    .testTag(Tag)
-                    .wrapContentSize()
-            )
-        }
+        rule.setContent { BasicTextField(state, Modifier.testTag(Tag).wrapContentSize()) }
         val textNode = rule.onNodeWithTag(Tag)
         textNode.performTextInputSelection(TextRange(0, 3))
         rule.waitForIdle()
         textNode.performKeyInput { pressKey(Key.Back) }
         val expected = TextRange(3, 3)
-        rule.runOnIdle {
-            assertThat(state.selection).isEqualTo(expected)
-        }
+        rule.runOnIdle { assertThat(state.selection).isEqualTo(expected) }
     }
 
     @Test
@@ -85,15 +75,12 @@
         rule.setContent {
             BasicTextField(
                 state,
-                Modifier
-                    .testTag(Tag)
-                    .wrapContentSize()
-                    .onKeyEvent {
-                        if (it.type == KeyEventType.KeyUp && it.key == Key.Back) {
-                            backPressed++
-                        }
-                        false
+                Modifier.testTag(Tag).wrapContentSize().onKeyEvent {
+                    if (it.type == KeyEventType.KeyUp && it.key == Key.Back) {
+                        backPressed++
                     }
+                    false
+                }
             )
         }
         val textNode = rule.onNodeWithTag(Tag)
@@ -110,23 +97,14 @@
     @Test
     fun whenBackPressed_coreTextFieldRetainsSelection() {
         val state = TextFieldState("hello", TextRange(0, 0))
-        rule.setContent {
-            BasicTextField(
-                state,
-                Modifier
-                    .testTag(Tag)
-                    .wrapContentSize()
-            )
-        }
+        rule.setContent { BasicTextField(state, Modifier.testTag(Tag).wrapContentSize()) }
         val expected = TextRange(0, 3)
         val textNode = rule.onNodeWithTag(Tag)
         textNode.performTextInputSelection(expected)
         rule.waitForIdle()
         // should have no effect
         textNode.performKeyInput { keyDown(Key.Back) }
-        rule.runOnIdle {
-            assertThat(state.selection).isEqualTo(expected)
-        }
+        rule.runOnIdle { assertThat(state.selection).isEqualTo(expected) }
     }
 
     @Test
@@ -138,14 +116,12 @@
             softwareKeyboardController = LocalSoftwareKeyboardController.current
             BasicTextField(
                 state,
-                Modifier
-                    .testTag(Tag)
-                    .onKeyEvent {
-                        if (it.type == KeyEventType.KeyUp && it.key == Key.Back) {
-                            backPressed++
-                        }
-                        false
+                Modifier.testTag(Tag).onKeyEvent {
+                    if (it.type == KeyEventType.KeyUp && it.key == Key.Back) {
+                        backPressed++
                     }
+                    false
+                }
             )
         }
 
@@ -156,17 +132,13 @@
 
             // Hide the keyboard before pressing back, since the first back should be consumed by
             // the keyboard.
-            rule.runOnUiThread {
-                softwareKeyboardController!!.hide()
-            }
+            rule.runOnUiThread { softwareKeyboardController!!.hide() }
 
             // Press back.
             performKeyInput { pressKey(Key.Back) }
 
             // Ensure back event was propagated up past the text field.
-            rule.runOnIdle {
-                assertThat(backPressed).isEqualTo(1)
-            }
+            rule.runOnIdle { assertThat(backPressed).isEqualTo(1) }
         }
     }
 }
diff --git a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/input/internal/selection/TextFieldTextToolbarTest.kt b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/input/internal/selection/TextFieldTextToolbarTest.kt
index b6ee1c4..160980c 100644
--- a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/input/internal/selection/TextFieldTextToolbarTest.kt
+++ b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/input/internal/selection/TextFieldTextToolbarTest.kt
@@ -98,8 +98,7 @@
 @LargeTest
 class TextFieldTextToolbarTest : FocusedWindowTest {
 
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
     val fontSize = 10.sp
 
@@ -118,13 +117,9 @@
         setupContent(state, textToolbar)
 
         rule.onNodeWithTag(TAG).performTouchInput { click(Offset(fontSizePx * 2, fontSizePx / 2)) }
-        rule.runOnIdle {
-            assertThat(textToolbar.status).isEqualTo(TextToolbarStatus.Hidden)
-        }
+        rule.runOnIdle { assertThat(textToolbar.status).isEqualTo(TextToolbarStatus.Hidden) }
         rule.onNode(isSelectionHandle(Handle.Cursor)).performClick()
-        rule.runOnIdle {
-            assertThat(textToolbar.status).isEqualTo(TextToolbarStatus.Shown)
-        }
+        rule.runOnIdle { assertThat(textToolbar.status).isEqualTo(TextToolbarStatus.Shown) }
     }
 
     @Test
@@ -135,13 +130,9 @@
 
         rule.onNodeWithTag(TAG).performTouchInput { click(Offset(fontSizePx * 2, fontSizePx / 2)) }
         rule.onNode(isSelectionHandle(Handle.Cursor)).performClick()
-        rule.runOnIdle {
-            assertThat(textToolbar.status).isEqualTo(TextToolbarStatus.Shown)
-        }
+        rule.runOnIdle { assertThat(textToolbar.status).isEqualTo(TextToolbarStatus.Shown) }
         rule.onNode(isSelectionHandle(Handle.Cursor)).performClick()
-        rule.runOnIdle {
-            assertThat(textToolbar.status).isEqualTo(TextToolbarStatus.Hidden)
-        }
+        rule.runOnIdle { assertThat(textToolbar.status).isEqualTo(TextToolbarStatus.Hidden) }
     }
 
     @Test
@@ -166,18 +157,14 @@
 
         rule.onNodeWithTag(TAG).performTouchInput { click(Offset(fontSizePx * 2, fontSizePx / 2)) }
         rule.onNode(isSelectionHandle(Handle.Cursor)).performClick()
-        rule.runOnIdle {
-            assertThat(textToolbar.status).isEqualTo(TextToolbarStatus.Shown)
-        }
+        rule.runOnIdle { assertThat(textToolbar.status).isEqualTo(TextToolbarStatus.Shown) }
 
         state.edit {
             append(" World!")
             placeCursorAtEnd()
         }
 
-        rule.runOnIdle {
-            assertThat(textToolbar.status).isEqualTo(TextToolbarStatus.Hidden)
-        }
+        rule.runOnIdle { assertThat(textToolbar.status).isEqualTo(TextToolbarStatus.Hidden) }
     }
 
     @Test
@@ -203,11 +190,7 @@
         }
 
         with(rule.onNodeWithTag(TAG)) {
-            performKeyInput {
-                withKeyDown(Key.CtrlLeft) {
-                    pressKey(Key.A)
-                }
-            }
+            performKeyInput { withKeyDown(Key.CtrlLeft) { pressKey(Key.A) } }
         }
 
         rule.runOnIdle {
@@ -222,13 +205,9 @@
         val state = TextFieldState("Hello")
         setupContent(state, textToolbar)
 
-        with(rule.onNodeWithTag(TAG)) {
-            requestFocus()
-        }
+        with(rule.onNodeWithTag(TAG)) { requestFocus() }
 
-        rule.runOnIdle {
-            state.edit { selectAll() }
-        }
+        rule.runOnIdle { state.edit { selectAll() } }
 
         rule.runOnIdle {
             assertThat(state.selection).isEqualTo(TextRange(0, 5))
@@ -261,9 +240,7 @@
 
         with(rule.onNodeWithTag(TAG)) {
             requestFocus()
-            performSemanticsAction(SemanticsActions.SetSelection) {
-                it(0, 5, false)
-            }
+            performSemanticsAction(SemanticsActions.SetSelection) { it(0, 5, false) }
         }
 
         rule.runOnIdle {
@@ -280,15 +257,11 @@
 
         rule.onNodeWithTag(TAG).performTouchInput { click(Offset(fontSizePx * 2, fontSizePx / 2)) }
         rule.onNode(isSelectionHandle(Handle.Cursor)).performClick()
-        rule.runOnIdle {
-            assertThat(textToolbar.status).isEqualTo(TextToolbarStatus.Shown)
-        }
+        rule.runOnIdle { assertThat(textToolbar.status).isEqualTo(TextToolbarStatus.Shown) }
 
         rule.onNodeWithTag(TAG).performTextInput(" World!")
 
-        rule.runOnIdle {
-            assertThat(textToolbar.status).isEqualTo(TextToolbarStatus.Hidden)
-        }
+        rule.runOnIdle { assertThat(textToolbar.status).isEqualTo(TextToolbarStatus.Hidden) }
     }
 
     @Test
@@ -299,21 +272,15 @@
 
         rule.onNodeWithTag(TAG).performTouchInput { click(Offset(fontSizePx * 2, fontSizePx / 2)) }
         rule.onNode(isSelectionHandle(Handle.Cursor)).performClick()
-        rule.runOnIdle {
-            assertThat(textToolbar.status).isEqualTo(TextToolbarStatus.Shown)
-        }
+        rule.runOnIdle { assertThat(textToolbar.status).isEqualTo(TextToolbarStatus.Shown) }
 
         enabled = false
 
-        rule.runOnIdle {
-            assertThat(textToolbar.status).isEqualTo(TextToolbarStatus.Hidden)
-        }
+        rule.runOnIdle { assertThat(textToolbar.status).isEqualTo(TextToolbarStatus.Hidden) }
 
         enabled = true
 
-        rule.runOnIdle {
-            assertThat(textToolbar.status).isEqualTo(TextToolbarStatus.Hidden)
-        }
+        rule.runOnIdle { assertThat(textToolbar.status).isEqualTo(TextToolbarStatus.Hidden) }
     }
 
     @Test
@@ -324,21 +291,15 @@
 
         rule.onNodeWithTag(TAG).requestFocus()
         rule.onNodeWithTag(TAG).performTextInputSelectionShowingToolbar(TextRange(2, 4))
-        rule.runOnIdle {
-            assertThat(textToolbar.status).isEqualTo(TextToolbarStatus.Shown)
-        }
+        rule.runOnIdle { assertThat(textToolbar.status).isEqualTo(TextToolbarStatus.Shown) }
 
         enabled = false
 
-        rule.runOnIdle {
-            assertThat(textToolbar.status).isEqualTo(TextToolbarStatus.Hidden)
-        }
+        rule.runOnIdle { assertThat(textToolbar.status).isEqualTo(TextToolbarStatus.Hidden) }
 
         enabled = true
 
-        rule.runOnIdle {
-            assertThat(textToolbar.status).isEqualTo(TextToolbarStatus.Hidden)
-        }
+        rule.runOnIdle { assertThat(textToolbar.status).isEqualTo(TextToolbarStatus.Hidden) }
     }
 
     @OptIn(ExperimentalTestApi::class)
@@ -351,17 +312,11 @@
         rule.onNodeWithTag(TAG).performTouchInput { click(Offset(fontSizePx * 2, fontSizePx / 2)) }
         rule.onNode(isSelectionHandle(Handle.Cursor)).performClick()
 
-        rule.runOnIdle {
-            assertThat(textToolbar.status).isEqualTo(TextToolbarStatus.Shown)
-        }
+        rule.runOnIdle { assertThat(textToolbar.status).isEqualTo(TextToolbarStatus.Shown) }
 
-        rule.onNodeWithTag(TAG).performKeyInput {
-            pressKey(Key.W)
-        }
+        rule.onNodeWithTag(TAG).performKeyInput { pressKey(Key.W) }
 
-        rule.runOnIdle {
-            assertThat(textToolbar.status).isEqualTo(TextToolbarStatus.Hidden)
-        }
+        rule.runOnIdle { assertThat(textToolbar.status).isEqualTo(TextToolbarStatus.Hidden) }
     }
 
     @OptIn(ExperimentalTestApi::class)
@@ -371,9 +326,7 @@
         val state = TextFieldState("Hello")
         setupContent(state, textToolbar)
 
-        rule.onNodeWithTag(TAG).performTouchInput {
-            longClick(Offset(fontSizePx, fontSizePx / 2))
-        }
+        rule.onNodeWithTag(TAG).performTouchInput { longClick(Offset(fontSizePx, fontSizePx / 2)) }
 
         rule.runOnIdle {
             assertThat(state.selection).isEqualTo(TextRange(0, 5))
@@ -404,9 +357,7 @@
 
         // test the touch interaction again so we know that hardware keyboard changes are not
         // permanent
-        rule.onNodeWithTag(TAG).performTouchInput {
-            longClick(Offset(fontSizePx, fontSizePx / 2))
-        }
+        rule.onNodeWithTag(TAG).performTouchInput { longClick(Offset(fontSizePx, fontSizePx / 2)) }
 
         rule.runOnIdle {
             assertThat(state.selection).isEqualTo(TextRange(0, 5))
@@ -424,24 +375,16 @@
 
         with(rule.onNode(isSelectionHandle(Handle.Cursor))) {
             performClick()
-            rule.runOnIdle {
-                assertThat(textToolbar.status).isEqualTo(TextToolbarStatus.Shown)
-            }
+            rule.runOnIdle { assertThat(textToolbar.status).isEqualTo(TextToolbarStatus.Shown) }
             performTouchInput {
                 down(center)
                 moveBy(Offset(viewConfiguration.touchSlop, 0f))
                 moveBy(Offset(fontSizePx, 0f))
             }
         }
-        rule.runOnIdle {
-            assertThat(textToolbar.status).isEqualTo(TextToolbarStatus.Hidden)
-        }
-        rule.onNode(isSelectionHandle(Handle.Cursor)).performTouchInput {
-            up()
-        }
-        rule.runOnIdle {
-            assertThat(textToolbar.status).isEqualTo(TextToolbarStatus.Shown)
-        }
+        rule.runOnIdle { assertThat(textToolbar.status).isEqualTo(TextToolbarStatus.Hidden) }
+        rule.onNode(isSelectionHandle(Handle.Cursor)).performTouchInput { up() }
+        rule.runOnIdle { assertThat(textToolbar.status).isEqualTo(TextToolbarStatus.Shown) }
     }
 
     @Test
@@ -453,9 +396,7 @@
         rule.onNodeWithTag(TAG).performTouchInput { click(Offset(fontSizePx * 2, fontSizePx / 2)) }
 
         rule.onNode(isSelectionHandle(Handle.Cursor)).performClick()
-        rule.runOnIdle {
-            assertThat(textToolbar.status).isEqualTo(TextToolbarStatus.Shown)
-        }
+        rule.runOnIdle { assertThat(textToolbar.status).isEqualTo(TextToolbarStatus.Shown) }
 
         rule.onNodeWithTag(TAG).performTouchInput {
             advanceEventTime(viewConfiguration.doubleTapTimeoutMillis * 2)
@@ -473,12 +414,8 @@
     @Test
     fun toolbarFollowsTheCursor_whenTextFieldIsScrolled() {
         var shownRect: Rect? = null
-        val textToolbar = FakeTextToolbar(
-            onShowMenu = { rect, _, _, _, _ ->
-                shownRect = rect
-            },
-            onHideMenu = {}
-        )
+        val textToolbar =
+            FakeTextToolbar(onShowMenu = { rect, _, _, _, _ -> shownRect = rect }, onHideMenu = {})
         val state = TextFieldState("Hello ".repeat(20)) // make sure the field is scrollable
         setupContent(state, textToolbar, true)
 
@@ -503,10 +440,7 @@
             Truth.assertAbout(RectSubject.SUBJECT_FACTORY)
                 .that(secondRectAnchor)!!
                 .isEqualToWithTolerance(
-                    firstRectAnchor.translate(
-                        translateX = -fontSizePx,
-                        translateY = 0f
-                    )
+                    firstRectAnchor.translate(translateX = -fontSizePx, translateY = 0f)
                 )
         }
     }
@@ -514,79 +448,75 @@
     @Test
     fun toolbarShowsSelectAll() {
         var selectAllOptionAvailable = false
-        val textToolbar = FakeTextToolbar(
-            onShowMenu = { _, _, _, _, onSelectAllRequested ->
-                selectAllOptionAvailable = onSelectAllRequested != null
-            },
-            onHideMenu = {}
-        )
+        val textToolbar =
+            FakeTextToolbar(
+                onShowMenu = { _, _, _, _, onSelectAllRequested ->
+                    selectAllOptionAvailable = onSelectAllRequested != null
+                },
+                onHideMenu = {}
+            )
         val state = TextFieldState("Hello")
         setupContent(state, textToolbar, true)
 
         rule.onNodeWithTag(TAG).performTouchInput { click() }
         rule.onNode(isSelectionHandle(Handle.Cursor)).performClick()
 
-        rule.runOnIdle {
-            assertThat(selectAllOptionAvailable).isTrue()
-        }
+        rule.runOnIdle { assertThat(selectAllOptionAvailable).isTrue() }
     }
 
     @Test
     fun toolbarDoesNotShowSelectAll_whenAllTextIsAlreadySelected() {
         var selectAllOption: (() -> Unit)? = null
-        val textToolbar = FakeTextToolbar(
-            onShowMenu = { _, _, _, _, onSelectAllRequested ->
-                selectAllOption = onSelectAllRequested
-            },
-            onHideMenu = {}
-        )
+        val textToolbar =
+            FakeTextToolbar(
+                onShowMenu = { _, _, _, _, onSelectAllRequested ->
+                    selectAllOption = onSelectAllRequested
+                },
+                onHideMenu = {}
+            )
         val state = TextFieldState("Hello")
         setupContent(state, textToolbar, true)
 
         rule.onNodeWithTag(TAG).performTouchInput { click() }
         rule.onNode(isSelectionHandle(Handle.Cursor)).performClick()
 
-        rule.runOnIdle {
-            assertThat(selectAllOption).isNotNull()
-        }
+        rule.runOnIdle { assertThat(selectAllOption).isNotNull() }
 
         selectAllOption?.invoke()
 
         assertThat(state.selection).isEqualTo(TextRange(0, 5))
-        rule.runOnIdle {
-            assertThat(selectAllOption).isNull()
-        }
+        rule.runOnIdle { assertThat(selectAllOption).isNull() }
     }
 
     @Test
     fun toolbarDoesNotShowPaste_whenClipboardHasNoContent() {
         var pasteOptionAvailable = false
-        val textToolbar = FakeTextToolbar(
-            onShowMenu = { _, _, onPasteRequested, _, _ ->
-                pasteOptionAvailable = onPasteRequested != null
-            },
-            onHideMenu = {}
-        )
+        val textToolbar =
+            FakeTextToolbar(
+                onShowMenu = { _, _, onPasteRequested, _, _ ->
+                    pasteOptionAvailable = onPasteRequested != null
+                },
+                onHideMenu = {}
+            )
         val state = TextFieldState("Hello")
         setupContent(state, textToolbar, true)
 
         rule.onNodeWithTag(TAG).performTouchInput { click() }
         rule.onNode(isSelectionHandle(Handle.Cursor)).performClick()
 
-        rule.runOnIdle {
-            assertThat(pasteOptionAvailable).isFalse()
-        }
+        rule.runOnIdle { assertThat(pasteOptionAvailable).isFalse() }
     }
 
     @Test
     fun toolbarShowsPaste_whenClipboardHasText() {
         var pasteOptionAvailable = false
-        val textToolbar = FakeTextToolbar(
-            onShowMenu = { _, _, onPasteRequested, _, _ ->
-                pasteOptionAvailable = onPasteRequested != null
-            },
-            onHideMenu = {}
-        )
+        val textToolbar =
+            FakeTextToolbar(
+                onShowMenu = { _, _, onPasteRequested, _, _ ->
+                    pasteOptionAvailable = onPasteRequested != null
+                },
+                onHideMenu = {}
+            )
         val clipboardManager = FakeClipboardManager("world")
         val state = TextFieldState("Hello")
         setupContent(state, textToolbar, true, clipboardManager)
@@ -594,46 +524,46 @@
         rule.onNodeWithTag(TAG).performTouchInput { click() }
         rule.onNode(isSelectionHandle(Handle.Cursor)).performClick()
 
-        rule.runOnIdle {
-            assertThat(pasteOptionAvailable).isTrue()
-        }
+        rule.runOnIdle { assertThat(pasteOptionAvailable).isTrue() }
     }
 
     @Test
     fun toolbarDoesNotShowPaste_whenClipboardHasContent_butNoReceiveContentConfigured() {
         var pasteOptionAvailable = false
-        val textToolbar = FakeTextToolbar(
-            onShowMenu = { _, _, onPasteRequested, _, _ ->
-                pasteOptionAvailable = onPasteRequested != null
-            },
-            onHideMenu = {}
-        )
-        val clipboardManager = FakeClipboardManager(supportsClipEntry = true).apply {
-            setClip(createClipData().toClipEntry())
-        }
+        val textToolbar =
+            FakeTextToolbar(
+                onShowMenu = { _, _, onPasteRequested, _, _ ->
+                    pasteOptionAvailable = onPasteRequested != null
+                },
+                onHideMenu = {}
+            )
+        val clipboardManager =
+            FakeClipboardManager(supportsClipEntry = true).apply {
+                setClip(createClipData().toClipEntry())
+            }
         val state = TextFieldState("Hello")
         setupContent(state, textToolbar, true, clipboardManager)
 
         rule.onNodeWithTag(TAG).performTouchInput { click() }
         rule.onNode(isSelectionHandle(Handle.Cursor)).performClick()
 
-        rule.runOnIdle {
-            assertThat(pasteOptionAvailable).isFalse()
-        }
+        rule.runOnIdle { assertThat(pasteOptionAvailable).isFalse() }
     }
 
     @Test
     fun toolbarShowsPaste_whenClipboardHasContent_andReceiveContentConfigured() {
         var pasteOptionAvailable = false
-        val textToolbar = FakeTextToolbar(
-            onShowMenu = { _, _, onPasteRequested, _, _ ->
-                pasteOptionAvailable = onPasteRequested != null
-            },
-            onHideMenu = {}
-        )
-        val clipboardManager = FakeClipboardManager(supportsClipEntry = true).apply {
-            setClip(createClipData().toClipEntry())
-        }
+        val textToolbar =
+            FakeTextToolbar(
+                onShowMenu = { _, _, onPasteRequested, _, _ ->
+                    pasteOptionAvailable = onPasteRequested != null
+                },
+                onHideMenu = {}
+            )
+        val clipboardManager =
+            FakeClipboardManager(supportsClipEntry = true).apply {
+                setClip(createClipData().toClipEntry())
+            }
         val state = TextFieldState("Hello")
         setupContent(
             state = state,
@@ -646,20 +576,17 @@
         rule.onNodeWithTag(TAG).performTouchInput { click() }
         rule.onNode(isSelectionHandle(Handle.Cursor)).performClick()
 
-        rule.runOnIdle {
-            assertThat(pasteOptionAvailable).isTrue()
-        }
+        rule.runOnIdle { assertThat(pasteOptionAvailable).isTrue() }
     }
 
     @Test
     fun pasteInsertsContentAtCursor_placesCursorAfterInsertedContent() {
         var pasteOption: (() -> Unit)? = null
-        val textToolbar = FakeTextToolbar(
-            onShowMenu = { _, _, onPasteRequested, _, _ ->
-                pasteOption = onPasteRequested
-            },
-            onHideMenu = {}
-        )
+        val textToolbar =
+            FakeTextToolbar(
+                onShowMenu = { _, _, onPasteRequested, _, _ -> pasteOption = onPasteRequested },
+                onHideMenu = {}
+            )
         val clipboardManager = FakeClipboardManager("world")
         val state = TextFieldState("Hello")
         setupContent(state, textToolbar, true, clipboardManager)
@@ -667,9 +594,7 @@
         rule.onNodeWithTag(TAG).performTouchInput { click(Offset(fontSizePx * 2, 0f)) }
         rule.onNode(isSelectionHandle(Handle.Cursor)).performClick()
 
-        rule.runOnIdle {
-            pasteOption!!.invoke()
-        }
+        rule.runOnIdle { pasteOption!!.invoke() }
 
         rule.runOnIdle {
             assertThat(state.text.toString()).isEqualTo("Heworldllo")
@@ -682,13 +607,14 @@
     fun toolbarDoesNotShowCopyOrCut_whenSelectionIsCollapsed() {
         var cutOptionAvailable = false
         var copyOptionAvailable = false
-        val textToolbar = FakeTextToolbar(
-            onShowMenu = { _, onCopyRequested, _, onCutRequested, _ ->
-                copyOptionAvailable = onCopyRequested != null
-                cutOptionAvailable = onCutRequested != null
-            },
-            onHideMenu = {}
-        )
+        val textToolbar =
+            FakeTextToolbar(
+                onShowMenu = { _, onCopyRequested, _, onCutRequested, _ ->
+                    copyOptionAvailable = onCopyRequested != null
+                    cutOptionAvailable = onCutRequested != null
+                },
+                onHideMenu = {}
+            )
         val state = TextFieldState("Hello")
         setupContent(state, textToolbar, true)
 
@@ -705,13 +631,14 @@
     fun toolbarShowsCopyAndCut_whenSelectionIsExpanded() {
         var cutOptionAvailable = false
         var copyOptionAvailable = false
-        val textToolbar = FakeTextToolbar(
-            onShowMenu = { _, onCopyRequested, _, onCutRequested, _ ->
-                copyOptionAvailable = onCopyRequested != null
-                cutOptionAvailable = onCutRequested != null
-            },
-            onHideMenu = {}
-        )
+        val textToolbar =
+            FakeTextToolbar(
+                onShowMenu = { _, onCopyRequested, _, onCutRequested, _ ->
+                    copyOptionAvailable = onCopyRequested != null
+                    cutOptionAvailable = onCutRequested != null
+                },
+                onHideMenu = {}
+            )
         val state = TextFieldState("Hello")
         setupContent(state, textToolbar, true)
 
@@ -727,12 +654,11 @@
     @Test
     fun copyUpdatesClipboardManager_placesCursorAtTheEndOfSelectedRegion() {
         var copyOption: (() -> Unit)? = null
-        val textToolbar = FakeTextToolbar(
-            onShowMenu = { _, onCopyRequested, _, _, _ ->
-                copyOption = onCopyRequested
-            },
-            onHideMenu = {}
-        )
+        val textToolbar =
+            FakeTextToolbar(
+                onShowMenu = { _, onCopyRequested, _, _, _ -> copyOption = onCopyRequested },
+                onHideMenu = {}
+            )
         val clipboardManager = FakeClipboardManager()
         val state = TextFieldState("Hello")
         setupContent(state, textToolbar, true, clipboardManager)
@@ -740,9 +666,7 @@
         rule.onNodeWithTag(TAG).requestFocus()
         rule.onNodeWithTag(TAG).performTextInputSelectionShowingToolbar(TextRange(0, 5))
 
-        rule.runOnIdle {
-            copyOption!!.invoke()
-        }
+        rule.runOnIdle { copyOption!!.invoke() }
 
         rule.runOnIdle {
             assertThat(clipboardManager.getText()?.toString()).isEqualTo("Hello")
@@ -753,12 +677,11 @@
     @Test
     fun cutUpdatesClipboardManager_placesCursorAtTheEndOfSelectedRegion_removesTheCutContent() {
         var cutOption: (() -> Unit)? = null
-        val textToolbar = FakeTextToolbar(
-            onShowMenu = { _, _, _, onCutRequested, _ ->
-                cutOption = onCutRequested
-            },
-            onHideMenu = {}
-        )
+        val textToolbar =
+            FakeTextToolbar(
+                onShowMenu = { _, _, _, onCutRequested, _ -> cutOption = onCutRequested },
+                onHideMenu = {}
+            )
         val clipboardManager = FakeClipboardManager()
         val state = TextFieldState("Hello World!")
         setupContent(state, textToolbar, true, clipboardManager)
@@ -766,9 +689,7 @@
         rule.onNodeWithTag(TAG).requestFocus()
         rule.onNodeWithTag(TAG).performTextInputSelectionShowingToolbar(TextRange(1, 5))
 
-        rule.runOnIdle {
-            cutOption!!.invoke()
-        }
+        rule.runOnIdle { cutOption!!.invoke() }
 
         rule.runOnIdle {
             assertThat(clipboardManager.getText()?.toString()).isEqualTo("ello")
@@ -780,12 +701,11 @@
     @Test
     fun cutAppliesFilter() {
         var cutOption: (() -> Unit)? = null
-        val textToolbar = FakeTextToolbar(
-            onShowMenu = { _, _, _, onCutRequested, _ ->
-                cutOption = onCutRequested
-            },
-            onHideMenu = {}
-        )
+        val textToolbar =
+            FakeTextToolbar(
+                onShowMenu = { _, _, _, onCutRequested, _ -> cutOption = onCutRequested },
+                onHideMenu = {}
+            )
         val clipboardManager = FakeClipboardManager()
         val state = TextFieldState("Hello World!")
         setupContent(state, textToolbar, true, clipboardManager) {
@@ -798,9 +718,7 @@
         rule.onNodeWithTag(TAG).requestFocus()
         rule.onNodeWithTag(TAG).performTextInputSelectionShowingToolbar(TextRange(1, 5))
 
-        rule.runOnIdle {
-            cutOption!!.invoke()
-        }
+        rule.runOnIdle { cutOption!!.invoke() }
 
         rule.runOnIdle {
             assertThat(clipboardManager.getText()?.toString()).isEqualTo("ello")
@@ -817,15 +735,11 @@
 
         rule.onNodeWithTag(TAG).performTouchInput { click(Offset(fontSizePx * 2, fontSizePx / 2)) }
         rule.onNode(isSelectionHandle(Handle.Cursor)).performClick()
-        rule.runOnIdle {
-            assertThat(textToolbar.status).isEqualTo(TextToolbarStatus.Shown)
-        }
+        rule.runOnIdle { assertThat(textToolbar.status).isEqualTo(TextToolbarStatus.Shown) }
 
         rule.mainClock.advanceTimeBy(1000) // to not cause double click
         rule.onNodeWithTag(TAG).performTouchInput { click(Offset(fontSizePx * 2, fontSizePx / 2)) }
-        rule.runOnIdle {
-            assertThat(textToolbar.status).isEqualTo(TextToolbarStatus.Hidden)
-        }
+        rule.runOnIdle { assertThat(textToolbar.status).isEqualTo(TextToolbarStatus.Hidden) }
     }
 
     @OptIn(ExperimentalTestApi::class)
@@ -836,9 +750,7 @@
         setupContent(state, textToolbar)
 
         rule.onNodeWithTag(TAG).performTouchInput { click(Offset(fontSizePx * 2, fontSizePx / 2)) }
-        rule.onNode(isSelectionHandle(Handle.Cursor)).performMouseInput {
-            click()
-        }
+        rule.onNode(isSelectionHandle(Handle.Cursor)).performMouseInput { click() }
         assertThat(textToolbar.status).isEqualTo(TextToolbarStatus.Hidden)
     }
 
@@ -850,21 +762,11 @@
         rule.setTextFieldTestContent {
             CompositionLocalProvider(LocalTextToolbar provides textToolbar) {
                 Column {
-                    Box(
-                        modifier = Modifier
-                            .focusRequester(focusRequester)
-                            .focusable()
-                            .size(100.dp)
-                    )
+                    Box(modifier = Modifier.focusRequester(focusRequester).focusable().size(100.dp))
                     BasicTextField(
                         state = state,
-                        modifier = Modifier
-                            .width(100.dp)
-                            .testTag(TAG),
-                        textStyle = TextStyle(
-                            fontFamily = TEST_FONT_FAMILY,
-                            fontSize = fontSize
-                        )
+                        modifier = Modifier.width(100.dp).testTag(TAG),
+                        textStyle = TextStyle(fontFamily = TEST_FONT_FAMILY, fontSize = fontSize)
                     )
                 }
             }
@@ -873,15 +775,11 @@
         rule.onNodeWithTag(TAG).performTouchInput { click(Offset(fontSizePx * 2, fontSizePx / 2)) }
         rule.onNode(isSelectionHandle(Handle.Cursor)).performClick()
 
-        rule.runOnIdle {
-            assertThat(textToolbar.status).isEqualTo(TextToolbarStatus.Shown)
-        }
+        rule.runOnIdle { assertThat(textToolbar.status).isEqualTo(TextToolbarStatus.Shown) }
 
         focusRequester.requestFocus()
 
-        rule.runOnIdle {
-            assertThat(textToolbar.status).isEqualTo(TextToolbarStatus.Hidden)
-        }
+        rule.runOnIdle { assertThat(textToolbar.status).isEqualTo(TextToolbarStatus.Hidden) }
     }
 
     @Test
@@ -895,13 +793,9 @@
                     if (toggleState.value) {
                         BasicTextField(
                             state = state,
-                            modifier = Modifier
-                                .width(100.dp)
-                                .testTag(TAG),
-                            textStyle = TextStyle(
-                                fontFamily = TEST_FONT_FAMILY,
-                                fontSize = fontSize
-                            )
+                            modifier = Modifier.width(100.dp).testTag(TAG),
+                            textStyle =
+                                TextStyle(fontFamily = TEST_FONT_FAMILY, fontSize = fontSize)
                         )
                     }
                 }
@@ -911,15 +805,11 @@
         rule.onNodeWithTag(TAG).performTouchInput { click(Offset(fontSizePx * 2, fontSizePx / 2)) }
         rule.onNode(isSelectionHandle(Handle.Cursor)).performClick()
 
-        rule.runOnIdle {
-            assertThat(textToolbar.status).isEqualTo(TextToolbarStatus.Shown)
-        }
+        rule.runOnIdle { assertThat(textToolbar.status).isEqualTo(TextToolbarStatus.Shown) }
 
         toggleState.value = false
 
-        rule.runOnIdle {
-            assertThat(textToolbar.status).isEqualTo(TextToolbarStatus.Hidden)
-        }
+        rule.runOnIdle { assertThat(textToolbar.status).isEqualTo(TextToolbarStatus.Hidden) }
     }
 
     @Test
@@ -930,17 +820,13 @@
 
         rule.onNodeWithTag(TAG).performTouchInput { click(Offset(fontSizePx * 2, fontSizePx / 2)) }
         rule.onNode(isSelectionHandle(Handle.Cursor)).performClick()
-        rule.runOnIdle {
-            assertThat(textToolbar.status).isEqualTo(TextToolbarStatus.Shown)
-        }
+        rule.runOnIdle { assertThat(textToolbar.status).isEqualTo(TextToolbarStatus.Shown) }
 
         rule.onNodeWithTag(TAG).performTouchInput {
             longPress(Offset(3 * fontSizePx * 2, fontSizePx / 2))
         }
 
-        rule.runOnIdle {
-            assertThat(textToolbar.status).isEqualTo(TextToolbarStatus.Hidden)
-        }
+        rule.runOnIdle { assertThat(textToolbar.status).isEqualTo(TextToolbarStatus.Hidden) }
     }
 
     private fun setupContent(
@@ -959,41 +845,34 @@
             ) {
                 BasicTextField(
                     state = state,
-                    modifier = modifier
-                        .width(100.dp)
-                        .testTag(TAG),
-                    textStyle = TextStyle(
-                        fontFamily = TEST_FONT_FAMILY,
-                        fontSize = fontSize
-                    ),
+                    modifier = modifier.width(100.dp).testTag(TAG),
+                    textStyle = TextStyle(fontFamily = TEST_FONT_FAMILY, fontSize = fontSize),
                     enabled = enabled,
-                    lineLimits = if (singleLine) {
-                        TextFieldLineLimits.SingleLine
-                    } else {
-                        TextFieldLineLimits.Default
-                    },
+                    lineLimits =
+                        if (singleLine) {
+                            TextFieldLineLimits.SingleLine
+                        } else {
+                            TextFieldLineLimits.Default
+                        },
                     inputTransformation = filter
                 )
             }
         }
     }
 
-    private fun FakeTextToolbar() = FakeTextToolbar(
-        onShowMenu = { _, _, _, _, _ -> },
-        onHideMenu = {
-            println("hide")
-        }
-    )
+    private fun FakeTextToolbar() =
+        FakeTextToolbar(onShowMenu = { _, _, _, _, _ -> }, onHideMenu = { println("hide") })
 }
 
-internal class RectSubject private constructor(
-    failureMetadata: FailureMetadata?,
-    private val subject: Rect?
-) : Subject(failureMetadata, subject) {
+internal class RectSubject
+private constructor(failureMetadata: FailureMetadata?, private val subject: Rect?) :
+    Subject(failureMetadata, subject) {
 
     companion object {
         internal val SUBJECT_FACTORY: Factory<RectSubject?, Rect?> =
-            Factory { failureMetadata, subject -> RectSubject(failureMetadata, subject) }
+            Factory { failureMetadata, subject ->
+                RectSubject(failureMetadata, subject)
+            }
     }
 
     fun isEqualToWithTolerance(expected: Rect, tolerance: Float = 1f) {
@@ -1009,39 +888,40 @@
 internal fun FakeClipboardManager(
     initialText: String? = null,
     supportsClipEntry: Boolean = false,
-) = object : ClipboardManager {
-    private var currentText: AnnotatedString? = initialText?.let { AnnotatedString(it) }
-    private var currentClipEntry: ClipEntry? = null
+) =
+    object : ClipboardManager {
+        private var currentText: AnnotatedString? = initialText?.let { AnnotatedString(it) }
+        private var currentClipEntry: ClipEntry? = null
 
-    override fun setText(annotatedString: AnnotatedString) {
-        currentText = annotatedString
-    }
+        override fun setText(annotatedString: AnnotatedString) {
+            currentText = annotatedString
+        }
 
-    override fun getText(): AnnotatedString? {
-        return currentText
-    }
+        override fun getText(): AnnotatedString? {
+            return currentText
+        }
 
-    override fun getClip(): ClipEntry? {
-        if (supportsClipEntry) {
-            return currentClipEntry
-        } else {
-            throw NotImplementedError("This clipboard does not support clip entries")
+        override fun getClip(): ClipEntry? {
+            if (supportsClipEntry) {
+                return currentClipEntry
+            } else {
+                throw NotImplementedError("This clipboard does not support clip entries")
+            }
+        }
+
+        override fun setClip(clipEntry: ClipEntry?) {
+            if (supportsClipEntry) {
+                currentClipEntry = clipEntry
+            } else {
+                throw NotImplementedError("This clipboard does not support clip entries")
+            }
         }
     }
 
-    override fun setClip(clipEntry: ClipEntry?) {
-        if (supportsClipEntry) {
-            currentClipEntry = clipEntry
-        } else {
-            throw NotImplementedError("This clipboard does not support clip entries")
-        }
-    }
-}
-
 /**
  * Toolbar does not show up when text is selected with traversal mode off (relative to original
- * text). This is an override of [SemanticsNodeInteraction.performTextInputSelection] that
- * makes sure the toolbar shows up after selection is initiated.
+ * text). This is an override of [SemanticsNodeInteraction.performTextInputSelection] that makes
+ * sure the toolbar shows up after selection is initiated.
  */
 fun SemanticsNodeInteraction.performTextInputSelectionShowingToolbar(selection: TextRange) {
     requestFocus()
diff --git a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/input/internal/selection/gesture/TextFieldScrolledSelectionGestureTest.kt b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/input/internal/selection/gesture/TextFieldScrolledSelectionGestureTest.kt
index 6eb8e3cd..f15891f 100644
--- a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/input/internal/selection/gesture/TextFieldScrolledSelectionGestureTest.kt
+++ b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/input/internal/selection/gesture/TextFieldScrolledSelectionGestureTest.kt
@@ -86,8 +86,7 @@
 @MediumTest
 @RunWith(AndroidJUnit4::class)
 class TextFieldScrolledSelectionGestureTest : FocusedWindowTest {
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
     private val fontFamily = TEST_FONT_FAMILY
     private val fontSize = 15.sp
@@ -99,17 +98,13 @@
         rule.setTextFieldTestContent {
             CompositionLocalProvider(
                 LocalDensity provides density,
-                LocalViewConfiguration provides TestViewConfiguration(
-                    minimumTouchTargetSize = DpSize.Zero,
-                    touchSlop = Float.MIN_VALUE,
-                ),
+                LocalViewConfiguration provides
+                    TestViewConfiguration(
+                        minimumTouchTargetSize = DpSize.Zero,
+                        touchSlop = Float.MIN_VALUE,
+                    ),
             ) {
-                Box(
-                    modifier = Modifier
-                        .fillMaxSize()
-                        .padding(32.dp)
-                        .wrapContentSize()
-                ) {
+                Box(modifier = Modifier.fillMaxSize().padding(32.dp).wrapContentSize()) {
                     content(pointerAreaTag)
                 }
             }
@@ -124,20 +119,22 @@
         /** Returns the offset needed to translate the amount scrolled. */
         abstract fun TextLayoutResult.translateScroll(): Offset
 
-        fun characterBoxScrolled(offset: Int): Rect = onTextField.fetchTextLayoutResult().run {
-            getBoundingBox(offset).translate(translateScroll())
-        }
+        fun characterBoxScrolled(offset: Int): Rect =
+            onTextField.fetchTextLayoutResult().run {
+                getBoundingBox(offset).translate(translateScroll())
+            }
 
         fun positionForCharacterScrolled(offset: Int): Offset =
             characterBoxScrolled(offset).centerLeft
 
         fun HandlePressedScope.moveHandleToCharacter(characterOffset: Int) {
             val boundingBox = onTextField.fetchTextLayoutResult().getBoundingBox(characterOffset)
-            val destinationPosition = when (fetchHandleInfo().handle) {
-                Handle.SelectionStart -> boundingBox.bottomLeft
-                Handle.SelectionEnd -> boundingBox.bottomRight
-                Handle.Cursor -> fail("Unexpected handle ${Handle.Cursor}")
-            }
+            val destinationPosition =
+                when (fetchHandleInfo().handle) {
+                    Handle.SelectionStart -> boundingBox.bottomLeft
+                    Handle.SelectionEnd -> boundingBox.bottomRight
+                    Handle.Cursor -> fail("Unexpected handle ${Handle.Cursor}")
+                }
             moveHandleTo(destinationPosition)
         }
 
@@ -186,11 +183,11 @@
                 state = tfs,
                 textStyle = textStyle,
                 lineLimits = TextFieldLineLimits.SingleLine,
-                modifier = Modifier
-                    .width(300.dp)
-                    .testTag(tag = tag)
-                    .onSizeChanged { sizeNullable!!.value = it }
-                    .onGloballyPositioned { textFieldLayoutCoordinates = it }
+                modifier =
+                    Modifier.width(300.dp)
+                        .testTag(tag = tag)
+                        .onSizeChanged { sizeNullable!!.value = it }
+                        .onGloballyPositioned { textFieldLayoutCoordinates = it }
             )
         }
         val onTextField = rule.onNodeWithTag(pointerAreaTag)
@@ -262,9 +259,7 @@
         }
     }
 
-    /**
-     * Create a horizontally scrollable text field that is scrolled all the way to the end.
-     */
+    /** Create a horizontally scrollable text field that is scrolled all the way to the end. */
     private fun runVerticalTest(block: VerticalScope.() -> Unit) {
         val text = (0..9).joinToString(separator = "\n") { "text$it" }
         lateinit var textFieldLayoutCoordinates: LayoutCoordinates
@@ -277,11 +272,11 @@
                 state = tfs,
                 textStyle = TextStyle(fontFamily = fontFamily, fontSize = fontSize),
                 lineLimits = TextFieldLineLimits.MultiLine(maxHeightInLines = 4),
-                modifier = Modifier
-                    .width(300.dp)
-                    .testTag(tag = tag)
-                    .onSizeChanged { sizeNullable!!.value = it }
-                    .onGloballyPositioned { textFieldLayoutCoordinates = it }
+                modifier =
+                    Modifier.width(300.dp)
+                        .testTag(tag = tag)
+                        .onSizeChanged { sizeNullable!!.value = it }
+                        .onGloballyPositioned { textFieldLayoutCoordinates = it }
             )
         }
         assertThat(sizeNullable).isNotNull()
diff --git a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/input/internal/undo/BasicTextFieldUndoTest.kt b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/input/internal/undo/BasicTextFieldUndoTest.kt
index dc0701e..a155611 100644
--- a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/input/internal/undo/BasicTextFieldUndoTest.kt
+++ b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/input/internal/undo/BasicTextFieldUndoTest.kt
@@ -50,16 +50,13 @@
 @LargeTest
 @RunWith(AndroidJUnit4::class)
 internal class BasicTextFieldUndoTest {
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
     @Test
     fun canUndo_imeInsert() {
         val state = TextFieldState("Hello", TextRange(5))
 
-        rule.setContent {
-            BasicTextField(state)
-        }
+        rule.setContent { BasicTextField(state) }
 
         rule.onNode(hasSetTextAction()).performTextInput(", World")
         state.assertText("Hello, World")
@@ -73,9 +70,7 @@
     fun canRedo_imeInsert() {
         val state = TextFieldState("Hello", TextRange(5))
 
-        rule.setContent {
-            BasicTextField(state)
-        }
+        rule.setContent { BasicTextField(state) }
 
         rule.onNode(hasSetTextAction()).performTextInput(", World")
 
@@ -90,9 +85,7 @@
     fun undoMerges_imeInserts() {
         val state = TextFieldState("Hello", TextRange(5))
 
-        rule.setContent {
-            BasicTextField(state)
-        }
+        rule.setContent { BasicTextField(state) }
 
         rule.onNode(hasSetTextAction()).typeText(", World")
         state.assertText("Hello, World")
@@ -106,9 +99,7 @@
     fun undoMerges_imeInserts_onlyInForwardsDirection() {
         val state = TextFieldState("Hello", TextRange(5))
 
-        rule.setContent {
-            BasicTextField(state)
-        }
+        rule.setContent { BasicTextField(state) }
 
         with(rule.onNode(hasSetTextAction())) {
             performTextInput(", World")
@@ -130,17 +121,11 @@
     fun undoMerges_deletes() {
         val state = TextFieldState("Hello, World", TextRange(12))
 
-        rule.setContent {
-            BasicTextField(state)
-        }
+        rule.setContent { BasicTextField(state) }
 
         with(rule.onNode(hasSetTextAction())) {
             requestFocus()
-            performKeyInput {
-                repeat(12) {
-                    pressKey(Key.Backspace)
-                }
-            }
+            performKeyInput { repeat(12) { pressKey(Key.Backspace) } }
         }
         state.assertTextAndSelection("", TextRange.Zero)
 
@@ -153,19 +138,13 @@
     fun undoDoesNotMerge_deletes_inBothDirections() {
         val state = TextFieldState("Hello, World", TextRange(6))
 
-        rule.setContent {
-            BasicTextField(state)
-        }
+        rule.setContent { BasicTextField(state) }
 
         with(rule.onNode(hasSetTextAction())) {
             requestFocus()
             performKeyInput {
-                repeat(6) {
-                    pressKey(Key.Backspace)
-                }
-                repeat(6) {
-                    pressKey(Key.Delete)
-                }
+                repeat(6) { pressKey(Key.Backspace) }
+                repeat(6) { pressKey(Key.Delete) }
             }
         }
         state.assertTextAndSelection("", TextRange.Zero)
@@ -181,9 +160,7 @@
     fun undo_revertsSelection() {
         val state = TextFieldState("Hello", TextRange(5))
 
-        rule.setContent {
-            BasicTextField(state)
-        }
+        rule.setContent { BasicTextField(state) }
 
         with(rule.onNode(hasSetTextAction())) {
             performTextInputSelection(TextRange(0, 5))
@@ -200,9 +177,7 @@
     fun redo_revertsSelection() {
         val state = TextFieldState("Hello", TextRange(5))
 
-        rule.setContent {
-            BasicTextField(state)
-        }
+        rule.setContent { BasicTextField(state) }
 
         with(rule.onNode(hasSetTextAction())) {
             performTextInputSelection(TextRange(2))
@@ -213,9 +188,7 @@
 
         state.undoState.undo()
 
-        rule.runOnIdle {
-            assertThat(state.selection).isNotEqualTo(TextRange(7))
-        }
+        rule.runOnIdle { assertThat(state.selection).isNotEqualTo(TextRange(7)) }
 
         state.undoState.redo()
 
@@ -227,9 +200,7 @@
     fun variousEditOperations() {
         val state = TextFieldState()
 
-        rule.setContent {
-            BasicTextField(state)
-        }
+        rule.setContent { BasicTextField(state) }
 
         with(rule.onNode(hasSetTextAction())) {
             typeText("abc def")
@@ -258,9 +229,7 @@
     fun clearHistory_removesAllUndoAndRedo() {
         val state = TextFieldState()
 
-        rule.setContent {
-            BasicTextField(state)
-        }
+        rule.setContent { BasicTextField(state) }
 
         with(rule.onNode(hasSetTextAction())) {
             typeText("abc def")
@@ -324,24 +293,14 @@
     fun cut_neverMerges() {
         val state = TextFieldState("abc def ghi", TextRange(11))
 
-        rule.setContent {
-            BasicTextField(state)
-        }
+        rule.setContent { BasicTextField(state) }
 
         with(rule.onNode(hasSetTextAction())) {
             requestFocus()
-            repeat(4) {
-                performKeyInput {
-                    pressKey(Key.Backspace)
-                }
-            }
+            repeat(4) { performKeyInput { pressKey(Key.Backspace) } }
             performTextInputSelection(TextRange(4, 7))
             performSemanticsAction(SemanticsActions.CutText)
-            repeat(4) {
-                performKeyInput {
-                    pressKey(Key.Backspace)
-                }
-            }
+            repeat(4) { performKeyInput { pressKey(Key.Backspace) } }
         }
         state.assertTextAndSelection("", TextRange.Zero)
 
@@ -363,9 +322,7 @@
     }
 
     private fun TextFieldState.assertText(text: String) {
-        rule.runOnIdle {
-            assertThat(this.text.toString()).isEqualTo(text)
-        }
+        rule.runOnIdle { assertThat(this.text.toString()).isEqualTo(text) }
     }
 
     private fun TextFieldState.assertTextAndSelection(text: String, selection: TextRange) {
diff --git a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/matchers/BitmapSubject.kt b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/matchers/BitmapSubject.kt
index adbf698..bebdcbd 100644
--- a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/matchers/BitmapSubject.kt
+++ b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/matchers/BitmapSubject.kt
@@ -21,17 +21,16 @@
 import com.google.common.truth.Subject
 import com.google.common.truth.Subject.Factory
 
-/**
- * Truth extension for Bitmap.
- */
-internal class BitmapSubject private constructor(
-    failureMetadata: FailureMetadata?,
-    private val subject: Bitmap?
-) : Subject(failureMetadata, subject) {
+/** Truth extension for Bitmap. */
+internal class BitmapSubject
+private constructor(failureMetadata: FailureMetadata?, private val subject: Bitmap?) :
+    Subject(failureMetadata, subject) {
 
     companion object {
         internal val SUBJECT_FACTORY: Factory<BitmapSubject?, Bitmap?> =
-            Factory { failureMetadata, subject -> BitmapSubject(failureMetadata, subject) }
+            Factory { failureMetadata, subject ->
+                BitmapSubject(failureMetadata, subject)
+            }
     }
 
     /**
diff --git a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/modifiers/BasicTextSemanticsTest.kt b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/modifiers/BasicTextSemanticsTest.kt
index 3f3afed..3fe5014 100644
--- a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/modifiers/BasicTextSemanticsTest.kt
+++ b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/modifiers/BasicTextSemanticsTest.kt
@@ -33,15 +33,12 @@
 @RunWith(AndroidJUnit4::class)
 class BasicTextSemanticsTest {
 
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
     @Test
     fun semanticsTextChanges_String() {
         var text by mutableStateOf("before")
-        rule.setContent {
-            BasicText(text)
-        }
+        rule.setContent { BasicText(text) }
         rule.onNodeWithText("before").assertExists()
         text = "after"
         rule.onNodeWithText("after").assertExists()
@@ -50,9 +47,7 @@
     @Test
     fun semanticsTextChanges_AnnotatedString() {
         var text by mutableStateOf("before")
-        rule.setContent {
-            BasicText(AnnotatedString(text))
-        }
+        rule.setContent { BasicText(AnnotatedString(text)) }
         rule.onNodeWithText("before").assertExists()
         text = "after"
         rule.onNodeWithText("after").assertExists()
diff --git a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/modifiers/LayoutUtilsKtTest.kt b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/modifiers/LayoutUtilsKtTest.kt
index d4efca6..ce0d308 100644
--- a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/modifiers/LayoutUtilsKtTest.kt
+++ b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/modifiers/LayoutUtilsKtTest.kt
@@ -31,8 +31,7 @@
  * These constants are the largest values that each slot can hold. The following pairings are the
  * only ones allowed:
  *
- * (Big, Tiny), (Tiny, Big)
- * (Medium, Small), (Small, Medium)
+ * (Big, Tiny), (Tiny, Big) (Medium, Small), (Small, Medium)
  *
  * For more information see [Constraints] implementation
  */
@@ -45,57 +44,40 @@
     @Test
     fun finalConstraints_doesntThrowWhenLarge() {
         // this used to throw, ensure it doesn't
-        val subject = finalConstraints(
-            /* minWidth != maxWidth */
-            Constraints(0, 500, 0, BigConstraintValue - 1),
-            true /* width matters */,
-            TextOverflow.Ellipsis,
-            (BigConstraintValue - 1).toFloat()
-        )
+        val subject =
+            finalConstraints(
+                /* minWidth != maxWidth */
+                Constraints(0, 500, 0, BigConstraintValue - 1),
+                true /* width matters */,
+                TextOverflow.Ellipsis,
+                (BigConstraintValue - 1).toFloat()
+            )
         assertThat(subject).isNotNull()
     }
 
     @Test
     fun finalConstraints_returnsTightWidth() {
-        val subject = finalConstraints(
-            Constraints(500, 500, 0, 50),
-            true,
-            TextOverflow.Ellipsis,
-            42f
-        )
+        val subject =
+            finalConstraints(Constraints(500, 500, 0, 50), true, TextOverflow.Ellipsis, 42f)
         assertThat(subject.maxWidth).isEqualTo(500)
     }
 
     @Test
     fun finalConstraints_returnsMaxIntrinsicWhenUnbound() {
-        val subject = finalConstraints(
-            Constraints(500, 500, 0, 50),
-            false,
-            TextOverflow.Clip,
-            1234.1f
-        )
+        val subject =
+            finalConstraints(Constraints(500, 500, 0, 50), false, TextOverflow.Clip, 1234.1f)
         assertThat(subject.maxWidth).isEqualTo(1235)
     }
 
     @Test
     fun finalMaxWidth_returnsTightWidth() {
-        val subject = finalMaxWidth(
-            Constraints(500, 500, 0, 50),
-            true,
-            TextOverflow.Ellipsis,
-            42f
-        )
+        val subject = finalMaxWidth(Constraints(500, 500, 0, 50), true, TextOverflow.Ellipsis, 42f)
         assertThat(subject).isEqualTo(500)
     }
 
     @Test
     fun finalMaxWidth_returnsMaxIntrinsicWhenUnbound() {
-        val subject = finalMaxWidth(
-            Constraints(500, 500, 0, 50),
-            false,
-            TextOverflow.Clip,
-            1234.1f
-        )
+        val subject = finalMaxWidth(Constraints(500, 500, 0, 50), false, TextOverflow.Clip, 1234.1f)
         assertThat(subject).isEqualTo(1235)
     }
 
@@ -126,12 +108,13 @@
             while (1 shl b > 0) {
                 val height = 1 shl b
                 /* shouldn't crash */
-                val constraints = fitPrioritizingWidth(
-                    minWidth = width,
-                    maxWidth = width,
-                    minHeight = height,
-                    maxHeight = height
-                )
+                val constraints =
+                    fitPrioritizingWidth(
+                        minWidth = width,
+                        maxWidth = width,
+                        minHeight = height,
+                        maxHeight = height
+                    )
                 println("$width $height => $constraints")
                 b++
             }
diff --git a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/modifiers/MultiParagraphLayoutCacheTest.kt b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/modifiers/MultiParagraphLayoutCacheTest.kt
index 6a51fca..2fc1d32 100644
--- a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/modifiers/MultiParagraphLayoutCacheTest.kt
+++ b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/modifiers/MultiParagraphLayoutCacheTest.kt
@@ -53,13 +53,13 @@
             val text = "Hello"
             val spanStyle = SpanStyle(fontSize = fontSize, fontFamily = fontFamily)
             val annotatedString = AnnotatedString(text, spanStyle)
-            val textDelegate = MultiParagraphLayoutCache(
-                text = annotatedString,
-                style = TextStyle.Default,
-                fontFamilyResolver = fontFamilyResolver,
-            ).also {
-                it.density = this
-            }
+            val textDelegate =
+                MultiParagraphLayoutCache(
+                        text = annotatedString,
+                        style = TextStyle.Default,
+                        fontFamilyResolver = fontFamilyResolver,
+                    )
+                    .also { it.density = this }
 
             textDelegate.layoutWithConstraints(Constraints.fixed(0, 0), LayoutDirection.Ltr)
 
@@ -74,16 +74,17 @@
         val text = "Hello"
         val spanStyle = SpanStyle(fontSize = fontSize, fontFamily = fontFamily)
         val annotatedString = AnnotatedString(text, spanStyle)
-        val textDelegate = MultiParagraphLayoutCache(
-            text = annotatedString,
-            style = TextStyle.Default,
-            fontFamilyResolver = fontFamilyResolver,
-        ).also {
-            it.density = density
-        }
+        val textDelegate =
+            MultiParagraphLayoutCache(
+                    text = annotatedString,
+                    style = TextStyle.Default,
+                    fontFamilyResolver = fontFamilyResolver,
+                )
+                .also { it.density = density }
 
         val original = textDelegate.intrinsicHeight(20, LayoutDirection.Ltr)
-        textDelegate.update(AnnotatedString("Longer\ntext\ngoes\nhere\n\n\n."),
+        textDelegate.update(
+            AnnotatedString("Longer\ntext\ngoes\nhere\n\n\n."),
             TextStyle.Default,
             fontFamilyResolver,
             TextOverflow.Visible,
@@ -103,13 +104,13 @@
             val text = "Hello"
             val spanStyle = SpanStyle(fontSize = fontSize, fontFamily = fontFamily)
             val annotatedString = AnnotatedString(text, spanStyle)
-            val textDelegate = MultiParagraphLayoutCache(
-                text = annotatedString,
-                style = TextStyle.Default,
-                fontFamilyResolver = fontFamilyResolver,
-            ).also {
-                it.density = this
-            }
+            val textDelegate =
+                MultiParagraphLayoutCache(
+                        text = annotatedString,
+                        style = TextStyle.Default,
+                        fontFamilyResolver = fontFamilyResolver,
+                    )
+                    .also { it.density = this }
 
             textDelegate.layoutWithConstraints(Constraints.fixed(0, 0), LayoutDirection.Ltr)
 
@@ -120,13 +121,13 @@
 
     @Test
     fun TextLayoutInput_reLayout_withDifferentHeight() {
-        val textDelegate = MultiParagraphLayoutCache(
-            text = AnnotatedString("Hello World"),
-            style = TextStyle.Default,
-            fontFamilyResolver = fontFamilyResolver,
-        ).also {
-            it.density = density
-        }
+        val textDelegate =
+            MultiParagraphLayoutCache(
+                    text = AnnotatedString("Hello World"),
+                    style = TextStyle.Default,
+                    fontFamilyResolver = fontFamilyResolver,
+                )
+                .also { it.density = density }
         val width = 200
         val heightFirstLayout = 100
         val heightSecondLayout = 200
@@ -137,23 +138,20 @@
         assertThat(resultFirstLayout.layoutInput.constraints).isEqualTo(constraintsFirstLayout)
 
         val constraintsSecondLayout = Constraints.fixed(width, heightSecondLayout)
-        textDelegate.layoutWithConstraints(
-            constraintsSecondLayout,
-            LayoutDirection.Ltr
-        )
+        textDelegate.layoutWithConstraints(constraintsSecondLayout, LayoutDirection.Ltr)
         val resultSecondLayout = textDelegate.textLayoutResult
         assertThat(resultSecondLayout.layoutInput.constraints).isEqualTo(constraintsSecondLayout)
     }
 
     @Test
     fun TextLayoutResult_reLayout_withDifferentHeight() {
-        val textDelegate = MultiParagraphLayoutCache(
-            text = AnnotatedString("Hello World"),
-            style = TextStyle.Default,
-            fontFamilyResolver = fontFamilyResolver,
-        ).also {
-            it.density = density
-        }
+        val textDelegate =
+            MultiParagraphLayoutCache(
+                    text = AnnotatedString("Hello World"),
+                    style = TextStyle.Default,
+                    fontFamilyResolver = fontFamilyResolver,
+                )
+                .also { it.density = density }
         val width = 200
         val heightFirstLayout = 100
         val heightSecondLayout = 200
@@ -164,10 +162,7 @@
         assertThat(resultFirstLayout.size.height).isEqualTo(heightFirstLayout)
 
         val constraintsSecondLayout = Constraints.fixed(width, heightSecondLayout)
-        textDelegate.layoutWithConstraints(
-            constraintsSecondLayout,
-            LayoutDirection.Ltr
-        )
+        textDelegate.layoutWithConstraints(constraintsSecondLayout, LayoutDirection.Ltr)
         val resultSecondLayout = textDelegate.textLayoutResult
         assertThat(resultSecondLayout.size.height).isEqualTo(heightSecondLayout)
     }
@@ -176,15 +171,15 @@
     fun TextLayoutResult_layout_withEllipsis_withoutSoftWrap() {
         val fontSize = 20f
         val text = AnnotatedString(text = "Hello World! Hello World! Hello World! Hello World!")
-        val textDelegate = MultiParagraphLayoutCache(
-            text = text,
-            style = TextStyle(fontSize = fontSize.sp),
-            fontFamilyResolver = fontFamilyResolver,
-            softWrap = false,
-            overflow = TextOverflow.Ellipsis,
-        ).also {
-            it.density = density
-        }
+        val textDelegate =
+            MultiParagraphLayoutCache(
+                    text = text,
+                    style = TextStyle(fontSize = fontSize.sp),
+                    fontFamilyResolver = fontFamilyResolver,
+                    softWrap = false,
+                    overflow = TextOverflow.Ellipsis,
+                )
+                .also { it.density = density }
 
         textDelegate.layoutWithConstraints(Constraints.fixed(0, 0), LayoutDirection.Ltr)
         // Makes width smaller than needed.
@@ -202,19 +197,20 @@
         val fontSize = 20f
         val text = AnnotatedString(text = "Hello World! Hello World! Hello World! Hello World!")
 
-        val textDelegate = MultiParagraphLayoutCache(
-            text = text,
-            style = TextStyle(fontSize = fontSize.sp),
-            fontFamilyResolver = fontFamilyResolver,
-            overflow = TextOverflow.Ellipsis,
-        ).also {
-            it.density = density
-        }
+        val textDelegate =
+            MultiParagraphLayoutCache(
+                    text = text,
+                    style = TextStyle(fontSize = fontSize.sp),
+                    fontFamilyResolver = fontFamilyResolver,
+                    overflow = TextOverflow.Ellipsis,
+                )
+                .also { it.density = density }
         textDelegate.layoutWithConstraints(Constraints.fixed(0, 0), LayoutDirection.Ltr)
-        val constraints = Constraints(
-            maxWidth = textDelegate.maxIntrinsicWidth(LayoutDirection.Ltr) / 4,
-            maxHeight = (fontSize * 2.7).roundToInt() // fully fits at most 2 lines
-        )
+        val constraints =
+            Constraints(
+                maxWidth = textDelegate.maxIntrinsicWidth(LayoutDirection.Ltr) / 4,
+                maxHeight = (fontSize * 2.7).roundToInt() // fully fits at most 2 lines
+            )
         textDelegate.layoutWithConstraints(constraints, LayoutDirection.Ltr)
         val layoutResult = textDelegate.textLayoutResult
 
@@ -225,19 +221,21 @@
     @Test
     fun TextLayoutResult_reLayout_withDifferentDensity() {
         var backingDensity = 1f
-        val density = object : Density {
-            override val density: Float
-                get() = backingDensity
-            override val fontScale: Float
-                get() = 1f
-        }
-        val textDelegate = MultiParagraphLayoutCache(
-            text = AnnotatedString("Hello World"),
-            style = TextStyle.Default,
-            fontFamilyResolver = fontFamilyResolver,
-        ).also {
-            it.density = density
-        }
+        val density =
+            object : Density {
+                override val density: Float
+                    get() = backingDensity
+
+                override val fontScale: Float
+                    get() = 1f
+            }
+        val textDelegate =
+            MultiParagraphLayoutCache(
+                    text = AnnotatedString("Hello World"),
+                    style = TextStyle.Default,
+                    fontFamilyResolver = fontFamilyResolver,
+                )
+                .also { it.density = density }
 
         textDelegate.layoutWithConstraints(Constraints(), LayoutDirection.Ltr)
         val resultFirstLayout = textDelegate.textLayoutResult.size
@@ -256,19 +254,21 @@
     @Test
     fun TextLayoutResult_reLayout_withDifferentFontScale() {
         var backingFontScale = 1f
-        val density = object : Density {
-            override val density: Float
-                get() = 1f
-            override val fontScale: Float
-                get() = backingFontScale
-        }
-        val textDelegate = MultiParagraphLayoutCache(
-            text = AnnotatedString("Hello World"),
-            style = TextStyle.Default,
-            fontFamilyResolver = fontFamilyResolver,
-        ).also {
-            it.density = density
-        }
+        val density =
+            object : Density {
+                override val density: Float
+                    get() = 1f
+
+                override val fontScale: Float
+                    get() = backingFontScale
+            }
+        val textDelegate =
+            MultiParagraphLayoutCache(
+                    text = AnnotatedString("Hello World"),
+                    style = TextStyle.Default,
+                    fontFamilyResolver = fontFamilyResolver,
+                )
+                .also { it.density = density }
 
         textDelegate.layoutWithConstraints(Constraints(), LayoutDirection.Ltr)
         val resultFirstLayout = textDelegate.textLayoutResult.size
@@ -289,14 +289,14 @@
         val fontSize = 20f
         val text = AnnotatedString(text = "Hello World")
 
-        val textDelegate = MultiParagraphLayoutCache(
-            text = text,
-            style = TextStyle(fontSize = fontSize.sp, letterSpacing = 0.5.sp),
-            fontFamilyResolver = fontFamilyResolver,
-            overflow = TextOverflow.Ellipsis,
-        ).also {
-            it.density = density
-        }
+        val textDelegate =
+            MultiParagraphLayoutCache(
+                    text = text,
+                    style = TextStyle(fontSize = fontSize.sp, letterSpacing = 0.5.sp),
+                    fontFamilyResolver = fontFamilyResolver,
+                    overflow = TextOverflow.Ellipsis,
+                )
+                .also { it.density = density }
 
         textDelegate.layoutWithConstraints(Constraints(), LayoutDirection.Ltr)
         val layoutResultLtr = textDelegate.textLayoutResult
@@ -316,28 +316,29 @@
             }
         }
 
-        val textDelegate = MultiParagraphLayoutCache(
-            text = text,
-            style = TextStyle(fontSize = 1.sp),
-            fontFamilyResolver = fontFamilyResolver,
-            overflow = TextOverflow.Ellipsis,
-            maxLines = 5
-        ).also {
-            it.density = density
-        }
+        val textDelegate =
+            MultiParagraphLayoutCache(
+                    text = text,
+                    style = TextStyle(fontSize = 1.sp),
+                    fontFamilyResolver = fontFamilyResolver,
+                    overflow = TextOverflow.Ellipsis,
+                    maxLines = 5
+                )
+                .also { it.density = density }
         textDelegate.layoutWithConstraints(Constraints(), LayoutDirection.Ltr)
         val actual = textDelegate.textLayoutResult.multiParagraph
 
-        val expected = Paragraph(
-            text.text,
-            TextStyle(fontSize = 1.sp),
-            Constraints(),
-            density,
-            fontFamilyResolver,
-            text.spanStyles,
-            maxLines = 5,
-            ellipsis = true
-        )
+        val expected =
+            Paragraph(
+                text.text,
+                TextStyle(fontSize = 1.sp),
+                Constraints(),
+                density,
+                fontFamilyResolver,
+                text.spanStyles,
+                maxLines = 5,
+                ellipsis = true
+            )
         assertThat(actual.height).isEqualTo(expected.height)
     }
 }
diff --git a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/modifiers/MultiParagraphLayoutCacheWidthWithLetterSpacingTest.kt b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/modifiers/MultiParagraphLayoutCacheWidthWithLetterSpacingTest.kt
index 4bcbfc4..25db42e 100644
--- a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/modifiers/MultiParagraphLayoutCacheWidthWithLetterSpacingTest.kt
+++ b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/modifiers/MultiParagraphLayoutCacheWidthWithLetterSpacingTest.kt
@@ -38,9 +38,7 @@
 class MultiParagraphLayoutCacheWidthWithLetterSpacingTest {
     private val fontFamily = TEST_FONT_FAMILY
 
-    /**
-     * values are exact values for the repro case (on Pixel4, Android 11)
-     */
+    /** values are exact values for the repro case (on Pixel4, Android 11) */
     private val density = Density(3.051f, 1.15f)
     private val letterSpacing = 0.4.sp
     private val lineHeight = 16.sp
@@ -51,9 +49,7 @@
 
     @Test
     fun letterSpacing_and_lineHeight() {
-        assertLineCount(
-            TextStyle(letterSpacing = letterSpacing, lineHeight = lineHeight)
-        )
+        assertLineCount(TextStyle(letterSpacing = letterSpacing, lineHeight = lineHeight))
     }
 
     @Test
@@ -72,18 +68,15 @@
     }
 
     private fun assertLineCount(style: TextStyle) {
-        val textDelegate = MultiParagraphLayoutCache(
-            text = AnnotatedString(text = "This is a callout message"),
-            style = style.copy(
-                fontFamily = fontFamily,
-                fontSize = fontSize
-            ),
-            fontFamilyResolver = fontFamilyResolver,
-            softWrap = true,
-            overflow = TextOverflow.Clip
-        ).also {
-            it.density = density
-        }
+        val textDelegate =
+            MultiParagraphLayoutCache(
+                    text = AnnotatedString(text = "This is a callout message"),
+                    style = style.copy(fontFamily = fontFamily, fontSize = fontSize),
+                    fontFamilyResolver = fontFamilyResolver,
+                    softWrap = true,
+                    overflow = TextOverflow.Clip
+                )
+                .also { it.density = density }
         textDelegate.layoutWithConstraints(Constraints(), LayoutDirection.Ltr)
         val layoutResult = textDelegate.textLayoutResult
         assertThat(layoutResult.lineCount).isEqualTo(1)
diff --git a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/modifiers/NodeInvalidationTestParent.kt b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/modifiers/NodeInvalidationTestParent.kt
index 8ec5fc4..f619bd3 100644
--- a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/modifiers/NodeInvalidationTestParent.kt
+++ b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/modifiers/NodeInvalidationTestParent.kt
@@ -36,9 +36,8 @@
     fun colorChange_doesNotInvalidateLayout() {
         val params = generateParams()
         val subject = createSubject(params)
-        val (textChange, layoutChange) = subject.updateAll(
-            params = params.copy(style = params.style.copy(color = Color.Red))
-        )
+        val (textChange, layoutChange) =
+            subject.updateAll(params = params.copy(style = params.style.copy(color = Color.Red)))
         assertThat(layoutChange).isFalse()
         assertThat(textChange).isFalse()
     }
@@ -59,9 +58,10 @@
         val params = generateParams()
         val drawParams = DrawParams(params.style, { Color.Unspecified })
         val subject = createSubject(params, drawParams)
-        val drawChanged = subject.updateDrawArgs(
-            drawParams = drawParams.copy(style = drawParams.style.copy(color = Color.Red))
-        )
+        val drawChanged =
+            subject.updateDrawArgs(
+                drawParams = drawParams.copy(style = drawParams.style.copy(color = Color.Red))
+            )
         assertThat(drawChanged).isTrue()
     }
 
@@ -69,9 +69,10 @@
     fun brushChange_doesNotInvalidateLayout() {
         val params = generateParams()
         val subject = createSubject(params)
-        val (textChange, layoutChange) = subject.updateAll(
-            params = params.copy(style = params.style.copy(brush = Brush.horizontalGradient()))
-        )
+        val (textChange, layoutChange) =
+            subject.updateAll(
+                params = params.copy(style = params.style.copy(brush = Brush.horizontalGradient()))
+            )
         assertThat(layoutChange).isFalse()
         assertThat(textChange).isFalse()
     }
@@ -80,9 +81,11 @@
     fun fontSizeChange_doesInvalidateLayout() {
         val params = generateParams()
         val subject = createSubject(params)
-        val (textChange, layoutChange) = subject.updateAll(
-            params = params.copy(style = params.style.copy(fontSize = params.style.fontSize * 2))
-        )
+        val (textChange, layoutChange) =
+            subject.updateAll(
+                params =
+                    params.copy(style = params.style.copy(fontSize = params.style.fontSize * 2))
+            )
         assertThat(layoutChange).isTrue()
         assertThat(textChange).isFalse()
     }
@@ -91,9 +94,8 @@
     fun textChange_doesInvalidateText() {
         val params = generateParams()
         val subject = createSubject(params)
-        val (textChange, layoutChange) = subject.updateAll(
-            params = params.copy(text = params.text + " goodbye")
-        )
+        val (textChange, layoutChange) =
+            subject.updateAll(params = params.copy(text = params.text + " goodbye"))
         assertThat(layoutChange).isFalse()
         assertThat(textChange).isTrue()
     }
@@ -102,9 +104,8 @@
     fun minLinesChange_doesInvalidateLayout() {
         val params = generateParams()
         val subject = createSubject(params)
-        val (textChange, layoutChange) = subject.updateAll(
-            params = params.copy(minLines = params.minLines + 1)
-        )
+        val (textChange, layoutChange) =
+            subject.updateAll(params = params.copy(minLines = params.minLines + 1))
         assertThat(layoutChange).isTrue()
         assertThat(textChange).isFalse()
     }
@@ -113,9 +114,8 @@
     fun maxLinesChange_doesInvalidateLayout() {
         val params = generateParams()
         val subject = createSubject(params)
-        val (textChange, layoutChange) = subject.updateAll(
-            params = params.copy(maxLines = params.minLines + 1)
-        )
+        val (textChange, layoutChange) =
+            subject.updateAll(params = params.copy(maxLines = params.minLines + 1))
         assertThat(layoutChange).isTrue()
         assertThat(textChange).isFalse()
     }
@@ -124,9 +124,8 @@
     fun softWrapChange_doesInvalidateLayout() {
         val params = generateParams()
         val subject = createSubject(params)
-        val (textChange, layoutChange) = subject.updateAll(
-            params = params.copy(softWrap = !params.softWrap)
-        )
+        val (textChange, layoutChange) =
+            subject.updateAll(params = params.copy(softWrap = !params.softWrap))
         assertThat(layoutChange).isTrue()
         assertThat(textChange).isFalse()
     }
@@ -135,9 +134,8 @@
     fun overflowChange_doesInvalidateLayout() {
         val params = generateParams()
         val subject = createSubject(params)
-        val (textChange, layoutChange) = subject.updateAll(
-            params = params.copy(overflow = TextOverflow.Clip)
-        )
+        val (textChange, layoutChange) =
+            subject.updateAll(params = params.copy(overflow = TextOverflow.Clip))
         assertThat(layoutChange).isTrue()
         assertThat(textChange).isFalse()
     }
@@ -148,12 +146,15 @@
     }
 
     abstract fun Any.updateDrawArgs(drawParams: DrawParams): Boolean
+
     abstract fun Any.updateAll(params: Params): Pair<Boolean, Boolean>
 
     abstract fun Any.invalidateAll()
 
     abstract fun createSubject(params: Params): Any
+
     abstract fun createSubject(params: Params, drawParams: DrawParams): Any
+
     private fun generateParams(): Params {
         return Params(
             "text",
diff --git a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/modifiers/ParagraphLayoutCacheTest.kt b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/modifiers/ParagraphLayoutCacheTest.kt
index f38a424..18acdfe 100644
--- a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/modifiers/ParagraphLayoutCacheTest.kt
+++ b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/modifiers/ParagraphLayoutCacheTest.kt
@@ -50,13 +50,13 @@
         with(density) {
             val fontSize = 20.sp
             val text = "Hello"
-            val textDelegate = ParagraphLayoutCache(
-                text = text,
-                style = createTextStyle(fontSize = fontSize),
-                fontFamilyResolver = fontFamilyResolver,
-            ).also {
-                it.density = this
-            }
+            val textDelegate =
+                ParagraphLayoutCache(
+                        text = text,
+                        style = createTextStyle(fontSize = fontSize),
+                        fontFamilyResolver = fontFamilyResolver,
+                    )
+                    .also { it.density = this }
 
             assertThat(textDelegate.minIntrinsicWidth(LayoutDirection.Ltr))
                 .isEqualTo((fontSize.toPx() * text.length).toIntPx())
@@ -68,13 +68,13 @@
         with(density) {
             val fontSize = 20.sp
             val text = "Hello"
-            val textDelegate = ParagraphLayoutCache(
-                text = text,
-                style = createTextStyle(fontSize = fontSize),
-                fontFamilyResolver = fontFamilyResolver,
-            ).also {
-                it.density = this
-            }
+            val textDelegate =
+                ParagraphLayoutCache(
+                        text = text,
+                        style = createTextStyle(fontSize = fontSize),
+                        fontFamilyResolver = fontFamilyResolver,
+                    )
+                    .also { it.density = this }
 
             assertThat(textDelegate.maxIntrinsicWidth(LayoutDirection.Ltr))
                 .isEqualTo((fontSize.toPx() * text.length).toIntPx())
@@ -84,13 +84,13 @@
     @OptIn(ExperimentalTextApi::class)
     @Test
     fun TextLayoutInput_reLayout_withDifferentHeight() {
-        val textDelegate = ParagraphLayoutCache(
-            text = "Hello World",
-            style = TextStyle.Default.copy(fontFamily = fontFamily),
-            fontFamilyResolver = fontFamilyResolver,
-        ).also {
-            it.density = density
-        }
+        val textDelegate =
+            ParagraphLayoutCache(
+                    text = "Hello World",
+                    style = TextStyle.Default.copy(fontFamily = fontFamily),
+                    fontFamilyResolver = fontFamilyResolver,
+                )
+                .also { it.density = density }
         val width = 200
         val heightFirstLayout = 100
         val heightSecondLayout = 200
@@ -100,10 +100,7 @@
         val resultFirstLayout = textDelegate.layoutSize
 
         val constraintsSecondLayout = Constraints.fixed(width, heightSecondLayout)
-        textDelegate.layoutWithConstraints(
-            constraintsSecondLayout,
-            LayoutDirection.Ltr
-        )
+        textDelegate.layoutWithConstraints(constraintsSecondLayout, LayoutDirection.Ltr)
         val resultSecondLayout = textDelegate.layoutSize
 
         assertThat(resultFirstLayout.height).isLessThan(resultSecondLayout.height)
@@ -112,19 +109,21 @@
     @Test
     fun TextLayoutInput_reLayout_withDifferentDensity() {
         var backingDensity = 1f
-        val density = object : Density {
-            override val density: Float
-                get() = backingDensity
-            override val fontScale: Float
-                get() = 1f
-        }
-        val textDelegate = ParagraphLayoutCache(
-            text = "Hello World",
-            style = TextStyle.Default.copy(fontFamily = fontFamily),
-            fontFamilyResolver = fontFamilyResolver,
-        ).also {
-            it.density = density
-        }
+        val density =
+            object : Density {
+                override val density: Float
+                    get() = backingDensity
+
+                override val fontScale: Float
+                    get() = 1f
+            }
+        val textDelegate =
+            ParagraphLayoutCache(
+                    text = "Hello World",
+                    style = TextStyle.Default.copy(fontFamily = fontFamily),
+                    fontFamilyResolver = fontFamilyResolver,
+                )
+                .also { it.density = density }
 
         textDelegate.layoutWithConstraints(Constraints(), LayoutDirection.Ltr)
         val resultFirstLayout = textDelegate.layoutSize
@@ -143,19 +142,21 @@
     @Test
     fun TextLayoutInput_reLayout_withDifferentFontScale() {
         var backingFontScale = 1f
-        val density = object : Density {
-            override val density: Float
-                get() = 1f
-            override val fontScale: Float
-                get() = backingFontScale
-        }
-        val textDelegate = ParagraphLayoutCache(
-            text = "Hello World",
-            style = TextStyle.Default.copy(fontFamily = fontFamily),
-            fontFamilyResolver = fontFamilyResolver,
-        ).also {
-            it.density = density
-        }
+        val density =
+            object : Density {
+                override val density: Float
+                    get() = 1f
+
+                override val fontScale: Float
+                    get() = backingFontScale
+            }
+        val textDelegate =
+            ParagraphLayoutCache(
+                    text = "Hello World",
+                    style = TextStyle.Default.copy(fontFamily = fontFamily),
+                    fontFamilyResolver = fontFamilyResolver,
+                )
+                .also { it.density = density }
 
         textDelegate.layoutWithConstraints(Constraints(), LayoutDirection.Ltr)
         val resultFirstLayout = textDelegate.layoutSize
@@ -174,13 +175,13 @@
     @OptIn(ExperimentalTextApi::class)
     @Test
     fun TextLayoutResult_reLayout_withDifferentHeight() {
-        val textDelegate = ParagraphLayoutCache(
-            text = "Hello World",
-            style = TextStyle.Default.copy(fontFamily = fontFamily),
-            fontFamilyResolver = fontFamilyResolver,
-        ).also {
-            it.density = density
-        }
+        val textDelegate =
+            ParagraphLayoutCache(
+                    text = "Hello World",
+                    style = TextStyle.Default.copy(fontFamily = fontFamily),
+                    fontFamilyResolver = fontFamilyResolver,
+                )
+                .also { it.density = density }
         val width = 200
         val heightFirstLayout = 100
         val heightSecondLayout = 200
@@ -191,10 +192,7 @@
         assertThat(resultFirstLayout.height).isEqualTo(heightFirstLayout)
 
         val constraintsSecondLayout = Constraints.fixed(width, heightSecondLayout)
-        textDelegate.layoutWithConstraints(
-            constraintsSecondLayout,
-            LayoutDirection.Ltr
-        )
+        textDelegate.layoutWithConstraints(constraintsSecondLayout, LayoutDirection.Ltr)
         val resultSecondLayout = textDelegate.layoutSize
         assertThat(resultSecondLayout.height).isEqualTo(heightSecondLayout)
     }
@@ -202,15 +200,15 @@
     @Test
     fun TextLayoutResult_layout_withEllipsis_withoutSoftWrap() {
         val fontSize = 20f
-        val textDelegate = ParagraphLayoutCache(
-            text = "Hello World! Hello World! Hello World! Hello World!",
-            style = createTextStyle(fontSize = fontSize.sp),
-            fontFamilyResolver = fontFamilyResolver,
-            softWrap = false,
-            overflow = TextOverflow.Ellipsis,
-        ).also {
-            it.density = density
-        }
+        val textDelegate =
+            ParagraphLayoutCache(
+                    text = "Hello World! Hello World! Hello World! Hello World!",
+                    style = createTextStyle(fontSize = fontSize.sp),
+                    fontFamilyResolver = fontFamilyResolver,
+                    softWrap = false,
+                    overflow = TextOverflow.Ellipsis,
+                )
+                .also { it.density = density }
 
         textDelegate.layoutWithConstraints(Constraints.fixed(0, 0), LayoutDirection.Ltr)
         // Makes width smaller than needed.
@@ -227,19 +225,20 @@
     fun TextLayoutResult_layoutWithLimitedHeight_withEllipsis() {
         val fontSize = 20f
 
-        val textDelegate = ParagraphLayoutCache(
-            text = "Hello World! Hello World! Hello World! Hello World!",
-            style = createTextStyle(fontSize = fontSize.sp),
-            fontFamilyResolver = fontFamilyResolver,
-            overflow = TextOverflow.Ellipsis,
-        ).also {
-            it.density = density
-        }
+        val textDelegate =
+            ParagraphLayoutCache(
+                    text = "Hello World! Hello World! Hello World! Hello World!",
+                    style = createTextStyle(fontSize = fontSize.sp),
+                    fontFamilyResolver = fontFamilyResolver,
+                    overflow = TextOverflow.Ellipsis,
+                )
+                .also { it.density = density }
         textDelegate.layoutWithConstraints(Constraints.fixed(0, 0), LayoutDirection.Ltr)
-        val constraints = Constraints(
-            maxWidth = textDelegate.maxIntrinsicWidth(LayoutDirection.Ltr) / 4,
-            maxHeight = (fontSize * 2.7).roundToInt() // fully fits at most 2 lines
-        )
+        val constraints =
+            Constraints(
+                maxWidth = textDelegate.maxIntrinsicWidth(LayoutDirection.Ltr) / 4,
+                maxHeight = (fontSize * 2.7).roundToInt() // fully fits at most 2 lines
+            )
         textDelegate.layoutWithConstraints(constraints, LayoutDirection.Ltr)
         val layoutResult = textDelegate.paragraph!!
 
@@ -251,14 +250,14 @@
     fun TextLayoutResult_sameWidth_inRtlAndLtr_withLetterSpacing() {
         val fontSize = 20f
 
-        val textDelegate = ParagraphLayoutCache(
-            text = "Hello World",
-            style = createTextStyle(fontSize = fontSize.sp, letterSpacing = 0.5.sp),
-            fontFamilyResolver = fontFamilyResolver,
-            overflow = TextOverflow.Ellipsis,
-        ).also {
-            it.density = density
-        }
+        val textDelegate =
+            ParagraphLayoutCache(
+                    text = "Hello World",
+                    style = createTextStyle(fontSize = fontSize.sp, letterSpacing = 0.5.sp),
+                    fontFamilyResolver = fontFamilyResolver,
+                    overflow = TextOverflow.Ellipsis,
+                )
+                .also { it.density = density }
 
         textDelegate.layoutWithConstraints(Constraints(), LayoutDirection.Ltr)
         val layoutResultLtr = textDelegate.layoutSize
@@ -271,28 +270,29 @@
     @Test
     fun maxHeight_hasSameHeight_asParagraph() {
         val text = "a\n".repeat(20)
-        val textDelegate = ParagraphLayoutCache(
-            text = text,
-            style = createTextStyle(fontSize = 1.sp),
-            fontFamilyResolver = fontFamilyResolver,
-            overflow = TextOverflow.Ellipsis,
-            maxLines = 5
-        ).also {
-            it.density = density
-        }
+        val textDelegate =
+            ParagraphLayoutCache(
+                    text = text,
+                    style = createTextStyle(fontSize = 1.sp),
+                    fontFamilyResolver = fontFamilyResolver,
+                    overflow = TextOverflow.Ellipsis,
+                    maxLines = 5
+                )
+                .also { it.density = density }
         textDelegate.layoutWithConstraints(Constraints(), LayoutDirection.Ltr)
         val actual = textDelegate.paragraph!!
 
-        val expected = Paragraph(
-            text,
-            createTextStyle(fontSize = 1.sp),
-            Constraints(),
-            density,
-            fontFamilyResolver,
-            emptyList(),
-            maxLines = 5,
-            ellipsis = true
-        )
+        val expected =
+            Paragraph(
+                text,
+                createTextStyle(fontSize = 1.sp),
+                Constraints(),
+                density,
+                fontFamilyResolver,
+                emptyList(),
+                maxLines = 5,
+                ellipsis = true
+            )
         assertThat(actual.height).isEqualTo(expected.height)
     }
 
@@ -300,13 +300,8 @@
     fun slowCreate_null_beforeLayout() {
         val text = "hello"
         val style = createTextStyle(fontSize = 1.sp)
-        val subject = ParagraphLayoutCache(
-            text,
-            style,
-            fontFamilyResolver
-        ).also {
-            it.density = density
-        }
+        val subject =
+            ParagraphLayoutCache(text, style, fontFamilyResolver).also { it.density = density }
 
         assertThat(subject.slowCreateTextLayoutResultOrNull(style = style)).isNull()
     }
@@ -315,13 +310,8 @@
     fun slowCreate_not_null_afterLayout() {
         val text = "hello"
         val style = createTextStyle(fontSize = 1.sp)
-        val subject = ParagraphLayoutCache(
-            text,
-            style,
-            fontFamilyResolver
-        ).also {
-            it.density = density
-        }
+        val subject =
+            ParagraphLayoutCache(text, style, fontFamilyResolver).also { it.density = density }
 
         subject.layoutWithConstraints(Constraints(), LayoutDirection.Ltr)
         assertThat(subject.slowCreateTextLayoutResultOrNull(style = style)).isNotNull()
@@ -331,13 +321,8 @@
     fun slowCreate_not_null_afterLayout_minWidthMinHeight() {
         val text = "hello"
         val style = createTextStyle(fontSize = 1.sp)
-        val subject = ParagraphLayoutCache(
-            text,
-            style,
-            fontFamilyResolver
-        ).also {
-            it.density = density
-        }
+        val subject =
+            ParagraphLayoutCache(text, style, fontFamilyResolver).also { it.density = density }
 
         subject.layoutWithConstraints(Constraints(minWidth = 5, minHeight = 5), LayoutDirection.Ltr)
         assertThat(subject.slowCreateTextLayoutResultOrNull(style = style)).isNotNull()
diff --git a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/modifiers/SelectionControllerTest.kt b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/modifiers/SelectionControllerTest.kt
index 86e71928b..2ae59fc 100644
--- a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/modifiers/SelectionControllerTest.kt
+++ b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/modifiers/SelectionControllerTest.kt
@@ -58,8 +58,7 @@
 @SmallTest
 class SelectionControllerTest {
 
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
     private val boxTag = "boxTag"
     private val tag = "tag"
@@ -68,27 +67,34 @@
     private val foregroundColor = Color.Black
     private val backgroundColor = Color.White
 
-    private val highlightArgb get() = highlightColor.toArgb()
-    private val foregroundArgb get() = foregroundColor.toArgb()
-    private val backgroundArgb get() = backgroundColor.toArgb()
+    private val highlightArgb
+        get() = highlightColor.toArgb()
+
+    private val foregroundArgb
+        get() = foregroundColor.toArgb()
+
+    private val backgroundArgb
+        get() = backgroundColor.toArgb()
 
     private val density = Density(1f)
     private val textSelectionColors = TextSelectionColors(highlightColor, highlightColor)
 
     @Test
     @SdkSuppress(minSdkVersion = 26)
-    fun drawWithClip_doesClip() = runDrawWithClipTest(TextOverflow.Clip) { argbSet ->
-        assertThat(argbSet).containsExactly(backgroundArgb)
-    }
+    fun drawWithClip_doesClip() =
+        runDrawWithClipTest(TextOverflow.Clip) { argbSet ->
+            assertThat(argbSet).containsExactly(backgroundArgb)
+        }
 
     @Test
     @SdkSuppress(minSdkVersion = 26)
-    fun drawWithVisible_doesNotClip() = runDrawWithClipTest(TextOverflow.Visible) { argbSet ->
-        // there could be more colors due to anti-aliasing, so check that we have at least the
-        // expected colors, and none of the unexpected colors.
-        assertThat(argbSet).containsAtLeast(highlightArgb, foregroundArgb)
-        assertThat(argbSet).doesNotContain(backgroundArgb)
-    }
+    fun drawWithVisible_doesNotClip() =
+        runDrawWithClipTest(TextOverflow.Visible) { argbSet ->
+            // there could be more colors due to anti-aliasing, so check that we have at least the
+            // expected colors, and none of the unexpected colors.
+            assertThat(argbSet).containsAtLeast(highlightArgb, foregroundArgb)
+            assertThat(argbSet).doesNotContain(backgroundArgb)
+        }
 
     @RequiresApi(Build.VERSION_CODES.O)
     private fun runDrawWithClipTest(overflow: TextOverflow, assertBlock: (Set<Int>) -> Unit) {
@@ -98,17 +104,15 @@
                 LocalDensity provides density,
             ) {
                 Box(
-                    modifier = Modifier
-                        .fillMaxSize()
-                        .drawBehind { drawRect(backgroundColor) }
-                        .testTag(boxTag),
+                    modifier =
+                        Modifier.fillMaxSize()
+                            .drawBehind { drawRect(backgroundColor) }
+                            .testTag(boxTag),
                     contentAlignment = Alignment.Center,
                 ) {
                     SelectionContainer {
                         BasicText(
-                            modifier = Modifier
-                                .width(10.dp)
-                                .testTag(tag),
+                            modifier = Modifier.width(10.dp).testTag(tag),
                             text = "OOOOOOO",
                             overflow = overflow,
                             softWrap = false,
diff --git a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/modifiers/TextAnnotatedStringContentCaptureInvalidationTest.kt b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/modifiers/TextAnnotatedStringContentCaptureInvalidationTest.kt
index d62ed59..38b9533 100644
--- a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/modifiers/TextAnnotatedStringContentCaptureInvalidationTest.kt
+++ b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/modifiers/TextAnnotatedStringContentCaptureInvalidationTest.kt
@@ -40,9 +40,9 @@
 
 class TextAnnotatedStringContentCaptureInvalidationTest {
 
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
     private val context = InstrumentationRegistry.getInstrumentation().context
+
     private fun createSubject(text: AnnotatedString): TextAnnotatedStringElement {
         return TextAnnotatedStringElement(
             text,
@@ -56,74 +56,52 @@
     fun whenChangingText_invalidateTranslation() {
         val original = AnnotatedString("Ok")
         val current = mutableStateOf(createSubject(original))
-        rule.setContent {
-            Box(current.value)
-        }
+        rule.setContent { Box(current.value) }
 
         val semantics = rule.onNodeWithText("Ok").fetchSemanticsNode()
-        rule.runOnIdle {
-            semantics.translateTo("Foo")
-        }
+        rule.runOnIdle { semantics.translateTo("Foo") }
         val after = AnnotatedString("After")
         current.value = createSubject(after)
 
         val newSemantics = rule.onNodeWithText(after.text).fetchSemanticsNode()
-        rule.runOnIdle {
-            assertThat(newSemantics.fetchTranslation()).isNull()
-        }
+        rule.runOnIdle { assertThat(newSemantics.fetchTranslation()).isNull() }
     }
 
     @Test
     fun whenChangingSpanStyle_noInvalidateTranslation() {
         val original = AnnotatedString("Ok")
         val after = buildAnnotatedString {
-            withStyle(SpanStyle(color = Color.Red)) {
-                append(original.text)
-            }
+            withStyle(SpanStyle(color = Color.Red)) { append(original.text) }
         }
 
         val current = mutableStateOf(createSubject(original))
 
-        rule.setContent {
-            Box(current.value)
-        }
+        rule.setContent { Box(current.value) }
         val translation = "A translation goes here"
         val node = rule.onNodeWithText(original.text).fetchSemanticsNode()
-        rule.runOnIdle {
-            node.translateTo(translation)
-        }
+        rule.runOnIdle { node.translateTo(translation) }
         current.value = createSubject(after)
 
         val node2 = rule.onNodeWithText(after.text).fetchSemanticsNode()
-        rule.runOnIdle {
-            assertThat(node2.fetchTranslation()).isEqualTo(translation)
-        }
+        rule.runOnIdle { assertThat(node2.fetchTranslation()).isEqualTo(translation) }
     }
 
     @Test
     fun whenChangingParagraphStyle_noInvalidateTranslation() {
         val original = AnnotatedString("Ok")
         val after = buildAnnotatedString {
-            withStyle(ParagraphStyle(lineHeight = 1000.sp)) {
-                append(original.text)
-            }
+            withStyle(ParagraphStyle(lineHeight = 1000.sp)) { append(original.text) }
         }
         val current = mutableStateOf(createSubject(original))
 
-        rule.setContent {
-            Box(current.value)
-        }
+        rule.setContent { Box(current.value) }
         val translation = "A translation goes here"
         val node = rule.onNodeWithText(original.text).fetchSemanticsNode()
-        rule.runOnIdle {
-            node.translateTo(translation)
-        }
+        rule.runOnIdle { node.translateTo(translation) }
         current.value = createSubject(after)
 
         val node2 = rule.onNodeWithText(after.text).fetchSemanticsNode()
-        rule.runOnIdle {
-            assertThat(node2.fetchTranslation()).isEqualTo(translation)
-        }
+        rule.runOnIdle { assertThat(node2.fetchTranslation()).isEqualTo(translation) }
     }
 
     @Test
@@ -135,20 +113,14 @@
         }
         val current = mutableStateOf(createSubject(original))
 
-        rule.setContent {
-            Box(current.value)
-        }
+        rule.setContent { Box(current.value) }
         val translation = "A translation goes here"
         val node = rule.onNodeWithText(original.text).fetchSemanticsNode()
-        rule.runOnIdle {
-            node.translateTo(translation)
-        }
+        rule.runOnIdle { node.translateTo(translation) }
         current.value = createSubject(after)
 
         val node2 = rule.onNodeWithText(after.text).fetchSemanticsNode()
-        rule.runOnIdle {
-            assertThat(node2.fetchTranslation()).isEqualTo(translation)
-        }
+        rule.runOnIdle { assertThat(node2.fetchTranslation()).isEqualTo(translation) }
     }
 }
 
diff --git a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/modifiers/TextAnnotatedStringNodeInvalidationTest.kt b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/modifiers/TextAnnotatedStringNodeInvalidationTest.kt
index b425ef3..935e686 100644
--- a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/modifiers/TextAnnotatedStringNodeInvalidationTest.kt
+++ b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/modifiers/TextAnnotatedStringNodeInvalidationTest.kt
@@ -21,15 +21,16 @@
 class TextAnnotatedStringNodeInvalidationTest : NodeInvalidationTestParent() {
     override fun Any.updateAll(params: Params): Pair<Boolean, Boolean> {
         this as TextAnnotatedStringNode
-        return updateText(AnnotatedString(params.text)) to updateLayoutRelatedArgs(
-            style = params.style,
-            minLines = params.minLines,
-            maxLines = params.maxLines,
-            softWrap = params.softWrap,
-            fontFamilyResolver = params.fontFamilyResolver,
-            overflow = params.overflow,
-            placeholders = null
-        )
+        return updateText(AnnotatedString(params.text)) to
+            updateLayoutRelatedArgs(
+                style = params.style,
+                minLines = params.minLines,
+                maxLines = params.maxLines,
+                softWrap = params.softWrap,
+                fontFamilyResolver = params.fontFamilyResolver,
+                overflow = params.overflow,
+                placeholders = null
+            )
     }
 
     override fun Any.invalidateAll() {
diff --git a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/modifiers/TextAnnotatedStringNodeTest.kt b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/modifiers/TextAnnotatedStringNodeTest.kt
index 2bb1849..9aab30f 100644
--- a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/modifiers/TextAnnotatedStringNodeTest.kt
+++ b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/modifiers/TextAnnotatedStringNodeTest.kt
@@ -47,25 +47,27 @@
 @MediumTest
 @RunWith(AndroidJUnit4::class)
 class TextAnnotatedStringNodeTest {
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
     val context: Context = InstrumentationRegistry.getInstrumentation().context
 
     @Test
     fun draw_whenNotAttached_doesNotCrash() {
-        val subject = TextAnnotatedStringNode(
-            AnnotatedString("text"), TextStyle.Default, createFontFamilyResolver(context)
-        )
+        val subject =
+            TextAnnotatedStringNode(
+                AnnotatedString("text"),
+                TextStyle.Default,
+                createFontFamilyResolver(context)
+            )
         rule.setContent {
             Canvas(Modifier.fillMaxSize()) {
-                val contentDrawScope = object : ContentDrawScope, DrawScope by this {
-                    override fun drawContent() {
-                        fail("Not used")
+                val contentDrawScope =
+                    object : ContentDrawScope, DrawScope by this {
+                        override fun drawContent() {
+                            fail("Not used")
+                        }
                     }
-                } as ContentDrawScope
-                with(subject) {
-                    contentDrawScope.draw()
-                }
+                        as ContentDrawScope
+                with(subject) { contentDrawScope.draw() }
             }
         }
         rule.waitForIdle()
@@ -89,21 +91,18 @@
         var flag by mutableStateOf(false)
 
         rule.setContent {
-            val content =
-                remember {
-                    movableContentOf {
-                        BoxWithConstraints {
-                            BasicText(
-                                text = AnnotatedString(if (!flag) "" else "LOADED"),
-                                modifier = Modifier.testTag("target")
-                            )
-                        }
+            val content = remember {
+                movableContentOf {
+                    BoxWithConstraints {
+                        BasicText(
+                            text = AnnotatedString(if (!flag) "" else "LOADED"),
+                            modifier = Modifier.testTag("target")
+                        )
                     }
                 }
-
-            key(flag) {
-                content()
             }
+
+            key(flag) { content() }
         }
 
         val textLayout1 = rule.onNodeWithTag("target").fetchTextLayoutResult()
@@ -119,47 +118,42 @@
     fun setTextSubstitution_invalidatesDraw() {
         val drawCount = AtomicInteger(0)
 
-        val subject = TextAnnotatedStringElement(
-            AnnotatedString("til"),
-            TextStyle.Default,
-            createFontFamilyResolver(context)
-        )
+        val subject =
+            TextAnnotatedStringElement(
+                AnnotatedString("til"),
+                TextStyle.Default,
+                createFontFamilyResolver(context)
+            )
 
-        val modifier = Modifier.fillMaxSize().drawBehind {
-            drawRect(Color.Magenta, size = Size(100f, 100f))
-            drawCount.incrementAndGet()
-        } then subject
+        val modifier =
+            Modifier.fillMaxSize().drawBehind {
+                drawRect(Color.Magenta, size = Size(100f, 100f))
+                drawCount.incrementAndGet()
+            } then subject
 
-        rule.setContent {
-            Box(modifier)
-        }
+        rule.setContent { Box(modifier) }
         val initialCount = drawCount.get()
-        rule.runOnIdle {
-            Truth.assertThat(initialCount).isGreaterThan(0)
-        }
+        rule.runOnIdle { Truth.assertThat(initialCount).isGreaterThan(0) }
 
         val node = rule.onNodeWithText("til").fetchSemanticsNode()
         rule.runOnIdle {
             node.config[SemanticsActions.SetTextSubstitution].action?.invoke(AnnotatedString("T"))
             node.config[SemanticsActions.ShowTextSubstitution].action?.invoke(true)
         }
-        rule.runOnIdle {
-            Truth.assertThat(drawCount.get()).isGreaterThan(initialCount)
-        }
+        rule.runOnIdle { Truth.assertThat(drawCount.get()).isGreaterThan(initialCount) }
     }
 
     @Test
     fun setTextSubstitution_setsSemantics() {
 
-        val subject = TextAnnotatedStringElement(
-            AnnotatedString("til"),
-            TextStyle.Default,
-            createFontFamilyResolver(context)
-        )
+        val subject =
+            TextAnnotatedStringElement(
+                AnnotatedString("til"),
+                TextStyle.Default,
+                createFontFamilyResolver(context)
+            )
 
-        rule.setContent {
-            Box(Modifier.fillMaxSize() then subject)
-        }
+        rule.setContent { Box(Modifier.fillMaxSize() then subject) }
 
         val node = rule.onNodeWithText("til").fetchSemanticsNode()
 
diff --git a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/modifiers/TextLayoutResultIntegrationTest.kt b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/modifiers/TextLayoutResultIntegrationTest.kt
index e86416a..db44535 100644
--- a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/modifiers/TextLayoutResultIntegrationTest.kt
+++ b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/modifiers/TextLayoutResultIntegrationTest.kt
@@ -55,20 +55,18 @@
             val text = "Hello"
             val spanStyle = SpanStyle(fontSize = fontSize, fontFamily = fontFamily)
             val annotatedString = AnnotatedString(text, spanStyle)
-            val textDelegate = MultiParagraphLayoutCache(
-                text = annotatedString,
-                style = TextStyle.Default,
-                fontFamilyResolver = fontFamilyResolver
-            ).also {
-                it.density = this
-            }
+            val textDelegate =
+                MultiParagraphLayoutCache(
+                        text = annotatedString,
+                        style = TextStyle.Default,
+                        fontFamilyResolver = fontFamilyResolver
+                    )
+                    .also { it.density = this }
 
             textDelegate.layoutWithConstraints(Constraints(0, 200), layoutDirection)
             val layoutResult = textDelegate.textLayoutResult
 
-            assertThat(layoutResult.size.width).isEqualTo(
-                (fontSize.toPx() * text.length).toIntPx()
-            )
+            assertThat(layoutResult.size.width).isEqualTo((fontSize.toPx() * text.length).toIntPx())
         }
     }
 
@@ -78,13 +76,13 @@
         val width = 80
         val spanStyle = SpanStyle(fontSize = 20.sp, fontFamily = fontFamily)
         val annotatedString = AnnotatedString(text, spanStyle)
-        val textDelegate = MultiParagraphLayoutCache(
-            text = annotatedString,
-            style = TextStyle.Default,
-            fontFamilyResolver = fontFamilyResolver
-        ).also {
-            it.density = density
-        }
+        val textDelegate =
+            MultiParagraphLayoutCache(
+                    text = annotatedString,
+                    style = TextStyle.Default,
+                    fontFamilyResolver = fontFamilyResolver
+                )
+                .also { it.density = density }
 
         textDelegate.layoutWithConstraints(Constraints(maxWidth = width), layoutDirection)
         val layoutResult = textDelegate.textLayoutResult
@@ -99,13 +97,13 @@
             val spanStyle = SpanStyle(fontSize = fontSize, fontFamily = fontFamily)
             val text = "hello"
             val annotatedString = AnnotatedString(text, spanStyle)
-            val textDelegate = MultiParagraphLayoutCache(
-                text = annotatedString,
-                style = TextStyle.Default,
-                fontFamilyResolver = fontFamilyResolver
-            ).also {
-                it.density = this
-            }
+            val textDelegate =
+                MultiParagraphLayoutCache(
+                        text = annotatedString,
+                        style = TextStyle.Default,
+                        fontFamilyResolver = fontFamilyResolver
+                    )
+                    .also { it.density = this }
 
             textDelegate.layoutWithConstraints(Constraints(), layoutDirection)
             val layoutResult = textDelegate.textLayoutResult
@@ -116,13 +114,13 @@
 
     @Test
     fun layout_build_layoutResult() {
-        val textDelegate = MultiParagraphLayoutCache(
-            text = AnnotatedString("hello"),
-            style = TextStyle.Default,
-            fontFamilyResolver = fontFamilyResolver
-        ).also {
-            it.density = density
-        }
+        val textDelegate =
+            MultiParagraphLayoutCache(
+                    text = AnnotatedString("hello"),
+                    style = TextStyle.Default,
+                    fontFamilyResolver = fontFamilyResolver
+                )
+                .also { it.density = density }
 
         textDelegate.layoutWithConstraints(Constraints(0, 20), layoutDirection)
         val layoutResult = textDelegate.textLayoutResult
@@ -137,18 +135,16 @@
     @Test
     fun getPositionForOffset_First_Character() {
         val text = "Hello"
-        val annotatedString = AnnotatedString(
-            text,
-            SpanStyle(fontSize = 20.sp, fontFamily = fontFamily)
-        )
+        val annotatedString =
+            AnnotatedString(text, SpanStyle(fontSize = 20.sp, fontFamily = fontFamily))
 
-        val textDelegate = MultiParagraphLayoutCache(
-            text = annotatedString,
-            style = TextStyle.Default,
-            fontFamilyResolver = fontFamilyResolver
-        ).also {
-            it.density = density
-        }
+        val textDelegate =
+            MultiParagraphLayoutCache(
+                    text = annotatedString,
+                    style = TextStyle.Default,
+                    fontFamilyResolver = fontFamilyResolver
+                )
+                .also { it.density = density }
         textDelegate.layoutWithConstraints(Constraints(), layoutDirection)
         val layoutResult = textDelegate.textLayoutResult
 
@@ -164,24 +160,23 @@
             val characterIndex = 2 // Start from 0.
             val text = "Hello"
 
-            val annotatedString = AnnotatedString(
-                text,
-                SpanStyle(fontSize = fontSize, fontFamily = fontFamily)
-            )
+            val annotatedString =
+                AnnotatedString(text, SpanStyle(fontSize = fontSize, fontFamily = fontFamily))
 
-            val textDelegate = MultiParagraphLayoutCache(
-                text = annotatedString,
-                style = TextStyle.Default,
-                fontFamilyResolver = fontFamilyResolver
-            ).also {
-                it.density = this
-            }
+            val textDelegate =
+                MultiParagraphLayoutCache(
+                        text = annotatedString,
+                        style = TextStyle.Default,
+                        fontFamilyResolver = fontFamilyResolver
+                    )
+                    .also { it.density = this }
             textDelegate.layoutWithConstraints(Constraints(), layoutDirection)
             val layoutResult = textDelegate.textLayoutResult
 
-            val selection = layoutResult.getOffsetForPosition(
-                position = Offset((fontSize.toPx() * characterIndex + 1), 0f)
-            )
+            val selection =
+                layoutResult.getOffsetForPosition(
+                    position = Offset((fontSize.toPx() * characterIndex + 1), 0f)
+                )
 
             assertThat(selection).isEqualTo(characterIndex)
         }
@@ -192,13 +187,13 @@
         val text = "Hello"
         val spanStyle = SpanStyle(fontSize = 20.sp, fontFamily = fontFamily)
         val annotatedString = AnnotatedString(text, spanStyle)
-        val textDelegate = MultiParagraphLayoutCache(
-            text = annotatedString,
-            style = TextStyle.Default,
-            fontFamilyResolver = fontFamilyResolver
-        ).also {
-            it.density = density
-        }
+        val textDelegate =
+            MultiParagraphLayoutCache(
+                    text = annotatedString,
+                    style = TextStyle.Default,
+                    fontFamilyResolver = fontFamilyResolver
+                )
+                .also { it.density = density }
 
         textDelegate.layoutWithConstraints(Constraints(), layoutDirection)
         val layoutResult = textDelegate.textLayoutResult
@@ -216,22 +211,19 @@
         val annotatedString = AnnotatedString(text, spanStyle)
         val maxLines = 3
 
-        val textDelegate = MultiParagraphLayoutCache(
-            text = annotatedString,
-            style = TextStyle.Default,
-            fontFamilyResolver = fontFamilyResolver,
-            maxLines = maxLines
-        ).also {
-            it.density = density
-        }
+        val textDelegate =
+            MultiParagraphLayoutCache(
+                    text = annotatedString,
+                    style = TextStyle.Default,
+                    fontFamilyResolver = fontFamilyResolver,
+                    maxLines = maxLines
+                )
+                .also { it.density = density }
 
         textDelegate.layoutWithConstraints(Constraints.fixed(0, 0), LayoutDirection.Ltr)
         // Tries to make 5 lines of text, which exceeds the given maxLines(3).
         val maxWidth = textDelegate.maxIntrinsicWidth(LayoutDirection.Ltr) / 5
-        textDelegate.layoutWithConstraints(
-            Constraints(maxWidth = maxWidth),
-            layoutDirection
-        )
+        textDelegate.layoutWithConstraints(Constraints(maxWidth = maxWidth), layoutDirection)
         val layoutResult = textDelegate.textLayoutResult
 
         assertThat(layoutResult.didOverflowHeight).isTrue()
@@ -244,22 +236,19 @@
         val annotatedString = AnnotatedString(text, spanStyle)
         val maxLines = 10
 
-        val textDelegate = MultiParagraphLayoutCache(
-            text = annotatedString,
-            style = TextStyle.Default,
-            fontFamilyResolver = fontFamilyResolver,
-            maxLines = maxLines
-        ).also {
-            it.density = density
-        }
+        val textDelegate =
+            MultiParagraphLayoutCache(
+                    text = annotatedString,
+                    style = TextStyle.Default,
+                    fontFamilyResolver = fontFamilyResolver,
+                    maxLines = maxLines
+                )
+                .also { it.density = density }
 
         textDelegate.layoutWithConstraints(Constraints.fixed(0, 0), LayoutDirection.Ltr)
         // Tries to make 5 lines of text, which doesn't exceed the given maxLines(10).
         val maxWidth = textDelegate.maxIntrinsicWidth(LayoutDirection.Ltr) / 5
-        textDelegate.layoutWithConstraints(
-            Constraints(maxWidth = maxWidth),
-            layoutDirection
-        )
+        textDelegate.layoutWithConstraints(Constraints(maxWidth = maxWidth), layoutDirection)
         val layoutResult = textDelegate.textLayoutResult
 
         assertThat(layoutResult.didOverflowHeight).isFalse()
@@ -271,27 +260,21 @@
         val spanStyle = SpanStyle(fontSize = 20.sp, fontFamily = fontFamily)
         val annotatedString = AnnotatedString(text, spanStyle)
 
-        val textDelegate = MultiParagraphLayoutCache(
-            text = annotatedString,
-            style = TextStyle.Default,
-            fontFamilyResolver = fontFamilyResolver,
-        ).also {
-            it.density = density
-        }
+        val textDelegate =
+            MultiParagraphLayoutCache(
+                    text = annotatedString,
+                    style = TextStyle.Default,
+                    fontFamilyResolver = fontFamilyResolver,
+                )
+                .also { it.density = density }
 
-        textDelegate.layoutWithConstraints(
-            Constraints(),
-            layoutDirection
-        )
+        textDelegate.layoutWithConstraints(Constraints(), layoutDirection)
 
         val maxIntrinsicsHeight = textDelegate.textLayoutResult.multiParagraph.height
 
         // Make maxHeight smaller than needed.
         val maxHeight = floor(maxIntrinsicsHeight / 2).toInt()
-        textDelegate.layoutWithConstraints(
-            Constraints(maxHeight = maxHeight),
-            layoutDirection
-        )
+        textDelegate.layoutWithConstraints(Constraints(maxHeight = maxHeight), layoutDirection)
         val layoutResult = textDelegate.textLayoutResult
 
         assertThat(layoutResult.didOverflowHeight).isTrue()
@@ -303,26 +286,20 @@
         val spanStyle = SpanStyle(fontSize = 20.sp, fontFamily = fontFamily)
         val annotatedString = AnnotatedString(text, spanStyle)
 
-        val textDelegate = MultiParagraphLayoutCache(
-            text = annotatedString,
-            style = TextStyle.Default,
-            fontFamilyResolver = fontFamilyResolver,
-        ).also {
-            it.density = density
-        }
+        val textDelegate =
+            MultiParagraphLayoutCache(
+                    text = annotatedString,
+                    style = TextStyle.Default,
+                    fontFamilyResolver = fontFamilyResolver,
+                )
+                .also { it.density = density }
 
-        textDelegate.layoutWithConstraints(
-            Constraints(),
-            layoutDirection
-        )
+        textDelegate.layoutWithConstraints(Constraints(), layoutDirection)
         val maxIntrinsicsHeight = textDelegate.textLayoutResult.multiParagraph.height
 
         // Make max height larger than the needed.
         val maxHeight = floor(maxIntrinsicsHeight * 2).toInt()
-        textDelegate.layoutWithConstraints(
-            Constraints(maxHeight = maxHeight),
-            layoutDirection
-        )
+        textDelegate.layoutWithConstraints(Constraints(maxHeight = maxHeight), layoutDirection)
         val layoutResult = textDelegate.textLayoutResult
 
         assertThat(layoutResult.didOverflowHeight).isFalse()
diff --git a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/modifiers/TextStringContentCaptureTest.kt b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/modifiers/TextStringContentCaptureTest.kt
index f5e7b31..ba48632 100644
--- a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/modifiers/TextStringContentCaptureTest.kt
+++ b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/modifiers/TextStringContentCaptureTest.kt
@@ -34,36 +34,26 @@
 
 class TextStringContentCaptureTest {
 
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
     private val context = InstrumentationRegistry.getInstrumentation().context
+
     private fun createSubject(text: String): TextStringSimpleElement {
-        return TextStringSimpleElement(
-            text,
-            TextStyle.Default,
-            createFontFamilyResolver(context)
-        )
+        return TextStringSimpleElement(text, TextStyle.Default, createFontFamilyResolver(context))
     }
 
     @Test
     fun whenChangingText_invalidateTranslation() {
         val original = "Ok"
         val current = mutableStateOf(createSubject(original))
-        rule.setContent {
-            Box(current.value)
-        }
+        rule.setContent { Box(current.value) }
 
         val semantics = rule.onNodeWithText(original).fetchSemanticsNode()
-        rule.runOnIdle {
-            semantics.translateTo("Foo")
-        }
+        rule.runOnIdle { semantics.translateTo("Foo") }
         val after = "After"
         current.value = createSubject(after)
 
         val newSemantics = rule.onNodeWithText(after).fetchSemanticsNode()
-        rule.runOnIdle {
-            Truth.assertThat(newSemantics.fetchTranslation()).isNull()
-        }
+        rule.runOnIdle { Truth.assertThat(newSemantics.fetchTranslation()).isNull() }
     }
 }
 
diff --git a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/modifiers/TextStringSimpleNodeInvalidationTest.kt b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/modifiers/TextStringSimpleNodeInvalidationTest.kt
index 868b399..bf5d70c 100644
--- a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/modifiers/TextStringSimpleNodeInvalidationTest.kt
+++ b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/modifiers/TextStringSimpleNodeInvalidationTest.kt
@@ -24,14 +24,15 @@
 
     override fun Any.updateAll(params: Params): Pair<Boolean, Boolean> {
         this as TextStringSimpleNode
-        return updateText(params.text) to updateLayoutRelatedArgs(
-            style = params.style,
-            minLines = params.minLines,
-            maxLines = params.maxLines,
-            softWrap = params.softWrap,
-            fontFamilyResolver = params.fontFamilyResolver,
-            overflow = params.overflow
-        )
+        return updateText(params.text) to
+            updateLayoutRelatedArgs(
+                style = params.style,
+                minLines = params.minLines,
+                maxLines = params.maxLines,
+                softWrap = params.softWrap,
+                fontFamilyResolver = params.fontFamilyResolver,
+                overflow = params.overflow
+            )
     }
 
     override fun Any.invalidateAll() {
diff --git a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/modifiers/TextStringSimpleNodeTest.kt b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/modifiers/TextStringSimpleNodeTest.kt
index 82d93c6..ad0d7e6 100644
--- a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/modifiers/TextStringSimpleNodeTest.kt
+++ b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/modifiers/TextStringSimpleNodeTest.kt
@@ -79,25 +79,23 @@
 @MediumTest
 @RunWith(AndroidJUnit4::class)
 class TextStringSimpleNodeTest {
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
     val context: Context = InstrumentationRegistry.getInstrumentation().context
 
     @Test
     fun draw_whenNotAttached_doesNotCrash() {
-        val subject = TextStringSimpleNode(
-            "text", TextStyle.Default, createFontFamilyResolver(context)
-        )
+        val subject =
+            TextStringSimpleNode("text", TextStyle.Default, createFontFamilyResolver(context))
         rule.setContent {
             Canvas(Modifier.fillMaxSize()) {
-                val contentDrawScope = object : ContentDrawScope, DrawScope by this {
-                    override fun drawContent() {
-                        fail("Not used")
+                val contentDrawScope =
+                    object : ContentDrawScope, DrawScope by this {
+                        override fun drawContent() {
+                            fail("Not used")
+                        }
                     }
-                } as ContentDrawScope
-                with(subject) {
-                    contentDrawScope.draw()
-                }
+                        as ContentDrawScope
+                with(subject) { contentDrawScope.draw() }
             }
         }
         rule.waitForIdle()
@@ -121,21 +119,18 @@
         var flag by mutableStateOf(false)
 
         rule.setContent {
-            val content =
-                remember {
-                    movableContentOf {
-                        BoxWithConstraints {
-                            BasicText(
-                                text = if (!flag) "" else "LOADED",
-                                modifier = Modifier.testTag("target")
-                            )
-                        }
+            val content = remember {
+                movableContentOf {
+                    BoxWithConstraints {
+                        BasicText(
+                            text = if (!flag) "" else "LOADED",
+                            modifier = Modifier.testTag("target")
+                        )
                     }
                 }
-
-            key(flag) {
-                content()
             }
+
+            key(flag) { content() }
         }
 
         val textLayout1 = rule.onNodeWithTag("target").fetchTextLayoutResult()
@@ -155,17 +150,21 @@
         val drawChannel = Channel<Unit>(capacity = Channel.UNLIMITED)
         val drawCount = AtomicInteger(0)
         val asyncFont = makeAsyncFont(loadDeferred)
-        val subject = TextStringSimpleElement(
-            "til",
-            TextStyle.Default.copy(fontFamily = asyncFont.toFontFamily()),
-            createFontFamilyResolver(context)
-        )
+        val subject =
+            TextStringSimpleElement(
+                "til",
+                TextStyle.Default.copy(fontFamily = asyncFont.toFontFamily()),
+                createFontFamilyResolver(context)
+            )
 
-        val modifier = Modifier.fillMaxSize() then subject then Modifier.drawBehind {
-            drawRect(Color.Magenta, size = Size(100f, 100f))
-            drawCount.incrementAndGet()
-            drawChannel.trySend(Unit)
-        }
+        val modifier =
+            Modifier.fillMaxSize() then
+                subject then
+                Modifier.drawBehind {
+                    drawRect(Color.Magenta, size = Size(100f, 100f))
+                    drawCount.incrementAndGet()
+                    drawChannel.trySend(Unit)
+                }
 
         rule.setContent {
             Layout(modifier) { _, constraints ->
@@ -186,10 +185,7 @@
 
         // this may take a while to make compose non-idle, so wait for drawChannel explicit sync
         loadDeferred.complete(Unit)
-        runBlocking { withTimeout(1_000L) {
-            drawChannel.receive()
-        }
-        }
+        runBlocking { withTimeout(1_000L) { drawChannel.receive() } }
         rule.waitForIdle()
 
         Truth.assertThat(drawCount.get()).isGreaterThan(initialCount)
@@ -199,24 +195,18 @@
     fun setTextSubstitution_invalidatesDraw() {
         val drawCount = AtomicInteger(0)
 
-        val subject = TextStringSimpleElement(
-            "til",
-            TextStyle.Default,
-            createFontFamilyResolver(context)
-        )
+        val subject =
+            TextStringSimpleElement("til", TextStyle.Default, createFontFamilyResolver(context))
 
-        val modifier = Modifier.fillMaxSize().drawBehind {
+        val modifier =
+            Modifier.fillMaxSize().drawBehind {
                 drawRect(Color.Magenta, size = Size(100f, 100f))
                 drawCount.incrementAndGet()
             } then subject
 
-        rule.setContent {
-            Box(modifier)
-        }
+        rule.setContent { Box(modifier) }
         val initialCount = drawCount.get()
-        rule.runOnIdle {
-            Truth.assertThat(initialCount).isGreaterThan(0)
-        }
+        rule.runOnIdle { Truth.assertThat(initialCount).isGreaterThan(0) }
 
         val node = rule.onNodeWithText("til").fetchSemanticsNode()
 
@@ -230,15 +220,10 @@
 
     @Test
     fun setTextSubstitution_setsSemantics() {
-        val subject = TextStringSimpleElement(
-            "til",
-            TextStyle.Default,
-            createFontFamilyResolver(context)
-        )
+        val subject =
+            TextStringSimpleElement("til", TextStyle.Default, createFontFamilyResolver(context))
 
-        rule.setContent {
-            Box(Modifier.fillMaxSize() then subject)
-        }
+        rule.setContent { Box(Modifier.fillMaxSize() then subject) }
 
         val node = rule.onNodeWithText("til").fetchSemanticsNode()
 
@@ -255,23 +240,22 @@
 
     private fun makeAsyncFont(loadDeferred: Deferred<Unit>): Font {
 
-        val typefaceLoader = object : AndroidFont.TypefaceLoader {
-            override fun loadBlocking(context: Context, font: AndroidFont): Typeface? {
-                TODO("Not yet implemented")
-            }
+        val typefaceLoader =
+            object : AndroidFont.TypefaceLoader {
+                override fun loadBlocking(context: Context, font: AndroidFont): Typeface? {
+                    TODO("Not yet implemented")
+                }
 
-            override suspend fun awaitLoad(context: Context, font: AndroidFont): Typeface? {
-                loadDeferred.await()
-                return Typeface.create("cursive", 0)
+                override suspend fun awaitLoad(context: Context, font: AndroidFont): Typeface? {
+                    loadDeferred.await()
+                    return Typeface.create("cursive", 0)
+                }
             }
-        }
-        return object : AndroidFont(
-            FontLoadingStrategy.Async,
-            typefaceLoader,
-            FontVariation.Settings()
-        ) {
+        return object :
+            AndroidFont(FontLoadingStrategy.Async, typefaceLoader, FontVariation.Settings()) {
             override val weight: FontWeight
                 get() = FontWeight.Normal
+
             override val style: FontStyle
                 get() = FontStyle.Normal
         }
diff --git a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/selection/AbstractSelectionMagnifierTests.kt b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/selection/AbstractSelectionMagnifierTests.kt
index 7c9354c..afbd0ed 100644
--- a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/selection/AbstractSelectionMagnifierTests.kt
+++ b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/selection/AbstractSelectionMagnifierTests.kt
@@ -59,14 +59,13 @@
 import org.junit.Test
 
 /**
- * Shared tests for both [SelectionContainer]+[BasicText] and [BasicTextField] magnifiers.
- * The `check*` methods here should be called from tests in both [SelectionContainerMagnifierTest]
- * and [TextFieldMagnifierTest].
+ * Shared tests for both [SelectionContainer]+[BasicText] and [BasicTextField] magnifiers. The
+ * `check*` methods here should be called from tests in both [SelectionContainerMagnifierTest] and
+ * [TextFieldMagnifierTest].
  */
 internal abstract class AbstractSelectionMagnifierTests : FocusedWindowTest {
 
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
     protected val defaultMagnifierSize = IntSize.Zero
     protected val tag = "tag"
@@ -90,10 +89,11 @@
     @Test
     fun centerIsUnspecified_whenNotDragging() {
         val manager = SelectionManager(SelectionRegistrarImpl())
-        manager.selection = Selection(
-            start = Selection.AnchorInfo(ResolvedTextDirection.Ltr, 0, 0),
-            end = Selection.AnchorInfo(ResolvedTextDirection.Ltr, 1, 0)
-        )
+        manager.selection =
+            Selection(
+                start = Selection.AnchorInfo(ResolvedTextDirection.Ltr, 0, 0),
+                end = Selection.AnchorInfo(ResolvedTextDirection.Ltr, 1, 0)
+            )
         val center = calculateSelectionMagnifierCenterAndroid(manager, defaultMagnifierSize)
         assertThat(center).isEqualTo(Offset.Unspecified)
     }
@@ -108,16 +108,20 @@
         lateinit var textLayout: TextLayoutResult
         rule.setTextFieldTestContent {
             Content(
-                text = """
+                text =
+                    """
                     $rtlWord $ltrWord
                     $ltrWord $rtlWord
                     $rtlWord $ltrWord
-                """.trimIndent().trim(),
-                modifier = Modifier
-                    // Center the text to give the magnifier lots of room to move.
-                    .fillMaxSize()
-                    .wrapContentHeight()
-                    .testTag(tag),
+                """
+                        .trimIndent()
+                        .trim(),
+                modifier =
+                    Modifier
+                        // Center the text to give the magnifier lots of room to move.
+                        .fillMaxSize()
+                        .wrapContentHeight()
+                        .testTag(tag),
                 onTextLayout = { textLayout = it }
             )
         }
@@ -149,9 +153,7 @@
 
         val secondLineCenterY = getCenterForLine(1)
         val secondOffset = Offset(farRightX, secondLineCenterY)
-        rule.onNodeWithTag(tag).performTouchInput {
-            moveTo(secondOffset)
-        }
+        rule.onNodeWithTag(tag).performTouchInput { moveTo(secondOffset) }
         rule.waitForIdle()
         assertWithMessage("Magnifier should not be shown")
             .that(getMagnifierCenterOffset(rule).isUnspecified)
@@ -159,9 +161,7 @@
 
         val lineRightX = textLayout.getLineRight(1)
         val thirdOffset = Offset(lineRightX + 1f, secondLineCenterY)
-        rule.onNodeWithTag(tag).performTouchInput {
-            moveTo(thirdOffset)
-        }
+        rule.onNodeWithTag(tag).performTouchInput { moveTo(thirdOffset) }
         rule.waitForIdle()
         val actual = getMagnifierCenterOffset(rule, requireSpecified = true) - placedPosition
         assertThatOffset(actual).equalsWithTolerance(Offset(lineRightX, secondLineCenterY))
@@ -206,33 +206,29 @@
         }
         assertMagnifierAt(firstPressOffset)
 
-        fun getOffsetAtLine(line: Int): Offset = Offset(
-            x = firstPressOffset.x,
-            y = lerp(
-                start = textLayout.getLineTop(lineIndex = line),
-                stop = textLayout.getLineBottom(lineIndex = line),
-                fraction = 0.5f
+        fun getOffsetAtLine(line: Int): Offset =
+            Offset(
+                x = firstPressOffset.x,
+                y =
+                    lerp(
+                        start = textLayout.getLineTop(lineIndex = line),
+                        stop = textLayout.getLineBottom(lineIndex = line),
+                        fraction = 0.5f
+                    )
             )
-        )
 
         val secondOffset = getOffsetAtLine(1)
-        rule.onNodeWithTag(tag).performTouchInput {
-            moveTo(secondOffset)
-        }
+        rule.onNodeWithTag(tag).performTouchInput { moveTo(secondOffset) }
         assertMagnifierAt(Offset(0f, secondOffset.y))
 
         val thirdOffset = getOffsetAtLine(2)
-        rule.onNodeWithTag(tag).performTouchInput {
-            moveTo(thirdOffset)
-        }
+        rule.onNodeWithTag(tag).performTouchInput { moveTo(thirdOffset) }
         assertMagnifierAt(Offset(0f, thirdOffset.y))
     }
 
     @Test
     fun magnifier_hidden_whenTextIsEmpty() {
-        rule.setTextFieldTestContent {
-            Content("", Modifier.testTag(tag))
-        }
+        rule.setTextFieldTestContent { Content("", Modifier.testTag(tag)) }
 
         // Initiate selection.
         // TODO(b/209698586) Select programmatically once that's fixed.
@@ -244,9 +240,7 @@
 
     @Test
     fun magnifier_hidden_whenSelectionWithoutHandleTouch() {
-        rule.setTextFieldTestContent {
-            Content("aaaa aaaa aaaa", Modifier.testTag(tag))
-        }
+        rule.setTextFieldTestContent { Content("aaaa aaaa aaaa", Modifier.testTag(tag)) }
         // Initiate selection.
         // TODO(b/209698586) Select programmatically once that's fixed.
         rule.onNodeWithTag(tag).performTouchInput { longClick() }
@@ -399,47 +393,40 @@
     ) = TestContent(text, modifier, style, onTextLayout, maxLines)
 
     protected fun checkMagnifierAppears_whileHandleTouched(handle: Handle) {
-        rule.setTextFieldTestContent {
-            Content("aaaa aaaa aaaa", Modifier.testTag(tag))
-        }
+        rule.setTextFieldTestContent { Content("aaaa aaaa aaaa", Modifier.testTag(tag)) }
 
         showHandle(handle)
 
         // Touch the handle to show the magnifier.
-        rule.onNode(isSelectionHandle(handle))
-            .performTouchInput { down(center) }
+        rule.onNode(isSelectionHandle(handle)).performTouchInput { down(center) }
 
         assertMagnifierExists(rule)
 
         // Stop touching the handle to hide the magnifier.
-        rule.onNode(isSelectionHandle(handle))
-            .performTouchInput { up() }
+        rule.onNode(isSelectionHandle(handle)).performTouchInput { up() }
 
         assertNoMagnifierExists(rule)
     }
 
     protected fun checkMagnifierAppears_whenCursorHandleDragged() {
-        rule.setTextFieldTestContent {
-            Content("aaaa aaaa aaaa", Modifier.testTag(tag))
-        }
+        rule.setTextFieldTestContent { Content("aaaa aaaa aaaa", Modifier.testTag(tag)) }
 
         showHandle(Handle.Cursor)
 
         // Touch the handle
-        rule.onNode(isSelectionHandle(Handle.Cursor))
-            .performTouchInput { down(center) }
+        rule.onNode(isSelectionHandle(Handle.Cursor)).performTouchInput { down(center) }
 
         assertNoMagnifierExists(rule)
 
         // move the handle to show the magnifier
-        rule.onNode(isSelectionHandle(Handle.Cursor))
-            .performTouchInput { movePastSlopBy(Offset(x = 1f, y = 0f)) }
+        rule.onNode(isSelectionHandle(Handle.Cursor)).performTouchInput {
+            movePastSlopBy(Offset(x = 1f, y = 0f))
+        }
 
         assertMagnifierExists(rule)
 
         // Stop touching the handle to hide the magnifier.
-        rule.onNode(isSelectionHandle(Handle.Cursor))
-            .performTouchInput { up() }
+        rule.onNode(isSelectionHandle(Handle.Cursor)).performTouchInput { up() }
 
         assertNoMagnifierExists(rule)
     }
@@ -457,11 +444,12 @@
             Content(
                 text = "$word $word $word",
                 onTextLayout = { textLayout = it },
-                modifier = Modifier
-                    // Center the text to give the magnifier lots of room to move.
-                    .fillMaxSize()
-                    .wrapContentSize()
-                    .testTag(tag)
+                modifier =
+                    Modifier
+                        // Center the text to give the magnifier lots of room to move.
+                        .fillMaxSize()
+                        .wrapContentSize()
+                        .testTag(tag)
             )
         }
 
@@ -473,22 +461,20 @@
         rule.waitForIdle()
 
         // Initiate selection.
-        rule.onNodeWithTag(tag)
-            .performTouchInput {
-                down(center)
-                moveBy(Offset.Zero, delayMillis = viewConfiguration.longPressTimeoutMillis + 100)
-            }
+        rule.onNodeWithTag(tag).performTouchInput {
+            down(center)
+            moveBy(Offset.Zero, delayMillis = viewConfiguration.longPressTimeoutMillis + 100)
+        }
 
         // Magnifier should show after long-press starts.
         val magnifierInitialPosition = getMagnifierCenterOffset(rule, requireSpecified = true)
 
         // Drag horizontally - the magnifier should follow.
-        rule.onNodeWithTag(tag)
-            .performTouchInput {
-                // Don't need to worry about touch slop for this test since the drag starts as soon
-                // as the long click is detected.
-                moveBy(dragDistance * dragDirection)
-            }
+        rule.onNodeWithTag(tag).performTouchInput {
+            // Don't need to worry about touch slop for this test since the drag starts as soon
+            // as the long click is detected.
+            moveBy(dragDistance * dragDirection)
+        }
 
         assertThat(getMagnifierCenterOffset(rule))
             .isEqualTo(magnifierInitialPosition + (dragDistance * dragDirection))
@@ -504,11 +490,12 @@
         rule.setTextFieldTestContent {
             Content(
                 text = "$word $word $word",
-                modifier = Modifier
-                    // Center the text to give the magnifier lots of room to move.
-                    .fillMaxSize()
-                    .wrapContentSize()
-                    .testTag(tag)
+                modifier =
+                    Modifier
+                        // Center the text to give the magnifier lots of room to move.
+                        .fillMaxSize()
+                        .wrapContentSize()
+                        .testTag(tag)
             )
         }
 
@@ -522,8 +509,7 @@
         val magnifierInitialPosition = getMagnifierCenterOffset(rule, requireSpecified = true)
 
         // Drag the handle horizontally - the magnifier should follow.
-        rule.onNode(isSelectionHandle(handle))
-            .performTouchInput { moveBy(dragDistance) }
+        rule.onNode(isSelectionHandle(handle)).performTouchInput { moveBy(dragDistance) }
 
         assertThat(getMagnifierCenterOffset(rule))
             .isEqualTo(magnifierInitialPosition + dragDistance)
@@ -566,9 +552,7 @@
         val magnifierInitialPosition = getMagnifierCenterOffset(rule, requireSpecified = true)
 
         // Drag just a little past the end of the line.
-        rule.onNode(isSelectionHandle(handle)).performTouchInput {
-            moveBy(moveOffset)
-        }
+        rule.onNode(isSelectionHandle(handle)).performTouchInput { moveBy(moveOffset) }
 
         // The magnifier shouldn't have moved.
         assertThat(getMagnifierCenterOffset(rule)).isEqualTo(magnifierInitialPosition)
@@ -587,26 +571,24 @@
             Content(
                 text = "$word $word\n$word\n$word $word",
                 style = TextStyle(textAlign = TextAlign.Center),
-                modifier = Modifier
-                    .onSizeChanged { screenWidth = it.width }
-                    // Center the text to give the magnifier lots of room to move.
-                    .fillMaxSize()
-                    .wrapContentSize()
-                    .testTag(tag)
+                modifier =
+                    Modifier.onSizeChanged { screenWidth = it.width }
+                        // Center the text to give the magnifier lots of room to move.
+                        .fillMaxSize()
+                        .wrapContentSize()
+                        .testTag(tag)
             )
         }
 
         showHandle(handle)
 
         // Touch the handle to show the magnifier.
-        rule.onNode(isSelectionHandle(handle))
-            .performTouchInput { down(center) }
+        rule.onNode(isSelectionHandle(handle)).performTouchInput { down(center) }
 
         // Drag all the way past the end of the line.
-        rule.onNode(isSelectionHandle(handle))
-            .performTouchInput {
-                moveBy(Offset(screenWidth.toFloat(), 0f) * dragDirection)
-            }
+        rule.onNode(isSelectionHandle(handle)).performTouchInput {
+            moveBy(Offset(screenWidth.toFloat(), 0f) * dragDirection)
+        }
 
         // The magnifier should be gone.
         assertNoMagnifierExists(rule)
@@ -630,19 +612,15 @@
         showHandle(handle)
 
         // Touch the handle to show the magnifier.
-        rule.onNode(isSelectionHandle(handle))
-            .performTouchInput { down(center) }
+        rule.onNode(isSelectionHandle(handle)).performTouchInput { down(center) }
         val magnifierInitialPosition = getMagnifierCenterOffset(rule, requireSpecified = true)
 
         // Drag the handle down - the magnifier should follow.
-        rule.onNode(isSelectionHandle(handle))
-            .performTouchInput { movePastSlopBy(dragDistance) }
+        rule.onNode(isSelectionHandle(handle)).performTouchInput { movePastSlopBy(dragDistance) }
 
         val (x, y) = getMagnifierCenterOffset(rule)
         assertThat(x).isEqualTo(magnifierInitialPosition.x)
-        assertThat(y)
-            .isWithin(1f)
-            .of(magnifierInitialPosition.y + lineHeight)
+        assertThat(y).isWithin(1f).of(magnifierInitialPosition.y + lineHeight)
     }
 
     protected fun checkMagnifierAsHandleGoesOutOfBoundsUsingMaxLines(handle: Handle) {
@@ -663,13 +641,11 @@
         showHandle(handle)
 
         // Touch the handle to show the magnifier.
-        rule.onNode(isSelectionHandle(handle))
-            .performTouchInput { down(center) }
+        rule.onNode(isSelectionHandle(handle)).performTouchInput { down(center) }
 
         // Drag the handle down - the magnifier should follow.
         val dragDistance = Offset(0f, lineHeight)
-        rule.onNode(isSelectionHandle(handle))
-            .performTouchInput { movePastSlopBy(dragDistance) }
+        rule.onNode(isSelectionHandle(handle)).performTouchInput { movePastSlopBy(dragDistance) }
 
         assertNoMagnifierExists(rule)
     }
@@ -690,25 +666,21 @@
         showHandle(handle)
 
         // Touch the handle to show the magnifier.
-        rule.onNode(isSelectionHandle(handle))
-            .performTouchInput { down(center) }
+        rule.onNode(isSelectionHandle(handle)).performTouchInput { down(center) }
 
         val magnifierInitialPosition = getMagnifierCenterOffset(rule, requireSpecified = true)
 
         // Drag the handle up - the magnifier should not follow.
         // Note that dragging it down *should* cause it to move to the line below, so only drag up.
-        rule.onNode(isSelectionHandle(handle))
-            .performTouchInput {
-                movePastSlopBy(-dragDistance)
-            }
+        rule.onNode(isSelectionHandle(handle)).performTouchInput { movePastSlopBy(-dragDistance) }
 
-        assertThat(getMagnifierCenterOffset(rule))
-            .isEqualTo(magnifierInitialPosition)
+        assertThat(getMagnifierCenterOffset(rule)).isEqualTo(magnifierInitialPosition)
     }
 
-    private fun isSelectionHandle(handle: Handle) = SemanticsMatcher("is $handle handle") { node ->
-        node.config.getOrNull(SelectionHandleInfoKey)?.handle == handle
-    }
+    private fun isSelectionHandle(handle: Handle) =
+        SemanticsMatcher("is $handle handle") { node ->
+            node.config.getOrNull(SelectionHandleInfoKey)?.handle == handle
+        }
 
     private fun showHandle(handle: Handle) {
         if (handle == Handle.Cursor) {
@@ -720,16 +692,17 @@
     }
 
     /**
-     * Moves the first pointer by [delta] past the touch slop threshold on each axis.
-     * If [delta] is 0 on either axis it will stay 0.
+     * Moves the first pointer by [delta] past the touch slop threshold on each axis. If [delta] is
+     * 0 on either axis it will stay 0.
      */
     // TODO(b/210545925) This is here because we can't disable the touch slop in a popup. When
     //  that's fixed we can just disable slop and delete this function.
     protected fun TouchInjectionScope.movePastSlopBy(delta: Offset) {
-        val slop = Offset(
-            x = viewConfiguration.touchSlop * delta.x.sign,
-            y = viewConfiguration.touchSlop * delta.y.sign
-        )
+        val slop =
+            Offset(
+                x = viewConfiguration.touchSlop * delta.x.sign,
+                y = viewConfiguration.touchSlop * delta.y.sign
+            )
         moveBy(delta + slop)
     }
 }
@@ -743,8 +716,9 @@
 ) : Subject(failureMetadata, subject) {
 
     companion object {
-        val INSTANCE: Factory<OffsetSubject, Offset> =
-            Factory { failureMetadata, subject -> OffsetSubject(failureMetadata, subject) }
+        val INSTANCE: Factory<OffsetSubject, Offset> = Factory { failureMetadata, subject ->
+            OffsetSubject(failureMetadata, subject)
+        }
     }
 
     fun equalsWithTolerance(expected: Offset, tolerance: Float = 0.001f) {
diff --git a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/selection/MagnifierTestUtils.kt b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/selection/MagnifierTestUtils.kt
index e926727..0c7220a 100644
--- a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/selection/MagnifierTestUtils.kt
+++ b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/selection/MagnifierTestUtils.kt
@@ -52,9 +52,9 @@
 }
 
 /**
- * Asserts that there is no magnifier being displayed. This may be because no
- * `Modifier.magnifier` modifiers are currently set on any nodes, or because all the magnifiers
- * that exist have an unspecified position.
+ * Asserts that there is no magnifier being displayed. This may be because no `Modifier.magnifier`
+ * modifiers are currently set on any nodes, or because all the magnifiers that exist have an
+ * unspecified position.
  */
 internal fun assertNoMagnifierExists(rule: ComposeTestRule) {
     // The magnifier semantics will be present whenever the modifier is, even if the modifier
@@ -67,11 +67,8 @@
 }
 
 internal fun getMagnifierPositions(rule: ComposeTestRule) =
-    rule.onAllNodes(SemanticsMatcher.keyIsDefined(MagnifierPositionInRoot))
+    rule
+        .onAllNodes(SemanticsMatcher.keyIsDefined(MagnifierPositionInRoot))
         .fetchSemanticsNodes(atLeastOneRootRequired = false)
         .map { it.config[MagnifierPositionInRoot] }
-        .let { positionFunctions ->
-            rule.runOnIdle {
-                positionFunctions.map { it.invoke() }
-            }
-        }
+        .let { positionFunctions -> rule.runOnIdle { positionFunctions.map { it.invoke() } } }
diff --git a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/selection/MotionEventTestUtils.kt b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/selection/MotionEventTestUtils.kt
index a262ae0..8654c32 100644
--- a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/selection/MotionEventTestUtils.kt
+++ b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/selection/MotionEventTestUtils.kt
@@ -25,26 +25,26 @@
     actionIndex: Int,
     pointerProperties: Array<MotionEvent.PointerProperties>,
     pointerCoords: Array<MotionEvent.PointerCoords>
-) = MotionEvent.obtain(
-    0,
-    eventTime.toLong(),
-    action + (actionIndex shl MotionEvent.ACTION_POINTER_INDEX_SHIFT),
-    numPointers,
-    pointerProperties,
-    pointerCoords,
-    0,
-    0,
-    0f,
-    0f,
-    0,
-    0,
-    0,
-    0
-)
+) =
+    MotionEvent.obtain(
+        0,
+        eventTime.toLong(),
+        action + (actionIndex shl MotionEvent.ACTION_POINTER_INDEX_SHIFT),
+        numPointers,
+        pointerProperties,
+        pointerCoords,
+        0,
+        0,
+        0f,
+        0f,
+        0,
+        0,
+        0,
+        0
+    )
 
 @Suppress("RemoveRedundantQualifierName")
-internal fun PointerProperties(id: Int) =
-    MotionEvent.PointerProperties().apply { this.id = id }
+internal fun PointerProperties(id: Int) = MotionEvent.PointerProperties().apply { this.id = id }
 
 @Suppress("RemoveRedundantQualifierName")
 internal fun PointerCoords(x: Float, y: Float) =
diff --git a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/selection/MultiWidgetSelectionDelegateTest.kt b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/selection/MultiWidgetSelectionDelegateTest.kt
index c06b6e5..9044af2 100644
--- a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/selection/MultiWidgetSelectionDelegateTest.kt
+++ b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/selection/MultiWidgetSelectionDelegateTest.kt
@@ -59,45 +59,43 @@
         val text = "hello world\n"
         val fontSize = 20.sp
 
-        val layoutResult = simpleTextLayout(
-            text = text,
-            fontSize = fontSize,
-            density = defaultDensity
-        )
+        val layoutResult =
+            simpleTextLayout(text = text, fontSize = fontSize, density = defaultDensity)
 
         val layoutCoordinates = mock<LayoutCoordinates>()
         whenever(layoutCoordinates.isAttached).thenReturn(true)
 
         val selectableId = 1L
-        val selectable = MultiWidgetSelectionDelegate(
-            selectableId = selectableId,
-            coordinatesCallback = { layoutCoordinates },
-            layoutResultCallback = { layoutResult }
-        )
+        val selectable =
+            MultiWidgetSelectionDelegate(
+                selectableId = selectableId,
+                coordinatesCallback = { layoutCoordinates },
+                layoutResultCallback = { layoutResult }
+            )
 
         val selectableInvalidId = 2L
         val startOffset = text.indexOf('h')
         val endOffset = text.indexOf('o')
 
-        val selection = Selection(
-            start = Selection.AnchorInfo(
-                direction = ResolvedTextDirection.Ltr,
-                offset = startOffset,
-                selectableId = selectableInvalidId
-            ),
-            end = Selection.AnchorInfo(
-                direction = ResolvedTextDirection.Ltr,
-                offset = endOffset,
-                selectableId = selectableInvalidId
-            ),
-            handlesCrossed = false
-        )
+        val selection =
+            Selection(
+                start =
+                    Selection.AnchorInfo(
+                        direction = ResolvedTextDirection.Ltr,
+                        offset = startOffset,
+                        selectableId = selectableInvalidId
+                    ),
+                end =
+                    Selection.AnchorInfo(
+                        direction = ResolvedTextDirection.Ltr,
+                        offset = endOffset,
+                        selectableId = selectableInvalidId
+                    ),
+                handlesCrossed = false
+            )
 
         // Act.
-        val coordinates = selectable.getHandlePosition(
-            selection = selection,
-            isStartHandle = true
-        )
+        val coordinates = selectable.getHandlePosition(selection = selection, isStartHandle = true)
 
         // Assert.
         assertThat(coordinates).isEqualTo(Offset.Unspecified)
@@ -108,45 +106,43 @@
         val text = "hello world\n"
         val fontSize = 20.sp
 
-        val layoutResult = simpleTextLayout(
-            text = text,
-            fontSize = fontSize,
-            density = defaultDensity
-        )
+        val layoutResult =
+            simpleTextLayout(text = text, fontSize = fontSize, density = defaultDensity)
 
         val layoutCoordinates = mock<LayoutCoordinates>()
         whenever(layoutCoordinates.isAttached).thenReturn(true)
 
         val selectableId = 1L
-        val selectable = MultiWidgetSelectionDelegate(
-            selectableId = selectableId,
-            coordinatesCallback = { layoutCoordinates },
-            layoutResultCallback = { layoutResult }
-        )
+        val selectable =
+            MultiWidgetSelectionDelegate(
+                selectableId = selectableId,
+                coordinatesCallback = { layoutCoordinates },
+                layoutResultCallback = { layoutResult }
+            )
 
         val selectableInvalidId = 2L
         val startOffset = text.indexOf('h')
         val endOffset = text.indexOf('o')
 
-        val selection = Selection(
-            start = Selection.AnchorInfo(
-                direction = ResolvedTextDirection.Ltr,
-                offset = startOffset,
-                selectableId = selectableInvalidId
-            ),
-            end = Selection.AnchorInfo(
-                direction = ResolvedTextDirection.Ltr,
-                offset = endOffset,
-                selectableId = selectableInvalidId
-            ),
-            handlesCrossed = false
-        )
+        val selection =
+            Selection(
+                start =
+                    Selection.AnchorInfo(
+                        direction = ResolvedTextDirection.Ltr,
+                        offset = startOffset,
+                        selectableId = selectableInvalidId
+                    ),
+                end =
+                    Selection.AnchorInfo(
+                        direction = ResolvedTextDirection.Ltr,
+                        offset = endOffset,
+                        selectableId = selectableInvalidId
+                    ),
+                handlesCrossed = false
+            )
 
         // Act.
-        val coordinates = selectable.getHandlePosition(
-            selection = selection,
-            isStartHandle = false
-        )
+        val coordinates = selectable.getHandlePosition(selection = selection, isStartHandle = false)
 
         // Assert.
         assertThat(coordinates).isEqualTo(Offset.Unspecified)
@@ -158,49 +154,45 @@
         val fontSize = 20.sp
         val fontSizeInPx = with(defaultDensity) { fontSize.toPx() }
 
-        val layoutResult = simpleTextLayout(
-            text = text,
-            fontSize = fontSize,
-            density = defaultDensity
-        )
+        val layoutResult =
+            simpleTextLayout(text = text, fontSize = fontSize, density = defaultDensity)
 
         val layoutCoordinates = mock<LayoutCoordinates>()
         whenever(layoutCoordinates.isAttached).thenReturn(true)
 
         val selectableId = 1L
-        val selectable = MultiWidgetSelectionDelegate(
-            selectableId = selectableId,
-            coordinatesCallback = { layoutCoordinates },
-            layoutResultCallback = { layoutResult }
-        )
+        val selectable =
+            MultiWidgetSelectionDelegate(
+                selectableId = selectableId,
+                coordinatesCallback = { layoutCoordinates },
+                layoutResultCallback = { layoutResult }
+            )
 
         val startOffset = text.indexOf('h')
         val endOffset = text.indexOf('o')
 
-        val selection = Selection(
-            start = Selection.AnchorInfo(
-                direction = ResolvedTextDirection.Ltr,
-                offset = startOffset,
-                selectableId = selectableId
-            ),
-            end = Selection.AnchorInfo(
-                direction = ResolvedTextDirection.Ltr,
-                offset = endOffset,
-                selectableId = selectableId
-            ),
-            handlesCrossed = false
-        )
+        val selection =
+            Selection(
+                start =
+                    Selection.AnchorInfo(
+                        direction = ResolvedTextDirection.Ltr,
+                        offset = startOffset,
+                        selectableId = selectableId
+                    ),
+                end =
+                    Selection.AnchorInfo(
+                        direction = ResolvedTextDirection.Ltr,
+                        offset = endOffset,
+                        selectableId = selectableId
+                    ),
+                handlesCrossed = false
+            )
 
         // Act.
-        val coordinates = selectable.getHandlePosition(
-            selection = selection,
-            isStartHandle = true
-        )
+        val coordinates = selectable.getHandlePosition(selection = selection, isStartHandle = true)
 
         // Assert.
-        assertThat(coordinates).isEqualTo(
-            Offset((fontSizeInPx * startOffset), fontSizeInPx)
-        )
+        assertThat(coordinates).isEqualTo(Offset((fontSizeInPx * startOffset), fontSizeInPx))
     }
 
     @Test
@@ -209,49 +201,45 @@
         val fontSize = 20.sp
         val fontSizeInPx = with(defaultDensity) { fontSize.toPx() }
 
-        val layoutResult = simpleTextLayout(
-            text = text,
-            fontSize = fontSize,
-            density = defaultDensity
-        )
+        val layoutResult =
+            simpleTextLayout(text = text, fontSize = fontSize, density = defaultDensity)
 
         val layoutCoordinates = mock<LayoutCoordinates>()
         whenever(layoutCoordinates.isAttached).thenReturn(true)
 
         val selectableId = 1L
-        val selectable = MultiWidgetSelectionDelegate(
-            selectableId = selectableId,
-            coordinatesCallback = { layoutCoordinates },
-            layoutResultCallback = { layoutResult }
-        )
+        val selectable =
+            MultiWidgetSelectionDelegate(
+                selectableId = selectableId,
+                coordinatesCallback = { layoutCoordinates },
+                layoutResultCallback = { layoutResult }
+            )
 
         val startOffset = text.indexOf('o')
         val endOffset = text.indexOf('h')
 
-        val selection = Selection(
-            start = Selection.AnchorInfo(
-                direction = ResolvedTextDirection.Ltr,
-                offset = startOffset,
-                selectableId = selectableId
-            ),
-            end = Selection.AnchorInfo(
-                direction = ResolvedTextDirection.Ltr,
-                offset = endOffset,
-                selectableId = selectableId
-            ),
-            handlesCrossed = true
-        )
+        val selection =
+            Selection(
+                start =
+                    Selection.AnchorInfo(
+                        direction = ResolvedTextDirection.Ltr,
+                        offset = startOffset,
+                        selectableId = selectableId
+                    ),
+                end =
+                    Selection.AnchorInfo(
+                        direction = ResolvedTextDirection.Ltr,
+                        offset = endOffset,
+                        selectableId = selectableId
+                    ),
+                handlesCrossed = true
+            )
 
         // Act.
-        val coordinates = selectable.getHandlePosition(
-            selection = selection,
-            isStartHandle = true
-        )
+        val coordinates = selectable.getHandlePosition(selection = selection, isStartHandle = true)
 
         // Assert.
-        assertThat(coordinates).isEqualTo(
-            Offset((fontSizeInPx * startOffset), fontSizeInPx)
-        )
+        assertThat(coordinates).isEqualTo(Offset((fontSizeInPx * startOffset), fontSizeInPx))
     }
 
     @Test
@@ -260,49 +248,46 @@
         val fontSize = 20.sp
         val fontSizeInPx = with(defaultDensity) { fontSize.toPx() }
 
-        val layoutResult = simpleTextLayout(
-            text = text,
-            fontSize = fontSize,
-            density = defaultDensity
-        )
+        val layoutResult =
+            simpleTextLayout(text = text, fontSize = fontSize, density = defaultDensity)
 
         val layoutCoordinates = mock<LayoutCoordinates>()
         whenever(layoutCoordinates.isAttached).thenReturn(true)
 
         val selectableId = 1L
-        val selectable = MultiWidgetSelectionDelegate(
-            selectableId = selectableId,
-            coordinatesCallback = { layoutCoordinates },
-            layoutResultCallback = { layoutResult }
-        )
+        val selectable =
+            MultiWidgetSelectionDelegate(
+                selectableId = selectableId,
+                coordinatesCallback = { layoutCoordinates },
+                layoutResultCallback = { layoutResult }
+            )
 
         val startOffset = text.indexOf('\u05D1')
         val endOffset = text.indexOf('\u05D5')
 
-        val selection = Selection(
-            start = Selection.AnchorInfo(
-                direction = ResolvedTextDirection.Ltr,
-                offset = startOffset,
-                selectableId = selectableId
-            ),
-            end = Selection.AnchorInfo(
-                direction = ResolvedTextDirection.Ltr,
-                offset = endOffset,
-                selectableId = selectableId
-            ),
-            handlesCrossed = false
-        )
+        val selection =
+            Selection(
+                start =
+                    Selection.AnchorInfo(
+                        direction = ResolvedTextDirection.Ltr,
+                        offset = startOffset,
+                        selectableId = selectableId
+                    ),
+                end =
+                    Selection.AnchorInfo(
+                        direction = ResolvedTextDirection.Ltr,
+                        offset = endOffset,
+                        selectableId = selectableId
+                    ),
+                handlesCrossed = false
+            )
 
         // Act.
-        val coordinates = selectable.getHandlePosition(
-            selection = selection,
-            isStartHandle = true
-        )
+        val coordinates = selectable.getHandlePosition(selection = selection, isStartHandle = true)
 
         // Assert.
-        assertThat(coordinates).isEqualTo(
-            Offset((fontSizeInPx * (text.length - 1 - startOffset)), fontSizeInPx)
-        )
+        assertThat(coordinates)
+            .isEqualTo(Offset((fontSizeInPx * (text.length - 1 - startOffset)), fontSizeInPx))
     }
 
     @Test
@@ -311,49 +296,46 @@
         val fontSize = 20.sp
         val fontSizeInPx = with(defaultDensity) { fontSize.toPx() }
 
-        val layoutResult = simpleTextLayout(
-            text = text,
-            fontSize = fontSize,
-            density = defaultDensity
-        )
+        val layoutResult =
+            simpleTextLayout(text = text, fontSize = fontSize, density = defaultDensity)
 
         val layoutCoordinates = mock<LayoutCoordinates>()
         whenever(layoutCoordinates.isAttached).thenReturn(true)
 
         val selectableId = 1L
-        val selectable = MultiWidgetSelectionDelegate(
-            selectableId = selectableId,
-            coordinatesCallback = { layoutCoordinates },
-            layoutResultCallback = { layoutResult }
-        )
+        val selectable =
+            MultiWidgetSelectionDelegate(
+                selectableId = selectableId,
+                coordinatesCallback = { layoutCoordinates },
+                layoutResultCallback = { layoutResult }
+            )
 
         val startOffset = text.indexOf('\u05D5')
         val endOffset = text.indexOf('\u05D1')
 
-        val selection = Selection(
-            start = Selection.AnchorInfo(
-                direction = ResolvedTextDirection.Ltr,
-                offset = startOffset,
-                selectableId = selectableId
-            ),
-            end = Selection.AnchorInfo(
-                direction = ResolvedTextDirection.Ltr,
-                offset = endOffset,
-                selectableId = selectableId
-            ),
-            handlesCrossed = true
-        )
+        val selection =
+            Selection(
+                start =
+                    Selection.AnchorInfo(
+                        direction = ResolvedTextDirection.Ltr,
+                        offset = startOffset,
+                        selectableId = selectableId
+                    ),
+                end =
+                    Selection.AnchorInfo(
+                        direction = ResolvedTextDirection.Ltr,
+                        offset = endOffset,
+                        selectableId = selectableId
+                    ),
+                handlesCrossed = true
+            )
 
         // Act.
-        val coordinates = selectable.getHandlePosition(
-            selection = selection,
-            isStartHandle = true
-        )
+        val coordinates = selectable.getHandlePosition(selection = selection, isStartHandle = true)
 
         // Assert.
-        assertThat(coordinates).isEqualTo(
-            Offset((fontSizeInPx * (text.length - 1 - startOffset)), fontSizeInPx)
-        )
+        assertThat(coordinates)
+            .isEqualTo(Offset((fontSizeInPx * (text.length - 1 - startOffset)), fontSizeInPx))
     }
 
     @Test
@@ -364,49 +346,45 @@
         val fontSize = 20.sp
         val fontSizeInPx = with(defaultDensity) { fontSize.toPx() }
 
-        val layoutResult = simpleTextLayout(
-            text = text,
-            fontSize = fontSize,
-            density = defaultDensity
-        )
+        val layoutResult =
+            simpleTextLayout(text = text, fontSize = fontSize, density = defaultDensity)
 
         val layoutCoordinates = mock<LayoutCoordinates>()
         whenever(layoutCoordinates.isAttached).thenReturn(true)
 
         val selectableId = 1L
-        val selectable = MultiWidgetSelectionDelegate(
-            selectableId = selectableId,
-            coordinatesCallback = { layoutCoordinates },
-            layoutResultCallback = { layoutResult }
-        )
+        val selectable =
+            MultiWidgetSelectionDelegate(
+                selectableId = selectableId,
+                coordinatesCallback = { layoutCoordinates },
+                layoutResultCallback = { layoutResult }
+            )
 
         val startOffset = text.indexOf('\u05D0')
         val endOffset = text.indexOf('\u05D2')
 
-        val selection = Selection(
-            start = Selection.AnchorInfo(
-                direction = ResolvedTextDirection.Ltr,
-                offset = startOffset,
-                selectableId = selectableId
-            ),
-            end = Selection.AnchorInfo(
-                direction = ResolvedTextDirection.Ltr,
-                offset = endOffset,
-                selectableId = selectableId
-            ),
-            handlesCrossed = false
-        )
+        val selection =
+            Selection(
+                start =
+                    Selection.AnchorInfo(
+                        direction = ResolvedTextDirection.Ltr,
+                        offset = startOffset,
+                        selectableId = selectableId
+                    ),
+                end =
+                    Selection.AnchorInfo(
+                        direction = ResolvedTextDirection.Ltr,
+                        offset = endOffset,
+                        selectableId = selectableId
+                    ),
+                handlesCrossed = false
+            )
 
         // Act.
-        val coordinates = selectable.getHandlePosition(
-            selection = selection,
-            isStartHandle = true
-        )
+        val coordinates = selectable.getHandlePosition(selection = selection, isStartHandle = true)
 
         // Assert.
-        assertThat(coordinates).isEqualTo(
-            Offset((fontSizeInPx * (text.length)), fontSizeInPx)
-        )
+        assertThat(coordinates).isEqualTo(Offset((fontSizeInPx * (text.length)), fontSizeInPx))
     }
 
     @Test
@@ -417,49 +395,45 @@
         val fontSize = 20.sp
         val fontSizeInPx = with(defaultDensity) { fontSize.toPx() }
 
-        val layoutResult = simpleTextLayout(
-            text = text,
-            fontSize = fontSize,
-            density = defaultDensity
-        )
+        val layoutResult =
+            simpleTextLayout(text = text, fontSize = fontSize, density = defaultDensity)
 
         val layoutCoordinates = mock<LayoutCoordinates>()
         whenever(layoutCoordinates.isAttached).thenReturn(true)
 
         val selectableId = 1L
-        val selectable = MultiWidgetSelectionDelegate(
-            selectableId = selectableId,
-            coordinatesCallback = { layoutCoordinates },
-            layoutResultCallback = { layoutResult }
-        )
+        val selectable =
+            MultiWidgetSelectionDelegate(
+                selectableId = selectableId,
+                coordinatesCallback = { layoutCoordinates },
+                layoutResultCallback = { layoutResult }
+            )
 
         val startOffset = text.indexOf('\u05D0')
         val endOffset = text.indexOf('H')
 
-        val selection = Selection(
-            start = Selection.AnchorInfo(
-                direction = ResolvedTextDirection.Ltr,
-                offset = startOffset,
-                selectableId = selectableId
-            ),
-            end = Selection.AnchorInfo(
-                direction = ResolvedTextDirection.Ltr,
-                offset = endOffset,
-                selectableId = selectableId
-            ),
-            handlesCrossed = true
-        )
+        val selection =
+            Selection(
+                start =
+                    Selection.AnchorInfo(
+                        direction = ResolvedTextDirection.Ltr,
+                        offset = startOffset,
+                        selectableId = selectableId
+                    ),
+                end =
+                    Selection.AnchorInfo(
+                        direction = ResolvedTextDirection.Ltr,
+                        offset = endOffset,
+                        selectableId = selectableId
+                    ),
+                handlesCrossed = true
+            )
 
         // Act.
-        val coordinates = selectable.getHandlePosition(
-            selection = selection,
-            isStartHandle = true
-        )
+        val coordinates = selectable.getHandlePosition(selection = selection, isStartHandle = true)
 
         // Assert.
-        assertThat(coordinates).isEqualTo(
-            Offset((fontSizeInPx * (textLtr.length)), fontSizeInPx)
-        )
+        assertThat(coordinates).isEqualTo(Offset((fontSizeInPx * (textLtr.length)), fontSizeInPx))
     }
 
     @Test
@@ -468,49 +442,45 @@
         val fontSize = 20.sp
         val fontSizeInPx = with(defaultDensity) { fontSize.toPx() }
 
-        val layoutResult = simpleTextLayout(
-            text = text,
-            fontSize = fontSize,
-            density = defaultDensity
-        )
+        val layoutResult =
+            simpleTextLayout(text = text, fontSize = fontSize, density = defaultDensity)
 
         val layoutCoordinates = mock<LayoutCoordinates>()
         whenever(layoutCoordinates.isAttached).thenReturn(true)
 
         val selectableId = 1L
-        val selectable = MultiWidgetSelectionDelegate(
-            selectableId = selectableId,
-            coordinatesCallback = { layoutCoordinates },
-            layoutResultCallback = { layoutResult }
-        )
+        val selectable =
+            MultiWidgetSelectionDelegate(
+                selectableId = selectableId,
+                coordinatesCallback = { layoutCoordinates },
+                layoutResultCallback = { layoutResult }
+            )
 
         val startOffset = text.indexOf('h')
         val endOffset = text.indexOf('o')
 
-        val selection = Selection(
-            start = Selection.AnchorInfo(
-                direction = ResolvedTextDirection.Ltr,
-                offset = startOffset,
-                selectableId = selectableId
-            ),
-            end = Selection.AnchorInfo(
-                direction = ResolvedTextDirection.Ltr,
-                offset = endOffset,
-                selectableId = selectableId
-            ),
-            handlesCrossed = false
-        )
+        val selection =
+            Selection(
+                start =
+                    Selection.AnchorInfo(
+                        direction = ResolvedTextDirection.Ltr,
+                        offset = startOffset,
+                        selectableId = selectableId
+                    ),
+                end =
+                    Selection.AnchorInfo(
+                        direction = ResolvedTextDirection.Ltr,
+                        offset = endOffset,
+                        selectableId = selectableId
+                    ),
+                handlesCrossed = false
+            )
 
         // Act.
-        val coordinates = selectable.getHandlePosition(
-            selection = selection,
-            isStartHandle = false
-        )
+        val coordinates = selectable.getHandlePosition(selection = selection, isStartHandle = false)
 
         // Assert.
-        assertThat(coordinates).isEqualTo(
-            Offset((fontSizeInPx * endOffset), fontSizeInPx)
-        )
+        assertThat(coordinates).isEqualTo(Offset((fontSizeInPx * endOffset), fontSizeInPx))
     }
 
     @Test
@@ -519,50 +489,53 @@
         val fontSize = 20.sp
         val fontSizeInPx = with(defaultDensity) { fontSize.toPx() }
 
-        val layoutResult = simpleTextLayout(
-            text = text,
-            fontSize = fontSize,
-            density = defaultDensity,
-            maxLines = 1
-        )
+        val layoutResult =
+            simpleTextLayout(
+                text = text,
+                fontSize = fontSize,
+                density = defaultDensity,
+                maxLines = 1
+            )
 
         val layoutCoordinates = mock<LayoutCoordinates>()
         whenever(layoutCoordinates.isAttached).thenReturn(true)
 
         val selectableId = 1L
-        val selectable = MultiWidgetSelectionDelegate(
-            selectableId = selectableId,
-            coordinatesCallback = { layoutCoordinates },
-            layoutResultCallback = { layoutResult }
-        )
+        val selectable =
+            MultiWidgetSelectionDelegate(
+                selectableId = selectableId,
+                coordinatesCallback = { layoutCoordinates },
+                layoutResultCallback = { layoutResult }
+            )
 
         val startOffset = text.indexOf('h')
         val endOffset = text.indexOf('r')
 
-        val selection = Selection(
-            start = Selection.AnchorInfo(
-                direction = ResolvedTextDirection.Ltr,
-                offset = startOffset,
-                selectableId = selectableId
-            ),
-            end = Selection.AnchorInfo(
-                direction = ResolvedTextDirection.Ltr,
-                offset = endOffset,
-                selectableId = selectableId
-            ),
-            handlesCrossed = false
-        )
+        val selection =
+            Selection(
+                start =
+                    Selection.AnchorInfo(
+                        direction = ResolvedTextDirection.Ltr,
+                        offset = startOffset,
+                        selectableId = selectableId
+                    ),
+                end =
+                    Selection.AnchorInfo(
+                        direction = ResolvedTextDirection.Ltr,
+                        offset = endOffset,
+                        selectableId = selectableId
+                    ),
+                handlesCrossed = false
+            )
 
         // Act.
-        val coordinates = selectable.getHandlePosition(
-            selection = selection,
-            isStartHandle = false
-        )
+        val coordinates = selectable.getHandlePosition(selection = selection, isStartHandle = false)
 
         // Assert.
-        assertThat(coordinates).isEqualTo(
-            Offset(fontSizeInPx * 5, fontSizeInPx) // the last offset in the first line
-        )
+        assertThat(coordinates)
+            .isEqualTo(
+                Offset(fontSizeInPx * 5, fontSizeInPx) // the last offset in the first line
+            )
     }
 
     @Test
@@ -571,49 +544,45 @@
         val fontSize = 20.sp
         val fontSizeInPx = with(defaultDensity) { fontSize.toPx() }
 
-        val layoutResult = simpleTextLayout(
-            text = text,
-            fontSize = fontSize,
-            density = defaultDensity
-        )
+        val layoutResult =
+            simpleTextLayout(text = text, fontSize = fontSize, density = defaultDensity)
 
         val layoutCoordinates = mock<LayoutCoordinates>()
         whenever(layoutCoordinates.isAttached).thenReturn(true)
 
         val selectableId = 1L
-        val selectable = MultiWidgetSelectionDelegate(
-            selectableId = selectableId,
-            coordinatesCallback = { layoutCoordinates },
-            layoutResultCallback = { layoutResult }
-        )
+        val selectable =
+            MultiWidgetSelectionDelegate(
+                selectableId = selectableId,
+                coordinatesCallback = { layoutCoordinates },
+                layoutResultCallback = { layoutResult }
+            )
 
         val startOffset = text.indexOf('o')
         val endOffset = text.indexOf('h')
 
-        val selection = Selection(
-            start = Selection.AnchorInfo(
-                direction = ResolvedTextDirection.Ltr,
-                offset = startOffset,
-                selectableId = selectableId
-            ),
-            end = Selection.AnchorInfo(
-                direction = ResolvedTextDirection.Ltr,
-                offset = endOffset,
-                selectableId = selectableId
-            ),
-            handlesCrossed = true
-        )
+        val selection =
+            Selection(
+                start =
+                    Selection.AnchorInfo(
+                        direction = ResolvedTextDirection.Ltr,
+                        offset = startOffset,
+                        selectableId = selectableId
+                    ),
+                end =
+                    Selection.AnchorInfo(
+                        direction = ResolvedTextDirection.Ltr,
+                        offset = endOffset,
+                        selectableId = selectableId
+                    ),
+                handlesCrossed = true
+            )
 
         // Act.
-        val coordinates = selectable.getHandlePosition(
-            selection = selection,
-            isStartHandle = false
-        )
+        val coordinates = selectable.getHandlePosition(selection = selection, isStartHandle = false)
 
         // Assert.
-        assertThat(coordinates).isEqualTo(
-            Offset((fontSizeInPx * endOffset), fontSizeInPx)
-        )
+        assertThat(coordinates).isEqualTo(Offset((fontSizeInPx * endOffset), fontSizeInPx))
     }
 
     @Test
@@ -622,50 +591,50 @@
         val fontSize = 20.sp
         val fontSizeInPx = with(defaultDensity) { fontSize.toPx() }
 
-        val layoutResult = simpleTextLayout(
-            text = text,
-            fontSize = fontSize,
-            density = defaultDensity,
-            maxLines = 1
-        )
+        val layoutResult =
+            simpleTextLayout(
+                text = text,
+                fontSize = fontSize,
+                density = defaultDensity,
+                maxLines = 1
+            )
 
         val layoutCoordinates = mock<LayoutCoordinates>()
         whenever(layoutCoordinates.isAttached).thenReturn(true)
 
         val selectableId = 1L
-        val selectable = MultiWidgetSelectionDelegate(
-            selectableId = selectableId,
-            coordinatesCallback = { layoutCoordinates },
-            layoutResultCallback = { layoutResult }
-        )
+        val selectable =
+            MultiWidgetSelectionDelegate(
+                selectableId = selectableId,
+                coordinatesCallback = { layoutCoordinates },
+                layoutResultCallback = { layoutResult }
+            )
 
         val startOffset = text.indexOf('r')
         val endOffset = text.indexOf('w')
 
-        val selection = Selection(
-            start = Selection.AnchorInfo(
-                direction = ResolvedTextDirection.Ltr,
-                offset = startOffset,
-                selectableId = selectableId
-            ),
-            end = Selection.AnchorInfo(
-                direction = ResolvedTextDirection.Ltr,
-                offset = endOffset,
-                selectableId = selectableId
-            ),
-            handlesCrossed = true
-        )
+        val selection =
+            Selection(
+                start =
+                    Selection.AnchorInfo(
+                        direction = ResolvedTextDirection.Ltr,
+                        offset = startOffset,
+                        selectableId = selectableId
+                    ),
+                end =
+                    Selection.AnchorInfo(
+                        direction = ResolvedTextDirection.Ltr,
+                        offset = endOffset,
+                        selectableId = selectableId
+                    ),
+                handlesCrossed = true
+            )
 
         // Act.
-        val coordinates = selectable.getHandlePosition(
-            selection = selection,
-            isStartHandle = false
-        )
+        val coordinates = selectable.getHandlePosition(selection = selection, isStartHandle = false)
 
         // Assert.
-        assertThat(coordinates).isEqualTo(
-            Offset((fontSizeInPx * 5), fontSizeInPx)
-        )
+        assertThat(coordinates).isEqualTo(Offset((fontSizeInPx * 5), fontSizeInPx))
     }
 
     @Test
@@ -674,49 +643,46 @@
         val fontSize = 20.sp
         val fontSizeInPx = with(defaultDensity) { fontSize.toPx() }
 
-        val layoutResult = simpleTextLayout(
-            text = text,
-            fontSize = fontSize,
-            density = defaultDensity
-        )
+        val layoutResult =
+            simpleTextLayout(text = text, fontSize = fontSize, density = defaultDensity)
 
         val layoutCoordinates = mock<LayoutCoordinates>()
         whenever(layoutCoordinates.isAttached).thenReturn(true)
 
         val selectableId = 1L
-        val selectable = MultiWidgetSelectionDelegate(
-            selectableId = selectableId,
-            coordinatesCallback = { layoutCoordinates },
-            layoutResultCallback = { layoutResult }
-        )
+        val selectable =
+            MultiWidgetSelectionDelegate(
+                selectableId = selectableId,
+                coordinatesCallback = { layoutCoordinates },
+                layoutResultCallback = { layoutResult }
+            )
 
         val startOffset = text.indexOf('\u05D1')
         val endOffset = text.indexOf('\u05D5')
 
-        val selection = Selection(
-            start = Selection.AnchorInfo(
-                direction = ResolvedTextDirection.Ltr,
-                offset = startOffset,
-                selectableId = selectableId
-            ),
-            end = Selection.AnchorInfo(
-                direction = ResolvedTextDirection.Ltr,
-                offset = endOffset,
-                selectableId = selectableId
-            ),
-            handlesCrossed = false
-        )
+        val selection =
+            Selection(
+                start =
+                    Selection.AnchorInfo(
+                        direction = ResolvedTextDirection.Ltr,
+                        offset = startOffset,
+                        selectableId = selectableId
+                    ),
+                end =
+                    Selection.AnchorInfo(
+                        direction = ResolvedTextDirection.Ltr,
+                        offset = endOffset,
+                        selectableId = selectableId
+                    ),
+                handlesCrossed = false
+            )
 
         // Act.
-        val coordinates = selectable.getHandlePosition(
-            selection = selection,
-            isStartHandle = false
-        )
+        val coordinates = selectable.getHandlePosition(selection = selection, isStartHandle = false)
 
         // Assert.
-        assertThat(coordinates).isEqualTo(
-            Offset((fontSizeInPx * (text.length - 1 - endOffset)), fontSizeInPx)
-        )
+        assertThat(coordinates)
+            .isEqualTo(Offset((fontSizeInPx * (text.length - 1 - endOffset)), fontSizeInPx))
     }
 
     @Test
@@ -725,49 +691,46 @@
         val fontSize = 20.sp
         val fontSizeInPx = with(defaultDensity) { fontSize.toPx() }
 
-        val layoutResult = simpleTextLayout(
-            text = text,
-            fontSize = fontSize,
-            density = defaultDensity
-        )
+        val layoutResult =
+            simpleTextLayout(text = text, fontSize = fontSize, density = defaultDensity)
 
         val layoutCoordinates = mock<LayoutCoordinates>()
         whenever(layoutCoordinates.isAttached).thenReturn(true)
 
         val selectableId = 1L
-        val selectable = MultiWidgetSelectionDelegate(
-            selectableId = selectableId,
-            coordinatesCallback = { layoutCoordinates },
-            layoutResultCallback = { layoutResult }
-        )
+        val selectable =
+            MultiWidgetSelectionDelegate(
+                selectableId = selectableId,
+                coordinatesCallback = { layoutCoordinates },
+                layoutResultCallback = { layoutResult }
+            )
 
         val startOffset = text.indexOf('\u05D5')
         val endOffset = text.indexOf('\u05D1')
 
-        val selection = Selection(
-            start = Selection.AnchorInfo(
-                direction = ResolvedTextDirection.Ltr,
-                offset = startOffset,
-                selectableId = selectableId
-            ),
-            end = Selection.AnchorInfo(
-                direction = ResolvedTextDirection.Ltr,
-                offset = endOffset,
-                selectableId = selectableId
-            ),
-            handlesCrossed = true
-        )
+        val selection =
+            Selection(
+                start =
+                    Selection.AnchorInfo(
+                        direction = ResolvedTextDirection.Ltr,
+                        offset = startOffset,
+                        selectableId = selectableId
+                    ),
+                end =
+                    Selection.AnchorInfo(
+                        direction = ResolvedTextDirection.Ltr,
+                        offset = endOffset,
+                        selectableId = selectableId
+                    ),
+                handlesCrossed = true
+            )
 
         // Act.
-        val coordinates = selectable.getHandlePosition(
-            selection = selection,
-            isStartHandle = false
-        )
+        val coordinates = selectable.getHandlePosition(selection = selection, isStartHandle = false)
 
         // Assert.
-        assertThat(coordinates).isEqualTo(
-            Offset((fontSizeInPx * (text.length - 1 - endOffset)), fontSizeInPx)
-        )
+        assertThat(coordinates)
+            .isEqualTo(Offset((fontSizeInPx * (text.length - 1 - endOffset)), fontSizeInPx))
     }
 
     @Test
@@ -776,45 +739,47 @@
         val fontSize = 20.sp
         val fontSizeInPx = with(defaultDensity) { fontSize.toPx() }
 
-        val layoutResult = simpleTextLayout(
-            text = text,
-            fontSize = fontSize,
-            density = defaultDensity,
-            maxLines = 1
-        )
+        val layoutResult =
+            simpleTextLayout(
+                text = text,
+                fontSize = fontSize,
+                density = defaultDensity,
+                maxLines = 1
+            )
 
         val layoutCoordinates = mock<LayoutCoordinates>()
         whenever(layoutCoordinates.isAttached).thenReturn(true)
 
         val selectableId = 1L
-        val selectable = MultiWidgetSelectionDelegate(
-            selectableId = selectableId,
-            coordinatesCallback = { layoutCoordinates },
-            layoutResultCallback = { layoutResult }
-        )
+        val selectable =
+            MultiWidgetSelectionDelegate(
+                selectableId = selectableId,
+                coordinatesCallback = { layoutCoordinates },
+                layoutResultCallback = { layoutResult }
+            )
 
         val startOffset = text.indexOf('\u05D1')
         val endOffset = text.indexOf('\u05D5')
 
-        val selection = Selection(
-            start = Selection.AnchorInfo(
-                direction = ResolvedTextDirection.Rtl,
-                offset = startOffset,
-                selectableId = selectableId
-            ),
-            end = Selection.AnchorInfo(
-                direction = ResolvedTextDirection.Rtl,
-                offset = endOffset,
-                selectableId = selectableId
-            ),
-            handlesCrossed = false
-        )
+        val selection =
+            Selection(
+                start =
+                    Selection.AnchorInfo(
+                        direction = ResolvedTextDirection.Rtl,
+                        offset = startOffset,
+                        selectableId = selectableId
+                    ),
+                end =
+                    Selection.AnchorInfo(
+                        direction = ResolvedTextDirection.Rtl,
+                        offset = endOffset,
+                        selectableId = selectableId
+                    ),
+                handlesCrossed = false
+            )
 
         // Act.
-        val coordinates = selectable.getHandlePosition(
-            selection = selection,
-            isStartHandle = false
-        )
+        val coordinates = selectable.getHandlePosition(selection = selection, isStartHandle = false)
 
         // Assert.
         assertThat(coordinates).isEqualTo(Offset(0f, fontSizeInPx))
@@ -826,45 +791,47 @@
         val fontSize = 20.sp
         val fontSizeInPx = with(defaultDensity) { fontSize.toPx() }
 
-        val layoutResult = simpleTextLayout(
-            text = text,
-            fontSize = fontSize,
-            density = defaultDensity,
-            maxLines = 1
-        )
+        val layoutResult =
+            simpleTextLayout(
+                text = text,
+                fontSize = fontSize,
+                density = defaultDensity,
+                maxLines = 1
+            )
 
         val layoutCoordinates = mock<LayoutCoordinates>()
         whenever(layoutCoordinates.isAttached).thenReturn(true)
 
         val selectableId = 1L
-        val selectable = MultiWidgetSelectionDelegate(
-            selectableId = selectableId,
-            coordinatesCallback = { layoutCoordinates },
-            layoutResultCallback = { layoutResult }
-        )
+        val selectable =
+            MultiWidgetSelectionDelegate(
+                selectableId = selectableId,
+                coordinatesCallback = { layoutCoordinates },
+                layoutResultCallback = { layoutResult }
+            )
 
         val startOffset = text.indexOf('\u05D5')
         val endOffset = text.indexOf('\u05D3')
 
-        val selection = Selection(
-            start = Selection.AnchorInfo(
-                direction = ResolvedTextDirection.Rtl,
-                offset = startOffset,
-                selectableId = selectableId
-            ),
-            end = Selection.AnchorInfo(
-                direction = ResolvedTextDirection.Rtl,
-                offset = endOffset,
-                selectableId = selectableId
-            ),
-            handlesCrossed = true
-        )
+        val selection =
+            Selection(
+                start =
+                    Selection.AnchorInfo(
+                        direction = ResolvedTextDirection.Rtl,
+                        offset = startOffset,
+                        selectableId = selectableId
+                    ),
+                end =
+                    Selection.AnchorInfo(
+                        direction = ResolvedTextDirection.Rtl,
+                        offset = endOffset,
+                        selectableId = selectableId
+                    ),
+                handlesCrossed = true
+            )
 
         // Act.
-        val coordinates = selectable.getHandlePosition(
-            selection = selection,
-            isStartHandle = false
-        )
+        val coordinates = selectable.getHandlePosition(selection = selection, isStartHandle = false)
 
         // Assert.
         assertThat(coordinates).isEqualTo(Offset((fontSizeInPx * 3), fontSizeInPx))
@@ -878,49 +845,45 @@
         val fontSize = 20.sp
         val fontSizeInPx = with(defaultDensity) { fontSize.toPx() }
 
-        val layoutResult = simpleTextLayout(
-            text = text,
-            fontSize = fontSize,
-            density = defaultDensity
-        )
+        val layoutResult =
+            simpleTextLayout(text = text, fontSize = fontSize, density = defaultDensity)
 
         val layoutCoordinates = mock<LayoutCoordinates>()
         whenever(layoutCoordinates.isAttached).thenReturn(true)
 
         val selectableId = 1L
-        val selectable = MultiWidgetSelectionDelegate(
-            selectableId = selectableId,
-            coordinatesCallback = { layoutCoordinates },
-            layoutResultCallback = { layoutResult }
-        )
+        val selectable =
+            MultiWidgetSelectionDelegate(
+                selectableId = selectableId,
+                coordinatesCallback = { layoutCoordinates },
+                layoutResultCallback = { layoutResult }
+            )
 
         val startOffset = text.indexOf('e')
         val endOffset = text.indexOf('\u05D0')
 
-        val selection = Selection(
-            start = Selection.AnchorInfo(
-                direction = ResolvedTextDirection.Ltr,
-                offset = startOffset,
-                selectableId = selectableId
-            ),
-            end = Selection.AnchorInfo(
-                direction = ResolvedTextDirection.Ltr,
-                offset = endOffset,
-                selectableId = selectableId
-            ),
-            handlesCrossed = false
-        )
+        val selection =
+            Selection(
+                start =
+                    Selection.AnchorInfo(
+                        direction = ResolvedTextDirection.Ltr,
+                        offset = startOffset,
+                        selectableId = selectableId
+                    ),
+                end =
+                    Selection.AnchorInfo(
+                        direction = ResolvedTextDirection.Ltr,
+                        offset = endOffset,
+                        selectableId = selectableId
+                    ),
+                handlesCrossed = false
+            )
 
         // Act.
-        val coordinates = selectable.getHandlePosition(
-            selection = selection,
-            isStartHandle = false
-        )
+        val coordinates = selectable.getHandlePosition(selection = selection, isStartHandle = false)
 
         // Assert.
-        assertThat(coordinates).isEqualTo(
-            Offset((fontSizeInPx * (textLtr.length)), fontSizeInPx)
-        )
+        assertThat(coordinates).isEqualTo(Offset((fontSizeInPx * (textLtr.length)), fontSizeInPx))
     }
 
     @Test
@@ -930,49 +893,45 @@
         val text = textLtr + textRtl
         val fontSize = 20.sp
         val fontSizeInPx = with(defaultDensity) { fontSize.toPx() }
-        val layoutResult = simpleTextLayout(
-            text = text,
-            fontSize = fontSize,
-            density = defaultDensity
-        )
+        val layoutResult =
+            simpleTextLayout(text = text, fontSize = fontSize, density = defaultDensity)
 
         val layoutCoordinates = mock<LayoutCoordinates>()
         whenever(layoutCoordinates.isAttached).thenReturn(true)
 
         val selectableId = 1L
-        val selectable = MultiWidgetSelectionDelegate(
-            selectableId = selectableId,
-            coordinatesCallback = { layoutCoordinates },
-            layoutResultCallback = { layoutResult }
-        )
+        val selectable =
+            MultiWidgetSelectionDelegate(
+                selectableId = selectableId,
+                coordinatesCallback = { layoutCoordinates },
+                layoutResultCallback = { layoutResult }
+            )
 
         val startOffset = text.indexOf('\u05D2')
         val endOffset = text.indexOf('\u05D0')
 
-        val selection = Selection(
-            start = Selection.AnchorInfo(
-                direction = ResolvedTextDirection.Ltr,
-                offset = startOffset,
-                selectableId = selectableId
-            ),
-            end = Selection.AnchorInfo(
-                direction = ResolvedTextDirection.Ltr,
-                offset = endOffset,
-                selectableId = selectableId
-            ),
-            handlesCrossed = true
-        )
+        val selection =
+            Selection(
+                start =
+                    Selection.AnchorInfo(
+                        direction = ResolvedTextDirection.Ltr,
+                        offset = startOffset,
+                        selectableId = selectableId
+                    ),
+                end =
+                    Selection.AnchorInfo(
+                        direction = ResolvedTextDirection.Ltr,
+                        offset = endOffset,
+                        selectableId = selectableId
+                    ),
+                handlesCrossed = true
+            )
 
         // Act.
-        val coordinates = selectable.getHandlePosition(
-            selection = selection,
-            isStartHandle = false
-        )
+        val coordinates = selectable.getHandlePosition(selection = selection, isStartHandle = false)
 
         // Assert.
-        assertThat(coordinates).isEqualTo(
-            Offset((fontSizeInPx * (text.length)), fontSizeInPx)
-        )
+        assertThat(coordinates).isEqualTo(Offset((fontSizeInPx * (text.length)), fontSizeInPx))
     }
 
     @Test
@@ -982,11 +941,12 @@
         val layoutCoordinates = mock<LayoutCoordinates>()
         whenever(layoutCoordinates.isAttached).thenReturn(true)
 
-        val selectable = MultiWidgetSelectionDelegate(
-            0,
-            coordinatesCallback = { layoutCoordinates },
-            layoutResultCallback = { layoutResult }
-        )
+        val selectable =
+            MultiWidgetSelectionDelegate(
+                0,
+                coordinatesCallback = { layoutCoordinates },
+                layoutResultCallback = { layoutResult }
+            )
 
         assertThat(selectable.getText()).isEqualTo(AnnotatedString(""))
     }
@@ -999,20 +959,18 @@
         val fontSize = 20.sp
         val spanStyle = SpanStyle(fontSize = fontSize, fontFamily = fontFamily)
 
-        val layoutResult = simpleTextLayout(
-            text = text,
-            fontSize = fontSize,
-            density = defaultDensity
-        )
+        val layoutResult =
+            simpleTextLayout(text = text, fontSize = fontSize, density = defaultDensity)
 
         val layoutCoordinates = mock<LayoutCoordinates>()
         whenever(layoutCoordinates.isAttached).thenReturn(true)
 
-        val selectable = MultiWidgetSelectionDelegate(
-            0,
-            coordinatesCallback = { layoutCoordinates },
-            layoutResultCallback = { layoutResult }
-        )
+        val selectable =
+            MultiWidgetSelectionDelegate(
+                0,
+                coordinatesCallback = { layoutCoordinates },
+                layoutResultCallback = { layoutResult }
+            )
 
         assertThat(selectable.getText()).isEqualTo(AnnotatedString(text, spanStyle))
     }
@@ -1023,20 +981,18 @@
         val fontSize = 20.sp
         val fontSizeInPx = with(defaultDensity) { fontSize.toPx() }
 
-        val layoutResult = simpleTextLayout(
-            text = text,
-            fontSize = fontSize,
-            density = defaultDensity
-        )
+        val layoutResult =
+            simpleTextLayout(text = text, fontSize = fontSize, density = defaultDensity)
 
         val layoutCoordinates = mock<LayoutCoordinates>()
         whenever(layoutCoordinates.isAttached).thenReturn(true)
 
-        val selectable = MultiWidgetSelectionDelegate(
-            1,
-            coordinatesCallback = { layoutCoordinates },
-            layoutResultCallback = { layoutResult }
-        )
+        val selectable =
+            MultiWidgetSelectionDelegate(
+                1,
+                coordinatesCallback = { layoutCoordinates },
+                layoutResultCallback = { layoutResult }
+            )
 
         val textOffset = text.indexOf('w')
 
@@ -1055,20 +1011,18 @@
         val text = ""
         val fontSize = 20.sp
 
-        val layoutResult = simpleTextLayout(
-            text = text,
-            fontSize = fontSize,
-            density = defaultDensity
-        )
+        val layoutResult =
+            simpleTextLayout(text = text, fontSize = fontSize, density = defaultDensity)
 
         val layoutCoordinates = mock<LayoutCoordinates>()
         whenever(layoutCoordinates.isAttached).thenReturn(true)
 
-        val selectable = MultiWidgetSelectionDelegate(
-            0,
-            coordinatesCallback = { layoutCoordinates },
-            layoutResultCallback = { layoutResult }
-        )
+        val selectable =
+            MultiWidgetSelectionDelegate(
+                0,
+                coordinatesCallback = { layoutCoordinates },
+                layoutResultCallback = { layoutResult }
+            )
 
         // Act.
         val box = selectable.getBoundingBox(0)
@@ -1083,20 +1037,18 @@
         val fontSize = 20.sp
         val fontSizeInPx = with(defaultDensity) { fontSize.toPx() }
 
-        val layoutResult = simpleTextLayout(
-            text = text,
-            fontSize = fontSize,
-            density = defaultDensity
-        )
+        val layoutResult =
+            simpleTextLayout(text = text, fontSize = fontSize, density = defaultDensity)
 
         val layoutCoordinates = mock<LayoutCoordinates>()
         whenever(layoutCoordinates.isAttached).thenReturn(true)
 
-        val selectable = MultiWidgetSelectionDelegate(
-            0,
-            coordinatesCallback = { layoutCoordinates },
-            layoutResultCallback = { layoutResult }
-        )
+        val selectable =
+            MultiWidgetSelectionDelegate(
+                0,
+                coordinatesCallback = { layoutCoordinates },
+                layoutResultCallback = { layoutResult }
+            )
 
         // Act.
         val box = selectable.getBoundingBox(-2)
@@ -1114,20 +1066,18 @@
         val fontSize = 20.sp
         val fontSizeInPx = with(defaultDensity) { fontSize.toPx() }
 
-        val layoutResult = simpleTextLayout(
-            text = text,
-            fontSize = fontSize,
-            density = defaultDensity
-        )
+        val layoutResult =
+            simpleTextLayout(text = text, fontSize = fontSize, density = defaultDensity)
 
         val layoutCoordinates = mock<LayoutCoordinates>()
         whenever(layoutCoordinates.isAttached).thenReturn(true)
 
-        val selectable = MultiWidgetSelectionDelegate(
-            selectableId = 1,
-            coordinatesCallback = { layoutCoordinates },
-            layoutResultCallback = { layoutResult }
-        )
+        val selectable =
+            MultiWidgetSelectionDelegate(
+                selectableId = 1,
+                coordinatesCallback = { layoutCoordinates },
+                layoutResultCallback = { layoutResult }
+            )
 
         // Act.
         val box = selectable.getBoundingBox(text.indexOf('d') + 5)
@@ -1143,19 +1093,17 @@
     fun getRangeOfLineContaining_zeroOffset() {
         val text = "hello\nworld\n"
 
-        val layoutResult = simpleTextLayout(
-            text = text,
-            density = defaultDensity
-        )
+        val layoutResult = simpleTextLayout(text = text, density = defaultDensity)
 
         val layoutCoordinates = mock<LayoutCoordinates>()
         whenever(layoutCoordinates.isAttached).thenReturn(true)
 
-        val selectable = MultiWidgetSelectionDelegate(
-            1,
-            coordinatesCallback = { layoutCoordinates },
-            layoutResultCallback = { layoutResult }
-        )
+        val selectable =
+            MultiWidgetSelectionDelegate(
+                1,
+                coordinatesCallback = { layoutCoordinates },
+                layoutResultCallback = { layoutResult }
+            )
 
         // Act.
         val lineRange = selectable.getRangeOfLineContaining(0)
@@ -1168,19 +1116,17 @@
     fun getRangeOfLineContaining_secondLine() {
         val text = "hello\nworld\n"
 
-        val layoutResult = simpleTextLayout(
-            text = text,
-            density = defaultDensity
-        )
+        val layoutResult = simpleTextLayout(text = text, density = defaultDensity)
 
         val layoutCoordinates = mock<LayoutCoordinates>()
         whenever(layoutCoordinates.isAttached).thenReturn(true)
 
-        val selectable = MultiWidgetSelectionDelegate(
-            1,
-            coordinatesCallback = { layoutCoordinates },
-            layoutResultCallback = { layoutResult }
-        )
+        val selectable =
+            MultiWidgetSelectionDelegate(
+                1,
+                coordinatesCallback = { layoutCoordinates },
+                layoutResultCallback = { layoutResult }
+            )
 
         // Act.
         val lineRange = selectable.getRangeOfLineContaining(7)
@@ -1193,19 +1139,17 @@
     fun getRangeOfLineContaining_negativeOffset_returnsFirstLine() {
         val text = "hello\nworld\n"
 
-        val layoutResult = simpleTextLayout(
-            text = text,
-            density = defaultDensity
-        )
+        val layoutResult = simpleTextLayout(text = text, density = defaultDensity)
 
         val layoutCoordinates = mock<LayoutCoordinates>()
         whenever(layoutCoordinates.isAttached).thenReturn(true)
 
-        val selectable = MultiWidgetSelectionDelegate(
-            1,
-            coordinatesCallback = { layoutCoordinates },
-            layoutResultCallback = { layoutResult }
-        )
+        val selectable =
+            MultiWidgetSelectionDelegate(
+                1,
+                coordinatesCallback = { layoutCoordinates },
+                layoutResultCallback = { layoutResult }
+            )
 
         // Act.
         val lineRange = selectable.getRangeOfLineContaining(-1)
@@ -1218,19 +1162,17 @@
     fun getRangeOfLineContaining_offsetPastTextLength_returnsLastLine() {
         val text = "hello\nworld\n"
 
-        val layoutResult = simpleTextLayout(
-            text = text,
-            density = defaultDensity
-        )
+        val layoutResult = simpleTextLayout(text = text, density = defaultDensity)
 
         val layoutCoordinates = mock<LayoutCoordinates>()
         whenever(layoutCoordinates.isAttached).thenReturn(true)
 
-        val selectable = MultiWidgetSelectionDelegate(
-            1,
-            coordinatesCallback = { layoutCoordinates },
-            layoutResultCallback = { layoutResult }
-        )
+        val selectable =
+            MultiWidgetSelectionDelegate(
+                1,
+                coordinatesCallback = { layoutCoordinates },
+                layoutResultCallback = { layoutResult }
+            )
 
         // Act.
         val lineRange = selectable.getRangeOfLineContaining(Int.MAX_VALUE)
@@ -1243,19 +1185,17 @@
     fun getRangeOfLineContaining_offsetAtNewline_returnsPreviousLine() {
         val text = "hello\nworld\n"
 
-        val layoutResult = simpleTextLayout(
-            text = text,
-            density = defaultDensity
-        )
+        val layoutResult = simpleTextLayout(text = text, density = defaultDensity)
 
         val layoutCoordinates = mock<LayoutCoordinates>()
         whenever(layoutCoordinates.isAttached).thenReturn(true)
 
-        val selectable = MultiWidgetSelectionDelegate(
-            1,
-            coordinatesCallback = { layoutCoordinates },
-            layoutResultCallback = { layoutResult }
-        )
+        val selectable =
+            MultiWidgetSelectionDelegate(
+                1,
+                coordinatesCallback = { layoutCoordinates },
+                layoutResultCallback = { layoutResult }
+            )
 
         // Act.
         val lineRange = selectable.getRangeOfLineContaining(5)
@@ -1268,19 +1208,17 @@
     fun getRangeOfLineContaining_emptyString_returnsEmptyRange() {
         val text = ""
 
-        val layoutResult = simpleTextLayout(
-            text = text,
-            density = defaultDensity
-        )
+        val layoutResult = simpleTextLayout(text = text, density = defaultDensity)
 
         val layoutCoordinates = mock<LayoutCoordinates>()
         whenever(layoutCoordinates.isAttached).thenReturn(true)
 
-        val selectable = MultiWidgetSelectionDelegate(
-            1,
-            coordinatesCallback = { layoutCoordinates },
-            layoutResultCallback = { layoutResult }
-        )
+        val selectable =
+            MultiWidgetSelectionDelegate(
+                1,
+                coordinatesCallback = { layoutCoordinates },
+                layoutResultCallback = { layoutResult }
+            )
 
         // Act.
         val lineRange = selectable.getRangeOfLineContaining(5)
@@ -1293,19 +1231,17 @@
     fun getRangeOfLineContaining_emptyLine_returnsEmptyNonZeroRange() {
         val text = "hello\n\nworld"
 
-        val layoutResult = simpleTextLayout(
-            text = text,
-            density = defaultDensity
-        )
+        val layoutResult = simpleTextLayout(text = text, density = defaultDensity)
 
         val layoutCoordinates = mock<LayoutCoordinates>()
         whenever(layoutCoordinates.isAttached).thenReturn(true)
 
-        val selectable = MultiWidgetSelectionDelegate(
-            1,
-            coordinatesCallback = { layoutCoordinates },
-            layoutResultCallback = { layoutResult }
-        )
+        val selectable =
+            MultiWidgetSelectionDelegate(
+                1,
+                coordinatesCallback = { layoutCoordinates },
+                layoutResultCallback = { layoutResult }
+            )
 
         // Act.
         val lineRange = selectable.getRangeOfLineContaining(6)
@@ -1318,20 +1254,17 @@
     fun getRangeOfLineContaining_overflowed_returnsLastVisibleLine() {
         val text = "hello\nworld"
 
-        val layoutResult = simpleTextLayout(
-            text = text,
-            density = defaultDensity,
-            maxLines = 1
-        )
+        val layoutResult = simpleTextLayout(text = text, density = defaultDensity, maxLines = 1)
 
         val layoutCoordinates = mock<LayoutCoordinates>()
         whenever(layoutCoordinates.isAttached).thenReturn(true)
 
-        val selectable = MultiWidgetSelectionDelegate(
-            1,
-            coordinatesCallback = { layoutCoordinates },
-            layoutResultCallback = { layoutResult }
-        )
+        val selectable =
+            MultiWidgetSelectionDelegate(
+                1,
+                coordinatesCallback = { layoutCoordinates },
+                layoutResultCallback = { layoutResult }
+            )
 
         // Act.
         val lineRange = selectable.getRangeOfLineContaining(6)
@@ -1345,21 +1278,24 @@
         val text = "hello\nworld"
         val fontSize = 20.sp
 
-        val layoutResult = simpleTextLayout(
-            text = text,
-            density = defaultDensity,
-            fontSize = fontSize,
-            constraints = Constraints(maxHeight = with(defaultDensity) { fontSize.roundToPx() } * 1)
-        )
+        val layoutResult =
+            simpleTextLayout(
+                text = text,
+                density = defaultDensity,
+                fontSize = fontSize,
+                constraints =
+                    Constraints(maxHeight = with(defaultDensity) { fontSize.roundToPx() } * 1)
+            )
 
         val layoutCoordinates = mock<LayoutCoordinates>()
         whenever(layoutCoordinates.isAttached).thenReturn(true)
 
-        val selectable = MultiWidgetSelectionDelegate(
-            1,
-            coordinatesCallback = { layoutCoordinates },
-            layoutResultCallback = { layoutResult }
-        )
+        val selectable =
+            MultiWidgetSelectionDelegate(
+                1,
+                coordinatesCallback = { layoutCoordinates },
+                layoutResultCallback = { layoutResult }
+            )
 
         // Act.
         val lineRange = selectable.getRangeOfLineContaining(6)
@@ -1372,18 +1308,17 @@
     fun getLastVisibleOffset_everythingVisible_returnsTextLength() {
         val text = "hello\nworld"
 
-        val layoutResult = constrainedTextLayout(
-            text = text
-        )
+        val layoutResult = constrainedTextLayout(text = text)
 
         val layoutCoordinates = mock<LayoutCoordinates>()
         whenever(layoutCoordinates.isAttached).thenReturn(true)
 
-        val selectable = MultiWidgetSelectionDelegate(
-            1,
-            coordinatesCallback = { layoutCoordinates },
-            layoutResultCallback = { layoutResult }
-        )
+        val selectable =
+            MultiWidgetSelectionDelegate(
+                1,
+                coordinatesCallback = { layoutCoordinates },
+                layoutResultCallback = { layoutResult }
+            )
 
         val lastVisibleOffset = selectable.getLastVisibleOffset()
 
@@ -1399,11 +1334,12 @@
         val layoutCoordinates = mock<LayoutCoordinates>()
         whenever(layoutCoordinates.isAttached).thenReturn(true)
 
-        val selectable = MultiWidgetSelectionDelegate(
-            1,
-            coordinatesCallback = { layoutCoordinates },
-            layoutResultCallback = { layoutResult }
-        )
+        val selectable =
+            MultiWidgetSelectionDelegate(
+                1,
+                coordinatesCallback = { layoutCoordinates },
+                layoutResultCallback = { layoutResult }
+            )
 
         assertThat(selectable.getLastVisibleOffset()).isEqualTo(text.length)
 
@@ -1419,21 +1355,23 @@
     fun getLastVisibleOffset_maxLines1_clip_enabledSoftwrap_multiLineContent() {
         val text = "hello\nworld"
 
-        val layoutResult = constrainedTextLayout(
-            text = text,
-            overflow = TextOverflow.Clip,
-            maxLines = 1,
-            softWrap = true
-        )
+        val layoutResult =
+            constrainedTextLayout(
+                text = text,
+                overflow = TextOverflow.Clip,
+                maxLines = 1,
+                softWrap = true
+            )
 
         val layoutCoordinates = mock<LayoutCoordinates>()
         whenever(layoutCoordinates.isAttached).thenReturn(true)
 
-        val selectable = MultiWidgetSelectionDelegate(
-            1,
-            coordinatesCallback = { layoutCoordinates },
-            layoutResultCallback = { layoutResult }
-        )
+        val selectable =
+            MultiWidgetSelectionDelegate(
+                1,
+                coordinatesCallback = { layoutCoordinates },
+                layoutResultCallback = { layoutResult }
+            )
 
         val lastVisibleOffset = selectable.getLastVisibleOffset()
 
@@ -1444,22 +1382,24 @@
     fun getLastVisibleOffset_maxLines1_clip_enabledSoftwrap_singleLineContent() {
         val text = "hello world"
 
-        val layoutResult = constrainedTextLayout(
-            text = text,
-            maxLines = 1,
-            overflow = TextOverflow.Clip,
-            softWrap = true,
-            widthInCharacters = 10
-        )
+        val layoutResult =
+            constrainedTextLayout(
+                text = text,
+                maxLines = 1,
+                overflow = TextOverflow.Clip,
+                softWrap = true,
+                widthInCharacters = 10
+            )
 
         val layoutCoordinates = mock<LayoutCoordinates>()
         whenever(layoutCoordinates.isAttached).thenReturn(true)
 
-        val selectable = MultiWidgetSelectionDelegate(
-            1,
-            coordinatesCallback = { layoutCoordinates },
-            layoutResultCallback = { layoutResult }
-        )
+        val selectable =
+            MultiWidgetSelectionDelegate(
+                1,
+                coordinatesCallback = { layoutCoordinates },
+                layoutResultCallback = { layoutResult }
+            )
 
         val lastVisibleOffset = selectable.getLastVisibleOffset()
 
@@ -1471,21 +1411,23 @@
     fun getLastVisibleOffset_maxLines1_clip_disabledSoftwrap_multiLineContent() {
         val text = "hello\nworld"
 
-        val layoutResult = constrainedTextLayout(
-            text = text,
-            maxLines = 1,
-            overflow = TextOverflow.Clip,
-            softWrap = false
-        )
+        val layoutResult =
+            constrainedTextLayout(
+                text = text,
+                maxLines = 1,
+                overflow = TextOverflow.Clip,
+                softWrap = false
+            )
 
         val layoutCoordinates = mock<LayoutCoordinates>()
         whenever(layoutCoordinates.isAttached).thenReturn(true)
 
-        val selectable = MultiWidgetSelectionDelegate(
-            1,
-            coordinatesCallback = { layoutCoordinates },
-            layoutResultCallback = { layoutResult }
-        )
+        val selectable =
+            MultiWidgetSelectionDelegate(
+                1,
+                coordinatesCallback = { layoutCoordinates },
+                layoutResultCallback = { layoutResult }
+            )
 
         val lastVisibleOffset = selectable.getLastVisibleOffset()
 
@@ -1496,22 +1438,24 @@
     fun getLastVisibleOffset_maxLines1_clip_disabledSoftwrap_singleLineContent() {
         val text = "hello world ".repeat(10)
 
-        val layoutResult = constrainedTextLayout(
-            text = text,
-            maxLines = 1,
-            overflow = TextOverflow.Clip,
-            softWrap = false,
-            widthInCharacters = 10
-        )
+        val layoutResult =
+            constrainedTextLayout(
+                text = text,
+                maxLines = 1,
+                overflow = TextOverflow.Clip,
+                softWrap = false,
+                widthInCharacters = 10
+            )
 
         val layoutCoordinates = mock<LayoutCoordinates>()
         whenever(layoutCoordinates.isAttached).thenReturn(true)
 
-        val selectable = MultiWidgetSelectionDelegate(
-            1,
-            coordinatesCallback = { layoutCoordinates },
-            layoutResultCallback = { layoutResult }
-        )
+        val selectable =
+            MultiWidgetSelectionDelegate(
+                1,
+                coordinatesCallback = { layoutCoordinates },
+                layoutResultCallback = { layoutResult }
+            )
 
         val lastVisibleOffset = selectable.getLastVisibleOffset()
 
@@ -1524,50 +1468,55 @@
     fun getLastVisibleOffset_maxLines1_ellipsis_enabledSoftwrap_multiLineContent() {
         val text = "hello\nworld"
 
-        val layoutResult = constrainedTextLayout(
-            text = text,
-            overflow = TextOverflow.Ellipsis,
-            maxLines = 1,
-            softWrap = true,
-            widthInCharacters = 4
-        )
+        val layoutResult =
+            constrainedTextLayout(
+                text = text,
+                overflow = TextOverflow.Ellipsis,
+                maxLines = 1,
+                softWrap = true,
+                widthInCharacters = 4
+            )
 
         val layoutCoordinates = mock<LayoutCoordinates>()
         whenever(layoutCoordinates.isAttached).thenReturn(true)
 
-        val selectable = MultiWidgetSelectionDelegate(
-            1,
-            coordinatesCallback = { layoutCoordinates },
-            layoutResultCallback = { layoutResult }
-        )
+        val selectable =
+            MultiWidgetSelectionDelegate(
+                1,
+                coordinatesCallback = { layoutCoordinates },
+                layoutResultCallback = { layoutResult }
+            )
 
         val lastVisibleOffset = selectable.getLastVisibleOffset()
 
         assertThat(lastVisibleOffset).isEqualTo(3)
     }
 
-    // TODO(b/270441925); Last visible offset calculated using getLineVisibleEnd. It returns//   a different result below API 26.
+    // TODO(b/270441925); Last visible offset calculated using getLineVisibleEnd. It returns//   a
+    // different result below API 26.
     @SdkSuppress(minSdkVersion = 26)
     @Test
     fun getLastVisibleOffset_maxLines1_ellipsis_enabledSoftwrap_singleLineContent() {
         val text = "hello world ".repeat(10)
 
-        val layoutResult = constrainedTextLayout(
-            text = text,
-            maxLines = 1,
-            overflow = TextOverflow.Ellipsis,
-            softWrap = true,
-            widthInCharacters = 10
-        )
+        val layoutResult =
+            constrainedTextLayout(
+                text = text,
+                maxLines = 1,
+                overflow = TextOverflow.Ellipsis,
+                softWrap = true,
+                widthInCharacters = 10
+            )
 
         val layoutCoordinates = mock<LayoutCoordinates>()
         whenever(layoutCoordinates.isAttached).thenReturn(true)
 
-        val selectable = MultiWidgetSelectionDelegate(
-            1,
-            coordinatesCallback = { layoutCoordinates },
-            layoutResultCallback = { layoutResult }
-        )
+        val selectable =
+            MultiWidgetSelectionDelegate(
+                1,
+                coordinatesCallback = { layoutCoordinates },
+                layoutResultCallback = { layoutResult }
+            )
 
         val lastVisibleOffset = selectable.getLastVisibleOffset()
 
@@ -1579,22 +1528,24 @@
     fun getLastVisibleOffset_maxLines1_ellipsis_disabledSoftwrap_multiLineContent() {
         val text = "hello\nworld"
 
-        val layoutResult = constrainedTextLayout(
-            text = text,
-            maxLines = 1,
-            overflow = TextOverflow.Ellipsis,
-            softWrap = false,
-            widthInCharacters = 5
-        )
+        val layoutResult =
+            constrainedTextLayout(
+                text = text,
+                maxLines = 1,
+                overflow = TextOverflow.Ellipsis,
+                softWrap = false,
+                widthInCharacters = 5
+            )
 
         val layoutCoordinates = mock<LayoutCoordinates>()
         whenever(layoutCoordinates.isAttached).thenReturn(true)
 
-        val selectable = MultiWidgetSelectionDelegate(
-            1,
-            coordinatesCallback = { layoutCoordinates },
-            layoutResultCallback = { layoutResult }
-        )
+        val selectable =
+            MultiWidgetSelectionDelegate(
+                1,
+                coordinatesCallback = { layoutCoordinates },
+                layoutResultCallback = { layoutResult }
+            )
 
         val lastVisibleOffset = selectable.getLastVisibleOffset()
 
@@ -1606,22 +1557,24 @@
     fun getLastVisibleOffset_maxLines1_ellipsis_disabledSoftwrap_singleLineContent() {
         val text = "hello world ".repeat(10)
 
-        val layoutResult = constrainedTextLayout(
-            text = text,
-            maxLines = 1,
-            overflow = TextOverflow.Ellipsis,
-            softWrap = false,
-            widthInCharacters = 20
-        )
+        val layoutResult =
+            constrainedTextLayout(
+                text = text,
+                maxLines = 1,
+                overflow = TextOverflow.Ellipsis,
+                softWrap = false,
+                widthInCharacters = 20
+            )
 
         val layoutCoordinates = mock<LayoutCoordinates>()
         whenever(layoutCoordinates.isAttached).thenReturn(true)
 
-        val selectable = MultiWidgetSelectionDelegate(
-            1,
-            coordinatesCallback = { layoutCoordinates },
-            layoutResultCallback = { layoutResult }
-        )
+        val selectable =
+            MultiWidgetSelectionDelegate(
+                1,
+                coordinatesCallback = { layoutCoordinates },
+                layoutResultCallback = { layoutResult }
+            )
 
         val lastVisibleOffset = selectable.getLastVisibleOffset()
 
@@ -1641,21 +1594,23 @@
     fun getLastVisibleOffset_limitHeight_clip_enabledSoftwrap_multiLineContent() {
         val text = "hello\nworld"
 
-        val layoutResult = constrainedTextLayout(
-            text = text,
-            overflow = TextOverflow.Clip,
-            softWrap = true,
-            maxHeightInLines = 1
-        )
+        val layoutResult =
+            constrainedTextLayout(
+                text = text,
+                overflow = TextOverflow.Clip,
+                softWrap = true,
+                maxHeightInLines = 1
+            )
 
         val layoutCoordinates = mock<LayoutCoordinates>()
         whenever(layoutCoordinates.isAttached).thenReturn(true)
 
-        val selectable = MultiWidgetSelectionDelegate(
-            1,
-            coordinatesCallback = { layoutCoordinates },
-            layoutResultCallback = { layoutResult }
-        )
+        val selectable =
+            MultiWidgetSelectionDelegate(
+                1,
+                coordinatesCallback = { layoutCoordinates },
+                layoutResultCallback = { layoutResult }
+            )
 
         val lastVisibleOffset = selectable.getLastVisibleOffset()
 
@@ -1666,22 +1621,24 @@
     fun getLastVisibleOffset_limitHeight_clip_enabledSoftwrap_singleLineContent() {
         val text = "helloworld helloworld helloworld"
 
-        val layoutResult = constrainedTextLayout(
-            text = text,
-            overflow = TextOverflow.Clip,
-            softWrap = true,
-            widthInCharacters = 10,
-            maxHeightInLines = 2
-        )
+        val layoutResult =
+            constrainedTextLayout(
+                text = text,
+                overflow = TextOverflow.Clip,
+                softWrap = true,
+                widthInCharacters = 10,
+                maxHeightInLines = 2
+            )
 
         val layoutCoordinates = mock<LayoutCoordinates>()
         whenever(layoutCoordinates.isAttached).thenReturn(true)
 
-        val selectable = MultiWidgetSelectionDelegate(
-            1,
-            coordinatesCallback = { layoutCoordinates },
-            layoutResultCallback = { layoutResult }
-        )
+        val selectable =
+            MultiWidgetSelectionDelegate(
+                1,
+                coordinatesCallback = { layoutCoordinates },
+                layoutResultCallback = { layoutResult }
+            )
 
         val lastVisibleOffset = selectable.getLastVisibleOffset()
 
@@ -1693,21 +1650,23 @@
     fun getLastVisibleOffset_limitHeight_clip_disabledSoftwrap_multiLineContent() {
         val text = "hello\nworld"
 
-        val layoutResult = constrainedTextLayout(
-            text = text,
-            overflow = TextOverflow.Clip,
-            softWrap = false,
-            maxHeightInLines = 1
-        )
+        val layoutResult =
+            constrainedTextLayout(
+                text = text,
+                overflow = TextOverflow.Clip,
+                softWrap = false,
+                maxHeightInLines = 1
+            )
 
         val layoutCoordinates = mock<LayoutCoordinates>()
         whenever(layoutCoordinates.isAttached).thenReturn(true)
 
-        val selectable = MultiWidgetSelectionDelegate(
-            1,
-            coordinatesCallback = { layoutCoordinates },
-            layoutResultCallback = { layoutResult }
-        )
+        val selectable =
+            MultiWidgetSelectionDelegate(
+                1,
+                coordinatesCallback = { layoutCoordinates },
+                layoutResultCallback = { layoutResult }
+            )
 
         val lastVisibleOffset = selectable.getLastVisibleOffset()
 
@@ -1718,22 +1677,24 @@
     fun getLastVisibleOffset_limitHeight_clip_disabledSoftwrap_singleLineContent() {
         val text = "hello world ".repeat(10)
 
-        val layoutResult = constrainedTextLayout(
-            text = text,
-            overflow = TextOverflow.Clip,
-            softWrap = false,
-            widthInCharacters = 10,
-            maxHeightInLines = 1
-        )
+        val layoutResult =
+            constrainedTextLayout(
+                text = text,
+                overflow = TextOverflow.Clip,
+                softWrap = false,
+                widthInCharacters = 10,
+                maxHeightInLines = 1
+            )
 
         val layoutCoordinates = mock<LayoutCoordinates>()
         whenever(layoutCoordinates.isAttached).thenReturn(true)
 
-        val selectable = MultiWidgetSelectionDelegate(
-            1,
-            coordinatesCallback = { layoutCoordinates },
-            layoutResultCallback = { layoutResult }
-        )
+        val selectable =
+            MultiWidgetSelectionDelegate(
+                1,
+                coordinatesCallback = { layoutCoordinates },
+                layoutResultCallback = { layoutResult }
+            )
 
         val lastVisibleOffset = selectable.getLastVisibleOffset()
 
@@ -1746,22 +1707,24 @@
     fun getLastVisibleOffset_limitHeight_ellipsis_enabledSoftwrap_multiLineContent() {
         val text = "hello\nworld\nhello\nworld"
 
-        val layoutResult = constrainedTextLayout(
-            text = text,
-            overflow = TextOverflow.Ellipsis,
-            softWrap = true,
-            widthInCharacters = 10,
-            maxHeightInLines = 2,
-        )
+        val layoutResult =
+            constrainedTextLayout(
+                text = text,
+                overflow = TextOverflow.Ellipsis,
+                softWrap = true,
+                widthInCharacters = 10,
+                maxHeightInLines = 2,
+            )
 
         val layoutCoordinates = mock<LayoutCoordinates>()
         whenever(layoutCoordinates.isAttached).thenReturn(true)
 
-        val selectable = MultiWidgetSelectionDelegate(
-            1,
-            coordinatesCallback = { layoutCoordinates },
-            layoutResultCallback = { layoutResult }
-        )
+        val selectable =
+            MultiWidgetSelectionDelegate(
+                1,
+                coordinatesCallback = { layoutCoordinates },
+                layoutResultCallback = { layoutResult }
+            )
 
         val lastVisibleOffset = selectable.getLastVisibleOffset()
 
@@ -1772,22 +1735,24 @@
     fun getLastVisibleOffset_limitHeight_ellipsis_enabledSoftwrap_singleLineContent() {
         val text = "hello world ".repeat(10)
 
-        val layoutResult = constrainedTextLayout(
-            text = text,
-            overflow = TextOverflow.Ellipsis,
-            softWrap = true,
-            widthInCharacters = 10,
-            maxHeightInLines = 1
-        )
+        val layoutResult =
+            constrainedTextLayout(
+                text = text,
+                overflow = TextOverflow.Ellipsis,
+                softWrap = true,
+                widthInCharacters = 10,
+                maxHeightInLines = 1
+            )
 
         val layoutCoordinates = mock<LayoutCoordinates>()
         whenever(layoutCoordinates.isAttached).thenReturn(true)
 
-        val selectable = MultiWidgetSelectionDelegate(
-            1,
-            coordinatesCallback = { layoutCoordinates },
-            layoutResultCallback = { layoutResult }
-        )
+        val selectable =
+            MultiWidgetSelectionDelegate(
+                1,
+                coordinatesCallback = { layoutCoordinates },
+                layoutResultCallback = { layoutResult }
+            )
 
         val lastVisibleOffset = selectable.getLastVisibleOffset()
 
@@ -1805,21 +1770,23 @@
     fun getLastVisibleOffset_limitHeight_ellipsis_disabledSoftwrap_multiLineContent() {
         val text = "hello\nworld"
 
-        val layoutResult = constrainedTextLayout(
-            text = text,
-            overflow = TextOverflow.Ellipsis,
-            softWrap = false,
-            maxHeightInLines = 1
-        )
+        val layoutResult =
+            constrainedTextLayout(
+                text = text,
+                overflow = TextOverflow.Ellipsis,
+                softWrap = false,
+                maxHeightInLines = 1
+            )
 
         val layoutCoordinates = mock<LayoutCoordinates>()
         whenever(layoutCoordinates.isAttached).thenReturn(true)
 
-        val selectable = MultiWidgetSelectionDelegate(
-            1,
-            coordinatesCallback = { layoutCoordinates },
-            layoutResultCallback = { layoutResult }
-        )
+        val selectable =
+            MultiWidgetSelectionDelegate(
+                1,
+                coordinatesCallback = { layoutCoordinates },
+                layoutResultCallback = { layoutResult }
+            )
 
         val lastVisibleOffset = selectable.getLastVisibleOffset()
 
@@ -1831,22 +1798,24 @@
     fun getLastVisibleOffset_limitHeight_ellipsis_disabledSoftwrap_singleLineContent() {
         val text = "hello world ".repeat(10)
 
-        val layoutResult = constrainedTextLayout(
-            text = text,
-            overflow = TextOverflow.Ellipsis,
-            softWrap = false,
-            widthInCharacters = 20,
-            maxHeightInLines = 1
-        )
+        val layoutResult =
+            constrainedTextLayout(
+                text = text,
+                overflow = TextOverflow.Ellipsis,
+                softWrap = false,
+                widthInCharacters = 20,
+                maxHeightInLines = 1
+            )
 
         val layoutCoordinates = mock<LayoutCoordinates>()
         whenever(layoutCoordinates.isAttached).thenReturn(true)
 
-        val selectable = MultiWidgetSelectionDelegate(
-            1,
-            coordinatesCallback = { layoutCoordinates },
-            layoutResultCallback = { layoutResult }
-        )
+        val selectable =
+            MultiWidgetSelectionDelegate(
+                1,
+                coordinatesCallback = { layoutCoordinates },
+                layoutResultCallback = { layoutResult }
+            )
 
         val lastVisibleOffset = selectable.getLastVisibleOffset()
 
@@ -1869,12 +1838,13 @@
         val spanStyle = SpanStyle(fontSize = fontSize, fontFamily = fontFamily)
         val annotatedString = AnnotatedString(text, spanStyle)
         return TextDelegate(
-            text = annotatedString,
-            style = TextStyle(),
-            density = density,
-            maxLines = maxLines,
-            fontFamilyResolver = fontFamilyResolver
-        ).layout(constraints, LayoutDirection.Ltr)
+                text = annotatedString,
+                style = TextStyle(),
+                density = density,
+                maxLines = maxLines,
+                fontFamilyResolver = fontFamilyResolver
+            )
+            .layout(constraints, LayoutDirection.Ltr)
     }
 
     private fun constrainedTextLayout(
@@ -1890,23 +1860,26 @@
         val spanStyle = SpanStyle(fontSize = fontSize, fontFamily = fontFamily)
         val annotatedString = AnnotatedString(text, spanStyle)
         val width = with(density) { fontSize.roundToPx() } * widthInCharacters
-        val constraints = Constraints(
-            minWidth = width,
-            maxWidth = width,
-            maxHeight = if (maxHeightInLines == Int.MAX_VALUE) {
-                Int.MAX_VALUE
-            } else {
-                with(density) { fontSize.roundToPx() } * maxHeightInLines
-            }
-        )
+        val constraints =
+            Constraints(
+                minWidth = width,
+                maxWidth = width,
+                maxHeight =
+                    if (maxHeightInLines == Int.MAX_VALUE) {
+                        Int.MAX_VALUE
+                    } else {
+                        with(density) { fontSize.roundToPx() } * maxHeightInLines
+                    }
+            )
         return TextDelegate(
-            text = annotatedString,
-            style = TextStyle(),
-            density = density,
-            fontFamilyResolver = fontFamilyResolver,
-            maxLines = maxLines,
-            overflow = overflow,
-            softWrap = softWrap
-        ).layout(constraints, LayoutDirection.Ltr)
+                text = annotatedString,
+                style = TextStyle(),
+                density = density,
+                fontFamilyResolver = fontFamilyResolver,
+                maxLines = maxLines,
+                overflow = overflow,
+                softWrap = softWrap
+            )
+            .layout(constraints, LayoutDirection.Ltr)
     }
 }
diff --git a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/selection/SelectionContainerContextMenuTest.kt b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/selection/SelectionContainerContextMenuTest.kt
index fb0f59d..b15ccc4 100644
--- a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/selection/SelectionContainerContextMenuTest.kt
+++ b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/selection/SelectionContainerContextMenuTest.kt
@@ -57,8 +57,7 @@
 @MediumTest
 @RunWith(AndroidJUnit4::class)
 class SelectionContainerContextMenuTest {
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
     private val textTag = "text"
     private val defaultText = "Text Text Text"
@@ -67,9 +66,7 @@
     @Test
     fun contextMenu_rightClick_appears() {
         rule.setContent {
-            SelectionContainer {
-                BasicText(defaultText, modifier = Modifier.testTag(textTag))
-            }
+            SelectionContainer { BasicText(defaultText, modifier = Modifier.testTag(textTag)) }
         }
 
         val contextMenuInteraction = rule.onNode(isPopup())
@@ -81,9 +78,7 @@
     @Test
     fun contextMenu_leftClick_doesNotAppear() {
         rule.setContent {
-            SelectionContainer {
-                BasicText(defaultText, modifier = Modifier.testTag(textTag))
-            }
+            SelectionContainer { BasicText(defaultText, modifier = Modifier.testTag(textTag)) }
         }
 
         val contextMenuInteraction = rule.onNode(isPopup())
@@ -95,9 +90,7 @@
     @Test
     fun contextMenu_disappearsOnClickOffOfPopup() {
         rule.setContent {
-            SelectionContainer {
-                BasicText(defaultText, modifier = Modifier.testTag(textTag))
-            }
+            SelectionContainer { BasicText(defaultText, modifier = Modifier.testTag(textTag)) }
         }
 
         val contextMenuInteraction = rule.onNode(isPopup())
@@ -107,21 +100,24 @@
         rule.clickOffPopup { rootRect -> lerp(rootRect.topLeft, rootRect.center, 0.5f) }
         contextMenuInteraction.assertDoesNotExist()
     }
+
     // endregion SelectionContainer Context Menu Gesture Tests
 
     // region Context Menu Item Click Tests
     @Test
-    fun contextMenu_onClickCopy() = runClickContextMenuItemTest(
-        labelToClick = ContextMenuItemLabels.COPY,
-        expectedSelection = TextRange(5, 9),
-        expectedClipboardContent = "Text",
-    )
+    fun contextMenu_onClickCopy() =
+        runClickContextMenuItemTest(
+            labelToClick = ContextMenuItemLabels.COPY,
+            expectedSelection = TextRange(5, 9),
+            expectedClipboardContent = "Text",
+        )
 
     @Test
-    fun contextMenu_onClickSelectAll() = runClickContextMenuItemTest(
-        labelToClick = ContextMenuItemLabels.SELECT_ALL,
-        expectedSelection = TextRange(0, 14),
-    )
+    fun contextMenu_onClickSelectAll() =
+        runClickContextMenuItemTest(
+            labelToClick = ContextMenuItemLabels.SELECT_ALL,
+            expectedSelection = TextRange(0, 14),
+        )
 
     @Suppress("SameParameterValue")
     private fun runClickContextMenuItemTest(
@@ -131,10 +127,11 @@
     ) {
         val initialClipboardText = "clip"
 
-        val clipboardManager = FakeClipboardManager(
-            initialText = initialClipboardText,
-            supportsClipEntry = true,
-        )
+        val clipboardManager =
+            FakeClipboardManager(
+                initialText = initialClipboardText,
+                supportsClipEntry = true,
+            )
 
         var selection by mutableStateOf<Selection?>(null)
         rule.setContent {
@@ -177,47 +174,54 @@
 
     // region Context Menu Correct Item Tests
     @Test
-    fun contextMenu_noSelection_itemsMatch() = runCorrectItemsTest(
-        selectionAmount = SelectionAmount.NONE,
-    ) { selection ->
-        assertThat(selection).isNull()
-        rule.assertContextMenuItems(
-            cutState = ContextMenuItemState.DOES_NOT_EXIST,
-            copyState = ContextMenuItemState.DISABLED,
-            pasteState = ContextMenuItemState.DOES_NOT_EXIST,
-            selectAllState = ContextMenuItemState.ENABLED,
-        )
-    }
+    fun contextMenu_noSelection_itemsMatch() =
+        runCorrectItemsTest(
+            selectionAmount = SelectionAmount.NONE,
+        ) { selection ->
+            assertThat(selection).isNull()
+            rule.assertContextMenuItems(
+                cutState = ContextMenuItemState.DOES_NOT_EXIST,
+                copyState = ContextMenuItemState.DISABLED,
+                pasteState = ContextMenuItemState.DOES_NOT_EXIST,
+                selectAllState = ContextMenuItemState.ENABLED,
+            )
+        }
 
     @Test
-    fun contextMenu_partialSelection_itemsMatch() = runCorrectItemsTest(
-        selectionAmount = SelectionAmount.PARTIAL,
-    ) { selection ->
-        assertThat(selection).isNotNull()
-        assertThat(selection!!.toTextRange()).isEqualTo(TextRange(5, 9))
-        rule.assertContextMenuItems(
-            cutState = ContextMenuItemState.DOES_NOT_EXIST,
-            copyState = ContextMenuItemState.ENABLED,
-            pasteState = ContextMenuItemState.DOES_NOT_EXIST,
-            selectAllState = ContextMenuItemState.ENABLED,
-        )
-    }
+    fun contextMenu_partialSelection_itemsMatch() =
+        runCorrectItemsTest(
+            selectionAmount = SelectionAmount.PARTIAL,
+        ) { selection ->
+            assertThat(selection).isNotNull()
+            assertThat(selection!!.toTextRange()).isEqualTo(TextRange(5, 9))
+            rule.assertContextMenuItems(
+                cutState = ContextMenuItemState.DOES_NOT_EXIST,
+                copyState = ContextMenuItemState.ENABLED,
+                pasteState = ContextMenuItemState.DOES_NOT_EXIST,
+                selectAllState = ContextMenuItemState.ENABLED,
+            )
+        }
 
     @Test
-    fun contextMenu_fullSelection_itemsMatch() = runCorrectItemsTest(
-        selectionAmount = SelectionAmount.ALL,
-    ) { selection ->
-        assertThat(selection).isNotNull()
-        assertThat(selection!!.toTextRange()).isEqualTo(TextRange(0, 14))
-        rule.assertContextMenuItems(
-            cutState = ContextMenuItemState.DOES_NOT_EXIST,
-            copyState = ContextMenuItemState.ENABLED,
-            pasteState = ContextMenuItemState.DOES_NOT_EXIST,
-            selectAllState = ContextMenuItemState.DISABLED,
-        )
-    }
+    fun contextMenu_fullSelection_itemsMatch() =
+        runCorrectItemsTest(
+            selectionAmount = SelectionAmount.ALL,
+        ) { selection ->
+            assertThat(selection).isNotNull()
+            assertThat(selection!!.toTextRange()).isEqualTo(TextRange(0, 14))
+            rule.assertContextMenuItems(
+                cutState = ContextMenuItemState.DOES_NOT_EXIST,
+                copyState = ContextMenuItemState.ENABLED,
+                pasteState = ContextMenuItemState.DOES_NOT_EXIST,
+                selectAllState = ContextMenuItemState.DISABLED,
+            )
+        }
 
-    private enum class SelectionAmount { NONE, PARTIAL, ALL }
+    private enum class SelectionAmount {
+        NONE,
+        PARTIAL,
+        ALL
+    }
 
     private fun runCorrectItemsTest(
         selectionAmount: SelectionAmount = SelectionAmount.PARTIAL,
@@ -225,10 +229,11 @@
     ) {
         val text = "Text Text Text"
 
-        val clipboardManager = FakeClipboardManager(
-            initialText = "Clipboard Text",
-            supportsClipEntry = true,
-        )
+        val clipboardManager =
+            FakeClipboardManager(
+                initialText = "Clipboard Text",
+                supportsClipEntry = true,
+            )
 
         var selection by mutableStateOf<Selection?>(null)
 
@@ -246,13 +251,11 @@
         // set selection
         when (selectionAmount) {
             SelectionAmount.NONE -> {} // already no selection
-
             SelectionAmount.PARTIAL -> {
                 // select middle word
                 rule.onNodeWithTag(textTag).performTouchInput { longClick(center) }
                 rule.waitForIdle()
             }
-
             SelectionAmount.ALL -> {
                 // select everything
                 rule.onNodeWithTag(textTag).performTouchInput {
diff --git a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/selection/SelectionContainerFocusTest.kt b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/selection/SelectionContainerFocusTest.kt
index 734a6e6..b2c14ea 100644
--- a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/selection/SelectionContainerFocusTest.kt
+++ b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/selection/SelectionContainerFocusTest.kt
@@ -68,8 +68,7 @@
 @LargeTest
 @RunWith(AndroidJUnit4::class)
 class SelectionContainerFocusTest {
-    @get:Rule
-    val rule = createAndroidComposeRule<ComponentActivity>()
+    @get:Rule val rule = createAndroidComposeRule<ComponentActivity>()
 
     private lateinit var view: View
 
@@ -89,27 +88,21 @@
         createSelectionContainer()
         // Touch position. In this test, each character's width and height equal to fontSize.
         // Position is computed so that (position, position) is the center of the first character.
-        val positionInText = with(Density(view.context)) {
-            fontSize.toPx() / 2
+        val positionInText = with(Density(view.context)) { fontSize.toPx() / 2 }
+        rule.onNode(hasTestTag("selectionContainer1")).performTouchInput {
+            longClick(Offset(x = positionInText, y = positionInText))
         }
-        rule.onNode(hasTestTag("selectionContainer1"))
-            .performTouchInput { longClick(Offset(x = positionInText, y = positionInText)) }
-        rule.runOnIdle {
-            assertThat(selection1.value).isNotNull()
-        }
+        rule.runOnIdle { assertThat(selection1.value).isNotNull() }
 
         // Act.
-        rule.onNode(hasTestTag("box"))
-            .performTouchInput { click(center) }
+        rule.onNode(hasTestTag("box")).performTouchInput { click(center) }
 
         // Assert.
         rule.runOnIdle {
             assertThat(selection1.value).isNull()
             assertThat(selection2.value).isNull()
-            verify(
-                hapticFeedback,
-                times(2)
-            ).performHapticFeedback(HapticFeedbackType.TextHandleMove)
+            verify(hapticFeedback, times(2))
+                .performHapticFeedback(HapticFeedbackType.TextHandleMove)
         }
     }
 
@@ -119,18 +112,16 @@
         createSelectionContainer()
         // Touch position. In this test, each character's width and height equal to fontSize.
         // Position is computed so that (position, position) is the center of the first character.
-        val positionInText = with(Density(view.context)) {
-            fontSize.toPx() / 2
+        val positionInText = with(Density(view.context)) { fontSize.toPx() / 2 }
+        rule.onNode(hasTestTag("selectionContainer1")).performTouchInput {
+            longClick(Offset(x = positionInText, y = positionInText))
         }
-        rule.onNode(hasTestTag("selectionContainer1"))
-            .performTouchInput { longClick(Offset(x = positionInText, y = positionInText)) }
-        rule.runOnIdle {
-            assertThat(selection1.value).isNotNull()
-        }
+        rule.runOnIdle { assertThat(selection1.value).isNotNull() }
 
         // Act.
-        rule.onNode(hasTestTag("selectionContainer2"))
-            .performTouchInput { longClick(Offset(x = positionInText, y = positionInText)) }
+        rule.onNode(hasTestTag("selectionContainer2")).performTouchInput {
+            longClick(Offset(x = positionInText, y = positionInText))
+        }
 
         // Assert.
         rule.runOnIdle {
@@ -138,10 +129,8 @@
             assertThat(selection2.value).isNotNull()
             // There will be 2 times from the first SelectionContainer and 1 time from the second
             // SelectionContainer.
-            verify(
-                hapticFeedback,
-                times(3)
-            ).performHapticFeedback(HapticFeedbackType.TextHandleMove)
+            verify(hapticFeedback, times(3))
+                .performHapticFeedback(HapticFeedbackType.TextHandleMove)
         }
     }
 
@@ -149,19 +138,18 @@
     fun leavingComposition_hidesTextToolbar() {
         // null -> nothing got called, true -> show, false -> hide
         var lastShowCalled: Boolean? = null
-        val fakeTextToolbar = FakeTextToolbar(
-            onShowMenu = { _, _, _, _, _ -> lastShowCalled = true },
-            onHideMenu = { lastShowCalled = false }
-        )
+        val fakeTextToolbar =
+            FakeTextToolbar(
+                onShowMenu = { _, _, _, _, _ -> lastShowCalled = true },
+                onHideMenu = { lastShowCalled = false }
+            )
 
         val tag = "SelectionContainer"
 
         var inComposition by mutableStateOf(true)
 
         rule.setContent {
-            CompositionLocalProvider(
-                LocalTextToolbar provides fakeTextToolbar
-            ) {
+            CompositionLocalProvider(LocalTextToolbar provides fakeTextToolbar) {
                 if (inComposition) {
                     SelectionContainer(modifier = Modifier.testTag("SelectionContainer")) {
                         BasicText(
@@ -180,15 +168,11 @@
         }
 
         rule.onNodeWithTag(tag).performTouchInput { longClick() }
-        rule.runOnIdle {
-            assertThat(lastShowCalled).isTrue()
-        }
+        rule.runOnIdle { assertThat(lastShowCalled).isTrue() }
 
         inComposition = false
 
-        rule.runOnIdle {
-            assertThat(lastShowCalled).isFalse()
-        }
+        rule.runOnIdle { assertThat(lastShowCalled).isFalse() }
     }
 
     private fun createSelectionContainer(isRtl: Boolean = false) {
@@ -203,15 +187,11 @@
             ) {
                 Column {
                     SelectionContainer(
-                        modifier = Modifier
-                            .onGloballyPositioned {
-                                measureLatch.countDown()
-                            }
-                            .testTag("selectionContainer1"),
+                        modifier =
+                            Modifier.onGloballyPositioned { measureLatch.countDown() }
+                                .testTag("selectionContainer1"),
                         selection = selection1.value,
-                        onSelectionChange = {
-                            selection1.value = it
-                        }
+                        onSelectionChange = { selection1.value = it }
                     ) {
                         Column {
                             BasicText(
@@ -224,23 +204,16 @@
                                 inlineContent = mapOf(),
                                 onTextLayout = {}
                             )
-                            Box(
-                                Modifier
-                                    .size(boxSize, boxSize)
-                                    .testTag("box"))
+                            Box(Modifier.size(boxSize, boxSize).testTag("box"))
                         }
                     }
 
                     SelectionContainer(
-                        modifier = Modifier
-                            .onGloballyPositioned {
-                                measureLatch.countDown()
-                            }
-                            .testTag("selectionContainer2"),
+                        modifier =
+                            Modifier.onGloballyPositioned { measureLatch.countDown() }
+                                .testTag("selectionContainer2"),
                         selection = selection2.value,
-                        onSelectionChange = {
-                            selection2.value = it
-                        }
+                        onSelectionChange = { selection2.value = it }
                     ) {
                         BasicText(
                             AnnotatedString(textContent),
@@ -263,13 +236,14 @@
 }
 
 internal fun FakeTextToolbar(
-    onShowMenu: (
-        rect: Rect,
-        onCopyRequested: (() -> Unit)?,
-        onPasteRequested: (() -> Unit)?,
-        onCutRequested: (() -> Unit)?,
-        onSelectAllRequested: (() -> Unit)?
-    ) -> Unit,
+    onShowMenu:
+        (
+            rect: Rect,
+            onCopyRequested: (() -> Unit)?,
+            onPasteRequested: (() -> Unit)?,
+            onCutRequested: (() -> Unit)?,
+            onSelectAllRequested: (() -> Unit)?
+        ) -> Unit,
     onHideMenu: () -> Unit
 ): TextToolbar {
     return object : TextToolbar {
diff --git a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/selection/SelectionContainerMagnifierTest.kt b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/selection/SelectionContainerMagnifierTest.kt
index fb87a19..dd830fb 100644
--- a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/selection/SelectionContainerMagnifierTest.kt
+++ b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/selection/SelectionContainerMagnifierTest.kt
@@ -82,25 +82,19 @@
         rule.setContent {
             CompositionLocalProvider(LocalLayoutDirection provides LayoutDirection.Rtl) {
                 SelectionContainer(
-                    modifier = Modifier
-                        // Center the text to give the magnifier lots of room to move.
-                        .fillMaxSize()
-                        .wrapContentSize()
-                        .testTag(tag),
+                    modifier =
+                        Modifier
+                            // Center the text to give the magnifier lots of room to move.
+                            .fillMaxSize()
+                            .wrapContentSize()
+                            .testTag(tag),
                 ) {
                     Column(Modifier.width(IntrinsicSize.Max)) {
                         BasicText(
                             text = RtlChar.repeat(4),
-                            modifier = Modifier
-                                .fillMaxWidth()
-                                .testTag(nonEmptyTag)
+                            modifier = Modifier.fillMaxWidth().testTag(nonEmptyTag)
                         )
-                        BasicText(
-                            text = "",
-                            modifier = Modifier
-                                .fillMaxWidth()
-                                .testTag(emptyTag)
-                        )
+                        BasicText(text = "", modifier = Modifier.fillMaxWidth().testTag(emptyTag))
                     }
                 }
             }
@@ -113,12 +107,11 @@
         }
 
         // start selection at first character
-        val firstPressOffset = rule.onNodeWithTag(nonEmptyTag).fetchTextLayoutResult()
-            .getBoundingBox(0).centerRight - Offset(1f, 0f)
+        val firstPressOffset =
+            rule.onNodeWithTag(nonEmptyTag).fetchTextLayoutResult().getBoundingBox(0).centerRight -
+                Offset(1f, 0f)
 
-        rule.onNodeWithTag(tag).performTouchInput {
-            longPress(firstPressOffset)
-        }
+        rule.onNodeWithTag(tag).performTouchInput { longPress(firstPressOffset) }
         rule.waitForIdle()
         assertMagnifierAt(firstPressOffset)
 
@@ -127,9 +120,7 @@
         val emptyTextCenterY =
             textLayoutResult.size.height / 2f + emptyTextPosition.y - placedPosition.y
         val secondOffset = Offset(firstPressOffset.x, emptyTextCenterY)
-        rule.onNodeWithTag(tag).performTouchInput {
-            moveTo(secondOffset)
-        }
+        rule.onNodeWithTag(tag).performTouchInput { moveTo(secondOffset) }
         rule.waitForIdle()
 
         val expectedX = rule.onNodeWithTag(tag).fetchSemanticsNode().boundsInRoot.width
diff --git a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/selection/SelectionContainerTest.kt b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/selection/SelectionContainerTest.kt
index 01fcc59..d6aa5e2 100644
--- a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/selection/SelectionContainerTest.kt
+++ b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/selection/SelectionContainerTest.kt
@@ -94,10 +94,7 @@
 @LargeTest
 @RunWith(AndroidJUnit4::class)
 class SelectionContainerTest {
-    @get:Rule
-    val rule = createComposeRule().also {
-        it.mainClock.autoAdvance = false
-    }
+    @get:Rule val rule = createComposeRule().also { it.mainClock.autoAdvance = false }
 
     private val textContent = "Text Demo Text"
     private val fontFamily = TEST_FONT_FAMILY
@@ -117,23 +114,19 @@
         // A reasonable number.
         createSelectionContainer()
         val position = 50f
-        rule.onSelectionContainer()
-            .performTouchInput { longClick(Offset(x = position, y = position)) }
-        rule.runOnIdle {
-            assertThat(selection.value).isNotNull()
+        rule.onSelectionContainer().performTouchInput {
+            longClick(Offset(x = position, y = position))
         }
+        rule.runOnIdle { assertThat(selection.value).isNotNull() }
 
         // Act.
-        rule.onSelectionContainer()
-            .performTouchInput { click(Offset(x = position, y = position)) }
+        rule.onSelectionContainer().performTouchInput { click(Offset(x = position, y = position)) }
 
         // Assert.
         rule.runOnIdle {
             assertThat(selection.value).isNull()
-            verify(
-                hapticFeedback,
-                times(2)
-            ).performHapticFeedback(HapticFeedbackType.TextHandleMove)
+            verify(hapticFeedback, times(2))
+                .performHapticFeedback(HapticFeedbackType.TextHandleMove)
         }
     }
 
@@ -144,14 +137,14 @@
         // A reasonable number.
         createSelectionContainer()
         val position = 50f
-        rule.onSelectionContainer()
-            .performTouchInput { longClick(Offset(x = position, y = position)) }
+        rule.onSelectionContainer().performTouchInput {
+            longClick(Offset(x = position, y = position))
+        }
 
         log.entries.clear()
 
         // Act.
-        rule.onSelectionContainer()
-            .performTouchInput { click(Offset(x = position, y = position)) }
+        rule.onSelectionContainer().performTouchInput { click(Offset(x = position, y = position)) }
 
         // Assert.
         rule.runOnIdle {
@@ -175,28 +168,25 @@
             val expectedRightY = fontSize.toDp()
 
             // Act.
-            rule.onSelectionContainer()
-                .performTouchInput {
-                    longClick(
-                        Offset(textContent.indexOf('m') * characterSize, 0.5f * characterSize)
-                    )
-                }
+            rule.onSelectionContainer().performTouchInput {
+                longClick(Offset(textContent.indexOf('m') * characterSize, 0.5f * characterSize))
+            }
 
             rule.mainClock.advanceTimeByFrame()
             // Assert. Should select "Demo".
             assertThat(selection.value!!.start.offset).isEqualTo(textContent.indexOf('D'))
             assertThat(selection.value!!.end.offset).isEqualTo(textContent.indexOf('o') + 1)
-            verify(
-                hapticFeedback,
-                times(1)
-            ).performHapticFeedback(HapticFeedbackType.TextHandleMove)
+            verify(hapticFeedback, times(1))
+                .performHapticFeedback(HapticFeedbackType.TextHandleMove)
 
             // Check the position of the anchors of the selection handles. We don't need to compare
             // to the absolute position since the semantics report selection relative to the
             // container composable, not the screen.
-            rule.onNode(isSelectionHandle(Handle.SelectionStart))
+            rule
+                .onNode(isSelectionHandle(Handle.SelectionStart))
                 .assertHandlePositionMatches(expectedLeftX, expectedLeftY)
-            rule.onNode(isSelectionHandle(Handle.SelectionEnd))
+            rule
+                .onNode(isSelectionHandle(Handle.SelectionEnd))
                 .assertHandlePositionMatches(expectedRightX, expectedRightY)
         }
     }
@@ -214,33 +204,31 @@
             val expectedRightY = fontSize.toDp()
 
             // Act.
-            rule.onSelectionContainer()
-                .performTouchInput {
-                    longClick(
-                        Offset(
-                            rule.rootWidth().toSp().toPx() - ("xt Demo Text").length *
-                                characterSize,
-                            0.5f * characterSize
-                        )
+            rule.onSelectionContainer().performTouchInput {
+                longClick(
+                    Offset(
+                        rule.rootWidth().toSp().toPx() - ("xt Demo Text").length * characterSize,
+                        0.5f * characterSize
                     )
-                }
+                )
+            }
 
             rule.mainClock.advanceTimeByFrame()
 
             // Assert. Should select "Demo".
             assertThat(selection.value!!.start.offset).isEqualTo(textContent.indexOf('T'))
             assertThat(selection.value!!.end.offset).isEqualTo(textContent.indexOf('t') + 1)
-            verify(
-                hapticFeedback,
-                times(1)
-            ).performHapticFeedback(HapticFeedbackType.TextHandleMove)
+            verify(hapticFeedback, times(1))
+                .performHapticFeedback(HapticFeedbackType.TextHandleMove)
 
             // Check the position of the anchors of the selection handles. We don't need to compare
             // to the absolute position since the semantics report selection relative to the
             // container composable, not the screen.
-            rule.onNode(isSelectionHandle(Handle.SelectionStart))
+            rule
+                .onNode(isSelectionHandle(Handle.SelectionStart))
                 .assertHandlePositionMatches(expectedLeftX, expectedLeftY)
-            rule.onNode(isSelectionHandle(Handle.SelectionEnd))
+            rule
+                .onNode(isSelectionHandle(Handle.SelectionEnd))
                 .assertHandlePositionMatches(expectedRightX, expectedRightY)
         }
     }
@@ -251,16 +239,12 @@
             Column {
                 BasicText(
                     AnnotatedString(textContent),
-                    Modifier
-                        .fillMaxWidth()
-                        .testTag(tag1),
+                    Modifier.fillMaxWidth().testTag(tag1),
                     style = TextStyle(fontFamily = fontFamily, fontSize = fontSize)
                 )
                 BasicText(
                     AnnotatedString(textContent),
-                    Modifier
-                        .fillMaxWidth()
-                        .testTag(tag2),
+                    Modifier.fillMaxWidth().testTag(tag2),
                     style = TextStyle(fontFamily = fontFamily, fontSize = fontSize)
                 )
             }
@@ -279,16 +263,12 @@
             Column {
                 BasicText(
                     AnnotatedString(textContent),
-                    Modifier
-                        .fillMaxWidth()
-                        .testTag(tag1),
+                    Modifier.fillMaxWidth().testTag(tag1),
                     style = TextStyle(fontFamily = fontFamily, fontSize = fontSize)
                 )
                 BasicText(
                     AnnotatedString(textContent),
-                    Modifier
-                        .fillMaxWidth()
-                        .testTag(tag2),
+                    Modifier.fillMaxWidth().testTag(tag2),
                     style = TextStyle(fontFamily = fontFamily, fontSize = fontSize)
                 )
             }
@@ -307,17 +287,13 @@
             Column {
                 BasicText(
                     AnnotatedString(textContent),
-                    Modifier
-                        .fillMaxWidth()
-                        .testTag(tag1),
+                    Modifier.fillMaxWidth().testTag(tag1),
                     style = TextStyle(fontFamily = fontFamily, fontSize = fontSize)
                 )
                 DisableSelection {
                     BasicText(
                         AnnotatedString(textContent),
-                        Modifier
-                            .fillMaxWidth()
-                            .testTag(tag2),
+                        Modifier.fillMaxWidth().testTag(tag2),
                         style = TextStyle(fontFamily = fontFamily, fontSize = fontSize)
                     )
                 }
@@ -337,9 +313,7 @@
             Column {
                 BasicText(
                     AnnotatedString("$textContent ".repeat(100)),
-                    Modifier
-                        .fillMaxWidth()
-                        .testTag(tag1),
+                    Modifier.fillMaxWidth().testTag(tag1),
                     style = TextStyle(fontFamily = fontFamily, fontSize = fontSize),
                     softWrap = false
                 )
@@ -353,9 +327,7 @@
                 }
                 BasicText(
                     AnnotatedString("$textContent ".repeat(100)),
-                    Modifier
-                        .fillMaxWidth()
-                        .testTag(tag2),
+                    Modifier.fillMaxWidth().testTag(tag2),
                     style = TextStyle(fontFamily = fontFamily, fontSize = fontSize),
                     softWrap = false
                 )
@@ -370,58 +342,56 @@
     }
 
     @Test
-    fun allTextIsSelected_whenTextIsOverflowed_clipped_maxLines1() = with(rule.density) {
-        val longText = "$textContent ".repeat(100)
-        createSelectionContainer {
-            Column {
-                BasicText(
-                    AnnotatedString(longText),
-                    Modifier
-                        .fillMaxWidth()
-                        .testTag(tag1),
-                    style = TextStyle(fontFamily = fontFamily, fontSize = fontSize),
-                    maxLines = 1
-                )
+    fun allTextIsSelected_whenTextIsOverflowed_clipped_maxLines1() =
+        with(rule.density) {
+            val longText = "$textContent ".repeat(100)
+            createSelectionContainer {
+                Column {
+                    BasicText(
+                        AnnotatedString(longText),
+                        Modifier.fillMaxWidth().testTag(tag1),
+                        style = TextStyle(fontFamily = fontFamily, fontSize = fontSize),
+                        maxLines = 1
+                    )
+                }
             }
+
+            startSelection(tag1)
+            dragHandleTo(
+                handle = Handle.SelectionEnd,
+                offset = characterBox(tag1, 4).bottomRight + Offset(x = 0f, y = fontSize.toPx())
+            )
+
+            assertAnchorInfo(selection.value?.start, offset = 0, selectableId = 1)
+            assertAnchorInfo(selection.value?.end, offset = longText.length, selectableId = 1)
         }
 
-        startSelection(tag1)
-        dragHandleTo(
-            handle = Handle.SelectionEnd,
-            offset = characterBox(tag1, 4).bottomRight + Offset(x = 0f, y = fontSize.toPx())
-        )
-
-        assertAnchorInfo(selection.value?.start, offset = 0, selectableId = 1)
-        assertAnchorInfo(selection.value?.end, offset = longText.length, selectableId = 1)
-    }
-
     @Test
-    fun allTextIsSelected_whenTextIsOverflowed_ellipsized_maxLines1() = with(rule.density) {
-        val longText = "$textContent ".repeat(100)
-        createSelectionContainer {
-            Column {
-                BasicText(
-                    AnnotatedString(longText),
-                    Modifier
-                        .fillMaxWidth()
-                        .testTag(tag1),
-                    style = TextStyle(fontFamily = fontFamily, fontSize = fontSize),
-                    maxLines = 1,
-                    overflow = TextOverflow.Ellipsis
-                )
+    fun allTextIsSelected_whenTextIsOverflowed_ellipsized_maxLines1() =
+        with(rule.density) {
+            val longText = "$textContent ".repeat(100)
+            createSelectionContainer {
+                Column {
+                    BasicText(
+                        AnnotatedString(longText),
+                        Modifier.fillMaxWidth().testTag(tag1),
+                        style = TextStyle(fontFamily = fontFamily, fontSize = fontSize),
+                        maxLines = 1,
+                        overflow = TextOverflow.Ellipsis
+                    )
+                }
             }
+
+            startSelection(tag1)
+            dragHandleTo(
+                handle = Handle.SelectionEnd,
+                offset = characterBox(tag1, 4).bottomRight + Offset(x = 0f, y = fontSize.toPx())
+            )
+
+            assertAnchorInfo(selection.value?.start, offset = 0, selectableId = 1)
+            assertAnchorInfo(selection.value?.end, offset = longText.length, selectableId = 1)
         }
 
-        startSelection(tag1)
-        dragHandleTo(
-            handle = Handle.SelectionEnd,
-            offset = characterBox(tag1, 4).bottomRight + Offset(x = 0f, y = fontSize.toPx())
-        )
-
-        assertAnchorInfo(selection.value?.start, offset = 0, selectableId = 1)
-        assertAnchorInfo(selection.value?.end, offset = longText.length, selectableId = 1)
-    }
-
     @Test
     fun selectionIncludes_noHeightText() {
         lateinit var clipboardManager: ClipboardManager
@@ -431,28 +401,18 @@
             Column {
                 BasicText(
                     text = "Hello",
-                    modifier = Modifier
-                        .fillMaxWidth()
-                        .testTag(tag1),
+                    modifier = Modifier.fillMaxWidth().testTag(tag1),
                 )
-                BasicText(
-                    text = "THIS SHOULD NOT CAUSE CRASH",
-                    modifier = Modifier.height(0.dp)
-                )
+                BasicText(text = "THIS SHOULD NOT CAUSE CRASH", modifier = Modifier.height(0.dp))
                 BasicText(
                     text = "World",
-                    modifier = Modifier
-                        .fillMaxWidth()
-                        .testTag(tag2),
+                    modifier = Modifier.fillMaxWidth().testTag(tag2),
                 )
             }
         }
 
         startSelection(tag1)
-        dragHandleTo(
-            handle = Handle.SelectionEnd,
-            offset = characterBox(tag2, 4).bottomRight
-        )
+        dragHandleTo(handle = Handle.SelectionEnd, offset = characterBox(tag2, 4).bottomRight)
 
         assertAnchorInfo(selection.value?.start, offset = 0, selectableId = 1)
         assertAnchorInfo(selection.value?.end, offset = 5, selectableId = 3)
@@ -467,28 +427,18 @@
             Column {
                 BasicText(
                     text = "Hello",
-                    modifier = Modifier
-                        .fillMaxWidth()
-                        .testTag(tag1),
+                    modifier = Modifier.fillMaxWidth().testTag(tag1),
                 )
-                BasicText(
-                    text = "THIS SHOULD NOT CAUSE CRASH",
-                    modifier = Modifier.width(0.dp)
-                )
+                BasicText(text = "THIS SHOULD NOT CAUSE CRASH", modifier = Modifier.width(0.dp))
                 BasicText(
                     text = "World",
-                    modifier = Modifier
-                        .fillMaxWidth()
-                        .testTag(tag2),
+                    modifier = Modifier.fillMaxWidth().testTag(tag2),
                 )
             }
         }
 
         startSelection(tag1)
-        dragHandleTo(
-            handle = Handle.SelectionEnd,
-            offset = characterBox(tag2, 4).bottomRight
-        )
+        dragHandleTo(handle = Handle.SelectionEnd, offset = characterBox(tag2, 4).bottomRight)
 
         assertAnchorInfo(selection.value?.start, offset = 0, selectableId = 1)
         assertAnchorInfo(selection.value?.end, offset = 5, selectableId = 3)
@@ -504,56 +454,42 @@
             Column {
                 BasicText(
                     text = "ExpectedText",
-                    modifier = Modifier
-                        .fillMaxWidth()
-                        .testTag(tag1),
+                    modifier = Modifier.fillMaxWidth().testTag(tag1),
                 )
             }
         }
 
         startSelection(tag1)
 
-        rule.onNodeWithTag(tag1)
-            .performKeyInput {
-                keyDown(Key.CtrlLeft)
-                keyDown(Key.C)
-                keyUp(Key.C)
-                keyUp(Key.CtrlLeft)
-            }
-
-        rule.runOnIdle {
-            assertThat(clipboardManager.getText()?.text).isEqualTo("ExpectedText")
+        rule.onNodeWithTag(tag1).performKeyInput {
+            keyDown(Key.CtrlLeft)
+            keyDown(Key.C)
+            keyUp(Key.C)
+            keyUp(Key.CtrlLeft)
         }
+
+        rule.runOnIdle { assertThat(clipboardManager.getText()?.text).isEqualTo("ExpectedText") }
     }
 
-    private fun startSelection(
-        tag: String,
-        offset: Int = 0
-    ) {
+    private fun startSelection(tag: String, offset: Int = 0) {
         val textLayoutResult = rule.onNodeWithTag(tag).fetchTextLayoutResult()
         val boundingBox = textLayoutResult.getBoundingBox(offset)
-        rule.onNodeWithTag(tag).performTouchInput {
-            longClick(boundingBox.center)
-        }
+        rule.onNodeWithTag(tag).performTouchInput { longClick(boundingBox.center) }
     }
 
-    private fun characterBox(
-        tag: String,
-        offset: Int
-    ): Rect {
+    private fun characterBox(tag: String, offset: Int): Rect {
         val nodePosition = rule.onNodeWithTag(tag).fetchSemanticsNode().positionInRoot
         val textLayoutResult = rule.onNodeWithTag(tag).fetchTextLayoutResult()
         return textLayoutResult.getBoundingBox(offset).translate(nodePosition)
     }
 
-    private fun dragHandleTo(
-        handle: Handle,
-        offset: Offset
-    ) {
-        val position = rule.onNode(isSelectionHandle(handle))
-            .fetchSemanticsNode()
-            .config[SelectionHandleInfoKey]
-            .position
+    private fun dragHandleTo(handle: Handle, offset: Offset) {
+        val position =
+            rule
+                .onNode(isSelectionHandle(handle))
+                .fetchSemanticsNode()
+                .config[SelectionHandleInfoKey]
+                .position
         // selection handles are anchored at the bottom of a line.
 
         rule.onNode(isSelectionHandle(handle)).performTouchInput {
@@ -565,14 +501,15 @@
     }
 
     /**
-     * Moves the first pointer by [delta] past the touch slop threshold on each axis.
-     * If [delta] is 0 on either axis it will stay 0.
+     * Moves the first pointer by [delta] past the touch slop threshold on each axis. If [delta] is
+     * 0 on either axis it will stay 0.
      */
     private fun TouchInjectionScope.movePastSlopBy(delta: Offset) {
-        val slop = Offset(
-            x = viewConfiguration.touchSlop * delta.x.sign,
-            y = viewConfiguration.touchSlop * delta.y.sign
-        )
+        val slop =
+            Offset(
+                x = viewConfiguration.touchSlop * delta.x.sign,
+                y = viewConfiguration.touchSlop * delta.y.sign
+            )
         moveBy(delta + slop)
     }
 
@@ -582,13 +519,8 @@
         offset: Int = 0,
         selectableId: Long = 0
     ) {
-        assertThat(anchorInfo).isEqualTo(
-            Selection.AnchorInfo(
-                resolvedTextDirection,
-                offset,
-                selectableId
-            )
-        )
+        assertThat(anchorInfo)
+            .isEqualTo(Selection.AnchorInfo(resolvedTextDirection, offset, selectableId))
     }
 
     private fun createSelectionContainer(
@@ -603,30 +535,23 @@
                 LocalHapticFeedback provides hapticFeedback,
                 LocalLayoutDirection provides layoutDirection
             ) {
-                TestParent(
-                    Modifier
-                        .testTag("selectionContainer")
-                        .gestureSpy(log)
-                ) {
+                TestParent(Modifier.testTag("selectionContainer").gestureSpy(log)) {
                     SelectionContainer(
-                        modifier = Modifier.onGloballyPositioned {
-                            measureLatch.countDown()
-                        },
+                        modifier = Modifier.onGloballyPositioned { measureLatch.countDown() },
                         selection = selection.value,
-                        onSelectionChange = {
-                            selection.value = it
-                        }
+                        onSelectionChange = { selection.value = it }
                     ) {
-                        content?.invoke() ?: BasicText(
-                            AnnotatedString(textContent),
-                            Modifier.fillMaxSize(),
-                            style = TextStyle(fontFamily = fontFamily, fontSize = fontSize),
-                            softWrap = true,
-                            overflow = TextOverflow.Clip,
-                            maxLines = Int.MAX_VALUE,
-                            inlineContent = mapOf(),
-                            onTextLayout = {}
-                        )
+                        content?.invoke()
+                            ?: BasicText(
+                                AnnotatedString(textContent),
+                                Modifier.fillMaxSize(),
+                                style = TextStyle(fontFamily = fontFamily, fontSize = fontSize),
+                                softWrap = true,
+                                overflow = TextOverflow.Clip,
+                                maxLines = Int.MAX_VALUE,
+                                inlineContent = mapOf(),
+                                onTextLayout = {}
+                            )
                     }
                 }
             }
@@ -665,53 +590,41 @@
 
     lateinit var onPointerInput: (PointerEvent, PointerEventPass) -> Unit
 
-    override val pointerInputFilter = object : PointerInputFilter() {
-        override fun onPointerEvent(
-            pointerEvent: PointerEvent,
-            pass: PointerEventPass,
-            bounds: IntSize
-        ) {
-            onPointerInput(pointerEvent, pass)
-        }
+    override val pointerInputFilter =
+        object : PointerInputFilter() {
+            override fun onPointerEvent(
+                pointerEvent: PointerEvent,
+                pass: PointerEventPass,
+                bounds: IntSize
+            ) {
+                onPointerInput(pointerEvent, pass)
+            }
 
-        override fun onCancel() {
-            // Nothing to implement
+            override fun onCancel() {
+                // Nothing to implement
+            }
         }
-    }
 }
 
 /**
- * Returns the text layout result caught by [SemanticsActions.GetTextLayoutResult]
- * under this node. Throws an AssertionError if the node has not defined GetTextLayoutResult
- * semantics action.
+ * Returns the text layout result caught by [SemanticsActions.GetTextLayoutResult] under this node.
+ * Throws an AssertionError if the node has not defined GetTextLayoutResult semantics action.
  */
 fun SemanticsNodeInteraction.fetchTextLayoutResult(): TextLayoutResult {
     val textLayoutResults = mutableListOf<TextLayoutResult>()
-    performSemanticsAction(SemanticsActions.GetTextLayoutResult) {
-        it(textLayoutResults)
-    }
+    performSemanticsAction(SemanticsActions.GetTextLayoutResult) { it(textLayoutResults) }
     return textLayoutResults.first()
 }
 
 @Composable
 fun TestParent(modifier: Modifier = Modifier, content: @Composable () -> Unit) {
     Layout(modifier = modifier, content = content) { measurables, constraints ->
-        val placeables = measurables.map { measurable ->
-            measurable.measure(constraints)
-        }
+        val placeables = measurables.map { measurable -> measurable.measure(constraints) }
 
-        val width = placeables.fold(0) { maxWidth, placeable ->
-            max(maxWidth, (placeable.width))
-        }
+        val width = placeables.fold(0) { maxWidth, placeable -> max(maxWidth, (placeable.width)) }
 
-        val height = placeables.fold(0) { minWidth, placeable ->
-            max(minWidth, (placeable.height))
-        }
+        val height = placeables.fold(0) { minWidth, placeable -> max(minWidth, (placeable.height)) }
 
-        layout(width, height) {
-            placeables.forEach { placeable ->
-                placeable.place(0, 0)
-            }
-        }
+        layout(width, height) { placeables.forEach { placeable -> placeable.place(0, 0) } }
     }
 }
diff --git a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/selection/SelectionCopyTest.kt b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/selection/SelectionCopyTest.kt
index f2db4e6..a90a07f 100644
--- a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/selection/SelectionCopyTest.kt
+++ b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/selection/SelectionCopyTest.kt
@@ -47,8 +47,7 @@
 
 @OptIn(ExperimentalTestApi::class)
 class SelectionCopyTest {
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
     private val fontFamily = TEST_FONT_FAMILY
     private val fontSize = 20.sp
@@ -121,16 +120,12 @@
     private fun TestContent(textContent: String) {
         SelectionContainer(
             selection = selection.value,
-            onSelectionChange = {
-                selection.value = it
-            },
+            onSelectionChange = { selection.value = it },
             modifier = Modifier.fillMaxSize(),
         ) {
             BasicText(
                 text = textContent,
-                modifier = Modifier
-                    .wrapContentSize()
-                    .testTag(textTag),
+                modifier = Modifier.wrapContentSize().testTag(textTag),
                 style = testTextStyle
             )
         }
diff --git a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/selection/SelectionHandlePopupPositionTest.kt b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/selection/SelectionHandlePopupPositionTest.kt
index 7fcc2a7..d11ef65 100644
--- a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/selection/SelectionHandlePopupPositionTest.kt
+++ b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/selection/SelectionHandlePopupPositionTest.kt
@@ -57,8 +57,7 @@
 @MediumTest
 @RunWith(AndroidJUnit4::class)
 class SelectionHandlePopupPositionTest {
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
     private val offset = Offset(120f, 120f)
     private val parentSizeWidth = 100.dp
@@ -85,7 +84,8 @@
                     composeViewAbsolutePos.y.toDp() + expectedPositionY
                 )
             )
-            rule.onNode(isSelectionHandle(Handle.SelectionStart))
+            rule
+                .onNode(isSelectionHandle(Handle.SelectionStart))
                 .assertHandlePositionMatches(expectedAnchorPositionX, expectedPositionY)
         }
     }
@@ -109,7 +109,8 @@
                     composeViewAbsolutePos.y.toDp() + expectedPositionY
                 )
             )
-            rule.onNode(isSelectionHandle(Handle.SelectionStart))
+            rule
+                .onNode(isSelectionHandle(Handle.SelectionStart))
                 .assertHandlePositionMatches(expectedAnchorPositionX, expectedPositionY)
         }
     }
@@ -132,7 +133,8 @@
                     composeViewAbsolutePos.y.toDp() + expectedPositionY
                 )
             )
-            rule.onNode(isSelectionHandle(Handle.SelectionEnd))
+            rule
+                .onNode(isSelectionHandle(Handle.SelectionEnd))
                 .assertHandlePositionMatches(expectedPositionX, expectedPositionY)
         }
     }
@@ -154,7 +156,8 @@
                     composeViewAbsolutePos.y.toDp() + expectedPositionY
                 )
             )
-            rule.onNode(isSelectionHandle(Handle.SelectionEnd))
+            rule
+                .onNode(isSelectionHandle(Handle.SelectionEnd))
                 .assertHandlePositionMatches(expectedPositionX, expectedPositionY)
         }
     }
@@ -184,7 +187,8 @@
                     composeViewAbsolutePos.y.toDp() + expectedPopupPositionY
                 )
             )
-            rule.onNode(isSelectionHandle(Handle.SelectionStart))
+            rule
+                .onNode(isSelectionHandle(Handle.SelectionStart))
                 .assertHandlePositionMatches(expectedSemanticsPositionX, expectedSemanticsPositionY)
         }
     }
@@ -214,7 +218,8 @@
                     composeViewAbsolutePos.y.toDp() + expectedPopupPositionY
                 )
             )
-            rule.onNode(isSelectionHandle(Handle.SelectionEnd))
+            rule
+                .onNode(isSelectionHandle(Handle.SelectionEnd))
                 .assertHandlePositionMatches(expectedSemanticsPositionX, expectedSemanticsPositionY)
         }
     }
@@ -232,10 +237,7 @@
                 val composeView = LocalView.current
                 val positionArray = IntArray(2)
                 composeView.getLocationOnScreen(positionArray)
-                composeViewAbsolutePos = IntOffset(
-                    positionArray[0],
-                    positionArray[1]
-                )
+                composeViewAbsolutePos = IntOffset(positionArray[0], positionArray[1])
 
                 // Align the parent of the popup on the top left corner, this results in the global
                 // position of the parent to be (0, 0)
@@ -248,9 +250,7 @@
                             isStartHandle = isStartHandle,
                             direction = ResolvedTextDirection.Ltr,
                             handlesCrossed = false,
-                            modifier = Modifier.onGloballyPositioned {
-                                measureLatch.countDown()
-                            },
+                            modifier = Modifier.onGloballyPositioned { measureLatch.countDown() },
                         )
                     }
                 }
@@ -259,8 +259,10 @@
         measureLatch.await(1, TimeUnit.SECONDS)
     }
 
-    private fun matchesPosition(expectedPositionX: Dp, expectedPositionY: Dp):
-        BoundedMatcher<View, View> {
+    private fun matchesPosition(
+        expectedPositionX: Dp,
+        expectedPositionY: Dp
+    ): BoundedMatcher<View, View> {
         return object : BoundedMatcher<View, View>(View::class.java) {
             // (-1, -1) no position found
             var positionFound = IntOffset(-1, -1)
diff --git a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/selection/SelectionHandleTestUtils.kt b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/selection/SelectionHandleTestUtils.kt
index 6eee255..8026834 100644
--- a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/selection/SelectionHandleTestUtils.kt
+++ b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/selection/SelectionHandleTestUtils.kt
@@ -50,27 +50,21 @@
  * the handle's _anchor_, not the position of the popup itself. E.g. for a cursor handle this is the
  * position of the bottom of the cursor, which will be in the center of the popup.
  */
-internal fun SemanticsNodeInteraction.assertHandlePositionMatches(
-    expectedX: Dp,
-    expectedY: Dp
-) {
+internal fun SemanticsNodeInteraction.assertHandlePositionMatches(expectedX: Dp, expectedY: Dp) {
     val node = fetchSemanticsNode()
     with(node.layoutInfo.density) {
         val positionFound = node.getSelectionHandleInfo().position
         val positionFoundX = positionFound.x.toDp()
         val positionFoundY = positionFound.y.toDp()
-        val message = "Expected position ($expectedX, $expectedY), " +
-            "but found ($positionFoundX, $positionFoundY)"
-        assertWithMessage(message).that(positionFoundX.value)
-            .isWithin(5f).of(expectedX.value)
-        assertWithMessage(message).that(positionFoundY.value)
-            .isWithin(5f).of(expectedY.value)
+        val message =
+            "Expected position ($expectedX, $expectedY), " +
+                "but found ($positionFoundX, $positionFoundY)"
+        assertWithMessage(message).that(positionFoundX.value).isWithin(5f).of(expectedX.value)
+        assertWithMessage(message).that(positionFoundY.value).isWithin(5f).of(expectedY.value)
     }
 }
 
-internal fun SemanticsNodeInteraction.assertHandleAnchorMatches(
-    anchor: SelectionHandleAnchor
-) {
+internal fun SemanticsNodeInteraction.assertHandleAnchorMatches(anchor: SelectionHandleAnchor) {
     val actualAnchor = fetchSemanticsNode().getSelectionHandleInfo().anchor
     val message = "Expected anchor ($anchor), but found ($actualAnchor)"
     assertWithMessage(message).that(actualAnchor).isEqualTo(anchor)
diff --git a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/selection/SelectionHandlesTest.kt b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/selection/SelectionHandlesTest.kt
index 2b2c0ab..e2335bc 100644
--- a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/selection/SelectionHandlesTest.kt
+++ b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/selection/SelectionHandlesTest.kt
@@ -54,8 +54,7 @@
 @MediumTest
 @RunWith(AndroidJUnit4::class)
 class SelectionHandlesTest {
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
     private val handleColor = Color.Black
     private val backgroundColor = Color.White
@@ -63,9 +62,9 @@
     private val contentTag = "contentTag"
 
     /**
-     * How many pixels into the handle to check the color of.
-     * This should be far enough in to avoid anti-aliasing blending the edge colors together,
-     * but not so far in that it reaches the center circle of the handle
+     * How many pixels into the handle to check the color of. This should be far enough in to avoid
+     * anti-aliasing blending the edge colors together, but not so far in that it reaches the center
+     * circle of the handle
      */
     private val inwardBias = 3
 
@@ -136,9 +135,9 @@
     }
 
     /**
-     * When the offset changes to and from [Offset.Unspecified],
-     * we want to ensure that the semantics and visibility change as expected. If the
-     * semantics here aren't correct, many other tests will likely fail as well.
+     * When the offset changes to and from [Offset.Unspecified], we want to ensure that the
+     * semantics and visibility change as expected. If the semantics here aren't correct, many other
+     * tests will likely fail as well.
      *
      * If [Offset.Unspecified]: no SelectionHandleInfo semantics, not visible.
      *
@@ -152,9 +151,7 @@
         val tag = "testTag"
         var specifiedOffset = Offset.Zero
         var offsetState by mutableStateOf(specifiedOffset)
-        setContent(
-            Modifier.onGloballyPositioned { specifiedOffset = it.boundsInRoot().center }
-        ) {
+        setContent(Modifier.onGloballyPositioned { specifiedOffset = it.boundsInRoot().center }) {
             SelectionHandle(
                 modifier = Modifier.testTag(tag),
                 offsetProvider = { offsetState },
@@ -200,43 +197,54 @@
     @SmallTest
     fun isHandleLtrDirection_ltr_handles_not_cross_return_true() {
         assertThat(
-            isHandleLtrDirection(direction = ResolvedTextDirection.Ltr, areHandlesCrossed = false)
-        ).isTrue()
+                isHandleLtrDirection(
+                    direction = ResolvedTextDirection.Ltr,
+                    areHandlesCrossed = false
+                )
+            )
+            .isTrue()
     }
 
     @Test
     @SmallTest
     fun isHandleLtrDirection_ltr_handles_cross_return_false() {
         assertThat(
-            isHandleLtrDirection(direction = ResolvedTextDirection.Ltr, areHandlesCrossed = true)
-        ).isFalse()
+                isHandleLtrDirection(
+                    direction = ResolvedTextDirection.Ltr,
+                    areHandlesCrossed = true
+                )
+            )
+            .isFalse()
     }
 
     @Test
     @SmallTest
     fun isHandleLtrDirection_rtl_handles_not_cross_return_false() {
         assertThat(
-            isHandleLtrDirection(direction = ResolvedTextDirection.Rtl, areHandlesCrossed = false)
-        ).isFalse()
+                isHandleLtrDirection(
+                    direction = ResolvedTextDirection.Rtl,
+                    areHandlesCrossed = false
+                )
+            )
+            .isFalse()
     }
 
     @Test
     @SmallTest
     fun isHandleLtrDirection_rtl_handles_cross_return_true() {
         assertThat(
-            isHandleLtrDirection(direction = ResolvedTextDirection.Rtl, areHandlesCrossed = true)
-        ).isTrue()
+                isHandleLtrDirection(
+                    direction = ResolvedTextDirection.Rtl,
+                    areHandlesCrossed = true
+                )
+            )
+            .isTrue()
     }
 
-    private fun setContent(
-        modifier: Modifier = Modifier,
-        content: @Composable () -> Unit
-    ) {
+    private fun setContent(modifier: Modifier = Modifier, content: @Composable () -> Unit) {
         rule.setContent {
             Box(
-                modifier = modifier
-                    .fillMaxSize()
-                    .background(backgroundColor),
+                modifier = modifier.fillMaxSize().background(backgroundColor),
                 contentAlignment = Alignment.Center,
             ) {
                 val colors = TextSelectionColors(handleColor, backgroundColor)
diff --git a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/selection/TextFieldMagnifierTest.kt b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/selection/TextFieldMagnifierTest.kt
index 41fda96..1235e7d 100644
--- a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/selection/TextFieldMagnifierTest.kt
+++ b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/selection/TextFieldMagnifierTest.kt
@@ -79,18 +79,12 @@
 
     @Test
     fun magnifier_staysAtLineEnd_whenCursorDraggedPastStart() {
-        checkMagnifierConstrainedToLineHorizontalBounds(
-            Handle.Cursor,
-            checkStart = true
-        )
+        checkMagnifierConstrainedToLineHorizontalBounds(Handle.Cursor, checkStart = true)
     }
 
     @Test
     fun magnifier_staysAtLineEnd_whenCursorDraggedPastEnd() {
-        checkMagnifierConstrainedToLineHorizontalBounds(
-            Handle.Cursor,
-            checkStart = false
-        )
+        checkMagnifierConstrainedToLineHorizontalBounds(Handle.Cursor, checkStart = false)
     }
 
     @Test
@@ -133,27 +127,27 @@
             // The value won't ever change so we don't need to worry about ever updating the state.
             selectionManager.state = remember {
                 LegacyTextFieldState(
-                    textDelegate = TextDelegate(
-                        text = AnnotatedString(Text),
-                        style = TextStyle.Default,
-                        density = density,
-                        fontFamilyResolver = fontFamilyResolver
-                    ),
+                    textDelegate =
+                        TextDelegate(
+                            text = AnnotatedString(Text),
+                            style = TextStyle.Default,
+                            density = density,
+                            fontFamilyResolver = fontFamilyResolver
+                        ),
                     recomposeScope = scope,
                     keyboardController = null
                 )
             }
             // Required for the drag observers to actually update the selection.
-            selectionManager.onValueChange = {
-                selectionManager.value = it
-            }
+            selectionManager.onValueChange = { selectionManager.value = it }
 
             DisposableEffect(Unit) {
-                val (_, _, result) = TextFieldDelegate.layout(
-                    selectionManager.state!!.textDelegate,
-                    constraints = Constraints(),
-                    layoutDirection = LayoutDirection.Ltr
-                )
+                val (_, _, result) =
+                    TextFieldDelegate.layout(
+                        selectionManager.state!!.textDelegate,
+                        constraints = Constraints(),
+                        layoutDirection = LayoutDirection.Ltr
+                    )
                 selectionManager.state!!.layoutResult = TextLayoutResultProxy(result)
                 onDispose {}
             }
diff --git a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/selection/TextFieldVisualTransformationMagnifierTest.kt b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/selection/TextFieldVisualTransformationMagnifierTest.kt
index 0f0ce3b..d856677 100644
--- a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/selection/TextFieldVisualTransformationMagnifierTest.kt
+++ b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/selection/TextFieldVisualTransformationMagnifierTest.kt
@@ -57,16 +57,12 @@
     val config: VisualTransformationMagnifierTestConfig
 ) : FocusedWindowTest {
 
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
     private val tag = "tag"
 
     @Composable
-    fun TestContent(
-        text: String,
-        modifier: Modifier
-    ) {
+    fun TestContent(text: String, modifier: Modifier) {
         BasicTextField(
             text,
             onValueChange = {},
@@ -83,10 +79,7 @@
         val char = if (isLtr) "a" else RtlChar
         val word = char.repeat(4)
         rule.setTextFieldTestContent {
-            TestContent(
-                text = "$word ".repeat(10).trim(),
-                modifier = Modifier.testTag(tag)
-            )
+            TestContent(text = "$word ".repeat(10).trim(), modifier = Modifier.testTag(tag))
         }
 
         showHandle(handle)
@@ -94,11 +87,10 @@
         assertNoMagnifierExists(rule)
 
         // Touch the handle to show the magnifier.
-        rule.onNode(isSelectionHandle(handle))
-            .performTouchInput {
-                down(center)
-                movePastSlopBy(Offset(1f, 0f))
-            }
+        rule.onNode(isSelectionHandle(handle)).performTouchInput {
+            down(center)
+            movePastSlopBy(Offset(1f, 0f))
+        }
 
         assertMagnifierExists(rule)
     }
@@ -116,73 +108,74 @@
         rule.setTextFieldTestContent {
             TestContent(
                 text = "$word ".repeat(10).trim(),
-                modifier = Modifier
-                    // Center the text to give the magnifier lots of room to move.
-                    .fillMaxSize()
-                    .wrapContentSize()
-                    .testTag(tag)
+                modifier =
+                    Modifier
+                        // Center the text to give the magnifier lots of room to move.
+                        .fillMaxSize()
+                        .wrapContentSize()
+                        .testTag(tag)
             )
         }
 
         showHandle(handle)
 
         // Touch the handle to show the magnifier.
-        rule.onNode(isSelectionHandle(handle))
-            .performTouchInput { down(center) }
+        rule.onNode(isSelectionHandle(handle)).performTouchInput { down(center) }
         val magnifierInitialPosition = getMagnifierCenterOffset(rule, requireSpecified = true)
 
         // Drag the handle horizontally - the magnifier should follow.
-        rule.onNode(isSelectionHandle(handle))
-            .performTouchInput { movePastSlopBy(dragDistance) }
+        rule.onNode(isSelectionHandle(handle)).performTouchInput { movePastSlopBy(dragDistance) }
 
         assertThat(getMagnifierCenterOffset(rule))
             .isEqualTo(magnifierInitialPosition + dragDistance)
     }
 
     // Below utility functions were taken from AbstractSelectionMagnifierTests.
-    private fun isSelectionHandle(handle: Handle) = SemanticsMatcher("is $handle handle") { node ->
-        node.config.getOrNull(SelectionHandleInfoKey)?.handle == handle
-    }
-
-    private fun showHandle(handle: Handle) = with(rule.onNodeWithTag(tag)) {
-        if (handle == Handle.Cursor) {
-            performClick()
-        } else {
-            // TODO(b/209698586) Select programmatically once that's fixed.
-            performTouchInput { longClick() }
+    private fun isSelectionHandle(handle: Handle) =
+        SemanticsMatcher("is $handle handle") { node ->
+            node.config.getOrNull(SelectionHandleInfoKey)?.handle == handle
         }
-    }
+
+    private fun showHandle(handle: Handle) =
+        with(rule.onNodeWithTag(tag)) {
+            if (handle == Handle.Cursor) {
+                performClick()
+            } else {
+                // TODO(b/209698586) Select programmatically once that's fixed.
+                performTouchInput { longClick() }
+            }
+        }
 
     /**
-     * Moves the first pointer by [delta] past the touch slop threshold on each axis.
-     * If [delta] is 0 on either axis it will stay 0.
+     * Moves the first pointer by [delta] past the touch slop threshold on each axis. If [delta] is
+     * 0 on either axis it will stay 0.
      */
     // TODO(b/210545925) This is here because we can't disable the touch slop in a popup. When
     //  that's fixed we can just disable slop and delete this function.
     private fun TouchInjectionScope.movePastSlopBy(delta: Offset) {
-        val slop = Offset(
-            x = viewConfiguration.touchSlop * delta.x.sign,
-            y = viewConfiguration.touchSlop * delta.y.sign
-        )
+        val slop =
+            Offset(
+                x = viewConfiguration.touchSlop * delta.x.sign,
+                y = viewConfiguration.touchSlop * delta.y.sign
+            )
         moveBy(delta + slop)
     }
 
     companion object {
         @JvmStatic
         @Parameterized.Parameters(name = "{0}")
-        fun params() = mutableListOf<VisualTransformationMagnifierTestConfig>().apply {
-            val visualTransformations = listOf(
-                ReducedVisualTransformation(),
-                IncreasedVisualTransformation()
-            )
-            for (handle in Handle.values()) {
-                for (vt in visualTransformations) {
-                    for (ld in LayoutDirection.values()) {
-                        add(VisualTransformationMagnifierTestConfig(vt, ld, handle))
+        fun params() =
+            mutableListOf<VisualTransformationMagnifierTestConfig>().apply {
+                val visualTransformations =
+                    listOf(ReducedVisualTransformation(), IncreasedVisualTransformation())
+                for (handle in Handle.values()) {
+                    for (vt in visualTransformations) {
+                        for (ld in LayoutDirection.values()) {
+                            add(VisualTransformationMagnifierTestConfig(vt, ld, handle))
+                        }
                     }
                 }
             }
-        }
     }
 }
 
@@ -198,9 +191,7 @@
     }
 }
 
-/**
- * Adds a `-` between every single character in the original text
- */
+/** Adds a `-` between every single character in the original text */
 internal class IncreasedVisualTransformation(private val char: Char = 'a') : VisualTransformation {
     override fun filter(text: AnnotatedString): TransformedText {
         return TransformedText(
@@ -219,10 +210,7 @@
 /**
  * Removes every odd indexed character.
  *
- * `abcde` becomes `ace`
- * `abcdef` becomes `ace`
- * `` becomes ``
- * `a` becomes `a`
+ * `abcde` becomes `ace` `abcdef` becomes `ace` `` becomes `` `a` becomes `a`
  */
 internal class ReducedVisualTransformation : VisualTransformation {
     override fun filter(text: AnnotatedString): TransformedText {
@@ -234,8 +222,8 @@
                 // on an odd length string, the last transformed position will
                 // map back to one past the length of the original, so constrain
                 // that specific index
-                override fun transformedToOriginal(offset: Int) = (offset * 2)
-                    .let { if (it == text.length + 1) it - 1 else it }
+                override fun transformedToOriginal(offset: Int) =
+                    (offset * 2).let { if (it == text.length + 1) it - 1 else it }
             }
         )
     }
diff --git a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/selection/TextSelectionColorsScreenshotTest.kt b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/selection/TextSelectionColorsScreenshotTest.kt
index 31afacb..4981d6f 100644
--- a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/selection/TextSelectionColorsScreenshotTest.kt
+++ b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/selection/TextSelectionColorsScreenshotTest.kt
@@ -50,34 +50,28 @@
 /**
  * Screenshot test for [TextSelectionColors] used by the selection handle / background.
  *
- * Note: because we cannot screenshot popups, we cannot see the selection handles in the popup,
- * so instead we just draw them manually so we can at least compare the shape and color.
+ * Note: because we cannot screenshot popups, we cannot see the selection handles in the popup, so
+ * instead we just draw them manually so we can at least compare the shape and color.
  */
 @LargeTest
 @RunWith(AndroidJUnit4::class)
 @SdkSuppress(minSdkVersion = Build.VERSION_CODES.O)
 class TextSelectionColorsScreenshotTest {
 
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
-    @get:Rule
-    val screenshotRule = AndroidXScreenshotTestRule(GOLDEN_UI)
+    @get:Rule val screenshotRule = AndroidXScreenshotTestRule(GOLDEN_UI)
 
     @Test
     fun text_defaultSelectionColors() {
-        rule.setContent {
-            TextTestContent(textSelectionColors = LocalTextSelectionColors.current)
-        }
+        rule.setContent { TextTestContent(textSelectionColors = LocalTextSelectionColors.current) }
 
-        rule.onNodeWithText(Text)
-            .performTouchInput {
-                longClick(center)
-            }
+        rule.onNodeWithText(Text).performTouchInput { longClick(center) }
 
         rule.waitForIdle()
 
-        rule.onNodeWithTag(Tag)
+        rule
+            .onNodeWithTag(Tag)
             .captureToImage()
             .assertAgainstGolden(screenshotRule, "text_defaultSelectionColors")
     }
@@ -86,21 +80,20 @@
     fun text_customSelectionColors() {
         rule.setContent {
             TextTestContent(
-                textSelectionColors = TextSelectionColors(
-                    handleColor = Color(0xFFFFB7B2),
-                    backgroundColor = Color(0xFFB5EAD7).copy(alpha = 0.4f),
-                )
+                textSelectionColors =
+                    TextSelectionColors(
+                        handleColor = Color(0xFFFFB7B2),
+                        backgroundColor = Color(0xFFB5EAD7).copy(alpha = 0.4f),
+                    )
             )
         }
 
-        rule.onNodeWithText(Text)
-            .performTouchInput {
-                longClick(center)
-            }
+        rule.onNodeWithText(Text).performTouchInput { longClick(center) }
 
         rule.waitForIdle()
 
-        rule.onNodeWithTag(Tag)
+        rule
+            .onNodeWithTag(Tag)
             .captureToImage()
             .assertAgainstGolden(screenshotRule, "text_customSelectionColors")
     }
@@ -112,15 +105,15 @@
         }
 
         // Click once to focus text field
-        rule.onNodeWithText(Text)
-            .performTouchInput {
-                click()
-                longClick()
-            }
+        rule.onNodeWithText(Text).performTouchInput {
+            click()
+            longClick()
+        }
 
         rule.waitForIdle()
 
-        rule.onNodeWithTag(Tag)
+        rule
+            .onNodeWithTag(Tag)
             .captureToImage()
             .assertAgainstGolden(screenshotRule, "textField_defaultSelectionColors")
     }
@@ -129,23 +122,24 @@
     fun textField_customSelectionColors() {
         rule.setContent {
             TextFieldTestContent(
-                textSelectionColors = TextSelectionColors(
-                    handleColor = Color(0xFFFFB7B2),
-                    backgroundColor = Color(0xFFB5EAD7).copy(alpha = 0.4f),
-                )
+                textSelectionColors =
+                    TextSelectionColors(
+                        handleColor = Color(0xFFFFB7B2),
+                        backgroundColor = Color(0xFFB5EAD7).copy(alpha = 0.4f),
+                    )
             )
         }
 
         // Click once to focus text field
-        rule.onNodeWithText(Text)
-            .performTouchInput {
-                click()
-                longClick()
-            }
+        rule.onNodeWithText(Text).performTouchInput {
+            click()
+            longClick()
+        }
 
         rule.waitForIdle()
 
-        rule.onNodeWithTag(Tag)
+        rule
+            .onNodeWithTag(Tag)
             .captureToImage()
             .assertAgainstGolden(screenshotRule, "textField_customSelectionColors")
     }
@@ -162,9 +156,7 @@
                 isLeft = true,
             )
 
-            SelectionContainer {
-                BasicText(Text)
-            }
+            SelectionContainer { BasicText(Text) }
 
             SelectionHandleIcon(
                 modifier = Modifier,
@@ -178,16 +170,15 @@
 @Composable
 private fun TextFieldTestContent(textSelectionColors: TextSelectionColors) {
     CompositionLocalProvider(LocalTextSelectionColors provides textSelectionColors) {
-        Box(Modifier.testTag(Tag)) {
-            BasicTextField(value = TextFieldText, onValueChange = {})
-        }
+        Box(Modifier.testTag(Tag)) { BasicTextField(value = TextFieldText, onValueChange = {}) }
     }
 }
 
 private const val Text = "Selected text"
-private val TextFieldText = TextFieldValue(
-    text = "Selected text",
-    selection = TextRange(0, 8),
-    composition = TextRange(0, 8)
-)
+private val TextFieldText =
+    TextFieldValue(
+        text = "Selected text",
+        selection = TextRange(0, 8),
+        composition = TextRange(0, 8)
+    )
 private const val Tag = "TestTag"
diff --git a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/selection/gestures/AbstractSelectionGesturesTest.kt b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/selection/gestures/AbstractSelectionGesturesTest.kt
index f578207..1aacbe6 100644
--- a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/selection/gestures/AbstractSelectionGesturesTest.kt
+++ b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/selection/gestures/AbstractSelectionGesturesTest.kt
@@ -63,8 +63,7 @@
 @OptIn(ExperimentalTestApi::class)
 internal abstract class AbstractSelectionGesturesTest : FocusedWindowTest {
 
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
     protected abstract val pointerAreaTag: String
 
@@ -80,8 +79,7 @@
 
     protected lateinit var textToolbar: TextToolbar
 
-    @Composable
-    abstract fun Content()
+    @Composable abstract fun Content()
 
     @Before
     fun setup() {
@@ -89,18 +87,14 @@
             textToolbar = LocalTextToolbar.current
             CompositionLocalProvider(
                 LocalDensity provides density,
-                LocalViewConfiguration provides TestViewConfiguration(
-                    minimumTouchTargetSize = DpSize.Zero,
-                    touchSlop = 0.1f, // less than 1, not too close to 0
-                ),
+                LocalViewConfiguration provides
+                    TestViewConfiguration(
+                        minimumTouchTargetSize = DpSize.Zero,
+                        touchSlop = 0.1f, // less than 1, not too close to 0
+                    ),
                 LocalHapticFeedback provides hapticFeedback,
             ) {
-                Box(
-                    modifier = Modifier
-                        .padding(32.dp)
-                        .fillMaxSize()
-                        .wrapContentSize()
-                ) {
+                Box(modifier = Modifier.padding(32.dp).fillMaxSize().wrapContentSize()) {
                     Content()
                 }
             }
@@ -110,64 +104,97 @@
     private val bounds
         get() = rule.onNodeWithTag(pointerAreaTag).fetchSemanticsNode().size.toSize().toRect()
 
-    private val left get() = bounds.left + 1f
-    private val top get() = bounds.top + 1f
-    private val right get() = bounds.right - 1f
-    private val bottom get() = bounds.bottom - 1f
+    private val left
+        get() = bounds.left + 1f
 
-    private val start get() = textDirection.take(ltr = left, rtl = right)
-    private val end get() = textDirection.take(ltr = right, rtl = left)
+    private val top
+        get() = bounds.top + 1f
 
-    protected val topStart get() = Offset(start, top)
-    protected val centerStart get() = Offset(start, center.y)
-    protected val bottomStart get() = Offset(start, bottom)
+    private val right
+        get() = bounds.right - 1f
 
-    protected val center get() = bounds.center
+    private val bottom
+        get() = bounds.bottom - 1f
 
-    protected val topEnd get() = Offset(end, top)
-    protected val centerEnd get() = Offset(end, center.y)
-    protected val bottomEnd get() = Offset(end, bottom)
+    private val start
+        get() = textDirection.take(ltr = left, rtl = right)
 
-    protected enum class VerticalDirection { UP, DOWN, CENTER }
-    protected enum class HorizontalDirection { START, END, CENTER }
+    private val end
+        get() = textDirection.take(ltr = right, rtl = left)
+
+    protected val topStart
+        get() = Offset(start, top)
+
+    protected val centerStart
+        get() = Offset(start, center.y)
+
+    protected val bottomStart
+        get() = Offset(start, bottom)
+
+    protected val center
+        get() = bounds.center
+
+    protected val topEnd
+        get() = Offset(end, top)
+
+    protected val centerEnd
+        get() = Offset(end, center.y)
+
+    protected val bottomEnd
+        get() = Offset(end, bottom)
+
+    protected enum class VerticalDirection {
+        UP,
+        DOWN,
+        CENTER
+    }
+
+    protected enum class HorizontalDirection {
+        START,
+        END,
+        CENTER
+    }
 
     // nudge 2f since we start 1f inwards from the edges and want to ensure we move over them if
     // we nudge outwards again
     protected fun Offset.nudge(
         xDirection: HorizontalDirection = HorizontalDirection.CENTER,
         yDirection: VerticalDirection = VerticalDirection.CENTER,
-    ): Offset = Offset(
-        x = x.adjustHorizontal(xDirection, 2f),
-        y = y.adjustVertical(yDirection, 2f),
-    )
+    ): Offset =
+        Offset(
+            x = x.adjustHorizontal(xDirection, 2f),
+            y = y.adjustVertical(yDirection, 2f),
+        )
 
     private fun Float.adjustVertical(direction: VerticalDirection, diff: Float): Float =
-        this + diff * when (direction) {
-            VerticalDirection.UP -> -1f
-            VerticalDirection.CENTER -> 0f
-            VerticalDirection.DOWN -> 1f
-        }
+        this +
+            diff *
+                when (direction) {
+                    VerticalDirection.UP -> -1f
+                    VerticalDirection.CENTER -> 0f
+                    VerticalDirection.DOWN -> 1f
+                }
 
     private fun Float.adjustHorizontal(direction: HorizontalDirection, diff: Float): Float =
-        this + diff * when (direction) {
-            HorizontalDirection.START -> textDirection.take(ltr = -1f, rtl = 1f)
-            HorizontalDirection.CENTER -> 0f
-            HorizontalDirection.END -> textDirection.take(ltr = 1f, rtl = -1f)
-        }
+        this +
+            diff *
+                when (direction) {
+                    HorizontalDirection.START -> textDirection.take(ltr = -1f, rtl = 1f)
+                    HorizontalDirection.CENTER -> 0f
+                    HorizontalDirection.END -> textDirection.take(ltr = 1f, rtl = -1f)
+                }
 
-    private fun <T> ResolvedTextDirection.take(ltr: T, rtl: T): T = when (this) {
-        ResolvedTextDirection.Ltr -> ltr
-        ResolvedTextDirection.Rtl -> rtl
-        else -> throw AssertionError("Unrecognized text direction $textDirection")
-    }
+    private fun <T> ResolvedTextDirection.take(ltr: T, rtl: T): T =
+        when (this) {
+            ResolvedTextDirection.Ltr -> ltr
+            ResolvedTextDirection.Rtl -> rtl
+            else -> throw AssertionError("Unrecognized text direction $textDirection")
+        }
 
     // TODO(b/281584353) When touch mode can be changed globally,
     //  this should change to a single tap outside of the bounds.
     internal fun TouchInjectionScope.enterTouchMode() {
-        swipe(
-            start = bounds.center,
-            end = bounds.bottomCenter + Offset(0f, 10f)
-        )
+        swipe(start = bounds.center, end = bounds.bottomCenter + Offset(0f, 10f))
     }
 
     // TODO(b/281584353) When touch mode can be changed globally,
@@ -187,10 +214,7 @@
         rule.onNodeWithTag(pointerAreaTag).performMouseInput(block)
     }
 
-    protected fun withHandlePressed(
-        handle: Handle,
-        block: HandlePressedScope.() -> Unit
-    ) {
+    protected fun withHandlePressed(handle: Handle, block: HandlePressedScope.() -> Unit) {
         rule.withHandlePressed(handle, block)
         rule.waitForIdle()
     }
@@ -203,10 +227,7 @@
         rule.waitForIdle()
     }
 
-    protected fun touchDragBy(
-        delta: Offset,
-        durationMillis: Long = 100L
-    ) {
+    protected fun touchDragBy(delta: Offset, durationMillis: Long = 100L) {
         rule.onNodeWithTag(pointerAreaTag).touchDragNodeBy(delta, durationMillis)
         rule.waitForIdle()
     }
@@ -219,10 +240,7 @@
         rule.waitForIdle()
     }
 
-    protected fun mouseDragBy(
-        delta: Offset,
-        durationMillis: Long = 100L
-    ) {
+    protected fun mouseDragBy(delta: Offset, durationMillis: Long = 100L) {
         rule.onNodeWithTag(pointerAreaTag).mouseDragNodeBy(delta, durationMillis)
         rule.waitForIdle()
     }
diff --git a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/selection/gestures/ClippedTextSelectionGesturesTest.kt b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/selection/gestures/ClippedTextSelectionGesturesTest.kt
index 4bf9b6c..c86ec86 100644
--- a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/selection/gestures/ClippedTextSelectionGesturesTest.kt
+++ b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/selection/gestures/ClippedTextSelectionGesturesTest.kt
@@ -69,26 +69,29 @@
 
     @Before
     fun setupAsserter() {
-        asserter = object : TextSelectionAsserter(
-            textContent = text,
-            rule = rule,
-            textToolbar = textToolbar,
-            hapticFeedback = hapticFeedback,
-            getActual = { selection.value },
-        ) {
-            override fun subAssert() {
-                Truth.assertAbout(SelectionSubject.withContent(textContent))
-                    .that(getActual())
-                    .hasSelection(
-                        expected = selection,
-                        startTextDirection = startLayoutDirection,
-                        endTextDirection = endLayoutDirection,
-                    )
-            }
-        }.apply {
-            startSelectionHandleShown = false
-            endSelectionHandleShown = false
-        }
+        asserter =
+            object :
+                    TextSelectionAsserter(
+                        textContent = text,
+                        rule = rule,
+                        textToolbar = textToolbar,
+                        hapticFeedback = hapticFeedback,
+                        getActual = { selection.value },
+                    ) {
+                    override fun subAssert() {
+                        Truth.assertAbout(SelectionSubject.withContent(textContent))
+                            .that(getActual())
+                            .hasSelection(
+                                expected = selection,
+                                startTextDirection = startLayoutDirection,
+                                endTextDirection = endLayoutDirection,
+                            )
+                    }
+                }
+                .apply {
+                    startSelectionHandleShown = false
+                    endSelectionHandleShown = false
+                }
     }
 
     @Composable
@@ -104,9 +107,7 @@
                     style = style,
                     maxLines = maxLinesState.value,
                     overflow = overflowState.value,
-                    modifier = Modifier
-                        .width(100.dp)
-                        .testTag(textTag)
+                    modifier = Modifier.width(100.dp).testTag(textTag)
                 )
             }
         }
@@ -313,10 +314,12 @@
         }
 
         // last position where the handle is shown
-        val initialPosition = rule.onNode(isSelectionHandle(Handle.SelectionEnd))
-            .fetchSemanticsNode()
-            .getSelectionHandleInfo()
-            .position
+        val initialPosition =
+            rule
+                .onNode(isSelectionHandle(Handle.SelectionEnd))
+                .fetchSemanticsNode()
+                .getSelectionHandleInfo()
+                .position
 
         // drag straight down, out of text bounds
         touchDragTo(offsetTwoPosition.copy(y = bottomEnd.y))
@@ -327,9 +330,7 @@
         }
 
         performTouchGesture { up() }
-        asserter.applyAndAssert {
-            textToolbarShown = true
-        }
+        asserter.applyAndAssert { textToolbarShown = true }
 
         withHandlePressed(Handle.SelectionEnd) {
             setInitialGesturePosition(initialPosition)
@@ -343,27 +344,25 @@
     }
 
     private fun HandlePressedScope.moveHandleToCharacter(characterOffset: Int) {
-        val destinationPosition = characterBox(characterOffset).run {
-            when (fetchHandleInfo().handle) {
-                Handle.SelectionStart -> bottomLeft.nudge(HorizontalDirection.END)
-                Handle.SelectionEnd -> bottomLeft.nudge(HorizontalDirection.START)
-                Handle.Cursor -> fail("Unexpected handle ${Handle.Cursor}")
+        val destinationPosition =
+            characterBox(characterOffset).run {
+                when (fetchHandleInfo().handle) {
+                    Handle.SelectionStart -> bottomLeft.nudge(HorizontalDirection.END)
+                    Handle.SelectionEnd -> bottomLeft.nudge(HorizontalDirection.START)
+                    Handle.Cursor -> fail("Unexpected handle ${Handle.Cursor}")
+                }
             }
-        }
         moveHandleTo(destinationPosition)
     }
 
     private fun characterPosition(offset: Int): Offset =
-        characterBox(offset)
-            .centerLeft
-            .nudge(HorizontalDirection.END)
+        characterBox(offset).centerLeft.nudge(HorizontalDirection.END)
 
     private fun characterBox(offset: Int): Rect {
         val pointerAreaPosition =
             rule.onNodeWithTag(pointerAreaTag).fetchSemanticsNode().positionInRoot
         val textPosition = rule.onNodeWithTag(textTag).fetchSemanticsNode().positionInRoot
         val textLayoutResult = rule.onNodeWithTag(textTag).fetchTextLayoutResult()
-        return textLayoutResult.getBoundingBox(offset)
-            .translate(textPosition - pointerAreaPosition)
+        return textLayoutResult.getBoundingBox(offset).translate(textPosition - pointerAreaPosition)
     }
 }
diff --git a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/selection/gestures/LazyColumnMultiTextRegressionTest.kt b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/selection/gestures/LazyColumnMultiTextRegressionTest.kt
index f4e77b8..2301330 100644
--- a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/selection/gestures/LazyColumnMultiTextRegressionTest.kt
+++ b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/selection/gestures/LazyColumnMultiTextRegressionTest.kt
@@ -71,8 +71,7 @@
 import org.junit.Test
 
 class LazyColumnMultiTextRegressionTest {
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
     private val stateRestorationTester = StateRestorationTester(rule)
     private val textCount = 20
 
@@ -198,12 +197,20 @@
         private val textToolbar: TextToolbarWrapper,
     ) {
         val initialText = "Initial text"
-        val selection: Selection? get() = Snapshot.withoutReadObservation { selectionState.value }
-        val textToolbarRect: Rect? get() = textToolbar.mostRecentRect
-        val textToolbarShown: Boolean get() = textToolbar.shown
+        val selection: Selection?
+            get() = Snapshot.withoutReadObservation { selectionState.value }
 
-        val startHandlePosition get() = handlePosition(Handle.SelectionStart)
-        val endHandlePosition get() = handlePosition(Handle.SelectionEnd)
+        val textToolbarRect: Rect?
+            get() = textToolbar.mostRecentRect
+
+        val textToolbarShown: Boolean
+            get() = textToolbar.shown
+
+        val startHandlePosition
+            get() = handlePosition(Handle.SelectionStart)
+
+        val endHandlePosition
+            get() = handlePosition(Handle.SelectionEnd)
 
         fun createSelection(startLine: Int, endLine: Int) {
             performTouchInput {
@@ -214,9 +221,7 @@
         }
 
         fun createSelection(line: Int) {
-            performTouchInput {
-                longClick(positionForLineInPointerArea(line))
-            }
+            performTouchInput { longClick(positionForLineInPointerArea(line)) }
         }
 
         private fun performTouchInput(block: TouchInjectionScope.() -> Unit) {
@@ -225,8 +230,8 @@
         }
 
         fun boundingBoxForLineInPointerArea(lineNumber: Int): Rect {
-            val containerPosition = rule.onNodeWithTag(pointerAreaTag).fetchSemanticsNode()
-                .positionInRoot
+            val containerPosition =
+                rule.onNodeWithTag(pointerAreaTag).fetchSemanticsNode().positionInRoot
             return boundingBoxForLineInRoot(lineNumber).translate(-containerPosition)
         }
 
@@ -237,18 +242,19 @@
             val lineStart = textLayoutResult.getLineStart(0)
             val lineEnd = textLayoutResult.getLineEnd(0)
 
-            val rect = if (lineStart == lineEnd - 1) {
-                textLayoutResult.getBoundingBox(lineStart)
-            } else {
-                val startRect = textLayoutResult.getBoundingBox(lineStart)
-                val endRect = textLayoutResult.getBoundingBox(lineEnd - 1)
-                Rect(
-                    left = minOf(startRect.left, endRect.left),
-                    top = minOf(startRect.top, endRect.top),
-                    right = maxOf(startRect.right, endRect.right),
-                    bottom = maxOf(startRect.bottom, endRect.bottom),
-                )
-            }
+            val rect =
+                if (lineStart == lineEnd - 1) {
+                    textLayoutResult.getBoundingBox(lineStart)
+                } else {
+                    val startRect = textLayoutResult.getBoundingBox(lineStart)
+                    val endRect = textLayoutResult.getBoundingBox(lineEnd - 1)
+                    Rect(
+                        left = minOf(startRect.left, endRect.left),
+                        top = minOf(startRect.top, endRect.top),
+                        right = maxOf(startRect.right, endRect.right),
+                        bottom = maxOf(startRect.bottom, endRect.bottom),
+                    )
+                }
 
             return rect.translate(textPosition)
         }
@@ -285,15 +291,11 @@
         fun assertSelection(): Subject = assertThat(selection)
 
         fun scrollDown() {
-            performTouchInput {
-                swipe(bottomCenter - Offset(0f, 1f), topCenter + Offset(0f, 1f))
-            }
+            performTouchInput { swipe(bottomCenter - Offset(0f, 1f), topCenter + Offset(0f, 1f)) }
         }
 
         fun scrollUp() {
-            performTouchInput {
-                swipe(topCenter + Offset(0f, 1f), bottomCenter - Offset(0f, 1f))
-            }
+            performTouchInput { swipe(topCenter + Offset(0f, 1f), bottomCenter - Offset(0f, 1f)) }
         }
 
         fun scrollLines(fromLine: Int, toLine: Int) {
@@ -322,20 +324,16 @@
             val (x, y) = current!!
             val (prevX, prevY) = previous!!
 
-            assertWithMessage("x should not change")
-                .that(x)
-                .isWithin(0.1f)
-                .of(prevX)
+            assertWithMessage("x should not change").that(x).isWithin(0.1f).of(prevX)
 
-            assertWithMessage("y should have moved ${if (up) "up" else "down"}")
-                .that(y)
-                .run {
-                    if (up) isLessThan(prevY) else isGreaterThan(prevY)
-                }
+            assertWithMessage("y should have moved ${if (up) "up" else "down"}").that(y).run {
+                if (up) isLessThan(prevY) else isGreaterThan(prevY)
+            }
         }
 
         private fun handlePosition(handle: Handle): Offset? =
-            rule.onAllNodes(isSelectionHandle(handle))
+            rule
+                .onAllNodes(isSelectionHandle(handle))
                 .fetchSemanticsNodes()
                 .singleOrNull()
                 ?.config
@@ -343,9 +341,7 @@
                 ?.position
 
         fun assertTextToolbarTopAt(y: Float) {
-            assertThat(textToolbarRect?.top)
-                .isWithin(0.1f)
-                .of(y)
+            assertThat(textToolbarRect?.top).isWithin(0.1f).of(y)
         }
 
         val pointerAreaRect: Rect
@@ -355,17 +351,13 @@
     private fun runTest(block: TestScope.() -> Unit) {
         val tag = "tag"
         val selection = mutableStateOf<Selection?>(null)
-        val testViewConfiguration = TestViewConfiguration(
-            minimumTouchTargetSize = DpSize.Zero
-        )
+        val testViewConfiguration = TestViewConfiguration(minimumTouchTargetSize = DpSize.Zero)
         lateinit var clipboardManager: ClipboardManager
         lateinit var textToolbar: TextToolbarWrapper
         stateRestorationTester.setContent {
             clipboardManager = LocalClipboardManager.current
             val originalTextToolbar = LocalTextToolbar.current
-            textToolbar = remember(originalTextToolbar) {
-                TextToolbarWrapper(originalTextToolbar)
-            }
+            textToolbar = remember(originalTextToolbar) { TextToolbarWrapper(originalTextToolbar) }
             CompositionLocalProvider(
                 LocalTextToolbar provides textToolbar,
                 LocalViewConfiguration provides testViewConfiguration,
@@ -379,19 +371,13 @@
                         selection = selection.value,
                         onSelectionChange = { selection.value = it },
                     ) {
-                        LazyColumn(
-                            modifier = Modifier.testTag(tag)
-                        ) {
+                        LazyColumn(modifier = Modifier.testTag(tag)) {
                             items(count = textCount) {
                                 BasicText(
                                     text = it.toString(),
-                                    style = TextStyle(
-                                        fontSize = 15.sp,
-                                        textAlign = TextAlign.Center
-                                    ),
-                                    modifier = Modifier
-                                        .fillMaxWidth()
-                                        .testTag(it.toString())
+                                    style =
+                                        TextStyle(fontSize = 15.sp, textAlign = TextAlign.Center),
+                                    modifier = Modifier.fillMaxWidth().testTag(it.toString())
                                 )
                             }
                         }
@@ -408,10 +394,12 @@
 
 private class TextToolbarWrapper(private val delegate: TextToolbar) : TextToolbar {
     private var _shown: Boolean = false
-    val shown: Boolean get() = _shown
+    val shown: Boolean
+        get() = _shown
 
     private var _mostRecentRect: Rect? = null
-    val mostRecentRect: Rect? get() = _mostRecentRect
+    val mostRecentRect: Rect?
+        get() = _mostRecentRect
 
     override fun showMenu(
         rect: Rect,
diff --git a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/selection/gestures/MultiText2dSelectionGesturesTest.kt b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/selection/gestures/MultiText2dSelectionGesturesTest.kt
index cc3c533..79cffdd 100644
--- a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/selection/gestures/MultiText2dSelectionGesturesTest.kt
+++ b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/selection/gestures/MultiText2dSelectionGesturesTest.kt
@@ -71,13 +71,13 @@
                         repeat(sideLength) { j ->
                             BasicText(
                                 text = text,
-                                style = TextStyle(
-                                    fontFamily = fontFamily,
-                                    fontSize = fontSize,
-                                ),
-                                modifier = Modifier
-                                    .padding(24.dp)
-                                    .testTag("${i * sideLength + j + 1}"),
+                                style =
+                                    TextStyle(
+                                        fontFamily = fontFamily,
+                                        fontSize = fontSize,
+                                    ),
+                                modifier =
+                                    Modifier.padding(24.dp).testTag("${i * sideLength + j + 1}"),
                             )
                         }
                     }
@@ -178,12 +178,7 @@
 
     @Test
     fun dragTopContainer() {
-        dragTest(
-            dragPosition = topEnd,
-            selectableId = 1,
-            offset = 0,
-            crossed = true
-        )
+        dragTest(dragPosition = topEnd, selectableId = 1, offset = 0, crossed = true)
     }
 
     @Test
@@ -208,12 +203,7 @@
 
     @Test
     fun dragBottomContainer() {
-        dragTest(
-            dragPosition = bottomStart,
-            selectableId = 9,
-            offset = 19,
-            crossed = false
-        )
+        dragTest(dragPosition = bottomStart, selectableId = 9, offset = 19, crossed = false)
     }
 
     @Test
@@ -264,16 +254,9 @@
         offset: Int,
         crossed: Boolean,
     ) {
-        performTouchGesture {
-            longPress(characterPosition(5, 6))
-        }
+        performTouchGesture { longPress(characterPosition(5, 6)) }
 
-        assertSelection(
-            startOffset = 5,
-            endSelectableId = 5,
-            endOffset = 9,
-            handlesCrossed = false
-        )
+        assertSelection(startOffset = 5, endSelectableId = 5, endOffset = 9, handlesCrossed = false)
 
         touchDragTo(dragPosition)
 
@@ -284,9 +267,7 @@
             handlesCrossed = crossed
         )
 
-        performTouchGesture {
-            up()
-        }
+        performTouchGesture { up() }
 
         assertSelection(
             startOffset = if (crossed) 9 else 5,
@@ -306,7 +287,8 @@
             rule.onNodeWithTag(pointerAreaTag).fetchSemanticsNode().positionInRoot
         val nodePosition = rule.onNodeWithTag(tag).fetchSemanticsNode().positionInRoot
         val textLayoutResult = rule.onNodeWithTag(tag).fetchTextLayoutResult()
-        return textLayoutResult.getBoundingBox(offset)
+        return textLayoutResult
+            .getBoundingBox(offset)
             .translate(nodePosition - pointerAreaPosition)
             .centerLeft
             .nudge(HorizontalDirection.END)
@@ -334,16 +316,18 @@
         assertThat(selection.value)
             .isEqualTo(
                 Selection(
-                    start = Selection.AnchorInfo(
-                        direction = ResolvedTextDirection.Ltr,
-                        offset = startOffset,
-                        selectableId = 5L
-                    ),
-                    end = Selection.AnchorInfo(
-                        direction = ResolvedTextDirection.Ltr,
-                        offset = endOffset,
-                        selectableId = endSelectableId.toLong()
-                    ),
+                    start =
+                        Selection.AnchorInfo(
+                            direction = ResolvedTextDirection.Ltr,
+                            offset = startOffset,
+                            selectableId = 5L
+                        ),
+                    end =
+                        Selection.AnchorInfo(
+                            direction = ResolvedTextDirection.Ltr,
+                            offset = endOffset,
+                            selectableId = endSelectableId.toLong()
+                        ),
                     handlesCrossed = handlesCrossed,
                 )
             )
diff --git a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/selection/gestures/MultiTextMinTouchBoundsSelectionGesturesTest.kt b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/selection/gestures/MultiTextMinTouchBoundsSelectionGesturesTest.kt
index e633eb7..2afe0c4 100644
--- a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/selection/gestures/MultiTextMinTouchBoundsSelectionGesturesTest.kt
+++ b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/selection/gestures/MultiTextMinTouchBoundsSelectionGesturesTest.kt
@@ -71,22 +71,21 @@
     private val spLen = 20.sp
 
     /**
-     * When two 20x20 texts are stacked with 20 space between,
-     * we want the touch targets to overlap a little for this test,
-     * so we pick a minTouchTarget size of an additional 12 on each side.
+     * When two 20x20 texts are stacked with 20 space between, we want the touch targets to overlap
+     * a little for this test, so we pick a minTouchTarget size of an additional 12 on each side.
      *
      * With this setup, on the y-axis:
-     *   * 0..20 is the first text
-     *   * 40..60 is the second text
-     *   * -12..32 is the first minTouchTarget
-     *   * 28..72 is the second minTouchTarget
+     * * 0..20 is the first text
+     * * 40..60 is the second text
+     * * -12..32 is the first minTouchTarget
+     * * 28..72 is the second minTouchTarget
      *
      * Given the above:
-     *   * 21..27 belongs solely to the first text
-     *   * 29 overlaps both, but is closer to the first text
-     *   * 30 overlaps both, and is equidistant to both
-     *   * 31 overlaps both, but is closer to the second text
-     *   * 32..39 belongs solely to the second text
+     * * 21..27 belongs solely to the first text
+     * * 29 overlaps both, but is closer to the first text
+     * * 30 overlaps both, and is equidistant to both
+     * * 31 overlaps both, but is closer to the second text
+     * * 32..39 belongs solely to the second text
      */
     private val touchTargetDpLen = dpLen + 12.dp * 2
 
@@ -113,7 +112,7 @@
         OVERLAP_BELONGS_TO_SECOND(y = 31f, coercedY = 41f),
         NO_OVERLAP_BELONGS_TO_SECOND(y = 35f, coercedY = 41f),
         ON_SECOND(y = 50f, coercedY = 50f),
-        BELOW(y = 66f, coercedY = 59f);
+        BELOW(y = 66f, coercedY = 59f)
     }
 
     enum class ExpectedText(val selectableId: Long?, val crossed: Boolean) {
@@ -151,35 +150,36 @@
     companion object {
         @JvmStatic
         @Parameterized.Parameters(name = "horizontal={0}, vertical={1} expectedId={2}")
-        fun data(): Collection<Array<Any>> = listOf(
-            arrayOf(LEFT, ABOVE, FIRST_REVERSED),
-            arrayOf(LEFT, ON_FIRST, FIRST_REVERSED),
-            arrayOf(LEFT, NO_OVERLAP_BELONGS_TO_FIRST, FIRST),
-            arrayOf(LEFT, OVERLAP_BELONGS_TO_FIRST, FIRST),
-            arrayOf(LEFT, OVERLAP_EQUIDISTANT, EITHER),
-            arrayOf(LEFT, OVERLAP_BELONGS_TO_SECOND, SECOND_REVERSED),
-            arrayOf(LEFT, NO_OVERLAP_BELONGS_TO_SECOND, SECOND_REVERSED),
-            arrayOf(LEFT, ON_SECOND, SECOND_REVERSED),
-            arrayOf(LEFT, BELOW, SECOND),
-            arrayOf(CENTER, ABOVE, FIRST_REVERSED),
-            arrayOf(CENTER, ON_FIRST, FIRST),
-            arrayOf(CENTER, NO_OVERLAP_BELONGS_TO_FIRST, FIRST),
-            arrayOf(CENTER, OVERLAP_BELONGS_TO_FIRST, FIRST),
-            arrayOf(CENTER, OVERLAP_EQUIDISTANT, EITHER),
-            arrayOf(CENTER, OVERLAP_BELONGS_TO_SECOND, SECOND_REVERSED),
-            arrayOf(CENTER, NO_OVERLAP_BELONGS_TO_SECOND, SECOND_REVERSED),
-            arrayOf(CENTER, ON_SECOND, SECOND),
-            arrayOf(CENTER, BELOW, SECOND),
-            arrayOf(RIGHT, ABOVE, FIRST_REVERSED),
-            arrayOf(RIGHT, ON_FIRST, FIRST),
-            arrayOf(RIGHT, NO_OVERLAP_BELONGS_TO_FIRST, FIRST),
-            arrayOf(RIGHT, OVERLAP_BELONGS_TO_FIRST, FIRST),
-            arrayOf(RIGHT, OVERLAP_EQUIDISTANT, EITHER),
-            arrayOf(RIGHT, OVERLAP_BELONGS_TO_SECOND, SECOND_REVERSED),
-            arrayOf(RIGHT, NO_OVERLAP_BELONGS_TO_SECOND, SECOND_REVERSED),
-            arrayOf(RIGHT, ON_SECOND, SECOND),
-            arrayOf(RIGHT, BELOW, SECOND),
-        )
+        fun data(): Collection<Array<Any>> =
+            listOf(
+                arrayOf(LEFT, ABOVE, FIRST_REVERSED),
+                arrayOf(LEFT, ON_FIRST, FIRST_REVERSED),
+                arrayOf(LEFT, NO_OVERLAP_BELONGS_TO_FIRST, FIRST),
+                arrayOf(LEFT, OVERLAP_BELONGS_TO_FIRST, FIRST),
+                arrayOf(LEFT, OVERLAP_EQUIDISTANT, EITHER),
+                arrayOf(LEFT, OVERLAP_BELONGS_TO_SECOND, SECOND_REVERSED),
+                arrayOf(LEFT, NO_OVERLAP_BELONGS_TO_SECOND, SECOND_REVERSED),
+                arrayOf(LEFT, ON_SECOND, SECOND_REVERSED),
+                arrayOf(LEFT, BELOW, SECOND),
+                arrayOf(CENTER, ABOVE, FIRST_REVERSED),
+                arrayOf(CENTER, ON_FIRST, FIRST),
+                arrayOf(CENTER, NO_OVERLAP_BELONGS_TO_FIRST, FIRST),
+                arrayOf(CENTER, OVERLAP_BELONGS_TO_FIRST, FIRST),
+                arrayOf(CENTER, OVERLAP_EQUIDISTANT, EITHER),
+                arrayOf(CENTER, OVERLAP_BELONGS_TO_SECOND, SECOND_REVERSED),
+                arrayOf(CENTER, NO_OVERLAP_BELONGS_TO_SECOND, SECOND_REVERSED),
+                arrayOf(CENTER, ON_SECOND, SECOND),
+                arrayOf(CENTER, BELOW, SECOND),
+                arrayOf(RIGHT, ABOVE, FIRST_REVERSED),
+                arrayOf(RIGHT, ON_FIRST, FIRST),
+                arrayOf(RIGHT, NO_OVERLAP_BELONGS_TO_FIRST, FIRST),
+                arrayOf(RIGHT, OVERLAP_BELONGS_TO_FIRST, FIRST),
+                arrayOf(RIGHT, OVERLAP_EQUIDISTANT, EITHER),
+                arrayOf(RIGHT, OVERLAP_BELONGS_TO_SECOND, SECOND_REVERSED),
+                arrayOf(RIGHT, NO_OVERLAP_BELONGS_TO_SECOND, SECOND_REVERSED),
+                arrayOf(RIGHT, ON_SECOND, SECOND),
+                arrayOf(RIGHT, BELOW, SECOND),
+            )
     }
 
     @Test
@@ -189,15 +189,16 @@
 
     // Regression test for b/325307463
     @Test
-    fun dragIntoMinTouchTargetSelectionGestureTest() = runTest(expectedText.crossed) {
-        performTouchGesture {
-            longPress(Offset(horizontal.coercedX, vertical.coercedY))
-            // The crash involved a quick drag from on the text to off the text
-            // causing a race of some state not being set before the drag is executed,
-            // so we want to force the moveTo immediately after the long press finishes.
-            moveTo(Offset(horizontal.x, vertical.y), delayMillis = 0L)
+    fun dragIntoMinTouchTargetSelectionGestureTest() =
+        runTest(expectedText.crossed) {
+            performTouchGesture {
+                longPress(Offset(horizontal.coercedX, vertical.coercedY))
+                // The crash involved a quick drag from on the text to off the text
+                // causing a race of some state not being set before the drag is executed,
+                // so we want to force the moveTo immediately after the long press finishes.
+                moveTo(Offset(horizontal.x, vertical.y), delayMillis = 0L)
+            }
         }
-    }
 
     private fun runTest(crossed: Boolean = false, block: () -> Unit) {
         block()
@@ -214,11 +215,12 @@
     private fun assertSelectedSelectableIs(selectableId: Long, crossed: Boolean) {
         val startOffset = if (crossed) 1 else 0
         val endOffset = if (crossed) 0 else 1
-        val expectedSelection = Selection(
-            start = Selection.AnchorInfo(ResolvedTextDirection.Ltr, startOffset, selectableId),
-            end = Selection.AnchorInfo(ResolvedTextDirection.Ltr, endOffset, selectableId),
-            handlesCrossed = crossed,
-        )
+        val expectedSelection =
+            Selection(
+                start = Selection.AnchorInfo(ResolvedTextDirection.Ltr, startOffset, selectableId),
+                end = Selection.AnchorInfo(ResolvedTextDirection.Ltr, endOffset, selectableId),
+                handlesCrossed = crossed,
+            )
         assertThat(selection.value).isEqualTo(expectedSelection)
     }
 }
diff --git a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/selection/gestures/MultiTextSelectionGesturesBidiTest.kt b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/selection/gestures/MultiTextSelectionGesturesBidiTest.kt
index fa484b3..d783e24 100644
--- a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/selection/gestures/MultiTextSelectionGesturesBidiTest.kt
+++ b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/selection/gestures/MultiTextSelectionGesturesBidiTest.kt
@@ -48,11 +48,16 @@
     override val pointerAreaTag = "selectionContainer"
     private val ltrWord = "hello"
     private val rtlWord = RtlChar.repeat(5)
-    override val textContent = mutableStateOf("""
+    override val textContent =
+        mutableStateOf(
+            """
         $ltrWord $rtlWord $ltrWord
         $rtlWord $ltrWord $rtlWord
         $ltrWord $rtlWord $ltrWord
-    """.trimIndent().trim())
+    """
+                .trimIndent()
+                .trim()
+        )
 
     override lateinit var asserter: TextSelectionAsserter
 
@@ -61,32 +66,31 @@
 
     @Before
     fun setupAsserter() {
-        asserter = object : TextSelectionAsserter(
-            textContent = textContent.value,
-            rule = rule,
-            textToolbar = textToolbar,
-            hapticFeedback = hapticFeedback,
-            getActual = { selection.value }
-        ) {
-            override fun subAssert() {
-                Truth.assertAbout(MultiSelectionSubject.withContent(texts.value))
-                    .that(getActual())
-                    .hasSelection(
-                        expected = selection,
-                        startTextDirection = startLayoutDirection,
-                        endTextDirection = endLayoutDirection,
-                    )
+        asserter =
+            object :
+                TextSelectionAsserter(
+                    textContent = textContent.value,
+                    rule = rule,
+                    textToolbar = textToolbar,
+                    hapticFeedback = hapticFeedback,
+                    getActual = { selection.value }
+                ) {
+                override fun subAssert() {
+                    Truth.assertAbout(MultiSelectionSubject.withContent(texts.value))
+                        .that(getActual())
+                        .hasSelection(
+                            expected = selection,
+                            startTextDirection = startLayoutDirection,
+                            endTextDirection = endLayoutDirection,
+                        )
+                }
             }
-        }
     }
 
     @Composable
     override fun TextContent() {
         texts = derivedStateOf {
-            textContent.value
-                .split("\n")
-                .withIndex()
-                .map { (index, str) -> str to "testTag$index" }
+            textContent.value.split("\n").withIndex().map { (index, str) -> str to "testTag$index" }
         }
 
         textContentIndices = derivedStateOf { texts.value.textContentIndices() }
@@ -95,13 +99,12 @@
             texts.value.fastForEach { (str, tag) ->
                 BasicText(
                     text = str,
-                    style = TextStyle(
-                        fontFamily = fontFamily,
-                        fontSize = fontSize,
-                    ),
-                    modifier = Modifier
-                        .fillMaxWidth()
-                        .testTag(tag),
+                    style =
+                        TextStyle(
+                            fontFamily = fontFamily,
+                            fontSize = fontSize,
+                        ),
+                    modifier = Modifier.fillMaxWidth().testTag(tag),
                 )
             }
         }
@@ -115,8 +118,10 @@
             rule.onNodeWithTag(pointerAreaTag).fetchSemanticsNode().positionInRoot
         val nodePosition = rule.onNodeWithTag(tag).fetchSemanticsNode().positionInRoot
         val textLayoutResult = rule.onNodeWithTag(tag).fetchTextLayoutResult()
-        val boundingBox = textLayoutResult.getBoundingBox(localOffset)
-            .translate(nodePosition - pointerAreaPosition)
+        val boundingBox =
+            textLayoutResult
+                .getBoundingBox(localOffset)
+                .translate(nodePosition - pointerAreaPosition)
         return if (isRtl) boundingBox.centerRight - Offset(2f, 0f)
         else boundingBox.centerLeft + Offset(2f, 0f)
     }
diff --git a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/selection/gestures/MultiTextSelectionGesturesRtlTest.kt b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/selection/gestures/MultiTextSelectionGesturesRtlTest.kt
index 087ad43..a454e89 100644
--- a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/selection/gestures/MultiTextSelectionGesturesRtlTest.kt
+++ b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/selection/gestures/MultiTextSelectionGesturesRtlTest.kt
@@ -67,35 +67,35 @@
 
     @Before
     fun setupAsserter() {
-        asserter = object : TextSelectionAsserter(
-            textContent = textContent.value,
-            rule = rule,
-            textToolbar = textToolbar,
-            hapticFeedback = hapticFeedback,
-            getActual = { selection.value }
-        ) {
-            override fun subAssert() {
-                Truth.assertAbout(MultiSelectionSubject.withContent(texts.value))
-                    .that(getActual())
-                    .hasSelection(
-                        expected = selection,
-                        startTextDirection = startLayoutDirection,
-                        endTextDirection = endLayoutDirection,
-                    )
-            }
-        }.apply {
-            startLayoutDirection = ResolvedTextDirection.Rtl
-            endLayoutDirection = ResolvedTextDirection.Rtl
-        }
+        asserter =
+            object :
+                    TextSelectionAsserter(
+                        textContent = textContent.value,
+                        rule = rule,
+                        textToolbar = textToolbar,
+                        hapticFeedback = hapticFeedback,
+                        getActual = { selection.value }
+                    ) {
+                    override fun subAssert() {
+                        Truth.assertAbout(MultiSelectionSubject.withContent(texts.value))
+                            .that(getActual())
+                            .hasSelection(
+                                expected = selection,
+                                startTextDirection = startLayoutDirection,
+                                endTextDirection = endLayoutDirection,
+                            )
+                    }
+                }
+                .apply {
+                    startLayoutDirection = ResolvedTextDirection.Rtl
+                    endLayoutDirection = ResolvedTextDirection.Rtl
+                }
     }
 
     @Composable
     override fun TextContent() {
         texts = derivedStateOf {
-            textContent.value
-                .split("\n")
-                .withIndex()
-                .map { (index, str) -> str to "testTag$index" }
+            textContent.value.split("\n").withIndex().map { (index, str) -> str to "testTag$index" }
         }
 
         textContentIndices = derivedStateOf { texts.value.textContentIndices() }
@@ -104,13 +104,12 @@
                 texts.value.fastForEach { (str, tag) ->
                     BasicText(
                         text = str,
-                        style = TextStyle(
-                            fontFamily = fontFamily,
-                            fontSize = fontSize,
-                        ),
-                        modifier = Modifier
-                            .fillMaxWidth()
-                            .testTag(tag),
+                        style =
+                            TextStyle(
+                                fontFamily = fontFamily,
+                                fontSize = fontSize,
+                            ),
+                        modifier = Modifier.fillMaxWidth().testTag(tag),
                     )
                 }
             }
@@ -125,7 +124,8 @@
             rule.onNodeWithTag(pointerAreaTag).fetchSemanticsNode().positionInRoot
         val nodePosition = rule.onNodeWithTag(tag).fetchSemanticsNode().positionInRoot
         val textLayoutResult = rule.onNodeWithTag(tag).fetchTextLayoutResult()
-        return textLayoutResult.getBoundingBox(localOffset)
+        return textLayoutResult
+            .getBoundingBox(localOffset)
             .translate(nodePosition - pointerAreaPosition)
             .centerRight
             .nudge(HorizontalDirection.END)
@@ -138,19 +138,13 @@
             press()
         }
 
-        asserter.applyAndAssert {
-            selection = 23.collapsed
-        }
+        asserter.applyAndAssert { selection = 23.collapsed }
 
         mouseDragTo(characterPosition(offset = 24))
 
-        asserter.applyAndAssert {
-            selection = 23 to 24
-        }
+        asserter.applyAndAssert { selection = 23 to 24 }
 
-        performTouchGesture {
-            enterTouchMode()
-        }
+        performTouchGesture { enterTouchMode() }
 
         asserter.applyAndAssert {
             selectionHandlesShown = true
diff --git a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/selection/gestures/MultiTextSelectionGesturesTest.kt b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/selection/gestures/MultiTextSelectionGesturesTest.kt
index 8bc7c6e5..74a676c 100644
--- a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/selection/gestures/MultiTextSelectionGesturesTest.kt
+++ b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/selection/gestures/MultiTextSelectionGesturesTest.kt
@@ -62,32 +62,31 @@
 
     @Before
     fun setupAsserter() {
-        asserter = object : TextSelectionAsserter(
-            textContent = textContent.value,
-            rule = rule,
-            textToolbar = textToolbar,
-            hapticFeedback = hapticFeedback,
-            getActual = { selection.value }
-        ) {
-            override fun subAssert() {
-                Truth.assertAbout(MultiSelectionSubject.withContent(texts.value))
-                    .that(getActual())
-                    .hasSelection(
-                        expected = selection,
-                        startTextDirection = startLayoutDirection,
-                        endTextDirection = endLayoutDirection,
-                    )
+        asserter =
+            object :
+                TextSelectionAsserter(
+                    textContent = textContent.value,
+                    rule = rule,
+                    textToolbar = textToolbar,
+                    hapticFeedback = hapticFeedback,
+                    getActual = { selection.value }
+                ) {
+                override fun subAssert() {
+                    Truth.assertAbout(MultiSelectionSubject.withContent(texts.value))
+                        .that(getActual())
+                        .hasSelection(
+                            expected = selection,
+                            startTextDirection = startLayoutDirection,
+                            endTextDirection = endLayoutDirection,
+                        )
+                }
             }
-        }
     }
 
     @Composable
     override fun TextContent() {
         texts = derivedStateOf {
-            textContent.value
-                .split("\n")
-                .withIndex()
-                .map { (index, str) -> str to "testTag$index" }
+            textContent.value.split("\n").withIndex().map { (index, str) -> str to "testTag$index" }
         }
 
         textContentIndices = derivedStateOf { texts.value.textContentIndices() }
@@ -96,13 +95,12 @@
             texts.value.fastForEach { (str, tag) ->
                 BasicText(
                     text = str,
-                    style = TextStyle(
-                        fontFamily = fontFamily,
-                        fontSize = fontSize,
-                    ),
-                    modifier = Modifier
-                        .fillMaxWidth()
-                        .testTag(tag),
+                    style =
+                        TextStyle(
+                            fontFamily = fontFamily,
+                            fontSize = fontSize,
+                        ),
+                    modifier = Modifier.fillMaxWidth().testTag(tag),
                 )
             }
         }
@@ -116,7 +114,8 @@
             rule.onNodeWithTag(pointerAreaTag).fetchSemanticsNode().positionInRoot
         val nodePosition = rule.onNodeWithTag(tag).fetchSemanticsNode().positionInRoot
         val textLayoutResult = rule.onNodeWithTag(tag).fetchTextLayoutResult()
-        return textLayoutResult.getBoundingBox(localOffset)
+        return textLayoutResult
+            .getBoundingBox(localOffset)
             .translate(nodePosition - pointerAreaPosition)
             .centerLeft
             .nudge(HorizontalDirection.END)
@@ -129,19 +128,13 @@
             press()
         }
 
-        asserter.applyAndAssert {
-            selection = 23.collapsed
-        }
+        asserter.applyAndAssert { selection = 23.collapsed }
 
         mouseDragTo(characterPosition(offset = 24))
 
-        asserter.applyAndAssert {
-            selection = 23 to 24
-        }
+        asserter.applyAndAssert { selection = 23 to 24 }
 
-        performTouchGesture {
-            enterTouchMode()
-        }
+        performTouchGesture { enterTouchMode() }
 
         asserter.applyAndAssert {
             selectionHandlesShown = true
diff --git a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/selection/gestures/MultiTextWithSpaceSelectionGesturesRegressionTest.kt b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/selection/gestures/MultiTextWithSpaceSelectionGesturesRegressionTest.kt
index dd36af1..7198fb4 100644
--- a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/selection/gestures/MultiTextWithSpaceSelectionGesturesRegressionTest.kt
+++ b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/selection/gestures/MultiTextWithSpaceSelectionGesturesRegressionTest.kt
@@ -50,10 +50,8 @@
 internal class MultiTextWithSpaceSelectionGesturesRegressionTest : AbstractSelectionGesturesTest() {
     private val textContent = "line1\nline2 text1 text2!\nline3"
 
-    private val texts = textContent
-        .split("\n")
-        .withIndex()
-        .map { (index, str) -> str to "testTag$index" }
+    private val texts =
+        textContent.split("\n").withIndex().map { (index, str) -> str to "testTag$index" }
 
     private val textContentIndices = texts.textContentIndices()
 
@@ -74,10 +72,11 @@
                 texts.fastForEach { (str, tag) ->
                     BasicText(
                         text = str,
-                        style = TextStyle(
-                            fontFamily = fontFamily,
-                            fontSize = fontSize,
-                        ),
+                        style =
+                            TextStyle(
+                                fontFamily = fontFamily,
+                                fontSize = fontSize,
+                            ),
                         modifier = Modifier.testTag(tag),
                     )
                 }
@@ -87,23 +86,25 @@
 
     @Before
     fun setupAsserter() {
-        asserter = object : TextSelectionAsserter(
-            textContent = textContent,
-            rule = rule,
-            textToolbar = textToolbar,
-            hapticFeedback = hapticFeedback,
-            getActual = { selection.value }
-        ) {
-            override fun subAssert() {
-                Truth.assertAbout(MultiSelectionSubject.withContent(texts))
-                    .that(getActual())
-                    .hasSelection(
-                        expected = selection,
-                        startTextDirection = startLayoutDirection,
-                        endTextDirection = endLayoutDirection,
-                    )
+        asserter =
+            object :
+                TextSelectionAsserter(
+                    textContent = textContent,
+                    rule = rule,
+                    textToolbar = textToolbar,
+                    hapticFeedback = hapticFeedback,
+                    getActual = { selection.value }
+                ) {
+                override fun subAssert() {
+                    Truth.assertAbout(MultiSelectionSubject.withContent(texts))
+                        .that(getActual())
+                        .hasSelection(
+                            expected = selection,
+                            startTextDirection = startLayoutDirection,
+                            endTextDirection = endLayoutDirection,
+                        )
+                }
             }
-        }
     }
 
     @Suppress("SameParameterValue")
@@ -115,7 +116,8 @@
             rule.onNodeWithTag(pointerAreaTag).fetchSemanticsNode().positionInRoot
         val nodePosition = rule.onNodeWithTag(tag).fetchSemanticsNode().positionInRoot
         val textLayoutResult = rule.onNodeWithTag(tag).fetchTextLayoutResult()
-        return textLayoutResult.getBoundingBox(localOffset)
+        return textLayoutResult
+            .getBoundingBox(localOffset)
             .translate(nodePosition - pointerAreaPosition)
             .centerLeft
     }
@@ -135,25 +137,17 @@
             press()
         }
 
-        asserter.applyAndAssert {
-            selection = 18 to 23
-        }
+        asserter.applyAndAssert { selection = 18 to 23 }
 
         mouseDragTo(topEnd)
 
-        asserter.applyAndAssert {
-            selection = 24 to 6
-        }
+        asserter.applyAndAssert { selection = 24 to 6 }
 
         mouseDragTo(bottomEnd)
 
-        asserter.applyAndAssert {
-            selection = 18 to 30
-        }
+        asserter.applyAndAssert { selection = 18 to 30 }
 
-        performMouseGesture {
-            release()
-        }
+        performMouseGesture { release() }
 
         asserter.assert()
     }
diff --git a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/selection/gestures/SingleTextSelectionGesturesBidiTest.kt b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/selection/gestures/SingleTextSelectionGesturesBidiTest.kt
index 2882145..5f8e5b5 100644
--- a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/selection/gestures/SingleTextSelectionGesturesBidiTest.kt
+++ b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/selection/gestures/SingleTextSelectionGesturesBidiTest.kt
@@ -41,46 +41,52 @@
     private val testTag = "testTag"
     private val ltrWord = "hello"
     private val rtlWord = RtlChar.repeat(5)
-    override val textContent = mutableStateOf("""
+    override val textContent =
+        mutableStateOf(
+            """
         $ltrWord $rtlWord $ltrWord
         $rtlWord $ltrWord $rtlWord
         $ltrWord $rtlWord $ltrWord
-    """.trimIndent().trim())
+    """
+                .trimIndent()
+                .trim()
+        )
 
     override lateinit var asserter: TextSelectionAsserter
 
     @Before
     fun setupAsserter() {
-        asserter = object : TextSelectionAsserter(
-            textContent = textContent.value,
-            rule = rule,
-            textToolbar = textToolbar,
-            hapticFeedback = hapticFeedback,
-            getActual = { selection.value },
-        ) {
-            override fun subAssert() {
-                Truth.assertAbout(SelectionSubject.withContent(textContent))
-                    .that(getActual())
-                    .hasSelection(
-                        expected = selection,
-                        startTextDirection = startLayoutDirection,
-                        endTextDirection = endLayoutDirection,
-                    )
+        asserter =
+            object :
+                TextSelectionAsserter(
+                    textContent = textContent.value,
+                    rule = rule,
+                    textToolbar = textToolbar,
+                    hapticFeedback = hapticFeedback,
+                    getActual = { selection.value },
+                ) {
+                override fun subAssert() {
+                    Truth.assertAbout(SelectionSubject.withContent(textContent))
+                        .that(getActual())
+                        .hasSelection(
+                            expected = selection,
+                            startTextDirection = startLayoutDirection,
+                            endTextDirection = endLayoutDirection,
+                        )
+                }
             }
-        }
     }
 
     @Composable
     override fun TextContent() {
         BasicText(
             text = textContent.value,
-            style = TextStyle(
-                fontFamily = fontFamily,
-                fontSize = fontSize,
-            ),
-            modifier = Modifier
-                .fillMaxWidth()
-                .testTag(testTag),
+            style =
+                TextStyle(
+                    fontFamily = fontFamily,
+                    fontSize = fontSize,
+                ),
+            modifier = Modifier.fillMaxWidth().testTag(testTag),
         )
     }
 
diff --git a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/selection/gestures/SingleTextSelectionGesturesRtlTest.kt b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/selection/gestures/SingleTextSelectionGesturesRtlTest.kt
index cca3ced..f483003 100644
--- a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/selection/gestures/SingleTextSelectionGesturesRtlTest.kt
+++ b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/selection/gestures/SingleTextSelectionGesturesRtlTest.kt
@@ -52,26 +52,29 @@
 
     @Before
     fun setupAsserter() {
-        asserter = object : TextSelectionAsserter(
-            textContent = textContent.value,
-            rule = rule,
-            textToolbar = textToolbar,
-            hapticFeedback = hapticFeedback,
-            getActual = { selection.value },
-        ) {
-            override fun subAssert() {
-                Truth.assertAbout(SelectionSubject.withContent(textContent))
-                    .that(getActual())
-                    .hasSelection(
-                        expected = selection,
-                        startTextDirection = startLayoutDirection,
-                        endTextDirection = endLayoutDirection,
-                    )
-            }
-        }.apply {
-            startLayoutDirection = ResolvedTextDirection.Rtl
-            endLayoutDirection = ResolvedTextDirection.Rtl
-        }
+        asserter =
+            object :
+                    TextSelectionAsserter(
+                        textContent = textContent.value,
+                        rule = rule,
+                        textToolbar = textToolbar,
+                        hapticFeedback = hapticFeedback,
+                        getActual = { selection.value },
+                    ) {
+                    override fun subAssert() {
+                        Truth.assertAbout(SelectionSubject.withContent(textContent))
+                            .that(getActual())
+                            .hasSelection(
+                                expected = selection,
+                                startTextDirection = startLayoutDirection,
+                                endTextDirection = endLayoutDirection,
+                            )
+                    }
+                }
+                .apply {
+                    startLayoutDirection = ResolvedTextDirection.Rtl
+                    endLayoutDirection = ResolvedTextDirection.Rtl
+                }
     }
 
     @Composable
@@ -79,13 +82,12 @@
         CompositionLocalProvider(LocalLayoutDirection provides LayoutDirection.Rtl) {
             BasicText(
                 text = textContent.value,
-                style = TextStyle(
-                    fontFamily = fontFamily,
-                    fontSize = fontSize,
-                ),
-                modifier = Modifier
-                    .fillMaxWidth()
-                    .testTag(testTag),
+                style =
+                    TextStyle(
+                        fontFamily = fontFamily,
+                        fontSize = fontSize,
+                    ),
+                modifier = Modifier.fillMaxWidth().testTag(testTag),
             )
         }
     }
diff --git a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/selection/gestures/SingleTextSelectionGesturesTest.kt b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/selection/gestures/SingleTextSelectionGesturesTest.kt
index ed6e4ec..fc2e343 100644
--- a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/selection/gestures/SingleTextSelectionGesturesTest.kt
+++ b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/selection/gestures/SingleTextSelectionGesturesTest.kt
@@ -46,36 +46,37 @@
 
     @Before
     fun setupAsserter() {
-        asserter = object : TextSelectionAsserter(
-            textContent = textContent.value,
-            rule = rule,
-            textToolbar = textToolbar,
-            hapticFeedback = hapticFeedback,
-            getActual = { selection.value },
-        ) {
-            override fun subAssert() {
-                Truth.assertAbout(SelectionSubject.withContent(textContent))
-                    .that(getActual())
-                    .hasSelection(
-                        expected = selection,
-                        startTextDirection = startLayoutDirection,
-                        endTextDirection = endLayoutDirection,
-                    )
+        asserter =
+            object :
+                TextSelectionAsserter(
+                    textContent = textContent.value,
+                    rule = rule,
+                    textToolbar = textToolbar,
+                    hapticFeedback = hapticFeedback,
+                    getActual = { selection.value },
+                ) {
+                override fun subAssert() {
+                    Truth.assertAbout(SelectionSubject.withContent(textContent))
+                        .that(getActual())
+                        .hasSelection(
+                            expected = selection,
+                            startTextDirection = startLayoutDirection,
+                            endTextDirection = endLayoutDirection,
+                        )
+                }
             }
-        }
     }
 
     @Composable
     override fun TextContent() {
         BasicText(
             text = textContent.value,
-            style = TextStyle(
-                fontFamily = fontFamily,
-                fontSize = fontSize,
-            ),
-            modifier = Modifier
-                .fillMaxWidth()
-                .testTag(testTag),
+            style =
+                TextStyle(
+                    fontFamily = fontFamily,
+                    fontSize = fontSize,
+                ),
+            modifier = Modifier.fillMaxWidth().testTag(testTag),
         )
     }
 
diff --git a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/selection/gestures/TextField1SelectionGesturesTest.kt b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/selection/gestures/TextField1SelectionGesturesTest.kt
index 4919e1f..06b828c 100644
--- a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/selection/gestures/TextField1SelectionGesturesTest.kt
+++ b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/selection/gestures/TextField1SelectionGesturesTest.kt
@@ -52,13 +52,14 @@
     override lateinit var asserter: TextFieldSelectionAsserter<TextFieldValue>
 
     override fun setupAsserter() {
-        asserter = TextField1SelectionAsserter(
-            textContent = textFieldValue.text,
-            rule = rule,
-            textToolbar = textToolbar,
-            hapticFeedback = hapticFeedback,
-            getActual = { textFieldValue }
-        )
+        asserter =
+            TextField1SelectionAsserter(
+                textContent = textFieldValue.text,
+                rule = rule,
+                textToolbar = textToolbar,
+                hapticFeedback = hapticFeedback,
+                getActual = { textFieldValue }
+            )
     }
 
     @Composable
@@ -71,9 +72,7 @@
                     readOnly = readOnly,
                     enabled = enabled,
                     textStyle = TextStyle(fontFamily = fontFamily, fontSize = fontSize),
-                    modifier = Modifier
-                        .fillMaxWidth()
-                        .testTag(pointerAreaTag),
+                    modifier = Modifier.fillMaxWidth().testTag(pointerAreaTag),
                 )
             }
         }
diff --git a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/selection/gestures/TextField2SelectionGesturesLtrTest.kt b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/selection/gestures/TextField2SelectionGesturesLtrTest.kt
index b27ebeb..f9cd823 100644
--- a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/selection/gestures/TextField2SelectionGesturesLtrTest.kt
+++ b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/selection/gestures/TextField2SelectionGesturesLtrTest.kt
@@ -26,10 +26,11 @@
 
 @MediumTest
 @RunWith(AndroidJUnit4::class)
-internal class TextField2SelectionGesturesLtrTest : TextField2SelectionGesturesTest(
-    initialText = "line1\nline2 text1 text2\nline3",
-    layoutDirection = LayoutDirection.Ltr,
-) {
+internal class TextField2SelectionGesturesLtrTest :
+    TextField2SelectionGesturesTest(
+        initialText = "line1\nline2 text1 text2\nline3",
+        layoutDirection = LayoutDirection.Ltr,
+    ) {
     override val word = "hello"
 
     override fun characterPosition(offset: Int): Offset {
diff --git a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/selection/gestures/TextField2SelectionGesturesRtlTest.kt b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/selection/gestures/TextField2SelectionGesturesRtlTest.kt
index e6fd344..9f8d5a5 100644
--- a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/selection/gestures/TextField2SelectionGesturesRtlTest.kt
+++ b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/selection/gestures/TextField2SelectionGesturesRtlTest.kt
@@ -29,10 +29,11 @@
 
 @MediumTest
 @RunWith(AndroidJUnit4::class)
-internal class TextField2SelectionGesturesRtlTest : TextField2SelectionGesturesTest(
-    initialText = "$rtlWord\n$rtlWord $rtlWord $rtlWord\n$rtlWord",
-    layoutDirection = LayoutDirection.Rtl,
-) {
+internal class TextField2SelectionGesturesRtlTest :
+    TextField2SelectionGesturesTest(
+        initialText = "$rtlWord\n$rtlWord $rtlWord $rtlWord\n$rtlWord",
+        layoutDirection = LayoutDirection.Rtl,
+    ) {
     override val word = rtlWord
     override var textDirection: ResolvedTextDirection = ResolvedTextDirection.Rtl
 
diff --git a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/selection/gestures/TextField2SelectionGesturesTest.kt b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/selection/gestures/TextField2SelectionGesturesTest.kt
index 8c8a350..2cff0f7 100644
--- a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/selection/gestures/TextField2SelectionGesturesTest.kt
+++ b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/selection/gestures/TextField2SelectionGesturesTest.kt
@@ -51,13 +51,14 @@
     override lateinit var asserter: TextFieldSelectionAsserter<TextFieldState>
 
     override fun setupAsserter() {
-        asserter = TextField2SelectionAsserter(
-            textContent = textFieldState.text.toString(),
-            rule = rule,
-            textToolbar = textToolbar,
-            hapticFeedback = hapticFeedback,
-            getActual = { textFieldState }
-        )
+        asserter =
+            TextField2SelectionAsserter(
+                textContent = textFieldState.text.toString(),
+                rule = rule,
+                textToolbar = textToolbar,
+                hapticFeedback = hapticFeedback,
+                getActual = { textFieldState }
+            )
     }
 
     @Composable
@@ -68,9 +69,7 @@
                 readOnly = readOnly,
                 enabled = enabled,
                 textStyle = TextStyle(fontFamily = fontFamily, fontSize = fontSize),
-                modifier = Modifier
-                    .fillMaxWidth()
-                    .testTag(pointerAreaTag),
+                modifier = Modifier.fillMaxWidth().testTag(pointerAreaTag),
             )
         }
     }
diff --git a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/selection/gestures/TextFieldScrolledSelectionGestureTest.kt b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/selection/gestures/TextFieldScrolledSelectionGestureTest.kt
index 341874b..3919680 100644
--- a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/selection/gestures/TextFieldScrolledSelectionGestureTest.kt
+++ b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/selection/gestures/TextFieldScrolledSelectionGestureTest.kt
@@ -83,8 +83,7 @@
 @MediumTest
 @RunWith(AndroidJUnit4::class)
 class TextFieldScrolledSelectionGestureTest : FocusedWindowTest {
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
     private val fontFamily = TEST_FONT_FAMILY
     private val fontSize = 15.sp
@@ -96,17 +95,13 @@
         rule.setTextFieldTestContent {
             CompositionLocalProvider(
                 LocalDensity provides density,
-                LocalViewConfiguration provides TestViewConfiguration(
-                    minimumTouchTargetSize = DpSize.Zero,
-                    touchSlop = Float.MIN_VALUE,
-                ),
+                LocalViewConfiguration provides
+                    TestViewConfiguration(
+                        minimumTouchTargetSize = DpSize.Zero,
+                        touchSlop = Float.MIN_VALUE,
+                    ),
             ) {
-                Box(
-                    modifier = Modifier
-                        .fillMaxSize()
-                        .padding(32.dp)
-                        .wrapContentSize()
-                ) {
+                Box(modifier = Modifier.fillMaxSize().padding(32.dp).wrapContentSize()) {
                     content(pointerAreaTag)
                 }
             }
@@ -121,20 +116,22 @@
         /** Returns the offset needed to translate the amount scrolled. */
         abstract fun TextLayoutResult.translateScroll(): Offset
 
-        fun characterBoxScrolled(offset: Int): Rect = onTextField.fetchTextLayoutResult().run {
-            getBoundingBox(offset).translate(translateScroll())
-        }
+        fun characterBoxScrolled(offset: Int): Rect =
+            onTextField.fetchTextLayoutResult().run {
+                getBoundingBox(offset).translate(translateScroll())
+            }
 
         fun positionForCharacterScrolled(offset: Int): Offset =
             characterBoxScrolled(offset).centerLeft
 
         fun HandlePressedScope.moveHandleToCharacter(characterOffset: Int) {
             val boundingBox = onTextField.fetchTextLayoutResult().getBoundingBox(characterOffset)
-            val destinationPosition = when (fetchHandleInfo().handle) {
-                Handle.SelectionStart -> boundingBox.bottomLeft
-                Handle.SelectionEnd -> boundingBox.bottomRight
-                Handle.Cursor -> fail("Unexpected handle ${Handle.Cursor}")
-            }
+            val destinationPosition =
+                when (fetchHandleInfo().handle) {
+                    Handle.SelectionStart -> boundingBox.bottomLeft
+                    Handle.SelectionEnd -> boundingBox.bottomRight
+                    Handle.Cursor -> fail("Unexpected handle ${Handle.Cursor}")
+                }
             moveHandleTo(destinationPosition)
         }
 
@@ -184,22 +181,18 @@
                 onValueChange = { tfv.value = it },
                 textStyle = textStyle,
                 singleLine = true,
-                modifier = Modifier
-                    .width(300.dp)
-                    .testTag(tag = tag)
-                    .onSizeChanged { sizeNullable!!.value = it }
-                    .onGloballyPositioned { textFieldLayoutCoordinates = it }
+                modifier =
+                    Modifier.width(300.dp)
+                        .testTag(tag = tag)
+                        .onSizeChanged { sizeNullable!!.value = it }
+                        .onGloballyPositioned { textFieldLayoutCoordinates = it }
             )
         }
         val onTextField = rule.onNodeWithTag(pointerAreaTag)
         onTextField.requestFocus()
 
         // scroll to the end
-        onTextField.performTouchInput {
-            repeat(4) {
-                swipe(start = centerRight, end = centerLeft)
-            }
-        }
+        onTextField.performTouchInput { repeat(4) { swipe(start = centerRight, end = centerLeft) } }
 
         assertThat(sizeNullable!!.value).isNotNull()
         HorizontalScope(tfv, onTextField, textFieldLayoutCoordinates, sizeNullable!!.value!!)
@@ -259,9 +252,7 @@
         }
     }
 
-    /**
-     * Create a horizontally scrollable text field that is scrolled all the way to the end.
-     */
+    /** Create a horizontally scrollable text field that is scrolled all the way to the end. */
     private fun runVerticalTest(block: VerticalScope.() -> Unit) {
         val text = (0..9).joinToString(separator = "\n") { "text$it" }
         lateinit var textFieldLayoutCoordinates: LayoutCoordinates
@@ -275,11 +266,11 @@
                 onValueChange = { it: TextFieldValue -> tfv.value = it },
                 textStyle = TextStyle(fontFamily = fontFamily, fontSize = fontSize),
                 maxLines = 4,
-                modifier = Modifier
-                    .width(300.dp)
-                    .testTag(tag = tag)
-                    .onSizeChanged { sizeNullable!!.value = it }
-                    .onGloballyPositioned { textFieldLayoutCoordinates = it }
+                modifier =
+                    Modifier.width(300.dp)
+                        .testTag(tag = tag)
+                        .onSizeChanged { sizeNullable!!.value = it }
+                        .onGloballyPositioned { textFieldLayoutCoordinates = it }
             )
         }
         assertThat(sizeNullable).isNotNull()
@@ -287,11 +278,7 @@
         onTextField.requestFocus()
 
         // scroll to the end
-        onTextField.performTouchInput {
-            repeat(4) {
-                swipe(start = bottomCenter, end = topCenter)
-            }
-        }
+        onTextField.performTouchInput { repeat(4) { swipe(start = bottomCenter, end = topCenter) } }
 
         assertThat(sizeNullable!!.value).isNotNull()
         VerticalScope(tfv, onTextField, textFieldLayoutCoordinates, sizeNullable!!.value!!).block()
diff --git a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/selection/gestures/TextFieldSelectionGesturesLtrTest.kt b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/selection/gestures/TextFieldSelectionGesturesLtrTest.kt
index 49aa084..3682ad6 100644
--- a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/selection/gestures/TextFieldSelectionGesturesLtrTest.kt
+++ b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/selection/gestures/TextFieldSelectionGesturesLtrTest.kt
@@ -26,10 +26,11 @@
 
 @MediumTest
 @RunWith(AndroidJUnit4::class)
-internal class TextFieldSelectionGesturesLtrTest : TextField1SelectionGesturesTest(
-    initialText = "line1\nline2 text1 text2\nline3",
-    layoutDirection = LayoutDirection.Ltr
-) {
+internal class TextFieldSelectionGesturesLtrTest :
+    TextField1SelectionGesturesTest(
+        initialText = "line1\nline2 text1 text2\nline3",
+        layoutDirection = LayoutDirection.Ltr
+    ) {
     override val word = "hello"
 
     override fun characterPosition(offset: Int): Offset {
diff --git a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/selection/gestures/TextFieldSelectionGesturesRtlTest.kt b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/selection/gestures/TextFieldSelectionGesturesRtlTest.kt
index b857e25..b955512 100644
--- a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/selection/gestures/TextFieldSelectionGesturesRtlTest.kt
+++ b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/selection/gestures/TextFieldSelectionGesturesRtlTest.kt
@@ -29,10 +29,11 @@
 
 @MediumTest
 @RunWith(AndroidJUnit4::class)
-internal class TextFieldSelectionGesturesRtlTest : TextField1SelectionGesturesTest(
-    initialText = "$rtlWord\n$rtlWord $rtlWord $rtlWord\n$rtlWord",
-    layoutDirection = LayoutDirection.Rtl,
-) {
+internal class TextFieldSelectionGesturesRtlTest :
+    TextField1SelectionGesturesTest(
+        initialText = "$rtlWord\n$rtlWord $rtlWord $rtlWord\n$rtlWord",
+        layoutDirection = LayoutDirection.Rtl,
+    ) {
     override val word = rtlWord
     override var textDirection: ResolvedTextDirection = ResolvedTextDirection.Rtl
 
diff --git a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/selection/gestures/TextFieldSelectionGesturesTest.kt b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/selection/gestures/TextFieldSelectionGesturesTest.kt
index afd6b3d..38706c6 100644
--- a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/selection/gestures/TextFieldSelectionGesturesTest.kt
+++ b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/selection/gestures/TextFieldSelectionGesturesTest.kt
@@ -48,6 +48,7 @@
     protected abstract fun characterPosition(offset: Int): Offset
 
     abstract fun setupAsserter()
+
     protected abstract var textContent: String
     protected abstract var readOnly: Boolean
     protected abstract var enabled: Boolean
@@ -61,22 +62,16 @@
         // ensure the following event (if any) isn't considered a multi-tap
         rule.mainClock.advanceTimeBy(1_000)
 
-        asserter.applyAndAssert {
-            cursorHandleShown = true
-        }
+        asserter.applyAndAssert { cursorHandleShown = true }
         asserter.cursorHandleShown = false
         // most tests first action will start a selection, so leave cursor handle as false
     }
 
     @Test
     fun whenTouch_withLongPressOutOfBounds_nothingHappens() {
-        performTouchGesture {
-            longPress(topStart.nudge(yDirection = UP))
-        }
+        performTouchGesture { longPress(topStart.nudge(yDirection = UP)) }
 
-        asserter.applyAndAssert {
-            cursorHandleShown = true
-        }
+        asserter.applyAndAssert { cursorHandleShown = true }
 
         touchDragTo(topEnd.nudge(yDirection = UP))
         asserter.assert()
@@ -89,9 +84,7 @@
 
         rule.onNodeWithTag(pointerAreaTag).performTouchInput { click() }
 
-        asserter.applyAndAssert {
-            textContent = ""
-        }
+        asserter.applyAndAssert { textContent = "" }
 
         performTouchGesture {
             advanceEventTime(viewConfiguration.doubleTapTimeoutMillis * 2)
@@ -111,26 +104,20 @@
 
         rule.onNodeWithTag(pointerAreaTag).performTouchInput { click() }
 
-        asserter.applyAndAssert {
-            textContent = ""
-        }
+        asserter.applyAndAssert { textContent = "" }
 
         performTouchGesture {
             advanceEventTime(viewConfiguration.doubleTapTimeoutMillis * 2)
             longPress(center)
         }
 
-        asserter.applyAndAssert {
-            hapticsCount++
-        }
+        asserter.applyAndAssert { hapticsCount++ }
 
         touchDragTo(centerStart)
 
         asserter.assert()
 
-        performTouchGesture {
-            up()
-        }
+        performTouchGesture { up() }
 
         asserter.applyAndAssert {
             textToolbarShown = true // paste will show up if clipboard is not empty
@@ -146,9 +133,7 @@
 
         rule.onNodeWithTag(pointerAreaTag).performTouchInput { click() }
 
-        asserter.applyAndAssert {
-            textContent = ""
-        }
+        asserter.applyAndAssert { textContent = "" }
 
         performTouchGesture {
             advanceEventTime(viewConfiguration.doubleTapTimeoutMillis * 2)
@@ -164,9 +149,7 @@
 
         asserter.assert()
 
-        performTouchGesture {
-            up()
-        }
+        performTouchGesture { up() }
 
         asserter.applyAndAssert {
             textToolbarShown = true // paste will show up if clipboard is not empty
@@ -176,9 +159,7 @@
         rule.onNodeWithTag(pointerAreaTag).performTextInput(newText)
         rule.waitForIdle()
 
-        performTouchGesture {
-            longPress(characterPosition(2))
-        }
+        performTouchGesture { longPress(characterPosition(2)) }
 
         asserter.applyAndAssert {
             textContent = newText
@@ -195,9 +176,7 @@
             hapticsCount++
         }
 
-        performTouchGesture {
-            up()
-        }
+        performTouchGesture { up() }
 
         asserter.applyAndAssert {
             selectionHandlesShown = true
@@ -208,9 +187,7 @@
 
     @Test
     fun whenTouch_withLongPressThenClear_noSelection() {
-        performTouchGesture {
-            longClick(characterPosition(13))
-        }
+        performTouchGesture { longClick(characterPosition(13)) }
 
         asserter.applyAndAssert {
             selection = 12 to 17
@@ -219,9 +196,7 @@
             hapticsCount++
         }
 
-        performTouchGesture {
-            click(characterPosition(14))
-        }
+        performTouchGesture { click(characterPosition(14)) }
 
         asserter.applyAndAssert {
             selection = 14.collapsed
@@ -233,9 +208,7 @@
 
     @Test
     fun whenTouch_withLongPressThenDragLeftOutOfBoundsUpAndDown_selectsLines() {
-        performTouchGesture {
-            longPress(characterPosition(9))
-        }
+        performTouchGesture { longPress(characterPosition(9)) }
 
         // anchor starts at beginning of middle line
         asserter.applyAndAssert {
@@ -246,9 +219,7 @@
 
         // beginning of middle line
         touchDragTo(characterPosition(6) + Offset(-2f, 0f))
-        asserter.applyAndAssert {
-            selection = 6 to 11
-        }
+        asserter.applyAndAssert { selection = 6 to 11 }
 
         // beginning of top line
         touchDragTo(characterPosition(0) + Offset(-2f, 0f))
@@ -271,9 +242,7 @@
 
     @Test
     fun whenTouch_verifyOneCharStaysSelected_withinLine() {
-        performTouchGesture {
-            longPress(characterPosition(14))
-        }
+        performTouchGesture { longPress(characterPosition(14)) }
 
         asserter.applyAndAssert {
             selection = 12 to 17
@@ -282,9 +251,7 @@
         }
 
         touchDragTo(characterPosition(13))
-        asserter.applyAndAssert {
-            selection = 12 to 17
-        }
+        asserter.applyAndAssert { selection = 12 to 17 }
 
         touchDragTo(characterPosition(12))
         // shouldn't allow collapsed selection, but keeps previous single char selection
@@ -299,9 +266,7 @@
 
     @Test
     fun whenTouch_withLongPress_selectsSingleWord() {
-        performTouchGesture {
-            longClick(characterPosition(13))
-        }
+        performTouchGesture { longClick(characterPosition(13)) }
 
         asserter.applyAndAssert {
             selection = 12 to 17
@@ -317,9 +282,7 @@
         asserter.textToolbarShown = true
 
         fun longClickCharacterPositionThenApplyAndAssert(offset: Int, selection: TextRange) {
-            performTouchGesture {
-                longClick(characterPosition(offset))
-            }
+            performTouchGesture { longClick(characterPosition(offset)) }
 
             asserter.applyAndAssert {
                 this.selection = selection
@@ -378,9 +341,7 @@
         backwardOffset: Offset,
         expectedSelection: TextRange,
     ) {
-        performTouchGesture {
-            longPress(characterPosition(13))
-        }
+        performTouchGesture { longPress(characterPosition(13)) }
 
         asserter.applyAndAssert {
             selection = 12 to 17
@@ -399,9 +360,7 @@
 
         asserter.assert()
 
-        performTouchGesture {
-            up()
-        }
+        performTouchGesture { up() }
 
         asserter.applyAndAssert {
             selectionHandlesShown = true
@@ -438,9 +397,7 @@
         endOffset: Offset,
         endSelection: TextRange,
     ) {
-        performTouchGesture {
-            longPress(characterPosition(13))
-        }
+        performTouchGesture { longPress(characterPosition(13)) }
 
         asserter.applyAndAssert {
             selection = 12 to 17
@@ -456,9 +413,7 @@
             hapticsCount++
         }
 
-        performTouchGesture {
-            up()
-        }
+        performTouchGesture { up() }
 
         asserter.applyAndAssert {
             selectionHandlesShown = true
@@ -468,9 +423,7 @@
 
     @Test
     fun whenTouch_withLongPressInEndPadding_entersSelectionMode() {
-        performTouchGesture {
-            longPress(topEnd)
-        }
+        performTouchGesture { longPress(topEnd) }
 
         asserter.applyAndAssert {
             selection = 5.collapsed
@@ -482,9 +435,7 @@
 
         asserter.assert()
 
-        performTouchGesture {
-            up()
-        }
+        performTouchGesture { up() }
 
         asserter.applyAndAssert {
             cursorHandleShown = true
@@ -505,9 +456,7 @@
             cursorHandleShown = true
         }
 
-        performTouchGesture {
-            longPress(centerEnd)
-        }
+        performTouchGesture { longPress(centerEnd) }
 
         asserter.applyAndAssert {
             selection = 6.collapsed
@@ -520,9 +469,7 @@
 
         asserter.assert()
 
-        performTouchGesture {
-            up()
-        }
+        performTouchGesture { up() }
 
         asserter.applyAndAssert {
             cursorHandleShown = true
@@ -532,9 +479,7 @@
 
     @Test
     fun whenTouch_withLongPressInEndPaddingThenDragToUpperEndPadding_selectsParagraphAndNewLine() {
-        performTouchGesture {
-            longPress(centerEnd)
-        }
+        performTouchGesture { longPress(centerEnd) }
 
         asserter.applyAndAssert {
             selection = 23.collapsed
@@ -548,9 +493,7 @@
             hapticsCount++
         }
 
-        performTouchGesture {
-            up()
-        }
+        performTouchGesture { up() }
 
         asserter.applyAndAssert {
             selectionHandlesShown = true
@@ -560,9 +503,7 @@
 
     @Test
     fun whenTouch_withLongPressInEndPaddingThenDragToLowerEndPadding_selectsNewLineAndParagraph() {
-        performTouchGesture {
-            longPress(centerEnd)
-        }
+        performTouchGesture { longPress(centerEnd) }
 
         asserter.applyAndAssert {
             selection = 23.collapsed
@@ -576,9 +517,7 @@
             hapticsCount++
         }
 
-        performTouchGesture {
-            up()
-        }
+        performTouchGesture { up() }
 
         asserter.applyAndAssert {
             selectionHandlesShown = true
@@ -588,9 +527,7 @@
 
     @Test
     fun whenTouch_withLongPressInEndPaddingOfFinalLine_entersSelectionMode() {
-        performTouchGesture {
-            longPress(bottomEnd)
-        }
+        performTouchGesture { longPress(bottomEnd) }
 
         asserter.applyAndAssert {
             selection = 29.collapsed
@@ -602,9 +539,7 @@
 
         asserter.assert()
 
-        performTouchGesture {
-            up()
-        }
+        performTouchGesture { up() }
 
         asserter.applyAndAssert {
             cursorHandleShown = true
@@ -614,9 +549,7 @@
 
     @Test
     fun whenTouch_withLongPressThanDragAcrossSingleWord_onlySelectsSingleWordAndNoOtherChanges() {
-        performTouchGesture {
-            longPress(characterPosition(15))
-        }
+        performTouchGesture { longPress(characterPosition(15)) }
 
         asserter.applyAndAssert {
             selection = 12 to 17
@@ -626,19 +559,13 @@
 
         touchDragTo(characterPosition(13))
 
-        asserter.applyAndAssert {
-            selection = 12 to 17
-        }
+        asserter.applyAndAssert { selection = 12 to 17 }
 
         touchDragTo(characterPosition(15))
 
-        asserter.applyAndAssert {
-            selection = 12 to 17
-        }
+        asserter.applyAndAssert { selection = 12 to 17 }
 
-        performTouchGesture {
-            up()
-        }
+        performTouchGesture { up() }
 
         asserter.applyAndAssert {
             selectionHandlesShown = true
@@ -660,9 +587,7 @@
             cursorHandleShown = true
         }
 
-        performTouchGesture {
-            longPress(bottomEnd)
-        }
+        performTouchGesture { longPress(bottomEnd) }
 
         asserter.applyAndAssert {
             selection = 7.collapsed
@@ -675,9 +600,7 @@
 
         asserter.assert()
 
-        performTouchGesture {
-            up()
-        }
+        performTouchGesture { up() }
 
         asserter.applyAndAssert {
             cursorHandleShown = true
@@ -688,24 +611,16 @@
     // Regression test for a mouse long click resulting in touch behaviors for selection.
     @Test
     fun whenMouse_withLongClick_collapsedSelectionAtClick() {
-        performMouseGesture {
-            longClick(characterPosition(13))
-        }
+        performMouseGesture { longClick(characterPosition(13)) }
 
-        asserter.applyAndAssert {
-            selection = 13.collapsed
-        }
+        asserter.applyAndAssert { selection = 13.collapsed }
     }
 
     @Test
     fun whenMouse_withClick_collapsedSelectionAtClick() {
-        performMouseGesture {
-            click(characterPosition(13))
-        }
+        performMouseGesture { click(characterPosition(13)) }
 
-        asserter.applyAndAssert {
-            selection = 13.collapsed
-        }
+        asserter.applyAndAssert { selection = 13.collapsed }
     }
 
     @Test
@@ -715,13 +630,9 @@
             press()
         }
 
-        asserter.applyAndAssert {
-            selection = 13.collapsed
-        }
+        asserter.applyAndAssert { selection = 13.collapsed }
 
-        performMouseGesture {
-            release()
-        }
+        performMouseGesture { release() }
 
         asserter.assert()
     }
@@ -770,13 +681,9 @@
 
     @Test
     fun whenMouse_withDoubleClick_selectsWord() {
-        performMouseGesture {
-            repeat(2) { click(characterPosition(13)) }
-        }
+        performMouseGesture { repeat(2) { click(characterPosition(13)) } }
 
-        asserter.applyAndAssert {
-            selection = 12 to 17
-        }
+        asserter.applyAndAssert { selection = 12 to 17 }
     }
 
     @Test
@@ -823,13 +730,9 @@
 
     @Test
     fun whenMouse_withTripleClick_selectsParagraph() {
-        performMouseGesture {
-            repeat(3) { click(characterPosition(13)) }
-        }
+        performMouseGesture { repeat(3) { click(characterPosition(13)) } }
 
-        asserter.applyAndAssert {
-            selection = 6 to 23
-        }
+        asserter.applyAndAssert { selection = 6 to 23 }
     }
 
     @Test
@@ -965,36 +868,24 @@
             }
         }
 
-        asserter.applyAndAssert {
-            selection = startSelection
-        }
+        asserter.applyAndAssert { selection = startSelection }
 
         mouseDragTo(endOffset)
 
-        asserter.applyAndAssert {
-            selection = endSelection
-        }
+        asserter.applyAndAssert { selection = endSelection }
 
-        performMouseGesture {
-            release()
-        }
+        performMouseGesture { release() }
 
         asserter.assert()
     }
 
     @Test
     fun whenMouse_thenTouch_touchBehaviorsAppear() {
-        performMouseGesture {
-            repeat(2) { click(characterPosition(13)) }
-        }
+        performMouseGesture { repeat(2) { click(characterPosition(13)) } }
 
-        asserter.applyAndAssert {
-            selection = 12 to 17
-        }
+        asserter.applyAndAssert { selection = 12 to 17 }
 
-        performTouchGesture {
-            enterTouchMode()
-        }
+        performTouchGesture { enterTouchMode() }
 
         asserter.applyAndAssert {
             selectionHandlesShown = true
@@ -1004,9 +895,7 @@
 
     @Test
     fun whenTouch_thenMouse_touchBehaviorsDisappear() {
-        performTouchGesture {
-            longClick(characterPosition(13))
-        }
+        performTouchGesture { longClick(characterPosition(13)) }
 
         asserter.applyAndAssert {
             selection = 12 to 17
@@ -1026,28 +915,18 @@
     // Regression test for when this would result in text toolbar showing instead of the cursor.
     @Test
     fun whenMouseCollapsedSelection_thenTouch_ToolbarAndCursorAppears() {
-        performMouseGesture {
-            click(characterPosition(13))
-        }
+        performMouseGesture { click(characterPosition(13)) }
 
-        asserter.applyAndAssert {
-            selection = 13.collapsed
-        }
+        asserter.applyAndAssert { selection = 13.collapsed }
 
-        performTouchGesture {
-            enterTouchMode()
-        }
+        performTouchGesture { enterTouchMode() }
 
-        asserter.applyAndAssert {
-            cursorHandleShown = true
-        }
+        asserter.applyAndAssert { cursorHandleShown = true }
     }
 
     @Test
     fun whenTouchCollapsedSelection_thenMouse_noUiElements() {
-        performTouchGesture {
-            click(characterPosition(13))
-        }
+        performTouchGesture { click(characterPosition(13)) }
 
         asserter.applyAndAssert {
             selection = 13.collapsed
@@ -1056,21 +935,15 @@
 
         enterMouseMode()
 
-        asserter.applyAndAssert {
-            cursorHandleShown = false
-        }
+        asserter.applyAndAssert { cursorHandleShown = false }
     }
 
     // Regression test for when this instead selected the current and next (if any) paragraph.
     @Test
     fun whenMouse_thenTripleClickInEndPadding_selectsCurrentParagraph() {
-        performMouseGesture {
-            repeat(3) { click(centerEnd) }
-        }
+        performMouseGesture { repeat(3) { click(centerEnd) } }
 
-        asserter.applyAndAssert {
-            selection = 6 to 23
-        }
+        asserter.applyAndAssert { selection = 6 to 23 }
     }
 
     @Test
@@ -1080,9 +953,7 @@
 
         performTouchGesture { click(characterPosition(13)) }
 
-        asserter.applyAndAssert {
-            selection = 13.collapsed
-        }
+        asserter.applyAndAssert { selection = 13.collapsed }
     }
 
     @Test
@@ -1114,9 +985,7 @@
 
         performMouseGesture { click(characterPosition(13)) }
 
-        asserter.applyAndAssert {
-            selection = 13.collapsed
-        }
+        asserter.applyAndAssert { selection = 13.collapsed }
     }
 
     @Test
@@ -1124,13 +993,9 @@
         readOnly = true
         rule.waitForIdle()
 
-        performMouseGesture {
-            repeat(2) { click(characterPosition(13)) }
-        }
+        performMouseGesture { repeat(2) { click(characterPosition(13)) } }
 
-        asserter.applyAndAssert {
-            selection = 12 to 17
-        }
+        asserter.applyAndAssert { selection = 12 to 17 }
     }
 
     @Test
@@ -1138,13 +1003,9 @@
         readOnly = true
         rule.waitForIdle()
 
-        performMouseGesture {
-            repeat(3) { click(characterPosition(13)) }
-        }
+        performMouseGesture { repeat(3) { click(characterPosition(13)) } }
 
-        asserter.applyAndAssert {
-            selection = 6 to 23
-        }
+        asserter.applyAndAssert { selection = 6 to 23 }
     }
 
     @Test
@@ -1182,9 +1043,7 @@
         enabled = false
         rule.waitForIdle()
 
-        performMouseGesture {
-            repeat(2) { click(characterPosition(13)) }
-        }
+        performMouseGesture { repeat(2) { click(characterPosition(13)) } }
         asserter.assert()
     }
 
@@ -1193,9 +1052,7 @@
         enabled = false
         rule.waitForIdle()
 
-        performMouseGesture {
-            repeat(3) { click(characterPosition(13)) }
-        }
+        performMouseGesture { repeat(3) { click(characterPosition(13)) } }
         asserter.assert()
     }
 }
diff --git a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/selection/gestures/TextFieldSelectionHandlesGesturesTest.kt b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/selection/gestures/TextFieldSelectionHandlesGesturesTest.kt
index 65a7b16..c722a17 100644
--- a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/selection/gestures/TextFieldSelectionHandlesGesturesTest.kt
+++ b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/selection/gestures/TextFieldSelectionHandlesGesturesTest.kt
@@ -60,28 +60,25 @@
             value = textFieldValue.value,
             onValueChange = { textFieldValue.value = it },
             textStyle = TextStyle(fontFamily = fontFamily, fontSize = fontSize),
-            modifier = Modifier
-                .fillMaxWidth()
-                .testTag(pointerAreaTag),
+            modifier = Modifier.fillMaxWidth().testTag(pointerAreaTag),
         )
     }
 
     @Before
     fun setupAsserter() {
-        asserter = TextField1SelectionAsserter(
-            textContent = textContent,
-            rule = rule,
-            textToolbar = textToolbar,
-            hapticFeedback = hapticFeedback,
-            getActual = { textFieldValue.value }
-        )
+        asserter =
+            TextField1SelectionAsserter(
+                textContent = textContent,
+                rule = rule,
+                textToolbar = textToolbar,
+                hapticFeedback = hapticFeedback,
+                getActual = { textFieldValue.value }
+            )
     }
 
     @Test
     fun whenTouchHandle_magnifierReplacesToolbar() {
-        performTouchGesture {
-            longClick(characterPosition(13))
-        }
+        performTouchGesture { longClick(characterPosition(13)) }
 
         asserter.applyAndAssert {
             selection = 12 to 17
@@ -171,9 +168,7 @@
         rule.waitForIdle()
         asserter.applyAndAssert { textContent = content }
 
-        performTouchGesture {
-            longClick(characterPosition(content.lastIndex))
-        }
+        performTouchGesture { longClick(characterPosition(content.lastIndex)) }
 
         asserter.applyAndAssert {
             selection = 0 to content.length
@@ -201,13 +196,14 @@
     }
 
     private fun HandlePressedScope.moveHandleToCharacter(characterOffset: Int) {
-        val destinationPosition = characterBox(characterOffset).run {
-            when (fetchHandleInfo().handle) {
-                Handle.SelectionStart -> bottomLeft.nudge(HorizontalDirection.END)
-                Handle.SelectionEnd -> bottomLeft.nudge(HorizontalDirection.START)
-                Handle.Cursor -> fail("Unexpected handle ${Handle.Cursor}")
+        val destinationPosition =
+            characterBox(characterOffset).run {
+                when (fetchHandleInfo().handle) {
+                    Handle.SelectionStart -> bottomLeft.nudge(HorizontalDirection.END)
+                    Handle.SelectionEnd -> bottomLeft.nudge(HorizontalDirection.START)
+                    Handle.Cursor -> fail("Unexpected handle ${Handle.Cursor}")
+                }
             }
-        }
         moveHandleTo(destinationPosition)
     }
 
diff --git a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/selection/gestures/TextSelectionGesturesBidiTest.kt b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/selection/gestures/TextSelectionGesturesBidiTest.kt
index 841ea7e..76919a3 100644
--- a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/selection/gestures/TextSelectionGesturesBidiTest.kt
+++ b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/selection/gestures/TextSelectionGesturesBidiTest.kt
@@ -46,8 +46,7 @@
     protected abstract val textContent: MutableState<String>
     protected abstract var asserter: TextSelectionAsserter
 
-    @Composable
-    abstract fun TextContent()
+    @Composable abstract fun TextContent()
 
     @Composable
     override fun Content() {
@@ -64,9 +63,7 @@
 
     @Test
     fun whenTouch_withLongPress_selectsSingleWord() {
-        performTouchGesture {
-            longClick(characterPosition(26, isRtl = false))
-        }
+        performTouchGesture { longClick(characterPosition(26, isRtl = false)) }
 
         asserter.applyAndAssert {
             selection = 24 to 29
@@ -156,9 +153,7 @@
         backwardSelection: TextRange?,
         backwardEndDirection: ResolvedTextDirection,
     ) {
-        performTouchGesture {
-            longPress(characterPosition(26, isRtl = false))
-        }
+        performTouchGesture { longPress(characterPosition(26, isRtl = false)) }
 
         asserter.applyAndAssert {
             selection = 24 to 29
@@ -183,9 +178,7 @@
             if (forwardSelection != backwardSelection) hapticsCount++
         }
 
-        performTouchGesture {
-            up()
-        }
+        performTouchGesture { up() }
 
         asserter.applyAndAssert {
             textToolbarShown = true
@@ -195,13 +188,9 @@
 
     @Test
     fun whenMouse_withSingleClick_collapsedSelectionAtClick() {
-        performMouseGesture {
-            click(characterPosition(26, isRtl = false))
-        }
+        performMouseGesture { click(characterPosition(26, isRtl = false)) }
 
-        asserter.applyAndAssert {
-            selection = 26.collapsed
-        }
+        asserter.applyAndAssert { selection = 26.collapsed }
     }
 
     @Test
@@ -211,13 +200,9 @@
             press()
         }
 
-        asserter.applyAndAssert {
-            selection = 26.collapsed
-        }
+        asserter.applyAndAssert { selection = 26.collapsed }
 
-        performMouseGesture {
-            release()
-        }
+        performMouseGesture { release() }
 
         asserter.assert()
     }
@@ -254,10 +239,7 @@
         )
     }
 
-    private fun mouseSingleClickThenDragTest(
-        endOffset: Offset,
-        endSelection: TextRange?
-    ) {
+    private fun mouseSingleClickThenDragTest(endOffset: Offset, endSelection: TextRange?) {
         mouseClicksThenDragTest(
             numClicks = 1,
             firstOffset = characterPosition(26, isRtl = false),
@@ -272,13 +254,9 @@
 
     @Test
     fun whenMouse_withDoubleClick_selectsWord() {
-        performMouseGesture {
-            repeat(2) { click(characterPosition(26, isRtl = false)) }
-        }
+        performMouseGesture { repeat(2) { click(characterPosition(26, isRtl = false)) } }
 
-        asserter.applyAndAssert {
-            selection = 24 to 29
-        }
+        asserter.applyAndAssert { selection = 24 to 29 }
     }
 
     @Test
@@ -336,9 +314,7 @@
 
     @Test
     fun whenMouse_withTripleClick_selectsParagraph() {
-        performMouseGesture {
-            repeat(3) { click(characterPosition(26, isRtl = false)) }
-        }
+        performMouseGesture { repeat(3) { click(characterPosition(26, isRtl = false)) } }
 
         asserter.applyAndAssert {
             selection = 18 to 35
@@ -435,9 +411,7 @@
             endLayoutDirection = secondEndDirection
         }
 
-        performMouseGesture {
-            release()
-        }
+        performMouseGesture { release() }
 
         asserter.assert()
     }
diff --git a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/selection/gestures/TextSelectionGesturesTest.kt b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/selection/gestures/TextSelectionGesturesTest.kt
index 892e82f..2c012de 100644
--- a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/selection/gestures/TextSelectionGesturesTest.kt
+++ b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/selection/gestures/TextSelectionGesturesTest.kt
@@ -52,8 +52,7 @@
     protected abstract val textContent: MutableState<String>
     protected abstract var asserter: TextSelectionAsserter
 
-    @Composable
-    abstract fun TextContent()
+    @Composable abstract fun TextContent()
 
     @Composable
     override fun Content() {
@@ -70,9 +69,7 @@
 
     @Test
     fun whenTouch_withLongPressOutOfBounds_nothingHappens() {
-        performTouchGesture {
-            longPress(topStart.nudge(yDirection = UP))
-        }
+        performTouchGesture { longPress(topStart.nudge(yDirection = UP)) }
 
         asserter.assert()
         touchDragTo(topEnd.nudge(yDirection = UP))
@@ -86,13 +83,9 @@
         asserter.textContent = content
         rule.waitForIdle()
 
-        performTouchGesture {
-            longClick(center)
-        }
+        performTouchGesture { longClick(center) }
 
-        asserter.applyAndAssert {
-            selection = 0.collapsed
-        }
+        asserter.applyAndAssert { selection = 0.collapsed }
     }
 
     @Test
@@ -102,21 +95,15 @@
         asserter.textContent = content
         rule.waitForIdle()
 
-        performTouchGesture {
-            longPress(center)
-        }
+        performTouchGesture { longPress(center) }
 
-        asserter.applyAndAssert {
-            selection = 0.collapsed
-        }
+        asserter.applyAndAssert { selection = 0.collapsed }
 
         touchDragTo(centerStart)
 
         asserter.assert()
 
-        performTouchGesture {
-            up()
-        }
+        performTouchGesture { up() }
 
         asserter.assert()
     }
@@ -128,9 +115,7 @@
         asserter.textContent = content
         rule.waitForIdle()
 
-        performTouchGesture {
-            longPress(centerEnd)
-        }
+        performTouchGesture { longPress(centerEnd) }
 
         asserter.applyAndAssert {
             selection = 6.collapsed
@@ -142,9 +127,7 @@
 
         asserter.assert()
 
-        performTouchGesture {
-            up()
-        }
+        performTouchGesture { up() }
 
         asserter.assert()
     }
@@ -156,9 +139,7 @@
         asserter.textContent = content
         rule.waitForIdle()
 
-        performTouchGesture {
-            longPress(bottomEnd)
-        }
+        performTouchGesture { longPress(bottomEnd) }
 
         asserter.applyAndAssert {
             selection = 7.collapsed
@@ -188,9 +169,7 @@
 
         touchDragTo(topStart)
 
-        asserter.applyAndAssert {
-            magnifierShown = true
-        }
+        asserter.applyAndAssert { magnifierShown = true }
 
         touchDragTo(topEnd)
 
@@ -208,9 +187,7 @@
 
     @Test
     fun whenTouch_withLongPressThenClear_noSelection() {
-        performTouchGesture {
-            longClick(characterPosition(13))
-        }
+        performTouchGesture { longClick(characterPosition(13)) }
 
         asserter.applyAndAssert {
             selection = 12 to 17
@@ -219,9 +196,7 @@
             hapticsCount++
         }
 
-        performTouchGesture {
-            click(characterPosition(14))
-        }
+        performTouchGesture { click(characterPosition(14)) }
 
         asserter.applyAndAssert {
             selection = null
@@ -233,9 +208,7 @@
 
     @Test
     fun whenTouch_withLongPressThenDragLeftOutOfBoundsUpAndDown_selectsLines() {
-        performTouchGesture {
-            longPress(characterPosition(9))
-        }
+        performTouchGesture { longPress(characterPosition(9)) }
 
         // anchor starts at beginning of middle line
         asserter.applyAndAssert {
@@ -270,9 +243,7 @@
 
     @Test
     fun whenTouch_withLongPress_selectsSingleWord() {
-        performTouchGesture {
-            longClick(characterPosition(13))
-        }
+        performTouchGesture { longClick(characterPosition(13)) }
 
         asserter.applyAndAssert {
             selection = 12 to 17
@@ -288,9 +259,7 @@
         asserter.textToolbarShown = true
 
         fun longClickCharacterPositionThenApplyAndAssert(offset: Int, selection: TextRange) {
-            performTouchGesture {
-                longClick(characterPosition(offset))
-            }
+            performTouchGesture { longClick(characterPosition(offset)) }
 
             asserter.applyAndAssert {
                 this.selection = selection
@@ -349,9 +318,7 @@
         backwardOffset: Offset,
         expectedSelection: TextRange?,
     ) {
-        performTouchGesture {
-            longPress(characterPosition(13))
-        }
+        performTouchGesture { longPress(characterPosition(13)) }
 
         asserter.applyAndAssert {
             selection = 12 to 17
@@ -371,9 +338,7 @@
 
         asserter.assert()
 
-        performTouchGesture {
-            up()
-        }
+        performTouchGesture { up() }
 
         asserter.applyAndAssert {
             textToolbarShown = true
@@ -409,9 +374,7 @@
         endOffset: Offset,
         endSelection: TextRange,
     ) {
-        performTouchGesture {
-            longPress(characterPosition(13))
-        }
+        performTouchGesture { longPress(characterPosition(13)) }
 
         asserter.applyAndAssert {
             selection = 12 to 17
@@ -428,20 +391,14 @@
             hapticsCount++
         }
 
-        performTouchGesture {
-            up()
-        }
+        performTouchGesture { up() }
 
-        asserter.applyAndAssert {
-            textToolbarShown = true
-        }
+        asserter.applyAndAssert { textToolbarShown = true }
     }
 
     @Test
     fun whenTouch_withLongPressInEndPadding_entersSelectionMode() {
-        performTouchGesture {
-            longPress(topEnd)
-        }
+        performTouchGesture { longPress(topEnd) }
 
         asserter.applyAndAssert {
             selection = 0 to 5
@@ -454,20 +411,14 @@
 
         asserter.assert()
 
-        performTouchGesture {
-            up()
-        }
+        performTouchGesture { up() }
 
-        asserter.applyAndAssert {
-            textToolbarShown = true
-        }
+        asserter.applyAndAssert { textToolbarShown = true }
     }
 
     @Test
     fun whenTouch_withLongPressInEndPaddingThenDragToUpperEndPadding_selectsParagraphAndNewLine() {
-        performTouchGesture {
-            longPress(centerEnd)
-        }
+        performTouchGesture { longPress(centerEnd) }
 
         asserter.applyAndAssert {
             selection = 18 to 23
@@ -498,20 +449,14 @@
             hapticsCount++
         }
 
-        performTouchGesture {
-            up()
-        }
+        performTouchGesture { up() }
 
-        asserter.applyAndAssert {
-            textToolbarShown = true
-        }
+        asserter.applyAndAssert { textToolbarShown = true }
     }
 
     @Test
     fun whenTouch_withLongPressInEndPaddingThenDragToLowerEndPadding_selectsNewLineAndParagraph() {
-        performTouchGesture {
-            longPress(centerEnd)
-        }
+        performTouchGesture { longPress(centerEnd) }
 
         asserter.applyAndAssert {
             selection = 18 to 23
@@ -542,20 +487,14 @@
             hapticsCount++
         }
 
-        performTouchGesture {
-            up()
-        }
+        performTouchGesture { up() }
 
-        asserter.applyAndAssert {
-            textToolbarShown = true
-        }
+        asserter.applyAndAssert { textToolbarShown = true }
     }
 
     @Test
     fun whenTouch_withLongPressInEndPaddingOfFinalLine_entersSelectionMode() {
-        performTouchGesture {
-            longPress(bottomEnd)
-        }
+        performTouchGesture { longPress(bottomEnd) }
 
         asserter.applyAndAssert {
             selection = 24 to 29
@@ -568,22 +507,16 @@
 
         asserter.assert()
 
-        performTouchGesture {
-            up()
-        }
+        performTouchGesture { up() }
 
-        asserter.applyAndAssert {
-            textToolbarShown = true
-        }
+        asserter.applyAndAssert { textToolbarShown = true }
     }
 
     // regression test for abnormal selection behavior when dragging
     // from bottom to middle end padding
     @Test
     fun whenTouch_withLongPressInFinalLineEndPaddingThenDragToMidEndPadding_entersSelectionMode() {
-        performTouchGesture {
-            longPress(bottomEnd)
-        }
+        performTouchGesture { longPress(bottomEnd) }
 
         asserter.applyAndAssert {
             selection = 24 to 29
@@ -614,21 +547,15 @@
             hapticsCount++
         }
 
-        performTouchGesture {
-            up()
-        }
+        performTouchGesture { up() }
 
-        asserter.applyAndAssert {
-            textToolbarShown = true
-        }
+        asserter.applyAndAssert { textToolbarShown = true }
     }
 
     // Regression test for a touch long press in end padding selecting the entire Text
     @Test
     fun whenTouch_withLongPressInEndPadding_selectsFinalWord() {
-        performTouchGesture {
-            longPress(centerEnd)
-        }
+        performTouchGesture { longPress(centerEnd) }
 
         asserter.applyAndAssert {
             selection = 18 to 23
@@ -636,36 +563,24 @@
             hapticsCount++
         }
 
-        performTouchGesture {
-            up()
-        }
+        performTouchGesture { up() }
 
-        asserter.applyAndAssert {
-            textToolbarShown = true
-        }
+        asserter.applyAndAssert { textToolbarShown = true }
     }
 
     // Regression test for a mouse long click resulting in touch behaviors for selection.
     @Test
     fun whenMouse_withLongClick_collapsedSelectionAtClick() {
-        performMouseGesture {
-            longClick(characterPosition(13))
-        }
+        performMouseGesture { longClick(characterPosition(13)) }
 
-        asserter.applyAndAssert {
-            selection = 13.collapsed
-        }
+        asserter.applyAndAssert { selection = 13.collapsed }
     }
 
     @Test
     fun whenMouse_withClick_collapsedSelectionAtClick() {
-        performMouseGesture {
-            click(characterPosition(13))
-        }
+        performMouseGesture { click(characterPosition(13)) }
 
-        asserter.applyAndAssert {
-            selection = 13.collapsed
-        }
+        asserter.applyAndAssert { selection = 13.collapsed }
     }
 
     @Test
@@ -675,13 +590,9 @@
             press()
         }
 
-        asserter.applyAndAssert {
-            selection = 13.collapsed
-        }
+        asserter.applyAndAssert { selection = 13.collapsed }
 
-        performMouseGesture {
-            release()
-        }
+        performMouseGesture { release() }
 
         asserter.assert()
     }
@@ -718,10 +629,7 @@
         )
     }
 
-    private fun mouseSingleClickThenDragTest(
-        endOffset: Offset,
-        endSelection: TextRange?
-    ) {
+    private fun mouseSingleClickThenDragTest(endOffset: Offset, endSelection: TextRange?) {
         mouseClicksThenDragTest(
             numClicks = 1,
             startOffset = characterPosition(13),
@@ -733,13 +641,9 @@
 
     @Test
     fun whenMouse_withDoubleClick_selectsWord() {
-        performMouseGesture {
-            repeat(2) { click(characterPosition(13)) }
-        }
+        performMouseGesture { repeat(2) { click(characterPosition(13)) } }
 
-        asserter.applyAndAssert {
-            selection = 12 to 17
-        }
+        asserter.applyAndAssert { selection = 12 to 17 }
     }
 
     @Test
@@ -774,10 +678,7 @@
         )
     }
 
-    private fun mouseDoubleClickThenDragTest(
-        endOffset: Offset,
-        endSelection: TextRange?
-    ) {
+    private fun mouseDoubleClickThenDragTest(endOffset: Offset, endSelection: TextRange?) {
         mouseClicksThenDragTest(
             numClicks = 2,
             startOffset = characterPosition(13),
@@ -789,13 +690,9 @@
 
     @Test
     fun whenMouse_withTripleClick_selectsParagraph() {
-        performMouseGesture {
-            repeat(3) { click(characterPosition(13)) }
-        }
+        performMouseGesture { repeat(3) { click(characterPosition(13)) } }
 
-        asserter.applyAndAssert {
-            selection = 6 to 23
-        }
+        asserter.applyAndAssert { selection = 6 to 23 }
     }
 
     @Test
@@ -830,10 +727,7 @@
         )
     }
 
-    private fun mouseTripleClickThenDragTest(
-        endOffset: Offset,
-        endSelection: TextRange?
-    ) {
+    private fun mouseTripleClickThenDragTest(endOffset: Offset, endSelection: TextRange?) {
         mouseClicksThenDragTest(
             numClicks = 3,
             startOffset = characterPosition(13),
@@ -862,19 +756,13 @@
             }
         }
 
-        asserter.applyAndAssert {
-            selection = startSelection
-        }
+        asserter.applyAndAssert { selection = startSelection }
 
         mouseDragTo(endOffset)
 
-        asserter.applyAndAssert {
-            selection = endSelection
-        }
+        asserter.applyAndAssert { selection = endSelection }
 
-        performMouseGesture {
-            release()
-        }
+        performMouseGesture { release() }
 
         asserter.assert()
     }
@@ -903,10 +791,7 @@
         )
     }
 
-    private fun mouseClickThenDragUpToPaddingTest(
-        numClicks: Int,
-        endSelection: TextRange?
-    ) {
+    private fun mouseClickThenDragUpToPaddingTest(numClicks: Int, endSelection: TextRange?) {
         performMouseGesture {
             moveTo(position = characterPosition(13))
             press()
@@ -920,24 +805,16 @@
 
         mouseDragTo(position = topEnd)
 
-        asserter.applyAndAssert {
-            selection = endSelection
-        }
+        asserter.applyAndAssert { selection = endSelection }
     }
 
     @Test
     fun whenMouse_thenTouch_touchBehaviorsAppear() {
-        performMouseGesture {
-            repeat(2) { click(characterPosition(13)) }
-        }
+        performMouseGesture { repeat(2) { click(characterPosition(13)) } }
 
-        asserter.applyAndAssert {
-            selection = 12 to 17
-        }
+        asserter.applyAndAssert { selection = 12 to 17 }
 
-        performTouchGesture {
-            enterTouchMode()
-        }
+        performTouchGesture { enterTouchMode() }
 
         asserter.applyAndAssert {
             selectionHandlesShown = true
@@ -947,9 +824,7 @@
 
     @Test
     fun whenTouch_thenMouse_touchBehaviorsDisappear() {
-        performTouchGesture {
-            longClick(characterPosition(13))
-        }
+        performTouchGesture { longClick(characterPosition(13)) }
 
         asserter.applyAndAssert {
             selection = 12 to 17
@@ -969,26 +844,18 @@
     // Regression test for when this would result in text toolbar showing instead of the cursor.
     @Test
     fun whenMouseCollapsedSelection_thenTouch_noUiElements() {
-        performMouseGesture {
-            click(characterPosition(13))
-        }
+        performMouseGesture { click(characterPosition(13)) }
 
-        asserter.applyAndAssert {
-            selection = 13.collapsed
-        }
+        asserter.applyAndAssert { selection = 13.collapsed }
 
-        performTouchGesture {
-            enterTouchMode()
-        }
+        performTouchGesture { enterTouchMode() }
 
         asserter.assert()
     }
 
     @Test
     fun whenTouchCollapsedSelection_thenMouse_noUiElements() {
-        performTouchGesture {
-            click(characterPosition(13))
-        }
+        performTouchGesture { click(characterPosition(13)) }
 
         asserter.assert()
         enterMouseMode()
@@ -1003,19 +870,13 @@
             press()
         }
 
-        asserter.applyAndAssert {
-            selection = 23.collapsed
-        }
+        asserter.applyAndAssert { selection = 23.collapsed }
 
         mouseDragTo(characterPosition(offset = 24))
 
-        asserter.applyAndAssert {
-            selection = 23 to 24
-        }
+        asserter.applyAndAssert { selection = 23 to 24 }
 
-        performTouchGesture {
-            enterTouchMode()
-        }
+        performTouchGesture { enterTouchMode() }
 
         asserter.applyAndAssert {
             selectionHandlesShown = true
@@ -1037,8 +898,6 @@
             release()
         }
 
-        asserter.applyAndAssert {
-            selection = 6 to 23
-        }
+        asserter.applyAndAssert { selection = 6 to 23 }
     }
 }
diff --git a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/selection/gestures/TextSelectionHandlesGesturesTest.kt b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/selection/gestures/TextSelectionHandlesGesturesTest.kt
index 3346418..aa1acafe 100644
--- a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/selection/gestures/TextSelectionHandlesGesturesTest.kt
+++ b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/selection/gestures/TextSelectionHandlesGesturesTest.kt
@@ -59,23 +59,25 @@
 
     @Before
     fun setupAsserter() {
-        asserter = object : TextSelectionAsserter(
-            textContent = textContent.value,
-            rule = rule,
-            textToolbar = textToolbar,
-            hapticFeedback = hapticFeedback,
-            getActual = { currentSelection.value },
-        ) {
-            override fun subAssert() {
-                Truth.assertAbout(SelectionSubject.withContent(textContent))
-                    .that(getActual())
-                    .hasSelection(
-                        expected = selection,
-                        startTextDirection = startLayoutDirection,
-                        endTextDirection = endLayoutDirection,
-                    )
+        asserter =
+            object :
+                TextSelectionAsserter(
+                    textContent = textContent.value,
+                    rule = rule,
+                    textToolbar = textToolbar,
+                    hapticFeedback = hapticFeedback,
+                    getActual = { currentSelection.value },
+                ) {
+                override fun subAssert() {
+                    Truth.assertAbout(SelectionSubject.withContent(textContent))
+                        .that(getActual())
+                        .hasSelection(
+                            expected = selection,
+                            startTextDirection = startLayoutDirection,
+                            endTextDirection = endLayoutDirection,
+                        )
+                }
             }
-        }
     }
 
     @Composable
@@ -87,14 +89,12 @@
         ) {
             BasicText(
                 text = textContent.value,
-                style = TextStyle(
-                    fontFamily = fontFamily,
-                    fontSize = fontSize,
-                ),
-                modifier = Modifier
-                    .fillMaxWidth()
-                    .wrapContentHeight()
-                    .testTag(pointerAreaTag),
+                style =
+                    TextStyle(
+                        fontFamily = fontFamily,
+                        fontSize = fontSize,
+                    ),
+                modifier = Modifier.fillMaxWidth().wrapContentHeight().testTag(pointerAreaTag),
             )
         }
     }
@@ -105,9 +105,7 @@
     @SdkSuppress(minSdkVersion = 23)
     @Test
     fun whenTouchHandle_verifyOneCharStaysSelected_withinLine() {
-        performTouchGesture {
-            longClick(characterPosition(14))
-        }
+        performTouchGesture { longClick(characterPosition(14)) }
 
         asserter.applyAndAssert {
             selection = 12 to 17
@@ -144,9 +142,7 @@
 
     @Test
     fun whenTouchHandle_magnifierReplacesToolbar() {
-        performTouchGesture {
-            longClick(characterBox(13).centerLeft)
-        }
+        performTouchGesture { longClick(characterBox(13).centerLeft) }
 
         asserter.applyAndAssert {
             selection = 12 to 17
@@ -238,9 +234,7 @@
         rule.waitForIdle()
         asserter.applyAndAssert { textContent = content }
 
-        performTouchGesture {
-            longClick(characterPosition(content.lastIndex))
-        }
+        performTouchGesture { longClick(characterPosition(content.lastIndex)) }
 
         asserter.applyAndAssert {
             selection = 0 to content.length
@@ -268,13 +262,14 @@
     }
 
     private fun HandlePressedScope.moveHandleToCharacter(characterOffset: Int) {
-        val destinationPosition = characterBox(characterOffset).run {
-            when (fetchHandleInfo().handle) {
-                Handle.SelectionStart -> bottomLeft.nudge(HorizontalDirection.END)
-                Handle.SelectionEnd -> bottomLeft.nudge(HorizontalDirection.START)
-                Handle.Cursor -> fail("Unexpected handle ${Handle.Cursor}")
+        val destinationPosition =
+            characterBox(characterOffset).run {
+                when (fetchHandleInfo().handle) {
+                    Handle.SelectionStart -> bottomLeft.nudge(HorizontalDirection.END)
+                    Handle.SelectionEnd -> bottomLeft.nudge(HorizontalDirection.START)
+                    Handle.Cursor -> fail("Unexpected handle ${Handle.Cursor}")
+                }
             }
-        }
         moveHandleTo(destinationPosition)
     }
 
diff --git a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/selection/gestures/util/MultiTextSelectionTestUtils.kt b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/selection/gestures/util/MultiTextSelectionTestUtils.kt
index 8f1cebc..5fb23b7 100644
--- a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/selection/gestures/util/MultiTextSelectionTestUtils.kt
+++ b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/selection/gestures/util/MultiTextSelectionTestUtils.kt
@@ -38,10 +38,9 @@
     companion object {
         fun withContent(
             texts: List<Pair<String, String>>
-        ): Factory<MultiSelectionSubject, Selection?> =
-            Factory { failureMetadata, subject ->
-                MultiSelectionSubject(failureMetadata, subject, texts)
-            }
+        ): Factory<MultiSelectionSubject, Selection?> = Factory { failureMetadata, subject ->
+            MultiSelectionSubject(failureMetadata, subject, texts)
+        }
     }
 
     fun hasSelection(
@@ -64,12 +63,14 @@
         val startAnchor =
             Selection.AnchorInfo(startTextDirection, startOffset, startSelectableId.toLong())
         val endAnchor = Selection.AnchorInfo(endTextDirection, endOffset, endSelectableId.toLong())
-        val expectedSelection = Selection(
-            start = startAnchor,
-            end = endAnchor,
-            handlesCrossed = startSelectableId > endSelectableId ||
-                (startSelectableId == endSelectableId && startOffset > endOffset),
-        )
+        val expectedSelection =
+            Selection(
+                start = startAnchor,
+                end = endAnchor,
+                handlesCrossed =
+                    startSelectableId > endSelectableId ||
+                        (startSelectableId == endSelectableId && startOffset > endOffset),
+            )
 
         if (subject!! != expectedSelection) {
             failWithActual(
@@ -85,36 +86,42 @@
     private val Selection.AnchorInfo.stringIndex
         get() = textContentIndices[selectableId.toInt() - 1].first + offset
 
-    private val Selection.minStringIndex get() = min(start.stringIndex, end.stringIndex)
-    private val Selection.maxStringIndex get() = max(start.stringIndex, end.stringIndex)
+    private val Selection.minStringIndex
+        get() = min(start.stringIndex, end.stringIndex)
+
+    private val Selection.maxStringIndex
+        get() = max(start.stringIndex, end.stringIndex)
 
     private fun Selection.multiTextToString(texts: List<Pair<String, String>>): String {
         val content = texts.joinToString(separator = "\n") { it.first }
         val collapsedSelection = start.stringIndex == end.stringIndex
-        val selectionString = content
-            .map { if (it == '\n') '\n' else '.' }
-            .joinToString("")
-            .let {
-                if (collapsedSelection) {
-                    if (start.stringIndex == content.length) {
-                        // edge case of selection being at end of text,
-                        // so append the marker instead of replacing
-                        "$it|"
-                    } else if (content[start.stringIndex] == '\n') {
-                        it.replaceRange(start.stringIndex..start.stringIndex, "|\n")
+        val selectionString =
+            content
+                .map { if (it == '\n') '\n' else '.' }
+                .joinToString("")
+                .let {
+                    if (collapsedSelection) {
+                        if (start.stringIndex == content.length) {
+                            // edge case of selection being at end of text,
+                            // so append the marker instead of replacing
+                            "$it|"
+                        } else if (content[start.stringIndex] == '\n') {
+                            it.replaceRange(start.stringIndex..start.stringIndex, "|\n")
+                        } else {
+                            it.replaceRange(start.stringIndex..start.stringIndex, "|")
+                        }
                     } else {
-                        it.replaceRange(start.stringIndex..start.stringIndex, "|")
+                        val selectionRange = minStringIndex until maxStringIndex
+                        it.replaceRange(selectionRange, content.substring(selectionRange))
                     }
-                } else {
-                    val selectionRange = minStringIndex until maxStringIndex
-                    it.replaceRange(selectionRange, content.substring(selectionRange))
                 }
-            }
         return """
                 |Collapsed = $collapsedSelection
                 |Selection = $this
                 |$selectionString
-            """.trimMargin().trim()
+            """
+            .trimMargin()
+            .trim()
     }
 }
 
@@ -124,6 +131,7 @@
         .map { (prev, next) -> prev until next }
 
 internal fun List<IntRange>.offsetToSelectableId(i: Int) = getIndexRange(i).index
+
 internal fun List<IntRange>.offsetToLocalOffset(i: Int): Int = i - getIndexRange(i).value.first
 
 private fun List<IntRange>.getIndexRange(i: Int): IndexedValue<IntRange> =
diff --git a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/selection/gestures/util/SingleTextSelectionTestUtils.kt b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/selection/gestures/util/SingleTextSelectionTestUtils.kt
index a28640f..f29bc3a 100644
--- a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/selection/gestures/util/SingleTextSelectionTestUtils.kt
+++ b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/selection/gestures/util/SingleTextSelectionTestUtils.kt
@@ -27,8 +27,10 @@
 import kotlin.math.max
 import kotlin.math.min
 
-private val Selection.min get() = min(start.offset, end.offset)
-private val Selection.max get() = max(start.offset, end.offset)
+private val Selection.min
+    get() = min(start.offset, end.offset)
+private val Selection.max
+    get() = max(start.offset, end.offset)
 
 internal class SelectionSubject(
     failureMetadata: FailureMetadata?,
@@ -58,11 +60,12 @@
 
         val startHandle = Selection.AnchorInfo(startTextDirection, expected.start, 1)
         val endHandle = Selection.AnchorInfo(endTextDirection, expected.end, 1)
-        val expectedSelection = Selection(
-            start = startHandle,
-            end = endHandle,
-            handlesCrossed = expected.start > expected.end,
-        )
+        val expectedSelection =
+            Selection(
+                start = startHandle,
+                end = endHandle,
+                handlesCrossed = expected.start > expected.end,
+            )
         if (subject != expectedSelection) {
             failWithActual(
                 Fact.simpleFact("expected equal selections"),
@@ -77,28 +80,31 @@
 
 private fun Selection.textToString(content: String): String {
     val collapsedSelection = start.offset == end.offset
-    val selectionString = content
-        .map { if (it == '\n') '\n' else '.' }
-        .joinToString("")
-        .let {
-            if (collapsedSelection) {
-                if (start.offset == content.length) {
-                    // edge case of selection being at end of text,
-                    // so append the marker instead of replacing
-                    "$it|"
-                } else if (content[start.offset] == '\n') {
-                    it.replaceRange(start.offset..start.offset, "|\n")
+    val selectionString =
+        content
+            .map { if (it == '\n') '\n' else '.' }
+            .joinToString("")
+            .let {
+                if (collapsedSelection) {
+                    if (start.offset == content.length) {
+                        // edge case of selection being at end of text,
+                        // so append the marker instead of replacing
+                        "$it|"
+                    } else if (content[start.offset] == '\n') {
+                        it.replaceRange(start.offset..start.offset, "|\n")
+                    } else {
+                        it.replaceRange(start.offset..start.offset, "|")
+                    }
                 } else {
-                    it.replaceRange(start.offset..start.offset, "|")
+                    val selectionRange = min until max
+                    it.replaceRange(selectionRange, content.substring(selectionRange))
                 }
-            } else {
-                val selectionRange = min until max
-                it.replaceRange(selectionRange, content.substring(selectionRange))
             }
-        }
     return """
                 |Collapsed = $collapsedSelection
                 |Selection = $this
                 |$selectionString
-            """.trimMargin().trim()
+            """
+        .trimMargin()
+        .trim()
 }
diff --git a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/selection/gestures/util/TextFieldSelectionTestUtils.kt b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/selection/gestures/util/TextFieldSelectionTestUtils.kt
index 2aaa511..7bf7c07 100644
--- a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/selection/gestures/util/TextFieldSelectionTestUtils.kt
+++ b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/selection/gestures/util/TextFieldSelectionTestUtils.kt
@@ -77,30 +77,33 @@
     override fun actualCustomStringRepresentation(): String = subject.customToString()
 
     private fun TextFieldValue.customToString(): String {
-        val selectionString = text
-            .map { if (it == '\n') '\n' else '.' }
-            .joinToString("")
-            .let {
-                if (selection.collapsed) {
-                    if (selection.start == text.length) {
-                        // edge case of selection being at end of text,
-                        // so append the marker instead of replacing
-                        "$it|"
-                    } else if (it[selection.start] == '\n') {
-                        // edge case of selection being at end of a line,
-                        // so append the marker to the EOL and then add the new line
-                        it.replaceRange(selection.start..selection.start, "|\n")
+        val selectionString =
+            text
+                .map { if (it == '\n') '\n' else '.' }
+                .joinToString("")
+                .let {
+                    if (selection.collapsed) {
+                        if (selection.start == text.length) {
+                            // edge case of selection being at end of text,
+                            // so append the marker instead of replacing
+                            "$it|"
+                        } else if (it[selection.start] == '\n') {
+                            // edge case of selection being at end of a line,
+                            // so append the marker to the EOL and then add the new line
+                            it.replaceRange(selection.start..selection.start, "|\n")
+                        } else {
+                            it.replaceRange(selection.start..selection.start, "|")
+                        }
                     } else {
-                        it.replaceRange(selection.start..selection.start, "|")
+                        it.replaceRange(selection.min until selection.max, getSelectedText().text)
                     }
-                } else {
-                    it.replaceRange(selection.min until selection.max, getSelectedText().text)
                 }
-            }
         return """
                 /Selection = ${selection.start} to ${selection.end}
                 /$selectionString
-            """.trimMargin(marginPrefix = "/").trim()
+            """
+            .trimMargin(marginPrefix = "/")
+            .trim()
     }
 }
 
@@ -110,13 +113,14 @@
     textToolbar: TextToolbar,
     hapticFeedback: FakeHapticFeedback,
     getActual: () -> TextFieldValue,
-) : TextFieldSelectionAsserter<TextFieldValue>(
-    textContent,
-    rule,
-    textToolbar,
-    hapticFeedback,
-    getActual
-) {
+) :
+    TextFieldSelectionAsserter<TextFieldValue>(
+        textContent,
+        rule,
+        textToolbar,
+        hapticFeedback,
+        getActual
+    ) {
     override fun subAssert() {
         Truth.assertAbout(TextFieldValueSubject.withContent(textContent))
             .that(getActual())
@@ -150,31 +154,34 @@
     override fun actualCustomStringRepresentation(): String = subject.customToString()
 
     private fun TextFieldState.customToString(): String {
-        val selectionString = text
-            .map { if (it == '\n') '\n' else '.' }
-            .joinToString("")
-            .let {
-                if (selection.collapsed) {
-                    if (selection.start == text.length) {
-                        // edge case of selection being at end of text,
-                        // so append the marker instead of replacing
-                        "$it|"
-                    } else if (it[selection.start] == '\n') {
-                        // edge case of selection being at end of a line,
-                        // so append the marker to the EOL and then add the new line
-                        it.replaceRange(selection.start..selection.start, "|\n")
+        val selectionString =
+            text
+                .map { if (it == '\n') '\n' else '.' }
+                .joinToString("")
+                .let {
+                    if (selection.collapsed) {
+                        if (selection.start == text.length) {
+                            // edge case of selection being at end of text,
+                            // so append the marker instead of replacing
+                            "$it|"
+                        } else if (it[selection.start] == '\n') {
+                            // edge case of selection being at end of a line,
+                            // so append the marker to the EOL and then add the new line
+                            it.replaceRange(selection.start..selection.start, "|\n")
+                        } else {
+                            it.replaceRange(selection.start..selection.start, "|")
+                        }
                     } else {
-                        it.replaceRange(selection.start..selection.start, "|")
+                        val selectedText = text.subSequence(selection.min, selection.max)
+                        it.replaceRange(selection.min until selection.max, selectedText)
                     }
-                } else {
-                    val selectedText = text.subSequence(selection.min, selection.max)
-                    it.replaceRange(selection.min until selection.max, selectedText)
                 }
-            }
         return """
                 /Selection = ${selection.start} to ${selection.end}
                 /$selectionString
-            """.trimMargin(marginPrefix = "/").trim()
+            """
+            .trimMargin(marginPrefix = "/")
+            .trim()
     }
 }
 
@@ -184,13 +191,14 @@
     textToolbar: TextToolbar,
     hapticFeedback: FakeHapticFeedback,
     getActual: () -> TextFieldState,
-) : TextFieldSelectionAsserter<TextFieldState>(
-    textContent,
-    rule,
-    textToolbar,
-    hapticFeedback,
-    getActual
-) {
+) :
+    TextFieldSelectionAsserter<TextFieldState>(
+        textContent,
+        rule,
+        textToolbar,
+        hapticFeedback,
+        getActual
+    ) {
     override fun subAssert() {
         Truth.assertAbout(TextFieldStateSubject.withContent(textContent))
             .that(getActual())
diff --git a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/selection/gestures/util/TextSelectionTestUtils.kt b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/selection/gestures/util/TextSelectionTestUtils.kt
index 043168a..8bee2cd 100644
--- a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/selection/gestures/util/TextSelectionTestUtils.kt
+++ b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/selection/gestures/util/TextSelectionTestUtils.kt
@@ -48,14 +48,14 @@
 import kotlin.test.fail
 
 internal fun ComposeTestRule.assertSelectionHandlesShown(startShown: Boolean, endShown: Boolean) {
-    listOf(Handle.SelectionStart to startShown, Handle.SelectionEnd to endShown)
-        .forEach { (handle, shown) ->
-            if (shown) {
-                assertHandleShown(handle)
-            } else {
-                assertHandleNotShown(handle)
-            }
+    listOf(Handle.SelectionStart to startShown, Handle.SelectionEnd to endShown).forEach {
+        (handle, shown) ->
+        if (shown) {
+            assertHandleShown(handle)
+        } else {
+            assertHandleNotShown(handle)
         }
+    }
 }
 
 private fun ComposeTestRule.assertHandleShown(handle: Handle) {
@@ -72,14 +72,12 @@
         0 -> {
             // There are no handles, so this passes
         }
-
         1 -> {
             // verify the single handle is not visible
             val info = nodes.single().getSelectionHandleInfo()
             val message = "Handle exists and is visible."
             assertWithMessage(message).that(info.visible).isFalse()
         }
-
         else -> {
             fail("Found multiple $handle handles.")
         }
@@ -89,14 +87,11 @@
 private fun ComposeTestRule.assertMagnifierShown(shown: Boolean) {
     if (!isPlatformMagnifierSupported()) return
 
-    val magShown = onAllNodes(SemanticsMatcher.keyIsDefined(MagnifierPositionInRoot))
-        .fetchSemanticsNodes(atLeastOneRootRequired = false)
-        .also { waitForIdle() }
-        .any {
-            it.config[MagnifierPositionInRoot]
-                .invoke()
-                .isSpecified
-        }
+    val magShown =
+        onAllNodes(SemanticsMatcher.keyIsDefined(MagnifierPositionInRoot))
+            .fetchSemanticsNodes(atLeastOneRootRequired = false)
+            .also { waitForIdle() }
+            .any { it.config[MagnifierPositionInRoot].invoke().isSpecified }
 
     assertWithMessage("Magnifier should${if (shown) " " else " not "}be shown.")
         .that(magShown)
@@ -116,6 +111,7 @@
 
 internal class FakeHapticFeedback : HapticFeedback {
     val invocationCountMap = mutableMapOf<HapticFeedbackType, Int>().withDefault { 0 }
+
     override fun performHapticFeedback(hapticFeedbackType: HapticFeedbackType) {
         invocationCountMap[hapticFeedbackType] = 1 + (invocationCountMap[hapticFeedbackType] ?: 0)
     }
@@ -191,7 +187,9 @@
 }
 
 internal infix fun Int.to(other: Int): TextRange = TextRange(this, other)
-internal val Int.collapsed: TextRange get() = TextRange(this, this)
+
+internal val Int.collapsed: TextRange
+    get() = TextRange(this, this)
 
 internal fun SemanticsNodeInteraction.touchDragNodeTo(
     position: Offset,
@@ -218,17 +216,12 @@
         val progress = step / steps.toFloat()
         val nextTime = lerp(0, stop = durationMillis, fraction = progress)
         val nextPosition = lerp(start, position, nextTime / durationMillis.toFloat())
-        performTouchInput {
-            moveTo(nextPosition, delayMillis = nextTime - previousTime)
-        }
+        performTouchInput { moveTo(nextPosition, delayMillis = nextTime - previousTime) }
         previousTime = nextTime
     }
 }
 
-internal fun SemanticsNodeInteraction.touchDragNodeBy(
-    delta: Offset,
-    durationMillis: Long = 100L
-) {
+internal fun SemanticsNodeInteraction.touchDragNodeBy(delta: Offset, durationMillis: Long = 100L) {
     var startVar: Offset? = null
     performTouchInput {
         startVar = requireNotNull(currentPosition()) { "No pointer is down to animate." }
@@ -261,21 +254,14 @@
         val progress = step / steps.toFloat()
         val nextTime = lerp(0, stop = durationMillis, fraction = progress)
         val nextPosition = lerp(start, position, nextTime / durationMillis.toFloat())
-        performMouseInput {
-            moveTo(nextPosition, delayMillis = nextTime - previousTime)
-        }
+        performMouseInput { moveTo(nextPosition, delayMillis = nextTime - previousTime) }
         previousTime = nextTime
     }
 }
 
-internal fun SemanticsNodeInteraction.mouseDragNodeBy(
-    delta: Offset,
-    durationMillis: Long = 100L
-) {
+internal fun SemanticsNodeInteraction.mouseDragNodeBy(delta: Offset, durationMillis: Long = 100L) {
     var startVar: Offset? = null
-    performMouseInput {
-        startVar = currentPosition
-    }
+    performMouseInput { startVar = currentPosition }
     val start = startVar!!
     mouseDragNodeTo(start + delta, durationMillis)
 }
diff --git a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/textfield/HardwareKeyboardTest.kt b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/textfield/HardwareKeyboardTest.kt
index 0713741..25cb8c7 100644
--- a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/textfield/HardwareKeyboardTest.kt
+++ b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/textfield/HardwareKeyboardTest.kt
@@ -55,8 +55,7 @@
 @MediumTest
 @RunWith(AndroidJUnit4::class)
 class HardwareKeyboardTest {
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
     private val inputMethodInterceptor = InputMethodInterceptor(rule)
 
     @Test
@@ -158,13 +157,14 @@
     @Test
     fun textField_delete_atEnd() {
         val text = "hello"
-        val value = mutableStateOf(
-            TextFieldValue(
-                text,
-                // Place cursor at end.
-                selection = TextRange(text.length)
+        val value =
+            mutableStateOf(
+                TextFieldValue(
+                    text,
+                    // Place cursor at end.
+                    selection = TextRange(text.length)
+                )
             )
-        )
         keysSequenceTest(value = value) {
             Key.Delete.downAndUp()
             expectedText("hello")
@@ -422,10 +422,7 @@
 
     @Test
     fun textField_pageNavigation() {
-        keysSequenceTest(
-            initText = "1\n2\n3\n4\n5",
-            modifier = Modifier.requiredSize(27.dp)
-        ) {
+        keysSequenceTest(initText = "1\n2\n3\n4\n5", modifier = Modifier.requiredSize(27.dp)) {
             // By page down, the cursor should be at the visible top line. In this case the height
             // constraint is 27dp which covers from 1, 2 and middle of 3. Thus, by page down, the
             // first line should be 3, and cursor should be the before letter 3, i.e. index = 4.
@@ -547,15 +544,11 @@
         }
 
         fun expectedText(text: String) {
-            rule.runOnIdle {
-                assertThat(state.value.text).isEqualTo(text)
-            }
+            rule.runOnIdle { assertThat(state.value.text).isEqualTo(text) }
         }
 
         fun expectedSelection(selection: TextRange) {
-            rule.runOnIdle {
-                assertThat(state.value.selection).isEqualTo(selection)
-            }
+            rule.runOnIdle { assertThat(state.value.selection).isEqualTo(selection) }
         }
     }
 
@@ -586,10 +579,7 @@
             clipboardManager = LocalClipboardManager.current
             BasicTextField(
                 value = value.value,
-                textStyle = TextStyle(
-                    fontFamily = TEST_FONT_FAMILY,
-                    fontSize = 10.sp
-                ),
+                textStyle = TextStyle(fontFamily = TEST_FONT_FAMILY, fontSize = 10.sp),
                 modifier = modifier.testTag("textfield"),
                 onValueChange = onValueChange,
                 singleLine = singleLine,
@@ -597,9 +587,7 @@
         }
 
         rule.onNodeWithTag("textfield").requestFocus()
-        rule.runOnIdle {
-            clipboardManager.setText(AnnotatedString("InitialTestText"))
-        }
+        rule.runOnIdle { clipboardManager.setText(AnnotatedString("InitialTestText")) }
 
         sequence(SequenceScope(value) { rule.onNode(hasSetTextAction()) })
     }
diff --git a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/textfield/HeightInLinesModifierTest.kt b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/textfield/HeightInLinesModifierTest.kt
index 6c99ebd..532cec8 100644
--- a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/textfield/HeightInLinesModifierTest.kt
+++ b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/textfield/HeightInLinesModifierTest.kt
@@ -65,16 +65,16 @@
 @RunWith(AndroidJUnit4::class)
 class HeightInLinesModifierTest {
 
-    private val longText = "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do " +
-        "eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam," +
-        " quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. " +
-        "Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu " +
-        "fugiat nulla pariatur."
+    private val longText =
+        "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do " +
+            "eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam," +
+            " quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. " +
+            "Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu " +
+            "fugiat nulla pariatur."
 
     private val context = InstrumentationRegistry.getInstrumentation().context
 
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
     @Before
     fun before() {
@@ -100,9 +100,7 @@
                     subjectHeight = it
                     positionedLatch.countDown()
                 },
-                onTextLayoutResult = {
-                    subjectLayout = it
-                },
+                onTextLayoutResult = { subjectLayout = it },
                 textFieldValue = TextFieldValue("abc"),
                 minLines = 2
             )
@@ -128,10 +126,8 @@
 
     @Test
     fun maxLines_shortInputText() {
-        val (textLayoutResult, height) = setTextFieldWithMaxLines(
-            TextFieldValue("abc"),
-            maxLines = 5
-        )
+        val (textLayoutResult, height) =
+            setTextFieldWithMaxLines(TextFieldValue("abc"), maxLines = 5)
 
         rule.runOnIdle {
             assertThat(textLayoutResult).isNotNull()
@@ -179,21 +175,20 @@
             CoreTextField(
                 value = TextFieldValue(),
                 onValueChange = {},
-                modifier = Modifier.heightInLines(
-                    textStyle = TextStyle.Default,
-                    minLines = 2,
-                    maxLines = 1
-                )
+                modifier =
+                    Modifier.heightInLines(
+                        textStyle = TextStyle.Default,
+                        minLines = 2,
+                        maxLines = 1
+                    )
             )
         }
     }
 
     @Test
     fun minLines_longInputText() {
-        val (textLayoutResult, height) = setTextFieldWithMaxLines(
-            TextFieldValue(longText),
-            minLines = 2
-        )
+        val (textLayoutResult, height) =
+            setTextFieldWithMaxLines(TextFieldValue(longText), minLines = 2)
 
         rule.runOnIdle {
             assertThat(textLayoutResult).isNotNull()
@@ -217,9 +212,7 @@
                     subjectHeight = it
                     positionedLatch.countDown()
                 },
-                onTextLayoutResult = {
-                    subjectLayout = it
-                },
+                onTextLayoutResult = { subjectLayout = it },
                 textFieldValue = TextFieldValue(longText),
                 maxLines = 2
             )
@@ -251,21 +244,24 @@
         val resolver = createFontFamilyResolver(context, testDispatcher)
 
         val typefaceDeferred = CompletableDeferred<Typeface>()
-        val asyncLoader = object : AndroidFont.TypefaceLoader {
-            override fun loadBlocking(context: Context, font: AndroidFont): Typeface =
-                TODO("Not yet implemented")
+        val asyncLoader =
+            object : AndroidFont.TypefaceLoader {
+                override fun loadBlocking(context: Context, font: AndroidFont): Typeface =
+                    TODO("Not yet implemented")
 
-            override suspend fun awaitLoad(context: Context, font: AndroidFont): Typeface {
-                return typefaceDeferred.await()
+                override suspend fun awaitLoad(context: Context, font: AndroidFont): Typeface {
+                    return typefaceDeferred.await()
+                }
             }
-        }
-        val fontFamily = FontFamily(
-            object : AndroidFont(FontLoadingStrategy.Async, asyncLoader, FontVariation.Settings()) {
-                override val weight: FontWeight = FontWeight.Normal
-                override val style: FontStyle = FontStyle.Normal
-            },
-            TEST_FONT
-        )
+        val fontFamily =
+            FontFamily(
+                object :
+                    AndroidFont(FontLoadingStrategy.Async, asyncLoader, FontVariation.Settings()) {
+                    override val weight: FontWeight = FontWeight.Normal
+                    override val style: FontStyle = FontStyle.Normal
+                },
+                TEST_FONT
+            )
 
         val heights = mutableListOf<Int>()
 
@@ -275,16 +271,11 @@
                 LocalDensity provides Density(1.0f, 1f)
             ) {
                 HeightObservingText(
-                    onGlobalHeightPositioned = {
-                        heights.add(it)
-                    },
+                    onGlobalHeightPositioned = { heights.add(it) },
                     onTextLayoutResult = {},
                     textFieldValue = TextFieldValue(longText),
                     maxLines = 10,
-                    textStyle = TextStyle.Default.copy(
-                        fontFamily = fontFamily,
-                        fontSize = 80.sp
-                    )
+                    textStyle = TextStyle.Default.copy(fontFamily = fontFamily, fontSize = 80.sp)
                 )
             }
         }
@@ -300,17 +291,16 @@
 
     @Test
     fun testInspectableValue() {
-        val modifier = Modifier.heightInLines(
-            textStyle = TextStyle.Default,
-            minLines = 5,
-            maxLines = 10
-        ) as InspectableValue
+        val modifier =
+            Modifier.heightInLines(textStyle = TextStyle.Default, minLines = 5, maxLines = 10)
+                as InspectableValue
         assertThat(modifier.nameFallback).isEqualTo("heightInLines")
-        assertThat(modifier.inspectableElements.asIterable()).containsExactly(
-            ValueElement("minLines", 5),
-            ValueElement("maxLines", 10),
-            ValueElement("textStyle", TextStyle.Default)
-        )
+        assertThat(modifier.inspectableElements.asIterable())
+            .containsExactly(
+                ValueElement("minLines", 5),
+                ValueElement("maxLines", 10),
+                ValueElement("textStyle", TextStyle.Default)
+            )
     }
 
     private fun setTextFieldWithMaxLines(
@@ -328,9 +318,7 @@
                     height = it
                     positionedLatch.countDown()
                 },
-                onTextLayoutResult = {
-                    textLayoutResult = it
-                },
+                onTextLayoutResult = { textLayoutResult = it },
                 textFieldValue = textFieldValue,
                 minLines = minLines,
                 maxLines = maxLines
@@ -350,22 +338,18 @@
         maxLines: Int = Int.MAX_VALUE,
         textStyle: TextStyle = TextStyle.Default
     ) {
-        Box(
-            Modifier.onGloballyPositioned {
-                onGlobalHeightPositioned(it.size.height)
-            }
-        ) {
+        Box(Modifier.onGloballyPositioned { onGlobalHeightPositioned(it.size.height) }) {
             CoreTextField(
                 value = textFieldValue,
                 onValueChange = {},
                 textStyle = textStyle,
-                modifier = Modifier
-                    .requiredWidth(100.dp)
-                    .heightInLines(
-                        textStyle = textStyle,
-                        minLines = minLines,
-                        maxLines = maxLines
-                    ),
+                modifier =
+                    Modifier.requiredWidth(100.dp)
+                        .heightInLines(
+                            textStyle = textStyle,
+                            minLines = minLines,
+                            maxLines = maxLines
+                        ),
                 onTextLayout = onTextLayoutResult
             )
         }
diff --git a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/textfield/TextFieldContextMenuTest.kt b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/textfield/TextFieldContextMenuTest.kt
index 89d3fda..9c6cb7e 100644
--- a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/textfield/TextFieldContextMenuTest.kt
+++ b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/textfield/TextFieldContextMenuTest.kt
@@ -60,13 +60,12 @@
 @MediumTest
 @RunWith(AndroidJUnit4::class)
 class TextFieldContextMenuTest : FocusedWindowTest {
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
     private val textFieldTag = "BTF"
     private val defaultFullWidthText = "M".repeat(20)
 
-    //region BTF1 Context Menu Gesture Tests
+    // region BTF1 Context Menu Gesture Tests
     @Test
     fun btf1_contextMenu_rightClick_appears() {
         var value by mutableStateOf(TextFieldValue(defaultFullWidthText))
@@ -137,40 +136,45 @@
         rule.clickOffPopup { rootRect -> lerp(rootRect.topLeft, rootRect.center, 0.5f) }
         contextMenuInteraction.assertDoesNotExist()
     }
-    //endregion BTF1 Context Menu Gesture Tests
 
-    //region BTF1 Context Menu Item Click Tests
+    // endregion BTF1 Context Menu Gesture Tests
+
+    // region BTF1 Context Menu Item Click Tests
     @Test
-    fun btf1_contextMenu_onClickCut() = runBtf1ClickContextMenuItemTest(
-        labelToClick = ContextMenuItemLabels.CUT,
-        expectedText = "Text  Text",
-        expectedSelection = TextRange(5),
-        expectedClipboardContent = "Text",
-    )
+    fun btf1_contextMenu_onClickCut() =
+        runBtf1ClickContextMenuItemTest(
+            labelToClick = ContextMenuItemLabels.CUT,
+            expectedText = "Text  Text",
+            expectedSelection = TextRange(5),
+            expectedClipboardContent = "Text",
+        )
 
     @Test
-    fun btf1_contextMenu_onClickCopy() = runBtf1ClickContextMenuItemTest(
-        labelToClick = ContextMenuItemLabels.COPY,
-        expectedText = "Text Text Text",
-        expectedSelection = TextRange(5, 9),
-        expectedClipboardContent = "Text",
-    )
+    fun btf1_contextMenu_onClickCopy() =
+        runBtf1ClickContextMenuItemTest(
+            labelToClick = ContextMenuItemLabels.COPY,
+            expectedText = "Text Text Text",
+            expectedSelection = TextRange(5, 9),
+            expectedClipboardContent = "Text",
+        )
 
     @Test
-    fun btf1_contextMenu_onClickPaste() = runBtf1ClickContextMenuItemTest(
-        labelToClick = ContextMenuItemLabels.PASTE,
-        expectedText = "Text clip Text",
-        expectedSelection = TextRange(9),
-        expectedClipboardContent = "clip",
-    )
+    fun btf1_contextMenu_onClickPaste() =
+        runBtf1ClickContextMenuItemTest(
+            labelToClick = ContextMenuItemLabels.PASTE,
+            expectedText = "Text clip Text",
+            expectedSelection = TextRange(9),
+            expectedClipboardContent = "clip",
+        )
 
     @Test
-    fun btf1_contextMenu_onClickSelectAll() = runBtf1ClickContextMenuItemTest(
-        labelToClick = ContextMenuItemLabels.SELECT_ALL,
-        expectedText = "Text Text Text",
-        expectedSelection = TextRange(0, 14),
-        expectedClipboardContent = "clip",
-    )
+    fun btf1_contextMenu_onClickSelectAll() =
+        runBtf1ClickContextMenuItemTest(
+            labelToClick = ContextMenuItemLabels.SELECT_ALL,
+            expectedText = "Text Text Text",
+            expectedSelection = TextRange(0, 14),
+            expectedClipboardContent = "clip",
+        )
 
     private fun runBtf1ClickContextMenuItemTest(
         labelToClick: String,
@@ -181,17 +185,19 @@
         val text = "Text Text Text"
         val initialClipboardText = "clip"
 
-        var value by mutableStateOf(
-            TextFieldValue(
-                text = text,
-                selection = TextRange(5, 9),
+        var value by
+            mutableStateOf(
+                TextFieldValue(
+                    text = text,
+                    selection = TextRange(5, 9),
+                )
             )
-        )
 
-        val clipboardManager = FakeClipboardManager(
-            initialText = initialClipboardText,
-            supportsClipEntry = true,
-        )
+        val clipboardManager =
+            FakeClipboardManager(
+                initialText = initialClipboardText,
+                supportsClipEntry = true,
+            )
 
         rule.setTextFieldTestContent {
             CompositionLocalProvider(LocalClipboardManager provides clipboardManager) {
@@ -221,169 +227,182 @@
         assertThat(clipboardContent).isNotNull()
         assertThat(clipboardContent!!.text).isEqualTo(expectedClipboardContent)
     }
-    //endregion BTF1 Context Menu Item Click Tests
 
-    //region BTF1 Context Menu Correct Item Tests
+    // endregion BTF1 Context Menu Item Click Tests
+
+    // region BTF1 Context Menu Correct Item Tests
     @Test
-    fun btf1_contextMenu_emptyClipboard_noSelection_itemsMatch() = runBtf1CorrectItemsTest(
-        isEmptyClipboard = true,
-        selectionAmount = SelectionAmount.NONE,
-    ) {
-        rule.assertContextMenuItems(
-            cutState = ContextMenuItemState.DISABLED,
-            copyState = ContextMenuItemState.DISABLED,
-            pasteState = ContextMenuItemState.DISABLED,
-            selectAllState = ContextMenuItemState.ENABLED,
-        )
-    }
+    fun btf1_contextMenu_emptyClipboard_noSelection_itemsMatch() =
+        runBtf1CorrectItemsTest(
+            isEmptyClipboard = true,
+            selectionAmount = SelectionAmount.NONE,
+        ) {
+            rule.assertContextMenuItems(
+                cutState = ContextMenuItemState.DISABLED,
+                copyState = ContextMenuItemState.DISABLED,
+                pasteState = ContextMenuItemState.DISABLED,
+                selectAllState = ContextMenuItemState.ENABLED,
+            )
+        }
 
     @Test
-    fun btf1_contextMenu_emptyClipboard_partialSelection_itemsMatch() = runBtf1CorrectItemsTest(
-        isEmptyClipboard = true,
-        selectionAmount = SelectionAmount.PARTIAL,
-    ) {
-        rule.assertContextMenuItems(
-            cutState = ContextMenuItemState.ENABLED,
-            copyState = ContextMenuItemState.ENABLED,
-            pasteState = ContextMenuItemState.DISABLED,
-            selectAllState = ContextMenuItemState.ENABLED,
-        )
-    }
+    fun btf1_contextMenu_emptyClipboard_partialSelection_itemsMatch() =
+        runBtf1CorrectItemsTest(
+            isEmptyClipboard = true,
+            selectionAmount = SelectionAmount.PARTIAL,
+        ) {
+            rule.assertContextMenuItems(
+                cutState = ContextMenuItemState.ENABLED,
+                copyState = ContextMenuItemState.ENABLED,
+                pasteState = ContextMenuItemState.DISABLED,
+                selectAllState = ContextMenuItemState.ENABLED,
+            )
+        }
 
     @Test
-    fun btf1_contextMenu_emptyClipboard_fullSelection_itemsMatch() = runBtf1CorrectItemsTest(
-        isEmptyClipboard = true,
-        selectionAmount = SelectionAmount.ALL,
-    ) {
-        rule.assertContextMenuItems(
-            cutState = ContextMenuItemState.ENABLED,
-            copyState = ContextMenuItemState.ENABLED,
-            pasteState = ContextMenuItemState.DISABLED,
-            selectAllState = ContextMenuItemState.DISABLED,
-        )
-    }
+    fun btf1_contextMenu_emptyClipboard_fullSelection_itemsMatch() =
+        runBtf1CorrectItemsTest(
+            isEmptyClipboard = true,
+            selectionAmount = SelectionAmount.ALL,
+        ) {
+            rule.assertContextMenuItems(
+                cutState = ContextMenuItemState.ENABLED,
+                copyState = ContextMenuItemState.ENABLED,
+                pasteState = ContextMenuItemState.DISABLED,
+                selectAllState = ContextMenuItemState.DISABLED,
+            )
+        }
 
     @Test
-    fun btf1_contextMenu_nonEmptyClipboard_noSelection_itemsMatch() = runBtf1CorrectItemsTest(
-        isEmptyClipboard = false,
-        selectionAmount = SelectionAmount.NONE,
-    ) {
-        rule.assertContextMenuItems(
-            cutState = ContextMenuItemState.DISABLED,
-            copyState = ContextMenuItemState.DISABLED,
-            pasteState = ContextMenuItemState.ENABLED,
-            selectAllState = ContextMenuItemState.ENABLED,
-        )
-    }
+    fun btf1_contextMenu_nonEmptyClipboard_noSelection_itemsMatch() =
+        runBtf1CorrectItemsTest(
+            isEmptyClipboard = false,
+            selectionAmount = SelectionAmount.NONE,
+        ) {
+            rule.assertContextMenuItems(
+                cutState = ContextMenuItemState.DISABLED,
+                copyState = ContextMenuItemState.DISABLED,
+                pasteState = ContextMenuItemState.ENABLED,
+                selectAllState = ContextMenuItemState.ENABLED,
+            )
+        }
 
     @Test
-    fun btf1_contextMenu_nonEmptyClipboard_partialSelection_itemsMatch() = runBtf1CorrectItemsTest(
-        isPassword = false,
-        isReadOnly = false,
-        isEmptyClipboard = false,
-        selectionAmount = SelectionAmount.PARTIAL,
-    ) {
-        rule.assertContextMenuItems(
-            cutState = ContextMenuItemState.ENABLED,
-            copyState = ContextMenuItemState.ENABLED,
-            pasteState = ContextMenuItemState.ENABLED,
-            selectAllState = ContextMenuItemState.ENABLED,
-        )
-    }
+    fun btf1_contextMenu_nonEmptyClipboard_partialSelection_itemsMatch() =
+        runBtf1CorrectItemsTest(
+            isPassword = false,
+            isReadOnly = false,
+            isEmptyClipboard = false,
+            selectionAmount = SelectionAmount.PARTIAL,
+        ) {
+            rule.assertContextMenuItems(
+                cutState = ContextMenuItemState.ENABLED,
+                copyState = ContextMenuItemState.ENABLED,
+                pasteState = ContextMenuItemState.ENABLED,
+                selectAllState = ContextMenuItemState.ENABLED,
+            )
+        }
 
     @Test
-    fun btf1_contextMenu_nonEmptyClipboard_fullSelection_itemsMatch() = runBtf1CorrectItemsTest(
-        isEmptyClipboard = false,
-        selectionAmount = SelectionAmount.ALL,
-    ) {
-        rule.assertContextMenuItems(
-            cutState = ContextMenuItemState.ENABLED,
-            copyState = ContextMenuItemState.ENABLED,
-            pasteState = ContextMenuItemState.ENABLED,
-            selectAllState = ContextMenuItemState.DISABLED,
-        )
-    }
+    fun btf1_contextMenu_nonEmptyClipboard_fullSelection_itemsMatch() =
+        runBtf1CorrectItemsTest(
+            isEmptyClipboard = false,
+            selectionAmount = SelectionAmount.ALL,
+        ) {
+            rule.assertContextMenuItems(
+                cutState = ContextMenuItemState.ENABLED,
+                copyState = ContextMenuItemState.ENABLED,
+                pasteState = ContextMenuItemState.ENABLED,
+                selectAllState = ContextMenuItemState.DISABLED,
+            )
+        }
 
     @Test
-    fun btf1_contextMenu_password_noSelection_itemsMatch() = runBtf1CorrectItemsTest(
-        isPassword = true,
-        selectionAmount = SelectionAmount.NONE,
-    ) {
-        rule.assertContextMenuItems(
-            cutState = ContextMenuItemState.DISABLED,
-            copyState = ContextMenuItemState.DISABLED,
-            pasteState = ContextMenuItemState.ENABLED,
-            selectAllState = ContextMenuItemState.ENABLED,
-        )
-    }
+    fun btf1_contextMenu_password_noSelection_itemsMatch() =
+        runBtf1CorrectItemsTest(
+            isPassword = true,
+            selectionAmount = SelectionAmount.NONE,
+        ) {
+            rule.assertContextMenuItems(
+                cutState = ContextMenuItemState.DISABLED,
+                copyState = ContextMenuItemState.DISABLED,
+                pasteState = ContextMenuItemState.ENABLED,
+                selectAllState = ContextMenuItemState.ENABLED,
+            )
+        }
 
     @Test
-    fun btf1_contextMenu_password_partialSelection_itemsMatch() = runBtf1CorrectItemsTest(
-        isPassword = true,
-        selectionAmount = SelectionAmount.PARTIAL,
-    ) {
-        rule.assertContextMenuItems(
-            cutState = ContextMenuItemState.DISABLED,
-            copyState = ContextMenuItemState.DISABLED,
-            pasteState = ContextMenuItemState.ENABLED,
-            selectAllState = ContextMenuItemState.ENABLED,
-        )
-    }
+    fun btf1_contextMenu_password_partialSelection_itemsMatch() =
+        runBtf1CorrectItemsTest(
+            isPassword = true,
+            selectionAmount = SelectionAmount.PARTIAL,
+        ) {
+            rule.assertContextMenuItems(
+                cutState = ContextMenuItemState.DISABLED,
+                copyState = ContextMenuItemState.DISABLED,
+                pasteState = ContextMenuItemState.ENABLED,
+                selectAllState = ContextMenuItemState.ENABLED,
+            )
+        }
 
     @Test
-    fun btf1_contextMenu_password_fullSelection_itemsMatch() = runBtf1CorrectItemsTest(
-        isPassword = true,
-        selectionAmount = SelectionAmount.ALL,
-    ) {
-        rule.assertContextMenuItems(
-            cutState = ContextMenuItemState.DISABLED,
-            copyState = ContextMenuItemState.DISABLED,
-            pasteState = ContextMenuItemState.ENABLED,
-            selectAllState = ContextMenuItemState.DISABLED,
-        )
-    }
+    fun btf1_contextMenu_password_fullSelection_itemsMatch() =
+        runBtf1CorrectItemsTest(
+            isPassword = true,
+            selectionAmount = SelectionAmount.ALL,
+        ) {
+            rule.assertContextMenuItems(
+                cutState = ContextMenuItemState.DISABLED,
+                copyState = ContextMenuItemState.DISABLED,
+                pasteState = ContextMenuItemState.ENABLED,
+                selectAllState = ContextMenuItemState.DISABLED,
+            )
+        }
 
     @Test
-    fun btf1_contextMenu_readOnly_noSelection_itemsMatch() = runBtf1CorrectItemsTest(
-        isReadOnly = true,
-        isEmptyClipboard = true,
-        selectionAmount = SelectionAmount.NONE,
-    ) {
-        rule.assertContextMenuItems(
-            cutState = ContextMenuItemState.DISABLED,
-            copyState = ContextMenuItemState.DISABLED,
-            pasteState = ContextMenuItemState.DISABLED,
-            selectAllState = ContextMenuItemState.ENABLED,
-        )
-    }
+    fun btf1_contextMenu_readOnly_noSelection_itemsMatch() =
+        runBtf1CorrectItemsTest(
+            isReadOnly = true,
+            isEmptyClipboard = true,
+            selectionAmount = SelectionAmount.NONE,
+        ) {
+            rule.assertContextMenuItems(
+                cutState = ContextMenuItemState.DISABLED,
+                copyState = ContextMenuItemState.DISABLED,
+                pasteState = ContextMenuItemState.DISABLED,
+                selectAllState = ContextMenuItemState.ENABLED,
+            )
+        }
 
     @Test
-    fun btf1_contextMenu_readOnly_partialSelection_itemsMatch() = runBtf1CorrectItemsTest(
-        isReadOnly = true,
-        isEmptyClipboard = true,
-        selectionAmount = SelectionAmount.PARTIAL,
-    ) {
-        rule.assertContextMenuItems(
-            cutState = ContextMenuItemState.DISABLED,
-            copyState = ContextMenuItemState.ENABLED,
-            pasteState = ContextMenuItemState.DISABLED,
-            selectAllState = ContextMenuItemState.ENABLED,
-        )
-    }
+    fun btf1_contextMenu_readOnly_partialSelection_itemsMatch() =
+        runBtf1CorrectItemsTest(
+            isReadOnly = true,
+            isEmptyClipboard = true,
+            selectionAmount = SelectionAmount.PARTIAL,
+        ) {
+            rule.assertContextMenuItems(
+                cutState = ContextMenuItemState.DISABLED,
+                copyState = ContextMenuItemState.ENABLED,
+                pasteState = ContextMenuItemState.DISABLED,
+                selectAllState = ContextMenuItemState.ENABLED,
+            )
+        }
 
     @Test
-    fun btf1_contextMenu_readOnly_fullSelection_itemsMatch() = runBtf1CorrectItemsTest(
-        isReadOnly = true,
-        isEmptyClipboard = true,
-        selectionAmount = SelectionAmount.ALL,
-    ) {
-        rule.assertContextMenuItems(
-            cutState = ContextMenuItemState.DISABLED,
-            copyState = ContextMenuItemState.ENABLED,
-            pasteState = ContextMenuItemState.DISABLED,
-            selectAllState = ContextMenuItemState.DISABLED,
-        )
-    }
+    fun btf1_contextMenu_readOnly_fullSelection_itemsMatch() =
+        runBtf1CorrectItemsTest(
+            isReadOnly = true,
+            isEmptyClipboard = true,
+            selectionAmount = SelectionAmount.ALL,
+        ) {
+            rule.assertContextMenuItems(
+                cutState = ContextMenuItemState.DISABLED,
+                copyState = ContextMenuItemState.ENABLED,
+                pasteState = ContextMenuItemState.DISABLED,
+                selectAllState = ContextMenuItemState.DISABLED,
+            )
+        }
 
     private fun runBtf1CorrectItemsTest(
         isPassword: Boolean = false,
@@ -393,27 +412,30 @@
         assertBlock: () -> Unit,
     ) {
         val text = "Text Text Text"
-        var value by mutableStateOf(
-            TextFieldValue(
-                text = text,
-                selection = when (selectionAmount) {
-                    SelectionAmount.NONE -> TextRange.Zero
-                    SelectionAmount.PARTIAL -> TextRange(5, 9)
-                    SelectionAmount.ALL -> TextRange(0, 14)
-                }
+        var value by
+            mutableStateOf(
+                TextFieldValue(
+                    text = text,
+                    selection =
+                        when (selectionAmount) {
+                            SelectionAmount.NONE -> TextRange.Zero
+                            SelectionAmount.PARTIAL -> TextRange(5, 9)
+                            SelectionAmount.ALL -> TextRange(0, 14)
+                        }
+                )
             )
-        )
 
         val visualTransformation =
             if (isPassword) PasswordVisualTransformation() else VisualTransformation.None
 
-        val clipboardManager = FakeClipboardManager(supportsClipEntry = true).apply {
-            if (isEmptyClipboard) {
-                setClip(null)
-            } else {
-                setText(AnnotatedString("Clipboard Text"))
+        val clipboardManager =
+            FakeClipboardManager(supportsClipEntry = true).apply {
+                if (isEmptyClipboard) {
+                    setClip(null)
+                } else {
+                    setText(AnnotatedString("Clipboard Text"))
+                }
             }
-        }
 
         rule.setTextFieldTestContent {
             CompositionLocalProvider(LocalClipboardManager provides clipboardManager) {
@@ -430,17 +452,15 @@
         rule.onNodeWithTag(textFieldTag).performMouseInput { rightClick(center) }
         assertBlock()
     }
-    //endregion BTF1 Context Menu Correct Item Tests
 
-    //region BTF2 Context Menu Gesture Tests
+    // endregion BTF1 Context Menu Correct Item Tests
+
+    // region BTF2 Context Menu Gesture Tests
     @Test
     fun btf2_contextMenu_rightClick_appears() {
         val state = TextFieldState(defaultFullWidthText)
         rule.setTextFieldTestContent {
-            BasicTextField(
-                state = state,
-                modifier = Modifier.testTag(textFieldTag)
-            )
+            BasicTextField(state = state, modifier = Modifier.testTag(textFieldTag))
         }
 
         val contextMenuInteraction = rule.onNode(isPopup())
@@ -453,10 +473,7 @@
     fun btf2_contextMenu_leftClick_doesNotAppear() {
         val state = TextFieldState(defaultFullWidthText)
         rule.setTextFieldTestContent {
-            BasicTextField(
-                state = state,
-                modifier = Modifier.testTag(textFieldTag)
-            )
+            BasicTextField(state = state, modifier = Modifier.testTag(textFieldTag))
         }
 
         val contextMenuInteraction = rule.onNode(isPopup())
@@ -486,10 +503,7 @@
     fun btf2_contextMenu_disappearsOnClickOffOfPopup() {
         val state = TextFieldState(defaultFullWidthText)
         rule.setTextFieldTestContent {
-            BasicTextField(
-                state = state,
-                modifier = Modifier.testTag(textFieldTag)
-            )
+            BasicTextField(state = state, modifier = Modifier.testTag(textFieldTag))
         }
 
         val contextMenuInteraction = rule.onNode(isPopup())
@@ -499,40 +513,45 @@
         rule.clickOffPopup { rootRect -> lerp(rootRect.topLeft, rootRect.center, 0.5f) }
         contextMenuInteraction.assertDoesNotExist()
     }
-    //endregion BTF2 Context Menu Gesture Tests
 
-    //region BTF2 Context Menu Item Click Tests
+    // endregion BTF2 Context Menu Gesture Tests
+
+    // region BTF2 Context Menu Item Click Tests
     @Test
-    fun btf2_contextMenu_onClickCut() = runBtf2ClickContextMenuItemTest(
-        labelToClick = ContextMenuItemLabels.CUT,
-        expectedText = "Text  Text",
-        expectedSelection = TextRange(5),
-        expectedClipboardContent = "Text",
-    )
+    fun btf2_contextMenu_onClickCut() =
+        runBtf2ClickContextMenuItemTest(
+            labelToClick = ContextMenuItemLabels.CUT,
+            expectedText = "Text  Text",
+            expectedSelection = TextRange(5),
+            expectedClipboardContent = "Text",
+        )
 
     @Test
-    fun btf2_contextMenu_onClickCopy() = runBtf2ClickContextMenuItemTest(
-        labelToClick = ContextMenuItemLabels.COPY,
-        expectedText = "Text Text Text",
-        expectedSelection = TextRange(5, 9),
-        expectedClipboardContent = "Text",
-    )
+    fun btf2_contextMenu_onClickCopy() =
+        runBtf2ClickContextMenuItemTest(
+            labelToClick = ContextMenuItemLabels.COPY,
+            expectedText = "Text Text Text",
+            expectedSelection = TextRange(5, 9),
+            expectedClipboardContent = "Text",
+        )
 
     @Test
-    fun btf2_contextMenu_onClickPaste() = runBtf2ClickContextMenuItemTest(
-        labelToClick = ContextMenuItemLabels.PASTE,
-        expectedText = "Text clip Text",
-        expectedSelection = TextRange(9),
-        expectedClipboardContent = "clip",
-    )
+    fun btf2_contextMenu_onClickPaste() =
+        runBtf2ClickContextMenuItemTest(
+            labelToClick = ContextMenuItemLabels.PASTE,
+            expectedText = "Text clip Text",
+            expectedSelection = TextRange(9),
+            expectedClipboardContent = "clip",
+        )
 
     @Test
-    fun btf2_contextMenu_onClickSelectAll() = runBtf2ClickContextMenuItemTest(
-        labelToClick = ContextMenuItemLabels.SELECT_ALL,
-        expectedText = "Text Text Text",
-        expectedSelection = TextRange(0, 14),
-        expectedClipboardContent = "clip",
-    )
+    fun btf2_contextMenu_onClickSelectAll() =
+        runBtf2ClickContextMenuItemTest(
+            labelToClick = ContextMenuItemLabels.SELECT_ALL,
+            expectedText = "Text Text Text",
+            expectedSelection = TextRange(0, 14),
+            expectedClipboardContent = "clip",
+        )
 
     private fun runBtf2ClickContextMenuItemTest(
         labelToClick: String,
@@ -545,17 +564,15 @@
 
         val state = TextFieldState(initialText = text, initialSelection = TextRange(5, 9))
 
-        val clipboardManager = FakeClipboardManager(
-            initialText = initialClipboardText,
-            supportsClipEntry = true,
-        )
+        val clipboardManager =
+            FakeClipboardManager(
+                initialText = initialClipboardText,
+                supportsClipEntry = true,
+            )
 
         rule.setTextFieldTestContent {
             CompositionLocalProvider(LocalClipboardManager provides clipboardManager) {
-                BasicTextField(
-                    state = state,
-                    modifier = Modifier.testTag(textFieldTag)
-                )
+                BasicTextField(state = state, modifier = Modifier.testTag(textFieldTag))
             }
         }
 
@@ -577,169 +594,186 @@
         assertThat(clipboardContent).isNotNull()
         assertThat(clipboardContent!!.text).isEqualTo(expectedClipboardContent)
     }
-    //endregion BTF2 Context Menu Item Click Tests
 
-    //region BTF2 Context Menu Correct Item Tests
+    // endregion BTF2 Context Menu Item Click Tests
+
+    // region BTF2 Context Menu Correct Item Tests
     @Test
-    fun btf2_contextMenu_emptyClipboard_noSelection_itemsMatch() = runBtf2CorrectItemsTest(
-        isEmptyClipboard = true,
-        selectionAmount = SelectionAmount.NONE,
-    ) {
-        rule.assertContextMenuItems(
-            cutState = ContextMenuItemState.DISABLED,
-            copyState = ContextMenuItemState.DISABLED,
-            pasteState = ContextMenuItemState.DISABLED,
-            selectAllState = ContextMenuItemState.ENABLED,
-        )
-    }
+    fun btf2_contextMenu_emptyClipboard_noSelection_itemsMatch() =
+        runBtf2CorrectItemsTest(
+            isEmptyClipboard = true,
+            selectionAmount = SelectionAmount.NONE,
+        ) {
+            rule.assertContextMenuItems(
+                cutState = ContextMenuItemState.DISABLED,
+                copyState = ContextMenuItemState.DISABLED,
+                pasteState = ContextMenuItemState.DISABLED,
+                selectAllState = ContextMenuItemState.ENABLED,
+            )
+        }
 
     @Test
-    fun btf2_contextMenu_emptyClipboard_partialSelection_itemsMatch() = runBtf2CorrectItemsTest(
-        isEmptyClipboard = true,
-        selectionAmount = SelectionAmount.PARTIAL,
-    ) {
-        rule.assertContextMenuItems(
-            cutState = ContextMenuItemState.ENABLED,
-            copyState = ContextMenuItemState.ENABLED,
-            pasteState = ContextMenuItemState.DISABLED,
-            selectAllState = ContextMenuItemState.ENABLED,
-        )
-    }
+    fun btf2_contextMenu_emptyClipboard_partialSelection_itemsMatch() =
+        runBtf2CorrectItemsTest(
+            isEmptyClipboard = true,
+            selectionAmount = SelectionAmount.PARTIAL,
+        ) {
+            rule.assertContextMenuItems(
+                cutState = ContextMenuItemState.ENABLED,
+                copyState = ContextMenuItemState.ENABLED,
+                pasteState = ContextMenuItemState.DISABLED,
+                selectAllState = ContextMenuItemState.ENABLED,
+            )
+        }
 
     @Test
-    fun btf2_contextMenu_emptyClipboard_fullSelection_itemsMatch() = runBtf2CorrectItemsTest(
-        isEmptyClipboard = true,
-        selectionAmount = SelectionAmount.ALL,
-    ) {
-        rule.assertContextMenuItems(
-            cutState = ContextMenuItemState.ENABLED,
-            copyState = ContextMenuItemState.ENABLED,
-            pasteState = ContextMenuItemState.DISABLED,
-            selectAllState = ContextMenuItemState.DISABLED,
-        )
-    }
+    fun btf2_contextMenu_emptyClipboard_fullSelection_itemsMatch() =
+        runBtf2CorrectItemsTest(
+            isEmptyClipboard = true,
+            selectionAmount = SelectionAmount.ALL,
+        ) {
+            rule.assertContextMenuItems(
+                cutState = ContextMenuItemState.ENABLED,
+                copyState = ContextMenuItemState.ENABLED,
+                pasteState = ContextMenuItemState.DISABLED,
+                selectAllState = ContextMenuItemState.DISABLED,
+            )
+        }
 
     @Test
-    fun btf2_contextMenu_nonEmptyClipboard_noSelection_itemsMatch() = runBtf2CorrectItemsTest(
-        isEmptyClipboard = false,
-        selectionAmount = SelectionAmount.NONE,
-    ) {
-        rule.assertContextMenuItems(
-            cutState = ContextMenuItemState.DISABLED,
-            copyState = ContextMenuItemState.DISABLED,
-            pasteState = ContextMenuItemState.ENABLED,
-            selectAllState = ContextMenuItemState.ENABLED,
-        )
-    }
+    fun btf2_contextMenu_nonEmptyClipboard_noSelection_itemsMatch() =
+        runBtf2CorrectItemsTest(
+            isEmptyClipboard = false,
+            selectionAmount = SelectionAmount.NONE,
+        ) {
+            rule.assertContextMenuItems(
+                cutState = ContextMenuItemState.DISABLED,
+                copyState = ContextMenuItemState.DISABLED,
+                pasteState = ContextMenuItemState.ENABLED,
+                selectAllState = ContextMenuItemState.ENABLED,
+            )
+        }
 
     @Test
-    fun btf2_contextMenu_nonEmptyClipboard_partialSelection_itemsMatch() = runBtf2CorrectItemsTest(
-        isEmptyClipboard = false,
-        selectionAmount = SelectionAmount.PARTIAL,
-    ) {
-        rule.assertContextMenuItems(
-            cutState = ContextMenuItemState.ENABLED,
-            copyState = ContextMenuItemState.ENABLED,
-            pasteState = ContextMenuItemState.ENABLED,
-            selectAllState = ContextMenuItemState.ENABLED,
-        )
-    }
+    fun btf2_contextMenu_nonEmptyClipboard_partialSelection_itemsMatch() =
+        runBtf2CorrectItemsTest(
+            isEmptyClipboard = false,
+            selectionAmount = SelectionAmount.PARTIAL,
+        ) {
+            rule.assertContextMenuItems(
+                cutState = ContextMenuItemState.ENABLED,
+                copyState = ContextMenuItemState.ENABLED,
+                pasteState = ContextMenuItemState.ENABLED,
+                selectAllState = ContextMenuItemState.ENABLED,
+            )
+        }
 
     @Test
-    fun btf2_contextMenu_nonEmptyClipboard_fullSelection_itemsMatch() = runBtf2CorrectItemsTest(
-        isEmptyClipboard = false,
-        selectionAmount = SelectionAmount.ALL,
-    ) {
-        rule.assertContextMenuItems(
-            cutState = ContextMenuItemState.ENABLED,
-            copyState = ContextMenuItemState.ENABLED,
-            pasteState = ContextMenuItemState.ENABLED,
-            selectAllState = ContextMenuItemState.DISABLED,
-        )
-    }
+    fun btf2_contextMenu_nonEmptyClipboard_fullSelection_itemsMatch() =
+        runBtf2CorrectItemsTest(
+            isEmptyClipboard = false,
+            selectionAmount = SelectionAmount.ALL,
+        ) {
+            rule.assertContextMenuItems(
+                cutState = ContextMenuItemState.ENABLED,
+                copyState = ContextMenuItemState.ENABLED,
+                pasteState = ContextMenuItemState.ENABLED,
+                selectAllState = ContextMenuItemState.DISABLED,
+            )
+        }
 
     @Test
-    fun btf2_contextMenu_password_noSelection_itemsMatch() = runBtf2CorrectItemsTest(
-        isPassword = true,
-        selectionAmount = SelectionAmount.NONE,
-    ) {
-        rule.assertContextMenuItems(
-            cutState = ContextMenuItemState.DISABLED,
-            copyState = ContextMenuItemState.DISABLED,
-            pasteState = ContextMenuItemState.ENABLED,
-            selectAllState = ContextMenuItemState.ENABLED,
-        )
-    }
+    fun btf2_contextMenu_password_noSelection_itemsMatch() =
+        runBtf2CorrectItemsTest(
+            isPassword = true,
+            selectionAmount = SelectionAmount.NONE,
+        ) {
+            rule.assertContextMenuItems(
+                cutState = ContextMenuItemState.DISABLED,
+                copyState = ContextMenuItemState.DISABLED,
+                pasteState = ContextMenuItemState.ENABLED,
+                selectAllState = ContextMenuItemState.ENABLED,
+            )
+        }
 
     @Test
-    fun btf2_contextMenu_password_partialSelection_itemsMatch() = runBtf2CorrectItemsTest(
-        isPassword = true,
-        selectionAmount = SelectionAmount.PARTIAL,
-    ) {
-        rule.assertContextMenuItems(
-            cutState = ContextMenuItemState.DISABLED,
-            copyState = ContextMenuItemState.DISABLED,
-            pasteState = ContextMenuItemState.ENABLED,
-            selectAllState = ContextMenuItemState.ENABLED,
-        )
-    }
+    fun btf2_contextMenu_password_partialSelection_itemsMatch() =
+        runBtf2CorrectItemsTest(
+            isPassword = true,
+            selectionAmount = SelectionAmount.PARTIAL,
+        ) {
+            rule.assertContextMenuItems(
+                cutState = ContextMenuItemState.DISABLED,
+                copyState = ContextMenuItemState.DISABLED,
+                pasteState = ContextMenuItemState.ENABLED,
+                selectAllState = ContextMenuItemState.ENABLED,
+            )
+        }
 
     @Test
-    fun btf2_contextMenu_password_fullSelection_itemsMatch() = runBtf2CorrectItemsTest(
-        isPassword = true,
-        selectionAmount = SelectionAmount.ALL,
-    ) {
-        rule.assertContextMenuItems(
-            cutState = ContextMenuItemState.DISABLED,
-            copyState = ContextMenuItemState.DISABLED,
-            pasteState = ContextMenuItemState.ENABLED,
-            selectAllState = ContextMenuItemState.DISABLED,
-        )
-    }
+    fun btf2_contextMenu_password_fullSelection_itemsMatch() =
+        runBtf2CorrectItemsTest(
+            isPassword = true,
+            selectionAmount = SelectionAmount.ALL,
+        ) {
+            rule.assertContextMenuItems(
+                cutState = ContextMenuItemState.DISABLED,
+                copyState = ContextMenuItemState.DISABLED,
+                pasteState = ContextMenuItemState.ENABLED,
+                selectAllState = ContextMenuItemState.DISABLED,
+            )
+        }
 
     @Test
-    fun btf2_contextMenu_readOnly_noSelection_itemsMatch() = runBtf2CorrectItemsTest(
-        isReadOnly = true,
-        isEmptyClipboard = true,
-        selectionAmount = SelectionAmount.NONE,
-    ) {
-        rule.assertContextMenuItems(
-            cutState = ContextMenuItemState.DISABLED,
-            copyState = ContextMenuItemState.DISABLED,
-            pasteState = ContextMenuItemState.DISABLED,
-            selectAllState = ContextMenuItemState.ENABLED,
-        )
-    }
+    fun btf2_contextMenu_readOnly_noSelection_itemsMatch() =
+        runBtf2CorrectItemsTest(
+            isReadOnly = true,
+            isEmptyClipboard = true,
+            selectionAmount = SelectionAmount.NONE,
+        ) {
+            rule.assertContextMenuItems(
+                cutState = ContextMenuItemState.DISABLED,
+                copyState = ContextMenuItemState.DISABLED,
+                pasteState = ContextMenuItemState.DISABLED,
+                selectAllState = ContextMenuItemState.ENABLED,
+            )
+        }
 
     @Test
-    fun btf2_contextMenu_readOnly_partialSelection_itemsMatch() = runBtf2CorrectItemsTest(
-        isReadOnly = true,
-        isEmptyClipboard = true,
-        selectionAmount = SelectionAmount.PARTIAL,
-    ) {
-        rule.assertContextMenuItems(
-            cutState = ContextMenuItemState.DISABLED,
-            copyState = ContextMenuItemState.ENABLED,
-            pasteState = ContextMenuItemState.DISABLED,
-            selectAllState = ContextMenuItemState.ENABLED,
-        )
-    }
+    fun btf2_contextMenu_readOnly_partialSelection_itemsMatch() =
+        runBtf2CorrectItemsTest(
+            isReadOnly = true,
+            isEmptyClipboard = true,
+            selectionAmount = SelectionAmount.PARTIAL,
+        ) {
+            rule.assertContextMenuItems(
+                cutState = ContextMenuItemState.DISABLED,
+                copyState = ContextMenuItemState.ENABLED,
+                pasteState = ContextMenuItemState.DISABLED,
+                selectAllState = ContextMenuItemState.ENABLED,
+            )
+        }
 
     @Test
-    fun btf2_contextMenu_readOnly_fullSelection_itemsMatch() = runBtf2CorrectItemsTest(
-        isReadOnly = true,
-        isEmptyClipboard = true,
-        selectionAmount = SelectionAmount.ALL,
-    ) {
-        rule.assertContextMenuItems(
-            cutState = ContextMenuItemState.DISABLED,
-            copyState = ContextMenuItemState.ENABLED,
-            pasteState = ContextMenuItemState.DISABLED,
-            selectAllState = ContextMenuItemState.DISABLED,
-        )
-    }
+    fun btf2_contextMenu_readOnly_fullSelection_itemsMatch() =
+        runBtf2CorrectItemsTest(
+            isReadOnly = true,
+            isEmptyClipboard = true,
+            selectionAmount = SelectionAmount.ALL,
+        ) {
+            rule.assertContextMenuItems(
+                cutState = ContextMenuItemState.DISABLED,
+                copyState = ContextMenuItemState.ENABLED,
+                pasteState = ContextMenuItemState.DISABLED,
+                selectAllState = ContextMenuItemState.DISABLED,
+            )
+        }
 
-    private enum class SelectionAmount { NONE, PARTIAL, ALL }
+    private enum class SelectionAmount {
+        NONE,
+        PARTIAL,
+        ALL
+    }
 
     private fun runBtf2CorrectItemsTest(
         isPassword: Boolean = false, // todo use
@@ -751,30 +785,30 @@
         check(!(isPassword && isReadOnly)) { "Can't be a password field and read-only." }
 
         val text = "Text Text Text"
-        val state = TextFieldState(
-            initialText = text,
-            initialSelection = when (selectionAmount) {
-                SelectionAmount.NONE -> TextRange.Zero
-                SelectionAmount.PARTIAL -> TextRange(5, 9)
-                SelectionAmount.ALL -> TextRange(0, 14)
-            }
-        )
+        val state =
+            TextFieldState(
+                initialText = text,
+                initialSelection =
+                    when (selectionAmount) {
+                        SelectionAmount.NONE -> TextRange.Zero
+                        SelectionAmount.PARTIAL -> TextRange(5, 9)
+                        SelectionAmount.ALL -> TextRange(0, 14)
+                    }
+            )
 
-        val clipboardManager = FakeClipboardManager(supportsClipEntry = true).apply {
-            if (isEmptyClipboard) {
-                setClip(null)
-            } else {
-                setText(AnnotatedString("Clipboard Text"))
+        val clipboardManager =
+            FakeClipboardManager(supportsClipEntry = true).apply {
+                if (isEmptyClipboard) {
+                    setClip(null)
+                } else {
+                    setText(AnnotatedString("Clipboard Text"))
+                }
             }
-        }
 
         rule.setTextFieldTestContent {
             CompositionLocalProvider(LocalClipboardManager provides clipboardManager) {
                 if (isPassword) {
-                    BasicSecureTextField(
-                        state = state,
-                        modifier = Modifier.testTag(textFieldTag)
-                    )
+                    BasicSecureTextField(state = state, modifier = Modifier.testTag(textFieldTag))
                 } else {
                     BasicTextField(
                         state = state,
@@ -788,5 +822,5 @@
         rule.onNodeWithTag(textFieldTag).performMouseInput { rightClick(center) }
         assertBlock()
     }
-    //endregion BTF2 Context Menu Correct Item Tests
+    // endregion BTF2 Context Menu Correct Item Tests
 }
diff --git a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/textfield/TextFieldCursorTest.kt b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/textfield/TextFieldCursorTest.kt
index 44db070..35ade52 100644
--- a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/textfield/TextFieldCursorTest.kt
+++ b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/textfield/TextFieldCursorTest.kt
@@ -75,23 +75,22 @@
 @LargeTest
 class TextFieldCursorTest : FocusedWindowTest {
 
-    private val motionDurationScale = object : MotionDurationScale {
-        override var scaleFactor: Float by mutableStateOf(1f)
-    }
+    private val motionDurationScale =
+        object : MotionDurationScale {
+            override var scaleFactor: Float by mutableStateOf(1f)
+        }
 
     @OptIn(ExperimentalTestApi::class)
     @get:Rule
-    val rule = createComposeRule(effectContext = motionDurationScale).also {
-        it.mainClock.autoAdvance = false
-    }
+    val rule =
+        createComposeRule(effectContext = motionDurationScale).also {
+            it.mainClock.autoAdvance = false
+        }
 
     private val boxPadding = 10.dp
     private val cursorColor = Color.Red
-    private val textStyle = TextStyle(
-        color = Color.White,
-        background = Color.White,
-        fontSize = 10.sp
-    )
+    private val textStyle =
+        TextStyle(color = Color.White, background = Color.White, fontSize = 10.sp)
 
     private val textFieldWidth = 40.dp
     private val textFieldHeight = 20.dp
@@ -104,9 +103,7 @@
     private val sizeModifier = Modifier.size(textFieldWidth, textFieldHeight)
 
     // default TextFieldModifier
-    private val textFieldModifier = sizeModifier
-        .then(bgModifier)
-        .then(focusModifier)
+    private val textFieldModifier = sizeModifier.then(bgModifier).then(focusModifier)
 
     // default onTextLayout to capture cursor boundaries.
     private val onTextLayout: (TextLayoutResult) -> Unit = { cursorRect = it.getCursorRect(0) }
@@ -130,9 +127,7 @@
         rule.mainClock.advanceTimeBy(100)
 
         with(rule.density) {
-            rule.onNode(hasSetTextAction())
-                .captureToImage()
-                .assertCursor(2.dp, this, cursorRect)
+            rule.onNode(hasSetTextAction()).captureToImage().assertCursor(2.dp, this, cursorRect)
         }
     }
 
@@ -144,22 +139,18 @@
                 value = "",
                 onValueChange = {},
                 textStyle = textStyle.copy(fontSize = textStyle.fontSize * 2),
-                modifier = Modifier
-                    .size(textFieldWidth, textFieldHeight * 2)
-                    .then(bgModifier)
-                    .then(focusModifier),
-                cursorBrush = Brush.verticalGradient(
-                    // make a brush double/triple color at the beginning and end so we have stable
-                    // colors at the ends.
-                    // Without triple bottom, the bottom color never hits to the provided color.
-                    listOf(
-                        Color.Blue,
-                        Color.Blue,
-                        Color.Green,
-                        Color.Green,
-                        Color.Green
-                    )
-                ),
+                modifier =
+                    Modifier.size(textFieldWidth, textFieldHeight * 2)
+                        .then(bgModifier)
+                        .then(focusModifier),
+                cursorBrush =
+                    Brush.verticalGradient(
+                        // make a brush double/triple color at the beginning and end so we have
+                        // stable
+                        // colors at the ends.
+                        // Without triple bottom, the bottom color never hits to the provided color.
+                        listOf(Color.Blue, Color.Blue, Color.Green, Color.Green, Color.Green)
+                    ),
                 onTextLayout = onTextLayout
             )
         }
@@ -168,8 +159,7 @@
 
         rule.mainClock.advanceTimeBy(100)
 
-        val bitmap = rule.onNode(hasSetTextAction())
-            .captureToImage().toPixelMap()
+        val bitmap = rule.onNode(hasSetTextAction()).captureToImage().toPixelMap()
 
         val cursorLeft = ceil(cursorRect.left).toInt() + 1
         val cursorTop = ceil(cursorRect.top).toInt() + 1
@@ -180,175 +170,176 @@
 
     @Test
     @SdkSuppress(minSdkVersion = Build.VERSION_CODES.O)
-    fun cursorPosition() = with(rule.density) {
-        val cursorOffset = 4
-        val textValue = mutableStateOf(TextFieldValue("test", selection = TextRange(cursorOffset)))
-        rule.setTextFieldTestContent {
-            Box(Modifier.padding(boxPadding)) {
-                BasicTextField(
-                    value = textValue.value,
-                    onValueChange = {},
-                    textStyle = textStyle,
-                    modifier = textFieldModifier,
-                    cursorBrush = SolidColor(cursorColor),
-                    onTextLayout = { cursorRect = it.getCursorRect(cursorOffset) }
-                )
+    fun cursorPosition() =
+        with(rule.density) {
+            val cursorOffset = 4
+            val textValue =
+                mutableStateOf(TextFieldValue("test", selection = TextRange(cursorOffset)))
+            rule.setTextFieldTestContent {
+                Box(Modifier.padding(boxPadding)) {
+                    BasicTextField(
+                        value = textValue.value,
+                        onValueChange = {},
+                        textStyle = textStyle,
+                        modifier = textFieldModifier,
+                        cursorBrush = SolidColor(cursorColor),
+                        onTextLayout = { cursorRect = it.getCursorRect(cursorOffset) }
+                    )
+                }
             }
+
+            focusAndWait()
+
+            rule.mainClock.advanceTimeBy(100)
+
+            assertThat(cursorRect.left).isGreaterThan(0f)
+            assertThat(cursorRect.left).isLessThan(textFieldWidth.toPx())
+            rule.onNode(hasSetTextAction()).captureToImage().assertCursor(2.dp, this, cursorRect)
         }
 
-        focusAndWait()
-
-        rule.mainClock.advanceTimeBy(100)
-
-        assertThat(cursorRect.left).isGreaterThan(0f)
-        assertThat(cursorRect.left).isLessThan(textFieldWidth.toPx())
-        rule.onNode(hasSetTextAction())
-            .captureToImage()
-            .assertCursor(2.dp, this, cursorRect)
-    }
-
     @Test
     @SdkSuppress(minSdkVersion = Build.VERSION_CODES.O)
-    fun cursorPosition_rtl() = with(rule.density) {
-        val cursorOffset = 2
-        val textValue = mutableStateOf(
-            TextFieldValue(
-                "\u05D0\u05D1\u05D2",
-                selection = TextRange(cursorOffset)
-            )
-        )
-        rule.setTextFieldTestContent {
-            Box(Modifier.padding(boxPadding)) {
-                BasicTextField(
-                    value = textValue.value,
-                    onValueChange = {},
-                    textStyle = textStyle.copy(textDirection = TextDirection.Rtl),
-                    modifier = textFieldModifier,
-                    cursorBrush = SolidColor(cursorColor),
-                    onTextLayout = { cursorRect = it.getCursorRect(cursorOffset) }
+    fun cursorPosition_rtl() =
+        with(rule.density) {
+            val cursorOffset = 2
+            val textValue =
+                mutableStateOf(
+                    TextFieldValue("\u05D0\u05D1\u05D2", selection = TextRange(cursorOffset))
                 )
+            rule.setTextFieldTestContent {
+                Box(Modifier.padding(boxPadding)) {
+                    BasicTextField(
+                        value = textValue.value,
+                        onValueChange = {},
+                        textStyle = textStyle.copy(textDirection = TextDirection.Rtl),
+                        modifier = textFieldModifier,
+                        cursorBrush = SolidColor(cursorColor),
+                        onTextLayout = { cursorRect = it.getCursorRect(cursorOffset) }
+                    )
+                }
             }
+
+            focusAndWait()
+
+            rule.mainClock.advanceTimeBy(100)
+
+            assertThat(cursorRect.left).isGreaterThan(0f)
+            assertThat(cursorRect.left).isLessThan(textFieldWidth.toPx())
+            rule.onNode(hasSetTextAction()).captureToImage().assertCursor(2.dp, this, cursorRect)
         }
 
-        focusAndWait()
-
-        rule.mainClock.advanceTimeBy(100)
-
-        assertThat(cursorRect.left).isGreaterThan(0f)
-        assertThat(cursorRect.left).isLessThan(textFieldWidth.toPx())
-        rule.onNode(hasSetTextAction())
-            .captureToImage()
-            .assertCursor(2.dp, this, cursorRect)
-    }
-
     @Test
     @SdkSuppress(minSdkVersion = Build.VERSION_CODES.O)
-    fun cursorPosition_clamped() = with(rule.density) {
-        val cursorOffset = 20
-        val textValue = mutableStateOf(
-            TextFieldValue(
-                "test                      ",
-                selection = TextRange(cursorOffset)
-            )
-        )
-        rule.setTextFieldTestContent {
-            Box(Modifier.padding(boxPadding)) {
-                BasicTextField(
-                    value = textValue.value,
-                    onValueChange = {},
-                    textStyle = textStyle,
-                    modifier = textFieldModifier,
-                    cursorBrush = SolidColor(cursorColor),
-                    onTextLayout = { cursorRect = it.getCursorRect(cursorOffset) }
+    fun cursorPosition_clamped() =
+        with(rule.density) {
+            val cursorOffset = 20
+            val textValue =
+                mutableStateOf(
+                    TextFieldValue(
+                        "test                      ",
+                        selection = TextRange(cursorOffset)
+                    )
                 )
+            rule.setTextFieldTestContent {
+                Box(Modifier.padding(boxPadding)) {
+                    BasicTextField(
+                        value = textValue.value,
+                        onValueChange = {},
+                        textStyle = textStyle,
+                        modifier = textFieldModifier,
+                        cursorBrush = SolidColor(cursorColor),
+                        onTextLayout = { cursorRect = it.getCursorRect(cursorOffset) }
+                    )
+                }
             }
+
+            focusAndWait()
+
+            rule.mainClock.advanceTimeBy(100)
+
+            // Cursor is beyond the right edge of the text field
+            assertThat(cursorRect.left).isGreaterThan(textFieldWidth.toPx())
+            val cursorWidth = 2.dp
+            val clampedCursorHorizontal = (textFieldWidth - cursorWidth).toPx()
+            val clampedCursorRect =
+                Rect(
+                    clampedCursorHorizontal,
+                    cursorRect.top,
+                    clampedCursorHorizontal,
+                    cursorRect.bottom
+                )
+            rule
+                .onNode(hasSetTextAction())
+                .captureToImage()
+                .assertCursor(cursorWidth, this, clampedCursorRect)
         }
 
-        focusAndWait()
-
-        rule.mainClock.advanceTimeBy(100)
-
-        // Cursor is beyond the right edge of the text field
-        assertThat(cursorRect.left).isGreaterThan(textFieldWidth.toPx())
-        val cursorWidth = 2.dp
-        val clampedCursorHorizontal = (textFieldWidth - cursorWidth).toPx()
-        val clampedCursorRect = Rect(
-            clampedCursorHorizontal,
-            cursorRect.top,
-            clampedCursorHorizontal,
-            cursorRect.bottom
-        )
-        rule.onNode(hasSetTextAction())
-            .captureToImage()
-            .assertCursor(cursorWidth, this, clampedCursorRect)
-    }
-
     @Test
     @SdkSuppress(minSdkVersion = Build.VERSION_CODES.O)
-    fun cursorPosition_rtl_clamped() = with(rule.density) {
-        val cursorOffset = 20
-        val textValue = mutableStateOf(
-            TextFieldValue(
-                "\u05D0\u05D1\u05D2                      ",
-                selection = TextRange(cursorOffset)
-            )
-        )
-        rule.setTextFieldTestContent {
-            Box(Modifier.padding(boxPadding)) {
-                BasicTextField(
-                    value = textValue.value,
-                    onValueChange = {},
-                    textStyle = textStyle.copy(textDirection = TextDirection.Rtl),
-                    modifier = textFieldModifier,
-                    cursorBrush = SolidColor(cursorColor),
-                    onTextLayout = { cursorRect = it.getCursorRect(cursorOffset) }
+    fun cursorPosition_rtl_clamped() =
+        with(rule.density) {
+            val cursorOffset = 20
+            val textValue =
+                mutableStateOf(
+                    TextFieldValue(
+                        "\u05D0\u05D1\u05D2                      ",
+                        selection = TextRange(cursorOffset)
+                    )
                 )
+            rule.setTextFieldTestContent {
+                Box(Modifier.padding(boxPadding)) {
+                    BasicTextField(
+                        value = textValue.value,
+                        onValueChange = {},
+                        textStyle = textStyle.copy(textDirection = TextDirection.Rtl),
+                        modifier = textFieldModifier,
+                        cursorBrush = SolidColor(cursorColor),
+                        onTextLayout = { cursorRect = it.getCursorRect(cursorOffset) }
+                    )
+                }
             }
+
+            focusAndWait()
+
+            rule.mainClock.advanceTimeBy(100)
+
+            // Cursor is beyond the left edge of the text field
+            assertThat(cursorRect.left).isLessThan(0f)
+            val clampedCursorRect = Rect(0f, cursorRect.top, 0f, cursorRect.bottom)
+            rule
+                .onNode(hasSetTextAction())
+                .captureToImage()
+                .assertCursor(2.dp, this, clampedCursorRect)
         }
 
-        focusAndWait()
-
-        rule.mainClock.advanceTimeBy(100)
-
-        // Cursor is beyond the left edge of the text field
-        assertThat(cursorRect.left).isLessThan(0f)
-        val clampedCursorRect = Rect(0f, cursorRect.top, 0f, cursorRect.bottom)
-        rule.onNode(hasSetTextAction())
-            .captureToImage()
-            .assertCursor(2.dp, this, clampedCursorRect)
-    }
-
     @Test
     @SdkSuppress(minSdkVersion = Build.VERSION_CODES.O)
-    fun cursorPosition_textFieldThinnerThanCursor() = with(rule.density) {
-        val cursorWidth = 2.dp
-        val thinSizeModifier = Modifier.size(cursorWidth - 0.5.dp, textFieldHeight)
-        val thinTextFieldModifier = thinSizeModifier
-            .then(bgModifier)
-            .then(focusModifier)
-        rule.setTextFieldTestContent {
-            Box(Modifier.padding(boxPadding)) {
-                BasicTextField(
-                    value = "",
-                    onValueChange = {},
-                    textStyle = textStyle,
-                    modifier = thinTextFieldModifier,
-                    cursorBrush = SolidColor(cursorColor),
-                    onTextLayout = onTextLayout
-                )
+    fun cursorPosition_textFieldThinnerThanCursor() =
+        with(rule.density) {
+            val cursorWidth = 2.dp
+            val thinSizeModifier = Modifier.size(cursorWidth - 0.5.dp, textFieldHeight)
+            val thinTextFieldModifier = thinSizeModifier.then(bgModifier).then(focusModifier)
+            rule.setTextFieldTestContent {
+                Box(Modifier.padding(boxPadding)) {
+                    BasicTextField(
+                        value = "",
+                        onValueChange = {},
+                        textStyle = textStyle,
+                        modifier = thinTextFieldModifier,
+                        cursorBrush = SolidColor(cursorColor),
+                        onTextLayout = onTextLayout
+                    )
+                }
             }
+
+            focusAndWait()
+
+            rule.mainClock.advanceTimeBy(100)
+
+            assertThat(cursorRect.left).isEqualTo(0f)
+            rule.onNode(hasSetTextAction()).captureToImage().assertCursor(2.dp, this, cursorRect)
         }
 
-        focusAndWait()
-
-        rule.mainClock.advanceTimeBy(100)
-
-        assertThat(cursorRect.left).isEqualTo(0f)
-        rule.onNode(hasSetTextAction())
-            .captureToImage()
-            .assertCursor(2.dp, this, cursorRect)
-    }
-
     @Test
     @SdkSuppress(minSdkVersion = Build.VERSION_CODES.O)
     fun cursorBlinkingAnimation() {
@@ -368,14 +359,13 @@
         // cursor visible first 500 ms
         rule.mainClock.advanceTimeBy(100)
         with(rule.density) {
-            rule.onNode(hasSetTextAction())
-                .captureToImage()
-                .assertCursor(2.dp, this, cursorRect)
+            rule.onNode(hasSetTextAction()).captureToImage().assertCursor(2.dp, this, cursorRect)
         }
 
         // cursor invisible during next 500 ms
         rule.mainClock.advanceTimeBy(700)
-        rule.onNode(hasSetTextAction())
+        rule
+            .onNode(hasSetTextAction())
             .captureToImage()
             .assertShape(
                 density = rule.density,
@@ -409,14 +399,13 @@
         // cursor visible first 500 ms
         rule.mainClock.advanceTimeBy(100)
         with(rule.density) {
-            rule.onNode(hasSetTextAction())
-                .captureToImage()
-                .assertCursor(2.dp, this, cursorRect)
+            rule.onNode(hasSetTextAction()).captureToImage().assertCursor(2.dp, this, cursorRect)
         }
 
         // cursor invisible during next 500 ms
         rule.mainClock.advanceTimeBy(700)
-        rule.onNode(hasSetTextAction())
+        rule
+            .onNode(hasSetTextAction())
             .captureToImage()
             .assertShape(
                 density = rule.density,
@@ -443,7 +432,8 @@
         focusAndWait()
 
         // no cursor when usually shown
-        rule.onNode(hasSetTextAction())
+        rule
+            .onNode(hasSetTextAction())
             .captureToImage()
             .assertShape(
                 density = rule.density,
@@ -455,7 +445,8 @@
 
         // no cursor when should be no cursor
         rule.mainClock.advanceTimeBy(700)
-        rule.onNode(hasSetTextAction())
+        rule
+            .onNode(hasSetTextAction())
             .captureToImage()
             .assertShape(
                 density = rule.density,
@@ -490,16 +481,13 @@
         //  cursor position when sending a text
 
         // change text field value
-        rule.onNode(hasSetTextAction())
-            .performTextReplacement("")
+        rule.onNode(hasSetTextAction()).performTextReplacement("")
 
         // cursor would have been invisible during next 500 ms if cursor blinks while typing.
         // To prevent blinking while typing we restart animation when new symbol is typed.
         rule.mainClock.advanceTimeBy(400)
         with(rule.density) {
-            rule.onNode(hasSetTextAction())
-                .captureToImage()
-                .assertCursor(2.dp, this, cursorRect)
+            rule.onNode(hasSetTextAction()).captureToImage().assertCursor(2.dp, this, cursorRect)
         }
     }
 
@@ -529,17 +517,13 @@
         // TODO(b/170298051) check here that cursor is visible when we have a way to control
         //  cursor position when sending a text
 
-        rule.runOnIdle {
-            textValue.value = textValue.value.copy(selection = TextRange(0))
-        }
+        rule.runOnIdle { textValue.value = textValue.value.copy(selection = TextRange(0)) }
 
         // necessary for animation to start (shows cursor again)
         rule.mainClock.advanceTimeByFrame()
 
         with(rule.density) {
-            rule.onNode(hasSetTextAction())
-                .captureToImage()
-                .assertCursor(2.dp, this, cursorRect)
+            rule.onNode(hasSetTextAction()).captureToImage().assertCursor(2.dp, this, cursorRect)
         }
     }
 
@@ -564,7 +548,8 @@
         cursorBrush = SolidColor(Color.Green)
         rule.mainClock.advanceTimeByFrame()
 
-        rule.onNode(hasSetTextAction())
+        rule
+            .onNode(hasSetTextAction())
             .captureToImage()
             .assertShape(
                 density = rule.density,
@@ -579,16 +564,17 @@
     @SdkSuppress(minSdkVersion = Build.VERSION_CODES.O)
     fun cursorNotBlinking_whenWindowLostFocus() {
         val focusWindow = mutableStateOf(true)
-        fun createWindowInfo(focused: Boolean) = object : WindowInfo {
-            override val isWindowFocused: Boolean
-                get() = focused
-        }
+        fun createWindowInfo(focused: Boolean) =
+            object : WindowInfo {
+                override val isWindowFocused: Boolean
+                    get() = focused
+            }
         rule.setTextFieldTestContent {
             CompositionLocalProvider(LocalWindowInfo provides createWindowInfo(focusWindow.value)) {
                 Box(Modifier.padding(boxPadding)) {
                     BasicTextField(
                         value = "",
-                        onValueChange = { },
+                        onValueChange = {},
                         textStyle = textStyle,
                         modifier = textFieldModifier,
                         cursorBrush = SolidColor(cursorColor),
@@ -602,9 +588,7 @@
 
         // cursor visible first 500ms
         rule.mainClock.advanceTimeBy(100)
-        rule.onNode(hasSetTextAction())
-            .captureToImage()
-            .assertContainsColor(cursorColor)
+        rule.onNode(hasSetTextAction()).captureToImage().assertContainsColor(cursorColor)
 
         // window loses focus
         focusWindow.value = false
@@ -612,25 +596,24 @@
 
         // check that text field cursor disappeared even within visible 500ms
         rule.mainClock.advanceTimeBy(100)
-        rule.onNode(hasSetTextAction())
-            .captureToImage()
-            .assertDoesNotContainColor(cursorColor)
+        rule.onNode(hasSetTextAction()).captureToImage().assertDoesNotContainColor(cursorColor)
     }
 
     @Test
     @SdkSuppress(minSdkVersion = Build.VERSION_CODES.O)
     fun focusedTextField_resumeBlinking_whenWindowRegainsFocus() {
         val focusWindow = mutableStateOf(true)
-        fun createWindowInfo(focused: Boolean) = object : WindowInfo {
-            override val isWindowFocused: Boolean
-                get() = focused
-        }
+        fun createWindowInfo(focused: Boolean) =
+            object : WindowInfo {
+                override val isWindowFocused: Boolean
+                    get() = focused
+            }
         rule.setTextFieldTestContent {
             CompositionLocalProvider(LocalWindowInfo provides createWindowInfo(focusWindow.value)) {
                 Box(Modifier.padding(boxPadding)) {
                     BasicTextField(
                         value = "",
-                        onValueChange = { },
+                        onValueChange = {},
                         textStyle = textStyle,
                         modifier = textFieldModifier,
                         cursorBrush = SolidColor(cursorColor),
@@ -648,16 +631,15 @@
 
         // check that text field cursor disappeared even within visible 500ms
         rule.mainClock.advanceTimeBy(100)
-        rule.onNode(hasSetTextAction())
-            .captureToImage()
-            .assertDoesNotContainColor(cursorColor)
+        rule.onNode(hasSetTextAction()).captureToImage().assertDoesNotContainColor(cursorColor)
 
         // window regains focus within 500ms
         focusWindow.value = true
         rule.waitForIdle()
 
         rule.mainClock.advanceTimeBy(100)
-        rule.onNode(hasSetTextAction())
+        rule
+            .onNode(hasSetTextAction())
             .captureToImage()
             .assertContainsColor(cursorColor)
             .assertCursor(2.dp, rule.density, cursorRect)
@@ -678,26 +660,26 @@
         assertThat(cursorWidthPx).isGreaterThan(2)
 
         // shrink the check are by 1px for left, top, right, bottom
-        val checkRect = Rect(
-            ceil(cursorRect.left) + 1,
-            ceil(cursorRect.top) + 1,
-            floor(cursorRect.right) + cursorWidthPx - 1,
-            floor(cursorRect.bottom) - 1
-        )
+        val checkRect =
+            Rect(
+                ceil(cursorRect.left) + 1,
+                ceil(cursorRect.top) + 1,
+                floor(cursorRect.right) + cursorWidthPx - 1,
+                floor(cursorRect.bottom) - 1
+            )
 
         // skip an expanded rectangle that is 1px larger than cursor rectangle
-        val skipRect = Rect(
-            floor(cursorRect.left) - 1,
-            floor(cursorRect.top) - 1,
-            ceil(cursorRect.right) + cursorWidthPx + 1,
-            ceil(cursorRect.bottom) + 1
-        )
+        val skipRect =
+            Rect(
+                floor(cursorRect.left) - 1,
+                floor(cursorRect.top) - 1,
+                ceil(cursorRect.right) + cursorWidthPx + 1,
+                ceil(cursorRect.bottom) + 1
+            )
 
         val width = width
         val height = height
-        this.assertPixels(
-            IntSize(width, height)
-        ) { position ->
+        this.assertPixels(IntSize(width, height)) { position ->
             if (checkRect.contains(position.toOffset())) {
                 // cursor
                 cursorColor
diff --git a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/textfield/TextFieldDefaultWidthTest.kt b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/textfield/TextFieldDefaultWidthTest.kt
index 783a112..e4c9499 100644
--- a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/textfield/TextFieldDefaultWidthTest.kt
+++ b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/textfield/TextFieldDefaultWidthTest.kt
@@ -45,8 +45,7 @@
 @RunWith(AndroidJUnit4::class)
 class BaseTextFieldDefaultWidthTest {
 
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
     val density = Density(density = 1f, fontScale = 1f)
 
@@ -77,16 +76,13 @@
             DefaultWidthTextField(
                 text = "",
                 fontSize = fontSize,
-                modifier = Modifier
-                    .defaultMinSize(minWidth)
-                    .onGloballyPositioned { size = it.size.width },
+                modifier =
+                    Modifier.defaultMinSize(minWidth).onGloballyPositioned { size = it.size.width },
                 density = density
             )
         }
 
-        with(density) {
-            assertThat(size).isEqualTo(minWidth.roundToPx())
-        }
+        with(density) { assertThat(size).isEqualTo(minWidth.roundToPx()) }
     }
 
     @Test
@@ -99,16 +95,13 @@
             DefaultWidthTextField(
                 text = "",
                 fontSize = fontSize,
-                modifier = Modifier
-                    .requiredWidth(width)
-                    .onGloballyPositioned { size = it.size.width },
+                modifier =
+                    Modifier.requiredWidth(width).onGloballyPositioned { size = it.size.width },
                 density = density
             )
         }
 
-        with(density) {
-            assertThat(size).isEqualTo(width.roundToPx())
-        }
+        with(density) { assertThat(size).isEqualTo(width.roundToPx()) }
     }
 
     @Test
@@ -156,24 +149,19 @@
             DefaultWidthTextField(
                 text = "abc",
                 fontSize = fontSize,
-                modifier = Modifier
-                    .width(textFieldWidth)
-                    .onGloballyPositioned { size = it.size.width },
+                modifier =
+                    Modifier.width(textFieldWidth).onGloballyPositioned { size = it.size.width },
                 density = density
             )
         }
 
-        with(density) {
-            assertThat(size).isEqualTo(textFieldWidth.roundToPx())
-        }
+        with(density) { assertThat(size).isEqualTo(textFieldWidth.roundToPx()) }
     }
 
     private fun defaultTextFieldSize(
         fontSize: TextUnit,
         charCount: Int = 10 // 10 is the configuration for default TextField width in glyphs
-    ): Int = with(density) {
-        ceil(charCount * fontSize.toPx()).roundToInt()
-    }
+    ): Int = with(density) { ceil(charCount * fontSize.toPx()).roundToInt() }
 }
 
 @Composable
diff --git a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/textfield/TextFieldFocusCustomDialogTest.kt b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/textfield/TextFieldFocusCustomDialogTest.kt
index 052cd45..d099c03 100644
--- a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/textfield/TextFieldFocusCustomDialogTest.kt
+++ b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/textfield/TextFieldFocusCustomDialogTest.kt
@@ -56,8 +56,7 @@
 @SmallTest
 @RunWith(AndroidJUnit4::class)
 class TextFieldFocusCustomDialogTest {
-    @get:Rule
-    val rule = createAndroidComposeRule<FragmentActivity>()
+    @get:Rule val rule = createAndroidComposeRule<FragmentActivity>()
 
     data class FocusTestData(val focusRequester: FocusRequester, var focused: Boolean = false)
 
@@ -68,14 +67,8 @@
     @FlakyTest(bugId = 298465647)
     fun keyboardShown_forFieldInAndroidDialog_whenFocusRequestedImmediately_fromLaunchedEffect() {
         keyboardIsShown_whenFocusRequestedImmediately_fromEffect(
-            runEffect = {
-                LaunchedEffect(Unit) {
-                    it()
-                }
-            },
-            wrapContent = {
-                CustomDialog(content = it)
-            }
+            runEffect = { LaunchedEffect(Unit) { it() } },
+            wrapContent = { CustomDialog(content = it) }
         )
     }
 
@@ -92,9 +85,7 @@
                     onDispose {}
                 }
             },
-            wrapContent = {
-                CustomDialog(content = it)
-            }
+            wrapContent = { CustomDialog(content = it) }
         )
     }
 
@@ -151,21 +142,23 @@
         }
     }
 
-    private tailrec fun Context.findActivity(): FragmentActivity = when (this) {
-        is FragmentActivity -> this
-        is ContextWrapper -> baseContext.findActivity()
-        else -> error("No FragmentActivity found")
-    }
+    private tailrec fun Context.findActivity(): FragmentActivity =
+        when (this) {
+            is FragmentActivity -> this
+            is ContextWrapper -> baseContext.findActivity()
+            else -> error("No FragmentActivity found")
+        }
 
     class CustomDialogFragment(private val content: @Composable () -> Unit) : DialogFragment() {
         override fun onCreateView(
             inflater: LayoutInflater,
             container: ViewGroup?,
             savedInstanceState: Bundle?
-        ): View = ComposeView(requireContext()).also {
-            it.setViewTreeLifecycleOwner(this)
-            it.setViewTreeSavedStateRegistryOwner(this)
-            it.setContent(content)
-        }
+        ): View =
+            ComposeView(requireContext()).also {
+                it.setViewTreeLifecycleOwner(this)
+                it.setViewTreeSavedStateRegistryOwner(this)
+                it.setContent(content)
+            }
     }
 }
diff --git a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/textfield/TextFieldFocusTest.kt b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/textfield/TextFieldFocusTest.kt
index 75f2758..f48624c 100644
--- a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/textfield/TextFieldFocusTest.kt
+++ b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/textfield/TextFieldFocusTest.kt
@@ -90,8 +90,7 @@
 @LargeTest
 @RunWith(AndroidJUnit4::class)
 class TextFieldFocusTest {
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
     private val inputMethodInterceptor = InputMethodInterceptor(rule)
 
     private val testKeyboardController = TestSoftwareKeyboardController(rule)
@@ -102,13 +101,11 @@
             val editor = remember { mutableStateOf("") }
             BasicTextField(
                 value = editor.value,
-                modifier = Modifier
-                    .focusRequester(data.focusRequester)
-                    .onFocusChanged { data.focused = it.isFocused }
-                    .requiredWidth(10.dp),
-                onValueChange = {
-                    editor.value = it
-                }
+                modifier =
+                    Modifier.focusRequester(data.focusRequester)
+                        .onFocusChanged { data.focused = it.isFocused }
+                        .requiredWidth(10.dp),
+                onValueChange = { editor.value = it }
             )
         }
     }
@@ -120,11 +117,12 @@
         lateinit var testDataList: List<FocusTestData>
 
         rule.setContent {
-            testDataList = listOf(
-                FocusTestData(FocusRequester()),
-                FocusTestData(FocusRequester()),
-                FocusTestData(FocusRequester())
-            )
+            testDataList =
+                listOf(
+                    FocusTestData(FocusRequester()),
+                    FocusTestData(FocusRequester()),
+                    FocusTestData(FocusRequester())
+                )
 
             TextFieldApp(testDataList)
         }
@@ -162,31 +160,20 @@
                 value = TextFieldValue(),
                 onValueChange = {},
                 enabled = enabled.value,
-                modifier = Modifier
-                    .testTag(tag)
-                    .onFocusChanged {
-                        focused = it.isFocused
-                    }
+                modifier = Modifier.testTag(tag).onFocusChanged { focused = it.isFocused }
             )
         }
         // bring enabled text field into focus
-        rule.onNodeWithTag(tag)
-            .performClick()
-        rule.runOnIdle {
-            assertThat(focused).isTrue()
-        }
+        rule.onNodeWithTag(tag).performClick()
+        rule.runOnIdle { assertThat(focused).isTrue() }
 
         // make text field disabled
         enabled.value = false
-        rule.runOnIdle {
-            assertThat(focused).isFalse()
-        }
+        rule.runOnIdle { assertThat(focused).isFalse() }
 
         // make text field enabled again, it must not crash
         enabled.value = true
-        rule.runOnIdle {
-            assertThat(focused).isFalse()
-        }
+        rule.runOnIdle { assertThat(focused).isFalse() }
     }
 
     @Test
@@ -196,8 +183,7 @@
         val focusRequester = FocusRequester()
         rule.setContent {
             Column(
-                Modifier
-                    .height(100.dp)
+                Modifier.height(100.dp)
                     .onPlaced { outerCoordinates = it }
                     .verticalScroll(rememberScrollState())
             ) {
@@ -206,13 +192,10 @@
                 CoreTextField(
                     value = TextFieldValue(),
                     onValueChange = {},
-                    modifier = Modifier
-                        .focusRequester(focusRequester)
-                        .onPlaced { innerCoordinates = it },
+                    modifier =
+                        Modifier.focusRequester(focusRequester).onPlaced { innerCoordinates = it },
                     decorationBox = { innerTextField ->
-                        Box(Modifier.padding(20.dp)) {
-                            innerTextField()
-                        }
+                        Box(Modifier.padding(20.dp)) { innerTextField() }
                     }
                 )
             }
@@ -221,11 +204,11 @@
         rule.runOnIdle {
             // Text field should start completely clipped.
             assertThat(
-                outerCoordinates!!.localBoundingBoxOf(
-                    innerCoordinates!!,
-                    clipBounds = true
-                ).size
-            ).isEqualTo(Size.Zero)
+                    outerCoordinates!!
+                        .localBoundingBoxOf(innerCoordinates!!, clipBounds = true)
+                        .size
+                )
+                .isEqualTo(Size.Zero)
 
             focusRequester.requestFocus()
         }
@@ -233,11 +216,11 @@
         rule.runOnIdle {
             // Text field should be completely visible.
             assertThat(
-                outerCoordinates!!.localBoundingBoxOf(
-                    innerCoordinates!!,
-                    clipBounds = true
-                ).size
-            ).isEqualTo(innerCoordinates!!.size.toSize())
+                    outerCoordinates!!
+                        .localBoundingBoxOf(innerCoordinates!!, clipBounds = true)
+                        .size
+                )
+                .isEqualTo(innerCoordinates!!.size.toSize())
         }
     }
 
@@ -246,11 +229,7 @@
     @Test
     fun textInputStarted_forFieldInActivity_whenFocusRequestedImmediately_fromLaunchedEffect() {
         textInputStarted_whenFocusRequestedImmediately_fromEffect(
-            runEffect = {
-                LaunchedEffect(Unit) {
-                    it()
-                }
-            }
+            runEffect = { LaunchedEffect(Unit) { it() } }
         )
     }
 
@@ -273,14 +252,8 @@
     @Test
     fun textInputStarted_forFieldInDialog_whenFocusRequestedImmediately_fromLaunchedEffect() {
         textInputStarted_whenFocusRequestedImmediately_fromEffect(
-            runEffect = {
-                LaunchedEffect(Unit) {
-                    it()
-                }
-            },
-            wrapContent = {
-                Dialog(onDismissRequest = {}, content = it)
-            }
+            runEffect = { LaunchedEffect(Unit) { it() } },
+            wrapContent = { Dialog(onDismissRequest = {}, content = it) }
         )
     }
 
@@ -296,9 +269,7 @@
                     onDispose {}
                 }
             },
-            wrapContent = {
-                Dialog(onDismissRequest = {}, content = it)
-            }
+            wrapContent = { Dialog(onDismissRequest = {}, content = it) }
         )
     }
 
@@ -310,7 +281,6 @@
 
         inputMethodInterceptor.setContent {
             wrapContent {
-
                 runEffect {
                     inputMethodInterceptor.assertNoSessionActive()
                     focusRequester.requestFocus()
@@ -528,12 +498,13 @@
 
         // Move focus to the next focusable element via shift+tab
         assertThat(
-            keyPressOnKeyboardInputDevice(
-                rule,
-                NativeKeyEvent.KEYCODE_TAB,
-                metaState = KeyEvent.META_SHIFT_ON
+                keyPressOnKeyboardInputDevice(
+                    rule,
+                    NativeKeyEvent.KEYCODE_TAB,
+                    metaState = KeyEvent.META_SHIFT_ON
+                )
             )
-        ).isTrue()
+            .isTrue()
 
         // Check if the element to the left of text field gains focus
         rule.onNodeWithTag("test-button-left").assertIsFocused()
@@ -548,17 +519,31 @@
         // event is actually null.
         val invalidDeviceId = -2
         val keyCode = NativeKeyEvent.KEYCODE_DPAD_CENTER
-        val keyEventDown = KeyEvent(
-            SystemClock.uptimeMillis(), SystemClock.uptimeMillis(),
-            KeyEvent.ACTION_DOWN, keyCode, 0, 0, invalidDeviceId, 0
-        )
+        val keyEventDown =
+            KeyEvent(
+                SystemClock.uptimeMillis(),
+                SystemClock.uptimeMillis(),
+                KeyEvent.ACTION_DOWN,
+                keyCode,
+                0,
+                0,
+                invalidDeviceId,
+                0
+            )
         assertThat(keyEventDown.device).isNull()
         rule.onRoot().performKeyPress(androidx.compose.ui.input.key.KeyEvent(keyEventDown))
         rule.waitForIdle()
-        val keyEventUp = KeyEvent(
-            SystemClock.uptimeMillis(), SystemClock.uptimeMillis(),
-            KeyEvent.ACTION_UP, keyCode, 0, 0, invalidDeviceId, 0
-        )
+        val keyEventUp =
+            KeyEvent(
+                SystemClock.uptimeMillis(),
+                SystemClock.uptimeMillis(),
+                KeyEvent.ACTION_UP,
+                keyCode,
+                0,
+                0,
+                invalidDeviceId,
+                0
+            )
         rule.onRoot().performKeyPress(androidx.compose.ui.input.key.KeyEvent(keyEventUp))
         rule.waitForIdle()
     }
@@ -614,19 +599,15 @@
 
     @Composable
     private fun TestFocusableElement(id: String) {
-        var isFocused by remember {
-            mutableStateOf(false)
-        }
+        var isFocused by remember { mutableStateOf(false) }
         BasicText(
             text = "test-button-$id",
-            modifier = Modifier
-                .testTag("test-button-$id")
-                .padding(10.dp)
-                .onFocusChanged {
-                    isFocused = it.hasFocus
-                }
-                .focusable()
-                .border(2.dp, if (isFocused) Color.Green else Color.Cyan)
+            modifier =
+                Modifier.testTag("test-button-$id")
+                    .padding(10.dp)
+                    .onFocusChanged { isFocused = it.hasFocus }
+                    .focusable()
+                    .border(2.dp, if (isFocused) Color.Green else Color.Cyan)
         )
     }
 
@@ -636,31 +617,22 @@
         singleLine: Boolean,
         requestFocus: Boolean = false,
     ) {
-        var textInput by remember {
-            mutableStateOf("")
-        }
-        var isFocused by remember {
-            mutableStateOf(false)
-        }
-        val focusRequester = remember {
-            FocusRequester()
-        }
+        var textInput by remember { mutableStateOf("") }
+        var isFocused by remember { mutableStateOf(false) }
+        val focusRequester = remember { FocusRequester() }
         val modifier = if (requestFocus) Modifier.focusRequester(focusRequester) else Modifier
 
         BasicTextField(
             value = textInput,
-            onValueChange = {
-                textInput = it
-            },
+            onValueChange = { textInput = it },
             singleLine = singleLine,
             keyboardOptions = KeyboardOptions(imeAction = ImeAction.Next),
-            modifier = modifier
-                .testTag("test-text-field-$id")
-                .padding(10.dp)
-                .onFocusChanged {
-                    isFocused = it.isFocused || it.hasFocus
-                }
-                .border(2.dp, if (isFocused) Color.Red else Color.Transparent)
+            modifier =
+                modifier
+                    .testTag("test-text-field-$id")
+                    .padding(10.dp)
+                    .onFocusChanged { isFocused = it.isFocused || it.hasFocus }
+                    .border(2.dp, if (isFocused) Color.Red else Color.Transparent)
         )
 
         LaunchedEffect(requestFocus, focusRequester) {
@@ -689,20 +661,37 @@
         count: Int = 1,
         metaState: Int = 0,
     ): Boolean {
-        val deviceId = InputDevice.getDeviceIds().firstOrNull { id ->
-            InputDevice.getDevice(id)?.isVirtual?.not() ?: false &&
-                InputDevice.getDevice(id)?.supportsSource(source) ?: false
-        } ?: return false
-        val keyEventDown = KeyEvent(
-            SystemClock.uptimeMillis(), SystemClock.uptimeMillis(),
-            KeyEvent.ACTION_DOWN, keyCode, 0, metaState,
-            deviceId, 0, 0, source
-        )
-        val keyEventUp = KeyEvent(
-            SystemClock.uptimeMillis(), SystemClock.uptimeMillis(),
-            KeyEvent.ACTION_UP, keyCode, 0, metaState,
-            deviceId, 0, 0, source
-        )
+        val deviceId =
+            InputDevice.getDeviceIds().firstOrNull { id ->
+                InputDevice.getDevice(id)?.isVirtual?.not() ?: false &&
+                    InputDevice.getDevice(id)?.supportsSource(source) ?: false
+            } ?: return false
+        val keyEventDown =
+            KeyEvent(
+                SystemClock.uptimeMillis(),
+                SystemClock.uptimeMillis(),
+                KeyEvent.ACTION_DOWN,
+                keyCode,
+                0,
+                metaState,
+                deviceId,
+                0,
+                0,
+                source
+            )
+        val keyEventUp =
+            KeyEvent(
+                SystemClock.uptimeMillis(),
+                SystemClock.uptimeMillis(),
+                KeyEvent.ACTION_UP,
+                keyCode,
+                0,
+                metaState,
+                deviceId,
+                0,
+                0,
+                source
+            )
 
         repeat(count) {
             rule.onRoot().performKeyPress(androidx.compose.ui.input.key.KeyEvent(keyEventDown))
@@ -715,9 +704,7 @@
     // Triggers a key press on the virtual keyboard
     private fun keyPressOnVirtualKeyboard(keyCode: Int, count: Int = 1) {
         rule.waitForIdle()
-        repeat(count) {
-            InstrumentationRegistry.getInstrumentation().sendKeyDownUpSync(keyCode)
-        }
+        repeat(count) { InstrumentationRegistry.getInstrumentation().sendKeyDownUpSync(keyCode) }
         rule.waitForIdle()
     }
 }
diff --git a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/textfield/TextFieldOnValueChangeTextFieldValueTest.kt b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/textfield/TextFieldOnValueChangeTextFieldValueTest.kt
index b7250a8..c4eccb8 100644
--- a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/textfield/TextFieldOnValueChangeTextFieldValueTest.kt
+++ b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/textfield/TextFieldOnValueChangeTextFieldValueTest.kt
@@ -44,8 +44,7 @@
 @MediumTest
 @RunWith(AndroidJUnit4::class)
 class TextFieldOnValueChangeTextFieldValueTest {
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
     private val inputMethodInterceptor = InputMethodInterceptor(rule)
     private val onValueChange: (TextFieldValue) -> Unit = mock()
@@ -53,14 +52,7 @@
     @Before
     fun setUp() {
         inputMethodInterceptor.setContent {
-            val state = remember {
-                mutableStateOf(
-                    TextFieldValue(
-                        "abcde",
-                        TextRange.Zero
-                    )
-                )
-            }
+            val state = remember { mutableStateOf(TextFieldValue("abcde", TextRange.Zero)) }
             BasicTextField(
                 value = state.value,
                 onValueChange = {
@@ -71,27 +63,16 @@
         }
 
         // Perform click to focus in.
-        rule.onNode(hasSetTextAction())
-            .performTouchInput { click(Offset(1f, 1f)) }
+        rule.onNode(hasSetTextAction()).performTouchInput { click(Offset(1f, 1f)) }
     }
 
     @Test
     fun commitText_onValueChange_call_once() {
         // Committing text should be reported as value change
-        inputMethodInterceptor.withInputConnection {
-            commitText("ABCDE", 1)
-        }
+        inputMethodInterceptor.withInputConnection { commitText("ABCDE", 1) }
 
         rule.runOnIdle {
-            verify(onValueChange, times(1))
-                .invoke(
-                    eq(
-                        TextFieldValue(
-                            "ABCDEabcde",
-                            TextRange(5)
-                        )
-                    )
-                )
+            verify(onValueChange, times(1)).invoke(eq(TextFieldValue("ABCDEabcde", TextRange(5))))
         }
     }
 
@@ -99,12 +80,8 @@
     fun setComposingRegion_onValueChange_call_once() {
         val textFieldValueCaptor = argumentCaptor<TextFieldValue>()
         // Composition change will be reported as a change
-        inputMethodInterceptor.withInputConnection {
-            setComposingRegion(0, 5)
-        }
-        inputMethodInterceptor.withInputConnection {
-            setComposingRegion(0, 5)
-        }
+        inputMethodInterceptor.withInputConnection { setComposingRegion(0, 5) }
+        inputMethodInterceptor.withInputConnection { setComposingRegion(0, 5) }
 
         rule.runOnIdle {
             verify(onValueChange, times(1)).invoke(textFieldValueCaptor.capture())
@@ -119,9 +96,7 @@
         val textFieldValueCaptor = argumentCaptor<TextFieldValue>()
         val composingText = "ABCDE"
 
-        inputMethodInterceptor.withInputConnection {
-            setComposingText(composingText, 1)
-        }
+        inputMethodInterceptor.withInputConnection { setComposingText(composingText, 1) }
 
         rule.runOnIdle {
             verify(onValueChange, times(1)).invoke(textFieldValueCaptor.capture())
@@ -134,19 +109,10 @@
     @Test
     fun setSelection_onValueChange_call_once() {
         // Selection change is a part of value-change in EditorModel text field
-        inputMethodInterceptor.withInputConnection {
-            setSelection(1, 1)
-        }
+        inputMethodInterceptor.withInputConnection { setSelection(1, 1) }
 
         rule.runOnIdle {
-            verify(onValueChange, times(1)).invoke(
-                eq(
-                    TextFieldValue(
-                        "abcde",
-                        TextRange(1)
-                    )
-                )
-            )
+            verify(onValueChange, times(1)).invoke(eq(TextFieldValue("abcde", TextRange(1))))
         }
     }
 
@@ -155,25 +121,20 @@
         val textFieldValueCaptor = argumentCaptor<TextFieldValue>()
         val composingText = "ABCDE"
 
-        inputMethodInterceptor.withInputConnection {
-            setComposingText(composingText, 1)
-        }
+        inputMethodInterceptor.withInputConnection { setComposingText(composingText, 1) }
 
         rule.runOnIdle {
             verify(onValueChange, times(1)).invoke(textFieldValueCaptor.capture())
             assertThat(textFieldValueCaptor.firstValue.text).isEqualTo("ABCDEabcde")
             assertThat(textFieldValueCaptor.firstValue.selection).isEqualTo(TextRange(5))
-            assertThat(textFieldValueCaptor.firstValue.composition).isEqualTo(
-                TextRange(0, composingText.length)
-            )
+            assertThat(textFieldValueCaptor.firstValue.composition)
+                .isEqualTo(TextRange(0, composingText.length))
         }
 
         // Composition change will be reported as a change
         clearInvocations(onValueChange)
         val compositionClearCaptor = argumentCaptor<TextFieldValue>()
-        inputMethodInterceptor.withInputConnection {
-            finishComposingText()
-        }
+        inputMethodInterceptor.withInputConnection { finishComposingText() }
         rule.runOnIdle {
             verify(onValueChange, times(1)).invoke(compositionClearCaptor.capture())
             assertThat(compositionClearCaptor.firstValue.text).isEqualTo("ABCDEabcde")
@@ -184,19 +145,10 @@
 
     @Test
     fun deleteSurroundingText_onValueChange_call_once() {
-        inputMethodInterceptor.withInputConnection {
-            deleteSurroundingText(0, 1)
-        }
+        inputMethodInterceptor.withInputConnection { deleteSurroundingText(0, 1) }
 
         rule.runOnIdle {
-            verify(onValueChange, times(1)).invoke(
-                eq(
-                    TextFieldValue(
-                        "bcde",
-                        TextRange.Zero
-                    )
-                )
-            )
+            verify(onValueChange, times(1)).invoke(eq(TextFieldValue("bcde", TextRange.Zero)))
         }
     }
 }
diff --git a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/textfield/TextFieldScrollTest.kt b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/textfield/TextFieldScrollTest.kt
index 063c0b8..c8ded43 100644
--- a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/textfield/TextFieldScrollTest.kt
+++ b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/textfield/TextFieldScrollTest.kt
@@ -95,31 +95,29 @@
 
 /**
  * These tests are for testing the text field scrolling modifiers [Modifier.textFieldScroll] and
- * [Modifier.textFieldScrollable] working together.
- * The tests are structured in a way that
+ * [Modifier.textFieldScrollable] working together. The tests are structured in a way that
  * - two modifiers are applied to the text which exposes its [TextLayoutResult]
  * - swipe gesture applied
- * - [TextFieldScrollerPosition] state is checked to see if scrolling happened
- * Previously we were able to test using CoreTextField. But with the decoration box change these
- * two modifiers are already applied to the CoreTextField internally. Therefore we have no access
- * to the [TextFieldScrollerPosition] object anymore. As such, CoreTextField was replaced with
- * [BasicText] which is equivalent for testing these modifiers
+ * - [TextFieldScrollerPosition] state is checked to see if scrolling happened Previously we were
+ *   able to test using CoreTextField. But with the decoration box change these two modifiers are
+ *   already applied to the CoreTextField internally. Therefore we have no access to the
+ *   [TextFieldScrollerPosition] object anymore. As such, CoreTextField was replaced with
+ *   [BasicText] which is equivalent for testing these modifiers
  */
-
 @MediumTest
 @RunWith(AndroidJUnit4::class)
 class TextFieldScrollTest : FocusedWindowTest {
 
     private val TextfieldTag = "textField"
 
-    private val longText = "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do " +
-        "eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam," +
-        " quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. " +
-        "Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu " +
-        "fugiat nulla pariatur."
+    private val longText =
+        "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do " +
+            "eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam," +
+            " quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. " +
+            "Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu " +
+            "fugiat nulla pariatur."
 
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
     @Before
     fun before() {
@@ -136,7 +134,9 @@
         val scrollerPosition = TextFieldScrollerPosition(Orientation.Horizontal)
 
         rule.setupHorizontallyScrollableContent(
-            scrollerPosition, longText, Modifier.size(width = 300.dp, height = 50.dp)
+            scrollerPosition,
+            longText,
+            Modifier.size(width = 300.dp, height = 50.dp)
         )
 
         rule.runOnIdle {
@@ -188,9 +188,7 @@
             modifier = Modifier.size(width = 300.dp, height = 50.dp)
         )
 
-        rule.runOnIdle {
-            assertThat(scrollerPosition.maximum).isEqualTo(0f)
-        }
+        rule.runOnIdle { assertThat(scrollerPosition.maximum).isEqualTo(0f) }
     }
 
     @Test
@@ -203,9 +201,7 @@
             modifier = Modifier.size(width = 300.dp, height = 100.dp)
         )
 
-        rule.runOnIdle {
-            assertThat(scrollerPosition.maximum).isEqualTo(0f)
-        }
+        rule.runOnIdle { assertThat(scrollerPosition.maximum).isEqualTo(0f) }
     }
 
     @Test
@@ -218,12 +214,7 @@
 
         with(rule.density) {
             rule.setTextFieldTestContent {
-                Box(
-                    Modifier
-                        .size(parentSize.toDp())
-                        .background(color = Color.White)
-                        .testTag(tag)
-                ) {
+                Box(Modifier.size(parentSize.toDp()).background(color = Color.White).testTag(tag)) {
                     ScrollableContent(
                         modifier = Modifier.size(textFieldSize.toDp()),
                         scrollerPosition = TextFieldScrollerPosition(Orientation.Horizontal),
@@ -236,11 +227,11 @@
 
         rule.waitForIdle()
 
-        rule.onNodeWithTag(tag)
-            .captureToImage()
-            .assertPixels(expectedSize = IntSize(parentSize, parentSize)) { position ->
-                if (position.x > textFieldSize || position.y > textFieldSize) Color.White else null
-            }
+        rule.onNodeWithTag(tag).captureToImage().assertPixels(
+            expectedSize = IntSize(parentSize, parentSize)
+        ) { position ->
+            if (position.x > textFieldSize || position.y > textFieldSize) Color.White else null
+        }
     }
 
     @Test
@@ -253,12 +244,7 @@
 
         with(rule.density) {
             rule.setTextFieldTestContent {
-                Box(
-                    Modifier
-                        .size(parentSize.toDp())
-                        .background(color = Color.White)
-                        .testTag(tag)
-                ) {
+                Box(Modifier.size(parentSize.toDp()).background(color = Color.White).testTag(tag)) {
                     ScrollableContent(
                         modifier = Modifier.size(textFieldSize.toDp()),
                         scrollerPosition = TextFieldScrollerPosition(),
@@ -271,11 +257,11 @@
 
         rule.waitForIdle()
 
-        rule.onNodeWithTag(tag)
-            .captureToImage()
-            .assertPixels(expectedSize = IntSize(parentSize, parentSize)) { position ->
-                if (position.x > textFieldSize || position.y > textFieldSize) Color.White else null
-            }
+        rule.onNodeWithTag(tag).captureToImage().assertPixels(
+            expectedSize = IntSize(parentSize, parentSize)
+        ) { position ->
+            if (position.x > textFieldSize || position.y > textFieldSize) Color.White else null
+        }
     }
 
     @Test
@@ -288,23 +274,15 @@
             modifier = Modifier.size(width = 300.dp, height = 50.dp)
         )
 
-        rule.runOnIdle {
-            assertThat(scrollerPosition.offset).isEqualTo(0f)
-        }
+        rule.runOnIdle { assertThat(scrollerPosition.offset).isEqualTo(0f) }
 
-        rule.onNodeWithTag(TextfieldTag)
-            .performTouchInput { swipeLeft() }
+        rule.onNodeWithTag(TextfieldTag).performTouchInput { swipeLeft() }
 
-        val firstSwipePosition = rule.runOnIdle {
-            scrollerPosition.offset
-        }
+        val firstSwipePosition = rule.runOnIdle { scrollerPosition.offset }
         assertThat(firstSwipePosition).isGreaterThan(0f)
 
-        rule.onNodeWithTag(TextfieldTag)
-            .performTouchInput { swipeRight() }
-        rule.runOnIdle {
-            assertThat(scrollerPosition.offset).isLessThan(firstSwipePosition)
-        }
+        rule.onNodeWithTag(TextfieldTag).performTouchInput { swipeRight() }
+        rule.runOnIdle { assertThat(scrollerPosition.offset).isLessThan(firstSwipePosition) }
     }
 
     @Test
@@ -317,23 +295,15 @@
             modifier = Modifier.size(width = 300.dp, height = 50.dp)
         )
 
-        rule.runOnIdle {
-            assertThat(scrollerPosition.offset).isEqualTo(0f)
-        }
+        rule.runOnIdle { assertThat(scrollerPosition.offset).isEqualTo(0f) }
 
-        rule.onNodeWithTag(TextfieldTag)
-            .performTouchInput { swipeUp() }
+        rule.onNodeWithTag(TextfieldTag).performTouchInput { swipeUp() }
 
-        val firstSwipePosition = rule.runOnIdle {
-            scrollerPosition.offset
-        }
+        val firstSwipePosition = rule.runOnIdle { scrollerPosition.offset }
         assertThat(firstSwipePosition).isGreaterThan(0f)
 
-        rule.onNodeWithTag(TextfieldTag)
-            .performTouchInput { swipeDown() }
-        rule.runOnIdle {
-            assertThat(scrollerPosition.offset).isLessThan(firstSwipePosition)
-        }
+        rule.onNodeWithTag(TextfieldTag).performTouchInput { swipeDown() }
+        rule.runOnIdle { assertThat(scrollerPosition.offset).isLessThan(firstSwipePosition) }
     }
 
     @Test
@@ -342,11 +312,10 @@
         var scrollerPosition: TextFieldScrollerPosition? = null
 
         restorationTester.setContent {
-            scrollerPosition = rememberSaveable(
-                saver = TextFieldScrollerPosition.Saver
-            ) {
-                TextFieldScrollerPosition(Orientation.Horizontal)
-            }
+            scrollerPosition =
+                rememberSaveable(saver = TextFieldScrollerPosition.Saver) {
+                    TextFieldScrollerPosition(Orientation.Horizontal)
+                }
             ScrollableContent(
                 modifier = Modifier.size(width = 300.dp, height = 50.dp),
                 scrollerPosition = scrollerPosition!!,
@@ -355,12 +324,9 @@
             )
         }
 
-        rule.onNodeWithTag(TextfieldTag)
-            .performTouchInput { swipeLeft() }
+        rule.onNodeWithTag(TextfieldTag).performTouchInput { swipeLeft() }
 
-        val swipePosition = rule.runOnIdle {
-            scrollerPosition!!.offset
-        }
+        val swipePosition = rule.runOnIdle { scrollerPosition!!.offset }
         assertThat(swipePosition).isGreaterThan(0f)
 
         rule.runOnIdle {
@@ -370,9 +336,7 @@
 
         restorationTester.emulateSavedInstanceStateRestore()
 
-        rule.runOnIdle {
-            assertThat(scrollerPosition!!.offset).isEqualTo(swipePosition)
-        }
+        rule.runOnIdle { assertThat(scrollerPosition!!.offset).isEqualTo(swipePosition) }
     }
 
     @Test
@@ -384,23 +348,22 @@
                 Modifier.textFieldScrollable(position, interactionSource) as InspectableValue
             assertThat(modifier.nameFallback).isEqualTo("textFieldScrollable")
             assertThat(modifier.valueOverride).isNull()
-            assertThat(modifier.inspectableElements.map { it.name }.asIterable()).containsExactly(
-                "scrollerPosition",
-                "interactionSource",
-                "enabled"
-            )
+            assertThat(modifier.inspectableElements.map { it.name }.asIterable())
+                .containsExactly("scrollerPosition", "interactionSource", "enabled")
         }
     }
 
     @Test
     fun textFieldScroll_testNestedScrolling() = runBlocking {
         val size = 300.dp
-        val text = """
+        val text =
+            """
             First Line
             Second Line
             Third Line
             Fourth Line
-        """.trimIndent()
+        """
+                .trimIndent()
 
         val textFieldScrollPosition = TextFieldScrollerPosition()
         val scrollerPosition = ScrollState(0)
@@ -409,11 +372,7 @@
 
         rule.setTextFieldTestContent {
             touchSlop = LocalViewConfiguration.current.touchSlop
-            Column(
-                Modifier
-                    .size(size)
-                    .verticalScroll(scrollerPosition)
-            ) {
+            Column(Modifier.size(size).verticalScroll(scrollerPosition)) {
                 ScrollableContent(
                     modifier = Modifier.size(size, height),
                     scrollerPosition = textFieldScrollPosition,
@@ -437,15 +396,13 @@
             val slopStartY = minOf(desiredY + touchSlop, nearEdge.toPx())
             val slopStart = Offset(x, slopStartY)
             val end = Offset(x, 0f)
-            rule.onNodeWithTag(TextfieldTag)
-                .performTouchInput {
-                    swipe(slopStart, end)
-                }
+            rule.onNodeWithTag(TextfieldTag).performTouchInput { swipe(slopStart, end) }
         }
 
         assertThat(textFieldScrollPosition.offset).isGreaterThan(0f)
         assertThat(textFieldScrollPosition.offset)
-            .isWithin(0.5f).of(textFieldScrollPosition.maximum)
+            .isWithin(0.5f)
+            .of(textFieldScrollPosition.maximum)
         assertThat(scrollerPosition.value).isGreaterThan(0)
     }
 
@@ -466,36 +423,36 @@
 
             Layout(
                 content = {},
-                modifier = Modifier
-                    .size(widthDp, heightDp)
-                    .textFieldScroll(
+                modifier =
+                    Modifier.size(widthDp, heightDp).textFieldScroll(
                         remember { scrollerPosition },
                         TextFieldValue(text),
                         VisualTransformation.None
-                    ) { textLayoutResultRef.value },
-                measurePolicy = object : MeasurePolicy {
-                    override fun MeasureScope.measure(
-                        measurables: List<Measurable>,
-                        constraints: Constraints
-                    ): MeasureResult {
-                        measuredConstraints = constraints
-                        return layout(width / 2, height) {}
-                    }
+                    ) {
+                        textLayoutResultRef.value
+                    },
+                measurePolicy =
+                    object : MeasurePolicy {
+                        override fun MeasureScope.measure(
+                            measurables: List<Measurable>,
+                            constraints: Constraints
+                        ): MeasureResult {
+                            measuredConstraints = constraints
+                            return layout(width / 2, height) {}
+                        }
 
-                    override fun IntrinsicMeasureScope.maxIntrinsicWidth(
-                        measurables: List<IntrinsicMeasurable>,
-                        height: Int
-                    ): Int {
-                        return width / 2
+                        override fun IntrinsicMeasureScope.maxIntrinsicWidth(
+                            measurables: List<IntrinsicMeasurable>,
+                            height: Int
+                        ): Int {
+                            return width / 2
+                        }
                     }
-                }
             )
         }
 
         rule.runOnIdle {
-            assertThat(measuredConstraints).isEqualTo(
-                Constraints.fixed(width, height)
-            )
+            assertThat(measuredConstraints).isEqualTo(Constraints.fixed(width, height))
         }
     }
 
@@ -516,41 +473,44 @@
 
             Layout(
                 content = {},
-                modifier = Modifier
-                    .size(widthDp, heightDp)
-                    .textFieldScroll(
+                modifier =
+                    Modifier.size(widthDp, heightDp).textFieldScroll(
                         remember { scrollerPosition },
                         TextFieldValue(text),
                         VisualTransformation.None
-                    ) { textLayoutResultRef.value },
-                measurePolicy = object : MeasurePolicy {
-                    override fun MeasureScope.measure(
-                        measurables: List<Measurable>,
-                        constraints: Constraints
-                    ): MeasureResult {
-                        measuredConstraints = constraints
-                        return layout(width * 2, height) {}
-                    }
+                    ) {
+                        textLayoutResultRef.value
+                    },
+                measurePolicy =
+                    object : MeasurePolicy {
+                        override fun MeasureScope.measure(
+                            measurables: List<Measurable>,
+                            constraints: Constraints
+                        ): MeasureResult {
+                            measuredConstraints = constraints
+                            return layout(width * 2, height) {}
+                        }
 
-                    override fun IntrinsicMeasureScope.maxIntrinsicWidth(
-                        measurables: List<IntrinsicMeasurable>,
-                        height: Int
-                    ): Int {
-                        return width * 2
+                        override fun IntrinsicMeasureScope.maxIntrinsicWidth(
+                            measurables: List<IntrinsicMeasurable>,
+                            height: Int
+                        ): Int {
+                            return width * 2
+                        }
                     }
-                }
             )
         }
 
         rule.runOnIdle {
-            assertThat(measuredConstraints).isEqualTo(
-                Constraints(
-                    minWidth = width,
-                    maxWidth = Constraints.Infinity,
-                    minHeight = height,
-                    maxHeight = height
+            assertThat(measuredConstraints)
+                .isEqualTo(
+                    Constraints(
+                        minWidth = width,
+                        maxWidth = Constraints.Infinity,
+                        minHeight = height,
+                        maxHeight = height
+                    )
                 )
-            )
         }
     }
 
@@ -564,35 +524,27 @@
                 BasicTextField(
                     value = longText,
                     onValueChange = {},
-                    modifier = Modifier
-                        .padding(size.toDp())
-                        .size(size.toDp())
-                        .testTag(tag)
+                    modifier = Modifier.padding(size.toDp()).size(size.toDp()).testTag(tag)
                 )
             }
         }
 
         // Click to focus and show handle.
-        rule.onNodeWithTag(tag)
-            .performClick()
+        rule.onNodeWithTag(tag).performClick()
 
         rule.onNode(isSelectionHandle(Handle.Cursor)).assertIsDisplayed()
 
         // Scroll up by twice the height to move the cursor out of the visible area.
-        rule.onNodeWithTag(tag)
-            .performTouchInput {
-                down(center)
-                moveBy(Offset(x = 0f, y = -size * 2f))
-            }
+        rule.onNodeWithTag(tag).performTouchInput {
+            down(center)
+            moveBy(Offset(x = 0f, y = -size * 2f))
+        }
 
         // Check that cursor is hidden.
         rule.onAllNodes(isSelectionHandle()).assertCountEquals(0)
 
         // Scroll back and make sure the handles are shown again.
-        rule.onNodeWithTag(tag)
-            .performTouchInput {
-                moveBy(Offset(x = 0f, y = size * 2f))
-            }
+        rule.onNodeWithTag(tag).performTouchInput { moveBy(Offset(x = 0f, y = size * 2f)) }
 
         rule.onNode(isSelectionHandle(Handle.Cursor)).assertIsDisplayed()
     }
@@ -607,45 +559,39 @@
                 BasicTextField(
                     value = longText,
                     onValueChange = {},
-                    modifier = Modifier
-                        .border(0.dp, Color.Gray)
-                        .padding(size.toDp())
-                        .border(0.dp, Color.Black)
-                        .size(size.toDp())
-                        .testTag(tag)
+                    modifier =
+                        Modifier.border(0.dp, Color.Gray)
+                            .padding(size.toDp())
+                            .border(0.dp, Color.Black)
+                            .size(size.toDp())
+                            .testTag(tag)
                 )
             }
         }
 
         // Select something to ensure both handles are visible.
-        rule.onNodeWithTag(tag)
+        rule
+            .onNodeWithTag(tag)
             // TODO(b/209698586) Use performTextInputSelection once that method actually updates
             //  the text handles.
             // .performTextInputSelection(TextRange(0, 1))
-            .performTouchInput {
-                longClick()
-            }
+            .performTouchInput { longClick() }
 
         // Check that both handles are displayed (if not, we can't check that they get hidden).
         rule.onNode(isSelectionHandle(Handle.SelectionStart)).assertIsDisplayed()
         rule.onNode(isSelectionHandle(Handle.SelectionEnd)).assertIsDisplayed()
 
         // Scroll up by twice the height to move the cursor out of the visible area.
-        rule.onNodeWithTag(tag)
-            .performTouchInput {
-                down(center)
-                moveBy(Offset(x = 0f, y = -size * 2f))
-            }
+        rule.onNodeWithTag(tag).performTouchInput {
+            down(center)
+            moveBy(Offset(x = 0f, y = -size * 2f))
+        }
 
         // Check that cursor is hidden.
-        rule.onAllNodes(isPopup())
-            .assertCountEquals(0)
+        rule.onAllNodes(isPopup()).assertCountEquals(0)
 
         // Scroll back and make sure the handles are shown again.
-        rule.onNodeWithTag(tag)
-            .performTouchInput {
-                moveBy(Offset(x = 0f, y = size * 2f))
-            }
+        rule.onNodeWithTag(tag).performTouchInput { moveBy(Offset(x = 0f, y = size * 2f)) }
 
         rule.onNode(isSelectionHandle(Handle.SelectionStart)).assertIsDisplayed()
         rule.onNode(isSelectionHandle(Handle.SelectionEnd)).assertIsDisplayed()
@@ -697,20 +643,19 @@
 
         BasicText(
             text = text,
-            onTextLayout = {
-                textLayoutResultRef.value = TextLayoutResultProxy(it)
-            },
+            onTextLayout = { textLayoutResultRef.value = TextLayoutResultProxy(it) },
             softWrap = isVertical,
-            modifier = modifier
-                .testTag(TextfieldTag)
-                .heightInLines(textStyle = TextStyle.Default, maxLines = resolvedMaxLines)
-                .textFieldScrollable(scrollerPosition)
-                .textFieldScroll(
-                    remember { scrollerPosition },
-                    TextFieldValue(text),
-                    VisualTransformation.None,
-                    { textLayoutResultRef.value }
-                )
+            modifier =
+                modifier
+                    .testTag(TextfieldTag)
+                    .heightInLines(textStyle = TextStyle.Default, maxLines = resolvedMaxLines)
+                    .textFieldScrollable(scrollerPosition)
+                    .textFieldScroll(
+                        remember { scrollerPosition },
+                        TextFieldValue(text),
+                        VisualTransformation.None,
+                        { textLayoutResultRef.value }
+                    )
         )
     }
 }
diff --git a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/textfield/TextFieldSelectionTest.kt b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/textfield/TextFieldSelectionTest.kt
index 24f8968..1a08523 100644
--- a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/textfield/TextFieldSelectionTest.kt
+++ b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/textfield/TextFieldSelectionTest.kt
@@ -62,8 +62,7 @@
 import org.junit.Test
 
 class TextFieldSelectionTest : FocusedWindowTest {
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
     private val testTag = "text field"
 
@@ -116,7 +115,7 @@
         rule.setTextFieldTestContent {
             BasicTextField(
                 value = "text".repeat(10),
-                onValueChange = { },
+                onValueChange = {},
                 visualTransformation = ReducedVisualTransformation(),
                 modifier = Modifier.testTag(testTag)
             )
@@ -178,8 +177,7 @@
         assertThat(textFieldValue.value.selection.start).isEqualTo(0)
         assertThat(textToolbar.status).isEqualTo(TextToolbarStatus.Hidden)
 
-        rule.onNode(isSelectionHandle(Handle.Cursor))
-            .performTouchInput { click() }
+        rule.onNode(isSelectionHandle(Handle.Cursor)).performTouchInput { click() }
 
         assertThat(textToolbar.status).isEqualTo(TextToolbarStatus.Shown)
     }
@@ -215,10 +213,11 @@
     fun textField_noSelectionHandles_whenWindowLosesFocus() {
         val textFieldValue = mutableStateOf(TextFieldValue("texttexttext"))
         val focusWindow = mutableStateOf(true)
-        val windowInfo = object : WindowInfo {
-            override val isWindowFocused: Boolean
-                get() = focusWindow.value
-        }
+        val windowInfo =
+            object : WindowInfo {
+                override val isWindowFocused: Boolean
+                    get() = focusWindow.value
+            }
         lateinit var textToolbar: TextToolbar
 
         rule.setTextFieldTestContent {
@@ -257,10 +256,11 @@
     fun textField_redisplaysSelectionHandlesAndToolbar_whenWindowRegainsFocus() {
         val textFieldValue = mutableStateOf(TextFieldValue("texttexttext"))
         val focusWindow = mutableStateOf(true)
-        val windowInfo = object : WindowInfo {
-            override val isWindowFocused: Boolean
-                get() = focusWindow.value
-        }
+        val windowInfo =
+            object : WindowInfo {
+                override val isWindowFocused: Boolean
+                    get() = focusWindow.value
+            }
         lateinit var textToolbar: TextToolbar
 
         rule.setTextFieldTestContent {
@@ -308,8 +308,8 @@
                 value = textFieldValue.value,
                 onValueChange = {
                     textFieldValue.value = it
-                    if (it.selection.collapsed &&
-                        cursorPositions.lastOrNull() != it.selection.start
+                    if (
+                        it.selection.collapsed && cursorPositions.lastOrNull() != it.selection.start
                     ) {
                         cursorPositions.add(it.selection.start)
                     }
@@ -364,10 +364,8 @@
         textField_extendsSelection(
             text = "text".repeat(10),
             visualTransformation = ReducedVisualTransformation(),
-            expectedSelectionRanges = (21..39)
-                .filter { it % 2 == 0 }
-                .map { TextRange(0, it) }
-                .toList(),
+            expectedSelectionRanges =
+                (21..39).filter { it % 2 == 0 }.map { TextRange(0, it) }.toList(),
             toLeft = false
         )
     }
@@ -399,10 +397,8 @@
         textField_extendsSelection(
             text = "text".repeat(10),
             visualTransformation = ReducedVisualTransformation(),
-            expectedSelectionRanges = (19 downTo 1)
-                .filter { it % 2 == 0 }
-                .map { TextRange(it, 40) }
-                .toList(),
+            expectedSelectionRanges =
+                (19 downTo 1).filter { it % 2 == 0 }.map { TextRange(it, 40) }.toList(),
             toLeft = true
         )
     }
@@ -415,18 +411,17 @@
             BasicTextField(
                 value = value,
                 onValueChange = { value = it },
-                textStyle = TextStyle(
-                    fontFamily = TEST_FONT_FAMILY,
-                    textAlign = TextAlign.End,
-                    letterSpacing = 1.2.sp,
-                ),
+                textStyle =
+                    TextStyle(
+                        fontFamily = TEST_FONT_FAMILY,
+                        textAlign = TextAlign.End,
+                        letterSpacing = 1.2.sp,
+                    ),
                 modifier = Modifier.testTag(testTag).fillMaxWidth()
             )
         }
 
-        rule.onNodeWithTag(testTag).performTouchInput {
-            longClick(centerRight)
-        }
+        rule.onNodeWithTag(testTag).performTouchInput { longClick(centerRight) }
         rule.waitForIdle()
 
         assertHandlesDisplayed()
@@ -439,8 +434,7 @@
         expectedSelectionRanges: List<TextRange>,
         toLeft: Boolean
     ) {
-        val textFieldValue =
-            mutableStateOf(TextFieldValue(text, TextRange(Int.MAX_VALUE)))
+        val textFieldValue = mutableStateOf(TextFieldValue(text, TextRange(Int.MAX_VALUE)))
         val selectionRanges = mutableListOf<TextRange>()
         rule.setTextFieldTestContent {
             BasicTextField(
@@ -480,18 +474,19 @@
         return VisualTransformation { text ->
             TransformedText(
                 text = AnnotatedString(text.text.map { "$it*" }.joinToString("")),
-                offsetMapping = object : OffsetMapping {
-                    override fun originalToTransformed(offset: Int) = offset * 2
-                    override fun transformedToOriginal(offset: Int) = offset / 2
-                })
+                offsetMapping =
+                    object : OffsetMapping {
+                        override fun originalToTransformed(offset: Int) = offset * 2
+
+                        override fun transformedToOriginal(offset: Int) = offset / 2
+                    }
+            )
         }
     }
 
     private fun performHandleDrag(handle: Handle, toLeft: Boolean, swipeFraction: Float = 0.5f) {
         val handleNode = rule.onNode(isSelectionHandle(handle))
-        val fieldWidth = rule.onNodeWithTag(testTag)
-            .fetchSemanticsNode()
-            .boundsInRoot.width
+        val fieldWidth = rule.onNodeWithTag(testTag).fetchSemanticsNode().boundsInRoot.width
 
         val swipeDistance = (fieldWidth * swipeFraction).roundToInt()
 
@@ -505,12 +500,12 @@
     }
 
     private fun assertHandlesDisplayed() {
-            rule.onNode(isSelectionHandle(Handle.SelectionStart)).assertIsDisplayed()
-            rule.onNode(isSelectionHandle(Handle.SelectionEnd)).assertIsDisplayed()
+        rule.onNode(isSelectionHandle(Handle.SelectionStart)).assertIsDisplayed()
+        rule.onNode(isSelectionHandle(Handle.SelectionEnd)).assertIsDisplayed()
     }
 
     private fun assertHandlesNotExist() {
-            rule.onNode(isSelectionHandle(Handle.SelectionStart)).assertDoesNotExist()
-            rule.onNode(isSelectionHandle(Handle.SelectionEnd)).assertDoesNotExist()
+        rule.onNode(isSelectionHandle(Handle.SelectionStart)).assertDoesNotExist()
+        rule.onNode(isSelectionHandle(Handle.SelectionEnd)).assertDoesNotExist()
     }
 }
diff --git a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/textfield/TextFieldTest.kt b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/textfield/TextFieldTest.kt
index 02487b3..2a20377 100644
--- a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/textfield/TextFieldTest.kt
+++ b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/textfield/TextFieldTest.kt
@@ -1,18 +1,18 @@
 /*
-* Copyright 2020 The Android Open Source Project
-*
-* Licensed under the Apache License, Version 2.0 (the "License");
-* you may not use this file except in compliance with the License.
-* You may obtain a copy of the License at
-*
-*      http://www.apache.org/licenses/LICENSE-2.0
-*
-* Unless required by applicable law or agreed to in writing, software
-* distributed under the License is distributed on an "AS IS" BASIS,
-* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-* See the License for the specific language governing permissions and
-* limitations under the License.
-*/
+ * Copyright 2020 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
 
 @file:Suppress("Deprecation")
 
@@ -169,8 +169,7 @@
 @MediumTest
 @RunWith(AndroidJUnit4::class)
 class TextFieldTest : FocusedWindowTest {
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
     private val inputMethodInterceptor = InputMethodInterceptor(rule)
     private val Tag = "textField"
@@ -179,11 +178,9 @@
     // 1. The width of most of visible characters equals to font size.
     // 2. The LTR/RTL characters are rendered as ▶/◀.
     // 3. The fontMetrics passed to TextPaint has descend - ascend equal to 1.2 * fontSize.
-    private val measureFontFamily = Font(
-        resId = R.font.sample_font,
-        weight = FontWeight.Normal,
-        style = FontStyle.Normal
-    ).toFontFamily()
+    private val measureFontFamily =
+        Font(resId = R.font.sample_font, weight = FontWeight.Normal, style = FontStyle.Normal)
+            .toFontFamily()
 
     @Test
     fun textField_focusInSemantics() {
@@ -192,18 +189,14 @@
             val state = remember { mutableStateOf("") }
             BasicTextField(
                 value = state.value,
-                modifier = Modifier
-                    .fillMaxSize()
-                    .onFocusChanged { isFocused = it.isFocused },
+                modifier = Modifier.fillMaxSize().onFocusChanged { isFocused = it.isFocused },
                 onValueChange = { state.value = it }
             )
         }
 
         rule.onNode(hasSetTextAction()).performClick()
 
-        rule.runOnIdle {
-            assertThat(isFocused).isTrue()
-        }
+        rule.runOnIdle { assertThat(isFocused).isTrue() }
     }
 
     @Test
@@ -213,9 +206,7 @@
             BasicTextField(
                 value = state,
                 modifier = Modifier.fillMaxSize(),
-                onValueChange = {
-                    state = it
-                }
+                onValueChange = { state = it }
             )
         }
         rule.onNode(hasSetTextAction()).performClick()
@@ -228,9 +219,7 @@
             withInputConnection { commitText("3", 1) }
         }
 
-        rule.runOnIdle {
-            assertThat(state).isEqualTo("1a2b3")
-        }
+        rule.runOnIdle { assertThat(state).isEqualTo("1a2b3") }
     }
 
     @Test
@@ -259,9 +248,7 @@
             withInputConnection { commitText("3", 1) }
         }
 
-        rule.runOnIdle {
-            assertThat(state).isEqualTo("123")
-        }
+        rule.runOnIdle { assertThat(state).isEqualTo("123") }
     }
 
     @Test
@@ -269,14 +256,12 @@
         val onTextLayout: (TextLayoutResult) -> Unit = mock()
         var state by mutableStateOf("")
         inputMethodInterceptor.setContent {
-                BasicTextField(
-                    value = state,
-                    modifier = Modifier.fillMaxSize(),
-                    onValueChange = {
-                        state = it
-                    },
-                    onTextLayout = onTextLayout
-                )
+            BasicTextField(
+                value = state,
+                modifier = Modifier.fillMaxSize(),
+                onValueChange = { state = it },
+                onTextLayout = onTextLayout
+            )
         }
 
         rule.onNode(hasSetTextAction()).performClick()
@@ -288,9 +273,7 @@
             withInputConnection { commitText("3", 1) }
         }
 
-        rule.runOnIdle {
-            assertThat(state).isEqualTo("123")
-        }
+        rule.runOnIdle { assertThat(state).isEqualTo("123") }
     }
 
     @Test
@@ -304,11 +287,7 @@
                     BasicTextField(
                         value = "",
                         onValueChange = {},
-                        modifier = Modifier
-                            .weight(1f)
-                            .onGloballyPositioned {
-                                size = it.size.width
-                            }
+                        modifier = Modifier.weight(1f).onGloballyPositioned { size = it.size.width }
                     )
                     Box(Modifier.size(boxSize))
                 }
@@ -339,9 +318,7 @@
         restorationTester.emulateSavedInstanceStateRestore()
 
         rule.runOnIdle {
-            assertThat(state!!.value).isEqualTo(
-                TextFieldValue("test", TextRange(1, 2))
-            )
+            assertThat(state!!.value).isEqualTo(TextFieldValue("test", TextRange(1, 2)))
         }
     }
 
@@ -369,15 +346,11 @@
                     letterSpacing = 2.em,
                     baselineShift = BaselineShift.Superscript,
                     textGeometricTransform = TextGeometricTransform(2f, 3f),
-                    localeList = LocaleList(
-                        Locale("sr-Latn-SR"),
-                        Locale("sr-Cyrl-SR"),
-                        Locale.current
-                    ),
+                    localeList =
+                        LocaleList(Locale("sr-Latn-SR"), Locale("sr-Cyrl-SR"), Locale.current),
                     background = Color.Blue,
                     textDecoration = TextDecoration.LineThrough,
                     shadow = Shadow(color = Color.Red, offset = Offset(2f, 2f), blurRadius = 4f)
-
                 )
             ) {
                 append("7")
@@ -408,9 +381,7 @@
 
         restorationTester.emulateSavedInstanceStateRestore()
 
-        rule.runOnIdle {
-            assertThat(state!!.value).isEqualTo(newTextFieldValue)
-        }
+        rule.runOnIdle { assertThat(state!!.value).isEqualTo(newTextFieldValue) }
     }
 
     @Test
@@ -421,14 +392,13 @@
                 value = "",
                 onValueChange = {},
                 textStyle = TextStyle(color = Color.White),
-                modifier = Modifier
-                    .size(10.dp, 20.dp)
-                    .background(color = Color.White),
+                modifier = Modifier.size(10.dp, 20.dp).background(color = Color.White),
                 cursorBrush = SolidColor(Color.Blue)
             )
         }
 
-        rule.onNode(hasSetTextAction())
+        rule
+            .onNode(hasSetTextAction())
             .captureToImage()
             .assertShape(
                 density = rule.density,
@@ -455,7 +425,8 @@
             )
         }
 
-        rule.onNodeWithTag(Tag)
+        rule
+            .onNodeWithTag(Tag)
             .assertEditableTextEquals("")
             .assertTextEquals("label", includeEditableText = false)
             .assertHasClickAction()
@@ -463,18 +434,16 @@
             .assert(hasImeAction(ImeAction.Default))
             .assert(isNotFocused())
             .assert(
-                SemanticsMatcher.expectValue(
-                    SemanticsProperties.TextSelectionRange,
-                    TextRange.Zero
-                )
+                SemanticsMatcher.expectValue(SemanticsProperties.TextSelectionRange, TextRange.Zero)
             )
             .assert(SemanticsMatcher.keyIsDefined(SemanticsActions.SetText))
             .assert(SemanticsMatcher.keyIsDefined(SemanticsActions.SetSelection))
             .assert(SemanticsMatcher.keyIsDefined(SemanticsActions.GetTextLayoutResult))
 
         val textLayoutResults = mutableListOf<TextLayoutResult>()
-        rule.onNodeWithTag(Tag)
-            .performSemanticsAction(SemanticsActions.GetTextLayoutResult) { it(textLayoutResults) }
+        rule.onNodeWithTag(Tag).performSemanticsAction(SemanticsActions.GetTextLayoutResult) {
+            it(textLayoutResults)
+        }
         assert(textLayoutResults.size == 1) { "TextLayoutResult is null" }
     }
 
@@ -490,10 +459,8 @@
             )
         }
 
-        rule.onNodeWithTag(Tag)
-            .performTextReplacement("hello")
-        rule.onNodeWithTag(Tag)
-            .assertEditableTextEquals("")
+        rule.onNodeWithTag(Tag).performTextReplacement("hello")
+        rule.onNodeWithTag(Tag).assertEditableTextEquals("")
     }
 
     @Test
@@ -508,10 +475,7 @@
             )
         }
 
-        assertFailsWith<AssertionError> {
-            rule.onNodeWithTag(Tag)
-                .performTextReplacement("hello")
-        }
+        assertFailsWith<AssertionError> { rule.onNodeWithTag(Tag).performTextReplacement("hello") }
     }
 
     @Test
@@ -526,10 +490,8 @@
             )
         }
 
-        rule.onNodeWithTag(Tag)
-            .performTextInput("hello")
-        rule.onNodeWithTag(Tag)
-            .assertEditableTextEquals("")
+        rule.onNodeWithTag(Tag).performTextInput("hello")
+        rule.onNodeWithTag(Tag).assertEditableTextEquals("")
     }
 
     @Test
@@ -544,10 +506,7 @@
             )
         }
 
-        assertFailsWith<AssertionError> {
-            rule.onNodeWithTag(Tag)
-                .performTextInput("hello")
-        }
+        assertFailsWith<AssertionError> { rule.onNodeWithTag(Tag).performTextInput("hello") }
     }
 
     @Test
@@ -561,11 +520,11 @@
             )
         }
 
-        rule.onNodeWithTag(Tag)
+        rule
+            .onNodeWithTag(Tag)
             .assert(isNotFocused())
             .performSemanticsAction(SemanticsActions.OnClick)
-        rule.onNodeWithTag(Tag)
-            .assert(isFocused())
+        rule.onNodeWithTag(Tag).assert(isFocused())
     }
 
     @Test
@@ -582,20 +541,13 @@
             )
         }
 
-        rule.onNodeWithTag(Tag)
-            .requestFocus()
-            .assertIsFocused()
+        rule.onNodeWithTag(Tag).requestFocus().assertIsFocused()
 
-        rule.runOnIdle {
-            assertThat(done).isFalse()
-        }
+        rule.runOnIdle { assertThat(done).isFalse() }
 
-        rule.onNodeWithTag(Tag)
-            .performImeAction()
+        rule.onNodeWithTag(Tag).performImeAction()
 
-        rule.runOnIdle {
-            assertThat(done).isTrue()
-        }
+        rule.runOnIdle { assertThat(done).isTrue() }
     }
 
     @Test
@@ -610,19 +562,16 @@
             )
         }
 
-        rule.onNodeWithTag(Tag)
-            .requestFocus()
-            .assertIsFocused()
+        rule.onNodeWithTag(Tag).requestFocus().assertIsFocused()
 
-        val error = assertFailsWith<AssertionError> {
-            rule.onNodeWithTag(Tag)
-                .performImeAction()
-        }
-        assertThat(error).hasMessageThat().startsWith(
-            "Failed to perform IME action.\n" +
-                "Failed to assert the following: (NOT (ImeAction = 'Default'))\n" +
-                "Semantics of the node:"
-        )
+        val error = assertFailsWith<AssertionError> { rule.onNodeWithTag(Tag).performImeAction() }
+        assertThat(error)
+            .hasMessageThat()
+            .startsWith(
+                "Failed to perform IME action.\n" +
+                    "Failed to assert the following: (NOT (ImeAction = 'Default'))\n" +
+                    "Semantics of the node:"
+            )
     }
 
     @Test
@@ -637,7 +586,8 @@
         }
 
         val hello = AnnotatedString("Hello")
-        rule.onNodeWithTag(Tag)
+        rule
+            .onNodeWithTag(Tag)
             .assertEditableTextEquals("")
             .performSemanticsAction(SemanticsActions.SetText) { it(hello) }
             .assertEditableTextEquals(hello.text)
@@ -648,7 +598,8 @@
                 )
             )
 
-        rule.onNodeWithTag(Tag)
+        rule
+            .onNodeWithTag(Tag)
             .performSemanticsAction(SemanticsActions.SetSelection) { it(1, 3, true) }
             .assert(
                 SemanticsMatcher.expectValue(
@@ -669,7 +620,8 @@
             )
         }
 
-        rule.onNodeWithTag(Tag)
+        rule
+            .onNodeWithTag(Tag)
             .performSemanticsAction(SemanticsActions.SetSelection) { it(0, Int.MAX_VALUE, false) }
             .assert(
                 // invalid selection should be ignored.
@@ -691,7 +643,8 @@
             )
         }
 
-        rule.onNodeWithTag(Tag)
+        rule
+            .onNodeWithTag(Tag)
             .performSemanticsAction(SemanticsActions.SetSelection) { it(0, Int.MAX_VALUE, true) }
             .assert(
                 // invalid selection should be ignored.
@@ -712,8 +665,7 @@
             )
         }
 
-        rule.onNode(hasSetTextAction())
-            .assert(hasImeAction(ImeAction.Search))
+        rule.onNode(hasSetTextAction()).assert(hasImeAction(ImeAction.Search))
     }
 
     @Test
@@ -729,12 +681,9 @@
             )
         }
 
-        rule.onNodeWithTag(Tag)
-            .performSemanticsAction(SemanticsActions.CopyText) { it() }
+        rule.onNodeWithTag(Tag).performSemanticsAction(SemanticsActions.CopyText) { it() }
 
-        rule.runOnIdle {
-            assertThat(value.selection).isEqualTo(TextRange(5, 5))
-        }
+        rule.runOnIdle { assertThat(value.selection).isEqualTo(TextRange(5, 5)) }
     }
 
     @Test
@@ -751,19 +700,15 @@
         }
 
         // copy text to the clipboard
-        rule.onNodeWithTag(Tag)
-            .performSemanticsAction(SemanticsActions.CopyText) { it() }
+        rule.onNodeWithTag(Tag).performSemanticsAction(SemanticsActions.CopyText) { it() }
         rule.runOnIdle {
             assertThat(value.selection.collapsed).isTrue()
             assertThat(value.selection.start).isEqualTo(6)
         }
 
         // paste text from the clipboard
-        rule.onNodeWithTag(Tag)
-            .performSemanticsAction(SemanticsActions.PasteText) { it() }
-        rule.runOnIdle {
-            assertThat(value.text).isEqualTo("Hello Hello World")
-        }
+        rule.onNodeWithTag(Tag).performSemanticsAction(SemanticsActions.PasteText) { it() }
+        rule.runOnIdle { assertThat(value.text).isEqualTo("Hello Hello World") }
     }
 
     @Test
@@ -779,8 +724,7 @@
             )
         }
 
-        rule.onNodeWithTag(Tag)
-            .performSemanticsAction(SemanticsActions.CutText) { it() }
+        rule.onNodeWithTag(Tag).performSemanticsAction(SemanticsActions.CutText) { it() }
 
         rule.runOnIdle {
             assertThat(value.text).isEqualTo("World")
@@ -799,7 +743,8 @@
             )
         }
 
-        rule.onNodeWithTag(Tag)
+        rule
+            .onNodeWithTag(Tag)
             .assert(SemanticsMatcher.keyNotDefined(SemanticsActions.CopyText))
             .assert(SemanticsMatcher.keyNotDefined(SemanticsActions.CutText))
     }
@@ -812,16 +757,12 @@
                 value = TextFieldValue("Hello"),
                 onValueChange = {},
                 visualTransformation = { text ->
-                    TransformedText(
-                        text.toUpperCase(LocaleList("en_US")),
-                        OffsetMapping.Identity
-                    )
+                    TransformedText(text.toUpperCase(LocaleList("en_US")), OffsetMapping.Identity)
                 }
             )
         }
 
-        rule.onNodeWithTag(Tag)
-            .assertTextEquals("HELLO")
+        rule.onNodeWithTag(Tag).assertTextEquals("HELLO")
     }
 
     @LargeTest
@@ -840,16 +781,11 @@
             )
         }
 
-        rule.runOnIdle {
-            assertThat(toolbar?.status).isEqualTo(TextToolbarStatus.Hidden)
-        }
+        rule.runOnIdle { assertThat(toolbar?.status).isEqualTo(TextToolbarStatus.Hidden) }
 
-        rule.onNodeWithTag(Tag)
-            .performSemanticsAction(SemanticsActions.OnLongClick) { it() }
+        rule.onNodeWithTag(Tag).performSemanticsAction(SemanticsActions.OnLongClick) { it() }
 
-        rule.runOnIdle {
-            assertThat(toolbar?.status).isEqualTo(TextToolbarStatus.Shown)
-        }
+        rule.runOnIdle { assertThat(toolbar?.status).isEqualTo(TextToolbarStatus.Shown) }
     }
 
     @Test
@@ -867,19 +803,13 @@
             )
         }
 
-        rule.onNodeWithTag(Tag)
-            .performTextInput("A")
+        rule.onNodeWithTag(Tag).performTextInput("A")
 
-        rule.runOnIdle {
-            assertThat(lastSeenText).isEqualTo("A")
-        }
+        rule.runOnIdle { assertThat(lastSeenText).isEqualTo("A") }
 
-        rule.onNodeWithTag(Tag)
-            .performTextClearance()
+        rule.onNodeWithTag(Tag).performTextClearance()
 
-        rule.runOnIdle {
-            assertThat(lastSeenText).isEqualTo("")
-        }
+        rule.runOnIdle { assertThat(lastSeenText).isEqualTo("") }
     }
 
     @Test
@@ -895,9 +825,7 @@
                     value = "test",
                     onValueChange = {},
                     textStyle = TextStyle(fontSize = 2.sp),
-                    modifier = Modifier
-                        .requiredHeight(100.dp)
-                        .fillMaxWidth(),
+                    modifier = Modifier.requiredHeight(100.dp).fillMaxWidth(),
                     decorationBox = {
                         // the core text field is at the very bottom
                         Column {
@@ -913,19 +841,12 @@
 
         val interactions = mutableListOf<Interaction>()
 
-        scope!!.launch {
-            interactionSource.interactions.collect { interactions.add(it) }
-        }
+        scope!!.launch { interactionSource.interactions.collect { interactions.add(it) } }
 
-        rule.runOnIdle {
-            assertThat(interactions).isEmpty()
-        }
+        rule.runOnIdle { assertThat(interactions).isEmpty() }
 
         // click outside core text field area
-        rule.onNodeWithTag("label", useUnmergedTree = true)
-            .performTouchInput {
-                click(Offset.Zero)
-            }
+        rule.onNodeWithTag("label", useUnmergedTree = true).performTouchInput { click(Offset.Zero) }
 
         rule.runOnIdle {
             // Not asserting total size as we have other interactions here too
@@ -950,31 +871,21 @@
         }
 
         @OptIn(ExperimentalTestApi::class)
-        rule.onNodeWithTag(Tag)
-            .performClick()
-            .performTextInputSelection(TextRange(0, 0))
+        rule.onNodeWithTag(Tag).performClick().performTextInputSelection(TextRange(0, 0))
 
         // reset
-        rule.runOnIdle {
-            onValueChangeCalled = false
-        }
+        rule.runOnIdle { onValueChangeCalled = false }
 
         // change selection
         @OptIn(ExperimentalTestApi::class)
-        rule.onNodeWithTag(Tag)
-            .performTextInputSelection(TextRange(1, 1))
+        rule.onNodeWithTag(Tag).performTextInputSelection(TextRange(1, 1))
 
-        rule.runOnIdle {
-            assertThat(onValueChangeCalled).isFalse()
-        }
+        rule.runOnIdle { assertThat(onValueChangeCalled).isFalse() }
 
         // change text
-        rule.onNodeWithTag(Tag)
-            .performTextInput("d")
+        rule.onNodeWithTag(Tag).performTextInput("d")
 
-        rule.runOnIdle {
-            assertThat(onValueChangeCalled).isTrue()
-        }
+        rule.runOnIdle { assertThat(onValueChangeCalled).isTrue() }
     }
 
     @Test
@@ -997,18 +908,13 @@
         }
 
         @OptIn(ExperimentalTestApi::class)
-        rule.onNodeWithTag(Tag)
-            .performClick()
-            .performTextInputSelection(TextRange(0, 0))
+        rule.onNodeWithTag(Tag).performClick().performTextInputSelection(TextRange(0, 0))
 
         // reset flag since click might change selection
-        rule.runOnIdle {
-            onValueChangeCalled = false
-        }
+        rule.runOnIdle { onValueChangeCalled = false }
 
         @OptIn(ExperimentalTestApi::class)
-        rule.onNodeWithTag(Tag)
-            .performTextInputSelection(TextRange(1, 1))
+        rule.onNodeWithTag(Tag).performTextInputSelection(TextRange(1, 1))
 
         // selection changed
         rule.runOnIdle {
@@ -1020,15 +926,13 @@
 
         // set selection to same value, no change should occur
         @OptIn(ExperimentalTestApi::class)
-        rule.onNodeWithTag(Tag)
-            .performTextInputSelection(TextRange(1, 1))
+        rule.onNodeWithTag(Tag).performTextInputSelection(TextRange(1, 1))
 
         rule.runOnIdle {
             assertWithMessage("$lastSeenTextFieldValue").that(onValueChangeCalled).isFalse()
         }
 
-        rule.onNodeWithTag(Tag)
-            .performTextInput("d")
+        rule.onNodeWithTag(Tag).performTextInput("d")
 
         rule.runOnIdle {
             assertWithMessage("$lastSeenTextFieldValue").that(onValueChangeCalled).isTrue()
@@ -1056,16 +960,12 @@
             )
         }
 
-        rule.onNodeWithTag("tag")
-            .performClick()
+        rule.onNodeWithTag("tag").performClick()
         rule.waitForIdle()
 
-        rule.onNodeWithTag("tag")
-            .performTextClearance()
+        rule.onNodeWithTag("tag").performTextClearance()
 
-        rule.runOnIdle {
-            assertThat(callbackCounter).isEqualTo(1)
-        }
+        rule.runOnIdle { assertThat(callbackCounter).isEqualTo(1) }
     }
 
     @OptIn(ExperimentalTestApi::class)
@@ -1093,9 +993,7 @@
 
         text.value = "ABCDE"
 
-        rule.runOnIdle {
-            assertThat(callbackCounter).isEqualTo(0)
-        }
+        rule.runOnIdle { assertThat(callbackCounter).isEqualTo(0) }
     }
 
     @Test
@@ -1119,16 +1017,14 @@
             )
         }
 
-        rule.onNodeWithTag("tag")
-            .performClick()
+        rule.onNodeWithTag("tag").performClick()
         rule.waitForIdle()
 
-        rule.onNodeWithTag("tag")
-            .performSemanticsAction(SemanticsActions.SetText) { it(AnnotatedString("")) }
-
-        rule.runOnIdle {
-            assertThat(callbackCounter).isEqualTo(1)
+        rule.onNodeWithTag("tag").performSemanticsAction(SemanticsActions.SetText) {
+            it(AnnotatedString(""))
         }
+
+        rule.runOnIdle { assertThat(callbackCounter).isEqualTo(1) }
     }
 
     @Test
@@ -1136,18 +1032,19 @@
     fun textField_textAlignCenter_defaultWidth() {
         val fontSize = 50
         val density = Density(1f, 1f)
-        val textStyle = TextStyle(
-            textAlign = TextAlign.Center,
-            color = Color.Black,
-            fontFamily = measureFontFamily,
-            fontSize = fontSize.sp
-        )
+        val textStyle =
+            TextStyle(
+                textAlign = TextAlign.Center,
+                color = Color.Black,
+                fontFamily = measureFontFamily,
+                fontSize = fontSize.sp
+            )
         rule.setContent {
             CompositionLocalProvider(LocalDensity provides density) {
                 BasicTextField(
                     modifier = Modifier.testTag(Tag),
                     value = "H",
-                    onValueChange = { },
+                    onValueChange = {},
                     textStyle = textStyle,
                     singleLine = true
                 )
@@ -1163,28 +1060,29 @@
     fun textField_textAlignCenter_widthSmallerThanDefaultWidth() {
         val fontSize = 50
         val density = Density(1f, 1f)
-        val textStyle = TextStyle(
-            textAlign = TextAlign.Center,
-            color = Color.Black,
-            fontFamily = measureFontFamily,
-            fontSize = fontSize.sp
-        )
+        val textStyle =
+            TextStyle(
+                textAlign = TextAlign.Center,
+                color = Color.Black,
+                fontFamily = measureFontFamily,
+                fontSize = fontSize.sp
+            )
         rule.setContent {
             val fontFamilyResolver = LocalFontFamilyResolver.current
-            val defaultWidth = computeSizeForDefaultText(
-                style = textStyle,
-                density = density,
-                fontFamilyResolver = fontFamilyResolver,
-                maxLines = 1
-            ).width
+            val defaultWidth =
+                computeSizeForDefaultText(
+                        style = textStyle,
+                        density = density,
+                        fontFamilyResolver = fontFamilyResolver,
+                        maxLines = 1
+                    )
+                    .width
 
             CompositionLocalProvider(LocalDensity provides density) {
                 BasicTextField(
-                    modifier = Modifier
-                        .testTag(Tag)
-                        .width(defaultWidth.dp / 2),
+                    modifier = Modifier.testTag(Tag).width(defaultWidth.dp / 2),
                     value = "H",
-                    onValueChange = { },
+                    onValueChange = {},
                     textStyle = textStyle,
                     singleLine = true
                 )
@@ -1200,28 +1098,29 @@
     fun textField_textAlignCenter_widthLargerThanDefaultWidth() {
         val fontSize = 50
         val density = Density(1f, 1f)
-        val textStyle = TextStyle(
-            textAlign = TextAlign.Center,
-            color = Color.Black,
-            fontFamily = measureFontFamily,
-            fontSize = fontSize.sp
-        )
+        val textStyle =
+            TextStyle(
+                textAlign = TextAlign.Center,
+                color = Color.Black,
+                fontFamily = measureFontFamily,
+                fontSize = fontSize.sp
+            )
         rule.setContent {
             val fontFamilyResolver = LocalFontFamilyResolver.current
-            val defaultWidth = computeSizeForDefaultText(
-                style = textStyle,
-                density = density,
-                fontFamilyResolver = fontFamilyResolver,
-                maxLines = 1
-            ).width
+            val defaultWidth =
+                computeSizeForDefaultText(
+                        style = textStyle,
+                        density = density,
+                        fontFamilyResolver = fontFamilyResolver,
+                        maxLines = 1
+                    )
+                    .width
 
             CompositionLocalProvider(LocalDensity provides density) {
                 BasicTextField(
-                    modifier = Modifier
-                        .testTag(Tag)
-                        .width(defaultWidth.dp * 2),
+                    modifier = Modifier.testTag(Tag).width(defaultWidth.dp * 2),
                     value = "H",
-                    onValueChange = { },
+                    onValueChange = {},
                     textStyle = textStyle,
                     singleLine = true
                 )
@@ -1262,12 +1161,8 @@
         rule.setContent {
             BasicTextField(
                 value = textFieldValue.value,
-                onValueChange = {
-                    textFieldValue.value = it
-                },
-                modifier = Modifier
-                    .testTag(Tag)
-                    .wrapContentSize()
+                onValueChange = { textFieldValue.value = it },
+                modifier = Modifier.testTag(Tag).wrapContentSize()
             )
         }
         val textNode = rule.onNodeWithTag(Tag)
@@ -1276,8 +1171,8 @@
 
         rule.waitForIdle()
         val expected = TextRange(0, 0)
-        val actual = textNode.fetchSemanticsNode().config
-            .getOrNull(SemanticsProperties.TextSelectionRange)
+        val actual =
+            textNode.fetchSemanticsNode().config.getOrNull(SemanticsProperties.TextSelectionRange)
         assertThat(actual).isEqualTo(expected)
     }
 
@@ -1289,12 +1184,8 @@
         rule.setContent {
             BasicTextField(
                 value = textFieldValue.value,
-                onValueChange = {
-                    textFieldValue.value = it
-                },
-                modifier = Modifier
-                    .testTag(Tag)
-                    .wrapContentSize()
+                onValueChange = { textFieldValue.value = it },
+                modifier = Modifier.testTag(Tag).wrapContentSize()
             )
         }
         val textNode = rule.onNodeWithTag(Tag)
@@ -1304,8 +1195,8 @@
         rule.waitForIdle()
 
         val expected = TextRange(2, 5)
-        val actual = textNode.fetchSemanticsNode().config
-            .getOrNull(SemanticsProperties.TextSelectionRange)
+        val actual =
+            textNode.fetchSemanticsNode().config.getOrNull(SemanticsProperties.TextSelectionRange)
         assertThat(actual).isEqualTo(expected)
     }
 
@@ -1316,12 +1207,8 @@
         rule.setContent {
             BasicTextField(
                 value = textFieldValue.value,
-                onValueChange = {
-                    textFieldValue.value = it
-                },
-                modifier = Modifier
-                    .testTag(Tag)
-                    .wrapContentSize()
+                onValueChange = { textFieldValue.value = it },
+                modifier = Modifier.testTag(Tag).wrapContentSize()
             )
         }
         val textNode = rule.onNodeWithTag(Tag)
@@ -1337,8 +1224,8 @@
         rule.waitForIdle()
 
         val expected = TextRange.Zero
-        val actual = textNode.fetchSemanticsNode().config
-            .getOrNull(SemanticsProperties.TextSelectionRange)
+        val actual =
+            textNode.fetchSemanticsNode().config.getOrNull(SemanticsProperties.TextSelectionRange)
         assertThat(actual).isEqualTo(expected)
     }
 
@@ -1350,12 +1237,8 @@
         rule.setContent {
             BasicTextField(
                 value = textFieldValue.value,
-                onValueChange = {
-                    textFieldValue.value = it
-                },
-                modifier = Modifier
-                    .testTag(Tag)
-                    .wrapContentSize()
+                onValueChange = { textFieldValue.value = it },
+                modifier = Modifier.testTag(Tag).wrapContentSize()
             )
         }
         val textNode = rule.onNodeWithTag(Tag)
@@ -1371,8 +1254,8 @@
         rule.waitForIdle()
 
         val expected = TextRange(0, 2)
-        val actual = textNode.fetchSemanticsNode().config
-            .getOrNull(SemanticsProperties.TextSelectionRange)
+        val actual =
+            textNode.fetchSemanticsNode().config.getOrNull(SemanticsProperties.TextSelectionRange)
         assertThat(actual).isEqualTo(expected)
     }
 
@@ -1385,12 +1268,8 @@
         rule.setContent {
             BasicTextField(
                 value = textFieldValue.value,
-                onValueChange = {
-                    textFieldValue.value = it
-                },
-                modifier = Modifier
-                    .testTag(Tag)
-                    .wrapContentSize()
+                onValueChange = { textFieldValue.value = it },
+                modifier = Modifier.testTag(Tag).wrapContentSize()
             )
         }
         val textNode = rule.onNodeWithTag(Tag)
@@ -1398,15 +1277,15 @@
 
         rule.waitForIdle()
         textNode.assertTextEquals("")
-        val selection = textNode.fetchSemanticsNode().config
-            .getOrNull(SemanticsProperties.TextSelectionRange)
+        val selection =
+            textNode.fetchSemanticsNode().config.getOrNull(SemanticsProperties.TextSelectionRange)
         assertThat(selection).isEqualTo(TextRange(0))
 
         textFieldValue.value = "Hello"
 
         rule.waitForIdle()
-        val actual = textNode.fetchSemanticsNode().config
-            .getOrNull(SemanticsProperties.TextSelectionRange)
+        val actual =
+            textNode.fetchSemanticsNode().config.getOrNull(SemanticsProperties.TextSelectionRange)
         assertThat(actual).isEqualTo(TextRange(0))
     }
 
@@ -1417,17 +1296,18 @@
         val shortText = "Text".repeat(2)
 
         var tfv by mutableStateOf(TextFieldValue(shortText))
-        val clipboardManager = object : ClipboardManager {
-            var contents: AnnotatedString? = null
+        val clipboardManager =
+            object : ClipboardManager {
+                var contents: AnnotatedString? = null
 
-            override fun setText(annotatedString: AnnotatedString) {
-                contents = annotatedString
-            }
+                override fun setText(annotatedString: AnnotatedString) {
+                    contents = annotatedString
+                }
 
-            override fun getText(): AnnotatedString? {
-                return contents
+                override fun getText(): AnnotatedString? {
+                    return contents
+                }
             }
-        }
         rule.setTextFieldTestContent {
             CompositionLocalProvider(LocalClipboardManager provides clipboardManager) {
                 BasicTextField(
@@ -1447,10 +1327,7 @@
         node.performSemanticsAction(SemanticsActions.PasteText) { it() }
         rule.waitForIdle()
 
-        val expectedTfv = TextFieldValue(
-            text = longText,
-            selection = TextRange(longText.length)
-        )
+        val expectedTfv = TextFieldValue(text = longText, selection = TextRange(longText.length))
         assertThat(tfv.text).isEqualTo(expectedTfv.text)
         assertThat(tfv.selection).isEqualTo(expectedTfv.selection)
     }
@@ -1463,20 +1340,18 @@
             Box(Modifier.onGloballyPositioned { size = it.size }) {
                 Row(Modifier.height(IntrinsicSize.Min)) {
                     Box(
-                        modifier = Modifier
-                            .fillMaxHeight()
-                            .width(10.dp)
-                            .onGloballyPositioned { dividerSize = it.size }
-                            .drawBehind { drawRect(Color.Gray) }
+                        modifier =
+                            Modifier.fillMaxHeight()
+                                .width(10.dp)
+                                .onGloballyPositioned { dividerSize = it.size }
+                                .drawBehind { drawRect(Color.Gray) }
                     )
                     BasicTextField(
                         value = "",
                         onValueChange = {},
                         decorationBox = { content ->
                             Box(
-                                modifier = Modifier
-                                    .border(1.dp, Color.Magenta)
-                                    .padding(4.dp),
+                                modifier = Modifier.border(1.dp, Color.Magenta).padding(4.dp),
                                 propagateMinConstraints = true
                             ) {
                                 content()
@@ -1503,9 +1378,7 @@
                 BasicTextField(
                     value = value,
                     onValueChange = { value = it },
-                    modifier = Modifier
-                        .fillMaxWidth()
-                        .testTag(Tag),
+                    modifier = Modifier.fillMaxWidth().testTag(Tag),
                     decorationBox = {
                         // the core text field is at the very bottom
                         if (value.isEmpty()) {
@@ -1540,16 +1413,14 @@
         val tag = "tag"
 
         val text = "text"
-        val tfv = TextFieldValue(
-            text = text,
-            selection = TextRange(text.length)
-        )
+        val tfv = TextFieldValue(text = text, selection = TextRange(text.length))
 
         val textAfterBackspace = text.run { substring(0, length - 1) }
-        val tfvAfterBackspace = TextFieldValue(
-            text = textAfterBackspace,
-            selection = TextRange(textAfterBackspace.length),
-        )
+        val tfvAfterBackspace =
+            TextFieldValue(
+                text = textAfterBackspace,
+                selection = TextRange(textAfterBackspace.length),
+            )
 
         var value by mutableStateOf(tfv)
         var readOnly by mutableStateOf(false)
@@ -1599,9 +1470,7 @@
                 modifier = Modifier.testTag(tag),
             )
         }
-        rule.onNodeWithTag(tag)
-            .requestFocus()
-            .performTextInput("Hello")
+        rule.onNodeWithTag(tag).requestFocus().performTextInput("Hello")
 
         rule.runOnIdle {
             assertThat(value.text).isEqualTo("Hello")
diff --git a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/textfield/TextFieldUndoTest.kt b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/textfield/TextFieldUndoTest.kt
index a58f865..5b910d9 100644
--- a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/textfield/TextFieldUndoTest.kt
+++ b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/textfield/TextFieldUndoTest.kt
@@ -39,8 +39,7 @@
 @OptIn(ExperimentalTestApi::class)
 class TextFieldUndoTest {
 
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
     @Test
     fun undo_redo_withCtrlShiftZ() {
@@ -56,10 +55,7 @@
     private fun undoRedoTest(redoKeys: List<Key>) {
         val state = mutableStateOf("hi")
         rule.setContent {
-            BasicTextField(
-                value = state.value,
-                onValueChange = { state.value = it }
-            )
+            BasicTextField(value = state.value, onValueChange = { state.value = it })
         }
 
         state.value = "hello"
@@ -67,16 +63,10 @@
         // undo command
         with(rule.onNode(hasSetTextAction())) {
             requestFocus()
-            performKeyInput {
-                withKeyDown(Key.CtrlLeft) {
-                    pressKey(Key.Z)
-                }
-            }
+            performKeyInput { withKeyDown(Key.CtrlLeft) { pressKey(Key.Z) } }
         }
 
-        rule.runOnIdle {
-            assertThat(state.value).isEqualTo("hi")
-        }
+        rule.runOnIdle { assertThat(state.value).isEqualTo("hi") }
 
         // redo command
         rule.onNode(hasSetTextAction()).performKeyInput {
@@ -85,8 +75,6 @@
             redoKeys.forEach { keyUp(it) }
         }
 
-        rule.runOnIdle {
-            assertThat(state.value).isEqualTo("hello")
-        }
+        rule.runOnIdle { assertThat(state.value).isEqualTo("hello") }
     }
 }
diff --git a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/textfield/TextFieldVisualTransformationCursorTest.kt b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/textfield/TextFieldVisualTransformationCursorTest.kt
index ad393df..189ceb6 100644
--- a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/textfield/TextFieldVisualTransformationCursorTest.kt
+++ b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/textfield/TextFieldVisualTransformationCursorTest.kt
@@ -46,8 +46,7 @@
 @MediumTest
 @RunWith(AndroidJUnit4::class)
 class TextFieldVisualTransformationCursorTest : FocusedWindowTest {
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
     // small enough to fit in narrow screen in pre-submit,
     // big enough that pointer movement can target a single char on center
@@ -56,10 +55,12 @@
     private val testTag = "testTag"
     private val defaultText = "text"
 
-    private val zeroedOffsetMapping = object : OffsetMapping {
-        override fun originalToTransformed(offset: Int): Int = 0
-        override fun transformedToOriginal(offset: Int): Int = 0
-    }
+    private val zeroedOffsetMapping =
+        object : OffsetMapping {
+            override fun originalToTransformed(offset: Int): Int = 0
+
+            override fun transformedToOriginal(offset: Int): Int = 0
+        }
 
     private fun runTest(
         text: String = defaultText,
@@ -73,9 +74,7 @@
                 onValueChange = { textFieldValue.value = it },
                 visualTransformation = visualTransformation,
                 textStyle = TextStyle(fontFamily = fontFamily, fontSize = fontSize),
-                modifier = Modifier
-                    .fillMaxWidth()
-                    .testTag(testTag),
+                modifier = Modifier.fillMaxWidth().testTag(testTag),
             )
         }
         block(textFieldValue)
@@ -88,33 +87,36 @@
     }
 
     @Test
-    fun longPressOnEmpty_doesNotShowCursor() = runTest(
-        text = "",
-    ) {
-        rule.onNodeWithTag(testTag).performTouchInput { longClick() }
-        assertCursorHandleShown(shown = false)
-    }
+    fun longPressOnEmpty_doesNotShowCursor() =
+        runTest(
+            text = "",
+        ) {
+            rule.onNodeWithTag(testTag).performTouchInput { longClick() }
+            assertCursorHandleShown(shown = false)
+        }
 
     @Test
-    fun longPressOnEmptyAfterVisualTransformation_doesNotShowCursor() = runTest(
-        visualTransformation = {
-            TransformedText(AnnotatedString(text = ""), zeroedOffsetMapping)
-        },
-    ) {
-        rule.onNodeWithTag(testTag).performTouchInput { longClick() }
-        assertCursorHandleShown(shown = false)
-    }
+    fun longPressOnEmptyAfterVisualTransformation_doesNotShowCursor() =
+        runTest(
+            visualTransformation = {
+                TransformedText(AnnotatedString(text = ""), zeroedOffsetMapping)
+            },
+        ) {
+            rule.onNodeWithTag(testTag).performTouchInput { longClick() }
+            assertCursorHandleShown(shown = false)
+        }
 
     @Test
-    fun longPressOnNonEmptyAfterVisualTransformation_showsCursor() = runTest(
-        text = "",
-        visualTransformation = {
-            TransformedText(AnnotatedString(text = defaultText), zeroedOffsetMapping)
-        },
-    ) {
-        rule.onNodeWithTag(testTag).performTouchInput { longClick() }
-        assertCursorHandleShown(shown = true)
-    }
+    fun longPressOnNonEmptyAfterVisualTransformation_showsCursor() =
+        runTest(
+            text = "",
+            visualTransformation = {
+                TransformedText(AnnotatedString(text = defaultText), zeroedOffsetMapping)
+            },
+        ) {
+            rule.onNodeWithTag(testTag).performTouchInput { longClick() }
+            assertCursorHandleShown(shown = true)
+        }
 
     private fun assertCursorHandleShown(shown: Boolean) {
         val cursorHandle = rule.onNode(isSelectionHandle(Handle.Cursor))
diff --git a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/textfield/TextFieldVisualTransformationSelectionBoundsTest.kt b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/textfield/TextFieldVisualTransformationSelectionBoundsTest.kt
index 2218458..19369ff 100644
--- a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/textfield/TextFieldVisualTransformationSelectionBoundsTest.kt
+++ b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/textfield/TextFieldVisualTransformationSelectionBoundsTest.kt
@@ -38,52 +38,59 @@
 @RunWith(AndroidJUnit4::class)
 internal class TextFieldVisualTransformationSelectionBoundsTest : FocusedWindowTest {
 
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
     @Test
     fun BasicTextField_doesOffsetMapChecks_inInitialComposition() {
-        val error = assertFailsWith<IllegalStateException> {
-            rule.setTextFieldTestContent {
-                BasicTextField(
-                    value = "12345689",
-                    onValueChange = { /* ignore changes */ },
-                    visualTransformation = { original ->
-                        TransformedText(
-                            text = original,
-                            offsetMapping = object : OffsetMapping {
-                                override fun originalToTransformed(offset: Int) = offset + 1
-                                override fun transformedToOriginal(offset: Int) = offset - 1
-                            }
-                        )
-                    }
-                )
+        val error =
+            assertFailsWith<IllegalStateException> {
+                rule.setTextFieldTestContent {
+                    BasicTextField(
+                        value = "12345689",
+                        onValueChange = { /* ignore changes */ },
+                        visualTransformation = { original ->
+                            TransformedText(
+                                text = original,
+                                offsetMapping =
+                                    object : OffsetMapping {
+                                        override fun originalToTransformed(offset: Int) = offset + 1
+
+                                        override fun transformedToOriginal(offset: Int) = offset - 1
+                                    }
+                            )
+                        }
+                    )
+                }
             }
-        }
-        assertThat(error).hasMessageThat()
+        assertThat(error)
+            .hasMessageThat()
             .startsWith("OffsetMapping.originalToTransformed returned invalid mapping: ")
     }
 
     @Test
     fun BasicTextField_doesOffsetMapChecks_inInitialComposition_veryLongTextOffBy1() {
-        val error = assertFailsWith<IllegalStateException> {
-            rule.setTextFieldTestContent {
-                BasicTextField(
-                    value = "12345689",
-                    onValueChange = { /* ignore changes */ },
-                    visualTransformation = { original ->
-                        TransformedText(
-                            text = original,
-                            offsetMapping = object : OffsetMapping {
-                                override fun originalToTransformed(offset: Int) = offset + 1
-                                override fun transformedToOriginal(offset: Int) = offset - 1
-                            }
-                        )
-                    }
-                )
+        val error =
+            assertFailsWith<IllegalStateException> {
+                rule.setTextFieldTestContent {
+                    BasicTextField(
+                        value = "12345689",
+                        onValueChange = { /* ignore changes */ },
+                        visualTransformation = { original ->
+                            TransformedText(
+                                text = original,
+                                offsetMapping =
+                                    object : OffsetMapping {
+                                        override fun originalToTransformed(offset: Int) = offset + 1
+
+                                        override fun transformedToOriginal(offset: Int) = offset - 1
+                                    }
+                            )
+                        }
+                    )
+                }
             }
-        }
-        assertThat(error).hasMessageThat()
+        assertThat(error)
+            .hasMessageThat()
             .startsWith("OffsetMapping.originalToTransformed returned invalid mapping: ")
     }
 }
diff --git a/compose/foundation/foundation/src/androidMain/kotlin/androidx/compose/foundation/AndroidExternalSurface.android.kt b/compose/foundation/foundation/src/androidMain/kotlin/androidx/compose/foundation/AndroidExternalSurface.android.kt
index a38a9f5..aa8115a 100644
--- a/compose/foundation/foundation/src/androidMain/kotlin/androidx/compose/foundation/AndroidExternalSurface.android.kt
+++ b/compose/foundation/foundation/src/androidMain/kotlin/androidx/compose/foundation/AndroidExternalSurface.android.kt
@@ -44,25 +44,23 @@
  */
 interface SurfaceScope {
     /**
-     * Invokes [onChanged] when the surface's geometry (width and height) changes.
-     * Always invoked on the main thread.
+     * Invokes [onChanged] when the surface's geometry (width and height) changes. Always invoked on
+     * the main thread.
      */
     fun Surface.onChanged(onChanged: Surface.(width: Int, height: Int) -> Unit)
 
     /**
-     * Invokes [onDestroyed] when the surface is destroyed. All rendering into
-     * the surface should stop immediately after [onDestroyed] is invoked.
-     * Always invoked on the main thread.
+     * Invokes [onDestroyed] when the surface is destroyed. All rendering into the surface should
+     * stop immediately after [onDestroyed] is invoked. Always invoked on the main thread.
      */
     fun Surface.onDestroyed(onDestroyed: Surface.() -> Unit)
 }
 
 /**
- * [SurfaceCoroutineScope] is a scoped environment provided by
- * [AndroidExternalSurface] and [AndroidEmbeddedExternalSurface] when a new [Surface] is
- * created. This environment is a coroutine scope that also provides access to
- * a [SurfaceScope] environment which can itself be used to handle other [Surface]
- * lifecycle events.
+ * [SurfaceCoroutineScope] is a scoped environment provided by [AndroidExternalSurface] and
+ * [AndroidEmbeddedExternalSurface] when a new [Surface] is created. This environment is a coroutine
+ * scope that also provides access to a [SurfaceScope] environment which can itself be used to
+ * handle other [Surface] lifecycle events.
  *
  * @see SurfaceScope
  * @see AndroidExternalSurfaceScope
@@ -72,20 +70,19 @@
 interface SurfaceCoroutineScope : SurfaceScope, CoroutineScope
 
 /**
- * [AndroidExternalSurfaceScope] is a scoped environment provided when an
- * [AndroidExternalSurface] or [AndroidEmbeddedExternalSurface] is first initialized.
- * This environment can be used to register a lambda to invoke when a new [Surface]
- * associated with the [AndroidExternalSurface]/[AndroidEmbeddedExternalSurface]
- * is created.
+ * [AndroidExternalSurfaceScope] is a scoped environment provided when an [AndroidExternalSurface]
+ * or [AndroidEmbeddedExternalSurface] is first initialized. This environment can be used to
+ * register a lambda to invoke when a new [Surface] associated with the
+ * [AndroidExternalSurface]/[AndroidEmbeddedExternalSurface] is created.
  */
 interface AndroidExternalSurfaceScope {
     /**
-     * Invokes [onSurface] when a new [Surface] is created. The [onSurface] lambda
-     * is invoked on the main thread as part of a [SurfaceCoroutineScope] to provide
-     * a coroutine context. Always invoked on the main thread.
+     * Invokes [onSurface] when a new [Surface] is created. The [onSurface] lambda is invoked on the
+     * main thread as part of a [SurfaceCoroutineScope] to provide a coroutine context. Always
+     * invoked on the main thread.
      *
-     * @param onSurface Callback invoked when a new [Surface] is created. The initial
-     *                  dimensions of the surface are provided.
+     * @param onSurface Callback invoked when a new [Surface] is created. The initial dimensions of
+     *   the surface are provided.
      */
     fun onSurface(
         onSurface: suspend SurfaceCoroutineScope.(surface: Surface, width: Int, height: Int) -> Unit
@@ -94,15 +91,16 @@
 
 /**
  * Base class for [AndroidExternalSurface] and [AndroidEmbeddedExternalSurface] state. This class
- * provides methods to properly dispatch lifecycle events on [Surface] creation,
- * change, and destruction. Surface creation is treated as a coroutine launch,
- * using the specified [scope] as the parent. This scope must be the main thread scope.
+ * provides methods to properly dispatch lifecycle events on [Surface] creation, change, and
+ * destruction. Surface creation is treated as a coroutine launch, using the specified [scope] as
+ * the parent. This scope must be the main thread scope.
  */
 private abstract class BaseAndroidExternalSurfaceState(val scope: CoroutineScope) :
     AndroidExternalSurfaceScope, SurfaceScope {
 
     private var onSurface:
-        (suspend SurfaceCoroutineScope.(surface: Surface, width: Int, height: Int) -> Unit)? = null
+        (suspend SurfaceCoroutineScope.(surface: Surface, width: Int, height: Int) -> Unit)? =
+        null
     private var onSurfaceChanged: (Surface.(width: Int, height: Int) -> Unit)? = null
     private var onSurfaceDestroyed: (Surface.() -> Unit)? = null
 
@@ -123,33 +121,35 @@
     }
 
     /**
-     * Dispatch a surface creation event by launching a new coroutine in [scope].
-     * Any previous job from a previous surface creation dispatch is cancelled.
+     * Dispatch a surface creation event by launching a new coroutine in [scope]. Any previous job
+     * from a previous surface creation dispatch is cancelled.
      */
     fun dispatchSurfaceCreated(surface: Surface, width: Int, height: Int) {
         if (onSurface != null) {
-            job = scope.launch(start = CoroutineStart.UNDISPATCHED) {
-                job?.cancelAndJoin()
-                val receiver =
-                    object : SurfaceCoroutineScope,
-                        SurfaceScope by this@BaseAndroidExternalSurfaceState,
-                        CoroutineScope by this {}
-                onSurface?.invoke(receiver, surface, width, height)
-            }
+            job =
+                scope.launch(start = CoroutineStart.UNDISPATCHED) {
+                    job?.cancelAndJoin()
+                    val receiver =
+                        object :
+                            SurfaceCoroutineScope,
+                            SurfaceScope by this@BaseAndroidExternalSurfaceState,
+                            CoroutineScope by this {}
+                    onSurface?.invoke(receiver, surface, width, height)
+                }
         }
     }
 
     /**
-     * Dispatch a surface change event, providing the surface's new width and height.
-     * Must be invoked from the main thread.
+     * Dispatch a surface change event, providing the surface's new width and height. Must be
+     * invoked from the main thread.
      */
     fun dispatchSurfaceChanged(surface: Surface, width: Int, height: Int) {
         onSurfaceChanged?.invoke(surface, width, height)
     }
 
     /**
-     * Dispatch a surface destruction event. Any pending job from [dispatchSurfaceCreated]
-     * is cancelled before dispatching the event. Must be invoked from the main thread.
+     * Dispatch a surface destruction event. Any pending job from [dispatchSurfaceCreated] is
+     * cancelled before dispatching the event. Must be invoked from the main thread.
      */
     fun dispatchSurfaceDestroyed(surface: Surface) {
         onSurfaceDestroyed?.invoke(surface)
@@ -193,87 +193,77 @@
 }
 
 /**
- * Defines the z-order of an [AndroidExternalSurface]. When using an
- * [AndroidExternalSurface], a new [Surface] is created and displayed as a separate
- * window layer whose position in the windows layer stack relative to the parent
- * window is decided by its z-order. This class provides constants to set that
- * z-order.
+ * Defines the z-order of an [AndroidExternalSurface]. When using an [AndroidExternalSurface], a new
+ * [Surface] is created and displayed as a separate window layer whose position in the windows layer
+ * stack relative to the parent window is decided by its z-order. This class provides constants to
+ * set that z-order.
  */
 @JvmInline
 value class AndroidExternalSurfaceZOrder private constructor(val zOrder: Int) {
     companion object {
-        /**
-         * The [Surface]'s window layer is positioned behind the parent window.
-         */
+        /** The [Surface]'s window layer is positioned behind the parent window. */
         val Behind = AndroidExternalSurfaceZOrder(0)
         /**
-         * The [Surface]'s window layer is positioned behind the parent window but
-         * above other [Surface] window layers marked [Behind].
+         * The [Surface]'s window layer is positioned behind the parent window but above other
+         * [Surface] window layers marked [Behind].
          */
         val MediaOverlay = AndroidExternalSurfaceZOrder(1)
-        /**
-         * The [Surface]'s window layer is positioned above the parent window.
-         */
+        /** The [Surface]'s window layer is positioned above the parent window. */
         val OnTop = AndroidExternalSurfaceZOrder(2)
     }
 }
 
 /**
- * Provides a dedicated drawing [Surface] as a separate layer positioned by default
- * behind the window holding the [AndroidExternalSurface] composable. Because
- * [AndroidExternalSurface] uses a separate window layer, graphics composition is handled
- * by the system compositor which can bypass the GPU and provide better performance and
- * power usage characteristics compared to [AndroidEmbeddedExternalSurface]. It is therefore
- * recommended to use [AndroidExternalSurface] over [AndroidEmbeddedExternalSurface] whenever
- * possible.
+ * Provides a dedicated drawing [Surface] as a separate layer positioned by default behind the
+ * window holding the [AndroidExternalSurface] composable. Because [AndroidExternalSurface] uses a
+ * separate window layer, graphics composition is handled by the system compositor which can bypass
+ * the GPU and provide better performance and power usage characteristics compared to
+ * [AndroidEmbeddedExternalSurface]. It is therefore recommended to use [AndroidExternalSurface]
+ * over [AndroidEmbeddedExternalSurface] whenever possible.
  *
- * The [Surface] provided can be used to present content that's external to Compose, such as
- * a video stream (from a camera or a media player), OpenGL, Vulkan...The provided [Surface]
- * can be rendered into using a thread different from the main thread.
+ * The [Surface] provided can be used to present content that's external to Compose, such as a video
+ * stream (from a camera or a media player), OpenGL, Vulkan...The provided [Surface] can be rendered
+ * into using a thread different from the main thread.
  *
  * The z-ordering of the surface can be controlled using the [zOrder] parameter:
- *
  * - [AndroidExternalSurfaceZOrder.Behind]: positions the surface behind the window
- * - [AndroidExternalSurfaceZOrder.MediaOverlay]: positions the surface behind the window but
- *   above other [AndroidExternalSurfaceZOrder.Behind] surfaces
+ * - [AndroidExternalSurfaceZOrder.MediaOverlay]: positions the surface behind the window but above
+ *   other [AndroidExternalSurfaceZOrder.Behind] surfaces
  * - [AndroidExternalSurfaceZOrder.OnTop]: positions the surface above the window
  *
- * The drawing surface is opaque by default, which can be controlled with the [isOpaque]
- * parameter. When the surface is transparent, you may need to change the z-order to
- * see something behind the surface.
+ * The drawing surface is opaque by default, which can be controlled with the [isOpaque] parameter.
+ * When the surface is transparent, you may need to change the z-order to see something behind the
+ * surface.
  *
- * To start rendering, the caller must first acquire the [Surface] when it's created.
- * This is achieved by providing the [onInit] lambda, which allows the caller to
- * register an appropriate [AndroidExternalSurfaceScope.onSurface] callback. The [onInit]
- * lambda can also be used to initialize/cache resources needed once a surface is
- * available.
+ * To start rendering, the caller must first acquire the [Surface] when it's created. This is
+ * achieved by providing the [onInit] lambda, which allows the caller to register an appropriate
+ * [AndroidExternalSurfaceScope.onSurface] callback. The [onInit] lambda can also be used to
+ * initialize/cache resources needed once a surface is available.
  *
- * After acquiring a surface, the caller can start rendering into it. Rendering into a
- * surface can be done from any thread.
+ * After acquiring a surface, the caller can start rendering into it. Rendering into a surface can
+ * be done from any thread.
  *
  * It is recommended to register the [SurfaceScope.onChanged] and [SurfaceScope.onDestroyed]
- * callbacks to properly handle the lifecycle of the surface and react to dimension
- * changes. You must ensure that the rendering thread stops interacting with the surface
- * when the [SurfaceScope.onDestroyed] callback is invoked.
+ * callbacks to properly handle the lifecycle of the surface and react to dimension changes. You
+ * must ensure that the rendering thread stops interacting with the surface when the
+ * [SurfaceScope.onDestroyed] callback is invoked.
  *
- * If a [surfaceSize] is specified (set to non-[IntSize.Zero]), the surface will use
- * the specified size instead of the layout size of this composable. The surface will
- * be stretched at render time to fit the layout size. This can be used for instance to
- * render at a lower resolution for performance reasons.
+ * If a [surfaceSize] is specified (set to non-[IntSize.Zero]), the surface will use the specified
+ * size instead of the layout size of this composable. The surface will be stretched at render time
+ * to fit the layout size. This can be used for instance to render at a lower resolution for
+ * performance reasons.
  *
  * @param modifier Modifier to be applied to the [AndroidExternalSurface]
  * @param isOpaque Whether the managed surface should be opaque or transparent.
- * @param surfaceSize Sets the surface size independently of the layout size of
- *                    this [AndroidExternalSurface]. If set to [IntSize.Zero], the
- *                    surface size will be equal to the [AndroidExternalSurface]
- *                    layout size.
+ * @param surfaceSize Sets the surface size independently of the layout size of this
+ *   [AndroidExternalSurface]. If set to [IntSize.Zero], the surface size will be equal to the
+ *   [AndroidExternalSurface] layout size.
  * @param zOrder Sets the z-order of the surface relative to its parent window.
- * @param isSecure Control whether the surface view's content should be treated as
- *                 secure, preventing it from appearing in screenshots or from being
- *                 viewed on non-secure displays.
- * @param onInit Lambda invoked on first composition. This lambda can be used to
- *               declare a [AndroidExternalSurfaceScope.onSurface] callback that
- *               will be invoked when a surface is available.
+ * @param isSecure Control whether the surface view's content should be treated as secure,
+ *   preventing it from appearing in screenshots or from being viewed on non-secure displays.
+ * @param onInit Lambda invoked on first composition. This lambda can be used to declare a
+ *   [AndroidExternalSurfaceScope.onSurface] callback that will be invoked when a surface is
+ *   available.
  *
  * @sample androidx.compose.foundation.samples.AndroidExternalSurfaceColors
  */
@@ -296,7 +286,7 @@
             }
         },
         modifier = modifier,
-        onReset = { },
+        onReset = {},
         update = { view ->
             if (surfaceSize != IntSize.Zero) {
                 view.holder.setFixedSize(surfaceSize.width, surfaceSize.height)
@@ -387,61 +377,53 @@
 }
 
 /**
- * Provides a dedicated drawing [Surface] embedded directly in the UI hierarchy.
- * Unlike [AndroidExternalSurface], [AndroidEmbeddedExternalSurface] positions its
- * surface as a regular element inside the composable hierarchy. This means that graphics
- * composition is handled like any other UI widget, using the GPU. This can lead
- * to increased power and memory bandwidth usage compared to [AndroidExternalSurface].
- * It is therefore recommended to use [AndroidExternalSurface] over
- * [AndroidEmbeddedExternalSurface] whenever possible.
+ * Provides a dedicated drawing [Surface] embedded directly in the UI hierarchy. Unlike
+ * [AndroidExternalSurface], [AndroidEmbeddedExternalSurface] positions its surface as a regular
+ * element inside the composable hierarchy. This means that graphics composition is handled like any
+ * other UI widget, using the GPU. This can lead to increased power and memory bandwidth usage
+ * compared to [AndroidExternalSurface]. It is therefore recommended to use [AndroidExternalSurface]
+ * over [AndroidEmbeddedExternalSurface] whenever possible.
  *
- * [AndroidEmbeddedExternalSurface] can however be useful when interactions with other widgets
- * is necessary, for instance if the surface needs to be "sandwiched" between two
- * other widgets, or if it must participate in visual effects driven by
- * a `Modifier.graphicsLayer{}`.
+ * [AndroidEmbeddedExternalSurface] can however be useful when interactions with other widgets is
+ * necessary, for instance if the surface needs to be "sandwiched" between two other widgets, or if
+ * it must participate in visual effects driven by a `Modifier.graphicsLayer{}`.
  *
- * The [Surface] provided can be used to present content that's external to Compose,
- * such as a video stream (from a camera or a media player), OpenGL, Vulkan...
- * The provided [Surface] can be rendered into using a thread different from the main
- * thread.
+ * The [Surface] provided can be used to present content that's external to Compose, such as a video
+ * stream (from a camera or a media player), OpenGL, Vulkan... The provided [Surface] can be
+ * rendered into using a thread different from the main thread.
  *
- * The drawing surface is opaque by default, which can be controlled with the [isOpaque]
- * parameter.
+ * The drawing surface is opaque by default, which can be controlled with the [isOpaque] parameter.
  *
- * To start rendering, the caller must first acquire the [Surface] when it's created.
- * This is achieved by providing the [onInit] lambda, which allows the caller to
- * register an appropriate [AndroidExternalSurfaceScope.onSurface] callback. The [onInit]
- * lambda can also be used to initialize/cache resources needed once a surface is
- * available.
+ * To start rendering, the caller must first acquire the [Surface] when it's created. This is
+ * achieved by providing the [onInit] lambda, which allows the caller to register an appropriate
+ * [AndroidExternalSurfaceScope.onSurface] callback. The [onInit] lambda can also be used to
+ * initialize/cache resources needed once a surface is available.
  *
- * After acquiring a surface, the caller can start rendering into it. Rendering into a
- * surface can be done from any thread.
+ * After acquiring a surface, the caller can start rendering into it. Rendering into a surface can
+ * be done from any thread.
  *
  * It is recommended to register the [SurfaceScope.onChanged] and [SurfaceScope.onDestroyed]
- * callbacks to properly handle the lifecycle of the surface and react to dimension
- * changes. You must ensure that the rendering thread stops interacting with the surface
- * when the [SurfaceScope.onDestroyed] callback is invoked.
+ * callbacks to properly handle the lifecycle of the surface and react to dimension changes. You
+ * must ensure that the rendering thread stops interacting with the surface when the
+ * [SurfaceScope.onDestroyed] callback is invoked.
  *
- * If a [surfaceSize] is specified (set to non-[IntSize.Zero]), the surface will use
- * the specified size instead of the layout size of this composable. The surface will
- * be stretched at render time to fit the layout size. This can be used for instance to
- * render at a lower resolution for performance reasons.
+ * If a [surfaceSize] is specified (set to non-[IntSize.Zero]), the surface will use the specified
+ * size instead of the layout size of this composable. The surface will be stretched at render time
+ * to fit the layout size. This can be used for instance to render at a lower resolution for
+ * performance reasons.
  *
  * @param modifier Modifier to be applied to the [AndroidExternalSurface]
- * @param isOpaque Whether the managed surface should be opaque or transparent. If
- *                 transparent and [isMediaOverlay] is `false`, the surface will
- *                 be positioned above the parent window.
- * @param surfaceSize Sets the surface size independently of the layout size of
- *                    this [AndroidExternalSurface]. If set to [IntSize.Zero], the
- *                    surface size will be equal to the [AndroidExternalSurface]
- *                    layout size.
- * @param transform Sets the transform to apply to the [Surface]. Some transforms
- *                  might prevent the content from drawing all the pixels contained
- *                  within this Composable's bounds. In such situations, make sure
- *                  to set [isOpaque] to `false`.
- * @param onInit Lambda invoked on first composition. This lambda can be used to
- *               declare a [AndroidExternalSurfaceScope.onSurface] callback that
- *               will be invoked when a surface is available.
+ * @param isOpaque Whether the managed surface should be opaque or transparent. If transparent and
+ *   [isMediaOverlay] is `false`, the surface will be positioned above the parent window.
+ * @param surfaceSize Sets the surface size independently of the layout size of this
+ *   [AndroidExternalSurface]. If set to [IntSize.Zero], the surface size will be equal to the
+ *   [AndroidExternalSurface] layout size.
+ * @param transform Sets the transform to apply to the [Surface]. Some transforms might prevent the
+ *   content from drawing all the pixels contained within this Composable's bounds. In such
+ *   situations, make sure to set [isOpaque] to `false`.
+ * @param onInit Lambda invoked on first composition. This lambda can be used to declare a
+ *   [AndroidExternalSurfaceScope.onSurface] callback that will be invoked when a surface is
+ *   available.
  *
  * @sample androidx.compose.foundation.samples.AndroidEmbeddedExternalSurfaceColors
  */
@@ -464,7 +446,7 @@
             }
         },
         modifier = modifier,
-        onReset = { },
+        onReset = {},
         update = { view ->
             if (surfaceSize != IntSize.Zero) {
                 view.surfaceTexture?.setDefaultBufferSize(surfaceSize.width, surfaceSize.height)
diff --git a/compose/foundation/foundation/src/androidMain/kotlin/androidx/compose/foundation/AndroidOverscroll.android.kt b/compose/foundation/foundation/src/androidMain/kotlin/androidx/compose/foundation/AndroidOverscroll.android.kt
index c1cc0fc..9eb4c07 100644
--- a/compose/foundation/foundation/src/androidMain/kotlin/androidx/compose/foundation/AndroidOverscroll.android.kt
+++ b/compose/foundation/foundation/src/androidMain/kotlin/androidx/compose/foundation/AndroidOverscroll.android.kt
@@ -79,16 +79,16 @@
 ) : DrawModifier, InspectorValueInfo(inspectorInfo) {
 
     /**
-     * There is an unwanted behavior in the stretch overscroll effect we have to workaround:
-     * when the effect is started it is getting the current RenderNode bounds and clips the content
-     * by those bounds. Even if this RenderNode is not configured to do clipping. Or if it clips,
-     * but not within its bounds, but by the outline provided which could have a completely
-     * different bounds. That is what happens with our scrolling containers - they all clip by the
-     * rect which is larger than the RenderNode bounds in order to not clip the shadows drawn in
-     * the cross axis of the scrolling direction. This issue is not that visible in the Views world
-     * because Views do clip by default. So adding one more clip doesn't change much. Thus why the
-     * whole shadows mechanism in the Views world works differently, the shadows are drawn not
-     * in-place, but with the background of the first parent which has a background.
+     * There is an unwanted behavior in the stretch overscroll effect we have to workaround: when
+     * the effect is started it is getting the current RenderNode bounds and clips the content by
+     * those bounds. Even if this RenderNode is not configured to do clipping. Or if it clips, but
+     * not within its bounds, but by the outline provided which could have a completely different
+     * bounds. That is what happens with our scrolling containers - they all clip by the rect which
+     * is larger than the RenderNode bounds in order to not clip the shadows drawn in the cross axis
+     * of the scrolling direction. This issue is not that visible in the Views world because Views
+     * do clip by default. So adding one more clip doesn't change much. Thus why the whole shadows
+     * mechanism in the Views world works differently, the shadows are drawn not in-place, but with
+     * the background of the first parent which has a background.
      *
      * To solve this we need to render into a larger area, either by creating a larger layer for the
      * child to draw in, or by manually rendering the stretch into a larger RenderNode, and then
@@ -96,8 +96,8 @@
      * extend the cross axis / clip the main axis (scrolling containers do this already), otherwise
      * the extra layer space will be transformed by the stretch, which results in an incorrect
      * effect that can also end up revealing content underneath the scrolling container, as we
-     * stretch the transparent pixels in the extra space. For this to work we would need to know
-     * the stretch direction at layer creation time (i.e, placeWithLayer inside placement), but
+     * stretch the transparent pixels in the extra space. For this to work we would need to know the
+     * stretch direction at layer creation time (i.e, placeWithLayer inside placement), but
      * [OverscrollEffect] has no knowledge of directionality until an event is received. Creating a
      * larger layer in this way is also more expensive and requires more parts, as we have to use
      * two layout modifiers to achieve the desired effect.
@@ -111,8 +111,8 @@
      */
     private var _renderNode: RenderNode? = null
     private val renderNode
-        get() = _renderNode ?: RenderNode("AndroidEdgeEffectOverscrollEffect")
-            .also { _renderNode = it }
+        get() =
+            _renderNode ?: RenderNode("AndroidEdgeEffectOverscrollEffect").also { _renderNode = it }
 
     @Suppress("KotlinConstantConditions")
     override fun ContentDrawScope.draw() {
@@ -269,14 +269,21 @@
         }
     }
 
-    private fun shouldDrawVerticalStretch() = with(edgeEffectWrapper) {
-        isTopAnimating() || isTopNegationStretched() ||
-            isBottomAnimating() || isBottomNegationStretched()
-    }
-    private fun shouldDrawHorizontalStretch() = with(edgeEffectWrapper) {
-        isLeftAnimating() || isLeftNegationStretched() ||
-            isRightAnimating() || isRightNegationStretched()
-    }
+    private fun shouldDrawVerticalStretch() =
+        with(edgeEffectWrapper) {
+            isTopAnimating() ||
+                isTopNegationStretched() ||
+                isBottomAnimating() ||
+                isBottomNegationStretched()
+        }
+
+    private fun shouldDrawHorizontalStretch() =
+        with(edgeEffectWrapper) {
+            isLeftAnimating() ||
+                isLeftNegationStretched() ||
+                isRightAnimating() ||
+                isRightNegationStretched()
+        }
 
     private fun drawLeftStretch(left: EdgeEffect, canvas: NativeCanvas): Boolean {
         return drawWithRotation(rotationDegrees = 270f, edgeEffect = left, canvas = canvas)
@@ -353,10 +360,11 @@
     }
 
     private fun DrawScope.drawLeftGlow(left: EdgeEffect, canvas: NativeCanvas): Boolean {
-        val offset = Offset(
-            -size.height,
-            overscrollConfig.drawPadding.calculateLeftPadding(layoutDirection).toPx()
-        )
+        val offset =
+            Offset(
+                -size.height,
+                overscrollConfig.drawPadding.calculateLeftPadding(layoutDirection).toPx()
+            )
         return drawWithRotationAndOffset(
             rotationDegrees = 270f,
             offset = offset,
@@ -420,15 +428,12 @@
 ) : OverscrollEffect {
     private var pointerPosition: Offset? = null
 
-    private val edgeEffectWrapper = EdgeEffectWrapper(
-        context,
-        glowColor = overscrollConfig.glowColor.toArgb()
-    )
+    private val edgeEffectWrapper =
+        EdgeEffectWrapper(context, glowColor = overscrollConfig.glowColor.toArgb())
 
     internal val redrawSignal = mutableStateOf(Unit, neverEqualPolicy())
 
-    @VisibleForTesting
-    internal var invalidationEnabled = true
+    @VisibleForTesting internal var invalidationEnabled = true
 
     private var scrollCycleInProgress: Boolean = false
 
@@ -447,46 +452,48 @@
             scrollCycleInProgress = true
         }
         // Relax existing stretches if needed before performing scroll
-        val consumedPixelsY = when {
-            delta.y == 0f -> 0f
-            edgeEffectWrapper.isTopStretched() -> {
-                pullTop(delta).also {
-                    // Release / reset state if we have fully relaxed the stretch
-                    if (!edgeEffectWrapper.isTopStretched()) {
-                        edgeEffectWrapper.getOrCreateTopEffect().onRelease()
+        val consumedPixelsY =
+            when {
+                delta.y == 0f -> 0f
+                edgeEffectWrapper.isTopStretched() -> {
+                    pullTop(delta).also {
+                        // Release / reset state if we have fully relaxed the stretch
+                        if (!edgeEffectWrapper.isTopStretched()) {
+                            edgeEffectWrapper.getOrCreateTopEffect().onRelease()
+                        }
                     }
                 }
-            }
-            edgeEffectWrapper.isBottomStretched() -> {
-                pullBottom(delta).also {
-                    // Release / reset state if we have fully relaxed the stretch
-                    if (!edgeEffectWrapper.isBottomStretched()) {
-                        edgeEffectWrapper.getOrCreateBottomEffect().onRelease()
+                edgeEffectWrapper.isBottomStretched() -> {
+                    pullBottom(delta).also {
+                        // Release / reset state if we have fully relaxed the stretch
+                        if (!edgeEffectWrapper.isBottomStretched()) {
+                            edgeEffectWrapper.getOrCreateBottomEffect().onRelease()
+                        }
                     }
                 }
+                else -> 0f
             }
-            else -> 0f
-        }
-        val consumedPixelsX = when {
-            delta.x == 0f -> 0f
-            edgeEffectWrapper.isLeftStretched() -> {
-                pullLeft(delta).also {
-                    // Release / reset state if we have fully relaxed the stretch
-                    if (!edgeEffectWrapper.isLeftStretched()) {
-                        edgeEffectWrapper.getOrCreateLeftEffect().onRelease()
+        val consumedPixelsX =
+            when {
+                delta.x == 0f -> 0f
+                edgeEffectWrapper.isLeftStretched() -> {
+                    pullLeft(delta).also {
+                        // Release / reset state if we have fully relaxed the stretch
+                        if (!edgeEffectWrapper.isLeftStretched()) {
+                            edgeEffectWrapper.getOrCreateLeftEffect().onRelease()
+                        }
                     }
                 }
-            }
-            edgeEffectWrapper.isRightStretched() -> {
-                pullRight(delta).also {
-                    // Release / reset state if we have fully relaxed the stretch
-                    if (!edgeEffectWrapper.isRightStretched()) {
-                        edgeEffectWrapper.getOrCreateRightEffect().onRelease()
+                edgeEffectWrapper.isRightStretched() -> {
+                    pullRight(delta).also {
+                        // Release / reset state if we have fully relaxed the stretch
+                        if (!edgeEffectWrapper.isRightStretched()) {
+                            edgeEffectWrapper.getOrCreateRightEffect().onRelease()
+                        }
                     }
                 }
+                else -> 0f
             }
-            else -> 0f
-        }
         val consumedOffset = Offset(consumedPixelsX, consumedPixelsY)
         if (consumedOffset != Offset.Zero) invalidateOverscroll()
 
@@ -498,24 +505,26 @@
         if (source == NestedScrollSource.UserInput) {
             // Ignore small deltas (< 0.5) as this usually comes from floating point rounding issues
             // and can cause scrolling to lock up (b/265363356)
-            val appliedHorizontalOverscroll = if (leftForOverscroll.x > 0.5f) {
-                pullLeft(leftForOverscroll)
-                true
-            } else if (leftForOverscroll.x < -0.5f) {
-                pullRight(leftForOverscroll)
-                true
-            } else {
-                false
-            }
-            val appliedVerticalOverscroll = if (leftForOverscroll.y > 0.5f) {
-                pullTop(leftForOverscroll)
-                true
-            } else if (leftForOverscroll.y < -0.5f) {
-                pullBottom(leftForOverscroll)
-                true
-            } else {
-                false
-            }
+            val appliedHorizontalOverscroll =
+                if (leftForOverscroll.x > 0.5f) {
+                    pullLeft(leftForOverscroll)
+                    true
+                } else if (leftForOverscroll.x < -0.5f) {
+                    pullRight(leftForOverscroll)
+                    true
+                } else {
+                    false
+                }
+            val appliedVerticalOverscroll =
+                if (leftForOverscroll.y > 0.5f) {
+                    pullTop(leftForOverscroll)
+                    true
+                } else if (leftForOverscroll.y < -0.5f) {
+                    pullBottom(leftForOverscroll)
+                    true
+                } else {
+                    false
+                }
             needsInvalidation = appliedHorizontalOverscroll || appliedVerticalOverscroll
         }
         needsInvalidation = releaseOppositeOverscroll(delta) || needsInvalidation
@@ -534,24 +543,26 @@
             return
         }
         // Relax existing stretches before performing fling
-        val consumedX = if (velocity.x > 0f && edgeEffectWrapper.isLeftStretched()) {
-            edgeEffectWrapper.getOrCreateLeftEffect().onAbsorbCompat(velocity.x.roundToInt())
-            velocity.x
-        } else if (velocity.x < 0 && edgeEffectWrapper.isRightStretched()) {
-            edgeEffectWrapper.getOrCreateRightEffect().onAbsorbCompat(-velocity.x.roundToInt())
-            velocity.x
-        } else {
-            0f
-        }
-        val consumedY = if (velocity.y > 0f && edgeEffectWrapper.isTopStretched()) {
-            edgeEffectWrapper.getOrCreateTopEffect().onAbsorbCompat(velocity.y.roundToInt())
-            velocity.y
-        } else if (velocity.y < 0f && edgeEffectWrapper.isBottomStretched()) {
-            edgeEffectWrapper.getOrCreateBottomEffect().onAbsorbCompat(-velocity.y.roundToInt())
-            velocity.y
-        } else {
-            0f
-        }
+        val consumedX =
+            if (velocity.x > 0f && edgeEffectWrapper.isLeftStretched()) {
+                edgeEffectWrapper.getOrCreateLeftEffect().onAbsorbCompat(velocity.x.roundToInt())
+                velocity.x
+            } else if (velocity.x < 0 && edgeEffectWrapper.isRightStretched()) {
+                edgeEffectWrapper.getOrCreateRightEffect().onAbsorbCompat(-velocity.x.roundToInt())
+                velocity.x
+            } else {
+                0f
+            }
+        val consumedY =
+            if (velocity.y > 0f && edgeEffectWrapper.isTopStretched()) {
+                edgeEffectWrapper.getOrCreateTopEffect().onAbsorbCompat(velocity.y.roundToInt())
+                velocity.y
+            } else if (velocity.y < 0f && edgeEffectWrapper.isBottomStretched()) {
+                edgeEffectWrapper.getOrCreateBottomEffect().onAbsorbCompat(-velocity.y.roundToInt())
+                velocity.y
+            } else {
+                0f
+            }
         val consumed = Velocity(consumedX, consumedY)
         if (consumed != Velocity.Zero) invalidateOverscroll()
 
@@ -561,17 +572,21 @@
 
         scrollCycleInProgress = false
         if (leftForOverscroll.x > 0) {
-            edgeEffectWrapper.getOrCreateLeftEffect()
+            edgeEffectWrapper
+                .getOrCreateLeftEffect()
                 .onAbsorbCompat(leftForOverscroll.x.roundToInt())
         } else if (leftForOverscroll.x < 0) {
-            edgeEffectWrapper.getOrCreateRightEffect()
+            edgeEffectWrapper
+                .getOrCreateRightEffect()
                 .onAbsorbCompat(-leftForOverscroll.x.roundToInt())
         }
         if (leftForOverscroll.y > 0) {
-            edgeEffectWrapper.getOrCreateTopEffect()
+            edgeEffectWrapper
+                .getOrCreateTopEffect()
                 .onAbsorbCompat(leftForOverscroll.y.roundToInt())
         } else if (leftForOverscroll.y < 0) {
-            edgeEffectWrapper.getOrCreateBottomEffect()
+            edgeEffectWrapper
+                .getOrCreateBottomEffect()
                 .onAbsorbCompat(-leftForOverscroll.y.roundToInt())
         }
         if (leftForOverscroll != Velocity.Zero) invalidateOverscroll()
@@ -623,9 +638,7 @@
 
     private var pointerId: PointerId? = null
 
-    /**
-     * @return displacement based on the last [pointerPosition] and [containerSize]
-     */
+    /** @return displacement based on the last [pointerPosition] and [containerSize] */
     internal fun displacement(): Offset {
         val pointer = pointerPosition ?: containerSize.center
         val x = pointer.x / containerSize.width
@@ -633,51 +646,52 @@
         return Offset(x, y)
     }
 
-    override val effectModifier: Modifier = Modifier
-        .pointerInput(Unit) {
-            awaitEachGesture {
-                val down = awaitFirstDown(requireUnconsumed = false)
-                pointerId = down.id
-                pointerPosition = down.position
-                do {
-                    val pressedChanges = awaitPointerEvent().changes.fastFilter { it.pressed }
-                    // If the same ID we are already tracking is down, use that. Otherwise, use
-                    // the next down, to move the overscroll to the next pointer.
-                    val change = pressedChanges
-                        .fastFirstOrNull { it.id == pointerId } ?: pressedChanges.firstOrNull()
-                    if (change != null) {
-                        // Update the id if we are now tracking a new down
-                        pointerId = change.id
-                        pointerPosition = change.position
-                    }
-                } while (pressedChanges.isNotEmpty())
-                pointerId = null
-                // Explicitly not resetting the pointer position until the next down, so we
-                // don't change any existing effects
+    override val effectModifier: Modifier =
+        Modifier.pointerInput(Unit) {
+                awaitEachGesture {
+                    val down = awaitFirstDown(requireUnconsumed = false)
+                    pointerId = down.id
+                    pointerPosition = down.position
+                    do {
+                        val pressedChanges = awaitPointerEvent().changes.fastFilter { it.pressed }
+                        // If the same ID we are already tracking is down, use that. Otherwise, use
+                        // the next down, to move the overscroll to the next pointer.
+                        val change =
+                            pressedChanges.fastFirstOrNull { it.id == pointerId }
+                                ?: pressedChanges.firstOrNull()
+                        if (change != null) {
+                            // Update the id if we are now tracking a new down
+                            pointerId = change.id
+                            pointerPosition = change.position
+                        }
+                    } while (pressedChanges.isNotEmpty())
+                    pointerId = null
+                    // Explicitly not resetting the pointer position until the next down, so we
+                    // don't change any existing effects
+                }
             }
-        }
-        .then(
-            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) {
-                DrawStretchOverscrollModifier(
-                    this@AndroidEdgeEffectOverscrollEffect,
-                    edgeEffectWrapper,
-                    debugInspectorInfo {
-                        name = "overscroll"
-                        value = this@AndroidEdgeEffectOverscrollEffect
-                    }
-                )
-            } else {
-                DrawGlowOverscrollModifier(
-                    this@AndroidEdgeEffectOverscrollEffect,
-                    edgeEffectWrapper,
-                    overscrollConfig,
-                    debugInspectorInfo {
-                        name = "overscroll"
-                        value = this@AndroidEdgeEffectOverscrollEffect
-                    }
-                )
-            }
-        )
+            .then(
+                if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) {
+                    DrawStretchOverscrollModifier(
+                        this@AndroidEdgeEffectOverscrollEffect,
+                        edgeEffectWrapper,
+                        debugInspectorInfo {
+                            name = "overscroll"
+                            value = this@AndroidEdgeEffectOverscrollEffect
+                        }
+                    )
+                } else {
+                    DrawGlowOverscrollModifier(
+                        this@AndroidEdgeEffectOverscrollEffect,
+                        edgeEffectWrapper,
+                        overscrollConfig,
+                        debugInspectorInfo {
+                            name = "overscroll"
+                            value = this@AndroidEdgeEffectOverscrollEffect
+                        }
+                    )
+                }
+            )
 
     internal fun invalidateOverscroll() {
         if (invalidationEnabled) {
@@ -734,10 +748,8 @@
         val displacementX = displacement().x
         val pullY = scroll.y / containerSize.height
         val bottomEffect = edgeEffectWrapper.getOrCreateBottomEffect()
-        val consumed = -bottomEffect.onPullDistanceCompat(
-            -pullY,
-            1 - displacementX
-        ) * containerSize.height
+        val consumed =
+            -bottomEffect.onPullDistanceCompat(-pullY, 1 - displacementX) * containerSize.height
         // If overscroll is showing, assume we have consumed all the provided scroll, and return
         // that amount directly to avoid floating point rounding issues (b/265363356)
         return if (bottomEffect.distanceCompat != 0f) {
@@ -751,10 +763,8 @@
         val displacementY = displacement().y
         val pullX = scroll.x / containerSize.width
         val leftEffect = edgeEffectWrapper.getOrCreateLeftEffect()
-        val consumed = leftEffect.onPullDistanceCompat(
-            pullX,
-            1 - displacementY
-        ) * containerSize.width
+        val consumed =
+            leftEffect.onPullDistanceCompat(pullX, 1 - displacementY) * containerSize.width
         // If overscroll is showing, assume we have consumed all the provided scroll, and return
         // that amount directly to avoid floating point rounding issues (b/265363356)
         return if (leftEffect.distanceCompat != 0f) {
@@ -768,10 +778,8 @@
         val displacementY = displacement().y
         val pullX = scroll.x / containerSize.width
         val rightEffect = edgeEffectWrapper.getOrCreateRightEffect()
-        val consumed = -rightEffect.onPullDistanceCompat(
-            -pullX,
-            displacementY
-        ) * containerSize.width
+        val consumed =
+            -rightEffect.onPullDistanceCompat(-pullX, displacementY) * containerSize.width
         // If overscroll is showing, assume we have consumed all the provided scroll, and return
         // that amount directly to avoid floating point rounding issues (b/265363356)
         return if (rightEffect.distanceCompat != 0f) {
@@ -782,9 +790,7 @@
     }
 }
 
-/**
- * Handles lazy creation of [EdgeEffect]s used to render overscroll.
- */
+/** Handles lazy creation of [EdgeEffect]s used to render overscroll. */
 private class EdgeEffectWrapper(
     private val context: Context,
     @ColorInt private val glowColor: Int
@@ -810,12 +816,19 @@
     }
 
     fun isTopStretched(): Boolean = topEffect.isStretched
+
     fun isBottomStretched(): Boolean = bottomEffect.isStretched
+
     fun isLeftStretched(): Boolean = leftEffect.isStretched
+
     fun isRightStretched(): Boolean = rightEffect.isStretched
+
     fun isTopNegationStretched(): Boolean = topEffectNegation.isStretched
+
     fun isBottomNegationStretched(): Boolean = bottomEffectNegation.isStretched
+
     fun isLeftNegationStretched(): Boolean = leftEffectNegation.isStretched
+
     fun isRightNegationStretched(): Boolean = rightEffectNegation.isStretched
 
     private val EdgeEffect?.isStretched: Boolean
@@ -825,8 +838,11 @@
         }
 
     fun isTopAnimating(): Boolean = topEffect.isAnimating
+
     fun isBottomAnimating(): Boolean = bottomEffect.isAnimating
+
     fun isLeftAnimating(): Boolean = leftEffect.isAnimating
+
     fun isRightAnimating(): Boolean = rightEffect.isAnimating
 
     private val EdgeEffect?.isAnimating: Boolean
@@ -835,29 +851,36 @@
             return !isFinished
         }
 
-    fun getOrCreateTopEffect(): EdgeEffect = topEffect
-        ?: createEdgeEffect().also { topEffect = it }
-    fun getOrCreateBottomEffect(): EdgeEffect = bottomEffect
-        ?: createEdgeEffect().also { bottomEffect = it }
-    fun getOrCreateLeftEffect(): EdgeEffect = leftEffect
-        ?: createEdgeEffect().also { leftEffect = it }
-    fun getOrCreateRightEffect(): EdgeEffect = rightEffect
-        ?: createEdgeEffect().also { rightEffect = it }
-    fun getOrCreateTopEffectNegation(): EdgeEffect = topEffectNegation
-        ?: createEdgeEffect().also { topEffectNegation = it }
-    fun getOrCreateBottomEffectNegation(): EdgeEffect = bottomEffectNegation
-        ?: createEdgeEffect().also { bottomEffectNegation = it }
-    fun getOrCreateLeftEffectNegation(): EdgeEffect = leftEffectNegation
-        ?: createEdgeEffect().also { leftEffectNegation = it }
-    fun getOrCreateRightEffectNegation(): EdgeEffect = rightEffectNegation
-        ?: createEdgeEffect().also { rightEffectNegation = it }
+    fun getOrCreateTopEffect(): EdgeEffect = topEffect ?: createEdgeEffect().also { topEffect = it }
 
-    private fun createEdgeEffect() = EdgeEffectCompat.create(context).apply {
-        color = glowColor
-        if (size != IntSize.Zero) {
-            setSize(size.width, size.height)
+    fun getOrCreateBottomEffect(): EdgeEffect =
+        bottomEffect ?: createEdgeEffect().also { bottomEffect = it }
+
+    fun getOrCreateLeftEffect(): EdgeEffect =
+        leftEffect ?: createEdgeEffect().also { leftEffect = it }
+
+    fun getOrCreateRightEffect(): EdgeEffect =
+        rightEffect ?: createEdgeEffect().also { rightEffect = it }
+
+    fun getOrCreateTopEffectNegation(): EdgeEffect =
+        topEffectNegation ?: createEdgeEffect().also { topEffectNegation = it }
+
+    fun getOrCreateBottomEffectNegation(): EdgeEffect =
+        bottomEffectNegation ?: createEdgeEffect().also { bottomEffectNegation = it }
+
+    fun getOrCreateLeftEffectNegation(): EdgeEffect =
+        leftEffectNegation ?: createEdgeEffect().also { leftEffectNegation = it }
+
+    fun getOrCreateRightEffectNegation(): EdgeEffect =
+        rightEffectNegation ?: createEdgeEffect().also { rightEffectNegation = it }
+
+    private fun createEdgeEffect() =
+        EdgeEffectCompat.create(context).apply {
+            color = glowColor
+            if (size != IntSize.Zero) {
+                setSize(size.width, size.height)
+            }
         }
-    }
 
     fun setSize(size: IntSize) {
         this.size = size
diff --git a/compose/foundation/foundation/src/androidMain/kotlin/androidx/compose/foundation/BasicTooltip.android.kt b/compose/foundation/foundation/src/androidMain/kotlin/androidx/compose/foundation/BasicTooltip.android.kt
index 149adfe..cf1b139 100644
--- a/compose/foundation/foundation/src/androidMain/kotlin/androidx/compose/foundation/BasicTooltip.android.kt
+++ b/compose/foundation/foundation/src/androidMain/kotlin/androidx/compose/foundation/BasicTooltip.android.kt
@@ -45,21 +45,21 @@
 /**
  * BasicTooltipBox that wraps a composable with a tooltip.
  *
- * Tooltip that provides a descriptive message for an anchor.
- * It can be used to call the users attention to the anchor.
+ * Tooltip that provides a descriptive message for an anchor. It can be used to call the users
+ * attention to the anchor.
  *
- * @param positionProvider [PopupPositionProvider] that will be used to place the tooltip
- * relative to the anchor content.
+ * @param positionProvider [PopupPositionProvider] that will be used to place the tooltip relative
+ *   to the anchor content.
  * @param tooltip the composable that will be used to populate the tooltip's content.
  * @param state handles the state of the tooltip's visibility.
  * @param modifier the [Modifier] to be applied to this BasicTooltipBox.
- * @param focusable [Boolean] that determines if the tooltip is focusable. When true,
- * the tooltip will consume touch events while it's shown and will have accessibility
- * focus move to the first element of the component. When false, the tooltip
- * won't consume touch events while it's shown but assistive-tech users will need
- * to swipe or drag to get to the first element of the component.
- * @param enableUserInput [Boolean] which determines if this BasicTooltipBox will handle
- * long press and mouse hover to trigger the tooltip through the state provided.
+ * @param focusable [Boolean] that determines if the tooltip is focusable. When true, the tooltip
+ *   will consume touch events while it's shown and will have accessibility focus move to the first
+ *   element of the component. When false, the tooltip won't consume touch events while it's shown
+ *   but assistive-tech users will need to swipe or drag to get to the first element of the
+ *   component.
+ * @param enableUserInput [Boolean] which determines if this BasicTooltipBox will handle long press
+ *   and mouse hover to trigger the tooltip through the state provided.
  * @param content the composable that the tooltip will anchor to.
  */
 @Composable
@@ -93,9 +93,7 @@
         )
     }
 
-    DisposableEffect(state) {
-        onDispose { state.onDispose() }
-    }
+    DisposableEffect(state) { onDispose { state.onDispose() } }
 }
 
 @Composable
@@ -108,10 +106,14 @@
 ) {
     val scope = rememberCoroutineScope()
     val longPressLabel = stringResource(R.string.tooltip_label)
-    Box(modifier = modifier
-            .handleGestures(enableUserInput, state)
-            .anchorSemantics(longPressLabel, enableUserInput, state, scope)
-    ) { content() }
+    Box(
+        modifier =
+            modifier
+                .handleGestures(enableUserInput, state)
+                .anchorSemantics(longPressLabel, enableUserInput, state, scope)
+    ) {
+        content()
+    }
 }
 
 @Composable
@@ -134,19 +136,19 @@
         properties = PopupProperties(focusable = focusable)
     ) {
         Box(
-            modifier = Modifier.semantics {
-                liveRegion = LiveRegionMode.Assertive
-                paneTitle = tooltipDescription
-            }
-        ) { content() }
+            modifier =
+                Modifier.semantics {
+                    liveRegion = LiveRegionMode.Assertive
+                    paneTitle = tooltipDescription
+                }
+        ) {
+            content()
+        }
     }
 }
 
 @OptIn(ExperimentalFoundationApi::class)
-private fun Modifier.handleGestures(
-    enabled: Boolean,
-    state: BasicTooltipState
-): Modifier =
+private fun Modifier.handleGestures(enabled: Boolean, state: BasicTooltipState): Modifier =
     if (enabled) {
         this.pointerInput(state) {
                 coroutineScope {
@@ -170,7 +172,9 @@
 
                                 // consume the children's click handling
                                 val changes = awaitPointerEvent(pass = pass).changes
-                                for (i in 0 until changes.size) { changes[i].consume() }
+                                for (i in 0 until changes.size) {
+                                    changes[i].consume()
+                                }
                             }
                         }
                     }
@@ -189,7 +193,6 @@
                                     PointerEventType.Enter -> {
                                         launch { state.show(MutatePriority.UserInput) }
                                     }
-
                                     PointerEventType.Exit -> {
                                         state.dismiss()
                                     }
@@ -210,12 +213,12 @@
 ): Modifier =
     if (enabled) {
         this.semantics(mergeDescendants = true) {
-                onLongClick(
-                    label = label,
-                    action = {
-                        scope.launch { state.show() }
-                        true
-                    }
-                )
-            }
+            onLongClick(
+                label = label,
+                action = {
+                    scope.launch { state.show() }
+                    true
+                }
+            )
+        }
     } else this
diff --git a/compose/foundation/foundation/src/androidMain/kotlin/androidx/compose/foundation/Clickable.android.kt b/compose/foundation/foundation/src/androidMain/kotlin/androidx/compose/foundation/Clickable.android.kt
index 568a377..ca6606b 100644
--- a/compose/foundation/foundation/src/androidMain/kotlin/androidx/compose/foundation/Clickable.android.kt
+++ b/compose/foundation/foundation/src/androidMain/kotlin/androidx/compose/foundation/Clickable.android.kt
@@ -63,7 +63,10 @@
     get() = type == KeyUp && isEnter
 
 private val KeyEvent.isEnter: Boolean
-    get() = when (key.nativeKeyCode) {
-        KEYCODE_DPAD_CENTER, KEYCODE_ENTER, KEYCODE_NUMPAD_ENTER -> true
-        else -> false
-    }
+    get() =
+        when (key.nativeKeyCode) {
+            KEYCODE_DPAD_CENTER,
+            KEYCODE_ENTER,
+            KEYCODE_NUMPAD_ENTER -> true
+            else -> false
+        }
diff --git a/compose/foundation/foundation/src/androidMain/kotlin/androidx/compose/foundation/DarkTheme.android.kt b/compose/foundation/foundation/src/androidMain/kotlin/androidx/compose/foundation/DarkTheme.android.kt
index c17ebc4..5bbf00e 100644
--- a/compose/foundation/foundation/src/androidMain/kotlin/androidx/compose/foundation/DarkTheme.android.kt
+++ b/compose/foundation/foundation/src/androidMain/kotlin/androidx/compose/foundation/DarkTheme.android.kt
@@ -25,15 +25,15 @@
  * This function should be used to help build responsive UIs that follow the system setting, to
  * avoid harsh contrast changes when switching between applications.
  *
- * This function returns `true` if the [Configuration.UI_MODE_NIGHT_YES] bit is set. It is
- * also possible for this bit to be [Configuration.UI_MODE_NIGHT_UNDEFINED], in which case
- * light theme is treated as the default, and this function returns `false`.
+ * This function returns `true` if the [Configuration.UI_MODE_NIGHT_YES] bit is set. It is also
+ * possible for this bit to be [Configuration.UI_MODE_NIGHT_UNDEFINED], in which case light theme is
+ * treated as the default, and this function returns `false`.
  *
  * It is also recommended to provide user accessible overrides in your application, so users can
  * choose to force an always-light or always-dark theme. To do this, you should provide the current
  * theme value in a CompositionLocal or similar to components further down your hierarchy, only
- * calling this effect once at the top level if no user override has been set. This also helps
- * avoid multiple calls to this effect, which can be expensive as it queries system configuration.
+ * calling this effect once at the top level if no user override has been set. This also helps avoid
+ * multiple calls to this effect, which can be expensive as it queries system configuration.
  *
  * For example, to draw a white rectangle when in dark theme, and a black rectangle when in light
  * theme:
diff --git a/compose/foundation/foundation/src/androidMain/kotlin/androidx/compose/foundation/EdgeEffectCompat.android.kt b/compose/foundation/foundation/src/androidMain/kotlin/androidx/compose/foundation/EdgeEffectCompat.android.kt
index 0644958..7aadd3f 100644
--- a/compose/foundation/foundation/src/androidMain/kotlin/androidx/compose/foundation/EdgeEffectCompat.android.kt
+++ b/compose/foundation/foundation/src/androidMain/kotlin/androidx/compose/foundation/EdgeEffectCompat.android.kt
@@ -36,10 +36,7 @@
         }
     }
 
-    fun EdgeEffect.onPullDistanceCompat(
-        deltaDistance: Float,
-        displacement: Float
-    ): Float {
+    fun EdgeEffect.onPullDistanceCompat(deltaDistance: Float, displacement: Float): Float {
         if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) {
             return Api31Impl.onPullDistance(this, deltaDistance, displacement)
         }
@@ -132,11 +129,7 @@
     }
 
     @DoNotInline
-    fun onPullDistance(
-        edgeEffect: EdgeEffect,
-        deltaDistance: Float,
-        displacement: Float
-    ): Float {
+    fun onPullDistance(edgeEffect: EdgeEffect, deltaDistance: Float, displacement: Float): Float {
         return try {
             edgeEffect.onPullDistance(deltaDistance, displacement)
         } catch (t: Throwable) {
diff --git a/compose/foundation/foundation/src/androidMain/kotlin/androidx/compose/foundation/ExcludeFromSystemGesture.android.kt b/compose/foundation/foundation/src/androidMain/kotlin/androidx/compose/foundation/ExcludeFromSystemGesture.android.kt
index 33d043a..f5e0223 100644
--- a/compose/foundation/foundation/src/androidMain/kotlin/androidx/compose/foundation/ExcludeFromSystemGesture.android.kt
+++ b/compose/foundation/foundation/src/androidMain/kotlin/androidx/compose/foundation/ExcludeFromSystemGesture.android.kt
@@ -32,9 +32,8 @@
 fun Modifier.excludeFromSystemGesture() = systemGestureExclusion()
 
 /**
- * Excludes a rectangle within the local layout coordinates from the system gesture.
- * After layout, [exclusion] is called to determine the [Rect] to exclude from the system
- * gesture area.
+ * Excludes a rectangle within the local layout coordinates from the system gesture. After layout,
+ * [exclusion] is called to determine the [Rect] to exclude from the system gesture area.
  *
  * The [LayoutCoordinates] of the [Modifier]'s location in the layout is passed as passed as
  * [exclusion]'s parameter.
diff --git a/compose/foundation/foundation/src/androidMain/kotlin/androidx/compose/foundation/Magnifier.android.kt b/compose/foundation/foundation/src/androidMain/kotlin/androidx/compose/foundation/Magnifier.android.kt
index 7d2e1e9..6c9ce43 100644
--- a/compose/foundation/foundation/src/androidMain/kotlin/androidx/compose/foundation/Magnifier.android.kt
+++ b/compose/foundation/foundation/src/androidMain/kotlin/androidx/compose/foundation/Magnifier.android.kt
@@ -57,8 +57,7 @@
  * A function on elements that are magnified with a [magnifier] modifier that returns the position
  * of the center of the magnified content in the coordinate space of the root composable.
  */
-internal val MagnifierPositionInRoot =
-    SemanticsPropertyKey<() -> Offset>("MagnifierPositionInRoot")
+internal val MagnifierPositionInRoot = SemanticsPropertyKey<() -> Offset>("MagnifierPositionInRoot")
 
 /**
  * Shows a [Magnifier] widget that shows an enlarged version of the content at [sourceCenter]
@@ -75,16 +74,16 @@
  * @sample androidx.compose.foundation.samples.MagnifierSample
  *
  * @param sourceCenter The offset of the center of the magnified content. Measured in pixels from
- * the top-left of the layout node this modifier is applied to. This offset is passed to
- * [Magnifier.show].
+ *   the top-left of the layout node this modifier is applied to. This offset is passed to
+ *   [Magnifier.show].
  * @param magnifierCenter The offset of the magnifier widget itself, where the magnified content is
- * rendered over the original content. Measured in density-independent pixels from the top-left of
- * the layout node this modifier is applied to. If left null or returns an
- * [unspecified][DpOffset.Unspecified] value, the magnifier widget will be placed at a default
- * offset relative to [sourceCenter]. The value of that offset is specified by the system.
+ *   rendered over the original content. Measured in density-independent pixels from the top-left of
+ *   the layout node this modifier is applied to. If left null or returns an
+ *   [unspecified][DpOffset.Unspecified] value, the magnifier widget will be placed at a default
+ *   offset relative to [sourceCenter]. The value of that offset is specified by the system.
  * @param onSizeChanged An optional callback that will be invoked when the magnifier widget is
- * initialized to report on its actual size. This can be useful when [size] parameter is left
- * unspecified.
+ *   initialized to report on its actual size. This can be useful when [size] parameter is left
+ *   unspecified.
  * @param zoom See [Magnifier.setZoom]. Only supported on API 29+.
  * @param size See [Magnifier.Builder.setSize]. Only supported on API 29+.
  * @param cornerRadius See [Magnifier.Builder.setCornerRadius]. Only supported on API 29+.
@@ -143,8 +142,10 @@
                 cornerRadius = cornerRadius,
                 elevation = elevation,
                 clippingEnabled = clippingEnabled,
-                platformMagnifierFactory = platformMagnifierFactory
-                    ?: PlatformMagnifierFactory.getForCurrentPlatform() // this doesn't do an alloc
+                platformMagnifierFactory =
+                    platformMagnifierFactory
+                        ?: PlatformMagnifierFactory
+                            .getForCurrentPlatform() // this doesn't do an alloc
             )
         )
     } else {
@@ -254,15 +255,14 @@
     var clippingEnabled: Boolean = true,
     var platformMagnifierFactory: PlatformMagnifierFactory =
         PlatformMagnifierFactory.getForCurrentPlatform()
-) : Modifier.Node(),
+) :
+    Modifier.Node(),
     GlobalPositionAwareModifierNode,
     DrawModifierNode,
     SemanticsModifierNode,
     ObserverModifierNode {
 
-    /**
-     * Android [View] that this modifier node is attached to in Compose hierarchy.
-     */
+    /** Android [View] that this modifier node is attached to in Compose hierarchy. */
     private var view: View? = null
 
     /**
@@ -271,9 +271,7 @@
      */
     private var density: Density? = null
 
-    /**
-     * Current magnifier instance.
-     */
+    /** Current magnifier instance. */
     private var magnifier: PlatformMagnifier? = null
 
     /**
@@ -350,20 +348,23 @@
         val view = requireView()
         val density = requireDensity()
 
-        val shouldRecreate = magnifier != null && // only recreate if it was already created
-            // On platforms >=Q, the zoom level can be updated dynamically on an existing magnifier,
-            // so if the zoom changes between recompositions we don't need to recreate the
-            // magnifier. On older platforms, the zoom can only be set initially, so we use the
-            // zoom itself as a key so the magnifier gets recreated if it changes.
-            ((!zoom.equalsIncludingNaN(previousZoom) && !platformMagnifierFactory.canUpdateZoom) ||
-                size != previousSize ||
-                cornerRadius != previousCornerRadius ||
-                elevation != previousElevation ||
-                useTextDefault != previousUseTextDefault ||
-                clippingEnabled != previousClippingEnabled ||
-                platformMagnifierFactory != previousPlatformMagnifierFactory ||
-                view != previousView ||
-                density != previousDensity)
+        val shouldRecreate =
+            magnifier != null && // only recreate if it was already created
+                // On platforms >=Q, the zoom level can be updated dynamically on an existing
+                // magnifier,
+                // so if the zoom changes between recompositions we don't need to recreate the
+                // magnifier. On older platforms, the zoom can only be set initially, so we use the
+                // zoom itself as a key so the magnifier gets recreated if it changes.
+                ((!zoom.equalsIncludingNaN(previousZoom) &&
+                    !platformMagnifierFactory.canUpdateZoom) ||
+                    size != previousSize ||
+                    cornerRadius != previousCornerRadius ||
+                    elevation != previousElevation ||
+                    useTextDefault != previousUseTextDefault ||
+                    clippingEnabled != previousClippingEnabled ||
+                    platformMagnifierFactory != previousPlatformMagnifierFactory ||
+                    view != previousView ||
+                    density != previousDensity)
 
         if (shouldRecreate) {
             recreateMagnifier()
@@ -381,7 +382,7 @@
                 // don't update the magnifier immediately, actual frame draw happens right after
                 // all draw commands are recorded. Magnifier update should happen in the next frame.
                 if (magnifier != null) {
-                    withFrameMillis { }
+                    withFrameMillis {}
                     magnifier?.updateContent()
                 }
             }
@@ -394,25 +395,24 @@
     }
 
     override fun onObservedReadsChanged() {
-        observeReads {
-            updateMagnifier()
-        }
+        observeReads { updateMagnifier() }
     }
 
     private fun recreateMagnifier() {
         magnifier?.dismiss()
         val view = (view ?: requireView()).also { view = it }
         val density = (density ?: requireDensity()).also { density = it }
-        magnifier = platformMagnifierFactory.create(
-            view = view,
-            useTextDefault = useTextDefault,
-            size = size,
-            cornerRadius = cornerRadius,
-            elevation = elevation,
-            clippingEnabled = clippingEnabled,
-            density = density,
-            initialZoom = zoom
-        )
+        magnifier =
+            platformMagnifierFactory.create(
+                view = view,
+                useTextDefault = useTextDefault,
+                size = size,
+                cornerRadius = cornerRadius,
+                elevation = elevation,
+                clippingEnabled = clippingEnabled,
+                density = density,
+                initialZoom = zoom
+            )
         updateSizeIfNecessary()
     }
 
@@ -427,10 +427,11 @@
             sourceCenterInRoot = anchorPositionInRoot + sourceCenterOffset
             // Calculate magnifier center if it's provided. Only accept if the returned
             // value is specified. Then add [anchorPositionInRoot] for relative positioning.
-            val magnifierCenter = magnifierCenter?.invoke(density)
-                ?.takeIf { it.isSpecified }
-                ?.let { anchorPositionInRoot + it }
-                ?: Offset.Unspecified
+            val magnifierCenter =
+                magnifierCenter
+                    ?.invoke(density)
+                    ?.takeIf { it.isSpecified }
+                    ?.let { anchorPositionInRoot + it } ?: Offset.Unspecified
 
             if (magnifier == null) {
                 recreateMagnifier()
@@ -483,9 +484,9 @@
     sdkVersion >= 28
 
 /**
- * Normally `Float.NaN == Float.NaN` returns false but we use [Float.NaN] to mean Unspecified.
- * The comparison between two unspecified values should return _equal_ if we are only interested
- * in state changes.
+ * Normally `Float.NaN == Float.NaN` returns false but we use [Float.NaN] to mean Unspecified. The
+ * comparison between two unspecified values should return _equal_ if we are only interested in
+ * state changes.
  */
 internal fun Float.equalsIncludingNaN(other: Float): Boolean {
     if (this.isNaN() && other.isNaN()) return true
diff --git a/compose/foundation/foundation/src/androidMain/kotlin/androidx/compose/foundation/OverscrollConfiguration.android.kt b/compose/foundation/foundation/src/androidMain/kotlin/androidx/compose/foundation/OverscrollConfiguration.android.kt
index ea3357d..6d47157 100644
--- a/compose/foundation/foundation/src/androidMain/kotlin/androidx/compose/foundation/OverscrollConfiguration.android.kt
+++ b/compose/foundation/foundation/src/androidMain/kotlin/androidx/compose/foundation/OverscrollConfiguration.android.kt
@@ -28,9 +28,9 @@
  * only apply before Android S and so might be misleading to have in a generic configuration object.
  *
  * @param glowColor color for the glow effect, if the platform effect is a glow effect, otherwise
- * ignored.
- * @param drawPadding the amount of padding to apply from scrollable container bounds to
- * the effect before drawing it, if the platform effect is a glow effect, otherwise ignored.
+ *   ignored.
+ * @param drawPadding the amount of padding to apply from scrollable container bounds to the effect
+ *   before drawing it, if the platform effect is a glow effect, otherwise ignored.
  */
 @ExperimentalFoundationApi
 @Stable
@@ -62,14 +62,13 @@
 }
 
 /**
- * Composition local to provide configuration for scrolling containers down the
- * hierarchy. `null` means there will be no overscroll at all.
+ * Composition local to provide configuration for scrolling containers down the hierarchy. `null`
+ * means there will be no overscroll at all.
  *
  * Note: this is experimental since the underlying [OverscrollConfiguration] is also experimental.
  */
 @Suppress("OPT_IN_MARKER_ON_WRONG_TARGET")
 @ExperimentalFoundationApi
 @get:ExperimentalFoundationApi
-val LocalOverscrollConfiguration = compositionLocalOf<OverscrollConfiguration?> {
-    OverscrollConfiguration()
-}
+val LocalOverscrollConfiguration =
+    compositionLocalOf<OverscrollConfiguration?> { OverscrollConfiguration() }
diff --git a/compose/foundation/foundation/src/androidMain/kotlin/androidx/compose/foundation/PlatformMagnifier.android.kt b/compose/foundation/foundation/src/androidMain/kotlin/androidx/compose/foundation/PlatformMagnifier.android.kt
index 86ce694..2f31598 100644
--- a/compose/foundation/foundation/src/androidMain/kotlin/androidx/compose/foundation/PlatformMagnifier.android.kt
+++ b/compose/foundation/foundation/src/androidMain/kotlin/androidx/compose/foundation/PlatformMagnifier.android.kt
@@ -34,8 +34,8 @@
 
     /**
      * If true, passing a different zoom level to [PlatformMagnifier.update] on the
-     * [PlatformMagnifier] returned from [create] will actually update the magnifier.
-     * If false, a new [PlatformMagnifier] must be created to use a different zoom level.
+     * [PlatformMagnifier] returned from [create] will actually update the magnifier. If false, a
+     * new [PlatformMagnifier] must be created to use a different zoom level.
      */
     val canUpdateZoom: Boolean
 
@@ -65,9 +65,7 @@
     }
 }
 
-/**
- * Abstraction around the framework [Magnifier] class, for testing.
- */
+/** Abstraction around the framework [Magnifier] class, for testing. */
 internal interface PlatformMagnifier {
 
     /** Returns the actual size of the magnifier widget, even if not specified at creation. */
@@ -80,11 +78,7 @@
      * Sets the properties on a [Magnifier] instance that can be updated without recreating the
      * magnifier (e.g. [Magnifier.setZoom]) and [shows][Magnifier.show] it.
      */
-    fun update(
-        sourceCenter: Offset,
-        magnifierCenter: Offset,
-        zoom: Float
-    )
+    fun update(sourceCenter: Offset, magnifierCenter: Offset, zoom: Float)
 
     /** Wraps [Magnifier.dismiss]. */
     fun dismiss()
@@ -116,11 +110,7 @@
             magnifier.update()
         }
 
-        override fun update(
-            sourceCenter: Offset,
-            magnifierCenter: Offset,
-            zoom: Float
-        ) {
+        override fun update(sourceCenter: Offset, magnifierCenter: Offset, zoom: Float) {
             magnifier.show(sourceCenter.x, sourceCenter.y)
         }
 
@@ -149,8 +139,7 @@
             if (useTextDefault) {
                 // This deprecated constructor is the only public API to create a Magnifier that
                 // uses the system text magnifier defaults.
-                @Suppress("DEPRECATION")
-                return PlatformMagnifierImpl(Magnifier(view))
+                @Suppress("DEPRECATION") return PlatformMagnifierImpl(Magnifier(view))
             }
 
             val pixelSize = size.toSize()
@@ -159,22 +148,23 @@
 
             // When Builder properties are not specified, the widget uses different defaults than it
             // does for the non-builder constructor above.
-            val magnifier = Magnifier.Builder(view).run {
-                if (pixelSize.isSpecified) {
-                    setSize(pixelSize.width.roundToInt(), pixelSize.height.roundToInt())
+            val magnifier =
+                Magnifier.Builder(view).run {
+                    if (pixelSize.isSpecified) {
+                        setSize(pixelSize.width.roundToInt(), pixelSize.height.roundToInt())
+                    }
+                    if (!pixelCornerRadius.isNaN()) {
+                        setCornerRadius(pixelCornerRadius)
+                    }
+                    if (!pixelElevation.isNaN()) {
+                        setElevation(pixelElevation)
+                    }
+                    if (!initialZoom.isNaN()) {
+                        setInitialZoom(initialZoom)
+                    }
+                    setClippingEnabled(clippingEnabled)
+                    build()
                 }
-                if (!pixelCornerRadius.isNaN()) {
-                    setCornerRadius(pixelCornerRadius)
-                }
-                if (!pixelElevation.isNaN()) {
-                    setElevation(pixelElevation)
-                }
-                if (!initialZoom.isNaN()) {
-                    setInitialZoom(initialZoom)
-                }
-                setClippingEnabled(clippingEnabled)
-                build()
-            }
 
             return PlatformMagnifierImpl(magnifier)
         }
@@ -188,10 +178,7 @@
             if (!zoom.isNaN()) magnifier.zoom = zoom
 
             if (magnifierCenter.isSpecified) {
-                magnifier.show(
-                    sourceCenter.x, sourceCenter.y,
-                    magnifierCenter.x, magnifierCenter.y
-                )
+                magnifier.show(sourceCenter.x, sourceCenter.y, magnifierCenter.x, magnifierCenter.y)
             } else {
                 // This overload places the magnifier at a default offset relative to the source.
                 magnifier.show(sourceCenter.x, sourceCenter.y)
diff --git a/compose/foundation/foundation/src/androidMain/kotlin/androidx/compose/foundation/PreferKeepClear.android.kt b/compose/foundation/foundation/src/androidMain/kotlin/androidx/compose/foundation/PreferKeepClear.android.kt
index e6bd917..c79ead8 100644
--- a/compose/foundation/foundation/src/androidMain/kotlin/androidx/compose/foundation/PreferKeepClear.android.kt
+++ b/compose/foundation/foundation/src/androidMain/kotlin/androidx/compose/foundation/PreferKeepClear.android.kt
@@ -43,11 +43,10 @@
 
 /**
  * Mark a rectangle within the local layout coordinates preferring to stay clear of floating
- * windows.
- * After layout, [rectProvider] is called to determine the [Rect] to mark as keep clear.
+ * windows. After layout, [rectProvider] is called to determine the [Rect] to mark as keep clear.
  *
- * The [LayoutCoordinates] of the [Modifier]'s location in the layout is passed as
- * [rectProvider]'s parameter.
+ * The [LayoutCoordinates] of the [Modifier]'s location in the layout is passed as [rectProvider]'s
+ * parameter.
  *
  * This Modifier only has an effect on SDK 33 and above.
  *
@@ -62,14 +61,12 @@
 
 @Suppress("NOTHING_TO_INLINE", "ComposableModifierFactory", "ModifierFactoryExtensionFunction")
 @RequiresApi(Build.VERSION_CODES.TIRAMISU)
-private inline fun preferKeepClearT(
-    noinline rect: ((LayoutCoordinates) -> Rect)?
-): Modifier = PreferKeepClearElement(rect)
+private inline fun preferKeepClearT(noinline rect: ((LayoutCoordinates) -> Rect)?): Modifier =
+    PreferKeepClearElement(rect)
 
 @RequiresApi(Build.VERSION_CODES.TIRAMISU)
-private class PreferKeepClearElement(
-    val clearRect: ((LayoutCoordinates) -> Rect)?
-) : ModifierNodeElement<PreferKeepClearNode>() {
+private class PreferKeepClearElement(val clearRect: ((LayoutCoordinates) -> Rect)?) :
+    ModifierNodeElement<PreferKeepClearNode>() {
     override fun create(): PreferKeepClearNode {
         return PreferKeepClearNode(clearRect)
     }
@@ -96,9 +93,7 @@
 }
 
 @RequiresApi(Build.VERSION_CODES.TIRAMISU)
-private class PreferKeepClearNode(
-    rect: ((LayoutCoordinates) -> Rect)?
-) : RectListNode(rect) {
+private class PreferKeepClearNode(rect: ((LayoutCoordinates) -> Rect)?) : RectListNode(rect) {
     override fun currentRects(): MutableVector<android.graphics.Rect> {
         val rects = mutableVectorOf<android.graphics.Rect>()
         rects.addAll(view.preferKeepClearRects)
diff --git a/compose/foundation/foundation/src/androidMain/kotlin/androidx/compose/foundation/RectListNode.android.kt b/compose/foundation/foundation/src/androidMain/kotlin/androidx/compose/foundation/RectListNode.android.kt
index 8c8e16f..ba16c44 100644
--- a/compose/foundation/foundation/src/androidMain/kotlin/androidx/compose/foundation/RectListNode.android.kt
+++ b/compose/foundation/foundation/src/androidMain/kotlin/androidx/compose/foundation/RectListNode.android.kt
@@ -27,26 +27,26 @@
 import androidx.compose.ui.node.requireView
 import kotlin.math.roundToInt
 
-internal abstract class RectListNode(
-    open var rect: ((LayoutCoordinates) -> Rect)?
-) : Modifier.Node(), GlobalPositionAwareModifierNode {
+internal abstract class RectListNode(open var rect: ((LayoutCoordinates) -> Rect)?) :
+    Modifier.Node(), GlobalPositionAwareModifierNode {
     private var androidRect: android.graphics.Rect? = null
 
     protected val view: View
         get() = requireView()
 
     override fun onGloballyPositioned(coordinates: LayoutCoordinates) {
-        val newRect = if (rect == null) {
-            val boundsInRoot = coordinates.boundsInRoot()
-            android.graphics.Rect(
-                boundsInRoot.left.roundToInt(),
-                boundsInRoot.top.roundToInt(),
-                boundsInRoot.right.roundToInt(),
-                boundsInRoot.bottom.roundToInt()
-            )
-        } else {
-            calcBounds(coordinates, rect!!.invoke(coordinates))
-        }
+        val newRect =
+            if (rect == null) {
+                val boundsInRoot = coordinates.boundsInRoot()
+                android.graphics.Rect(
+                    boundsInRoot.left.roundToInt(),
+                    boundsInRoot.top.roundToInt(),
+                    boundsInRoot.right.roundToInt(),
+                    boundsInRoot.bottom.roundToInt()
+                )
+            } else {
+                calcBounds(coordinates, rect!!.invoke(coordinates))
+            }
         replaceRect(newRect)
     }
 
@@ -56,6 +56,7 @@
     }
 
     abstract fun currentRects(): MutableVector<android.graphics.Rect>
+
     abstract fun updateRects(rects: MutableVector<android.graphics.Rect>)
 
     private fun replaceRect(newRect: android.graphics.Rect?) {
diff --git a/compose/foundation/foundation/src/androidMain/kotlin/androidx/compose/foundation/SystemGestureExclusion.android.kt b/compose/foundation/foundation/src/androidMain/kotlin/androidx/compose/foundation/SystemGestureExclusion.android.kt
index 77699fa..bafc2ee 100644
--- a/compose/foundation/foundation/src/androidMain/kotlin/androidx/compose/foundation/SystemGestureExclusion.android.kt
+++ b/compose/foundation/foundation/src/androidMain/kotlin/androidx/compose/foundation/SystemGestureExclusion.android.kt
@@ -43,9 +43,8 @@
     }
 
 /**
- * Excludes a rectangle within the local layout coordinates from the system gesture.
- * After layout, [exclusion] is called to determine the [Rect] to exclude from the system
- * gesture area.
+ * Excludes a rectangle within the local layout coordinates from the system gesture. After layout,
+ * [exclusion] is called to determine the [Rect] to exclude from the system gesture area.
  *
  * The [LayoutCoordinates] of the [Modifier]'s location in the layout is passed as passed as
  * [exclusion]'s parameter.
@@ -66,9 +65,8 @@
 ): Modifier = ExcludeFromSystemGestureElement(exclusion)
 
 @RequiresApi(Build.VERSION_CODES.Q)
-private class ExcludeFromSystemGestureElement(
-    val exclusion: ((LayoutCoordinates) -> Rect)?
-) : ModifierNodeElement<ExcludeFromSystemGestureNode>() {
+private class ExcludeFromSystemGestureElement(val exclusion: ((LayoutCoordinates) -> Rect)?) :
+    ModifierNodeElement<ExcludeFromSystemGestureNode>() {
     @SuppressLint("NewApi")
     override fun create(): ExcludeFromSystemGestureNode {
         return ExcludeFromSystemGestureNode(exclusion)
@@ -96,14 +94,14 @@
 }
 
 @RequiresApi(Build.VERSION_CODES.Q)
-private class ExcludeFromSystemGestureNode(
-    rect: ((LayoutCoordinates) -> Rect)?
-) : RectListNode(rect) {
+private class ExcludeFromSystemGestureNode(rect: ((LayoutCoordinates) -> Rect)?) :
+    RectListNode(rect) {
     override fun currentRects(): MutableVector<android.graphics.Rect> {
         val rects = mutableVectorOf<android.graphics.Rect>()
         rects.addAll(view.systemGestureExclusionRects)
         return rects
     }
+
     override fun updateRects(rects: MutableVector<android.graphics.Rect>) {
         view.systemGestureExclusionRects = rects.asMutableList()
     }
diff --git a/compose/foundation/foundation/src/androidMain/kotlin/androidx/compose/foundation/content/TransferableContent.android.kt b/compose/foundation/foundation/src/androidMain/kotlin/androidx/compose/foundation/content/TransferableContent.android.kt
index 8ac71ce..f695a31 100644
--- a/compose/foundation/foundation/src/androidMain/kotlin/androidx/compose/foundation/content/TransferableContent.android.kt
+++ b/compose/foundation/foundation/src/androidMain/kotlin/androidx/compose/foundation/content/TransferableContent.android.kt
@@ -32,10 +32,8 @@
  * @property extras Extras bundle that's passed by InputConnection#commitContent.
  */
 @ExperimentalFoundationApi
-actual class PlatformTransferableContent internal constructor(
-    val linkUri: Uri?,
-    val extras: Bundle
-) {
+actual class PlatformTransferableContent
+internal constructor(val linkUri: Uri?, val extras: Bundle) {
     override fun equals(other: Any?): Boolean {
         if (this === other) return true
         if (other !is PlatformTransferableContent) return false
@@ -53,9 +51,7 @@
     }
 
     override fun toString(): String {
-        return "PlatformTransferableContent(" +
-            "linkUri=$linkUri, " +
-            "extras=$extras)"
+        return "PlatformTransferableContent(" + "linkUri=$linkUri, " + "extras=$extras)"
     }
 }
 
@@ -67,8 +63,8 @@
  * @sample androidx.compose.foundation.samples.ReceiveContentBasicSample
  *
  * @param predicate Decides whether to consume or leave the given item out. Return true to indicate
- * that this particular item was processed here, it shouldn't be passed further down the content
- * receiver chain. Return false to keep it in the returned [TransferableContent].
+ *   that this particular item was processed here, it shouldn't be passed further down the content
+ *   receiver chain. Return false to keep it in the returned [TransferableContent].
  * @return Remaining parts of this [TransferableContent].
  */
 @ExperimentalFoundationApi
diff --git a/compose/foundation/foundation/src/androidMain/kotlin/androidx/compose/foundation/content/internal/DragAndDropRequestPermission.android.kt b/compose/foundation/foundation/src/androidMain/kotlin/androidx/compose/foundation/content/internal/DragAndDropRequestPermission.android.kt
index caa9eb2..f766763 100644
--- a/compose/foundation/foundation/src/androidMain/kotlin/androidx/compose/foundation/content/internal/DragAndDropRequestPermission.android.kt
+++ b/compose/foundation/foundation/src/androidMain/kotlin/androidx/compose/foundation/content/internal/DragAndDropRequestPermission.android.kt
@@ -28,9 +28,7 @@
 import androidx.compose.ui.node.requireView
 import androidx.core.view.DragAndDropPermissionsCompat
 
-internal actual fun DelegatableNode.dragAndDropRequestPermission(
-    event: DragAndDropEvent
-) {
+internal actual fun DelegatableNode.dragAndDropRequestPermission(event: DragAndDropEvent) {
     if (Build.VERSION.SDK_INT < 24) return
     // If there is no contentUri, there's no need to request permissions
     if (!event.toAndroidDragEvent().clipData.containsContentUri()) return
@@ -50,9 +48,9 @@
 }
 
 /**
- * Attempts to find the activity for the given view by unwrapping the view's context. This is
- * a "best effort" approach that's not guaranteed to get the activity, since a view's context
- * is not necessarily an activity.
+ * Attempts to find the activity for the given view by unwrapping the view's context. This is a
+ * "best effort" approach that's not guaranteed to get the activity, since a view's context is not
+ * necessarily an activity.
  *
  * @param view The target view.
  * @return The activity if found; null otherwise.
diff --git a/compose/foundation/foundation/src/androidMain/kotlin/androidx/compose/foundation/content/internal/ReceiveContentDragAndDropNode.android.kt b/compose/foundation/foundation/src/androidMain/kotlin/androidx/compose/foundation/content/internal/ReceiveContentDragAndDropNode.android.kt
index 0e63977b2..d3f1862 100644
--- a/compose/foundation/foundation/src/androidMain/kotlin/androidx/compose/foundation/content/internal/ReceiveContentDragAndDropNode.android.kt
+++ b/compose/foundation/foundation/src/androidMain/kotlin/androidx/compose/foundation/content/internal/ReceiveContentDragAndDropNode.android.kt
@@ -35,33 +35,34 @@
             // accept any dragging item. The actual decider will be the onReceive callback.
             true
         },
-        target = object : DragAndDropTarget {
-            override fun onStarted(event: DragAndDropEvent) {
-                receiveContentConfiguration.receiveContentListener.onDragStart()
-            }
+        target =
+            object : DragAndDropTarget {
+                override fun onStarted(event: DragAndDropEvent) {
+                    receiveContentConfiguration.receiveContentListener.onDragStart()
+                }
 
-            override fun onEnded(event: DragAndDropEvent) {
-                receiveContentConfiguration.receiveContentListener.onDragEnd()
-            }
+                override fun onEnded(event: DragAndDropEvent) {
+                    receiveContentConfiguration.receiveContentListener.onDragEnd()
+                }
 
-            override fun onEntered(event: DragAndDropEvent) {
-                receiveContentConfiguration.receiveContentListener.onDragEnter()
-            }
+                override fun onEntered(event: DragAndDropEvent) {
+                    receiveContentConfiguration.receiveContentListener.onDragEnter()
+                }
 
-            override fun onExited(event: DragAndDropEvent) {
-                receiveContentConfiguration.receiveContentListener.onDragExit()
-            }
+                override fun onExited(event: DragAndDropEvent) {
+                    receiveContentConfiguration.receiveContentListener.onDragExit()
+                }
 
-            override fun onDrop(event: DragAndDropEvent): Boolean {
-                dragAndDropRequestPermission(event)
+                override fun onDrop(event: DragAndDropEvent): Boolean {
+                    dragAndDropRequestPermission(event)
 
-                val original = event.toTransferableContent()
-                val remaining = receiveContentConfiguration
-                    .receiveContentListener
-                    .onReceive(original)
-                return original != remaining
+                    val original = event.toTransferableContent()
+                    val remaining =
+                        receiveContentConfiguration.receiveContentListener.onReceive(original)
+                    return original != remaining
+                }
             }
-        })
+    )
 }
 
 @OptIn(ExperimentalFoundationApi::class)
diff --git a/compose/foundation/foundation/src/androidMain/kotlin/androidx/compose/foundation/contextmenu/ContextMenuArea.android.kt b/compose/foundation/foundation/src/androidMain/kotlin/androidx/compose/foundation/contextmenu/ContextMenuArea.android.kt
index c2bba72..6ecb133 100644
--- a/compose/foundation/foundation/src/androidMain/kotlin/androidx/compose/foundation/contextmenu/ContextMenuArea.android.kt
+++ b/compose/foundation/foundation/src/androidMain/kotlin/androidx/compose/foundation/contextmenu/ContextMenuArea.android.kt
@@ -65,9 +65,8 @@
     val status = state.status
     if (status !is Status.Open) return
 
-    val popupPositionProvider = remember(status) {
-        ContextMenuPopupPositionProvider(status.offset.round())
-    }
+    val popupPositionProvider =
+        remember(status) { ContextMenuPopupPositionProvider(status.offset.round()) }
 
     ContextMenuPopup(
         modifier = modifier,
diff --git a/compose/foundation/foundation/src/androidMain/kotlin/androidx/compose/foundation/contextmenu/ContextMenuGestures.android.kt b/compose/foundation/foundation/src/androidMain/kotlin/androidx/compose/foundation/contextmenu/ContextMenuGestures.android.kt
index b2f8ac73..9cabede 100644
--- a/compose/foundation/foundation/src/androidMain/kotlin/androidx/compose/foundation/contextmenu/ContextMenuGestures.android.kt
+++ b/compose/foundation/foundation/src/androidMain/kotlin/androidx/compose/foundation/contextmenu/ContextMenuGestures.android.kt
@@ -34,17 +34,13 @@
 private object ContextMenuKey
 
 /**
- * Track right click events and update the [state] to [ContextMenuState.Status.Open]
- * with the click offset.
+ * Track right click events and update the [state] to [ContextMenuState.Status.Open] with the click
+ * offset.
  *
  * @param state the state that will have its status set to open on a right click
  */
 internal fun Modifier.contextMenuGestures(state: ContextMenuState): Modifier =
-    pointerInput(ContextMenuKey) {
-        onRightClickDown {
-            state.status = Status.Open(offset = it)
-        }
-    }
+    pointerInput(ContextMenuKey) { onRightClickDown { state.status = Status.Open(offset = it) } }
 
 /** Similar to PointerInputScope.detectTapAndPress, but for right clicks. */
 @VisibleForTesting
@@ -58,8 +54,8 @@
 }
 
 /**
- * Similar to AwaitPointerEventScope.awaitFirstDown,
- * but with an additional check to ensure it is a right click.
+ * Similar to AwaitPointerEventScope.awaitFirstDown, but with an additional check to ensure it is a
+ * right click.
  */
 private suspend fun AwaitPointerEventScope.awaitFirstRightClickDown(): PointerInputChange {
     while (true) {
diff --git a/compose/foundation/foundation/src/androidMain/kotlin/androidx/compose/foundation/contextmenu/ContextMenuPopupPositionProvider.android.kt b/compose/foundation/foundation/src/androidMain/kotlin/androidx/compose/foundation/contextmenu/ContextMenuPopupPositionProvider.android.kt
index 82dbe14..68b6f87 100644
--- a/compose/foundation/foundation/src/androidMain/kotlin/androidx/compose/foundation/contextmenu/ContextMenuPopupPositionProvider.android.kt
+++ b/compose/foundation/foundation/src/androidMain/kotlin/androidx/compose/foundation/contextmenu/ContextMenuPopupPositionProvider.android.kt
@@ -24,23 +24,21 @@
 import androidx.compose.ui.window.PopupPositionProvider
 
 /**
- * A [PopupPositionProvider] which places the context menu fully within the window,
- * aligning a corner of the popup menu with the cursor. For each x/y dimension it will:
- *
- * * In cases where the popup length is too small for the window length, it aligns the
- * start edges of the popup and the window.
- * * In cases where there is enough length between the click position and the end of
- * the window for entire popup length, it will align the start edge of the popup with the
- * [localPosition].
- * * In cases where there is not enough length between the click position and the end of
- * the window for entire popup length, but there is between the click position and the
- * start of the window, it will align the end edge of the popup with the [localPosition].
+ * A [PopupPositionProvider] which places the context menu fully within the window, aligning a
+ * corner of the popup menu with the cursor. For each x/y dimension it will:
+ * * In cases where the popup length is too small for the window length, it aligns the start edges
+ *   of the popup and the window.
+ * * In cases where there is enough length between the click position and the end of the window for
+ *   entire popup length, it will align the start edge of the popup with the [localPosition].
+ * * In cases where there is not enough length between the click position and the end of the window
+ *   for entire popup length, but there is between the click position and the start of the window,
+ *   it will align the end edge of the popup with the [localPosition].
  * * In the final case: the window length is wide enough for the popup, but there isn't enough
- * length on either side of click position to fit an edge of the popup with the click position.
- * It will align the end edges of the popup and window.
+ *   length on either side of click position to fit an edge of the popup with the click position. It
+ *   will align the end edges of the popup and window.
  *
- * @param localPosition The [IntOffset] to align to. This should be in the same coordinates that
- * the `Popup` is anchored to.
+ * @param localPosition The [IntOffset] to align to. This should be in the same coordinates that the
+ *   `Popup` is anchored to.
  */
 internal class ContextMenuPopupPositionProvider(
     private val localPosition: IntOffset,
@@ -55,19 +53,22 @@
         windowSize: IntSize,
         layoutDirection: LayoutDirection,
         popupContentSize: IntSize
-    ): IntOffset = IntOffset(
-        x = alignPopupAxis(
-            position = anchorBounds.left + localPosition.x,
-            popupLength = popupContentSize.width,
-            windowLength = windowSize.width,
-            closeAffinity = layoutDirection == LayoutDirection.Ltr
-        ),
-        y = alignPopupAxis(
-            position = anchorBounds.top + localPosition.y,
-            popupLength = popupContentSize.height,
-            windowLength = windowSize.height,
+    ): IntOffset =
+        IntOffset(
+            x =
+                alignPopupAxis(
+                    position = anchorBounds.left + localPosition.x,
+                    popupLength = popupContentSize.width,
+                    windowLength = windowSize.width,
+                    closeAffinity = layoutDirection == LayoutDirection.Ltr
+                ),
+            y =
+                alignPopupAxis(
+                    position = anchorBounds.top + localPosition.y,
+                    popupLength = popupContentSize.height,
+                    windowLength = windowSize.height,
+                )
         )
-    )
 }
 
 /**
@@ -76,8 +77,8 @@
  * @param position The position to align to along the window's axis
  * @param popupLength The length of the popup along this axis
  * @param windowLength The length of the window along this axis
- * @param closeAffinity Whether the start side is the close edge (`0`)
- * or the far edge ([windowLength])
+ * @param closeAffinity Whether the start side is the close edge (`0`) or the far edge
+ *   ([windowLength])
  * @return the coordinate along this axis that best aligns the popup to the position
  */
 @VisibleForTesting
@@ -86,28 +87,27 @@
     popupLength: Int,
     windowLength: Int,
     closeAffinity: Boolean = true,
-): Int = when {
-    popupLength >= windowLength -> alignStartEdges(popupLength, windowLength, closeAffinity)
-
-    popupFitsBetweenPositionAndEndEdge(position, popupLength, windowLength, closeAffinity) ->
-        alignPopupStartEdgeToPosition(position, popupLength, closeAffinity)
-
-    popupFitsBetweenPositionAndStartEdge(position, popupLength, windowLength, closeAffinity) ->
-        alignPopupEndEdgeToPosition(position, popupLength, closeAffinity)
-
-    else -> alignEndEdges(popupLength, windowLength, closeAffinity)
-}
+): Int =
+    when {
+        popupLength >= windowLength -> alignStartEdges(popupLength, windowLength, closeAffinity)
+        popupFitsBetweenPositionAndEndEdge(position, popupLength, windowLength, closeAffinity) ->
+            alignPopupStartEdgeToPosition(position, popupLength, closeAffinity)
+        popupFitsBetweenPositionAndStartEdge(position, popupLength, windowLength, closeAffinity) ->
+            alignPopupEndEdgeToPosition(position, popupLength, closeAffinity)
+        else -> alignEndEdges(popupLength, windowLength, closeAffinity)
+    }
 
 private fun popupFitsBetweenPositionAndStartEdge(
     position: Int,
     popupLength: Int,
     windowLength: Int,
     closeAffinity: Boolean,
-): Boolean = if (closeAffinity) {
-    popupLength <= position
-} else {
-    windowLength - popupLength > position
-}
+): Boolean =
+    if (closeAffinity) {
+        popupLength <= position
+    } else {
+        windowLength - popupLength > position
+    }
 
 private fun popupFitsBetweenPositionAndEndEdge(
     position: Int,
diff --git a/compose/foundation/foundation/src/androidMain/kotlin/androidx/compose/foundation/contextmenu/ContextMenuState.android.kt b/compose/foundation/foundation/src/androidMain/kotlin/androidx/compose/foundation/contextmenu/ContextMenuState.android.kt
index 42ad84b..931c700 100644
--- a/compose/foundation/foundation/src/androidMain/kotlin/androidx/compose/foundation/contextmenu/ContextMenuState.android.kt
+++ b/compose/foundation/foundation/src/androidMain/kotlin/androidx/compose/foundation/contextmenu/ContextMenuState.android.kt
@@ -27,14 +27,14 @@
     "ContextMenuState.Status should never be open with an unspecified offset. " +
         "Use ContextMenuState.Status.Closed instead."
 
-/**
- * Holds state related to the context menu.
- */
+/** Holds state related to the context menu. */
 internal class ContextMenuState internal constructor(initialStatus: Status = Status.Closed) {
     var status by mutableStateOf(initialStatus)
 
     override fun toString(): String = "ContextMenuState(status=$status)"
+
     override fun hashCode(): Int = status.hashCode()
+
     override fun equals(other: Any?): Boolean {
         if (other === this) return true
         if (other !is ContextMenuState) return false
@@ -53,7 +53,9 @@
             }
 
             override fun toString(): String = "Open(offset=$offset)"
+
             override fun hashCode(): Int = offset.hashCode()
+
             override fun equals(other: Any?): Boolean {
                 if (other === this) return true
                 if (other !is Open) return false
@@ -68,9 +70,7 @@
     }
 }
 
-/**
- * Convenience method to set the state's status to [Status.Closed].
- */
+/** Convenience method to set the state's status to [Status.Closed]. */
 internal fun ContextMenuState.close() {
     status = Status.Closed
 }
diff --git a/compose/foundation/foundation/src/androidMain/kotlin/androidx/compose/foundation/contextmenu/ContextMenuUi.android.kt b/compose/foundation/foundation/src/androidMain/kotlin/androidx/compose/foundation/contextmenu/ContextMenuUi.android.kt
index 56a5472..595b7b0 100644
--- a/compose/foundation/foundation/src/androidMain/kotlin/androidx/compose/foundation/contextmenu/ContextMenuUi.android.kt
+++ b/compose/foundation/foundation/src/androidMain/kotlin/androidx/compose/foundation/contextmenu/ContextMenuUi.android.kt
@@ -83,14 +83,16 @@
     val FontWeight = Medium
     val LineHeight = 20.sp
     val LetterSpacing = 0.1f.sp
-    fun textStyle(color: Color): TextStyle = TextStyle(
-        color = color,
-        textAlign = LabelHorizontalTextAlignment,
-        fontSize = FontSize,
-        fontWeight = FontWeight,
-        lineHeight = LineHeight,
-        letterSpacing = LetterSpacing,
-    )
+
+    fun textStyle(color: Color): TextStyle =
+        TextStyle(
+            color = color,
+            textAlign = LabelHorizontalTextAlignment,
+            fontSize = FontSize,
+            fontWeight = FontWeight,
+            lineHeight = LineHeight,
+            letterSpacing = LetterSpacing,
+        )
 }
 
 private val DefaultPopupProperties = PopupProperties(focusable = true)
@@ -144,15 +146,16 @@
     content: @Composable ColumnScope.() -> Unit,
 ) {
     Column(
-        modifier = modifier
-            .shadow(
-                ContextMenuSpec.MenuContainerElevation,
-                RoundedCornerShape(ContextMenuSpec.CornerRadius)
-            )
-            .background(colors.backgroundColor)
-            .width(IntrinsicSize.Max)
-            .padding(vertical = ContextMenuSpec.VerticalPadding)
-            .verticalScroll(rememberScrollState()),
+        modifier =
+            modifier
+                .shadow(
+                    ContextMenuSpec.MenuContainerElevation,
+                    RoundedCornerShape(ContextMenuSpec.CornerRadius)
+                )
+                .background(colors.backgroundColor)
+                .width(IntrinsicSize.Max)
+                .padding(vertical = ContextMenuSpec.VerticalPadding)
+                .verticalScroll(rememberScrollState()),
         content = content,
     )
 }
@@ -167,63 +170,66 @@
     colors: ContextMenuColors,
     modifier: Modifier = Modifier,
     /**
-     * Icon to place in front of the label. If null, the icon will not be rendered
-     * and the text will instead be further towards the start. The `iconColor` will
-     * change based on whether the item is disabled or not.
+     * Icon to place in front of the label. If null, the icon will not be rendered and the text will
+     * instead be further towards the start. The `iconColor` will change based on whether the item
+     * is disabled or not.
      */
     leadingIcon: @Composable ((iconColor: Color) -> Unit)? = null,
     /**
      * Lambda called when this item is clicked.
      *
-     * Note: If you want the context menu to close when this item is clicked,
-     * you will have to do it in this lambda via [ContextMenuState.close].
+     * Note: If you want the context menu to close when this item is clicked, you will have to do it
+     * in this lambda via [ContextMenuState.close].
      */
     onClick: () -> Unit,
 ) {
     Row(
         verticalAlignment = ContextMenuSpec.LabelVerticalTextAlignment,
         horizontalArrangement = Arrangement.spacedBy(ContextMenuSpec.HorizontalPadding),
-        modifier = modifier
-            .clickable(
-                enabled = enabled,
-                onClickLabel = label,
-            ) {
-                // Semantics can call this even if it is disabled (at least in tests),
-                // so check enabled status again before invoking any callbacks.
-                if (enabled) onClick()
-            }
-            .fillMaxWidth()
-            .sizeIn(
-                minWidth = ContextMenuSpec.ContainerWidthMin,
-                maxWidth = ContextMenuSpec.ContainerWidthMax,
-                minHeight = ContextMenuSpec.ListItemHeight,
-                maxHeight = ContextMenuSpec.ListItemHeight,
-            )
-            .padding(horizontal = ContextMenuSpec.HorizontalPadding)
+        modifier =
+            modifier
+                .clickable(
+                    enabled = enabled,
+                    onClickLabel = label,
+                ) {
+                    // Semantics can call this even if it is disabled (at least in tests),
+                    // so check enabled status again before invoking any callbacks.
+                    if (enabled) onClick()
+                }
+                .fillMaxWidth()
+                .sizeIn(
+                    minWidth = ContextMenuSpec.ContainerWidthMin,
+                    maxWidth = ContextMenuSpec.ContainerWidthMax,
+                    minHeight = ContextMenuSpec.ListItemHeight,
+                    maxHeight = ContextMenuSpec.ListItemHeight,
+                )
+                .padding(horizontal = ContextMenuSpec.HorizontalPadding)
     ) {
         leadingIcon?.let { icon ->
             Box(
-                modifier = Modifier.requiredSizeIn(
-                    minWidth = ContextMenuSpec.IconSize,
-                    maxWidth = ContextMenuSpec.IconSize,
-                    maxHeight = ContextMenuSpec.IconSize,
-                )
-            ) { icon(if (enabled) colors.iconColor else colors.disabledIconColor) }
+                modifier =
+                    Modifier.requiredSizeIn(
+                        minWidth = ContextMenuSpec.IconSize,
+                        maxWidth = ContextMenuSpec.IconSize,
+                        maxHeight = ContextMenuSpec.IconSize,
+                    )
+            ) {
+                icon(if (enabled) colors.iconColor else colors.disabledIconColor)
+            }
         }
         BasicText(
             text = label,
-            style = ContextMenuSpec.textStyle(
-                color = if (enabled) colors.textColor else colors.disabledTextColor,
-            ),
+            style =
+                ContextMenuSpec.textStyle(
+                    color = if (enabled) colors.textColor else colors.disabledTextColor,
+                ),
             maxLines = 1,
             modifier = Modifier.weight(1f, fill = true)
         )
     }
 }
 
-/**
- * Scope used to add components to a context menu.
- */
+/** Scope used to add components to a context menu. */
 // We cannot expose a @Composable in the context menu API because we don't want folks adding
 // arbitrary composables into a context menu. Instead, we expose this API which then maps to
 // context menu composables.
@@ -244,31 +250,31 @@
      *
      * @param label string to display in the text of the item.
      * @param modifier [Modifier] to apply to the item.
-     * @param enabled whether or not the item should be enabled.
-     * This affects whether the item is clickable, has a hover indication, and the text styling.
-     * @param leadingIcon Composable to put in the leading icon position.
-     * The color is the color to draw with and will change based on if the item is enabled or not.
-     * This will measured with a required width of `24.dp` and a required maxHeight of `24.dp`.
-     * The result will be centered vertically in the row.
-     * @param onClick Action to perform on the item being clicked.
-     * Returns whether or not the context menu should be dismissed.
+     * @param enabled whether or not the item should be enabled. This affects whether the item is
+     *   clickable, has a hover indication, and the text styling.
+     * @param leadingIcon Composable to put in the leading icon position. The color is the color to
+     *   draw with and will change based on if the item is enabled or not. This will measured with a
+     *   required width of `24.dp` and a required maxHeight of `24.dp`. The result will be centered
+     *   vertically in the row.
+     * @param onClick Action to perform on the item being clicked. Returns whether or not the
+     *   context menu should be dismissed.
      */
     fun item(
         label: @Composable () -> String,
         modifier: Modifier = Modifier,
         enabled: Boolean = true,
         /**
-         * Icon to place in front of the label. If null, the icon will not be rendered
-         * and the text will instead be further towards the start. The `iconColor` will
-         * change based on whether the item is disabled or not. The size of this composable
-         * will be [ContextMenuSpec.IconSize].
+         * Icon to place in front of the label. If null, the icon will not be rendered and the text
+         * will instead be further towards the start. The `iconColor` will change based on whether
+         * the item is disabled or not. The size of this composable will be
+         * [ContextMenuSpec.IconSize].
          */
         leadingIcon: @Composable ((iconColor: Color) -> Unit)? = null,
         /**
          * Lambda called when this item is clicked.
          *
-         * Note: If you want the context menu to close when this item is clicked,
-         * you will have to do it in this lambda via [ContextMenuState.close].
+         * Note: If you want the context menu to close when this item is clicked, you will have to
+         * do it in this lambda via [ContextMenuState.close].
          */
         onClick: () -> Unit,
     ) {
@@ -290,13 +296,14 @@
 private const val DisabledAlpha = 0.38f
 
 @VisibleForTesting
-internal val DefaultContextMenuColors = ContextMenuColors(
-    backgroundColor = Color.White,
-    textColor = Color.Black,
-    iconColor = Color.Black,
-    disabledTextColor = Color.Black.copy(alpha = DisabledAlpha),
-    disabledIconColor = Color.Black.copy(alpha = DisabledAlpha),
-)
+internal val DefaultContextMenuColors =
+    ContextMenuColors(
+        backgroundColor = Color.White,
+        textColor = Color.Black,
+        iconColor = Color.Black,
+        disabledTextColor = Color.Black.copy(alpha = DisabledAlpha),
+        disabledIconColor = Color.Black.copy(alpha = DisabledAlpha),
+    )
 
 /**
  * Colors to apply to the context menu.
@@ -338,13 +345,14 @@
         return result
     }
 
-    override fun toString(): String = "ContextMenuColors(" +
-        "backgroundColor=$backgroundColor, " +
-        "textColor=$textColor, " +
-        "iconColor=$iconColor, " +
-        "disabledTextColor=$disabledTextColor, " +
-        "disabledIconColor=$disabledIconColor" +
-        ")"
+    override fun toString(): String =
+        "ContextMenuColors(" +
+            "backgroundColor=$backgroundColor, " +
+            "textColor=$textColor, " +
+            "iconColor=$iconColor, " +
+            "disabledTextColor=$disabledTextColor, " +
+            "disabledIconColor=$disabledIconColor" +
+            ")"
 }
 
 @VisibleForTesting
@@ -355,16 +363,18 @@
 ): ContextMenuColors {
     val context = LocalContext.current
     return remember(context, LocalConfiguration.current) {
-        val backgroundColor = context.resolveColor(
-            backgroundStyleId,
-            R.attr.colorBackground,
-            DefaultContextMenuColors.backgroundColor,
-        )
+        val backgroundColor =
+            context.resolveColor(
+                backgroundStyleId,
+                R.attr.colorBackground,
+                DefaultContextMenuColors.backgroundColor,
+            )
 
-        val textColorStateList = context.resolveColorStateList(
-            foregroundStyleId,
-            R.attr.textColorPrimary,
-        )
+        val textColorStateList =
+            context.resolveColorStateList(
+                foregroundStyleId,
+                R.attr.textColorPrimary,
+            )
         val enabledColor = textColorStateList.enabledColor(DefaultContextMenuColors.textColor)
         val disabledColor =
             textColorStateList.disabledColor(DefaultContextMenuColors.disabledTextColor)
diff --git a/compose/foundation/foundation/src/androidMain/kotlin/androidx/compose/foundation/draganddrop/AndroidDragAndDropSource.android.kt b/compose/foundation/foundation/src/androidMain/kotlin/androidx/compose/foundation/draganddrop/AndroidDragAndDropSource.android.kt
index 285cc89..60ed642 100644
--- a/compose/foundation/foundation/src/androidMain/kotlin/androidx/compose/foundation/draganddrop/AndroidDragAndDropSource.android.kt
+++ b/compose/foundation/foundation/src/androidMain/kotlin/androidx/compose/foundation/draganddrop/AndroidDragAndDropSource.android.kt
@@ -32,39 +32,39 @@
 import androidx.compose.ui.platform.InspectorInfo
 
 /**
- * A Modifier that allows an element it is applied to to be treated like a source for
- * drag and drop operations. It displays the element dragged as a drag shadow.
+ * A Modifier that allows an element it is applied to to be treated like a source for drag and drop
+ * operations. It displays the element dragged as a drag shadow.
  *
  * Learn how to use [Modifier.dragAndDropSource]:
+ *
  * @sample androidx.compose.foundation.samples.TextDragAndDropSourceSample
  *
- * @param block A lambda with a [DragAndDropSourceScope] as a receiver
- * which provides a [PointerInputScope] to detect the drag gesture, after which a drag and drop
- * gesture can be started with [DragAndDropSourceScope.startTransfer].
- *
+ * @param block A lambda with a [DragAndDropSourceScope] as a receiver which provides a
+ *   [PointerInputScope] to detect the drag gesture, after which a drag and drop gesture can be
+ *   started with [DragAndDropSourceScope.startTransfer].
  */
 @ExperimentalFoundationApi
-fun Modifier.dragAndDropSource(
-    block: suspend DragAndDropSourceScope.() -> Unit
-): Modifier = this then DragAndDropSourceWithDefaultShadowElement(
-    dragAndDropSourceHandler = block,
-)
+fun Modifier.dragAndDropSource(block: suspend DragAndDropSourceScope.() -> Unit): Modifier =
+    this then
+        DragAndDropSourceWithDefaultShadowElement(
+            dragAndDropSourceHandler = block,
+        )
 
 @ExperimentalFoundationApi
 private class DragAndDropSourceWithDefaultShadowElement(
-    /**
-     * @see Modifier.dragAndDropSource
-     */
+    /** @see Modifier.dragAndDropSource */
     val dragAndDropSourceHandler: suspend DragAndDropSourceScope.() -> Unit
 ) : ModifierNodeElement<DragSourceNodeWithDefaultPainter>() {
-    override fun create() = DragSourceNodeWithDefaultPainter(
-        dragAndDropSourceHandler = dragAndDropSourceHandler,
-    )
+    override fun create() =
+        DragSourceNodeWithDefaultPainter(
+            dragAndDropSourceHandler = dragAndDropSourceHandler,
+        )
 
-    override fun update(node: DragSourceNodeWithDefaultPainter) = with(node) {
-        dragAndDropSourceHandler =
-            this@DragAndDropSourceWithDefaultShadowElement.dragAndDropSourceHandler
-    }
+    override fun update(node: DragSourceNodeWithDefaultPainter) =
+        with(node) {
+            dragAndDropSourceHandler =
+                this@DragAndDropSourceWithDefaultShadowElement.dragAndDropSourceHandler
+        }
 
     override fun InspectorInfo.inspectableProperties() {
         name = "dragSourceWithDefaultPainter"
@@ -89,17 +89,14 @@
 ) : DelegatingNode() {
 
     init {
-        val cacheDrawScopeDragShadowCallback = CacheDrawScopeDragShadowCallback().also {
-            delegate(CacheDrawModifierNode(it::cachePicture))
-        }
+        val cacheDrawScopeDragShadowCallback =
+            CacheDrawScopeDragShadowCallback().also {
+                delegate(CacheDrawModifierNode(it::cachePicture))
+            }
         delegate(
             DragAndDropSourceNode(
-                drawDragDecoration = {
-                    cacheDrawScopeDragShadowCallback.drawDragShadow(this)
-                },
-                dragAndDropSourceHandler = {
-                    dragAndDropSourceHandler.invoke(this)
-                }
+                drawDragDecoration = { cacheDrawScopeDragShadowCallback.drawDragShadow(this) },
+                dragAndDropSourceHandler = { dragAndDropSourceHandler.invoke(this) }
             )
         )
     }
@@ -109,37 +106,37 @@
 private class CacheDrawScopeDragShadowCallback {
     private var cachedPicture: Picture? = null
 
-    fun drawDragShadow(drawScope: DrawScope) = with(drawScope) {
-        when (val picture = cachedPicture) {
-            null -> throw IllegalArgumentException(
-                "No cached drag shadow. Check if Modifier.cacheDragShadow(painter) was called."
-            )
-
-            else -> drawIntoCanvas { canvas ->
-                canvas.nativeCanvas.drawPicture(picture)
+    fun drawDragShadow(drawScope: DrawScope) =
+        with(drawScope) {
+            when (val picture = cachedPicture) {
+                null ->
+                    throw IllegalArgumentException(
+                        "No cached drag shadow. Check if Modifier.cacheDragShadow(painter) was called."
+                    )
+                else -> drawIntoCanvas { canvas -> canvas.nativeCanvas.drawPicture(picture) }
             }
         }
-    }
 
-    fun cachePicture(scope: CacheDrawScope): DrawResult = with(scope) {
-        val picture = Picture()
-        cachedPicture = picture
-        val width = this.size.width.toInt()
-        val height = this.size.height.toInt()
-        onDrawWithContent {
-            val pictureCanvas =
-                androidx.compose.ui.graphics.Canvas(picture.beginRecording(width, height))
-            draw(
-                density = this,
-                layoutDirection = this.layoutDirection,
-                canvas = pictureCanvas,
-                size = this.size
-            ) {
-                this@onDrawWithContent.drawContent()
+    fun cachePicture(scope: CacheDrawScope): DrawResult =
+        with(scope) {
+            val picture = Picture()
+            cachedPicture = picture
+            val width = this.size.width.toInt()
+            val height = this.size.height.toInt()
+            onDrawWithContent {
+                val pictureCanvas =
+                    androidx.compose.ui.graphics.Canvas(picture.beginRecording(width, height))
+                draw(
+                    density = this,
+                    layoutDirection = this.layoutDirection,
+                    canvas = pictureCanvas,
+                    size = this.size
+                ) {
+                    this@onDrawWithContent.drawContent()
+                }
+                picture.endRecording()
+
+                drawIntoCanvas { canvas -> canvas.nativeCanvas.drawPicture(picture) }
             }
-            picture.endRecording()
-
-            drawIntoCanvas { canvas -> canvas.nativeCanvas.drawPicture(picture) }
         }
-    }
 }
diff --git a/compose/foundation/foundation/src/androidMain/kotlin/androidx/compose/foundation/gestures/BringIntoViewSpec.android.kt b/compose/foundation/foundation/src/androidMain/kotlin/androidx/compose/foundation/gestures/BringIntoViewSpec.android.kt
index 354e333..d5b7830 100644
--- a/compose/foundation/foundation/src/androidMain/kotlin/androidx/compose/foundation/gestures/BringIntoViewSpec.android.kt
+++ b/compose/foundation/foundation/src/androidMain/kotlin/androidx/compose/foundation/gestures/BringIntoViewSpec.android.kt
@@ -45,35 +45,35 @@
     }
 
 @OptIn(ExperimentalFoundationApi::class)
-internal val PivotBringIntoViewSpec = object : BringIntoViewSpec {
-    val parentFraction = 0.3f
-    val childFraction = 0f
+internal val PivotBringIntoViewSpec =
+    object : BringIntoViewSpec {
+        val parentFraction = 0.3f
+        val childFraction = 0f
 
-    override fun calculateScrollDistance(
-        offset: Float,
-        size: Float,
-        containerSize: Float
-    ): Float {
-        val leadingEdgeOfItemRequestingFocus = offset
-        val trailingEdgeOfItemRequestingFocus = offset + size
+        override fun calculateScrollDistance(
+            offset: Float,
+            size: Float,
+            containerSize: Float
+        ): Float {
+            val leadingEdgeOfItemRequestingFocus = offset
+            val trailingEdgeOfItemRequestingFocus = offset + size
 
-        val sizeOfItemRequestingFocus =
-            abs(trailingEdgeOfItemRequestingFocus - leadingEdgeOfItemRequestingFocus)
-        val childSmallerThanParent = sizeOfItemRequestingFocus <= containerSize
-        val initialTargetForLeadingEdge =
-            parentFraction * containerSize -
-                (childFraction * sizeOfItemRequestingFocus)
-        val spaceAvailableToShowItem = containerSize - initialTargetForLeadingEdge
+            val sizeOfItemRequestingFocus =
+                abs(trailingEdgeOfItemRequestingFocus - leadingEdgeOfItemRequestingFocus)
+            val childSmallerThanParent = sizeOfItemRequestingFocus <= containerSize
+            val initialTargetForLeadingEdge =
+                parentFraction * containerSize - (childFraction * sizeOfItemRequestingFocus)
+            val spaceAvailableToShowItem = containerSize - initialTargetForLeadingEdge
 
-        val targetForLeadingEdge =
-            if (childSmallerThanParent &&
-                spaceAvailableToShowItem < sizeOfItemRequestingFocus
-            ) {
-                containerSize - sizeOfItemRequestingFocus
-            } else {
-                initialTargetForLeadingEdge
-            }
+            val targetForLeadingEdge =
+                if (
+                    childSmallerThanParent && spaceAvailableToShowItem < sizeOfItemRequestingFocus
+                ) {
+                    containerSize - sizeOfItemRequestingFocus
+                } else {
+                    initialTargetForLeadingEdge
+                }
 
-        return leadingEdgeOfItemRequestingFocus - targetForLeadingEdge
+            return leadingEdgeOfItemRequestingFocus - targetForLeadingEdge
+        }
     }
-}
diff --git a/compose/foundation/foundation/src/androidMain/kotlin/androidx/compose/foundation/lazy/layout/Lazy.android.kt b/compose/foundation/foundation/src/androidMain/kotlin/androidx/compose/foundation/lazy/layout/Lazy.android.kt
index 2cf1ac3..3157cd3 100644
--- a/compose/foundation/foundation/src/androidMain/kotlin/androidx/compose/foundation/lazy/layout/Lazy.android.kt
+++ b/compose/foundation/foundation/src/androidMain/kotlin/androidx/compose/foundation/lazy/layout/Lazy.android.kt
@@ -39,8 +39,7 @@
         @JvmField
         val CREATOR: Parcelable.Creator<DefaultLazyKey> =
             object : Parcelable.Creator<DefaultLazyKey> {
-                override fun createFromParcel(parcel: Parcel) =
-                    DefaultLazyKey(parcel.readInt())
+                override fun createFromParcel(parcel: Parcel) = DefaultLazyKey(parcel.readInt())
 
                 override fun newArray(size: Int) = arrayOfNulls<DefaultLazyKey?>(size)
             }
diff --git a/compose/foundation/foundation/src/androidMain/kotlin/androidx/compose/foundation/lazy/layout/PrefetchScheduler.android.kt b/compose/foundation/foundation/src/androidMain/kotlin/androidx/compose/foundation/lazy/layout/PrefetchScheduler.android.kt
index 9105a3e..f043f7b 100644
--- a/compose/foundation/foundation/src/androidMain/kotlin/androidx/compose/foundation/lazy/layout/PrefetchScheduler.android.kt
+++ b/compose/foundation/foundation/src/androidMain/kotlin/androidx/compose/foundation/lazy/layout/PrefetchScheduler.android.kt
@@ -31,70 +31,50 @@
 @Composable
 internal actual fun rememberDefaultPrefetchScheduler(): PrefetchScheduler {
     val view = LocalView.current
-    return remember(view) {
-        AndroidPrefetchScheduler(view)
-    }
+    return remember(view) { AndroidPrefetchScheduler(view) }
 }
 
 /**
  * Android specific prefetch implementation. The only platform specific things are:
  * 1) Calculating the deadline
- * 2) Posting the delayed runnable
- * This could be refactored in the future in order to keep the most logic platform agnostic to
- * enable the prefetching on desktop.
+ * 2) Posting the delayed runnable This could be refactored in the future in order to keep the most
+ *    logic platform agnostic to enable the prefetching on desktop.
  *
  * The differences with the implementation in RecyclerView:
- *
- * 1) Prefetch is per-list-index, and performed on whole item.
- *    With RecyclerView, nested scrolling RecyclerViews would prefetch incrementally, e.g. items
- *    like the following in a scrolling vertical list could be broken up within a frame:
- *    [Row1 [a], [b], [c]]
- *    [Row2 [d], [e]]
- *    [Row3 [f], [g], [h]]
- *    You could have frames that break up this work arbitrarily:
- *    Frame 1 - prefetch [a]
- *    Frame 2 - prefetch [b], [c]
- *    Frame 3 - prefetch [d]
- *    Frame 4 - prefetch [e], [f]
+ * 1) Prefetch is per-list-index, and performed on whole item. With RecyclerView, nested scrolling
+ *    RecyclerViews would prefetch incrementally, e.g. items like the following in a scrolling
+ *    vertical list could be broken up within a frame: [Row1 [a], [b], [c]] [Row2 [d], [e]]
+ *    [Row3 [f], [g], [h]] You could have frames that break up this work arbitrarily: Frame 1 -
+ *    prefetch [a] Frame 2 - prefetch [b], [c] Frame 3 - prefetch [d] Frame 4 - prefetch [e], [f]
  *    Something similar is not possible with LazyColumn yet.
- *
- * 2) Prefetching time estimation only captured during the prefetch.
- *    We currently don't track the time of the regular subcompose call happened during the regular
- *    measure pass, only the ones which are done during the prefetching. The downside is we build
- *    our prefetch information only after scrolling has started and items are showing up. Your very
- *    first scroll won't know if it's safe to prefetch. Why:
- *    a) SubcomposeLayout is not exposing an API to understand if subcompose() call is going to
- *    do the real work. The work could be skipped if the same lambda was passed as for the
- *    previous invocation or if there were no recompositions scheduled. We could workaround it
- *    by keeping the extra state in LazyListState about what items we already composed and to
- *    only measure the first composition for the given slot, or consider exposing extra
- *    information in SubcomposeLayoutState API.
- *    b) It allows us to nicely decouple the logic, now the prefetching logic is build on
- *    top of the regular LazyColumn measuring functionallity and the main logic knows nothing
- *    about prefetch
- *    c) Maybe the better approach would be to wait till the low-level runtime infra is ready to
- *    do subcompositions on the different threads which illuminates the need to calculate the
- *    deadlines completely.
- *    Tracking bug: b/187393381.
- *
- * 3) Prefetch is not aware of item type.
- *    RecyclerView separates timing metadata about different item types. For example, in play
- *    store style UI, this allows RecyclerView to separately estimate the cost of a header,
- *    separator, and item row. In this implementation, all of these would be averaged together in
- *    the same estimation.
- *    There is no view type concept in LazyColumn at all. What can we possible do:
- *    a) Think of different item/items calls in the builder dsl as different view types
- *    automatically. It is close enough but still not entirely correct if the user have something
- *    like a list of elements which are objects of some sealed classes and they consider
- *    different classes as completely different types
- *    b) Maybe if we would be able to precompose on the different thread this issue is also not
- *    so critical given that we don't need to calculate the deadline.
- *    Tracking bug: 187393922
+ * 2) Prefetching time estimation only captured during the prefetch. We currently don't track the
+ *    time of the regular subcompose call happened during the regular measure pass, only the ones
+ *    which are done during the prefetching. The downside is we build our prefetch information only
+ *    after scrolling has started and items are showing up. Your very first scroll won't know if
+ *    it's safe to prefetch. Why: a) SubcomposeLayout is not exposing an API to understand if
+ *    subcompose() call is going to do the real work. The work could be skipped if the same lambda
+ *    was passed as for the previous invocation or if there were no recompositions scheduled. We
+ *    could workaround it by keeping the extra state in LazyListState about what items we already
+ *    composed and to only measure the first composition for the given slot, or consider exposing
+ *    extra information in SubcomposeLayoutState API. b) It allows us to nicely decouple the logic,
+ *    now the prefetching logic is build on top of the regular LazyColumn measuring functionallity
+ *    and the main logic knows nothing about prefetch c) Maybe the better approach would be to wait
+ *    till the low-level runtime infra is ready to do subcompositions on the different threads which
+ *    illuminates the need to calculate the deadlines completely. Tracking bug: b/187393381.
+ * 3) Prefetch is not aware of item type. RecyclerView separates timing metadata about different
+ *    item types. For example, in play store style UI, this allows RecyclerView to separately
+ *    estimate the cost of a header, separator, and item row. In this implementation, all of these
+ *    would be averaged together in the same estimation. There is no view type concept in LazyColumn
+ *    at all. What can we possible do: a) Think of different item/items calls in the builder dsl as
+ *    different view types automatically. It is close enough but still not entirely correct if the
+ *    user have something like a list of elements which are objects of some sealed classes and they
+ *    consider different classes as completely different types b) Maybe if we would be able to
+ *    precompose on the different thread this issue is also not so critical given that we don't need
+ *    to calculate the deadline. Tracking bug: 187393922
  */
 @ExperimentalFoundationApi
-internal class AndroidPrefetchScheduler(
-    private val view: View
-) : PrefetchScheduler, RememberObserver, Runnable, Choreographer.FrameCallback {
+internal class AndroidPrefetchScheduler(private val view: View) :
+    PrefetchScheduler, RememberObserver, Runnable, Choreographer.FrameCallback {
 
     /**
      * The list of currently not processed prefetch requests. The requests will be processed one by
@@ -114,12 +94,15 @@
     }
 
     /**
-     * Callback to be executed when the prefetching is needed.
-     * [prefetchRequests] will be used as an input.
+     * Callback to be executed when the prefetching is needed. [prefetchRequests] will be used as an
+     * input.
      */
     override fun run() {
-        if (prefetchRequests.isEmpty() || !prefetchScheduled || !isActive ||
-            view.windowVisibility != View.VISIBLE
+        if (
+            prefetchRequests.isEmpty() ||
+                !prefetchScheduled ||
+                !isActive ||
+                view.windowVisibility != View.VISIBLE
         ) {
             // incorrect input. ignore
             prefetchScheduled = false
@@ -152,9 +135,9 @@
     }
 
     /**
-     * Choreographer frame callback. It will be called when during the previous frame we didn't
-     * have enough time left. We will post a new message in the handler in order to try to
-     * prefetch again after this frame.
+     * Choreographer frame callback. It will be called when during the previous frame we didn't have
+     * enough time left. We will post a new message in the handler in order to try to prefetch again
+     * after this frame.
      */
     override fun doFrame(frameTimeNanos: Long) {
         if (isActive) {
@@ -188,14 +171,14 @@
         private val nextFrameTimeNs: Long,
     ) : PrefetchRequestScope {
 
-        override fun availableTimeNanos() =
-            max(0, nextFrameTimeNs - System.nanoTime())
+        override fun availableTimeNanos() = max(0, nextFrameTimeNs - System.nanoTime())
     }
 
     companion object {
 
         /**
-         * The static cache in order to not gather the display refresh rate to often (expensive operation).
+         * The static cache in order to not gather the display refresh rate to often (expensive
+         * operation).
          */
         private var frameIntervalNs: Long = 0
 
diff --git a/compose/foundation/foundation/src/androidMain/kotlin/androidx/compose/foundation/text/AndroidCursorHandle.android.kt b/compose/foundation/foundation/src/androidMain/kotlin/androidx/compose/foundation/text/AndroidCursorHandle.android.kt
index 8fe6980..9cdd1b7 100644
--- a/compose/foundation/foundation/src/androidMain/kotlin/androidx/compose/foundation/text/AndroidCursorHandle.android.kt
+++ b/compose/foundation/foundation/src/androidMain/kotlin/androidx/compose/foundation/text/AndroidCursorHandle.android.kt
@@ -50,24 +50,24 @@
     modifier: Modifier,
     minTouchTargetSize: DpSize
 ) {
-    val finalModifier = modifier.semantics {
-        this[SelectionHandleInfoKey] = SelectionHandleInfo(
-            handle = Handle.Cursor,
-            position = offsetProvider.provide(),
-            anchor = SelectionHandleAnchor.Middle,
-            visible = true,
-        )
-    }
-    HandlePopup(
-        positionProvider = offsetProvider,
-        handleReferencePoint = Alignment.TopCenter
-    ) {
+    val finalModifier =
+        modifier.semantics {
+            this[SelectionHandleInfoKey] =
+                SelectionHandleInfo(
+                    handle = Handle.Cursor,
+                    position = offsetProvider.provide(),
+                    anchor = SelectionHandleAnchor.Middle,
+                    visible = true,
+                )
+        }
+    HandlePopup(positionProvider = offsetProvider, handleReferencePoint = Alignment.TopCenter) {
         if (minTouchTargetSize.isSpecified) {
             Box(
-                modifier = finalModifier.requiredSizeIn(
-                    minWidth = minTouchTargetSize.width,
-                    minHeight = minTouchTargetSize.height
-                ),
+                modifier =
+                    finalModifier.requiredSizeIn(
+                        minWidth = minTouchTargetSize.width,
+                        minHeight = minTouchTargetSize.height
+                    ),
                 contentAlignment = Alignment.TopCenter
             ) {
                 DefaultCursorHandle()
diff --git a/compose/foundation/foundation/src/androidMain/kotlin/androidx/compose/foundation/text/ContextMenu.android.kt b/compose/foundation/foundation/src/androidMain/kotlin/androidx/compose/foundation/text/ContextMenu.android.kt
index 8c17b8a..bbf1047 100644
--- a/compose/foundation/foundation/src/androidMain/kotlin/androidx/compose/foundation/text/ContextMenu.android.kt
+++ b/compose/foundation/foundation/src/androidMain/kotlin/androidx/compose/foundation/text/ContextMenu.android.kt
@@ -61,10 +61,7 @@
 }
 
 @Composable
-internal actual fun ContextMenuArea(
-    manager: SelectionManager,
-    content: @Composable () -> Unit
-) {
+internal actual fun ContextMenuArea(manager: SelectionManager, content: @Composable () -> Unit) {
     val state = remember { ContextMenuState() }
     androidx.compose.foundation.contextmenu.ContextMenuArea(
         state = state,
@@ -85,9 +82,7 @@
     Paste(android.R.string.paste),
     SelectAll(android.R.string.selectAll);
 
-    @ReadOnlyComposable
-    @Composable
-    fun resolvedString(): String = stringResource(stringId)
+    @ReadOnlyComposable @Composable fun resolvedString(): String = stringResource(stringId)
 }
 
 internal inline fun ContextMenuScope.TextItem(
diff --git a/compose/foundation/foundation/src/androidMain/kotlin/androidx/compose/foundation/text/KeyEventHelpers.android.kt b/compose/foundation/foundation/src/androidMain/kotlin/androidx/compose/foundation/text/KeyEventHelpers.android.kt
index a6b4e5d..96ae5ad 100644
--- a/compose/foundation/foundation/src/androidMain/kotlin/androidx/compose/foundation/text/KeyEventHelpers.android.kt
+++ b/compose/foundation/foundation/src/androidMain/kotlin/androidx/compose/foundation/text/KeyEventHelpers.android.kt
@@ -26,4 +26,4 @@
 }
 
 // It's platform-specific behavior, Android doesn't have such a concept
-internal actual fun showCharacterPalette() { }
+internal actual fun showCharacterPalette() {}
diff --git a/compose/foundation/foundation/src/androidMain/kotlin/androidx/compose/foundation/text/KeyMapping.android.kt b/compose/foundation/foundation/src/androidMain/kotlin/androidx/compose/foundation/text/KeyMapping.android.kt
index 2210e78..d22ae99 100644
--- a/compose/foundation/foundation/src/androidMain/kotlin/androidx/compose/foundation/text/KeyMapping.android.kt
+++ b/compose/foundation/foundation/src/androidMain/kotlin/androidx/compose/foundation/text/KeyMapping.android.kt
@@ -23,29 +23,29 @@
 import androidx.compose.ui.input.key.isShiftPressed
 import androidx.compose.ui.input.key.key
 
-internal actual val platformDefaultKeyMapping = object : KeyMapping {
-    override fun map(event: KeyEvent): KeyCommand? = when {
-        event.isShiftPressed && event.isAltPressed ->
-            when (event.key) {
-                MappedKeys.DirectionLeft -> KeyCommand.SELECT_LINE_LEFT
-                MappedKeys.DirectionRight -> KeyCommand.SELECT_LINE_RIGHT
-                MappedKeys.DirectionUp -> KeyCommand.SELECT_HOME
-                MappedKeys.DirectionDown -> KeyCommand.SELECT_END
+internal actual val platformDefaultKeyMapping =
+    object : KeyMapping {
+        override fun map(event: KeyEvent): KeyCommand? =
+            when {
+                event.isShiftPressed && event.isAltPressed ->
+                    when (event.key) {
+                        MappedKeys.DirectionLeft -> KeyCommand.SELECT_LINE_LEFT
+                        MappedKeys.DirectionRight -> KeyCommand.SELECT_LINE_RIGHT
+                        MappedKeys.DirectionUp -> KeyCommand.SELECT_HOME
+                        MappedKeys.DirectionDown -> KeyCommand.SELECT_END
+                        else -> null
+                    }
+                event.isAltPressed ->
+                    when (event.key) {
+                        MappedKeys.DirectionLeft -> KeyCommand.LINE_LEFT
+                        MappedKeys.DirectionRight -> KeyCommand.LINE_RIGHT
+                        MappedKeys.DirectionUp -> KeyCommand.HOME
+                        MappedKeys.DirectionDown -> KeyCommand.END
+                        else -> null
+                    }
                 else -> null
-            }
-
-        event.isAltPressed ->
-            when (event.key) {
-                MappedKeys.DirectionLeft -> KeyCommand.LINE_LEFT
-                MappedKeys.DirectionRight -> KeyCommand.LINE_RIGHT
-                MappedKeys.DirectionUp -> KeyCommand.HOME
-                MappedKeys.DirectionDown -> KeyCommand.END
-                else -> null
-            }
-
-        else -> null
-    } ?: defaultKeyMapping.map(event)
-}
+            } ?: defaultKeyMapping.map(event)
+    }
 
 internal actual object MappedKeys {
     actual val A: Key = Key(AndroidKeyEvent.KEYCODE_A)
diff --git a/compose/foundation/foundation/src/androidMain/kotlin/androidx/compose/foundation/text/TextFieldFocusModifier.android.kt b/compose/foundation/foundation/src/androidMain/kotlin/androidx/compose/foundation/text/TextFieldFocusModifier.android.kt
index 2dec8d4..a067b53 100644
--- a/compose/foundation/foundation/src/androidMain/kotlin/androidx/compose/foundation/text/TextFieldFocusModifier.android.kt
+++ b/compose/foundation/foundation/src/androidMain/kotlin/androidx/compose/foundation/text/TextFieldFocusModifier.android.kt
@@ -48,38 +48,35 @@
     state: LegacyTextFieldState,
     focusManager: FocusManager
 ): Modifier {
-    return this
-        .onPreviewKeyEvent { keyEvent ->
-            val device = keyEvent.nativeKeyEvent.device
-            when {
-                device == null -> false
+    return this.onPreviewKeyEvent { keyEvent ->
+        val device = keyEvent.nativeKeyEvent.device
+        when {
+            device == null -> false
 
-                // Ignore key events from non-dpad sources
-                !device.supportsSource(SOURCE_DPAD) -> false
+            // Ignore key events from non-dpad sources
+            !device.supportsSource(SOURCE_DPAD) -> false
 
-                // Ignore key events from virtual keyboards
-                device.isVirtual -> false
+            // Ignore key events from virtual keyboards
+            device.isVirtual -> false
 
-                // Ignore key release events
-                keyEvent.type != KeyDown -> false
+            // Ignore key release events
+            keyEvent.type != KeyDown -> false
 
-                // Ignore events that originate from a source that only identifies as keyboard.
-                // This logic is taken from `android.widget.TextView#doKeyDown()` method.
-                keyEvent.nativeKeyEvent.source == InputDevice.SOURCE_KEYBOARD -> false
-
-                keyEvent.isKeyCode(KEYCODE_DPAD_UP) -> focusManager.moveFocus(Up)
-                keyEvent.isKeyCode(KEYCODE_DPAD_DOWN) -> focusManager.moveFocus(Down)
-                keyEvent.isKeyCode(KEYCODE_DPAD_LEFT) -> focusManager.moveFocus(Left)
-                keyEvent.isKeyCode(KEYCODE_DPAD_RIGHT) -> focusManager.moveFocus(Right)
-                keyEvent.isKeyCode(KEYCODE_DPAD_CENTER) -> {
-                    // Enable keyboard on center key press
-                    state.keyboardController?.show()
-                    true
-                }
-                else -> false
+            // Ignore events that originate from a source that only identifies as keyboard.
+            // This logic is taken from `android.widget.TextView#doKeyDown()` method.
+            keyEvent.nativeKeyEvent.source == InputDevice.SOURCE_KEYBOARD -> false
+            keyEvent.isKeyCode(KEYCODE_DPAD_UP) -> focusManager.moveFocus(Up)
+            keyEvent.isKeyCode(KEYCODE_DPAD_DOWN) -> focusManager.moveFocus(Down)
+            keyEvent.isKeyCode(KEYCODE_DPAD_LEFT) -> focusManager.moveFocus(Left)
+            keyEvent.isKeyCode(KEYCODE_DPAD_RIGHT) -> focusManager.moveFocus(Right)
+            keyEvent.isKeyCode(KEYCODE_DPAD_CENTER) -> {
+                // Enable keyboard on center key press
+                state.keyboardController?.show()
+                true
             }
+            else -> false
         }
+    }
 }
 
-private fun KeyEvent.isKeyCode(keyCode: Int): Boolean =
-    this.key.nativeKeyCode == keyCode
+private fun KeyEvent.isKeyCode(keyCode: Int): Boolean = this.key.nativeKeyCode == keyCode
diff --git a/compose/foundation/foundation/src/androidMain/kotlin/androidx/compose/foundation/text/TextFieldKeyInput.android.kt b/compose/foundation/foundation/src/androidMain/kotlin/androidx/compose/foundation/text/TextFieldKeyInput.android.kt
index efe436d..59ea53a 100644
--- a/compose/foundation/foundation/src/androidMain/kotlin/androidx/compose/foundation/text/TextFieldKeyInput.android.kt
+++ b/compose/foundation/foundation/src/androidMain/kotlin/androidx/compose/foundation/text/TextFieldKeyInput.android.kt
@@ -19,5 +19,6 @@
 import androidx.compose.ui.input.key.KeyEvent
 
 internal actual val KeyEvent.isTypedEvent: Boolean
-    get() = nativeKeyEvent.action == android.view.KeyEvent.ACTION_DOWN &&
-        !Character.isISOControl(nativeKeyEvent.unicodeChar)
+    get() =
+        nativeKeyEvent.action == android.view.KeyEvent.ACTION_DOWN &&
+            !Character.isISOControl(nativeKeyEvent.unicodeChar)
diff --git a/compose/foundation/foundation/src/androidMain/kotlin/androidx/compose/foundation/text/TextPointerIcon.android.kt b/compose/foundation/foundation/src/androidMain/kotlin/androidx/compose/foundation/text/TextPointerIcon.android.kt
index 90314ef..7080f26 100644
--- a/compose/foundation/foundation/src/androidMain/kotlin/androidx/compose/foundation/text/TextPointerIcon.android.kt
+++ b/compose/foundation/foundation/src/androidMain/kotlin/androidx/compose/foundation/text/TextPointerIcon.android.kt
@@ -18,5 +18,4 @@
 
 import androidx.compose.ui.input.pointer.PointerIcon
 
-internal actual val textPointerIcon: PointerIcon =
-    PointerIcon(android.view.PointerIcon.TYPE_TEXT)
+internal actual val textPointerIcon: PointerIcon = PointerIcon(android.view.PointerIcon.TYPE_TEXT)
diff --git a/compose/foundation/foundation/src/androidMain/kotlin/androidx/compose/foundation/text/TouchMode.android.kt b/compose/foundation/foundation/src/androidMain/kotlin/androidx/compose/foundation/text/TouchMode.android.kt
index b421472..070860f 100644
--- a/compose/foundation/foundation/src/androidMain/kotlin/androidx/compose/foundation/text/TouchMode.android.kt
+++ b/compose/foundation/foundation/src/androidMain/kotlin/androidx/compose/foundation/text/TouchMode.android.kt
@@ -17,7 +17,6 @@
 package androidx.compose.foundation.text
 
 import androidx.compose.ui.Modifier
-import androidx.compose.ui.input.pointer.pointerInput
 
 /**
  * A boolean representing whether or not we are in touch mode or not.
@@ -25,9 +24,9 @@
  * This is a temporary workaround and should be removed after proper mouse handling is settled
  * (b/171402426).
  *
- * Until then, it is recommended to use [Modifier.pointerInput] to read whether an event comes
- * from a touch or mouse source. A more global way of determining this mode will also be added
- * as part of b/171402426.
+ * Until then, it is recommended to use [Modifier.pointerInput] to read whether an event comes from
+ * a touch or mouse source. A more global way of determining this mode will also be added as part of
+ * b/171402426.
  */
 @Deprecated(message = "Avoid using if possible, see kdoc.", level = DeprecationLevel.WARNING)
 internal actual val isInTouchMode = true
diff --git a/compose/foundation/foundation/src/androidMain/kotlin/androidx/compose/foundation/text/handwriting/HandwritingDetector.android.kt b/compose/foundation/foundation/src/androidMain/kotlin/androidx/compose/foundation/text/handwriting/HandwritingDetector.android.kt
index ed44b5e..31952bd 100644
--- a/compose/foundation/foundation/src/androidMain/kotlin/androidx/compose/foundation/text/handwriting/HandwritingDetector.android.kt
+++ b/compose/foundation/foundation/src/androidMain/kotlin/androidx/compose/foundation/text/handwriting/HandwritingDetector.android.kt
@@ -63,9 +63,8 @@
         this
     }
 
-private class HandwritingDetectorElement(
-    private val callback: () -> Unit
-) : ModifierNodeElement<HandwritingDetectorNode>() {
+private class HandwritingDetectorElement(private val callback: () -> Unit) :
+    ModifierNodeElement<HandwritingDetectorNode>() {
     override fun create() = HandwritingDetectorNode(callback)
 
     override fun update(node: HandwritingDetectorNode) {
@@ -83,11 +82,10 @@
     }
 }
 
-private class HandwritingDetectorNode(var callback: () -> Unit) : DelegatingNode(),
-    PointerInputModifierNode {
-    private val composeImm by lazy(LazyThreadSafetyMode.NONE) {
-        ComposeInputMethodManager(requireView())
-    }
+private class HandwritingDetectorNode(var callback: () -> Unit) :
+    DelegatingNode(), PointerInputModifierNode {
+    private val composeImm by
+        lazy(LazyThreadSafetyMode.NONE) { ComposeInputMethodManager(requireView()) }
 
     override fun onPointerEvent(
         pointerEvent: PointerEvent,
@@ -101,9 +99,12 @@
         pointerInputNode.onCancelPointerInput()
     }
 
-    val pointerInputNode = delegate(StylusHandwritingNodeWithNegativePadding {
-        callback()
-        composeImm.prepareStylusHandwritingDelegation()
-        return@StylusHandwritingNodeWithNegativePadding true
-    })
+    val pointerInputNode =
+        delegate(
+            StylusHandwritingNodeWithNegativePadding {
+                callback()
+                composeImm.prepareStylusHandwritingDelegation()
+                return@StylusHandwritingNodeWithNegativePadding true
+            }
+        )
 }
diff --git a/compose/foundation/foundation/src/androidMain/kotlin/androidx/compose/foundation/text/handwriting/HandwritingHandler.android.kt b/compose/foundation/foundation/src/androidMain/kotlin/androidx/compose/foundation/text/handwriting/HandwritingHandler.android.kt
index de81cb9..050cf20 100644
--- a/compose/foundation/foundation/src/androidMain/kotlin/androidx/compose/foundation/text/handwriting/HandwritingHandler.android.kt
+++ b/compose/foundation/foundation/src/androidMain/kotlin/androidx/compose/foundation/text/handwriting/HandwritingHandler.android.kt
@@ -39,8 +39,8 @@
  * field to be shown. To support handwriting initiation in this case, a [handwritingDetector]
  * modifier can be applied to the fake text input field to configure it as a detector, and this
  * modifier can be applied to the real text input field. The `callback` implementation for the fake
- * text field's [handwritingDetector] modifier is typically the same as the `onClick`
- * implementation its [clickable] modifier, which shows and focuses the real text input field.
+ * text field's [handwritingDetector] modifier is typically the same as the `onClick` implementation
+ * its [clickable] modifier, which shows and focuses the real text input field.
  *
  * This function returns a no-op modifier on API levels below Android U (34) as stylus handwriting
  * is not supported.
@@ -66,9 +66,8 @@
 
 private class HandwritingHandlerNode : FocusEventModifierNode, Modifier.Node() {
     private var focusState: FocusState? = null
-    private val composeImm by lazy(LazyThreadSafetyMode.NONE) {
-        ComposeInputMethodManager(requireView())
-    }
+    private val composeImm by
+        lazy(LazyThreadSafetyMode.NONE) { ComposeInputMethodManager(requireView()) }
 
     override fun onFocusEvent(focusState: FocusState) {
         if (this.focusState != focusState) {
diff --git a/compose/foundation/foundation/src/androidMain/kotlin/androidx/compose/foundation/text/input/internal/AndroidTextInputSession.android.kt b/compose/foundation/foundation/src/androidMain/kotlin/androidx/compose/foundation/text/input/internal/AndroidTextInputSession.android.kt
index af1dd92..bd6770d 100644
--- a/compose/foundation/foundation/src/androidMain/kotlin/androidx/compose/foundation/text/input/internal/AndroidTextInputSession.android.kt
+++ b/compose/foundation/foundation/src/androidMain/kotlin/androidx/compose/foundation/text/input/internal/AndroidTextInputSession.android.kt
@@ -43,8 +43,7 @@
 import kotlinx.coroutines.launch
 
 /** Enable to print logs during debugging, see [logDebug]. */
-@VisibleForTesting
-internal const val TIA_DEBUG = false
+@VisibleForTesting internal const val TIA_DEBUG = false
 private const val TIA_TAG = "AndroidTextInputSession"
 
 internal actual suspend fun PlatformTextInputSession.platformSpecificTextInputSession(
@@ -89,9 +88,10 @@
 
                 // No need to restart the IME if there wasn't a composing region. This is useful
                 // to not unnecessarily restart filtered digit only, or password fields.
-                if (restartImeIfContentChanges &&
-                    oldValue.composition != null &&
-                    !oldValue.contentEquals(newValue)
+                if (
+                    restartImeIfContentChanges &&
+                        oldValue.composition != null &&
+                        !oldValue.contentEquals(newValue)
                 ) {
                     composeImm.restartInput()
                 } else if (oldSelection != newSelection || oldComposition != newComposition) {
@@ -112,76 +112,78 @@
                 // before calling startStylusHandwriting. We need to wait for one frame
                 // because TextInputService.startInput also waits for one frame before
                 // actually calling imm.restartInput.
-                withFrameMillis { }
-                it.collect {
-                    composeImm.startStylusHandwriting()
-                }
+                withFrameMillis {}
+                it.collect { composeImm.startStylusHandwriting() }
             }
         }
 
-        val cursorUpdatesController = CursorAnchorInfoController(
-            composeImm = composeImm,
-            textFieldState = state,
-            textLayoutState = layoutState,
-            monitorScope = this,
-        )
+        val cursorUpdatesController =
+            CursorAnchorInfoController(
+                composeImm = composeImm,
+                textFieldState = state,
+                textLayoutState = layoutState,
+                monitorScope = this,
+            )
 
         startInputMethod { outAttrs ->
             logDebug { "createInputConnection(value=\"${state.visualText}\")" }
 
-            val textInputSession = object : TextInputSession {
-                override val text: TextFieldCharSequence
-                    get() = state.visualText
+            val textInputSession =
+                object : TextInputSession {
+                    override val text: TextFieldCharSequence
+                        get() = state.visualText
 
-                override fun requestEdit(block: EditingBuffer.() -> Unit) {
-                    state.editUntransformedTextAsUser(
-                        restartImeIfContentChanges = false,
-                        block = block
-                    )
-                }
-
-                override fun sendKeyEvent(keyEvent: KeyEvent) {
-                    composeImm.sendKeyEvent(keyEvent)
-                }
-
-                override fun onImeAction(imeAction: ImeAction) {
-                    onImeAction?.invoke(imeAction)
-                }
-
-                override fun onCommitContent(transferableContent: TransferableContent): Boolean {
-                    return receiveContentConfiguration?.onCommitContent(transferableContent)
-                        ?: false
-                }
-
-                override fun requestCursorUpdates(cursorUpdateMode: Int) {
-                    cursorUpdatesController.requestUpdates(cursorUpdateMode)
-                }
-
-                override fun performHandwritingGesture(gesture: HandwritingGesture): Int {
-                    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.UPSIDE_DOWN_CAKE) {
-                        return state.performHandwritingGesture(
-                            gesture,
-                            layoutState,
-                            viewConfiguration
+                    override fun requestEdit(block: EditingBuffer.() -> Unit) {
+                        state.editUntransformedTextAsUser(
+                            restartImeIfContentChanges = false,
+                            block = block
                         )
                     }
-                    return InputConnection.HANDWRITING_GESTURE_RESULT_UNSUPPORTED
-                }
 
-                override fun previewHandwritingGesture(
-                    gesture: PreviewableHandwritingGesture,
-                    cancellationSignal: CancellationSignal?
-                ): Boolean {
-                    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.UPSIDE_DOWN_CAKE) {
-                        return state.previewHandwritingGesture(
-                            gesture,
-                            layoutState,
-                            cancellationSignal
-                        )
+                    override fun sendKeyEvent(keyEvent: KeyEvent) {
+                        composeImm.sendKeyEvent(keyEvent)
                     }
-                    return false
+
+                    override fun onImeAction(imeAction: ImeAction) {
+                        onImeAction?.invoke(imeAction)
+                    }
+
+                    override fun onCommitContent(
+                        transferableContent: TransferableContent
+                    ): Boolean {
+                        return receiveContentConfiguration?.onCommitContent(transferableContent)
+                            ?: false
+                    }
+
+                    override fun requestCursorUpdates(cursorUpdateMode: Int) {
+                        cursorUpdatesController.requestUpdates(cursorUpdateMode)
+                    }
+
+                    override fun performHandwritingGesture(gesture: HandwritingGesture): Int {
+                        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.UPSIDE_DOWN_CAKE) {
+                            return state.performHandwritingGesture(
+                                gesture,
+                                layoutState,
+                                viewConfiguration
+                            )
+                        }
+                        return InputConnection.HANDWRITING_GESTURE_RESULT_UNSUPPORTED
+                    }
+
+                    override fun previewHandwritingGesture(
+                        gesture: PreviewableHandwritingGesture,
+                        cancellationSignal: CancellationSignal?
+                    ): Boolean {
+                        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.UPSIDE_DOWN_CAKE) {
+                            return state.previewHandwritingGesture(
+                                gesture,
+                                layoutState,
+                                cancellationSignal
+                            )
+                        }
+                        return false
+                    }
                 }
-            }
 
             outAttrs.update(
                 text = state.visualText,
diff --git a/compose/foundation/foundation/src/androidMain/kotlin/androidx/compose/foundation/text/input/internal/ComposeInputMethodManager.android.kt b/compose/foundation/foundation/src/androidMain/kotlin/androidx/compose/foundation/text/input/internal/ComposeInputMethodManager.android.kt
index f6b7bb6..5ff479a3 100644
--- a/compose/foundation/foundation/src/androidMain/kotlin/androidx/compose/foundation/text/input/internal/ComposeInputMethodManager.android.kt
+++ b/compose/foundation/foundation/src/androidMain/kotlin/androidx/compose/foundation/text/input/internal/ComposeInputMethodManager.android.kt
@@ -45,10 +45,7 @@
 
     fun hideSoftInput()
 
-    fun updateExtractedText(
-        token: Int,
-        extractedText: ExtractedText
-    )
+    fun updateExtractedText(token: Int, extractedText: ExtractedText)
 
     fun updateSelection(
         selectionStart: Int,
@@ -65,9 +62,7 @@
      */
     fun sendKeyEvent(event: KeyEvent)
 
-    /**
-     * Signal the IME to start stylus handwriting.
-     */
+    /** Signal the IME to start stylus handwriting. */
     fun startStylusHandwriting()
 
     fun prepareStylusHandwritingDelegation()
@@ -115,8 +110,7 @@
 
     private var imm: InputMethodManager? = null
 
-    private val softwareKeyboardControllerCompat =
-        SoftwareKeyboardControllerCompat(view)
+    private val softwareKeyboardControllerCompat = SoftwareKeyboardControllerCompat(view)
 
     override fun restartInput() {
         requireImm().restartInput(view)
@@ -130,10 +124,7 @@
         softwareKeyboardControllerCompat.hide()
     }
 
-    override fun updateExtractedText(
-        token: Int,
-        extractedText: ExtractedText
-    ) {
+    override fun updateExtractedText(token: Int, extractedText: ExtractedText) {
         requireImm().updateExtractedText(view, token, extractedText)
     }
 
@@ -143,13 +134,8 @@
         compositionStart: Int,
         compositionEnd: Int
     ) {
-        requireImm().updateSelection(
-            view,
-            selectionStart,
-            selectionEnd,
-            compositionStart,
-            compositionEnd
-        )
+        requireImm()
+            .updateSelection(view, selectionStart, selectionEnd, compositionStart, compositionEnd)
     }
 
     override fun updateCursorAnchorInfo(info: CursorAnchorInfo) {
@@ -178,14 +164,15 @@
     ComposeInputMethodManagerImpl(view) {
 
     /**
-     * Prior to API24, the safest way to delegate IME originated KeyEvents to the window was
-     * through BaseInputConnection.
+     * Prior to API24, the safest way to delegate IME originated KeyEvents to the window was through
+     * BaseInputConnection.
      */
     private var baseInputConnection: BaseInputConnection? = null
 
     override fun sendKeyEvent(event: KeyEvent) {
-        val baseInputConnection = baseInputConnection
-            ?: BaseInputConnection(view, false).also { baseInputConnection = it }
+        val baseInputConnection =
+            baseInputConnection
+                ?: BaseInputConnection(view, false).also { baseInputConnection = it }
         baseInputConnection.sendKeyEvent(event)
     }
 }
diff --git a/compose/foundation/foundation/src/androidMain/kotlin/androidx/compose/foundation/text/input/internal/CursorAnchorInfoBuilder.android.kt b/compose/foundation/foundation/src/androidMain/kotlin/androidx/compose/foundation/text/input/internal/CursorAnchorInfoBuilder.android.kt
index e4168d9..32001e5 100644
--- a/compose/foundation/foundation/src/androidMain/kotlin/androidx/compose/foundation/text/input/internal/CursorAnchorInfoBuilder.android.kt
+++ b/compose/foundation/foundation/src/androidMain/kotlin/androidx/compose/foundation/text/input/internal/CursorAnchorInfoBuilder.android.kt
@@ -64,10 +64,7 @@
         val compositionEnd = composition?.max ?: -1
 
         if (compositionStart in 0 until compositionEnd) {
-            setComposingText(
-                compositionStart,
-                text.subSequence(compositionStart, compositionEnd)
-            )
+            setComposingText(compositionStart, text.subSequence(compositionStart, compositionEnd))
             addCharacterBounds(
                 compositionStart,
                 compositionEnd,
@@ -125,12 +122,7 @@
     innerTextFieldBounds: Rect
 ): CursorAnchorInfo.Builder {
     val array = FloatArray((endOffset - startOffset) * 4)
-    textLayoutResult.multiParagraph.fillBoundingBoxes(
-        TextRange(
-            startOffset,
-            endOffset
-        ), array, 0
-    )
+    textLayoutResult.multiParagraph.fillBoundingBoxes(TextRange(startOffset, endOffset), array, 0)
 
     for (offset in startOffset until endOffset) {
         val arrayIndex = 4 * (offset - startOffset)
@@ -148,7 +140,7 @@
         }
         if (
             !innerTextFieldBounds.containsInclusive(rect.left, rect.top) ||
-            !innerTextFieldBounds.containsInclusive(rect.right, rect.bottom)
+                !innerTextFieldBounds.containsInclusive(rect.right, rect.bottom)
         ) {
             flags = flags or CursorAnchorInfo.FLAG_HAS_INVISIBLE_REGION
         }
diff --git a/compose/foundation/foundation/src/androidMain/kotlin/androidx/compose/foundation/text/input/internal/CursorAnchorInfoController.android.kt b/compose/foundation/foundation/src/androidMain/kotlin/androidx/compose/foundation/text/input/internal/CursorAnchorInfoController.android.kt
index a45685a..52f2c36 100644
--- a/compose/foundation/foundation/src/androidMain/kotlin/androidx/compose/foundation/text/input/internal/CursorAnchorInfoController.android.kt
+++ b/compose/foundation/foundation/src/androidMain/kotlin/androidx/compose/foundation/text/input/internal/CursorAnchorInfoController.android.kt
@@ -54,9 +54,7 @@
     private val matrix = Matrix()
     private val androidMatrix = android.graphics.Matrix()
 
-    /**
-     * Requests [CursorAnchorInfo] updates to be provided to the [ComposeInputMethodManager].
-     */
+    /** Requests [CursorAnchorInfo] updates to be provided to the [ComposeInputMethodManager]. */
     fun requestUpdates(cursorUpdateMode: Int) {
         val immediate = cursorUpdateMode and InputConnection.CURSOR_UPDATE_IMMEDIATE != 0
         val monitor = cursorUpdateMode and InputConnection.CURSOR_UPDATE_MONITOR != 0
@@ -78,9 +76,9 @@
             // If no filter flags are used, then all info should be included.
             if (
                 !includeInsertionMarker &&
-                !includeCharacterBounds &&
-                !includeEditorBounds &&
-                !includeLineBounds
+                    !includeCharacterBounds &&
+                    !includeEditorBounds &&
+                    !includeLineBounds
             ) {
                 includeInsertionMarker = true
                 includeCharacterBounds = true
@@ -147,13 +145,14 @@
     private fun startOrStopMonitoring() {
         if (monitorEnabled) {
             if (monitorJob?.isActive != true) {
-                monitorJob = monitorScope.launch(start = CoroutineStart.UNDISPATCHED) {
-                    // TODO (b/291327369) Confirm that we are sending updates at the right time.
-                    snapshotFlow { calculateCursorAnchorInfo() }
-                        .drop(1)
-                        .filterNotNull()
-                        .collect { composeImm.updateCursorAnchorInfo(it) }
-                }
+                monitorJob =
+                    monitorScope.launch(start = CoroutineStart.UNDISPATCHED) {
+                        // TODO (b/291327369) Confirm that we are sending updates at the right time.
+                        snapshotFlow { calculateCursorAnchorInfo() }
+                            .drop(1)
+                            .filterNotNull()
+                            .collect { composeImm.updateCursorAnchorInfo(it) }
+                    }
             }
         } else {
             monitorJob?.cancel()
@@ -163,17 +162,13 @@
 
     private fun calculateCursorAnchorInfo(): CursorAnchorInfo? {
         // State reads
-        val textLayoutCoordinates = textLayoutState.textLayoutNodeCoordinates
-            ?.takeIf { it.isAttached }
-            ?: return null
-        val coreCoordinates = textLayoutState.coreNodeCoordinates
-            ?.takeIf { it.isAttached }
-            ?: return null
-        val decorationBoxCoordinates = textLayoutState.decoratorNodeCoordinates
-            ?.takeIf { it.isAttached }
-            ?: return null
-        val textLayoutResult = textLayoutState.layoutResult
-            ?: return null
+        val textLayoutCoordinates =
+            textLayoutState.textLayoutNodeCoordinates?.takeIf { it.isAttached } ?: return null
+        val coreCoordinates =
+            textLayoutState.coreNodeCoordinates?.takeIf { it.isAttached } ?: return null
+        val decorationBoxCoordinates =
+            textLayoutState.decoratorNodeCoordinates?.takeIf { it.isAttached } ?: return null
+        val textLayoutResult = textLayoutState.layoutResult ?: return null
         val text = textFieldState.visualText
 
         // Updates matrix to transform text layout coordinates to screen coordinates.
@@ -181,10 +176,16 @@
         textLayoutCoordinates.transformToScreen(matrix)
         androidMatrix.setFrom(matrix)
 
-        val innerTextFieldBounds = coreCoordinates.visibleBounds()
-            .translate(textLayoutCoordinates.localPositionOf(coreCoordinates, Offset.Zero))
-        val decorationBoxBounds = decorationBoxCoordinates.visibleBounds()
-            .translate(textLayoutCoordinates.localPositionOf(decorationBoxCoordinates, Offset.Zero))
+        val innerTextFieldBounds =
+            coreCoordinates
+                .visibleBounds()
+                .translate(textLayoutCoordinates.localPositionOf(coreCoordinates, Offset.Zero))
+        val decorationBoxBounds =
+            decorationBoxCoordinates
+                .visibleBounds()
+                .translate(
+                    textLayoutCoordinates.localPositionOf(decorationBoxCoordinates, Offset.Zero)
+                )
         return builder.build(
             text,
             text.selection,
diff --git a/compose/foundation/foundation/src/androidMain/kotlin/androidx/compose/foundation/text/input/internal/EditorInfo.android.kt b/compose/foundation/foundation/src/androidMain/kotlin/androidx/compose/foundation/text/input/internal/EditorInfo.android.kt
index d20dd29..4d90603 100644
--- a/compose/foundation/foundation/src/androidMain/kotlin/androidx/compose/foundation/text/input/internal/EditorInfo.android.kt
+++ b/compose/foundation/foundation/src/androidMain/kotlin/androidx/compose/foundation/text/input/internal/EditorInfo.android.kt
@@ -37,82 +37,64 @@
 import androidx.compose.ui.text.intl.LocaleList
 import androidx.core.view.inputmethod.EditorInfoCompat
 
-/**
- * Fills necessary info of EditorInfo.
- */
+/** Fills necessary info of EditorInfo. */
 internal fun EditorInfo.update(
     text: CharSequence,
     selection: TextRange,
     imeOptions: ImeOptions,
     contentMimeTypes: Array<String>? = null
 ) {
-    this.imeOptions = when (imeOptions.imeAction) {
-        ImeAction.Default -> {
-            if (imeOptions.singleLine) {
-                // this is the last resort to enable single line
-                // Android IME still shows return key even if multi line is not send
-                // TextView.java#onCreateInputConnection
-                EditorInfo.IME_ACTION_DONE
-            } else {
-                EditorInfo.IME_ACTION_UNSPECIFIED
+    this.imeOptions =
+        when (imeOptions.imeAction) {
+            ImeAction.Default -> {
+                if (imeOptions.singleLine) {
+                    // this is the last resort to enable single line
+                    // Android IME still shows return key even if multi line is not send
+                    // TextView.java#onCreateInputConnection
+                    EditorInfo.IME_ACTION_DONE
+                } else {
+                    EditorInfo.IME_ACTION_UNSPECIFIED
+                }
             }
+            ImeAction.None -> EditorInfo.IME_ACTION_NONE
+            ImeAction.Go -> EditorInfo.IME_ACTION_GO
+            ImeAction.Next -> EditorInfo.IME_ACTION_NEXT
+            ImeAction.Previous -> EditorInfo.IME_ACTION_PREVIOUS
+            ImeAction.Search -> EditorInfo.IME_ACTION_SEARCH
+            ImeAction.Send -> EditorInfo.IME_ACTION_SEND
+            ImeAction.Done -> EditorInfo.IME_ACTION_DONE
+            else -> error("invalid ImeAction")
         }
 
-        ImeAction.None -> EditorInfo.IME_ACTION_NONE
-        ImeAction.Go -> EditorInfo.IME_ACTION_GO
-        ImeAction.Next -> EditorInfo.IME_ACTION_NEXT
-        ImeAction.Previous -> EditorInfo.IME_ACTION_PREVIOUS
-        ImeAction.Search -> EditorInfo.IME_ACTION_SEARCH
-        ImeAction.Send -> EditorInfo.IME_ACTION_SEND
-        ImeAction.Done -> EditorInfo.IME_ACTION_DONE
-        else -> error("invalid ImeAction")
-    }
-
-    imeOptions.platformImeOptions?.privateImeOptions?.let {
-        privateImeOptions = it
-    }
+    imeOptions.platformImeOptions?.privateImeOptions?.let { privateImeOptions = it }
 
     if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
         LocaleListHelper.setHintLocales(this, imeOptions.hintLocales)
     }
 
-    this.inputType = when (imeOptions.keyboardType) {
-        KeyboardType.Text -> InputType.TYPE_CLASS_TEXT
-        KeyboardType.Ascii -> {
-            this.imeOptions = this.imeOptions or EditorInfo.IME_FLAG_FORCE_ASCII
-            InputType.TYPE_CLASS_TEXT
+    this.inputType =
+        when (imeOptions.keyboardType) {
+            KeyboardType.Text -> InputType.TYPE_CLASS_TEXT
+            KeyboardType.Ascii -> {
+                this.imeOptions = this.imeOptions or EditorInfo.IME_FLAG_FORCE_ASCII
+                InputType.TYPE_CLASS_TEXT
+            }
+            KeyboardType.Number -> InputType.TYPE_CLASS_NUMBER
+            KeyboardType.Phone -> InputType.TYPE_CLASS_PHONE
+            KeyboardType.Uri -> InputType.TYPE_CLASS_TEXT or EditorInfo.TYPE_TEXT_VARIATION_URI
+            KeyboardType.Email ->
+                InputType.TYPE_CLASS_TEXT or EditorInfo.TYPE_TEXT_VARIATION_EMAIL_ADDRESS
+            KeyboardType.Password ->
+                InputType.TYPE_CLASS_TEXT or EditorInfo.TYPE_TEXT_VARIATION_PASSWORD
+            KeyboardType.NumberPassword ->
+                InputType.TYPE_CLASS_NUMBER or EditorInfo.TYPE_NUMBER_VARIATION_PASSWORD
+            KeyboardType.Decimal ->
+                InputType.TYPE_CLASS_NUMBER or EditorInfo.TYPE_NUMBER_FLAG_DECIMAL
+            else -> error("Invalid Keyboard Type")
         }
 
-        KeyboardType.Number ->
-            InputType.TYPE_CLASS_NUMBER
-
-        KeyboardType.Phone ->
-            InputType.TYPE_CLASS_PHONE
-
-        KeyboardType.Uri ->
-            InputType.TYPE_CLASS_TEXT or EditorInfo.TYPE_TEXT_VARIATION_URI
-
-        KeyboardType.Email ->
-            InputType.TYPE_CLASS_TEXT or EditorInfo.TYPE_TEXT_VARIATION_EMAIL_ADDRESS
-
-        KeyboardType.Password ->
-            InputType.TYPE_CLASS_TEXT or EditorInfo.TYPE_TEXT_VARIATION_PASSWORD
-
-        KeyboardType.NumberPassword ->
-            InputType.TYPE_CLASS_NUMBER or EditorInfo.TYPE_NUMBER_VARIATION_PASSWORD
-
-        KeyboardType.Decimal ->
-            InputType.TYPE_CLASS_NUMBER or EditorInfo.TYPE_NUMBER_FLAG_DECIMAL
-
-        else -> error("Invalid Keyboard Type")
-    }
-
     if (!imeOptions.singleLine) {
-        if (hasFlag(
-                this.inputType,
-                InputType.TYPE_CLASS_TEXT
-            )
-        ) {
+        if (hasFlag(this.inputType, InputType.TYPE_CLASS_TEXT)) {
             // TextView.java#setInputTypeSingleLine
             this.inputType = this.inputType or InputType.TYPE_TEXT_FLAG_MULTI_LINE
 
@@ -122,24 +104,17 @@
         }
     }
 
-    if (hasFlag(
-            this.inputType,
-            InputType.TYPE_CLASS_TEXT
-        )
-    ) {
+    if (hasFlag(this.inputType, InputType.TYPE_CLASS_TEXT)) {
         when (imeOptions.capitalization) {
             KeyboardCapitalization.Characters -> {
                 this.inputType = this.inputType or InputType.TYPE_TEXT_FLAG_CAP_CHARACTERS
             }
-
             KeyboardCapitalization.Words -> {
                 this.inputType = this.inputType or InputType.TYPE_TEXT_FLAG_CAP_WORDS
             }
-
             KeyboardCapitalization.Sentences -> {
                 this.inputType = this.inputType or InputType.TYPE_TEXT_FLAG_CAP_SENTENCES
             }
-
             else -> {
                 /* do nothing */
             }
@@ -161,9 +136,10 @@
 
     this.imeOptions = this.imeOptions or EditorInfo.IME_FLAG_NO_FULLSCREEN
 
-    if (isStylusHandwritingSupported &&
-        imeOptions.keyboardType != KeyboardType.Password &&
-        imeOptions.keyboardType != KeyboardType.NumberPassword
+    if (
+        isStylusHandwritingSupported &&
+            imeOptions.keyboardType != KeyboardType.Password &&
+            imeOptions.keyboardType != KeyboardType.NumberPassword
     ) {
         EditorInfoCompat.setStylusHandwritingEnabled(this, true)
         EditorInfoApi34.setHandwritingGestures(this)
@@ -175,9 +151,9 @@
 private fun hasFlag(bits: Int, flag: Int): Boolean = (bits and flag) == flag
 
 /**
- * This class is here to ensure that the classes that use this API will get verified and can be
- * AOT compiled. It is expected that this class will soft-fail verification, but the classes
- * which use this method will pass.
+ * This class is here to ensure that the classes that use this API will get verified and can be AOT
+ * compiled. It is expected that this class will soft-fail verification, but the classes which use
+ * this method will pass.
  */
 @RequiresApi(24)
 internal object LocaleListHelper {
@@ -189,9 +165,8 @@
                 editorInfo.hintLocales = null
             }
             else -> {
-                editorInfo.hintLocales = android.os.LocaleList(
-                    *localeList.map { it.platformLocale }.toTypedArray()
-                )
+                editorInfo.hintLocales =
+                    android.os.LocaleList(*localeList.map { it.platformLocale }.toTypedArray())
             }
         }
     }
@@ -201,20 +176,22 @@
 private object EditorInfoApi34 {
     @DoNotInline
     fun setHandwritingGestures(editorInfo: EditorInfo) {
-        editorInfo.supportedHandwritingGestures = listOf(
-            SelectGesture::class.java,
-            DeleteGesture::class.java,
-            SelectRangeGesture::class.java,
-            DeleteRangeGesture::class.java,
-            JoinOrSplitGesture::class.java,
-            InsertGesture::class.java,
-            RemoveSpaceGesture::class.java
-        )
-        editorInfo.supportedHandwritingGesturePreviews = setOf(
-            SelectGesture::class.java,
-            DeleteGesture::class.java,
-            SelectRangeGesture::class.java,
-            DeleteRangeGesture::class.java
-        )
+        editorInfo.supportedHandwritingGestures =
+            listOf(
+                SelectGesture::class.java,
+                DeleteGesture::class.java,
+                SelectRangeGesture::class.java,
+                DeleteRangeGesture::class.java,
+                JoinOrSplitGesture::class.java,
+                InsertGesture::class.java,
+                RemoveSpaceGesture::class.java
+            )
+        editorInfo.supportedHandwritingGesturePreviews =
+            setOf(
+                SelectGesture::class.java,
+                DeleteGesture::class.java,
+                SelectRangeGesture::class.java,
+                DeleteRangeGesture::class.java
+            )
     }
 }
diff --git a/compose/foundation/foundation/src/androidMain/kotlin/androidx/compose/foundation/text/input/internal/HandwritingGesture.android.kt b/compose/foundation/foundation/src/androidMain/kotlin/androidx/compose/foundation/text/input/internal/HandwritingGesture.android.kt
index ba0422e..0d04cd0 100644
--- a/compose/foundation/foundation/src/androidMain/kotlin/androidx/compose/foundation/text/input/internal/HandwritingGesture.android.kt
+++ b/compose/foundation/foundation/src/androidMain/kotlin/androidx/compose/foundation/text/input/internal/HandwritingGesture.android.kt
@@ -62,22 +62,17 @@
         viewConfiguration: ViewConfiguration?
     ): Int {
         return when (handwritingGesture) {
-            is SelectGesture ->
-                performSelectGesture(handwritingGesture, layoutState)
-            is DeleteGesture ->
-                performDeleteGesture(handwritingGesture, layoutState)
-            is SelectRangeGesture ->
-                performSelectRangeGesture(handwritingGesture, layoutState)
-            is DeleteRangeGesture ->
-                performDeleteRangeGesture(handwritingGesture, layoutState)
+            is SelectGesture -> performSelectGesture(handwritingGesture, layoutState)
+            is DeleteGesture -> performDeleteGesture(handwritingGesture, layoutState)
+            is SelectRangeGesture -> performSelectRangeGesture(handwritingGesture, layoutState)
+            is DeleteRangeGesture -> performDeleteRangeGesture(handwritingGesture, layoutState)
             is JoinOrSplitGesture ->
                 performJoinOrSplitGesture(handwritingGesture, layoutState, viewConfiguration)
             is InsertGesture ->
                 performInsertGesture(handwritingGesture, layoutState, viewConfiguration)
             is RemoveSpaceGesture ->
                 performRemoveSpaceGesture(handwritingGesture, layoutState, viewConfiguration)
-            else ->
-                InputConnection.HANDWRITING_GESTURE_RESULT_UNSUPPORTED
+            else -> InputConnection.HANDWRITING_GESTURE_RESULT_UNSUPPORTED
         }
     }
 
@@ -94,11 +89,7 @@
             is DeleteRangeGesture -> previewDeleteRangeGesture(handwritingGesture, layoutState)
             else -> return false
         }
-        cancellationSignal?.setOnCancelListener {
-            editUntransformedTextAsUser {
-                clearHighlight()
-            }
-        }
+        cancellationSignal?.setOnCancelListener { editUntransformedTextAsUser { clearHighlight() } }
         return true
     }
 
@@ -107,13 +98,14 @@
         gesture: SelectGesture,
         layoutState: TextLayoutState
     ): Int {
-        val rangeInTransformedText = layoutState.getRangeForScreenRect(
-            gesture.selectionArea.toComposeRect(),
-            gesture.granularity.toTextGranularity(),
-            TextInclusionStrategy.ContainsCenter
-        ).apply {
-            if (collapsed) return fallback(gesture)
-        }
+        val rangeInTransformedText =
+            layoutState
+                .getRangeForScreenRect(
+                    gesture.selectionArea.toComposeRect(),
+                    gesture.granularity.toTextGranularity(),
+                    TextInclusionStrategy.ContainsCenter
+                )
+                .apply { if (collapsed) return fallback(gesture) }
 
         // TODO(332749926) show toolbar after selection.
         selectCharsIn(rangeInTransformedText)
@@ -141,13 +133,14 @@
         layoutState: TextLayoutState
     ): Int {
         val granularity = gesture.granularity.toTextGranularity()
-        val rangeInTransformedText = layoutState.getRangeForScreenRect(
-            gesture.deletionArea.toComposeRect(),
-            granularity,
-            TextInclusionStrategy.ContainsCenter
-        ).apply {
-            if (collapsed) return fallback(gesture)
-        }
+        val rangeInTransformedText =
+            layoutState
+                .getRangeForScreenRect(
+                    gesture.deletionArea.toComposeRect(),
+                    granularity,
+                    TextInclusionStrategy.ContainsCenter
+                )
+                .apply { if (collapsed) return fallback(gesture) }
 
         performDeletion(
             rangeInTransformedText = rangeInTransformedText,
@@ -176,14 +169,15 @@
         gesture: SelectRangeGesture,
         layoutState: TextLayoutState
     ): Int {
-        val rangeInTransformedText = layoutState.getRangeForScreenRects(
-            gesture.selectionStartArea.toComposeRect(),
-            gesture.selectionEndArea.toComposeRect(),
-            gesture.granularity.toTextGranularity(),
-            TextInclusionStrategy.ContainsCenter
-        ).apply {
-            if (collapsed) return fallback(gesture)
-        }
+        val rangeInTransformedText =
+            layoutState
+                .getRangeForScreenRects(
+                    gesture.selectionStartArea.toComposeRect(),
+                    gesture.selectionEndArea.toComposeRect(),
+                    gesture.granularity.toTextGranularity(),
+                    TextInclusionStrategy.ContainsCenter
+                )
+                .apply { if (collapsed) return fallback(gesture) }
 
         // TODO(332749926) show toolbar after selection.
         selectCharsIn(rangeInTransformedText)
@@ -212,14 +206,15 @@
         layoutState: TextLayoutState
     ): Int {
         val granularity = gesture.granularity.toTextGranularity()
-        val rangeInTransformedText = layoutState.getRangeForScreenRects(
-            gesture.deletionStartArea.toComposeRect(),
-            gesture.deletionEndArea.toComposeRect(),
-            granularity,
-            TextInclusionStrategy.ContainsCenter
-        ).apply {
-            if (collapsed) return fallback(gesture)
-        }
+        val rangeInTransformedText =
+            layoutState
+                .getRangeForScreenRects(
+                    gesture.deletionStartArea.toComposeRect(),
+                    gesture.deletionEndArea.toComposeRect(),
+                    granularity,
+                    TextInclusionStrategy.ContainsCenter
+                )
+                .apply { if (collapsed) return fallback(gesture) }
 
         performDeletion(
             rangeInTransformedText = rangeInTransformedText,
@@ -258,10 +253,11 @@
             return InputConnection.HANDWRITING_GESTURE_RESULT_FAILED
         }
 
-        val offset = layoutState.getOffsetForHandwritingGesture(
-            pointInScreen = gesture.joinOrSplitPoint.toOffset(),
-            viewConfiguration = viewConfiguration
-        )
+        val offset =
+            layoutState.getOffsetForHandwritingGesture(
+                pointInScreen = gesture.joinOrSplitPoint.toOffset(),
+                viewConfiguration = viewConfiguration
+            )
 
         // TODO(332963121): support gesture at BiDi boundaries.
         if (offset == -1 || layoutState.layoutResult?.isBiDiBoundary(offset) == true) {
@@ -273,10 +269,7 @@
         if (textRange.collapsed) {
             replaceText(" ", textRange)
         } else {
-            performDeletion(
-                rangeInTransformedText = textRange,
-                adjustRange = false
-            )
+            performDeletion(rangeInTransformedText = textRange, adjustRange = false)
         }
         return InputConnection.HANDWRITING_GESTURE_RESULT_SUCCESS
     }
@@ -287,10 +280,11 @@
         layoutState: TextLayoutState,
         viewConfiguration: ViewConfiguration?
     ): Int {
-        val offset = layoutState.getOffsetForHandwritingGesture(
-            pointInScreen = gesture.insertionPoint.toOffset(),
-            viewConfiguration = viewConfiguration
-        )
+        val offset =
+            layoutState.getOffsetForHandwritingGesture(
+                pointInScreen = gesture.insertionPoint.toOffset(),
+                viewConfiguration = viewConfiguration
+            )
 
         // TODO(332963121): support gesture at BiDi boundaries.
         if (offset == -1) {
@@ -307,24 +301,26 @@
         layoutState: TextLayoutState,
         viewConfiguration: ViewConfiguration?
     ): Int {
-        val range = layoutState.layoutResult.getRangeForRemoveSpaceGesture(
-            startPointInScreen = gesture.startPoint.toOffset(),
-            endPointerInScreen = gesture.endPoint.toOffset(),
-            layoutCoordinates = layoutState.textLayoutNodeCoordinates,
-            viewConfiguration = viewConfiguration
-        ).apply {
-            if (collapsed) return fallback(gesture)
-        }
+        val range =
+            layoutState.layoutResult
+                .getRangeForRemoveSpaceGesture(
+                    startPointInScreen = gesture.startPoint.toOffset(),
+                    endPointerInScreen = gesture.endPoint.toOffset(),
+                    layoutCoordinates = layoutState.textLayoutNodeCoordinates,
+                    viewConfiguration = viewConfiguration
+                )
+                .apply { if (collapsed) return fallback(gesture) }
 
         var firstMatchStart = -1
         var lastMatchEnd = -1
-        val newText = visualText.substring(range).replace(Regex("\\s+")) {
-            if (firstMatchStart == -1) {
-                firstMatchStart = it.range.first
+        val newText =
+            visualText.substring(range).replace(Regex("\\s+")) {
+                if (firstMatchStart == -1) {
+                    firstMatchStart = it.range.first
+                }
+                lastMatchEnd = it.range.last + 1
+                ""
             }
-            lastMatchEnd = it.range.last + 1
-            ""
-        }
 
         // No whitespace is found in the target range, fallback instead
         if (firstMatchStart == -1 || lastMatchEnd == -1) {
@@ -339,10 +335,11 @@
         val finalRange = TextRange(range.start + firstMatchStart, range.start + lastMatchEnd)
         // Remove the unchanged part from the newText as well. Characters before firstMatchStart
         // and characters after the lastMatchEnd are removed.
-        val finalNewText = newText.substring(
-            startIndex = firstMatchStart,
-            endIndex = newText.length - (range.length - lastMatchEnd)
-        )
+        val finalNewText =
+            newText.substring(
+                startIndex = firstMatchStart,
+                endIndex = newText.length - (range.length - lastMatchEnd)
+            )
 
         replaceText(finalNewText, finalRange)
         return InputConnection.HANDWRITING_GESTURE_RESULT_SUCCESS
@@ -353,22 +350,21 @@
         rangeInTransformedText: TextRange,
         adjustRange: Boolean
     ) {
-        val finalRange = if (adjustRange) {
-            rangeInTransformedText.adjustHandwritingDeleteGestureRange(visualText)
-        } else {
-            rangeInTransformedText
-        }
+        val finalRange =
+            if (adjustRange) {
+                rangeInTransformedText.adjustHandwritingDeleteGestureRange(visualText)
+            } else {
+                rangeInTransformedText
+            }
         replaceText("", finalRange)
     }
 
     @DoNotInline
     private fun TransformedTextFieldState.fallback(gesture: HandwritingGesture): Int {
-        editUntransformedTextAsUser {
-            clearHighlight()
-        }
+        editUntransformedTextAsUser { clearHighlight() }
 
-        val fallbackText = gesture.fallbackText
-            ?: return InputConnection.HANDWRITING_GESTURE_RESULT_FAILED
+        val fallbackText =
+            gesture.fallbackText ?: return InputConnection.HANDWRITING_GESTURE_RESULT_FAILED
 
         replaceSelectedText(
             newText = fallbackText,
@@ -403,20 +399,17 @@
         return when (gesture) {
             is SelectGesture ->
                 performSelectGesture(gesture, textFieldSelectionManager, editCommandConsumer)
-            is DeleteGesture ->
-                performDeleteGesture(gesture, text, editCommandConsumer)
+            is DeleteGesture -> performDeleteGesture(gesture, text, editCommandConsumer)
             is SelectRangeGesture ->
                 performSelectRangeGesture(gesture, textFieldSelectionManager, editCommandConsumer)
-            is DeleteRangeGesture ->
-                performDeleteRangeGesture(gesture, text, editCommandConsumer)
+            is DeleteRangeGesture -> performDeleteRangeGesture(gesture, text, editCommandConsumer)
             is JoinOrSplitGesture ->
                 performJoinOrSplitGesture(gesture, text, viewConfiguration, editCommandConsumer)
             is InsertGesture ->
                 performInsertGesture(gesture, viewConfiguration, editCommandConsumer)
             is RemoveSpaceGesture ->
                 performRemoveSpaceGesture(gesture, text, viewConfiguration, editCommandConsumer)
-            else ->
-                InputConnection.HANDWRITING_GESTURE_RESULT_UNSUPPORTED
+            else -> InputConnection.HANDWRITING_GESTURE_RESULT_UNSUPPORTED
         }
     }
 
@@ -450,13 +443,15 @@
         textSelectionManager: TextFieldSelectionManager?,
         editCommandConsumer: (EditCommand) -> Unit
     ): Int {
-        val range = getRangeForScreenRect(
-            gesture.selectionArea.toComposeRect(),
-            gesture.granularity.toTextGranularity(),
-            TextInclusionStrategy.ContainsCenter
-        ).apply {
-            if (collapsed) return fallbackOnLegacyTextField(gesture, editCommandConsumer)
-        }
+        val range =
+            getRangeForScreenRect(
+                    gesture.selectionArea.toComposeRect(),
+                    gesture.granularity.toTextGranularity(),
+                    TextInclusionStrategy.ContainsCenter
+                )
+                .apply {
+                    if (collapsed) return fallbackOnLegacyTextField(gesture, editCommandConsumer)
+                }
 
         performSelectionOnLegacyTextField(range, textSelectionManager, editCommandConsumer)
         return InputConnection.HANDWRITING_GESTURE_RESULT_SUCCESS
@@ -483,13 +478,15 @@
         editCommandConsumer: (EditCommand) -> Unit
     ): Int {
         val granularity = gesture.granularity.toTextGranularity()
-        val range = getRangeForScreenRect(
-            gesture.deletionArea.toComposeRect(),
-            granularity,
-            TextInclusionStrategy.ContainsCenter
-        ).apply {
-            if (collapsed) return fallbackOnLegacyTextField(gesture, editCommandConsumer)
-        }
+        val range =
+            getRangeForScreenRect(
+                    gesture.deletionArea.toComposeRect(),
+                    granularity,
+                    TextInclusionStrategy.ContainsCenter
+                )
+                .apply {
+                    if (collapsed) return fallbackOnLegacyTextField(gesture, editCommandConsumer)
+                }
 
         performDeletionOnLegacyTextField(
             range = range,
@@ -520,14 +517,16 @@
         textSelectionManager: TextFieldSelectionManager?,
         editCommandConsumer: (EditCommand) -> Unit
     ): Int {
-        val range = getRangeForScreenRects(
-            gesture.selectionStartArea.toComposeRect(),
-            gesture.selectionEndArea.toComposeRect(),
-            gesture.granularity.toTextGranularity(),
-            TextInclusionStrategy.ContainsCenter
-        ).apply {
-            if (collapsed) return fallbackOnLegacyTextField(gesture, editCommandConsumer)
-        }
+        val range =
+            getRangeForScreenRects(
+                    gesture.selectionStartArea.toComposeRect(),
+                    gesture.selectionEndArea.toComposeRect(),
+                    gesture.granularity.toTextGranularity(),
+                    TextInclusionStrategy.ContainsCenter
+                )
+                .apply {
+                    if (collapsed) return fallbackOnLegacyTextField(gesture, editCommandConsumer)
+                }
 
         performSelectionOnLegacyTextField(
             range = range,
@@ -559,14 +558,16 @@
         editCommandConsumer: (EditCommand) -> Unit
     ): Int {
         val granularity = gesture.granularity.toTextGranularity()
-        val range = getRangeForScreenRects(
-            gesture.deletionStartArea.toComposeRect(),
-            gesture.deletionEndArea.toComposeRect(),
-            granularity,
-            TextInclusionStrategy.ContainsCenter
-        ).apply {
-            if (collapsed) return fallbackOnLegacyTextField(gesture, editCommandConsumer)
-        }
+        val range =
+            getRangeForScreenRects(
+                    gesture.deletionStartArea.toComposeRect(),
+                    gesture.deletionEndArea.toComposeRect(),
+                    granularity,
+                    TextInclusionStrategy.ContainsCenter
+                )
+                .apply {
+                    if (collapsed) return fallbackOnLegacyTextField(gesture, editCommandConsumer)
+                }
         performDeletionOnLegacyTextField(
             range = range,
             text = text,
@@ -602,10 +603,11 @@
             return fallbackOnLegacyTextField(gesture, editCommandConsumer)
         }
 
-        val offset = getOffsetForHandwritingGesture(
-            pointInScreen = gesture.joinOrSplitPoint.toOffset(),
-            viewConfiguration = viewConfiguration
-        )
+        val offset =
+            getOffsetForHandwritingGesture(
+                pointInScreen = gesture.joinOrSplitPoint.toOffset(),
+                viewConfiguration = viewConfiguration
+            )
         // TODO(332963121): support gesture at BiDi boundaries.
         if (offset == -1 || layoutResult?.value?.isBiDiBoundary(offset) == true) {
             return fallbackOnLegacyTextField(gesture, editCommandConsumer)
@@ -636,10 +638,11 @@
             return fallbackOnLegacyTextField(gesture, editCommandConsumer)
         }
 
-        val offset = getOffsetForHandwritingGesture(
-            pointInScreen = gesture.insertionPoint.toOffset(),
-            viewConfiguration = viewConfiguration
-        )
+        val offset =
+            getOffsetForHandwritingGesture(
+                pointInScreen = gesture.insertionPoint.toOffset(),
+                viewConfiguration = viewConfiguration
+            )
         // TODO(332963121): support gesture at BiDi boundaries.
         if (offset == -1 || layoutResult?.value?.isBiDiBoundary(offset) == true) {
             return fallbackOnLegacyTextField(gesture, editCommandConsumer)
@@ -656,24 +659,29 @@
         viewConfiguration: ViewConfiguration?,
         editCommandConsumer: (EditCommand) -> Unit
     ): Int {
-        val range = layoutResult?.value.getRangeForRemoveSpaceGesture(
-            startPointInScreen = gesture.startPoint.toOffset(),
-            endPointerInScreen = gesture.endPoint.toOffset(),
-            layoutCoordinates = layoutCoordinates,
-            viewConfiguration = viewConfiguration
-        ).apply {
-            if (collapsed) return fallbackOnLegacyTextField(gesture, editCommandConsumer)
-        }
+        val range =
+            layoutResult
+                ?.value
+                .getRangeForRemoveSpaceGesture(
+                    startPointInScreen = gesture.startPoint.toOffset(),
+                    endPointerInScreen = gesture.endPoint.toOffset(),
+                    layoutCoordinates = layoutCoordinates,
+                    viewConfiguration = viewConfiguration
+                )
+                .apply {
+                    if (collapsed) return fallbackOnLegacyTextField(gesture, editCommandConsumer)
+                }
 
         var firstMatchStart = -1
         var lastMatchEnd = -1
-        val newText = text.substring(range).replace(Regex("\\s+")) {
-            if (firstMatchStart == -1) {
-                firstMatchStart = it.range.first
+        val newText =
+            text.substring(range).replace(Regex("\\s+")) {
+                if (firstMatchStart == -1) {
+                    firstMatchStart = it.range.first
+                }
+                lastMatchEnd = it.range.last + 1
+                ""
             }
-            lastMatchEnd = it.range.last + 1
-            ""
-        }
 
         // No whitespace is found in the target range, fallback instead
         if (firstMatchStart == -1 || lastMatchEnd == -1) {
@@ -687,10 +695,11 @@
         val replacedRangeEnd = range.start + lastMatchEnd
         // Remove the unchanged part from the newText as well. Characters before firstMatchStart
         // and characters after the lastMatchEnd are removed.
-        val finalNewText = newText.substring(
-            startIndex = firstMatchStart,
-            endIndex = newText.length - (range.length - lastMatchEnd)
-        )
+        val finalNewText =
+            newText.substring(
+                startIndex = firstMatchStart,
+                endIndex = newText.length - (range.length - lastMatchEnd)
+            )
 
         editCommandConsumer.invoke(
             compoundEditCommand(
@@ -708,10 +717,7 @@
         editCommandConsumer: (EditCommand) -> Unit
     ) {
         editCommandConsumer.invoke(
-            compoundEditCommand(
-                SetSelectionCommand(offset, offset),
-                CommitTextCommand(text, 1)
-            )
+            compoundEditCommand(SetSelectionCommand(offset, offset), CommitTextCommand(text, 1))
         )
     }
 
@@ -732,11 +738,12 @@
         adjustRange: Boolean,
         editCommandConsumer: (EditCommand) -> Unit
     ) {
-        val finalRange = if (adjustRange) {
-            range.adjustHandwritingDeleteGestureRange(text)
-        } else {
-            range
-        }
+        val finalRange =
+            if (adjustRange) {
+                range.adjustHandwritingDeleteGestureRange(text)
+            } else {
+                range
+            }
 
         editCommandConsumer.invoke(
             compoundEditCommand(
@@ -754,11 +761,9 @@
         gesture: HandwritingGesture,
         editCommandConsumer: (EditCommand) -> Unit
     ): Int {
-        val fallbackText = gesture.fallbackText
-            ?: return InputConnection.HANDWRITING_GESTURE_RESULT_FAILED
-        editCommandConsumer.invoke(
-            CommitTextCommand(fallbackText, newCursorPosition = 1)
-        )
+        val fallbackText =
+            gesture.fallbackText ?: return InputConnection.HANDWRITING_GESTURE_RESULT_FAILED
+        editCommandConsumer.invoke(CommitTextCommand(fallbackText, newCursorPosition = 1))
         return InputConnection.HANDWRITING_GESTURE_RESULT_FALLBACK
     }
 
@@ -777,32 +782,33 @@
 private const val NBSP_CODE_POINT = '\u00A0'.code
 
 /**
- * For handwriting delete gestures with word granularity, adjust the start and end offsets
- * to remove extra whitespace around the deleted text.
+ * For handwriting delete gestures with word granularity, adjust the start and end offsets to remove
+ * extra whitespace around the deleted text.
  */
-private fun TextRange.adjustHandwritingDeleteGestureRange(
-    text: CharSequence
-): TextRange {
+private fun TextRange.adjustHandwritingDeleteGestureRange(text: CharSequence): TextRange {
     var start = this.start
     var end = this.end
 
     // If the deleted text is at the start of the text, the behavior is the same as the case
     // where the deleted text follows a new line character.
-    var codePointBeforeStart: Int = if (start > 0) {
-        Character.codePointBefore(text, start)
-    } else {
-        LINE_FEED_CODE_POINT
-    }
+    var codePointBeforeStart: Int =
+        if (start > 0) {
+            Character.codePointBefore(text, start)
+        } else {
+            LINE_FEED_CODE_POINT
+        }
     // If the deleted text is at the end of the text, the behavior is the same as the case where
     // the deleted text precedes a new line character.
-    var codePointAtEnd: Int = if (end < text.length) {
-        Character.codePointAt(text, end)
-    } else {
-        LINE_FEED_CODE_POINT
-    }
+    var codePointAtEnd: Int =
+        if (end < text.length) {
+            Character.codePointAt(text, end)
+        } else {
+            LINE_FEED_CODE_POINT
+        }
 
-    if (codePointBeforeStart.isWhitespaceExceptNewline() &&
-        (codePointAtEnd.isWhitespace() || codePointAtEnd.isPunctuation())
+    if (
+        codePointBeforeStart.isWhitespaceExceptNewline() &&
+            (codePointAtEnd.isWhitespace() || codePointAtEnd.isPunctuation())
     ) {
         // Remove whitespace (except new lines) before the deleted text, in these cases:
         // - There is whitespace following the deleted text
@@ -822,9 +828,9 @@
         return TextRange(start, end)
     }
 
-    if (codePointAtEnd.isWhitespaceExceptNewline() &&
-        (codePointBeforeStart.isWhitespace() ||
-            codePointBeforeStart.isPunctuation())
+    if (
+        codePointAtEnd.isWhitespaceExceptNewline() &&
+            (codePointBeforeStart.isWhitespace() || codePointBeforeStart.isPunctuation())
     ) {
         // Remove whitespace (except new lines) after the deleted text, in these cases:
         // - There is punctuation preceding the deleted text
@@ -847,8 +853,8 @@
 }
 
 /**
- *  This helper method is copied from [android.text.TextUtils].
- *  It returns true if the code point is a new line.
+ * This helper method is copied from [android.text.TextUtils]. It returns true if the code point is
+ * a new line.
  */
 private fun Int.isNewline(): Boolean {
     val type = Character.getType(this)
@@ -858,25 +864,24 @@
 }
 
 /**
- *  This helper method is copied from [android.text.TextUtils].
- *  It returns true if the code point is a whitespace.
+ * This helper method is copied from [android.text.TextUtils]. It returns true if the code point is
+ * a whitespace.
  */
 private fun Int.isWhitespace(): Boolean {
-    return Character.isWhitespace(this) ||
-        this == NBSP_CODE_POINT
+    return Character.isWhitespace(this) || this == NBSP_CODE_POINT
 }
 
 /**
- *  This helper method is copied from [android.text.TextUtils].
- *  It returns true if the code point is a whitespace and not a new line.
+ * This helper method is copied from [android.text.TextUtils]. It returns true if the code point is
+ * a whitespace and not a new line.
  */
 private fun Int.isWhitespaceExceptNewline(): Boolean {
     return isWhitespace() && !isNewline()
 }
 
 /**
- *  This helper method is copied from [android.text.TextUtils].
- *  It returns true if the code point is a punctuation.
+ * This helper method is copied from [android.text.TextUtils]. It returns true if the code point is
+ * a punctuation.
  */
 private fun Int.isPunctuation(): Boolean {
     val type = Character.getType(this)
@@ -896,12 +901,14 @@
     granularity: TextGranularity,
     inclusionStrategy: TextInclusionStrategy
 ): TextRange {
-    return layoutResult?.multiParagraph.getRangeForScreenRect(
-        rectInScreen,
-        textLayoutNodeCoordinates,
-        granularity,
-        inclusionStrategy
-    )
+    return layoutResult
+        ?.multiParagraph
+        .getRangeForScreenRect(
+            rectInScreen,
+            textLayoutNodeCoordinates,
+            granularity,
+            inclusionStrategy
+        )
 }
 
 private fun TextLayoutState.getRangeForScreenRects(
@@ -910,21 +917,15 @@
     granularity: TextGranularity,
     inclusionStrategy: TextInclusionStrategy
 ): TextRange {
-    val startRange = getRangeForScreenRect(
-        startRectInScreen,
-        granularity,
-        inclusionStrategy
-    ).apply {
-        if (collapsed) return TextRange.Zero
-    }
+    val startRange =
+        getRangeForScreenRect(startRectInScreen, granularity, inclusionStrategy).apply {
+            if (collapsed) return TextRange.Zero
+        }
 
-    val endRange = getRangeForScreenRect(
-        endRectInScreen,
-        granularity,
-        inclusionStrategy
-    ).apply {
-        if (collapsed) return TextRange.Zero
-    }
+    val endRange =
+        getRangeForScreenRect(endRectInScreen, granularity, inclusionStrategy).apply {
+            if (collapsed) return TextRange.Zero
+        }
 
     return enclosure(startRange, endRange)
 }
@@ -934,12 +935,10 @@
     granularity: TextGranularity,
     inclusionStrategy: TextInclusionStrategy
 ): TextRange {
-    return layoutResult?.value?.multiParagraph.getRangeForScreenRect(
-        rectInScreen,
-        layoutCoordinates,
-        granularity,
-        inclusionStrategy
-    )
+    return layoutResult
+        ?.value
+        ?.multiParagraph
+        .getRangeForScreenRect(rectInScreen, layoutCoordinates, granularity, inclusionStrategy)
 }
 
 private fun LegacyTextFieldState.getRangeForScreenRects(
@@ -948,21 +947,15 @@
     granularity: TextGranularity,
     inclusionStrategy: TextInclusionStrategy
 ): TextRange {
-    val startRange = getRangeForScreenRect(
-        startRectInScreen,
-        granularity,
-        inclusionStrategy
-    ).apply {
-        if (collapsed) return TextRange.Zero
-    }
+    val startRange =
+        getRangeForScreenRect(startRectInScreen, granularity, inclusionStrategy).apply {
+            if (collapsed) return TextRange.Zero
+        }
 
-    val endRange = getRangeForScreenRect(
-        endRectInScreen,
-        granularity,
-        inclusionStrategy
-    ).apply {
-        if (collapsed) return TextRange.Zero
-    }
+    val endRange =
+        getRangeForScreenRect(endRectInScreen, granularity, inclusionStrategy).apply {
+            if (collapsed) return TextRange.Zero
+        }
 
     return enclosure(startRange, endRange)
 }
@@ -995,22 +988,23 @@
     pointInScreen: Offset,
     viewConfiguration: ViewConfiguration?
 ): Int {
-    return layoutResult?.multiParagraph?.getOffsetForHandwritingGesture(
-        pointInScreen,
-        textLayoutNodeCoordinates,
-        viewConfiguration
-    ) ?: -1
+    return layoutResult
+        ?.multiParagraph
+        ?.getOffsetForHandwritingGesture(
+            pointInScreen,
+            textLayoutNodeCoordinates,
+            viewConfiguration
+        ) ?: -1
 }
 
 private fun LegacyTextFieldState.getOffsetForHandwritingGesture(
     pointInScreen: Offset,
     viewConfiguration: ViewConfiguration
 ): Int {
-    return layoutResult?.value?.multiParagraph?.getOffsetForHandwritingGesture(
-        pointInScreen,
-        layoutCoordinates,
-        viewConfiguration
-    ) ?: -1
+    return layoutResult
+        ?.value
+        ?.multiParagraph
+        ?.getOffsetForHandwritingGesture(pointInScreen, layoutCoordinates, viewConfiguration) ?: -1
 }
 
 private fun TextLayoutResult.isBiDiBoundary(offset: Int): Boolean {
@@ -1071,23 +1065,26 @@
         if (endLine == -1) return TextRange.Zero
         line = endLine
     } else {
-        line = if (endLine == -1) {
-            startLine
-        } else {
-            // RemoveSpaceGesture is a single line gesture, it can't be applied for multiple lines.
-            // If start point and end point belongs to different lines, select the top line.
-            min(startLine, endLine)
-        }
+        line =
+            if (endLine == -1) {
+                startLine
+            } else {
+                // RemoveSpaceGesture is a single line gesture, it can't be applied for multiple
+                // lines.
+                // If start point and end point belongs to different lines, select the top line.
+                min(startLine, endLine)
+            }
     }
 
     val lineCenter = (getLineTop(line) + getLineBottom(line)) / 2
 
-    val rect = Rect(
-        left = min(localStartPoint.x, localEndPoint.x),
-        top = lineCenter - 0.1f,
-        right = max(localStartPoint.x, localEndPoint.x),
-        bottom = lineCenter + 0.1f
-    )
+    val rect =
+        Rect(
+            left = min(localStartPoint.x, localEndPoint.x),
+            top = lineCenter - 0.1f,
+            right = max(localStartPoint.x, localEndPoint.x),
+            bottom = lineCenter + 0.1f
+        )
 
     return multiParagraph.getRangeForRect(
         rect,
@@ -1103,8 +1100,9 @@
     val lineMargin = viewConfiguration?.handwritingGestureLineMargin ?: 0f
     val line = getLineForVerticalPosition(localPoint.y)
 
-    if (localPoint.y < getLineTop(line) - lineMargin ||
-        localPoint.y > getLineBottom(line) + lineMargin
+    if (
+        localPoint.y < getLineTop(line) - lineMargin ||
+            localPoint.y > getLineBottom(line) + lineMargin
     ) {
         // The point is not within lineMargin of a line.
         return -1
diff --git a/compose/foundation/foundation/src/androidMain/kotlin/androidx/compose/foundation/text/input/internal/InputEventCallback2.android.kt b/compose/foundation/foundation/src/androidMain/kotlin/androidx/compose/foundation/text/input/internal/InputEventCallback2.android.kt
index 39d6592..4197ae6 100644
--- a/compose/foundation/foundation/src/androidMain/kotlin/androidx/compose/foundation/text/input/internal/InputEventCallback2.android.kt
+++ b/compose/foundation/foundation/src/androidMain/kotlin/androidx/compose/foundation/text/input/internal/InputEventCallback2.android.kt
@@ -20,9 +20,7 @@
 import androidx.compose.ui.text.input.EditCommand
 import androidx.compose.ui.text.input.ImeAction
 
-/**
- * An interface of listening IME events.
- */
+/** An interface of listening IME events. */
 internal interface InputEventCallback2 {
     /**
      * Called when IME sends some input events.
@@ -38,9 +36,7 @@
      */
     fun onImeAction(imeAction: ImeAction)
 
-    /**
-     * Called when IME triggered a KeyEvent
-     */
+    /** Called when IME triggered a KeyEvent */
     fun onKeyEvent(event: KeyEvent)
 
     /**
diff --git a/compose/foundation/foundation/src/androidMain/kotlin/androidx/compose/foundation/text/input/internal/InputMethodManager.android.kt b/compose/foundation/foundation/src/androidMain/kotlin/androidx/compose/foundation/text/input/internal/InputMethodManager.android.kt
index 9aaa89a..9fcfb95 100644
--- a/compose/foundation/foundation/src/androidMain/kotlin/androidx/compose/foundation/text/input/internal/InputMethodManager.android.kt
+++ b/compose/foundation/foundation/src/androidMain/kotlin/androidx/compose/foundation/text/input/internal/InputMethodManager.android.kt
@@ -35,10 +35,7 @@
 
     fun hideSoftInput()
 
-    fun updateExtractedText(
-        token: Int,
-        extractedText: ExtractedText
-    )
+    fun updateExtractedText(token: Int, extractedText: ExtractedText)
 
     fun updateSelection(
         selectionStart: Int,
@@ -53,18 +50,18 @@
 }
 
 /**
- * Wrapper class to prevent depending on getSystemService and final InputMethodManager.
- * Let's us test TextInputServiceAndroid class.
+ * Wrapper class to prevent depending on getSystemService and final InputMethodManager. Let's us
+ * test TextInputServiceAndroid class.
  */
 internal class InputMethodManagerImpl(private val view: View) : InputMethodManager {
 
-    private val imm by lazy(LazyThreadSafetyMode.NONE) {
-        view.context.getSystemService(Context.INPUT_METHOD_SERVICE)
-            as android.view.inputmethod.InputMethodManager
-    }
+    private val imm by
+        lazy(LazyThreadSafetyMode.NONE) {
+            view.context.getSystemService(Context.INPUT_METHOD_SERVICE)
+                as android.view.inputmethod.InputMethodManager
+        }
 
-    private val softwareKeyboardControllerCompat =
-        SoftwareKeyboardControllerCompat(view)
+    private val softwareKeyboardControllerCompat = SoftwareKeyboardControllerCompat(view)
 
     override fun isActive(): Boolean = imm.isActive(view)
 
@@ -84,10 +81,7 @@
         softwareKeyboardControllerCompat.hide()
     }
 
-    override fun updateExtractedText(
-        token: Int,
-        extractedText: ExtractedText
-    ) {
+    override fun updateExtractedText(token: Int, extractedText: ExtractedText) {
         imm.updateExtractedText(view, token, extractedText)
     }
 
diff --git a/compose/foundation/foundation/src/androidMain/kotlin/androidx/compose/foundation/text/input/internal/LegacyCursorAnchorInfoBuilder.android.kt b/compose/foundation/foundation/src/androidMain/kotlin/androidx/compose/foundation/text/input/internal/LegacyCursorAnchorInfoBuilder.android.kt
index 6e0d405..902fefc 100644
--- a/compose/foundation/foundation/src/androidMain/kotlin/androidx/compose/foundation/text/input/internal/LegacyCursorAnchorInfoBuilder.android.kt
+++ b/compose/foundation/foundation/src/androidMain/kotlin/androidx/compose/foundation/text/input/internal/LegacyCursorAnchorInfoBuilder.android.kt
@@ -145,10 +145,9 @@
     val endOffsetTransformed = offsetMapping.originalToTransformed(endOffset)
     val array = FloatArray((endOffsetTransformed - startOffsetTransformed) * 4)
     textLayoutResult.multiParagraph.fillBoundingBoxes(
-        TextRange(
-            startOffsetTransformed,
-            endOffsetTransformed
-        ), array, 0
+        TextRange(startOffsetTransformed, endOffsetTransformed),
+        array,
+        0
     )
 
     for (offset in startOffset until endOffset) {
@@ -173,7 +172,7 @@
         }
         if (
             !innerTextFieldBounds.containsInclusive(rect.left, rect.top) ||
-            !innerTextFieldBounds.containsInclusive(rect.right, rect.bottom)
+                !innerTextFieldBounds.containsInclusive(rect.right, rect.bottom)
         ) {
             flags = flags or CursorAnchorInfo.FLAG_HAS_INVISIBLE_REGION
         }
diff --git a/compose/foundation/foundation/src/androidMain/kotlin/androidx/compose/foundation/text/input/internal/LegacyCursorAnchorInfoController.android.kt b/compose/foundation/foundation/src/androidMain/kotlin/androidx/compose/foundation/text/input/internal/LegacyCursorAnchorInfoController.android.kt
index fdc08c8..c210151 100644
--- a/compose/foundation/foundation/src/androidMain/kotlin/androidx/compose/foundation/text/input/internal/LegacyCursorAnchorInfoController.android.kt
+++ b/compose/foundation/foundation/src/androidMain/kotlin/androidx/compose/foundation/text/input/internal/LegacyCursorAnchorInfoController.android.kt
@@ -72,20 +72,21 @@
         includeCharacterBounds: Boolean,
         includeEditorBounds: Boolean,
         includeLineBounds: Boolean
-    ) = synchronized(lock) {
-        this.includeInsertionMarker = includeInsertionMarker
-        this.includeCharacterBounds = includeCharacterBounds
-        this.includeEditorBounds = includeEditorBounds
-        this.includeLineBounds = includeLineBounds
+    ) =
+        synchronized(lock) {
+            this.includeInsertionMarker = includeInsertionMarker
+            this.includeCharacterBounds = includeCharacterBounds
+            this.includeEditorBounds = includeEditorBounds
+            this.includeLineBounds = includeLineBounds
 
-        if (immediate) {
-            hasPendingImmediateRequest = true
-            if (textFieldValue != null) {
-                updateCursorAnchorInfo()
+            if (immediate) {
+                hasPendingImmediateRequest = true
+                if (textFieldValue != null) {
+                    updateCursorAnchorInfo()
+                }
             }
+            monitorEnabled = monitor
         }
-        monitorEnabled = monitor
-    }
 
     /**
      * Notify the controller of layout and position changes.
@@ -93,8 +94,8 @@
      * @param textFieldValue the text field's [TextFieldValue]
      * @param offsetMapping the offset mapping for the visual transformation
      * @param textLayoutResult the text field's [TextLayoutResult]
-     * @param innerTextFieldBounds visible bounds of the text field in text layout coordinates,
-     *   an empty rectangle if the text field is not visible
+     * @param innerTextFieldBounds visible bounds of the text field in text layout coordinates, an
+     *   empty rectangle if the text field is not visible
      * @param decorationBoxBounds visible bounds of the decoration box in text layout coordinates,
      *   or an empty rectangle if the decoration box is not visible
      */
@@ -104,17 +105,18 @@
         textLayoutResult: TextLayoutResult,
         innerTextFieldBounds: Rect,
         decorationBoxBounds: Rect
-    ) = synchronized(lock) {
-        this.textFieldValue = textFieldValue
-        this.offsetMapping = offsetMapping
-        this.textLayoutResult = textLayoutResult
-        this.innerTextFieldBounds = innerTextFieldBounds
-        this.decorationBoxBounds = decorationBoxBounds
+    ) =
+        synchronized(lock) {
+            this.textFieldValue = textFieldValue
+            this.offsetMapping = offsetMapping
+            this.textLayoutResult = textLayoutResult
+            this.innerTextFieldBounds = innerTextFieldBounds
+            this.decorationBoxBounds = decorationBoxBounds
 
-        if (hasPendingImmediateRequest || monitorEnabled) {
-            updateCursorAnchorInfo()
+            if (hasPendingImmediateRequest || monitorEnabled) {
+                updateCursorAnchorInfo()
+            }
         }
-    }
 
     /**
      * Invalidate the last received layout and position data.
@@ -123,13 +125,14 @@
      * position data is no longer valid. [CursorAnchorInfo] updates will not be sent until new
      * layout and position data is received.
      */
-    fun invalidate() = synchronized(lock) {
-        textFieldValue = null
-        offsetMapping = null
-        textLayoutResult = null
-        innerTextFieldBounds = null
-        decorationBoxBounds = null
-    }
+    fun invalidate() =
+        synchronized(lock) {
+            textFieldValue = null
+            offsetMapping = null
+            textLayoutResult = null
+            innerTextFieldBounds = null
+            decorationBoxBounds = null
+        }
 
     private fun updateCursorAnchorInfo() {
         if (!inputMethodManager.isActive()) return
diff --git a/compose/foundation/foundation/src/androidMain/kotlin/androidx/compose/foundation/text/input/internal/LegacyPlatformTextInputServiceAdapter.android.kt b/compose/foundation/foundation/src/androidMain/kotlin/androidx/compose/foundation/text/input/internal/LegacyPlatformTextInputServiceAdapter.android.kt
index c5796f5..b26bda3 100644
--- a/compose/foundation/foundation/src/androidMain/kotlin/androidx/compose/foundation/text/input/internal/LegacyPlatformTextInputServiceAdapter.android.kt
+++ b/compose/foundation/foundation/src/androidMain/kotlin/androidx/compose/foundation/text/input/internal/LegacyPlatformTextInputServiceAdapter.android.kt
@@ -76,9 +76,10 @@
                 return null
             }
             return MutableSharedFlow<Unit>(
-                replay = 1,
-                onBufferOverflow = BufferOverflow.DROP_LATEST
-            ).also { backingStylusHandwritingTrigger = it }
+                    replay = 1,
+                    onBufferOverflow = BufferOverflow.DROP_LATEST
+                )
+                .also { backingStylusHandwritingTrigger = it }
         }
 
     override fun startInput(
@@ -119,36 +120,38 @@
 
         // No need to cancel any previous job, the text input system ensures the previous session
         // will be cancelled.
-        job = node.launchTextInputSession {
-            coroutineScope {
-                val inputMethodManager = inputMethodManagerFactory(view)
-                val request = LegacyTextInputMethodRequest(
-                    view = view,
-                    localToScreen = ::localToScreen,
-                    inputMethodManager = inputMethodManager
-                )
+        job =
+            node.launchTextInputSession {
+                coroutineScope {
+                    val inputMethodManager = inputMethodManagerFactory(view)
+                    val request =
+                        LegacyTextInputMethodRequest(
+                            view = view,
+                            localToScreen = ::localToScreen,
+                            inputMethodManager = inputMethodManager
+                        )
 
-                if (isStylusHandwritingSupported) {
-                    launch {
-                        // When the editor is just focused, we need to wait for imm.startInput
-                        // before calling startStylusHandwriting. We need to wait for one frame
-                        // because TextInputService.startInput also waits for one frame before
-                        // actually calling imm.restartInput.
-                        withFrameMillis { }
-                        stylusHandwritingTrigger?.collect {
-                            inputMethodManager.startStylusHandwriting()
+                    if (isStylusHandwritingSupported) {
+                        launch {
+                            // When the editor is just focused, we need to wait for imm.startInput
+                            // before calling startStylusHandwriting. We need to wait for one frame
+                            // because TextInputService.startInput also waits for one frame before
+                            // actually calling imm.restartInput.
+                            withFrameMillis {}
+                            stylusHandwritingTrigger?.collect {
+                                inputMethodManager.startStylusHandwriting()
+                            }
                         }
                     }
-                }
-                initializeRequest?.invoke(request)
-                currentRequest = request
-                try {
-                    startInputMethod(request)
-                } finally {
-                    currentRequest = null
+                    initializeRequest?.invoke(request)
+                    currentRequest = request
+                    try {
+                        startInputMethod(request)
+                    } finally {
+                        currentRequest = null
+                    }
                 }
             }
-        }
     }
 
     @OptIn(ExperimentalCoroutinesApi::class)
@@ -187,17 +190,15 @@
     }
 
     /**
-     * Signal the InputMethodManager to startStylusHandwriting. This method can be called
-     * after the editor calls startInput or just before the editor calls startInput.
+     * Signal the InputMethodManager to startStylusHandwriting. This method can be called after the
+     * editor calls startInput or just before the editor calls startInput.
      */
     override fun startStylusHandwriting() {
         stylusHandwritingTrigger?.tryEmit(Unit)
     }
 }
 
-/**
- * Provide Android specific input service with the Operating System.
- */
+/** Provide Android specific input service with the Operating System. */
 internal class LegacyTextInputMethodRequest(
     val view: View,
     localToScreen: (Matrix) -> Unit,
@@ -217,6 +218,7 @@
     // Visible for testing
     var state = TextFieldValue(text = "", selection = TextRange.Zero)
         private set
+
     private var imeOptions = ImeOptions.Default
 
     /**
@@ -228,9 +230,8 @@
     private var ics = mutableListOf<WeakReference<RecordingInputConnection>>()
 
     /** Used for sendKeyEvent delegation */
-    private val baseInputConnection by lazy(LazyThreadSafetyMode.NONE) {
-        BaseInputConnection(view, false)
-    }
+    private val baseInputConnection by
+        lazy(LazyThreadSafetyMode.NONE) { BaseInputConnection(view, false) }
 
     // Visible for testing.
     internal var focusedRect: AndroidRect? = null
@@ -265,57 +266,59 @@
         outAttributes.updateWithEmojiCompat()
 
         return RecordingInputConnection(
-            initState = state,
-            autoCorrect = imeOptions.autoCorrect,
-            eventCallback = object : InputEventCallback2 {
-                override fun onEditCommands(editCommands: List<EditCommand>) {
-                    onEditCommand(editCommands)
-                }
-
-                override fun onImeAction(imeAction: ImeAction) {
-                    onImeActionPerformed(imeAction)
-                }
-
-                override fun onKeyEvent(event: KeyEvent) {
-                    baseInputConnection.sendKeyEvent(event)
-                }
-
-                override fun onRequestCursorAnchorInfo(
-                    immediate: Boolean,
-                    monitor: Boolean,
-                    includeInsertionMarker: Boolean,
-                    includeCharacterBounds: Boolean,
-                    includeEditorBounds: Boolean,
-                    includeLineBounds: Boolean
-                ) {
-                    cursorAnchorInfoController.requestUpdate(
-                        immediate,
-                        monitor,
-                        includeInsertionMarker,
-                        includeCharacterBounds,
-                        includeEditorBounds,
-                        includeLineBounds
-                    )
-                }
-
-                override fun onConnectionClosed(inputConnection: RecordingInputConnection) {
-                    for (i in 0 until ics.size) {
-                        if (ics[i].get() == inputConnection) {
-                            ics.removeAt(i)
-                            return // No duplicated instances should be in the list.
+                initState = state,
+                autoCorrect = imeOptions.autoCorrect,
+                eventCallback =
+                    object : InputEventCallback2 {
+                        override fun onEditCommands(editCommands: List<EditCommand>) {
+                            onEditCommand(editCommands)
                         }
-                    }
+
+                        override fun onImeAction(imeAction: ImeAction) {
+                            onImeActionPerformed(imeAction)
+                        }
+
+                        override fun onKeyEvent(event: KeyEvent) {
+                            baseInputConnection.sendKeyEvent(event)
+                        }
+
+                        override fun onRequestCursorAnchorInfo(
+                            immediate: Boolean,
+                            monitor: Boolean,
+                            includeInsertionMarker: Boolean,
+                            includeCharacterBounds: Boolean,
+                            includeEditorBounds: Boolean,
+                            includeLineBounds: Boolean
+                        ) {
+                            cursorAnchorInfoController.requestUpdate(
+                                immediate,
+                                monitor,
+                                includeInsertionMarker,
+                                includeCharacterBounds,
+                                includeEditorBounds,
+                                includeLineBounds
+                            )
+                        }
+
+                        override fun onConnectionClosed(inputConnection: RecordingInputConnection) {
+                            for (i in 0 until ics.size) {
+                                if (ics[i].get() == inputConnection) {
+                                    ics.removeAt(i)
+                                    return // No duplicated instances should be in the list.
+                                }
+                            }
+                        }
+                    },
+                legacyTextFieldState = legacyTextFieldState,
+                textFieldSelectionManager = textFieldSelectionManager,
+                viewConfiguration = viewConfiguration
+            )
+            .also {
+                ics.add(WeakReference(it))
+                if (DEBUG) {
+                    Log.d(TAG, "$DEBUG_CLASS.createInputConnection: $ics")
                 }
-            },
-            legacyTextFieldState = legacyTextFieldState,
-            textFieldSelectionManager = textFieldSelectionManager,
-            viewConfiguration = viewConfiguration
-        ).also {
-            ics.add(WeakReference(it))
-            if (DEBUG) {
-                Log.d(TAG, "$DEBUG_CLASS.createInputConnection: $ics")
             }
-        }
     }
 
     fun updateState(oldValue: TextFieldValue?, newValue: TextFieldValue) {
@@ -326,8 +329,9 @@
         // If the selection has changed from the last time, we need to update selection even though
         // the oldValue in EditBuffer is already in sync with the newValue.
         // Same holds for composition b/207800945
-        val needUpdateSelection = (this.state.selection != newValue.selection) ||
-            this.state.composition != newValue.composition
+        val needUpdateSelection =
+            (this.state.selection != newValue.selection) ||
+                this.state.composition != newValue.composition
         this.state = newValue
         // update the latest TextFieldValue in InputConnection
         for (i in 0 until ics.size) {
@@ -351,11 +355,13 @@
             return
         }
 
-        val restartInput = oldValue?.let {
-            it.text != newValue.text ||
-                // when selection is the same but composition has changed, need to reset the input.
-                (it.selection == newValue.selection && it.composition != newValue.composition)
-        } ?: false
+        val restartInput =
+            oldValue?.let {
+                it.text != newValue.text ||
+                    // when selection is the same but composition has changed, need to reset the
+                    // input.
+                    (it.selection == newValue.selection && it.composition != newValue.composition)
+            } ?: false
 
         if (DEBUG) {
             Log.d(TAG, "$DEBUG_CLASS.updateState: restart($restartInput), state: $state")
@@ -371,12 +377,13 @@
     }
 
     fun notifyFocusedRect(rect: Rect) {
-        focusedRect = AndroidRect(
-            rect.left.roundToInt(),
-            rect.top.roundToInt(),
-            rect.right.roundToInt(),
-            rect.bottom.roundToInt()
-        )
+        focusedRect =
+            AndroidRect(
+                rect.left.roundToInt(),
+                rect.top.roundToInt(),
+                rect.right.roundToInt(),
+                rect.bottom.roundToInt()
+            )
 
         // Requesting rectangle too early after obtaining focus may bring view into wrong place
         // probably due to transient IME inset change. We don't know the correct timing of calling
@@ -416,9 +423,7 @@
     }
 }
 
-/**
- * Call to update EditorInfo correctly when EmojiCompat is configured.
- */
+/** Call to update EditorInfo correctly when EmojiCompat is configured. */
 private fun EditorInfo.updateWithEmojiCompat() {
     if (!EmojiCompat.isConfigured()) {
         return
diff --git a/compose/foundation/foundation/src/androidMain/kotlin/androidx/compose/foundation/text/input/internal/RecordingInputConnection.android.kt b/compose/foundation/foundation/src/androidMain/kotlin/androidx/compose/foundation/text/input/internal/RecordingInputConnection.android.kt
index 34e71cb..f942faf 100644
--- a/compose/foundation/foundation/src/androidMain/kotlin/androidx/compose/foundation/text/input/internal/RecordingInputConnection.android.kt
+++ b/compose/foundation/foundation/src/androidMain/kotlin/androidx/compose/foundation/text/input/internal/RecordingInputConnection.android.kt
@@ -81,7 +81,9 @@
     /** The input state. */
     internal var textFieldValue: TextFieldValue = initState
         set(value) {
-            if (DEBUG) { logDebug("mTextFieldValue : $field -> $value") }
+            if (DEBUG) {
+                logDebug("mTextFieldValue : $field -> $value")
+            }
             field = value
         }
 
@@ -125,7 +127,9 @@
     ) {
         if (!isActive) return
 
-        if (DEBUG) { logDebug("RecordingInputConnection.updateInputState: $state") }
+        if (DEBUG) {
+            logDebug("RecordingInputConnection.updateInputState: $state")
+        }
 
         textFieldValue = state
 
@@ -147,7 +151,10 @@
             )
         }
         inputMethodManager.updateSelection(
-            state.selection.min, state.selection.max, compositionStart, compositionEnd
+            state.selection.min,
+            state.selection.max,
+            compositionStart,
+            compositionEnd
         )
     }
 
@@ -164,7 +171,9 @@
     // region Callbacks for text editing session
 
     override fun beginBatchEdit(): Boolean = ensureActive {
-        if (DEBUG) { logDebug("beginBatchEdit()") }
+        if (DEBUG) {
+            logDebug("beginBatchEdit()")
+        }
         return beginBatchEditInternal()
     }
 
@@ -174,7 +183,9 @@
     }
 
     override fun endBatchEdit(): Boolean {
-        if (DEBUG) { logDebug("endBatchEdit()") }
+        if (DEBUG) {
+            logDebug("endBatchEdit()")
+        }
         return endBatchEditInternal()
     }
 
@@ -188,7 +199,9 @@
     }
 
     override fun closeConnection() {
-        if (DEBUG) { logDebug("closeConnection()") }
+        if (DEBUG) {
+            logDebug("closeConnection()")
+        }
         editCommands.clear()
         batchDepth = 0
         isActive = false
@@ -199,12 +212,16 @@
     // region Callbacks for text editing
 
     override fun commitText(text: CharSequence?, newCursorPosition: Int): Boolean = ensureActive {
-        if (DEBUG) { logDebug("commitText(\"$text\", $newCursorPosition)") }
+        if (DEBUG) {
+            logDebug("commitText(\"$text\", $newCursorPosition)")
+        }
         addEditCommandWithBatch(CommitTextCommand(text.toString(), newCursorPosition))
     }
 
     override fun setComposingRegion(start: Int, end: Int): Boolean = ensureActive {
-        if (DEBUG) { logDebug("setComposingRegion($start, $end)") }
+        if (DEBUG) {
+            logDebug("setComposingRegion($start, $end)")
+        }
         addEditCommandWithBatch(SetComposingRegionCommand(start, end))
     }
 
@@ -229,25 +246,33 @@
 
     override fun deleteSurroundingText(beforeLength: Int, afterLength: Int): Boolean =
         ensureActive {
-            if (DEBUG) { logDebug("deleteSurroundingText($beforeLength, $afterLength)") }
+            if (DEBUG) {
+                logDebug("deleteSurroundingText($beforeLength, $afterLength)")
+            }
             addEditCommandWithBatch(DeleteSurroundingTextCommand(beforeLength, afterLength))
             return true
         }
 
     override fun setSelection(start: Int, end: Int): Boolean = ensureActive {
-        if (DEBUG) { logDebug("setSelection($start, $end)") }
+        if (DEBUG) {
+            logDebug("setSelection($start, $end)")
+        }
         addEditCommandWithBatch(SetSelectionCommand(start, end))
         return true
     }
 
     override fun finishComposingText(): Boolean = ensureActive {
-        if (DEBUG) { logDebug("finishComposingText()") }
+        if (DEBUG) {
+            logDebug("finishComposingText()")
+        }
         addEditCommandWithBatch(FinishComposingTextCommand())
         return true
     }
 
     override fun sendKeyEvent(event: KeyEvent): Boolean = ensureActive {
-        if (DEBUG) { logDebug("sendKeyEvent($event)") }
+        if (DEBUG) {
+            logDebug("sendKeyEvent($event)")
+        }
         eventCallback.onKeyEvent(event)
         return true
     }
@@ -258,26 +283,33 @@
     override fun getTextBeforeCursor(maxChars: Int, flags: Int): CharSequence {
         // TODO(b/135556699) should return styled text
         val result = textFieldValue.getTextBeforeSelection(maxChars).toString()
-        if (DEBUG) { logDebug("getTextBeforeCursor($maxChars, $flags): $result") }
+        if (DEBUG) {
+            logDebug("getTextBeforeCursor($maxChars, $flags): $result")
+        }
         return result
     }
 
     override fun getTextAfterCursor(maxChars: Int, flags: Int): CharSequence {
         // TODO(b/135556699) should return styled text
         val result = textFieldValue.getTextAfterSelection(maxChars).toString()
-        if (DEBUG) { logDebug("getTextAfterCursor($maxChars, $flags): $result") }
+        if (DEBUG) {
+            logDebug("getTextAfterCursor($maxChars, $flags): $result")
+        }
         return result
     }
 
     override fun getSelectedText(flags: Int): CharSequence? {
         // https://source.chromium.org/chromium/chromium/src/+/master:content/public/android/java/src/org/chromium/content/browser/input/TextInputState.java;l=56;drc=0e20d1eb38227949805a4c0e9d5cdeddc8d23637
-        val result: CharSequence? = if (textFieldValue.selection.collapsed) {
-            null
-        } else {
-            // TODO(b/135556699) should return styled text
-            textFieldValue.getSelectedText().toString()
+        val result: CharSequence? =
+            if (textFieldValue.selection.collapsed) {
+                null
+            } else {
+                // TODO(b/135556699) should return styled text
+                textFieldValue.getSelectedText().toString()
+            }
+        if (DEBUG) {
+            logDebug("getSelectedText($flags): $result")
         }
-        if (DEBUG) { logDebug("getSelectedText($flags): $result") }
         return result
     }
 
@@ -336,7 +368,9 @@
     }
 
     override fun getExtractedText(request: ExtractedTextRequest?, flags: Int): ExtractedText {
-        if (DEBUG) { logDebug("getExtractedText($request, $flags)") }
+        if (DEBUG) {
+            logDebug("getExtractedText($request, $flags)")
+        }
         extractedTextMonitorMode = (flags and InputConnection.GET_EXTRACTED_TEXT_MONITOR) != 0
         if (extractedTextMonitorMode) {
             currentExtractedTextRequestToken = request?.token ?: 0
@@ -347,7 +381,6 @@
         if (DEBUG) {
             with(extractedText) {
                 logDebug(
-
                     "getExtractedText() return: text: \"$text\"" +
                         ",partialStartOffset $partialStartOffset" +
                         ",partialEndOffset $partialEndOffset" +
@@ -365,7 +398,9 @@
     // region Editor action and Key events.
 
     override fun performContextMenuAction(id: Int): Boolean = ensureActive {
-        if (DEBUG) { logDebug("performContextMenuAction($id)") }
+        if (DEBUG) {
+            logDebug("performContextMenuAction($id)")
+        }
         when (id) {
             android.R.id.selectAll -> {
                 addEditCommandWithBatch(SetSelectionCommand(0, textFieldValue.text.length))
@@ -391,20 +426,23 @@
     }
 
     override fun performEditorAction(editorAction: Int): Boolean = ensureActive {
-        if (DEBUG) { logDebug("performEditorAction($editorAction)") }
-        val imeAction = when (editorAction) {
-            EditorInfo.IME_ACTION_UNSPECIFIED -> ImeAction.Default
-            EditorInfo.IME_ACTION_DONE -> ImeAction.Done
-            EditorInfo.IME_ACTION_SEND -> ImeAction.Send
-            EditorInfo.IME_ACTION_SEARCH -> ImeAction.Search
-            EditorInfo.IME_ACTION_PREVIOUS -> ImeAction.Previous
-            EditorInfo.IME_ACTION_NEXT -> ImeAction.Next
-            EditorInfo.IME_ACTION_GO -> ImeAction.Go
-            else -> {
-                Log.w(TAG, "IME sends unsupported Editor Action: $editorAction")
-                ImeAction.Default
-            }
+        if (DEBUG) {
+            logDebug("performEditorAction($editorAction)")
         }
+        val imeAction =
+            when (editorAction) {
+                EditorInfo.IME_ACTION_UNSPECIFIED -> ImeAction.Default
+                EditorInfo.IME_ACTION_DONE -> ImeAction.Done
+                EditorInfo.IME_ACTION_SEND -> ImeAction.Send
+                EditorInfo.IME_ACTION_SEARCH -> ImeAction.Search
+                EditorInfo.IME_ACTION_PREVIOUS -> ImeAction.Previous
+                EditorInfo.IME_ACTION_NEXT -> ImeAction.Next
+                EditorInfo.IME_ACTION_GO -> ImeAction.Go
+                else -> {
+                    Log.w(TAG, "IME sends unsupported Editor Action: $editorAction")
+                    ImeAction.Default
+                }
+            }
         eventCallback.onImeAction(imeAction)
         return true
     }
@@ -414,7 +452,9 @@
         executor: Executor?,
         consumer: IntConsumer?
     ) {
-        if (DEBUG) { logDebug("performHandwritingGestures($gesture, $executor, $consumer)") }
+        if (DEBUG) {
+            logDebug("performHandwritingGestures($gesture, $executor, $consumer)")
+        }
         if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.UPSIDE_DOWN_CAKE) {
             Api34LegacyPerformHandwritingGestureImpl.performHandwritingGesture(
                 legacyTextFieldState,
@@ -433,7 +473,9 @@
         gesture: PreviewableHandwritingGesture,
         cancellationSignal: CancellationSignal?
     ): Boolean {
-        if (DEBUG) { logDebug("previewHandwritingGesture($gesture, $cancellationSignal)") }
+        if (DEBUG) {
+            logDebug("previewHandwritingGesture($gesture, $cancellationSignal)")
+        }
         if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.UPSIDE_DOWN_CAKE) {
             return Api34LegacyPerformHandwritingGestureImpl.previewHandwritingGesture(
                 legacyTextFieldState,
@@ -449,49 +491,65 @@
     // region Unsupported callbacks
 
     override fun commitCompletion(text: CompletionInfo?): Boolean = ensureActive {
-        if (DEBUG) { logDebug("commitCompletion(${text?.text})") }
+        if (DEBUG) {
+            logDebug("commitCompletion(${text?.text})")
+        }
         // We don't support this callback.
         // The API documents says this should return if the input connection is no longer valid, but
         // The Chromium implementation already returning false, so assuming it is safe to return
         // false if not supported.
-        // see https://cs.chromium.org/chromium/src/content/public/android/java/src/org/chromium/content/browser/input/ThreadedInputConnection.java
+        // see
+        // https://cs.chromium.org/chromium/src/content/public/android/java/src/org/chromium/content/browser/input/ThreadedInputConnection.java
         return false
     }
 
     override fun commitCorrection(correctionInfo: CorrectionInfo?): Boolean = ensureActive {
-        if (DEBUG) { logDebug("commitCorrection($correctionInfo),autoCorrect:$autoCorrect") }
+        if (DEBUG) {
+            logDebug("commitCorrection($correctionInfo),autoCorrect:$autoCorrect")
+        }
         // Should add an event here so that we can implement the autocorrect highlight
         // Bug: 170647219
         return autoCorrect
     }
 
     override fun getHandler(): Handler? {
-        if (DEBUG) { logDebug("getHandler()") }
+        if (DEBUG) {
+            logDebug("getHandler()")
+        }
         return null // Returns null means using default Handler
     }
 
     override fun clearMetaKeyStates(states: Int): Boolean = ensureActive {
-        if (DEBUG) { logDebug("clearMetaKeyStates($states)") }
+        if (DEBUG) {
+            logDebug("clearMetaKeyStates($states)")
+        }
         // We don't support this callback.
         // The API documents says this should return if the input connection is no longer valid, but
         // The Chromium implementation already returning false, so assuming it is safe to return
         // false if not supported.
-        // see https://cs.chromium.org/chromium/src/content/public/android/java/src/org/chromium/content/browser/input/ThreadedInputConnection.java
+        // see
+        // https://cs.chromium.org/chromium/src/content/public/android/java/src/org/chromium/content/browser/input/ThreadedInputConnection.java
         return false
     }
 
     override fun reportFullscreenMode(enabled: Boolean): Boolean {
-        if (DEBUG) { logDebug("reportFullscreenMode($enabled)") }
+        if (DEBUG) {
+            logDebug("reportFullscreenMode($enabled)")
+        }
         return false // This value is ignored according to the API docs.
     }
 
     override fun getCursorCapsMode(reqModes: Int): Int {
-        if (DEBUG) { logDebug("getCursorCapsMode($reqModes)") }
+        if (DEBUG) {
+            logDebug("getCursorCapsMode($reqModes)")
+        }
         return TextUtils.getCapsMode(textFieldValue.text, textFieldValue.selection.min, reqModes)
     }
 
     override fun performPrivateCommand(action: String?, data: Bundle?): Boolean = ensureActive {
-        if (DEBUG) { logDebug("performPrivateCommand($action, $data)") }
+        if (DEBUG) {
+            logDebug("performPrivateCommand($action, $data)")
+        }
         return true // API doc says we should return true even if we didn't understand the command.
     }
 
@@ -500,12 +558,16 @@
         flags: Int,
         opts: Bundle?
     ): Boolean = ensureActive {
-        if (DEBUG) { logDebug("commitContent($inputContentInfo, $flags, $opts)") }
+        if (DEBUG) {
+            logDebug("commitContent($inputContentInfo, $flags, $opts)")
+        }
         return false // We don't accept any contents.
     }
 
     private fun logDebug(message: String) {
-        if (DEBUG) { Log.d(TAG, "$DEBUG_CLASS.$message, $isActive") }
+        if (DEBUG) {
+            Log.d(TAG, "$DEBUG_CLASS.$message, $isActive")
+        }
     }
 
     // endregion
@@ -536,18 +598,17 @@
         consumer: IntConsumer?,
         editCommandConsumer: (EditCommand) -> Unit
     ) {
-        val result = legacyTextFieldState?.performHandwritingGesture(
-            gesture,
-            textFieldSelectionManager,
-            viewConfiguration,
-            editCommandConsumer
-        ) ?: InputConnection.HANDWRITING_GESTURE_RESULT_FAILED
+        val result =
+            legacyTextFieldState?.performHandwritingGesture(
+                gesture,
+                textFieldSelectionManager,
+                viewConfiguration,
+                editCommandConsumer
+            ) ?: InputConnection.HANDWRITING_GESTURE_RESULT_FAILED
 
         if (consumer == null) return
         if (executor != null) {
-            executor.execute {
-                consumer.accept(result)
-            }
+            executor.execute { consumer.accept(result) }
         } else {
             consumer.accept(result)
         }
diff --git a/compose/foundation/foundation/src/androidMain/kotlin/androidx/compose/foundation/text/input/internal/StatelessInputConnection.android.kt b/compose/foundation/foundation/src/androidMain/kotlin/androidx/compose/foundation/text/input/internal/StatelessInputConnection.android.kt
index 80be4a10..e06977f 100644
--- a/compose/foundation/foundation/src/androidMain/kotlin/androidx/compose/foundation/text/input/internal/StatelessInputConnection.android.kt
+++ b/compose/foundation/foundation/src/androidMain/kotlin/androidx/compose/foundation/text/input/internal/StatelessInputConnection.android.kt
@@ -57,8 +57,7 @@
 import java.util.concurrent.Executor
 import java.util.function.IntConsumer
 
-@VisibleForTesting
-internal const val SIC_DEBUG = false
+@VisibleForTesting internal const val SIC_DEBUG = false
 private const val STATELESS_TAG = "StatelessIC"
 private const val DEBUG_CLASS = "StatelessInputConnection"
 
@@ -69,8 +68,8 @@
  * InputConnections are requested and used by framework to create bridge from IME to an active
  * editor.
  *
- * @param editorInfo Required to create an InputConnection wrapper to support [commitContent] on
- * all API levels.
+ * @param editorInfo Required to create an InputConnection wrapper to support [commitContent] on all
+ *   API levels.
  */
 @OptIn(ExperimentalFoundationApi::class)
 internal class StatelessInputConnection(
@@ -82,21 +81,19 @@
      *
      * Sometimes InputConnection does not call begin/endBatchEdit functions before calling other
      * edit functions like commitText or setComposingText. StatelessInputConnection starts and
-     * finishes a new artificial batch for every EditCommand to make sure that there is always
-     * an ongoing batch. EditCommands are only applied when batchDepth reaches 0.
+     * finishes a new artificial batch for every EditCommand to make sure that there is always an
+     * ongoing batch. EditCommands are only applied when batchDepth reaches 0.
      */
     private var batchDepth: Int = 0
 
     /**
-     * The input state from the currently active [TextInputSession].
-     * Returns empty TextFieldValue if there is no active session.
+     * The input state from the currently active [TextInputSession]. Returns empty TextFieldValue if
+     * there is no active session.
      */
     private val text: TextFieldCharSequence
         get() = session.text
 
-    /**
-     * Recording of editing operations for batch editing
-     */
+    /** Recording of editing operations for batch editing */
     private val editCommands = mutableVectorOf<EditingBuffer.() -> Unit>()
 
     /**
@@ -139,8 +136,8 @@
     /**
      * Compose supports below API 25 where [commitContent] is not defined. Support libraries add
      * this functionality for IMEs and Editors via [InputConnectionCompat] and [EditorInfoCompat].
-     * To create an InputConnection that supports [commitContent] on all API levels, we need to
-     * wrap [StatelessInputConnection] using [InputConnectionCompat.createWrapper].
+     * To create an InputConnection that supports [commitContent] on all API levels, we need to wrap
+     * [StatelessInputConnection] using [InputConnectionCompat.createWrapper].
      *
      * We would like to send [commitContent] calls to the current listener
      * [TextInputSession.onCommitContent] we have in active input session. It is not possible to
@@ -153,46 +150,51 @@
      * @see commitContent
      */
     @Suppress("DEPRECATION")
-    private val commitContentDelegateInputConnection = InputConnectionCompat.createWrapper(
-        terminalInputConnection,
-        editorInfo,
-        object : OnCommitContentListener {
-            override fun onCommitContent(
-                inputContentInfo: InputContentInfoCompat,
-                flags: Int,
-                opts: Bundle?
-            ): Boolean {
-                // The below code is mostly copied from `InputConnectionCompat.java`
-                var extras: Bundle? = opts
-                if (Build.VERSION.SDK_INT >= 25 &&
-                    (flags and INPUT_CONTENT_GRANT_READ_URI_PERMISSION) != 0
-                ) {
-                    try {
-                        inputContentInfo.requestPermission()
-                    } catch (e: Exception) {
-                        logDebug("Can't insert content from IME; requestPermission() failed, $e")
-                        return false
+    private val commitContentDelegateInputConnection =
+        InputConnectionCompat.createWrapper(
+            terminalInputConnection,
+            editorInfo,
+            object : OnCommitContentListener {
+                override fun onCommitContent(
+                    inputContentInfo: InputContentInfoCompat,
+                    flags: Int,
+                    opts: Bundle?
+                ): Boolean {
+                    // The below code is mostly copied from `InputConnectionCompat.java`
+                    var extras: Bundle? = opts
+                    if (
+                        Build.VERSION.SDK_INT >= 25 &&
+                            (flags and INPUT_CONTENT_GRANT_READ_URI_PERMISSION) != 0
+                    ) {
+                        try {
+                            inputContentInfo.requestPermission()
+                        } catch (e: Exception) {
+                            logDebug(
+                                "Can't insert content from IME; requestPermission() failed, $e"
+                            )
+                            return false
+                        }
+                        // Permissions granted above are revoked automatically by the platform when
+                        // the
+                        // corresponding InputContentInfo object is garbage collected. To prevent
+                        // this from happening prematurely (before the receiving app has had a
+                        // chance
+                        // to process the content), we set the InputContentInfo object into the
+                        // extras of the payload passed to onReceiveContent.
+                        val inputContentInfoFmk = inputContentInfo.unwrap() as Parcelable
+                        extras = if (opts == null) Bundle() else Bundle(opts)
+                        extras.putParcelable(EXTRA_INPUT_CONTENT_INFO, inputContentInfoFmk)
                     }
-                    // Permissions granted above are revoked automatically by the platform when the
-                    // corresponding InputContentInfo object is garbage collected. To prevent
-                    // this from happening prematurely (before the receiving app has had a chance
-                    // to process the content), we set the InputContentInfo object into the
-                    // extras of the payload passed to onReceiveContent.
-                    val inputContentInfoFmk = inputContentInfo.unwrap() as Parcelable
-                    extras = if (opts == null) Bundle() else Bundle(opts)
-                    extras.putParcelable(EXTRA_INPUT_CONTENT_INFO, inputContentInfoFmk)
+                    return session.onCommitContent(inputContentInfo.toTransferableContent(extras))
                 }
-                return session.onCommitContent(inputContentInfo.toTransferableContent(extras))
             }
-        }
-    )
+        )
 
     /**
-     * Add edit op to internal list with wrapping batch edit. It's not guaranteed by IME that
-     * batch editing will be used for every operation. Instead, [StatelessInputConnection] creates
-     * its own mini batches for every edit op. These batches are only applied when batch depth
-     * reaches 0, meaning that artificial batches won't be applied until the real batches are
-     * completed.
+     * Add edit op to internal list with wrapping batch edit. It's not guaranteed by IME that batch
+     * editing will be used for every operation. Instead, [StatelessInputConnection] creates its own
+     * mini batches for every edit op. These batches are only applied when batch depth reaches 0,
+     * meaning that artificial batches won't be applied until the real batches are completed.
      */
     private fun addEditCommandWithBatch(editCommand: EditingBuffer.() -> Unit) {
         beginBatchEditInternal()
@@ -223,9 +225,7 @@
         batchDepth--
         if (batchDepth == 0 && editCommands.isNotEmpty()) {
             // apply the changes to active input session in order.
-            session.requestEdit {
-                editCommands.forEach { it.invoke(this) }
-            }
+            session.requestEdit { editCommands.forEach { it.invoke(this) } }
             editCommands.clear()
         }
         return batchDepth > 0
@@ -237,63 +237,49 @@
         batchDepth = 0
     }
 
-    //endregion
+    // endregion
 
     // region Callbacks for text editing
 
     override fun commitText(text: CharSequence?, newCursorPosition: Int): Boolean {
         logDebug("commitText(\"$text\", $newCursorPosition)")
-        addEditCommandWithBatch {
-            commitText(text.toString(), newCursorPosition)
-        }
+        addEditCommandWithBatch { commitText(text.toString(), newCursorPosition) }
         return true
     }
 
     override fun setComposingRegion(start: Int, end: Int): Boolean {
         logDebug("setComposingRegion($start, $end)")
-        addEditCommandWithBatch {
-            setComposingRegion(start, end)
-        }
+        addEditCommandWithBatch { setComposingRegion(start, end) }
         return true
     }
 
     override fun setComposingText(text: CharSequence?, newCursorPosition: Int): Boolean {
         logDebug("setComposingText(\"$text\", $newCursorPosition)")
-        addEditCommandWithBatch {
-            setComposingText(text.toString(), newCursorPosition)
-        }
+        addEditCommandWithBatch { setComposingText(text.toString(), newCursorPosition) }
         return true
     }
 
     override fun deleteSurroundingTextInCodePoints(beforeLength: Int, afterLength: Int): Boolean {
         logDebug("deleteSurroundingTextInCodePoints($beforeLength, $afterLength)")
-        addEditCommandWithBatch {
-            deleteSurroundingTextInCodePoints(beforeLength, afterLength)
-        }
+        addEditCommandWithBatch { deleteSurroundingTextInCodePoints(beforeLength, afterLength) }
         return true
     }
 
     override fun deleteSurroundingText(beforeLength: Int, afterLength: Int): Boolean {
         logDebug("deleteSurroundingText($beforeLength, $afterLength)")
-        addEditCommandWithBatch {
-            deleteSurroundingText(beforeLength, afterLength)
-        }
+        addEditCommandWithBatch { deleteSurroundingText(beforeLength, afterLength) }
         return true
     }
 
     override fun setSelection(start: Int, end: Int): Boolean {
         logDebug("setSelection($start, $end)")
-        addEditCommandWithBatch {
-            setSelection(start, end)
-        }
+        addEditCommandWithBatch { setSelection(start, end) }
         return true
     }
 
     override fun finishComposingText(): Boolean {
         logDebug("finishComposingText()")
-        addEditCommandWithBatch {
-            finishComposingText()
-        }
+        addEditCommandWithBatch { finishComposingText() }
         return true
     }
 
@@ -323,12 +309,13 @@
 
     override fun getSelectedText(flags: Int): CharSequence? {
         // https://source.chromium.org/chromium/chromium/src/+/master:content/public/android/java/src/org/chromium/content/browser/input/TextInputState.java;l=56;drc=0e20d1eb38227949805a4c0e9d5cdeddc8d23637
-        val result: CharSequence? = if (text.selection.collapsed) {
-            null
-        } else {
-            // TODO(b/135556699) should return styled text
-            text.getSelectedText().toString()
-        }
+        val result: CharSequence? =
+            if (text.selection.collapsed) {
+                null
+            } else {
+                // TODO(b/135556699) should return styled text
+                text.getSelectedText().toString()
+            }
         logDebug("getSelectedText($flags): $result")
         return result
     }
@@ -350,8 +337,12 @@
         // an object class for it.
         if (Build.VERSION.SDK_INT < Build.VERSION_CODES.UPSIDE_DOWN_CAKE) return
 
-        Api34PerformHandwritingGestureImpl
-            .performHandwritingGesture(session, gesture, executor, consumer)
+        Api34PerformHandwritingGestureImpl.performHandwritingGesture(
+            session,
+            gesture,
+            executor,
+            consumer
+        )
     }
 
     override fun previewHandwritingGesture(
@@ -361,16 +352,20 @@
         logDebug("previewHandwritingGesture($gesture, $cancellationSignal)")
         if (Build.VERSION.SDK_INT < Build.VERSION_CODES.UPSIDE_DOWN_CAKE) return false
 
-        return Api34PerformHandwritingGestureImpl
-            .previewHandwritingGesture(session, gesture, cancellationSignal)
+        return Api34PerformHandwritingGestureImpl.previewHandwritingGesture(
+            session,
+            gesture,
+            cancellationSignal
+        )
     }
 
     override fun getExtractedText(request: ExtractedTextRequest?, flags: Int): ExtractedText {
         logDebug("getExtractedText($request, $flags)")
-//        extractedTextMonitorMode = (flags and InputConnection.GET_EXTRACTED_TEXT_MONITOR) != 0
-//        if (extractedTextMonitorMode) {
-//            currentExtractedTextRequestToken = request?.token ?: 0
-//        }
+        //        extractedTextMonitorMode = (flags and InputConnection.GET_EXTRACTED_TEXT_MONITOR)
+        // != 0
+        //        if (extractedTextMonitorMode) {
+        //            currentExtractedTextRequestToken = request?.token ?: 0
+        //        }
         // TODO(halilibo): Implement extracted text monitor
         // TODO(b/135556699) should return styled text
         return text.toExtractedText()
@@ -389,9 +384,7 @@
         logDebug("performContextMenuAction($id)")
         when (id) {
             android.R.id.selectAll -> {
-                addEditCommandWithBatch {
-                    setSelection(0, text.length)
-                }
+                addEditCommandWithBatch { setSelection(0, text.length) }
             }
             // TODO(siyamed): Need proper connection to cut/copy/paste
             android.R.id.cut -> sendSynthesizedKeyEvent(KeyEvent.KEYCODE_CUT)
@@ -416,19 +409,20 @@
     override fun performEditorAction(editorAction: Int): Boolean {
         logDebug("performEditorAction($editorAction)")
 
-        val imeAction = when (editorAction) {
-            EditorInfo.IME_ACTION_UNSPECIFIED -> ImeAction.Default
-            EditorInfo.IME_ACTION_DONE -> ImeAction.Done
-            EditorInfo.IME_ACTION_SEND -> ImeAction.Send
-            EditorInfo.IME_ACTION_SEARCH -> ImeAction.Search
-            EditorInfo.IME_ACTION_PREVIOUS -> ImeAction.Previous
-            EditorInfo.IME_ACTION_NEXT -> ImeAction.Next
-            EditorInfo.IME_ACTION_GO -> ImeAction.Go
-            else -> {
-                logDebug("IME sent an unrecognized editor action: $editorAction")
-                ImeAction.Default
+        val imeAction =
+            when (editorAction) {
+                EditorInfo.IME_ACTION_UNSPECIFIED -> ImeAction.Default
+                EditorInfo.IME_ACTION_DONE -> ImeAction.Done
+                EditorInfo.IME_ACTION_SEND -> ImeAction.Send
+                EditorInfo.IME_ACTION_SEARCH -> ImeAction.Search
+                EditorInfo.IME_ACTION_PREVIOUS -> ImeAction.Previous
+                EditorInfo.IME_ACTION_NEXT -> ImeAction.Next
+                EditorInfo.IME_ACTION_GO -> ImeAction.Go
+                else -> {
+                    logDebug("IME sent an unrecognized editor action: $editorAction")
+                    ImeAction.Default
+                }
             }
-        }
 
         session.onImeAction(imeAction)
         return true
@@ -444,7 +438,8 @@
         // The API documents says this should return if the input connection is no longer valid, but
         // The Chromium implementation already returning false, so assuming it is safe to return
         // false if not supported.
-        // see https://cs.chromium.org/chromium/src/content/public/android/java/src/org/chromium/content/browser/input/ThreadedInputConnection.java
+        // see
+        // https://cs.chromium.org/chromium/src/content/public/android/java/src/org/chromium/content/browser/input/ThreadedInputConnection.java
         return false
     }
 
@@ -467,7 +462,8 @@
         // The API documents says this should return if the input connection is no longer valid, but
         // The Chromium implementation already returning false, so assuming it is safe to return
         // false if not supported.
-        // see https://cs.chromium.org/chromium/src/content/public/android/java/src/org/chromium/content/browser/input/ThreadedInputConnection.java
+        // see
+        // https://cs.chromium.org/chromium/src/content/public/android/java/src/org/chromium/content/browser/input/ThreadedInputConnection.java
         return false
     }
 
@@ -537,9 +533,7 @@
         if (intConsumer == null) return
 
         if (executor != null) {
-            executor.execute {
-                intConsumer.accept(result)
-            }
+            executor.execute { intConsumer.accept(result) }
         } else {
             intConsumer.accept(result)
         }
@@ -574,9 +568,7 @@
         clipEntry = clipData.toClipEntry(),
         source = TransferableContent.Source.Keyboard,
         clipMetadata = description.toClipMetadata(),
-        platformTransferableContent = PlatformTransferableContent(
-            linkUri = linkUri,
-            extras = extras ?: Bundle.EMPTY
-        )
+        platformTransferableContent =
+            PlatformTransferableContent(linkUri = linkUri, extras = extras ?: Bundle.EMPTY)
     )
 }
diff --git a/compose/foundation/foundation/src/androidMain/kotlin/androidx/compose/foundation/text/input/internal/TextFieldDragAndDropNode.android.kt b/compose/foundation/foundation/src/androidMain/kotlin/androidx/compose/foundation/text/input/internal/TextFieldDragAndDropNode.android.kt
index 5d9ee84..bb5f6c1 100644
--- a/compose/foundation/foundation/src/androidMain/kotlin/androidx/compose/foundation/text/input/internal/TextFieldDragAndDropNode.android.kt
+++ b/compose/foundation/foundation/src/androidMain/kotlin/androidx/compose/foundation/text/input/internal/TextFieldDragAndDropNode.android.kt
@@ -50,33 +50,28 @@
                 it == MediaType.All || clipDescription.hasMimeType(it.representation)
             }
         },
-        target = object : DragAndDropTarget {
-            override fun onDrop(event: DragAndDropEvent): Boolean {
-                dragAndDropRequestPermission(event)
-                return onDrop.invoke(
-                    event.toAndroidDragEvent().clipData.toClipEntry(),
-                    event.toAndroidDragEvent().clipDescription.toClipMetadata()
-                )
+        target =
+            object : DragAndDropTarget {
+                override fun onDrop(event: DragAndDropEvent): Boolean {
+                    dragAndDropRequestPermission(event)
+                    return onDrop.invoke(
+                        event.toAndroidDragEvent().clipData.toClipEntry(),
+                        event.toAndroidDragEvent().clipDescription.toClipMetadata()
+                    )
+                }
+
+                override fun onStarted(event: DragAndDropEvent) = onStarted?.invoke(event) ?: Unit
+
+                override fun onEntered(event: DragAndDropEvent) = onEntered?.invoke(event) ?: Unit
+
+                override fun onMoved(event: DragAndDropEvent) =
+                    with(event.toAndroidDragEvent()) { onMoved?.invoke(Offset(x, y)) ?: Unit }
+
+                override fun onExited(event: DragAndDropEvent) = onExited?.invoke(event) ?: Unit
+
+                override fun onChanged(event: DragAndDropEvent) = onChanged?.invoke(event) ?: Unit
+
+                override fun onEnded(event: DragAndDropEvent) = onEnded?.invoke(event) ?: Unit
             }
-
-            override fun onStarted(event: DragAndDropEvent) =
-                onStarted?.invoke(event) ?: Unit
-
-            override fun onEntered(event: DragAndDropEvent) =
-                onEntered?.invoke(event) ?: Unit
-
-            override fun onMoved(event: DragAndDropEvent) = with(event.toAndroidDragEvent()) {
-                onMoved?.invoke(Offset(x, y)) ?: Unit
-            }
-
-            override fun onExited(event: DragAndDropEvent) =
-                onExited?.invoke(event) ?: Unit
-
-            override fun onChanged(event: DragAndDropEvent) =
-                onChanged?.invoke(event) ?: Unit
-
-            override fun onEnded(event: DragAndDropEvent) =
-                onEnded?.invoke(event) ?: Unit
-        }
     )
 }
diff --git a/compose/foundation/foundation/src/androidMain/kotlin/androidx/compose/foundation/text/input/internal/TextFieldKeyEventHandler.android.kt b/compose/foundation/foundation/src/androidMain/kotlin/androidx/compose/foundation/text/input/internal/TextFieldKeyEventHandler.android.kt
index e59dc46..406d58d 100644
--- a/compose/foundation/foundation/src/androidMain/kotlin/androidx/compose/foundation/text/input/internal/TextFieldKeyEventHandler.android.kt
+++ b/compose/foundation/foundation/src/androidMain/kotlin/androidx/compose/foundation/text/input/internal/TextFieldKeyEventHandler.android.kt
@@ -37,8 +37,9 @@
     AndroidTextFieldKeyEventHandler()
 
 internal actual val KeyEvent.isFromSoftKeyboard: Boolean
-    get() = (nativeKeyEvent.flags and android.view.KeyEvent.FLAG_SOFT_KEYBOARD) ==
-        android.view.KeyEvent.FLAG_SOFT_KEYBOARD
+    get() =
+        (nativeKeyEvent.flags and android.view.KeyEvent.FLAG_SOFT_KEYBOARD) ==
+            android.view.KeyEvent.FLAG_SOFT_KEYBOARD
 
 internal class AndroidTextFieldKeyEventHandler : TextFieldKeyEventHandler() {
 
@@ -58,7 +59,8 @@
                 focusManager = focusManager,
                 keyboardController = keyboardController
             )
-        ) return true
+        )
+            return true
 
         val device = event.nativeKeyEvent.device
         return when {
@@ -76,7 +78,6 @@
             // Ignore events that originate from a source that only identifies as keyboard.
             // This logic is taken from `android.widget.TextView#doKeyDown()` method.
             event.nativeKeyEvent.source == InputDevice.SOURCE_KEYBOARD -> false
-
             event.isKeyCode(KEYCODE_DPAD_UP) -> focusManager.moveFocus(FocusDirection.Up)
             event.isKeyCode(KEYCODE_DPAD_DOWN) -> focusManager.moveFocus(FocusDirection.Down)
             event.isKeyCode(KEYCODE_DPAD_LEFT) -> focusManager.moveFocus(FocusDirection.Left)
@@ -99,9 +100,10 @@
         singleLine: Boolean,
         onSubmit: () -> Unit
     ): Boolean {
-        if (event.type == KeyDown &&
-            event.nativeKeyEvent.isFromSource(InputDevice.SOURCE_KEYBOARD) &&
-            !event.isFromSoftKeyboard
+        if (
+            event.type == KeyDown &&
+                event.nativeKeyEvent.isFromSource(InputDevice.SOURCE_KEYBOARD) &&
+                !event.isFromSoftKeyboard
         ) {
             textFieldSelectionState.isInTouchMode = false
         }
@@ -117,5 +119,4 @@
     }
 }
 
-private fun KeyEvent.isKeyCode(keyCode: Int): Boolean =
-    this.key.nativeKeyCode == keyCode
+private fun KeyEvent.isKeyCode(keyCode: Int): Boolean = this.key.nativeKeyCode == keyCode
diff --git a/compose/foundation/foundation/src/androidMain/kotlin/androidx/compose/foundation/text/input/internal/TextInputSession.android.kt b/compose/foundation/foundation/src/androidMain/kotlin/androidx/compose/foundation/text/input/internal/TextInputSession.android.kt
index d27cfb7..e06d498 100644
--- a/compose/foundation/foundation/src/androidMain/kotlin/androidx/compose/foundation/text/input/internal/TextInputSession.android.kt
+++ b/compose/foundation/foundation/src/androidMain/kotlin/androidx/compose/foundation/text/input/internal/TextInputSession.android.kt
@@ -48,34 +48,22 @@
      */
     fun requestEdit(block: EditingBuffer.() -> Unit)
 
-    /**
-     * Delegates IME requested KeyEvents.
-     */
+    /** Delegates IME requested KeyEvents. */
     fun sendKeyEvent(keyEvent: KeyEvent)
 
-    /**
-     * Callback to run when IME sends an action via [InputConnection.performEditorAction]
-     */
+    /** Callback to run when IME sends an action via [InputConnection.performEditorAction] */
     fun onImeAction(imeAction: ImeAction)
 
-    /**
-     * Callback to run when IME sends a content via [InputConnection.commitContent]
-     */
+    /** Callback to run when IME sends a content via [InputConnection.commitContent] */
     fun onCommitContent(transferableContent: TransferableContent): Boolean
 
-    /**
-     * Called from [InputConnection.requestCursorUpdates].
-     */
+    /** Called from [InputConnection.requestCursorUpdates]. */
     fun requestCursorUpdates(cursorUpdateMode: Int)
 
-    /**
-     * Called from [InputConnection.performHandwritingGesture].
-     */
+    /** Called from [InputConnection.performHandwritingGesture]. */
     fun performHandwritingGesture(gesture: HandwritingGesture): Int
 
-    /**
-     * Called from [InputConnection.previewHandwritingGesture].
-     */
+    /** Called from [InputConnection.previewHandwritingGesture]. */
     fun previewHandwritingGesture(
         gesture: PreviewableHandwritingGesture,
         cancellationSignal: CancellationSignal?
diff --git a/compose/foundation/foundation/src/androidMain/kotlin/androidx/compose/foundation/text/input/internal/selection/AndroidTextFieldMagnifier.android.kt b/compose/foundation/foundation/src/androidMain/kotlin/androidx/compose/foundation/text/input/internal/selection/AndroidTextFieldMagnifier.android.kt
index d85fe26..06d8919 100644
--- a/compose/foundation/foundation/src/androidMain/kotlin/androidx/compose/foundation/text/input/internal/selection/AndroidTextFieldMagnifier.android.kt
+++ b/compose/foundation/foundation/src/androidMain/kotlin/androidx/compose/foundation/text/input/internal/selection/AndroidTextFieldMagnifier.android.kt
@@ -54,27 +54,30 @@
     // Can't use Offset.VectorConverter because we need to handle Unspecified specially.
     private val animatable =
         Animatable(
-            initialValue = calculateSelectionMagnifierCenterAndroid(
-                textFieldState = textFieldState,
-                selectionState = textFieldSelectionState,
-                textLayoutState = textLayoutState,
-                magnifierSize = magnifierSize
-            ),
+            initialValue =
+                calculateSelectionMagnifierCenterAndroid(
+                    textFieldState = textFieldState,
+                    selectionState = textFieldSelectionState,
+                    textLayoutState = textLayoutState,
+                    magnifierSize = magnifierSize
+                ),
             typeConverter = UnspecifiedSafeOffsetVectorConverter,
             visibilityThreshold = OffsetDisplacementThreshold
         )
 
-    private val magnifierNode = delegate(
-        MagnifierNode(
-            sourceCenter = { animatable.value },
-            onSizeChanged = { size ->
-                magnifierSize = with(currentValueOf(LocalDensity)) {
-                    IntSize(size.width.roundToPx(), size.height.roundToPx())
-                }
-            },
-            useTextDefault = true
+    private val magnifierNode =
+        delegate(
+            MagnifierNode(
+                sourceCenter = { animatable.value },
+                onSizeChanged = { size ->
+                    magnifierSize =
+                        with(currentValueOf(LocalDensity)) {
+                            IntSize(size.width.roundToPx(), size.height.roundToPx())
+                        }
+                },
+                useTextDefault = true
+            )
         )
-    )
 
     private var animationJob: Job? = null
 
@@ -98,10 +101,11 @@
         this.textLayoutState = textLayoutState
         this.visible = visible
 
-        if (textFieldState != previousTextFieldState ||
-            textFieldSelectionState != previousSelectionState ||
-            textLayoutState != previousLayoutState ||
-            visible != wasVisible
+        if (
+            textFieldState != previousTextFieldState ||
+                textFieldSelectionState != previousSelectionState ||
+                textLayoutState != previousLayoutState ||
+                visible != wasVisible
         ) {
             restartAnimationJob()
         }
@@ -112,46 +116,54 @@
         animationJob = null
         // never start an expensive animation job if magnifier is not supported.
         if (!isPlatformMagnifierSupported()) return
-        animationJob = coroutineScope.launch {
-            val animationScope = this
-            snapshotFlow {
-                // Although `visible` is not backed by snapshot state, TextFieldMagnifierNode is
-                // responsible for calling `restartAnimationJob` everytime the value of `visible`
-                // changes. So we don't have to worry about whether snapshotFlow invalidates for
-                // `visible`.
-                if (!visible &&
-                    textFieldSelectionState.directDragGestureInitiator != InputType.Touch
-                ) {
-                    return@snapshotFlow Offset.Unspecified
-                }
-                calculateSelectionMagnifierCenterAndroid(
-                    textFieldState,
-                    textFieldSelectionState,
-                    textLayoutState,
-                    magnifierSize
-                )
-            }
-                .collect { targetValue ->
-                    // Only animate the position when moving vertically (i.e. jumping between
-                    // lines), since horizontal movement in a single line should stay as close to
-                    // the gesture as possible and animation would only add unnecessary lag.
-                    if (
-                        animatable.value.isSpecified &&
-                        targetValue.isSpecified &&
-                        animatable.value.y != targetValue.y
-                    ) {
-                        // Launch the animation, instead of cancelling and re-starting manually via
-                        // collectLatest, so if another animation is started before this one
-                        // finishes, the new one will use the correct velocity, e.g. in order to
-                        // propagate spring inertia.
-                        animationScope.launch {
-                            animatable.animateTo(targetValue, MagnifierSpringSpec)
+        animationJob =
+            coroutineScope.launch {
+                val animationScope = this
+                snapshotFlow {
+                        // Although `visible` is not backed by snapshot state,
+                        // TextFieldMagnifierNode is
+                        // responsible for calling `restartAnimationJob` everytime the value of
+                        // `visible`
+                        // changes. So we don't have to worry about whether snapshotFlow invalidates
+                        // for
+                        // `visible`.
+                        if (
+                            !visible &&
+                                textFieldSelectionState.directDragGestureInitiator !=
+                                    InputType.Touch
+                        ) {
+                            return@snapshotFlow Offset.Unspecified
                         }
-                    } else {
-                        animatable.snapTo(targetValue)
+                        calculateSelectionMagnifierCenterAndroid(
+                            textFieldState,
+                            textFieldSelectionState,
+                            textLayoutState,
+                            magnifierSize
+                        )
                     }
-                }
-        }
+                    .collect { targetValue ->
+                        // Only animate the position when moving vertically (i.e. jumping between
+                        // lines), since horizontal movement in a single line should stay as close
+                        // to
+                        // the gesture as possible and animation would only add unnecessary lag.
+                        if (
+                            animatable.value.isSpecified &&
+                                targetValue.isSpecified &&
+                                animatable.value.y != targetValue.y
+                        ) {
+                            // Launch the animation, instead of cancelling and re-starting manually
+                            // via
+                            // collectLatest, so if another animation is started before this one
+                            // finishes, the new one will use the correct velocity, e.g. in order to
+                            // propagate spring inertia.
+                            animationScope.launch {
+                                animatable.animateTo(targetValue, MagnifierSpringSpec)
+                            }
+                        } else {
+                            animatable.snapTo(targetValue)
+                        }
+                    }
+            }
     }
 
     // TODO(halilibo) Remove this once delegation can propagate this events on its own
diff --git a/compose/foundation/foundation/src/androidMain/kotlin/androidx/compose/foundation/text/selection/AndroidSelectionHandles.android.kt b/compose/foundation/foundation/src/androidMain/kotlin/androidx/compose/foundation/text/selection/AndroidSelectionHandles.android.kt
index 0c8fedf..b74d148 100644
--- a/compose/foundation/foundation/src/androidMain/kotlin/androidx/compose/foundation/text/selection/AndroidSelectionHandles.android.kt
+++ b/compose/foundation/foundation/src/androidMain/kotlin/androidx/compose/foundation/text/selection/AndroidSelectionHandles.android.kt
@@ -67,15 +67,17 @@
     // The left selection handle's top right is placed at the given position, and vice versa.
     val handleReferencePoint = if (isLeft) AbsoluteAlignment.TopRight else AbsoluteAlignment.TopLeft
 
-    val semanticsModifier = modifier.semantics {
-        val position = offsetProvider.provide()
-        this[SelectionHandleInfoKey] = SelectionHandleInfo(
-            handle = if (isStartHandle) SelectionStart else SelectionEnd,
-            position = position,
-            anchor = if (isLeft) Left else Right,
-            visible = position.isSpecified,
-        )
-    }
+    val semanticsModifier =
+        modifier.semantics {
+            val position = offsetProvider.provide()
+            this[SelectionHandleInfoKey] =
+                SelectionHandleInfo(
+                    handle = if (isStartHandle) SelectionStart else SelectionEnd,
+                    position = position,
+                    anchor = if (isLeft) Left else Right,
+                    visible = position.isSpecified,
+                )
+        }
 
     // Propagate the view configuration to the popup.
     val viewConfiguration = LocalViewConfiguration.current
@@ -84,18 +86,20 @@
             if (minTouchTargetSize.isSpecified) {
                 // wrap the content in a Row and align it to an edge according to the specified
                 // direction.
-                val arrangement = if (isLeft) {
-                    Arrangement.Absolute.Right
-                } else {
-                    Arrangement.Absolute.Left
-                }
+                val arrangement =
+                    if (isLeft) {
+                        Arrangement.Absolute.Right
+                    } else {
+                        Arrangement.Absolute.Left
+                    }
 
                 Row(
                     horizontalArrangement = arrangement,
-                    modifier = semanticsModifier.requiredSizeIn(
-                        minWidth = minTouchTargetSize.width,
-                        minHeight = minTouchTargetSize.height
-                    )
+                    modifier =
+                        semanticsModifier.requiredSizeIn(
+                            minWidth = minTouchTargetSize.width,
+                            minHeight = minTouchTargetSize.height
+                        )
                 ) {
                     SelectionHandleIcon(
                         modifier = Modifier,
@@ -121,42 +125,30 @@
     iconVisible: () -> Boolean,
     isLeft: Boolean,
 ) {
-    Spacer(
-        modifier
-            .size(HandleWidth, HandleHeight)
-            .drawSelectionHandle(iconVisible, isLeft)
-    )
+    Spacer(modifier.size(HandleWidth, HandleHeight).drawSelectionHandle(iconVisible, isLeft))
 }
 
-internal fun Modifier.drawSelectionHandle(
-    iconVisible: () -> Boolean,
-    isLeft: Boolean
-): Modifier = composed {
-    val handleColor = LocalTextSelectionColors.current.handleColor
-    this.drawWithCache {
-        val radius = size.width / 2f
-        val handleImage = createHandleImage(radius)
-        val colorFilter = ColorFilter.tint(handleColor)
-        onDrawWithContent {
-            drawContent()
-            if (!iconVisible()) return@onDrawWithContent
-            if (isLeft) {
-                // Flip the selection handle horizontally.
-                scale(scaleX = -1f, scaleY = 1f) {
-                    drawImage(
-                        image = handleImage,
-                        colorFilter = colorFilter
-                    )
+internal fun Modifier.drawSelectionHandle(iconVisible: () -> Boolean, isLeft: Boolean): Modifier =
+    composed {
+        val handleColor = LocalTextSelectionColors.current.handleColor
+        this.drawWithCache {
+            val radius = size.width / 2f
+            val handleImage = createHandleImage(radius)
+            val colorFilter = ColorFilter.tint(handleColor)
+            onDrawWithContent {
+                drawContent()
+                if (!iconVisible()) return@onDrawWithContent
+                if (isLeft) {
+                    // Flip the selection handle horizontally.
+                    scale(scaleX = -1f, scaleY = 1f) {
+                        drawImage(image = handleImage, colorFilter = colorFilter)
+                    }
+                } else {
+                    drawImage(image = handleImage, colorFilter = colorFilter)
                 }
-            } else {
-                drawImage(
-                    image = handleImage,
-                    colorFilter = colorFilter
-                )
             }
         }
     }
-}
 
 /**
  * The cache for the image mask created to draw selection/cursor handle, so that we don't need to
@@ -172,13 +164,12 @@
  * Create an image bitmap for the basic shape of a selection handle or cursor handle. It is an
  * circle with a rectangle covering its left top part.
  *
- * To draw the right selection handle, directly draw this image bitmap.
- * To draw the left selection handle, mirror the canvas first and then draw this image bitmap.
- * To draw the cursor handle, translate and rotated the canvas 45 degrees, then draw this image
- * bitmap.
+ * To draw the right selection handle, directly draw this image bitmap. To draw the left selection
+ * handle, mirror the canvas first and then draw this image bitmap. To draw the cursor handle,
+ * translate and rotated the canvas 45 degrees, then draw this image bitmap.
  *
- * @param radius the radius of circle in selection/cursor handle.
- * CanvasDrawScope objects so that we only recreate them when necessary.
+ * @param radius the radius of circle in selection/cursor handle. CanvasDrawScope objects so that we
+ *   only recreate them when necessary.
  */
 internal fun CacheDrawScope.createHandleImage(radius: Float): ImageBitmap {
     // The edge length of the square bounding box of the selection/cursor handle. This is also
@@ -192,15 +183,11 @@
     // If the cached bitmap is null or too small, we need to create new bitmap.
     if (
         imageBitmap == null ||
-        canvas == null ||
-        edge > imageBitmap.width ||
-        edge > imageBitmap.height
+            canvas == null ||
+            edge > imageBitmap.width ||
+            edge > imageBitmap.height
     ) {
-        imageBitmap = ImageBitmap(
-            width = edge,
-            height = edge,
-            config = ImageBitmapConfig.Alpha8
-        )
+        imageBitmap = ImageBitmap(width = edge, height = edge, config = ImageBitmapConfig.Alpha8)
         HandleImageCache.imageBitmap = imageBitmap
         canvas = Canvas(imageBitmap)
         HandleImageCache.canvas = canvas
@@ -218,24 +205,12 @@
     ) {
         // Clear the previously rendered portion within this ImageBitmap as we could
         // be re-using it
-        drawRect(
-            color = Color.Black,
-            size = size,
-            blendMode = BlendMode.Clear
-        )
+        drawRect(color = Color.Black, size = size, blendMode = BlendMode.Clear)
 
         // Draw the rectangle at top left.
-        drawRect(
-            color = Color(0xFF000000),
-            topLeft = Offset.Zero,
-            size = Size(radius, radius)
-        )
+        drawRect(color = Color(0xFF000000), topLeft = Offset.Zero, size = Size(radius, radius))
         // Draw the circle
-        drawCircle(
-            color = Color(0xFF000000),
-            radius = radius,
-            center = Offset(radius, radius)
-        )
+        drawCircle(color = Color(0xFF000000), radius = radius, center = Offset(radius, radius))
     }
     return imageBitmap
 }
@@ -246,9 +221,10 @@
     handleReferencePoint: Alignment,
     content: @Composable () -> Unit
 ) {
-    val popupPositionProvider = remember(handleReferencePoint, positionProvider) {
-        HandlePositionProvider(handleReferencePoint, positionProvider)
-    }
+    val popupPositionProvider =
+        remember(handleReferencePoint, positionProvider) {
+            HandlePositionProvider(handleReferencePoint, positionProvider)
+        }
     Popup(
         popupPositionProvider = popupPositionProvider,
         properties = PopupProperties(excludeFromSystemGesture = true, clippingEnabled = false),
diff --git a/compose/foundation/foundation/src/androidMain/kotlin/androidx/compose/foundation/text/selection/SelectionManager.android.kt b/compose/foundation/foundation/src/androidMain/kotlin/androidx/compose/foundation/text/selection/SelectionManager.android.kt
index 0e4100a6..384dcc6 100644
--- a/compose/foundation/foundation/src/androidMain/kotlin/androidx/compose/foundation/text/selection/SelectionManager.android.kt
+++ b/compose/foundation/foundation/src/androidMain/kotlin/androidx/compose/foundation/text/selection/SelectionManager.android.kt
@@ -50,21 +50,19 @@
         val density = LocalDensity.current
         var magnifierSize by remember { mutableStateOf(IntSize.Zero) }
         animatedSelectionMagnifier(
-            magnifierCenter = {
-                calculateSelectionMagnifierCenterAndroid(manager, magnifierSize)
-            },
+            magnifierCenter = { calculateSelectionMagnifierCenterAndroid(manager, magnifierSize) },
             platformMagnifier = { center ->
-                Modifier
-                    .magnifier(
-                        sourceCenter = { center() },
-                        onSizeChanged = { size ->
-                            magnifierSize = with(density) {
+                Modifier.magnifier(
+                    sourceCenter = { center() },
+                    onSizeChanged = { size ->
+                        magnifierSize =
+                            with(density) {
                                 IntSize(size.width.roundToPx(), size.height.roundToPx())
                             }
-                        },
-                        useTextDefault = true,
-                        platformMagnifierFactory = PlatformMagnifierFactory.getForCurrentPlatform()
-                    )
+                    },
+                    useTextDefault = true,
+                    platformMagnifierFactory = PlatformMagnifierFactory.getForCurrentPlatform()
+                )
             }
         )
     }
@@ -78,11 +76,15 @@
             state = state,
             label = TextContextMenuItems.Copy,
             enabled = isNonEmptySelection(),
-        ) { copy() },
+        ) {
+            copy()
+        },
         TextItem(
             state = state,
             label = TextContextMenuItems.SelectAll,
             enabled = !isEntireContainerSelected(),
-        ) { selectAll() },
+        ) {
+            selectAll()
+        },
     )
 }
diff --git a/compose/foundation/foundation/src/androidMain/kotlin/androidx/compose/foundation/text/selection/TextFieldSelectionManager.android.kt b/compose/foundation/foundation/src/androidMain/kotlin/androidx/compose/foundation/text/selection/TextFieldSelectionManager.android.kt
index 5aa6139..d04bdd6 100644
--- a/compose/foundation/foundation/src/androidMain/kotlin/androidx/compose/foundation/text/selection/TextFieldSelectionManager.android.kt
+++ b/compose/foundation/foundation/src/androidMain/kotlin/androidx/compose/foundation/text/selection/TextFieldSelectionManager.android.kt
@@ -49,16 +49,15 @@
         val density = LocalDensity.current
         var magnifierSize by remember { mutableStateOf(IntSize.Zero) }
         animatedSelectionMagnifier(
-            magnifierCenter = {
-                calculateSelectionMagnifierCenterAndroid(manager, magnifierSize)
-            },
+            magnifierCenter = { calculateSelectionMagnifierCenterAndroid(manager, magnifierSize) },
             platformMagnifier = { center ->
                 Modifier.magnifier(
                     sourceCenter = { center() },
                     onSizeChanged = { size ->
-                        magnifierSize = with(density) {
-                            IntSize(size.width.roundToPx(), size.height.roundToPx())
-                        }
+                        magnifierSize =
+                            with(density) {
+                                IntSize(size.width.roundToPx(), size.height.roundToPx())
+                            }
                     },
                     useTextDefault = true,
                     platformMagnifierFactory = PlatformMagnifierFactory.getForCurrentPlatform()
@@ -77,20 +76,28 @@
         state = contextMenuState,
         label = TextContextMenuItems.Cut,
         enabled = hasSelection && editable && !isPassword,
-    ) { cut() }
+    ) {
+        cut()
+    }
     TextItem(
         state = contextMenuState,
         label = TextContextMenuItems.Copy,
         enabled = hasSelection && !isPassword,
-    ) { copy(cancelSelection = false) }
+    ) {
+        copy(cancelSelection = false)
+    }
     TextItem(
         state = contextMenuState,
         label = TextContextMenuItems.Paste,
         enabled = editable && clipboardManager?.hasText() == true,
-    ) { paste() }
+    ) {
+        paste()
+    }
     TextItem(
         state = contextMenuState,
         label = TextContextMenuItems.SelectAll,
         enabled = value.selection.length != value.text.length,
-    ) { selectAll() }
+    ) {
+        selectAll()
+    }
 }
diff --git a/compose/foundation/foundation/src/androidUnitTest/kotlin/androidx/compose/foundation/MutatorMutexTest.kt b/compose/foundation/foundation/src/androidUnitTest/kotlin/androidx/compose/foundation/MutatorMutexTest.kt
index 4d6588d..c1a76dc 100644
--- a/compose/foundation/foundation/src/androidUnitTest/kotlin/androidx/compose/foundation/MutatorMutexTest.kt
+++ b/compose/foundation/foundation/src/androidUnitTest/kotlin/androidx/compose/foundation/MutatorMutexTest.kt
@@ -58,80 +58,93 @@
     }
 
     @Test
-    fun newMutatorCancelsOld() = runBlocking<Unit> {
-        val mutex = MutatorMutex()
-        runNewMutatorCancelsOld(MutateWithoutReceiverCaller(mutex))
-        runNewMutatorCancelsOld(MutateWithReceiverCaller(mutex))
-    }
-
-    private suspend fun runNewMutatorCancelsOld(mutex: MutateCaller) = coroutineScope<Unit> {
-        val firstMutatorJob = launch(start = CoroutineStart.UNDISPATCHED) {
-            mutex.mutate {
-                // Suspend forever
-                suspendCancellableCoroutine<Unit> { }
-            }
-            fail("mutator should have thrown CancellationException")
+    fun newMutatorCancelsOld() =
+        runBlocking<Unit> {
+            val mutex = MutatorMutex()
+            runNewMutatorCancelsOld(MutateWithoutReceiverCaller(mutex))
+            runNewMutatorCancelsOld(MutateWithReceiverCaller(mutex))
         }
 
-        // Cancel firstMutatorJob
-        mutex.mutate { }
-        assertTrue("first mutator was cancelled", firstMutatorJob.isCancelled)
-    }
+    private suspend fun runNewMutatorCancelsOld(mutex: MutateCaller) =
+        coroutineScope<Unit> {
+            val firstMutatorJob =
+                launch(start = CoroutineStart.UNDISPATCHED) {
+                    mutex.mutate {
+                        // Suspend forever
+                        suspendCancellableCoroutine<Unit> {}
+                    }
+                    fail("mutator should have thrown CancellationException")
+                }
 
-    @Test
-    fun mutatorsCancelByPriority() = runBlocking<Unit> {
-        val mutex = MutatorMutex()
-        runMutatorsCancelByPriority(MutateWithoutReceiverCaller(mutex))
-        runMutatorsCancelByPriority(MutateWithReceiverCaller(mutex))
-    }
-
-    @Test
-    fun tryMutateBlockingSuspendsSubsequentMutate() = runBlocking<Unit> {
-        val mutex = MutatorMutex()
-        val tryMutateJob = launch(start = CoroutineStart.LAZY) {
-            mutex.tryMutate {
-                while (true) { /* Block forever */ }
-            }
+            // Cancel firstMutatorJob
+            mutex.mutate {}
+            assertTrue("first mutator was cancelled", firstMutatorJob.isCancelled)
         }
-        val mutateJob = launch(start = CoroutineStart.LAZY) {
-            mutex.mutate {
-                if (tryMutateJob.isActive) fail("Attempted to mutate before tryMutate finished")
-            }
-        }
-        tryMutateJob.start()
-        mutateJob.start()
-
-        tryMutateJob.cancelAndJoin()
-        mutateJob.cancelAndJoin()
-    }
 
     @Test
-    fun tryMutateDoesNotOverrideActiveCaller() = runBlocking<Unit> {
-        val mutex = MutatorMutex()
-        val mutateJob = launch(start = CoroutineStart.UNDISPATCHED) {
-            mutex.mutate {
-                suspendCancellableCoroutine { } // Suspend forever
-            }
+    fun mutatorsCancelByPriority() =
+        runBlocking<Unit> {
+            val mutex = MutatorMutex()
+            runMutatorsCancelByPriority(MutateWithoutReceiverCaller(mutex))
+            runMutatorsCancelByPriority(MutateWithReceiverCaller(mutex))
         }
-        val tryMutateSuccessful = mutex.tryMutate { }
-        Assert.assertFalse(
-            "tryMutate should not run if there is an ongoing mutation",
-            tryMutateSuccessful
-        )
-        mutateJob.cancelAndJoin()
-    }
 
     @Test
-    fun tryMutateBlockingTryMutateLocks() = runBlocking<Unit> {
-        val mutex = MutatorMutex()
-        mutex.tryMutate {
-            val tryMutateSuccessful = mutex.tryMutate { }
+    fun tryMutateBlockingSuspendsSubsequentMutate() =
+        runBlocking<Unit> {
+            val mutex = MutatorMutex()
+            val tryMutateJob =
+                launch(start = CoroutineStart.LAZY) {
+                    mutex.tryMutate {
+                        while (true) {
+                            /* Block forever */
+                        }
+                    }
+                }
+            val mutateJob =
+                launch(start = CoroutineStart.LAZY) {
+                    mutex.mutate {
+                        if (tryMutateJob.isActive)
+                            fail("Attempted to mutate before tryMutate finished")
+                    }
+                }
+            tryMutateJob.start()
+            mutateJob.start()
+
+            tryMutateJob.cancelAndJoin()
+            mutateJob.cancelAndJoin()
+        }
+
+    @Test
+    fun tryMutateDoesNotOverrideActiveCaller() =
+        runBlocking<Unit> {
+            val mutex = MutatorMutex()
+            val mutateJob =
+                launch(start = CoroutineStart.UNDISPATCHED) {
+                    mutex.mutate {
+                        suspendCancellableCoroutine {} // Suspend forever
+                    }
+                }
+            val tryMutateSuccessful = mutex.tryMutate {}
             Assert.assertFalse(
                 "tryMutate should not run if there is an ongoing mutation",
                 tryMutateSuccessful
             )
+            mutateJob.cancelAndJoin()
         }
-    }
+
+    @Test
+    fun tryMutateBlockingTryMutateLocks() =
+        runBlocking<Unit> {
+            val mutex = MutatorMutex()
+            mutex.tryMutate {
+                val tryMutateSuccessful = mutex.tryMutate {}
+                Assert.assertFalse(
+                    "tryMutate should not run if there is an ongoing mutation",
+                    tryMutateSuccessful
+                )
+            }
+        }
 
     @Test
     fun tryLockUnlockedMutexLocks() {
@@ -162,37 +175,39 @@
         assertTrue("The mutex was not locked", didLockAfterUnlock)
     }
 
-    private suspend fun runMutatorsCancelByPriority(mutex: MutateCaller) = coroutineScope<Unit> {
-        for (firstPriority in MutatePriority.values()) {
-            for (secondPriority in MutatePriority.values()) {
-                val firstMutatorJob = launch(start = CoroutineStart.UNDISPATCHED) {
-                    mutex.mutate(firstPriority) {
-                        // Suspend forever
-                        suspendCancellableCoroutine<Unit> { }
+    private suspend fun runMutatorsCancelByPriority(mutex: MutateCaller) =
+        coroutineScope<Unit> {
+            for (firstPriority in MutatePriority.values()) {
+                for (secondPriority in MutatePriority.values()) {
+                    val firstMutatorJob =
+                        launch(start = CoroutineStart.UNDISPATCHED) {
+                            mutex.mutate(firstPriority) {
+                                // Suspend forever
+                                suspendCancellableCoroutine<Unit> {}
+                            }
+                            fail("mutator should have thrown CancellationException")
+                        }
+
+                    // Attempt mutation and (maybe) cause cancellation
+                    try {
+                        mutex.mutate(secondPriority) {}
+                    } catch (ce: CancellationException) {
+                        assertTrue(
+                            "attempted second mutation was cancelled with lower priority",
+                            secondPriority < firstPriority
+                        )
                     }
-                    fail("mutator should have thrown CancellationException")
-                }
-
-                // Attempt mutation and (maybe) cause cancellation
-                try {
-                    mutex.mutate(secondPriority) { }
-                } catch (ce: CancellationException) {
-                    assertTrue(
-                        "attempted second mutation was cancelled with lower priority",
-                        secondPriority < firstPriority
+                    assertEquals(
+                        "first mutator of priority $firstPriority cancelled by second " +
+                            "mutator of priority $secondPriority",
+                        secondPriority >= firstPriority,
+                        firstMutatorJob.isCancelled
                     )
-                }
-                assertEquals(
-                    "first mutator of priority $firstPriority cancelled by second " +
-                        "mutator of priority $secondPriority",
-                    secondPriority >= firstPriority,
-                    firstMutatorJob.isCancelled
-                )
 
-                // Cleanup regardless of results
-                firstMutatorJob.cancel()
-                firstMutatorJob.join()
+                    // Cleanup regardless of results
+                    firstMutatorJob.cancel()
+                    firstMutatorJob.join()
+                }
             }
         }
-    }
 }
diff --git a/compose/foundation/foundation/src/androidUnitTest/kotlin/androidx/compose/foundation/contextmenu/ContextMenuPopupPositionProviderTest.kt b/compose/foundation/foundation/src/androidUnitTest/kotlin/androidx/compose/foundation/contextmenu/ContextMenuPopupPositionProviderTest.kt
index e762655..90db6ef 100644
--- a/compose/foundation/foundation/src/androidUnitTest/kotlin/androidx/compose/foundation/contextmenu/ContextMenuPopupPositionProviderTest.kt
+++ b/compose/foundation/foundation/src/androidUnitTest/kotlin/androidx/compose/foundation/contextmenu/ContextMenuPopupPositionProviderTest.kt
@@ -24,7 +24,7 @@
 import org.junit.Test
 
 class ContextMenuPopupPositionProviderTest {
-    //region ContextMenuPopupPositionProvider Tests
+    // region ContextMenuPopupPositionProvider Tests
     @Test
     fun calculatePosition_onlyFitsInXDirection() {
         val layoutDirection = LayoutDirection.Ltr
@@ -84,88 +84,49 @@
 
         assertThat(actual).isEqualTo(IntOffset(40, 50))
     }
-    //endregion ContextMenuPopupPositionProvider Tests
 
-    //region alignPopupAxis Tests
+    // endregion ContextMenuPopupPositionProvider Tests
+
+    // region alignPopupAxis Tests
     @Test
-    fun alignPopupAxis_closeAffinity_popupLargerThanWindow() = alignPopupAxisTest(
-        position = 50,
-        popupLength = 200,
-        closeAffinity = true,
-        expected = 0
-    )
+    fun alignPopupAxis_closeAffinity_popupLargerThanWindow() =
+        alignPopupAxisTest(position = 50, popupLength = 200, closeAffinity = true, expected = 0)
 
     @Test
-    fun alignPopupAxis_closeAffinity_popupFitsNeitherSide() = alignPopupAxisTest(
-        position = 50,
-        popupLength = 75,
-        closeAffinity = true,
-        expected = 25
-    )
+    fun alignPopupAxis_closeAffinity_popupFitsNeitherSide() =
+        alignPopupAxisTest(position = 50, popupLength = 75, closeAffinity = true, expected = 25)
 
     @Test
-    fun alignPopupAxis_closeAffinity_popupFitsCloseSide() = alignPopupAxisTest(
-        position = 90,
-        popupLength = 30,
-        closeAffinity = true,
-        expected = 60
-    )
+    fun alignPopupAxis_closeAffinity_popupFitsCloseSide() =
+        alignPopupAxisTest(position = 90, popupLength = 30, closeAffinity = true, expected = 60)
 
     @Test
-    fun alignPopupAxis_closeAffinity_popupFitsFarSide() = alignPopupAxisTest(
-        position = 20,
-        popupLength = 30,
-        closeAffinity = true,
-        expected = 20
-    )
+    fun alignPopupAxis_closeAffinity_popupFitsFarSide() =
+        alignPopupAxisTest(position = 20, popupLength = 30, closeAffinity = true, expected = 20)
 
     @Test
-    fun alignPopupAxis_closeAffinity_popupFitsEitherSide() = alignPopupAxisTest(
-        position = 50,
-        popupLength = 10,
-        closeAffinity = true,
-        expected = 50
-    )
+    fun alignPopupAxis_closeAffinity_popupFitsEitherSide() =
+        alignPopupAxisTest(position = 50, popupLength = 10, closeAffinity = true, expected = 50)
 
     @Test
-    fun alignPopupAxis_farAffinity_popupLargerThanWindow() = alignPopupAxisTest(
-        position = 50,
-        popupLength = 200,
-        closeAffinity = false,
-        expected = -100
-    )
+    fun alignPopupAxis_farAffinity_popupLargerThanWindow() =
+        alignPopupAxisTest(position = 50, popupLength = 200, closeAffinity = false, expected = -100)
 
     @Test
-    fun alignPopupAxis_farAffinity_popupFitsNeitherSide() = alignPopupAxisTest(
-        position = 50,
-        popupLength = 75,
-        closeAffinity = false,
-        expected = 0
-    )
+    fun alignPopupAxis_farAffinity_popupFitsNeitherSide() =
+        alignPopupAxisTest(position = 50, popupLength = 75, closeAffinity = false, expected = 0)
 
     @Test
-    fun alignPopupAxis_farAffinity_popupFitsCloseSide() = alignPopupAxisTest(
-        position = 90,
-        popupLength = 30,
-        closeAffinity = false,
-        expected = 60
-    )
+    fun alignPopupAxis_farAffinity_popupFitsCloseSide() =
+        alignPopupAxisTest(position = 90, popupLength = 30, closeAffinity = false, expected = 60)
 
     @Test
-    fun alignPopupAxis_farAffinity_popupFitsFarSide() = alignPopupAxisTest(
-        position = 20,
-        popupLength = 30,
-        closeAffinity = false,
-        expected = 20
-    )
+    fun alignPopupAxis_farAffinity_popupFitsFarSide() =
+        alignPopupAxisTest(position = 20, popupLength = 30, closeAffinity = false, expected = 20)
 
     @Test
-    fun alignPopupAxis_farAffinity_popupFitsEitherSide() = alignPopupAxisTest(
-        position = 50,
-        popupLength = 10,
-        closeAffinity = false,
-        expected = 40
-    )
+    fun alignPopupAxis_farAffinity_popupFitsEitherSide() =
+        alignPopupAxisTest(position = 50, popupLength = 10, closeAffinity = false, expected = 40)
 
     private fun alignPopupAxisTest(
         position: Int,
@@ -173,55 +134,60 @@
         closeAffinity: Boolean,
         expected: Int
     ) {
-        val actual = alignPopupAxis(
-            position = position,
-            popupLength = popupLength,
-            windowLength = 100,
-            closeAffinity = closeAffinity
-        )
+        val actual =
+            alignPopupAxis(
+                position = position,
+                popupLength = popupLength,
+                windowLength = 100,
+                closeAffinity = closeAffinity
+            )
         assertThat(actual).isEqualTo(expected)
     }
 
     @Test
     fun alignPopupAxis_popupBarelyFitsInAfterSpace() {
-        val actual = alignPopupAxis(
-            position = 74,
-            popupLength = 25,
-            windowLength = 100,
-        )
+        val actual =
+            alignPopupAxis(
+                position = 74,
+                popupLength = 25,
+                windowLength = 100,
+            )
         assertThat(actual).isEqualTo(74)
     }
 
     @Test
     fun alignPopupAxis_popupBarelyDoesNotFitInAfterSpace() {
-        val actual = alignPopupAxis(
-            position = 75,
-            popupLength = 25,
-            windowLength = 100,
-        )
+        val actual =
+            alignPopupAxis(
+                position = 75,
+                popupLength = 25,
+                windowLength = 100,
+            )
         assertThat(actual).isEqualTo(50)
     }
 
     @Test
     fun alignPopupAxis_popupBarelyFitsInBeforeSpace() {
-        val actual = alignPopupAxis(
-            position = 25,
-            popupLength = 25,
-            windowLength = 100,
-            closeAffinity = false
-        )
+        val actual =
+            alignPopupAxis(
+                position = 25,
+                popupLength = 25,
+                windowLength = 100,
+                closeAffinity = false
+            )
         assertThat(actual).isEqualTo(0)
     }
 
     @Test
     fun alignPopupAxis_popupBarelyDoesNotFitInBeforeSpace() {
-        val actual = alignPopupAxis(
-            position = 24,
-            popupLength = 25,
-            windowLength = 100,
-            closeAffinity = false
-        )
+        val actual =
+            alignPopupAxis(
+                position = 24,
+                popupLength = 25,
+                windowLength = 100,
+                closeAffinity = false
+            )
         assertThat(actual).isEqualTo(24)
     }
-    //endregion alignPopupAxis Tests
+    // endregion alignPopupAxis Tests
 }
diff --git a/compose/foundation/foundation/src/androidUnitTest/kotlin/androidx/compose/foundation/gestures/BringIntoViewRequestPriorityQueueTest.kt b/compose/foundation/foundation/src/androidUnitTest/kotlin/androidx/compose/foundation/gestures/BringIntoViewRequestPriorityQueueTest.kt
index 40b0f29..56ccf05 100644
--- a/compose/foundation/foundation/src/androidUnitTest/kotlin/androidx/compose/foundation/gestures/BringIntoViewRequestPriorityQueueTest.kt
+++ b/compose/foundation/foundation/src/androidUnitTest/kotlin/androidx/compose/foundation/gestures/BringIntoViewRequestPriorityQueueTest.kt
@@ -42,22 +42,26 @@
     private val queue = BringIntoViewRequestPriorityQueue()
     private val scope = CoroutineScope(Dispatchers.Unconfined)
 
-    private val largeRequest = Request(
-        currentBounds = { Rect(Offset.Zero, Size(10f, 10f)) },
-        continuation = createContinuation()
-    )
-    private val mediumRequest = Request(
-        currentBounds = { Rect(Offset.Zero, Size(5f, 5f)) },
-        continuation = createContinuation()
-    )
-    private val otherMediumRequest = Request(
-        currentBounds = { Rect(Offset(5f, 5f), Size(5f, 5f)) },
-        continuation = createContinuation()
-    )
-    private val smallRequest = Request(
-        currentBounds = { Rect(Offset.Zero, Size(1f, 1f)) },
-        continuation = createContinuation()
-    )
+    private val largeRequest =
+        Request(
+            currentBounds = { Rect(Offset.Zero, Size(10f, 10f)) },
+            continuation = createContinuation()
+        )
+    private val mediumRequest =
+        Request(
+            currentBounds = { Rect(Offset.Zero, Size(5f, 5f)) },
+            continuation = createContinuation()
+        )
+    private val otherMediumRequest =
+        Request(
+            currentBounds = { Rect(Offset(5f, 5f), Size(5f, 5f)) },
+            continuation = createContinuation()
+        )
+    private val smallRequest =
+        Request(
+            currentBounds = { Rect(Offset.Zero, Size(1f, 1f)) },
+            continuation = createContinuation()
+        )
 
     @After
     fun tearDown() {
@@ -66,20 +70,18 @@
 
     @Test
     fun request_toString() {
-        val request = Request(
-            currentBounds = { Rect.Zero },
-            continuation = createContinuation()
-        )
+        val request = Request(currentBounds = { Rect.Zero }, continuation = createContinuation())
 
         assertThat(request.toString()).contains("currentBounds()=Rect.fromLTRB(0.0, 0.0, 0.0, 0.0)")
     }
 
     @Test
     fun request_toString_withCoroutineName() {
-        val request = Request(
-            currentBounds = { Rect.Zero },
-            continuation = createContinuation(CoroutineName("sam"))
-        )
+        val request =
+            Request(
+                currentBounds = { Rect.Zero },
+                continuation = createContinuation(CoroutineName("sam"))
+            )
 
         assertThat(request.toString()).contains("[sam]")
     }
@@ -92,10 +94,7 @@
 
     @Test
     fun enqueueSingleRequest_nullBounds() {
-        val request = Request(
-            currentBounds = { null },
-            continuation = createContinuation()
-        )
+        val request = Request(currentBounds = { null }, continuation = createContinuation())
         queue.enqueue(request)
 
         assertThat(queue.size).isEqualTo(0)
@@ -122,9 +121,7 @@
 
         val expectedRequests = listOf(largeRequest, mediumRequest, smallRequest)
         assertThat(queue.toList()).isEqualTo(expectedRequests.map { it.currentBounds() })
-        expectedRequests.forEach {
-            assertThat(it.continuation.isActive).isTrue()
-        }
+        expectedRequests.forEach { assertThat(it.continuation.isActive).isTrue() }
     }
 
     @Test
@@ -135,9 +132,7 @@
 
         val expectedRequests = listOf(largeRequest, mediumRequest, smallRequest)
         assertThat(queue.toList()).isEqualTo(expectedRequests.map { it.currentBounds() })
-        expectedRequests.forEach {
-            assertThat(it.continuation.isActive).isTrue()
-        }
+        expectedRequests.forEach { assertThat(it.continuation.isActive).isTrue() }
     }
 
     @Test
@@ -148,9 +143,7 @@
 
         val expectedRequests = listOf(largeRequest, mediumRequest, smallRequest)
         assertThat(queue.toList()).isEqualTo(expectedRequests.map { it.currentBounds() })
-        expectedRequests.forEach {
-            assertThat(it.continuation.isActive).isTrue()
-        }
+        expectedRequests.forEach { assertThat(it.continuation.isActive).isTrue() }
     }
 
     @Test
@@ -164,9 +157,7 @@
         // Containing request should be preserved.
         val expectedRequests = listOf(largeRequest, otherMediumRequest)
         assertThat(queue.toList()).isEqualTo(expectedRequests.map { it.currentBounds() })
-        expectedRequests.forEach {
-            assertThat(it.continuation.isActive).isTrue()
-        }
+        expectedRequests.forEach { assertThat(it.continuation.isActive).isTrue() }
         // Non-overlapping requests should be cancelled.
         listOf(mediumRequest, smallRequest).forEach {
             assertThat(it.continuation.isCancelled).isTrue()
@@ -175,10 +166,7 @@
 
     @Test
     fun enqueuedRequest_isRemoved_whenCancelled() {
-        val request = Request(
-            currentBounds = { Rect.Zero },
-            continuation = createContinuation()
-        )
+        val request = Request(currentBounds = { Rect.Zero }, continuation = createContinuation())
         queue.enqueue(request)
 
         request.continuation.cancel()
@@ -261,29 +249,19 @@
         assertThat(queue.toList()).isEqualTo(expectedRequests.map { it.currentBounds() })
         assertThat(smallRequest.continuation.isCompleted).isTrue()
         assertThat(smallRequest.continuation.isCancelled).isFalse()
-        expectedRequests.forEach {
-            assertThat(it.continuation.isActive).isTrue()
-        }
+        expectedRequests.forEach { assertThat(it.continuation.isActive).isTrue() }
     }
 
     private fun createContinuation(
         context: CoroutineContext = EmptyCoroutineContext
     ): CancellableContinuation<Unit> {
         lateinit var continuation: CancellableContinuation<Unit>
-        scope.launch(
-            context = context,
-            start = CoroutineStart.UNDISPATCHED
-        ) {
-            suspendCancellableCoroutine {
-                continuation = it
-            }
+        scope.launch(context = context, start = CoroutineStart.UNDISPATCHED) {
+            suspendCancellableCoroutine { continuation = it }
         }
         return continuation
     }
 
-    private fun BringIntoViewRequestPriorityQueue.toList() = buildList {
-        forEachFromSmallest {
-            add(it)
-        }
-    }.asReversed()
+    private fun BringIntoViewRequestPriorityQueue.toList() =
+        buildList { forEachFromSmallest { add(it) } }.asReversed()
 }
diff --git a/compose/foundation/foundation/src/androidUnitTest/kotlin/androidx/compose/foundation/gestures/DraggableAnchorsTest.kt b/compose/foundation/foundation/src/androidUnitTest/kotlin/androidx/compose/foundation/gestures/DraggableAnchorsTest.kt
index cef8f48..8f12d22 100644
--- a/compose/foundation/foundation/src/androidUnitTest/kotlin/androidx/compose/foundation/gestures/DraggableAnchorsTest.kt
+++ b/compose/foundation/foundation/src/androidUnitTest/kotlin/androidx/compose/foundation/gestures/DraggableAnchorsTest.kt
@@ -44,7 +44,7 @@
 
     @Test
     fun draggableAnchors_get_nonexistentAnchor_returnsNaN() {
-        val anchors = DraggableAnchors<TestValue> { }
+        val anchors = DraggableAnchors<TestValue> {}
         assertThat(anchors.positionOf(A)).isNaN()
     }
 
@@ -90,12 +90,14 @@
 
     @Test
     fun draggableAnchors_hasAnchorFor() {
-        val anchors = DraggableAnchors {
-            A at 100f
-        }
+        val anchors = DraggableAnchors { A at 100f }
         assertThat(anchors.positionOf(A)).isEqualTo(100f)
         assertThat(anchors.hasAnchorFor(A)).isTrue()
     }
 }
 
-private enum class TestValue { A, B, C }
+private enum class TestValue {
+    A,
+    B,
+    C
+}
diff --git a/compose/foundation/foundation/src/androidUnitTest/kotlin/androidx/compose/foundation/gestures/UpdatableAnimationStateTest.kt b/compose/foundation/foundation/src/androidUnitTest/kotlin/androidx/compose/foundation/gestures/UpdatableAnimationStateTest.kt
index 433d76b..b17cf86 100644
--- a/compose/foundation/foundation/src/androidUnitTest/kotlin/androidx/compose/foundation/gestures/UpdatableAnimationStateTest.kt
+++ b/compose/foundation/foundation/src/androidUnitTest/kotlin/androidx/compose/foundation/gestures/UpdatableAnimationStateTest.kt
@@ -40,10 +40,7 @@
         state.value = 0f
 
         runBlocking {
-            state.animateToZero(
-                beforeFrame = { fail() },
-                afterFrame = { fail() }
-            )
+            state.animateToZero(beforeFrame = { fail() }, afterFrame = { fail() })
 
             // Should immediately get to here without suspending.
         }
@@ -86,16 +83,14 @@
     @Test
     fun animateToZero_handlesZeroAnimationScale() {
         val deltas = mutableListOf<Float>()
-        val scale = object : MotionDurationScale {
-            override val scaleFactor: Float = 0f
-        }
+        val scale =
+            object : MotionDurationScale {
+                override val scaleFactor: Float = 0f
+            }
         state.value = 10f
 
         runBlocking(frameClock + scale) {
-            state.animateToZero(
-                beforeFrame = { deltas += it },
-                afterFrame = {}
-            )
+            state.animateToZero(beforeFrame = { deltas += it }, afterFrame = {})
         }
 
         assertThat(state.value).isEqualTo(0f)
@@ -105,16 +100,14 @@
     @Test
     fun animateToZero_handlesDoubleAnimationScale() {
         val deltas = mutableListOf<Float>()
-        val scale = object : MotionDurationScale {
-            override val scaleFactor: Float = 2f
-        }
+        val scale =
+            object : MotionDurationScale {
+                override val scaleFactor: Float = 2f
+            }
         state.value = 10f
 
         runBlocking(frameClock + scale) {
-            state.animateToZero(
-                beforeFrame = { deltas += it },
-                afterFrame = {}
-            )
+            state.animateToZero(beforeFrame = { deltas += it }, afterFrame = {})
         }
 
         assertThat(state.value).isEqualTo(0f)
@@ -129,9 +122,7 @@
         runBlocking(frameClock) {
             state.animateToZero(
                 beforeFrame = {},
-                afterFrame = {
-                    valuesToSet.removeFirstOrNull()?.let { state.value = it }
-                },
+                afterFrame = { valuesToSet.removeFirstOrNull()?.let { state.value = it } },
             )
         }
 
@@ -146,9 +137,7 @@
         runBlocking(frameClock) {
             state.animateToZero(
                 beforeFrame = {},
-                afterFrame = {
-                    valuesToSet.removeFirstOrNull()?.let { state.value = it }
-                },
+                afterFrame = { valuesToSet.removeFirstOrNull()?.let { state.value = it } },
             )
         }
 
@@ -159,8 +148,6 @@
         private var frame = 0L
 
         override suspend fun <R> withFrameNanos(onFrame: (Long) -> R): R =
-            onFrame(frame).also {
-                frame += 16_000_000L
-            }
+            onFrame(frame).also { frame += 16_000_000L }
     }
 }
diff --git a/compose/foundation/foundation/src/androidUnitTest/kotlin/androidx/compose/foundation/lazy/MutableIntervalListTest.kt b/compose/foundation/foundation/src/androidUnitTest/kotlin/androidx/compose/foundation/lazy/MutableIntervalListTest.kt
index 78b5726..6ea91d4 100644
--- a/compose/foundation/foundation/src/androidUnitTest/kotlin/androidx/compose/foundation/lazy/MutableIntervalListTest.kt
+++ b/compose/foundation/foundation/src/androidUnitTest/kotlin/androidx/compose/foundation/lazy/MutableIntervalListTest.kt
@@ -45,12 +45,13 @@
     fun addOneItem_searchIndexOutOfBounds() {
         intervalList.addInterval(1, 10)
 
-        val wasException: Boolean = try {
-            intervalList[2]
-            false
-        } catch (e: IndexOutOfBoundsException) {
-            true
-        }
+        val wasException: Boolean =
+            try {
+                intervalList[2]
+                false
+            } catch (e: IndexOutOfBoundsException) {
+                true
+            }
 
         assertThat(wasException).isTrue()
     }
@@ -136,12 +137,13 @@
     fun addVariableItems_searchIndexOutOfBounds() {
         addFiveVariableIntervals()
 
-        val wasException: Boolean = try {
-            intervalList[23]
-            false
-        } catch (e: IndexOutOfBoundsException) {
-            true
-        }
+        val wasException: Boolean =
+            try {
+                intervalList[23]
+                false
+            } catch (e: IndexOutOfBoundsException) {
+                true
+            }
 
         assertThat(wasException).isTrue()
     }
@@ -150,12 +152,13 @@
     fun addOneItem_searchIndexOutOfBoundsWithNegativeValue() {
         intervalList.addInterval(1, 10)
 
-        val wasException: Boolean = try {
-            intervalList[-1]
-            false
-        } catch (e: IndexOutOfBoundsException) {
-            true
-        }
+        val wasException: Boolean =
+            try {
+                intervalList[-1]
+                false
+            } catch (e: IndexOutOfBoundsException) {
+                true
+            }
 
         assertThat(wasException).isTrue()
     }
@@ -165,9 +168,7 @@
         addFiveSingleIntervals()
         val intervals = mutableListOf<IntervalList.Interval<Int>>()
 
-        intervalList.forEach {
-            intervals.add(it)
-        }
+        intervalList.forEach { intervals.add(it) }
 
         assertThat(intervals.map { it.startIndex }).isEqualTo(listOf(0, 1, 2, 3, 4))
         assertThat(intervals.map { it.size }).isEqualTo(listOf(1, 1, 1, 1, 1))
@@ -179,9 +180,7 @@
         addFiveSingleIntervals()
         val intervals = mutableListOf<IntervalList.Interval<Int>>()
 
-        intervalList.forEach(fromIndex = 2) {
-            intervals.add(it)
-        }
+        intervalList.forEach(fromIndex = 2) { intervals.add(it) }
 
         assertThat(intervals.map { it.startIndex }).isEqualTo(listOf(2, 3, 4))
     }
@@ -191,9 +190,7 @@
         addFiveSingleIntervals()
         val intervals = mutableListOf<IntervalList.Interval<Int>>()
 
-        intervalList.forEach(fromIndex = 2, toIndex = 3) {
-            intervals.add(it)
-        }
+        intervalList.forEach(fromIndex = 2, toIndex = 3) { intervals.add(it) }
 
         assertThat(intervals.map { it.startIndex }).isEqualTo(listOf(2, 3))
     }
@@ -203,9 +200,7 @@
         addFiveSingleIntervals()
         val intervals = mutableListOf<IntervalList.Interval<Int>>()
 
-        intervalList.forEach(fromIndex = 2, toIndex = 2) {
-            intervals.add(it)
-        }
+        intervalList.forEach(fromIndex = 2, toIndex = 2) { intervals.add(it) }
 
         assertThat(intervals.map { it.startIndex }).isEqualTo(listOf(2))
     }
@@ -217,9 +212,7 @@
         intervalList.addInterval(1, 2) // startIndex = 11
         val intervals = mutableListOf<IntervalList.Interval<Int>>()
 
-        intervalList.forEach(fromIndex = 5, toIndex = 10) {
-            intervals.add(it)
-        }
+        intervalList.forEach(fromIndex = 5, toIndex = 10) { intervals.add(it) }
 
         assertThat(intervals.map { it.startIndex }).isEqualTo(listOf(0, 10))
     }
@@ -228,12 +221,13 @@
     fun forEach_startLargerThanEndThrows() {
         addFiveSingleIntervals()
 
-        val wasException: Boolean = try {
-            intervalList.forEach(fromIndex = 3, toIndex = 2) {}
-            false
-        } catch (e: IllegalArgumentException) {
-            true
-        }
+        val wasException: Boolean =
+            try {
+                intervalList.forEach(fromIndex = 3, toIndex = 2) {}
+                false
+            } catch (e: IllegalArgumentException) {
+                true
+            }
 
         assertThat(wasException).isTrue()
     }
@@ -242,36 +236,40 @@
     fun forEach_outOfBounds() {
         addFiveSingleIntervals()
 
-        val wasException1: Boolean = try {
-            intervalList.forEach(fromIndex = -1) {}
-            false
-        } catch (e: IndexOutOfBoundsException) {
-            true
-        }
+        val wasException1: Boolean =
+            try {
+                intervalList.forEach(fromIndex = -1) {}
+                false
+            } catch (e: IndexOutOfBoundsException) {
+                true
+            }
         assertThat(wasException1).isTrue()
 
-        val wasException2: Boolean = try {
-            intervalList.forEach(toIndex = -1) {}
-            false
-        } catch (e: IndexOutOfBoundsException) {
-            true
-        }
+        val wasException2: Boolean =
+            try {
+                intervalList.forEach(toIndex = -1) {}
+                false
+            } catch (e: IndexOutOfBoundsException) {
+                true
+            }
         assertThat(wasException2).isTrue()
 
-        val wasException3: Boolean = try {
-            intervalList.forEach(fromIndex = 6) {}
-            false
-        } catch (e: IndexOutOfBoundsException) {
-            true
-        }
+        val wasException3: Boolean =
+            try {
+                intervalList.forEach(fromIndex = 6) {}
+                false
+            } catch (e: IndexOutOfBoundsException) {
+                true
+            }
         assertThat(wasException3).isTrue()
 
-        val wasException4: Boolean = try {
-            intervalList.forEach(toIndex = 6) {}
-            false
-        } catch (e: IndexOutOfBoundsException) {
-            true
-        }
+        val wasException4: Boolean =
+            try {
+                intervalList.forEach(toIndex = 6) {}
+                false
+            } catch (e: IndexOutOfBoundsException) {
+                true
+            }
         assertThat(wasException4).isTrue()
     }
 
diff --git a/compose/foundation/foundation/src/androidUnitTest/kotlin/androidx/compose/foundation/text/KeyboardOptionsTest.kt b/compose/foundation/foundation/src/androidUnitTest/kotlin/androidx/compose/foundation/text/KeyboardOptionsTest.kt
index c4c5eae..7d77ba5 100644
--- a/compose/foundation/foundation/src/androidUnitTest/kotlin/androidx/compose/foundation/text/KeyboardOptionsTest.kt
+++ b/compose/foundation/foundation/src/androidUnitTest/kotlin/androidx/compose/foundation/text/KeyboardOptionsTest.kt
@@ -34,39 +34,42 @@
     fun toImeOptions_copiesRelevantProperties() {
         val platformImeOptions = PlatformImeOptions("privateImeOptions")
 
-        val keyboardOptions = KeyboardOptions(
-            keyboardType = KeyboardType.Number,
-            imeAction = ImeAction.Go,
-            capitalization = KeyboardCapitalization.Sentences,
-            autoCorrectEnabled = false,
-            platformImeOptions = platformImeOptions
-        )
-
-        assertThat(keyboardOptions.toImeOptions(singleLine = true)).isEqualTo(
-            ImeOptions(
+        val keyboardOptions =
+            KeyboardOptions(
                 keyboardType = KeyboardType.Number,
                 imeAction = ImeAction.Go,
                 capitalization = KeyboardCapitalization.Sentences,
-                autoCorrect = false,
-                singleLine = true,
+                autoCorrectEnabled = false,
                 platformImeOptions = platformImeOptions
             )
-        )
+
+        assertThat(keyboardOptions.toImeOptions(singleLine = true))
+            .isEqualTo(
+                ImeOptions(
+                    keyboardType = KeyboardType.Number,
+                    imeAction = ImeAction.Go,
+                    capitalization = KeyboardCapitalization.Sentences,
+                    autoCorrect = false,
+                    singleLine = true,
+                    platformImeOptions = platformImeOptions
+                )
+            )
     }
 
     @Test
     fun toImeOptions_replacesUnspecifiedValues() {
-        assertThat(KeyboardOptions().toImeOptions()).isEqualTo(
-            ImeOptions(
-                keyboardType = KeyboardType.Text,
-                imeAction = ImeAction.Default,
-                capitalization = KeyboardCapitalization.None,
-                autoCorrect = true,
-                singleLine = false,
-                platformImeOptions = null,
-                hintLocales = LocaleList.Empty
+        assertThat(KeyboardOptions().toImeOptions())
+            .isEqualTo(
+                ImeOptions(
+                    keyboardType = KeyboardType.Text,
+                    imeAction = ImeAction.Default,
+                    capitalization = KeyboardCapitalization.None,
+                    autoCorrect = true,
+                    singleLine = false,
+                    platformImeOptions = null,
+                    hintLocales = LocaleList.Empty
+                )
             )
-        )
     }
 
     @Test
@@ -100,25 +103,27 @@
 
     @Test
     fun fillUnspecifiedValuesWith_prefersReceiv3er() {
-        val receiver = KeyboardOptions(
-            capitalization = KeyboardCapitalization.Sentences,
-            autoCorrectEnabled = false,
-            keyboardType = KeyboardType.Password,
-            imeAction = ImeAction.Search,
-            platformImeOptions = PlatformImeOptions("receiver"),
-            showKeyboardOnFocus = false,
-            hintLocales = LocaleList("fr")
-        )
+        val receiver =
+            KeyboardOptions(
+                capitalization = KeyboardCapitalization.Sentences,
+                autoCorrectEnabled = false,
+                keyboardType = KeyboardType.Password,
+                imeAction = ImeAction.Search,
+                platformImeOptions = PlatformImeOptions("receiver"),
+                showKeyboardOnFocus = false,
+                hintLocales = LocaleList("fr")
+            )
         // All properties must be different.
-        val other = KeyboardOptions(
-            capitalization = KeyboardCapitalization.Words,
-            autoCorrectEnabled = true,
-            keyboardType = KeyboardType.Phone,
-            imeAction = ImeAction.Search,
-            platformImeOptions = PlatformImeOptions("other"),
-            showKeyboardOnFocus = true,
-            hintLocales = LocaleList("fr")
-        )
+        val other =
+            KeyboardOptions(
+                capitalization = KeyboardCapitalization.Words,
+                autoCorrectEnabled = true,
+                keyboardType = KeyboardType.Phone,
+                imeAction = ImeAction.Search,
+                platformImeOptions = PlatformImeOptions("other"),
+                showKeyboardOnFocus = true,
+                hintLocales = LocaleList("fr")
+            )
 
         assertThat(receiver.fillUnspecifiedValuesWith(other)).isEqualTo(receiver)
     }
diff --git a/compose/foundation/foundation/src/androidUnitTest/kotlin/androidx/compose/foundation/text/LegacyTextFieldStateTest.kt b/compose/foundation/foundation/src/androidUnitTest/kotlin/androidx/compose/foundation/text/LegacyTextFieldStateTest.kt
index dadf5f3..f166f7e 100644
--- a/compose/foundation/foundation/src/androidUnitTest/kotlin/androidx/compose/foundation/text/LegacyTextFieldStateTest.kt
+++ b/compose/foundation/foundation/src/androidUnitTest/kotlin/androidx/compose/foundation/text/LegacyTextFieldStateTest.kt
@@ -30,11 +30,12 @@
     @Test
     fun layoutResult_isSnapshotState() {
         // this is really a test about references, so just using mocks
-        val subject = LegacyTextFieldState(
-            textDelegate = mock(), // not needed for test
-            recomposeScope = mock(), // not needed for test
-            keyboardController = null, // not needed for test
-        )
+        val subject =
+            LegacyTextFieldState(
+                textDelegate = mock(), // not needed for test
+                recomposeScope = mock(), // not needed for test
+                keyboardController = null, // not needed for test
+            )
         val result1 = TextLayoutResultProxy(mock())
         val snapshot = Snapshot.takeMutableSnapshot()
         snapshot.enter {
diff --git a/compose/foundation/foundation/src/androidUnitTest/kotlin/androidx/compose/foundation/text/TextDelegateTest.kt b/compose/foundation/foundation/src/androidUnitTest/kotlin/androidx/compose/foundation/text/TextDelegateTest.kt
index c9a1c17..0592a79 100644
--- a/compose/foundation/foundation/src/androidUnitTest/kotlin/androidx/compose/foundation/text/TextDelegateTest.kt
+++ b/compose/foundation/foundation/src/androidUnitTest/kotlin/androidx/compose/foundation/text/TextDelegateTest.kt
@@ -35,12 +35,13 @@
 
     @Test
     fun `constructor with default values`() {
-        val textDelegate = TextDelegate(
-            text = AnnotatedString(text = ""),
-            style = TextStyle.Default,
-            density = density,
-            fontFamilyResolver = fontFamilyResolver
-        )
+        val textDelegate =
+            TextDelegate(
+                text = AnnotatedString(text = ""),
+                style = TextStyle.Default,
+                density = density,
+                fontFamilyResolver = fontFamilyResolver
+            )
 
         assertThat(textDelegate.maxLines).isEqualTo(Int.MAX_VALUE)
         assertThat(textDelegate.minLines).isEqualTo(DefaultMinLines)
@@ -50,12 +51,13 @@
     @Test
     fun `constructor with customized text(TextSpan)`() {
         val text = AnnotatedString("Hello")
-        val textDelegate = TextDelegate(
-            text = text,
-            style = TextStyle.Default,
-            density = density,
-            fontFamilyResolver = fontFamilyResolver
-        )
+        val textDelegate =
+            TextDelegate(
+                text = text,
+                style = TextStyle.Default,
+                density = density,
+                fontFamilyResolver = fontFamilyResolver
+            )
 
         assertThat(textDelegate.text).isEqualTo(text)
     }
@@ -64,13 +66,14 @@
     fun `constructor with customized maxLines`() {
         val maxLines = 8
 
-        val textDelegate = TextDelegate(
-            text = AnnotatedString(text = ""),
-            style = TextStyle.Default,
-            maxLines = maxLines,
-            density = density,
-            fontFamilyResolver = fontFamilyResolver
-        )
+        val textDelegate =
+            TextDelegate(
+                text = AnnotatedString(text = ""),
+                style = TextStyle.Default,
+                maxLines = maxLines,
+                density = density,
+                fontFamilyResolver = fontFamilyResolver
+            )
 
         assertThat(textDelegate.maxLines).isEqualTo(maxLines)
     }
@@ -79,13 +82,14 @@
     fun `constructor with customized minLines`() {
         val minLines = 8
 
-        val textDelegate = TextDelegate(
-            text = AnnotatedString(text = ""),
-            style = TextStyle.Default,
-            minLines = minLines,
-            density = density,
-            fontFamilyResolver = fontFamilyResolver
-        )
+        val textDelegate =
+            TextDelegate(
+                text = AnnotatedString(text = ""),
+                style = TextStyle.Default,
+                minLines = minLines,
+                density = density,
+                fontFamilyResolver = fontFamilyResolver
+            )
 
         assertThat(textDelegate.minLines).isEqualTo(minLines)
     }
@@ -94,37 +98,40 @@
     fun `constructor with customized overflow`() {
         val overflow = TextOverflow.Ellipsis
 
-        val textDelegate = TextDelegate(
-            text = AnnotatedString(text = ""),
-            style = TextStyle.Default,
-            overflow = overflow,
-            density = density,
-            fontFamilyResolver = fontFamilyResolver
-        )
+        val textDelegate =
+            TextDelegate(
+                text = AnnotatedString(text = ""),
+                style = TextStyle.Default,
+                overflow = overflow,
+                density = density,
+                fontFamilyResolver = fontFamilyResolver
+            )
 
         assertThat(textDelegate.overflow).isEqualTo(overflow)
     }
 
     @Test(expected = IllegalStateException::class)
     fun `minIntrinsicWidth without layout assertion should fail`() {
-        val textDelegate = TextDelegate(
-            text = AnnotatedString(text = ""),
-            style = TextStyle.Default,
-            density = density,
-            fontFamilyResolver = fontFamilyResolver
-        )
+        val textDelegate =
+            TextDelegate(
+                text = AnnotatedString(text = ""),
+                style = TextStyle.Default,
+                density = density,
+                fontFamilyResolver = fontFamilyResolver
+            )
 
         textDelegate.minIntrinsicWidth
     }
 
     @Test(expected = IllegalStateException::class)
     fun `maxIntrinsicWidth without layout assertion should fail`() {
-        val textDelegate = TextDelegate(
-            text = AnnotatedString(text = ""),
-            style = TextStyle.Default,
-            density = density,
-            fontFamilyResolver = fontFamilyResolver
-        )
+        val textDelegate =
+            TextDelegate(
+                text = AnnotatedString(text = ""),
+                style = TextStyle.Default,
+                density = density,
+                fontFamilyResolver = fontFamilyResolver
+            )
 
         textDelegate.maxIntrinsicWidth
     }
diff --git a/compose/foundation/foundation/src/androidUnitTest/kotlin/androidx/compose/foundation/text/TextFieldBringIntoViewTest.kt b/compose/foundation/foundation/src/androidUnitTest/kotlin/androidx/compose/foundation/text/TextFieldBringIntoViewTest.kt
index 7697ed4..f8da756 100644
--- a/compose/foundation/foundation/src/androidUnitTest/kotlin/androidx/compose/foundation/text/TextFieldBringIntoViewTest.kt
+++ b/compose/foundation/foundation/src/androidUnitTest/kotlin/androidx/compose/foundation/text/TextFieldBringIntoViewTest.kt
@@ -55,13 +55,13 @@
     private val textLayoutResult: TextLayoutResult = mock()
     private val bringIntoViewRequester: BringIntoViewRequester = mock()
 
-    /**
-     * Test implementation of offset map which doubles the offset in transformed text.
-     */
-    private val skippingOffsetMap = object : OffsetMapping {
-        override fun originalToTransformed(offset: Int): Int = offset * 2
-        override fun transformedToOriginal(offset: Int): Int = offset / 2
-    }
+    /** Test implementation of offset map which doubles the offset in transformed text. */
+    private val skippingOffsetMap =
+        object : OffsetMapping {
+            override fun originalToTransformed(offset: Int): Int = offset * 2
+
+            override fun transformedToOriginal(offset: Int): Int = offset / 2
+        }
 
     @Before
     fun setup() {
@@ -73,23 +73,22 @@
         val rect = Rect(0f, 1f, 2f, 3f)
         whenever(textLayoutResult.getBoundingBox(any())).thenReturn(rect)
         val point = Offset(5f, 6f)
-        layoutCoordinates = MockCoordinates(
-            rootOffset = point
-        )
+        layoutCoordinates = MockCoordinates(rootOffset = point)
         val editorState = TextFieldValue(text = "Hello, World", selection = TextRange(1))
 
-        val input = TextLayoutInput(
-            text = AnnotatedString(editorState.text),
-            style = TextStyle(),
-            placeholders = listOf(),
-            maxLines = Int.MAX_VALUE,
-            softWrap = true,
-            overflow = TextOverflow.Clip,
-            density = Density(1.0f),
-            layoutDirection = LayoutDirection.Ltr,
-            fontFamilyResolver = mock(),
-            constraints = mock()
-        )
+        val input =
+            TextLayoutInput(
+                text = AnnotatedString(editorState.text),
+                style = TextStyle(),
+                placeholders = listOf(),
+                maxLines = Int.MAX_VALUE,
+                softWrap = true,
+                overflow = TextOverflow.Clip,
+                density = Density(1.0f),
+                layoutDirection = LayoutDirection.Ltr,
+                fontFamilyResolver = mock(),
+                constraints = mock()
+            )
         whenever(textLayoutResult.layoutInput).thenReturn(input)
 
         runBlocking {
@@ -108,22 +107,21 @@
         val rect = Rect(0f, 1f, 2f, 3f)
         whenever(textLayoutResult.getBoundingBox(any())).thenReturn(rect)
         val point = Offset(5f, 6f)
-        layoutCoordinates = MockCoordinates(
-            rootOffset = point
-        )
+        layoutCoordinates = MockCoordinates(rootOffset = point)
         val editorState = TextFieldValue(text = "Hello, World", selection = TextRange(12))
-        val input = TextLayoutInput(
-            text = AnnotatedString(editorState.text),
-            style = TextStyle(),
-            placeholders = listOf(),
-            maxLines = Int.MAX_VALUE,
-            softWrap = true,
-            overflow = TextOverflow.Clip,
-            density = Density(1.0f),
-            layoutDirection = LayoutDirection.Ltr,
-            fontFamilyResolver = mock(),
-            constraints = mock()
-        )
+        val input =
+            TextLayoutInput(
+                text = AnnotatedString(editorState.text),
+                style = TextStyle(),
+                placeholders = listOf(),
+                maxLines = Int.MAX_VALUE,
+                softWrap = true,
+                overflow = TextOverflow.Clip,
+                density = Density(1.0f),
+                layoutDirection = LayoutDirection.Ltr,
+                fontFamilyResolver = mock(),
+                constraints = mock()
+            )
         whenever(textLayoutResult.layoutInput).thenReturn(input)
 
         runBlocking {
@@ -144,22 +142,21 @@
         val editorState = TextFieldValue(text = "Hello, World", selection = TextRange(1, 3))
 
         whenever(textLayoutResult.getBoundingBox(any())).thenReturn(rect)
-        val input = TextLayoutInput(
-            text = AnnotatedString(editorState.text),
-            style = TextStyle(),
-            placeholders = listOf(),
-            maxLines = Int.MAX_VALUE,
-            softWrap = true,
-            overflow = TextOverflow.Clip,
-            density = Density(1.0f),
-            layoutDirection = LayoutDirection.Ltr,
-            fontFamilyResolver = mock(),
-            constraints = mock()
-        )
+        val input =
+            TextLayoutInput(
+                text = AnnotatedString(editorState.text),
+                style = TextStyle(),
+                placeholders = listOf(),
+                maxLines = Int.MAX_VALUE,
+                softWrap = true,
+                overflow = TextOverflow.Clip,
+                density = Density(1.0f),
+                layoutDirection = LayoutDirection.Ltr,
+                fontFamilyResolver = mock(),
+                constraints = mock()
+            )
         whenever(textLayoutResult.layoutInput).thenReturn(input)
-        layoutCoordinates = MockCoordinates(
-            rootOffset = point
-        )
+        layoutCoordinates = MockCoordinates(rootOffset = point)
 
         runBlocking {
             bringIntoViewRequester.bringSelectionEndIntoView(
@@ -178,29 +175,30 @@
         val rect = Rect(0f, 1f, 2f, 3f)
         whenever(textLayoutResult.getBoundingBox(any())).thenReturn(rect)
         val point = Offset(5f, 6f)
-        layoutCoordinates = MockCoordinates(
-            rootOffset = point
-        )
+        layoutCoordinates = MockCoordinates(rootOffset = point)
 
-        val input = TextLayoutInput(
-            // In this test case, transform the text into double characters text.
-            text = AnnotatedString("HHeelllloo,,  WWoorrlldd"),
-            style = TextStyle(),
-            placeholders = listOf(),
-            maxLines = Int.MAX_VALUE,
-            softWrap = true,
-            overflow = TextOverflow.Clip,
-            density = Density(1.0f),
-            layoutDirection = LayoutDirection.Ltr,
-            fontFamilyResolver = mock(),
-            constraints = mock()
-        )
+        val input =
+            TextLayoutInput(
+                // In this test case, transform the text into double characters text.
+                text = AnnotatedString("HHeelllloo,,  WWoorrlldd"),
+                style = TextStyle(),
+                placeholders = listOf(),
+                maxLines = Int.MAX_VALUE,
+                softWrap = true,
+                overflow = TextOverflow.Clip,
+                density = Density(1.0f),
+                layoutDirection = LayoutDirection.Ltr,
+                fontFamilyResolver = mock(),
+                constraints = mock()
+            )
         whenever(textLayoutResult.layoutInput).thenReturn(input)
 
-        val offsetMapping = object : OffsetMapping {
-            override fun originalToTransformed(offset: Int): Int = offset * 2
-            override fun transformedToOriginal(offset: Int): Int = offset / 2
-        }
+        val offsetMapping =
+            object : OffsetMapping {
+                override fun originalToTransformed(offset: Int): Int = offset * 2
+
+                override fun transformedToOriginal(offset: Int): Int = offset / 2
+            }
 
         // The beginning of the text.
         runBlocking {
@@ -246,10 +244,13 @@
     ) : LayoutCoordinates {
         override val providedAlignmentLines: Set<AlignmentLine>
             get() = emptySet()
+
         override val parentLayoutCoordinates: LayoutCoordinates?
             get() = null
+
         override val parentCoordinates: LayoutCoordinates?
             get() = null
+
         override val isAttached: Boolean
             get() = true
 
@@ -258,6 +259,7 @@
         override fun localToWindow(relativeToLocal: Offset): Offset = globalOffset
 
         override fun localToRoot(relativeToLocal: Offset): Offset = rootOffset
+
         override fun localPositionOf(
             sourceCoordinates: LayoutCoordinates,
             relativeToSource: Offset
diff --git a/compose/foundation/foundation/src/androidUnitTest/kotlin/androidx/compose/foundation/text/TextFieldDelegateTest.kt b/compose/foundation/foundation/src/androidUnitTest/kotlin/androidx/compose/foundation/text/TextFieldDelegateTest.kt
index bb5dea7..9b8d9eb 100644
--- a/compose/foundation/foundation/src/androidUnitTest/kotlin/androidx/compose/foundation/text/TextFieldDelegateTest.kt
+++ b/compose/foundation/foundation/src/androidUnitTest/kotlin/androidx/compose/foundation/text/TextFieldDelegateTest.kt
@@ -67,13 +67,13 @@
     private lateinit var textLayoutResultProxy: TextLayoutResultProxy
     private lateinit var textLayoutResult: TextLayoutResult
 
-    /**
-     * Test implementation of offset map which doubles the offset in transformed text.
-     */
-    private val skippingOffsetMap = object : OffsetMapping {
-        override fun originalToTransformed(offset: Int): Int = offset * 2
-        override fun transformedToOriginal(offset: Int): Int = offset / 2
-    }
+    /** Test implementation of offset map which doubles the offset in transformed text. */
+    private val skippingOffsetMap =
+        object : OffsetMapping {
+            override fun originalToTransformed(offset: Int): Int = offset * 2
+
+            override fun transformedToOriginal(offset: Int): Int = offset / 2
+        }
 
     @Before
     fun setup() {
@@ -106,73 +106,68 @@
             onValueChange
         )
 
-        verify(onValueChange, times(1)).invoke(
-            eq(TextFieldValue(text = editorState.text, selection = TextRange(offset)))
-        )
+        verify(onValueChange, times(1))
+            .invoke(eq(TextFieldValue(text = editorState.text, selection = TextRange(offset))))
     }
 
     @Test
     fun on_focus() {
         val editorState = TextFieldValue(text = "Hello, World", selection = TextRange(1))
-        val imeOptions = ImeOptions(
-            singleLine = true,
-            capitalization = KeyboardCapitalization.Sentences,
-            keyboardType = KeyboardType.Phone,
-            imeAction = ImeAction.Search
-        )
+        val imeOptions =
+            ImeOptions(
+                singleLine = true,
+                capitalization = KeyboardCapitalization.Sentences,
+                keyboardType = KeyboardType.Phone,
+                imeAction = ImeAction.Search
+            )
 
         val textInputSession: TextInputSession = mock()
         whenever(
-            textInputService.startInput(
-                eq(editorState),
+                textInputService.startInput(
+                    eq(editorState),
+                    eq(imeOptions),
+                    any(),
+                    eq(onEditorActionPerformed)
+                )
+            )
+            .thenReturn(textInputSession)
+
+        val actual =
+            TextFieldDelegate.onFocus(
+                textInputService = textInputService,
+                value = editorState,
+                editProcessor = processor,
+                imeOptions = imeOptions,
+                onValueChange = onValueChange,
+                onImeActionPerformed = onEditorActionPerformed
+            )
+        verify(textInputService)
+            .startInput(
+                eq(TextFieldValue(text = editorState.text, selection = editorState.selection)),
                 eq(imeOptions),
                 any(),
                 eq(onEditorActionPerformed)
             )
-        ).thenReturn(textInputSession)
-
-        val actual = TextFieldDelegate.onFocus(
-            textInputService = textInputService,
-            value = editorState,
-            editProcessor = processor,
-            imeOptions = imeOptions,
-            onValueChange = onValueChange,
-            onImeActionPerformed = onEditorActionPerformed
-        )
-        verify(textInputService).startInput(
-            eq(
-                TextFieldValue(
-                    text = editorState.text,
-                    selection = editorState.selection
-                )
-            ),
-            eq(imeOptions),
-            any(),
-            eq(onEditorActionPerformed)
-        )
 
         assertThat(actual).isEqualTo(textInputSession)
     }
 
     @Test
     fun on_blur_with_hiding() {
-        val editorState = TextFieldValue(
-            text = "Hello, World",
-            selection = TextRange(1),
-            composition = TextRange(3, 5)
-        )
+        val editorState =
+            TextFieldValue(
+                text = "Hello, World",
+                selection = TextRange(1),
+                composition = TextRange(3, 5)
+            )
         whenever(processor.toTextFieldValue()).thenReturn(editorState)
 
         val textInputSession = mock<TextInputSession>()
 
         TextFieldDelegate.onBlur(textInputSession, processor, onValueChange)
 
-        inOrder(textInputSession) {
-            verify(textInputSession).dispose()
-        }
-        verify(onValueChange, times(1)).invoke(
-            eq(editorState.copy(composition = null))
-        )
+        inOrder(textInputSession) { verify(textInputSession).dispose() }
+        verify(onValueChange, times(1)).invoke(eq(editorState.copy(composition = null)))
     }
 
     @Test
@@ -191,16 +186,14 @@
             onValueChange
         )
 
-        verify(onValueChange, times(1)).invoke(
-            eq(TextFieldValue(text = editorState.text, selection = TextRange(offset / 2)))
-        )
+        verify(onValueChange, times(1))
+            .invoke(eq(TextFieldValue(text = editorState.text, selection = TextRange(offset / 2))))
     }
 
     @Test
     fun use_identity_mapping_if_none_visual_transformation() {
-        val transformedText = VisualTransformation.None.filter(
-            AnnotatedString(text = "Hello, World")
-        )
+        val transformedText =
+            VisualTransformation.None.filter(AnnotatedString(text = "Hello, World"))
         val visualText = transformedText.text
         val offsetMapping = transformedText.offsetMapping
 
@@ -214,86 +207,110 @@
 
     @Test
     fun apply_composition_decoration() {
-        val identityOffsetMapping = object : OffsetMapping {
-            override fun originalToTransformed(offset: Int): Int = offset
-            override fun transformedToOriginal(offset: Int): Int = offset
-        }
+        val identityOffsetMapping =
+            object : OffsetMapping {
+                override fun originalToTransformed(offset: Int): Int = offset
 
-        val input = TransformedText(
-            text = AnnotatedString.Builder().apply {
-                pushStyle(SpanStyle(color = Color.Red))
-                append("Hello, World")
-            }.toAnnotatedString(),
-            offsetMapping = identityOffsetMapping
-        )
+                override fun transformedToOriginal(offset: Int): Int = offset
+            }
 
-        val result = TextFieldDelegate.applyCompositionDecoration(
-            compositionRange = TextRange(3, 6),
-            transformed = input
-        )
+        val input =
+            TransformedText(
+                text =
+                    AnnotatedString.Builder()
+                        .apply {
+                            pushStyle(SpanStyle(color = Color.Red))
+                            append("Hello, World")
+                        }
+                        .toAnnotatedString(),
+                offsetMapping = identityOffsetMapping
+            )
+
+        val result =
+            TextFieldDelegate.applyCompositionDecoration(
+                compositionRange = TextRange(3, 6),
+                transformed = input
+            )
 
         assertThat(result.text.text).isEqualTo(input.text.text)
         assertThat(result.text.spanStyles.size).isEqualTo(2)
-        assertThat(result.text.spanStyles).contains(
-            AnnotatedString.Range(SpanStyle(textDecoration = TextDecoration.Underline), 3, 6)
-        )
+        assertThat(result.text.spanStyles)
+            .contains(
+                AnnotatedString.Range(SpanStyle(textDecoration = TextDecoration.Underline), 3, 6)
+            )
     }
 
     @Test
     fun applyCompositionDecoration_negativeRange_isAppliedReversed() {
         // condition can be reached on Samsung Android 9 w/ Samsung keyboard
         // b/299583698
-        val identityOffsetMapping = object : OffsetMapping {
-            override fun originalToTransformed(offset: Int): Int = offset
-            override fun transformedToOriginal(offset: Int): Int = offset
-        }
+        val identityOffsetMapping =
+            object : OffsetMapping {
+                override fun originalToTransformed(offset: Int): Int = offset
 
-        val input = TransformedText(
-            text = AnnotatedString.Builder().apply {
-                pushStyle(SpanStyle(color = Color.Red))
-                append("Hello, World")
-            }.toAnnotatedString(),
-            offsetMapping = identityOffsetMapping
-        )
+                override fun transformedToOriginal(offset: Int): Int = offset
+            }
 
-        val result = TextFieldDelegate.applyCompositionDecoration(
-            compositionRange = TextRange(3, 0),
-            transformed = input
-        )
-        assertThat(result.text.spanStyles).contains(
-            AnnotatedString.Range(SpanStyle(textDecoration = TextDecoration.Underline), 0, 3)
-        )
+        val input =
+            TransformedText(
+                text =
+                    AnnotatedString.Builder()
+                        .apply {
+                            pushStyle(SpanStyle(color = Color.Red))
+                            append("Hello, World")
+                        }
+                        .toAnnotatedString(),
+                offsetMapping = identityOffsetMapping
+            )
+
+        val result =
+            TextFieldDelegate.applyCompositionDecoration(
+                compositionRange = TextRange(3, 0),
+                transformed = input
+            )
+        assertThat(result.text.spanStyles)
+            .contains(
+                AnnotatedString.Range(SpanStyle(textDecoration = TextDecoration.Underline), 0, 3)
+            )
     }
 
     @Test
     fun apply_composition_decoration_with_offsetmap() {
         val offsetAmount = 5
-        val offsetMapping = object : OffsetMapping {
-            override fun originalToTransformed(offset: Int): Int = offsetAmount + offset
-            override fun transformedToOriginal(offset: Int): Int = offset - offsetAmount
-        }
+        val offsetMapping =
+            object : OffsetMapping {
+                override fun originalToTransformed(offset: Int): Int = offsetAmount + offset
 
-        val input = TransformedText(
-            text = AnnotatedString.Builder().apply {
-                append(" ".repeat(offsetAmount))
-                append("Hello World")
-            }.toAnnotatedString(),
-            offsetMapping = offsetMapping
-        )
+                override fun transformedToOriginal(offset: Int): Int = offset - offsetAmount
+            }
+
+        val input =
+            TransformedText(
+                text =
+                    AnnotatedString.Builder()
+                        .apply {
+                            append(" ".repeat(offsetAmount))
+                            append("Hello World")
+                        }
+                        .toAnnotatedString(),
+                offsetMapping = offsetMapping
+            )
 
         val range = TextRange(0, 2)
-        val result = TextFieldDelegate.applyCompositionDecoration(
-            compositionRange = range,
-            transformed = input
-        )
+        val result =
+            TextFieldDelegate.applyCompositionDecoration(
+                compositionRange = range,
+                transformed = input
+            )
 
         assertThat(result.text.spanStyles.size).isEqualTo(1)
-        assertThat(result.text.spanStyles).contains(
-            AnnotatedString.Range(
-                SpanStyle(textDecoration = TextDecoration.Underline),
-                range.start + offsetAmount,
-                range.end + offsetAmount
+        assertThat(result.text.spanStyles)
+            .contains(
+                AnnotatedString.Range(
+                    SpanStyle(textDecoration = TextDecoration.Underline),
+                    range.start + offsetAmount,
+                    range.end + offsetAmount
+                )
             )
-        )
     }
 }
diff --git a/compose/foundation/foundation/src/androidUnitTest/kotlin/androidx/compose/foundation/text/TextFieldScrollerPositionTest.kt b/compose/foundation/foundation/src/androidUnitTest/kotlin/androidx/compose/foundation/text/TextFieldScrollerPositionTest.kt
index 00b434a..d3dafa4 100644
--- a/compose/foundation/foundation/src/androidUnitTest/kotlin/androidx/compose/foundation/text/TextFieldScrollerPositionTest.kt
+++ b/compose/foundation/foundation/src/androidUnitTest/kotlin/androidx/compose/foundation/text/TextFieldScrollerPositionTest.kt
@@ -22,10 +22,8 @@
 
 class TextFieldScrollerPositionTest {
 
-    private val scrollerPosition = TextFieldScrollerPosition(
-        initial = 15f,
-        initialOrientation = Orientation.Vertical
-    )
+    private val scrollerPosition =
+        TextFieldScrollerPosition(initial = 15f, initialOrientation = Orientation.Vertical)
     private val ContainerSize = 20
 
     // container is smaller than cursor
diff --git a/compose/foundation/foundation/src/androidUnitTest/kotlin/androidx/compose/foundation/text/TextLayoutHelperTest.kt b/compose/foundation/foundation/src/androidUnitTest/kotlin/androidx/compose/foundation/text/TextLayoutHelperTest.kt
index d14c552..5cbb3769 100644
--- a/compose/foundation/foundation/src/androidUnitTest/kotlin/androidx/compose/foundation/text/TextLayoutHelperTest.kt
+++ b/compose/foundation/foundation/src/androidUnitTest/kotlin/androidx/compose/foundation/text/TextLayoutHelperTest.kt
@@ -55,271 +55,292 @@
         val multiParagraph = mock<MultiParagraph>()
         whenever(multiParagraph.intrinsics).thenReturn(intrinsics)
         whenever(intrinsics.hasStaleResolvedFonts).thenReturn(false)
-        referenceResult = TextLayoutResult(
-            TextLayoutInput(
-                text = AnnotatedString.Builder("Hello, World").toAnnotatedString(),
-                style = TextStyle(),
-                placeholders = listOf(),
-                maxLines = 1,
-                softWrap = true,
-                overflow = TextOverflow.Ellipsis,
-                density = Density(1.0f),
-                layoutDirection = LayoutDirection.Ltr,
-                fontFamilyResolver = fontFamilyResolver,
-                constraints = Constraints.fixedWidth(100)
-            ),
-            multiParagraph = multiParagraph,
-            size = IntSize(50, 50)
-        )
+        referenceResult =
+            TextLayoutResult(
+                TextLayoutInput(
+                    text = AnnotatedString.Builder("Hello, World").toAnnotatedString(),
+                    style = TextStyle(),
+                    placeholders = listOf(),
+                    maxLines = 1,
+                    softWrap = true,
+                    overflow = TextOverflow.Ellipsis,
+                    density = Density(1.0f),
+                    layoutDirection = LayoutDirection.Ltr,
+                    fontFamilyResolver = fontFamilyResolver,
+                    constraints = Constraints.fixedWidth(100)
+                ),
+                multiParagraph = multiParagraph,
+                size = IntSize(50, 50)
+            )
     }
 
     @Test
     fun testCanReuse_same() {
         val constraints = Constraints.fixedWidth(100)
         assertThat(
-            referenceResult.canReuse(
-                text = AnnotatedString.Builder("Hello, World").toAnnotatedString(),
-                style = TextStyle(),
-                placeholders = emptyList(),
-                maxLines = 1,
-                softWrap = true,
-                overflow = TextOverflow.Ellipsis,
-                density = Density(1.0f),
-                layoutDirection = LayoutDirection.Ltr,
-                fontFamilyResolver = fontFamilyResolver,
-                constraints = constraints
+                referenceResult.canReuse(
+                    text = AnnotatedString.Builder("Hello, World").toAnnotatedString(),
+                    style = TextStyle(),
+                    placeholders = emptyList(),
+                    maxLines = 1,
+                    softWrap = true,
+                    overflow = TextOverflow.Ellipsis,
+                    density = Density(1.0f),
+                    layoutDirection = LayoutDirection.Ltr,
+                    fontFamilyResolver = fontFamilyResolver,
+                    constraints = constraints
+                )
             )
-        ).isTrue()
+            .isTrue()
     }
 
     @Test
     fun testCanReuse_different_text() {
         val constraints = Constraints.fixedWidth(100)
         assertThat(
-            referenceResult.canReuse(
-                text = AnnotatedString.Builder("Hello, Android").toAnnotatedString(),
-                style = TextStyle(),
-                placeholders = emptyList(),
-                maxLines = 1,
-                softWrap = true,
-                overflow = TextOverflow.Ellipsis,
-                density = Density(1.0f),
-                layoutDirection = LayoutDirection.Ltr,
-                fontFamilyResolver = fontFamilyResolver,
-                constraints = constraints
+                referenceResult.canReuse(
+                    text = AnnotatedString.Builder("Hello, Android").toAnnotatedString(),
+                    style = TextStyle(),
+                    placeholders = emptyList(),
+                    maxLines = 1,
+                    softWrap = true,
+                    overflow = TextOverflow.Ellipsis,
+                    density = Density(1.0f),
+                    layoutDirection = LayoutDirection.Ltr,
+                    fontFamilyResolver = fontFamilyResolver,
+                    constraints = constraints
+                )
             )
-        ).isFalse()
+            .isFalse()
     }
 
     @Test
     fun testCanReuse_different_style() {
         val constraints = Constraints.fixedWidth(100)
         assertThat(
-            referenceResult.canReuse(
-                text = AnnotatedString.Builder("Hello, World").toAnnotatedString(),
-                style = TextStyle(fontSize = 1.5.em),
-                placeholders = emptyList(),
-                maxLines = 1,
-                softWrap = true,
-                overflow = TextOverflow.Ellipsis,
-                density = Density(1.0f),
-                layoutDirection = LayoutDirection.Ltr,
-                fontFamilyResolver = fontFamilyResolver,
-                constraints = constraints
+                referenceResult.canReuse(
+                    text = AnnotatedString.Builder("Hello, World").toAnnotatedString(),
+                    style = TextStyle(fontSize = 1.5.em),
+                    placeholders = emptyList(),
+                    maxLines = 1,
+                    softWrap = true,
+                    overflow = TextOverflow.Ellipsis,
+                    density = Density(1.0f),
+                    layoutDirection = LayoutDirection.Ltr,
+                    fontFamilyResolver = fontFamilyResolver,
+                    constraints = constraints
+                )
             )
-        ).isFalse()
+            .isFalse()
     }
 
     @Test
     fun testCanReuse_different_maxLines() {
         val constraints = Constraints.fixedWidth(100)
         assertThat(
-            referenceResult.canReuse(
-                text = AnnotatedString.Builder("Hello, World").toAnnotatedString(),
-                style = TextStyle(),
-                placeholders = emptyList(),
-                maxLines = 2,
-                softWrap = true,
-                overflow = TextOverflow.Ellipsis,
-                density = Density(1.0f),
-                layoutDirection = LayoutDirection.Ltr,
-                fontFamilyResolver = fontFamilyResolver,
-                constraints = constraints
+                referenceResult.canReuse(
+                    text = AnnotatedString.Builder("Hello, World").toAnnotatedString(),
+                    style = TextStyle(),
+                    placeholders = emptyList(),
+                    maxLines = 2,
+                    softWrap = true,
+                    overflow = TextOverflow.Ellipsis,
+                    density = Density(1.0f),
+                    layoutDirection = LayoutDirection.Ltr,
+                    fontFamilyResolver = fontFamilyResolver,
+                    constraints = constraints
+                )
             )
-        ).isFalse()
+            .isFalse()
     }
 
     @Test
     fun testCanReuse_different_softWrap() {
         val constraints = Constraints.fixedWidth(100)
         assertThat(
-            referenceResult.canReuse(
-                text = AnnotatedString.Builder("Hello, World").toAnnotatedString(),
-                style = TextStyle(),
-                placeholders = emptyList(),
-                maxLines = 1,
-                softWrap = false,
-                overflow = TextOverflow.Ellipsis,
-                density = Density(1.0f),
-                layoutDirection = LayoutDirection.Ltr,
-                fontFamilyResolver = fontFamilyResolver,
-                constraints = constraints
+                referenceResult.canReuse(
+                    text = AnnotatedString.Builder("Hello, World").toAnnotatedString(),
+                    style = TextStyle(),
+                    placeholders = emptyList(),
+                    maxLines = 1,
+                    softWrap = false,
+                    overflow = TextOverflow.Ellipsis,
+                    density = Density(1.0f),
+                    layoutDirection = LayoutDirection.Ltr,
+                    fontFamilyResolver = fontFamilyResolver,
+                    constraints = constraints
+                )
             )
-        ).isFalse()
+            .isFalse()
     }
 
     @Test
     fun testCanReuse_different_overflow() {
         val constraints = Constraints.fixedWidth(100)
         assertThat(
-            referenceResult.canReuse(
-                text = AnnotatedString.Builder("Hello, World").toAnnotatedString(),
-                style = TextStyle(),
-                placeholders = emptyList(),
-                maxLines = 1,
-                softWrap = true,
-                overflow = TextOverflow.Clip,
-                density = Density(1.0f),
-                layoutDirection = LayoutDirection.Ltr,
-                fontFamilyResolver = fontFamilyResolver,
-                constraints = constraints
+                referenceResult.canReuse(
+                    text = AnnotatedString.Builder("Hello, World").toAnnotatedString(),
+                    style = TextStyle(),
+                    placeholders = emptyList(),
+                    maxLines = 1,
+                    softWrap = true,
+                    overflow = TextOverflow.Clip,
+                    density = Density(1.0f),
+                    layoutDirection = LayoutDirection.Ltr,
+                    fontFamilyResolver = fontFamilyResolver,
+                    constraints = constraints
+                )
             )
-        ).isFalse()
+            .isFalse()
     }
 
     @Test
     fun testCanReuse_different_density() {
         val constraints = Constraints.fixedWidth(100)
         assertThat(
-            referenceResult.canReuse(
-                text = AnnotatedString.Builder("Hello, World").toAnnotatedString(),
-                style = TextStyle(),
-                placeholders = emptyList(),
-                maxLines = 1,
-                softWrap = true,
-                overflow = TextOverflow.Ellipsis,
-                density = Density(2.0f),
-                layoutDirection = LayoutDirection.Ltr,
-                fontFamilyResolver = fontFamilyResolver,
-                constraints = constraints
+                referenceResult.canReuse(
+                    text = AnnotatedString.Builder("Hello, World").toAnnotatedString(),
+                    style = TextStyle(),
+                    placeholders = emptyList(),
+                    maxLines = 1,
+                    softWrap = true,
+                    overflow = TextOverflow.Ellipsis,
+                    density = Density(2.0f),
+                    layoutDirection = LayoutDirection.Ltr,
+                    fontFamilyResolver = fontFamilyResolver,
+                    constraints = constraints
+                )
             )
-        ).isFalse()
+            .isFalse()
     }
 
     @Test
     fun testCanReuse_different_layoutDirection() {
         val constraints = Constraints.fixedWidth(100)
         assertThat(
-            referenceResult.canReuse(
-                text = AnnotatedString.Builder("Hello, World").toAnnotatedString(),
-                style = TextStyle(),
-                placeholders = emptyList(),
-                maxLines = 1,
-                softWrap = true,
-                overflow = TextOverflow.Ellipsis,
-                density = Density(1.0f),
-                layoutDirection = LayoutDirection.Rtl,
-                fontFamilyResolver = fontFamilyResolver,
-                constraints = constraints
+                referenceResult.canReuse(
+                    text = AnnotatedString.Builder("Hello, World").toAnnotatedString(),
+                    style = TextStyle(),
+                    placeholders = emptyList(),
+                    maxLines = 1,
+                    softWrap = true,
+                    overflow = TextOverflow.Ellipsis,
+                    density = Density(1.0f),
+                    layoutDirection = LayoutDirection.Rtl,
+                    fontFamilyResolver = fontFamilyResolver,
+                    constraints = constraints
+                )
             )
-        ).isFalse()
+            .isFalse()
     }
 
     @Test
     fun testCanReuse_different_resourceLoader() {
         val constraints = Constraints.fixedWidth(100)
         assertThat(
-            referenceResult.canReuse(
-                text = AnnotatedString.Builder("Hello, World").toAnnotatedString(),
-                style = TextStyle(),
-                placeholders = emptyList(),
-                maxLines = 1,
-                softWrap = true,
-                overflow = TextOverflow.Ellipsis,
-                density = Density(1.0f),
-                layoutDirection = LayoutDirection.Ltr,
-                fontFamilyResolver = mock(),
-                constraints = constraints
+                referenceResult.canReuse(
+                    text = AnnotatedString.Builder("Hello, World").toAnnotatedString(),
+                    style = TextStyle(),
+                    placeholders = emptyList(),
+                    maxLines = 1,
+                    softWrap = true,
+                    overflow = TextOverflow.Ellipsis,
+                    density = Density(1.0f),
+                    layoutDirection = LayoutDirection.Ltr,
+                    fontFamilyResolver = mock(),
+                    constraints = constraints
+                )
             )
-        ).isFalse()
+            .isFalse()
     }
 
     @Test
     fun testCanReuse_different_constraintsWidth() {
         assertThat(
-            referenceResult.canReuse(
-                text = AnnotatedString.Builder("Hello, World").toAnnotatedString(),
-                style = TextStyle(),
-                placeholders = emptyList(),
-                maxLines = 1,
-                softWrap = true,
-                overflow = TextOverflow.Ellipsis,
-                density = Density(1.0f),
-                layoutDirection = LayoutDirection.Ltr,
-                fontFamilyResolver = fontFamilyResolver,
-                constraints = Constraints.fixedWidth(200)
+                referenceResult.canReuse(
+                    text = AnnotatedString.Builder("Hello, World").toAnnotatedString(),
+                    style = TextStyle(),
+                    placeholders = emptyList(),
+                    maxLines = 1,
+                    softWrap = true,
+                    overflow = TextOverflow.Ellipsis,
+                    density = Density(1.0f),
+                    layoutDirection = LayoutDirection.Ltr,
+                    fontFamilyResolver = fontFamilyResolver,
+                    constraints = Constraints.fixedWidth(200)
+                )
             )
-        ).isFalse()
+            .isFalse()
     }
 
     @Test
     fun testCanReuse_different_constraintsHeight() {
         assertThat(
-            referenceResult.canReuse(
-                text = AnnotatedString.Builder("Hello, World").toAnnotatedString(),
-                style = TextStyle(),
-                placeholders = emptyList(),
-                maxLines = 1,
-                softWrap = true,
-                overflow = TextOverflow.Ellipsis,
-                density = Density(1.0f),
-                layoutDirection = LayoutDirection.Ltr,
-                fontFamilyResolver = fontFamilyResolver,
-                constraints = Constraints.fixedHeight(200)
+                referenceResult.canReuse(
+                    text = AnnotatedString.Builder("Hello, World").toAnnotatedString(),
+                    style = TextStyle(),
+                    placeholders = emptyList(),
+                    maxLines = 1,
+                    softWrap = true,
+                    overflow = TextOverflow.Ellipsis,
+                    density = Density(1.0f),
+                    layoutDirection = LayoutDirection.Ltr,
+                    fontFamilyResolver = fontFamilyResolver,
+                    constraints = Constraints.fixedHeight(200)
+                )
             )
-        ).isFalse()
+            .isFalse()
     }
 
     @Test
     fun testCanReuse_different_placeholders() {
         assertThat(
-            referenceResult.canReuse(
-                text = AnnotatedString.Builder("Hello, World").toAnnotatedString(),
-                style = TextStyle(),
-                placeholders = listOf(
-                    AnnotatedString.Range(
-                        item = Placeholder(10.sp, 20.sp, PlaceholderVerticalAlign.AboveBaseline),
-                        start = 0,
-                        end = 5
-                    )
-                ),
-                maxLines = 1,
-                softWrap = true,
-                overflow = TextOverflow.Ellipsis,
-                density = Density(1.0f),
-                layoutDirection = LayoutDirection.Ltr,
-                fontFamilyResolver = fontFamilyResolver,
-                constraints = Constraints.fixedWidth(200)
+                referenceResult.canReuse(
+                    text = AnnotatedString.Builder("Hello, World").toAnnotatedString(),
+                    style = TextStyle(),
+                    placeholders =
+                        listOf(
+                            AnnotatedString.Range(
+                                item =
+                                    Placeholder(
+                                        10.sp,
+                                        20.sp,
+                                        PlaceholderVerticalAlign.AboveBaseline
+                                    ),
+                                start = 0,
+                                end = 5
+                            )
+                        ),
+                    maxLines = 1,
+                    softWrap = true,
+                    overflow = TextOverflow.Ellipsis,
+                    density = Density(1.0f),
+                    layoutDirection = LayoutDirection.Ltr,
+                    fontFamilyResolver = fontFamilyResolver,
+                    constraints = Constraints.fixedWidth(200)
+                )
             )
-        ).isFalse()
+            .isFalse()
     }
 
     @Test
     fun testCanReuse_notLatestTypefaces_isFalse() {
         val constraints = Constraints.fixedWidth(100)
-        whenever(referenceResult.multiParagraph.intrinsics.hasStaleResolvedFonts)
-            .thenReturn(true)
-        assertThat(referenceResult.canReuse(
-            text = AnnotatedString.Builder("Hello, World").toAnnotatedString(),
-            style = TextStyle(),
-            placeholders = emptyList(),
-            maxLines = 1,
-            softWrap = true,
-            overflow = TextOverflow.Ellipsis,
-            density = Density(1.0f),
-            layoutDirection = LayoutDirection.Ltr,
-            fontFamilyResolver = fontFamilyResolver,
-            constraints = constraints
-        )).isFalse()
+        whenever(referenceResult.multiParagraph.intrinsics.hasStaleResolvedFonts).thenReturn(true)
+        assertThat(
+                referenceResult.canReuse(
+                    text = AnnotatedString.Builder("Hello, World").toAnnotatedString(),
+                    style = TextStyle(),
+                    placeholders = emptyList(),
+                    maxLines = 1,
+                    softWrap = true,
+                    overflow = TextOverflow.Ellipsis,
+                    density = Density(1.0f),
+                    layoutDirection = LayoutDirection.Ltr,
+                    fontFamilyResolver = fontFamilyResolver,
+                    constraints = constraints
+                )
+            )
+            .isFalse()
     }
 }
diff --git a/compose/foundation/foundation/src/androidUnitTest/kotlin/androidx/compose/foundation/text/UndoManagerTest.kt b/compose/foundation/foundation/src/androidUnitTest/kotlin/androidx/compose/foundation/text/UndoManagerTest.kt
index 55a7818..10b31e9 100644
--- a/compose/foundation/foundation/src/androidUnitTest/kotlin/androidx/compose/foundation/text/UndoManagerTest.kt
+++ b/compose/foundation/foundation/src/androidUnitTest/kotlin/androidx/compose/foundation/text/UndoManagerTest.kt
@@ -29,24 +29,14 @@
         val manager = UndoManager(10)
         manager.makeSnapshot(TextFieldValue("hi"))
         manager.makeSnapshot(TextFieldValue("hello"))
-        assertThat(manager.undo()).isEqualTo(
-            TextFieldValue("hi")
-        )
+        assertThat(manager.undo()).isEqualTo(TextFieldValue("hi"))
         assertThat(manager.undo()).isNull()
-        assertThat(manager.redo()).isEqualTo(
-            TextFieldValue("hello")
-        )
+        assertThat(manager.redo()).isEqualTo(TextFieldValue("hello"))
         assertThat(manager.redo()).isNull()
-        assertThat(manager.undo()).isEqualTo(
-            TextFieldValue("hi")
-        )
+        assertThat(manager.undo()).isEqualTo(TextFieldValue("hi"))
         manager.makeSnapshot(TextFieldValue("hola"))
-        assertThat(manager.undo()).isEqualTo(
-            TextFieldValue("hi")
-        )
-        assertThat(manager.redo()).isEqualTo(
-            TextFieldValue("hola")
-        )
+        assertThat(manager.undo()).isEqualTo(TextFieldValue("hi"))
+        assertThat(manager.redo()).isEqualTo(TextFieldValue("hola"))
     }
 
     @Test
@@ -55,13 +45,9 @@
         manager.makeSnapshot(TextFieldValue("hi"))
         manager.makeSnapshot(TextFieldValue("hello"))
         manager.makeSnapshot(TextFieldValue("hola"))
-        assertThat(manager.undo()).isEqualTo(
-            TextFieldValue("hello")
-        )
+        assertThat(manager.undo()).isEqualTo(TextFieldValue("hello"))
         assertThat(manager.undo()).isNull()
-        assertThat(manager.redo()).isEqualTo(
-            TextFieldValue("hola")
-        )
+        assertThat(manager.redo()).isEqualTo(TextFieldValue("hola"))
     }
 
     @Test
@@ -70,12 +56,8 @@
         manager.makeSnapshot(TextFieldValue("hi"))
         manager.makeSnapshot(TextFieldValue("hello"))
         manager.makeSnapshot(TextFieldValue("hola"))
-        assertThat(manager.undo()).isEqualTo(
-            TextFieldValue("hello")
-        )
-        assertThat(manager.undo()).isEqualTo(
-            TextFieldValue("hi")
-        )
+        assertThat(manager.undo()).isEqualTo(TextFieldValue("hello"))
+        assertThat(manager.undo()).isEqualTo(TextFieldValue("hi"))
     }
 
     @Test
@@ -86,9 +68,7 @@
         assertThat(manager.undo()).isNull()
 
         manager.snapshotIfNeeded(TextFieldValue("hi"), now = SNAPSHOTS_INTERVAL_MILLIS + 1L)
-        assertThat(manager.undo()).isEqualTo(
-            TextFieldValue("hello")
-        )
+        assertThat(manager.undo()).isEqualTo(TextFieldValue("hello"))
     }
 
     @Test
@@ -97,8 +77,6 @@
         manager.makeSnapshot(TextFieldValue("hello"))
         manager.forceNextSnapshot()
         manager.snapshotIfNeeded(TextFieldValue("hi"), now = 0)
-        assertThat(manager.undo()).isEqualTo(
-            TextFieldValue("hello")
-        )
+        assertThat(manager.undo()).isEqualTo(TextFieldValue("hello"))
     }
 }
diff --git a/compose/foundation/foundation/src/androidUnitTest/kotlin/androidx/compose/foundation/text/ValidatingOffsetMappingKtTest.kt b/compose/foundation/foundation/src/androidUnitTest/kotlin/androidx/compose/foundation/text/ValidatingOffsetMappingKtTest.kt
index 6fbe4af..ccacf0e 100644
--- a/compose/foundation/foundation/src/androidUnitTest/kotlin/androidx/compose/foundation/text/ValidatingOffsetMappingKtTest.kt
+++ b/compose/foundation/foundation/src/androidUnitTest/kotlin/androidx/compose/foundation/text/ValidatingOffsetMappingKtTest.kt
@@ -27,14 +27,10 @@
 class ValidatingOffsetMappingKtTest {
 
     companion object {
-        @Parameterized.Parameters
-        @JvmStatic
-        fun params() = (0..100).toList()
+        @Parameterized.Parameters @JvmStatic fun params() = (0..100).toList()
     }
 
-    @Parameterized.Parameter(0)
-    @JvmField
-    var index: Int = -1
+    @Parameterized.Parameter(0) @JvmField var index: Int = -1
     private val maxValue = 10
 
     private val longText = "a".repeat(100)
@@ -70,26 +66,27 @@
         throwTransformedToOriginal(index).throwIfNotValidTransform(longText.length, maxValue)
     }
 
-    private fun throwOriginalToTransformed(throwAtPosition: Int) = TransformedText(
-        AnnotatedString(longText),
-        offsetMapping = object : OffsetMapping {
-            override fun originalToTransformed(offset: Int) = if (offset == throwAtPosition)
-                Int.MAX_VALUE
-            else
-                offset
+    private fun throwOriginalToTransformed(throwAtPosition: Int) =
+        TransformedText(
+            AnnotatedString(longText),
+            offsetMapping =
+                object : OffsetMapping {
+                    override fun originalToTransformed(offset: Int) =
+                        if (offset == throwAtPosition) Int.MAX_VALUE else offset
 
-            override fun transformedToOriginal(offset: Int) = offset
-        }
-    )
+                    override fun transformedToOriginal(offset: Int) = offset
+                }
+        )
 
-    private fun throwTransformedToOriginal(throwAtPosition: Int) = TransformedText(
-        AnnotatedString(longText),
-        offsetMapping = object : OffsetMapping {
-            override fun originalToTransformed(offset: Int) = offset
-            override fun transformedToOriginal(offset: Int) = if (offset == throwAtPosition)
-                Int.MAX_VALUE
-            else
-                offset
-        }
-    )
+    private fun throwTransformedToOriginal(throwAtPosition: Int) =
+        TransformedText(
+            AnnotatedString(longText),
+            offsetMapping =
+                object : OffsetMapping {
+                    override fun originalToTransformed(offset: Int) = offset
+
+                    override fun transformedToOriginal(offset: Int) =
+                        if (offset == throwAtPosition) Int.MAX_VALUE else offset
+                }
+        )
 }
diff --git a/compose/foundation/foundation/src/androidUnitTest/kotlin/androidx/compose/foundation/text/ValidatingOffsetMappingTest.kt b/compose/foundation/foundation/src/androidUnitTest/kotlin/androidx/compose/foundation/text/ValidatingOffsetMappingTest.kt
index ad361f4..eb59269 100644
--- a/compose/foundation/foundation/src/androidUnitTest/kotlin/androidx/compose/foundation/text/ValidatingOffsetMappingTest.kt
+++ b/compose/foundation/foundation/src/androidUnitTest/kotlin/androidx/compose/foundation/text/ValidatingOffsetMappingTest.kt
@@ -35,10 +35,14 @@
     @Test
     fun filterWithValidation_allowsZero_whenOriginalToTransformed() {
         val transformation = VisualTransformation { original ->
-            TransformedText(original, object : OffsetMapping {
-                override fun originalToTransformed(offset: Int): Int = 0
-                override fun transformedToOriginal(offset: Int): Int = 0
-            })
+            TransformedText(
+                original,
+                object : OffsetMapping {
+                    override fun originalToTransformed(offset: Int): Int = 0
+
+                    override fun transformedToOriginal(offset: Int): Int = 0
+                }
+            )
         }
 
         val transformed = transformation.filterWithValidation(AnnotatedString(text))
@@ -49,10 +53,14 @@
     @Test
     fun filterWithValidation_allowsZero_whenTransformedToOriginal() {
         val transformation = VisualTransformation { original ->
-            TransformedText(original, object : OffsetMapping {
-                override fun originalToTransformed(offset: Int): Int = 0
-                override fun transformedToOriginal(offset: Int): Int = 0
-            })
+            TransformedText(
+                original,
+                object : OffsetMapping {
+                    override fun originalToTransformed(offset: Int): Int = 0
+
+                    override fun transformedToOriginal(offset: Int): Int = 0
+                }
+            )
         }
 
         val transformed = transformation.filterWithValidation(AnnotatedString(text))
@@ -64,10 +72,14 @@
     fun filterWithValidation_allowsTextLength_whenOriginalToTransformed() {
         val transformation = VisualTransformation { original ->
             // Transformed text is longer to ensure transformed length is used for validation.
-            TransformedText(original + original, object : OffsetMapping {
-                override fun originalToTransformed(offset: Int): Int = text.length * 2
-                override fun transformedToOriginal(offset: Int): Int = 0
-            })
+            TransformedText(
+                original + original,
+                object : OffsetMapping {
+                    override fun originalToTransformed(offset: Int): Int = text.length * 2
+
+                    override fun transformedToOriginal(offset: Int): Int = 0
+                }
+            )
         }
 
         val transformed = transformation.filterWithValidation(AnnotatedString(text))
@@ -79,10 +91,14 @@
     fun filterWithValidation_allowsTextLength_whenTransformedToOriginal() {
         val transformation = VisualTransformation { original ->
             // Transformed text is shorter to ensure the original length is used for validation.
-            TransformedText(original.subSequence(0, 1), object : OffsetMapping {
-                override fun originalToTransformed(offset: Int): Int = 0
-                override fun transformedToOriginal(offset: Int): Int = text.length
-            })
+            TransformedText(
+                original.subSequence(0, 1),
+                object : OffsetMapping {
+                    override fun originalToTransformed(offset: Int): Int = 0
+
+                    override fun transformedToOriginal(offset: Int): Int = text.length
+                }
+            )
         }
 
         val transformed = transformation.filterWithValidation(AnnotatedString(text))
@@ -95,10 +111,14 @@
         val transformation = VisualTransformation { original ->
             // Transformation is not important, returning invalid index should not matter if the
             // supplied offset itself is invalid in its space.
-            TransformedText(original, object : OffsetMapping {
-                override fun originalToTransformed(offset: Int): Int = offset
-                override fun transformedToOriginal(offset: Int): Int = offset
-            })
+            TransformedText(
+                original,
+                object : OffsetMapping {
+                    override fun originalToTransformed(offset: Int): Int = offset
+
+                    override fun transformedToOriginal(offset: Int): Int = offset
+                }
+            )
         }
 
         val transformed = transformation.filterWithValidation(AnnotatedString(text))
@@ -114,53 +134,69 @@
     fun filterWithValidation_throws_whenInvalidOriginalToTransformed() {
         var startFailing = false
         val transformation = VisualTransformation { original ->
-            TransformedText(original, object : OffsetMapping {
-                override fun originalToTransformed(offset: Int): Int = if (startFailing) {
-                    invalidIndex
-                } else {
-                    0
+            TransformedText(
+                original,
+                object : OffsetMapping {
+                    override fun originalToTransformed(offset: Int): Int =
+                        if (startFailing) {
+                            invalidIndex
+                        } else {
+                            0
+                        }
+
+                    override fun transformedToOriginal(offset: Int): Int = 0
                 }
-                override fun transformedToOriginal(offset: Int): Int = 0
-            })
+            )
         }
 
         val transformed = transformation.filterWithValidation(AnnotatedString(text))
 
         startFailing = true
-        val error = assertFailsWith<IllegalStateException> {
-            transformed.offsetMapping.originalToTransformed(1)
-        }
+        val error =
+            assertFailsWith<IllegalStateException> {
+                transformed.offsetMapping.originalToTransformed(1)
+            }
 
-        assertThat(error).hasMessageThat().isEqualTo(
-            "OffsetMapping.originalToTransformed returned invalid mapping: " +
-                "1 -> $invalidIndex is not in range of transformed text [0, ${text.length}]"
-        )
+        assertThat(error)
+            .hasMessageThat()
+            .isEqualTo(
+                "OffsetMapping.originalToTransformed returned invalid mapping: " +
+                    "1 -> $invalidIndex is not in range of transformed text [0, ${text.length}]"
+            )
     }
 
     @Test
     fun filterWithValidation_throws_whenInvalidTransformedToOriginal() {
         var startFailing = false
         val transformation = VisualTransformation { original ->
-            TransformedText(original, object : OffsetMapping {
-                override fun originalToTransformed(offset: Int): Int = 0
-                override fun transformedToOriginal(offset: Int): Int = if (startFailing) {
-                    invalidIndex
-                } else {
-                    0
+            TransformedText(
+                original,
+                object : OffsetMapping {
+                    override fun originalToTransformed(offset: Int): Int = 0
+
+                    override fun transformedToOriginal(offset: Int): Int =
+                        if (startFailing) {
+                            invalidIndex
+                        } else {
+                            0
+                        }
                 }
-            })
+            )
         }
 
         val transformed = transformation.filterWithValidation(AnnotatedString(text))
 
         startFailing = true
-        val error = assertFailsWith<IllegalStateException> {
-            transformed.offsetMapping.transformedToOriginal(1)
-        }
+        val error =
+            assertFailsWith<IllegalStateException> {
+                transformed.offsetMapping.transformedToOriginal(1)
+            }
 
-        assertThat(error).hasMessageThat().isEqualTo(
-            "OffsetMapping.transformedToOriginal returned invalid mapping: " +
-                "1 -> $invalidIndex is not in range of original text [0, ${text.length}]"
-        )
+        assertThat(error)
+            .hasMessageThat()
+            .isEqualTo(
+                "OffsetMapping.transformedToOriginal returned invalid mapping: " +
+                    "1 -> $invalidIndex is not in range of original text [0, ${text.length}]"
+            )
     }
 }
diff --git a/compose/foundation/foundation/src/androidUnitTest/kotlin/androidx/compose/foundation/text/input/AllCapsTransformationTest.kt b/compose/foundation/foundation/src/androidUnitTest/kotlin/androidx/compose/foundation/text/input/AllCapsTransformationTest.kt
index f2155f4..a1ca76f 100644
--- a/compose/foundation/foundation/src/androidUnitTest/kotlin/androidx/compose/foundation/text/input/AllCapsTransformationTest.kt
+++ b/compose/foundation/foundation/src/androidUnitTest/kotlin/androidx/compose/foundation/text/input/AllCapsTransformationTest.kt
@@ -40,9 +40,7 @@
         val transformation = InputTransformation.allCaps(Locale("en-US"))
 
         val originalValue = TextFieldCharSequence("")
-        val buffer = TextFieldBuffer(originalValue).apply {
-            append("hello")
-        }
+        val buffer = TextFieldBuffer(originalValue).apply { append("hello") }
 
         with(transformation) { buffer.transformInput() }
 
@@ -54,9 +52,7 @@
         val transformation = InputTransformation.allCaps(Locale("en-US"))
 
         val originalValue = TextFieldCharSequence("hello")
-        val buffer = TextFieldBuffer(originalValue).apply {
-            append(" world")
-        }
+        val buffer = TextFieldBuffer(originalValue).apply { append(" world") }
 
         with(transformation) { buffer.transformInput() }
 
@@ -68,9 +64,7 @@
         val transformation = InputTransformation.allCaps(Locale("tr"))
 
         val originalValue = TextFieldCharSequence("")
-        val buffer = TextFieldBuffer(originalValue).apply {
-            append("i")
-        }
+        val buffer = TextFieldBuffer(originalValue).apply { append("i") }
 
         with(transformation) { buffer.transformInput() }
 
diff --git a/compose/foundation/foundation/src/androidUnitTest/kotlin/androidx/compose/foundation/text/input/InputTransformationTest.kt b/compose/foundation/foundation/src/androidUnitTest/kotlin/androidx/compose/foundation/text/input/InputTransformationTest.kt
index d517272..dcc5eea 100644
--- a/compose/foundation/foundation/src/androidUnitTest/kotlin/androidx/compose/foundation/text/input/InputTransformationTest.kt
+++ b/compose/foundation/foundation/src/androidUnitTest/kotlin/androidx/compose/foundation/text/input/InputTransformationTest.kt
@@ -66,18 +66,18 @@
 
     @Test
     fun chainedFilters_haveNullKeyboardOptions_whenBothOptionsAreNull() {
-        val filter1 = object : InputTransformation {
-            override val keyboardOptions = null
+        val filter1 =
+            object : InputTransformation {
+                override val keyboardOptions = null
 
-            override fun TextFieldBuffer.transformInput() {
+                override fun TextFieldBuffer.transformInput() {}
             }
-        }
-        val filter2 = object : InputTransformation {
-            override val keyboardOptions = null
+        val filter2 =
+            object : InputTransformation {
+                override val keyboardOptions = null
 
-            override fun TextFieldBuffer.transformInput() {
+                override fun TextFieldBuffer.transformInput() {}
             }
-        }
 
         val chain = filter1.then(filter2)
 
@@ -87,18 +87,18 @@
     @Test
     fun chainedFilters_takeFirstKeyboardOptions_whenSecondOptionsAreNull() {
         val options = KeyboardOptions()
-        val filter1 = object : InputTransformation {
-            override val keyboardOptions = options
+        val filter1 =
+            object : InputTransformation {
+                override val keyboardOptions = options
 
-            override fun TextFieldBuffer.transformInput() {
+                override fun TextFieldBuffer.transformInput() {}
             }
-        }
-        val filter2 = object : InputTransformation {
-            override val keyboardOptions = null
+        val filter2 =
+            object : InputTransformation {
+                override val keyboardOptions = null
 
-            override fun TextFieldBuffer.transformInput() {
+                override fun TextFieldBuffer.transformInput() {}
             }
-        }
 
         val chain = filter1.then(filter2)
 
@@ -108,18 +108,18 @@
     @Test
     fun chainedFilters_takeSecondKeyboardOptions_whenFirstOptionsAreNull() {
         val options = KeyboardOptions()
-        val filter1 = object : InputTransformation {
-            override val keyboardOptions = null
+        val filter1 =
+            object : InputTransformation {
+                override val keyboardOptions = null
 
-            override fun TextFieldBuffer.transformInput() {
+                override fun TextFieldBuffer.transformInput() {}
             }
-        }
-        val filter2 = object : InputTransformation {
-            override val keyboardOptions = options
+        val filter2 =
+            object : InputTransformation {
+                override val keyboardOptions = options
 
-            override fun TextFieldBuffer.transformInput() {
+                override fun TextFieldBuffer.transformInput() {}
             }
-        }
 
         val chain = filter1.then(filter2)
 
@@ -130,18 +130,18 @@
     fun chainedFilters_takeSecondKeyboardOptions_whenFirstOptionsAreNotNull() {
         val options1 = KeyboardOptions()
         val options2 = KeyboardOptions()
-        val filter1 = object : InputTransformation {
-            override val keyboardOptions = options1
+        val filter1 =
+            object : InputTransformation {
+                override val keyboardOptions = options1
 
-            override fun TextFieldBuffer.transformInput() {
+                override fun TextFieldBuffer.transformInput() {}
             }
-        }
-        val filter2 = object : InputTransformation {
-            override val keyboardOptions = options2
+        val filter2 =
+            object : InputTransformation {
+                override val keyboardOptions = options2
 
-            override fun TextFieldBuffer.transformInput() {
+                override fun TextFieldBuffer.transformInput() {}
             }
-        }
 
         val chain = filter1.then(filter2)
 
@@ -150,56 +150,56 @@
 
     @Test
     fun chainedFilters_mergeKeyboardOptions_withPrecedenceToNext() {
-        val options1 = KeyboardOptions(
-            keyboardType = KeyboardType.Password,
-            capitalization = KeyboardCapitalization.Sentences
-        )
-        val options2 = KeyboardOptions(
-            keyboardType = KeyboardType.Email,
-            imeAction = ImeAction.Search
-        )
-        val filter1 = object : InputTransformation {
-            override val keyboardOptions = options1
+        val options1 =
+            KeyboardOptions(
+                keyboardType = KeyboardType.Password,
+                capitalization = KeyboardCapitalization.Sentences
+            )
+        val options2 =
+            KeyboardOptions(keyboardType = KeyboardType.Email, imeAction = ImeAction.Search)
+        val filter1 =
+            object : InputTransformation {
+                override val keyboardOptions = options1
 
-            override fun TextFieldBuffer.transformInput() {
+                override fun TextFieldBuffer.transformInput() {}
             }
-        }
-        val filter2 = object : InputTransformation {
-            override val keyboardOptions = options2
+        val filter2 =
+            object : InputTransformation {
+                override val keyboardOptions = options2
 
-            override fun TextFieldBuffer.transformInput() {
+                override fun TextFieldBuffer.transformInput() {}
             }
-        }
 
         val chain = filter1.then(filter2)
 
-        assertThat(chain.keyboardOptions).isEqualTo(
-            KeyboardOptions(
-                keyboardType = KeyboardType.Email,
-                capitalization = KeyboardCapitalization.Sentences,
-                imeAction = ImeAction.Search
+        assertThat(chain.keyboardOptions)
+            .isEqualTo(
+                KeyboardOptions(
+                    keyboardType = KeyboardType.Email,
+                    capitalization = KeyboardCapitalization.Sentences,
+                    imeAction = ImeAction.Search
+                )
             )
-        )
     }
 
     @Test
     fun chainedFilters_applySecondSemantics_afterFirstSemantics() {
-        val filter1 = object : InputTransformation {
-            override fun SemanticsPropertyReceiver.applySemantics() {
-                maxTextLength = 10
-            }
+        val filter1 =
+            object : InputTransformation {
+                override fun SemanticsPropertyReceiver.applySemantics() {
+                    maxTextLength = 10
+                }
 
-            override fun TextFieldBuffer.transformInput() {
+                override fun TextFieldBuffer.transformInput() {}
             }
-        }
-        val filter2 = object : InputTransformation {
-            override fun SemanticsPropertyReceiver.applySemantics() {
-                maxTextLength = 20
-            }
+        val filter2 =
+            object : InputTransformation {
+                override fun SemanticsPropertyReceiver.applySemantics() {
+                    maxTextLength = 20
+                }
 
-            override fun TextFieldBuffer.transformInput() {
+                override fun TextFieldBuffer.transformInput() {}
             }
-        }
 
         val chain = filter1.then(filter2)
 
diff --git a/compose/foundation/foundation/src/androidUnitTest/kotlin/androidx/compose/foundation/text/input/TextFieldBufferTest.kt b/compose/foundation/foundation/src/androidUnitTest/kotlin/androidx/compose/foundation/text/input/TextFieldBufferTest.kt
index 8650c3df..27d8af2 100644
--- a/compose/foundation/foundation/src/androidUnitTest/kotlin/androidx/compose/foundation/text/input/TextFieldBufferTest.kt
+++ b/compose/foundation/foundation/src/androidUnitTest/kotlin/androidx/compose/foundation/text/input/TextFieldBufferTest.kt
@@ -156,10 +156,11 @@
     @Test
     fun resetTo_copiesTextAndSelection() {
         val expectedValue = TextFieldCharSequence("world", TextRange(5))
-        val state = TextFieldBuffer(
-            initialValue = TextFieldCharSequence("hello", TextRange(2)),
-            originalValue = expectedValue
-        )
+        val state =
+            TextFieldBuffer(
+                initialValue = TextFieldCharSequence("hello", TextRange(2)),
+                originalValue = expectedValue
+            )
         state.revertAllChanges()
         assertThat(state.toTextFieldCharSequence()).isEqualTo(expectedValue)
         assertThat(state.changes.changeCount).isEqualTo(0)
@@ -169,24 +170,18 @@
     fun placeCursorBeforeCharAt_emptyBuffer() {
         val buffer = TextFieldBuffer(TextFieldCharSequence(""))
 
-        assertFailsWith<IllegalArgumentException> {
-            buffer.placeCursorBeforeCharAt(-1)
-        }
+        assertFailsWith<IllegalArgumentException> { buffer.placeCursorBeforeCharAt(-1) }
 
         buffer.placeCursorBeforeCharAt(0)
         assertThat(buffer.selection).isEqualTo(TextRange(0))
 
-        assertFailsWith<IllegalArgumentException> {
-            buffer.placeCursorBeforeCharAt(1)
-        }
+        assertFailsWith<IllegalArgumentException> { buffer.placeCursorBeforeCharAt(1) }
     }
 
     @Test
     fun placeCursorBeforeCharAt_nonEmptyBuffer() {
         val buffer = TextFieldBuffer(TextFieldCharSequence("hello"))
-        assertFailsWith<IllegalArgumentException> {
-            buffer.placeCursorBeforeCharAt(-1)
-        }
+        assertFailsWith<IllegalArgumentException> { buffer.placeCursorBeforeCharAt(-1) }
 
         buffer.placeCursorBeforeCharAt(0)
         assertThat(buffer.selection).isEqualTo(TextRange(0))
@@ -197,9 +192,7 @@
         buffer.placeCursorBeforeCharAt(5)
         assertThat(buffer.selection).isEqualTo(TextRange(5))
 
-        assertFailsWith<IllegalArgumentException> {
-            buffer.placeCursorBeforeCharAt(6)
-        }
+        assertFailsWith<IllegalArgumentException> { buffer.placeCursorBeforeCharAt(6) }
     }
 
     @Test
@@ -209,13 +202,9 @@
         buffer.placeCursorAfterCharAt(-1)
         assertThat(buffer.selection).isEqualTo(TextRange(0))
 
-        assertFailsWith<IllegalArgumentException> {
-            buffer.placeCursorAfterCharAt(0)
-        }
+        assertFailsWith<IllegalArgumentException> { buffer.placeCursorAfterCharAt(0) }
 
-        assertFailsWith<IllegalArgumentException> {
-            buffer.placeCursorAfterCharAt(1)
-        }
+        assertFailsWith<IllegalArgumentException> { buffer.placeCursorAfterCharAt(1) }
     }
 
     @Test
@@ -234,9 +223,7 @@
         buffer.placeCursorAfterCharAt(4)
         assertThat(buffer.selection).isEqualTo(TextRange(5))
 
-        assertFailsWith<IllegalArgumentException> {
-            buffer.placeCursorAfterCharAt(5)
-        }
+        assertFailsWith<IllegalArgumentException> { buffer.placeCursorAfterCharAt(5) }
     }
 
     @Test
@@ -246,9 +233,7 @@
         buffer.selection = TextRange(0)
         assertThat(buffer.selection).isEqualTo(TextRange(0))
 
-        assertFailsWith<IllegalArgumentException> {
-            buffer.selection = TextRange(0, 1)
-        }
+        assertFailsWith<IllegalArgumentException> { buffer.selection = TextRange(0, 1) }
     }
 
     @Test
@@ -270,13 +255,9 @@
         buffer.selection = TextRange(5, 5)
         assertThat(buffer.selection).isEqualTo(TextRange(5, 5))
 
-        assertFailsWith<IllegalArgumentException> {
-            buffer.selection = TextRange(5, 6)
-        }
+        assertFailsWith<IllegalArgumentException> { buffer.selection = TextRange(5, 6) }
 
-        assertFailsWith<IllegalArgumentException> {
-            buffer.selection = TextRange(6, 6)
-        }
+        assertFailsWith<IllegalArgumentException> { buffer.selection = TextRange(6, 6) }
     }
 
     @Test
@@ -471,21 +452,15 @@
     fun charAt_throws_whenEmpty() {
         val buffer = TextFieldBuffer(TextFieldCharSequence())
 
-        assertFailsWith<IndexOutOfBoundsException> {
-            buffer.charAt(0)
-        }
+        assertFailsWith<IndexOutOfBoundsException> { buffer.charAt(0) }
     }
 
     @Test
     fun charAt_throws_whenOutOfBounds() {
         val buffer = TextFieldBuffer(TextFieldCharSequence("a"))
 
-        assertFailsWith<IndexOutOfBoundsException> {
-            buffer.charAt(1)
-        }
-        assertFailsWith<IndexOutOfBoundsException> {
-            buffer.charAt(-1)
-        }
+        assertFailsWith<IndexOutOfBoundsException> { buffer.charAt(1) }
+        assertFailsWith<IndexOutOfBoundsException> { buffer.charAt(-1) }
     }
 
     @Test
@@ -510,26 +485,20 @@
     @Test
     fun replace_withSubSequence_crossedOffsets() {
         val buffer = TextFieldBuffer(TextFieldCharSequence(""))
-        val error = assertFailsWith<IllegalArgumentException> {
-            buffer.replace(0, 0, "hi", 2, 0)
-        }
+        val error = assertFailsWith<IllegalArgumentException> { buffer.replace(0, 0, "hi", 2, 0) }
         assertThat(error.message).isEqualTo("Expected textStart=2 <= textEnd=0")
     }
 
     @Test
     fun replace_withSubSequence_startTooSmall() {
         val buffer = TextFieldBuffer(TextFieldCharSequence(""))
-        assertFailsWith<IllegalArgumentException> {
-            buffer.replace(0, 0, "hi", -1, 0)
-        }
+        assertFailsWith<IllegalArgumentException> { buffer.replace(0, 0, "hi", -1, 0) }
     }
 
     @Test
     fun replace_withSubSequence_endTooBig() {
         val buffer = TextFieldBuffer(TextFieldCharSequence(""))
-        assertFailsWith<IndexOutOfBoundsException> {
-            buffer.replace(0, 0, "hi", 2, 3)
-        }
+        assertFailsWith<IndexOutOfBoundsException> { buffer.replace(0, 0, "hi", 2, 3) }
     }
 
     @Test
@@ -613,9 +582,7 @@
             .isEqualTo(TextFieldCharSequence("hello", selection = TextRange(2)))
         assertThat("he_l_lo".parseAsTextEditState())
             .isEqualTo(TextFieldCharSequence("hello", selection = TextRange(2, 3)))
-        assertFailsWith<ParseException> {
-            "_he_llo_".parseAsTextEditState()
-        }
+        assertFailsWith<ParseException> { "_he_llo_".parseAsTextEditState() }
 
         listOf("", "_hello", "h_ello", "hello_", "_hello_", "he_ll_o").forEach {
             val value = it.parseAsTextEditState()
@@ -657,11 +624,12 @@
 
         return TextFieldCharSequence(
             text = text,
-            selection = when {
-                firstMark == -1 -> TextRange.Zero
-                secondMark == -1 -> TextRange(firstMark)
-                else -> TextRange(firstMark, secondMark)
-            }
+            selection =
+                when {
+                    firstMark == -1 -> TextRange.Zero
+                    secondMark == -1 -> TextRange(firstMark)
+                    else -> TextRange(firstMark, secondMark)
+                }
         )
     }
 
@@ -685,6 +653,7 @@
             result = Pair(TextRange(aStart, aEnd), TextRange(bStart, bEnd))
         }
         assertWithMessage("Expected findCommonPrefixAndSuffix(\"$a\", \"$b\") to report")
-            .that(result).isEqualTo(expectedRanges)
+            .that(result)
+            .isEqualTo(expectedRanges)
     }
 }
diff --git a/compose/foundation/foundation/src/androidUnitTest/kotlin/androidx/compose/foundation/text/input/TextFieldCharSequenceTest.kt b/compose/foundation/foundation/src/androidUnitTest/kotlin/androidx/compose/foundation/text/input/TextFieldCharSequenceTest.kt
index ee73f5a..2ab7d18 100644
--- a/compose/foundation/foundation/src/androidUnitTest/kotlin/androidx/compose/foundation/text/input/TextFieldCharSequenceTest.kt
+++ b/compose/foundation/foundation/src/androidUnitTest/kotlin/androidx/compose/foundation/text/input/TextFieldCharSequenceTest.kt
@@ -80,41 +80,41 @@
 
     @Test
     fun equals_returns_true_for_same_instance() {
-        val textFieldValue = TextFieldCharSequence(
-            text = "a",
-            selection = TextRange(1),
-            composition = TextRange(2),
-            highlight = Pair(TextHighlightType.HandwritingSelectPreview, TextRange(0, 1))
-        )
+        val textFieldValue =
+            TextFieldCharSequence(
+                text = "a",
+                selection = TextRange(1),
+                composition = TextRange(2),
+                highlight = Pair(TextHighlightType.HandwritingSelectPreview, TextRange(0, 1))
+            )
 
         assertThat(textFieldValue).isEqualTo(textFieldValue)
     }
 
     @Test
     fun equals_returns_true_for_equivalent_object() {
-        val textFieldValue = TextFieldCharSequence(
-            text = "a",
-            selection = TextRange(1),
-            composition = TextRange(2),
-            highlight = Pair(TextHighlightType.HandwritingSelectPreview, TextRange(0, 1))
-        )
+        val textFieldValue =
+            TextFieldCharSequence(
+                text = "a",
+                selection = TextRange(1),
+                composition = TextRange(2),
+                highlight = Pair(TextHighlightType.HandwritingSelectPreview, TextRange(0, 1))
+            )
 
         assertThat(
-            TextFieldCharSequence(
-                textFieldValue,
-                textFieldValue.selection,
-                textFieldValue.composition,
-                textFieldValue.highlight
+                TextFieldCharSequence(
+                    textFieldValue,
+                    textFieldValue.selection,
+                    textFieldValue.composition,
+                    textFieldValue.highlight
+                )
             )
-        ).isEqualTo(textFieldValue)
+            .isEqualTo(textFieldValue)
     }
 
     @Test
     fun text_and_selection_parameter_constructor_has_null_composition_and_highlight() {
-        val textFieldValue = TextFieldCharSequence(
-            text = "a",
-            selection = TextRange(1)
-        )
+        val textFieldValue = TextFieldCharSequence(text = "a", selection = TextRange(1))
 
         assertThat(textFieldValue.composition).isNull()
         assertThat(textFieldValue.highlight).isNull()
diff --git a/compose/foundation/foundation/src/androidUnitTest/kotlin/androidx/compose/foundation/text/input/TextFieldStateSaverTest.kt b/compose/foundation/foundation/src/androidUnitTest/kotlin/androidx/compose/foundation/text/input/TextFieldStateSaverTest.kt
index 9437e55..3e286df 100644
--- a/compose/foundation/foundation/src/androidUnitTest/kotlin/androidx/compose/foundation/text/input/TextFieldStateSaverTest.kt
+++ b/compose/foundation/foundation/src/androidUnitTest/kotlin/androidx/compose/foundation/text/input/TextFieldStateSaverTest.kt
@@ -44,9 +44,7 @@
     fun savesAndRestoresUndo() {
         val state = TextFieldState("hello, world", initialSelection = TextRange(0, 5))
 
-        state.editAsUser(null) {
-            commitText("hi", 1)
-        }
+        state.editAsUser(null) { commitText("hi", 1) }
 
         val saved = with(TextFieldState.Saver) { TestSaverScope.save(state) }
         assertNotNull(saved)
diff --git a/compose/foundation/foundation/src/androidUnitTest/kotlin/androidx/compose/foundation/text/input/TextFieldStateTest.kt b/compose/foundation/foundation/src/androidUnitTest/kotlin/androidx/compose/foundation/text/input/TextFieldStateTest.kt
index 6b053e2..126777b 100644
--- a/compose/foundation/foundation/src/androidUnitTest/kotlin/androidx/compose/foundation/text/input/TextFieldStateTest.kt
+++ b/compose/foundation/foundation/src/androidUnitTest/kotlin/androidx/compose/foundation/text/input/TextFieldStateTest.kt
@@ -74,9 +74,7 @@
         ) {
             state.edit {
                 replace(0, 0, "hello")
-                state.edit {
-                    replace(0, 0, "hello")
-                }
+                state.edit { replace(0, 0, "hello") }
             }
         }
         assertThat(state.text.toString()).isEmpty()
@@ -134,9 +132,7 @@
         }
         assertThat(state.text.toString()).isEmpty()
 
-        state.edit {
-            replace(0, 0, "hello")
-        }
+        state.edit { replace(0, 0, "hello") }
         assertThat(state.text.toString()).isEqualTo("hello")
     }
 
@@ -160,9 +156,7 @@
             assertThat(invalidationCount).isEqualTo(0)
 
             // Act.
-            state.edit {
-                selection = TextRange(0, length)
-            }
+            state.edit { selection = TextRange(0, length) }
             advanceUntilIdle()
             runCurrent()
 
@@ -193,9 +187,7 @@
             assertThat(invalidationCount).isEqualTo(0)
 
             // Act.
-            state.edit {
-                append("1")
-            }
+            state.edit { append("1") }
             advanceUntilIdle()
             runCurrent()
 
@@ -308,12 +300,8 @@
     @Test
     fun edit_placeCursorBeforeChar_throws_whenInvalid() {
         state.edit {
-            assertFailsWith<IllegalArgumentException> {
-                placeCursorBeforeCharAt(500)
-            }
-            assertFailsWith<IllegalArgumentException> {
-                placeCursorBeforeCharAt(-1)
-            }
+            assertFailsWith<IllegalArgumentException> { placeCursorBeforeCharAt(500) }
+            assertFailsWith<IllegalArgumentException> { placeCursorBeforeCharAt(-1) }
             placeCursorAtEnd()
         }
     }
@@ -339,18 +327,10 @@
     @Test
     fun edit_selectChars_throws_whenInvalid() {
         state.edit {
-            assertFailsWith<IllegalArgumentException> {
-                selection = TextRange(500, 501)
-            }
-            assertFailsWith<IllegalArgumentException> {
-                selection = TextRange(-1, 500)
-            }
-            assertFailsWith<IllegalArgumentException> {
-                selection = TextRange(500, -1)
-            }
-            assertFailsWith<IllegalArgumentException> {
-                selection = TextRange(-500, -1)
-            }
+            assertFailsWith<IllegalArgumentException> { selection = TextRange(500, 501) }
+            assertFailsWith<IllegalArgumentException> { selection = TextRange(-1, 500) }
+            assertFailsWith<IllegalArgumentException> { selection = TextRange(500, -1) }
+            assertFailsWith<IllegalArgumentException> { selection = TextRange(-500, -1) }
             placeCursorAtEnd()
         }
     }
@@ -501,9 +481,7 @@
             snapshotFlow { state.value }.collectLatest { texts += it }
         }
 
-        state.edit {
-            placeCursorAtEnd()
-        }
+        state.edit { placeCursorAtEnd() }
 
         assertThat(texts).hasSize(2)
         assertThat(texts.last()).isSameInstanceAs(state.value)
@@ -613,18 +591,17 @@
             val texts = mutableListOf<TextFieldCharSequence>()
 
             launch(Dispatchers.Unconfined) {
-                snapshotFlow { state.value }.collectLatest {
-                    texts += it
-                    awaitCancellation()
-                }
+                snapshotFlow { state.value }
+                    .collectLatest {
+                        texts += it
+                        awaitCancellation()
+                    }
             }
 
             state.setTextAndPlaceCursorAtEnd("hello")
             state.setTextAndPlaceCursorAtEnd("world")
 
-            assertThat(texts.map { it.toString() })
-                .containsExactly("", "hello", "world")
-                .inOrder()
+            assertThat(texts.map { it.toString() }).containsExactly("", "hello", "world").inOrder()
         }
 
     @Test
@@ -633,13 +610,7 @@
             val state = TextFieldState()
             val texts = mutableListOf<CharSequence>()
 
-            launch(Dispatchers.Unconfined) {
-                snapshotFlow {
-                    state.text
-                }.collect {
-                    texts += it
-                }
-            }
+            launch(Dispatchers.Unconfined) { snapshotFlow { state.text }.collect { texts += it } }
 
             state.edit { append("a") }
             state.edit { append("b") }
@@ -647,9 +618,7 @@
             state.edit { placeCursorAtEnd() }
             state.edit { append("c") }
 
-            assertThat(texts.map { it.toString() })
-                .containsExactly("", "a", "ab", "abc")
-                .inOrder()
+            assertThat(texts.map { it.toString() }).containsExactly("", "a", "ab", "abc").inOrder()
         }
     }
 
@@ -657,13 +626,7 @@
     fun toString_doesNotReadSnapshotState() {
         val state = TextFieldState("hello")
         var isRead = false
-        Snapshot.observe(
-            readObserver = {
-                isRead = true
-            }
-        ) {
-            state.toString()
-        }
+        Snapshot.observe(readObserver = { isRead = true }) { state.toString() }
 
         assertThat(isRead).isFalse()
     }
@@ -688,9 +651,7 @@
     fun onlyHighlightChange_doesNotTriggerInputTransformation() {
         val state = TextFieldState("abc def ghi")
         var transformationCalled = 0
-        val inputTransformation = InputTransformation {
-            transformationCalled++
-        }
+        val inputTransformation = InputTransformation { transformationCalled++ }
         state.editAsUser(inputTransformation) {
             setHighlight(TextHighlightType.HandwritingSelectPreview, 0, 3)
         }
@@ -704,19 +665,18 @@
     fun inputTransformationRejectsChanges_removesComposition() {
         val state = TextFieldState()
         val inputTransformation = InputTransformation { revertAllChanges() }
-        state.editAsUser(inputTransformation) {
-            setComposingText("hello", 1)
-        }
+        state.editAsUser(inputTransformation) { setComposingText("hello", 1) }
         assertThat(state.text).isEqualTo("")
         assertThat(state.selection).isEqualTo(TextRange.Zero)
         assertThat(state.composition).isNull()
     }
 
     private fun runTestWithSnapshotsThenCancelChildren(testBody: suspend TestScope.() -> Unit) {
-        val globalWriteObserverHandle = Snapshot.registerGlobalWriteObserver {
-            // This is normally done by the compose runtime.
-            Snapshot.sendApplyNotifications()
-        }
+        val globalWriteObserverHandle =
+            Snapshot.registerGlobalWriteObserver {
+                // This is normally done by the compose runtime.
+                Snapshot.sendApplyNotifications()
+            }
         try {
             runTest {
                 testBody()
diff --git a/compose/foundation/foundation/src/androidUnitTest/kotlin/androidx/compose/foundation/text/input/internal/CodepointTransformationTest.kt b/compose/foundation/foundation/src/androidUnitTest/kotlin/androidx/compose/foundation/text/input/internal/CodepointTransformationTest.kt
index f479576..18d86bb 100644
--- a/compose/foundation/foundation/src/androidUnitTest/kotlin/androidx/compose/foundation/text/input/internal/CodepointTransformationTest.kt
+++ b/compose/foundation/foundation/src/androidUnitTest/kotlin/androidx/compose/foundation/text/input/internal/CodepointTransformationTest.kt
@@ -32,17 +32,17 @@
 
     @Test
     fun toVisualText_codepointIndices() {
-        val source =
-            TextFieldCharSequence("a${SurrogateCodepointString}c$SurrogateCodepointString")
+        val source = TextFieldCharSequence("a${SurrogateCodepointString}c$SurrogateCodepointString")
         val offsetMapping = OffsetMappingCalculator()
         val codepointTransformation = CodepointTransformation { i, codepoint ->
-            val expectedCodePoint = when (i) {
-                0 -> 'a'.code
-                1 -> SurrogateCodepoint
-                2 -> 'c'.code
-                3 -> SurrogateCodepoint
-                else -> fail("Invalid codepoint index: $i")
-            }
+            val expectedCodePoint =
+                when (i) {
+                    0 -> 'a'.code
+                    1 -> SurrogateCodepoint
+                    2 -> 'c'.code
+                    3 -> SurrogateCodepoint
+                    else -> fail("Invalid codepoint index: $i")
+                }
             assertThat(codepoint).isEqualTo(expectedCodePoint)
             codepoint
         }
@@ -56,13 +56,15 @@
         val offsetMapping = OffsetMappingCalculator()
         val codepointTransformation = CodepointTransformation { i, codepoint ->
             when (codepoint) {
-                'a'.code, 'c'.code -> SurrogateCodepoint
+                'a'.code,
+                'c'.code -> SurrogateCodepoint
                 SurrogateCodepoint -> 'b'.code
-                else -> fail(
-                    "codepointIndex=$i, codepoint=\"${
+                else ->
+                    fail(
+                        "codepointIndex=$i, codepoint=\"${
                         String(intArrayOf(codepoint), 0, 1)
                     }\""
-                )
+                    )
             }
         }
         val visual = source.toVisualText(codepointTransformation, offsetMapping)
@@ -71,15 +73,17 @@
             .isEqualTo("${SurrogateCodepointString}b$SurrogateCodepointString")
 
         listOf(
-            0 to TextRange(0),
-            1 to TextRange(2),
-            2 to TextRange(2, 3),
-            3 to TextRange(3),
-            4 to TextRange(5),
-        ).forEach { (source, dest) ->
-            assertWithMessage("Mapping from untransformed offset $source")
-                .that(offsetMapping.mapFromSource(source)).isEqualTo(dest)
-        }
+                0 to TextRange(0),
+                1 to TextRange(2),
+                2 to TextRange(2, 3),
+                3 to TextRange(3),
+                4 to TextRange(5),
+            )
+            .forEach { (source, dest) ->
+                assertWithMessage("Mapping from untransformed offset $source")
+                    .that(offsetMapping.mapFromSource(source))
+                    .isEqualTo(dest)
+            }
     }
 
     @Test
@@ -88,13 +92,15 @@
         val offsetMapping = OffsetMappingCalculator()
         val codepointTransformation = CodepointTransformation { i, codepoint ->
             when (codepoint) {
-                'a'.code, 'c'.code -> SurrogateCodepoint
+                'a'.code,
+                'c'.code -> SurrogateCodepoint
                 SurrogateCodepoint -> 'b'.code
-                else -> fail(
-                    "codepointIndex=$i, codepoint=\"${
+                else ->
+                    fail(
+                        "codepointIndex=$i, codepoint=\"${
                         String(intArrayOf(codepoint), 0, 1)
                     }\""
-                )
+                    )
             }
         }
         val visual = source.toVisualText(codepointTransformation, offsetMapping)
@@ -103,16 +109,18 @@
             .isEqualTo("${SurrogateCodepointString}b$SurrogateCodepointString")
 
         listOf(
-            0 to TextRange(0),
-            1 to TextRange(0, 1),
-            2 to TextRange(1),
-            3 to TextRange(3),
-            4 to TextRange(3, 4),
-            5 to TextRange(4),
-        ).forEach { (dest, source) ->
-            assertWithMessage("Mapping from transformed offset $dest")
-                .that(offsetMapping.mapFromDest(dest)).isEqualTo(source)
-        }
+                0 to TextRange(0),
+                1 to TextRange(0, 1),
+                2 to TextRange(1),
+                3 to TextRange(3),
+                4 to TextRange(3, 4),
+                5 to TextRange(4),
+            )
+            .forEach { (dest, source) ->
+                assertWithMessage("Mapping from transformed offset $dest")
+                    .that(offsetMapping.mapFromDest(dest))
+                    .isEqualTo(source)
+            }
     }
 
     private companion object {
diff --git a/compose/foundation/foundation/src/androidUnitTest/kotlin/androidx/compose/foundation/text/input/internal/CursorAnimationStateTest.kt b/compose/foundation/foundation/src/androidUnitTest/kotlin/androidx/compose/foundation/text/input/internal/CursorAnimationStateTest.kt
index 58920e6..9c0e34d 100644
--- a/compose/foundation/foundation/src/androidUnitTest/kotlin/androidx/compose/foundation/text/input/internal/CursorAnimationStateTest.kt
+++ b/compose/foundation/foundation/src/androidUnitTest/kotlin/androidx/compose/foundation/text/input/internal/CursorAnimationStateTest.kt
@@ -34,16 +34,11 @@
 
     private val animationState = CursorAnimationState()
 
-    @Test
-    fun alphaNotAnimatingInitially() = runTest {
-        assertNotAnimating()
-    }
+    @Test fun alphaNotAnimatingInitially() = runTest { assertNotAnimating() }
 
     @Test
     fun snapToVisibleAndAnimate_animatesAlpha() = runTest {
-        val job = launch {
-            animationState.snapToVisibleAndAnimate()
-        }
+        val job = launch { animationState.snapToVisibleAndAnimate() }
 
         // Should start immediately.
         assertThat(animationState.cursorAlpha).isEqualTo(0f)
@@ -63,9 +58,8 @@
 
     @Test
     fun snapToVisibleAndAnimate_suspendsWhileAnimating() = runTest {
-        val job = launch(start = CoroutineStart.UNDISPATCHED) {
-            animationState.snapToVisibleAndAnimate()
-        }
+        val job =
+            launch(start = CoroutineStart.UNDISPATCHED) { animationState.snapToVisibleAndAnimate() }
 
         // Advance a few blinks.
         repeat(10) {
@@ -78,9 +72,8 @@
 
     @Test
     fun snapToVisibleAndAnimate_stopsAnimating_whenCancelledImmediately() = runTest {
-        val job = launch(start = CoroutineStart.UNDISPATCHED) {
-            animationState.snapToVisibleAndAnimate()
-        }
+        val job =
+            launch(start = CoroutineStart.UNDISPATCHED) { animationState.snapToVisibleAndAnimate() }
         job.cancel()
 
         assertNotAnimating()
@@ -89,9 +82,7 @@
 
     @Test
     fun snapToVisibleAndAnimate_stopsAnimating_whenCancelledAsync() = runTest {
-        val job = launch {
-            animationState.snapToVisibleAndAnimate()
-        }
+        val job = launch { animationState.snapToVisibleAndAnimate() }
         job.cancel()
 
         assertNotAnimating()
@@ -100,14 +91,11 @@
 
     @Test
     fun snapToVisibleAndAnimate_stopsAnimating_whenCancelledAfterAWhile() = runTest {
-        val job = launch(start = CoroutineStart.UNDISPATCHED) {
-            animationState.snapToVisibleAndAnimate()
-        }
+        val job =
+            launch(start = CoroutineStart.UNDISPATCHED) { animationState.snapToVisibleAndAnimate() }
 
         // Advance a few blinks…
-        repeat(10) {
-            testScheduler.advanceTimeBy(500)
-        }
+        repeat(10) { testScheduler.advanceTimeBy(500) }
         job.cancel()
 
         assertNotAnimating()
@@ -115,9 +103,8 @@
 
     @Test
     fun cancelAndHide_stopsAnimating_immediately() = runTest {
-        val job = launch(start = CoroutineStart.UNDISPATCHED) {
-            animationState.snapToVisibleAndAnimate()
-        }
+        val job =
+            launch(start = CoroutineStart.UNDISPATCHED) { animationState.snapToVisibleAndAnimate() }
         animationState.cancelAndHide()
 
         assertNotAnimating()
@@ -127,9 +114,7 @@
     @Test
     fun cancelAndHide_beforeStart_doesntBlockAnimation() = runTest {
         animationState.cancelAndHide()
-        val job = launch {
-            animationState.snapToVisibleAndAnimate()
-        }
+        val job = launch { animationState.snapToVisibleAndAnimate() }
 
         runCurrent()
         assertThat(animationState.cursorAlpha).isEqualTo(1f)
@@ -139,14 +124,11 @@
 
     @Test
     fun cancelAndHide_stopsAnimating_afterAWhile() = runTest {
-        val job = launch(start = CoroutineStart.UNDISPATCHED) {
-            animationState.snapToVisibleAndAnimate()
-        }
+        val job =
+            launch(start = CoroutineStart.UNDISPATCHED) { animationState.snapToVisibleAndAnimate() }
 
         // Advance a few blinks…
-        repeat(10) {
-            testScheduler.advanceTimeBy(500)
-        }
+        repeat(10) { testScheduler.advanceTimeBy(500) }
         animationState.cancelAndHide()
 
         assertNotAnimating()
diff --git a/compose/foundation/foundation/src/androidUnitTest/kotlin/androidx/compose/foundation/text/input/internal/DeleteSurroundingTextCommandTest.kt b/compose/foundation/foundation/src/androidUnitTest/kotlin/androidx/compose/foundation/text/input/internal/DeleteSurroundingTextCommandTest.kt
index a521822..ef45222 100644
--- a/compose/foundation/foundation/src/androidUnitTest/kotlin/androidx/compose/foundation/text/input/internal/DeleteSurroundingTextCommandTest.kt
+++ b/compose/foundation/foundation/src/androidUnitTest/kotlin/androidx/compose/foundation/text/input/internal/DeleteSurroundingTextCommandTest.kt
@@ -223,18 +223,20 @@
     @Test
     fun throws_whenLengthBeforeInvalid() {
         val eb = EditingBuffer("", TextRange(0))
-        val error = assertFailsWith<IllegalArgumentException> {
-            eb.deleteSurroundingText(lengthBeforeCursor = -42, lengthAfterCursor = 0)
-        }
+        val error =
+            assertFailsWith<IllegalArgumentException> {
+                eb.deleteSurroundingText(lengthBeforeCursor = -42, lengthAfterCursor = 0)
+            }
         assertThat(error).hasMessageThat().contains("-42")
     }
 
     @Test
     fun throws_whenLengthAfterInvalid() {
         val eb = EditingBuffer("", TextRange(0))
-        val error = assertFailsWith<IllegalArgumentException> {
-            eb.deleteSurroundingText(lengthBeforeCursor = 0, lengthAfterCursor = -42)
-        }
+        val error =
+            assertFailsWith<IllegalArgumentException> {
+                eb.deleteSurroundingText(lengthBeforeCursor = 0, lengthAfterCursor = -42)
+            }
         assertThat(error).hasMessageThat().contains("-42")
     }
 
@@ -245,10 +247,7 @@
         val selection = TextRange(textAfterDelete.length)
         val eb = EditingBuffer(text, selection)
 
-        eb.deleteSurroundingText(
-            lengthBeforeCursor = 0,
-            lengthAfterCursor = Int.MAX_VALUE
-        )
+        eb.deleteSurroundingText(lengthBeforeCursor = 0, lengthAfterCursor = Int.MAX_VALUE)
 
         assertThat(eb.toString()).isEqualTo(textAfterDelete)
         assertThat(eb.cursor).isEqualTo(textAfterDelete.length)
@@ -260,10 +259,7 @@
         val selection = TextRange(1)
         val eb = EditingBuffer(text, selection)
 
-        eb.deleteSurroundingText(
-            lengthBeforeCursor = Int.MAX_VALUE,
-            lengthAfterCursor = 0
-        )
+        eb.deleteSurroundingText(lengthBeforeCursor = Int.MAX_VALUE, lengthAfterCursor = 0)
 
         assertThat(eb.toString()).isEqualTo("bcde")
         assertThat(eb.cursor).isEqualTo(0)
@@ -276,10 +272,7 @@
         val selection = TextRange(textAfterDelete.length)
         val eb = EditingBuffer(text, selection)
 
-        eb.deleteSurroundingText(
-            lengthBeforeCursor = 0,
-            lengthAfterCursor = Int.MAX_VALUE - 1
-        )
+        eb.deleteSurroundingText(lengthBeforeCursor = 0, lengthAfterCursor = Int.MAX_VALUE - 1)
 
         assertThat(eb.toString()).isEqualTo(textAfterDelete)
         assertThat(eb.cursor).isEqualTo(textAfterDelete.length)
@@ -291,10 +284,7 @@
         val selection = TextRange(1)
         val eb = EditingBuffer(text, selection)
 
-        eb.deleteSurroundingText(
-            lengthBeforeCursor = Int.MAX_VALUE - 1,
-            lengthAfterCursor = 0
-        )
+        eb.deleteSurroundingText(lengthBeforeCursor = Int.MAX_VALUE - 1, lengthAfterCursor = 0)
 
         assertThat(eb.toString()).isEqualTo("bcde")
         assertThat(eb.cursor).isEqualTo(0)
diff --git a/compose/foundation/foundation/src/androidUnitTest/kotlin/androidx/compose/foundation/text/input/internal/DeleteSurroundingTextInCodePointsCommandTest.kt b/compose/foundation/foundation/src/androidUnitTest/kotlin/androidx/compose/foundation/text/input/internal/DeleteSurroundingTextInCodePointsCommandTest.kt
index 20addd6..3f4e8f8 100644
--- a/compose/foundation/foundation/src/androidUnitTest/kotlin/androidx/compose/foundation/text/input/internal/DeleteSurroundingTextInCodePointsCommandTest.kt
+++ b/compose/foundation/foundation/src/androidUnitTest/kotlin/androidx/compose/foundation/text/input/internal/DeleteSurroundingTextInCodePointsCommandTest.kt
@@ -228,18 +228,26 @@
     @Test
     fun throws_whenLengthBeforeInvalid() {
         val eb = EditingBuffer("", TextRange(0))
-        val error = assertFailsWith<IllegalArgumentException> {
-            eb.deleteSurroundingTextInCodePoints(lengthBeforeCursor = 0, lengthAfterCursor = -42)
-        }
+        val error =
+            assertFailsWith<IllegalArgumentException> {
+                eb.deleteSurroundingTextInCodePoints(
+                    lengthBeforeCursor = 0,
+                    lengthAfterCursor = -42
+                )
+            }
         assertThat(error).hasMessageThat().contains("-42")
     }
 
     @Test
     fun throws_whenLengthAfterInvalid() {
         val eb = EditingBuffer("", TextRange(0))
-        val error = assertFailsWith<IllegalArgumentException> {
-            eb.deleteSurroundingTextInCodePoints(lengthBeforeCursor = -42, lengthAfterCursor = 0)
-        }
+        val error =
+            assertFailsWith<IllegalArgumentException> {
+                eb.deleteSurroundingTextInCodePoints(
+                    lengthBeforeCursor = -42,
+                    lengthAfterCursor = 0
+                )
+            }
         assertThat(error).hasMessageThat().contains("-42")
     }
 
diff --git a/compose/foundation/foundation/src/androidUnitTest/kotlin/androidx/compose/foundation/text/input/internal/EditingBufferTest.kt b/compose/foundation/foundation/src/androidUnitTest/kotlin/androidx/compose/foundation/text/input/internal/EditingBufferTest.kt
index 8c0e4fd..0689506 100644
--- a/compose/foundation/foundation/src/androidUnitTest/kotlin/androidx/compose/foundation/text/input/internal/EditingBufferTest.kt
+++ b/compose/foundation/foundation/src/androidUnitTest/kotlin/androidx/compose/foundation/text/input/internal/EditingBufferTest.kt
@@ -137,7 +137,8 @@
         assertThat(eb.compositionEnd).isEqualTo(-1)
     }
 
-    @Test fun setSelection_coerces_whenNegativeStart() {
+    @Test
+    fun setSelection_coerces_whenNegativeStart() {
         val eb = EditingBuffer("ABCDE", TextRange.Zero)
 
         eb.setSelection(-1, 1)
@@ -146,7 +147,8 @@
         assertThat(eb.selectionEnd).isEqualTo(1)
     }
 
-    @Test fun setSelection_coerces_whenNegativeEnd() {
+    @Test
+    fun setSelection_coerces_whenNegativeEnd() {
         val eb = EditingBuffer("ABCDE", TextRange.Zero)
 
         eb.setSelection(1, -1)
diff --git a/compose/foundation/foundation/src/androidUnitTest/kotlin/androidx/compose/foundation/text/input/internal/GapBufferTest.kt b/compose/foundation/foundation/src/androidUnitTest/kotlin/androidx/compose/foundation/text/input/internal/GapBufferTest.kt
index a0a73a8..31a3214 100644
--- a/compose/foundation/foundation/src/androidUnitTest/kotlin/androidx/compose/foundation/text/input/internal/GapBufferTest.kt
+++ b/compose/foundation/foundation/src/androidUnitTest/kotlin/androidx/compose/foundation/text/input/internal/GapBufferTest.kt
@@ -29,108 +29,99 @@
 
     @Test
     fun insertTest_insert_to_empty_string() {
-        assertThat(
-            PartialGapBuffer("").apply {
-                replace(0, 0, "A")
-            }
-        ).hasChars("A")
+        assertThat(PartialGapBuffer("").apply { replace(0, 0, "A") }).hasChars("A")
     }
 
     @Test
     fun insertTest_insert_and_append() {
         assertThat(
-            PartialGapBuffer("").apply {
-                replace(0, 0, "A")
-                replace(0, 0, "B")
-            }
-        ).hasChars("BA")
+                PartialGapBuffer("").apply {
+                    replace(0, 0, "A")
+                    replace(0, 0, "B")
+                }
+            )
+            .hasChars("BA")
     }
 
     @Test
     fun insertTest_insert_and_prepend() {
         assertThat(
-            PartialGapBuffer("").apply {
-                replace(0, 0, "A")
-                replace(1, 1, "B")
-            }
-        ).hasChars("AB")
+                PartialGapBuffer("").apply {
+                    replace(0, 0, "A")
+                    replace(1, 1, "B")
+                }
+            )
+            .hasChars("AB")
     }
 
     @Test
     fun insertTest_insert_and_insert_into_middle() {
         assertThat(
-            PartialGapBuffer("").apply {
-                replace(0, 0, "AA")
-                replace(1, 1, "B")
-            }
-        ).hasChars("ABA")
+                PartialGapBuffer("").apply {
+                    replace(0, 0, "AA")
+                    replace(1, 1, "B")
+                }
+            )
+            .hasChars("ABA")
     }
 
     @Test
     fun insertTest_intoExistingText_prepend() {
-        assertThat(
-            PartialGapBuffer("XX").apply {
-                replace(0, 0, "A")
-            }
-        ).hasChars("AXX")
+        assertThat(PartialGapBuffer("XX").apply { replace(0, 0, "A") }).hasChars("AXX")
     }
 
     @Test
     fun insertTest_intoExistingText_insert_into_middle() {
-        assertThat(
-            PartialGapBuffer("XX").apply {
-                replace(1, 1, "A")
-            }
-        ).hasChars("XAX")
+        assertThat(PartialGapBuffer("XX").apply { replace(1, 1, "A") }).hasChars("XAX")
     }
 
     @Test
     fun insertTest_intoExistingText_append() {
-        assertThat(
-            PartialGapBuffer("XX").apply {
-                replace(2, 2, "A")
-            }
-        ).hasChars("XXA")
+        assertThat(PartialGapBuffer("XX").apply { replace(2, 2, "A") }).hasChars("XXA")
     }
 
     @Test
     fun insertTest_intoExistingText_prepend_and_prepend() {
         assertThat(
-            PartialGapBuffer("XX").apply {
-                replace(0, 0, "A")
-                replace(0, 0, "B")
-            }
-        ).hasChars("BAXX")
+                PartialGapBuffer("XX").apply {
+                    replace(0, 0, "A")
+                    replace(0, 0, "B")
+                }
+            )
+            .hasChars("BAXX")
     }
 
     @Test
     fun insertTest_intoExistingText_prepend_and_append() {
         assertThat(
-            PartialGapBuffer("XX").apply {
-                replace(0, 0, "A")
-                replace(1, 1, "B")
-            }
-        ).hasChars("ABXX")
+                PartialGapBuffer("XX").apply {
+                    replace(0, 0, "A")
+                    replace(1, 1, "B")
+                }
+            )
+            .hasChars("ABXX")
     }
 
     @Test
     fun insertTest_intoExistingText_prepend_and_insert_middle() {
         assertThat(
-            PartialGapBuffer("XX").apply {
-                replace(0, 0, "A")
-                replace(2, 2, "B")
-            }
-        ).hasChars("AXBX")
+                PartialGapBuffer("XX").apply {
+                    replace(0, 0, "A")
+                    replace(2, 2, "B")
+                }
+            )
+            .hasChars("AXBX")
     }
 
     @Test
     fun insertTest_intoExistingText_insert_two_chars_and_append() {
         assertThat(
-            PartialGapBuffer("XX").apply {
-                replace(0, 0, "AA")
-                replace(1, 1, "B")
-            }
-        ).hasChars("ABAXX")
+                PartialGapBuffer("XX").apply {
+                    replace(0, 0, "AA")
+                    replace(1, 1, "B")
+                }
+            )
+            .hasChars("ABAXX")
     }
 
     @Test
@@ -307,438 +298,390 @@
     @Test
     fun deleteTest_insert_and_delete_from_head() {
         assertThat(
-            PartialGapBuffer("").apply {
-                replace(0, 0, "ABC")
-                replace(0, 1, "")
-            }
-        ).hasChars("BC")
+                PartialGapBuffer("").apply {
+                    replace(0, 0, "ABC")
+                    replace(0, 1, "")
+                }
+            )
+            .hasChars("BC")
     }
 
     @Test
     fun deleteTest_insert_and_delete_middle() {
         assertThat(
-            PartialGapBuffer("").apply {
-                replace(0, 0, "ABC")
-                replace(1, 2, "")
-            }
-        ).hasChars("AC")
+                PartialGapBuffer("").apply {
+                    replace(0, 0, "ABC")
+                    replace(1, 2, "")
+                }
+            )
+            .hasChars("AC")
     }
 
     @Test
     fun deleteTest_insert_and_delete_tail() {
         assertThat(
-            PartialGapBuffer("").apply {
-                replace(0, 0, "ABC")
-                replace(2, 3, "")
-            }
-        ).hasChars("AB")
+                PartialGapBuffer("").apply {
+                    replace(0, 0, "ABC")
+                    replace(2, 3, "")
+                }
+            )
+            .hasChars("AB")
     }
 
     @Test
     fun deleteTest_insert_and_delete_two_head() {
         assertThat(
-            PartialGapBuffer("").apply {
-                replace(0, 0, "ABC")
-                replace(0, 2, "")
-            }
-        ).hasChars("C")
+                PartialGapBuffer("").apply {
+                    replace(0, 0, "ABC")
+                    replace(0, 2, "")
+                }
+            )
+            .hasChars("C")
     }
 
     @Test
     fun deleteTest_insert_and_delete_two_tail() {
         assertThat(
-            PartialGapBuffer("").apply {
-                replace(0, 0, "ABC")
-                replace(1, 3, "")
-            }
-        ).hasChars("A")
+                PartialGapBuffer("").apply {
+                    replace(0, 0, "ABC")
+                    replace(1, 3, "")
+                }
+            )
+            .hasChars("A")
     }
 
     @Test
     fun deleteTest_insert_and_delete_with_two_instruction_from_head() {
         assertThat(
-            PartialGapBuffer("").apply {
-                replace(0, 0, "ABC")
-                replace(0, 1, "")
-                replace(0, 1, "")
-            }
-        ).hasChars("C")
+                PartialGapBuffer("").apply {
+                    replace(0, 0, "ABC")
+                    replace(0, 1, "")
+                    replace(0, 1, "")
+                }
+            )
+            .hasChars("C")
     }
 
     @Test
     fun deleteTest_insert_and_delete_with_two_instruction_from_head_and_tail() {
         assertThat(
-            PartialGapBuffer("").apply {
-                replace(0, 0, "ABC")
-                replace(0, 1, "")
-                replace(1, 2, "")
-            }
-        ).hasChars("B")
+                PartialGapBuffer("").apply {
+                    replace(0, 0, "ABC")
+                    replace(0, 1, "")
+                    replace(1, 2, "")
+                }
+            )
+            .hasChars("B")
     }
 
     @Test
     fun deleteTest_insert_and_delete_with_two_instruction_from_tail() {
         assertThat(
-            PartialGapBuffer("").apply {
-                replace(0, 0, "ABC")
-                replace(1, 2, "")
-                replace(1, 2, "")
-            }
-        ).hasChars("A")
+                PartialGapBuffer("").apply {
+                    replace(0, 0, "ABC")
+                    replace(1, 2, "")
+                    replace(1, 2, "")
+                }
+            )
+            .hasChars("A")
     }
 
     @Test
     fun deleteTest_insert_and_delete_three_chars() {
         assertThat(
-            PartialGapBuffer("").apply {
-                replace(0, 0, "ABC")
-                replace(0, 3, "")
-            }
-        ).hasChars("")
+                PartialGapBuffer("").apply {
+                    replace(0, 0, "ABC")
+                    replace(0, 3, "")
+                }
+            )
+            .hasChars("")
     }
 
     @Test
     fun deleteTest_insert_and_delete_three_chars_with_three_instructions() {
         assertThat(
-            PartialGapBuffer("").apply {
-                replace(0, 0, "ABC")
-                replace(0, 1, "")
-                replace(0, 1, "")
-                replace(0, 1, "")
-            }
-        ).hasChars("")
+                PartialGapBuffer("").apply {
+                    replace(0, 0, "ABC")
+                    replace(0, 1, "")
+                    replace(0, 1, "")
+                    replace(0, 1, "")
+                }
+            )
+            .hasChars("")
     }
 
     @Test
     fun deleteTest_fromExistingText_from_head() {
-        assertThat(
-            PartialGapBuffer("ABC").apply {
-                replace(0, 1, "")
-            }
-        ).hasChars("BC")
+        assertThat(PartialGapBuffer("ABC").apply { replace(0, 1, "") }).hasChars("BC")
     }
 
     @Test
     fun deleteTest_fromExistingText_from_middle() {
-        assertThat(
-            PartialGapBuffer("ABC").apply {
-                replace(1, 2, "")
-            }
-        ).hasChars("AC")
+        assertThat(PartialGapBuffer("ABC").apply { replace(1, 2, "") }).hasChars("AC")
     }
 
     @Test
     fun deleteTest_fromExistingText_from_tail() {
-        assertThat(
-            PartialGapBuffer("ABC").apply {
-                replace(2, 3, "")
-            }
-        ).hasChars("AB")
+        assertThat(PartialGapBuffer("ABC").apply { replace(2, 3, "") }).hasChars("AB")
     }
 
     @Test
     fun deleteTest_fromExistingText_delete_two_chars_from_head() {
-        assertThat(
-            PartialGapBuffer("ABC").apply {
-                replace(0, 2, "")
-            }
-        ).hasChars("C")
+        assertThat(PartialGapBuffer("ABC").apply { replace(0, 2, "") }).hasChars("C")
     }
 
     @Test
     fun deleteTest_fromExistingText_delete_two_chars_from_tail() {
-        assertThat(
-            PartialGapBuffer("ABC").apply {
-                replace(1, 3, "")
-            }
-        ).hasChars("A")
+        assertThat(PartialGapBuffer("ABC").apply { replace(1, 3, "") }).hasChars("A")
     }
 
     @Test
     fun deleteTest_fromExistingText_delete_two_chars_with_two_instruction_from_head() {
         assertThat(
-            PartialGapBuffer("ABC").apply {
-                replace(0, 1, "")
-                replace(0, 1, "")
-            }
-        ).hasChars("C")
+                PartialGapBuffer("ABC").apply {
+                    replace(0, 1, "")
+                    replace(0, 1, "")
+                }
+            )
+            .hasChars("C")
     }
 
     @Test
     fun deleteTest_fromExistingText_delete_two_chars_with_two_instruction_from_head_and_tail() {
         assertThat(
-            PartialGapBuffer("ABC").apply {
-                replace(0, 1, "")
-                replace(1, 2, "")
-            }
-        ).hasChars("B")
+                PartialGapBuffer("ABC").apply {
+                    replace(0, 1, "")
+                    replace(1, 2, "")
+                }
+            )
+            .hasChars("B")
     }
 
     @Test
     fun deleteTest_fromExistingText_delete_two_chars_with_two_instruction_from_tail() {
         assertThat(
-            PartialGapBuffer("ABC").apply {
-                replace(1, 2, "")
-                replace(1, 2, "")
-            }
-        ).hasChars("A")
+                PartialGapBuffer("ABC").apply {
+                    replace(1, 2, "")
+                    replace(1, 2, "")
+                }
+            )
+            .hasChars("A")
     }
 
     @Test
     fun deleteTest_fromExistingText_delete_three_chars() {
-        assertThat(
-            PartialGapBuffer("ABC").apply {
-                replace(0, 3, "")
-            }
-        ).hasChars("")
+        assertThat(PartialGapBuffer("ABC").apply { replace(0, 3, "") }).hasChars("")
     }
 
     @Test
     fun deleteTest_fromExistingText_delete_three_chars_with_three_instructions() {
         assertThat(
-            PartialGapBuffer("ABC").apply {
-                replace(0, 1, "")
-                replace(0, 1, "")
-                replace(0, 1, "")
-            }
-        ).hasChars("")
+                PartialGapBuffer("ABC").apply {
+                    replace(0, 1, "")
+                    replace(0, 1, "")
+                    replace(0, 1, "")
+                }
+            )
+            .hasChars("")
     }
 
     @Test
     fun replaceTest_head() {
         assertThat(
-            PartialGapBuffer("").apply {
-                replace(0, 0, "ABC")
-                replace(0, 1, "X")
-            }
-        ).hasChars("XBC")
+                PartialGapBuffer("").apply {
+                    replace(0, 0, "ABC")
+                    replace(0, 1, "X")
+                }
+            )
+            .hasChars("XBC")
     }
 
     @Test
     fun replaceTest_middle() {
         assertThat(
-            PartialGapBuffer("").apply {
-                replace(0, 0, "ABC")
-                replace(1, 2, "X")
-            }
-        ).hasChars("AXC")
+                PartialGapBuffer("").apply {
+                    replace(0, 0, "ABC")
+                    replace(1, 2, "X")
+                }
+            )
+            .hasChars("AXC")
     }
 
     @Test
     fun replaceTest_tail() {
         assertThat(
-            PartialGapBuffer("").apply {
-                replace(0, 0, "ABC")
-                replace(2, 3, "X")
-            }
-        ).hasChars("ABX")
+                PartialGapBuffer("").apply {
+                    replace(0, 0, "ABC")
+                    replace(2, 3, "X")
+                }
+            )
+            .hasChars("ABX")
     }
 
     @Test
     fun replaceTest_head_two_chars() {
         assertThat(
-            PartialGapBuffer("").apply {
-                replace(0, 0, "ABC")
-                replace(0, 2, "X")
-            }
-        ).hasChars("XC")
+                PartialGapBuffer("").apply {
+                    replace(0, 0, "ABC")
+                    replace(0, 2, "X")
+                }
+            )
+            .hasChars("XC")
     }
 
     @Test
     fun replaceTest_middle_two_chars() {
         assertThat(
-            PartialGapBuffer("").apply {
-                replace(0, 0, "ABC")
-                replace(1, 3, "X")
-            }
-        ).hasChars("AX")
+                PartialGapBuffer("").apply {
+                    replace(0, 0, "ABC")
+                    replace(1, 3, "X")
+                }
+            )
+            .hasChars("AX")
     }
 
     @Test
     fun replaceTest_three_chars() {
         assertThat(
-            PartialGapBuffer("").apply {
-                replace(0, 0, "ABC")
-                replace(0, 3, "X")
-            }
-        ).hasChars("X")
+                PartialGapBuffer("").apply {
+                    replace(0, 0, "ABC")
+                    replace(0, 3, "X")
+                }
+            )
+            .hasChars("X")
     }
 
     @Test
     fun replaceTest_one_char_with_two_chars_from_head() {
         assertThat(
-            PartialGapBuffer("").apply {
-                replace(0, 0, "ABC")
-                replace(0, 1, "XY")
-            }
-        ).hasChars("XYBC")
+                PartialGapBuffer("").apply {
+                    replace(0, 0, "ABC")
+                    replace(0, 1, "XY")
+                }
+            )
+            .hasChars("XYBC")
     }
 
     @Test
     fun replaceTest_one_char_with_two_chars_from_middle() {
         assertThat(
-            PartialGapBuffer("").apply {
-                replace(0, 0, "ABC")
-                replace(1, 2, "XY")
-            }
-        ).hasChars("AXYC")
+                PartialGapBuffer("").apply {
+                    replace(0, 0, "ABC")
+                    replace(1, 2, "XY")
+                }
+            )
+            .hasChars("AXYC")
     }
 
     @Test
     fun replaceTest_one_char_with_two_chars_from_tail() {
         assertThat(
-            PartialGapBuffer("").apply {
-                replace(0, 0, "ABC")
-                replace(2, 3, "XY")
-            }
-        ).hasChars("ABXY")
+                PartialGapBuffer("").apply {
+                    replace(0, 0, "ABC")
+                    replace(2, 3, "XY")
+                }
+            )
+            .hasChars("ABXY")
     }
 
     @Test
     fun replaceTest_two_chars_with_two_chars_from_head() {
         assertThat(
-            PartialGapBuffer("").apply {
-                replace(0, 0, "ABC")
-                replace(0, 2, "XY")
-            }
-        ).hasChars("XYC")
+                PartialGapBuffer("").apply {
+                    replace(0, 0, "ABC")
+                    replace(0, 2, "XY")
+                }
+            )
+            .hasChars("XYC")
     }
 
     @Test
     fun replaceTest_two_chars_with_two_chars_from_tail() {
         assertThat(
-            PartialGapBuffer("").apply {
-                replace(0, 0, "ABC")
-                replace(1, 3, "XY")
-            }
-        ).hasChars("AXY")
+                PartialGapBuffer("").apply {
+                    replace(0, 0, "ABC")
+                    replace(1, 3, "XY")
+                }
+            )
+            .hasChars("AXY")
     }
 
     @Test
     fun replaceTest_three_chars_with_two_char() {
         assertThat(
-            PartialGapBuffer("").apply {
-                replace(0, 0, "ABC")
-                replace(0, 3, "XY")
-            }
-        ).hasChars("XY")
+                PartialGapBuffer("").apply {
+                    replace(0, 0, "ABC")
+                    replace(0, 3, "XY")
+                }
+            )
+            .hasChars("XY")
     }
 
     @Test
     fun replaceTest_fromExistingText_head() {
-        assertThat(
-            PartialGapBuffer("ABC").apply {
-                replace(0, 1, "X")
-            }
-        ).hasChars("XBC")
+        assertThat(PartialGapBuffer("ABC").apply { replace(0, 1, "X") }).hasChars("XBC")
     }
 
     @Test
     fun replaceTest_fromExistingText_middle() {
-        assertThat(
-            PartialGapBuffer("ABC").apply {
-                replace(1, 2, "X")
-            }
-        ).hasChars("AXC")
+        assertThat(PartialGapBuffer("ABC").apply { replace(1, 2, "X") }).hasChars("AXC")
     }
 
     @Test
     fun replaceTest_fromExistingText_tail() {
-        assertThat(
-            PartialGapBuffer("ABC").apply {
-                replace(2, 3, "X")
-            }
-        ).hasChars("ABX")
+        assertThat(PartialGapBuffer("ABC").apply { replace(2, 3, "X") }).hasChars("ABX")
     }
 
     @Test
     fun replaceTest_fromExistingText_two_chars_with_one_char_from_head() {
-        assertThat(
-            PartialGapBuffer("ABC").apply {
-                replace(0, 2, "X")
-            }
-        ).hasChars("XC")
+        assertThat(PartialGapBuffer("ABC").apply { replace(0, 2, "X") }).hasChars("XC")
     }
 
     @Test
     fun replaceTest_fromExistingText_two_chars_with_one_char_from_tail() {
-        assertThat(
-            PartialGapBuffer("ABC").apply {
-                replace(1, 3, "X")
-            }
-        ).hasChars("AX")
+        assertThat(PartialGapBuffer("ABC").apply { replace(1, 3, "X") }).hasChars("AX")
     }
 
     @Test
     fun replaceTest_fromExistingText_three_chars() {
-        assertThat(
-            PartialGapBuffer("ABC").apply {
-                replace(0, 3, "X")
-            }
-        ).hasChars("X")
+        assertThat(PartialGapBuffer("ABC").apply { replace(0, 3, "X") }).hasChars("X")
     }
 
     @Test
     fun replaceTest_fromExistingText_one_char_with_two_chars_from_head() {
-        assertThat(
-            PartialGapBuffer("ABC").apply {
-                replace(0, 1, "XY")
-            }
-        ).hasChars("XYBC")
+        assertThat(PartialGapBuffer("ABC").apply { replace(0, 1, "XY") }).hasChars("XYBC")
     }
 
     @Test
     fun replaceTest_fromExistingText_one_char_with_two_chars_from_middle() {
-        assertThat(
-            PartialGapBuffer("ABC").apply {
-                replace(1, 2, "XY")
-            }
-        ).hasChars("AXYC")
+        assertThat(PartialGapBuffer("ABC").apply { replace(1, 2, "XY") }).hasChars("AXYC")
     }
 
     @Test
     fun replaceTest_fromExistingText_one_char_with_two_chars_from_tail() {
-        assertThat(
-            PartialGapBuffer("ABC").apply {
-                replace(2, 3, "XY")
-            }
-        ).hasChars("ABXY")
+        assertThat(PartialGapBuffer("ABC").apply { replace(2, 3, "XY") }).hasChars("ABXY")
     }
 
     @Test
     fun replaceTest_fromExistingText_two_chars_with_two_chars_from_head() {
-        assertThat(
-            PartialGapBuffer("ABC").apply {
-                replace(0, 2, "XY")
-            }
-        ).hasChars("XYC")
+        assertThat(PartialGapBuffer("ABC").apply { replace(0, 2, "XY") }).hasChars("XYC")
     }
 
     @Test
     fun replaceTest_fromExistingText_two_chars_with_two_chars_from_tail() {
-        assertThat(
-            PartialGapBuffer("ABC").apply {
-                replace(1, 3, "XY")
-            }
-        ).hasChars("AXY")
+        assertThat(PartialGapBuffer("ABC").apply { replace(1, 3, "XY") }).hasChars("AXY")
     }
 
     @Test
     fun replaceTest_fromExistingText_three_chars_with_three_chars() {
-        assertThat(
-            PartialGapBuffer("ABC").apply {
-                replace(0, 3, "XY")
-            }
-        ).hasChars("XY")
+        assertThat(PartialGapBuffer("ABC").apply { replace(0, 3, "XY") }).hasChars("XY")
     }
 
     @Test
     fun replace_throws_whenStartGreaterThanEnd() {
         val buffer = PartialGapBuffer("ABCD")
 
-        val error = assertFailsWith<IllegalArgumentException> {
-            buffer.replace(3, 2, "")
-        }
+        val error = assertFailsWith<IllegalArgumentException> { buffer.replace(3, 2, "") }
         assertThat(error).hasMessageThat().contains("start=3 > end=2")
     }
 
@@ -746,9 +689,7 @@
     fun replace_throws_whenTextStartGreaterThanTextEnd() {
         val buffer = PartialGapBuffer("ABCD")
 
-        val error = assertFailsWith<IllegalArgumentException> {
-            buffer.replace(2, 3, "", 1, 0)
-        }
+        val error = assertFailsWith<IllegalArgumentException> { buffer.replace(2, 3, "", 1, 0) }
         assertThat(error).hasMessageThat().contains("textStart=1 > textEnd=0")
     }
 
@@ -756,9 +697,7 @@
     fun replace_throws_whenStartNegative() {
         val buffer = PartialGapBuffer("ABCD")
 
-        val error = assertFailsWith<IllegalArgumentException> {
-            buffer.replace(-1, 2, "XY")
-        }
+        val error = assertFailsWith<IllegalArgumentException> { buffer.replace(-1, 2, "XY") }
         assertThat(error).hasMessageThat().contains("-1")
     }
 
@@ -766,9 +705,7 @@
     fun replace_throws_whenTextStartNegative() {
         val buffer = PartialGapBuffer("ABCD")
 
-        val error = assertFailsWith<IllegalArgumentException> {
-            buffer.replace(1, 2, "XY", -1, 2)
-        }
+        val error = assertFailsWith<IllegalArgumentException> { buffer.replace(1, 2, "XY", -1, 2) }
         assertThat(error).hasMessageThat().contains("-1")
     }
 
diff --git a/compose/foundation/foundation/src/androidUnitTest/kotlin/androidx/compose/foundation/text/input/internal/OffsetMappingCalculatorTest.kt b/compose/foundation/foundation/src/androidUnitTest/kotlin/androidx/compose/foundation/text/input/internal/OffsetMappingCalculatorTest.kt
index e7e70e6..23eaae2 100644
--- a/compose/foundation/foundation/src/androidUnitTest/kotlin/androidx/compose/foundation/text/input/internal/OffsetMappingCalculatorTest.kt
+++ b/compose/foundation/foundation/src/androidUnitTest/kotlin/androidx/compose/foundation/text/input/internal/OffsetMappingCalculatorTest.kt
@@ -831,9 +831,11 @@
         // Check well off the end of the valid index range just to be sure.
         repeat(length + 2) {
             assertWithMessage("Mapping from source offset $it")
-                .that(mapFromSource(it)).isEqualTo(TextRange(it))
+                .that(mapFromSource(it))
+                .isEqualTo(TextRange(it))
             assertWithMessage("Mapping from dest offset $it")
-                .that(mapFromDest(it)).isEqualTo(TextRange(it))
+                .that(mapFromDest(it))
+                .isEqualTo(TextRange(it))
         }
     }
 
@@ -842,7 +844,8 @@
     ) {
         expectedMappings.forEach { (srcOffset, dstRange) ->
             assertWithMessage("Mapping from source offset $srcOffset")
-                .that(mapFromSource(srcOffset)).isEqualTo(dstRange)
+                .that(mapFromSource(srcOffset))
+                .isEqualTo(dstRange)
         }
     }
 
@@ -851,7 +854,8 @@
     ) {
         expectedMappings.forEach { (dstOffset, srcRange) ->
             assertWithMessage("Mapping from dest offset $dstOffset")
-                .that(mapFromDest(dstOffset)).isEqualTo(srcRange)
+                .that(mapFromDest(dstOffset))
+                .isEqualTo(srcRange)
         }
     }
 
@@ -859,9 +863,8 @@
      * Basic implementation of a text editing buffer that uses [OffsetMappingCalculator] to make
      * testing easier.
      */
-    private class TestEditBuffer private constructor(
-        private val builder: StringBuilder
-    ) : CharSequence by builder {
+    private class TestEditBuffer private constructor(private val builder: StringBuilder) :
+        CharSequence by builder {
         constructor(text: CharSequence = "") : this(StringBuilder(text))
 
         private val tracker = OffsetMappingCalculator()
@@ -895,6 +898,7 @@
         }
 
         fun mapFromSource(offset: Int): TextRange = tracker.mapFromSource(offset)
+
         fun mapFromDest(offset: Int): TextRange = tracker.mapFromDest(offset)
 
         override fun toString(): String = builder.toString()
diff --git a/compose/foundation/foundation/src/androidUnitTest/kotlin/androidx/compose/foundation/text/input/internal/TextFieldStateInternalBufferTest.kt b/compose/foundation/foundation/src/androidUnitTest/kotlin/androidx/compose/foundation/text/input/internal/TextFieldStateInternalBufferTest.kt
index 85c4c8c..0e3b8e4 100644
--- a/compose/foundation/foundation/src/androidUnitTest/kotlin/androidx/compose/foundation/text/input/internal/TextFieldStateInternalBufferTest.kt
+++ b/compose/foundation/foundation/src/androidUnitTest/kotlin/androidx/compose/foundation/text/input/internal/TextFieldStateInternalBufferTest.kt
@@ -150,11 +150,8 @@
         state.syncMainBufferToTemporaryBuffer(newTextFieldValue)
 
         assertThat(state.mainBuffer).isSameInstanceAs(initialBuffer)
-        assertThat(newTextFieldValue.selection.start)
-            .isEqualTo(state.mainBuffer.selectionStart)
-        assertThat(newTextFieldValue.selection.end).isEqualTo(
-            state.mainBuffer.selectionEnd
-        )
+        assertThat(newTextFieldValue.selection.start).isEqualTo(state.mainBuffer.selectionStart)
+        assertThat(newTextFieldValue.selection.end).isEqualTo(state.mainBuffer.selectionEnd)
         assertThat(resetCalled).isEqualTo(2)
         assertThat(selectionCalled).isEqualTo(0)
     }
@@ -177,11 +174,8 @@
         assertThat(EditingBuffer.NOWHERE).isEqualTo(initialBuffer.compositionStart)
         assertThat(EditingBuffer.NOWHERE).isEqualTo(initialBuffer.compositionEnd)
 
-        val newTextFieldValue = TextFieldCharSequence(
-            textFieldValue,
-            textFieldValue.selection,
-            composition = null
-        )
+        val newTextFieldValue =
+            TextFieldCharSequence(textFieldValue, textFieldValue.selection, composition = null)
         state.syncMainBufferToTemporaryBuffer(newTextFieldValue)
 
         assertThat(state.mainBuffer).isSameInstanceAs(initialBuffer)
@@ -239,12 +233,7 @@
         assertThat(selectionCalled).isEqualTo(1)
 
         // change the text
-        val newValue =
-            TextFieldCharSequence(
-                "cd",
-                state.selection,
-                state.composition
-            )
+        val newValue = TextFieldCharSequence("cd", state.selection, state.composition)
         state.syncMainBufferToTemporaryBuffer(newValue)
 
         assertThat(state.text.toString()).isEqualTo(newValue.toString())
@@ -265,12 +254,7 @@
         }
 
         // use the same TextFieldValue
-        val newValue =
-            TextFieldCharSequence(
-                state.text,
-                state.selection,
-                state.composition
-            )
+        val newValue = TextFieldCharSequence(state.text, state.selection, state.composition)
         state.syncMainBufferToTemporaryBuffer(newValue)
 
         assertThat(state.text.toString()).isEqualTo(newValue.toString())
@@ -289,11 +273,7 @@
 
         // change the composition
         val newValue =
-            TextFieldCharSequence(
-                state.text,
-                state.selection,
-                composition = TextRange(0, 2)
-            )
+            TextFieldCharSequence(state.text, state.selection, composition = TextRange(0, 2))
         state.syncMainBufferToTemporaryBuffer(newValue)
 
         assertThat(state.text.toString()).isEqualTo(newValue.toString())
@@ -311,11 +291,8 @@
         }
 
         // change the composition
-        val newValue = TextFieldCharSequence(
-            state.text,
-            state.selection,
-            composition = TextRange(0, 1)
-        )
+        val newValue =
+            TextFieldCharSequence(state.text, state.selection, composition = TextRange(0, 1))
         state.syncMainBufferToTemporaryBuffer(newValue)
 
         assertThat(state.text.toString()).isEqualTo(newValue.toString())
@@ -338,11 +315,12 @@
 
         // change selection
         val newSelection = TextRange(1)
-        val newValue = TextFieldCharSequence(
-            state.text,
-            selection = newSelection,
-            composition = state.composition
-        )
+        val newValue =
+            TextFieldCharSequence(
+                state.text,
+                selection = newSelection,
+                composition = state.composition
+            )
         state.syncMainBufferToTemporaryBuffer(newValue)
 
         assertThat(state.text.toString()).isEqualTo(newValue.toString())
@@ -352,13 +330,14 @@
 
     @Test
     fun filterThatDoesNothing_doesNotResetBuffer() {
-        val state = TextFieldState(
-            TextFieldCharSequence(
-                "abc",
-                selection = TextRange(3),
-                composition = TextRange(0, 3)
+        val state =
+            TextFieldState(
+                TextFieldCharSequence(
+                    "abc",
+                    selection = TextRange(3),
+                    composition = TextRange(0, 3)
+                )
             )
-        )
 
         val initialBuffer = state.mainBuffer
 
@@ -372,13 +351,14 @@
 
     @Test
     fun returningTheEquivalentValueFromFilter_doesNotResetBuffer() {
-        val state = TextFieldState(
-            TextFieldCharSequence(
-                "abc",
-                selection = TextRange(3),
-                composition = TextRange(0, 3)
+        val state =
+            TextFieldState(
+                TextFieldCharSequence(
+                    "abc",
+                    selection = TextRange(3),
+                    composition = TextRange(0, 3)
+                )
             )
-        )
 
         val initialBuffer = state.mainBuffer
 
@@ -392,13 +372,14 @@
 
     @Test
     fun returningOldValueFromFilter_resetsTheBuffer() {
-        val state = TextFieldState(
-            TextFieldCharSequence(
-                "abc",
-                selection = TextRange(3),
-                composition = TextRange(0, 3)
+        val state =
+            TextFieldState(
+                TextFieldCharSequence(
+                    "abc",
+                    selection = TextRange(3),
+                    composition = TextRange(0, 3)
+                )
             )
-        )
 
         var resetCalledOld: TextFieldCharSequence? = null
         var resetCalledNew: TextFieldCharSequence? = null
@@ -448,7 +429,9 @@
         state.editAsUser(
             inputTransformation = inputTransformation,
             restartImeIfContentChanges = false
-        ) { finishComposingText() }
+        ) {
+            finishComposingText()
+        }
     }
 
     @Test
@@ -463,7 +446,9 @@
         state.editAsUser(
             inputTransformation = inputTransformation,
             restartImeIfContentChanges = false
-        ) { finishComposingText() }
+        ) {
+            finishComposingText()
+        }
     }
 
     @Test
@@ -475,8 +460,7 @@
             val old = originalValue
             val new = toTextFieldCharSequence()
             fail(
-                "filter ran, old=\"$old\" (${old.selection}), " +
-                    "new=\"$new\" (${new.selection})"
+                "filter ran, old=\"$old\" (${old.selection}), " + "new=\"$new\" (${new.selection})"
             )
         }
 
@@ -510,7 +494,9 @@
         state.editAsUser(
             inputTransformation = inputTransformation,
             restartImeIfContentChanges = false
-        ) { setSelection(0, 5) }
+        ) {
+            setSelection(0, 5)
+        }
     }
 
     @Test
@@ -562,9 +548,8 @@
         assertThat(state.composition).isEqualTo(TextRange(2, 3))
     }
 
-    private fun TextFieldState(
-        value: TextFieldCharSequence
-    ) = TextFieldState(value.toString(), value.selection)
+    private fun TextFieldState(value: TextFieldCharSequence) =
+        TextFieldState(value.toString(), value.selection)
 
     private fun TextFieldState.editAsUser(block: EditingBuffer.() -> Unit) {
         editAsUser(inputTransformation = null, restartImeIfContentChanges = false, block = block)
@@ -574,11 +559,7 @@
         listener: (TextFieldCharSequence, TextFieldCharSequence, Boolean) -> Unit
     ) {
         addNotifyImeListener { oldValue, newValue, restartImeIfContentChanges ->
-            listener(
-                oldValue,
-                newValue,
-                restartImeIfContentChanges
-            )
+            listener(oldValue, newValue, restartImeIfContentChanges)
         }
     }
 
diff --git a/compose/foundation/foundation/src/androidUnitTest/kotlin/androidx/compose/foundation/text/input/internal/ToCharArrayTest.kt b/compose/foundation/foundation/src/androidUnitTest/kotlin/androidx/compose/foundation/text/input/internal/ToCharArrayTest.kt
index 2da6ea4..fe191c7 100644
--- a/compose/foundation/foundation/src/androidUnitTest/kotlin/androidx/compose/foundation/text/input/internal/ToCharArrayTest.kt
+++ b/compose/foundation/foundation/src/androidUnitTest/kotlin/androidx/compose/foundation/text/input/internal/ToCharArrayTest.kt
@@ -28,48 +28,37 @@
 @RunWith(JUnit4::class)
 class ToCharArrayTest {
 
-    private val sources = listOf(
-        "hello",
-        TextFieldCharSequence("hello"),
-        CustomCharSequence("hello"),
-    )
+    private val sources =
+        listOf(
+            "hello",
+            TextFieldCharSequence("hello"),
+            CustomCharSequence("hello"),
+        )
 
     private val dest = CharArray(10)
 
     @Test
     fun toCharArray_invalidSourceStartIndex() {
         sources.forEach { source ->
-            assertFails {
-                source.toCharArray(dest, 0, source.length + 1, source.length + 2)
-            }
+            assertFails { source.toCharArray(dest, 0, source.length + 1, source.length + 2) }
         }
     }
 
     @Test
     fun toCharArray_invalidSourceEndIndex() {
         sources.forEach { source ->
-            assertFails {
-                source.toCharArray(dest, 0, 0, source.length + 1)
-            }
+            assertFails { source.toCharArray(dest, 0, 0, source.length + 1) }
         }
     }
 
     @Test
     fun toCharArray_invalidDestStartIndex() {
-        sources.forEach { source ->
-            assertFails {
-                source.toCharArray(dest, dest.size + 1, 0, 1)
-            }
-        }
+        sources.forEach { source -> assertFails { source.toCharArray(dest, dest.size + 1, 0, 1) } }
     }
 
     @Test
     fun toCharArray_invalidDestEndIndex() {
-        sources.forEach { source ->
-            assertFails {
-                source.toCharArray(dest, dest.size, 0, 1)
-            }
-        }
+        sources.forEach { source -> assertFails { source.toCharArray(dest, dest.size, 0, 1) } }
     }
 
     @Test
@@ -77,9 +66,21 @@
         sources.forEach { source ->
             dest.fill(Char(0))
             source.toCharArray(dest, 0, 0, source.length)
-            assertThat(dest).asList().containsExactly(
-                'h', 'e', 'l', 'l', 'o', Char(0), Char(0), Char(0), Char(0), Char(0)
-            ).inOrder()
+            assertThat(dest)
+                .asList()
+                .containsExactly(
+                    'h',
+                    'e',
+                    'l',
+                    'l',
+                    'o',
+                    Char(0),
+                    Char(0),
+                    Char(0),
+                    Char(0),
+                    Char(0)
+                )
+                .inOrder()
         }
     }
 
@@ -88,9 +89,21 @@
         sources.forEach { source ->
             dest.fill(Char(0))
             source.toCharArray(dest, 5, 0, source.length)
-            assertThat(dest).asList().containsExactly(
-                Char(0), Char(0), Char(0), Char(0), Char(0), 'h', 'e', 'l', 'l', 'o'
-            ).inOrder()
+            assertThat(dest)
+                .asList()
+                .containsExactly(
+                    Char(0),
+                    Char(0),
+                    Char(0),
+                    Char(0),
+                    Char(0),
+                    'h',
+                    'e',
+                    'l',
+                    'l',
+                    'o'
+                )
+                .inOrder()
         }
     }
 
diff --git a/compose/foundation/foundation/src/androidUnitTest/kotlin/androidx/compose/foundation/text/input/internal/TransformedTextFieldStateTest.kt b/compose/foundation/foundation/src/androidUnitTest/kotlin/androidx/compose/foundation/text/input/internal/TransformedTextFieldStateTest.kt
index c66fab3..4acbd26 100644
--- a/compose/foundation/foundation/src/androidUnitTest/kotlin/androidx/compose/foundation/text/input/internal/TransformedTextFieldStateTest.kt
+++ b/compose/foundation/foundation/src/androidUnitTest/kotlin/androidx/compose/foundation/text/input/internal/TransformedTextFieldStateTest.kt
@@ -34,13 +34,12 @@
     @Test
     fun outputTransformationAffectsPresentedAndVisualText() {
         val state = TextFieldState("hello")
-        val outputTransformation = OutputTransformation {
-            append("world")
-        }
-        val transformedState = TransformedTextFieldState(
-            textFieldState = state,
-            outputTransformation = outputTransformation
-        )
+        val outputTransformation = OutputTransformation { append("world") }
+        val transformedState =
+            TransformedTextFieldState(
+                textFieldState = state,
+                outputTransformation = outputTransformation
+            )
 
         assertThat(transformedState.untransformedText.toString()).isEqualTo("hello")
         assertThat(transformedState.outputText.toString()).isEqualTo("helloworld")
@@ -55,10 +54,11 @@
             insert(0, "aa")
             append("cc")
         }
-        val transformedState = TransformedTextFieldState(
-            textFieldState = state,
-            outputTransformation = outputTransformation
-        )
+        val transformedState =
+            TransformedTextFieldState(
+                textFieldState = state,
+                outputTransformation = outputTransformation
+            )
 
         assertThat(transformedState.outputText.toString()).isEqualTo("aazzbbzzcc")
         assertThat(transformedState.mapToTransformed(0)).isEqualTo(TextRange(0, 2))
@@ -78,10 +78,11 @@
             delete(4, 6)
             delete(0, 2)
         }
-        val transformedState = TransformedTextFieldState(
-            textFieldState = state,
-            outputTransformation = outputTransformation
-        )
+        val transformedState =
+            TransformedTextFieldState(
+                textFieldState = state,
+                outputTransformation = outputTransformation
+            )
 
         assertThat(transformedState.outputText.toString()).isEqualTo("zzzz")
         assertThat(transformedState.mapToTransformed(0)).isEqualTo(TextRange(0))
@@ -106,10 +107,11 @@
             replace(2, 4, "ddd")
             replace(0, 2, "c")
         }
-        val transformedState = TransformedTextFieldState(
-            textFieldState = state,
-            outputTransformation = outputTransformation
-        )
+        val transformedState =
+            TransformedTextFieldState(
+                textFieldState = state,
+                outputTransformation = outputTransformation
+            )
 
         assertThat(transformedState.outputText.toString()).isEqualTo("cddd")
         assertThat(transformedState.mapToTransformed(0)).isEqualTo(TextRange(0))
@@ -129,10 +131,11 @@
             insert(0, "aa")
             append("cc")
         }
-        val transformedState = TransformedTextFieldState(
-            textFieldState = state,
-            outputTransformation = outputTransformation
-        )
+        val transformedState =
+            TransformedTextFieldState(
+                textFieldState = state,
+                outputTransformation = outputTransformation
+            )
 
         assertThat(transformedState.outputText.toString()).isEqualTo("aazzbbzzcc")
         assertThat(transformedState.mapFromTransformed(0)).isEqualTo(TextRange(0))
@@ -158,10 +161,11 @@
             delete(4, 6)
             delete(0, 2)
         }
-        val transformedState = TransformedTextFieldState(
-            textFieldState = state,
-            outputTransformation = outputTransformation
-        )
+        val transformedState =
+            TransformedTextFieldState(
+                textFieldState = state,
+                outputTransformation = outputTransformation
+            )
 
         assertThat(transformedState.outputText.toString()).isEqualTo("zzzz")
         assertThat(transformedState.mapFromTransformed(0)).isEqualTo(TextRange(0, 2))
@@ -180,10 +184,11 @@
             replace(2, 4, "ddd")
             replace(0, 2, "c")
         }
-        val transformedState = TransformedTextFieldState(
-            textFieldState = state,
-            outputTransformation = outputTransformation
-        )
+        val transformedState =
+            TransformedTextFieldState(
+                textFieldState = state,
+                outputTransformation = outputTransformation
+            )
 
         assertThat(transformedState.outputText.toString()).isEqualTo("cddd")
         assertThat(transformedState.mapFromTransformed(0)).isEqualTo(TextRange(0))
@@ -198,13 +203,12 @@
     @Test
     fun textFieldStateSelection_isTransformed_toPresentedText() {
         val state = TextFieldState("hello")
-        val outputTransformation = OutputTransformation {
-            insert(0, "aa")
-        }
-        val transformedState = TransformedTextFieldState(
-            textFieldState = state,
-            outputTransformation = outputTransformation
-        )
+        val outputTransformation = OutputTransformation { insert(0, "aa") }
+        val transformedState =
+            TransformedTextFieldState(
+                textFieldState = state,
+                outputTransformation = outputTransformation
+            )
         assertThat(transformedState.outputText.toString()).isEqualTo("aahello")
 
         state.edit { selection = TextRange(0, 2) }
diff --git a/compose/foundation/foundation/src/androidUnitTest/kotlin/androidx/compose/foundation/text/input/internal/TransformedTextSelectionMovementTest.kt b/compose/foundation/foundation/src/androidUnitTest/kotlin/androidx/compose/foundation/text/input/internal/TransformedTextSelectionMovementTest.kt
index f9ce97e..be1cb50 100644
--- a/compose/foundation/foundation/src/androidUnitTest/kotlin/androidx/compose/foundation/text/input/internal/TransformedTextSelectionMovementTest.kt
+++ b/compose/foundation/foundation/src/androidUnitTest/kotlin/androidx/compose/foundation/text/input/internal/TransformedTextSelectionMovementTest.kt
@@ -158,22 +158,24 @@
     }
 
     private fun calculateNextCursorPosition(state: TransformedTextFieldState) {
-        val newCursor = calculateAdjacentCursorPosition(
-            state.visualText.toString(),
-            state.visualText.selection.end,
-            forward = true,
-            state
-        )
+        val newCursor =
+            calculateAdjacentCursorPosition(
+                state.visualText.toString(),
+                state.visualText.selection.end,
+                forward = true,
+                state
+            )
         state.placeCursorBeforeCharAt(newCursor)
     }
 
     private fun calculatePreviousCursorPosition(state: TransformedTextFieldState) {
-        val newCursor = calculateAdjacentCursorPosition(
-            state.visualText.toString(),
-            state.visualText.selection.end,
-            forward = false,
-            state
-        )
+        val newCursor =
+            calculateAdjacentCursorPosition(
+                state.visualText.toString(),
+                state.visualText.selection.end,
+                forward = false,
+                state
+            )
         state.placeCursorBeforeCharAt(newCursor)
     }
 }
diff --git a/compose/foundation/foundation/src/androidUnitTest/kotlin/androidx/compose/foundation/text/input/internal/matchers/EditBufferSubject.kt b/compose/foundation/foundation/src/androidUnitTest/kotlin/androidx/compose/foundation/text/input/internal/matchers/EditBufferSubject.kt
index 798e02d..ac6b9ac 100644
--- a/compose/foundation/foundation/src/androidUnitTest/kotlin/androidx/compose/foundation/text/input/internal/matchers/EditBufferSubject.kt
+++ b/compose/foundation/foundation/src/androidUnitTest/kotlin/androidx/compose/foundation/text/input/internal/matchers/EditBufferSubject.kt
@@ -29,17 +29,16 @@
 
 @OptIn(InternalFoundationTextApi::class)
 internal fun assertThat(buffer: PartialGapBuffer): EditBufferSubject {
-    return assertAbout(EditBufferSubject.SUBJECT_FACTORY)
-        .that(GapBufferWrapper(buffer))!!
+    return assertAbout(EditBufferSubject.SUBJECT_FACTORY).that(GapBufferWrapper(buffer))!!
 }
 
 internal fun assertThat(buffer: EditingBuffer): EditBufferSubject {
-    return assertAbout(EditBufferSubject.SUBJECT_FACTORY)
-        .that(EditingBufferWrapper(buffer))!!
+    return assertAbout(EditBufferSubject.SUBJECT_FACTORY).that(EditingBufferWrapper(buffer))!!
 }
 
 internal abstract class GetOperatorWrapper(val buffer: Any) {
     abstract operator fun get(index: Int): Char
+
     override fun toString(): String = buffer.toString()
 }
 
@@ -52,17 +51,16 @@
     override fun get(index: Int): Char = (buffer as PartialGapBuffer)[index]
 }
 
-/**
- * Truth extension for Editing Buffers.
- */
-internal class EditBufferSubject private constructor(
-    failureMetadata: FailureMetadata?,
-    private val subject: GetOperatorWrapper
-) : Subject(failureMetadata, subject) {
+/** Truth extension for Editing Buffers. */
+internal class EditBufferSubject
+private constructor(failureMetadata: FailureMetadata?, private val subject: GetOperatorWrapper) :
+    Subject(failureMetadata, subject) {
 
     companion object {
         internal val SUBJECT_FACTORY: Factory<EditBufferSubject, GetOperatorWrapper> =
-            Factory { failureMetadata, subject -> EditBufferSubject(failureMetadata, subject) }
+            Factory { failureMetadata, subject ->
+                EditBufferSubject(failureMetadata, subject)
+            }
     }
 
     fun hasChars(expected: String) {
diff --git a/compose/foundation/foundation/src/androidUnitTest/kotlin/androidx/compose/foundation/text/input/internal/undo/TextUndoTest.kt b/compose/foundation/foundation/src/androidUnitTest/kotlin/androidx/compose/foundation/text/input/internal/undo/TextUndoTest.kt
index abd1cb7..2f27a8d 100644
--- a/compose/foundation/foundation/src/androidUnitTest/kotlin/androidx/compose/foundation/text/input/internal/undo/TextUndoTest.kt
+++ b/compose/foundation/foundation/src/androidUnitTest/kotlin/androidx/compose/foundation/text/input/internal/undo/TextUndoTest.kt
@@ -310,9 +310,7 @@
         state.typeAtStart("e")
         state.typeAtEnd("f")
 
-        state.edit {
-            selection = TextRange(0)
-        }
+        state.edit { selection = TextRange(0) }
 
         assertThat(state.undoState.canUndo).isEqualTo(true)
     }
@@ -326,9 +324,7 @@
 
         val before = state.text.toString()
 
-        state.edit {
-            replace(0, 6, "eabcdf")
-        }
+        state.edit { replace(0, 6, "eabcdf") }
 
         val after = state.text.toString()
 
@@ -350,9 +346,7 @@
 
         private fun TextFieldState.typeAt(index: Int, text: String) {
             placeCursorAt(index)
-            editAsUser(inputTransformation = null) {
-                replace(index, index, text)
-            }
+            editAsUser(inputTransformation = null) { replace(index, index, text) }
         }
 
         private fun TextFieldState.type(text: String) {
@@ -363,9 +357,7 @@
         }
 
         private fun TextFieldState.deleteAt(index: Int) {
-            editAsUser(inputTransformation = null) {
-                delete(index, index + 1)
-            }
+            editAsUser(inputTransformation = null) { delete(index, index + 1) }
         }
 
         private fun TextFieldState.placeCursorAt(index: Int) {
@@ -373,15 +365,11 @@
         }
 
         private fun TextFieldState.select(start: Int, end: Int) {
-            editAsUser(inputTransformation = null) {
-                setSelection(start, end)
-            }
+            editAsUser(inputTransformation = null) { setSelection(start, end) }
         }
 
         private fun TextFieldState.replaceAt(start: Int, end: Int, newText: String) {
-            editAsUser(inputTransformation = null) {
-                replace(start, end, newText)
-            }
+            editAsUser(inputTransformation = null) { replace(start, end, newText) }
         }
     }
 }
diff --git a/compose/foundation/foundation/src/androidUnitTest/kotlin/androidx/compose/foundation/text/input/internal/undo/UndoManagerSaverTest.kt b/compose/foundation/foundation/src/androidUnitTest/kotlin/androidx/compose/foundation/text/input/internal/undo/UndoManagerSaverTest.kt
index 0ac9b47..1769909 100644
--- a/compose/foundation/foundation/src/androidUnitTest/kotlin/androidx/compose/foundation/text/input/internal/undo/UndoManagerSaverTest.kt
+++ b/compose/foundation/foundation/src/androidUnitTest/kotlin/androidx/compose/foundation/text/input/internal/undo/UndoManagerSaverTest.kt
@@ -37,9 +37,7 @@
         // undoStack; 1-2 redoStack; 3
 
         val saver = UndoManager.createSaver(autoSaver<Int>())
-        val saved = with(saver) {
-            TestSaverScope.save(undoManager)
-        }
+        val saved = with(saver) { TestSaverScope.save(undoManager) }
         assertNotNull(saved)
         val restoredState = saver.restore(saved)
 
diff --git a/compose/foundation/foundation/src/androidUnitTest/kotlin/androidx/compose/foundation/text/input/internal/undo/UndoManagerTest.kt b/compose/foundation/foundation/src/androidUnitTest/kotlin/androidx/compose/foundation/text/input/internal/undo/UndoManagerTest.kt
index ebb054e..001bc9d 100644
--- a/compose/foundation/foundation/src/androidUnitTest/kotlin/androidx/compose/foundation/text/input/internal/undo/UndoManagerTest.kt
+++ b/compose/foundation/foundation/src/androidUnitTest/kotlin/androidx/compose/foundation/text/input/internal/undo/UndoManagerTest.kt
@@ -35,40 +35,25 @@
     @Test
     fun initialLowCapacityThrows_undoStack() {
         assertFailsWith<IllegalArgumentException>(
-            getInitialCapacityErrorMessage(
-                capacity = 1,
-                totalStackSize = 2
-            )
+            getInitialCapacityErrorMessage(capacity = 1, totalStackSize = 2)
         ) {
-            UndoManager(
-                initialUndoStack = listOf(1, 2),
-                capacity = 1
-            )
+            UndoManager(initialUndoStack = listOf(1, 2), capacity = 1)
         }
     }
 
     @Test
     fun initialLowCapacityThrows_redoStack() {
         assertFailsWith<IllegalArgumentException>(
-            getInitialCapacityErrorMessage(
-                capacity = 1,
-                totalStackSize = 2
-            )
+            getInitialCapacityErrorMessage(capacity = 1, totalStackSize = 2)
         ) {
-            UndoManager(
-                initialRedoStack = listOf(1, 2),
-                capacity = 1
-            )
+            UndoManager(initialRedoStack = listOf(1, 2), capacity = 1)
         }
     }
 
     @Test
     fun initialLowCapacityThrows_bothStacks() {
         assertFailsWith<IllegalArgumentException>(
-            getInitialCapacityErrorMessage(
-                capacity = 3,
-                totalStackSize = 4
-            )
+            getInitialCapacityErrorMessage(capacity = 3, totalStackSize = 4)
         ) {
             UndoManager(
                 initialUndoStack = listOf(1, 2),
@@ -186,5 +171,5 @@
 
     private fun getInitialCapacityErrorMessage(capacity: Int, totalStackSize: Int) =
         "Initial list of undo and redo operations have a size=($totalStackSize) greater " +
-        "than the given capacity=($capacity)."
+            "than the given capacity=($capacity)."
 }
diff --git a/compose/foundation/foundation/src/androidUnitTest/kotlin/androidx/compose/foundation/text/selection/SelectableInfoTest.kt b/compose/foundation/foundation/src/androidUnitTest/kotlin/androidx/compose/foundation/text/selection/SelectableInfoTest.kt
index 5d3d283..25cf7d3 100644
--- a/compose/foundation/foundation/src/androidUnitTest/kotlin/androidx/compose/foundation/text/selection/SelectableInfoTest.kt
+++ b/compose/foundation/foundation/src/androidUnitTest/kotlin/androidx/compose/foundation/text/selection/SelectableInfoTest.kt
@@ -30,14 +30,15 @@
     @Test
     fun verifySimpleParameters() {
         val text = "hi"
-        val selectableInfo = getSelectableInfo(
-            text = text,
-            selectableId = 1L,
-            slot = 1,
-            rawStartHandleOffset = 0,
-            rawEndHandleOffset = 1,
-            rawPreviousHandleOffset = -1,
-        )
+        val selectableInfo =
+            getSelectableInfo(
+                text = text,
+                selectableId = 1L,
+                slot = 1,
+                rawStartHandleOffset = 0,
+                rawEndHandleOffset = 1,
+                rawPreviousHandleOffset = -1,
+            )
 
         assertThat(selectableInfo.selectableId).isEqualTo(1L)
         assertThat(selectableInfo.slot).isEqualTo(1)
@@ -50,98 +51,109 @@
 
     @Test
     fun rawCrossedStatus_whenStartGreaterThanEnd_isCrossed() {
-        val selectableInfo = getSelectableInfo(
-            rawStartHandleOffset = 1,
-            rawEndHandleOffset = 0,
-        )
+        val selectableInfo =
+            getSelectableInfo(
+                rawStartHandleOffset = 1,
+                rawEndHandleOffset = 0,
+            )
 
         assertThat(selectableInfo.rawCrossStatus).isEqualTo(CrossStatus.CROSSED)
     }
 
     @Test
     fun rawCrossedStatus_whenStartLessThanEnd_isNotCrossed() {
-        val selectableInfo = getSelectableInfo(
-            rawStartHandleOffset = 0,
-            rawEndHandleOffset = 1,
-        )
+        val selectableInfo =
+            getSelectableInfo(
+                rawStartHandleOffset = 0,
+                rawEndHandleOffset = 1,
+            )
 
         assertThat(selectableInfo.rawCrossStatus).isEqualTo(CrossStatus.NOT_CROSSED)
     }
 
     @Test
     fun rawCrossedStatus_whenStartEqualToEnd_isCollapsed() {
-        val selectableInfo = getSelectableInfo(
-            rawStartHandleOffset = 1,
-            rawEndHandleOffset = 1,
-        )
+        val selectableInfo =
+            getSelectableInfo(
+                rawStartHandleOffset = 1,
+                rawEndHandleOffset = 1,
+            )
 
         assertThat(selectableInfo.rawCrossStatus).isEqualTo(CrossStatus.COLLAPSED)
     }
 
     @Test
     fun shouldRecomputeSelection_whenUnchanged_isFalse() {
-        val info = getSelectableInfo(
-            selectableId = 1L,
-            rawStartHandleOffset = 1,
-            rawEndHandleOffset = 2,
-        )
+        val info =
+            getSelectableInfo(
+                selectableId = 1L,
+                rawStartHandleOffset = 1,
+                rawEndHandleOffset = 2,
+            )
 
-        val otherInfo = getSelectableInfo(
-            selectableId = 1L,
-            rawStartHandleOffset = 1,
-            rawEndHandleOffset = 2,
-        )
+        val otherInfo =
+            getSelectableInfo(
+                selectableId = 1L,
+                rawStartHandleOffset = 1,
+                rawEndHandleOffset = 2,
+            )
 
         assertThat(info.shouldRecomputeSelection(otherInfo)).isFalse()
     }
 
     @Test
     fun shouldRecomputeSelection_whenSelectableChanged_isTrue() {
-        val info = getSelectableInfo(
-            selectableId = 1L,
-            rawStartHandleOffset = 1,
-            rawEndHandleOffset = 2,
-        )
+        val info =
+            getSelectableInfo(
+                selectableId = 1L,
+                rawStartHandleOffset = 1,
+                rawEndHandleOffset = 2,
+            )
 
-        val otherInfo = getSelectableInfo(
-            selectableId = 2L,
-            rawStartHandleOffset = 1,
-            rawEndHandleOffset = 2,
-        )
+        val otherInfo =
+            getSelectableInfo(
+                selectableId = 2L,
+                rawStartHandleOffset = 1,
+                rawEndHandleOffset = 2,
+            )
 
         assertThat(info.shouldRecomputeSelection(otherInfo)).isTrue()
     }
 
     @Test
     fun shouldRecomputeSelection_whenStartHandleChanged_isTrue() {
-        val info = getSelectableInfo(
-            selectableId = 1L,
-            rawStartHandleOffset = 1,
-            rawEndHandleOffset = 2,
-        )
+        val info =
+            getSelectableInfo(
+                selectableId = 1L,
+                rawStartHandleOffset = 1,
+                rawEndHandleOffset = 2,
+            )
 
-        val otherInfo = getSelectableInfo(
-            selectableId = 1L,
-            rawStartHandleOffset = 0,
-            rawEndHandleOffset = 2,
-        )
+        val otherInfo =
+            getSelectableInfo(
+                selectableId = 1L,
+                rawStartHandleOffset = 0,
+                rawEndHandleOffset = 2,
+            )
 
         assertThat(info.shouldRecomputeSelection(otherInfo)).isTrue()
     }
 
     @Test
     fun shouldRecomputeSelection_whenEndHandleChanged_isTrue() {
-        val info = getSelectableInfo(
-            selectableId = 1L,
-            rawStartHandleOffset = 1,
-            rawEndHandleOffset = 2,
-        )
+        val info =
+            getSelectableInfo(
+                selectableId = 1L,
+                rawStartHandleOffset = 1,
+                rawEndHandleOffset = 2,
+            )
 
-        val otherInfo = getSelectableInfo(
-            selectableId = 1L,
-            rawStartHandleOffset = 1,
-            rawEndHandleOffset = 3,
-        )
+        val otherInfo =
+            getSelectableInfo(
+                selectableId = 1L,
+                rawStartHandleOffset = 1,
+                rawEndHandleOffset = 3,
+            )
 
         assertThat(info.shouldRecomputeSelection(otherInfo)).isTrue()
     }
@@ -150,17 +162,19 @@
     fun toAnchor_nonEmptyLine_matchesInfo() {
         val offset = 0
         val selectableId = 1L
-        val info = getSelectableInfo(
-            selectableId = selectableId,
-            rtlRanges = emptyList(),
-            rtlLines = emptySet(),
-        )
+        val info =
+            getSelectableInfo(
+                selectableId = selectableId,
+                rtlRanges = emptyList(),
+                rtlLines = emptySet(),
+            )
 
-        val expected = Selection.AnchorInfo(
-            direction = ResolvedTextDirection.Ltr,
-            offset = offset,
-            selectableId = selectableId
-        )
+        val expected =
+            Selection.AnchorInfo(
+                direction = ResolvedTextDirection.Ltr,
+                offset = offset,
+                selectableId = selectableId
+            )
 
         assertThat(info.anchorForOffset(offset)).isEqualTo(expected)
     }
@@ -169,17 +183,19 @@
     fun toAnchor_nonEmptyLine_matchesInfo_rtl() {
         val offset = 0
         val selectableId = 1L
-        val info = getSelectableInfo(
-            selectableId = selectableId,
-            rtlRanges = listOf(0..0),
-            rtlLines = emptySet(),
-        )
+        val info =
+            getSelectableInfo(
+                selectableId = selectableId,
+                rtlRanges = listOf(0..0),
+                rtlLines = emptySet(),
+            )
 
-        val expected = Selection.AnchorInfo(
-            direction = ResolvedTextDirection.Rtl,
-            offset = offset,
-            selectableId = selectableId
-        )
+        val expected =
+            Selection.AnchorInfo(
+                direction = ResolvedTextDirection.Rtl,
+                offset = offset,
+                selectableId = selectableId
+            )
 
         assertThat(info.anchorForOffset(offset)).isEqualTo(expected)
     }
@@ -188,18 +204,20 @@
     fun toAnchor_emptyText_usesParagraphDirection() {
         val offset = 0
         val selectableId = 1L
-        val info = getSelectableInfo(
-            text = "",
-            selectableId = selectableId,
-            rtlRanges = emptyList(),
-            rtlLines = setOf(0),
-        )
+        val info =
+            getSelectableInfo(
+                text = "",
+                selectableId = selectableId,
+                rtlRanges = emptyList(),
+                rtlLines = setOf(0),
+            )
 
-        val expected = Selection.AnchorInfo(
-            direction = ResolvedTextDirection.Rtl,
-            offset = offset,
-            selectableId = selectableId
-        )
+        val expected =
+            Selection.AnchorInfo(
+                direction = ResolvedTextDirection.Rtl,
+                offset = offset,
+                selectableId = selectableId
+            )
 
         assertThat(info.anchorForOffset(offset)).isEqualTo(expected)
     }
@@ -208,18 +226,20 @@
     fun toAnchor_emptyText_usesParagraphDirection_rtl() {
         val offset = 0
         val selectableId = 1L
-        val info = getSelectableInfo(
-            text = "",
-            selectableId = selectableId,
-            rtlRanges = listOf(0..0),
-            rtlLines = emptySet(),
-        )
+        val info =
+            getSelectableInfo(
+                text = "",
+                selectableId = selectableId,
+                rtlRanges = listOf(0..0),
+                rtlLines = emptySet(),
+            )
 
-        val expected = Selection.AnchorInfo(
-            direction = ResolvedTextDirection.Ltr,
-            offset = offset,
-            selectableId = selectableId
-        )
+        val expected =
+            Selection.AnchorInfo(
+                direction = ResolvedTextDirection.Ltr,
+                offset = offset,
+                selectableId = selectableId
+            )
 
         assertThat(info.anchorForOffset(offset)).isEqualTo(expected)
     }
@@ -228,19 +248,21 @@
     fun toAnchor_emptyLine_usesParagraphDirection() {
         val offset = 6
         val selectableId = 1L
-        val info = getSelectableInfo(
-            text = "hello\n\nhello",
-            selectableId = selectableId,
-            rtlRanges = emptyList(),
-            rtlLines = setOf(1),
-            lineBreaks = listOf(6, 7)
-        )
+        val info =
+            getSelectableInfo(
+                text = "hello\n\nhello",
+                selectableId = selectableId,
+                rtlRanges = emptyList(),
+                rtlLines = setOf(1),
+                lineBreaks = listOf(6, 7)
+            )
 
-        val expected = Selection.AnchorInfo(
-            direction = ResolvedTextDirection.Rtl,
-            offset = offset,
-            selectableId = selectableId
-        )
+        val expected =
+            Selection.AnchorInfo(
+                direction = ResolvedTextDirection.Rtl,
+                offset = offset,
+                selectableId = selectableId
+            )
 
         assertThat(info.anchorForOffset(offset)).isEqualTo(expected)
     }
@@ -249,19 +271,21 @@
     fun toAnchor_emptyLine_usesParagraphDirection_rtl() {
         val offset = 6
         val selectableId = 1L
-        val info = getSelectableInfo(
-            text = "hello\n\nhello",
-            selectableId = selectableId,
-            rtlRanges = listOf(6..6),
-            rtlLines = emptySet(),
-            lineBreaks = listOf(6, 7)
-        )
+        val info =
+            getSelectableInfo(
+                text = "hello\n\nhello",
+                selectableId = selectableId,
+                rtlRanges = listOf(6..6),
+                rtlLines = emptySet(),
+                lineBreaks = listOf(6, 7)
+            )
 
-        val expected = Selection.AnchorInfo(
-            direction = ResolvedTextDirection.Ltr,
-            offset = offset,
-            selectableId = selectableId
-        )
+        val expected =
+            Selection.AnchorInfo(
+                direction = ResolvedTextDirection.Ltr,
+                offset = offset,
+                selectableId = selectableId
+            )
 
         assertThat(info.anchorForOffset(offset)).isEqualTo(expected)
     }
@@ -273,19 +297,22 @@
         val selectableId = 1L
         val info = getSelectableInfo(selectableId = selectableId)
 
-        val expected = Selection(
-            start = Selection.AnchorInfo(
-                direction = ResolvedTextDirection.Ltr,
-                offset = start,
-                selectableId = selectableId
-            ),
-            end = Selection.AnchorInfo(
-                direction = ResolvedTextDirection.Ltr,
-                offset = end,
-                selectableId = selectableId
-            ),
-            handlesCrossed = false
-        )
+        val expected =
+            Selection(
+                start =
+                    Selection.AnchorInfo(
+                        direction = ResolvedTextDirection.Ltr,
+                        offset = start,
+                        selectableId = selectableId
+                    ),
+                end =
+                    Selection.AnchorInfo(
+                        direction = ResolvedTextDirection.Ltr,
+                        offset = end,
+                        selectableId = selectableId
+                    ),
+                handlesCrossed = false
+            )
 
         assertThat(info.makeSingleLayoutSelection(start, end)).isEqualTo(expected)
     }
@@ -297,19 +324,22 @@
         val selectableId = 1L
         val info = getSelectableInfo(selectableId = selectableId)
 
-        val expected = Selection(
-            start = Selection.AnchorInfo(
-                direction = ResolvedTextDirection.Ltr,
-                offset = start,
-                selectableId = selectableId
-            ),
-            end = Selection.AnchorInfo(
-                direction = ResolvedTextDirection.Ltr,
-                offset = end,
-                selectableId = selectableId
-            ),
-            handlesCrossed = true
-        )
+        val expected =
+            Selection(
+                start =
+                    Selection.AnchorInfo(
+                        direction = ResolvedTextDirection.Ltr,
+                        offset = start,
+                        selectableId = selectableId
+                    ),
+                end =
+                    Selection.AnchorInfo(
+                        direction = ResolvedTextDirection.Ltr,
+                        offset = end,
+                        selectableId = selectableId
+                    ),
+                handlesCrossed = true
+            )
 
         assertThat(info.makeSingleLayoutSelection(start, end)).isEqualTo(expected)
     }
@@ -325,18 +355,20 @@
         rtlLines: Set<Int> = emptySet(),
         wordBoundaries: List<TextRange> = listOf(),
         lineBreaks: List<Int> = emptyList(),
-    ): SelectableInfo = SelectableInfo(
-        selectableId = selectableId,
-        slot = slot,
-        rawStartHandleOffset = rawStartHandleOffset,
-        rawEndHandleOffset = rawEndHandleOffset,
-        rawPreviousHandleOffset = rawPreviousHandleOffset,
-        textLayoutResult = getTextLayoutResultMock(
-            text = text,
-            rtlCharRanges = rtlRanges,
-            wordBoundaries = wordBoundaries,
-            lineBreaks = lineBreaks,
-            rtlLines = rtlLines,
-        ),
-    )
+    ): SelectableInfo =
+        SelectableInfo(
+            selectableId = selectableId,
+            slot = slot,
+            rawStartHandleOffset = rawStartHandleOffset,
+            rawEndHandleOffset = rawEndHandleOffset,
+            rawPreviousHandleOffset = rawPreviousHandleOffset,
+            textLayoutResult =
+                getTextLayoutResultMock(
+                    text = text,
+                    rtlCharRanges = rtlRanges,
+                    wordBoundaries = wordBoundaries,
+                    lineBreaks = lineBreaks,
+                    rtlLines = rtlLines,
+                ),
+        )
 }
diff --git a/compose/foundation/foundation/src/androidUnitTest/kotlin/androidx/compose/foundation/text/selection/SelectionAdjustmentTest.kt b/compose/foundation/foundation/src/androidUnitTest/kotlin/androidx/compose/foundation/text/selection/SelectionAdjustmentTest.kt
index 69b2b7f..eb817d7 100644
--- a/compose/foundation/foundation/src/androidUnitTest/kotlin/androidx/compose/foundation/text/selection/SelectionAdjustmentTest.kt
+++ b/compose/foundation/foundation/src/androidUnitTest/kotlin/androidx/compose/foundation/text/selection/SelectionAdjustmentTest.kt
@@ -30,10 +30,11 @@
 
     @Test
     fun none_noAdjustment() {
-        val layout = getSingleSelectionLayoutFake(
-            rawStartHandleOffset = 0,
-            rawEndHandleOffset = 5,
-        )
+        val layout =
+            getSingleSelectionLayoutFake(
+                rawStartHandleOffset = 0,
+                rawEndHandleOffset = 5,
+            )
 
         val actualSelection = SelectionAdjustment.None.adjust(layout)
         val expectedSelection = getSelection(startOffset = 0, endOffset = 5)
@@ -42,10 +43,11 @@
 
     @Test
     fun none_allowCollapsed() {
-        val layout = getSingleSelectionLayoutFake(
-            rawStartHandleOffset = 0,
-            rawEndHandleOffset = 0,
-        )
+        val layout =
+            getSingleSelectionLayoutFake(
+                rawStartHandleOffset = 0,
+                rawEndHandleOffset = 0,
+            )
 
         val actualSelection = SelectionAdjustment.None.adjust(layout)
         val expectedSelection = getSelection(startOffset = 0, endOffset = 0)
@@ -54,10 +56,11 @@
 
     @Test
     fun none_reversed() {
-        val layout = getSingleSelectionLayoutFake(
-            rawStartHandleOffset = 5,
-            rawEndHandleOffset = 0,
-        )
+        val layout =
+            getSingleSelectionLayoutFake(
+                rawStartHandleOffset = 5,
+                rawEndHandleOffset = 0,
+            )
 
         val actualSelection = SelectionAdjustment.None.adjust(layout)
         val expectedSelection = getSelection(startOffset = 5, endOffset = 0)
@@ -66,34 +69,38 @@
 
     @Test
     fun none_multiSelectable() {
-        val layout = getSelectionLayoutFake(
-            infos = listOf(
-                getSelectableInfoFake(selectableId = 1L, slot = 1),
-                getSelectableInfoFake(selectableId = 2L, slot = 3),
-            ),
-            currentInfoIndex = 0,
-            startSlot = 1,
-            endSlot = 3,
-        )
+        val layout =
+            getSelectionLayoutFake(
+                infos =
+                    listOf(
+                        getSelectableInfoFake(selectableId = 1L, slot = 1),
+                        getSelectableInfoFake(selectableId = 2L, slot = 3),
+                    ),
+                currentInfoIndex = 0,
+                startSlot = 1,
+                endSlot = 3,
+            )
 
         val actualSelection = SelectionAdjustment.None.adjust(layout)
-        val expectedSelection = getSelection(
-            startSelectableId = 1L,
-            startOffset = 0,
-            endSelectableId = 2L,
-            endOffset = 5
-        )
+        val expectedSelection =
+            getSelection(
+                startSelectableId = 1L,
+                startOffset = 0,
+                endSelectableId = 2L,
+                endOffset = 5
+            )
         assertThat(actualSelection).isEqualTo(expectedSelection)
     }
 
     @Test
     fun character_notCollapsed_noAdjustment() {
-        val layout = getSingleSelectionLayoutFake(
-            text = "hello world",
-            rawStartHandleOffset = 0,
-            rawEndHandleOffset = 3,
-            isStartHandle = true,
-        )
+        val layout =
+            getSingleSelectionLayoutFake(
+                text = "hello world",
+                rawStartHandleOffset = 0,
+                rawEndHandleOffset = 3,
+                isStartHandle = true,
+            )
 
         val actualSelection = SelectionAdjustment.Character.adjust(layout)
         val expectedSelection = getSelection(startOffset = 0, endOffset = 3)
@@ -102,12 +109,13 @@
 
     @Test
     fun character_collapsedNotReversed_returnOneCharSelectionNotReversed() {
-        val layout = getSingleSelectionLayoutFake(
-            text = "hello",
-            rawStartHandleOffset = 1,
-            rawEndHandleOffset = 1,
-            previousSelection = getSelection(startOffset = 1, endOffset = 2),
-        )
+        val layout =
+            getSingleSelectionLayoutFake(
+                text = "hello",
+                rawStartHandleOffset = 1,
+                rawEndHandleOffset = 1,
+                previousSelection = getSelection(startOffset = 1, endOffset = 2),
+            )
 
         // The end offset is moving towards the start offset,
         // which makes the new raw text range collapsed.
@@ -123,12 +131,13 @@
 
     @Test
     fun character_collapsedReversed_returnOneCharSelectionReversed() {
-        val layout = getSingleSelectionLayoutFake(
-            text = "hello",
-            rawStartHandleOffset = 2,
-            rawEndHandleOffset = 2,
-            previousSelection = getSelection(startOffset = 2, endOffset = 1),
-        )
+        val layout =
+            getSingleSelectionLayoutFake(
+                text = "hello",
+                rawStartHandleOffset = 2,
+                rawEndHandleOffset = 2,
+                previousSelection = getSelection(startOffset = 2, endOffset = 1),
+            )
 
         val actualSelection = SelectionAdjustment.Character.adjust(layout)
         val expectedSelection = getSelection(startOffset = 2, endOffset = 1)
@@ -137,12 +146,13 @@
 
     @Test
     fun character_collapsedNotReversed_startBoundary_returnOneCharSelectionNotReversed() {
-        val layout = getSingleSelectionLayoutFake(
-            text = "hello",
-            rawStartHandleOffset = 0,
-            rawEndHandleOffset = 0,
-            previousSelection = getSelection(startOffset = 0, endOffset = 1),
-        )
+        val layout =
+            getSingleSelectionLayoutFake(
+                text = "hello",
+                rawStartHandleOffset = 0,
+                rawEndHandleOffset = 0,
+                previousSelection = getSelection(startOffset = 0, endOffset = 1),
+            )
 
         val actualSelection = SelectionAdjustment.Character.adjust(layout)
         val expectedSelection = getSelection(startOffset = 0, endOffset = 1)
@@ -151,13 +161,14 @@
 
     @Test
     fun character_collapsedReversed_startBoundary_returnOneCharSelectionReversed() {
-        val layout = getSingleSelectionLayoutFake(
-            text = "hello",
-            rawStartHandleOffset = 0,
-            rawEndHandleOffset = 0,
-            previousSelection = getSelection(startOffset = 1, endOffset = 0),
-            isStartHandle = true,
-        )
+        val layout =
+            getSingleSelectionLayoutFake(
+                text = "hello",
+                rawStartHandleOffset = 0,
+                rawEndHandleOffset = 0,
+                previousSelection = getSelection(startOffset = 1, endOffset = 0),
+                isStartHandle = true,
+            )
 
         val actualSelection = SelectionAdjustment.Character.adjust(layout)
         val expectedSelection = getSelection(startOffset = 1, endOffset = 0)
@@ -166,13 +177,14 @@
 
     @Test
     fun character_collapsedNotReversed_endBoundary_returnOneCharSelectionNotReversed() {
-        val layout = getSingleSelectionLayoutFake(
-            text = "hello",
-            rawStartHandleOffset = 5,
-            rawEndHandleOffset = 5,
-            previousSelection = getSelection(startOffset = 4, endOffset = 5),
-            isStartHandle = true,
-        )
+        val layout =
+            getSingleSelectionLayoutFake(
+                text = "hello",
+                rawStartHandleOffset = 5,
+                rawEndHandleOffset = 5,
+                previousSelection = getSelection(startOffset = 4, endOffset = 5),
+                isStartHandle = true,
+            )
 
         val actualSelection = SelectionAdjustment.Character.adjust(layout)
         val expectedSelection = getSelection(startOffset = 4, endOffset = 5)
@@ -181,12 +193,13 @@
 
     @Test
     fun character_collapsedReversed_endBoundary_returnOneCharSelectionReversed() {
-        val layout = getSingleSelectionLayoutFake(
-            text = "hello",
-            rawStartHandleOffset = 5,
-            rawEndHandleOffset = 5,
-            previousSelection = getSelection(startOffset = 5, endOffset = 4),
-        )
+        val layout =
+            getSingleSelectionLayoutFake(
+                text = "hello",
+                rawStartHandleOffset = 5,
+                rawEndHandleOffset = 5,
+                previousSelection = getSelection(startOffset = 5, endOffset = 4),
+            )
 
         val actualSelection = SelectionAdjustment.Character.adjust(layout)
         val expectedSelection = getSelection(startOffset = 5, endOffset = 4)
@@ -195,12 +208,13 @@
 
     @Test
     fun character_collapsedNotReversed_returnOneUnicodeSelectionNotReversed() {
-        val layout = getSingleSelectionLayoutFake(
-            text = "hi\uD83D\uDE00",
-            rawStartHandleOffset = 2,
-            rawEndHandleOffset = 2,
-            previousSelection = getSelection(startOffset = 2, endOffset = 4),
-        )
+        val layout =
+            getSingleSelectionLayoutFake(
+                text = "hi\uD83D\uDE00",
+                rawStartHandleOffset = 2,
+                rawEndHandleOffset = 2,
+                previousSelection = getSelection(startOffset = 2, endOffset = 4),
+            )
 
         val actualSelection = SelectionAdjustment.Character.adjust(layout)
         val expectedSelection = getSelection(startOffset = 2, endOffset = 4)
@@ -209,12 +223,13 @@
 
     @Test
     fun character_collapsedReversed_returnOneUnicodeSelectionReversed() {
-        val layout = getSingleSelectionLayoutFake(
-            text = "hi\uD83D\uDE00",
-            rawStartHandleOffset = 4,
-            rawEndHandleOffset = 4,
-            previousSelection = getSelection(startOffset = 4, endOffset = 2),
-        )
+        val layout =
+            getSingleSelectionLayoutFake(
+                text = "hi\uD83D\uDE00",
+                rawStartHandleOffset = 4,
+                rawEndHandleOffset = 4,
+                previousSelection = getSelection(startOffset = 4, endOffset = 2),
+            )
 
         val actualSelection = SelectionAdjustment.Character.adjust(layout)
         val expectedSelection = getSelection(startOffset = 4, endOffset = 2)
@@ -225,12 +240,13 @@
     fun character_collapsedNotReversed_returnOneEmojiSelectionNotReversed() {
         // After the adjustment, the unicode sequence representing the keycap # emoji should be
         // selected instead of a single character/unicode that is only part of the emoji.
-        val layout = getSingleSelectionLayoutFake(
-            text = "#️⃣sharp",
-            rawStartHandleOffset = 0,
-            rawEndHandleOffset = 0,
-            previousSelection = getSelection(startOffset = 0, endOffset = 3),
-        )
+        val layout =
+            getSingleSelectionLayoutFake(
+                text = "#️⃣sharp",
+                rawStartHandleOffset = 0,
+                rawEndHandleOffset = 0,
+                previousSelection = getSelection(startOffset = 0, endOffset = 3),
+            )
 
         val actualSelection = SelectionAdjustment.Character.adjust(layout)
         val expectedSelection = getSelection(startOffset = 0, endOffset = 3)
@@ -239,12 +255,13 @@
 
     @Test
     fun character_collapsedReversed_returnOneEmojiSelectionReversed() {
-        val layout = getSingleSelectionLayoutFake(
-            text = "#️⃣sharp",
-            rawStartHandleOffset = 3,
-            rawEndHandleOffset = 3,
-            previousSelection = getSelection(startOffset = 3, endOffset = 0),
-        )
+        val layout =
+            getSingleSelectionLayoutFake(
+                text = "#️⃣sharp",
+                rawStartHandleOffset = 3,
+                rawEndHandleOffset = 3,
+                previousSelection = getSelection(startOffset = 3, endOffset = 0),
+            )
 
         val actualSelection = SelectionAdjustment.Character.adjust(layout)
         val expectedSelection = getSelection(startOffset = 3, endOffset = 0)
@@ -253,111 +270,117 @@
 
     @Test
     fun character_collapsedException_multiText_twoTexts() {
-        val layout = getSelectionLayoutFake(
-            infos = listOf(
-                // selection starts at the end of the first text...
-                getSelectableInfoFake(
-                    selectableId = 1L,
-                    slot = 1,
-                    text = "hello",
-                    rawStartHandleOffset = 5,
-                    rawEndHandleOffset = 5,
-                ),
-                // and ends at the beginning of the second text...
-                getSelectableInfoFake(
-                    selectableId = 2L,
-                    slot = 3,
-                    text = "hello",
-                    rawStartHandleOffset = 0,
-                    rawEndHandleOffset = 0,
-                ),
-                // so the entire selection covers 0 characters, and thus is collapsed
-            ),
-            currentInfoIndex = 0,
-            startSlot = 1,
-            endSlot = 3,
-            previousSelection = getSelection(
+        val layout =
+            getSelectionLayoutFake(
+                infos =
+                    listOf(
+                        // selection starts at the end of the first text...
+                        getSelectableInfoFake(
+                            selectableId = 1L,
+                            slot = 1,
+                            text = "hello",
+                            rawStartHandleOffset = 5,
+                            rawEndHandleOffset = 5,
+                        ),
+                        // and ends at the beginning of the second text...
+                        getSelectableInfoFake(
+                            selectableId = 2L,
+                            slot = 3,
+                            text = "hello",
+                            rawStartHandleOffset = 0,
+                            rawEndHandleOffset = 0,
+                        ),
+                        // so the entire selection covers 0 characters, and thus is collapsed
+                    ),
+                currentInfoIndex = 0,
+                startSlot = 1,
+                endSlot = 3,
+                previousSelection =
+                    getSelection(
+                        startSelectableId = 1L,
+                        startOffset = 5,
+                        endSelectableId = 2L,
+                        endOffset = 1
+                    )
+            )
+
+        val actualSelection = SelectionAdjustment.Character.adjust(layout)
+        val expectedSelection =
+            getSelection(
                 startSelectableId = 1L,
                 startOffset = 5,
                 endSelectableId = 2L,
-                endOffset = 1
+                endOffset = 0
             )
-        )
-
-        val actualSelection = SelectionAdjustment.Character.adjust(layout)
-        val expectedSelection = getSelection(
-            startSelectableId = 1L,
-            startOffset = 5,
-            endSelectableId = 2L,
-            endOffset = 0
-        )
         assertThat(actualSelection).isEqualTo(expectedSelection)
     }
 
     @Test
     fun character_collapsedException_multiText_threeTexts() {
-        val layout = getSelectionLayoutFake(
-            infos = listOf(
-                // selection starts at the end of the first text...
-                getSelectableInfoFake(
-                    selectableId = 1L,
-                    slot = 1,
-                    text = "hello",
-                    rawStartHandleOffset = 5,
-                    rawEndHandleOffset = 5,
-                ),
-                // continues through the second empty text...
-                getSelectableInfoFake(
-                    selectableId = 2L,
-                    slot = 3,
-                    text = "",
-                    rawStartHandleOffset = 0,
-                    rawEndHandleOffset = 0,
-                ),
-                // and ends at the beginning of the third text...
-                getSelectableInfoFake(
-                    selectableId = 3L,
-                    slot = 5,
-                    text = "hello",
-                    rawStartHandleOffset = 0,
-                    rawEndHandleOffset = 0,
-                ),
-                // so the entire selection covers 0 characters, and thus is collapsed
-            ),
-            currentInfoIndex = 0,
-            startSlot = 1,
-            endSlot = 5,
-            previousSelection = getSelection(
+        val layout =
+            getSelectionLayoutFake(
+                infos =
+                    listOf(
+                        // selection starts at the end of the first text...
+                        getSelectableInfoFake(
+                            selectableId = 1L,
+                            slot = 1,
+                            text = "hello",
+                            rawStartHandleOffset = 5,
+                            rawEndHandleOffset = 5,
+                        ),
+                        // continues through the second empty text...
+                        getSelectableInfoFake(
+                            selectableId = 2L,
+                            slot = 3,
+                            text = "",
+                            rawStartHandleOffset = 0,
+                            rawEndHandleOffset = 0,
+                        ),
+                        // and ends at the beginning of the third text...
+                        getSelectableInfoFake(
+                            selectableId = 3L,
+                            slot = 5,
+                            text = "hello",
+                            rawStartHandleOffset = 0,
+                            rawEndHandleOffset = 0,
+                        ),
+                        // so the entire selection covers 0 characters, and thus is collapsed
+                    ),
+                currentInfoIndex = 0,
+                startSlot = 1,
+                endSlot = 5,
+                previousSelection =
+                    getSelection(
+                        startSelectableId = 1L,
+                        startOffset = 5,
+                        endSelectableId = 3L,
+                        endOffset = 1
+                    )
+            )
+
+        val actualSelection = SelectionAdjustment.Character.adjust(layout)
+        val expectedSelection =
+            getSelection(
                 startSelectableId = 1L,
                 startOffset = 5,
                 endSelectableId = 3L,
-                endOffset = 1
+                endOffset = 0
             )
-        )
-
-        val actualSelection = SelectionAdjustment.Character.adjust(layout)
-        val expectedSelection = getSelection(
-            startSelectableId = 1L,
-            startOffset = 5,
-            endSelectableId = 3L,
-            endOffset = 0
-        )
         assertThat(actualSelection).isEqualTo(expectedSelection)
     }
 
     @Test
     fun character_collapsedException_previousIsNull() {
-        val selection = getSelection(
-            startOffset = 0,
-            endOffset = 0
-        )
+        val selection = getSelection(startOffset = 0, endOffset = 0)
 
-        val layout = getSingleSelectionLayoutFake(
-            rawStartHandleOffset = 0,
-            rawEndHandleOffset = 0,
-            rawPreviousHandleOffset = 0,
-            previousSelection = null
-        )
+        val layout =
+            getSingleSelectionLayoutFake(
+                rawStartHandleOffset = 0,
+                rawEndHandleOffset = 0,
+                rawPreviousHandleOffset = 0,
+                previousSelection = null
+            )
 
         val actualSelection = SelectionAdjustment.Character.adjust(layout)
         assertThat(actualSelection).isEqualTo(selection)
@@ -365,28 +388,27 @@
 
     @Test
     fun character_collapsedException_emptyText() {
-        val layout = getSingleSelectionLayoutFake(
-            text = "",
-            rawStartHandleOffset = 0,
-            rawEndHandleOffset = 0,
-        )
+        val layout =
+            getSingleSelectionLayoutFake(
+                text = "",
+                rawStartHandleOffset = 0,
+                rawEndHandleOffset = 0,
+            )
 
         val actualSelection = SelectionAdjustment.Character.adjust(layout)
-        val expectedSelection = getSelection(
-            startOffset = 0,
-            endOffset = 0
-        )
+        val expectedSelection = getSelection(startOffset = 0, endOffset = 0)
         assertThat(actualSelection).isEqualTo(expectedSelection)
     }
 
     @Test
     fun word_collapsed() {
-        val layout = getSingleSelectionLayoutFake(
-            text = "hello world",
-            rawStartHandleOffset = 1,
-            rawEndHandleOffset = 1,
-            wordBoundaries = listOf(TextRange(0, 5), TextRange(6, 11))
-        )
+        val layout =
+            getSingleSelectionLayoutFake(
+                text = "hello world",
+                rawStartHandleOffset = 1,
+                rawEndHandleOffset = 1,
+                wordBoundaries = listOf(TextRange(0, 5), TextRange(6, 11))
+            )
 
         val actualSelection = SelectionAdjustment.Word.adjust(layout)
         val expectedSelection = getSelection(startOffset = 0, endOffset = 5)
@@ -395,12 +417,13 @@
 
     @Test
     fun word_collapsed_onStartBoundary() {
-        val layout = getSingleSelectionLayoutFake(
-            text = "hello world",
-            rawStartHandleOffset = 6,
-            rawEndHandleOffset = 6,
-            wordBoundaries = listOf(TextRange(0, 5), TextRange(6, 11))
-        )
+        val layout =
+            getSingleSelectionLayoutFake(
+                text = "hello world",
+                rawStartHandleOffset = 6,
+                rawEndHandleOffset = 6,
+                wordBoundaries = listOf(TextRange(0, 5), TextRange(6, 11))
+            )
 
         val actualSelection = SelectionAdjustment.Word.adjust(layout)
         val expectedSelection = getSelection(startOffset = 6, endOffset = 11)
@@ -409,12 +432,13 @@
 
     @Test
     fun word_collapsed_onEndBoundary() {
-        val layout = getSingleSelectionLayoutFake(
-            text = "hello world",
-            rawStartHandleOffset = 5,
-            rawEndHandleOffset = 5,
-            wordBoundaries = listOf(TextRange(0, 5), TextRange(6, 11))
-        )
+        val layout =
+            getSingleSelectionLayoutFake(
+                text = "hello world",
+                rawStartHandleOffset = 5,
+                rawEndHandleOffset = 5,
+                wordBoundaries = listOf(TextRange(0, 5), TextRange(6, 11))
+            )
 
         val actualSelection = SelectionAdjustment.Word.adjust(layout)
         val expectedSelection = getSelection(startOffset = 0, endOffset = 5)
@@ -423,12 +447,13 @@
 
     @Test
     fun word_collapsed_zero() {
-        val layout = getSingleSelectionLayoutFake(
-            text = "hello world",
-            rawStartHandleOffset = 0,
-            rawEndHandleOffset = 0,
-            wordBoundaries = listOf(TextRange(0, 5), TextRange(6, 11))
-        )
+        val layout =
+            getSingleSelectionLayoutFake(
+                text = "hello world",
+                rawStartHandleOffset = 0,
+                rawEndHandleOffset = 0,
+                wordBoundaries = listOf(TextRange(0, 5), TextRange(6, 11))
+            )
 
         val actualSelection = SelectionAdjustment.Word.adjust(layout)
         val expectedSelection = getSelection(startOffset = 0, endOffset = 5)
@@ -438,12 +463,13 @@
     @Test
     fun word_collapsed_lastIndex() {
         val text = "hello world"
-        val layout = getSingleSelectionLayoutFake(
-            text = text,
-            rawStartHandleOffset = text.lastIndex,
-            rawEndHandleOffset = text.lastIndex,
-            wordBoundaries = listOf(TextRange(0, 5), TextRange(6, 11))
-        )
+        val layout =
+            getSingleSelectionLayoutFake(
+                text = text,
+                rawStartHandleOffset = text.lastIndex,
+                rawEndHandleOffset = text.lastIndex,
+                wordBoundaries = listOf(TextRange(0, 5), TextRange(6, 11))
+            )
 
         val actualSelection = SelectionAdjustment.Word.adjust(layout)
         val expectedSelection = getSelection(startOffset = 6, endOffset = 11)
@@ -453,12 +479,13 @@
     @Test
     fun word_collapsed_textLength() {
         val text = "hello world"
-        val layout = getSingleSelectionLayoutFake(
-            text = text,
-            rawStartHandleOffset = text.length,
-            rawEndHandleOffset = text.length,
-            wordBoundaries = listOf(TextRange(0, 5), TextRange(6, 11))
-        )
+        val layout =
+            getSingleSelectionLayoutFake(
+                text = text,
+                rawStartHandleOffset = text.length,
+                rawEndHandleOffset = text.length,
+                wordBoundaries = listOf(TextRange(0, 5), TextRange(6, 11))
+            )
 
         val actualSelection = SelectionAdjustment.Word.adjust(layout)
         val expectedSelection = getSelection(startOffset = 6, endOffset = 11)
@@ -467,12 +494,13 @@
 
     @Test
     fun word_collapsed_emptyString() {
-        val layout = getSingleSelectionLayoutFake(
-            text = "",
-            rawStartHandleOffset = 0,
-            rawEndHandleOffset = 0,
-            wordBoundaries = listOf(TextRange(0, 0))
-        )
+        val layout =
+            getSingleSelectionLayoutFake(
+                text = "",
+                rawStartHandleOffset = 0,
+                rawEndHandleOffset = 0,
+                wordBoundaries = listOf(TextRange(0, 0))
+            )
 
         val actualSelection = SelectionAdjustment.Word.adjust(layout)
         val expectedSelection = getSelection(startOffset = 0, endOffset = 0)
@@ -481,12 +509,13 @@
 
     @Test
     fun word_notReversed() {
-        val layout = getSingleSelectionLayoutFake(
-            text = "hello world",
-            rawStartHandleOffset = 1,
-            rawEndHandleOffset = 2,
-            wordBoundaries = listOf(TextRange(0, 5), TextRange(6, 11))
-        )
+        val layout =
+            getSingleSelectionLayoutFake(
+                text = "hello world",
+                rawStartHandleOffset = 1,
+                rawEndHandleOffset = 2,
+                wordBoundaries = listOf(TextRange(0, 5), TextRange(6, 11))
+            )
 
         val actualSelection = SelectionAdjustment.Word.adjust(layout)
         val expectedSelection = getSelection(startOffset = 0, endOffset = 5)
@@ -495,12 +524,13 @@
 
     @Test
     fun word_reversed() {
-        val layout = getSingleSelectionLayoutFake(
-            text = "hello world",
-            rawStartHandleOffset = 2,
-            rawEndHandleOffset = 1,
-            wordBoundaries = listOf(TextRange(0, 5), TextRange(6, 11))
-        )
+        val layout =
+            getSingleSelectionLayoutFake(
+                text = "hello world",
+                rawStartHandleOffset = 2,
+                rawEndHandleOffset = 1,
+                wordBoundaries = listOf(TextRange(0, 5), TextRange(6, 11))
+            )
 
         val actualSelection = SelectionAdjustment.Word.adjust(layout)
         val expectedSelection = getSelection(startOffset = 5, endOffset = 0)
@@ -509,17 +539,14 @@
 
     @Test
     fun word_crossWords() {
-        val layout = getSingleSelectionLayoutFake(
-            text = "hello world hello world",
-            rawStartHandleOffset = 4,
-            rawEndHandleOffset = 7,
-            wordBoundaries = listOf(
-                TextRange(0, 5),
-                TextRange(6, 11),
-                TextRange(12, 17),
-                TextRange(18, 23)
+        val layout =
+            getSingleSelectionLayoutFake(
+                text = "hello world hello world",
+                rawStartHandleOffset = 4,
+                rawEndHandleOffset = 7,
+                wordBoundaries =
+                    listOf(TextRange(0, 5), TextRange(6, 11), TextRange(12, 17), TextRange(18, 23))
             )
-        )
 
         val actualSelection = SelectionAdjustment.Word.adjust(layout)
         val expectedSelection = getSelection(startOffset = 0, endOffset = 11)
@@ -528,17 +555,14 @@
 
     @Test
     fun word_crossWords_reversed() {
-        val layout = getSingleSelectionLayoutFake(
-            text = "hello world hello world",
-            rawStartHandleOffset = 7,
-            rawEndHandleOffset = 4,
-            wordBoundaries = listOf(
-                TextRange(0, 5),
-                TextRange(6, 11),
-                TextRange(12, 17),
-                TextRange(18, 23)
+        val layout =
+            getSingleSelectionLayoutFake(
+                text = "hello world hello world",
+                rawStartHandleOffset = 7,
+                rawEndHandleOffset = 4,
+                wordBoundaries =
+                    listOf(TextRange(0, 5), TextRange(6, 11), TextRange(12, 17), TextRange(18, 23))
             )
-        )
 
         val actualSelection = SelectionAdjustment.Word.adjust(layout)
         val expectedSelection = getSelection(startOffset = 11, endOffset = 0)
@@ -547,96 +571,107 @@
 
     @Test
     fun word_multiText() {
-        val layout = getSelectionLayoutFake(
-            infos = listOf(
-                getSelectableInfoFake(
-                    selectableId = 1L,
-                    slot = 1,
-                    text = "hello world",
-                    rawStartHandleOffset = 8,
-                    rawEndHandleOffset = 11,
-                    wordBoundaries = listOf(
-                        TextRange(0, 5),
-                        TextRange(6, 11),
-                    )
-                ),
-                getSelectableInfoFake(
-                    selectableId = 2L,
-                    slot = 3,
-                    text = "hello world",
-                    rawStartHandleOffset = 0,
-                    rawEndHandleOffset = 3,
-                    wordBoundaries = listOf(
-                        TextRange(0, 5),
-                        TextRange(6, 11),
-                    )
-                ),
-            ),
-            currentInfoIndex = 0,
-            startSlot = 1,
-            endSlot = 3,
-        )
+        val layout =
+            getSelectionLayoutFake(
+                infos =
+                    listOf(
+                        getSelectableInfoFake(
+                            selectableId = 1L,
+                            slot = 1,
+                            text = "hello world",
+                            rawStartHandleOffset = 8,
+                            rawEndHandleOffset = 11,
+                            wordBoundaries =
+                                listOf(
+                                    TextRange(0, 5),
+                                    TextRange(6, 11),
+                                )
+                        ),
+                        getSelectableInfoFake(
+                            selectableId = 2L,
+                            slot = 3,
+                            text = "hello world",
+                            rawStartHandleOffset = 0,
+                            rawEndHandleOffset = 3,
+                            wordBoundaries =
+                                listOf(
+                                    TextRange(0, 5),
+                                    TextRange(6, 11),
+                                )
+                        ),
+                    ),
+                currentInfoIndex = 0,
+                startSlot = 1,
+                endSlot = 3,
+            )
 
         val actualSelection = SelectionAdjustment.Word.adjust(layout)
-        val expectedSelection = getSelection(
-            startSelectableId = 1L,
-            startOffset = 6,
-            endSelectableId = 2L,
-            endOffset = 5,
-        )
+        val expectedSelection =
+            getSelection(
+                startSelectableId = 1L,
+                startOffset = 6,
+                endSelectableId = 2L,
+                endOffset = 5,
+            )
         assertThat(actualSelection).isEqualTo(expectedSelection)
     }
 
     @Test
     fun word_multiText_reversed() {
-        val layout = getSelectionLayoutFake(
-            infos = listOf(
-                getSelectableInfoFake(
-                    selectableId = 1L,
-                    slot = 1,
-                    text = "hello world",
-                    rawStartHandleOffset = 11,
-                    rawEndHandleOffset = 8,
-                    wordBoundaries = listOf(
-                        TextRange(0, 5),
-                        TextRange(6, 11),
-                    )
-                ),
-                getSelectableInfoFake(
-                    selectableId = 2L,
-                    slot = 3,
-                    text = "hello world",
-                    rawStartHandleOffset = 3,
-                    rawEndHandleOffset = 0,
-                    wordBoundaries = listOf(
-                        TextRange(0, 5),
-                        TextRange(6, 11),
-                    )
-                ),
-            ),
-            currentInfoIndex = 0,
-            startSlot = 3,
-            endSlot = 1,
-        )
+        val layout =
+            getSelectionLayoutFake(
+                infos =
+                    listOf(
+                        getSelectableInfoFake(
+                            selectableId = 1L,
+                            slot = 1,
+                            text = "hello world",
+                            rawStartHandleOffset = 11,
+                            rawEndHandleOffset = 8,
+                            wordBoundaries =
+                                listOf(
+                                    TextRange(0, 5),
+                                    TextRange(6, 11),
+                                )
+                        ),
+                        getSelectableInfoFake(
+                            selectableId = 2L,
+                            slot = 3,
+                            text = "hello world",
+                            rawStartHandleOffset = 3,
+                            rawEndHandleOffset = 0,
+                            wordBoundaries =
+                                listOf(
+                                    TextRange(0, 5),
+                                    TextRange(6, 11),
+                                )
+                        ),
+                    ),
+                currentInfoIndex = 0,
+                startSlot = 3,
+                endSlot = 1,
+            )
 
         val actualSelection = SelectionAdjustment.Word.adjust(layout)
-        val expectedSelection = getSelection(
-            startSelectableId = 2L,
-            startOffset = 5,
-            endSelectableId = 1L,
-            endOffset = 6,
-            handlesCrossed = true,
-        )
+        val expectedSelection =
+            getSelection(
+                startSelectableId = 2L,
+                startOffset = 5,
+                endSelectableId = 1L,
+                endOffset = 6,
+                handlesCrossed = true,
+            )
         assertThat(actualSelection).isEqualTo(expectedSelection)
     }
 
     @Test
     fun paragraph_collapsed() {
-        val layout = getSingleSelectionLayoutFake(
-            text = "hello world\nhello world",
-            rawStartHandleOffset = 14,
-            rawEndHandleOffset = 14,
-        )
+        val layout =
+            getSingleSelectionLayoutFake(
+                text = "hello world\nhello world",
+                rawStartHandleOffset = 14,
+                rawEndHandleOffset = 14,
+            )
 
         val actualSelection = SelectionAdjustment.Paragraph.adjust(layout)
         val expectedSelection = getSelection(startOffset = 12, endOffset = 23)
@@ -645,11 +680,12 @@
 
     @Test
     fun paragraph_collapsed_zero() {
-        val layout = getSingleSelectionLayoutFake(
-            text = "hello world\nhello world\nhello world\nhello world",
-            rawStartHandleOffset = 0,
-            rawEndHandleOffset = 0,
-        )
+        val layout =
+            getSingleSelectionLayoutFake(
+                text = "hello world\nhello world\nhello world\nhello world",
+                rawStartHandleOffset = 0,
+                rawEndHandleOffset = 0,
+            )
 
         val actualSelection = SelectionAdjustment.Paragraph.adjust(layout)
         val expectedSelection = getSelection(startOffset = 0, endOffset = 11)
@@ -659,11 +695,12 @@
     @Test
     fun paragraph_collapsed_lastIndex() {
         val text = "hello world\nhello world"
-        val layout = getSingleSelectionLayoutFake(
-            text = text,
-            rawStartHandleOffset = text.lastIndex,
-            rawEndHandleOffset = text.lastIndex,
-        )
+        val layout =
+            getSingleSelectionLayoutFake(
+                text = text,
+                rawStartHandleOffset = text.lastIndex,
+                rawEndHandleOffset = text.lastIndex,
+            )
 
         val actualSelection = SelectionAdjustment.Paragraph.adjust(layout)
         val expectedSelection = getSelection(startOffset = 12, endOffset = 23)
@@ -673,11 +710,12 @@
     @Test
     fun paragraph_collapsed_textLength() {
         val text = "hello world\nhello world"
-        val layout = getSingleSelectionLayoutFake(
-            text = text,
-            rawStartHandleOffset = text.length,
-            rawEndHandleOffset = text.length,
-        )
+        val layout =
+            getSingleSelectionLayoutFake(
+                text = text,
+                rawStartHandleOffset = text.length,
+                rawEndHandleOffset = text.length,
+            )
 
         val actualSelection = SelectionAdjustment.Paragraph.adjust(layout)
         val expectedSelection = getSelection(startOffset = 12, endOffset = 23)
@@ -686,11 +724,12 @@
 
     @Test
     fun paragraph_emptyString() {
-        val layout = getSingleSelectionLayoutFake(
-            text = "",
-            rawStartHandleOffset = 0,
-            rawEndHandleOffset = 0,
-        )
+        val layout =
+            getSingleSelectionLayoutFake(
+                text = "",
+                rawStartHandleOffset = 0,
+                rawEndHandleOffset = 0,
+            )
 
         val actualSelection = SelectionAdjustment.Paragraph.adjust(layout)
         val expectedSelection = getSelection(startOffset = 0, endOffset = 0)
@@ -699,11 +738,12 @@
 
     @Test
     fun paragraph_notReversed() {
-        val layout = getSingleSelectionLayoutFake(
-            text = "hello world\nhello world",
-            rawStartHandleOffset = 1,
-            rawEndHandleOffset = 2,
-        )
+        val layout =
+            getSingleSelectionLayoutFake(
+                text = "hello world\nhello world",
+                rawStartHandleOffset = 1,
+                rawEndHandleOffset = 2,
+            )
 
         val actualSelection = SelectionAdjustment.Paragraph.adjust(layout)
         val expectedSelection = getSelection(startOffset = 0, endOffset = 11)
@@ -712,11 +752,12 @@
 
     @Test
     fun paragraph_reversed() {
-        val layout = getSingleSelectionLayoutFake(
-            text = "hello world\nhello world",
-            rawStartHandleOffset = 2,
-            rawEndHandleOffset = 1,
-        )
+        val layout =
+            getSingleSelectionLayoutFake(
+                text = "hello world\nhello world",
+                rawStartHandleOffset = 2,
+                rawEndHandleOffset = 1,
+            )
 
         val actualSelection = SelectionAdjustment.Paragraph.adjust(layout)
         val expectedSelection = getSelection(startOffset = 11, endOffset = 0)
@@ -725,11 +766,12 @@
 
     @Test
     fun paragraph_crossParagraph() {
-        val layout = getSingleSelectionLayoutFake(
-            text = "hello world\nhello world\nhello world\nhello world",
-            rawStartHandleOffset = 13,
-            rawEndHandleOffset = 26,
-        )
+        val layout =
+            getSingleSelectionLayoutFake(
+                text = "hello world\nhello world\nhello world\nhello world",
+                rawStartHandleOffset = 13,
+                rawEndHandleOffset = 26,
+            )
 
         val actualSelection = SelectionAdjustment.Paragraph.adjust(layout)
         val expectedSelection = getSelection(startOffset = 12, endOffset = 35)
@@ -738,86 +780,89 @@
 
     @Test
     fun paragraph_multiText() {
-        val layout = getSelectionLayoutFake(
-            infos = listOf(
-                getSelectableInfoFake(
-                    selectableId = 1L,
-                    slot = 1,
-                    text = "hello world",
-                    rawStartHandleOffset = 8,
-                    rawEndHandleOffset = 11,
-                ),
-                getSelectableInfoFake(
-                    selectableId = 2L,
-                    slot = 3,
-                    text = "hello world",
-                    rawStartHandleOffset = 0,
-                    rawEndHandleOffset = 3,
-                ),
-            ),
-            currentInfoIndex = 0,
-            startSlot = 1,
-            endSlot = 3,
-        )
+        val layout =
+            getSelectionLayoutFake(
+                infos =
+                    listOf(
+                        getSelectableInfoFake(
+                            selectableId = 1L,
+                            slot = 1,
+                            text = "hello world",
+                            rawStartHandleOffset = 8,
+                            rawEndHandleOffset = 11,
+                        ),
+                        getSelectableInfoFake(
+                            selectableId = 2L,
+                            slot = 3,
+                            text = "hello world",
+                            rawStartHandleOffset = 0,
+                            rawEndHandleOffset = 3,
+                        ),
+                    ),
+                currentInfoIndex = 0,
+                startSlot = 1,
+                endSlot = 3,
+            )
 
         val actualSelection = SelectionAdjustment.Paragraph.adjust(layout)
-        val expectedSelection = getSelection(
-            startSelectableId = 1L,
-            startOffset = 0,
-            endSelectableId = 2L,
-            endOffset = 11,
-        )
+        val expectedSelection =
+            getSelection(
+                startSelectableId = 1L,
+                startOffset = 0,
+                endSelectableId = 2L,
+                endOffset = 11,
+            )
         assertThat(actualSelection).isEqualTo(expectedSelection)
     }
 
     @Test
     fun paragraph_multiText_reversed() {
-        val layout = getSelectionLayoutFake(
-            infos = listOf(
-                getSelectableInfoFake(
-                    selectableId = 1L,
-                    slot = 1,
-                    text = "hello world",
-                    rawStartHandleOffset = 11,
-                    rawEndHandleOffset = 8,
-                ),
-                getSelectableInfoFake(
-                    selectableId = 2L,
-                    slot = 3,
-                    text = "hello world",
-                    rawStartHandleOffset = 3,
-                    rawEndHandleOffset = 0,
-                ),
-            ),
-            currentInfoIndex = 0,
-            startSlot = 3,
-            endSlot = 1,
-        )
+        val layout =
+            getSelectionLayoutFake(
+                infos =
+                    listOf(
+                        getSelectableInfoFake(
+                            selectableId = 1L,
+                            slot = 1,
+                            text = "hello world",
+                            rawStartHandleOffset = 11,
+                            rawEndHandleOffset = 8,
+                        ),
+                        getSelectableInfoFake(
+                            selectableId = 2L,
+                            slot = 3,
+                            text = "hello world",
+                            rawStartHandleOffset = 3,
+                            rawEndHandleOffset = 0,
+                        ),
+                    ),
+                currentInfoIndex = 0,
+                startSlot = 3,
+                endSlot = 1,
+            )
 
         val actualSelection = SelectionAdjustment.Paragraph.adjust(layout)
-        val expectedSelection = getSelection(
-            startSelectableId = 2L,
-            startOffset = 11,
-            endSelectableId = 1L,
-            endOffset = 0,
-            handlesCrossed = true,
-        )
+        val expectedSelection =
+            getSelection(
+                startSelectableId = 2L,
+                startOffset = 11,
+                endSelectableId = 1L,
+                endOffset = 0,
+                handlesCrossed = true,
+            )
         assertThat(actualSelection).isEqualTo(expectedSelection)
     }
 
     @Test
     fun characterWithWordAccelerate_initialSelection() {
-        val layout = getSingleSelectionLayoutFake(
-            text = "hello world hello world",
-            rawStartHandleOffset = 3,
-            rawEndHandleOffset = 3,
-            wordBoundaries = listOf(
-                TextRange(0, 5),
-                TextRange(6, 11),
-                TextRange(12, 17),
-                TextRange(18, 23)
+        val layout =
+            getSingleSelectionLayoutFake(
+                text = "hello world hello world",
+                rawStartHandleOffset = 3,
+                rawEndHandleOffset = 3,
+                wordBoundaries =
+                    listOf(TextRange(0, 5), TextRange(6, 11), TextRange(12, 17), TextRange(18, 23))
             )
-        )
 
         val actualSelection = SelectionAdjustment.CharacterWithWordAccelerate.adjust(layout)
         // initial selection just uses SelectionAdjustment.Word.
@@ -829,20 +874,17 @@
     fun characterWithWordAccelerate_expandEndWithinWord() {
         // The previous selection is [6, 7) and new selection expand the end to 8. This is
         // considered in-word selection. And it will use character-wise selection
-        val layout = getSingleSelectionLayoutFake(
-            text = "hello world hello world",
-            rawStartHandleOffset = 6,
-            rawEndHandleOffset = 8,
-            isStartHandle = false,
-            previousSelection = getSelection(startOffset = 6, endOffset = 7),
-            rawPreviousHandleOffset = 7,
-            wordBoundaries = listOf(
-                TextRange(0, 5),
-                TextRange(6, 11),
-                TextRange(12, 17),
-                TextRange(18, 23)
+        val layout =
+            getSingleSelectionLayoutFake(
+                text = "hello world hello world",
+                rawStartHandleOffset = 6,
+                rawEndHandleOffset = 8,
+                isStartHandle = false,
+                previousSelection = getSelection(startOffset = 6, endOffset = 7),
+                rawPreviousHandleOffset = 7,
+                wordBoundaries =
+                    listOf(TextRange(0, 5), TextRange(6, 11), TextRange(12, 17), TextRange(18, 23))
             )
-        )
 
         val actualSelection = SelectionAdjustment.CharacterWithWordAccelerate.adjust(layout)
         val expectedSelection = getSelection(startOffset = 6, endOffset = 8)
@@ -851,20 +893,17 @@
 
     @Test
     fun characterWithWordAccelerate_expandStartWithinWord_reversed() {
-        val layout = getSingleSelectionLayoutFake(
-            text = "hello world hello world",
-            rawStartHandleOffset = 8,
-            rawEndHandleOffset = 6,
-            isStartHandle = true,
-            previousSelection = getSelection(startOffset = 7, endOffset = 6),
-            rawPreviousHandleOffset = 7,
-            wordBoundaries = listOf(
-                TextRange(0, 5),
-                TextRange(6, 11),
-                TextRange(12, 17),
-                TextRange(18, 23)
+        val layout =
+            getSingleSelectionLayoutFake(
+                text = "hello world hello world",
+                rawStartHandleOffset = 8,
+                rawEndHandleOffset = 6,
+                isStartHandle = true,
+                previousSelection = getSelection(startOffset = 7, endOffset = 6),
+                rawPreviousHandleOffset = 7,
+                wordBoundaries =
+                    listOf(TextRange(0, 5), TextRange(6, 11), TextRange(12, 17), TextRange(18, 23))
             )
-        )
 
         val actualSelection = SelectionAdjustment.CharacterWithWordAccelerate.adjust(layout)
         val expectedSelection = getSelection(startOffset = 8, endOffset = 6)
@@ -875,20 +914,17 @@
     fun characterWithWordAccelerate_expandStartWithinWord() {
         // The previous selection is [7, 11) and new selection expand the start to 8. This is
         // considered in-word selection. And it will use character-wise selection
-        val layout = getSingleSelectionLayoutFake(
-            text = "hello world hello world",
-            rawStartHandleOffset = 8,
-            rawEndHandleOffset = 11,
-            isStartHandle = true,
-            previousSelection = getSelection(startOffset = 7, endOffset = 11),
-            rawPreviousHandleOffset = 7,
-            wordBoundaries = listOf(
-                TextRange(0, 5),
-                TextRange(6, 11),
-                TextRange(12, 17),
-                TextRange(18, 23)
+        val layout =
+            getSingleSelectionLayoutFake(
+                text = "hello world hello world",
+                rawStartHandleOffset = 8,
+                rawEndHandleOffset = 11,
+                isStartHandle = true,
+                previousSelection = getSelection(startOffset = 7, endOffset = 11),
+                rawPreviousHandleOffset = 7,
+                wordBoundaries =
+                    listOf(TextRange(0, 5), TextRange(6, 11), TextRange(12, 17), TextRange(18, 23))
             )
-        )
 
         val actualSelection = SelectionAdjustment.CharacterWithWordAccelerate.adjust(layout)
         val expectedSelection = getSelection(startOffset = 8, endOffset = 11)
@@ -897,20 +933,17 @@
 
     @Test
     fun characterWithWordAccelerate_expandEndWithinWord_reversed() {
-        val layout = getSingleSelectionLayoutFake(
-            text = "hello world hello world",
-            rawStartHandleOffset = 11,
-            rawEndHandleOffset = 8,
-            isStartHandle = false,
-            previousSelection = getSelection(startOffset = 11, endOffset = 7),
-            rawPreviousHandleOffset = 7,
-            wordBoundaries = listOf(
-                TextRange(0, 5),
-                TextRange(6, 11),
-                TextRange(12, 17),
-                TextRange(18, 23)
+        val layout =
+            getSingleSelectionLayoutFake(
+                text = "hello world hello world",
+                rawStartHandleOffset = 11,
+                rawEndHandleOffset = 8,
+                isStartHandle = false,
+                previousSelection = getSelection(startOffset = 11, endOffset = 7),
+                rawPreviousHandleOffset = 7,
+                wordBoundaries =
+                    listOf(TextRange(0, 5), TextRange(6, 11), TextRange(12, 17), TextRange(18, 23))
             )
-        )
 
         val actualSelection = SelectionAdjustment.CharacterWithWordAccelerate.adjust(layout)
         val expectedSelection = getSelection(startOffset = 11, endOffset = 8)
@@ -923,20 +956,17 @@
         // Because the previous selection end is at word boundary, it will use word selection mode.
         // The end did exceed start of the next word(offset = 12), the adjusted
         // selection end will be 17, which is the end of the next word.
-        val layout = getSingleSelectionLayoutFake(
-            text = "hello world hello world",
-            rawStartHandleOffset = 6,
-            rawEndHandleOffset = 12,
-            isStartHandle = false,
-            previousSelection = getSelection(startOffset = 6, endOffset = 11),
-            rawPreviousHandleOffset = 11,
-            wordBoundaries = listOf(
-                TextRange(0, 5),
-                TextRange(6, 11),
-                TextRange(12, 17),
-                TextRange(18, 23)
+        val layout =
+            getSingleSelectionLayoutFake(
+                text = "hello world hello world",
+                rawStartHandleOffset = 6,
+                rawEndHandleOffset = 12,
+                isStartHandle = false,
+                previousSelection = getSelection(startOffset = 6, endOffset = 11),
+                rawPreviousHandleOffset = 11,
+                wordBoundaries =
+                    listOf(TextRange(0, 5), TextRange(6, 11), TextRange(12, 17), TextRange(18, 23))
             )
-        )
 
         val actualSelection = SelectionAdjustment.CharacterWithWordAccelerate.adjust(layout)
         val expectedSelection = getSelection(startOffset = 6, endOffset = 17)
@@ -945,20 +975,17 @@
 
     @Test
     fun characterWithWordAccelerate_expandStartOutOfWord_reversed() {
-        val layout = getSingleSelectionLayoutFake(
-            text = "hello world hello world",
-            rawStartHandleOffset = 13,
-            rawEndHandleOffset = 6,
-            isStartHandle = true,
-            previousSelection = getSelection(startOffset = 11, endOffset = 6),
-            rawPreviousHandleOffset = 11,
-            wordBoundaries = listOf(
-                TextRange(0, 5),
-                TextRange(6, 11),
-                TextRange(12, 17),
-                TextRange(18, 23)
+        val layout =
+            getSingleSelectionLayoutFake(
+                text = "hello world hello world",
+                rawStartHandleOffset = 13,
+                rawEndHandleOffset = 6,
+                isStartHandle = true,
+                previousSelection = getSelection(startOffset = 11, endOffset = 6),
+                rawPreviousHandleOffset = 11,
+                wordBoundaries =
+                    listOf(TextRange(0, 5), TextRange(6, 11), TextRange(12, 17), TextRange(18, 23))
             )
-        )
 
         val actualSelection = SelectionAdjustment.CharacterWithWordAccelerate.adjust(layout)
         val expectedSelection = getSelection(startOffset = 17, endOffset = 6)
@@ -972,20 +999,17 @@
         // it will use word selection mode.
         // The start did exceed the end of the previous word(offset = 5),
         // the adjusted selection end will be 0, which is the start of the previous word.
-        val layout = getSingleSelectionLayoutFake(
-            text = "hello world hello world",
-            rawStartHandleOffset = 5,
-            rawEndHandleOffset = 11,
-            isStartHandle = true,
-            previousSelection = getSelection(startOffset = 6, endOffset = 11),
-            rawPreviousHandleOffset = 6,
-            wordBoundaries = listOf(
-                TextRange(0, 5),
-                TextRange(6, 11),
-                TextRange(12, 17),
-                TextRange(18, 23)
+        val layout =
+            getSingleSelectionLayoutFake(
+                text = "hello world hello world",
+                rawStartHandleOffset = 5,
+                rawEndHandleOffset = 11,
+                isStartHandle = true,
+                previousSelection = getSelection(startOffset = 6, endOffset = 11),
+                rawPreviousHandleOffset = 6,
+                wordBoundaries =
+                    listOf(TextRange(0, 5), TextRange(6, 11), TextRange(12, 17), TextRange(18, 23))
             )
-        )
 
         val actualSelection = SelectionAdjustment.CharacterWithWordAccelerate.adjust(layout)
         val expectedSelection = getSelection(startOffset = 0, endOffset = 11)
@@ -994,20 +1018,17 @@
 
     @Test
     fun characterWithWordAccelerate_expandEndOutOfWord_reversed() {
-        val layout = getSingleSelectionLayoutFake(
-            text = "hello world hello world",
-            rawStartHandleOffset = 11,
-            rawEndHandleOffset = 5,
-            isStartHandle = false,
-            previousSelection = getSelection(startOffset = 11, endOffset = 6),
-            rawPreviousHandleOffset = 6,
-            wordBoundaries = listOf(
-                TextRange(0, 5),
-                TextRange(6, 11),
-                TextRange(12, 17),
-                TextRange(18, 23)
+        val layout =
+            getSingleSelectionLayoutFake(
+                text = "hello world hello world",
+                rawStartHandleOffset = 11,
+                rawEndHandleOffset = 5,
+                isStartHandle = false,
+                previousSelection = getSelection(startOffset = 11, endOffset = 6),
+                rawPreviousHandleOffset = 6,
+                wordBoundaries =
+                    listOf(TextRange(0, 5), TextRange(6, 11), TextRange(12, 17), TextRange(18, 23))
             )
-        )
 
         val actualSelection = SelectionAdjustment.CharacterWithWordAccelerate.adjust(layout)
         val expectedSelection = getSelection(startOffset = 11, endOffset = 0)
@@ -1024,21 +1045,18 @@
         // The previous selection is [3, 4) and new selection expand the end to 8. Because offset
         // 8 is at the next line, it will use word based selection strategy
         // and the end will be adjusted to word end: 11.
-        val layout = getSingleSelectionLayoutFake(
-            text = "hello world hello world",
-            rawStartHandleOffset = 3,
-            rawEndHandleOffset = 7,
-            isStartHandle = false,
-            previousSelection = getSelection(startOffset = 3, endOffset = 4),
-            rawPreviousHandleOffset = 4,
-            wordBoundaries = listOf(
-                TextRange(0, 5),
-                TextRange(6, 11),
-                TextRange(12, 17),
-                TextRange(18, 23)
-            ),
-            lineBreaks = listOf(6, 12, 18)
-        )
+        val layout =
+            getSingleSelectionLayoutFake(
+                text = "hello world hello world",
+                rawStartHandleOffset = 3,
+                rawEndHandleOffset = 7,
+                isStartHandle = false,
+                previousSelection = getSelection(startOffset = 3, endOffset = 4),
+                rawPreviousHandleOffset = 4,
+                wordBoundaries =
+                    listOf(TextRange(0, 5), TextRange(6, 11), TextRange(12, 17), TextRange(18, 23)),
+                lineBreaks = listOf(6, 12, 18)
+            )
 
         val actualSelection = SelectionAdjustment.CharacterWithWordAccelerate.adjust(layout)
         val expectedSelection = getSelection(startOffset = 3, endOffset = 11)
@@ -1047,21 +1065,18 @@
 
     @Test
     fun characterWithWordAccelerate_expandStartToNextLine_reversed() {
-        val layout = getSingleSelectionLayoutFake(
-            text = "hello world hello world",
-            rawStartHandleOffset = 7,
-            rawEndHandleOffset = 3,
-            isStartHandle = true,
-            previousSelection = getSelection(startOffset = 4, endOffset = 3),
-            rawPreviousHandleOffset = 4,
-            wordBoundaries = listOf(
-                TextRange(0, 5),
-                TextRange(6, 11),
-                TextRange(12, 17),
-                TextRange(18, 23)
-            ),
-            lineBreaks = listOf(6, 12, 18)
-        )
+        val layout =
+            getSingleSelectionLayoutFake(
+                text = "hello world hello world",
+                rawStartHandleOffset = 7,
+                rawEndHandleOffset = 3,
+                isStartHandle = true,
+                previousSelection = getSelection(startOffset = 4, endOffset = 3),
+                rawPreviousHandleOffset = 4,
+                wordBoundaries =
+                    listOf(TextRange(0, 5), TextRange(6, 11), TextRange(12, 17), TextRange(18, 23)),
+                lineBreaks = listOf(6, 12, 18)
+            )
 
         val actualSelection = SelectionAdjustment.CharacterWithWordAccelerate.adjust(layout)
         val expectedSelection = getSelection(startOffset = 11, endOffset = 3)
@@ -1078,21 +1093,18 @@
         // The previous selection is [6, 8) and new selection expand the start to 3. Because offset
         // 3 is at the previous line, it will use word based selection strategy.
         // The end will be adjusted to word start: 0.
-        val layout = getSingleSelectionLayoutFake(
-            text = "hello world hello world",
-            rawStartHandleOffset = 4,
-            rawEndHandleOffset = 8,
-            isStartHandle = true,
-            previousSelection = getSelection(startOffset = 7, endOffset = 8),
-            rawPreviousHandleOffset = 7,
-            wordBoundaries = listOf(
-                TextRange(0, 5),
-                TextRange(6, 11),
-                TextRange(12, 17),
-                TextRange(18, 23)
-            ),
-            lineBreaks = listOf(6, 12, 18)
-        )
+        val layout =
+            getSingleSelectionLayoutFake(
+                text = "hello world hello world",
+                rawStartHandleOffset = 4,
+                rawEndHandleOffset = 8,
+                isStartHandle = true,
+                previousSelection = getSelection(startOffset = 7, endOffset = 8),
+                rawPreviousHandleOffset = 7,
+                wordBoundaries =
+                    listOf(TextRange(0, 5), TextRange(6, 11), TextRange(12, 17), TextRange(18, 23)),
+                lineBreaks = listOf(6, 12, 18)
+            )
 
         val actualSelection = SelectionAdjustment.CharacterWithWordAccelerate.adjust(layout)
         val expectedSelection = getSelection(startOffset = 0, endOffset = 8)
@@ -1101,21 +1113,18 @@
 
     @Test
     fun characterWithWordAccelerate_expandEndToNextLine_reversed() {
-        val layout = getSingleSelectionLayoutFake(
-            text = "hello world hello world",
-            rawStartHandleOffset = 8,
-            rawEndHandleOffset = 3,
-            isStartHandle = false,
-            previousSelection = getSelection(startOffset = 8, endOffset = 7),
-            rawPreviousHandleOffset = 7,
-            wordBoundaries = listOf(
-                TextRange(0, 5),
-                TextRange(6, 11),
-                TextRange(12, 17),
-                TextRange(18, 23)
-            ),
-            lineBreaks = listOf(6, 12, 18)
-        )
+        val layout =
+            getSingleSelectionLayoutFake(
+                text = "hello world hello world",
+                rawStartHandleOffset = 8,
+                rawEndHandleOffset = 3,
+                isStartHandle = false,
+                previousSelection = getSelection(startOffset = 8, endOffset = 7),
+                rawPreviousHandleOffset = 7,
+                wordBoundaries =
+                    listOf(TextRange(0, 5), TextRange(6, 11), TextRange(12, 17), TextRange(18, 23)),
+                lineBreaks = listOf(6, 12, 18)
+            )
 
         val actualSelection = SelectionAdjustment.CharacterWithWordAccelerate.adjust(layout)
         val expectedSelection = getSelection(startOffset = 8, endOffset = 0)
@@ -1132,21 +1141,18 @@
         // Because end offset is moving between lines, it will use word based selection. In this
         // case the word "world" crosses 2 lines, so the candidate values for the adjusted end
         // offset are 8(first character of the line) and 11(word end).
-        val layout = getSingleSelectionLayoutFake(
-            text = "hello world hello world",
-            rawStartHandleOffset = 3,
-            rawEndHandleOffset = 9,
-            isStartHandle = false,
-            previousSelection = getSelection(startOffset = 3, endOffset = 7),
-            rawPreviousHandleOffset = 7,
-            wordBoundaries = listOf(
-                TextRange(0, 5),
-                TextRange(6, 11),
-                TextRange(12, 17),
-                TextRange(18, 23)
-            ),
-            lineBreaks = listOf(8, 16)
-        )
+        val layout =
+            getSingleSelectionLayoutFake(
+                text = "hello world hello world",
+                rawStartHandleOffset = 3,
+                rawEndHandleOffset = 9,
+                isStartHandle = false,
+                previousSelection = getSelection(startOffset = 3, endOffset = 7),
+                rawPreviousHandleOffset = 7,
+                wordBoundaries =
+                    listOf(TextRange(0, 5), TextRange(6, 11), TextRange(12, 17), TextRange(18, 23)),
+                lineBreaks = listOf(8, 16)
+            )
 
         val actualSelection = SelectionAdjustment.CharacterWithWordAccelerate.adjust(layout)
         val expectedSelection = getSelection(startOffset = 3, endOffset = 11)
@@ -1155,21 +1161,18 @@
 
     @Test
     fun characterWithWordAccelerate_expandStartToNextLine_withinWord_reversed() {
-        val layout = getSingleSelectionLayoutFake(
-            text = "hello world hello world",
-            rawStartHandleOffset = 9,
-            rawEndHandleOffset = 3,
-            isStartHandle = true,
-            previousSelection = getSelection(startOffset = 7, endOffset = 3),
-            rawPreviousHandleOffset = 7,
-            wordBoundaries = listOf(
-                TextRange(0, 5),
-                TextRange(6, 11),
-                TextRange(12, 17),
-                TextRange(18, 23)
-            ),
-            lineBreaks = listOf(8, 16)
-        )
+        val layout =
+            getSingleSelectionLayoutFake(
+                text = "hello world hello world",
+                rawStartHandleOffset = 9,
+                rawEndHandleOffset = 3,
+                isStartHandle = true,
+                previousSelection = getSelection(startOffset = 7, endOffset = 3),
+                rawPreviousHandleOffset = 7,
+                wordBoundaries =
+                    listOf(TextRange(0, 5), TextRange(6, 11), TextRange(12, 17), TextRange(18, 23)),
+                lineBreaks = listOf(8, 16)
+            )
 
         val actualSelection = SelectionAdjustment.CharacterWithWordAccelerate.adjust(layout)
         val expectedSelection = getSelection(startOffset = 11, endOffset = 3)
@@ -1188,21 +1191,18 @@
         // case the word "hello" crosses 2 lines. The candidate values for the adjusted start
         // offset are 12(word start) and 16(last character of the line). Since we are expanding
         // back, the end offset will be adjusted to the word start at 12.
-        val layout = getSingleSelectionLayoutFake(
-            text = "hello world hello world",
-            rawStartHandleOffset = 15,
-            rawEndHandleOffset = 17,
-            isStartHandle = true,
-            previousSelection = getSelection(startOffset = 16, endOffset = 17),
-            rawPreviousHandleOffset = 16,
-            wordBoundaries = listOf(
-                TextRange(0, 5),
-                TextRange(6, 11),
-                TextRange(12, 17),
-                TextRange(18, 23)
-            ),
-            lineBreaks = listOf(8, 16)
-        )
+        val layout =
+            getSingleSelectionLayoutFake(
+                text = "hello world hello world",
+                rawStartHandleOffset = 15,
+                rawEndHandleOffset = 17,
+                isStartHandle = true,
+                previousSelection = getSelection(startOffset = 16, endOffset = 17),
+                rawPreviousHandleOffset = 16,
+                wordBoundaries =
+                    listOf(TextRange(0, 5), TextRange(6, 11), TextRange(12, 17), TextRange(18, 23)),
+                lineBreaks = listOf(8, 16)
+            )
 
         val actualSelection = SelectionAdjustment.CharacterWithWordAccelerate.adjust(layout)
         val expectedSelection = getSelection(startOffset = 12, endOffset = 17)
@@ -1211,21 +1211,18 @@
 
     @Test
     fun characterWithWordAccelerate_expandEndToNextLine_withinWord_reverse() {
-        val layout = getSingleSelectionLayoutFake(
-            text = "hello world hello world",
-            rawStartHandleOffset = 17,
-            rawEndHandleOffset = 15,
-            isStartHandle = false,
-            previousSelection = getSelection(startOffset = 17, endOffset = 16),
-            rawPreviousHandleOffset = 16,
-            wordBoundaries = listOf(
-                TextRange(0, 5),
-                TextRange(6, 11),
-                TextRange(12, 17),
-                TextRange(18, 23)
-            ),
-            lineBreaks = listOf(8, 16)
-        )
+        val layout =
+            getSingleSelectionLayoutFake(
+                text = "hello world hello world",
+                rawStartHandleOffset = 17,
+                rawEndHandleOffset = 15,
+                isStartHandle = false,
+                previousSelection = getSelection(startOffset = 17, endOffset = 16),
+                rawPreviousHandleOffset = 16,
+                wordBoundaries =
+                    listOf(TextRange(0, 5), TextRange(6, 11), TextRange(12, 17), TextRange(18, 23)),
+                lineBreaks = listOf(8, 16)
+            )
 
         val actualSelection = SelectionAdjustment.CharacterWithWordAccelerate.adjust(layout)
         val expectedSelection = getSelection(startOffset = 17, endOffset = 12)
@@ -1236,20 +1233,17 @@
     fun characterWithWordAccelerate_shrinkEnd() {
         // The previous selection is [0, 11) and new selection shrink the end to 8. In this case
         // it will use character based selection strategy.
-        val layout = getSingleSelectionLayoutFake(
-            text = "hello world hello world",
-            rawStartHandleOffset = 0,
-            rawEndHandleOffset = 8,
-            isStartHandle = false,
-            previousSelection = getSelection(startOffset = 0, endOffset = 11),
-            rawPreviousHandleOffset = 11,
-            wordBoundaries = listOf(
-                TextRange(0, 5),
-                TextRange(6, 11),
-                TextRange(12, 17),
-                TextRange(18, 23)
-            ),
-        )
+        val layout =
+            getSingleSelectionLayoutFake(
+                text = "hello world hello world",
+                rawStartHandleOffset = 0,
+                rawEndHandleOffset = 8,
+                isStartHandle = false,
+                previousSelection = getSelection(startOffset = 0, endOffset = 11),
+                rawPreviousHandleOffset = 11,
+                wordBoundaries =
+                    listOf(TextRange(0, 5), TextRange(6, 11), TextRange(12, 17), TextRange(18, 23)),
+            )
 
         val actualSelection = SelectionAdjustment.CharacterWithWordAccelerate.adjust(layout)
         val expectedSelection = getSelection(startOffset = 0, endOffset = 8)
@@ -1258,20 +1252,17 @@
 
     @Test
     fun characterWithWordAccelerate_shrinkStart_reversed() {
-        val layout = getSingleSelectionLayoutFake(
-            text = "hello world hello world",
-            rawStartHandleOffset = 8,
-            rawEndHandleOffset = 0,
-            isStartHandle = true,
-            previousSelection = getSelection(startOffset = 11, endOffset = 0),
-            rawPreviousHandleOffset = 11,
-            wordBoundaries = listOf(
-                TextRange(0, 5),
-                TextRange(6, 11),
-                TextRange(12, 17),
-                TextRange(18, 23)
-            ),
-        )
+        val layout =
+            getSingleSelectionLayoutFake(
+                text = "hello world hello world",
+                rawStartHandleOffset = 8,
+                rawEndHandleOffset = 0,
+                isStartHandle = true,
+                previousSelection = getSelection(startOffset = 11, endOffset = 0),
+                rawPreviousHandleOffset = 11,
+                wordBoundaries =
+                    listOf(TextRange(0, 5), TextRange(6, 11), TextRange(12, 17), TextRange(18, 23)),
+            )
 
         val actualSelection = SelectionAdjustment.CharacterWithWordAccelerate.adjust(layout)
         val expectedSelection = getSelection(startOffset = 8, endOffset = 0)
@@ -1282,20 +1273,17 @@
     fun characterWithWordAccelerate_shrinkStart() {
         // The previous selection is [0, 8) and new selection shrink the start to 2. In this case
         // it will use character based selection strategy.
-        val layout = getSingleSelectionLayoutFake(
-            text = "hello world hello world",
-            rawStartHandleOffset = 2,
-            rawEndHandleOffset = 8,
-            isStartHandle = true,
-            previousSelection = getSelection(startOffset = 0, endOffset = 8),
-            rawPreviousHandleOffset = 0,
-            wordBoundaries = listOf(
-                TextRange(0, 5),
-                TextRange(6, 11),
-                TextRange(12, 17),
-                TextRange(18, 23)
-            ),
-        )
+        val layout =
+            getSingleSelectionLayoutFake(
+                text = "hello world hello world",
+                rawStartHandleOffset = 2,
+                rawEndHandleOffset = 8,
+                isStartHandle = true,
+                previousSelection = getSelection(startOffset = 0, endOffset = 8),
+                rawPreviousHandleOffset = 0,
+                wordBoundaries =
+                    listOf(TextRange(0, 5), TextRange(6, 11), TextRange(12, 17), TextRange(18, 23)),
+            )
 
         val actualSelection = SelectionAdjustment.CharacterWithWordAccelerate.adjust(layout)
         val expectedSelection = getSelection(startOffset = 2, endOffset = 8)
@@ -1304,20 +1292,17 @@
 
     @Test
     fun characterWithWordAccelerate_shrinkEnd_reversed() {
-        val layout = getSingleSelectionLayoutFake(
-            text = "hello world hello world",
-            rawStartHandleOffset = 8,
-            rawEndHandleOffset = 2,
-            isStartHandle = false,
-            previousSelection = getSelection(startOffset = 8, endOffset = 0),
-            rawPreviousHandleOffset = 0,
-            wordBoundaries = listOf(
-                TextRange(0, 5),
-                TextRange(6, 11),
-                TextRange(12, 17),
-                TextRange(18, 23)
-            ),
-        )
+        val layout =
+            getSingleSelectionLayoutFake(
+                text = "hello world hello world",
+                rawStartHandleOffset = 8,
+                rawEndHandleOffset = 2,
+                isStartHandle = false,
+                previousSelection = getSelection(startOffset = 8, endOffset = 0),
+                rawPreviousHandleOffset = 0,
+                wordBoundaries =
+                    listOf(TextRange(0, 5), TextRange(6, 11), TextRange(12, 17), TextRange(18, 23)),
+            )
 
         val actualSelection = SelectionAdjustment.CharacterWithWordAccelerate.adjust(layout)
         val expectedSelection = getSelection(startOffset = 8, endOffset = 2)
@@ -1334,21 +1319,18 @@
         // The previous selection is [2, 8) and new selection shrink the end to 4. Because offset
         // 4 is at the previous line, it will use word based selection strategy. And the end will
         // be snap to 5.
-        val layout = getSingleSelectionLayoutFake(
-            text = "hello world hello world",
-            rawStartHandleOffset = 2,
-            rawEndHandleOffset = 4,
-            isStartHandle = false,
-            previousSelection = getSelection(startOffset = 2, endOffset = 8),
-            rawPreviousHandleOffset = 8,
-            wordBoundaries = listOf(
-                TextRange(0, 5),
-                TextRange(6, 11),
-                TextRange(12, 17),
-                TextRange(18, 23)
-            ),
-            lineBreaks = listOf(6, 12, 18)
-        )
+        val layout =
+            getSingleSelectionLayoutFake(
+                text = "hello world hello world",
+                rawStartHandleOffset = 2,
+                rawEndHandleOffset = 4,
+                isStartHandle = false,
+                previousSelection = getSelection(startOffset = 2, endOffset = 8),
+                rawPreviousHandleOffset = 8,
+                wordBoundaries =
+                    listOf(TextRange(0, 5), TextRange(6, 11), TextRange(12, 17), TextRange(18, 23)),
+                lineBreaks = listOf(6, 12, 18)
+            )
 
         val actualSelection = SelectionAdjustment.CharacterWithWordAccelerate.adjust(layout)
         val expectedSelection = getSelection(startOffset = 2, endOffset = 5)
@@ -1357,21 +1339,18 @@
 
     @Test
     fun characterWithWordAccelerate_shrinkStartToPrevLine_reversed() {
-        val layout = getSingleSelectionLayoutFake(
-            text = "hello world hello world",
-            rawStartHandleOffset = 4,
-            rawEndHandleOffset = 2,
-            isStartHandle = true,
-            previousSelection = getSelection(startOffset = 8, endOffset = 2),
-            rawPreviousHandleOffset = 8,
-            wordBoundaries = listOf(
-                TextRange(0, 5),
-                TextRange(6, 11),
-                TextRange(12, 17),
-                TextRange(18, 23)
-            ),
-            lineBreaks = listOf(6, 12, 18)
-        )
+        val layout =
+            getSingleSelectionLayoutFake(
+                text = "hello world hello world",
+                rawStartHandleOffset = 4,
+                rawEndHandleOffset = 2,
+                isStartHandle = true,
+                previousSelection = getSelection(startOffset = 8, endOffset = 2),
+                rawPreviousHandleOffset = 8,
+                wordBoundaries =
+                    listOf(TextRange(0, 5), TextRange(6, 11), TextRange(12, 17), TextRange(18, 23)),
+                lineBreaks = listOf(6, 12, 18)
+            )
 
         val actualSelection = SelectionAdjustment.CharacterWithWordAccelerate.adjust(layout)
         val expectedSelection = getSelection(startOffset = 5, endOffset = 2)
@@ -1388,21 +1367,18 @@
         // The previous selection is [2, 8) and new selection shrink the end to 7. Because offset
         // 7 is at the next line, it will use word based selection strategy. And the start will
         // be snap to 6.
-        val layout = getSingleSelectionLayoutFake(
-            text = "hello world hello world",
-            rawStartHandleOffset = 7,
-            rawEndHandleOffset = 8,
-            isStartHandle = true,
-            previousSelection = getSelection(startOffset = 2, endOffset = 8),
-            rawPreviousHandleOffset = 2,
-            wordBoundaries = listOf(
-                TextRange(0, 5),
-                TextRange(6, 11),
-                TextRange(12, 17),
-                TextRange(18, 23)
-            ),
-            lineBreaks = listOf(6, 12, 18)
-        )
+        val layout =
+            getSingleSelectionLayoutFake(
+                text = "hello world hello world",
+                rawStartHandleOffset = 7,
+                rawEndHandleOffset = 8,
+                isStartHandle = true,
+                previousSelection = getSelection(startOffset = 2, endOffset = 8),
+                rawPreviousHandleOffset = 2,
+                wordBoundaries =
+                    listOf(TextRange(0, 5), TextRange(6, 11), TextRange(12, 17), TextRange(18, 23)),
+                lineBreaks = listOf(6, 12, 18)
+            )
 
         val actualSelection = SelectionAdjustment.CharacterWithWordAccelerate.adjust(layout)
         val expectedSelection = getSelection(startOffset = 6, endOffset = 8)
@@ -1411,21 +1387,18 @@
 
     @Test
     fun characterWithWordAccelerate_shrinkEndToNextLine_reversed() {
-        val layout = getSingleSelectionLayoutFake(
-            text = "hello world hello world",
-            rawStartHandleOffset = 8,
-            rawEndHandleOffset = 7,
-            isStartHandle = false,
-            previousSelection = getSelection(startOffset = 8, endOffset = 2),
-            rawPreviousHandleOffset = 2,
-            wordBoundaries = listOf(
-                TextRange(0, 5),
-                TextRange(6, 11),
-                TextRange(12, 17),
-                TextRange(18, 23)
-            ),
-            lineBreaks = listOf(6, 12, 18)
-        )
+        val layout =
+            getSingleSelectionLayoutFake(
+                text = "hello world hello world",
+                rawStartHandleOffset = 8,
+                rawEndHandleOffset = 7,
+                isStartHandle = false,
+                previousSelection = getSelection(startOffset = 8, endOffset = 2),
+                rawPreviousHandleOffset = 2,
+                wordBoundaries =
+                    listOf(TextRange(0, 5), TextRange(6, 11), TextRange(12, 17), TextRange(18, 23)),
+                lineBreaks = listOf(6, 12, 18)
+            )
 
         val actualSelection = SelectionAdjustment.CharacterWithWordAccelerate.adjust(layout)
         val expectedSelection = getSelection(startOffset = 8, endOffset = 6)
@@ -1446,21 +1419,18 @@
         // However, in this specific case the selection start offset is already 6,
         // adjusting the end to 6 will result in a collapsed selection [6, 6). So, it should
         // move the end offset to the other word boundary which is 11 instead.
-        val layout = getSingleSelectionLayoutFake(
-            text = "hello world hello world",
-            rawStartHandleOffset = 6,
-            rawEndHandleOffset = 7,
-            isStartHandle = false,
-            previousSelection = getSelection(startOffset = 6, endOffset = 15),
-            rawPreviousHandleOffset = 15,
-            wordBoundaries = listOf(
-                TextRange(0, 5),
-                TextRange(6, 11),
-                TextRange(12, 17),
-                TextRange(18, 23)
-            ),
-            lineBreaks = listOf(6, 12, 18)
-        )
+        val layout =
+            getSingleSelectionLayoutFake(
+                text = "hello world hello world",
+                rawStartHandleOffset = 6,
+                rawEndHandleOffset = 7,
+                isStartHandle = false,
+                previousSelection = getSelection(startOffset = 6, endOffset = 15),
+                rawPreviousHandleOffset = 15,
+                wordBoundaries =
+                    listOf(TextRange(0, 5), TextRange(6, 11), TextRange(12, 17), TextRange(18, 23)),
+                lineBreaks = listOf(6, 12, 18)
+            )
 
         val actualSelection = SelectionAdjustment.CharacterWithWordAccelerate.adjust(layout)
         val expectedSelection = getSelection(startOffset = 6, endOffset = 11)
@@ -1469,28 +1439,31 @@
 
     @Test
     fun characterWithWordAccelerate_betweenSlots_usesCurrentIndex() {
-        val layout = getSelectionLayoutFake(
-            infos = listOf(
-                getSelectableInfoFake(
-                    text = "hello\nhello\nhello",
-                    selectableId = 1L,
-                    slot = 1,
-                    rawStartHandleOffset = 8,
-                    rawEndHandleOffset = 11,
-                    lineBreaks = listOf(6, 12),
-                    rawPreviousHandleOffset = 6,
-                    wordBoundaries = listOf(
-                        TextRange(0, 5),
-                        TextRange(6, 11),
-                        TextRange(12, 17),
+        val layout =
+            getSelectionLayoutFake(
+                infos =
+                    listOf(
+                        getSelectableInfoFake(
+                            text = "hello\nhello\nhello",
+                            selectableId = 1L,
+                            slot = 1,
+                            rawStartHandleOffset = 8,
+                            rawEndHandleOffset = 11,
+                            lineBreaks = listOf(6, 12),
+                            rawPreviousHandleOffset = 6,
+                            wordBoundaries =
+                                listOf(
+                                    TextRange(0, 5),
+                                    TextRange(6, 11),
+                                    TextRange(12, 17),
+                                ),
+                        ),
                     ),
-                ),
-            ),
-            currentInfoIndex = 0,
-            startSlot = 1,
-            endSlot = 2, // below the current text
-            previousSelection = getSelection(startOffset = 6, endOffset = 11),
-        )
+                currentInfoIndex = 0,
+                startSlot = 1,
+                endSlot = 2, // below the current text
+                previousSelection = getSelection(startOffset = 6, endOffset = 11),
+            )
 
         val actualSelection = SelectionAdjustment.CharacterWithWordAccelerate.adjust(layout)
         val expectedSelection = getSelection(startOffset = 6, endOffset = 11)
@@ -1499,28 +1472,31 @@
 
     @Test
     fun characterWithWordAccelerate_betweenSlots_usesCurrentIndex_reversed() {
-        val layout = getSelectionLayoutFake(
-            infos = listOf(
-                getSelectableInfoFake(
-                    text = "hello\nhello\nhello",
-                    selectableId = 1L,
-                    slot = 1,
-                    rawStartHandleOffset = 8,
-                    rawEndHandleOffset = 6,
-                    lineBreaks = listOf(6, 12),
-                    rawPreviousHandleOffset = 6,
-                    wordBoundaries = listOf(
-                        TextRange(0, 5),
-                        TextRange(6, 11),
-                        TextRange(12, 17),
+        val layout =
+            getSelectionLayoutFake(
+                infos =
+                    listOf(
+                        getSelectableInfoFake(
+                            text = "hello\nhello\nhello",
+                            selectableId = 1L,
+                            slot = 1,
+                            rawStartHandleOffset = 8,
+                            rawEndHandleOffset = 6,
+                            lineBreaks = listOf(6, 12),
+                            rawPreviousHandleOffset = 6,
+                            wordBoundaries =
+                                listOf(
+                                    TextRange(0, 5),
+                                    TextRange(6, 11),
+                                    TextRange(12, 17),
+                                ),
+                        ),
                     ),
-                ),
-            ),
-            currentInfoIndex = 0,
-            startSlot = 1,
-            endSlot = 0, // above the current text
-            previousSelection = getSelection(startOffset = 11, endOffset = 6),
-        )
+                currentInfoIndex = 0,
+                startSlot = 1,
+                endSlot = 0, // above the current text
+                previousSelection = getSelection(startOffset = 11, endOffset = 6),
+            )
 
         val actualSelection = SelectionAdjustment.CharacterWithWordAccelerate.adjust(layout)
         val expectedSelection = getSelection(startOffset = 11, endOffset = 6)
@@ -1529,118 +1505,128 @@
 
     @Test
     fun characterWithWordAccelerate_differentSelectable_usesWordBoundary() {
-        val layout = getSelectionLayoutFake(
-            infos = listOf(
-                getSelectableInfoFake(
-                    text = "hello",
-                    selectableId = 1L,
-                    slot = 1,
-                    rawStartHandleOffset = 3,
-                    rawEndHandleOffset = 5,
-                    rawPreviousHandleOffset = 5,
-                    wordBoundaries = listOf(TextRange(0, 5)),
-                ),
-                getSelectableInfoFake(
-                    text = "hello",
-                    selectableId = 2L,
-                    slot = 3,
-                    rawStartHandleOffset = 0,
-                    rawEndHandleOffset = 3,
-                    rawPreviousHandleOffset = 2,
-                    wordBoundaries = listOf(TextRange(0, 5)),
-                ),
-            ),
-            currentInfoIndex = 0,
-            startSlot = 1,
-            endSlot = 3,
-            isStartHandle = true,
-            previousSelection = getSelection(
-                startSelectableId = 2L,
-                startOffset = 2,
-                endSelectableId = 2L,
-                endOffset = 3,
-                handlesCrossed = false,
-            ),
-        )
+        val layout =
+            getSelectionLayoutFake(
+                infos =
+                    listOf(
+                        getSelectableInfoFake(
+                            text = "hello",
+                            selectableId = 1L,
+                            slot = 1,
+                            rawStartHandleOffset = 3,
+                            rawEndHandleOffset = 5,
+                            rawPreviousHandleOffset = 5,
+                            wordBoundaries = listOf(TextRange(0, 5)),
+                        ),
+                        getSelectableInfoFake(
+                            text = "hello",
+                            selectableId = 2L,
+                            slot = 3,
+                            rawStartHandleOffset = 0,
+                            rawEndHandleOffset = 3,
+                            rawPreviousHandleOffset = 2,
+                            wordBoundaries = listOf(TextRange(0, 5)),
+                        ),
+                    ),
+                currentInfoIndex = 0,
+                startSlot = 1,
+                endSlot = 3,
+                isStartHandle = true,
+                previousSelection =
+                    getSelection(
+                        startSelectableId = 2L,
+                        startOffset = 2,
+                        endSelectableId = 2L,
+                        endOffset = 3,
+                        handlesCrossed = false,
+                    ),
+            )
 
         // selection goes from the second text at [2, 3] and moves the start handle to the third
         // offset of the third text. Because it moves texts, it uses word based adjustment.
 
         val actualSelection = SelectionAdjustment.CharacterWithWordAccelerate.adjust(layout)
-        val expectedSelection = getSelection(
-            startSelectableId = 1L,
-            startOffset = 0,
-            endSelectableId = 2L,
-            endOffset = 3,
-            handlesCrossed = false,
-        )
+        val expectedSelection =
+            getSelection(
+                startSelectableId = 1L,
+                startOffset = 0,
+                endSelectableId = 2L,
+                endOffset = 3,
+                handlesCrossed = false,
+            )
         assertThat(actualSelection).isEqualTo(expectedSelection)
     }
 
     @Test
     fun characterWithWordAccelerate_differentSelectable_usesWordBoundary_reversed() {
-        val layout = getSelectionLayoutFake(
-            infos = listOf(
-                getSelectableInfoFake(
-                    text = "hello",
-                    selectableId = 1L,
-                    slot = 1,
-                    rawStartHandleOffset = 5,
-                    rawEndHandleOffset = 3,
-                    rawPreviousHandleOffset = 5,
-                    wordBoundaries = listOf(TextRange(0, 5)),
-                ),
-                getSelectableInfoFake(
-                    text = "hello",
-                    selectableId = 2L,
-                    slot = 3,
-                    rawStartHandleOffset = 3,
-                    rawEndHandleOffset = 0,
-                    rawPreviousHandleOffset = 2,
-                    wordBoundaries = listOf(TextRange(0, 5)),
-                ),
-            ),
-            currentInfoIndex = 0,
-            startSlot = 3,
-            endSlot = 1,
-            isStartHandle = false,
-            previousSelection = getSelection(
-                startSelectableId = 2L,
-                startOffset = 3,
-                endSelectableId = 2L,
-                endOffset = 2,
-                handlesCrossed = true,
-            ),
-        )
+        val layout =
+            getSelectionLayoutFake(
+                infos =
+                    listOf(
+                        getSelectableInfoFake(
+                            text = "hello",
+                            selectableId = 1L,
+                            slot = 1,
+                            rawStartHandleOffset = 5,
+                            rawEndHandleOffset = 3,
+                            rawPreviousHandleOffset = 5,
+                            wordBoundaries = listOf(TextRange(0, 5)),
+                        ),
+                        getSelectableInfoFake(
+                            text = "hello",
+                            selectableId = 2L,
+                            slot = 3,
+                            rawStartHandleOffset = 3,
+                            rawEndHandleOffset = 0,
+                            rawPreviousHandleOffset = 2,
+                            wordBoundaries = listOf(TextRange(0, 5)),
+                        ),
+                    ),
+                currentInfoIndex = 0,
+                startSlot = 3,
+                endSlot = 1,
+                isStartHandle = false,
+                previousSelection =
+                    getSelection(
+                        startSelectableId = 2L,
+                        startOffset = 3,
+                        endSelectableId = 2L,
+                        endOffset = 2,
+                        handlesCrossed = true,
+                    ),
+            )
 
         val actualSelection = SelectionAdjustment.CharacterWithWordAccelerate.adjust(layout)
-        val expectedSelection = getSelection(
-            endSelectableId = 1L,
-            endOffset = 0,
-            startSelectableId = 2L,
-            startOffset = 3,
-            handlesCrossed = true,
-        )
+        val expectedSelection =
+            getSelection(
+                endSelectableId = 1L,
+                endOffset = 0,
+                startSelectableId = 2L,
+                startOffset = 3,
+                handlesCrossed = true,
+            )
         assertThat(actualSelection).isEqualTo(expectedSelection)
     }
 
     @Test
     fun characterWithWordAccelerate_collapsed_usesCorrectCross() {
-        val layout = getSingleSelectionLayoutFake(
-            text = "hello",
-            rawStartHandleOffset = 5,
-            rawEndHandleOffset = 5,
-            rawPreviousHandleOffset = 5,
-            wordBoundaries = listOf(TextRange(0, 5)),
-            isStartHandle = false,
-            previousSelection = getSelection(
-                startSelectableId = 1L,
-                startOffset = 5,
-                endSelectableId = 2L,
-                endOffset = 0,
-                handlesCrossed = false,
-            ),
-        )
+        val layout =
+            getSingleSelectionLayoutFake(
+                text = "hello",
+                rawStartHandleOffset = 5,
+                rawEndHandleOffset = 5,
+                rawPreviousHandleOffset = 5,
+                wordBoundaries = listOf(TextRange(0, 5)),
+                isStartHandle = false,
+                previousSelection =
+                    getSelection(
+                        startSelectableId = 1L,
+                        startOffset = 5,
+                        endSelectableId = 2L,
+                        endOffset = 0,
+                        handlesCrossed = false,
+                    ),
+            )
 
         // The selection goes from a collapsed selection from selectable one to selectable two to
         // a collapsed selection at the end of selectable one.
@@ -1649,42 +1635,46 @@
         // of a collapsed cross state from the layout.
 
         val actualSelection = SelectionAdjustment.CharacterWithWordAccelerate.adjust(layout)
-        val expectedSelection = getSelection(
-            startSelectableId = 1L,
-            startOffset = 5,
-            endSelectableId = 1L,
-            endOffset = 0,
-            handlesCrossed = true,
-        )
+        val expectedSelection =
+            getSelection(
+                startSelectableId = 1L,
+                startOffset = 5,
+                endSelectableId = 1L,
+                endOffset = 0,
+                handlesCrossed = true,
+            )
         assertThat(actualSelection).isEqualTo(expectedSelection)
     }
 
     @Test
     fun characterWithWordAccelerate_multiSelectableCollapsed_usesCorrectCross_reversed() {
-        val layout = getSingleSelectionLayoutFake(
-            text = "hello",
-            rawStartHandleOffset = 5,
-            rawEndHandleOffset = 5,
-            rawPreviousHandleOffset = 5,
-            wordBoundaries = listOf(TextRange(0, 5)),
-            isStartHandle = true,
-            previousSelection = getSelection(
-                startSelectableId = 2L,
+        val layout =
+            getSingleSelectionLayoutFake(
+                text = "hello",
+                rawStartHandleOffset = 5,
+                rawEndHandleOffset = 5,
+                rawPreviousHandleOffset = 5,
+                wordBoundaries = listOf(TextRange(0, 5)),
+                isStartHandle = true,
+                previousSelection =
+                    getSelection(
+                        startSelectableId = 2L,
+                        startOffset = 0,
+                        endSelectableId = 1L,
+                        endOffset = 5,
+                        handlesCrossed = false,
+                    ),
+            )
+
+        val actualSelection = SelectionAdjustment.CharacterWithWordAccelerate.adjust(layout)
+        val expectedSelection =
+            getSelection(
+                startSelectableId = 1L,
                 startOffset = 0,
                 endSelectableId = 1L,
                 endOffset = 5,
                 handlesCrossed = false,
-            ),
-        )
-
-        val actualSelection = SelectionAdjustment.CharacterWithWordAccelerate.adjust(layout)
-        val expectedSelection = getSelection(
-            startSelectableId = 1L,
-            startOffset = 0,
-            endSelectableId = 1L,
-            endOffset = 5,
-            handlesCrossed = false,
-        )
+            )
         assertThat(actualSelection).isEqualTo(expectedSelection)
     }
 
@@ -1696,22 +1686,21 @@
         // first drag. This results in the old selection being re-used, but the "crossStatus"
         // changing. The layout thinks it is crossed, while the re-used selection is not.
         // It should go with the value of selection's handlesCrossed.
-        val layout = getSingleSelectionLayoutFake(
-            text = "hello world",
-            rawStartHandleOffset = 10,
-            rawEndHandleOffset = 8,
-            rawPreviousHandleOffset = 10,
-            isStartHandle = true,
-            previousSelection = getSelection(
-                startOffset = 0,
-                endOffset = 8
-            ),
-            wordBoundaries = listOf(
-                TextRange(0, 5),
-                TextRange(6, 11),
-            ),
-            rtlRanges = listOf(0..0, 11..11)
-        )
+        val layout =
+            getSingleSelectionLayoutFake(
+                text = "hello world",
+                rawStartHandleOffset = 10,
+                rawEndHandleOffset = 8,
+                rawPreviousHandleOffset = 10,
+                isStartHandle = true,
+                previousSelection = getSelection(startOffset = 0, endOffset = 8),
+                wordBoundaries =
+                    listOf(
+                        TextRange(0, 5),
+                        TextRange(6, 11),
+                    ),
+                rtlRanges = listOf(0..0, 11..11)
+            )
 
         val actualSelection = SelectionAdjustment.CharacterWithWordAccelerate.adjust(layout)
         val expectedSelection = getSelection(startOffset = 0, endOffset = 8)
@@ -1728,22 +1717,21 @@
     @Ignore
     @Test
     fun characterWithWordAccelerate_largeOffsetJump_cross_updatesSelection() {
-        val layout = getSingleSelectionLayoutFake(
-            text = "hello world",
-            rawStartHandleOffset = 1,
-            rawEndHandleOffset = 8,
-            rawPreviousHandleOffset = 11,
-            isStartHandle = true,
-            previousSelection = getSelection(
-                startOffset = 0,
-                endOffset = 8
-            ),
-            wordBoundaries = listOf(
-                TextRange(0, 5),
-                TextRange(6, 11),
-            ),
-            rtlRanges = listOf(0..0, 11..11)
-        )
+        val layout =
+            getSingleSelectionLayoutFake(
+                text = "hello world",
+                rawStartHandleOffset = 1,
+                rawEndHandleOffset = 8,
+                rawPreviousHandleOffset = 11,
+                isStartHandle = true,
+                previousSelection = getSelection(startOffset = 0, endOffset = 8),
+                wordBoundaries =
+                    listOf(
+                        TextRange(0, 5),
+                        TextRange(6, 11),
+                    ),
+                rtlRanges = listOf(0..0, 11..11)
+            )
 
         val actualSelection = SelectionAdjustment.CharacterWithWordAccelerate.adjust(layout)
         val expectedSelection = getSelection(startOffset = 1, endOffset = 8)
diff --git a/compose/foundation/foundation/src/androidUnitTest/kotlin/androidx/compose/foundation/text/selection/SelectionFakes.kt b/compose/foundation/foundation/src/androidUnitTest/kotlin/androidx/compose/foundation/text/selection/SelectionFakes.kt
index ca6265d..ca66bef 100644
--- a/compose/foundation/foundation/src/androidUnitTest/kotlin/androidx/compose/foundation/text/selection/SelectionFakes.kt
+++ b/compose/foundation/foundation/src/androidUnitTest/kotlin/androidx/compose/foundation/text/selection/SelectionFakes.kt
@@ -46,30 +46,32 @@
     rtlRanges: List<IntRange> = emptyList(),
     wordBoundaries: List<TextRange> = listOf(),
     lineBreaks: List<Int> = emptyList(),
-    crossStatus: CrossStatus = when {
-        rawStartHandleOffset < rawEndHandleOffset -> CrossStatus.NOT_CROSSED
-        rawStartHandleOffset > rawEndHandleOffset -> CrossStatus.CROSSED
-        else -> CrossStatus.COLLAPSED
-    },
+    crossStatus: CrossStatus =
+        when {
+            rawStartHandleOffset < rawEndHandleOffset -> CrossStatus.NOT_CROSSED
+            rawStartHandleOffset > rawEndHandleOffset -> CrossStatus.CROSSED
+            else -> CrossStatus.COLLAPSED
+        },
     isStartHandle: Boolean = false,
     previousSelection: Selection? = null,
     shouldRecomputeSelection: Boolean = true,
     subSelections: LongObjectMap<Selection> = emptyLongObjectMap(),
 ): SelectionLayout {
     return getSelectionLayoutFake(
-        infos = listOf(
-            getSelectableInfoFake(
-                text = text,
-                selectableId = 1,
-                slot = 1,
-                rawStartHandleOffset = rawStartHandleOffset,
-                rawEndHandleOffset = rawEndHandleOffset,
-                rawPreviousHandleOffset = rawPreviousHandleOffset,
-                rtlRanges = rtlRanges,
-                wordBoundaries = wordBoundaries,
-                lineBreaks = lineBreaks,
-            )
-        ),
+        infos =
+            listOf(
+                getSelectableInfoFake(
+                    text = text,
+                    selectableId = 1,
+                    slot = 1,
+                    rawStartHandleOffset = rawStartHandleOffset,
+                    rawEndHandleOffset = rawEndHandleOffset,
+                    rawPreviousHandleOffset = rawPreviousHandleOffset,
+                    rtlRanges = rtlRanges,
+                    wordBoundaries = wordBoundaries,
+                    lineBreaks = lineBreaks,
+                )
+            ),
         currentInfoIndex = 0,
         startSlot = 1,
         endSlot = 1,
@@ -90,18 +92,19 @@
 ): TextLayoutResult {
     val annotatedString = AnnotatedString(text)
 
-    val textLayoutInput = TextLayoutInput(
-        text = annotatedString,
-        style = TextStyle.Default,
-        placeholders = emptyList(),
-        maxLines = Int.MAX_VALUE,
-        softWrap = false,
-        overflow = TextOverflow.Visible,
-        density = Density(1f),
-        layoutDirection = LayoutDirection.Ltr,
-        fontFamilyResolver = mock(),
-        constraints = Constraints(0L)
-    )
+    val textLayoutInput =
+        TextLayoutInput(
+            text = annotatedString,
+            style = TextStyle.Default,
+            placeholders = emptyList(),
+            maxLines = Int.MAX_VALUE,
+            softWrap = false,
+            overflow = TextOverflow.Visible,
+            density = Density(1f),
+            layoutDirection = LayoutDirection.Ltr,
+            fontFamilyResolver = mock(),
+            constraints = Constraints(0L)
+        )
 
     fun lineForOffset(offset: Int): Int {
         var line = 0
@@ -114,44 +117,51 @@
         return line
     }
 
-    val multiParagraph = mock<MultiParagraph> {
-        on { lineCount }.thenAnswer { _ -> lineBreaks.size + 1 }
+    val multiParagraph =
+        mock<MultiParagraph> {
+            on { lineCount }.thenAnswer { _ -> lineBreaks.size + 1 }
 
-        on { getBidiRunDirection(any()) }.thenAnswer { invocation ->
-            val offset = invocation.arguments[0] as Int
-            if (rtlCharRanges.any { offset in it })
-                ResolvedTextDirection.Rtl else ResolvedTextDirection.Ltr
-        }
+            on { getBidiRunDirection(any()) }
+                .thenAnswer { invocation ->
+                    val offset = invocation.arguments[0] as Int
+                    if (rtlCharRanges.any { offset in it }) ResolvedTextDirection.Rtl
+                    else ResolvedTextDirection.Ltr
+                }
 
-        on { getParagraphDirection(any()) }.thenAnswer { invocation ->
-            val offset = invocation.arguments[0] as Int
-            val line = lineForOffset(offset)
-            if (line in rtlLines) ResolvedTextDirection.Rtl else ResolvedTextDirection.Ltr
-        }
+            on { getParagraphDirection(any()) }
+                .thenAnswer { invocation ->
+                    val offset = invocation.arguments[0] as Int
+                    val line = lineForOffset(offset)
+                    if (line in rtlLines) ResolvedTextDirection.Rtl else ResolvedTextDirection.Ltr
+                }
 
-        on { getWordBoundary(any()) }.thenAnswer { invocation ->
-            val offset = invocation.arguments[0] as Int
-            val wordBoundary = wordBoundaries.find { offset in it.start..it.end }
-            // Workaround: Mockito doesn't work with inline class now. The packed Long is
-            // equal to TextRange(start, end).
-            packInts(wordBoundary!!.start, wordBoundary.end)
-        }
+            on { getWordBoundary(any()) }
+                .thenAnswer { invocation ->
+                    val offset = invocation.arguments[0] as Int
+                    val wordBoundary = wordBoundaries.find { offset in it.start..it.end }
+                    // Workaround: Mockito doesn't work with inline class now. The packed Long is
+                    // equal to TextRange(start, end).
+                    packInts(wordBoundary!!.start, wordBoundary.end)
+                }
 
-        on { getLineForOffset(any()) }.thenAnswer { invocation ->
-            val offset = invocation.arguments[0] as Int
-            lineForOffset(offset)
-        }
+            on { getLineForOffset(any()) }
+                .thenAnswer { invocation ->
+                    val offset = invocation.arguments[0] as Int
+                    lineForOffset(offset)
+                }
 
-        on { getLineStart(any()) }.thenAnswer { invocation ->
-            val lineIndex = invocation.arguments[0] as Int
-            if (lineIndex == 0) 0 else lineBreaks[lineIndex - 1]
-        }
+            on { getLineStart(any()) }
+                .thenAnswer { invocation ->
+                    val lineIndex = invocation.arguments[0] as Int
+                    if (lineIndex == 0) 0 else lineBreaks[lineIndex - 1]
+                }
 
-        on { getLineEnd(any(), any()) }.thenAnswer { invocation ->
-            val lineIndex = invocation.arguments[0] as Int
-            if (lineIndex == lineBreaks.size) text.length else lineBreaks[lineIndex] - 1
+            on { getLineEnd(any(), any()) }
+                .thenAnswer { invocation ->
+                    val lineIndex = invocation.arguments[0] as Int
+                    if (lineIndex == lineBreaks.size) text.length else lineBreaks[lineIndex] - 1
+                }
         }
-    }
 
     return TextLayoutResult(textLayoutInput, multiParagraph, IntSize.Zero)
 }
@@ -166,30 +176,33 @@
     rtlRanges: List<IntRange> = emptyList(),
     wordBoundaries: List<TextRange> = listOf(),
     lineBreaks: List<Int> = emptyList(),
-): SelectableInfo = SelectableInfo(
-    selectableId = selectableId,
-    slot = slot,
-    rawStartHandleOffset = rawStartHandleOffset,
-    rawEndHandleOffset = rawEndHandleOffset,
-    rawPreviousHandleOffset = rawPreviousHandleOffset,
-    textLayoutResult = getTextLayoutResultMock(
-        text = text,
-        rtlCharRanges = rtlRanges,
-        wordBoundaries = wordBoundaries,
-        lineBreaks = lineBreaks,
-    ),
-)
+): SelectableInfo =
+    SelectableInfo(
+        selectableId = selectableId,
+        slot = slot,
+        rawStartHandleOffset = rawStartHandleOffset,
+        rawEndHandleOffset = rawEndHandleOffset,
+        rawPreviousHandleOffset = rawPreviousHandleOffset,
+        textLayoutResult =
+            getTextLayoutResultMock(
+                text = text,
+                rtlCharRanges = rtlRanges,
+                wordBoundaries = wordBoundaries,
+                lineBreaks = lineBreaks,
+            ),
+    )
 
 internal fun getSelectionLayoutFake(
     infos: List<SelectableInfo>,
     startSlot: Int,
     endSlot: Int,
     currentInfoIndex: Int = 0,
-    crossStatus: CrossStatus = when {
-        startSlot < endSlot -> CrossStatus.NOT_CROSSED
-        startSlot > endSlot -> CrossStatus.CROSSED
-        else -> infos.single().rawCrossStatus
-    },
+    crossStatus: CrossStatus =
+        when {
+            startSlot < endSlot -> CrossStatus.NOT_CROSSED
+            startSlot > endSlot -> CrossStatus.CROSSED
+            else -> infos.single().rawCrossStatus
+        },
     startInfo: SelectableInfo =
         with(infos) { if (crossStatus == CrossStatus.CROSSED) last() else first() },
     endInfo: SelectableInfo =
@@ -202,22 +215,23 @@
     previousSelection: Selection? = null,
     shouldRecomputeSelection: Boolean = true,
     subSelections: LongObjectMap<Selection> = emptyLongObjectMap(),
-): SelectionLayout = FakeSelectionLayout(
-    size = infos.size,
-    crossStatus = crossStatus,
-    startSlot = startSlot,
-    endSlot = endSlot,
-    startInfo = startInfo,
-    endInfo = endInfo,
-    currentInfo = infos[currentInfoIndex],
-    firstInfo = firstInfo,
-    lastInfo = lastInfo,
-    middleInfos = middleInfos,
-    isStartHandle = isStartHandle,
-    previousSelection = previousSelection,
-    shouldRecomputeSelection = shouldRecomputeSelection,
-    subSelections = subSelections,
-)
+): SelectionLayout =
+    FakeSelectionLayout(
+        size = infos.size,
+        crossStatus = crossStatus,
+        startSlot = startSlot,
+        endSlot = endSlot,
+        startInfo = startInfo,
+        endInfo = endInfo,
+        currentInfo = infos[currentInfoIndex],
+        firstInfo = firstInfo,
+        lastInfo = lastInfo,
+        middleInfos = middleInfos,
+        isStartHandle = isStartHandle,
+        previousSelection = previousSelection,
+        shouldRecomputeSelection = shouldRecomputeSelection,
+        subSelections = subSelections,
+    )
 
 internal class FakeSelectionLayout(
     override val size: Int,
@@ -236,6 +250,7 @@
     private val subSelections: LongObjectMap<Selection>,
 ) : SelectionLayout {
     override fun createSubSelections(selection: Selection): LongObjectMap<Selection> = subSelections
+
     override fun forEachMiddleInfo(block: (SelectableInfo) -> Unit) {
         middleInfos.forEach(block)
     }
@@ -252,19 +267,22 @@
     handlesCrossed: Boolean = startSelectableId == endSelectableId && startOffset > endOffset,
     startLayoutDirection: ResolvedTextDirection = ResolvedTextDirection.Ltr,
     endLayoutDirection: ResolvedTextDirection = ResolvedTextDirection.Ltr,
-): Selection = Selection(
-    start = Selection.AnchorInfo(
-        direction = startLayoutDirection,
-        offset = startOffset,
-        selectableId = startSelectableId,
-    ),
-    end = Selection.AnchorInfo(
-        direction = endLayoutDirection,
-        offset = endOffset,
-        selectableId = endSelectableId,
-    ),
-    handlesCrossed = handlesCrossed,
-)
+): Selection =
+    Selection(
+        start =
+            Selection.AnchorInfo(
+                direction = startLayoutDirection,
+                offset = startOffset,
+                selectableId = startSelectableId,
+            ),
+        end =
+            Selection.AnchorInfo(
+                direction = endLayoutDirection,
+                offset = endOffset,
+                selectableId = endSelectableId,
+            ),
+        handlesCrossed = handlesCrossed,
+    )
 
 internal class FakeSelectable : Selectable {
     override var selectableId = 0L
@@ -282,18 +300,21 @@
     var boundingBoxes: Map<Int, Rect> = emptyMap()
 
     private val selectableKey = 1L
-    var fakeSelectAllSelection: Selection? = Selection(
-        start = Selection.AnchorInfo(
-            direction = ResolvedTextDirection.Ltr,
-            offset = 0,
-            selectableId = selectableKey
-        ),
-        end = Selection.AnchorInfo(
-            direction = ResolvedTextDirection.Ltr,
-            offset = 10,
-            selectableId = selectableKey
+    var fakeSelectAllSelection: Selection? =
+        Selection(
+            start =
+                Selection.AnchorInfo(
+                    direction = ResolvedTextDirection.Ltr,
+                    offset = 0,
+                    selectableId = selectableKey
+                ),
+            end =
+                Selection.AnchorInfo(
+                    direction = ResolvedTextDirection.Ltr,
+                    offset = 10,
+                    selectableId = selectableKey
+                )
         )
-    )
 
     override fun appendSelectableInfoToBuilder(builder: SelectionLayoutBuilder) {
         builder.appendInfo(
diff --git a/compose/foundation/foundation/src/androidUnitTest/kotlin/androidx/compose/foundation/text/selection/SelectionLayoutStartSlot2DTest.kt b/compose/foundation/foundation/src/androidUnitTest/kotlin/androidx/compose/foundation/text/selection/SelectionLayoutStartSlot2DTest.kt
index c75e124..4a1814f 100644
--- a/compose/foundation/foundation/src/androidUnitTest/kotlin/androidx/compose/foundation/text/selection/SelectionLayoutStartSlot2DTest.kt
+++ b/compose/foundation/foundation/src/androidUnitTest/kotlin/androidx/compose/foundation/text/selection/SelectionLayoutStartSlot2DTest.kt
@@ -47,11 +47,16 @@
  *                │ └────────┘         └────────┘ │
  *  BOTTOM        └───────────────────────────────┘
  * ```
+ *
  * The labels on the x and y axis that will be referenced in the below tests.
  */
 open class SelectionLayout2DTest {
     enum class TestHorizontal {
-        LEFT, MIDDLE_LEFT, MIDDLE, MIDDLE_RIGHT, RIGHT
+        LEFT,
+        MIDDLE_LEFT,
+        MIDDLE,
+        MIDDLE_RIGHT,
+        RIGHT
     }
 
     enum class TestVertical {
@@ -93,16 +98,17 @@
     ): SelectionLayout {
         contract { callsInPlace(block, InvocationKind.EXACTLY_ONCE) }
         return SelectionLayoutBuilder(
-            currentPosition = currentPosition,
-            previousHandlePosition = previousHandlePosition,
-            containerCoordinates = containerCoordinates,
-            isStartHandle = isStartHandle,
-            previousSelection = previousSelection,
-            selectableIdOrderingComparator = selectableIdOrderingComparator,
-        ).run {
-            block()
-            build()
-        }
+                currentPosition = currentPosition,
+                previousHandlePosition = previousHandlePosition,
+                containerCoordinates = containerCoordinates,
+                isStartHandle = isStartHandle,
+                previousSelection = previousSelection,
+                selectableIdOrderingComparator = selectableIdOrderingComparator,
+            )
+            .run {
+                block()
+                build()
+            }
     }
 
     internal fun SelectionLayoutBuilder.appendInfoForTest(
@@ -119,12 +125,13 @@
         wordBoundaries: List<TextRange> = listOf(),
         lineBreaks: List<Int> = emptyList(),
     ): SelectableInfo {
-        val layoutResult = getTextLayoutResultMock(
-            text = text,
-            rtlCharRanges = rtlRanges,
-            wordBoundaries = wordBoundaries,
-            lineBreaks = lineBreaks,
-        )
+        val layoutResult =
+            getTextLayoutResultMock(
+                text = text,
+                rtlCharRanges = rtlRanges,
+                wordBoundaries = wordBoundaries,
+                lineBreaks = lineBreaks,
+            )
         return appendInfo(
             selectableId = selectableId,
             rawStartHandleOffset = rawStartHandleOffset,
@@ -149,33 +156,34 @@
     companion object {
         @JvmStatic
         @Parameters(name = "verticalPosition={0}, horizontalPosition={1} expectedSlot={2}")
-        fun data(): Collection<Array<Any>> = listOf(
-            arrayOf(TestVertical.TOP, TestHorizontal.LEFT, 0),
-            arrayOf(TestVertical.TOP, TestHorizontal.MIDDLE_LEFT, 0),
-            arrayOf(TestVertical.TOP, TestHorizontal.MIDDLE, 0),
-            arrayOf(TestVertical.TOP, TestHorizontal.MIDDLE_RIGHT, 0),
-            arrayOf(TestVertical.TOP, TestHorizontal.RIGHT, 0),
-            arrayOf(TestVertical.MIDDLE_TOP, TestHorizontal.LEFT, 0),
-            arrayOf(TestVertical.MIDDLE_TOP, TestHorizontal.MIDDLE_LEFT, 1),
-            arrayOf(TestVertical.MIDDLE_TOP, TestHorizontal.MIDDLE, 2),
-            arrayOf(TestVertical.MIDDLE_TOP, TestHorizontal.MIDDLE_RIGHT, 3),
-            arrayOf(TestVertical.MIDDLE_TOP, TestHorizontal.RIGHT, 4),
-            arrayOf(TestVertical.MIDDLE, TestHorizontal.LEFT, 4),
-            arrayOf(TestVertical.MIDDLE, TestHorizontal.MIDDLE_LEFT, 4),
-            arrayOf(TestVertical.MIDDLE, TestHorizontal.MIDDLE, 4),
-            arrayOf(TestVertical.MIDDLE, TestHorizontal.MIDDLE_RIGHT, 4),
-            arrayOf(TestVertical.MIDDLE, TestHorizontal.RIGHT, 4),
-            arrayOf(TestVertical.MIDDLE_BOTTOM, TestHorizontal.LEFT, 4),
-            arrayOf(TestVertical.MIDDLE_BOTTOM, TestHorizontal.MIDDLE_LEFT, 5),
-            arrayOf(TestVertical.MIDDLE_BOTTOM, TestHorizontal.MIDDLE, 6),
-            arrayOf(TestVertical.MIDDLE_BOTTOM, TestHorizontal.MIDDLE_RIGHT, 7),
-            arrayOf(TestVertical.MIDDLE_BOTTOM, TestHorizontal.RIGHT, 8),
-            arrayOf(TestVertical.BOTTOM, TestHorizontal.LEFT, 8),
-            arrayOf(TestVertical.BOTTOM, TestHorizontal.MIDDLE_LEFT, 8),
-            arrayOf(TestVertical.BOTTOM, TestHorizontal.MIDDLE, 8),
-            arrayOf(TestVertical.BOTTOM, TestHorizontal.MIDDLE_RIGHT, 8),
-            arrayOf(TestVertical.BOTTOM, TestHorizontal.RIGHT, 8),
-        )
+        fun data(): Collection<Array<Any>> =
+            listOf(
+                arrayOf(TestVertical.TOP, TestHorizontal.LEFT, 0),
+                arrayOf(TestVertical.TOP, TestHorizontal.MIDDLE_LEFT, 0),
+                arrayOf(TestVertical.TOP, TestHorizontal.MIDDLE, 0),
+                arrayOf(TestVertical.TOP, TestHorizontal.MIDDLE_RIGHT, 0),
+                arrayOf(TestVertical.TOP, TestHorizontal.RIGHT, 0),
+                arrayOf(TestVertical.MIDDLE_TOP, TestHorizontal.LEFT, 0),
+                arrayOf(TestVertical.MIDDLE_TOP, TestHorizontal.MIDDLE_LEFT, 1),
+                arrayOf(TestVertical.MIDDLE_TOP, TestHorizontal.MIDDLE, 2),
+                arrayOf(TestVertical.MIDDLE_TOP, TestHorizontal.MIDDLE_RIGHT, 3),
+                arrayOf(TestVertical.MIDDLE_TOP, TestHorizontal.RIGHT, 4),
+                arrayOf(TestVertical.MIDDLE, TestHorizontal.LEFT, 4),
+                arrayOf(TestVertical.MIDDLE, TestHorizontal.MIDDLE_LEFT, 4),
+                arrayOf(TestVertical.MIDDLE, TestHorizontal.MIDDLE, 4),
+                arrayOf(TestVertical.MIDDLE, TestHorizontal.MIDDLE_RIGHT, 4),
+                arrayOf(TestVertical.MIDDLE, TestHorizontal.RIGHT, 4),
+                arrayOf(TestVertical.MIDDLE_BOTTOM, TestHorizontal.LEFT, 4),
+                arrayOf(TestVertical.MIDDLE_BOTTOM, TestHorizontal.MIDDLE_LEFT, 5),
+                arrayOf(TestVertical.MIDDLE_BOTTOM, TestHorizontal.MIDDLE, 6),
+                arrayOf(TestVertical.MIDDLE_BOTTOM, TestHorizontal.MIDDLE_RIGHT, 7),
+                arrayOf(TestVertical.MIDDLE_BOTTOM, TestHorizontal.RIGHT, 8),
+                arrayOf(TestVertical.BOTTOM, TestHorizontal.LEFT, 8),
+                arrayOf(TestVertical.BOTTOM, TestHorizontal.MIDDLE_LEFT, 8),
+                arrayOf(TestVertical.BOTTOM, TestHorizontal.MIDDLE, 8),
+                arrayOf(TestVertical.BOTTOM, TestHorizontal.MIDDLE_RIGHT, 8),
+                arrayOf(TestVertical.BOTTOM, TestHorizontal.RIGHT, 8),
+            )
     }
 
     // Test the start slot. end slot handle directions will always point to the 4th selectable.
@@ -228,33 +236,34 @@
     companion object {
         @JvmStatic
         @Parameters(name = "verticalPosition={0}, horizontalPosition={1} expectedSlot={2}")
-        fun data(): Collection<Array<Any>> = listOf(
-            arrayOf(TestVertical.TOP, TestHorizontal.LEFT, 0),
-            arrayOf(TestVertical.TOP, TestHorizontal.MIDDLE_LEFT, 0),
-            arrayOf(TestVertical.TOP, TestHorizontal.MIDDLE, 0),
-            arrayOf(TestVertical.TOP, TestHorizontal.MIDDLE_RIGHT, 0),
-            arrayOf(TestVertical.TOP, TestHorizontal.RIGHT, 0),
-            arrayOf(TestVertical.MIDDLE_TOP, TestHorizontal.LEFT, 0),
-            arrayOf(TestVertical.MIDDLE_TOP, TestHorizontal.MIDDLE_LEFT, 1),
-            arrayOf(TestVertical.MIDDLE_TOP, TestHorizontal.MIDDLE, 2),
-            arrayOf(TestVertical.MIDDLE_TOP, TestHorizontal.MIDDLE_RIGHT, 3),
-            arrayOf(TestVertical.MIDDLE_TOP, TestHorizontal.RIGHT, 4),
-            arrayOf(TestVertical.MIDDLE, TestHorizontal.LEFT, 4),
-            arrayOf(TestVertical.MIDDLE, TestHorizontal.MIDDLE_LEFT, 4),
-            arrayOf(TestVertical.MIDDLE, TestHorizontal.MIDDLE, 4),
-            arrayOf(TestVertical.MIDDLE, TestHorizontal.MIDDLE_RIGHT, 4),
-            arrayOf(TestVertical.MIDDLE, TestHorizontal.RIGHT, 4),
-            arrayOf(TestVertical.MIDDLE_BOTTOM, TestHorizontal.LEFT, 4),
-            arrayOf(TestVertical.MIDDLE_BOTTOM, TestHorizontal.MIDDLE_LEFT, 5),
-            arrayOf(TestVertical.MIDDLE_BOTTOM, TestHorizontal.MIDDLE, 6),
-            arrayOf(TestVertical.MIDDLE_BOTTOM, TestHorizontal.MIDDLE_RIGHT, 7),
-            arrayOf(TestVertical.MIDDLE_BOTTOM, TestHorizontal.RIGHT, 8),
-            arrayOf(TestVertical.BOTTOM, TestHorizontal.LEFT, 8),
-            arrayOf(TestVertical.BOTTOM, TestHorizontal.MIDDLE_LEFT, 8),
-            arrayOf(TestVertical.BOTTOM, TestHorizontal.MIDDLE, 8),
-            arrayOf(TestVertical.BOTTOM, TestHorizontal.MIDDLE_RIGHT, 8),
-            arrayOf(TestVertical.BOTTOM, TestHorizontal.RIGHT, 8),
-        )
+        fun data(): Collection<Array<Any>> =
+            listOf(
+                arrayOf(TestVertical.TOP, TestHorizontal.LEFT, 0),
+                arrayOf(TestVertical.TOP, TestHorizontal.MIDDLE_LEFT, 0),
+                arrayOf(TestVertical.TOP, TestHorizontal.MIDDLE, 0),
+                arrayOf(TestVertical.TOP, TestHorizontal.MIDDLE_RIGHT, 0),
+                arrayOf(TestVertical.TOP, TestHorizontal.RIGHT, 0),
+                arrayOf(TestVertical.MIDDLE_TOP, TestHorizontal.LEFT, 0),
+                arrayOf(TestVertical.MIDDLE_TOP, TestHorizontal.MIDDLE_LEFT, 1),
+                arrayOf(TestVertical.MIDDLE_TOP, TestHorizontal.MIDDLE, 2),
+                arrayOf(TestVertical.MIDDLE_TOP, TestHorizontal.MIDDLE_RIGHT, 3),
+                arrayOf(TestVertical.MIDDLE_TOP, TestHorizontal.RIGHT, 4),
+                arrayOf(TestVertical.MIDDLE, TestHorizontal.LEFT, 4),
+                arrayOf(TestVertical.MIDDLE, TestHorizontal.MIDDLE_LEFT, 4),
+                arrayOf(TestVertical.MIDDLE, TestHorizontal.MIDDLE, 4),
+                arrayOf(TestVertical.MIDDLE, TestHorizontal.MIDDLE_RIGHT, 4),
+                arrayOf(TestVertical.MIDDLE, TestHorizontal.RIGHT, 4),
+                arrayOf(TestVertical.MIDDLE_BOTTOM, TestHorizontal.LEFT, 4),
+                arrayOf(TestVertical.MIDDLE_BOTTOM, TestHorizontal.MIDDLE_LEFT, 5),
+                arrayOf(TestVertical.MIDDLE_BOTTOM, TestHorizontal.MIDDLE, 6),
+                arrayOf(TestVertical.MIDDLE_BOTTOM, TestHorizontal.MIDDLE_RIGHT, 7),
+                arrayOf(TestVertical.MIDDLE_BOTTOM, TestHorizontal.RIGHT, 8),
+                arrayOf(TestVertical.BOTTOM, TestHorizontal.LEFT, 8),
+                arrayOf(TestVertical.BOTTOM, TestHorizontal.MIDDLE_LEFT, 8),
+                arrayOf(TestVertical.BOTTOM, TestHorizontal.MIDDLE, 8),
+                arrayOf(TestVertical.BOTTOM, TestHorizontal.MIDDLE_RIGHT, 8),
+                arrayOf(TestVertical.BOTTOM, TestHorizontal.RIGHT, 8),
+            )
     }
 
     // Test the end slot. start slot handle directions will always point to the 1st selectable.
diff --git a/compose/foundation/foundation/src/androidUnitTest/kotlin/androidx/compose/foundation/text/selection/SelectionLayoutTest.kt b/compose/foundation/foundation/src/androidUnitTest/kotlin/androidx/compose/foundation/text/selection/SelectionLayoutTest.kt
index 6ab64a4..a929716 100644
--- a/compose/foundation/foundation/src/androidUnitTest/kotlin/androidx/compose/foundation/text/selection/SelectionLayoutTest.kt
+++ b/compose/foundation/foundation/src/androidUnitTest/kotlin/androidx/compose/foundation/text/selection/SelectionLayoutTest.kt
@@ -38,18 +38,17 @@
 class SelectionLayoutTest {
     @Test
     fun layoutBuilderSizeZero_throws() {
-        assertFailsWith(IllegalStateException::class) {
-            buildSelectionLayoutForTest { }
-        }
+        assertFailsWith(IllegalStateException::class) { buildSelectionLayoutForTest {} }
     }
 
     @Test
     fun singleLayout_verifySimpleParameters() {
         val selection = getSelection()
-        val layout = getSingleSelectionLayoutForTest(
-            isStartHandle = true,
-            previousSelection = selection,
-        )
+        val layout =
+            getSingleSelectionLayoutForTest(
+                isStartHandle = true,
+                previousSelection = selection,
+            )
         assertThat(layout.isStartHandle).isTrue()
         assertThat(layout.previousSelection).isEqualTo(selection)
     }
@@ -57,12 +56,13 @@
     @Test
     fun layoutBuilder_verifySimpleParameters() {
         val selection = getSelection()
-        val layout = buildSelectionLayoutForTest(
-            isStartHandle = true,
-            previousSelection = selection,
-        ) {
-            appendInfoForTest()
-        }
+        val layout =
+            buildSelectionLayoutForTest(
+                isStartHandle = true,
+                previousSelection = selection,
+            ) {
+                appendInfoForTest()
+            }
         assertThat(layout.isStartHandle).isTrue()
         assertThat(layout.previousSelection).isEqualTo(selection)
     }
@@ -86,9 +86,7 @@
 
     @Test
     fun size_layoutBuilderSizeOne_returnsOne() {
-        val selection = buildSelectionLayoutForTest {
-            appendInfoForTest()
-        }
+        val selection = buildSelectionLayoutForTest { appendInfoForTest() }
         assertThat(selection.size).isEqualTo(1)
     }
 
@@ -300,28 +298,31 @@
 
     @Test
     fun crossStatus_singleLayout_collapsed() {
-        val layout = getSingleSelectionLayoutForTest(
-            rawStartHandleOffset = 0,
-            rawEndHandleOffset = 0,
-        )
+        val layout =
+            getSingleSelectionLayoutForTest(
+                rawStartHandleOffset = 0,
+                rawEndHandleOffset = 0,
+            )
         assertThat(layout.crossStatus).isEqualTo(CrossStatus.COLLAPSED)
     }
 
     @Test
     fun crossStatus_singleLayout_crossed() {
-        val layout = getSingleSelectionLayoutForTest(
-            rawStartHandleOffset = 1,
-            rawEndHandleOffset = 0,
-        )
+        val layout =
+            getSingleSelectionLayoutForTest(
+                rawStartHandleOffset = 1,
+                rawEndHandleOffset = 0,
+            )
         assertThat(layout.crossStatus).isEqualTo(CrossStatus.CROSSED)
     }
 
     @Test
     fun crossStatus_singleLayout_notCrossed() {
-        val layout = getSingleSelectionLayoutForTest(
-            rawStartHandleOffset = 0,
-            rawEndHandleOffset = 1,
-        )
+        val layout =
+            getSingleSelectionLayoutForTest(
+                rawStartHandleOffset = 0,
+                rawEndHandleOffset = 1,
+            )
         assertThat(layout.crossStatus).isEqualTo(CrossStatus.NOT_CROSSED)
     }
 
@@ -551,35 +552,37 @@
 
     @Test
     fun currentInfo_layoutBuilder_currentInfo_startHandle_equalsFirst() {
-        val layout = buildSelectionLayoutForTest(isStartHandle = true) {
-            appendInfoForTest(
-                selectableId = 1L,
-                startYHandleDirection = ON,
-                endYHandleDirection = AFTER,
-            )
-            appendInfoForTest(
-                selectableId = 2L,
-                startYHandleDirection = BEFORE,
-                endYHandleDirection = ON,
-            )
-        }
+        val layout =
+            buildSelectionLayoutForTest(isStartHandle = true) {
+                appendInfoForTest(
+                    selectableId = 1L,
+                    startYHandleDirection = ON,
+                    endYHandleDirection = AFTER,
+                )
+                appendInfoForTest(
+                    selectableId = 2L,
+                    startYHandleDirection = BEFORE,
+                    endYHandleDirection = ON,
+                )
+            }
         assertThat(layout.currentInfo.selectableId).isEqualTo(1L)
     }
 
     @Test
     fun currentInfo_layoutBuilder_endHandle_equalsSecond() {
-        val layout = buildSelectionLayoutForTest(isStartHandle = false) {
-            appendInfoForTest(
-                selectableId = 1L,
-                startYHandleDirection = ON,
-                endYHandleDirection = AFTER,
-            )
-            appendInfoForTest(
-                selectableId = 2L,
-                startYHandleDirection = BEFORE,
-                endYHandleDirection = ON,
-            )
-        }
+        val layout =
+            buildSelectionLayoutForTest(isStartHandle = false) {
+                appendInfoForTest(
+                    selectableId = 1L,
+                    startYHandleDirection = ON,
+                    endYHandleDirection = AFTER,
+                )
+                appendInfoForTest(
+                    selectableId = 2L,
+                    startYHandleDirection = BEFORE,
+                    endYHandleDirection = ON,
+                )
+            }
         assertThat(layout.currentInfo.selectableId).isEqualTo(2L)
     }
 
@@ -688,11 +691,12 @@
                 startYHandleDirection = ON,
                 endYHandleDirection = AFTER,
             )
-            info = appendInfoForTest(
-                selectableId = 2L,
-                startYHandleDirection = BEFORE,
-                endYHandleDirection = AFTER,
-            )
+            info =
+                appendInfoForTest(
+                    selectableId = 2L,
+                    startYHandleDirection = BEFORE,
+                    endYHandleDirection = AFTER,
+                )
             appendInfoForTest(
                 selectableId = 3L,
                 startYHandleDirection = BEFORE,
@@ -714,16 +718,18 @@
                 startYHandleDirection = ON,
                 endYHandleDirection = AFTER,
             )
-            infoOne = appendInfoForTest(
-                selectableId = 2L,
-                startYHandleDirection = BEFORE,
-                endYHandleDirection = AFTER,
-            )
-            infoTwo = appendInfoForTest(
-                selectableId = 3L,
-                startYHandleDirection = BEFORE,
-                endYHandleDirection = AFTER,
-            )
+            infoOne =
+                appendInfoForTest(
+                    selectableId = 2L,
+                    startYHandleDirection = BEFORE,
+                    endYHandleDirection = AFTER,
+                )
+            infoTwo =
+                appendInfoForTest(
+                    selectableId = 3L,
+                    startYHandleDirection = BEFORE,
+                    endYHandleDirection = AFTER,
+                )
             appendInfoForTest(
                 selectableId = 4L,
                 startYHandleDirection = BEFORE,
@@ -737,19 +743,21 @@
 
     @Test
     fun shouldRecomputeSelection_singleLayout_otherNull_returnsTrue() {
-        val layout = getSingleSelectionLayoutForTest(
-            rawPreviousHandleOffset = 5,
-            previousSelection = getSelection()
-        )
+        val layout =
+            getSingleSelectionLayoutForTest(
+                rawPreviousHandleOffset = 5,
+                previousSelection = getSelection()
+            )
         assertThat(layout.shouldRecomputeSelection(null)).isTrue()
     }
 
     @Test
     fun shouldRecomputeSelection_singleLayout_otherMulti_returnsTrue() {
-        val layout = getSingleSelectionLayoutForTest(
-            rawPreviousHandleOffset = 5,
-            previousSelection = getSelection()
-        )
+        val layout =
+            getSingleSelectionLayoutForTest(
+                rawPreviousHandleOffset = 5,
+                previousSelection = getSelection()
+            )
         val otherLayout = buildSelectionLayoutForTest {
             appendInfoForTest()
             appendInfoForTest()
@@ -759,239 +767,233 @@
 
     @Test
     fun shouldRecomputeSelection_singleLayout_differentHandle_returnsTrue() {
-        val layout = getSingleSelectionLayoutForTest(
-            isStartHandle = true,
-            rawPreviousHandleOffset = 5,
-            previousSelection = getSelection()
-        )
-        val otherLayout = getSingleSelectionLayoutForTest(
-            isStartHandle = false,
-            rawPreviousHandleOffset = 5,
-            previousSelection = getSelection()
-        )
+        val layout =
+            getSingleSelectionLayoutForTest(
+                isStartHandle = true,
+                rawPreviousHandleOffset = 5,
+                previousSelection = getSelection()
+            )
+        val otherLayout =
+            getSingleSelectionLayoutForTest(
+                isStartHandle = false,
+                rawPreviousHandleOffset = 5,
+                previousSelection = getSelection()
+            )
         assertThat(layout.shouldRecomputeSelection(otherLayout)).isTrue()
     }
 
     @Test
     fun shouldRecomputeSelection_singleLayout_differentInfo_returnsTrue() {
-        val layout = getSingleSelectionLayoutForTest(
-            rawStartHandleOffset = 0,
-            previousSelection = getSelection()
-        )
-        val otherLayout = getSingleSelectionLayoutForTest(
-            rawStartHandleOffset = 1,
-            previousSelection = getSelection()
-        )
+        val layout =
+            getSingleSelectionLayoutForTest(
+                rawStartHandleOffset = 0,
+                previousSelection = getSelection()
+            )
+        val otherLayout =
+            getSingleSelectionLayoutForTest(
+                rawStartHandleOffset = 1,
+                previousSelection = getSelection()
+            )
         assertThat(layout.shouldRecomputeSelection(otherLayout)).isTrue()
     }
 
     @Test
     fun shouldRecomputeSelection_singleLayout_noPreviousSelection_returnsTrue() {
-        val layout = getSingleSelectionLayoutForTest(
-            rawPreviousHandleOffset = 5,
-        )
-        val otherLayout = getSingleSelectionLayoutForTest(
-            rawPreviousHandleOffset = 5,
-            previousSelection = getSelection()
-        )
+        val layout =
+            getSingleSelectionLayoutForTest(
+                rawPreviousHandleOffset = 5,
+            )
+        val otherLayout =
+            getSingleSelectionLayoutForTest(
+                rawPreviousHandleOffset = 5,
+                previousSelection = getSelection()
+            )
         assertThat(layout.shouldRecomputeSelection(otherLayout)).isTrue()
     }
 
     @Test
     fun shouldRecomputeSelection_singleLayout_sameLayout_returnsFalse() {
-        val layout = getSingleSelectionLayoutForTest(
-            rawPreviousHandleOffset = 5,
-            previousSelection = getSelection()
-        )
+        val layout =
+            getSingleSelectionLayoutForTest(
+                rawPreviousHandleOffset = 5,
+                previousSelection = getSelection()
+            )
         assertThat(layout.shouldRecomputeSelection(layout)).isFalse()
     }
 
     @Test
     fun shouldRecomputeSelection_singleLayout_equalLayout_returnsFalse() {
-        val layout = getSingleSelectionLayoutForTest(
-            rawPreviousHandleOffset = 5,
-            previousSelection = getSelection()
-        )
-        val otherLayout = getSingleSelectionLayoutForTest(
-            rawPreviousHandleOffset = 5,
-            previousSelection = getSelection()
-        )
+        val layout =
+            getSingleSelectionLayoutForTest(
+                rawPreviousHandleOffset = 5,
+                previousSelection = getSelection()
+            )
+        val otherLayout =
+            getSingleSelectionLayoutForTest(
+                rawPreviousHandleOffset = 5,
+                previousSelection = getSelection()
+            )
         assertThat(layout.shouldRecomputeSelection(otherLayout)).isFalse()
     }
 
     @Test
     fun shouldRecomputeSelection_layoutBuilder_otherNull_returnsTrue() {
-        val layout = buildSelectionLayoutForTest(
-            previousSelection = getSelection()
-        ) {
-            appendInfoForTest(rawEndHandleOffset = 5, rawPreviousHandleOffset = 5)
-            appendInfoForTest(rawEndHandleOffset = 5, rawPreviousHandleOffset = 5)
-        }
+        val layout =
+            buildSelectionLayoutForTest(previousSelection = getSelection()) {
+                appendInfoForTest(rawEndHandleOffset = 5, rawPreviousHandleOffset = 5)
+                appendInfoForTest(rawEndHandleOffset = 5, rawPreviousHandleOffset = 5)
+            }
         assertThat(layout.shouldRecomputeSelection(null)).isTrue()
     }
 
     @Test
     fun shouldRecomputeSelection_layoutBuilder_otherSingle_returnsTrue() {
-        val layout = buildSelectionLayoutForTest(
-            previousSelection = getSelection()
-        ) {
-            appendInfoForTest(rawEndHandleOffset = 5, rawPreviousHandleOffset = 5)
-            appendInfoForTest(rawEndHandleOffset = 5, rawPreviousHandleOffset = 5)
-        }
-        val otherLayout = getSingleSelectionLayoutForTest(
-            previousSelection = getSelection(),
-            rawPreviousHandleOffset = 5
-        )
+        val layout =
+            buildSelectionLayoutForTest(previousSelection = getSelection()) {
+                appendInfoForTest(rawEndHandleOffset = 5, rawPreviousHandleOffset = 5)
+                appendInfoForTest(rawEndHandleOffset = 5, rawPreviousHandleOffset = 5)
+            }
+        val otherLayout =
+            getSingleSelectionLayoutForTest(
+                previousSelection = getSelection(),
+                rawPreviousHandleOffset = 5
+            )
         assertThat(layout.shouldRecomputeSelection(otherLayout)).isTrue()
     }
 
     @Test
     fun shouldRecomputeSelection_layoutBuilder_differentStartSlot_returnsTrue() {
-        val layout = buildSelectionLayoutForTest(
-            previousSelection = getSelection()
-        ) {
-            appendInfoForTest(
-                rawEndHandleOffset = 5,
-                rawPreviousHandleOffset = 5,
-                startYHandleDirection = BEFORE,
-                endYHandleDirection = AFTER,
-            )
-            appendInfoForTest(
-                rawEndHandleOffset = 5,
-                rawPreviousHandleOffset = 5,
-                startYHandleDirection = BEFORE,
-                endYHandleDirection = ON,
-            )
-        }
-        val otherLayout = buildSelectionLayoutForTest(
-            previousSelection = getSelection()
-        ) {
-            appendInfoForTest(
-                rawEndHandleOffset = 5,
-                rawPreviousHandleOffset = 5,
-                startYHandleDirection = ON,
-                endYHandleDirection = AFTER,
-            )
-            appendInfoForTest(
-                rawEndHandleOffset = 5,
-                rawPreviousHandleOffset = 5,
-                startYHandleDirection = BEFORE,
-                endYHandleDirection = ON,
-            )
-        }
+        val layout =
+            buildSelectionLayoutForTest(previousSelection = getSelection()) {
+                appendInfoForTest(
+                    rawEndHandleOffset = 5,
+                    rawPreviousHandleOffset = 5,
+                    startYHandleDirection = BEFORE,
+                    endYHandleDirection = AFTER,
+                )
+                appendInfoForTest(
+                    rawEndHandleOffset = 5,
+                    rawPreviousHandleOffset = 5,
+                    startYHandleDirection = BEFORE,
+                    endYHandleDirection = ON,
+                )
+            }
+        val otherLayout =
+            buildSelectionLayoutForTest(previousSelection = getSelection()) {
+                appendInfoForTest(
+                    rawEndHandleOffset = 5,
+                    rawPreviousHandleOffset = 5,
+                    startYHandleDirection = ON,
+                    endYHandleDirection = AFTER,
+                )
+                appendInfoForTest(
+                    rawEndHandleOffset = 5,
+                    rawPreviousHandleOffset = 5,
+                    startYHandleDirection = BEFORE,
+                    endYHandleDirection = ON,
+                )
+            }
         assertThat(layout.shouldRecomputeSelection(otherLayout)).isTrue()
     }
 
     @Test
     fun shouldRecomputeSelection_layoutBuilder_differentEndSlot_returnsTrue() {
-        val layout = buildSelectionLayoutForTest(
-            previousSelection = getSelection()
-        ) {
-            appendInfoForTest(
-                rawEndHandleOffset = 5,
-                rawPreviousHandleOffset = 5,
-                startYHandleDirection = ON,
-                endYHandleDirection = AFTER,
-            )
-            appendInfoForTest(
-                rawEndHandleOffset = 5,
-                rawPreviousHandleOffset = 5,
-                startYHandleDirection = BEFORE,
-                endYHandleDirection = AFTER,
-            )
-        }
-        val otherLayout = buildSelectionLayoutForTest(
-            previousSelection = getSelection()
-        ) {
-            appendInfoForTest(
-                rawEndHandleOffset = 5,
-                rawPreviousHandleOffset = 5,
-                startYHandleDirection = ON,
-                endYHandleDirection = AFTER,
-            )
-            appendInfoForTest(
-                rawEndHandleOffset = 5,
-                rawPreviousHandleOffset = 5,
-                startYHandleDirection = BEFORE,
-                endYHandleDirection = ON,
-            )
-        }
+        val layout =
+            buildSelectionLayoutForTest(previousSelection = getSelection()) {
+                appendInfoForTest(
+                    rawEndHandleOffset = 5,
+                    rawPreviousHandleOffset = 5,
+                    startYHandleDirection = ON,
+                    endYHandleDirection = AFTER,
+                )
+                appendInfoForTest(
+                    rawEndHandleOffset = 5,
+                    rawPreviousHandleOffset = 5,
+                    startYHandleDirection = BEFORE,
+                    endYHandleDirection = AFTER,
+                )
+            }
+        val otherLayout =
+            buildSelectionLayoutForTest(previousSelection = getSelection()) {
+                appendInfoForTest(
+                    rawEndHandleOffset = 5,
+                    rawPreviousHandleOffset = 5,
+                    startYHandleDirection = ON,
+                    endYHandleDirection = AFTER,
+                )
+                appendInfoForTest(
+                    rawEndHandleOffset = 5,
+                    rawPreviousHandleOffset = 5,
+                    startYHandleDirection = BEFORE,
+                    endYHandleDirection = ON,
+                )
+            }
         assertThat(layout.shouldRecomputeSelection(otherLayout)).isTrue()
     }
 
     @Test
     fun shouldRecomputeSelection_layoutBuilder_differentHandle_returnsTrue() {
-        val layout = buildSelectionLayoutForTest(
-            isStartHandle = true,
-            previousSelection = getSelection()
-        ) {
-            appendInfoForTest(rawEndHandleOffset = 5, rawPreviousHandleOffset = 5)
-            appendInfoForTest(rawEndHandleOffset = 5, rawPreviousHandleOffset = 5)
-        }
-        val otherLayout = buildSelectionLayoutForTest(
-            previousSelection = getSelection(),
-            isStartHandle = false
-        ) {
-            appendInfoForTest(rawEndHandleOffset = 5, rawPreviousHandleOffset = 5)
-            appendInfoForTest(rawEndHandleOffset = 5, rawPreviousHandleOffset = 5)
-        }
+        val layout =
+            buildSelectionLayoutForTest(isStartHandle = true, previousSelection = getSelection()) {
+                appendInfoForTest(rawEndHandleOffset = 5, rawPreviousHandleOffset = 5)
+                appendInfoForTest(rawEndHandleOffset = 5, rawPreviousHandleOffset = 5)
+            }
+        val otherLayout =
+            buildSelectionLayoutForTest(previousSelection = getSelection(), isStartHandle = false) {
+                appendInfoForTest(rawEndHandleOffset = 5, rawPreviousHandleOffset = 5)
+                appendInfoForTest(rawEndHandleOffset = 5, rawPreviousHandleOffset = 5)
+            }
         assertThat(layout.shouldRecomputeSelection(otherLayout)).isTrue()
     }
 
     @Test
     fun shouldRecomputeSelection_layoutBuilder_differentSize_returnsTrue() {
-        val layout = buildSelectionLayoutForTest(
-            previousSelection = getSelection()
-        ) {
-            appendInfoForTest(rawEndHandleOffset = 5, rawPreviousHandleOffset = 5)
-            appendInfoForTest(rawEndHandleOffset = 5, rawPreviousHandleOffset = 5)
-        }
-        val otherLayout = buildSelectionLayoutForTest(
-            previousSelection = getSelection()
-        ) {
-            appendInfoForTest(rawEndHandleOffset = 5, rawPreviousHandleOffset = 5)
-            appendInfoForTest(rawEndHandleOffset = 5, rawPreviousHandleOffset = 5)
-            appendInfoForTest(rawEndHandleOffset = 5, rawPreviousHandleOffset = 5)
-        }
+        val layout =
+            buildSelectionLayoutForTest(previousSelection = getSelection()) {
+                appendInfoForTest(rawEndHandleOffset = 5, rawPreviousHandleOffset = 5)
+                appendInfoForTest(rawEndHandleOffset = 5, rawPreviousHandleOffset = 5)
+            }
+        val otherLayout =
+            buildSelectionLayoutForTest(previousSelection = getSelection()) {
+                appendInfoForTest(rawEndHandleOffset = 5, rawPreviousHandleOffset = 5)
+                appendInfoForTest(rawEndHandleOffset = 5, rawPreviousHandleOffset = 5)
+                appendInfoForTest(rawEndHandleOffset = 5, rawPreviousHandleOffset = 5)
+            }
         assertThat(layout.shouldRecomputeSelection(otherLayout)).isTrue()
     }
 
     @Test
     fun shouldRecomputeSelection_layoutBuilder_differentInfo_returnsTrue() {
-        val layout = buildSelectionLayoutForTest(
-            previousSelection = getSelection()
-        ) {
-            appendInfoForTest(rawEndHandleOffset = 5, rawPreviousHandleOffset = 5)
-            appendInfoForTest(rawEndHandleOffset = 5, rawPreviousHandleOffset = 5)
-        }
-        val otherLayout = buildSelectionLayoutForTest(
-            previousSelection = getSelection()
-        ) {
-            appendInfoForTest(rawEndHandleOffset = 5, rawPreviousHandleOffset = 5)
-            appendInfoForTest(rawEndHandleOffset = 4, rawPreviousHandleOffset = 5)
-        }
+        val layout =
+            buildSelectionLayoutForTest(previousSelection = getSelection()) {
+                appendInfoForTest(rawEndHandleOffset = 5, rawPreviousHandleOffset = 5)
+                appendInfoForTest(rawEndHandleOffset = 5, rawPreviousHandleOffset = 5)
+            }
+        val otherLayout =
+            buildSelectionLayoutForTest(previousSelection = getSelection()) {
+                appendInfoForTest(rawEndHandleOffset = 5, rawPreviousHandleOffset = 5)
+                appendInfoForTest(rawEndHandleOffset = 4, rawPreviousHandleOffset = 5)
+            }
         assertThat(layout.shouldRecomputeSelection(otherLayout)).isTrue()
     }
 
     @Test
     fun shouldRecomputeSelection_layoutBuilder_sameLayout_returnsFalse() {
-        val layout = buildSelectionLayoutForTest(
-            previousSelection = getSelection()
-        ) {
-            appendInfoForTest(rawEndHandleOffset = 5, rawPreviousHandleOffset = 5)
-            appendInfoForTest(rawEndHandleOffset = 5, rawPreviousHandleOffset = 5)
-        }
+        val layout =
+            buildSelectionLayoutForTest(previousSelection = getSelection()) {
+                appendInfoForTest(rawEndHandleOffset = 5, rawPreviousHandleOffset = 5)
+                appendInfoForTest(rawEndHandleOffset = 5, rawPreviousHandleOffset = 5)
+            }
         assertThat(layout.shouldRecomputeSelection(layout)).isFalse()
     }
 
     @Test
     fun shouldRecomputeSelection_layoutBuilder_equalLayout_returnsFalse() {
-        val layout = buildSelectionLayoutForTest(
-            previousSelection = getSelection()
-        ) {
-            appendInfoForTest(rawEndHandleOffset = 5, rawPreviousHandleOffset = 5)
-            appendInfoForTest(rawEndHandleOffset = 5, rawPreviousHandleOffset = 5)
-        }
+        val layout =
+            buildSelectionLayoutForTest(previousSelection = getSelection()) {
+                appendInfoForTest(rawEndHandleOffset = 5, rawPreviousHandleOffset = 5)
+                appendInfoForTest(rawEndHandleOffset = 5, rawPreviousHandleOffset = 5)
+            }
         val otherLayout = buildSelectionLayoutForTest {
             appendInfoForTest(rawEndHandleOffset = 5, rawPreviousHandleOffset = 5)
             appendInfoForTest(rawEndHandleOffset = 5, rawPreviousHandleOffset = 5)
@@ -1005,8 +1007,7 @@
         val selection = getSelection(startOffset = 1, endOffset = 0, handlesCrossed = false)
         val actual = layout.createSubSelections(selection).toMap()
         assertThat(actual).hasSize(1)
-        assertThat(actual.toList().single().second)
-            .isEqualTo(selection.copy(handlesCrossed = true))
+        assertThat(actual.toList().single().second).isEqualTo(selection.copy(handlesCrossed = true))
     }
 
     @Test
@@ -1031,30 +1032,23 @@
 
     @Test
     fun createSubSelections_builtSingleLayout_validSelection_returnsInputSelection() {
-        val layout = buildSelectionLayoutForTest {
-            appendInfoForTest(selectableId = 1L)
-        }
+        val layout = buildSelectionLayoutForTest { appendInfoForTest(selectableId = 1L) }
         val selection = getSelection()
         assertThat(layout.createSubSelections(selection).toMap()).containsExactly(1L, selection)
     }
 
     @Test
     fun createSubSelections_layoutBuilder_missNonCrossedSingleSelection_returnsCrossedSelection() {
-        val layout = buildSelectionLayoutForTest {
-            appendInfoForTest(selectableId = 1L)
-        }
+        val layout = buildSelectionLayoutForTest { appendInfoForTest(selectableId = 1L) }
         val selection = getSelection(startOffset = 1, endOffset = 0, handlesCrossed = false)
         val actual = layout.createSubSelections(selection).toMap()
         assertThat(actual).hasSize(1)
-        assertThat(actual.toList().single().second)
-            .isEqualTo(selection.copy(handlesCrossed = true))
+        assertThat(actual.toList().single().second).isEqualTo(selection.copy(handlesCrossed = true))
     }
 
     @Test
     fun createSubSelections_layoutBuilder_missCrossedSingleSelection_returnsUncrossedSelection() {
-        val layout = buildSelectionLayoutForTest {
-            appendInfoForTest(selectableId = 1L)
-        }
+        val layout = buildSelectionLayoutForTest { appendInfoForTest(selectableId = 1L) }
         val selection = getSelection(startOffset = 0, endOffset = 1, handlesCrossed = true)
         val actual = layout.createSubSelections(selection).toMap()
         assertThat(actual).hasSize(1)
@@ -1087,10 +1081,13 @@
             )
         }
         val selection = getSelection(startSelectableId = 1L, endSelectableId = 2L)
-        assertThat(layout.createSubSelections(selection).toMap()).containsExactly(
-            1L, getSelection(startSelectableId = 1L, endSelectableId = 1L),
-            2L, getSelection(startSelectableId = 2L, endSelectableId = 2L),
-        )
+        assertThat(layout.createSubSelections(selection).toMap())
+            .containsExactly(
+                1L,
+                getSelection(startSelectableId = 1L, endSelectableId = 1L),
+                2L,
+                getSelection(startSelectableId = 2L, endSelectableId = 2L),
+            )
     }
 
     @Test
@@ -1113,11 +1110,15 @@
             )
         }
         val selection = getSelection(startSelectableId = 1L, endSelectableId = 3L)
-        assertThat(layout.createSubSelections(selection).toMap()).containsExactly(
-            1L, getSelection(startSelectableId = 1L, endSelectableId = 1L),
-            2L, getSelection(startSelectableId = 2L, endSelectableId = 2L),
-            3L, getSelection(startSelectableId = 3L, endSelectableId = 3L),
-        )
+        assertThat(layout.createSubSelections(selection).toMap())
+            .containsExactly(
+                1L,
+                getSelection(startSelectableId = 1L, endSelectableId = 1L),
+                2L,
+                getSelection(startSelectableId = 2L, endSelectableId = 2L),
+                3L,
+                getSelection(startSelectableId = 3L, endSelectableId = 3L),
+            )
     }
 
     @Test
@@ -1145,12 +1146,17 @@
             )
         }
         val selection = getSelection(startSelectableId = 1L, endSelectableId = 4L)
-        assertThat(layout.createSubSelections(selection).toMap()).containsExactly(
-            1L, getSelection(startSelectableId = 1L, endSelectableId = 1L),
-            2L, getSelection(startSelectableId = 2L, endSelectableId = 2L),
-            3L, getSelection(startSelectableId = 3L, endSelectableId = 3L),
-            4L, getSelection(startSelectableId = 4L, endSelectableId = 4L),
-        )
+        assertThat(layout.createSubSelections(selection).toMap())
+            .containsExactly(
+                1L,
+                getSelection(startSelectableId = 1L, endSelectableId = 1L),
+                2L,
+                getSelection(startSelectableId = 2L, endSelectableId = 2L),
+                3L,
+                getSelection(startSelectableId = 3L, endSelectableId = 3L),
+                4L,
+                getSelection(startSelectableId = 4L, endSelectableId = 4L),
+            )
     }
 
     @Test
@@ -1164,13 +1170,14 @@
                 rawEndHandleOffset = 0,
             )
         }
-        val selection = getSelection(
-            startSelectableId = 1L,
-            startOffset = 5,
-            endSelectableId = 1L,
-            endOffset = 0,
-            handlesCrossed = true
-        )
+        val selection =
+            getSelection(
+                startSelectableId = 1L,
+                startOffset = 5,
+                endSelectableId = 1L,
+                endOffset = 0,
+                handlesCrossed = true
+            )
         assertThat(layout.createSubSelections(selection).toMap()).containsExactly(1L, selection)
     }
 
@@ -1192,31 +1199,33 @@
                 rawEndHandleOffset = 0,
             )
         }
-        val selection = getSelection(
-            startSelectableId = 2L,
-            startOffset = 5,
-            endSelectableId = 1L,
-            endOffset = 0,
-            handlesCrossed = true
-        )
-        assertThat(layout.createSubSelections(selection).toMap()).containsExactly(
-            1L,
-            getSelection(
-                startSelectableId = 1L,
-                endSelectableId = 1L,
-                startOffset = 5,
-                endOffset = 0,
-                handlesCrossed = true
-            ),
-            2L,
+        val selection =
             getSelection(
                 startSelectableId = 2L,
-                endSelectableId = 2L,
                 startOffset = 5,
+                endSelectableId = 1L,
                 endOffset = 0,
                 handlesCrossed = true
-            ),
-        )
+            )
+        assertThat(layout.createSubSelections(selection).toMap())
+            .containsExactly(
+                1L,
+                getSelection(
+                    startSelectableId = 1L,
+                    endSelectableId = 1L,
+                    startOffset = 5,
+                    endOffset = 0,
+                    handlesCrossed = true
+                ),
+                2L,
+                getSelection(
+                    startSelectableId = 2L,
+                    endSelectableId = 2L,
+                    startOffset = 5,
+                    endOffset = 0,
+                    handlesCrossed = true
+                ),
+            )
     }
 
     @Test
@@ -1244,39 +1253,41 @@
                 rawEndHandleOffset = 0,
             )
         }
-        val selection = getSelection(
-            startSelectableId = 3L,
-            startOffset = 5,
-            endSelectableId = 1L,
-            endOffset = 0,
-            handlesCrossed = true
-        )
-        assertThat(layout.createSubSelections(selection).toMap()).containsExactly(
-            1L,
-            getSelection(
-                startSelectableId = 1L,
-                endSelectableId = 1L,
-                startOffset = 5,
-                endOffset = 0,
-                handlesCrossed = true
-            ),
-            2L,
-            getSelection(
-                startSelectableId = 2L,
-                endSelectableId = 2L,
-                startOffset = 5,
-                endOffset = 0,
-                handlesCrossed = true
-            ),
-            3L,
+        val selection =
             getSelection(
                 startSelectableId = 3L,
-                endSelectableId = 3L,
                 startOffset = 5,
+                endSelectableId = 1L,
                 endOffset = 0,
                 handlesCrossed = true
-            ),
-        )
+            )
+        assertThat(layout.createSubSelections(selection).toMap())
+            .containsExactly(
+                1L,
+                getSelection(
+                    startSelectableId = 1L,
+                    endSelectableId = 1L,
+                    startOffset = 5,
+                    endOffset = 0,
+                    handlesCrossed = true
+                ),
+                2L,
+                getSelection(
+                    startSelectableId = 2L,
+                    endSelectableId = 2L,
+                    startOffset = 5,
+                    endOffset = 0,
+                    handlesCrossed = true
+                ),
+                3L,
+                getSelection(
+                    startSelectableId = 3L,
+                    endSelectableId = 3L,
+                    startOffset = 5,
+                    endOffset = 0,
+                    handlesCrossed = true
+                ),
+            )
     }
 
     @Test
@@ -1311,47 +1322,49 @@
                 rawEndHandleOffset = 0,
             )
         }
-        val selection = getSelection(
-            startSelectableId = 4L,
-            startOffset = 5,
-            endSelectableId = 1L,
-            endOffset = 0,
-            handlesCrossed = true
-        )
-        assertThat(layout.createSubSelections(selection).toMap()).containsExactly(
-            1L,
-            getSelection(
-                startSelectableId = 1L,
-                endSelectableId = 1L,
-                startOffset = 5,
-                endOffset = 0,
-                handlesCrossed = true
-            ),
-            2L,
-            getSelection(
-                startSelectableId = 2L,
-                endSelectableId = 2L,
-                startOffset = 5,
-                endOffset = 0,
-                handlesCrossed = true
-            ),
-            3L,
-            getSelection(
-                startSelectableId = 3L,
-                endSelectableId = 3L,
-                startOffset = 5,
-                endOffset = 0,
-                handlesCrossed = true
-            ),
-            4L,
+        val selection =
             getSelection(
                 startSelectableId = 4L,
-                endSelectableId = 4L,
                 startOffset = 5,
+                endSelectableId = 1L,
                 endOffset = 0,
                 handlesCrossed = true
-            ),
-        )
+            )
+        assertThat(layout.createSubSelections(selection).toMap())
+            .containsExactly(
+                1L,
+                getSelection(
+                    startSelectableId = 1L,
+                    endSelectableId = 1L,
+                    startOffset = 5,
+                    endOffset = 0,
+                    handlesCrossed = true
+                ),
+                2L,
+                getSelection(
+                    startSelectableId = 2L,
+                    endSelectableId = 2L,
+                    startOffset = 5,
+                    endOffset = 0,
+                    handlesCrossed = true
+                ),
+                3L,
+                getSelection(
+                    startSelectableId = 3L,
+                    endSelectableId = 3L,
+                    startOffset = 5,
+                    endOffset = 0,
+                    handlesCrossed = true
+                ),
+                4L,
+                getSelection(
+                    startSelectableId = 4L,
+                    endSelectableId = 4L,
+                    startOffset = 5,
+                    endOffset = 0,
+                    handlesCrossed = true
+                ),
+            )
     }
 
     @Test
@@ -1387,137 +1400,158 @@
 
     @Test
     fun selection_isCollapsed_layoutBuilder_twoLayouts_empty_returnsTrue() {
-        val selection = getSelection(
-            startSelectableId = 1L,
-            startOffset = 0,
-            endSelectableId = 2L,
-            endOffset = 0
-        )
-        val layout = getSelectionLayoutFake(
-            infos = listOf(
-                getSelectableInfoFake(selectableId = 1L, text = ""),
-                getSelectableInfoFake(selectableId = 2L, text = ""),
-            ),
-            startSlot = 1,
-            endSlot = 3,
-        )
+        val selection =
+            getSelection(
+                startSelectableId = 1L,
+                startOffset = 0,
+                endSelectableId = 2L,
+                endOffset = 0
+            )
+        val layout =
+            getSelectionLayoutFake(
+                infos =
+                    listOf(
+                        getSelectableInfoFake(selectableId = 1L, text = ""),
+                        getSelectableInfoFake(selectableId = 2L, text = ""),
+                    ),
+                startSlot = 1,
+                endSlot = 3,
+            )
         assertThat(selection.isCollapsed(layout)).isTrue()
     }
 
     @Test
     fun selection_isCollapsed_layoutBuilder_twoLayouts_collapsed_returnsTrue() {
-        val selection = getSelection(
-            startSelectableId = 1L,
-            startOffset = 5,
-            endSelectableId = 2L,
-            endOffset = 0
-        )
-        val layout = getSelectionLayoutFake(
-            infos = listOf(
-                getSelectableInfoFake(selectableId = 1L, text = "hello"),
-                getSelectableInfoFake(selectableId = 2L, text = "hello"),
-            ),
-            startSlot = 1,
-            endSlot = 3,
-        )
+        val selection =
+            getSelection(
+                startSelectableId = 1L,
+                startOffset = 5,
+                endSelectableId = 2L,
+                endOffset = 0
+            )
+        val layout =
+            getSelectionLayoutFake(
+                infos =
+                    listOf(
+                        getSelectableInfoFake(selectableId = 1L, text = "hello"),
+                        getSelectableInfoFake(selectableId = 2L, text = "hello"),
+                    ),
+                startSlot = 1,
+                endSlot = 3,
+            )
         assertThat(selection.isCollapsed(layout)).isTrue()
     }
 
     @Test
     fun selection_isCollapsed_layoutBuilder_twoLayouts_notCollapsedInFirst_returnsFalse() {
-        val selection = getSelection(
-            startSelectableId = 1L,
-            startOffset = 4,
-            endSelectableId = 2L,
-            endOffset = 0
-        )
-        val layout = getSelectionLayoutFake(
-            infos = listOf(
-                getSelectableInfoFake(selectableId = 1L, text = "hello"),
-                getSelectableInfoFake(selectableId = 2L, text = "hello"),
-            ),
-            startSlot = 1,
-            endSlot = 3,
-        )
+        val selection =
+            getSelection(
+                startSelectableId = 1L,
+                startOffset = 4,
+                endSelectableId = 2L,
+                endOffset = 0
+            )
+        val layout =
+            getSelectionLayoutFake(
+                infos =
+                    listOf(
+                        getSelectableInfoFake(selectableId = 1L, text = "hello"),
+                        getSelectableInfoFake(selectableId = 2L, text = "hello"),
+                    ),
+                startSlot = 1,
+                endSlot = 3,
+            )
         assertThat(selection.isCollapsed(layout)).isFalse()
     }
 
     @Test
     fun selection_isCollapsed_layoutBuilder_twoLayouts_notCollapsedInSecond_returnsFalse() {
-        val selection = getSelection(
-            startSelectableId = 1L,
-            startOffset = 5,
-            endSelectableId = 2L,
-            endOffset = 1
-        )
-        val layout = getSelectionLayoutFake(
-            infos = listOf(
-                getSelectableInfoFake(selectableId = 1L, text = "hello"),
-                getSelectableInfoFake(selectableId = 2L, text = "hello"),
-            ),
-            startSlot = 1,
-            endSlot = 3,
-        )
+        val selection =
+            getSelection(
+                startSelectableId = 1L,
+                startOffset = 5,
+                endSelectableId = 2L,
+                endOffset = 1
+            )
+        val layout =
+            getSelectionLayoutFake(
+                infos =
+                    listOf(
+                        getSelectableInfoFake(selectableId = 1L, text = "hello"),
+                        getSelectableInfoFake(selectableId = 2L, text = "hello"),
+                    ),
+                startSlot = 1,
+                endSlot = 3,
+            )
         assertThat(selection.isCollapsed(layout)).isFalse()
     }
 
     @Test
     fun selection_isCollapsed_layoutBuilder_threeLayouts_empty_returnsTrue() {
-        val selection = getSelection(
-            startSelectableId = 1L,
-            startOffset = 0,
-            endSelectableId = 3L,
-            endOffset = 0
-        )
-        val layout = getSelectionLayoutFake(
-            infos = listOf(
-                getSelectableInfoFake(selectableId = 1L, text = ""),
-                getSelectableInfoFake(selectableId = 2L, text = ""),
-                getSelectableInfoFake(selectableId = 3L, text = ""),
-            ),
-            startSlot = 1,
-            endSlot = 5,
-        )
+        val selection =
+            getSelection(
+                startSelectableId = 1L,
+                startOffset = 0,
+                endSelectableId = 3L,
+                endOffset = 0
+            )
+        val layout =
+            getSelectionLayoutFake(
+                infos =
+                    listOf(
+                        getSelectableInfoFake(selectableId = 1L, text = ""),
+                        getSelectableInfoFake(selectableId = 2L, text = ""),
+                        getSelectableInfoFake(selectableId = 3L, text = ""),
+                    ),
+                startSlot = 1,
+                endSlot = 5,
+            )
         assertThat(selection.isCollapsed(layout)).isTrue()
     }
 
     @Test
     fun selection_isCollapsed_layoutBuilder_threeLayouts_collapsed_returnsTrue() {
-        val selection = getSelection(
-            startSelectableId = 1L,
-            startOffset = 5,
-            endSelectableId = 3L,
-            endOffset = 0
-        )
-        val layout = getSelectionLayoutFake(
-            infos = listOf(
-                getSelectableInfoFake(selectableId = 1L, text = "hello"),
-                getSelectableInfoFake(selectableId = 2L, text = ""),
-                getSelectableInfoFake(selectableId = 3L, text = "hello"),
-            ),
-            startSlot = 1,
-            endSlot = 5,
-        )
+        val selection =
+            getSelection(
+                startSelectableId = 1L,
+                startOffset = 5,
+                endSelectableId = 3L,
+                endOffset = 0
+            )
+        val layout =
+            getSelectionLayoutFake(
+                infos =
+                    listOf(
+                        getSelectableInfoFake(selectableId = 1L, text = "hello"),
+                        getSelectableInfoFake(selectableId = 2L, text = ""),
+                        getSelectableInfoFake(selectableId = 3L, text = "hello"),
+                    ),
+                startSlot = 1,
+                endSlot = 5,
+            )
         assertThat(selection.isCollapsed(layout)).isTrue()
     }
 
     @Test
     fun selection_isCollapsed_layoutBuilder_threeLayouts_notCollapsed_returnsFalse() {
-        val selection = getSelection(
-            startSelectableId = 1L,
-            startOffset = 5,
-            endSelectableId = 3L,
-            endOffset = 0
-        )
-        val layout = getSelectionLayoutFake(
-            infos = listOf(
-                getSelectableInfoFake(selectableId = 1L, text = "hello"),
-                getSelectableInfoFake(selectableId = 2L, text = "."),
-                getSelectableInfoFake(selectableId = 3L, text = "hello"),
-            ),
-            startSlot = 1,
-            endSlot = 5,
-        )
+        val selection =
+            getSelection(
+                startSelectableId = 1L,
+                startOffset = 5,
+                endSelectableId = 3L,
+                endOffset = 0
+            )
+        val layout =
+            getSelectionLayoutFake(
+                infos =
+                    listOf(
+                        getSelectableInfoFake(selectableId = 1L, text = "hello"),
+                        getSelectableInfoFake(selectableId = 2L, text = "."),
+                        getSelectableInfoFake(selectableId = 3L, text = "hello"),
+                    ),
+                startSlot = 1,
+                endSlot = 5,
+            )
         assertThat(selection.isCollapsed(layout)).isFalse()
     }
 
@@ -1534,16 +1568,17 @@
     ): SelectionLayout {
         contract { callsInPlace(block, InvocationKind.EXACTLY_ONCE) }
         return SelectionLayoutBuilder(
-            currentPosition = currentPosition,
-            previousHandlePosition = previousHandlePosition,
-            containerCoordinates = containerCoordinates,
-            isStartHandle = isStartHandle,
-            previousSelection = previousSelection,
-            selectableIdOrderingComparator = selectableIdOrderingComparator,
-        ).run {
-            block()
-            build()
-        }
+                currentPosition = currentPosition,
+                previousHandlePosition = previousHandlePosition,
+                containerCoordinates = containerCoordinates,
+                isStartHandle = isStartHandle,
+                previousSelection = previousSelection,
+                selectableIdOrderingComparator = selectableIdOrderingComparator,
+            )
+            .run {
+                block()
+                build()
+            }
     }
 
     private fun SelectionLayoutBuilder.appendInfoForTest(
@@ -1560,12 +1595,13 @@
         wordBoundaries: List<TextRange> = listOf(),
         lineBreaks: List<Int> = emptyList(),
     ): SelectableInfo {
-        val layoutResult = getTextLayoutResultMock(
-            text = text,
-            rtlCharRanges = rtlRanges,
-            wordBoundaries = wordBoundaries,
-            lineBreaks = lineBreaks,
-        )
+        val layoutResult =
+            getTextLayoutResultMock(
+                text = text,
+                rtlCharRanges = rtlRanges,
+                wordBoundaries = wordBoundaries,
+                lineBreaks = lineBreaks,
+            )
         return appendInfo(
             selectableId = selectableId,
             rawStartHandleOffset = rawStartHandleOffset,
@@ -1592,12 +1628,13 @@
         previousSelection: Selection? = null,
         isStartOfSelection: Boolean = previousSelection == null,
     ): SelectionLayout {
-        val layoutResult = getTextLayoutResultMock(
-            text = text,
-            rtlCharRanges = rtlRanges,
-            wordBoundaries = wordBoundaries,
-            lineBreaks = lineBreaks,
-        )
+        val layoutResult =
+            getTextLayoutResultMock(
+                text = text,
+                rtlCharRanges = rtlRanges,
+                wordBoundaries = wordBoundaries,
+                lineBreaks = lineBreaks,
+            )
         return getTextFieldSelectionLayout(
             layoutResult = layoutResult,
             rawStartHandleOffset = rawStartHandleOffset,
diff --git a/compose/foundation/foundation/src/androidUnitTest/kotlin/androidx/compose/foundation/text/selection/SelectionManagerGetSelectedRegionRectTest.kt b/compose/foundation/foundation/src/androidUnitTest/kotlin/androidx/compose/foundation/text/selection/SelectionManagerGetSelectedRegionRectTest.kt
index 96a2bd4..87bab5f 100644
--- a/compose/foundation/foundation/src/androidUnitTest/kotlin/androidx/compose/foundation/text/selection/SelectionManagerGetSelectedRegionRectTest.kt
+++ b/compose/foundation/foundation/src/androidUnitTest/kotlin/androidx/compose/foundation/text/selection/SelectionManagerGetSelectedRegionRectTest.kt
@@ -30,130 +30,147 @@
 class SelectionManagerGetSelectedRegionRectTest {
     private val rectSideLength = 15f
 
-    private val emptyResultRect = Rect(
-        left = Float.POSITIVE_INFINITY,
-        top = Float.POSITIVE_INFINITY,
-        right = Float.NEGATIVE_INFINITY,
-        bottom = Float.NEGATIVE_INFINITY
-    )
+    private val emptyResultRect =
+        Rect(
+            left = Float.POSITIVE_INFINITY,
+            top = Float.POSITIVE_INFINITY,
+            right = Float.NEGATIVE_INFINITY,
+            bottom = Float.NEGATIVE_INFINITY
+        )
 
     @Test
     fun whenNoSelectables_returnsDefaultEmpty() {
-        val result = getSelectedRegionRect(
-            selectableSubSelectionPairs = listOf(),
-            containerCoordinates = FakeCoordinates()
-        )
+        val result =
+            getSelectedRegionRect(
+                selectableSubSelectionPairs = listOf(),
+                containerCoordinates = FakeCoordinates()
+            )
         assertThat(result).isEqualTo(emptyResultRect)
     }
 
     @Test
     fun whenOnlySelectableHasNoLayoutCoordinates_returnsDefaultEmpty() {
-        val result = getSelectedRegionRect(
-            selectableSubSelectionPairs = listOf(
-                getPair(
-                    boundingBoxes = boundingBoxesInLine(size = 10),
-                    selection = getSelection(startOffset = 0, endOffset = 10),
-                    rootOffset = null,
-                ),
-            ),
-            containerCoordinates = FakeCoordinates()
-        )
+        val result =
+            getSelectedRegionRect(
+                selectableSubSelectionPairs =
+                    listOf(
+                        getPair(
+                            boundingBoxes = boundingBoxesInLine(size = 10),
+                            selection = getSelection(startOffset = 0, endOffset = 10),
+                            rootOffset = null,
+                        ),
+                    ),
+                containerCoordinates = FakeCoordinates()
+            )
         assertThat(result).isEqualTo(emptyResultRect)
     }
 
     @Test
     fun whenCollapsedSelection_returnsDefaultEmpty() {
-        val result = getSelectedRegionRect(
-            selectableSubSelectionPairs = listOf(
-                getPair(
-                    boundingBoxes = boundingBoxesInLine(size = 10),
-                    selection = getSelection(startOffset = 5, endOffset = 5),
-                ),
-            ),
-            containerCoordinates = FakeCoordinates()
-        )
+        val result =
+            getSelectedRegionRect(
+                selectableSubSelectionPairs =
+                    listOf(
+                        getPair(
+                            boundingBoxes = boundingBoxesInLine(size = 10),
+                            selection = getSelection(startOffset = 5, endOffset = 5),
+                        ),
+                    ),
+                containerCoordinates = FakeCoordinates()
+            )
         assertThat(result).isEqualTo(emptyResultRect)
     }
 
     @Test
     fun whenNoWrapping_rectIsShortAndWide() {
-        val result = getSelectedRegionRect(
-            selectableSubSelectionPairs = listOf(
-                getPair(
-                    boundingBoxes = boundingBoxesInLine(size = 10),
-                    selection = getSelection(startOffset = 0, endOffset = 10),
-                ),
-            ),
-            containerCoordinates = FakeCoordinates()
-        )
+        val result =
+            getSelectedRegionRect(
+                selectableSubSelectionPairs =
+                    listOf(
+                        getPair(
+                            boundingBoxes = boundingBoxesInLine(size = 10),
+                            selection = getSelection(startOffset = 0, endOffset = 10),
+                        ),
+                    ),
+                containerCoordinates = FakeCoordinates()
+            )
         val expected = rectInUnits(left = 0, top = 0, right = 10, bottom = 1)
         assertThat(result).isEqualTo(expected)
     }
 
     @Test
     fun whenWrapping_rectIsSlightlyTallerAndSkinnier() {
-        val result = getSelectedRegionRect(
-            selectableSubSelectionPairs = listOf(
-                getPair(
-                    boundingBoxes = boundingBoxesWrapped(size = 10, lineLength = 5),
-                    selection = getSelection(startOffset = 0, endOffset = 10),
-                ),
-            ),
-            containerCoordinates = FakeCoordinates(),
-        )
+        val result =
+            getSelectedRegionRect(
+                selectableSubSelectionPairs =
+                    listOf(
+                        getPair(
+                            boundingBoxes = boundingBoxesWrapped(size = 10, lineLength = 5),
+                            selection = getSelection(startOffset = 0, endOffset = 10),
+                        ),
+                    ),
+                containerCoordinates = FakeCoordinates(),
+            )
         val expected = rectInUnits(left = 0, top = 0, right = 5, bottom = 2)
         assertThat(result).isEqualTo(expected)
     }
 
     @Test
     fun whenRootOffsetsChangeEqually_resultDoesNotChange() {
-        val result = getSelectedRegionRect(
-            selectableSubSelectionPairs = listOf(
-                getPair(
-                    boundingBoxes = boundingBoxesWrapped(size = 10, lineLength = 5),
-                    selection = getSelection(startOffset = 0, endOffset = 10),
-                    rootOffset = offsetInUnits(x = 1, y = 1),
-                ),
-            ),
-            containerCoordinates = FakeCoordinates(rootOffset = offsetInUnits(x = 1, y = 1)),
-        )
+        val result =
+            getSelectedRegionRect(
+                selectableSubSelectionPairs =
+                    listOf(
+                        getPair(
+                            boundingBoxes = boundingBoxesWrapped(size = 10, lineLength = 5),
+                            selection = getSelection(startOffset = 0, endOffset = 10),
+                            rootOffset = offsetInUnits(x = 1, y = 1),
+                        ),
+                    ),
+                containerCoordinates = FakeCoordinates(rootOffset = offsetInUnits(x = 1, y = 1)),
+            )
         val expected = rectInUnits(left = 0, top = 0, right = 5, bottom = 2)
         assertThat(result).isEqualTo(expected)
     }
 
     @Test
     fun whenDifferentCoordinates_resultChangesByTheDifference() {
-        val result = getSelectedRegionRect(
-            selectableSubSelectionPairs = listOf(
-                getPair(
-                    boundingBoxes = boundingBoxesWrapped(size = 10, lineLength = 5),
-                    selection = getSelection(startOffset = 0, endOffset = 10),
-                    rootOffset = offsetInUnits(x = 2, y = 2),
-                ),
-            ),
-            containerCoordinates = FakeCoordinates(rootOffset = offsetInUnits(x = 1, y = 1)),
-        )
-        val expected = rectInUnits(left = 0, top = 0, right = 5, bottom = 2)
-            .translate(offsetInUnits(x = 1, y = 1))
+        val result =
+            getSelectedRegionRect(
+                selectableSubSelectionPairs =
+                    listOf(
+                        getPair(
+                            boundingBoxes = boundingBoxesWrapped(size = 10, lineLength = 5),
+                            selection = getSelection(startOffset = 0, endOffset = 10),
+                            rootOffset = offsetInUnits(x = 2, y = 2),
+                        ),
+                    ),
+                containerCoordinates = FakeCoordinates(rootOffset = offsetInUnits(x = 1, y = 1)),
+            )
+        val expected =
+            rectInUnits(left = 0, top = 0, right = 5, bottom = 2)
+                .translate(offsetInUnits(x = 1, y = 1))
         assertThat(result).isEqualTo(expected)
     }
 
     @Test
     fun whenTwoSelectables_resultTracksBoth() {
-        val result = getSelectedRegionRect(
-            selectableSubSelectionPairs = listOf(
-                getPair(
-                    boundingBoxes = boundingBoxesInLine(size = 5),
-                    selection = getSelection(startOffset = 0, endOffset = 5),
-                ),
-                getPair(
-                    boundingBoxes = boundingBoxesInLine(size = 5),
-                    selection = getSelection(startOffset = 0, endOffset = 5),
-                    rootOffset = offsetInUnits(x = 0, y = 1),
-                ),
-            ),
-            containerCoordinates = FakeCoordinates(),
-        )
+        val result =
+            getSelectedRegionRect(
+                selectableSubSelectionPairs =
+                    listOf(
+                        getPair(
+                            boundingBoxes = boundingBoxesInLine(size = 5),
+                            selection = getSelection(startOffset = 0, endOffset = 5),
+                        ),
+                        getPair(
+                            boundingBoxes = boundingBoxesInLine(size = 5),
+                            selection = getSelection(startOffset = 0, endOffset = 5),
+                            rootOffset = offsetInUnits(x = 0, y = 1),
+                        ),
+                    ),
+                containerCoordinates = FakeCoordinates(),
+            )
         val expected = rectInUnits(left = 0, top = 0, right = 5, bottom = 2)
         assertThat(result).isEqualTo(expected)
     }
@@ -162,42 +179,45 @@
     fun whenMultipleSelectables_resultSurroundsSmallestPossibleRect() {
         // These subselections are nonsense, but are used
         // so that we can test various aspects of the function
-        val result = getSelectedRegionRect(
-            selectableSubSelectionPairs = listOf(
-                getPair( // not used due to collapsed selection
-                    boundingBoxes = boundingBoxesInLine(size = 5),
-                    selection = getSelection(startOffset = 4, endOffset = 4),
-                    rootOffset = offsetInUnits(x = 0, y = 0),
-                ),
-                getPair( // coordinates has this indented 4 units
-                    boundingBoxes = boundingBoxesInLine(size = 5),
-                    selection = getSelection(startOffset = 0, endOffset = 4),
-                    rootOffset = offsetInUnits(x = 4, y = 1),
-                ),
-                getPair( // selection only contains offset 4
-                    boundingBoxes = boundingBoxesInLine(size = 5),
-                    selection = getSelection(startOffset = 4, endOffset = 5),
-                    rootOffset = offsetInUnits(x = 0, y = 2),
-                ),
-                getPair( // doesn't have coordinates, ignored
-                    boundingBoxes = boundingBoxesInLine(size = 5),
-                    selection = getSelection(startOffset = 0, endOffset = 5),
-                    rootOffset = null,
-                ),
-                getPair( // selection only contains offset 2
-                    boundingBoxes = boundingBoxesInLine(size = 5),
-                    selection = getSelection(startOffset = 2, endOffset = 3),
-                    rootOffset = offsetInUnits(x = 0, y = 3),
-                ),
-            ),
-            containerCoordinates = FakeCoordinates(),
-        )
-        val expected = rectInUnits(
-            left = 2, // offset 2 from the 5th pair
-            top = 1, // 2nd pair has first selected char
-            right = 8, // 2nd pair has 4 unit indent and 4th char selected
-            bottom = 4 // 5th pair has final selected char
-        )
+        val result =
+            getSelectedRegionRect(
+                selectableSubSelectionPairs =
+                    listOf(
+                        getPair( // not used due to collapsed selection
+                            boundingBoxes = boundingBoxesInLine(size = 5),
+                            selection = getSelection(startOffset = 4, endOffset = 4),
+                            rootOffset = offsetInUnits(x = 0, y = 0),
+                        ),
+                        getPair( // coordinates has this indented 4 units
+                            boundingBoxes = boundingBoxesInLine(size = 5),
+                            selection = getSelection(startOffset = 0, endOffset = 4),
+                            rootOffset = offsetInUnits(x = 4, y = 1),
+                        ),
+                        getPair( // selection only contains offset 4
+                            boundingBoxes = boundingBoxesInLine(size = 5),
+                            selection = getSelection(startOffset = 4, endOffset = 5),
+                            rootOffset = offsetInUnits(x = 0, y = 2),
+                        ),
+                        getPair( // doesn't have coordinates, ignored
+                            boundingBoxes = boundingBoxesInLine(size = 5),
+                            selection = getSelection(startOffset = 0, endOffset = 5),
+                            rootOffset = null,
+                        ),
+                        getPair( // selection only contains offset 2
+                            boundingBoxes = boundingBoxesInLine(size = 5),
+                            selection = getSelection(startOffset = 2, endOffset = 3),
+                            rootOffset = offsetInUnits(x = 0, y = 3),
+                        ),
+                    ),
+                containerCoordinates = FakeCoordinates(),
+            )
+        val expected =
+            rectInUnits(
+                left = 2, // offset 2 from the 5th pair
+                top = 1, // 2nd pair has first selected char
+                right = 8, // 2nd pair has 4 unit indent and 4th char selected
+                bottom = 4 // 5th pair has final selected char
+            )
         assertThat(result).isEqualTo(expected)
     }
 
@@ -217,29 +237,31 @@
             rectInUnits(left = lineOffset, top = line, right = lineOffset + 1, bottom = line + 1)
         }
 
-    private fun rectInUnits(left: Int, top: Int, right: Int, bottom: Int): Rect = Rect(
-        left = rectSideLength * left,
-        top = rectSideLength * top,
-        right = rectSideLength * right,
-        bottom = rectSideLength * bottom,
-    )
+    private fun rectInUnits(left: Int, top: Int, right: Int, bottom: Int): Rect =
+        Rect(
+            left = rectSideLength * left,
+            top = rectSideLength * top,
+            right = rectSideLength * right,
+            bottom = rectSideLength * bottom,
+        )
 
-    private fun offsetInUnits(x: Int, y: Int): Offset = Offset(
-        x = rectSideLength * x,
-        y = rectSideLength * y,
-    )
+    private fun offsetInUnits(x: Int, y: Int): Offset =
+        Offset(
+            x = rectSideLength * x,
+            y = rectSideLength * y,
+        )
 
     private fun fakeSelectable(
         boundingBoxes: Map<Int, Rect>,
         rootOffset: Offset? = Offset.Zero,
-    ): Selectable = FakeSelectable().apply {
-        this.boundingBoxes = boundingBoxes
-        this.layoutCoordinatesToReturn = rootOffset?.let { FakeCoordinates(it) }
-    }
+    ): Selectable =
+        FakeSelectable().apply {
+            this.boundingBoxes = boundingBoxes
+            this.layoutCoordinatesToReturn = rootOffset?.let { FakeCoordinates(it) }
+        }
 
-    private class FakeCoordinates(
-        private val rootOffset: Offset = Offset.Zero
-    ) : LayoutCoordinates {
+    private class FakeCoordinates(private val rootOffset: Offset = Offset.Zero) :
+        LayoutCoordinates {
         override fun localToRoot(relativeToLocal: Offset): Offset = rootOffset + relativeToLocal
 
         override fun localPositionOf(
@@ -251,11 +273,20 @@
         }
 
         // FAKES
-        override val size: IntSize get() = fake()
-        override val providedAlignmentLines: Set<AlignmentLine> get() = fake()
-        override val parentLayoutCoordinates: LayoutCoordinates get() = fake()
-        override val parentCoordinates: LayoutCoordinates get() = fake()
-        override val isAttached: Boolean get() = fake()
+        override val size: IntSize
+            get() = fake()
+
+        override val providedAlignmentLines: Set<AlignmentLine>
+            get() = fake()
+
+        override val parentLayoutCoordinates: LayoutCoordinates
+            get() = fake()
+
+        override val parentCoordinates: LayoutCoordinates
+            get() = fake()
+
+        override val isAttached: Boolean
+            get() = fake()
 
         override fun windowToLocal(relativeToWindow: Offset): Offset = fake()
 
diff --git a/compose/foundation/foundation/src/androidUnitTest/kotlin/androidx/compose/foundation/text/selection/SelectionManagerTest.kt b/compose/foundation/foundation/src/androidUnitTest/kotlin/androidx/compose/foundation/text/selection/SelectionManagerTest.kt
index 085643e..27d63ed 100644
--- a/compose/foundation/foundation/src/androidUnitTest/kotlin/androidx/compose/foundation/text/selection/SelectionManagerTest.kt
+++ b/compose/foundation/foundation/src/androidUnitTest/kotlin/androidx/compose/foundation/text/selection/SelectionManagerTest.kt
@@ -55,37 +55,35 @@
     private val containerLayoutCoordinates = MockCoordinates()
 
     private val startSelectableId = 2L
-    private val startSelectable = mock<Selectable> {
-        whenever(it.selectableId).thenReturn(startSelectableId)
-    }
+    private val startSelectable =
+        mock<Selectable> { whenever(it.selectableId).thenReturn(startSelectableId) }
 
     private val endSelectableId = 3L
-    private val endSelectable = mock<Selectable> {
-        whenever(it.selectableId).thenReturn(endSelectableId)
-    }
+    private val endSelectable =
+        mock<Selectable> { whenever(it.selectableId).thenReturn(endSelectableId) }
 
     private val middleSelectableId = 4L
-    private val middleSelectable = mock<Selectable> {
-        whenever(it.selectableId).thenReturn(middleSelectableId)
-    }
+    private val middleSelectable =
+        mock<Selectable> { whenever(it.selectableId).thenReturn(middleSelectableId) }
 
     private val lastSelectableId = 5L
-    private val lastSelectable = mock<Selectable> {
-        whenever(it.selectableId).thenReturn(lastSelectableId)
-    }
+    private val lastSelectable =
+        mock<Selectable> { whenever(it.selectableId).thenReturn(lastSelectableId) }
 
     private val fakeSelection =
         Selection(
-            start = Selection.AnchorInfo(
-                direction = ResolvedTextDirection.Ltr,
-                offset = 0,
-                selectableId = startSelectableId
-            ),
-            end = Selection.AnchorInfo(
-                direction = ResolvedTextDirection.Ltr,
-                offset = 5,
-                selectableId = endSelectableId
-            )
+            start =
+                Selection.AnchorInfo(
+                    direction = ResolvedTextDirection.Ltr,
+                    offset = 0,
+                    selectableId = startSelectableId
+                ),
+            end =
+                Selection.AnchorInfo(
+                    direction = ResolvedTextDirection.Ltr,
+                    offset = 5,
+                    selectableId = endSelectableId
+                )
         )
 
     private val hapticFeedback = mock<HapticFeedback>()
@@ -97,11 +95,15 @@
         selectable.clear()
         selectable.selectableId = selectableId
         selectionRegistrar.subscribe(selectable)
-        selectionRegistrar.subselections = longObjectMapOf(
-            selectableId, fakeSelection,
-            startSelectableId, fakeSelection,
-            endSelectableId, fakeSelection
-        )
+        selectionRegistrar.subselections =
+            longObjectMapOf(
+                selectableId,
+                fakeSelection,
+                startSelectableId,
+                fakeSelection,
+                endSelectableId,
+                fakeSelection
+            )
         selectionManager.containerLayoutCoordinates = containerLayoutCoordinates
         selectionManager.hapticFeedBack = hapticFeedback
         selectionManager.clipboardManager = clipboardManager
@@ -119,12 +121,13 @@
             rawEndHandleOffset = 5
         }
 
-        val actual = selectionManager.updateSelection(
-            position = endHandlePosition,
-            previousHandlePosition = endHandlePosition - Offset(x = 5f, y = 0f),
-            isStartHandle = false,
-            adjustment = SelectionAdjustment.None,
-        )
+        val actual =
+            selectionManager.updateSelection(
+                position = endHandlePosition,
+                previousHandlePosition = endHandlePosition - Offset(x = 5f, y = 0f),
+                isStartHandle = false,
+                adjustment = SelectionAdjustment.None,
+            )
 
         assertThat(actual).isTrue()
         assertThat(onSelectionChangeCalledTimes).isEqualTo(1)
@@ -149,12 +152,13 @@
         )
 
         // run again since we are testing the "no changes" case
-        val actual = selectionManager.updateSelection(
-            position = endHandlePosition,
-            previousHandlePosition = endHandlePosition,
-            isStartHandle = false,
-            adjustment = SelectionAdjustment.None,
-        )
+        val actual =
+            selectionManager.updateSelection(
+                position = endHandlePosition,
+                previousHandlePosition = endHandlePosition,
+                isStartHandle = false,
+                adjustment = SelectionAdjustment.None,
+            )
 
         assertThat(actual).isFalse()
         assertThat(onSelectionChangeCalledTimes).isEqualTo(1)
@@ -180,12 +184,13 @@
 
         // run again with a change in end handle
         selectable.rawEndHandleOffset = 4
-        val actual = selectionManager.updateSelection(
-            position = endHandlePosition,
-            previousHandlePosition = endHandlePosition - Offset(x = 5f, y = 0f),
-            isStartHandle = false,
-            adjustment = SelectionAdjustment.None,
-        )
+        val actual =
+            selectionManager.updateSelection(
+                position = endHandlePosition,
+                previousHandlePosition = endHandlePosition - Offset(x = 5f, y = 0f),
+                isStartHandle = false,
+                adjustment = SelectionAdjustment.None,
+            )
 
         assertThat(actual).isTrue()
         assertThat(onSelectionChangeCalledTimes).isEqualTo(2)
@@ -229,10 +234,7 @@
         )
 
         verify(selectableAnother, times(0)).getSelectAllSelection()
-        verify(
-            hapticFeedback,
-            times(1)
-        ).performHapticFeedback(HapticFeedbackType.TextHandleMove)
+        verify(hapticFeedback, times(1)).performHapticFeedback(HapticFeedbackType.TextHandleMove)
     }
 
     @Test
@@ -242,19 +244,22 @@
         val startOffset = text.indexOf('e')
         val endOffset = text.indexOf('m')
         selectable.textToReturn = annotatedString
-        val selection = Selection(
-            start = Selection.AnchorInfo(
-                direction = ResolvedTextDirection.Ltr,
-                offset = startOffset,
-                selectableId = selectableId
-            ),
-            end = Selection.AnchorInfo(
-                direction = ResolvedTextDirection.Ltr,
-                offset = endOffset,
-                selectableId = selectableId
-            ),
-            handlesCrossed = false
-        )
+        val selection =
+            Selection(
+                start =
+                    Selection.AnchorInfo(
+                        direction = ResolvedTextDirection.Ltr,
+                        offset = startOffset,
+                        selectableId = selectableId
+                    ),
+                end =
+                    Selection.AnchorInfo(
+                        direction = ResolvedTextDirection.Ltr,
+                        offset = endOffset,
+                        selectableId = selectableId
+                    ),
+                handlesCrossed = false
+            )
         selectionManager.selection = selection
         selectionRegistrar.subselections = longObjectMapOf(selectableId, selection)
 
@@ -267,19 +272,22 @@
         val annotatedString = AnnotatedString(text)
         val startOffset = text.indexOf('e')
         selectable.textToReturn = annotatedString
-        val selection = Selection(
-            start = Selection.AnchorInfo(
-                direction = ResolvedTextDirection.Ltr,
-                offset = startOffset,
-                selectableId = selectableId
-            ),
-            end = Selection.AnchorInfo(
-                direction = ResolvedTextDirection.Ltr,
-                offset = startOffset,
-                selectableId = selectableId
-            ),
-            handlesCrossed = false
-        )
+        val selection =
+            Selection(
+                start =
+                    Selection.AnchorInfo(
+                        direction = ResolvedTextDirection.Ltr,
+                        offset = startOffset,
+                        selectableId = selectableId
+                    ),
+                end =
+                    Selection.AnchorInfo(
+                        direction = ResolvedTextDirection.Ltr,
+                        offset = startOffset,
+                        selectableId = selectableId
+                    ),
+                handlesCrossed = false
+            )
         selectionManager.selection = selection
         selectionRegistrar.subselections = longObjectMapOf(selectableId, selection)
 
@@ -301,61 +309,74 @@
         whenever(startSelectable.getText()).thenReturn(annotatedString)
         whenever(middleSelectable.getText()).thenReturn(annotatedString)
         whenever(endSelectable.getText()).thenReturn(annotatedString)
-        selectionManager.selection = Selection(
-            start = Selection.AnchorInfo(
-                direction = ResolvedTextDirection.Ltr,
-                offset = startOffset,
-                selectableId = startSelectableId
-            ),
-            end = Selection.AnchorInfo(
-                direction = ResolvedTextDirection.Ltr,
-                offset = endOffset,
-                selectableId = endSelectableId
-            ),
-            handlesCrossed = true
-        )
+        selectionManager.selection =
+            Selection(
+                start =
+                    Selection.AnchorInfo(
+                        direction = ResolvedTextDirection.Ltr,
+                        offset = startOffset,
+                        selectableId = startSelectableId
+                    ),
+                end =
+                    Selection.AnchorInfo(
+                        direction = ResolvedTextDirection.Ltr,
+                        offset = endOffset,
+                        selectableId = endSelectableId
+                    ),
+                handlesCrossed = true
+            )
 
-        selectionRegistrar.subselections = longObjectMapOf(
-            endSelectableId, Selection(
-                start = Selection.AnchorInfo(
-                    direction = ResolvedTextDirection.Ltr,
-                    offset = annotatedString.length,
-                    selectableId = endSelectableId
+        selectionRegistrar.subselections =
+            longObjectMapOf(
+                endSelectableId,
+                Selection(
+                    start =
+                        Selection.AnchorInfo(
+                            direction = ResolvedTextDirection.Ltr,
+                            offset = annotatedString.length,
+                            selectableId = endSelectableId
+                        ),
+                    end =
+                        Selection.AnchorInfo(
+                            direction = ResolvedTextDirection.Ltr,
+                            offset = endOffset,
+                            selectableId = endSelectableId
+                        ),
+                    handlesCrossed = true
                 ),
-                end = Selection.AnchorInfo(
-                    direction = ResolvedTextDirection.Ltr,
-                    offset = endOffset,
-                    selectableId = endSelectableId
+                middleSelectableId,
+                Selection(
+                    start =
+                        Selection.AnchorInfo(
+                            direction = ResolvedTextDirection.Ltr,
+                            offset = annotatedString.length,
+                            selectableId = middleSelectableId
+                        ),
+                    end =
+                        Selection.AnchorInfo(
+                            direction = ResolvedTextDirection.Ltr,
+                            offset = 0,
+                            selectableId = middleSelectableId
+                        ),
+                    handlesCrossed = true
                 ),
-                handlesCrossed = true
-            ),
-            middleSelectableId, Selection(
-                start = Selection.AnchorInfo(
-                    direction = ResolvedTextDirection.Ltr,
-                    offset = annotatedString.length,
-                    selectableId = middleSelectableId
+                startSelectableId,
+                Selection(
+                    start =
+                        Selection.AnchorInfo(
+                            direction = ResolvedTextDirection.Ltr,
+                            offset = startOffset,
+                            selectableId = startSelectableId
+                        ),
+                    end =
+                        Selection.AnchorInfo(
+                            direction = ResolvedTextDirection.Ltr,
+                            offset = 0,
+                            selectableId = startSelectableId
+                        ),
+                    handlesCrossed = true
                 ),
-                end = Selection.AnchorInfo(
-                    direction = ResolvedTextDirection.Ltr,
-                    offset = 0,
-                    selectableId = middleSelectableId
-                ),
-                handlesCrossed = true
-            ),
-            startSelectableId, Selection(
-                start = Selection.AnchorInfo(
-                    direction = ResolvedTextDirection.Ltr,
-                    offset = startOffset,
-                    selectableId = startSelectableId
-                ),
-                end = Selection.AnchorInfo(
-                    direction = ResolvedTextDirection.Ltr,
-                    offset = 0,
-                    selectableId = startSelectableId
-                ),
-                handlesCrossed = true
-            ),
-        )
+            )
 
         assertThat(selectionManager.isNonEmptySelection()).isTrue()
     }
@@ -375,61 +396,74 @@
         whenever(startSelectable.getText()).thenReturn(annotatedString)
         whenever(middleSelectable.getText()).thenReturn(AnnotatedString(""))
         whenever(endSelectable.getText()).thenReturn(annotatedString)
-        selectionManager.selection = Selection(
-            start = Selection.AnchorInfo(
-                direction = ResolvedTextDirection.Ltr,
-                offset = startOffset,
-                selectableId = startSelectableId
-            ),
-            end = Selection.AnchorInfo(
-                direction = ResolvedTextDirection.Ltr,
-                offset = endOffset,
-                selectableId = endSelectableId
-            ),
-            handlesCrossed = false
-        )
+        selectionManager.selection =
+            Selection(
+                start =
+                    Selection.AnchorInfo(
+                        direction = ResolvedTextDirection.Ltr,
+                        offset = startOffset,
+                        selectableId = startSelectableId
+                    ),
+                end =
+                    Selection.AnchorInfo(
+                        direction = ResolvedTextDirection.Ltr,
+                        offset = endOffset,
+                        selectableId = endSelectableId
+                    ),
+                handlesCrossed = false
+            )
 
-        selectionRegistrar.subselections = longObjectMapOf(
-            startSelectableId, Selection(
-                start = Selection.AnchorInfo(
-                    direction = ResolvedTextDirection.Ltr,
-                    offset = annotatedString.length,
-                    selectableId = startSelectableId
+        selectionRegistrar.subselections =
+            longObjectMapOf(
+                startSelectableId,
+                Selection(
+                    start =
+                        Selection.AnchorInfo(
+                            direction = ResolvedTextDirection.Ltr,
+                            offset = annotatedString.length,
+                            selectableId = startSelectableId
+                        ),
+                    end =
+                        Selection.AnchorInfo(
+                            direction = ResolvedTextDirection.Ltr,
+                            offset = annotatedString.length,
+                            selectableId = startSelectableId
+                        ),
+                    handlesCrossed = false
                 ),
-                end = Selection.AnchorInfo(
-                    direction = ResolvedTextDirection.Ltr,
-                    offset = annotatedString.length,
-                    selectableId = startSelectableId
+                middleSelectableId,
+                Selection(
+                    start =
+                        Selection.AnchorInfo(
+                            direction = ResolvedTextDirection.Ltr,
+                            offset = 0,
+                            selectableId = middleSelectableId
+                        ),
+                    end =
+                        Selection.AnchorInfo(
+                            direction = ResolvedTextDirection.Ltr,
+                            offset = 0,
+                            selectableId = middleSelectableId
+                        ),
+                    handlesCrossed = false
                 ),
-                handlesCrossed = false
-            ),
-            middleSelectableId, Selection(
-                start = Selection.AnchorInfo(
-                    direction = ResolvedTextDirection.Ltr,
-                    offset = 0,
-                    selectableId = middleSelectableId
+                endSelectableId,
+                Selection(
+                    start =
+                        Selection.AnchorInfo(
+                            direction = ResolvedTextDirection.Ltr,
+                            offset = 0,
+                            selectableId = endSelectableId
+                        ),
+                    end =
+                        Selection.AnchorInfo(
+                            direction = ResolvedTextDirection.Ltr,
+                            offset = 0,
+                            selectableId = endSelectableId
+                        ),
+                    handlesCrossed = false
                 ),
-                end = Selection.AnchorInfo(
-                    direction = ResolvedTextDirection.Ltr,
-                    offset = 0,
-                    selectableId = middleSelectableId
-                ),
-                handlesCrossed = false
-            ),
-            endSelectableId, Selection(
-                start = Selection.AnchorInfo(
-                    direction = ResolvedTextDirection.Ltr,
-                    offset = 0,
-                    selectableId = endSelectableId
-                ),
-                end = Selection.AnchorInfo(
-                    direction = ResolvedTextDirection.Ltr,
-                    offset = 0,
-                    selectableId = endSelectableId
-                ),
-                handlesCrossed = false
-            ),
-        )
+            )
 
         assertThat(selectionManager.isNonEmptySelection()).isFalse()
     }
@@ -449,61 +483,74 @@
         whenever(startSelectable.getText()).thenReturn(annotatedString)
         whenever(middleSelectable.getText()).thenReturn(AnnotatedString(""))
         whenever(endSelectable.getText()).thenReturn(annotatedString)
-        selectionManager.selection = Selection(
-            start = Selection.AnchorInfo(
-                direction = ResolvedTextDirection.Ltr,
-                offset = startOffset,
-                selectableId = startSelectableId
-            ),
-            end = Selection.AnchorInfo(
-                direction = ResolvedTextDirection.Ltr,
-                offset = endOffset,
-                selectableId = endSelectableId
-            ),
-            handlesCrossed = true
-        )
+        selectionManager.selection =
+            Selection(
+                start =
+                    Selection.AnchorInfo(
+                        direction = ResolvedTextDirection.Ltr,
+                        offset = startOffset,
+                        selectableId = startSelectableId
+                    ),
+                end =
+                    Selection.AnchorInfo(
+                        direction = ResolvedTextDirection.Ltr,
+                        offset = endOffset,
+                        selectableId = endSelectableId
+                    ),
+                handlesCrossed = true
+            )
 
-        selectionRegistrar.subselections = longObjectMapOf(
-            startSelectableId, Selection(
-                start = Selection.AnchorInfo(
-                    direction = ResolvedTextDirection.Ltr,
-                    offset = annotatedString.length,
-                    selectableId = startSelectableId
+        selectionRegistrar.subselections =
+            longObjectMapOf(
+                startSelectableId,
+                Selection(
+                    start =
+                        Selection.AnchorInfo(
+                            direction = ResolvedTextDirection.Ltr,
+                            offset = annotatedString.length,
+                            selectableId = startSelectableId
+                        ),
+                    end =
+                        Selection.AnchorInfo(
+                            direction = ResolvedTextDirection.Ltr,
+                            offset = annotatedString.length,
+                            selectableId = startSelectableId
+                        ),
+                    handlesCrossed = true
                 ),
-                end = Selection.AnchorInfo(
-                    direction = ResolvedTextDirection.Ltr,
-                    offset = annotatedString.length,
-                    selectableId = startSelectableId
+                middleSelectableId,
+                Selection(
+                    start =
+                        Selection.AnchorInfo(
+                            direction = ResolvedTextDirection.Ltr,
+                            offset = 0,
+                            selectableId = middleSelectableId
+                        ),
+                    end =
+                        Selection.AnchorInfo(
+                            direction = ResolvedTextDirection.Ltr,
+                            offset = 0,
+                            selectableId = middleSelectableId
+                        ),
+                    handlesCrossed = true
                 ),
-                handlesCrossed = true
-            ),
-            middleSelectableId, Selection(
-                start = Selection.AnchorInfo(
-                    direction = ResolvedTextDirection.Ltr,
-                    offset = 0,
-                    selectableId = middleSelectableId
+                endSelectableId,
+                Selection(
+                    start =
+                        Selection.AnchorInfo(
+                            direction = ResolvedTextDirection.Ltr,
+                            offset = 0,
+                            selectableId = endSelectableId
+                        ),
+                    end =
+                        Selection.AnchorInfo(
+                            direction = ResolvedTextDirection.Ltr,
+                            offset = 0,
+                            selectableId = endSelectableId
+                        ),
+                    handlesCrossed = true
                 ),
-                end = Selection.AnchorInfo(
-                    direction = ResolvedTextDirection.Ltr,
-                    offset = 0,
-                    selectableId = middleSelectableId
-                ),
-                handlesCrossed = true
-            ),
-            endSelectableId, Selection(
-                start = Selection.AnchorInfo(
-                    direction = ResolvedTextDirection.Ltr,
-                    offset = 0,
-                    selectableId = endSelectableId
-                ),
-                end = Selection.AnchorInfo(
-                    direction = ResolvedTextDirection.Ltr,
-                    offset = 0,
-                    selectableId = endSelectableId
-                ),
-                handlesCrossed = true
-            ),
-        )
+            )
 
         assertThat(selectionManager.isNonEmptySelection()).isFalse()
     }
@@ -524,19 +571,22 @@
         val startOffset = text.indexOf('e')
         val endOffset = text.indexOf('m')
         selectable.textToReturn = annotatedString
-        val selection = Selection(
-            start = Selection.AnchorInfo(
-                direction = ResolvedTextDirection.Ltr,
-                offset = startOffset,
-                selectableId = selectableId
-            ),
-            end = Selection.AnchorInfo(
-                direction = ResolvedTextDirection.Ltr,
-                offset = endOffset,
-                selectableId = selectableId
-            ),
-            handlesCrossed = false
-        )
+        val selection =
+            Selection(
+                start =
+                    Selection.AnchorInfo(
+                        direction = ResolvedTextDirection.Ltr,
+                        offset = startOffset,
+                        selectableId = selectableId
+                    ),
+                end =
+                    Selection.AnchorInfo(
+                        direction = ResolvedTextDirection.Ltr,
+                        offset = endOffset,
+                        selectableId = selectableId
+                    ),
+                handlesCrossed = false
+            )
         selectionManager.selection = selection
         selectionRegistrar.subselections = longObjectMapOf(selectableId, selection)
 
@@ -552,19 +602,22 @@
         val startOffset = text.indexOf('m')
         val endOffset = text.indexOf('x')
         selectable.textToReturn = annotatedString
-        val selection = Selection(
-            start = Selection.AnchorInfo(
-                direction = ResolvedTextDirection.Ltr,
-                offset = startOffset,
-                selectableId = selectableId
-            ),
-            end = Selection.AnchorInfo(
-                direction = ResolvedTextDirection.Ltr,
-                offset = endOffset,
-                selectableId = selectableId
-            ),
-            handlesCrossed = true
-        )
+        val selection =
+            Selection(
+                start =
+                    Selection.AnchorInfo(
+                        direction = ResolvedTextDirection.Ltr,
+                        offset = startOffset,
+                        selectableId = selectableId
+                    ),
+                end =
+                    Selection.AnchorInfo(
+                        direction = ResolvedTextDirection.Ltr,
+                        offset = endOffset,
+                        selectableId = selectableId
+                    ),
+                handlesCrossed = true
+            )
         selectionManager.selection = selection
         selectionRegistrar.subselections = longObjectMapOf(selectableId, selection)
 
@@ -588,64 +641,79 @@
         whenever(startSelectable.getText()).thenReturn(annotatedString)
         whenever(middleSelectable.getText()).thenReturn(annotatedString)
         whenever(endSelectable.getText()).thenReturn(annotatedString)
-        selectionManager.selection = Selection(
-            start = Selection.AnchorInfo(
-                direction = ResolvedTextDirection.Ltr,
-                offset = startOffset,
-                selectableId = startSelectableId
-            ),
-            end = Selection.AnchorInfo(
-                direction = ResolvedTextDirection.Ltr,
-                offset = endOffset,
-                selectableId = endSelectableId
-            ),
-            handlesCrossed = false
-        )
+        selectionManager.selection =
+            Selection(
+                start =
+                    Selection.AnchorInfo(
+                        direction = ResolvedTextDirection.Ltr,
+                        offset = startOffset,
+                        selectableId = startSelectableId
+                    ),
+                end =
+                    Selection.AnchorInfo(
+                        direction = ResolvedTextDirection.Ltr,
+                        offset = endOffset,
+                        selectableId = endSelectableId
+                    ),
+                handlesCrossed = false
+            )
 
-        selectionRegistrar.subselections = longObjectMapOf(
-            startSelectableId, Selection(
-                start = Selection.AnchorInfo(
-                    direction = ResolvedTextDirection.Ltr,
-                    offset = startOffset,
-                    selectableId = startSelectableId
+        selectionRegistrar.subselections =
+            longObjectMapOf(
+                startSelectableId,
+                Selection(
+                    start =
+                        Selection.AnchorInfo(
+                            direction = ResolvedTextDirection.Ltr,
+                            offset = startOffset,
+                            selectableId = startSelectableId
+                        ),
+                    end =
+                        Selection.AnchorInfo(
+                            direction = ResolvedTextDirection.Ltr,
+                            offset = annotatedString.length,
+                            selectableId = startSelectableId
+                        ),
+                    handlesCrossed = false
                 ),
-                end = Selection.AnchorInfo(
-                    direction = ResolvedTextDirection.Ltr,
-                    offset = annotatedString.length,
-                    selectableId = startSelectableId
+                middleSelectableId,
+                Selection(
+                    start =
+                        Selection.AnchorInfo(
+                            direction = ResolvedTextDirection.Ltr,
+                            offset = 0,
+                            selectableId = middleSelectableId
+                        ),
+                    end =
+                        Selection.AnchorInfo(
+                            direction = ResolvedTextDirection.Ltr,
+                            offset = annotatedString.length,
+                            selectableId = middleSelectableId
+                        ),
+                    handlesCrossed = false
                 ),
-                handlesCrossed = false
-            ),
-            middleSelectableId, Selection(
-                start = Selection.AnchorInfo(
-                    direction = ResolvedTextDirection.Ltr,
-                    offset = 0,
-                    selectableId = middleSelectableId
+                endSelectableId,
+                Selection(
+                    start =
+                        Selection.AnchorInfo(
+                            direction = ResolvedTextDirection.Ltr,
+                            offset = 0,
+                            selectableId = endSelectableId
+                        ),
+                    end =
+                        Selection.AnchorInfo(
+                            direction = ResolvedTextDirection.Ltr,
+                            offset = endOffset,
+                            selectableId = endSelectableId
+                        ),
+                    handlesCrossed = false
                 ),
-                end = Selection.AnchorInfo(
-                    direction = ResolvedTextDirection.Ltr,
-                    offset = annotatedString.length,
-                    selectableId = middleSelectableId
-                ),
-                handlesCrossed = false
-            ),
-            endSelectableId, Selection(
-                start = Selection.AnchorInfo(
-                    direction = ResolvedTextDirection.Ltr,
-                    offset = 0,
-                    selectableId = endSelectableId
-                ),
-                end = Selection.AnchorInfo(
-                    direction = ResolvedTextDirection.Ltr,
-                    offset = endOffset,
-                    selectableId = endSelectableId
-                ),
-                handlesCrossed = false
-            ),
-        )
+            )
 
-        val result = annotatedString.subSequence(startOffset, annotatedString.length) +
-            annotatedString + annotatedString.subSequence(0, endOffset)
+        val result =
+            annotatedString.subSequence(startOffset, annotatedString.length) +
+                annotatedString +
+                annotatedString.subSequence(0, endOffset)
         assertThat(selectionManager.getSelectedText()).isEqualTo(result)
         assertThat(selectable.getTextCalledTimes).isEqualTo(0)
         verify(startSelectable, times(1)).getText()
@@ -669,64 +737,79 @@
         whenever(startSelectable.getText()).thenReturn(annotatedString)
         whenever(middleSelectable.getText()).thenReturn(annotatedString)
         whenever(endSelectable.getText()).thenReturn(annotatedString)
-        selectionManager.selection = Selection(
-            start = Selection.AnchorInfo(
-                direction = ResolvedTextDirection.Ltr,
-                offset = startOffset,
-                selectableId = startSelectableId
-            ),
-            end = Selection.AnchorInfo(
-                direction = ResolvedTextDirection.Ltr,
-                offset = endOffset,
-                selectableId = endSelectableId
-            ),
-            handlesCrossed = true
-        )
+        selectionManager.selection =
+            Selection(
+                start =
+                    Selection.AnchorInfo(
+                        direction = ResolvedTextDirection.Ltr,
+                        offset = startOffset,
+                        selectableId = startSelectableId
+                    ),
+                end =
+                    Selection.AnchorInfo(
+                        direction = ResolvedTextDirection.Ltr,
+                        offset = endOffset,
+                        selectableId = endSelectableId
+                    ),
+                handlesCrossed = true
+            )
 
-        selectionRegistrar.subselections = longObjectMapOf(
-            endSelectableId, Selection(
-                start = Selection.AnchorInfo(
-                    direction = ResolvedTextDirection.Ltr,
-                    offset = annotatedString.length,
-                    selectableId = endSelectableId
+        selectionRegistrar.subselections =
+            longObjectMapOf(
+                endSelectableId,
+                Selection(
+                    start =
+                        Selection.AnchorInfo(
+                            direction = ResolvedTextDirection.Ltr,
+                            offset = annotatedString.length,
+                            selectableId = endSelectableId
+                        ),
+                    end =
+                        Selection.AnchorInfo(
+                            direction = ResolvedTextDirection.Ltr,
+                            offset = endOffset,
+                            selectableId = endSelectableId
+                        ),
+                    handlesCrossed = true
                 ),
-                end = Selection.AnchorInfo(
-                    direction = ResolvedTextDirection.Ltr,
-                    offset = endOffset,
-                    selectableId = endSelectableId
+                middleSelectableId,
+                Selection(
+                    start =
+                        Selection.AnchorInfo(
+                            direction = ResolvedTextDirection.Ltr,
+                            offset = annotatedString.length,
+                            selectableId = middleSelectableId
+                        ),
+                    end =
+                        Selection.AnchorInfo(
+                            direction = ResolvedTextDirection.Ltr,
+                            offset = 0,
+                            selectableId = middleSelectableId
+                        ),
+                    handlesCrossed = true
                 ),
-                handlesCrossed = true
-            ),
-            middleSelectableId, Selection(
-                start = Selection.AnchorInfo(
-                    direction = ResolvedTextDirection.Ltr,
-                    offset = annotatedString.length,
-                    selectableId = middleSelectableId
+                startSelectableId,
+                Selection(
+                    start =
+                        Selection.AnchorInfo(
+                            direction = ResolvedTextDirection.Ltr,
+                            offset = startOffset,
+                            selectableId = startSelectableId
+                        ),
+                    end =
+                        Selection.AnchorInfo(
+                            direction = ResolvedTextDirection.Ltr,
+                            offset = 0,
+                            selectableId = startSelectableId
+                        ),
+                    handlesCrossed = true
                 ),
-                end = Selection.AnchorInfo(
-                    direction = ResolvedTextDirection.Ltr,
-                    offset = 0,
-                    selectableId = middleSelectableId
-                ),
-                handlesCrossed = true
-            ),
-            startSelectableId, Selection(
-                start = Selection.AnchorInfo(
-                    direction = ResolvedTextDirection.Ltr,
-                    offset = startOffset,
-                    selectableId = startSelectableId
-                ),
-                end = Selection.AnchorInfo(
-                    direction = ResolvedTextDirection.Ltr,
-                    offset = 0,
-                    selectableId = startSelectableId
-                ),
-                handlesCrossed = true
-            ),
-        )
+            )
 
-        val result = annotatedString.subSequence(endOffset, annotatedString.length) +
-            annotatedString + annotatedString.subSequence(0, startOffset)
+        val result =
+            annotatedString.subSequence(endOffset, annotatedString.length) +
+                annotatedString +
+                annotatedString.subSequence(0, startOffset)
         assertThat(selectionManager.getSelectedText()).isEqualTo(result)
         assertThat(selectable.getTextCalledTimes).isEqualTo(0)
         verify(startSelectable, times(1)).getText()
@@ -752,30 +835,29 @@
         val startOffset = text.indexOf('m')
         val endOffset = text.indexOf('x')
         selectable.textToReturn = annotatedString
-        val selection = Selection(
-            start = Selection.AnchorInfo(
-                direction = ResolvedTextDirection.Ltr,
-                offset = startOffset,
-                selectableId = selectableId
-            ),
-            end = Selection.AnchorInfo(
-                direction = ResolvedTextDirection.Ltr,
-                offset = endOffset,
-                selectableId = selectableId
-            ),
-            handlesCrossed = true
-        )
+        val selection =
+            Selection(
+                start =
+                    Selection.AnchorInfo(
+                        direction = ResolvedTextDirection.Ltr,
+                        offset = startOffset,
+                        selectableId = selectableId
+                    ),
+                end =
+                    Selection.AnchorInfo(
+                        direction = ResolvedTextDirection.Ltr,
+                        offset = endOffset,
+                        selectableId = selectableId
+                    ),
+                handlesCrossed = true
+            )
         selectionManager.selection = selection
         selectionRegistrar.subselections = longObjectMapOf(selectableId, selection)
 
         selectionManager.copy()
 
-        verify(clipboardManager, times(1)).setText(
-            annotatedString.subSequence(
-                endOffset,
-                startOffset
-            )
-        )
+        verify(clipboardManager, times(1))
+            .setText(annotatedString.subSequence(endOffset, startOffset))
     }
 
     @Test
@@ -786,32 +868,29 @@
         val endOffset = text.indexOf('x')
         selectable.textToReturn = annotatedString
         selectable.layoutCoordinatesToReturn = containerLayoutCoordinates
-        val selection = Selection(
-            start = Selection.AnchorInfo(
-                direction = ResolvedTextDirection.Ltr,
-                offset = startOffset,
-                selectableId = selectableId
-            ),
-            end = Selection.AnchorInfo(
-                direction = ResolvedTextDirection.Ltr,
-                offset = endOffset,
-                selectableId = selectableId
-            ),
-            handlesCrossed = true
-        )
+        val selection =
+            Selection(
+                start =
+                    Selection.AnchorInfo(
+                        direction = ResolvedTextDirection.Ltr,
+                        offset = startOffset,
+                        selectableId = selectableId
+                    ),
+                end =
+                    Selection.AnchorInfo(
+                        direction = ResolvedTextDirection.Ltr,
+                        offset = endOffset,
+                        selectableId = selectableId
+                    ),
+                handlesCrossed = true
+            )
         selectionManager.selection = selection
         selectionRegistrar.subselections = longObjectMapOf(selectableId, selection)
         selectionManager.hasFocus = true
 
         selectionManager.showToolbar = true
 
-        verify(textToolbar, times(1)).showMenu(
-            any(),
-            any(),
-            isNull(),
-            isNull(),
-            any()
-        )
+        verify(textToolbar, times(1)).showMenu(any(), any(), isNull(), isNull(), any())
     }
 
     @Test
@@ -821,48 +900,47 @@
         val startOffset = text.indexOf('m')
         val endOffset = text.indexOf('x')
         selectable.textToReturn = annotatedString
-        val selection = Selection(
-            start = Selection.AnchorInfo(
-                direction = ResolvedTextDirection.Ltr,
-                offset = startOffset,
-                selectableId = selectableId
-            ),
-            end = Selection.AnchorInfo(
-                direction = ResolvedTextDirection.Ltr,
-                offset = endOffset,
-                selectableId = selectableId
-            ),
-            handlesCrossed = true
-        )
+        val selection =
+            Selection(
+                start =
+                    Selection.AnchorInfo(
+                        direction = ResolvedTextDirection.Ltr,
+                        offset = startOffset,
+                        selectableId = selectableId
+                    ),
+                end =
+                    Selection.AnchorInfo(
+                        direction = ResolvedTextDirection.Ltr,
+                        offset = endOffset,
+                        selectableId = selectableId
+                    ),
+                handlesCrossed = true
+            )
         selectionManager.selection = selection
         selectionRegistrar.subselections = longObjectMapOf(selectableId, selection)
         selectionManager.hasFocus = false
 
         selectionManager.showToolbar = true
 
-        verify(textToolbar, never()).showMenu(
-            any(),
-            any(),
-            isNull(),
-            isNull(),
-            isNull()
-        )
+        verify(textToolbar, never()).showMenu(any(), any(), isNull(), isNull(), isNull())
     }
 
     @Test
     fun onRelease_selectionMap_is_setToEmpty() {
         val fakeSelection =
             Selection(
-                start = Selection.AnchorInfo(
-                    direction = ResolvedTextDirection.Ltr,
-                    offset = 0,
-                    selectableId = startSelectableId
-                ),
-                end = Selection.AnchorInfo(
-                    direction = ResolvedTextDirection.Ltr,
-                    offset = 5,
-                    selectableId = endSelectableId
-                )
+                start =
+                    Selection.AnchorInfo(
+                        direction = ResolvedTextDirection.Ltr,
+                        offset = 0,
+                        selectableId = startSelectableId
+                    ),
+                end =
+                    Selection.AnchorInfo(
+                        direction = ResolvedTextDirection.Ltr,
+                        offset = 5,
+                        selectableId = endSelectableId
+                    )
             )
         var selection: Selection? = fakeSelection
         val lambda: (Selection?) -> Unit = { selection = it }
@@ -876,26 +954,25 @@
 
         assertThat(selection).isNull()
         verify(spyLambda, times(1)).invoke(null)
-        verify(
-            hapticFeedback,
-            times(1)
-        ).performHapticFeedback(HapticFeedbackType.TextHandleMove)
+        verify(hapticFeedback, times(1)).performHapticFeedback(HapticFeedbackType.TextHandleMove)
     }
 
     @Test
     fun notifySelectableChange_clears_selection() {
         val fakeSelection =
             Selection(
-                start = Selection.AnchorInfo(
-                    direction = ResolvedTextDirection.Ltr,
-                    offset = 0,
-                    selectableId = startSelectableId
-                ),
-                end = Selection.AnchorInfo(
-                    direction = ResolvedTextDirection.Ltr,
-                    offset = 5,
-                    selectableId = startSelectableId
-                )
+                start =
+                    Selection.AnchorInfo(
+                        direction = ResolvedTextDirection.Ltr,
+                        offset = 0,
+                        selectableId = startSelectableId
+                    ),
+                end =
+                    Selection.AnchorInfo(
+                        direction = ResolvedTextDirection.Ltr,
+                        offset = 5,
+                        selectableId = startSelectableId
+                    )
             )
         var selection: Selection? = fakeSelection
         val lambda: (Selection?) -> Unit = { selection = it }
@@ -903,18 +980,13 @@
         selectionManager.onSelectionChange = spyLambda
         selectionManager.selection = fakeSelection
 
-        selectionRegistrar.subselections = longObjectMapOf(
-            startSelectableId, fakeSelection
-        )
+        selectionRegistrar.subselections = longObjectMapOf(startSelectableId, fakeSelection)
         selectionRegistrar.notifySelectableChange(startSelectableId)
 
         verify(selectionRegistrar).subselections = emptyLongObjectMap()
         assertThat(selection).isNull()
         verify(spyLambda, times(1)).invoke(null)
-        verify(
-            hapticFeedback,
-            times(1)
-        ).performHapticFeedback(HapticFeedbackType.TextHandleMove)
+        verify(hapticFeedback, times(1)).performHapticFeedback(HapticFeedbackType.TextHandleMove)
     }
 
     // region isEntireContainerSelected Tests
@@ -1022,7 +1094,7 @@
      *
      * @param text The text for the [Selectable] to return in [Selectable.getText].
      * @param selection The selection to be associated with the [SelectionRegistrar.subselections].
-     * Null implies "do not include this selectable in the sub-selection".
+     *   Null implies "do not include this selectable in the sub-selection".
      */
     private data class IsEntireContainerSelectedData(
         val text: String,
@@ -1033,46 +1105,52 @@
         expectedResult: Boolean,
         vararg selectableStates: IsEntireContainerSelectedData,
     ) {
-        val selectables = selectableStates.mapIndexed { index, item ->
-            FakeSelectable().apply {
-                selectableId = index + 1L
-                textToReturn = AnnotatedString(item.text)
-            }
-        }
-
-        val registrar = SelectionRegistrarImpl().apply {
-            selectables.fastForEach { subscribe(it) }
-            subselections = selectableStates
-                .withIndex()
-                .filter { it.value.selection != null }
-                .associate { (index, item) ->
-                    val id = index + 1L
-                    val selection = item.selection
-                    id to Selection(
-                        start = Selection.AnchorInfo(
-                            direction = ResolvedTextDirection.Ltr,
-                            offset = selection!!.start,
-                            selectableId = id
-                        ),
-                        end = Selection.AnchorInfo(
-                            direction = ResolvedTextDirection.Ltr,
-                            offset = selection.end,
-                            selectableId = id
-                        ),
-                        handlesCrossed = selection.reversed
-                    )
+        val selectables =
+            selectableStates.mapIndexed { index, item ->
+                FakeSelectable().apply {
+                    selectableId = index + 1L
+                    textToReturn = AnnotatedString(item.text)
                 }
-                .toLongObjectMap()
-        }
+            }
 
-        val manager = SelectionManager(registrar).apply {
-            containerLayoutCoordinates = MockCoordinates()
-        }
+        val registrar =
+            SelectionRegistrarImpl().apply {
+                selectables.fastForEach { subscribe(it) }
+                subselections =
+                    selectableStates
+                        .withIndex()
+                        .filter { it.value.selection != null }
+                        .associate { (index, item) ->
+                            val id = index + 1L
+                            val selection = item.selection
+                            id to
+                                Selection(
+                                    start =
+                                        Selection.AnchorInfo(
+                                            direction = ResolvedTextDirection.Ltr,
+                                            offset = selection!!.start,
+                                            selectableId = id
+                                        ),
+                                    end =
+                                        Selection.AnchorInfo(
+                                            direction = ResolvedTextDirection.Ltr,
+                                            offset = selection.end,
+                                            selectableId = id
+                                        ),
+                                    handlesCrossed = selection.reversed
+                                )
+                        }
+                        .toLongObjectMap()
+            }
+
+        val manager =
+            SelectionManager(registrar).apply { containerLayoutCoordinates = MockCoordinates() }
 
         assertThat(manager.isEntireContainerSelected()).run {
             if (expectedResult) isTrue() else isFalse()
         }
     }
+
     // endregion isEntireContainerSelected Tests
 
     // region selectAll Tests
@@ -1105,17 +1183,19 @@
     @Test
     fun selectAll_multiSelectable_selectedAsExpected() {
         selectAllTest(
-            expectedSelection = expectedSelection(
-                startOffset = 0,
-                endOffset = 4,
-                startSelectableId = 1L,
-                endSelectableId = 3L,
-            ),
-            expectedSubSelectionRanges = mapOf(
-                1L to TextRange(0, 4),
-                2L to TextRange(0, 4),
-                3L to TextRange(0, 4),
-            ),
+            expectedSelection =
+                expectedSelection(
+                    startOffset = 0,
+                    endOffset = 4,
+                    startSelectableId = 1L,
+                    endSelectableId = 3L,
+                ),
+            expectedSubSelectionRanges =
+                mapOf(
+                    1L to TextRange(0, 4),
+                    2L to TextRange(0, 4),
+                    3L to TextRange(0, 4),
+                ),
             SelectAllData(text = "Text", selection = TextRange(0, 4)),
             SelectAllData(text = "Text", selection = TextRange(0, 4)),
             SelectAllData(text = "Text", selection = TextRange(0, 4)),
@@ -1125,16 +1205,18 @@
     @Test
     fun selectAll_multiSelectable_skipFirst_selectedAsExpected() {
         selectAllTest(
-            expectedSelection = expectedSelection(
-                startOffset = 0,
-                endOffset = 4,
-                startSelectableId = 2L,
-                endSelectableId = 3L,
-            ),
-            expectedSubSelectionRanges = mapOf(
-                2L to TextRange(0, 4),
-                3L to TextRange(0, 4),
-            ),
+            expectedSelection =
+                expectedSelection(
+                    startOffset = 0,
+                    endOffset = 4,
+                    startSelectableId = 2L,
+                    endSelectableId = 3L,
+                ),
+            expectedSubSelectionRanges =
+                mapOf(
+                    2L to TextRange(0, 4),
+                    3L to TextRange(0, 4),
+                ),
             SelectAllData(text = "Text", selection = null),
             SelectAllData(text = "Text", selection = TextRange(0, 4)),
             SelectAllData(text = "Text", selection = TextRange(0, 4)),
@@ -1144,16 +1226,18 @@
     @Test
     fun selectAll_multiSelectable_skipMiddle_selectedAsExpected() {
         selectAllTest(
-            expectedSelection = expectedSelection(
-                startOffset = 0,
-                endOffset = 4,
-                startSelectableId = 1L,
-                endSelectableId = 3L,
-            ),
-            expectedSubSelectionRanges = mapOf(
-                1L to TextRange(0, 4),
-                3L to TextRange(0, 4),
-            ),
+            expectedSelection =
+                expectedSelection(
+                    startOffset = 0,
+                    endOffset = 4,
+                    startSelectableId = 1L,
+                    endSelectableId = 3L,
+                ),
+            expectedSubSelectionRanges =
+                mapOf(
+                    1L to TextRange(0, 4),
+                    3L to TextRange(0, 4),
+                ),
             SelectAllData(text = "Text", selection = TextRange(0, 4)),
             SelectAllData(text = "Text", selection = null),
             SelectAllData(text = "Text", selection = TextRange(0, 4)),
@@ -1163,16 +1247,18 @@
     @Test
     fun selectAll_multiSelectable_skipLast_selectedAsExpected() {
         selectAllTest(
-            expectedSelection = expectedSelection(
-                startOffset = 0,
-                endOffset = 4,
-                startSelectableId = 1L,
-                endSelectableId = 2L,
-            ),
-            expectedSubSelectionRanges = mapOf(
-                1L to TextRange(0, 4),
-                2L to TextRange(0, 4),
-            ),
+            expectedSelection =
+                expectedSelection(
+                    startOffset = 0,
+                    endOffset = 4,
+                    startSelectableId = 1L,
+                    endSelectableId = 2L,
+                ),
+            expectedSubSelectionRanges =
+                mapOf(
+                    1L to TextRange(0, 4),
+                    2L to TextRange(0, 4),
+                ),
             SelectAllData(text = "Text", selection = TextRange(0, 4)),
             SelectAllData(text = "Text", selection = TextRange(0, 4)),
             SelectAllData(text = "Text", selection = null),
@@ -1185,26 +1271,29 @@
         startSelectableId: Long = 1L,
         endSelectableId: Long = 1L,
         handlesCrossed: Boolean = false,
-    ): Selection = Selection(
-        start = Selection.AnchorInfo(
-            direction = ResolvedTextDirection.Ltr,
-            offset = startOffset,
-            selectableId = startSelectableId
-        ),
-        end = Selection.AnchorInfo(
-            direction = ResolvedTextDirection.Ltr,
-            offset = endOffset,
-            selectableId = endSelectableId
-        ),
-        handlesCrossed = handlesCrossed
-    )
+    ): Selection =
+        Selection(
+            start =
+                Selection.AnchorInfo(
+                    direction = ResolvedTextDirection.Ltr,
+                    offset = startOffset,
+                    selectableId = startSelectableId
+                ),
+            end =
+                Selection.AnchorInfo(
+                    direction = ResolvedTextDirection.Ltr,
+                    offset = endOffset,
+                    selectableId = endSelectableId
+                ),
+            handlesCrossed = handlesCrossed
+        )
 
     /**
      * Data necessary to set up a [SelectionManager.selectAll] unit test.
      *
      * @param text The text for the [FakeSelectable] to return in [Selectable.getText].
      * @param selection The selection for the [FakeSelectable] to return in
-     * [Selectable.getSelectAllSelection].
+     *   [Selectable.getSelectAllSelection].
      */
     private data class SelectAllData(
         val text: String,
@@ -1216,44 +1305,48 @@
         expectedSubSelectionRanges: Map<Long, TextRange>,
         vararg selectableStates: SelectAllData,
     ) {
-        val selectables = selectableStates.mapIndexed { index, item ->
-            val id = index + 1L
-            val range = item.selection
-            FakeSelectable().apply {
-                selectableId = id
-                textToReturn = AnnotatedString(item.text)
-                fakeSelectAllSelection = range?.let {
-                    Selection(
-                        start = Selection.AnchorInfo(
-                            direction = ResolvedTextDirection.Ltr,
-                            offset = it.start,
-                            selectableId = id
-                        ),
-                        end = Selection.AnchorInfo(
-                            direction = ResolvedTextDirection.Ltr,
-                            offset = it.end,
-                            selectableId = id
-                        ),
-                        handlesCrossed = it.reversed
-                    )
+        val selectables =
+            selectableStates.mapIndexed { index, item ->
+                val id = index + 1L
+                val range = item.selection
+                FakeSelectable().apply {
+                    selectableId = id
+                    textToReturn = AnnotatedString(item.text)
+                    fakeSelectAllSelection =
+                        range?.let {
+                            Selection(
+                                start =
+                                    Selection.AnchorInfo(
+                                        direction = ResolvedTextDirection.Ltr,
+                                        offset = it.start,
+                                        selectableId = id
+                                    ),
+                                end =
+                                    Selection.AnchorInfo(
+                                        direction = ResolvedTextDirection.Ltr,
+                                        offset = it.end,
+                                        selectableId = id
+                                    ),
+                                handlesCrossed = it.reversed
+                            )
+                        }
                 }
             }
-        }
 
-        val registrar = SelectionRegistrarImpl().apply {
-            selectables.fastForEach { subscribe(it) }
-        }
+        val registrar = SelectionRegistrarImpl().apply { selectables.fastForEach { subscribe(it) } }
 
-        val expectedSubSelections = expectedSubSelectionRanges.mapValues { (id, range) ->
-            expectedSelection(
-                startOffset = range.start,
-                endOffset = range.end,
-                startSelectableId = id,
-                endSelectableId = id,
-                handlesCrossed = range.start > range.end
-            )
-        }
-            .toLongObjectMap()
+        val expectedSubSelections =
+            expectedSubSelectionRanges
+                .mapValues { (id, range) ->
+                    expectedSelection(
+                        startOffset = range.start,
+                        endOffset = range.end,
+                        startSelectableId = id,
+                        endSelectableId = id,
+                        handlesCrossed = range.start > range.end
+                    )
+                }
+                .toLongObjectMap()
 
         SelectionManager(registrar).apply {
             containerLayoutCoordinates = MockCoordinates()
@@ -1268,6 +1361,7 @@
 
         assertThat(registrar.subselections).isEqualTo(expectedSubSelections)
     }
+
     // endregion selectAll Tests
 
     private fun <T> Map<Long, T>.toLongObjectMap(): LongObjectMap<T> =
diff --git a/compose/foundation/foundation/src/androidUnitTest/kotlin/androidx/compose/foundation/text/selection/SelectionModeTest.kt b/compose/foundation/foundation/src/androidUnitTest/kotlin/androidx/compose/foundation/text/selection/SelectionModeTest.kt
index a9b4ffd..fe0f8fd 100644
--- a/compose/foundation/foundation/src/androidUnitTest/kotlin/androidx/compose/foundation/text/selection/SelectionModeTest.kt
+++ b/compose/foundation/foundation/src/androidUnitTest/kotlin/androidx/compose/foundation/text/selection/SelectionModeTest.kt
@@ -186,11 +186,7 @@
     fun compare_Vertical() {
         val listX = listOf(smallerThanLeft, betweenLeftAndRight, largerThanRight)
         val listY = listOf(smallerThanTop, betweenTopAndBottom, largerThanBottom)
-        val results = listOf(
-            listOf(-1, -1, -1),
-            listOf(-1, 0, 1),
-            listOf(1, 1, 1)
-        )
+        val results = listOf(listOf(-1, -1, -1), listOf(-1, 0, 1), listOf(1, 1, 1))
 
         for (i in listY.indices) {
             for (j in listX.indices) {
@@ -205,11 +201,7 @@
     fun compare_Horizontal() {
         val listX = listOf(smallerThanLeft, betweenLeftAndRight, largerThanRight)
         val listY = listOf(smallerThanTop, betweenTopAndBottom, largerThanBottom)
-        val results = listOf(
-            listOf(-1, -1, 1),
-            listOf(-1, 0, 1),
-            listOf(-1, 1, 1)
-        )
+        val results = listOf(listOf(-1, -1, 1), listOf(-1, 0, 1), listOf(-1, 1, 1))
 
         for (i in listY.indices) {
             for (j in listX.indices) {
diff --git a/compose/foundation/foundation/src/androidUnitTest/kotlin/androidx/compose/foundation/text/selection/SelectionRegistrarImplTest.kt b/compose/foundation/foundation/src/androidUnitTest/kotlin/androidx/compose/foundation/text/selection/SelectionRegistrarImplTest.kt
index b0e573e..95d6c9b 100644
--- a/compose/foundation/foundation/src/androidUnitTest/kotlin/androidx/compose/foundation/text/selection/SelectionRegistrarImplTest.kt
+++ b/compose/foundation/foundation/src/androidUnitTest/kotlin/androidx/compose/foundation/text/selection/SelectionRegistrarImplTest.kt
@@ -99,12 +99,17 @@
         val relativeCoordinates2 = Offset(20f, 24f)
         val relativeCoordinates3 = Offset(5f, 24f)
 
-        val containerLayoutCoordinates = mock<LayoutCoordinates> {
-            on { localPositionOf(layoutCoordinates0, Offset.Zero) } doAnswer relativeCoordinates0
-            on { localPositionOf(layoutCoordinates1, Offset.Zero) } doAnswer relativeCoordinates1
-            on { localPositionOf(layoutCoordinates2, Offset.Zero) } doAnswer relativeCoordinates2
-            on { localPositionOf(layoutCoordinates3, Offset.Zero) } doAnswer relativeCoordinates3
-        }
+        val containerLayoutCoordinates =
+            mock<LayoutCoordinates> {
+                on { localPositionOf(layoutCoordinates0, Offset.Zero) } doAnswer
+                    relativeCoordinates0
+                on { localPositionOf(layoutCoordinates1, Offset.Zero) } doAnswer
+                    relativeCoordinates1
+                on { localPositionOf(layoutCoordinates2, Offset.Zero) } doAnswer
+                    relativeCoordinates2
+                on { localPositionOf(layoutCoordinates3, Offset.Zero) } doAnswer
+                    relativeCoordinates3
+            }
 
         val selectionRegistrar = SelectionRegistrarImpl()
         selectionRegistrar.subscribe(handler0)
@@ -147,12 +152,17 @@
         val relativeCoordinates2 = Offset(20f, 24f)
         val relativeCoordinates3 = Offset(5f, 24f)
 
-        val containerLayoutCoordinates = mock<LayoutCoordinates> {
-            on { localPositionOf(layoutCoordinates0, Offset.Zero) } doAnswer relativeCoordinates0
-            on { localPositionOf(layoutCoordinates1, Offset.Zero) } doAnswer relativeCoordinates1
-            on { localPositionOf(layoutCoordinates2, Offset.Zero) } doAnswer relativeCoordinates2
-            on { localPositionOf(layoutCoordinates3, Offset.Zero) } doAnswer relativeCoordinates3
-        }
+        val containerLayoutCoordinates =
+            mock<LayoutCoordinates> {
+                on { localPositionOf(layoutCoordinates0, Offset.Zero) } doAnswer
+                    relativeCoordinates0
+                on { localPositionOf(layoutCoordinates1, Offset.Zero) } doAnswer
+                    relativeCoordinates1
+                on { localPositionOf(layoutCoordinates2, Offset.Zero) } doAnswer
+                    relativeCoordinates2
+                on { localPositionOf(layoutCoordinates3, Offset.Zero) } doAnswer
+                    relativeCoordinates3
+            }
 
         val selectionRegistrar = SelectionRegistrarImpl()
         selectionRegistrar.subscribe(handler0)
@@ -177,9 +187,10 @@
         val handlerId0 = 1L
         val layoutCoordinates0 = mock<LayoutCoordinates>()
         val handler0 = mockSelectable(handlerId0, layoutCoordinates0)
-        val containerLayoutCoordinates = mock<LayoutCoordinates> {
-            on { localPositionOf(layoutCoordinates0, Offset.Zero) } doAnswer Offset.Zero
-        }
+        val containerLayoutCoordinates =
+            mock<LayoutCoordinates> {
+                on { localPositionOf(layoutCoordinates0, Offset.Zero) } doAnswer Offset.Zero
+            }
 
         val selectionRegistrar = SelectionRegistrarImpl()
         selectionRegistrar.subscribe(handler0)
@@ -201,9 +212,10 @@
         val handlerId0 = 1L
         val layoutCoordinates0 = mock<LayoutCoordinates>()
         val handler0 = mockSelectable(handlerId0, layoutCoordinates0)
-        val containerLayoutCoordinates = mock<LayoutCoordinates> {
-            on { localPositionOf(layoutCoordinates0, Offset.Zero) } doAnswer Offset.Zero
-        }
+        val containerLayoutCoordinates =
+            mock<LayoutCoordinates> {
+                on { localPositionOf(layoutCoordinates0, Offset.Zero) } doAnswer Offset.Zero
+            }
 
         val selectionRegistrar = SelectionRegistrarImpl()
         selectionRegistrar.subscribe(handler0)
@@ -224,8 +236,6 @@
 ): Selectable {
     val selectable: Selectable = mock()
     whenever(selectable.selectableId).thenReturn(selectableId)
-    layoutCoordinates?.let {
-        whenever(selectable.getLayoutCoordinates()).thenReturn(it)
-    }
+    layoutCoordinates?.let { whenever(selectable.getLayoutCoordinates()).thenReturn(it) }
     return selectable
 }
diff --git a/compose/foundation/foundation/src/androidUnitTest/kotlin/androidx/compose/foundation/text/selection/SelectionTest.kt b/compose/foundation/foundation/src/androidUnitTest/kotlin/androidx/compose/foundation/text/selection/SelectionTest.kt
index 0f93c3b..073f4a3 100644
--- a/compose/foundation/foundation/src/androidUnitTest/kotlin/androidx/compose/foundation/text/selection/SelectionTest.kt
+++ b/compose/foundation/foundation/src/androidUnitTest/kotlin/androidx/compose/foundation/text/selection/SelectionTest.kt
@@ -30,11 +30,7 @@
         val direction = ResolvedTextDirection.Ltr
         val offset = 0
 
-        val anchor = Selection.AnchorInfo(
-            direction = direction,
-            offset = offset,
-            selectableId = 1L
-        )
+        val anchor = Selection.AnchorInfo(direction = direction, offset = offset, selectableId = 1L)
 
         assertThat(anchor.direction).isEqualTo(direction)
         assertThat(anchor.offset).isEqualTo(offset)
@@ -45,23 +41,22 @@
     fun selection_constructor() {
         val startOffset = 0
         val endOffset = 6
-        val startAnchor = Selection.AnchorInfo(
-            direction = ResolvedTextDirection.Ltr,
-            offset = startOffset,
-            selectableId = 1L
-        )
-        val endAnchor = Selection.AnchorInfo(
-            direction = ResolvedTextDirection.Ltr,
-            offset = endOffset,
-            selectableId = 1L
-        )
+        val startAnchor =
+            Selection.AnchorInfo(
+                direction = ResolvedTextDirection.Ltr,
+                offset = startOffset,
+                selectableId = 1L
+            )
+        val endAnchor =
+            Selection.AnchorInfo(
+                direction = ResolvedTextDirection.Ltr,
+                offset = endOffset,
+                selectableId = 1L
+            )
         val handleCrossed = false
 
-        val selection = Selection(
-            start = startAnchor,
-            end = endAnchor,
-            handlesCrossed = handleCrossed
-        )
+        val selection =
+            Selection(start = startAnchor, end = endAnchor, handlesCrossed = handleCrossed)
 
         assertThat(selection.start).isEqualTo(startAnchor)
         assertThat(selection.end).isEqualTo(endAnchor)
@@ -73,39 +68,35 @@
         val startOffset1 = 9
         val endOffset1 = 20
         val selectableKey1 = 1L
-        val startAnchor1 = Selection.AnchorInfo(
-            direction = ResolvedTextDirection.Ltr,
-            offset = startOffset1,
-            selectableId = selectableKey1
-        )
-        val endAnchor1 = Selection.AnchorInfo(
-            direction = ResolvedTextDirection.Ltr,
-            offset = endOffset1,
-            selectableId = selectableKey1
-        )
-        val selection1 = Selection(
-            start = startAnchor1,
-            end = endAnchor1,
-            handlesCrossed = false
-        )
+        val startAnchor1 =
+            Selection.AnchorInfo(
+                direction = ResolvedTextDirection.Ltr,
+                offset = startOffset1,
+                selectableId = selectableKey1
+            )
+        val endAnchor1 =
+            Selection.AnchorInfo(
+                direction = ResolvedTextDirection.Ltr,
+                offset = endOffset1,
+                selectableId = selectableKey1
+            )
+        val selection1 = Selection(start = startAnchor1, end = endAnchor1, handlesCrossed = false)
         val startOffset2 = 0
         val endOffset2 = 30
         val selectableKey2 = 2L
-        val startAnchor2 = Selection.AnchorInfo(
-            direction = ResolvedTextDirection.Ltr,
-            offset = startOffset2,
-            selectableId = selectableKey2
-        )
-        val endAnchor2 = Selection.AnchorInfo(
-            direction = ResolvedTextDirection.Ltr,
-            offset = endOffset2,
-            selectableId = selectableKey2
-        )
-        val selection2 = Selection(
-            start = startAnchor2,
-            end = endAnchor2,
-            handlesCrossed = false
-        )
+        val startAnchor2 =
+            Selection.AnchorInfo(
+                direction = ResolvedTextDirection.Ltr,
+                offset = startOffset2,
+                selectableId = selectableKey2
+            )
+        val endAnchor2 =
+            Selection.AnchorInfo(
+                direction = ResolvedTextDirection.Ltr,
+                offset = endOffset2,
+                selectableId = selectableKey2
+            )
+        val selection2 = Selection(start = startAnchor2, end = endAnchor2, handlesCrossed = false)
 
         val selection = selection1.merge(selection2)
 
@@ -121,39 +112,35 @@
         val startOffset1 = 20
         val endOffset1 = 9
         val selectableKey1 = 1L
-        val startAnchor1 = Selection.AnchorInfo(
-            direction = ResolvedTextDirection.Ltr,
-            offset = startOffset1,
-            selectableId = selectableKey1
-        )
-        val endAnchor1 = Selection.AnchorInfo(
-            direction = ResolvedTextDirection.Ltr,
-            offset = endOffset1,
-            selectableId = selectableKey1
-        )
-        val selection1 = Selection(
-            start = startAnchor1,
-            end = endAnchor1,
-            handlesCrossed = true
-        )
+        val startAnchor1 =
+            Selection.AnchorInfo(
+                direction = ResolvedTextDirection.Ltr,
+                offset = startOffset1,
+                selectableId = selectableKey1
+            )
+        val endAnchor1 =
+            Selection.AnchorInfo(
+                direction = ResolvedTextDirection.Ltr,
+                offset = endOffset1,
+                selectableId = selectableKey1
+            )
+        val selection1 = Selection(start = startAnchor1, end = endAnchor1, handlesCrossed = true)
         val startOffset2 = 30
         val endOffset2 = 0
         val selectableKey2 = 2L
-        val startAnchor2 = Selection.AnchorInfo(
-            direction = ResolvedTextDirection.Ltr,
-            offset = startOffset2,
-            selectableId = selectableKey2
-        )
-        val endAnchor2 = Selection.AnchorInfo(
-            direction = ResolvedTextDirection.Ltr,
-            offset = endOffset2,
-            selectableId = selectableKey2
-        )
-        val selection2 = Selection(
-            start = startAnchor2,
-            end = endAnchor2,
-            handlesCrossed = true
-        )
+        val startAnchor2 =
+            Selection.AnchorInfo(
+                direction = ResolvedTextDirection.Ltr,
+                offset = startOffset2,
+                selectableId = selectableKey2
+            )
+        val endAnchor2 =
+            Selection.AnchorInfo(
+                direction = ResolvedTextDirection.Ltr,
+                offset = endOffset2,
+                selectableId = selectableKey2
+            )
+        val selection2 = Selection(start = startAnchor2, end = endAnchor2, handlesCrossed = true)
 
         val selection = selection1.merge(selection2)
 
@@ -168,21 +155,19 @@
     fun selection_toTextRange_handles_not_cross() {
         val startOffset = 0
         val endOffset = 6
-        val startAnchor = Selection.AnchorInfo(
-            direction = ResolvedTextDirection.Ltr,
-            offset = startOffset,
-            selectableId = 1L
-        )
-        val endAnchor = Selection.AnchorInfo(
-            direction = ResolvedTextDirection.Ltr,
-            offset = endOffset,
-            selectableId = 1L
-        )
-        val selection = Selection(
-            start = startAnchor,
-            end = endAnchor,
-            handlesCrossed = false
-        )
+        val startAnchor =
+            Selection.AnchorInfo(
+                direction = ResolvedTextDirection.Ltr,
+                offset = startOffset,
+                selectableId = 1L
+            )
+        val endAnchor =
+            Selection.AnchorInfo(
+                direction = ResolvedTextDirection.Ltr,
+                offset = endOffset,
+                selectableId = 1L
+            )
+        val selection = Selection(start = startAnchor, end = endAnchor, handlesCrossed = false)
 
         val textRange = selection.toTextRange()
 
@@ -193,21 +178,19 @@
     fun selection_toTextRange_handles_cross() {
         val startOffset = 6
         val endOffset = 0
-        val startAnchor = Selection.AnchorInfo(
-            direction = ResolvedTextDirection.Ltr,
-            offset = startOffset,
-            selectableId = 1L
-        )
-        val endAnchor = Selection.AnchorInfo(
-            direction = ResolvedTextDirection.Ltr,
-            offset = endOffset,
-            selectableId = 1L
-        )
-        val selection = Selection(
-            start = startAnchor,
-            end = endAnchor,
-            handlesCrossed = false
-        )
+        val startAnchor =
+            Selection.AnchorInfo(
+                direction = ResolvedTextDirection.Ltr,
+                offset = startOffset,
+                selectableId = 1L
+            )
+        val endAnchor =
+            Selection.AnchorInfo(
+                direction = ResolvedTextDirection.Ltr,
+                offset = endOffset,
+                selectableId = 1L
+            )
+        val selection = Selection(start = startAnchor, end = endAnchor, handlesCrossed = false)
 
         val textRange = selection.toTextRange()
 
diff --git a/compose/foundation/foundation/src/androidUnitTest/kotlin/androidx/compose/foundation/text/selection/TextFieldSelectionManagerTest.kt b/compose/foundation/foundation/src/androidUnitTest/kotlin/androidx/compose/foundation/text/selection/TextFieldSelectionManagerTest.kt
index 9da17f9..bfe5e304 100644
--- a/compose/foundation/foundation/src/androidUnitTest/kotlin/androidx/compose/foundation/text/selection/TextFieldSelectionManagerTest.kt
+++ b/compose/foundation/foundation/src/androidUnitTest/kotlin/androidx/compose/foundation/text/selection/TextFieldSelectionManagerTest.kt
@@ -100,62 +100,58 @@
         manager.hapticFeedBack = hapticFeedback
         manager.focusRequester = focusRequester
 
-        whenever(layoutResult.layoutInput).thenReturn(
-            TextLayoutInput(
-                text = textAnnotatedString,
-                style = TextStyle.Default,
-                placeholders = mock(),
-                maxLines = maxLines,
-                softWrap = true,
-                overflow = TextOverflow.Ellipsis,
-                density = density,
-                layoutDirection = LayoutDirection.Ltr,
-                fontFamilyResolver = mock(),
-                constraints = Constraints()
+        whenever(layoutResult.layoutInput)
+            .thenReturn(
+                TextLayoutInput(
+                    text = textAnnotatedString,
+                    style = TextStyle.Default,
+                    placeholders = mock(),
+                    maxLines = maxLines,
+                    softWrap = true,
+                    overflow = TextOverflow.Ellipsis,
+                    density = density,
+                    layoutDirection = LayoutDirection.Ltr,
+                    fontFamilyResolver = mock(),
+                    constraints = Constraints()
+                )
             )
-        )
 
         whenever(layoutResult.lineCount).thenReturn(maxLines)
         whenever(layoutResult.getWordBoundary(beginOffset))
             .thenAnswer(TextRangeAnswer(fakeTextRange))
         whenever(layoutResult.getWordBoundary(dragOffset))
             .thenAnswer(TextRangeAnswer(dragTextRange))
-        whenever(layoutResult.getBidiRunDirection(any()))
-            .thenReturn(ResolvedTextDirection.Ltr)
+        whenever(layoutResult.getBidiRunDirection(any())).thenReturn(ResolvedTextDirection.Ltr)
         whenever(layoutResult.getBoundingBox(any())).thenReturn(Rect.Zero)
         // left or right handle drag
         whenever(layoutResult.getOffsetForPosition(dragBeginPosition)).thenReturn(beginOffset)
         whenever(layoutResult.getOffsetForPosition(dragBeginPosition + dragDistance))
             .thenReturn(dragOffset)
         // touch drag
-        whenever(
-            layoutResultProxy.getOffsetForPosition(dragBeginPosition, false)
-        ).thenReturn(beginOffset)
-        whenever(
-            layoutResultProxy.getOffsetForPosition(dragBeginPosition, true)
-        ).thenReturn(beginOffset)
-        whenever(
-            layoutResultProxy.getOffsetForPosition(dragBeginPosition + dragDistance, false)
-        ).thenReturn(dragOffset)
-        whenever(
-            layoutResultProxy.getOffsetForPosition(dragBeginPosition + dragDistance, true)
-        ).thenReturn(dragOffset)
+        whenever(layoutResultProxy.getOffsetForPosition(dragBeginPosition, false))
+            .thenReturn(beginOffset)
+        whenever(layoutResultProxy.getOffsetForPosition(dragBeginPosition, true))
+            .thenReturn(beginOffset)
+        whenever(layoutResultProxy.getOffsetForPosition(dragBeginPosition + dragDistance, false))
+            .thenReturn(dragOffset)
+        whenever(layoutResultProxy.getOffsetForPosition(dragBeginPosition + dragDistance, true))
+            .thenReturn(dragOffset)
 
         whenever(
-            layoutResultProxy.translateInnerToDecorationCoordinates(matchesOffset(dragDistance))
-        ).thenAnswer(OffsetAnswer(dragDistance))
+                layoutResultProxy.translateInnerToDecorationCoordinates(matchesOffset(dragDistance))
+            )
+            .thenAnswer(OffsetAnswer(dragDistance))
 
         whenever(layoutResultProxy.value).thenReturn(layoutResult)
 
-        val textDelegate = mock<TextDelegate> {
-            on { this.text }.thenReturn(textAnnotatedString)
-        }
+        val textDelegate = mock<TextDelegate> { on { this.text }.thenReturn(textAnnotatedString) }
 
-        state = LegacyTextFieldState(
-            textDelegate = textDelegate,
-            recomposeScope = mock(),
-            keyboardController = null
-        )
+        state =
+            LegacyTextFieldState(
+                textDelegate = textDelegate,
+                recomposeScope = mock(),
+                keyboardController = null
+            )
         state.layoutResult = layoutResultProxy
         manager.state = state
         whenever(state.textDelegate.density).thenReturn(density)
@@ -178,15 +174,9 @@
         assertThat(state.handleState).isEqualTo(HandleState.None)
         assertThat(state.showFloatingToolbar).isFalse()
         assertThat(value.selection).isEqualTo(fakeTextRange)
-        verify(
-            hapticFeedback,
-            times(1)
-        ).performHapticFeedback(HapticFeedbackType.TextHandleMove)
+        verify(hapticFeedback, times(1)).performHapticFeedback(HapticFeedbackType.TextHandleMove)
 
-        verify(
-            focusRequester,
-            times(1)
-        ).requestFocus()
+        verify(focusRequester, times(1)).requestFocus()
     }
 
     @Test
@@ -203,15 +193,9 @@
         assertThat(state.handleState).isEqualTo(HandleState.None)
         assertThat(state.showFloatingToolbar).isFalse()
         assertThat(value.selection).isEqualTo(TextRange(fakeLineEnd))
-        verify(
-            hapticFeedback,
-            times(1)
-        ).performHapticFeedback(HapticFeedbackType.TextHandleMove)
+        verify(hapticFeedback, times(1)).performHapticFeedback(HapticFeedbackType.TextHandleMove)
 
-        verify(
-            focusRequester,
-            times(1)
-        ).requestFocus()
+        verify(focusRequester, times(1)).requestFocus()
     }
 
     @Test
@@ -224,10 +208,7 @@
         assertThat(state.handleState).isEqualTo(HandleState.None)
         assertThat(value.selection).isEqualTo(TextRange(0, text.length))
         assertThat(state.showFloatingToolbar).isFalse()
-        verify(
-            hapticFeedback,
-            times(2)
-        ).performHapticFeedback(HapticFeedbackType.TextHandleMove)
+        verify(hapticFeedback, times(2)).performHapticFeedback(HapticFeedbackType.TextHandleMove)
     }
 
     @Test
@@ -242,10 +223,7 @@
         assertThat(state.handleState).isEqualTo(HandleState.Selection)
         assertThat(value.selection).isEqualTo(TextRange(0, text.length))
         assertThat(state.showFloatingToolbar).isTrue()
-        verify(
-            hapticFeedback,
-            times(2)
-        ).performHapticFeedback(HapticFeedbackType.TextHandleMove)
+        verify(hapticFeedback, times(2)).performHapticFeedback(HapticFeedbackType.TextHandleMove)
     }
 
     @Test
@@ -255,10 +233,7 @@
         assertThat(manager.draggingHandle).isNotNull()
         assertThat(state.showFloatingToolbar).isFalse()
         verify(spyLambda, times(0)).invoke(any())
-        verify(
-            hapticFeedback,
-            times(0)
-        ).performHapticFeedback(HapticFeedbackType.TextHandleMove)
+        verify(hapticFeedback, times(0)).performHapticFeedback(HapticFeedbackType.TextHandleMove)
     }
 
     @Test
@@ -268,10 +243,7 @@
         assertThat(manager.draggingHandle).isNotNull()
         assertThat(state.showFloatingToolbar).isFalse()
         verify(spyLambda, times(0)).invoke(any())
-        verify(
-            hapticFeedback,
-            times(0)
-        ).performHapticFeedback(HapticFeedbackType.TextHandleMove)
+        verify(hapticFeedback, times(0)).performHapticFeedback(HapticFeedbackType.TextHandleMove)
     }
 
     @Test
@@ -282,10 +254,7 @@
 
         assertThat(state.showFloatingToolbar).isFalse()
         assertThat(value.selection).isEqualTo(TextRange(text.length, "Hello".length))
-        verify(
-            hapticFeedback,
-            times(1)
-        ).performHapticFeedback(HapticFeedbackType.TextHandleMove)
+        verify(hapticFeedback, times(1)).performHapticFeedback(HapticFeedbackType.TextHandleMove)
     }
 
     @Test
@@ -296,10 +265,7 @@
 
         assertThat(state.showFloatingToolbar).isFalse()
         assertThat(value.selection).isEqualTo(TextRange(0, dragOffset))
-        verify(
-            hapticFeedback,
-            times(1)
-        ).performHapticFeedback(HapticFeedbackType.TextHandleMove)
+        verify(hapticFeedback, times(1)).performHapticFeedback(HapticFeedbackType.TextHandleMove)
     }
 
     @Test
@@ -307,19 +273,13 @@
         manager.handleDragObserver(false).onStart(Offset.Zero)
         manager.handleDragObserver(false).onDrag(Offset.Zero)
 
-        verify(
-            hapticFeedback,
-            times(1)
-        ).performHapticFeedback(HapticFeedbackType.TextHandleMove)
+        verify(hapticFeedback, times(1)).performHapticFeedback(HapticFeedbackType.TextHandleMove)
 
         manager.handleDragObserver(false).onStop()
 
         assertThat(manager.draggingHandle).isNull()
         assertThat(state.showFloatingToolbar).isTrue()
-        verify(
-            hapticFeedback,
-            times(1)
-        ).performHapticFeedback(HapticFeedbackType.TextHandleMove)
+        verify(hapticFeedback, times(1)).performHapticFeedback(HapticFeedbackType.TextHandleMove)
     }
 
     @Test
@@ -329,10 +289,7 @@
         assertThat(manager.draggingHandle).isNotNull()
         assertThat(state.showFloatingToolbar).isFalse()
         verify(spyLambda, times(0)).invoke(any())
-        verify(
-            hapticFeedback,
-            times(0)
-        ).performHapticFeedback(HapticFeedbackType.TextHandleMove)
+        verify(hapticFeedback, times(0)).performHapticFeedback(HapticFeedbackType.TextHandleMove)
     }
 
     @Test
@@ -343,19 +300,18 @@
 
         assertThat(state.showFloatingToolbar).isFalse()
         assertThat(value.selection).isEqualTo(TextRange(dragOffset, dragOffset))
-        verify(
-            hapticFeedback,
-            times(1)
-        ).performHapticFeedback(HapticFeedbackType.TextHandleMove)
+        verify(hapticFeedback, times(1)).performHapticFeedback(HapticFeedbackType.TextHandleMove)
     }
 
     @Test
     fun TextFieldSelectionManager_cursorDragObserver_onDrag_withVisualTransformation() {
         // there is a placeholder after every other char in the original value
-        val offsetMapping = object : OffsetMapping {
-            override fun originalToTransformed(offset: Int) = 2 * offset
-            override fun transformedToOriginal(offset: Int) = offset / 2
-        }
+        val offsetMapping =
+            object : OffsetMapping {
+                override fun originalToTransformed(offset: Int) = 2 * offset
+
+                override fun transformedToOriginal(offset: Int) = offset / 2
+            }
         manager.value = TextFieldValue(text = "H*e*l*l*o* *W*o*r*l*d", selection = TextRange(0, 0))
         manager.offsetMapping = offsetMapping
         manager.visualTransformation = VisualTransformation { original ->
@@ -375,19 +331,13 @@
         manager.handleDragObserver(false).onStart(Offset.Zero)
         manager.handleDragObserver(false).onDrag(Offset.Zero)
 
-        verify(
-            hapticFeedback,
-            times(1)
-        ).performHapticFeedback(HapticFeedbackType.TextHandleMove)
+        verify(hapticFeedback, times(1)).performHapticFeedback(HapticFeedbackType.TextHandleMove)
 
         manager.cursorDragObserver().onStop()
 
         assertThat(manager.draggingHandle).isNull()
         assertThat(state.showFloatingToolbar).isFalse()
-        verify(
-            hapticFeedback,
-            times(1)
-        ).performHapticFeedback(HapticFeedbackType.TextHandleMove)
+        verify(hapticFeedback, times(1)).performHapticFeedback(HapticFeedbackType.TextHandleMove)
     }
 
     @Test
@@ -424,10 +374,8 @@
 
     @Test
     fun copy_selection_reversed() {
-        manager.value = TextFieldValue(
-            text = text,
-            selection = TextRange("Hello".length, "He".length)
-        )
+        manager.value =
+            TextFieldValue(text = text, selection = TextRange("Hello".length, "He".length))
 
         manager.copy()
 
@@ -457,10 +405,8 @@
     @Test
     fun paste_clipBoardManager_not_empty() {
         whenever(clipboardManager.getText()).thenReturn(AnnotatedString("Hello"))
-        manager.value = TextFieldValue(
-            text = text,
-            selection = TextRange("Hel".length, "Hello Wo".length)
-        )
+        manager.value =
+            TextFieldValue(text = text, selection = TextRange("Hel".length, "Hello Wo".length))
 
         manager.paste()
 
@@ -472,10 +418,8 @@
     @Test
     fun paste_selection_reversed() {
         whenever(clipboardManager.getText()).thenReturn(AnnotatedString("i"))
-        manager.value = TextFieldValue(
-            text = text,
-            selection = TextRange("Hello".length, "H".length)
-        )
+        manager.value =
+            TextFieldValue(text = text, selection = TextRange("Hello".length, "H".length))
 
         manager.paste()
 
@@ -495,10 +439,8 @@
 
     @Test
     fun cut_selection_not_null() {
-        manager.value = TextFieldValue(
-            text = text + text,
-            selection = TextRange("Hello".length, text.length)
-        )
+        manager.value =
+            TextFieldValue(text = text + text, selection = TextRange("Hello".length, text.length))
 
         manager.cut()
 
@@ -510,10 +452,8 @@
 
     @Test
     fun cut_selection_reversed() {
-        manager.value = TextFieldValue(
-            text = text,
-            selection = TextRange("Hello".length, "He".length)
-        )
+        manager.value =
+            TextFieldValue(text = text, selection = TextRange("Hello".length, "He".length))
 
         manager.cut()
 
@@ -525,10 +465,7 @@
 
     @Test
     fun selectAll() {
-        manager.value = TextFieldValue(
-            text = text,
-            selection = TextRange(0)
-        )
+        manager.value = TextFieldValue(text = text, selection = TextRange(0))
 
         manager.selectAll()
 
@@ -541,10 +478,7 @@
 
     @Test
     fun selectAll_whenPartiallySelected() {
-        manager.value = TextFieldValue(
-            text = text,
-            selection = TextRange(0, 5)
-        )
+        manager.value = TextFieldValue(text = text, selection = TextRange(0, 5))
 
         manager.selectAll()
 
@@ -558,10 +492,8 @@
     @Test
     fun showSelectionToolbar_trigger_textToolbar_showMenu_noText_inClipboard_not_show_paste() {
         whenever(clipboardManager.hasText()).thenReturn(false)
-        manager.value = TextFieldValue(
-            text = text + text,
-            selection = TextRange("Hello".length, text.length)
-        )
+        manager.value =
+            TextFieldValue(text = text + text, selection = TextRange("Hello".length, text.length))
 
         manager.showSelectionToolbar()
 
@@ -571,10 +503,8 @@
     @Test
     fun showSelectionToolbar_trigger_textToolbar_showMenu_hasText_inClipboard_show_paste() {
         whenever(clipboardManager.hasText()).thenReturn(true)
-        manager.value = TextFieldValue(
-            text = text + text,
-            selection = TextRange("Hello".length, text.length)
-        )
+        manager.value =
+            TextFieldValue(text = text + text, selection = TextRange("Hello".length, text.length))
 
         manager.showSelectionToolbar()
 
@@ -586,10 +516,7 @@
     fun showSelectionToolbar_trigger_textToolbar_showMenu_selection_collapse_not_show_copy_cut() {
         whenever(clipboardManager.getText()).thenReturn(AnnotatedString(text))
         whenever(clipboardManager.hasText()).thenReturn(true)
-        manager.value = TextFieldValue(
-            text = text + text,
-            selection = TextRange(0, 0)
-        )
+        manager.value = TextFieldValue(text = text + text, selection = TextRange(0, 0))
 
         manager.showSelectionToolbar()
 
@@ -653,8 +580,7 @@
 }
 
 internal class OffsetAnswer(private val offset: Offset) : Answer<Any> {
-    override fun answer(invocation: InvocationOnMock?): Any =
-        packFloats(offset.x, offset.y)
+    override fun answer(invocation: InvocationOnMock?): Any = packFloats(offset.x, offset.y)
 }
 
 // Another workaround for matching an Offset
diff --git a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/Background.kt b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/Background.kt
index c9ce2c9..60f09d9 100644
--- a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/Background.kt
+++ b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/Background.kt
@@ -45,22 +45,20 @@
  * @param shape desired shape of the background
  */
 @Stable
-fun Modifier.background(
-    color: Color,
-    shape: Shape = RectangleShape
-): Modifier {
+fun Modifier.background(color: Color, shape: Shape = RectangleShape): Modifier {
     val alpha = 1.0f // for solid colors
     return this.then(
         BackgroundElement(
             color = color,
             shape = shape,
             alpha = alpha,
-            inspectorInfo = debugInspectorInfo {
-                name = "background"
-                value = color
-                properties["color"] = color
-                properties["shape"] = shape
-            }
+            inspectorInfo =
+                debugInspectorInfo {
+                    name = "background"
+                    value = color
+                    properties["color"] = color
+                    properties["shape"] = shape
+                }
         )
     )
 }
@@ -72,28 +70,29 @@
  *
  * @param brush brush to paint background with
  * @param shape desired shape of the background
- * @param alpha Opacity to be applied to the [brush], with `0` being completely transparent and
- * `1` being completely opaque. The value must be between `0` and `1`.
+ * @param alpha Opacity to be applied to the [brush], with `0` being completely transparent and `1`
+ *   being completely opaque. The value must be between `0` and `1`.
  */
 @Stable
 fun Modifier.background(
     brush: Brush,
     shape: Shape = RectangleShape,
-    @FloatRange(from = 0.0, to = 1.0)
-    alpha: Float = 1.0f
-) = this.then(
-    BackgroundElement(
-        brush = brush,
-        alpha = alpha,
-        shape = shape,
-        inspectorInfo = debugInspectorInfo {
-            name = "background"
-            properties["alpha"] = alpha
-            properties["brush"] = brush
-            properties["shape"] = shape
-        }
+    @FloatRange(from = 0.0, to = 1.0) alpha: Float = 1.0f
+) =
+    this.then(
+        BackgroundElement(
+            brush = brush,
+            alpha = alpha,
+            shape = shape,
+            inspectorInfo =
+                debugInspectorInfo {
+                    name = "background"
+                    properties["alpha"] = alpha
+                    properties["brush"] = brush
+                    properties["shape"] = shape
+                }
+        )
     )
-)
 
 private class BackgroundElement(
     private val color: Color = Color.Unspecified,
@@ -103,12 +102,7 @@
     private val inspectorInfo: InspectorInfo.() -> Unit
 ) : ModifierNodeElement<BackgroundNode>() {
     override fun create(): BackgroundNode {
-        return BackgroundNode(
-            color,
-            brush,
-            alpha,
-            shape
-        )
+        return BackgroundNode(color, brush, alpha, shape)
     }
 
     override fun update(node: BackgroundNode) {
@@ -191,9 +185,7 @@
             outline = lastOutline!!
         } else {
             // Manually observe reads so we can directly invalidate the outline when it changes
-            observeReads {
-                outline = shape.createOutline(size, layoutDirection, this)
-            }
+            observeReads { outline = shape.createOutline(size, layoutDirection, this) }
         }
         lastOutline = outline
         lastSize = size
diff --git a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/BasicMarquee.kt b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/BasicMarquee.kt
index 3bde1f2..ef09a14 100644
--- a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/BasicMarquee.kt
+++ b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/BasicMarquee.kt
@@ -76,30 +76,24 @@
  * Namespace for constants representing the default values for various [basicMarquee] parameters.
  */
 object MarqueeDefaults {
-    /**
-     * Default value for the `iterations` parameter to [basicMarquee].
-     */
-    // From https://cs.android.com/android/platform/superproject/+/master:frameworks/base/core/java/android/widget/TextView.java;l=736;drc=6d97d6d7215fef247d1a90e05545cac3676f9212
-    @Suppress("MayBeConstant")
-    val Iterations: Int = 3
+    /** Default value for the `iterations` parameter to [basicMarquee]. */
+    // From
+    // https://cs.android.com/android/platform/superproject/+/master:frameworks/base/core/java/android/widget/TextView.java;l=736;drc=6d97d6d7215fef247d1a90e05545cac3676f9212
+    @Suppress("MayBeConstant") val Iterations: Int = 3
 
-    /**
-     * Default value for the `repeatDelayMillis` parameter to [basicMarquee].
-     */
-    // From https://cs.android.com/android/platform/superproject/+/master:frameworks/base/core/java/android/widget/TextView.java;l=13979;drc=6d97d6d7215fef247d1a90e05545cac3676f9212
-    @Suppress("MayBeConstant")
-    val RepeatDelayMillis: Int = 1_200
+    /** Default value for the `repeatDelayMillis` parameter to [basicMarquee]. */
+    // From
+    // https://cs.android.com/android/platform/superproject/+/master:frameworks/base/core/java/android/widget/TextView.java;l=13979;drc=6d97d6d7215fef247d1a90e05545cac3676f9212
+    @Suppress("MayBeConstant") val RepeatDelayMillis: Int = 1_200
 
-    /**
-     * Default value for the `spacing` parameter to [basicMarquee].
-     */
-    // From https://cs.android.com/android/platform/superproject/+/master:frameworks/base/core/java/android/widget/TextView.java;l=14088;drc=6d97d6d7215fef247d1a90e05545cac3676f9212
+    /** Default value for the `spacing` parameter to [basicMarquee]. */
+    // From
+    // https://cs.android.com/android/platform/superproject/+/master:frameworks/base/core/java/android/widget/TextView.java;l=14088;drc=6d97d6d7215fef247d1a90e05545cac3676f9212
     val Spacing: MarqueeSpacing = MarqueeSpacing.fractionOfContainer(1f / 3f)
 
-    /**
-     * Default value for the `velocity` parameter to [basicMarquee].
-     */
-    // From https://cs.android.com/android/platform/superproject/+/master:frameworks/base/core/java/android/widget/TextView.java;l=13980;drc=6d97d6d7215fef247d1a90e05545cac3676f9212
+    /** Default value for the `velocity` parameter to [basicMarquee]. */
+    // From
+    // https://cs.android.com/android/platform/superproject/+/master:frameworks/base/core/java/android/widget/TextView.java;l=13980;drc=6d97d6d7215fef247d1a90e05545cac3676f9212
     val Velocity: Dp = 30.dp
 }
 
@@ -109,8 +103,8 @@
  * content will be measured with unbounded width.
  *
  * When the animation is running, it will restart from the initial state any time:
- *  - any of the parameters to this modifier change, or
- *  - the content or container size change.
+ * - any of the parameters to this modifier change, or
+ * - the content or container size change.
  *
  * The animation only affects the drawing of the content, not its position. The offset returned by
  * the [LayoutCoordinates] of anything inside the marquee is undefined relative to anything outside
@@ -122,22 +116,25 @@
  * your own by placing modifiers before this one.
  *
  * @sample androidx.compose.foundation.samples.BasicMarqueeSample
+ *
  * @sample androidx.compose.foundation.samples.BasicMarqueeWithFadedEdgesSample
+ *
  * @sample androidx.compose.foundation.samples.BasicFocusableMarqueeSample
  *
  * @param iterations The number of times to repeat the animation. `Int.MAX_VALUE` will repeat
- * forever, and 0 will disable animation.
+ *   forever, and 0 will disable animation.
  * @param animationMode Whether the marquee should start animating [Immediately] or only
- * [WhileFocused]. In [WhileFocused] mode, the modified node or the content must be made
- * [focusable]. Note that the [initialDelayMillis] is part of the animation, so this parameter
- * determines when that initial delay starts counting down, not when the content starts to actually
- * scroll.
- * @param repeatDelayMillis The duration to wait before starting each subsequent iteration, in millis.
+ *   [WhileFocused]. In [WhileFocused] mode, the modified node or the content must be made
+ *   [focusable]. Note that the [initialDelayMillis] is part of the animation, so this parameter
+ *   determines when that initial delay starts counting down, not when the content starts to
+ *   actually scroll.
+ * @param repeatDelayMillis The duration to wait before starting each subsequent iteration, in
+ *   millis.
  * @param initialDelayMillis The duration to wait before starting the first iteration of the
- * animation, in millis. By default, there will be no initial delay if [animationMode] is
- * [WhileFocused], otherwise the initial delay will be [repeatDelayMillis].
+ *   animation, in millis. By default, there will be no initial delay if [animationMode] is
+ *   [WhileFocused], otherwise the initial delay will be [repeatDelayMillis].
  * @param spacing A [MarqueeSpacing] that specifies how much space to leave at the end of the
- * content before showing the beginning again.
+ *   content before showing the beginning again.
  * @param velocity The speed of the animation in dps / second.
  */
 @Stable
@@ -149,14 +146,16 @@
     initialDelayMillis: Int = if (animationMode == Immediately) repeatDelayMillis else 0,
     spacing: MarqueeSpacing = Spacing,
     velocity: Dp = Velocity
-): Modifier = this then MarqueeModifierElement(
-    iterations = iterations,
-    animationMode = animationMode,
-    delayMillis = repeatDelayMillis,
-    initialDelayMillis = initialDelayMillis,
-    spacing = spacing,
-    velocity = velocity,
-)
+): Modifier =
+    this then
+        MarqueeModifierElement(
+            iterations = iterations,
+            animationMode = animationMode,
+            delayMillis = repeatDelayMillis,
+            initialDelayMillis = initialDelayMillis,
+            spacing = spacing,
+            velocity = velocity,
+        )
 
 private data class MarqueeModifierElement(
     private val iterations: Int,
@@ -205,10 +204,7 @@
     private var initialDelayMillis: Int,
     spacing: MarqueeSpacing,
     private var velocity: Dp,
-) : Modifier.Node(),
-    LayoutModifierNode,
-    DrawModifierNode,
-    FocusEventModifierNode {
+) : Modifier.Node(), LayoutModifierNode, DrawModifierNode, FocusEventModifierNode {
 
     private var contentWidth by mutableIntStateOf(0)
     private var containerWidth by mutableIntStateOf(0)
@@ -219,14 +215,15 @@
 
     private val offset = Animatable(0f)
     private val direction
-        get() = sign(velocity.value) * when (requireLayoutDirection()) {
-            LayoutDirection.Ltr -> 1
-            LayoutDirection.Rtl -> -1
-        }
+        get() =
+            sign(velocity.value) *
+                when (requireLayoutDirection()) {
+                    LayoutDirection.Ltr -> 1
+                    LayoutDirection.Rtl -> -1
+                }
+
     private val spacingPx by derivedStateOf {
-        with(spacing) {
-            requireDensity().calculateSpacing(contentWidth, containerWidth)
-        }
+        with(spacing) { requireDensity().calculateSpacing(contentWidth, containerWidth) }
     }
 
     override fun onAttach() {
@@ -251,9 +248,9 @@
 
         if (
             this.iterations != iterations ||
-            this.delayMillis != delayMillis ||
-            this.initialDelayMillis != initialDelayMillis ||
-            this.velocity != velocity
+                this.delayMillis != delayMillis ||
+                this.initialDelayMillis != initialDelayMillis ||
+                this.velocity != velocity
         ) {
             this.iterations = iterations
             this.delayMillis = delayMillis
@@ -309,18 +306,21 @@
 
     override fun ContentDrawScope.draw() {
         val clipOffset = offset.value * direction
-        val firstCopyVisible = when (direction) {
-            1f -> offset.value < contentWidth
-            else -> offset.value < containerWidth
-        }
-        val secondCopyVisible = when (direction) {
-            1f -> offset.value > (contentWidth + spacingPx) - containerWidth
-            else -> offset.value > spacingPx
-        }
-        val secondCopyOffset = when (direction) {
-            1f -> contentWidth + spacingPx
-            else -> -contentWidth - spacingPx
-        }.toFloat()
+        val firstCopyVisible =
+            when (direction) {
+                1f -> offset.value < contentWidth
+                else -> offset.value < containerWidth
+            }
+        val secondCopyVisible =
+            when (direction) {
+                1f -> offset.value > (contentWidth + spacingPx) - containerWidth
+                else -> offset.value > spacingPx
+            }
+        val secondCopyOffset =
+            when (direction) {
+                1f -> contentWidth + spacingPx
+                else -> -contentWidth - spacingPx
+            }.toFloat()
 
         clipRect(left = clipOffset, right = clipOffset + containerWidth) {
             // TODO(b/262284225) When both copies are visible, we call drawContent twice. This is
@@ -332,9 +332,7 @@
                 this@draw.drawContent()
             }
             if (secondCopyVisible) {
-                translate(left = secondCopyOffset) {
-                    this@draw.drawContent()
-                }
+                translate(left = secondCopyOffset) { this@draw.drawContent() }
             }
         }
     }
@@ -343,11 +341,12 @@
         val oldJob = animationJob
         oldJob?.cancel()
         if (isAttached) {
-            animationJob = coroutineScope.launch {
-                // Wait for the cancellation to finish.
-                oldJob?.join()
-                runAnimation()
-            }
+            animationJob =
+                coroutineScope.launch {
+                    // Wait for the cancellation to finish.
+                    oldJob?.join()
+                    runAnimation()
+                }
         }
     }
 
@@ -362,33 +361,35 @@
         // an extra CoroutineContext every time the flow emits.
         withContext(FixedMotionDurationScale) {
             snapshotFlow {
-                // Don't animate if content fits. (Because coroutines, the int will get boxed
-                // anyway.)
-                if (contentWidth <= containerWidth) return@snapshotFlow null
-                if (animationMode == WhileFocused && !hasFocus) return@snapshotFlow null
-                (contentWidth + spacingPx).toFloat()
-            }.collectLatest { contentWithSpacingWidth ->
-                // Don't animate when the content fits.
-                if (contentWithSpacingWidth == null) return@collectLatest
-
-                val spec = createMarqueeAnimationSpec(
-                    iterations,
-                    contentWithSpacingWidth,
-                    initialDelayMillis,
-                    delayMillis,
-                    velocity,
-                    requireDensity()
-                )
-
-                offset.snapTo(0f)
-                try {
-                    offset.animateTo(contentWithSpacingWidth, spec)
-                } finally {
-                    // This needs to be in a finally so the offset is reset if the animation is
-                    // cancelled when losing focus in WhileFocused mode.
-                    offset.snapTo(0f)
+                    // Don't animate if content fits. (Because coroutines, the int will get boxed
+                    // anyway.)
+                    if (contentWidth <= containerWidth) return@snapshotFlow null
+                    if (animationMode == WhileFocused && !hasFocus) return@snapshotFlow null
+                    (contentWidth + spacingPx).toFloat()
                 }
-            }
+                .collectLatest { contentWithSpacingWidth ->
+                    // Don't animate when the content fits.
+                    if (contentWithSpacingWidth == null) return@collectLatest
+
+                    val spec =
+                        createMarqueeAnimationSpec(
+                            iterations,
+                            contentWithSpacingWidth,
+                            initialDelayMillis,
+                            delayMillis,
+                            velocity,
+                            requireDensity()
+                        )
+
+                    offset.snapTo(0f)
+                    try {
+                        offset.animateTo(contentWithSpacingWidth, spec)
+                    } finally {
+                        // This needs to be in a finally so the offset is reset if the animation is
+                        // cancelled when losing focus in WhileFocused mode.
+                        offset.snapTo(0f)
+                    }
+                }
         }
     }
 }
@@ -402,11 +403,12 @@
     density: Density
 ): AnimationSpec<Float> {
     val pxPerSec = with(density) { velocity.toPx() }
-    val singleSpec = velocityBasedTween(
-        velocity = pxPerSec.absoluteValue,
-        targetValue = targetValue,
-        delayMillis = delayMillis
-    )
+    val singleSpec =
+        velocityBasedTween(
+            velocity = pxPerSec.absoluteValue,
+            targetValue = targetValue,
+            delayMillis = delayMillis
+        )
     // Need to cancel out the non-initial delay.
     val startOffset = StartOffset(-delayMillis + initialDelayMillis)
     return if (iterations == Int.MAX_VALUE) {
@@ -439,11 +441,12 @@
 @JvmInline
 value class MarqueeAnimationMode private constructor(private val value: Int) {
 
-    override fun toString(): String = when (this) {
-        Immediately -> "Immediately"
-        WhileFocused -> "WhileFocused"
-        else -> error("invalid value: $value")
-    }
+    override fun toString(): String =
+        when (this) {
+            Immediately -> "Immediately"
+            WhileFocused -> "WhileFocused"
+            else -> error("invalid value: $value")
+        }
 
     companion object {
         /**
@@ -459,9 +462,7 @@
     }
 }
 
-/**
- * A [MarqueeSpacing] with a fixed size.
- */
+/** A [MarqueeSpacing] with a fixed size. */
 fun MarqueeSpacing(spacing: Dp): MarqueeSpacing = MarqueeSpacing { _, _ -> spacing.roundToPx() }
 
 /**
@@ -478,21 +479,16 @@
      * to be re-calculated when it changes.
      *
      * @param contentWidth The width of the content inside the marquee, in pixels. Will always be
-     * larger than [containerWidth].
+     *   larger than [containerWidth].
      * @param containerWidth The width of the marquee itself, in pixels. Will always be smaller than
-     * [contentWidth].
+     *   [contentWidth].
      * @return The space in pixels between the end of the content and the beginning of the content
-     * when wrapping.
+     *   when wrapping.
      */
-    fun Density.calculateSpacing(
-        contentWidth: Int,
-        containerWidth: Int
-    ): Int
+    fun Density.calculateSpacing(contentWidth: Int, containerWidth: Int): Int
 
     companion object {
-        /**
-         * A [MarqueeSpacing] that is a fraction of the container's width.
-         */
+        /** A [MarqueeSpacing] that is a fraction of the container's width. */
         fun fractionOfContainer(fraction: Float): MarqueeSpacing = MarqueeSpacing { _, width ->
             (fraction * width).roundToInt()
         }
diff --git a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/BasicTooltip.kt b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/BasicTooltip.kt
index c55d932..63da5c3 100644
--- a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/BasicTooltip.kt
+++ b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/BasicTooltip.kt
@@ -31,21 +31,21 @@
 /**
  * BasicTooltipBox that wraps a composable with a tooltip.
  *
- * Tooltip that provides a descriptive message for an anchor.
- * It can be used to call the users attention to the anchor.
+ * Tooltip that provides a descriptive message for an anchor. It can be used to call the users
+ * attention to the anchor.
  *
- * @param positionProvider [PopupPositionProvider] that will be used to place the tooltip
- * relative to the anchor content.
+ * @param positionProvider [PopupPositionProvider] that will be used to place the tooltip relative
+ *   to the anchor content.
  * @param tooltip the composable that will be used to populate the tooltip's content.
  * @param state handles the state of the tooltip's visibility.
  * @param modifier the [Modifier] to be applied to this BasicTooltipBox.
- * @param focusable [Boolean] that determines if the tooltip is focusable. When true,
- * the tooltip will consume touch events while it's shown and will have accessibility
- * focus move to the first element of the component. When false, the tooltip
- * won't consume touch events while it's shown but assistive-tech users will need
- * to swipe or drag to get to the first element of the component.
- * @param enableUserInput [Boolean] which determines if this BasicTooltipBox will handle
- * long press and mouse hover to trigger the tooltip through the state provided.
+ * @param focusable [Boolean] that determines if the tooltip is focusable. When true, the tooltip
+ *   will consume touch events while it's shown and will have accessibility focus move to the first
+ *   element of the component. When false, the tooltip won't consume touch events while it's shown
+ *   but assistive-tech users will need to swipe or drag to get to the first element of the
+ *   component.
+ * @param enableUserInput [Boolean] which determines if this BasicTooltipBox will handle long press
+ *   and mouse hover to trigger the tooltip through the state provided.
  * @param content the composable that the tooltip will anchor to.
  */
 @Composable
@@ -64,14 +64,13 @@
  * Create and remember the default [BasicTooltipState].
  *
  * @param initialIsVisible the initial value for the tooltip's visibility when drawn.
- * @param isPersistent [Boolean] that determines if the tooltip associated with this
- * will be persistent or not. If isPersistent is true, then the tooltip will
- * only be dismissed when the user clicks outside the bounds of the tooltip or if
- * [BasicTooltipState.dismiss] is called. When isPersistent is false, the tooltip will dismiss after
- * a short duration. Ideally, this should be set to true when there is actionable content
- * being displayed within a tooltip.
- * @param mutatorMutex [MutatorMutex] used to ensure that for all of the tooltips associated
- * with the mutator mutex, only one will be shown on the screen at any time.
+ * @param isPersistent [Boolean] that determines if the tooltip associated with this will be
+ *   persistent or not. If isPersistent is true, then the tooltip will only be dismissed when the
+ *   user clicks outside the bounds of the tooltip or if [BasicTooltipState.dismiss] is called. When
+ *   isPersistent is false, the tooltip will dismiss after a short duration. Ideally, this should be
+ *   set to true when there is actionable content being displayed within a tooltip.
+ * @param mutatorMutex [MutatorMutex] used to ensure that for all of the tooltips associated with
+ *   the mutator mutex, only one will be shown on the screen at any time.
  */
 @Composable
 @ExperimentalFoundationApi
@@ -80,10 +79,7 @@
     isPersistent: Boolean = true,
     mutatorMutex: MutatorMutex = BasicTooltipDefaults.GlobalMutatorMutex
 ): BasicTooltipState =
-    remember(
-        isPersistent,
-        mutatorMutex
-    ) {
+    remember(isPersistent, mutatorMutex) {
         BasicTooltipStateImpl(
             initialIsVisible = initialIsVisible,
             isPersistent = isPersistent,
@@ -95,14 +91,13 @@
  * Constructor extension function for [BasicTooltipState]
  *
  * @param initialIsVisible the initial value for the tooltip's visibility when drawn.
- * @param isPersistent [Boolean] that determines if the tooltip associated with this
- * will be persistent or not. If isPersistent is true, then the tooltip will
- * only be dismissed when the user clicks outside the bounds of the tooltip or if
- * [BasicTooltipState.dismiss] is called. When isPersistent is false, the tooltip will dismiss after
- * a short duration. Ideally, this should be set to true when there is actionable content
- * being displayed within a tooltip.
- * @param mutatorMutex [MutatorMutex] used to ensure that for all of the tooltips associated
- * with the mutator mutex, only one will be shown on the screen at any time.
+ * @param isPersistent [Boolean] that determines if the tooltip associated with this will be
+ *   persistent or not. If isPersistent is true, then the tooltip will only be dismissed when the
+ *   user clicks outside the bounds of the tooltip or if [BasicTooltipState.dismiss] is called. When
+ *   isPersistent is false, the tooltip will dismiss after a short duration. Ideally, this should be
+ *   set to true when there is actionable content being displayed within a tooltip.
+ * @param mutatorMutex [MutatorMutex] used to ensure that for all of the tooltips associated with
+ *   the mutator mutex, only one will be shown on the screen at any time.
  */
 @Stable
 @ExperimentalFoundationApi
@@ -126,21 +121,16 @@
 ) : BasicTooltipState {
     override var isVisible by mutableStateOf(initialIsVisible)
 
-    /**
-     * continuation used to clean up
-     */
+    /** continuation used to clean up */
     private var job: (CancellableContinuation<Unit>)? = null
 
     /**
-     * Show the tooltip associated with the current [BasicTooltipState].
-     * When this method is called, all of the other tooltips associated
-     * with [mutatorMutex] will be dismissed.
+     * Show the tooltip associated with the current [BasicTooltipState]. When this method is called,
+     * all of the other tooltips associated with [mutatorMutex] will be dismissed.
      *
      * @param mutatePriority [MutatePriority] to be used with [mutatorMutex].
      */
-    override suspend fun show(
-        mutatePriority: MutatePriority
-    ) {
+    override suspend fun show(mutatePriority: MutatePriority) {
         val cancellableShow: suspend () -> Unit = {
             suspendCancellableCoroutine { continuation ->
                 isVisible = true
@@ -155,9 +145,7 @@
                 if (isPersistent) {
                     cancellableShow()
                 } else {
-                    withTimeout(BasicTooltipDefaults.TooltipDuration) {
-                        cancellableShow()
-                    }
+                    withTimeout(BasicTooltipDefaults.TooltipDuration) { cancellableShow() }
                 }
             } finally {
                 // timeout or cancellation has occurred
@@ -168,78 +156,63 @@
     }
 
     /**
-     * Dismiss the tooltip associated with
-     * this [BasicTooltipState] if it's currently being shown.
+     * Dismiss the tooltip associated with this [BasicTooltipState] if it's currently being shown.
      */
     override fun dismiss() {
         isVisible = false
     }
 
-    /**
-     * Cleans up [mutatorMutex] when the tooltip associated
-     * with this state leaves Composition.
-     */
+    /** Cleans up [mutatorMutex] when the tooltip associated with this state leaves Composition. */
     override fun onDispose() {
         job?.cancel()
     }
 }
 
 /**
- * The state that is associated with an instance of a tooltip.
- * Each instance of tooltips should have its own [BasicTooltipState].
+ * The state that is associated with an instance of a tooltip. Each instance of tooltips should have
+ * its own [BasicTooltipState].
  */
 @Stable
 @ExperimentalFoundationApi
 interface BasicTooltipState {
-    /**
-     * [Boolean] that indicates if the tooltip is currently being shown or not.
-     */
+    /** [Boolean] that indicates if the tooltip is currently being shown or not. */
     val isVisible: Boolean
 
     /**
-     * [Boolean] that determines if the tooltip associated with this
-     * will be persistent or not. If isPersistent is true, then the tooltip will
-     * only be dismissed when the user clicks outside the bounds of the tooltip or if
-     * [BasicTooltipState.dismiss] is called. When isPersistent is false, the tooltip will
-     * dismiss after a short duration. Ideally, this should be set to true when there
-     * is actionable content being displayed within a tooltip.
+     * [Boolean] that determines if the tooltip associated with this will be persistent or not. If
+     * isPersistent is true, then the tooltip will only be dismissed when the user clicks outside
+     * the bounds of the tooltip or if [BasicTooltipState.dismiss] is called. When isPersistent is
+     * false, the tooltip will dismiss after a short duration. Ideally, this should be set to true
+     * when there is actionable content being displayed within a tooltip.
      */
     val isPersistent: Boolean
 
     /**
-     * Show the tooltip associated with the current [BasicTooltipState].
-     * When this method is called all of the other tooltips currently
-     * being shown will dismiss.
+     * Show the tooltip associated with the current [BasicTooltipState]. When this method is called
+     * all of the other tooltips currently being shown will dismiss.
      *
      * @param mutatePriority [MutatePriority] to be used.
      */
     suspend fun show(mutatePriority: MutatePriority = MutatePriority.Default)
 
     /**
-     * Dismiss the tooltip associated with
-     * this [BasicTooltipState] if it's currently being shown.
+     * Dismiss the tooltip associated with this [BasicTooltipState] if it's currently being shown.
      */
     fun dismiss()
 
-    /**
-     * Clean up when the this state leaves Composition.
-     */
+    /** Clean up when the this state leaves Composition. */
     fun onDispose()
 }
 
-/**
- * BasicTooltip defaults that contain default values for tooltips created.
- */
+/** BasicTooltip defaults that contain default values for tooltips created. */
 @ExperimentalFoundationApi
 object BasicTooltipDefaults {
-    /**
-     * The global/default [MutatorMutex] used to sync Tooltips.
-     */
+    /** The global/default [MutatorMutex] used to sync Tooltips. */
     val GlobalMutatorMutex: MutatorMutex = MutatorMutex()
 
     /**
-     * The default duration, in milliseconds, that non-persistent tooltips
-     * will show on the screen before dismissing.
+     * The default duration, in milliseconds, that non-persistent tooltips will show on the screen
+     * before dismissing.
      */
     const val TooltipDuration = 1500L
 }
diff --git a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/Border.kt b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/Border.kt
index 950f0a7..98926f6 100644
--- a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/Border.kt
+++ b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/Border.kt
@@ -87,6 +87,7 @@
  * and clip it.
  *
  * @sample androidx.compose.foundation.samples.BorderSampleWithBrush()
+ *
  * @sample androidx.compose.foundation.samples.BorderSampleWithDynamicData()
  *
  * @param width width of the border. Use [Dp.Hairline] for a hairline border.
@@ -97,11 +98,8 @@
 fun Modifier.border(width: Dp, brush: Brush, shape: Shape) =
     this then BorderModifierNodeElement(width, brush, shape)
 
-internal data class BorderModifierNodeElement(
-    val width: Dp,
-    val brush: Brush,
-    val shape: Shape
-) : ModifierNodeElement<BorderModifierNode>() {
+internal data class BorderModifierNodeElement(val width: Dp, val brush: Brush, val shape: Shape) :
+    ModifierNodeElement<BorderModifierNode>() {
     override fun create() = BorderModifierNode(width, brush, shape)
 
     override fun update(node: BorderModifierNode) {
@@ -142,6 +140,7 @@
                 drawWithCacheModifierNode.invalidateDrawCache()
             }
         }
+
     var brush = brushParameter
         set(value) {
             if (field != value) {
@@ -149,6 +148,7 @@
                 drawWithCacheModifierNode.invalidateDrawCache()
             }
         }
+
     var shape = shapeParameter
         set(value) {
             if (field != value) {
@@ -157,61 +157,46 @@
             }
         }
 
-    private val drawWithCacheModifierNode = delegate(
-        CacheDrawModifierNode {
-            val hasValidBorderParams = width.toPx() >= 0f && size.minDimension > 0f
-            if (!hasValidBorderParams) {
-                drawContentWithoutBorder()
-            } else {
-                val strokeWidthPx = min(
-                    if (width == Dp.Hairline) 1f else ceil(width.toPx()),
-                    ceil(size.minDimension / 2)
-                )
-                val halfStroke = strokeWidthPx / 2
-                val topLeft = Offset(halfStroke, halfStroke)
-                val borderSize = Size(
-                    size.width - strokeWidthPx,
-                    size.height - strokeWidthPx
-                )
-                // The stroke is larger than the drawing area so just draw a full shape instead
-                val fillArea = (strokeWidthPx * 2) > size.minDimension
-                when (val outline = shape.createOutline(size, layoutDirection, this)) {
-                    is Outline.Generic ->
-                        drawGenericBorder(
-                            brush,
-                            outline,
-                            fillArea,
-                            strokeWidthPx
+    private val drawWithCacheModifierNode =
+        delegate(
+            CacheDrawModifierNode {
+                val hasValidBorderParams = width.toPx() >= 0f && size.minDimension > 0f
+                if (!hasValidBorderParams) {
+                    drawContentWithoutBorder()
+                } else {
+                    val strokeWidthPx =
+                        min(
+                            if (width == Dp.Hairline) 1f else ceil(width.toPx()),
+                            ceil(size.minDimension / 2)
                         )
-
-                    is Outline.Rounded ->
-                        drawRoundRectBorder(
-                            brush,
-                            outline,
-                            topLeft,
-                            borderSize,
-                            fillArea,
-                            strokeWidthPx
-                        )
-
-                    is Outline.Rectangle ->
-                        drawRectBorder(
-                            brush,
-                            topLeft,
-                            borderSize,
-                            fillArea,
-                            strokeWidthPx
-                        )
+                    val halfStroke = strokeWidthPx / 2
+                    val topLeft = Offset(halfStroke, halfStroke)
+                    val borderSize = Size(size.width - strokeWidthPx, size.height - strokeWidthPx)
+                    // The stroke is larger than the drawing area so just draw a full shape instead
+                    val fillArea = (strokeWidthPx * 2) > size.minDimension
+                    when (val outline = shape.createOutline(size, layoutDirection, this)) {
+                        is Outline.Generic ->
+                            drawGenericBorder(brush, outline, fillArea, strokeWidthPx)
+                        is Outline.Rounded ->
+                            drawRoundRectBorder(
+                                brush,
+                                outline,
+                                topLeft,
+                                borderSize,
+                                fillArea,
+                                strokeWidthPx
+                            )
+                        is Outline.Rectangle ->
+                            drawRectBorder(brush, topLeft, borderSize, fillArea, strokeWidthPx)
+                    }
                 }
             }
-        }
-    )
+        )
 
     /**
-     * Border implementation for generic paths. Note it is possible to be given paths
-     * that do not make sense in the context of a border (ex. a figure 8 path or a non-enclosed
-     * shape) We do not handle that here as we expect developers to give us enclosed,
-     * non-overlapping paths.
+     * Border implementation for generic paths. Note it is possible to be given paths that do not
+     * make sense in the context of a border (ex. a figure 8 path or a non-enclosed shape) We do not
+     * handle that here as we expect developers to give us enclosed, non-overlapping paths.
      */
     private fun CacheDrawScope.drawGenericBorder(
         brush: Brush,
@@ -247,49 +232,47 @@
             if (borderCache == null) {
                 borderCache = BorderCache()
             }
-            val maskPath = borderCache!!.obtainPath().apply {
-                reset()
-                addRect(pathBounds)
-                op(this, outline.path, PathOperation.Difference)
-            }
+            val maskPath =
+                borderCache!!.obtainPath().apply {
+                    reset()
+                    addRect(pathBounds)
+                    op(this, outline.path, PathOperation.Difference)
+                }
 
             val cacheImageBitmap: ImageBitmap
-            val pathBoundsSize = IntSize(
-                ceil(pathBounds.width).toInt(),
-                ceil(pathBounds.height).toInt()
-            )
+            val pathBoundsSize =
+                IntSize(ceil(pathBounds.width).toInt(), ceil(pathBounds.height).toInt())
             with(borderCache!!) {
                 // Draw into offscreen bitmap with the size of the path
                 // We need to draw into this intermediate bitmap to act as a layer
                 // and make sure that the clearing logic does not generate underdraw
                 // into the target we are rendering into
-                cacheImageBitmap = drawBorderCache(
-                    pathBoundsSize,
-                    config
-                ) {
-                    // Paths can have offsets, so translate to keep the drawn path
-                    // within the bounds of the mask bitmap
-                    translate(-pathBounds.left, -pathBounds.top) {
-                        // Draw the path with a stroke width twice the provided value.
-                        // Because strokes are centered, this will draw both and inner and
-                        // outer stroke with the desired stroke width
-                        drawPath(
-                            path = outline.path,
-                            brush = brush,
-                            style = Stroke(strokeWidth * 2)
-                        )
+                cacheImageBitmap =
+                    drawBorderCache(pathBoundsSize, config) {
+                        // Paths can have offsets, so translate to keep the drawn path
+                        // within the bounds of the mask bitmap
+                        translate(-pathBounds.left, -pathBounds.top) {
+                            // Draw the path with a stroke width twice the provided value.
+                            // Because strokes are centered, this will draw both and inner and
+                            // outer stroke with the desired stroke width
+                            drawPath(
+                                path = outline.path,
+                                brush = brush,
+                                style = Stroke(strokeWidth * 2)
+                            )
 
-                        // Scale the canvas slightly to cover the background that may be visible
-                        // after clearing the outer stroke
-                        scale(
-                            (size.width + 1) / size.width,
-                            (size.height + 1) / size.height
-                        ) {
-                            // Remove the outer stroke by clearing the inverted mask path
-                            drawPath(path = maskPath, brush = brush, blendMode = BlendMode.Clear)
+                            // Scale the canvas slightly to cover the background that may be visible
+                            // after clearing the outer stroke
+                            scale((size.width + 1) / size.width, (size.height + 1) / size.height) {
+                                // Remove the outer stroke by clearing the inverted mask path
+                                drawPath(
+                                    path = maskPath,
+                                    brush = brush,
+                                    blendMode = BlendMode.Clear
+                                )
+                            }
                         }
                     }
-                }
             }
 
             onDrawWithContent {
@@ -300,10 +283,7 @@
             }
         }
 
-    /**
-     * Border implementation for simple rounded rects and those with different corner
-     * radii
-     */
+    /** Border implementation for simple rounded rects and those with different corner radii */
     private fun CacheDrawScope.drawRoundRectBorder(
         brush: Brush,
         outline: Outline.Rounded,
@@ -371,8 +351,8 @@
 }
 
 /**
- * Helper object that handles lazily allocating and re-using objects
- * to render the border into an offscreen ImageBitmap
+ * Helper object that handles lazily allocating and re-using objects to render the border into an
+ * offscreen ImageBitmap
  */
 private data class BorderCache(
     private var imageBitmap: ImageBitmap? = null,
@@ -390,64 +370,48 @@
         var targetCanvas = canvas
         // If we previously had allocated a full Argb888 ImageBitmap but are only requiring
         // an alpha mask, just re-use the same ImageBitmap instead of allocating a new one
-        val compatibleConfig = targetImageBitmap?.config == ImageBitmapConfig.Argb8888 ||
-            config == targetImageBitmap?.config
-        if (targetImageBitmap == null ||
-            targetCanvas == null ||
-            size.width > targetImageBitmap.width ||
-            size.height > targetImageBitmap.height ||
-            !compatibleConfig
+        val compatibleConfig =
+            targetImageBitmap?.config == ImageBitmapConfig.Argb8888 ||
+                config == targetImageBitmap?.config
+        if (
+            targetImageBitmap == null ||
+                targetCanvas == null ||
+                size.width > targetImageBitmap.width ||
+                size.height > targetImageBitmap.height ||
+                !compatibleConfig
         ) {
-            targetImageBitmap = ImageBitmap(
-                borderSize.width,
-                borderSize.height,
-                config = config
-            ).also {
-                imageBitmap = it
-            }
-            targetCanvas = androidx.compose.ui.graphics.Canvas(targetImageBitmap).also {
-                canvas = it
-            }
+            targetImageBitmap =
+                ImageBitmap(borderSize.width, borderSize.height, config = config).also {
+                    imageBitmap = it
+                }
+            targetCanvas =
+                androidx.compose.ui.graphics.Canvas(targetImageBitmap).also { canvas = it }
         }
 
-        val targetDrawScope =
-            canvasDrawScope ?: CanvasDrawScope().also { canvasDrawScope = it }
+        val targetDrawScope = canvasDrawScope ?: CanvasDrawScope().also { canvasDrawScope = it }
         val drawSize = borderSize.toSize()
-        targetDrawScope.draw(
-            this,
-            layoutDirection,
-            targetCanvas,
-            drawSize
-        ) {
+        targetDrawScope.draw(this, layoutDirection, targetCanvas, drawSize) {
             // Clear the previously rendered portion within this ImageBitmap as we could
             // be re-using it
-            drawRect(
-                color = Color.Black,
-                size = drawSize,
-                blendMode = BlendMode.Clear
-            )
+            drawRect(color = Color.Black, size = drawSize, blendMode = BlendMode.Clear)
             block()
         }
         targetImageBitmap.prepareToDraw()
         return targetImageBitmap
     }
 
-    fun obtainPath(): Path =
-        borderPath ?: Path().also { borderPath = it }
+    fun obtainPath(): Path = borderPath ?: Path().also { borderPath = it }
 }
 
 /**
- * Border implementation for invalid parameters that just draws the content
- * as the given border parameters are infeasible (ex. negative border width)
+ * Border implementation for invalid parameters that just draws the content as the given border
+ * parameters are infeasible (ex. negative border width)
  */
-private fun CacheDrawScope.drawContentWithoutBorder(): DrawResult =
-    onDrawWithContent {
-        drawContent()
-    }
+private fun CacheDrawScope.drawContentWithoutBorder(): DrawResult = onDrawWithContent {
+    drawContent()
+}
 
-/**
- * Border implementation for rectangular borders
- */
+/** Border implementation for rectangular borders */
 private fun CacheDrawScope.drawRectBorder(
     brush: Brush,
     topLeft: Offset,
@@ -464,18 +428,12 @@
     val style = if (fillArea) Fill else Stroke(strokeWidthPx)
     return onDrawWithContent {
         drawContent()
-        drawRect(
-            brush = brush,
-            topLeft = rectTopLeft,
-            size = size,
-            style = style
-        )
+        drawRect(brush = brush, topLeft = rectTopLeft, size = size, style = style)
     }
 }
 
 /**
- * Helper method that creates a round rect with the inner region removed
- * by the given stroke width
+ * Helper method that creates a round rect with the inner region removed by the given stroke width
  */
 private fun createRoundRectPath(
     targetPath: Path,
@@ -487,32 +445,27 @@
         reset()
         addRoundRect(roundedRect)
         if (!fillArea) {
-            val insetPath = Path().apply {
-                addRoundRect(createInsetRoundedRect(strokeWidth, roundedRect))
-            }
+            val insetPath =
+                Path().apply { addRoundRect(createInsetRoundedRect(strokeWidth, roundedRect)) }
             op(this, insetPath, PathOperation.Difference)
         }
     }
 
-private fun createInsetRoundedRect(
-    widthPx: Float,
-    roundedRect: RoundRect
-) = RoundRect(
-    left = widthPx,
-    top = widthPx,
-    right = roundedRect.width - widthPx,
-    bottom = roundedRect.height - widthPx,
-    topLeftCornerRadius = roundedRect.topLeftCornerRadius.shrink(widthPx),
-    topRightCornerRadius = roundedRect.topRightCornerRadius.shrink(widthPx),
-    bottomLeftCornerRadius = roundedRect.bottomLeftCornerRadius.shrink(widthPx),
-    bottomRightCornerRadius = roundedRect.bottomRightCornerRadius.shrink(widthPx)
-)
+private fun createInsetRoundedRect(widthPx: Float, roundedRect: RoundRect) =
+    RoundRect(
+        left = widthPx,
+        top = widthPx,
+        right = roundedRect.width - widthPx,
+        bottom = roundedRect.height - widthPx,
+        topLeftCornerRadius = roundedRect.topLeftCornerRadius.shrink(widthPx),
+        topRightCornerRadius = roundedRect.topRightCornerRadius.shrink(widthPx),
+        bottomLeftCornerRadius = roundedRect.bottomLeftCornerRadius.shrink(widthPx),
+        bottomRightCornerRadius = roundedRect.bottomRightCornerRadius.shrink(widthPx)
+    )
 
 /**
- * Helper method to shrink the corner radius by the given value, clamping to 0
- * if the resultant corner radius would be negative
+ * Helper method to shrink the corner radius by the given value, clamping to 0 if the resultant
+ * corner radius would be negative
  */
-private fun CornerRadius.shrink(value: Float): CornerRadius = CornerRadius(
-    max(0f, this.x - value),
-    max(0f, this.y - value)
-)
+private fun CornerRadius.shrink(value: Float): CornerRadius =
+    CornerRadius(max(0f, this.x - value), max(0f, this.y - value))
diff --git a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/BorderStroke.kt b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/BorderStroke.kt
index 9324f18..294975e 100644
--- a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/BorderStroke.kt
+++ b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/BorderStroke.kt
@@ -51,14 +51,8 @@
         return "BorderStroke(width=$width, brush=$brush)"
     }
 
-    fun copy(
-        width: Dp = this.width,
-        brush: Brush = this.brush
-    ): BorderStroke {
-        return BorderStroke(
-            width = width,
-            brush = brush
-        )
+    fun copy(width: Dp = this.width, brush: Brush = this.brush): BorderStroke {
+        return BorderStroke(width = width, brush = brush)
     }
 }
 
@@ -68,5 +62,4 @@
  * @param width width of the border in [Dp]. Use [Dp.Hairline] for one-pixel border.
  * @param color color to paint the border with
  */
-@Stable
-fun BorderStroke(width: Dp, color: Color) = BorderStroke(width, SolidColor(color))
+@Stable fun BorderStroke(width: Dp, color: Color) = BorderStroke(width, SolidColor(color))
diff --git a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/Canvas.kt b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/Canvas.kt
index 9f98397..de58dbc 100644
--- a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/Canvas.kt
+++ b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/Canvas.kt
@@ -27,37 +27,36 @@
 
 /**
  * Component that allow you to specify an area on the screen and perform canvas drawing on this
- * area. You MUST specify size with modifier, whether with exact sizes via [Modifier.size]
- * modifier, or relative to parent, via [Modifier.fillMaxSize], [ColumnScope.weight], etc. If parent
- * wraps this child, only exact sizes must be specified.
+ * area. You MUST specify size with modifier, whether with exact sizes via [Modifier.size] modifier,
+ * or relative to parent, via [Modifier.fillMaxSize], [ColumnScope.weight], etc. If parent wraps
+ * this child, only exact sizes must be specified.
  *
  * @sample androidx.compose.foundation.samples.CanvasSample
  *
  * @param modifier mandatory modifier to specify size strategy for this composable
- * @param onDraw lambda that will be called to perform drawing. Note that this lambda will be
- * called during draw stage, you have no access to composition scope, meaning that [Composable]
- * function invocation inside it will result to runtime exception
+ * @param onDraw lambda that will be called to perform drawing. Note that this lambda will be called
+ *   during draw stage, you have no access to composition scope, meaning that [Composable] function
+ *   invocation inside it will result to runtime exception
  */
 @Composable
-fun Canvas(modifier: Modifier, onDraw: DrawScope.() -> Unit) =
-    Spacer(modifier.drawBehind(onDraw))
+fun Canvas(modifier: Modifier, onDraw: DrawScope.() -> Unit) = Spacer(modifier.drawBehind(onDraw))
 
 /**
  * Component that allow you to specify an area on the screen and perform canvas drawing on this
- * area. You MUST specify size with modifier, whether with exact sizes via [Modifier.size]
- * modifier, or relative to parent, via [Modifier.fillMaxSize], [ColumnScope.weight], etc. If parent
- * wraps this child, only exact sizes must be specified.
+ * area. You MUST specify size with modifier, whether with exact sizes via [Modifier.size] modifier,
+ * or relative to parent, via [Modifier.fillMaxSize], [ColumnScope.weight], etc. If parent wraps
+ * this child, only exact sizes must be specified.
  *
  * @sample androidx.compose.foundation.samples.CanvasPieChartSample
  *
  * @param modifier mandatory modifier to specify size strategy for this composable
  * @param contentDescription text used by accessibility services to describe what this canvas
- * represents. This should be provided unless the canvas is used for decorative purposes or as
- * part of a larger entity already described in some other way. This text should be localized,
- * such as by using [androidx.compose.ui.res.stringResource]
- * @param onDraw lambda that will be called to perform drawing. Note that this lambda will be
- * called during draw stage, you have no access to composition scope, meaning that [Composable]
- * function invocation inside it will result to runtime exception
+ *   represents. This should be provided unless the canvas is used for decorative purposes or as
+ *   part of a larger entity already described in some other way. This text should be localized,
+ *   such as by using [androidx.compose.ui.res.stringResource]
+ * @param onDraw lambda that will be called to perform drawing. Note that this lambda will be called
+ *   during draw stage, you have no access to composition scope, meaning that [Composable] function
+ *   invocation inside it will result to runtime exception
  */
 @Composable
 fun Canvas(modifier: Modifier, contentDescription: String, onDraw: DrawScope.() -> Unit) =
diff --git a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/CheckScrollableContainerConstraints.kt b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/CheckScrollableContainerConstraints.kt
index 0750a5c..ba0d09c 100644
--- a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/CheckScrollableContainerConstraints.kt
+++ b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/CheckScrollableContainerConstraints.kt
@@ -20,17 +20,13 @@
 import androidx.compose.ui.unit.Constraints
 
 /**
- * @throws [IllegalStateException] if the container was measured with the infinity constraints
- * in the direction of scrolling. This usually means nesting scrollable in the same direction
- * containers which is a performance issue and is discouraged.
- *
  * @param constraints [Constraints] used to measure the scrollable container
  * @param orientation orientation of the scrolling
+ * @throws [IllegalStateException] if the container was measured with the infinity constraints in
+ *   the direction of scrolling. This usually means nesting scrollable in the same direction
+ *   containers which is a performance issue and is discouraged.
  */
-fun checkScrollableContainerConstraints(
-    constraints: Constraints,
-    orientation: Orientation
-) {
+fun checkScrollableContainerConstraints(constraints: Constraints, orientation: Orientation) {
     if (orientation == Orientation.Vertical) {
         check(constraints.maxHeight != Constraints.Infinity) {
             "Vertically scrollable component was measured with an infinity maximum height " +
diff --git a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/Clickable.kt b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/Clickable.kt
index 89e3b94..ffe74a9 100644
--- a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/Clickable.kt
+++ b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/Clickable.kt
@@ -76,21 +76,21 @@
  * overload and explicitly passing `LocalIndication.current` for improved performance. For more
  * information see the documentation on the other overload.
  *
- * If you need to support double click or long click alongside the single click, consider
- * using [combinedClickable].
+ * If you need to support double click or long click alongside the single click, consider using
+ * [combinedClickable].
  *
  * ***Note*** Any removal operations on Android Views from `clickable` should wrap `onClick` in a
- * `post { }` block to guarantee the event dispatch completes before executing the removal. (You
- * do not need to do this when removing a composable because Compose guarantees it completes via the
+ * `post { }` block to guarantee the event dispatch completes before executing the removal. (You do
+ * not need to do this when removing a composable because Compose guarantees it completes via the
  * snapshot state system.)
  *
  * @sample androidx.compose.foundation.samples.ClickableSample
  *
- * @param enabled Controls the enabled state. When `false`, [onClick], and this modifier will
- * appear disabled for accessibility services
+ * @param enabled Controls the enabled state. When `false`, [onClick], and this modifier will appear
+ *   disabled for accessibility services
  * @param onClickLabel semantic / accessibility label for the [onClick] action
- * @param role the type of user interface element. Accessibility services might use this
- * to describe the element or do customizations
+ * @param role the type of user interface element. Accessibility services might use this to describe
+ *   the element or do customizations
  * @param onClick will be called when user clicks on the element
  */
 fun Modifier.clickable(
@@ -98,75 +98,78 @@
     onClickLabel: String? = null,
     role: Role? = null,
     onClick: () -> Unit
-) = composed(
-    inspectorInfo = debugInspectorInfo {
-        name = "clickable"
-        properties["enabled"] = enabled
-        properties["onClickLabel"] = onClickLabel
-        properties["role"] = role
-        properties["onClick"] = onClick
+) =
+    composed(
+        inspectorInfo =
+            debugInspectorInfo {
+                name = "clickable"
+                properties["enabled"] = enabled
+                properties["onClickLabel"] = onClickLabel
+                properties["role"] = role
+                properties["onClick"] = onClick
+            }
+    ) {
+        val localIndication = LocalIndication.current
+        val interactionSource =
+            if (localIndication is IndicationNodeFactory) {
+                // We can fast path here as it will be created inside clickable lazily
+                null
+            } else {
+                // We need an interaction source to pass between the indication modifier and
+                // clickable, so
+                // by creating here we avoid another composed down the line
+                remember { MutableInteractionSource() }
+            }
+        Modifier.clickable(
+            enabled = enabled,
+            onClickLabel = onClickLabel,
+            onClick = onClick,
+            role = role,
+            indication = localIndication,
+            interactionSource = interactionSource
+        )
     }
-) {
-    val localIndication = LocalIndication.current
-    val interactionSource = if (localIndication is IndicationNodeFactory) {
-        // We can fast path here as it will be created inside clickable lazily
-        null
-    } else {
-        // We need an interaction source to pass between the indication modifier and clickable, so
-        // by creating here we avoid another composed down the line
-        remember { MutableInteractionSource() }
-    }
-    Modifier.clickable(
-        enabled = enabled,
-        onClickLabel = onClickLabel,
-        onClick = onClick,
-        role = role,
-        indication = localIndication,
-        interactionSource = interactionSource
-    )
-}
 
 /**
  * Configure component to receive clicks via input or accessibility "click" event.
  *
- * Add this modifier to the element to make it clickable within its bounds and show an indication
- * as specified in [indication] parameter.
+ * Add this modifier to the element to make it clickable within its bounds and show an indication as
+ * specified in [indication] parameter.
  *
- * If [interactionSource] is `null`, and [indication] is an [IndicationNodeFactory], an
- * internal [MutableInteractionSource] will be lazily created along with the [indication] only when
- * needed. This reduces the performance cost of clickable during composition, as creating the
- * [indication] can be delayed until there is an incoming
- * [androidx.compose.foundation.interaction.Interaction]. If you are only passing a remembered
- * [MutableInteractionSource] and you are never using it outside of clickable, it is recommended to
- * instead provide `null` to enable lazy creation. If you need [indication] to be created eagerly,
- * provide a remembered [MutableInteractionSource].
+ * If [interactionSource] is `null`, and [indication] is an [IndicationNodeFactory], an internal
+ * [MutableInteractionSource] will be lazily created along with the [indication] only when needed.
+ * This reduces the performance cost of clickable during composition, as creating the [indication]
+ * can be delayed until there is an incoming [androidx.compose.foundation.interaction.Interaction].
+ * If you are only passing a remembered [MutableInteractionSource] and you are never using it
+ * outside of clickable, it is recommended to instead provide `null` to enable lazy creation. If you
+ * need [indication] to be created eagerly, provide a remembered [MutableInteractionSource].
  *
  * If [indication] is _not_ an [IndicationNodeFactory], and instead implements the deprecated
  * [Indication.rememberUpdatedInstance] method, you should explicitly pass a remembered
  * [MutableInteractionSource] as a parameter for [interactionSource] instead of `null`, as this
  * cannot be lazily created inside clickable.
  *
- * If you need to support double click or long click alongside the single click, consider
- * using [combinedClickable].
+ * If you need to support double click or long click alongside the single click, consider using
+ * [combinedClickable].
  *
  * ***Note*** Any removal operations on Android Views from `clickable` should wrap `onClick` in a
- * `post { }` block to guarantee the event dispatch completes before executing the removal. (You
- * do not need to do this when removing a composable because Compose guarantees it completes via the
+ * `post { }` block to guarantee the event dispatch completes before executing the removal. (You do
+ * not need to do this when removing a composable because Compose guarantees it completes via the
  * snapshot state system.)
  *
  * @sample androidx.compose.foundation.samples.ClickableSample
  *
  * @param interactionSource [MutableInteractionSource] that will be used to dispatch
- * [PressInteraction.Press] when this clickable is pressed. If `null`, an internal
- * [MutableInteractionSource] will be created if needed.
- * @param indication indication to be shown when modified element is pressed. By default,
- * indication from [LocalIndication] will be used. Pass `null` to show no indication, or
- * current value from [LocalIndication] to show theme default
- * @param enabled Controls the enabled state. When `false`, [onClick], and this modifier will
- * appear disabled for accessibility services
+ *   [PressInteraction.Press] when this clickable is pressed. If `null`, an internal
+ *   [MutableInteractionSource] will be created if needed.
+ * @param indication indication to be shown when modified element is pressed. By default, indication
+ *   from [LocalIndication] will be used. Pass `null` to show no indication, or current value from
+ *   [LocalIndication] to show theme default
+ * @param enabled Controls the enabled state. When `false`, [onClick], and this modifier will appear
+ *   disabled for accessibility services
  * @param onClickLabel semantic / accessibility label for the [onClick] action
- * @param role the type of user interface element. Accessibility services might use this
- * to describe the element or do customizations
+ * @param role the type of user interface element. Accessibility services might use this to describe
+ *   the element or do customizations
  * @param onClick will be called when user clicks on the element
  */
 fun Modifier.clickable(
@@ -176,19 +179,20 @@
     onClickLabel: String? = null,
     role: Role? = null,
     onClick: () -> Unit
-) = clickableWithIndicationIfNeeded(
-    interactionSource = interactionSource,
-    indication = indication
-) { intSource, indicationNodeFactory ->
-    ClickableElement(
-        interactionSource = intSource,
-        indicationNodeFactory = indicationNodeFactory,
-        enabled = enabled,
-        onClickLabel = onClickLabel,
-        role = role,
-        onClick = onClick
-    )
-}
+) =
+    clickableWithIndicationIfNeeded(
+        interactionSource = interactionSource,
+        indication = indication
+    ) { intSource, indicationNodeFactory ->
+        ClickableElement(
+            interactionSource = intSource,
+            indicationNodeFactory = indicationNodeFactory,
+            enabled = enabled,
+            onClickLabel = onClickLabel,
+            role = role,
+            onClick = onClick
+        )
+    }
 
 /**
  * Configure component to receive clicks, double clicks and long clicks via input or accessibility
@@ -207,17 +211,17 @@
  * more information see the documentation on the other overload.
  *
  * ***Note*** Any removal operations on Android Views from `clickable` should wrap `onClick` in a
- * `post { }` block to guarantee the event dispatch completes before executing the removal. (You
- * do not need to do this when removing a composable because Compose guarantees it completes via the
+ * `post { }` block to guarantee the event dispatch completes before executing the removal. (You do
+ * not need to do this when removing a composable because Compose guarantees it completes via the
  * snapshot state system.)
  *
  * @sample androidx.compose.foundation.samples.ClickableSample
  *
  * @param enabled Controls the enabled state. When `false`, [onClick], [onLongClick] or
- * [onDoubleClick] won't be invoked
+ *   [onDoubleClick] won't be invoked
  * @param onClickLabel semantic / accessibility label for the [onClick] action
- * @param role the type of user interface element. Accessibility services might use this
- * to describe the element or do customizations
+ * @param role the type of user interface element. Accessibility services might use this to describe
+ *   the element or do customizations
  * @param onLongClickLabel semantic / accessibility label for the [onLongClick] action
  * @param onLongClick will be called when user long presses on the element
  * @param onDoubleClick will be called when user double clicks on the element
@@ -235,39 +239,43 @@
     onLongClick: (() -> Unit)? = null,
     onDoubleClick: (() -> Unit)? = null,
     onClick: () -> Unit
-) = composed(
-    inspectorInfo = debugInspectorInfo {
-        name = "combinedClickable"
-        properties["enabled"] = enabled
-        properties["onClickLabel"] = onClickLabel
-        properties["role"] = role
-        properties["onClick"] = onClick
-        properties["onDoubleClick"] = onDoubleClick
-        properties["onLongClick"] = onLongClick
-        properties["onLongClickLabel"] = onLongClickLabel
+) =
+    composed(
+        inspectorInfo =
+            debugInspectorInfo {
+                name = "combinedClickable"
+                properties["enabled"] = enabled
+                properties["onClickLabel"] = onClickLabel
+                properties["role"] = role
+                properties["onClick"] = onClick
+                properties["onDoubleClick"] = onDoubleClick
+                properties["onLongClick"] = onLongClick
+                properties["onLongClickLabel"] = onLongClickLabel
+            }
+    ) {
+        val localIndication = LocalIndication.current
+        val interactionSource =
+            if (localIndication is IndicationNodeFactory) {
+                // We can fast path here as it will be created inside clickable lazily
+                null
+            } else {
+                // We need an interaction source to pass between the indication modifier and
+                // clickable, so
+                // by creating here we avoid another composed down the line
+                remember { MutableInteractionSource() }
+            }
+        Modifier.combinedClickable(
+            enabled = enabled,
+            onClickLabel = onClickLabel,
+            onLongClickLabel = onLongClickLabel,
+            onLongClick = onLongClick,
+            onDoubleClick = onDoubleClick,
+            onClick = onClick,
+            role = role,
+            indication = localIndication,
+            interactionSource = interactionSource
+        )
     }
-) {
-    val localIndication = LocalIndication.current
-    val interactionSource = if (localIndication is IndicationNodeFactory) {
-        // We can fast path here as it will be created inside clickable lazily
-        null
-    } else {
-        // We need an interaction source to pass between the indication modifier and clickable, so
-        // by creating here we avoid another composed down the line
-        remember { MutableInteractionSource() }
-    }
-    Modifier.combinedClickable(
-        enabled = enabled,
-        onClickLabel = onClickLabel,
-        onLongClickLabel = onLongClickLabel,
-        onLongClick = onLongClick,
-        onDoubleClick = onDoubleClick,
-        onClick = onClick,
-        role = role,
-        indication = localIndication,
-        interactionSource = interactionSource
-    )
-}
 
 /**
  * Configure component to receive clicks, double clicks and long clicks via input or accessibility
@@ -279,14 +287,13 @@
  *
  * Add this modifier to the element to make it clickable within its bounds.
  *
- * If [interactionSource] is `null`, and [indication] is an [IndicationNodeFactory], an
- * internal [MutableInteractionSource] will be lazily created along with the [indication] only when
- * needed. This reduces the performance cost of clickable during composition, as creating the
- * [indication] can be delayed until there is an incoming
- * [androidx.compose.foundation.interaction.Interaction]. If you are only passing a remembered
- * [MutableInteractionSource] and you are never using it outside of clickable, it is recommended to
- * instead provide `null` to enable lazy creation. If you need [indication] to be created eagerly,
- * provide a remembered [MutableInteractionSource].
+ * If [interactionSource] is `null`, and [indication] is an [IndicationNodeFactory], an internal
+ * [MutableInteractionSource] will be lazily created along with the [indication] only when needed.
+ * This reduces the performance cost of clickable during composition, as creating the [indication]
+ * can be delayed until there is an incoming [androidx.compose.foundation.interaction.Interaction].
+ * If you are only passing a remembered [MutableInteractionSource] and you are never using it
+ * outside of clickable, it is recommended to instead provide `null` to enable lazy creation. If you
+ * need [indication] to be created eagerly, provide a remembered [MutableInteractionSource].
  *
  * If [indication] is _not_ an [IndicationNodeFactory], and instead implements the deprecated
  * [Indication.rememberUpdatedInstance] method, you should explicitly pass a remembered
@@ -294,23 +301,23 @@
  * cannot be lazily created inside clickable.
  *
  * ***Note*** Any removal operations on Android Views from `clickable` should wrap `onClick` in a
- * `post { }` block to guarantee the event dispatch completes before executing the removal. (You
- * do not need to do this when removing a composable because Compose guarantees it completes via the
+ * `post { }` block to guarantee the event dispatch completes before executing the removal. (You do
+ * not need to do this when removing a composable because Compose guarantees it completes via the
  * snapshot state system.)
  *
  * @sample androidx.compose.foundation.samples.ClickableSample
  *
  * @param interactionSource [MutableInteractionSource] that will be used to emit
- * [PressInteraction.Press] when this clickable is pressed. If `null`, an internal
- * [MutableInteractionSource] will be created if needed.
- * @param indication indication to be shown when modified element is pressed. By default,
- * indication from [LocalIndication] will be used. Pass `null` to show no indication, or
- * current value from [LocalIndication] to show theme default
+ *   [PressInteraction.Press] when this clickable is pressed. If `null`, an internal
+ *   [MutableInteractionSource] will be created if needed.
+ * @param indication indication to be shown when modified element is pressed. By default, indication
+ *   from [LocalIndication] will be used. Pass `null` to show no indication, or current value from
+ *   [LocalIndication] to show theme default
  * @param enabled Controls the enabled state. When `false`, [onClick], [onLongClick] or
- * [onDoubleClick] won't be invoked
+ *   [onDoubleClick] won't be invoked
  * @param onClickLabel semantic / accessibility label for the [onClick] action
- * @param role the type of user interface element. Accessibility services might use this
- * to describe the element or do customizations
+ * @param role the type of user interface element. Accessibility services might use this to describe
+ *   the element or do customizations
  * @param onLongClickLabel semantic / accessibility label for the [onLongClick] action
  * @param onLongClick will be called when user long presses on the element
  * @param onDoubleClick will be called when user double clicks on the element
@@ -330,22 +337,23 @@
     onLongClick: (() -> Unit)? = null,
     onDoubleClick: (() -> Unit)? = null,
     onClick: () -> Unit
-) = clickableWithIndicationIfNeeded(
-    interactionSource = interactionSource,
-    indication = indication
-) { intSource, indicationNodeFactory ->
-    CombinedClickableElement(
-        interactionSource = intSource,
-        indicationNodeFactory = indicationNodeFactory,
-        enabled = enabled,
-        onClickLabel = onClickLabel,
-        role = role,
-        onClick = onClick,
-        onLongClickLabel = onLongClickLabel,
-        onLongClick = onLongClick,
-        onDoubleClick = onDoubleClick
-    )
-}
+) =
+    clickableWithIndicationIfNeeded(
+        interactionSource = interactionSource,
+        indication = indication
+    ) { intSource, indicationNodeFactory ->
+        CombinedClickableElement(
+            interactionSource = intSource,
+            indicationNodeFactory = indicationNodeFactory,
+            enabled = enabled,
+            onClickLabel = onClickLabel,
+            role = role,
+            onClick = onClick,
+            onLongClickLabel = onLongClickLabel,
+            onLongClick = onLongClick,
+            onDoubleClick = onDoubleClick
+        )
+    }
 
 /**
  * Utility Modifier factory that handles edge cases for [interactionSource], and [indication].
@@ -357,30 +365,34 @@
     indication: Indication?,
     crossinline createClickable: (MutableInteractionSource?, IndicationNodeFactory?) -> Modifier
 ): Modifier {
-    return this.then(when {
-        // Fast path - indication is managed internally
-        indication is IndicationNodeFactory -> createClickable(interactionSource, indication)
-        // Fast path - no need for indication
-        indication == null -> createClickable(interactionSource, null)
-        // Non-null Indication (not IndicationNodeFactory) with a non-null InteractionSource
-        interactionSource != null -> Modifier
-            .indication(interactionSource, indication)
-            .then(createClickable(interactionSource, null))
-        // Non-null Indication (not IndicationNodeFactory) with a null InteractionSource, so we need
-        // to use composed to create an InteractionSource that can be shared. This should be a rare
-        // code path and can only be hit from new callers.
-        else -> Modifier.composed {
-            val newInteractionSource = remember { MutableInteractionSource() }
-            Modifier
-                .indication(newInteractionSource, indication)
-                .then(createClickable(newInteractionSource, null))
+    return this.then(
+        when {
+            // Fast path - indication is managed internally
+            indication is IndicationNodeFactory -> createClickable(interactionSource, indication)
+            // Fast path - no need for indication
+            indication == null -> createClickable(interactionSource, null)
+            // Non-null Indication (not IndicationNodeFactory) with a non-null InteractionSource
+            interactionSource != null ->
+                Modifier.indication(interactionSource, indication)
+                    .then(createClickable(interactionSource, null))
+            // Non-null Indication (not IndicationNodeFactory) with a null InteractionSource, so we
+            // need
+            // to use composed to create an InteractionSource that can be shared. This should be a
+            // rare
+            // code path and can only be hit from new callers.
+            else ->
+                Modifier.composed {
+                    val newInteractionSource = remember { MutableInteractionSource() }
+                    Modifier.indication(newInteractionSource, indication)
+                        .then(createClickable(newInteractionSource, null))
+                }
         }
-    })
+    )
 }
 
 /**
- * How long to wait before appearing 'pressed' (emitting [PressInteraction.Press]) - if a touch
- * down will quickly become a drag / scroll, this timeout means that we don't show a press effect.
+ * How long to wait before appearing 'pressed' (emitting [PressInteraction.Press]) - if a touch down
+ * will quickly become a drag / scroll, this timeout means that we don't show a press effect.
  */
 internal expect val TapIndicationDelay: Long
 
@@ -391,20 +403,16 @@
  * container, we still want to delay presses in case presses in Compose convert to a scroll outside
  * of Compose.
  *
- * Combine this with [hasScrollableContainer], which returns whether a [Modifier] is
- * within a scrollable Compose layout, to calculate whether this modifier is within some form of
- * scrollable container, and hence should delay presses.
+ * Combine this with [hasScrollableContainer], which returns whether a [Modifier] is within a
+ * scrollable Compose layout, to calculate whether this modifier is within some form of scrollable
+ * container, and hence should delay presses.
  */
 internal expect fun DelegatableNode.isComposeRootInScrollableContainer(): Boolean
 
-/**
- * Whether the specified [KeyEvent] should trigger a press for a clickable component.
- */
+/** Whether the specified [KeyEvent] should trigger a press for a clickable component. */
 internal expect val KeyEvent.isPress: Boolean
 
-/**
- * Whether the specified [KeyEvent] should trigger a click for a clickable component.
- */
+/** Whether the specified [KeyEvent] should trigger a click for a clickable component. */
 internal expect val KeyEvent.isClick: Boolean
 
 private class ClickableElement(
@@ -415,17 +423,8 @@
     private val role: Role?,
     private val onClick: () -> Unit
 ) : ModifierNodeElement<ClickableNode>() {
-    override fun create() = ClickableNode(
-        interactionSource,
-        indicationNodeFactory,
-        enabled,
-        onClickLabel,
-        role,
-        onClick
-    )
-
-    override fun update(node: ClickableNode) {
-        node.update(
+    override fun create() =
+        ClickableNode(
             interactionSource,
             indicationNodeFactory,
             enabled,
@@ -433,6 +432,9 @@
             role,
             onClick
         )
+
+    override fun update(node: ClickableNode) {
+        node.update(interactionSource, indicationNodeFactory, enabled, onClickLabel, role, onClick)
     }
 
     override fun InspectorInfo.inspectableProperties() {
@@ -484,17 +486,18 @@
     private val onLongClick: (() -> Unit)?,
     private val onDoubleClick: (() -> Unit)?
 ) : ModifierNodeElement<CombinedClickableNodeImpl>() {
-    override fun create() = CombinedClickableNodeImpl(
-        onClick,
-        onLongClickLabel,
-        onLongClick,
-        onDoubleClick,
-        interactionSource,
-        indicationNodeFactory,
-        enabled,
-        onClickLabel,
-        role,
-    )
+    override fun create() =
+        CombinedClickableNodeImpl(
+            onClick,
+            onLongClickLabel,
+            onLongClick,
+            onDoubleClick,
+            interactionSource,
+            indicationNodeFactory,
+            enabled,
+            onClickLabel,
+            role,
+        )
 
     override fun update(node: CombinedClickableNodeImpl) {
         node.update(
@@ -564,14 +567,15 @@
     onClickLabel: String?,
     role: Role?,
     onClick: () -> Unit
-) : AbstractClickableNode(
-    interactionSource,
-    indicationNodeFactory,
-    enabled,
-    onClickLabel,
-    role,
-    onClick
-) {
+) :
+    AbstractClickableNode(
+        interactionSource,
+        indicationNodeFactory,
+        enabled,
+        onClickLabel,
+        role,
+        onClick
+    ) {
     override suspend fun PointerInputScope.clickPointerInput() {
         detectTapAndPress(
             onPress = { offset ->
@@ -593,14 +597,7 @@
     ) {
         // enabled and onClick are captured inside callbacks, not as an input to detectTapGestures,
         // so no need need to reset pointer input handling when they change
-        updateCommon(
-            interactionSource,
-            indicationNodeFactory,
-            enabled,
-            onClickLabel,
-            role,
-            onClick
-        )
+        updateCommon(interactionSource, indicationNodeFactory, enabled, onClickLabel, role, onClick)
     }
 }
 
@@ -615,18 +612,18 @@
  * @param onLongClick will be called when user long presses on the element
  * @param onDoubleClick will be called when user double clicks on the element
  * @param interactionSource [MutableInteractionSource] that will be used to emit
- * [PressInteraction.Press] when this clickable is pressed. Only the initial (first) press will be
- * recorded and emitted with [MutableInteractionSource]. If `null`, and there is an
- * [indicationNodeFactory] provided, an internal [MutableInteractionSource] will be created when
- * required.
- * @param indicationNodeFactory the [IndicationNodeFactory] used to optionally render
- * [Indication] inside this node, instead of using a separate [Modifier.indication]. This should
- * be preferred for performance reasons over using [Modifier.indication] separately.
+ *   [PressInteraction.Press] when this clickable is pressed. Only the initial (first) press will be
+ *   recorded and emitted with [MutableInteractionSource]. If `null`, and there is an
+ *   [indicationNodeFactory] provided, an internal [MutableInteractionSource] will be created when
+ *   required.
+ * @param indicationNodeFactory the [IndicationNodeFactory] used to optionally render [Indication]
+ *   inside this node, instead of using a separate [Modifier.indication]. This should be preferred
+ *   for performance reasons over using [Modifier.indication] separately.
  * @param enabled Controls the enabled state. When false, [onClick], [onLongClick] or
- * [onDoubleClick] won't be invoked
+ *   [onDoubleClick] won't be invoked
  * @param onClickLabel semantic / accessibility label for the [onClick] action
- * @param role the type of user interface element. Accessibility services might use this
- * to describe the element or do customizations
+ * @param role the type of user interface element. Accessibility services might use this to describe
+ *   the element or do customizations
  *
  * Note: This API is experimental and is awaiting a rework. combinedClickable handles touch based
  * input quite well but provides subpar functionality for other input types.
@@ -642,17 +639,18 @@
     enabled: Boolean,
     onClickLabel: String?,
     role: Role?,
-): CombinedClickableNode = CombinedClickableNodeImpl(
-    onClick,
-    onLongClickLabel,
-    onLongClick,
-    onDoubleClick,
-    interactionSource,
-    indicationNodeFactory,
-    enabled,
-    onClickLabel,
-    role,
-)
+): CombinedClickableNode =
+    CombinedClickableNodeImpl(
+        onClick,
+        onLongClickLabel,
+        onLongClick,
+        onDoubleClick,
+        interactionSource,
+        indicationNodeFactory,
+        enabled,
+        onClickLabel,
+        role,
+    )
 
 /**
  * Public interface for the internal node used inside [combinedClickable], to allow for custom
@@ -671,18 +669,18 @@
      * @param onLongClick will be called when user long presses on the element
      * @param onDoubleClick will be called when user double clicks on the element
      * @param interactionSource [MutableInteractionSource] that will be used to emit
-     * [PressInteraction.Press] when this clickable is pressed. Only the initial (first) press will
-     * be recorded and emitted with [MutableInteractionSource]. If `null`, and there is an
-     * [indicationNodeFactory] provided, an internal [MutableInteractionSource] will be created
-     * when required.
+     *   [PressInteraction.Press] when this clickable is pressed. Only the initial (first) press
+     *   will be recorded and emitted with [MutableInteractionSource]. If `null`, and there is an
+     *   [indicationNodeFactory] provided, an internal [MutableInteractionSource] will be created
+     *   when required.
      * @param indicationNodeFactory the [IndicationNodeFactory] used to optionally render
-     * [Indication] inside this node, instead of using a separate [Modifier.indication]. This should
-     * be preferred for performance reasons over using [Modifier.indication] separately.
+     *   [Indication] inside this node, instead of using a separate [Modifier.indication]. This
+     *   should be preferred for performance reasons over using [Modifier.indication] separately.
      * @param enabled Controls the enabled state. When false, [onClick], [onLongClick] or
-     * [onDoubleClick] won't be invoked
+     *   [onDoubleClick] won't be invoked
      * @param onClickLabel semantic / accessibility label for the [onClick] action
-     * @param role the type of user interface element. Accessibility services might use this
-     * to describe the element or do customizations
+     * @param role the type of user interface element. Accessibility services might use this to
+     *   describe the element or do customizations
      */
     fun update(
         onClick: () -> Unit,
@@ -708,7 +706,8 @@
     enabled: Boolean,
     onClickLabel: String?,
     role: Role?,
-) : CombinedClickableNode,
+) :
+    CombinedClickableNode,
     AbstractClickableNode(
         interactionSource,
         indicationNodeFactory,
@@ -719,12 +718,14 @@
     ) {
     override suspend fun PointerInputScope.clickPointerInput() {
         detectTapGestures(
-            onDoubleTap = if (enabled && onDoubleClick != null) {
-                { onDoubleClick?.invoke() }
-            } else null,
-            onLongPress = if (enabled && onLongClick != null) {
-                { onLongClick?.invoke() }
-            } else null,
+            onDoubleTap =
+                if (enabled && onDoubleClick != null) {
+                    { onDoubleClick?.invoke() }
+                } else null,
+            onLongPress =
+                if (enabled && onLongClick != null) {
+                    { onLongClick?.invoke() }
+                } else null,
             onPress = { offset ->
                 if (enabled) {
                     handlePressInteraction(offset)
@@ -785,14 +786,7 @@
             // Updating is handled inside updateCommon
         }
 
-        updateCommon(
-            interactionSource,
-            indicationNodeFactory,
-            enabled,
-            onClickLabel,
-            role,
-            onClick
-        )
+        updateCommon(interactionSource, indicationNodeFactory, enabled, onClickLabel, role, onClick)
 
         if (resetPointerInputHandling) resetPointerInputHandler()
     }
@@ -800,7 +794,10 @@
     override fun SemanticsPropertyReceiver.applyAdditionalSemantics() {
         if (onLongClick != null) {
             onLongClick(
-                action = { onLongClick?.invoke(); true },
+                action = {
+                    onLongClick?.invoke()
+                    true
+                },
                 label = onLongClickLabel
             )
         }
@@ -814,10 +811,16 @@
     private var onClickLabel: String?,
     private var role: Role?,
     onClick: () -> Unit
-) : DelegatingNode(), PointerInputModifierNode, KeyInputModifierNode, FocusEventModifierNode,
-    SemanticsModifierNode, TraversableNode {
+) :
+    DelegatingNode(),
+    PointerInputModifierNode,
+    KeyInputModifierNode,
+    FocusEventModifierNode,
+    SemanticsModifierNode,
+    TraversableNode {
     protected var enabled = enabled
         private set
+
     protected var onClick = onClick
         private set
 
@@ -838,6 +841,7 @@
     private var userProvidedInteractionSource: MutableInteractionSource? = interactionSource
 
     private var lazilyCreateIndication = shouldLazilyCreateIndication()
+
     private fun shouldLazilyCreateIndication() =
         userProvidedInteractionSource == null && indicationNodeFactory != null
 
@@ -1053,7 +1057,10 @@
             role = this@AbstractClickableNode.role!!
         }
         onClick(
-            action = { onClick(); true },
+            action = {
+                onClick()
+                true
+            },
             label = onClickLabel
         )
         if (enabled) {
@@ -1091,11 +1098,12 @@
                     }
                 } else {
                     pressInteraction?.let { pressInteraction ->
-                        val endInteraction = if (success) {
-                            PressInteraction.Release(pressInteraction)
-                        } else {
-                            PressInteraction.Cancel(pressInteraction)
-                        }
+                        val endInteraction =
+                            if (success) {
+                                PressInteraction.Release(pressInteraction)
+                            } else {
+                                PressInteraction.Cancel(pressInteraction)
+                            }
                         interactionSource.emit(endInteraction)
                     }
                 }
@@ -1111,9 +1119,7 @@
         if (hoverInteraction == null) {
             val interaction = HoverInteraction.Enter()
             interactionSource?.let { interactionSource ->
-                coroutineScope.launch {
-                    interactionSource.emit(interaction)
-                }
+                coroutineScope.launch { interactionSource.emit(interaction) }
             }
             hoverInteraction = interaction
         }
@@ -1123,9 +1129,7 @@
         hoverInteraction?.let { oldValue ->
             val interaction = HoverInteraction.Exit(oldValue)
             interactionSource?.let { interactionSource ->
-                coroutineScope.launch {
-                    interactionSource.emit(interaction)
-                }
+                coroutineScope.launch { interactionSource.emit(interaction) }
             }
             hoverInteraction = null
         }
diff --git a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/ClipScrollableContainer.kt b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/ClipScrollableContainer.kt
index 5a4da47..4dabbfe 100644
--- a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/ClipScrollableContainer.kt
+++ b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/ClipScrollableContainer.kt
@@ -47,53 +47,58 @@
 /**
  * In the scrollable containers we want to clip the main axis sides in order to not display the
  * content which is scrolled out. But once we apply clipToBounds() modifier on such containers it
- * causes unexpected behavior as we also clip the content on the cross axis sides. It is
- * unexpected as Compose components are not clipping by default. The most common case how it
- * could be reproduced is a horizontally scrolling list of Cards. Cards have the elevation by
- * default and such Cards will be drawn with clipped shadows on top and bottom. This was harder
- * to reproduce in the Views system as usually scrolling containers like RecyclerView didn't have
- * an opaque background which means the ripple was drawn on the surface on the first parent with
- * background. In Compose as we don't clip by default we draw shadows right in place.
- * We faced similar issue in Compose already with Androids Popups and Dialogs where we decided to
- * just predefine some constant with a maximum elevation size we are not going to clip. We are
- * going to reuse this technique here. This will improve how it works in most common cases. If the
- * user will need to have a larger unclipped area for some reason they can always add the needed
- * padding inside the scrollable area.
+ * causes unexpected behavior as we also clip the content on the cross axis sides. It is unexpected
+ * as Compose components are not clipping by default. The most common case how it could be
+ * reproduced is a horizontally scrolling list of Cards. Cards have the elevation by default and
+ * such Cards will be drawn with clipped shadows on top and bottom. This was harder to reproduce in
+ * the Views system as usually scrolling containers like RecyclerView didn't have an opaque
+ * background which means the ripple was drawn on the surface on the first parent with background.
+ * In Compose as we don't clip by default we draw shadows right in place. We faced similar issue in
+ * Compose already with Androids Popups and Dialogs where we decided to just predefine some constant
+ * with a maximum elevation size we are not going to clip. We are going to reuse this technique
+ * here. This will improve how it works in most common cases. If the user will need to have a larger
+ * unclipped area for some reason they can always add the needed padding inside the scrollable area.
  */
 internal val MaxSupportedElevation = 30.dp
 
-private val HorizontalScrollableClipModifier = Modifier.clip(object : Shape {
-    override fun createOutline(
-        size: Size,
-        layoutDirection: LayoutDirection,
-        density: Density
-    ): Outline {
-        val inflateSize = with(density) { MaxSupportedElevation.roundToPx().toFloat() }
-        return Outline.Rectangle(
-            Rect(
-                left = 0f,
-                top = -inflateSize,
-                right = size.width,
-                bottom = size.height + inflateSize
-            )
-        )
-    }
-})
+private val HorizontalScrollableClipModifier =
+    Modifier.clip(
+        object : Shape {
+            override fun createOutline(
+                size: Size,
+                layoutDirection: LayoutDirection,
+                density: Density
+            ): Outline {
+                val inflateSize = with(density) { MaxSupportedElevation.roundToPx().toFloat() }
+                return Outline.Rectangle(
+                    Rect(
+                        left = 0f,
+                        top = -inflateSize,
+                        right = size.width,
+                        bottom = size.height + inflateSize
+                    )
+                )
+            }
+        }
+    )
 
-private val VerticalScrollableClipModifier = Modifier.clip(object : Shape {
-    override fun createOutline(
-        size: Size,
-        layoutDirection: LayoutDirection,
-        density: Density
-    ): Outline {
-        val inflateSize = with(density) { MaxSupportedElevation.roundToPx().toFloat() }
-        return Outline.Rectangle(
-            Rect(
-                left = -inflateSize,
-                top = 0f,
-                right = size.width + inflateSize,
-                bottom = size.height
-            )
-        )
-    }
-})
+private val VerticalScrollableClipModifier =
+    Modifier.clip(
+        object : Shape {
+            override fun createOutline(
+                size: Size,
+                layoutDirection: LayoutDirection,
+                density: Density
+            ): Outline {
+                val inflateSize = with(density) { MaxSupportedElevation.roundToPx().toFloat() }
+                return Outline.Rectangle(
+                    Rect(
+                        left = -inflateSize,
+                        top = 0f,
+                        right = size.width + inflateSize,
+                        bottom = size.height
+                    )
+                )
+            }
+        }
+    )
diff --git a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/DarkTheme.kt b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/DarkTheme.kt
index ae18a72..bde0b39 100644
--- a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/DarkTheme.kt
+++ b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/DarkTheme.kt
@@ -26,8 +26,8 @@
  * It is also recommended to provide user accessible overrides in your application, so users can
  * choose to force an always-light or always-dark theme. To do this, you should provide the current
  * theme value in a CompositionLocal or similar to components further down your hierarchy, only
- * calling this effect once at the top level if no user override has been set. This also helps
- * avoid multiple calls to this effect, which can be expensive as it queries system configuration.
+ * calling this effect once at the top level if no user override has been set. This also helps avoid
+ * multiple calls to this effect, which can be expensive as it queries system configuration.
  *
  * For example, to draw a white rectangle when in dark theme, and a black rectangle when in light
  * theme:
@@ -36,10 +36,6 @@
  *
  * @return `true` if the system is considered to be in 'dark theme'.
  */
-@Composable
-@ReadOnlyComposable
-fun isSystemInDarkTheme() = _isSystemInDarkTheme()
+@Composable @ReadOnlyComposable fun isSystemInDarkTheme() = _isSystemInDarkTheme()
 
-@Composable
-@ReadOnlyComposable
-internal expect fun _isSystemInDarkTheme(): Boolean
+@Composable @ReadOnlyComposable internal expect fun _isSystemInDarkTheme(): Boolean
diff --git a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/Expect.kt b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/Expect.kt
index 62a9e695..cfc48c7 100644
--- a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/Expect.kt
+++ b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/Expect.kt
@@ -20,13 +20,18 @@
 
 internal expect class AtomicReference<V>(value: V) {
     fun get(): V
+
     fun set(value: V)
+
     fun getAndSet(value: V): V
+
     fun compareAndSet(expect: V, newValue: V): Boolean
 }
 
 internal expect class AtomicLong(value: Long) {
     fun get(): Long
+
     fun set(value: Long)
+
     fun getAndIncrement(): Long
 }
diff --git a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/ExperimentalFoundationApi.kt b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/ExperimentalFoundationApi.kt
index 72bc6b1..cf2d1dd 100644
--- a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/ExperimentalFoundationApi.kt
+++ b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/ExperimentalFoundationApi.kt
@@ -17,8 +17,7 @@
 package androidx.compose.foundation
 
 @RequiresOptIn(
-    "This foundation API is experimental and is likely to change or be removed in the " +
-        "future."
+    "This foundation API is experimental and is likely to change or be removed in the " + "future."
 )
 @Retention(AnnotationRetention.BINARY)
 annotation class ExperimentalFoundationApi
diff --git a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/Focusable.kt b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/Focusable.kt
index 512a671..dd7958f 100644
--- a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/Focusable.kt
+++ b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/Focusable.kt
@@ -64,19 +64,20 @@
  *
  * @param enabled Controls the enabled state. When `false`, element won't participate in the focus
  * @param interactionSource [MutableInteractionSource] that will be used to emit
- * [FocusInteraction.Focus] when this element is being focused.
+ *   [FocusInteraction.Focus] when this element is being focused.
  */
 @Stable
 fun Modifier.focusable(
     enabled: Boolean = true,
     interactionSource: MutableInteractionSource? = null,
-) = this.then(
-    if (enabled) {
-        FocusableElement(interactionSource)
-    } else {
-        Modifier
-    }
-)
+) =
+    this.then(
+        if (enabled) {
+            FocusableElement(interactionSource)
+        } else {
+            Modifier
+        }
+    )
 
 /**
  * Creates a focus group or marks this component as a focus group. This means that when we move
@@ -85,8 +86,8 @@
  * the focus group will be given a higher priority before focus moves to items outside the focus
  * group.
  *
- * In the sample below, each column is a focus group, so pressing the tab key will move focus
- * to all the buttons in column 1 before visiting column 2.
+ * In the sample below, each column is a focus group, so pressing the tab key will move focus to all
+ * the buttons in column 1 before visiting column 2.
  *
  * @sample androidx.compose.foundation.samples.FocusGroupSample
  *
@@ -101,36 +102,28 @@
  */
 @Stable
 fun Modifier.focusGroup(): Modifier {
-    return this
-        .then(focusGroupInspectorInfo)
-        .focusProperties { canFocus = false }
-        .focusTarget()
+    return this.then(focusGroupInspectorInfo).focusProperties { canFocus = false }.focusTarget()
 }
 
-private val focusGroupInspectorInfo = InspectableModifier(
-    debugInspectorInfo { name = "focusGroup" }
-)
+private val focusGroupInspectorInfo =
+    InspectableModifier(debugInspectorInfo { name = "focusGroup" })
 
-internal class FocusableInNonTouchMode : Modifier.Node(), CompositionLocalConsumerModifierNode,
-    FocusPropertiesModifierNode {
+internal class FocusableInNonTouchMode :
+    Modifier.Node(), CompositionLocalConsumerModifierNode, FocusPropertiesModifierNode {
     override val shouldAutoInvalidate: Boolean = false
 
     private val inputModeManager: InputModeManager
         get() = currentValueOf(LocalInputModeManager)
 
     override fun applyFocusProperties(focusProperties: FocusProperties) {
-        focusProperties.apply {
-            canFocus = inputModeManager.inputMode != InputMode.Touch
-        }
+        focusProperties.apply { canFocus = inputModeManager.inputMode != InputMode.Touch }
     }
 }
 
-private class FocusableElement(
-    private val interactionSource: MutableInteractionSource?
-) : ModifierNodeElement<FocusableNode>() {
+private class FocusableElement(private val interactionSource: MutableInteractionSource?) :
+    ModifierNodeElement<FocusableNode>() {
 
-    override fun create(): FocusableNode =
-        FocusableNode(interactionSource)
+    override fun create(): FocusableNode = FocusableNode(interactionSource)
 
     override fun update(node: FocusableNode) {
         node.update(interactionSource)
@@ -155,10 +148,12 @@
     }
 }
 
-internal class FocusableNode(
-    interactionSource: MutableInteractionSource?
-) : DelegatingNode(), FocusEventModifierNode, SemanticsModifierNode,
-    GlobalPositionAwareModifierNode, FocusRequesterModifierNode {
+internal class FocusableNode(interactionSource: MutableInteractionSource?) :
+    DelegatingNode(),
+    FocusEventModifierNode,
+    SemanticsModifierNode,
+    GlobalPositionAwareModifierNode,
+    FocusRequesterModifierNode {
     override val shouldAutoInvalidate: Boolean = false
 
     private var focusState: FocusState? = null
@@ -191,9 +186,7 @@
         if (this.focusState != focusState) { // focus state changed
             val isFocused = focusState.isFocused
             if (isFocused) {
-                coroutineScope.launch {
-                    scrollIntoView()
-                }
+                coroutineScope.launch { scrollIntoView() }
             }
             if (isAttached) invalidateSemantics()
             focusableInteractionNode.setFocus(isFocused)
@@ -205,27 +198,25 @@
 
     override fun SemanticsPropertyReceiver.applySemantics() {
         focused = focusState?.isFocused == true
-        requestFocus {
-            this@FocusableNode.requestFocus()
-        }
+        requestFocus { this@FocusableNode.requestFocus() }
     }
+
     // TODO(levima) Remove this once delegation can propagate this events on its own
     override fun onGloballyPositioned(coordinates: LayoutCoordinates) {
         focusedBoundsNode.onGloballyPositioned(coordinates)
     }
 }
 
-private class FocusableInteractionNode(
-    private var interactionSource: MutableInteractionSource?
-) : Modifier.Node() {
+private class FocusableInteractionNode(private var interactionSource: MutableInteractionSource?) :
+    Modifier.Node() {
     private var focusedInteraction: FocusInteraction.Focus? = null
 
     override val shouldAutoInvalidate: Boolean = false
 
     /**
      * Interaction source events will be controlled entirely by changes in focus events. The
-     * FocusEventNode will be the source of truth for this and will emit an event in case it
-     * is detached.
+     * FocusEventNode will be the source of truth for this and will emit an event in case it is
+     * detached.
      */
     fun setFocus(isFocused: Boolean) {
         interactionSource?.let { interactionSource ->
@@ -273,9 +264,8 @@
             // or always call tryEmit() as this will break other timing / cause some events to be
             // missed for other cases. Instead just make sure we call tryEmit if we cancel the
             // scope, before we finish emitting.
-            val handler = coroutineScope.coroutineContext[Job]?.invokeOnCompletion {
-                tryEmit(interaction)
-            }
+            val handler =
+                coroutineScope.coroutineContext[Job]?.invokeOnCompletion { tryEmit(interaction) }
             coroutineScope.launch {
                 emit(interaction)
                 handler?.dispose()
@@ -286,8 +276,8 @@
     }
 }
 
-private class FocusablePinnableContainerNode : Modifier.Node(),
-    CompositionLocalConsumerModifierNode, ObserverModifierNode {
+private class FocusablePinnableContainerNode :
+    Modifier.Node(), CompositionLocalConsumerModifierNode, ObserverModifierNode {
     private var pinnedHandle: PinnableContainer.PinnedHandle? = null
     private var isFocused: Boolean = false
 
@@ -295,9 +285,7 @@
 
     private fun retrievePinnableContainer(): PinnableContainer? {
         var container: PinnableContainer? = null
-        observeReads {
-            container = currentValueOf(LocalPinnableContainer)
-        }
+        observeReads { container = currentValueOf(LocalPinnableContainer) }
         return container
     }
 
diff --git a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/FocusedBounds.kt b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/FocusedBounds.kt
index df7af80..0e045a8 100644
--- a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/FocusedBounds.kt
+++ b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/FocusedBounds.kt
@@ -25,8 +25,8 @@
 import androidx.compose.ui.platform.InspectorInfo
 
 /**
- * Calls [onPositioned] whenever the bounds of the currently-focused area changes.
- * If a child of this node has focus, [onPositioned] will be called immediately with a non-null
+ * Calls [onPositioned] whenever the bounds of the currently-focused area changes. If a child of
+ * this node has focus, [onPositioned] will be called immediately with a non-null
  * [LayoutCoordinates] that can be queried for the focused bounds, and again every time the focused
  * child changes or is repositioned. When a child loses focus, [onPositioned] will be passed `null`.
  *
@@ -40,11 +40,9 @@
 fun Modifier.onFocusedBoundsChanged(onPositioned: (LayoutCoordinates?) -> Unit): Modifier =
     this then FocusedBoundsObserverElement(onPositioned)
 
-private class FocusedBoundsObserverElement(
-    val onPositioned: (LayoutCoordinates?) -> Unit
-) : ModifierNodeElement<FocusedBoundsObserverNode>() {
-    override fun create(): FocusedBoundsObserverNode =
-        FocusedBoundsObserverNode(onPositioned)
+private class FocusedBoundsObserverElement(val onPositioned: (LayoutCoordinates?) -> Unit) :
+    ModifierNodeElement<FocusedBoundsObserverNode>() {
+    override fun create(): FocusedBoundsObserverNode = FocusedBoundsObserverNode(onPositioned)
 
     override fun update(node: FocusedBoundsObserverNode) {
         node.onPositioned = onPositioned
@@ -64,15 +62,13 @@
     }
 }
 
-internal class FocusedBoundsObserverNode(
-    var onPositioned: (LayoutCoordinates?) -> Unit
-) : Modifier.Node(), TraversableNode {
+internal class FocusedBoundsObserverNode(var onPositioned: (LayoutCoordinates?) -> Unit) :
+    Modifier.Node(), TraversableNode {
 
     override val traverseKey: Any = TraverseKey
 
     /** Called when a child gains/loses focus or is focused and changes position. */
-
-     fun onFocusBoundsChanged(focusedBounds: LayoutCoordinates?) {
+    fun onFocusBoundsChanged(focusedBounds: LayoutCoordinates?) {
         onPositioned(focusedBounds)
         findNearestAncestor()?.onFocusBoundsChanged(focusedBounds)
     }
@@ -81,25 +77,28 @@
 }
 
 /**
- * Modifier used by [Modifier.focusable] to publish the location of the focused element.
- * Should only be applied to the node when it is actually focused. Right now this will keep
- * this node around, but once the un-delegate API lands we can remove this node entirely if it
- * is not focused. (b/276790428)
+ * Modifier used by [Modifier.focusable] to publish the location of the focused element. Should only
+ * be applied to the node when it is actually focused. Right now this will keep this node around,
+ * but once the un-delegate API lands we can remove this node entirely if it is not focused.
+ * (b/276790428)
  */
-internal class FocusedBoundsNode : Modifier.Node(), TraversableNode,
-    GlobalPositionAwareModifierNode {
+internal class FocusedBoundsNode :
+    Modifier.Node(), TraversableNode, GlobalPositionAwareModifierNode {
     private var isFocused: Boolean = false
 
-    override val traverseKey: Any get() = TraverseKey
+    override val traverseKey: Any
+        get() = TraverseKey
 
     override val shouldAutoInvalidate: Boolean = false
 
     private val observer: FocusedBoundsObserverNode?
-        get() = if (isAttached) {
-            findNearestAncestor(FocusedBoundsObserverNode.TraverseKey) as? FocusedBoundsObserverNode
-        } else {
-            null
-        }
+        get() =
+            if (isAttached) {
+                findNearestAncestor(FocusedBoundsObserverNode.TraverseKey)
+                    as? FocusedBoundsObserverNode
+            } else {
+                null
+            }
 
     private var layoutCoordinates: LayoutCoordinates? = null
 
diff --git a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/Hoverable.kt b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/Hoverable.kt
index 00adcf2..6fb303a 100644
--- a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/Hoverable.kt
+++ b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/Hoverable.kt
@@ -35,18 +35,15 @@
  * @sample androidx.compose.foundation.samples.HoverableSample
  *
  * @param interactionSource [MutableInteractionSource] that will be used to emit
- * [HoverInteraction.Enter] when this element is being hovered.
+ *   [HoverInteraction.Enter] when this element is being hovered.
  * @param enabled Controls the enabled state. When `false`, hover events will be ignored.
  */
 @Stable
-fun Modifier.hoverable(
-    interactionSource: MutableInteractionSource,
-    enabled: Boolean = true
-) = this then if (enabled) HoverableElement(interactionSource) else Modifier
+fun Modifier.hoverable(interactionSource: MutableInteractionSource, enabled: Boolean = true) =
+    this then if (enabled) HoverableElement(interactionSource) else Modifier
 
-private class HoverableElement(
-    private val interactionSource: MutableInteractionSource
-) : ModifierNodeElement<HoverableNode>() {
+private class HoverableElement(private val interactionSource: MutableInteractionSource) :
+    ModifierNodeElement<HoverableNode>() {
     override fun create() = HoverableNode(interactionSource)
 
     override fun update(node: HoverableNode) {
@@ -71,9 +68,8 @@
     }
 }
 
-private class HoverableNode(
-    private var interactionSource: MutableInteractionSource
-) : PointerInputModifierNode, Modifier.Node() {
+private class HoverableNode(private var interactionSource: MutableInteractionSource) :
+    PointerInputModifierNode, Modifier.Node() {
     private var hoverInteraction: HoverInteraction.Enter? = null
 
     fun updateInteractionSource(interactionSource: MutableInteractionSource) {
diff --git a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/Image.kt b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/Image.kt
index 2791752..189a066 100644
--- a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/Image.kt
+++ b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/Image.kt
@@ -41,48 +41,52 @@
 import androidx.compose.ui.semantics.semantics
 
 /**
- * A composable that lays out and draws a given [ImageBitmap]. This will attempt to
- * size the composable according to the [ImageBitmap]'s given width and height. However, an
- * optional [Modifier] parameter can be provided to adjust sizing or draw additional content (ex.
+ * A composable that lays out and draws a given [ImageBitmap]. This will attempt to size the
+ * composable according to the [ImageBitmap]'s given width and height. However, an optional
+ * [Modifier] parameter can be provided to adjust sizing or draw additional content (ex.
  * background). Any unspecified dimension will leverage the [ImageBitmap]'s size as a minimum
  * constraint.
  *
  * The following sample shows basic usage of an Image composable to position and draw an
  * [ImageBitmap] on screen
+ *
  * @sample androidx.compose.foundation.samples.ImageSample
  *
  * For use cases that require drawing a rectangular subset of the [ImageBitmap] consumers can use
  * overload that consumes a [Painter] parameter shown in this sample
+ *
  * @sample androidx.compose.foundation.samples.BitmapPainterSubsectionSample
  *
  * @param bitmap The [ImageBitmap] to draw
  * @param contentDescription text used by accessibility services to describe what this image
- * represents. This should always be provided unless this image is used for decorative purposes,
- * and does not represent a meaningful action that a user can take. This text should be
- * localized, such as by using [androidx.compose.ui.res.stringResource] or similar
+ *   represents. This should always be provided unless this image is used for decorative purposes,
+ *   and does not represent a meaningful action that a user can take. This text should be localized,
+ *   such as by using [androidx.compose.ui.res.stringResource] or similar
  * @param modifier Modifier used to adjust the layout algorithm or draw decoration content (ex.
- * background)
- * @param alignment Optional alignment parameter used to place the [ImageBitmap] in the given
- * bounds defined by the width and height
- * @param contentScale Optional scale parameter used to determine the aspect ratio scaling to be used
- * if the bounds are a different size from the intrinsic size of the [ImageBitmap]
+ *   background)
+ * @param alignment Optional alignment parameter used to place the [ImageBitmap] in the given bounds
+ *   defined by the width and height
+ * @param contentScale Optional scale parameter used to determine the aspect ratio scaling to be
+ *   used if the bounds are a different size from the intrinsic size of the [ImageBitmap]
  * @param alpha Optional opacity to be applied to the [ImageBitmap] when it is rendered onscreen
  * @param colorFilter Optional ColorFilter to apply for the [ImageBitmap] when it is rendered
- * onscreen
+ *   onscreen
  */
 @Composable
 @Deprecated(
     "Consider usage of the Image composable that consumes an optional FilterQuality parameter",
     level = DeprecationLevel.HIDDEN,
-    replaceWith = ReplaceWith(
-        expression = "Image(bitmap, contentDescription, modifier, alignment, contentScale, " +
-            "alpha, colorFilter, DefaultFilterQuality)",
-        "androidx.compose.foundation",
-        "androidx.compose.ui.graphics.DefaultAlpha",
-        "androidx.compose.ui.Alignment",
-        "androidx.compose.ui.graphics.drawscope.DrawScope.Companion.DefaultFilterQuality",
-        "androidx.compose.ui.layout.ContentScale.Fit"
-    )
+    replaceWith =
+        ReplaceWith(
+            expression =
+                "Image(bitmap, contentDescription, modifier, alignment, contentScale, " +
+                    "alpha, colorFilter, DefaultFilterQuality)",
+            "androidx.compose.foundation",
+            "androidx.compose.ui.graphics.DefaultAlpha",
+            "androidx.compose.ui.Alignment",
+            "androidx.compose.ui.graphics.drawscope.DrawScope.Companion.DefaultFilterQuality",
+            "androidx.compose.ui.layout.ContentScale.Fit"
+        )
 )
 @NonRestartableComposable
 fun Image(
@@ -107,37 +111,39 @@
 }
 
 /**
- * A composable that lays out and draws a given [ImageBitmap]. This will attempt to
- * size the composable according to the [ImageBitmap]'s given width and height. However, an
- * optional [Modifier] parameter can be provided to adjust sizing or draw additional content (ex.
+ * A composable that lays out and draws a given [ImageBitmap]. This will attempt to size the
+ * composable according to the [ImageBitmap]'s given width and height. However, an optional
+ * [Modifier] parameter can be provided to adjust sizing or draw additional content (ex.
  * background). Any unspecified dimension will leverage the [ImageBitmap]'s size as a minimum
  * constraint.
  *
  * The following sample shows basic usage of an Image composable to position and draw an
  * [ImageBitmap] on screen
+ *
  * @sample androidx.compose.foundation.samples.ImageSample
  *
  * For use cases that require drawing a rectangular subset of the [ImageBitmap] consumers can use
  * overload that consumes a [Painter] parameter shown in this sample
+ *
  * @sample androidx.compose.foundation.samples.BitmapPainterSubsectionSample
  *
  * @param bitmap The [ImageBitmap] to draw
  * @param contentDescription text used by accessibility services to describe what this image
- * represents. This should always be provided unless this image is used for decorative purposes,
- * and does not represent a meaningful action that a user can take. This text should be
- * localized, such as by using [androidx.compose.ui.res.stringResource] or similar
+ *   represents. This should always be provided unless this image is used for decorative purposes,
+ *   and does not represent a meaningful action that a user can take. This text should be localized,
+ *   such as by using [androidx.compose.ui.res.stringResource] or similar
  * @param modifier Modifier used to adjust the layout algorithm or draw decoration content (ex.
- * background)
- * @param alignment Optional alignment parameter used to place the [ImageBitmap] in the given
- * bounds defined by the width and height
- * @param contentScale Optional scale parameter used to determine the aspect ratio scaling to be used
- * if the bounds are a different size from the intrinsic size of the [ImageBitmap]
+ *   background)
+ * @param alignment Optional alignment parameter used to place the [ImageBitmap] in the given bounds
+ *   defined by the width and height
+ * @param contentScale Optional scale parameter used to determine the aspect ratio scaling to be
+ *   used if the bounds are a different size from the intrinsic size of the [ImageBitmap]
  * @param alpha Optional opacity to be applied to the [ImageBitmap] when it is rendered onscreen
  * @param colorFilter Optional ColorFilter to apply for the [ImageBitmap] when it is rendered
- * onscreen
- * @param filterQuality Sampling algorithm applied to the [bitmap] when it is scaled and drawn
- * into the destination. The default is [FilterQuality.Low] which scales using a bilinear
- * sampling algorithm
+ *   onscreen
+ * @param filterQuality Sampling algorithm applied to the [bitmap] when it is scaled and drawn into
+ *   the destination. The default is [FilterQuality.Low] which scales using a bilinear sampling
+ *   algorithm
  */
 @Composable
 @NonRestartableComposable
@@ -164,26 +170,26 @@
 }
 
 /**
- * A composable that lays out and draws a given [ImageVector]. This will attempt to
- * size the composable according to the [ImageVector]'s given width and height. However, an
- * optional [Modifier] parameter can be provided to adjust sizing or draw additional content (ex.
+ * A composable that lays out and draws a given [ImageVector]. This will attempt to size the
+ * composable according to the [ImageVector]'s given width and height. However, an optional
+ * [Modifier] parameter can be provided to adjust sizing or draw additional content (ex.
  * background). Any unspecified dimension will leverage the [ImageVector]'s size as a minimum
  * constraint.
  *
  * @param imageVector The [ImageVector] to draw
  * @param contentDescription text used by accessibility services to describe what this image
- * represents. This should always be provided unless this image is used for decorative purposes,
- * and does not represent a meaningful action that a user can take. This text should be
- * localized, such as by using [androidx.compose.ui.res.stringResource] or similar
+ *   represents. This should always be provided unless this image is used for decorative purposes,
+ *   and does not represent a meaningful action that a user can take. This text should be localized,
+ *   such as by using [androidx.compose.ui.res.stringResource] or similar
  * @param modifier Modifier used to adjust the layout algorithm or draw decoration content (ex.
- * background)
- * @param alignment Optional alignment parameter used to place the [ImageVector] in the given
- * bounds defined by the width and height
- * @param contentScale Optional scale parameter used to determine the aspect ratio scaling to be used
- * if the bounds are a different size from the intrinsic size of the [ImageVector]
+ *   background)
+ * @param alignment Optional alignment parameter used to place the [ImageVector] in the given bounds
+ *   defined by the width and height
+ * @param contentScale Optional scale parameter used to determine the aspect ratio scaling to be
+ *   used if the bounds are a different size from the intrinsic size of the [ImageVector]
  * @param alpha Optional opacity to be applied to the [ImageVector] when it is rendered onscreen
  * @param colorFilter Optional ColorFilter to apply for the [ImageVector] when it is rendered
- * onscreen
+ *   onscreen
  */
 @Composable
 @NonRestartableComposable
@@ -195,41 +201,42 @@
     contentScale: ContentScale = ContentScale.Fit,
     alpha: Float = DefaultAlpha,
     colorFilter: ColorFilter? = null
-) = Image(
-    painter = rememberVectorPainter(imageVector),
-    contentDescription = contentDescription,
-    modifier = modifier,
-    alignment = alignment,
-    contentScale = contentScale,
-    alpha = alpha,
-    colorFilter = colorFilter
-)
+) =
+    Image(
+        painter = rememberVectorPainter(imageVector),
+        contentDescription = contentDescription,
+        modifier = modifier,
+        alignment = alignment,
+        contentScale = contentScale,
+        alpha = alpha,
+        colorFilter = colorFilter
+    )
 
 /**
- * Creates a composable that lays out and draws a given [Painter]. This will attempt to size
- * the composable according to the [Painter]'s intrinsic size. However, an optional [Modifier]
- * parameter can be provided to adjust sizing or draw additional content (ex. background)
+ * Creates a composable that lays out and draws a given [Painter]. This will attempt to size the
+ * composable according to the [Painter]'s intrinsic size. However, an optional [Modifier] parameter
+ * can be provided to adjust sizing or draw additional content (ex. background)
  *
- * **NOTE** a Painter might not have an intrinsic size, so if no LayoutModifier is provided
- * as part of the Modifier chain this might size the [Image] composable to a width and height
- * of zero and will not draw any content. This can happen for Painter implementations that
- * always attempt to fill the bounds like [ColorPainter]
+ * **NOTE** a Painter might not have an intrinsic size, so if no LayoutModifier is provided as part
+ * of the Modifier chain this might size the [Image] composable to a width and height of zero and
+ * will not draw any content. This can happen for Painter implementations that always attempt to
+ * fill the bounds like [ColorPainter]
  *
  * @sample androidx.compose.foundation.samples.BitmapPainterSample
  *
  * @param painter to draw
  * @param contentDescription text used by accessibility services to describe what this image
- * represents. This should always be provided unless this image is used for decorative purposes,
- * and does not represent a meaningful action that a user can take. This text should be
- * localized, such as by using [androidx.compose.ui.res.stringResource] or similar
+ *   represents. This should always be provided unless this image is used for decorative purposes,
+ *   and does not represent a meaningful action that a user can take. This text should be localized,
+ *   such as by using [androidx.compose.ui.res.stringResource] or similar
  * @param modifier Modifier used to adjust the layout algorithm or draw decoration content (ex.
- * background)
- * @param alignment Optional alignment parameter used to place the [Painter] in the given
- * bounds defined by the width and height.
- * @param contentScale Optional scale parameter used to determine the aspect ratio scaling to be used
- * if the bounds are a different size from the intrinsic size of the [Painter]
- * @param alpha Optional opacity to be applied to the [Painter] when it is rendered onscreen
- * the default renders the [Painter] completely opaque
+ *   background)
+ * @param alignment Optional alignment parameter used to place the [Painter] in the given bounds
+ *   defined by the width and height.
+ * @param contentScale Optional scale parameter used to determine the aspect ratio scaling to be
+ *   used if the bounds are a different size from the intrinsic size of the [Painter]
+ * @param alpha Optional opacity to be applied to the [Painter] when it is rendered onscreen the
+ *   default renders the [Painter] completely opaque
  * @param colorFilter Optional colorFilter to apply for the [Painter] when it is rendered onscreen
  */
 @Composable
@@ -242,25 +249,29 @@
     alpha: Float = DefaultAlpha,
     colorFilter: ColorFilter? = null
 ) {
-    val semantics = if (contentDescription != null) {
-        Modifier.semantics {
-            this.contentDescription = contentDescription
-            this.role = Role.Image
+    val semantics =
+        if (contentDescription != null) {
+            Modifier.semantics {
+                this.contentDescription = contentDescription
+                this.role = Role.Image
+            }
+        } else {
+            Modifier
         }
-    } else {
-        Modifier
-    }
 
     // Explicitly use a simple Layout implementation here as Spacer squashes any non fixed
     // constraint with zero
     Layout(
-        modifier.then(semantics).clipToBounds().paint(
-            painter,
-            alignment = alignment,
-            contentScale = contentScale,
-            alpha = alpha,
-            colorFilter = colorFilter
-        )
+        modifier
+            .then(semantics)
+            .clipToBounds()
+            .paint(
+                painter,
+                alignment = alignment,
+                contentScale = contentScale,
+                alpha = alpha,
+                colorFilter = colorFilter
+            )
     ) { _, constraints ->
         layout(constraints.minWidth, constraints.minHeight) {}
     }
diff --git a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/Indication.kt b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/Indication.kt
index aed5624..38a3115 100644
--- a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/Indication.kt
+++ b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/Indication.kt
@@ -40,9 +40,8 @@
 import kotlinx.coroutines.launch
 
 /**
- * Indication represents visual effects that occur when certain interactions happens. For
- * example: showing a ripple effect when a component is pressed, or a highlight when a component
- * is focused.
+ * Indication represents visual effects that occur when certain interactions happens. For example:
+ * showing a ripple effect when a component is pressed, or a highlight when a component is focused.
  *
  * To implement your own Indication, see [IndicationNodeFactory] - an optimized [Indication] that
  * allows for more efficient implementations than the deprecated [rememberUpdatedInstance].
@@ -55,19 +54,19 @@
 interface Indication {
 
     /**
-     * [remember]s a new [IndicationInstance], and updates its state based on [Interaction]s
-     * emitted via [interactionSource] . Typically this will be called by [indication],
-     * so one [IndicationInstance] will be used for one component that draws [Indication], such
-     * as a button.
+     * [remember]s a new [IndicationInstance], and updates its state based on [Interaction]s emitted
+     * via [interactionSource] . Typically this will be called by [indication], so one
+     * [IndicationInstance] will be used for one component that draws [Indication], such as a
+     * button.
      *
      * Implementations of this function should observe [Interaction]s using [interactionSource],
-     * using them to launch animations / state changes inside [IndicationInstance] that will
-     * then be reflected inside [IndicationInstance.drawIndication].
+     * using them to launch animations / state changes inside [IndicationInstance] that will then be
+     * reflected inside [IndicationInstance.drawIndication].
      *
-     * @param interactionSource the [InteractionSource] representing the stream of
-     * [Interaction]s the returned [IndicationInstance] should represent
+     * @param interactionSource the [InteractionSource] representing the stream of [Interaction]s
+     *   the returned [IndicationInstance] should represent
      * @return an [IndicationInstance] that represents the stream of [Interaction]s emitted by
-     * [interactionSource]
+     *   [interactionSource]
      */
     @Suppress("DEPRECATION_ERROR")
     @Deprecated(RememberUpdatedInstanceDeprecationMessage, level = DeprecationLevel.ERROR)
@@ -78,8 +77,8 @@
 
 /**
  * IndicationNodeFactory is an Indication that creates [Modifier.Node] instances to render visual
- * effects that occur when certain interactions happens. For example: showing a ripple effect
- * when a component is pressed, or a highlight when a component is focused.
+ * effects that occur when certain interactions happens. For example: showing a ripple effect when a
+ * component is pressed, or a highlight when a component is focused.
  *
  * An instance of IndicationNodeFactory is responsible for creating individual nodes on demand for
  * each component that needs to render indication. IndicationNodeFactory instances should be very
@@ -102,18 +101,18 @@
      * IndicationNodeFactory over time, allowing a new node to be created using the new properties
      * in this IndicationNodeFactory. If you instead want to gracefully update the existing node
      * over time, consider replacing those properties with [androidx.compose.runtime.State]
-     * properties, so when the value of the State changes, [equals] and [hashCode] remain the
-     * same, and the same node instance can just query the updated state value.
+     * properties, so when the value of the State changes, [equals] and [hashCode] remain the same,
+     * and the same node instance can just query the updated state value.
      *
      * The returned [DelegatableNode] should implement [DrawModifierNode], or delegate to a node
      * that implements [DrawModifierNode], so that it can draw visual effects. Inside
      * [DrawModifierNode.draw], make sure to call [ContentDrawScope.drawContent] to render the
      * component in addition to any visual effects.
      *
-     * @param interactionSource the [InteractionSource] representing the stream of
-     * [Interaction]s the returned node should render visual effects for
+     * @param interactionSource the [InteractionSource] representing the stream of [Interaction]s
+     *   the returned node should render visual effects for
      * @return a [DelegatableNode] that renders visual effects for the provided [interactionSource]
-     * by also implementing / delegating to a [DrawModifierNode]
+     *   by also implementing / delegating to a [DrawModifierNode]
      */
     fun create(interactionSource: InteractionSource): DelegatableNode
 
@@ -132,8 +131,8 @@
 }
 
 /**
- * IndicationInstance is a specific instance of an [Indication] that draws visual effects on
- * certain interactions, such as press or focus.
+ * IndicationInstance is a specific instance of an [Indication] that draws visual effects on certain
+ * interactions, such as press or focus.
  *
  * IndicationInstances can be stateful or stateless, and are created by
  * [Indication.rememberUpdatedInstance] - they should be used in-place and not re-used between
@@ -146,8 +145,8 @@
      * Draws visual effects for the current interactions present on this component.
      *
      * Typically this function will read state within this instance that is mutated by
-     * [Indication.rememberUpdatedInstance]. This allows [IndicationInstance] to just read state
-     * and draw visual effects, and not actually change any state itself.
+     * [Indication.rememberUpdatedInstance]. This allows [IndicationInstance] to just read state and
+     * draw visual effects, and not actually change any state itself.
      *
      * This method MUST call [ContentDrawScope.drawContent] at some point in order to draw the
      * component itself underneath any indication. Typically this is called at the beginning, so
@@ -161,16 +160,12 @@
  *
  * @sample androidx.compose.foundation.samples.IndicationSample
  *
- * @param interactionSource [InteractionSource] that will be used by [indication] to draw
- * visual effects - this [InteractionSource] represents the stream of [Interaction]s for this
- * component.
- * @param indication [Indication] used to draw visual effects. If `null`, no visual effects will
- * be shown for this component.
+ * @param interactionSource [InteractionSource] that will be used by [indication] to draw visual
+ *   effects - this [InteractionSource] represents the stream of [Interaction]s for this component.
+ * @param indication [Indication] used to draw visual effects. If `null`, no visual effects will be
+ *   shown for this component.
  */
-fun Modifier.indication(
-    interactionSource: InteractionSource,
-    indication: Indication?
-): Modifier {
+fun Modifier.indication(interactionSource: InteractionSource, indication: Indication?): Modifier {
     if (indication == null) return this
     // Fast path - ideally we should never break into the composed path below.
     if (indication is IndicationNodeFactory) {
@@ -182,32 +177,27 @@
         factory = {
             @Suppress("DEPRECATION_ERROR")
             val instance = indication.rememberUpdatedInstance(interactionSource)
-            remember(instance) {
-                IndicationModifier(instance)
-            }
+            remember(instance) { IndicationModifier(instance) }
         },
-        inspectorInfo = debugInspectorInfo {
-            name = "indication"
-            properties["interactionSource"] = interactionSource
-            properties["indication"] = indication
-        }
+        inspectorInfo =
+            debugInspectorInfo {
+                name = "indication"
+                properties["interactionSource"] = interactionSource
+                properties["indication"] = indication
+            }
     )
 }
 
 /**
- * CompositionLocal that provides an [Indication] through the hierarchy. This [Indication] will
- * be used by default to draw visual effects for interactions such as press and drag in components
- * such as [clickable].
+ * CompositionLocal that provides an [Indication] through the hierarchy. This [Indication] will be
+ * used by default to draw visual effects for interactions such as press and drag in components such
+ * as [clickable].
  *
  * By default this will provide a debug indication, this should always be replaced.
  */
-val LocalIndication = staticCompositionLocalOf<Indication> {
-    DefaultDebugIndication
-}
+val LocalIndication = staticCompositionLocalOf<Indication> { DefaultDebugIndication }
 
-/**
- * Empty [IndicationInstance] for backwards compatibility - this is not expected to be used.
- */
+/** Empty [IndicationInstance] for backwards compatibility - this is not expected to be used. */
 @Suppress("DEPRECATION_ERROR")
 private object NoIndicationInstance : IndicationInstance {
     override fun ContentDrawScope.drawIndication() {
@@ -215,9 +205,7 @@
     }
 }
 
-/**
- * Simple default [Indication] that draws a rectangular overlay when pressed.
- */
+/** Simple default [Indication] that draws a rectangular overlay when pressed. */
 private object DefaultDebugIndication : IndicationNodeFactory {
 
     override fun create(interactionSource: InteractionSource): DelegatableNode =
@@ -232,6 +220,7 @@
         private var isPressed = false
         private var isHovered = false
         private var isFocused = false
+
         override fun onAttach() {
             coroutineScope.launch {
                 var pressCount = 0
@@ -337,25 +326,23 @@
 }
 
 @Suppress("DEPRECATION_ERROR")
-private class IndicationModifier(
-    val indicationInstance: IndicationInstance
-) : DrawModifier {
+private class IndicationModifier(val indicationInstance: IndicationInstance) : DrawModifier {
 
     override fun ContentDrawScope.draw() {
-        with(indicationInstance) {
-            drawIndication()
-        }
+        with(indicationInstance) { drawIndication() }
     }
 }
 
-private const val RememberUpdatedInstanceDeprecationMessage = "rememberUpdatedInstance has been " +
-    "deprecated - implementers should instead implement IndicationNodeFactory#create for " +
-    "improved performance and efficiency. Callers should check if the Indication is an " +
-    "IndicationNodeFactory, and call that API instead. For a migration guide and background " +
-    "information, please visit developer.android.com"
+private const val RememberUpdatedInstanceDeprecationMessage =
+    "rememberUpdatedInstance has been " +
+        "deprecated - implementers should instead implement IndicationNodeFactory#create for " +
+        "improved performance and efficiency. Callers should check if the Indication is an " +
+        "IndicationNodeFactory, and call that API instead. For a migration guide and background " +
+        "information, please visit developer.android.com"
 
-private const val IndicationInstanceDeprecationMessage = "IndicationInstance has been deprecated " +
-    "along with the rememberUpdatedInstance that returns it. Indication implementations should " +
-    "instead use Modifier.Node APIs, and should be returned from " +
-    "IndicationNodeFactory#create. For a migration guide and background information, " +
-    "please visit developer.android.com"
+private const val IndicationInstanceDeprecationMessage =
+    "IndicationInstance has been deprecated " +
+        "along with the rememberUpdatedInstance that returns it. Indication implementations should " +
+        "instead use Modifier.Node APIs, and should be returned from " +
+        "IndicationNodeFactory#create. For a migration guide and background information, " +
+        "please visit developer.android.com"
diff --git a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/InternalFoundationApi.kt b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/InternalFoundationApi.kt
index 19a79c5..0537f69 100644
--- a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/InternalFoundationApi.kt
+++ b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/InternalFoundationApi.kt
@@ -18,8 +18,11 @@
 
 @RequiresOptIn(message = "This API is internal to library.")
 @Target(
-    AnnotationTarget.CLASS, AnnotationTarget.FUNCTION, AnnotationTarget.PROPERTY,
-    AnnotationTarget.PROPERTY_GETTER, AnnotationTarget.PROPERTY_SETTER
+    AnnotationTarget.CLASS,
+    AnnotationTarget.FUNCTION,
+    AnnotationTarget.PROPERTY,
+    AnnotationTarget.PROPERTY_GETTER,
+    AnnotationTarget.PROPERTY_SETTER
 )
 @Retention(AnnotationRetention.BINARY)
 annotation class InternalFoundationApi
diff --git a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/MutatorMutex.kt b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/MutatorMutex.kt
index f8fd5fb..7177007 100644
--- a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/MutatorMutex.kt
+++ b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/MutatorMutex.kt
@@ -26,22 +26,21 @@
 /**
  * Priorities for performing mutation on state.
  *
- * [MutatePriority] values follow the natural ordering of `enum class` values; a value that
- * compares as `>` to another has a higher priority. A mutation of equal or greater priority will
- * interrupt the current mutation in progress.
+ * [MutatePriority] values follow the natural ordering of `enum class` values; a value that compares
+ * as `>` to another has a higher priority. A mutation of equal or greater priority will interrupt
+ * the current mutation in progress.
  */
 enum class MutatePriority {
     /**
      * The default priority for mutations. Can be interrupted by other [Default], [UserInput] or
-     * [PreventUserInput] priority operations.
-     * [Default] priority should be used for programmatic animations or changes that should not
-     * interrupt user input.
+     * [PreventUserInput] priority operations. [Default] priority should be used for programmatic
+     * animations or changes that should not interrupt user input.
      */
     Default,
 
     /**
-     * An elevated priority for mutations meant for implementing direct user interactions.
-     * Can be interrupted by other [UserInput] or [PreventUserInput] priority operations.
+     * An elevated priority for mutations meant for implementing direct user interactions. Can be
+     * interrupted by other [UserInput] or [PreventUserInput] priority operations.
      */
     UserInput,
 
@@ -54,9 +53,9 @@
 }
 
 /**
- * Used in place of the standard Job cancellation pathway to avoid reflective
- * javaClass.simpleName lookups to build the exception message and stack trace collection.
- * Remove if these are changed in kotlinx.coroutines.
+ * Used in place of the standard Job cancellation pathway to avoid reflective javaClass.simpleName
+ * lookups to build the exception message and stack trace collection. Remove if these are changed in
+ * kotlinx.coroutines.
  */
 private class MutationInterruptedException : CancellationException("Mutation interrupted") {
     override fun fillInStackTrace(): Throwable {
@@ -69,14 +68,14 @@
 /**
  * Mutual exclusion for UI state mutation over time.
  *
- * [mutate] permits interruptible state mutation over time using a standard [MutatePriority].
- * A [MutatorMutex] enforces that only a single writer can be active at a time for a particular
- * state resource. Instead of queueing callers that would acquire the lock like a traditional
- * [Mutex], new attempts to [mutate] the guarded state will either cancel the current mutator or
- * if the current mutator has a higher priority, the new caller will throw [CancellationException].
+ * [mutate] permits interruptible state mutation over time using a standard [MutatePriority]. A
+ * [MutatorMutex] enforces that only a single writer can be active at a time for a particular state
+ * resource. Instead of queueing callers that would acquire the lock like a traditional [Mutex], new
+ * attempts to [mutate] the guarded state will either cancel the current mutator or if the current
+ * mutator has a higher priority, the new caller will throw [CancellationException].
  *
- * [MutatorMutex] should be used for implementing hoisted state objects that many mutators may
- * want to manipulate over time such that those mutators can coordinate with one another. The
+ * [MutatorMutex] should be used for implementing hoisted state objects that many mutators may want
+ * to manipulate over time such that those mutators can coordinate with one another. The
  * [MutatorMutex] instance should be hidden as an implementation detail. For example:
  *
  * @sample androidx.compose.foundation.samples.mutatorMutexStateObject
@@ -110,14 +109,14 @@
      * If [mutate] is called while another call to [mutate] or [mutateWith] is in progress, their
      * [priority] values are compared. If the new caller has a [priority] equal to or higher than
      * the call in progress, the call in progress will be cancelled, throwing
-     * [CancellationException] and the new caller's [block] will be invoked. If the call in
-     * progress had a higher [priority] than the new caller, the new caller will throw
+     * [CancellationException] and the new caller's [block] will be invoked. If the call in progress
+     * had a higher [priority] than the new caller, the new caller will throw
      * [CancellationException] without invoking [block].
      *
      * @param priority the priority of this mutation; [MutatePriority.Default] by default. Higher
-     * priority mutations will interrupt lower priority mutations.
+     *   priority mutations will interrupt lower priority mutations.
      * @param block mutation code to run mutually exclusive with any other call to [mutate] or
-     * [mutateWith].
+     *   [mutateWith].
      */
     suspend fun <R> mutate(
         priority: MutatePriority = MutatePriority.Default,
@@ -140,24 +139,24 @@
      * Enforce that only a single caller may be active at a time.
      *
      * If [mutateWith] is called while another call to [mutate] or [mutateWith] is in progress,
-     * their [priority] values are compared. If the new caller has a [priority] equal to or
-     * higher than the call in progress, the call in progress will be cancelled, throwing
-     * [CancellationException] and the new caller's [block] will be invoked. If the call in
-     * progress had a higher [priority] than the new caller, the new caller will throw
+     * their [priority] values are compared. If the new caller has a [priority] equal to or higher
+     * than the call in progress, the call in progress will be cancelled, throwing
+     * [CancellationException] and the new caller's [block] will be invoked. If the call in progress
+     * had a higher [priority] than the new caller, the new caller will throw
      * [CancellationException] without invoking [block].
      *
-     * This variant of [mutate] calls its [block] with a [receiver], removing the need to create
-     * an additional capturing lambda to invoke it with a receiver object. This can be used to
-     * expose a mutable scope to the provided [block] while leaving the rest of the state object
-     * read-only. For example:
+     * This variant of [mutate] calls its [block] with a [receiver], removing the need to create an
+     * additional capturing lambda to invoke it with a receiver object. This can be used to expose a
+     * mutable scope to the provided [block] while leaving the rest of the state object read-only.
+     * For example:
      *
      * @sample androidx.compose.foundation.samples.mutatorMutexStateObjectWithReceiver
      *
      * @param receiver the receiver `this` that [block] will be called with
      * @param priority the priority of this mutation; [MutatePriority.Default] by default. Higher
-     * priority mutations will interrupt lower priority mutations.
+     *   priority mutations will interrupt lower priority mutations.
      * @param block mutation code to run mutually exclusive with any other call to [mutate] or
-     * [mutateWith].
+     *   [mutateWith].
      */
     suspend fun <T, R> mutateWith(
         receiver: T,
@@ -178,18 +177,17 @@
     }
 
     /**
-     * Attempt to mutate synchronously if there is no other active caller.
-     * If there is no other active caller, the [block] will be executed in a lock. If there is
-     * another active caller, this method will return false, indicating that the active caller
-     * needs to be cancelled through a [mutate] or [mutateWith] call with an equal or higher
-     * mutation priority.
+     * Attempt to mutate synchronously if there is no other active caller. If there is no other
+     * active caller, the [block] will be executed in a lock. If there is another active caller,
+     * this method will return false, indicating that the active caller needs to be cancelled
+     * through a [mutate] or [mutateWith] call with an equal or higher mutation priority.
      *
      * Calls to [mutate] and [mutateWith] will suspend until execution of the [block] has finished.
      *
      * @param block mutation code to run mutually exclusive with any other call to [mutate],
-     * [mutateWith] or [tryMutate].
+     *   [mutateWith] or [tryMutate].
      * @return true if the [block] was executed, false if there was another active caller and the
-     * [block] was not executed.
+     *   [block] was not executed.
      */
     inline fun tryMutate(block: () -> Unit): Boolean {
         val didLock = tryLock()
@@ -203,8 +201,7 @@
         return didLock
     }
 
-    @PublishedApi
-    internal fun tryLock(): Boolean = mutex.tryLock()
+    @PublishedApi internal fun tryLock(): Boolean = mutex.tryLock()
 
     @PublishedApi
     internal fun unlock() {
diff --git a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/Overscroll.kt b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/Overscroll.kt
index 3fbf538..c20203e 100644
--- a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/Overscroll.kt
+++ b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/Overscroll.kt
@@ -34,8 +34,8 @@
  * applies overscroll to a scroll event, and [applyToFling] applies overscroll to a fling.
  *
  * Higher level components such as [androidx.compose.foundation.lazy.LazyColumn] will automatically
- * configure an OverscrollEffect for you. To use a custom OverscrollEffect you first need to
- * provide it with scroll and/or fling events - usually by providing it to a
+ * configure an OverscrollEffect for you. To use a custom OverscrollEffect you first need to provide
+ * it with scroll and/or fling events - usually by providing it to a
  * [androidx.compose.foundation.gestures.scrollable]. Then you can draw the effect on top of the
  * scrolling content using [Modifier.overscroll].
  *
@@ -45,8 +45,8 @@
  * likely to be changed in the future. This should not have a large impact on custom overscroll
  * implementations, but it may require you to separate parts of the implementation into different
  * parts that implement different interfaces. Fewer changes are expected if you are not implementing
- * a custom OverscrollEffect, but instead are just calling [applyToFling] and [applyToScroll] on
- * an existing instance.
+ * a custom OverscrollEffect, but instead are just calling [applyToFling] and [applyToScroll] on an
+ * existing instance.
  *
  * @sample androidx.compose.foundation.samples.OverscrollSample
  */
@@ -68,20 +68,20 @@
      *
      * @sample androidx.compose.foundation.samples.OverscrollWithDraggable_Before
      *
-     * To apply overscroll, we need to decorate the existing logic with applyToScroll, and
-     * return the amount of delta we have consumed when updating the drag position. Note that we
-     * also need to call applyToFling - this is used as an end signal for overscroll so that effects
-     * can correctly reset after any animations, when the gesture has stopped.
+     * To apply overscroll, we need to decorate the existing logic with applyToScroll, and return
+     * the amount of delta we have consumed when updating the drag position. Note that we also need
+     * to call applyToFling - this is used as an end signal for overscroll so that effects can
+     * correctly reset after any animations, when the gesture has stopped.
      *
      * @sample androidx.compose.foundation.samples.OverscrollWithDraggable_After
      *
      * @param delta total scroll delta available
      * @param source the source of the delta
      * @param performScroll the scroll action that the overscroll is applied to. The [Offset]
-     * parameter represents how much delta is available, and the return value is how much delta was
-     * consumed. Any delta that was not consumed should be used to show the overscroll effect.
+     *   parameter represents how much delta is available, and the return value is how much delta
+     *   was consumed. Any delta that was not consumed should be used to show the overscroll effect.
      * @return the delta consumed from [delta] by the operation of this function - including that
-     * consumed by [performScroll].
+     *   consumed by [performScroll].
      */
     fun applyToScroll(
         delta: Offset,
@@ -90,8 +90,8 @@
     ): Offset
 
     /**
-     * Applies overscroll to [performFling]. [performFling] should represent a fling (the release
-     * of a drag or scroll), and returns the amount of [Velocity] consumed, so in simple cases the
+     * Applies overscroll to [performFling]. [performFling] should represent a fling (the release of
+     * a drag or scroll), and returns the amount of [Velocity] consumed, so in simple cases the
      * amount of overscroll to show should be equal to `velocity - performFling(velocity)`. The
      * OverscrollEffect can optionally consume some [Velocity] before calling [performFling], such
      * as to release any existing tension. The implementation *must* call [performFling] exactly
@@ -111,9 +111,9 @@
      *
      * @param velocity total [Velocity] available
      * @param performFling the [Velocity] consuming lambda that the overscroll is applied to. The
-     * [Velocity] parameter represents how much [Velocity] is available, and the return value is how
-     * much [Velocity] was consumed. Any [Velocity] that was not consumed should be used to show the
-     * overscroll effect.
+     *   [Velocity] parameter represents how much [Velocity] is available, and the return value is
+     *   how much [Velocity] was consumed. Any [Velocity] that was not consumed should be used to
+     *   show the overscroll effect.
      */
     suspend fun applyToFling(velocity: Velocity, performFling: suspend (Velocity) -> Velocity)
 
@@ -124,17 +124,15 @@
      */
     val isInProgress: Boolean
 
-    /**
-     * A [Modifier] that will draw this OverscrollEffect
-     */
+    /** A [Modifier] that will draw this OverscrollEffect */
     val effectModifier: Modifier
 }
 
 /**
  * Renders overscroll from the provided [overscrollEffect].
  *
- * This modifier is a convenience method to call [OverscrollEffect.effectModifier], which
- * renders the actual effect. Note that this modifier is only responsible for the visual part of
+ * This modifier is a convenience method to call [OverscrollEffect.effectModifier], which renders
+ * the actual effect. Note that this modifier is only responsible for the visual part of
  * overscroll - on its own it will not handle input events. In addition to using this modifier you
  * also need to propagate events to the [overscrollEffect], most commonly by using a
  * [androidx.compose.foundation.gestures.scrollable].
@@ -166,7 +164,9 @@
     override suspend fun applyToFling(
         velocity: Velocity,
         performFling: suspend (Velocity) -> Velocity
-    ) { performFling(velocity) }
+    ) {
+        performFling(velocity)
+    }
 
     override val isInProgress: Boolean
         get() = false
diff --git a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/ProgressSemantics.kt b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/ProgressSemantics.kt
index a6a7b72..912afbd 100644
--- a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/ProgressSemantics.kt
+++ b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/ProgressSemantics.kt
@@ -24,33 +24,31 @@
 import androidx.compose.ui.semantics.semantics
 
 /**
- * Contains the [semantics] required for a determinate progress indicator or the progress part of
- * a slider, that represents progress within [valueRange]. [value] outside of this range will be
+ * Contains the [semantics] required for a determinate progress indicator or the progress part of a
+ * slider, that represents progress within [valueRange]. [value] outside of this range will be
  * coerced into this range.
  *
  * @sample androidx.compose.foundation.samples.DeterminateProgressSemanticsSample
  *
  * @param value current value of the ProgressIndicator/Slider. If outside of [valueRange] provided,
- * value will be coerced to this range. Must not be NaN.
+ *   value will be coerced to this range. Must not be NaN.
  * @param valueRange range of values that value can take. Passed [value] will be coerced to this
- * range
+ *   range
  * @param steps if greater than 0, specifies the amounts of discrete values, evenly distributed
- * between across the whole value range. If 0, any value from the range specified is allowed.
- * Must not be negative.
+ *   between across the whole value range. If 0, any value from the range specified is allowed. Must
+ *   not be negative.
  */
 @Stable
 fun Modifier.progressSemantics(
     value: Float,
     valueRange: ClosedFloatingPointRange<Float> = 0f..1f,
-    @IntRange(from = 0)
-    steps: Int = 0
+    @IntRange(from = 0) steps: Int = 0
 ): Modifier {
     // Older versions of Talkback will ignore nodes with range info which aren't focusable or
     // screen reader focusable. Setting this semantics as merging descendants will mark it as
     // screen reader focusable.
     return semantics(mergeDescendants = true) {
-        progressBarRangeInfo =
-            ProgressBarRangeInfo(value.coerceIn(valueRange), valueRange, steps)
+        progressBarRangeInfo = ProgressBarRangeInfo(value.coerceIn(valueRange), valueRange, steps)
     }
 }
 
@@ -58,11 +56,9 @@
  * Contains the [semantics] required for an indeterminate progress indicator, that represents the
  * fact of the in-progress operation.
  *
- * If you need determinate progress 0.0 to 1.0, consider using overload with the progress
- * parameter.
+ * If you need determinate progress 0.0 to 1.0, consider using overload with the progress parameter.
  *
  * @sample androidx.compose.foundation.samples.IndeterminateProgressSemanticsSample
- *
  */
 @Stable
 fun Modifier.progressSemantics(): Modifier {
diff --git a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/Scroll.kt b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/Scroll.kt
index 3110f8a..e416780 100644
--- a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/Scroll.kt
+++ b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/Scroll.kt
@@ -59,19 +59,18 @@
 import androidx.compose.ui.util.fastRoundToInt
 
 /**
- * Create and [remember] the [ScrollState] based on the currently appropriate scroll
- * configuration to allow changing scroll position or observing scroll behavior.
+ * Create and [remember] the [ScrollState] based on the currently appropriate scroll configuration
+ * to allow changing scroll position or observing scroll behavior.
  *
  * Learn how to control the state of [Modifier.verticalScroll] or [Modifier.horizontalScroll]:
+ *
  * @sample androidx.compose.foundation.samples.ControlledScrollableRowSample
  *
  * @param initial initial scroller position to start with
  */
 @Composable
 fun rememberScrollState(initial: Int = 0): ScrollState {
-    return rememberSaveable(saver = ScrollState.Saver) {
-        ScrollState(initial = initial)
-    }
+    return rememberSaveable(saver = ScrollState.Saver) { ScrollState(initial = initial) }
 }
 
 /**
@@ -83,6 +82,7 @@
  * [rememberScrollState].
  *
  * Learn how to control the state of [Modifier.verticalScroll] or [Modifier.horizontalScroll]:
+ *
  * @sample androidx.compose.foundation.samples.ControlledScrollableRowSample
  *
  * @param initial value of the scroll
@@ -90,15 +90,11 @@
 @Stable
 class ScrollState(initial: Int) : ScrollableState {
 
-    /**
-     * current scroll position value in pixels
-     */
+    /** current scroll position value in pixels */
     var value: Int by mutableIntStateOf(initial)
         private set
 
-    /**
-     * maximum bound for [value], or [Int.MAX_VALUE] if still unknown
-     */
+    /** maximum bound for [value], or [Int.MAX_VALUE] if still unknown */
     var maxValue: Int
         get() = _maxValueState.intValue
         internal set(newMax) {
@@ -111,18 +107,19 @@
         }
 
     /**
-     * Size of the viewport on the scrollable axis, or 0 if still unknown. Note that this value
-     * is only populated after the first measure pass.
+     * Size of the viewport on the scrollable axis, or 0 if still unknown. Note that this value is
+     * only populated after the first measure pass.
      */
     var viewportSize: Int by mutableIntStateOf(0)
         internal set
 
     /**
-     * [InteractionSource] that will be used to dispatch drag events when this
-     * list is being dragged. If you want to know whether the fling (or smooth scroll) is in
-     * progress, use [isScrollInProgress].
+     * [InteractionSource] that will be used to dispatch drag events when this list is being
+     * dragged. If you want to know whether the fling (or smooth scroll) is in progress, use
+     * [isScrollInProgress].
      */
-    val interactionSource: InteractionSource get() = internalInteractionSource
+    val interactionSource: InteractionSource
+        get() = internalInteractionSource
 
     internal val internalInteractionSource: MutableInteractionSource = MutableInteractionSource()
 
@@ -152,8 +149,7 @@
         block: suspend ScrollScope.() -> Unit
     ): Unit = scrollableState.scroll(scrollPriority, block)
 
-    override fun dispatchRawDelta(delta: Float): Float =
-        scrollableState.dispatchRawDelta(delta)
+    override fun dispatchRawDelta(delta: Float): Float = scrollableState.dispatchRawDelta(delta)
 
     override val isScrollInProgress: Boolean
         get() = scrollableState.isScrollInProgress
@@ -174,13 +170,10 @@
      * Scroll to position in pixels with animation.
      *
      * @param value target value in pixels to smooth scroll to, value will be coerced to
-     * 0..maxPosition
+     *   0..maxPosition
      * @param animationSpec animation curve for smooth scroll animation
      */
-    suspend fun animateScrollTo(
-        value: Int,
-        animationSpec: AnimationSpec<Float> = SpringSpec()
-    ) {
+    suspend fun animateScrollTo(value: Int, animationSpec: AnimationSpec<Float> = SpringSpec()) {
         this.animateScrollBy((value - this.value).toFloat(), animationSpec)
     }
 
@@ -190,21 +183,15 @@
      * Cancels the currently running scroll, if any, and suspends until the cancellation is
      * complete.
      *
-     * @see animateScrollTo for an animated version
-     *
      * @param value number of pixels to scroll by
      * @return the amount of scroll consumed
+     * @see animateScrollTo for an animated version
      */
     suspend fun scrollTo(value: Int): Float = this.scrollBy((value - this.value).toFloat())
 
     companion object {
-        /**
-         * The default [Saver] implementation for [ScrollState].
-         */
-        val Saver: Saver<ScrollState, *> = Saver(
-            save = { it.value },
-            restore = { ScrollState(it) }
-        )
+        /** The default [Saver] implementation for [ScrollState]. */
+        val Saver: Saver<ScrollState, *> = Saver(save = { it.value }, restore = { ScrollState(it) })
     }
 }
 
@@ -215,27 +202,28 @@
  * @sample androidx.compose.foundation.samples.VerticalScrollExample
  *
  * In order to use this modifier, you need to create and own [ScrollState]
- * @see [rememberScrollState]
  *
  * @param state state of the scroll
  * @param enabled whether or not scrolling via touch input is enabled
  * @param flingBehavior logic describing fling behavior when drag has finished with velocity. If
- * `null`, default from [ScrollableDefaults.flingBehavior] will be used.
+ *   `null`, default from [ScrollableDefaults.flingBehavior] will be used.
  * @param reverseScrolling reverse the direction of scrolling, when `true`, 0 [ScrollState.value]
- * will mean bottom, when `false`, 0 [ScrollState.value] will mean top
+ *   will mean bottom, when `false`, 0 [ScrollState.value] will mean top
+ * @see [rememberScrollState]
  */
 fun Modifier.verticalScroll(
     state: ScrollState,
     enabled: Boolean = true,
     flingBehavior: FlingBehavior? = null,
     reverseScrolling: Boolean = false
-) = scroll(
-    state = state,
-    isScrollable = enabled,
-    reverseScrolling = reverseScrolling,
-    flingBehavior = flingBehavior,
-    isVertical = true
-)
+) =
+    scroll(
+        state = state,
+        isScrollable = enabled,
+        reverseScrolling = reverseScrolling,
+        flingBehavior = flingBehavior,
+        isVertical = true
+    )
 
 /**
  * Modify element to allow to scroll horizontally when width of the content is bigger than max
@@ -244,27 +232,28 @@
  * @sample androidx.compose.foundation.samples.HorizontalScrollSample
  *
  * In order to use this modifier, you need to create and own [ScrollState]
- * @see [rememberScrollState]
  *
  * @param state state of the scroll
  * @param enabled whether or not scrolling via touch input is enabled
  * @param flingBehavior logic describing fling behavior when drag has finished with velocity. If
- * `null`, default from [ScrollableDefaults.flingBehavior] will be used.
+ *   `null`, default from [ScrollableDefaults.flingBehavior] will be used.
  * @param reverseScrolling reverse the direction of scrolling, when `true`, 0 [ScrollState.value]
- * will mean right, when `false`, 0 [ScrollState.value] will mean left
+ *   will mean right, when `false`, 0 [ScrollState.value] will mean left
+ * @see [rememberScrollState]
  */
 fun Modifier.horizontalScroll(
     state: ScrollState,
     enabled: Boolean = true,
     flingBehavior: FlingBehavior? = null,
     reverseScrolling: Boolean = false
-) = scroll(
-    state = state,
-    isScrollable = enabled,
-    reverseScrolling = reverseScrolling,
-    flingBehavior = flingBehavior,
-    isVertical = false
-)
+) =
+    scroll(
+        state = state,
+        isScrollable = enabled,
+        reverseScrolling = reverseScrolling,
+        flingBehavior = flingBehavior,
+        isVertical = false
+    )
 
 @OptIn(ExperimentalFoundationApi::class)
 private fun Modifier.scroll(
@@ -273,35 +262,37 @@
     flingBehavior: FlingBehavior?,
     isScrollable: Boolean,
     isVertical: Boolean
-) = composed(
-    factory = {
-        val orientation = if (isVertical) Orientation.Vertical else Orientation.Horizontal
-        val reverseDirection = ScrollableDefaults.reverseDirection(
-            LocalLayoutDirection.current,
-            orientation,
-            reverseScrolling
-        )
-        Modifier
-            .scrollingContainer(
-                state = state,
-                orientation = orientation,
-                enabled = isScrollable,
-                reverseDirection = reverseDirection,
-                flingBehavior = flingBehavior,
-                interactionSource = state.internalInteractionSource,
-                overscrollEffect = ScrollableDefaults.overscrollEffect()
-            )
-            .then(ScrollingLayoutElement(state, reverseScrolling, isVertical))
-    },
-    inspectorInfo = debugInspectorInfo {
-        name = "scroll"
-        properties["state"] = state
-        properties["reverseScrolling"] = reverseScrolling
-        properties["flingBehavior"] = flingBehavior
-        properties["isScrollable"] = isScrollable
-        properties["isVertical"] = isVertical
-    }
-)
+) =
+    composed(
+        factory = {
+            val orientation = if (isVertical) Orientation.Vertical else Orientation.Horizontal
+            val reverseDirection =
+                ScrollableDefaults.reverseDirection(
+                    LocalLayoutDirection.current,
+                    orientation,
+                    reverseScrolling
+                )
+            Modifier.scrollingContainer(
+                    state = state,
+                    orientation = orientation,
+                    enabled = isScrollable,
+                    reverseDirection = reverseDirection,
+                    flingBehavior = flingBehavior,
+                    interactionSource = state.internalInteractionSource,
+                    overscrollEffect = ScrollableDefaults.overscrollEffect()
+                )
+                .then(ScrollingLayoutElement(state, reverseScrolling, isVertical))
+        },
+        inspectorInfo =
+            debugInspectorInfo {
+                name = "scroll"
+                properties["state"] = state
+                properties["reverseScrolling"] = reverseScrolling
+                properties["flingBehavior"] = flingBehavior
+                properties["isScrollable"] = isScrollable
+                properties["isVertical"] = isVertical
+            }
+    )
 
 internal class ScrollingLayoutElement(
     val scrollState: ScrollState,
@@ -358,10 +349,11 @@
             if (isVertical) Orientation.Vertical else Orientation.Horizontal
         )
 
-        val childConstraints = constraints.copy(
-            maxHeight = if (isVertical) Constraints.Infinity else constraints.maxHeight,
-            maxWidth = if (isVertical) constraints.maxWidth else Constraints.Infinity
-        )
+        val childConstraints =
+            constraints.copy(
+                maxHeight = if (isVertical) Constraints.Infinity else constraints.maxHeight,
+                maxWidth = if (isVertical) constraints.maxWidth else Constraints.Infinity
+            )
         val placeable = measurable.measure(childConstraints)
         val width = placeable.width.coerceAtMost(constraints.maxWidth)
         val height = placeable.height.coerceAtMost(constraints.maxHeight)
@@ -435,11 +427,12 @@
 
     override fun SemanticsPropertyReceiver.applySemantics() {
         isTraversalGroup = true
-        val accessibilityScrollState = ScrollAxisRange(
-            value = { state.value.toFloat() },
-            maxValue = { state.maxValue.toFloat() },
-            reverseScrolling = reverseScrolling
-        )
+        val accessibilityScrollState =
+            ScrollAxisRange(
+                value = { state.value.toFloat() },
+                maxValue = { state.maxValue.toFloat() },
+                reverseScrolling = reverseScrolling
+            )
         if (isVertical) {
             this.verticalScrollAxisRange = accessibilityScrollState
         } else {
diff --git a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/ScrollingContainer.kt b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/ScrollingContainer.kt
index 60b3942..62bdbe0 100644
--- a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/ScrollingContainer.kt
+++ b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/ScrollingContainer.kt
@@ -25,9 +25,7 @@
 import androidx.compose.ui.Modifier
 
 // TODO b/316559454 to remove @Composable from it and make it public
-/**
- * Scrolling related information to transform a layout into a "Scrollable Container"
- */
+/** Scrolling related information to transform a layout into a "Scrollable Container" */
 @ExperimentalFoundationApi
 internal fun Modifier.scrollingContainer(
     state: ScrollableState,
diff --git a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/content/MediaType.kt b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/content/MediaType.kt
index fb20d06..39f9518 100644
--- a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/content/MediaType.kt
+++ b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/content/MediaType.kt
@@ -27,38 +27,28 @@
 @ExperimentalFoundationApi
 expect class MediaType(representation: String) {
 
-    /**
-     * How this [MediaType] is represented in a specific platform.
-     */
+    /** How this [MediaType] is represented in a specific platform. */
     val representation: String
 
     @ExperimentalFoundationApi
     companion object {
 
-        /**
-         * Any type of text, html, stylized, or plain.
-         */
+        /** Any type of text, html, stylized, or plain. */
         val Text: MediaType
 
         /**
-         * Plain text that's only decoded from its raw representation, does not define or carry
-         * any annotations.
+         * Plain text that's only decoded from its raw representation, does not define or carry any
+         * annotations.
          */
         val PlainText: MediaType
 
-        /**
-         * Text that represents an HTML content.
-         */
+        /** Text that represents an HTML content. */
         val HtmlText: MediaType
 
-        /**
-         * Any type of image like PNG, JPEG, or GIFs.
-         */
+        /** Any type of image like PNG, JPEG, or GIFs. */
         val Image: MediaType
 
-        /**
-         * Matches all content types.
-         */
+        /** Matches all content types. */
         val All: MediaType
     }
 }
diff --git a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/content/ReceiveContent.kt b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/content/ReceiveContent.kt
index 939c724..f8a5c0c 100644
--- a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/content/ReceiveContent.kt
+++ b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/content/ReceiveContent.kt
@@ -34,8 +34,8 @@
 /**
  * Configures the current node and any children nodes as a Content Receiver.
  *
- * Content in this context refers to a [TransferableContent] that could be received from another
- * app through Drag-and-Drop, Copy/Paste, or from the Software Keyboard.
+ * Content in this context refers to a [TransferableContent] that could be received from another app
+ * through Drag-and-Drop, Copy/Paste, or from the Software Keyboard.
  *
  * There is no pre-filtering for the received content by media type, e.g. software Keyboard would
  * assume that the app can handle any content that's sent to it. Therefore, it's crucial to check
@@ -44,9 +44,8 @@
  * learn more about how to do proper checks on the received item.
  *
  * @param receiveContentListener Listener to respond to the receive event. This interface also
- * includes a set of callbacks for certain Drag-and-Drop state changes. Please checkout
- * [ReceiveContentListener] docs for an explanation of each callback.
- *
+ *   includes a set of callbacks for certain Drag-and-Drop state changes. Please checkout
+ *   [ReceiveContentListener] docs for an explanation of each callback.
  * @see TransferableContent
  * @see hasMediaType
  *
@@ -54,18 +53,12 @@
  */
 @Suppress("ExecutorRegistration")
 @ExperimentalFoundationApi
-fun Modifier.contentReceiver(
-    receiveContentListener: ReceiveContentListener
-): Modifier = then(
-    ReceiveContentElement(
-        receiveContentListener = receiveContentListener
-    )
-)
+fun Modifier.contentReceiver(receiveContentListener: ReceiveContentListener): Modifier =
+    then(ReceiveContentElement(receiveContentListener = receiveContentListener))
 
 @OptIn(ExperimentalFoundationApi::class)
-internal data class ReceiveContentElement(
-    val receiveContentListener: ReceiveContentListener
-) : ModifierNodeElement<ReceiveContentNode>() {
+internal data class ReceiveContentElement(val receiveContentListener: ReceiveContentListener) :
+    ModifierNodeElement<ReceiveContentNode>() {
     override fun create(): ReceiveContentNode {
         return ReceiveContentNode(receiveContentListener)
     }
@@ -83,10 +76,8 @@
 // Since the usage of modifier locals are minimal and exactly correspond to how we would use
 // TraversableNode if it was available, the switch should be fairly easy when the bug is fixed.
 @OptIn(ExperimentalFoundationApi::class)
-internal class ReceiveContentNode(
-    var receiveContentListener: ReceiveContentListener
-) : DelegatingNode(), ModifierLocalModifierNode,
-    CompositionLocalConsumerModifierNode {
+internal class ReceiveContentNode(var receiveContentListener: ReceiveContentListener) :
+    DelegatingNode(), ModifierLocalModifierNode, CompositionLocalConsumerModifierNode {
 
     private val receiveContentConfiguration: ReceiveContentConfiguration =
         DynamicReceiveContentConfiguration(this)
@@ -94,9 +85,7 @@
     // The default provided configuration is the one supplied to this node. Once the node is
     // attached, it should provide a delegating version to ancestor nodes.
     override val providedValues: ModifierLocalMap =
-        modifierLocalMapOf(
-            ModifierLocalReceiveContent to receiveContentConfiguration
-        )
+        modifierLocalMapOf(ModifierLocalReceiveContent to receiveContentConfiguration)
 
     init {
         delegate(
diff --git a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/content/ReceiveContentListener.kt b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/content/ReceiveContentListener.kt
index 25f391a..cc3d007 100644
--- a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/content/ReceiveContentListener.kt
+++ b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/content/ReceiveContentListener.kt
@@ -33,17 +33,12 @@
  *
  * Let's assume we have two [contentReceiver] boxes named A and B where B is a child of A, aligned
  * to bottom end.
- *
  * ---------
- * | A     |
- * |   |---|
- * |   | B |
+ * | A | | |---| | | B |
  * ---------
- *
  * When a dragging item moves over to A from left, then over to B, then starts moving up and goes
  * back to A leaving B, then finally leaves them both, the following would be the list of expected
  * [ReceiveContentListener] calls in order to both nodes.
- *
  * - A#onStart
  * - B#onStart
  * - A#onEnter
@@ -55,8 +50,8 @@
  *
  * The interesting part in this order of calls is that A does not receive an exit event when the
  * item moves over to B. This is different than what would happen if you were to use
- * [dragAndDropTarget] modifier because semantically [contentReceiver] works as a chain of nodes.
- * If the item were to be dropped on B, its [onReceive] chain would also call A's [onReceive] with
+ * [dragAndDropTarget] modifier because semantically [contentReceiver] works as a chain of nodes. If
+ * the item were to be dropped on B, its [onReceive] chain would also call A's [onReceive] with
  * what's left from B.
  */
 @ExperimentalFoundationApi
@@ -75,9 +70,7 @@
      */
     fun onDragEnd() = Unit
 
-    /**
-     * Optional callback that's called when a dragging item moves into this node's coordinates.
-     */
+    /** Optional callback that's called when a dragging item moves into this node's coordinates. */
     fun onDragEnter() = Unit
 
     /**
@@ -87,14 +80,15 @@
 
     /**
      * Callback that's triggered when a content is successfully committed.
+     *
      * @return An optional [TransferableContent] that contains the ignored parts of the received
-     * [TransferableContent] by this node. The remaining [TransferableContent] first will be sent to
-     * to the closest ancestor [contentReceiver] modifier. This chain will continue until there's no
-     * ancestor modifier left, or [TransferableContent] is fully consumed. After, the source
-     * subsystem that created the original [TransferableContent] and initiated the chain will
-     * receive any remaining items to apply its default behavior. For example a text editor that
-     * receives content by DragAndDrop should insert the remaining text from the receive chain
-     * to the drop position.
+     *   [TransferableContent] by this node. The remaining [TransferableContent] first will be sent
+     *   to to the closest ancestor [contentReceiver] modifier. This chain will continue until
+     *   there's no ancestor modifier left, or [TransferableContent] is fully consumed. After, the
+     *   source subsystem that created the original [TransferableContent] and initiated the chain
+     *   will receive any remaining items to apply its default behavior. For example a text editor
+     *   that receives content by DragAndDrop should insert the remaining text from the receive
+     *   chain to the drop position.
      */
     fun onReceive(transferableContent: TransferableContent): TransferableContent?
 }
diff --git a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/content/TransferableContent.kt b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/content/TransferableContent.kt
index bc812cb..5c12db2 100644
--- a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/content/TransferableContent.kt
+++ b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/content/TransferableContent.kt
@@ -26,25 +26,24 @@
  * Note; Consult platform-specific guidelines for best practices in content transfer operations.
  *
  * @property clipEntry The main content data, typically representing a text, image, file, or other
- * transferable item.
+ *   transferable item.
  * @property source The source from which the content originated like Keyboard, DragAndDrop, or
- * Clipboard.
+ *   Clipboard.
  * @property clipMetadata Metadata associated with the content, providing additional information or
- * context.
- * @property platformTransferableContent Optional platform-specific representation of the content, or
- * additional platform-specific information, that can be used to access platform level APIs.
+ *   context.
+ * @property platformTransferableContent Optional platform-specific representation of the content,
+ *   or additional platform-specific information, that can be used to access platform level APIs.
  */
 @ExperimentalFoundationApi
-class TransferableContent internal constructor(
+class TransferableContent
+internal constructor(
     val clipEntry: ClipEntry,
     val clipMetadata: ClipMetadata,
     val source: Source,
     val platformTransferableContent: PlatformTransferableContent? = null
 ) {
 
-    /**
-     * Defines the type of operation that a [TransferableContent] originates from.
-     */
+    /** Defines the type of operation that a [TransferableContent] originates from. */
     @ExperimentalFoundationApi
     @JvmInline
     value class Source internal constructor(private val value: Int) {
@@ -63,37 +62,35 @@
             val DragAndDrop = Source(1)
 
             /**
-             * Indicates that the [TransferableContent] comes from the clipboard via paste.
-             * (e.g. "Paste" action in the floating action menu or "Ctrl+V" key combination)
+             * Indicates that the [TransferableContent] comes from the clipboard via paste. (e.g.
+             * "Paste" action in the floating action menu or "Ctrl+V" key combination)
              */
             val Clipboard = Source(2)
         }
 
-        override fun toString(): String = when (this) {
-            Keyboard -> "Source.Keyboard"
-            DragAndDrop -> "Source.DragAndDrop"
-            Clipboard -> "Source.Clipboard"
-            else -> "Invalid ($value)"
-        }
+        override fun toString(): String =
+            when (this) {
+                Keyboard -> "Source.Keyboard"
+                DragAndDrop -> "Source.DragAndDrop"
+                Clipboard -> "Source.Clipboard"
+                else -> "Invalid ($value)"
+            }
     }
 }
 
 /**
- * All the platform-specific information regarding a [TransferableContent] that cannot be
- * abstracted away in a platform agnostic way.
+ * All the platform-specific information regarding a [TransferableContent] that cannot be abstracted
+ * away in a platform agnostic way.
  */
-@ExperimentalFoundationApi
-expect class PlatformTransferableContent
+@ExperimentalFoundationApi expect class PlatformTransferableContent
 
-/**
- * Returns whether this [TransferableContent] can provide an item with the [mediaType].
- */
+/** Returns whether this [TransferableContent] can provide an item with the [mediaType]. */
 @ExperimentalFoundationApi
 expect fun TransferableContent.hasMediaType(mediaType: MediaType): Boolean
 
 /**
- * Reads the text part of this [ClipEntry]. The returned result may not include the full
- * text representation of content e.g., if there is a URL pointing at another source. This function
- * only reads the explicit text that was transferred directly inside the [ClipEntry].
+ * Reads the text part of this [ClipEntry]. The returned result may not include the full text
+ * representation of content e.g., if there is a URL pointing at another source. This function only
+ * reads the explicit text that was transferred directly inside the [ClipEntry].
  */
 internal expect fun ClipEntry.readPlainText(): String?
diff --git a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/content/internal/DragAndDropRequestPermission.kt b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/content/internal/DragAndDropRequestPermission.kt
index 14c8b35..bab3253 100644
--- a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/content/internal/DragAndDropRequestPermission.kt
+++ b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/content/internal/DragAndDropRequestPermission.kt
@@ -19,9 +19,5 @@
 import androidx.compose.ui.draganddrop.DragAndDropEvent
 import androidx.compose.ui.node.DelegatableNode
 
-/**
- * Requests necessary platform permissions to read the content that's delivered by [event].
- */
-internal expect fun DelegatableNode.dragAndDropRequestPermission(
-    event: DragAndDropEvent
-)
+/** Requests necessary platform permissions to read the content that's delivered by [event]. */
+internal expect fun DelegatableNode.dragAndDropRequestPermission(event: DragAndDropEvent)
diff --git a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/content/internal/ReceiveContentConfiguration.kt b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/content/internal/ReceiveContentConfiguration.kt
index cdf1193..fe1c189 100644
--- a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/content/internal/ReceiveContentConfiguration.kt
+++ b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/content/internal/ReceiveContentConfiguration.kt
@@ -37,9 +37,7 @@
     companion object {
         operator fun invoke(
             receiveContentListener: ReceiveContentListener
-        ): ReceiveContentConfiguration = ReceiveContentConfigurationImpl(
-            receiveContentListener
-        )
+        ): ReceiveContentConfiguration = ReceiveContentConfigurationImpl(receiveContentListener)
     }
 }
 
@@ -53,23 +51,23 @@
  * In a [ModifierLocalModifierNode], reads the current [ReceiveContentConfiguration] that's supplied
  * by [ModifierLocalReceiveContent] if the node is currently attached.
  */
-internal fun ModifierLocalModifierNode.getReceiveContentConfiguration() = if (node.isAttached) {
-    ModifierLocalReceiveContent.current
-} else {
-    null
-}
+internal fun ModifierLocalModifierNode.getReceiveContentConfiguration() =
+    if (node.isAttached) {
+        ModifierLocalReceiveContent.current
+    } else {
+        null
+    }
 
 /**
  * Combines the current [ReceiveContentNode]'s [ReceiveContentConfiguration] with the parent
  * [ReceiveContentNode]s'. It also counts the drag and drop enter/exit calls to merge drag and drop
  * areas of parent/children [ReceiveContentListener]s. Unlike regular drop targets, ReceiveContent
- * does not call onExit when the dragging item moves from parent node to child node since they
- * share the same boundaries.
+ * does not call onExit when the dragging item moves from parent node to child node since they share
+ * the same boundaries.
  */
 @OptIn(ExperimentalFoundationApi::class)
-internal class DynamicReceiveContentConfiguration(
-    val receiveContentNode: ReceiveContentNode
-) : ReceiveContentConfiguration() {
+internal class DynamicReceiveContentConfiguration(val receiveContentNode: ReceiveContentNode) :
+    ReceiveContentConfiguration() {
 
     /**
      * A getter that returns the closest [contentReceiver] modifier configuration if this node is
@@ -80,84 +78,81 @@
         return receiveContentNode.getReceiveContentConfiguration()?.receiveContentListener
     }
 
-    override val receiveContentListener: ReceiveContentListener = object : ReceiveContentListener {
-        /**
-         * ---------
-         * | A     |
-         * |   |---|
-         * |   | B |
-         * ---------
-         *
-         * DragAndDrop's own callbacks do not work well with nested content. Simply, when B is
-         * nested in A, and the dragging item moves from (A\B) to (A∩B), A receives an exit event
-         * and B receives an enter event. From ReceiveContent's chaining perspective, anything
-         * that gets dropped on B is also dropped on A. Hence, A should not receive an exit event
-         * when the item moves over B.
-         *
-         * This variable counts the difference between number of times enter and exit are called,
-         * but not just on this node. ReceiveContent chaining makes sure that every enter event
-         * that B receives is also delegated A. For example;
-         *
-         * - Dragging item moves onto A.
-         *   - A receives an enter event from DragAndDrop system. Enter=1, Exit=0
-         * - Dragging item moves onto B.
-         *   - A receives an exit event from DragAndDrop system. Enter=1, Exit=1.
-         *   - B receives an enter event from DragAndDrop system.
-         *     - B delegates this to A.
-         *     - A receives an enter event from B. Enter=2, Exit=1
-         *
-         * In conclusion, nodeEnterCount would be 1, meaning that this node is still hovered.
-         */
-        private var nodeEnterCount: Int = 0
+    override val receiveContentListener: ReceiveContentListener =
+        object : ReceiveContentListener {
+            /**
+             * ---------
+             * | A | | |---| | | B |
+             * ---------
+             * DragAndDrop's own callbacks do not work well with nested content. Simply, when B is
+             * nested in A, and the dragging item moves from (A\B) to (A∩B), A receives an exit
+             * event and B receives an enter event. From ReceiveContent's chaining perspective,
+             * anything that gets dropped on B is also dropped on A. Hence, A should not receive an
+             * exit event when the item moves over B.
+             *
+             * This variable counts the difference between number of times enter and exit are
+             * called, but not just on this node. ReceiveContent chaining makes sure that every
+             * enter event that B receives is also delegated A. For example;
+             * - Dragging item moves onto A.
+             *     - A receives an enter event from DragAndDrop system. Enter=1, Exit=0
+             * - Dragging item moves onto B.
+             *     - A receives an exit event from DragAndDrop system. Enter=1, Exit=1.
+             *     - B receives an enter event from DragAndDrop system.
+             *         - B delegates this to A.
+             *         - A receives an enter event from B. Enter=2, Exit=1
+             *
+             * In conclusion, nodeEnterCount would be 1, meaning that this node is still hovered.
+             */
+            private var nodeEnterCount: Int = 0
 
-        override fun onDragStart() {
-            // no need to call parent on this because all nodes are going to receive
-            // onStart at the same time from DragAndDrop system.
-            nodeEnterCount = 0
-            receiveContentNode.receiveContentListener.onDragStart()
-        }
-
-        override fun onDragEnd() {
-            // no need to call parent on this because all nodes are going to receive
-            // onEnd at the same time from DragAndDrop system.
-            receiveContentNode.receiveContentListener.onDragEnd()
-            nodeEnterCount = 0
-        }
-
-        override fun onDragEnter() {
-            nodeEnterCount++
-            if (nodeEnterCount == 1) {
-                // enter became 1 from 0. Trigger the callback.
-                receiveContentNode.receiveContentListener.onDragEnter()
+            override fun onDragStart() {
+                // no need to call parent on this because all nodes are going to receive
+                // onStart at the same time from DragAndDrop system.
+                nodeEnterCount = 0
+                receiveContentNode.receiveContentListener.onDragStart()
             }
-            // We need to call enter on parent because they will receive onExit from their
-            // own DragAndDropTarget.
-            getParentReceiveContentListener()?.onDragEnter()
-        }
 
-        override fun onDragExit() {
-            val previous = nodeEnterCount
-            nodeEnterCount = (nodeEnterCount - 1).coerceAtLeast(0)
-            if (nodeEnterCount == 0 && previous > 0) {
-                receiveContentNode.receiveContentListener.onDragExit()
+            override fun onDragEnd() {
+                // no need to call parent on this because all nodes are going to receive
+                // onEnd at the same time from DragAndDrop system.
+                receiveContentNode.receiveContentListener.onDragEnd()
+                nodeEnterCount = 0
             }
-            // We need to call exit on parent because they also received an enter from us.
-            getParentReceiveContentListener()?.onDragExit()
+
+            override fun onDragEnter() {
+                nodeEnterCount++
+                if (nodeEnterCount == 1) {
+                    // enter became 1 from 0. Trigger the callback.
+                    receiveContentNode.receiveContentListener.onDragEnter()
+                }
+                // We need to call enter on parent because they will receive onExit from their
+                // own DragAndDropTarget.
+                getParentReceiveContentListener()?.onDragEnter()
+            }
+
+            override fun onDragExit() {
+                val previous = nodeEnterCount
+                nodeEnterCount = (nodeEnterCount - 1).coerceAtLeast(0)
+                if (nodeEnterCount == 0 && previous > 0) {
+                    receiveContentNode.receiveContentListener.onDragExit()
+                }
+                // We need to call exit on parent because they also received an enter from us.
+                getParentReceiveContentListener()?.onDragExit()
+            }
+
+            override fun onReceive(transferableContent: TransferableContent): TransferableContent? {
+                // first let this node do whatever it wants. If it consumes everything, we can end
+                // the chain here.
+                val remaining =
+                    receiveContentNode.receiveContentListener.onReceive(transferableContent)
+                        ?: return null
+
+                // Check whether we have a parent node. If not, we can return the remaining here.
+                val parentReceiveContentListener =
+                    getParentReceiveContentListener() ?: return remaining
+
+                // Delegate the rest to the parent node to continue the chain.
+                return parentReceiveContentListener.onReceive(remaining)
+            }
         }
-
-        override fun onReceive(transferableContent: TransferableContent): TransferableContent? {
-            // first let this node do whatever it wants. If it consumes everything, we can end
-            // the chain here.
-            val remaining = receiveContentNode
-                .receiveContentListener
-                .onReceive(transferableContent) ?: return null
-
-            // Check whether we have a parent node. If not, we can return the remaining here.
-            val parentReceiveContentListener = getParentReceiveContentListener()
-                ?: return remaining
-
-            // Delegate the rest to the parent node to continue the chain.
-            return parentReceiveContentListener.onReceive(remaining)
-        }
-    }
 }
diff --git a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/draganddrop/DragAndDropSource.kt b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/draganddrop/DragAndDropSource.kt
index e0cdc58..bbb3d68 100644
--- a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/draganddrop/DragAndDropSource.kt
+++ b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/draganddrop/DragAndDropSource.kt
@@ -44,48 +44,48 @@
 }
 
 /**
- * A Modifier that allows an element it is applied to to be treated like a source for
- * drag and drop operations.
+ * A Modifier that allows an element it is applied to to be treated like a source for drag and drop
+ * operations.
  *
  * Learn how to use [Modifier.dragAndDropSource] while providing a custom drag shadow:
+ *
  * @sample androidx.compose.foundation.samples.DragAndDropSourceWithColoredDragShadowSample
  *
- * @param drawDragDecoration provides the visual representation of the item dragged during the
- * drag and drop gesture.
- * @param block A lambda with a [DragAndDropSourceScope] as a receiver
- * which provides a [PointerInputScope] to detect the drag gesture, after which a drag and drop
- * gesture can be started with [DragAndDropSourceScope.startTransfer].
- *
+ * @param drawDragDecoration provides the visual representation of the item dragged during the drag
+ *   and drop gesture.
+ * @param block A lambda with a [DragAndDropSourceScope] as a receiver which provides a
+ *   [PointerInputScope] to detect the drag gesture, after which a drag and drop gesture can be
+ *   started with [DragAndDropSourceScope.startTransfer].
  */
 @ExperimentalFoundationApi
 fun Modifier.dragAndDropSource(
     drawDragDecoration: DrawScope.() -> Unit,
     block: suspend DragAndDropSourceScope.() -> Unit
-): Modifier = this then DragAndDropSourceElement(
-    drawDragDecoration = drawDragDecoration,
-    dragAndDropSourceHandler = block,
-)
+): Modifier =
+    this then
+        DragAndDropSourceElement(
+            drawDragDecoration = drawDragDecoration,
+            dragAndDropSourceHandler = block,
+        )
 
 @ExperimentalFoundationApi
 private data class DragAndDropSourceElement(
-    /**
-     * @see Modifier.dragAndDropSource
-     */
+    /** @see Modifier.dragAndDropSource */
     val drawDragDecoration: DrawScope.() -> Unit,
-    /**
-     * @see Modifier.dragAndDropSource
-     */
+    /** @see Modifier.dragAndDropSource */
     val dragAndDropSourceHandler: suspend DragAndDropSourceScope.() -> Unit
 ) : ModifierNodeElement<DragAndDropSourceNode>() {
-    override fun create() = DragAndDropSourceNode(
-        drawDragDecoration = drawDragDecoration,
-        dragAndDropSourceHandler = dragAndDropSourceHandler,
-    )
+    override fun create() =
+        DragAndDropSourceNode(
+            drawDragDecoration = drawDragDecoration,
+            dragAndDropSourceHandler = dragAndDropSourceHandler,
+        )
 
-    override fun update(node: DragAndDropSourceNode) = with(node) {
-        drawDragDecoration = this@DragAndDropSourceElement.drawDragDecoration
-        dragAndDropSourceHandler = this@DragAndDropSourceElement.dragAndDropSourceHandler
-    }
+    override fun update(node: DragAndDropSourceNode) =
+        with(node) {
+            drawDragDecoration = this@DragAndDropSourceElement.drawDragDecoration
+            dragAndDropSourceHandler = this@DragAndDropSourceElement.dragAndDropSourceHandler
+        }
 
     override fun InspectorInfo.inspectableProperties() {
         name = "dragSource"
@@ -98,15 +98,12 @@
 internal class DragAndDropSourceNode(
     var drawDragDecoration: DrawScope.() -> Unit,
     var dragAndDropSourceHandler: suspend DragAndDropSourceScope.() -> Unit
-) : DelegatingNode(),
-    LayoutAwareModifierNode {
+) : DelegatingNode(), LayoutAwareModifierNode {
 
     private var size: IntSize = IntSize.Zero
 
     init {
-        val dragAndDropModifierNode = delegate(
-            DragAndDropModifierNode()
-        )
+        val dragAndDropModifierNode = delegate(DragAndDropModifierNode())
 
         delegate(
             SuspendingPointerInputModifierNode {
diff --git a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/draganddrop/DragAndDropTarget.kt b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/draganddrop/DragAndDropTarget.kt
index 2a14342..757d30a 100644
--- a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/draganddrop/DragAndDropTarget.kt
+++ b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/draganddrop/DragAndDropTarget.kt
@@ -33,11 +33,9 @@
  *
  * @sample androidx.compose.foundation.samples.TextDragAndDropTargetSample
  *
- * @param shouldStartDragAndDrop Allows the Composable to decide if it wants to receive from
- * a given drag and drop session by inspecting the [DragAndDropEvent] that started the session.
- *
- * @param target The [DragAndDropTarget] that will receive events for a given drag and drop
- * session.
+ * @param shouldStartDragAndDrop Allows the Composable to decide if it wants to receive from a given
+ *   drag and drop session by inspecting the [DragAndDropEvent] that started the session.
+ * @param target The [DragAndDropTarget] that will receive events for a given drag and drop session.
  *
  * All drag and drop target modifiers in the hierarchy will be given an opportunity to participate
  * in a given drag and drop session via [shouldStartDragAndDrop].
@@ -48,25 +46,26 @@
 fun Modifier.dragAndDropTarget(
     shouldStartDragAndDrop: (startEvent: DragAndDropEvent) -> Boolean,
     target: DragAndDropTarget,
-): Modifier = this then DropTargetElement(
-    target = target,
-    shouldStartDragAndDrop = shouldStartDragAndDrop,
-)
+): Modifier =
+    this then
+        DropTargetElement(
+            target = target,
+            shouldStartDragAndDrop = shouldStartDragAndDrop,
+        )
 
 @ExperimentalFoundationApi
 private class DropTargetElement(
     val shouldStartDragAndDrop: (event: DragAndDropEvent) -> Boolean,
     val target: DragAndDropTarget,
 ) : ModifierNodeElement<DragAndDropTargetNode>() {
-    override fun create() = DragAndDropTargetNode(
-        target = target,
-        shouldStartDragAndDrop = shouldStartDragAndDrop,
-    )
+    override fun create() =
+        DragAndDropTargetNode(
+            target = target,
+            shouldStartDragAndDrop = shouldStartDragAndDrop,
+        )
 
-    override fun update(node: DragAndDropTargetNode) = node.update(
-        target = target,
-        shouldStartDragAndDrop = shouldStartDragAndDrop
-    )
+    override fun update(node: DragAndDropTargetNode) =
+        node.update(target = target, shouldStartDragAndDrop = shouldStartDragAndDrop)
 
     override fun InspectorInfo.inspectableProperties() {
         name = "dropTarget"
@@ -118,13 +117,15 @@
     }
 
     private fun createAndAttachDragAndDropModifierNode() {
-        dragAndDropNode = delegate(
-            DragAndDropModifierNode(
-                // We wrap the this.shouldStartDragAndDrop invocation in a lambda as it might change over
-                // time, and updates to shouldStartDragAndDrop are not destructive.
-                shouldStartDragAndDrop = { this.shouldStartDragAndDrop(it) },
-                target = this.target
+        dragAndDropNode =
+            delegate(
+                DragAndDropModifierNode(
+                    // We wrap the this.shouldStartDragAndDrop invocation in a lambda as it might
+                    // change over
+                    // time, and updates to shouldStartDragAndDrop are not destructive.
+                    shouldStartDragAndDrop = { this.shouldStartDragAndDrop(it) },
+                    target = this.target
+                )
             )
-        )
     }
 }
diff --git a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/gestures/AnchoredDraggable.kt b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/gestures/AnchoredDraggable.kt
index 1d87538..b4431d8 100644
--- a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/gestures/AnchoredDraggable.kt
+++ b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/gestures/AnchoredDraggable.kt
@@ -66,28 +66,28 @@
  * Enable drag gestures between a set of predefined values.
  *
  * When a drag is detected, the offset of the [AnchoredDraggableState] will be updated with the drag
- * delta. You should use this offset to move your content accordingly (see [Modifier.offset]).
- * When the drag ends, the offset will be animated to one of the anchors and when that anchor is
- * reached, the value of the [AnchoredDraggableState] will also be updated to the value
- * corresponding to the new anchor.
+ * delta. You should use this offset to move your content accordingly (see [Modifier.offset]). When
+ * the drag ends, the offset will be animated to one of the anchors and when that anchor is reached,
+ * the value of the [AnchoredDraggableState] will also be updated to the value corresponding to the
+ * new anchor.
  *
  * Dragging is constrained between the minimum and maximum anchors.
  *
  * @param state The associated [AnchoredDraggableState].
- * @param reverseDirection Whether to reverse the direction of the drag, so a top to bottom
- * drag will behave like bottom to top, and a left to right drag will behave like right to left. If
- * not specified, this will be determined based on [orientation] and [LocalLayoutDirection].
+ * @param reverseDirection Whether to reverse the direction of the drag, so a top to bottom drag
+ *   will behave like bottom to top, and a left to right drag will behave like right to left. If not
+ *   specified, this will be determined based on [orientation] and [LocalLayoutDirection].
  * @param orientation The orientation in which the [anchoredDraggable] can be dragged.
  * @param enabled Whether this [anchoredDraggable] is enabled and should react to the user's input.
- * @param interactionSource Optional [MutableInteractionSource] that will passed on to
- * the internal [Modifier.draggable].
+ * @param interactionSource Optional [MutableInteractionSource] that will passed on to the internal
+ *   [Modifier.draggable].
  * @param overscrollEffect optional effect to dispatch any excess delta or velocity to. The excess
- * delta or velocity are a result of dragging/flinging and reaching the bounds. If you provide an
- * [overscrollEffect], make sure to apply [androidx.compose.foundation.overscroll] to render the
- * effect as well.
+ *   delta or velocity are a result of dragging/flinging and reaching the bounds. If you provide an
+ *   [overscrollEffect], make sure to apply [androidx.compose.foundation.overscroll] to render the
+ *   effect as well.
  * @param startDragImmediately when set to false, [draggable] will start dragging only when the
- * gesture crosses the touchSlop. This is useful to prevent users from "catching" an animating
- * widget when pressing on it. See [draggable] to learn more about startDragImmediately.
+ *   gesture crosses the touchSlop. This is useful to prevent users from "catching" an animating
+ *   widget when pressing on it. See [draggable] to learn more about startDragImmediately.
  */
 @ExperimentalFoundationApi
 fun <T> Modifier.anchoredDraggable(
@@ -98,41 +98,42 @@
     interactionSource: MutableInteractionSource? = null,
     overscrollEffect: OverscrollEffect? = null,
     startDragImmediately: Boolean = state.isAnimationRunning
-): Modifier = this then AnchoredDraggableElement(
-    state = state,
-    orientation = orientation,
-    enabled = enabled,
-    reverseDirection = reverseDirection,
-    interactionSource = interactionSource,
-    overscrollEffect = overscrollEffect,
-    startDragImmediately = startDragImmediately
-)
+): Modifier =
+    this then
+        AnchoredDraggableElement(
+            state = state,
+            orientation = orientation,
+            enabled = enabled,
+            reverseDirection = reverseDirection,
+            interactionSource = interactionSource,
+            overscrollEffect = overscrollEffect,
+            startDragImmediately = startDragImmediately
+        )
 
 /**
  * Enable drag gestures between a set of predefined values.
  *
  * When a drag is detected, the offset of the [AnchoredDraggableState] will be updated with the drag
- * delta. If the [orientation] is set to [Orientation.Horizontal] and [LocalLayoutDirection]'s
- * value is [LayoutDirection.Rtl], the drag deltas will be reversed.
- * You should use this offset to move your content accordingly (see [Modifier.offset]).
- * When the drag ends, the offset will be animated to one of the anchors and when that anchor is
- * reached, the value of the [AnchoredDraggableState] will also be updated to the value
- * corresponding to the new anchor.
+ * delta. If the [orientation] is set to [Orientation.Horizontal] and [LocalLayoutDirection]'s value
+ * is [LayoutDirection.Rtl], the drag deltas will be reversed. You should use this offset to move
+ * your content accordingly (see [Modifier.offset]). When the drag ends, the offset will be animated
+ * to one of the anchors and when that anchor is reached, the value of the [AnchoredDraggableState]
+ * will also be updated to the value corresponding to the new anchor.
  *
  * Dragging is constrained between the minimum and maximum anchors.
  *
  * @param state The associated [AnchoredDraggableState].
  * @param orientation The orientation in which the [anchoredDraggable] can be dragged.
  * @param enabled Whether this [anchoredDraggable] is enabled and should react to the user's input.
- * @param interactionSource Optional [MutableInteractionSource] that will passed on to
- * the internal [Modifier.draggable].
+ * @param interactionSource Optional [MutableInteractionSource] that will passed on to the internal
+ *   [Modifier.draggable].
  * @param overscrollEffect optional effect to dispatch any excess delta or velocity to. The excess
- * delta or velocity are a result of dragging/flinging and reaching the bounds. If you provide an
- * [overscrollEffect], make sure to apply [androidx.compose.foundation.overscroll] to render the
- * effect as well.
+ *   delta or velocity are a result of dragging/flinging and reaching the bounds. If you provide an
+ *   [overscrollEffect], make sure to apply [androidx.compose.foundation.overscroll] to render the
+ *   effect as well.
  * @param startDragImmediately when set to false, [draggable] will start dragging only when the
- * gesture crosses the touchSlop. This is useful to prevent users from "catching" an animating
- * widget when pressing on it. See [draggable] to learn more about startDragImmediately.
+ *   gesture crosses the touchSlop. This is useful to prevent users from "catching" an animating
+ *   widget when pressing on it. See [draggable] to learn more about startDragImmediately.
  */
 @ExperimentalFoundationApi
 fun <T> Modifier.anchoredDraggable(
@@ -142,15 +143,17 @@
     interactionSource: MutableInteractionSource? = null,
     overscrollEffect: OverscrollEffect? = null,
     startDragImmediately: Boolean = state.isAnimationRunning
-): Modifier = this then AnchoredDraggableElement(
-    state = state,
-    orientation = orientation,
-    enabled = enabled,
-    reverseDirection = null,
-    interactionSource = interactionSource,
-    overscrollEffect = overscrollEffect,
-    startDragImmediately = startDragImmediately
-)
+): Modifier =
+    this then
+        AnchoredDraggableElement(
+            state = state,
+            orientation = orientation,
+            enabled = enabled,
+            reverseDirection = null,
+            interactionSource = interactionSource,
+            overscrollEffect = overscrollEffect,
+            startDragImmediately = startDragImmediately
+        )
 
 @OptIn(ExperimentalFoundationApi::class)
 private class AnchoredDraggableElement<T>(
@@ -162,15 +165,16 @@
     private val startDragImmediately: Boolean,
     private val overscrollEffect: OverscrollEffect?,
 ) : ModifierNodeElement<AnchoredDraggableNode<T>>() {
-    override fun create() = AnchoredDraggableNode(
-        state,
-        orientation,
-        enabled,
-        reverseDirection,
-        interactionSource,
-        overscrollEffect,
-        startDragImmediately,
-    )
+    override fun create() =
+        AnchoredDraggableNode(
+            state,
+            orientation,
+            enabled,
+            reverseDirection,
+            interactionSource,
+            overscrollEffect,
+            startDragImmediately,
+        )
 
     override fun update(node: AnchoredDraggableNode<T>) {
         node.update(
@@ -232,19 +236,22 @@
     interactionSource: MutableInteractionSource?,
     private var overscrollEffect: OverscrollEffect?,
     private var startDragImmediately: Boolean
-) : DragGestureNode(
-    canDrag = AlwaysDrag,
-    enabled = enabled,
-    interactionSource = interactionSource,
-    orientationLock = orientation
-) {
+) :
+    DragGestureNode(
+        canDrag = AlwaysDrag,
+        enabled = enabled,
+        interactionSource = interactionSource,
+        orientationLock = orientation
+    ) {
 
     private val isReverseDirection: Boolean
-        get() = when (reverseDirection) {
-            null -> requireLayoutDirection() == LayoutDirection.Rtl &&
-                orientation == Orientation.Horizontal
-            else -> reverseDirection!!
-        }
+        get() =
+            when (reverseDirection) {
+                null ->
+                    requireLayoutDirection() == LayoutDirection.Rtl &&
+                        orientation == Orientation.Horizontal
+                else -> reverseDirection!!
+            }
 
     override suspend fun drag(forEachDelta: suspend ((dragDelta: DragDelta) -> Unit) -> Unit) {
         state.anchoredDrag {
@@ -266,7 +273,7 @@
         }
     }
 
-    override fun onDragStarted(startedPosition: Offset) { }
+    override fun onDragStarted(startedPosition: Offset) {}
 
     override fun onDragStopped(velocity: Velocity) {
         if (!isAttached) return
@@ -274,9 +281,8 @@
             if (overscrollEffect == null) {
                 state.settle(velocity.reverseIfNeeded().toFloat()).toVelocity()
             } else {
-                overscrollEffect!!.applyToFling(
-                    velocity = velocity.reverseIfNeeded()
-                ) { availableVelocity ->
+                overscrollEffect!!.applyToFling(velocity = velocity.reverseIfNeeded()) {
+                    availableVelocity ->
                     val consumed = state.settle(availableVelocity.toFloat()).toVelocity()
                     val currentOffset = state.requireOffset()
                     val minAnchor = state.anchors.minAnchor()
@@ -330,23 +336,24 @@
         )
     }
 
-    private fun Float.toOffset() = Offset(
-        x = if (orientation == Orientation.Horizontal) this else 0f,
-        y = if (orientation == Orientation.Vertical) this else 0f,
-    )
+    private fun Float.toOffset() =
+        Offset(
+            x = if (orientation == Orientation.Horizontal) this else 0f,
+            y = if (orientation == Orientation.Vertical) this else 0f,
+        )
 
-    private fun Float.toVelocity() = Velocity(
-        x = if (orientation == Orientation.Horizontal) this else 0f,
-        y = if (orientation == Orientation.Vertical) this else 0f,
-    )
+    private fun Float.toVelocity() =
+        Velocity(
+            x = if (orientation == Orientation.Horizontal) this else 0f,
+            y = if (orientation == Orientation.Vertical) this else 0f,
+        )
 
-    private fun Velocity.toFloat() =
-        if (orientation == Orientation.Vertical) this.y else this.x
+    private fun Velocity.toFloat() = if (orientation == Orientation.Vertical) this.y else this.x
 
-    private fun Offset.toFloat() =
-        if (orientation == Orientation.Vertical) this.y else this.x
+    private fun Offset.toFloat() = if (orientation == Orientation.Vertical) this.y else this.x
 
     private fun Velocity.reverseIfNeeded() = if (isReverseDirection) this * -1f else this * 1f
+
     private fun Offset.reverseIfNeeded() = if (isReverseDirection) this * -1f else this * 1f
 }
 
@@ -364,7 +371,6 @@
      * Get the anchor position for an associated [value]
      *
      * @param value The value to look up
-     *
      * @return The position of the anchor, or [Float.NaN] if the anchor does not exist
      */
     fun positionOf(value: T): Float
@@ -373,7 +379,6 @@
      * Whether there is an anchor position associated with the [value]
      *
      * @param value The value to look up
-     *
      * @return true if there is an anchor for this value, false if there is no anchor for this value
      */
     fun hasAnchorFor(value: T): Boolean
@@ -382,7 +387,6 @@
      * Find the closest anchor to the [position].
      *
      * @param position The position to start searching from
-     *
      * @return The closest anchor or null if the anchors are empty
      */
     fun closestAnchor(position: Float): T?
@@ -392,19 +396,14 @@
      *
      * @param position The position to start searching from
      * @param searchUpwards Whether to search upwards from the current position or downwards
-     *
      * @return The closest anchor or null if the anchors are empty
      */
     fun closestAnchor(position: Float, searchUpwards: Boolean): T?
 
-    /**
-     * The smallest anchor, or [Float.NEGATIVE_INFINITY] if the anchors are empty.
-     */
+    /** The smallest anchor, or [Float.NEGATIVE_INFINITY] if the anchors are empty. */
     fun minAnchor(): Float
 
-    /**
-     * The biggest anchor, or [Float.POSITIVE_INFINITY] if the anchors are empty.
-     */
+    /** The biggest anchor, or [Float.POSITIVE_INFINITY] if the anchors are empty. */
     fun maxAnchor(): Float
 
     /**
@@ -414,9 +413,7 @@
      */
     fun forEach(block: (anchor: T, position: Float) -> Unit)
 
-    /**
-     * The amount of anchors
-     */
+    /** The amount of anchors */
     val size: Int
 }
 
@@ -446,19 +443,18 @@
  *
  * @param builder A function with a [DraggableAnchorsConfig] that offers APIs to configure anchors
  * @return A new [DraggableAnchors] instance with the anchor positions set by the `builder`
- * function.
+ *   function.
  */
 @ExperimentalFoundationApi
-fun <T : Any> DraggableAnchors(
-    builder: DraggableAnchorsConfig<T>.() -> Unit
-): DraggableAnchors<T> = MapDraggableAnchors(DraggableAnchorsConfig<T>().apply(builder).anchors)
+fun <T : Any> DraggableAnchors(builder: DraggableAnchorsConfig<T>.() -> Unit): DraggableAnchors<T> =
+    MapDraggableAnchors(DraggableAnchorsConfig<T>().apply(builder).anchors)
 
 /**
  * Scope used for suspending anchored drag blocks. Allows to set [AnchoredDraggableState.offset] to
  * a new value.
  *
  * @see [AnchoredDraggableState.anchoredDrag] to learn how to start the anchored drag and get the
- * access to this scope.
+ *   access to this scope.
  */
 @ExperimentalFoundationApi
 interface AnchoredDragScope {
@@ -468,31 +464,28 @@
      * @param newOffset new value for [AnchoredDraggableState.offset].
      * @param lastKnownVelocity last known velocity (if known)
      */
-    fun dragTo(
-        newOffset: Float,
-        lastKnownVelocity: Float = 0f
-    )
+    fun dragTo(newOffset: Float, lastKnownVelocity: Float = 0f)
 }
 
 /**
- * State of the [anchoredDraggable] modifier.
- * Use the constructor overload with anchors if the anchors are defined in composition, or update
- * the anchors using [updateAnchors].
+ * State of the [anchoredDraggable] modifier. Use the constructor overload with anchors if the
+ * anchors are defined in composition, or update the anchors using [updateAnchors].
  *
- * This contains necessary information about any ongoing drag or animation and provides methods
- * to change the state either immediately or by starting an animation.
+ * This contains necessary information about any ongoing drag or animation and provides methods to
+ * change the state either immediately or by starting an animation.
  *
  * @param initialValue The initial value of the state.
  * @param positionalThreshold The positional threshold, in px, to be used when calculating the
- * target state while a drag is in progress and when settling after the drag ends. This is the
- * distance from the start of a transition. It will be, depending on the direction of the
- * interaction, added or subtracted from/to the origin offset. It should always be a positive value.
+ *   target state while a drag is in progress and when settling after the drag ends. This is the
+ *   distance from the start of a transition. It will be, depending on the direction of the
+ *   interaction, added or subtracted from/to the origin offset. It should always be a positive
+ *   value.
  * @param velocityThreshold The velocity threshold (in px per second) that the end velocity has to
- * exceed in order to animate to the next state, even if the [positionalThreshold] has not been
- * reached.
+ *   exceed in order to animate to the next state, even if the [positionalThreshold] has not been
+ *   reached.
  * @param snapAnimationSpec The default animation spec that will be used to animate to a new state.
  * @param decayAnimationSpec The animation spec that will be used when flinging with a large enough
- * velocity to reach or cross the target state.
+ *   velocity to reach or cross the target state.
  * @param confirmValueChange Optional callback invoked to confirm or veto a pending state change.
  */
 @Stable
@@ -512,19 +505,19 @@
      * @param initialValue The initial value of the state.
      * @param anchors The anchors of the state. Use [updateAnchors] to update the anchors later.
      * @param snapAnimationSpec The default animation spec that will be used to animate to a new
-     * state.
+     *   state.
      * @param decayAnimationSpec The animation spec that will be used when flinging with a large
-     * enough velocity to reach or cross the target state.
+     *   enough velocity to reach or cross the target state.
      * @param confirmValueChange Optional callback invoked to confirm or veto a pending state
-     * change.
+     *   change.
      * @param positionalThreshold The positional threshold, in px, to be used when calculating the
-     * target state while a drag is in progress and when settling after the drag ends. This is the
-     * distance from the start of a transition. It will be, depending on the direction of the
-     * interaction, added or subtracted from/to the origin offset. It should always be a positive
-     * value.
+     *   target state while a drag is in progress and when settling after the drag ends. This is the
+     *   distance from the start of a transition. It will be, depending on the direction of the
+     *   interaction, added or subtracted from/to the origin offset. It should always be a positive
+     *   value.
      * @param velocityThreshold The velocity threshold (in px per second) that the end velocity has
-     * to exceed in order to animate to the next state, even if the [positionalThreshold] has not
-     * been reached.
+     *   to exceed in order to animate to the next state, even if the [positionalThreshold] has not
+     *   been reached.
      */
     @ExperimentalFoundationApi
     constructor(
@@ -571,12 +564,13 @@
      * animations or drags are in progress, this will be the current value.
      */
     val targetValue: T by derivedStateOf {
-        dragTarget ?: run {
-            val currentOffset = offset
-            if (!currentOffset.isNaN()) {
-                anchors.closestAnchor(offset) ?: currentValue
-            } else currentValue
-        }
+        dragTarget
+            ?: run {
+                val currentOffset = offset
+                if (!currentOffset.isNaN()) {
+                    anchors.closestAnchor(offset) ?: currentValue
+                } else currentValue
+            }
     }
 
     /**
@@ -593,9 +587,8 @@
     /**
      * Require the current offset.
      *
-     * @see offset
-     *
      * @throws IllegalStateException If the offset has not been initialized yet
+     * @see offset
      */
     fun requireOffset(): Float {
         check(!offset.isNaN()) {
@@ -605,10 +598,9 @@
         return offset
     }
 
-    /**
-     * Whether an animation is currently in progress.
-     */
-    val isAnimationRunning: Boolean get() = dragTarget != null
+    /** Whether an animation is currently in progress. */
+    val isAnimationRunning: Boolean
+        get() = dragTarget != null
 
     /**
      * The fraction of the offset between [from] and [to], as a fraction between [0f..1f], or 1f if
@@ -621,10 +613,11 @@
     fun progress(from: T, to: T): Float {
         val fromOffset = anchors.positionOf(from)
         val toOffset = anchors.positionOf(to)
-        val currentOffset = offset.coerceIn(
-            min(fromOffset, toOffset), // fromOffset might be > toOffset
-            max(fromOffset, toOffset)
-        )
+        val currentOffset =
+            offset.coerceIn(
+                min(fromOffset, toOffset), // fromOffset might be > toOffset
+                max(fromOffset, toOffset)
+            )
         val fraction = (currentOffset - fromOffset) / (toOffset - fromOffset)
         return if (!fraction.isNaN()) {
             // If we are very close to 0f or 1f, we round to the closest
@@ -637,27 +630,27 @@
      * bounds, or 1f if the [AnchoredDraggableState] is in a settled state.
      */
     @Deprecated(
-        message = "Use the progress function to query the progress between two specified " +
-            "anchors.",
+        message =
+            "Use the progress function to query the progress between two specified " + "anchors.",
         replaceWith = ReplaceWith("progress(state.settledValue, state.targetValue)")
     )
     @get:FloatRange(from = 0.0, to = 1.0)
-    val progress: Float by derivedStateOf(structuralEqualityPolicy()) {
-        val a = anchors.positionOf(settledValue)
-        val b = anchors.positionOf(targetValue)
-        val distance = abs(b - a)
-        if (!distance.isNaN() && distance > 1e-6f) {
-            val progress = (this.requireOffset() - a) / (b - a)
-            // If we are very close to 0f or 1f, we round to the closest
-            if (progress < 1e-6f) 0f else if (progress > 1 - 1e-6f) 1f else progress
-        } else 1f
-    }
+    val progress: Float by
+        derivedStateOf(structuralEqualityPolicy()) {
+            val a = anchors.positionOf(settledValue)
+            val b = anchors.positionOf(targetValue)
+            val distance = abs(b - a)
+            if (!distance.isNaN() && distance > 1e-6f) {
+                val progress = (this.requireOffset() - a) / (b - a)
+                // If we are very close to 0f or 1f, we round to the closest
+                if (progress < 1e-6f) 0f else if (progress > 1 - 1e-6f) 1f else progress
+            } else 1f
+        }
 
     /**
      * The velocity of the last known animation. Gets reset to 0f when an animation completes
-     * successfully, but does not get reset when an animation gets interrupted.
-     * You can use this value to provide smooth reconciliation behavior when re-targeting an
-     * animation.
+     * successfully, but does not get reset when an animation gets interrupted. You can use this
+     * value to provide smooth reconciliation behavior when re-targeting an animation.
      */
     var lastVelocity: Float by mutableFloatStateOf(0f)
         private set
@@ -674,19 +667,19 @@
      *
      * <b>If your anchors depend on the size of the layout, updateAnchors should be called in the
      * layout (placement) phase, e.g. through Modifier.onSizeChanged.</b> This ensures that the
-     * state is set up within the same frame.
-     * For static anchors, or anchors with different data dependencies, [updateAnchors] is safe to
-     * be called from side effects or layout.
+     * state is set up within the same frame. For static anchors, or anchors with different data
+     * dependencies, [updateAnchors] is safe to be called from side effects or layout.
      *
      * @param newAnchors The new anchors.
      * @param newTarget The new target, by default the closest anchor or the current target if there
-     * are no anchors.
+     *   are no anchors.
      */
     fun updateAnchors(
         newAnchors: DraggableAnchors<T>,
-        newTarget: T = if (!offset.isNaN()) {
-            newAnchors.closestAnchor(offset) ?: targetValue
-        } else targetValue
+        newTarget: T =
+            if (!offset.isNaN()) {
+                newAnchors.closestAnchor(offset) ?: targetValue
+            } else targetValue
     ) {
         if (anchors != newAnchors) {
             anchors = newAnchors
@@ -709,18 +702,19 @@
      * [velocityThreshold], the [positionalThreshold] will <b>not</b> be considered and the next
      * anchor in the direction indicated by the sign of the [velocity] will be the target.
      *
-     * Based on the [velocity], either [snapAnimationSpec] or [decayAnimationSpec] will be used
-     * to animate towards the target.
+     * Based on the [velocity], either [snapAnimationSpec] or [decayAnimationSpec] will be used to
+     * animate towards the target.
      *
      * @return The velocity consumed in the animation
      */
     suspend fun settle(velocity: Float): Float {
         val previousValue = this.currentValue
-        val targetValue = computeTarget(
-            offset = requireOffset(),
-            currentValue = previousValue,
-            velocity = velocity
-        )
+        val targetValue =
+            computeTarget(
+                offset = requireOffset(),
+                currentValue = previousValue,
+                velocity = velocity
+            )
         return if (confirmValueChange(targetValue)) {
             animateToWithDecay(targetValue, velocity)
         } else {
@@ -729,11 +723,7 @@
         }
     }
 
-    private fun computeTarget(
-        offset: Float,
-        currentValue: T,
-        velocity: Float
-    ): T {
+    private fun computeTarget(offset: Float, currentValue: T, velocity: Float): T {
         val currentAnchors = anchors
         val currentAnchorPosition = currentAnchors.positionOf(currentValue)
         val velocityThresholdPx = velocityThreshold()
@@ -741,16 +731,10 @@
             currentValue
         } else {
             if (abs(velocity) >= abs(velocityThresholdPx)) {
-                currentAnchors.closestAnchor(
-                    offset,
-                    sign(velocity) > 0
-                )!!
+                currentAnchors.closestAnchor(offset, sign(velocity) > 0)!!
             } else {
                 val neighborAnchor =
-                    currentAnchors.closestAnchor(
-                        offset,
-                        offset - currentAnchorPosition > 0
-                    )!!
+                    currentAnchors.closestAnchor(offset, offset - currentAnchorPosition > 0)!!
                 val neighborAnchorPosition = currentAnchors.positionOf(neighborAnchor)
                 val distance = abs(currentAnchorPosition - neighborAnchorPosition)
                 val relativeThreshold = abs(positionalThreshold(distance))
@@ -760,62 +744,64 @@
         }
     }
 
-    private val anchoredDragScope = object : AnchoredDragScope {
-        var leftBound: T? = null
-        var rightBound: T? = null
-        var distance = Float.NaN
+    private val anchoredDragScope =
+        object : AnchoredDragScope {
+            var leftBound: T? = null
+            var rightBound: T? = null
+            var distance = Float.NaN
 
-        override fun dragTo(newOffset: Float, lastKnownVelocity: Float) {
-            val previousOffset = offset
-            offset = newOffset
-            lastVelocity = lastKnownVelocity
-            if (previousOffset.isNaN()) return
-            val isMovingForward = newOffset >= previousOffset
-            updateIfNeeded(isMovingForward)
-        }
+            override fun dragTo(newOffset: Float, lastKnownVelocity: Float) {
+                val previousOffset = offset
+                offset = newOffset
+                lastVelocity = lastKnownVelocity
+                if (previousOffset.isNaN()) return
+                val isMovingForward = newOffset >= previousOffset
+                updateIfNeeded(isMovingForward)
+            }
 
-        fun updateIfNeeded(isMovingForward: Boolean) {
-            updateBounds(isMovingForward)
-            val distanceToCurrentAnchor = abs(offset - anchors.positionOf(currentValue))
-            val crossedThreshold = distanceToCurrentAnchor >= distance / 2f
-            if (crossedThreshold) {
-                val closestAnchor = (if (isMovingForward) rightBound else leftBound) ?: currentValue
-                if (confirmValueChange(closestAnchor)) {
-                    currentValue = closestAnchor
+            fun updateIfNeeded(isMovingForward: Boolean) {
+                updateBounds(isMovingForward)
+                val distanceToCurrentAnchor = abs(offset - anchors.positionOf(currentValue))
+                val crossedThreshold = distanceToCurrentAnchor >= distance / 2f
+                if (crossedThreshold) {
+                    val closestAnchor =
+                        (if (isMovingForward) rightBound else leftBound) ?: currentValue
+                    if (confirmValueChange(closestAnchor)) {
+                        currentValue = closestAnchor
+                    }
                 }
             }
-        }
 
-        fun updateBounds(isMovingForward: Boolean) {
-            val currentAnchorPosition = anchors.positionOf(currentValue)
-            if (offset == currentAnchorPosition) {
-                val searchStartPosition = offset + (if (isMovingForward) 1f else -1f)
-                val closestExcludingCurrent =
-                    anchors.closestAnchor(searchStartPosition, isMovingForward) ?: currentValue
-                if (isMovingForward) {
-                    leftBound = currentValue
-                    rightBound = closestExcludingCurrent
+            fun updateBounds(isMovingForward: Boolean) {
+                val currentAnchorPosition = anchors.positionOf(currentValue)
+                if (offset == currentAnchorPosition) {
+                    val searchStartPosition = offset + (if (isMovingForward) 1f else -1f)
+                    val closestExcludingCurrent =
+                        anchors.closestAnchor(searchStartPosition, isMovingForward) ?: currentValue
+                    if (isMovingForward) {
+                        leftBound = currentValue
+                        rightBound = closestExcludingCurrent
+                    } else {
+                        leftBound = closestExcludingCurrent
+                        rightBound = currentValue
+                    }
                 } else {
-                    leftBound = closestExcludingCurrent
-                    rightBound = currentValue
+                    val closestLeft = anchors.closestAnchor(offset, false) ?: currentValue
+                    val closestRight = anchors.closestAnchor(offset, true) ?: currentValue
+                    leftBound = closestLeft
+                    rightBound = closestRight
                 }
-            } else {
-                val closestLeft = anchors.closestAnchor(offset, false) ?: currentValue
-                val closestRight = anchors.closestAnchor(offset, true) ?: currentValue
-                leftBound = closestLeft
-                rightBound = closestRight
+                distance = abs(anchors.positionOf(leftBound!!) - anchors.positionOf(rightBound!!))
             }
-            distance = abs(anchors.positionOf(leftBound!!) - anchors.positionOf(rightBound!!))
         }
-    }
 
     /**
      * Call this function to take control of drag logic and perform anchored drag with the latest
      * anchors.
      *
      * All actions that change the [offset] of this [AnchoredDraggableState] must be performed
-     * within an [anchoredDrag] block (even if they don't call any other methods on this object)
-     * in order to guarantee that mutual exclusion is enforced.
+     * within an [anchoredDrag] block (even if they don't call any other methods on this object) in
+     * order to guarantee that mutual exclusion is enforced.
      *
      * If [anchoredDrag] is called from elsewhere with the [dragPriority] higher or equal to ongoing
      * drag, the ongoing drag will be cancelled.
@@ -852,8 +838,8 @@
      * anchors and target.
      *
      * All actions that change the [offset] of this [AnchoredDraggableState] must be performed
-     * within an [anchoredDrag] block (even if they don't call any other methods on this object)
-     * in order to guarantee that mutual exclusion is enforced.
+     * within an [anchoredDrag] block (even if they don't call any other methods on this object) in
+     * order to guarantee that mutual exclusion is enforced.
      *
      * This overload allows the caller to hint the target value that this [anchoredDrag] is intended
      * to arrive to. This will set [AnchoredDraggableState.targetValue] to provided value so
@@ -879,9 +865,8 @@
             try {
                 dragMutex.mutate(dragPriority) {
                     dragTarget = targetValue
-                    restartable(
-                        inputs = { anchors to this@AnchoredDraggableState.targetValue }
-                    ) { (anchors, latestTarget) ->
+                    restartable(inputs = { anchors to this@AnchoredDraggableState.targetValue }) {
+                        (anchors, latestTarget) ->
                         anchoredDragScope.block(anchors, latestTarget)
                     }
                     if (confirmValueChange(targetValue)) {
@@ -903,8 +888,10 @@
     }
 
     internal fun newOffsetForDelta(delta: Float) =
-        ((if (offset.isNaN()) 0f else offset) + delta)
-            .coerceIn(anchors.minAnchor(), anchors.maxAnchor())
+        ((if (offset.isNaN()) 0f else offset) + delta).coerceIn(
+            anchors.minAnchor(),
+            anchors.maxAnchor()
+        )
 
     /**
      * Drag by the [delta], coerce it in the bounds and dispatch it to the [AnchoredDraggableState].
@@ -925,22 +912,21 @@
      *
      * @return true if the synchronous snap was successful, or false if we couldn't snap synchronous
      */
-    private fun trySnapTo(targetValue: T): Boolean = dragMutex.tryMutate {
-        with(anchoredDragScope) {
-            val targetOffset = anchors.positionOf(targetValue)
-            if (!targetOffset.isNaN()) {
-                dragTo(targetOffset)
-                dragTarget = null
+    private fun trySnapTo(targetValue: T): Boolean =
+        dragMutex.tryMutate {
+            with(anchoredDragScope) {
+                val targetOffset = anchors.positionOf(targetValue)
+                if (!targetOffset.isNaN()) {
+                    dragTo(targetOffset)
+                    dragTarget = null
+                }
+                currentValue = targetValue
+                settledValue = targetValue
             }
-            currentValue = targetValue
-            settledValue = targetValue
         }
-    }
 
     companion object {
-        /**
-         * The default [Saver] implementation for [AnchoredDraggableState].
-         */
+        /** The default [Saver] implementation for [AnchoredDraggableState]. */
         @ExperimentalFoundationApi
         fun <T : Any> Saver(
             snapAnimationSpec: AnimationSpec<Float>,
@@ -948,31 +934,31 @@
             positionalThreshold: (distance: Float) -> Float,
             velocityThreshold: () -> Float,
             confirmValueChange: (T) -> Boolean = { true },
-        ) = Saver<AnchoredDraggableState<T>, T>(
-            save = { it.currentValue },
-            restore = {
-                AnchoredDraggableState(
-                    initialValue = it,
-                    snapAnimationSpec = snapAnimationSpec,
-                    decayAnimationSpec = decayAnimationSpec,
-                    confirmValueChange = confirmValueChange,
-                    positionalThreshold = positionalThreshold,
-                    velocityThreshold = velocityThreshold
-                )
-            }
-        )
+        ) =
+            Saver<AnchoredDraggableState<T>, T>(
+                save = { it.currentValue },
+                restore = {
+                    AnchoredDraggableState(
+                        initialValue = it,
+                        snapAnimationSpec = snapAnimationSpec,
+                        decayAnimationSpec = decayAnimationSpec,
+                        confirmValueChange = confirmValueChange,
+                        positionalThreshold = positionalThreshold,
+                        velocityThreshold = velocityThreshold
+                    )
+                }
+            )
     }
 }
 
 /**
- * Snap to a [targetValue] without any animation.
- * If the [targetValue] is not in the set of anchors, the [AnchoredDraggableState.currentValue] will
- * be updated to the [targetValue] without updating the offset.
- *
- * @throws CancellationException if the interaction interrupted by another interaction like a
- * gesture interaction or another programmatic interaction like a [animateTo] or [snapTo] call.
+ * Snap to a [targetValue] without any animation. If the [targetValue] is not in the set of anchors,
+ * the [AnchoredDraggableState.currentValue] will be updated to the [targetValue] without updating
+ * the offset.
  *
  * @param targetValue The target value of the animation
+ * @throws CancellationException if the interaction interrupted by another interaction like a
+ *   gesture interaction or another programmatic interaction like a [animateTo] or [snapTo] call.
  */
 @ExperimentalFoundationApi
 suspend fun <T> AnchoredDraggableState<T>.snapTo(targetValue: T) {
@@ -1007,14 +993,13 @@
 }
 
 /**
- * Animate to a [targetValue].
- * If the [targetValue] is not in the set of anchors, the [AnchoredDraggableState.currentValue] will
- * be updated to the [targetValue] without updating the offset.
- *
- * @throws CancellationException if the interaction interrupted by another interaction like a
- * gesture interaction or another programmatic interaction like a [animateTo] or [snapTo] call.
+ * Animate to a [targetValue]. If the [targetValue] is not in the set of anchors, the
+ * [AnchoredDraggableState.currentValue] will be updated to the [targetValue] without updating the
+ * offset.
  *
  * @param targetValue The target value of the animation
+ * @throws CancellationException if the interaction interrupted by another interaction like a
+ *   gesture interaction or another programmatic interaction like a [animateTo] or [snapTo] call.
  */
 @ExperimentalFoundationApi
 suspend fun <T> AnchoredDraggableState<T>.animateTo(targetValue: T) {
@@ -1026,19 +1011,17 @@
 /**
  * Attempt to animate using decay Animation to a [targetValue]. If the [velocity] is high enough to
  * get to the target offset, we'll use [AnchoredDraggableState.decayAnimationSpec] to get to that
- * offset and return the consumed velocity. If the [velocity] is not high
- * enough, we'll use [AnchoredDraggableState.snapAnimationSpec] to reach the target offset.
+ * offset and return the consumed velocity. If the [velocity] is not high enough, we'll use
+ * [AnchoredDraggableState.snapAnimationSpec] to reach the target offset.
  *
  * If the [targetValue] is not in the set of anchors, [AnchoredDraggableState.currentValue] will be
  * updated ro the [targetValue] without updating the offset.
  *
- * @throws CancellationException if the interaction interrupted bt another interaction like a
- * gesture interaction or another programmatic interaction like [animateTo] or [snapTo] call.
- *
  * @param targetValue The target value of the animation
  * @param velocity The velocity the animation should start with
- *
  * @return The velocity consumed in the animation
+ * @throws CancellationException if the interaction interrupted bt another interaction like a
+ *   gesture interaction or another programmatic interaction like [animateTo] or [snapTo] call.
  */
 @ExperimentalFoundationApi
 suspend fun <T> AnchoredDraggableState<T>.animateToWithDecay(
@@ -1053,7 +1036,8 @@
             if (prev != targetOffset) {
                 // If targetOffset is not in the same direction as the direction of the drag (sign
                 // of the velocity) we fall back to using target animation.
-                // If the component is at the target offset already, we use decay animation that will
+                // If the component is at the target offset already, we use decay animation that
+                // will
                 // not consume any velocity.
                 if (velocity * (targetOffset - prev) < 0f || velocity == 0f) {
                     animateTo(velocity, this, anchors, latestTarget)
@@ -1066,28 +1050,27 @@
                             "targetOffset = $targetOffset\tprojectedOffset = $projectedDecayOffset"
                     }
 
-                    val canDecayToTarget = if (velocity > 0) {
-                        projectedDecayOffset >= targetOffset
-                    } else {
-                        projectedDecayOffset <= targetOffset
-                    }
+                    val canDecayToTarget =
+                        if (velocity > 0) {
+                            projectedDecayOffset >= targetOffset
+                        } else {
+                            projectedDecayOffset <= targetOffset
+                        }
                     if (canDecayToTarget) {
                         debugLog { "Decay animation is used" }
-                        AnimationState(prev, velocity)
-                            .animateDecay(decayAnimationSpec) {
-                                if (abs(value) >= abs(targetOffset)) {
-                                    val finalValue = value.coerceToTarget(targetOffset)
-                                    dragTo(finalValue, this.velocity)
-                                    remainingVelocity =
-                                        if (this.velocity.isNaN()) 0f else this.velocity
-                                    prev = finalValue
-                                    cancelAnimation()
-                                } else {
-                                    dragTo(value, this.velocity)
-                                    remainingVelocity = this.velocity
-                                    prev = value
-                                }
+                        AnimationState(prev, velocity).animateDecay(decayAnimationSpec) {
+                            if (abs(value) >= abs(targetOffset)) {
+                                val finalValue = value.coerceToTarget(targetOffset)
+                                dragTo(finalValue, this.velocity)
+                                remainingVelocity = if (this.velocity.isNaN()) 0f else this.velocity
+                                prev = finalValue
+                                cancelAnimation()
+                            } else {
+                                dragTo(value, this.velocity)
+                                remainingVelocity = this.velocity
+                                prev = value
                             }
+                        }
                     } else {
                         animateTo(velocity, this, anchors, latestTarget)
                         remainingVelocity = 0f
@@ -1115,17 +1098,17 @@
     try {
         coroutineScope {
             var previousDrag: Job? = null
-            snapshotFlow(inputs)
-                .collect { latestInputs ->
-                    previousDrag?.apply {
-                        cancel(AnchoredDragFinishedSignal())
-                        join()
-                    }
-                    previousDrag = launch(start = CoroutineStart.UNDISPATCHED) {
+            snapshotFlow(inputs).collect { latestInputs ->
+                previousDrag?.apply {
+                    cancel(AnchoredDragFinishedSignal())
+                    join()
+                }
+                previousDrag =
+                    launch(start = CoroutineStart.UNDISPATCHED) {
                         block(latestInputs)
                         this@coroutineScope.cancel(AnchoredDragFinishedSignal())
                     }
-                }
+            }
         }
     } catch (anchoredDragFinished: AnchoredDragFinishedSignal) {
         // Ignored
@@ -1154,10 +1137,7 @@
         return minAnchor
     }
 
-    override fun closestAnchor(
-        position: Float,
-        searchUpwards: Boolean
-    ): T? {
+    override fun closestAnchor(position: Float, searchUpwards: Boolean): T? {
         var minAnchor: T? = null
         var minDistance = Float.POSITIVE_INFINITY
         anchors.forEach { anchor, anchorPosition ->
@@ -1217,6 +1197,7 @@
 }
 
 private const val DEBUG = false
+
 private inline fun debugLog(generateMsg: () -> String) {
     if (DEBUG) {
         println("AnchoredDraggable: ${generateMsg()}")
diff --git a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/gestures/BringIntoViewRequestPriorityQueue.kt b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/gestures/BringIntoViewRequestPriorityQueue.kt
index 10e700c..fb8247b 100644
--- a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/gestures/BringIntoViewRequestPriorityQueue.kt
+++ b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/gestures/BringIntoViewRequestPriorityQueue.kt
@@ -28,46 +28,45 @@
  * Ongoing requests from [ContentInViewNode.bringChildIntoView], with the invariant that it is
  * always sorted by overlapping order: each item's bounds completely overlaps the next item.
  *
- * Requests are enqueued by calling [enqueue], which inserts the request at the correct position
- * and cancels and removes any requests that it interrupts. When a request is enqueued, its
- * continuation has a completion handler set that will remove the request from the queue when
- * it's cancelled.
+ * Requests are enqueued by calling [enqueue], which inserts the request at the correct position and
+ * cancels and removes any requests that it interrupts. When a request is enqueued, its continuation
+ * has a completion handler set that will remove the request from the queue when it's cancelled.
  *
- * One a request has been enqueued, it cannot be removed without completing the continuation.
- * This helps prevent leaking requests. Requests are removed in two ways:
- *  1. By an [enqueue] call for a request that doesn't overlap them, or
- *  2. By calling [cancelAndRemoveAll], which does exactly what it says.
+ * One a request has been enqueued, it cannot be removed without completing the continuation. This
+ * helps prevent leaking requests. Requests are removed in two ways:
+ * 1. By an [enqueue] call for a request that doesn't overlap them, or
+ * 2. By calling [cancelAndRemoveAll], which does exactly what it says.
  */
 @OptIn(ExperimentalContracts::class)
 internal class BringIntoViewRequestPriorityQueue {
     private val requests = mutableVectorOf<Request>()
 
-    val size: Int get() = requests.size
+    val size: Int
+        get() = requests.size
 
     fun isEmpty(): Boolean = requests.isEmpty()
 
     /**
      * Adds [request] to the queue, enforcing the invariants of that list:
-     *  - It will be inserted in the correct position to preserve sorted order.
-     *  - Any requests not contains by or containing this request will be evicted.
+     * - It will be inserted in the correct position to preserve sorted order.
+     * - Any requests not contains by or containing this request will be evicted.
      *
-     * After this function is called, [request] will always be either resumed or cancelled
-     * before it's removed from the queue, so the caller no longer needs to worry about
-     * completing it.
+     * After this function is called, [request] will always be either resumed or cancelled before
+     * it's removed from the queue, so the caller no longer needs to worry about completing it.
      *
-     *  @return True if the request was enqueued, false if it was not, e.g. because the rect
-     *  function returned null.
+     * @return True if the request was enqueued, false if it was not, e.g. because the rect function
+     *   returned null.
      */
     fun enqueue(request: Request): Boolean {
-        val requestBounds = request.currentBounds() ?: run {
-            request.continuation.resume(Unit)
-            return false
-        }
+        val requestBounds =
+            request.currentBounds()
+                ?: run {
+                    request.continuation.resume(Unit)
+                    return false
+                }
 
         // If the request is cancelled for any reason, remove it from the queue.
-        request.continuation.invokeOnCancellation {
-            requests.remove(request)
-        }
+        request.continuation.invokeOnCancellation { requests.remove(request) }
 
         for (i in requests.indices.reversed()) {
             val r = requests[i]
@@ -81,9 +80,10 @@
                 // The new request and the current item do not fully overlap, so cancel the
                 // current item and all requests after it, remove them, then continue the
                 // search to the next-largest request.
-                val cause = CancellationException(
-                    "bringIntoView call interrupted by a newer, non-overlapping call"
-                )
+                val cause =
+                    CancellationException(
+                        "bringIntoView call interrupted by a newer, non-overlapping call"
+                    )
                 for (j in requests.size - 1..i) {
                     // This mutates the list while iterating, but since we're iterating
                     // backwards in both cases, it's fine.
@@ -129,9 +129,7 @@
         // The continuation completion handler will remove the request from the queue when it's
         // cancelled, so we need to make a copy of the list before iterating to avoid concurrent
         // mutation.
-        requests.map { it.continuation }.forEach {
-            it.cancel(cause)
-        }
+        requests.map { it.continuation }.forEach { it.cancel(cause) }
         check(requests.isEmpty()) { "uncancelled requests present" }
     }
 }
diff --git a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/gestures/BringIntoViewSpec.kt b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/gestures/BringIntoViewSpec.kt
index 6597b5b..84ae573 100644
--- a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/gestures/BringIntoViewSpec.kt
+++ b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/gestures/BringIntoViewSpec.kt
@@ -39,6 +39,7 @@
  * Note: API shape and naming are still being refined, therefore API is marked as experimental.
  *
  * Check the following sample for a use case usage of this API:
+ *
  * @sample androidx.compose.foundation.samples.FocusScrollingInLazyRowSample
  */
 @ExperimentalFoundationApi
@@ -50,27 +51,24 @@
      */
     @Deprecated("Animation spec customization is no longer supported.")
     @get:Deprecated("Animation spec customization is no longer supported.")
-    val scrollAnimationSpec: AnimationSpec<Float> get() = DefaultScrollAnimationSpec
+    val scrollAnimationSpec: AnimationSpec<Float>
+        get() = DefaultScrollAnimationSpec
 
     /**
-     * Calculate the offset needed to bring one of the scrollable container's child into view.
-     * This will be called for every frame of the scrolling animation. This means that, as the
-     * animation progresses, the offset will naturally change to fulfill the scroll request.
+     * Calculate the offset needed to bring one of the scrollable container's child into view. This
+     * will be called for every frame of the scrolling animation. This means that, as the animation
+     * progresses, the offset will naturally change to fulfill the scroll request.
      *
      * All distances below are represented in pixels.
+     *
      * @param offset from the side closest to the start of the container.
      * @param size is the child size.
      * @param containerSize Is the main axis size of the scrollable container.
-     *
-     * @return The necessary amount to scroll to satisfy the bring into view request.
-     * Returning zero from here means that the request was satisfied and the scrolling animation
-     * should stop.
+     * @return The necessary amount to scroll to satisfy the bring into view request. Returning zero
+     *   from here means that the request was satisfied and the scrolling animation should stop.
      */
-    fun calculateScrollDistance(
-        offset: Float,
-        size: Float,
-        containerSize: Float
-    ): Float = defaultCalculateScrollDistance(offset, size, containerSize)
+    fun calculateScrollDistance(offset: Float, size: Float, containerSize: Float): Float =
+        defaultCalculateScrollDistance(offset, size, containerSize)
 
     companion object {
 
@@ -96,7 +94,8 @@
                 // If the item is visible but larger than the parent, we don't scroll.
                 leadingEdge < 0 && trailingEdge > containerSize -> 0f
 
-                // Find the minimum scroll needed to make one of the edges coincide with the parent's
+                // Find the minimum scroll needed to make one of the edges coincide with the
+                // parent's
                 // edge.
                 abs(leadingEdge) < abs(trailingEdge - containerSize) -> leadingEdge
                 else -> trailingEdge - containerSize
diff --git a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/gestures/ContentInViewNode.kt b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/gestures/ContentInViewNode.kt
index 3221f77..e1cd608 100644
--- a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/gestures/ContentInViewNode.kt
+++ b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/gestures/ContentInViewNode.kt
@@ -52,16 +52,13 @@
 private const val DEBUG = false
 private const val TAG = "ContentInViewModifier"
 
-/**
- * A minimum amount of delta that it is considered a valid scroll.
- */
+/** A minimum amount of delta that it is considered a valid scroll. */
 private const val MinScrollThreshold = 0.5f
 
 /**
  * A [Modifier] to be placed on a scrollable container (i.e. [Modifier.scrollable]) that animates
  * the [ScrollableState] to handle [BringIntoViewRequester] requests and keep the currently-focused
  * child in view when the viewport shrinks.
- *
  */
 // TODO(b/242732126) Make this logic reusable for TV's mario scrolling implementation.
 @OptIn(ExperimentalFoundationApi::class)
@@ -70,7 +67,10 @@
     private val scrollingLogic: ScrollingLogic,
     private var reverseDirection: Boolean,
     private var bringIntoViewSpec: BringIntoViewSpec?
-) : Modifier.Node(), BringIntoViewResponder, LayoutAwareModifierNode,
+) :
+    Modifier.Node(),
+    BringIntoViewResponder,
+    LayoutAwareModifierNode,
     CompositionLocalConsumerModifierNode {
 
     override val shouldAutoInvalidate: Boolean = false
@@ -79,14 +79,14 @@
      * Ongoing requests from [bringChildIntoView], with the invariant that it is always sorted by
      * overlapping order: each item's [Rect] completely overlaps the next item.
      *
-     * May contain requests whose bounds are too big to fit in the current viewport. This is for
-     * a few reasons:
-     *  1. The viewport may shrink after a request was enqueued, causing a request that fit at the
-     *     time it was enqueued to no longer fit.
-     *  2. The size of the bounds of a request may change after it's added, causing it to grow
-     *     larger than the viewport.
-     *  3. Having complete information about too-big requests allows us to make the right decision
-     *     about what part of the request to bring into view when smaller requests are also present.
+     * May contain requests whose bounds are too big to fit in the current viewport. This is for a
+     * few reasons:
+     * 1. The viewport may shrink after a request was enqueued, causing a request that fit at the
+     *    time it was enqueued to no longer fit.
+     * 2. The size of the bounds of a request may change after it's added, causing it to grow larger
+     *    than the viewport.
+     * 3. Having complete information about too-big requests allows us to make the right decision
+     *    about what part of the request to bring into view when smaller requests are also present.
      */
     private val bringIntoViewRequests = BringIntoViewRequestPriorityQueue()
 
@@ -154,18 +154,22 @@
         getFocusedChildBounds()?.let { focusedChild ->
             if (DEBUG) println("[$TAG] focused child bounds: $focusedChild")
             val previousFocusedChildBounds = focusedChildBoundsFromPreviousRemeasure ?: focusedChild
-            if (!isAnimationRunning && !trackingFocusedChild &&
-                // Resize caused it to go from being fully visible to at least partially
-                // clipped. Need to use the lastFocusedChildBounds to compare with the old size
-                // only to handle the case where scrolling direction is reversed: in that case, when
-                // the child first goes out-of-bounds, it will be out of bounds regardless of which
-                // size we pass in, so the only way to detect the change is to use the previous
-                // bounds.
-                previousFocusedChildBounds.isMaxVisible(oldSize) && !focusedChild.isMaxVisible(size)
+            if (
+                !isAnimationRunning &&
+                    !trackingFocusedChild &&
+                    // Resize caused it to go from being fully visible to at least partially
+                    // clipped. Need to use the lastFocusedChildBounds to compare with the old size
+                    // only to handle the case where scrolling direction is reversed: in that case,
+                    // when
+                    // the child first goes out-of-bounds, it will be out of bounds regardless of
+                    // which
+                    // size we pass in, so the only way to detect the change is to use the previous
+                    // bounds.
+                    previousFocusedChildBounds.isMaxVisible(oldSize) &&
+                    !focusedChild.isMaxVisible(size)
             ) {
-                if (DEBUG) println(
-                    "[$TAG] focused child was clipped by viewport shrink: $focusedChild"
-                )
+                if (DEBUG)
+                    println("[$TAG] focused child was clipped by viewport shrink: $focusedChild")
                 trackingFocusedChild = true
                 launchAnimation()
             }
@@ -195,9 +199,10 @@
                 isAnimationRunning = true
                 scrollingLogic.scroll(scrollPriority = MutatePriority.Default) {
                     animationState.value = calculateScrollDelta(bringIntoViewSpec)
-                    if (DEBUG) println(
-                        "[$TAG] Starting scroll animation down from ${animationState.value}…"
-                    )
+                    if (DEBUG)
+                        println(
+                            "[$TAG] Starting scroll animation down from ${animationState.value}…"
+                        )
                     animationState.animateToZero(
                         // This lambda will be invoked on every frame, during the choreographer
                         // callback.
@@ -206,17 +211,22 @@
                             // (vertical|horizontal)Scroll modifiers.
                             val scrollMultiplier = if (reverseDirection) 1f else -1f
                             val adjustedDelta = scrollMultiplier * delta
-                            if (DEBUG) println(
-                                "[$TAG] Scroll target changed by Δ$delta to " +
-                                    "${animationState.value}, scrolling by $adjustedDelta " +
-                                    "(reverseDirection=$reverseDirection)"
-                            )
-                            val consumedScroll = with(scrollingLogic) {
-                                scrollMultiplier * scrollBy(
-                                    offset = adjustedDelta.toOffset().reverseIfNeeded(),
-                                    source = NestedScrollSource.UserInput
-                                ).reverseIfNeeded().toFloat()
-                            }
+                            if (DEBUG)
+                                println(
+                                    "[$TAG] Scroll target changed by Δ$delta to " +
+                                        "${animationState.value}, scrolling by $adjustedDelta " +
+                                        "(reverseDirection=$reverseDirection)"
+                                )
+                            val consumedScroll =
+                                with(scrollingLogic) {
+                                    scrollMultiplier *
+                                        scrollBy(
+                                                offset = adjustedDelta.toOffset().reverseIfNeeded(),
+                                                source = NestedScrollSource.UserInput
+                                            )
+                                            .reverseIfNeeded()
+                                            .toFloat()
+                                }
                             if (DEBUG) println("[$TAG] Consumed $consumedScroll of scroll")
                             if (consumedScroll.absoluteValue < delta.absoluteValue) {
                                 // If the scroll state didn't consume all the scroll on this frame,
@@ -253,21 +263,20 @@
 
                             // Stop tracking any KIV requests that were satisfied by this scroll
                             // adjustment.
-                            if (trackingFocusedChild &&
-                                getFocusedChildBounds()?.isMaxVisible() == true
+                            if (
+                                trackingFocusedChild &&
+                                    getFocusedChildBounds()?.isMaxVisible() == true
                             ) {
-                                if (DEBUG) println(
-                                    "[$TAG] Completed tracking focused child request"
-                                )
+                                if (DEBUG)
+                                    println("[$TAG] Completed tracking focused child request")
                                 trackingFocusedChild = false
                             }
 
                             // Compute a new scroll target taking into account any resizes,
                             // replacements, or added/removed requests since the last frame.
                             animationState.value = calculateScrollDelta(bringIntoViewSpec)
-                            if (DEBUG) println(
-                                "[$TAG] scroll target after frame: ${animationState.value}"
-                            )
+                            if (DEBUG)
+                                println("[$TAG] scroll target after frame: ${animationState.value}")
                         }
                     )
                 }
@@ -275,10 +284,11 @@
                 // Complete any BIV requests if the animation didn't need to run, or if there were
                 // requests that were too large to satisfy. Note that if the animation was
                 // cancelled, this won't run, and the requests will be cancelled instead.
-                if (DEBUG) println(
-                    "[$TAG] animation completed successfully, resuming" +
-                        " ${bringIntoViewRequests.size} remaining BIV requests…"
-                )
+                if (DEBUG)
+                    println(
+                        "[$TAG] animation completed successfully, resuming" +
+                            " ${bringIntoViewRequests.size} remaining BIV requests…"
+                    )
                 bringIntoViewRequests.resumeAndRemoveAll()
             } catch (e: CancellationException) {
                 cancellationException = e
@@ -306,29 +316,29 @@
     private fun calculateScrollDelta(bringIntoViewSpec: BringIntoViewSpec): Float {
         if (viewportSize == IntSize.Zero) return 0f
 
-        val rectangleToMakeVisible: Rect = findBringIntoViewRequest()
-            ?: (if (trackingFocusedChild) getFocusedChildBounds() else null)
-            ?: return 0f
+        val rectangleToMakeVisible: Rect =
+            findBringIntoViewRequest()
+                ?: (if (trackingFocusedChild) getFocusedChildBounds() else null)
+                ?: return 0f
 
         val size = viewportSize.toSize()
         return when (orientation) {
-            Vertical -> bringIntoViewSpec.calculateScrollDistance(
-                rectangleToMakeVisible.top,
-                rectangleToMakeVisible.bottom - rectangleToMakeVisible.top,
-                size.height
-            )
-
-            Horizontal -> bringIntoViewSpec.calculateScrollDistance(
-                rectangleToMakeVisible.left,
-                rectangleToMakeVisible.right - rectangleToMakeVisible.left,
-                size.width
-            )
+            Vertical ->
+                bringIntoViewSpec.calculateScrollDistance(
+                    rectangleToMakeVisible.top,
+                    rectangleToMakeVisible.bottom - rectangleToMakeVisible.top,
+                    size.height
+                )
+            Horizontal ->
+                bringIntoViewSpec.calculateScrollDistance(
+                    rectangleToMakeVisible.left,
+                    rectangleToMakeVisible.right - rectangleToMakeVisible.left,
+                    size.width
+                )
         }
     }
 
-    /**
-     * Find the largest BIV request that can completely fit inside the viewport.
-     */
+    /** Find the largest BIV request that can completely fit inside the viewport. */
     private fun findBringIntoViewRequest(): Rect? {
         var rectangleToMakeVisible: Rect? = null
         bringIntoViewRequests.forEachFromSmallest { bounds ->
@@ -352,7 +362,8 @@
     /**
      * Compute the destination given the source rectangle and current bounds.
      *
-     * @param childBounds The bounding box of the item that sent the request to be brought into view.
+     * @param childBounds The bounding box of the item that sent the request to be brought into
+     *   view.
      * @return the destination rectangle.
      */
     private fun computeDestination(childBounds: Rect, containerSize: IntSize): Rect {
@@ -360,9 +371,9 @@
     }
 
     /**
-     * Returns true if this [Rect] is as visible as it can be given the [size] of the viewport.
-     * This means either it's fully visible or too big to fit in the viewport all at once and
-     * already filling the whole viewport.
+     * Returns true if this [Rect] is as visible as it can be given the [size] of the viewport. This
+     * means either it's fully visible or too big to fit in the viewport all at once and already
+     * filling the whole viewport.
      */
     private fun Rect.isMaxVisible(size: IntSize = viewportSize): Boolean {
         val relocationOffset = relocationOffset(this, size)
@@ -373,35 +384,42 @@
     private fun relocationOffset(childBounds: Rect, containerSize: IntSize): Offset {
         val size = containerSize.toSize()
         return when (orientation) {
-            Vertical -> Offset(
-                x = 0f,
-                y = requireBringIntoViewSpec().calculateScrollDistance(
-                    childBounds.top,
-                    childBounds.bottom - childBounds.top,
-                    size.height
+            Vertical ->
+                Offset(
+                    x = 0f,
+                    y =
+                        requireBringIntoViewSpec()
+                            .calculateScrollDistance(
+                                childBounds.top,
+                                childBounds.bottom - childBounds.top,
+                                size.height
+                            )
                 )
-            )
-
-            Horizontal -> Offset(
-                x = requireBringIntoViewSpec().calculateScrollDistance(
-                    childBounds.left,
-                    childBounds.right - childBounds.left,
-                    size.width
-                ),
-                y = 0f
-            )
+            Horizontal ->
+                Offset(
+                    x =
+                        requireBringIntoViewSpec()
+                            .calculateScrollDistance(
+                                childBounds.left,
+                                childBounds.right - childBounds.left,
+                                size.width
+                            ),
+                    y = 0f
+                )
         }
     }
 
-    private operator fun IntSize.compareTo(other: IntSize): Int = when (orientation) {
-        Horizontal -> width.compareTo(other.width)
-        Vertical -> height.compareTo(other.height)
-    }
+    private operator fun IntSize.compareTo(other: IntSize): Int =
+        when (orientation) {
+            Horizontal -> width.compareTo(other.width)
+            Vertical -> height.compareTo(other.height)
+        }
 
-    private operator fun Size.compareTo(other: Size): Int = when (orientation) {
-        Horizontal -> width.compareTo(other.width)
-        Vertical -> height.compareTo(other.height)
-    }
+    private operator fun Size.compareTo(other: Size): Int =
+        when (orientation) {
+            Horizontal -> width.compareTo(other.width)
+            Vertical -> height.compareTo(other.height)
+        }
 
     fun update(
         orientation: Orientation,
@@ -417,9 +435,9 @@
      * A request to bring some [Rect] in the scrollable viewport.
      *
      * @param currentBounds A function that returns the current bounds that the request wants to
-     * make visible.
+     *   make visible.
      * @param continuation The [CancellableContinuation] from the suspend function used to make the
-     * request.
+     *   request.
      */
     internal class Request(
         val currentBounds: () -> Rect?,
diff --git a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/gestures/DragGestureDetector.kt b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/gestures/DragGestureDetector.kt
index 1f00018..4b44d70 100644
--- a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/gestures/DragGestureDetector.kt
+++ b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/gestures/DragGestureDetector.kt
@@ -50,22 +50,23 @@
 import kotlinx.coroutines.CancellationException
 
 /**
- * Waits for drag motion to pass [touch slop][ViewConfiguration.touchSlop], using [pointerId] as
- * the pointer to examine. If [pointerId] is raised, another pointer from those that are down
- * will be chosen to lead the gesture, and if none are down, `null` is returned. If [pointerId]
- * is not down when [awaitTouchSlopOrCancellation] is called, then `null` is returned.
-
+ * Waits for drag motion to pass [touch slop][ViewConfiguration.touchSlop], using [pointerId] as the
+ * pointer to examine. If [pointerId] is raised, another pointer from those that are down will be
+ * chosen to lead the gesture, and if none are down, `null` is returned. If [pointerId] is not down
+ * when [awaitTouchSlopOrCancellation] is called, then `null` is returned.
+ *
  * [onTouchSlopReached] is called after [ViewConfiguration.touchSlop] motion in the any direction
  * with the change that caused the motion beyond touch slop and the [Offset] beyond touch slop that
- * has passed. [onTouchSlopReached] should consume the position change if it accepts the motion.
- * If it does, then the method returns that [PointerInputChange]. If not, touch slop detection will
+ * has passed. [onTouchSlopReached] should consume the position change if it accepts the motion. If
+ * it does, then the method returns that [PointerInputChange]. If not, touch slop detection will
  * continue.
  *
  * @return The [PointerInputChange] that was consumed in [onTouchSlopReached] or `null` if all
- * pointers are raised before touch slop is detected or another gesture consumed the position
- * change.
+ *   pointers are raised before touch slop is detected or another gesture consumed the position
+ *   change.
  *
  * Example Usage:
+ *
  * @sample androidx.compose.foundation.samples.AwaitDragOrCancellationSample
  *
  * @see awaitHorizontalTouchSlopOrCancellation
@@ -84,14 +85,15 @@
 }
 
 /**
- * Reads position change events for [pointerId] and calls [onDrag] for every change in
- * position. If [pointerId] is raised, a new pointer is chosen from those that are down and if
- * none exist, the method returns. This does not wait for touch slop.
+ * Reads position change events for [pointerId] and calls [onDrag] for every change in position. If
+ * [pointerId] is raised, a new pointer is chosen from those that are down and if none exist, the
+ * method returns. This does not wait for touch slop.
  *
- * @return `true` if the drag completed normally or `false` if the drag motion was
- * canceled by another gesture detector consuming position change events.
+ * @return `true` if the drag completed normally or `false` if the drag motion was canceled by
+ *   another gesture detector consuming position change events.
  *
  * Example Usage:
+ *
  * @sample androidx.compose.foundation.samples.DragSample
  *
  * @see awaitTouchSlopOrCancellation
@@ -117,16 +119,16 @@
 }
 
 /**
- * Reads pointer input events until a drag is detected or all pointers are up. When the  final
- * pointer is raised, the up event is returned. When a drag event is detected, the
- * drag change will be returned. Note that if [pointerId] has been raised, another pointer
- * that is down will be used, if available, so the returned [PointerInputChange.id] may
- * differ from [pointerId]. If the position change in the any direction has been
- * consumed by the [PointerEventPass.Main] pass, then the drag is considered canceled and `null`
- * is returned.  If [pointerId] is not down when [awaitDragOrCancellation] is called, then
- * `null` is returned.
+ * Reads pointer input events until a drag is detected or all pointers are up. When the final
+ * pointer is raised, the up event is returned. When a drag event is detected, the drag change will
+ * be returned. Note that if [pointerId] has been raised, another pointer that is down will be used,
+ * if available, so the returned [PointerInputChange.id] may differ from [pointerId]. If the
+ * position change in the any direction has been consumed by the [PointerEventPass.Main] pass, then
+ * the drag is considered canceled and `null` is returned. If [pointerId] is not down when
+ * [awaitDragOrCancellation] is called, then `null` is returned.
  *
  * Example Usage:
+ *
  * @sample androidx.compose.foundation.samples.AwaitDragOrCancellationSample
  *
  * @see awaitVerticalDragOrCancellation
@@ -144,10 +146,10 @@
 }
 
 /**
- * Gesture detector that waits for pointer down and touch slop in any direction and then
- * calls [onDrag] for each drag event. It follows the touch slop detection of
- * [awaitTouchSlopOrCancellation] but will consume the position change automatically
- * once the touch slop has been crossed.
+ * Gesture detector that waits for pointer down and touch slop in any direction and then calls
+ * [onDrag] for each drag event. It follows the touch slop detection of
+ * [awaitTouchSlopOrCancellation] but will consume the position change automatically once the touch
+ * slop has been crossed.
  *
  * [onDragStart] called when the touch slop has been passed and includes an [Offset] representing
  * the last known pointer position relative to the containing element. The [Offset] can be outside
@@ -159,6 +161,7 @@
  * has consumed pointer input, canceling this gesture.
  *
  * Example Usage:
+ *
  * @sample androidx.compose.foundation.samples.DetectDragGesturesSample
  *
  * @see detectVerticalDragGestures
@@ -166,59 +169,58 @@
  * @see detectDragGesturesAfterLongPress to detect gestures after long press
  */
 suspend fun PointerInputScope.detectDragGestures(
-    onDragStart: (Offset) -> Unit = { },
-    onDragEnd: () -> Unit = { },
-    onDragCancel: () -> Unit = { },
+    onDragStart: (Offset) -> Unit = {},
+    onDragEnd: () -> Unit = {},
+    onDragCancel: () -> Unit = {},
     onDrag: (change: PointerInputChange, dragAmount: Offset) -> Unit
-) = detectDragGestures(
-    onDragStart = { change, _ -> onDragStart(change.position) },
-    onDragEnd = { onDragEnd.invoke() },
-    onDragCancel = onDragCancel,
-    shouldAwaitTouchSlop = { true },
-    orientationLock = null,
-    onDrag = onDrag
-)
+) =
+    detectDragGestures(
+        onDragStart = { change, _ -> onDragStart(change.position) },
+        onDragEnd = { onDragEnd.invoke() },
+        onDragCancel = onDragCancel,
+        shouldAwaitTouchSlop = { true },
+        orientationLock = null,
+        onDrag = onDrag
+    )
 
 /**
  * A Gesture detector that waits for pointer down and touch slop in the direction specified by
- * [orientationLock] and then calls [onDrag] for each drag event.
- * It follows the touch slop detection of [awaitTouchSlopOrCancellation] but will consume the
- * position change automatically once the touch slop has been crossed, the amount of drag over
- * the touch slop is reported as the first drag event [onDrag] after the slop is crossed.
- * If [shouldAwaitTouchSlop] returns true the touch slop recognition phase will be ignored
- * and the drag gesture will be recognized immediately.The first [onDrag] in this case will report
- * an [Offset.Zero].
+ * [orientationLock] and then calls [onDrag] for each drag event. It follows the touch slop
+ * detection of [awaitTouchSlopOrCancellation] but will consume the position change automatically
+ * once the touch slop has been crossed, the amount of drag over the touch slop is reported as the
+ * first drag event [onDrag] after the slop is crossed. If [shouldAwaitTouchSlop] returns true the
+ * touch slop recognition phase will be ignored and the drag gesture will be recognized
+ * immediately.The first [onDrag] in this case will report an [Offset.Zero].
  *
  * [onDragStart] is called when the touch slop has been passed and includes an [Offset] representing
- * the last known pointer position relative to the containing element as well as  the initial
- * down event that triggered this gesture detection cycle. The [Offset] can be outside
- * the actual bounds of the element itself meaning the numbers can be negative or larger than the
- * element bounds if the touch target is smaller than the
- * [ViewConfiguration.minimumTouchTargetSize].
+ * the last known pointer position relative to the containing element as well as the initial down
+ * event that triggered this gesture detection cycle. The [Offset] can be outside the actual bounds
+ * of the element itself meaning the numbers can be negative or larger than the element bounds if
+ * the touch target is smaller than the [ViewConfiguration.minimumTouchTargetSize].
  *
- * [onDragEnd] is called after all pointers are up with the event change of the up event
- * and [onDragCancel] is called if another gesture has consumed pointer input,
- * canceling this gesture.
+ * [onDragEnd] is called after all pointers are up with the event change of the up event and
+ * [onDragCancel] is called if another gesture has consumed pointer input, canceling this gesture.
  *
  * @param onDragStart A lambda to be called when the drag gesture starts, it contains information
- * about the last known [PointerInputChange] relative to the containing element and the post slop
- * delta.
+ *   about the last known [PointerInputChange] relative to the containing element and the post slop
+ *   delta.
  * @param onDragEnd A lambda to be called when the gesture ends. It contains information about the
- * up [PointerInputChange] that finished the gesture.
+ *   up [PointerInputChange] that finished the gesture.
  * @param onDragCancel A lambda to be called when the gesture is cancelled either by an error or
- * when it was consumed.
+ *   when it was consumed.
  * @param shouldAwaitTouchSlop Indicates if touch slop detection should be skipped.
  * @param orientationLock Optionally locks detection to this orientation, this means, when this is
- * provided, touch slop detection and drag event detection will be conditioned to the given
- * orientation axis. [onDrag] will still dispatch events on with information in both axis, but
- * if orientation lock is provided, only events that happen on the given orientation will be
- * considered. If no value is provided (i.e. null) touch slop and drag detection will happen on
- * an "any" orientation basis, that is, touch slop will be detected if crossed in either direction
- * and drag events will be dispatched if present in either direction.
+ *   provided, touch slop detection and drag event detection will be conditioned to the given
+ *   orientation axis. [onDrag] will still dispatch events on with information in both axis, but if
+ *   orientation lock is provided, only events that happen on the given orientation will be
+ *   considered. If no value is provided (i.e. null) touch slop and drag detection will happen on an
+ *   "any" orientation basis, that is, touch slop will be detected if crossed in either direction
+ *   and drag events will be dispatched if present in either direction.
  * @param onDrag A lambda to be called for each delta event in the gesture. It contains information
- * about the [PointerInputChange] and the movement offset.
+ *   about the [PointerInputChange] and the movement offset.
  *
  * Example Usage:
+ *
  * @sample androidx.compose.foundation.samples.DetectDragGesturesSample
  *
  * @see detectVerticalDragGestures
@@ -234,8 +236,7 @@
     onDrag: (change: PointerInputChange, dragAmount: Offset) -> Unit
 ) {
     awaitEachGesture {
-        val initialDown =
-            awaitFirstDown(requireUnconsumed = false, pass = PointerEventPass.Initial)
+        val initialDown = awaitFirstDown(requireUnconsumed = false, pass = PointerEventPass.Initial)
         val awaitTouchSlop = shouldAwaitTouchSlop()
 
         if (!awaitTouchSlop) {
@@ -248,14 +249,15 @@
 
         if (awaitTouchSlop) {
             do {
-                drag = awaitPointerSlopOrCancellation(
-                    down.id,
-                    down.type,
-                    orientation = orientationLock
-                ) { change, over ->
-                    change.consume()
-                    overSlop = over
-                }
+                drag =
+                    awaitPointerSlopOrCancellation(
+                        down.id,
+                        down.type,
+                        orientation = orientationLock
+                    ) { change, over ->
+                        change.consume()
+                        overSlop = over
+                    }
             } while (drag != null && !drag.isConsumed)
             initialDelta = overSlop
         } else {
@@ -265,16 +267,16 @@
         if (drag != null) {
             onDragStart.invoke(drag, initialDelta)
             onDrag(drag, overSlop)
-            val upEvent = drag(
-                pointerId = drag.id,
-                onDrag = {
-                    onDrag(it, it.positionChange())
-                    it.consume()
-                },
-                orientation = orientationLock,
-                motionConsumed = {
-                    it.isConsumed
-                })
+            val upEvent =
+                drag(
+                    pointerId = drag.id,
+                    onDrag = {
+                        onDrag(it, it.positionChange())
+                        it.consume()
+                    },
+                    orientation = orientationLock,
+                    motionConsumed = { it.isConsumed }
+                )
             if (upEvent == null) {
                 onDragCancel()
             } else {
@@ -288,17 +290,17 @@
  * Gesture detector that waits for pointer down and long press, after which it calls [onDrag] for
  * each drag event.
  *
- * [onDragStart] called when a long press is detected and includes an [Offset] representing
- * the last known pointer position relative to the containing element. The [Offset] can be outside
- * the actual bounds of the element itself meaning the numbers can be negative or larger than the
- * element bounds if the touch target is smaller than the
- * [ViewConfiguration.minimumTouchTargetSize].
+ * [onDragStart] called when a long press is detected and includes an [Offset] representing the last
+ * known pointer position relative to the containing element. The [Offset] can be outside the actual
+ * bounds of the element itself meaning the numbers can be negative or larger than the element
+ * bounds if the touch target is smaller than the [ViewConfiguration.minimumTouchTargetSize].
  *
  * [onDragEnd] is called after all pointers are up and [onDragCancel] is called if another gesture
  * has consumed pointer input, canceling this gesture. This function will automatically consume all
  * the position change after the long press.
  *
  * Example Usage:
+ *
  * @sample androidx.compose.foundation.samples.DetectDragWithLongPressGesturesSample
  *
  * @see detectVerticalDragGestures
@@ -306,9 +308,9 @@
  * @see detectDragGestures
  */
 suspend fun PointerInputScope.detectDragGesturesAfterLongPress(
-    onDragStart: (Offset) -> Unit = { },
-    onDragEnd: () -> Unit = { },
-    onDragCancel: () -> Unit = { },
+    onDragStart: (Offset) -> Unit = {},
+    onDragEnd: () -> Unit = {},
+    onDragCancel: () -> Unit = {},
     onDrag: (change: PointerInputChange, dragAmount: Offset) -> Unit
 ) {
     awaitEachGesture {
@@ -325,9 +327,7 @@
                     }
                 ) {
                     // consume up if we quit drag gracefully with the up
-                    currentEvent.changes.fastForEach {
-                        if (it.changedToUp()) it.consume()
-                    }
+                    currentEvent.changes.fastForEach { if (it.changedToUp()) it.consume() }
                     onDragEnd()
                 } else {
                     onDragCancel()
@@ -342,22 +342,23 @@
 
 /**
  * Waits for vertical drag motion to pass [touch slop][ViewConfiguration.touchSlop], using
- * [pointerId] as the pointer to examine. If [pointerId] is raised, another pointer from
- * those that are down will be chosen to lead the gesture, and if none are down, `null` is returned.
- * If [pointerId] is not down when [awaitVerticalTouchSlopOrCancellation] is called, then `null`
- * is returned.
+ * [pointerId] as the pointer to examine. If [pointerId] is raised, another pointer from those that
+ * are down will be chosen to lead the gesture, and if none are down, `null` is returned. If
+ * [pointerId] is not down when [awaitVerticalTouchSlopOrCancellation] is called, then `null` is
+ * returned.
  *
  * [onTouchSlopReached] is called after [ViewConfiguration.touchSlop] motion in the vertical
  * direction with the change that caused the motion beyond touch slop and the pixels beyond touch
- * slop. [onTouchSlopReached] should consume the position change if it accepts the motion.
- * If it does, then the method returns that [PointerInputChange]. If not, touch slop detection will
+ * slop. [onTouchSlopReached] should consume the position change if it accepts the motion. If it
+ * does, then the method returns that [PointerInputChange]. If not, touch slop detection will
  * continue.
  *
  * @return The [PointerInputChange] that was consumed in [onTouchSlopReached] or `null` if all
- * pointers are raised before touch slop is detected or another gesture consumed the position
- * change.
+ *   pointers are raised before touch slop is detected or another gesture consumed the position
+ *   change.
  *
  * Example Usage:
+ *
  * @sample androidx.compose.foundation.samples.AwaitVerticalDragOrCancellationSample
  *
  * @see awaitHorizontalTouchSlopOrCancellation
@@ -366,33 +367,36 @@
 suspend fun AwaitPointerEventScope.awaitVerticalTouchSlopOrCancellation(
     pointerId: PointerId,
     onTouchSlopReached: (change: PointerInputChange, overSlop: Float) -> Unit
-) = awaitPointerSlopOrCancellation(
-    pointerId = pointerId,
-    pointerType = PointerType.Touch,
-    onPointerSlopReached = { change, overSlop -> onTouchSlopReached(change, overSlop.y) },
-    orientation = Orientation.Vertical
-)
+) =
+    awaitPointerSlopOrCancellation(
+        pointerId = pointerId,
+        pointerType = PointerType.Touch,
+        onPointerSlopReached = { change, overSlop -> onTouchSlopReached(change, overSlop.y) },
+        orientation = Orientation.Vertical
+    )
 
 internal suspend fun AwaitPointerEventScope.awaitVerticalPointerSlopOrCancellation(
     pointerId: PointerId,
     pointerType: PointerType,
     onTouchSlopReached: (change: PointerInputChange, overSlop: Float) -> Unit
-) = awaitPointerSlopOrCancellation(
-    pointerId = pointerId,
-    pointerType = pointerType,
-    onPointerSlopReached = { change, overSlop -> onTouchSlopReached(change, overSlop.y) },
-    orientation = Orientation.Vertical
-)
+) =
+    awaitPointerSlopOrCancellation(
+        pointerId = pointerId,
+        pointerType = pointerType,
+        onPointerSlopReached = { change, overSlop -> onTouchSlopReached(change, overSlop.y) },
+        orientation = Orientation.Vertical
+    )
 
 /**
  * Reads vertical position change events for [pointerId] and calls [onDrag] for every change in
- * position. If [pointerId] is raised, a new pointer is chosen from those that are down and if
- * none exist, the method returns. This does not wait for touch slop
+ * position. If [pointerId] is raised, a new pointer is chosen from those that are down and if none
+ * exist, the method returns. This does not wait for touch slop
  *
- * @return `true` if the vertical drag completed normally or `false` if the drag motion was
- * canceled by another gesture detector consuming position change events.
+ * @return `true` if the vertical drag completed normally or `false` if the drag motion was canceled
+ *   by another gesture detector consuming position change events.
  *
  * Example Usage:
+ *
  * @sample androidx.compose.foundation.samples.VerticalDragSample
  *
  * @see awaitVerticalTouchSlopOrCancellation
@@ -403,24 +407,25 @@
 suspend fun AwaitPointerEventScope.verticalDrag(
     pointerId: PointerId,
     onDrag: (PointerInputChange) -> Unit
-): Boolean = drag(
-    pointerId = pointerId,
-    onDrag = onDrag,
-    orientation = Orientation.Vertical,
-    motionConsumed = { it.isConsumed }
-) != null
+): Boolean =
+    drag(
+        pointerId = pointerId,
+        onDrag = onDrag,
+        orientation = Orientation.Vertical,
+        motionConsumed = { it.isConsumed }
+    ) != null
 
 /**
  * Reads pointer input events until a vertical drag is detected or all pointers are up. When the
- * final pointer is raised, the up event is returned. When a drag event is detected, the
- * drag change will be returned. Note that if [pointerId] has been raised, another pointer
- * that is down will be used, if available, so the returned [PointerInputChange.id] may
- * differ from [pointerId]. If the position change  has been consumed by the
- * [PointerEventPass.Main] pass, then the drag is considered canceled and `null` is returned. If
- * [pointerId] is not down when [awaitVerticalDragOrCancellation] is called, then `null` is
- * returned.
+ * final pointer is raised, the up event is returned. When a drag event is detected, the drag change
+ * will be returned. Note that if [pointerId] has been raised, another pointer that is down will be
+ * used, if available, so the returned [PointerInputChange.id] may differ from [pointerId]. If the
+ * position change has been consumed by the [PointerEventPass.Main] pass, then the drag is
+ * considered canceled and `null` is returned. If [pointerId] is not down when
+ * [awaitVerticalDragOrCancellation] is called, then `null` is returned.
  *
  * Example Usage:
+ *
  * @sample androidx.compose.foundation.samples.AwaitVerticalDragOrCancellationSample
  *
  * @see awaitHorizontalDragOrCancellation
@@ -440,8 +445,8 @@
 /**
  * Gesture detector that waits for pointer down and touch slop in the vertical direction and then
  * calls [onVerticalDrag] for each vertical drag event. It follows the touch slop detection of
- * [awaitVerticalTouchSlopOrCancellation], but will consume the position change automatically
- * once the touch slop has been crossed.
+ * [awaitVerticalTouchSlopOrCancellation], but will consume the position change automatically once
+ * the touch slop has been crossed.
  *
  * [onDragStart] called when the touch slop has been passed and includes an [Offset] representing
  * the last known pointer position relative to the containing element. The [Offset] can be outside
@@ -453,28 +458,30 @@
  * has consumed pointer input, canceling this gesture.
  *
  * This gesture detector will coordinate with [detectHorizontalDragGestures] and
- * [awaitHorizontalTouchSlopOrCancellation] to ensure only vertical or horizontal dragging
- * is locked, but not both.
+ * [awaitHorizontalTouchSlopOrCancellation] to ensure only vertical or horizontal dragging is
+ * locked, but not both.
  *
  * Example Usage:
+ *
  * @sample androidx.compose.foundation.samples.DetectVerticalDragGesturesSample
  *
  * @see detectDragGestures
  * @see detectHorizontalDragGestures
  */
 suspend fun PointerInputScope.detectVerticalDragGestures(
-    onDragStart: (Offset) -> Unit = { },
-    onDragEnd: () -> Unit = { },
-    onDragCancel: () -> Unit = { },
+    onDragStart: (Offset) -> Unit = {},
+    onDragEnd: () -> Unit = {},
+    onDragCancel: () -> Unit = {},
     onVerticalDrag: (change: PointerInputChange, dragAmount: Float) -> Unit
 ) {
     awaitEachGesture {
         val down = awaitFirstDown(requireUnconsumed = false)
         var overSlop = 0f
-        val drag = awaitVerticalPointerSlopOrCancellation(down.id, down.type) { change, over ->
-            change.consume()
-            overSlop = over
-        }
+        val drag =
+            awaitVerticalPointerSlopOrCancellation(down.id, down.type) { change, over ->
+                change.consume()
+                overSlop = over
+            }
         if (drag != null) {
             onDragStart.invoke(drag.position)
             onVerticalDrag.invoke(drag, overSlop)
@@ -494,21 +501,22 @@
 
 /**
  * Waits for horizontal drag motion to pass [touch slop][ViewConfiguration.touchSlop], using
- * [pointerId] as the pointer to examine. If [pointerId] is raised, another pointer from
- * those that are down will be chosen to lead the gesture, and if none are down, `null` is returned.
-
+ * [pointerId] as the pointer to examine. If [pointerId] is raised, another pointer from those that
+ * are down will be chosen to lead the gesture, and if none are down, `null` is returned.
+ *
  * [onTouchSlopReached] is called after [ViewConfiguration.touchSlop] motion in the horizontal
  * direction with the change that caused the motion beyond touch slop and the pixels beyond touch
- * slop. [onTouchSlopReached] should consume the position change if it accepts the motion.
- * If it does, then the method returns that [PointerInputChange]. If not, touch slop detection will
+ * slop. [onTouchSlopReached] should consume the position change if it accepts the motion. If it
+ * does, then the method returns that [PointerInputChange]. If not, touch slop detection will
  * continue. If [pointerId] is not down when [awaitHorizontalTouchSlopOrCancellation] is called,
  * then `null` is returned.
  *
  * @return The [PointerInputChange] that was consumed in [onTouchSlopReached] or `null` if all
- * pointers are raised before touch slop is detected or another gesture consumed the position
- * change.
+ *   pointers are raised before touch slop is detected or another gesture consumed the position
+ *   change.
  *
  * Example Usage:
+ *
  * @sample androidx.compose.foundation.samples.AwaitHorizontalDragOrCancellationSample
  *
  * @see awaitVerticalTouchSlopOrCancellation
@@ -517,30 +525,33 @@
 suspend fun AwaitPointerEventScope.awaitHorizontalTouchSlopOrCancellation(
     pointerId: PointerId,
     onTouchSlopReached: (change: PointerInputChange, overSlop: Float) -> Unit
-) = awaitPointerSlopOrCancellation(
-    pointerId = pointerId,
-    pointerType = PointerType.Touch,
-    onPointerSlopReached = { change, overSlop -> onTouchSlopReached(change, overSlop.x) },
-    orientation = Orientation.Horizontal
-)
+) =
+    awaitPointerSlopOrCancellation(
+        pointerId = pointerId,
+        pointerType = PointerType.Touch,
+        onPointerSlopReached = { change, overSlop -> onTouchSlopReached(change, overSlop.x) },
+        orientation = Orientation.Horizontal
+    )
 
 internal suspend fun AwaitPointerEventScope.awaitHorizontalPointerSlopOrCancellation(
     pointerId: PointerId,
     pointerType: PointerType,
     onPointerSlopReached: (change: PointerInputChange, overSlop: Float) -> Unit
-) = awaitPointerSlopOrCancellation(
-    pointerId = pointerId,
-    pointerType = pointerType,
-    onPointerSlopReached = { change, overSlop -> onPointerSlopReached(change, overSlop.x) },
-    orientation = Orientation.Horizontal
-)
+) =
+    awaitPointerSlopOrCancellation(
+        pointerId = pointerId,
+        pointerType = pointerType,
+        onPointerSlopReached = { change, overSlop -> onPointerSlopReached(change, overSlop.x) },
+        orientation = Orientation.Horizontal
+    )
 
 /**
  * Reads horizontal position change events for [pointerId] and calls [onDrag] for every change in
- * position. If [pointerId] is raised, a new pointer is chosen from those that are down and if
- * none exist, the method returns. This does not wait for touch slop.
+ * position. If [pointerId] is raised, a new pointer is chosen from those that are down and if none
+ * exist, the method returns. This does not wait for touch slop.
  *
  * Example Usage:
+ *
  * @sample androidx.compose.foundation.samples.HorizontalDragSample
  *
  * @see awaitHorizontalTouchSlopOrCancellation
@@ -551,24 +562,25 @@
 suspend fun AwaitPointerEventScope.horizontalDrag(
     pointerId: PointerId,
     onDrag: (PointerInputChange) -> Unit
-): Boolean = drag(
-    pointerId = pointerId,
-    onDrag = onDrag,
-    orientation = Orientation.Horizontal,
-    motionConsumed = { it.isConsumed }
-) != null
+): Boolean =
+    drag(
+        pointerId = pointerId,
+        onDrag = onDrag,
+        orientation = Orientation.Horizontal,
+        motionConsumed = { it.isConsumed }
+    ) != null
 
 /**
  * Reads pointer input events until a horizontal drag is detected or all pointers are up. When the
- * final pointer is raised, the up event is returned. When a drag event is detected, the
- * drag change will be returned. Note that if [pointerId] has been raised, another pointer
- * that is down will be used, if available, so the returned [PointerInputChange.id] may
- * differ from [pointerId]. If the position change has been consumed by the
- * [PointerEventPass.Main] pass, then the drag is considered canceled and `null` is returned. If
- * [pointerId] is not down when [awaitHorizontalDragOrCancellation] is called, then `null` is
- * returned.
+ * final pointer is raised, the up event is returned. When a drag event is detected, the drag change
+ * will be returned. Note that if [pointerId] has been raised, another pointer that is down will be
+ * used, if available, so the returned [PointerInputChange.id] may differ from [pointerId]. If the
+ * position change has been consumed by the [PointerEventPass.Main] pass, then the drag is
+ * considered canceled and `null` is returned. If [pointerId] is not down when
+ * [awaitHorizontalDragOrCancellation] is called, then `null` is returned.
  *
  * Example Usage:
+ *
  * @sample androidx.compose.foundation.samples.AwaitHorizontalDragOrCancellationSample
  *
  * @see horizontalDrag
@@ -586,10 +598,10 @@
 }
 
 /**
- * Gesture detector that waits for pointer down and touch slop in the horizontal direction and
- * then calls [onHorizontalDrag] for each horizontal drag event. It follows the touch slop
- * detection of [awaitHorizontalTouchSlopOrCancellation], but will consume the position change
- * automatically once the touch slop has been crossed.
+ * Gesture detector that waits for pointer down and touch slop in the horizontal direction and then
+ * calls [onHorizontalDrag] for each horizontal drag event. It follows the touch slop detection of
+ * [awaitHorizontalTouchSlopOrCancellation], but will consume the position change automatically once
+ * the touch slop has been crossed.
  *
  * [onDragStart] called when the touch slop has been passed and includes an [Offset] representing
  * the last known pointer position relative to the containing element. The [Offset] can be outside
@@ -605,27 +617,26 @@
  * but not both.
  *
  * Example Usage:
+ *
  * @sample androidx.compose.foundation.samples.DetectHorizontalDragGesturesSample
  *
  * @see detectVerticalDragGestures
  * @see detectDragGestures
  */
 suspend fun PointerInputScope.detectHorizontalDragGestures(
-    onDragStart: (Offset) -> Unit = { },
-    onDragEnd: () -> Unit = { },
-    onDragCancel: () -> Unit = { },
+    onDragStart: (Offset) -> Unit = {},
+    onDragEnd: () -> Unit = {},
+    onDragCancel: () -> Unit = {},
     onHorizontalDrag: (change: PointerInputChange, dragAmount: Float) -> Unit
 ) {
     awaitEachGesture {
         val down = awaitFirstDown(requireUnconsumed = false)
         var overSlop = 0f
-        val drag = awaitHorizontalPointerSlopOrCancellation(
-            down.id,
-            down.type
-        ) { change, over ->
-            change.consume()
-            overSlop = over
-        }
+        val drag =
+            awaitHorizontalPointerSlopOrCancellation(down.id, down.type) { change, over ->
+                change.consume()
+                overSlop = over
+            }
         if (drag != null) {
             onDragStart.invoke(drag.position)
             onHorizontalDrag(drag, overSlop)
@@ -644,16 +655,15 @@
 }
 
 /**
- * Continues to read drag events until all pointers are up or the drag event is canceled.
- * The initial pointer to use for driving the drag is [pointerId]. [onDrag] is called
- * whenever the pointer moves. The up event is returned at the end of the drag gesture.
+ * Continues to read drag events until all pointers are up or the drag event is canceled. The
+ * initial pointer to use for driving the drag is [pointerId]. [onDrag] is called whenever the
+ * pointer moves. The up event is returned at the end of the drag gesture.
  *
  * @param pointerId The pointer where that is driving the gesture.
  * @param onDrag Callback for every new drag event.
  * @param motionConsumed If the PointerInputChange should be considered as consumed.
- *
- * @return The last pointer input event change when gesture ended with all pointers up
- * and null when the gesture was canceled.
+ * @return The last pointer input event change when gesture ended with all pointers up and null when
+ *   the gesture was canceled.
  */
 internal suspend inline fun AwaitPointerEventScope.drag(
     pointerId: PointerId,
@@ -666,15 +676,18 @@
     }
     var pointer = pointerId
     while (true) {
-        val change = awaitDragOrUp(pointer) {
-            val positionChange = it.positionChangeIgnoreConsumed()
-            val motionChange = if (orientation == null) {
-                positionChange.getDistance()
-            } else {
-                if (orientation == Orientation.Vertical) positionChange.y else positionChange.x
-            }
-            motionChange != 0.0f
-        } ?: return null
+        val change =
+            awaitDragOrUp(pointer) {
+                val positionChange = it.positionChangeIgnoreConsumed()
+                val motionChange =
+                    if (orientation == null) {
+                        positionChange.getDistance()
+                    } else {
+                        if (orientation == Orientation.Vertical) positionChange.y
+                        else positionChange.x
+                    }
+                motionChange != 0.0f
+            } ?: return null
 
         if (motionConsumed(change)) {
             return null
@@ -690,14 +703,13 @@
 }
 
 /**
- * Waits for a single drag in one axis, final pointer up, or all pointers are up.
- * When [pointerId] has lifted, another pointer that is down is chosen to be the finger
- * governing the drag. When the final pointer is lifted, that [PointerInputChange] is
- * returned. When a drag is detected, that [PointerInputChange] is returned. A drag is
- * only detected when [hasDragged] returns `true`.
+ * Waits for a single drag in one axis, final pointer up, or all pointers are up. When [pointerId]
+ * has lifted, another pointer that is down is chosen to be the finger governing the drag. When the
+ * final pointer is lifted, that [PointerInputChange] is returned. When a drag is detected, that
+ * [PointerInputChange] is returned. A drag is only detected when [hasDragged] returns `true`.
  *
- * `null` is returned if there was an error in the pointer input stream and the pointer
- * that was down was dropped before the 'up' was received.
+ * `null` is returned if there was an error in the pointer input stream and the pointer that was
+ * down was dropped before the 'up' was received.
  */
 private suspend inline fun AwaitPointerEventScope.awaitDragOrUp(
     pointerId: PointerId,
@@ -722,24 +734,24 @@
 }
 
 /**
- * Waits for drag motion and uses [orientation] to detect the direction of  touch slop detection.
- * It passes [pointerId] as the pointer to examine. If [pointerId] is raised, another pointer from
- * those that are down will be chosen to
- * lead the gesture, and if none are down, `null` is returned. If [pointerId] is not down when
- * [awaitPointerSlopOrCancellation] is called, then `null` is returned.
+ * Waits for drag motion and uses [orientation] to detect the direction of touch slop detection. It
+ * passes [pointerId] as the pointer to examine. If [pointerId] is raised, another pointer from
+ * those that are down will be chosen to lead the gesture, and if none are down, `null` is returned.
+ * If [pointerId] is not down when [awaitPointerSlopOrCancellation] is called, then `null` is
+ * returned.
  *
  * When pointer slop is detected, [onPointerSlopReached] is called with the change and the distance
- * beyond the pointer slop. If [onPointerSlopReached] does not consume the
- * position change, pointer slop will not have been considered detected and the detection will
- * continue or, if it is consumed, the [PointerInputChange] that was consumed will be returned.
+ * beyond the pointer slop. If [onPointerSlopReached] does not consume the position change, pointer
+ * slop will not have been considered detected and the detection will continue or, if it is
+ * consumed, the [PointerInputChange] that was consumed will be returned.
  *
  * This works with [awaitTouchSlopOrCancellation] for the other axis to ensure that only horizontal
  * or vertical dragging is done, but not both. It also works for dragging in two ways when using
  * [awaitTouchSlopOrCancellation]
  *
  * @return The [PointerInputChange] of the event that was consumed in [onPointerSlopReached] or
- * `null` if all pointers are raised or the position change was consumed by another gesture
- * detector.
+ *   `null` if all pointers are raised or the position change was consumed by another gesture
+ *   detector.
  */
 private suspend inline fun AwaitPointerEventScope.awaitPointerSlopOrCancellation(
     pointerId: PointerId,
@@ -769,10 +781,7 @@
         } else {
             val postSlopOffset = touchSlopDetector.addPointerInputChange(dragEvent, touchSlop)
             if (postSlopOffset != null) {
-                onPointerSlopReached(
-                    dragEvent,
-                    postSlopOffset
-                )
+                onPointerSlopReached(dragEvent, postSlopOffset)
                 if (dragEvent.isConsumed) {
                     return dragEvent
                 } else {
@@ -790,40 +799,36 @@
 }
 
 /**
- * Detects if touch slop has been crossed after adding a series of [PointerInputChange].
- * For every new [PointerInputChange] one should add it to this detector using
- * [addPointerInputChange]. If the position change causes the touch slop to be crossed,
- * [addPointerInputChange] will return true.
+ * Detects if touch slop has been crossed after adding a series of [PointerInputChange]. For every
+ * new [PointerInputChange] one should add it to this detector using [addPointerInputChange]. If the
+ * position change causes the touch slop to be crossed, [addPointerInputChange] will return true.
  */
 private class TouchSlopDetector(val orientation: Orientation? = null) {
 
     fun Offset.mainAxis() = if (orientation == Orientation.Horizontal) x else y
+
     fun Offset.crossAxis() = if (orientation == Orientation.Horizontal) y else x
 
-    /**
-     * The accumulation of drag deltas in this detector.
-     */
+    /** The accumulation of drag deltas in this detector. */
     private var totalPositionChange: Offset = Offset.Zero
 
     /**
-     * Adds [dragEvent] to this detector. If the accumulated position changes crosses the touch
-     * slop provided by [touchSlop], this method will return the post slop offset, that is the
-     * total accumulated delta change minus the touch slop value, otherwise this should return null.
+     * Adds [dragEvent] to this detector. If the accumulated position changes crosses the touch slop
+     * provided by [touchSlop], this method will return the post slop offset, that is the total
+     * accumulated delta change minus the touch slop value, otherwise this should return null.
      */
-    fun addPointerInputChange(
-        dragEvent: PointerInputChange,
-        touchSlop: Float
-    ): Offset? {
+    fun addPointerInputChange(dragEvent: PointerInputChange, touchSlop: Float): Offset? {
         val currentPosition = dragEvent.position
         val previousPosition = dragEvent.previousPosition
         val positionChange = currentPosition - previousPosition
         totalPositionChange += positionChange
 
-        val inDirection = if (orientation == null) {
-            totalPositionChange.getDistance()
-        } else {
-            totalPositionChange.mainAxis().absoluteValue
-        }
+        val inDirection =
+            if (orientation == null) {
+                totalPositionChange.getDistance()
+            } else {
+                totalPositionChange.mainAxis().absoluteValue
+            }
 
         val hasCrossedSlop = inDirection >= touchSlop
 
@@ -834,9 +839,7 @@
         }
     }
 
-    /**
-     * Resets the accumulator associated with this detector.
-     */
+    /** Resets the accumulator associated with this detector. */
     fun reset() {
         totalPositionChange = Offset.Zero
     }
@@ -848,8 +851,8 @@
             // update postSlopOffset
             totalPositionChange - touchSlopOffset
         } else {
-            val finalMainAxisChange = totalPositionChange.mainAxis() -
-                (sign(totalPositionChange.mainAxis()) * touchSlop)
+            val finalMainAxisChange =
+                totalPositionChange.mainAxis() - (sign(totalPositionChange.mainAxis()) * touchSlop)
             val finalCrossAxisChange = totalPositionChange.crossAxis()
             if (orientation == Orientation.Horizontal) {
                 Offset(finalMainAxisChange, finalCrossAxisChange)
@@ -863,14 +866,15 @@
 /**
  * Waits for a long press by examining [pointerId].
  *
- * If that [pointerId] is raised (that is, the user lifts their finger), but another
- * finger ([PointerId]) is down at that time, another pointer will be chosen as the lead for the
- * gesture, and if none are down, `null` is returned.
+ * If that [pointerId] is raised (that is, the user lifts their finger), but another finger
+ * ([PointerId]) is down at that time, another pointer will be chosen as the lead for the gesture,
+ * and if none are down, `null` is returned.
  *
  * @return The latest [PointerInputChange] associated with a long press or `null` if all pointers
- * are raised before a long press is detected or another gesture consumed the change.
+ *   are raised before a long press is detected or another gesture consumed the change.
  *
  * Example Usage:
+ *
  * @sample androidx.compose.foundation.samples.AwaitLongPressOrCancellationSample
  */
 suspend fun AwaitPointerEventScope.awaitLongPressOrCancellation(
@@ -880,8 +884,7 @@
         return null // The pointer has already been lifted, so the long press is cancelled.
     }
 
-    val initialDown =
-        currentEvent.changes.fastFirstOrNull { it.id == pointerId } ?: return null
+    val initialDown = currentEvent.changes.fastFirstOrNull { it.id == pointerId } ?: return null
 
     var longPress: PointerInputChange? = null
     var currentDown = initialDown
diff --git a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/gestures/Draggable.kt b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/gestures/Draggable.kt
index cea9c2f..bb458c8 100644
--- a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/gestures/Draggable.kt
+++ b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/gestures/Draggable.kt
@@ -64,12 +64,12 @@
     /**
      * Call this function to take control of drag logic.
      *
-     * All actions that change the logical drag position must be performed within a [drag]
-     * block (even if they don't call any other methods on this object) in order to guarantee
-     * that mutual exclusion is enforced.
+     * All actions that change the logical drag position must be performed within a [drag] block
+     * (even if they don't call any other methods on this object) in order to guarantee that mutual
+     * exclusion is enforced.
      *
-     * If [drag] is called from elsewhere with the [dragPriority] higher or equal to ongoing
-     * drag, ongoing drag will be canceled.
+     * If [drag] is called from elsewhere with the [dragPriority] higher or equal to ongoing drag,
+     * ongoing drag will be canceled.
      *
      * @param dragPriority of the drag operation
      * @param block to perform drag in
@@ -82,27 +82,23 @@
     /**
      * Dispatch drag delta in pixels avoiding all drag related priority mechanisms.
      *
-     * **NOTE:** unlike [drag], dispatching any delta with this method will bypass scrolling of
-     * any priority. This method will also ignore `reverseDirection` and other parameters set in
+     * **NOTE:** unlike [drag], dispatching any delta with this method will bypass scrolling of any
+     * priority. This method will also ignore `reverseDirection` and other parameters set in
      * [draggable].
      *
      * This method is used internally for low level operations, allowing implementers of
      * [DraggableState] influence the consumption as suits them, e.g. introduce nested scrolling.
-     * Manually dispatching delta via this method will likely result in a bad user experience,
-     * you must prefer [drag] method over this one.
+     * Manually dispatching delta via this method will likely result in a bad user experience, you
+     * must prefer [drag] method over this one.
      *
      * @param delta amount of scroll dispatched in the nested drag process
      */
     fun dispatchRawDelta(delta: Float)
 }
 
-/**
- * Scope used for suspending drag blocks
- */
+/** Scope used for suspending drag blocks */
 interface DragScope {
-    /**
-     * Attempts to drag by [pixels] px.
-     */
+    /** Attempts to drag by [pixels] px. */
     fun dragBy(pixels: Float)
 }
 
@@ -111,25 +107,22 @@
  * will be invoked when the drag occurs.
  *
  * This is the simplest way to set up a [draggable] modifier. When constructing this
- * [DraggableState], you must provide a [onDelta] lambda, which will be invoked whenever
- * drag happens (by gesture input or a custom [DraggableState.drag] call) with the delta in
- * pixels.
+ * [DraggableState], you must provide a [onDelta] lambda, which will be invoked whenever drag
+ * happens (by gesture input or a custom [DraggableState.drag] call) with the delta in pixels.
  *
  * If you are creating [DraggableState] in composition, consider using [rememberDraggableState].
  *
  * @param onDelta callback invoked when drag occurs. The callback receives the delta in pixels.
  */
-fun DraggableState(onDelta: (Float) -> Unit): DraggableState =
-    DefaultDraggableState(onDelta)
+fun DraggableState(onDelta: (Float) -> Unit): DraggableState = DefaultDraggableState(onDelta)
 
 /**
  * Create and remember default implementation of [DraggableState] interface that allows to pass a
  * simple action that will be invoked when the drag occurs.
  *
  * This is the simplest way to set up a [draggable] modifier. When constructing this
- * [DraggableState], you must provide a [onDelta] lambda, which will be invoked whenever
- * drag happens (by gesture input or a custom [DraggableState.drag] call) with the delta in
- * pixels.
+ * [DraggableState], you must provide a [onDelta] lambda, which will be invoked whenever drag
+ * happens (by gesture input or a custom [DraggableState.drag] call) with the delta in pixels.
  *
  * @param onDelta callback invoked when drag occurs. The callback receives the delta in pixels.
  */
@@ -140,11 +133,11 @@
 }
 
 /**
- * Configure touch dragging for the UI element in a single [Orientation]. The drag distance
- * reported to [DraggableState], allowing users to react on the drag delta and update their state.
+ * Configure touch dragging for the UI element in a single [Orientation]. The drag distance reported
+ * to [DraggableState], allowing users to react on the drag delta and update their state.
  *
- * The common usecase for this component is when you need to be able to drag something
- * inside the component on the screen and represent this state via one float value
+ * The common usecase for this component is when you need to be able to drag something inside the
+ * component on the screen and represent this state via one float value
  *
  * If you need to control the whole dragging flow, consider using [pointerInput] instead with the
  * helper functions like [detectDragGestures].
@@ -155,29 +148,29 @@
  *
  * @sample androidx.compose.foundation.samples.DraggableSample
  *
- * @param state [DraggableState] state of the draggable. Defines how drag events will be
- * interpreted by the user land logic.
+ * @param state [DraggableState] state of the draggable. Defines how drag events will be interpreted
+ *   by the user land logic.
  * @param orientation orientation of the drag
  * @param enabled whether or not drag is enabled
  * @param interactionSource [MutableInteractionSource] that will be used to emit
- * [DragInteraction.Start] when this draggable is being dragged.
+ *   [DragInteraction.Start] when this draggable is being dragged.
  * @param startDragImmediately when set to true, draggable will start dragging immediately and
- * prevent other gesture detectors from reacting to "down" events (in order to block composed
- * press-based gestures).  This is intended to allow end users to "catch" an animating widget by
- * pressing on it. It's useful to set it when value you're dragging is settling / animating.
+ *   prevent other gesture detectors from reacting to "down" events (in order to block composed
+ *   press-based gestures). This is intended to allow end users to "catch" an animating widget by
+ *   pressing on it. It's useful to set it when value you're dragging is settling / animating.
  * @param onDragStarted callback that will be invoked when drag is about to start at the starting
- * position, allowing user to suspend and perform preparation for drag, if desired. This suspend
- * function is invoked with the draggable scope, allowing for async processing, if desired. Note
- * that the scope used here is the one provided by the draggable node, for long running work that
- * needs to outlast the modifier being in the composition you should use a scope that fits the
- * lifecycle needed.
- * @param onDragStopped callback that will be invoked when drag is finished, allowing the
- * user to react on velocity and process it. This suspend function is invoked with the draggable
- * scope, allowing for async processing, if desired.  Note that the scope used here is the one
- * provided by the draggable node, for long running work that needs to outlast the modifier being
- * in the composition you should use a scope that fits the lifecycle needed.
- * @param reverseDirection reverse the direction of the scroll, so top to bottom scroll will
- * behave like bottom to top and left to right will behave like right to left.
+ *   position, allowing user to suspend and perform preparation for drag, if desired. This suspend
+ *   function is invoked with the draggable scope, allowing for async processing, if desired. Note
+ *   that the scope used here is the one provided by the draggable node, for long running work that
+ *   needs to outlast the modifier being in the composition you should use a scope that fits the
+ *   lifecycle needed.
+ * @param onDragStopped callback that will be invoked when drag is finished, allowing the user to
+ *   react on velocity and process it. This suspend function is invoked with the draggable scope,
+ *   allowing for async processing, if desired. Note that the scope used here is the one provided by
+ *   the draggable node, for long running work that needs to outlast the modifier being in the
+ *   composition you should use a scope that fits the lifecycle needed.
+ * @param reverseDirection reverse the direction of the scroll, so top to bottom scroll will behave
+ *   like bottom to top and left to right will behave like right to left.
  */
 @Stable
 fun Modifier.draggable(
@@ -189,16 +182,18 @@
     onDragStarted: suspend CoroutineScope.(startedPosition: Offset) -> Unit = NoOpOnDragStarted,
     onDragStopped: suspend CoroutineScope.(velocity: Float) -> Unit = NoOpOnDragStopped,
     reverseDirection: Boolean = false
-): Modifier = this then DraggableElement(
-    state = state,
-    orientation = orientation,
-    enabled = enabled,
-    interactionSource = interactionSource,
-    startDragImmediately = startDragImmediately,
-    onDragStarted = onDragStarted,
-    onDragStopped = onDragStopped,
-    reverseDirection = reverseDirection
-)
+): Modifier =
+    this then
+        DraggableElement(
+            state = state,
+            orientation = orientation,
+            enabled = enabled,
+            interactionSource = interactionSource,
+            startDragImmediately = startDragImmediately,
+            onDragStarted = onDragStarted,
+            onDragStopped = onDragStopped,
+            reverseDirection = reverseDirection
+        )
 
 internal class DraggableElement(
     private val state: DraggableState,
@@ -210,17 +205,18 @@
     private val onDragStopped: suspend CoroutineScope.(velocity: Float) -> Unit,
     private val reverseDirection: Boolean
 ) : ModifierNodeElement<DraggableNode>() {
-    override fun create(): DraggableNode = DraggableNode(
-        state,
-        CanDrag,
-        orientation,
-        enabled,
-        interactionSource,
-        startDragImmediately,
-        onDragStarted,
-        onDragStopped,
-        reverseDirection
-    )
+    override fun create(): DraggableNode =
+        DraggableNode(
+            state,
+            CanDrag,
+            orientation,
+            enabled,
+            interactionSource,
+            startDragImmediately,
+            onDragStarted,
+            onDragStopped,
+            reverseDirection
+        )
 
     override fun update(node: DraggableNode) {
         node.update(
@@ -294,12 +290,13 @@
     private var onDragStarted: suspend CoroutineScope.(startedPosition: Offset) -> Unit,
     private var onDragStopped: suspend CoroutineScope.(velocity: Float) -> Unit,
     private var reverseDirection: Boolean
-) : DragGestureNode(
-    canDrag = canDrag,
-    enabled = enabled,
-    interactionSource = interactionSource,
-    orientationLock = orientation
-) {
+) :
+    DragGestureNode(
+        canDrag = canDrag,
+        enabled = enabled,
+        interactionSource = interactionSource,
+        orientationLock = orientation
+    ) {
 
     override suspend fun drag(forEachDelta: suspend ((dragDelta: DragDelta) -> Unit) -> Unit) {
         state.drag(MutatePriority.UserInput) {
@@ -311,9 +308,7 @@
 
     override fun onDragStarted(startedPosition: Offset) {
         if (!isAttached || onDragStarted == NoOpOnDragStarted) return
-        coroutineScope.launch {
-            this@DraggableNode.onDragStarted(this, startedPosition)
-        }
+        coroutineScope.launch { this@DraggableNode.onDragStarted(this, startedPosition) }
     }
 
     override fun onDragStopped(velocity: Velocity) {
@@ -354,22 +349,15 @@
         this.onDragStopped = onDragStopped
         this.startDragImmediately = startDragImmediately
 
-        update(
-            canDrag,
-            enabled,
-            interactionSource,
-            orientation,
-            resetPointerInputHandling
-        )
+        update(canDrag, enabled, interactionSource, orientation, resetPointerInputHandling)
     }
 
     private fun Velocity.reverseIfNeeded() = if (reverseDirection) this * -1f else this * 1f
+
     private fun Offset.reverseIfNeeded() = if (reverseDirection) this * -1f else this * 1f
 }
 
-/**
- * A node that performs drag gesture recognition and event propagation.
- */
+/** A node that performs drag gesture recognition and event propagation. */
 internal abstract class DragGestureNode(
     canDrag: (PointerInputChange) -> Boolean,
     enabled: Boolean,
@@ -379,8 +367,10 @@
 
     protected var canDrag = canDrag
         private set
+
     protected var enabled = enabled
         private set
+
     protected var interactionSource = interactionSource
         private set
 
@@ -422,10 +412,10 @@
 
         /**
          * To preserve the original behavior we had (before the Modifier.Node migration) we need to
-         * scope the DragStopped and DragCancel methods to the node's coroutine scope instead of using
-         * the one provided by the pointer input modifier, this is to ensure that even when the pointer
-         * input scope is reset we will continue any coroutine scope scope that we started from these
-         * methods while the pointer input scope was active.
+         * scope the DragStopped and DragCancel methods to the node's coroutine scope instead of
+         * using the one provided by the pointer input modifier, this is to ensure that even when
+         * the pointer input scope is reset we will continue any coroutine scope scope that we
+         * started from these methods while the pointer input scope was active.
          */
         coroutineScope.launch {
             while (isActive) {
@@ -486,8 +476,9 @@
                         val overSlopOffset = initialDelta
                         val xSign = sign(startEvent.position.x)
                         val ySign = sign(startEvent.position.y)
-                        val adjustedStart = startEvent.position -
-                            Offset(overSlopOffset.x * xSign, overSlopOffset.y * ySign)
+                        val adjustedStart =
+                            startEvent.position -
+                                Offset(overSlopOffset.x * xSign, overSlopOffset.y * ySign)
 
                         channel?.trySend(DragStarted(adjustedStart))
                     }
@@ -495,22 +486,16 @@
 
             val onDragEnd: (change: PointerInputChange) -> Unit = { upEvent ->
                 velocityTracker.addPointerInputChange(upEvent)
-                val maximumVelocity = currentValueOf(LocalViewConfiguration)
-                    .maximumFlingVelocity
-                val velocity = velocityTracker.calculateVelocity(
-                    Velocity(maximumVelocity, maximumVelocity)
-                )
+                val maximumVelocity = currentValueOf(LocalViewConfiguration).maximumFlingVelocity
+                val velocity =
+                    velocityTracker.calculateVelocity(Velocity(maximumVelocity, maximumVelocity))
                 velocityTracker.resetTracking()
                 channel?.trySend(DragStopped(velocity))
             }
 
-            val onDragCancel: () -> Unit = {
-                channel?.trySend(DragCancelled)
-            }
+            val onDragCancel: () -> Unit = { channel?.trySend(DragCancelled) }
 
-            val shouldAwaitTouchSlop: () -> Boolean = {
-                !startDragImmediately()
-            }
+            val shouldAwaitTouchSlop: () -> Boolean = { !startDragImmediately() }
 
             val onDrag: (change: PointerInputChange, dragAmount: Offset) -> Unit =
                 { change, delta ->
@@ -610,18 +595,17 @@
 
 private class DefaultDraggableState(val onDelta: (Float) -> Unit) : DraggableState {
 
-    private val dragScope: DragScope = object : DragScope {
-        override fun dragBy(pixels: Float): Unit = onDelta(pixels)
-    }
+    private val dragScope: DragScope =
+        object : DragScope {
+            override fun dragBy(pixels: Float): Unit = onDelta(pixels)
+        }
 
     private val scrollMutex = MutatorMutex()
 
     override suspend fun drag(
         dragPriority: MutatePriority,
         block: suspend DragScope.() -> Unit
-    ): Unit = coroutineScope {
-        scrollMutex.mutateWith(dragScope, dragPriority, block)
-    }
+    ): Unit = coroutineScope { scrollMutex.mutateWith(dragScope, dragPriority, block) }
 
     override fun dispatchRawDelta(delta: Float) {
         return onDelta(delta)
@@ -630,8 +614,11 @@
 
 internal sealed class DragEvent {
     class DragStarted(val startPoint: Offset) : DragEvent()
+
     class DragStopped(val velocity: Velocity) : DragEvent()
+
     object DragCancelled : DragEvent()
+
     class DragDelta(val delta: Offset) : DragEvent()
 }
 
diff --git a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/gestures/Draggable2D.kt b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/gestures/Draggable2D.kt
index f12fb1a..fa79ef8 100644
--- a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/gestures/Draggable2D.kt
+++ b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/gestures/Draggable2D.kt
@@ -42,12 +42,12 @@
     /**
      * Call this function to take control of drag logic.
      *
-     * All actions that change the logical drag position must be performed within a [drag]
-     * block (even if they don't call any other methods on this object) in order to guarantee
-     * that mutual exclusion is enforced.
+     * All actions that change the logical drag position must be performed within a [drag] block
+     * (even if they don't call any other methods on this object) in order to guarantee that mutual
+     * exclusion is enforced.
      *
-     * If [drag] is called from elsewhere with the [dragPriority] higher or equal to ongoing
-     * drag, ongoing drag will be canceled.
+     * If [drag] is called from elsewhere with the [dragPriority] higher or equal to ongoing drag,
+     * ongoing drag will be canceled.
      *
      * @param dragPriority of the drag operation
      * @param block to perform drag in
@@ -60,27 +60,23 @@
     /**
      * Dispatch drag delta in pixels avoiding all drag related priority mechanisms.
      *
-     * **Note:** unlike [drag], dispatching any delta with this method will bypass scrolling of
-     * any priority. This method will also ignore `reverseDirection` and other parameters set in
+     * **Note:** unlike [drag], dispatching any delta with this method will bypass scrolling of any
+     * priority. This method will also ignore `reverseDirection` and other parameters set in
      * draggable2D.
      *
      * This method is used internally for low level operations, allowing implementers of
-     * [Draggable2DState] influence the consumption as suits them.
-     * Manually dispatching delta via this method will likely result in a bad user experience,
-     * you must prefer [drag] method over this one.
+     * [Draggable2DState] influence the consumption as suits them. Manually dispatching delta via
+     * this method will likely result in a bad user experience, you must prefer [drag] method over
+     * this one.
      *
      * @param delta amount of scroll dispatched in the nested drag process
      */
     fun dispatchRawDelta(delta: Offset)
 }
 
-/**
- * Scope used for suspending drag blocks
- */
+/** Scope used for suspending drag blocks */
 interface Drag2DScope {
-    /**
-     * Attempts to drag by [pixels] px.
-     */
+    /** Attempts to drag by [pixels] px. */
     fun dragBy(pixels: Offset)
 }
 
@@ -89,25 +85,22 @@
  * will be invoked when the drag occurs.
  *
  * This is the simplest way to set up a draggable2D modifier. When constructing this
- * [Draggable2DState], you must provide a [onDelta] lambda, which will be invoked whenever
- * drag happens (by gesture input or a custom [Draggable2DState.drag] call) with the delta in
- * pixels.
+ * [Draggable2DState], you must provide a [onDelta] lambda, which will be invoked whenever drag
+ * happens (by gesture input or a custom [Draggable2DState.drag] call) with the delta in pixels.
  *
  * If you are creating [Draggable2DState] in composition, consider using [rememberDraggable2DState].
  *
  * @param onDelta callback invoked when drag occurs. The callback receives the delta in pixels.
  */
-fun Draggable2DState(onDelta: (Offset) -> Unit): Draggable2DState =
-    DefaultDraggable2DState(onDelta)
+fun Draggable2DState(onDelta: (Offset) -> Unit): Draggable2DState = DefaultDraggable2DState(onDelta)
 
 /**
  * Create and remember default implementation of [Draggable2DState] interface that allows to pass a
  * simple action that will be invoked when the drag occurs.
  *
  * This is the simplest way to set up a [draggable2D] modifier. When constructing this
- * [Draggable2DState], you must provide a [onDelta] lambda, which will be invoked whenever
- * drag happens (by gesture input or a custom [Draggable2DState.drag] call) with the delta in
- * pixels.
+ * [Draggable2DState], you must provide a [onDelta] lambda, which will be invoked whenever drag
+ * happens (by gesture input or a custom [Draggable2DState.drag] call) with the delta in pixels.
  *
  * @param onDelta callback invoked when drag occurs. The callback receives the delta in pixels.
  */
@@ -118,31 +111,31 @@
 }
 
 /**
- * Configure touch dragging for the UI element in both orientations. The drag distance
- * reported to [Draggable2DState], allowing users to react to the drag delta and update their state.
+ * Configure touch dragging for the UI element in both orientations. The drag distance reported to
+ * [Draggable2DState], allowing users to react to the drag delta and update their state.
  *
- * The common common usecase for this component is when you need to be able to drag something
- * inside the component on the screen and represent this state via one float value
+ * The common common usecase for this component is when you need to be able to drag something inside
+ * the component on the screen and represent this state via one float value
  *
  * If you are implementing dragging in a single orientation, consider using [draggable].
  *
  * @sample androidx.compose.foundation.samples.Draggable2DSample
  *
  * @param state [Draggable2DState] state of the draggable2D. Defines how drag events will be
- * interpreted by the user land logic.
+ *   interpreted by the user land logic.
  * @param enabled whether or not drag is enabled
  * @param interactionSource [MutableInteractionSource] that will be used to emit
- * [DragInteraction.Start] when this draggable is being dragged.
+ *   [DragInteraction.Start] when this draggable is being dragged.
  * @param startDragImmediately when set to true, draggable2D will start dragging immediately and
- * prevent other gesture detectors from reacting to "down" events (in order to block composed
- * press-based gestures). This is intended to allow end users to "catch" an animating widget by
- * pressing on it. It's useful to set it when value you're dragging is settling / animating.
+ *   prevent other gesture detectors from reacting to "down" events (in order to block composed
+ *   press-based gestures). This is intended to allow end users to "catch" an animating widget by
+ *   pressing on it. It's useful to set it when value you're dragging is settling / animating.
  * @param onDragStarted callback that will be invoked when drag is about to start at the starting
- * position, allowing user to perform preparation for drag.
- * @param onDragStopped callback that will be invoked when drag is finished, allowing the
- * user to react on velocity and process it.
- * @param reverseDirection reverse the direction of the scroll, so top to bottom scroll will
- * behave like bottom to top and left to right will behave like right to left.
+ *   position, allowing user to perform preparation for drag.
+ * @param onDragStopped callback that will be invoked when drag is finished, allowing the user to
+ *   react on velocity and process it.
+ * @param reverseDirection reverse the direction of the scroll, so top to bottom scroll will behave
+ *   like bottom to top and left to right will behave like right to left.
  */
 @Stable
 fun Modifier.draggable2D(
@@ -153,15 +146,17 @@
     onDragStarted: (startedPosition: Offset) -> Unit = NoOpOnDragStart,
     onDragStopped: (velocity: Velocity) -> Unit = NoOpOnDragStop,
     reverseDirection: Boolean = false
-): Modifier = this then Draggable2DElement(
-    state = state,
-    enabled = enabled,
-    interactionSource = interactionSource,
-    startDragImmediately = startDragImmediately,
-    onDragStarted = onDragStarted,
-    onDragStopped = onDragStopped,
-    reverseDirection = reverseDirection
-)
+): Modifier =
+    this then
+        Draggable2DElement(
+            state = state,
+            enabled = enabled,
+            interactionSource = interactionSource,
+            startDragImmediately = startDragImmediately,
+            onDragStarted = onDragStarted,
+            onDragStopped = onDragStopped,
+            reverseDirection = reverseDirection
+        )
 
 internal class Draggable2DElement(
     private val state: Draggable2DState,
@@ -172,16 +167,17 @@
     private val onDragStopped: (velocity: Velocity) -> Unit,
     private val reverseDirection: Boolean
 ) : ModifierNodeElement<Draggable2DNode>() {
-    override fun create(): Draggable2DNode = Draggable2DNode(
-        state,
-        CanDrag,
-        enabled,
-        interactionSource,
-        startDragImmediately,
-        reverseDirection,
-        onDragStarted,
-        onDragStopped,
-    )
+    override fun create(): Draggable2DNode =
+        Draggable2DNode(
+            state,
+            CanDrag,
+            enabled,
+            interactionSource,
+            startDragImmediately,
+            reverseDirection,
+            onDragStarted,
+            onDragStopped,
+        )
 
     override fun update(node: Draggable2DNode) {
         node.update(
@@ -250,20 +246,17 @@
     private var reverseDirection: Boolean,
     private var onDragStarted: (startedPosition: Offset) -> Unit,
     private var onDragStopped: (velocity: Velocity) -> Unit,
-) : DragGestureNode(
-    canDrag = canDrag,
-    enabled = enabled,
-    interactionSource = interactionSource,
-    orientationLock = null
-) {
-
-    override suspend fun drag(
-        forEachDelta: suspend ((dragDelta: DragDelta) -> Unit) -> Unit
+) :
+    DragGestureNode(
+        canDrag = canDrag,
+        enabled = enabled,
+        interactionSource = interactionSource,
+        orientationLock = null
     ) {
+
+    override suspend fun drag(forEachDelta: suspend ((dragDelta: DragDelta) -> Unit) -> Unit) {
         state.drag(MutatePriority.UserInput) {
-            forEachDelta { dragDelta ->
-                dragBy(dragDelta.delta.reverseIfNeeded())
-            }
+            forEachDelta { dragDelta -> dragBy(dragDelta.delta.reverseIfNeeded()) }
         }
     }
 
@@ -312,22 +305,22 @@
     }
 
     private fun Velocity.reverseIfNeeded() = if (reverseDirection) this * -1f else this * 1f
+
     private fun Offset.reverseIfNeeded() = if (reverseDirection) this * -1f else this * 1f
 }
 
 private class DefaultDraggable2DState(val onDelta: (Offset) -> Unit) : Draggable2DState {
-    private val drag2DScope: Drag2DScope = object : Drag2DScope {
-        override fun dragBy(pixels: Offset) = onDelta(pixels)
-    }
+    private val drag2DScope: Drag2DScope =
+        object : Drag2DScope {
+            override fun dragBy(pixels: Offset) = onDelta(pixels)
+        }
 
     private val drag2DMutex = MutatorMutex()
 
     override suspend fun drag(
         dragPriority: MutatePriority,
         block: suspend Drag2DScope.() -> Unit
-    ): Unit = coroutineScope {
-        drag2DMutex.mutateWith(drag2DScope, dragPriority, block)
-    }
+    ): Unit = coroutineScope { drag2DMutex.mutateWith(drag2DScope, dragPriority, block) }
 
     override fun dispatchRawDelta(delta: Offset) {
         return onDelta(delta)
diff --git a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/gestures/FlingBehavior.kt b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/gestures/FlingBehavior.kt
index 46bedcc..f80d9c6 100644
--- a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/gestures/FlingBehavior.kt
+++ b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/gestures/FlingBehavior.kt
@@ -37,8 +37,7 @@
      * guarantee proper nested scroll support.
      *
      * @param initialVelocity velocity available for fling in the orientation specified in
-     * [androidx.compose.foundation.gestures.scrollable] that invoked this method.
-     *
+     *   [androidx.compose.foundation.gestures.scrollable] that invoked this method.
      * @return remaining velocity after fling operation has ended
      */
     suspend fun ScrollScope.performFling(initialVelocity: Float): Float
diff --git a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/gestures/ForEachGesture.kt b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/gestures/ForEachGesture.kt
index 8929d7a..d815a4d 100644
--- a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/gestures/ForEachGesture.kt
+++ b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/gestures/ForEachGesture.kt
@@ -24,15 +24,15 @@
 import kotlinx.coroutines.isActive
 
 /**
- * A gesture was canceled and cannot continue, likely because another gesture has taken
- * over the pointer input stream.
+ * A gesture was canceled and cannot continue, likely because another gesture has taken over the
+ * pointer input stream.
  */
 class GestureCancellationException(message: String? = null) : CancellationException(message)
 
 /**
- * Repeatedly calls [block] to handle gestures. If there is a [CancellationException],
- * it will wait until all pointers are raised before another gesture is detected, or it
- * exits if [isActive] is `false`.
+ * Repeatedly calls [block] to handle gestures. If there is a [CancellationException], it will wait
+ * until all pointers are raised before another gesture is detected, or it exits if [isActive] is
+ * `false`.
  *
  * [awaitEachGesture] does the same thing without the possibility of missing events between
  * gestures, but also lacks the ability to call arbitrary suspending functions within [block].
@@ -64,22 +64,18 @@
 }
 
 /**
- * Returns `true` if the current state of the pointer events has all pointers up and `false`
- * if any of the pointers are down.
+ * Returns `true` if the current state of the pointer events has all pointers up and `false` if any
+ * of the pointers are down.
  */
 internal fun AwaitPointerEventScope.allPointersUp(): Boolean =
     !currentEvent.changes.fastAny { it.pressed }
 
-/**
- * Waits for all pointers to be up before returning.
- */
+/** Waits for all pointers to be up before returning. */
 internal suspend fun PointerInputScope.awaitAllPointersUp() {
     awaitPointerEventScope { awaitAllPointersUp() }
 }
 
-/**
- * Waits for all pointers to be up before returning.
- */
+/** Waits for all pointers to be up before returning. */
 internal suspend fun AwaitPointerEventScope.awaitAllPointersUp() {
     if (!allPointersUp()) {
         do {
@@ -89,12 +85,12 @@
 }
 
 /**
- * Repeatedly calls [block] to handle gestures. If there is a [CancellationException],
- * it will wait until all pointers are raised before another gesture is detected, or it
- * exits if [isActive] is `false`.
+ * Repeatedly calls [block] to handle gestures. If there is a [CancellationException], it will wait
+ * until all pointers are raised before another gesture is detected, or it exits if [isActive] is
+ * `false`.
  *
- * [block] is run within [PointerInputScope.awaitPointerEventScope] and will loop entirely
- * within the [AwaitPointerEventScope] so events will not be lost between gestures.
+ * [block] is run within [PointerInputScope.awaitPointerEventScope] and will loop entirely within
+ * the [AwaitPointerEventScope] so events will not be lost between gestures.
  */
 suspend fun PointerInputScope.awaitEachGesture(block: suspend AwaitPointerEventScope.() -> Unit) {
     val currentContext = currentCoroutineContext()
diff --git a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/gestures/Orientation.kt b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/gestures/Orientation.kt
index 7940a0f..ebfe7fb 100644
--- a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/gestures/Orientation.kt
+++ b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/gestures/Orientation.kt
@@ -21,17 +21,14 @@
  * [scrollable] can drag.
  */
 enum class Orientation {
-    /**
-     * Vertical orientation representing Y axis
-     */
+    /** Vertical orientation representing Y axis */
     Vertical,
 
     /**
      * Horizontal orientation representing X axis.
      *
-     * Note: this value specifies just the axis, not the direction (left-to-right or
-     * right-to-left). To support RTL cases, use `reverseDirection = true` on [scrollable] and
-     * [draggable].
+     * Note: this value specifies just the axis, not the direction (left-to-right or right-to-left).
+     * To support RTL cases, use `reverseDirection = true` on [scrollable] and [draggable].
      */
     Horizontal
 }
diff --git a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/gestures/ScrollExtensions.kt b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/gestures/ScrollExtensions.kt
index 9521a45..d0814d2 100644
--- a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/gestures/ScrollExtensions.kt
+++ b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/gestures/ScrollExtensions.kt
@@ -24,12 +24,10 @@
 /**
  * Scroll by [value] pixels with animation.
  *
- * Cancels the currently running scroll, if any, and suspends until the cancellation is
- * complete.
+ * Cancels the currently running scroll, if any, and suspends until the cancellation is complete.
  *
  * @param value number of pixels to scroll by
  * @param animationSpec [AnimationSpec] to be used for this scrolling
- *
  * @return the amount of scroll consumed
  */
 suspend fun ScrollableState.animateScrollBy(
@@ -48,19 +46,15 @@
 /**
  * Jump instantly by [value] pixels.
  *
- * Cancels the currently running scroll, if any, and suspends until the cancellation is
- * complete.
- *
- * @see animateScrollBy for an animated version
+ * Cancels the currently running scroll, if any, and suspends until the cancellation is complete.
  *
  * @param value number of pixels to scroll by
  * @return the amount of scroll consumed
+ * @see animateScrollBy for an animated version
  */
 suspend fun ScrollableState.scrollBy(value: Float): Float {
     var consumed = 0f
-    scroll {
-        consumed = scrollBy(value)
-    }
+    scroll { consumed = scrollBy(value) }
     return consumed
 }
 
diff --git a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/gestures/Scrollable.kt b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/gestures/Scrollable.kt
index f435dbc..cbdf670 100644
--- a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/gestures/Scrollable.kt
+++ b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/gestures/Scrollable.kt
@@ -98,15 +98,15 @@
  * @sample androidx.compose.foundation.samples.ScrollableSample
  *
  * @param state [ScrollableState] state of the scrollable. Defines how scroll events will be
- * interpreted by the user land logic and contains useful information about on-going events.
+ *   interpreted by the user land logic and contains useful information about on-going events.
  * @param orientation orientation of the scrolling
  * @param enabled whether or not scrolling in enabled
- * @param reverseDirection reverse the direction of the scroll, so top to bottom scroll will
- * behave like bottom to top and left to right will behave like right to left.
+ * @param reverseDirection reverse the direction of the scroll, so top to bottom scroll will behave
+ *   like bottom to top and left to right will behave like right to left.
  * @param flingBehavior logic describing fling behavior when drag has finished with velocity. If
- * `null`, default from [ScrollableDefaults.flingBehavior] will be used.
- * @param interactionSource [MutableInteractionSource] that will be used to emit
- * drag events when this scrollable is being dragged.
+ *   `null`, default from [ScrollableDefaults.flingBehavior] will be used.
+ * @param interactionSource [MutableInteractionSource] that will be used to emit drag events when
+ *   this scrollable is being dragged.
  */
 @Stable
 @OptIn(ExperimentalFoundationApi::class)
@@ -117,15 +117,16 @@
     reverseDirection: Boolean = false,
     flingBehavior: FlingBehavior? = null,
     interactionSource: MutableInteractionSource? = null
-): Modifier = scrollable(
-    state = state,
-    orientation = orientation,
-    enabled = enabled,
-    reverseDirection = reverseDirection,
-    flingBehavior = flingBehavior,
-    interactionSource = interactionSource,
-    overscrollEffect = null
-)
+): Modifier =
+    scrollable(
+        state = state,
+        orientation = orientation,
+        enabled = enabled,
+        reverseDirection = reverseDirection,
+        flingBehavior = flingBehavior,
+        interactionSource = interactionSource,
+        overscrollEffect = null
+    )
 
 /**
  * Configure touch scrolling and flinging for the UI element in a single [Orientation].
@@ -137,29 +138,29 @@
  * If you don't need to have fling or nested scroll support, but want to make component simply
  * draggable, consider using [draggable].
  *
- * This overload provides the access to [OverscrollEffect] that defines the behaviour of the
- * over scrolling logic. Consider using [ScrollableDefaults.overscrollEffect] for the platform
+ * This overload provides the access to [OverscrollEffect] that defines the behaviour of the over
+ * scrolling logic. Consider using [ScrollableDefaults.overscrollEffect] for the platform
  * look-and-feel.
  *
  * @sample androidx.compose.foundation.samples.ScrollableSample
  *
  * @param state [ScrollableState] state of the scrollable. Defines how scroll events will be
- * interpreted by the user land logic and contains useful information about on-going events.
+ *   interpreted by the user land logic and contains useful information about on-going events.
  * @param orientation orientation of the scrolling
- * @param overscrollEffect effect to which the deltas will be fed when the scrollable have
- * some scrolling delta left. Pass `null` for no overscroll. If you pass an effect you should
- * also apply [androidx.compose.foundation.overscroll] modifier.
+ * @param overscrollEffect effect to which the deltas will be fed when the scrollable have some
+ *   scrolling delta left. Pass `null` for no overscroll. If you pass an effect you should also
+ *   apply [androidx.compose.foundation.overscroll] modifier.
  * @param enabled whether or not scrolling in enabled
- * @param reverseDirection reverse the direction of the scroll, so top to bottom scroll will
- * behave like bottom to top and left to right will behave like right to left.
+ * @param reverseDirection reverse the direction of the scroll, so top to bottom scroll will behave
+ *   like bottom to top and left to right will behave like right to left.
  * @param flingBehavior logic describing fling behavior when drag has finished with velocity. If
- * `null`, default from [ScrollableDefaults.flingBehavior] will be used.
- * @param interactionSource [MutableInteractionSource] that will be used to emit
- * drag events when this scrollable is being dragged.
- * @param bringIntoViewSpec The configuration that this scrollable should use to perform
- * scrolling when scroll requests are received from the focus system. If null is provided the
- * system will use the behavior provided by [LocalBringIntoViewSpec] which by default has a
- * platform dependent implementation.
+ *   `null`, default from [ScrollableDefaults.flingBehavior] will be used.
+ * @param interactionSource [MutableInteractionSource] that will be used to emit drag events when
+ *   this scrollable is being dragged.
+ * @param bringIntoViewSpec The configuration that this scrollable should use to perform scrolling
+ *   when scroll requests are received from the focus system. If null is provided the system will
+ *   use the behavior provided by [LocalBringIntoViewSpec] which by default has a platform dependent
+ *   implementation.
  *
  * Note: This API is experimental as it brings support for some experimental features:
  * [overscrollEffect] and [bringIntoViewSpec].
@@ -175,16 +176,18 @@
     flingBehavior: FlingBehavior? = null,
     interactionSource: MutableInteractionSource? = null,
     bringIntoViewSpec: BringIntoViewSpec? = null
-) = this then ScrollableElement(
-    state,
-    orientation,
-    overscrollEffect,
-    enabled,
-    reverseDirection,
-    flingBehavior,
-    interactionSource,
-    bringIntoViewSpec
-)
+) =
+    this then
+        ScrollableElement(
+            state,
+            orientation,
+            overscrollEffect,
+            enabled,
+            reverseDirection,
+            flingBehavior,
+            interactionSource,
+            bringIntoViewSpec
+        )
 
 @OptIn(ExperimentalFoundationApi::class)
 private class ScrollableElement(
@@ -275,44 +278,44 @@
     reverseDirection: Boolean,
     interactionSource: MutableInteractionSource?,
     bringIntoViewSpec: BringIntoViewSpec?
-) : DragGestureNode(
-    canDrag = CanDragCalculation,
-    enabled = enabled,
-    interactionSource = interactionSource,
-    orientationLock = orientation
-), ObserverModifierNode, CompositionLocalConsumerModifierNode,
-    FocusPropertiesModifierNode, KeyInputModifierNode, SemanticsModifierNode {
+) :
+    DragGestureNode(
+        canDrag = CanDragCalculation,
+        enabled = enabled,
+        interactionSource = interactionSource,
+        orientationLock = orientation
+    ),
+    ObserverModifierNode,
+    CompositionLocalConsumerModifierNode,
+    FocusPropertiesModifierNode,
+    KeyInputModifierNode,
+    SemanticsModifierNode {
 
     override val shouldAutoInvalidate: Boolean = false
 
     private val nestedScrollDispatcher = NestedScrollDispatcher()
 
-    private val scrollableContainerNode =
-        delegate(ScrollableContainerNode(enabled))
+    private val scrollableContainerNode = delegate(ScrollableContainerNode(enabled))
 
     // Place holder fling behavior, we'll initialize it when the density is available.
     private val defaultFlingBehavior = DefaultFlingBehavior(splineBasedDecay(UnityDensity))
 
-    private val scrollingLogic = ScrollingLogic(
-        scrollableState = state,
-        orientation = orientation,
-        overscrollEffect = overscrollEffect,
-        reverseDirection = reverseDirection,
-        flingBehavior = flingBehavior ?: defaultFlingBehavior,
-        nestedScrollDispatcher = nestedScrollDispatcher,
-    )
+    private val scrollingLogic =
+        ScrollingLogic(
+            scrollableState = state,
+            orientation = orientation,
+            overscrollEffect = overscrollEffect,
+            reverseDirection = reverseDirection,
+            flingBehavior = flingBehavior ?: defaultFlingBehavior,
+            nestedScrollDispatcher = nestedScrollDispatcher,
+        )
 
     private val nestedScrollConnection =
         ScrollableNestedScrollConnection(enabled = enabled, scrollingLogic = scrollingLogic)
 
     private val contentInViewNode =
         delegate(
-            ContentInViewNode(
-                orientation,
-                scrollingLogic,
-                reverseDirection,
-                bringIntoViewSpec
-            )
+            ContentInViewNode(orientation, scrollingLogic, reverseDirection, bringIntoViewSpec)
         )
 
     // Need to wait until onAttach to read the scroll config. Currently this is static, so we
@@ -322,14 +325,10 @@
     private var scrollByOffsetAction: (suspend (Offset) -> Offset)? = null
 
     init {
-        /**
-         * Nested scrolling
-         */
+        /** Nested scrolling */
         delegate(nestedScrollModifierNode(nestedScrollConnection, nestedScrollDispatcher))
 
-        /**
-         * Focus scrolling
-         */
+        /** Focus scrolling */
         delegate(FocusTargetModifierNode())
         delegate(BringIntoViewResponderNode(contentInViewNode))
         delegate(FocusedBoundsObserverNode { contentInViewNode.onFocusBoundsChanged(it) })
@@ -341,10 +340,7 @@
         with(scrollingLogic) {
             scroll(scrollPriority = MutatePriority.UserInput) {
                 forEachDelta {
-                    scrollByWithOverscroll(
-                        it.delta.singleAxisOffset(),
-                        source = UserInput
-                    )
+                    scrollByWithOverscroll(it.delta.singleAxisOffset(), source = UserInput)
                 }
             }
         }
@@ -353,9 +349,7 @@
     override fun onDragStarted(startedPosition: Offset) {}
 
     override fun onDragStopped(velocity: Velocity) {
-        nestedScrollDispatcher.coroutineScope.launch {
-            scrollingLogic.onDragStopped(velocity)
-        }
+        nestedScrollDispatcher.coroutineScope.launch { scrollingLogic.onDragStopped(velocity) }
     }
 
     override fun startDragImmediately(): Boolean {
@@ -381,20 +375,17 @@
         // a new fling behavior was set, change the resolved one.
         val resolvedFlingBehavior = flingBehavior ?: defaultFlingBehavior
 
-        val resetPointerInputHandling = scrollingLogic.update(
-            scrollableState = state,
-            orientation = orientation,
-            overscrollEffect = overscrollEffect,
-            reverseDirection = reverseDirection,
-            flingBehavior = resolvedFlingBehavior,
-            nestedScrollDispatcher = nestedScrollDispatcher
-        )
+        val resetPointerInputHandling =
+            scrollingLogic.update(
+                scrollableState = state,
+                orientation = orientation,
+                overscrollEffect = overscrollEffect,
+                reverseDirection = reverseDirection,
+                flingBehavior = resolvedFlingBehavior,
+                nestedScrollDispatcher = nestedScrollDispatcher
+            )
 
-        contentInViewNode.update(
-            orientation,
-            reverseDirection,
-            bringIntoViewSpec
-        )
+        contentInViewNode.update(orientation, reverseDirection, bringIntoViewSpec)
 
         this.overscrollEffect = overscrollEffect
         this.flingBehavior = flingBehavior
@@ -438,34 +429,38 @@
 
     // Key handler for Page up/down scrolling behavior.
     override fun onKeyEvent(event: KeyEvent): Boolean {
-        return if (enabled &&
-            (event.key == Key.PageDown || event.key == Key.PageUp) &&
-            (event.type == KeyEventType.KeyDown) &&
-            (!event.isCtrlPressed)
+        return if (
+            enabled &&
+                (event.key == Key.PageDown || event.key == Key.PageUp) &&
+                (event.type == KeyEventType.KeyDown) &&
+                (!event.isCtrlPressed)
         ) {
 
-            val scrollAmount: Offset = if (scrollingLogic.isVertical()) {
-                val viewportHeight = contentInViewNode.viewportSize.height
+            val scrollAmount: Offset =
+                if (scrollingLogic.isVertical()) {
+                    val viewportHeight = contentInViewNode.viewportSize.height
 
-                val yAmount = if (event.key == Key.PageUp) {
-                    viewportHeight.toFloat()
+                    val yAmount =
+                        if (event.key == Key.PageUp) {
+                            viewportHeight.toFloat()
+                        } else {
+                            -viewportHeight.toFloat()
+                        }
+
+                    Offset(0f, yAmount)
                 } else {
-                    -viewportHeight.toFloat()
+                    val viewportWidth = contentInViewNode.viewportSize.width
+
+                    val xAmount =
+                        if (event.key == Key.PageUp) {
+                            viewportWidth.toFloat()
+                        } else {
+                            -viewportWidth.toFloat()
+                        }
+
+                    Offset(xAmount, 0f)
                 }
 
-                Offset(0f, yAmount)
-            } else {
-                val viewportWidth = contentInViewNode.viewportSize.width
-
-                val xAmount = if (event.key == Key.PageUp) {
-                    viewportWidth.toFloat()
-                } else {
-                    -viewportWidth.toFloat()
-                }
-
-                Offset(xAmount, 0f)
-            }
-
             // A coroutine is launched for every individual scroll event in the
             // larger scroll gesture. If we see degradation in the future (that is,
             // a fast scroll gesture on a slow device causes UI jank [not seen up to
@@ -474,10 +469,7 @@
             // to communicate the scroll amount to the UI thread.
             coroutineScope.launch {
                 scrollingLogic.scroll(scrollPriority = MutatePriority.UserInput) {
-                    scrollBy(
-                        offset = scrollAmount,
-                        source = UserInput
-                    )
+                    scrollBy(offset = scrollAmount, source = UserInput)
                 }
             }
             true
@@ -504,20 +496,14 @@
             setScrollSemanticsActions()
         }
 
-        scrollByAction?.let {
-            scrollBy(action = it)
-        }
+        scrollByAction?.let { scrollBy(action = it) }
 
-        scrollByOffsetAction?.let {
-            scrollByOffset(action = it)
-        }
+        scrollByOffsetAction?.let { scrollByOffset(action = it) }
     }
 
     private fun setScrollSemanticsActions() {
         scrollByAction = { x, y ->
-            coroutineScope.launch {
-                scrollingLogic.semanticsScrollBy(Offset(x, y))
-            }
+            coroutineScope.launch { scrollingLogic.semanticsScrollBy(Offset(x, y)) }
             true
         }
 
@@ -529,9 +515,7 @@
         scrollByOffsetAction = null
     }
 
-    /**
-     * Mouse wheel
-     */
+    /** Mouse wheel */
     private fun processMouseWheelEvent(event: PointerEvent, size: IntSize) {
         if (event.changes.fastAll { !it.isConsumed }) {
             with(scrollConfig!!) {
@@ -544,10 +528,7 @@
                 // to communicate the scroll amount to the UI thread.
                 coroutineScope.launch {
                     scrollingLogic.scroll(scrollPriority = MutatePriority.UserInput) {
-                        scrollBy(
-                            offset = scrollAmount,
-                            source = UserInput
-                        )
+                        scrollBy(offset = scrollAmount, source = UserInput)
                     }
                 }
                 event.changes.fastForEach { it.consume() }
@@ -556,20 +537,14 @@
     }
 }
 
-/**
- * Contains the default values used by [scrollable]
- */
+/** Contains the default values used by [scrollable] */
 object ScrollableDefaults {
 
-    /**
-     * Create and remember default [FlingBehavior] that will represent natural fling curve.
-     */
+    /** Create and remember default [FlingBehavior] that will represent natural fling curve. */
     @Composable
     fun flingBehavior(): FlingBehavior {
         val flingSpec = rememberSplineBasedDecay<Float>()
-        return remember(flingSpec) {
-            DefaultFlingBehavior(flingSpec)
-        }
+        return remember(flingSpec) { DefaultFlingBehavior(flingSpec) }
     }
 
     /**
@@ -583,13 +558,12 @@
     }
 
     /**
-     * Used to determine the value of `reverseDirection` parameter of [Modifier.scrollable]
-     * in scrollable layouts.
+     * Used to determine the value of `reverseDirection` parameter of [Modifier.scrollable] in
+     * scrollable layouts.
      *
      * @param layoutDirection current layout direction (e.g. from [LocalLayoutDirection])
      * @param orientation orientation of scroll
      * @param reverseScrolling whether scrolling direction should be reversed
-     *
      * @return `true` if scroll direction should be reversed, `false` otherwise.
      */
     fun reverseDirection(
@@ -609,15 +583,16 @@
     }
 
     /**
-     * A default implementation for [BringIntoViewSpec] that brings a child into view
-     * using the least amount of effort.
+     * A default implementation for [BringIntoViewSpec] that brings a child into view using the
+     * least amount of effort.
      */
     @Deprecated(
         "This has been replaced by composition locals LocalBringIntoViewSpec",
-        replaceWith = ReplaceWith(
-            "LocalBringIntoView.current",
-            "androidx.compose.foundation.gestures.LocalBringIntoViewSpec"
-        )
+        replaceWith =
+            ReplaceWith(
+                "LocalBringIntoView.current",
+                "androidx.compose.foundation.gestures.LocalBringIntoViewSpec"
+            )
     )
     @ExperimentalFoundationApi
     fun bringIntoViewSpec(): BringIntoViewSpec = DefaultBringIntoViewSpec
@@ -629,8 +604,9 @@
 
 internal expect fun CompositionLocalConsumerModifierNode.platformScrollConfig(): ScrollConfig
 
-private val CanDragCalculation: (PointerInputChange) -> Boolean =
-    { change -> change.type != PointerType.Mouse }
+private val CanDragCalculation: (PointerInputChange) -> Boolean = { change ->
+    change.type != PointerType.Mouse
+}
 
 /**
  * Holds all scrolling related logic: controls nested scrolling, flinging, overscroll and delta
@@ -646,20 +622,19 @@
     private var nestedScrollDispatcher: NestedScrollDispatcher,
 ) {
 
-    fun Float.toOffset(): Offset = when {
-        this == 0f -> Offset.Zero
-        orientation == Horizontal -> Offset(this, 0f)
-        else -> Offset(0f, this)
-    }
+    fun Float.toOffset(): Offset =
+        when {
+            this == 0f -> Offset.Zero
+            orientation == Horizontal -> Offset(this, 0f)
+            else -> Offset(0f, this)
+        }
 
     fun Offset.singleAxisOffset(): Offset =
         if (orientation == Horizontal) copy(y = 0f) else copy(x = 0f)
 
-    fun Offset.toFloat(): Float =
-        if (orientation == Horizontal) this.x else this.y
+    fun Offset.toFloat(): Float = if (orientation == Horizontal) this.x else this.y
 
-    private fun Velocity.toFloat(): Float =
-        if (orientation == Horizontal) this.x else this.y
+    private fun Velocity.toFloat(): Float = if (orientation == Horizontal) this.x else this.y
 
     private fun Velocity.singleAxisVelocity(): Velocity =
         if (orientation == Horizontal) copy(y = 0f) else copy(x = 0f)
@@ -674,35 +649,32 @@
     private var latestScrollSource = UserInput
     private var outerStateScope = NoOpScrollScope
 
-    private val nestedScrollScope = object : NestedScrollScope {
-        override fun scrollBy(offset: Offset, source: NestedScrollSource): Offset {
-            return with(outerStateScope) {
-                performScroll(offset, source)
+    private val nestedScrollScope =
+        object : NestedScrollScope {
+            override fun scrollBy(offset: Offset, source: NestedScrollSource): Offset {
+                return with(outerStateScope) { performScroll(offset, source) }
             }
-        }
 
-        override fun scrollByWithOverscroll(offset: Offset, source: NestedScrollSource): Offset {
-            latestScrollSource = source
-            val overscroll = overscrollEffect
-            return if (overscroll != null && shouldDispatchOverscroll) {
-                overscroll.applyToScroll(offset, latestScrollSource, performScrollForOverscroll)
-            } else {
-                with(outerStateScope) {
-                    performScroll(offset, source)
+            override fun scrollByWithOverscroll(
+                offset: Offset,
+                source: NestedScrollSource
+            ): Offset {
+                latestScrollSource = source
+                val overscroll = overscrollEffect
+                return if (overscroll != null && shouldDispatchOverscroll) {
+                    overscroll.applyToScroll(offset, latestScrollSource, performScrollForOverscroll)
+                } else {
+                    with(outerStateScope) { performScroll(offset, source) }
                 }
             }
         }
-    }
 
     private val performScrollForOverscroll: (Offset) -> Offset = { delta ->
-        with(outerStateScope) {
-            performScroll(delta, latestScrollSource)
-        }
+        with(outerStateScope) { performScroll(delta, latestScrollSource) }
     }
 
     private fun ScrollScope.performScroll(delta: Offset, source: NestedScrollSource): Offset {
-        val consumedByPreScroll =
-            nestedScrollDispatcher.dispatchPreScroll(delta, source)
+        val consumedByPreScroll = nestedScrollDispatcher.dispatchPreScroll(delta, source)
 
         val scrollAvailableAfterPreScroll = delta - consumedByPreScroll
 
@@ -714,11 +686,12 @@
             scrollBy(singleAxisDeltaForSelfScroll).toOffset().reverseIfNeeded()
 
         val deltaAvailableAfterScroll = scrollAvailableAfterPreScroll - consumedBySelfScroll
-        val consumedByPostScroll = nestedScrollDispatcher.dispatchPostScroll(
-            consumedBySelfScroll,
-            deltaAvailableAfterScroll,
-            source
-        )
+        val consumedByPostScroll =
+            nestedScrollDispatcher.dispatchPostScroll(
+                consumedBySelfScroll,
+                deltaAvailableAfterScroll,
+                source
+            )
         return consumedByPreScroll + consumedBySelfScroll + consumedByPostScroll
     }
 
@@ -729,8 +702,10 @@
         return if (scrollableState.isScrollInProgress) {
             Offset.Zero
         } else {
-            scrollableState.dispatchRawDelta(scroll.toFloat().reverseIfNeeded())
-                .reverseIfNeeded().toOffset()
+            scrollableState
+                .dispatchRawDelta(scroll.toFloat().reverseIfNeeded())
+                .reverseIfNeeded()
+                .toOffset()
         }
     }
 
@@ -738,17 +713,13 @@
         val availableVelocity = initialVelocity.singleAxisVelocity()
 
         val performFling: suspend (Velocity) -> Velocity = { velocity ->
-            val preConsumedByParent = nestedScrollDispatcher
-                .dispatchPreFling(velocity)
+            val preConsumedByParent = nestedScrollDispatcher.dispatchPreFling(velocity)
             val available = velocity - preConsumedByParent
 
             val velocityLeft = doFlingAnimation(available)
 
             val consumedPost =
-                nestedScrollDispatcher.dispatchPostFling(
-                    (available - velocityLeft),
-                    velocityLeft
-                )
+                nestedScrollDispatcher.dispatchPostFling((available - velocityLeft), velocityLeft)
             val totalLeft = velocityLeft - consumedPost
             velocity - totalLeft
         }
@@ -765,19 +736,24 @@
         var result: Velocity = available
         scroll(scrollPriority = MutatePriority.Default) {
             val nestedScrollScope = this
-            val reverseScope = object : ScrollScope {
-                override fun scrollBy(pixels: Float): Float {
-                    return nestedScrollScope.scrollByWithOverscroll(
-                        offset = pixels.toOffset().reverseIfNeeded(),
-                        source = SideEffect
-                    ).toFloat().reverseIfNeeded()
+            val reverseScope =
+                object : ScrollScope {
+                    override fun scrollBy(pixels: Float): Float {
+                        return nestedScrollScope
+                            .scrollByWithOverscroll(
+                                offset = pixels.toOffset().reverseIfNeeded(),
+                                source = SideEffect
+                            )
+                            .toFloat()
+                            .reverseIfNeeded()
+                    }
                 }
-            }
             with(reverseScope) {
                 with(flingBehavior) {
-                    result = result.update(
-                        performFling(available.toFloat().reverseIfNeeded()).reverseIfNeeded()
-                    )
+                    result =
+                        result.update(
+                            performFling(available.toFloat().reverseIfNeeded()).reverseIfNeeded()
+                        )
                 }
             }
         }
@@ -785,13 +761,10 @@
     }
 
     fun shouldScrollImmediately(): Boolean {
-        return scrollableState.isScrollInProgress ||
-            overscrollEffect?.isInProgress ?: false
+        return scrollableState.isScrollInProgress || overscrollEffect?.isInProgress ?: false
     }
 
-    /**
-     * Opens a scrolling session with nested scrolling and overscroll support.
-     */
+    /** Opens a scrolling session with nested scrolling and overscroll support. */
     suspend fun scroll(
         scrollPriority: MutatePriority = MutatePriority.Default,
         block: suspend NestedScrollScope.() -> Unit
@@ -802,9 +775,7 @@
         }
     }
 
-    /**
-     * @return true if the pointer input should be reset
-     */
+    /** @return true if the pointer input should be reset */
     fun update(
         scrollableState: ScrollableState,
         orientation: Orientation,
@@ -835,9 +806,10 @@
     fun isVertical(): Boolean = orientation == Vertical
 }
 
-private val NoOpScrollScope: ScrollScope = object : ScrollScope {
-    override fun scrollBy(pixels: Float): Float = pixels
-}
+private val NoOpScrollScope: ScrollScope =
+    object : ScrollScope {
+        override fun scrollBy(pixels: Float): Float = pixels
+    }
 
 private class ScrollableNestedScrollConnection(
     val scrollingLogic: ScrollingLogic,
@@ -848,16 +820,14 @@
         consumed: Offset,
         available: Offset,
         source: NestedScrollSource
-    ): Offset = if (enabled) {
-        scrollingLogic.performRawScroll(available)
-    } else {
-        Offset.Zero
-    }
+    ): Offset =
+        if (enabled) {
+            scrollingLogic.performRawScroll(available)
+        } else {
+            Offset.Zero
+        }
 
-    override suspend fun onPostFling(
-        consumed: Velocity,
-        available: Velocity
-    ): Velocity {
+    override suspend fun onPostFling(consumed: Velocity, available: Velocity): Velocity {
         return if (enabled) {
             val velocityLeft = scrollingLogic.doFlingAnimation(available)
             available - velocityLeft
@@ -882,10 +852,11 @@
             if (abs(initialVelocity) > 1f) {
                 var velocityLeft = initialVelocity
                 var lastValue = 0f
-                val animationState = AnimationState(
-                    initialValue = 0f,
-                    initialVelocity = initialVelocity,
-                )
+                val animationState =
+                    AnimationState(
+                        initialValue = 0f,
+                        initialVelocity = initialVelocity,
+                    )
                 try {
                     animationState.animateDecay(flingDecay) {
                         val delta = value - lastValue
@@ -908,18 +879,17 @@
 }
 
 private const val DefaultScrollMotionDurationScaleFactor = 1f
-internal val DefaultScrollMotionDurationScale = object : MotionDurationScale {
-    override val scaleFactor: Float
-        get() = DefaultScrollMotionDurationScaleFactor
-}
+internal val DefaultScrollMotionDurationScale =
+    object : MotionDurationScale {
+        override val scaleFactor: Float
+            get() = DefaultScrollMotionDurationScaleFactor
+    }
 
 /**
  * (b/311181532): This could not be flattened so we moved it to TraversableNode, but ideally
  * ScrollabeNode should be the one to be travesable.
  */
-internal class ScrollableContainerNode(enabled: Boolean) :
-    Modifier.Node(),
-    TraversableNode {
+internal class ScrollableContainerNode(enabled: Boolean) : Modifier.Node(), TraversableNode {
     override val traverseKey: Any = TraverseKey
 
     var enabled: Boolean = enabled
@@ -932,31 +902,25 @@
     }
 }
 
-private val UnityDensity = object : Density {
-    override val density: Float
-        get() = 1f
-    override val fontScale: Float
-        get() = 1f
-}
+private val UnityDensity =
+    object : Density {
+        override val density: Float
+            get() = 1f
 
-/**
- * A scroll scope for nested scrolling and overscroll support.
- */
+        override val fontScale: Float
+            get() = 1f
+    }
+
+/** A scroll scope for nested scrolling and overscroll support. */
 internal interface NestedScrollScope {
-    fun scrollBy(
-        offset: Offset,
-        source: NestedScrollSource
-    ): Offset
+    fun scrollBy(offset: Offset, source: NestedScrollSource): Offset
 
-    fun scrollByWithOverscroll(
-        offset: Offset,
-        source: NestedScrollSource
-    ): Offset
+    fun scrollByWithOverscroll(offset: Offset, source: NestedScrollSource): Offset
 }
 
 /**
- * Scroll deltas originating from the semantics system. Should be dispatched as an animation
- * driven event.
+ * Scroll deltas originating from the semantics system. Should be dispatched as an animation driven
+ * event.
  */
 private suspend fun ScrollingLogic.semanticsScrollBy(offset: Offset): Offset {
     var previousValue = 0f
@@ -964,10 +928,9 @@
         animate(0f, offset.toFloat()) { currentValue, _ ->
             val delta = currentValue - previousValue
             val consumed =
-                scrollBy(
-                    offset = delta.reverseIfNeeded().toOffset(),
-                    source = UserInput
-                ).toFloat().reverseIfNeeded()
+                scrollBy(offset = delta.reverseIfNeeded().toOffset(), source = UserInput)
+                    .toFloat()
+                    .reverseIfNeeded()
             previousValue += consumed
         }
     }
diff --git a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/gestures/ScrollableState.kt b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/gestures/ScrollableState.kt
index 058d131..6ccf81b 100644
--- a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/gestures/ScrollableState.kt
+++ b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/gestures/ScrollableState.kt
@@ -26,12 +26,11 @@
 import kotlinx.coroutines.coroutineScope
 
 /**
- * An object representing something that can be scrolled. This interface is implemented by states
- * of scrollable containers such as [androidx.compose.foundation.lazy.LazyListState] or
+ * An object representing something that can be scrolled. This interface is implemented by states of
+ * scrollable containers such as [androidx.compose.foundation.lazy.LazyListState] or
  * [androidx.compose.foundation.ScrollState] in order to provide low-level scrolling control via
- * [scroll], as well as allowing for higher-level scrolling functions like
- * [animateScrollBy] to be implemented as extension
- * functions on [ScrollableState].
+ * [scroll], as well as allowing for higher-level scrolling functions like [animateScrollBy] to be
+ * implemented as extension functions on [ScrollableState].
  *
  * Subclasses may also have their own methods that are specific to their interaction paradigm, such
  * as [androidx.compose.foundation.lazy.LazyListState.scrollToItem].
@@ -44,8 +43,8 @@
     /**
      * Call this function to take control of scrolling and gain the ability to send scroll events
      * via [ScrollScope.scrollBy]. All actions that change the logical scroll position must be
-     * performed within a [scroll] block (even if they don't call any other methods on this
-     * object) in order to guarantee that mutual exclusion is enforced.
+     * performed within a [scroll] block (even if they don't call any other methods on this object)
+     * in order to guarantee that mutual exclusion is enforced.
      *
      * If [scroll] is called from elsewhere with the [scrollPriority] higher or equal to ongoing
      * scroll, ongoing scroll will be canceled.
@@ -62,20 +61,19 @@
      * scroll, won't stop ongoing scroll/drag animation and will bypass scrolling of any priority.
      * This method will also ignore `reverseDirection` and other parameters set in scrollable.
      *
-     * This method is used internally for nested scrolling dispatch and other low level
-     * operations, allowing implementers of [ScrollableState] influence the consumption as suits
-     * them. Manually dispatching delta via this method will likely result in a bad user experience,
-     * you must prefer [scroll] method over this one.
+     * This method is used internally for nested scrolling dispatch and other low level operations,
+     * allowing implementers of [ScrollableState] influence the consumption as suits them. Manually
+     * dispatching delta via this method will likely result in a bad user experience, you must
+     * prefer [scroll] method over this one.
      *
      * @param delta amount of scroll dispatched in the nested scroll process
-     *
      * @return the amount of delta consumed
      */
     fun dispatchRawDelta(delta: Float): Float
 
     /**
-     * Whether this [ScrollableState] is currently scrolling by gesture, fling or programmatically or
-     * not.
+     * Whether this [ScrollableState] is currently scrolling by gesture, fling or programmatically
+     * or not.
      */
     val isScrollInProgress: Boolean
 
@@ -127,8 +125,8 @@
 }
 
 /**
- * Default implementation of [ScrollableState] interface that contains necessary information about the
- * ongoing fling and provides smooth scrolling capabilities.
+ * Default implementation of [ScrollableState] interface that contains necessary information about
+ * the ongoing fling and provides smooth scrolling capabilities.
  *
  * This is the simplest way to set up a [scrollable] modifier. When constructing this
  * [ScrollableState], you must provide a [consumeScrollDelta] lambda, which will be invoked whenever
@@ -136,9 +134,9 @@
  * delta in pixels. The amount of scrolling delta consumed must be returned from this lambda to
  * ensure proper nested scrolling behaviour.
  *
- * @param consumeScrollDelta callback invoked when drag/fling/smooth scrolling occurs. The
- * callback receives the delta in pixels. Callers should update their state in this lambda and
- * return the amount of delta consumed
+ * @param consumeScrollDelta callback invoked when drag/fling/smooth scrolling occurs. The callback
+ *   receives the delta in pixels. Callers should update their state in this lambda and return the
+ *   amount of delta consumed
  */
 fun ScrollableState(consumeScrollDelta: (Float) -> Float): ScrollableState {
     return DefaultScrollableState(consumeScrollDelta)
@@ -154,9 +152,9 @@
  * delta in pixels. The amount of scrolling delta consumed must be returned from this lambda to
  * ensure proper nested scrolling behaviour.
  *
- * @param consumeScrollDelta callback invoked when drag/fling/smooth scrolling occurs. The
- * callback receives the delta in pixels. Callers should update their state in this lambda and
- * return the amount of delta consumed
+ * @param consumeScrollDelta callback invoked when drag/fling/smooth scrolling occurs. The callback
+ *   receives the delta in pixels. Callers should update their state in this lambda and return the
+ *   amount of delta consumed
  */
 @Composable
 fun rememberScrollableState(consumeScrollDelta: (Float) -> Float): ScrollableState {
@@ -164,9 +162,7 @@
     return remember { ScrollableState { lambdaState.value.invoke(it) } }
 }
 
-/**
- * Scope used for suspending scroll blocks
- */
+/** Scope used for suspending scroll blocks */
 interface ScrollScope {
     /**
      * Attempts to scroll forward by [pixels] px.
@@ -178,15 +174,16 @@
 
 private class DefaultScrollableState(val onDelta: (Float) -> Float) : ScrollableState {
 
-    private val scrollScope: ScrollScope = object : ScrollScope {
-        override fun scrollBy(pixels: Float): Float {
-            if (pixels.isNaN()) return 0f
-            val delta = onDelta(pixels)
-            isLastScrollForwardState.value = delta > 0
-            isLastScrollBackwardState.value = delta < 0
-            return delta
+    private val scrollScope: ScrollScope =
+        object : ScrollScope {
+            override fun scrollBy(pixels: Float): Float {
+                if (pixels.isNaN()) return 0f
+                val delta = onDelta(pixels)
+                isLastScrollForwardState.value = delta > 0
+                isLastScrollBackwardState.value = delta < 0
+                return delta
+            }
         }
-    }
 
     private val scrollMutex = MutatorMutex()
 
diff --git a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/gestures/TapGestureDetector.kt b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/gestures/TapGestureDetector.kt
index ce28eb7..db66f42 100644
--- a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/gestures/TapGestureDetector.kt
+++ b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/gestures/TapGestureDetector.kt
@@ -38,53 +38,52 @@
 import kotlinx.coroutines.sync.Mutex
 
 /**
- * Receiver scope for [detectTapGestures]'s `onPress` lambda. This offers
- * two methods to allow waiting for the press to be released.
+ * Receiver scope for [detectTapGestures]'s `onPress` lambda. This offers two methods to allow
+ * waiting for the press to be released.
  */
 @JvmDefaultWithCompatibility
 interface PressGestureScope : Density {
     /**
-     * Waits for the press to be released before returning. If the gesture was canceled by
-     * motion being consumed by another gesture, [GestureCancellationException] will be
-     * thrown.
+     * Waits for the press to be released before returning. If the gesture was canceled by motion
+     * being consumed by another gesture, [GestureCancellationException] will be thrown.
      */
     suspend fun awaitRelease()
 
     /**
-     * Waits for the press to be released before returning. If the press was released,
-     * `true` is returned, or if the gesture was canceled by motion being consumed by
-     * another gesture, `false` is returned.
+     * Waits for the press to be released before returning. If the press was released, `true` is
+     * returned, or if the gesture was canceled by motion being consumed by another gesture, `false`
+     * is returned.
      */
     suspend fun tryAwaitRelease(): Boolean
 }
 
-private val NoPressGesture: suspend PressGestureScope.(Offset) -> Unit = { }
+private val NoPressGesture: suspend PressGestureScope.(Offset) -> Unit = {}
 
 /**
  * Detects tap, double-tap, and long press gestures and calls [onTap], [onDoubleTap], and
- * [onLongPress], respectively, when detected. [onPress] is called when the press is detected
- * and the [PressGestureScope.tryAwaitRelease] and [PressGestureScope.awaitRelease] can be
- * used to detect when pointers have released or the gesture was canceled.
- * The first pointer down and final pointer up are consumed, and in the
- * case of long press, all changes after the long press is detected are consumed.
+ * [onLongPress], respectively, when detected. [onPress] is called when the press is detected and
+ * the [PressGestureScope.tryAwaitRelease] and [PressGestureScope.awaitRelease] can be used to
+ * detect when pointers have released or the gesture was canceled. The first pointer down and final
+ * pointer up are consumed, and in the case of long press, all changes after the long press is
+ * detected are consumed.
  *
  * Each function parameter receives an [Offset] representing the position relative to the containing
  * element. The [Offset] can be outside the actual bounds of the element itself meaning the numbers
  * can be negative or larger than the element bounds if the touch target is smaller than the
  * [ViewConfiguration.minimumTouchTargetSize].
  *
- * When [onDoubleTap] is provided, the tap gesture is detected only after
- * the [ViewConfiguration.doubleTapMinTimeMillis] has passed and [onDoubleTap] is called if the
- * second tap is started before [ViewConfiguration.doubleTapTimeoutMillis]. If [onDoubleTap] is not
+ * When [onDoubleTap] is provided, the tap gesture is detected only after the
+ * [ViewConfiguration.doubleTapMinTimeMillis] has passed and [onDoubleTap] is called if the second
+ * tap is started before [ViewConfiguration.doubleTapTimeoutMillis]. If [onDoubleTap] is not
  * provided, then [onTap] is called when the pointer up has been received.
  *
- * After the initial [onPress], if the pointer moves out of the input area, the position change
- * is consumed, or another gesture consumes the down or up events, the gestures are considered
- * canceled. That means [onDoubleTap], [onLongPress], and [onTap] will not be called after a
- * gesture has been canceled.
+ * After the initial [onPress], if the pointer moves out of the input area, the position change is
+ * consumed, or another gesture consumes the down or up events, the gestures are considered
+ * canceled. That means [onDoubleTap], [onLongPress], and [onTap] will not be called after a gesture
+ * has been canceled.
  *
- * If the first down event is consumed somewhere else, the entire gesture will be skipped,
- * including [onPress].
+ * If the first down event is consumed somewhere else, the entire gesture will be skipped, including
+ * [onPress].
  */
 suspend fun PointerInputScope.detectTapGestures(
     onDoubleTap: ((Offset) -> Unit)? = null,
@@ -99,37 +98,26 @@
     awaitEachGesture {
         val down = awaitFirstDown()
         down.consume()
-        launch {
-            pressScope.reset()
-        }
-        if (onPress !== NoPressGesture) launch {
-            pressScope.onPress(down.position)
-        }
-        val longPressTimeout = onLongPress?.let {
-            viewConfiguration.longPressTimeoutMillis
-        } ?: (Long.MAX_VALUE / 2)
+        launch { pressScope.reset() }
+        if (onPress !== NoPressGesture) launch { pressScope.onPress(down.position) }
+        val longPressTimeout =
+            onLongPress?.let { viewConfiguration.longPressTimeoutMillis } ?: (Long.MAX_VALUE / 2)
         var upOrCancel: PointerInputChange? = null
         try {
             // wait for first tap up or long press
-            upOrCancel = withTimeout(longPressTimeout) {
-                waitForUpOrCancellation()
-            }
+            upOrCancel = withTimeout(longPressTimeout) { waitForUpOrCancellation() }
             if (upOrCancel == null) {
                 launch {
                     pressScope.cancel() // tap-up was canceled
                 }
             } else {
                 upOrCancel.consume()
-                launch {
-                    pressScope.release()
-                }
+                launch { pressScope.release() }
             }
         } catch (_: PointerEventTimeoutCancellationException) {
             onLongPress?.invoke(down.position)
             consumeUntilUp()
-            launch {
-                pressScope.release()
-            }
+            launch { pressScope.release() }
         }
 
         if (upOrCancel != null) {
@@ -144,9 +132,7 @@
                     onTap?.invoke(upOrCancel.position) // no valid second tap started
                 } else {
                     // Second tap down detected
-                    launch {
-                        pressScope.reset()
-                    }
+                    launch { pressScope.reset() }
                     if (onPress !== NoPressGesture) {
                         launch { pressScope.onPress(secondDown.position) }
                     }
@@ -157,14 +143,10 @@
                             val secondUp = waitForUpOrCancellation()
                             if (secondUp != null) {
                                 secondUp.consume()
-                                launch {
-                                    pressScope.release()
-                                }
+                                launch { pressScope.release() }
                                 onDoubleTap(secondUp.position)
                             } else {
-                                launch {
-                                    pressScope.cancel()
-                                }
+                                launch { pressScope.cancel() }
                                 onTap?.invoke(upOrCancel.position)
                             }
                         }
@@ -176,9 +158,7 @@
                         // notify for the long press
                         onLongPress?.invoke(secondDown.position)
                         consumeUntilUp()
-                        launch {
-                            pressScope.release()
-                        }
+                        launch { pressScope.release() }
                     }
                 }
             }
@@ -187,8 +167,8 @@
 }
 
 /**
- * Consumes all pointer events until nothing is pressed and then returns. This method assumes
- * that something is currently pressed.
+ * Consumes all pointer events until nothing is pressed and then returns. This method assumes that
+ * something is currently pressed.
  */
 private suspend fun AwaitPointerEventScope.consumeUntilUp() {
     do {
@@ -198,21 +178,22 @@
 }
 
 /**
- * Waits for [ViewConfiguration.doubleTapTimeoutMillis] for a second press event. If a
- * second press event is received before the time out, it is returned or `null` is returned
- * if no second press is received.
+ * Waits for [ViewConfiguration.doubleTapTimeoutMillis] for a second press event. If a second press
+ * event is received before the time out, it is returned or `null` is returned if no second press is
+ * received.
  */
 private suspend fun AwaitPointerEventScope.awaitSecondDown(
     firstUp: PointerInputChange
-): PointerInputChange? = withTimeoutOrNull(viewConfiguration.doubleTapTimeoutMillis) {
-    val minUptime = firstUp.uptimeMillis + viewConfiguration.doubleTapMinTimeMillis
-    var change: PointerInputChange
-    // The second tap doesn't count if it happens before DoubleTapMinTime of the first tap
-    do {
-        change = awaitFirstDown()
-    } while (change.uptimeMillis < minUptime)
-    change
-}
+): PointerInputChange? =
+    withTimeoutOrNull(viewConfiguration.doubleTapTimeoutMillis) {
+        val minUptime = firstUp.uptimeMillis + viewConfiguration.doubleTapMinTimeMillis
+        var change: PointerInputChange
+        // The second tap doesn't count if it happens before DoubleTapMinTime of the first tap
+        do {
+            change = awaitFirstDown()
+        } while (change.uptimeMillis < minUptime)
+        change
+    }
 
 /**
  * Shortcut for cases when we only need to get press/click logic, as for cases without long press
@@ -230,16 +211,12 @@
     val pressScope = PressGestureScopeImpl(this)
     coroutineScope {
         awaitEachGesture {
-            launch {
-                pressScope.reset()
-            }
+            launch { pressScope.reset() }
 
             val down = awaitFirstDown().also { it.consume() }
 
             if (onPress !== NoPressGesture) {
-                launch {
-                    pressScope.onPress(down.position)
-                }
+                launch { pressScope.onPress(down.position) }
             }
 
             val up = waitForUpOrCancellation()
@@ -249,9 +226,7 @@
                 }
             } else {
                 up.consume()
-                launch {
-                    pressScope.release()
-                }
+                launch { pressScope.release() }
                 onTap?.invoke(up.position)
             }
         }
@@ -260,7 +235,8 @@
 
 @Deprecated(
     "Maintained for binary compatibility. Use version with PointerEventPass instead.",
-    level = DeprecationLevel.HIDDEN)
+    level = DeprecationLevel.HIDDEN
+)
 suspend fun AwaitPointerEventScope.awaitFirstDown(
     requireUnconsumed: Boolean = true
 ): PointerInputChange =
@@ -287,16 +263,16 @@
 
 @Deprecated(
     "Maintained for binary compatibility. Use version with PointerEventPass instead.",
-    level = DeprecationLevel.HIDDEN)
+    level = DeprecationLevel.HIDDEN
+)
 suspend fun AwaitPointerEventScope.waitForUpOrCancellation(): PointerInputChange? =
     waitForUpOrCancellation(PointerEventPass.Main)
 
 /**
- * Reads events in the given [pass] until all pointers are up or the gesture was canceled.
- * The gesture is considered canceled when a pointer leaves the event region, a position
- * change has been consumed or a pointer down change event was already consumed in the given
- * pass. If the gesture was not canceled, the final up change is returned or `null` if the
- * event was canceled.
+ * Reads events in the given [pass] until all pointers are up or the gesture was canceled. The
+ * gesture is considered canceled when a pointer leaves the event region, a position change has been
+ * consumed or a pointer down change event was already consumed in the given pass. If the gesture
+ * was not canceled, the final up change is returned or `null` if the event was canceled.
  */
 suspend fun AwaitPointerEventScope.waitForUpOrCancellation(
     pass: PointerEventPass = PointerEventPass.Main
@@ -308,9 +284,8 @@
             return event.changes[0]
         }
 
-        if (event.changes.fastAny {
-                it.isConsumed || it.isOutOfBounds(size, extendedTouchPadding)
-            }
+        if (
+            event.changes.fastAny { it.isConsumed || it.isOutOfBounds(size, extendedTouchPadding) }
         ) {
             return null // Canceled
         }
@@ -324,35 +299,25 @@
     }
 }
 
-/**
- * [detectTapGestures]'s implementation of [PressGestureScope].
- */
-internal class PressGestureScopeImpl(
-    density: Density
-) : PressGestureScope, Density by density {
+/** [detectTapGestures]'s implementation of [PressGestureScope]. */
+internal class PressGestureScopeImpl(density: Density) : PressGestureScope, Density by density {
     private var isReleased = false
     private var isCanceled = false
     private val mutex = Mutex(locked = false)
 
-    /**
-     * Called when a gesture has been canceled.
-     */
+    /** Called when a gesture has been canceled. */
     fun cancel() {
         isCanceled = true
         mutex.unlock()
     }
 
-    /**
-     * Called when all pointers are up.
-     */
+    /** Called when all pointers are up. */
     fun release() {
         isReleased = true
         mutex.unlock()
     }
 
-    /**
-     * Called when a new gesture has started.
-     */
+    /** Called when a new gesture has started. */
     suspend fun reset() {
         mutex.lock()
         isReleased = false
diff --git a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/gestures/TargetedFlingBehavior.kt b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/gestures/TargetedFlingBehavior.kt
index 388b65a..1165585 100644
--- a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/gestures/TargetedFlingBehavior.kt
+++ b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/gestures/TargetedFlingBehavior.kt
@@ -18,9 +18,7 @@
 
 import androidx.compose.runtime.Stable
 
-/**
- * Interface to specify fling behavior with additional information about its animation target.
- */
+/** Interface to specify fling behavior with additional information about its animation target. */
 @Stable
 interface TargetedFlingBehavior : FlingBehavior {
 
@@ -32,16 +30,15 @@
      * This functions is called with [ScrollScope] to drive the state change of the
      * [androidx.compose.foundation.gestures.ScrollableState] via [ScrollScope.scrollBy].
      *
-     * This function must return the correct velocity left after it is finished flinging in order
-     * to guarantee proper nested scroll support.
+     * This function must return the correct velocity left after it is finished flinging in order to
+     * guarantee proper nested scroll support.
      *
      * @param initialVelocity velocity available for fling in the orientation specified in
-     * [androidx.compose.foundation.gestures.scrollable] that invoked this method.
+     *   [androidx.compose.foundation.gestures.scrollable] that invoked this method.
      * @param onRemainingDistanceUpdated a lambda that will be called anytime the distance to the
-     * settling offset is updated. The settling offset in pixels is passed to this lambda an it
-     * represents the final offset where this fling will stop and may change depending on the
-     * snapping animation progression.
-     *
+     *   settling offset is updated. The settling offset in pixels is passed to this lambda an it
+     *   represents the final offset where this fling will stop and may change depending on the
+     *   snapping animation progression.
      * @return remaining velocity after fling operation has ended
      */
     suspend fun ScrollScope.performFling(
@@ -53,4 +50,4 @@
         performFling(initialVelocity, NoOnReport)
 }
 
-private val NoOnReport: (Float) -> Unit = { }
+private val NoOnReport: (Float) -> Unit = {}
diff --git a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/gestures/TransformGestureDetector.kt b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/gestures/TransformGestureDetector.kt
index 8d8c460..2aca3bb 100644
--- a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/gestures/TransformGestureDetector.kt
+++ b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/gestures/TransformGestureDetector.kt
@@ -29,19 +29,20 @@
 import kotlin.math.atan2
 
 /**
- * A gesture detector for rotation, panning, and zoom. Once touch slop has been reached, the
- * user can use rotation, panning and zoom gestures. [onGesture] will be called when any of the
- * rotation, zoom or pan occurs, passing the rotation angle in degrees, zoom in scale factor and
- * pan as an offset in pixels. Each of these changes is a difference between the previous call
- * and the current gesture. This will consume all position changes after touch slop has
- * been reached. [onGesture] will also provide centroid of all the pointers that are down.
+ * A gesture detector for rotation, panning, and zoom. Once touch slop has been reached, the user
+ * can use rotation, panning and zoom gestures. [onGesture] will be called when any of the rotation,
+ * zoom or pan occurs, passing the rotation angle in degrees, zoom in scale factor and pan as an
+ * offset in pixels. Each of these changes is a difference between the previous call and the current
+ * gesture. This will consume all position changes after touch slop has been reached. [onGesture]
+ * will also provide centroid of all the pointers that are down.
  *
  * If [panZoomLock] is `true`, rotation is allowed only if touch slop is detected for rotation
- * before pan or zoom motions. If not, pan and zoom gestures will be detected, but rotation
- * gestures will not be. If [panZoomLock] is `false`, once touch slop is reached, all three
- * gestures are detected.
+ * before pan or zoom motions. If not, pan and zoom gestures will be detected, but rotation gestures
+ * will not be. If [panZoomLock] is `false`, once touch slop is reached, all three gestures are
+ * detected.
  *
  * Example Usage:
+ *
  * @sample androidx.compose.foundation.samples.DetectTransformGestures
  */
 suspend fun PointerInputScope.detectTransformGestures(
@@ -75,9 +76,10 @@
                     val rotationMotion = abs(rotation * PI.toFloat() * centroidSize / 180f)
                     val panMotion = pan.getDistance()
 
-                    if (zoomMotion > touchSlop ||
-                        rotationMotion > touchSlop ||
-                        panMotion > touchSlop
+                    if (
+                        zoomMotion > touchSlop ||
+                            rotationMotion > touchSlop ||
+                            panMotion > touchSlop
                     ) {
                         pastTouchSlop = true
                         lockedToPanZoom = panZoomLock && rotationMotion < touchSlop
@@ -87,10 +89,7 @@
                 if (pastTouchSlop) {
                     val centroid = event.calculateCentroid(useCurrent = false)
                     val effectiveRotation = if (lockedToPanZoom) 0f else rotationChange
-                    if (effectiveRotation != 0f ||
-                        zoomChange != 1f ||
-                        panChange != Offset.Zero
-                    ) {
+                    if (effectiveRotation != 0f || zoomChange != 1f || panChange != Offset.Zero) {
                         onGesture(centroid, panChange, zoomChange, effectiveRotation)
                     }
                     event.changes.fastForEach {
@@ -106,10 +105,11 @@
 
 /**
  * Returns the rotation, in degrees, of the pointers between the
- * [PointerInputChange.previousPosition] and [PointerInputChange.position] states. Only
- * the pointers that are down in both previous and current states are considered.
+ * [PointerInputChange.previousPosition] and [PointerInputChange.position] states. Only the pointers
+ * that are down in both previous and current states are considered.
  *
  * Example Usage:
+ *
  * @sample androidx.compose.foundation.samples.CalculateRotation
  */
 fun PointerEvent.calculateRotation(): Float {
@@ -143,11 +143,12 @@
             // We weigh the rotation with the distance to the centroid. This gives
             // more weight to angle changes from pointers farther from the centroid than
             // those that are closer.
-            rotation += when {
-                angleDiff > 180f -> angleDiff - 360f
-                angleDiff < -180f -> angleDiff + 360f
-                else -> angleDiff
-            } * weight
+            rotation +=
+                when {
+                    angleDiff > 180f -> angleDiff - 360f
+                    angleDiff < -180f -> angleDiff + 360f
+                    else -> angleDiff
+                } * weight
 
             // weight its contribution by the distance to the centroid
             rotationWeight += weight
@@ -156,9 +157,7 @@
     return if (rotationWeight == 0f) 0f else rotation / rotationWeight
 }
 
-/**
- * Returns the angle of the [Offset] between -180 and 180, or 0 if [Offset.Zero].
- */
+/** Returns the angle of the [Offset] between -180 and 180, or 0 if [Offset.Zero]. */
 private fun Offset.angle(): Float =
     if (x == 0f && y == 0f) 0f else -atan2(x, y) * 180f / PI.toFloat()
 
@@ -167,6 +166,7 @@
  * [PointerInputChange.position] to determine how much zoom was intended.
  *
  * Example Usage:
+ *
  * @sample androidx.compose.foundation.samples.CalculateZoom
  */
 fun PointerEvent.calculateZoom(): Float {
@@ -180,10 +180,10 @@
 
 /**
  * Returns the change in the centroid location between the previous and the current pointers that
- * are down. Pointers that are newly down or raised are not considered in the centroid
- * movement.
+ * are down. Pointers that are newly down or raised are not considered in the centroid movement.
  *
  * Example Usage:
+ *
  * @sample androidx.compose.foundation.samples.CalculatePan
  */
 fun PointerEvent.calculatePan(): Offset {
@@ -196,13 +196,14 @@
 }
 
 /**
- * Returns the average distance from the centroid for all pointers that are currently
- * and were previously down. If no pointers are down, `0` is returned.
- * If [useCurrent] is `true`, the size of the [PointerInputChange.position] is returned and
- * if `false`, the size of [PointerInputChange.previousPosition] is returned. Only pointers that
- * are down in both the previous and current state are used to calculate the centroid size.
+ * Returns the average distance from the centroid for all pointers that are currently and were
+ * previously down. If no pointers are down, `0` is returned. If [useCurrent] is `true`, the size of
+ * the [PointerInputChange.position] is returned and if `false`, the size of
+ * [PointerInputChange.previousPosition] is returned. Only pointers that are down in both the
+ * previous and current state are used to calculate the centroid size.
  *
  * Example Usage:
+ *
  * @sample androidx.compose.foundation.samples.CalculateCentroidSize
  */
 fun PointerEvent.calculateCentroidSize(useCurrent: Boolean = true): Float {
@@ -224,18 +225,17 @@
 }
 
 /**
- * Returns the centroid of all pointers that are down and were previously down. If no pointers
- * are down, [Offset.Unspecified] is returned. If [useCurrent] is `true`, the centroid of the
+ * Returns the centroid of all pointers that are down and were previously down. If no pointers are
+ * down, [Offset.Unspecified] is returned. If [useCurrent] is `true`, the centroid of the
  * [PointerInputChange.position] is returned and if `false`, the centroid of the
  * [PointerInputChange.previousPosition] is returned. Only pointers that are down in both the
  * previous and current state are used to calculate the centroid.
  *
  * Example Usage:
+ *
  * @sample androidx.compose.foundation.samples.CalculateCentroidSize
  */
-fun PointerEvent.calculateCentroid(
-    useCurrent: Boolean = true
-): Offset {
+fun PointerEvent.calculateCentroid(useCurrent: Boolean = true): Offset {
     var centroid = Offset.Zero
     var centroidWeight = 0
 
diff --git a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/gestures/Transformable.kt b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/gestures/Transformable.kt
index 297c21c..cb9ba66 100644
--- a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/gestures/Transformable.kt
+++ b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/gestures/Transformable.kt
@@ -51,11 +51,12 @@
  * @sample androidx.compose.foundation.samples.TransformableSample
  *
  * @param state [TransformableState] of the transformable. Defines how transformation events will be
- * interpreted by the user land logic, contains useful information about on-going events and
- * provides animation capabilities.
+ *   interpreted by the user land logic, contains useful information about on-going events and
+ *   provides animation capabilities.
  * @param lockRotationOnZoomPan If `true`, rotation is allowed only if touch slop is detected for
- * rotation before pan or zoom motions. If not, pan and zoom gestures will be detected, but rotation
- * gestures will not be. If `false`, once touch slop is reached, all three gestures are detected.
+ *   rotation before pan or zoom motions. If not, pan and zoom gestures will be detected, but
+ *   rotation gestures will not be. If `false`, once touch slop is reached, all three gestures are
+ *   detected.
  * @param enabled whether zooming by gestures is enabled or not
  */
 @OptIn(ExperimentalFoundationApi::class)
@@ -75,15 +76,17 @@
  * This overload of transformable modifier provides [canPan] parameter, which allows the caller to
  * control when the pan can start. making pan gesture to not to start when the scale is 1f makes
  * transformable modifiers to work well within the scrollable container. See example:
+ *
  * @sample androidx.compose.foundation.samples.TransformableSampleInsideScroll
  *
  * @param state [TransformableState] of the transformable. Defines how transformation events will be
- * interpreted by the user land logic, contains useful information about on-going events and
- * provides animation capabilities.
+ *   interpreted by the user land logic, contains useful information about on-going events and
+ *   provides animation capabilities.
  * @param canPan whether the pan gesture can be performed or not given the pan offset
  * @param lockRotationOnZoomPan If `true`, rotation is allowed only if touch slop is detected for
- * rotation before pan or zoom motions. If not, pan and zoom gestures will be detected, but rotation
- * gestures will not be. If `false`, once touch slop is reached, all three gestures are detected.
+ *   rotation before pan or zoom motions. If not, pan and zoom gestures will be detected, but
+ *   rotation gestures will not be. If `false`, once touch slop is reached, all three gestures are
+ *   detected.
  * @param enabled whether zooming by gestures is enabled or not
  */
 @ExperimentalFoundationApi
@@ -100,9 +103,8 @@
     private val lockRotationOnZoomPan: Boolean,
     private val enabled: Boolean
 ) : ModifierNodeElement<TransformableNode>() {
-    override fun create(): TransformableNode = TransformableNode(
-        state, canPan, lockRotationOnZoomPan, enabled
-    )
+    override fun create(): TransformableNode =
+        TransformableNode(state, canPan, lockRotationOnZoomPan, enabled)
 
     override fun update(node: TransformableNode) {
         node.update(state, canPan, lockRotationOnZoomPan, enabled)
@@ -150,38 +152,45 @@
     private val updatedCanPan: (Offset) -> Boolean = { canPan.invoke(it) }
     private val channel = Channel<TransformEvent>(capacity = Channel.UNLIMITED)
 
-    private val pointerInputNode = delegate(SuspendingPointerInputModifierNode {
-        if (!enabled) return@SuspendingPointerInputModifierNode
-        coroutineScope {
-            launch(start = CoroutineStart.UNDISPATCHED) {
-                while (isActive) {
-                    var event = channel.receive()
-                    if (event !is TransformStarted) continue
-                    try {
-                        state.transform(MutatePriority.UserInput) {
-                            while (event !is TransformStopped) {
-                                (event as? TransformDelta)?.let {
-                                    transformBy(it.zoomChange, it.panChange, it.rotationChange)
+    private val pointerInputNode =
+        delegate(
+            SuspendingPointerInputModifierNode {
+                if (!enabled) return@SuspendingPointerInputModifierNode
+                coroutineScope {
+                    launch(start = CoroutineStart.UNDISPATCHED) {
+                        while (isActive) {
+                            var event = channel.receive()
+                            if (event !is TransformStarted) continue
+                            try {
+                                state.transform(MutatePriority.UserInput) {
+                                    while (event !is TransformStopped) {
+                                        (event as? TransformDelta)?.let {
+                                            transformBy(
+                                                it.zoomChange,
+                                                it.panChange,
+                                                it.rotationChange
+                                            )
+                                        }
+                                        event = channel.receive()
+                                    }
                                 }
-                                event = channel.receive()
+                            } catch (_: CancellationException) {
+                                // ignore the cancellation and start over again.
                             }
                         }
-                    } catch (_: CancellationException) {
-                        // ignore the cancellation and start over again.
+                    }
+                    awaitEachGesture {
+                        try {
+                            detectZoom(lockRotationOnZoomPan, channel, updatedCanPan)
+                        } catch (exception: CancellationException) {
+                            if (!isActive) throw exception
+                        } finally {
+                            channel.trySend(TransformStopped)
+                        }
                     }
                 }
             }
-            awaitEachGesture {
-                try {
-                    detectZoom(lockRotationOnZoomPan, channel, updatedCanPan)
-                } catch (exception: CancellationException) {
-                    if (!isActive) throw exception
-                } finally {
-                    channel.trySend(TransformStopped)
-                }
-            }
-        }
-    })
+        )
 
     fun update(
         state: TransformableState,
@@ -190,9 +199,10 @@
         enabled: Boolean
     ) {
         this.canPan = canPan
-        val needsReset = this.state != state ||
-            this.enabled != enabled ||
-            this.lockRotationOnZoomPan != lockRotationOnZoomPan
+        val needsReset =
+            this.state != state ||
+                this.enabled != enabled ||
+                this.lockRotationOnZoomPan != lockRotationOnZoomPan
         if (needsReset) {
             this.state = state
             this.enabled = enabled
@@ -232,9 +242,10 @@
                 val rotationMotion = abs(rotation * PI.toFloat() * centroidSize / 180f)
                 val panMotion = pan.getDistance()
 
-                if (zoomMotion > touchSlop ||
-                    rotationMotion > touchSlop ||
-                    (panMotion > touchSlop && canPan.invoke(panChange))
+                if (
+                    zoomMotion > touchSlop ||
+                        rotationMotion > touchSlop ||
+                        (panMotion > touchSlop && canPan.invoke(panChange))
                 ) {
                     pastTouchSlop = true
                     lockedToPanZoom = panZoomLock && rotationMotion < touchSlop
@@ -244,9 +255,10 @@
 
             if (pastTouchSlop) {
                 val effectiveRotation = if (lockedToPanZoom) 0f else rotationChange
-                if (effectiveRotation != 0f ||
-                    zoomChange != 1f ||
-                    (panChange != Offset.Zero && canPan.invoke(panChange))
+                if (
+                    effectiveRotation != 0f ||
+                        zoomChange != 1f ||
+                        (panChange != Offset.Zero && canPan.invoke(panChange))
                 ) {
                     channel.trySend(TransformDelta(zoomChange, panChange, effectiveRotation))
                 }
@@ -267,10 +279,9 @@
 
 private sealed class TransformEvent {
     object TransformStarted : TransformEvent()
+
     object TransformStopped : TransformEvent()
-    class TransformDelta(
-        val zoomChange: Float,
-        val panChange: Offset,
-        val rotationChange: Float
-    ) : TransformEvent()
+
+    class TransformDelta(val zoomChange: Float, val panChange: Offset, val rotationChange: Float) :
+        TransformEvent()
 }
diff --git a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/gestures/TransformableState.kt b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/gestures/TransformableState.kt
index 93b1cec..2779e21 100644
--- a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/gestures/TransformableState.kt
+++ b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/gestures/TransformableState.kt
@@ -33,17 +33,17 @@
 import kotlinx.coroutines.coroutineScope
 
 /**
- * State of [transformable]. Allows for a granular control of how different gesture
- * transformations are consumed by the user as well as to write custom transformation methods
- * using [transform] suspend function.
+ * State of [transformable]. Allows for a granular control of how different gesture transformations
+ * are consumed by the user as well as to write custom transformation methods using [transform]
+ * suspend function.
  */
 @JvmDefaultWithCompatibility
 interface TransformableState {
     /**
      * Call this function to take control of transformations and gain the ability to send transform
-     * events via [TransformScope.transformBy]. All actions that change zoom, pan or rotation
-     * values must be performed within a [transform] block (even if they don't call any other
-     * methods on this object) in order to guarantee that mutual exclusion is enforced.
+     * events via [TransformScope.transformBy]. All actions that change zoom, pan or rotation values
+     * must be performed within a [transform] block (even if they don't call any other methods on
+     * this object) in order to guarantee that mutual exclusion is enforced.
      *
      * If [transform] is called from elsewhere with the [transformPriority] higher or equal to
      * ongoing transform, ongoing transform will be canceled.
@@ -60,14 +60,12 @@
     val isTransformInProgress: Boolean
 }
 
-/**
- * Scope used for suspending transformation operations
- */
+/** Scope used for suspending transformation operations */
 @JvmDefaultWithCompatibility
 interface TransformScope {
     /**
-     * Attempts to transform by [zoomChange] in relative multiplied value, by [panChange] in
-     * pixels and by [rotationChange] in degrees.
+     * Attempts to transform by [zoomChange] in relative multiplied value, by [panChange] in pixels
+     * and by [rotationChange] in degrees.
      *
      * @param zoomChange scale factor multiplier change for zoom
      * @param panChange panning offset change, in [Offset] pixels
@@ -90,8 +88,8 @@
  * call) with the deltas from the previous event.
  *
  * @param onTransformation callback invoked when transformation occurs. The callback receives the
- * change from the previous event. It's relative scale multiplier for zoom, [Offset] in pixels
- * for pan and degrees for rotation. Callers should update their state in this lambda.
+ *   change from the previous event. It's relative scale multiplier for zoom, [Offset] in pixels for
+ *   pan and degrees for rotation. Callers should update their state in this lambda.
  */
 fun TransformableState(
     onTransformation: (zoomChange: Float, panChange: Offset, rotationChange: Float) -> Unit
@@ -108,8 +106,8 @@
  * call) with the deltas from the previous event.
  *
  * @param onTransformation callback invoked when transformation occurs. The callback receives the
- * change from the previous event. It's relative scale multiplier for zoom, [Offset] in pixels
- * for pan and degrees for rotation. Callers should update their state in this lambda.
+ *   change from the previous event. It's relative scale multiplier for zoom, [Offset] in pixels for
+ *   pan and degrees for rotation. Callers should update their state in this lambda.
  */
 @Composable
 fun rememberTransformableState(
@@ -122,17 +120,15 @@
 /**
  * Animate zoom by a ratio of [zoomFactor] over the current size and suspend until its finished.
  *
- * @param zoomFactor ratio over the current size by which to zoom. For example, if [zoomFactor]
- * is `3f`, zoom will be increased 3 fold from the current value.
+ * @param zoomFactor ratio over the current size by which to zoom. For example, if [zoomFactor] is
+ *   `3f`, zoom will be increased 3 fold from the current value.
  * @param animationSpec [AnimationSpec] to be used for animation
  */
 suspend fun TransformableState.animateZoomBy(
     zoomFactor: Float,
     animationSpec: AnimationSpec<Float> = SpringSpec(stiffness = Spring.StiffnessLow)
 ) {
-    require(zoomFactor > 0) {
-        "zoom value should be greater than 0"
-    }
+    require(zoomFactor > 0) { "zoom value should be greater than 0" }
     var previous = 1f
     transform {
         AnimationState(initialValue = previous).animateTo(zoomFactor, animationSpec) {
@@ -175,15 +171,14 @@
 ) {
     var previous = Offset.Zero
     transform {
-        AnimationState(
-            typeConverter = Offset.VectorConverter,
-            initialValue = previous
-        )
-            .animateTo(offset, animationSpec) {
-                val delta = this.value - previous
-                transformBy(panChange = delta)
-                previous = this.value
-            }
+        AnimationState(typeConverter = Offset.VectorConverter, initialValue = previous).animateTo(
+            offset,
+            animationSpec
+        ) {
+            val delta = this.value - previous
+            transformBy(panChange = delta)
+            previous = this.value
+        }
     }
 }
 
@@ -211,9 +206,7 @@
  *
  * @param offset offset in pixels by which to pan
  */
-suspend fun TransformableState.panBy(offset: Offset) = transform {
-    transformBy(1f, offset, 0f)
-}
+suspend fun TransformableState.panBy(offset: Offset) = transform { transformBy(1f, offset, 0f) }
 
 /**
  * Stop and suspend until any ongoing [TransformableState.transform] with priority
@@ -233,10 +226,11 @@
     val onTransformation: (zoomChange: Float, panChange: Offset, rotationChange: Float) -> Unit
 ) : TransformableState {
 
-    private val transformScope: TransformScope = object : TransformScope {
-        override fun transformBy(zoomChange: Float, panChange: Offset, rotationChange: Float) =
-            onTransformation(zoomChange, panChange, rotationChange)
-    }
+    private val transformScope: TransformScope =
+        object : TransformScope {
+            override fun transformBy(zoomChange: Float, panChange: Offset, rotationChange: Float) =
+                onTransformation(zoomChange, panChange, rotationChange)
+        }
 
     private val transformMutex = MutatorMutex()
 
diff --git a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/gestures/UpdatableAnimationState.kt b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/gestures/UpdatableAnimationState.kt
index d6a703e..e6890fd 100644
--- a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/gestures/UpdatableAnimationState.kt
+++ b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/gestures/UpdatableAnimationState.kt
@@ -34,9 +34,9 @@
  * zero.
  *
  * Unlike the standard [AnimationState], this class allows the value to be changed while the
- * animation is running. When that happens, the next frame will continue animating the new value
- * to zero as though the previous animation was interrupted and restarted with the new value. See
- * the docs on [animateToZero] for more information.
+ * animation is running. When that happens, the next frame will continue animating the new value to
+ * zero as though the previous animation was interrupted and restarted with the new value. See the
+ * docs on [animateToZero] for more information.
  *
  * An analogy for how this animation works is gravity – you can pick something up, and as soon as
  * you let it go it will start falling to the ground. If you catch it and raise it higher, it will
@@ -68,19 +68,19 @@
     var value: Float = 0f
 
     /**
-     * Starts animating [value] to 0f. This function will suspend until [value] actually reaches
-     * 0f – e.g. if [value] is reset to a non-zero value on every frame, it will never return. When
+     * Starts animating [value] to 0f. This function will suspend until [value] actually reaches 0f
+     * – e.g. if [value] is reset to a non-zero value on every frame, it will never return. When
      * this function does return, [value] will have been set to exactly 0f.
      *
      * If this function is called more than once concurrently, it will throw.
      *
      * @param beforeFrame Called _inside_ the choreographer callback on every frame with the
-     * difference between the previous value and the new value. This corresponds to the typical
-     * frame callback used in the other animation APIs and [withFrameNanos]. It runs before
-     * composition, layout, and other passes for the frame.
+     *   difference between the previous value and the new value. This corresponds to the typical
+     *   frame callback used in the other animation APIs and [withFrameNanos]. It runs before
+     *   composition, layout, and other passes for the frame.
      * @param afterFrame Called _outside_ the choreographer callback for every frame, _after_ the
-     * composition and layout passes have finished running for that frame. This function allows the
-     * caller to update [value] based on any layout changes performed in [beforeFrame].
+     *   composition and layout passes have finished running for that frame. This function allows
+     *   the caller to update [value] based on any layout changes performed in [beforeFrame].
      */
     @OptIn(ExperimentalContracts::class)
     suspend fun animateToZero(
@@ -104,29 +104,34 @@
                     }
 
                     val vectorizedCurrentValue = AnimationVector1D(value)
-                    val playTime = if (durationScale == 0f) {
-                        // The duration scale will be 0 when animations are disabled via a11y
-                        // settings or developer settings.
-                        vectorizedSpec.getDurationNanos(
-                            initialValue = AnimationVector1D(value),
+                    val playTime =
+                        if (durationScale == 0f) {
+                            // The duration scale will be 0 when animations are disabled via a11y
+                            // settings or developer settings.
+                            vectorizedSpec.getDurationNanos(
+                                initialValue = AnimationVector1D(value),
+                                targetValue = ZeroVector,
+                                initialVelocity = lastVelocity
+                            )
+                        } else {
+                            ((frameTime - lastFrameTime) / durationScale).roundToLong()
+                        }
+                    val newValue =
+                        vectorizedSpec
+                            .getValueFromNanos(
+                                playTimeNanos = playTime,
+                                initialValue = vectorizedCurrentValue,
+                                targetValue = ZeroVector,
+                                initialVelocity = lastVelocity
+                            )
+                            .value
+                    lastVelocity =
+                        vectorizedSpec.getVelocityFromNanos(
+                            playTimeNanos = playTime,
+                            initialValue = vectorizedCurrentValue,
                             targetValue = ZeroVector,
                             initialVelocity = lastVelocity
                         )
-                    } else {
-                        ((frameTime - lastFrameTime) / durationScale).roundToLong()
-                    }
-                    val newValue = vectorizedSpec.getValueFromNanos(
-                        playTimeNanos = playTime,
-                        initialValue = vectorizedCurrentValue,
-                        targetValue = ZeroVector,
-                        initialVelocity = lastVelocity
-                    ).value
-                    lastVelocity = vectorizedSpec.getVelocityFromNanos(
-                        playTimeNanos = playTime,
-                        initialValue = vectorizedCurrentValue,
-                        targetValue = ZeroVector,
-                        initialVelocity = lastVelocity
-                    )
                     lastFrameTime = frameTime
 
                     val delta = value - newValue
diff --git a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/gestures/snapping/LazyGridSnapLayoutInfoProvider.kt b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/gestures/snapping/LazyGridSnapLayoutInfoProvider.kt
index d32ce49..d8d4a34 100644
--- a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/gestures/snapping/LazyGridSnapLayoutInfoProvider.kt
+++ b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/gestures/snapping/LazyGridSnapLayoutInfoProvider.kt
@@ -31,84 +31,82 @@
  * A [SnapLayoutInfoProvider] for LazyGrids.
  *
  * @param lazyGridState The [LazyGridState] with information about the current state of the grid
- * @param snapPosition The desired positioning of the snapped item within the main layout.
- * This position should be considered with regards to the start edge of the item and the placement
- * within the viewport.
- *
+ * @param snapPosition The desired positioning of the snapped item within the main layout. This
+ *   position should be considered with regards to the start edge of the item and the placement
+ *   within the viewport.
  * @return A [SnapLayoutInfoProvider] that can be used with [snapFlingBehavior]
  */
 fun SnapLayoutInfoProvider(
     lazyGridState: LazyGridState,
     snapPosition: SnapPosition = SnapPosition.Center
-) = object : SnapLayoutInfoProvider {
-    private val layoutInfo: LazyGridLayoutInfo
-        get() = lazyGridState.layoutInfo
+) =
+    object : SnapLayoutInfoProvider {
+        private val layoutInfo: LazyGridLayoutInfo
+            get() = lazyGridState.layoutInfo
 
-    private val averageItemSize: Int
-        get() {
-            val layoutInfo = layoutInfo
-            return if (layoutInfo.visibleItemsInfo.isEmpty()) {
-                0
-            } else {
-                val numberOfItems = layoutInfo.visibleItemsInfo.size
-                layoutInfo.visibleItemsInfo.sumOf {
-                    it.sizeOnMainAxis(layoutInfo.orientation)
-                } / numberOfItems
+        private val averageItemSize: Int
+            get() {
+                val layoutInfo = layoutInfo
+                return if (layoutInfo.visibleItemsInfo.isEmpty()) {
+                    0
+                } else {
+                    val numberOfItems = layoutInfo.visibleItemsInfo.size
+                    layoutInfo.visibleItemsInfo.sumOf {
+                        it.sizeOnMainAxis(layoutInfo.orientation)
+                    } / numberOfItems
+                }
             }
+
+        override fun calculateApproachOffset(velocity: Float, decayOffset: Float): Float {
+            return (decayOffset.absoluteValue - averageItemSize).coerceAtLeast(0.0f) *
+                decayOffset.sign
         }
 
-    override fun calculateApproachOffset(velocity: Float, decayOffset: Float): Float {
-        return (decayOffset.absoluteValue - averageItemSize)
-            .coerceAtLeast(0.0f) * decayOffset.sign
-    }
+        override fun calculateSnapOffset(velocity: Float): Float {
+            var distanceFromItemBeforeTarget = Float.NEGATIVE_INFINITY
+            var distanceFromItemAfterTarget = Float.POSITIVE_INFINITY
 
-    override fun calculateSnapOffset(
-        velocity: Float
-    ): Float {
-        var distanceFromItemBeforeTarget = Float.NEGATIVE_INFINITY
-        var distanceFromItemAfterTarget = Float.POSITIVE_INFINITY
+            layoutInfo.visibleItemsInfo.fastForEach { item ->
+                val distance =
+                    calculateDistanceToDesiredSnapPosition(
+                        mainAxisViewPortSize = layoutInfo.singleAxisViewportSize,
+                        beforeContentPadding = layoutInfo.beforeContentPadding,
+                        afterContentPadding = layoutInfo.afterContentPadding,
+                        itemSize = item.sizeOnMainAxis(orientation = layoutInfo.orientation),
+                        itemOffset = item.offsetOnMainAxis(orientation = layoutInfo.orientation),
+                        itemIndex = item.index,
+                        snapPosition = snapPosition,
+                        itemCount = layoutInfo.totalItemsCount
+                    )
 
-        layoutInfo.visibleItemsInfo.fastForEach { item ->
-            val distance =
-                calculateDistanceToDesiredSnapPosition(
-                    mainAxisViewPortSize = layoutInfo.singleAxisViewportSize,
-                    beforeContentPadding = layoutInfo.beforeContentPadding,
-                    afterContentPadding = layoutInfo.afterContentPadding,
-                    itemSize = item.sizeOnMainAxis(orientation = layoutInfo.orientation),
-                    itemOffset = item.offsetOnMainAxis(orientation = layoutInfo.orientation),
-                    itemIndex = item.index,
-                    snapPosition = snapPosition,
-                    itemCount = layoutInfo.totalItemsCount
-                )
+                // Find item that is closest to the center
+                if (distance <= 0 && distance > distanceFromItemBeforeTarget) {
+                    distanceFromItemBeforeTarget = distance
+                }
 
-            // Find item that is closest to the center
-            if (distance <= 0 && distance > distanceFromItemBeforeTarget) {
-                distanceFromItemBeforeTarget = distance
+                // Find item that is closest to center, but after it
+                if (distance >= 0 && distance < distanceFromItemAfterTarget) {
+                    distanceFromItemAfterTarget = distance
+                }
             }
 
-            // Find item that is closest to center, but after it
-            if (distance >= 0 && distance < distanceFromItemAfterTarget) {
-                distanceFromItemAfterTarget = distance
-            }
+            return calculateFinalOffset(
+                with(lazyGridState.density) { calculateFinalSnappingItem(velocity) },
+                distanceFromItemBeforeTarget,
+                distanceFromItemAfterTarget
+            )
         }
-
-        return calculateFinalOffset(
-            with(lazyGridState.density) { calculateFinalSnappingItem(velocity) },
-            distanceFromItemBeforeTarget,
-            distanceFromItemAfterTarget
-        )
     }
-}
 
 /**
- * Create and remember a FlingBehavior for decayed snapping in Lazy Grids. This will snap
- * the item according to [snapPosition].
+ * Create and remember a FlingBehavior for decayed snapping in Lazy Grids. This will snap the item
+ * according to [snapPosition].
  *
- * @param lazyGridState The [LazyGridState] from the LazyGrid where this [FlingBehavior] will
- * be used.
- * @param snapPosition The desired positioning of the snapped item within the main layout.
- * This position should be considered with regards to the start edge of the item and the placement
- * within the viewport.
+ * @param lazyGridState The [LazyGridState] from the LazyGrid where this [FlingBehavior] will be
+ *   used.
+ * @param snapPosition The desired positioning of the snapped item within the main layout. This
+ *   position should be considered with regards to the start edge of the item and the placement
+ *   within the viewport.
  */
 @Composable
 fun rememberSnapFlingBehavior(
@@ -121,11 +119,12 @@
 }
 
 internal val LazyGridLayoutInfo.singleAxisViewportSize: Int
-    get() = if (orientation == Orientation.Vertical) {
-        viewportSize.height
-    } else {
-        viewportSize.width
-    }
+    get() =
+        if (orientation == Orientation.Vertical) {
+            viewportSize.height
+        } else {
+            viewportSize.width
+        }
 
 internal fun LazyGridItemInfo.sizeOnMainAxis(orientation: Orientation): Int {
     return if (orientation == Orientation.Vertical) {
diff --git a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/gestures/snapping/LazyListSnapLayoutInfoProvider.kt b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/gestures/snapping/LazyListSnapLayoutInfoProvider.kt
index bd6dd3b..062e0e5 100644
--- a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/gestures/snapping/LazyListSnapLayoutInfoProvider.kt
+++ b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/gestures/snapping/LazyListSnapLayoutInfoProvider.kt
@@ -31,83 +31,81 @@
  * A [SnapLayoutInfoProvider] for LazyLists.
  *
  * @param lazyListState The [LazyListState] with information about the current state of the list
- * @param snapPosition The desired positioning of the snapped item within the main layout.
- * This position should be considered with regard to the start edge of the item and the placement
- * within the viewport.
- *
+ * @param snapPosition The desired positioning of the snapped item within the main layout. This
+ *   position should be considered with regard to the start edge of the item and the placement
+ *   within the viewport.
  * @return A [SnapLayoutInfoProvider] that can be used with [snapFlingBehavior]
  */
 fun SnapLayoutInfoProvider(
     lazyListState: LazyListState,
     snapPosition: SnapPosition = SnapPosition.Center
-): SnapLayoutInfoProvider = object : SnapLayoutInfoProvider {
+): SnapLayoutInfoProvider =
+    object : SnapLayoutInfoProvider {
 
-    private val layoutInfo: LazyListLayoutInfo
-        get() = lazyListState.layoutInfo
+        private val layoutInfo: LazyListLayoutInfo
+            get() = lazyListState.layoutInfo
 
-    private val averageItemSize: Int
-        get() {
-            val layoutInfo = layoutInfo
-            return if (layoutInfo.visibleItemsInfo.isEmpty()) {
-                0
-            } else {
-                val numberOfItems = layoutInfo.visibleItemsInfo.size
-                layoutInfo.visibleItemsInfo.sumOf {
-                    it.size
-                } / numberOfItems
+        private val averageItemSize: Int
+            get() {
+                val layoutInfo = layoutInfo
+                return if (layoutInfo.visibleItemsInfo.isEmpty()) {
+                    0
+                } else {
+                    val numberOfItems = layoutInfo.visibleItemsInfo.size
+                    layoutInfo.visibleItemsInfo.sumOf { it.size } / numberOfItems
+                }
             }
+
+        override fun calculateApproachOffset(velocity: Float, decayOffset: Float): Float {
+            return (decayOffset.absoluteValue - averageItemSize).coerceAtLeast(0.0f) *
+                decayOffset.sign
         }
 
-    override fun calculateApproachOffset(velocity: Float, decayOffset: Float): Float {
-        return (decayOffset.absoluteValue - averageItemSize)
-            .coerceAtLeast(0.0f) * decayOffset.sign
-    }
+        override fun calculateSnapOffset(velocity: Float): Float {
+            var lowerBoundOffset = Float.NEGATIVE_INFINITY
+            var upperBoundOffset = Float.POSITIVE_INFINITY
 
-    override fun calculateSnapOffset(velocity: Float): Float {
-        var lowerBoundOffset = Float.NEGATIVE_INFINITY
-        var upperBoundOffset = Float.POSITIVE_INFINITY
+            layoutInfo.visibleItemsInfo.fastForEach { item ->
+                val offset =
+                    calculateDistanceToDesiredSnapPosition(
+                        mainAxisViewPortSize = layoutInfo.singleAxisViewportSize,
+                        beforeContentPadding = layoutInfo.beforeContentPadding,
+                        afterContentPadding = layoutInfo.afterContentPadding,
+                        itemSize = item.size,
+                        itemOffset = item.offset,
+                        itemIndex = item.index,
+                        snapPosition = snapPosition,
+                        itemCount = layoutInfo.totalItemsCount
+                    )
 
-        layoutInfo.visibleItemsInfo.fastForEach { item ->
-            val offset =
-                calculateDistanceToDesiredSnapPosition(
-                    mainAxisViewPortSize = layoutInfo.singleAxisViewportSize,
-                    beforeContentPadding = layoutInfo.beforeContentPadding,
-                    afterContentPadding = layoutInfo.afterContentPadding,
-                    itemSize = item.size,
-                    itemOffset = item.offset,
-                    itemIndex = item.index,
-                    snapPosition = snapPosition,
-                    itemCount = layoutInfo.totalItemsCount
-                )
+                // Find item that is closest to the center
+                if (offset <= 0 && offset > lowerBoundOffset) {
+                    lowerBoundOffset = offset
+                }
 
-            // Find item that is closest to the center
-            if (offset <= 0 && offset > lowerBoundOffset) {
-                lowerBoundOffset = offset
+                // Find item that is closest to center, but after it
+                if (offset >= 0 && offset < upperBoundOffset) {
+                    upperBoundOffset = offset
+                }
             }
 
-            // Find item that is closest to center, but after it
-            if (offset >= 0 && offset < upperBoundOffset) {
-                upperBoundOffset = offset
-            }
+            return calculateFinalOffset(
+                with(lazyListState.density) { calculateFinalSnappingItem(velocity) },
+                lowerBoundOffset,
+                upperBoundOffset
+            )
         }
-
-        return calculateFinalOffset(
-            with(lazyListState.density) { calculateFinalSnappingItem(velocity) },
-            lowerBoundOffset,
-            upperBoundOffset
-        )
     }
-}
 
 /**
- * Create and remember a FlingBehavior for decayed snapping in Lazy Lists. This will snap
- * the item according to [snapPosition].
+ * Create and remember a FlingBehavior for decayed snapping in Lazy Lists. This will snap the item
+ * according to [snapPosition].
  *
- * @param lazyListState The [LazyListState] from the LazyList where this [FlingBehavior] will
- * be used.
- * @param snapPosition The desired positioning of the snapped item within the main layout.
- * This position should be considered with regards to the start edge of the item and the placement
- * within the viewport.
+ * @param lazyListState The [LazyListState] from the LazyList where this [FlingBehavior] will be
+ *   used.
+ * @param snapPosition The desired positioning of the snapped item within the main layout. This
+ *   position should be considered with regards to the start edge of the item and the placement
+ *   within the viewport.
  */
 @Composable
 fun rememberSnapFlingBehavior(
@@ -123,9 +121,8 @@
     get() = if (orientation == Orientation.Vertical) viewportSize.height else viewportSize.width
 
 @kotlin.jvm.JvmInline
-internal value class FinalSnappingItem internal constructor(
-    @Suppress("unused") private val value: Int
-) {
+internal value class FinalSnappingItem
+internal constructor(@Suppress("unused") private val value: Int) {
     companion object {
 
         val ClosestItem: FinalSnappingItem = FinalSnappingItem(0)
diff --git a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/gestures/snapping/PagerSnapLayoutInfoProvider.kt b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/gestures/snapping/PagerSnapLayoutInfoProvider.kt
index f33de5c..4900cf0 100644
--- a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/gestures/snapping/PagerSnapLayoutInfoProvider.kt
+++ b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/gestures/snapping/PagerSnapLayoutInfoProvider.kt
@@ -47,11 +47,7 @@
             val (lowerBoundOffset, upperBoundOffset) = searchForSnappingBounds(snapPosition)
 
             val finalDistance =
-                calculateFinalSnappingBound(
-                    velocity,
-                    lowerBoundOffset,
-                    upperBoundOffset
-                )
+                calculateFinalSnappingBound(velocity, lowerBoundOffset, upperBoundOffset)
 
             check(
                 finalDistance == lowerBoundOffset ||
@@ -70,21 +66,19 @@
             }
         }
 
-        override fun calculateApproachOffset(
-            velocity: Float,
-            decayOffset: Float
-        ): Float {
+        override fun calculateApproachOffset(velocity: Float, decayOffset: Float): Float {
             debugLog { "Approach Velocity=$velocity" }
             val effectivePageSizePx = pagerState.pageSize + pagerState.pageSpacing
 
             // given this velocity, where can I go with a decay animation.
             val animationOffsetPx = decayOffset
 
-            val startPage = if (velocity < 0) {
-                pagerState.firstVisiblePage + 1
-            } else {
-                pagerState.firstVisiblePage
-            }
+            val startPage =
+                if (velocity < 0) {
+                    pagerState.firstVisiblePage + 1
+                } else {
+                    pagerState.firstVisiblePage
+                }
 
             debugLog {
                 "\nAnimation Offset=$animationOffsetPx " +
@@ -104,13 +98,16 @@
             debugLog { "Fling Target Page=$targetPage" }
 
             // Apply the snap distance suggestion.
-            val correctedTargetPage = pagerSnapDistance.calculateTargetPage(
-                startPage,
-                targetPage,
-                velocity,
-                pagerState.pageSize,
-                pagerState.pageSpacing
-            ).coerceIn(0, pagerState.pageCount)
+            val correctedTargetPage =
+                pagerSnapDistance
+                    .calculateTargetPage(
+                        startPage,
+                        targetPage,
+                        velocity,
+                        pagerState.pageSize,
+                        pagerState.pageSpacing
+                    )
+                    .coerceIn(0, pagerState.pageCount)
 
             debugLog { "Fling Corrected Target Page=$correctedTargetPage" }
 
@@ -122,17 +119,16 @@
 
             // We'd like the approach animation to finish right before the last page so we can
             // use a snapping animation for the rest.
-            val flingApproachOffsetPx = (abs(proposedFlingOffset) - effectivePageSizePx)
-                .coerceAtLeast(0)
+            val flingApproachOffsetPx =
+                (abs(proposedFlingOffset) - effectivePageSizePx).coerceAtLeast(0)
 
             // Apply the correct sign.
             return if (flingApproachOffsetPx == 0) {
-                flingApproachOffsetPx.toFloat()
-            } else {
-                flingApproachOffsetPx * velocity.sign
-            }.also {
-                debugLog { "Fling Approach Offset=$it" }
-            }
+                    flingApproachOffsetPx.toFloat()
+                } else {
+                    flingApproachOffsetPx * velocity.sign
+                }
+                .also { debugLog { "Fling Approach Offset=$it" } }
         }
 
         private fun searchForSnappingBounds(snapPosition: SnapPosition): Pair<Float, Float> {
@@ -141,16 +137,17 @@
             var upperBoundOffset = Float.POSITIVE_INFINITY
 
             layoutInfo.visiblePagesInfo.fastForEach { page ->
-                val offset = calculateDistanceToDesiredSnapPosition(
-                    mainAxisViewPortSize = layoutInfo.mainAxisViewportSize,
-                    beforeContentPadding = layoutInfo.beforeContentPadding,
-                    afterContentPadding = layoutInfo.afterContentPadding,
-                    itemSize = layoutInfo.pageSize,
-                    itemOffset = page.offset,
-                    itemIndex = page.index,
-                    snapPosition = snapPosition,
-                    itemCount = pagerState.pageCount
-                )
+                val offset =
+                    calculateDistanceToDesiredSnapPosition(
+                        mainAxisViewPortSize = layoutInfo.mainAxisViewportSize,
+                        beforeContentPadding = layoutInfo.beforeContentPadding,
+                        afterContentPadding = layoutInfo.afterContentPadding,
+                        itemSize = layoutInfo.pageSize,
+                        itemOffset = page.offset,
+                        itemIndex = page.index,
+                        snapPosition = snapPosition,
+                        itemCount = pagerState.pageCount
+                    )
 
                 // Find page that is closest to the snap position, but before it
                 if (offset <= 0 && offset > lowerBoundOffset) {
@@ -199,17 +196,19 @@
 }
 
 private fun PagerState.isLtrDragging() = dragGestureDelta() > 0
+
 private fun PagerState.isScrollingForward(): Boolean {
     val reverseScrollDirection = layoutInfo.reverseLayout
     return (isLtrDragging() && reverseScrollDirection ||
         !isLtrDragging() && !reverseScrollDirection)
 }
 
-private fun PagerState.dragGestureDelta() = if (layoutInfo.orientation == Orientation.Horizontal) {
-    upDownDifference.x
-} else {
-    upDownDifference.y
-}
+private fun PagerState.dragGestureDelta() =
+    if (layoutInfo.orientation == Orientation.Horizontal) {
+        upDownDifference.x
+    } else {
+        upDownDifference.y
+    }
 
 private inline fun debugLog(generateMsg: () -> String) {
     if (PagerDebugConfig.PagerSnapLayoutInfoProvider) {
@@ -231,15 +230,16 @@
     upperBoundOffset: Float
 ): Float {
 
-    val isForward = if (pagerState.layoutInfo.orientation == Orientation.Vertical) {
-        pagerState.isScrollingForward()
-    } else {
-        if (layoutDirection == LayoutDirection.Ltr) {
+    val isForward =
+        if (pagerState.layoutInfo.orientation == Orientation.Vertical) {
             pagerState.isScrollingForward()
         } else {
-            !pagerState.isScrollingForward()
+            if (layoutDirection == LayoutDirection.Ltr) {
+                pagerState.isScrollingForward()
+            } else {
+                !pagerState.isScrollingForward()
+            }
         }
-    }
     debugLog {
         "isLtrDragging=${pagerState.isLtrDragging()} " +
             "isForward=$isForward " +
@@ -255,8 +255,7 @@
 
     // If the velocity is not high, use the positional threshold to decide where to go.
     // This is applicable mainly when the user scrolls and lets go without flinging.
-    val finalSnappingItem =
-        with(pagerState.density) { calculateFinalSnappingItem(flingVelocity) }
+    val finalSnappingItem = with(pagerState.density) { calculateFinalSnappingItem(flingVelocity) }
 
     debugLog {
         "\nfinalSnappingItem=$finalSnappingItem" +
@@ -273,9 +272,7 @@
             } else {
                 // if we haven't crossed the threshold. but scrolled minimally, we should
                 // bound to the previous bound
-                if (abs(offsetFromSnappedPosition) >=
-                    abs(pagerState.positionThresholdFraction)
-                ) {
+                if (abs(offsetFromSnappedPosition) >= abs(pagerState.positionThresholdFraction)) {
                     debugLog { "Crossed Positional Threshold Fraction" }
                     if (isForward) lowerBoundOffset else upperBoundOffset
                 } else {
@@ -289,7 +286,6 @@
                 }
             }
         }
-
         FinalSnappingItem.NextItem -> upperBoundOffset
         FinalSnappingItem.PreviousItem -> lowerBoundOffset
         else -> 0f
diff --git a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/gestures/snapping/SnapFlingBehavior.kt b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/gestures/snapping/SnapFlingBehavior.kt
index d4134b6..078cf53 100644
--- a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/gestures/snapping/SnapFlingBehavior.kt
+++ b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/gestures/snapping/SnapFlingBehavior.kt
@@ -46,24 +46,24 @@
 /**
  * A [TargetedFlingBehavior] that performs snapping to a given position in a layout.
  *
- * You can use [SnapLayoutInfoProvider.calculateApproachOffset] to
- * indicate that snapping should happen after this offset. If the velocity generated by the
- * fling is high enough to get there, we'll use [decayAnimationSpec] to get to that offset
- * and then we'll snap to the next bound calculated by
- * [SnapLayoutInfoProvider.calculateSnapOffset] using [snapAnimationSpec].
+ * You can use [SnapLayoutInfoProvider.calculateApproachOffset] to indicate that snapping should
+ * happen after this offset. If the velocity generated by the fling is high enough to get there,
+ * we'll use [decayAnimationSpec] to get to that offset and then we'll snap to the next bound
+ * calculated by [SnapLayoutInfoProvider.calculateSnapOffset] using [snapAnimationSpec].
  *
  * If the velocity is not high enough, we'll use [snapAnimationSpec] to approach and the same spec
  * to snap into place.
  *
  * Please refer to the sample to learn how to use this API.
+ *
  * @sample androidx.compose.foundation.samples.SnapFlingBehaviorSimpleSample
+ *
  * @sample androidx.compose.foundation.samples.SnapFlingBehaviorCustomizedSample
  *
  * @param snapLayoutInfoProvider The information about the layout being snapped.
- * @param decayAnimationSpec The animation spec used to approach the target offset when
- * the fling velocity is large enough. Large enough means large enough to naturally decay.
+ * @param decayAnimationSpec The animation spec used to approach the target offset when the fling
+ *   velocity is large enough. Large enough means large enough to naturally decay.
  * @param snapAnimationSpec The animation spec used to finally snap to the correct bound.
- *
  */
 @OptIn(ExperimentalFoundationApi::class)
 @Suppress("Deprecation")
@@ -77,8 +77,7 @@
 
 @Deprecated(
     "Please use the snapFlingBehavior function",
-    replaceWith =
-    ReplaceWith("androidx.compose.foundation.gestures.snapping.snapFlingBehavior")
+    replaceWith = ReplaceWith("androidx.compose.foundation.gestures.snapping.snapFlingBehavior")
 )
 @ExperimentalFoundationApi
 class SnapFlingBehavior(
@@ -90,17 +89,15 @@
     internal var motionScaleDuration = DefaultScrollMotionDurationScale
 
     /**
-     * Perform a snapping fling animation with given velocity and suspend until fling has
-     * finished. This will behave the same way as [performFling] except it will report on
-     * each remainingOffsetUpdate using the [onRemainingDistanceUpdated] lambda.
+     * Perform a snapping fling animation with given velocity and suspend until fling has finished.
+     * This will behave the same way as [performFling] except it will report on each
+     * remainingOffsetUpdate using the [onRemainingDistanceUpdated] lambda.
      *
      * @param initialVelocity velocity available for fling in the orientation specified in
-     * [androidx.compose.foundation.gestures.scrollable] that invoked this method.
-     *
-     * @param onRemainingDistanceUpdated a lambda that will be called anytime the
-     * distance to the settling offset is updated. The settling offset is the final offset where
-     * this fling will stop and may change depending on the snapping animation progression.
-     *
+     *   [androidx.compose.foundation.gestures.scrollable] that invoked this method.
+     * @param onRemainingDistanceUpdated a lambda that will be called anytime the distance to the
+     *   settling offset is updated. The settling offset is the final offset where this fling will
+     *   stop and may change depending on the snapping animation progression.
      * @return remaining velocity after fling operation has ended
      */
     override suspend fun ScrollScope.performFling(
@@ -120,44 +117,43 @@
         initialVelocity: Float,
         onRemainingScrollOffsetUpdate: (Float) -> Unit
     ): AnimationResult<Float, AnimationVector1D> {
-        val result = withContext(motionScaleDuration) {
-            val decayOffset =
-                decayAnimationSpec.calculateTargetValue(
-                    initialVelocity = initialVelocity,
-                    initialValue = 0.0f
-                )
+        val result =
+            withContext(motionScaleDuration) {
+                val decayOffset =
+                    decayAnimationSpec.calculateTargetValue(
+                        initialVelocity = initialVelocity,
+                        initialValue = 0.0f
+                    )
 
-            val initialOffset =
-                snapLayoutInfoProvider.calculateApproachOffset(initialVelocity, decayOffset)
-            var remainingScrollOffset =
-                abs(initialOffset) * sign(initialVelocity) // ensure offset sign is correct
+                val initialOffset =
+                    snapLayoutInfoProvider.calculateApproachOffset(initialVelocity, decayOffset)
+                var remainingScrollOffset =
+                    abs(initialOffset) * sign(initialVelocity) // ensure offset sign is correct
 
-            onRemainingScrollOffsetUpdate(remainingScrollOffset) // First Scroll Offset
+                onRemainingScrollOffsetUpdate(remainingScrollOffset) // First Scroll Offset
 
-            val animationState = tryApproach(
-                remainingScrollOffset,
-                initialVelocity
-            ) { delta ->
-                remainingScrollOffset -= delta
-                onRemainingScrollOffsetUpdate(remainingScrollOffset)
+                val animationState =
+                    tryApproach(remainingScrollOffset, initialVelocity) { delta ->
+                        remainingScrollOffset -= delta
+                        onRemainingScrollOffsetUpdate(remainingScrollOffset)
+                    }
+
+                remainingScrollOffset =
+                    snapLayoutInfoProvider.calculateSnapOffset(animationState.velocity)
+
+                debugLog { "Settling Final Bound=$remainingScrollOffset" }
+
+                animateWithTarget(
+                    remainingScrollOffset,
+                    remainingScrollOffset,
+                    animationState.copy(value = 0f), // re-use the velocity and timestamp from state
+                    snapAnimationSpec
+                ) { delta ->
+                    remainingScrollOffset -= delta
+                    onRemainingScrollOffsetUpdate(remainingScrollOffset)
+                }
             }
 
-            remainingScrollOffset =
-                snapLayoutInfoProvider.calculateSnapOffset(animationState.velocity)
-
-            debugLog { "Settling Final Bound=$remainingScrollOffset" }
-
-            animateWithTarget(
-                remainingScrollOffset,
-                remainingScrollOffset,
-                animationState.copy(value = 0f), // re-use the velocity and timestamp from state
-                snapAnimationSpec
-            ) { delta ->
-                remainingScrollOffset -= delta
-                onRemainingScrollOffsetUpdate(remainingScrollOffset)
-            }
-        }
-
         onRemainingScrollOffsetUpdate(0f) // Animation finished or was cancelled
         return result
     }
@@ -168,16 +164,10 @@
         updateRemainingScrollOffset: (Float) -> Unit
     ): AnimationState<Float, AnimationVector1D> {
         // If we don't have velocity or approach offset, we shouldn't run the approach animation
-        return if (offset.absoluteValue == 0.0f ||
-            velocity.absoluteValue == 0.0f
-        ) {
+        return if (offset.absoluteValue == 0.0f || velocity.absoluteValue == 0.0f) {
             AnimationState(offset, velocity)
         } else {
-            runApproach(
-                offset,
-                velocity,
-                updateRemainingScrollOffset
-            ).currentAnimationState
+            runApproach(offset, velocity, updateRemainingScrollOffset).currentAnimationState
         }
     }
 
@@ -196,21 +186,11 @@
                 TargetApproachAnimation(snapAnimationSpec)
             }
 
-        return approach(
-            initialTargetOffset,
-            initialVelocity,
-            animation,
-            onAnimationStep
-        )
+        return approach(initialTargetOffset, initialVelocity, animation, onAnimationStep)
     }
 
-    /**
-     * If we can approach the target and still have velocity left
-     */
-    private fun isDecayApproachPossible(
-        offset: Float,
-        velocity: Float
-    ): Boolean {
+    /** If we can approach the target and still have velocity left */
+    private fun isDecayApproachPossible(offset: Float, velocity: Float): Boolean {
         val decayOffset = decayAnimationSpec.calculateTargetValue(NoDistance, velocity)
         debugLog {
             "Evaluating decay possibility with " +
@@ -230,14 +210,15 @@
         }
     }
 
-    override fun hashCode(): Int = 0
-        .let { 31 * it + snapAnimationSpec.hashCode() }
-        .let { 31 * it + decayAnimationSpec.hashCode() }
-        .let { 31 * it + snapLayoutInfoProvider.hashCode() }
+    override fun hashCode(): Int =
+        0.let { 31 * it + snapAnimationSpec.hashCode() }
+            .let { 31 * it + decayAnimationSpec.hashCode() }
+            .let { 31 * it + snapLayoutInfoProvider.hashCode() }
 }
 
 /**
  * Creates and remember a [FlingBehavior] that performs snapping.
+ *
  * @param snapLayoutInfoProvider The information about the layout that will do snapping
  */
 @Composable
@@ -246,11 +227,7 @@
 ): TargetedFlingBehavior {
     val density = LocalDensity.current
     val highVelocityApproachSpec: DecayAnimationSpec<Float> = rememberSplineBasedDecay()
-    return remember(
-        snapLayoutInfoProvider,
-        highVelocityApproachSpec,
-        density
-    ) {
+    return remember(snapLayoutInfoProvider, highVelocityApproachSpec, density) {
         snapFlingBehavior(
             snapLayoutInfoProvider = snapLayoutInfoProvider,
             decayAnimationSpec = highVelocityApproachSpec,
@@ -277,12 +254,7 @@
     onAnimationStep: (delta: Float) -> Unit
 ): AnimationResult<Float, AnimationVector1D> {
 
-    return animation.approachAnimation(
-        this,
-        initialTargetOffset,
-        initialVelocity,
-        onAnimationStep
-    )
+    return animation.approachAnimation(this, initialTargetOffset, initialVelocity, onAnimationStep)
 }
 
 private class AnimationResult<T, V : AnimationVector>(
@@ -290,10 +262,12 @@
     val currentAnimationState: AnimationState<T, V>
 ) {
     operator fun component1(): T = remainingOffset
+
     operator fun component2(): AnimationState<T, V> = currentAnimationState
 }
 
 private operator fun <T : Comparable<T>> ClosedFloatingPointRange<T>.component1(): T = this.start
+
 private operator fun <T : Comparable<T>> ClosedFloatingPointRange<T>.component2(): T =
     this.endInclusive
 
@@ -301,7 +275,7 @@
  * Run a [DecayAnimationSpec] animation up to before [targetOffset] using [animationState]
  *
  * @param targetOffset The destination of this animation. Since this is a decay animation, we can
- * use this value to prevent the animation to run until the end.
+ *   use this value to prevent the animation to run until the end.
  * @param animationState The previous [AnimationState] for continuation purposes.
  * @param decayAnimationSpec The [DecayAnimationSpec] that will drive this animation
  * @param onAnimationStep Called for each new scroll delta emitted by the animation cycle.
@@ -337,13 +311,8 @@
         }
     }
 
-    debugLog {
-        "Decay Animation: Proposed Offset=$targetOffset Achieved Offset=$previousValue"
-    }
-    return AnimationResult(
-        targetOffset - previousValue,
-        animationState
-    )
+    debugLog { "Decay Animation: Proposed Offset=$targetOffset Achieved Offset=$previousValue" }
+    return AnimationResult(targetOffset - previousValue, animationState)
 }
 
 /**
@@ -381,9 +350,7 @@
         consumedUpToNow += consumed
     }
 
-    debugLog {
-        "Snap Animation: Proposed Offset=$targetOffset Achieved Offset=$consumedUpToNow"
-    }
+    debugLog { "Snap Animation: Proposed Offset=$targetOffset Achieved Offset=$consumedUpToNow" }
 
     // Always course correct velocity so they don't become too large.
     val finalVelocity = animationState.velocity.coerceToTarget(initialVelocity)
@@ -398,9 +365,7 @@
     return if (target > 0) coerceAtMost(target) else coerceAtLeast(target)
 }
 
-/**
- * The animations used to approach offset and approach half a step offset.
- */
+/** The animations used to approach offset and approach half a step offset. */
 private interface ApproachAnimation<T, V : AnimationVector> {
     suspend fun approachAnimation(
         scope: ScrollScope,
@@ -410,9 +375,8 @@
     ): AnimationResult<T, V>
 }
 
-private class TargetApproachAnimation(
-    private val animationSpec: AnimationSpec<Float>
-) : ApproachAnimation<Float, AnimationVector1D> {
+private class TargetApproachAnimation(private val animationSpec: AnimationSpec<Float>) :
+    ApproachAnimation<Float, AnimationVector1D> {
     override suspend fun approachAnimation(
         scope: ScrollScope,
         offset: Float,
@@ -433,9 +397,8 @@
     }
 }
 
-private class DecayApproachAnimation(
-    private val decayAnimationSpec: DecayAnimationSpec<Float>
-) : ApproachAnimation<Float, AnimationVector1D> {
+private class DecayApproachAnimation(private val decayAnimationSpec: DecayAnimationSpec<Float>) :
+    ApproachAnimation<Float, AnimationVector1D> {
     override suspend fun approachAnimation(
         scope: ScrollScope,
         offset: Float,
@@ -465,20 +428,20 @@
 
     debugLog { "Proposed Bounds: Lower=$lowerBound Upper=$upperBound" }
 
-    val finalDistance = when (snappingOffset) {
-        FinalSnappingItem.ClosestItem -> {
-            if (abs(upperBound) <= abs(lowerBound)) {
-                upperBound
-            } else {
-                lowerBound
+    val finalDistance =
+        when (snappingOffset) {
+            FinalSnappingItem.ClosestItem -> {
+                if (abs(upperBound) <= abs(lowerBound)) {
+                    upperBound
+                } else {
+                    lowerBound
+                }
             }
+            FinalSnappingItem.NextItem -> upperBound
+            FinalSnappingItem.PreviousItem -> lowerBound
+            else -> NoDistance
         }
 
-        FinalSnappingItem.NextItem -> upperBound
-        FinalSnappingItem.PreviousItem -> lowerBound
-        else -> NoDistance
-    }
-
     return if (finalDistance.isValidDistance()) {
         finalDistance
     } else {
diff --git a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/gestures/snapping/SnapLayoutInfoProvider.kt b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/gestures/snapping/SnapLayoutInfoProvider.kt
index 1e43f0e..78e2c67 100644
--- a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/gestures/snapping/SnapLayoutInfoProvider.kt
+++ b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/gestures/snapping/SnapLayoutInfoProvider.kt
@@ -17,49 +17,46 @@
 package androidx.compose.foundation.gestures.snapping
 
 /**
- * Provides information about the layout that is using a [snapFlingBehavior].
- * The provider should give the following information:
- * 1) Snapping offset: The next snap position offset. This needs to be provided by the layout
- * where the snapping is happened and will represent the final settling position of this layout.
+ * Provides information about the layout that is using a [snapFlingBehavior]. The provider should
+ * give the following information:
+ * 1) Snapping offset: The next snap position offset. This needs to be provided by the layout where
+ *    the snapping is happened and will represent the final settling position of this layout.
  * 2) Approach offset: An offset to be consumed before snapping to a defined bound. If not
- * overridden this will provide a decayed snapping behavior.
+ *    overridden this will provide a decayed snapping behavior.
  *
  * In snapping, the approach offset and the snapping offset can be used to control how a snapping
- * animation will look in a given layout. The complete snapping animation can be split
- * into 2 phases: approach and snapping.
+ * animation will look in a given layout. The complete snapping animation can be split into 2
+ * phases: approach and snapping.
  *
  * Approach: animate to the offset returned by [calculateApproachOffset]. This will use a decay
- * animation if possible, otherwise the snap animation.
- * Snapping: once the approach offset is reached, snap to the offset returned by
- * [calculateSnapOffset] using the snap animation.
+ * animation if possible, otherwise the snap animation. Snapping: once the approach offset is
+ * reached, snap to the offset returned by [calculateSnapOffset] using the snap animation.
  */
 interface SnapLayoutInfoProvider {
 
     /**
      * Calculate the distance to navigate before settling into the next snapping bound. By default
-     * this is [decayOffset] a suggested offset given by [snapFlingBehavior] to indicate
-     * where the animation would naturally decay if using [velocity]. Returning a value higher than
+     * this is [decayOffset] a suggested offset given by [snapFlingBehavior] to indicate where the
+     * animation would naturally decay if using [velocity]. Returning a value higher than
      * [decayOffset] is valid and will force [snapFlingBehavior] to use a target based animation
      * spec to run the approach phase since we won't be able to naturally decay to the proposed
      * offset. If a value smaller than or equal to [decayOffset] is returned [snapFlingBehavior]
-     * will run a decay animation until it reaches the returned value. If zero is specified,
-     * that means there won't be an approach phase and there will only be snapping.
+     * will run a decay animation until it reaches the returned value. If zero is specified, that
+     * means there won't be an approach phase and there will only be snapping.
      *
-     * @param velocity The current fling movement velocity. You can use this to calculate a
-     * velocity based offset.
-     * @param decayOffset A suggested offset indicating where the animation would
-     * naturally decay to.
+     * @param velocity The current fling movement velocity. You can use this to calculate a velocity
+     *   based offset.
+     * @param decayOffset A suggested offset indicating where the animation would naturally decay
+     *   to.
      */
-    fun calculateApproachOffset(velocity: Float, decayOffset: Float): Float =
-        decayOffset
+    fun calculateApproachOffset(velocity: Float, decayOffset: Float): Float = decayOffset
 
     /**
-     * Given a target placement in a layout, the snapping offset is the next snapping position
-     * this layout can be placed in. The target placement should be in the direction of
-     * [velocity].
+     * Given a target placement in a layout, the snapping offset is the next snapping position this
+     * layout can be placed in. The target placement should be in the direction of [velocity].
      *
-     * @param velocity The current fling movement velocity. This may change throughout the
-     * fling animation.
+     * @param velocity The current fling movement velocity. This may change throughout the fling
+     *   animation.
      */
     fun calculateSnapOffset(velocity: Float): Float
 }
diff --git a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/gestures/snapping/SnapPosition.kt b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/gestures/snapping/SnapPosition.kt
index b592443..c1e7d0ba 100644
--- a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/gestures/snapping/SnapPosition.kt
+++ b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/gestures/snapping/SnapPosition.kt
@@ -19,18 +19,17 @@
 import androidx.compose.runtime.Stable
 
 /**
- * Describes the snapping positioning (i.e. final positioning after snapping animation finishes)
- * of a given snap item in its containing layout.
+ * Describes the snapping positioning (i.e. final positioning after snapping animation finishes) of
+ * a given snap item in its containing layout.
  */
 @Stable
 interface SnapPosition {
     /**
-     * Calculates the snap position where items will be aligned to in a snapping
-     * container. For instance, if [SnapPosition.Center] is used, once the snapping finishes
-     * the center of one of the items in the snapping container will be aligned exactly to the
-     * center of the snapping container, that is because the value returned by [position] was
-     * calculated as such a way that when one applies it to the item's current offset
-     * it will generate that final positioning.
+     * Calculates the snap position where items will be aligned to in a snapping container. For
+     * instance, if [SnapPosition.Center] is used, once the snapping finishes the center of one of
+     * the items in the snapping container will be aligned exactly to the center of the snapping
+     * container, that is because the value returned by [position] was calculated as such a way that
+     * when one applies it to the item's current offset it will generate that final positioning.
      *
      * The reference point is with respect to the start of the layout (including the content
      * padding)
@@ -38,17 +37,14 @@
      * @sample androidx.compose.foundation.samples.SnapFlingBehaviorSnapPosition
      *
      * @param layoutSize The main axis layout size within which an item can be positioned.
-     * @param itemSize The main axis size for the item being positioned within this snapping
-     * layout.
+     * @param itemSize The main axis size for the item being positioned within this snapping layout.
      * @param beforeContentPadding The content padding in pixels applied before this Layout's
-     * content.
-     * @param afterContentPadding The content padding in pixels applied after this Layout's
-     * content.
+     *   content.
+     * @param afterContentPadding The content padding in pixels applied after this Layout's content.
      * @param itemIndex The index of the item being positioned.
      * @param itemCount The total amount of items in the snapping container.
-     *
      * @return The offset of the snap position where items will be aligned to in a snapping
-     * container.
+     *   container.
      */
     fun position(
         layoutSize: Int,
@@ -59,9 +55,7 @@
         itemCount: Int
     ): Int
 
-    /**
-     * Aligns the center of the item with the center of the containing layout.
-     */
+    /** Aligns the center of the item with the center of the containing layout. */
     object Center : SnapPosition {
         override fun position(
             layoutSize: Int,
@@ -82,9 +76,7 @@
         }
     }
 
-    /**
-     * Aligns the start of the item with the start of the containing layout.
-     */
+    /** Aligns the start of the item with the start of the containing layout. */
     object Start : SnapPosition {
         override fun position(
             layoutSize: Int,
@@ -100,9 +92,7 @@
         }
     }
 
-    /**
-     * Aligns the end of the item with the end of the containing layout.
-     */
+    /** Aligns the end of the item with the end of the containing layout. */
     object End : SnapPosition {
         override fun position(
             layoutSize: Int,
@@ -134,16 +124,18 @@
     snapPosition: SnapPosition,
     itemCount: Int
 ): Float {
-    val desiredDistance = with(snapPosition) {
-        position(
-            mainAxisViewPortSize,
-            itemSize,
-            beforeContentPadding,
-            afterContentPadding,
-            itemIndex,
-            itemCount
-        )
-    }.toFloat()
+    val desiredDistance =
+        with(snapPosition) {
+                position(
+                    mainAxisViewPortSize,
+                    itemSize,
+                    beforeContentPadding,
+                    afterContentPadding,
+                    itemIndex,
+                    itemCount
+                )
+            }
+            .toFloat()
 
     return itemOffset - desiredDistance
 }
diff --git a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/interaction/DragInteraction.kt b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/interaction/DragInteraction.kt
index 6a3d06c..706dc8f 100644
--- a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/interaction/DragInteraction.kt
+++ b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/interaction/DragInteraction.kt
@@ -47,7 +47,6 @@
      * An interaction representing the stopping of a [Start] event on a component.
      *
      * @property start the source [Start] interaction that is being stopped
-     *
      * @see androidx.compose.foundation.gestures.draggable
      * @see Start
      */
@@ -57,7 +56,6 @@
      * An interaction representing the cancellation of a [Start] event on a component.
      *
      * @property start the source [Start] interaction that is being cancelled
-     *
      * @see androidx.compose.foundation.gestures.draggable
      * @see Start
      */
@@ -68,8 +66,8 @@
  * Subscribes to this [MutableInteractionSource] and returns a [State] representing whether this
  * component is dragged or not.
  *
- * [DragInteraction] is typically set by interactions
- * such as [androidx.compose.foundation.gestures.draggable] and
+ * [DragInteraction] is typically set by interactions such as
+ * [androidx.compose.foundation.gestures.draggable] and
  * [androidx.compose.foundation.gestures.scrollable], and higher level components such as
  * [androidx.compose.foundation.lazy.LazyRow], available through
  * [androidx.compose.foundation.lazy.LazyListState.interactionSource].
diff --git a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/interaction/FocusInteraction.kt b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/interaction/FocusInteraction.kt
index 010f950..ac5502c 100644
--- a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/interaction/FocusInteraction.kt
+++ b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/interaction/FocusInteraction.kt
@@ -45,7 +45,6 @@
      * An interaction representing a [Focus] event being released on a component.
      *
      * @property focus the source [Focus] interaction that is being released
-     *
      * @see androidx.compose.foundation.focusable
      * @see Focus
      */
diff --git a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/interaction/HoverInteraction.kt b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/interaction/HoverInteraction.kt
index 3ae9cec..c760eda 100644
--- a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/interaction/HoverInteraction.kt
+++ b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/interaction/HoverInteraction.kt
@@ -45,7 +45,6 @@
      * An interaction representing a [Enter] event being released on a component.
      *
      * @property enter the source [Enter] interaction that is being released
-     *
      * @see androidx.compose.foundation.hoverable
      * @see Enter
      */
diff --git a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/interaction/Interaction.kt b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/interaction/Interaction.kt
index 5b7a78d..a375921 100644
--- a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/interaction/Interaction.kt
+++ b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/interaction/Interaction.kt
@@ -17,15 +17,15 @@
 package androidx.compose.foundation.interaction
 
 /**
- * An Interaction represents transient UI state for a component, typically separate from the
- * actual 'business' state that a component may control. For example, a button typically fires an
- * `onClick` callback when the button is pressed and released, but it may still want to show
- * that it is being pressed before this callback is fired. This transient state is represented by
- * an Interaction, in this case [PressInteraction.Press]. Using Interactions allows you to build
- * components that respond to these transient, component-owned state changes.
+ * An Interaction represents transient UI state for a component, typically separate from the actual
+ * 'business' state that a component may control. For example, a button typically fires an `onClick`
+ * callback when the button is pressed and released, but it may still want to show that it is being
+ * pressed before this callback is fired. This transient state is represented by an Interaction, in
+ * this case [PressInteraction.Press]. Using Interactions allows you to build components that
+ * respond to these transient, component-owned state changes.
  *
- * To emit / observe current Interactions, see [MutableInteractionSource], which represents a
- * stream of Interactions present for a given component.
+ * To emit / observe current Interactions, see [MutableInteractionSource], which represents a stream
+ * of Interactions present for a given component.
  *
  * @see InteractionSource
  * @see MutableInteractionSource
diff --git a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/interaction/InteractionSource.kt b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/interaction/InteractionSource.kt
index 4b6c65b..90d3b23 100644
--- a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/interaction/InteractionSource.kt
+++ b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/interaction/InteractionSource.kt
@@ -25,8 +25,8 @@
 
 /**
  * InteractionSource represents a stream of [Interaction]s corresponding to events emitted by a
- * component. These [Interaction]s can be used to change how components appear in different
- * states, such as when a component is pressed or dragged.
+ * component. These [Interaction]s can be used to change how components appear in different states,
+ * such as when a component is pressed or dragged.
  *
  * A common use case is [androidx.compose.foundation.indication], where
  * [androidx.compose.foundation.Indication] implementations can subscribe to an [InteractionSource]
@@ -34,24 +34,24 @@
  * [PressInteraction.Press] and a state overlay for [DragInteraction.Start].
  *
  * For simple cases where you are interested in the binary state of an [Interaction], such as
- * whether a component is pressed or not, you can use [InteractionSource.collectIsPressedAsState] and other
- * extension functions that subscribe and return a [Boolean] [State] representing whether the
- * component is in this state or not.
+ * whether a component is pressed or not, you can use [InteractionSource.collectIsPressedAsState]
+ * and other extension functions that subscribe and return a [Boolean] [State] representing whether
+ * the component is in this state or not.
  *
  * @sample androidx.compose.foundation.samples.SimpleInteractionSourceSample
  *
  * For more complex cases, such as when building an [androidx.compose.foundation.Indication], the
  * order of the events can change how a component / indication should be drawn. For example, if a
  * component is being dragged and then becomes focused, the most recent [Interaction] is
- * [FocusInteraction.Focus], so the component should appear in a focused state to signal this
- * event to the user.
+ * [FocusInteraction.Focus], so the component should appear in a focused state to signal this event
+ * to the user.
  *
- * InteractionSource exposes [interactions] to support these use cases - a
- * [Flow] representing the stream of all emitted [Interaction]s. This also provides more
- * information, such as the press position of [PressInteraction.Press], so you can show an effect
- * at the specific point the component was pressed, and whether the press was
- * [PressInteraction.Release] or [PressInteraction.Cancel], for cases when a component
- * should behave differently if the press was released normally or interrupted by another gesture.
+ * InteractionSource exposes [interactions] to support these use cases - a [Flow] representing the
+ * stream of all emitted [Interaction]s. This also provides more information, such as the press
+ * position of [PressInteraction.Press], so you can show an effect at the specific point the
+ * component was pressed, and whether the press was [PressInteraction.Release] or
+ * [PressInteraction.Cancel], for cases when a component should behave differently if the press was
+ * released normally or interrupted by another gesture.
  *
  * You can collect from [interactions] as you would with any other [Flow]:
  *
@@ -75,9 +75,9 @@
 }
 
 /**
- * MutableInteractionSource represents a stream of [Interaction]s corresponding to events emitted
- * by a component. These [Interaction]s can be used to change how components appear
- * in different states, such as when a component is pressed or dragged.
+ * MutableInteractionSource represents a stream of [Interaction]s corresponding to events emitted by
+ * a component. These [Interaction]s can be used to change how components appear in different
+ * states, such as when a component is pressed or dragged.
  *
  * Lower level interaction APIs such as [androidx.compose.foundation.clickable] and
  * [androidx.compose.foundation.gestures.draggable] have an [MutableInteractionSource] parameter,
@@ -85,12 +85,12 @@
  * one event stream.
  *
  * MutableInteractionSource exposes [emit] and [tryEmit] functions. These emit the provided
- * [Interaction] to the underlying [interactions] [Flow], allowing consumers to react to these
- * new [Interaction]s.
+ * [Interaction] to the underlying [interactions] [Flow], allowing consumers to react to these new
+ * [Interaction]s.
  *
- * An instance of MutableInteractionSource can be created by using the
- * [MutableInteractionSource] factory function. This instance should be [remember]ed before it is
- * passed to other components that consume it.
+ * An instance of MutableInteractionSource can be created by using the [MutableInteractionSource]
+ * factory function. This instance should be [remember]ed before it is passed to other components
+ * that consume it.
  *
  * @see InteractionSource
  * @see Interaction
@@ -98,8 +98,8 @@
 @Stable
 interface MutableInteractionSource : InteractionSource {
     /**
-     * Emits [interaction] into [interactions].
-     * This method is not thread-safe and should not be invoked concurrently.
+     * Emits [interaction] into [interactions]. This method is not thread-safe and should not be
+     * invoked concurrently.
      *
      * @see tryEmit
      */
@@ -115,8 +115,8 @@
 }
 
 /**
- * Return a new [MutableInteractionSource] that can be hoisted and provided to components,
- * allowing listening to [Interaction] changes inside those components.
+ * Return a new [MutableInteractionSource] that can be hoisted and provided to components, allowing
+ * listening to [Interaction] changes inside those components.
  *
  * This should be [remember]ed before it is provided to components, so it can maintain its state
  * across compositions.
@@ -129,10 +129,11 @@
 @Stable
 private class MutableInteractionSourceImpl : MutableInteractionSource {
     // TODO: consider replay for new indication instances during events?
-    override val interactions = MutableSharedFlow<Interaction>(
-        extraBufferCapacity = 16,
-        onBufferOverflow = BufferOverflow.DROP_OLDEST,
-    )
+    override val interactions =
+        MutableSharedFlow<Interaction>(
+            extraBufferCapacity = 16,
+            onBufferOverflow = BufferOverflow.DROP_OLDEST,
+        )
 
     override suspend fun emit(interaction: Interaction) {
         interactions.emit(interaction)
diff --git a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/interaction/PressInteraction.kt b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/interaction/PressInteraction.kt
index dff4b42..91c29ab 100644
--- a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/interaction/PressInteraction.kt
+++ b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/interaction/PressInteraction.kt
@@ -40,10 +40,9 @@
      * An interaction representing a press event on a component.
      *
      * @property pressPosition the [Offset] describing where this press event occurred within the
-     * component. The [Offset] can be outside the actual component bounds meaning the [Offset]
-     * can be negative or larger than the component bounds if the touch target is smaller than
-     * the [ViewConfiguration.minimumTouchTargetSize].
-     *
+     *   component. The [Offset] can be outside the actual component bounds meaning the [Offset] can
+     *   be negative or larger than the component bounds if the touch target is smaller than the
+     *   [ViewConfiguration.minimumTouchTargetSize].
      * @see androidx.compose.foundation.clickable
      * @see Release
      * @see Cancel
@@ -54,7 +53,6 @@
      * An interaction representing the release of a [Press] event on a component.
      *
      * @property press the source [Press] interaction that is being released
-     *
      * @see androidx.compose.foundation.clickable
      * @see Press
      */
@@ -64,7 +62,6 @@
      * An interaction representing the cancellation of a [Press] event on a component.
      *
      * @property press the source [Press] interaction that is being cancelled
-     *
      * @see androidx.compose.foundation.clickable
      * @see Press
      */
diff --git a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/LazyDsl.kt b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/LazyDsl.kt
index 89056a3..e1877c4 100644
--- a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/LazyDsl.kt
+++ b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/LazyDsl.kt
@@ -27,25 +27,23 @@
 import androidx.compose.ui.Modifier
 import androidx.compose.ui.unit.dp
 
-/**
- * Receiver scope which is used by [LazyColumn] and [LazyRow].
- */
+/** Receiver scope which is used by [LazyColumn] and [LazyRow]. */
 @LazyScopeMarker
 @JvmDefaultWithCompatibility
 interface LazyListScope {
     /**
      * Adds a single item.
      *
-     * @param key a stable and unique key representing the item. Using the same key
-     * for multiple items in the list is not allowed. Type of the key should be saveable
-     * via Bundle on Android. If null is passed the position in the list will represent the key.
-     * When you specify the key the scroll position will be maintained based on the key, which
-     * means if you add/remove items before the current visible item the item with the given key
-     * will be kept as the first visible one. This can be overridden by calling
-     * 'requestScrollToItem' on the 'LazyListState'.
+     * @param key a stable and unique key representing the item. Using the same key for multiple
+     *   items in the list is not allowed. Type of the key should be saveable via Bundle on Android.
+     *   If null is passed the position in the list will represent the key. When you specify the key
+     *   the scroll position will be maintained based on the key, which means if you add/remove
+     *   items before the current visible item the item with the given key will be kept as the first
+     *   visible one. This can be overridden by calling 'requestScrollToItem' on the
+     *   'LazyListState'.
      * @param contentType the type of the content of this item. The item compositions of the same
-     * type could be reused more efficiently. Note that null is a valid type and items of such
-     * type will be considered compatible.
+     *   type could be reused more efficiently. Note that null is a valid type and items of such
+     *   type will be considered compatible.
      * @param content the content of the item
      */
     fun item(
@@ -65,16 +63,16 @@
      * Adds a [count] of items.
      *
      * @param count the items count
-     * @param key a factory of stable and unique keys representing the item. Using the same key
-     * for multiple items in the list is not allowed. Type of the key should be saveable
-     * via Bundle on Android. If null is passed the position in the list will represent the key.
-     * When you specify the key the scroll position will be maintained based on the key, which
-     * means if you add/remove items before the current visible item the item with the given key
-     * will be kept as the first visible one. This can be overridden by calling
-     * 'requestScrollToItem' on the 'LazyListState'.
-     * @param contentType a factory of the content types for the item. The item compositions of
-     * the same type could be reused more efficiently. Note that null is a valid type and items of such
-     * type will be considered compatible.
+     * @param key a factory of stable and unique keys representing the item. Using the same key for
+     *   multiple items in the list is not allowed. Type of the key should be saveable via Bundle on
+     *   Android. If null is passed the position in the list will represent the key. When you
+     *   specify the key the scroll position will be maintained based on the key, which means if you
+     *   add/remove items before the current visible item the item with the given key will be kept
+     *   as the first visible one. This can be overridden by calling 'requestScrollToItem' on the
+     *   'LazyListState'.
+     * @param contentType a factory of the content types for the item. The item compositions of the
+     *   same type could be reused more efficiently. Note that null is a valid type and items of
+     *   such type will be considered compatible.
      * @param itemContent the content displayed by a single item
      */
     fun items(
@@ -96,25 +94,25 @@
     }
 
     /**
-     * Adds a sticky header item, which will remain pinned even when scrolling after it.
-     * The header will remain pinned until the next header will take its place.
+     * Adds a sticky header item, which will remain pinned even when scrolling after it. The header
+     * will remain pinned until the next header will take its place.
      *
      * @sample androidx.compose.foundation.samples.StickyHeaderSample
      *
-     * @param key a stable and unique key representing the item. Using the same key
-     * for multiple items in the list is not allowed. Type of the key should be saveable
-     * via Bundle on Android. If null is passed the position in the list will represent the key.
-     * When you specify the key the scroll position will be maintained based on the key, which
-     * means if you add/remove items before the current visible item the item with the given key
-     * will be kept as the first visible one. This can be overridden by calling
-     * 'requestScrollToItem' on the 'LazyListState'.
+     * @param key a stable and unique key representing the item. Using the same key for multiple
+     *   items in the list is not allowed. Type of the key should be saveable via Bundle on Android.
+     *   If null is passed the position in the list will represent the key. When you specify the key
+     *   the scroll position will be maintained based on the key, which means if you add/remove
+     *   items before the current visible item the item with the given key will be kept as the first
+     *   visible one. This can be overridden by calling 'requestScrollToItem' on the
+     *   'LazyListState'.
      * @param contentType the type of the content of this item. The item compositions of the same
-     * type could be reused more efficiently. Note that null is a valid type and items of such
-     * type will be considered compatible.
+     *   type could be reused more efficiently. Note that null is a valid type and items of such
+     *   type will be considered compatible.
      * @param content the content of the header
      *
-     * Note: More investigations needed to make sure sticky headers API is suitable for various
-     * more generic usecases, e.g. in grids. This API is experimental until the answer is found.
+     * Note: More investigations needed to make sure sticky headers API is suitable for various more
+     * generic usecases, e.g. in grids. This API is experimental until the answer is found.
      */
     @ExperimentalFoundationApi
     fun stickyHeader(
@@ -128,16 +126,15 @@
  * Adds a list of items.
  *
  * @param items the data list
- * @param key a factory of stable and unique keys representing the item. Using the same key
- * for multiple items in the list is not allowed. Type of the key should be saveable
- * via Bundle on Android. If null is passed the position in the list will represent the key.
- * When you specify the key the scroll position will be maintained based on the key, which
- * means if you add/remove items before the current visible item the item with the given key
- * will be kept as the first visible one. This can be overridden by calling 'requestScrollToItem'
- * on the 'LazyListState'.
- * @param contentType a factory of the content types for the item. The item compositions of
- * the same type could be reused more efficiently. Note that null is a valid type and items of such
- * type will be considered compatible.
+ * @param key a factory of stable and unique keys representing the item. Using the same key for
+ *   multiple items in the list is not allowed. Type of the key should be saveable via Bundle on
+ *   Android. If null is passed the position in the list will represent the key. When you specify
+ *   the key the scroll position will be maintained based on the key, which means if you add/remove
+ *   items before the current visible item the item with the given key will be kept as the first
+ *   visible one. This can be overridden by calling 'requestScrollToItem' on the 'LazyListState'.
+ * @param contentType a factory of the content types for the item. The item compositions of the same
+ *   type could be reused more efficiently. Note that null is a valid type and items of such type
+ *   will be considered compatible.
  * @param itemContent the content displayed by a single item
  */
 inline fun <T> LazyListScope.items(
@@ -145,13 +142,14 @@
     noinline key: ((item: T) -> Any)? = null,
     noinline contentType: (item: T) -> Any? = { null },
     crossinline itemContent: @Composable LazyItemScope.(item: T) -> Unit
-) = items(
-    count = items.size,
-    key = if (key != null) { index: Int -> key(items[index]) } else null,
-    contentType = { index: Int -> contentType(items[index]) }
-) {
-    itemContent(items[it])
-}
+) =
+    items(
+        count = items.size,
+        key = if (key != null) { index: Int -> key(items[index]) } else null,
+        contentType = { index: Int -> contentType(items[index]) }
+    ) {
+        itemContent(items[it])
+    }
 
 @Deprecated("Use the non deprecated overload", level = DeprecationLevel.HIDDEN)
 inline fun <T> LazyListScope.items(
@@ -164,16 +162,15 @@
  * Adds a list of items where the content of an item is aware of its index.
  *
  * @param items the data list
- * @param key a factory of stable and unique keys representing the item. Using the same key
- * for multiple items in the list is not allowed. Type of the key should be saveable
- * via Bundle on Android. If null is passed the position in the list will represent the key.
- * When you specify the key the scroll position will be maintained based on the key, which
- * means if you add/remove items before the current visible item the item with the given key
- * will be kept as the first visible one. This can be overridden by calling 'requestScrollToItem'
- * on the 'LazyListState'.
- * @param contentType a factory of the content types for the item. The item compositions of
- * the same type could be reused more efficiently. Note that null is a valid type and items of such
- * type will be considered compatible.
+ * @param key a factory of stable and unique keys representing the item. Using the same key for
+ *   multiple items in the list is not allowed. Type of the key should be saveable via Bundle on
+ *   Android. If null is passed the position in the list will represent the key. When you specify
+ *   the key the scroll position will be maintained based on the key, which means if you add/remove
+ *   items before the current visible item the item with the given key will be kept as the first
+ *   visible one. This can be overridden by calling 'requestScrollToItem' on the 'LazyListState'.
+ * @param contentType a factory of the content types for the item. The item compositions of the same
+ *   type could be reused more efficiently. Note that null is a valid type and items of such type
+ *   will be considered compatible.
  * @param itemContent the content displayed by a single item
  */
 inline fun <T> LazyListScope.itemsIndexed(
@@ -181,13 +178,14 @@
     noinline key: ((index: Int, item: T) -> Any)? = null,
     crossinline contentType: (index: Int, item: T) -> Any? = { _, _ -> null },
     crossinline itemContent: @Composable LazyItemScope.(index: Int, item: T) -> Unit
-) = items(
-    count = items.size,
-    key = if (key != null) { index: Int -> key(index, items[index]) } else null,
-    contentType = { index -> contentType(index, items[index]) }
-) {
-    itemContent(it, items[it])
-}
+) =
+    items(
+        count = items.size,
+        key = if (key != null) { index: Int -> key(index, items[index]) } else null,
+        contentType = { index -> contentType(index, items[index]) }
+    ) {
+        itemContent(it, items[it])
+    }
 
 @Deprecated("Use the non deprecated overload", level = DeprecationLevel.HIDDEN)
 inline fun <T> LazyListScope.itemsIndexed(
@@ -200,16 +198,15 @@
  * Adds an array of items.
  *
  * @param items the data array
- * @param key a factory of stable and unique keys representing the item. Using the same key
- * for multiple items in the list is not allowed. Type of the key should be saveable
- * via Bundle on Android. If null is passed the position in the list will represent the key.
- * When you specify the key the scroll position will be maintained based on the key, which
- * means if you add/remove items before the current visible item the item with the given key
- * will be kept as the first visible one. This can be overridden by calling 'requestScrollToItem'
- * on the 'LazyListState'.
- * @param contentType a factory of the content types for the item. The item compositions of
- * the same type could be reused more efficiently. Note that null is a valid type and items of such
- * type will be considered compatible.
+ * @param key a factory of stable and unique keys representing the item. Using the same key for
+ *   multiple items in the list is not allowed. Type of the key should be saveable via Bundle on
+ *   Android. If null is passed the position in the list will represent the key. When you specify
+ *   the key the scroll position will be maintained based on the key, which means if you add/remove
+ *   items before the current visible item the item with the given key will be kept as the first
+ *   visible one. This can be overridden by calling 'requestScrollToItem' on the 'LazyListState'.
+ * @param contentType a factory of the content types for the item. The item compositions of the same
+ *   type could be reused more efficiently. Note that null is a valid type and items of such type
+ *   will be considered compatible.
  * @param itemContent the content displayed by a single item
  */
 inline fun <T> LazyListScope.items(
@@ -217,13 +214,14 @@
     noinline key: ((item: T) -> Any)? = null,
     noinline contentType: (item: T) -> Any? = { null },
     crossinline itemContent: @Composable LazyItemScope.(item: T) -> Unit
-) = items(
-    count = items.size,
-    key = if (key != null) { index: Int -> key(items[index]) } else null,
-    contentType = { index: Int -> contentType(items[index]) }
-) {
-    itemContent(items[it])
-}
+) =
+    items(
+        count = items.size,
+        key = if (key != null) { index: Int -> key(items[index]) } else null,
+        contentType = { index: Int -> contentType(items[index]) }
+    ) {
+        itemContent(items[it])
+    }
 
 @Deprecated("Use the non deprecated overload", level = DeprecationLevel.HIDDEN)
 inline fun <T> LazyListScope.items(
@@ -236,16 +234,15 @@
  * Adds an array of items where the content of an item is aware of its index.
  *
  * @param items the data array
- * @param key a factory of stable and unique keys representing the item. Using the same key
- * for multiple items in the list is not allowed. Type of the key should be saveable
- * via Bundle on Android. If null is passed the position in the list will represent the key.
- * When you specify the key the scroll position will be maintained based on the key, which
- * means if you add/remove items before the current visible item the item with the given key
- * will be kept as the first visible one. This can be overridden by calling 'requestScrollToItem'
- * on the 'LazyListState'.
- * @param contentType a factory of the content types for the item. The item compositions of
- * the same type could be reused more efficiently. Note that null is a valid type and items of such
- * type will be considered compatible.
+ * @param key a factory of stable and unique keys representing the item. Using the same key for
+ *   multiple items in the list is not allowed. Type of the key should be saveable via Bundle on
+ *   Android. If null is passed the position in the list will represent the key. When you specify
+ *   the key the scroll position will be maintained based on the key, which means if you add/remove
+ *   items before the current visible item the item with the given key will be kept as the first
+ *   visible one. This can be overridden by calling 'requestScrollToItem' on the 'LazyListState'.
+ * @param contentType a factory of the content types for the item. The item compositions of the same
+ *   type could be reused more efficiently. Note that null is a valid type and items of such type
+ *   will be considered compatible.
  * @param itemContent the content displayed by a single item
  */
 inline fun <T> LazyListScope.itemsIndexed(
@@ -253,13 +250,14 @@
     noinline key: ((index: Int, item: T) -> Any)? = null,
     crossinline contentType: (index: Int, item: T) -> Any? = { _, _ -> null },
     crossinline itemContent: @Composable LazyItemScope.(index: Int, item: T) -> Unit
-) = items(
-    count = items.size,
-    key = if (key != null) { index: Int -> key(index, items[index]) } else null,
-    contentType = { index -> contentType(index, items[index]) }
-) {
-    itemContent(it, items[it])
-}
+) =
+    items(
+        count = items.size,
+        key = if (key != null) { index: Int -> key(index, items[index]) } else null,
+        contentType = { index -> contentType(index, items[index]) }
+    ) {
+        itemContent(it, items[it])
+    }
 
 @Deprecated("Use the non deprecated overload", level = DeprecationLevel.HIDDEN)
 inline fun <T> LazyListScope.itemsIndexed(
@@ -269,32 +267,32 @@
 ) = itemsIndexed(items, key, itemContent = itemContent)
 
 /**
- * The horizontally scrolling list that only composes and lays out the currently visible items.
- * The [content] block defines a DSL which allows you to emit items of different types. For
- * example you can use [LazyListScope.item] to add a single item and [LazyListScope.items] to add
- * a list of items.
+ * The horizontally scrolling list that only composes and lays out the currently visible items. The
+ * [content] block defines a DSL which allows you to emit items of different types. For example you
+ * can use [LazyListScope.item] to add a single item and [LazyListScope.items] to add a list of
+ * items.
  *
  * @sample androidx.compose.foundation.samples.LazyRowSample
  *
  * @param modifier the modifier to apply to this layout
  * @param state the state object to be used to control or observe the list's state
- * @param contentPadding a padding around the whole content. This will add padding for the
- * content after it has been clipped, which is not possible via [modifier] param. You can use it
- * to add a padding before the first item or after the last one. If you want to add a spacing
- * between each item use [horizontalArrangement].
- * @param reverseLayout reverse the direction of scrolling and layout. When `true`, items are
- * laid out in the reverse order and [LazyListState.firstVisibleItemIndex] == 0 means
- * that row is scrolled to the end. Note that [reverseLayout] does not change the behavior of
- * [horizontalArrangement], e.g. with [Arrangement.Start] [123###] becomes [321###].
- * @param horizontalArrangement The horizontal arrangement of the layout's children. This allows
- * to add a spacing between items and specify the arrangement of the items when we have not enough
- * of them to fill the whole minimum size.
+ * @param contentPadding a padding around the whole content. This will add padding for the content
+ *   after it has been clipped, which is not possible via [modifier] param. You can use it to add a
+ *   padding before the first item or after the last one. If you want to add a spacing between each
+ *   item use [horizontalArrangement].
+ * @param reverseLayout reverse the direction of scrolling and layout. When `true`, items are laid
+ *   out in the reverse order and [LazyListState.firstVisibleItemIndex] == 0 means that row is
+ *   scrolled to the end. Note that [reverseLayout] does not change the behavior of
+ *   [horizontalArrangement], e.g. with [Arrangement.Start] [123###] becomes [321###].
+ * @param horizontalArrangement The horizontal arrangement of the layout's children. This allows to
+ *   add a spacing between items and specify the arrangement of the items when we have not enough of
+ *   them to fill the whole minimum size.
  * @param verticalAlignment the vertical alignment applied to the items
  * @param flingBehavior logic describing fling behavior.
- * @param userScrollEnabled whether the scrolling via the user gestures or accessibility actions
- * is allowed. You can still scroll programmatically using the state even when it is disabled.
+ * @param userScrollEnabled whether the scrolling via the user gestures or accessibility actions is
+ *   allowed. You can still scroll programmatically using the state even when it is disabled.
  * @param content a block which describes the content. Inside this block you can use methods like
- * [LazyListScope.item] to add a single item or [LazyListScope.items] to add a list of items.
+ *   [LazyListScope.item] to add a single item or [LazyListScope.items] to add a list of items.
  */
 @Composable
 fun LazyRow(
@@ -324,33 +322,33 @@
 }
 
 /**
- * The vertically scrolling list that only composes and lays out the currently visible items.
- * The [content] block defines a DSL which allows you to emit items of different types. For
- * example you can use [LazyListScope.item] to add a single item and [LazyListScope.items] to add
- * a list of items.
+ * The vertically scrolling list that only composes and lays out the currently visible items. The
+ * [content] block defines a DSL which allows you to emit items of different types. For example you
+ * can use [LazyListScope.item] to add a single item and [LazyListScope.items] to add a list of
+ * items.
  *
  * @sample androidx.compose.foundation.samples.LazyColumnSample
  *
  * @param modifier the modifier to apply to this layout.
  * @param state the state object to be used to control or observe the list's state.
- * @param contentPadding a padding around the whole content. This will add padding for the.
- * content after it has been clipped, which is not possible via [modifier] param. You can use it
- * to add a padding before the first item or after the last one. If you want to add a spacing
- * between each item use [verticalArrangement].
- * @param reverseLayout reverse the direction of scrolling and layout. When `true`, items are
- * laid out in the reverse order and [LazyListState.firstVisibleItemIndex] == 0 means
- * that column is scrolled to the bottom. Note that [reverseLayout] does not change the behavior of
- * [verticalArrangement],
- * e.g. with [Arrangement.Top] (top) 123### (bottom) becomes (top) 321### (bottom).
- * @param verticalArrangement The vertical arrangement of the layout's children. This allows
- * to add a spacing between items and specify the arrangement of the items when we have not enough
- * of them to fill the whole minimum size.
+ * @param contentPadding a padding around the whole content. This will add padding for the. content
+ *   after it has been clipped, which is not possible via [modifier] param. You can use it to add a
+ *   padding before the first item or after the last one. If you want to add a spacing between each
+ *   item use [verticalArrangement].
+ * @param reverseLayout reverse the direction of scrolling and layout. When `true`, items are laid
+ *   out in the reverse order and [LazyListState.firstVisibleItemIndex] == 0 means that column is
+ *   scrolled to the bottom. Note that [reverseLayout] does not change the behavior of
+ *   [verticalArrangement], e.g. with [Arrangement.Top] (top) 123### (bottom) becomes (top) 321###
+ *   (bottom).
+ * @param verticalArrangement The vertical arrangement of the layout's children. This allows to add
+ *   a spacing between items and specify the arrangement of the items when we have not enough of
+ *   them to fill the whole minimum size.
  * @param horizontalAlignment the horizontal alignment applied to the items.
  * @param flingBehavior logic describing fling behavior.
- * @param userScrollEnabled whether the scrolling via the user gestures or accessibility actions
- * is allowed. You can still scroll programmatically using the state even when it is disabled
+ * @param userScrollEnabled whether the scrolling via the user gestures or accessibility actions is
+ *   allowed. You can still scroll programmatically using the state even when it is disabled
  * @param content a block which describes the content. Inside this block you can use methods like
- * [LazyListScope.item] to add a single item or [LazyListScope.items] to add a list of items.
+ *   [LazyListScope.item] to add a single item or [LazyListScope.items] to add a list of items.
  */
 @Composable
 fun LazyColumn(
diff --git a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/LazyItemScope.kt b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/LazyItemScope.kt
index d1e3b18..3d5a1ae 100644
--- a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/LazyItemScope.kt
+++ b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/LazyItemScope.kt
@@ -28,9 +28,7 @@
 import androidx.compose.ui.unit.Constraints
 import androidx.compose.ui.unit.IntOffset
 
-/**
- * Receiver scope being used by the item content parameter of LazyColumn/Row.
- */
+/** Receiver scope being used by the item content parameter of LazyColumn/Row. */
 @Stable
 @LazyScopeMarker
 @JvmDefaultWithCompatibility
@@ -38,22 +36,20 @@
     /**
      * Have the content fill the [Constraints.maxWidth] and [Constraints.maxHeight] of the parent
      * measurement constraints by setting the [minimum width][Constraints.minWidth] to be equal to
-     * the [maximum width][Constraints.maxWidth] multiplied by [fraction] and the [minimum
-     * height][Constraints.minHeight] to be equal to the [maximum height][Constraints.maxHeight]
-     * multiplied by [fraction]. Note that, by default, the [fraction] is 1, so the modifier will
-     * make the content fill the whole available space. [fraction] must be between `0` and `1`.
+     * the [maximum width][Constraints.maxWidth] multiplied by [fraction] and the
+     * [minimum height][Constraints.minHeight] to be equal to the
+     * [maximum height][Constraints.maxHeight] multiplied by [fraction]. Note that, by default, the
+     * [fraction] is 1, so the modifier will make the content fill the whole available space.
+     * [fraction] must be between `0` and `1`.
      *
      * Regular [Modifier.fillMaxSize] can't work inside the scrolling layouts as the items are
      * measured with [Constraints.Infinity] as the constraints for the main axis.
      */
-    fun Modifier.fillParentMaxSize(
-        @FloatRange(from = 0.0, to = 1.0)
-        fraction: Float = 1f
-    ): Modifier
+    fun Modifier.fillParentMaxSize(@FloatRange(from = 0.0, to = 1.0) fraction: Float = 1f): Modifier
 
     /**
-     * Have the content fill the [Constraints.maxWidth] of the parent measurement constraints
-     * by setting the [minimum width][Constraints.minWidth] to be equal to the
+     * Have the content fill the [Constraints.maxWidth] of the parent measurement constraints by
+     * setting the [minimum width][Constraints.minWidth] to be equal to the
      * [maximum width][Constraints.maxWidth] multiplied by [fraction]. Note that, by default, the
      * [fraction] is 1, so the modifier will make the content fill the whole parent width.
      * [fraction] must be between `0` and `1`.
@@ -62,13 +58,12 @@
      * items are measured with [Constraints.Infinity] as the constraints for the main axis.
      */
     fun Modifier.fillParentMaxWidth(
-        @FloatRange(from = 0.0, to = 1.0)
-        fraction: Float = 1f
+        @FloatRange(from = 0.0, to = 1.0) fraction: Float = 1f
     ): Modifier
 
     /**
-     * Have the content fill the [Constraints.maxHeight] of the incoming measurement constraints
-     * by setting the [minimum height][Constraints.minHeight] to be equal to the
+     * Have the content fill the [Constraints.maxHeight] of the incoming measurement constraints by
+     * setting the [minimum height][Constraints.minHeight] to be equal to the
      * [maximum height][Constraints.maxHeight] multiplied by [fraction]. Note that, by default, the
      * [fraction] is 1, so the modifier will make the content fill the whole parent height.
      * [fraction] must be between `0` and `1`.
@@ -77,8 +72,7 @@
      * items are measured with [Constraints.Infinity] as the constraints for the main axis.
      */
     fun Modifier.fillParentMaxHeight(
-        @FloatRange(from = 0.0, to = 1.0)
-        fraction: Float = 1f
+        @FloatRange(from = 0.0, to = 1.0) fraction: Float = 1f
     ): Modifier
 
     /**
@@ -90,22 +84,22 @@
      *
      * @sample androidx.compose.foundation.samples.AnimateItemSample
      *
-     * @param fadeInSpec an animation specs to use for animating the item appearance.
-     * When null is provided the item will be appearing without animations.
+     * @param fadeInSpec an animation specs to use for animating the item appearance. When null is
+     *   provided the item will be appearing without animations.
      * @param placementSpec an animation specs that will be used to animate the item placement.
-     * Aside from item reordering all other position changes caused by events like arrangement or
-     * alignment changes will also be animated. When null is provided no animations will happen.
-     * @param fadeOutSpec an animation specs to use for animating the item disappearance.
-     * When null is provided the item will be disappearance without animations.
+     *   Aside from item reordering all other position changes caused by events like arrangement or
+     *   alignment changes will also be animated. When null is provided no animations will happen.
+     * @param fadeOutSpec an animation specs to use for animating the item disappearance. When null
+     *   is provided the item will be disappearance without animations.
      */
     fun Modifier.animateItem(
         fadeInSpec: FiniteAnimationSpec<Float>? = spring(stiffness = Spring.StiffnessMediumLow),
-        placementSpec: FiniteAnimationSpec<IntOffset>? = spring(
-            stiffness = Spring.StiffnessMediumLow,
-            visibilityThreshold = IntOffset.VisibilityThreshold
-        ),
-        fadeOutSpec: FiniteAnimationSpec<Float>? =
-            spring(stiffness = Spring.StiffnessMediumLow),
+        placementSpec: FiniteAnimationSpec<IntOffset>? =
+            spring(
+                stiffness = Spring.StiffnessMediumLow,
+                visibilityThreshold = IntOffset.VisibilityThreshold
+            ),
+        fadeOutSpec: FiniteAnimationSpec<Float>? = spring(stiffness = Spring.StiffnessMediumLow),
     ): Modifier = this
 
     /**
@@ -126,13 +120,10 @@
     )
     @ExperimentalFoundationApi
     fun Modifier.animateItemPlacement(
-        animationSpec: FiniteAnimationSpec<IntOffset> = spring(
-            stiffness = Spring.StiffnessMediumLow,
-            visibilityThreshold = IntOffset.VisibilityThreshold
-        )
-    ): Modifier = animateItem(
-        fadeInSpec = null,
-        placementSpec = animationSpec,
-        fadeOutSpec = null
-    )
+        animationSpec: FiniteAnimationSpec<IntOffset> =
+            spring(
+                stiffness = Spring.StiffnessMediumLow,
+                visibilityThreshold = IntOffset.VisibilityThreshold
+            )
+    ): Modifier = animateItem(fadeInSpec = null, placementSpec = animationSpec, fadeOutSpec = null)
 }
diff --git a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/LazyItemScopeImpl.kt b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/LazyItemScopeImpl.kt
index dd8d012..aeea215 100644
--- a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/LazyItemScopeImpl.kt
+++ b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/LazyItemScopeImpl.kt
@@ -41,30 +41,33 @@
         maxHeightState.intValue = height
     }
 
-    override fun Modifier.fillParentMaxSize(fraction: Float) = then(
-        ParentSizeElement(
-            widthState = maxWidthState,
-            heightState = maxHeightState,
-            fraction = fraction,
-            inspectorName = "fillParentMaxSize"
+    override fun Modifier.fillParentMaxSize(fraction: Float) =
+        then(
+            ParentSizeElement(
+                widthState = maxWidthState,
+                heightState = maxHeightState,
+                fraction = fraction,
+                inspectorName = "fillParentMaxSize"
+            )
         )
-    )
 
-    override fun Modifier.fillParentMaxWidth(fraction: Float) = then(
-        ParentSizeElement(
-            widthState = maxWidthState,
-            fraction = fraction,
-            inspectorName = "fillParentMaxWidth"
+    override fun Modifier.fillParentMaxWidth(fraction: Float) =
+        then(
+            ParentSizeElement(
+                widthState = maxWidthState,
+                fraction = fraction,
+                inspectorName = "fillParentMaxWidth"
+            )
         )
-    )
 
-    override fun Modifier.fillParentMaxHeight(fraction: Float) = then(
-        ParentSizeElement(
-            heightState = maxHeightState,
-            fraction = fraction,
-            inspectorName = "fillParentMaxHeight"
+    override fun Modifier.fillParentMaxHeight(fraction: Float) =
+        then(
+            ParentSizeElement(
+                heightState = maxHeightState,
+                fraction = fraction,
+                inspectorName = "fillParentMaxHeight"
+            )
         )
-    )
 
     override fun Modifier.animateItem(
         fadeInSpec: FiniteAnimationSpec<Float>?,
@@ -74,11 +77,7 @@
         if (fadeInSpec == null && placementSpec == null && fadeOutSpec == null) {
             this
         } else {
-            this then LazyLayoutAnimateItemElement(
-                fadeInSpec,
-                placementSpec,
-                fadeOutSpec
-            )
+            this then LazyLayoutAnimateItemElement(fadeInSpec, placementSpec, fadeOutSpec)
         }
 }
 
@@ -133,30 +132,31 @@
         measurable: Measurable,
         constraints: Constraints
     ): MeasureResult {
-        val width = widthState?.let {
-            if (it.value != Constraints.Infinity) {
-                (it.value * fraction).fastRoundToInt()
-            } else {
-                Constraints.Infinity
-            }
-        } ?: Constraints.Infinity
+        val width =
+            widthState?.let {
+                if (it.value != Constraints.Infinity) {
+                    (it.value * fraction).fastRoundToInt()
+                } else {
+                    Constraints.Infinity
+                }
+            } ?: Constraints.Infinity
 
-        val height = heightState?.let {
-            if (it.value != Constraints.Infinity) {
-                (it.value * fraction).fastRoundToInt()
-            } else {
-                Constraints.Infinity
-            }
-        } ?: Constraints.Infinity
-        val childConstraints = Constraints(
-            minWidth = if (width != Constraints.Infinity) width else constraints.minWidth,
-            minHeight = if (height != Constraints.Infinity) height else constraints.minHeight,
-            maxWidth = if (width != Constraints.Infinity) width else constraints.maxWidth,
-            maxHeight = if (height != Constraints.Infinity) height else constraints.maxHeight,
-        )
+        val height =
+            heightState?.let {
+                if (it.value != Constraints.Infinity) {
+                    (it.value * fraction).fastRoundToInt()
+                } else {
+                    Constraints.Infinity
+                }
+            } ?: Constraints.Infinity
+        val childConstraints =
+            Constraints(
+                minWidth = if (width != Constraints.Infinity) width else constraints.minWidth,
+                minHeight = if (height != Constraints.Infinity) height else constraints.minHeight,
+                maxWidth = if (width != Constraints.Infinity) width else constraints.maxWidth,
+                maxHeight = if (height != Constraints.Infinity) height else constraints.maxHeight,
+            )
         val placeable = measurable.measure(childConstraints)
-        return layout(placeable.width, placeable.height) {
-            placeable.place(0, 0)
-        }
+        return layout(placeable.width, placeable.height) { placeable.place(0, 0) }
     }
 }
diff --git a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/LazyLayoutSemanticState.kt b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/LazyLayoutSemanticState.kt
index 7e035d4..cac713bc 100644
--- a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/LazyLayoutSemanticState.kt
+++ b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/LazyLayoutSemanticState.kt
@@ -25,37 +25,43 @@
 internal fun LazyLayoutSemanticState(
     state: LazyListState,
     isVertical: Boolean
-): LazyLayoutSemanticState = object : LazyLayoutSemanticState {
+): LazyLayoutSemanticState =
+    object : LazyLayoutSemanticState {
 
-    override val scrollOffset: Float
-        get() = estimatedLazyScrollOffset(
-            state.firstVisibleItemIndex,
-            state.firstVisibleItemScrollOffset
-        )
-    override val maxScrollOffset: Float
-        get() = estimatedLazyMaxScrollOffset(
-            state.firstVisibleItemIndex,
-            state.firstVisibleItemScrollOffset,
-            state.canScrollForward
-        )
+        override val scrollOffset: Float
+            get() =
+                estimatedLazyScrollOffset(
+                    state.firstVisibleItemIndex,
+                    state.firstVisibleItemScrollOffset
+                )
 
-    override suspend fun scrollToItem(index: Int) {
-        state.scrollToItem(index)
+        override val maxScrollOffset: Float
+            get() =
+                estimatedLazyMaxScrollOffset(
+                    state.firstVisibleItemIndex,
+                    state.firstVisibleItemScrollOffset,
+                    state.canScrollForward
+                )
+
+        override suspend fun scrollToItem(index: Int) {
+            state.scrollToItem(index)
+        }
+
+        override fun collectionInfo(): CollectionInfo =
+            if (isVertical) {
+                CollectionInfo(rowCount = -1, columnCount = 1)
+            } else {
+                CollectionInfo(rowCount = 1, columnCount = -1)
+            }
+
+        override val viewport: Int
+            get() =
+                if (state.layoutInfo.orientation == Orientation.Vertical) {
+                    state.layoutInfo.viewportSize.height
+                } else {
+                    state.layoutInfo.viewportSize.width
+                }
+
+        override val contentPadding: Int
+            get() = state.layoutInfo.beforeContentPadding + state.layoutInfo.afterContentPadding
     }
-
-    override fun collectionInfo(): CollectionInfo =
-        if (isVertical) {
-            CollectionInfo(rowCount = -1, columnCount = 1)
-        } else {
-            CollectionInfo(rowCount = 1, columnCount = -1)
-        }
-
-    override val viewport: Int
-        get() = if (state.layoutInfo.orientation == Orientation.Vertical) {
-            state.layoutInfo.viewportSize.height
-        } else {
-            state.layoutInfo.viewportSize.width
-        }
-    override val contentPadding: Int
-        get() = state.layoutInfo.beforeContentPadding + state.layoutInfo.afterContentPadding
-}
diff --git a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/LazyList.kt b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/LazyList.kt
index b9113b7..5e8c9f5 100644
--- a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/LazyList.kt
+++ b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/LazyList.kt
@@ -87,60 +87,64 @@
     val graphicsContext = LocalGraphicsContext.current
     val stickyHeadersEnabled = !LocalScrollCaptureInProgress.current
 
-    val measurePolicy = rememberLazyListMeasurePolicy(
-        itemProviderLambda,
-        state,
-        contentPadding,
-        reverseLayout,
-        isVertical,
-        beyondBoundsItemCount,
-        horizontalAlignment,
-        verticalAlignment,
-        horizontalArrangement,
-        verticalArrangement,
-        coroutineScope,
-        graphicsContext,
-        stickyHeadersEnabled = stickyHeadersEnabled,
-    )
+    val measurePolicy =
+        rememberLazyListMeasurePolicy(
+            itemProviderLambda,
+            state,
+            contentPadding,
+            reverseLayout,
+            isVertical,
+            beyondBoundsItemCount,
+            horizontalAlignment,
+            verticalAlignment,
+            horizontalArrangement,
+            verticalArrangement,
+            coroutineScope,
+            graphicsContext,
+            stickyHeadersEnabled = stickyHeadersEnabled,
+        )
 
     val orientation = if (isVertical) Orientation.Vertical else Orientation.Horizontal
-    val reverseDirection = ScrollableDefaults.reverseDirection(
-        LocalLayoutDirection.current,
-        orientation,
-        reverseLayout
-    )
+    val reverseDirection =
+        ScrollableDefaults.reverseDirection(
+            LocalLayoutDirection.current,
+            orientation,
+            reverseLayout
+        )
     LazyLayout(
-        modifier = modifier
-            .then(state.remeasurementModifier)
-            .then(state.awaitLayoutModifier)
-            .lazyLayoutSemantics(
-                itemProviderLambda = itemProviderLambda,
-                state = semanticState,
-                orientation = orientation,
-                userScrollEnabled = userScrollEnabled,
-                reverseScrolling = reverseLayout,
-            )
-            .lazyLayoutBeyondBoundsModifier(
-                state = rememberLazyListBeyondBoundsState(
+        modifier =
+            modifier
+                .then(state.remeasurementModifier)
+                .then(state.awaitLayoutModifier)
+                .lazyLayoutSemantics(
+                    itemProviderLambda = itemProviderLambda,
+                    state = semanticState,
+                    orientation = orientation,
+                    userScrollEnabled = userScrollEnabled,
+                    reverseScrolling = reverseLayout,
+                )
+                .lazyLayoutBeyondBoundsModifier(
+                    state =
+                        rememberLazyListBeyondBoundsState(
+                            state = state,
+                            beyondBoundsItemCount = beyondBoundsItemCount
+                        ),
+                    beyondBoundsInfo = state.beyondBoundsInfo,
+                    reverseLayout = reverseLayout,
+                    layoutDirection = LocalLayoutDirection.current,
+                    orientation = orientation,
+                    enabled = userScrollEnabled
+                )
+                .then(state.itemAnimator.modifier)
+                .scrollingContainer(
                     state = state,
-                    beyondBoundsItemCount = beyondBoundsItemCount
+                    orientation = orientation,
+                    enabled = userScrollEnabled,
+                    reverseDirection = reverseDirection,
+                    flingBehavior = flingBehavior,
+                    interactionSource = state.internalInteractionSource,
+                    overscrollEffect = ScrollableDefaults.overscrollEffect()
                 ),
-                beyondBoundsInfo = state.beyondBoundsInfo,
-                reverseLayout = reverseLayout,
-                layoutDirection = LocalLayoutDirection.current,
-                orientation = orientation,
-                enabled = userScrollEnabled
-            )
-            .then(state.itemAnimator.modifier)
-            .scrollingContainer(
-                state = state,
-                orientation = orientation,
-                enabled = userScrollEnabled,
-                reverseDirection = reverseDirection,
-                flingBehavior = flingBehavior,
-                interactionSource = state.internalInteractionSource,
-                overscrollEffect = ScrollableDefaults.overscrollEffect()
-            ),
         prefetchState = state.prefetchState,
         measurePolicy = measurePolicy,
         itemProvider = itemProviderLambda
@@ -175,197 +179,215 @@
     /** Used for creating graphics layers */
     graphicsContext: GraphicsContext,
     stickyHeadersEnabled: Boolean,
-) = remember<LazyLayoutMeasureScope.(Constraints) -> MeasureResult>(
-    state,
-    contentPadding,
-    reverseLayout,
-    isVertical,
-    horizontalAlignment,
-    verticalAlignment,
-    horizontalArrangement,
-    verticalArrangement,
-    graphicsContext,
-    stickyHeadersEnabled,
-) {
-    { containerConstraints ->
-        state.measurementScopeInvalidator.attachToScope()
-        // Tracks if the lookahead pass has occurred
-        val hasLookaheadPassOccurred = state.hasLookaheadPassOccurred || isLookingAhead
-        checkScrollableContainerConstraints(
-            containerConstraints,
-            if (isVertical) Orientation.Vertical else Orientation.Horizontal
-        )
-
-        // resolve content paddings
-        val startPadding =
-            if (isVertical) {
-                contentPadding.calculateLeftPadding(layoutDirection).roundToPx()
-            } else {
-                // in horizontal configuration, padding is reversed by placeRelative
-                contentPadding.calculateStartPadding(layoutDirection).roundToPx()
-            }
-
-        val endPadding =
-            if (isVertical) {
-                contentPadding.calculateRightPadding(layoutDirection).roundToPx()
-            } else {
-                // in horizontal configuration, padding is reversed by placeRelative
-                contentPadding.calculateEndPadding(layoutDirection).roundToPx()
-            }
-        val topPadding = contentPadding.calculateTopPadding().roundToPx()
-        val bottomPadding = contentPadding.calculateBottomPadding().roundToPx()
-        val totalVerticalPadding = topPadding + bottomPadding
-        val totalHorizontalPadding = startPadding + endPadding
-        val totalMainAxisPadding = if (isVertical) totalVerticalPadding else totalHorizontalPadding
-        val beforeContentPadding = when {
-            isVertical && !reverseLayout -> topPadding
-            isVertical && reverseLayout -> bottomPadding
-            !isVertical && !reverseLayout -> startPadding
-            else -> endPadding // !isVertical && reverseLayout
-        }
-        val afterContentPadding = totalMainAxisPadding - beforeContentPadding
-        val contentConstraints =
-            containerConstraints.offset(-totalHorizontalPadding, -totalVerticalPadding)
-
-        val itemProvider = itemProviderLambda()
-        // this will update the scope used by the item composables
-        itemProvider.itemScope.setMaxSize(
-            width = contentConstraints.maxWidth,
-            height = contentConstraints.maxHeight
-        )
-
-        val spaceBetweenItemsDp = if (isVertical) {
-            requireNotNull(verticalArrangement) {
-                "null verticalArrangement when isVertical == true"
-            }.spacing
-        } else {
-            requireNotNull(horizontalArrangement) {
-                "null horizontalAlignment when isVertical == false"
-            }.spacing
-        }
-        val spaceBetweenItems = spaceBetweenItemsDp.roundToPx()
-
-        val itemsCount = itemProvider.itemCount
-
-        // can be negative if the content padding is larger than the max size from constraints
-        val mainAxisAvailableSize = if (isVertical) {
-            containerConstraints.maxHeight - totalVerticalPadding
-        } else {
-            containerConstraints.maxWidth - totalHorizontalPadding
-        }
-        val visualItemOffset = if (!reverseLayout || mainAxisAvailableSize > 0) {
-            IntOffset(startPadding, topPadding)
-        } else {
-            // When layout is reversed and paddings together take >100% of the available space,
-            // layout size is coerced to 0 when positioning. To take that space into account,
-            // we offset start padding by negative space between paddings.
-            IntOffset(
-                if (isVertical) startPadding else startPadding + mainAxisAvailableSize,
-                if (isVertical) topPadding + mainAxisAvailableSize else topPadding
+) =
+    remember<LazyLayoutMeasureScope.(Constraints) -> MeasureResult>(
+        state,
+        contentPadding,
+        reverseLayout,
+        isVertical,
+        horizontalAlignment,
+        verticalAlignment,
+        horizontalArrangement,
+        verticalArrangement,
+        graphicsContext,
+        stickyHeadersEnabled,
+    ) {
+        { containerConstraints ->
+            state.measurementScopeInvalidator.attachToScope()
+            // Tracks if the lookahead pass has occurred
+            val hasLookaheadPassOccurred = state.hasLookaheadPassOccurred || isLookingAhead
+            checkScrollableContainerConstraints(
+                containerConstraints,
+                if (isVertical) Orientation.Vertical else Orientation.Horizontal
             )
-        }
 
-        val measuredItemProvider = object : LazyListMeasuredItemProvider(
-            contentConstraints,
-            isVertical,
-            itemProvider,
-            this
-        ) {
-            override fun createItem(
-                index: Int,
-                key: Any,
-                contentType: Any?,
-                placeables: List<Placeable>,
-                constraints: Constraints
-            ): LazyListMeasuredItem {
-                // we add spaceBetweenItems as an extra spacing for all items apart from the last one so
-                // the lazy list measuring logic will take it into account.
-                val spacing = if (index == itemsCount - 1) 0 else spaceBetweenItems
-                return LazyListMeasuredItem(
-                    index = index,
-                    placeables = placeables,
-                    isVertical = isVertical,
-                    horizontalAlignment = horizontalAlignment,
-                    verticalAlignment = verticalAlignment,
-                    layoutDirection = layoutDirection,
-                    reverseLayout = reverseLayout,
-                    beforeContentPadding = beforeContentPadding,
-                    afterContentPadding = afterContentPadding,
-                    spacing = spacing,
-                    visualOffset = visualItemOffset,
-                    key = key,
-                    contentType = contentType,
-                    animator = state.itemAnimator,
-                    constraints = constraints
-                )
-            }
-        }
+            // resolve content paddings
+            val startPadding =
+                if (isVertical) {
+                    contentPadding.calculateLeftPadding(layoutDirection).roundToPx()
+                } else {
+                    // in horizontal configuration, padding is reversed by placeRelative
+                    contentPadding.calculateStartPadding(layoutDirection).roundToPx()
+                }
 
-        val firstVisibleItemIndex: Int
-        val firstVisibleScrollOffset: Int
-        Snapshot.withoutReadObservation {
-            firstVisibleItemIndex = state.updateScrollPositionIfTheFirstItemWasMoved(
-                itemProvider, state.firstVisibleItemIndex
+            val endPadding =
+                if (isVertical) {
+                    contentPadding.calculateRightPadding(layoutDirection).roundToPx()
+                } else {
+                    // in horizontal configuration, padding is reversed by placeRelative
+                    contentPadding.calculateEndPadding(layoutDirection).roundToPx()
+                }
+            val topPadding = contentPadding.calculateTopPadding().roundToPx()
+            val bottomPadding = contentPadding.calculateBottomPadding().roundToPx()
+            val totalVerticalPadding = topPadding + bottomPadding
+            val totalHorizontalPadding = startPadding + endPadding
+            val totalMainAxisPadding =
+                if (isVertical) totalVerticalPadding else totalHorizontalPadding
+            val beforeContentPadding =
+                when {
+                    isVertical && !reverseLayout -> topPadding
+                    isVertical && reverseLayout -> bottomPadding
+                    !isVertical && !reverseLayout -> startPadding
+                    else -> endPadding // !isVertical && reverseLayout
+                }
+            val afterContentPadding = totalMainAxisPadding - beforeContentPadding
+            val contentConstraints =
+                containerConstraints.offset(-totalHorizontalPadding, -totalVerticalPadding)
+
+            val itemProvider = itemProviderLambda()
+            // this will update the scope used by the item composables
+            itemProvider.itemScope.setMaxSize(
+                width = contentConstraints.maxWidth,
+                height = contentConstraints.maxHeight
             )
-            firstVisibleScrollOffset = state.firstVisibleItemScrollOffset
-        }
 
-        val pinnedItems = itemProvider.calculateLazyLayoutPinnedIndices(
-            pinnedItemList = state.pinnedItems,
-            beyondBoundsInfo = state.beyondBoundsInfo
-        )
+            val spaceBetweenItemsDp =
+                if (isVertical) {
+                    requireNotNull(verticalArrangement) {
+                            "null verticalArrangement when isVertical == true"
+                        }
+                        .spacing
+                } else {
+                    requireNotNull(horizontalArrangement) {
+                            "null horizontalAlignment when isVertical == false"
+                        }
+                        .spacing
+                }
+            val spaceBetweenItems = spaceBetweenItemsDp.roundToPx()
 
-        val scrollToBeConsumed = if (isLookingAhead || !hasLookaheadPassOccurred) {
-            state.scrollToBeConsumed
-        } else {
-            state.scrollDeltaBetweenPasses
-        }
+            val itemsCount = itemProvider.itemCount
 
-        @Suppress("PrimitiveInCollection")
-        val headerIndexes = if (stickyHeadersEnabled) {
-            itemProvider.headerIndexes
-        } else {
-            emptyList()
-        }
-
-        // todo: wrap with snapshot when b/341782245 is resolved
-        val measureResult =
-            measureLazyList(
-                itemsCount = itemsCount,
-                measuredItemProvider = measuredItemProvider,
-                mainAxisAvailableSize = mainAxisAvailableSize,
-                beforeContentPadding = beforeContentPadding,
-                afterContentPadding = afterContentPadding,
-                spaceBetweenItems = spaceBetweenItems,
-                firstVisibleItemIndex = firstVisibleItemIndex,
-                firstVisibleItemScrollOffset = firstVisibleScrollOffset,
-                scrollToBeConsumed = scrollToBeConsumed,
-                constraints = contentConstraints,
-                isVertical = isVertical,
-                headerIndexes = headerIndexes,
-                verticalArrangement = verticalArrangement,
-                horizontalArrangement = horizontalArrangement,
-                reverseLayout = reverseLayout,
-                density = this,
-                itemAnimator = state.itemAnimator,
-                beyondBoundsItemCount = beyondBoundsItemCount,
-                pinnedItems = pinnedItems,
-                hasLookaheadPassOccurred = hasLookaheadPassOccurred,
-                isLookingAhead = isLookingAhead,
-                postLookaheadLayoutInfo = state.postLookaheadLayoutInfo,
-                coroutineScope = coroutineScope,
-                placementScopeInvalidator = state.placementScopeInvalidator,
-                graphicsContext = graphicsContext,
-                layout = { width, height, placement ->
-                    layout(
-                        containerConstraints.constrainWidth(width + totalHorizontalPadding),
-                        containerConstraints.constrainHeight(height + totalVerticalPadding),
-                        emptyMap(),
-                        placement
+            // can be negative if the content padding is larger than the max size from constraints
+            val mainAxisAvailableSize =
+                if (isVertical) {
+                    containerConstraints.maxHeight - totalVerticalPadding
+                } else {
+                    containerConstraints.maxWidth - totalHorizontalPadding
+                }
+            val visualItemOffset =
+                if (!reverseLayout || mainAxisAvailableSize > 0) {
+                    IntOffset(startPadding, topPadding)
+                } else {
+                    // When layout is reversed and paddings together take >100% of the available
+                    // space,
+                    // layout size is coerced to 0 when positioning. To take that space into
+                    // account,
+                    // we offset start padding by negative space between paddings.
+                    IntOffset(
+                        if (isVertical) startPadding else startPadding + mainAxisAvailableSize,
+                        if (isVertical) topPadding + mainAxisAvailableSize else topPadding
                     )
                 }
-            )
-        state.applyMeasureResult(measureResult, isLookingAhead)
-        measureResult
+
+            val measuredItemProvider =
+                object :
+                    LazyListMeasuredItemProvider(
+                        contentConstraints,
+                        isVertical,
+                        itemProvider,
+                        this
+                    ) {
+                    override fun createItem(
+                        index: Int,
+                        key: Any,
+                        contentType: Any?,
+                        placeables: List<Placeable>,
+                        constraints: Constraints
+                    ): LazyListMeasuredItem {
+                        // we add spaceBetweenItems as an extra spacing for all items apart from the
+                        // last one so
+                        // the lazy list measuring logic will take it into account.
+                        val spacing = if (index == itemsCount - 1) 0 else spaceBetweenItems
+                        return LazyListMeasuredItem(
+                            index = index,
+                            placeables = placeables,
+                            isVertical = isVertical,
+                            horizontalAlignment = horizontalAlignment,
+                            verticalAlignment = verticalAlignment,
+                            layoutDirection = layoutDirection,
+                            reverseLayout = reverseLayout,
+                            beforeContentPadding = beforeContentPadding,
+                            afterContentPadding = afterContentPadding,
+                            spacing = spacing,
+                            visualOffset = visualItemOffset,
+                            key = key,
+                            contentType = contentType,
+                            animator = state.itemAnimator,
+                            constraints = constraints
+                        )
+                    }
+                }
+
+            val firstVisibleItemIndex: Int
+            val firstVisibleScrollOffset: Int
+            Snapshot.withoutReadObservation {
+                firstVisibleItemIndex =
+                    state.updateScrollPositionIfTheFirstItemWasMoved(
+                        itemProvider,
+                        state.firstVisibleItemIndex
+                    )
+                firstVisibleScrollOffset = state.firstVisibleItemScrollOffset
+            }
+
+            val pinnedItems =
+                itemProvider.calculateLazyLayoutPinnedIndices(
+                    pinnedItemList = state.pinnedItems,
+                    beyondBoundsInfo = state.beyondBoundsInfo
+                )
+
+            val scrollToBeConsumed =
+                if (isLookingAhead || !hasLookaheadPassOccurred) {
+                    state.scrollToBeConsumed
+                } else {
+                    state.scrollDeltaBetweenPasses
+                }
+
+            @Suppress("PrimitiveInCollection")
+            val headerIndexes =
+                if (stickyHeadersEnabled) {
+                    itemProvider.headerIndexes
+                } else {
+                    emptyList()
+                }
+
+            // todo: wrap with snapshot when b/341782245 is resolved
+            val measureResult =
+                measureLazyList(
+                    itemsCount = itemsCount,
+                    measuredItemProvider = measuredItemProvider,
+                    mainAxisAvailableSize = mainAxisAvailableSize,
+                    beforeContentPadding = beforeContentPadding,
+                    afterContentPadding = afterContentPadding,
+                    spaceBetweenItems = spaceBetweenItems,
+                    firstVisibleItemIndex = firstVisibleItemIndex,
+                    firstVisibleItemScrollOffset = firstVisibleScrollOffset,
+                    scrollToBeConsumed = scrollToBeConsumed,
+                    constraints = contentConstraints,
+                    isVertical = isVertical,
+                    headerIndexes = headerIndexes,
+                    verticalArrangement = verticalArrangement,
+                    horizontalArrangement = horizontalArrangement,
+                    reverseLayout = reverseLayout,
+                    density = this,
+                    itemAnimator = state.itemAnimator,
+                    beyondBoundsItemCount = beyondBoundsItemCount,
+                    pinnedItems = pinnedItems,
+                    hasLookaheadPassOccurred = hasLookaheadPassOccurred,
+                    isLookingAhead = isLookingAhead,
+                    postLookaheadLayoutInfo = state.postLookaheadLayoutInfo,
+                    coroutineScope = coroutineScope,
+                    placementScopeInvalidator = state.placementScopeInvalidator,
+                    graphicsContext = graphicsContext,
+                    layout = { width, height, placement ->
+                        layout(
+                            containerConstraints.constrainWidth(width + totalHorizontalPadding),
+                            containerConstraints.constrainHeight(height + totalVerticalPadding),
+                            emptyMap(),
+                            placement
+                        )
+                    }
+                )
+            state.applyMeasureResult(measureResult, isLookingAhead)
+            measureResult
+        }
     }
-}
diff --git a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/LazyListAnimateScrollScope.kt b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/LazyListAnimateScrollScope.kt
index 556bcb0..dbf0b44 100644
--- a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/LazyListAnimateScrollScope.kt
+++ b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/LazyListAnimateScrollScope.kt
@@ -23,13 +23,14 @@
 import androidx.compose.ui.util.fastSumBy
 
 @OptIn(ExperimentalFoundationApi::class)
-internal class LazyListAnimateScrollScope(
-    private val state: LazyListState
-) : LazyLayoutAnimateScrollScope {
+internal class LazyListAnimateScrollScope(private val state: LazyListState) :
+    LazyLayoutAnimateScrollScope {
 
-    override val firstVisibleItemIndex: Int get() = state.firstVisibleItemIndex
+    override val firstVisibleItemIndex: Int
+        get() = state.firstVisibleItemIndex
 
-    override val firstVisibleItemScrollOffset: Int get() = state.firstVisibleItemScrollOffset
+    override val firstVisibleItemScrollOffset: Int
+        get() = state.firstVisibleItemScrollOffset
 
     override val lastVisibleItemIndex: Int
         get() = state.layoutInfo.visibleItemsInfo.lastOrNull()?.index ?: 0
diff --git a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/LazyListBeyondBoundsModifier.kt b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/LazyListBeyondBoundsModifier.kt
index 03cd080..3f99e0e 100644
--- a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/LazyListBeyondBoundsModifier.kt
+++ b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/LazyListBeyondBoundsModifier.kt
@@ -30,10 +30,8 @@
     }
 }
 
-internal class LazyListBeyondBoundsState(
-    val state: LazyListState,
-    val beyondBoundsItemCount: Int
-) : LazyLayoutBeyondBoundsState {
+internal class LazyListBeyondBoundsState(val state: LazyListState, val beyondBoundsItemCount: Int) :
+    LazyLayoutBeyondBoundsState {
 
     override fun remeasure() {
         state.remeasurement?.forceRemeasure()
@@ -41,13 +39,17 @@
 
     override val itemCount: Int
         get() = state.layoutInfo.totalItemsCount
+
     override val hasVisibleItems: Boolean
         get() = state.layoutInfo.visibleItemsInfo.isNotEmpty()
+
     override val firstPlacedIndex: Int
         get() = maxOf(0, state.firstVisibleItemIndex - beyondBoundsItemCount)
+
     override val lastPlacedIndex: Int
-        get() = minOf(
-            itemCount - 1,
-            state.layoutInfo.visibleItemsInfo.last().index + beyondBoundsItemCount
-        )
+        get() =
+            minOf(
+                itemCount - 1,
+                state.layoutInfo.visibleItemsInfo.last().index + beyondBoundsItemCount
+            )
 }
diff --git a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/LazyListHeaders.kt b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/LazyListHeaders.kt
index 9eea720..76de54f 100644
--- a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/LazyListHeaders.kt
+++ b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/LazyListHeaders.kt
@@ -22,7 +22,8 @@
  * This method finds the sticky header in composedItems list or composes the header item if needed.
  *
  * @param composedVisibleItems list of items already composed and expected to be visible. if the
- * header wasn't in this list but is needed the header will be added as the first item in this list.
+ *   header wasn't in this list but is needed the header will be added as the first item in this
+ *   list.
  * @param itemProvider the provider so we can compose a header if it wasn't composed already
  * @param headerIndexes list of indexes of headers. Must be sorted.
  * @param beforeContentPadding the padding before the first item in the list
@@ -73,11 +74,12 @@
     val measuredHeaderItem = itemProvider.getAndMeasure(currentHeaderListPosition)
     measuredHeaderItem.nonScrollableItem = true
 
-    var headerOffset = if (currentHeaderOffset != Int.MIN_VALUE) {
-        maxOf(-beforeContentPadding, currentHeaderOffset)
-    } else {
-        -beforeContentPadding
-    }
+    var headerOffset =
+        if (currentHeaderOffset != Int.MIN_VALUE) {
+            maxOf(-beforeContentPadding, currentHeaderOffset)
+        } else {
+            -beforeContentPadding
+        }
     // if we have a next header overlapping with the current header, the next one will be
     // pushing the current one away from the viewport.
     if (nextHeaderOffset != Int.MIN_VALUE) {
diff --git a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/LazyListIntervalContent.kt b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/LazyListIntervalContent.kt
index 585f230..4eb7470 100644
--- a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/LazyListIntervalContent.kt
+++ b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/LazyListIntervalContent.kt
@@ -28,7 +28,8 @@
     override val intervals: MutableIntervalList<LazyListInterval> = MutableIntervalList()
 
     private var _headerIndexes: MutableList<Int>? = null
-    val headerIndexes: List<Int> get() = _headerIndexes ?: emptyList()
+    val headerIndexes: List<Int>
+        get() = _headerIndexes ?: emptyList()
 
     init {
         apply(content)
@@ -42,11 +43,7 @@
     ) {
         intervals.addInterval(
             count,
-            LazyListInterval(
-                key = key,
-                type = contentType,
-                item = itemContent
-            )
+            LazyListInterval(key = key, type = contentType, item = itemContent)
         )
     }
 
@@ -67,9 +64,7 @@
         contentType: Any?,
         content: @Composable LazyItemScope.() -> Unit
     ) {
-        val headersIndexes = _headerIndexes ?: mutableListOf<Int>().also {
-            _headerIndexes = it
-        }
+        val headersIndexes = _headerIndexes ?: mutableListOf<Int>().also { _headerIndexes = it }
         headersIndexes.add(intervals.size)
 
         item(key, contentType, content)
diff --git a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/LazyListItemInfo.kt b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/LazyListItemInfo.kt
index a1163fa..f58c3d1 100644
--- a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/LazyListItemInfo.kt
+++ b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/LazyListItemInfo.kt
@@ -17,35 +17,31 @@
 package androidx.compose.foundation.lazy
 
 /**
- * Contains useful information about an individual item in lazy lists like [LazyColumn]
- *  or [LazyRow].
+ * Contains useful information about an individual item in lazy lists like [LazyColumn] or
+ * [LazyRow].
  *
  * @see LazyListLayoutInfo
  */
 interface LazyListItemInfo {
-    /**
-     * The index of the item in the list.
-     */
+    /** The index of the item in the list. */
     val index: Int
 
-    /**
-     * The key of the item which was passed to the item() or items() function.
-     */
+    /** The key of the item which was passed to the item() or items() function. */
     val key: Any
 
     /**
-     * The main axis offset of the item in pixels. It is relative to the start of the lazy list container.
+     * The main axis offset of the item in pixels. It is relative to the start of the lazy list
+     * container.
      */
     val offset: Int
 
     /**
-     * The main axis size of the item in pixels. Note that if you emit multiple layouts in the composable
-     * slot for the item then this size will be calculated as the sum of their sizes.
+     * The main axis size of the item in pixels. Note that if you emit multiple layouts in the
+     * composable slot for the item then this size will be calculated as the sum of their sizes.
      */
     val size: Int
 
-    /**
-     * The content type of the item which was passed to the item() or items() function.
-     */
-    val contentType: Any? get() = null
+    /** The content type of the item which was passed to the item() or items() function. */
+    val contentType: Any?
+        get() = null
 }
diff --git a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/LazyListItemProvider.kt b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/LazyListItemProvider.kt
index ae95eb2..7555c72 100644
--- a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/LazyListItemProvider.kt
+++ b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/LazyListItemProvider.kt
@@ -45,32 +45,36 @@
     val latestContent = rememberUpdatedState(content)
     return remember(state) {
         val scope = LazyItemScopeImpl()
-        val intervalContentState = derivedStateOf(referentialEqualityPolicy()) {
-            LazyListIntervalContent(latestContent.value)
-        }
-        val itemProviderState = derivedStateOf(referentialEqualityPolicy()) {
-            val intervalContent = intervalContentState.value
-            val map = NearestRangeKeyIndexMap(state.nearestRange, intervalContent)
-            LazyListItemProviderImpl(
-                state = state,
-                intervalContent = intervalContent,
-                itemScope = scope,
-                keyIndexMap = map
-            )
-        }
+        val intervalContentState =
+            derivedStateOf(referentialEqualityPolicy()) {
+                LazyListIntervalContent(latestContent.value)
+            }
+        val itemProviderState =
+            derivedStateOf(referentialEqualityPolicy()) {
+                val intervalContent = intervalContentState.value
+                val map = NearestRangeKeyIndexMap(state.nearestRange, intervalContent)
+                LazyListItemProviderImpl(
+                    state = state,
+                    intervalContent = intervalContent,
+                    itemScope = scope,
+                    keyIndexMap = map
+                )
+            }
         itemProviderState::value
     }
 }
 
 @ExperimentalFoundationApi
-private class LazyListItemProviderImpl constructor(
+private class LazyListItemProviderImpl
+constructor(
     private val state: LazyListState,
     private val intervalContent: LazyListIntervalContent,
     override val itemScope: LazyItemScopeImpl,
     override val keyIndexMap: LazyLayoutKeyIndexMap,
 ) : LazyListItemProvider {
 
-    override val itemCount: Int get() = intervalContent.itemCount
+    override val itemCount: Int
+        get() = intervalContent.itemCount
 
     @Composable
     override fun Item(index: Int, key: Any) {
@@ -86,7 +90,8 @@
 
     override fun getContentType(index: Int): Any? = intervalContent.getContentType(index)
 
-    override val headerIndexes: List<Int> get() = intervalContent.headerIndexes
+    override val headerIndexes: List<Int>
+        get() = intervalContent.headerIndexes
 
     override fun getIndex(key: Any): Int = keyIndexMap.getIndex(key)
 
diff --git a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/LazyListLayoutInfo.kt b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/LazyListLayoutInfo.kt
index 37612eb..eb2bf7f 100644
--- a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/LazyListLayoutInfo.kt
+++ b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/LazyListLayoutInfo.kt
@@ -28,15 +28,14 @@
  */
 @JvmDefaultWithCompatibility
 interface LazyListLayoutInfo {
-    /**
-     * The list of [LazyListItemInfo] representing all the currently visible items.
-     */
+    /** The list of [LazyListItemInfo] representing all the currently visible items. */
     val visibleItemsInfo: List<LazyListItemInfo>
 
     /**
      * The start offset of the layout's viewport in pixels. You can think of it as a minimum offset
-     * which would be visible. Usually it is 0, but it can be negative if non-zero [beforeContentPadding]
-     * was applied as the content displayed in the content padding area is still visible.
+     * which would be visible. Usually it is 0, but it can be negative if non-zero
+     * [beforeContentPadding] was applied as the content displayed in the content padding area is
+     * still visible.
      *
      * You can use it to understand what items from [visibleItemsInfo] are fully visible.
      */
@@ -50,41 +49,39 @@
      */
     val viewportEndOffset: Int
 
-    /**
-     * The total count of items passed to [LazyColumn] or [LazyRow].
-     */
+    /** The total count of items passed to [LazyColumn] or [LazyRow]. */
     val totalItemsCount: Int
 
     /**
-     * The size of the viewport in pixels. It is the lazy list layout size including all the
-     * content paddings.
+     * The size of the viewport in pixels. It is the lazy list layout size including all the content
+     * paddings.
      */
-    val viewportSize: IntSize get() = IntSize.Zero
+    val viewportSize: IntSize
+        get() = IntSize.Zero
 
-    /**
-     * The orientation of the lazy list.
-     */
-    val orientation: Orientation get() = Orientation.Vertical
+    /** The orientation of the lazy list. */
+    val orientation: Orientation
+        get() = Orientation.Vertical
 
-    /**
-     * True if the direction of scrolling and layout is reversed.
-     */
-    val reverseLayout: Boolean get() = false
+    /** True if the direction of scrolling and layout is reversed. */
+    val reverseLayout: Boolean
+        get() = false
 
     /**
      * The content padding in pixels applied before the first item in the direction of scrolling.
      * For example it is a top content padding for LazyColumn with reverseLayout set to false.
      */
-    val beforeContentPadding: Int get() = 0
+    val beforeContentPadding: Int
+        get() = 0
 
     /**
-     * The content padding in pixels applied after the last item in the direction of scrolling.
-     * For example it is a bottom content padding for LazyColumn with reverseLayout set to false.
+     * The content padding in pixels applied after the last item in the direction of scrolling. For
+     * example it is a bottom content padding for LazyColumn with reverseLayout set to false.
      */
-    val afterContentPadding: Int get() = 0
+    val afterContentPadding: Int
+        get() = 0
 
-    /**
-     * The spacing between items in the direction of scrolling.
-     */
-    val mainAxisItemSpacing: Int get() = 0
+    /** The spacing between items in the direction of scrolling. */
+    val mainAxisItemSpacing: Int
+        get() = 0
 }
diff --git a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/LazyListMeasure.kt b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/LazyListMeasure.kt
index e1bdff3..b0e48e9 100644
--- a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/LazyListMeasure.kt
+++ b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/LazyListMeasure.kt
@@ -40,8 +40,8 @@
 import kotlinx.coroutines.CoroutineScope
 
 /**
- * Measures and calculates the positions for the requested items. The result is produced
- * as a [LazyListMeasureResult] which contains all the calculations.
+ * Measures and calculates the positions for the requested items. The result is produced as a
+ * [LazyListMeasureResult] which contains all the calculations.
  */
 internal fun measureLazyList(
     itemsCount: Int,
@@ -206,10 +206,11 @@
         // then composing visible items forward until we fill the whole viewport.
         // we want to have at least one item in visibleItems even if in fact all the items are
         // offscreen, this can happen if the content padding is larger than the available size.
-        while (index < itemsCount &&
-            (currentMainAxisOffset < maxMainAxis ||
-                currentMainAxisOffset <= 0 || // filling beforeContentPadding area
-                visibleItems.isEmpty())
+        while (
+            index < itemsCount &&
+                (currentMainAxisOffset < maxMainAxis ||
+                    currentMainAxisOffset <= 0 || // filling beforeContentPadding area
+                    visibleItems.isEmpty())
         ) {
             val measuredItem = measuredItemProvider.getAndMeasure(index)
             currentMainAxisOffset += measuredItem.mainAxisSizeWithSpacings
@@ -234,8 +235,8 @@
             val toScrollBack = maxOffset - currentMainAxisOffset
             currentFirstItemScrollOffset -= toScrollBack
             currentMainAxisOffset += toScrollBack
-            while (currentFirstItemScrollOffset < beforeContentPadding &&
-                currentFirstItemIndex > 0
+            while (
+                currentFirstItemScrollOffset < beforeContentPadding && currentFirstItemIndex > 0
             ) {
                 val previousIndex = currentFirstItemIndex - 1
                 val measuredItem = measuredItemProvider.getAndMeasure(previousIndex)
@@ -256,13 +257,15 @@
         // scrollToBeConsumed if there were not enough items to fill the offered space or it
         // can be larger if items were resized, or if, for example, we were previously
         // displaying the item 15, but now we have only 10 items in total in the data set.
-        val consumedScroll = if (scrollToBeConsumed.fastRoundToInt().sign == scrollDelta.sign &&
-            abs(scrollToBeConsumed.fastRoundToInt()) >= abs(scrollDelta)
-        ) {
-            scrollDelta.toFloat()
-        } else {
-            scrollToBeConsumed
-        }
+        val consumedScroll =
+            if (
+                scrollToBeConsumed.fastRoundToInt().sign == scrollDelta.sign &&
+                    abs(scrollToBeConsumed.fastRoundToInt()) >= abs(scrollDelta)
+            ) {
+                scrollDelta.toFloat()
+            } else {
+                scrollToBeConsumed
+            }
 
         val unconsumedScroll = scrollToBeConsumed - consumedScroll
         // When scrolling to the bottom via gesture, there could be scrollback due to
@@ -271,8 +274,7 @@
         val scrollBackAmount: Float =
             if (isLookingAhead && scrollDelta > preScrollBackScrollDelta && unconsumedScroll <= 0) {
                 scrollDelta - preScrollBackScrollDelta + unconsumedScroll
-            } else
-                0f
+            } else 0f
 
         // the initial offset for items from visibleItems list
         require(currentFirstItemScrollOffset >= 0) { "negative currentFirstItemScrollOffset" }
@@ -284,8 +286,10 @@
         if (beforeContentPadding > 0 || spaceBetweenItems < 0) {
             for (i in visibleItems.indices) {
                 val size = visibleItems[i].mainAxisSizeWithSpacings
-                if (currentFirstItemScrollOffset != 0 && size <= currentFirstItemScrollOffset &&
-                    i != visibleItems.lastIndex
+                if (
+                    currentFirstItemScrollOffset != 0 &&
+                        size <= currentFirstItemScrollOffset &&
+                        i != visibleItems.lastIndex
                 ) {
                     currentFirstItemScrollOffset -= size
                     firstItem = visibleItems[i + 1]
@@ -296,59 +300,59 @@
         }
 
         // Compose extra items before
-        val extraItemsBefore = createItemsBeforeList(
-            currentFirstItemIndex = currentFirstItemIndex,
-            measuredItemProvider = measuredItemProvider,
-            beyondBoundsItemCount = beyondBoundsItemCount,
-            pinnedItems = pinnedItems
-        )
+        val extraItemsBefore =
+            createItemsBeforeList(
+                currentFirstItemIndex = currentFirstItemIndex,
+                measuredItemProvider = measuredItemProvider,
+                beyondBoundsItemCount = beyondBoundsItemCount,
+                pinnedItems = pinnedItems
+            )
 
         // Update maxCrossAxis with extra items
-        extraItemsBefore.fastForEach {
-            maxCrossAxis = maxOf(maxCrossAxis, it.crossAxisSize)
-        }
+        extraItemsBefore.fastForEach { maxCrossAxis = maxOf(maxCrossAxis, it.crossAxisSize) }
 
         // Compose items after last item
-        val extraItemsAfter = createItemsAfterList(
-            visibleItems = visibleItems,
-            measuredItemProvider = measuredItemProvider,
-            itemsCount = itemsCount,
-            beyondBoundsItemCount = beyondBoundsItemCount,
-            pinnedItems = pinnedItems,
-            consumedScroll = consumedScroll,
-            isLookingAhead = isLookingAhead,
-            lastPostLookaheadLayoutInfo = postLookaheadLayoutInfo
-        )
+        val extraItemsAfter =
+            createItemsAfterList(
+                visibleItems = visibleItems,
+                measuredItemProvider = measuredItemProvider,
+                itemsCount = itemsCount,
+                beyondBoundsItemCount = beyondBoundsItemCount,
+                pinnedItems = pinnedItems,
+                consumedScroll = consumedScroll,
+                isLookingAhead = isLookingAhead,
+                lastPostLookaheadLayoutInfo = postLookaheadLayoutInfo
+            )
 
         // Update maxCrossAxis with extra items
-        extraItemsAfter.fastForEach {
-            maxCrossAxis = maxOf(maxCrossAxis, it.crossAxisSize)
-        }
+        extraItemsAfter.fastForEach { maxCrossAxis = maxOf(maxCrossAxis, it.crossAxisSize) }
 
-        val noExtraItems = firstItem == visibleItems.first() &&
-            extraItemsBefore.isEmpty() &&
-            extraItemsAfter.isEmpty()
+        val noExtraItems =
+            firstItem == visibleItems.first() &&
+                extraItemsBefore.isEmpty() &&
+                extraItemsAfter.isEmpty()
 
         var layoutWidth =
             constraints.constrainWidth(if (isVertical) maxCrossAxis else currentMainAxisOffset)
         var layoutHeight =
             constraints.constrainHeight(if (isVertical) currentMainAxisOffset else maxCrossAxis)
 
-        val positionedItems = calculateItemsOffsets(
-            items = visibleItems,
-            extraItemsBefore = extraItemsBefore,
-            extraItemsAfter = extraItemsAfter,
-            layoutWidth = layoutWidth,
-            layoutHeight = layoutHeight,
-            finalMainAxisOffset = currentMainAxisOffset,
-            maxOffset = maxOffset,
-            itemsScrollOffset = visibleItemsScrollOffset,
-            isVertical = isVertical,
-            verticalArrangement = verticalArrangement,
-            horizontalArrangement = horizontalArrangement,
-            reverseLayout = reverseLayout,
-            density = density,
-        )
+        val positionedItems =
+            calculateItemsOffsets(
+                items = visibleItems,
+                extraItemsBefore = extraItemsBefore,
+                extraItemsAfter = extraItemsAfter,
+                layoutWidth = layoutWidth,
+                layoutHeight = layoutHeight,
+                finalMainAxisOffset = currentMainAxisOffset,
+                maxOffset = maxOffset,
+                itemsScrollOffset = visibleItemsScrollOffset,
+                isVertical = isVertical,
+                verticalArrangement = verticalArrangement,
+                horizontalArrangement = horizontalArrangement,
+                reverseLayout = reverseLayout,
+                density = density,
+            )
 
         itemAnimator.onMeasured(
             consumedScroll = consumedScroll.toInt(),
@@ -377,47 +381,50 @@
                     constraints.constrainHeight(maxOf(layoutHeight, disappearingItemsSize.height))
                 val newMainAxisSize = if (isVertical) layoutHeight else layoutWidth
                 if (newMainAxisSize != oldMainAxisSize) {
-                    positionedItems.fastForEach {
-                        it.updateMainAxisLayoutSize(newMainAxisSize)
-                    }
+                    positionedItems.fastForEach { it.updateMainAxisLayoutSize(newMainAxisSize) }
                 }
             }
         }
 
-        val headerItem = if (headerIndexes.isNotEmpty()) {
-            findOrComposeLazyListHeader(
-                composedVisibleItems = positionedItems,
-                itemProvider = measuredItemProvider,
-                headerIndexes = headerIndexes,
-                beforeContentPadding = beforeContentPadding,
-                layoutWidth = layoutWidth,
-                layoutHeight = layoutHeight
-            )
-        } else {
-            null
-        }
+        val headerItem =
+            if (headerIndexes.isNotEmpty()) {
+                findOrComposeLazyListHeader(
+                    composedVisibleItems = positionedItems,
+                    itemProvider = measuredItemProvider,
+                    headerIndexes = headerIndexes,
+                    beforeContentPadding = beforeContentPadding,
+                    layoutWidth = layoutWidth,
+                    layoutHeight = layoutHeight
+                )
+            } else {
+                null
+            }
 
         return LazyListMeasureResult(
             firstVisibleItem = firstItem,
             firstVisibleItemScrollOffset = currentFirstItemScrollOffset,
             canScrollForward = index < itemsCount || currentMainAxisOffset > maxOffset,
             consumedScroll = consumedScroll,
-            measureResult = layout(layoutWidth, layoutHeight) {
-                positionedItems.fastForEach {
-                    if (it !== headerItem) {
-                        it.place(this, isLookingAhead)
+            measureResult =
+                layout(layoutWidth, layoutHeight) {
+                    positionedItems.fastForEach {
+                        if (it !== headerItem) {
+                            it.place(this, isLookingAhead)
+                        }
                     }
-                }
-                // the header item should be placed (drawn) after all other items
-                headerItem?.place(this, isLookingAhead)
-                // we attach it during the placement so LazyListState can trigger re-placement
-                placementScopeInvalidator.attachToScope()
-            },
+                    // the header item should be placed (drawn) after all other items
+                    headerItem?.place(this, isLookingAhead)
+                    // we attach it during the placement so LazyListState can trigger re-placement
+                    placementScopeInvalidator.attachToScope()
+                },
             scrollBackAmount = scrollBackAmount,
-            visibleItemsInfo = if (noExtraItems) positionedItems else positionedItems.fastFilter {
-                (it.index >= visibleItems.first().index && it.index <= visibleItems.last().index) ||
-                    it === headerItem
-            },
+            visibleItemsInfo =
+                if (noExtraItems) positionedItems
+                else
+                    positionedItems.fastFilter {
+                        (it.index >= visibleItems.first().index &&
+                            it.index <= visibleItems.last().index) || it === headerItem
+                    },
             viewportStartOffset = -beforeContentPadding,
             viewportEndOffset = maxOffset + afterContentPadding,
             totalItemsCount = itemsCount,
@@ -456,21 +463,23 @@
 
     if (isLookingAhead) {
         // Check if there's any item that needs to be composed based on last postLookaheadLayoutInfo
-        if (lastPostLookaheadLayoutInfo != null &&
-            lastPostLookaheadLayoutInfo.visibleItemsInfo.isNotEmpty()
+        if (
+            lastPostLookaheadLayoutInfo != null &&
+                lastPostLookaheadLayoutInfo.visibleItemsInfo.isNotEmpty()
         ) {
             // Find first item with index > end. Note that `visibleItemsInfo.last()` may not have
             // the largest index as the last few items could be added to animate item placement.
-            val firstItem = lastPostLookaheadLayoutInfo.visibleItemsInfo.run {
-                var found: LazyListItemInfo? = null
-                for (i in size - 1 downTo 0) {
-                    if (this[i].index > end && (i == 0 || this[i - 1].index <= end)) {
-                        found = this[i]
-                        break
+            val firstItem =
+                lastPostLookaheadLayoutInfo.visibleItemsInfo.run {
+                    var found: LazyListItemInfo? = null
+                    for (i in size - 1 downTo 0) {
+                        if (this[i].index > end && (i == 0 || this[i - 1].index <= end)) {
+                            found = this[i]
+                            break
+                        }
                     }
+                    found
                 }
-                found
-            }
             val lastVisibleItem = lastPostLookaheadLayoutInfo.visibleItemsInfo.last()
             if (firstItem != null) {
                 for (i in firstItem.index..min(lastVisibleItem.index, itemsCount - 1)) {
@@ -485,16 +494,18 @@
             // Calculate the additional offset to subcompose based on what was shown in the
             // previous post-loookahead pass and the scroll consumed.
             val additionalOffset =
-                lastPostLookaheadLayoutInfo.viewportEndOffset - lastVisibleItem.offset -
-                    lastVisibleItem.size - consumedScroll
+                lastPostLookaheadLayoutInfo.viewportEndOffset -
+                    lastVisibleItem.offset -
+                    lastVisibleItem.size -
+                    consumedScroll
             if (additionalOffset > 0) {
                 var index = lastVisibleItem.index + 1
                 var totalOffset = 0
                 while (index < itemsCount && totalOffset < additionalOffset) {
-                    val item = if (index <= end) {
-                        visibleItems.fastFirstOrNull { it.index == index }
-                    } else null
-                        ?: list?.fastFirstOrNull { it.index == index }
+                    val item =
+                        if (index <= end) {
+                            visibleItems.fastFirstOrNull { it.index == index }
+                        } else null ?: list?.fastFirstOrNull { it.index == index }
                     if (item != null) {
                         index++
                         totalOffset += item.mainAxisSizeWithSpacings
@@ -552,9 +563,7 @@
     return list ?: emptyList()
 }
 
-/**
- * Calculates [LazyListMeasuredItem]s offsets.
- */
+/** Calculates [LazyListMeasuredItem]s offsets. */
 private fun calculateItemsOffsets(
     items: List<LazyListMeasuredItem>,
     extraItemsBefore: List<LazyListMeasuredItem>,
@@ -583,12 +592,9 @@
         require(extraItemsBefore.isEmpty() && extraItemsAfter.isEmpty()) { "no extra items" }
 
         val itemsCount = items.size
-        fun Int.reverseAware() =
-            if (!reverseLayout) this else itemsCount - this - 1
+        fun Int.reverseAware() = if (!reverseLayout) this else itemsCount - this - 1
 
-        val sizes = IntArray(itemsCount) { index ->
-            items[index.reverseAware()].size
-        }
+        val sizes = IntArray(itemsCount) { index -> items[index.reverseAware()].size }
         val offsets = IntArray(itemsCount) { 0 }
         if (isVertical) {
             with(
@@ -615,12 +621,13 @@
             val absoluteOffset = offsets[index]
             // when reverseLayout == true, offsets are stored in the reversed order to items
             val item = items[index.reverseAware()]
-            val relativeOffset = if (reverseLayout) {
-                // inverse offset to align with scroll direction for positioning
-                mainAxisLayoutSize - absoluteOffset - item.size
-            } else {
-                absoluteOffset
-            }
+            val relativeOffset =
+                if (reverseLayout) {
+                    // inverse offset to align with scroll direction for positioning
+                    mainAxisLayoutSize - absoluteOffset - item.size
+                } else {
+                    absoluteOffset
+                }
             item.position(relativeOffset, layoutWidth, layoutHeight)
             positionedItems.add(item)
         }
diff --git a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/LazyListMeasureResult.kt b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/LazyListMeasureResult.kt
index e70556a..d34e5e8 100644
--- a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/LazyListMeasureResult.kt
+++ b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/LazyListMeasureResult.kt
@@ -24,20 +24,18 @@
 import androidx.compose.ui.util.fastForEach
 import kotlinx.coroutines.CoroutineScope
 
-/**
- * The result of the measure pass for lazy list layout.
- */
+/** The result of the measure pass for lazy list layout. */
 internal class LazyListMeasureResult(
     // properties defining the scroll position:
-    /** The new first visible item.*/
+    /** The new first visible item. */
     val firstVisibleItem: LazyListMeasuredItem?,
-    /** The new value for [LazyListState.firstVisibleItemScrollOffset].*/
+    /** The new value for [LazyListState.firstVisibleItemScrollOffset]. */
     var firstVisibleItemScrollOffset: Int,
-    /** True if there is some space available to continue scrolling in the forward direction.*/
+    /** True if there is some space available to continue scrolling in the forward direction. */
     var canScrollForward: Boolean,
-    /** The amount of scroll consumed during the measure pass.*/
+    /** The amount of scroll consumed during the measure pass. */
     var consumedScroll: Float,
-    /** MeasureResult defining the layout.*/
+    /** MeasureResult defining the layout. */
     measureResult: MeasureResult,
     /** The amount of scroll-back that happened due to reaching the end of the list. */
     val scrollBackAmount: Float,
@@ -73,24 +71,28 @@
 
     override val viewportSize: IntSize
         get() = IntSize(width, height)
-    override val beforeContentPadding: Int get() = -viewportStartOffset
+
+    override val beforeContentPadding: Int
+        get() = -viewportStartOffset
 
     /**
-     * Tries to apply a scroll [delta] for this layout info. In some cases we can apply small
-     * scroll deltas by just changing the offsets for each [visibleItemsInfo].
-     * But we can only do so if after applying the delta we would not need to compose a new item
-     * or dispose an item which is currently visible. In this case this function will not apply
-     * the [delta] and return false.
+     * Tries to apply a scroll [delta] for this layout info. In some cases we can apply small scroll
+     * deltas by just changing the offsets for each [visibleItemsInfo]. But we can only do so if
+     * after applying the delta we would not need to compose a new item or dispose an item which is
+     * currently visible. In this case this function will not apply the [delta] and return false.
      *
-     * @return true if we can safely apply a passed scroll [delta] to this layout info.
-     * If true is returned, only the placement phase is needed to apply new offsets.
-     * If false is returned, it means we have to rerun the full measure phase to apply the [delta].
+     * @return true if we can safely apply a passed scroll [delta] to this layout info. If true is
+     *   returned, only the placement phase is needed to apply new offsets. If false is returned, it
+     *   means we have to rerun the full measure phase to apply the [delta].
      */
     fun tryToApplyScrollWithoutRemeasure(delta: Int, updateAnimations: Boolean): Boolean {
-        if (remeasureNeeded || visibleItemsInfo.isEmpty() || firstVisibleItem == null ||
-            // applying this delta will change firstVisibleItem
-            (firstVisibleItemScrollOffset - delta) !in
-            0 until firstVisibleItem.mainAxisSizeWithSpacings
+        if (
+            remeasureNeeded ||
+                visibleItemsInfo.isEmpty() ||
+                firstVisibleItem == null ||
+                // applying this delta will change firstVisibleItem
+                (firstVisibleItemScrollOffset - delta) !in
+                    0 until firstVisibleItem.mainAxisSizeWithSpacings
         ) {
             return false
         }
@@ -100,26 +102,23 @@
             // non scrollable items like headers require special handling in the measurement.
             return false
         }
-        val canApply = if (delta < 0) {
-            // scrolling forward
-            val deltaToFirstItemChange =
-                first.offset + first.mainAxisSizeWithSpacings - viewportStartOffset
-            val deltaToLastItemChange =
-                last.offset + last.mainAxisSizeWithSpacings - viewportEndOffset
-            minOf(deltaToFirstItemChange, deltaToLastItemChange) > -delta
-        } else {
-            // scrolling backward
-            val deltaToFirstItemChange =
-                viewportStartOffset - first.offset
-            val deltaToLastItemChange =
-                viewportEndOffset - last.offset
-            minOf(deltaToFirstItemChange, deltaToLastItemChange) > delta
-        }
+        val canApply =
+            if (delta < 0) {
+                // scrolling forward
+                val deltaToFirstItemChange =
+                    first.offset + first.mainAxisSizeWithSpacings - viewportStartOffset
+                val deltaToLastItemChange =
+                    last.offset + last.mainAxisSizeWithSpacings - viewportEndOffset
+                minOf(deltaToFirstItemChange, deltaToLastItemChange) > -delta
+            } else {
+                // scrolling backward
+                val deltaToFirstItemChange = viewportStartOffset - first.offset
+                val deltaToLastItemChange = viewportEndOffset - last.offset
+                minOf(deltaToFirstItemChange, deltaToLastItemChange) > delta
+            }
         return if (canApply) {
             firstVisibleItemScrollOffset -= delta
-            visibleItemsInfo.fastForEach {
-                it.applyScrollDelta(delta, updateAnimations)
-            }
+            visibleItemsInfo.fastForEach { it.applyScrollDelta(delta, updateAnimations) }
             consumedScroll = delta.toFloat()
             if (!canScrollForward && delta > 0) {
                 // we scrolled backward, so now we can scroll forward
diff --git a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/LazyListMeasuredItem.kt b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/LazyListMeasuredItem.kt
index c52f78b..cabb48c 100644
--- a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/LazyListMeasuredItem.kt
+++ b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/LazyListMeasuredItem.kt
@@ -30,10 +30,12 @@
 import androidx.compose.ui.util.fastForEachIndexed
 
 /**
- * Represents one measured item of the lazy list. It can in fact consist of multiple placeables
- * if the user emit multiple layout nodes in the item callback.
+ * Represents one measured item of the lazy list. It can in fact consist of multiple placeables if
+ * the user emit multiple layout nodes in the item callback.
  */
-internal class LazyListMeasuredItem @ExperimentalFoundationApi constructor(
+internal class LazyListMeasuredItem
+@ExperimentalFoundationApi
+constructor(
     override val index: Int,
     private val placeables: List<Placeable>,
     override val isVertical: Boolean,
@@ -44,8 +46,8 @@
     private val beforeContentPadding: Int,
     private val afterContentPadding: Int,
     /**
-     * Extra spacing to be added to [size] aside from the sum of the [placeables] size. It
-     * is usually representing the spacing after the item.
+     * Extra spacing to be added to [size] aside from the sum of the [placeables] size. It is
+     * usually representing the spacing after the item.
      */
     private val spacing: Int,
     /**
@@ -61,9 +63,7 @@
     override var offset: Int = 0
         private set
 
-    /**
-     * Sum of the main axis sizes of all the inner placeables.
-     */
+    /** Sum of the main axis sizes of all the inner placeables. */
     override val size: Int
 
     /** In lists we only have one lane. */
@@ -71,19 +71,15 @@
     /** And each item takes one span. */
     override val span: Int = 1
 
-    /**
-     * Sum of the main axis sizes of all the inner placeables and [spacing].
-     */
+    /** Sum of the main axis sizes of all the inner placeables and [spacing]. */
     override val mainAxisSizeWithSpacings: Int
 
-    /**
-     * Max of the cross axis sizes of all the inner placeables.
-     */
+    /** Max of the cross axis sizes of all the inner placeables. */
     val crossAxisSize: Int
 
     /**
-     * True when this item is not supposted to react on scroll delta. for example sticky header,
-     * or items being animated away out of the bounds are non scrollable.
+     * True when this item is not supposted to react on scroll delta. for example sticky header, or
+     * items being animated away out of the bounds are non scrollable.
      */
     override var nonScrollableItem: Boolean = false
 
@@ -108,7 +104,8 @@
         placeableOffsets = IntArray(placeables.size * 2)
     }
 
-    override val placeablesCount: Int get() = placeables.size
+    override val placeablesCount: Int
+        get() = placeables.size
 
     override fun getParentData(index: Int) = placeables[index].parentData
 
@@ -126,33 +123,30 @@
     }
 
     /**
-     * Calculates positions for the inner placeables at [mainAxisOffset] main axis position.
-     * If [reverseOrder] is true the inner placeables would be placed in the inverted order.
+     * Calculates positions for the inner placeables at [mainAxisOffset] main axis position. If
+     * [reverseOrder] is true the inner placeables would be placed in the inverted order.
      */
-    fun position(
-        mainAxisOffset: Int,
-        layoutWidth: Int,
-        layoutHeight: Int
-    ) {
+    fun position(mainAxisOffset: Int, layoutWidth: Int, layoutHeight: Int) {
         this.offset = mainAxisOffset
         mainAxisLayoutSize = if (isVertical) layoutHeight else layoutWidth
-        @Suppress("NAME_SHADOWING")
-        var mainAxisOffset = mainAxisOffset
+        @Suppress("NAME_SHADOWING") var mainAxisOffset = mainAxisOffset
         placeables.fastForEachIndexed { index, placeable ->
             val indexInArray = index * 2
             if (isVertical) {
                 placeableOffsets[indexInArray] =
                     requireNotNull(horizontalAlignment) {
-                        "null horizontalAlignment when isVertical == true"
-                    }.align(placeable.width, layoutWidth, layoutDirection)
+                            "null horizontalAlignment when isVertical == true"
+                        }
+                        .align(placeable.width, layoutWidth, layoutDirection)
                 placeableOffsets[indexInArray + 1] = mainAxisOffset
                 mainAxisOffset += placeable.height
             } else {
                 placeableOffsets[indexInArray] = mainAxisOffset
                 placeableOffsets[indexInArray + 1] =
                     requireNotNull(verticalAlignment) {
-                        "null verticalAlignment when isVertical == false"
-                    }.align(placeable.height, layoutHeight)
+                            "null verticalAlignment when isVertical == false"
+                        }
+                        .align(placeable.height, layoutHeight)
                 mainAxisOffset += placeable.width
             }
         }
@@ -161,8 +155,8 @@
     }
 
     /**
-     * Update a [mainAxisLayoutSize] when the size did change after last [position] call.
-     * Knowing the final size is important for calculating the final position in reverse layout.
+     * Update a [mainAxisLayoutSize] when the size did change after last [position] call. Knowing
+     * the final size is important for calculating the final position in reverse layout.
      */
     fun updateMainAxisLayoutSize(mainAxisLayoutSize: Int) {
         this.mainAxisLayoutSize = mainAxisLayoutSize
@@ -194,70 +188,76 @@
         }
     }
 
-    fun place(
-        scope: Placeable.PlacementScope,
-        isLookingAhead: Boolean
-    ) = with(scope) {
-        require(mainAxisLayoutSize != Unset) { "position() should be called first" }
-        repeat(placeablesCount) { index ->
-            val placeable = placeables[index]
-            val minOffset = minMainAxisOffset - placeable.mainAxisSize
-            val maxOffset = maxMainAxisOffset
-            var offset = getOffset(index)
-            val animation = animator.getAnimation(key, index)
-            val layer: GraphicsLayer?
-            if (animation != null) {
-                if (isLookingAhead) {
-                    // Skip animation in lookahead pass
-                    animation.lookaheadOffset = offset
-                } else {
-                    val targetOffset = if (animation.lookaheadOffset != NotInitialized) {
-                        animation.lookaheadOffset
+    fun place(scope: Placeable.PlacementScope, isLookingAhead: Boolean) =
+        with(scope) {
+            require(mainAxisLayoutSize != Unset) { "position() should be called first" }
+            repeat(placeablesCount) { index ->
+                val placeable = placeables[index]
+                val minOffset = minMainAxisOffset - placeable.mainAxisSize
+                val maxOffset = maxMainAxisOffset
+                var offset = getOffset(index)
+                val animation = animator.getAnimation(key, index)
+                val layer: GraphicsLayer?
+                if (animation != null) {
+                    if (isLookingAhead) {
+                        // Skip animation in lookahead pass
+                        animation.lookaheadOffset = offset
                     } else {
-                        offset
+                        val targetOffset =
+                            if (animation.lookaheadOffset != NotInitialized) {
+                                animation.lookaheadOffset
+                            } else {
+                                offset
+                            }
+                        val animatedOffset = targetOffset + animation.placementDelta
+                        // cancel the animation if current and target offsets are both out of the
+                        // bounds
+                        if (
+                            (targetOffset.mainAxis <= minOffset &&
+                                animatedOffset.mainAxis <= minOffset) ||
+                                (targetOffset.mainAxis >= maxOffset &&
+                                    animatedOffset.mainAxis >= maxOffset)
+                        ) {
+                            animation.cancelPlacementAnimation()
+                        }
+                        offset = animatedOffset
                     }
-                    val animatedOffset = targetOffset + animation.placementDelta
-                    // cancel the animation if current and target offsets are both out of the bounds
-                    if ((targetOffset.mainAxis <= minOffset &&
-                            animatedOffset.mainAxis <= minOffset) ||
-                        (targetOffset.mainAxis >= maxOffset &&
-                            animatedOffset.mainAxis >= maxOffset)
-                    ) {
-                        animation.cancelPlacementAnimation()
+                    layer = animation.layer
+                } else {
+                    layer = null
+                }
+                if (reverseLayout) {
+                    offset =
+                        offset.copy { mainAxisOffset ->
+                            mainAxisLayoutSize - mainAxisOffset - placeable.mainAxisSize
+                        }
+                }
+                offset += visualOffset
+                if (!isLookingAhead) {
+                    animation?.finalOffset = offset
+                }
+                if (isVertical) {
+                    if (layer != null) {
+                        placeable.placeWithLayer(offset, layer)
+                    } else {
+                        placeable.placeWithLayer(offset)
                     }
-                    offset = animatedOffset
-                }
-                layer = animation.layer
-            } else {
-                layer = null
-            }
-            if (reverseLayout) {
-                offset = offset.copy { mainAxisOffset ->
-                    mainAxisLayoutSize - mainAxisOffset - placeable.mainAxisSize
-                }
-            }
-            offset += visualOffset
-            if (!isLookingAhead) {
-                animation?.finalOffset = offset
-            }
-            if (isVertical) {
-                if (layer != null) {
-                    placeable.placeWithLayer(offset, layer)
                 } else {
-                    placeable.placeWithLayer(offset)
-                }
-            } else {
-                if (layer != null) {
-                    placeable.placeRelativeWithLayer(offset, layer)
-                } else {
-                    placeable.placeRelativeWithLayer(offset)
+                    if (layer != null) {
+                        placeable.placeRelativeWithLayer(offset, layer)
+                    } else {
+                        placeable.placeRelativeWithLayer(offset)
+                    }
                 }
             }
         }
-    }
 
-    private val IntOffset.mainAxis get() = if (isVertical) y else x
-    private val Placeable.mainAxisSize get() = if (isVertical) height else width
+    private val IntOffset.mainAxis
+        get() = if (isVertical) y else x
+
+    private val Placeable.mainAxisSize
+        get() = if (isVertical) height else width
+
     private inline fun IntOffset.copy(mainAxisMap: (Int) -> Int): IntOffset =
         IntOffset(if (isVertical) x else mainAxisMap(x), if (isVertical) mainAxisMap(y) else y)
 }
diff --git a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/LazyListMeasuredItemProvider.kt b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/LazyListMeasuredItemProvider.kt
index 0651942..d003ff9 100644
--- a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/LazyListMeasuredItemProvider.kt
+++ b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/LazyListMeasuredItemProvider.kt
@@ -23,28 +23,29 @@
 import androidx.compose.ui.layout.Placeable
 import androidx.compose.ui.unit.Constraints
 
-/**
- * Abstracts away the subcomposition from the measuring logic.
- */
+/** Abstracts away the subcomposition from the measuring logic. */
 @OptIn(ExperimentalFoundationApi::class)
-internal abstract class LazyListMeasuredItemProvider @ExperimentalFoundationApi constructor(
+internal abstract class LazyListMeasuredItemProvider
+@ExperimentalFoundationApi
+constructor(
     constraints: Constraints,
     isVertical: Boolean,
     private val itemProvider: LazyListItemProvider,
     private val measureScope: LazyLayoutMeasureScope
 ) : LazyLayoutMeasuredItemProvider<LazyListMeasuredItem> {
     // the constraints we will measure child with. the main axis is not restricted
-    val childConstraints = Constraints(
-        maxWidth = if (isVertical) constraints.maxWidth else Constraints.Infinity,
-        maxHeight = if (!isVertical) constraints.maxHeight else Constraints.Infinity
-    )
+    val childConstraints =
+        Constraints(
+            maxWidth = if (isVertical) constraints.maxWidth else Constraints.Infinity,
+            maxHeight = if (!isVertical) constraints.maxHeight else Constraints.Infinity
+        )
 
     override fun getAndMeasure(index: Int, lane: Int, span: Int, constraints: Constraints) =
         getAndMeasure(index, constraints)
 
     /**
-     * Used to subcompose items of lazy lists. Composed placeables will be measured with the
-     * correct constraints and wrapped into [LazyListMeasuredItem].
+     * Used to subcompose items of lazy lists. Composed placeables will be measured with the correct
+     * constraints and wrapped into [LazyListMeasuredItem].
      */
     fun getAndMeasure(
         index: Int,
@@ -57,10 +58,11 @@
     }
 
     /**
-     * Contains the mapping between the key and the index. It could contain not all the items of
-     * the list as an optimization.
+     * Contains the mapping between the key and the index. It could contain not all the items of the
+     * list as an optimization.
      */
-    val keyIndexMap: LazyLayoutKeyIndexMap get() = itemProvider.keyIndexMap
+    val keyIndexMap: LazyLayoutKeyIndexMap
+        get() = itemProvider.keyIndexMap
 
     abstract fun createItem(
         index: Int,
diff --git a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/LazyListPrefetchStrategy.kt b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/LazyListPrefetchStrategy.kt
index 83840e9..5ea6756 100644
--- a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/LazyListPrefetchStrategy.kt
+++ b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/LazyListPrefetchStrategy.kt
@@ -47,8 +47,8 @@
      * If the visible items have also changed, then this will be invoked in the same frame *after*
      * [onVisibleItemsUpdated].
      *
-     * @param delta the change in scroll direction. Delta < 0 indicates scrolling down while
-     * delta > 0 indicates scrolling up.
+     * @param delta the change in scroll direction. Delta < 0 indicates scrolling down while delta >
+     *   0 indicates scrolling up.
      * @param layoutInfo the current [LazyListLayoutInfo]
      */
     fun LazyListPrefetchScope.onScroll(delta: Float, layoutInfo: LazyListLayoutInfo)
@@ -57,7 +57,7 @@
      * onVisibleItemsUpdated is invoked when the LazyList scrolls if the visible items have changed.
      *
      * @param layoutInfo the current [LazyListLayoutInfo]. Info about the updated visible items can
-     * be found in [LazyListLayoutInfo.visibleItemsInfo].
+     *   be found in [LazyListLayoutInfo.visibleItemsInfo].
      */
     fun LazyListPrefetchScope.onVisibleItemsUpdated(layoutInfo: LazyListLayoutInfo)
 
@@ -66,24 +66,22 @@
      * this LazyList. It gives this LazyList a chance to request prefetch for some of its own
      * children before coming onto screen.
      *
-     * Implementations can use [NestedPrefetchScope.schedulePrefetch] to schedule child
-     * prefetches. For example, this is useful if this LazyList is a LazyRow that is a child of a
-     * LazyColumn: in that case, [onNestedPrefetch] can schedule the children it expects to be
-     * visible when it comes onto screen, giving the LazyLayout infra a chance to compose these
-     * children ahead of time and reduce jank.
+     * Implementations can use [NestedPrefetchScope.schedulePrefetch] to schedule child prefetches.
+     * For example, this is useful if this LazyList is a LazyRow that is a child of a LazyColumn: in
+     * that case, [onNestedPrefetch] can schedule the children it expects to be visible when it
+     * comes onto screen, giving the LazyLayout infra a chance to compose these children ahead of
+     * time and reduce jank.
      *
      * Generally speaking, [onNestedPrefetch] should only request prefetch for children that it
      * expects to actually be visible when this list is scrolled into view.
      *
      * @param firstVisibleItemIndex the index of the first visible item. It should be used to start
-     * prefetching from the correct index in case the list has been created at a non-zero offset.
+     *   prefetching from the correct index in case the list has been created at a non-zero offset.
      */
     fun NestedPrefetchScope.onNestedPrefetch(firstVisibleItemIndex: Int)
 }
 
-/**
- * Scope for callbacks in [LazyListPrefetchStrategy] which allows prefetches to be requested.
- */
+/** Scope for callbacks in [LazyListPrefetchStrategy] which allows prefetches to be requested. */
 @ExperimentalFoundationApi
 interface LazyListPrefetchScope {
 
@@ -105,14 +103,13 @@
  * nested prefetch count.
  *
  * @param nestedPrefetchItemCount specifies how many inner items should be prefetched when this
- * LazyList is nested inside another LazyLayout. For example, if this is the state for a horizontal
- * LazyList nested in a vertical LazyList, you might want to set this to the number of items that
- * will be visible when this list is scrolled into view.
+ *   LazyList is nested inside another LazyLayout. For example, if this is the state for a
+ *   horizontal LazyList nested in a vertical LazyList, you might want to set this to the number of
+ *   items that will be visible when this list is scrolled into view.
  */
 @ExperimentalFoundationApi
-fun LazyListPrefetchStrategy(
-    nestedPrefetchItemCount: Int = 2
-): LazyListPrefetchStrategy = DefaultLazyListPrefetchStrategy(nestedPrefetchItemCount)
+fun LazyListPrefetchStrategy(nestedPrefetchItemCount: Int = 2): LazyListPrefetchStrategy =
+    DefaultLazyListPrefetchStrategy(nestedPrefetchItemCount)
 
 /**
  * The default prefetching strategy for LazyLists - this will be used automatically if no other
@@ -128,25 +125,24 @@
      */
     private var indexToPrefetch = -1
 
-    /**
-     * The handle associated with the current index from [indexToPrefetch].
-     */
+    /** The handle associated with the current index from [indexToPrefetch]. */
     private var currentPrefetchHandle: LazyLayoutPrefetchState.PrefetchHandle? = null
 
     /**
-     * Keeps the scrolling direction during the previous calculation in order to be able to
-     * detect the scrolling direction change.
+     * Keeps the scrolling direction during the previous calculation in order to be able to detect
+     * the scrolling direction change.
      */
     private var wasScrollingForward = false
 
     override fun LazyListPrefetchScope.onScroll(delta: Float, layoutInfo: LazyListLayoutInfo) {
         if (layoutInfo.visibleItemsInfo.isNotEmpty()) {
             val scrollingForward = delta < 0
-            val indexToPrefetch = if (scrollingForward) {
-                layoutInfo.visibleItemsInfo.last().index + 1
-            } else {
-                layoutInfo.visibleItemsInfo.first().index - 1
-            }
+            val indexToPrefetch =
+                if (scrollingForward) {
+                    layoutInfo.visibleItemsInfo.last().index + 1
+                } else {
+                    layoutInfo.visibleItemsInfo.first().index - 1
+                }
             if (indexToPrefetch in 0 until layoutInfo.totalItemsCount) {
                 if (indexToPrefetch != this@DefaultLazyListPrefetchStrategy.indexToPrefetch) {
                     if (wasScrollingForward != scrollingForward) {
@@ -158,9 +154,7 @@
                     }
                     this@DefaultLazyListPrefetchStrategy.wasScrollingForward = scrollingForward
                     this@DefaultLazyListPrefetchStrategy.indexToPrefetch = indexToPrefetch
-                    currentPrefetchHandle = schedulePrefetch(
-                        indexToPrefetch
-                    )
+                    currentPrefetchHandle = schedulePrefetch(indexToPrefetch)
                 }
                 if (scrollingForward) {
                     val lastItem = layoutInfo.visibleItemsInfo.last()
@@ -185,11 +179,12 @@
 
     override fun LazyListPrefetchScope.onVisibleItemsUpdated(layoutInfo: LazyListLayoutInfo) {
         if (indexToPrefetch != -1 && layoutInfo.visibleItemsInfo.isNotEmpty()) {
-            val expectedPrefetchIndex = if (wasScrollingForward) {
-                layoutInfo.visibleItemsInfo.last().index + 1
-            } else {
-                layoutInfo.visibleItemsInfo.first().index - 1
-            }
+            val expectedPrefetchIndex =
+                if (wasScrollingForward) {
+                    layoutInfo.visibleItemsInfo.last().index + 1
+                } else {
+                    layoutInfo.visibleItemsInfo.first().index - 1
+                }
             if (indexToPrefetch != expectedPrefetchIndex) {
                 indexToPrefetch = -1
                 currentPrefetchHandle?.cancel()
@@ -199,8 +194,6 @@
     }
 
     override fun NestedPrefetchScope.onNestedPrefetch(firstVisibleItemIndex: Int) {
-        repeat(nestedPrefetchItemCount) { i ->
-            schedulePrefetch(firstVisibleItemIndex + i)
-        }
+        repeat(nestedPrefetchItemCount) { i -> schedulePrefetch(firstVisibleItemIndex + i) }
     }
 }
diff --git a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/LazyListScrollPosition.kt b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/LazyListScrollPosition.kt
index 73fa5e7..c879312 100644
--- a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/LazyListScrollPosition.kt
+++ b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/LazyListScrollPosition.kt
@@ -27,10 +27,7 @@
  * Contains the current scroll position represented by the first visible item index and the first
  * visible item scroll offset.
  */
-internal class LazyListScrollPosition(
-    initialIndex: Int = 0,
-    initialScrollOffset: Int = 0
-) {
+internal class LazyListScrollPosition(initialIndex: Int = 0, initialScrollOffset: Int = 0) {
     var index by mutableIntStateOf(initialIndex)
 
     var scrollOffset by mutableIntStateOf(initialScrollOffset)
@@ -41,15 +38,14 @@
     /** The last know key of the item at [index] position. */
     private var lastKnownFirstItemKey: Any? = null
 
-    val nearestRangeState = LazyLayoutNearestRangeState(
-        initialIndex,
-        NearestItemsSlidingWindowSize,
-        NearestItemsExtraItemCount
-    )
+    val nearestRangeState =
+        LazyLayoutNearestRangeState(
+            initialIndex,
+            NearestItemsSlidingWindowSize,
+            NearestItemsExtraItemCount
+        )
 
-    /**
-     * Updates the current scroll position based on the results of the last measurement.
-     */
+    /** Updates the current scroll position based on the results of the last measurement. */
     fun updateFromMeasureResult(measureResult: LazyListMeasureResult) {
         lastKnownFirstItemKey = measureResult.firstVisibleItem?.key
         // we ignore the index and offset from measureResult until we get at least one
@@ -72,14 +68,13 @@
 
     /**
      * Updates the scroll position - the passed values will be used as a start position for
-     * composing the items during the next measure pass and will be updated by the real
-     * position calculated during the measurement. This means that there is no guarantee that
-     * exactly this index and offset will be applied as it is possible that:
-     * a) there will be no item at this index in reality
-     * b) item at this index will be smaller than the asked scrollOffset, which means we would
-     * switch to the next item
-     * c) there will be not enough items to fill the viewport after the requested index, so we
-     * would have to compose few elements before the asked index, changing the first visible item.
+     * composing the items during the next measure pass and will be updated by the real position
+     * calculated during the measurement. This means that there is no guarantee that exactly this
+     * index and offset will be applied as it is possible that: a) there will be no item at this
+     * index in reality b) item at this index will be smaller than the asked scrollOffset, which
+     * means we would switch to the next item c) there will be not enough items to fill the viewport
+     * after the requested index, so we would have to compose few elements before the asked index,
+     * changing the first visible item.
      */
     fun requestPositionAndForgetLastKnownKey(index: Int, scrollOffset: Int) {
         update(index, scrollOffset)
@@ -89,10 +84,10 @@
     }
 
     /**
-     * In addition to keeping the first visible item index we also store the key of this item.
-     * When the user provided custom keys for the items this mechanism allows us to detect when
-     * there were items added or removed before our current first visible item and keep this item
-     * as the first visible one even given that its index has been changed.
+     * In addition to keeping the first visible item index we also store the key of this item. When
+     * the user provided custom keys for the items this mechanism allows us to detect when there
+     * were items added or removed before our current first visible item and keep this item as the
+     * first visible one even given that its index has been changed.
      */
     @ExperimentalFoundationApi
     fun updateScrollPositionIfTheFirstItemWasMoved(
@@ -121,7 +116,5 @@
  */
 internal const val NearestItemsSlidingWindowSize = 30
 
-/**
- * The minimum amount of items near the current first visible item we want to have mapping for.
- */
+/** The minimum amount of items near the current first visible item we want to have mapping for. */
 internal const val NearestItemsExtraItemCount = 100
diff --git a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/LazyListState.kt b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/LazyListState.kt
index 5f4cf44..969b99e 100644
--- a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/LazyListState.kt
+++ b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/LazyListState.kt
@@ -72,7 +72,7 @@
  *
  * @param initialFirstVisibleItemIndex the initial value for [LazyListState.firstVisibleItemIndex]
  * @param initialFirstVisibleItemScrollOffset the initial value for
- * [LazyListState.firstVisibleItemScrollOffset]
+ *   [LazyListState.firstVisibleItemScrollOffset]
  */
 @Composable
 fun rememberLazyListState(
@@ -80,10 +80,7 @@
     initialFirstVisibleItemScrollOffset: Int = 0
 ): LazyListState {
     return rememberSaveable(saver = LazyListState.Saver) {
-        LazyListState(
-            initialFirstVisibleItemIndex,
-            initialFirstVisibleItemScrollOffset
-        )
+        LazyListState(initialFirstVisibleItemIndex, initialFirstVisibleItemScrollOffset)
     }
 }
 
@@ -95,9 +92,9 @@
  *
  * @param initialFirstVisibleItemIndex the initial value for [LazyListState.firstVisibleItemIndex]
  * @param initialFirstVisibleItemScrollOffset the initial value for
- * [LazyListState.firstVisibleItemScrollOffset]
+ *   [LazyListState.firstVisibleItemScrollOffset]
  * @param prefetchStrategy the [LazyListPrefetchStrategy] to use for prefetching content in this
- * list
+ *   list
  */
 @ExperimentalFoundationApi
 @Composable
@@ -122,13 +119,15 @@
  *
  * @param firstVisibleItemIndex the initial value for [LazyListState.firstVisibleItemIndex]
  * @param firstVisibleItemScrollOffset the initial value for
- * [LazyListState.firstVisibleItemScrollOffset]
+ *   [LazyListState.firstVisibleItemScrollOffset]
  * @param prefetchStrategy the [LazyListPrefetchStrategy] to use for prefetching content in this
- * list
+ *   list
  */
 @OptIn(ExperimentalFoundationApi::class)
 @Stable
-class LazyListState @ExperimentalFoundationApi constructor(
+class LazyListState
+@ExperimentalFoundationApi
+constructor(
     firstVisibleItemIndex: Int = 0,
     firstVisibleItemScrollOffset: Int = 0,
     private val prefetchStrategy: LazyListPrefetchStrategy = LazyListPrefetchStrategy(),
@@ -137,7 +136,7 @@
     /**
      * @param firstVisibleItemIndex the initial value for [LazyListState.firstVisibleItemIndex]
      * @param firstVisibleItemScrollOffset the initial value for
-     * [LazyListState.firstVisibleItemScrollOffset]
+     *   [LazyListState.firstVisibleItemScrollOffset]
      */
     constructor(
         firstVisibleItemIndex: Int = 0,
@@ -146,12 +145,11 @@
 
     internal var hasLookaheadPassOccurred: Boolean = false
         private set
+
     internal var postLookaheadLayoutInfo: LazyListMeasureResult? = null
         private set
 
-    /**
-     * The holder class for the current scroll position.
-     */
+    /** The holder class for the current scroll position. */
     private val scrollPosition =
         LazyListScrollPosition(firstVisibleItemIndex, firstVisibleItemScrollOffset)
 
@@ -160,84 +158,86 @@
     /**
      * The index of the first item that is visible.
      *
-     * Note that this property is observable and if you use it in the composable function it will
-     * be recomposed on every change causing potential performance issues.
+     * Note that this property is observable and if you use it in the composable function it will be
+     * recomposed on every change causing potential performance issues.
      *
      * If you want to run some side effects like sending an analytics event or updating a state
      * based on this value consider using "snapshotFlow":
+     *
      * @sample androidx.compose.foundation.samples.UsingListScrollPositionForSideEffectSample
      *
      * If you need to use it in the composition then consider wrapping the calculation into a
      * derived state in order to only have recompositions when the derived value changes:
+     *
      * @sample androidx.compose.foundation.samples.UsingListScrollPositionInCompositionSample
      */
-    val firstVisibleItemIndex: Int get() = scrollPosition.index
+    val firstVisibleItemIndex: Int
+        get() = scrollPosition.index
 
     /**
-     * The scroll offset of the first visible item. Scrolling forward is positive - i.e., the
-     * amount that the item is offset backwards.
+     * The scroll offset of the first visible item. Scrolling forward is positive - i.e., the amount
+     * that the item is offset backwards.
      *
-     * Note that this property is observable and if you use it in the composable function it will
-     * be recomposed on every scroll causing potential performance issues.
+     * Note that this property is observable and if you use it in the composable function it will be
+     * recomposed on every scroll causing potential performance issues.
+     *
      * @see firstVisibleItemIndex for samples with the recommended usage patterns.
      */
-    val firstVisibleItemScrollOffset: Int get() = scrollPosition.scrollOffset
+    val firstVisibleItemScrollOffset: Int
+        get() = scrollPosition.scrollOffset
 
     /** Backing state for [layoutInfo] */
-    private val layoutInfoState = mutableStateOf(
-        EmptyLazyListMeasureResult,
-        neverEqualPolicy()
-    )
+    private val layoutInfoState = mutableStateOf(EmptyLazyListMeasureResult, neverEqualPolicy())
 
     /**
-     * The object of [LazyListLayoutInfo] calculated during the last layout pass. For example,
-     * you can use it to calculate what items are currently visible.
+     * The object of [LazyListLayoutInfo] calculated during the last layout pass. For example, you
+     * can use it to calculate what items are currently visible.
      *
-     * Note that this property is observable and is updated after every scroll or remeasure.
-     * If you use it in the composable function it will be recomposed on every change causing
-     * potential performance issues including infinity recomposition loop.
-     * Therefore, avoid using it in the composition.
+     * Note that this property is observable and is updated after every scroll or remeasure. If you
+     * use it in the composable function it will be recomposed on every change causing potential
+     * performance issues including infinity recomposition loop. Therefore, avoid using it in the
+     * composition.
      *
      * If you want to run some side effects like sending an analytics event or updating a state
      * based on this value consider using "snapshotFlow":
+     *
      * @sample androidx.compose.foundation.samples.UsingListLayoutInfoForSideEffectSample
      */
-    val layoutInfo: LazyListLayoutInfo get() = layoutInfoState.value
+    val layoutInfo: LazyListLayoutInfo
+        get() = layoutInfoState.value
 
     /**
-     * [InteractionSource] that will be used to dispatch drag events when this
-     * list is being dragged. If you want to know whether the fling (or animated scroll) is in
-     * progress, use [isScrollInProgress].
+     * [InteractionSource] that will be used to dispatch drag events when this list is being
+     * dragged. If you want to know whether the fling (or animated scroll) is in progress, use
+     * [isScrollInProgress].
      */
-    val interactionSource: InteractionSource get() = internalInteractionSource
+    val interactionSource: InteractionSource
+        get() = internalInteractionSource
 
     internal val internalInteractionSource: MutableInteractionSource = MutableInteractionSource()
 
     /**
-     * The amount of scroll to be consumed in the next layout pass.  Scrolling forward is negative
+     * The amount of scroll to be consumed in the next layout pass. Scrolling forward is negative
      * - that is, it is the amount that the items are offset in y
      */
     internal var scrollToBeConsumed = 0f
         private set
 
-    internal val density: Density get() = layoutInfoState.value.density
+    internal val density: Density
+        get() = layoutInfoState.value.density
 
     /**
-     * The ScrollableController instance. We keep it as we need to call stopAnimation on it once
-     * we reached the end of the list.
+     * The ScrollableController instance. We keep it as we need to call stopAnimation on it once we
+     * reached the end of the list.
      */
     private val scrollableState = ScrollableState { -onScroll(-it) }
 
-    /**
-     * Only used for testing to confirm that we're not making too many measure passes
-     */
+    /** Only used for testing to confirm that we're not making too many measure passes */
     /*@VisibleForTesting*/
     internal var numMeasurePasses: Int = 0
         private set
 
-    /**
-     * Only used for testing to disable prefetching when needed to test the main logic.
-     */
+    /** Only used for testing to disable prefetching when needed to test the main logic. */
     /*@VisibleForTesting*/
     internal var prefetchingEnabled: Boolean = true
 
@@ -248,18 +248,17 @@
     internal var remeasurement: Remeasurement? = null
         private set
 
-    /**
-     * The modifier which provides [remeasurement].
-     */
-    internal val remeasurementModifier = object : RemeasurementModifier {
-        override fun onRemeasurementAvailable(remeasurement: Remeasurement) {
-            this@LazyListState.remeasurement = remeasurement
+    /** The modifier which provides [remeasurement]. */
+    internal val remeasurementModifier =
+        object : RemeasurementModifier {
+            override fun onRemeasurementAvailable(remeasurement: Remeasurement) {
+                this@LazyListState.remeasurement = remeasurement
+            }
         }
-    }
 
     /**
-     * Provides a modifier which allows to delay some interactions (e.g. scroll)
-     * until layout is ready.
+     * Provides a modifier which allows to delay some interactions (e.g. scroll) until layout is
+     * ready.
      */
     internal val awaitLayoutModifier = AwaitFirstLayoutModifier()
 
@@ -267,26 +266,26 @@
 
     internal val beyondBoundsInfo = LazyLayoutBeyondBoundsInfo()
 
-    internal val prefetchState = LazyLayoutPrefetchState(prefetchStrategy.prefetchScheduler) {
-        with(prefetchStrategy) {
-            onNestedPrefetch(Snapshot.withoutReadObservation { firstVisibleItemIndex })
+    internal val prefetchState =
+        LazyLayoutPrefetchState(prefetchStrategy.prefetchScheduler) {
+            with(prefetchStrategy) {
+                onNestedPrefetch(Snapshot.withoutReadObservation { firstVisibleItemIndex })
+            }
         }
-    }
 
-    private val prefetchScope: LazyListPrefetchScope = object : LazyListPrefetchScope {
-        override fun schedulePrefetch(index: Int): LazyLayoutPrefetchState.PrefetchHandle {
-            // Without read observation since this can be triggered from scroll - this will then
-            // cause us to recompose when the measure result changes. We don't care since the
-            // prefetch is best effort.
-            val constraints =
-                Snapshot.withoutReadObservation { layoutInfoState.value.childConstraints }
-            return prefetchState.schedulePrefetch(index, constraints)
+    private val prefetchScope: LazyListPrefetchScope =
+        object : LazyListPrefetchScope {
+            override fun schedulePrefetch(index: Int): LazyLayoutPrefetchState.PrefetchHandle {
+                // Without read observation since this can be triggered from scroll - this will then
+                // cause us to recompose when the measure result changes. We don't care since the
+                // prefetch is best effort.
+                val constraints =
+                    Snapshot.withoutReadObservation { layoutInfoState.value.childConstraints }
+                return prefetchState.schedulePrefetch(index, constraints)
+            }
         }
-    }
 
-    /**
-     * Stores currently pinned items which are always composed.
-     */
+    /** Stores currently pinned items which are always composed. */
     internal val pinnedItems = LazyLayoutPinnedItemList()
 
     internal val nearestRange: IntRange by scrollPosition.nearestRangeState
@@ -297,46 +296,34 @@
      *
      * @param index the index to which to scroll. Must be non-negative.
      * @param scrollOffset the offset that the item should end up after the scroll. Note that
-     * positive offset refers to forward scroll, so in a top-to-bottom list, positive offset will
-     * scroll the item further upward (taking it partly offscreen).
+     *   positive offset refers to forward scroll, so in a top-to-bottom list, positive offset will
+     *   scroll the item further upward (taking it partly offscreen).
      */
-    suspend fun scrollToItem(
-        @AndroidXIntRange(from = 0)
-        index: Int,
-        scrollOffset: Int = 0
-    ) {
-        scroll {
-            snapToItemIndexInternal(index, scrollOffset, forceRemeasure = true)
-        }
+    suspend fun scrollToItem(@AndroidXIntRange(from = 0) index: Int, scrollOffset: Int = 0) {
+        scroll { snapToItemIndexInternal(index, scrollOffset, forceRemeasure = true) }
     }
 
     internal val measurementScopeInvalidator = ObservableScopeInvalidator()
 
     /**
-     * Requests the item at [index] to be at the start of the viewport during the next
-     * remeasure, offset by [scrollOffset], and schedules a remeasure.
+     * Requests the item at [index] to be at the start of the viewport during the next remeasure,
+     * offset by [scrollOffset], and schedules a remeasure.
      *
-     * The scroll position will be updated to the requested position rather than maintain
-     * the index based on the first visible item key (when a data set change will also be
-     * applied during the next remeasure), but *only* for the next remeasure.
+     * The scroll position will be updated to the requested position rather than maintain the index
+     * based on the first visible item key (when a data set change will also be applied during the
+     * next remeasure), but *only* for the next remeasure.
      *
      * Any scroll in progress will be cancelled.
      *
      * @param index the index to which to scroll. Must be non-negative.
      * @param scrollOffset the offset that the item should end up after the scroll. Note that
-     * positive offset refers to forward scroll, so in a top-to-bottom list, positive offset will
-     * scroll the item further upward (taking it partly offscreen).
+     *   positive offset refers to forward scroll, so in a top-to-bottom list, positive offset will
+     *   scroll the item further upward (taking it partly offscreen).
      */
-    fun requestScrollToItem(
-        @AndroidXIntRange(from = 0)
-        index: Int,
-        scrollOffset: Int = 0
-    ) {
+    fun requestScrollToItem(@AndroidXIntRange(from = 0) index: Int, scrollOffset: Int = 0) {
         // Cancel any scroll in progress.
         if (isScrollInProgress) {
-            layoutInfoState.value.coroutineScope.launch {
-                scroll { }
-            }
+            layoutInfoState.value.coroutineScope.launch { scroll {} }
         }
 
         snapToItemIndexInternal(index, scrollOffset, forceRemeasure = false)
@@ -346,13 +333,9 @@
      * Snaps to the requested scroll position. Synchronously executes remeasure if [forceRemeasure]
      * is true, and schedules a remeasure if false.
      */
-    internal fun snapToItemIndexInternal(
-        index: Int,
-        scrollOffset: Int,
-        forceRemeasure: Boolean
-    ) {
-        val positionChanged = scrollPosition.index != index ||
-            scrollPosition.scrollOffset != scrollOffset
+    internal fun snapToItemIndexInternal(index: Int, scrollOffset: Int, forceRemeasure: Boolean) {
+        val positionChanged =
+            scrollPosition.index != index || scrollPosition.scrollOffset != scrollOffset
         // sometimes this method is called not to scroll, but to stay on the same index when
         // the data changes, as by default we maintain the scroll position by key, not index.
         // when this happens we don't need to reset the animations as from the user perspective
@@ -376,8 +359,8 @@
     /**
      * Call this function to take control of scrolling and gain the ability to send scroll events
      * via [ScrollScope.scrollBy]. All actions that change the logical scroll position must be
-     * performed within a [scroll] block (even if they don't call any other methods on this
-     * object) in order to guarantee that mutual exclusion is enforced.
+     * performed within a [scroll] block (even if they don't call any other methods on this object)
+     * in order to guarantee that mutual exclusion is enforced.
      *
      * If [scroll] is called from elsewhere, this will be canceled.
      */
@@ -389,20 +372,21 @@
         scrollableState.scroll(scrollPriority, block)
     }
 
-    override fun dispatchRawDelta(delta: Float): Float =
-        scrollableState.dispatchRawDelta(delta)
+    override fun dispatchRawDelta(delta: Float): Float = scrollableState.dispatchRawDelta(delta)
 
     override val isScrollInProgress: Boolean
         get() = scrollableState.isScrollInProgress
 
     override var canScrollForward: Boolean by mutableStateOf(false)
         private set
+
     override var canScrollBackward: Boolean by mutableStateOf(false)
         private set
 
     @get:Suppress("GetterSetterNames")
     override val lastScrolledForward: Boolean
         get() = scrollableState.lastScrolledForward
+
     @get:Suppress("GetterSetterNames")
     override val lastScrolledBackward: Boolean
         get() = scrollableState.lastScrolledBackward
@@ -429,15 +413,17 @@
             val preScrollToBeConsumed = scrollToBeConsumed
             val intDelta = scrollToBeConsumed.fastRoundToInt()
             val postLookaheadInfo = postLookaheadLayoutInfo
-            var scrolledWithoutRemeasure = layoutInfo.tryToApplyScrollWithoutRemeasure(
-                delta = intDelta,
-                updateAnimations = !hasLookaheadPassOccurred
-            )
-            if (scrolledWithoutRemeasure && postLookaheadInfo != null) {
-                scrolledWithoutRemeasure = postLookaheadInfo.tryToApplyScrollWithoutRemeasure(
+            var scrolledWithoutRemeasure =
+                layoutInfo.tryToApplyScrollWithoutRemeasure(
                     delta = intDelta,
-                    updateAnimations = true
+                    updateAnimations = !hasLookaheadPassOccurred
                 )
+            if (scrolledWithoutRemeasure && postLookaheadInfo != null) {
+                scrolledWithoutRemeasure =
+                    postLookaheadInfo.tryToApplyScrollWithoutRemeasure(
+                        delta = intDelta,
+                        updateAnimations = true
+                    )
             }
             if (scrolledWithoutRemeasure) {
                 applyMeasureResult(
@@ -448,16 +434,10 @@
                 // we don't need to remeasure, so we only trigger re-placement:
                 placementScopeInvalidator.invalidateScope()
 
-                notifyPrefetchOnScroll(
-                    preScrollToBeConsumed - scrollToBeConsumed,
-                    layoutInfo
-                )
+                notifyPrefetchOnScroll(preScrollToBeConsumed - scrollToBeConsumed, layoutInfo)
             } else {
                 remeasurement?.forceRemeasure()
-                notifyPrefetchOnScroll(
-                    preScrollToBeConsumed - scrollToBeConsumed,
-                    this.layoutInfo
-                )
+                notifyPrefetchOnScroll(preScrollToBeConsumed - scrollToBeConsumed, this.layoutInfo)
             }
         }
 
@@ -477,12 +457,7 @@
 
     private fun notifyPrefetchOnScroll(delta: Float, layoutInfo: LazyListLayoutInfo) {
         if (prefetchingEnabled) {
-            with(prefetchStrategy) {
-                prefetchScope.onScroll(
-                    delta,
-                    layoutInfo
-                )
-            }
+            with(prefetchStrategy) { prefetchScope.onScroll(delta, layoutInfo) }
         }
     }
 
@@ -491,14 +466,10 @@
      *
      * @param index the index to which to scroll. Must be non-negative.
      * @param scrollOffset the offset that the item should end up after the scroll. Note that
-     * positive offset refers to forward scroll, so in a top-to-bottom list, positive offset will
-     * scroll the item further upward (taking it partly offscreen).
+     *   positive offset refers to forward scroll, so in a top-to-bottom list, positive offset will
+     *   scroll the item further upward (taking it partly offscreen).
      */
-    suspend fun animateScrollToItem(
-        @AndroidXIntRange(from = 0)
-        index: Int,
-        scrollOffset: Int = 0
-    ) {
+    suspend fun animateScrollToItem(@AndroidXIntRange(from = 0) index: Int, scrollOffset: Int = 0) {
         animateScrollScope.animateScrollToItem(
             index,
             scrollOffset,
@@ -507,9 +478,7 @@
         )
     }
 
-    /**
-     *  Updates the state with the new calculated scroll position and consumed scroll.
-     */
+    /** Updates the state with the new calculated scroll position and consumed scroll. */
     internal fun applyMeasureResult(
         result: LazyListMeasureResult,
         isLookingAhead: Boolean,
@@ -533,9 +502,7 @@
             } else {
                 scrollPosition.updateFromMeasureResult(result)
                 if (prefetchingEnabled) {
-                    with(prefetchStrategy) {
-                        prefetchScope.onVisibleItemsUpdated(result)
-                    }
+                    with(prefetchStrategy) { prefetchScope.onVisibleItemsUpdated(result) }
                 }
             }
 
@@ -595,11 +562,10 @@
     }
 
     /**
-     * When the user provided custom keys for the items we can try to detect when there were
-     * items added or removed before our current first visible item and keep this item
-     * as the first visible one even given that its index has been changed.
-     * The scroll position will not be updated if [requestScrollToItem] was called since
-     * the last time this method was called.
+     * When the user provided custom keys for the items we can try to detect when there were items
+     * added or removed before our current first visible item and keep this item as the first
+     * visible one even given that its index has been changed. The scroll position will not be
+     * updated if [requestScrollToItem] was called since the last time this method was called.
      */
     internal fun updateScrollPositionIfTheFirstItemWasMoved(
         itemProvider: LazyListItemProvider,
@@ -607,18 +573,17 @@
     ): Int = scrollPosition.updateScrollPositionIfTheFirstItemWasMoved(itemProvider, firstItemIndex)
 
     companion object {
-        /**
-         * The default [Saver] implementation for [LazyListState].
-         */
-        val Saver: Saver<LazyListState, *> = listSaver(
-            save = { listOf(it.firstVisibleItemIndex, it.firstVisibleItemScrollOffset) },
-            restore = {
-                LazyListState(
-                    firstVisibleItemIndex = it[0],
-                    firstVisibleItemScrollOffset = it[1]
-                )
-            }
-        )
+        /** The default [Saver] implementation for [LazyListState]. */
+        val Saver: Saver<LazyListState, *> =
+            listSaver(
+                save = { listOf(it.firstVisibleItemIndex, it.firstVisibleItemScrollOffset) },
+                restore = {
+                    LazyListState(
+                        firstVisibleItemIndex = it[0],
+                        firstVisibleItemScrollOffset = it[1]
+                    )
+                }
+            )
 
         /**
          * A [Saver] implementation for [LazyListState] that handles setting a custom
@@ -641,32 +606,35 @@
 
 private val DeltaThresholdForScrollAnimation = 1.dp
 
-private val EmptyLazyListMeasureResult = LazyListMeasureResult(
-    firstVisibleItem = null,
-    firstVisibleItemScrollOffset = 0,
-    canScrollForward = false,
-    consumedScroll = 0f,
-    measureResult = object : MeasureResult {
-        override val width: Int = 0
-        override val height: Int = 0
+private val EmptyLazyListMeasureResult =
+    LazyListMeasureResult(
+        firstVisibleItem = null,
+        firstVisibleItemScrollOffset = 0,
+        canScrollForward = false,
+        consumedScroll = 0f,
+        measureResult =
+            object : MeasureResult {
+                override val width: Int = 0
+                override val height: Int = 0
 
-        @Suppress("PrimitiveInCollection")
-        override val alignmentLines: Map<AlignmentLine, Int> = emptyMap()
-        override fun placeChildren() {}
-    },
-    scrollBackAmount = 0f,
-    visibleItemsInfo = emptyList(),
-    viewportStartOffset = 0,
-    viewportEndOffset = 0,
-    totalItemsCount = 0,
-    reverseLayout = false,
-    orientation = Orientation.Vertical,
-    afterContentPadding = 0,
-    mainAxisItemSpacing = 0,
-    remeasureNeeded = false,
-    coroutineScope = CoroutineScope(EmptyCoroutineContext),
-    density = Density(1f),
-    childConstraints = Constraints()
-)
+                @Suppress("PrimitiveInCollection")
+                override val alignmentLines: Map<AlignmentLine, Int> = emptyMap()
+
+                override fun placeChildren() {}
+            },
+        scrollBackAmount = 0f,
+        visibleItemsInfo = emptyList(),
+        viewportStartOffset = 0,
+        viewportEndOffset = 0,
+        totalItemsCount = 0,
+        reverseLayout = false,
+        orientation = Orientation.Vertical,
+        afterContentPadding = 0,
+        mainAxisItemSpacing = 0,
+        remeasureNeeded = false,
+        coroutineScope = CoroutineScope(EmptyCoroutineContext),
+        density = Density(1f),
+        childConstraints = Constraints()
+    )
 
 private const val NumberOfItemsToTeleport = 100
diff --git a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/LazyScopeMarker.kt b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/LazyScopeMarker.kt
index 1a4f34e..fadff43 100644
--- a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/LazyScopeMarker.kt
+++ b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/LazyScopeMarker.kt
@@ -16,8 +16,5 @@
 
 package androidx.compose.foundation.lazy
 
-/**
- * DSL marker used to distinguish between lazy layout scope and the item scope.
- */
-@DslMarker
-annotation class LazyScopeMarker
+/** DSL marker used to distinguish between lazy layout scope and the item scope. */
+@DslMarker annotation class LazyScopeMarker
diff --git a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/grid/LazyGrid.kt b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/grid/LazyGrid.kt
index 8ea12e3..6611091 100644
--- a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/grid/LazyGrid.kt
+++ b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/grid/LazyGrid.kt
@@ -82,55 +82,58 @@
 
     val coroutineScope = rememberCoroutineScope()
     val graphicsContext = LocalGraphicsContext.current
-    val measurePolicy = rememberLazyGridMeasurePolicy(
-        itemProviderLambda,
-        state,
-        slots,
-        contentPadding,
-        reverseLayout,
-        isVertical,
-        horizontalArrangement,
-        verticalArrangement,
-        coroutineScope,
-        graphicsContext
-    )
+    val measurePolicy =
+        rememberLazyGridMeasurePolicy(
+            itemProviderLambda,
+            state,
+            slots,
+            contentPadding,
+            reverseLayout,
+            isVertical,
+            horizontalArrangement,
+            verticalArrangement,
+            coroutineScope,
+            graphicsContext
+        )
 
     val orientation = if (isVertical) Orientation.Vertical else Orientation.Horizontal
-    val reverseDirection = ScrollableDefaults.reverseDirection(
-        LocalLayoutDirection.current,
-        orientation,
-        reverseLayout
-    )
+    val reverseDirection =
+        ScrollableDefaults.reverseDirection(
+            LocalLayoutDirection.current,
+            orientation,
+            reverseLayout
+        )
 
     LazyLayout(
-        modifier = modifier
-            .then(state.remeasurementModifier)
-            .then(state.awaitLayoutModifier)
-            .lazyLayoutSemantics(
-                itemProviderLambda = itemProviderLambda,
-                state = semanticState,
-                orientation = orientation,
-                userScrollEnabled = userScrollEnabled,
-                reverseScrolling = reverseLayout,
-            )
-            .lazyLayoutBeyondBoundsModifier(
-                state = rememberLazyGridBeyondBoundsState(state = state),
-                beyondBoundsInfo = state.beyondBoundsInfo,
-                reverseLayout = reverseLayout,
-                layoutDirection = LocalLayoutDirection.current,
-                orientation = orientation,
-                enabled = userScrollEnabled
-            )
-            .then(state.itemAnimator.modifier)
-            .scrollingContainer(
-                state = state,
-                orientation = orientation,
-                enabled = userScrollEnabled,
-                reverseDirection = reverseDirection,
-                flingBehavior = flingBehavior,
-                interactionSource = state.internalInteractionSource,
-                overscrollEffect = ScrollableDefaults.overscrollEffect()
-            ),
+        modifier =
+            modifier
+                .then(state.remeasurementModifier)
+                .then(state.awaitLayoutModifier)
+                .lazyLayoutSemantics(
+                    itemProviderLambda = itemProviderLambda,
+                    state = semanticState,
+                    orientation = orientation,
+                    userScrollEnabled = userScrollEnabled,
+                    reverseScrolling = reverseLayout,
+                )
+                .lazyLayoutBeyondBoundsModifier(
+                    state = rememberLazyGridBeyondBoundsState(state = state),
+                    beyondBoundsInfo = state.beyondBoundsInfo,
+                    reverseLayout = reverseLayout,
+                    layoutDirection = LocalLayoutDirection.current,
+                    orientation = orientation,
+                    enabled = userScrollEnabled
+                )
+                .then(state.itemAnimator.modifier)
+                .scrollingContainer(
+                    state = state,
+                    orientation = orientation,
+                    enabled = userScrollEnabled,
+                    reverseDirection = reverseDirection,
+                    flingBehavior = flingBehavior,
+                    interactionSource = state.internalInteractionSource,
+                    overscrollEffect = ScrollableDefaults.overscrollEffect()
+                ),
         prefetchState = state.prefetchState,
         measurePolicy = measurePolicy,
         itemProvider = itemProviderLambda
@@ -138,10 +141,7 @@
 }
 
 /** lazy grid slots configuration */
-internal class LazyGridSlots(
-    val sizes: IntArray,
-    val positions: IntArray
-)
+internal class LazyGridSlots(val sizes: IntArray, val positions: IntArray)
 
 @OptIn(ExperimentalFoundationApi::class)
 @Composable
@@ -166,219 +166,233 @@
     coroutineScope: CoroutineScope,
     /** Used for creating graphics layers */
     graphicsContext: GraphicsContext
-) = remember<LazyLayoutMeasureScope.(Constraints) -> MeasureResult>(
-    state,
-    slots,
-    contentPadding,
-    reverseLayout,
-    isVertical,
-    horizontalArrangement,
-    verticalArrangement,
-    graphicsContext
-) {
-    { containerConstraints ->
-        state.measurementScopeInvalidator.attachToScope()
-        checkScrollableContainerConstraints(
-            containerConstraints,
-            if (isVertical) Orientation.Vertical else Orientation.Horizontal
-        )
-
-        // resolve content paddings
-        val startPadding =
-            if (isVertical) {
-                contentPadding.calculateLeftPadding(layoutDirection).roundToPx()
-            } else {
-                // in horizontal configuration, padding is reversed by placeRelative
-                contentPadding.calculateStartPadding(layoutDirection).roundToPx()
-            }
-
-        val endPadding =
-            if (isVertical) {
-                contentPadding.calculateRightPadding(layoutDirection).roundToPx()
-            } else {
-                // in horizontal configuration, padding is reversed by placeRelative
-                contentPadding.calculateEndPadding(layoutDirection).roundToPx()
-            }
-        val topPadding = contentPadding.calculateTopPadding().roundToPx()
-        val bottomPadding = contentPadding.calculateBottomPadding().roundToPx()
-        val totalVerticalPadding = topPadding + bottomPadding
-        val totalHorizontalPadding = startPadding + endPadding
-        val totalMainAxisPadding = if (isVertical) totalVerticalPadding else totalHorizontalPadding
-        val beforeContentPadding = when {
-            isVertical && !reverseLayout -> topPadding
-            isVertical && reverseLayout -> bottomPadding
-            !isVertical && !reverseLayout -> startPadding
-            else -> endPadding // !isVertical && reverseLayout
-        }
-        val afterContentPadding = totalMainAxisPadding - beforeContentPadding
-        val contentConstraints =
-            containerConstraints.offset(-totalHorizontalPadding, -totalVerticalPadding)
-
-        val itemProvider = itemProviderLambda()
-        val spanLayoutProvider = itemProvider.spanLayoutProvider
-        val resolvedSlots = slots.invoke(density = this, constraints = containerConstraints)
-        val slotsPerLine = resolvedSlots.sizes.size
-        spanLayoutProvider.slotsPerLine = slotsPerLine
-
-        val spaceBetweenLinesDp = if (isVertical) {
-            requireNotNull(verticalArrangement) {
-                "null verticalArrangement when isVertical == true"
-            }.spacing
-        } else {
-            requireNotNull(horizontalArrangement) {
-                "null horizontalArrangement when isVertical == false"
-            }.spacing
-        }
-        val spaceBetweenLines = spaceBetweenLinesDp.roundToPx()
-        val itemsCount = itemProvider.itemCount
-
-        // can be negative if the content padding is larger than the max size from constraints
-        val mainAxisAvailableSize = if (isVertical) {
-            containerConstraints.maxHeight - totalVerticalPadding
-        } else {
-            containerConstraints.maxWidth - totalHorizontalPadding
-        }
-        val visualItemOffset = if (!reverseLayout || mainAxisAvailableSize > 0) {
-            IntOffset(startPadding, topPadding)
-        } else {
-            // When layout is reversed and paddings together take >100% of the available space,
-            // layout size is coerced to 0 when positioning. To take that space into account,
-            // we offset start padding by negative space between paddings.
-            IntOffset(
-                if (isVertical) startPadding else startPadding + mainAxisAvailableSize,
-                if (isVertical) topPadding + mainAxisAvailableSize else topPadding
+) =
+    remember<LazyLayoutMeasureScope.(Constraints) -> MeasureResult>(
+        state,
+        slots,
+        contentPadding,
+        reverseLayout,
+        isVertical,
+        horizontalArrangement,
+        verticalArrangement,
+        graphicsContext
+    ) {
+        { containerConstraints ->
+            state.measurementScopeInvalidator.attachToScope()
+            checkScrollableContainerConstraints(
+                containerConstraints,
+                if (isVertical) Orientation.Vertical else Orientation.Horizontal
             )
-        }
 
-        val measuredItemProvider = object : LazyGridMeasuredItemProvider(
-            itemProvider,
-            this,
-            spaceBetweenLines
-        ) {
-            override fun createItem(
-                index: Int,
-                key: Any,
-                contentType: Any?,
-                crossAxisSize: Int,
-                mainAxisSpacing: Int,
-                placeables: List<Placeable>,
-                constraints: Constraints,
-                lane: Int,
-                span: Int
-            ) = LazyGridMeasuredItem(
-                index = index,
-                key = key,
-                isVertical = isVertical,
-                crossAxisSize = crossAxisSize,
-                mainAxisSpacing = mainAxisSpacing,
-                reverseLayout = reverseLayout,
-                layoutDirection = layoutDirection,
-                beforeContentPadding = beforeContentPadding,
-                afterContentPadding = afterContentPadding,
-                visualOffset = visualItemOffset,
-                placeables = placeables,
-                contentType = contentType,
-                animator = state.itemAnimator,
-                constraints = constraints,
-                lane = lane,
-                span = span
-            )
-        }
-        val measuredLineProvider = object : LazyGridMeasuredLineProvider(
-            isVertical = isVertical,
-            slots = resolvedSlots,
-            gridItemsCount = itemsCount,
-            spaceBetweenLines = spaceBetweenLines,
-            measuredItemProvider = measuredItemProvider,
-            spanLayoutProvider = spanLayoutProvider
-        ) {
-            override fun createLine(
-                index: Int,
-                items: Array<LazyGridMeasuredItem>,
-                spans: List<GridItemSpan>,
-                mainAxisSpacing: Int
-            ) = LazyGridMeasuredLine(
-                index = index,
-                items = items,
-                spans = spans,
-                slots = resolvedSlots,
-                isVertical = isVertical,
-                mainAxisSpacing = mainAxisSpacing,
-            )
-        }
-        val prefetchInfoRetriever: (line: Int) -> List<Pair<Int, Constraints>> = { line ->
-            val lineConfiguration = spanLayoutProvider.getLineConfiguration(line)
-            var index = lineConfiguration.firstItemIndex
-            var slot = 0
-            val result = ArrayList<Pair<Int, Constraints>>(lineConfiguration.spans.size)
-            lineConfiguration.spans.fastForEach {
-                val span = it.currentLineSpan
-                result.add(index to measuredLineProvider.childConstraints(slot, span))
-                ++index
-                slot += span
-            }
-            result
-        }
+            // resolve content paddings
+            val startPadding =
+                if (isVertical) {
+                    contentPadding.calculateLeftPadding(layoutDirection).roundToPx()
+                } else {
+                    // in horizontal configuration, padding is reversed by placeRelative
+                    contentPadding.calculateStartPadding(layoutDirection).roundToPx()
+                }
 
-        val firstVisibleLineIndex: Int
-        val firstVisibleLineScrollOffset: Int
+            val endPadding =
+                if (isVertical) {
+                    contentPadding.calculateRightPadding(layoutDirection).roundToPx()
+                } else {
+                    // in horizontal configuration, padding is reversed by placeRelative
+                    contentPadding.calculateEndPadding(layoutDirection).roundToPx()
+                }
+            val topPadding = contentPadding.calculateTopPadding().roundToPx()
+            val bottomPadding = contentPadding.calculateBottomPadding().roundToPx()
+            val totalVerticalPadding = topPadding + bottomPadding
+            val totalHorizontalPadding = startPadding + endPadding
+            val totalMainAxisPadding =
+                if (isVertical) totalVerticalPadding else totalHorizontalPadding
+            val beforeContentPadding =
+                when {
+                    isVertical && !reverseLayout -> topPadding
+                    isVertical && reverseLayout -> bottomPadding
+                    !isVertical && !reverseLayout -> startPadding
+                    else -> endPadding // !isVertical && reverseLayout
+                }
+            val afterContentPadding = totalMainAxisPadding - beforeContentPadding
+            val contentConstraints =
+                containerConstraints.offset(-totalHorizontalPadding, -totalVerticalPadding)
 
-        Snapshot.withoutReadObservation {
-            val index = state.updateScrollPositionIfTheFirstItemWasMoved(
-                itemProvider, state.firstVisibleItemIndex
-            )
-            if (index < itemsCount || itemsCount <= 0) {
-                firstVisibleLineIndex = spanLayoutProvider.getLineIndexOfItem(index)
-                firstVisibleLineScrollOffset = state.firstVisibleItemScrollOffset
-            } else {
-                // the data set has been updated and now we have less items that we were
-                // scrolled to before
-                firstVisibleLineIndex = spanLayoutProvider.getLineIndexOfItem(itemsCount - 1)
-                firstVisibleLineScrollOffset = 0
-            }
-        }
+            val itemProvider = itemProviderLambda()
+            val spanLayoutProvider = itemProvider.spanLayoutProvider
+            val resolvedSlots = slots.invoke(density = this, constraints = containerConstraints)
+            val slotsPerLine = resolvedSlots.sizes.size
+            spanLayoutProvider.slotsPerLine = slotsPerLine
 
-        val pinnedItems = itemProvider.calculateLazyLayoutPinnedIndices(
-            state.pinnedItems,
-            state.beyondBoundsInfo
-        )
+            val spaceBetweenLinesDp =
+                if (isVertical) {
+                    requireNotNull(verticalArrangement) {
+                            "null verticalArrangement when isVertical == true"
+                        }
+                        .spacing
+                } else {
+                    requireNotNull(horizontalArrangement) {
+                            "null horizontalArrangement when isVertical == false"
+                        }
+                        .spacing
+                }
+            val spaceBetweenLines = spaceBetweenLinesDp.roundToPx()
+            val itemsCount = itemProvider.itemCount
 
-        // todo: wrap with snapshot when b/341782245 is resolved
-        val measureResult =
-            measureLazyGrid(
-                itemsCount = itemsCount,
-                measuredLineProvider = measuredLineProvider,
-                measuredItemProvider = measuredItemProvider,
-                mainAxisAvailableSize = mainAxisAvailableSize,
-                beforeContentPadding = beforeContentPadding,
-                afterContentPadding = afterContentPadding,
-                spaceBetweenLines = spaceBetweenLines,
-                firstVisibleLineIndex = firstVisibleLineIndex,
-                firstVisibleLineScrollOffset = firstVisibleLineScrollOffset,
-                scrollToBeConsumed = state.scrollToBeConsumed,
-                constraints = contentConstraints,
-                isVertical = isVertical,
-                verticalArrangement = verticalArrangement,
-                horizontalArrangement = horizontalArrangement,
-                reverseLayout = reverseLayout,
-                density = this,
-                itemAnimator = state.itemAnimator,
-                slotsPerLine = slotsPerLine,
-                pinnedItems = pinnedItems,
-                coroutineScope = coroutineScope,
-                placementScopeInvalidator = state.placementScopeInvalidator,
-                prefetchInfoRetriever = prefetchInfoRetriever,
-                graphicsContext = graphicsContext,
-                layout = { width, height, placement ->
-                    layout(
-                        containerConstraints.constrainWidth(width + totalHorizontalPadding),
-                        containerConstraints.constrainHeight(height + totalVerticalPadding),
-                        emptyMap(),
-                        placement
+            // can be negative if the content padding is larger than the max size from constraints
+            val mainAxisAvailableSize =
+                if (isVertical) {
+                    containerConstraints.maxHeight - totalVerticalPadding
+                } else {
+                    containerConstraints.maxWidth - totalHorizontalPadding
+                }
+            val visualItemOffset =
+                if (!reverseLayout || mainAxisAvailableSize > 0) {
+                    IntOffset(startPadding, topPadding)
+                } else {
+                    // When layout is reversed and paddings together take >100% of the available
+                    // space,
+                    // layout size is coerced to 0 when positioning. To take that space into
+                    // account,
+                    // we offset start padding by negative space between paddings.
+                    IntOffset(
+                        if (isVertical) startPadding else startPadding + mainAxisAvailableSize,
+                        if (isVertical) topPadding + mainAxisAvailableSize else topPadding
                     )
                 }
-            )
-        state.applyMeasureResult(measureResult)
-        measureResult
+
+            val measuredItemProvider =
+                object : LazyGridMeasuredItemProvider(itemProvider, this, spaceBetweenLines) {
+                    override fun createItem(
+                        index: Int,
+                        key: Any,
+                        contentType: Any?,
+                        crossAxisSize: Int,
+                        mainAxisSpacing: Int,
+                        placeables: List<Placeable>,
+                        constraints: Constraints,
+                        lane: Int,
+                        span: Int
+                    ) =
+                        LazyGridMeasuredItem(
+                            index = index,
+                            key = key,
+                            isVertical = isVertical,
+                            crossAxisSize = crossAxisSize,
+                            mainAxisSpacing = mainAxisSpacing,
+                            reverseLayout = reverseLayout,
+                            layoutDirection = layoutDirection,
+                            beforeContentPadding = beforeContentPadding,
+                            afterContentPadding = afterContentPadding,
+                            visualOffset = visualItemOffset,
+                            placeables = placeables,
+                            contentType = contentType,
+                            animator = state.itemAnimator,
+                            constraints = constraints,
+                            lane = lane,
+                            span = span
+                        )
+                }
+            val measuredLineProvider =
+                object :
+                    LazyGridMeasuredLineProvider(
+                        isVertical = isVertical,
+                        slots = resolvedSlots,
+                        gridItemsCount = itemsCount,
+                        spaceBetweenLines = spaceBetweenLines,
+                        measuredItemProvider = measuredItemProvider,
+                        spanLayoutProvider = spanLayoutProvider
+                    ) {
+                    override fun createLine(
+                        index: Int,
+                        items: Array<LazyGridMeasuredItem>,
+                        spans: List<GridItemSpan>,
+                        mainAxisSpacing: Int
+                    ) =
+                        LazyGridMeasuredLine(
+                            index = index,
+                            items = items,
+                            spans = spans,
+                            slots = resolvedSlots,
+                            isVertical = isVertical,
+                            mainAxisSpacing = mainAxisSpacing,
+                        )
+                }
+            val prefetchInfoRetriever: (line: Int) -> List<Pair<Int, Constraints>> = { line ->
+                val lineConfiguration = spanLayoutProvider.getLineConfiguration(line)
+                var index = lineConfiguration.firstItemIndex
+                var slot = 0
+                val result = ArrayList<Pair<Int, Constraints>>(lineConfiguration.spans.size)
+                lineConfiguration.spans.fastForEach {
+                    val span = it.currentLineSpan
+                    result.add(index to measuredLineProvider.childConstraints(slot, span))
+                    ++index
+                    slot += span
+                }
+                result
+            }
+
+            val firstVisibleLineIndex: Int
+            val firstVisibleLineScrollOffset: Int
+
+            Snapshot.withoutReadObservation {
+                val index =
+                    state.updateScrollPositionIfTheFirstItemWasMoved(
+                        itemProvider,
+                        state.firstVisibleItemIndex
+                    )
+                if (index < itemsCount || itemsCount <= 0) {
+                    firstVisibleLineIndex = spanLayoutProvider.getLineIndexOfItem(index)
+                    firstVisibleLineScrollOffset = state.firstVisibleItemScrollOffset
+                } else {
+                    // the data set has been updated and now we have less items that we were
+                    // scrolled to before
+                    firstVisibleLineIndex = spanLayoutProvider.getLineIndexOfItem(itemsCount - 1)
+                    firstVisibleLineScrollOffset = 0
+                }
+            }
+
+            val pinnedItems =
+                itemProvider.calculateLazyLayoutPinnedIndices(
+                    state.pinnedItems,
+                    state.beyondBoundsInfo
+                )
+
+            // todo: wrap with snapshot when b/341782245 is resolved
+            val measureResult =
+                measureLazyGrid(
+                    itemsCount = itemsCount,
+                    measuredLineProvider = measuredLineProvider,
+                    measuredItemProvider = measuredItemProvider,
+                    mainAxisAvailableSize = mainAxisAvailableSize,
+                    beforeContentPadding = beforeContentPadding,
+                    afterContentPadding = afterContentPadding,
+                    spaceBetweenLines = spaceBetweenLines,
+                    firstVisibleLineIndex = firstVisibleLineIndex,
+                    firstVisibleLineScrollOffset = firstVisibleLineScrollOffset,
+                    scrollToBeConsumed = state.scrollToBeConsumed,
+                    constraints = contentConstraints,
+                    isVertical = isVertical,
+                    verticalArrangement = verticalArrangement,
+                    horizontalArrangement = horizontalArrangement,
+                    reverseLayout = reverseLayout,
+                    density = this,
+                    itemAnimator = state.itemAnimator,
+                    slotsPerLine = slotsPerLine,
+                    pinnedItems = pinnedItems,
+                    coroutineScope = coroutineScope,
+                    placementScopeInvalidator = state.placementScopeInvalidator,
+                    prefetchInfoRetriever = prefetchInfoRetriever,
+                    graphicsContext = graphicsContext,
+                    layout = { width, height, placement ->
+                        layout(
+                            containerConstraints.constrainWidth(width + totalHorizontalPadding),
+                            containerConstraints.constrainHeight(height + totalVerticalPadding),
+                            emptyMap(),
+                            placement
+                        )
+                    }
+                )
+            state.applyMeasureResult(measureResult)
+            measureResult
+        }
     }
-}
diff --git a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/grid/LazyGridAnimateScrollScope.kt b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/grid/LazyGridAnimateScrollScope.kt
index 5fa07f2..39cb9a0 100644
--- a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/grid/LazyGridAnimateScrollScope.kt
+++ b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/grid/LazyGridAnimateScrollScope.kt
@@ -24,18 +24,20 @@
 import kotlin.math.max
 
 @OptIn(ExperimentalFoundationApi::class)
-internal class LazyGridAnimateScrollScope(
-    private val state: LazyGridState
-) : LazyLayoutAnimateScrollScope {
+internal class LazyGridAnimateScrollScope(private val state: LazyGridState) :
+    LazyLayoutAnimateScrollScope {
 
-    override val firstVisibleItemIndex: Int get() = state.firstVisibleItemIndex
+    override val firstVisibleItemIndex: Int
+        get() = state.firstVisibleItemIndex
 
-    override val firstVisibleItemScrollOffset: Int get() = state.firstVisibleItemScrollOffset
+    override val firstVisibleItemScrollOffset: Int
+        get() = state.firstVisibleItemScrollOffset
 
     override val lastVisibleItemIndex: Int
         get() = state.layoutInfo.visibleItemsInfo.lastOrNull()?.index ?: 0
 
-    override val itemCount: Int get() = state.layoutInfo.totalItemsCount
+    override val itemCount: Int
+        get() = state.layoutInfo.totalItemsCount
 
     override fun ScrollScope.snapToItem(index: Int, scrollOffset: Int) {
         state.snapToItemIndexInternal(index, scrollOffset, forceRemeasure = true)
@@ -56,16 +58,15 @@
             (averageLineMainAxisSize * linesDiff).toFloat() - firstVisibleItemScrollOffset
         } else {
             if (layoutInfo.orientation == Orientation.Vertical) {
-                visibleItem.offset.y
-            } else {
-                visibleItem.offset.x
-            }.toFloat()
+                    visibleItem.offset.y
+                } else {
+                    visibleItem.offset.x
+                }
+                .toFloat()
         }
     }
 
-    private fun calculateLineAverageMainAxisSize(
-        layoutInfo: LazyGridLayoutInfo
-    ): Int {
+    private fun calculateLineAverageMainAxisSize(layoutInfo: LazyGridLayoutInfo): Int {
         val isVertical = layoutInfo.orientation == Orientation.Vertical
         val visibleItems = layoutInfo.visibleItemsInfo
         val lineOf: (Int) -> Int = {
@@ -87,14 +88,15 @@
             var lineMainAxisSize = 0
             var lineEndIndex = lineStartIndex
             while (lineEndIndex < visibleItems.size && lineOf(lineEndIndex) == currentLine) {
-                lineMainAxisSize = max(
-                    lineMainAxisSize,
-                    if (isVertical) {
-                        visibleItems[lineEndIndex].size.height
-                    } else {
-                        visibleItems[lineEndIndex].size.width
-                    }
-                )
+                lineMainAxisSize =
+                    max(
+                        lineMainAxisSize,
+                        if (isVertical) {
+                            visibleItems[lineEndIndex].size.height
+                        } else {
+                            visibleItems[lineEndIndex].size.width
+                        }
+                    )
                 ++lineEndIndex
             }
 
diff --git a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/grid/LazyGridBeyondBoundsModifier.kt b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/grid/LazyGridBeyondBoundsModifier.kt
index d8644225..432176a 100644
--- a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/grid/LazyGridBeyondBoundsModifier.kt
+++ b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/grid/LazyGridBeyondBoundsModifier.kt
@@ -22,9 +22,7 @@
 
 @Composable
 internal fun rememberLazyGridBeyondBoundsState(state: LazyGridState): LazyLayoutBeyondBoundsState {
-    return remember(state) {
-        LazyGridBeyondBoundsState(state)
-    }
+    return remember(state) { LazyGridBeyondBoundsState(state) }
 }
 
 internal class LazyGridBeyondBoundsState(
@@ -37,10 +35,13 @@
 
     override val itemCount: Int
         get() = state.layoutInfo.totalItemsCount
+
     override val hasVisibleItems: Boolean
         get() = state.layoutInfo.visibleItemsInfo.isNotEmpty()
+
     override val firstPlacedIndex: Int
         get() = state.firstVisibleItemIndex
+
     override val lastPlacedIndex: Int
         get() = state.layoutInfo.visibleItemsInfo.last().index
 }
diff --git a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/grid/LazyGridDsl.kt b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/grid/LazyGridDsl.kt
index eb45658..84f0084 100644
--- a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/grid/LazyGridDsl.kt
+++ b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/grid/LazyGridDsl.kt
@@ -36,26 +36,28 @@
  * A lazy vertical grid layout. It composes only visible rows of the grid.
  *
  * Sample:
+ *
  * @sample androidx.compose.foundation.samples.LazyVerticalGridSample
  *
  * Sample with custom item spans:
+ *
  * @sample androidx.compose.foundation.samples.LazyVerticalGridSpanSample
  *
- * @param columns describes the count and the size of the grid's columns,
- * see [GridCells] doc for more information
+ * @param columns describes the count and the size of the grid's columns, see [GridCells] doc for
+ *   more information
  * @param modifier the modifier to apply to this layout
  * @param state the state object to be used to control or observe the list's state
  * @param contentPadding specify a padding around the whole content
  * @param reverseLayout reverse the direction of scrolling and layout. When `true`, items will be
- * laid out in the reverse order  and [LazyGridState.firstVisibleItemIndex] == 0 means
- * that grid is scrolled to the bottom. Note that [reverseLayout] does not change the behavior of
- * [verticalArrangement],
- * e.g. with [Arrangement.Top] (top) 123### (bottom) becomes (top) 321### (bottom).
+ *   laid out in the reverse order and [LazyGridState.firstVisibleItemIndex] == 0 means that grid is
+ *   scrolled to the bottom. Note that [reverseLayout] does not change the behavior of
+ *   [verticalArrangement], e.g. with [Arrangement.Top] (top) 123### (bottom) becomes (top) 321###
+ *   (bottom).
  * @param verticalArrangement The vertical arrangement of the layout's children
  * @param horizontalArrangement The horizontal arrangement of the layout's children
  * @param flingBehavior logic describing fling behavior
- * @param userScrollEnabled whether the scrolling via the user gestures or accessibility actions
- * is allowed. You can still scroll programmatically using the state even when it is disabled.
+ * @param userScrollEnabled whether the scrolling via the user gestures or accessibility actions is
+ *   allowed. You can still scroll programmatically using the state even when it is disabled.
  * @param content the [LazyGridScope] which describes the content
  */
 @Composable
@@ -91,24 +93,26 @@
  * A lazy horizontal grid layout. It composes only visible columns of the grid.
  *
  * Sample:
+ *
  * @sample androidx.compose.foundation.samples.LazyHorizontalGridSample
  *
  * Sample with custom item spans:
+ *
  * @sample androidx.compose.foundation.samples.LazyHorizontalGridSpanSample
  *
  * @param rows a class describing how cells form rows, see [GridCells] doc for more information
  * @param modifier the modifier to apply to this layout
  * @param state the state object to be used to control or observe the list's state
  * @param contentPadding specify a padding around the whole content
- * @param reverseLayout reverse the direction of scrolling and layout. When `true`, items are
- * laid out in the reverse order and [LazyGridState.firstVisibleItemIndex] == 0 means
- * that grid is scrolled to the end. Note that [reverseLayout] does not change the behavior of
- * [horizontalArrangement], e.g. with [Arrangement.Start] [123###] becomes [321###].
+ * @param reverseLayout reverse the direction of scrolling and layout. When `true`, items are laid
+ *   out in the reverse order and [LazyGridState.firstVisibleItemIndex] == 0 means that grid is
+ *   scrolled to the end. Note that [reverseLayout] does not change the behavior of
+ *   [horizontalArrangement], e.g. with [Arrangement.Start] [123###] becomes [321###].
  * @param verticalArrangement The vertical arrangement of the layout's children
  * @param horizontalArrangement The horizontal arrangement of the layout's children
  * @param flingBehavior logic describing fling behavior
- * @param userScrollEnabled whether the scrolling via the user gestures or accessibility actions
- * is allowed. You can still scroll programmatically using the state even when it is disabled.
+ * @param userScrollEnabled whether the scrolling via the user gestures or accessibility actions is
+ *   allowed. You can still scroll programmatically using the state even when it is disabled.
  * @param content the [LazyGridScope] which describes the content
  */
 @Composable
@@ -146,32 +150,33 @@
     columns: GridCells,
     horizontalArrangement: Arrangement.Horizontal,
     contentPadding: PaddingValues
-) = remember<LazyGridSlotsProvider>(
-    columns,
-    horizontalArrangement,
-    contentPadding,
-) {
-    GridSlotCache { constraints ->
-        require(constraints.maxWidth != Constraints.Infinity) {
-            "LazyVerticalGrid's width should be bound by parent."
-        }
-        val horizontalPadding = contentPadding.calculateStartPadding(LayoutDirection.Ltr) +
-            contentPadding.calculateEndPadding(LayoutDirection.Ltr)
-        val gridWidth = constraints.maxWidth - horizontalPadding.roundToPx()
-        with(columns) {
-            calculateCrossAxisCellSizes(
-                gridWidth,
-                horizontalArrangement.spacing.roundToPx()
-            ).toIntArray().let { sizes ->
-                val positions = IntArray(sizes.size)
-                with(horizontalArrangement) {
-                    arrange(gridWidth, sizes, LayoutDirection.Ltr, positions)
-                }
-                LazyGridSlots(sizes, positions)
+) =
+    remember<LazyGridSlotsProvider>(
+        columns,
+        horizontalArrangement,
+        contentPadding,
+    ) {
+        GridSlotCache { constraints ->
+            require(constraints.maxWidth != Constraints.Infinity) {
+                "LazyVerticalGrid's width should be bound by parent."
+            }
+            val horizontalPadding =
+                contentPadding.calculateStartPadding(LayoutDirection.Ltr) +
+                    contentPadding.calculateEndPadding(LayoutDirection.Ltr)
+            val gridWidth = constraints.maxWidth - horizontalPadding.roundToPx()
+            with(columns) {
+                calculateCrossAxisCellSizes(gridWidth, horizontalArrangement.spacing.roundToPx())
+                    .toIntArray()
+                    .let { sizes ->
+                        val positions = IntArray(sizes.size)
+                        with(horizontalArrangement) {
+                            arrange(gridWidth, sizes, LayoutDirection.Ltr, positions)
+                        }
+                        LazyGridSlots(sizes, positions)
+                    }
             }
         }
     }
-}
 
 /** Returns prefix sums of row heights. */
 @Composable
@@ -179,32 +184,30 @@
     rows: GridCells,
     verticalArrangement: Arrangement.Vertical,
     contentPadding: PaddingValues
-) = remember<LazyGridSlotsProvider>(
-    rows,
-    verticalArrangement,
-    contentPadding,
-) {
-    GridSlotCache { constraints ->
-        require(constraints.maxHeight != Constraints.Infinity) {
-            "LazyHorizontalGrid's height should be bound by parent."
-        }
-        val verticalPadding = contentPadding.calculateTopPadding() +
-            contentPadding.calculateBottomPadding()
-        val gridHeight = constraints.maxHeight - verticalPadding.roundToPx()
-        with(rows) {
-            calculateCrossAxisCellSizes(
-                gridHeight,
-                verticalArrangement.spacing.roundToPx()
-            ).toIntArray().let { sizes ->
-                val positions = IntArray(sizes.size)
-                with(verticalArrangement) {
-                    arrange(gridHeight, sizes, positions)
-                }
-                LazyGridSlots(sizes, positions)
+) =
+    remember<LazyGridSlotsProvider>(
+        rows,
+        verticalArrangement,
+        contentPadding,
+    ) {
+        GridSlotCache { constraints ->
+            require(constraints.maxHeight != Constraints.Infinity) {
+                "LazyHorizontalGrid's height should be bound by parent."
+            }
+            val verticalPadding =
+                contentPadding.calculateTopPadding() + contentPadding.calculateBottomPadding()
+            val gridHeight = constraints.maxHeight - verticalPadding.roundToPx()
+            with(rows) {
+                calculateCrossAxisCellSizes(gridHeight, verticalArrangement.spacing.roundToPx())
+                    .toIntArray()
+                    .let { sizes ->
+                        val positions = IntArray(sizes.size)
+                        with(verticalArrangement) { arrange(gridHeight, sizes, positions) }
+                        LazyGridSlots(sizes, positions)
+                    }
             }
         }
     }
-}
 
 // Note: Implementing function interface is prohibited in K/JS (class A: () -> Unit)
 // therefore we workaround this limitation by inheriting a fun interface instead
@@ -213,9 +216,8 @@
 }
 
 /** measurement cache to avoid recalculating row/column sizes on each scroll. */
-private class GridSlotCache(
-    private val calculation: Density.(Constraints) -> LazyGridSlots
-) : LazyGridSlotsProvider {
+private class GridSlotCache(private val calculation: Density.(Constraints) -> LazyGridSlots) :
+    LazyGridSlotsProvider {
     private var cachedConstraints = Constraints()
     private var cachedDensity: Float = 0f
     private var cachedSizes: LazyGridSlots? = null
@@ -224,50 +226,48 @@
         with(density) {
             if (
                 cachedSizes != null &&
-                cachedConstraints == constraints &&
-                cachedDensity == this.density
+                    cachedConstraints == constraints &&
+                    cachedDensity == this.density
             ) {
                 return cachedSizes!!
             }
 
             cachedConstraints = constraints
             cachedDensity = this.density
-            return calculation(constraints).also {
-                cachedSizes = it
-            }
+            return calculation(constraints).also { cachedSizes = it }
         }
     }
 }
 
 /**
- * This class describes the count and the sizes of columns in vertical grids,
- * or rows in horizontal grids.
+ * This class describes the count and the sizes of columns in vertical grids, or rows in horizontal
+ * grids.
  */
 @Stable
 interface GridCells {
     /**
-     * Calculates the number of cells and their cross axis size based on
-     * [availableSize] and [spacing].
+     * Calculates the number of cells and their cross axis size based on [availableSize] and
+     * [spacing].
      *
      * For example, in vertical grids, [spacing] is passed from the grid's [Arrangement.Horizontal].
      * The [Arrangement.Horizontal] will also be used to arrange items in a row if the grid is wider
      * than the calculated sum of columns.
      *
-     * Note that the calculated cross axis sizes will be considered in an RTL-aware manner --
-     * if the grid is vertical and the layout direction is RTL, the first width in the returned
-     * list will correspond to the rightmost column.
+     * Note that the calculated cross axis sizes will be considered in an RTL-aware manner -- if the
+     * grid is vertical and the layout direction is RTL, the first width in the returned list will
+     * correspond to the rightmost column.
      *
      * @param availableSize available size on cross axis, e.g. width of [LazyVerticalGrid].
-     * @param spacing cross axis spacing, e.g. horizontal spacing for [LazyVerticalGrid].
-     * The spacing is passed from the corresponding [Arrangement] param of the lazy grid.
+     * @param spacing cross axis spacing, e.g. horizontal spacing for [LazyVerticalGrid]. The
+     *   spacing is passed from the corresponding [Arrangement] param of the lazy grid.
      */
     fun Density.calculateCrossAxisCellSizes(availableSize: Int, spacing: Int): List<Int>
 
     /**
      * Defines a grid with fixed number of rows or columns.
      *
-     * For example, for the vertical [LazyVerticalGrid] Fixed(3) would mean that
-     * there are 3 columns 1/3 of the parent width.
+     * For example, for the vertical [LazyVerticalGrid] Fixed(3) would mean that there are 3 columns
+     * 1/3 of the parent width.
      */
     class Fixed(private val count: Int) : GridCells {
         init {
@@ -291,13 +291,12 @@
     }
 
     /**
-     * Defines a grid with as many rows or columns as possible on the condition that
-     * every cell has at least [minSize] space and all extra space distributed evenly.
+     * Defines a grid with as many rows or columns as possible on the condition that every cell has
+     * at least [minSize] space and all extra space distributed evenly.
      *
-     * For example, for the vertical [LazyVerticalGrid] Adaptive(20.dp) would mean that
-     * there will be as many columns as possible and every column will be at least 20.dp
-     * and all the columns will have equal width. If the screen is 88.dp wide then
-     * there will be 4 columns 22.dp each.
+     * For example, for the vertical [LazyVerticalGrid] Adaptive(20.dp) would mean that there will
+     * be as many columns as possible and every column will be at least 20.dp and all the columns
+     * will have equal width. If the screen is 88.dp wide then there will be 4 columns 22.dp each.
      */
     class Adaptive(private val minSize: Dp) : GridCells {
         init {
@@ -322,15 +321,15 @@
     }
 
     /**
-     * Defines a grid with as many rows or columns as possible on the condition that
-     * every cell takes exactly [size] space. The remaining space will be arranged through
-     * [LazyGrid] arrangements on corresponding axis. If [size] is larger than
-     * container size, the cell will be size to match the container.
+     * Defines a grid with as many rows or columns as possible on the condition that every cell
+     * takes exactly [size] space. The remaining space will be arranged through [LazyGrid]
+     * arrangements on corresponding axis. If [size] is larger than container size, the cell will be
+     * size to match the container.
      *
-     * For example, for the vertical [LazyGrid] FixedSize(20.dp) would mean that
-     * there will be as many columns as possible and every column will be exactly 20.dp.
-     * If the screen is 88.dp wide tne there will be 4 columns 20.dp each with remaining 8.dp
-     * distributed through [Arrangement.Horizontal].
+     * For example, for the vertical [LazyGrid] FixedSize(20.dp) would mean that there will be as
+     * many columns as possible and every column will be exactly 20.dp. If the screen is 88.dp wide
+     * tne there will be 4 columns 20.dp each with remaining 8.dp distributed through
+     * [Arrangement.Horizontal].
      */
     class FixedSize(private val size: Dp) : GridCells {
         init {
@@ -368,32 +367,27 @@
     val gridSizeWithoutSpacing = gridSize - spacing * (slotCount - 1)
     val slotSize = gridSizeWithoutSpacing / slotCount
     val remainingPixels = gridSizeWithoutSpacing % slotCount
-    return List(slotCount) {
-        slotSize + if (it < remainingPixels) 1 else 0
-    }
+    return List(slotCount) { slotSize + if (it < remainingPixels) 1 else 0 }
 }
 
-/**
- * Receiver scope which is used by [LazyVerticalGrid].
- */
+/** Receiver scope which is used by [LazyVerticalGrid]. */
 @LazyGridScopeMarker
 sealed interface LazyGridScope {
     /**
      * Adds a single item to the scope.
      *
-     * @param key a stable and unique key representing the item. Using the same key
-     * for multiple items in the grid is not allowed. Type of the key should be saveable
-     * via Bundle on Android. If null is passed the position in the grid will represent the key.
-     * When you specify the key the scroll position will be maintained based on the key, which
-     * means if you add/remove items before the current visible item the item with the given key
-     * will be kept as the first visible one. This can be overridden by calling
-     * [LazyGridState.requestScrollToItem].
-     * @param span the span of the item. Default is 1x1. It is good practice to leave it `null`
-     * when this matches the intended behavior, as providing a custom implementation impacts
-     * performance
+     * @param key a stable and unique key representing the item. Using the same key for multiple
+     *   items in the grid is not allowed. Type of the key should be saveable via Bundle on Android.
+     *   If null is passed the position in the grid will represent the key. When you specify the key
+     *   the scroll position will be maintained based on the key, which means if you add/remove
+     *   items before the current visible item the item with the given key will be kept as the first
+     *   visible one. This can be overridden by calling [LazyGridState.requestScrollToItem].
+     * @param span the span of the item. Default is 1x1. It is good practice to leave it `null` when
+     *   this matches the intended behavior, as providing a custom implementation impacts
+     *   performance
      * @param contentType the type of the content of this item. The item compositions of the same
-     * type could be reused more efficiently. Note that null is a valid type and items of such
-     * type will be considered compatible.
+     *   type could be reused more efficiently. Note that null is a valid type and items of such
+     *   type will be considered compatible.
      * @param content the content of the item
      */
     fun item(
@@ -407,19 +401,19 @@
      * Adds a [count] of items.
      *
      * @param count the items count
-     * @param key a factory of stable and unique keys representing the item. Using the same key
-     * for multiple items in the grid is not allowed. Type of the key should be saveable
-     * via Bundle on Android. If null is passed the position in the grid will represent the key.
-     * When you specify the key the scroll position will be maintained based on the key, which
-     * means if you add/remove items before the current visible item the item with the given key
-     * will be kept as the first visible one.This can be overridden by calling
-     * [LazyGridState.requestScrollToItem].
-     * @param span define custom spans for the items. Default is 1x1. It is good practice to
-     * leave it `null` when this matches the intended behavior, as providing a custom
-     * implementation impacts performance
-     * @param contentType a factory of the content types for the item. The item compositions of
-     * the same type could be reused more efficiently. Note that null is a valid type and items
-     * of such type will be considered compatible.
+     * @param key a factory of stable and unique keys representing the item. Using the same key for
+     *   multiple items in the grid is not allowed. Type of the key should be saveable via Bundle on
+     *   Android. If null is passed the position in the grid will represent the key. When you
+     *   specify the key the scroll position will be maintained based on the key, which means if you
+     *   add/remove items before the current visible item the item with the given key will be kept
+     *   as the first visible one.This can be overridden by calling
+     *   [LazyGridState.requestScrollToItem].
+     * @param span define custom spans for the items. Default is 1x1. It is good practice to leave
+     *   it `null` when this matches the intended behavior, as providing a custom implementation
+     *   impacts performance
+     * @param contentType a factory of the content types for the item. The item compositions of the
+     *   same type could be reused more efficiently. Note that null is a valid type and items of
+     *   such type will be considered compatible.
      * @param itemContent the content displayed by a single item
      */
     fun items(
@@ -435,19 +429,18 @@
  * Adds a list of items.
  *
  * @param items the data list
- * @param key a factory of stable and unique keys representing the item. Using the same key
- * for multiple items in the grid is not allowed. Type of the key should be saveable
- * via Bundle on Android. If null is passed the position in the grid will represent the key.
- * When you specify the key the scroll position will be maintained based on the key, which
- * means if you add/remove items before the current visible item the item with the given key
- * will be kept as the first visible one. This can be overridden by calling
- * [LazyGridState.requestScrollToItem].
- * @param span define custom spans for the items. Default is 1x1. It is good practice to
- * leave it `null` when this matches the intended behavior, as providing a custom implementation
- * impacts performance
- * @param contentType a factory of the content types for the item. The item compositions of
- * the same type could be reused more efficiently. Note that null is a valid type and items of such
- * type will be considered compatible.
+ * @param key a factory of stable and unique keys representing the item. Using the same key for
+ *   multiple items in the grid is not allowed. Type of the key should be saveable via Bundle on
+ *   Android. If null is passed the position in the grid will represent the key. When you specify
+ *   the key the scroll position will be maintained based on the key, which means if you add/remove
+ *   items before the current visible item the item with the given key will be kept as the first
+ *   visible one. This can be overridden by calling [LazyGridState.requestScrollToItem].
+ * @param span define custom spans for the items. Default is 1x1. It is good practice to leave it
+ *   `null` when this matches the intended behavior, as providing a custom implementation impacts
+ *   performance
+ * @param contentType a factory of the content types for the item. The item compositions of the same
+ *   type could be reused more efficiently. Note that null is a valid type and items of such type
+ *   will be considered compatible.
  * @param itemContent the content displayed by a single item
  */
 inline fun <T> LazyGridScope.items(
@@ -456,32 +449,35 @@
     noinline span: (LazyGridItemSpanScope.(item: T) -> GridItemSpan)? = null,
     noinline contentType: (item: T) -> Any? = { null },
     crossinline itemContent: @Composable LazyGridItemScope.(item: T) -> Unit
-) = items(
-    count = items.size,
-    key = if (key != null) { index: Int -> key(items[index]) } else null,
-    span = if (span != null) { { span(items[it]) } } else null,
-    contentType = { index: Int -> contentType(items[index]) }
-) {
-    itemContent(items[it])
-}
+) =
+    items(
+        count = items.size,
+        key = if (key != null) { index: Int -> key(items[index]) } else null,
+        span =
+            if (span != null) {
+                { span(items[it]) }
+            } else null,
+        contentType = { index: Int -> contentType(items[index]) }
+    ) {
+        itemContent(items[it])
+    }
 
 /**
  * Adds a list of items where the content of an item is aware of its index.
  *
  * @param items the data list
- * @param key a factory of stable and unique keys representing the item. Using the same key
- * for multiple items in the grid is not allowed. Type of the key should be saveable
- * via Bundle on Android. If null is passed the position in the grid will represent the key.
- * When you specify the key the scroll position will be maintained based on the key, which
- * means if you add/remove items before the current visible item the item with the given key
- * will be kept as the first visible one. This can be overridden by calling
- * [LazyGridState.requestScrollToItem].
- * @param span define custom spans for the items. Default is 1x1. It is good practice to leave
- * it `null` when this matches the intended behavior, as providing a custom implementation
- * impacts performance
- * @param contentType a factory of the content types for the item. The item compositions of
- * the same type could be reused more efficiently. Note that null is a valid type and items of such
- * type will be considered compatible.
+ * @param key a factory of stable and unique keys representing the item. Using the same key for
+ *   multiple items in the grid is not allowed. Type of the key should be saveable via Bundle on
+ *   Android. If null is passed the position in the grid will represent the key. When you specify
+ *   the key the scroll position will be maintained based on the key, which means if you add/remove
+ *   items before the current visible item the item with the given key will be kept as the first
+ *   visible one. This can be overridden by calling [LazyGridState.requestScrollToItem].
+ * @param span define custom spans for the items. Default is 1x1. It is good practice to leave it
+ *   `null` when this matches the intended behavior, as providing a custom implementation impacts
+ *   performance
+ * @param contentType a factory of the content types for the item. The item compositions of the same
+ *   type could be reused more efficiently. Note that null is a valid type and items of such type
+ *   will be considered compatible.
  * @param itemContent the content displayed by a single item
  */
 inline fun <T> LazyGridScope.itemsIndexed(
@@ -490,32 +486,35 @@
     noinline span: (LazyGridItemSpanScope.(index: Int, item: T) -> GridItemSpan)? = null,
     crossinline contentType: (index: Int, item: T) -> Any? = { _, _ -> null },
     crossinline itemContent: @Composable LazyGridItemScope.(index: Int, item: T) -> Unit
-) = items(
-    count = items.size,
-    key = if (key != null) { index: Int -> key(index, items[index]) } else null,
-    span = if (span != null) { { span(it, items[it]) } } else null,
-    contentType = { index -> contentType(index, items[index]) }
-) {
-    itemContent(it, items[it])
-}
+) =
+    items(
+        count = items.size,
+        key = if (key != null) { index: Int -> key(index, items[index]) } else null,
+        span =
+            if (span != null) {
+                { span(it, items[it]) }
+            } else null,
+        contentType = { index -> contentType(index, items[index]) }
+    ) {
+        itemContent(it, items[it])
+    }
 
 /**
  * Adds an array of items.
  *
  * @param items the data array
- * @param key a factory of stable and unique keys representing the item. Using the same key
- * for multiple items in the grid is not allowed. Type of the key should be saveable
- * via Bundle on Android. If null is passed the position in the grid will represent the key.
- * When you specify the key the scroll position will be maintained based on the key, which
- * means if you add/remove items before the current visible item the item with the given key
- * will be kept as the first visible one.This can be overridden by calling
- * [LazyGridState.requestScrollToItem].
- * @param span define custom spans for the items. Default is 1x1. It is good practice to leave
- * it `null` when this matches the intended behavior, as providing a custom implementation
- * impacts performance
- * @param contentType a factory of the content types for the item. The item compositions of
- * the same type could be reused more efficiently. Note that null is a valid type and items of such
- * type will be considered compatible.
+ * @param key a factory of stable and unique keys representing the item. Using the same key for
+ *   multiple items in the grid is not allowed. Type of the key should be saveable via Bundle on
+ *   Android. If null is passed the position in the grid will represent the key. When you specify
+ *   the key the scroll position will be maintained based on the key, which means if you add/remove
+ *   items before the current visible item the item with the given key will be kept as the first
+ *   visible one.This can be overridden by calling [LazyGridState.requestScrollToItem].
+ * @param span define custom spans for the items. Default is 1x1. It is good practice to leave it
+ *   `null` when this matches the intended behavior, as providing a custom implementation impacts
+ *   performance
+ * @param contentType a factory of the content types for the item. The item compositions of the same
+ *   type could be reused more efficiently. Note that null is a valid type and items of such type
+ *   will be considered compatible.
  * @param itemContent the content displayed by a single item
  */
 inline fun <T> LazyGridScope.items(
@@ -524,32 +523,35 @@
     noinline span: (LazyGridItemSpanScope.(item: T) -> GridItemSpan)? = null,
     noinline contentType: (item: T) -> Any? = { null },
     crossinline itemContent: @Composable LazyGridItemScope.(item: T) -> Unit
-) = items(
-    count = items.size,
-    key = if (key != null) { index: Int -> key(items[index]) } else null,
-    span = if (span != null) { { span(items[it]) } } else null,
-    contentType = { index: Int -> contentType(items[index]) }
-) {
-    itemContent(items[it])
-}
+) =
+    items(
+        count = items.size,
+        key = if (key != null) { index: Int -> key(items[index]) } else null,
+        span =
+            if (span != null) {
+                { span(items[it]) }
+            } else null,
+        contentType = { index: Int -> contentType(items[index]) }
+    ) {
+        itemContent(items[it])
+    }
 
 /**
  * Adds an array of items where the content of an item is aware of its index.
  *
  * @param items the data array
- * @param key a factory of stable and unique keys representing the item. Using the same key
- * for multiple items in the grid is not allowed. Type of the key should be saveable
- * via Bundle on Android. If null is passed the position in the grid will represent the key.
- * When you specify the key the scroll position will be maintained based on the key, which
- * means if you add/remove items before the current visible item the item with the given key
- * will be kept as the first visible one. This can be overridden by calling
- * [LazyGridState.requestScrollToItem].
- * @param span define custom spans for the items. Default is 1x1. It is good practice to leave
- * it `null` when this matches the intended behavior, as providing a custom implementation
- * impacts performance
- * @param contentType a factory of the content types for the item. The item compositions of
- * the same type could be reused more efficiently. Note that null is a valid type and items of such
- * type will be considered compatible.
+ * @param key a factory of stable and unique keys representing the item. Using the same key for
+ *   multiple items in the grid is not allowed. Type of the key should be saveable via Bundle on
+ *   Android. If null is passed the position in the grid will represent the key. When you specify
+ *   the key the scroll position will be maintained based on the key, which means if you add/remove
+ *   items before the current visible item the item with the given key will be kept as the first
+ *   visible one. This can be overridden by calling [LazyGridState.requestScrollToItem].
+ * @param span define custom spans for the items. Default is 1x1. It is good practice to leave it
+ *   `null` when this matches the intended behavior, as providing a custom implementation impacts
+ *   performance
+ * @param contentType a factory of the content types for the item. The item compositions of the same
+ *   type could be reused more efficiently. Note that null is a valid type and items of such type
+ *   will be considered compatible.
  * @param itemContent the content displayed by a single item
  */
 inline fun <T> LazyGridScope.itemsIndexed(
@@ -558,11 +560,15 @@
     noinline span: (LazyGridItemSpanScope.(index: Int, item: T) -> GridItemSpan)? = null,
     crossinline contentType: (index: Int, item: T) -> Any? = { _, _ -> null },
     crossinline itemContent: @Composable LazyGridItemScope.(index: Int, item: T) -> Unit
-) = items(
-    count = items.size,
-    key = if (key != null) { index: Int -> key(index, items[index]) } else null,
-    span = if (span != null) { { span(it, items[it]) } } else null,
-    contentType = { index -> contentType(index, items[index]) }
-) {
-    itemContent(it, items[it])
-}
+) =
+    items(
+        count = items.size,
+        key = if (key != null) { index: Int -> key(index, items[index]) } else null,
+        span =
+            if (span != null) {
+                { span(it, items[it]) }
+            } else null,
+        contentType = { index -> contentType(index, items[index]) }
+    ) {
+        itemContent(it, items[it])
+    }
diff --git a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/grid/LazyGridIntervalContent.kt b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/grid/LazyGridIntervalContent.kt
index 9faae07..7c369bd 100644
--- a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/grid/LazyGridIntervalContent.kt
+++ b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/grid/LazyGridIntervalContent.kt
@@ -22,9 +22,8 @@
 import androidx.compose.runtime.Composable
 
 @OptIn(ExperimentalFoundationApi::class)
-internal class LazyGridIntervalContent(
-    content: LazyGridScope.() -> Unit
-) : LazyGridScope, LazyLayoutIntervalContent<LazyGridInterval>() {
+internal class LazyGridIntervalContent(content: LazyGridScope.() -> Unit) :
+    LazyGridScope, LazyLayoutIntervalContent<LazyGridInterval>() {
     internal val spanLayoutProvider: LazyGridSpanLayoutProvider = LazyGridSpanLayoutProvider(this)
 
     override val intervals = MutableIntervalList<LazyGridInterval>()
diff --git a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/grid/LazyGridItemInfo.kt b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/grid/LazyGridItemInfo.kt
index 5eeae22..1d74e44 100644
--- a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/grid/LazyGridItemInfo.kt
+++ b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/grid/LazyGridItemInfo.kt
@@ -25,14 +25,10 @@
  * @see LazyGridLayoutInfo
  */
 sealed interface LazyGridItemInfo {
-    /**
-     * The index of the item in the grid.
-     */
+    /** The index of the item in the grid. */
     val index: Int
 
-    /**
-     * The key of the item which was passed to the item() or items() function.
-     */
+    /** The key of the item which was passed to the item() or items() function. */
     val key: Any
 
     /**
@@ -41,34 +37,32 @@
     val offset: IntOffset
 
     /**
-     * The row occupied by the top start point of the item.
-     * If this is unknown, for example while this item is animating to exit the viewport and is
-     * still visible, the value will be [UnknownRow].
+     * The row occupied by the top start point of the item. If this is unknown, for example while
+     * this item is animating to exit the viewport and is still visible, the value will be
+     * [UnknownRow].
      */
     val row: Int
 
     /**
-     * The column occupied by the top start point of the item.
-     * If this is unknown, for example while this item is animating to exit the viewport and is
-     * still visible, the value will be [UnknownColumn].
+     * The column occupied by the top start point of the item. If this is unknown, for example while
+     * this item is animating to exit the viewport and is still visible, the value will be
+     * [UnknownColumn].
      */
     val column: Int
 
     /**
-     * The pixel size of the item. Note that if you emit multiple layouts in the composable
-     * slot for the item then this size will be calculated as the max of their sizes.
+     * The pixel size of the item. Note that if you emit multiple layouts in the composable slot for
+     * the item then this size will be calculated as the max of their sizes.
      */
     val size: IntSize
 
-    /**
-     * The content type of the item which was passed to the item() or items() function.
-     */
+    /** The content type of the item which was passed to the item() or items() function. */
     val contentType: Any?
 
     companion object {
         /**
-         * Possible value for [row], when they are unknown. This can happen when the item is
-         * visible while animating to exit the viewport.
+         * Possible value for [row], when they are unknown. This can happen when the item is visible
+         * while animating to exit the viewport.
          */
         const val UnknownRow = -1
         /**
diff --git a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/grid/LazyGridItemProvider.kt b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/grid/LazyGridItemProvider.kt
index 55d346b..dc4ddf8 100644
--- a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/grid/LazyGridItemProvider.kt
+++ b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/grid/LazyGridItemProvider.kt
@@ -41,18 +41,20 @@
 ): () -> LazyGridItemProvider {
     val latestContent = rememberUpdatedState(content)
     return remember(state) {
-        val intervalContentState = derivedStateOf(referentialEqualityPolicy()) {
-            LazyGridIntervalContent(latestContent.value)
-        }
-        val itemProviderState = derivedStateOf(referentialEqualityPolicy()) {
-            val intervalContent = intervalContentState.value
-            val map = NearestRangeKeyIndexMap(state.nearestRange, intervalContent)
-            LazyGridItemProviderImpl(
-                state = state,
-                intervalContent = intervalContent,
-                keyIndexMap = map
-            )
-        }
+        val intervalContentState =
+            derivedStateOf(referentialEqualityPolicy()) {
+                LazyGridIntervalContent(latestContent.value)
+            }
+        val itemProviderState =
+            derivedStateOf(referentialEqualityPolicy()) {
+                val intervalContent = intervalContentState.value
+                val map = NearestRangeKeyIndexMap(state.nearestRange, intervalContent)
+                LazyGridItemProviderImpl(
+                    state = state,
+                    intervalContent = intervalContent,
+                    keyIndexMap = map
+                )
+            }
         itemProviderState::value
     }
 }
@@ -64,7 +66,8 @@
     override val keyIndexMap: LazyLayoutKeyIndexMap,
 ) : LazyGridItemProvider {
 
-    override val itemCount: Int get() = intervalContent.itemCount
+    override val itemCount: Int
+        get() = intervalContent.itemCount
 
     override fun getKey(index: Int): Any =
         keyIndexMap.getKey(index) ?: intervalContent.getKey(index)
diff --git a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/grid/LazyGridItemScope.kt b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/grid/LazyGridItemScope.kt
index 1b3ba4e..e2b7dad 100644
--- a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/grid/LazyGridItemScope.kt
+++ b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/grid/LazyGridItemScope.kt
@@ -25,9 +25,7 @@
 import androidx.compose.ui.Modifier
 import androidx.compose.ui.unit.IntOffset
 
-/**
- * Receiver scope being used by the item content parameter of [LazyVerticalGrid].
- */
+/** Receiver scope being used by the item content parameter of [LazyVerticalGrid]. */
 @Stable
 @LazyGridScopeMarker
 sealed interface LazyGridItemScope {
@@ -40,22 +38,22 @@
      *
      * @sample androidx.compose.foundation.samples.GridAnimateItemSample
      *
-     * @param fadeInSpec an animation specs to use for animating the item appearance.
-     * When null is provided the item will be appearing without animations.
+     * @param fadeInSpec an animation specs to use for animating the item appearance. When null is
+     *   provided the item will be appearing without animations.
      * @param placementSpec an animation specs that will be used to animate the item placement.
-     * Aside from item reordering all other position changes caused by events like arrangement or
-     * alignment changes will also be animated. When null is provided no animations will happen.
-     * @param fadeOutSpec an animation specs to use for animating the item disappearance.
-     * When null is provided the item will be disappearance without animations.
+     *   Aside from item reordering all other position changes caused by events like arrangement or
+     *   alignment changes will also be animated. When null is provided no animations will happen.
+     * @param fadeOutSpec an animation specs to use for animating the item disappearance. When null
+     *   is provided the item will be disappearance without animations.
      */
     fun Modifier.animateItem(
         fadeInSpec: FiniteAnimationSpec<Float>? = spring(stiffness = Spring.StiffnessMediumLow),
-        placementSpec: FiniteAnimationSpec<IntOffset>? = spring(
-            stiffness = Spring.StiffnessMediumLow,
-            visibilityThreshold = IntOffset.VisibilityThreshold
-        ),
-        fadeOutSpec: FiniteAnimationSpec<Float>? =
-            spring(stiffness = Spring.StiffnessMediumLow),
+        placementSpec: FiniteAnimationSpec<IntOffset>? =
+            spring(
+                stiffness = Spring.StiffnessMediumLow,
+                visibilityThreshold = IntOffset.VisibilityThreshold
+            ),
+        fadeOutSpec: FiniteAnimationSpec<Float>? = spring(stiffness = Spring.StiffnessMediumLow),
     ): Modifier
 
     /**
@@ -76,13 +74,10 @@
     )
     @ExperimentalFoundationApi
     fun Modifier.animateItemPlacement(
-        animationSpec: FiniteAnimationSpec<IntOffset> = spring(
-            stiffness = Spring.StiffnessMediumLow,
-            visibilityThreshold = IntOffset.VisibilityThreshold
-        )
-    ): Modifier = animateItem(
-        fadeInSpec = null,
-        placementSpec = animationSpec,
-        fadeOutSpec = null
-    )
+        animationSpec: FiniteAnimationSpec<IntOffset> =
+            spring(
+                stiffness = Spring.StiffnessMediumLow,
+                visibilityThreshold = IntOffset.VisibilityThreshold
+            )
+    ): Modifier = animateItem(fadeInSpec = null, placementSpec = animationSpec, fadeOutSpec = null)
 }
diff --git a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/grid/LazyGridItemScopeImpl.kt b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/grid/LazyGridItemScopeImpl.kt
index bc28eed..d3eee72 100644
--- a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/grid/LazyGridItemScopeImpl.kt
+++ b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/grid/LazyGridItemScopeImpl.kt
@@ -30,10 +30,6 @@
         if (fadeInSpec == null && placementSpec == null && fadeOutSpec == null) {
             this
         } else {
-            this then LazyLayoutAnimateItemElement(
-                fadeInSpec,
-                placementSpec,
-                fadeOutSpec
-            )
+            this then LazyLayoutAnimateItemElement(fadeInSpec, placementSpec, fadeOutSpec)
         }
 }
diff --git a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/grid/LazyGridLayoutInfo.kt b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/grid/LazyGridLayoutInfo.kt
index a09de86..f2a9ac7 100644
--- a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/grid/LazyGridLayoutInfo.kt
+++ b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/grid/LazyGridLayoutInfo.kt
@@ -26,15 +26,14 @@
  * Use [LazyGridState.layoutInfo] to retrieve this
  */
 sealed interface LazyGridLayoutInfo {
-    /**
-     * The list of [LazyGridItemInfo] representing all the currently visible items.
-     */
+    /** The list of [LazyGridItemInfo] representing all the currently visible items. */
     val visibleItemsInfo: List<LazyGridItemInfo>
 
     /**
      * The start offset of the layout's viewport in pixels. You can think of it as a minimum offset
-     * which would be visible. Usually it is 0, but it can be negative if non-zero [beforeContentPadding]
-     * was applied as the content displayed in the content padding area is still visible.
+     * which would be visible. Usually it is 0, but it can be negative if non-zero
+     * [beforeContentPadding] was applied as the content displayed in the content padding area is
+     * still visible.
      *
      * You can use it to understand what items from [visibleItemsInfo] are fully visible.
      */
@@ -48,41 +47,35 @@
      */
     val viewportEndOffset: Int
 
-    /**
-     * The total count of items passed to [LazyVerticalGrid].
-     */
+    /** The total count of items passed to [LazyVerticalGrid]. */
     val totalItemsCount: Int
 
     /**
-     * The size of the viewport in pixels. It is the lazy grid layout size including all the
-     * content paddings.
+     * The size of the viewport in pixels. It is the lazy grid layout size including all the content
+     * paddings.
      */
     val viewportSize: IntSize
 
-    /**
-     * The orientation of the lazy grid.
-     */
+    /** The orientation of the lazy grid. */
     val orientation: Orientation
 
-    /**
-     * True if the direction of scrolling and layout is reversed.
-     */
+    /** True if the direction of scrolling and layout is reversed. */
     val reverseLayout: Boolean
 
     /**
-     * The content padding in pixels applied before the first row/column in the direction of scrolling.
-     * For example it is a top content padding for LazyVerticalGrid with reverseLayout set to false.
+     * The content padding in pixels applied before the first row/column in the direction of
+     * scrolling. For example it is a top content padding for LazyVerticalGrid with reverseLayout
+     * set to false.
      */
     val beforeContentPadding: Int
 
     /**
-     * The content padding in pixels applied after the last row/column in the direction of scrolling.
-     * For example it is a bottom content padding for LazyVerticalGrid with reverseLayout set to false.
+     * The content padding in pixels applied after the last row/column in the direction of
+     * scrolling. For example it is a bottom content padding for LazyVerticalGrid with reverseLayout
+     * set to false.
      */
     val afterContentPadding: Int
 
-    /**
-     * The spacing between lines in the direction of scrolling.
-     */
+    /** The spacing between lines in the direction of scrolling. */
     val mainAxisItemSpacing: Int
 }
diff --git a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/grid/LazyGridMeasure.kt b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/grid/LazyGridMeasure.kt
index 9b0ee2f..0c468154 100644
--- a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/grid/LazyGridMeasure.kt
+++ b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/grid/LazyGridMeasure.kt
@@ -41,8 +41,8 @@
 import kotlinx.coroutines.CoroutineScope
 
 /**
- * Measures and calculates the positions for the currently visible items. The result is produced
- * as a [LazyGridMeasureResult] which contains all the calculations.
+ * Measures and calculates the positions for the currently visible items. The result is produced as
+ * a [LazyGridMeasureResult] which contains all the calculations.
  */
 @OptIn(ExperimentalFoundationApi::class)
 internal fun measureLazyGrid(
@@ -194,10 +194,11 @@
         // then composing visible lines forward until we fill the whole viewport.
         // we want to have at least one line in visibleItems even if in fact all the items are
         // offscreen, this can happen if the content padding is larger than the available size.
-        while (index < itemsCount &&
-            (currentMainAxisOffset < maxMainAxis ||
-                currentMainAxisOffset <= 0 || // filling beforeContentPadding area
-                visibleLines.isEmpty())
+        while (
+            index < itemsCount &&
+                (currentMainAxisOffset < maxMainAxis ||
+                    currentMainAxisOffset <= 0 || // filling beforeContentPadding area
+                    visibleLines.isEmpty())
         ) {
             val measuredLine = measuredLineProvider.getAndMeasure(index)
             if (measuredLine.isEmpty()) {
@@ -205,8 +206,9 @@
             }
 
             currentMainAxisOffset += measuredLine.mainAxisSizeWithSpacings
-            if (currentMainAxisOffset <= minOffset &&
-                measuredLine.items.last().index != itemsCount - 1
+            if (
+                currentMainAxisOffset <= minOffset &&
+                    measuredLine.items.last().index != itemsCount - 1
             ) {
                 // this line is offscreen and will not be visible. advance firstVisibleLineIndex
                 currentFirstLineIndex = index + 1
@@ -224,8 +226,8 @@
             val toScrollBack = maxOffset - currentMainAxisOffset
             currentFirstLineScrollOffset -= toScrollBack
             currentMainAxisOffset += toScrollBack
-            while (currentFirstLineScrollOffset < beforeContentPadding &&
-                currentFirstLineIndex > 0
+            while (
+                currentFirstLineScrollOffset < beforeContentPadding && currentFirstLineIndex > 0
             ) {
                 val previousIndex = currentFirstLineIndex - 1
                 val measuredLine = measuredLineProvider.getAndMeasure(previousIndex)
@@ -245,13 +247,15 @@
         // scrollToBeConsumed if there were not enough lines to fill the offered space or it
         // can be larger if lines were resized, or if, for example, we were previously
         // displaying the line 15, but now we have only 10 lines in total in the data set.
-        val consumedScroll = if (scrollToBeConsumed.fastRoundToInt().sign == scrollDelta.sign &&
-            abs(scrollToBeConsumed.fastRoundToInt()) >= abs(scrollDelta)
-        ) {
-            scrollDelta.toFloat()
-        } else {
-            scrollToBeConsumed
-        }
+        val consumedScroll =
+            if (
+                scrollToBeConsumed.fastRoundToInt().sign == scrollDelta.sign &&
+                    abs(scrollToBeConsumed.fastRoundToInt()) >= abs(scrollDelta)
+            ) {
+                scrollDelta.toFloat()
+            } else {
+                scrollToBeConsumed
+            }
 
         // the initial offset for lines from visibleLines list
         require(currentFirstLineScrollOffset >= 0) { "negative initial offset" }
@@ -260,27 +264,31 @@
 
         val firstItemIndex = firstLine.items.firstOrNull()?.index ?: 0
         val lastItemIndex = visibleLines.lastOrNull()?.items?.lastOrNull()?.index ?: 0
-        val extraItemsBefore = calculateExtraItems(
-            pinnedItems = pinnedItems,
-            measuredItemProvider = measuredItemProvider,
-            measuredLineProvider = measuredLineProvider,
-            filter = { it in 0 until firstItemIndex }
-        )
+        val extraItemsBefore =
+            calculateExtraItems(
+                pinnedItems = pinnedItems,
+                measuredItemProvider = measuredItemProvider,
+                measuredLineProvider = measuredLineProvider,
+                filter = { it in 0 until firstItemIndex }
+            )
 
-        val extraItemsAfter = calculateExtraItems(
-            pinnedItems = pinnedItems,
-            measuredItemProvider = measuredItemProvider,
-            measuredLineProvider = measuredLineProvider,
-            filter = { it in (lastItemIndex + 1) until itemsCount }
-        )
+        val extraItemsAfter =
+            calculateExtraItems(
+                pinnedItems = pinnedItems,
+                measuredItemProvider = measuredItemProvider,
+                measuredLineProvider = measuredLineProvider,
+                filter = { it in (lastItemIndex + 1) until itemsCount }
+            )
 
         // even if we compose lines to fill before content padding we should ignore lines fully
         // located there for the state's scroll position calculation (first line + first offset)
         if (beforeContentPadding > 0 || spaceBetweenLines < 0) {
             for (i in visibleLines.indices) {
                 val size = visibleLines[i].mainAxisSizeWithSpacings
-                if (currentFirstLineScrollOffset != 0 && size <= currentFirstLineScrollOffset &&
-                    i != visibleLines.lastIndex
+                if (
+                    currentFirstLineScrollOffset != 0 &&
+                        size <= currentFirstLineScrollOffset &&
+                        i != visibleLines.lastIndex
                 ) {
                     currentFirstLineScrollOffset -= size
                     firstLine = visibleLines[i + 1]
@@ -290,32 +298,35 @@
             }
         }
 
-        var layoutWidth = if (isVertical) {
-            constraints.maxWidth
-        } else {
-            constraints.constrainWidth(currentMainAxisOffset)
-        }
-        var layoutHeight = if (isVertical) {
-            constraints.constrainHeight(currentMainAxisOffset)
-        } else {
-            constraints.maxHeight
-        }
+        var layoutWidth =
+            if (isVertical) {
+                constraints.maxWidth
+            } else {
+                constraints.constrainWidth(currentMainAxisOffset)
+            }
+        var layoutHeight =
+            if (isVertical) {
+                constraints.constrainHeight(currentMainAxisOffset)
+            } else {
+                constraints.maxHeight
+            }
 
-        val positionedItems = calculateItemsOffsets(
-            lines = visibleLines,
-            itemsBefore = extraItemsBefore,
-            itemsAfter = extraItemsAfter,
-            layoutWidth = layoutWidth,
-            layoutHeight = layoutHeight,
-            finalMainAxisOffset = currentMainAxisOffset,
-            maxOffset = maxOffset,
-            firstLineScrollOffset = visibleLinesScrollOffset,
-            isVertical = isVertical,
-            verticalArrangement = verticalArrangement,
-            horizontalArrangement = horizontalArrangement,
-            reverseLayout = reverseLayout,
-            density = density
-        )
+        val positionedItems =
+            calculateItemsOffsets(
+                lines = visibleLines,
+                itemsBefore = extraItemsBefore,
+                itemsAfter = extraItemsAfter,
+                layoutWidth = layoutWidth,
+                layoutHeight = layoutHeight,
+                finalMainAxisOffset = currentMainAxisOffset,
+                maxOffset = maxOffset,
+                firstLineScrollOffset = visibleLinesScrollOffset,
+                isVertical = isVertical,
+                verticalArrangement = verticalArrangement,
+                horizontalArrangement = horizontalArrangement,
+                reverseLayout = reverseLayout,
+                density = density
+            )
 
         itemAnimator.onMeasured(
             consumedScroll = consumedScroll.toInt(),
@@ -343,32 +354,29 @@
                 constraints.constrainHeight(maxOf(layoutHeight, disappearingItemsSize.height))
             val newMainAxisSize = if (isVertical) layoutHeight else layoutWidth
             if (newMainAxisSize != oldMainAxisSize) {
-                positionedItems.fastForEach {
-                    it.updateMainAxisLayoutSize(newMainAxisSize)
-                }
+                positionedItems.fastForEach { it.updateMainAxisLayoutSize(newMainAxisSize) }
             }
         }
 
         return LazyGridMeasureResult(
             firstVisibleLine = firstLine,
             firstVisibleLineScrollOffset = currentFirstLineScrollOffset,
-            canScrollForward =
-            lastItemIndex != itemsCount - 1 || currentMainAxisOffset > maxOffset,
+            canScrollForward = lastItemIndex != itemsCount - 1 || currentMainAxisOffset > maxOffset,
             consumedScroll = consumedScroll,
-            measureResult = layout(layoutWidth, layoutHeight) {
-                positionedItems.fastForEach { it.place(this) }
-                // we attach it during the placement so LazyGridState can trigger re-placement
-                placementScopeInvalidator.attachToScope()
-            },
+            measureResult =
+                layout(layoutWidth, layoutHeight) {
+                    positionedItems.fastForEach { it.place(this) }
+                    // we attach it during the placement so LazyGridState can trigger re-placement
+                    placementScopeInvalidator.attachToScope()
+                },
             viewportStartOffset = -beforeContentPadding,
             viewportEndOffset = mainAxisAvailableSize + afterContentPadding,
-            visibleItemsInfo = if (extraItemsBefore.isEmpty() && extraItemsAfter.isEmpty()) {
-                positionedItems
-            } else {
-                positionedItems.fastFilter {
-                    it.index in firstItemIndex..lastItemIndex
-                }
-            },
+            visibleItemsInfo =
+                if (extraItemsBefore.isEmpty() && extraItemsAfter.isEmpty()) {
+                    positionedItems
+                } else {
+                    positionedItems.fastFilter { it.index in firstItemIndex..lastItemIndex }
+                },
             totalItemsCount = itemsCount,
             reverseLayout = reverseLayout,
             orientation = if (isVertical) Orientation.Vertical else Orientation.Horizontal,
@@ -396,12 +404,13 @@
         if (filter(index)) {
             val span = measuredLineProvider.spanOf(index)
             val constraints = measuredLineProvider.childConstraints(0, span)
-            val measuredItem = measuredItemProvider.getAndMeasure(
-                index = index,
-                constraints = constraints,
-                lane = 0,
-                span = span
-            )
+            val measuredItem =
+                measuredItemProvider.getAndMeasure(
+                    index = index,
+                    constraints = constraints,
+                    lane = 0,
+                    span = span
+                )
             if (items == null) {
                 items = mutableListOf()
             }
@@ -412,9 +421,7 @@
     return items ?: emptyList()
 }
 
-/**
- * Calculates [LazyGridMeasuredLine]s offsets.
- */
+/** Calculates [LazyGridMeasuredLine]s offsets. */
 private fun calculateItemsOffsets(
     lines: List<LazyGridMeasuredLine>,
     itemsBefore: List<LazyGridMeasuredItem>,
@@ -441,12 +448,9 @@
     if (hasSpareSpace) {
         require(itemsBefore.isEmpty() && itemsAfter.isEmpty()) { "no items" }
         val linesCount = lines.size
-        fun Int.reverseAware() =
-            if (!reverseLayout) this else linesCount - this - 1
+        fun Int.reverseAware() = if (!reverseLayout) this else linesCount - this - 1
 
-        val sizes = IntArray(linesCount) { index ->
-            lines[index.reverseAware()].mainAxisSize
-        }
+        val sizes = IntArray(linesCount) { index -> lines[index.reverseAware()].mainAxisSize }
         val offsets = IntArray(linesCount) { 0 }
         if (isVertical) {
             with(requireNotNull(verticalArrangement) { "null verticalArrangement" }) {
@@ -466,12 +470,13 @@
             val absoluteOffset = offsets[index]
             // when reverseLayout == true, offsets are stored in the reversed order to items
             val line = lines[index.reverseAware()]
-            val relativeOffset = if (reverseLayout) {
-                // inverse offset to align with scroll direction for positioning
-                mainAxisLayoutSize - absoluteOffset - line.mainAxisSize
-            } else {
-                absoluteOffset
-            }
+            val relativeOffset =
+                if (reverseLayout) {
+                    // inverse offset to align with scroll direction for positioning
+                    mainAxisLayoutSize - absoluteOffset - line.mainAxisSize
+                } else {
+                    absoluteOffset
+                }
             positionedItems.addAllFromArray(
                 line.position(relativeOffset, layoutWidth, layoutHeight)
             )
diff --git a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/grid/LazyGridMeasureResult.kt b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/grid/LazyGridMeasureResult.kt
index 7ad01c2..38b73fc 100644
--- a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/grid/LazyGridMeasureResult.kt
+++ b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/grid/LazyGridMeasureResult.kt
@@ -25,20 +25,18 @@
 import androidx.compose.ui.util.fastForEach
 import kotlinx.coroutines.CoroutineScope
 
-/**
- * The result of the measure pass for lazy list layout.
- */
+/** The result of the measure pass for lazy list layout. */
 internal class LazyGridMeasureResult(
     // properties defining the scroll position:
-    /** The new first visible line of items.*/
+    /** The new first visible line of items. */
     val firstVisibleLine: LazyGridMeasuredLine?,
-    /** The new value for [LazyGridState.firstVisibleItemScrollOffset].*/
+    /** The new value for [LazyGridState.firstVisibleItemScrollOffset]. */
     var firstVisibleLineScrollOffset: Int,
-    /** True if there is some space available to continue scrolling in the forward direction.*/
+    /** True if there is some space available to continue scrolling in the forward direction. */
     var canScrollForward: Boolean,
-    /** The amount of scroll consumed during the measure pass.*/
+    /** The amount of scroll consumed during the measure pass. */
     var consumedScroll: Float,
-    /** MeasureResult defining the layout.*/
+    /** MeasureResult defining the layout. */
     measureResult: MeasureResult,
     /** True when extra remeasure is required. */
     val remeasureNeeded: Boolean,
@@ -74,24 +72,28 @@
 
     override val viewportSize: IntSize
         get() = IntSize(width, height)
-    override val beforeContentPadding: Int get() = -viewportStartOffset
+
+    override val beforeContentPadding: Int
+        get() = -viewportStartOffset
 
     /**
-     * Tries to apply a scroll [delta] for this layout info. In some cases we can apply small
-     * scroll deltas by just changing the offsets for each [visibleItemsInfo].
-     * But we can only do so if after applying the delta we would not need to compose a new item
-     * or dispose an item which is currently visible. In this case this function will not apply
-     * the [delta] and return false.
+     * Tries to apply a scroll [delta] for this layout info. In some cases we can apply small scroll
+     * deltas by just changing the offsets for each [visibleItemsInfo]. But we can only do so if
+     * after applying the delta we would not need to compose a new item or dispose an item which is
+     * currently visible. In this case this function will not apply the [delta] and return false.
      *
-     * @return true if we can safely apply a passed scroll [delta] to this layout info.
-     * If true is returned, only the placement phase is needed to apply new offsets.
-     * If false is returned, it means we have to rerun the full measure phase to apply the [delta].
+     * @return true if we can safely apply a passed scroll [delta] to this layout info. If true is
+     *   returned, only the placement phase is needed to apply new offsets. If false is returned, it
+     *   means we have to rerun the full measure phase to apply the [delta].
      */
     fun tryToApplyScrollWithoutRemeasure(delta: Int): Boolean {
-        if (remeasureNeeded || visibleItemsInfo.isEmpty() || firstVisibleLine == null ||
-            // applying this delta will change firstVisibleLineScrollOffset
-            (firstVisibleLineScrollOffset - delta) !in
-            0 until firstVisibleLine.mainAxisSizeWithSpacings
+        if (
+            remeasureNeeded ||
+                visibleItemsInfo.isEmpty() ||
+                firstVisibleLine == null ||
+                // applying this delta will change firstVisibleLineScrollOffset
+                (firstVisibleLineScrollOffset - delta) !in
+                    0 until firstVisibleLine.mainAxisSizeWithSpacings
         ) {
             return false
         }
@@ -101,26 +103,26 @@
             // non scrollable items require special handling.
             return false
         }
-        val canApply = if (delta < 0) {
-            // scrolling forward
-            val deltaToFirstItemChange = first.offsetOnMainAxis(orientation) +
-                first.mainAxisSizeWithSpacings - viewportStartOffset
-            val deltaToLastItemChange = last.offsetOnMainAxis(orientation) +
-                last.mainAxisSizeWithSpacings - viewportEndOffset
-            minOf(deltaToFirstItemChange, deltaToLastItemChange) > -delta
-        } else {
-            // scrolling backward
-            val deltaToFirstItemChange =
-                viewportStartOffset - first.offsetOnMainAxis(orientation)
-            val deltaToLastItemChange =
-                viewportEndOffset - last.offsetOnMainAxis(orientation)
-            minOf(deltaToFirstItemChange, deltaToLastItemChange) > delta
-        }
+        val canApply =
+            if (delta < 0) {
+                // scrolling forward
+                val deltaToFirstItemChange =
+                    first.offsetOnMainAxis(orientation) + first.mainAxisSizeWithSpacings -
+                        viewportStartOffset
+                val deltaToLastItemChange =
+                    last.offsetOnMainAxis(orientation) + last.mainAxisSizeWithSpacings -
+                        viewportEndOffset
+                minOf(deltaToFirstItemChange, deltaToLastItemChange) > -delta
+            } else {
+                // scrolling backward
+                val deltaToFirstItemChange =
+                    viewportStartOffset - first.offsetOnMainAxis(orientation)
+                val deltaToLastItemChange = viewportEndOffset - last.offsetOnMainAxis(orientation)
+                minOf(deltaToFirstItemChange, deltaToLastItemChange) > delta
+            }
         return if (canApply) {
             firstVisibleLineScrollOffset -= delta
-            visibleItemsInfo.fastForEach {
-                it.applyScrollDelta(delta)
-            }
+            visibleItemsInfo.fastForEach { it.applyScrollDelta(delta) }
             consumedScroll = delta.toFloat()
             if (!canScrollForward && delta > 0) {
                 // we scrolled backward, so now we can scroll forward
diff --git a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/grid/LazyGridMeasuredItem.kt b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/grid/LazyGridMeasuredItem.kt
index f654d20..2e5cfcb 100644
--- a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/grid/LazyGridMeasuredItem.kt
+++ b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/grid/LazyGridMeasuredItem.kt
@@ -27,8 +27,8 @@
 import androidx.compose.ui.util.fastForEach
 
 /**
- * Represents one measured item of the lazy grid. It can in fact consist of multiple placeables
- * if the user emit multiple layout nodes in the item callback.
+ * Represents one measured item of the lazy grid. It can in fact consist of multiple placeables if
+ * the user emit multiple layout nodes in the item callback.
  */
 internal class LazyGridMeasuredItem(
     override val index: Int,
@@ -56,17 +56,14 @@
     override val lane: Int,
     override val span: Int
 ) : LazyGridItemInfo, LazyLayoutMeasuredItem {
-    /**
-     * Main axis size of the item - the max main axis size of the placeables.
-     */
+    /** Main axis size of the item - the max main axis size of the placeables. */
     val mainAxisSize: Int
 
-    /**
-     * The max main axis size of the placeables plus mainAxisSpacing.
-     */
+    /** The max main axis size of the placeables plus mainAxisSpacing. */
     override val mainAxisSizeWithSpacings: Int
 
-    override val placeablesCount: Int get() = placeables.size
+    override val placeablesCount: Int
+        get() = placeables.size
 
     private var mainAxisLayoutSize: Int = Unset
     private var minMainAxisOffset: Int = 0
@@ -83,15 +80,18 @@
         mainAxisSizeWithSpacings = (maxMainAxis + mainAxisSpacing).coerceAtLeast(0)
     }
 
-    override val size: IntSize = if (isVertical) {
-        IntSize(crossAxisSize, mainAxisSize)
-    } else {
-        IntSize(mainAxisSize, crossAxisSize)
-    }
+    override val size: IntSize =
+        if (isVertical) {
+            IntSize(crossAxisSize, mainAxisSize)
+        } else {
+            IntSize(mainAxisSize, crossAxisSize)
+        }
     override var offset: IntOffset = IntOffset.Zero
         private set
+
     override var row: Int = LazyGridItemInfo.UnknownRow
         private set
+
     override var column: Int = LazyGridItemInfo.UnknownColumn
         private set
 
@@ -137,16 +137,18 @@
         mainAxisLayoutSize = if (isVertical) layoutHeight else layoutWidth
         val crossAxisLayoutSize = if (isVertical) layoutWidth else layoutHeight
         @Suppress("NAME_SHADOWING")
-        val crossAxisOffset = if (isVertical && layoutDirection == LayoutDirection.Rtl) {
-            crossAxisLayoutSize - crossAxisOffset - crossAxisSize
-        } else {
-            crossAxisOffset
-        }
-        offset = if (isVertical) {
-            IntOffset(crossAxisOffset, mainAxisOffset)
-        } else {
-            IntOffset(mainAxisOffset, crossAxisOffset)
-        }
+        val crossAxisOffset =
+            if (isVertical && layoutDirection == LayoutDirection.Rtl) {
+                crossAxisLayoutSize - crossAxisOffset - crossAxisSize
+            } else {
+                crossAxisOffset
+            }
+        offset =
+            if (isVertical) {
+                IntOffset(crossAxisOffset, mainAxisOffset)
+            } else {
+                IntOffset(mainAxisOffset, crossAxisOffset)
+            }
         this.row = row
         this.column = column
         minMainAxisOffset = -beforeContentPadding
@@ -154,8 +156,8 @@
     }
 
     /**
-     * Update a [mainAxisLayoutSize] when the size did change after last [position] call.
-     * Knowing the final size is important for calculating the final position in reverse layout.
+     * Update a [mainAxisLayoutSize] when the size did change after last [position] call. Knowing
+     * the final size is important for calculating the final position in reverse layout.
      */
     fun updateMainAxisLayoutSize(mainAxisLayoutSize: Int) {
         this.mainAxisLayoutSize = mainAxisLayoutSize
@@ -177,54 +179,62 @@
 
     fun place(
         scope: Placeable.PlacementScope,
-    ) = with(scope) {
-        require(mainAxisLayoutSize != Unset) { "position() should be called first" }
-        repeat(placeablesCount) { index ->
-            val placeable = placeables[index]
-            val minOffset = minMainAxisOffset - placeable.mainAxisSize
-            val maxOffset = maxMainAxisOffset
+    ) =
+        with(scope) {
+            require(mainAxisLayoutSize != Unset) { "position() should be called first" }
+            repeat(placeablesCount) { index ->
+                val placeable = placeables[index]
+                val minOffset = minMainAxisOffset - placeable.mainAxisSize
+                val maxOffset = maxMainAxisOffset
 
-            var offset = offset
-            val animation = animator.getAnimation(key, index)
-            val layer: GraphicsLayer?
-            if (animation != null) {
-                val animatedOffset = offset + animation.placementDelta
-                // cancel the animation if current and target offsets are both out of the bounds.
-                if ((offset.mainAxis <= minOffset && animatedOffset.mainAxis <= minOffset) ||
-                    (offset.mainAxis >= maxOffset && animatedOffset.mainAxis >= maxOffset)
-                ) {
-                    animation.cancelPlacementAnimation()
-                }
-                offset = animatedOffset
-                layer = animation.layer
-            } else {
-                layer = null
-            }
-            if (reverseLayout) {
-                offset = offset.copy { mainAxisOffset ->
-                    mainAxisLayoutSize - mainAxisOffset - placeable.mainAxisSize
-                }
-            }
-            offset += visualOffset
-            animation?.finalOffset = offset
-            if (isVertical) {
-                if (layer != null) {
-                    placeable.placeWithLayer(offset, layer)
+                var offset = offset
+                val animation = animator.getAnimation(key, index)
+                val layer: GraphicsLayer?
+                if (animation != null) {
+                    val animatedOffset = offset + animation.placementDelta
+                    // cancel the animation if current and target offsets are both out of the
+                    // bounds.
+                    if (
+                        (offset.mainAxis <= minOffset && animatedOffset.mainAxis <= minOffset) ||
+                            (offset.mainAxis >= maxOffset && animatedOffset.mainAxis >= maxOffset)
+                    ) {
+                        animation.cancelPlacementAnimation()
+                    }
+                    offset = animatedOffset
+                    layer = animation.layer
                 } else {
-                    placeable.placeWithLayer(offset)
+                    layer = null
                 }
-            } else {
-                if (layer != null) {
-                    placeable.placeRelativeWithLayer(offset, layer)
+                if (reverseLayout) {
+                    offset =
+                        offset.copy { mainAxisOffset ->
+                            mainAxisLayoutSize - mainAxisOffset - placeable.mainAxisSize
+                        }
+                }
+                offset += visualOffset
+                animation?.finalOffset = offset
+                if (isVertical) {
+                    if (layer != null) {
+                        placeable.placeWithLayer(offset, layer)
+                    } else {
+                        placeable.placeWithLayer(offset)
+                    }
                 } else {
-                    placeable.placeRelativeWithLayer(offset)
+                    if (layer != null) {
+                        placeable.placeRelativeWithLayer(offset, layer)
+                    } else {
+                        placeable.placeRelativeWithLayer(offset)
+                    }
                 }
             }
         }
-    }
 
-    private val IntOffset.mainAxis get() = if (isVertical) y else x
-    private val Placeable.mainAxisSize get() = if (isVertical) height else width
+    private val IntOffset.mainAxis
+        get() = if (isVertical) y else x
+
+    private val Placeable.mainAxisSize
+        get() = if (isVertical) height else width
+
     private inline fun IntOffset.copy(mainAxisMap: (Int) -> Int): IntOffset =
         IntOffset(if (isVertical) x else mainAxisMap(x), if (isVertical) mainAxisMap(y) else y)
 }
diff --git a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/grid/LazyGridMeasuredItemProvider.kt b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/grid/LazyGridMeasuredItemProvider.kt
index 1f2956d..ed50972 100644
--- a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/grid/LazyGridMeasuredItemProvider.kt
+++ b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/grid/LazyGridMeasuredItemProvider.kt
@@ -23,11 +23,11 @@
 import androidx.compose.ui.layout.Placeable
 import androidx.compose.ui.unit.Constraints
 
-/**
- * Abstracts away the subcomposition from the measuring logic.
- */
+/** Abstracts away the subcomposition from the measuring logic. */
 @OptIn(ExperimentalFoundationApi::class)
-internal abstract class LazyGridMeasuredItemProvider @ExperimentalFoundationApi constructor(
+internal abstract class LazyGridMeasuredItemProvider
+@ExperimentalFoundationApi
+constructor(
     private val itemProvider: LazyGridItemProvider,
     private val measureScope: LazyLayoutMeasureScope,
     private val defaultMainAxisSpacing: Int
@@ -47,8 +47,8 @@
         )
 
     /**
-     * Used to subcompose individual items of lazy grids. Composed placeables will be measured
-     * with the provided [constraints] and wrapped into [LazyGridMeasuredItem].
+     * Used to subcompose individual items of lazy grids. Composed placeables will be measured with
+     * the provided [constraints] and wrapped into [LazyGridMeasuredItem].
      */
     fun getAndMeasure(
         index: Int,
@@ -60,12 +60,13 @@
         val key = itemProvider.getKey(index)
         val contentType = itemProvider.getContentType(index)
         val placeables = measureScope.measure(index, constraints)
-        val crossAxisSize = if (constraints.hasFixedWidth) {
-            constraints.minWidth
-        } else {
-            require(constraints.hasFixedHeight) { "does not have fixed height" }
-            constraints.minHeight
-        }
+        val crossAxisSize =
+            if (constraints.hasFixedWidth) {
+                constraints.minWidth
+            } else {
+                require(constraints.hasFixedHeight) { "does not have fixed height" }
+                constraints.minHeight
+            }
         return createItem(
             index,
             key,
@@ -80,10 +81,11 @@
     }
 
     /**
-     * Contains the mapping between the key and the index. It could contain not all the items of
-     * the list as an optimization.
+     * Contains the mapping between the key and the index. It could contain not all the items of the
+     * list as an optimization.
      */
-    val keyIndexMap: LazyLayoutKeyIndexMap get() = itemProvider.keyIndexMap
+    val keyIndexMap: LazyLayoutKeyIndexMap
+        get() = itemProvider.keyIndexMap
 
     abstract fun createItem(
         index: Int,
diff --git a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/grid/LazyGridMeasuredLine.kt b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/grid/LazyGridMeasuredLine.kt
index c5cc322..bb1cd77 100644
--- a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/grid/LazyGridMeasuredLine.kt
+++ b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/grid/LazyGridMeasuredLine.kt
@@ -20,20 +20,17 @@
  * Represents one measured line of the lazy list. Each item on the line can in fact consist of
  * multiple placeables if the user emit multiple layout nodes in the item callback.
  */
-internal class LazyGridMeasuredLine constructor(
+internal class LazyGridMeasuredLine
+constructor(
     val index: Int,
     val items: Array<LazyGridMeasuredItem>,
     private val slots: LazyGridSlots,
     private val spans: List<GridItemSpan>,
     private val isVertical: Boolean,
-    /**
-     * Spacing to be added after [mainAxisSize], in the main axis direction.
-     */
+    /** Spacing to be added after [mainAxisSize], in the main axis direction. */
     private val mainAxisSpacing: Int,
 ) {
-    /**
-     * Main axis size of the line - the max main axis size of the items on the line.
-     */
+    /** Main axis size of the line - the max main axis size of the items on the line. */
     val mainAxisSize: Int
 
     /**
@@ -43,42 +40,34 @@
 
     init {
         var maxMainAxis = 0
-        items.forEach { item ->
-            maxMainAxis = maxOf(maxMainAxis, item.mainAxisSize)
-        }
+        items.forEach { item -> maxMainAxis = maxOf(maxMainAxis, item.mainAxisSize) }
         mainAxisSize = maxMainAxis
         mainAxisSizeWithSpacings = (maxMainAxis + mainAxisSpacing).coerceAtLeast(0)
     }
 
-    /**
-     * Whether this line contains any items.
-     */
+    /** Whether this line contains any items. */
     fun isEmpty() = items.isEmpty()
 
     /**
-     * Calculates positions for the [items] at [offset] main axis position.
-     * If [reverseOrder] is true the [items] would be placed in the inverted order.
+     * Calculates positions for the [items] at [offset] main axis position. If [reverseOrder] is
+     * true the [items] would be placed in the inverted order.
      */
-    fun position(
-        offset: Int,
-        layoutWidth: Int,
-        layoutHeight: Int
-    ): Array<LazyGridMeasuredItem> {
+    fun position(offset: Int, layoutWidth: Int, layoutHeight: Int): Array<LazyGridMeasuredItem> {
         var usedSpan = 0
         items.forEachIndexed { itemIndex, item ->
             val span = spans[itemIndex].currentLineSpan
             val startSlot = usedSpan
 
-            item.position(
-                mainAxisOffset = offset,
-                crossAxisOffset = slots.positions[startSlot],
-                layoutWidth = layoutWidth,
-                layoutHeight = layoutHeight,
-                row = if (isVertical) index else startSlot,
-                column = if (isVertical) startSlot else index
-            ).also {
-                usedSpan += span
-            }
+            item
+                .position(
+                    mainAxisOffset = offset,
+                    crossAxisOffset = slots.positions[startSlot],
+                    layoutWidth = layoutWidth,
+                    layoutHeight = layoutHeight,
+                    row = if (isVertical) index else startSlot,
+                    column = if (isVertical) startSlot else index
+                )
+                .also { usedSpan += span }
         }
         return items
     }
diff --git a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/grid/LazyGridMeasuredLineProvider.kt b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/grid/LazyGridMeasuredLineProvider.kt
index dbc4865..7ecc795 100644
--- a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/grid/LazyGridMeasuredLineProvider.kt
+++ b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/grid/LazyGridMeasuredLineProvider.kt
@@ -19,9 +19,7 @@
 import androidx.compose.foundation.lazy.layout.LazyLayoutKeyIndexMap
 import androidx.compose.ui.unit.Constraints
 
-/**
- * Abstracts away subcomposition and span calculation from the measuring logic of entire lines.
- */
+/** Abstracts away subcomposition and span calculation from the measuring logic of entire lines. */
 internal abstract class LazyGridMeasuredLineProvider(
     private val isVertical: Boolean,
     private val slots: LazyGridSlots,
@@ -32,12 +30,14 @@
 ) {
     // The constraints for cross axis size. The main axis is not restricted.
     internal fun childConstraints(startSlot: Int, span: Int): Constraints {
-        val crossAxisSize = if (span == 1) {
-            slots.sizes[startSlot]
-        } else {
-            val endSlot = startSlot + span - 1
-            slots.positions[endSlot] + slots.sizes[endSlot] - slots.positions[startSlot]
-        }.coerceAtLeast(0)
+        val crossAxisSize =
+            if (span == 1) {
+                    slots.sizes[startSlot]
+                } else {
+                    val endSlot = startSlot + span - 1
+                    slots.positions[endSlot] + slots.sizes[endSlot] - slots.positions[startSlot]
+                }
+                .coerceAtLeast(0)
         return if (isVertical) {
             Constraints.fixedWidth(crossAxisSize)
         } else {
@@ -48,8 +48,8 @@
     fun spanOf(index: Int): Int = spanLayoutProvider.spanOf(index, spanLayoutProvider.slotsPerLine)
 
     /**
-     * Used to subcompose items on lines of lazy grids. Composed placeables will be measured
-     * with the correct constraints and wrapped into [LazyGridMeasuredLine].
+     * Used to subcompose items on lines of lazy grids. Composed placeables will be measured with
+     * the correct constraints and wrapped into [LazyGridMeasuredLine].
      */
     fun getAndMeasure(lineIndex: Int): LazyGridMeasuredLine {
         val lineConfiguration = spanLayoutProvider.getLineConfiguration(lineIndex)
@@ -57,39 +57,40 @@
 
         // we add space between lines as an extra spacing for all lines apart from the last one
         // so the lazy grid measuring logic will take it into account.
-        val mainAxisSpacing = if (lineItemsCount == 0 ||
-            lineConfiguration.firstItemIndex + lineItemsCount == gridItemsCount
-        ) {
-            0
-        } else {
-            spaceBetweenLines
-        }
+        val mainAxisSpacing =
+            if (
+                lineItemsCount == 0 ||
+                    lineConfiguration.firstItemIndex + lineItemsCount == gridItemsCount
+            ) {
+                0
+            } else {
+                spaceBetweenLines
+            }
 
         var startSlot = 0
-        val items = Array(lineItemsCount) {
-            val span = lineConfiguration.spans[it].currentLineSpan
-            val constraints = childConstraints(startSlot, span)
-            measuredItemProvider.getAndMeasure(
-                index = lineConfiguration.firstItemIndex + it,
-                constraints = constraints,
-                lane = startSlot,
-                span = span,
-                mainAxisSpacing = mainAxisSpacing
-            ).also { startSlot += span }
-        }
-        return createLine(
-            lineIndex,
-            items,
-            lineConfiguration.spans,
-            mainAxisSpacing
-        )
+        val items =
+            Array(lineItemsCount) {
+                val span = lineConfiguration.spans[it].currentLineSpan
+                val constraints = childConstraints(startSlot, span)
+                measuredItemProvider
+                    .getAndMeasure(
+                        index = lineConfiguration.firstItemIndex + it,
+                        constraints = constraints,
+                        lane = startSlot,
+                        span = span,
+                        mainAxisSpacing = mainAxisSpacing
+                    )
+                    .also { startSlot += span }
+            }
+        return createLine(lineIndex, items, lineConfiguration.spans, mainAxisSpacing)
     }
 
     /**
-     * Contains the mapping between the key and the index. It could contain not all the items of
-     * the list as an optimization.
+     * Contains the mapping between the key and the index. It could contain not all the items of the
+     * list as an optimization.
      */
-    val keyIndexMap: LazyLayoutKeyIndexMap get() = measuredItemProvider.keyIndexMap
+    val keyIndexMap: LazyLayoutKeyIndexMap
+        get() = measuredItemProvider.keyIndexMap
 
     abstract fun createLine(
         index: Int,
diff --git a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/grid/LazyGridPrefetchStrategy.kt b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/grid/LazyGridPrefetchStrategy.kt
index f23a2e8..6892d55 100644
--- a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/grid/LazyGridPrefetchStrategy.kt
+++ b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/grid/LazyGridPrefetchStrategy.kt
@@ -51,8 +51,8 @@
      * If the visible items have also changed, then this will be invoked in the same frame *after*
      * [onVisibleItemsUpdated].
      *
-     * @param delta the change in scroll direction. Delta < 0 indicates scrolling down while
-     * delta > 0 indicates scrolling up.
+     * @param delta the change in scroll direction. Delta < 0 indicates scrolling down while delta >
+     *   0 indicates scrolling up.
      * @param layoutInfo the current [LazyGridLayoutInfo]
      */
     fun LazyGridPrefetchScope.onScroll(delta: Float, layoutInfo: LazyGridLayoutInfo)
@@ -61,7 +61,7 @@
      * onVisibleItemsUpdated is invoked when the LazyGrid scrolls if the visible items have changed.
      *
      * @param layoutInfo the current [LazyGridLayoutInfo]. Info about the updated visible items can
-     * be found in [LazyGridLayoutInfo.visibleItemsInfo].
+     *   be found in [LazyGridLayoutInfo.visibleItemsInfo].
      */
     fun LazyGridPrefetchScope.onVisibleItemsUpdated(layoutInfo: LazyGridLayoutInfo)
 
@@ -70,24 +70,22 @@
      * this LazyGrid. It gives this LazyGrid a chance to request prefetch for some of its own
      * children before coming onto screen.
      *
-     * Implementations can use [NestedPrefetchScope.schedulePrefetch] to schedule child
-     * prefetches. For example, this is useful if this LazyGrid is a LazyRow that is a child of a
-     * LazyColumn: in that case, [onNestedPrefetch] can schedule the children it expects to be
-     * visible when it comes onto screen, giving the LazyLayout infra a chance to compose these
-     * children ahead of time and reduce jank.
+     * Implementations can use [NestedPrefetchScope.schedulePrefetch] to schedule child prefetches.
+     * For example, this is useful if this LazyGrid is a LazyRow that is a child of a LazyColumn: in
+     * that case, [onNestedPrefetch] can schedule the children it expects to be visible when it
+     * comes onto screen, giving the LazyLayout infra a chance to compose these children ahead of
+     * time and reduce jank.
      *
      * Generally speaking, [onNestedPrefetch] should only request prefetch for children that it
      * expects to actually be visible when this grid is scrolled into view.
      *
      * @param firstVisibleItemIndex the index of the first visible item. It should be used to start
-     * prefetching from the correct index in case the grid has been created at a non-zero offset.
+     *   prefetching from the correct index in case the grid has been created at a non-zero offset.
      */
     fun NestedPrefetchScope.onNestedPrefetch(firstVisibleItemIndex: Int)
 }
 
-/**
- * Scope for callbacks in [LazyGridPrefetchStrategy] which allows prefetches to be requested.
- */
+/** Scope for callbacks in [LazyGridPrefetchStrategy] which allows prefetches to be requested. */
 @ExperimentalFoundationApi
 interface LazyGridPrefetchScope {
 
@@ -109,14 +107,13 @@
  * nested prefetch count.
  *
  * @param nestedPrefetchItemCount specifies how many inner items should be prefetched when this
- * LazyGrid is nested inside another LazyLayout. For example, if this is the state for a horizontal
- * LazyGrid nested in a vertical LazyGrid, you might want to set this to the number of items that
- * will be visible when this grid is scrolled into view.
+ *   LazyGrid is nested inside another LazyLayout. For example, if this is the state for a
+ *   horizontal LazyGrid nested in a vertical LazyGrid, you might want to set this to the number of
+ *   items that will be visible when this grid is scrolled into view.
  */
 @ExperimentalFoundationApi
-fun LazyGridPrefetchStrategy(
-    nestedPrefetchItemCount: Int = 2
-): LazyGridPrefetchStrategy = DefaultLazyGridPrefetchStrategy(nestedPrefetchItemCount)
+fun LazyGridPrefetchStrategy(nestedPrefetchItemCount: Int = 2): LazyGridPrefetchStrategy =
+    DefaultLazyGridPrefetchStrategy(nestedPrefetchItemCount)
 
 /**
  * The default prefetching strategy for LazyGrids - this will be used automatically if no other
@@ -132,15 +129,13 @@
      */
     private var lineToPrefetch = -1
 
-    /**
-     * The list of handles associated with the items from the [lineToPrefetch] line.
-     */
+    /** The list of handles associated with the items from the [lineToPrefetch] line. */
     private val currentLinePrefetchHandles =
         mutableVectorOf<LazyLayoutPrefetchState.PrefetchHandle>()
 
     /**
-     * Keeps the scrolling direction during the previous calculation in order to be able to
-     * detect the scrolling direction change.
+     * Keeps the scrolling direction during the previous calculation in order to be able to detect
+     * the scrolling direction change.
      */
     private var wasScrollingForward = false
 
@@ -150,14 +145,20 @@
             val lineToPrefetch: Int
             val closestNextItemToPrefetch: Int
             if (scrollingForward) {
-                lineToPrefetch = 1 + layoutInfo.visibleItemsInfo.last().let {
-                    if (layoutInfo.orientation == Orientation.Vertical) it.row else it.column
-                }
+                lineToPrefetch =
+                    1 +
+                        layoutInfo.visibleItemsInfo.last().let {
+                            if (layoutInfo.orientation == Orientation.Vertical) it.row
+                            else it.column
+                        }
                 closestNextItemToPrefetch = layoutInfo.visibleItemsInfo.last().index + 1
             } else {
-                lineToPrefetch = -1 + layoutInfo.visibleItemsInfo.first().let {
-                    if (layoutInfo.orientation == Orientation.Vertical) it.row else it.column
-                }
+                lineToPrefetch =
+                    -1 +
+                        layoutInfo.visibleItemsInfo.first().let {
+                            if (layoutInfo.orientation == Orientation.Vertical) it.row
+                            else it.column
+                        }
                 closestNextItemToPrefetch = layoutInfo.visibleItemsInfo.first().index - 1
             }
             if (closestNextItemToPrefetch in 0 until layoutInfo.totalItemsCount) {
@@ -178,16 +179,18 @@
                     val lastItem = layoutInfo.visibleItemsInfo.last()
                     val itemSize = lastItem.sizeOnMainAxis(layoutInfo.orientation)
                     val itemSpacing = layoutInfo.mainAxisItemSpacing
-                    val distanceToPrefetchItem = lastItem.offsetOnMainAxis(layoutInfo.orientation) +
-                        itemSize + itemSpacing - layoutInfo.viewportEndOffset
+                    val distanceToPrefetchItem =
+                        lastItem.offsetOnMainAxis(layoutInfo.orientation) + itemSize + itemSpacing -
+                            layoutInfo.viewportEndOffset
                     // if in the next frame we will get the same delta will we reach the item?
                     if (distanceToPrefetchItem < -delta) {
                         currentLinePrefetchHandles.forEach { it.markAsUrgent() }
                     }
                 } else {
                     val firstItem = layoutInfo.visibleItemsInfo.first()
-                    val distanceToPrefetchItem = layoutInfo.viewportStartOffset -
-                        firstItem.offsetOnMainAxis(layoutInfo.orientation)
+                    val distanceToPrefetchItem =
+                        layoutInfo.viewportStartOffset -
+                            firstItem.offsetOnMainAxis(layoutInfo.orientation)
                     // if in the next frame we will get the same delta will we reach the item?
                     if (distanceToPrefetchItem < delta) {
                         currentLinePrefetchHandles.forEach { it.markAsUrgent() }
@@ -199,15 +202,16 @@
 
     override fun LazyGridPrefetchScope.onVisibleItemsUpdated(layoutInfo: LazyGridLayoutInfo) {
         if (lineToPrefetch != -1 && layoutInfo.visibleItemsInfo.isNotEmpty()) {
-            val expectedLineToPrefetch = if (wasScrollingForward) {
-                layoutInfo.visibleItemsInfo.last().let {
-                    if (layoutInfo.orientation == Orientation.Vertical) it.row else it.column
-                } + 1
-            } else {
-                layoutInfo.visibleItemsInfo.first().let {
-                    if (layoutInfo.orientation == Orientation.Vertical) it.row else it.column
-                } - 1
-            }
+            val expectedLineToPrefetch =
+                if (wasScrollingForward) {
+                    layoutInfo.visibleItemsInfo.last().let {
+                        if (layoutInfo.orientation == Orientation.Vertical) it.row else it.column
+                    } + 1
+                } else {
+                    layoutInfo.visibleItemsInfo.first().let {
+                        if (layoutInfo.orientation == Orientation.Vertical) it.row else it.column
+                    } - 1
+                }
             if (lineToPrefetch != expectedLineToPrefetch) {
                 lineToPrefetch = -1
                 currentLinePrefetchHandles.forEach { it.cancel() }
@@ -217,8 +221,6 @@
     }
 
     override fun NestedPrefetchScope.onNestedPrefetch(firstVisibleItemIndex: Int) {
-        repeat(nestedPrefetchItemCount) { i ->
-            schedulePrefetch(firstVisibleItemIndex + i)
-        }
+        repeat(nestedPrefetchItemCount) { i -> schedulePrefetch(firstVisibleItemIndex + i) }
     }
 }
diff --git a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/grid/LazyGridScopeMarker.kt b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/grid/LazyGridScopeMarker.kt
index 11f5559..da566c8 100644
--- a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/grid/LazyGridScopeMarker.kt
+++ b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/grid/LazyGridScopeMarker.kt
@@ -16,8 +16,5 @@
 
 package androidx.compose.foundation.lazy.grid
 
-/**
- * DSL marker used to distinguish between lazy grid dsl scope and the item content scope.
- */
-@DslMarker
-annotation class LazyGridScopeMarker
+/** DSL marker used to distinguish between lazy grid dsl scope and the item content scope. */
+@DslMarker annotation class LazyGridScopeMarker
diff --git a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/grid/LazyGridScrollPosition.kt b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/grid/LazyGridScrollPosition.kt
index 250d956..bf35118 100644
--- a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/grid/LazyGridScrollPosition.kt
+++ b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/grid/LazyGridScrollPosition.kt
@@ -28,10 +28,7 @@
  * visible item scroll offset.
  */
 @OptIn(ExperimentalFoundationApi::class)
-internal class LazyGridScrollPosition(
-    initialIndex: Int = 0,
-    initialScrollOffset: Int = 0
-) {
+internal class LazyGridScrollPosition(initialIndex: Int = 0, initialScrollOffset: Int = 0) {
     var index by mutableIntStateOf(initialIndex)
         private set
 
@@ -43,15 +40,14 @@
     /** The last known key of the first item at [index] line. */
     private var lastKnownFirstItemKey: Any? = null
 
-    val nearestRangeState = LazyLayoutNearestRangeState(
-        initialIndex,
-        NearestItemsSlidingWindowSize,
-        NearestItemsExtraItemCount
-    )
+    val nearestRangeState =
+        LazyLayoutNearestRangeState(
+            initialIndex,
+            NearestItemsSlidingWindowSize,
+            NearestItemsExtraItemCount
+        )
 
-    /**
-     * Updates the current scroll position based on the results of the last measurement.
-     */
+    /** Updates the current scroll position based on the results of the last measurement. */
     fun updateFromMeasureResult(measureResult: LazyGridMeasureResult) {
         lastKnownFirstItemKey = measureResult.firstVisibleLine?.items?.firstOrNull()?.key
         // we ignore the index and offset from measureResult until we get at least one
@@ -74,14 +70,13 @@
 
     /**
      * Updates the scroll position - the passed values will be used as a start position for
-     * composing the items during the next measure pass and will be updated by the real
-     * position calculated during the measurement. This means that there is guarantee that
-     * exactly this index and offset will be applied as it is possible that:
-     * a) there will be no item at this index in reality
-     * b) item at this index will be smaller than the asked scrollOffset, which means we would
-     * switch to the next item
-     * c) there will be not enough items to fill the viewport after the requested index, so we
-     * would have to compose few elements before the asked index, changing the first visible item.
+     * composing the items during the next measure pass and will be updated by the real position
+     * calculated during the measurement. This means that there is guarantee that exactly this index
+     * and offset will be applied as it is possible that: a) there will be no item at this index in
+     * reality b) item at this index will be smaller than the asked scrollOffset, which means we
+     * would switch to the next item c) there will be not enough items to fill the viewport after
+     * the requested index, so we would have to compose few elements before the asked index,
+     * changing the first visible item.
      */
     fun requestPositionAndForgetLastKnownKey(index: Int, scrollOffset: Int) {
         update(index, scrollOffset)
@@ -91,10 +86,10 @@
     }
 
     /**
-     * In addition to keeping the first visible item index we also store the key of this item.
-     * When the user provided custom keys for the items this mechanism allows us to detect when
-     * there were items added or removed before our current first visible item and keep this item
-     * as the first visible one even given that its index has been changed.
+     * In addition to keeping the first visible item index we also store the key of this item. When
+     * the user provided custom keys for the items this mechanism allows us to detect when there
+     * were items added or removed before our current first visible item and keep this item as the
+     * first visible one even given that its index has been changed.
      */
     fun updateScrollPositionIfTheFirstItemWasMoved(
         itemProvider: LazyGridItemProvider,
@@ -122,7 +117,5 @@
  */
 private const val NearestItemsSlidingWindowSize = 90
 
-/**
- * The minimum amount of items near the current first visible item we want to have mapping for.
- */
+/** The minimum amount of items near the current first visible item we want to have mapping for. */
 private const val NearestItemsExtraItemCount = 200
diff --git a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/grid/LazyGridSpan.kt b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/grid/LazyGridSpan.kt
index a032669..648f756 100644
--- a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/grid/LazyGridSpan.kt
+++ b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/grid/LazyGridSpan.kt
@@ -19,9 +19,7 @@
 import androidx.annotation.IntRange
 import androidx.compose.runtime.Immutable
 
-/**
- * Represents the span of an item in a [LazyVerticalGrid] or a [LazyHorizontalGrid].
- */
+/** Represents the span of an item in a [LazyVerticalGrid] or a [LazyHorizontalGrid]. */
 @Immutable
 @kotlin.jvm.JvmInline
 value class GridItemSpan internal constructor(private val packedValue: Long) {
@@ -29,26 +27,25 @@
      * The span of the item on the current line. This will be the horizontal span for items of
      * [LazyVerticalGrid] and the vertical span for a [LazyHorizontalGrid].
      */
-    val currentLineSpan: Int get() = packedValue.toInt()
+    val currentLineSpan: Int
+        get() = packedValue.toInt()
 }
 
 /**
- * Creates a [GridItemSpan] with a specified [currentLineSpan]. This will be the horizontal span
- * for an item of a [LazyVerticalGrid] and the vertical span for a [LazyHorizontalGrid].
+ * Creates a [GridItemSpan] with a specified [currentLineSpan]. This will be the horizontal span for
+ * an item of a [LazyVerticalGrid] and the vertical span for a [LazyHorizontalGrid].
  */
 fun GridItemSpan(@IntRange(from = 1) currentLineSpan: Int): GridItemSpan {
     require(currentLineSpan > 0) { "The span value should be higher than 0" }
     return GridItemSpan(currentLineSpan.toLong())
 }
 
-/**
- * Scope of lambdas used to calculate the spans of items in lazy grids.
- */
+/** Scope of lambdas used to calculate the spans of items in lazy grids. */
 @LazyGridScopeMarker
 sealed interface LazyGridItemSpanScope {
     /**
-     * The max current line (horizontal for vertical grids) the item can occupy, such that
-     * it will be positioned on the current line.
+     * The max current line (horizontal for vertical grids) the item can occupy, such that it will
+     * be positioned on the current line.
      *
      * For example if [LazyVerticalGrid] has 3 columns this value will be 3 for the first cell in
      * the line, 2 for the second cell, and 1 for the last one. If you return a span count larger
@@ -58,8 +55,8 @@
     val maxCurrentLineSpan: Int
 
     /**
-     * The max line span (horizontal for vertical grids) an item can occupy. This will be the
-     * number of columns in vertical grids or the number of rows in horizontal grids.
+     * The max line span (horizontal for vertical grids) an item can occupy. This will be the number
+     * of columns in vertical grids or the number of rows in horizontal grids.
      *
      * For example if [LazyVerticalGrid] has 3 columns this value will be 3 for each cell.
      */
diff --git a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/grid/LazyGridSpanLayoutProvider.kt b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/grid/LazyGridSpanLayoutProvider.kt
index 382a40e..ea8a645 100644
--- a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/grid/LazyGridSpanLayoutProvider.kt
+++ b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/grid/LazyGridSpanLayoutProvider.kt
@@ -27,12 +27,14 @@
     /** Caches the bucket info on lines 0, [bucketSize], 2 * [bucketSize], etc. */
     private val buckets = ArrayList<Bucket>().apply { add(Bucket(0)) }
     /**
-     * The interval at each we will store the starting element of lines. These will be then
-     * used to calculate the layout of arbitrary lines, by starting from the closest
-     * known "bucket start". The smaller the bucketSize, the smaller cost for calculating layout
-     * of arbitrary lines but the higher memory usage for [buckets].
+     * The interval at each we will store the starting element of lines. These will be then used to
+     * calculate the layout of arbitrary lines, by starting from the closest known "bucket start".
+     * The smaller the bucketSize, the smaller cost for calculating layout of arbitrary lines but
+     * the higher memory usage for [buckets].
      */
-    private val bucketSize get() = sqrt(1.0 * totalSize / slotsPerLine).toInt() + 1
+    private val bucketSize
+        get() = sqrt(1.0 * totalSize / slotsPerLine).toInt() + 1
+
     /** Caches the last calculated line index, useful when scrolling in main axis direction. */
     private var lastLineIndex = 0
     /** Caches the starting item index on [lastLineIndex]. */
@@ -40,8 +42,8 @@
     /** Caches the span of [lastLineStartItemIndex], if this was already calculated. */
     private var lastLineStartKnownSpan = 0
     /**
-     * Caches a calculated bucket, this is useful when scrolling in reverse main axis
-     * direction. We cannot only keep the last element, as we would not know previous max span.
+     * Caches a calculated bucket, this is useful when scrolling in reverse main axis direction. We
+     * cannot only keep the last element, as we would not know previous max span.
      */
     private var cachedBucketIndex = -1
     /**
@@ -49,10 +51,9 @@
      * direction. We cannot only keep the last element, as we would not know previous max span.
      */
     private val cachedBucket = mutableListOf<Int>()
-    /**
-     * List of 1x1 spans if we do not have custom spans.
-     */
+    /** List of 1x1 spans if we do not have custom spans. */
     private var previousDefaultSpans = emptyList<GridItemSpan>()
+
     private fun getDefaultSpans(currentSlotsPerLine: Int) =
         if (currentSlotsPerLine == previousDefaultSpans.size) {
             previousDefaultSpans
@@ -60,7 +61,8 @@
             List(currentSlotsPerLine) { GridItemSpan(1) }.also { previousDefaultSpans = it }
         }
 
-    val totalSize get() = gridContent.intervals.size
+    val totalSize
+        get() = gridContent.intervals.size
 
     /** The number of slots on one grid line e.g. the number of columns of a vertical grid. */
     var slotsPerLine = 0
@@ -77,8 +79,9 @@
             val firstItemIndex = lineIndex * slotsPerLine
             return LineConfiguration(
                 firstItemIndex,
-                getDefaultSpans(slotsPerLine.coerceAtMost(totalSize - firstItemIndex)
-                    .coerceAtLeast(0))
+                getDefaultSpans(
+                    slotsPerLine.coerceAtMost(totalSize - firstItemIndex).coerceAtLeast(0)
+                )
             )
         }
 
@@ -93,8 +96,8 @@
             currentLine = lastLineIndex
             currentItemIndex = lastLineStartItemIndex
             knownCurrentItemSpan = lastLineStartKnownSpan
-        } else if (bucketIndex == cachedBucketIndex &&
-            lineIndex - currentLine < cachedBucket.size
+        } else if (
+            bucketIndex == cachedBucketIndex && lineIndex - currentLine < cachedBucket.size
         ) {
             // It happens that the needed line start is fully cached. Common when scrolling in
             // reverse main axis, as we decided to cacheThisBucket previously.
@@ -103,8 +106,8 @@
             knownCurrentItemSpan = 0
         }
 
-        val cacheThisBucket = currentLine % bucketSize == 0 &&
-            lineIndex - currentLine in 2 until bucketSize
+        val cacheThisBucket =
+            currentLine % bucketSize == 0 && lineIndex - currentLine in 2 until bucketSize
         if (cacheThisBucket) {
             cachedBucketIndex = bucketIndex
             cachedBucket.clear()
@@ -119,11 +122,12 @@
 
             var spansUsed = 0
             while (spansUsed < slotsPerLine && currentItemIndex < totalSize) {
-                val span = if (knownCurrentItemSpan == 0) {
-                    spanOf(currentItemIndex, slotsPerLine - spansUsed)
-                } else {
-                    knownCurrentItemSpan.also { knownCurrentItemSpan = 0 }
-                }
+                val span =
+                    if (knownCurrentItemSpan == 0) {
+                        spanOf(currentItemIndex, slotsPerLine - spansUsed)
+                    } else {
+                        knownCurrentItemSpan.also { knownCurrentItemSpan = 0 }
+                    }
                 if (spansUsed + span > slotsPerLine) {
                     knownCurrentItemSpan = span
                     break
@@ -150,11 +154,12 @@
 
         var spansUsed = 0
         while (spansUsed < slotsPerLine && currentItemIndex < totalSize) {
-            val span = if (knownCurrentItemSpan == 0) {
-                spanOf(currentItemIndex, slotsPerLine - spansUsed)
-            } else {
-                knownCurrentItemSpan.also { knownCurrentItemSpan = 0 }
-            }
+            val span =
+                if (knownCurrentItemSpan == 0) {
+                    spanOf(currentItemIndex, slotsPerLine - spansUsed)
+                } else {
+                    knownCurrentItemSpan.also { knownCurrentItemSpan = 0 }
+                }
             if (spansUsed + span > slotsPerLine) break
 
             currentItemIndex++
@@ -164,9 +169,7 @@
         return LineConfiguration(firstItemIndex, spans)
     }
 
-    /**
-     * Calculate the line of index [itemIndex].
-     */
+    /** Calculate the line of index [itemIndex]. */
     fun getLineIndexOfItem(itemIndex: Int): Int {
         if (totalSize <= 0) {
             return 0
@@ -176,9 +179,10 @@
             return itemIndex / slotsPerLine
         }
 
-        val lowerBoundBucket = buckets.binarySearch { it.firstItemIndex - itemIndex }.let {
-            if (it >= 0) it else -it - 2
-        }
+        val lowerBoundBucket =
+            buckets
+                .binarySearch { it.firstItemIndex - itemIndex }
+                .let { if (it >= 0) it else -it - 2 }
         var currentLine = lowerBoundBucket * bucketSize
         var currentItemIndex = buckets[lowerBoundBucket].firstItemIndex
 
diff --git a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/grid/LazyGridState.kt b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/grid/LazyGridState.kt
index 00f5405..df763ac 100644
--- a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/grid/LazyGridState.kt
+++ b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/grid/LazyGridState.kt
@@ -63,7 +63,7 @@
  *
  * @param initialFirstVisibleItemIndex the initial value for [LazyGridState.firstVisibleItemIndex]
  * @param initialFirstVisibleItemScrollOffset the initial value for
- * [LazyGridState.firstVisibleItemScrollOffset]
+ *   [LazyGridState.firstVisibleItemScrollOffset]
  */
 @Composable
 fun rememberLazyGridState(
@@ -71,10 +71,7 @@
     initialFirstVisibleItemScrollOffset: Int = 0
 ): LazyGridState {
     return rememberSaveable(saver = LazyGridState.Saver) {
-        LazyGridState(
-            initialFirstVisibleItemIndex,
-            initialFirstVisibleItemScrollOffset
-        )
+        LazyGridState(initialFirstVisibleItemIndex, initialFirstVisibleItemScrollOffset)
     }
 }
 
@@ -86,9 +83,9 @@
  *
  * @param initialFirstVisibleItemIndex the initial value for [LazyGridState.firstVisibleItemIndex]
  * @param initialFirstVisibleItemScrollOffset the initial value for
- * [LazyGridState.firstVisibleItemScrollOffset]
+ *   [LazyGridState.firstVisibleItemScrollOffset]
  * @param prefetchStrategy the [LazyGridPrefetchStrategy] to use for prefetching content in this
- * grid
+ *   grid
  */
 @ExperimentalFoundationApi
 @Composable
@@ -113,13 +110,15 @@
  *
  * @param firstVisibleItemIndex the initial value for [LazyGridState.firstVisibleItemIndex]
  * @param firstVisibleItemScrollOffset the initial value for
- * [LazyGridState.firstVisibleItemScrollOffset]
+ *   [LazyGridState.firstVisibleItemScrollOffset]
  * @param prefetchStrategy the [LazyGridPrefetchStrategy] to use for prefetching content in this
- * grid
+ *   grid
  */
 @OptIn(ExperimentalFoundationApi::class)
 @Stable
-class LazyGridState @ExperimentalFoundationApi constructor(
+class LazyGridState
+@ExperimentalFoundationApi
+constructor(
     firstVisibleItemIndex: Int = 0,
     firstVisibleItemScrollOffset: Int = 0,
     private val prefetchStrategy: LazyGridPrefetchStrategy = LazyGridPrefetchStrategy(),
@@ -128,98 +127,98 @@
     /**
      * @param firstVisibleItemIndex the initial value for [LazyGridState.firstVisibleItemIndex]
      * @param firstVisibleItemScrollOffset the initial value for
-     * [LazyGridState.firstVisibleItemScrollOffset]
+     *   [LazyGridState.firstVisibleItemScrollOffset]
      */
     constructor(
         firstVisibleItemIndex: Int = 0,
         firstVisibleItemScrollOffset: Int = 0
     ) : this(firstVisibleItemIndex, firstVisibleItemScrollOffset, LazyGridPrefetchStrategy())
 
-    /**
-     * The holder class for the current scroll position.
-     */
+    /** The holder class for the current scroll position. */
     private val scrollPosition =
         LazyGridScrollPosition(firstVisibleItemIndex, firstVisibleItemScrollOffset)
 
     /**
      * The index of the first item that is visible.
      *
-     * Note that this property is observable and if you use it in the composable function it will
-     * be recomposed on every change causing potential performance issues.
+     * Note that this property is observable and if you use it in the composable function it will be
+     * recomposed on every change causing potential performance issues.
      *
      * If you want to run some side effects like sending an analytics event or updating a state
      * based on this value consider using "snapshotFlow":
+     *
      * @sample androidx.compose.foundation.samples.UsingGridScrollPositionForSideEffectSample
      *
      * If you need to use it in the composition then consider wrapping the calculation into a
      * derived state in order to only have recompositions when the derived value changes:
+     *
      * @sample androidx.compose.foundation.samples.UsingGridScrollPositionInCompositionSample
      */
-    val firstVisibleItemIndex: Int get() = scrollPosition.index
+    val firstVisibleItemIndex: Int
+        get() = scrollPosition.index
 
     /**
-     * The scroll offset of the first visible item. Scrolling forward is positive - i.e., the
-     * amount that the item is offset backwards
+     * The scroll offset of the first visible item. Scrolling forward is positive - i.e., the amount
+     * that the item is offset backwards
      */
-    val firstVisibleItemScrollOffset: Int get() = scrollPosition.scrollOffset
+    val firstVisibleItemScrollOffset: Int
+        get() = scrollPosition.scrollOffset
 
     /** Backing state for [layoutInfo] */
-    private val layoutInfoState = mutableStateOf(
-        EmptyLazyGridLayoutInfo,
-        neverEqualPolicy()
-    )
+    private val layoutInfoState = mutableStateOf(EmptyLazyGridLayoutInfo, neverEqualPolicy())
 
     /**
-     * The object of [LazyGridLayoutInfo] calculated during the last layout pass. For example,
-     * you can use it to calculate what items are currently visible.
+     * The object of [LazyGridLayoutInfo] calculated during the last layout pass. For example, you
+     * can use it to calculate what items are currently visible.
      *
-     * Note that this property is observable and is updated after every scroll or remeasure.
-     * If you use it in the composable function it will be recomposed on every change causing
-     * potential performance issues including infinity recomposition loop.
-     * Therefore, avoid using it in the composition.
+     * Note that this property is observable and is updated after every scroll or remeasure. If you
+     * use it in the composable function it will be recomposed on every change causing potential
+     * performance issues including infinity recomposition loop. Therefore, avoid using it in the
+     * composition.
      *
      * If you want to run some side effects like sending an analytics event or updating a state
      * based on this value consider using "snapshotFlow":
+     *
      * @sample androidx.compose.foundation.samples.UsingGridLayoutInfoForSideEffectSample
      */
-    val layoutInfo: LazyGridLayoutInfo get() = layoutInfoState.value
+    val layoutInfo: LazyGridLayoutInfo
+        get() = layoutInfoState.value
 
     /**
-     * [InteractionSource] that will be used to dispatch drag events when this
-     * grid is being dragged. If you want to know whether the fling (or animated scroll) is in
-     * progress, use [isScrollInProgress].
+     * [InteractionSource] that will be used to dispatch drag events when this grid is being
+     * dragged. If you want to know whether the fling (or animated scroll) is in progress, use
+     * [isScrollInProgress].
      */
-    val interactionSource: InteractionSource get() = internalInteractionSource
+    val interactionSource: InteractionSource
+        get() = internalInteractionSource
 
     internal val internalInteractionSource: MutableInteractionSource = MutableInteractionSource()
 
     /**
-     * The amount of scroll to be consumed in the next layout pass.  Scrolling forward is negative
+     * The amount of scroll to be consumed in the next layout pass. Scrolling forward is negative
      * - that is, it is the amount that the items are offset in y
      */
     internal var scrollToBeConsumed = 0f
         private set
 
-    internal val slotsPerLine: Int get() = layoutInfoState.value.slotsPerLine
+    internal val slotsPerLine: Int
+        get() = layoutInfoState.value.slotsPerLine
 
-    internal val density: Density get() = layoutInfoState.value.density
+    internal val density: Density
+        get() = layoutInfoState.value.density
 
     /**
-     * The ScrollableController instance. We keep it as we need to call stopAnimation on it once
-     * we reached the end of the grid.
+     * The ScrollableController instance. We keep it as we need to call stopAnimation on it once we
+     * reached the end of the grid.
      */
     private val scrollableState = ScrollableState { -onScroll(-it) }
 
-    /**
-     * Only used for testing to confirm that we're not making too many measure passes
-     */
+    /** Only used for testing to confirm that we're not making too many measure passes */
     /*@VisibleForTesting*/
     internal var numMeasurePasses: Int = 0
         private set
 
-    /**
-     * Only used for testing to disable prefetching when needed to test the main logic.
-     */
+    /** Only used for testing to disable prefetching when needed to test the main logic. */
     /*@VisibleForTesting*/
     internal var prefetchingEnabled: Boolean = true
 
@@ -230,18 +229,17 @@
     internal var remeasurement: Remeasurement? = null
         private set
 
-    /**
-     * The modifier which provides [remeasurement].
-     */
-    internal val remeasurementModifier = object : RemeasurementModifier {
-        override fun onRemeasurementAvailable(remeasurement: Remeasurement) {
-            this@LazyGridState.remeasurement = remeasurement
+    /** The modifier which provides [remeasurement]. */
+    internal val remeasurementModifier =
+        object : RemeasurementModifier {
+            override fun onRemeasurementAvailable(remeasurement: Remeasurement) {
+                this@LazyGridState.remeasurement = remeasurement
+            }
         }
-    }
 
     /**
-     * Provides a modifier which allows to delay some interactions (e.g. scroll)
-     * until layout is ready.
+     * Provides a modifier which allows to delay some interactions (e.g. scroll) until layout is
+     * ready.
      */
     internal val awaitLayoutModifier = AwaitFirstLayoutModifier()
 
@@ -249,34 +247,34 @@
 
     internal val beyondBoundsInfo = LazyLayoutBeyondBoundsInfo()
 
-    internal val prefetchState = LazyLayoutPrefetchState(prefetchStrategy.prefetchScheduler) {
-        with(prefetchStrategy) {
-            onNestedPrefetch(Snapshot.withoutReadObservation { firstVisibleItemIndex })
-        }
-    }
-
-    private val prefetchScope: LazyGridPrefetchScope = object : LazyGridPrefetchScope {
-        override fun scheduleLinePrefetch(
-            lineIndex: Int
-        ): List<LazyLayoutPrefetchState.PrefetchHandle> {
-            // Without read observation since this can be triggered from scroll - this will then
-            // cause us to recompose when the measure result changes. We don't care since the
-            // prefetch is best effort.
-            val prefetchHandles = mutableListOf<LazyLayoutPrefetchState.PrefetchHandle>()
-            Snapshot.withoutReadObservation {
-                layoutInfoState.value.prefetchInfoRetriever(lineIndex).fastForEach {
-                    prefetchHandles.add(prefetchState.schedulePrefetch(it.first, it.second))
-                }
+    internal val prefetchState =
+        LazyLayoutPrefetchState(prefetchStrategy.prefetchScheduler) {
+            with(prefetchStrategy) {
+                onNestedPrefetch(Snapshot.withoutReadObservation { firstVisibleItemIndex })
             }
-            return prefetchHandles
         }
-    }
+
+    private val prefetchScope: LazyGridPrefetchScope =
+        object : LazyGridPrefetchScope {
+            override fun scheduleLinePrefetch(
+                lineIndex: Int
+            ): List<LazyLayoutPrefetchState.PrefetchHandle> {
+                // Without read observation since this can be triggered from scroll - this will then
+                // cause us to recompose when the measure result changes. We don't care since the
+                // prefetch is best effort.
+                val prefetchHandles = mutableListOf<LazyLayoutPrefetchState.PrefetchHandle>()
+                Snapshot.withoutReadObservation {
+                    layoutInfoState.value.prefetchInfoRetriever(lineIndex).fastForEach {
+                        prefetchHandles.add(prefetchState.schedulePrefetch(it.first, it.second))
+                    }
+                }
+                return prefetchHandles
+            }
+        }
 
     private val animateScrollScope = LazyGridAnimateScrollScope(this)
 
-    /**
-     * Stores currently pinned items which are always composed.
-     */
+    /** Stores currently pinned items which are always composed. */
     internal val pinnedItems = LazyLayoutPinnedItemList()
 
     internal val nearestRange: IntRange by scrollPosition.nearestRangeState
@@ -289,54 +287,42 @@
      *
      * @param index the index to which to scroll. Must be non-negative.
      * @param scrollOffset the offset that the item should end up after the scroll. Note that
-     * positive offset refers to forward scroll, so in a top-to-bottom list, positive offset will
-     * scroll the item further upward (taking it partly offscreen).
+     *   positive offset refers to forward scroll, so in a top-to-bottom list, positive offset will
+     *   scroll the item further upward (taking it partly offscreen).
      */
-    suspend fun scrollToItem(
-        @AndroidXIntRange(from = 0)
-        index: Int,
-        scrollOffset: Int = 0
-    ) {
-        scroll {
-            snapToItemIndexInternal(index, scrollOffset, forceRemeasure = true)
-        }
+    suspend fun scrollToItem(@AndroidXIntRange(from = 0) index: Int, scrollOffset: Int = 0) {
+        scroll { snapToItemIndexInternal(index, scrollOffset, forceRemeasure = true) }
     }
 
     internal val measurementScopeInvalidator = ObservableScopeInvalidator()
 
     /**
-     * Requests the item at [index] to be at the start of the viewport during the next
-     * remeasure, offset by [scrollOffset], and schedules a remeasure.
+     * Requests the item at [index] to be at the start of the viewport during the next remeasure,
+     * offset by [scrollOffset], and schedules a remeasure.
      *
-     * The scroll position will be updated to the requested position rather than maintain
-     * the index based on the first visible item key (when a data set change will also be
-     * applied during the next remeasure), but *only* for the next remeasure.
+     * The scroll position will be updated to the requested position rather than maintain the index
+     * based on the first visible item key (when a data set change will also be applied during the
+     * next remeasure), but *only* for the next remeasure.
      *
      * Any scroll in progress will be cancelled.
      *
      * @param index the index to which to scroll. Must be non-negative.
      * @param scrollOffset the offset that the item should end up after the scroll. Note that
-     * positive offset refers to forward scroll, so in a top-to-bottom list, positive offset will
-     * scroll the item further upward (taking it partly offscreen).
+     *   positive offset refers to forward scroll, so in a top-to-bottom list, positive offset will
+     *   scroll the item further upward (taking it partly offscreen).
      */
-    fun requestScrollToItem(
-        @AndroidXIntRange(from = 0)
-        index: Int,
-        scrollOffset: Int = 0
-    ) {
+    fun requestScrollToItem(@AndroidXIntRange(from = 0) index: Int, scrollOffset: Int = 0) {
         // Cancel any scroll in progress.
         if (isScrollInProgress) {
-            layoutInfoState.value.coroutineScope.launch {
-                stopScroll()
-            }
+            layoutInfoState.value.coroutineScope.launch { stopScroll() }
         }
 
         snapToItemIndexInternal(index, scrollOffset, forceRemeasure = false)
     }
 
     internal fun snapToItemIndexInternal(index: Int, scrollOffset: Int, forceRemeasure: Boolean) {
-        val positionChanged = scrollPosition.index != index ||
-            scrollPosition.scrollOffset != scrollOffset
+        val positionChanged =
+            scrollPosition.index != index || scrollPosition.scrollOffset != scrollOffset
         // sometimes this method is called not to scroll, but to stay on the same index when
         // the data changes, as by default we maintain the scroll position by key, not index.
         // when this happens we don't need to reset the animations as from the user perspective
@@ -355,11 +341,12 @@
             measurementScopeInvalidator.invalidateScope()
         }
     }
+
     /**
      * Call this function to take control of scrolling and gain the ability to send scroll events
      * via [ScrollScope.scrollBy]. All actions that change the logical scroll position must be
-     * performed within a [scroll] block (even if they don't call any other methods on this
-     * object) in order to guarantee that mutual exclusion is enforced.
+     * performed within a [scroll] block (even if they don't call any other methods on this object)
+     * in order to guarantee that mutual exclusion is enforced.
      *
      * If [scroll] is called from elsewhere, this will be canceled.
      */
@@ -371,20 +358,21 @@
         scrollableState.scroll(scrollPriority, block)
     }
 
-    override fun dispatchRawDelta(delta: Float): Float =
-        scrollableState.dispatchRawDelta(delta)
+    override fun dispatchRawDelta(delta: Float): Float = scrollableState.dispatchRawDelta(delta)
 
     override val isScrollInProgress: Boolean
         get() = scrollableState.isScrollInProgress
 
     override var canScrollForward: Boolean by mutableStateOf(false)
         private set
+
     override var canScrollBackward: Boolean by mutableStateOf(false)
         private set
 
     @get:Suppress("GetterSetterNames")
     override val lastScrolledForward: Boolean
         get() = scrollableState.lastScrolledForward
+
     @get:Suppress("GetterSetterNames")
     override val lastScrolledBackward: Boolean
         get() = scrollableState.lastScrolledBackward
@@ -409,20 +397,14 @@
             val preScrollToBeConsumed = scrollToBeConsumed
             val intDelta = scrollToBeConsumed.roundToInt()
             if (layoutInfo.tryToApplyScrollWithoutRemeasure(intDelta)) {
-                applyMeasureResult(
-                    result = layoutInfo,
-                    visibleItemsStayedTheSame = true
-                )
+                applyMeasureResult(result = layoutInfo, visibleItemsStayedTheSame = true)
                 // we don't need to remeasure, so we only trigger re-placement:
                 placementScopeInvalidator.invalidateScope()
 
                 notifyPrefetchOnScroll(preScrollToBeConsumed - scrollToBeConsumed, layoutInfo)
             } else {
                 remeasurement?.forceRemeasure()
-                notifyPrefetchOnScroll(
-                    preScrollToBeConsumed - scrollToBeConsumed,
-                    this.layoutInfo
-                )
+                notifyPrefetchOnScroll(preScrollToBeConsumed - scrollToBeConsumed, this.layoutInfo)
             }
         }
 
@@ -442,33 +424,26 @@
 
     private fun notifyPrefetchOnScroll(delta: Float, layoutInfo: LazyGridLayoutInfo) {
         if (prefetchingEnabled) {
-           with(prefetchStrategy) {
-               prefetchScope.onScroll(delta, layoutInfo)
-           }
+            with(prefetchStrategy) { prefetchScope.onScroll(delta, layoutInfo) }
         }
     }
 
-    private val numOfItemsToTeleport: Int get() = 100 * slotsPerLine
+    private val numOfItemsToTeleport: Int
+        get() = 100 * slotsPerLine
 
     /**
      * Animate (smooth scroll) to the given item.
      *
      * @param index the index to which to scroll. Must be non-negative.
      * @param scrollOffset the offset that the item should end up after the scroll. Note that
-     * positive offset refers to forward scroll, so in a top-to-bottom list, positive offset will
-     * scroll the item further upward (taking it partly offscreen).
+     *   positive offset refers to forward scroll, so in a top-to-bottom list, positive offset will
+     *   scroll the item further upward (taking it partly offscreen).
      */
-    suspend fun animateScrollToItem(
-        @AndroidXIntRange(from = 0)
-        index: Int,
-        scrollOffset: Int = 0
-    ) {
+    suspend fun animateScrollToItem(@AndroidXIntRange(from = 0) index: Int, scrollOffset: Int = 0) {
         animateScrollScope.animateScrollToItem(index, scrollOffset, numOfItemsToTeleport, density)
     }
 
-    /**
-     *  Updates the state with the new calculated scroll position and consumed scroll.
-     */
+    /** Updates the state with the new calculated scroll position and consumed scroll. */
     internal fun applyMeasureResult(
         result: LazyGridMeasureResult,
         visibleItemsStayedTheSame: Boolean = false
@@ -484,9 +459,7 @@
         } else {
             scrollPosition.updateFromMeasureResult(result)
             if (prefetchingEnabled) {
-                with(prefetchStrategy) {
-                    prefetchScope.onVisibleItemsUpdated(result)
-                }
+                with(prefetchStrategy) { prefetchScope.onVisibleItemsUpdated(result) }
             }
         }
 
@@ -494,9 +467,9 @@
     }
 
     /**
-     * When the user provided custom keys for the items we can try to detect when there were
-     * items added or removed before our current first visible item and keep this item
-     * as the first visible one even given that its index has been changed.
+     * When the user provided custom keys for the items we can try to detect when there were items
+     * added or removed before our current first visible item and keep this item as the first
+     * visible one even given that its index has been changed.
      */
     internal fun updateScrollPositionIfTheFirstItemWasMoved(
         itemProvider: LazyGridItemProvider,
@@ -504,18 +477,17 @@
     ): Int = scrollPosition.updateScrollPositionIfTheFirstItemWasMoved(itemProvider, firstItemIndex)
 
     companion object {
-        /**
-         * The default [Saver] implementation for [LazyGridState].
-         */
-        val Saver: Saver<LazyGridState, *> = listSaver(
-            save = { listOf(it.firstVisibleItemIndex, it.firstVisibleItemScrollOffset) },
-            restore = {
-                LazyGridState(
-                    firstVisibleItemIndex = it[0],
-                    firstVisibleItemScrollOffset = it[1]
-                )
-            }
-        )
+        /** The default [Saver] implementation for [LazyGridState]. */
+        val Saver: Saver<LazyGridState, *> =
+            listSaver(
+                save = { listOf(it.firstVisibleItemIndex, it.firstVisibleItemScrollOffset) },
+                restore = {
+                    LazyGridState(
+                        firstVisibleItemIndex = it[0],
+                        firstVisibleItemScrollOffset = it[1]
+                    )
+                }
+            )
 
         /**
          * A [Saver] implementation for [LazyGridState] that handles setting a custom
@@ -536,30 +508,33 @@
     }
 }
 
-private val EmptyLazyGridLayoutInfo = LazyGridMeasureResult(
-    firstVisibleLine = null,
-    firstVisibleLineScrollOffset = 0,
-    canScrollForward = false,
-    consumedScroll = 0f,
-    measureResult = object : MeasureResult {
-        override val width: Int = 0
-        override val height: Int = 0
+private val EmptyLazyGridLayoutInfo =
+    LazyGridMeasureResult(
+        firstVisibleLine = null,
+        firstVisibleLineScrollOffset = 0,
+        canScrollForward = false,
+        consumedScroll = 0f,
+        measureResult =
+            object : MeasureResult {
+                override val width: Int = 0
+                override val height: Int = 0
 
-        @Suppress("PrimitiveInCollection")
-        override val alignmentLines: Map<AlignmentLine, Int> = emptyMap()
-        override fun placeChildren() {}
-    },
-    visibleItemsInfo = emptyList(),
-    viewportStartOffset = 0,
-    viewportEndOffset = 0,
-    totalItemsCount = 0,
-    reverseLayout = false,
-    orientation = Orientation.Vertical,
-    afterContentPadding = 0,
-    mainAxisItemSpacing = 0,
-    remeasureNeeded = false,
-    density = Density(1f),
-    slotsPerLine = 0,
-    coroutineScope = CoroutineScope(EmptyCoroutineContext),
-    prefetchInfoRetriever = { emptyList() }
-)
+                @Suppress("PrimitiveInCollection")
+                override val alignmentLines: Map<AlignmentLine, Int> = emptyMap()
+
+                override fun placeChildren() {}
+            },
+        visibleItemsInfo = emptyList(),
+        viewportStartOffset = 0,
+        viewportEndOffset = 0,
+        totalItemsCount = 0,
+        reverseLayout = false,
+        orientation = Orientation.Vertical,
+        afterContentPadding = 0,
+        mainAxisItemSpacing = 0,
+        remeasureNeeded = false,
+        density = Density(1f),
+        slotsPerLine = 0,
+        coroutineScope = CoroutineScope(EmptyCoroutineContext),
+        prefetchInfoRetriever = { emptyList() }
+    )
diff --git a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/grid/LazySemantics.kt b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/grid/LazySemantics.kt
index c2afc58..7183bc7 100644
--- a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/grid/LazySemantics.kt
+++ b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/grid/LazySemantics.kt
@@ -34,16 +34,19 @@
     remember(state, reverseScrolling) {
         object : LazyLayoutSemanticState {
             override val scrollOffset: Float
-                get() = estimatedLazyScrollOffset(
-                    state.firstVisibleItemIndex,
-                    state.firstVisibleItemScrollOffset
-                )
+                get() =
+                    estimatedLazyScrollOffset(
+                        state.firstVisibleItemIndex,
+                        state.firstVisibleItemScrollOffset
+                    )
+
             override val maxScrollOffset: Float
-                get() = estimatedLazyMaxScrollOffset(
-                    state.firstVisibleItemIndex,
-                    state.firstVisibleItemScrollOffset,
-                    state.canScrollForward
-                )
+                get() =
+                    estimatedLazyMaxScrollOffset(
+                        state.firstVisibleItemIndex,
+                        state.firstVisibleItemScrollOffset,
+                        state.canScrollForward
+                    )
 
             override suspend fun scrollToItem(index: Int) {
                 state.scrollToItem(index)
@@ -54,11 +57,13 @@
                 CollectionInfo(rowCount = -1, columnCount = -1)
 
             override val viewport: Int
-                get() = if (state.layoutInfo.orientation == Orientation.Vertical) {
-                    state.layoutInfo.viewportSize.height
-                } else {
-                    state.layoutInfo.viewportSize.width
-                }
+                get() =
+                    if (state.layoutInfo.orientation == Orientation.Vertical) {
+                        state.layoutInfo.viewportSize.height
+                    } else {
+                        state.layoutInfo.viewportSize.width
+                    }
+
             override val contentPadding: Int
                 get() = state.layoutInfo.beforeContentPadding + state.layoutInfo.afterContentPadding
         }
diff --git a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/layout/IntervalList.kt b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/layout/IntervalList.kt
index 240952a..14e1e7d 100644
--- a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/layout/IntervalList.kt
+++ b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/layout/IntervalList.kt
@@ -52,38 +52,28 @@
     operator fun get(index: Int): Interval<T>
 
     /**
-     * Iterates through all the intervals starting from the one containing [fromIndex]
-     * until the one containing [toIndex].
+     * Iterates through all the intervals starting from the one containing [fromIndex] until the one
+     * containing [toIndex].
      *
      * @param fromIndex we will start iterating from the interval containing this index.
      * @param toIndex the last interval we iterate through will contain this index. This index
-     * should be not smaller than [fromIndex].
-     *
+     *   should be not smaller than [fromIndex].
      * @throws IndexOutOfBoundsException if the indexes are not within 0..[size] - 1 range.
      */
-    fun forEach(
-        fromIndex: Int = 0,
-        toIndex: Int = size - 1,
-        block: (Interval<T>) -> Unit
-    )
+    fun forEach(fromIndex: Int = 0, toIndex: Int = size - 1, block: (Interval<T>) -> Unit)
 
     /**
      * The interval holder.
      *
      * @see get
      */
-    class Interval<out T> internal constructor(
-        /**
-         * The index of the first item in the interval.
-         */
+    class Interval<out T>
+    internal constructor(
+        /** The index of the first item in the interval. */
         val startIndex: Int,
-        /**
-         * The amount of items in the interval.
-         */
+        /** The amount of items in the interval. */
         val size: Int,
-        /**
-         * The value representing this interval.
-         */
+        /** The value representing this interval. */
         val value: T
     ) {
         init {
@@ -107,8 +97,8 @@
         private set
 
     /**
-     * Caches the last interval we binary searched for. We might not need to recalculate
-     * for subsequent queries, as they tend to be localised.
+     * Caches the last interval we binary searched for. We might not need to recalculate for
+     * subsequent queries, as they tend to be localised.
      */
     private var lastInterval: IntervalList.Interval<T>? = null
 
@@ -119,18 +109,12 @@
      * @param value the value representing this interval.
      */
     fun addInterval(size: Int, value: T) {
-        require(size >= 0) {
-            "size should be >=0, but was $size"
-        }
+        require(size >= 0) { "size should be >=0, but was $size" }
         if (size == 0) {
             return
         }
 
-        val interval = IntervalList.Interval(
-            startIndex = this.size,
-            size = size,
-            value = value
-        )
+        val interval = IntervalList.Interval(startIndex = this.size, size = size, value = value)
         this.size += size
         intervals.add(interval)
     }
@@ -141,8 +125,7 @@
      *
      * @param fromIndex we will start iterating from the interval containing this index.
      * @param toIndex the last interval we iterate through will contain this index. This index
-     * should be not smaller than [fromIndex].
-     *
+     *   should be not smaller than [fromIndex].
      * @throws IndexOutOfBoundsException if the indexes are not within 0..[size] - 1 range.
      */
     override fun forEach(fromIndex: Int, toIndex: Int, block: (IntervalList.Interval<T>) -> Unit) {
@@ -172,9 +155,7 @@
         return if (lastInterval != null && lastInterval.contains(itemIndex)) {
             lastInterval
         } else {
-            intervals[intervals.binarySearch(itemIndex)].also {
-                this.lastInterval = it
-            }
+            intervals[intervals.binarySearch(itemIndex)].also { this.lastInterval = it }
         }
     }
 
diff --git a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/layout/LazyAnimateScroll.kt b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/layout/LazyAnimateScroll.kt
index 0ca2683..7f223c3 100644
--- a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/layout/LazyAnimateScroll.kt
+++ b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/layout/LazyAnimateScroll.kt
@@ -38,6 +38,7 @@
 private val MinimumDistance = 50.dp
 
 private const val DEBUG = false
+
 private inline fun debugLog(generateMsg: () -> String) {
     if (DEBUG) {
         println("LazyScrolling: ${generateMsg()}")
@@ -51,37 +52,29 @@
 @ExperimentalFoundationApi
 internal interface LazyLayoutAnimateScrollScope {
 
-    /**
-     * The index of the first visible item in the lazy layout.
-     */
+    /** The index of the first visible item in the lazy layout. */
     val firstVisibleItemIndex: Int
 
-    /**
-     * The offset of the first visible item.
-     */
+    /** The offset of the first visible item. */
     val firstVisibleItemScrollOffset: Int
 
     /**
-     * The last visible item in the LazyLayout, lastVisibleItemIndex - firstVisibleItemOffset + 1
-     * is the number of visible items.
+     * The last visible item in the LazyLayout, lastVisibleItemIndex - firstVisibleItemOffset + 1 is
+     * the number of visible items.
      */
     val lastVisibleItemIndex: Int
 
-    /**
-     * The total item count.
-     */
+    /** The total item count. */
     val itemCount: Int
 
-    /**
-     * Immediately scroll to [index] and settle in [scrollOffset].
-     */
+    /** Immediately scroll to [index] and settle in [scrollOffset]. */
     fun ScrollScope.snapToItem(index: Int, scrollOffset: Int)
 
     /**
      * The "expected" distance to [targetIndex]. This means the "expected" offset of [targetIndex]
-     * in the layout. In a LazyLayout, non-visible items don't have an actual offset, so this
-     * method should return an approximation of the scroll offset to [targetIndex]. If [targetIndex]
-     * is visible, then an "exact" offset should be provided.
+     * in the layout. In a LazyLayout, non-visible items don't have an actual offset, so this method
+     * should return an approximation of the scroll offset to [targetIndex]. If [targetIndex] is
+     * visible, then an "exact" offset should be provided.
      */
     fun calculateDistanceTo(targetIndex: Int): Float
 
@@ -133,7 +126,7 @@
                         true
                     } else if (
                         firstVisibleItemIndex == index &&
-                        firstVisibleItemScrollOffset > scrollOffset
+                            firstVisibleItemScrollOffset > scrollOffset
                     ) {
                         true
                     } else {
@@ -144,7 +137,7 @@
                         true
                     } else if (
                         firstVisibleItemIndex == index &&
-                        firstVisibleItemScrollOffset < scrollOffset
+                            firstVisibleItemScrollOffset < scrollOffset
                     ) {
                         true
                     } else {
@@ -156,12 +149,13 @@
             var loops = 1
             while (loop && itemCount > 0) {
                 val expectedDistance = calculateDistanceTo(index) + scrollOffset
-                val target = if (abs(expectedDistance) < targetDistancePx) {
-                    val absTargetPx = maxOf(abs(expectedDistance), minDistancePx)
-                    if (forward) absTargetPx else -absTargetPx
-                } else {
-                    if (forward) targetDistancePx else -targetDistancePx
-                }
+                val target =
+                    if (abs(expectedDistance) < targetDistancePx) {
+                        val absTargetPx = maxOf(abs(expectedDistance), minDistancePx)
+                        if (forward) absTargetPx else -absTargetPx
+                    } else {
+                        if (forward) targetDistancePx else -targetDistancePx
+                    }
 
                 debugLog {
                     "Scrolling to index=$index offset=$scrollOffset from " +
@@ -171,18 +165,16 @@
 
                 anim = anim.copy(value = 0f)
                 var prevValue = 0f
-                anim.animateTo(
-                    target,
-                    sequentialAnimation = (anim.velocity != 0f)
-                ) {
+                anim.animateTo(target, sequentialAnimation = (anim.velocity != 0f)) {
                     // If we haven't found the item yet, check if it's visible.
                     if (!isItemVisible(index)) {
                         // Springs can overshoot their target, clamp to the desired range
-                        val coercedValue = if (target > 0) {
-                            value.coerceAtMost(target)
-                        } else {
-                            value.coerceAtLeast(target)
-                        }
+                        val coercedValue =
+                            if (target > 0) {
+                                value.coerceAtMost(target)
+                            } else {
+                                value.coerceAtLeast(target)
+                            }
                         val delta = coercedValue - prevValue
                         debugLog {
                             "Scrolling by $delta (target: $target, coercedValue: $coercedValue)"
@@ -214,7 +206,7 @@
                             if (forward) {
                                 if (
                                     loops >= 2 &&
-                                    index - lastVisibleItemIndex > numOfItemsForTeleport
+                                        index - lastVisibleItemIndex > numOfItemsForTeleport
                                 ) {
                                     // Teleport
                                     debugLog { "Teleport forward" }
@@ -226,7 +218,7 @@
                             } else {
                                 if (
                                     loops >= 2 &&
-                                    firstVisibleItemIndex - index > numOfItemsForTeleport
+                                        firstVisibleItemIndex - index > numOfItemsForTeleport
                                 ) {
                                     // Teleport
                                     debugLog { "Teleport backward" }
@@ -266,33 +258,30 @@
             val anim = itemFound.previousAnimation.copy(value = 0f)
             val target = (itemFound.itemOffset + scrollOffset).toFloat()
             var prevValue = 0f
-            debugLog {
-                "Seeking by $target at velocity ${itemFound.previousAnimation.velocity}"
-            }
-            anim.animateTo(
-                target,
-                sequentialAnimation = (anim.velocity != 0f)
-            ) {
+            debugLog { "Seeking by $target at velocity ${itemFound.previousAnimation.velocity}" }
+            anim.animateTo(target, sequentialAnimation = (anim.velocity != 0f)) {
                 // Springs can overshoot their target, clamp to the desired range
-                val coercedValue = when {
-                    target > 0 -> {
-                        value.coerceAtMost(target)
+                val coercedValue =
+                    when {
+                        target > 0 -> {
+                            value.coerceAtMost(target)
+                        }
+                        target < 0 -> {
+                            value.coerceAtLeast(target)
+                        }
+                        else -> {
+                            debugLog {
+                                "WARNING: somehow ended up seeking 0px, this shouldn't happen"
+                            }
+                            0f
+                        }
                     }
-
-                    target < 0 -> {
-                        value.coerceAtLeast(target)
-                    }
-
-                    else -> {
-                        debugLog { "WARNING: somehow ended up seeking 0px, this shouldn't happen" }
-                        0f
-                    }
-                }
                 val delta = coercedValue - prevValue
                 debugLog { "Seeking by $delta (coercedValue = $coercedValue)" }
                 val consumed = scrollBy(delta)
-                if (delta != consumed /* hit the end, stop */ ||
-                    coercedValue != value /* would have overshot, stop */
+                if (
+                    delta != consumed /* hit the end, stop */ ||
+                        coercedValue != value /* would have overshot, stop */
                 ) {
                     cancelAnimation()
                 }
diff --git a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/layout/LazyLayout.kt b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/layout/LazyLayout.kt
index cb6f9ca..e5330a6 100644
--- a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/layout/LazyLayout.kt
+++ b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/layout/LazyLayout.kt
@@ -29,20 +29,19 @@
 import androidx.compose.ui.unit.Constraints
 
 /**
- * A layout that only composes and lays out currently needed items. Can be used to build
- * efficient scrollable layouts.
+ * A layout that only composes and lays out currently needed items. Can be used to build efficient
+ * scrollable layouts.
  *
- * @param itemProvider provides all the needed info about the items which could be used to
- * compose and measure items as part of [measurePolicy].
+ * @param itemProvider provides all the needed info about the items which could be used to compose
+ *   and measure items as part of [measurePolicy].
  * @param modifier to apply on the layout
  * @param prefetchState allows to schedule items for prefetching
  * @param measurePolicy Measure policy which allows to only compose and measure needed items.
  */
 @Deprecated(
     message = "Use an overload accepting a lambda prodicing an item provider instead",
-    replaceWith = ReplaceWith(
-        "LazyLayout({ itemProvider }, modifier, prefetchState, measurePolicy)"
-    )
+    replaceWith =
+        ReplaceWith("LazyLayout({ itemProvider }, modifier, prefetchState, measurePolicy)")
 )
 @ExperimentalFoundationApi
 @Composable
@@ -56,11 +55,11 @@
 }
 
 /**
- * A layout that only composes and lays out currently needed items. Can be used to build
- * efficient scrollable layouts.
+ * A layout that only composes and lays out currently needed items. Can be used to build efficient
+ * scrollable layouts.
  *
- * @param itemProvider lambda producing an item provider containing all the needed info about
- * the items which could be used to compose and measure items as part of [measurePolicy].
+ * @param itemProvider lambda producing an item provider containing all the needed info about the
+ *   items which could be used to compose and measure items as part of [measurePolicy].
  * @param modifier to apply on the layout
  * @param prefetchState allows to schedule items for prefetching
  * @param measurePolicy Measure policy which allows to only compose and measure needed items.
@@ -88,20 +87,10 @@
         }
         if (prefetchState != null) {
             val executor = prefetchState.prefetchScheduler ?: rememberDefaultPrefetchScheduler()
-            DisposableEffect(
-                prefetchState,
-                itemContentFactory,
-                subcomposeLayoutState,
-                executor
-            ) {
-                prefetchState.prefetchHandleProvider = PrefetchHandleProvider(
-                    itemContentFactory,
-                    subcomposeLayoutState,
-                    executor
-                )
-                onDispose {
-                    prefetchState.prefetchHandleProvider = null
-                }
+            DisposableEffect(prefetchState, itemContentFactory, subcomposeLayoutState, executor) {
+                prefetchState.prefetchHandleProvider =
+                    PrefetchHandleProvider(itemContentFactory, subcomposeLayoutState, executor)
+                onDispose { prefetchState.prefetchHandleProvider = null }
             }
         }
 
@@ -110,12 +99,7 @@
             modifier.traversablePrefetchState(prefetchState),
             remember(itemContentFactory, measurePolicy) {
                 { constraints ->
-                    with(
-                        LazyLayoutMeasureScopeImpl(
-                            itemContentFactory,
-                            this
-                        )
-                    ) {
+                    with(LazyLayoutMeasureScopeImpl(itemContentFactory, this)) {
                         measurePolicy(constraints)
                     }
                 }
@@ -125,9 +109,8 @@
 }
 
 @ExperimentalFoundationApi
-private class LazyLayoutItemReusePolicy(
-    private val factory: LazyLayoutItemContentFactory
-) : SubcomposeSlotReusePolicy {
+private class LazyLayoutItemReusePolicy(private val factory: LazyLayoutItemContentFactory) :
+    SubcomposeSlotReusePolicy {
     private val countPerType = mutableMapOf<Any?, Int>()
 
     override fun getSlotsToRetain(slotIds: SubcomposeSlotReusePolicy.SlotIdsSet) {
@@ -151,7 +134,7 @@
 }
 
 /**
- * We currently use the same number of items to reuse (recycle) items as RecyclerView does:
- * 5 (RecycledViewPool.DEFAULT_MAX_SCRAP) + 2 (Recycler.DEFAULT_CACHE_SIZE)
+ * We currently use the same number of items to reuse (recycle) items as RecyclerView does: 5
+ * (RecycledViewPool.DEFAULT_MAX_SCRAP) + 2 (Recycler.DEFAULT_CACHE_SIZE)
  */
 private const val MaxItemsToRetainForReuse = 7
diff --git a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/layout/LazyLayoutBeyondBoundsInfo.kt b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/layout/LazyLayoutBeyondBoundsInfo.kt
index 7403fb2..5403fed 100644
--- a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/layout/LazyLayoutBeyondBoundsInfo.kt
+++ b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/layout/LazyLayoutBeyondBoundsInfo.kt
@@ -19,33 +19,29 @@
 import androidx.compose.runtime.collection.mutableVectorOf
 
 /**
- * This data structure is used to save information about the number of "beyond bounds items"
- * that we want to compose. These items are not within the visible bounds of the lazy layout,
- * but we compose them because they are explicitly requested through the
+ * This data structure is used to save information about the number of "beyond bounds items" that we
+ * want to compose. These items are not within the visible bounds of the lazy layout, but we compose
+ * them because they are explicitly requested through the
  * [beyond bounds layout API][androidx.compose.ui.layout.BeyondBoundsLayout].
  *
- * When the lazy layout receives a
- * [layout][androidx.compose.ui.layout.BeyondBoundsLayout.layout] request to layout items beyond
- * visible bounds, it creates an instance of [LazyLayoutBeyondBoundsInfo.Interval] by using the
- * [addInterval] function.
- * This returns the interval of items that are currently composed, and we can request other
- * intervals to control the number of beyond bounds items.
+ * When the lazy layout receives a [layout][androidx.compose.ui.layout.BeyondBoundsLayout.layout]
+ * request to layout items beyond visible bounds, it creates an instance of
+ * [LazyLayoutBeyondBoundsInfo.Interval] by using the [addInterval] function. This returns the
+ * interval of items that are currently composed, and we can request other intervals to control the
+ * number of beyond bounds items.
  *
  * There can be multiple intervals created at the same time, and [LazyLayoutBeyondBoundsInfo] merges
  * all the intervals to calculate the effective beyond bounds items.
  *
  * The [beyond bounds layout API][androidx.compose.ui.layout.BeyondBoundsLayout] is designed to be
- * synchronous, so once you are done using the items, call [removeInterval] to remove
- * the extra items you had requested.
+ * synchronous, so once you are done using the items, call [removeInterval] to remove the extra
+ * items you had requested.
  *
- * Note that when you clear an interval, the items in that interval might not be cleared right
- * away if another interval was created that has the same items. This is done to support two use
- * cases:
- *
+ * Note that when you clear an interval, the items in that interval might not be cleared right away
+ * if another interval was created that has the same items. This is done to support two use cases:
  * 1. To allow items to be pinned while they are being scrolled into view.
- *
  * 2. To allow users to call [layout][androidx.compose.ui.layout.BeyondBoundsLayout.layout] from
- * within the completion block of another layout call.
+ *    within the completion block of another layout call.
  */
 internal class LazyLayoutBeyondBoundsInfo {
     private val beyondBoundsItems = mutableVectorOf<Interval>()
@@ -57,30 +53,21 @@
      *
      * @param start The starting index (inclusive) for this interval.
      * @param end The ending index (inclusive) for this interval.
-     *
      * @return An interval that specifies which items we want to retain.
      */
     fun addInterval(start: Int, end: Int): Interval {
-        return Interval(start, end).apply {
-            beyondBoundsItems.add(this)
-        }
+        return Interval(start, end).apply { beyondBoundsItems.add(this) }
     }
 
-    /**
-     * Clears the specified interval. Use this to remove the interval created by [addInterval].
-     */
+    /** Clears the specified interval. Use this to remove the interval created by [addInterval]. */
     fun removeInterval(interval: Interval) {
         beyondBoundsItems.remove(interval)
     }
 
-    /**
-     * Returns true if there are beyond bounds intervals.
-     */
+    /** Returns true if there are beyond bounds intervals. */
     fun hasIntervals(): Boolean = beyondBoundsItems.isNotEmpty()
 
-    /**
-     *  The effective start index after merging all the current intervals.
-     */
+    /** The effective start index after merging all the current intervals. */
     val start: Int
         get() {
             var minIndex = beyondBoundsItems.first().start
@@ -93,9 +80,7 @@
             return minIndex
         }
 
-    /**
-     *  The effective end index after merging all the current intervals.
-     */
+    /** The effective end index after merging all the current intervals. */
     val end: Int
         get() {
             var maxIndex = beyondBoundsItems.first().end
@@ -107,9 +92,7 @@
             return maxIndex
         }
 
-    /**
-     * The Interval used to implement [LazyLayoutBeyondBoundsInfo].
-     */
+    /** The Interval used to implement [LazyLayoutBeyondBoundsInfo]. */
     internal data class Interval(
         /** The start index for the interval. */
         val start: Int,
diff --git a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/layout/LazyLayoutBeyondBoundsModifierLocal.kt b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/layout/LazyLayoutBeyondBoundsModifierLocal.kt
index 6485f66..3ed6f30 100644
--- a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/layout/LazyLayoutBeyondBoundsModifierLocal.kt
+++ b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/layout/LazyLayoutBeyondBoundsModifierLocal.kt
@@ -49,19 +49,21 @@
     layoutDirection: LayoutDirection,
     orientation: Orientation,
     enabled: Boolean
-): Modifier = if (!enabled) {
-    this
-} else {
-    this then remember(state, beyondBoundsInfo, reverseLayout, layoutDirection, orientation) {
-        LazyLayoutBeyondBoundsModifierLocal(
-            state,
-            beyondBoundsInfo,
-            reverseLayout,
-            layoutDirection,
-            orientation
-        )
+): Modifier =
+    if (!enabled) {
+        this
+    } else {
+        this then
+            remember(state, beyondBoundsInfo, reverseLayout, layoutDirection, orientation) {
+                LazyLayoutBeyondBoundsModifierLocal(
+                    state,
+                    beyondBoundsInfo,
+                    reverseLayout,
+                    layoutDirection,
+                    orientation
+                )
+            }
     }
-}
 
 internal class LazyLayoutBeyondBoundsModifierLocal(
     private val state: LazyLayoutBeyondBoundsState,
@@ -72,13 +74,15 @@
 ) : ModifierLocalProvider<BeyondBoundsLayout?>, BeyondBoundsLayout {
     override val key: ProvidableModifierLocal<BeyondBoundsLayout?>
         get() = ModifierLocalBeyondBoundsLayout
+
     override val value: BeyondBoundsLayout
         get() = this
 
     companion object {
-        private val emptyBeyondBoundsScope = object : BeyondBoundsScope {
-            override val hasMoreContent = false
-        }
+        private val emptyBeyondBoundsScope =
+            object : BeyondBoundsScope {
+                override val hasMoreContent = false
+            }
     }
 
     override fun <T> layout(
@@ -92,28 +96,31 @@
         }
 
         // We use a new interval each time because this function is re-entrant.
-        val startIndex = if (direction.isForward()) {
-            state.lastPlacedIndex
-        } else {
-            state.firstPlacedIndex
-        }
+        val startIndex =
+            if (direction.isForward()) {
+                state.lastPlacedIndex
+            } else {
+                state.firstPlacedIndex
+            }
         var interval = beyondBoundsInfo.addInterval(startIndex, startIndex)
         var found: T? = null
         while (found == null && interval.hasMoreContent(direction)) {
 
             // Add one extra beyond bounds item.
-            interval = addNextInterval(interval, direction).also {
-                beyondBoundsInfo.removeInterval(interval)
-            }
+            interval =
+                addNextInterval(interval, direction).also {
+                    beyondBoundsInfo.removeInterval(interval)
+                }
             state.remeasure()
 
             // When we invoke this block, the beyond bounds items are present.
-            found = block.invoke(
-                object : BeyondBoundsScope {
-                    override val hasMoreContent: Boolean
-                        get() = interval.hasMoreContent(direction)
-                }
-            )
+            found =
+                block.invoke(
+                    object : BeyondBoundsScope {
+                        override val hasMoreContent: Boolean
+                            get() = interval.hasMoreContent(direction)
+                    }
+                )
         }
 
         // Dispose the items that are beyond the visible bounds.
@@ -128,16 +135,16 @@
             After -> true
             Above -> reverseLayout
             Below -> !reverseLayout
-            Left -> when (layoutDirection) {
-                Ltr -> reverseLayout
-                Rtl -> !reverseLayout
-            }
-
-            Right -> when (layoutDirection) {
-                Ltr -> !reverseLayout
-                Rtl -> reverseLayout
-            }
-
+            Left ->
+                when (layoutDirection) {
+                    Ltr -> reverseLayout
+                    Rtl -> !reverseLayout
+                }
+            Right ->
+                when (layoutDirection) {
+                    Ltr -> !reverseLayout
+                    Rtl -> reverseLayout
+                }
             else -> unsupportedDirection()
         }
 
@@ -162,14 +169,16 @@
 
     private fun BeyondBoundsLayout.LayoutDirection.isOppositeToOrientation(): Boolean {
         return when (this) {
-            Above, Below -> orientation == Orientation.Horizontal
-            Left, Right -> orientation == Orientation.Vertical
-            Before, After -> false
+            Above,
+            Below -> orientation == Orientation.Horizontal
+            Left,
+            Right -> orientation == Orientation.Vertical
+            Before,
+            After -> false
             else -> unsupportedDirection()
         }
     }
 }
 
-private fun unsupportedDirection(): Nothing = error(
-    "Lazy list does not support beyond bounds layout for the specified direction"
-)
+private fun unsupportedDirection(): Nothing =
+    error("Lazy list does not support beyond bounds layout for the specified direction")
diff --git a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/layout/LazyLayoutBeyondBoundsState.kt b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/layout/LazyLayoutBeyondBoundsState.kt
index 7f5d9cb..a6ab79c 100644
--- a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/layout/LazyLayoutBeyondBoundsState.kt
+++ b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/layout/LazyLayoutBeyondBoundsState.kt
@@ -42,11 +42,12 @@
         return emptyList()
     } else {
         val pinnedItems = mutableListOf<Int>()
-        val beyondBoundsRange = if (beyondBoundsInfo.hasIntervals()) {
-            beyondBoundsInfo.start..min(beyondBoundsInfo.end, itemCount - 1)
-        } else {
-            IntRange.EMPTY
-        }
+        val beyondBoundsRange =
+            if (beyondBoundsInfo.hasIntervals()) {
+                beyondBoundsInfo.start..min(beyondBoundsInfo.end, itemCount - 1)
+            } else {
+                IntRange.EMPTY
+            }
         pinnedItemList.fastForEach {
             val index = findIndexByKey(it.key, it.index)
             if (index in beyondBoundsRange) return@fastForEach
diff --git a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/layout/LazyLayoutIntervalContent.kt b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/layout/LazyLayoutIntervalContent.kt
index b124361..6ae3480 100644
--- a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/layout/LazyLayoutIntervalContent.kt
+++ b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/layout/LazyLayoutIntervalContent.kt
@@ -28,30 +28,23 @@
 abstract class LazyLayoutIntervalContent<Interval : LazyLayoutIntervalContent.Interval> {
     abstract val intervals: IntervalList<Interval>
 
-    /**
-     * The total amount of items in all the intervals.
-     */
-    val itemCount: Int get() = intervals.size
+    /** The total amount of items in all the intervals. */
+    val itemCount: Int
+        get() = intervals.size
 
-    /**
-     * Returns item key based on a global index.
-     */
+    /** Returns item key based on a global index. */
     fun getKey(index: Int): Any =
         withInterval(index) { localIndex, content ->
             content.key?.invoke(localIndex) ?: getDefaultLazyLayoutKey(index)
         }
 
-    /**
-     * Returns content type based on a global index.
-     */
+    /** Returns content type based on a global index. */
     fun getContentType(index: Int): Any? =
-        withInterval(index) { localIndex, content ->
-            content.type.invoke(localIndex)
-        }
+        withInterval(index) { localIndex, content -> content.type.invoke(localIndex) }
 
     /**
-     * Runs a [block] on the content of the interval associated with the provided [globalIndex]
-     * with providing a local index in the given interval.
+     * Runs a [block] on the content of the interval associated with the provided [globalIndex] with
+     * providing a local index in the given interval.
      */
     inline fun <T> withInterval(
         globalIndex: Int,
@@ -66,19 +59,17 @@
      * Common content of individual intervals in `item` DSL of lazy layouts.
      *
      * Note: this class is a part of [LazyLayout] harness that allows for building custom lazy
-     * layouts. LazyLayout and all corresponding APIs are still under development and are subject
-     * to change.
+     * layouts. LazyLayout and all corresponding APIs are still under development and are subject to
+     * change.
      */
     @ExperimentalFoundationApi
     interface Interval {
-        /**
-         * Returns item key based on a local index for the current interval.
-         */
-        val key: ((index: Int) -> Any)? get() = null
+        /** Returns item key based on a local index for the current interval. */
+        val key: ((index: Int) -> Any)?
+            get() = null
 
-        /**
-         * Returns item type based on a local index for the current interval.
-         */
-        val type: ((index: Int) -> Any?) get() = { null }
+        /** Returns item type based on a local index for the current interval. */
+        val type: ((index: Int) -> Any?)
+            get() = { null }
     }
 }
diff --git a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/layout/LazyLayoutItemAnimation.kt b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/layout/LazyLayoutItemAnimation.kt
index 67a3798..9f5c4e3 100644
--- a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/layout/LazyLayoutItemAnimation.kt
+++ b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/layout/LazyLayoutItemAnimation.kt
@@ -49,37 +49,32 @@
 
     var isRunningMovingAwayAnimation = false
         private set
+
     /**
-     * Returns true when the placement animation is currently in progress so the parent
-     * should continue composing this item.
+     * Returns true when the placement animation is currently in progress so the parent should
+     * continue composing this item.
      */
     var isPlacementAnimationInProgress by mutableStateOf(false)
         private set
 
-    /**
-     * Returns true when the appearance animation is currently in progress.
-     */
+    /** Returns true when the appearance animation is currently in progress. */
     var isAppearanceAnimationInProgress by mutableStateOf(false)
         private set
 
-    /**
-     * Returns true when the disappearance animation is currently in progress.
-     */
+    /** Returns true when the disappearance animation is currently in progress. */
     var isDisappearanceAnimationInProgress by mutableStateOf(false)
         private set
 
-    /**
-     * Returns true when the disappearance animation has been finished.
-     */
+    /** Returns true when the disappearance animation has been finished. */
     var isDisappearanceAnimationFinished by mutableStateOf(false)
         private set
 
     /**
-     * This property is managed by the animation manager and is not directly used by this class.
-     * It represents the last known offset of this item in the lazy layout coordinate space.
-     * It will be updated on every scroll and is allowing the manager to track when the item
-     * position changes not because of the scroll event in order to start the animation.
-     * When there is an active animation it represents the final/target offset.
+     * This property is managed by the animation manager and is not directly used by this class. It
+     * represents the last known offset of this item in the lazy layout coordinate space. It will be
+     * updated on every scroll and is allowing the manager to track when the item position changes
+     * not because of the scroll event in order to start the animation. When there is an active
+     * animation it represents the final/target offset.
      */
     var rawOffset: IntOffset = NotInitialized
 
@@ -89,9 +84,7 @@
      */
     var finalOffset: IntOffset = IntOffset.Zero
 
-    /**
-     * Current [GraphicsLayer]. It will be set to null in [release].
-     */
+    /** Current [GraphicsLayer]. It will be set to null in [release]. */
     var layer: GraphicsLayer? = graphicsContext?.createGraphicsLayer()
         private set
 
@@ -100,15 +93,13 @@
     private val visibilityAnimation = Animatable(1f, Float.VectorConverter)
 
     /**
-     * Current delta to apply for a placement offset. Updates every animation frame.
-     * The settled value is [IntOffset.Zero] so the animation is always targeting this value.
+     * Current delta to apply for a placement offset. Updates every animation frame. The settled
+     * value is [IntOffset.Zero] so the animation is always targeting this value.
      */
     var placementDelta by mutableStateOf(IntOffset.Zero)
         private set
 
-    /**
-     * Cancels the ongoing placement animation if there is one.
-     */
+    /** Cancels the ongoing placement animation if there is one. */
     fun cancelPlacementAnimation() {
         if (isPlacementAnimationInProgress) {
             coroutineScope.launch {
@@ -125,9 +116,7 @@
      */
     var lookaheadOffset: IntOffset = NotInitialized
 
-    /**
-     * Animate the placement by the given [delta] offset.
-     */
+    /** Animate the placement by the given [delta] offset. */
     fun animatePlacementDelta(delta: IntOffset, isMovingAway: Boolean) {
         val spec = placementSpec ?: return
         val totalDelta = placementDelta - delta
@@ -136,16 +125,17 @@
         isRunningMovingAwayAnimation = isMovingAway
         coroutineScope.launch {
             try {
-                val finalSpec = if (placementDeltaAnimation.isRunning) {
-                    // when interrupted, use the default spring, unless the spec is a spring.
-                    if (spec is SpringSpec<IntOffset>) {
-                        spec
+                val finalSpec =
+                    if (placementDeltaAnimation.isRunning) {
+                        // when interrupted, use the default spring, unless the spec is a spring.
+                        if (spec is SpringSpec<IntOffset>) {
+                            spec
+                        } else {
+                            InterruptionSpec
+                        }
                     } else {
-                        InterruptionSpec
+                        spec
                     }
-                } else {
-                    spec
-                }
                 if (!placementDeltaAnimation.isRunning) {
                     // if not running we can snap to the initial value and animate to zero
                     placementDeltaAnimation.snapTo(totalDelta)
@@ -178,9 +168,7 @@
                 // we have an active disappearance, and then appearance was requested, but the user
                 // provided null spec for the appearance. we need to immediately switch to 1f
                 layer?.alpha = 1f
-                coroutineScope.launch {
-                    visibilityAnimation.snapTo(1f)
-                }
+                coroutineScope.launch { visibilityAnimation.snapTo(1f) }
             }
             return
         }
@@ -227,21 +215,15 @@
     fun release() {
         if (isPlacementAnimationInProgress) {
             isPlacementAnimationInProgress = false
-            coroutineScope.launch {
-                placementDeltaAnimation.stop()
-            }
+            coroutineScope.launch { placementDeltaAnimation.stop() }
         }
         if (isAppearanceAnimationInProgress) {
             isAppearanceAnimationInProgress = false
-            coroutineScope.launch {
-                visibilityAnimation.stop()
-            }
+            coroutineScope.launch { visibilityAnimation.stop() }
         }
         if (isDisappearanceAnimationInProgress) {
             isDisappearanceAnimationInProgress = false
-            coroutineScope.launch {
-                visibilityAnimation.stop()
-            }
+            coroutineScope.launch { visibilityAnimation.stop() }
         }
         isRunningMovingAwayAnimation = false
         placementDelta = IntOffset.Zero
@@ -265,11 +247,7 @@
 ) : ModifierNodeElement<LazyLayoutAnimationSpecsNode>() {
 
     override fun create(): LazyLayoutAnimationSpecsNode =
-        LazyLayoutAnimationSpecsNode(
-            fadeInSpec,
-            placementSpec,
-            fadeOutSpec
-        )
+        LazyLayoutAnimationSpecsNode(fadeInSpec, placementSpec, fadeOutSpec)
 
     override fun update(node: LazyLayoutAnimationSpecsNode) {
         node.fadeInSpec = fadeInSpec
@@ -294,10 +272,9 @@
     override fun Density.modifyParentData(parentData: Any?): Any = this@LazyLayoutAnimationSpecsNode
 }
 
-/**
- * We switch to this spec when a duration based animation is being interrupted.
- */
-private val InterruptionSpec = spring(
-    stiffness = Spring.StiffnessMediumLow,
-    visibilityThreshold = IntOffset.VisibilityThreshold
-)
+/** We switch to this spec when a duration based animation is being interrupted. */
+private val InterruptionSpec =
+    spring(
+        stiffness = Spring.StiffnessMediumLow,
+        visibilityThreshold = IntOffset.VisibilityThreshold
+    )
diff --git a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/layout/LazyLayoutItemAnimator.kt b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/layout/LazyLayoutItemAnimator.kt
index b1a5c9f..da839b5 100644
--- a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/layout/LazyLayoutItemAnimator.kt
+++ b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/layout/LazyLayoutItemAnimator.kt
@@ -40,7 +40,7 @@
  * This class is responsible for:
  * - animating item appearance for the new items.
  * - detecting when item position changed, figuring our start/end offsets and starting the
- * animations for placement animations.
+ *   animations for placement animations.
  * - animating item disappearance for the removed items.
  */
 internal class LazyLayoutItemAnimator<T : LazyLayoutMeasuredItem> {
@@ -97,11 +97,12 @@
         firstVisibleIndex = positionedItems.firstOrNull()?.index ?: 0
 
         // the consumed scroll is considered as a delta we don't need to animate
-        val scrollOffset = if (isVertical) {
-            IntOffset(0, consumedScroll)
-        } else {
-            IntOffset(consumedScroll, 0)
-        }
+        val scrollOffset =
+            if (isVertical) {
+                IntOffset(0, consumedScroll)
+            } else {
+                IntOffset(consumedScroll, 0)
+            }
 
         // Only setup animations when we have access to target value in the current pass, which
         // means lookahead pass, or regular pass when not in a lookahead scope.
@@ -141,9 +142,7 @@
                             newItemInfo
                         )
                         if (shouldAnimateAppearance) {
-                            newItemInfo.animations.forEach {
-                                it?.animateAppearance()
-                            }
+                            newItemInfo.animations.forEach { it?.animateAppearance() }
                         }
                     }
                 } else {
@@ -156,8 +155,9 @@
                             layoutMaxOffset,
                         )
                         itemInfo.animations.forEach { animation ->
-                            if (animation != null &&
-                                animation.rawOffset != LazyLayoutItemAnimation.NotInitialized
+                            if (
+                                animation != null &&
+                                    animation.rawOffset != LazyLayoutItemAnimation.NotInitialized
                             ) {
                                 animation.rawOffset += scrollOffset
                             }
@@ -248,17 +248,17 @@
                     removeInfoForKey(key)
                 }
             } else {
-                val item = itemProvider.getAndMeasure(
-                    index = newIndex,
-                    constraints = info.constraints!!,
-                    lane = info.lane,
-                    span = info.span
-                )
+                val item =
+                    itemProvider.getAndMeasure(
+                        index = newIndex,
+                        constraints = info.constraints!!,
+                        lane = info.lane,
+                        span = info.span
+                    )
 
                 item.nonScrollableItem = true
                 // check if we have any active placement animation on the item
-                val inProgress =
-                    info.animations.any { it?.isPlacementAnimationInProgress == true }
+                val inProgress = info.animations.any { it?.isPlacementAnimationInProgress == true }
                 if ((!inProgress && newIndex == previousKeyToIndexMap?.getIndex(key))) {
                     removeInfoForKey(key)
                 } else {
@@ -286,11 +286,12 @@
             movingAwayToStartBound.fastForEach { item ->
                 val itemInfo = keyToItemInfoMap[item.key]!!
                 val accumulatedOffset = accumulatedOffsetPerLane.updateAndReturnOffsetFor(item)
-                val mainAxisOffset = if (isLookingAhead) {
-                    positionedItems.first().mainAxisOffset
-                } else {
-                    itemInfo.layoutMinOffset
-                } - accumulatedOffset
+                val mainAxisOffset =
+                    if (isLookingAhead) {
+                        positionedItems.first().mainAxisOffset
+                    } else {
+                        itemInfo.layoutMinOffset
+                    } - accumulatedOffset
 
                 item.position(
                     mainAxisOffset = mainAxisOffset,
@@ -310,12 +311,11 @@
             movingAwayToEndBound.fastForEach { item ->
                 val itemInfo = keyToItemInfoMap[item.key]!!
                 val accumulatedOffset = accumulatedOffsetPerLane.updateAndReturnOffsetFor(item)
-                val mainAxisOffset = if (isLookingAhead)
-                    positionedItems.last()
-                        .let { it.mainAxisOffset }
-                else {
-                    itemInfo.layoutMaxOffset - item.mainAxisSizeWithSpacings
-                } + accumulatedOffset
+                val mainAxisOffset =
+                    if (isLookingAhead) positionedItems.last().let { it.mainAxisOffset }
+                    else {
+                        itemInfo.layoutMaxOffset - item.mainAxisSizeWithSpacings
+                    } + accumulatedOffset
 
                 item.position(
                     mainAxisOffset = mainAxisOffset,
@@ -343,21 +343,17 @@
     }
 
     private fun removeInfoForKey(key: Any) {
-        keyToItemInfoMap.remove(key)?.animations?.forEach {
-            it?.release()
-        }
+        keyToItemInfoMap.remove(key)?.animations?.forEach { it?.release() }
     }
 
     /**
-     * Should be called when the animations are not needed for the next positions change,
-     * for example when we snap to a new position.
+     * Should be called when the animations are not needed for the next positions change, for
+     * example when we snap to a new position.
      */
     fun reset() {
         if (keyToItemInfoMap.isNotEmpty()) {
             keyToItemInfoMap.forEachValue {
-                it.animations.forEach { animation ->
-                    animation?.release()
-                }
+                it.animations.forEach { animation -> animation?.release() }
             }
             keyToItemInfoMap.clear()
         }
@@ -372,11 +368,12 @@
     ) {
         val firstPlaceableOffset = item.getOffset(0)
 
-        val targetFirstPlaceableOffset = if (item.isVertical) {
-            firstPlaceableOffset.copy(y = mainAxisOffset)
-        } else {
-            firstPlaceableOffset.copy(x = mainAxisOffset)
-        }
+        val targetFirstPlaceableOffset =
+            if (item.isVertical) {
+                firstPlaceableOffset.copy(y = mainAxisOffset)
+            } else {
+                firstPlaceableOffset.copy(x = mainAxisOffset)
+            }
 
         // initialize offsets
         itemInfo.animations.forEachIndexed { placeableIndex, animation ->
@@ -394,8 +391,9 @@
             if (animation != null) {
                 val newTarget = item.getOffset(placeableIndex)
                 val currentTarget = animation.rawOffset
-                if (currentTarget != LazyLayoutItemAnimation.NotInitialized &&
-                    currentTarget != newTarget
+                if (
+                    currentTarget != LazyLayoutItemAnimation.NotInitialized &&
+                        currentTarget != newTarget
                 ) {
                     animation.animatePlacementDelta(newTarget - currentTarget, isMovingAway)
                 }
@@ -424,10 +422,11 @@
             disappearingItems.fastForEach {
                 val layer = it.layer
                 if (layer != null) {
-                    size = IntSize(
-                        width = maxOf(size.width, it.rawOffset.x + layer.size.width),
-                        height = maxOf(size.height, it.rawOffset.y + layer.size.height)
-                    )
+                    size =
+                        IntSize(
+                            width = maxOf(size.width, it.rawOffset.x + layer.size.width),
+                            height = maxOf(size.height, it.rawOffset.y + layer.size.height)
+                        )
                 }
             }
             return size
@@ -448,13 +447,14 @@
 
     private val LazyLayoutMeasuredItem.mainAxisOffset
         get() = getOffset(0).let { if (isVertical) it.y else it.x }
+
     private val LazyLayoutMeasuredItem.crossAxisOffset
         get() = getOffset(0).let { if (!isVertical) it.y else it.x }
 
     private inner class ItemInfo {
         /**
-         * This array will have the same amount of elements as there are placeables on the item.
-         * If the element is not null this means there are specs associated with the given placeable.
+         * This array will have the same amount of elements as there are placeables on the item. If
+         * the element is not null this means there are specs associated with the given placeable.
          */
         var animations = EmptyArray
             private set
@@ -469,6 +469,7 @@
 
         var layoutMinOffset = 0
             private set
+
         var layoutMaxOffset = 0
             private set
 
@@ -500,15 +501,17 @@
                     animations[index]?.release()
                     animations[index] = null
                 } else {
-                    val animation = animations[index] ?: LazyLayoutItemAnimation(
-                        coroutineScope = coroutineScope,
-                        graphicsContext = graphicsContext,
-                        // until b/329417380 is fixed we have to trigger any invalidation in
-                        // order for the layer properties change to be applied:
-                        onLayerPropertyChanged = { displayingNode?.invalidateDraw() }
-                    ).also {
-                        animations[index] = it
-                    }
+                    val animation =
+                        animations[index]
+                            ?: LazyLayoutItemAnimation(
+                                    coroutineScope = coroutineScope,
+                                    graphicsContext = graphicsContext,
+                                    // until b/329417380 is fixed we have to trigger any
+                                    // invalidation in
+                                    // order for the layer properties change to be applied:
+                                    onLayerPropertyChanged = { displayingNode?.invalidateDraw() }
+                                )
+                                .also { animations[index] = it }
                     animation.fadeInSpec = specs.fadeInSpec
                     animation.placementSpec = specs.placementSpec
                     animation.fadeOutSpec = specs.fadeOutSpec
@@ -566,6 +569,7 @@
     }
 }
 
-private val Any?.specs get() = this as? LazyLayoutAnimationSpecsNode
+private val Any?.specs
+    get() = this as? LazyLayoutAnimationSpecsNode
 
 private val EmptyArray = emptyArray<LazyLayoutItemAnimation?>()
diff --git a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/layout/LazyLayoutItemContentFactory.kt b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/layout/LazyLayoutItemContentFactory.kt
index 057d0d3..e7b1dc9 100644
--- a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/layout/LazyLayoutItemContentFactory.kt
+++ b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/layout/LazyLayoutItemContentFactory.kt
@@ -26,11 +26,11 @@
 /**
  * This class:
  * 1) Caches the lambdas being produced by [itemProvider]. This allows us to perform less
- * recompositions as the compose runtime can skip the whole composition if we subcompose with the
- * same instance of the content lambda.
+ *    recompositions as the compose runtime can skip the whole composition if we subcompose with the
+ *    same instance of the content lambda.
  * 2) Updates the mapping between keys and indexes when we have a new factory
  * 3) Adds state restoration on top of the composable returned by [itemProvider] with help of
- * [saveableStateHolder].
+ *    [saveableStateHolder].
  */
 @ExperimentalFoundationApi
 internal class LazyLayoutItemContentFactory(
@@ -61,9 +61,7 @@
         }
     }
 
-    /**
-     * Return cached item content lambda or creates a new lambda and puts it in the cache.
-     */
+    /** Return cached item content lambda or creates a new lambda and puts it in the cache. */
     fun getContent(index: Int, key: Any, contentType: Any?): @Composable () -> Unit {
         val cached = lambdasCache[key]
         return if (cached != null && cached.index == index && cached.contentType == contentType) {
@@ -75,11 +73,7 @@
         }
     }
 
-    private inner class CachedItemContent(
-        index: Int,
-        val key: Any,
-        val contentType: Any?
-    ) {
+    private inner class CachedItemContent(index: Int, val key: Any, val contentType: Any?) {
         // the index resolved during the latest composition
         var index = index
             private set
@@ -88,40 +82,40 @@
         val content: (@Composable () -> Unit)
             get() = _content ?: createContentLambda().also { _content = it }
 
-        private fun createContentLambda() = @Composable {
-            val itemProvider = itemProvider()
+        private fun createContentLambda() =
+            @Composable {
+                val itemProvider = itemProvider()
 
-            var index = index
-            if (index >= itemProvider.itemCount || itemProvider.getKey(index) != key) {
-                index = itemProvider.getIndex(key)
-                if (index != -1) this.index = index
-            }
+                var index = index
+                if (index >= itemProvider.itemCount || itemProvider.getKey(index) != key) {
+                    index = itemProvider.getIndex(key)
+                    if (index != -1) this.index = index
+                }
 
-            ReusableContentHost(active = index != -1) {
-                SkippableItem(
-                    itemProvider,
-                    StableValue(saveableStateHolder),
-                    index,
-                    StableValue(key)
-                )
-            }
-            DisposableEffect(key) {
-                onDispose {
-                    // we clear the cached content lambda when disposed to not leak RecomposeScopes
-                    _content = null
+                ReusableContentHost(active = index != -1) {
+                    SkippableItem(
+                        itemProvider,
+                        StableValue(saveableStateHolder),
+                        index,
+                        StableValue(key)
+                    )
+                }
+                DisposableEffect(key) {
+                    onDispose {
+                        // we clear the cached content lambda when disposed to not leak
+                        // RecomposeScopes
+                        _content = null
+                    }
                 }
             }
-        }
     }
 }
 
-@Stable
-@JvmInline
-private value class StableValue<T>(val value: T)
+@Stable @JvmInline private value class StableValue<T>(val value: T)
 
 /**
- * Hack around skippable functions to force skip SaveableStateProvider and Item block when
- * nothing changed. It allows us to skip heavy-weight composition local providers.
+ * Hack around skippable functions to force skip SaveableStateProvider and Item block when nothing
+ * changed. It allows us to skip heavy-weight composition local providers.
  */
 @OptIn(ExperimentalFoundationApi::class)
 @Composable
diff --git a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/layout/LazyLayoutItemProvider.kt b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/layout/LazyLayoutItemProvider.kt
index cf60f3b..9e1f8a4 100644
--- a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/layout/LazyLayoutItemProvider.kt
+++ b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/layout/LazyLayoutItemProvider.kt
@@ -32,21 +32,16 @@
 @ExperimentalFoundationApi
 interface LazyLayoutItemProvider {
 
-    /**
-     * The total number of items in the lazy layout (visible or not).
-     */
+    /** The total number of items in the lazy layout (visible or not). */
     val itemCount: Int
 
-    /**
-     * The item for the given [index] and [key].
-     */
-    @Composable
-    fun Item(index: Int, key: Any)
+    /** The item for the given [index] and [key]. */
+    @Composable fun Item(index: Int, key: Any)
 
     /**
      * Returns the content type for the item on this index. It is used to improve the item
-     * compositions reusing efficiency. Note that null is a valid type and items of such
-     * type will be considered compatible.
+     * compositions reusing efficiency. Note that null is a valid type and items of such type will
+     * be considered compatible.
      */
     fun getContentType(index: Int): Any? = null
 
@@ -58,16 +53,16 @@
     fun getKey(index: Int): Any = getDefaultLazyLayoutKey(index)
 
     /**
-     * Get index for given key. The index is not guaranteed to be known for all keys in
-     * layout for optimization purposes, but must be present for elements in current viewport.
-     * If the key is not present in the layout or near current viewport, return -1.
+     * Get index for given key. The index is not guaranteed to be known for all keys in layout for
+     * optimization purposes, but must be present for elements in current viewport. If the key is
+     * not present in the layout or near current viewport, return -1.
      */
     fun getIndex(key: Any): Int = -1
 }
 
 /**
- * Finds a position of the item with the given key in the lists. This logic allows us to
- * detect when there were items added or removed before our current first item.
+ * Finds a position of the item with the given key in the lists. This logic allows us to detect when
+ * there were items added or removed before our current first item.
  */
 @ExperimentalFoundationApi
 internal fun LazyLayoutItemProvider.findIndexByKey(
@@ -78,9 +73,7 @@
         // there were no real item during the previous measure
         return lastKnownIndex
     }
-    if (lastKnownIndex < itemCount &&
-        key == getKey(lastKnownIndex)
-    ) {
+    if (lastKnownIndex < itemCount && key == getKey(lastKnownIndex)) {
         // this item is still at the same index
         return lastKnownIndex
     }
diff --git a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/layout/LazyLayoutKeyIndexMap.kt b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/layout/LazyLayoutKeyIndexMap.kt
index 437e6a6..91f0480 100644
--- a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/layout/LazyLayoutKeyIndexMap.kt
+++ b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/layout/LazyLayoutKeyIndexMap.kt
@@ -22,35 +22,29 @@
 import androidx.compose.foundation.ExperimentalFoundationApi
 
 /**
- * A key-index mapping used inside the [LazyLayoutItemProvider]. It might not contain all items
- * in the lazy layout as optimization, but it must cover items the provider is requesting
- * during layout pass.
- * See [NearestRangeKeyIndexMap] as sample implementation that samples items near current viewport.
+ * A key-index mapping used inside the [LazyLayoutItemProvider]. It might not contain all items in
+ * the lazy layout as optimization, but it must cover items the provider is requesting during layout
+ * pass. See [NearestRangeKeyIndexMap] as sample implementation that samples items near current
+ * viewport.
  */
 internal interface LazyLayoutKeyIndexMap {
-    /**
-     * @return current index for given [key] or `-1` if not found.
-     */
+    /** @return current index for given [key] or `-1` if not found. */
     fun getIndex(key: Any): Int
 
-    /**
-     * @return key for a given [index] if it is known, or null otherwise.
-     */
+    /** @return key for a given [index] if it is known, or null otherwise. */
     fun getKey(index: Int): Any?
 
-    /**
-     * Empty map implementation, always returning `-1` for any key.
-     */
+    /** Empty map implementation, always returning `-1` for any key. */
     companion object Empty : LazyLayoutKeyIndexMap {
-        @Suppress("AutoBoxing")
-        override fun getIndex(key: Any): Int = -1
+        @Suppress("AutoBoxing") override fun getIndex(key: Any): Int = -1
+
         override fun getKey(index: Int) = null
     }
 }
 
 /**
- * Implementation of [LazyLayoutKeyIndexMap] indexing over given [IntRange] of items.
- * Items outside of given range are considered unknown, with null returned as the index.
+ * Implementation of [LazyLayoutKeyIndexMap] indexing over given [IntRange] of items. Items outside
+ * of given range are considered unknown, with null returned as the index.
  */
 @ExperimentalFoundationApi
 internal class NearestRangeKeyIndexMap(
@@ -76,27 +70,27 @@
             val size = last - first + 1
             keys = arrayOfNulls<Any?>(size)
             keysStartIndex = first
-            map = MutableObjectIntMap<Any>(size).also { map ->
-                list.forEach(
-                    fromIndex = first,
-                    toIndex = last,
-                ) {
-                    val keyFactory = it.value.key
-                    val start = maxOf(first, it.startIndex)
-                    val end = minOf(last, it.startIndex + it.size - 1)
-                    for (i in start..end) {
-                        val key =
-                            keyFactory?.invoke(i - it.startIndex) ?: getDefaultLazyLayoutKey(i)
-                        map[key] = i
-                        keys[i - keysStartIndex] = key
+            map =
+                MutableObjectIntMap<Any>(size).also { map ->
+                    list.forEach(
+                        fromIndex = first,
+                        toIndex = last,
+                    ) {
+                        val keyFactory = it.value.key
+                        val start = maxOf(first, it.startIndex)
+                        val end = minOf(last, it.startIndex + it.size - 1)
+                        for (i in start..end) {
+                            val key =
+                                keyFactory?.invoke(i - it.startIndex) ?: getDefaultLazyLayoutKey(i)
+                            map[key] = i
+                            keys[i - keysStartIndex] = key
+                        }
                     }
                 }
-            }
         }
     }
 
     override fun getIndex(key: Any): Int = map.getOrElse(key) { -1 }
 
-    override fun getKey(index: Int) =
-        keys.getOrElse(index - keysStartIndex) { null }
+    override fun getKey(index: Int) = keys.getOrElse(index - keysStartIndex) { null }
 }
diff --git a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/layout/LazyLayoutMeasureScope.kt b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/layout/LazyLayoutMeasureScope.kt
index 286abc4..763de38 100644
--- a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/layout/LazyLayoutMeasureScope.kt
+++ b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/layout/LazyLayoutMeasureScope.kt
@@ -34,8 +34,8 @@
 import androidx.compose.ui.unit.sp
 
 /**
- * The receiver scope of a [LazyLayout]'s measure lambda. The return value of the
- * measure lambda is [MeasureResult], which should be returned by [layout].
+ * The receiver scope of a [LazyLayout]'s measure lambda. The return value of the measure lambda is
+ * [MeasureResult], which should be returned by [layout].
  *
  * Main difference from the regular flow of writing any custom layout is that you have a new
  * function [measure] which accepts item index and constraints, composes the item based and then
@@ -53,11 +53,10 @@
      *
      * @param index the item index. Should be no larger that [LazyLayoutItemProvider.itemCount].
      * @param constraints [Constraints] to measure the children emitted into an item content
-     * composable specified via [LazyLayoutItemProvider.Item].
-     *
+     *   composable specified via [LazyLayoutItemProvider.Item].
      * @return List of [Placeable]s. Note that if you emitted multiple children into the item
-     * composable you will receive multiple placeables, each of them will be measured with
-     * the passed [constraints].
+     *   composable you will receive multiple placeables, each of them will be measured with the
+     *   passed [constraints].
      */
     fun measure(index: Int, constraints: Constraints): List<Placeable>
 
@@ -70,38 +69,36 @@
         return Dp(value * fontScale)
     }
 
-    @Stable
-    override fun Int.toDp(): Dp = (this / density).dp
+    @Stable override fun Int.toDp(): Dp = (this / density).dp
+
+    @Stable override fun Float.toDp(): Dp = (this / density).dp
+
+    @Stable override fun Float.toSp(): TextUnit = (this / (fontScale * density)).sp
+
+    @Stable override fun Int.toSp(): TextUnit = (this / (fontScale * density)).sp
+
+    @Stable override fun Dp.toSp(): TextUnit = (value / fontScale).sp
 
     @Stable
-    override fun Float.toDp(): Dp = (this / density).dp
+    override fun DpSize.toSize(): Size =
+        if (isSpecified) {
+            Size(width.toPx(), height.toPx())
+        } else {
+            Size.Unspecified
+        }
 
     @Stable
-    override fun Float.toSp(): TextUnit = (this / (fontScale * density)).sp
-
-    @Stable
-    override fun Int.toSp(): TextUnit = (this / (fontScale * density)).sp
-
-    @Stable
-    override fun Dp.toSp(): TextUnit = (value / fontScale).sp
-
-    @Stable
-    override fun DpSize.toSize(): Size = if (isSpecified) {
-        Size(width.toPx(), height.toPx())
-    } else {
-        Size.Unspecified
-    }
-
-    @Stable
-    override fun Size.toDpSize(): DpSize = if (isSpecified) {
-        DpSize(width.toDp(), height.toDp())
-    } else {
-        DpSize.Unspecified
-    }
+    override fun Size.toDpSize(): DpSize =
+        if (isSpecified) {
+            DpSize(width.toDp(), height.toDp())
+        } else {
+            DpSize.Unspecified
+        }
 }
 
 @ExperimentalFoundationApi
-internal class LazyLayoutMeasureScopeImpl internal constructor(
+internal class LazyLayoutMeasureScopeImpl
+internal constructor(
     private val itemContentFactory: LazyLayoutItemContentFactory,
     private val subcomposeMeasureScope: SubcomposeMeasureScope
 ) : LazyLayoutMeasureScope, MeasureScope by subcomposeMeasureScope {
@@ -109,8 +106,8 @@
     private val itemProvider = itemContentFactory.itemProvider()
 
     /**
-     * A cache of the previously composed items. It allows us to support [get]
-     * re-executions with the same index during the same measure pass.
+     * A cache of the previously composed items. It allows us to support [get] re-executions with
+     * the same index during the same measure pass.
      */
     private val placeablesCache = hashMapOf<Int, List<Placeable>>()
 
@@ -123,18 +120,12 @@
             val contentType = itemProvider.getContentType(index)
             val itemContent = itemContentFactory.getContent(index, key, contentType)
             val measurables = subcomposeMeasureScope.subcompose(key, itemContent)
-            List(measurables.size) { i ->
-                measurables[i].measure(constraints)
-            }.also {
-                placeablesCache[index] = it
-            }
+            List(measurables.size) { i -> measurables[i].measure(constraints) }
+                .also { placeablesCache[index] = it }
         }
     }
 
-    /**
-     * Below overrides added to work around https://youtrack.jetbrains.com/issue/KT-51672
-     */
-
+    /** Below overrides added to work around https://youtrack.jetbrains.com/issue/KT-51672 */
     override fun TextUnit.toDp(): Dp = with(subcomposeMeasureScope) { toDp() }
 
     override fun Int.toDp(): Dp = with(subcomposeMeasureScope) { toDp() }
diff --git a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/layout/LazyLayoutMeasuredItem.kt b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/layout/LazyLayoutMeasuredItem.kt
index c4c0fb9..68cb8f6 100644
--- a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/layout/LazyLayoutMeasuredItem.kt
+++ b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/layout/LazyLayoutMeasuredItem.kt
@@ -29,8 +29,11 @@
     val constraints: Constraints
     val lane: Int
     val span: Int
+
     fun getOffset(index: Int): IntOffset
+
     fun position(mainAxisOffset: Int, crossAxisOffset: Int, layoutWidth: Int, layoutHeight: Int)
+
     fun getParentData(index: Int): Any?
 }
 
diff --git a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/layout/LazyLayoutNearestRangeState.kt b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/layout/LazyLayoutNearestRangeState.kt
index 69766ea..8fa8950 100644
--- a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/layout/LazyLayoutNearestRangeState.kt
+++ b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/layout/LazyLayoutNearestRangeState.kt
@@ -28,10 +28,11 @@
     private val extraItemCount: Int
 ) : State<IntRange> {
 
-    override var value: IntRange by mutableStateOf(
-        calculateNearestItemsRange(firstVisibleItem, slidingWindowSize, extraItemCount),
-        structuralEqualityPolicy()
-    )
+    override var value: IntRange by
+        mutableStateOf(
+            calculateNearestItemsRange(firstVisibleItem, slidingWindowSize, extraItemCount),
+            structuralEqualityPolicy()
+        )
         private set
 
     private var lastFirstVisibleItem = firstVisibleItem
@@ -45,8 +46,8 @@
 
     private companion object {
         /**
-         * Returns a range of indexes which contains at least [extraItemCount] items near
-         * the first visible item. It is optimized to return the same range for small changes in the
+         * Returns a range of indexes which contains at least [extraItemCount] items near the first
+         * visible item. It is optimized to return the same range for small changes in the
          * firstVisibleItem value so we do not regenerate the map on each scroll.
          */
         private fun calculateNearestItemsRange(
diff --git a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/layout/LazyLayoutPinnableItem.kt b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/layout/LazyLayoutPinnableItem.kt
index 3cbb799..06c199f 100644
--- a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/layout/LazyLayoutPinnableItem.kt
+++ b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/layout/LazyLayoutPinnableItem.kt
@@ -31,8 +31,8 @@
 import androidx.compose.ui.layout.PinnableContainer
 
 /**
- * Wrapper supporting [PinnableContainer] in lazy layout items. Each pinned item
- * is considered important to keep alive even if it would be discarded otherwise.
+ * Wrapper supporting [PinnableContainer] in lazy layout items. Each pinned item is considered
+ * important to keep alive even if it would be discarded otherwise.
  *
  * @param key key of the item inside the lazy layout
  * @param index index of the item inside the lazy layout
@@ -55,24 +55,19 @@
     pinnableItem.index = index
     pinnableItem.parentPinnableContainer = LocalPinnableContainer.current
     DisposableEffect(pinnableItem) { onDispose { pinnableItem.onDisposed() } }
-    CompositionLocalProvider(
-        LocalPinnableContainer provides pinnableItem, content = content
-    )
+    CompositionLocalProvider(LocalPinnableContainer provides pinnableItem, content = content)
 }
 
 /**
- * Read-only list of pinned items in a lazy layout.
- * The items are modified internally by the [PinnableContainer] consumers, for example if something
- * inside item content is focused.
+ * Read-only list of pinned items in a lazy layout. The items are modified internally by the
+ * [PinnableContainer] consumers, for example if something inside item content is focused.
  *
- * Note: this class is a part of [LazyLayout] harness that allows for building custom lazy
- * layouts. LazyLayout and all corresponding APIs are still under development and are subject to
- * change.
+ * Note: this class is a part of [LazyLayout] harness that allows for building custom lazy layouts.
+ * LazyLayout and all corresponding APIs are still under development and are subject to change.
  */
 @ExperimentalFoundationApi
-class LazyLayoutPinnedItemList private constructor(
-    private val items: MutableList<PinnedItem>
-) : List<LazyLayoutPinnedItemList.PinnedItem> by items {
+class LazyLayoutPinnedItemList private constructor(private val items: MutableList<PinnedItem>) :
+    List<LazyLayoutPinnedItemList.PinnedItem> by items {
     constructor() : this(SnapshotStateList())
 
     internal fun pin(item: PinnedItem) {
@@ -84,8 +79,8 @@
     }
 
     /**
-     * Item pinned in a lazy layout. Pinned item should be always measured and laid out,
-     * even if the item is beyond the boundaries of the layout.
+     * Item pinned in a lazy layout. Pinned item should be always measured and laid out, even if the
+     * item is beyond the boundaries of the layout.
      *
      * Note: this interface is a part of [LazyLayout] harness that allows for building custom lazy
      * layouts. LazyLayout and all corresponding APIs are still under development and are subject to
@@ -93,14 +88,12 @@
      */
     @ExperimentalFoundationApi
     sealed interface PinnedItem {
-        /**
-         * Key of the pinned item.
-         */
+        /** Key of the pinned item. */
         val key: Any?
 
         /**
-         * Last known index of the pinned item.
-         * Note: it is possible for index to change during lifetime of the object.
+         * Last known index of the pinned item. Note: it is possible for index to change during
+         * lifetime of the object.
          */
         val index: Int
     }
@@ -111,28 +104,25 @@
     override val key: Any?,
     private val pinnedItemList: LazyLayoutPinnedItemList,
 ) : PinnableContainer, PinnableContainer.PinnedHandle, LazyLayoutPinnedItemList.PinnedItem {
-    /**
-     * Current index associated with this item.
-     */
+    /** Current index associated with this item. */
     override var index by mutableIntStateOf(-1)
 
     /**
-     * It is a valid use case when users of this class call [pin] multiple times individually,
-     * so we want to do the unpinning only when all of the users called [release].
+     * It is a valid use case when users of this class call [pin] multiple times individually, so we
+     * want to do the unpinning only when all of the users called [release].
      */
     private var pinsCount by mutableIntStateOf(0)
 
-    /**
-     * Handle associated with the current [parentPinnableContainer].
-     */
+    /** Handle associated with the current [parentPinnableContainer]. */
     private var parentHandle by mutableStateOf<PinnableContainer.PinnedHandle?>(null)
 
     /**
-     * Current parent [PinnableContainer].
-     * Note that we should correctly re-pin if we pinned the previous container.
+     * Current parent [PinnableContainer]. Note that we should correctly re-pin if we pinned the
+     * previous container.
      */
     private var _parentPinnableContainer by mutableStateOf<PinnableContainer?>(null)
-    var parentPinnableContainer: PinnableContainer? get() = _parentPinnableContainer
+    var parentPinnableContainer: PinnableContainer?
+        get() = _parentPinnableContainer
         set(value) {
             Snapshot.withoutReadObservation {
                 val previous = _parentPinnableContainer
@@ -166,8 +156,6 @@
     }
 
     fun onDisposed() {
-        repeat(pinsCount) {
-            release()
-        }
+        repeat(pinsCount) { release() }
     }
 }
diff --git a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/layout/LazyLayoutPrefetchState.kt b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/layout/LazyLayoutPrefetchState.kt
index fc34a96..1518e8e 100644
--- a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/layout/LazyLayoutPrefetchState.kt
+++ b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/layout/LazyLayoutPrefetchState.kt
@@ -33,15 +33,14 @@
 /**
  * State for lazy items prefetching, used by lazy layouts to instruct the prefetcher.
  *
- * Note: this class is a part of [LazyLayout] harness that allows for building custom lazy
- * layouts. LazyLayout and all corresponding APIs are still under development and are subject to
- * change.
+ * Note: this class is a part of [LazyLayout] harness that allows for building custom lazy layouts.
+ * LazyLayout and all corresponding APIs are still under development and are subject to change.
  *
  * @param prefetchScheduler the [PrefetchScheduler] implementation to use to execute prefetch
- * requests. If null is provided, the default [PrefetchScheduler] for the platform will be used.
+ *   requests. If null is provided, the default [PrefetchScheduler] for the platform will be used.
  * @param onNestedPrefetch a callback which will be invoked when this LazyLayout is prefetched in
- * context of a parent LazyLayout, giving a chance to recursively prefetch its own children. See
- * [NestedPrefetchScope].
+ *   context of a parent LazyLayout, giving a chance to recursively prefetch its own children. See
+ *   [NestedPrefetchScope].
  */
 @ExperimentalFoundationApi
 @Stable
@@ -54,8 +53,8 @@
     internal var prefetchHandleProvider: PrefetchHandleProvider? = null
 
     /**
-     * Schedules precomposition for the new item. If you also want to premeasure the item please
-     * use a second overload accepting a [Constraints] param.
+     * Schedules precomposition for the new item. If you also want to premeasure the item please use
+     * a second overload accepting a [Constraints] param.
      *
      * @param index item index to prefetch.
      */
@@ -92,8 +91,8 @@
          * Marks this prefetch request as urgent, which is a way to communicate that the requested
          * item is expected to be needed during the next frame.
          *
-         * For urgent requests we can proceed with doing the prefetch even if the available time
-         * in the frame is less than we spend on similar prefetch requests on average.
+         * For urgent requests we can proceed with doing the prefetch even if the available time in
+         * the frame is less than we spend on similar prefetch requests on average.
          */
         fun markAsUrgent()
     }
@@ -102,7 +101,9 @@
 
         val requests: List<PrefetchRequest>
             get() = _requests
+
         private val _requests: MutableList<PrefetchRequest> = mutableListOf()
+
         override fun schedulePrefetch(index: Int) {
             schedulePrefetch(index, ZeroConstraints)
         }
@@ -140,8 +141,8 @@
      * Requests a child index to be prefetched as part of the prefetch of a parent LazyLayout.
      *
      * @param index the index of the child to prefetch.
-     * @param constraints [Constraints] to use for premeasuring. If null, the child will not
-     * be premeasured.
+     * @param constraints [Constraints] to use for premeasuring. If null, the child will not be
+     *   premeasured.
      */
     fun schedulePrefetch(index: Int, constraints: Constraints)
 }
@@ -157,15 +158,11 @@
     val averageCompositionTimeNanosByContentType = mutableObjectLongMapOf<Any>()
     val averageMeasureTimeNanosByContentType = mutableObjectLongMapOf<Any>()
 
-    /**
-     * The current average time composition has taken during prefetches of this LazyLayout.
-     */
+    /** The current average time composition has taken during prefetches of this LazyLayout. */
     var averageCompositionTimeNanos: Long = 0L
         private set
 
-    /**
-     * The current average time measure has taken during prefetches of this LazyLayout.
-     */
+    /** The current average time measure has taken during prefetches of this LazyLayout. */
     var averageMeasureTimeNanos: Long = 0L
         private set
 
@@ -217,14 +214,15 @@
 @ExperimentalFoundationApi
 private object DummyHandle : PrefetchHandle {
     override fun cancel() {}
+
     override fun markAsUrgent() {}
 }
 
 /**
  * PrefetchHandleProvider is used to connect the [LazyLayoutPrefetchState], which provides the API
  * to schedule prefetches, to a [LazyLayoutItemContentFactory] which resolves key and content from
- * an index, [SubcomposeLayoutState] which knows how to precompose/premeasure,
- * and a specific [PrefetchScheduler] used to execute a request.
+ * an index, [SubcomposeLayoutState] which knows how to precompose/premeasure, and a specific
+ * [PrefetchScheduler] used to execute a request.
  */
 @ExperimentalFoundationApi
 internal class PrefetchHandleProvider(
@@ -245,8 +243,7 @@
         index: Int,
         constraints: Constraints,
         prefetchMetrics: PrefetchMetrics,
-    ): PrefetchRequest =
-        HandleAndRequestImpl(index, constraints = constraints, prefetchMetrics)
+    ): PrefetchRequest = HandleAndRequestImpl(index, constraints = constraints, prefetchMetrics)
 
     @ExperimentalFoundationApi
     private inner class HandleAndRequestImpl(
@@ -258,14 +255,15 @@
         private var precomposeHandle: SubcomposeLayoutState.PrecomposedSlotHandle? = null
         private var isMeasured = false
         private var isCanceled = false
-        private val isComposed get() = precomposeHandle != null
+        private val isComposed
+            get() = precomposeHandle != null
+
         private var hasResolvedNestedPrefetches = false
         private var nestedPrefetchController: NestedPrefetchController? = null
         private var isUrgent = false
 
         private val isValid
-            get() = !isCanceled &&
-                index in 0 until itemContentFactory.itemProvider().itemCount
+            get() = !isCanceled && index in 0 until itemContentFactory.itemProvider().itemCount
 
         override fun cancel() {
             if (!isCanceled) {
@@ -295,15 +293,17 @@
 
             if (!isComposed) {
                 val estimatedPrecomposeTime: Long =
-                    if (contentType != null && prefetchMetrics
-                        .averageCompositionTimeNanosByContentType.contains(contentType))
+                    if (
+                        contentType != null &&
+                            prefetchMetrics.averageCompositionTimeNanosByContentType.contains(
+                                contentType
+                            )
+                    )
                         prefetchMetrics.averageCompositionTimeNanosByContentType[contentType]
                     else prefetchMetrics.averageCompositionTimeNanos
                 if (shouldExecute(estimatedPrecomposeTime)) {
                     prefetchMetrics.recordCompositionTiming(contentType) {
-                        trace("compose:lazy:prefetch:compose") {
-                            performComposition()
-                        }
+                        trace("compose:lazy:prefetch:compose") { performComposition() }
                     }
                 } else {
                     return true
@@ -317,7 +317,8 @@
             // lazy layouts)
             if (!isUrgent) {
                 // Nested prefetch logic is best-effort: if nested LazyLayout children are
-                // added/removed/updated after we've resolved nested prefetch states here or resolved
+                // added/removed/updated after we've resolved nested prefetch states here or
+                // resolved
                 // nestedPrefetchRequests below, those changes won't be taken into account.
                 if (!hasResolvedNestedPrefetches) {
                     if (availableTimeNanos() > 0) {
@@ -339,15 +340,17 @@
 
             if (!isMeasured && !constraints.isZero) {
                 val estimatedPremeasureTime: Long =
-                    if (contentType != null && prefetchMetrics.averageMeasureTimeNanosByContentType
-                        .contains(contentType))
+                    if (
+                        contentType != null &&
+                            prefetchMetrics.averageMeasureTimeNanosByContentType.contains(
+                                contentType
+                            )
+                    )
                         prefetchMetrics.averageMeasureTimeNanosByContentType[contentType]
                     else prefetchMetrics.averageMeasureTimeNanos
                 if (shouldExecute(estimatedPremeasureTime)) {
                     prefetchMetrics.recordMeasureTiming(contentType) {
-                        trace("compose:lazy:prefetch:measure") {
-                            performMeasure(constraints)
-                        }
+                        trace("compose:lazy:prefetch:measure") { performMeasure(constraints) }
                     }
                 } else {
                     return true
@@ -378,18 +381,20 @@
             }
             require(!isMeasured) { "Request was already measured!" }
             isMeasured = true
-            val handle = requireNotNull(precomposeHandle) {
-                "performComposition() must be called before performMeasure()"
-            }
+            val handle =
+                requireNotNull(precomposeHandle) {
+                    "performComposition() must be called before performMeasure()"
+                }
             repeat(handle.placeablesCount) { placeableIndex ->
                 handle.premeasure(placeableIndex, constraints)
             }
         }
 
         private fun resolveNestedPrefetchStates(): NestedPrefetchController? {
-            val precomposedSlotHandle = requireNotNull(precomposeHandle) {
-                "Should precompose before resolving nested prefetch states"
-            }
+            val precomposedSlotHandle =
+                requireNotNull(precomposeHandle) {
+                    "Should precompose before resolving nested prefetch states"
+                }
 
             var nestedStates: MutableList<LazyLayoutPrefetchState>? = null
             precomposedSlotHandle.traverseDescendants(TraversablePrefetchStateNodeKey) {
@@ -472,9 +477,8 @@
 internal fun Modifier.traversablePrefetchState(
     lazyLayoutPrefetchState: LazyLayoutPrefetchState?
 ): Modifier {
-    return lazyLayoutPrefetchState?.let {
-        this then TraversablePrefetchStateModifierElement(it)
-    } ?: this
+    return lazyLayoutPrefetchState?.let { this then TraversablePrefetchStateModifierElement(it) }
+        ?: this
 }
 
 @ExperimentalFoundationApi
diff --git a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/layout/LazyLayoutSemantics.kt b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/layout/LazyLayoutSemantics.kt
index 96007aa..a373688 100644
--- a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/layout/LazyLayoutSemantics.kt
+++ b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/layout/LazyLayoutSemantics.kt
@@ -44,13 +44,15 @@
     orientation: Orientation,
     userScrollEnabled: Boolean,
     reverseScrolling: Boolean,
-): Modifier = this then LazyLayoutSemanticsModifier(
-    itemProviderLambda = itemProviderLambda,
-    state = state,
-    orientation = orientation,
-    userScrollEnabled = userScrollEnabled,
-    reverseScrolling = reverseScrolling,
-)
+): Modifier =
+    this then
+        LazyLayoutSemanticsModifier(
+            itemProviderLambda = itemProviderLambda,
+            state = state,
+            orientation = orientation,
+            userScrollEnabled = userScrollEnabled,
+            reverseScrolling = reverseScrolling,
+        )
 
 @OptIn(ExperimentalFoundationApi::class)
 private class LazyLayoutSemanticsModifier(
@@ -60,13 +62,14 @@
     val userScrollEnabled: Boolean,
     val reverseScrolling: Boolean,
 ) : ModifierNodeElement<LazyLayoutSemanticsModifierNode>() {
-    override fun create(): LazyLayoutSemanticsModifierNode = LazyLayoutSemanticsModifierNode(
-        itemProviderLambda = itemProviderLambda,
-        state = state,
-        orientation = orientation,
-        userScrollEnabled = userScrollEnabled,
-        reverseScrolling = reverseScrolling,
-    )
+    override fun create(): LazyLayoutSemanticsModifierNode =
+        LazyLayoutSemanticsModifierNode(
+            itemProviderLambda = itemProviderLambda,
+            state = state,
+            orientation = orientation,
+            userScrollEnabled = userScrollEnabled,
+            reverseScrolling = reverseScrolling,
+        )
 
     override fun update(node: LazyLayoutSemanticsModifierNode) {
         node.update(
@@ -116,8 +119,13 @@
 
     override val shouldAutoInvalidate: Boolean
         get() = false
-    private val isVertical get() = orientation == Orientation.Vertical
-    private val collectionInfo get() = state.collectionInfo()
+
+    private val isVertical
+        get() = orientation == Orientation.Vertical
+
+    private val collectionInfo
+        get() = state.collectionInfo()
+
     private lateinit var scrollAxisRange: ScrollAxisRange
 
     private val indexForKeyMapping: (Any) -> Int = { needle ->
@@ -158,8 +166,8 @@
 
         // These values are used to build different cached values. If they, we need to rebuild the
         // cache.
-        if (this.userScrollEnabled != userScrollEnabled ||
-            this.reverseScrolling != reverseScrolling
+        if (
+            this.userScrollEnabled != userScrollEnabled || this.reverseScrolling != reverseScrolling
         ) {
             this.userScrollEnabled = userScrollEnabled
             this.reverseScrolling = reverseScrolling
@@ -178,9 +186,7 @@
             horizontalScrollAxisRange = scrollAxisRange
         }
 
-        scrollToIndexAction?.let {
-            scrollToIndex(action = it)
-        }
+        scrollToIndexAction?.let { scrollToIndex(action = it) }
 
         getScrollViewportLength { (state.viewport - state.contentPadding).toFloat() }
 
@@ -188,27 +194,27 @@
     }
 
     private fun updateCachedSemanticsValues() {
-        scrollAxisRange = ScrollAxisRange(
-            value = { state.scrollOffset },
-            maxValue = { state.maxScrollOffset },
-            reverseScrolling = reverseScrolling
-        )
+        scrollAxisRange =
+            ScrollAxisRange(
+                value = { state.scrollOffset },
+                maxValue = { state.maxScrollOffset },
+                reverseScrolling = reverseScrolling
+            )
 
-        scrollToIndexAction = if (userScrollEnabled) {
-            { index ->
-                val itemProvider = itemProviderLambda()
-                require(index >= 0 && index < itemProvider.itemCount) {
-                    "Can't scroll to index $index, it is out of " +
-                        "bounds [0, ${itemProvider.itemCount})"
+        scrollToIndexAction =
+            if (userScrollEnabled) {
+                { index ->
+                    val itemProvider = itemProviderLambda()
+                    require(index >= 0 && index < itemProvider.itemCount) {
+                        "Can't scroll to index $index, it is out of " +
+                            "bounds [0, ${itemProvider.itemCount})"
+                    }
+                    coroutineScope.launch { state.scrollToItem(index) }
+                    true
                 }
-                coroutineScope.launch {
-                    state.scrollToItem(index)
-                }
-                true
+            } else {
+                null
             }
-        } else {
-            null
-        }
     }
 }
 
@@ -219,6 +225,7 @@
     val maxScrollOffset: Float
 
     fun collectionInfo(): CollectionInfo
+
     suspend fun scrollToItem(index: Int)
 }
 
@@ -250,11 +257,12 @@
     canScrollForward: Boolean
 ): Float {
     return if (canScrollForward) {
-        // If we can scroll further, indicate that by setting it slightly higher than
-        // the current value
-        estimatedLazyScrollOffset(firstVisibleItemIndex, firstVisibleItemScrollOffset) + 100
-    } else {
-        // If we can't scroll further, the current value is the max
-        estimatedLazyScrollOffset(firstVisibleItemIndex, firstVisibleItemScrollOffset)
-    }.toFloat()
+            // If we can scroll further, indicate that by setting it slightly higher than
+            // the current value
+            estimatedLazyScrollOffset(firstVisibleItemIndex, firstVisibleItemScrollOffset) + 100
+        } else {
+            // If we can't scroll further, the current value is the max
+            estimatedLazyScrollOffset(firstVisibleItemIndex, firstVisibleItemScrollOffset)
+        }
+        .toFloat()
 }
diff --git a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/layout/LazySaveableStateHolder.kt b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/layout/LazySaveableStateHolder.kt
index c4c4a75..266a68a 100644
--- a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/layout/LazySaveableStateHolder.kt
+++ b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/layout/LazySaveableStateHolder.kt
@@ -30,40 +30,34 @@
 import androidx.compose.runtime.setValue
 
 /**
- * Provides [SaveableStateHolder] to be used with the lazy layout items.
- * This allows to save the state of the items like inner LazyRow scroll position which such
- * items are scrolled away in order to restore it when this item is visible again.
- * However on top of the default logic provided via [rememberSaveableStateHolder] this instance
- * will only save the items which are currently visible when the parent [SaveableStateRegistry]
- * triggers [SaveableStateRegistry.performSave] in order to save on the space we use in the
- * Android`s Bundle to not cause crash with TransactionTooLargeException.
+ * Provides [SaveableStateHolder] to be used with the lazy layout items. This allows to save the
+ * state of the items like inner LazyRow scroll position which such items are scrolled away in order
+ * to restore it when this item is visible again. However on top of the default logic provided via
+ * [rememberSaveableStateHolder] this instance will only save the items which are currently visible
+ * when the parent [SaveableStateRegistry] triggers [SaveableStateRegistry.performSave] in order to
+ * save on the space we use in the Android`s Bundle to not cause crash with
+ * TransactionTooLargeException.
  */
 @Composable
 internal fun LazySaveableStateHolderProvider(content: @Composable (SaveableStateHolder) -> Unit) {
     val currentRegistry = LocalSaveableStateRegistry.current
-    val holder = rememberSaveable(
-        currentRegistry, saver = LazySaveableStateHolder.saver(currentRegistry)
-    ) {
-        LazySaveableStateHolder(currentRegistry, emptyMap())
-    }
+    val holder =
+        rememberSaveable(currentRegistry, saver = LazySaveableStateHolder.saver(currentRegistry)) {
+            LazySaveableStateHolder(currentRegistry, emptyMap())
+        }
     CompositionLocalProvider(LocalSaveableStateRegistry provides holder) {
         holder.wrappedHolder = rememberSaveableStateHolder()
         content(holder)
     }
 }
 
-private class LazySaveableStateHolder(
-    private val wrappedRegistry: SaveableStateRegistry
-) : SaveableStateRegistry by wrappedRegistry, SaveableStateHolder {
+private class LazySaveableStateHolder(private val wrappedRegistry: SaveableStateRegistry) :
+    SaveableStateRegistry by wrappedRegistry, SaveableStateHolder {
 
     constructor(
         parentRegistry: SaveableStateRegistry?,
         restoredValues: Map<String, List<Any?>>?
-    ) : this(
-        SaveableStateRegistry(restoredValues) {
-            parentRegistry?.canBeSaved(it) ?: true
-        }
-    )
+    ) : this(SaveableStateRegistry(restoredValues) { parentRegistry?.canBeSaved(it) ?: true })
 
     var wrappedHolder by mutableStateOf<SaveableStateHolder?>(null)
 
@@ -72,36 +66,29 @@
     override fun performSave(): Map<String, List<Any?>> {
         val holder = wrappedHolder
         if (holder != null) {
-            previouslyComposedKeys.forEach {
-                holder.removeState(it)
-            }
+            previouslyComposedKeys.forEach { holder.removeState(it) }
         }
         return wrappedRegistry.performSave()
     }
 
     @Composable
     override fun SaveableStateProvider(key: Any, content: @Composable () -> Unit) {
-        requireNotNull(wrappedHolder) { "null wrappedHolder" }
-            .SaveableStateProvider(key, content)
+        requireNotNull(wrappedHolder) { "null wrappedHolder" }.SaveableStateProvider(key, content)
         DisposableEffect(key) {
             previouslyComposedKeys -= key
-            onDispose {
-                previouslyComposedKeys += key
-            }
+            onDispose { previouslyComposedKeys += key }
         }
     }
 
     override fun removeState(key: Any) {
-        requireNotNull(wrappedHolder) { "null wrappedHolder" }
-            .removeState(key)
+        requireNotNull(wrappedHolder) { "null wrappedHolder" }.removeState(key)
     }
 
     companion object {
         fun saver(parentRegistry: SaveableStateRegistry?) =
-            Saver<LazySaveableStateHolder, Map<String, List<Any?>>>(save = {
-                it.performSave().ifEmpty { null }
-            }, restore = { restored ->
-                LazySaveableStateHolder(parentRegistry, restored)
-            })
+            Saver<LazySaveableStateHolder, Map<String, List<Any?>>>(
+                save = { it.performSave().ifEmpty { null } },
+                restore = { restored -> LazySaveableStateHolder(parentRegistry, restored) }
+            )
     }
 }
diff --git a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/layout/ObservableScopeInvalidator.kt b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/layout/ObservableScopeInvalidator.kt
index 9a07014..dc2b9cf 100644
--- a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/layout/ObservableScopeInvalidator.kt
+++ b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/layout/ObservableScopeInvalidator.kt
@@ -21,8 +21,8 @@
 import androidx.compose.runtime.neverEqualPolicy
 
 /**
- * Simple wrapper over a mutable state which allows to invalidate an observable scope.
- * We might consider providing something like this in the public api in the future.
+ * Simple wrapper over a mutable state which allows to invalidate an observable scope. We might
+ * consider providing something like this in the public api in the future.
  */
 @JvmInline
 internal value class ObservableScopeInvalidator(
diff --git a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/layout/PrefetchScheduler.kt b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/layout/PrefetchScheduler.kt
index 131eb4f..2d87228 100644
--- a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/layout/PrefetchScheduler.kt
+++ b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/layout/PrefetchScheduler.kt
@@ -59,14 +59,15 @@
      * finish it within [PrefetchRequestScope.availableTimeNanos].
      *
      * @return whether this request has more work it wants to do, but ran out of time. `true`
-     * indicates this request wants to have [execute] called again to do more work, while `false`
-     * indicates its work is complete.
+     *   indicates this request wants to have [execute] called again to do more work, while `false`
+     *   indicates its work is complete.
      */
     fun PrefetchRequestScope.execute(): Boolean
 }
 
 /**
- * Scope for [PrefetchRequest.execute], supplying info about how much time it has to execute requests.
+ * Scope for [PrefetchRequest.execute], supplying info about how much time it has to execute
+ * requests.
  */
 @ExperimentalFoundationApi
 interface PrefetchRequestScope {
diff --git a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/staggeredgrid/LazyStaggeredGrid.kt b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/staggeredgrid/LazyStaggeredGrid.kt
index f55e36f..3eecd56 100644
--- a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/staggeredgrid/LazyStaggeredGrid.kt
+++ b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/staggeredgrid/LazyStaggeredGrid.kt
@@ -62,55 +62,58 @@
     val itemProviderLambda = rememberStaggeredGridItemProviderLambda(state, content)
     val coroutineScope = rememberCoroutineScope()
     val graphicsContext = LocalGraphicsContext.current
-    val measurePolicy = rememberStaggeredGridMeasurePolicy(
-        state,
-        itemProviderLambda,
-        contentPadding,
-        reverseLayout,
-        orientation,
-        mainAxisSpacing,
-        crossAxisSpacing,
-        coroutineScope,
-        slots,
-        graphicsContext
-    )
+    val measurePolicy =
+        rememberStaggeredGridMeasurePolicy(
+            state,
+            itemProviderLambda,
+            contentPadding,
+            reverseLayout,
+            orientation,
+            mainAxisSpacing,
+            crossAxisSpacing,
+            coroutineScope,
+            slots,
+            graphicsContext
+        )
     val semanticState = rememberLazyStaggeredGridSemanticState(state, reverseLayout)
 
-    val reverseDirection = ScrollableDefaults.reverseDirection(
-        LocalLayoutDirection.current,
-        orientation,
-        reverseLayout
-    )
+    val reverseDirection =
+        ScrollableDefaults.reverseDirection(
+            LocalLayoutDirection.current,
+            orientation,
+            reverseLayout
+        )
 
     LazyLayout(
-        modifier = modifier
-            .then(state.remeasurementModifier)
-            .then(state.awaitLayoutModifier)
-            .lazyLayoutSemantics(
-                itemProviderLambda = itemProviderLambda,
-                state = semanticState,
-                orientation = orientation,
-                userScrollEnabled = userScrollEnabled,
-                reverseScrolling = reverseLayout,
-            )
-            .lazyLayoutBeyondBoundsModifier(
-                state = rememberLazyStaggeredGridBeyondBoundsState(state = state),
-                beyondBoundsInfo = state.beyondBoundsInfo,
-                reverseLayout = reverseLayout,
-                layoutDirection = LocalLayoutDirection.current,
-                orientation = orientation,
-                enabled = userScrollEnabled
-            )
-            .then(state.itemAnimator.modifier)
-            .scrollingContainer(
-                state = state,
-                orientation = orientation,
-                enabled = userScrollEnabled,
-                reverseDirection = reverseDirection,
-                flingBehavior = flingBehavior,
-                interactionSource = state.mutableInteractionSource,
-                overscrollEffect = ScrollableDefaults.overscrollEffect()
-            ),
+        modifier =
+            modifier
+                .then(state.remeasurementModifier)
+                .then(state.awaitLayoutModifier)
+                .lazyLayoutSemantics(
+                    itemProviderLambda = itemProviderLambda,
+                    state = semanticState,
+                    orientation = orientation,
+                    userScrollEnabled = userScrollEnabled,
+                    reverseScrolling = reverseLayout,
+                )
+                .lazyLayoutBeyondBoundsModifier(
+                    state = rememberLazyStaggeredGridBeyondBoundsState(state = state),
+                    beyondBoundsInfo = state.beyondBoundsInfo,
+                    reverseLayout = reverseLayout,
+                    layoutDirection = LocalLayoutDirection.current,
+                    orientation = orientation,
+                    enabled = userScrollEnabled
+                )
+                .then(state.itemAnimator.modifier)
+                .scrollingContainer(
+                    state = state,
+                    orientation = orientation,
+                    enabled = userScrollEnabled,
+                    reverseDirection = reverseDirection,
+                    flingBehavior = flingBehavior,
+                    interactionSource = state.mutableInteractionSource,
+                    overscrollEffect = ScrollableDefaults.overscrollEffect()
+                ),
         prefetchState = state.prefetchState,
         itemProvider = itemProviderLambda,
         measurePolicy = measurePolicy
@@ -118,7 +121,4 @@
 }
 
 /** Slot configuration of staggered grid */
-internal class LazyStaggeredGridSlots(
-    val positions: IntArray,
-    val sizes: IntArray
-)
+internal class LazyStaggeredGridSlots(val positions: IntArray, val sizes: IntArray)
diff --git a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/staggeredgrid/LazyStaggeredGridAnimateScrollScope.kt b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/staggeredgrid/LazyStaggeredGridAnimateScrollScope.kt
index 3b8621c..37531ea 100644
--- a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/staggeredgrid/LazyStaggeredGridAnimateScrollScope.kt
+++ b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/staggeredgrid/LazyStaggeredGridAnimateScrollScope.kt
@@ -24,23 +24,23 @@
 import androidx.compose.ui.util.fastSumBy
 
 @ExperimentalFoundationApi
-internal class LazyStaggeredGridAnimateScrollScope(
-    private val state: LazyStaggeredGridState
-) : LazyLayoutAnimateScrollScope {
+internal class LazyStaggeredGridAnimateScrollScope(private val state: LazyStaggeredGridState) :
+    LazyLayoutAnimateScrollScope {
 
-    override val firstVisibleItemIndex: Int get() = state.firstVisibleItemIndex
+    override val firstVisibleItemIndex: Int
+        get() = state.firstVisibleItemIndex
 
-    override val firstVisibleItemScrollOffset: Int get() = state.firstVisibleItemScrollOffset
+    override val firstVisibleItemScrollOffset: Int
+        get() = state.firstVisibleItemScrollOffset
 
     override val lastVisibleItemIndex: Int
         get() = state.layoutInfo.visibleItemsInfo.lastOrNull()?.index ?: 0
 
-    override val itemCount: Int get() = state.layoutInfo.totalItemsCount
+    override val itemCount: Int
+        get() = state.layoutInfo.totalItemsCount
 
     override fun ScrollScope.snapToItem(index: Int, scrollOffset: Int) {
-        with(state) {
-            snapToItemInternal(index, scrollOffset, forceRemeasure = true)
-        }
+        with(state) { snapToItemInternal(index, scrollOffset, forceRemeasure = true) }
     }
 
     override fun calculateDistanceTo(targetIndex: Int): Float {
@@ -55,10 +55,11 @@
             averageMainAxisItemSize * lineDiff.toFloat() - firstVisibleItemScrollOffset
         } else {
             if (layoutInfo.orientation == Orientation.Vertical) {
-                visibleItem.offset.y
-            } else {
-                visibleItem.offset.x
-            }.toFloat()
+                    visibleItem.offset.y
+                } else {
+                    visibleItem.offset.x
+                }
+                .toFloat()
         }
     }
 
@@ -68,13 +69,14 @@
 
     private fun calculateVisibleItemsAverageSize(layoutInfo: LazyStaggeredGridLayoutInfo): Int {
         val visibleItems = layoutInfo.visibleItemsInfo
-        val itemSizeSum = visibleItems.fastSumBy {
-            if (layoutInfo.orientation == Orientation.Vertical) {
-                it.size.height
-            } else {
-                it.size.width
+        val itemSizeSum =
+            visibleItems.fastSumBy {
+                if (layoutInfo.orientation == Orientation.Vertical) {
+                    it.size.height
+                } else {
+                    it.size.width
+                }
             }
-        }
         return itemSizeSum / visibleItems.size + layoutInfo.mainAxisItemSpacing
     }
 }
diff --git a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/staggeredgrid/LazyStaggeredGridBeyondBoundsModifier.kt b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/staggeredgrid/LazyStaggeredGridBeyondBoundsModifier.kt
index e39c290..1041f78 100644
--- a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/staggeredgrid/LazyStaggeredGridBeyondBoundsModifier.kt
+++ b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/staggeredgrid/LazyStaggeredGridBeyondBoundsModifier.kt
@@ -24,9 +24,7 @@
 internal fun rememberLazyStaggeredGridBeyondBoundsState(
     state: LazyStaggeredGridState
 ): LazyLayoutBeyondBoundsState {
-    return remember(state) {
-        LazyStaggeredGridBeyondBoundsState(state)
-    }
+    return remember(state) { LazyStaggeredGridBeyondBoundsState(state) }
 }
 
 internal class LazyStaggeredGridBeyondBoundsState(
@@ -39,10 +37,13 @@
 
     override val itemCount: Int
         get() = state.layoutInfo.totalItemsCount
+
     override val hasVisibleItems: Boolean
         get() = state.layoutInfo.visibleItemsInfo.isNotEmpty()
+
     override val firstPlacedIndex: Int
         get() = state.firstVisibleItemIndex
+
     override val lastPlacedIndex: Int
         get() = state.layoutInfo.visibleItemsInfo.last().index
 }
diff --git a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/staggeredgrid/LazyStaggeredGridCells.kt b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/staggeredgrid/LazyStaggeredGridCells.kt
index 568e070..26e2c0d 100644
--- a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/staggeredgrid/LazyStaggeredGridCells.kt
+++ b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/staggeredgrid/LazyStaggeredGridCells.kt
@@ -23,34 +23,34 @@
 import androidx.compose.ui.unit.dp
 
 /**
- * This class describes the count and the sizes of columns in vertical staggered grids,
- * or rows in horizontal staggered grids.
+ * This class describes the count and the sizes of columns in vertical staggered grids, or rows in
+ * horizontal staggered grids.
  */
 @Stable
 interface StaggeredGridCells {
     /**
-     * Calculates the number of cells and their cross axis size based on
-     * [availableSize] and [spacing].
+     * Calculates the number of cells and their cross axis size based on [availableSize] and
+     * [spacing].
      *
      * For example, in vertical grids, [spacing] is passed from the grid's [Arrangement.Horizontal].
      * The [Arrangement.Horizontal] will also be used to arrange items in a row if the grid is wider
      * than the calculated sum of columns.
      *
-     * Note that the calculated cross axis sizes will be considered in an RTL-aware manner --
-     * if the staggered grid is vertical and the layout direction is RTL, the first width in the
-     * returned list will correspond to the rightmost column.
+     * Note that the calculated cross axis sizes will be considered in an RTL-aware manner -- if the
+     * staggered grid is vertical and the layout direction is RTL, the first width in the returned
+     * list will correspond to the rightmost column.
      *
      * @param availableSize available size on cross axis, e.g. width of [LazyVerticalStaggeredGrid].
      * @param spacing cross axis spacing, e.g. horizontal spacing for [LazyVerticalStaggeredGrid].
-     * The spacing is passed from the corresponding [Arrangement] param of the lazy grid.
+     *   The spacing is passed from the corresponding [Arrangement] param of the lazy grid.
      */
     fun Density.calculateCrossAxisCellSizes(availableSize: Int, spacing: Int): IntArray
 
     /**
      * Defines a grid with fixed number of rows or columns.
      *
-     * For example, for the vertical [LazyVerticalStaggeredGrid] Fixed(3) would mean that
-     * there are 3 columns 1/3 of the parent width.
+     * For example, for the vertical [LazyVerticalStaggeredGrid] Fixed(3) would mean that there are
+     * 3 columns 1/3 of the parent width.
      */
     class Fixed(private val count: Int) : StaggeredGridCells {
         init {
@@ -74,13 +74,13 @@
     }
 
     /**
-     * Defines a grid with as many rows or columns as possible on the condition that
-     * every cell has at least [minSize] space and all extra space distributed evenly.
+     * Defines a grid with as many rows or columns as possible on the condition that every cell has
+     * at least [minSize] space and all extra space distributed evenly.
      *
      * For example, for the vertical [LazyVerticalStaggeredGrid] Adaptive(20.dp) would mean that
-     * there will be as many columns as possible and every column will be at least 20.dp
-     * and all the columns will have equal width. If the screen is 88.dp wide then
-     * there will be 4 columns 22.dp each.
+     * there will be as many columns as possible and every column will be at least 20.dp and all the
+     * columns will have equal width. If the screen is 88.dp wide then there will be 4 columns 22.dp
+     * each.
      */
     class Adaptive(private val minSize: Dp) : StaggeredGridCells {
         init {
@@ -105,15 +105,15 @@
     }
 
     /**
-     * Defines a grid with as many rows or columns as possible on the condition that
-     * every cell takes exactly [size] space. The remaining space will be arranged through
-     * [LazyStaggeredGrid] arrangements on corresponding axis. If [size] is larger than
-     * container size, the cell will be size to match the container.
+     * Defines a grid with as many rows or columns as possible on the condition that every cell
+     * takes exactly [size] space. The remaining space will be arranged through [LazyStaggeredGrid]
+     * arrangements on corresponding axis. If [size] is larger than container size, the cell will be
+     * size to match the container.
      *
      * For example, for the vertical [LazyVerticalStaggeredGrid] FixedSize(20.dp) would mean that
-     * there will be as many columns as possible and every column will be exactly 20.dp.
-     * If the screen is 88.dp wide tne there will be 4 columns 20.dp each with remaining 8.dp
-     * distributed through [Arrangement.Horizontal].
+     * there will be as many columns as possible and every column will be exactly 20.dp. If the
+     * screen is 88.dp wide tne there will be 4 columns 20.dp each with remaining 8.dp distributed
+     * through [Arrangement.Horizontal].
      */
     class FixedSize(private val size: Dp) : StaggeredGridCells {
         override fun Density.calculateCrossAxisCellSizes(
@@ -139,11 +139,7 @@
     }
 }
 
-private fun calculateCellsCrossAxisSizeImpl(
-    gridSize: Int,
-    slotCount: Int,
-    spacing: Int
-): IntArray {
+private fun calculateCellsCrossAxisSizeImpl(gridSize: Int, slotCount: Int, spacing: Int): IntArray {
     val gridSizeWithoutSpacing = gridSize - spacing * (slotCount - 1)
     val slotSize = gridSizeWithoutSpacing / slotCount
     val remainingPixels = gridSizeWithoutSpacing % slotCount
diff --git a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/staggeredgrid/LazyStaggeredGridDsl.kt b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/staggeredgrid/LazyStaggeredGridDsl.kt
index f30b32c..7c397b5 100644
--- a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/staggeredgrid/LazyStaggeredGridDsl.kt
+++ b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/staggeredgrid/LazyStaggeredGridDsl.kt
@@ -36,27 +36,30 @@
  * Vertical staggered grid layout that composes and lays out only items currently visible on screen.
  *
  * Sample:
+ *
  * @sample androidx.compose.foundation.samples.LazyVerticalStaggeredGridSample
  *
  * Sample with custom item spans:
+ *
  * @sample androidx.compose.foundation.samples.LazyVerticalStaggeredGridSpanSample
  *
  * @param columns description of the size and number of staggered grid columns.
  * @param modifier modifier to apply to the layout.
  * @param state state object that can be used to control and observe staggered grid state.
  * @param contentPadding padding around the content.
- * @param reverseLayout reverse the direction of scrolling and layout. When `true`, items are
- * laid out in the reverse order and [LazyStaggeredGridState.firstVisibleItemIndex] == 0 means
- * that grid is scrolled to the bottom.
+ * @param reverseLayout reverse the direction of scrolling and layout. When `true`, items are laid
+ *   out in the reverse order and [LazyStaggeredGridState.firstVisibleItemIndex] == 0 means that
+ *   grid is scrolled to the bottom.
  * @param verticalItemSpacing vertical spacing between items.
  * @param horizontalArrangement arrangement specifying horizontal spacing between items. The item
- *  arrangement specifics are ignored for now.
+ *   arrangement specifics are ignored for now.
  * @param flingBehavior logic responsible for handling fling.
  * @param userScrollEnabled whether scroll with gestures or accessibility actions are allowed. It is
- *  still possible to scroll programmatically through state when [userScrollEnabled] is set to false
+ *   still possible to scroll programmatically through state when [userScrollEnabled] is set to
+ *   false
  * @param content a lambda describing the staggered grid content. Inside this block you can use
- *  [LazyStaggeredGridScope.items] to present list of items or [LazyStaggeredGridScope.item] for a
- *  single one.
+ *   [LazyStaggeredGridScope.items] to present list of items or [LazyStaggeredGridScope.item] for a
+ *   single one.
  */
 @Composable
 fun LazyVerticalStaggeredGrid(
@@ -92,61 +95,63 @@
     columns: StaggeredGridCells,
     horizontalArrangement: Arrangement.Horizontal,
     contentPadding: PaddingValues
-) = remember<LazyGridStaggeredGridSlotsProvider>(
-    columns,
-    horizontalArrangement,
-    contentPadding,
-) {
-    LazyStaggeredGridSlotCache { constraints ->
-        require(constraints.maxWidth != Constraints.Infinity) {
-            "LazyVerticalStaggeredGrid's width should be bound by parent."
-        }
-        val horizontalPadding =
-            contentPadding.calculateStartPadding(LayoutDirection.Ltr) +
-                contentPadding.calculateEndPadding(LayoutDirection.Ltr)
-        val gridWidth = constraints.maxWidth - horizontalPadding.roundToPx()
-        with(columns) {
-            calculateCrossAxisCellSizes(
-                gridWidth,
-                horizontalArrangement.spacing.roundToPx()
-            ).let { sizes ->
-                val positions = IntArray(sizes.size)
-                with(horizontalArrangement) {
-                    // Arrange with Ltr here, as placement will reverse positions if needed
-                    arrange(gridWidth, sizes, LayoutDirection.Ltr, positions)
-                }
-                LazyStaggeredGridSlots(positions, sizes)
+) =
+    remember<LazyGridStaggeredGridSlotsProvider>(
+        columns,
+        horizontalArrangement,
+        contentPadding,
+    ) {
+        LazyStaggeredGridSlotCache { constraints ->
+            require(constraints.maxWidth != Constraints.Infinity) {
+                "LazyVerticalStaggeredGrid's width should be bound by parent."
+            }
+            val horizontalPadding =
+                contentPadding.calculateStartPadding(LayoutDirection.Ltr) +
+                    contentPadding.calculateEndPadding(LayoutDirection.Ltr)
+            val gridWidth = constraints.maxWidth - horizontalPadding.roundToPx()
+            with(columns) {
+                calculateCrossAxisCellSizes(gridWidth, horizontalArrangement.spacing.roundToPx())
+                    .let { sizes ->
+                        val positions = IntArray(sizes.size)
+                        with(horizontalArrangement) {
+                            // Arrange with Ltr here, as placement will reverse positions if needed
+                            arrange(gridWidth, sizes, LayoutDirection.Ltr, positions)
+                        }
+                        LazyStaggeredGridSlots(positions, sizes)
+                    }
             }
         }
     }
-}
 
 /**
- * Horizontal staggered grid layout that composes and lays out only items currently
- * visible on screen.
+ * Horizontal staggered grid layout that composes and lays out only items currently visible on
+ * screen.
  *
  * Sample:
+ *
  * @sample androidx.compose.foundation.samples.LazyHorizontalStaggeredGridSample
  *
  * Sample with custom item spans:
+ *
  * @sample androidx.compose.foundation.samples.LazyHorizontalStaggeredGridSpanSample
  *
  * @param rows description of the size and number of staggered grid columns.
  * @param modifier modifier to apply to the layout.
  * @param state state object that can be used to control and observe staggered grid state.
  * @param contentPadding padding around the content.
- * @param reverseLayout reverse the direction of scrolling and layout. When `true`, items are
- * laid out in the reverse order and [LazyStaggeredGridState.firstVisibleItemIndex] == 0 means
- * that grid is scrolled to the end.
+ * @param reverseLayout reverse the direction of scrolling and layout. When `true`, items are laid
+ *   out in the reverse order and [LazyStaggeredGridState.firstVisibleItemIndex] == 0 means that
+ *   grid is scrolled to the end.
  * @param verticalArrangement arrangement specifying vertical spacing between items. The item
- *  arrangement specifics are ignored for now.
+ *   arrangement specifics are ignored for now.
  * @param horizontalItemSpacing horizontal spacing between items.
  * @param flingBehavior logic responsible for handling fling.
  * @param userScrollEnabled whether scroll with gestures or accessibility actions are allowed. It is
- *  still possible to scroll programmatically through state when [userScrollEnabled] is set to false
+ *   still possible to scroll programmatically through state when [userScrollEnabled] is set to
+ *   false
  * @param content a lambda describing the staggered grid content. Inside this block you can use
- *  [LazyStaggeredGridScope.items] to present list of items or [LazyStaggeredGridScope.item] for a
- *  single one.
+ *   [LazyStaggeredGridScope.items] to present list of items or [LazyStaggeredGridScope.item] for a
+ *   single one.
  */
 @Composable
 fun LazyHorizontalStaggeredGrid(
@@ -182,32 +187,29 @@
     rows: StaggeredGridCells,
     verticalArrangement: Arrangement.Vertical,
     contentPadding: PaddingValues
-) = remember<LazyGridStaggeredGridSlotsProvider>(
-    rows,
-    verticalArrangement,
-    contentPadding,
-) {
-    LazyStaggeredGridSlotCache { constraints ->
-        require(constraints.maxHeight != Constraints.Infinity) {
-            "LazyHorizontalStaggeredGrid's height should be bound by parent."
-        }
-        val verticalPadding = contentPadding.calculateTopPadding() +
-            contentPadding.calculateBottomPadding()
-        val gridHeight = constraints.maxHeight - verticalPadding.roundToPx()
-        with(rows) {
-            calculateCrossAxisCellSizes(
-                gridHeight,
-                verticalArrangement.spacing.roundToPx()
-            ).let { sizes ->
-                val positions = IntArray(sizes.size)
-                with(verticalArrangement) {
-                    arrange(gridHeight, sizes, positions)
-                }
-                LazyStaggeredGridSlots(positions, sizes)
+) =
+    remember<LazyGridStaggeredGridSlotsProvider>(
+        rows,
+        verticalArrangement,
+        contentPadding,
+    ) {
+        LazyStaggeredGridSlotCache { constraints ->
+            require(constraints.maxHeight != Constraints.Infinity) {
+                "LazyHorizontalStaggeredGrid's height should be bound by parent."
+            }
+            val verticalPadding =
+                contentPadding.calculateTopPadding() + contentPadding.calculateBottomPadding()
+            val gridHeight = constraints.maxHeight - verticalPadding.roundToPx()
+            with(rows) {
+                calculateCrossAxisCellSizes(gridHeight, verticalArrangement.spacing.roundToPx())
+                    .let { sizes ->
+                        val positions = IntArray(sizes.size)
+                        with(verticalArrangement) { arrange(gridHeight, sizes, positions) }
+                        LazyStaggeredGridSlots(positions, sizes)
+                    }
             }
         }
     }
-}
 
 // Note: Implementing function interface is prohibited in K/JS (class A: () -> Unit)
 // therefore we workaround this limitation by inheriting a fun interface instead
@@ -227,48 +229,43 @@
         with(density) {
             if (
                 cachedSizes != null &&
-                cachedConstraints == constraints &&
-                cachedDensity == this.density
+                    cachedConstraints == constraints &&
+                    cachedDensity == this.density
             ) {
                 return cachedSizes!!
             }
 
             cachedConstraints = constraints
             cachedDensity = this.density
-            return calculation(constraints).also {
-                cachedSizes = it
-            }
+            return calculation(constraints).also { cachedSizes = it }
         }
     }
 }
 
 /** Dsl marker for [LazyStaggeredGridScope] below */
-@DslMarker
-internal annotation class LazyStaggeredGridScopeMarker
+@DslMarker internal annotation class LazyStaggeredGridScopeMarker
 
-/**
- * Receiver scope for [LazyVerticalStaggeredGrid] and [LazyHorizontalStaggeredGrid]
- */
+/** Receiver scope for [LazyVerticalStaggeredGrid] and [LazyHorizontalStaggeredGrid] */
 @LazyStaggeredGridScopeMarker
 sealed interface LazyStaggeredGridScope {
 
     /**
      * Add a single item to the staggered grid.
      *
-     * @param key a stable and unique key representing the item. The key
-     *  MUST be saveable via Bundle on Android. If set to null (by default), the position of the
-     *  item will be used as a key instead.
-     *  Using the same key for multiple items in the staggered grid is not allowed.
-     *  This can be overridden by calling [LazyStaggeredGridState.requestScrollToItem].
+     * @param key a stable and unique key representing the item. The key MUST be saveable via Bundle
+     *   on Android. If set to null (by default), the position of the item will be used as a key
+     *   instead. Using the same key for multiple items in the staggered grid is not allowed. This
+     *   can be overridden by calling [LazyStaggeredGridState.requestScrollToItem].
      *
-     *  When you specify the key the scroll position will be maintained based on the key, which
-     *  means if you add/remove items before the current visible item the item with the given key
-     *  will be kept as the first visible one.
-     * @param contentType a content type representing the item. Content for item of
-     *  the same type can be reused more efficiently. null is a valid type as well and items
-     *  of such type will be considered compatible.
+     * When you specify the key the scroll position will be maintained based on the key, which means
+     * if you add/remove items before the current visible item the item with the given key will be
+     * kept as the first visible one.
+     *
+     * @param contentType a content type representing the item. Content for item of the same type
+     *   can be reused more efficiently. null is a valid type as well and items of such type will be
+     *   considered compatible.
      * @param span a custom span for this item. Spans configure how many lanes defined by
-     *  [StaggeredGridCells] the item will occupy. By default each item will take one lane.
+     *   [StaggeredGridCells] the item will occupy. By default each item will take one lane.
      * @param content composable content displayed by current item
      */
     fun item(
@@ -282,20 +279,21 @@
      * Add a [count] of items to the staggered grid.
      *
      * @param count number of items to add.
-     * @param key a factory of stable and unique keys representing the item. The key
-     *  MUST be saveable via Bundle on Android. If set to null (by default), the position of the
-     *  item will be used as a key instead.
-     *  Using the same key for multiple items in the staggered grid is not allowed.
-     *  This can be overridden by calling [LazyStaggeredGridState.requestScrollToItem].
+     * @param key a factory of stable and unique keys representing the item. The key MUST be
+     *   saveable via Bundle on Android. If set to null (by default), the position of the item will
+     *   be used as a key instead. Using the same key for multiple items in the staggered grid is
+     *   not allowed. This can be overridden by calling
+     *   [LazyStaggeredGridState.requestScrollToItem].
      *
-     *  When you specify the key the scroll position will be maintained based on the key, which
-     *  means if you add/remove items before the current visible item the item with the given key
-     *  will be kept as the first visible one.
-     * @param contentType a factory of content types representing the item. Content for item of
-     *  the same type can be reused more efficiently. null is a valid type as well and items
-     *  of such type will be considered compatible.
-     *  @param span a factory of custom spans for this item. Spans configure how many lanes defined
-     *  by [StaggeredGridCells] the item will occupy. By default each item will take one lane.
+     *   When you specify the key the scroll position will be maintained based on the key, which
+     *   means if you add/remove items before the current visible item the item with the given key
+     *   will be kept as the first visible one.
+     *
+     * @param contentType a factory of content types representing the item. Content for item of the
+     *   same type can be reused more efficiently. null is a valid type as well and items of such
+     *   type will be considered compatible.
+     * @param span a factory of custom spans for this item. Spans configure how many lanes defined
+     *   by [StaggeredGridCells] the item will occupy. By default each item will take one lane.
      * @param itemContent composable content displayed by item on provided position
      */
     fun items(
@@ -311,20 +309,20 @@
  * Add a list of items to the staggered grid.
  *
  * @param items a data list to present
- * @param key a factory of stable and unique keys representing the item. The key
- *  MUST be saveable via Bundle on Android. If set to null (by default), the position of the
- *  item will be used as a key instead.
- *  Using the same key for multiple items in the staggered grid is not allowed.
- *  This can be overridden by calling [LazyStaggeredGridState.requestScrollToItem].
+ * @param key a factory of stable and unique keys representing the item. The key MUST be saveable
+ *   via Bundle on Android. If set to null (by default), the position of the item will be used as a
+ *   key instead. Using the same key for multiple items in the staggered grid is not allowed. This
+ *   can be overridden by calling [LazyStaggeredGridState.requestScrollToItem].
  *
- *  When you specify the key the scroll position will be maintained based on the key, which
- *  means if you add/remove items before the current visible item the item with the given key
- *  will be kept as the first visible one.
- * @param contentType a factory of content types representing the item. Content for item of
- *  the same type can be reused more efficiently. null is a valid type as well and items
- *  of such type will be considered compatible.
- * @param span a factory of custom spans for this item. Spans configure how many lanes defined
- *  by [StaggeredGridCells] the item will occupy. By default each item will take one lane.
+ * When you specify the key the scroll position will be maintained based on the key, which means if
+ * you add/remove items before the current visible item the item with the given key will be kept as
+ * the first visible one.
+ *
+ * @param contentType a factory of content types representing the item. Content for item of the same
+ *   type can be reused more efficiently. null is a valid type as well and items of such type will
+ *   be considered compatible.
+ * @param span a factory of custom spans for this item. Spans configure how many lanes defined by
+ *   [StaggeredGridCells] the item will occupy. By default each item will take one lane.
  * @param itemContent composable content displayed by the provided item
  */
 inline fun <T> LazyStaggeredGridScope.items(
@@ -336,13 +334,9 @@
 ) {
     items(
         count = items.size,
-        key = key?.let {
-            { index -> key(items[index]) }
-        },
+        key = key?.let { { index -> key(items[index]) } },
         contentType = { index -> contentType(items[index]) },
-        span = span?.let {
-            { index -> span(items[index]) }
-        },
+        span = span?.let { { index -> span(items[index]) } },
         itemContent = { index -> itemContent(items[index]) }
     )
 }
@@ -351,20 +345,20 @@
  * Add a list of items with index-aware content to the staggered grid.
  *
  * @param items a data list to present
- * @param key a factory of stable and unique keys representing the item. The key
- *  MUST be saveable via Bundle on Android. If set to null (by default), the position of the
- *  item will be used as a key instead.
- *  Using the same key for multiple items in the staggered grid is not allowed.
- *  This can be overridden by calling [LazyStaggeredGridState.requestScrollToItem].
+ * @param key a factory of stable and unique keys representing the item. The key MUST be saveable
+ *   via Bundle on Android. If set to null (by default), the position of the item will be used as a
+ *   key instead. Using the same key for multiple items in the staggered grid is not allowed. This
+ *   can be overridden by calling [LazyStaggeredGridState.requestScrollToItem].
  *
- *  When you specify the key the scroll position will be maintained based on the key, which
- *  means if you add/remove items before the current visible item the item with the given key
- *  will be kept as the first visible one.
- * @param contentType a factory of content types representing the item. Content for item of
- *  the same type can be reused more efficiently. null is a valid type as well and items
- *  of such type will be considered compatible.
- * @param span a factory of custom spans for this item. Spans configure how many lanes defined
- *  by [StaggeredGridCells] the item will occupy. By default each item will take one lane.
+ * When you specify the key the scroll position will be maintained based on the key, which means if
+ * you add/remove items before the current visible item the item with the given key will be kept as
+ * the first visible one.
+ *
+ * @param contentType a factory of content types representing the item. Content for item of the same
+ *   type can be reused more efficiently. null is a valid type as well and items of such type will
+ *   be considered compatible.
+ * @param span a factory of custom spans for this item. Spans configure how many lanes defined by
+ *   [StaggeredGridCells] the item will occupy. By default each item will take one lane.
  * @param itemContent composable content displayed given item and index
  */
 inline fun <T> LazyStaggeredGridScope.itemsIndexed(
@@ -376,13 +370,9 @@
 ) {
     items(
         count = items.size,
-        key = key?.let {
-            { index -> key(index, items[index]) }
-        },
+        key = key?.let { { index -> key(index, items[index]) } },
         contentType = { index -> contentType(index, items[index]) },
-        span = span?.let {
-            { index -> span(index, items[index]) }
-        },
+        span = span?.let { { index -> span(index, items[index]) } },
         itemContent = { index -> itemContent(index, items[index]) }
     )
 }
@@ -391,20 +381,20 @@
  * Add an array of items to the staggered grid.
  *
  * @param items a data array to present
- * @param key a factory of stable and unique keys representing the item. The key
- *  MUST be saveable via Bundle on Android. If set to null (by default), the position of the
- *  item will be used as a key instead.
- *  Using the same key for multiple items in the staggered grid is not allowed.
- *  This can be overridden by calling [LazyStaggeredGridState.requestScrollToItem].
+ * @param key a factory of stable and unique keys representing the item. The key MUST be saveable
+ *   via Bundle on Android. If set to null (by default), the position of the item will be used as a
+ *   key instead. Using the same key for multiple items in the staggered grid is not allowed. This
+ *   can be overridden by calling [LazyStaggeredGridState.requestScrollToItem].
  *
- *  When you specify the key the scroll position will be maintained based on the key, which
- *  means if you add/remove items before the current visible item the item with the given key
- *  will be kept as the first visible one.
- * @param contentType a factory of content types representing the item. Content for item of
- *  the same type can be reused more efficiently. null is a valid type as well and items
- *  of such type will be considered compatible.
- * @param span a factory of custom spans for this item. Spans configure how many lanes defined
- *  by [StaggeredGridCells] the item will occupy. By default each item will take one lane.
+ * When you specify the key the scroll position will be maintained based on the key, which means if
+ * you add/remove items before the current visible item the item with the given key will be kept as
+ * the first visible one.
+ *
+ * @param contentType a factory of content types representing the item. Content for item of the same
+ *   type can be reused more efficiently. null is a valid type as well and items of such type will
+ *   be considered compatible.
+ * @param span a factory of custom spans for this item. Spans configure how many lanes defined by
+ *   [StaggeredGridCells] the item will occupy. By default each item will take one lane.
  * @param itemContent composable content displayed by the provided item
  */
 inline fun <T> LazyStaggeredGridScope.items(
@@ -416,13 +406,9 @@
 ) {
     items(
         count = items.size,
-        key = key?.let {
-            { index -> key(items[index]) }
-        },
+        key = key?.let { { index -> key(items[index]) } },
         contentType = { index -> contentType(items[index]) },
-        span = span?.let {
-            { index -> span(items[index]) }
-        },
+        span = span?.let { { index -> span(items[index]) } },
         itemContent = { index -> itemContent(items[index]) }
     )
 }
@@ -431,20 +417,20 @@
  * Add an array of items with index-aware content to the staggered grid.
  *
  * @param items a data array to present
- * @param key a factory of stable and unique keys representing the item. The key
- *  MUST be saveable via Bundle on Android. If set to null (by default), the position of the
- *  item will be used as a key instead.
- *  Using the same key for multiple items in the staggered grid is not allowed.
- *  This can be overridden by calling [LazyStaggeredGridState.requestScrollToItem].
+ * @param key a factory of stable and unique keys representing the item. The key MUST be saveable
+ *   via Bundle on Android. If set to null (by default), the position of the item will be used as a
+ *   key instead. Using the same key for multiple items in the staggered grid is not allowed. This
+ *   can be overridden by calling [LazyStaggeredGridState.requestScrollToItem].
  *
- *  When you specify the key the scroll position will be maintained based on the key, which
- *  means if you add/remove items before the current visible item the item with the given key
- *  will be kept as the first visible one.
- * @param contentType a factory of content types representing the item. Content for item of
- *  the same type can be reused more efficiently. null is a valid type as well and items
- *  of such type will be considered compatible.
- * @param span a factory of custom spans for this item. Spans configure how many lanes defined
- *  by [StaggeredGridCells] the item will occupy. By default each item will take one lane.
+ * When you specify the key the scroll position will be maintained based on the key, which means if
+ * you add/remove items before the current visible item the item with the given key will be kept as
+ * the first visible one.
+ *
+ * @param contentType a factory of content types representing the item. Content for item of the same
+ *   type can be reused more efficiently. null is a valid type as well and items of such type will
+ *   be considered compatible.
+ * @param span a factory of custom spans for this item. Spans configure how many lanes defined by
+ *   [StaggeredGridCells] the item will occupy. By default each item will take one lane.
  * @param itemContent composable content displayed given item and index
  */
 inline fun <T> LazyStaggeredGridScope.itemsIndexed(
@@ -456,13 +442,9 @@
 ) {
     items(
         count = items.size,
-        key = key?.let {
-            { index -> key(index, items[index]) }
-        },
+        key = key?.let { { index -> key(index, items[index]) } },
         contentType = { index -> contentType(index, items[index]) },
-        span = span?.let {
-            { index -> span(index, items[index]) }
-        },
+        span = span?.let { { index -> span(index, items[index]) } },
         itemContent = { index -> itemContent(index, items[index]) }
     )
 }
diff --git a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/staggeredgrid/LazyStaggeredGridIntervalContent.kt b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/staggeredgrid/LazyStaggeredGridIntervalContent.kt
index 0217bfc..547d91f 100644
--- a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/staggeredgrid/LazyStaggeredGridIntervalContent.kt
+++ b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/staggeredgrid/LazyStaggeredGridIntervalContent.kt
@@ -22,9 +22,8 @@
 import androidx.compose.runtime.Composable
 
 @OptIn(ExperimentalFoundationApi::class)
-internal class LazyStaggeredGridIntervalContent(
-    content: LazyStaggeredGridScope.() -> Unit
-) : LazyStaggeredGridScope, LazyLayoutIntervalContent<LazyStaggeredGridInterval>() {
+internal class LazyStaggeredGridIntervalContent(content: LazyStaggeredGridScope.() -> Unit) :
+    LazyStaggeredGridScope, LazyLayoutIntervalContent<LazyStaggeredGridInterval>() {
 
     override val intervals = MutableIntervalList<LazyStaggeredGridInterval>()
 
@@ -56,15 +55,7 @@
         span: ((index: Int) -> StaggeredGridItemSpan)?,
         itemContent: @Composable LazyStaggeredGridItemScope.(index: Int) -> Unit
     ) {
-        intervals.addInterval(
-            count,
-            LazyStaggeredGridInterval(
-                key,
-                contentType,
-                span,
-                itemContent
-            )
-        )
+        intervals.addInterval(count, LazyStaggeredGridInterval(key, contentType, span, itemContent))
     }
 }
 
diff --git a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/staggeredgrid/LazyStaggeredGridItemProvider.kt b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/staggeredgrid/LazyStaggeredGridItemProvider.kt
index 7d1ab13..9e181be 100644
--- a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/staggeredgrid/LazyStaggeredGridItemProvider.kt
+++ b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/staggeredgrid/LazyStaggeredGridItemProvider.kt
@@ -41,18 +41,20 @@
 ): () -> LazyStaggeredGridItemProvider {
     val latestContent = rememberUpdatedState(content)
     return remember(state) {
-        val intervalContentState = derivedStateOf(referentialEqualityPolicy()) {
-            LazyStaggeredGridIntervalContent(latestContent.value)
-        }
-        val itemProviderState = derivedStateOf(referentialEqualityPolicy()) {
-            val intervalContent = intervalContentState.value
-            val map = NearestRangeKeyIndexMap(state.nearestRange, intervalContent)
-            LazyStaggeredGridItemProviderImpl(
-                state = state,
-                intervalContent = intervalContent,
-                keyIndexMap = map
-            )
-        }
+        val intervalContentState =
+            derivedStateOf(referentialEqualityPolicy()) {
+                LazyStaggeredGridIntervalContent(latestContent.value)
+            }
+        val itemProviderState =
+            derivedStateOf(referentialEqualityPolicy()) {
+                val intervalContent = intervalContentState.value
+                val map = NearestRangeKeyIndexMap(state.nearestRange, intervalContent)
+                LazyStaggeredGridItemProviderImpl(
+                    state = state,
+                    intervalContent = intervalContent,
+                    keyIndexMap = map
+                )
+            }
         itemProviderState::value
     }
 }
@@ -64,7 +66,8 @@
     override val keyIndexMap: LazyLayoutKeyIndexMap,
 ) : LazyStaggeredGridItemProvider {
 
-    override val itemCount: Int get() = intervalContent.itemCount
+    override val itemCount: Int
+        get() = intervalContent.itemCount
 
     override fun getKey(index: Int): Any =
         keyIndexMap.getKey(index) ?: intervalContent.getKey(index)
@@ -82,7 +85,8 @@
         }
     }
 
-    override val spanProvider get() = intervalContent.spanProvider
+    override val spanProvider
+        get() = intervalContent.spanProvider
 
     override fun equals(other: Any?): Boolean {
         if (this === other) return true
diff --git a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/staggeredgrid/LazyStaggeredGridItemScope.kt b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/staggeredgrid/LazyStaggeredGridItemScope.kt
index 9471b5e..5eb6fdb 100644
--- a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/staggeredgrid/LazyStaggeredGridItemScope.kt
+++ b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/staggeredgrid/LazyStaggeredGridItemScope.kt
@@ -26,9 +26,7 @@
 import androidx.compose.ui.Modifier
 import androidx.compose.ui.unit.IntOffset
 
-/**
- * Receiver scope for itemContent in [LazyStaggeredGridScope.item]
- */
+/** Receiver scope for itemContent in [LazyStaggeredGridScope.item] */
 @Stable
 @LazyStaggeredGridScopeMarker
 sealed interface LazyStaggeredGridItemScope {
@@ -41,30 +39,30 @@
      *
      * @sample androidx.compose.foundation.samples.StaggeredGridAnimateItemSample
      *
-     * @param fadeInSpec an animation specs to use for animating the item appearance.
-     * When null is provided the item will be appearing without animations.
+     * @param fadeInSpec an animation specs to use for animating the item appearance. When null is
+     *   provided the item will be appearing without animations.
      * @param placementSpec an animation specs that will be used to animate the item placement.
-     * Aside from item reordering all other position changes caused by events like arrangement or
-     * alignment changes will also be animated. When null is provided no animations will happen.
-     * @param fadeOutSpec an animation specs to use for animating the item disappearance.
-     * When null is provided the item will be disappearance without animations.
+     *   Aside from item reordering all other position changes caused by events like arrangement or
+     *   alignment changes will also be animated. When null is provided no animations will happen.
+     * @param fadeOutSpec an animation specs to use for animating the item disappearance. When null
+     *   is provided the item will be disappearance without animations.
      */
     fun Modifier.animateItem(
         fadeInSpec: FiniteAnimationSpec<Float>? = spring(stiffness = Spring.StiffnessMediumLow),
-        placementSpec: FiniteAnimationSpec<IntOffset>? = spring(
-            stiffness = Spring.StiffnessMediumLow,
-            visibilityThreshold = IntOffset.VisibilityThreshold
-        ),
-        fadeOutSpec: FiniteAnimationSpec<Float>? =
-            spring(stiffness = Spring.StiffnessMediumLow),
+        placementSpec: FiniteAnimationSpec<IntOffset>? =
+            spring(
+                stiffness = Spring.StiffnessMediumLow,
+                visibilityThreshold = IntOffset.VisibilityThreshold
+            ),
+        fadeOutSpec: FiniteAnimationSpec<Float>? = spring(stiffness = Spring.StiffnessMediumLow),
     ): Modifier
 
     /**
      * This modifier animates the item placement within the grid.
      *
-     * When you scroll backward staggered grids could move already visible items in order
-     * to correct the accumulated errors in previous item size estimations. This modifier
-     * can animate such moves.
+     * When you scroll backward staggered grids could move already visible items in order to correct
+     * the accumulated errors in previous item size estimations. This modifier can animate such
+     * moves.
      *
      * Aside from that when you provide a key via [LazyStaggeredGridScope.item] /
      * [LazyStaggeredGridScope.items] this modifier will enable item reordering animations.
@@ -80,15 +78,12 @@
     )
     @ExperimentalFoundationApi
     fun Modifier.animateItemPlacement(
-        animationSpec: FiniteAnimationSpec<IntOffset> = spring(
-            stiffness = Spring.StiffnessMediumLow,
-            visibilityThreshold = IntOffset.VisibilityThreshold
-        )
-    ): Modifier = animateItem(
-        fadeInSpec = null,
-        placementSpec = animationSpec,
-        fadeOutSpec = null
-    )
+        animationSpec: FiniteAnimationSpec<IntOffset> =
+            spring(
+                stiffness = Spring.StiffnessMediumLow,
+                visibilityThreshold = IntOffset.VisibilityThreshold
+            )
+    ): Modifier = animateItem(fadeInSpec = null, placementSpec = animationSpec, fadeOutSpec = null)
 }
 
 internal object LazyStaggeredGridItemScopeImpl : LazyStaggeredGridItemScope {
@@ -100,10 +95,6 @@
         if (fadeInSpec == null && placementSpec == null && fadeOutSpec == null) {
             this
         } else {
-            this then LazyLayoutAnimateItemElement(
-                fadeInSpec,
-                placementSpec,
-                fadeOutSpec
-            )
+            this then LazyLayoutAnimateItemElement(fadeInSpec, placementSpec, fadeOutSpec)
         }
 }
diff --git a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/staggeredgrid/LazyStaggeredGridLaneInfo.kt b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/staggeredgrid/LazyStaggeredGridLaneInfo.kt
index 5f69d36..44826b1 100644
--- a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/staggeredgrid/LazyStaggeredGridLaneInfo.kt
+++ b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/staggeredgrid/LazyStaggeredGridLaneInfo.kt
@@ -17,10 +17,10 @@
 package androidx.compose.foundation.lazy.staggeredgrid
 
 /**
- * Utility class to remember grid lane assignments in a sliding window relative to requested
- * item position (usually reflected by scroll position).
- * Remembers the maximum range of remembered items is reflected by [MaxCapacity], if index is beyond
- * the bounds, [anchor] moves to reflect new position.
+ * Utility class to remember grid lane assignments in a sliding window relative to requested item
+ * position (usually reflected by scroll position). Remembers the maximum range of remembered items
+ * is reflected by [MaxCapacity], if index is beyond the bounds, [anchor] moves to reflect new
+ * position.
  */
 internal class LazyStaggeredGridLaneInfo {
     private var anchor = 0
@@ -29,9 +29,7 @@
 
     private class SpannedItem(val index: Int, var gaps: IntArray)
 
-    /**
-     * Sets given lane for given item index.
-     */
+    /** Sets given lane for given item index. */
     fun setLane(itemIndex: Int, lane: Int) {
         require(itemIndex >= 0) { "Negative lanes are not supported" }
         ensureValidIndex(itemIndex)
@@ -40,6 +38,7 @@
 
     /**
      * Get lane for given item index.
+     *
      * @return lane previously recorded for given item or [Unset] if it doesn't exist.
      */
     fun getLane(itemIndex: Int): Int {
@@ -51,6 +50,7 @@
 
     /**
      * Checks whether item can be in the target lane
+     *
      * @param itemIndex item to check lane for
      * @param targetLane lane it should belong to
      */
@@ -59,21 +59,15 @@
         return lane == targetLane || lane == Unset || lane == FullSpan
     }
 
-    /**
-     * @return upper bound of currently valid item range
-     */
+    /** @return upper bound of currently valid item range */
     /* @VisibleForTests */
     fun upperBound(): Int = anchor + lanes.size
 
-    /**
-     * @return lower bound of currently valid item range
-     */
+    /** @return lower bound of currently valid item range */
     /* @VisibleForTests */
     fun lowerBound(): Int = anchor
 
-    /**
-     * Delete remembered lane assignments.
-     */
+    /** Delete remembered lane assignments. */
     fun reset() {
         lanes.fill(0)
         spannedItems.clear()
@@ -81,6 +75,7 @@
 
     /**
      * Find the previous item relative to [itemIndex] set to target lane
+     *
      * @return found item index or -1 if it doesn't exist.
      */
     fun findPreviousItemIndex(itemIndex: Int, targetLane: Int): Int {
@@ -94,6 +89,7 @@
 
     /**
      * Find the next item relative to [itemIndex] set to target lane
+     *
      * @return found item index or [upperBound] if it doesn't exist.
      */
     fun findNextItemIndex(itemIndex: Int, targetLane: Int): Int {
diff --git a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/staggeredgrid/LazyStaggeredGridMeasure.kt b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/staggeredgrid/LazyStaggeredGridMeasure.kt
index e56091e..edd9f0e 100644
--- a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/staggeredgrid/LazyStaggeredGridMeasure.kt
+++ b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/staggeredgrid/LazyStaggeredGridMeasure.kt
@@ -52,23 +52,23 @@
     scope: LazyLayoutMeasureScope,
     block: LazyLayoutMeasureScope.() -> T
 ): T {
-    val result = if (DebugLoggingEnabled) {
-        try {
-            println("╭──────{ measure start }───────────")
+    val result =
+        if (DebugLoggingEnabled) {
+            try {
+                println("╭──────{ measure start }───────────")
+                with(scope, block)
+            } finally {
+                println("╰──────{ measure done }────────────")
+            }
+        } else {
             with(scope, block)
-        } finally {
-            println("╰──────{ measure done }────────────")
         }
-    } else {
-        with(scope, block)
-    }
     return result
 }
 
 private fun Array<ArrayDeque<LazyStaggeredGridMeasuredItem>>.debugRender(): String =
     if (DebugLoggingEnabled) {
-        @Suppress("ListIterator")
-        map { items -> items.map { it.index } }.toString()
+        @Suppress("ListIterator") map { items -> items.map { it.index } }.toString()
     } else {
         ""
     }
@@ -96,33 +96,31 @@
     coroutineScope: CoroutineScope,
     graphicsContext: GraphicsContext
 ): LazyStaggeredGridMeasureResult {
-    val context = LazyStaggeredGridMeasureContext(
-        state = state,
-        pinnedItems = pinnedItems,
-        itemProvider = itemProvider,
-        resolvedSlots = resolvedSlots,
-        constraints = constraints,
-        isVertical = isVertical,
-        contentOffset = contentOffset,
-        mainAxisAvailableSize = mainAxisAvailableSize,
-        beforeContentPadding = beforeContentPadding,
-        afterContentPadding = afterContentPadding,
-        reverseLayout = reverseLayout,
-        mainAxisSpacing = mainAxisSpacing,
-        measureScope = this,
-        coroutineScope = coroutineScope,
-        graphicsContext = graphicsContext
-    )
+    val context =
+        LazyStaggeredGridMeasureContext(
+            state = state,
+            pinnedItems = pinnedItems,
+            itemProvider = itemProvider,
+            resolvedSlots = resolvedSlots,
+            constraints = constraints,
+            isVertical = isVertical,
+            contentOffset = contentOffset,
+            mainAxisAvailableSize = mainAxisAvailableSize,
+            beforeContentPadding = beforeContentPadding,
+            afterContentPadding = afterContentPadding,
+            reverseLayout = reverseLayout,
+            mainAxisSpacing = mainAxisSpacing,
+            measureScope = this,
+            coroutineScope = coroutineScope,
+            graphicsContext = graphicsContext
+        )
 
     val initialItemIndices: IntArray
     val initialItemOffsets: IntArray
 
     // ensure scroll position is up to date
     val firstVisibleIndices =
-        state.updateScrollPositionIfTheFirstItemWasMoved(
-            itemProvider,
-            state.scrollPosition.indices
-        )
+        state.updateScrollPositionIfTheFirstItemWasMoved(itemProvider, state.scrollPosition.indices)
     val firstVisibleOffsets = state.scrollPosition.scrollOffsets
 
     initialItemIndices =
@@ -135,17 +133,16 @@
             IntArray(context.laneCount).apply {
                 // Try to adjust indices in case grid got resized
                 for (lane in indices) {
-                    this[lane] = if (
-                        lane < firstVisibleIndices.size && firstVisibleIndices[lane] != Unset
-                    ) {
-                        firstVisibleIndices[lane]
-                    } else {
-                        if (lane == 0) {
-                            0
+                    this[lane] =
+                        if (lane < firstVisibleIndices.size && firstVisibleIndices[lane] != Unset) {
+                            firstVisibleIndices[lane]
                         } else {
-                            maxInRange(SpanRange(0, lane)) + 1
+                            if (lane == 0) {
+                                0
+                            } else {
+                                maxInRange(SpanRange(0, lane)) + 1
+                            }
                         }
-                    }
                     // Ensure spans are updated to be in correct range
                     context.laneInfo.setLane(this[lane], lane)
                 }
@@ -160,11 +157,12 @@
             IntArray(context.laneCount).apply {
                 // Adjust offsets to match previously set ones
                 for (lane in indices) {
-                    this[lane] = if (lane < firstVisibleOffsets.size) {
-                        firstVisibleOffsets[lane]
-                    } else {
-                        if (lane == 0) 0 else this[lane - 1]
-                    }
+                    this[lane] =
+                        if (lane < firstVisibleOffsets.size) {
+                            firstVisibleOffsets[lane]
+                        } else {
+                            if (lane == 0) 0 else this[lane - 1]
+                        }
                 }
             }
         }
@@ -195,35 +193,38 @@
     val coroutineScope: CoroutineScope,
     val graphicsContext: GraphicsContext
 ) {
-    val measuredItemProvider = object : LazyStaggeredGridMeasureProvider(
-        isVertical = isVertical,
-        itemProvider = itemProvider,
-        measureScope = measureScope,
-        resolvedSlots = resolvedSlots,
-    ) {
-        override fun createItem(
-            index: Int,
-            lane: Int,
-            span: Int,
-            key: Any,
-            contentType: Any?,
-            placeables: List<Placeable>,
-            constraints: Constraints
-        ) = LazyStaggeredGridMeasuredItem(
-            index = index,
-            key = key,
-            placeables = placeables,
-            isVertical = isVertical,
-            spacing = mainAxisSpacing,
-            lane = lane,
-            span = span,
-            beforeContentPadding = beforeContentPadding,
-            afterContentPadding = afterContentPadding,
-            contentType = contentType,
-            animator = state.itemAnimator,
-            constraints = constraints
-        )
-    }
+    val measuredItemProvider =
+        object :
+            LazyStaggeredGridMeasureProvider(
+                isVertical = isVertical,
+                itemProvider = itemProvider,
+                measureScope = measureScope,
+                resolvedSlots = resolvedSlots,
+            ) {
+            override fun createItem(
+                index: Int,
+                lane: Int,
+                span: Int,
+                key: Any,
+                contentType: Any?,
+                placeables: List<Placeable>,
+                constraints: Constraints
+            ) =
+                LazyStaggeredGridMeasuredItem(
+                    index = index,
+                    key = key,
+                    placeables = placeables,
+                    isVertical = isVertical,
+                    spacing = mainAxisSpacing,
+                    lane = lane,
+                    span = span,
+                    beforeContentPadding = beforeContentPadding,
+                    afterContentPadding = afterContentPadding,
+                    contentType = contentType,
+                    animator = state.itemAnimator,
+                    constraints = constraints
+                )
+        }
 
     val laneInfo = state.laneInfo
 
@@ -322,9 +323,7 @@
         firstItemOffsets.offsetBy(-scrollDelta)
 
         // this will contain all the MeasuredItems representing the visible items
-        val measuredItems = Array(laneCount) {
-            ArrayDeque<LazyStaggeredGridMeasuredItem>(16)
-        }
+        val measuredItems = Array(laneCount) { ArrayDeque<LazyStaggeredGridMeasuredItem>(16) }
 
         // include the start padding so we compose items in the padding area. before starting
         // scrolling forward we would remove it back
@@ -381,10 +380,8 @@
 
             val spanRange = itemProvider.getSpanRange(previousItemIndex, laneIndex)
             laneInfo.setLane(previousItemIndex, spanRange.laneInfo)
-            val measuredItem = measuredItemProvider.getAndMeasure(
-                index = previousItemIndex,
-                span = spanRange
-            )
+            val measuredItem =
+                measuredItemProvider.getAndMeasure(index = previousItemIndex, span = spanRange)
 
             val offset = firstItemOffsets.maxInRange(spanRange)
             val gaps = if (spanRange.isFullSpan) laneInfo.getGaps(previousItemIndex) else null
@@ -400,9 +397,7 @@
                 }
             }
         }
-        debugLog {
-            "up done. measured items: ${measuredItems.debugRender()}"
-        }
+        debugLog { "up done. measured items: ${measuredItems.debugRender()}" }
 
         fun misalignedStart(referenceLane: Int): Boolean {
             // If we scrolled past the first item in the lane, we have a point of reference
@@ -442,12 +437,11 @@
         if (firstItemOffsets[0] < minOffset) {
             scrollDelta += firstItemOffsets[0]
             firstItemOffsets.offsetBy(minOffset - firstItemOffsets[0])
-            debugLog {
-                "up, correcting scroll delta from ${firstItemOffsets[0]} to $minOffset"
-            }
+            debugLog { "up, correcting scroll delta from ${firstItemOffsets[0]} to $minOffset" }
         }
 
-        // neutralize previously added start padding as we stopped filling the before content padding
+        // neutralize previously added start padding as we stopped filling the before content
+        // padding
         firstItemOffsets.offsetBy(beforeContentPadding)
 
         laneToCheckForGaps =
@@ -461,9 +455,7 @@
                 return measure(
                     initialScrollDelta = scrollDelta,
                     initialItemIndices = IntArray(firstItemIndices.size) { -1 },
-                    initialItemOffsets = IntArray(firstItemOffsets.size) {
-                        firstItemOffsets[lane]
-                    },
+                    initialItemOffsets = IntArray(firstItemOffsets.size) { firstItemOffsets[lane] },
                     canRestartMeasure = false
                 )
             }
@@ -474,9 +466,7 @@
         // this means we are calling measure second time on items previously measured in this
         // function, but LazyLayout caches them, so no overhead.
         val currentItemIndices = firstItemIndices.copyOf()
-        val currentItemOffsets = IntArray(firstItemOffsets.size) {
-            -firstItemOffsets[it]
-        }
+        val currentItemOffsets = IntArray(firstItemOffsets.size) { -firstItemOffsets[it] }
 
         val minVisibleOffset = minOffset + mainAxisSpacing
         val maxOffset = (mainAxisAvailableSize + afterContentPadding).coerceAtLeast(0)
@@ -502,10 +492,7 @@
             if (itemIndex < 0) continue
 
             val spanRange = itemProvider.getSpanRange(itemIndex, laneIndex)
-            val measuredItem = measuredItemProvider.getAndMeasure(
-                itemIndex,
-                spanRange
-            )
+            val measuredItem = measuredItemProvider.getAndMeasure(itemIndex, spanRange)
 
             laneInfo.setLane(itemIndex, spanRange.laneInfo)
             val offset = currentItemOffsets.maxInRange(spanRange)
@@ -533,9 +520,7 @@
             }
         }
 
-        debugLog {
-            "current filled, measured: ${measuredItems.debugRender()}"
-        }
+        debugLog { "current filled, measured: ${measuredItems.debugRender()}" }
         debugLog {
             "down from indices: ${currentItemIndices.toList()}, " +
                 "offsets: ${currentItemOffsets.toList()}"
@@ -546,8 +531,7 @@
         // offscreen, this can happen if the content padding is larger than the available size.
         while (
             currentItemOffsets.any {
-                it < maxOffset ||
-                    it <= 0 // filling beforeContentPadding area
+                it < maxOffset || it <= 0 // filling beforeContentPadding area
             } || measuredItems.all { it.isEmpty() }
         ) {
             val currentLaneIndex = currentItemOffsets.indexOfMinValue()
@@ -564,11 +548,12 @@
             val measuredItem = measuredItemProvider.getAndMeasure(itemIndex, spanRange)
 
             val offset = currentItemOffsets.maxInRange(spanRange)
-            val gaps = if (spanRange.isFullSpan) {
-                laneInfo.getGaps(itemIndex) ?: IntArray(laneCount)
-            } else {
-                null
-            }
+            val gaps =
+                if (spanRange.isFullSpan) {
+                    laneInfo.getGaps(itemIndex) ?: IntArray(laneCount)
+                } else {
+                    null
+                }
             spanRange.forEach { lane ->
                 if (gaps != null) {
                     gaps[lane] = offset - currentItemOffsets[lane]
@@ -590,9 +575,7 @@
             }
         }
 
-        debugLog {
-            "down done. measured items: ${measuredItems.debugRender()}"
-        }
+        debugLog { "down done. measured items: ${measuredItems.debugRender()}" }
 
         // some measured items are offscreen, remove them from the list and adjust indices/offsets
         for (laneIndex in measuredItems.indices) {
@@ -613,9 +596,7 @@
             currentItemOffsets.offsetBy(-mainAxisSpacing)
         }
 
-        debugLog {
-            "removed invisible items: ${measuredItems.debugRender()}"
-        }
+        debugLog { "removed invisible items: ${measuredItems.debugRender()}" }
         debugLog {
             "back up, indices: ${firstItemIndices.toList()}, " +
                 "offsets: ${firstItemOffsets.toList()}"
@@ -630,9 +611,7 @@
             currentItemOffsets.offsetBy(toScrollBack)
 
             var gapDetected = false
-            while (
-                firstItemOffsets.any { it < beforeContentPadding }
-            ) {
+            while (firstItemOffsets.any { it < beforeContentPadding }) {
                 // We choose the minimum offset value and try to put items on top.
                 // Note that it is different from initial pass up where we selected largest index
                 // instead. The reason is that we already distributed items on downward pass and
@@ -661,8 +640,7 @@
                         firstItemIndices[laneIndex]
                     }
 
-                val previousIndex =
-                    findPreviousItemIndex(currentIndex, laneIndex)
+                val previousIndex = findPreviousItemIndex(currentIndex, laneIndex)
 
                 if (previousIndex < 0) {
                     if ((gapDetected || misalignedStart(laneIndex)) && canRestartMeasure) {
@@ -670,9 +648,8 @@
                         return measure(
                             initialScrollDelta = scrollDelta,
                             initialItemIndices = IntArray(firstItemIndices.size) { -1 },
-                            initialItemOffsets = IntArray(firstItemOffsets.size) {
-                                firstItemOffsets[laneIndex]
-                            },
+                            initialItemOffsets =
+                                IntArray(firstItemOffsets.size) { firstItemOffsets[laneIndex] },
                             canRestartMeasure = false
                         )
                     }
@@ -681,10 +658,8 @@
 
                 val spanRange = itemProvider.getSpanRange(previousIndex, laneIndex)
                 laneInfo.setLane(previousIndex, spanRange.laneInfo)
-                val measuredItem = measuredItemProvider.getAndMeasure(
-                    index = previousIndex,
-                    spanRange
-                )
+                val measuredItem =
+                    measuredItemProvider.getAndMeasure(index = previousIndex, spanRange)
 
                 val offset = firstItemOffsets.maxInRange(spanRange)
                 val gaps = if (spanRange.isFullSpan) laneInfo.getGaps(previousIndex) else null
@@ -726,9 +701,7 @@
             }
         }
 
-        debugLog {
-            "measured: ${measuredItems.debugRender()}"
-        }
+        debugLog { "measured: ${measuredItems.debugRender()}" }
         debugLog {
             "first indices: ${firstItemIndices.toList()}, offsets: ${firstItemOffsets.toList()}"
         }
@@ -737,14 +710,15 @@
         // scrollToBeConsumed if there were not enough items to fill the offered space or it
         // can be larger if items were resized, or if, for example, we were previously
         // displaying the item 15, but now we have only 10 items in total in the data set.
-        val consumedScroll = if (
-            state.scrollToBeConsumed.fastRoundToInt().sign == scrollDelta.sign &&
-            abs(state.scrollToBeConsumed.fastRoundToInt()) >= abs(scrollDelta)
-        ) {
-            scrollDelta.toFloat()
-        } else {
-            state.scrollToBeConsumed
-        }
+        val consumedScroll =
+            if (
+                state.scrollToBeConsumed.fastRoundToInt().sign == scrollDelta.sign &&
+                    abs(state.scrollToBeConsumed.fastRoundToInt()) >= abs(scrollDelta)
+            ) {
+                scrollDelta.toFloat()
+            } else {
+                state.scrollToBeConsumed
+            }
 
         val itemScrollOffsets = firstItemOffsets.copyOf().transform { -it }
 
@@ -761,8 +735,8 @@
                         item.mainAxisSizeWithSpacings + if (gaps == null) 0 else gaps[laneIndex]
                     if (
                         i != laneItems.lastIndex &&
-                        firstItemOffsets[laneIndex] != 0 &&
-                        firstItemOffsets[laneIndex] >= size
+                            firstItemOffsets[laneIndex] != 0 &&
+                            firstItemOffsets[laneIndex] >= size
                     ) {
                         firstItemOffsets[laneIndex] -= size
                         firstItemIndices[laneIndex] = laneItems[i + 1].index
@@ -783,16 +757,18 @@
         // start placement
 
         val contentPadding = beforeContentPadding + afterContentPadding
-        var layoutWidth = if (isVertical) {
-            constraints.maxWidth
-        } else {
-            constraints.constrainWidth(currentItemOffsets.max() + contentPadding)
-        }
-        var layoutHeight = if (isVertical) {
-            constraints.constrainHeight(currentItemOffsets.max() + contentPadding)
-        } else {
-            constraints.maxHeight
-        }
+        var layoutWidth =
+            if (isVertical) {
+                constraints.maxWidth
+            } else {
+                constraints.constrainWidth(currentItemOffsets.max() + contentPadding)
+            }
+        var layoutHeight =
+            if (isVertical) {
+                constraints.constrainHeight(currentItemOffsets.max() + contentPadding)
+            } else {
+                constraints.maxHeight
+            }
 
         val mainAxisLayoutSize =
             min(if (isVertical) layoutHeight else layoutWidth, mainAxisAvailableSize).let {
@@ -803,70 +779,73 @@
             }
 
         var extraItemOffset = itemScrollOffsets[0]
-        val extraItemsBefore = calculateExtraItems(
-            position = {
-                extraItemOffset -= it.mainAxisSizeWithSpacings
-                it.position(
-                    mainAxis = extraItemOffset,
-                    crossAxis = 0,
-                    mainAxisLayoutSize = mainAxisLayoutSize
-                )
-            },
-            filter = { itemIndex ->
-                val lane = laneInfo.getLane(itemIndex)
-                when (lane) {
-                    Unset, FullSpan -> {
-                        firstItemIndices.all { it > itemIndex }
+        val extraItemsBefore =
+            calculateExtraItems(
+                position = {
+                    extraItemOffset -= it.mainAxisSizeWithSpacings
+                    it.position(
+                        mainAxis = extraItemOffset,
+                        crossAxis = 0,
+                        mainAxisLayoutSize = mainAxisLayoutSize
+                    )
+                },
+                filter = { itemIndex ->
+                    val lane = laneInfo.getLane(itemIndex)
+                    when (lane) {
+                        Unset,
+                        FullSpan -> {
+                            firstItemIndices.all { it > itemIndex }
+                        }
+                        else -> {
+                            firstItemIndices[lane] > itemIndex
+                        }
                     }
-                    else -> {
-                        firstItemIndices[lane] > itemIndex
-                    }
-                }
-            },
-            beforeVisibleBounds = true
-        )
+                },
+                beforeVisibleBounds = true
+            )
 
-        val visibleItems = calculateVisibleItems(
-            measuredItems,
-            itemScrollOffsets,
-            mainAxisLayoutSize,
-        )
+        val visibleItems =
+            calculateVisibleItems(
+                measuredItems,
+                itemScrollOffsets,
+                mainAxisLayoutSize,
+            )
 
         extraItemOffset = itemScrollOffsets[0]
-        val extraItemsAfter = calculateExtraItems(
-            position = {
-                it.position(
-                    mainAxis = extraItemOffset,
-                    crossAxis = 0,
-                    mainAxisLayoutSize = mainAxisLayoutSize
-                )
-                extraItemOffset += it.mainAxisSizeWithSpacings
-            },
-            filter = { itemIndex ->
-                if (itemIndex >= itemCount) {
-                    return@calculateExtraItems false
-                }
-                val lane = laneInfo.getLane(itemIndex)
-                when (lane) {
-                    Unset, FullSpan -> {
-                        currentItemIndices.all { it < itemIndex }
+        val extraItemsAfter =
+            calculateExtraItems(
+                position = {
+                    it.position(
+                        mainAxis = extraItemOffset,
+                        crossAxis = 0,
+                        mainAxisLayoutSize = mainAxisLayoutSize
+                    )
+                    extraItemOffset += it.mainAxisSizeWithSpacings
+                },
+                filter = { itemIndex ->
+                    if (itemIndex >= itemCount) {
+                        return@calculateExtraItems false
                     }
-                    else -> {
-                        currentItemIndices[lane] < itemIndex
+                    val lane = laneInfo.getLane(itemIndex)
+                    when (lane) {
+                        Unset,
+                        FullSpan -> {
+                            currentItemIndices.all { it < itemIndex }
+                        }
+                        else -> {
+                            currentItemIndices[lane] < itemIndex
+                        }
                     }
-                }
-            },
-            beforeVisibleBounds = false
-        )
+                },
+                beforeVisibleBounds = false
+            )
 
         val positionedItems = mutableListOf<LazyStaggeredGridMeasuredItem>()
         positionedItems.addAll(extraItemsBefore)
         positionedItems.addAll(visibleItems)
         positionedItems.addAll(extraItemsAfter)
 
-        debugLog {
-            "positioned: $positionedItems"
-        }
+        debugLog { "positioned: $positionedItems" }
 
         state.itemAnimator.onMeasured(
             consumedScroll = consumedScroll.toInt(),
@@ -894,30 +873,31 @@
                 constraints.constrainHeight(maxOf(layoutHeight, disappearingItemsSize.height))
             val newMainAxisSize = if (isVertical) layoutHeight else layoutWidth
             if (newMainAxisSize != oldMainAxisSize) {
-                positionedItems.fastForEach {
-                    it.updateMainAxisLayoutSize(newMainAxisSize)
-                }
+                positionedItems.fastForEach { it.updateMainAxisLayoutSize(newMainAxisSize) }
             }
         }
 
         // end placement
 
         // only scroll forward if the last item is not on screen or fully visible
-        val canScrollForward = currentItemOffsets.any { it > mainAxisAvailableSize } ||
-            currentItemIndices.all { it < itemCount - 1 }
+        val canScrollForward =
+            currentItemOffsets.any { it > mainAxisAvailableSize } ||
+                currentItemIndices.all { it < itemCount - 1 }
 
         return LazyStaggeredGridMeasureResult(
             firstVisibleItemIndices = firstItemIndices,
             firstVisibleItemScrollOffsets = firstItemOffsets,
             consumedScroll = consumedScroll,
-            measureResult = layout(layoutWidth, layoutHeight) {
-                positionedItems.fastForEach { item ->
-                    item.place(scope = this, context = this@measure)
-                }
+            measureResult =
+                layout(layoutWidth, layoutHeight) {
+                    positionedItems.fastForEach { item ->
+                        item.place(scope = this, context = this@measure)
+                    }
 
-                // we attach it during the placement so LazyStaggeredGridState can trigger re-placement
-                state.placementScopeInvalidator.attachToScope()
-            },
+                    // we attach it during the placement so LazyStaggeredGridState can trigger
+                    // re-placement
+                    state.placementScopeInvalidator.attachToScope()
+                },
             canScrollForward = canScrollForward,
             isVertical = isVertical,
             visibleItemsInfo = visibleItems,
@@ -942,14 +922,10 @@
     itemScrollOffsets: IntArray,
     mainAxisLayoutSize: Int,
 ): List<LazyStaggeredGridMeasuredItem> {
-    val positionedItems = ArrayList<LazyStaggeredGridMeasuredItem>(
-        measuredItems.sumOf { it.size }
-    )
+    val positionedItems = ArrayList<LazyStaggeredGridMeasuredItem>(measuredItems.sumOf { it.size })
     while (measuredItems.any { it.isNotEmpty() }) {
         // find the next item to position
-        val laneIndex = measuredItems.indexOfMinBy {
-            it.firstOrNull()?.index ?: Int.MAX_VALUE
-        }
+        val laneIndex = measuredItems.indexOfMinBy { it.firstOrNull()?.index ?: Int.MAX_VALUE }
         val item = measuredItems[laneIndex].removeFirst()
 
         if (item.lane != laneIndex) {
@@ -1004,9 +980,14 @@
 internal value class SpanRange private constructor(val packedValue: Long) {
     constructor(lane: Int, span: Int) : this(packInts(lane, lane + span))
 
-    inline val start get(): Int = unpackInt1(packedValue)
-    inline val end get(): Int = unpackInt2(packedValue)
-    inline val size get(): Int = end - start
+    inline val start
+        get(): Int = unpackInt1(packedValue)
+
+    inline val end
+        get(): Int = unpackInt2(packedValue)
+
+    inline val size
+        get(): Int = end - start
 }
 
 private inline fun SpanRange.forEach(block: (Int) -> Unit) {
@@ -1023,9 +1004,7 @@
 
 private fun IntArray.maxInRange(indexRange: SpanRange): Int {
     var max = Int.MIN_VALUE
-    indexRange.forEach {
-        max = maxOf(max, this[it])
-    }
+    indexRange.forEach { max = maxOf(max, this[it]) }
     return max
 }
 
@@ -1106,14 +1085,15 @@
 ) : LazyLayoutMeasuredItemProvider<LazyStaggeredGridMeasuredItem> {
     private fun childConstraints(slot: Int, span: Int): Constraints {
         // resolved slots contain [offset, size] pair per each slot.
-        val crossAxisSize = if (span == 1) {
-            resolvedSlots.sizes[slot]
-        } else {
-            val start = resolvedSlots.positions[slot]
-            val endSlot = slot + span - 1
-            val end = resolvedSlots.positions[endSlot] + resolvedSlots.sizes[endSlot]
-            end - start
-        }
+        val crossAxisSize =
+            if (span == 1) {
+                resolvedSlots.sizes[slot]
+            } else {
+                val start = resolvedSlots.positions[slot]
+                val endSlot = slot + span - 1
+                val end = resolvedSlots.positions[endSlot] + resolvedSlots.sizes[endSlot]
+                end - start
+            }
 
         return if (isVertical) {
             Constraints.fixedWidth(crossAxisSize)
@@ -1132,15 +1112,7 @@
 
         val constraints = childConstraints(spanStart, spanSize)
         val placeables = measureScope.measure(index, constraints)
-        return createItem(
-            index,
-            spanStart,
-            spanSize,
-            key,
-            contentType,
-            placeables,
-            constraints
-        )
+        return createItem(index, spanStart, spanSize, key, contentType, placeables, constraints)
     }
 
     override fun getAndMeasure(
@@ -1153,18 +1125,11 @@
         val contentType = itemProvider.getContentType(index)
 
         val placeables = measureScope.measure(index, constraints)
-        return createItem(
-            index,
-            lane,
-            span,
-            key,
-            contentType,
-            placeables,
-            constraints
-        )
+        return createItem(index, lane, span, key, contentType, placeables, constraints)
     }
 
-    val keyIndexMap: LazyLayoutKeyIndexMap get() = itemProvider.keyIndexMap
+    val keyIndexMap: LazyLayoutKeyIndexMap
+        get() = itemProvider.keyIndexMap
 
     abstract fun createItem(
         index: Int,
@@ -1193,19 +1158,20 @@
 ) : LazyStaggeredGridItemInfo, LazyLayoutMeasuredItem {
     var isVisible = true
 
-    override val placeablesCount: Int get() = placeables.size
+    override val placeablesCount: Int
+        get() = placeables.size
 
     override fun getParentData(index: Int) = placeables[index].parentData
 
-    val mainAxisSize: Int = placeables.fastMaxOfOrNull { placeable ->
-        if (isVertical) placeable.height else placeable.width
-    } ?: 0
+    val mainAxisSize: Int =
+        placeables.fastMaxOfOrNull { placeable ->
+            if (isVertical) placeable.height else placeable.width
+        } ?: 0
 
     override val mainAxisSizeWithSpacings: Int = (mainAxisSize + spacing).coerceAtLeast(0)
 
-    val crossAxisSize: Int = placeables.fastMaxOfOrNull {
-        if (isVertical) it.width else it.height
-    } ?: 0
+    val crossAxisSize: Int =
+        placeables.fastMaxOfOrNull { if (isVertical) it.width else it.height } ?: 0
 
     private var mainAxisLayoutSize: Int = Unset
     private var minMainAxisOffset: Int = 0
@@ -1217,11 +1183,12 @@
      */
     override var nonScrollableItem: Boolean = false
 
-    override val size: IntSize = if (isVertical) {
-        IntSize(crossAxisSize, mainAxisSize)
-    } else {
-        IntSize(mainAxisSize, crossAxisSize)
-    }
+    override val size: IntSize =
+        if (isVertical) {
+            IntSize(crossAxisSize, mainAxisSize)
+        } else {
+            IntSize(mainAxisSize, crossAxisSize)
+        }
     override var offset: IntOffset = IntOffset.Zero
         private set
 
@@ -1235,11 +1202,12 @@
         this.mainAxisLayoutSize = mainAxisLayoutSize
         minMainAxisOffset = -beforeContentPadding
         maxMainAxisOffset = mainAxisLayoutSize + afterContentPadding
-        offset = if (isVertical) {
-            IntOffset(crossAxis, mainAxis)
-        } else {
-            IntOffset(mainAxis, crossAxis)
-        }
+        offset =
+            if (isVertical) {
+                IntOffset(crossAxis, mainAxis)
+            } else {
+                IntOffset(mainAxis, crossAxis)
+            }
     }
 
     override fun position(
@@ -1251,53 +1219,57 @@
         position(mainAxisOffset, crossAxisOffset, if (isVertical) layoutHeight else layoutWidth)
     }
 
-    val mainAxisOffset get() = if (!isVertical) offset.x else offset.y
+    val mainAxisOffset
+        get() = if (!isVertical) offset.x else offset.y
 
-    fun place(
-        scope: Placeable.PlacementScope,
-        context: LazyStaggeredGridMeasureContext
-    ) = with(context) {
-        require(mainAxisLayoutSize != Unset) { "position() should be called first" }
-        with(scope) {
-            placeables.fastForEachIndexed { index, placeable ->
-                val minOffset = minMainAxisOffset - placeable.mainAxisSize
-                val maxOffset = maxMainAxisOffset
+    fun place(scope: Placeable.PlacementScope, context: LazyStaggeredGridMeasureContext) =
+        with(context) {
+            require(mainAxisLayoutSize != Unset) { "position() should be called first" }
+            with(scope) {
+                placeables.fastForEachIndexed { index, placeable ->
+                    val minOffset = minMainAxisOffset - placeable.mainAxisSize
+                    val maxOffset = maxMainAxisOffset
 
-                var offset = offset
-                val animation = animator.getAnimation(key, index)
-                val layer: GraphicsLayer?
-                if (animation != null) {
-                    val animatedOffset = offset + animation.placementDelta
-                    // cancel the animation if current and target offsets are both out of the bounds.
-                    if ((offset.mainAxis <= minOffset && animatedOffset.mainAxis <= minOffset) ||
-                        (offset.mainAxis >= maxOffset && animatedOffset.mainAxis >= maxOffset)
-                    ) {
-                        animation.cancelPlacementAnimation()
+                    var offset = offset
+                    val animation = animator.getAnimation(key, index)
+                    val layer: GraphicsLayer?
+                    if (animation != null) {
+                        val animatedOffset = offset + animation.placementDelta
+                        // cancel the animation if current and target offsets are both out of the
+                        // bounds.
+                        if (
+                            (offset.mainAxis <= minOffset &&
+                                animatedOffset.mainAxis <= minOffset) ||
+                                (offset.mainAxis >= maxOffset &&
+                                    animatedOffset.mainAxis >= maxOffset)
+                        ) {
+                            animation.cancelPlacementAnimation()
+                        }
+                        offset = animatedOffset
+                        layer = animation.layer
+                    } else {
+                        layer = null
                     }
-                    offset = animatedOffset
-                    layer = animation.layer
-                } else {
-                    layer = null
-                }
-                if (reverseLayout) {
-                    offset = offset.copy { mainAxisOffset ->
-                        mainAxisLayoutSize - mainAxisOffset - placeable.mainAxisSize
+                    if (reverseLayout) {
+                        offset =
+                            offset.copy { mainAxisOffset ->
+                                mainAxisLayoutSize - mainAxisOffset - placeable.mainAxisSize
+                            }
                     }
-                }
-                offset += contentOffset
-                animation?.finalOffset = offset
-                if (layer != null) {
-                    placeable.placeRelativeWithLayer(offset, layer)
-                } else {
-                    placeable.placeRelativeWithLayer(offset)
+                    offset += contentOffset
+                    animation?.finalOffset = offset
+                    if (layer != null) {
+                        placeable.placeRelativeWithLayer(offset, layer)
+                    } else {
+                        placeable.placeRelativeWithLayer(offset)
+                    }
                 }
             }
         }
-    }
 
     /**
-     * Update a [mainAxisLayoutSize] when the size did change after last [position] call.
-     * Knowing the final size is important for calculating the final position in reverse layout.
+     * Update a [mainAxisLayoutSize] when the size did change after last [position] call. Knowing
+     * the final size is important for calculating the final position in reverse layout.
      */
     fun updateMainAxisLayoutSize(mainAxisLayoutSize: Int) {
         this.mainAxisLayoutSize = mainAxisLayoutSize
@@ -1317,8 +1289,12 @@
         }
     }
 
-    private val IntOffset.mainAxis get() = if (isVertical) y else x
-    private inline val Placeable.mainAxisSize get() = if (isVertical) height else width
+    private val IntOffset.mainAxis
+        get() = if (isVertical) y else x
+
+    private inline val Placeable.mainAxisSize
+        get() = if (isVertical) height else width
+
     private inline fun IntOffset.copy(mainAxisMap: (Int) -> Int): IntOffset =
         IntOffset(if (isVertical) x else mainAxisMap(x), if (isVertical) mainAxisMap(y) else y)
 
diff --git a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/staggeredgrid/LazyStaggeredGridMeasurePolicy.kt b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/staggeredgrid/LazyStaggeredGridMeasurePolicy.kt
index 00701db..7fa53f8 100644
--- a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/staggeredgrid/LazyStaggeredGridMeasurePolicy.kt
+++ b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/staggeredgrid/LazyStaggeredGridMeasurePolicy.kt
@@ -48,83 +48,86 @@
     coroutineScope: CoroutineScope,
     slots: LazyGridStaggeredGridSlotsProvider,
     graphicsContext: GraphicsContext
-): LazyLayoutMeasureScope.(Constraints) -> LazyStaggeredGridMeasureResult = remember(
-    state,
-    itemProviderLambda,
-    contentPadding,
-    reverseLayout,
-    orientation,
-    mainAxisSpacing,
-    crossAxisSpacing,
-    slots,
-    graphicsContext
-) {
-    { constraints ->
-        state.measurementScopeInvalidator.attachToScope()
-        checkScrollableContainerConstraints(
-            constraints,
-            orientation
-        )
-        val resolvedSlots = slots.invoke(density = this, constraints = constraints)
-        val isVertical = orientation == Orientation.Vertical
-        val itemProvider = itemProviderLambda()
+): LazyLayoutMeasureScope.(Constraints) -> LazyStaggeredGridMeasureResult =
+    remember(
+        state,
+        itemProviderLambda,
+        contentPadding,
+        reverseLayout,
+        orientation,
+        mainAxisSpacing,
+        crossAxisSpacing,
+        slots,
+        graphicsContext
+    ) {
+        { constraints ->
+            state.measurementScopeInvalidator.attachToScope()
+            checkScrollableContainerConstraints(constraints, orientation)
+            val resolvedSlots = slots.invoke(density = this, constraints = constraints)
+            val isVertical = orientation == Orientation.Vertical
+            val itemProvider = itemProviderLambda()
 
-        // setup measure
-        val beforeContentPadding = contentPadding.beforePadding(
-            orientation, reverseLayout, layoutDirection
-        ).roundToPx()
-        val afterContentPadding = contentPadding.afterPadding(
-            orientation, reverseLayout, layoutDirection
-        ).roundToPx()
-        val startContentPadding = contentPadding.startPadding(
-            orientation, layoutDirection
-        ).roundToPx()
+            // setup measure
+            val beforeContentPadding =
+                contentPadding
+                    .beforePadding(orientation, reverseLayout, layoutDirection)
+                    .roundToPx()
+            val afterContentPadding =
+                contentPadding.afterPadding(orientation, reverseLayout, layoutDirection).roundToPx()
+            val startContentPadding =
+                contentPadding.startPadding(orientation, layoutDirection).roundToPx()
 
-        val maxMainAxisSize = if (isVertical) constraints.maxHeight else constraints.maxWidth
-        val mainAxisAvailableSize = maxMainAxisSize - beforeContentPadding - afterContentPadding
-        val contentOffset = if (isVertical) {
-            IntOffset(startContentPadding, beforeContentPadding)
-        } else {
-            IntOffset(beforeContentPadding, startContentPadding)
+            val maxMainAxisSize = if (isVertical) constraints.maxHeight else constraints.maxWidth
+            val mainAxisAvailableSize = maxMainAxisSize - beforeContentPadding - afterContentPadding
+            val contentOffset =
+                if (isVertical) {
+                    IntOffset(startContentPadding, beforeContentPadding)
+                } else {
+                    IntOffset(beforeContentPadding, startContentPadding)
+                }
+
+            val horizontalPadding =
+                contentPadding
+                    .run {
+                        calculateStartPadding(layoutDirection) +
+                            calculateEndPadding(layoutDirection)
+                    }
+                    .roundToPx()
+            val verticalPadding =
+                contentPadding.run { calculateTopPadding() + calculateBottomPadding() }.roundToPx()
+
+            val pinnedItems =
+                itemProvider.calculateLazyLayoutPinnedIndices(
+                    state.pinnedItems,
+                    state.beyondBoundsInfo
+                )
+
+            // todo: wrap with snapshot when b/341782245 is resolved
+            val measureResult =
+                measureStaggeredGrid(
+                    state = state,
+                    pinnedItems = pinnedItems,
+                    itemProvider = itemProvider,
+                    resolvedSlots = resolvedSlots,
+                    constraints =
+                        constraints.copy(
+                            minWidth = constraints.constrainWidth(horizontalPadding),
+                            minHeight = constraints.constrainHeight(verticalPadding)
+                        ),
+                    mainAxisSpacing = mainAxisSpacing.roundToPx(),
+                    contentOffset = contentOffset,
+                    mainAxisAvailableSize = mainAxisAvailableSize,
+                    isVertical = isVertical,
+                    reverseLayout = reverseLayout,
+                    beforeContentPadding = beforeContentPadding,
+                    afterContentPadding = afterContentPadding,
+                    coroutineScope = coroutineScope,
+                    graphicsContext = graphicsContext
+                )
+            state.applyMeasureResult(measureResult)
+            measureResult
         }
-
-        val horizontalPadding = contentPadding.run {
-            calculateStartPadding(layoutDirection) + calculateEndPadding(layoutDirection)
-        }.roundToPx()
-        val verticalPadding = contentPadding.run {
-            calculateTopPadding() + calculateBottomPadding()
-        }.roundToPx()
-
-        val pinnedItems = itemProvider.calculateLazyLayoutPinnedIndices(
-            state.pinnedItems,
-            state.beyondBoundsInfo
-        )
-
-        // todo: wrap with snapshot when b/341782245 is resolved
-        val measureResult =
-            measureStaggeredGrid(
-                state = state,
-                pinnedItems = pinnedItems,
-                itemProvider = itemProvider,
-                resolvedSlots = resolvedSlots,
-                constraints = constraints.copy(
-                    minWidth = constraints.constrainWidth(horizontalPadding),
-                    minHeight = constraints.constrainHeight(verticalPadding)
-                ),
-                mainAxisSpacing = mainAxisSpacing.roundToPx(),
-                contentOffset = contentOffset,
-                mainAxisAvailableSize = mainAxisAvailableSize,
-                isVertical = isVertical,
-                reverseLayout = reverseLayout,
-                beforeContentPadding = beforeContentPadding,
-                afterContentPadding = afterContentPadding,
-                coroutineScope = coroutineScope,
-                graphicsContext = graphicsContext
-            )
-        state.applyMeasureResult(measureResult)
-        measureResult
     }
-}
 
 private fun PaddingValues.startPadding(
     orientation: Orientation,
diff --git a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/staggeredgrid/LazyStaggeredGridMeasureResult.kt b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/staggeredgrid/LazyStaggeredGridMeasureResult.kt
index d1463fe..abd9545 100644
--- a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/staggeredgrid/LazyStaggeredGridMeasureResult.kt
+++ b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/staggeredgrid/LazyStaggeredGridMeasureResult.kt
@@ -30,17 +30,14 @@
 
 /**
  * Information about layout state of individual item in lazy staggered grid.
+ *
  * @see [LazyStaggeredGridLayoutInfo]
  */
 sealed interface LazyStaggeredGridItemInfo {
-    /**
-     * Relative offset from the start of the staggered grid.
-     */
+    /** Relative offset from the start of the staggered grid. */
     val offset: IntOffset
 
-    /**
-     * Index of the item.
-     */
+    /** Index of the item. */
     val index: Int
 
     /**
@@ -49,9 +46,7 @@
      */
     val lane: Int
 
-    /**
-     * Key of the item passed in [LazyStaggeredGridScope.items]
-     */
+    /** Key of the item passed in [LazyStaggeredGridScope.items] */
     val key: Any
 
     /**
@@ -60,42 +55,32 @@
      */
     val size: IntSize
 
-    /**
-     * The content type of the item which was passed to the item() or items() function.
-     */
+    /** The content type of the item which was passed to the item() or items() function. */
     val contentType: Any?
 }
 
 /**
- * Information about layout state of lazy staggered grids.
- * Can be retrieved from [LazyStaggeredGridState.layoutInfo].
+ * Information about layout state of lazy staggered grids. Can be retrieved from
+ * [LazyStaggeredGridState.layoutInfo].
  */
 // todo(b/182882362): expose more information about layout state
 sealed interface LazyStaggeredGridLayoutInfo {
-    /**
-     * Orientation of the staggered grid.
-     */
+    /** Orientation of the staggered grid. */
     val orientation: Orientation
 
-    /**
-     * The list of [LazyStaggeredGridItemInfo] per each visible item ordered by index.
-     */
+    /** The list of [LazyStaggeredGridItemInfo] per each visible item ordered by index. */
     val visibleItemsInfo: List<LazyStaggeredGridItemInfo>
 
-    /**
-     * The total count of items passed to staggered grid.
-     */
+    /** The total count of items passed to staggered grid. */
     val totalItemsCount: Int
 
-    /**
-     * Layout viewport (content + content padding) size in pixels.
-     */
+    /** Layout viewport (content + content padding) size in pixels. */
     val viewportSize: IntSize
 
     /**
      * The start offset of the layout's viewport in pixels. You can think of it as a minimum offset
-     * which would be visible. Can be negative if non-zero [beforeContentPadding]
-     * was applied as the content displayed in the content padding area is still visible.
+     * which would be visible. Can be negative if non-zero [beforeContentPadding] was applied as the
+     * content displayed in the content padding area is still visible.
      *
      * You can use it to understand what items from [visibleItemsInfo] are fully visible.
      */
@@ -109,19 +94,13 @@
      */
     val viewportEndOffset: Int
 
-    /**
-     * Content padding in pixels applied before the items in scroll direction.
-     */
+    /** Content padding in pixels applied before the items in scroll direction. */
     val beforeContentPadding: Int
 
-    /**
-     * Content padding in pixels applied after the items in scroll direction.
-     */
+    /** Content padding in pixels applied after the items in scroll direction. */
     val afterContentPadding: Int
 
-    /**
-     * The spacing between items in scroll direction.
-     */
+    /** The spacing between items in scroll direction. */
     val mainAxisItemSpacing: Int
 }
 
@@ -171,28 +150,31 @@
         if (isVertical) Orientation.Vertical else Orientation.Horizontal
 
     /**
-     * Tries to apply a scroll [delta] for this layout info. In some cases we can apply small
-     * scroll deltas by just changing the offsets for each [visibleItemsInfo].
-     * But we can only do so if after applying the delta we would not need to compose a new item
-     * or dispose an item which is currently visible. In this case this function will not apply
-     * the [delta] and return false.
+     * Tries to apply a scroll [delta] for this layout info. In some cases we can apply small scroll
+     * deltas by just changing the offsets for each [visibleItemsInfo]. But we can only do so if
+     * after applying the delta we would not need to compose a new item or dispose an item which is
+     * currently visible. In this case this function will not apply the [delta] and return false.
      *
-     * @return true if we can safely apply a passed scroll [delta] to this layout info.
-     * If true is returned, only the placement phase is needed to apply new offsets.
-     * If false is returned, it means we have to rerun the full measure phase to apply the [delta].
+     * @return true if we can safely apply a passed scroll [delta] to this layout info. If true is
+     *   returned, only the placement phase is needed to apply new offsets. If false is returned, it
+     *   means we have to rerun the full measure phase to apply the [delta].
      */
     fun tryToApplyScrollWithoutRemeasure(delta: Int): Boolean {
-        if (remeasureNeeded || visibleItemsInfo.isEmpty() || firstVisibleItemIndices.isEmpty() ||
-            firstVisibleItemScrollOffsets.isEmpty()
+        if (
+            remeasureNeeded ||
+                visibleItemsInfo.isEmpty() ||
+                firstVisibleItemIndices.isEmpty() ||
+                firstVisibleItemScrollOffsets.isEmpty()
         ) {
             return false
         }
         visibleItemsInfo.fastForEach {
             // non scrollable items require special handling.
-            if (it.nonScrollableItem ||
-                // applying delta will make this item to cross the 0th pixel, this means
-                // that firstVisibleItemIndices will change. we require a remeasure for it.
-                it.mainAxisOffset <= 0 != it.mainAxisOffset + delta <= 0
+            if (
+                it.nonScrollableItem ||
+                    // applying delta will make this item to cross the 0th pixel, this means
+                    // that firstVisibleItemIndices will change. we require a remeasure for it.
+                    it.mainAxisOffset <= 0 != it.mainAxisOffset + delta <= 0
             ) {
                 return false
             }
@@ -200,29 +182,31 @@
                 // we compare with viewportStartOffset in order to know when the item will became
                 // not visible anymore, and with 0 to know when the firstVisibleItemIndices will
                 // change. when we have a beforeContentPadding those values will not be the same.
-                val canApply = if (delta < 0) { // scrolling forward
-                    it.mainAxisOffset + it.mainAxisSizeWithSpacings - viewportStartOffset > -delta
-                } else { // scrolling backward
-                    viewportStartOffset - it.mainAxisOffset > delta
-                }
+                val canApply =
+                    if (delta < 0) { // scrolling forward
+                        it.mainAxisOffset + it.mainAxisSizeWithSpacings - viewportStartOffset >
+                            -delta
+                    } else { // scrolling backward
+                        viewportStartOffset - it.mainAxisOffset > delta
+                    }
                 if (!canApply) return false
             }
             // item is partially visible at the bottom.
             if (it.mainAxisOffset + it.mainAxisSizeWithSpacings >= viewportEndOffset) {
-                val canApply = if (delta < 0) { // scrolling forward
-                    it.mainAxisOffset + it.mainAxisSizeWithSpacings - viewportEndOffset > -delta
-                } else { // scrolling backward
-                    viewportEndOffset - it.mainAxisOffset > delta
-                }
+                val canApply =
+                    if (delta < 0) { // scrolling forward
+                        it.mainAxisOffset + it.mainAxisSizeWithSpacings - viewportEndOffset > -delta
+                    } else { // scrolling backward
+                        viewportEndOffset - it.mainAxisOffset > delta
+                    }
                 if (!canApply) return false
             }
         }
-        firstVisibleItemScrollOffsets = IntArray(firstVisibleItemScrollOffsets.size) { index ->
-            firstVisibleItemScrollOffsets[index] - delta
-        }
-        visibleItemsInfo.fastForEach {
-            it.applyScrollDelta(delta)
-        }
+        firstVisibleItemScrollOffsets =
+            IntArray(firstVisibleItemScrollOffsets.size) { index ->
+                firstVisibleItemScrollOffsets[index] - delta
+            }
+        visibleItemsInfo.fastForEach { it.applyScrollDelta(delta) }
         consumedScroll = delta.toFloat()
         if (!canScrollForward && delta > 0) {
             // we scrolled backward, so now we can scroll forward
@@ -235,30 +219,33 @@
 private val EmptyArray = IntArray(0)
 
 @OptIn(ExperimentalFoundationApi::class)
-internal val EmptyLazyStaggeredGridLayoutInfo = LazyStaggeredGridMeasureResult(
-    firstVisibleItemIndices = EmptyArray,
-    firstVisibleItemScrollOffsets = EmptyArray,
-    consumedScroll = 0f,
-    measureResult = object : MeasureResult {
-        override val width: Int = 0
-        override val height: Int = 0
-        @Suppress("PrimitiveInCollection")
-        override val alignmentLines: Map<AlignmentLine, Int> = emptyMap()
-        override fun placeChildren() {}
-    },
-    canScrollForward = false,
-    isVertical = false,
-    visibleItemsInfo = emptyList(),
-    totalItemsCount = 0,
-    remeasureNeeded = false,
-    viewportSize = IntSize.Zero,
-    viewportStartOffset = 0,
-    viewportEndOffset = 0,
-    beforeContentPadding = 0,
-    afterContentPadding = 0,
-    mainAxisItemSpacing = 0,
-    slots = LazyStaggeredGridSlots(EmptyArray, EmptyArray),
-    spanProvider = LazyStaggeredGridSpanProvider(MutableIntervalList()),
-    density = Density(1f),
-    coroutineScope = CoroutineScope(EmptyCoroutineContext)
-)
+internal val EmptyLazyStaggeredGridLayoutInfo =
+    LazyStaggeredGridMeasureResult(
+        firstVisibleItemIndices = EmptyArray,
+        firstVisibleItemScrollOffsets = EmptyArray,
+        consumedScroll = 0f,
+        measureResult =
+            object : MeasureResult {
+                override val width: Int = 0
+                override val height: Int = 0
+                @Suppress("PrimitiveInCollection")
+                override val alignmentLines: Map<AlignmentLine, Int> = emptyMap()
+
+                override fun placeChildren() {}
+            },
+        canScrollForward = false,
+        isVertical = false,
+        visibleItemsInfo = emptyList(),
+        totalItemsCount = 0,
+        remeasureNeeded = false,
+        viewportSize = IntSize.Zero,
+        viewportStartOffset = 0,
+        viewportEndOffset = 0,
+        beforeContentPadding = 0,
+        afterContentPadding = 0,
+        mainAxisItemSpacing = 0,
+        slots = LazyStaggeredGridSlots(EmptyArray, EmptyArray),
+        spanProvider = LazyStaggeredGridSpanProvider(MutableIntervalList()),
+        density = Density(1f),
+        coroutineScope = CoroutineScope(EmptyCoroutineContext)
+    )
diff --git a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/staggeredgrid/LazyStaggeredGridScrollPosition.kt b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/staggeredgrid/LazyStaggeredGridScrollPosition.kt
index 19591fc..8d8a6eef 100644
--- a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/staggeredgrid/LazyStaggeredGridScrollPosition.kt
+++ b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/staggeredgrid/LazyStaggeredGridScrollPosition.kt
@@ -34,13 +34,15 @@
 ) {
     var indices = initialIndices
         private set
+
     var index by mutableIntStateOf(calculateFirstVisibleIndex(initialIndices))
         private set
+
     var scrollOffsets = initialOffsets
         private set
-    var scrollOffset by mutableIntStateOf(
-        calculateFirstVisibleScrollOffset(initialIndices, initialOffsets)
-    )
+
+    var scrollOffset by
+        mutableIntStateOf(calculateFirstVisibleScrollOffset(initialIndices, initialOffsets))
         private set
 
     private fun calculateFirstVisibleIndex(indices: IntArray): Int {
@@ -70,21 +72,19 @@
     /** The last know key of the item at lowest of [indices] position. */
     private var lastKnownFirstItemKey: Any? = null
 
-    val nearestRangeState = LazyLayoutNearestRangeState(
-        initialIndices.minOrNull() ?: 0,
-        NearestItemsSlidingWindowSize,
-        NearestItemsExtraItemCount
-    )
+    val nearestRangeState =
+        LazyLayoutNearestRangeState(
+            initialIndices.minOrNull() ?: 0,
+            NearestItemsSlidingWindowSize,
+            NearestItemsExtraItemCount
+        )
 
-    /**
-     * Updates the current scroll position based on the results of the last measurement.
-     */
+    /** Updates the current scroll position based on the results of the last measurement. */
     fun updateFromMeasureResult(measureResult: LazyStaggeredGridMeasureResult) {
         val firstVisibleIndex = calculateFirstVisibleIndex(measureResult.firstVisibleItemIndices)
 
-        lastKnownFirstItemKey = measureResult.visibleItemsInfo
-            .fastFirstOrNull { it.index == firstVisibleIndex }
-            ?.key
+        lastKnownFirstItemKey =
+            measureResult.visibleItemsInfo.fastFirstOrNull { it.index == firstVisibleIndex }?.key
         nearestRangeState.update(firstVisibleIndex)
         // we ignore the index and offset from measureResult until we get at least one
         // measurement with real items. otherwise the initial index and scroll passed to the
@@ -107,14 +107,13 @@
 
     /**
      * Updates the scroll position - the passed values will be used as a start position for
-     * composing the items during the next measure pass and will be updated by the real
-     * position calculated during the measurement. This means that there is no guarantee that
-     * exactly this index and offset will be applied as it is possible that:
-     * a) there will be no item at this index in reality
-     * b) item at this index will be smaller than the asked scrollOffset, which means we would
-     * switch to the next item
-     * c) there will be not enough items to fill the viewport after the requested index, so we
-     * would have to compose few elements before the asked index, changing the first visible item.
+     * composing the items during the next measure pass and will be updated by the real position
+     * calculated during the measurement. This means that there is no guarantee that exactly this
+     * index and offset will be applied as it is possible that: a) there will be no item at this
+     * index in reality b) item at this index will be smaller than the asked scrollOffset, which
+     * means we would switch to the next item c) there will be not enough items to fill the viewport
+     * after the requested index, so we would have to compose few elements before the asked index,
+     * changing the first visible item.
      */
     fun requestPositionAndForgetLastKnownKey(index: Int, scrollOffset: Int) {
         val newIndices = fillIndices(index, indices.size)
@@ -127,20 +126,21 @@
     }
 
     /**
-     * In addition to keeping the first visible item index we also store the key of this item.
-     * When the user provided custom keys for the items this mechanism allows us to detect when
-     * there were items added or removed before our current first visible item and keep this item
-     * as the first visible one even given that its index has been changed.
+     * In addition to keeping the first visible item index we also store the key of this item. When
+     * the user provided custom keys for the items this mechanism allows us to detect when there
+     * were items added or removed before our current first visible item and keep this item as the
+     * first visible one even given that its index has been changed.
      */
     @ExperimentalFoundationApi
     fun updateScrollPositionIfTheFirstItemWasMoved(
         itemProvider: LazyLayoutItemProvider,
         indices: IntArray
     ): IntArray {
-        val newIndex = itemProvider.findIndexByKey(
-            key = lastKnownFirstItemKey,
-            lastKnownIndex = indices.getOrNull(0) ?: 0
-        )
+        val newIndex =
+            itemProvider.findIndexByKey(
+                key = lastKnownFirstItemKey,
+                lastKnownIndex = indices.getOrNull(0) ?: 0
+            )
         return if (newIndex !in indices) {
             nearestRangeState.update(newIndex)
             val newIndices = Snapshot.withoutReadObservation { fillIndices(newIndex, indices.size) }
@@ -166,7 +166,5 @@
  */
 private const val NearestItemsSlidingWindowSize = 90
 
-/**
- * The minimum amount of items near the current first visible item we want to have mapping for.
- */
+/** The minimum amount of items near the current first visible item we want to have mapping for. */
 private const val NearestItemsExtraItemCount = 200
diff --git a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/staggeredgrid/LazyStaggeredGridSemantics.kt b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/staggeredgrid/LazyStaggeredGridSemantics.kt
index 900a9c6..06cabe4 100644
--- a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/staggeredgrid/LazyStaggeredGridSemantics.kt
+++ b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/staggeredgrid/LazyStaggeredGridSemantics.kt
@@ -34,30 +34,34 @@
     remember(state, reverseScrolling) {
         object : LazyLayoutSemanticState {
             override val scrollOffset: Float
-                get() = estimatedLazyScrollOffset(
-                    state.firstVisibleItemIndex,
-                    state.firstVisibleItemScrollOffset
-                )
+                get() =
+                    estimatedLazyScrollOffset(
+                        state.firstVisibleItemIndex,
+                        state.firstVisibleItemScrollOffset
+                    )
+
             override val maxScrollOffset: Float
-                get() = estimatedLazyMaxScrollOffset(
-                    state.firstVisibleItemIndex,
-                    state.firstVisibleItemScrollOffset,
-                    state.canScrollForward
-                )
+                get() =
+                    estimatedLazyMaxScrollOffset(
+                        state.firstVisibleItemIndex,
+                        state.firstVisibleItemScrollOffset,
+                        state.canScrollForward
+                    )
 
             override suspend fun scrollToItem(index: Int) {
                 state.scrollToItem(index)
             }
 
-            override fun collectionInfo(): CollectionInfo =
-                CollectionInfo(-1, -1)
+            override fun collectionInfo(): CollectionInfo = CollectionInfo(-1, -1)
 
             override val viewport: Int
-                get() = if (state.layoutInfo.orientation == Orientation.Vertical) {
-                    state.layoutInfo.viewportSize.height
-                } else {
-                    state.layoutInfo.viewportSize.width
-                }
+                get() =
+                    if (state.layoutInfo.orientation == Orientation.Vertical) {
+                        state.layoutInfo.viewportSize.height
+                    } else {
+                        state.layoutInfo.viewportSize.width
+                    }
+
             override val contentPadding: Int
                 get() = state.layoutInfo.beforeContentPadding + state.layoutInfo.afterContentPadding
         }
diff --git a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/staggeredgrid/LazyStaggeredGridSpan.kt b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/staggeredgrid/LazyStaggeredGridSpan.kt
index b3260e3..1979a32 100644
--- a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/staggeredgrid/LazyStaggeredGridSpan.kt
+++ b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/staggeredgrid/LazyStaggeredGridSpan.kt
@@ -21,23 +21,18 @@
 import androidx.compose.foundation.lazy.staggeredgrid.StaggeredGridItemSpan.Companion.FullLine
 
 /**
- * Span defines a number of lanes (columns in vertical grid/rows in horizontal grid) for
- * staggered grid items.
- * Two variations of span are supported:
- *   - item taking a single lane ([SingleLane]);
- *   - item all lanes in line ([FullLine]).
- * By default, staggered grid uses [SingleLane] for all items.
+ * Span defines a number of lanes (columns in vertical grid/rows in horizontal grid) for staggered
+ * grid items. Two variations of span are supported:
+ * - item taking a single lane ([SingleLane]);
+ * - item all lanes in line ([FullLine]). By default, staggered grid uses [SingleLane] for all
+ *   items.
  */
 class StaggeredGridItemSpan private constructor(internal val value: Int) {
     companion object {
-        /**
-         * Force item to occupy whole line in cross axis.
-         */
+        /** Force item to occupy whole line in cross axis. */
         val FullLine = StaggeredGridItemSpan(0)
 
-        /**
-         * Force item to use a single lane.
-         */
+        /** Force item to use a single lane. */
         val SingleLane = StaggeredGridItemSpan(1)
     }
 }
diff --git a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/staggeredgrid/LazyStaggeredGridState.kt b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/staggeredgrid/LazyStaggeredGridState.kt
index 3a15ecb..a74a761 100644
--- a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/staggeredgrid/LazyStaggeredGridState.kt
+++ b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/staggeredgrid/LazyStaggeredGridState.kt
@@ -55,15 +55,14 @@
 /**
  * Creates a [LazyStaggeredGridState] that is remembered across composition.
  *
- * Calling this function with different parameters on recomposition WILL NOT recreate or change
- * the state.
- * Use [LazyStaggeredGridState.scrollToItem] or [LazyStaggeredGridState.animateScrollToItem] to
- * adjust position instead.
+ * Calling this function with different parameters on recomposition WILL NOT recreate or change the
+ * state. Use [LazyStaggeredGridState.scrollToItem] or [LazyStaggeredGridState.animateScrollToItem]
+ * to adjust position instead.
  *
  * @param initialFirstVisibleItemIndex initial position for
- *  [LazyStaggeredGridState.firstVisibleItemIndex]
+ *   [LazyStaggeredGridState.firstVisibleItemIndex]
  * @param initialFirstVisibleItemScrollOffset initial value for
- *  [LazyStaggeredGridState.firstVisibleItemScrollOffset]
+ *   [LazyStaggeredGridState.firstVisibleItemScrollOffset]
  * @return created and memoized [LazyStaggeredGridState] with given parameters.
  */
 @Composable
@@ -72,18 +71,16 @@
     initialFirstVisibleItemScrollOffset: Int = 0
 ): LazyStaggeredGridState =
     rememberSaveable(saver = LazyStaggeredGridState.Saver) {
-        LazyStaggeredGridState(
-            initialFirstVisibleItemIndex,
-            initialFirstVisibleItemScrollOffset
-        )
+        LazyStaggeredGridState(initialFirstVisibleItemIndex, initialFirstVisibleItemScrollOffset)
     }
 
 /**
- * Hoisted state object controlling [LazyVerticalStaggeredGrid] or [LazyHorizontalStaggeredGrid].
- * In most cases, it should be created via [rememberLazyStaggeredGridState].
+ * Hoisted state object controlling [LazyVerticalStaggeredGrid] or [LazyHorizontalStaggeredGrid]. In
+ * most cases, it should be created via [rememberLazyStaggeredGridState].
  */
 @OptIn(ExperimentalFoundationApi::class)
-class LazyStaggeredGridState internal constructor(
+class LazyStaggeredGridState
+internal constructor(
     initialFirstVisibleItems: IntArray,
     initialFirstVisibleOffsets: IntArray,
     prefetchScheduler: PrefetchScheduler?
@@ -107,7 +104,8 @@
      * This property is observable and when use it in composable function it will be recomposed on
      * each scroll, potentially causing performance issues.
      */
-    val firstVisibleItemIndex: Int get() = scrollPosition.index
+    val firstVisibleItemIndex: Int
+        get() = scrollPosition.index
 
     /**
      * Current offset of the item with [firstVisibleItemIndex] relative to the container start.
@@ -115,14 +113,16 @@
      * This property is observable and when use it in composable function it will be recomposed on
      * each scroll, potentially causing performance issues.
      */
-    val firstVisibleItemScrollOffset: Int get() = scrollPosition.scrollOffset
+    val firstVisibleItemScrollOffset: Int
+        get() = scrollPosition.scrollOffset
 
     /** holder for current scroll position */
-    internal val scrollPosition = LazyStaggeredGridScrollPosition(
-        initialFirstVisibleItems,
-        initialFirstVisibleOffsets,
-        ::fillNearestIndices
-    )
+    internal val scrollPosition =
+        LazyStaggeredGridScrollPosition(
+            initialFirstVisibleItems,
+            initialFirstVisibleOffsets,
+            ::fillNearestIndices
+        )
 
     /**
      * Layout information calculated during last layout pass, with information about currently
@@ -131,25 +131,26 @@
      * This property is observable and when use it in composable function it will be recomposed on
      * each scroll, potentially causing performance issues.
      */
-    val layoutInfo: LazyStaggeredGridLayoutInfo get() = layoutInfoState.value
+    val layoutInfo: LazyStaggeredGridLayoutInfo
+        get() = layoutInfoState.value
 
     /** backing state for [layoutInfo] */
-    private val layoutInfoState = mutableStateOf(
-        EmptyLazyStaggeredGridLayoutInfo,
-        neverEqualPolicy()
-    )
+    private val layoutInfoState =
+        mutableStateOf(EmptyLazyStaggeredGridLayoutInfo, neverEqualPolicy())
 
     /** storage for lane assignments for each item for consistent scrolling in both directions */
     internal val laneInfo = LazyStaggeredGridLaneInfo()
 
     override var canScrollForward: Boolean by mutableStateOf(false)
         private set
+
     override var canScrollBackward: Boolean by mutableStateOf(false)
         private set
 
     @get:Suppress("GetterSetterNames")
     override val lastScrolledForward: Boolean
         get() = scrollableState.lastScrolledForward
+
     @get:Suppress("GetterSetterNames")
     override val lastScrolledBackward: Boolean
         get() = scrollableState.lastScrolledBackward
@@ -160,23 +161,22 @@
     internal var remeasurement: Remeasurement? = null
         private set
 
-    internal val remeasurementModifier = object : RemeasurementModifier {
-        override fun onRemeasurementAvailable(remeasurement: Remeasurement) {
-            this@LazyStaggeredGridState.remeasurement = remeasurement
+    internal val remeasurementModifier =
+        object : RemeasurementModifier {
+            override fun onRemeasurementAvailable(remeasurement: Remeasurement) {
+                this@LazyStaggeredGridState.remeasurement = remeasurement
+            }
         }
-    }
 
     /**
-     * Provides a modifier which allows to delay some interactions (e.g. scroll)
-     * until layout is ready.
+     * Provides a modifier which allows to delay some interactions (e.g. scroll) until layout is
+     * ready.
      */
     internal val awaitLayoutModifier = AwaitFirstLayoutModifier()
 
     internal val beyondBoundsInfo = LazyLayoutBeyondBoundsInfo()
 
-    /**
-     * Only used for testing to disable prefetching when needed to test the main logic.
-     */
+    /** Only used for testing to disable prefetching when needed to test the main logic. */
     /*@VisibleForTesting*/
     internal var prefetchingEnabled: Boolean = true
 
@@ -197,21 +197,21 @@
     private var prefetchBaseIndex: Int = -1
     private val currentItemPrefetchHandles = mutableMapOf<Int, PrefetchHandle>()
 
-    internal val laneCount get() = layoutInfoState.value.slots.sizes.size
+    internal val laneCount
+        get() = layoutInfoState.value.slots.sizes.size
 
     /**
-     * [InteractionSource] that will be used to dispatch drag events when this
-     * list is being dragged. If you want to know whether the fling (or animated scroll) is in
-     * progress, use [isScrollInProgress].
+     * [InteractionSource] that will be used to dispatch drag events when this list is being
+     * dragged. If you want to know whether the fling (or animated scroll) is in progress, use
+     * [isScrollInProgress].
      */
-    val interactionSource get(): InteractionSource = mutableInteractionSource
+    val interactionSource
+        get(): InteractionSource = mutableInteractionSource
 
     /** backing field mutable field for [interactionSource] */
     internal val mutableInteractionSource = MutableInteractionSource()
 
-    /**
-     * Stores currently pinned items which are always composed.
-     */
+    /** Stores currently pinned items which are always composed. */
     internal val pinnedItems = LazyLayoutPinnedItemList()
 
     internal val itemAnimator = LazyLayoutItemAnimator<LazyStaggeredGridMeasuredItem>()
@@ -223,8 +223,8 @@
     /**
      * Call this function to take control of scrolling and gain the ability to send scroll events
      * via [ScrollScope.scrollBy]. All actions that change the logical scroll position must be
-     * performed within a [scroll] block (even if they don't call any other methods on this
-     * object) in order to guarantee that mutual exclusion is enforced.
+     * performed within a [scroll] block (even if they don't call any other methods on this object)
+     * in order to guarantee that mutual exclusion is enforced.
      *
      * If [scroll] is called from elsewhere, this will be canceled.
      */
@@ -237,8 +237,8 @@
     }
 
     /**
-     * Whether this [scrollableState] is currently scrolling by gesture, fling or programmatically or
-     * not.
+     * Whether this [scrollableState] is currently scrolling by gesture, fling or programmatically
+     * or not.
      */
     override val isScrollInProgress: Boolean
         get() = scrollableState.isScrollInProgress
@@ -261,10 +261,7 @@
             val preScrollToBeConsumed = scrollToBeConsumed
             val intDelta = scrollToBeConsumed.roundToInt()
             if (layoutInfo.tryToApplyScrollWithoutRemeasure(intDelta)) {
-                applyMeasureResult(
-                    result = layoutInfo,
-                    visibleItemsStayedTheSame = true
-                )
+                applyMeasureResult(result = layoutInfo, visibleItemsStayedTheSame = true)
                 // we don't need to remeasure, so we only trigger re-placement:
                 placementScopeInvalidator.invalidateScope()
 
@@ -296,17 +293,15 @@
      *
      * @param index the index to which to scroll. MUST NOT be negative.
      * @param scrollOffset the offset where the item should end up after the scroll. Note that
-     * positive offset refers to forward scroll, so in a reversed list, positive offset will
-     * scroll the item further upward (taking it partly offscreen).
+     *   positive offset refers to forward scroll, so in a reversed list, positive offset will
+     *   scroll the item further upward (taking it partly offscreen).
      */
     suspend fun scrollToItem(
         /* @IntRange(from = 0) */
         index: Int,
         scrollOffset: Int = 0
     ) {
-        scroll {
-            snapToItemInternal(index, scrollOffset, forceRemeasure = true)
-        }
+        scroll { snapToItemInternal(index, scrollOffset, forceRemeasure = true) }
     }
 
     /**
@@ -314,8 +309,8 @@
      *
      * @param index the index to which to scroll. MUST NOT be negative.
      * @param scrollOffset the offset that the item should end up after the scroll. Note that
-     * positive offset refers to forward scroll, so in a top-to-bottom list, positive offset will
-     * scroll the item further upward (taking it partly offscreen).
+     *   positive offset refers to forward scroll, so in a top-to-bottom list, positive offset will
+     *   scroll the item further upward (taking it partly offscreen).
      */
     suspend fun animateScrollToItem(
         /* @IntRange(from = 0) */
@@ -335,38 +330,32 @@
     internal val measurementScopeInvalidator = ObservableScopeInvalidator()
 
     /**
-     * Requests the item at [index] to be at the start of the viewport during the next
-     * remeasure, offset by [scrollOffset], and schedules a remeasure.
+     * Requests the item at [index] to be at the start of the viewport during the next remeasure,
+     * offset by [scrollOffset], and schedules a remeasure.
      *
-     * The scroll position will be updated to the requested position rather than maintain
-     * the index based on the first visible item key (when a data set change will also be
-     * applied during the next remeasure), but *only* for the next remeasure.
+     * The scroll position will be updated to the requested position rather than maintain the index
+     * based on the first visible item key (when a data set change will also be applied during the
+     * next remeasure), but *only* for the next remeasure.
      *
      * Any scroll in progress will be cancelled.
      *
      * @param index the index to which to scroll. Must be non-negative.
      * @param scrollOffset the offset that the item should end up after the scroll. Note that
-     * positive offset refers to forward scroll, so in a top-to-bottom list, positive offset will
-     * scroll the item further upward (taking it partly offscreen).
+     *   positive offset refers to forward scroll, so in a top-to-bottom list, positive offset will
+     *   scroll the item further upward (taking it partly offscreen).
      */
-    fun requestScrollToItem(
-        @AndroidXIntRange(from = 0)
-        index: Int,
-        scrollOffset: Int = 0
-    ) {
+    fun requestScrollToItem(@AndroidXIntRange(from = 0) index: Int, scrollOffset: Int = 0) {
         // Cancel any scroll in progress.
         if (isScrollInProgress) {
-            layoutInfoState.value.coroutineScope.launch {
-                stopScroll()
-            }
+            layoutInfoState.value.coroutineScope.launch { stopScroll() }
         }
 
         snapToItemInternal(index, scrollOffset, forceRemeasure = false)
     }
 
     internal fun snapToItemInternal(index: Int, scrollOffset: Int, forceRemeasure: Boolean) {
-        val positionChanged = scrollPosition.index != index ||
-            scrollPosition.scrollOffset != scrollOffset
+        val positionChanged =
+            scrollPosition.index != index || scrollPosition.scrollOffset != scrollOffset
         // sometimes this method is called not to scroll, but to stay on the same index when
         // the data changes, as by default we maintain the scroll position by key, not index.
         // when this happens we don't need to reset the animations as from the user perspective
@@ -381,15 +370,17 @@
         val layoutInfo = layoutInfoState.value
         val visibleItem = layoutInfo.findVisibleItem(index)
         if (visibleItem != null && positionChanged) {
-            val currentOffset = if (layoutInfo.orientation == Orientation.Vertical) {
-                visibleItem.offset.y
-            } else {
-                visibleItem.offset.x
-            }
+            val currentOffset =
+                if (layoutInfo.orientation == Orientation.Vertical) {
+                    visibleItem.offset.y
+                } else {
+                    visibleItem.offset.x
+                }
             val delta = currentOffset + scrollOffset
-            val offsets = IntArray(layoutInfo.firstVisibleItemScrollOffsets.size) {
-                layoutInfo.firstVisibleItemScrollOffsets[it] + delta
-            }
+            val offsets =
+                IntArray(layoutInfo.firstVisibleItemScrollOffsets.size) {
+                    layoutInfo.firstVisibleItemScrollOffsets[it] + delta
+                }
             scrollPosition.updateScrollOffset(offsets)
         } else {
             scrollPosition.requestPositionAndForgetLastKnownKey(index, scrollOffset)
@@ -401,17 +392,14 @@
         }
     }
 
-    /**
-     * Maintain scroll position for item based on custom key if its index has changed.
-     */
+    /** Maintain scroll position for item based on custom key if its index has changed. */
     internal fun updateScrollPositionIfTheFirstItemWasMoved(
         itemProvider: LazyLayoutItemProvider,
         firstItemIndex: IntArray
     ): IntArray =
         scrollPosition.updateScrollPositionIfTheFirstItemWasMoved(itemProvider, firstItemIndex)
 
-    override fun dispatchRawDelta(delta: Float): Float =
-        scrollableState.dispatchRawDelta(delta)
+    override fun dispatchRawDelta(delta: Float): Float = scrollableState.dispatchRawDelta(delta)
 
     /** Start prefetch of the items based on provided delta */
     private fun notifyPrefetch(
@@ -421,11 +409,12 @@
         if (prefetchingEnabled && info.visibleItemsInfo.isNotEmpty()) {
             val scrollingForward = delta < 0
 
-            val prefetchIndex = if (scrollingForward) {
-                info.visibleItemsInfo.last().index
-            } else {
-                info.visibleItemsInfo.first().index
-            }
+            val prefetchIndex =
+                if (scrollingForward) {
+                    info.visibleItemsInfo.last().index
+                } else {
+                    info.visibleItemsInfo.first().index
+                }
 
             if (prefetchIndex == prefetchBaseIndex) {
                 // Already prefetched based on this index
@@ -441,14 +430,15 @@
                 val previousIndex = targetIndex
 
                 // find the next item for each line and prefetch if it is valid
-                targetIndex = if (scrollingForward) {
-                    laneInfo.findNextItemIndex(previousIndex, lane)
-                } else {
-                    laneInfo.findPreviousItemIndex(previousIndex, lane)
-                }
+                targetIndex =
+                    if (scrollingForward) {
+                        laneInfo.findNextItemIndex(previousIndex, lane)
+                    } else {
+                        laneInfo.findPreviousItemIndex(previousIndex, lane)
+                    }
                 if (
                     targetIndex !in (0 until info.totalItemsCount) ||
-                    targetIndex in prefetchHandlesUsed
+                        targetIndex in prefetchHandlesUsed
                 ) {
                     break
                 }
@@ -462,26 +452,26 @@
                 val slot = if (isFullSpan) 0 else lane
                 val span = if (isFullSpan) laneCount else 1
 
-                val crossAxisSize = when {
-                    span == 1 -> slots.sizes[slot]
-                    else -> {
-                        val start = slots.positions[slot]
-                        val endSlot = slot + span - 1
-                        val end = slots.positions[endSlot] + slots.sizes[endSlot]
-                        end - start
+                val crossAxisSize =
+                    when {
+                        span == 1 -> slots.sizes[slot]
+                        else -> {
+                            val start = slots.positions[slot]
+                            val endSlot = slot + span - 1
+                            val end = slots.positions[endSlot] + slots.sizes[endSlot]
+                            end - start
+                        }
                     }
-                }
 
-                val constraints = if (info.orientation == Orientation.Vertical) {
-                    Constraints.fixedWidth(crossAxisSize)
-                } else {
-                    Constraints.fixedHeight(crossAxisSize)
-                }
+                val constraints =
+                    if (info.orientation == Orientation.Vertical) {
+                        Constraints.fixedWidth(crossAxisSize)
+                    } else {
+                        Constraints.fixedHeight(crossAxisSize)
+                    }
 
-                currentItemPrefetchHandles[targetIndex] = prefetchState.schedulePrefetch(
-                    index = targetIndex,
-                    constraints = constraints
-                )
+                currentItemPrefetchHandles[targetIndex] =
+                    prefetchState.schedulePrefetch(index = targetIndex, constraints = constraints)
             }
 
             clearLeftoverPrefetchHandles(prefetchHandlesUsed)
@@ -542,7 +532,8 @@
         val targetLaneIndex =
             when (val previousLane = laneInfo.getLane(itemIndex)) {
                 // lane was never set or contains obsolete full span (the check for full span above)
-                Unset, FullSpan -> 0
+                Unset,
+                FullSpan -> 0
                 // lane was previously set, keep item to the same lane
                 else -> {
                     require(previousLane >= 0) {
@@ -576,19 +567,13 @@
     }
 
     companion object {
-        /**
-         * The default implementation of [Saver] for [LazyStaggeredGridState]
-         */
-        val Saver = listSaver<LazyStaggeredGridState, IntArray>(
-            save = { state ->
-                listOf(
-                    state.scrollPosition.indices,
-                    state.scrollPosition.scrollOffsets
-                )
-            },
-            restore = {
-                LazyStaggeredGridState(it[0], it[1], null)
-            }
-        )
+        /** The default implementation of [Saver] for [LazyStaggeredGridState] */
+        val Saver =
+            listSaver<LazyStaggeredGridState, IntArray>(
+                save = { state ->
+                    listOf(state.scrollPosition.indices, state.scrollPosition.scrollOffsets)
+                },
+                restore = { LazyStaggeredGridState(it[0], it[1], null) }
+            )
     }
 }
diff --git a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/pager/LazyLayoutPager.kt b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/pager/LazyLayoutPager.kt
index d007406..24d396c 100644
--- a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/pager/LazyLayoutPager.kt
+++ b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/pager/LazyLayoutPager.kt
@@ -87,7 +87,7 @@
     pageSpacing: Dp = 0.dp,
     /** Allows to change how to calculate the Page size */
     pageSize: PageSize,
-    /** A [NestedScrollConnection] that dictates how this [Pager] behaves with nested lists.  */
+    /** A [NestedScrollConnection] that dictates how this [Pager] behaves with nested lists. */
     pageNestedScrollConnection: NestedScrollConnection,
     /** a stable and unique key representing the Page */
     key: ((index: Int) -> Any)?,
@@ -105,93 +105,90 @@
             "you selected $beyondViewportPageCount"
     }
 
-    val pagerItemProvider = rememberPagerItemProviderLambda(
-        state = state,
-        pageContent = pageContent,
-        key = key
-    ) { state.pageCount }
+    val pagerItemProvider =
+        rememberPagerItemProviderLambda(state = state, pageContent = pageContent, key = key) {
+            state.pageCount
+        }
 
     val coroutineScope = rememberCoroutineScope()
 
-    val measurePolicy = rememberPagerMeasurePolicy(
-        state = state,
-        contentPadding = contentPadding,
-        reverseLayout = reverseLayout,
-        orientation = orientation,
-        beyondViewportPageCount = beyondViewportPageCount,
-        pageSpacing = pageSpacing,
-        pageSize = pageSize,
-        horizontalAlignment = horizontalAlignment,
-        verticalAlignment = verticalAlignment,
-        itemProviderLambda = pagerItemProvider,
-        snapPosition = snapPosition,
-        coroutineScope = coroutineScope,
-        pageCount = { state.pageCount }
-    )
+    val measurePolicy =
+        rememberPagerMeasurePolicy(
+            state = state,
+            contentPadding = contentPadding,
+            reverseLayout = reverseLayout,
+            orientation = orientation,
+            beyondViewportPageCount = beyondViewportPageCount,
+            pageSpacing = pageSpacing,
+            pageSize = pageSize,
+            horizontalAlignment = horizontalAlignment,
+            verticalAlignment = verticalAlignment,
+            itemProviderLambda = pagerItemProvider,
+            snapPosition = snapPosition,
+            coroutineScope = coroutineScope,
+            pageCount = { state.pageCount }
+        )
 
-    val semanticState = rememberPagerSemanticState(
-        state,
-        orientation == Orientation.Vertical
-    )
+    val semanticState = rememberPagerSemanticState(state, orientation == Orientation.Vertical)
 
-    val resolvedFlingBehavior = remember(state, flingBehavior) {
-        PagerWrapperFlingBehavior(flingBehavior, state)
-    }
+    val resolvedFlingBehavior =
+        remember(state, flingBehavior) { PagerWrapperFlingBehavior(flingBehavior, state) }
 
     val defaultBringIntoViewSpec = LocalBringIntoViewSpec.current
-    val pagerBringIntoViewSpec = remember(state, defaultBringIntoViewSpec) {
-        PagerBringIntoViewSpec(
-            state,
-            defaultBringIntoViewSpec
-        )
-    }
+    val pagerBringIntoViewSpec =
+        remember(state, defaultBringIntoViewSpec) {
+            PagerBringIntoViewSpec(state, defaultBringIntoViewSpec)
+        }
 
-    val reverseDirection = ScrollableDefaults.reverseDirection(
-        LocalLayoutDirection.current,
-        orientation,
-        reverseLayout
-    )
+    val reverseDirection =
+        ScrollableDefaults.reverseDirection(
+            LocalLayoutDirection.current,
+            orientation,
+            reverseLayout
+        )
 
     LazyLayout(
-        modifier = modifier
-            .then(state.remeasurementModifier)
-            .then(state.awaitLayoutModifier)
-            .lazyLayoutSemantics(
-                itemProviderLambda = pagerItemProvider,
-                state = semanticState,
-                orientation = orientation,
-                userScrollEnabled = userScrollEnabled,
-                reverseScrolling = reverseLayout,
-            )
-            .pagerSemantics(
-                state,
-                orientation == Orientation.Vertical,
-                coroutineScope,
-                userScrollEnabled
-            )
-            .lazyLayoutBeyondBoundsModifier(
-                state = rememberPagerBeyondBoundsState(
+        modifier =
+            modifier
+                .then(state.remeasurementModifier)
+                .then(state.awaitLayoutModifier)
+                .lazyLayoutSemantics(
+                    itemProviderLambda = pagerItemProvider,
+                    state = semanticState,
+                    orientation = orientation,
+                    userScrollEnabled = userScrollEnabled,
+                    reverseScrolling = reverseLayout,
+                )
+                .pagerSemantics(
+                    state,
+                    orientation == Orientation.Vertical,
+                    coroutineScope,
+                    userScrollEnabled
+                )
+                .lazyLayoutBeyondBoundsModifier(
+                    state =
+                        rememberPagerBeyondBoundsState(
+                            state = state,
+                            beyondViewportPageCount = beyondViewportPageCount
+                        ),
+                    beyondBoundsInfo = state.beyondBoundsInfo,
+                    reverseLayout = reverseLayout,
+                    layoutDirection = LocalLayoutDirection.current,
+                    orientation = orientation,
+                    enabled = userScrollEnabled
+                )
+                .scrollingContainer(
                     state = state,
-                    beyondViewportPageCount = beyondViewportPageCount
-                ),
-                beyondBoundsInfo = state.beyondBoundsInfo,
-                reverseLayout = reverseLayout,
-                layoutDirection = LocalLayoutDirection.current,
-                orientation = orientation,
-                enabled = userScrollEnabled
-            )
-            .scrollingContainer(
-                state = state,
-                orientation = orientation,
-                enabled = userScrollEnabled,
-                reverseDirection = reverseDirection,
-                flingBehavior = resolvedFlingBehavior,
-                interactionSource = state.internalInteractionSource,
-                bringIntoViewSpec = pagerBringIntoViewSpec,
-                overscrollEffect = ScrollableDefaults.overscrollEffect()
-            )
-            .dragDirectionDetector(state)
-            .nestedScroll(pageNestedScrollConnection),
+                    orientation = orientation,
+                    enabled = userScrollEnabled,
+                    reverseDirection = reverseDirection,
+                    flingBehavior = resolvedFlingBehavior,
+                    interactionSource = state.internalInteractionSource,
+                    bringIntoViewSpec = pagerBringIntoViewSpec,
+                    overscrollEffect = ScrollableDefaults.overscrollEffect()
+                )
+                .dragDirectionDetector(state)
+                .nestedScroll(pageNestedScrollConnection),
         measurePolicy = measurePolicy,
         prefetchState = state.prefetchState,
         itemProvider = pagerItemProvider
@@ -267,45 +264,46 @@
     val latestContent = rememberUpdatedState(pageContent)
     val latestKey = rememberUpdatedState(key)
     return remember(state, latestContent, latestKey, pageCount) {
-        val intervalContentState = derivedStateOf(referentialEqualityPolicy()) {
-            PagerLayoutIntervalContent(latestContent.value, latestKey.value, pageCount())
-        }
-        val itemProviderState = derivedStateOf(referentialEqualityPolicy()) {
-            val intervalContent = intervalContentState.value
-            val map = NearestRangeKeyIndexMap(state.nearestRange, intervalContent)
-            PagerLazyLayoutItemProvider(
-                state = state,
-                intervalContent = intervalContent,
-                keyIndexMap = map
-            )
-        }
+        val intervalContentState =
+            derivedStateOf(referentialEqualityPolicy()) {
+                PagerLayoutIntervalContent(latestContent.value, latestKey.value, pageCount())
+            }
+        val itemProviderState =
+            derivedStateOf(referentialEqualityPolicy()) {
+                val intervalContent = intervalContentState.value
+                val map = NearestRangeKeyIndexMap(state.nearestRange, intervalContent)
+                PagerLazyLayoutItemProvider(
+                    state = state,
+                    intervalContent = intervalContent,
+                    keyIndexMap = map
+                )
+            }
         itemProviderState::value
     }
 }
 
-/**
- * A modifier to detect up and down events in a Pager.
- */
+/** A modifier to detect up and down events in a Pager. */
 private fun Modifier.dragDirectionDetector(state: PagerState) =
-    this then Modifier.pointerInput(state) {
-        coroutineScope {
-            awaitEachGesture {
-                val downEvent =
-                    awaitFirstDown(requireUnconsumed = false, pass = PointerEventPass.Initial)
-                var upEventOrCancellation: PointerInputChange? = null
-                state.upDownDifference = Offset.Zero // Reset
-                while (upEventOrCancellation == null) {
-                    val event = awaitPointerEvent(pass = PointerEventPass.Initial)
-                    if (event.changes.fastAll { it.changedToUp() }) {
-                        // All pointers are up
-                        upEventOrCancellation = event.changes[0]
+    this then
+        Modifier.pointerInput(state) {
+            coroutineScope {
+                awaitEachGesture {
+                    val downEvent =
+                        awaitFirstDown(requireUnconsumed = false, pass = PointerEventPass.Initial)
+                    var upEventOrCancellation: PointerInputChange? = null
+                    state.upDownDifference = Offset.Zero // Reset
+                    while (upEventOrCancellation == null) {
+                        val event = awaitPointerEvent(pass = PointerEventPass.Initial)
+                        if (event.changes.fastAll { it.changedToUp() }) {
+                            // All pointers are up
+                            upEventOrCancellation = event.changes[0]
+                        }
                     }
-                }
 
-                state.upDownDifference = upEventOrCancellation.position - downEvent.position
+                    state.upDownDifference = upEventOrCancellation.position - downEvent.position
+                }
             }
         }
-    }
 
 @OptIn(ExperimentalFoundationApi::class)
 private class PagerBringIntoViewSpec(
@@ -314,51 +312,51 @@
 ) : BringIntoViewSpec {
 
     /**
-     * [calculateScrollDistance] for Pager behaves differently than in a normal list. We must
-     * always respect the snapped pages over bringing a child into view. The logic here will
-     * behave like so:
-     *
-     * 1) If there's an ongoing request from the default bring into view spec, override the value
-     * to make it land on the closest page to the requested offset.
+     * [calculateScrollDistance] for Pager behaves differently than in a normal list. We must always
+     * respect the snapped pages over bringing a child into view. The logic here will behave like
+     * so:
+     * 1) If there's an ongoing request from the default bring into view spec, override the value to
+     *    make it land on the closest page to the requested offset.
      * 2) If there's no ongoing request it means that either we moved enough to fulfill the
-     * previously on going request or we didn't need move at all.
-     * 2a) If we didn't move at all we do nothing (pagerState.firstVisiblePageOffset == 0)
-     * 2b) If we fulfilled the default request, settle to the next page in the direction where
-     * we were scrolling before. We use firstVisiblePage as anchor, but the goal is to keep
-     * the pager snapped.
+     *    previously on going request or we didn't need move at all. 2a) If we didn't move at all we
+     *    do nothing (pagerState.firstVisiblePageOffset == 0) 2b) If we fulfilled the default
+     *    request, settle to the next page in the direction where we were scrolling before. We use
+     *    firstVisiblePage as anchor, but the goal is to keep the pager snapped.
      */
     override fun calculateScrollDistance(offset: Float, size: Float, containerSize: Float): Float {
         val proposedOffsetMove =
             defaultBringIntoViewSpec.calculateScrollDistance(offset, size, containerSize)
 
-        val finalOffset = if (proposedOffsetMove != 0.0f) {
-            overrideProposedOffsetMove(proposedOffsetMove)
-        } else {
-            // if there's no info from the default behavior, or if we already satisfied their
-            // request.
-            if (pagerState.firstVisiblePageOffset == 0) {
-                // do nothing, we're settled
-                0f
+        val finalOffset =
+            if (proposedOffsetMove != 0.0f) {
+                overrideProposedOffsetMove(proposedOffsetMove)
             } else {
-                // move one page forward or backward, whilst making sure we don't move out of bounds
-                // again.
-                val reversedFirstPageScroll = pagerState.firstVisiblePageOffset * -1f
-                if (pagerState.lastScrolledForward) {
-                    reversedFirstPageScroll + pagerState.pageSizeWithSpacing
+                // if there's no info from the default behavior, or if we already satisfied their
+                // request.
+                if (pagerState.firstVisiblePageOffset == 0) {
+                    // do nothing, we're settled
+                    0f
                 } else {
-                    reversedFirstPageScroll
-                }.coerceIn(-containerSize, containerSize)
-                // moving the pager outside of container size bounds will make the focused item
-                // disappear so we're limiting how much we can scroll so the page won't move too much.
+                    // move one page forward or backward, whilst making sure we don't move out of
+                    // bounds
+                    // again.
+                    val reversedFirstPageScroll = pagerState.firstVisiblePageOffset * -1f
+                    if (pagerState.lastScrolledForward) {
+                            reversedFirstPageScroll + pagerState.pageSizeWithSpacing
+                        } else {
+                            reversedFirstPageScroll
+                        }
+                        .coerceIn(-containerSize, containerSize)
+                    // moving the pager outside of container size bounds will make the focused item
+                    // disappear so we're limiting how much we can scroll so the page won't move too
+                    // much.
+                }
             }
-        }
 
         return finalOffset
     }
 
-    private fun overrideProposedOffsetMove(
-        proposedOffsetMove: Float
-    ): Float {
+    private fun overrideProposedOffsetMove(proposedOffsetMove: Float): Float {
         var correctedOffset = pagerState.firstVisiblePageOffset.toFloat() * -1
 
         // if moving forward, start from the first visible page, move as many pages as proposed.
@@ -374,9 +372,7 @@
     }
 }
 
-/**
- * Wraps [snapFlingBehavior] to give out information about target page coming from flings.
- */
+/** Wraps [snapFlingBehavior] to give out information about target page coming from flings. */
 private class PagerWrapperFlingBehavior(
     val originalFlingBehavior: TargetedFlingBehavior,
     val pagerState: PagerState
@@ -385,15 +381,14 @@
         val scope: ScrollScope = this
         return with(originalFlingBehavior) {
             performFling(initialVelocity) { remainingScrollOffset ->
-                val flingPageDisplacement = if (pagerState.pageSizeWithSpacing != 0) {
-                    remainingScrollOffset / (pagerState.pageSizeWithSpacing)
-                } else {
-                    0f
-                }
+                val flingPageDisplacement =
+                    if (pagerState.pageSizeWithSpacing != 0) {
+                        remainingScrollOffset / (pagerState.pageSizeWithSpacing)
+                    } else {
+                        0f
+                    }
                 val targetPage = flingPageDisplacement.roundToInt() + pagerState.currentPage
-                with(pagerState) {
-                    scope.updateTargetPage(targetPage)
-                }
+                with(pagerState) { scope.updateTargetPage(targetPage) }
             }
         }
     }
diff --git a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/pager/LazyLayoutSemanticState.kt b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/pager/LazyLayoutSemanticState.kt
index 09331ca..ceb5a16 100644
--- a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/pager/LazyLayoutSemanticState.kt
+++ b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/pager/LazyLayoutSemanticState.kt
@@ -23,29 +23,33 @@
 internal fun LazyLayoutSemanticState(
     state: PagerState,
     isVertical: Boolean
-): LazyLayoutSemanticState = object : LazyLayoutSemanticState {
-    override val scrollOffset: Float
-        get() = state.currentAbsoluteScrollOffset().toFloat()
-    override val maxScrollOffset: Float
-        get() = state.layoutInfo.calculateNewMaxScrollOffset(state.pageCount).toFloat()
+): LazyLayoutSemanticState =
+    object : LazyLayoutSemanticState {
+        override val scrollOffset: Float
+            get() = state.currentAbsoluteScrollOffset().toFloat()
 
-    override suspend fun scrollToItem(index: Int) {
-        state.scrollToPage(index)
+        override val maxScrollOffset: Float
+            get() = state.layoutInfo.calculateNewMaxScrollOffset(state.pageCount).toFloat()
+
+        override suspend fun scrollToItem(index: Int) {
+            state.scrollToPage(index)
+        }
+
+        override fun collectionInfo(): CollectionInfo =
+            if (isVertical) {
+                CollectionInfo(rowCount = state.pageCount, columnCount = 1)
+            } else {
+                CollectionInfo(rowCount = 1, columnCount = state.pageCount)
+            }
+
+        override val viewport: Int
+            get() =
+                if (state.layoutInfo.orientation == Orientation.Vertical) {
+                    state.layoutInfo.viewportSize.height
+                } else {
+                    state.layoutInfo.viewportSize.width
+                }
+
+        override val contentPadding: Int
+            get() = state.layoutInfo.beforeContentPadding + state.layoutInfo.afterContentPadding
     }
-
-    override fun collectionInfo(): CollectionInfo =
-        if (isVertical) {
-            CollectionInfo(rowCount = state.pageCount, columnCount = 1)
-        } else {
-            CollectionInfo(rowCount = 1, columnCount = state.pageCount)
-        }
-
-    override val viewport: Int
-        get() = if (state.layoutInfo.orientation == Orientation.Vertical) {
-            state.layoutInfo.viewportSize.height
-        } else {
-            state.layoutInfo.viewportSize.width
-        }
-    override val contentPadding: Int
-        get() = state.layoutInfo.beforeContentPadding + state.layoutInfo.afterContentPadding
-}
diff --git a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/pager/MeasuredPage.kt b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/pager/MeasuredPage.kt
index 6339232..fcbe242 100644
--- a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/pager/MeasuredPage.kt
+++ b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/pager/MeasuredPage.kt
@@ -48,10 +48,7 @@
     init {
         var maxCrossAxis = 0
         placeables.fastForEach {
-            maxCrossAxis = maxOf(
-                maxCrossAxis,
-                if (!isVertical) it.height else it.width
-            )
+            maxCrossAxis = maxOf(maxCrossAxis, if (!isVertical) it.height else it.width)
         }
         crossAxisSize = maxCrossAxis
         placeableOffsets = IntArray(placeables.size * 2)
@@ -62,14 +59,9 @@
 
     private var mainAxisLayoutSize: Int = Unset
 
-    fun position(
-        offset: Int,
-        layoutWidth: Int,
-        layoutHeight: Int
-    ) {
+    fun position(offset: Int, layoutWidth: Int, layoutHeight: Int) {
         this.offset = offset
-        mainAxisLayoutSize =
-            if (isVertical) layoutHeight else layoutWidth
+        mainAxisLayoutSize = if (isVertical) layoutHeight else layoutWidth
         var mainAxisOffset = offset
         placeables.fastForEachIndexed { index, placeable ->
             val indexInArray = index * 2
@@ -89,24 +81,26 @@
         }
     }
 
-    fun place(scope: Placeable.PlacementScope) = with(scope) {
-        require(mainAxisLayoutSize != Unset) { "position() should be called first" }
-        repeat(placeables.size) { index ->
-            val placeable = placeables[index]
-            var offset = getOffset(index)
-            if (reverseLayout) {
-                offset = offset.copy { mainAxisOffset ->
-                    mainAxisLayoutSize - mainAxisOffset - placeable.mainAxisSize
+    fun place(scope: Placeable.PlacementScope) =
+        with(scope) {
+            require(mainAxisLayoutSize != Unset) { "position() should be called first" }
+            repeat(placeables.size) { index ->
+                val placeable = placeables[index]
+                var offset = getOffset(index)
+                if (reverseLayout) {
+                    offset =
+                        offset.copy { mainAxisOffset ->
+                            mainAxisLayoutSize - mainAxisOffset - placeable.mainAxisSize
+                        }
+                }
+                offset += visualOffset
+                if (isVertical) {
+                    placeable.placeWithLayer(offset)
+                } else {
+                    placeable.placeRelativeWithLayer(offset)
                 }
             }
-            offset += visualOffset
-            if (isVertical) {
-                placeable.placeWithLayer(offset)
-            } else {
-                placeable.placeRelativeWithLayer(offset)
-            }
         }
-    }
 
     fun applyScrollDelta(delta: Int) {
         offset += delta
@@ -122,7 +116,9 @@
     private fun getOffset(index: Int) =
         IntOffset(placeableOffsets[index * 2], placeableOffsets[index * 2 + 1])
 
-    private val Placeable.mainAxisSize get() = if (isVertical) height else width
+    private val Placeable.mainAxisSize
+        get() = if (isVertical) height else width
+
     private inline fun IntOffset.copy(mainAxisMap: (Int) -> Int): IntOffset =
         IntOffset(if (isVertical) x else mainAxisMap(x), if (isVertical) mainAxisMap(y) else y)
 }
diff --git a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/pager/PageInfo.kt b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/pager/PageInfo.kt
index 83a95be..7956c24 100644
--- a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/pager/PageInfo.kt
+++ b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/pager/PageInfo.kt
@@ -16,14 +16,10 @@
 
 package androidx.compose.foundation.pager
 
-/**
- * This represents a single measured page in a [Pager] layout.
- */
+/** This represents a single measured page in a [Pager] layout. */
 sealed interface PageInfo {
 
-    /**
-     * The index of this page.
-     */
+    /** The index of this page. */
     val index: Int
 
     /**
diff --git a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/pager/PageSize.kt b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/pager/PageSize.kt
index 2157c1f..de08814 100644
--- a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/pager/PageSize.kt
+++ b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/pager/PageSize.kt
@@ -25,22 +25,21 @@
  * one can change how many pages are shown.
  *
  * Please refer to the sample to learn how to use this API.
- * @sample androidx.compose.foundation.samples.CustomPageSizeSample
  *
+ * @sample androidx.compose.foundation.samples.CustomPageSizeSample
  */
 @Stable
 interface PageSize {
 
     /**
      * Based on [availableSpace] pick a size for the pages
+     *
      * @param availableSpace The amount of space in pixels the pages in this Pager can use.
      * @param pageSpacing The amount of space in pixels used to separate pages.
      */
     fun Density.calculateMainAxisPageSize(availableSpace: Int, pageSpacing: Int): Int
 
-    /**
-     * Pages take up the whole Pager size.
-     */
+    /** Pages take up the whole Pager size. */
     object Fill : PageSize {
         override fun Density.calculateMainAxisPageSize(availableSpace: Int, pageSpacing: Int): Int {
             return availableSpace
@@ -49,6 +48,7 @@
 
     /**
      * Multiple pages in a viewport
+     *
      * @param pageSize A fixed size for pages
      */
     class Fixed(val pageSize: Dp) : PageSize {
diff --git a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/pager/Pager.kt b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/pager/Pager.kt
index 4208c67..a6cb982 100644
--- a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/pager/Pager.kt
+++ b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/pager/Pager.kt
@@ -63,45 +63,47 @@
  *
  * If you need snapping with pages of different size, you can use a [snapFlingBehavior] with a
  * [SnapLayoutInfoProvider] adapted to a LazyList.
- * @see androidx.compose.foundation.gestures.snapping.SnapLayoutInfoProvider for the implementation
- * of a [SnapLayoutInfoProvider] that uses [androidx.compose.foundation.lazy.LazyListState].
- *
- * Please refer to the samples to learn how to use this API.
- * @sample androidx.compose.foundation.samples.SimpleHorizontalPagerSample
- * @sample androidx.compose.foundation.samples.HorizontalPagerWithScrollableContent
  *
  * @param state The state to control this pager
  * @param modifier A modifier instance to be applied to this Pager outer layout
- * @param contentPadding a padding around the whole content. This will add padding for the
- * content after it has been clipped, which is not possible via [modifier] param. You can use it
- * to add a padding before the first page or after the last one. Use [pageSpacing] to add spacing
- * between the pages.
+ * @param contentPadding a padding around the whole content. This will add padding for the content
+ *   after it has been clipped, which is not possible via [modifier] param. You can use it to add a
+ *   padding before the first page or after the last one. Use [pageSpacing] to add spacing between
+ *   the pages.
  * @param pageSize Use this to change how the pages will look like inside this pager.
  * @param beyondViewportPageCount Pages to compose and layout before and after the list of visible
- * pages. Note: Be aware that using a large value for [beyondViewportPageCount] will cause a lot of
- * pages to be composed, measured and placed which will defeat the purpose of using lazy loading.
- * This should be used as an optimization to pre-load a couple of pages before and after the visible
- * ones. This does not include the pages automatically composed and laid out by the pre-fetcher in
- * the direction of the scroll during scroll events.
+ *   pages. Note: Be aware that using a large value for [beyondViewportPageCount] will cause a lot
+ *   of pages to be composed, measured and placed which will defeat the purpose of using lazy
+ *   loading. This should be used as an optimization to pre-load a couple of pages before and after
+ *   the visible ones. This does not include the pages automatically composed and laid out by the
+ *   pre-fetcher in the direction of the scroll during scroll events.
  * @param pageSpacing The amount of space to be used to separate the pages in this Pager
  * @param verticalAlignment How pages are aligned vertically in this Pager.
  * @param flingBehavior The [TargetedFlingBehavior] to be used for post scroll gestures.
- * @param userScrollEnabled whether the scrolling via the user gestures or accessibility actions
- * is allowed. You can still scroll programmatically using [PagerState.scroll] even when it is
- * disabled.
+ * @param userScrollEnabled whether the scrolling via the user gestures or accessibility actions is
+ *   allowed. You can still scroll programmatically using [PagerState.scroll] even when it is
+ *   disabled.
  * @param reverseLayout reverse the direction of scrolling and layout.
  * @param key a stable and unique key representing the item. When you specify the key the scroll
- * position will be maintained based on the key, which means if you add/remove items before the
- * current visible item the item with the given key will be kept as the first visible one. If null
- * is passed the position in the list will represent the key.
+ *   position will be maintained based on the key, which means if you add/remove items before the
+ *   current visible item the item with the given key will be kept as the first visible one. If null
+ *   is passed the position in the list will represent the key.
  * @param pageNestedScrollConnection A [NestedScrollConnection] that dictates how this [Pager]
- * behaves with nested lists. The default behavior will see [Pager] to consume all nested deltas.
- * @param snapPosition The calculation of how this Pager will perform snapping of pages.
- * Use this to provide different settling to different positions in the layout. This is used by
- * [Pager] as a way to calculate [PagerState.currentPage], currentPage is the page closest
- * to the snap position in the layout (e.g. if the snap position is the start of the layout, then
- * currentPage will be the page closest to that).
+ *   behaves with nested lists. The default behavior will see [Pager] to consume all nested deltas.
+ * @param snapPosition The calculation of how this Pager will perform snapping of pages. Use this to
+ *   provide different settling to different positions in the layout. This is used by [Pager] as a
+ *   way to calculate [PagerState.currentPage], currentPage is the page closest to the snap position
+ *   in the layout (e.g. if the snap position is the start of the layout, then currentPage will be
+ *   the page closest to that).
  * @param pageContent This Pager's page Composable.
+ * @see androidx.compose.foundation.gestures.snapping.SnapLayoutInfoProvider for the implementation
+ *   of a [SnapLayoutInfoProvider] that uses [androidx.compose.foundation.lazy.LazyListState].
+ *
+ * Please refer to the samples to learn how to use this API.
+ *
+ * @sample androidx.compose.foundation.samples.SimpleHorizontalPagerSample
+ *
+ * @sample androidx.compose.foundation.samples.HorizontalPagerWithScrollableContent
  */
 @Composable
 fun HorizontalPager(
@@ -116,10 +118,8 @@
     userScrollEnabled: Boolean = true,
     reverseLayout: Boolean = false,
     key: ((index: Int) -> Any)? = null,
-    pageNestedScrollConnection: NestedScrollConnection = PagerDefaults.pageNestedScrollConnection(
-        state,
-        Orientation.Horizontal
-    ),
+    pageNestedScrollConnection: NestedScrollConnection =
+        PagerDefaults.pageNestedScrollConnection(state, Orientation.Horizontal),
     snapPosition: SnapPosition = SnapPosition.Start,
     pageContent: @Composable PagerScope.(page: Int) -> Unit
 ) {
@@ -144,51 +144,54 @@
 }
 
 /**
- * A Pager that scrolls vertically. Pages are lazily placed in accordance to the available
- * viewport size. By definition, pages in a [Pager] have the same size, defined by [pageSize] and
- * use a snap animation (provided by [flingBehavior] to scroll pages into a specific position). You
- * can use [beyondViewportPageCount] to place more pages before and after the visible pages.
+ * A Pager that scrolls vertically. Pages are lazily placed in accordance to the available viewport
+ * size. By definition, pages in a [Pager] have the same size, defined by [pageSize] and use a snap
+ * animation (provided by [flingBehavior] to scroll pages into a specific position). You can use
+ * [beyondViewportPageCount] to place more pages before and after the visible pages.
  *
  * If you need snapping with pages of different size, you can use a [snapFlingBehavior] with a
  * [SnapLayoutInfoProvider] adapted to a LazyList.
- * @see androidx.compose.foundation.gestures.snapping.SnapLayoutInfoProvider for the implementation
- * of a [SnapLayoutInfoProvider] that uses [androidx.compose.foundation.lazy.LazyListState].
- *
- * Please refer to the sample to learn how to use this API.
- * @sample androidx.compose.foundation.samples.SimpleVerticalPagerSample
  *
  * @param state The state to control this pager
  * @param modifier A modifier instance to be apply to this Pager outer layout
- * @param contentPadding a padding around the whole content. This will add padding for the
- * content after it has been clipped, which is not possible via [modifier] param. You can use it
- * to add a padding before the first page or after the last one. Use [pageSpacing] to add spacing
- * between the pages.
+ * @param contentPadding a padding around the whole content. This will add padding for the content
+ *   after it has been clipped, which is not possible via [modifier] param. You can use it to add a
+ *   padding before the first page or after the last one. Use [pageSpacing] to add spacing between
+ *   the pages.
  * @param pageSize Use this to change how the pages will look like inside this pager.
  * @param beyondViewportPageCount Pages to compose and layout before and after the list of visible
- * pages. Note: Be aware that using a large value for [beyondViewportPageCount] will cause a lot of
- * pages to be composed, measured and placed which will defeat the purpose of using lazy loading.
- * This should be used as an optimization to pre-load a couple of pages before and after the visible
- * ones. This does not include the pages automatically composed and laid out by the pre-fetcher in
- *  * the direction of the scroll during scroll events.
+ *   pages. Note: Be aware that using a large value for [beyondViewportPageCount] will cause a lot
+ *   of pages to be composed, measured and placed which will defeat the purpose of using lazy
+ *   loading. This should be used as an optimization to pre-load a couple of pages before and after
+ *   the visible ones. This does not include the pages automatically composed and laid out by the
+ *   pre-fetcher in
+ *     * the direction of the scroll during scroll events.
+ *
  * @param pageSpacing The amount of space to be used to separate the pages in this Pager
  * @param horizontalAlignment How pages are aligned horizontally in this Pager.
  * @param flingBehavior The [TargetedFlingBehavior] to be used for post scroll gestures.
- * @param userScrollEnabled whether the scrolling via the user gestures or accessibility actions
- * is allowed. You can still scroll programmatically using [PagerState.scroll] even when it is
- * disabled.
+ * @param userScrollEnabled whether the scrolling via the user gestures or accessibility actions is
+ *   allowed. You can still scroll programmatically using [PagerState.scroll] even when it is
+ *   disabled.
  * @param reverseLayout reverse the direction of scrolling and layout.
  * @param key a stable and unique key representing the item. When you specify the key the scroll
- * position will be maintained based on the key, which means if you add/remove items before the
- * current visible item the item with the given key will be kept as the first visible one. If null
- * is passed the position in the list will represent the key.
- * @param pageNestedScrollConnection A [NestedScrollConnection] that dictates how this [Pager] behaves
- * with nested lists. The default behavior will see [Pager] to consume all nested deltas.
- * @param snapPosition The calculation of how this Pager will perform snapping of Pages.
- * Use this to provide different settling to different positions in the layout. This is used by
- * [Pager] as a way to calculate [PagerState.currentPage], currentPage is the page closest
- * to the snap position in the layout (e.g. if the snap position is the start of the layout, then
- * currentPage will be the page closest to that).
+ *   position will be maintained based on the key, which means if you add/remove items before the
+ *   current visible item the item with the given key will be kept as the first visible one. If null
+ *   is passed the position in the list will represent the key.
+ * @param pageNestedScrollConnection A [NestedScrollConnection] that dictates how this [Pager]
+ *   behaves with nested lists. The default behavior will see [Pager] to consume all nested deltas.
+ * @param snapPosition The calculation of how this Pager will perform snapping of Pages. Use this to
+ *   provide different settling to different positions in the layout. This is used by [Pager] as a
+ *   way to calculate [PagerState.currentPage], currentPage is the page closest to the snap position
+ *   in the layout (e.g. if the snap position is the start of the layout, then currentPage will be
+ *   the page closest to that).
  * @param pageContent This Pager's page Composable.
+ * @see androidx.compose.foundation.gestures.snapping.SnapLayoutInfoProvider for the implementation
+ *   of a [SnapLayoutInfoProvider] that uses [androidx.compose.foundation.lazy.LazyListState].
+ *
+ * Please refer to the sample to learn how to use this API.
+ *
+ * @sample androidx.compose.foundation.samples.SimpleVerticalPagerSample
  */
 @Composable
 fun VerticalPager(
@@ -203,10 +206,8 @@
     userScrollEnabled: Boolean = true,
     reverseLayout: Boolean = false,
     key: ((index: Int) -> Any)? = null,
-    pageNestedScrollConnection: NestedScrollConnection = PagerDefaults.pageNestedScrollConnection(
-        state,
-        Orientation.Vertical
-    ),
+    pageNestedScrollConnection: NestedScrollConnection =
+        PagerDefaults.pageNestedScrollConnection(state, Orientation.Vertical),
     snapPosition: SnapPosition = SnapPosition.Start,
     pageContent: @Composable PagerScope.(page: Int) -> Unit
 ) {
@@ -230,74 +231,69 @@
     )
 }
 
-/**
- * Contains the default values used by [Pager].
- */
+/** Contains the default values used by [Pager]. */
 object PagerDefaults {
 
     /**
-     * A [snapFlingBehavior] that will snap pages to the start of the layout. One can use the
-     * given parameters to control how the snapping animation will happen.
-     * @see androidx.compose.foundation.gestures.snapping.snapFlingBehavior for more information
-     * on what which parameter controls in the overall snapping animation.
+     * A [snapFlingBehavior] that will snap pages to the start of the layout. One can use the given
+     * parameters to control how the snapping animation will happen.
+     *
+     * @param state The [PagerState] that controls the which to which this FlingBehavior will be
+     *   applied to.
+     * @param pagerSnapDistance A way to control the snapping destination for this [Pager]. The
+     *   default behavior will result in any fling going to the next page in the direction of the
+     *   fling (if the fling has enough velocity, otherwise the Pager will bounce back). Use
+     *   [PagerSnapDistance.atMost] to define a maximum number of pages this [Pager] is allowed to
+     *   fling after scrolling is finished and fling has started.
+     * @param decayAnimationSpec The animation spec used to approach the target offset. When the
+     *   fling velocity is large enough. Large enough means large enough to naturally decay. For
+     *   single page snapping this usually never happens since there won't be enough space to run a
+     *   decay animation.
+     * @param snapAnimationSpec The animation spec used to finally snap to the position. This
+     *   animation will be often used in 2 cases: 1) There was enough space to an approach
+     *   animation, the Pager will use [snapAnimationSpec] in the last step of the animation to
+     *   settle the page into position. 2) There was not enough space to run the approach animation.
+     * @param snapPositionalThreshold If the fling has a low velocity (e.g. slow scroll), this fling
+     *   behavior will use this snap threshold in order to determine if the pager should snap back
+     *   or move forward. Use a number between 0 and 1 as a fraction of the page size that needs to
+     *   be scrolled before the Pager considers it should move to the next page. For instance, if
+     *   snapPositionalThreshold = 0.35, it means if this pager is scrolled with a slow velocity and
+     *   the Pager scrolls more than 35% of the page size, then will jump to the next page, if not
+     *   it scrolls back. Note that any fling that has high enough velocity will *always* move to
+     *   the next page in the direction of the fling.
+     * @return An instance of [FlingBehavior] that will perform Snapping to the next page by
+     *   default. The animation will be governed by the post scroll velocity and the Pager will use
+     *   either [snapAnimationSpec] or [decayAnimationSpec] to approach the snapped position If a
+     *   velocity is not high enough the pager will use [snapAnimationSpec] to reach the snapped
+     *   position. If the velocity is high enough, the Pager will use the logic described in
+     *   [decayAnimationSpec] and [snapAnimationSpec].
+     * @see androidx.compose.foundation.gestures.snapping.snapFlingBehavior for more information on
+     *   what which parameter controls in the overall snapping animation.
      *
      * The animation specs used by the fling behavior will depend on 2 factors:
      * 1) The gesture velocity.
      * 2) The target page proposed by [pagerSnapDistance].
      *
-     * If you're using single page snapping (the most common use case for [Pager]), there won't
-     * be enough space to actually run a decay animation to approach the target page, so the Pager
-     * will always use the snapping animation from [snapAnimationSpec].
-     * If you're using multi-page snapping (this means you're abs(targetPage - currentPage) > 1)
-     * the Pager may use [decayAnimationSpec] or [snapAnimationSpec] to approach the
-     * targetPage, it will depend on the velocity generated by the triggering gesture.
-     * If the gesture has a high enough velocity to approach the target page, the Pager will use
-     * [decayAnimationSpec] followed by [snapAnimationSpec] for the final step of the
-     * animation. If the gesture doesn't have enough velocity, the Pager will use
-     * [snapAnimationSpec] + [snapAnimationSpec] in a similar fashion.
-     *
-     * @param state The [PagerState] that controls the which to which this FlingBehavior will
-     * be applied to.
-     * @param pagerSnapDistance A way to control the snapping destination for this [Pager].
-     * The default behavior will result in any fling going to the next page in the direction of the
-     * fling (if the fling has enough velocity, otherwise  the Pager will bounce back). Use
-     * [PagerSnapDistance.atMost] to define a maximum number of pages this [Pager] is allowed to
-     * fling after scrolling is finished and fling has started.
-     * @param decayAnimationSpec The animation spec used to approach the target offset. When
-     * the fling velocity is large enough. Large enough means large enough to naturally decay. For
-     * single page snapping this usually never happens since there won't be enough space to run a
-     * decay animation.
-     * @param snapAnimationSpec The animation spec used to finally snap to the position. This
-     * animation will be often used in 2 cases: 1) There was enough space to an approach animation,
-     * the Pager will use [snapAnimationSpec] in the last step of the animation to settle the page
-     * into position. 2) There was not enough space to run the approach animation.
-     * @param snapPositionalThreshold If the fling has a low velocity (e.g. slow scroll),
-     * this fling behavior will use this snap threshold in order to determine if the pager should
-     * snap back or move forward. Use a number between 0 and 1 as a fraction of the page size that
-     * needs to be scrolled before the Pager considers it should move to the next page.
-     * For instance, if snapPositionalThreshold = 0.35, it means if this pager is scrolled with a
-     * slow velocity and the Pager scrolls more than 35% of the page size, then will jump to the
-     * next page, if not it scrolls back.
-     * Note that any fling that has high enough velocity will *always* move to the next page
-     * in the direction of the fling.
-     *
-     * @return An instance of [FlingBehavior] that will perform Snapping to the next page by
-     * default. The animation will be governed by the post scroll velocity and the Pager will use
-     * either
-     * [snapAnimationSpec] or [decayAnimationSpec] to approach the snapped position
-     * If a velocity is not high enough the pager will use [snapAnimationSpec] to reach the snapped
-     * position. If the velocity is high enough, the Pager will use the logic described in
-     * [decayAnimationSpec] and [snapAnimationSpec].
+     * If you're using single page snapping (the most common use case for [Pager]), there won't be
+     * enough space to actually run a decay animation to approach the target page, so the Pager will
+     * always use the snapping animation from [snapAnimationSpec]. If you're using multi-page
+     * snapping (this means you're abs(targetPage - currentPage) > 1) the Pager may use
+     * [decayAnimationSpec] or [snapAnimationSpec] to approach the targetPage, it will depend on the
+     * velocity generated by the triggering gesture. If the gesture has a high enough velocity to
+     * approach the target page, the Pager will use [decayAnimationSpec] followed by
+     * [snapAnimationSpec] for the final step of the animation. If the gesture doesn't have enough
+     * velocity, the Pager will use [snapAnimationSpec] + [snapAnimationSpec] in a similar fashion.
      */
     @Composable
     fun flingBehavior(
         state: PagerState,
         pagerSnapDistance: PagerSnapDistance = PagerSnapDistance.atMost(1),
         decayAnimationSpec: DecayAnimationSpec<Float> = rememberSplineBasedDecay(),
-        snapAnimationSpec: AnimationSpec<Float> = spring(
-            stiffness = Spring.StiffnessMediumLow,
-            visibilityThreshold = Int.VisibilityThreshold.toFloat()
-        ),
+        snapAnimationSpec: AnimationSpec<Float> =
+            spring(
+                stiffness = Spring.StiffnessMediumLow,
+                visibilityThreshold = Int.VisibilityThreshold.toFloat()
+            ),
         @FloatRange(from = 0.0, to = 1.0) snapPositionalThreshold: Float = 0.5f
     ): TargetedFlingBehavior {
         require(snapPositionalThreshold in 0f..1f) {
@@ -315,10 +311,10 @@
             layoutDirection
         ) {
             val snapLayoutInfoProvider =
-                SnapLayoutInfoProvider(
-                    state,
-                    pagerSnapDistance
-                ) { flingVelocity, lowerBound, upperBound ->
+                SnapLayoutInfoProvider(state, pagerSnapDistance) {
+                    flingVelocity,
+                    lowerBound,
+                    upperBound ->
                     calculateFinalSnappingBound(
                         pagerState = state,
                         layoutDirection = layoutDirection,
@@ -342,7 +338,7 @@
      *
      * @param state state of the pager
      * @param orientation The orientation of the pager. This will be used to determine which
-     * direction the nested scroll connection will operate and react on.
+     *   direction the nested scroll connection will operate and react on.
      */
     @Composable
     fun pageNestedScrollConnection(
@@ -372,14 +368,15 @@
     currentPageOffsetFraction: Float,
     pageCount: Int
 ): Int {
-    val snapOffset = position(
-        layoutSize,
-        pageSize,
-        beforeContentPadding,
-        afterContentPadding,
-        currentPage,
-        pageCount
-    )
+    val snapOffset =
+        position(
+            layoutSize,
+            pageSize,
+            beforeContentPadding,
+            afterContentPadding,
+            currentPage,
+            pageCount
+        )
 
     return (snapOffset - currentPageOffsetFraction * (pageSize + spaceBetweenPages)).roundToInt()
 }
@@ -399,7 +396,7 @@
 
     override fun onPreScroll(available: Offset, source: NestedScrollSource): Offset {
         return if (
-        // rounding error and drag only
+            // rounding error and drag only
             source == NestedScrollSource.UserInput && abs(state.currentPageOffsetFraction) > 1e-6
         ) {
             // find the current and next page (in the direction of dragging)
@@ -459,9 +456,7 @@
 ): Modifier {
     fun performForwardPaging(): Boolean {
         return if (state.canScrollForward) {
-            scope.launch {
-                state.animateToNextPage()
-            }
+            scope.launch { state.animateToNextPage() }
             true
         } else {
             false
@@ -470,9 +465,7 @@
 
     fun performBackwardPaging(): Boolean {
         return if (state.canScrollBackward) {
-            scope.launch {
-                state.animateToPreviousPage()
-            }
+            scope.launch { state.animateToPreviousPage() }
             true
         } else {
             false
@@ -480,15 +473,17 @@
     }
 
     return if (userScrollEnabled) {
-        this.then(Modifier.semantics {
-            if (isVertical) {
-                pageUp { performBackwardPaging() }
-                pageDown { performForwardPaging() }
-            } else {
-                pageLeft { performBackwardPaging() }
-                pageRight { performForwardPaging() }
+        this.then(
+            Modifier.semantics {
+                if (isVertical) {
+                    pageUp { performBackwardPaging() }
+                    pageDown { performForwardPaging() }
+                } else {
+                    pageLeft { performBackwardPaging() }
+                    pageRight { performForwardPaging() }
+                }
             }
-        })
+        )
     } else {
         this then Modifier
     }
diff --git a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/pager/PagerBeyondBoundsModifier.kt b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/pager/PagerBeyondBoundsModifier.kt
index c3e81b0..7050e1b 100644
--- a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/pager/PagerBeyondBoundsModifier.kt
+++ b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/pager/PagerBeyondBoundsModifier.kt
@@ -39,13 +39,17 @@
 
     override val itemCount: Int
         get() = state.pageCount
+
     override val hasVisibleItems: Boolean
         get() = state.layoutInfo.visiblePagesInfo.isNotEmpty()
+
     override val firstPlacedIndex: Int
         get() = maxOf(0, state.firstVisiblePage - beyondViewportPageCount)
+
     override val lastPlacedIndex: Int
-        get() = minOf(
-            itemCount - 1,
-            state.layoutInfo.visiblePagesInfo.last().index + beyondViewportPageCount
-        )
+        get() =
+            minOf(
+                itemCount - 1,
+                state.layoutInfo.visiblePagesInfo.last().index + beyondViewportPageCount
+            )
 }
diff --git a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/pager/PagerLayoutInfo.kt b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/pager/PagerLayoutInfo.kt
index f5786ede..585461d 100644
--- a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/pager/PagerLayoutInfo.kt
+++ b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/pager/PagerLayoutInfo.kt
@@ -27,20 +27,16 @@
  * Use [PagerState.layoutInfo] to retrieve this
  */
 sealed interface PagerLayoutInfo {
-    /**
-     * A list of all pages that are currently visible in the [Pager]
-     */
+    /** A list of all pages that are currently visible in the [Pager] */
     val visiblePagesInfo: List<PageInfo>
 
     /**
-     * The main axis size of the Pages in this [Pager] provided by the [PageSize] API in the
-     * Pager definition. This is provided in pixels.
+     * The main axis size of the Pages in this [Pager] provided by the [PageSize] API in the Pager
+     * definition. This is provided in pixels.
      */
     val pageSize: Int
 
-    /**
-     * The spacing in pixels provided in the [Pager] creation.
-     */
+    /** The spacing in pixels provided in the [Pager] creation. */
     val pageSpacing: Int
 
     /**
@@ -68,29 +64,22 @@
     val beforeContentPadding: Int
 
     /**
-     * The content padding in pixels applied after the last page in the direction of scrolling.
-     * For example it is a bottom content padding for [VerticalPager] with reverseLayout set to
-     * false.
+     * The content padding in pixels applied after the last page in the direction of scrolling. For
+     * example it is a bottom content padding for [VerticalPager] with reverseLayout set to false.
      */
     val afterContentPadding: Int
 
     /**
-     * The size of the viewport in pixels. It is the [Pager] layout size including all the
-     * content paddings.
+     * The size of the viewport in pixels. It is the [Pager] layout size including all the content
+     * paddings.
      */
     val viewportSize: IntSize
 
-    /**
-     * The [Pager] orientation.
-     */
+    /** The [Pager] orientation. */
     val orientation: Orientation
 
-    /**
-     * True if the direction of scrolling and layout is reversed.
-     */
-    @Suppress("GetterSetterNames")
-    @get:Suppress("GetterSetterNames")
-    val reverseLayout: Boolean
+    /** True if the direction of scrolling and layout is reversed. */
+    @Suppress("GetterSetterNames") @get:Suppress("GetterSetterNames") val reverseLayout: Boolean
 
     /**
      * Pages to compose and layout before and after the list of visible pages. This does not include
@@ -99,9 +88,7 @@
      */
     val beyondViewportPageCount: Int
 
-    /**
-     * The calculation of how this Pager performs snapping of pages.
-     */
+    /** The calculation of how this Pager performs snapping of pages. */
     val snapPosition: SnapPosition
 }
 
diff --git a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/pager/PagerLazyAnimateScrollScope.kt b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/pager/PagerLazyAnimateScrollScope.kt
index 018ffc2..2f0c9fd 100644
--- a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/pager/PagerLazyAnimateScrollScope.kt
+++ b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/pager/PagerLazyAnimateScrollScope.kt
@@ -22,24 +22,25 @@
 import androidx.compose.ui.util.fastFirstOrNull
 
 /**
- * A [LazyLayoutAnimateScrollScope] that allows customization of animated scroll in [Pager].
- * The scope contains information about the layout where animated scroll can be performed as well as
- * the necessary tools to do that respecting the scroll mutation priority.
- *
+ * A [LazyLayoutAnimateScrollScope] that allows customization of animated scroll in [Pager]. The
+ * scope contains information about the layout where animated scroll can be performed as well as the
+ * necessary tools to do that respecting the scroll mutation priority.
  */
 @ExperimentalFoundationApi
 internal fun PagerLazyAnimateScrollScope(state: PagerState): LazyLayoutAnimateScrollScope {
     return object : LazyLayoutAnimateScrollScope {
 
-        override val firstVisibleItemIndex: Int get() = state.firstVisiblePage
+        override val firstVisibleItemIndex: Int
+            get() = state.firstVisiblePage
 
-        override val firstVisibleItemScrollOffset: Int get() = state.firstVisiblePageOffset
+        override val firstVisibleItemScrollOffset: Int
+            get() = state.firstVisiblePageOffset
 
         override val lastVisibleItemIndex: Int
-            get() =
-                state.layoutInfo.visiblePagesInfo.last().index
+            get() = state.layoutInfo.visiblePagesInfo.last().index
 
-        override val itemCount: Int get() = state.pageCount
+        override val itemCount: Int
+            get() = state.pageCount
 
         override fun ScrollScope.snapToItem(index: Int, scrollOffset: Int) {
             val offsetFraction = scrollOffset / state.pageSizeWithSpacing.toFloat()
diff --git a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/pager/PagerMeasure.kt b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/pager/PagerMeasure.kt
index d9108ea..1ccc773 100644
--- a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/pager/PagerMeasure.kt
+++ b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/pager/PagerMeasure.kt
@@ -96,18 +96,21 @@
         )
     } else {
 
-        val childConstraints = Constraints(
-            maxWidth = if (orientation == Orientation.Vertical) {
-                constraints.maxWidth
-            } else {
-                pageAvailableSize
-            },
-            maxHeight = if (orientation != Orientation.Vertical) {
-                constraints.maxHeight
-            } else {
-                pageAvailableSize
-            }
-        )
+        val childConstraints =
+            Constraints(
+                maxWidth =
+                    if (orientation == Orientation.Vertical) {
+                        constraints.maxWidth
+                    } else {
+                        pageAvailableSize
+                    },
+                maxHeight =
+                    if (orientation != Orientation.Vertical) {
+                        constraints.maxHeight
+                    } else {
+                        pageAvailableSize
+                    }
+            )
 
         var firstVisiblePage = currentPage
         var firstVisiblePageOffset = currentPageOffset
@@ -159,18 +162,19 @@
         // firstPageScrollOffset
         while (currentFirstPageScrollOffset < 0 && currentFirstPage > 0) {
             val previous = currentFirstPage - 1
-            val measuredPage = getAndMeasure(
-                index = previous,
-                childConstraints = childConstraints,
-                pagerItemProvider = pagerItemProvider,
-                visualPageOffset = visualPageOffset,
-                orientation = orientation,
-                horizontalAlignment = horizontalAlignment,
-                verticalAlignment = verticalAlignment,
-                layoutDirection = layoutDirection,
-                reverseLayout = reverseLayout,
-                pageAvailableSize = pageAvailableSize
-            )
+            val measuredPage =
+                getAndMeasure(
+                    index = previous,
+                    childConstraints = childConstraints,
+                    pagerItemProvider = pagerItemProvider,
+                    visualPageOffset = visualPageOffset,
+                    orientation = orientation,
+                    horizontalAlignment = horizontalAlignment,
+                    verticalAlignment = verticalAlignment,
+                    layoutDirection = layoutDirection,
+                    reverseLayout = reverseLayout,
+                    pageAvailableSize = pageAvailableSize
+                )
 
             debugLog { "Composed Page=$previous" }
 
@@ -215,32 +219,35 @@
         // then composing visible pages forward until we fill the whole viewport.
         // we want to have at least one page in visiblePages even if in fact all the pages are
         // offscreen, this can happen if the content padding is larger than the available size.
-        while (index < pageCount &&
-            (currentMainAxisOffset < maxMainAxis ||
-                currentMainAxisOffset <= 0 || // filling beforeContentPadding area
-                visiblePages.isEmpty())
+        while (
+            index < pageCount &&
+                (currentMainAxisOffset < maxMainAxis ||
+                    currentMainAxisOffset <= 0 || // filling beforeContentPadding area
+                    visiblePages.isEmpty())
         ) {
-            val measuredPage = getAndMeasure(
-                index = index,
-                childConstraints = childConstraints,
-                pagerItemProvider = pagerItemProvider,
-                visualPageOffset = visualPageOffset,
-                orientation = orientation,
-                horizontalAlignment = horizontalAlignment,
-                verticalAlignment = verticalAlignment,
-                layoutDirection = layoutDirection,
-                reverseLayout = reverseLayout,
-                pageAvailableSize = pageAvailableSize
-            )
+            val measuredPage =
+                getAndMeasure(
+                    index = index,
+                    childConstraints = childConstraints,
+                    pagerItemProvider = pagerItemProvider,
+                    visualPageOffset = visualPageOffset,
+                    orientation = orientation,
+                    horizontalAlignment = horizontalAlignment,
+                    verticalAlignment = verticalAlignment,
+                    layoutDirection = layoutDirection,
+                    reverseLayout = reverseLayout,
+                    pageAvailableSize = pageAvailableSize
+                )
 
             debugLog { "Composed Page=$index at $currentFirstPageScrollOffset" }
 
             // do not add space to the last page
-            currentMainAxisOffset += if (index == pageCount - 1) {
-                pageAvailableSize
-            } else {
-                pageSizeWithSpacing
-            }
+            currentMainAxisOffset +=
+                if (index == pageCount - 1) {
+                    pageAvailableSize
+                } else {
+                    pageSizeWithSpacing
+                }
 
             if (currentMainAxisOffset <= minOffset && index != pageCount - 1) {
                 // this page is offscreen and will not be visible. advance currentFirstPage
@@ -261,22 +268,21 @@
             val toScrollBack = maxOffset - currentMainAxisOffset
             currentFirstPageScrollOffset -= toScrollBack
             currentMainAxisOffset += toScrollBack
-            while (currentFirstPageScrollOffset < beforeContentPadding &&
-                currentFirstPage > 0
-            ) {
+            while (currentFirstPageScrollOffset < beforeContentPadding && currentFirstPage > 0) {
                 val previousIndex = currentFirstPage - 1
-                val measuredPage = getAndMeasure(
-                    index = previousIndex,
-                    childConstraints = childConstraints,
-                    pagerItemProvider = pagerItemProvider,
-                    visualPageOffset = visualPageOffset,
-                    orientation = orientation,
-                    horizontalAlignment = horizontalAlignment,
-                    verticalAlignment = verticalAlignment,
-                    layoutDirection = layoutDirection,
-                    reverseLayout = reverseLayout,
-                    pageAvailableSize = pageAvailableSize
-                )
+                val measuredPage =
+                    getAndMeasure(
+                        index = previousIndex,
+                        childConstraints = childConstraints,
+                        pagerItemProvider = pagerItemProvider,
+                        visualPageOffset = visualPageOffset,
+                        orientation = orientation,
+                        horizontalAlignment = horizontalAlignment,
+                        verticalAlignment = verticalAlignment,
+                        layoutDirection = layoutDirection,
+                        reverseLayout = reverseLayout,
+                        pageAvailableSize = pageAvailableSize
+                    )
                 visiblePages.add(0, measuredPage)
                 maxCrossAxis = maxOf(maxCrossAxis, measuredPage.crossAxisSize)
                 currentFirstPageScrollOffset += pageSizeWithSpacing
@@ -300,8 +306,10 @@
         if (beforeContentPadding > 0 || spaceBetweenPages < 0) {
             for (i in visiblePages.indices) {
                 val size = pageSizeWithSpacing
-                if (currentFirstPageScrollOffset != 0 && size <= currentFirstPageScrollOffset &&
-                    i != visiblePages.lastIndex
+                if (
+                    currentFirstPageScrollOffset != 0 &&
+                        size <= currentFirstPageScrollOffset &&
+                        i != visiblePages.lastIndex
                 ) {
                     currentFirstPageScrollOffset -= size
                     firstPage = visiblePages[i + 1]
@@ -312,105 +320,101 @@
         }
 
         // Compose extra pages before
-        val extraPagesBefore = createPagesBeforeList(
-            currentFirstPage = currentFirstPage,
-            beyondViewportPageCount = beyondViewportPageCount,
-            pinnedPages = pinnedPages
-        ) {
-            getAndMeasure(
-                index = it,
-                childConstraints = childConstraints,
-                pagerItemProvider = pagerItemProvider,
-                visualPageOffset = visualPageOffset,
-                orientation = orientation,
-                horizontalAlignment = horizontalAlignment,
-                verticalAlignment = verticalAlignment,
-                layoutDirection = layoutDirection,
-                reverseLayout = reverseLayout,
-                pageAvailableSize = pageAvailableSize
-            )
-        }
+        val extraPagesBefore =
+            createPagesBeforeList(
+                currentFirstPage = currentFirstPage,
+                beyondViewportPageCount = beyondViewportPageCount,
+                pinnedPages = pinnedPages
+            ) {
+                getAndMeasure(
+                    index = it,
+                    childConstraints = childConstraints,
+                    pagerItemProvider = pagerItemProvider,
+                    visualPageOffset = visualPageOffset,
+                    orientation = orientation,
+                    horizontalAlignment = horizontalAlignment,
+                    verticalAlignment = verticalAlignment,
+                    layoutDirection = layoutDirection,
+                    reverseLayout = reverseLayout,
+                    pageAvailableSize = pageAvailableSize
+                )
+            }
 
         // Update maxCrossAxis with extra pages
-        extraPagesBefore.fastForEach {
-            maxCrossAxis = maxOf(maxCrossAxis, it.crossAxisSize)
-        }
+        extraPagesBefore.fastForEach { maxCrossAxis = maxOf(maxCrossAxis, it.crossAxisSize) }
 
         // Compose pages after last page
-        val extraPagesAfter = createPagesAfterList(
-            currentLastPage = visiblePages.last().index,
-            pagesCount = pageCount,
-            beyondViewportPageCount = beyondViewportPageCount,
-            pinnedPages = pinnedPages
-        ) {
-            getAndMeasure(
-                index = it,
-                childConstraints = childConstraints,
-                pagerItemProvider = pagerItemProvider,
-                visualPageOffset = visualPageOffset,
-                orientation = orientation,
-                horizontalAlignment = horizontalAlignment,
-                verticalAlignment = verticalAlignment,
-                layoutDirection = layoutDirection,
-                reverseLayout = reverseLayout,
-                pageAvailableSize = pageAvailableSize
-            )
-        }
+        val extraPagesAfter =
+            createPagesAfterList(
+                currentLastPage = visiblePages.last().index,
+                pagesCount = pageCount,
+                beyondViewportPageCount = beyondViewportPageCount,
+                pinnedPages = pinnedPages
+            ) {
+                getAndMeasure(
+                    index = it,
+                    childConstraints = childConstraints,
+                    pagerItemProvider = pagerItemProvider,
+                    visualPageOffset = visualPageOffset,
+                    orientation = orientation,
+                    horizontalAlignment = horizontalAlignment,
+                    verticalAlignment = verticalAlignment,
+                    layoutDirection = layoutDirection,
+                    reverseLayout = reverseLayout,
+                    pageAvailableSize = pageAvailableSize
+                )
+            }
 
         // Update maxCrossAxis with extra pages
-        extraPagesAfter.fastForEach {
-            maxCrossAxis = maxOf(maxCrossAxis, it.crossAxisSize)
-        }
+        extraPagesAfter.fastForEach { maxCrossAxis = maxOf(maxCrossAxis, it.crossAxisSize) }
 
-        val noExtraPages = firstPage == visiblePages.first() &&
-            extraPagesBefore.isEmpty() &&
-            extraPagesAfter.isEmpty()
+        val noExtraPages =
+            firstPage == visiblePages.first() &&
+                extraPagesBefore.isEmpty() &&
+                extraPagesAfter.isEmpty()
 
-        val layoutWidth = constraints
-            .constrainWidth(
-                if (orientation == Orientation.Vertical)
-                    maxCrossAxis
-                else
-                    currentMainAxisOffset
+        val layoutWidth =
+            constraints.constrainWidth(
+                if (orientation == Orientation.Vertical) maxCrossAxis else currentMainAxisOffset
             )
 
-        val layoutHeight = constraints
-            .constrainHeight(
-                if (orientation == Orientation.Vertical)
-                    currentMainAxisOffset
-                else
-                    maxCrossAxis
+        val layoutHeight =
+            constraints.constrainHeight(
+                if (orientation == Orientation.Vertical) currentMainAxisOffset else maxCrossAxis
             )
 
-        val positionedPages = calculatePagesOffsets(
-            pages = visiblePages,
-            extraPagesBefore = extraPagesBefore,
-            extraPagesAfter = extraPagesAfter,
-            layoutWidth = layoutWidth,
-            layoutHeight = layoutHeight,
-            finalMainAxisOffset = currentMainAxisOffset,
-            maxOffset = maxOffset,
-            pagesScrollOffset = visiblePagesScrollOffset,
-            orientation = orientation,
-            reverseLayout = reverseLayout,
-            density = this,
-            pageAvailableSize = pageAvailableSize,
-            spaceBetweenPages = spaceBetweenPages
-        )
+        val positionedPages =
+            calculatePagesOffsets(
+                pages = visiblePages,
+                extraPagesBefore = extraPagesBefore,
+                extraPagesAfter = extraPagesAfter,
+                layoutWidth = layoutWidth,
+                layoutHeight = layoutHeight,
+                finalMainAxisOffset = currentMainAxisOffset,
+                maxOffset = maxOffset,
+                pagesScrollOffset = visiblePagesScrollOffset,
+                orientation = orientation,
+                reverseLayout = reverseLayout,
+                density = this,
+                pageAvailableSize = pageAvailableSize,
+                spaceBetweenPages = spaceBetweenPages
+            )
 
-        val visiblePagesInfo = if (noExtraPages) positionedPages else positionedPages.fastFilter {
-            (it.index >= visiblePages.first().index && it.index <= visiblePages.last().index)
-        }
+        val visiblePagesInfo =
+            if (noExtraPages) positionedPages
+            else
+                positionedPages.fastFilter {
+                    (it.index >= visiblePages.first().index &&
+                        it.index <= visiblePages.last().index)
+                }
 
         val positionedPagesBefore =
-            if (extraPagesBefore.isEmpty()) emptyList() else positionedPages.fastFilter {
-                it.index < visiblePages.first().index
-            }
+            if (extraPagesBefore.isEmpty()) emptyList()
+            else positionedPages.fastFilter { it.index < visiblePages.first().index }
 
         val positionedPagesAfter =
-            if (extraPagesAfter.isEmpty()) emptyList() else positionedPages.fastFilter {
-                it.index > visiblePages.last().index
-            }
+            if (extraPagesAfter.isEmpty()) emptyList()
+            else positionedPages.fastFilter { it.index > visiblePages.last().index }
         val newCurrentPage =
             calculateNewCurrentPage(
                 if (orientation == Orientation.Vertical) layoutHeight else layoutWidth,
@@ -422,25 +426,25 @@
                 pageCount
             )
 
-        val snapOffset = snapPosition.position(
-            mainAxisAvailableSize,
-            pageAvailableSize,
-            beforeContentPadding,
-            afterContentPadding,
-            newCurrentPage?.index ?: 0,
-            pageCount
-        )
+        val snapOffset =
+            snapPosition.position(
+                mainAxisAvailableSize,
+                pageAvailableSize,
+                beforeContentPadding,
+                afterContentPadding,
+                newCurrentPage?.index ?: 0,
+                pageCount
+            )
 
         val currentPagePositionOffset = (newCurrentPage?.offset ?: 0)
 
-        val currentPageOffsetFraction = if (pageSizeWithSpacing == 0) {
-            0.0f
-        } else {
-            ((snapOffset - currentPagePositionOffset) / (pageSizeWithSpacing.toFloat())).coerceIn(
-                MinPageOffset,
-                MaxPageOffset
-            )
-        }
+        val currentPageOffsetFraction =
+            if (pageSizeWithSpacing == 0) {
+                0.0f
+            } else {
+                ((snapOffset - currentPagePositionOffset) / (pageSizeWithSpacing.toFloat()))
+                    .coerceIn(MinPageOffset, MaxPageOffset)
+            }
 
         debugLog {
             "Finished Measure Pass" +
@@ -452,13 +456,12 @@
         return PagerMeasureResult(
             firstVisiblePage = firstPage,
             firstVisiblePageScrollOffset = currentFirstPageScrollOffset,
-            measureResult = layout(layoutWidth, layoutHeight) {
-                positionedPages.fastForEach {
-                    it.place(this)
-                }
-                // we attach it during the placement so PagerState can trigger re-placement
-                placementScopeInvalidator.attachToScope()
-            },
+            measureResult =
+                layout(layoutWidth, layoutHeight) {
+                    positionedPages.fastForEach { it.place(this) }
+                    // we attach it during the placement so PagerState can trigger re-placement
+                    placementScopeInvalidator.attachToScope()
+                },
             viewportStartOffset = -beforeContentPadding,
             viewportEndOffset = maxOffset + afterContentPadding,
             visiblePagesInfo = visiblePagesInfo,
@@ -615,8 +618,7 @@
         require(extraPagesBefore.isEmpty() && extraPagesAfter.isEmpty()) { "No extra pages" }
 
         val pagesCount = pages.size
-        fun Int.reverseAware() =
-            if (!reverseLayout) this else pagesCount - this - 1
+        fun Int.reverseAware() = if (!reverseLayout) this else pagesCount - this - 1
 
         val sizes = IntArray(pagesCount) { pageAvailableSize }
         val offsets = IntArray(pagesCount) { 0 }
@@ -637,12 +639,13 @@
             val absoluteOffset = offsets[index]
             // when reverseLayout == true, offsets are stored in the reversed order to pages
             val page = pages[index.reverseAware()]
-            val relativeOffset = if (reverseLayout) {
-                // inverse offset to align with scroll direction for positioning
-                mainAxisLayoutSize - absoluteOffset - page.size
-            } else {
-                absoluteOffset
-            }
+            val relativeOffset =
+                if (reverseLayout) {
+                    // inverse offset to align with scroll direction for positioning
+                    mainAxisLayoutSize - absoluteOffset - page.size
+                } else {
+                    absoluteOffset
+                }
             page.position(relativeOffset, layoutWidth, layoutHeight)
             positionedPages.add(page)
         }
diff --git a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/pager/PagerMeasurePolicy.kt b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/pager/PagerMeasurePolicy.kt
index 9717e36..5fd1b3d 100644
--- a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/pager/PagerMeasurePolicy.kt
+++ b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/pager/PagerMeasurePolicy.kt
@@ -54,154 +54,168 @@
     snapPosition: SnapPosition,
     coroutineScope: CoroutineScope,
     pageCount: () -> Int,
-) = remember<LazyLayoutMeasureScope.(Constraints) -> MeasureResult>(
-    state,
-    contentPadding,
-    reverseLayout,
-    orientation,
-    horizontalAlignment,
-    verticalAlignment,
-    pageSpacing,
-    pageSize,
-    snapPosition,
-    pageCount,
-    beyondViewportPageCount,
-    coroutineScope
-) {
-    { containerConstraints ->
-        state.measurementScopeInvalidator.attachToScope()
-        val isVertical = orientation == Orientation.Vertical
-        checkScrollableContainerConstraints(
-            containerConstraints,
-            if (isVertical) Orientation.Vertical else Orientation.Horizontal
-        )
-
-        // resolve content paddings
-        val startPadding =
-            if (isVertical) {
-                contentPadding.calculateLeftPadding(layoutDirection).roundToPx()
-            } else {
-                // in horizontal configuration, padding is reversed by placeRelative
-                contentPadding.calculateStartPadding(layoutDirection).roundToPx()
-            }
-
-        val endPadding =
-            if (isVertical) {
-                contentPadding.calculateRightPadding(layoutDirection).roundToPx()
-            } else {
-                // in horizontal configuration, padding is reversed by placeRelative
-                contentPadding.calculateEndPadding(layoutDirection).roundToPx()
-            }
-        val topPadding = contentPadding.calculateTopPadding().roundToPx()
-        val bottomPadding = contentPadding.calculateBottomPadding().roundToPx()
-        val totalVerticalPadding = topPadding + bottomPadding
-        val totalHorizontalPadding = startPadding + endPadding
-        val totalMainAxisPadding = if (isVertical) totalVerticalPadding else totalHorizontalPadding
-        val beforeContentPadding = when {
-            isVertical && !reverseLayout -> topPadding
-            isVertical && reverseLayout -> bottomPadding
-            !isVertical && !reverseLayout -> startPadding
-            else -> endPadding // !isVertical && reverseLayout
-        }
-        val afterContentPadding = totalMainAxisPadding - beforeContentPadding
-        val contentConstraints =
-            containerConstraints.offset(-totalHorizontalPadding, -totalVerticalPadding)
-
-        state.density = this
-
-        val spaceBetweenPages = pageSpacing.roundToPx()
-
-        // can be negative if the content padding is larger than the max size from constraints
-        val mainAxisAvailableSize = if (isVertical) {
-            containerConstraints.maxHeight - totalVerticalPadding
-        } else {
-            containerConstraints.maxWidth - totalHorizontalPadding
-        }
-        val visualItemOffset = if (!reverseLayout || mainAxisAvailableSize > 0) {
-            IntOffset(startPadding, topPadding)
-        } else {
-            // When layout is reversed and paddings together take >100% of the available space,
-            // layout size is coerced to 0 when positioning. To take that space into account,
-            // we offset start padding by negative space between paddings.
-            IntOffset(
-                if (isVertical) startPadding else startPadding + mainAxisAvailableSize,
-                if (isVertical) topPadding + mainAxisAvailableSize else topPadding
+) =
+    remember<LazyLayoutMeasureScope.(Constraints) -> MeasureResult>(
+        state,
+        contentPadding,
+        reverseLayout,
+        orientation,
+        horizontalAlignment,
+        verticalAlignment,
+        pageSpacing,
+        pageSize,
+        snapPosition,
+        pageCount,
+        beyondViewportPageCount,
+        coroutineScope
+    ) {
+        { containerConstraints ->
+            state.measurementScopeInvalidator.attachToScope()
+            val isVertical = orientation == Orientation.Vertical
+            checkScrollableContainerConstraints(
+                containerConstraints,
+                if (isVertical) Orientation.Vertical else Orientation.Horizontal
             )
-        }
 
-        val pageAvailableSize = with(pageSize) {
-            calculateMainAxisPageSize(mainAxisAvailableSize, spaceBetweenPages).coerceAtLeast(0)
-        }
+            // resolve content paddings
+            val startPadding =
+                if (isVertical) {
+                    contentPadding.calculateLeftPadding(layoutDirection).roundToPx()
+                } else {
+                    // in horizontal configuration, padding is reversed by placeRelative
+                    contentPadding.calculateStartPadding(layoutDirection).roundToPx()
+                }
 
-        state.premeasureConstraints = Constraints(
-            maxWidth = if (orientation == Orientation.Vertical) {
-                contentConstraints.maxWidth
-            } else {
-                pageAvailableSize
-            },
-            maxHeight = if (orientation != Orientation.Vertical) {
-                contentConstraints.maxHeight
-            } else {
-                pageAvailableSize
-            }
-        )
-        val itemProvider = itemProviderLambda()
+            val endPadding =
+                if (isVertical) {
+                    contentPadding.calculateRightPadding(layoutDirection).roundToPx()
+                } else {
+                    // in horizontal configuration, padding is reversed by placeRelative
+                    contentPadding.calculateEndPadding(layoutDirection).roundToPx()
+                }
+            val topPadding = contentPadding.calculateTopPadding().roundToPx()
+            val bottomPadding = contentPadding.calculateBottomPadding().roundToPx()
+            val totalVerticalPadding = topPadding + bottomPadding
+            val totalHorizontalPadding = startPadding + endPadding
+            val totalMainAxisPadding =
+                if (isVertical) totalVerticalPadding else totalHorizontalPadding
+            val beforeContentPadding =
+                when {
+                    isVertical && !reverseLayout -> topPadding
+                    isVertical && reverseLayout -> bottomPadding
+                    !isVertical && !reverseLayout -> startPadding
+                    else -> endPadding // !isVertical && reverseLayout
+                }
+            val afterContentPadding = totalMainAxisPadding - beforeContentPadding
+            val contentConstraints =
+                containerConstraints.offset(-totalHorizontalPadding, -totalVerticalPadding)
 
-        val currentPage: Int
-        val currentPageOffset: Int
+            state.density = this
 
-        Snapshot.withoutReadObservation {
-            currentPage = state.matchScrollPositionWithKey(itemProvider, state.currentPage)
-            currentPageOffset = snapPosition.currentPageOffset(
-                mainAxisAvailableSize,
-                pageAvailableSize,
-                spaceBetweenPages,
-                beforeContentPadding,
-                afterContentPadding,
-                state.currentPage,
-                state.currentPageOffsetFraction,
-                state.pageCount
-            )
-        }
+            val spaceBetweenPages = pageSpacing.roundToPx()
 
-        val pinnedPages = itemProvider.calculateLazyLayoutPinnedIndices(
-            pinnedItemList = state.pinnedPages,
-            beyondBoundsInfo = state.beyondBoundsInfo
-        )
-
-        // todo: wrap with snapshot when b/341782245 is resolved
-        val measureResult =
-            measurePager(
-                beforeContentPadding = beforeContentPadding,
-                afterContentPadding = afterContentPadding,
-                constraints = contentConstraints,
-                pageCount = pageCount(),
-                spaceBetweenPages = spaceBetweenPages,
-                mainAxisAvailableSize = mainAxisAvailableSize,
-                visualPageOffset = visualItemOffset,
-                pageAvailableSize = pageAvailableSize,
-                beyondViewportPageCount = beyondViewportPageCount,
-                orientation = orientation,
-                currentPage = currentPage,
-                currentPageOffset = currentPageOffset,
-                horizontalAlignment = horizontalAlignment,
-                verticalAlignment = verticalAlignment,
-                pagerItemProvider = itemProvider,
-                reverseLayout = reverseLayout,
-                pinnedPages = pinnedPages,
-                snapPosition = snapPosition,
-                placementScopeInvalidator = state.placementScopeInvalidator,
-                coroutineScope = coroutineScope,
-                layout = { width, height, placement ->
-                    layout(
-                        containerConstraints.constrainWidth(width + totalHorizontalPadding),
-                        containerConstraints.constrainHeight(height + totalVerticalPadding),
-                        emptyMap(),
-                        placement
+            // can be negative if the content padding is larger than the max size from constraints
+            val mainAxisAvailableSize =
+                if (isVertical) {
+                    containerConstraints.maxHeight - totalVerticalPadding
+                } else {
+                    containerConstraints.maxWidth - totalHorizontalPadding
+                }
+            val visualItemOffset =
+                if (!reverseLayout || mainAxisAvailableSize > 0) {
+                    IntOffset(startPadding, topPadding)
+                } else {
+                    // When layout is reversed and paddings together take >100% of the available
+                    // space,
+                    // layout size is coerced to 0 when positioning. To take that space into
+                    // account,
+                    // we offset start padding by negative space between paddings.
+                    IntOffset(
+                        if (isVertical) startPadding else startPadding + mainAxisAvailableSize,
+                        if (isVertical) topPadding + mainAxisAvailableSize else topPadding
                     )
                 }
-            )
-        state.applyMeasureResult(measureResult)
-        measureResult
+
+            val pageAvailableSize =
+                with(pageSize) {
+                    calculateMainAxisPageSize(mainAxisAvailableSize, spaceBetweenPages)
+                        .coerceAtLeast(0)
+                }
+
+            state.premeasureConstraints =
+                Constraints(
+                    maxWidth =
+                        if (orientation == Orientation.Vertical) {
+                            contentConstraints.maxWidth
+                        } else {
+                            pageAvailableSize
+                        },
+                    maxHeight =
+                        if (orientation != Orientation.Vertical) {
+                            contentConstraints.maxHeight
+                        } else {
+                            pageAvailableSize
+                        }
+                )
+            val itemProvider = itemProviderLambda()
+
+            val currentPage: Int
+            val currentPageOffset: Int
+
+            Snapshot.withoutReadObservation {
+                currentPage = state.matchScrollPositionWithKey(itemProvider, state.currentPage)
+                currentPageOffset =
+                    snapPosition.currentPageOffset(
+                        mainAxisAvailableSize,
+                        pageAvailableSize,
+                        spaceBetweenPages,
+                        beforeContentPadding,
+                        afterContentPadding,
+                        state.currentPage,
+                        state.currentPageOffsetFraction,
+                        state.pageCount
+                    )
+            }
+
+            val pinnedPages =
+                itemProvider.calculateLazyLayoutPinnedIndices(
+                    pinnedItemList = state.pinnedPages,
+                    beyondBoundsInfo = state.beyondBoundsInfo
+                )
+
+            // todo: wrap with snapshot when b/341782245 is resolved
+            val measureResult =
+                measurePager(
+                    beforeContentPadding = beforeContentPadding,
+                    afterContentPadding = afterContentPadding,
+                    constraints = contentConstraints,
+                    pageCount = pageCount(),
+                    spaceBetweenPages = spaceBetweenPages,
+                    mainAxisAvailableSize = mainAxisAvailableSize,
+                    visualPageOffset = visualItemOffset,
+                    pageAvailableSize = pageAvailableSize,
+                    beyondViewportPageCount = beyondViewportPageCount,
+                    orientation = orientation,
+                    currentPage = currentPage,
+                    currentPageOffset = currentPageOffset,
+                    horizontalAlignment = horizontalAlignment,
+                    verticalAlignment = verticalAlignment,
+                    pagerItemProvider = itemProvider,
+                    reverseLayout = reverseLayout,
+                    pinnedPages = pinnedPages,
+                    snapPosition = snapPosition,
+                    placementScopeInvalidator = state.placementScopeInvalidator,
+                    coroutineScope = coroutineScope,
+                    layout = { width, height, placement ->
+                        layout(
+                            containerConstraints.constrainWidth(width + totalHorizontalPadding),
+                            containerConstraints.constrainHeight(height + totalVerticalPadding),
+                            emptyMap(),
+                            placement
+                        )
+                    }
+                )
+            state.applyMeasureResult(measureResult)
+            measureResult
+        }
     }
-}
diff --git a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/pager/PagerMeasureResult.kt b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/pager/PagerMeasureResult.kt
index 2a526a1..e63198f 100644
--- a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/pager/PagerMeasureResult.kt
+++ b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/pager/PagerMeasureResult.kt
@@ -48,42 +48,48 @@
 ) : PagerLayoutInfo, MeasureResult by measureResult {
     override val viewportSize: IntSize
         get() = IntSize(width, height)
-    override val beforeContentPadding: Int get() = -viewportStartOffset
+
+    override val beforeContentPadding: Int
+        get() = -viewportStartOffset
 
     val canScrollBackward
         get() = (firstVisiblePage?.index ?: 0) != 0 || firstVisiblePageScrollOffset != 0
 
     /**
-     * Tries to apply a scroll [delta] for this layout info. In some cases we can apply small
-     * scroll deltas by just changing the offsets for each [visiblePagesInfo].
-     * But we can only do so if after applying the delta we would not need to compose a new item
-     * or dispose an item which is currently visible. In this case this function will not apply
-     * the [delta] and return false.
+     * Tries to apply a scroll [delta] for this layout info. In some cases we can apply small scroll
+     * deltas by just changing the offsets for each [visiblePagesInfo]. But we can only do so if
+     * after applying the delta we would not need to compose a new item or dispose an item which is
+     * currently visible. In this case this function will not apply the [delta] and return false.
      *
-     * @return true if we can safely apply a passed scroll [delta] to this layout info.
-     * If true is returned, only the placement phase is needed to apply new offsets.
-     * If false is returned, it means we have to rerun the full measure phase to apply the [delta].
+     * @return true if we can safely apply a passed scroll [delta] to this layout info. If true is
+     *   returned, only the placement phase is needed to apply new offsets. If false is returned, it
+     *   means we have to rerun the full measure phase to apply the [delta].
      */
     fun tryToApplyScrollWithoutRemeasure(delta: Int): Boolean {
         val pageSizeWithSpacing = pageSize + pageSpacing
-        if (remeasureNeeded || visiblePagesInfo.isEmpty() || firstVisiblePage == null ||
-            // applying this delta will change firstVisibleItem
-            (firstVisiblePageScrollOffset - delta) !in 0 until pageSizeWithSpacing
+        if (
+            remeasureNeeded ||
+                visiblePagesInfo.isEmpty() ||
+                firstVisiblePage == null ||
+                // applying this delta will change firstVisibleItem
+                (firstVisiblePageScrollOffset - delta) !in 0 until pageSizeWithSpacing
         ) {
             return false
         }
 
-        val deltaFraction = if (pageSizeWithSpacing != 0) {
-            (delta / pageSizeWithSpacing.toFloat())
-        } else {
-            0.0f
-        }
+        val deltaFraction =
+            if (pageSizeWithSpacing != 0) {
+                (delta / pageSizeWithSpacing.toFloat())
+            } else {
+                0.0f
+            }
 
         val newCurrentPageOffsetFraction = currentPageOffsetFraction - deltaFraction
-        if (currentPage == null ||
-            //  applying this delta will change current page
-            newCurrentPageOffsetFraction >= MaxPageOffset ||
-            newCurrentPageOffsetFraction <= MinPageOffset
+        if (
+            currentPage == null ||
+                //  applying this delta will change current page
+                newCurrentPageOffsetFraction >= MaxPageOffset ||
+                newCurrentPageOffsetFraction <= MinPageOffset
         ) {
             return false
         }
@@ -91,33 +97,25 @@
         val first = visiblePagesInfo.first()
         val last = visiblePagesInfo.last()
 
-        val canApply = if (delta < 0) {
-            // scrolling forward
-            val deltaToFirstItemChange =
-                first.offset + pageSizeWithSpacing - viewportStartOffset
-            val deltaToLastItemChange =
-                last.offset + pageSizeWithSpacing - viewportEndOffset
-            minOf(deltaToFirstItemChange, deltaToLastItemChange) > -delta
-        } else {
-            // scrolling backward
-            val deltaToFirstItemChange =
-                viewportStartOffset - first.offset
-            val deltaToLastItemChange =
-                viewportEndOffset - last.offset
-            minOf(deltaToFirstItemChange, deltaToLastItemChange) > delta
-        }
+        val canApply =
+            if (delta < 0) {
+                // scrolling forward
+                val deltaToFirstItemChange =
+                    first.offset + pageSizeWithSpacing - viewportStartOffset
+                val deltaToLastItemChange = last.offset + pageSizeWithSpacing - viewportEndOffset
+                minOf(deltaToFirstItemChange, deltaToLastItemChange) > -delta
+            } else {
+                // scrolling backward
+                val deltaToFirstItemChange = viewportStartOffset - first.offset
+                val deltaToLastItemChange = viewportEndOffset - last.offset
+                minOf(deltaToFirstItemChange, deltaToLastItemChange) > delta
+            }
         return if (canApply) {
             currentPageOffsetFraction -= deltaFraction
             firstVisiblePageScrollOffset -= delta
-            visiblePagesInfo.fastForEach {
-                it.applyScrollDelta(delta)
-            }
-            extraPagesBefore.fastForEach {
-                it.applyScrollDelta(delta)
-            }
-            extraPagesAfter.fastForEach {
-                it.applyScrollDelta(delta)
-            }
+            visiblePagesInfo.fastForEach { it.applyScrollDelta(delta) }
+            extraPagesBefore.fastForEach { it.applyScrollDelta(delta) }
+            extraPagesAfter.fastForEach { it.applyScrollDelta(delta) }
             if (!canScrollForward && delta > 0) {
                 // we scrolled backward, so now we can scroll forward.
                 canScrollForward = true
diff --git a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/pager/PagerScope.kt b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/pager/PagerScope.kt
index 3470def..0bd1479 100644
--- a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/pager/PagerScope.kt
+++ b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/pager/PagerScope.kt
@@ -17,8 +17,8 @@
 package androidx.compose.foundation.pager
 
 /**
- * Receiver scope for [Pager].
- * Note: This is empty now, but we may add new members in the future if needed.
+ * Receiver scope for [Pager]. Note: This is empty now, but we may add new members in the future if
+ * needed.
  */
 sealed interface PagerScope
 
diff --git a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/pager/PagerScrollPosition.kt b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/pager/PagerScrollPosition.kt
index 6398fc4..e1419c9 100644
--- a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/pager/PagerScrollPosition.kt
+++ b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/pager/PagerScrollPosition.kt
@@ -26,8 +26,8 @@
 import kotlin.math.roundToLong
 
 /**
- * Contains the current scroll position represented by the first visible page  and the first
- * visible page scroll offset.
+ * Contains the current scroll position represented by the first visible page and the first visible
+ * page scroll offset.
  */
 @OptIn(ExperimentalFoundationApi::class)
 internal class PagerScrollPosition(
@@ -46,15 +46,14 @@
     /** The last know key of the page at [currentPage] position. */
     private var lastKnownCurrentPageKey: Any? = null
 
-    val nearestRangeState = LazyLayoutNearestRangeState(
-        currentPage,
-        NearestItemsSlidingWindowSize,
-        NearestItemsExtraItemCount
-    )
+    val nearestRangeState =
+        LazyLayoutNearestRangeState(
+            currentPage,
+            NearestItemsSlidingWindowSize,
+            NearestItemsExtraItemCount
+        )
 
-    /**
-     * Updates the current scroll position based on the results of the last measurement.
-     */
+    /** Updates the current scroll position based on the results of the last measurement. */
     fun updateFromMeasureResult(measureResult: PagerMeasureResult) {
         lastKnownCurrentPageKey = measureResult.currentPage?.key
         // we ignore the index and offset from measureResult until we get at least one
@@ -63,23 +62,19 @@
         if (hadFirstNotEmptyLayout || measureResult.visiblePagesInfo.isNotEmpty()) {
             hadFirstNotEmptyLayout = true
 
-            update(
-                measureResult.currentPage?.index ?: 0,
-                measureResult.currentPageOffsetFraction
-            )
+            update(measureResult.currentPage?.index ?: 0, measureResult.currentPageOffsetFraction)
         }
     }
 
     /**
      * Updates the scroll position - the passed values will be used as a start position for
-     * composing the pages during the next measure pass and will be updated by the real
-     * position calculated during the measurement. This means that there is no guarantee that
-     * exactly this index and offset will be applied as it is possible that:
-     * a) there will be no page at this index in reality
-     * b) page at this index will be smaller than the asked scrollOffset, which means we would
-     * switch to the next page
-     * c) there will be not enough pages to fill the viewport after the requested index, so we
-     * would have to compose few elements before the asked index, changing the first visible page.
+     * composing the pages during the next measure pass and will be updated by the real position
+     * calculated during the measurement. This means that there is no guarantee that exactly this
+     * index and offset will be applied as it is possible that: a) there will be no page at this
+     * index in reality b) page at this index will be smaller than the asked scrollOffset, which
+     * means we would switch to the next page c) there will be not enough pages to fill the viewport
+     * after the requested index, so we would have to compose few elements before the asked index,
+     * changing the first visible page.
      */
     fun requestPositionAndForgetLastKnownKey(index: Int, offsetFraction: Float) {
         update(index, offsetFraction)
@@ -88,10 +83,7 @@
         lastKnownCurrentPageKey = null
     }
 
-    fun matchPageWithKey(
-        itemProvider: PagerLazyLayoutItemProvider,
-        index: Int
-    ): Int {
+    fun matchPageWithKey(itemProvider: PagerLazyLayoutItemProvider, index: Int): Int {
         val newIndex = itemProvider.findIndexByKey(lastKnownCurrentPageKey, index)
         if (index != newIndex) {
             currentPage = newIndex
@@ -112,11 +104,12 @@
 
     fun applyScrollDelta(delta: Int) {
         debugLog { "Applying Delta=$delta" }
-        val fractionUpdate = if (state.pageSizeWithSpacing == 0) {
-            0.0f
-        } else {
-            delta / state.pageSizeWithSpacing.toFloat()
-        }
+        val fractionUpdate =
+            if (state.pageSizeWithSpacing == 0) {
+                0.0f
+            } else {
+                delta / state.pageSizeWithSpacing.toFloat()
+            }
         currentPageOffsetFraction += fractionUpdate
     }
 }
@@ -127,9 +120,7 @@
  */
 internal const val NearestItemsSlidingWindowSize = 30
 
-/**
- * The minimum amount of items near the current first visible item we want to have mapping for.
- */
+/** The minimum amount of items near the current first visible item we want to have mapping for. */
 internal const val NearestItemsExtraItemCount = 100
 
 private inline fun debugLog(generateMsg: () -> String) {
diff --git a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/pager/PagerSemantics.kt b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/pager/PagerSemantics.kt
index 073834d..757f118 100644
--- a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/pager/PagerSemantics.kt
+++ b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/pager/PagerSemantics.kt
@@ -25,7 +25,5 @@
     state: PagerState,
     isVertical: Boolean
 ): LazyLayoutSemanticState {
-    return remember(state, isVertical) {
-        LazyLayoutSemanticState(state, isVertical)
-    }
+    return remember(state, isVertical) { LazyLayoutSemanticState(state, isVertical) }
 }
diff --git a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/pager/PagerSnapDistance.kt b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/pager/PagerSnapDistance.kt
index a7cfe05..17932be 100644
--- a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/pager/PagerSnapDistance.kt
+++ b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/pager/PagerSnapDistance.kt
@@ -20,8 +20,8 @@
 import androidx.compose.runtime.Stable
 
 /**
- * [PagerSnapDistance] defines the way the [Pager] will treat the distance between the current
- * page and the page where it will settle.
+ * [PagerSnapDistance] defines the way the [Pager] will treat the distance between the current page
+ * and the page where it will settle.
  */
 @Stable
 interface PagerSnapDistance {
@@ -31,15 +31,14 @@
      *
      * @param startPage The current page right before the fling starts.
      * @param suggestedTargetPage The proposed target page where this fling will stop. This target
-     * will be the page that will be correctly positioned (snapped) after naturally decaying with
-     * [velocity] using a [DecayAnimationSpec].
+     *   will be the page that will be correctly positioned (snapped) after naturally decaying with
+     *   [velocity] using a [DecayAnimationSpec].
      * @param velocity The initial fling velocity.
      * @param pageSize The page size for this [Pager] in pixels.
      * @param pageSpacing The spacing used between pages in pixels.
-     *
      * @return An updated target page where to settle. Note that this value needs to be between 0
-     * and the total count of pages in this pager. If an invalid value is passed, the pager will
-     * coerce within the valid values.
+     *   and the total count of pages in this pager. If an invalid value is passed, the pager will
+     *   coerce within the valid values.
      */
     fun calculateTargetPage(
         startPage: Int,
@@ -52,6 +51,7 @@
     companion object {
         /**
          * Limits the maximum number of pages that can be flung per fling gesture.
+         *
          * @param pages The maximum number of extra pages that can be flung at once.
          */
         fun atMost(pages: Int): PagerSnapDistance {
@@ -65,6 +65,7 @@
 
 /**
  * Limits the maximum number of pages that can be flung per fling gesture.
+ *
  * @param pagesLimit The maximum number of extra pages that can be flung at once.
  */
 internal class PagerSnapDistanceMaxPages(private val pagesLimit: Int) : PagerSnapDistance {
diff --git a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/pager/PagerState.kt b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/pager/PagerState.kt
index 4f4b24e..d172d58 100644
--- a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/pager/PagerState.kt
+++ b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/pager/PagerState.kt
@@ -71,12 +71,13 @@
  * Creates and remember a [PagerState] to be used with a [Pager]
  *
  * Please refer to the sample to learn how to use this API.
+ *
  * @sample androidx.compose.foundation.samples.PagerWithStateSample
  *
  * @param initialPage The pager that should be shown first.
  * @param initialPageOffsetFraction The offset of the initial page as a fraction of the page size.
- * This should vary between -0.5 and 0.5 and indicates how to offset the initial page from the
- * snapped position.
+ *   This should vary between -0.5 and 0.5 and indicates how to offset the initial page from the
+ *   snapped position.
  * @param pageCount The amount of pages this Pager will have.
  */
 @Composable
@@ -86,26 +87,22 @@
     pageCount: () -> Int
 ): PagerState {
     return rememberSaveable(saver = DefaultPagerState.Saver) {
-        DefaultPagerState(
-            initialPage,
-            initialPageOffsetFraction,
-            pageCount
-        )
-    }.apply {
-        pageCountState.value = pageCount
-    }
+            DefaultPagerState(initialPage, initialPageOffsetFraction, pageCount)
+        }
+        .apply { pageCountState.value = pageCount }
 }
 
 /**
  * Creates a default [PagerState] to be used with a [Pager]
  *
  * Please refer to the sample to learn how to use this API.
+ *
  * @sample androidx.compose.foundation.samples.PagerWithStateSample
  *
  * @param currentPage The pager that should be shown first.
  * @param currentPageOffsetFraction The offset of the initial page as a fraction of the page size.
- * This should vary between -0.5 and 0.5 and indicates how to offset the initial page from the
- * snapped position.
+ *   This should vary between -0.5 and 0.5 and indicates how to offset the initial page from the
+ *   snapped position.
  * @param pageCount The amount of pages this Pager will have.
  */
 fun PagerState(
@@ -121,37 +118,36 @@
 ) : PagerState(currentPage, currentPageOffsetFraction) {
 
     var pageCountState = mutableStateOf(updatedPageCount)
-    override val pageCount: Int get() = pageCountState.value.invoke()
+    override val pageCount: Int
+        get() = pageCountState.value.invoke()
 
     companion object {
-        /**
-         * To keep current page and current page offset saved
-         */
-        val Saver: Saver<DefaultPagerState, *> = listSaver(
-            save = {
-                listOf(
-                    it.currentPage,
-                    (it.currentPageOffsetFraction).coerceIn(MinPageOffset, MaxPageOffset),
-                    it.pageCount
-                )
-            },
-            restore = {
-                DefaultPagerState(
-                    currentPage = it[0] as Int,
-                    currentPageOffsetFraction = it[1] as Float,
-                    updatedPageCount = { it[2] as Int }
-                )
-            }
-        )
+        /** To keep current page and current page offset saved */
+        val Saver: Saver<DefaultPagerState, *> =
+            listSaver(
+                save = {
+                    listOf(
+                        it.currentPage,
+                        (it.currentPageOffsetFraction).coerceIn(MinPageOffset, MaxPageOffset),
+                        it.pageCount
+                    )
+                },
+                restore = {
+                    DefaultPagerState(
+                        currentPage = it[0] as Int,
+                        currentPageOffsetFraction = it[1] as Float,
+                        updatedPageCount = { it[2] as Int }
+                    )
+                }
+            )
     }
 }
 
-/**
- * The state that can be used to control [VerticalPager] and [HorizontalPager]
- */
+/** The state that can be used to control [VerticalPager] and [HorizontalPager] */
 @OptIn(ExperimentalFoundationApi::class)
 @Stable
-abstract class PagerState internal constructor(
+abstract class PagerState
+internal constructor(
     currentPage: Int = 0,
     @FloatRange(from = -0.5, to = 0.5) currentPageOffsetFraction: Float = 0f,
     prefetchScheduler: PrefetchScheduler? = null
@@ -160,7 +156,7 @@
     /**
      * @param currentPage The initial page to be displayed
      * @param currentPageOffsetFraction The offset of the initial page with respect to the start of
-     * the layout.
+     *   the layout.
      */
     constructor(
         currentPage: Int = 0,
@@ -180,9 +176,7 @@
         }
     }
 
-    /**
-     * Difference between the last up and last down events of a scroll event.
-     */
+    /** Difference between the last up and last down events of a scroll event. */
     internal var upDownDifference: Offset by mutableStateOf(Offset.Zero)
     private val animatedScrollScope = PagerLazyAnimateScrollScope(this)
 
@@ -201,20 +195,20 @@
     private var accumulator: Float = 0.0f
 
     /**
-     * The prefetch will act after the measure pass has finished and it needs to know the
-     * magnitude and direction of the scroll that triggered the measure pass
+     * The prefetch will act after the measure pass has finished and it needs to know the magnitude
+     * and direction of the scroll that triggered the measure pass
      */
     private var previousPassDelta = 0f
 
     /**
-     * The ScrollableController instance. We keep it as we need to call stopAnimation on it once
-     * we reached the end of the list.
+     * The ScrollableController instance. We keep it as we need to call stopAnimation on it once we
+     * reached the end of the list.
      */
     private val scrollableState = ScrollableState { performScroll(it) }
 
     /**
-     * Within the scrolling context we can use absolute positions to
-     * determine scroll deltas and max min scrolling.
+     * Within the scrolling context we can use absolute positions to determine scroll deltas and max
+     * min scrolling.
      */
     private fun performScroll(delta: Float): Float {
         val currentScrollPosition = currentAbsoluteScrollOffset()
@@ -238,19 +232,13 @@
          */
         val updatedScrollPosition = (currentScrollPosition + decimalAccumulationInt)
 
-        /**
-         * Check if the scroll position may be larger than the maximum possible scroll.
-         */
+        /** Check if the scroll position may be larger than the maximum possible scroll. */
         val coercedScrollPosition = updatedScrollPosition.coerceIn(minScrollOffset, maxScrollOffset)
 
-        /**
-         * Check if we actually coerced.
-         */
+        /** Check if we actually coerced. */
         val changed = updatedScrollPosition != coercedScrollPosition
 
-        /**
-         * Calculated the actual scroll delta to be applied
-         */
+        /** Calculated the actual scroll delta to be applied */
         val scrollDelta = coercedScrollPosition - currentScrollPosition
 
         previousPassDelta = scrollDelta.toFloat()
@@ -260,16 +248,11 @@
             isLastScrollBackwardState.value = scrollDelta < 0.0f
         }
 
-        /**
-         * Apply the scroll delta
-         */
+        /** Apply the scroll delta */
         val layoutInfo = pagerLayoutInfoState.value
         if (layoutInfo.tryToApplyScrollWithoutRemeasure(-scrollDelta.toInt())) {
             debugLog { "Will Apply Without Remeasure" }
-            applyMeasureResult(
-                result = layoutInfo,
-                visibleItemsStayedTheSame = true
-            )
+            applyMeasureResult(result = layoutInfo, visibleItemsStayedTheSame = true)
             // we don't need to remeasure, so we only trigger re-placement:
             placementScopeInvalidator.invalidateScope()
             layoutWithoutMeasurement++
@@ -284,19 +267,16 @@
         return (if (changed) scrollDelta else delta).toFloat()
     }
 
-    /**
-     * Only used for testing to confirm that we're not making too many measure passes
-     */
-    internal val numMeasurePasses: Int get() = layoutWithMeasurement + layoutWithoutMeasurement
+    /** Only used for testing to confirm that we're not making too many measure passes */
+    internal val numMeasurePasses: Int
+        get() = layoutWithMeasurement + layoutWithoutMeasurement
 
     internal var layoutWithMeasurement: Int = 0
         private set
 
     private var layoutWithoutMeasurement: Int = 0
 
-    /**
-     * Only used for testing to disable prefetching when needed to test the main logic.
-     */
+    /** Only used for testing to disable prefetching when needed to test the main logic. */
     internal var prefetchingEnabled: Boolean = true
 
     /**
@@ -304,35 +284,33 @@
      */
     private var indexToPrefetch = -1
 
-    /**
-     * The handle associated with the current index from [indexToPrefetch].
-     */
+    /** The handle associated with the current index from [indexToPrefetch]. */
     private var currentPrefetchHandle: LazyLayoutPrefetchState.PrefetchHandle? = null
 
     /**
-     * Keeps the scrolling direction during the previous calculation in order to be able to
-     * detect the scrolling direction change.
+     * Keeps the scrolling direction during the previous calculation in order to be able to detect
+     * the scrolling direction change.
      */
     private var wasPrefetchingForward = false
 
     /** Backing state for PagerLayoutInfo */
-    private var pagerLayoutInfoState =
-        mutableStateOf(EmptyLayoutInfo, neverEqualPolicy())
+    private var pagerLayoutInfoState = mutableStateOf(EmptyLayoutInfo, neverEqualPolicy())
 
     /**
-     * A [PagerLayoutInfo] that contains useful information about the Pager's last layout pass.
-     * For instance, you can query which pages are currently visible in the layout.
+     * A [PagerLayoutInfo] that contains useful information about the Pager's last layout pass. For
+     * instance, you can query which pages are currently visible in the layout.
      *
-     * This property is observable and is updated after every scroll or remeasure.
-     * If you use it in the composable function it will be recomposed on every change causing
-     * potential performance issues including infinity recomposition loop.
-     * Therefore, avoid using it in the composition.
+     * This property is observable and is updated after every scroll or remeasure. If you use it in
+     * the composable function it will be recomposed on every change causing potential performance
+     * issues including infinity recomposition loop. Therefore, avoid using it in the composition.
      *
      * If you want to run some side effects like sending an analytics event or updating a state
      * based on this value consider using "snapshotFlow":
+     *
      * @sample androidx.compose.foundation.samples.UsingPagerLayoutInfoForSideEffectSample
      */
-    val layoutInfo: PagerLayoutInfo get() = pagerLayoutInfoState.value
+    val layoutInfo: PagerLayoutInfo
+        get() = pagerLayoutInfoState.value
 
     internal val pageSpacing: Int
         get() = pagerLayoutInfoState.value.pageSpacing
@@ -350,17 +328,18 @@
      * page.
      */
     internal val positionThresholdFraction: Float
-        get() = with(density) {
-            val minThreshold = minOf(DefaultPositionThreshold.toPx(), pageSize / 2f)
-            minThreshold / pageSize.toFloat()
-        }
+        get() =
+            with(density) {
+                val minThreshold = minOf(DefaultPositionThreshold.toPx(), pageSize / 2f)
+                minThreshold / pageSize.toFloat()
+            }
 
     internal val internalInteractionSource: MutableInteractionSource = MutableInteractionSource()
 
     /**
-     * [InteractionSource] that will be used to dispatch drag events when this
-     * list is being dragged. If you want to know whether the fling (or animated scroll) is in
-     * progress, use [isScrollInProgress].
+     * [InteractionSource] that will be used to dispatch drag events when this list is being
+     * dragged. If you want to know whether the fling (or animated scroll) is in progress, use
+     * [isScrollInProgress].
      */
     val interactionSource: InteractionSource
         get() = internalInteractionSource
@@ -370,10 +349,11 @@
      * change as the pager scrolls either by gesture or animation.
      *
      * Please refer to the sample to learn how to use this API.
-     * @sample androidx.compose.foundation.samples.ObservingStateChangesInPagerStateSample
      *
+     * @sample androidx.compose.foundation.samples.ObservingStateChangesInPagerStateSample
      */
-    val currentPage: Int get() = scrollPosition.currentPage
+    val currentPage: Int
+        get() = scrollPosition.currentPage
 
     private var programmaticScrollTargetPage by mutableIntStateOf(-1)
 
@@ -385,68 +365,73 @@
      * animation/scroll settles.
      *
      * Please refer to the sample to learn how to use this API.
-     * @sample androidx.compose.foundation.samples.ObservingStateChangesInPagerStateSample
-     */
-    val settledPage by derivedStateOf(structuralEqualityPolicy()) {
-        if (isScrollInProgress) {
-            settledPageState
-        } else {
-            this.currentPage
-        }
-    }
-
-    /**
-     * The page this [Pager] intends to settle to.
-     * During fling or animated scroll (from [animateScrollToPage] this will represent the page
-     * this pager intends to settle to. When no scroll is ongoing, this will be equal to
-     * [currentPage].
      *
-     * Please refer to the sample to learn how to use this API.
      * @sample androidx.compose.foundation.samples.ObservingStateChangesInPagerStateSample
      */
-    val targetPage: Int by derivedStateOf(structuralEqualityPolicy()) {
-        val finalPage = if (!isScrollInProgress) {
-            this.currentPage
-        } else if (programmaticScrollTargetPage != -1) {
-            programmaticScrollTargetPage
-        } else {
-            // act on scroll only
-            if (abs(this.currentPageOffsetFraction) >= abs(positionThresholdFraction)) {
-                if (lastScrolledForward) {
-                    firstVisiblePage + 1
-                } else {
-                    firstVisiblePage
-                }
+    val settledPage by
+        derivedStateOf(structuralEqualityPolicy()) {
+            if (isScrollInProgress) {
+                settledPageState
             } else {
                 this.currentPage
             }
         }
-        finalPage.coerceInPageRange()
-    }
 
     /**
-     * Indicates how far the current page is to the snapped position, this will vary from
-     * -0.5 (page is offset towards the start of the layout) to 0.5 (page is offset towards the end
-     * of the layout). This is 0.0 if the [currentPage] is in the snapped position. The value will
-     * flip once the current page changes.
-     *
-     * This property is observable and shouldn't be used as is in a composable function due to
-     * potential performance issues. To use it in the composition, please consider using a
-     * derived state (e.g [derivedStateOf]) to only have recompositions when the derived
-     * value changes.
+     * The page this [Pager] intends to settle to. During fling or animated scroll (from
+     * [animateScrollToPage] this will represent the page this pager intends to settle to. When no
+     * scroll is ongoing, this will be equal to [currentPage].
      *
      * Please refer to the sample to learn how to use this API.
+     *
      * @sample androidx.compose.foundation.samples.ObservingStateChangesInPagerStateSample
      */
-    val currentPageOffsetFraction: Float get() = scrollPosition.currentPageOffsetFraction
+    val targetPage: Int by
+        derivedStateOf(structuralEqualityPolicy()) {
+            val finalPage =
+                if (!isScrollInProgress) {
+                    this.currentPage
+                } else if (programmaticScrollTargetPage != -1) {
+                    programmaticScrollTargetPage
+                } else {
+                    // act on scroll only
+                    if (abs(this.currentPageOffsetFraction) >= abs(positionThresholdFraction)) {
+                        if (lastScrolledForward) {
+                            firstVisiblePage + 1
+                        } else {
+                            firstVisiblePage
+                        }
+                    } else {
+                        this.currentPage
+                    }
+                }
+            finalPage.coerceInPageRange()
+        }
+
+    /**
+     * Indicates how far the current page is to the snapped position, this will vary from -0.5 (page
+     * is offset towards the start of the layout) to 0.5 (page is offset towards the end of the
+     * layout). This is 0.0 if the [currentPage] is in the snapped position. The value will flip
+     * once the current page changes.
+     *
+     * This property is observable and shouldn't be used as is in a composable function due to
+     * potential performance issues. To use it in the composition, please consider using a derived
+     * state (e.g [derivedStateOf]) to only have recompositions when the derived value changes.
+     *
+     * Please refer to the sample to learn how to use this API.
+     *
+     * @sample androidx.compose.foundation.samples.ObservingStateChangesInPagerStateSample
+     */
+    val currentPageOffsetFraction: Float
+        get() = scrollPosition.currentPageOffsetFraction
 
     internal val prefetchState = LazyLayoutPrefetchState(prefetchScheduler)
 
     internal val beyondBoundsInfo = LazyLayoutBeyondBoundsInfo()
 
     /**
-     * Provides a modifier which allows to delay some interactions (e.g. scroll)
-     * until layout is ready.
+     * Provides a modifier which allows to delay some interactions (e.g. scroll) until layout is
+     * ready.
      */
     internal val awaitLayoutModifier = AwaitFirstLayoutModifier()
 
@@ -457,23 +442,18 @@
     internal var remeasurement: Remeasurement? by mutableStateOf(null)
         private set
 
-    /**
-     * The modifier which provides [remeasurement].
-     */
-    internal val remeasurementModifier = object : RemeasurementModifier {
-        override fun onRemeasurementAvailable(remeasurement: Remeasurement) {
-            this@PagerState.remeasurement = remeasurement
+    /** The modifier which provides [remeasurement]. */
+    internal val remeasurementModifier =
+        object : RemeasurementModifier {
+            override fun onRemeasurementAvailable(remeasurement: Remeasurement) {
+                this@PagerState.remeasurement = remeasurement
+            }
         }
-    }
 
-    /**
-     * Constraints passed to the prefetcher for premeasuring the prefetched items.
-     */
+    /** Constraints passed to the prefetcher for premeasuring the prefetched items. */
     internal var premeasureConstraints = Constraints()
 
-    /**
-     * Stores currently pinned pages which are always composed, used by for beyond bound pages.
-     */
+    /** Stores currently pinned pages which are always composed, used by for beyond bound pages. */
     internal val pinnedPages = LazyLayoutPinnedItemList()
 
     internal val nearestRange: IntRange by scrollPosition.nearestRangeState
@@ -484,11 +464,12 @@
      * Scroll (jump immediately) to a given [page].
      *
      * Please refer to the sample to learn how to use this API.
+     *
      * @sample androidx.compose.foundation.samples.ScrollToPageSample
      *
      * @param page The destination page to scroll to
      * @param pageOffsetFraction A fraction of the page size that indicates the offset the
-     * destination page will be offset from its snapped position.
+     *   destination page will be offset from its snapped position.
      */
     suspend fun scrollToPage(
         page: Int,
@@ -504,26 +485,25 @@
     }
 
     /**
-     * Jump immediately to a given [page] with a given [pageOffsetFraction] inside
-     * a [ScrollScope]. Use this method to create custom animated scrolling experiences. This will
-     * update the value of [currentPage] and [currentPageOffsetFraction] immediately, but can only
-     * be used inside a [ScrollScope], use [scroll] to gain access to a [ScrollScope].
+     * Jump immediately to a given [page] with a given [pageOffsetFraction] inside a [ScrollScope].
+     * Use this method to create custom animated scrolling experiences. This will update the value
+     * of [currentPage] and [currentPageOffsetFraction] immediately, but can only be used inside a
+     * [ScrollScope], use [scroll] to gain access to a [ScrollScope].
      *
      * Please refer to the sample to learn how to use this API.
+     *
      * @sample androidx.compose.foundation.samples.PagerCustomAnimateScrollToPage
      *
      * @param page The destination page to scroll to
      * @param pageOffsetFraction A fraction of the page size that indicates the offset the
-     * destination page will be offset from its snapped position.
+     *   destination page will be offset from its snapped position.
      */
     @ExperimentalFoundationApi
     fun ScrollScope.updateCurrentPage(
         page: Int,
         @FloatRange(from = -0.5, to = 0.5) pageOffsetFraction: Float = 0.0f
     ) {
-        with(animatedScrollScope) {
-            snapToItem(page, pageOffsetFraction, forceRemeasure = true)
-        }
+        with(animatedScrollScope) { snapToItem(page, pageOffsetFraction, forceRemeasure = true) }
     }
 
     /**
@@ -535,6 +515,7 @@
      * scrolling [targetPage] will assume the value of [currentPage].
      *
      * Please refer to the sample to learn how to use this API.
+     *
      * @sample androidx.compose.foundation.samples.PagerCustomAnimateScrollToPage
      */
     @ExperimentalFoundationApi
@@ -554,12 +535,12 @@
     internal val measurementScopeInvalidator = ObservableScopeInvalidator()
 
     /**
-     * Requests the [page] to be at the snapped position during the next remeasure,
-     * offset by [pageOffsetFraction], and schedules a remeasure.
+     * Requests the [page] to be at the snapped position during the next remeasure, offset by
+     * [pageOffsetFraction], and schedules a remeasure.
      *
-     * The scroll position will be updated to the requested position rather than maintain
-     * the index based on the current page key (when a data set change will also be
-     * applied during the next remeasure), but *only* for the next remeasure.
+     * The scroll position will be updated to the requested position rather than maintain the index
+     * based on the current page key (when a data set change will also be applied during the next
+     * remeasure), but *only* for the next remeasure.
      *
      * Any scroll in progress will be cancelled.
      *
@@ -572,9 +553,7 @@
     ) {
         // Cancel any scroll in progress.
         if (isScrollInProgress) {
-            pagerLayoutInfoState.value.coroutineScope.launch {
-                stopScroll()
-            }
+            pagerLayoutInfoState.value.coroutineScope.launch { stopScroll() }
         }
 
         snapToItem(page, pageOffsetFraction, forceRemeasure = false)
@@ -582,33 +561,34 @@
 
     /**
      * Scroll animate to a given [page]. If the [page] is too far away from [currentPage] we will
-     * not compose all pages in the way. We will pre-jump to a nearer page, compose and animate
-     * the rest of the pages until [page].
+     * not compose all pages in the way. We will pre-jump to a nearer page, compose and animate the
+     * rest of the pages until [page].
      *
      * Please refer to the sample to learn how to use this API.
+     *
      * @sample androidx.compose.foundation.samples.AnimateScrollPageSample
      *
      * @param page The destination page to scroll to
      * @param pageOffsetFraction A fraction of the page size that indicates the offset the
-     * destination page will be offset from its snapped position.
+     *   destination page will be offset from its snapped position.
      * @param animationSpec An [AnimationSpec] to move between pages. We'll use a [spring] as the
-     * default animation.
+     *   default animation.
      */
     suspend fun animateScrollToPage(
         page: Int,
         @FloatRange(from = -0.5, to = 0.5) pageOffsetFraction: Float = 0f,
         animationSpec: AnimationSpec<Float> = spring()
     ) {
-        if (page == currentPage && currentPageOffsetFraction == pageOffsetFraction ||
-            pageCount == 0
-        ) return
+        if (
+            page == currentPage && currentPageOffsetFraction == pageOffsetFraction || pageCount == 0
+        )
+            return
         awaitScrollDependencies()
         require(pageOffsetFraction in -0.5..0.5) {
             "pageOffsetFraction $pageOffsetFraction is not within the range -0.5 to 0.5"
         }
         val targetPage = page.coerceInPageRange()
-        val targetPageOffsetToSnappedPosition =
-            (pageOffsetFraction * pageSizeWithSpacing)
+        val targetPageOffsetToSnappedPosition = (pageOffsetFraction * pageSizeWithSpacing)
 
         animatedScrollScope.animateScrollToPage(
             targetPage,
@@ -644,6 +624,7 @@
 
     final override var canScrollForward: Boolean by mutableStateOf(false)
         private set
+
     final override var canScrollBackward: Boolean by mutableStateOf(false)
         private set
 
@@ -658,9 +639,7 @@
     override val lastScrolledBackward: Boolean
         get() = isLastScrollBackwardState.value
 
-    /**
-     *  Updates the state with the new calculated scroll position and consumed scroll.
-     */
+    /** Updates the state with the new calculated scroll position and consumed scroll. */
     internal fun applyMeasureResult(
         result: PagerMeasureResult,
         visibleItemsStayedTheSame: Boolean = false
@@ -680,25 +659,24 @@
         tryRunPrefetch(result)
         maxScrollOffset = result.calculateNewMaxScrollOffset(pageCount)
         minScrollOffset = result.calculateNewMinScrollOffset(pageCount)
-        debugLog {
-            "Finished Applying Measure Result" +
-                "\nNew maxScrollOffset=$maxScrollOffset"
-        }
+        debugLog { "Finished Applying Measure Result" + "\nNew maxScrollOffset=$maxScrollOffset" }
     }
 
-    private fun tryRunPrefetch(result: PagerMeasureResult) = Snapshot.withoutReadObservation {
-        if (abs(previousPassDelta) > 0.5f) {
-            if (prefetchingEnabled && isGestureActionMatchesScroll(previousPassDelta)) {
-                notifyPrefetch(previousPassDelta, result)
+    private fun tryRunPrefetch(result: PagerMeasureResult) =
+        Snapshot.withoutReadObservation {
+            if (abs(previousPassDelta) > 0.5f) {
+                if (prefetchingEnabled && isGestureActionMatchesScroll(previousPassDelta)) {
+                    notifyPrefetch(previousPassDelta, result)
+                }
             }
         }
-    }
 
-    private fun Int.coerceInPageRange() = if (pageCount > 0) {
-        coerceIn(0, pageCount - 1)
-    } else {
-        0
-    }
+    private fun Int.coerceInPageRange() =
+        if (pageCount > 0) {
+            coerceIn(0, pageCount - 1)
+        } else {
+            0
+        }
 
     // check if the scrolling will be a result of a fling operation. That is, if the scrolling
     // direction is in the opposite direction of the gesture movement. Also, return true if there
@@ -720,11 +698,16 @@
 
         if (info.visiblePagesInfo.isNotEmpty()) {
             val isPrefetchingForward = delta > 0
-            val indexToPrefetch = if (isPrefetchingForward) {
-                info.visiblePagesInfo.last().index + info.beyondViewportPageCount + PagesToPrefetch
-            } else {
-                info.visiblePagesInfo.first().index - info.beyondViewportPageCount - PagesToPrefetch
-            }
+            val indexToPrefetch =
+                if (isPrefetchingForward) {
+                    info.visiblePagesInfo.last().index +
+                        info.beyondViewportPageCount +
+                        PagesToPrefetch
+                } else {
+                    info.visiblePagesInfo.first().index -
+                        info.beyondViewportPageCount -
+                        PagesToPrefetch
+                }
             if (indexToPrefetch in 0 until pageCount) {
                 if (indexToPrefetch != this.indexToPrefetch) {
                     if (wasPrefetchingForward != isPrefetchingForward) {
@@ -736,9 +719,8 @@
                     }
                     this.wasPrefetchingForward = isPrefetchingForward
                     this.indexToPrefetch = indexToPrefetch
-                    currentPrefetchHandle = prefetchState.schedulePrefetch(
-                        indexToPrefetch, premeasureConstraints
-                    )
+                    currentPrefetchHandle =
+                        prefetchState.schedulePrefetch(indexToPrefetch, premeasureConstraints)
                 }
                 if (isPrefetchingForward) {
                     val lastItem = info.visiblePagesInfo.last()
@@ -763,11 +745,16 @@
 
     private fun cancelPrefetchIfVisibleItemsChanged(info: PagerLayoutInfo) {
         if (indexToPrefetch != -1 && info.visiblePagesInfo.isNotEmpty()) {
-            val expectedPrefetchIndex = if (wasPrefetchingForward) {
-                info.visiblePagesInfo.last().index + info.beyondViewportPageCount + PagesToPrefetch
-            } else {
-                info.visiblePagesInfo.first().index - info.beyondViewportPageCount - PagesToPrefetch
-            }
+            val expectedPrefetchIndex =
+                if (wasPrefetchingForward) {
+                    info.visiblePagesInfo.last().index +
+                        info.beyondViewportPageCount +
+                        PagesToPrefetch
+                } else {
+                    info.visiblePagesInfo.first().index -
+                        info.beyondViewportPageCount -
+                        PagesToPrefetch
+                }
             if (indexToPrefetch != expectedPrefetchIndex) {
                 indexToPrefetch = -1
                 currentPrefetchHandle?.cancel()
@@ -778,10 +765,10 @@
 
     /**
      * An utility function to help to calculate a given page's offset. This is an offset that
-     * represents how far [page] is from the settled position (represented by [currentPage]
-     * offset). The difference here is that [currentPageOffsetFraction] is a value between -0.5 and
-     * 0.5 and the value calculated by this function can be larger than these numbers if [page] is
-     * different than [currentPage].
+     * represents how far [page] is from the settled position (represented by [currentPage] offset).
+     * The difference here is that [currentPageOffsetFraction] is a value between -0.5 and 0.5 and
+     * the value calculated by this function can be larger than these numbers if [page] is different
+     * than [currentPage].
      *
      * For instance, if currentPage=0 and we call [getOffsetDistanceInPages] for page 3, the result
      * will be 3, meaning the given page is 3 pages away from the current page (the sign represent
@@ -791,25 +778,23 @@
      *
      * This offset also works in conjunction with [currentPageOffsetFraction], so if [currentPage]
      * is out of its snapped position (i.e. currentPageOffsetFraction!=0) then the calculated value
-     * will still represent the offset in number of pages (in this case, not whole pages).
-     * For instance, if currentPage=1 and we're slightly offset, currentPageOffsetFraction=0.2,
-     * if we call this to page 2, the result would be 0.8, that is 0.8 page away from current page
-     * (moving forward).
+     * will still represent the offset in number of pages (in this case, not whole pages). For
+     * instance, if currentPage=1 and we're slightly offset, currentPageOffsetFraction=0.2, if we
+     * call this to page 2, the result would be 0.8, that is 0.8 page away from current page (moving
+     * forward).
      *
      * @param page The page to calculate the offset from. This should be between 0 and [pageCount].
      * @return The offset of [page] with respect to [currentPage].
      */
     fun getOffsetDistanceInPages(page: Int): Float {
-        require(page in 0..pageCount) {
-            "page $page is not within the range 0 to $pageCount"
-        }
+        require(page in 0..pageCount) { "page $page is not within the range 0 to $pageCount" }
         return page - currentPage - currentPageOffsetFraction
     }
 
     /**
-     * When the user provided custom keys for the pages we can try to detect when there were
-     * pages added or removed before our current page and keep this page as the current one
-     * given that its index has been changed.
+     * When the user provided custom keys for the pages we can try to detect when there were pages
+     * added or removed before our current page and keep this page as the current one given that its
+     * index has been changed.
      */
     internal fun matchScrollPositionWithKey(
         itemProvider: PagerLazyLayoutItemProvider,
@@ -829,40 +814,43 @@
 private const val MaxPagesForAnimateScroll = 3
 internal const val PagesToPrefetch = 1
 
-internal val EmptyLayoutInfo = PagerMeasureResult(
-    visiblePagesInfo = emptyList(),
-    pageSize = 0,
-    pageSpacing = 0,
-    afterContentPadding = 0,
-    orientation = Orientation.Horizontal,
-    viewportStartOffset = 0,
-    viewportEndOffset = 0,
-    reverseLayout = false,
-    beyondViewportPageCount = 0,
-    firstVisiblePage = null,
-    firstVisiblePageScrollOffset = 0,
-    currentPage = null,
-    currentPageOffsetFraction = 0.0f,
-    canScrollForward = false,
-    snapPosition = SnapPosition.Start,
-    measureResult = object : MeasureResult {
-        override val width: Int = 0
+internal val EmptyLayoutInfo =
+    PagerMeasureResult(
+        visiblePagesInfo = emptyList(),
+        pageSize = 0,
+        pageSpacing = 0,
+        afterContentPadding = 0,
+        orientation = Orientation.Horizontal,
+        viewportStartOffset = 0,
+        viewportEndOffset = 0,
+        reverseLayout = false,
+        beyondViewportPageCount = 0,
+        firstVisiblePage = null,
+        firstVisiblePageScrollOffset = 0,
+        currentPage = null,
+        currentPageOffsetFraction = 0.0f,
+        canScrollForward = false,
+        snapPosition = SnapPosition.Start,
+        measureResult =
+            object : MeasureResult {
+                override val width: Int = 0
 
-        override val height: Int = 0
+                override val height: Int = 0
 
-        @Suppress("PrimitiveInCollection")
-        override val alignmentLines: Map<AlignmentLine, Int> = mapOf()
+                @Suppress("PrimitiveInCollection")
+                override val alignmentLines: Map<AlignmentLine, Int> = mapOf()
 
-        override fun placeChildren() {}
-    },
-    remeasureNeeded = false,
-    coroutineScope = CoroutineScope(EmptyCoroutineContext)
-)
+                override fun placeChildren() {}
+            },
+        remeasureNeeded = false,
+        coroutineScope = CoroutineScope(EmptyCoroutineContext)
+    )
 
-private val UnitDensity = object : Density {
-    override val density: Float = 1f
-    override val fontScale: Float = 1f
-}
+private val UnitDensity =
+    object : Density {
+        override val density: Float = 1f
+        override val fontScale: Float = 1f
+    }
 
 private inline fun debugLog(generateMsg: () -> String) {
     if (PagerDebugConfig.PagerState) {
@@ -878,19 +866,22 @@
         if (orientation == Orientation.Horizontal) viewportSize.width else viewportSize.height
 
     /**
-     * We need to take into consideration the snap position for max scroll position.
-     * For instance, if SnapPosition.Start, the max scroll position is
-     * pageCount * pageSize - viewport. Now if SnapPosition.End, it should be pageCount * pageSize.
-     * Therefore, the snap position discount varies between 0 and viewport.
+     * We need to take into consideration the snap position for max scroll position. For instance,
+     * if SnapPosition.Start, the max scroll position is pageCount * pageSize - viewport. Now if
+     * SnapPosition.End, it should be pageCount * pageSize. Therefore, the snap position discount
+     * varies between 0 and viewport.
      */
-    val snapPositionDiscount = layoutSize - (snapPosition.position(
-        layoutSize = layoutSize,
-        itemSize = pageSize,
-        itemIndex = pageCount - 1,
-        beforeContentPadding = beforeContentPadding,
-        afterContentPadding = afterContentPadding,
-        itemCount = pageCount
-    )).coerceIn(0, layoutSize)
+    val snapPositionDiscount =
+        layoutSize -
+            (snapPosition.position(
+                    layoutSize = layoutSize,
+                    itemSize = pageSize,
+                    itemIndex = pageCount - 1,
+                    beforeContentPadding = beforeContentPadding,
+                    afterContentPadding = afterContentPadding,
+                    itemCount = pageCount
+                ))
+                .coerceIn(0, layoutSize)
 
     debugLog {
         "maxScrollPossible=$maxScrollPossible" +
@@ -904,14 +895,17 @@
     val layoutSize =
         if (orientation == Orientation.Horizontal) viewportSize.width else viewportSize.height
 
-    return snapPosition.position(
-        layoutSize = layoutSize,
-        itemSize = pageSize,
-        itemIndex = 0,
-        beforeContentPadding = beforeContentPadding,
-        afterContentPadding = afterContentPadding,
-        itemCount = pageCount
-    ).coerceIn(0, layoutSize).toLong()
+    return snapPosition
+        .position(
+            layoutSize = layoutSize,
+            itemSize = pageSize,
+            itemIndex = 0,
+            beforeContentPadding = beforeContentPadding,
+            afterContentPadding = afterContentPadding,
+            itemCount = pageCount
+        )
+        .coerceIn(0, layoutSize)
+        .toLong()
 }
 
 @OptIn(ExperimentalFoundationApi::class)
@@ -925,19 +919,19 @@
         updateTargetPage(targetPage)
         val forward = targetPage > firstVisibleItemIndex
         val visiblePages = lastVisibleItemIndex - firstVisibleItemIndex + 1
-        if (((forward && targetPage > lastVisibleItemIndex) ||
+        if (
+            ((forward && targetPage > lastVisibleItemIndex) ||
                 (!forward && targetPage < firstVisibleItemIndex)) &&
-            abs(targetPage - firstVisibleItemIndex) >= MaxPagesForAnimateScroll
+                abs(targetPage - firstVisibleItemIndex) >= MaxPagesForAnimateScroll
         ) {
-            val preJumpPosition = if (forward) {
-                (targetPage - visiblePages).coerceAtLeast(firstVisibleItemIndex)
-            } else {
-                (targetPage + visiblePages).coerceAtMost(firstVisibleItemIndex)
-            }
+            val preJumpPosition =
+                if (forward) {
+                    (targetPage - visiblePages).coerceAtLeast(firstVisibleItemIndex)
+                } else {
+                    (targetPage + visiblePages).coerceAtMost(firstVisibleItemIndex)
+                }
 
-            debugLog {
-                "animateScrollToPage with pre-jump to position=$preJumpPosition"
-            }
+            debugLog { "animateScrollToPage with pre-jump to position=$preJumpPosition" }
 
             // Pre-jump to 1 viewport away from destination page, if possible
             snapToItem(preJumpPosition, 0)
diff --git a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/relocation/BringIntoView.kt b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/relocation/BringIntoView.kt
index d4d5cc4..fffad28 100644
--- a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/relocation/BringIntoView.kt
+++ b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/relocation/BringIntoView.kt
@@ -38,16 +38,16 @@
      * Scrolls this node's content so that [boundsProvider] will be in visible bounds. Must ensure
      * that the request is propagated up to the parent node.
      *
-     * This method will not return until this request has been satisfied or interrupted by a
-     * newer request.
+     * This method will not return until this request has been satisfied or interrupted by a newer
+     * request.
      *
      * @param childCoordinates The [LayoutCoordinates] of the child node making the request. This
-     * parent can use these [LayoutCoordinates] to translate [boundsProvider] into its own
-     * coordinates.
+     *   parent can use these [LayoutCoordinates] to translate [boundsProvider] into its own
+     *   coordinates.
      * @param boundsProvider A function returning the rectangle to bring into view, relative to
-     * [childCoordinates]. The function may return a different value over time, if the bounds of the
-     * request change while the request is being processed. If the rectangle cannot be calculated,
-     * e.g. because [childCoordinates] is not attached, return null.
+     *   [childCoordinates]. The function may return a different value over time, if the bounds of
+     *   the request change while the request is being processed. If the rectangle cannot be
+     *   calculated, e.g. because [childCoordinates] is not attached, return null.
      */
     suspend fun bringChildIntoView(childCoordinates: LayoutCoordinates, boundsProvider: () -> Rect?)
 }
diff --git a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/relocation/BringIntoViewRequester.kt b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/relocation/BringIntoViewRequester.kt
index 3bb672c..279b2cd 100644
--- a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/relocation/BringIntoViewRequester.kt
+++ b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/relocation/BringIntoViewRequester.kt
@@ -30,14 +30,14 @@
  * Can be used to send [bringIntoView] requests. Pass it as a parameter to
  * [Modifier.bringIntoViewRequester()][bringIntoViewRequester].
  *
- * For instance, you can call [bringIntoView()][bringIntoView] to make all the
- * scrollable parents scroll so that the specified item is brought into the
- * scroll viewport.
+ * For instance, you can call [bringIntoView()][bringIntoView] to make all the scrollable parents
+ * scroll so that the specified item is brought into the scroll viewport.
  *
- * Note: this API is experimental while we optimise the performance and find the right API shape
- * for it.
+ * Note: this API is experimental while we optimise the performance and find the right API shape for
+ * it.
  *
  * @sample androidx.compose.foundation.samples.BringIntoViewSample
+ *
  * @sample androidx.compose.foundation.samples.BringPartOfComposableIntoViewSample
  */
 @ExperimentalFoundationApi
@@ -50,11 +50,12 @@
      * [CancellationException][kotlinx.coroutines.CancellationException].
      *
      * @param rect The rectangle (In local coordinates) that should be brought into view. If you
-     * don't specify the coordinates, the coordinates of the
-     * [Modifier.bringIntoViewRequester()][bringIntoViewRequester] associated with this
-     * [BringIntoViewRequester] will be used.
+     *   don't specify the coordinates, the coordinates of the
+     *   [Modifier.bringIntoViewRequester()][bringIntoViewRequester] associated with this
+     *   [BringIntoViewRequester] will be used.
      *
      * @sample androidx.compose.foundation.samples.BringIntoViewSample
+     *
      * @sample androidx.compose.foundation.samples.BringPartOfComposableIntoViewSample
      */
     suspend fun bringIntoView(rect: Rect? = null)
@@ -67,13 +68,15 @@
  * scroll to bring this item into view.
  *
  * Here is a sample where a composable is brought into view:
+ *
  * @sample androidx.compose.foundation.samples.BringIntoViewSample
  *
  * Here is a sample where a part of a composable is brought into view:
+ *
  * @sample androidx.compose.foundation.samples.BringPartOfComposableIntoViewSample
  *
- * Note: this API is experimental while we optimise the performance and find the right API shape
- * for it
+ * Note: this API is experimental while we optimise the performance and find the right API shape for
+ * it
  */
 @ExperimentalFoundationApi
 fun BringIntoViewRequester(): BringIntoViewRequester {
@@ -81,45 +84,39 @@
 }
 
 /**
- * Modifier that can be used to send
- * [scrollIntoView][BringIntoViewRequester.bringIntoView] requests.
+ * Modifier that can be used to send [scrollIntoView][BringIntoViewRequester.bringIntoView]
+ * requests.
  *
- * The following example uses a `bringIntoViewRequester` to bring an item into
- * the parent bounds. The example demonstrates how a composable can ask its
- * parents to scroll so that the component using this modifier is brought into
- * the bounds of all its parents.
+ * The following example uses a `bringIntoViewRequester` to bring an item into the parent bounds.
+ * The example demonstrates how a composable can ask its parents to scroll so that the component
+ * using this modifier is brought into the bounds of all its parents.
  *
  * @sample androidx.compose.foundation.samples.BringIntoViewSample
  *
- * @param bringIntoViewRequester An instance of [BringIntoViewRequester]. This
- *     hoisted object can be used to send
- *     [scrollIntoView][BringIntoViewRequester.scrollIntoView] requests to parents
- *     of the current composable.
+ * @param bringIntoViewRequester An instance of [BringIntoViewRequester]. This hoisted object can be
+ *   used to send [scrollIntoView][BringIntoViewRequester.scrollIntoView] requests to parents of the
+ *   current composable.
  *
- * Note: this API is experimental while we optimise the performance and find the right API shape
- * for it
+ * Note: this API is experimental while we optimise the performance and find the right API shape for
+ * it
  */
 @Suppress("ModifierInspectorInfo")
 @ExperimentalFoundationApi
-fun Modifier.bringIntoViewRequester(
-    bringIntoViewRequester: BringIntoViewRequester
-): Modifier = this.then(BringIntoViewRequesterElement(bringIntoViewRequester))
+fun Modifier.bringIntoViewRequester(bringIntoViewRequester: BringIntoViewRequester): Modifier =
+    this.then(BringIntoViewRequesterElement(bringIntoViewRequester))
 
 @ExperimentalFoundationApi
 private class BringIntoViewRequesterImpl : BringIntoViewRequester {
     val modifiers = mutableVectorOf<BringIntoViewRequesterNode>()
 
     override suspend fun bringIntoView(rect: Rect?) {
-        modifiers.forEach {
-            it.scrollIntoView(rect)
-        }
+        modifiers.forEach { it.scrollIntoView(rect) }
     }
 }
 
 @ExperimentalFoundationApi
-private class BringIntoViewRequesterElement(
-    private val requester: BringIntoViewRequester
-) : ModifierNodeElement<BringIntoViewRequesterNode>() {
+private class BringIntoViewRequesterElement(private val requester: BringIntoViewRequester) :
+    ModifierNodeElement<BringIntoViewRequesterNode>() {
     override fun create(): BringIntoViewRequesterNode {
         return BringIntoViewRequesterNode(requester)
     }
@@ -145,13 +142,12 @@
 
 /**
  * A modifier that holds state and modifier implementations for [bringIntoViewRequester]. It has
- * access to the next [BringIntoViewParent] via [findBringIntoViewParent], and uses that parent
- * to respond to requests to [scrollIntoView].
+ * access to the next [BringIntoViewParent] via [findBringIntoViewParent], and uses that parent to
+ * respond to requests to [scrollIntoView].
  */
 @ExperimentalFoundationApi
-internal class BringIntoViewRequesterNode(
-    private var requester: BringIntoViewRequester
-) : Modifier.Node() {
+internal class BringIntoViewRequesterNode(private var requester: BringIntoViewRequester) :
+    Modifier.Node() {
     override val shouldAutoInvalidate: Boolean = false
 
     override fun onAttach() {
diff --git a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/relocation/BringIntoViewResponder.kt b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/relocation/BringIntoViewResponder.kt
index 2e8e4da..619ec6f 100644
--- a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/relocation/BringIntoViewResponder.kt
+++ b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/relocation/BringIntoViewResponder.kt
@@ -40,41 +40,41 @@
  *
  * When a component calls [BringIntoViewRequester.bringIntoView], the nearest
  * [BringIntoViewResponder] is found, which is responsible for, in order:
- *
  * 1. Calculating a rectangle that its parent responder should bring into view by returning it from
  *    [calculateRectForParent].
  * 2. Performing any scroll or other layout adjustments needed to ensure the requested rectangle is
  *    brought into view in [bringChildIntoView].
  *
  * Here is a sample where a composable is brought into view:
+ *
  * @sample androidx.compose.foundation.samples.BringIntoViewSample
  *
  * Here is a sample where a part of a composable is brought into view:
+ *
  * @sample androidx.compose.foundation.samples.BringPartOfComposableIntoViewSample
  *
  * @see BringIntoViewRequester
  *
- * Note: this API is experimental while we optimise the performance and find the right API shape
- * for it
+ * Note: this API is experimental while we optimise the performance and find the right API shape for
+ * it
  */
 @ExperimentalFoundationApi
 interface BringIntoViewResponder {
 
     /**
-     * Return the rectangle in this node that should be brought into view by this node's parent,
-     * in coordinates relative to this node. If this node needs to adjust itself to bring
-     * [localRect] into view, the returned rectangle should be the destination rectangle that
-     * [localRect] will eventually occupy once this node's content is adjusted.
+     * Return the rectangle in this node that should be brought into view by this node's parent, in
+     * coordinates relative to this node. If this node needs to adjust itself to bring [localRect]
+     * into view, the returned rectangle should be the destination rectangle that [localRect] will
+     * eventually occupy once this node's content is adjusted.
      *
      * @param localRect The rectangle that should be brought into view, relative to this node. This
-     * will be the same rectangle passed to [bringChildIntoView].
+     *   will be the same rectangle passed to [bringChildIntoView].
      * @return The rectangle in this node that should be brought into view itself, relative to this
-     * node. If this node needs to scroll to bring [localRect] into view, the returned rectangle
-     * should be the destination rectangle that [localRect] will eventually occupy, once the
-     * scrolling animation is finished.
+     *   node. If this node needs to scroll to bring [localRect] into view, the returned rectangle
+     *   should be the destination rectangle that [localRect] will eventually occupy, once the
+     *   scrolling animation is finished.
      */
-    @ExperimentalFoundationApi
-    fun calculateRectForParent(localRect: Rect): Rect
+    @ExperimentalFoundationApi fun calculateRectForParent(localRect: Rect): Rect
 
     /**
      * Bring this specified rectangle into bounds by making this scrollable parent scroll
@@ -85,42 +85,40 @@
      * one is started while preserving velocity.
      *
      * @param localRect A function returning the rectangle that should be brought into view,
-     * relative to this node. This is the same rectangle that will have been passed to
-     * [calculateRectForParent]. The function may return a different value over time, if the bounds
-     * of the request change while the request is being processed. If the rectangle cannot be
-     * calculated, e.g. because the [LayoutCoordinates] are not attached, return null.
+     *   relative to this node. This is the same rectangle that will have been passed to
+     *   [calculateRectForParent]. The function may return a different value over time, if the
+     *   bounds of the request change while the request is being processed. If the rectangle cannot
+     *   be calculated, e.g. because the [LayoutCoordinates] are not attached, return null.
      */
-    @ExperimentalFoundationApi
-    suspend fun bringChildIntoView(localRect: () -> Rect?)
+    @ExperimentalFoundationApi suspend fun bringChildIntoView(localRect: () -> Rect?)
 }
 
 /**
  * A parent that can respond to [BringIntoViewRequester] requests from its children, and scroll so
- * that the item is visible on screen. See [BringIntoViewResponder] for more details about how
- * this mechanism works.
+ * that the item is visible on screen. See [BringIntoViewResponder] for more details about how this
+ * mechanism works.
  *
  * @sample androidx.compose.foundation.samples.BringIntoViewSample
  *
  * @see BringIntoViewRequester
  *
- * Note: this API is experimental while we optimise the performance and find the right API shape
- * for it
+ * Note: this API is experimental while we optimise the performance and find the right API shape for
+ * it
  */
 @Suppress("ModifierInspectorInfo")
 @ExperimentalFoundationApi
-fun Modifier.bringIntoViewResponder(
-    responder: BringIntoViewResponder
-): Modifier = this.then(BringIntoViewResponderElement(responder))
+fun Modifier.bringIntoViewResponder(responder: BringIntoViewResponder): Modifier =
+    this.then(BringIntoViewResponderElement(responder))
 
 @ExperimentalFoundationApi
-private class BringIntoViewResponderElement(
-    private val responder: BringIntoViewResponder
-) : ModifierNodeElement<BringIntoViewResponderNode>() {
+private class BringIntoViewResponderElement(private val responder: BringIntoViewResponder) :
+    ModifierNodeElement<BringIntoViewResponderNode>() {
     override fun create(): BringIntoViewResponderNode = BringIntoViewResponderNode(responder)
 
     override fun update(node: BringIntoViewResponderNode) {
         node.responder = responder
     }
+
     override fun equals(other: Any?): Boolean {
         return (this === other) ||
             (other is BringIntoViewResponderElement) && (responder == other.responder)
@@ -138,14 +136,13 @@
 
 /**
  * A modifier that holds state and modifier implementations for [bringIntoViewResponder]. It has
- * access to the next [BringIntoViewParent] via [findBringIntoViewParent] and additionally
- * provides itself as the [BringIntoViewParent] for subsequent modifiers. This class is responsible
- * for recursively propagating requests up the responder chain.
+ * access to the next [BringIntoViewParent] via [findBringIntoViewParent] and additionally provides
+ * itself as the [BringIntoViewParent] for subsequent modifiers. This class is responsible for
+ * recursively propagating requests up the responder chain.
  */
 @OptIn(ExperimentalFoundationApi::class)
-internal class BringIntoViewResponderNode(
-    var responder: BringIntoViewResponder
-) : Modifier.Node(), BringIntoViewParent, LayoutAwareModifierNode, TraversableNode {
+internal class BringIntoViewResponderNode(var responder: BringIntoViewResponder) :
+    Modifier.Node(), BringIntoViewParent, LayoutAwareModifierNode, TraversableNode {
 
     override val traverseKey: Any
         get() = TraverseKey
@@ -154,6 +151,7 @@
 
     // TODO(b/324613946) Get rid of this check.
     private var hasBeenPlaced = false
+
     override fun onPlaced(coordinates: LayoutCoordinates) {
         hasBeenPlaced = true
     }
@@ -224,13 +222,8 @@
         ?: defaultBringIntoViewParent()
 }
 
-/**
- * Translates [rect], specified in [sourceCoordinates], into this [LayoutCoordinates].
- */
-private fun LayoutCoordinates.localRectOf(
-    sourceCoordinates: LayoutCoordinates,
-    rect: Rect
-): Rect {
+/** Translates [rect], specified in [sourceCoordinates], into this [LayoutCoordinates]. */
+private fun LayoutCoordinates.localRectOf(sourceCoordinates: LayoutCoordinates, rect: Rect): Rect {
     // Translate the supplied layout coordinates into the coordinate system of this parent.
     val localRect = localBoundingBoxOf(sourceCoordinates, clipBounds = false)
 
diff --git a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/relocation/ScrollIntoViewRequester.kt b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/relocation/ScrollIntoViewRequester.kt
index 708d78b..c8e4492 100644
--- a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/relocation/ScrollIntoViewRequester.kt
+++ b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/relocation/ScrollIntoViewRequester.kt
@@ -28,16 +28,17 @@
 /**
  * Bring this node into bounds by making all the scrollable parents scroll appropriately.
  *
- * This method will not return until this request is satisfied or a newer request interrupts it.
- * If this call is interrupted by a newer call, this method will throw a
+ * This method will not return until this request is satisfied or a newer request interrupts it. If
+ * this call is interrupted by a newer call, this method will throw a
  * [CancellationException][kotlinx.coroutines.CancellationException].
  *
- * @param rect The rectangle (In local coordinates) that should be brought into view. If you
- * don't specify the coordinates, the coordinates of the
- * [Modifier.bringIntoViewRequester()][bringIntoViewRequester] associated with this
- * [BringIntoViewRequester] will be used.
+ * @param rect The rectangle (In local coordinates) that should be brought into view. If you don't
+ *   specify the coordinates, the coordinates of the
+ *   [Modifier.bringIntoViewRequester()][bringIntoViewRequester] associated with this
+ *   [BringIntoViewRequester] will be used.
  *
  * @sample androidx.compose.foundation.samples.BringIntoViewSample
+ *
  * @sample androidx.compose.foundation.samples.BringPartOfComposableIntoViewSample
  */
 // TODO(b/333421581) Make public.
diff --git a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/selection/Selectable.kt b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/selection/Selectable.kt
index 70d94a9..c1e3eae 100644
--- a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/selection/Selectable.kt
+++ b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/selection/Selectable.kt
@@ -34,11 +34,10 @@
 import androidx.compose.ui.semantics.selected
 
 /**
- * Configure component to be selectable, usually as a part of a mutually exclusive group, where
- * only one item can be selected at any point in time.
- * A typical example of mutually exclusive set is a RadioGroup or a row of Tabs. To ensure
- * correct accessibility behavior, make sure to pass [Modifier.selectableGroup] modifier into the
- * RadioGroup or the row.
+ * Configure component to be selectable, usually as a part of a mutually exclusive group, where only
+ * one item can be selected at any point in time. A typical example of mutually exclusive set is a
+ * RadioGroup or a row of Tabs. To ensure correct accessibility behavior, make sure to pass
+ * [Modifier.selectableGroup] modifier into the RadioGroup or the row.
  *
  * If you want to make an item support on/off capabilities without being part of a set, consider
  * using [Modifier.toggleable]
@@ -54,10 +53,10 @@
  * @sample androidx.compose.foundation.samples.SelectableSample
  *
  * @param selected whether or not this item is selected in a mutually exclusion set
- * @param enabled whether or not this [selectable] will handle input events
- * and appear enabled from a semantics perspective
- * @param role the type of user interface element. Accessibility services might use this
- * to describe the element or do customizations
+ * @param enabled whether or not this [selectable] will handle input events and appear enabled from
+ *   a semantics perspective
+ * @param role the type of user interface element. Accessibility services might use this to describe
+ *   the element or do customizations
  * @param onClick callback to invoke when this item is clicked
  */
 fun Modifier.selectable(
@@ -65,52 +64,54 @@
     enabled: Boolean = true,
     role: Role? = null,
     onClick: () -> Unit
-) = composed(
-    inspectorInfo = debugInspectorInfo {
-        name = "selectable"
-        properties["selected"] = selected
-        properties["enabled"] = enabled
-        properties["role"] = role
-        properties["onClick"] = onClick
+) =
+    composed(
+        inspectorInfo =
+            debugInspectorInfo {
+                name = "selectable"
+                properties["selected"] = selected
+                properties["enabled"] = enabled
+                properties["role"] = role
+                properties["onClick"] = onClick
+            }
+    ) {
+        val localIndication = LocalIndication.current
+        val interactionSource =
+            if (localIndication is IndicationNodeFactory) {
+                // We can fast path here as it will be created inside clickable lazily
+                null
+            } else {
+                // We need an interaction source to pass between the indication modifier and
+                // clickable, so
+                // by creating here we avoid another composed down the line
+                remember { MutableInteractionSource() }
+            }
+        Modifier.selectable(
+            selected = selected,
+            interactionSource = interactionSource,
+            indication = localIndication,
+            enabled = enabled,
+            role = role,
+            onClick = onClick
+        )
     }
-) {
-    val localIndication = LocalIndication.current
-    val interactionSource = if (localIndication is IndicationNodeFactory) {
-        // We can fast path here as it will be created inside clickable lazily
-        null
-    } else {
-        // We need an interaction source to pass between the indication modifier and clickable, so
-        // by creating here we avoid another composed down the line
-        remember { MutableInteractionSource() }
-    }
-    Modifier.selectable(
-        selected = selected,
-        interactionSource = interactionSource,
-        indication = localIndication,
-        enabled = enabled,
-        role = role,
-        onClick = onClick
-    )
-}
 
 /**
- * Configure component to be selectable, usually as a part of a mutually exclusive group, where
- * only one item can be selected at any point in time.
- * A typical example of mutually exclusive set is a RadioGroup or a row of Tabs. To ensure
- * correct accessibility behavior, make sure to pass [Modifier.selectableGroup] modifier into the
- * RadioGroup or the row.
+ * Configure component to be selectable, usually as a part of a mutually exclusive group, where only
+ * one item can be selected at any point in time. A typical example of mutually exclusive set is a
+ * RadioGroup or a row of Tabs. To ensure correct accessibility behavior, make sure to pass
+ * [Modifier.selectableGroup] modifier into the RadioGroup or the row.
  *
  * If you want to make an item support on/off capabilities without being part of a set, consider
  * using [Modifier.toggleable]
  *
- * If [interactionSource] is `null`, and [indication] is an [IndicationNodeFactory], an
- * internal [MutableInteractionSource] will be lazily created along with the [indication] only when
- * needed. This reduces the performance cost of selectable during composition, as creating the
- * [indication] can be delayed until there is an incoming
- * [androidx.compose.foundation.interaction.Interaction]. If you are only passing a remembered
- * [MutableInteractionSource] and you are never using it outside of selectable, it is recommended to
- * instead provide `null` to enable lazy creation. If you need [indication] to be created eagerly,
- * provide a remembered [MutableInteractionSource].
+ * If [interactionSource] is `null`, and [indication] is an [IndicationNodeFactory], an internal
+ * [MutableInteractionSource] will be lazily created along with the [indication] only when needed.
+ * This reduces the performance cost of selectable during composition, as creating the [indication]
+ * can be delayed until there is an incoming [androidx.compose.foundation.interaction.Interaction].
+ * If you are only passing a remembered [MutableInteractionSource] and you are never using it
+ * outside of selectable, it is recommended to instead provide `null` to enable lazy creation. If
+ * you need [indication] to be created eagerly, provide a remembered [MutableInteractionSource].
  *
  * If [indication] is _not_ an [IndicationNodeFactory], and instead implements the deprecated
  * [Indication.rememberUpdatedInstance] method, you should explicitly pass a remembered
@@ -121,15 +122,15 @@
  *
  * @param selected whether or not this item is selected in a mutually exclusion set
  * @param interactionSource [MutableInteractionSource] that will be used to dispatch
- * PressInteraction.Press when this selectable is pressed. If `null`, an internal
- * [MutableInteractionSource] will be created if needed.
- * @param indication indication to be shown when the modified element is pressed. By default,
- * the indication from [LocalIndication] will be used. Set to `null` to show no indication, or
- * current value from [LocalIndication] to show theme default
- * @param enabled whether or not this [selectable] will handle input events
- * and appear enabled from a semantics perspective
- * @param role the type of user interface element. Accessibility services might use this
- * to describe the element or do customizations
+ *   PressInteraction.Press when this selectable is pressed. If `null`, an internal
+ *   [MutableInteractionSource] will be created if needed.
+ * @param indication indication to be shown when the modified element is pressed. By default, the
+ *   indication from [LocalIndication] will be used. Set to `null` to show no indication, or current
+ *   value from [LocalIndication] to show theme default
+ * @param enabled whether or not this [selectable] will handle input events and appear enabled from
+ *   a semantics perspective
+ * @param role the type of user interface element. Accessibility services might use this to describe
+ *   the element or do customizations
  * @param onClick callback to invoke when this item is clicked
  */
 fun Modifier.selectable(
@@ -139,19 +140,20 @@
     enabled: Boolean = true,
     role: Role? = null,
     onClick: () -> Unit
-) = clickableWithIndicationIfNeeded(
-    interactionSource = interactionSource,
-    indication = indication
-) { intSource, indicationNodeFactory ->
-    SelectableElement(
-        selected = selected,
-        interactionSource = intSource,
-        indicationNodeFactory = indicationNodeFactory,
-        enabled = enabled,
-        role = role,
-        onClick = onClick
-    )
-}
+) =
+    clickableWithIndicationIfNeeded(
+        interactionSource = interactionSource,
+        indication = indication
+    ) { intSource, indicationNodeFactory ->
+        SelectableElement(
+            selected = selected,
+            interactionSource = intSource,
+            indicationNodeFactory = indicationNodeFactory,
+            enabled = enabled,
+            role = role,
+            onClick = onClick
+        )
+    }
 
 private class SelectableElement(
     private val selected: Boolean,
@@ -161,14 +163,15 @@
     private val role: Role?,
     private val onClick: () -> Unit
 ) : ModifierNodeElement<SelectableNode>() {
-    override fun create() = SelectableNode(
-        selected = selected,
-        interactionSource = interactionSource,
-        indicationNodeFactory = indicationNodeFactory,
-        enabled = enabled,
-        role = role,
-        onClick = onClick
-    )
+    override fun create() =
+        SelectableNode(
+            selected = selected,
+            interactionSource = interactionSource,
+            indicationNodeFactory = indicationNodeFactory,
+            enabled = enabled,
+            role = role,
+            onClick = onClick
+        )
 
     override fun update(node: SelectableNode) {
         node.update(
@@ -226,14 +229,15 @@
     enabled: Boolean,
     role: Role?,
     onClick: () -> Unit
-) : ClickableNode(
-    interactionSource = interactionSource,
-    indicationNodeFactory = indicationNodeFactory,
-    enabled = enabled,
-    onClickLabel = null,
-    role = role,
-    onClick = onClick
-) {
+) :
+    ClickableNode(
+        interactionSource = interactionSource,
+        indicationNodeFactory = indicationNodeFactory,
+        enabled = enabled,
+        onClickLabel = null,
+        role = role,
+        onClick = onClick
+    ) {
     fun update(
         selected: Boolean,
         interactionSource: MutableInteractionSource?,
diff --git a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/selection/SelectableGroup.kt b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/selection/SelectableGroup.kt
index b6ab655..e544bfa 100644
--- a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/selection/SelectableGroup.kt
+++ b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/selection/SelectableGroup.kt
@@ -22,12 +22,9 @@
 import androidx.compose.ui.semantics.semantics
 
 /**
- * Use this modifier to group a list of [selectable] items
- * like Tabs or RadioButtons together for accessibility purpose.
+ * Use this modifier to group a list of [selectable] items like Tabs or RadioButtons together for
+ * accessibility purpose.
  *
  * @see selectableGroup
  */
-@Stable
-fun Modifier.selectableGroup() = this.semantics {
-    selectableGroup()
-}
+@Stable fun Modifier.selectableGroup() = this.semantics { selectableGroup() }
diff --git a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/selection/Toggleable.kt b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/selection/Toggleable.kt
index bcaa2ed..2edfc83 100644
--- a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/selection/Toggleable.kt
+++ b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/selection/Toggleable.kt
@@ -48,60 +48,62 @@
  *
  * @sample androidx.compose.foundation.samples.ToggleableSample
  *
- * @see [Modifier.triStateToggleable] if you require support for an indeterminate state.
- *
  * @param value whether Toggleable is on or off
- * @param enabled whether or not this [toggleable] will handle input events and appear
- * enabled for semantics purposes
- * @param role the type of user interface element. Accessibility services might use this
- * to describe the element or do customizations
- * @param onValueChange callback to be invoked when toggleable is clicked,
- * therefore the change of the state in requested.
+ * @param enabled whether or not this [toggleable] will handle input events and appear enabled for
+ *   semantics purposes
+ * @param role the type of user interface element. Accessibility services might use this to describe
+ *   the element or do customizations
+ * @param onValueChange callback to be invoked when toggleable is clicked, therefore the change of
+ *   the state in requested.
+ * @see [Modifier.triStateToggleable] if you require support for an indeterminate state.
  */
 fun Modifier.toggleable(
     value: Boolean,
     enabled: Boolean = true,
     role: Role? = null,
     onValueChange: (Boolean) -> Unit
-) = composed(
-    inspectorInfo = debugInspectorInfo {
-        name = "toggleable"
-        properties["value"] = value
-        properties["enabled"] = enabled
-        properties["role"] = role
-        properties["onValueChange"] = onValueChange
+) =
+    composed(
+        inspectorInfo =
+            debugInspectorInfo {
+                name = "toggleable"
+                properties["value"] = value
+                properties["enabled"] = enabled
+                properties["role"] = role
+                properties["onValueChange"] = onValueChange
+            }
+    ) {
+        val localIndication = LocalIndication.current
+        val interactionSource =
+            if (localIndication is IndicationNodeFactory) {
+                // We can fast path here as it will be created inside clickable lazily
+                null
+            } else {
+                // We need an interaction source to pass between the indication modifier and
+                // clickable, so
+                // by creating here we avoid another composed down the line
+                remember { MutableInteractionSource() }
+            }
+        Modifier.toggleable(
+            value = value,
+            interactionSource = interactionSource,
+            indication = localIndication,
+            enabled = enabled,
+            role = role,
+            onValueChange = onValueChange
+        )
     }
-) {
-    val localIndication = LocalIndication.current
-    val interactionSource = if (localIndication is IndicationNodeFactory) {
-        // We can fast path here as it will be created inside clickable lazily
-        null
-    } else {
-        // We need an interaction source to pass between the indication modifier and clickable, so
-        // by creating here we avoid another composed down the line
-        remember { MutableInteractionSource() }
-    }
-    Modifier.toggleable(
-        value = value,
-        interactionSource = interactionSource,
-        indication = localIndication,
-        enabled = enabled,
-        role = role,
-        onValueChange = onValueChange
-    )
-}
 
 /**
  * Configure component to make it toggleable via input and accessibility events.
  *
- * If [interactionSource] is `null`, and [indication] is an [IndicationNodeFactory], an
- * internal [MutableInteractionSource] will be lazily created along with the [indication] only when
- * needed. This reduces the performance cost of toggleable during composition, as creating the
- * [indication] can be delayed until there is an incoming
- * [androidx.compose.foundation.interaction.Interaction]. If you are only passing a remembered
- * [MutableInteractionSource] and you are never using it outside of toggleable, it is recommended to
- * instead provide `null` to enable lazy creation. If you need [indication] to be created eagerly,
- * provide a remembered [MutableInteractionSource].
+ * If [interactionSource] is `null`, and [indication] is an [IndicationNodeFactory], an internal
+ * [MutableInteractionSource] will be lazily created along with the [indication] only when needed.
+ * This reduces the performance cost of toggleable during composition, as creating the [indication]
+ * can be delayed until there is an incoming [androidx.compose.foundation.interaction.Interaction].
+ * If you are only passing a remembered [MutableInteractionSource] and you are never using it
+ * outside of toggleable, it is recommended to instead provide `null` to enable lazy creation. If
+ * you need [indication] to be created eagerly, provide a remembered [MutableInteractionSource].
  *
  * If [indication] is _not_ an [IndicationNodeFactory], and instead implements the deprecated
  * [Indication.rememberUpdatedInstance] method, you should explicitly pass a remembered
@@ -110,21 +112,20 @@
  *
  * @sample androidx.compose.foundation.samples.ToggleableSample
  *
- * @see [Modifier.triStateToggleable] if you require support for an indeterminate state.
- *
  * @param value whether Toggleable is on or off
  * @param interactionSource [MutableInteractionSource] that will be used to dispatch
- * [PressInteraction.Press] when this toggleable is pressed. If `null`, an internal
- * [MutableInteractionSource] will be created if needed.
- * @param indication indication to be shown when modified element is pressed. Be default,
- * indication from [LocalIndication] will be used. Pass `null` to show no indication, or
- * current value from [LocalIndication] to show theme default
- * @param enabled whether or not this [toggleable] will handle input events and appear
- * enabled for semantics purposes
- * @param role the type of user interface element. Accessibility services might use this
- * to describe the element or do customizations
- * @param onValueChange callback to be invoked when toggleable is clicked,
- * therefore the change of the state in requested.
+ *   [PressInteraction.Press] when this toggleable is pressed. If `null`, an internal
+ *   [MutableInteractionSource] will be created if needed.
+ * @param indication indication to be shown when modified element is pressed. Be default, indication
+ *   from [LocalIndication] will be used. Pass `null` to show no indication, or current value from
+ *   [LocalIndication] to show theme default
+ * @param enabled whether or not this [toggleable] will handle input events and appear enabled for
+ *   semantics purposes
+ * @param role the type of user interface element. Accessibility services might use this to describe
+ *   the element or do customizations
+ * @param onValueChange callback to be invoked when toggleable is clicked, therefore the change of
+ *   the state in requested.
+ * @see [Modifier.triStateToggleable] if you require support for an indeterminate state.
  */
 fun Modifier.toggleable(
     value: Boolean,
@@ -133,19 +134,20 @@
     enabled: Boolean = true,
     role: Role? = null,
     onValueChange: (Boolean) -> Unit
-) = clickableWithIndicationIfNeeded(
-    interactionSource = interactionSource,
-    indication = indication
-) { intSource, indicationNodeFactory ->
-    ToggleableElement(
-        value = value,
-        interactionSource = intSource,
-        indicationNodeFactory = indicationNodeFactory,
-        enabled = enabled,
-        role = role,
-        onValueChange = onValueChange
-    )
-}
+) =
+    clickableWithIndicationIfNeeded(
+        interactionSource = interactionSource,
+        indication = indication
+    ) { intSource, indicationNodeFactory ->
+        ToggleableElement(
+            value = value,
+            interactionSource = intSource,
+            indicationNodeFactory = indicationNodeFactory,
+            enabled = enabled,
+            role = role,
+            onValueChange = onValueChange
+        )
+    }
 
 private class ToggleableElement(
     private val value: Boolean,
@@ -155,14 +157,15 @@
     private val role: Role?,
     private val onValueChange: (Boolean) -> Unit
 ) : ModifierNodeElement<ToggleableNode>() {
-    override fun create() = ToggleableNode(
-        value = value,
-        interactionSource = interactionSource,
-        indicationNodeFactory = indicationNodeFactory,
-        enabled = enabled,
-        role = role,
-        onValueChange = onValueChange
-    )
+    override fun create() =
+        ToggleableNode(
+            value = value,
+            interactionSource = interactionSource,
+            indicationNodeFactory = indicationNodeFactory,
+            enabled = enabled,
+            role = role,
+            onValueChange = onValueChange
+        )
 
     override fun update(node: ToggleableNode) {
         node.update(
@@ -220,14 +223,15 @@
     enabled: Boolean,
     role: Role?,
     private var onValueChange: (Boolean) -> Unit
-) : ClickableNode(
-    interactionSource = interactionSource,
-    indicationNodeFactory = indicationNodeFactory,
-    enabled = enabled,
-    onClickLabel = null,
-    role = role,
-    onClick = { onValueChange(!value) }
-) {
+) :
+    ClickableNode(
+        interactionSource = interactionSource,
+        indicationNodeFactory = indicationNodeFactory,
+        enabled = enabled,
+        onClickLabel = null,
+        role = role,
+        onClick = { onValueChange(!value) }
+    ) {
     // the onClick passed in the constructor captures onValueChanged and value as passed to the
     // constructor, so we need to define a new lambda that references the properties. When these
     // change, update will be called, which will set this as the new onClick, so it doesn't matter
@@ -265,8 +269,8 @@
 }
 
 /**
- * Configure component to make it toggleable via input and accessibility events with three
- * states: On, Off and Indeterminate.
+ * Configure component to make it toggleable via input and accessibility events with three states:
+ * On, Off and Indeterminate.
  *
  * TriStateToggleable should be used when there are dependent Toggleables associated to this
  * component and those can have different values.
@@ -281,59 +285,62 @@
  *
  * @sample androidx.compose.foundation.samples.TriStateToggleableSample
  *
- * @see [Modifier.toggleable] if you want to support only two states: on and off
- *
  * @param state current value for the component
- * @param enabled whether or not this [triStateToggleable] will handle input events and
- * appear enabled for semantics purposes
- * @param role the type of user interface element. Accessibility services might use this
- * to describe the element or do customizations
+ * @param enabled whether or not this [triStateToggleable] will handle input events and appear
+ *   enabled for semantics purposes
+ * @param role the type of user interface element. Accessibility services might use this to describe
+ *   the element or do customizations
  * @param onClick will be called when user clicks the toggleable.
+ * @see [Modifier.toggleable] if you want to support only two states: on and off
  */
 fun Modifier.triStateToggleable(
     state: ToggleableState,
     enabled: Boolean = true,
     role: Role? = null,
     onClick: () -> Unit
-) = composed(
-    inspectorInfo = debugInspectorInfo {
-        name = "triStateToggleable"
-        properties["state"] = state
-        properties["enabled"] = enabled
-        properties["role"] = role
-        properties["onClick"] = onClick
+) =
+    composed(
+        inspectorInfo =
+            debugInspectorInfo {
+                name = "triStateToggleable"
+                properties["state"] = state
+                properties["enabled"] = enabled
+                properties["role"] = role
+                properties["onClick"] = onClick
+            }
+    ) {
+        val localIndication = LocalIndication.current
+        val interactionSource =
+            if (localIndication is IndicationNodeFactory) {
+                // We can fast path here as it will be created inside clickable lazily
+                null
+            } else {
+                // We need an interaction source to pass between the indication modifier and
+                // clickable, so
+                // by creating here we avoid another composed down the line
+                remember { MutableInteractionSource() }
+            }
+        Modifier.triStateToggleable(
+            state = state,
+            interactionSource = interactionSource,
+            indication = localIndication,
+            enabled = enabled,
+            role = role,
+            onClick = onClick
+        )
     }
-) {
-    val localIndication = LocalIndication.current
-    val interactionSource = if (localIndication is IndicationNodeFactory) {
-        // We can fast path here as it will be created inside clickable lazily
-        null
-    } else {
-        // We need an interaction source to pass between the indication modifier and clickable, so
-        // by creating here we avoid another composed down the line
-        remember { MutableInteractionSource() }
-    }
-    Modifier.triStateToggleable(
-        state = state,
-        interactionSource = interactionSource,
-        indication = localIndication,
-        enabled = enabled,
-        role = role,
-        onClick = onClick
-    )
-}
 
 /**
- * Configure component to make it toggleable via input and accessibility events with three
- * states: On, Off and Indeterminate.
+ * Configure component to make it toggleable via input and accessibility events with three states:
+ * On, Off and Indeterminate.
  *
  * TriStateToggleable should be used when there are dependent Toggleables associated to this
  * component and those can have different values.
  *
- * If [interactionSource] is `null`, and [indication] is an [IndicationNodeFactory], an
- * internal [MutableInteractionSource] will be lazily created along with the [indication] only when
- * needed. This reduces the performance cost of triStateToggleable during composition, as creating
- * the [indication] can be delayed until there is an incoming
+ * If [interactionSource] is `null`, and [indication] is an [IndicationNodeFactory], an internal
+ * [MutableInteractionSource] will be lazily created along with the [indication] only when needed.
+ * This reduces the performance cost of triStateToggleable during composition, as creating the
+ * [indication] can be delayed until there is an incoming
  * [androidx.compose.foundation.interaction.Interaction]. If you are only passing a remembered
  * [MutableInteractionSource] and you are never using it outside of triStateToggleable, it is
  * recommended to instead provide `null` to enable lazy creation. If you need [indication] to be
@@ -346,20 +353,19 @@
  *
  * @sample androidx.compose.foundation.samples.TriStateToggleableSample
  *
- * @see [Modifier.toggleable] if you want to support only two states: on and off
- *
  * @param state current value for the component
  * @param interactionSource [MutableInteractionSource] that will be used to dispatch
- * [PressInteraction.Press] when this triStateToggleable is pressed. If `null`, an internal
- * [MutableInteractionSource] will be created if needed.
- * @param indication indication to be shown when modified element is pressed. Be default,
- * indication from [LocalIndication] will be used. Pass `null` to show no indication, or
- * current value from [LocalIndication] to show theme default
- * @param enabled whether or not this [triStateToggleable] will handle input events and
- * appear enabled for semantics purposes
- * @param role the type of user interface element. Accessibility services might use this
- * to describe the element or do customizations
+ *   [PressInteraction.Press] when this triStateToggleable is pressed. If `null`, an internal
+ *   [MutableInteractionSource] will be created if needed.
+ * @param indication indication to be shown when modified element is pressed. Be default, indication
+ *   from [LocalIndication] will be used. Pass `null` to show no indication, or current value from
+ *   [LocalIndication] to show theme default
+ * @param enabled whether or not this [triStateToggleable] will handle input events and appear
+ *   enabled for semantics purposes
+ * @param role the type of user interface element. Accessibility services might use this to describe
+ *   the element or do customizations
  * @param onClick will be called when user clicks the toggleable.
+ * @see [Modifier.toggleable] if you want to support only two states: on and off
  */
 fun Modifier.triStateToggleable(
     state: ToggleableState,
@@ -368,19 +374,20 @@
     enabled: Boolean = true,
     role: Role? = null,
     onClick: () -> Unit
-) = clickableWithIndicationIfNeeded(
-    interactionSource = interactionSource,
-    indication = indication
-) { intSource, indicationNodeFactory ->
-    TriStateToggleableElement(
-        state = state,
-        interactionSource = intSource,
-        indicationNodeFactory = indicationNodeFactory,
-        enabled = enabled,
-        role = role,
-        onClick = onClick
-    )
-}
+) =
+    clickableWithIndicationIfNeeded(
+        interactionSource = interactionSource,
+        indication = indication
+    ) { intSource, indicationNodeFactory ->
+        TriStateToggleableElement(
+            state = state,
+            interactionSource = intSource,
+            indicationNodeFactory = indicationNodeFactory,
+            enabled = enabled,
+            role = role,
+            onClick = onClick
+        )
+    }
 
 private class TriStateToggleableElement(
     private val state: ToggleableState,
@@ -390,14 +397,15 @@
     private val role: Role?,
     private val onClick: () -> Unit
 ) : ModifierNodeElement<TriStateToggleableNode>() {
-    override fun create() = TriStateToggleableNode(
-        state = state,
-        interactionSource = interactionSource,
-        indicationNodeFactory = indicationNodeFactory,
-        enabled = enabled,
-        role = role,
-        onClick = onClick
-    )
+    override fun create() =
+        TriStateToggleableNode(
+            state = state,
+            interactionSource = interactionSource,
+            indicationNodeFactory = indicationNodeFactory,
+            enabled = enabled,
+            role = role,
+            onClick = onClick
+        )
 
     override fun update(node: TriStateToggleableNode) {
         node.update(
@@ -456,14 +464,15 @@
     enabled: Boolean,
     role: Role?,
     onClick: () -> Unit
-) : ClickableNode(
-    interactionSource = interactionSource,
-    indicationNodeFactory = indicationNodeFactory,
-    enabled = enabled,
-    onClickLabel = null,
-    role = role,
-    onClick = onClick
-) {
+) :
+    ClickableNode(
+        interactionSource = interactionSource,
+        indicationNodeFactory = indicationNodeFactory,
+        enabled = enabled,
+        onClickLabel = null,
+        role = role,
+        onClick = onClick
+    ) {
     fun update(
         state: ToggleableState,
         interactionSource: MutableInteractionSource?,
diff --git a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/shape/AbsoluteCutCornerShape.kt b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/shape/AbsoluteCutCornerShape.kt
index 22e5952..167650b4 100644
--- a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/shape/AbsoluteCutCornerShape.kt
+++ b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/shape/AbsoluteCutCornerShape.kt
@@ -26,8 +26,8 @@
 import androidx.compose.ui.unit.dp
 
 /**
- * A shape describing the rectangle with cut corners.
- * Corner size is representing the cut length - the size of both legs of the cut's right triangle.
+ * A shape describing the rectangle with cut corners. Corner size is representing the cut length -
+ * the size of both legs of the cut's right triangle.
  *
  * This shape will not automatically mirror the corner sizes in [LayoutDirection.Rtl], use
  * [CutCornerShape] for the layout direction aware version of this shape.
@@ -42,12 +42,13 @@
     topRight: CornerSize,
     bottomRight: CornerSize,
     bottomLeft: CornerSize
-) : CornerBasedShape(
-    topStart = topLeft,
-    topEnd = topRight,
-    bottomEnd = bottomRight,
-    bottomStart = bottomLeft
-) {
+) :
+    CornerBasedShape(
+        topStart = topLeft,
+        topEnd = topRight,
+        bottomEnd = bottomRight,
+        bottomStart = bottomLeft
+    ) {
 
     override fun createOutline(
         size: Size,
@@ -56,37 +57,40 @@
         bottomEnd: Float,
         bottomStart: Float,
         layoutDirection: LayoutDirection
-    ) = if (topStart + topEnd + bottomStart + bottomEnd == 0.0f) {
-        Outline.Rectangle(size.toRect())
-    } else Outline.Generic(
-        Path().apply {
-            var cornerSize = topStart
-            moveTo(0f, cornerSize)
-            lineTo(cornerSize, 0f)
-            cornerSize = topEnd
-            lineTo(size.width - cornerSize, 0f)
-            lineTo(size.width, cornerSize)
-            cornerSize = bottomEnd
-            lineTo(size.width, size.height - cornerSize)
-            lineTo(size.width - cornerSize, size.height)
-            cornerSize = bottomStart
-            lineTo(cornerSize, size.height)
-            lineTo(0f, size.height - cornerSize)
-            close()
-        }
-    )
+    ) =
+        if (topStart + topEnd + bottomStart + bottomEnd == 0.0f) {
+            Outline.Rectangle(size.toRect())
+        } else
+            Outline.Generic(
+                Path().apply {
+                    var cornerSize = topStart
+                    moveTo(0f, cornerSize)
+                    lineTo(cornerSize, 0f)
+                    cornerSize = topEnd
+                    lineTo(size.width - cornerSize, 0f)
+                    lineTo(size.width, cornerSize)
+                    cornerSize = bottomEnd
+                    lineTo(size.width, size.height - cornerSize)
+                    lineTo(size.width - cornerSize, size.height)
+                    cornerSize = bottomStart
+                    lineTo(cornerSize, size.height)
+                    lineTo(0f, size.height - cornerSize)
+                    close()
+                }
+            )
 
     override fun copy(
         topStart: CornerSize,
         topEnd: CornerSize,
         bottomEnd: CornerSize,
         bottomStart: CornerSize
-    ) = AbsoluteCutCornerShape(
-        topLeft = topStart,
-        topRight = topEnd,
-        bottomRight = bottomEnd,
-        bottomLeft = bottomStart
-    )
+    ) =
+        AbsoluteCutCornerShape(
+            topLeft = topStart,
+            topRight = topEnd,
+            bottomRight = bottomEnd,
+            bottomLeft = bottomStart
+        )
 
     override fun toString(): String {
         return "AbsoluteCutCornerShape(topLeft = $topStart, topRight = $topEnd, bottomRight = " +
@@ -116,6 +120,7 @@
 
 /**
  * Creates [AbsoluteCutCornerShape] with the same size applied for all four corners.
+ *
  * @param corner [CornerSize] to apply.
  */
 fun AbsoluteCutCornerShape(corner: CornerSize) =
@@ -123,76 +128,74 @@
 
 /**
  * Creates [AbsoluteCutCornerShape] with the same size applied for all four corners.
+ *
  * @param size Size in [Dp] to apply.
  */
 fun AbsoluteCutCornerShape(size: Dp) = AbsoluteCutCornerShape(CornerSize(size))
 
 /**
  * Creates [AbsoluteCutCornerShape] with the same size applied for all four corners.
+ *
  * @param size Size in pixels to apply.
  */
 fun AbsoluteCutCornerShape(size: Float) = AbsoluteCutCornerShape(CornerSize(size))
 
 /**
  * Creates [AbsoluteCutCornerShape] with the same size applied for all four corners.
+ *
  * @param percent Size in percents to apply.
  */
 fun AbsoluteCutCornerShape(percent: Int) = AbsoluteCutCornerShape(CornerSize(percent))
 
-/**
- * Creates [AbsoluteCutCornerShape] with sizes defined in [Dp].
- */
+/** Creates [AbsoluteCutCornerShape] with sizes defined in [Dp]. */
 fun AbsoluteCutCornerShape(
     topLeft: Dp = 0.dp,
     topRight: Dp = 0.dp,
     bottomRight: Dp = 0.dp,
     bottomLeft: Dp = 0.dp
-) = AbsoluteCutCornerShape(
-    topLeft = CornerSize(topLeft),
-    topRight = CornerSize(topRight),
-    bottomRight = CornerSize(bottomRight),
-    bottomLeft = CornerSize(bottomLeft)
-)
+) =
+    AbsoluteCutCornerShape(
+        topLeft = CornerSize(topLeft),
+        topRight = CornerSize(topRight),
+        bottomRight = CornerSize(bottomRight),
+        bottomLeft = CornerSize(bottomLeft)
+    )
 
-/**
- * Creates [AbsoluteCutCornerShape] with sizes defined in float.
- */
+/** Creates [AbsoluteCutCornerShape] with sizes defined in float. */
 fun AbsoluteCutCornerShape(
     topLeft: Float = 0.0f,
     topRight: Float = 0.0f,
     bottomRight: Float = 0.0f,
     bottomLeft: Float = 0.0f
-) = AbsoluteCutCornerShape(
-    topLeft = CornerSize(topLeft),
-    topRight = CornerSize(topRight),
-    bottomRight = CornerSize(bottomRight),
-    bottomLeft = CornerSize(bottomLeft)
-)
+) =
+    AbsoluteCutCornerShape(
+        topLeft = CornerSize(topLeft),
+        topRight = CornerSize(topRight),
+        bottomRight = CornerSize(bottomRight),
+        bottomLeft = CornerSize(bottomLeft)
+    )
 
 /**
  * Creates [AbsoluteCutCornerShape] with sizes defined in percents of the shape's smaller side.
  *
  * @param topLeftPercent The top left corner clip size as a percentage of the smaller side, with a
- * range of 0 - 100.
+ *   range of 0 - 100.
  * @param topRightPercent The top right corner clip size as a percentage of the smaller side, with a
- * range of 0 - 100.
+ *   range of 0 - 100.
  * @param bottomRightPercent The bottom right clip size radius as a percentage of the smaller side,
- * with a range of 0 - 100.
+ *   with a range of 0 - 100.
  * @param bottomLeftPercent The bottom left clip size radius as a percentage of the smaller side,
- * with a range of 0 - 100.
+ *   with a range of 0 - 100.
  */
 fun AbsoluteCutCornerShape(
-    @IntRange(from = 0, to = 100)
-    topLeftPercent: Int = 0,
-    @IntRange(from = 0, to = 100)
-    topRightPercent: Int = 0,
-    @IntRange(from = 0, to = 100)
-    bottomRightPercent: Int = 0,
-    @IntRange(from = 0, to = 100)
-    bottomLeftPercent: Int = 0
-) = AbsoluteCutCornerShape(
-    topLeft = CornerSize(topLeftPercent),
-    topRight = CornerSize(topRightPercent),
-    bottomRight = CornerSize(bottomRightPercent),
-    bottomLeft = CornerSize(bottomLeftPercent)
-)
+    @IntRange(from = 0, to = 100) topLeftPercent: Int = 0,
+    @IntRange(from = 0, to = 100) topRightPercent: Int = 0,
+    @IntRange(from = 0, to = 100) bottomRightPercent: Int = 0,
+    @IntRange(from = 0, to = 100) bottomLeftPercent: Int = 0
+) =
+    AbsoluteCutCornerShape(
+        topLeft = CornerSize(topLeftPercent),
+        topRight = CornerSize(topRightPercent),
+        bottomRight = CornerSize(bottomRightPercent),
+        bottomLeft = CornerSize(bottomLeftPercent)
+    )
diff --git a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/shape/AbsoluteRoundedCornerShape.kt b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/shape/AbsoluteRoundedCornerShape.kt
index bf5fa04..627745c 100644
--- a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/shape/AbsoluteRoundedCornerShape.kt
+++ b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/shape/AbsoluteRoundedCornerShape.kt
@@ -42,12 +42,13 @@
     topRight: CornerSize,
     bottomRight: CornerSize,
     bottomLeft: CornerSize
-) : CornerBasedShape(
-    topStart = topLeft,
-    topEnd = topRight,
-    bottomEnd = bottomRight,
-    bottomStart = bottomLeft
-) {
+) :
+    CornerBasedShape(
+        topStart = topLeft,
+        topEnd = topRight,
+        bottomEnd = bottomRight,
+        bottomStart = bottomLeft
+    ) {
 
     override fun createOutline(
         size: Size,
@@ -56,31 +57,33 @@
         bottomEnd: Float,
         bottomStart: Float,
         layoutDirection: LayoutDirection
-    ) = if (topStart + topEnd + bottomEnd + bottomStart == 0.0f) {
-        Outline.Rectangle(size.toRect())
-    } else {
-        Outline.Rounded(
-            RoundRect(
-                rect = size.toRect(),
-                topLeft = CornerRadius(topStart),
-                topRight = CornerRadius(topEnd),
-                bottomRight = CornerRadius(bottomEnd),
-                bottomLeft = CornerRadius(bottomStart)
+    ) =
+        if (topStart + topEnd + bottomEnd + bottomStart == 0.0f) {
+            Outline.Rectangle(size.toRect())
+        } else {
+            Outline.Rounded(
+                RoundRect(
+                    rect = size.toRect(),
+                    topLeft = CornerRadius(topStart),
+                    topRight = CornerRadius(topEnd),
+                    bottomRight = CornerRadius(bottomEnd),
+                    bottomLeft = CornerRadius(bottomStart)
+                )
             )
-        )
-    }
+        }
 
     override fun copy(
         topStart: CornerSize,
         topEnd: CornerSize,
         bottomEnd: CornerSize,
         bottomStart: CornerSize
-    ) = AbsoluteRoundedCornerShape(
-        topLeft = topStart,
-        topRight = topEnd,
-        bottomRight = bottomEnd,
-        bottomLeft = bottomStart
-    )
+    ) =
+        AbsoluteRoundedCornerShape(
+            topLeft = topStart,
+            topRight = topEnd,
+            bottomRight = bottomEnd,
+            bottomLeft = bottomStart
+        )
 
     override fun toString(): String {
         return "AbsoluteRoundedCornerShape(topLeft = $topStart, topRight = $topEnd, " +
@@ -112,6 +115,7 @@
 
 /**
  * Creates [AbsoluteRoundedCornerShape] with the same size applied for all four corners.
+ *
  * @param corner [CornerSize] to apply.
  */
 fun AbsoluteRoundedCornerShape(corner: CornerSize) =
@@ -119,77 +123,74 @@
 
 /**
  * Creates [AbsoluteRoundedCornerShape] with the same size applied for all four corners.
+ *
  * @param size Size in [Dp] to apply.
  */
 fun AbsoluteRoundedCornerShape(size: Dp) = AbsoluteRoundedCornerShape(CornerSize(size))
 
 /**
  * Creates [AbsoluteRoundedCornerShape] with the same size applied for all four corners.
+ *
  * @param size Size in pixels to apply.
  */
 fun AbsoluteRoundedCornerShape(size: Float) = AbsoluteRoundedCornerShape(CornerSize(size))
 
 /**
  * Creates [AbsoluteRoundedCornerShape] with the same size applied for all four corners.
+ *
  * @param percent Size in percents to apply.
  */
-fun AbsoluteRoundedCornerShape(percent: Int) =
-    AbsoluteRoundedCornerShape(CornerSize(percent))
+fun AbsoluteRoundedCornerShape(percent: Int) = AbsoluteRoundedCornerShape(CornerSize(percent))
 
-/**
- * Creates [AbsoluteRoundedCornerShape] with sizes defined in [Dp].
- */
+/** Creates [AbsoluteRoundedCornerShape] with sizes defined in [Dp]. */
 fun AbsoluteRoundedCornerShape(
     topLeft: Dp = 0.dp,
     topRight: Dp = 0.dp,
     bottomRight: Dp = 0.dp,
     bottomLeft: Dp = 0.dp
-) = AbsoluteRoundedCornerShape(
-    topLeft = CornerSize(topLeft),
-    topRight = CornerSize(topRight),
-    bottomRight = CornerSize(bottomRight),
-    bottomLeft = CornerSize(bottomLeft)
-)
+) =
+    AbsoluteRoundedCornerShape(
+        topLeft = CornerSize(topLeft),
+        topRight = CornerSize(topRight),
+        bottomRight = CornerSize(bottomRight),
+        bottomLeft = CornerSize(bottomLeft)
+    )
 
-/**
- * Creates [AbsoluteRoundedCornerShape] with sizes defined in pixels.
- */
+/** Creates [AbsoluteRoundedCornerShape] with sizes defined in pixels. */
 fun AbsoluteRoundedCornerShape(
     topLeft: Float = 0.0f,
     topRight: Float = 0.0f,
     bottomRight: Float = 0.0f,
     bottomLeft: Float = 0.0f
-) = AbsoluteRoundedCornerShape(
-    topLeft = CornerSize(topLeft),
-    topRight = CornerSize(topRight),
-    bottomRight = CornerSize(bottomRight),
-    bottomLeft = CornerSize(bottomLeft)
-)
+) =
+    AbsoluteRoundedCornerShape(
+        topLeft = CornerSize(topLeft),
+        topRight = CornerSize(topRight),
+        bottomRight = CornerSize(bottomRight),
+        bottomLeft = CornerSize(bottomLeft)
+    )
 
 /**
  * Creates [AbsoluteRoundedCornerShape] with sizes defined in percents of the shape's smaller side.
  *
  * @param topLeftPercent The top left corner radius as a percentage of the smaller side, with a
- * range of 0 - 100.
+ *   range of 0 - 100.
  * @param topRightPercent The top right corner radius as a percentage of the smaller side, with a
- * range of 0 - 100.
+ *   range of 0 - 100.
  * @param bottomRightPercent The bottom right corner radius as a percentage of the smaller side,
- * with a range of 0 - 100.
- * @param bottomLeftPercent The bottom left corner radius as a percentage of the smaller side,
- * with a range of 0 - 100.
+ *   with a range of 0 - 100.
+ * @param bottomLeftPercent The bottom left corner radius as a percentage of the smaller side, with
+ *   a range of 0 - 100.
  */
 fun AbsoluteRoundedCornerShape(
-    @IntRange(from = 0, to = 100)
-    topLeftPercent: Int = 0,
-    @IntRange(from = 0, to = 100)
-    topRightPercent: Int = 0,
-    @IntRange(from = 0, to = 100)
-    bottomRightPercent: Int = 0,
-    @IntRange(from = 0, to = 100)
-    bottomLeftPercent: Int = 0
-) = AbsoluteRoundedCornerShape(
-    topLeft = CornerSize(topLeftPercent),
-    topRight = CornerSize(topRightPercent),
-    bottomRight = CornerSize(bottomRightPercent),
-    bottomLeft = CornerSize(bottomLeftPercent)
-)
+    @IntRange(from = 0, to = 100) topLeftPercent: Int = 0,
+    @IntRange(from = 0, to = 100) topRightPercent: Int = 0,
+    @IntRange(from = 0, to = 100) bottomRightPercent: Int = 0,
+    @IntRange(from = 0, to = 100) bottomLeftPercent: Int = 0
+) =
+    AbsoluteRoundedCornerShape(
+        topLeft = CornerSize(topLeftPercent),
+        topRight = CornerSize(topRightPercent),
+        bottomRight = CornerSize(bottomRightPercent),
+        bottomLeft = CornerSize(bottomLeftPercent)
+    )
diff --git a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/shape/CornerBasedShape.kt b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/shape/CornerBasedShape.kt
index 710e524..2650ff4 100644
--- a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/shape/CornerBasedShape.kt
+++ b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/shape/CornerBasedShape.kt
@@ -25,12 +25,11 @@
 /**
  * Base class for [Shape]s defined by four [CornerSize]s.
  *
- * @see RoundedCornerShape for an example of the usage.
- *
  * @param topStart a size of the top start corner
  * @param topEnd a size of the top end corner
  * @param bottomEnd a size of the bottom end corner
  * @param bottomStart a size of the bottom start corner
+ * @see RoundedCornerShape for an example of the usage.
  */
 abstract class CornerBasedShape(
     val topStart: CornerSize,
@@ -109,6 +108,7 @@
 
     /**
      * Creates a copy of this Shape with a new corner size.
+     *
      * @param all a size to apply for all four corners
      */
     fun copy(all: CornerSize): CornerBasedShape = copy(all, all, all, all)
diff --git a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/shape/CornerSize.kt b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/shape/CornerSize.kt
index 3614b58..768a7f0 100644
--- a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/shape/CornerSize.kt
+++ b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/shape/CornerSize.kt
@@ -25,9 +25,7 @@
 import androidx.compose.ui.unit.Density
 import androidx.compose.ui.unit.Dp
 
-/**
- * Defines size of a corner in pixels. For example for rounded shape it can be a corner radius.
- */
+/** Defines size of a corner in pixels. For example for rounded shape it can be a corner radius. */
 @Immutable
 interface CornerSize {
     /**
@@ -35,7 +33,6 @@
      *
      * @param shapeSize the size of the shape
      * @param density the current density of the screen.
-     *
      * @return resolved size of the corner in pixels
      */
     fun toPx(shapeSize: Size, density: Density): Float
@@ -43,14 +40,13 @@
 
 /**
  * Creates [CornerSize] with provided size.
+ *
  * @param size the corner size defined in [Dp].
  */
-@Stable
-fun CornerSize(size: Dp): CornerSize = DpCornerSize(size)
+@Stable fun CornerSize(size: Dp): CornerSize = DpCornerSize(size)
 
 private data class DpCornerSize(private val size: Dp) : CornerSize, InspectableValue {
-    override fun toPx(shapeSize: Size, density: Density) =
-        with(density) { size.toPx() }
+    override fun toPx(shapeSize: Size, density: Density) = with(density) { size.toPx() }
 
     override fun toString(): String = "CornerSize(size = ${size.value}.dp)"
 
@@ -60,10 +56,10 @@
 
 /**
  * Creates [CornerSize] with provided size.
+ *
  * @param size the corner size defined in pixels.
  */
-@Stable
-fun CornerSize(size: Float): CornerSize = PxCornerSize(size)
+@Stable fun CornerSize(size: Float): CornerSize = PxCornerSize(size)
 
 private data class PxCornerSize(private val size: Float) : CornerSize, InspectableValue {
     override fun toPx(shapeSize: Size, density: Density) = size
@@ -76,8 +72,9 @@
 
 /**
  * Creates [CornerSize] with provided size.
- * @param percent the corner size defined in percents of the shape's smaller side.
- * Can't be negative or larger then 100 percents.
+ *
+ * @param percent the corner size defined in percents of the shape's smaller side. Can't be negative
+ *   or larger then 100 percents.
  */
 @Stable
 fun CornerSize(@IntRange(from = 0, to = 100) percent: Int): CornerSize =
@@ -85,12 +82,12 @@
 
 /**
  * Creates [CornerSize] with provided size.
- * @param percent the corner size defined in float percents of the shape's smaller side.
- * Can't be negative or larger then 100 percents.
+ *
+ * @param percent the corner size defined in float percents of the shape's smaller side. Can't be
+ *   negative or larger then 100 percents.
  */
 private data class PercentCornerSize(
-    @FloatRange(from = 0.0, to = 100.0)
-    private val percent: Float
+    @FloatRange(from = 0.0, to = 100.0) private val percent: Float
 ) : CornerSize, InspectableValue {
     init {
         if (percent < 0 || percent > 100) {
@@ -98,8 +95,7 @@
         }
     }
 
-    override fun toPx(shapeSize: Size, density: Density) =
-        shapeSize.minDimension * (percent / 100f)
+    override fun toPx(shapeSize: Size, density: Density) = shapeSize.minDimension * (percent / 100f)
 
     override fun toString(): String = "CornerSize(size = $percent%)"
 
@@ -107,15 +103,14 @@
         get() = "$percent%"
 }
 
-/**
- * [CornerSize] always equals to zero.
- */
+/** [CornerSize] always equals to zero. */
 @Stable
-val ZeroCornerSize: CornerSize = object : CornerSize, InspectableValue {
-    override fun toPx(shapeSize: Size, density: Density) = 0.0f
+val ZeroCornerSize: CornerSize =
+    object : CornerSize, InspectableValue {
+        override fun toPx(shapeSize: Size, density: Density) = 0.0f
 
-    override fun toString(): String = "ZeroCornerSize"
+        override fun toString(): String = "ZeroCornerSize"
 
-    override val valueOverride: String
-        get() = "ZeroCornerSize"
-}
+        override val valueOverride: String
+            get() = "ZeroCornerSize"
+    }
diff --git a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/shape/CutCornerShape.kt b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/shape/CutCornerShape.kt
index 7bb7b76..7111d4f 100644
--- a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/shape/CutCornerShape.kt
+++ b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/shape/CutCornerShape.kt
@@ -27,8 +27,8 @@
 import androidx.compose.ui.unit.dp
 
 /**
- * A shape describing the rectangle with cut corners.
- * Corner size is representing the cut length - the size of both legs of the cut's right triangle.
+ * A shape describing the rectangle with cut corners. Corner size is representing the cut length -
+ * the size of both legs of the cut's right triangle.
  *
  * This shape will automatically mirror the corner sizes in [LayoutDirection.Rtl], use
  * [AbsoluteCutCornerShape] for the layout direction unaware version of this shape.
@@ -43,12 +43,13 @@
     topEnd: CornerSize,
     bottomEnd: CornerSize,
     bottomStart: CornerSize
-) : CornerBasedShape(
-    topStart = topStart,
-    topEnd = topEnd,
-    bottomEnd = bottomEnd,
-    bottomStart = bottomStart
-) {
+) :
+    CornerBasedShape(
+        topStart = topStart,
+        topEnd = topEnd,
+        bottomEnd = bottomEnd,
+        bottomStart = bottomStart
+    ) {
 
     override fun createOutline(
         size: Size,
@@ -57,37 +58,40 @@
         bottomEnd: Float,
         bottomStart: Float,
         layoutDirection: LayoutDirection
-    ) = if (topStart + topEnd + bottomStart + bottomEnd == 0.0f) {
-        Outline.Rectangle(size.toRect())
-    } else Outline.Generic(
-        Path().apply {
-            var cornerSize = if (layoutDirection == Ltr) topStart else topEnd
-            moveTo(0f, cornerSize)
-            lineTo(cornerSize, 0f)
-            cornerSize = if (layoutDirection == Ltr) topEnd else topStart
-            lineTo(size.width - cornerSize, 0f)
-            lineTo(size.width, cornerSize)
-            cornerSize = if (layoutDirection == Ltr) bottomEnd else bottomStart
-            lineTo(size.width, size.height - cornerSize)
-            lineTo(size.width - cornerSize, size.height)
-            cornerSize = if (layoutDirection == Ltr) bottomStart else bottomEnd
-            lineTo(cornerSize, size.height)
-            lineTo(0f, size.height - cornerSize)
-            close()
-        }
-    )
+    ) =
+        if (topStart + topEnd + bottomStart + bottomEnd == 0.0f) {
+            Outline.Rectangle(size.toRect())
+        } else
+            Outline.Generic(
+                Path().apply {
+                    var cornerSize = if (layoutDirection == Ltr) topStart else topEnd
+                    moveTo(0f, cornerSize)
+                    lineTo(cornerSize, 0f)
+                    cornerSize = if (layoutDirection == Ltr) topEnd else topStart
+                    lineTo(size.width - cornerSize, 0f)
+                    lineTo(size.width, cornerSize)
+                    cornerSize = if (layoutDirection == Ltr) bottomEnd else bottomStart
+                    lineTo(size.width, size.height - cornerSize)
+                    lineTo(size.width - cornerSize, size.height)
+                    cornerSize = if (layoutDirection == Ltr) bottomStart else bottomEnd
+                    lineTo(cornerSize, size.height)
+                    lineTo(0f, size.height - cornerSize)
+                    close()
+                }
+            )
 
     override fun copy(
         topStart: CornerSize,
         topEnd: CornerSize,
         bottomEnd: CornerSize,
         bottomStart: CornerSize
-    ) = CutCornerShape(
-        topStart = topStart,
-        topEnd = topEnd,
-        bottomEnd = bottomEnd,
-        bottomStart = bottomStart
-    )
+    ) =
+        CutCornerShape(
+            topStart = topStart,
+            topEnd = topEnd,
+            bottomEnd = bottomEnd,
+            bottomStart = bottomStart
+        )
 
     override fun toString(): String {
         return "CutCornerShape(topStart = $topStart, topEnd = $topEnd, bottomEnd = " +
@@ -117,82 +121,81 @@
 
 /**
  * Creates [CutCornerShape] with the same size applied for all four corners.
+ *
  * @param corner [CornerSize] to apply.
  */
 fun CutCornerShape(corner: CornerSize) = CutCornerShape(corner, corner, corner, corner)
 
 /**
  * Creates [CutCornerShape] with the same size applied for all four corners.
+ *
  * @param size Size in [Dp] to apply.
  */
 fun CutCornerShape(size: Dp) = CutCornerShape(CornerSize(size))
 
 /**
  * Creates [CutCornerShape] with the same size applied for all four corners.
+ *
  * @param size Size in pixels to apply.
  */
 fun CutCornerShape(size: Float) = CutCornerShape(CornerSize(size))
 
 /**
  * Creates [CutCornerShape] with the same size applied for all four corners.
+ *
  * @param percent Size in percents to apply.
  */
 fun CutCornerShape(percent: Int) = CutCornerShape(CornerSize(percent))
 
-/**
- * Creates [CutCornerShape] with sizes defined in [Dp].
- */
+/** Creates [CutCornerShape] with sizes defined in [Dp]. */
 fun CutCornerShape(
     topStart: Dp = 0.dp,
     topEnd: Dp = 0.dp,
     bottomEnd: Dp = 0.dp,
     bottomStart: Dp = 0.dp
-) = CutCornerShape(
-    topStart = CornerSize(topStart),
-    topEnd = CornerSize(topEnd),
-    bottomEnd = CornerSize(bottomEnd),
-    bottomStart = CornerSize(bottomStart)
-)
+) =
+    CutCornerShape(
+        topStart = CornerSize(topStart),
+        topEnd = CornerSize(topEnd),
+        bottomEnd = CornerSize(bottomEnd),
+        bottomStart = CornerSize(bottomStart)
+    )
 
-/**
- * Creates [CutCornerShape] with sizes defined in float.
- */
+/** Creates [CutCornerShape] with sizes defined in float. */
 fun CutCornerShape(
     topStart: Float = 0.0f,
     topEnd: Float = 0.0f,
     bottomEnd: Float = 0.0f,
     bottomStart: Float = 0.0f
-) = CutCornerShape(
-    topStart = CornerSize(topStart),
-    topEnd = CornerSize(topEnd),
-    bottomEnd = CornerSize(bottomEnd),
-    bottomStart = CornerSize(bottomStart)
-)
+) =
+    CutCornerShape(
+        topStart = CornerSize(topStart),
+        topEnd = CornerSize(topEnd),
+        bottomEnd = CornerSize(bottomEnd),
+        bottomStart = CornerSize(bottomStart)
+    )
 
 /**
  * Creates [CutCornerShape] with sizes defined in percents of the shape's smaller side.
  *
  * @param topStartPercent The top start corner clip size as a percentage of the smaller side, with a
- * range of 0 - 100.
+ *   range of 0 - 100.
  * @param topEndPercent The top end corner clip size as a percentage of the smaller side, with a
- * range of 0 - 100.
- * @param bottomEndPercent The bottom end clip size radius as a percentage of the smaller side,
- * with a range of 0 - 100.
+ *   range of 0 - 100.
+ * @param bottomEndPercent The bottom end clip size radius as a percentage of the smaller side, with
+ *   a range of 0 - 100.
  * @param bottomStartPercent The bottom start clip size radius as a percentage of the smaller side,
- * with a range of 0 - 100.
+ *   with a range of 0 - 100.
  */
 fun CutCornerShape(
-    @IntRange(from = 0, to = 100)
-    topStartPercent: Int = 0,
-    @IntRange(from = 0, to = 100)
-    topEndPercent: Int = 0,
-    @IntRange(from = 0, to = 100)
-    bottomEndPercent: Int = 0,
-    @IntRange(from = 0, to = 100)
-    bottomStartPercent: Int = 0
-) = CutCornerShape(
-    topStart = CornerSize(topStartPercent),
-    topEnd = CornerSize(topEndPercent),
-    bottomEnd = CornerSize(bottomEndPercent),
-    bottomStart = CornerSize(bottomStartPercent)
-)
+    @IntRange(from = 0, to = 100) topStartPercent: Int = 0,
+    @IntRange(from = 0, to = 100) topEndPercent: Int = 0,
+    @IntRange(from = 0, to = 100) bottomEndPercent: Int = 0,
+    @IntRange(from = 0, to = 100) bottomStartPercent: Int = 0
+) =
+    CutCornerShape(
+        topStart = CornerSize(topStartPercent),
+        topEnd = CornerSize(topEndPercent),
+        bottomEnd = CornerSize(bottomEndPercent),
+        bottomStart = CornerSize(bottomStartPercent)
+    )
diff --git a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/shape/GenericShape.kt b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/shape/GenericShape.kt
index 79ca230..59e767c 100644
--- a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/shape/GenericShape.kt
+++ b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/shape/GenericShape.kt
@@ -37,10 +37,11 @@
         layoutDirection: LayoutDirection,
         density: Density
     ): Outline {
-        val path = Path().apply {
-            builder(size, layoutDirection)
-            close()
-        }
+        val path =
+            Path().apply {
+                builder(size, layoutDirection)
+                close()
+            }
         return Outline.Generic(path)
     }
 
diff --git a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/shape/RoundedCornerShape.kt b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/shape/RoundedCornerShape.kt
index d234583..44c4b55 100644
--- a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/shape/RoundedCornerShape.kt
+++ b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/shape/RoundedCornerShape.kt
@@ -44,12 +44,13 @@
     topEnd: CornerSize,
     bottomEnd: CornerSize,
     bottomStart: CornerSize
-) : CornerBasedShape(
-    topStart = topStart,
-    topEnd = topEnd,
-    bottomEnd = bottomEnd,
-    bottomStart = bottomStart
-) {
+) :
+    CornerBasedShape(
+        topStart = topStart,
+        topEnd = topEnd,
+        bottomEnd = bottomEnd,
+        bottomStart = bottomStart
+    ) {
 
     override fun createOutline(
         size: Size,
@@ -58,31 +59,35 @@
         bottomEnd: Float,
         bottomStart: Float,
         layoutDirection: LayoutDirection
-    ) = if (topStart + topEnd + bottomEnd + bottomStart == 0.0f) {
-        Outline.Rectangle(size.toRect())
-    } else {
-        Outline.Rounded(
-            RoundRect(
-                rect = size.toRect(),
-                topLeft = CornerRadius(if (layoutDirection == Ltr) topStart else topEnd),
-                topRight = CornerRadius(if (layoutDirection == Ltr) topEnd else topStart),
-                bottomRight = CornerRadius(if (layoutDirection == Ltr) bottomEnd else bottomStart),
-                bottomLeft = CornerRadius(if (layoutDirection == Ltr) bottomStart else bottomEnd)
+    ) =
+        if (topStart + topEnd + bottomEnd + bottomStart == 0.0f) {
+            Outline.Rectangle(size.toRect())
+        } else {
+            Outline.Rounded(
+                RoundRect(
+                    rect = size.toRect(),
+                    topLeft = CornerRadius(if (layoutDirection == Ltr) topStart else topEnd),
+                    topRight = CornerRadius(if (layoutDirection == Ltr) topEnd else topStart),
+                    bottomRight =
+                        CornerRadius(if (layoutDirection == Ltr) bottomEnd else bottomStart),
+                    bottomLeft =
+                        CornerRadius(if (layoutDirection == Ltr) bottomStart else bottomEnd)
+                )
             )
-        )
-    }
+        }
 
     override fun copy(
         topStart: CornerSize,
         topEnd: CornerSize,
         bottomEnd: CornerSize,
         bottomStart: CornerSize
-    ) = RoundedCornerShape(
-        topStart = topStart,
-        topEnd = topEnd,
-        bottomEnd = bottomEnd,
-        bottomStart = bottomStart
-    )
+    ) =
+        RoundedCornerShape(
+            topStart = topStart,
+            topEnd = topEnd,
+            bottomEnd = bottomEnd,
+            bottomStart = bottomStart
+        )
 
     override fun toString(): String {
         return "RoundedCornerShape(topStart = $topStart, topEnd = $topEnd, bottomEnd = " +
@@ -110,91 +115,86 @@
     }
 }
 
-/**
- * Circular [Shape] with all the corners sized as the 50 percent of the shape size.
- */
+/** Circular [Shape] with all the corners sized as the 50 percent of the shape size. */
 val CircleShape = RoundedCornerShape(50)
 
 /**
  * Creates [RoundedCornerShape] with the same size applied for all four corners.
+ *
  * @param corner [CornerSize] to apply.
  */
-fun RoundedCornerShape(corner: CornerSize) =
-    RoundedCornerShape(corner, corner, corner, corner)
+fun RoundedCornerShape(corner: CornerSize) = RoundedCornerShape(corner, corner, corner, corner)
 
 /**
  * Creates [RoundedCornerShape] with the same size applied for all four corners.
+ *
  * @param size Size in [Dp] to apply.
  */
 fun RoundedCornerShape(size: Dp) = RoundedCornerShape(CornerSize(size))
 
 /**
  * Creates [RoundedCornerShape] with the same size applied for all four corners.
+ *
  * @param size Size in pixels to apply.
  */
 fun RoundedCornerShape(size: Float) = RoundedCornerShape(CornerSize(size))
 
 /**
  * Creates [RoundedCornerShape] with the same size applied for all four corners.
+ *
  * @param percent Size in percents to apply.
  */
-fun RoundedCornerShape(percent: Int) =
-    RoundedCornerShape(CornerSize(percent))
+fun RoundedCornerShape(percent: Int) = RoundedCornerShape(CornerSize(percent))
 
-/**
- * Creates [RoundedCornerShape] with sizes defined in [Dp].
- */
+/** Creates [RoundedCornerShape] with sizes defined in [Dp]. */
 fun RoundedCornerShape(
     topStart: Dp = 0.dp,
     topEnd: Dp = 0.dp,
     bottomEnd: Dp = 0.dp,
     bottomStart: Dp = 0.dp
-) = RoundedCornerShape(
-    topStart = CornerSize(topStart),
-    topEnd = CornerSize(topEnd),
-    bottomEnd = CornerSize(bottomEnd),
-    bottomStart = CornerSize(bottomStart)
-)
+) =
+    RoundedCornerShape(
+        topStart = CornerSize(topStart),
+        topEnd = CornerSize(topEnd),
+        bottomEnd = CornerSize(bottomEnd),
+        bottomStart = CornerSize(bottomStart)
+    )
 
-/**
- * Creates [RoundedCornerShape] with sizes defined in pixels.
- */
+/** Creates [RoundedCornerShape] with sizes defined in pixels. */
 fun RoundedCornerShape(
     topStart: Float = 0.0f,
     topEnd: Float = 0.0f,
     bottomEnd: Float = 0.0f,
     bottomStart: Float = 0.0f
-) = RoundedCornerShape(
-    topStart = CornerSize(topStart),
-    topEnd = CornerSize(topEnd),
-    bottomEnd = CornerSize(bottomEnd),
-    bottomStart = CornerSize(bottomStart)
-)
+) =
+    RoundedCornerShape(
+        topStart = CornerSize(topStart),
+        topEnd = CornerSize(topEnd),
+        bottomEnd = CornerSize(bottomEnd),
+        bottomStart = CornerSize(bottomStart)
+    )
 
 /**
  * Creates [RoundedCornerShape] with sizes defined in percents of the shape's smaller side.
  *
  * @param topStartPercent The top start corner radius as a percentage of the smaller side, with a
- * range of 0 - 100.
- * @param topEndPercent The top end corner radius as a percentage of the smaller side, with a
- * range of 0 - 100.
- * @param bottomEndPercent The bottom end corner radius as a percentage of the smaller side,
- * with a range of 0 - 100.
+ *   range of 0 - 100.
+ * @param topEndPercent The top end corner radius as a percentage of the smaller side, with a range
+ *   of 0 - 100.
+ * @param bottomEndPercent The bottom end corner radius as a percentage of the smaller side, with a
+ *   range of 0 - 100.
  * @param bottomStartPercent The bottom start corner radius as a percentage of the smaller side,
- * with a range of 0 - 100.
+ *   with a range of 0 - 100.
  */
 fun RoundedCornerShape(
-    @IntRange(from = 0, to = 100)
-    topStartPercent: Int = 0,
-    @IntRange(from = 0, to = 100)
-    topEndPercent: Int = 0,
-    @IntRange(from = 0, to = 100)
-    bottomEndPercent: Int = 0,
-    @IntRange(from = 0, to = 100)
-    bottomStartPercent: Int = 0
-) = RoundedCornerShape(
-    topStart = CornerSize(topStartPercent),
-    topEnd = CornerSize(topEndPercent),
-    bottomEnd = CornerSize(bottomEndPercent),
-    bottomStart = CornerSize(bottomStartPercent)
-)
+    @IntRange(from = 0, to = 100) topStartPercent: Int = 0,
+    @IntRange(from = 0, to = 100) topEndPercent: Int = 0,
+    @IntRange(from = 0, to = 100) bottomEndPercent: Int = 0,
+    @IntRange(from = 0, to = 100) bottomStartPercent: Int = 0
+) =
+    RoundedCornerShape(
+        topStart = CornerSize(topStartPercent),
+        topEnd = CornerSize(topEndPercent),
+        bottomEnd = CornerSize(bottomEndPercent),
+        bottomStart = CornerSize(bottomStartPercent)
+    )
diff --git a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/AnnotatedStringResolveInlineContent.kt b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/AnnotatedStringResolveInlineContent.kt
index fc8890d..95a0641 100644
--- a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/AnnotatedStringResolveInlineContent.kt
+++ b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/AnnotatedStringResolveInlineContent.kt
@@ -24,6 +24,7 @@
 import androidx.compose.ui.util.fastMap
 
 internal typealias PlaceholderRange = AnnotatedString.Range<Placeholder>
+
 internal typealias InlineContentRange = AnnotatedString.Range<@Composable (String) -> Unit>
 
 /**
@@ -53,11 +54,7 @@
                 )
             )
             inlineComposables.add(
-                AnnotatedString.Range(
-                    inlineTextContent.children,
-                    annotation.start,
-                    annotation.end
-                )
+                AnnotatedString.Range(inlineTextContent.children, annotation.start, annotation.end)
             )
         }
     }
@@ -68,14 +65,9 @@
     hasStringAnnotations(INLINE_CONTENT_TAG, 0, text.length)
 
 @Composable
-internal fun InlineChildren(
-    text: AnnotatedString,
-    inlineContents: List<InlineContentRange>
-) {
+internal fun InlineChildren(text: AnnotatedString, inlineContents: List<InlineContentRange>) {
     inlineContents.fastForEach { (content, start, end) ->
-        Layout(
-            content = { content(text.subSequence(start, end).text) }
-        ) { children, constrains ->
+        Layout(content = { content(text.subSequence(start, end).text) }) { children, constrains ->
             val placeables = children.fastMap { it.measure(constrains) }
             layout(width = constrains.maxWidth, height = constrains.maxHeight) {
                 placeables.fastForEach { it.placeRelative(0, 0) }
diff --git a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/BasicSecureTextField.kt b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/BasicSecureTextField.kt
index a8d98ac..f883682 100644
--- a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/BasicSecureTextField.kt
+++ b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/BasicSecureTextField.kt
@@ -63,51 +63,51 @@
 
 /**
  * BasicSecureTextField is specifically designed for password entry fields and is a preconfigured
- * alternative to [BasicTextField]. It only supports a single line of content and comes with
- * default settings for [KeyboardOptions], [InputTransformation], and [CodepointTransformation] that
- * are appropriate for entering secure content. Additionally, some context menu actions like cut,
- * copy, and drag are disabled for added security.
+ * alternative to [BasicTextField]. It only supports a single line of content and comes with default
+ * settings for [KeyboardOptions], [InputTransformation], and [CodepointTransformation] that are
+ * appropriate for entering secure content. Additionally, some context menu actions like cut, copy,
+ * and drag are disabled for added security.
  *
  * @param state [TextFieldState] object that holds the internal state of a [BasicTextField].
  * @param modifier optional [Modifier] for this text field.
- * @param enabled controls the enabled state of the [BasicTextField]. When `false`, the text
- * field will be neither editable nor focusable, the input of the text field will not be selectable.
+ * @param enabled controls the enabled state of the [BasicTextField]. When `false`, the text field
+ *   will be neither editable nor focusable, the input of the text field will not be selectable.
  * @param inputTransformation Optional [InputTransformation] that will be used to transform changes
- * to the [TextFieldState] made by the user. The transformation will be applied to changes made by
- * hardware and software keyboard events, pasting or dropping text, accessibility services, and
- * tests. The transformation will _not_ be applied when changing the [state] programmatically, or
- * when the transformation is changed. If the transformation is changed on an existing text field,
- * it will be applied to the next user edit. The transformation will not immediately affect the
- * current [state].
+ *   to the [TextFieldState] made by the user. The transformation will be applied to changes made by
+ *   hardware and software keyboard events, pasting or dropping text, accessibility services, and
+ *   tests. The transformation will _not_ be applied when changing the [state] programmatically, or
+ *   when the transformation is changed. If the transformation is changed on an existing text field,
+ *   it will be applied to the next user edit. The transformation will not immediately affect the
+ *   current [state].
  * @param textStyle Style configuration for text content that's displayed in the editor.
  * @param keyboardOptions Software keyboard options that contain configurations such as
- * [KeyboardType] and [ImeAction]. This composable by default configures [KeyboardOptions] for a
- * secure text field by disabling auto correct and setting [KeyboardType] to
- * [KeyboardType.Password].
- * @param onKeyboardAction Called when the user presses the action button in the input method
- * editor (IME), or by pressing the enter key on a hardware keyboard. By default this parameter
- * is null, and would execute the default behavior for a received IME Action e.g., [ImeAction.Done]
- * would close the keyboard, [ImeAction.Next] would switch the focus to the next focusable item on
- * the screen.
+ *   [KeyboardType] and [ImeAction]. This composable by default configures [KeyboardOptions] for a
+ *   secure text field by disabling auto correct and setting [KeyboardType] to
+ *   [KeyboardType.Password].
+ * @param onKeyboardAction Called when the user presses the action button in the input method editor
+ *   (IME), or by pressing the enter key on a hardware keyboard. By default this parameter is null,
+ *   and would execute the default behavior for a received IME Action e.g., [ImeAction.Done] would
+ *   close the keyboard, [ImeAction.Next] would switch the focus to the next focusable item on the
+ *   screen.
  * @param onTextLayout Callback that is executed when the text layout becomes queryable. The
- * callback receives a function that returns a [TextLayoutResult] if the layout can be calculated,
- * or null if it cannot. The function reads the layout result from a snapshot state object, and will
- * invalidate its caller when the layout result changes. A [TextLayoutResult] object contains
- * paragraph information, size of the text, baselines and other details. The callback can be used to
- * add additional decoration or functionality to the text. For example, to draw a cursor or
- * selection around the text. [Density] scope is the one that was used while creating the given text
- * layout.
+ *   callback receives a function that returns a [TextLayoutResult] if the layout can be calculated,
+ *   or null if it cannot. The function reads the layout result from a snapshot state object, and
+ *   will invalidate its caller when the layout result changes. A [TextLayoutResult] object contains
+ *   paragraph information, size of the text, baselines and other details. The callback can be used
+ *   to add additional decoration or functionality to the text. For example, to draw a cursor or
+ *   selection around the text. [Density] scope is the one that was used while creating the given
+ *   text layout.
  * @param interactionSource the [MutableInteractionSource] representing the stream of [Interaction]s
- * for this TextField. You can create and pass in your own remembered [MutableInteractionSource]
- * if you want to observe [Interaction]s and customize the appearance / behavior of this TextField
- * for different [Interaction]s.
+ *   for this TextField. You can create and pass in your own remembered [MutableInteractionSource]
+ *   if you want to observe [Interaction]s and customize the appearance / behavior of this TextField
+ *   for different [Interaction]s.
  * @param cursorBrush [Brush] to paint cursor with. If [SolidColor] with [Color.Unspecified]
- * provided, there will be no cursor drawn.
+ *   provided, there will be no cursor drawn.
  * @param decorator Allows to add decorations around text field, such as icon, placeholder, helper
- * messages or similar, and automatically increase the hit target area of the text field.
+ *   messages or similar, and automatically increase the hit target area of the text field.
  * @param textObfuscationMode Determines the method used to obscure the input text.
  * @param textObfuscationCharacter Which character to use while obfuscating the text. It doesn't
- * have an effect when [textObfuscationMode] is set to [TextObfuscationMode.Visible].
+ *   have an effect when [textObfuscationMode] is set to [TextObfuscationMode.Visible].
  */
 // This takes a composable lambda, but it is not primarily a container.
 @Suppress("ComposableLambdaParameterPosition")
@@ -148,31 +148,33 @@
         }
     }
 
-    val codepointTransformation = remember(textObfuscationMode) {
-        when (textObfuscationMode) {
-            TextObfuscationMode.RevealLastTyped -> {
-                secureTextFieldController.codepointTransformation
+    val codepointTransformation =
+        remember(textObfuscationMode) {
+            when (textObfuscationMode) {
+                TextObfuscationMode.RevealLastTyped -> {
+                    secureTextFieldController.codepointTransformation
+                }
+                TextObfuscationMode.Hidden -> {
+                    CodepointTransformation { _, _ -> obfuscationMaskState.value.code }
+                }
+                else -> null
             }
-            TextObfuscationMode.Hidden -> {
-                CodepointTransformation { _, _ -> obfuscationMaskState.value.code }
-            }
-            else -> null
         }
-    }
 
-    val secureTextFieldModifier = modifier
-        .semantics(mergeDescendants = true) {
-            password()
-            copyText { false }
-            cutText { false }
-        }
-        .then(
-            if (revealLastTypedEnabled) {
-                secureTextFieldController.focusChangeModifier
-            } else {
-                Modifier
+    val secureTextFieldModifier =
+        modifier
+            .semantics(mergeDescendants = true) {
+                password()
+                copyText { false }
+                cutText { false }
             }
-        )
+            .then(
+                if (revealLastTypedEnabled) {
+                    secureTextFieldController.focusChangeModifier
+                } else {
+                    Modifier
+                }
+            )
 
     DisableCutCopy {
         BasicTextField(
@@ -180,9 +182,10 @@
             modifier = secureTextFieldModifier,
             enabled = enabled,
             readOnly = false,
-            inputTransformation = if (revealLastTypedEnabled) {
-                inputTransformation.then(secureTextFieldController.passwordInputTransformation)
-            } else inputTransformation,
+            inputTransformation =
+                if (revealLastTypedEnabled) {
+                    inputTransformation.then(secureTextFieldController.passwordInputTransformation)
+                } else inputTransformation,
             textStyle = textStyle,
             keyboardOptions = keyboardOptions,
             onKeyboardAction = onKeyboardAction,
@@ -197,9 +200,7 @@
     }
 }
 
-/**
- * Enables chaining nullable transformations with the regular chaining order.
- */
+/** Enables chaining nullable transformations with the regular chaining order. */
 private fun InputTransformation?.then(next: InputTransformation?): InputTransformation? {
     return when {
         this == null -> next
@@ -208,9 +209,7 @@
     }
 }
 
-internal class SecureTextFieldController(
-    private val obfuscationMaskState: State<Char>
-) {
+internal class SecureTextFieldController(private val obfuscationMaskState: State<Char>) {
     /**
      * A special [InputTransformation] that tracks changes to the content to identify the last typed
      * character to reveal. `scheduleHide` lambda is delegated to a member function to be able to
@@ -218,9 +217,7 @@
      */
     val passwordInputTransformation = PasswordInputTransformation(::scheduleHide)
 
-    /**
-     * Pass to [BasicTextField] for obscuring text input.
-     */
+    /** Pass to [BasicTextField] for obscuring text input. */
     val codepointTransformation = CodepointTransformation { codepointIndex, codepoint ->
         if (codepointIndex == passwordInputTransformation.revealCodepointIndex) {
             // reveal the last typed character by not obscuring it
@@ -230,18 +227,16 @@
         }
     }
 
-    val focusChangeModifier = Modifier.onFocusChanged {
-        if (!it.isFocused) passwordInputTransformation.hide()
-    }
+    val focusChangeModifier =
+        Modifier.onFocusChanged { if (!it.isFocused) passwordInputTransformation.hide() }
 
     private val resetTimerSignal = Channel<Unit>(Channel.UNLIMITED)
 
     suspend fun observeHideEvents() {
-        resetTimerSignal.consumeAsFlow()
-            .collectLatest {
-                delay(LAST_TYPED_CHARACTER_REVEAL_DURATION_MILLIS)
-                passwordInputTransformation.hide()
-            }
+        resetTimerSignal.consumeAsFlow().collectLatest {
+            delay(LAST_TYPED_CHARACTER_REVEAL_DURATION_MILLIS)
+            passwordInputTransformation.hide()
+        }
     }
 
     private fun scheduleHide() {
@@ -258,21 +253,20 @@
  * mark it for reveal in password fields.
  *
  * @param scheduleHide A lambda that schedules a [hide] call into future after a new character is
- * typed.
+ *   typed.
  */
 @OptIn(ExperimentalFoundationApi::class)
-internal class PasswordInputTransformation(
-    val scheduleHide: () -> Unit
-) : InputTransformation {
+internal class PasswordInputTransformation(val scheduleHide: () -> Unit) : InputTransformation {
     // TODO: Consider setting this as a tracking annotation in AnnotatedString.
     internal var revealCodepointIndex by mutableIntStateOf(-1)
         private set
 
     override fun TextFieldBuffer.transformInput() {
         // We only care about a single character insertion changes
-        val singleCharacterInsertion = changes.changeCount == 1 &&
-            changes.getRange(0).length == 1 &&
-            changes.getOriginalRange(0).length == 0
+        val singleCharacterInsertion =
+            changes.changeCount == 1 &&
+                changes.getRange(0).length == 1 &&
+                changes.getOriginalRange(0).length == 0
 
         // if there is an expanded selection, don't reveal anything
         if (!singleCharacterInsertion || hasSelection) {
@@ -288,9 +282,7 @@
         }
     }
 
-    /**
-     * Removes any revealed character index. Everything goes back into hiding.
-     */
+    /** Removes any revealed character index. Everything goes back into hiding. */
     fun hide() {
         revealCodepointIndex = -1
     }
@@ -306,36 +298,38 @@
  * composables inside [content].
  */
 @Composable
-private fun DisableCutCopy(
-    content: @Composable () -> Unit
-) {
+private fun DisableCutCopy(content: @Composable () -> Unit) {
     val currentToolbar = LocalTextToolbar.current
-    val copyDisabledToolbar = remember(currentToolbar) {
-        object : TextToolbar by currentToolbar {
-            override fun showMenu(
-                rect: Rect,
-                onCopyRequested: (() -> Unit)?,
-                onPasteRequested: (() -> Unit)?,
-                onCutRequested: (() -> Unit)?,
-                onSelectAllRequested: (() -> Unit)?
-            ) {
-                currentToolbar.showMenu(
-                    rect = rect,
-                    onPasteRequested = onPasteRequested,
-                    onSelectAllRequested = onSelectAllRequested,
-                    onCopyRequested = null,
-                    onCutRequested = null
-                )
+    val copyDisabledToolbar =
+        remember(currentToolbar) {
+            object : TextToolbar by currentToolbar {
+                override fun showMenu(
+                    rect: Rect,
+                    onCopyRequested: (() -> Unit)?,
+                    onPasteRequested: (() -> Unit)?,
+                    onCutRequested: (() -> Unit)?,
+                    onSelectAllRequested: (() -> Unit)?
+                ) {
+                    currentToolbar.showMenu(
+                        rect = rect,
+                        onPasteRequested = onPasteRequested,
+                        onSelectAllRequested = onSelectAllRequested,
+                        onCopyRequested = null,
+                        onCutRequested = null
+                    )
+                }
             }
         }
-    }
     CompositionLocalProvider(LocalTextToolbar provides copyDisabledToolbar) {
-        Box(modifier = Modifier.onPreviewKeyEvent { keyEvent ->
-            // BasicTextField uses this static mapping
-            val command = platformDefaultKeyMapping.map(keyEvent)
-            // do not propagate copy and cut operations
-            command == KeyCommand.COPY || command == KeyCommand.CUT
-        }) {
+        Box(
+            modifier =
+                Modifier.onPreviewKeyEvent { keyEvent ->
+                    // BasicTextField uses this static mapping
+                    val command = platformDefaultKeyMapping.map(keyEvent)
+                    // do not propagate copy and cut operations
+                    command == KeyCommand.COPY || command == KeyCommand.CUT
+                }
+        ) {
             content()
         }
     }
diff --git a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/BasicText.kt b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/BasicText.kt
index 1b48576..e680d51 100644
--- a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/BasicText.kt
+++ b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/BasicText.kt
@@ -61,26 +61,26 @@
 import kotlin.math.floor
 
 /**
- * Basic element that displays text and provides semantics / accessibility information.
- * Typically you will instead want to use [androidx.compose.material.Text], which is
- * a higher level Text element that contains semantics and consumes style information from a theme.
+ * Basic element that displays text and provides semantics / accessibility information. Typically
+ * you will instead want to use [androidx.compose.material.Text], which is a higher level Text
+ * element that contains semantics and consumes style information from a theme.
  *
  * @param text The text to be displayed.
  * @param modifier [Modifier] to apply to this layout node.
  * @param style Style configuration for the text such as color, font, line height etc.
  * @param onTextLayout Callback that is executed when a new text layout is calculated. A
- * [TextLayoutResult] object that callback provides contains paragraph information, size of the
- * text, baselines and other details. The callback can be used to add additional decoration or
- * functionality to the text. For example, to draw selection around the text.
+ *   [TextLayoutResult] object that callback provides contains paragraph information, size of the
+ *   text, baselines and other details. The callback can be used to add additional decoration or
+ *   functionality to the text. For example, to draw selection around the text.
  * @param overflow How visual overflow should be handled.
  * @param softWrap Whether the text should break at soft line breaks. If false, the glyphs in the
- * text will be positioned as if there was unlimited horizontal space. If [softWrap] is false,
- * [overflow] and TextAlign may have unexpected effects.
- * @param maxLines An optional maximum number of lines for the text to span, wrapping if
- * necessary. If the text exceeds the given number of lines, it will be truncated according to
- * [overflow] and [softWrap]. It is required that 1 <= [minLines] <= [maxLines].
+ *   text will be positioned as if there was unlimited horizontal space. If [softWrap] is false,
+ *   [overflow] and TextAlign may have unexpected effects.
+ * @param maxLines An optional maximum number of lines for the text to span, wrapping if necessary.
+ *   If the text exceeds the given number of lines, it will be truncated according to [overflow] and
+ *   [softWrap]. It is required that 1 <= [minLines] <= [maxLines].
  * @param minLines The minimum height in terms of minimum number of visible lines. It is required
- * that 1 <= [minLines] <= [maxLines].
+ *   that 1 <= [minLines] <= [maxLines].
  * @param color Overrides the text color provided in [style]
  */
 @Composable
@@ -95,86 +95,82 @@
     minLines: Int = 1,
     color: ColorProducer? = null
 ) {
-    validateMinMaxLines(
-        minLines = minLines,
-        maxLines = maxLines
-    )
+    validateMinMaxLines(minLines = minLines, maxLines = maxLines)
     val selectionRegistrar = LocalSelectionRegistrar.current
-    val selectionController = if (selectionRegistrar != null) {
-        val backgroundSelectionColor = LocalTextSelectionColors.current.backgroundColor
-        val selectableId =
-            rememberSaveable(selectionRegistrar, saver = selectionIdSaver(selectionRegistrar)) {
-                selectionRegistrar.nextSelectableId()
+    val selectionController =
+        if (selectionRegistrar != null) {
+            val backgroundSelectionColor = LocalTextSelectionColors.current.backgroundColor
+            val selectableId =
+                rememberSaveable(selectionRegistrar, saver = selectionIdSaver(selectionRegistrar)) {
+                    selectionRegistrar.nextSelectableId()
+                }
+            remember(selectableId, selectionRegistrar, backgroundSelectionColor) {
+                SelectionController(selectableId, selectionRegistrar, backgroundSelectionColor)
             }
-        remember(selectableId, selectionRegistrar, backgroundSelectionColor) {
-            SelectionController(
-                selectableId,
-                selectionRegistrar,
-                backgroundSelectionColor
-            )
+        } else {
+            null
         }
-    } else {
-        null
-    }
-    val finalModifier = if (selectionController != null || onTextLayout != null) {
-        modifier
-            // TODO(b/274781644): Remove this graphicsLayer
-            .graphicsLayer()
-            .textModifier(
-                AnnotatedString(text = text),
-                style = style,
-                onTextLayout = onTextLayout,
-                overflow = overflow,
-                softWrap = softWrap,
-                maxLines = maxLines,
-                minLines = minLines,
-                fontFamilyResolver = LocalFontFamilyResolver.current,
-                placeholders = null,
-                onPlaceholderLayout = null,
-                selectionController = selectionController,
-                color = color,
-                onShowTranslation = null
-            )
-    } else {
-        modifier
-            // TODO(b/274781644): Remove this graphicsLayer
-            .graphicsLayer() then TextStringSimpleElement(
-            text = text,
-            style = style,
-            fontFamilyResolver = LocalFontFamilyResolver.current,
-            overflow = overflow,
-            softWrap = softWrap,
-            maxLines = maxLines,
-            minLines = minLines,
-            color = color
-        )
-    }
+    val finalModifier =
+        if (selectionController != null || onTextLayout != null) {
+            modifier
+                // TODO(b/274781644): Remove this graphicsLayer
+                .graphicsLayer()
+                .textModifier(
+                    AnnotatedString(text = text),
+                    style = style,
+                    onTextLayout = onTextLayout,
+                    overflow = overflow,
+                    softWrap = softWrap,
+                    maxLines = maxLines,
+                    minLines = minLines,
+                    fontFamilyResolver = LocalFontFamilyResolver.current,
+                    placeholders = null,
+                    onPlaceholderLayout = null,
+                    selectionController = selectionController,
+                    color = color,
+                    onShowTranslation = null
+                )
+        } else {
+            modifier
+                // TODO(b/274781644): Remove this graphicsLayer
+                .graphicsLayer() then
+                TextStringSimpleElement(
+                    text = text,
+                    style = style,
+                    fontFamilyResolver = LocalFontFamilyResolver.current,
+                    overflow = overflow,
+                    softWrap = softWrap,
+                    maxLines = maxLines,
+                    minLines = minLines,
+                    color = color
+                )
+        }
     Layout(finalModifier, EmptyMeasurePolicy)
 }
 
 /**
- * Basic element that displays text and provides semantics / accessibility information.
- * Typically you will instead want to use [androidx.compose.material.Text], which is
- * a higher level Text element that contains semantics and consumes style information from a theme.
+ * Basic element that displays text and provides semantics / accessibility information. Typically
+ * you will instead want to use [androidx.compose.material.Text], which is a higher level Text
+ * element that contains semantics and consumes style information from a theme.
  *
  * @param text The text to be displayed.
  * @param modifier [Modifier] to apply to this layout node.
  * @param style Style configuration for the text such as color, font, line height etc.
  * @param onTextLayout Callback that is executed when a new text layout is calculated. A
- * [TextLayoutResult] object that callback provides contains paragraph information, size of the
- * text, baselines and other details. The callback can be used to add additional decoration or
- * functionality to the text. For example, to draw selection around the text.
+ *   [TextLayoutResult] object that callback provides contains paragraph information, size of the
+ *   text, baselines and other details. The callback can be used to add additional decoration or
+ *   functionality to the text. For example, to draw selection around the text.
  * @param overflow How visual overflow should be handled.
  * @param softWrap Whether the text should break at soft line breaks. If false, the glyphs in the
- * text will be positioned as if there was unlimited horizontal space. If [softWrap] is false,
- * [overflow] and TextAlign may have unexpected effects.
- * @param maxLines An optional maximum number of lines for the text to span, wrapping if
- * necessary. If the text exceeds the given number of lines, it will be truncated according to
- * [overflow] and [softWrap]. It is required that 1 <= [minLines] <= [maxLines].
+ *   text will be positioned as if there was unlimited horizontal space. If [softWrap] is false,
+ *   [overflow] and TextAlign may have unexpected effects.
+ * @param maxLines An optional maximum number of lines for the text to span, wrapping if necessary.
+ *   If the text exceeds the given number of lines, it will be truncated according to [overflow] and
+ *   [softWrap]. It is required that 1 <= [minLines] <= [maxLines].
  * @param minLines The minimum height in terms of minimum number of visible lines. It is required
- * that 1 <= [minLines] <= [maxLines].
- * @param inlineContent A map store composables that replaces certain ranges of the text. It's
- * used to insert composables into text layout. Check [InlineTextContent] for more information.
+ *   that 1 <= [minLines] <= [maxLines].
+ * @param inlineContent A map store composables that replaces certain ranges of the text. It's used
+ *   to insert composables into text layout. Check [InlineTextContent] for more information.
  * @param color Overrides the text color provided in [style]
  */
 @Composable
@@ -190,50 +186,45 @@
     inlineContent: Map<String, InlineTextContent> = mapOf(),
     color: ColorProducer? = null
 ) {
-    validateMinMaxLines(
-        minLines = minLines,
-        maxLines = maxLines
-    )
+    validateMinMaxLines(minLines = minLines, maxLines = maxLines)
     val selectionRegistrar = LocalSelectionRegistrar.current
-    val selectionController = if (selectionRegistrar != null) {
-        val backgroundSelectionColor = LocalTextSelectionColors.current.backgroundColor
-        val selectableId =
-            rememberSaveable(selectionRegistrar, saver = selectionIdSaver(selectionRegistrar)) {
-                selectionRegistrar.nextSelectableId()
+    val selectionController =
+        if (selectionRegistrar != null) {
+            val backgroundSelectionColor = LocalTextSelectionColors.current.backgroundColor
+            val selectableId =
+                rememberSaveable(selectionRegistrar, saver = selectionIdSaver(selectionRegistrar)) {
+                    selectionRegistrar.nextSelectableId()
+                }
+            remember(selectableId, selectionRegistrar, backgroundSelectionColor) {
+                SelectionController(selectableId, selectionRegistrar, backgroundSelectionColor)
             }
-        remember(selectableId, selectionRegistrar, backgroundSelectionColor) {
-            SelectionController(
-                selectableId,
-                selectionRegistrar,
-                backgroundSelectionColor
-            )
+        } else {
+            null
         }
-    } else {
-        null
-    }
     val hasInlineContent = text.hasInlineContent()
     val hasLinks = text.hasLinks()
     if (!hasInlineContent && !hasLinks) {
         // this is the same as text: String, use all the early exits
         Layout(
-            modifier = modifier
-                // TODO(b/274781644): Remove this graphicsLayer
-                .graphicsLayer()
-                .textModifier(
-                    text = text,
-                    style = style,
-                    onTextLayout = onTextLayout,
-                    overflow = overflow,
-                    softWrap = softWrap,
-                    maxLines = maxLines,
-                    minLines = minLines,
-                    fontFamilyResolver = LocalFontFamilyResolver.current,
-                    placeholders = null,
-                    onPlaceholderLayout = null,
-                    selectionController = selectionController,
-                    color = color,
-                    onShowTranslation = null
-                ),
+            modifier =
+                modifier
+                    // TODO(b/274781644): Remove this graphicsLayer
+                    .graphicsLayer()
+                    .textModifier(
+                        text = text,
+                        style = style,
+                        onTextLayout = onTextLayout,
+                        overflow = overflow,
+                        softWrap = softWrap,
+                        maxLines = maxLines,
+                        minLines = minLines,
+                        fontFamilyResolver = LocalFontFamilyResolver.current,
+                        placeholders = null,
+                        onPlaceholderLayout = null,
+                        selectionController = selectionController,
+                        color = color,
+                        onShowTranslation = null
+                    ),
             EmptyMeasurePolicy
         )
     } else {
@@ -256,11 +247,12 @@
             selectionController = selectionController,
             color = color,
             onShowTranslation = { substitutionValue ->
-                displayedText = if (substitutionValue.isShowingSubstitution) {
-                    substitutionValue.substitution
-                } else {
-                    substitutionValue.original
-                }
+                displayedText =
+                    if (substitutionValue.isShowingSubstitution) {
+                        substitutionValue.substitution
+                    } else {
+                        substitutionValue.original
+                    }
             }
         )
     }
@@ -339,28 +331,29 @@
     maxLines: Int = Int.MAX_VALUE,
     minLines: Int = 1,
     inlineContent: Map<String, InlineTextContent> = mapOf()
-) = BasicText(
-    text = text,
-    modifier = modifier,
-    style = style,
-    onTextLayout = onTextLayout,
-    overflow = overflow,
-    softWrap = softWrap,
-    maxLines = maxLines,
-    minLines = minLines,
-    inlineContent = inlineContent
-)
+) =
+    BasicText(
+        text = text,
+        modifier = modifier,
+        style = style,
+        onTextLayout = onTextLayout,
+        overflow = overflow,
+        softWrap = softWrap,
+        maxLines = maxLines,
+        minLines = minLines,
+        inlineContent = inlineContent
+    )
 
-/**
- * A custom saver that won't save if no selection is active.
- */
-private fun selectionIdSaver(selectionRegistrar: SelectionRegistrar?) = Saver<Long, Long>(
-    save = { if (selectionRegistrar.hasSelection(it)) it else null },
-    restore = { it }
-)
+/** A custom saver that won't save if no selection is active. */
+private fun selectionIdSaver(selectionRegistrar: SelectionRegistrar?) =
+    Saver<Long, Long>(
+        save = { if (selectionRegistrar.hasSelection(it)) it else null },
+        restore = { it }
+    )
 
 private object EmptyMeasurePolicy : MeasurePolicy {
     private val placementBlock: Placeable.PlacementScope.() -> Unit = {}
+
     override fun MeasureScope.measure(
         measurables: List<Measurable>,
         constraints: Constraints
@@ -379,39 +372,36 @@
         constraints: Constraints
     ): MeasureResult {
         // inline content
-        val inlineContentMeasurables = measurables.fastFilter {
-            it.parentData !is TextRangeLayoutModifier
-        }
-        val inlineContentToPlace = placements()?.fastMapIndexedNotNull { index, rect ->
-            // PlaceholderRect will be null if it's ellipsized. In that case, the corresponding
-            // inline children won't be measured or placed.
-            rect?.let {
-                Pair(
-                    inlineContentMeasurables[index].measure(
-                        Constraints(
-                            maxWidth = floor(it.width).toInt(),
-                            maxHeight = floor(it.height).toInt()
-                        )
-                    ),
-                    IntOffset(it.left.fastRoundToInt(), it.top.fastRoundToInt())
-                )
+        val inlineContentMeasurables =
+            measurables.fastFilter { it.parentData !is TextRangeLayoutModifier }
+        val inlineContentToPlace =
+            placements()?.fastMapIndexedNotNull { index, rect ->
+                // PlaceholderRect will be null if it's ellipsized. In that case, the corresponding
+                // inline children won't be measured or placed.
+                rect?.let {
+                    Pair(
+                        inlineContentMeasurables[index].measure(
+                            Constraints(
+                                maxWidth = floor(it.width).toInt(),
+                                maxHeight = floor(it.height).toInt()
+                            )
+                        ),
+                        IntOffset(it.left.fastRoundToInt(), it.top.fastRoundToInt())
+                    )
+                }
             }
-        }
 
         // links
-        val linksMeasurables = measurables.fastFilter {
-            it.parentData is TextRangeLayoutModifier
-        }
-        val linksToPlace = measureWithTextRangeMeasureConstraints(
-            measurables = linksMeasurables,
-            shouldMeasureLinks = shouldMeasureLinks
-        )
+        val linksMeasurables = measurables.fastFilter { it.parentData is TextRangeLayoutModifier }
+        val linksToPlace =
+            measureWithTextRangeMeasureConstraints(
+                measurables = linksMeasurables,
+                shouldMeasureLinks = shouldMeasureLinks
+            )
 
         return layout(constraints.maxWidth, constraints.maxHeight) {
             // inline content
-            inlineContentToPlace?.fastForEach { (placeable, position) ->
-                placeable.place(position)
-            }
+            inlineContentToPlace?.fastForEach { (placeable, position) -> placeable.place(position) }
             // links
             linksToPlace?.fastForEach { (placeable, measureResult) ->
                 placeable.place(measureResult?.invoke() ?: IntOffset.Zero)
@@ -421,18 +411,18 @@
 }
 
 /** Measure policy for links only */
-private class LinksTextMeasurePolicy(
-    private val shouldMeasureLinks: () -> Boolean
-) : MeasurePolicy {
+private class LinksTextMeasurePolicy(private val shouldMeasureLinks: () -> Boolean) :
+    MeasurePolicy {
     override fun MeasureScope.measure(
         measurables: List<Measurable>,
         constraints: Constraints
     ): MeasureResult {
         return layout(constraints.maxWidth, constraints.maxHeight) {
-            val linksToPlace = measureWithTextRangeMeasureConstraints(
-                measurables = measurables,
-                shouldMeasureLinks = shouldMeasureLinks
-            )
+            val linksToPlace =
+                measureWithTextRangeMeasureConstraints(
+                    measurables = measurables,
+                    shouldMeasureLinks = shouldMeasureLinks
+                )
             linksToPlace?.fastForEach { (placeable, measureResult) ->
                 placeable.place(measureResult?.invoke() ?: IntOffset.Zero)
             }
@@ -449,17 +439,17 @@
         measurables.fastMapIndexedNotNull { _, measurable ->
             val rangeMeasurePolicy =
                 (measurable.parentData as TextRangeLayoutModifier).measurePolicy
-            val rangeMeasureResult = with(rangeMeasurePolicy) {
-                textRangeLayoutMeasureScope.measure()
-            }
-            val placeable = measurable.measure(
-                fitPrioritizingWidth(
-                    minWidth = rangeMeasureResult.width,
-                    maxWidth = rangeMeasureResult.width,
-                    minHeight = rangeMeasureResult.height,
-                    maxHeight = rangeMeasureResult.height
+            val rangeMeasureResult =
+                with(rangeMeasurePolicy) { textRangeLayoutMeasureScope.measure() }
+            val placeable =
+                measurable.measure(
+                    fitPrioritizingWidth(
+                        minWidth = rangeMeasureResult.width,
+                        maxWidth = rangeMeasureResult.width,
+                        minHeight = rangeMeasureResult.height,
+                        maxHeight = rangeMeasureResult.height
+                    )
                 )
-            )
             Pair(placeable, rangeMeasureResult.place)
         }
     } else {
@@ -483,37 +473,39 @@
     onShowTranslation: ((TextAnnotatedStringNode.TextSubstitutionValue) -> Unit)?
 ): Modifier {
     if (selectionController == null) {
-        val staticTextModifier = TextAnnotatedStringElement(
-            text,
-            style,
-            fontFamilyResolver,
-            onTextLayout,
-            overflow,
-            softWrap,
-            maxLines,
-            minLines,
-            placeholders,
-            onPlaceholderLayout,
-            null,
-            color,
-            onShowTranslation
-        )
+        val staticTextModifier =
+            TextAnnotatedStringElement(
+                text,
+                style,
+                fontFamilyResolver,
+                onTextLayout,
+                overflow,
+                softWrap,
+                maxLines,
+                minLines,
+                placeholders,
+                onPlaceholderLayout,
+                null,
+                color,
+                onShowTranslation
+            )
         return this then Modifier /* selection position */ then staticTextModifier
     } else {
-        val selectableTextModifier = SelectableTextAnnotatedStringElement(
-            text,
-            style,
-            fontFamilyResolver,
-            onTextLayout,
-            overflow,
-            softWrap,
-            maxLines,
-            minLines,
-            placeholders,
-            onPlaceholderLayout,
-            selectionController,
-            color
-        )
+        val selectableTextModifier =
+            SelectableTextAnnotatedStringElement(
+                text,
+                style,
+                fontFamilyResolver,
+                onTextLayout,
+                overflow,
+                softWrap,
+                maxLines,
+                minLines,
+                placeholders,
+                onPlaceholderLayout,
+                selectionController,
+                color
+            )
         return this then selectionController.modifier then selectableTextModifier
     }
 }
@@ -536,70 +528,73 @@
     onShowTranslation: ((TextAnnotatedStringNode.TextSubstitutionValue) -> Unit)?
 ) {
 
-    val textScope = if (text.hasLinks()) {
-        remember(text) { TextLinkScope(text) }
-    } else null
+    val textScope =
+        if (text.hasLinks()) {
+            remember(text) { TextLinkScope(text) }
+        } else null
 
     // only adds additional span styles to the existing link annotations, doesn't semantically
     // change the text
-    val styledText: () -> AnnotatedString = if (text.hasLinks()) {
-        remember(text, textScope) {
-            { textScope?.applyAnnotators() ?: text }
+    val styledText: () -> AnnotatedString =
+        if (text.hasLinks()) {
+            remember(text, textScope) { { textScope?.applyAnnotators() ?: text } }
+        } else {
+            { text }
         }
-    } else { { text } }
 
     // do the inline content allocs
-    val (placeholders, inlineComposables) = if (hasInlineContent) {
-        text.resolveInlineContent(
-            inlineContent = inlineContent
-        )
-    } else Pair(null, null)
+    val (placeholders, inlineComposables) =
+        if (hasInlineContent) {
+            text.resolveInlineContent(inlineContent = inlineContent)
+        } else Pair(null, null)
 
-    val measuredPlaceholderPositions = if (hasInlineContent) {
-        remember<MutableState<List<Rect?>?>> { mutableStateOf(null) }
-    } else null
+    val measuredPlaceholderPositions =
+        if (hasInlineContent) {
+            remember<MutableState<List<Rect?>?>> { mutableStateOf(null) }
+        } else null
 
-    val onPlaceholderLayout: ((List<Rect?>) -> Unit)? = if (hasInlineContent) {
-        { measuredPlaceholderPositions?.value = it }
-    } else null
+    val onPlaceholderLayout: ((List<Rect?>) -> Unit)? =
+        if (hasInlineContent) {
+            { measuredPlaceholderPositions?.value = it }
+        } else null
 
     Layout(
         content = {
             textScope?.LinksComposables()
-            inlineComposables?.let {
-                InlineChildren(text = text, inlineContents = it)
-            }
+            inlineComposables?.let { InlineChildren(text = text, inlineContents = it) }
         },
-        modifier = modifier
-            // TODO(b/274781644): Remove this graphicsLayer
-            .graphicsLayer()
-            .textModifier(
-                text = styledText(),
-                style = style,
-                onTextLayout = {
-                    textScope?.textLayoutResult = it
-                    onTextLayout?.invoke(it)
-                },
-                overflow = overflow,
-                softWrap = softWrap,
-                maxLines = maxLines,
-                minLines = minLines,
-                fontFamilyResolver = fontFamilyResolver,
-                placeholders = placeholders,
-                onPlaceholderLayout = onPlaceholderLayout,
-                selectionController = selectionController,
-                color = color,
-                onShowTranslation = onShowTranslation
-            ),
-        measurePolicy = if (!hasInlineContent) {
-            LinksTextMeasurePolicy(
-                shouldMeasureLinks = { textScope?.let { it.shouldMeasureLinks() } ?: false }
-            )
-        } else {
-            TextMeasurePolicy(
-                shouldMeasureLinks = { textScope?.let { it.shouldMeasureLinks() } ?: false },
-                placements = { measuredPlaceholderPositions?.value }
-            )
-        }
+        modifier =
+            modifier
+                // TODO(b/274781644): Remove this graphicsLayer
+                .graphicsLayer()
+                .textModifier(
+                    text = styledText(),
+                    style = style,
+                    onTextLayout = {
+                        textScope?.textLayoutResult = it
+                        onTextLayout?.invoke(it)
+                    },
+                    overflow = overflow,
+                    softWrap = softWrap,
+                    maxLines = maxLines,
+                    minLines = minLines,
+                    fontFamilyResolver = fontFamilyResolver,
+                    placeholders = placeholders,
+                    onPlaceholderLayout = onPlaceholderLayout,
+                    selectionController = selectionController,
+                    color = color,
+                    onShowTranslation = onShowTranslation
+                ),
+        measurePolicy =
+            if (!hasInlineContent) {
+                LinksTextMeasurePolicy(
+                    shouldMeasureLinks = { textScope?.let { it.shouldMeasureLinks() } ?: false }
+                )
+            } else {
+                TextMeasurePolicy(
+                    shouldMeasureLinks = { textScope?.let { it.shouldMeasureLinks() } ?: false },
+                    placements = { measuredPlaceholderPositions?.value }
+                )
+            }
     )
 }
diff --git a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/BasicTextField.kt b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/BasicTextField.kt
index 0a486ad..553688a9 100644
--- a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/BasicTextField.kt
+++ b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/BasicTextField.kt
@@ -91,8 +91,8 @@
  * this composable change via user input or semantics, [TextFieldState.text] gets updated.
  * Similarly, all the programmatic updates made to [state] also reflect on this composable.
  *
- * If you want to add decorations to your text field, such as icon or similar, and increase the
- * hit target area, use the decorator.
+ * If you want to add decorations to your text field, such as icon or similar, and increase the hit
+ * target area, use the decorator.
  *
  * In order to filter (e.g. only allow digits, limit the number of characters), or change (e.g.
  * convert every character to uppercase) the input received from the user, use an
@@ -111,52 +111,52 @@
  *
  * @param state [TextFieldState] object that holds the internal editing state of [BasicTextField].
  * @param modifier optional [Modifier] for this text field.
- * @param enabled controls the enabled state of the [BasicTextField]. When `false`, the text
- * field will be neither editable nor focusable, the input of the text field will not be selectable.
- * @param readOnly controls the editable state of the [BasicTextField]. When `true`, the text
- * field can not be modified, however, a user can focus it and copy text from it. Read-only text
- * fields are usually used to display pre-filled forms that user can not edit.
+ * @param enabled controls the enabled state of the [BasicTextField]. When `false`, the text field
+ *   will be neither editable nor focusable, the input of the text field will not be selectable.
+ * @param readOnly controls the editable state of the [BasicTextField]. When `true`, the text field
+ *   can not be modified, however, a user can focus it and copy text from it. Read-only text fields
+ *   are usually used to display pre-filled forms that user can not edit.
  * @param inputTransformation Optional [InputTransformation] that will be used to transform changes
- * to the [TextFieldState] made by the user. The transformation will be applied to changes made by
- * hardware and software keyboard events, pasting or dropping text, accessibility services, and
- * tests. The transformation will _not_ be applied when changing the [state] programmatically, or
- * when the transformation is changed. If the transformation is changed on an existing text field,
- * it will be applied to the next user edit. the transformation will not immediately affect the
- * current [state].
- * @param textStyle Typographic and graphic style configuration for text content that's displayed
- * in the editor.
+ *   to the [TextFieldState] made by the user. The transformation will be applied to changes made by
+ *   hardware and software keyboard events, pasting or dropping text, accessibility services, and
+ *   tests. The transformation will _not_ be applied when changing the [state] programmatically, or
+ *   when the transformation is changed. If the transformation is changed on an existing text field,
+ *   it will be applied to the next user edit. the transformation will not immediately affect the
+ *   current [state].
+ * @param textStyle Typographic and graphic style configuration for text content that's displayed in
+ *   the editor.
  * @param keyboardOptions Software keyboard options that contain configurations such as
- * [KeyboardType] and [ImeAction].
- * @param onKeyboardAction Called when the user presses the action button in the input method
- * editor (IME), or by pressing the enter key on a hardware keyboard. By default this parameter
- * is null, and would execute the default behavior for a received IME Action e.g., [ImeAction.Done]
- * would close the keyboard, [ImeAction.Next] would switch the focus to the next focusable item on
- * the screen.
- * @param lineLimits Whether the text field should be [SingleLine], scroll horizontally, and
- * ignore newlines; or [MultiLine] and grow and scroll vertically. If [SingleLine] is passed, all
- * newline characters ('\n') within the text will be replaced with regular whitespace (' '),
- * ensuring that the contents of the text field are presented in a single line.
+ *   [KeyboardType] and [ImeAction].
+ * @param onKeyboardAction Called when the user presses the action button in the input method editor
+ *   (IME), or by pressing the enter key on a hardware keyboard. By default this parameter is null,
+ *   and would execute the default behavior for a received IME Action e.g., [ImeAction.Done] would
+ *   close the keyboard, [ImeAction.Next] would switch the focus to the next focusable item on the
+ *   screen.
+ * @param lineLimits Whether the text field should be [SingleLine], scroll horizontally, and ignore
+ *   newlines; or [MultiLine] and grow and scroll vertically. If [SingleLine] is passed, all newline
+ *   characters ('\n') within the text will be replaced with regular whitespace (' '), ensuring that
+ *   the contents of the text field are presented in a single line.
  * @param onTextLayout Callback that is executed when the text layout becomes queryable. The
- * callback receives a function that returns a [TextLayoutResult] if the layout can be calculated,
- * or null if it cannot. The function reads the layout result from a snapshot state object, and will
- * invalidate its caller when the layout result changes. A [TextLayoutResult] object contains
- * paragraph information, size of the text, baselines and other details. The callback can be used to
- * add additional decoration or functionality to the text. For example, to draw a cursor or
- * selection around the text. [Density] scope is the one that was used while creating the given text
- * layout.
+ *   callback receives a function that returns a [TextLayoutResult] if the layout can be calculated,
+ *   or null if it cannot. The function reads the layout result from a snapshot state object, and
+ *   will invalidate its caller when the layout result changes. A [TextLayoutResult] object contains
+ *   paragraph information, size of the text, baselines and other details. The callback can be used
+ *   to add additional decoration or functionality to the text. For example, to draw a cursor or
+ *   selection around the text. [Density] scope is the one that was used while creating the given
+ *   text layout.
  * @param interactionSource the [MutableInteractionSource] representing the stream of [Interaction]s
- * for this TextField. You can create and pass in your own remembered [MutableInteractionSource]
- * if you want to observe [Interaction]s and customize the appearance / behavior of this TextField
- * for different [Interaction]s.
+ *   for this TextField. You can create and pass in your own remembered [MutableInteractionSource]
+ *   if you want to observe [Interaction]s and customize the appearance / behavior of this TextField
+ *   for different [Interaction]s.
  * @param cursorBrush [Brush] to paint cursor with. If [SolidColor] with [Color.Unspecified]
- * provided, then no cursor will be drawn.
+ *   provided, then no cursor will be drawn.
  * @param outputTransformation An [OutputTransformation] that transforms how the contents of the
- * text field are presented.
+ *   text field are presented.
  * @param decorator Allows to add decorations around text field, such as icon, placeholder, helper
- * messages or similar, and automatically increase the hit target area of the text field.
+ *   messages or similar, and automatically increase the hit target area of the text field.
  * @param scrollState Scroll state that manages either horizontal or vertical scroll of TextField.
- * If [lineLimits] is [SingleLine], this text field is treated as single line with horizontal
- * scroll behavior. In other cases the text field becomes vertically scrollable.
+ *   If [lineLimits] is [SingleLine], this text field is treated as single line with horizontal
+ *   scroll behavior. In other cases the text field becomes vertically scrollable.
  *
  * @sample androidx.compose.foundation.samples.BasicTextFieldDecoratorSample
  *
@@ -210,7 +210,7 @@
  * Internal core text field that accepts a [CodepointTransformation].
  *
  * @param codepointTransformation Visual transformation interface that provides a 1-to-1 mapping of
- * codepoints.
+ *   codepoints.
  */
 // This takes a composable lambda, but it is not primarily a container.
 @OptIn(ExperimentalFoundationApi::class)
@@ -249,39 +249,39 @@
     val isDragHovered = interactionSource.collectIsHoveredAsState().value
     val isWindowFocused = windowInfo.isWindowFocused
 
-    val transformedState = remember(
-        state,
-        codepointTransformation,
-        outputTransformation
-    ) {
-        // First prefer provided codepointTransformation if not null, e.g. BasicSecureTextField
-        // would send PasswordTransformation. Second, apply a SingleLineCodepointTransformation if
-        // text field is configured to be single line. Else, don't apply any visual transformation.
-        val appliedCodepointTransformation = codepointTransformation
-            ?: SingleLineCodepointTransformation.takeIf { singleLine }
-        TransformedTextFieldState(
-            textFieldState = state,
-            inputTransformation = inputTransformation,
-            codepointTransformation = appliedCodepointTransformation,
-            outputTransformation = outputTransformation
-        )
-    }
+    val transformedState =
+        remember(state, codepointTransformation, outputTransformation) {
+            // First prefer provided codepointTransformation if not null, e.g. BasicSecureTextField
+            // would send PasswordTransformation. Second, apply a SingleLineCodepointTransformation
+            // if
+            // text field is configured to be single line. Else, don't apply any visual
+            // transformation.
+            val appliedCodepointTransformation =
+                codepointTransformation ?: SingleLineCodepointTransformation.takeIf { singleLine }
+            TransformedTextFieldState(
+                textFieldState = state,
+                inputTransformation = inputTransformation,
+                codepointTransformation = appliedCodepointTransformation,
+                outputTransformation = outputTransformation
+            )
+        }
 
     // Invalidate textLayoutState if TextFieldState itself has changed, since TextLayoutState
     // would be carrying an invalid TextFieldState in its nonMeasureInputs.
     val textLayoutState = remember(transformedState) { TextLayoutState() }
 
-    val textFieldSelectionState = remember(transformedState) {
-        TextFieldSelectionState(
-            textFieldState = transformedState,
-            textLayoutState = textLayoutState,
-            density = density,
-            enabled = enabled,
-            readOnly = readOnly,
-            isFocused = isFocused && isWindowFocused,
-            isPassword = isPassword,
-        )
-    }
+    val textFieldSelectionState =
+        remember(transformedState) {
+            TextFieldSelectionState(
+                textFieldState = transformedState,
+                textLayoutState = textLayoutState,
+                density = density,
+                enabled = enabled,
+                readOnly = readOnly,
+                isFocused = isFocused && isWindowFocused,
+                isPassword = isPassword,
+            )
+        }
     val currentHapticFeedback = LocalHapticFeedback.current
     val currentClipboardManager = LocalClipboardManager.current
     val currentTextToolbar = LocalTextToolbar.current
@@ -301,44 +301,43 @@
         )
     }
 
-    DisposableEffect(textFieldSelectionState) {
-        onDispose {
-            textFieldSelectionState.dispose()
-        }
-    }
+    DisposableEffect(textFieldSelectionState) { onDispose { textFieldSelectionState.dispose() } }
 
-    val decorationModifiers = modifier
-        .then(
-            // semantics + some focus + input session + touch to focus
-            TextFieldDecoratorModifier(
-                textFieldState = transformedState,
-                textLayoutState = textLayoutState,
-                textFieldSelectionState = textFieldSelectionState,
-                filter = inputTransformation,
-                enabled = enabled,
-                readOnly = readOnly,
-                keyboardOptions = keyboardOptions,
-                keyboardActionHandler = onKeyboardAction,
-                singleLine = singleLine,
-                interactionSource = interactionSource
+    val decorationModifiers =
+        modifier
+            .then(
+                // semantics + some focus + input session + touch to focus
+                TextFieldDecoratorModifier(
+                    textFieldState = transformedState,
+                    textLayoutState = textLayoutState,
+                    textFieldSelectionState = textFieldSelectionState,
+                    filter = inputTransformation,
+                    enabled = enabled,
+                    readOnly = readOnly,
+                    keyboardOptions = keyboardOptions,
+                    keyboardActionHandler = onKeyboardAction,
+                    singleLine = singleLine,
+                    interactionSource = interactionSource
+                )
             )
-        )
-        .focusable(interactionSource = interactionSource, enabled = enabled)
-        .scrollable(
-            state = scrollState,
-            orientation = orientation,
-            // Disable scrolling when textField is disabled or another dragging gesture is taking
-            // place
-            enabled = enabled &&
-                textFieldSelectionState.directDragGestureInitiator == InputType.None,
-            reverseDirection = ScrollableDefaults.reverseDirection(
-                layoutDirection = layoutDirection,
+            .focusable(interactionSource = interactionSource, enabled = enabled)
+            .scrollable(
+                state = scrollState,
                 orientation = orientation,
-                reverseScrolling = false
-            ),
-            interactionSource = interactionSource,
-        )
-        .pointerHoverIcon(textPointerIcon)
+                // Disable scrolling when textField is disabled or another dragging gesture is
+                // taking
+                // place
+                enabled =
+                    enabled && textFieldSelectionState.directDragGestureInitiator == InputType.None,
+                reverseDirection =
+                    ScrollableDefaults.reverseDirection(
+                        layoutDirection = layoutDirection,
+                        orientation = orientation,
+                        reverseScrolling = false
+                    ),
+                interactionSource = interactionSource,
+            )
+            .pointerHoverIcon(textPointerIcon)
 
     Box(decorationModifiers, propagateMinConstraints = true) {
         ContextMenuArea(textFieldSelectionState, enabled) {
@@ -356,53 +355,52 @@
 
                 Box(
                     propagateMinConstraints = true,
-                    modifier = Modifier
-                        .heightIn(min = textLayoutState.minHeightForSingleLineField)
-                        .heightInLines(
-                            textStyle = textStyle,
-                            minLines = minLines,
-                            maxLines = maxLines
-                        )
-                        .textFieldMinSize(textStyle)
-                        .clipToBounds()
-                        .then(
-                            TextFieldCoreModifier(
-                                isFocused = isFocused && isWindowFocused,
-                                isDragHovered = isDragHovered,
-                                textLayoutState = textLayoutState,
-                                textFieldState = transformedState,
-                                textFieldSelectionState = textFieldSelectionState,
-                                cursorBrush = cursorBrush,
-                                writeable = enabled && !readOnly,
-                                scrollState = scrollState,
-                                orientation = orientation
+                    modifier =
+                        Modifier.heightIn(min = textLayoutState.minHeightForSingleLineField)
+                            .heightInLines(
+                                textStyle = textStyle,
+                                minLines = minLines,
+                                maxLines = maxLines
                             )
-                        )
-                ) {
-                    Box(
-                        modifier = Modifier
-                            .bringIntoViewRequester(textLayoutState.bringIntoViewRequester)
+                            .textFieldMinSize(textStyle)
+                            .clipToBounds()
                             .then(
-                                TextFieldTextLayoutModifier(
+                                TextFieldCoreModifier(
+                                    isFocused = isFocused && isWindowFocused,
+                                    isDragHovered = isDragHovered,
                                     textLayoutState = textLayoutState,
                                     textFieldState = transformedState,
-                                    textStyle = textStyle,
-                                    singleLine = singleLine,
-                                    onTextLayout = onTextLayout
+                                    textFieldSelectionState = textFieldSelectionState,
+                                    cursorBrush = cursorBrush,
+                                    writeable = enabled && !readOnly,
+                                    scrollState = scrollState,
+                                    orientation = orientation
                                 )
                             )
+                ) {
+                    Box(
+                        modifier =
+                            Modifier.bringIntoViewRequester(textLayoutState.bringIntoViewRequester)
+                                .then(
+                                    TextFieldTextLayoutModifier(
+                                        textLayoutState = textLayoutState,
+                                        textFieldState = transformedState,
+                                        textStyle = textStyle,
+                                        singleLine = singleLine,
+                                        onTextLayout = onTextLayout
+                                    )
+                                )
                     )
 
-                    if (enabled && isFocused &&
-                        isWindowFocused && textFieldSelectionState.isInTouchMode
+                    if (
+                        enabled &&
+                            isFocused &&
+                            isWindowFocused &&
+                            textFieldSelectionState.isInTouchMode
                     ) {
-                        TextFieldSelectionHandles(
-                            selectionState = textFieldSelectionState
-                        )
+                        TextFieldSelectionHandles(selectionState = textFieldSelectionState)
                         if (!readOnly) {
-                            TextFieldCursorHandle(
-                                selectionState = textFieldSelectionState
-                            )
+                            TextFieldCursorHandle(selectionState = textFieldSelectionState)
                         }
                     }
                 }
@@ -415,19 +413,15 @@
 internal fun TextFieldCursorHandle(selectionState: TextFieldSelectionState) {
     // Does not recompose if only position of the handle changes.
     val cursorHandleState by remember {
-        derivedStateOf {
-            selectionState.getCursorHandleState(includePosition = false)
-        }
+        derivedStateOf { selectionState.getCursorHandleState(includePosition = false) }
     }
     if (cursorHandleState.visible) {
         CursorHandle(
             offsetProvider = {
-                selectionState
-                    .getCursorHandleState(includePosition = true)
-                    .position
+                selectionState.getCursorHandleState(includePosition = true).position
             },
-            modifier = Modifier
-                .pointerInput(selectionState) {
+            modifier =
+                Modifier.pointerInput(selectionState) {
                     with(selectionState) { cursorHandleGestures() }
                 },
             minTouchTargetSize = MinTouchTargetSizeForHandles,
@@ -436,9 +430,7 @@
 }
 
 @Composable
-internal fun TextFieldSelectionHandles(
-    selectionState: TextFieldSelectionState
-) {
+internal fun TextFieldSelectionHandles(selectionState: TextFieldSelectionState) {
     // Does not recompose if only position of the handle changes.
     val startHandleState by remember {
         derivedStateOf {
@@ -455,9 +447,10 @@
             isStartHandle = true,
             direction = startHandleState.direction,
             handlesCrossed = startHandleState.handlesCrossed,
-            modifier = Modifier.pointerInput(selectionState) {
-                with(selectionState) { selectionHandleGestures(true) }
-            },
+            modifier =
+                Modifier.pointerInput(selectionState) {
+                    with(selectionState) { selectionHandleGestures(true) }
+                },
             minTouchTargetSize = MinTouchTargetSizeForHandles,
         )
     }
@@ -478,9 +471,10 @@
             isStartHandle = false,
             direction = endHandleState.direction,
             handlesCrossed = endHandleState.handlesCrossed,
-            modifier = Modifier.pointerInput(selectionState) {
-                with(selectionState) { selectionHandleGestures(false) }
-            },
+            modifier =
+                Modifier.pointerInput(selectionState) {
+                    with(selectionState) { selectionHandleGestures(false) }
+                },
             minTouchTargetSize = MinTouchTargetSizeForHandles,
         )
     }
@@ -500,8 +494,8 @@
 private val MinTouchTargetSizeForHandles = DpSize(40.dp, 40.dp)
 
 /**
- * Basic composable that enables users to edit text via hardware or software keyboard, but
- * provides no decorations like hint or placeholder.
+ * Basic composable that enables users to edit text via hardware or software keyboard, but provides
+ * no decorations like hint or placeholder.
  *
  * Whenever the user edits the text, [onValueChange] is called with the most up to date state
  * represented by [String] with which developer is expected to update their state.
@@ -514,9 +508,9 @@
  * order to actually display and continue to edit that text in the field. The value you feed back
  * into the field may be different than the one provided to the [onValueChange] callback, however
  * the following caveats apply:
- * - The new value must be provided to [BasicTextField] immediately (i.e. by the next frame), or
- *   the text field may appear to glitch, e.g. the cursor may jump around. For more information
- *   about this requirement, see
+ * - The new value must be provided to [BasicTextField] immediately (i.e. by the next frame), or the
+ *   text field may appear to glitch, e.g. the cursor may jump around. For more information about
+ *   this requirement, see
  *   [this article](https://developer.android.com/jetpack/compose/text/user-input#state-practices).
  * - The value fed back into the field may be different from the one passed to [onValueChange],
  *   although this may result in the input connection being restarted, which can make the keyboard
@@ -531,64 +525,68 @@
  * needed.
  *
  * Example usage:
+ *
  * @sample androidx.compose.foundation.samples.BasicTextFieldWithStringSample
  *
  * For example, if you need to include a placeholder in your TextField, you can write a composable
  * using the decoration box like this:
+ *
  * @sample androidx.compose.foundation.samples.PlaceholderBasicTextFieldSample
  *
- * If you want to add decorations to your text field, such as icon or similar, and increase the
- * hit target area, use the decoration box:
+ * If you want to add decorations to your text field, such as icon or similar, and increase the hit
+ * target area, use the decoration box:
+ *
  * @sample androidx.compose.foundation.samples.TextFieldWithIconSample
  *
  * In order to create formatted text field, for example for entering a phone number or a social
  * security number, use a [visualTransformation] parameter. Below is the example of the text field
  * for entering a credit card number:
+ *
  * @sample androidx.compose.foundation.samples.CreditCardSample
  *
  * Note: This overload does not support [KeyboardOptions.showKeyboardOnFocus].
  *
  * @param value the input [String] text to be shown in the text field
  * @param onValueChange the callback that is triggered when the input service updates the text. An
- * updated text comes as a parameter of the callback
+ *   updated text comes as a parameter of the callback
  * @param modifier optional [Modifier] for this text field.
- * @param enabled controls the enabled state of the [BasicTextField]. When `false`, the text
- * field will be neither editable nor focusable, the input of the text field will not be selectable
- * @param readOnly controls the editable state of the [BasicTextField]. When `true`, the text
- * field can not be modified, however, a user can focus it and copy text from it. Read-only text
- * fields are usually used to display pre-filled forms that user can not edit
+ * @param enabled controls the enabled state of the [BasicTextField]. When `false`, the text field
+ *   will be neither editable nor focusable, the input of the text field will not be selectable
+ * @param readOnly controls the editable state of the [BasicTextField]. When `true`, the text field
+ *   can not be modified, however, a user can focus it and copy text from it. Read-only text fields
+ *   are usually used to display pre-filled forms that user can not edit
  * @param textStyle Style configuration that applies at character level such as color, font etc.
  * @param keyboardOptions software keyboard options that contains configuration such as
- * [KeyboardType] and [ImeAction].
- * @param keyboardActions when the input service emits an IME action, the corresponding callback
- * is called. Note that this IME action may be different from what you specified in
- * [KeyboardOptions.imeAction].
- * @param singleLine when set to true, this text field becomes a single horizontally scrolling
- * text field instead of wrapping onto multiple lines. The keyboard will be informed to not show
- * the return key as the [ImeAction]. [maxLines] and [minLines] are ignored as both are
- * automatically set to 1.
+ *   [KeyboardType] and [ImeAction].
+ * @param keyboardActions when the input service emits an IME action, the corresponding callback is
+ *   called. Note that this IME action may be different from what you specified in
+ *   [KeyboardOptions.imeAction].
+ * @param singleLine when set to true, this text field becomes a single horizontally scrolling text
+ *   field instead of wrapping onto multiple lines. The keyboard will be informed to not show the
+ *   return key as the [ImeAction]. [maxLines] and [minLines] are ignored as both are automatically
+ *   set to 1.
  * @param maxLines the maximum height in terms of maximum number of visible lines. It is required
- * that 1 <= [minLines] <= [maxLines]. This parameter is ignored when [singleLine] is true.
+ *   that 1 <= [minLines] <= [maxLines]. This parameter is ignored when [singleLine] is true.
  * @param minLines the minimum height in terms of minimum number of visible lines. It is required
- * that 1 <= [minLines] <= [maxLines]. This parameter is ignored when [singleLine] is true.
+ *   that 1 <= [minLines] <= [maxLines]. This parameter is ignored when [singleLine] is true.
  * @param visualTransformation The visual transformation filter for changing the visual
- * representation of the input. By default no visual transformation is applied.
+ *   representation of the input. By default no visual transformation is applied.
  * @param onTextLayout Callback that is executed when a new text layout is calculated. A
- * [TextLayoutResult] object that callback provides contains paragraph information, size of the
- * text, baselines and other details. The callback can be used to add additional decoration or
- * functionality to the text. For example, to draw a cursor or selection around the text.
+ *   [TextLayoutResult] object that callback provides contains paragraph information, size of the
+ *   text, baselines and other details. The callback can be used to add additional decoration or
+ *   functionality to the text. For example, to draw a cursor or selection around the text.
  * @param interactionSource an optional hoisted [MutableInteractionSource] for observing and
- * emitting [Interaction]s for this text field. You can use this to change the text field's
- * appearance or preview the text field in different states. Note that if `null` is provided,
- * interactions will still happen internally.
+ *   emitting [Interaction]s for this text field. You can use this to change the text field's
+ *   appearance or preview the text field in different states. Note that if `null` is provided,
+ *   interactions will still happen internally.
  * @param cursorBrush [Brush] to paint cursor with. If [SolidColor] with [Color.Unspecified]
- * provided, there will be no cursor drawn
- * @param decorationBox Composable lambda that allows to add decorations around text field, such
- * as icon, placeholder, helper messages or similar, and automatically increase the hit target area
- * of the text field. To allow you to control the placement of the inner text field relative to your
- * decorations, the text field implementation will pass in a framework-controlled composable
- * parameter "innerTextField" to the decorationBox lambda you provide. You must call
- * innerTextField exactly once.
+ *   provided, there will be no cursor drawn
+ * @param decorationBox Composable lambda that allows to add decorations around text field, such as
+ *   icon, placeholder, helper messages or similar, and automatically increase the hit target area
+ *   of the text field. To allow you to control the placement of the inner text field relative to
+ *   your decorations, the text field implementation will pass in a framework-controlled composable
+ *   parameter "innerTextField" to the decorationBox lambda you provide. You must call
+ *   innerTextField exactly once.
  */
 @Composable
 fun BasicTextField(
@@ -619,8 +617,10 @@
     val textFieldValue = textFieldValueState.copy(text = value)
 
     SideEffect {
-        if (textFieldValue.selection != textFieldValueState.selection ||
-            textFieldValue.composition != textFieldValueState.composition) {
+        if (
+            textFieldValue.selection != textFieldValueState.selection ||
+                textFieldValue.composition != textFieldValueState.composition
+        ) {
             textFieldValueState = textFieldValue
         }
     }
@@ -659,21 +659,21 @@
 }
 
 /**
- * Basic composable that enables users to edit text via hardware or software keyboard, but
- * provides no decorations like hint or placeholder.
+ * Basic composable that enables users to edit text via hardware or software keyboard, but provides
+ * no decorations like hint or placeholder.
  *
  * Whenever the user edits the text, [onValueChange] is called with the most up to date state
- * represented by [TextFieldValue]. [TextFieldValue] contains the text entered by user, as well
- * as selection, cursor and text composition information. Please check [TextFieldValue] for the
+ * represented by [TextFieldValue]. [TextFieldValue] contains the text entered by user, as well as
+ * selection, cursor and text composition information. Please check [TextFieldValue] for the
  * description of its contents.
  *
  * It is crucial that the value provided to the [onValueChange] is fed back into [BasicTextField] in
  * order to actually display and continue to edit that text in the field. The value you feed back
  * into the field may be different than the one provided to the [onValueChange] callback, however
  * the following caveats apply:
- * - The new value must be provided to [BasicTextField] immediately (i.e. by the next frame), or
- *   the text field may appear to glitch, e.g. the cursor may jump around. For more information
- *   about this requirement, see
+ * - The new value must be provided to [BasicTextField] immediately (i.e. by the next frame), or the
+ *   text field may appear to glitch, e.g. the cursor may jump around. For more information about
+ *   this requirement, see
  *   [this article](https://developer.android.com/jetpack/compose/text/user-input#state-practices).
  * - The value fed back into the field may be different from the one passed to [onValueChange],
  *   although this may result in the input connection being restarted, which can make the keyboard
@@ -688,59 +688,62 @@
  * needed.
  *
  * Example usage:
+ *
  * @sample androidx.compose.foundation.samples.BasicTextFieldSample
  *
  * For example, if you need to include a placeholder in your TextField, you can write a composable
  * using the decoration box like this:
+ *
  * @sample androidx.compose.foundation.samples.PlaceholderBasicTextFieldSample
  *
- * If you want to add decorations to your text field, such as icon or similar, and increase the
- * hit target area, use the decoration box:
+ * If you want to add decorations to your text field, such as icon or similar, and increase the hit
+ * target area, use the decoration box:
+ *
  * @sample androidx.compose.foundation.samples.TextFieldWithIconSample
  *
  * Note: This overload does not support [KeyboardOptions.showKeyboardOnFocus].
  *
  * @param value The [androidx.compose.ui.text.input.TextFieldValue] to be shown in the
- * [BasicTextField].
+ *   [BasicTextField].
  * @param onValueChange Called when the input service updates the values in [TextFieldValue].
  * @param modifier optional [Modifier] for this text field.
- * @param enabled controls the enabled state of the [BasicTextField]. When `false`, the text
- * field will be neither editable nor focusable, the input of the text field will not be selectable
- * @param readOnly controls the editable state of the [BasicTextField]. When `true`, the text
- * field can not be modified, however, a user can focus it and copy text from it. Read-only text
- * fields are usually used to display pre-filled forms that user can not edit
+ * @param enabled controls the enabled state of the [BasicTextField]. When `false`, the text field
+ *   will be neither editable nor focusable, the input of the text field will not be selectable
+ * @param readOnly controls the editable state of the [BasicTextField]. When `true`, the text field
+ *   can not be modified, however, a user can focus it and copy text from it. Read-only text fields
+ *   are usually used to display pre-filled forms that user can not edit
  * @param textStyle Style configuration that applies at character level such as color, font etc.
  * @param keyboardOptions software keyboard options that contains configuration such as
- * [KeyboardType] and [ImeAction].
- * @param keyboardActions when the input service emits an IME action, the corresponding callback
- * is called. Note that this IME action may be different from what you specified in
- * [KeyboardOptions.imeAction].
- * @param singleLine when set to true, this text field becomes a single horizontally scrolling
- * text field instead of wrapping onto multiple lines. The keyboard will be informed to not show
- * the return key as the [ImeAction]. [maxLines] and [minLines] are ignored as both are
- * automatically set to 1.
+ *   [KeyboardType] and [ImeAction].
+ * @param keyboardActions when the input service emits an IME action, the corresponding callback is
+ *   called. Note that this IME action may be different from what you specified in
+ *   [KeyboardOptions.imeAction].
+ * @param singleLine when set to true, this text field becomes a single horizontally scrolling text
+ *   field instead of wrapping onto multiple lines. The keyboard will be informed to not show the
+ *   return key as the [ImeAction]. [maxLines] and [minLines] are ignored as both are automatically
+ *   set to 1.
  * @param maxLines the maximum height in terms of maximum number of visible lines. It is required
- * that 1 <= [minLines] <= [maxLines]. This parameter is ignored when [singleLine] is true.
+ *   that 1 <= [minLines] <= [maxLines]. This parameter is ignored when [singleLine] is true.
  * @param minLines the minimum height in terms of minimum number of visible lines. It is required
- * that 1 <= [minLines] <= [maxLines]. This parameter is ignored when [singleLine] is true.
+ *   that 1 <= [minLines] <= [maxLines]. This parameter is ignored when [singleLine] is true.
  * @param visualTransformation The visual transformation filter for changing the visual
- * representation of the input. By default no visual transformation is applied.
+ *   representation of the input. By default no visual transformation is applied.
  * @param onTextLayout Callback that is executed when a new text layout is calculated. A
- * [TextLayoutResult] object that callback provides contains paragraph information, size of the
- * text, baselines and other details. The callback can be used to add additional decoration or
- * functionality to the text. For example, to draw a cursor or selection around the text.
+ *   [TextLayoutResult] object that callback provides contains paragraph information, size of the
+ *   text, baselines and other details. The callback can be used to add additional decoration or
+ *   functionality to the text. For example, to draw a cursor or selection around the text.
  * @param interactionSource an optional hoisted [MutableInteractionSource] for observing and
- * emitting [Interaction]s for this text field. You can use this to change the text field's
- * appearance or preview the text field in different states. Note that if `null` is provided,
- * interactions will still happen internally.
+ *   emitting [Interaction]s for this text field. You can use this to change the text field's
+ *   appearance or preview the text field in different states. Note that if `null` is provided,
+ *   interactions will still happen internally.
  * @param cursorBrush [Brush] to paint cursor with. If [SolidColor] with [Color.Unspecified]
- * provided, there will be no cursor drawn
- * @param decorationBox Composable lambda that allows to add decorations around text field, such
- * as icon, placeholder, helper messages or similar, and automatically increase the hit target area
- * of the text field. To allow you to control the placement of the inner text field relative to your
- * decorations, the text field implementation will pass in a framework-controlled composable
- * parameter "innerTextField" to the decorationBox lambda you provide. You must call
- * innerTextField exactly once.
+ *   provided, there will be no cursor drawn
+ * @param decorationBox Composable lambda that allows to add decorations around text field, such as
+ *   icon, placeholder, helper messages or similar, and automatically increase the hit target area
+ *   of the text field. To allow you to control the placement of the inner text field relative to
+ *   your decorations, the text field implementation will pass in a framework-controlled composable
+ *   parameter "innerTextField" to the decorationBox lambda you provide. You must call
+ *   innerTextField exactly once.
  */
 @Composable
 fun BasicTextField(
diff --git a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/ClickableText.kt b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/ClickableText.kt
index d342bf5..efb2a7a 100644
--- a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/ClickableText.kt
+++ b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/ClickableText.kt
@@ -36,8 +36,7 @@
 /**
  * A continent version of [BasicText] component to be able to handle click event on the text.
  *
- * This is a shorthand of [BasicText] with [pointerInput] to be able to handle click
- * event easily.
+ * This is a shorthand of [BasicText] with [pointerInput] to be able to handle click event easily.
  *
  * @sample androidx.compose.foundation.samples.ClickableText
  *
@@ -45,30 +44,30 @@
  *
  * @sample androidx.compose.foundation.samples.LongClickableText
  *
- * @see BasicText
- * @see androidx.compose.ui.input.pointer.pointerInput
- * @see androidx.compose.foundation.gestures.detectTapGestures
- *
  * @param text The text to be displayed.
  * @param modifier Modifier to apply to this layout node.
  * @param style Style configuration for the text such as color, font, line height etc.
  * @param softWrap Whether the text should break at soft line breaks. If false, the glyphs in the
- * text will be positioned as if there was unlimited horizontal space. If [softWrap] is false,
- * [overflow] and [TextAlign] may have unexpected effects.
+ *   text will be positioned as if there was unlimited horizontal space. If [softWrap] is false,
+ *   [overflow] and [TextAlign] may have unexpected effects.
  * @param overflow How visual overflow should be handled.
- * @param maxLines An optional maximum number of lines for the text to span, wrapping if
- * necessary. If the text exceeds the given number of lines, it will be truncated according to
- * [overflow] and [softWrap]. If it is not null, then it must be greater than zero.
+ * @param maxLines An optional maximum number of lines for the text to span, wrapping if necessary.
+ *   If the text exceeds the given number of lines, it will be truncated according to [overflow] and
+ *   [softWrap]. If it is not null, then it must be greater than zero.
  * @param onTextLayout Callback that is executed when a new text layout is calculated. A
- * [TextLayoutResult] object that callback provides contains paragraph information, size of the
- * text, baselines and other details. The callback can be used to add additional decoration or
- * functionality to the text. For example, to draw selection around the text.
- * @param onClick Callback that is executed when users click the text. This callback is called
- * with clicked character's offset.
+ *   [TextLayoutResult] object that callback provides contains paragraph information, size of the
+ *   text, baselines and other details. The callback can be used to add additional decoration or
+ *   functionality to the text. For example, to draw selection around the text.
+ * @param onClick Callback that is executed when users click the text. This callback is called with
+ *   clicked character's offset.
  *
  * Note: this composable is now deprecated. Instead, use regular [androidx.compose.material3.Text]
  * or [androidx.compose.foundation.text.BasicText] and pass an AnnotatedString that contains a
  * [androidx.compose.ui.text.LinkAnnotation].
+ *
+ * @see BasicText
+ * @see androidx.compose.ui.input.pointer.pointerInput
+ * @see androidx.compose.foundation.gestures.detectTapGestures
  */
 @Composable
 @Deprecated("Use Text or BasicText and pass an AnnotatedString that contains a LinkAnnotation")
@@ -83,13 +82,14 @@
     onClick: (Int) -> Unit
 ) {
     val layoutResult = remember { mutableStateOf<TextLayoutResult?>(null) }
-    val pressIndicator = Modifier.pointerInput(onClick) {
-        detectTapGestures { pos ->
-            layoutResult.value?.let { layoutResult ->
-                onClick(layoutResult.getOffsetForPosition(pos))
+    val pressIndicator =
+        Modifier.pointerInput(onClick) {
+            detectTapGestures { pos ->
+                layoutResult.value?.let { layoutResult ->
+                    onClick(layoutResult.getOffsetForPosition(pos))
+                }
             }
         }
-    }
 
     BasicText(
         text = text,
@@ -108,8 +108,7 @@
 /**
  * A continent version of [BasicText] component to be able to handle click event on the text.
  *
- * This is a shorthand of [BasicText] with [pointerInput] to be able to handle click
- * event easily.
+ * This is a shorthand of [BasicText] with [pointerInput] to be able to handle click event easily.
  *
  * @sample androidx.compose.foundation.samples.ClickableText
  *
@@ -117,33 +116,33 @@
  *
  * @sample androidx.compose.foundation.samples.LongClickableText
  *
- * @see BasicText
- * @see androidx.compose.ui.input.pointer.pointerInput
- * @see androidx.compose.foundation.gestures.detectTapGestures
- *
  * @param text The text to be displayed.
  * @param modifier Modifier to apply to this layout node.
  * @param style Style configuration for the text such as color, font, line height etc.
  * @param softWrap Whether the text should break at soft line breaks. If false, the glyphs in the
- * text will be positioned as if there was unlimited horizontal space. If [softWrap] is false,
- * [overflow] and [TextAlign] may have unexpected effects.
+ *   text will be positioned as if there was unlimited horizontal space. If [softWrap] is false,
+ *   [overflow] and [TextAlign] may have unexpected effects.
  * @param overflow How visual overflow should be handled.
- * @param maxLines An optional maximum number of lines for the text to span, wrapping if
- * necessary. If the text exceeds the given number of lines, it will be truncated according to
- * [overflow] and [softWrap]. If it is not null, then it must be greater than zero.
+ * @param maxLines An optional maximum number of lines for the text to span, wrapping if necessary.
+ *   If the text exceeds the given number of lines, it will be truncated according to [overflow] and
+ *   [softWrap]. If it is not null, then it must be greater than zero.
  * @param onTextLayout Callback that is executed when a new text layout is calculated. A
- * [TextLayoutResult] object that callback provides contains paragraph information, size of the
- * text, baselines and other details. The callback can be used to add additional decoration or
- * functionality to the text. For example, to draw selection around the text.
+ *   [TextLayoutResult] object that callback provides contains paragraph information, size of the
+ *   text, baselines and other details. The callback can be used to add additional decoration or
+ *   functionality to the text. For example, to draw selection around the text.
  * @param onHover Callback that is executed when user hovers over the text with a mouse or trackpad.
- * This callback is called with the hovered character's offset or null if the cursor is no longer
- * hovering this.
- * @param onClick Callback that is executed when users click the text. This callback is called
- * with clicked character's offset.
+ *   This callback is called with the hovered character's offset or null if the cursor is no longer
+ *   hovering this.
+ * @param onClick Callback that is executed when users click the text. This callback is called with
+ *   clicked character's offset.
  *
  * Note: this composable is now deprecated. Instead, use regular [androidx.compose.material3.Text]
  * or [androidx.compose.foundation.text.BasicText] and pass an AnnotatedString that contains a
  * [androidx.compose.ui.text.LinkAnnotation].
+ *
+ * @see BasicText
+ * @see androidx.compose.ui.input.pointer.pointerInput
+ * @see androidx.compose.foundation.gestures.detectTapGestures
  */
 @ExperimentalFoundationApi // when removing this experimental annotation,
 // onHover should be nullable with null as default. The other ClickableText
@@ -164,25 +163,27 @@
     val layoutResult = remember { mutableStateOf<TextLayoutResult?>(null) }
     val coroutineScope = rememberCoroutineScope()
 
-    fun getOffset(positionOffset: Offset): Int? = layoutResult.value
-        ?.multiParagraph
-        ?.takeIf { it.containsWithinBounds(positionOffset) }
-        ?.getOffsetForPosition(positionOffset)
+    fun getOffset(positionOffset: Offset): Int? =
+        layoutResult.value
+            ?.multiParagraph
+            ?.takeIf { it.containsWithinBounds(positionOffset) }
+            ?.getOffsetForPosition(positionOffset)
 
-    val pointerInputModifier = Modifier.pointerInput(onClick, onHover) {
-        coroutineScope.launch {
-            var previousIndex: Int? = null
-            detectMoves(PointerEventPass.Main) { pos ->
-                val index = getOffset(pos)
-                if (previousIndex != index) {
-                    previousIndex = index
-                    onHover(index)
+    val pointerInputModifier =
+        Modifier.pointerInput(onClick, onHover) {
+            coroutineScope.launch {
+                var previousIndex: Int? = null
+                detectMoves(PointerEventPass.Main) { pos ->
+                    val index = getOffset(pos)
+                    if (previousIndex != index) {
+                        previousIndex = index
+                        onHover(index)
+                    }
                 }
             }
-        }
 
-        detectTapGestures { pos -> getOffset(pos)?.let(onClick) }
-    }
+            detectTapGestures { pos -> getOffset(pos)?.let(onClick) }
+        }
 
     BasicText(
         text = text,
diff --git a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/ContextMenu.kt b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/ContextMenu.kt
index 3d43763..de2540a 100644
--- a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/ContextMenu.kt
+++ b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/ContextMenu.kt
@@ -35,7 +35,4 @@
 )
 
 @Composable
-internal expect fun ContextMenuArea(
-    manager: SelectionManager,
-    content: @Composable () -> Unit
-)
+internal expect fun ContextMenuArea(manager: SelectionManager, content: @Composable () -> Unit)
diff --git a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/CoreTextField.kt b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/CoreTextField.kt
index aba6cfd..e1df84a 100644
--- a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/CoreTextField.kt
+++ b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/CoreTextField.kt
@@ -141,14 +141,14 @@
  * This composable provides basic text editing functionality, however does not include any
  * decorations such as borders, hints/placeholder.
  *
- * If the editable text is larger than the size of the container, the vertical scrolling
- * behaviour will be automatically applied. To enable a single line behaviour with horizontal
- * scrolling instead, set the [maxLines] parameter to 1, [softWrap] to false, and
- * [ImeOptions.singleLine] to true.
+ * If the editable text is larger than the size of the container, the vertical scrolling behaviour
+ * will be automatically applied. To enable a single line behaviour with horizontal scrolling
+ * instead, set the [maxLines] parameter to 1, [softWrap] to false, and [ImeOptions.singleLine] to
+ * true.
  *
  * Whenever the user edits the text, [onValueChange] is called with the most up to date state
- * represented by [TextFieldValue]. [TextFieldValue] contains the text entered by user, as well
- * as selection, cursor and text composition information. Please check [TextFieldValue] for the
+ * represented by [TextFieldValue]. [TextFieldValue] contains the text entered by user, as well as
+ * selection, cursor and text composition information. Please check [TextFieldValue] for the
  * description of its contents.
  *
  * It is crucial that the value provided in the [onValueChange] is fed back into [CoreTextField] in
@@ -157,46 +157,47 @@
  * Please keep in mind that [onValueChange] is useful to be informed about the latest state of the
  * text input by users, however it is generally not recommended to modify the values in the
  * [TextFieldValue] that you get via [onValueChange] callback. Any change to the values in
- * [TextFieldValue] may result in a context reset and end up with input session restart. Such
- * a scenario would cause glitches in the UI or text input experience for users.
+ * [TextFieldValue] may result in a context reset and end up with input session restart. Such a
+ * scenario would cause glitches in the UI or text input experience for users.
  *
- * @param value The [androidx.compose.ui.text.input.TextFieldValue] to be shown in the [CoreTextField].
+ * @param value The [androidx.compose.ui.text.input.TextFieldValue] to be shown in the
+ *   [CoreTextField].
  * @param onValueChange Called when the input service updates the values in [TextFieldValue].
  * @param modifier optional [Modifier] for this text field.
  * @param textStyle Style configuration that applies at character level such as color, font etc.
  * @param visualTransformation The visual transformation filter for changing the visual
- * representation of the input. By default no visual transformation is applied.
+ *   representation of the input. By default no visual transformation is applied.
  * @param onTextLayout Callback that is executed when a new text layout is calculated. A
- * [TextLayoutResult] object that callback provides contains paragraph information, size of the
- * text, baselines and other details. The callback can be used to add additional decoration or
- * functionality to the text. For example, to draw a cursor or selection around the text.
- * @param interactionSource the [MutableInteractionSource] representing the stream of
- * [Interaction]s for this CoreTextField. You can create and pass in your own remembered
- * [MutableInteractionSource] if you want to observe [Interaction]s and customize the
- * appearance / behavior of this CoreTextField in different [Interaction]s.
+ *   [TextLayoutResult] object that callback provides contains paragraph information, size of the
+ *   text, baselines and other details. The callback can be used to add additional decoration or
+ *   functionality to the text. For example, to draw a cursor or selection around the text.
+ * @param interactionSource the [MutableInteractionSource] representing the stream of [Interaction]s
+ *   for this CoreTextField. You can create and pass in your own remembered
+ *   [MutableInteractionSource] if you want to observe [Interaction]s and customize the appearance /
+ *   behavior of this CoreTextField in different [Interaction]s.
  * @param cursorBrush [Brush] to paint cursor with. If [SolidColor] with [Color.Unspecified]
- * provided, there will be no cursor drawn
+ *   provided, there will be no cursor drawn
  * @param softWrap Whether the text should break at soft line breaks. If false, the glyphs in the
- * text will be positioned as if there was unlimited horizontal space.
+ *   text will be positioned as if there was unlimited horizontal space.
  * @param maxLines The maximum height in terms of maximum number of visible lines. It is required
- * that 1 <= [minLines] <= [maxLines].
+ *   that 1 <= [minLines] <= [maxLines].
  * @param minLines The minimum height in terms of minimum number of visible lines. It is required
- * that 1 <= [minLines] <= [maxLines].
+ *   that 1 <= [minLines] <= [maxLines].
  * @param imeOptions Contains different IME configuration options.
- * @param keyboardActions when the input service emits an IME action, the corresponding callback
- * is called. Note that this IME action may be different from what you specified in
- * [KeyboardOptions.imeAction].
- * @param enabled controls the enabled state of the text field. When `false`, the text
- * field will be neither editable nor focusable, the input of the text field will not be selectable
- * @param readOnly controls the editable state of the [CoreTextField]. When `true`, the text
- * field can not be modified, however, a user can focus it and copy text from it. Read-only text
- * fields are usually used to display pre-filled forms that user can not edit
- * @param decorationBox Composable lambda that allows to add decorations around text field, such
- * as icon, placeholder, helper messages or similar, and automatically increase the hit target area
- * of the text field. To allow you to control the placement of the inner text field relative to your
- * decorations, the text field implementation will pass in a framework-controlled composable
- * parameter "innerTextField" to the decorationBox lambda you provide. You must call
- * innerTextField exactly once.
+ * @param keyboardActions when the input service emits an IME action, the corresponding callback is
+ *   called. Note that this IME action may be different from what you specified in
+ *   [KeyboardOptions.imeAction].
+ * @param enabled controls the enabled state of the text field. When `false`, the text field will be
+ *   neither editable nor focusable, the input of the text field will not be selectable
+ * @param readOnly controls the editable state of the [CoreTextField]. When `true`, the text field
+ *   can not be modified, however, a user can focus it and copy text from it. Read-only text fields
+ *   are usually used to display pre-filled forms that user can not edit
+ * @param decorationBox Composable lambda that allows to add decorations around text field, such as
+ *   icon, placeholder, helper messages or similar, and automatically increase the hit target area
+ *   of the text field. To allow you to control the placement of the inner text field relative to
+ *   your decorations, the text field implementation will pass in a framework-controlled composable
+ *   parameter "innerTextField" to the decorationBox lambda you provide. You must call
+ *   innerTextField exactly once.
  */
 @Composable
 @OptIn(ExperimentalFoundationApi::class)
@@ -236,19 +237,19 @@
     // Scroll state
     val singleLine = maxLines == 1 && !softWrap && imeOptions.singleLine
     val orientation = if (singleLine) Orientation.Horizontal else Orientation.Vertical
-    val scrollerPosition = rememberSaveable(
-        orientation,
-        saver = TextFieldScrollerPosition.Saver
-    ) { TextFieldScrollerPosition(orientation) }
+    val scrollerPosition =
+        rememberSaveable(orientation, saver = TextFieldScrollerPosition.Saver) {
+            TextFieldScrollerPosition(orientation)
+        }
 
     // State
-    val transformedText = remember(value, visualTransformation) {
-        val transformed = visualTransformation.filterWithValidation(value.annotatedString)
+    val transformedText =
+        remember(value, visualTransformation) {
+            val transformed = visualTransformation.filterWithValidation(value.annotatedString)
 
-        value.composition?.let {
-            TextFieldDelegate.applyCompositionDecoration(it, transformed)
-        } ?: transformed
-    }
+            value.composition?.let { TextFieldDelegate.applyCompositionDecoration(it, transformed) }
+                ?: transformed
+        }
 
     val visualText = transformedText.text
     val offsetMapping = transformedText.offsetMapping
@@ -256,19 +257,20 @@
     // If developer doesn't pass new value to TextField, recompose won't happen but internal state
     // and IME may think it is updated. To fix this inconsistent state, enforce recompose.
     val scope = currentRecomposeScope
-    val state = remember(keyboardController) {
-        LegacyTextFieldState(
-            TextDelegate(
-                text = visualText,
-                style = textStyle,
-                softWrap = softWrap,
-                density = density,
-                fontFamilyResolver = fontFamilyResolver
-            ),
-            recomposeScope = scope,
-            keyboardController = keyboardController
-        )
-    }
+    val state =
+        remember(keyboardController) {
+            LegacyTextFieldState(
+                TextDelegate(
+                    text = visualText,
+                    style = textStyle,
+                    softWrap = softWrap,
+                    density = density,
+                    fontFamilyResolver = fontFamilyResolver
+                ),
+                recomposeScope = scope,
+                keyboardController = keyboardController
+            )
+        }
     state.update(
         value.annotatedString,
         visualText,
@@ -305,69 +307,65 @@
     val bringIntoViewRequester = remember { BringIntoViewRequester() }
 
     // Focus
-    val focusModifier = Modifier.textFieldFocusModifier(
-        enabled = enabled,
-        focusRequester = focusRequester,
-        interactionSource = interactionSource
-    ) {
-        if (state.hasFocus == it.isFocused) {
-            return@textFieldFocusModifier
-        }
-        state.hasFocus = it.isFocused
+    val focusModifier =
+        Modifier.textFieldFocusModifier(
+            enabled = enabled,
+            focusRequester = focusRequester,
+            interactionSource = interactionSource
+        ) {
+            if (state.hasFocus == it.isFocused) {
+                return@textFieldFocusModifier
+            }
+            state.hasFocus = it.isFocused
 
-        if (state.hasFocus && enabled && !readOnly) {
-            startInputSession(
-                textInputService,
-                state,
-                value,
-                imeOptions,
-                offsetMapping
-            )
-        } else {
-            endInputSession(state)
-        }
+            if (state.hasFocus && enabled && !readOnly) {
+                startInputSession(textInputService, state, value, imeOptions, offsetMapping)
+            } else {
+                endInputSession(state)
+            }
 
-        // The focusable modifier itself will request the entire focusable be brought into view
-        // when it gains focus – in this case, that's the decoration box. However, since text
-        // fields may have their own internal scrolling, and the decoration box can do anything,
-        // we also need to specifically request that the cursor itself be brought into view.
-        // TODO(b/216790855) If this request happens after the focusable's request, the field
-        //  will only be scrolled far enough to show the cursor, _not_ the entire decoration
-        //  box.
-        if (it.isFocused) {
-            state.layoutResult?.let { layoutResult ->
-                coroutineScope.launch {
-                    bringIntoViewRequester.bringSelectionEndIntoView(
-                        value,
-                        state.textDelegate,
-                        layoutResult.value,
-                        offsetMapping
-                    )
+            // The focusable modifier itself will request the entire focusable be brought into view
+            // when it gains focus – in this case, that's the decoration box. However, since text
+            // fields may have their own internal scrolling, and the decoration box can do anything,
+            // we also need to specifically request that the cursor itself be brought into view.
+            // TODO(b/216790855) If this request happens after the focusable's request, the field
+            //  will only be scrolled far enough to show the cursor, _not_ the entire decoration
+            //  box.
+            if (it.isFocused) {
+                state.layoutResult?.let { layoutResult ->
+                    coroutineScope.launch {
+                        bringIntoViewRequester.bringSelectionEndIntoView(
+                            value,
+                            state.textDelegate,
+                            layoutResult.value,
+                            offsetMapping
+                        )
+                    }
                 }
             }
+            if (!it.isFocused) manager.deselect()
         }
-        if (!it.isFocused) manager.deselect()
-    }
 
     // Hide the keyboard if made disabled or read-only while focused (b/237308379).
     val writeable by rememberUpdatedState(enabled && !readOnly && windowInfo.isWindowFocused)
     LaunchedEffect(Unit) {
         try {
-            snapshotFlow { writeable }.collect { writeable ->
-                // When hasFocus changes, the session will be stopped/started in the focus
-                // handler so we don't need to handle its changes here.
-                if (writeable && state.hasFocus) {
-                    startInputSession(
-                        textInputService,
-                        state,
-                        manager.value,
-                        imeOptions,
-                        manager.offsetMapping
-                    )
-                } else {
-                    endInputSession(state)
+            snapshotFlow { writeable }
+                .collect { writeable ->
+                    // When hasFocus changes, the session will be stopped/started in the focus
+                    // handler so we don't need to handle its changes here.
+                    if (writeable && state.hasFocus) {
+                        startInputSession(
+                            textInputService,
+                            state,
+                            manager.value,
+                            imeOptions,
+                            manager.offsetMapping
+                        )
+                    } else {
+                        endInputSession(state)
+                    }
                 }
-            }
         } finally {
             // TODO(b/230536793) This is a workaround since we don't get an explicit focus blur
             //  event when the text field is removed from the composition entirely.
@@ -375,242 +373,260 @@
         }
     }
 
-    val pointerModifier = Modifier
-        .updateSelectionTouchMode { state.isInTouchMode = it }
-        .tapPressTextFieldModifier(interactionSource, enabled) { offset ->
-            tapToFocus(state, focusRequester, !readOnly)
-            if (state.hasFocus && enabled) {
-                if (state.handleState != HandleState.Selection) {
-                    state.layoutResult?.let { layoutResult ->
-                        TextFieldDelegate.setCursorOffset(
-                            offset,
-                            layoutResult,
-                            state.processor,
-                            offsetMapping,
-                            state.onValueChange
-                        )
-                        // Won't enter cursor state when text is empty.
-                        if (state.textDelegate.text.isNotEmpty()) {
-                            state.handleState = HandleState.Cursor
+    val pointerModifier =
+        Modifier.updateSelectionTouchMode { state.isInTouchMode = it }
+            .tapPressTextFieldModifier(interactionSource, enabled) { offset ->
+                tapToFocus(state, focusRequester, !readOnly)
+                if (state.hasFocus && enabled) {
+                    if (state.handleState != HandleState.Selection) {
+                        state.layoutResult?.let { layoutResult ->
+                            TextFieldDelegate.setCursorOffset(
+                                offset,
+                                layoutResult,
+                                state.processor,
+                                offsetMapping,
+                                state.onValueChange
+                            )
+                            // Won't enter cursor state when text is empty.
+                            if (state.textDelegate.text.isNotEmpty()) {
+                                state.handleState = HandleState.Cursor
+                            }
+                        }
+                    } else {
+                        manager.deselect(offset)
+                    }
+                }
+            }
+            .selectionGestureInput(
+                mouseSelectionObserver = manager.mouseSelectionObserver,
+                textDragObserver = manager.touchSelectionObserver,
+            )
+            .pointerHoverIcon(textPointerIcon)
+
+    val drawModifier =
+        Modifier.drawBehind {
+            state.layoutResult?.let { layoutResult ->
+                drawIntoCanvas { canvas ->
+                    TextFieldDelegate.draw(
+                        canvas,
+                        value,
+                        state.selectionPreviewHighlightRange,
+                        state.deletionPreviewHighlightRange,
+                        offsetMapping,
+                        layoutResult.value,
+                        state.highlightPaint,
+                        state.selectionBackgroundColor
+                    )
+                }
+            }
+        }
+
+    val onPositionedModifier =
+        Modifier.onGloballyPositioned {
+            state.layoutCoordinates = it
+            state.layoutResult?.innerTextFieldCoordinates = it
+            if (enabled) {
+                if (state.handleState == HandleState.Selection) {
+                    if (state.showFloatingToolbar && windowInfo.isWindowFocused) {
+                        manager.showSelectionToolbar()
+                    } else {
+                        manager.hideSelectionToolbar()
+                    }
+                    state.showSelectionHandleStart =
+                        manager.isSelectionHandleInVisibleBound(isStartHandle = true)
+                    state.showSelectionHandleEnd =
+                        manager.isSelectionHandleInVisibleBound(isStartHandle = false)
+                    state.showCursorHandle = value.selection.collapsed
+                } else if (state.handleState == HandleState.Cursor) {
+                    state.showCursorHandle =
+                        manager.isSelectionHandleInVisibleBound(isStartHandle = true)
+                }
+                notifyFocusedRect(state, value, offsetMapping)
+                state.layoutResult?.let { layoutResult ->
+                    state.inputSession?.let { inputSession ->
+                        if (state.hasFocus) {
+                            TextFieldDelegate.updateTextLayoutResult(
+                                inputSession,
+                                value,
+                                offsetMapping,
+                                layoutResult
+                            )
                         }
                     }
-                } else {
-                    manager.deselect(offset)
                 }
             }
         }
-        .selectionGestureInput(
-            mouseSelectionObserver = manager.mouseSelectionObserver,
-            textDragObserver = manager.touchSelectionObserver,
-        )
-        .pointerHoverIcon(textPointerIcon)
 
-    val drawModifier = Modifier.drawBehind {
-        state.layoutResult?.let { layoutResult ->
-            drawIntoCanvas { canvas ->
-                TextFieldDelegate.draw(
-                    canvas,
-                    value,
-                    state.selectionPreviewHighlightRange,
-                    state.deletionPreviewHighlightRange,
-                    offsetMapping,
-                    layoutResult.value,
-                    state.highlightPaint,
-                    state.selectionBackgroundColor
-                )
-            }
-        }
-    }
-
-    val onPositionedModifier = Modifier.onGloballyPositioned {
-        state.layoutCoordinates = it
-        state.layoutResult?.innerTextFieldCoordinates = it
-        if (enabled) {
-            if (state.handleState == HandleState.Selection) {
-                if (state.showFloatingToolbar && windowInfo.isWindowFocused) {
-                    manager.showSelectionToolbar()
+    val isPassword = visualTransformation is PasswordVisualTransformation
+    val semanticsModifier =
+        Modifier.semantics(true) {
+            // focused semantics are handled by Modifier.focusable()
+            this.editableText = transformedText.text
+            this.textSelectionRange = value.selection
+            if (!enabled) this.disabled()
+            if (isPassword) this.password()
+            isEditable = enabled && !readOnly
+            getTextLayoutResult {
+                if (state.layoutResult != null) {
+                    it.add(state.layoutResult!!.value)
+                    true
                 } else {
-                    manager.hideSelectionToolbar()
+                    false
                 }
-                state.showSelectionHandleStart =
-                    manager.isSelectionHandleInVisibleBound(isStartHandle = true)
-                state.showSelectionHandleEnd =
-                    manager.isSelectionHandleInVisibleBound(isStartHandle = false)
-                state.showCursorHandle = value.selection.collapsed
-            } else if (state.handleState == HandleState.Cursor) {
-                state.showCursorHandle =
-                    manager.isSelectionHandleInVisibleBound(isStartHandle = true)
             }
-            notifyFocusedRect(state, value, offsetMapping)
-            state.layoutResult?.let { layoutResult ->
-                state.inputSession?.let { inputSession ->
-                    if (state.hasFocus) {
-                        TextFieldDelegate.updateTextLayoutResult(
-                            inputSession,
-                            value,
-                            offsetMapping,
-                            layoutResult
-                        )
+            setText { text ->
+                if (readOnly || !enabled) return@setText false
+
+                // If the action is performed while in an active text editing session, treat this
+                // like
+                // an IME command and update the text by going through the buffer. This keeps the
+                // buffer
+                // state consistent if other IME commands are performed before the next
+                // recomposition,
+                // and is used for the testing code path.
+                state.inputSession?.let { session ->
+                    TextFieldDelegate.onEditCommand(
+                        ops = listOf(DeleteAllCommand(), CommitTextCommand(text, 1)),
+                        editProcessor = state.processor,
+                        state.onValueChange,
+                        session
+                    )
+                }
+                    ?: run {
+                        state.onValueChange(TextFieldValue(text.text, TextRange(text.text.length)))
+                    }
+                true
+            }
+            insertTextAtCursor { text ->
+                if (readOnly || !enabled) return@insertTextAtCursor false
+
+                // If the action is performed while in an active text editing session, treat this
+                // like
+                // an IME command and update the text by going through the buffer. This keeps the
+                // buffer
+                // state consistent if other IME commands are performed before the next
+                // recomposition,
+                // and is used for the testing code path.
+                state.inputSession?.let { session ->
+                    TextFieldDelegate.onEditCommand(
+                        // Finish composing text first because when the field is focused the IME
+                        // might
+                        // set composition.
+                        ops = listOf(FinishComposingTextCommand(), CommitTextCommand(text, 1)),
+                        editProcessor = state.processor,
+                        state.onValueChange,
+                        session
+                    )
+                }
+                    ?: run {
+                        val newText =
+                            value.text.replaceRange(
+                                value.selection.start,
+                                value.selection.end,
+                                text
+                            )
+                        val newCursor = TextRange(value.selection.start + text.length)
+                        state.onValueChange(TextFieldValue(newText, newCursor))
+                    }
+                true
+            }
+            setSelection { selectionStart, selectionEnd, relativeToOriginalText ->
+                // in traversal mode we get selection from the `textSelectionRange` semantics which
+                // is
+                // selection in original text. In non-traversal mode selection comes from the
+                // Talkback
+                // and indices are relative to the transformed text
+                val start =
+                    if (relativeToOriginalText) {
+                        selectionStart
+                    } else {
+                        offsetMapping.transformedToOriginal(selectionStart)
+                    }
+                val end =
+                    if (relativeToOriginalText) {
+                        selectionEnd
+                    } else {
+                        offsetMapping.transformedToOriginal(selectionEnd)
+                    }
+
+                if (!enabled) {
+                    false
+                } else if (start == value.selection.start && end == value.selection.end) {
+                    false
+                } else if (
+                    minOf(start, end) >= 0 && maxOf(start, end) <= value.annotatedString.length
+                ) {
+                    // Do not show toolbar if it's a traversal mode (with the volume keys), or
+                    // if the cursor just moved to beginning or end.
+                    if (relativeToOriginalText || start == end) {
+                        manager.exitSelectionMode()
+                    } else {
+                        manager.enterSelectionMode()
+                    }
+                    state.onValueChange(
+                        TextFieldValue(value.annotatedString, TextRange(start, end))
+                    )
+                    true
+                } else {
+                    manager.exitSelectionMode()
+                    false
+                }
+            }
+            onImeAction(imeOptions.imeAction) {
+                // This will perform the appropriate default action if no handler has been
+                // specified, so
+                // as far as the platform is concerned, we always handle the action and never want
+                // to
+                // defer to the default _platform_ implementation.
+                state.onImeActionPerformed(imeOptions.imeAction)
+                true
+            }
+            onClick {
+                // according to the documentation, we still need to provide proper semantics actions
+                // even if the state is 'disabled'
+                tapToFocus(state, focusRequester, !readOnly)
+                true
+            }
+            onLongClick {
+                manager.enterSelectionMode()
+                true
+            }
+            if (!value.selection.collapsed && !isPassword) {
+                copyText {
+                    manager.copy()
+                    true
+                }
+                if (enabled && !readOnly) {
+                    cutText {
+                        manager.cut()
+                        true
                     }
                 }
             }
-        }
-    }
-
-    val isPassword = visualTransformation is PasswordVisualTransformation
-    val semanticsModifier = Modifier.semantics(true) {
-        // focused semantics are handled by Modifier.focusable()
-        this.editableText = transformedText.text
-        this.textSelectionRange = value.selection
-        if (!enabled) this.disabled()
-        if (isPassword) this.password()
-        isEditable = enabled && !readOnly
-        getTextLayoutResult {
-            if (state.layoutResult != null) {
-                it.add(state.layoutResult!!.value)
-                true
-            } else {
-                false
-            }
-        }
-        setText { text ->
-            if (readOnly || !enabled) return@setText false
-
-            // If the action is performed while in an active text editing session, treat this like
-            // an IME command and update the text by going through the buffer. This keeps the buffer
-            // state consistent if other IME commands are performed before the next recomposition,
-            // and is used for the testing code path.
-            state.inputSession?.let { session ->
-                TextFieldDelegate.onEditCommand(
-                    ops = listOf(DeleteAllCommand(), CommitTextCommand(text, 1)),
-                    editProcessor = state.processor,
-                    state.onValueChange,
-                    session
-                )
-            } ?: run {
-                state.onValueChange(TextFieldValue(text.text, TextRange(text.text.length)))
-            }
-            true
-        }
-        insertTextAtCursor { text ->
-            if (readOnly || !enabled) return@insertTextAtCursor false
-
-            // If the action is performed while in an active text editing session, treat this like
-            // an IME command and update the text by going through the buffer. This keeps the buffer
-            // state consistent if other IME commands are performed before the next recomposition,
-            // and is used for the testing code path.
-            state.inputSession?.let { session ->
-                TextFieldDelegate.onEditCommand(
-                    // Finish composing text first because when the field is focused the IME might
-                    // set composition.
-                    ops = listOf(FinishComposingTextCommand(), CommitTextCommand(text, 1)),
-                    editProcessor = state.processor,
-                    state.onValueChange,
-                    session
-                )
-            } ?: run {
-                val newText =
-                    value.text.replaceRange(value.selection.start, value.selection.end, text)
-                val newCursor = TextRange(value.selection.start + text.length)
-                state.onValueChange(TextFieldValue(newText, newCursor))
-            }
-            true
-        }
-        setSelection { selectionStart, selectionEnd, relativeToOriginalText ->
-            // in traversal mode we get selection from the `textSelectionRange` semantics which is
-            // selection in original text. In non-traversal mode selection comes from the Talkback
-            // and indices are relative to the transformed text
-            val start = if (relativeToOriginalText) {
-                selectionStart
-            } else {
-                offsetMapping.transformedToOriginal(selectionStart)
-            }
-            val end = if (relativeToOriginalText) {
-                selectionEnd
-            } else {
-                offsetMapping.transformedToOriginal(selectionEnd)
-            }
-
-            if (!enabled) {
-                false
-            } else if (start == value.selection.start && end == value.selection.end) {
-                false
-            } else if (minOf(start, end) >= 0 &&
-                maxOf(start, end) <= value.annotatedString.length
-            ) {
-                // Do not show toolbar if it's a traversal mode (with the volume keys), or
-                // if the cursor just moved to beginning or end.
-                if (relativeToOriginalText || start == end) {
-                    manager.exitSelectionMode()
-                } else {
-                    manager.enterSelectionMode()
-                }
-                state.onValueChange(
-                    TextFieldValue(
-                        value.annotatedString,
-                        TextRange(start, end)
-                    )
-                )
-                true
-            } else {
-                manager.exitSelectionMode()
-                false
-            }
-        }
-        onImeAction(imeOptions.imeAction) {
-            // This will perform the appropriate default action if no handler has been specified, so
-            // as far as the platform is concerned, we always handle the action and never want to
-            // defer to the default _platform_ implementation.
-            state.onImeActionPerformed(imeOptions.imeAction)
-            true
-        }
-        onClick {
-            // according to the documentation, we still need to provide proper semantics actions
-            // even if the state is 'disabled'
-            tapToFocus(state, focusRequester, !readOnly)
-            true
-        }
-        onLongClick {
-            manager.enterSelectionMode()
-            true
-        }
-        if (!value.selection.collapsed && !isPassword) {
-            copyText {
-                manager.copy()
-                true
-            }
             if (enabled && !readOnly) {
-                cutText {
-                    manager.cut()
+                pasteText {
+                    manager.paste()
                     true
                 }
             }
         }
-        if (enabled && !readOnly) {
-            pasteText {
-                manager.paste()
-                true
-            }
-        }
-    }
 
     val showCursor = enabled && !readOnly && windowInfo.isWindowFocused && !state.hasHighlight()
     val cursorModifier = Modifier.cursor(state, value, offsetMapping, cursorBrush, showCursor)
 
-    DisposableEffect(manager) {
-        onDispose { manager.hideSelectionToolbar() }
-    }
+    DisposableEffect(manager) { onDispose { manager.hideSelectionToolbar() } }
 
     DisposableEffect(imeOptions) {
         if (state.hasFocus) {
-            state.inputSession = TextFieldDelegate.restartInput(
-                textInputService = textInputService,
-                value = value,
-                editProcessor = state.processor,
-                imeOptions = imeOptions,
-                onValueChange = state.onValueChange,
-                onImeActionPerformed = state.onImeActionPerformed
-            )
+            state.inputSession =
+                TextFieldDelegate.restartInput(
+                    textInputService = textInputService,
+                    value = value,
+                    editProcessor = state.processor,
+                    imeOptions = imeOptions,
+                    onValueChange = state.onValueChange,
+                    onImeActionPerformed = state.onImeActionPerformed
+                )
         }
         onDispose { /* do nothing */ }
     }
@@ -628,147 +644,156 @@
             imeAction = imeOptions.imeAction,
         )
 
-    val stylusHandwritingModifier = Modifier.stylusHandwriting(writeable) {
-        if (!state.hasFocus) {
-            focusRequester.requestFocus()
+    val stylusHandwritingModifier =
+        Modifier.stylusHandwriting(writeable) {
+            if (!state.hasFocus) {
+                focusRequester.requestFocus()
+            }
+            // If this is a password field, we can't trigger handwriting.
+            // The expected behavior is 1) request focus 2) show software keyboard.
+            // Note: TextField will show software keyboard automatically when it
+            // gain focus. 3) show a toast message telling that handwriting is not
+            // supported for password fields. TODO(b/335294152)
+            if (
+                imeOptions.keyboardType != KeyboardType.Password &&
+                    imeOptions.keyboardType != KeyboardType.NumberPassword
+            ) {
+                // TextInputService is calling LegacyTextInputServiceAdapter under the
+                // hood.  And because it's a public API, startStylusHandwriting is added
+                // to legacyTextInputServiceAdapter instead.
+                // startStylusHandwriting may be called before the actual input
+                // session starts when the editor is not focused, this is handled
+                // internally by the LegacyTextInputServiceAdapter.
+                legacyTextInputServiceAdapter.startStylusHandwriting()
+            }
+            true
         }
-        // If this is a password field, we can't trigger handwriting.
-        // The expected behavior is 1) request focus 2) show software keyboard.
-        // Note: TextField will show software keyboard automatically when it
-        // gain focus. 3) show a toast message telling that handwriting is not
-        // supported for password fields. TODO(b/335294152)
-        if (imeOptions.keyboardType != KeyboardType.Password &&
-            imeOptions.keyboardType != KeyboardType.NumberPassword
-        ) {
-            // TextInputService is calling LegacyTextInputServiceAdapter under the
-            // hood.  And because it's a public API, startStylusHandwriting is added
-            // to legacyTextInputServiceAdapter instead.
-            // startStylusHandwriting may be called before the actual input
-            // session starts when the editor is not focused, this is handled
-            // internally by the LegacyTextInputServiceAdapter.
-            legacyTextInputServiceAdapter.startStylusHandwriting()
-        }
-        true
-    }
 
     // Modifiers that should be applied to the outer text field container. Usually those include
     // gesture and semantics modifiers.
-    val decorationBoxModifier = modifier
-        .legacyTextInputAdapter(legacyTextInputServiceAdapter, state, manager)
-        .then(stylusHandwritingModifier)
-        .then(focusModifier)
-        .interceptDPadAndMoveFocus(state, focusManager)
-        .previewKeyEventToDeselectOnBack(state, manager)
-        .then(textKeyInputModifier)
-        .textFieldScrollable(scrollerPosition, interactionSource, enabled)
-        .then(pointerModifier)
-        .then(semanticsModifier)
-        .onGloballyPositioned @DontMemoize {
-            state.layoutResult?.decorationBoxCoordinates = it
-        }
+    val decorationBoxModifier =
+        modifier
+            .legacyTextInputAdapter(legacyTextInputServiceAdapter, state, manager)
+            .then(stylusHandwritingModifier)
+            .then(focusModifier)
+            .interceptDPadAndMoveFocus(state, focusManager)
+            .previewKeyEventToDeselectOnBack(state, manager)
+            .then(textKeyInputModifier)
+            .textFieldScrollable(scrollerPosition, interactionSource, enabled)
+            .then(pointerModifier)
+            .then(semanticsModifier)
+            .onGloballyPositioned @DontMemoize { state.layoutResult?.decorationBoxCoordinates = it }
 
     val showHandleAndMagnifier =
         enabled && state.hasFocus && state.isInTouchMode && windowInfo.isWindowFocused
-    val magnifierModifier = if (showHandleAndMagnifier) {
-        Modifier.textFieldMagnifier(manager)
-    } else {
-        Modifier
-    }
+    val magnifierModifier =
+        if (showHandleAndMagnifier) {
+            Modifier.textFieldMagnifier(manager)
+        } else {
+            Modifier
+        }
 
     CoreTextFieldRootBox(decorationBoxModifier, manager) {
         decorationBox {
             // Modifiers applied directly to the internal input field implementation. In general,
             // these will most likely include draw, layout and IME related modifiers.
-            val coreTextFieldModifier = Modifier
-                // min height is set for maxLines == 1 in order to prevent text cuts for single line
-                // TextFields
-                .heightIn(min = state.minHeightForSingleLineField)
-                .heightInLines(
-                    textStyle = textStyle,
-                    minLines = minLines,
-                    maxLines = maxLines
-                )
-                .textFieldScroll(
-                    scrollerPosition = scrollerPosition,
-                    textFieldValue = value,
-                    visualTransformation = visualTransformation,
-                    textLayoutResultProvider = { state.layoutResult },
-                )
-                .then(cursorModifier)
-                .then(drawModifier)
-                .textFieldMinSize(textStyle)
-                .then(onPositionedModifier)
-                .then(magnifierModifier)
-                .bringIntoViewRequester(bringIntoViewRequester)
+            val coreTextFieldModifier =
+                Modifier
+                    // min height is set for maxLines == 1 in order to prevent text cuts for single
+                    // line
+                    // TextFields
+                    .heightIn(min = state.minHeightForSingleLineField)
+                    .heightInLines(textStyle = textStyle, minLines = minLines, maxLines = maxLines)
+                    .textFieldScroll(
+                        scrollerPosition = scrollerPosition,
+                        textFieldValue = value,
+                        visualTransformation = visualTransformation,
+                        textLayoutResultProvider = { state.layoutResult },
+                    )
+                    .then(cursorModifier)
+                    .then(drawModifier)
+                    .textFieldMinSize(textStyle)
+                    .then(onPositionedModifier)
+                    .then(magnifierModifier)
+                    .bringIntoViewRequester(bringIntoViewRequester)
 
             SimpleLayout(coreTextFieldModifier) {
                 Layout(
-                    content = { },
-                    measurePolicy = object : MeasurePolicy {
-                        override fun MeasureScope.measure(
-                            measurables: List<Measurable>,
-                            constraints: Constraints
-                        ): MeasureResult {
-                            val prevProxy = Snapshot.withoutReadObservation { state.layoutResult }
-                            val prevResult = prevProxy?.value
-                            val (width, height, result) = TextFieldDelegate.layout(
-                                state.textDelegate,
-                                constraints,
-                                layoutDirection,
-                                prevResult
-                            )
-                            if (prevResult != result) {
-                                state.layoutResult = TextLayoutResultProxy(
-                                    value = result,
-                                    decorationBoxCoordinates = prevProxy?.decorationBoxCoordinates,
-                                )
-                                onTextLayout(result)
-                                notifyFocusedRect(state, value, offsetMapping)
+                    content = {},
+                    measurePolicy =
+                        object : MeasurePolicy {
+                            override fun MeasureScope.measure(
+                                measurables: List<Measurable>,
+                                constraints: Constraints
+                            ): MeasureResult {
+                                val prevProxy =
+                                    Snapshot.withoutReadObservation { state.layoutResult }
+                                val prevResult = prevProxy?.value
+                                val (width, height, result) =
+                                    TextFieldDelegate.layout(
+                                        state.textDelegate,
+                                        constraints,
+                                        layoutDirection,
+                                        prevResult
+                                    )
+                                if (prevResult != result) {
+                                    state.layoutResult =
+                                        TextLayoutResultProxy(
+                                            value = result,
+                                            decorationBoxCoordinates =
+                                                prevProxy?.decorationBoxCoordinates,
+                                        )
+                                    onTextLayout(result)
+                                    notifyFocusedRect(state, value, offsetMapping)
+                                }
+
+                                // calculate the min height for single line text to prevent text
+                                // cuts.
+                                // for single line text maxLines puts in max height constraint based
+                                // on
+                                // constant characters therefore if the user enters a character that
+                                // is
+                                // longer (i.e. emoji or a tall script) the text is cut
+                                state.minHeightForSingleLineField =
+                                    with(density) {
+                                        when (maxLines) {
+                                            1 -> result.getLineBottom(0).ceilToIntPx()
+                                            else -> 0
+                                        }.toDp()
+                                    }
+
+                                return layout(
+                                    width = width,
+                                    height = height,
+                                    alignmentLines =
+                                        mapOf(
+                                            FirstBaseline to result.firstBaseline.fastRoundToInt(),
+                                            LastBaseline to result.lastBaseline.fastRoundToInt()
+                                        )
+                                ) {}
                             }
 
-                            // calculate the min height for single line text to prevent text cuts.
-                            // for single line text maxLines puts in max height constraint based on
-                            // constant characters therefore if the user enters a character that is
-                            // longer (i.e. emoji or a tall script) the text is cut
-                            state.minHeightForSingleLineField = with(density) {
-                                when (maxLines) {
-                                    1 -> result.getLineBottom(0).ceilToIntPx()
-                                    else -> 0
-                                }.toDp()
+                            override fun IntrinsicMeasureScope.maxIntrinsicWidth(
+                                measurables: List<IntrinsicMeasurable>,
+                                height: Int
+                            ): Int {
+                                state.textDelegate.layoutIntrinsics(layoutDirection)
+                                return state.textDelegate.maxIntrinsicWidth
                             }
-
-                            return layout(
-                                width = width,
-                                height = height,
-                                alignmentLines = mapOf(
-                                    FirstBaseline to result.firstBaseline.fastRoundToInt(),
-                                    LastBaseline to result.lastBaseline.fastRoundToInt()
-                                )
-                            ) {}
                         }
-
-                        override fun IntrinsicMeasureScope.maxIntrinsicWidth(
-                            measurables: List<IntrinsicMeasurable>,
-                            height: Int
-                        ): Int {
-                            state.textDelegate.layoutIntrinsics(layoutDirection)
-                            return state.textDelegate.maxIntrinsicWidth
-                        }
-                    }
                 )
 
                 SelectionToolbarAndHandles(
                     manager = manager,
-                    show = state.handleState != HandleState.None &&
-                        state.layoutCoordinates != null &&
-                        state.layoutCoordinates!!.isAttached &&
-                        showHandleAndMagnifier
+                    show =
+                        state.handleState != HandleState.None &&
+                            state.layoutCoordinates != null &&
+                            state.layoutCoordinates!!.isAttached &&
+                            showHandleAndMagnifier
                 )
 
                 if (
-                    state.handleState == HandleState.Cursor &&
-                    !readOnly &&
-                    showHandleAndMagnifier
+                    state.handleState == HandleState.Cursor && !readOnly && showHandleAndMagnifier
                 ) {
                     TextFieldCursorHandle(manager = manager)
                 }
@@ -783,45 +808,44 @@
     manager: TextFieldSelectionManager,
     content: @Composable () -> Unit
 ) {
-    Box(modifier, propagateMinConstraints = true) {
-        ContextMenuArea(manager, content)
-    }
+    Box(modifier, propagateMinConstraints = true) { ContextMenuArea(manager, content) }
 }
 
 /**
- * The selection handle state of the TextField. It can be None, Selection or Cursor.
- * It determines whether the selection handle, cursor handle or only cursor is shown. And how
- * TextField handles gestures.
+ * The selection handle state of the TextField. It can be None, Selection or Cursor. It determines
+ * whether the selection handle, cursor handle or only cursor is shown. And how TextField handles
+ * gestures.
  */
 internal enum class HandleState {
     /**
-     * No selection is active in this TextField. This is the initial state of the TextField.
-     * If the user long click on the text and start selection, the TextField will exit this state
-     * and enters [HandleState.Selection] state. If the user tap on the text, the TextField
-     * will exit this state and enters [HandleState.Cursor] state.
+     * No selection is active in this TextField. This is the initial state of the TextField. If the
+     * user long click on the text and start selection, the TextField will exit this state and
+     * enters [HandleState.Selection] state. If the user tap on the text, the TextField will exit
+     * this state and enters [HandleState.Cursor] state.
      */
     None,
 
     /**
      * Selection handle is displayed for this TextField. User can drag the selection handle to
      * change the selected text. If the user start editing the text, the TextField will exit this
-     * state and enters [HandleState.None] state. If the user tap on the text, the TextField
-     * will exit this state and enters [HandleState.Cursor] state.
+     * state and enters [HandleState.None] state. If the user tap on the text, the TextField will
+     * exit this state and enters [HandleState.Cursor] state.
      */
     Selection,
 
     /**
-     * Cursor handle is displayed for this TextField. User can drag the cursor handle to change
-     * the cursor position. If the user start editing the text, the TextField will exit this
-     * state and enters [HandleState.None] state. If the user long click on the text and start
-     * selection, the TextField will exit this state and enters [HandleState.Selection] state.
-     * Also notice that TextField won't enter this state if the current input text is empty.
+     * Cursor handle is displayed for this TextField. User can drag the cursor handle to change the
+     * cursor position. If the user start editing the text, the TextField will exit this state and
+     * enters [HandleState.None] state. If the user long click on the text and start selection, the
+     * TextField will exit this state and enters [HandleState.Selection] state. Also notice that
+     * TextField won't enter this state if the current input text is empty.
      */
     Cursor
 }
 
 /**
  * Indicates which handle is being dragged when the user is dragging on a text field handle.
+ *
  * @see LegacyTextFieldState.handleState
  */
 internal enum class Handle {
@@ -855,14 +879,12 @@
     var inputSession: TextInputSession? = null
 
     /**
-     * This should be a state as every time we update the value we need to redraw it.
-     * state observation during onDraw callback will make it work.
+     * This should be a state as every time we update the value we need to redraw it. state
+     * observation during onDraw callback will make it work.
      */
     var hasFocus by mutableStateOf(false)
 
-    /**
-     * Set to a non-zero value for single line TextFields in order to prevent text cuts.
-     */
+    /** Set to a non-zero value for single line TextFields in order to prevent text cuts. */
     var minHeightForSingleLineField by mutableStateOf(0.dp)
 
     /**
@@ -878,15 +900,14 @@
         }
 
     /**
-     * You should be using proxy type [TextLayoutResultProxy] if you need to translate touch
-     * offset into text's coordinate system. For example, if you add a gesture on top of the
-     * decoration box and want to know the character in text for the given touch offset on
-     * decoration box.
-     * When you don't need to shift the touch offset, you should be using `layoutResult.value`
-     * which omits the proxy and calls the layout result directly. This is needed when you work
-     * with the text directly, and not the decoration box. For example, cursor modifier gets
-     * position using the [TextFieldValue.selection] value which corresponds to the text directly,
-     * and therefore does not require the translation.
+     * You should be using proxy type [TextLayoutResultProxy] if you need to translate touch offset
+     * into text's coordinate system. For example, if you add a gesture on top of the decoration box
+     * and want to know the character in text for the given touch offset on decoration box. When you
+     * don't need to shift the touch offset, you should be using `layoutResult.value` which omits
+     * the proxy and calls the layout result directly. This is needed when you work with the text
+     * directly, and not the decoration box. For example, cursor modifier gets position using the
+     * [TextFieldValue.selection] value which corresponds to the text directly, and therefore does
+     * not require the translation.
      */
     private val layoutResultState: MutableState<TextLayoutResultProxy?> = mutableStateOf(null)
     var layoutResult: TextLayoutResultProxy?
@@ -907,21 +928,21 @@
     var untransformedText: AnnotatedString? = null
 
     /**
-     * The gesture detector state, to indicate whether current state is selection, cursor
-     * or editing.
+     * The gesture detector state, to indicate whether current state is selection, cursor or
+     * editing.
      *
      * In the none state, no selection or cursor handle is shown, only the cursor is shown.
-     * TextField is initially in this state. To enter this state, input anything from the
-     * keyboard and modify the text.
+     * TextField is initially in this state. To enter this state, input anything from the keyboard
+     * and modify the text.
      *
-     * In the selection state, there is no cursor shown, only selection is shown. To enter
-     * the selection mode, just long press on the screen. In this mode, finger movement on the
-     * screen changes selection instead of moving the cursor.
+     * In the selection state, there is no cursor shown, only selection is shown. To enter the
+     * selection mode, just long press on the screen. In this mode, finger movement on the screen
+     * changes selection instead of moving the cursor.
      *
      * In the cursor state, no selection is shown, and the cursor and the cursor handle are shown.
      * To enter the cursor state, tap anywhere within the TextField.(The TextField will stay in the
-     * edit state if the current text is empty.) In this mode, finger movement on the screen
-     * moves the cursor.
+     * edit state if the current text is empty.) In this mode, finger movement on the screen moves
+     * the cursor.
      */
     var handleState by mutableStateOf(HandleState.None)
 
@@ -930,8 +951,8 @@
      *
      * This state is meant to represent the floating toolbar status regardless of if all touch
      * behaviors are disabled (like if the user is using a mouse). This is so that when touch
-     * behaviors are re-enabled, the toolbar status will still reflect whether it should be shown
-     * at that point.
+     * behaviors are re-enabled, the toolbar status will still reflect whether it should be shown at
+     * that point.
      */
     var showFloatingToolbar by mutableStateOf(false)
 
@@ -942,8 +963,8 @@
     var showSelectionHandleStart by mutableStateOf(false)
 
     /**
-     * True if the position of the selection end handle is within a visible part of the window
-     * (i.e. not scrolled out of view) and the handle should be drawn.
+     * True if the position of the selection end handle is within a visible part of the window (i.e.
+     * not scrolled out of view) and the handle should be drawn.
      */
     var showSelectionHandleEnd by mutableStateOf(false)
 
@@ -1021,24 +1042,23 @@
         }
         this.untransformedText = untransformedText
 
-        val newTextDelegate = updateTextDelegate(
-            current = textDelegate,
-            text = visualText,
-            style = textStyle,
-            softWrap = softWrap,
-            density = density,
-            fontFamilyResolver = fontFamilyResolver,
-            placeholders = emptyList(),
-        )
+        val newTextDelegate =
+            updateTextDelegate(
+                current = textDelegate,
+                text = visualText,
+                style = textStyle,
+                softWrap = softWrap,
+                density = density,
+                fontFamilyResolver = fontFamilyResolver,
+                placeholders = emptyList(),
+            )
 
         if (textDelegate !== newTextDelegate) isLayoutResultStale = true
         textDelegate = newTextDelegate
     }
 }
 
-/**
- * Request focus on tap. If already focused, makes sure the keyboard is requested.
- */
+/** Request focus on tap. If already focused, makes sure the keyboard is requested. */
 private fun tapToFocus(
     state: LegacyTextFieldState,
     focusRequester: FocusRequester,
@@ -1058,14 +1078,15 @@
     imeOptions: ImeOptions,
     offsetMapping: OffsetMapping
 ) {
-    state.inputSession = TextFieldDelegate.onFocus(
-        textInputService,
-        value,
-        state.processor,
-        imeOptions,
-        state.onValueChange,
-        state.onImeActionPerformed
-    )
+    state.inputSession =
+        TextFieldDelegate.onFocus(
+            textInputService,
+            value,
+            state.processor,
+            imeOptions,
+            state.onValueChange,
+            state.onImeActionPerformed
+        )
     notifyFocusedRect(state, value, offsetMapping)
 }
 
@@ -1081,7 +1102,6 @@
  * view using [bringCursorIntoView][BringIntoViewRequester.bringIntoView].
  *
  * Text fields have a lot of different edge cases where they need to make sure they stay visible:
- *
  * 1. Focusable node newly receives focus – always bring entire node into view.
  * 2. Unfocused text field is tapped – always bring cursor area into view (conflicts with above, see
  *    b/216790855).
@@ -1091,8 +1111,8 @@
  *    into view if it was also in view before the resize. This handles the case of
  *    `softInputMode=ADJUST_RESIZE`. See b/216842427.
  * 6. Entire window is panned due to `softInputMode=ADJUST_PAN` – report the correct focused rect to
- *    the view system, and the view system itself will keep the focused area in view.
- *    See aosp/1964580.
+ *    the view system, and the view system itself will keep the focused area in view. See
+ *    aosp/1964580.
  *
  * This function is used to handle 2, 3, and 4, and the others are automatically handled by the
  * focus system.
@@ -1105,24 +1125,24 @@
     offsetMapping: OffsetMapping
 ) {
     val selectionEndInTransformed = offsetMapping.originalToTransformed(value.selection.max)
-    val selectionEndBounds = when {
-        selectionEndInTransformed < textLayoutResult.layoutInput.text.length -> {
-            textLayoutResult.getBoundingBox(selectionEndInTransformed)
+    val selectionEndBounds =
+        when {
+            selectionEndInTransformed < textLayoutResult.layoutInput.text.length -> {
+                textLayoutResult.getBoundingBox(selectionEndInTransformed)
+            }
+            selectionEndInTransformed != 0 -> {
+                textLayoutResult.getBoundingBox(selectionEndInTransformed - 1)
+            }
+            else -> { // empty text.
+                val defaultSize =
+                    computeSizeForDefaultText(
+                        textDelegate.style,
+                        textDelegate.density,
+                        textDelegate.fontFamilyResolver
+                    )
+                Rect(0f, 0f, 1.0f, defaultSize.height.toFloat())
+            }
         }
-
-        selectionEndInTransformed != 0 -> {
-            textLayoutResult.getBoundingBox(selectionEndInTransformed - 1)
-        }
-
-        else -> { // empty text.
-            val defaultSize = computeSizeForDefaultText(
-                textDelegate.style,
-                textDelegate.density,
-                textDelegate.fontFamilyResolver
-            )
-            Rect(0f, 0f, 1.0f, defaultSize.height.toFloat())
-        }
-    }
     bringIntoView(selectionEndBounds)
 }
 
@@ -1132,39 +1152,43 @@
         if (show) {
             // Check whether text layout result became stale. A stale text layout might be
             // completely unrelated to current TextFieldValue, causing offset errors.
-            state?.layoutResult?.value?.takeIf { !(state?.isLayoutResultStale ?: true) }?.let {
-                if (!value.selection.collapsed) {
-                    val startOffset = offsetMapping.originalToTransformed(value.selection.start)
-                    val endOffset = offsetMapping.originalToTransformed(value.selection.end)
-                    val startDirection = it.getBidiRunDirection(startOffset)
-                    val endDirection = it.getBidiRunDirection(max(endOffset - 1, 0))
-                    if (manager.state?.showSelectionHandleStart == true) {
-                        TextFieldSelectionHandle(
-                            isStartHandle = true,
-                            direction = startDirection,
-                            manager = manager
-                        )
+            state
+                ?.layoutResult
+                ?.value
+                ?.takeIf { !(state?.isLayoutResultStale ?: true) }
+                ?.let {
+                    if (!value.selection.collapsed) {
+                        val startOffset = offsetMapping.originalToTransformed(value.selection.start)
+                        val endOffset = offsetMapping.originalToTransformed(value.selection.end)
+                        val startDirection = it.getBidiRunDirection(startOffset)
+                        val endDirection = it.getBidiRunDirection(max(endOffset - 1, 0))
+                        if (manager.state?.showSelectionHandleStart == true) {
+                            TextFieldSelectionHandle(
+                                isStartHandle = true,
+                                direction = startDirection,
+                                manager = manager
+                            )
+                        }
+                        if (manager.state?.showSelectionHandleEnd == true) {
+                            TextFieldSelectionHandle(
+                                isStartHandle = false,
+                                direction = endDirection,
+                                manager = manager
+                            )
+                        }
                     }
-                    if (manager.state?.showSelectionHandleEnd == true) {
-                        TextFieldSelectionHandle(
-                            isStartHandle = false,
-                            direction = endDirection,
-                            manager = manager
-                        )
-                    }
-                }
 
-                state?.let { textFieldState ->
-                    // If in selection mode (when the floating toolbar is shown) a new symbol
-                    // from the keyboard is entered, text field should enter the editing mode
-                    // instead.
-                    if (isTextChanged()) textFieldState.showFloatingToolbar = false
-                    if (textFieldState.hasFocus) {
-                        if (textFieldState.showFloatingToolbar) showSelectionToolbar()
-                        else hideSelectionToolbar()
+                    state?.let { textFieldState ->
+                        // If in selection mode (when the floating toolbar is shown) a new symbol
+                        // from the keyboard is entered, text field should enter the editing mode
+                        // instead.
+                        if (isTextChanged()) textFieldState.showFloatingToolbar = false
+                        if (textFieldState.hasFocus) {
+                            if (textFieldState.showFloatingToolbar) showSelectionToolbar()
+                            else hideSelectionToolbar()
+                        }
                     }
                 }
-            }
         } else hideSelectionToolbar()
     }
 }
@@ -1176,27 +1200,28 @@
         val position = manager.getCursorPosition(LocalDensity.current)
         CursorHandle(
             offsetProvider = { position },
-            modifier = Modifier
-                .pointerInput(observer) {
-                    coroutineScope {
-                        // UNDISPATCHED because this runs upon first pointer event and
-                        // without it the event would pass before the handler is ready
-                        launch(start = CoroutineStart.UNDISPATCHED) {
-                            detectDownAndDragGesturesWithObserver(observer)
-                        }
-                        launch(start = CoroutineStart.UNDISPATCHED) {
-                            detectTapGestures { manager.showSelectionToolbar() }
+            modifier =
+                Modifier.pointerInput(observer) {
+                        coroutineScope {
+                            // UNDISPATCHED because this runs upon first pointer event and
+                            // without it the event would pass before the handler is ready
+                            launch(start = CoroutineStart.UNDISPATCHED) {
+                                detectDownAndDragGesturesWithObserver(observer)
+                            }
+                            launch(start = CoroutineStart.UNDISPATCHED) {
+                                detectTapGestures { manager.showSelectionToolbar() }
+                            }
                         }
                     }
-                }
-                .semantics {
-                    this[SelectionHandleInfoKey] = SelectionHandleInfo(
-                        handle = Handle.Cursor,
-                        position = position,
-                        anchor = SelectionHandleAnchor.Middle,
-                        visible = true,
-                    )
-                }
+                    .semantics {
+                        this[SelectionHandleInfoKey] =
+                            SelectionHandleInfo(
+                                handle = Handle.Cursor,
+                                position = position,
+                                anchor = SelectionHandleAnchor.Middle,
+                                visible = true,
+                            )
+                    }
         )
     }
 }
diff --git a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/DeadKeyCombiner.kt b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/DeadKeyCombiner.kt
index 52d7647..3eb1ff0 100644
--- a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/DeadKeyCombiner.kt
+++ b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/DeadKeyCombiner.kt
@@ -27,8 +27,8 @@
 
     /**
      * @param event the key event received by the combiner
-     * @return a unicode code point to emit in response to the event,
-     * or null if no code point should be emitted
+     * @return a unicode code point to emit in response to the event, or null if no code point
+     *   should be emitted
      */
     fun consume(event: KeyEvent): Int?
 }
diff --git a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/HeightInLinesModifier.kt b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/HeightInLinesModifier.kt
index 0b88344..3cd43d0 100644
--- a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/HeightInLinesModifier.kt
+++ b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/HeightInLinesModifier.kt
@@ -49,80 +49,74 @@
     textStyle: TextStyle,
     minLines: Int = DefaultMinLines,
     maxLines: Int = Int.MAX_VALUE
-) = composed(
-    inspectorInfo = debugInspectorInfo {
-        name = "heightInLines"
-        properties["minLines"] = minLines
-        properties["maxLines"] = maxLines
-        properties["textStyle"] = textStyle
-    }
-) {
-    validateMinMaxLines(minLines, maxLines)
-    if (minLines == DefaultMinLines && maxLines == Int.MAX_VALUE) return@composed Modifier
-
-    val density = LocalDensity.current
-    val fontFamilyResolver = LocalFontFamilyResolver.current
-    val layoutDirection = LocalLayoutDirection.current
-
-    // Difference between the height of two lines paragraph and one line paragraph gives us
-    // an approximation of height of one line
-    val resolvedStyle = remember(textStyle, layoutDirection) {
-        resolveDefaults(textStyle, layoutDirection)
-    }
-    val typeface by remember(fontFamilyResolver, resolvedStyle) {
-        fontFamilyResolver.resolve(
-            resolvedStyle.fontFamily,
-            resolvedStyle.fontWeight ?: FontWeight.Normal,
-            resolvedStyle.fontStyle ?: FontStyle.Normal,
-            resolvedStyle.fontSynthesis ?: FontSynthesis.All
-        )
-    }
-
-    val firstLineHeight = remember(
-        density,
-        fontFamilyResolver,
-        textStyle,
-        layoutDirection,
-        typeface
+) =
+    composed(
+        inspectorInfo =
+            debugInspectorInfo {
+                name = "heightInLines"
+                properties["minLines"] = minLines
+                properties["maxLines"] = maxLines
+                properties["textStyle"] = textStyle
+            }
     ) {
-        computeSizeForDefaultText(
-            style = resolvedStyle,
-            density = density,
-            fontFamilyResolver = fontFamilyResolver,
-            text = EmptyTextReplacement,
-            maxLines = 1
-        ).height
-    }
+        validateMinMaxLines(minLines, maxLines)
+        if (minLines == DefaultMinLines && maxLines == Int.MAX_VALUE) return@composed Modifier
 
-    val firstTwoLinesHeight = remember(
-        density,
-        fontFamilyResolver,
-        textStyle,
-        layoutDirection,
-        typeface
-    ) {
-        val twoLines = EmptyTextReplacement + "\n" + EmptyTextReplacement
-        computeSizeForDefaultText(
-            style = resolvedStyle,
-            density = density,
-            fontFamilyResolver = fontFamilyResolver,
-            text = twoLines,
-            maxLines = 2
-        ).height
-    }
-    val lineHeight = firstTwoLinesHeight - firstLineHeight
-    val precomputedMinLinesHeight =
-        if (minLines == DefaultMinLines) null else firstLineHeight + lineHeight * (minLines - 1)
-    val precomputedMaxLinesHeight =
-        if (maxLines == Int.MAX_VALUE) null else firstLineHeight + lineHeight * (maxLines - 1)
+        val density = LocalDensity.current
+        val fontFamilyResolver = LocalFontFamilyResolver.current
+        val layoutDirection = LocalLayoutDirection.current
 
-    with(density) {
-        Modifier.heightIn(
-            min = precomputedMinLinesHeight?.toDp() ?: Dp.Unspecified,
-            max = precomputedMaxLinesHeight?.toDp() ?: Dp.Unspecified
-        )
+        // Difference between the height of two lines paragraph and one line paragraph gives us
+        // an approximation of height of one line
+        val resolvedStyle =
+            remember(textStyle, layoutDirection) { resolveDefaults(textStyle, layoutDirection) }
+        val typeface by
+            remember(fontFamilyResolver, resolvedStyle) {
+                fontFamilyResolver.resolve(
+                    resolvedStyle.fontFamily,
+                    resolvedStyle.fontWeight ?: FontWeight.Normal,
+                    resolvedStyle.fontStyle ?: FontStyle.Normal,
+                    resolvedStyle.fontSynthesis ?: FontSynthesis.All
+                )
+            }
+
+        val firstLineHeight =
+            remember(density, fontFamilyResolver, textStyle, layoutDirection, typeface) {
+                computeSizeForDefaultText(
+                        style = resolvedStyle,
+                        density = density,
+                        fontFamilyResolver = fontFamilyResolver,
+                        text = EmptyTextReplacement,
+                        maxLines = 1
+                    )
+                    .height
+            }
+
+        val firstTwoLinesHeight =
+            remember(density, fontFamilyResolver, textStyle, layoutDirection, typeface) {
+                val twoLines = EmptyTextReplacement + "\n" + EmptyTextReplacement
+                computeSizeForDefaultText(
+                        style = resolvedStyle,
+                        density = density,
+                        fontFamilyResolver = fontFamilyResolver,
+                        text = twoLines,
+                        maxLines = 2
+                    )
+                    .height
+            }
+        val lineHeight = firstTwoLinesHeight - firstLineHeight
+        val precomputedMinLinesHeight =
+            if (minLines == DefaultMinLines) null else firstLineHeight + lineHeight * (minLines - 1)
+        val precomputedMaxLinesHeight =
+            if (maxLines == Int.MAX_VALUE) null else firstLineHeight + lineHeight * (maxLines - 1)
+
+        with(density) {
+            Modifier.heightIn(
+                min = precomputedMinLinesHeight?.toDp() ?: Dp.Unspecified,
+                max = precomputedMaxLinesHeight?.toDp() ?: Dp.Unspecified
+            )
+        }
     }
-}
 
 internal fun validateMinMaxLines(minLines: Int, maxLines: Int) {
     require(minLines > 0 && maxLines > 0) {
diff --git a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/InlineTextContent.kt b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/InlineTextContent.kt
index 52c7a56..090ba3e 100644
--- a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/InlineTextContent.kt
+++ b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/InlineTextContent.kt
@@ -26,32 +26,30 @@
 // A string that contains a replacement character specified by unicode. It's used as the default
 // value of alternate text.
 private const val REPLACEMENT_CHAR = "\uFFFD"
+
 /**
  * Used to insert composables into the text layout. This method can be used together with the
  * inlineContent parameter of [BasicText]. It will append the [alternateText] to this
- * [AnnotatedString] and also mark this range of text to be replaced by a composable.
- * [BasicText] will try to find an [InlineTextContent] in the map defined by inlineContent whose
- * key equals to [id], and it will use the [InlineTextContent.children] to replace this range of
- * text.
+ * [AnnotatedString] and also mark this range of text to be replaced by a composable. [BasicText]
+ * will try to find an [InlineTextContent] in the map defined by inlineContent whose key equals to
+ * [id], and it will use the [InlineTextContent.children] to replace this range of text.
  *
  * @sample androidx.compose.foundation.samples.InlineTextContentSample
- * @see InlineTextContent
- * @see BasicText
  *
  * @param id The id used to look up the [InlineTextContent], it is referred by the inlineContent
- * parameter of [BasicText] to replace the [alternateText] to the corresponding composable.
- * @param alternateText The text to be replaced by the inline content. It's displayed when
- * the inlineContent parameter of [BasicText] doesn't contain [id].
- * Accessibility features will also use this text to describe the inline content.
+ *   parameter of [BasicText] to replace the [alternateText] to the corresponding composable.
+ * @param alternateText The text to be replaced by the inline content. It's displayed when the
+ *   inlineContent parameter of [BasicText] doesn't contain [id]. Accessibility features will also
+ *   use this text to describe the inline content.
  * @throws IllegalArgumentException if [alternateText] has zero length.
+ * @see InlineTextContent
+ * @see BasicText
  */
 fun AnnotatedString.Builder.appendInlineContent(
     id: String,
     alternateText: String = REPLACEMENT_CHAR
 ) {
-    require(alternateText.isNotEmpty()) {
-        "alternateText can't be an empty string."
-    }
+    require(alternateText.isNotEmpty()) { "alternateText can't be an empty string." }
     pushStringAnnotation(INLINE_CONTENT_TAG, id)
     append(alternateText)
     pop()
@@ -61,12 +59,13 @@
  * A data class that stores a composable to be inserted into the text layout.
  *
  * Different from a regular composable, a [Placeholder] is also needed for text layout to reserve
- * space. In this [placeholder], the size of the content and how it will be aligned within the
- * text line is defined. When the children composable is measured, its size given in
- * [Placeholder.width] and [Placeholder.height] will be converted into
- * [androidx.compose.ui.unit.Constraints] and passed through [androidx.compose.ui.layout.Layout].
+ * space. In this [placeholder], the size of the content and how it will be aligned within the text
+ * line is defined. When the children composable is measured, its size given in [Placeholder.width]
+ * and [Placeholder.height] will be converted into [androidx.compose.ui.unit.Constraints] and passed
+ * through [androidx.compose.ui.layout.Layout].
  *
  * @sample androidx.compose.foundation.samples.InlineTextContentSample
+ *
  * @see BasicText
  * @see Placeholder
  */
@@ -75,12 +74,13 @@
     /**
      * The setting object that defines the size and vertical alignment of this composable in the
      * text line. This is different from the measure of Layout
+     *
      * @see Placeholder
      */
     val placeholder: Placeholder,
     /**
-     * The composable to be inserted into the text layout.
-     * The string parameter passed to it will the alternateText given to [appendInlineContent].
+     * The composable to be inserted into the text layout. The string parameter passed to it will
+     * the alternateText given to [appendInlineContent].
      */
     val children: @Composable (String) -> Unit
 )
diff --git a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/InternalFoundationTextApi.kt b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/InternalFoundationTextApi.kt
index 4221b97..841b7d5 100644
--- a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/InternalFoundationTextApi.kt
+++ b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/InternalFoundationTextApi.kt
@@ -17,12 +17,16 @@
 package androidx.compose.foundation.text
 
 @RequiresOptIn(
-    message = "Internal/Unstable API for use only between foundation modules sharing " +
-        "the same exact version, subject to change without notice."
+    message =
+        "Internal/Unstable API for use only between foundation modules sharing " +
+            "the same exact version, subject to change without notice."
 )
 @Target(
-    AnnotationTarget.CLASS, AnnotationTarget.FUNCTION, AnnotationTarget.PROPERTY,
-    AnnotationTarget.PROPERTY_GETTER, AnnotationTarget.PROPERTY_SETTER
+    AnnotationTarget.CLASS,
+    AnnotationTarget.FUNCTION,
+    AnnotationTarget.PROPERTY,
+    AnnotationTarget.PROPERTY_GETTER,
+    AnnotationTarget.PROPERTY_SETTER
 )
 @Retention(AnnotationRetention.BINARY)
 annotation class InternalFoundationTextApi
diff --git a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/KeyCommand.kt b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/KeyCommand.kt
index a146a6a..4d24003 100644
--- a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/KeyCommand.kt
+++ b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/KeyCommand.kt
@@ -23,69 +23,49 @@
 ) {
     LEFT_CHAR(false),
     RIGHT_CHAR(false),
-
     RIGHT_WORD(false),
     LEFT_WORD(false),
-
     NEXT_PARAGRAPH(false),
     PREV_PARAGRAPH(false),
-
     LINE_START(false),
     LINE_END(false),
     LINE_LEFT(false),
     LINE_RIGHT(false),
-
     UP(false),
     DOWN(false),
-
     PAGE_UP(false),
     PAGE_DOWN(false),
-
     HOME(false),
     END(false),
-
     COPY(false),
     PASTE(true),
     CUT(true),
-
     DELETE_PREV_CHAR(true),
     DELETE_NEXT_CHAR(true),
-
     DELETE_PREV_WORD(true),
     DELETE_NEXT_WORD(true),
-
     DELETE_FROM_LINE_START(true),
     DELETE_TO_LINE_END(true),
-
     SELECT_ALL(false),
-
     SELECT_LEFT_CHAR(false),
     SELECT_RIGHT_CHAR(false),
-
     SELECT_UP(false),
     SELECT_DOWN(false),
-
     SELECT_PAGE_UP(false),
     SELECT_PAGE_DOWN(false),
-
     SELECT_HOME(false),
     SELECT_END(false),
-
     SELECT_LEFT_WORD(false),
     SELECT_RIGHT_WORD(false),
     SELECT_NEXT_PARAGRAPH(false),
     SELECT_PREV_PARAGRAPH(false),
-
     SELECT_LINE_START(false),
     SELECT_LINE_END(false),
     SELECT_LINE_LEFT(false),
     SELECT_LINE_RIGHT(false),
-
     DESELECT(false),
-
     NEW_LINE(true),
     TAB(true),
-
     UNDO(true),
     REDO(true),
     CHARACTER_PALETTE(true)
diff --git a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/KeyEventHelpers.kt b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/KeyEventHelpers.kt
index e58dfff..e08aa9e 100644
--- a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/KeyEventHelpers.kt
+++ b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/KeyEventHelpers.kt
@@ -19,8 +19,8 @@
 import androidx.compose.ui.input.key.KeyEvent
 
 /**
- * Platform specific behavior for deselecting text selection in TextField and Text based on
- * special keys, such as the "Back" button on Android.
+ * Platform specific behavior for deselecting text selection in TextField and Text based on special
+ * keys, such as the "Back" button on Android.
  *
  * Only return true if selection of should be immediately cancelled in response to this [KeyEvent]
  * as a special case such as the "Back" button on Android. This is not intended for events that
diff --git a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/KeyMapping.kt b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/KeyMapping.kt
index c1f4bda..153b5da 100644
--- a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/KeyMapping.kt
+++ b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/KeyMapping.kt
@@ -31,9 +31,7 @@
 // desktop, the value depends on the current OS
 internal expect val platformDefaultKeyMapping: KeyMapping
 
-/**
- * Copied from [Key] as the constants there are experimental
- */
+/** Copied from [Key] as the constants there are experimental */
 internal expect object MappedKeys {
     val A: Key
     val C: Key
@@ -62,9 +60,7 @@
 }
 
 // It's common for all platforms key mapping
-internal fun commonKeyMapping(
-    shortcutModifier: (KeyEvent) -> Boolean
-): KeyMapping {
+internal fun commonKeyMapping(shortcutModifier: (KeyEvent) -> Boolean): KeyMapping {
     return object : KeyMapping {
         override fun map(event: KeyEvent): KeyCommand? {
             return when {
@@ -75,7 +71,8 @@
                     }
                 shortcutModifier(event) ->
                     when (event.key) {
-                        MappedKeys.C, MappedKeys.Insert -> KeyCommand.COPY
+                        MappedKeys.C,
+                        MappedKeys.Insert -> KeyCommand.COPY
                         MappedKeys.V -> KeyCommand.PASTE
                         MappedKeys.X -> KeyCommand.CUT
                         MappedKeys.A -> KeyCommand.SELECT_ALL
diff --git a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/KeyboardActionRunner.kt b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/KeyboardActionRunner.kt
index 049478d..139d039 100644
--- a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/KeyboardActionRunner.kt
+++ b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/KeyboardActionRunner.kt
@@ -29,44 +29,37 @@
 import androidx.compose.ui.text.input.ImeAction.Companion.Search
 import androidx.compose.ui.text.input.ImeAction.Companion.Send
 
-/**
- * This class can be used to run keyboard actions when the user triggers an IME action.
- */
-internal class KeyboardActionRunner(
-    private val keyboardController: SoftwareKeyboardController?
-) : KeyboardActionScope {
+/** This class can be used to run keyboard actions when the user triggers an IME action. */
+internal class KeyboardActionRunner(private val keyboardController: SoftwareKeyboardController?) :
+    KeyboardActionScope {
 
-    /**
-     * The developer specified [KeyboardActions].
-     */
+    /** The developer specified [KeyboardActions]. */
     lateinit var keyboardActions: KeyboardActions
 
-    /**
-     * A reference to the [FocusManager] composition local.
-     */
+    /** A reference to the [FocusManager] composition local. */
     lateinit var focusManager: FocusManager
 
     /**
-     * Run the keyboard action corresponding to the specified imeAction. If a keyboard action is
-     * not specified, use the default implementation provided by [defaultKeyboardAction].
+     * Run the keyboard action corresponding to the specified imeAction. If a keyboard action is not
+     * specified, use the default implementation provided by [defaultKeyboardAction].
      */
     fun runAction(imeAction: ImeAction) {
-        val keyboardAction = when (imeAction) {
-            Done -> keyboardActions.onDone
-            Go -> keyboardActions.onGo
-            Next -> keyboardActions.onNext
-            Previous -> keyboardActions.onPrevious
-            Search -> keyboardActions.onSearch
-            Send -> keyboardActions.onSend
-            Default, None -> null
-            else -> error("invalid ImeAction")
-        }
+        val keyboardAction =
+            when (imeAction) {
+                Done -> keyboardActions.onDone
+                Go -> keyboardActions.onGo
+                Next -> keyboardActions.onNext
+                Previous -> keyboardActions.onPrevious
+                Search -> keyboardActions.onSearch
+                Send -> keyboardActions.onSend
+                Default,
+                None -> null
+                else -> error("invalid ImeAction")
+            }
         keyboardAction?.invoke(this) ?: defaultKeyboardAction(imeAction)
     }
 
-    /**
-     * Default implementations for [KeyboardActions].
-     */
+    /** Default implementations for [KeyboardActions]. */
     override fun defaultKeyboardAction(imeAction: ImeAction) {
         when (imeAction) {
             Next -> focusManager.moveFocus(FocusDirection.Next)
@@ -74,7 +67,11 @@
             Done -> keyboardController?.hide()
             // Note: Don't replace this with an else. These are specified explicitly so that we
             // don't forget to update this when statement when new imeActions are added.
-            Go, Search, Send, Default, None -> Unit // Do Nothing.
+            Go,
+            Search,
+            Send,
+            Default,
+            None -> Unit // Do Nothing.
         }
     }
 }
diff --git a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/KeyboardActions.kt b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/KeyboardActions.kt
index 428c7b8..319ddd1 100644
--- a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/KeyboardActions.kt
+++ b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/KeyboardActions.kt
@@ -26,21 +26,21 @@
 @Stable
 class KeyboardActions(
     /**
-     * This is run when the user triggers the [Done][ImeAction.Done] action. A null value
-     * indicates that the default implementation if any, should be executed.
+     * This is run when the user triggers the [Done][ImeAction.Done] action. A null value indicates
+     * that the default implementation if any, should be executed.
      */
     val onDone: (KeyboardActionScope.() -> Unit)? = null,
 
     /**
-     * This is run when the user triggers the [Go][ImeAction.Go] action. A null value indicates
-     * that the default implementation if any, should be executed.
+     * This is run when the user triggers the [Go][ImeAction.Go] action. A null value indicates that
+     * the default implementation if any, should be executed.
      */
     val onGo: (KeyboardActionScope.() -> Unit)? = null,
 
     /**
-     * This is run when the user triggers the [Next][ImeAction.Next] action. A null value
-     * indicates that the default implementation should be executed. The default implementation
-     * moves focus to the next item in the focus traversal order.
+     * This is run when the user triggers the [Next][ImeAction.Next] action. A null value indicates
+     * that the default implementation should be executed. The default implementation moves focus to
+     * the next item in the focus traversal order.
      *
      * See [Modifier.focusProperties()][androidx.compose.ui.focus.focusProperties] for more details
      * on how to specify a custom focus order if needed.
@@ -64,8 +64,8 @@
     val onSearch: (KeyboardActionScope.() -> Unit)? = null,
 
     /**
-     * This is run when the user triggers the [Send][ImeAction.Send] action. A null value
-     * indicates that the default implementation if any, should be executed.
+     * This is run when the user triggers the [Send][ImeAction.Send] action. A null value indicates
+     * that the default implementation if any, should be executed.
      */
     val onSend: (KeyboardActionScope.() -> Unit)? = null
 ) {
@@ -97,29 +97,23 @@
          * Use this default value if you don't want to specify any action but want to use the
          * default action implementations.
          */
-        @Stable
-        val Default: KeyboardActions = KeyboardActions()
+        @Stable val Default: KeyboardActions = KeyboardActions()
     }
 }
 
-/**
- * Creates an instance of [KeyboardActions] that uses the specified lambda for all [ImeAction]s.
- */
-fun KeyboardActions(onAny: KeyboardActionScope.() -> Unit): KeyboardActions = KeyboardActions(
-    onDone = onAny,
-    onGo = onAny,
-    onNext = onAny,
-    onPrevious = onAny,
-    onSearch = onAny,
-    onSend = onAny
-)
+/** Creates an instance of [KeyboardActions] that uses the specified lambda for all [ImeAction]s. */
+fun KeyboardActions(onAny: KeyboardActionScope.() -> Unit): KeyboardActions =
+    KeyboardActions(
+        onDone = onAny,
+        onGo = onAny,
+        onNext = onAny,
+        onPrevious = onAny,
+        onSearch = onAny,
+        onSend = onAny
+    )
 
-/**
- * This scope can be used to execute the default action implementation.
- */
+/** This scope can be used to execute the default action implementation. */
 interface KeyboardActionScope {
-    /**
-     * Runs the default implementation for the specified [action][ImeAction].
-     */
+    /** Runs the default implementation for the specified [action][ImeAction]. */
     fun defaultKeyboardAction(imeAction: ImeAction)
 }
diff --git a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/KeyboardOptions.kt b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/KeyboardOptions.kt
index e09edb0..cb5195f 100644
--- a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/KeyboardOptions.kt
+++ b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/KeyboardOptions.kt
@@ -26,81 +26,69 @@
 import androidx.compose.ui.text.intl.LocaleList
 
 /**
- * The keyboard configuration options for TextFields. It is not guaranteed if software keyboard
- * will comply with the options provided here.
+ * The keyboard configuration options for TextFields. It is not guaranteed if software keyboard will
+ * comply with the options provided here.
  *
- * @param capitalization informs the keyboard whether to automatically capitalize characters,
- * words or sentences. Only applicable to only text based [KeyboardType]s such as
- * [KeyboardType.Text], [KeyboardType.Ascii]. It will not be applied to [KeyboardType]s such as
- * [KeyboardType.Number].
+ * @param capitalization informs the keyboard whether to automatically capitalize characters, words
+ *   or sentences. Only applicable to only text based [KeyboardType]s such as [KeyboardType.Text],
+ *   [KeyboardType.Ascii]. It will not be applied to [KeyboardType]s such as [KeyboardType.Number].
  * @param autoCorrectEnabled informs the keyboard whether to enable auto correct. Only applicable to
- * text based [KeyboardType]s such as [KeyboardType.Email], [KeyboardType.Uri]. It will not be
- * applied to [KeyboardType]s such as [KeyboardType.Number]. Most of keyboard implementations ignore
- * this value for [KeyboardType]s such as [KeyboardType.Text]. A null value (the default parameter
- * value) means autocorrect will be enabled.
- * @param keyboardType The keyboard type to be used in this text field. Note that this input type
- * is honored by keyboard and shows corresponding keyboard but this is not guaranteed. For example,
- * some keyboards may send non-ASCII character even if you set [KeyboardType.Ascii].
+ *   text based [KeyboardType]s such as [KeyboardType.Email], [KeyboardType.Uri]. It will not be
+ *   applied to [KeyboardType]s such as [KeyboardType.Number]. Most of keyboard implementations
+ *   ignore this value for [KeyboardType]s such as [KeyboardType.Text]. A null value (the default
+ *   parameter value) means autocorrect will be enabled.
+ * @param keyboardType The keyboard type to be used in this text field. Note that this input type is
+ *   honored by keyboard and shows corresponding keyboard but this is not guaranteed. For example,
+ *   some keyboards may send non-ASCII character even if you set [KeyboardType.Ascii].
  * @param imeAction The IME action. This IME action is honored by keyboard and may show specific
- * icons on the keyboard. For example, search icon may be shown if [ImeAction.Search] is specified.
- * When [ImeOptions.singleLine] is false, the keyboard might show return key rather than the action
- * requested here.
+ *   icons on the keyboard. For example, search icon may be shown if [ImeAction.Search] is
+ *   specified. When [ImeOptions.singleLine] is false, the keyboard might show return key rather
+ *   than the action requested here.
  * @param platformImeOptions defines the platform specific IME options.
- * @param showKeyboardOnFocus when true, software keyboard will show on focus gain. When
- * false, the user must interact (e.g. tap) before the keyboard is shown. A null value (the default
- * parameter value) means the keyboard will be shown on focus.
+ * @param showKeyboardOnFocus when true, software keyboard will show on focus gain. When false, the
+ *   user must interact (e.g. tap) before the keyboard is shown. A null value (the default parameter
+ *   value) means the keyboard will be shown on focus.
  * @param hintLocales List of the languages that the user is supposed to switch to no matter what
- * input method subtype is currently used. This special "hint" can be used mainly for, but not
- * limited to, multilingual users who want IMEs to switch language based on editor's context.
- * Pass null to express the intention that a specific hint should not be set.
+ *   input method subtype is currently used. This special "hint" can be used mainly for, but not
+ *   limited to, multilingual users who want IMEs to switch language based on editor's context. Pass
+ *   null to express the intention that a specific hint should not be set.
  */
 @Immutable
 class KeyboardOptions(
     val capitalization: KeyboardCapitalization = KeyboardCapitalization.Unspecified,
-    @Suppress("AutoBoxing")
-    @get:Suppress("AutoBoxing")
-    val autoCorrectEnabled: Boolean? = null,
+    @Suppress("AutoBoxing") @get:Suppress("AutoBoxing") val autoCorrectEnabled: Boolean? = null,
     val keyboardType: KeyboardType = KeyboardType.Unspecified,
     val imeAction: ImeAction = ImeAction.Unspecified,
     val platformImeOptions: PlatformImeOptions? = null,
-    @Suppress("AutoBoxing")
-    @get:Suppress("AutoBoxing")
-    val showKeyboardOnFocus: Boolean? = null,
-    @get:Suppress("NullableCollection")
-    val hintLocales: LocaleList? = null,
+    @Suppress("AutoBoxing") @get:Suppress("AutoBoxing") val showKeyboardOnFocus: Boolean? = null,
+    @get:Suppress("NullableCollection") val hintLocales: LocaleList? = null,
 ) {
 
     companion object {
-        /**
-         * Default [KeyboardOptions]. Please see parameter descriptions for default values.
-         */
-        @Stable
-        val Default = KeyboardOptions()
+        /** Default [KeyboardOptions]. Please see parameter descriptions for default values. */
+        @Stable val Default = KeyboardOptions()
 
-        /**
-         * Default [KeyboardOptions] for [BasicSecureTextField].
-         */
+        /** Default [KeyboardOptions] for [BasicSecureTextField]. */
         @Stable
-        internal val SecureTextField = KeyboardOptions(
-            autoCorrectEnabled = false,
-            keyboardType = KeyboardType.Password
-        )
+        internal val SecureTextField =
+            KeyboardOptions(autoCorrectEnabled = false, keyboardType = KeyboardType.Password)
     }
 
     @Deprecated(
         "Please use the new constructor that takes optional autoCorrectEnabled parameter.",
         level = DeprecationLevel.WARNING,
-        replaceWith = ReplaceWith(
-            "KeyboardOptions(" +
-                "capitalization = capitalization, " +
-                "autoCorrectEnabled = autoCorrect, " +
-                "keyboardType = keyboardType, " +
-                "imeAction = imeAction," +
-                "platformImeOptions = platformImeOptions, " +
-                "showKeyboardOnFocus = showKeyboardOnFocus," +
-                "hintLocales = hintLocales" +
-                ")"
-        )
+        replaceWith =
+            ReplaceWith(
+                "KeyboardOptions(" +
+                    "capitalization = capitalization, " +
+                    "autoCorrectEnabled = autoCorrect, " +
+                    "keyboardType = keyboardType, " +
+                    "imeAction = imeAction," +
+                    "platformImeOptions = platformImeOptions, " +
+                    "showKeyboardOnFocus = showKeyboardOnFocus," +
+                    "hintLocales = hintLocales" +
+                    ")"
+            )
     )
     constructor(
         capitalization: KeyboardCapitalization = KeyboardCapitalization.Unspecified,
@@ -108,10 +96,8 @@
         keyboardType: KeyboardType = KeyboardType.Unspecified,
         imeAction: ImeAction = ImeAction.Unspecified,
         platformImeOptions: PlatformImeOptions? = null,
-        @Suppress("AutoBoxing")
-        showKeyboardOnFocus: Boolean? = null,
-        @Suppress("NullableCollection")
-        hintLocales: LocaleList? = null,
+        @Suppress("AutoBoxing") showKeyboardOnFocus: Boolean? = null,
+        @Suppress("NullableCollection") hintLocales: LocaleList? = null,
     ) : this(
         capitalization = capitalization,
         autoCorrectEnabled = autoCorrect,
@@ -155,11 +141,9 @@
         showKeyboardOnFocus = Default.showKeyboardOnFocusOrDefault
     )
 
-    @Deprecated(
-        "Please use the autoCorrectEnabled property.",
-        level = DeprecationLevel.WARNING
-    )
-    val autoCorrect: Boolean get() = autoCorrectOrDefault
+    @Deprecated("Please use the autoCorrectEnabled property.", level = DeprecationLevel.WARNING)
+    val autoCorrect: Boolean
+        get() = autoCorrectOrDefault
 
     // Suppress GetterSetterNames because this is how the property was named previously.
     @Suppress("unused", "GetterSetterNames")
@@ -168,34 +152,38 @@
         "Included for binary compatibility. Use showKeyboardOnFocus.",
         level = DeprecationLevel.HIDDEN
     )
-    val shouldShowKeyboardOnFocus: Boolean get() = showKeyboardOnFocus ?: true
+    val shouldShowKeyboardOnFocus: Boolean
+        get() = showKeyboardOnFocus ?: true
 
     private val autoCorrectOrDefault: Boolean
-        get() = autoCorrectEnabled
-            ?: true
+        get() = autoCorrectEnabled ?: true
+
     private val capitalizationOrDefault: KeyboardCapitalization
-        get() = capitalization.takeUnless { it == KeyboardCapitalization.Unspecified }
-            ?: KeyboardCapitalization.None
+        get() =
+            capitalization.takeUnless { it == KeyboardCapitalization.Unspecified }
+                ?: KeyboardCapitalization.None
+
     private val keyboardTypeOrDefault: KeyboardType
-        get() = keyboardType.takeUnless { it == KeyboardType.Unspecified }
-            ?: KeyboardType.Text
+        get() = keyboardType.takeUnless { it == KeyboardType.Unspecified } ?: KeyboardType.Text
+
     internal val imeActionOrDefault: ImeAction
-        get() = imeAction.takeUnless { it == ImeAction.Unspecified }
-            ?: ImeAction.Default
+        get() = imeAction.takeUnless { it == ImeAction.Unspecified } ?: ImeAction.Default
+
     internal val showKeyboardOnFocusOrDefault: Boolean
-        get() = showKeyboardOnFocus
-            ?: true
+        get() = showKeyboardOnFocus ?: true
+
     private val hintLocalesOrDefault: LocaleList
         get() = hintLocales ?: LocaleList.Empty
 
     private val isCompletelyUnspecified: Boolean
-        get() = capitalization == KeyboardCapitalization.Unspecified &&
-            autoCorrectEnabled == null &&
-            keyboardType == KeyboardType.Unspecified &&
-            imeAction == ImeAction.Unspecified &&
-            platformImeOptions == null &&
-            showKeyboardOnFocus == null &&
-            hintLocales == null
+        get() =
+            capitalization == KeyboardCapitalization.Unspecified &&
+                autoCorrectEnabled == null &&
+                keyboardType == KeyboardType.Unspecified &&
+                imeAction == ImeAction.Unspecified &&
+                platformImeOptions == null &&
+                showKeyboardOnFocus == null &&
+                hintLocales == null
 
     /**
      * Returns a new [ImeOptions] with the values that are in this [KeyboardOptions] and provided
@@ -203,15 +191,16 @@
      *
      * @param singleLine see [ImeOptions.singleLine]
      */
-    internal fun toImeOptions(singleLine: Boolean = ImeOptions.Default.singleLine) = ImeOptions(
-        singleLine = singleLine,
-        capitalization = capitalizationOrDefault,
-        autoCorrect = autoCorrectOrDefault,
-        keyboardType = keyboardTypeOrDefault,
-        imeAction = imeActionOrDefault,
-        platformImeOptions = platformImeOptions,
-        hintLocales = hintLocalesOrDefault
-    )
+    internal fun toImeOptions(singleLine: Boolean = ImeOptions.Default.singleLine) =
+        ImeOptions(
+            singleLine = singleLine,
+            capitalization = capitalizationOrDefault,
+            autoCorrect = autoCorrectOrDefault,
+            keyboardType = keyboardTypeOrDefault,
+            imeAction = imeActionOrDefault,
+            platformImeOptions = platformImeOptions,
+            hintLocales = hintLocalesOrDefault
+        )
 
     /**
      * Returns a copy of this object with the values passed to this method.
@@ -222,13 +211,11 @@
      */
     fun copy(
         capitalization: KeyboardCapitalization = this.capitalization,
-        @Suppress("AutoBoxing")
-        autoCorrectEnabled: Boolean? = this.autoCorrectEnabled,
+        @Suppress("AutoBoxing") autoCorrectEnabled: Boolean? = this.autoCorrectEnabled,
         keyboardType: KeyboardType = this.keyboardType,
         imeAction: ImeAction = this.imeAction,
         platformImeOptions: PlatformImeOptions? = this.platformImeOptions,
-        @Suppress("AutoBoxing")
-        showKeyboardOnFocus: Boolean? = null,
+        @Suppress("AutoBoxing") showKeyboardOnFocus: Boolean? = null,
         hintLocales: LocaleList? = null
     ): KeyboardOptions {
         return KeyboardOptions(
@@ -245,17 +232,18 @@
     @Deprecated(
         "Please use the copy function that takes an autoCorrectEnabled parameter.",
         level = DeprecationLevel.HIDDEN,
-        replaceWith = ReplaceWith(
-            "copy(" +
-                "capitalization = capitalization, " +
-                "autoCorrectEnabled = autoCorrect, " +
-                "keyboardType = keyboardType, " +
-                "imeAction = imeAction," +
-                "platformImeOptions = platformImeOptions, " +
-                "showKeyboardOnFocus = showKeyboardOnFocus ?: true," +
-                "hintLocales = hintLocales" +
-                ")"
-        )
+        replaceWith =
+            ReplaceWith(
+                "copy(" +
+                    "capitalization = capitalization, " +
+                    "autoCorrectEnabled = autoCorrect, " +
+                    "keyboardType = keyboardType, " +
+                    "imeAction = imeAction," +
+                    "platformImeOptions = platformImeOptions, " +
+                    "showKeyboardOnFocus = showKeyboardOnFocus ?: true," +
+                    "hintLocales = hintLocales" +
+                    ")"
+            )
     )
     fun copy(
         capitalization: KeyboardCapitalization = this.capitalization,
@@ -263,8 +251,7 @@
         keyboardType: KeyboardType = this.keyboardType,
         imeAction: ImeAction = this.imeAction,
         platformImeOptions: PlatformImeOptions? = this.platformImeOptions,
-        @Suppress("AutoBoxing")
-        showKeyboardOnFocus: Boolean? = this.showKeyboardOnFocusOrDefault,
+        @Suppress("AutoBoxing") showKeyboardOnFocus: Boolean? = this.showKeyboardOnFocusOrDefault,
         hintLocales: LocaleList? = this.hintLocales
     ): KeyboardOptions {
         return KeyboardOptions(
@@ -278,10 +265,7 @@
         )
     }
 
-    @Deprecated(
-        "Maintained for binary compatibility",
-        level = DeprecationLevel.HIDDEN
-    )
+    @Deprecated("Maintained for binary compatibility", level = DeprecationLevel.HIDDEN)
     fun copy(
         capitalization: KeyboardCapitalization = this.capitalization,
         autoCorrect: Boolean = this.autoCorrectOrDefault,
@@ -367,8 +351,8 @@
      * Returns a new [KeyboardOptions] that is a combination of this options and a given [other]
      * options.
      *
-     * [other]s null or `Unspecified` properties are replaced with the non-null properties of
-     * this object.
+     * [other]s null or `Unspecified` properties are replaced with the non-null properties of this
+     * object.
      *
      * If the either this or [other] is null, returns the non-null one.
      */
@@ -381,8 +365,8 @@
      * options.
      *
      * This object's null or `Unspecified` properties are replaced with the non-null properties of
-     * [other]. This differs from the behavior of [copy], which always takes the
-     * passed value over the current one, even if an unspecified value is passed.
+     * [other]. This differs from the behavior of [copy], which always takes the passed value over
+     * the current one, even if an unspecified value is passed.
      *
      * If the either this or [other] is null, returns the non-null one.
      */
@@ -393,23 +377,18 @@
         if (this.isCompletelyUnspecified) return other
 
         return KeyboardOptions(
-            capitalization = this.capitalization
-                .takeUnless { it == KeyboardCapitalization.Unspecified }
-                ?: other.capitalization,
-            autoCorrectEnabled = this.autoCorrectEnabled
-                ?: other.autoCorrectEnabled,
-            keyboardType = this.keyboardType
-                .takeUnless { it == KeyboardType.Unspecified }
-                ?: other.keyboardType,
-            imeAction = this.imeAction
-                .takeUnless { it == ImeAction.Unspecified }
-                ?: other.imeAction,
-            platformImeOptions = this.platformImeOptions
-                ?: other.platformImeOptions,
-            showKeyboardOnFocus = this.showKeyboardOnFocus
-                ?: other.showKeyboardOnFocus,
-            hintLocales = this.hintLocales
-                ?: other.hintLocales
+            capitalization =
+                this.capitalization.takeUnless { it == KeyboardCapitalization.Unspecified }
+                    ?: other.capitalization,
+            autoCorrectEnabled = this.autoCorrectEnabled ?: other.autoCorrectEnabled,
+            keyboardType =
+                this.keyboardType.takeUnless { it == KeyboardType.Unspecified }
+                    ?: other.keyboardType,
+            imeAction =
+                this.imeAction.takeUnless { it == ImeAction.Unspecified } ?: other.imeAction,
+            platformImeOptions = this.platformImeOptions ?: other.platformImeOptions,
+            showKeyboardOnFocus = this.showKeyboardOnFocus ?: other.showKeyboardOnFocus,
+            hintLocales = this.hintLocales ?: other.hintLocales
         )
     }
 }
diff --git a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/LongPressTextDragObserver.kt b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/LongPressTextDragObserver.kt
index c1f1066..0eae393 100644
--- a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/LongPressTextDragObserver.kt
+++ b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/LongPressTextDragObserver.kt
@@ -39,15 +39,13 @@
      */
     fun onDown(point: Offset)
 
-    /**
-     * Called after [onDown] if an up event is received without dragging.
-     */
+    /** Called after [onDown] if an up event is received without dragging. */
     fun onUp()
 
     /**
-     * Called once a drag gesture has started, which means touch slop has been exceeded.
-     * [onDown] _may_ be called before this method if the down event could not have
-     * started a different gesture.
+     * Called once a drag gesture has started, which means touch slop has been exceeded. [onDown]
+     * _may_ be called before this method if the down event could not have started a different
+     * gesture.
      */
     fun onStart(startPoint: Offset)
 
@@ -60,16 +58,13 @@
 
 internal suspend fun PointerInputScope.detectDragGesturesAfterLongPressWithObserver(
     observer: TextDragObserver
-) = detectDragGesturesAfterLongPress(
-    onDragEnd = { observer.onStop() },
-    onDrag = { _, offset ->
-        observer.onDrag(offset)
-    },
-    onDragStart = {
-        observer.onStart(it)
-    },
-    onDragCancel = { observer.onCancel() }
-)
+) =
+    detectDragGesturesAfterLongPress(
+        onDragEnd = { observer.onStop() },
+        onDrag = { _, offset -> observer.onDrag(offset) },
+        onDragStart = { observer.onStart(it) },
+        onDragCancel = { observer.onCancel() }
+    )
 
 /**
  * Detects gesture events for a [TextDragObserver], including both initial down events and drag
@@ -79,19 +74,12 @@
     observer: TextDragObserver
 ) {
     coroutineScope {
-        launch(start = CoroutineStart.UNDISPATCHED) {
-            detectPreDragGesturesWithObserver(observer)
-        }
-        launch(start = CoroutineStart.UNDISPATCHED) {
-            detectDragGesturesWithObserver(observer)
-        }
+        launch(start = CoroutineStart.UNDISPATCHED) { detectPreDragGesturesWithObserver(observer) }
+        launch(start = CoroutineStart.UNDISPATCHED) { detectDragGesturesWithObserver(observer) }
     }
 }
 
-/**
- * Detects initial down events and calls [TextDragObserver.onDown] and
- * [TextDragObserver.onUp].
- */
+/** Detects initial down events and calls [TextDragObserver.onDown] and [TextDragObserver.onUp]. */
 private suspend fun PointerInputScope.detectPreDragGesturesWithObserver(
     observer: TextDragObserver
 ) {
@@ -106,20 +94,12 @@
     }
 }
 
-/**
- * Detects drag gestures for a [TextDragObserver].
- */
-private suspend fun PointerInputScope.detectDragGesturesWithObserver(
-    observer: TextDragObserver
-) {
+/** Detects drag gestures for a [TextDragObserver]. */
+private suspend fun PointerInputScope.detectDragGesturesWithObserver(observer: TextDragObserver) {
     detectDragGestures(
         onDragEnd = { observer.onStop() },
-        onDrag = { _, offset ->
-            observer.onDrag(offset)
-        },
-        onDragStart = {
-            observer.onStart(it)
-        },
+        onDrag = { _, offset -> observer.onDrag(offset) },
+        onDragStart = { observer.onStart(it) },
         onDragCancel = { observer.onCancel() }
     )
 }
diff --git a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/PointerMoveDetector.kt b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/PointerMoveDetector.kt
index 994642f..12e6ae7 100644
--- a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/PointerMoveDetector.kt
+++ b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/PointerMoveDetector.kt
@@ -25,10 +25,10 @@
 import kotlinx.coroutines.isActive
 
 /**
- * Detects pointer events that result from pointer movements and feed said events to the
- * [onMove] function. When multiple pointers are being used, only the first one is tracked.
- * If the first pointer is then removed, the second pointer will take its place as the first
- * pointer and be tracked.
+ * Detects pointer events that result from pointer movements and feed said events to the [onMove]
+ * function. When multiple pointers are being used, only the first one is tracked. If the first
+ * pointer is then removed, the second pointer will take its place as the first pointer and be
+ * tracked.
  *
  * @param pointerEventPass which pass to capture the pointer event from, see [PointerEventPass]
  * @param onMove function that handles the position of move events
@@ -43,8 +43,12 @@
         while (currentContext.isActive) {
             val event = awaitPointerEvent(pointerEventPass)
             when (event.type) {
-                PointerEventType.Move, PointerEventType.Enter, PointerEventType.Exit ->
-                    event.changes.first().position
+                PointerEventType.Move,
+                PointerEventType.Enter,
+                PointerEventType.Exit ->
+                    event.changes
+                        .first()
+                        .position
                         .takeUnless { it == previousPosition }
                         ?.let { position ->
                             previousPosition = position
diff --git a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/StringHelpers.kt b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/StringHelpers.kt
index 9cb7a5a..0fd008b 100644
--- a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/StringHelpers.kt
+++ b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/StringHelpers.kt
@@ -21,9 +21,7 @@
 /** StringBuilder.appendCodePoint is already defined on JVM so it's called appendCodePointX. */
 internal expect fun StringBuilder.appendCodePointX(codePoint: Int): StringBuilder
 
-/**
- * Returns the index of the character break preceding [index].
- */
+/** Returns the index of the character break preceding [index]. */
 internal expect fun String.findPrecedingBreak(index: Int): Int
 
 /**
diff --git a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/TextDelegate.kt b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/TextDelegate.kt
index ca3f5a8..75f76f8 100644
--- a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/TextDelegate.kt
+++ b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/TextDelegate.kt
@@ -44,42 +44,32 @@
  * An object that paints text onto a [Canvas].
  *
  * To use a [TextDelegate], follow these steps:
- *
  * 1. Create an [AnnotatedString] and pass it to the [TextDelegate] constructor.
- *
  * 2. Call [layout] to prepare the paragraph.
- *
  * 3. Call [paint] as often as desired to paint the paragraph.
  *
- *  If the width of the area into which the text is being painted changes, return to step 2. If the
- *  text to be painted changes, return to step 1.
+ * If the width of the area into which the text is being painted changes, return to step 2. If the
+ * text to be painted changes, return to step 1.
  *
  * @param text the text to paint.
- *
- * @param style The text style specified to render the text. Notice that you can also set text
- * style on the given [AnnotatedString], and the style set on [text] always has higher priority
- * than this setting. But if only one global text style is needed, passing it to [TextDelegate]
- * is always preferred.
- *
- * @param maxLines An optional maximum number of lines for the text to span, wrapping if
- * necessary. If the text exceeds the given number of lines, it is truncated such that subsequent
- * lines are dropped. It is required that 1 <= [minLines] <= [maxLines].
- *
+ * @param style The text style specified to render the text. Notice that you can also set text style
+ *   on the given [AnnotatedString], and the style set on [text] always has higher priority than
+ *   this setting. But if only one global text style is needed, passing it to [TextDelegate] is
+ *   always preferred.
+ * @param maxLines An optional maximum number of lines for the text to span, wrapping if necessary.
+ *   If the text exceeds the given number of lines, it is truncated such that subsequent lines are
+ *   dropped. It is required that 1 <= [minLines] <= [maxLines].
  * @param minLines The minimum height in terms of minimum number of visible lines. It is required
- * that 1 <= [minLines] <= [maxLines].
- *
+ *   that 1 <= [minLines] <= [maxLines].
  * @param softWrap Whether the text should break at soft line breaks. If false, the glyphs in the
- * text will be positioned as if there was unlimited horizontal space. If [softWrap] is false,
- * [overflow] and [TextAlign] may have unexpected effects.
- *
- * @param overflow How visual overflow should be handled. Specifically, the ellipsis is applied
- * to the last line before the line truncated by [maxLines], if [maxLines] is non-null and that
- * line overflows the width constraint.
- *
+ *   text will be positioned as if there was unlimited horizontal space. If [softWrap] is false,
+ *   [overflow] and [TextAlign] may have unexpected effects.
+ * @param overflow How visual overflow should be handled. Specifically, the ellipsis is applied to
+ *   the last line before the line truncated by [maxLines], if [maxLines] is non-null and that line
+ *   overflows the width constraint.
  * @param density The [Density] object that provides pixel density information of the device
- *
- * @param placeholders a list of [Placeholder]s that specify ranges of text where the original
- * text is replaced empty spaces. It's typically used to embed images into text.
+ * @param placeholders a list of [Placeholder]s that specify ranges of text where the original text
+ *   is replaced empty spaces. It's typically used to embed images into text.
  */
 @Stable
 internal class TextDelegate(
@@ -100,22 +90,26 @@
     internal var paragraphIntrinsics: MultiParagraphIntrinsics? = null
     internal var intrinsicsLayoutDirection: LayoutDirection? = null
 
-    private val nonNullIntrinsics: MultiParagraphIntrinsics get() = paragraphIntrinsics
-        ?: throw IllegalStateException("layoutIntrinsics must be called first")
+    private val nonNullIntrinsics: MultiParagraphIntrinsics
+        get() =
+            paragraphIntrinsics
+                ?: throw IllegalStateException("layoutIntrinsics must be called first")
 
     /**
      * The width for text if all soft wrap opportunities were taken.
      *
      * Valid only after [layout] has been called.
      */
-    val minIntrinsicWidth: Int get() = nonNullIntrinsics.minIntrinsicWidth.ceilToIntPx()
+    val minIntrinsicWidth: Int
+        get() = nonNullIntrinsics.minIntrinsicWidth.ceilToIntPx()
 
     /**
      * The width at which increasing the width of the text no longer decreases the height.
      *
      * Valid only after [layout] has been called.
      */
-    val maxIntrinsicWidth: Int get() = nonNullIntrinsics.maxIntrinsicWidth.ceilToIntPx()
+    val maxIntrinsicWidth: Int
+        get() = nonNullIntrinsics.maxIntrinsicWidth.ceilToIntPx()
 
     init {
         require(maxLines > 0) { "no maxLines" }
@@ -125,22 +119,23 @@
 
     fun layoutIntrinsics(layoutDirection: LayoutDirection) {
         val localIntrinsics = paragraphIntrinsics
-        val intrinsics = if (
-            localIntrinsics == null ||
-            layoutDirection != intrinsicsLayoutDirection ||
-            localIntrinsics.hasStaleResolvedFonts
-        ) {
-            intrinsicsLayoutDirection = layoutDirection
-            MultiParagraphIntrinsics(
-                annotatedString = text,
-                style = resolveDefaults(style, layoutDirection),
-                density = density,
-                fontFamilyResolver = fontFamilyResolver,
-                placeholders = placeholders
-            )
-        } else {
-            localIntrinsics
-        }
+        val intrinsics =
+            if (
+                localIntrinsics == null ||
+                    layoutDirection != intrinsicsLayoutDirection ||
+                    localIntrinsics.hasStaleResolvedFonts
+            ) {
+                intrinsicsLayoutDirection = layoutDirection
+                MultiParagraphIntrinsics(
+                    annotatedString = text,
+                    style = resolveDefaults(style, layoutDirection),
+                    density = density,
+                    fontFamilyResolver = fontFamilyResolver,
+                    placeholders = placeholders
+                )
+            } else {
+                localIntrinsics
+            }
 
         paragraphIntrinsics = intrinsics
     }
@@ -159,11 +154,12 @@
 
         val minWidth = constraints.minWidth
         val widthMatters = softWrap || overflow == TextOverflow.Ellipsis
-        val maxWidth = if (widthMatters && constraints.hasBoundedWidth) {
-            constraints.maxWidth
-        } else {
-            Constraints.Infinity
-        }
+        val maxWidth =
+            if (widthMatters && constraints.hasBoundedWidth) {
+                constraints.maxWidth
+            } else {
+                Constraints.Infinity
+            }
 
         // This is a fallback behavior because native text layout doesn't support multiple
         // ellipsis in one text layout.
@@ -191,20 +187,22 @@
         //           we can use it to layout
         //        else if max intrinsic width is greater than maxWidth, we can only use maxWidth
         //        else if max intrinsic width is less than minWidth, we should use minWidth
-        val width = if (minWidth == maxWidth) {
-            maxWidth
-        } else {
-            maxIntrinsicWidth.coerceIn(minWidth, maxWidth)
-        }
+        val width =
+            if (minWidth == maxWidth) {
+                maxWidth
+            } else {
+                maxIntrinsicWidth.coerceIn(minWidth, maxWidth)
+            }
 
         return MultiParagraph(
             intrinsics = nonNullIntrinsics,
-            constraints = Constraints.fitPrioritizingWidth(
-                minWidth = 0,
-                maxWidth = width,
-                minHeight = 0,
-                maxHeight = constraints.maxHeight
-            ),
+            constraints =
+                Constraints.fitPrioritizingWidth(
+                    minWidth = 0,
+                    maxWidth = width,
+                    minHeight = 0,
+                    maxHeight = constraints.maxHeight
+                ),
             // This is a fallback behavior for ellipsis. Native
             maxLines = finalMaxLines,
             ellipsis = overflow == TextOverflow.Ellipsis
@@ -216,48 +214,55 @@
         layoutDirection: LayoutDirection,
         prevResult: TextLayoutResult? = null
     ): TextLayoutResult {
-        if (prevResult != null && prevResult.canReuse(
-                text, style, placeholders, maxLines, softWrap, overflow, density, layoutDirection,
-                fontFamilyResolver, constraints
-            )
+        if (
+            prevResult != null &&
+                prevResult.canReuse(
+                    text,
+                    style,
+                    placeholders,
+                    maxLines,
+                    softWrap,
+                    overflow,
+                    density,
+                    layoutDirection,
+                    fontFamilyResolver,
+                    constraints
+                )
         ) {
             // NOTE(text-perf-review): seems like there's a nontrivial chance for us to be able
             // to just return prevResult here directly?
             return with(prevResult) {
                 copy(
-                    layoutInput = TextLayoutInput(
-                        layoutInput.text,
-                        style,
-                        layoutInput.placeholders,
-                        layoutInput.maxLines,
-                        layoutInput.softWrap,
-                        layoutInput.overflow,
-                        layoutInput.density,
-                        layoutInput.layoutDirection,
-                        layoutInput.fontFamilyResolver,
-                        constraints
-                    ),
-                    size = constraints.constrain(
-                        IntSize(
-                            multiParagraph.width.ceilToIntPx(),
-                            multiParagraph.height.ceilToIntPx()
+                    layoutInput =
+                        TextLayoutInput(
+                            layoutInput.text,
+                            style,
+                            layoutInput.placeholders,
+                            layoutInput.maxLines,
+                            layoutInput.softWrap,
+                            layoutInput.overflow,
+                            layoutInput.density,
+                            layoutInput.layoutDirection,
+                            layoutInput.fontFamilyResolver,
+                            constraints
+                        ),
+                    size =
+                        constraints.constrain(
+                            IntSize(
+                                multiParagraph.width.ceilToIntPx(),
+                                multiParagraph.height.ceilToIntPx()
+                            )
                         )
-                    )
                 )
             }
         }
 
-        val multiParagraph = layoutText(
-            constraints,
-            layoutDirection
-        )
+        val multiParagraph = layoutText(constraints, layoutDirection)
 
-        val size = constraints.constrain(
-            IntSize(
-                multiParagraph.width.ceilToIntPx(),
-                multiParagraph.height.ceilToIntPx()
+        val size =
+            constraints.constrain(
+                IntSize(multiParagraph.width.ceilToIntPx(), multiParagraph.height.ceilToIntPx())
             )
-        )
 
         // NOTE(text-perf-review): it feels odd to create the input + result at the same time. if
         // the allocation of these objects is 1:1 then it might make sense to just merge them?
@@ -289,11 +294,11 @@
          *
          * If you cannot see the text being painted, check that your text color does not conflict
          * with the background on which you are drawing. The default text color is white (to
-         * contrast with the default black background color), so if you are writing an
-         * application with a white background, the text will not be visible by default.
+         * contrast with the default black background color), so if you are writing an application
+         * with a white background, the text will not be visible by default.
          *
-         * To set the text style, specify a [SpanStyle] when creating the [AnnotatedString] that
-         * you pass to the [TextDelegate] constructor or to the [text] property.
+         * To set the text style, specify a [SpanStyle] when creating the [AnnotatedString] that you
+         * pass to the [TextDelegate] constructor or to the [text] property.
          */
         fun paint(canvas: Canvas, textLayoutResult: TextLayoutResult) {
             TextPainter.paint(canvas, textLayoutResult)
@@ -304,8 +309,8 @@
 internal fun Float.ceilToIntPx(): Int = ceil(this).fastRoundToInt()
 
 /**
- * Returns the [TextDelegate] passed as a [current] param if the input didn't change
- * otherwise creates a new [TextDelegate].
+ * Returns the [TextDelegate] passed as a [current] param if the input didn't change otherwise
+ * creates a new [TextDelegate].
  */
 internal fun updateTextDelegate(
     current: TextDelegate,
@@ -321,15 +326,16 @@
 ): TextDelegate {
     // NOTE(text-perf-review): whenever we have remember intrinsic implemented, this might be a
     // lot slower than the equivalent `remember(a, b, c, ...) { ... }` call.
-    return if (current.text != text ||
-        current.style != style ||
-        current.softWrap != softWrap ||
-        current.overflow != overflow ||
-        current.maxLines != maxLines ||
-        current.minLines != minLines ||
-        current.density != density ||
-        current.placeholders != placeholders ||
-        current.fontFamilyResolver !== fontFamilyResolver
+    return if (
+        current.text != text ||
+            current.style != style ||
+            current.softWrap != softWrap ||
+            current.overflow != overflow ||
+            current.maxLines != maxLines ||
+            current.minLines != minLines ||
+            current.density != density ||
+            current.placeholders != placeholders ||
+            current.fontFamilyResolver !== fontFamilyResolver
     ) {
         TextDelegate(
             text = text,
diff --git a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/TextFieldCursor.kt b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/TextFieldCursor.kt
index 68272fc..5b47636 100644
--- a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/TextFieldCursor.kt
+++ b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/TextFieldCursor.kt
@@ -42,56 +42,67 @@
     offsetMapping: OffsetMapping,
     cursorBrush: Brush,
     enabled: Boolean
-) = if (enabled) composed {
-    val cursorAnimation = remember { CursorAnimationState() }
-    // Don't bother animating the cursor if it wouldn't draw any pixels.
-    val isBrushSpecified = !(cursorBrush is SolidColor && cursorBrush.value.isUnspecified)
-    // Only animate the cursor when its window is actually focused. This also disables the cursor
-    // animation when the screen is off.
-    // TODO confirm screen-off behavior.
-    val isWindowFocused = LocalWindowInfo.current.isWindowFocused
-    if (isWindowFocused && state.hasFocus && value.selection.collapsed && isBrushSpecified) {
-        LaunchedEffect(value.annotatedString, value.selection) {
-            cursorAnimation.snapToVisibleAndAnimate()
-        }
-        drawWithContent {
-            this.drawContent()
-            val cursorAlphaValue = cursorAnimation.cursorAlpha
-            if (cursorAlphaValue != 0f) {
-                val transformedOffset = offsetMapping
-                    .originalToTransformed(value.selection.start)
-                val cursorRect = state.layoutResult?.value?.getCursorRect(transformedOffset)
-                    ?: Rect(0f, 0f, 0f, 0f)
-                val cursorWidth = DefaultCursorThickness.toPx()
-                val cursorX = (cursorRect.left + cursorWidth / 2)
-                    // Do not use coerceIn because it is not guaranteed that the minimum value is
-                    // smaller than the maximum value.
-                    .coerceAtMost(size.width - cursorWidth / 2)
-                    .coerceAtLeast(cursorWidth / 2)
+) =
+    if (enabled)
+        composed {
+            val cursorAnimation = remember { CursorAnimationState() }
+            // Don't bother animating the cursor if it wouldn't draw any pixels.
+            val isBrushSpecified = !(cursorBrush is SolidColor && cursorBrush.value.isUnspecified)
+            // Only animate the cursor when its window is actually focused. This also disables the
+            // cursor
+            // animation when the screen is off.
+            // TODO confirm screen-off behavior.
+            val isWindowFocused = LocalWindowInfo.current.isWindowFocused
+            if (
+                isWindowFocused && state.hasFocus && value.selection.collapsed && isBrushSpecified
+            ) {
+                LaunchedEffect(value.annotatedString, value.selection) {
+                    cursorAnimation.snapToVisibleAndAnimate()
+                }
+                drawWithContent {
+                    this.drawContent()
+                    val cursorAlphaValue = cursorAnimation.cursorAlpha
+                    if (cursorAlphaValue != 0f) {
+                        val transformedOffset =
+                            offsetMapping.originalToTransformed(value.selection.start)
+                        val cursorRect =
+                            state.layoutResult?.value?.getCursorRect(transformedOffset)
+                                ?: Rect(0f, 0f, 0f, 0f)
+                        val cursorWidth = DefaultCursorThickness.toPx()
+                        val cursorX =
+                            (cursorRect.left + cursorWidth / 2)
+                                // Do not use coerceIn because it is not guaranteed that the minimum
+                                // value is
+                                // smaller than the maximum value.
+                                .coerceAtMost(size.width - cursorWidth / 2)
+                                .coerceAtLeast(cursorWidth / 2)
 
-                drawLine(
-                    cursorBrush,
-                    Offset(cursorX, cursorRect.top),
-                    Offset(cursorX, cursorRect.bottom),
-                    alpha = cursorAlphaValue,
-                    strokeWidth = cursorWidth
-                )
+                        drawLine(
+                            cursorBrush,
+                            Offset(cursorX, cursorRect.top),
+                            Offset(cursorX, cursorRect.bottom),
+                            alpha = cursorAlphaValue,
+                            strokeWidth = cursorWidth
+                        )
+                    }
+                }
+            } else {
+                Modifier
             }
         }
-    } else {
-        Modifier
-    }
-} else this
+    else this
 
-private val cursorAnimationSpec: AnimationSpec<Float> = infiniteRepeatable(
-    animation = keyframes {
-        durationMillis = 1000
-        1f at 0
-        1f at 499
-        0f at 500
-        0f at 999
-    }
-)
+private val cursorAnimationSpec: AnimationSpec<Float> =
+    infiniteRepeatable(
+        animation =
+            keyframes {
+                durationMillis = 1000
+                1f at 0
+                1f at 499
+                0f at 500
+                0f at 999
+            }
+    )
 
 internal val DefaultCursorThickness = 2.dp
 
diff --git a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/TextFieldDelegate.kt b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/TextFieldDelegate.kt
index eabeb8e..83765eb 100644
--- a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/TextFieldDelegate.kt
+++ b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/TextFieldDelegate.kt
@@ -76,16 +76,17 @@
     text: String = EmptyTextReplacement,
     maxLines: Int = 1
 ): IntSize {
-    val paragraph = Paragraph(
-        text = text,
-        style = style,
-        spanStyles = listOf(),
-        maxLines = maxLines,
-        ellipsis = false,
-        density = density,
-        fontFamilyResolver = fontFamilyResolver,
-        constraints = Constraints()
-    )
+    val paragraph =
+        Paragraph(
+            text = text,
+            style = style,
+            spanStyles = listOf(),
+            maxLines = maxLines,
+            ellipsis = false,
+            density = density,
+            fontFamilyResolver = fontFamilyResolver,
+            constraints = Constraints()
+        )
     return IntSize(paragraph.minIntrinsicWidth.ceilToIntPx(), paragraph.height.ceilToIntPx())
 }
 
@@ -115,9 +116,9 @@
          * @param canvas The target canvas.
          * @param value The editor state
          * @param selectionPreviewHighlightRange Range to be highlighted to preview a handwriting
-         *     selection gesture
+         *   selection gesture
          * @param deletionPreviewHighlightRange Range to be highlighted to preview a handwriting
-         *     deletion gesture
+         *   deletion gesture
          * @param offsetMapping The offset map
          * @param textLayoutResult The text layout result
          * @param highlightPaint Paint used to draw highlight backgrounds
@@ -208,22 +209,24 @@
                 return
             }
             val focusOffsetInTransformed = offsetMapping.originalToTransformed(value.selection.max)
-            val bbox = when {
-                focusOffsetInTransformed < textLayoutResult.layoutInput.text.length -> {
-                    textLayoutResult.getBoundingBox(focusOffsetInTransformed)
+            val bbox =
+                when {
+                    focusOffsetInTransformed < textLayoutResult.layoutInput.text.length -> {
+                        textLayoutResult.getBoundingBox(focusOffsetInTransformed)
+                    }
+                    focusOffsetInTransformed != 0 -> {
+                        textLayoutResult.getBoundingBox(focusOffsetInTransformed - 1)
+                    }
+                    else -> { // empty text.
+                        val defaultSize =
+                            computeSizeForDefaultText(
+                                textDelegate.style,
+                                textDelegate.density,
+                                textDelegate.fontFamilyResolver
+                            )
+                        Rect(0f, 0f, 1.0f, defaultSize.height.toFloat())
+                    }
                 }
-                focusOffsetInTransformed != 0 -> {
-                    textLayoutResult.getBoundingBox(focusOffsetInTransformed - 1)
-                }
-                else -> { // empty text.
-                    val defaultSize = computeSizeForDefaultText(
-                        textDelegate.style,
-                        textDelegate.density,
-                        textDelegate.fontFamilyResolver
-                    )
-                    Rect(0f, 0f, 1.0f, defaultSize.height.toFloat())
-                }
-            }
             val globalLT = layoutCoordinates.localToRoot(Offset(bbox.left, bbox.top))
 
             textInputSession.notifyFocusedRect(
@@ -254,7 +257,8 @@
                         offsetMapping,
                         textLayoutResult.value,
                         { matrix ->
-                            innerTextFieldCoordinates.findRootCoordinates()
+                            innerTextFieldCoordinates
+                                .findRootCoordinates()
                                 .transformFrom(innerTextFieldCoordinates, matrix)
                         },
                         innerTextFieldCoordinates.visibleBounds(),
@@ -312,9 +316,8 @@
             offsetMapping: OffsetMapping,
             onValueChange: (TextFieldValue) -> Unit
         ) {
-            val offset = offsetMapping.transformedToOriginal(
-                textLayoutResult.getOffsetForPosition(position)
-            )
+            val offset =
+                offsetMapping.transformedToOriginal(textLayoutResult.getOffsetForPosition(position))
             onValueChange(editProcessor.toTextFieldValue().copy(selection = TextRange(offset)))
         }
 
@@ -338,12 +341,13 @@
             onImeActionPerformed: (ImeAction) -> Unit
         ): TextInputSession {
             var session: TextInputSession? = null
-            session = textInputService.startInput(
-                value = value,
-                imeOptions = imeOptions,
-                onEditCommand = { onEditCommand(it, editProcessor, onValueChange, session) },
-                onImeActionPerformed = onImeActionPerformed
-            )
+            session =
+                textInputService.startInput(
+                    value = value,
+                    imeOptions = imeOptions,
+                    onEditCommand = { onEditCommand(it, editProcessor, onValueChange, session) },
+                    onImeActionPerformed = onImeActionPerformed
+                )
             return session
         }
 
@@ -397,34 +401,34 @@
         }
 
         /**
-         *  Apply the composition text decoration (undeline) to the transformed text.
+         * Apply the composition text decoration (undeline) to the transformed text.
          *
-         *  @param compositionRange An input state
-         *  @param transformed A transformed text
-         *  @return The transformed text with composition decoration.
+         * @param compositionRange An input state
+         * @param transformed A transformed text
+         * @return The transformed text with composition decoration.
          */
         fun applyCompositionDecoration(
             compositionRange: TextRange,
             transformed: TransformedText
         ): TransformedText {
-            val startPositionTransformed = transformed.offsetMapping.originalToTransformed(
-                compositionRange.start
-            )
-            val endPositionTransformed = transformed.offsetMapping.originalToTransformed(
-                compositionRange.end
-            )
+            val startPositionTransformed =
+                transformed.offsetMapping.originalToTransformed(compositionRange.start)
+            val endPositionTransformed =
+                transformed.offsetMapping.originalToTransformed(compositionRange.end)
 
             // coerce into a valid range with start <= end
             val start = min(startPositionTransformed, endPositionTransformed)
             val coercedEnd = max(startPositionTransformed, endPositionTransformed)
             return TransformedText(
-                AnnotatedString.Builder(transformed.text).apply {
-                    addStyle(
-                        SpanStyle(textDecoration = TextDecoration.Underline),
-                        start,
-                        coercedEnd
-                    )
-                }.toAnnotatedString(),
+                AnnotatedString.Builder(transformed.text)
+                    .apply {
+                        addStyle(
+                            SpanStyle(textDecoration = TextDecoration.Underline),
+                            start,
+                            coercedEnd
+                        )
+                    }
+                    .toAnnotatedString(),
                 transformed.offsetMapping
             )
         }
diff --git a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/TextFieldGestureModifiers.kt b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/TextFieldGestureModifiers.kt
index fc713f4..bfb790f 100644
--- a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/TextFieldGestureModifiers.kt
+++ b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/TextFieldGestureModifiers.kt
@@ -30,7 +30,7 @@
     focusRequester: FocusRequester,
     interactionSource: MutableInteractionSource?,
     onFocusChanged: (FocusState) -> Unit
-) = this
-    .focusRequester(focusRequester)
-    .onFocusChanged(onFocusChanged)
-    .focusable(interactionSource = interactionSource, enabled = enabled)
+) =
+    this.focusRequester(focusRequester)
+        .onFocusChanged(onFocusChanged)
+        .focusable(interactionSource = interactionSource, enabled = enabled)
diff --git a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/TextFieldKeyInput.kt b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/TextFieldKeyInput.kt
index bef2433..b30d63f 100644
--- a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/TextFieldKeyInput.kt
+++ b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/TextFieldKeyInput.kt
@@ -43,9 +43,8 @@
 internal expect val KeyEvent.isTypedEvent: Boolean
 
 /**
- * It handles [KeyEvent]s and either process them as typed events or maps to
- * [KeyCommand] via [KeyMapping]. [KeyCommand] then is executed
- * using utility class [TextFieldPreparedSelection]
+ * It handles [KeyEvent]s and either process them as typed events or maps to [KeyCommand] via
+ * [KeyMapping]. [KeyCommand] then is executed using utility class [TextFieldPreparedSelection]
  */
 internal class TextFieldKeyInput(
     val state: LegacyTextFieldState,
@@ -62,11 +61,10 @@
     private val imeAction: ImeAction,
 ) {
     private fun List<EditCommand>.apply() {
-        val newTextFieldValue = state.processor.apply(
-            this.toMutableList().apply {
-                add(0, FinishComposingTextCommand())
-            }
-        )
+        val newTextFieldValue =
+            state.processor.apply(
+                this.toMutableList().apply { add(0, FinishComposingTextCommand()) }
+            )
 
         onValueChange(newTextFieldValue)
     }
@@ -127,49 +125,56 @@
                 KeyCommand.END -> moveCursorToEnd()
                 KeyCommand.DELETE_PREV_CHAR ->
                     deleteIfSelectedOr {
-                        DeleteSurroundingTextCommand(
-                            selection.end - getPrecedingCharacterIndex(),
-                            0
-                        )
-                    }?.apply()
+                            DeleteSurroundingTextCommand(
+                                selection.end - getPrecedingCharacterIndex(),
+                                0
+                            )
+                        }
+                        ?.apply()
                 KeyCommand.DELETE_NEXT_CHAR -> {
                     // Note that some software keyboards, such as Samsungs, go through this code
                     // path instead of making calls on the InputConnection directly.
                     deleteIfSelectedOr {
-                        val nextCharacterIndex = getNextCharacterIndex()
-                        // If there's no next character, it means the cursor is at the end of the
-                        // text, and this should be a no-op. See b/199919707.
-                        if (nextCharacterIndex != NoCharacterFound) {
-                            DeleteSurroundingTextCommand(0, nextCharacterIndex - selection.end)
-                        } else {
-                            null
+                            val nextCharacterIndex = getNextCharacterIndex()
+                            // If there's no next character, it means the cursor is at the end of
+                            // the
+                            // text, and this should be a no-op. See b/199919707.
+                            if (nextCharacterIndex != NoCharacterFound) {
+                                DeleteSurroundingTextCommand(0, nextCharacterIndex - selection.end)
+                            } else {
+                                null
+                            }
                         }
-                    }?.apply()
+                        ?.apply()
                 }
                 KeyCommand.DELETE_PREV_WORD ->
                     deleteIfSelectedOr {
-                        getPreviousWordOffset()?.let {
-                            DeleteSurroundingTextCommand(selection.end - it, 0)
+                            getPreviousWordOffset()?.let {
+                                DeleteSurroundingTextCommand(selection.end - it, 0)
+                            }
                         }
-                    }?.apply()
+                        ?.apply()
                 KeyCommand.DELETE_NEXT_WORD ->
                     deleteIfSelectedOr {
-                        getNextWordOffset()?.let {
-                            DeleteSurroundingTextCommand(0, it - selection.end)
+                            getNextWordOffset()?.let {
+                                DeleteSurroundingTextCommand(0, it - selection.end)
+                            }
                         }
-                    }?.apply()
+                        ?.apply()
                 KeyCommand.DELETE_FROM_LINE_START ->
                     deleteIfSelectedOr {
-                        getLineStartByOffset()?.let {
-                            DeleteSurroundingTextCommand(selection.end - it, 0)
+                            getLineStartByOffset()?.let {
+                                DeleteSurroundingTextCommand(selection.end - it, 0)
+                            }
                         }
-                    }?.apply()
+                        ?.apply()
                 KeyCommand.DELETE_TO_LINE_END ->
                     deleteIfSelectedOr {
-                        getLineEndByOffset()?.let {
-                            DeleteSurroundingTextCommand(0, it - selection.end)
+                            getLineEndByOffset()?.let {
+                                DeleteSurroundingTextCommand(0, it - selection.end)
+                            }
                         }
-                    }?.apply()
+                        ?.apply()
                 KeyCommand.NEW_LINE ->
                     if (!singleLine) {
                         CommitTextCommand("\n", 1).apply()
@@ -217,15 +222,17 @@
     }
 
     private fun commandExecutionContext(block: TextFieldPreparedSelection.() -> Unit) {
-        val preparedSelection = TextFieldPreparedSelection(
-            currentValue = value,
-            offsetMapping = offsetMapping,
-            layoutResultProxy = state.layoutResult,
-            state = preparedSelectionState
-        )
+        val preparedSelection =
+            TextFieldPreparedSelection(
+                currentValue = value,
+                offsetMapping = offsetMapping,
+                layoutResultProxy = state.layoutResult,
+                state = preparedSelectionState
+            )
         block(preparedSelection)
-        if (preparedSelection.selection != value.selection ||
-            preparedSelection.annotatedString != value.annotatedString
+        if (
+            preparedSelection.selection != value.selection ||
+                preparedSelection.annotatedString != value.annotatedString
         ) {
             onValueChange(preparedSelection.value)
         }
@@ -245,18 +252,19 @@
 ) = composed {
     val preparedSelectionState = remember { TextPreparedSelectionState() }
     val keyCombiner = remember { DeadKeyCombiner() }
-    val processor = TextFieldKeyInput(
-        state = state,
-        selectionManager = manager,
-        value = value,
-        editable = editable,
-        singleLine = singleLine,
-        offsetMapping = offsetMapping,
-        preparedSelectionState = preparedSelectionState,
-        undoManager = undoManager,
-        keyCombiner = keyCombiner,
-        onValueChange = onValueChange,
-        imeAction = imeAction,
-    )
+    val processor =
+        TextFieldKeyInput(
+            state = state,
+            selectionManager = manager,
+            value = value,
+            editable = editable,
+            singleLine = singleLine,
+            offsetMapping = offsetMapping,
+            preparedSelectionState = preparedSelectionState,
+            undoManager = undoManager,
+            keyCombiner = keyCombiner,
+            onValueChange = onValueChange,
+            imeAction = imeAction,
+        )
     Modifier.onKeyEvent(processor::process)
 }
diff --git a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/TextFieldPressGestureFilter.kt b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/TextFieldPressGestureFilter.kt
index dbb23d8..b3f1b54 100644
--- a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/TextFieldPressGestureFilter.kt
+++ b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/TextFieldPressGestureFilter.kt
@@ -30,55 +30,56 @@
 import androidx.compose.ui.input.pointer.pointerInput
 import kotlinx.coroutines.launch
 
-/**
- * Required for the press and tap [MutableInteractionSource] consistency for TextField.
- */
+/** Required for the press and tap [MutableInteractionSource] consistency for TextField. */
 internal fun Modifier.tapPressTextFieldModifier(
     interactionSource: MutableInteractionSource?,
     enabled: Boolean = true,
     onTap: (Offset) -> Unit
-): Modifier = if (enabled) composed {
-    val scope = rememberCoroutineScope()
-    val pressedInteraction = remember { mutableStateOf<PressInteraction.Press?>(null) }
-    val onTapState = rememberUpdatedState(onTap)
-    DisposableEffect(interactionSource) {
-        onDispose {
-            pressedInteraction.value?.let { oldValue ->
-                val interaction = PressInteraction.Cancel(oldValue)
-                interactionSource?.tryEmit(interaction)
-                pressedInteraction.value = null
-            }
-        }
-    }
-    Modifier.pointerInput(interactionSource) {
-        detectTapAndPress(
-            onPress = {
-                scope.launch {
-                    // Remove any old interactions if we didn't fire stop / cancel properly
+): Modifier =
+    if (enabled)
+        composed {
+            val scope = rememberCoroutineScope()
+            val pressedInteraction = remember { mutableStateOf<PressInteraction.Press?>(null) }
+            val onTapState = rememberUpdatedState(onTap)
+            DisposableEffect(interactionSource) {
+                onDispose {
                     pressedInteraction.value?.let { oldValue ->
                         val interaction = PressInteraction.Cancel(oldValue)
-                        interactionSource?.emit(interaction)
+                        interactionSource?.tryEmit(interaction)
                         pressedInteraction.value = null
                     }
-                    val interaction = PressInteraction.Press(it)
-                    interactionSource?.emit(interaction)
-                    pressedInteraction.value = interaction
                 }
-                val success = tryAwaitRelease()
-                scope.launch {
-                    pressedInteraction.value?.let { oldValue ->
-                        val interaction =
-                            if (success) {
-                                PressInteraction.Release(oldValue)
-                            } else {
-                                PressInteraction.Cancel(oldValue)
+            }
+            Modifier.pointerInput(interactionSource) {
+                detectTapAndPress(
+                    onPress = {
+                        scope.launch {
+                            // Remove any old interactions if we didn't fire stop / cancel properly
+                            pressedInteraction.value?.let { oldValue ->
+                                val interaction = PressInteraction.Cancel(oldValue)
+                                interactionSource?.emit(interaction)
+                                pressedInteraction.value = null
                             }
-                        interactionSource?.emit(interaction)
-                        pressedInteraction.value = null
-                    }
-                }
-            },
-            onTap = { onTapState.value.invoke(it) }
-        )
-    }
-} else this
+                            val interaction = PressInteraction.Press(it)
+                            interactionSource?.emit(interaction)
+                            pressedInteraction.value = interaction
+                        }
+                        val success = tryAwaitRelease()
+                        scope.launch {
+                            pressedInteraction.value?.let { oldValue ->
+                                val interaction =
+                                    if (success) {
+                                        PressInteraction.Release(oldValue)
+                                    } else {
+                                        PressInteraction.Cancel(oldValue)
+                                    }
+                                interactionSource?.emit(interaction)
+                                pressedInteraction.value = null
+                            }
+                        }
+                    },
+                    onTap = { onTapState.value.invoke(it) }
+                )
+            }
+        }
+    else this
diff --git a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/TextFieldScroll.kt b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/TextFieldScroll.kt
index 284e4e6..b4d2ed0 100644
--- a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/TextFieldScroll.kt
+++ b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/TextFieldScroll.kt
@@ -57,47 +57,54 @@
     scrollerPosition: TextFieldScrollerPosition,
     interactionSource: MutableInteractionSource? = null,
     enabled: Boolean = true
-) = composed(
-    inspectorInfo = debugInspectorInfo {
-        name = "textFieldScrollable"
-        properties["scrollerPosition"] = scrollerPosition
-        properties["interactionSource"] = interactionSource
-        properties["enabled"] = enabled
-    }
-) {
-    // do not reverse direction only in case of RTL in horizontal orientation
-    val rtl = LocalLayoutDirection.current == LayoutDirection.Rtl
-    val reverseDirection = scrollerPosition.orientation == Orientation.Vertical || !rtl
-    val scrollableState = rememberScrollableState { delta ->
-        val newOffset = scrollerPosition.offset + delta
-        val consumedDelta = when {
-            newOffset > scrollerPosition.maximum ->
-                scrollerPosition.maximum - scrollerPosition.offset
-            newOffset < 0f -> -scrollerPosition.offset
-            else -> delta
-        }
-        scrollerPosition.offset += consumedDelta
-        consumedDelta
-    }
-    // TODO: b/255557085 remove when / if rememberScrollableState exposes lambda parameters for
-    //  setting these
-    val wrappedScrollableState = remember(scrollableState, scrollerPosition) {
-        object : ScrollableState by scrollableState {
-            override val canScrollForward by derivedStateOf {
-                scrollerPosition.offset < scrollerPosition.maximum
+) =
+    composed(
+        inspectorInfo =
+            debugInspectorInfo {
+                name = "textFieldScrollable"
+                properties["scrollerPosition"] = scrollerPosition
+                properties["interactionSource"] = interactionSource
+                properties["enabled"] = enabled
             }
-            override val canScrollBackward by derivedStateOf { scrollerPosition.offset > 0f }
+    ) {
+        // do not reverse direction only in case of RTL in horizontal orientation
+        val rtl = LocalLayoutDirection.current == LayoutDirection.Rtl
+        val reverseDirection = scrollerPosition.orientation == Orientation.Vertical || !rtl
+        val scrollableState = rememberScrollableState { delta ->
+            val newOffset = scrollerPosition.offset + delta
+            val consumedDelta =
+                when {
+                    newOffset > scrollerPosition.maximum ->
+                        scrollerPosition.maximum - scrollerPosition.offset
+                    newOffset < 0f -> -scrollerPosition.offset
+                    else -> delta
+                }
+            scrollerPosition.offset += consumedDelta
+            consumedDelta
         }
+        // TODO: b/255557085 remove when / if rememberScrollableState exposes lambda parameters for
+        //  setting these
+        val wrappedScrollableState =
+            remember(scrollableState, scrollerPosition) {
+                object : ScrollableState by scrollableState {
+                    override val canScrollForward by derivedStateOf {
+                        scrollerPosition.offset < scrollerPosition.maximum
+                    }
+                    override val canScrollBackward by derivedStateOf {
+                        scrollerPosition.offset > 0f
+                    }
+                }
+            }
+        val scroll =
+            Modifier.scrollable(
+                orientation = scrollerPosition.orientation,
+                reverseDirection = reverseDirection,
+                state = wrappedScrollableState,
+                interactionSource = interactionSource,
+                enabled = enabled && scrollerPosition.maximum != 0f
+            )
+        scroll
     }
-    val scroll = Modifier.scrollable(
-        orientation = scrollerPosition.orientation,
-        reverseDirection = reverseDirection,
-        state = wrappedScrollableState,
-        interactionSource = interactionSource,
-        enabled = enabled && scrollerPosition.maximum != 0f
-    )
-    scroll
-}
 
 // Layout
 internal fun Modifier.textFieldScroll(
@@ -112,22 +119,23 @@
 
     val transformedText = visualTransformation.filterWithValidation(textFieldValue.annotatedString)
 
-    val layout = when (orientation) {
-        Orientation.Vertical ->
-            VerticalScrollLayoutModifier(
-                scrollerPosition,
-                cursorOffset,
-                transformedText,
-                textLayoutResultProvider
-            )
-        Orientation.Horizontal ->
-            HorizontalScrollLayoutModifier(
-                scrollerPosition,
-                cursorOffset,
-                transformedText,
-                textLayoutResultProvider
-            )
-    }
+    val layout =
+        when (orientation) {
+            Orientation.Vertical ->
+                VerticalScrollLayoutModifier(
+                    scrollerPosition,
+                    cursorOffset,
+                    transformedText,
+                    textLayoutResultProvider
+                )
+            Orientation.Horizontal ->
+                HorizontalScrollLayoutModifier(
+                    scrollerPosition,
+                    cursorOffset,
+                    transformedText,
+                    textLayoutResultProvider
+                )
+        }
     return this.clipToBounds().then(layout)
 }
 
@@ -146,13 +154,14 @@
         val height = min(placeable.height, constraints.maxHeight)
 
         return layout(placeable.width, height) {
-            val cursorRect = getCursorRectInScroller(
-                cursorOffset = cursorOffset,
-                transformedText = transformedText,
-                textLayoutResult = textLayoutResultProvider()?.value,
-                rtl = false,
-                textFieldWidth = placeable.width
-            )
+            val cursorRect =
+                getCursorRectInScroller(
+                    cursorOffset = cursorOffset,
+                    transformedText = transformedText,
+                    textLayoutResult = textLayoutResultProvider()?.value,
+                    rtl = false,
+                    textFieldWidth = placeable.width
+                )
 
             scrollerPosition.update(
                 orientation = Orientation.Vertical,
@@ -181,22 +190,24 @@
         // the original constraints so that the children has more information to  determine its
         // size.
         val maxIntrinsicWidth = measurable.maxIntrinsicWidth(constraints.maxHeight)
-        val childConstraints = if (maxIntrinsicWidth < constraints.maxWidth) {
-            constraints
-        } else {
-            constraints.copy(maxWidth = Constraints.Infinity)
-        }
+        val childConstraints =
+            if (maxIntrinsicWidth < constraints.maxWidth) {
+                constraints
+            } else {
+                constraints.copy(maxWidth = Constraints.Infinity)
+            }
         val placeable = measurable.measure(childConstraints)
         val width = min(placeable.width, constraints.maxWidth)
 
         return layout(width, placeable.height) {
-            val cursorRect = getCursorRectInScroller(
-                cursorOffset = cursorOffset,
-                transformedText = transformedText,
-                textLayoutResult = textLayoutResultProvider()?.value,
-                rtl = layoutDirection == LayoutDirection.Rtl,
-                textFieldWidth = placeable.width
-            )
+            val cursorRect =
+                getCursorRectInScroller(
+                    cursorOffset = cursorOffset,
+                    transformedText = transformedText,
+                    textLayoutResult = textLayoutResultProvider()?.value,
+                    rtl = layoutDirection == LayoutDirection.Rtl,
+                    textFieldWidth = placeable.width
+                )
 
             scrollerPosition.update(
                 orientation = Orientation.Horizontal,
@@ -218,22 +229,25 @@
     rtl: Boolean,
     textFieldWidth: Int
 ): Rect {
-    val cursorRect = textLayoutResult?.getCursorRect(
-        transformedText.offsetMapping.originalToTransformed(cursorOffset)
-    ) ?: Rect.Zero
+    val cursorRect =
+        textLayoutResult?.getCursorRect(
+            transformedText.offsetMapping.originalToTransformed(cursorOffset)
+        ) ?: Rect.Zero
     val thickness = DefaultCursorThickness.roundToPx()
 
-    val cursorLeft = if (rtl) {
-        textFieldWidth - cursorRect.left - thickness
-    } else {
-        cursorRect.left
-    }
+    val cursorLeft =
+        if (rtl) {
+            textFieldWidth - cursorRect.left - thickness
+        } else {
+            cursorRect.left
+        }
 
-    val cursorRight = if (rtl) {
-        textFieldWidth - cursorRect.left
-    } else {
-        cursorRect.left + thickness
-    }
+    val cursorRight =
+        if (rtl) {
+            textFieldWidth - cursorRect.left
+        } else {
+            cursorRect.left + thickness
+        }
     return cursorRect.copy(left = cursorLeft, right = cursorRight)
 }
 
@@ -247,15 +261,15 @@
     constructor() : this(Orientation.Vertical)
 
     /**
-     * Left or top offset. Takes values from 0 to [maximum].
-     * Taken with the opposite sign defines the x or y position of the text field in the
-     * horizontal or vertical scroller container correspondingly.
+     * Left or top offset. Takes values from 0 to [maximum]. Taken with the opposite sign defines
+     * the x or y position of the text field in the horizontal or vertical scroller container
+     * correspondingly.
      */
     var offset by mutableFloatStateOf(initial)
 
     /**
-     * Maximum length by which the text field can be scrolled. Defined as a difference in
-     * size between the scroller container and the text field.
+     * Maximum length by which the text field can be scrolled. Defined as a difference in size
+     * between the scroller container and the text field.
      */
     var maximum by mutableFloatStateOf(0f)
         private set
@@ -267,24 +281,19 @@
     private var previousCursorRect: Rect = Rect.Zero
 
     /**
-     * Keeps the previous selection data in TextFieldValue in order to identify what has changed
-     * in the new selection, and decide which selection offset (start, end) to follow.
+     * Keeps the previous selection data in TextFieldValue in order to identify what has changed in
+     * the new selection, and decide which selection offset (start, end) to follow.
      */
     var previousSelection: TextRange = TextRange.Zero
 
     var orientation by mutableStateOf(initialOrientation, structuralEqualityPolicy())
 
-    fun update(
-        orientation: Orientation,
-        cursorRect: Rect,
-        containerSize: Int,
-        textFieldSize: Int
-    ) {
+    fun update(orientation: Orientation, cursorRect: Rect, containerSize: Int, textFieldSize: Int) {
         val difference = (textFieldSize - containerSize).toFloat()
         maximum = difference
 
-        if (cursorRect.left != previousCursorRect.left ||
-            cursorRect.top != previousCursorRect.top
+        if (
+            cursorRect.left != previousCursorRect.left || cursorRect.top != previousCursorRect.top
         ) {
             val vertical = orientation == Orientation.Vertical
             val cursorStart = if (vertical) cursorRect.top else cursorRect.left
@@ -299,50 +308,52 @@
     internal fun coerceOffset(cursorStart: Float, cursorEnd: Float, containerSize: Int) {
         val startVisibleBound = offset
         val endVisibleBound = startVisibleBound + containerSize
-        val offsetDifference = when {
-            // make bottom/end of the cursor visible
-            //
-            // text box
-            // +----------------------+
-            // |                      |
-            // |                      |
-            // |          cursor      |
-            // |             |        |
-            // +-------------|--------+
-            //               |
-            //
-            cursorEnd > endVisibleBound -> cursorEnd - endVisibleBound
+        val offsetDifference =
+            when {
+                // make bottom/end of the cursor visible
+                //
+                // text box
+                // +----------------------+
+                // |                      |
+                // |                      |
+                // |          cursor      |
+                // |             |        |
+                // +-------------|--------+
+                //               |
+                //
+                cursorEnd > endVisibleBound -> cursorEnd - endVisibleBound
 
-            // in rare cases when there's not enough space to fit the whole cursor, prioritise
-            // the bottom/end of the cursor
-            //
-            //             cursor
-            // text box      |
-            // +-------------|--------+
-            // |             |        |
-            // +-------------|--------+
-            //               |
-            //
-            cursorStart < startVisibleBound && cursorEnd - cursorStart > containerSize ->
-                cursorEnd - endVisibleBound
+                // in rare cases when there's not enough space to fit the whole cursor, prioritise
+                // the bottom/end of the cursor
+                //
+                //             cursor
+                // text box      |
+                // +-------------|--------+
+                // |             |        |
+                // +-------------|--------+
+                //               |
+                //
+                cursorStart < startVisibleBound && cursorEnd - cursorStart > containerSize ->
+                    cursorEnd - endVisibleBound
 
-            // make top/start of the cursor visible if there's enough space to fit the whole cursor
-            //
-            //               cursor
-            // text box       |
-            // +--------------|-------+
-            // |              |       |
-            // |                      |
-            // |                      |
-            // |                      |
-            // +----------------------+
-            //
-            cursorStart < startVisibleBound && cursorEnd - cursorStart <= containerSize ->
-                cursorStart - startVisibleBound
+                // make top/start of the cursor visible if there's enough space to fit the whole
+                // cursor
+                //
+                //               cursor
+                // text box       |
+                // +--------------|-------+
+                // |              |       |
+                // |                      |
+                // |                      |
+                // |                      |
+                // +----------------------+
+                //
+                cursorStart < startVisibleBound && cursorEnd - cursorStart <= containerSize ->
+                    cursorStart - startVisibleBound
 
-            // otherwise keep current offset
-            else -> 0f
-        }
+                // otherwise keep current offset
+                else -> 0f
+            }
         offset += offsetDifference
     }
 
@@ -355,16 +366,16 @@
     }
 
     companion object {
-        val Saver = listSaver<TextFieldScrollerPosition, Any>(
-            save = {
-                listOf(it.offset, it.orientation == Orientation.Vertical)
-            },
-            restore = { restored ->
-                TextFieldScrollerPosition(
-                    if (restored[1] as Boolean) Orientation.Vertical else Orientation.Horizontal,
-                    restored[0] as Float
-                )
-            }
-        )
+        val Saver =
+            listSaver<TextFieldScrollerPosition, Any>(
+                save = { listOf(it.offset, it.orientation == Orientation.Vertical) },
+                restore = { restored ->
+                    TextFieldScrollerPosition(
+                        if (restored[1] as Boolean) Orientation.Vertical
+                        else Orientation.Horizontal,
+                        restored[0] as Float
+                    )
+                }
+            )
     }
 }
diff --git a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/TextFieldSize.kt b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/TextFieldSize.kt
index 3168d40..0d8b831 100644
--- a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/TextFieldSize.kt
+++ b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/TextFieldSize.kt
@@ -39,17 +39,16 @@
     val fontFamilyResolver = LocalFontFamilyResolver.current
     val layoutDirection = LocalLayoutDirection.current
 
-    val resolvedStyle = remember(style, layoutDirection) {
-        resolveDefaults(style, layoutDirection)
-    }
-    val typeface by remember(fontFamilyResolver, resolvedStyle) {
-        fontFamilyResolver.resolve(
-            resolvedStyle.fontFamily,
-            resolvedStyle.fontWeight ?: FontWeight.Normal,
-            resolvedStyle.fontStyle ?: FontStyle.Normal,
-            resolvedStyle.fontSynthesis ?: FontSynthesis.All
-        )
-    }
+    val resolvedStyle = remember(style, layoutDirection) { resolveDefaults(style, layoutDirection) }
+    val typeface by
+        remember(fontFamilyResolver, resolvedStyle) {
+            fontFamilyResolver.resolve(
+                resolvedStyle.fontFamily,
+                resolvedStyle.fontWeight ?: FontWeight.Normal,
+                resolvedStyle.fontStyle ?: FontStyle.Normal,
+                resolvedStyle.fontSynthesis ?: FontSynthesis.All
+            )
+        }
 
     val minSizeState = remember {
         TextFieldSize(layoutDirection, density, fontFamilyResolver, style, typeface)
@@ -60,14 +59,13 @@
     Modifier.layout { measurable, constraints ->
         val minSize = minSizeState.minSize
 
-        val childConstraints = constraints.copy(
-            minWidth = minSize.width.coerceIn(constraints.minWidth, constraints.maxWidth),
-            minHeight = minSize.height.coerceIn(constraints.minHeight, constraints.maxHeight)
-        )
+        val childConstraints =
+            constraints.copy(
+                minWidth = minSize.width.coerceIn(constraints.minWidth, constraints.maxWidth),
+                minHeight = minSize.height.coerceIn(constraints.minHeight, constraints.maxHeight)
+            )
         val measured = measurable.measure(childConstraints)
-        layout(measured.width, measured.height) {
-            measured.placeRelative(0, 0)
-        }
+        layout(measured.width, measured.height) { measured.placeRelative(0, 0) }
     }
 }
 
@@ -88,11 +86,12 @@
         resolvedStyle: TextStyle,
         typeface: Any
     ) {
-        if (layoutDirection != this.layoutDirection ||
-            density != this.density ||
-            fontFamilyResolver != this.fontFamilyResolver ||
-            resolvedStyle != this.resolvedStyle ||
-            typeface != this.typeface
+        if (
+            layoutDirection != this.layoutDirection ||
+                density != this.density ||
+                fontFamilyResolver != this.fontFamilyResolver ||
+                resolvedStyle != this.resolvedStyle ||
+                typeface != this.typeface
         ) {
             this.layoutDirection = layoutDirection
             this.density = density
diff --git a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/TextLayoutHelper.kt b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/TextLayoutHelper.kt
index 62593ab..c87425c 100644
--- a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/TextLayoutHelper.kt
+++ b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/TextLayoutHelper.kt
@@ -61,8 +61,8 @@
         // measure or display
         return false
     }
-    if (!(
-        layoutInput.text == text &&
+    if (
+        !(layoutInput.text == text &&
             layoutInput.style.hasSameLayoutAffectingAttributes(style) &&
             layoutInput.placeholders == placeholders &&
             layoutInput.maxLines == maxLines &&
@@ -70,8 +70,7 @@
             layoutInput.overflow == overflow &&
             layoutInput.density == density &&
             layoutInput.layoutDirection == layoutDirection &&
-            layoutInput.fontFamilyResolver == fontFamilyResolver
-        )
+            layoutInput.fontFamilyResolver == fontFamilyResolver)
     ) {
         return false
     }
diff --git a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/TextLayoutResultProxy.kt b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/TextLayoutResultProxy.kt
index 5b3b4b3..fc1b33b 100644
--- a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/TextLayoutResultProxy.kt
+++ b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/TextLayoutResultProxy.kt
@@ -35,20 +35,19 @@
 ) {
     // TextLayoutResult methods
     /**
-     * Translates the position of the touch on the screen to the position in text. Because touch
-     * is relative to the decoration box, we need to translate it to the inner text field's
-     * coordinates first before calculating position of the symbol in text.
+     * Translates the position of the touch on the screen to the position in text. Because touch is
+     * relative to the decoration box, we need to translate it to the inner text field's coordinates
+     * first before calculating position of the symbol in text.
      *
      * @param position original position of the gesture relative to the decoration box
-     * @param coerceInVisibleBounds if true and original [position] is outside visible bounds
-     * of the inner text field, the [position] will be shifted to the closest edge of the inner
-     * text field's visible bounds. This is useful when you have a decoration box
-     * bigger than the inner text field, so when user touches to the decoration box area, the cursor
-     * goes to the beginning or the end of the visible inner text field; otherwise if we put the
-     * cursor under the touch in the invisible part of the inner text field, it would scroll to
-     * make the cursor visible. This behavior is not needed, and therefore
-     * [coerceInVisibleBounds] should be set to false, when the user drags outside visible bounds
-     * to make a selection.
+     * @param coerceInVisibleBounds if true and original [position] is outside visible bounds of the
+     *   inner text field, the [position] will be shifted to the closest edge of the inner text
+     *   field's visible bounds. This is useful when you have a decoration box bigger than the inner
+     *   text field, so when user touches to the decoration box area, the cursor goes to the
+     *   beginning or the end of the visible inner text field; otherwise if we put the cursor under
+     *   the touch in the invisible part of the inner text field, it would scroll to make the cursor
+     *   visible. This behavior is not needed, and therefore [coerceInVisibleBounds] should be set
+     *   to false, when the user drags outside visible bounds to make a selection.
      */
     fun getOffsetForPosition(position: Offset, coerceInVisibleBounds: Boolean = true): Int {
         val coercedPosition =
@@ -66,8 +65,9 @@
     fun getLineEnd(lineIndex: Int, visibleEnd: Boolean = false): Int =
         value.getLineEnd(lineIndex, visibleEnd)
 
-    /** Returns true if the screen coordinates position (x,y) corresponds to a character displayed
-     * in the view. Returns false when the position is in the empty space of left/right of text.
+    /**
+     * Returns true if the screen coordinates position (x,y) corresponds to a character displayed in
+     * the view. Returns false when the position is in the empty space of left/right of text.
      */
     fun isPositionOnText(offset: Offset): Boolean {
         val visibleOffset = offset.coercedInVisibleBoundsOfInputText()
@@ -78,8 +78,8 @@
     }
 
     /**
-     * Translates the given [offset] from decoration box coordinates
-     * to inner text field coordinates.
+     * Translates the given [offset] from decoration box coordinates to inner text field
+     * coordinates.
      */
     internal fun translateDecorationToInnerCoordinates(offset: Offset): Offset {
         val innerCoords = innerTextFieldCoordinates?.takeIf { it.isAttached } ?: return offset
@@ -88,8 +88,8 @@
     }
 
     /**
-     * Translates the given [offset] from inner text field coordinates
-     * to decoration box coordinates.
+     * Translates the given [offset] from inner text field coordinates to decoration box
+     * coordinates.
      */
     internal fun translateInnerToDecorationCoordinates(offset: Offset): Offset {
         val innerCoords = innerTextFieldCoordinates?.takeIf { it.isAttached } ?: return offset
@@ -116,15 +116,17 @@
 }
 
 private fun Offset.coerceIn(rect: Rect): Offset {
-    val xOffset = when {
-        x < rect.left -> rect.left
-        x > rect.right -> rect.right
-        else -> x
-    }
-    val yOffset = when {
-        y < rect.top -> rect.top
-        y > rect.bottom -> rect.bottom
-        else -> y
-    }
+    val xOffset =
+        when {
+            x < rect.left -> rect.left
+            x > rect.right -> rect.right
+            else -> x
+        }
+    val yOffset =
+        when {
+            y < rect.top -> rect.top
+            y > rect.bottom -> rect.bottom
+            else -> y
+        }
     return Offset(xOffset, yOffset)
 }
diff --git a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/TextLinkScope.kt b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/TextLinkScope.kt
index 191e3a3..30e04e0 100644
--- a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/TextLinkScope.kt
+++ b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/TextLinkScope.kt
@@ -66,9 +66,7 @@
 internal class TextLinkScope(internal val initialText: AnnotatedString) {
     var textLayoutResult: TextLayoutResult? by mutableStateOf(null)
 
-    /**
-     * [initialText] with applied links styling to it from [LinkAnnotation.styles]
-     */
+    /** [initialText] with applied links styling to it from [LinkAnnotation.styles] */
     internal var text: AnnotatedString = initialText
 
     // Additional span style annotations applied to the AnnotatedString. These SpanStyles are coming
@@ -85,14 +83,16 @@
      * Causes the modified element to be measured with fixed constraints equal to the bounds of the
      * text range [[start], [end]) and placed over that range of text.
      */
-    private fun Modifier.textRange(start: Int, end: Int): Modifier = this.then(
-        TextRangeLayoutModifier {
-            val layoutResult = textLayoutResult
-                ?: return@TextRangeLayoutModifier layout(0, 0) { IntOffset.Zero }
-            val bounds = layoutResult.getPathForRange(start, end).getBounds().roundToIntRect()
-            layout(bounds.width, bounds.height) { bounds.topLeft }
-        }
-    )
+    private fun Modifier.textRange(start: Int, end: Int): Modifier =
+        this.then(
+            TextRangeLayoutModifier {
+                val layoutResult =
+                    textLayoutResult
+                        ?: return@TextRangeLayoutModifier layout(0, 0) { IntOffset.Zero }
+                val bounds = layoutResult.getPathForRange(start, end).getBounds().roundToIntRect()
+                layout(bounds.width, bounds.height) { bounds.topLeft }
+            }
+        )
 
     private fun shapeForRange(range: LinkRange): Shape? =
         pathForRangeInRangeCoordinates(range)?.let {
@@ -108,7 +108,8 @@
         }
 
     private fun pathForRangeInRangeCoordinates(range: LinkRange): Path? {
-        return if (!shouldMeasureLinks()) null else {
+        return if (!shouldMeasureLinks()) null
+        else {
             textLayoutResult?.let {
                 val path = it.getPathForRange(range.start, range.end)
 
@@ -118,15 +119,17 @@
                 val rangeStartLine = it.getLineForOffset(range.start)
                 val rangeEndLine = it.getLineForOffset(range.end)
 
-                val xOffset = if (rangeStartLine == rangeEndLine) {
-                    // if the link occupies a single line, we take the left most position of the
-                    // link's range
-                    minOf(lastCharBoundingBox.left, firstCharBoundingBox.left)
-                } else {
-                    // if the link occupies more than one line, the left sides of the link node and
-                    // text node match so we don't need to do anything
-                    0f
-                }
+                val xOffset =
+                    if (rangeStartLine == rangeEndLine) {
+                        // if the link occupies a single line, we take the left most position of the
+                        // link's range
+                        minOf(lastCharBoundingBox.left, firstCharBoundingBox.left)
+                    } else {
+                        // if the link occupies more than one line, the left sides of the link node
+                        // and
+                        // text node match so we don't need to do anything
+                        0f
+                    }
 
                 // the top of the top-most (first) character
                 val yOffset = firstCharBoundingBox.top
@@ -139,8 +142,8 @@
 
     /**
      * This composable responsible for creating layout nodes for each link annotation. Since
-     * [TextLinkScope] object created *only* when there are links present in the text, we don't
-     * need to do any additional guarding inside this composable function.
+     * [TextLinkScope] object created *only* when there are links present in the text, we don't need
+     * to do any additional guarding inside this composable function.
      */
     @OptIn(ExperimentalFoundationApi::class)
     @Composable
@@ -181,48 +184,45 @@
                 // we calculate the latest style based on the link state and apply it to the
                 // initialText's style. This allows us to merge the style with the original instead
                 // of fully replacing it
-                val mergedStyle = range.item.styles?.style.mergeOrUse(
-                    if (isFocused) range.item.styles?.focusedStyle else null
-                ).mergeOrUse(
-                    if (isHovered) range.item.styles?.hoveredStyle else null
-                ).mergeOrUse(
-                    if (isPressed) range.item.styles?.pressedStyle else null
-                )
-                mergedStyle?.let {
-                    replaceStyle(it, range.start, range.end)
-                }
+                val mergedStyle =
+                    range.item.styles
+                        ?.style
+                        .mergeOrUse(if (isFocused) range.item.styles?.focusedStyle else null)
+                        .mergeOrUse(if (isHovered) range.item.styles?.hoveredStyle else null)
+                        .mergeOrUse(if (isPressed) range.item.styles?.pressedStyle else null)
+                mergedStyle?.let { replaceStyle(it, range.start, range.end) }
             }
         }
     }
 
     private fun SpanStyle?.mergeOrUse(other: SpanStyle?) = this?.merge(other) ?: other
 
-    private fun handleLink(
-        link: LinkAnnotation,
-        uriHandler: UriHandler
-    ) {
+    private fun handleLink(link: LinkAnnotation, uriHandler: UriHandler) {
         when (link) {
-            is LinkAnnotation.Url -> link.linkInteractionListener?.onClick(link) ?: try {
-                uriHandler.openUri(link.url)
-            } catch (_: IllegalArgumentException) {
-                // we choose to silently fail when the uri can't be opened to avoid crashes
-                // for users. This is the case where developer don't provide the link
-                // handlers themselves and therefore I suspect are less likely to test them
-                // manually.
-            }
+            is LinkAnnotation.Url ->
+                link.linkInteractionListener?.onClick(link)
+                    ?: try {
+                        uriHandler.openUri(link.url)
+                    } catch (_: IllegalArgumentException) {
+                        // we choose to silently fail when the uri can't be opened to avoid crashes
+                        // for users. This is the case where developer don't provide the link
+                        // handlers themselves and therefore I suspect are less likely to test them
+                        // manually.
+                    }
             is LinkAnnotation.Clickable -> link.linkInteractionListener?.onClick(link)
         }
     }
 
     /** Returns [text] with additional styles from [LinkAnnotation] based on link's state */
     internal fun applyAnnotators(): AnnotatedString {
-        val styledText = if (annotators.isEmpty()) text else buildAnnotatedString {
-            append(initialText)
-            val scope = TextAnnotatorScope(this)
-            annotators.fastForEach {
-                it.invoke(scope)
-            }
-        }
+        val styledText =
+            if (annotators.isEmpty()) text
+            else
+                buildAnnotatedString {
+                    append(initialText)
+                    val scope = TextAnnotatorScope(this)
+                    annotators.fastForEach { it.invoke(scope) }
+                }
         text = styledText
         return styledText
     }
@@ -232,25 +232,18 @@
     private fun StyleAnnotation(vararg keys: Any?, block: TextAnnotatorScope.() -> Unit) {
         DisposableEffect(block, *keys) {
             annotators += block
-            onDispose {
-                annotators -= block
-            }
+            onDispose { annotators -= block }
         }
     }
 }
 
-/**
- * Interface holding the width, height and positioning logic.
- */
-internal class TextRangeLayoutMeasureResult internal constructor(
-    val width: Int,
-    val height: Int,
-    val place: () -> IntOffset
-)
+/** Interface holding the width, height and positioning logic. */
+internal class TextRangeLayoutMeasureResult
+internal constructor(val width: Int, val height: Int, val place: () -> IntOffset)
 
 /**
- * The receiver scope of a text range layout's measure lambda. The return value of the
- * measure lambda is [TextRangeLayoutMeasureResult], which should be returned by [layout]
+ * The receiver scope of a text range layout's measure lambda. The return value of the measure
+ * lambda is [TextRangeLayoutMeasureResult], which should be returned by [layout]
  */
 internal class TextRangeLayoutMeasureScope {
     fun layout(width: Int, height: Int, place: () -> IntOffset): TextRangeLayoutMeasureResult =
@@ -267,9 +260,7 @@
     override fun Density.modifyParentData(parentData: Any?) = this@TextRangeLayoutModifier
 }
 
-/**
- * Provides methods to add styles to text inside a [TextLinkScope.StyleAnnotation] function.
- */
+/** Provides methods to add styles to text inside a [TextLinkScope.StyleAnnotation] function. */
 private class TextAnnotatorScope(private val builder: AnnotatedString.Builder) {
     fun replaceStyle(style: SpanStyle, start: Int, end: Int) {
         builder.addStyle(style, start, end)
diff --git a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/UndoManager.kt b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/UndoManager.kt
index 1c0e014..feebfc9 100644
--- a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/UndoManager.kt
+++ b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/UndoManager.kt
@@ -24,8 +24,8 @@
 
 /**
  * It keeps last snapshots of [TextFieldValue]. The total number of kept snapshots is limited but
- * total number of characters in them and should not be more than [maxStoredCharacters]
- * We add a new [TextFieldValue] to the chain in one of three conditions:
+ * total number of characters in them and should not be more than [maxStoredCharacters] We add a new
+ * [TextFieldValue] to the chain in one of three conditions:
  * 1. Keyboard command was executed (something was pasted, word was deleted etc.)
  * 2. Before undo
  * 3. If the last "snapshot" is older than [SNAPSHOTS_INTERVAL_MILLIS]
@@ -34,13 +34,8 @@
  * but selection is changed we are not adding a new entry to the chain but update the selection for
  * the last one.
  */
-internal class UndoManager(
-    val maxStoredCharacters: Int = 100_000
-) {
-    private class Entry(
-        var next: Entry? = null,
-        var value: TextFieldValue
-    )
+internal class UndoManager(val maxStoredCharacters: Int = 100_000) {
+    private class Entry(var next: Entry? = null, var value: TextFieldValue)
 
     private var undoStack: Entry? = null
     private var redoStack: Entry? = null
@@ -49,9 +44,9 @@
     private var forceNextSnapshot = false
 
     /**
-     * It gives an undo manager a chance to save a snapshot if needed because either it's time
-     * for periodic snapshotting or snapshot was previously forced via [forceNextSnapshot]. It
-     * can be called during every TextField recomposition.
+     * It gives an undo manager a chance to save a snapshot if needed because either it's time for
+     * periodic snapshotting or snapshot was previously forced via [forceNextSnapshot]. It can be
+     * called during every TextField recomposition.
      */
     fun snapshotIfNeeded(value: TextFieldValue, now: Long = timeNowMillis()) {
         if (forceNextSnapshot || now > (lastSnapshot ?: 0) + SNAPSHOTS_INTERVAL_MILLIS) {
@@ -60,16 +55,12 @@
         }
     }
 
-    /**
-     * It forces making a snapshot during the next [snapshotIfNeeded] call
-     */
+    /** It forces making a snapshot during the next [snapshotIfNeeded] call */
     fun forceNextSnapshot() {
         forceNextSnapshot = true
     }
 
-    /**
-     * Unconditionally makes a new snapshot (if a value differs from the last one)
-     */
+    /** Unconditionally makes a new snapshot (if a value differs from the last one) */
     fun makeSnapshot(value: TextFieldValue) {
         forceNextSnapshot = false
         if (value == undoStack?.value) {
@@ -80,10 +71,7 @@
             undoStack?.value = value
             return
         }
-        undoStack = Entry(
-            value = value,
-            next = undoStack
-        )
+        undoStack = Entry(value = value, next = undoStack)
         redoStack = null
         storedCharacters += value.text.length
 
@@ -106,10 +94,7 @@
             undoEntry.next?.let { nextEntry ->
                 undoStack = nextEntry
                 storedCharacters -= undoEntry.value.text.length
-                redoStack = Entry(
-                    value = undoEntry.value,
-                    next = redoStack
-                )
+                redoStack = Entry(value = undoEntry.value, next = redoStack)
                 nextEntry.value
             }
         }
@@ -118,10 +103,7 @@
     fun redo(): TextFieldValue? {
         return redoStack?.let { redoEntry ->
             redoStack = redoEntry.next
-            undoStack = Entry(
-                value = redoEntry.value,
-                next = undoStack
-            )
+            undoStack = Entry(value = redoEntry.value, next = undoStack)
             storedCharacters += redoEntry.value.text.length
             redoEntry.value
         }
diff --git a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/ValidatingOffsetMapping.kt b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/ValidatingOffsetMapping.kt
index bac40cc..39de64f 100644
--- a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/ValidatingOffsetMapping.kt
+++ b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/ValidatingOffsetMapping.kt
@@ -23,11 +23,12 @@
 import kotlin.math.min
 import org.jetbrains.annotations.VisibleForTesting
 
-internal val ValidatingEmptyOffsetMappingIdentity: OffsetMapping = ValidatingOffsetMapping(
-    delegate = OffsetMapping.Identity,
-    originalLength = 0,
-    transformedLength = 0
-)
+internal val ValidatingEmptyOffsetMappingIdentity: OffsetMapping =
+    ValidatingOffsetMapping(
+        delegate = OffsetMapping.Identity,
+        originalLength = 0,
+        transformedLength = 0
+    )
 
 internal fun VisualTransformation.filterWithValidation(text: AnnotatedString): TransformedText {
     val delegate = filter(text)
@@ -49,7 +50,6 @@
 
 /**
  * Assuming TransformedText is a pure mapping this will validate:
- *
  * 1. The first limit characters map to a valid transformed offset
  * 2. The first limit characters of transformed map to valid original offsets
  * 3. The last position for both transformed and original (catching off by 1)
diff --git a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/handwriting/StylusHandwriting.kt b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/handwriting/StylusHandwriting.kt
index 4909b8f..ec3ac9b 100644
--- a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/handwriting/StylusHandwriting.kt
+++ b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/handwriting/StylusHandwriting.kt
@@ -42,29 +42,30 @@
 import androidx.compose.ui.util.fastFirstOrNull
 
 /**
- * A modifier that detects stylus movements and calls the [onHandwritingSlopExceeded] when
- * it detects that stylus movement has exceeds the handwriting slop.
- * If [onHandwritingSlopExceeded] returns true, it will consume the events and consider
- * that the handwriting has successfully started. Otherwise, it'll stop monitoring the current
- * gesture.
+ * A modifier that detects stylus movements and calls the [onHandwritingSlopExceeded] when it
+ * detects that stylus movement has exceeds the handwriting slop. If [onHandwritingSlopExceeded]
+ * returns true, it will consume the events and consider that the handwriting has successfully
+ * started. Otherwise, it'll stop monitoring the current gesture.
+ *
  * @param enabled whether this modifier is enabled, it's used for the case where the editor is
- * readOnly or disabled.
+ *   readOnly or disabled.
  * @param onHandwritingSlopExceeded the callback that's invoked when it detects stylus handwriting.
- * The return value determines whether the handwriting is triggered or not. When it's true, this
- * modifier will consume the pointer events.
+ *   The return value determines whether the handwriting is triggered or not. When it's true, this
+ *   modifier will consume the pointer events.
  */
 internal fun Modifier.stylusHandwriting(
     enabled: Boolean,
     onHandwritingSlopExceeded: () -> Boolean
-): Modifier = if (enabled && isStylusHandwritingSupported) {
-    this.then(StylusHandwritingElementWithNegativePadding(onHandwritingSlopExceeded))
-        .padding(
-            horizontal = HandwritingBoundsHorizontalOffset,
-            vertical = HandwritingBoundsVerticalOffset
-        )
-} else {
-    this
-}
+): Modifier =
+    if (enabled && isStylusHandwritingSupported) {
+        this.then(StylusHandwritingElementWithNegativePadding(onHandwritingSlopExceeded))
+            .padding(
+                horizontal = HandwritingBoundsHorizontalOffset,
+                vertical = HandwritingBoundsVerticalOffset
+            )
+    } else {
+        this
+    }
 
 private data class StylusHandwritingElementWithNegativePadding(
     val onHandwritingSlopExceeded: () -> Boolean
@@ -84,31 +85,24 @@
 }
 
 /**
- * A stylus handwriting node with negative padding. This node should be  used in pair with a padding
+ * A stylus handwriting node with negative padding. This node should be used in pair with a padding
  * modifier. Together, they expands the touch bounds of the editor while keep its visual bounds the
- * same.
- * Note: this node is a temporary solution, ideally we don't need it.
+ * same. Note: this node is a temporary solution, ideally we don't need it.
  */
-internal class StylusHandwritingNodeWithNegativePadding(
-    onHandwritingSlopExceeded: () -> Boolean
-) : StylusHandwritingNode(onHandwritingSlopExceeded), LayoutModifierNode {
+internal class StylusHandwritingNodeWithNegativePadding(onHandwritingSlopExceeded: () -> Boolean) :
+    StylusHandwritingNode(onHandwritingSlopExceeded), LayoutModifierNode {
     override fun MeasureScope.measure(
         measurable: Measurable,
         constraints: Constraints
     ): MeasureResult {
         val paddingVerticalPx = HandwritingBoundsVerticalOffset.roundToPx()
         val paddingHorizontalPx = HandwritingBoundsHorizontalOffset.roundToPx()
-        val newConstraint = constraints.offset(
-            2 * paddingHorizontalPx,
-            2 * paddingVerticalPx
-        )
+        val newConstraint = constraints.offset(2 * paddingHorizontalPx, 2 * paddingVerticalPx)
         val placeable = measurable.measure(newConstraint)
 
         val height = placeable.height - paddingVerticalPx * 2
         val width = placeable.width - paddingHorizontalPx * 2
-        return layout(width, height) {
-            placeable.place(-paddingHorizontalPx, -paddingVerticalPx)
-        }
+        return layout(width, height) { placeable.place(-paddingHorizontalPx, -paddingVerticalPx) }
     }
 
     override fun sharePointerInputWithSiblings(): Boolean {
@@ -118,9 +112,8 @@
     }
 }
 
-internal open class StylusHandwritingNode(
-    var onHandwritingSlopExceeded: () -> Boolean
-) : DelegatingNode(), PointerInputModifierNode, FocusEventModifierNode {
+internal open class StylusHandwritingNode(var onHandwritingSlopExceeded: () -> Boolean) :
+    DelegatingNode(), PointerInputModifierNode, FocusEventModifierNode {
 
     private var focused = false
 
@@ -128,69 +121,78 @@
         focused = focusState.isFocused
     }
 
-    private val suspendingPointerInputModifierNode = delegate(SuspendingPointerInputModifierNode {
-        awaitEachGesture {
-            val firstDown =
-                awaitFirstDown(requireUnconsumed = true, pass = PointerEventPass.Initial)
+    private val suspendingPointerInputModifierNode =
+        delegate(
+            SuspendingPointerInputModifierNode {
+                awaitEachGesture {
+                    val firstDown =
+                        awaitFirstDown(requireUnconsumed = true, pass = PointerEventPass.Initial)
 
-            val isStylus =
-                firstDown.type == PointerType.Stylus || firstDown.type == PointerType.Eraser
-            if (!isStylus) {
-                return@awaitEachGesture
-            }
+                    val isStylus =
+                        firstDown.type == PointerType.Stylus || firstDown.type == PointerType.Eraser
+                    if (!isStylus) {
+                        return@awaitEachGesture
+                    }
 
-            val isInBounds = firstDown.position.x >= 0 && firstDown.position.x < size.width &&
-                firstDown.position.y >= 0 && firstDown.position.y < size.height
+                    val isInBounds =
+                        firstDown.position.x >= 0 &&
+                            firstDown.position.x < size.width &&
+                            firstDown.position.y >= 0 &&
+                            firstDown.position.y < size.height
 
-            // If the editor is focused or the first down is within the editor's bounds, we
-            // await the initial pass. This prioritize the focused editor over unfocused
-            // editor.
-            val pass = if (focused || isInBounds) {
-                PointerEventPass.Initial
-            } else {
-                PointerEventPass.Main
-            }
+                    // If the editor is focused or the first down is within the editor's bounds, we
+                    // await the initial pass. This prioritize the focused editor over unfocused
+                    // editor.
+                    val pass =
+                        if (focused || isInBounds) {
+                            PointerEventPass.Initial
+                        } else {
+                            PointerEventPass.Main
+                        }
 
-            // Await the touch slop before long press timeout.
-            var exceedsTouchSlop: PointerInputChange? = null
-            // The stylus move must exceeds touch slop before long press timeout.
-            while (true) {
-                val pointerEvent = awaitPointerEvent(pass)
-                // The tracked pointer is consumed or lifted, stop tracking.
-                val change = pointerEvent.changes.fastFirstOrNull {
-                    !it.isConsumed && it.id == firstDown.id && it.pressed
-                }
-                if (change == null) {
-                    break
-                }
+                    // Await the touch slop before long press timeout.
+                    var exceedsTouchSlop: PointerInputChange? = null
+                    // The stylus move must exceeds touch slop before long press timeout.
+                    while (true) {
+                        val pointerEvent = awaitPointerEvent(pass)
+                        // The tracked pointer is consumed or lifted, stop tracking.
+                        val change =
+                            pointerEvent.changes.fastFirstOrNull {
+                                !it.isConsumed && it.id == firstDown.id && it.pressed
+                            }
+                        if (change == null) {
+                            break
+                        }
 
-                val time = change.uptimeMillis - firstDown.uptimeMillis
-                if (time >= viewConfiguration.longPressTimeoutMillis) {
-                    break
-                }
+                        val time = change.uptimeMillis - firstDown.uptimeMillis
+                        if (time >= viewConfiguration.longPressTimeoutMillis) {
+                            break
+                        }
 
-                val offset = change.position - firstDown.position
-                if (offset.getDistance() > viewConfiguration.handwritingSlop) {
-                    exceedsTouchSlop = change
-                    break
+                        val offset = change.position - firstDown.position
+                        if (offset.getDistance() > viewConfiguration.handwritingSlop) {
+                            exceedsTouchSlop = change
+                            break
+                        }
+                    }
+
+                    if (exceedsTouchSlop == null || !onHandwritingSlopExceeded.invoke()) {
+                        return@awaitEachGesture
+                    }
+                    exceedsTouchSlop.consume()
+
+                    // Consume the remaining changes of this pointer.
+                    while (true) {
+                        val pointerEvent = awaitPointerEvent(pass = PointerEventPass.Initial)
+                        val pointerChange =
+                            pointerEvent.changes.fastFirstOrNull {
+                                !it.isConsumed && it.id == firstDown.id && it.pressed
+                            } ?: return@awaitEachGesture
+                        pointerChange.consume()
+                    }
                 }
             }
-
-            if (exceedsTouchSlop == null || !onHandwritingSlopExceeded.invoke()) {
-                return@awaitEachGesture
-            }
-            exceedsTouchSlop.consume()
-
-            // Consume the remaining changes of this pointer.
-            while (true) {
-                val pointerEvent = awaitPointerEvent(pass = PointerEventPass.Initial)
-                val pointerChange = pointerEvent.changes.fastFirstOrNull {
-                    !it.isConsumed && it.id == firstDown.id && it.pressed
-                } ?: return@awaitEachGesture
-                pointerChange.consume()
-            }
-        }
-    })
+        )
 
     override fun onPointerEvent(
         pointerEvent: PointerEvent,
@@ -210,13 +212,11 @@
 }
 
 /**
- *  Whether the platform supports the stylus handwriting or not. This is for platform level support
- *  and NOT for checking whether the IME supports handwriting.
+ * Whether the platform supports the stylus handwriting or not. This is for platform level support
+ * and NOT for checking whether the IME supports handwriting.
  */
 internal expect val isStylusHandwritingSupported: Boolean
 
-/**
- * The amount of the padding added to the handwriting bounds of an editor.
- */
+/** The amount of the padding added to the handwriting bounds of an editor. */
 internal val HandwritingBoundsVerticalOffset = 40.dp
 internal val HandwritingBoundsHorizontalOffset = 10.dp
diff --git a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/input/InputTransformation.kt b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/input/InputTransformation.kt
index bde0251..19e893a 100644
--- a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/input/InputTransformation.kt
+++ b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/input/InputTransformation.kt
@@ -36,8 +36,8 @@
  * To chain filters together, call [then].
  *
  * Prebuilt filters are provided for common filter operations. See:
- *  - [InputTransformation].[maxLength]`()`
- *  - [InputTransformation].[allCaps]`()`
+ * - [InputTransformation].[maxLength]`()`
+ * - [InputTransformation].[allCaps]`()`
  *
  * @sample androidx.compose.foundation.samples.BasicTextFieldCustomInputTransformationSample
  */
@@ -48,7 +48,8 @@
      * Optional [KeyboardOptions] that will be used as the default keyboard options for configuring
      * the IME. The options passed directly to the text field composable will always override this.
      */
-    val keyboardOptions: KeyboardOptions? get() = null
+    val keyboardOptions: KeyboardOptions?
+        get() = null
 
     /**
      * Optional semantics configuration that can update certain characteristics of the applied
@@ -87,8 +88,8 @@
  * Creates a filter chain that will run [next] after this. Filters are applied sequentially, so any
  * changes made by this filter will be visible to [next].
  *
- * The returned filter will use the [KeyboardOptions] from [next] if non-null, otherwise it will
- * use the options from this transformation.
+ * The returned filter will use the [KeyboardOptions] from [next] if non-null, otherwise it will use
+ * the options from this transformation.
  *
  * @sample androidx.compose.foundation.samples.BasicTextFieldInputTransformationChainingSample
  *
@@ -104,18 +105,16 @@
  *
  * [transformation] can return either `current`, `proposed`, or a completely different value.
  *
- * The selection or cursor will be updated automatically. For more control of selection
- * implement [InputTransformation] directly.
+ * The selection or cursor will be updated automatically. For more control of selection implement
+ * [InputTransformation] directly.
  *
  * @sample androidx.compose.foundation.samples.BasicTextFieldInputTransformationByValueChooseSample
+ *
  * @sample androidx.compose.foundation.samples.BasicTextFieldInputTransformationByValueReplaceSample
  */
 @Stable
 fun InputTransformation.byValue(
-    transformation: (
-        current: CharSequence,
-        proposed: CharSequence
-    ) -> CharSequence
+    transformation: (current: CharSequence, proposed: CharSequence) -> CharSequence
 ): InputTransformation = this.then(InputTransformationByValue(transformation))
 
 /**
@@ -146,8 +145,9 @@
 ) : InputTransformation {
 
     override val keyboardOptions: KeyboardOptions?
-        get() = second.keyboardOptions?.fillUnspecifiedValuesWith(first.keyboardOptions)
-            ?: first.keyboardOptions
+        get() =
+            second.keyboardOptions?.fillUnspecifiedValuesWith(first.keyboardOptions)
+                ?: first.keyboardOptions
 
     override fun SemanticsPropertyReceiver.applySemantics() {
         with(first) { applySemantics() }
@@ -184,10 +184,7 @@
 }
 
 private data class InputTransformationByValue(
-    val transformation: (
-        current: CharSequence,
-        proposed: CharSequence
-    ) -> CharSequence
+    val transformation: (current: CharSequence, proposed: CharSequence) -> CharSequence
 ) : InputTransformation {
     override fun TextFieldBuffer.transformInput() {
         val proposed = toTextFieldCharSequence()
@@ -208,19 +205,14 @@
 // This is a very naive implementation for now, not intended to be production-ready.
 @OptIn(ExperimentalFoundationApi::class)
 private data class AllCapsTransformation(private val locale: Locale) : InputTransformation {
-    override val keyboardOptions = KeyboardOptions(
-        capitalization = KeyboardCapitalization.Characters
-    )
+    override val keyboardOptions =
+        KeyboardOptions(capitalization = KeyboardCapitalization.Characters)
 
     override fun TextFieldBuffer.transformInput() {
         // only update inserted content
         changes.forEachChange { range, _ ->
             if (!range.collapsed) {
-                replace(
-                    range.min,
-                    range.max,
-                    asCharSequence().substring(range).toUpperCase(locale)
-                )
+                replace(range.min, range.max, asCharSequence().substring(range).toUpperCase(locale))
             }
         }
     }
@@ -229,9 +221,7 @@
 }
 
 // This is a very naive implementation for now, not intended to be production-ready.
-private data class MaxLengthFilter(
-    private val maxLength: Int
-) : InputTransformation {
+private data class MaxLengthFilter(private val maxLength: Int) : InputTransformation {
 
     init {
         require(maxLength >= 0) { "maxLength must be at least zero, was $maxLength" }
diff --git a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/input/KeyboardActionHandler.kt b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/input/KeyboardActionHandler.kt
index 81726d9..dfbeb4c 100644
--- a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/input/KeyboardActionHandler.kt
+++ b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/input/KeyboardActionHandler.kt
@@ -18,17 +18,16 @@
 
 import androidx.compose.runtime.Stable
 import androidx.compose.ui.Modifier
-import androidx.compose.ui.input.key.onPreviewKeyEvent
 
 @Stable
 fun interface KeyboardActionHandler {
 
     /**
      * This is run when an IME action is performed by the software keyboard, or enter key is pressed
-     * on a hardware keyboard when the associated TextField is configured as single line.
-     * This callback replaces the default behavior for certain actions such as closing the keyboard
-     * or moving the focus to next field. If you also want to execute the default behavior,
-     * invoke [performDefaultAction].
+     * on a hardware keyboard when the associated TextField is configured as single line. This
+     * callback replaces the default behavior for certain actions such as closing the keyboard or
+     * moving the focus to next field. If you also want to execute the default behavior, invoke
+     * [performDefaultAction].
      *
      * If you do not this callback to trigger when enter key is pressed on a single line TextField,
      * refer to [Modifier.onPreviewKeyEvent] on how to intercept key events.
diff --git a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/input/TextFieldBuffer.kt b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/input/TextFieldBuffer.kt
index 37f8628..6c947fe 100644
--- a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/input/TextFieldBuffer.kt
+++ b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/input/TextFieldBuffer.kt
@@ -17,7 +17,6 @@
 package androidx.compose.foundation.text.input
 
 import androidx.compose.foundation.ExperimentalFoundationApi
-import androidx.compose.foundation.text.input.InputTransformation.Companion.transformInput
 import androidx.compose.foundation.text.input.TextFieldBuffer.ChangeList
 import androidx.compose.foundation.text.input.internal.ChangeTracker
 import androidx.compose.foundation.text.input.internal.OffsetMappingCalculator
@@ -28,24 +27,25 @@
  * A text buffer that can be edited, similar to [StringBuilder].
  *
  * This class provides methods for changing the text, such as:
- *  - [replace]
- *  - [append]
- *  - [insert]
- *  - [delete]
+ * - [replace]
+ * - [append]
+ * - [insert]
+ * - [delete]
  *
  * This class also stores and tracks the cursor position or selection range. The cursor position is
  * just a selection range with zero length. The cursor and selection can be changed using methods
  * such as:
- *  - [placeCursorAfterCharAt]
- *  - [placeCursorBeforeCharAt]
- *  - [placeCursorAtEnd]
- *  - [selectAll]
+ * - [placeCursorAfterCharAt]
+ * - [placeCursorBeforeCharAt]
+ * - [placeCursorAtEnd]
+ * - [selectAll]
  *
  * To get one of these, and for usage samples, see [TextFieldState.edit]. Every change to the buffer
  * is tracked in a [ChangeList] which you can access via the [changes] property.
  */
 @OptIn(ExperimentalFoundationApi::class)
-class TextFieldBuffer internal constructor(
+class TextFieldBuffer
+internal constructor(
     initialValue: TextFieldCharSequence,
     initialChanges: ChangeTracker? = null,
     internal val originalValue: TextFieldCharSequence = initialValue,
@@ -54,20 +54,16 @@
 
     private val buffer = PartialGapBuffer(initialValue)
 
-    private var backingChangeTracker: ChangeTracker? = initialChanges?.let {
-        ChangeTracker(initialChanges)
-    }
+    private var backingChangeTracker: ChangeTracker? =
+        initialChanges?.let { ChangeTracker(initialChanges) }
 
-    /**
-     * Lazily-allocated [ChangeTracker], initialized on the first access.
-     */
+    /** Lazily-allocated [ChangeTracker], initialized on the first access. */
     private val changeTracker: ChangeTracker
         get() = backingChangeTracker ?: ChangeTracker().also { backingChangeTracker = it }
 
-    /**
-     * The number of characters in the text field.
-     */
-    val length: Int get() = buffer.length
+    /** The number of characters in the text field. */
+    val length: Int
+        get() = buffer.length
 
     /**
      * Original text content of the buffer before any changes were applied. Calling
@@ -77,8 +73,8 @@
         get() = originalValue.text
 
     /**
-     * Original selection before the changes. Calling [revertAllChanges] will set the selection
-     * to this value.
+     * Original selection before the changes. Calling [revertAllChanges] will set the selection to
+     * this value.
      */
     val originalSelection: TextRange
         get() = originalValue.selection
@@ -89,10 +85,12 @@
      * this value at any given time, even those made after reading this property.
      *
      * @sample androidx.compose.foundation.samples.BasicTextFieldChangeIterationSample
+     *
      * @sample androidx.compose.foundation.samples.BasicTextFieldChangeReverseIterationSample
      */
     @ExperimentalFoundationApi
-    val changes: ChangeList get() = changeTracker
+    val changes: ChangeList
+        get() = changeTracker
 
     /**
      * True if the selection range has non-zero length. If this is false, then the selection
@@ -137,7 +135,6 @@
      * @param start The character offset of the first character to replace.
      * @param end The character offset of the first character after the text to replace.
      * @param text The text to replace the range `[start, end)` with.
-     *
      * @see append
      * @see insert
      * @see delete
@@ -155,7 +152,6 @@
      * @param text The text to replace the range `[start, end)` with.
      * @param textStart The character offset of the first character in [text] to copy.
      * @param textEnd The character offset after the last character in [text] to copy.
-     *
      * @see append
      * @see insert
      * @see delete
@@ -258,16 +254,14 @@
         selectionInChars = TextRange(selStart, selEnd)
     }
 
-    /**
-     * Returns the [Char] at [index] in this buffer.
-     */
+    /** Returns the [Char] at [index] in this buffer. */
     fun charAt(index: Int): Char = buffer[index]
 
     override fun toString(): String = buffer.toString()
 
     /**
-     * Returns a [CharSequence] backed by this buffer. Any subsequent changes to this buffer will
-     * be visible in the returned sequence as well.
+     * Returns a [CharSequence] backed by this buffer. Any subsequent changes to this buffer will be
+     * visible in the returned sequence as well.
      */
     fun asCharSequence(): CharSequence = buffer
 
@@ -298,8 +292,7 @@
      * [placeCursorAtEnd].
      *
      * @param index Character index to place cursor before, should be in range 0 to
-     * [TextFieldBuffer.length], inclusive.
-     *
+     *   [TextFieldBuffer.length], inclusive.
      * @see placeCursorAfterCharAt
      */
     fun placeCursorBeforeCharAt(index: Int) {
@@ -318,8 +311,7 @@
      * [TextFieldBuffer.length] or call [placeCursorAtEnd].
      *
      * @param index Character index to place cursor after, should be in range 0 (inclusive) to
-     * [TextFieldBuffer.length] (exclusive).
-     *
+     *   [TextFieldBuffer.length] (exclusive).
      * @see placeCursorBeforeCharAt
      */
     fun placeCursorAfterCharAt(index: Int) {
@@ -332,52 +324,39 @@
      * Returns an immutable [TextFieldCharSequence] that has the same contents of this buffer.
      *
      * @param selection The selection for the returned [TextFieldCharSequence]. Default value is
-     * this buffer's selection. Passing a different value in here _only_ affects the return value,
-     * it does not change the current selection in the buffer.
+     *   this buffer's selection. Passing a different value in here _only_ affects the return value,
+     *   it does not change the current selection in the buffer.
      * @param composition The composition range for the returned [TextFieldCharSequence]. Default
-     * value is no composition (null).
+     *   value is no composition (null).
      */
     internal fun toTextFieldCharSequence(
         selection: TextRange = this.selection,
         composition: TextRange? = null
-    ): TextFieldCharSequence = TextFieldCharSequence(
-        buffer.toString(),
-        selection = selection,
-        composition = composition
-    )
+    ): TextFieldCharSequence =
+        TextFieldCharSequence(buffer.toString(), selection = selection, composition = composition)
 
-    private fun requireValidIndex(
-        index: Int,
-        startExclusive: Boolean,
-        endExclusive: Boolean
-    ) {
+    private fun requireValidIndex(index: Int, startExclusive: Boolean, endExclusive: Boolean) {
         val start = if (startExclusive) 0 else -1
         val end = if (endExclusive) length else length + 1
 
-        require(index in start until end) {
-            "Expected $index to be in [$start, $end)"
-        }
+        require(index in start until end) { "Expected $index to be in [$start, $end)" }
     }
 
     private fun requireValidRange(range: TextRange) {
         val validRange = TextRange(0, length)
-        require(range in validRange) {
-            "Expected $range to be in $validRange"
-        }
+        require(range in validRange) { "Expected $range to be in $validRange" }
     }
 
     /**
      * The ordered list of non-overlapping and discontinuous changes performed on a
      * [TextFieldBuffer] during the current [edit][TextFieldState.edit] or
-     * [filter][InputTransformation.transformInput] operation. Changes are listed in the order they appear in the
-     * text, not the order in which they were made. Overlapping changes are represented as a single
-     * change.
+     * [filter][InputTransformation.transformInput] operation. Changes are listed in the order they
+     * appear in the text, not the order in which they were made. Overlapping changes are
+     * represented as a single change.
      */
     @ExperimentalFoundationApi
     interface ChangeList {
-        /**
-         * The number of changes that have been performed.
-         */
+        /** The number of changes that have been performed. */
         val changeCount: Int
 
         /**
@@ -404,7 +383,6 @@
  *
  * @param index The character offset at which to insert [text].
  * @param text The text to insert.
- *
  * @see TextFieldBuffer.replace
  * @see TextFieldBuffer.append
  * @see TextFieldBuffer.delete
@@ -419,7 +397,6 @@
  *
  * @param start The character offset of the first character to delete.
  * @param end The character offset of the first character after the deleted range.
- *
  * @see TextFieldBuffer.replace
  * @see TextFieldBuffer.append
  * @see TextFieldBuffer.insert
@@ -428,16 +405,12 @@
     replace(start, end, "")
 }
 
-/**
- * Places the cursor at the end of the text.
- */
+/** Places the cursor at the end of the text. */
 fun TextFieldBuffer.placeCursorAtEnd() {
     placeCursorBeforeCharAt(length)
 }
 
-/**
- * Places the selection around all the text.
- */
+/** Places the selection around all the text. */
 fun TextFieldBuffer.selectAll() {
     selection = TextRange(0, length)
 }
@@ -455,9 +428,7 @@
  * @see forEachChangeReversed
  */
 @ExperimentalFoundationApi
-inline fun ChangeList.forEachChange(
-    block: (range: TextRange, originalRange: TextRange) -> Unit
-) {
+inline fun ChangeList.forEachChange(block: (range: TextRange, originalRange: TextRange) -> Unit) {
     var i = 0
     // Check the size every iteration in case more changes were performed.
     while (i < changeCount) {
@@ -530,12 +501,14 @@
                 }
             }
         } while (
-        // As soon as we've completely traversed one of the strings, if the other hasn't also
-        // finished being traversed then we've found the diff region.
-            aStart < aEnd && bStart < bEnd &&
-            // If we've found the end of the common prefix and the start of the common suffix we're
-            // done.
-            !(prefixFound && suffixFound)
+            // As soon as we've completely traversed one of the strings, if the other hasn't also
+            // finished being traversed then we've found the diff region.
+            aStart < aEnd &&
+                bStart < bEnd &&
+                // If we've found the end of the common prefix and the start of the common suffix
+                // we're
+                // done.
+                !(prefixFound && suffixFound)
         )
     }
 
diff --git a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/input/TextFieldCharSequence.kt b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/input/TextFieldCharSequence.kt
index 7527188..350b5eca 100644
--- a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/input/TextFieldCharSequence.kt
+++ b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/input/TextFieldCharSequence.kt
@@ -23,17 +23,16 @@
 /**
  * An immutable snapshot of the contents of a [TextFieldState].
  *
- * This class is a [CharSequence] and directly represents the text being edited. It also stores
- * the current [selection] of the field, which may either represent the cursor (if the
- * selection is [collapsed][TextRange.collapsed]) or the selection range.
+ * This class is a [CharSequence] and directly represents the text being edited. It also stores the
+ * current [selection] of the field, which may either represent the cursor (if the selection is
+ * [collapsed][TextRange.collapsed]) or the selection range.
  *
  * This class also may contain the range being composed by the IME, if any, although this is not
  * exposed.
  *
  * @param text If this TextFieldCharSequence is actually a copy of another, make sure to use the
- * backing CharSequence object to stop unnecessary nesting and logic that depends on exact equality
- * of CharSequence comparison that's using [CharSequence.equals].
- *
+ *   backing CharSequence object to stop unnecessary nesting and logic that depends on exact
+ *   equality of CharSequence comparison that's using [CharSequence.equals].
  * @see TextFieldBuffer
  */
 internal class TextFieldCharSequence(
@@ -49,8 +48,8 @@
     val text: CharSequence = if (text is TextFieldCharSequence) text.text else text
 
     /**
-     * The selection range. If the selection is collapsed, it represents cursor
-     * location. When selection range is out of bounds, it is constrained with the text length.
+     * The selection range. If the selection is collapsed, it represents cursor location. When
+     * selection range is out of bounds, it is constrained with the text length.
      */
     val selection: TextRange = selection.coerceIn(0, text.length)
 
@@ -102,8 +101,8 @@
     fun shouldShowSelection(): Boolean = highlight == null
 
     /**
-     * Returns true if [other] is a [TextFieldCharSequence] with the same contents, text, and composition.
-     * To compare just the text, call [contentEquals].
+     * Returns true if [other] is a [TextFieldCharSequence] with the same contents, text, and
+     * composition. To compare just the text, call [contentEquals].
      */
     override fun equals(other: Any?): Boolean {
         if (this === other) return true
@@ -129,9 +128,7 @@
     }
 }
 
-/**
- * A text range highlight type. The highlight styling depends on the type.
- */
+/** A text range highlight type. The highlight styling depends on the type. */
 @JvmInline
 internal value class TextHighlightType private constructor(private val value: Int) {
     companion object {
@@ -153,8 +150,7 @@
  * Returns the text before the selection.
  *
  * @param maxChars maximum number of characters (inclusive) before the minimum value in
- * [TextFieldCharSequence.selection].
- *
+ *   [TextFieldCharSequence.selection].
  * @see TextRange.min
  */
 internal fun TextFieldCharSequence.getTextBeforeSelection(maxChars: Int): CharSequence =
@@ -164,15 +160,12 @@
  * Returns the text after the selection.
  *
  * @param maxChars maximum number of characters (exclusive) after the maximum value in
- * [TextFieldCharSequence.selection].
- *
+ *   [TextFieldCharSequence.selection].
  * @see TextRange.max
  */
 internal fun TextFieldCharSequence.getTextAfterSelection(maxChars: Int): CharSequence =
     subSequence(selection.max, kotlin.math.min(selection.max + maxChars, length))
 
-/**
- * Returns the currently selected text.
- */
+/** Returns the currently selected text. */
 internal fun TextFieldCharSequence.getSelectedText(): CharSequence =
     subSequence(selection.min, selection.max)
diff --git a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/input/TextFieldDecorator.kt b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/input/TextFieldDecorator.kt
index 9b87b72..72e513e 100644
--- a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/input/TextFieldDecorator.kt
+++ b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/input/TextFieldDecorator.kt
@@ -19,9 +19,8 @@
 import androidx.compose.runtime.Composable
 
 /**
- * Composable interface that allows to add decorations around text field, such as icon,
- * placeholder, helper messages or similar, and automatically increase the hit target area
- * of the text field.
+ * Composable interface that allows to add decorations around text field, such as icon, placeholder,
+ * helper messages or similar, and automatically increase the hit target area of the text field.
  *
  * @sample androidx.compose.foundation.samples.BasicTextFieldDecoratorSample
  */
diff --git a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/input/TextFieldLineLimits.kt b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/input/TextFieldLineLimits.kt
index 9e40fbd..772b2bf 100644
--- a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/input/TextFieldLineLimits.kt
+++ b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/input/TextFieldLineLimits.kt
@@ -23,8 +23,8 @@
 import androidx.compose.runtime.Stable
 
 /**
- * Values that specify the text wrapping, scrolling, and height measurement behavior for
- * text fields.
+ * Values that specify the text wrapping, scrolling, and height measurement behavior for text
+ * fields.
  *
  * @see SingleLine
  * @see MultiLine
@@ -54,10 +54,8 @@
      * the [heightIn] modifier.
      */
     @Immutable
-    class MultiLine(
-        val minHeightInLines: Int = 1,
-        val maxHeightInLines: Int = Int.MAX_VALUE
-    ) : TextFieldLineLimits {
+    class MultiLine(val minHeightInLines: Int = 1, val maxHeightInLines: Int = Int.MAX_VALUE) :
+        TextFieldLineLimits {
         init {
             require(minHeightInLines in 1..maxHeightInLines) {
                 "Expected 1 ≤ minHeightInLines ≤ maxHeightInLines, were " +
diff --git a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/input/TextFieldState.kt b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/input/TextFieldState.kt
index 49f0790..6ae7f10 100644
--- a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/input/TextFieldState.kt
+++ b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/input/TextFieldState.kt
@@ -50,8 +50,8 @@
  * To change the text field contents programmatically, call [edit], [setTextAndSelectAll],
  * [setTextAndPlaceCursorAtEnd], or [clearText]. Individual parts of the state like [text],
  * [selection], or [composition] can be read from any snapshot restart scope like Composable
- * functions. To observe these members from outside a restart scope, use
- * `snapshotFlow { textFieldState.text }` or `snapshotFlow { textFieldState.selection }`.
+ * functions. To observe these members from outside a restart scope, use `snapshotFlow {
+ * textFieldState.text }` or `snapshotFlow { textFieldState.selection }`.
  *
  * When instantiating this class from a composable, use [rememberTextFieldState] to automatically
  * save and restore the field state. For more advanced use cases, pass [TextFieldState.Saver] to
@@ -60,7 +60,8 @@
  * @sample androidx.compose.foundation.samples.BasicTextFieldStateCompleteSample
  */
 @Stable
-class TextFieldState internal constructor(
+class TextFieldState
+internal constructor(
     initialText: String,
     initialSelection: TextRange,
     initialTextUndoManager: TextUndoManager
@@ -71,9 +72,7 @@
         initialSelection: TextRange = TextRange(initialText.length)
     ) : this(initialText, initialSelection, TextUndoManager())
 
-    /**
-     * Manages the history of edit operations that happen in this [TextFieldState].
-     */
+    /** Manages the history of edit operations that happen in this [TextFieldState]. */
     internal val textUndoManager: TextUndoManager = initialTextUndoManager
 
     /**
@@ -81,18 +80,19 @@
      * or IME commands, must be reflected on this buffer eventually.
      */
     @VisibleForTesting
-    internal var mainBuffer: EditingBuffer = EditingBuffer(
-        text = initialText,
-        selection = initialSelection.coerceIn(0, initialText.length)
-    )
+    internal var mainBuffer: EditingBuffer =
+        EditingBuffer(
+            text = initialText,
+            selection = initialSelection.coerceIn(0, initialText.length)
+        )
 
     /**
      * [TextFieldState] does not synchronize calls to [edit] but requires main thread access. It
      * also has no way to disallow reentrant behavior (nested calls to [edit]) through the API.
      * Instead we keep track of whether an edit session is currently running. If [edit] is called
      * concurrently or reentered, it should throw an exception. The only exception is if
-     * [TextFieldState] is being modified in two different snapshots. Hence, this value is backed
-     * by a snapshot state.
+     * [TextFieldState] is being modified in two different snapshots. Hence, this value is backed by
+     * a snapshot state.
      */
     private var isEditing: Boolean by mutableStateOf(false)
 
@@ -101,61 +101,60 @@
      * the user enters text or otherwise changes the text field contents. To change it
      * programmatically, call [edit].
      *
-     * This is backed by snapshot state, so reading this property in a restartable function (e.g.
-     * a composable function) will cause the function to restart when the text field's value
-     * changes.
+     * This is backed by snapshot state, so reading this property in a restartable function (e.g. a
+     * composable function) will cause the function to restart when the text field's value changes.
      *
      * @sample androidx.compose.foundation.samples.BasicTextFieldTextDerivedStateSample
      *
      * @see edit
      */
-    internal var value: TextFieldCharSequence by mutableStateOf(
-        TextFieldCharSequence(initialText, initialSelection)
-    )
-        /**
-         * Do not set directly. Always go through [updateValueAndNotifyListeners].
-         */
+    internal var value: TextFieldCharSequence by
+        mutableStateOf(TextFieldCharSequence(initialText, initialSelection))
+        /** Do not set directly. Always go through [updateValueAndNotifyListeners]. */
         private set
 
     /**
      * The current text content. This value will automatically update when the user enters text or
      * otherwise changes the text field contents. To change it programmatically, call [edit].
      *
-     * To observe changes to this property outside a restartable function, use
-     * `snapshotFlow { text }`.
+     * To observe changes to this property outside a restartable function, use `snapshotFlow { text
+     * }`.
      *
      * @sample androidx.compose.foundation.samples.BasicTextFieldTextValuesSample
      *
      * @see edit
      * @see snapshotFlow
      */
-    val text: CharSequence get() = value.text
+    val text: CharSequence
+        get() = value.text
 
     /**
      * The current selection range. If the selection is collapsed, it represents cursor location.
      * This value will automatically update when the user enters text or otherwise changes the text
      * field selection range. To change it programmatically, call [edit].
      *
-     * To observe changes to this property outside a restartable function, use
-     * `snapshotFlow { selection }`.
+     * To observe changes to this property outside a restartable function, use `snapshotFlow {
+     * selection }`.
      *
      * @see edit
      * @see snapshotFlow
      * @see TextFieldCharSequence.selection
      */
-    val selection: TextRange get() = value.selection
+    val selection: TextRange
+        get() = value.selection
 
     /**
      * The current composing range dictated by the IME. If null, there is no composing region.
      *
-     * To observe changes to this property outside a restartable function, use
-     * `snapshotFlow { composition }`.
+     * To observe changes to this property outside a restartable function, use `snapshotFlow {
+     * composition }`.
      *
      * @see edit
      * @see snapshotFlow
      * @see TextFieldCharSequence.composition
      */
-    val composition: TextRange? get() = value.composition
+    val composition: TextRange?
+        get() = value.composition
 
     /**
      * Runs [block] with a mutable version of the current state. The block can make changes to the
@@ -181,9 +180,8 @@
         }
     }
 
-    override fun toString(): String = Snapshot.withoutReadObservation {
-        "TextFieldState(selection=$selection, text=\"$text\")"
-    }
+    override fun toString(): String =
+        Snapshot.withoutReadObservation { "TextFieldState(selection=$selection, text=\"$text\")" }
 
     /**
      * Undo history controller for this TextFieldState.
@@ -201,17 +199,15 @@
     @PublishedApi
     internal fun startEdit(): TextFieldBuffer {
         val isEditingFreeze = Snapshot.withoutReadObservation { isEditing }
-        check(!isEditingFreeze) {
-            "TextFieldState does not support concurrent or nested editing."
-        }
+        check(!isEditingFreeze) { "TextFieldState does not support concurrent or nested editing." }
         isEditing = true
         return TextFieldBuffer(value)
     }
 
     /**
-     * If the text or selection in [newValue] was actually modified, updates this state's
-     * internal values. If [newValue] was not modified at all, the state is not updated, and
-     * this will not invalidate anyone who is observing this state.
+     * If the text or selection in [newValue] was actually modified, updates this state's internal
+     * values. If [newValue] was not modified at all, the state is not updated, and this will not
+     * invalidate anyone who is observing this state.
      *
      * @param newValue [TextFieldBuffer] that contains the latest updates
      */
@@ -239,9 +235,9 @@
     }
 
     /**
-     * An edit block that updates [TextFieldState] on behalf of user actions such as gestures,
-     * IME commands, hardware keyboard events, clipboard actions, and more. These modifications
-     * must also run through the given [inputTransformation] since they are user actions.
+     * An edit block that updates [TextFieldState] on behalf of user actions such as gestures, IME
+     * commands, hardware keyboard events, clipboard actions, and more. These modifications must
+     * also run through the given [inputTransformation] since they are user actions.
      *
      * Be careful that this method is not snapshot aware. It is only safe to call this from main
      * thread, or global snapshot. Also, this function is defined as inline for performance gains,
@@ -253,9 +249,9 @@
      * in the Undo stack. This can be controlled by [undoBehavior].
      *
      * @param inputTransformation [InputTransformation] to run after [block] is applied
-     * @param restartImeIfContentChanges Whether IME should be restarted if the proposed changes
-     * end up editing the text content. Only pass false to this argument if the source of the
-     * changes is IME itself.
+     * @param restartImeIfContentChanges Whether IME should be restarted if the proposed changes end
+     *   up editing the text content. Only pass false to this argument if the source of the changes
+     *   is IME itself.
      * @param block The function that updates the current editing buffer.
      */
     internal inline fun editAsUser(
@@ -281,18 +277,19 @@
      *
      * This method of editing is not recommended for majority of use cases. It is originally added
      * to support applying of undo/redo actions without clearing the history. Also, it doesn't
-     * allocate an additional buffer like [edit] method because changes are ignored and it's not
-     * a public API.
+     * allocate an additional buffer like [edit] method because changes are ignored and it's not a
+     * public API.
      */
     internal inline fun editWithNoSideEffects(block: EditingBuffer.() -> Unit) {
         mainBuffer.changeTracker.clearChanges()
         mainBuffer.block()
 
-        val afterEditValue = TextFieldCharSequence(
-            text = mainBuffer.toString(),
-            selection = mainBuffer.selection,
-            composition = mainBuffer.composition
-        )
+        val afterEditValue =
+            TextFieldCharSequence(
+                text = mainBuffer.toString(),
+                selection = mainBuffer.selection,
+                composition = mainBuffer.composition
+            )
 
         updateValueAndNotifyListeners(
             oldValue = value,
@@ -314,21 +311,26 @@
         // should still run even if text doesn't change as a result of an input.
         // If there is no change at all, or only composition or highlight has changed, we can end
         // early.
-        if (mainBuffer.changeTracker.changeCount == 0 &&
-            beforeEditValue.selection == mainBuffer.selection) {
-            if (beforeEditValue.composition != mainBuffer.composition ||
-                beforeEditValue.highlight != mainBuffer.highlight) {
+        if (
+            mainBuffer.changeTracker.changeCount == 0 &&
+                beforeEditValue.selection == mainBuffer.selection
+        ) {
+            if (
+                beforeEditValue.composition != mainBuffer.composition ||
+                    beforeEditValue.highlight != mainBuffer.highlight
+            ) {
                 // edit operation caused no change to text content or selection
                 // No need to run an existing InputTransformation, or record an undo. Only update
                 // the IME that composition has been accepted.
                 updateValueAndNotifyListeners(
                     oldValue = value,
-                    newValue = TextFieldCharSequence(
-                        text = mainBuffer.toString(),
-                        selection = mainBuffer.selection,
-                        composition = mainBuffer.composition,
-                        highlight = mainBuffer.highlight
-                    ),
+                    newValue =
+                        TextFieldCharSequence(
+                            text = mainBuffer.toString(),
+                            selection = mainBuffer.selection,
+                            composition = mainBuffer.composition,
+                            highlight = mainBuffer.highlight
+                        ),
                     restartImeIfContentChanges = restartImeIfContentChanges
                 )
             }
@@ -337,12 +339,13 @@
 
         // There's a meaningful change to the buffer, let's run the full logic.
         // first take a _snapshot_ of current state of the mainBuffer after changes are applied.
-        val afterEditValue = TextFieldCharSequence(
-            text = mainBuffer.toString(),
-            selection = mainBuffer.selection,
-            composition = mainBuffer.composition,
-            highlight = mainBuffer.highlight
-        )
+        val afterEditValue =
+            TextFieldCharSequence(
+                text = mainBuffer.toString(),
+                selection = mainBuffer.selection,
+                composition = mainBuffer.composition,
+                highlight = mainBuffer.highlight
+            )
 
         // if there's no filter; just record the undo, update the snapshot value, end.
         if (inputTransformation == null) {
@@ -363,11 +366,12 @@
         // Prepare a TextFieldBuffer to run InputTransformation. TextFieldBuffer should be
         // initialized with the edits that are already applied on mainBuffer, hence the difference
         // between originalValue and initialValue.
-        val textFieldBuffer = TextFieldBuffer(
-            originalValue = beforeEditValue,
-            initialValue = afterEditValue,
-            initialChanges = mainBuffer.changeTracker
-        )
+        val textFieldBuffer =
+            TextFieldBuffer(
+                originalValue = beforeEditValue,
+                initialValue = afterEditValue,
+                initialChanges = mainBuffer.changeTracker
+            )
 
         // apply the inputTransformation.
         with(inputTransformation) { textFieldBuffer.transformInput() }
@@ -388,9 +392,10 @@
                 oldValue = beforeEditValue,
                 // If neither the text nor the selection changed by the filter, we want to preserve
                 // the composition. Otherwise, the IME will reset it anyway.
-                newValue = textFieldBuffer.toTextFieldCharSequence(
-                    composition = afterEditValue.composition
-                ),
+                newValue =
+                    textFieldBuffer.toTextFieldCharSequence(
+                        composition = afterEditValue.composition
+                    ),
                 restartImeIfContentChanges = restartImeIfContentChanges
             )
         }
@@ -405,15 +410,15 @@
 
     /**
      * There are 3 types of edits that are defined on [TextFieldState];
-     *   1. Programmatic changes that are created by [edit] function,
-     *   2. User edits coming from the system that are initiated through IME, semantics, or gestures
-     *   3. Applying Undo/Redo actions that should not trigger side effects.
+     * 1. Programmatic changes that are created by [edit] function,
+     * 2. User edits coming from the system that are initiated through IME, semantics, or gestures
+     * 3. Applying Undo/Redo actions that should not trigger side effects.
      *
-     * Eventually all changes, no matter the source, should be committed to [value]. Also, they
-     * have to trigger the content change listeners. However, we have two different buffers called
+     * Eventually all changes, no matter the source, should be committed to [value]. Also, they have
+     * to trigger the content change listeners. However, we have two different buffers called
      * [EditingBuffer] and [TextFieldBuffer]. All developer facing APIs use [TextFieldBuffer] to
-     * change the state but internal ones use [EditingBuffer]. This function consolidates both
-     * forms of updates, then commits the result to [value].
+     * change the state but internal ones use [EditingBuffer]. This function consolidates both forms
+     * of updates, then commits the result to [value].
      *
      * Finally notifies the listeners in [notifyImeListeners] that the contents of this
      * [TextFieldState] has changed.
@@ -429,14 +434,12 @@
         value = newValue
         finishEditing()
 
-        notifyImeListeners.forEach {
-            it.onChange(oldValue, newValue, restartImeIfContentChanges)
-        }
+        notifyImeListeners.forEach { it.onChange(oldValue, newValue, restartImeIfContentChanges) }
     }
 
     /**
-     * Records the difference between [previousValue] and [postValue], defined by [changes],
-     * into [textUndoManager] according to the strategy defined by [undoBehavior].
+     * Records the difference between [previousValue] and [postValue], defined by [changes], into
+     * [textUndoManager] according to the strategy defined by [undoBehavior].
      */
     private fun recordEditForUndo(
         previousValue: TextFieldCharSequence,
@@ -482,17 +485,17 @@
      * State in [TextFieldState] can change through various means but categorically there are two
      * sources; Developer([TextFieldState.edit]) and User([TextFieldState.editAsUser]). Only
      * non-InputTransformed IME sourced changes can skip updating the IME. Otherwise, all changes
-     * must be sent to the IME to let it synchronize its state with the [TextFieldState]. Such
-     * a communication channel is established by the IME registering a [NotifyImeListener] on a
+     * must be sent to the IME to let it synchronize its state with the [TextFieldState]. Such a
+     * communication channel is established by the IME registering a [NotifyImeListener] on a
      * [TextFieldState].
      */
     internal fun interface NotifyImeListener {
 
         /**
          * Called when the value in [TextFieldState] changes via any source. The
-         * [restartImeIfContentChanges] flag determines whether a text change between [oldValue]
-         * and [newValue] should restart the ongoing input connection. Selection changes never
-         * require a restart.
+         * [restartImeIfContentChanges] flag determines whether a text change between [oldValue] and
+         * [newValue] should restart the ongoing input connection. Selection changes never require a
+         * restart.
          */
         fun onChange(
             oldValue: TextFieldCharSequence,
@@ -502,18 +505,18 @@
     }
 
     /**
-     * Carries changes made to a [TextFieldBuffer] into [mainBuffer], then updates the [value].
-     * This usually happens when the edit source is something programmatic like [edit] or
+     * Carries changes made to a [TextFieldBuffer] into [mainBuffer], then updates the [value]. This
+     * usually happens when the edit source is something programmatic like [edit] or
      * [InputTransformation]. IME commands are applied directly on [mainBuffer].
      *
      * @param textFieldBuffer Source buffer that will be used to sync the mainBuffer.
-     * @param newComposition TextFieldBuffer does not allow changing composition. This parameter
-     * is an opportunity to decide what the mainBuffer's new composition should be.
+     * @param newComposition TextFieldBuffer does not allow changing composition. This parameter is
+     *   an opportunity to decide what the mainBuffer's new composition should be.
      * @param textChanged Whether the text content inside [textFieldBuffer] is different than
-     * [mainBuffer]'s text content. Although this value can be calculated by this function, some
-     * callers already do the comparison before hand, so there's no need to recalculate it.
+     *   [mainBuffer]'s text content. Although this value can be calculated by this function, some
+     *   callers already do the comparison before hand, so there's no need to recalculate it.
      * @param selectionChanged Whether the selection inside [textFieldBuffer] is different than
-     * [mainBuffer]'s selection.
+     *   [mainBuffer]'s selection.
      */
     @VisibleForTesting
     internal fun syncMainBufferToTemporaryBuffer(
@@ -524,20 +527,18 @@
     ) {
         val bufferString = mainBuffer.toString()
 
-        val bufferState = TextFieldCharSequence(
-            bufferString,
-            mainBuffer.selection,
-            mainBuffer.composition
-        )
+        val bufferState =
+            TextFieldCharSequence(bufferString, mainBuffer.selection, mainBuffer.composition)
 
         val compositionChanged = newComposition != mainBuffer.composition
 
         if (textChanged) {
             // reset the buffer in its entirety
-            mainBuffer = EditingBuffer(
-                text = textFieldBuffer.toString(),
-                selection = textFieldBuffer.selection
-            )
+            mainBuffer =
+                EditingBuffer(
+                    text = textFieldBuffer.toString(),
+                    selection = textFieldBuffer.selection
+                )
         } else if (selectionChanged) {
             mainBuffer.setSelection(textFieldBuffer.selection.start, textFieldBuffer.selection.end)
         }
@@ -552,11 +553,12 @@
             mainBuffer.commitComposition()
         }
 
-        val finalValue = TextFieldCharSequence(
-            text = if (textChanged) textFieldBuffer.toString() else bufferString,
-            selection = mainBuffer.selection,
-            composition = mainBuffer.composition
-        )
+        val finalValue =
+            TextFieldCharSequence(
+                text = if (textChanged) textFieldBuffer.toString() else bufferString,
+                selection = mainBuffer.selection,
+                composition = mainBuffer.composition
+            )
 
         // We cannot use `value` as the old value here because intermediate IME changes are only
         // applied on mainBuffer (this only happens if syncMainBufferToTemporaryBuffer is triggered
@@ -585,9 +587,7 @@
                 value.text.toString(),
                 value.selection.start,
                 value.selection.end,
-                with(TextUndoManager.Companion.Saver) {
-                    save(value.textUndoManager)
-                }
+                with(TextUndoManager.Companion.Saver) { save(value.textUndoManager) }
             )
         }
 
@@ -595,13 +595,10 @@
             val (text, selectionStart, selectionEnd, savedTextUndoManager) = value as List<*>
             return TextFieldState(
                 initialText = text as String,
-                initialSelection = TextRange(
-                    start = selectionStart as Int,
-                    end = selectionEnd as Int
-                ),
-                initialTextUndoManager = with(TextUndoManager.Companion.Saver) {
-                    restore(savedTextUndoManager!!)
-                }!!
+                initialSelection =
+                    TextRange(start = selectionStart as Int, end = selectionEnd as Int),
+                initialTextUndoManager =
+                    with(TextUndoManager.Companion.Saver) { restore(savedTextUndoManager!!) }!!
             )
         }
     }
@@ -618,9 +615,8 @@
 fun rememberTextFieldState(
     initialText: String = "",
     initialSelection: TextRange = TextRange(initialText.length)
-): TextFieldState = rememberSaveable(saver = TextFieldState.Saver) {
-    TextFieldState(initialText, initialSelection)
-}
+): TextFieldState =
+    rememberSaveable(saver = TextFieldState.Saver) { TextFieldState(initialText, initialSelection) }
 
 /**
  * Sets the text in this [TextFieldState] to [text], replacing any text that was previously there,
diff --git a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/input/TextObfuscationMode.kt b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/input/TextObfuscationMode.kt
index b2988ee..2be9695 100644
--- a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/input/TextObfuscationMode.kt
+++ b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/input/TextObfuscationMode.kt
@@ -19,8 +19,8 @@
 /**
  * Defines how the text will be obscured in secure text fields.
  *
- * Text obscuring refers to replacing the original text content with a mask via various methods.
- * It is most common in password fields.
+ * Text obscuring refers to replacing the original text content with a mask via various methods. It
+ * is most common in password fields.
  *
  * The default behavior for typing input on Desktop has always been to keep it completely hidden.
  * However, on mobile devices, the default behavior is to briefly reveal the last typed character
@@ -47,9 +47,7 @@
          */
         val RevealLastTyped = TextObfuscationMode(1)
 
-        /**
-         * Default behavior on desktop platforms. All characters are hidden.
-         */
+        /** Default behavior on desktop platforms. All characters are hidden. */
         val Hidden = TextObfuscationMode(2)
     }
 }
diff --git a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/input/TextUndoManager.kt b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/input/TextUndoManager.kt
index 09914bd..a393c7a 100644
--- a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/input/TextUndoManager.kt
+++ b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/input/TextUndoManager.kt
@@ -39,9 +39,8 @@
  */
 internal class TextUndoManager(
     initialStagingUndo: TextUndoOperation? = null,
-    private val undoManager: UndoManager<TextUndoOperation> = UndoManager(
-        capacity = TEXT_UNDO_CAPACITY
-    )
+    private val undoManager: UndoManager<TextUndoOperation> =
+        UndoManager(capacity = TEXT_UNDO_CAPACITY)
 ) {
     private var stagingUndo by mutableStateOf<TextUndoOperation?>(initialStagingUndo)
 
@@ -105,28 +104,16 @@
 
             override fun SaverScope.save(value: TextUndoManager): Any {
                 return listOf(
-                    value.stagingUndo?.let {
-                        with(TextUndoOperation.Saver) {
-                            save(it)
-                        }
-                    },
-                    with(undoManagerSaver) {
-                        save(value.undoManager)
-                    }
+                    value.stagingUndo?.let { with(TextUndoOperation.Saver) { save(it) } },
+                    with(undoManagerSaver) { save(value.undoManager) }
                 )
             }
 
             override fun restore(value: Any): TextUndoManager? {
                 val (savedStagingUndo, savedUndoManager) = value as List<*>
                 return TextUndoManager(
-                    savedStagingUndo?.let {
-                        with(TextUndoOperation.Saver) {
-                            restore(it)
-                        }
-                    },
-                    with(undoManagerSaver) {
-                        restore(savedUndoManager!!)
-                    }!!
+                    savedStagingUndo?.let { with(TextUndoOperation.Saver) { restore(it) } },
+                    with(undoManagerSaver) { restore(savedUndoManager!!) }!!
                 )
             }
         }
@@ -134,23 +121,22 @@
 }
 
 /**
- * Try to merge this [TextUndoOperation] with the [next]. Chronologically the [next] op must
- * come after this one. If merge is not possible, this function returns null.
+ * Try to merge this [TextUndoOperation] with the [next]. Chronologically the [next] op must come
+ * after this one. If merge is not possible, this function returns null.
  *
- * There are many rules that govern the grouping logic of successive undo operations. Here we try
- * to cover the most basic requirements but this is certainly not an exhaustive list.
- *
- * 1. Each action defines whether they can be merged at all. For example, text edits that are
- * caused by cut or paste define themselves as unmergeable no matter what comes before or next.
+ * There are many rules that govern the grouping logic of successive undo operations. Here we try to
+ * cover the most basic requirements but this is certainly not an exhaustive list.
+ * 1. Each action defines whether they can be merged at all. For example, text edits that are caused
+ *    by cut or paste define themselves as unmergeable no matter what comes before or next.
  * 2. If certain amount of time has passed since the latest grouping has begun.
  * 3. Enter key (hard line break) is unmergeable.
  * 4. Only same type of text edits can be merged. An insertion must be grouped by other insertions,
- * a deletion by other deletions. Replace type of edit is never mergeable.
- *   4.a. Two insertions can only be merged if the chronologically next one is a suffix of the
- *   previous insertion. In other words, cursor should always be moving forwards.
- *   4.b. Deletions have directionality. Cursor can only insert in place and move forwards but
- *   deletion can be requested either forwards (delete) or backwards (backspace). Only deletions
- *   that have the same direction can be merged. They also have to share a boundary.
+ *    a deletion by other deletions. Replace type of edit is never mergeable. 4.a. Two insertions
+ *    can only be merged if the chronologically next one is a suffix of the previous insertion. In
+ *    other words, cursor should always be moving forwards. 4.b. Deletions have directionality.
+ *    Cursor can only insert in place and move forwards but deletion can be requested either
+ *    forwards (delete) or backwards (backspace). Only deletions that have the same direction can be
+ *    merged. They also have to share a boundary.
  */
 internal fun TextUndoOperation.merge(next: TextUndoOperation): TextUndoOperation? {
     if (!canMerge || !next.canMerge) return null
@@ -158,8 +144,9 @@
     // between these ops
     if (
         next.timeInMillis < timeInMillis ||
-        next.timeInMillis - timeInMillis >= SNAPSHOTS_INTERVAL_MILLIS
-    ) return null
+            next.timeInMillis - timeInMillis >= SNAPSHOTS_INTERVAL_MILLIS
+    )
+        return null
     // Do not merge undo history when one of the ops is a new line insertion
     if (isNewLineInsert || next.isNewLineInsert) return null
     // Only same type of ops can be merged together
@@ -180,7 +167,7 @@
         // only merge consecutive deletions if both have the same directionality
         if (
             deletionType == next.deletionType &&
-            (deletionType == TextDeleteType.Start || deletionType == TextDeleteType.End)
+                (deletionType == TextDeleteType.Start || deletionType == TextDeleteType.End)
         ) {
             // This op deletes
             if (index == next.index + next.preText.length) {
@@ -208,14 +195,14 @@
 }
 
 /**
- * Adds the [changes] to this [UndoManager] by converting from [TextFieldBuffer.ChangeList] space
- * to [TextUndoOperation] space.
+ * Adds the [changes] to this [UndoManager] by converting from [TextFieldBuffer.ChangeList] space to
+ * [TextUndoOperation] space.
  *
  * @param pre State of the [TextFieldBuffer] before any changes are applied
  * @param post State of the [TextFieldBuffer] after all the changes are applied
  * @param changes List of changes that are applied on [pre] that transforms it to [post].
- * @param allowMerge Whether to allow merging the calculated operation with the last operation
- * in the stack.
+ * @param allowMerge Whether to allow merging the calculated operation with the last operation in
+ *   the stack.
  */
 @OptIn(ExperimentalFoundationApi::class)
 internal fun TextUndoManager.recordChanges(
diff --git a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/input/UndoState.kt b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/input/UndoState.kt
index 5346df7..a722012 100644
--- a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/input/UndoState.kt
+++ b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/input/UndoState.kt
@@ -18,9 +18,7 @@
 
 import androidx.compose.foundation.ExperimentalFoundationApi
 
-/**
- * Defines an interactable undo history.
- */
+/** Defines an interactable undo history. */
 @ExperimentalFoundationApi
 class UndoState internal constructor(private val state: TextFieldState) {
 
@@ -50,16 +48,12 @@
         state.textUndoManager.undo(state)
     }
 
-    /**
-     * Re-applies a change that was previously reverted via [undo].
-     */
+    /** Re-applies a change that was previously reverted via [undo]. */
     fun redo() {
         state.textUndoManager.redo(state)
     }
 
-    /**
-     * Clears all undo and redo history up to this point.
-     */
+    /** Clears all undo and redo history up to this point. */
     fun clearHistory() {
         state.textUndoManager.clearHistory()
     }
diff --git a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/input/internal/ChangeTracker.kt b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/input/internal/ChangeTracker.kt
index 4eaad39..ea96a80 100644
--- a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/input/internal/ChangeTracker.kt
+++ b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/input/internal/ChangeTracker.kt
@@ -45,9 +45,9 @@
 
     /**
      * This function deals with three "coordinate spaces":
-     *  - `original`: The text before any changes were made.
-     *  - `pre`: The text before this change is applied, but with all previous changes applied.
-     *  - `post`: The text after this change is applied, including all the previous changes.
+     * - `original`: The text before any changes were made.
+     * - `pre`: The text before this change is applied, but with all previous changes applied.
+     * - `post`: The text after this change is applied, including all the previous changes.
      *
      * When this function is called, the existing changes map ranges in `original` to ranges in
      * `pre`. The new change is a mapping from `pre` to `post`. This function must determine the
@@ -56,13 +56,13 @@
      * ensure the [ChangeList] invariant that all changes are non-overlapping.
      *
      * The algorithm works as follows:
-     *  1. Find all the changes that are adjacent to or overlap with this one. This search is
-     *     performed in the `pre` space since that's the space the new change shares with the
-     *     existing changes.
-     *  2. Merge all the changes from (1) into a single range in the `original` and `pre` spaces.
-     *  3. Merge the new change with the change from (2), updating the end of the range to account
-     *     for the new text.
-     *  3. Offset all remaining changes are to account for the new text.
+     * 1. Find all the changes that are adjacent to or overlap with this one. This search is
+     *    performed in the `pre` space since that's the space the new change shares with the
+     *    existing changes.
+     * 2. Merge all the changes from (1) into a single range in the `original` and `pre` spaces.
+     * 3. Merge the new change with the change from (2), updating the end of the range to account
+     *    for the new text.
+     * 3. Offset all remaining changes are to account for the new text.
      */
     fun trackChange(preStart: Int, preEnd: Int, postLength: Int) {
         if (preStart == preEnd && postLength == 0) {
@@ -83,9 +83,9 @@
             // Merge adjacent and overlapping changes as we go.
             if (
                 change.preStart in preMin..preMax ||
-                change.preEnd in preMin..preMax ||
-                preMin in change.preStart..change.preEnd ||
-                preMax in change.preStart..change.preEnd
+                    change.preEnd in preMin..preMax ||
+                    preMin in change.preStart..change.preEnd ||
+                    preMax in change.preStart..change.preEnd
             ) {
                 if (mergedOverlappingChange == null) {
                     mergedOverlappingChange = change
@@ -154,20 +154,23 @@
         preMax: Int,
         postDelta: Int
     ) {
-        var originalDelta = if (_changesTemp.isEmpty()) 0 else {
-            _changesTemp.last().let { it.preEnd - it.originalEnd }
-        }
+        var originalDelta =
+            if (_changesTemp.isEmpty()) 0
+            else {
+                _changesTemp.last().let { it.preEnd - it.originalEnd }
+            }
         val newChange: Change
         if (mergedOverlappingChange == null) {
             // There were no overlapping changes, so allocate a new one.
             val originalStart = preMin - originalDelta
             val originalEnd = originalStart + (preMax - preMin)
-            newChange = Change(
-                preStart = preMin,
-                preEnd = preMax + postDelta,
-                originalStart = originalStart,
-                originalEnd = originalEnd
-            )
+            newChange =
+                Change(
+                    preStart = preMin,
+                    preEnd = preMax + postDelta,
+                    originalStart = originalStart,
+                    originalEnd = originalEnd
+                )
         } else {
             newChange = mergedOverlappingChange
             // Convert the merged overlapping changes to the `post` space.
diff --git a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/input/internal/CodepointHelpers.kt b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/input/internal/CodepointHelpers.kt
index 287b398..7b7fc509 100644
--- a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/input/internal/CodepointHelpers.kt
+++ b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/input/internal/CodepointHelpers.kt
@@ -17,5 +17,7 @@
 package androidx.compose.foundation.text.input.internal
 
 internal expect fun CharSequence.codePointAt(index: Int): Int
+
 internal expect fun charCount(codePoint: Int): Int
+
 internal expect fun CharSequence.codePointBefore(index: Int): Int
diff --git a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/input/internal/CodepointTransformation.kt b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/input/internal/CodepointTransformation.kt
index ff2b499..0b8a8c0 100644
--- a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/input/internal/CodepointTransformation.kt
+++ b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/input/internal/CodepointTransformation.kt
@@ -24,8 +24,8 @@
  * Visual transformation interface for input fields.
  *
  * This interface is responsible for 1-to-1 mapping of every codepoint in input state to another
- * codepoint before text is rendered. Visual transformation is useful when the underlying source
- * of input needs to remain but rendered content should look different, e.g. password obscuring.
+ * codepoint before text is rendered. Visual transformation is useful when the underlying source of
+ * input needs to remain but rendered content should look different, e.g. password obscuring.
  */
 @Stable
 internal fun interface CodepointTransformation {
diff --git a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/input/internal/CursorAnimationState.kt b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/input/internal/CursorAnimationState.kt
index e9898ab..6bb37a8 100644
--- a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/input/internal/CursorAnimationState.kt
+++ b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/input/internal/CursorAnimationState.kt
@@ -38,8 +38,7 @@
     private var animationJob = AtomicReference<Job?>(null)
 
     /**
-     * The alpha value that should be used to draw the cursor.
-     * Will always be in the range [0, 1].
+     * The alpha value that should be used to draw the cursor. Will always be in the range [0, 1].
      */
     var cursorAlpha by mutableFloatStateOf(0f)
         private set
@@ -62,33 +61,36 @@
             // Even though we're launching a new coroutine, because of structured concurrency, the
             // restart function won't return until the animation is finished, and cancelling the
             // calling coroutine will cancel the animation.
-            animationJob.compareAndSet(null, launch {
-                // Join the old job after cancelling to ensure it finishes its finally block before
-                // we start changing the cursor alpha, so we don't end up interleaving alpha
-                // updates.
-                oldJob?.cancelAndJoin()
+            animationJob.compareAndSet(
+                null,
+                launch {
+                    // Join the old job after cancelling to ensure it finishes its finally block
+                    // before
+                    // we start changing the cursor alpha, so we don't end up interleaving alpha
+                    // updates.
+                    oldJob?.cancelAndJoin()
 
-                // Start the new animation and run until cancelled.
-                try {
-                    while (true) {
-                        cursorAlpha = 1f
-                        // Ignore MotionDurationScale – the cursor should blink even when animations
-                        // are disabled by the system.
-                        delay(500)
+                    // Start the new animation and run until cancelled.
+                    try {
+                        while (true) {
+                            cursorAlpha = 1f
+                            // Ignore MotionDurationScale – the cursor should blink even when
+                            // animations
+                            // are disabled by the system.
+                            delay(500)
+                            cursorAlpha = 0f
+                            delay(500)
+                        }
+                    } finally {
+                        // Hide cursor when the animation is cancelled.
                         cursorAlpha = 0f
-                        delay(500)
                     }
-                } finally {
-                    // Hide cursor when the animation is cancelled.
-                    cursorAlpha = 0f
                 }
-            })
+            )
         }
     }
 
-    /**
-     * Immediately cancels the cursor animation and hides the cursor (sets [cursorAlpha] to 0f).
-     */
+    /** Immediately cancels the cursor animation and hides the cursor (sets [cursorAlpha] to 0f). */
     fun cancelAndHide() {
         val job = animationJob.getAndSet(null)
         job?.cancel()
diff --git a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/input/internal/EditCommand.kt b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/input/internal/EditCommand.kt
index 614b6bf..5f25f0c 100644
--- a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/input/internal/EditCommand.kt
+++ b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/input/internal/EditCommand.kt
@@ -22,15 +22,13 @@
 /**
  * Commit final [text] to the text box and set the new cursor position.
  *
- * See [`commitText`](https://developer.android.com/reference/android/view/inputmethod/InputConnection.html#commitText(java.lang.CharSequence,%20int)).
+ * See
+ * [`commitText`](https://developer.android.com/reference/android/view/inputmethod/InputConnection.html#commitText(java.lang.CharSequence,%20int)).
  *
  * @param text The text to commit.
  * @param newCursorPosition The cursor position after inserted text.
  */
-internal fun EditingBuffer.commitText(
-    text: String,
-    newCursorPosition: Int
-) {
+internal fun EditingBuffer.commitText(text: String, newCursorPosition: Int) {
     // API description says replace ongoing composition text if there. Then, if there is no
     // composition text, insert text into cursor position or replace selection.
     if (hasComposition()) {
@@ -45,11 +43,12 @@
     val newCursor = cursor
 
     // See above API description for the meaning of newCursorPosition.
-    val newCursorInBuffer = if (newCursorPosition > 0) {
-        newCursor + newCursorPosition - 1
-    } else {
-        newCursor + newCursorPosition - text.length
-    }
+    val newCursorInBuffer =
+        if (newCursorPosition > 0) {
+            newCursor + newCursorPosition - 1
+        } else {
+            newCursor + newCursorPosition - text.length
+        }
 
     cursor = newCursorInBuffer.coerceIn(0, length)
 }
@@ -57,15 +56,13 @@
 /**
  * Mark a certain region of text as composing text.
  *
- * See [`setComposingRegion`](https://developer.android.com/reference/android/view/inputmethod/InputConnection.html#setComposingRegion(int,%2520int)).
+ * See
+ * [`setComposingRegion`](https://developer.android.com/reference/android/view/inputmethod/InputConnection.html#setComposingRegion(int,%2520int)).
  *
  * @param start The inclusive start offset of the composing region.
  * @param end The exclusive end offset of the composing region
  */
-internal fun EditingBuffer.setComposingRegion(
-    start: Int,
-    end: Int
-) {
+internal fun EditingBuffer.setComposingRegion(start: Int, end: Int) {
     // The API description says, different from SetComposingText, SetComposingRegion must
     // preserve the ongoing composition text and set new composition.
     if (hasComposition()) {
@@ -88,15 +85,13 @@
  * Replace the currently composing text with the given text, and set the new cursor position. Any
  * composing text set previously will be removed automatically.
  *
- * See [`setComposingText`](https://developer.android.com/reference/android/view/inputmethod/InputConnection.html#setComposingText(java.lang.CharSequence,%2520int)).
+ * See
+ * [`setComposingText`](https://developer.android.com/reference/android/view/inputmethod/InputConnection.html#setComposingText(java.lang.CharSequence,%2520int)).
  *
  * @param text The composing text.
  * @param newCursorPosition The cursor position after setting composing text.
  */
-internal fun EditingBuffer.setComposingText(
-    text: String,
-    newCursorPosition: Int
-) {
+internal fun EditingBuffer.setComposingText(text: String, newCursorPosition: Int) {
     if (hasComposition()) {
         // API doc says, if there is ongoing composing text, replace it with new text.
         val compositionStart = compositionStart
@@ -119,33 +114,33 @@
     val newCursor = cursor
 
     // See above API description for the meaning of newCursorPosition.
-    val newCursorInBuffer = if (newCursorPosition > 0) {
-        newCursor + newCursorPosition - 1
-    } else {
-        newCursor + newCursorPosition - text.length
-    }
+    val newCursorInBuffer =
+        if (newCursorPosition > 0) {
+            newCursor + newCursorPosition - 1
+        } else {
+            newCursor + newCursorPosition - text.length
+        }
 
     cursor = newCursorInBuffer.coerceIn(0, length)
 }
 
 /**
  * Delete [lengthBeforeCursor] characters of text before the current cursor position, and delete
- * [lengthAfterCursor] characters of text after the current cursor position, excluding the selection.
+ * [lengthAfterCursor] characters of text after the current cursor position, excluding the
+ * selection.
  *
  * Before and after refer to the order of the characters in the string, not to their visual
  * representation.
  *
- * See [`deleteSurroundingText`](https://developer.android.com/reference/android/view/inputmethod/InputConnection.html#deleteSurroundingText(int,%2520int)).
+ * See
+ * [`deleteSurroundingText`](https://developer.android.com/reference/android/view/inputmethod/InputConnection.html#deleteSurroundingText(int,%2520int)).
  *
  * @param lengthBeforeCursor The number of characters in UTF-16 before the cursor to be deleted.
- * Must be non-negative.
- * @param lengthAfterCursor The number of characters in UTF-16 after the cursor to be deleted.
- * Must be non-negative.
+ *   Must be non-negative.
+ * @param lengthAfterCursor The number of characters in UTF-16 after the cursor to be deleted. Must
+ *   be non-negative.
  */
-internal fun EditingBuffer.deleteSurroundingText(
-    lengthBeforeCursor: Int,
-    lengthAfterCursor: Int
-) {
+internal fun EditingBuffer.deleteSurroundingText(lengthBeforeCursor: Int, lengthAfterCursor: Int) {
     require(lengthBeforeCursor >= 0 && lengthAfterCursor >= 0) {
         "Expected lengthBeforeCursor and lengthAfterCursor to be non-negative, were " +
             "$lengthBeforeCursor and $lengthAfterCursor respectively."
@@ -165,15 +160,16 @@
 /**
  * A variant of [deleteSurroundingText]. The difference is that
  * * The lengths are supplied in code points, not in chars.
- * * This command does nothing if there are one or more invalid surrogate pairs
- * in the requested range.
+ * * This command does nothing if there are one or more invalid surrogate pairs in the requested
+ *   range.
  *
- * See [`deleteSurroundingTextInCodePoints`](https://developer.android.com/reference/android/view/inputmethod/InputConnection.html#deleteSurroundingTextInCodePoints(int,%2520int)).
+ * See
+ * [`deleteSurroundingTextInCodePoints`](https://developer.android.com/reference/android/view/inputmethod/InputConnection.html#deleteSurroundingTextInCodePoints(int,%2520int)).
  *
  * @param lengthBeforeCursor The number of characters in Unicode code points before the cursor to be
- * deleted. Must be non-negative.
+ *   deleted. Must be non-negative.
  * @param lengthAfterCursor The number of characters in Unicode code points after the cursor to be
- * deleted. Must be non-negative.
+ *   deleted. Must be non-negative.
  */
 internal fun EditingBuffer.deleteSurroundingTextInCodePoints(
     lengthBeforeCursor: Int,
@@ -225,11 +221,12 @@
 }
 
 /**
- * Finishes the composing text that is currently active. This simply leaves the text as-is,
- * removing any special composing styling or other state that was around it. The cursor position
- * remains unchanged.
+ * Finishes the composing text that is currently active. This simply leaves the text as-is, removing
+ * any special composing styling or other state that was around it. The cursor position remains
+ * unchanged.
  *
- * See [`finishComposingText`](https://developer.android.com/reference/android/view/inputmethod/InputConnection.html#finishComposingText()).
+ * See
+ * [`finishComposingText`](https://developer.android.com/reference/android/view/inputmethod/InputConnection.html#finishComposingText()).
  */
 internal fun EditingBuffer.finishComposingText() {
     commitComposition()
@@ -238,9 +235,9 @@
 /**
  * Represents a backspace operation at the cursor position.
  *
- * If there is composition, delete the text in the composition range.
- * If there is no composition but there is selection, delete whole selected range.
- * If there is no composition and selection, perform backspace key event at the cursor position.
+ * If there is composition, delete the text in the composition range. If there is no composition but
+ * there is selection, delete whole selected range. If there is no composition and selection,
+ * perform backspace key event at the cursor position.
  */
 internal fun EditingBuffer.backspace() {
     if (hasComposition()) {
@@ -288,16 +285,14 @@
     cursor = newCursor
 }
 
-/**
- * Deletes all the text in the buffer.
- */
+/** Deletes all the text in the buffer. */
 internal fun EditingBuffer.deleteAll() {
     replace(0, length, "")
 }
 
 /**
- * Helper function that returns true when [high] is a Unicode high-surrogate code unit and [low]
- * is a Unicode low-surrogate code unit.
+ * Helper function that returns true when [high] is a Unicode high-surrogate code unit and [low] is
+ * a Unicode low-surrogate code unit.
  */
 private fun isSurrogatePair(high: Char, low: Char): Boolean =
     high.isHighSurrogate() && low.isLowSurrogate()
diff --git a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/input/internal/EditingBuffer.kt b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/input/internal/EditingBuffer.kt
index 44bce1a..05493d4 100644
--- a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/input/internal/EditingBuffer.kt
+++ b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/input/internal/EditingBuffer.kt
@@ -26,16 +26,13 @@
  * This class manages the all editing relate states, editing buffers, selection, styles, etc.
  */
 internal class EditingBuffer(
-    /**
-     * The initial text of this editing buffer
-     */
+    /** The initial text of this editing buffer */
     text: AnnotatedString,
     /**
-     * The initial selection range of this buffer.
-     * If you provide collapsed selection, it is treated as the cursor position. The cursor and
-     * selection cannot exists at the same time.
-     * The selection must points the valid index of the initialText, otherwise
-     * IndexOutOfBoundsException will be thrown.
+     * The initial selection range of this buffer. If you provide collapsed selection, it is treated
+     * as the cursor position. The cursor and selection cannot exists at the same time. The
+     * selection must points the valid index of the initialText, otherwise IndexOutOfBoundsException
+     * will be thrown.
      */
     selection: TextRange
 ) {
@@ -47,9 +44,7 @@
 
     val changeTracker = ChangeTracker()
 
-    /**
-     * The inclusive selection start offset
-     */
+    /** The inclusive selection start offset */
     var selectionStart = selection.start
         private set(value) {
             require(value >= 0) { "Cannot set selectionStart to a negative value: $value" }
@@ -57,9 +52,7 @@
             highlight = null
         }
 
-    /**
-     * The exclusive selection end offset
-     */
+    /** The exclusive selection end offset */
     var selectionEnd = selection.end
         private set(value) {
             require(value >= 0) { "Cannot set selectionEnd to a negative value: $value" }
@@ -89,29 +82,21 @@
     var compositionEnd = NOWHERE
         private set
 
-    /**
-     * Helper function that returns true if the editing buffer has composition text
-     */
+    /** Helper function that returns true if the editing buffer has composition text */
     fun hasComposition(): Boolean = compositionStart != NOWHERE
 
-    /**
-     * Returns the composition information as TextRange. Returns null if no
-     * composition is set.
-     */
+    /** Returns the composition information as TextRange. Returns null if no composition is set. */
     val composition: TextRange?
-        get() = if (hasComposition()) {
-            TextRange(compositionStart, compositionEnd)
-        } else null
+        get() =
+            if (hasComposition()) {
+                TextRange(compositionStart, compositionEnd)
+            } else null
 
-    /**
-     * Returns the selection information as TextRange
-     */
+    /** Returns the selection information as TextRange */
     val selection: TextRange
         get() = TextRange(selectionStart, selectionEnd)
 
-    /**
-     * Helper accessor for cursor offset
-     */
+    /** Helper accessor for cursor offset */
     /*VisibleForTesting*/
     var cursor: Int
         /**
@@ -128,20 +113,14 @@
          */
         set(cursor) = setSelection(cursor, cursor)
 
-    /**
-     * [] operator for the character at the index.
-     */
+    /** [] operator for the character at the index. */
     operator fun get(index: Int): Char = gapBuffer[index]
 
-    /**
-     * Returns the length of the buffer.
-     */
-    val length: Int get() = gapBuffer.length
+    /** Returns the length of the buffer. */
+    val length: Int
+        get() = gapBuffer.length
 
-    constructor(
-        text: String,
-        selection: TextRange
-    ) : this(AnnotatedString(text), selection)
+    constructor(text: String, selection: TextRange) : this(AnnotatedString(text), selection)
 
     init {
         checkRange(selection.start, selection.end)
@@ -213,10 +192,8 @@
 
         gapBuffer.replace(deleteRange.min, deleteRange.max, "")
 
-        val newSelection = updateRangeAfterDelete(
-            TextRange(selectionStart, selectionEnd),
-            deleteRange
-        )
+        val newSelection =
+            updateRangeAfterDelete(TextRange(selectionStart, selectionEnd), deleteRange)
         selectionStart = newSelection.start
         selectionEnd = newSelection.end
 
@@ -237,8 +214,9 @@
     /**
      * Mark the specified area of the text as selected text.
      *
-     * You can set cursor by specifying the same value to `start` and `end`.
-     * The reversed range is not allowed.
+     * You can set cursor by specifying the same value to `start` and `end`. The reversed range is
+     * not allowed.
+     *
      * @param start the inclusive start offset of the selection
      * @param end the exclusive end offset of the selection
      */
@@ -270,9 +248,7 @@
         highlight = Pair(type, TextRange(clampedStart, clampedEnd))
     }
 
-    /**
-     * Clear the highlighted text range.
-     */
+    /** Clear the highlighted text range. */
     fun clearHighlight() {
         highlight = null
     }
@@ -280,15 +256,14 @@
     /**
      * Mark the specified area of the text as composition text.
      *
-     * The empty range or reversed range is not allowed.
-     * Use clearComposition in case of clearing composition.
+     * The empty range or reversed range is not allowed. Use clearComposition in case of clearing
+     * composition.
      *
      * @param start the inclusive start offset of the composition
      * @param end the exclusive end offset of the composition
-     *
      * @throws IndexOutOfBoundsException if start or end offset is ouside of current buffer
      * @throws IllegalArgumentException if start is larger than or equal to end. (reversed or
-     *                                  collapsed range)
+     *   collapsed range)
      */
     fun setComposition(start: Int, end: Int) {
         if (start < 0 || start > gapBuffer.length) {
@@ -309,9 +284,7 @@
         compositionEnd = end
     }
 
-    /**
-     * Commits the ongoing composition text and reset the composition range.
-     */
+    /** Commits the ongoing composition text and reset the composition range. */
     fun commitComposition() {
         compositionStart = NOWHERE
         compositionEnd = NOWHERE
diff --git a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/input/internal/GapBuffer.kt b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/input/internal/GapBuffer.kt
index 6f82e52..0c7fcc1 100644
--- a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/input/internal/GapBuffer.kt
+++ b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/input/internal/GapBuffer.kt
@@ -20,40 +20,28 @@
  * The gap buffer implementation
  *
  * @param initBuffer An initial buffer. This class takes ownership of this object, so do not modify
- *                   array after passing to this constructor
+ *   array after passing to this constructor
  * @param initGapStart An initial inclusive gap start offset of the buffer
  * @param initGapEnd An initial exclusive gap end offset of the buffer
  */
 private class GapBuffer(initBuffer: CharArray, initGapStart: Int, initGapEnd: Int) {
 
-    /**
-     * The current capacity of the buffer
-     */
+    /** The current capacity of the buffer */
     private var capacity = initBuffer.size
 
-    /**
-     * The buffer
-     */
+    /** The buffer */
     private var buffer = initBuffer
 
-    /**
-     * The inclusive start offset of the gap
-     */
+    /** The inclusive start offset of the gap */
     private var gapStart = initGapStart
 
-    /**
-     * The exclusive end offset of the gap
-     */
+    /** The exclusive end offset of the gap */
     private var gapEnd = initGapEnd
 
-    /**
-     * The length of the gap.
-     */
+    /** The length of the gap. */
     private fun gapLength(): Int = gapEnd - gapStart
 
-    /**
-     * [] operator for the character at the index.
-     */
+    /** [] operator for the character at the index. */
     operator fun get(index: Int): Char {
         if (index < gapStart) {
             return buffer[index]
@@ -62,9 +50,7 @@
         }
     }
 
-    /**
-     * Check if the gap has a requested size, and allocate new buffer if there is enough space.
-     */
+    /** Check if the gap has a requested size, and allocate new buffer if there is enough space. */
     private fun makeSureAvailableSpace(requestSize: Int) {
         if (requestSize <= gapLength()) {
             return
@@ -88,9 +74,7 @@
         gapEnd = newEnd
     }
 
-    /**
-     * Delete the given range of the text.
-     */
+    /** Delete the given range of the text. */
     private fun delete(start: Int, end: Int) {
         if (start < gapStart && end <= gapStart) {
             // The remove happens in the head buffer. Copy the tail part of the head buffer to the
@@ -179,6 +163,7 @@
 
     /**
      * Write the current text into outBuf.
+     *
      * @param builder The output string builder
      */
     fun append(builder: StringBuilder) {
@@ -200,9 +185,9 @@
  * An editing buffer that uses Gap Buffer only around the cursor location.
  *
  * Different from the original gap buffer, this gap buffer doesn't convert all given text into
- * mutable buffer. Instead, this gap buffer converts cursor around text into mutable gap buffer
- * for saving construction time and memory space. If text modification outside of the gap buffer
- * is requested, this class flush the buffer and create new String, then start new gap buffer.
+ * mutable buffer. Instead, this gap buffer converts cursor around text into mutable gap buffer for
+ * saving construction time and memory space. If text modification outside of the gap buffer is
+ * requested, this class flush the buffer and create new String, then start new gap buffer.
  *
  * @param text The initial text
  */
@@ -218,9 +203,7 @@
     private var bufStart = NOWHERE
     private var bufEnd = NOWHERE
 
-    /**
-     * The text length
-     */
+    /** The text length */
     override val length: Int
         get() {
             val buffer = buffer ?: return text.length
@@ -271,11 +254,12 @@
             // Copy given text into buffer
             text.toCharArray(charArray, leftCopyCount, textStart, textEnd)
 
-            this.buffer = GapBuffer(
-                charArray,
-                initGapStart = leftCopyCount + textLength,
-                initGapEnd = charArray.size - rightCopyCount
-            )
+            this.buffer =
+                GapBuffer(
+                    charArray,
+                    initGapStart = leftCopyCount + textLength,
+                    initGapEnd = charArray.size - rightCopyCount
+                )
             bufStart = start - leftCopyCount
             bufEnd = end + rightCopyCount
             return
@@ -297,9 +281,7 @@
         buffer.replace(bufferStart, bufferEnd, text, textStart, textEnd)
     }
 
-    /**
-     * [] operator for the character at the index.
-     */
+    /** [] operator for the character at the index. */
     override operator fun get(index: Int): Char {
         val buffer = buffer ?: return text[index]
         if (index < bufStart) {
@@ -324,9 +306,7 @@
         return sb.toString()
     }
 
-    /**
-     * Compares the contents of this buffer with the contents of [other].
-     */
+    /** Compares the contents of this buffer with the contents of [other]. */
     fun contentEquals(other: CharSequence): Boolean {
         return toString() == other.toString()
     }
diff --git a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/input/internal/LegacyAdaptingPlatformTextInputModifierNode.kt b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/input/internal/LegacyAdaptingPlatformTextInputModifierNode.kt
index 7249ac7..c720f424 100644
--- a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/input/internal/LegacyAdaptingPlatformTextInputModifierNode.kt
+++ b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/input/internal/LegacyAdaptingPlatformTextInputModifierNode.kt
@@ -49,11 +49,12 @@
     legacyTextFieldState: LegacyTextFieldState,
     textFieldSelectionManager: TextFieldSelectionManager
 ): Modifier =
-    this then LegacyAdaptingPlatformTextInputModifier(
-        serviceAdapter,
-        legacyTextFieldState,
-        textFieldSelectionManager
-    )
+    this then
+        LegacyAdaptingPlatformTextInputModifier(
+            serviceAdapter,
+            legacyTextFieldState,
+            textFieldSelectionManager
+        )
 
 private data class LegacyAdaptingPlatformTextInputModifier(
     val serviceAdapter: LegacyPlatformTextInputServiceAdapter,
@@ -89,7 +90,8 @@
     private var serviceAdapter: LegacyPlatformTextInputServiceAdapter,
     override var legacyTextFieldState: LegacyTextFieldState,
     override var textFieldSelectionManager: TextFieldSelectionManager
-) : Modifier.Node(),
+) :
+    Modifier.Node(),
     PlatformTextInputModifierNode,
     CompositionLocalConsumerModifierNode,
     GlobalPositionAwareModifierNode,
diff --git a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/input/internal/LegacyPlatformTextInputServiceAdapter.kt b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/input/internal/LegacyPlatformTextInputServiceAdapter.kt
index 7074e4c..dd325d1 100644
--- a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/input/internal/LegacyPlatformTextInputServiceAdapter.kt
+++ b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/input/internal/LegacyPlatformTextInputServiceAdapter.kt
@@ -34,8 +34,8 @@
  * An implementation of the legacy [PlatformTextInputService] interface that delegates to a
  * [LegacyAdaptingPlatformTextInputModifierNode].
  *
- * For this class to work, exactly one [LegacyAdaptingPlatformTextInputModifier] must be attached
- * to a layout node and passed an instance of this class. This class will only function when such a
+ * For this class to work, exactly one [LegacyAdaptingPlatformTextInputModifier] must be attached to
+ * a layout node and passed an instance of this class. This class will only function when such a
  * modifier is attached to the modifier system, otherwise many of its operations will no-op.
  *
  * Note that, contrary to the original design intent of a [PlatformTextInputService], every text
@@ -74,6 +74,7 @@
         val legacyTextFieldState: LegacyTextFieldState?
         val textFieldSelectionManager: TextFieldSelectionManager?
         val viewConfiguration: ViewConfiguration
+
         fun launchTextInputSession(block: suspend PlatformTextInputSession.() -> Nothing): Job?
     }
 }
diff --git a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/input/internal/MathUtils.kt b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/input/internal/MathUtils.kt
index d8e2f98..3e9f2e0 100644
--- a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/input/internal/MathUtils.kt
+++ b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/input/internal/MathUtils.kt
@@ -20,18 +20,14 @@
 import androidx.compose.ui.geometry.Offset
 import androidx.compose.ui.geometry.Rect
 
-/**
- * Adds [this] and [right], and if an overflow occurs returns result of [defaultValue].
- */
+/** Adds [this] and [right], and if an overflow occurs returns result of [defaultValue]. */
 internal inline fun Int.addExactOrElse(right: Int, defaultValue: () -> Int): Int {
     val result = this + right
     // HD 2-12 Overflow iff both arguments have the opposite sign of the result
     return if (this xor result and (right xor result) < 0) defaultValue() else result
 }
 
-/**
- * Subtracts [right] from [this], and if an overflow occurs returns result of [defaultValue].
- */
+/** Subtracts [right] from [this], and if an overflow occurs returns result of [defaultValue]. */
 internal inline fun Int.subtractExactOrElse(right: Int, defaultValue: () -> Int): Int {
     val result = this - right
     // HD 2-12 Overflow iff the arguments have different signs and
@@ -51,8 +47,8 @@
 }
 
 /**
- * Calculates the distance from this [Offset] to the nearest point on [rect].
- * Returns 0 if the offset is within [rect].
+ * Calculates the distance from this [Offset] to the nearest point on [rect]. Returns 0 if the
+ * offset is within [rect].
  */
 private fun Offset.distanceSquaredToClosestCornerFromOutside(rect: Rect): Float {
     if (rect.containsInclusive(this)) return 0f
diff --git a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/input/internal/OffsetMappingCalculator.kt b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/input/internal/OffsetMappingCalculator.kt
index 5d55fc5..423d93a 100644
--- a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/input/internal/OffsetMappingCalculator.kt
+++ b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/input/internal/OffsetMappingCalculator.kt
@@ -43,18 +43,16 @@
  * mapping is ambiguous because all of the offsets in the inserted text map back to the same offset
  * in the source text - the offset where the text was inserted. That means the insertion point can
  * map to any of the offsets in the inserted text. I.e. I -> I..N'
- *
- * - This is slightly different than the replacement case, because the offset of the start of
- *   the operation and the offset of the end of the operation (which are the same) map to a
- *   range instead of a scalar. This is because there is not enough information to map the start
- *   and end offsets 1-to-1 to offsets in the transformed text.
+ * - This is slightly different than the replacement case, because the offset of the start of the
+ *   operation and the offset of the end of the operation (which are the same) map to a range
+ *   instead of a scalar. This is because there is not enough information to map the start and end
+ *   offsets 1-to-1 to offsets in the transformed text.
  * - This is symmetric with deletion: Mapping backward from an insertion is the same as mapping
  *   forward from a deletion.
  *
  * ### Deletions
- * In the inverse case, when text is deleted, mapping is unambiguous. All the offsets in the
- * deleted range map to the start of the deleted range. I.e. I..N -> I
- *
+ * In the inverse case, when text is deleted, mapping is unambiguous. All the offsets in the deleted
+ * range map to the start of the deleted range. I.e. I..N -> I
  * - This is symmetric with insertion: Mapping backward from a deletion is the same as mapping
  *   forward from an insertion.
  *
@@ -64,13 +62,14 @@
  *   corresponding edges of the replaced text. I -> I and I+1 -> I+N
  * - The offsets _inside_ the replaced range (exclusive) map ambiguously to the entire replaced
  *   range. I+1..I+N-1 -> I+1..I+N'-1
- * - Note that this means that when a string with length >1 is replaced by a single character,
- *   all the offsets inside that string will map not to the index of the replacement character
- *   but to a single-char _range_ containing that character.
+ * - Note that this means that when a string with length >1 is replaced by a single character, all
+ *   the offsets inside that string will map not to the index of the replacement character but to a
+ *   single-char _range_ containing that character.
  *
  * ### Examples
  *
  * #### Inserting text
+ *
  * ```
  *     012
  * A: "ab"
@@ -82,17 +81,18 @@
  *
  * Forward mapping:
  *
- * | from A: | 0 | 1 | 2 |
- * |--------:|:-:|:-:|:-:|
- * |   to B: | 0 |1-4| 5 |
+ * | from A: | 0   | 1   | 2   |
+ * |--------:|:---:|:---:|:---:|
+ * |   to B: |  0  | 1-4 |  5  |
  *
  * Reverse mapping:
  *
- * | from B: | 0 | 1 | 2 | 3 | 4 | 5 |
- * |--------:|:-:|:-:|:-:|:-:|:-:|:-:|
- * |   to A: | 0 | 1 | 1 | 1 | 1 | 2 |
+ * | from B: | 0   | 1   | 2   | 3   | 4   | 5   |
+ * |--------:|:---:|:---:|:---:|:---:|:---:|:---:|
+ * |   to A: |  0  |  1  |  1  |  1  |  1  |  2  |
  *
  * #### Deleting text
+ *
  * ```
  *     012345
  * A: "azzzb"
@@ -104,17 +104,18 @@
  *
  * Forward mapping:
  *
- * | from A: | 0 | 1 | 2 | 3 | 4 | 5 |
- * |--------:|:-:|:-:|:-:|:-:|:-:|:-:|
- * |   to B: | 0 | 1 | 1 | 1 | 1 | 2 |
+ * | from A: | 0   | 1   | 2   | 3   | 4   | 5   |
+ * |--------:|:---:|:---:|:---:|:---:|:---:|:---:|
+ * |   to B: |  0  |  1  |  1  |  1  |  1  |  2  |
  *
  * Reverse mapping:
  *
- * | from B: | 0 | 1 | 2 |
- * |--------:|:-:|:-:|:-:|
- * |   to A: | 0 |1-4| 5 |
+ * | from B: | 0   | 1   | 2   |
+ * |--------:|:---:|:---:|:---:|
+ * |   to A: |  0  | 1-4 |  5  |
  *
  * #### Replacing text: single char with char
+ *
  * ```
  *     0123
  * A: "abc"
@@ -126,11 +127,12 @@
  *
  * Forward/reverse mapping: identity
  *
- * | from: | 0 | 1 | 2 | 3 |
- * |------:|:-:|:-:|:-:|:-:|
- * |   to: | 0 | 1 | 2 | 3 |
+ * | from: | 0   | 1   | 2   | 3   |
+ * |------:|:---:|:---:|:---:|:---:|
+ * |   to: |  0  |  1  |  2  |  3  |
  *
  * #### Replacing text: char with chars
+ *
  * ```
  *     0123
  * A: "abc"
@@ -142,17 +144,18 @@
  *
  * Forward mapping:
  *
- * | from A: | 0 | 1 | 2 | 3 |
- * |--------:|:-:|:-:|:-:|:-:|
- * |   to B: | 0 | 1 | 3 | 4 |
+ * | from A: | 0   | 1   | 2   | 3   |
+ * |--------:|:---:|:---:|:---:|:---:|
+ * |   to B: |  0  |  1  |  3  |  4  |
  *
  * Reverse mapping:
  *
- * | from B: | 0 | 1 | 2 | 3 | 4 |
- * |--------:|:-:|:-:|:-:|:-:|:-:|
- * |   to A: | 0 | 1 | 1 | 2 | 3 |
+ * | from B: | 0   | 1   | 2   | 3   | 4   |
+ * |--------:|:---:|:---:|:---:|:---:|:---:|
+ * |   to A: |  0  |  1  |  1  |  2  |  3  |
  *
  * #### Replacing text: chars with chars
+ *
  * ```
  *     012345
  * A: "abcde"
@@ -164,23 +167,23 @@
  *
  * Forward mapping:
  *
- * | from A: | 0 | 1 | 2 | 3 | 4 | 5 |
- * |--------:|:-:|:-:|:-:|:-:|:-:|:-:|
- * |   to B: | 0 | 1 |1-3|1-3| 3 | 4 |
+ * | from A: | 0   | 1   | 2   | 3   | 4   | 5   |
+ * |--------:|:---:|:---:|:---:|:---:|:---:|:---:|
+ * |   to B: |  0  |  1  | 1-3 | 1-3 |  3  |  4  |
  *
  * Reverse mapping:
  *
- * | from B: | 0 | 1 | 2 | 3 | 4 |
- * |--------:|:-:|:-:|:-:|:-:|:-:|
- * |   to A: | 0 | 1 |1-4| 4 | 5 |
+ * | from B: | 0   | 1   | 2   | 3   | 4   |
+ * |--------:|:---:|:---:|:---:|:---:|:---:|
+ * |   to A: |  0  |  1  | 1-4 |  4  |  5  |
  *
  * ### Multiple operations
  *
  * While the above apply to single edit operations, when multiple edit operations are recorded the
  * same rules apply. The rules are applied to the first operation, then the result of that is
  * effectively used as the input text for the next operation, etc. Because an offset can map to a
- * range at each step, we track both a start and end offset (which start as the same value), and
- * at each step combine the start and end _ranges_ by taking their union.
+ * range at each step, we track both a start and end offset (which start as the same value), and at
+ * each step combine the start and end _ranges_ by taking their union.
  *
  * #### Multiple char-to-char replacements (codepoint transformation):
  * ```
@@ -197,9 +200,9 @@
  *
  * Forward/reverse mapping: identity
  *
- * | from: | 0 | 1 | 2 | 3 |
- * |------:|:-:|:-:|:-:|:-:|
- * |   to: | 0 | 1 | 2 | 3 |
+ * | from: | 0   | 1   | 2   | 3   |
+ * |------:|:---:|:---:|:---:|:---:|
+ * |   to: |  0  |  1  |  2  |  3  |
  *
  * #### Multiple inserts:
  * ```
@@ -214,15 +217,15 @@
  *
  * Forward mapping:
  *
- * | from A: | 0 | 1 | 2 | 3 | 4 |
- * |--------:|:-:|:-:|:-:|:-:|:-:|
- * |   to B: | 0 |1-2| 3 |4-5| 6 |
+ * | from A: | 0   | 1   | 2   | 3   | 4   |
+ * |--------:|:---:|:---:|:---:|:---:|:---:|
+ * |   to B: |  0  | 1-2 |  3  | 4-5 |  6  |
  *
  * Reverse mapping:
  *
- * | from B: | 0 | 1 | 2 | 3 | 4 | 5 | 6 |
- * |--------:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|
- * |   to A: | 0 | 1 | 1 | 2 | 3 | 3 | 4 |
+ * | from B: | 0   | 1   | 2   | 3   | 4   | 5   | 6   |
+ * |--------:|:---:|:---:|:---:|:---:|:---:|:---:|:---:|
+ * |   to A: |  0  |  1  |  1  |  2  |  3  |  3  |  4  |
  *
  * #### Multiple replacements of the same range:
  * ```
@@ -237,15 +240,15 @@
  *
  * Forward mapping:
  *
- * | from A: | 0 | 1 | 2 | 3 | 4 |
- * |--------:|:-:|:-:|:-:|:-:|:-:|
- * |   to B: | 0 | 1 |1-3| 3 | 4 |
+ * | from A: | 0   | 1   | 2   | 3   | 4   |
+ * |--------:|:---:|:---:|:---:|:---:|:---:|
+ * |   to B: |  0  |  1  | 1-3 |  3  |  4  |
  *
  * Reverse mapping:
  *
- * | from B: | 0 | 1 | 2 | 3 | 4 |
- * |--------:|:-:|:-:|:-:|:-:|:-:|
- * |   to A: | 0 | 1 |1-3| 3 | 4 |
+ * | from B: | 0   | 1   | 2   | 3   | 4   |
+ * |--------:|:---:|:---:|:---:|:---:|:---:|
+ * |   to A: |  0  |  1  | 1-3 |  3  |  4  |
  *
  * For other edge cases, including overlapping replacements, see `OffsetMappingCalculatorTest`.
  */
@@ -278,14 +281,14 @@
     }
 
     /**
-     * Maps an [offset] in the original string to the corresponding offset, or range of offsets,
-     * in the transformed string.
+     * Maps an [offset] in the original string to the corresponding offset, or range of offsets, in
+     * the transformed string.
      */
     fun mapFromSource(offset: Int): TextRange = map(offset, fromSource = true)
 
     /**
-     * Maps an [offset] in the original string to the corresponding offset, or range of offsets,
-     * in the transformed string.
+     * Maps an [offset] in the original string to the corresponding offset, or range of offsets, in
+     * the transformed string.
      */
     fun mapFromDest(offset: Int): TextRange = map(offset, fromSource = false)
 
@@ -296,20 +299,22 @@
         // This algorithm works for both forward and reverse mapping, we just need to iterate
         // backwards to do reverse mapping.
         ops.forEach(max = opsSize, reversed = !fromSource) { opOffset, opSrcLen, opDestLen ->
-            val newStart = mapStep(
-                offset = start,
-                opOffset = opOffset,
-                untransformedLen = opSrcLen,
-                transformedLen = opDestLen,
-                fromSource = fromSource
-            )
-            val newEnd = mapStep(
-                offset = end,
-                opOffset = opOffset,
-                untransformedLen = opSrcLen,
-                transformedLen = opDestLen,
-                fromSource = fromSource
-            )
+            val newStart =
+                mapStep(
+                    offset = start,
+                    opOffset = opOffset,
+                    untransformedLen = opSrcLen,
+                    transformedLen = opDestLen,
+                    fromSource = fromSource
+                )
+            val newEnd =
+                mapStep(
+                    offset = end,
+                    opOffset = opOffset,
+                    untransformedLen = opSrcLen,
+                    transformedLen = opDestLen,
+                    fromSource = fromSource
+                )
             // range = newStart ∪ newEnd
             // Note we don't read TextRange.min/max here because the above code always returns
             // normalized ranges. It's no less correct, but there's no need to do the additional
@@ -333,7 +338,6 @@
         return when {
             // Before the operation, no change.
             offset < opOffset -> TextRange(offset)
-
             offset == opOffset -> {
                 if (srcLen == 0) {
                     // On insertion point, map to inserted range.
@@ -343,7 +347,6 @@
                     TextRange(opOffset)
                 }
             }
-
             offset < opOffset + srcLen -> {
                 if (destLen == 0) {
                     // In deleted range, map to start of deleted range.
@@ -368,7 +371,8 @@
 private value class OpArray private constructor(private val values: IntArray) {
     constructor(size: Int) : this(IntArray(size * ElementSize))
 
-    val size: Int get() = values.size / ElementSize
+    val size: Int
+        get() = values.size / ElementSize
 
     fun set(index: Int, offset: Int, srcLen: Int, destLen: Int) {
         values[index * ElementSize] = offset
diff --git a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/input/internal/TextFieldCoreModifier.kt b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/input/internal/TextFieldCoreModifier.kt
index dcfb62f..93b79e60 100644
--- a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/input/internal/TextFieldCoreModifier.kt
+++ b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/input/internal/TextFieldCoreModifier.kt
@@ -69,9 +69,9 @@
 import kotlinx.coroutines.launch
 
 /**
- * Modifier element for the core functionality of [BasicTextField] that is passed as inner
- * TextField to the decoration box. This is only half the actual modifiers for the field, the other
- * half are only attached to the decorated text field.
+ * Modifier element for the core functionality of [BasicTextField] that is passed as inner TextField
+ * to the decoration box. This is only half the actual modifiers for the field, the other half are
+ * only attached to the decorated text field.
  *
  * This modifier mostly handles layout and draw.
  */
@@ -87,17 +87,18 @@
     private val orientation: Orientation,
 ) : ModifierNodeElement<TextFieldCoreModifierNode>() {
 
-    override fun create(): TextFieldCoreModifierNode = TextFieldCoreModifierNode(
-        isFocused = isFocused,
-        isDragHovered = isDragHovered,
-        textLayoutState = textLayoutState,
-        textFieldState = textFieldState,
-        textFieldSelectionState = textFieldSelectionState,
-        cursorBrush = cursorBrush,
-        writeable = writeable,
-        scrollState = scrollState,
-        orientation = orientation,
-    )
+    override fun create(): TextFieldCoreModifierNode =
+        TextFieldCoreModifierNode(
+            isFocused = isFocused,
+            isDragHovered = isDragHovered,
+            textLayoutState = textLayoutState,
+            textFieldState = textFieldState,
+            textFieldSelectionState = textFieldSelectionState,
+            cursorBrush = cursorBrush,
+            writeable = writeable,
+            scrollState = scrollState,
+            orientation = orientation,
+        )
 
     override fun update(node: TextFieldCoreModifierNode) {
         node.updateNode(
@@ -131,7 +132,8 @@
     private var writeable: Boolean,
     private var scrollState: ScrollState,
     private var orientation: Orientation,
-) : DelegatingNode(),
+) :
+    DelegatingNode(),
     LayoutModifierNode,
     DrawModifierNode,
     CompositionLocalConsumerModifierNode,
@@ -140,8 +142,8 @@
 
     /**
      * Animatable object for cursor's alpha value. It becomes 1f for half a second and 0f for
-     * another half a second when TextField is focused and editable. Initial value should be 0f
-     * so that when cursor needs to be drawn for the first time, change to 1f invalidates draw.
+     * another half a second when TextField is focused and editable. Initial value should be 0f so
+     * that when cursor needs to be drawn for the first time, change to 1f invalidates draw.
      */
     private val cursorAnimation = CursorAnimationState()
 
@@ -163,26 +165,27 @@
      * happens, ideally we would want to scroll the TextField to keep the changing handle in the
      * visible area. The following member variables keep track of the latest selection and cursor
      * positions that we have adjusted for. When we detect a change to both of them during the
-     * layout phase, ScrollState gets adjusted.
-     * The same is also true when text layout size changes. For example when a new line is entered
-     * that makes the decoration box bigger, this first triggers a cursor change without updating
-     * the layout values. In this case we cannot scroll to the new line because we don't know the
-     * new size. Immediately after, the new layout size is reported but as far as we know, we
-     * already reacted to the cursor change so we shouldn't scroll. Thus, it also makes sense to
-     * check whether layout size is changed between calls to bring cursor into view.
+     * layout phase, ScrollState gets adjusted. The same is also true when text layout size changes.
+     * For example when a new line is entered that makes the decoration box bigger, this first
+     * triggers a cursor change without updating the layout values. In this case we cannot scroll to
+     * the new line because we don't know the new size. Immediately after, the new layout size is
+     * reported but as far as we know, we already reacted to the cursor change so we shouldn't
+     * scroll. Thus, it also makes sense to check whether layout size is changed between calls to
+     * bring cursor into view.
      */
     private var previousSelection: TextRange? = null
     private var previousCursorRect: Rect = Rect(-1f, -1f, -1f, -1f)
     private var previousTextLayoutSize: Int = 0
 
-    private val textFieldMagnifierNode = delegate(
-        textFieldMagnifierNode(
-            textFieldState = textFieldState,
-            textFieldSelectionState = textFieldSelectionState,
-            textLayoutState = textLayoutState,
-            visible = isFocused || isDragHovered
+    private val textFieldMagnifierNode =
+        delegate(
+            textFieldMagnifierNode(
+                textFieldState = textFieldState,
+                textFieldSelectionState = textFieldSelectionState,
+                textLayoutState = textLayoutState,
+                visible = isFocused || isDragHovered
+            )
         )
-    )
 
     override fun onAttach() {
         // if the attributes are right during onAttach, start the cursor job immediately.
@@ -193,9 +196,7 @@
         }
     }
 
-    /**
-     * Updates all the related properties and invalidates internal state based on the changes.
-     */
+    /** Updates all the related properties and invalidates internal state based on the changes. */
     fun updateNode(
         isFocused: Boolean,
         isDragHovered: Boolean,
@@ -235,31 +236,28 @@
             changeObserverJob?.cancel()
             changeObserverJob = null
             cursorAnimation.cancelAndHide()
-        } else if (!wasFocused ||
-            previousTextFieldState != textFieldState ||
-            !previousShowCursor
-        ) {
+        } else if (!wasFocused || previousTextFieldState != textFieldState || !previousShowCursor) {
             // this node is writeable, focused and gained that focus just now.
             // start the state value observation
             startCursorJob()
         }
 
-        if (previousTextFieldState != textFieldState ||
-            previousTextLayoutState != textLayoutState ||
-            previousTextFieldSelectionState != textFieldSelectionState ||
-            previousScrollState != scrollState) {
+        if (
+            previousTextFieldState != textFieldState ||
+                previousTextLayoutState != textLayoutState ||
+                previousTextFieldSelectionState != textFieldSelectionState ||
+                previousScrollState != scrollState
+        ) {
             invalidateMeasurement()
         }
     }
 
-    override fun MeasureScope.measure(
-        measurable: Measurable,
-        constraints: Constraints
-    ) = if (orientation == Orientation.Vertical) {
-        measureVerticalScroll(measurable, constraints)
-    } else {
-        measureHorizontalScroll(measurable, constraints)
-    }
+    override fun MeasureScope.measure(measurable: Measurable, constraints: Constraints) =
+        if (orientation == Orientation.Vertical) {
+            measureVerticalScroll(measurable, constraints)
+        } else {
+            measureHorizontalScroll(measurable, constraints)
+        }
 
     override fun ContentDrawScope.draw() {
         drawContent()
@@ -328,13 +326,8 @@
         }
     }
 
-    /**
-     * Returns which offset to follow to bring into view.
-     */
-    private fun calculateOffsetToFollow(
-        currSelection: TextRange,
-        currTextLayoutSize: Int
-    ): Int {
+    /** Returns which offset to follow to bring into view. */
+    private fun calculateOffsetToFollow(currSelection: TextRange, currTextLayoutSize: Int): Int {
         return when {
             currSelection.end != previousSelection?.end -> currSelection.end
             currSelection.start != previousSelection?.start -> currSelection.start
@@ -348,11 +341,11 @@
      * layout changes. Only scroll changes won't trigger this.
      *
      * @param containerSize Either height or width of scrollable host, depending on scroll
-     * orientation.
+     *   orientation.
      * @param textLayoutSize Either height or width of scrollable text field content, depending on
-     * scroll orientation.
+     *   scroll orientation.
      * @param currSelection The current selection to cache if this function ends up scrolling to
-     * bring the cursor or selection into view.
+     *   bring the cursor or selection into view.
      */
     private fun Density.updateScrollState(
         containerSize: Int,
@@ -372,70 +365,76 @@
 
         val layoutResult = textLayoutState.layoutResult ?: return
 
-        val rawCursorRect = layoutResult.getCursorRect(
-            offsetToFollow.coerceIn(0..layoutResult.layoutInput.text.length)
-        )
-        val cursorRect = getCursorRectInScroller(
-            cursorRect = rawCursorRect,
-            rtl = layoutDirection == LayoutDirection.Rtl,
-            textLayoutSize = textLayoutSize
-        )
+        val rawCursorRect =
+            layoutResult.getCursorRect(
+                offsetToFollow.coerceIn(0..layoutResult.layoutInput.text.length)
+            )
+        val cursorRect =
+            getCursorRectInScroller(
+                cursorRect = rawCursorRect,
+                rtl = layoutDirection == LayoutDirection.Rtl,
+                textLayoutSize = textLayoutSize
+            )
 
         // Check if cursor's location or text layout size was changed compared to the previous run.
-        if (cursorRect.left != previousCursorRect.left ||
-            cursorRect.top != previousCursorRect.top ||
-            textLayoutSize != previousTextLayoutSize) {
+        if (
+            cursorRect.left != previousCursorRect.left ||
+                cursorRect.top != previousCursorRect.top ||
+                textLayoutSize != previousTextLayoutSize
+        ) {
             val vertical = orientation == Orientation.Vertical
             val cursorStart = if (vertical) cursorRect.top else cursorRect.left
             val cursorEnd = if (vertical) cursorRect.bottom else cursorRect.right
 
             val startVisibleBound = scrollState.value
             val endVisibleBound = startVisibleBound + containerSize
-            val offsetDifference = when {
-                // make bottom/end of the cursor visible
-                //
-                // text box
-                // +----------------------+
-                // |                      |
-                // |                      |
-                // |          cursor      |
-                // |             |        |
-                // +-------------|--------+
-                //               |
-                //
-                cursorEnd > endVisibleBound -> cursorEnd - endVisibleBound
+            val offsetDifference =
+                when {
+                    // make bottom/end of the cursor visible
+                    //
+                    // text box
+                    // +----------------------+
+                    // |                      |
+                    // |                      |
+                    // |          cursor      |
+                    // |             |        |
+                    // +-------------|--------+
+                    //               |
+                    //
+                    cursorEnd > endVisibleBound -> cursorEnd - endVisibleBound
 
-                // in rare cases when there's not enough space to fit the whole cursor, prioritise
-                // the bottom/end of the cursor
-                //
-                //             cursor
-                // text box      |
-                // +-------------|--------+
-                // |             |        |
-                // +-------------|--------+
-                //               |
-                //
-                cursorStart < startVisibleBound && cursorEnd - cursorStart > containerSize ->
-                    cursorEnd - endVisibleBound
+                    // in rare cases when there's not enough space to fit the whole cursor,
+                    // prioritise
+                    // the bottom/end of the cursor
+                    //
+                    //             cursor
+                    // text box      |
+                    // +-------------|--------+
+                    // |             |        |
+                    // +-------------|--------+
+                    //               |
+                    //
+                    cursorStart < startVisibleBound && cursorEnd - cursorStart > containerSize ->
+                        cursorEnd - endVisibleBound
 
-                // make top/start of the cursor visible if there's enough space to fit the whole
-                // cursor
-                //
-                //               cursor
-                // text box       |
-                // +--------------|-------+
-                // |              |       |
-                // |                      |
-                // |                      |
-                // |                      |
-                // +----------------------+
-                //
-                cursorStart < startVisibleBound && cursorEnd - cursorStart <= containerSize ->
-                    cursorStart - startVisibleBound
+                    // make top/start of the cursor visible if there's enough space to fit the whole
+                    // cursor
+                    //
+                    //               cursor
+                    // text box       |
+                    // +--------------|-------+
+                    // |              |       |
+                    // |                      |
+                    // |                      |
+                    // |                      |
+                    // +----------------------+
+                    //
+                    cursorStart < startVisibleBound && cursorEnd - cursorStart <= containerSize ->
+                        cursorStart - startVisibleBound
 
-                // otherwise keep current offset
-                else -> 0f
-            }
+                    // otherwise keep current offset
+                    else -> 0f
+                }
 
             previousSelection = currSelection
             previousCursorRect = cursorRect
@@ -453,18 +452,12 @@
         }
     }
 
-    /**
-     * Draws the selection highlight.
-     */
-    private fun DrawScope.drawSelection(
-        selection: TextRange,
-        textLayoutResult: TextLayoutResult
-    ) {
+    /** Draws the selection highlight. */
+    private fun DrawScope.drawSelection(selection: TextRange, textLayoutResult: TextLayoutResult) {
         val start = selection.min
         val end = selection.max
         if (start != end) {
-            val selectionBackgroundColor = currentValueOf(LocalTextSelectionColors)
-                .backgroundColor
+            val selectionBackgroundColor = currentValueOf(LocalTextSelectionColors).backgroundColor
             val selectionPath = textLayoutResult.getPathForRange(start, end)
             drawPath(selectionPath, color = selectionBackgroundColor)
         }
@@ -487,27 +480,21 @@
             if (brush != null) {
                 drawPath(highlightPath, brush = brush, alpha = 0.2f)
             } else {
-                val textColor =
-                    textLayoutResult.layoutInput.style.color.takeOrElse { Color.Black }
+                val textColor = textLayoutResult.layoutInput.style.color.takeOrElse { Color.Black }
                 val highlightBackgroundColor = textColor.copy(alpha = textColor.alpha * 0.2f)
                 drawPath(highlightPath, color = highlightBackgroundColor)
             }
         } else {
             // The handwriting select gesture preview highlight should be the same color as the
             // regular select highlight.
-            val highlightBackgroundColor =
-                currentValueOf(LocalTextSelectionColors).backgroundColor
+            val highlightBackgroundColor = currentValueOf(LocalTextSelectionColors).backgroundColor
             drawPath(highlightPath, color = highlightBackgroundColor)
         }
     }
 
-    /**
-     * Draws the text content.
-     */
+    /** Draws the text content. */
     private fun DrawScope.drawText(textLayoutResult: TextLayoutResult) {
-        drawIntoCanvas { canvas ->
-            TextPainter.paint(canvas, textLayoutResult)
-        }
+        drawIntoCanvas { canvas -> TextPainter.paint(canvas, textLayoutResult) }
     }
 
     /**
@@ -533,39 +520,43 @@
     }
 
     /**
-     * Starts a job in this node's [coroutineScope] that infinitely toggles cursor's visibility
-     * as long as the window is focused. The job also restarts whenever the text changes so that
-     * cursor visibility snaps back to "visible".
+     * Starts a job in this node's [coroutineScope] that infinitely toggles cursor's visibility as
+     * long as the window is focused. The job also restarts whenever the text changes so that cursor
+     * visibility snaps back to "visible".
      */
     private fun startCursorJob() {
-        changeObserverJob = coroutineScope.launch {
-            // A flag to oscillate the reported isWindowFocused value in snapshotFlow.
-            // Repeatedly returning true/false everytime snapshotFlow is re-evaluated breaks
-            // the assumption that each re-evaluation would also trigger the collector. However,
-            // snapshotFlow carries an implicit `distinctUntilChanged` logic that prevents
-            // the propagation of update events. Instead we introduce a sign that changes each
-            // time snapshotFlow is re-entered. true/false becomes 1/2 or -1/-2.
-            // true = 1 = -1
-            // false = 2 = -2
-            // sign is either 1 or -1
-            var sign = 1
-            snapshotFlow {
-                // Read the text state, so the animation restarts when the text or cursor
-                // position change.
-                textFieldState.visualText
-                // Only animate the cursor when its window is actually focused. This also
-                // disables the cursor animation when the screen is off.
-                // TODO: b/335668644, snapshotFlow is invoking this block even after the coroutine
-                // has been cancelled, and currentCoroutineContext().isActive is false
-                val isWindowFocused = isAttached && currentValueOf(LocalWindowInfo).isWindowFocused
+        changeObserverJob =
+            coroutineScope.launch {
+                // A flag to oscillate the reported isWindowFocused value in snapshotFlow.
+                // Repeatedly returning true/false everytime snapshotFlow is re-evaluated breaks
+                // the assumption that each re-evaluation would also trigger the collector. However,
+                // snapshotFlow carries an implicit `distinctUntilChanged` logic that prevents
+                // the propagation of update events. Instead we introduce a sign that changes each
+                // time snapshotFlow is re-entered. true/false becomes 1/2 or -1/-2.
+                // true = 1 = -1
+                // false = 2 = -2
+                // sign is either 1 or -1
+                var sign = 1
+                snapshotFlow {
+                        // Read the text state, so the animation restarts when the text or cursor
+                        // position change.
+                        textFieldState.visualText
+                        // Only animate the cursor when its window is actually focused. This also
+                        // disables the cursor animation when the screen is off.
+                        // TODO: b/335668644, snapshotFlow is invoking this block even after the
+                        // coroutine
+                        // has been cancelled, and currentCoroutineContext().isActive is false
+                        val isWindowFocused =
+                            isAttached && currentValueOf(LocalWindowInfo).isWindowFocused
 
-                ((if (isWindowFocused) 1 else 2) * sign).also { sign *= -1 }
-            }.collectLatest { isWindowFocused ->
-                if (isWindowFocused.absoluteValue == 1) {
-                    cursorAnimation.snapToVisibleAndAnimate()
-                }
+                        ((if (isWindowFocused) 1 else 2) * sign).also { sign *= -1 }
+                    }
+                    .collectLatest { isWindowFocused ->
+                        if (isWindowFocused.absoluteValue == 1) {
+                            cursorAnimation.snapToVisibleAndAnimate()
+                        }
+                    }
             }
-        }
     }
 
     override fun onGloballyPositioned(coordinates: LayoutCoordinates) {
@@ -580,9 +571,7 @@
 
 private val DefaultCursorThickness = 2.dp
 
-/**
- * If brush has a specified color. It's possible that [SolidColor] contains [Color.Unspecified].
- */
+/** If brush has a specified color. It's possible that [SolidColor] contains [Color.Unspecified]. */
 private val Brush.isSpecified: Boolean
     get() = !(this is SolidColor && this.value.isUnspecified)
 
@@ -601,17 +590,19 @@
 ): Rect {
     val thickness = DefaultCursorThickness.roundToPx()
 
-    val cursorLeft = if (rtl) {
-        textLayoutSize - cursorRect.right
-    } else {
-        cursorRect.left
-    }
+    val cursorLeft =
+        if (rtl) {
+            textLayoutSize - cursorRect.right
+        } else {
+            cursorRect.left
+        }
 
-    val cursorRight = if (rtl) {
-        textLayoutSize - cursorRect.right + thickness
-    } else {
-        cursorRect.left + thickness
-    }
+    val cursorRight =
+        if (rtl) {
+            textLayoutSize - cursorRect.right + thickness
+        } else {
+            cursorRect.left + thickness
+        }
     return cursorRect.copy(left = cursorLeft, right = cursorRight)
 }
 
@@ -619,8 +610,9 @@
  * Rounds a negative number to floor, and a positive number to ceil. This is essentially the
  * opposite of [truncate].
  */
-private fun Float.roundToNext(): Float = when {
-    this.isNaN() || this.isInfinite() -> this
-    this > 0 -> ceil(this)
-    else -> floor(this)
-}
+private fun Float.roundToNext(): Float =
+    when {
+        this.isNaN() || this.isInfinite() -> this
+        this > 0 -> ceil(this)
+        else -> floor(this)
+    }
diff --git a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/input/internal/TextFieldDecoratorModifier.kt b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/input/internal/TextFieldDecoratorModifier.kt
index 4db0a15..b04ca8d 100644
--- a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/input/internal/TextFieldDecoratorModifier.kt
+++ b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/input/internal/TextFieldDecoratorModifier.kt
@@ -99,11 +99,9 @@
 import kotlinx.coroutines.flow.MutableSharedFlow
 import kotlinx.coroutines.launch
 
-@OptIn(ExperimentalFoundationApi::class)
-private val MediaTypesText = setOf(MediaType.Text)
+@OptIn(ExperimentalFoundationApi::class) private val MediaTypesText = setOf(MediaType.Text)
 
-@OptIn(ExperimentalFoundationApi::class)
-private val MediaTypesAll = setOf(MediaType.All)
+@OptIn(ExperimentalFoundationApi::class) private val MediaTypesAll = setOf(MediaType.All)
 
 /**
  * Modifier element for most of the functionality of [BasicTextField] that is attached to the
@@ -124,18 +122,19 @@
     private val singleLine: Boolean,
     private val interactionSource: MutableInteractionSource
 ) : ModifierNodeElement<TextFieldDecoratorModifierNode>() {
-    override fun create(): TextFieldDecoratorModifierNode = TextFieldDecoratorModifierNode(
-        textFieldState = textFieldState,
-        textLayoutState = textLayoutState,
-        textFieldSelectionState = textFieldSelectionState,
-        filter = filter,
-        enabled = enabled,
-        readOnly = readOnly,
-        keyboardOptions = keyboardOptions,
-        keyboardActionHandler = keyboardActionHandler,
-        singleLine = singleLine,
-        interactionSource = interactionSource,
-    )
+    override fun create(): TextFieldDecoratorModifierNode =
+        TextFieldDecoratorModifierNode(
+            textFieldState = textFieldState,
+            textLayoutState = textLayoutState,
+            textFieldSelectionState = textFieldSelectionState,
+            filter = filter,
+            enabled = enabled,
+            readOnly = readOnly,
+            keyboardOptions = keyboardOptions,
+            keyboardActionHandler = keyboardActionHandler,
+            singleLine = singleLine,
+            interactionSource = interactionSource,
+        )
 
     override fun update(node: TextFieldDecoratorModifierNode) {
         node.updateNode(
@@ -170,7 +169,8 @@
     var keyboardActionHandler: KeyboardActionHandler?,
     var singleLine: Boolean,
     var interactionSource: MutableInteractionSource
-) : DelegatingNode(),
+) :
+    DelegatingNode(),
     PlatformTextInputModifierNode,
     SemanticsModifierNode,
     FocusRequesterModifierNode,
@@ -183,7 +183,8 @@
     ObserverModifierNode,
     LayoutAwareModifierNode {
 
-    private val editable get() = enabled && !readOnly
+    private val editable
+        get() = enabled && !readOnly
 
     private var backingStylusHandwritingTrigger: MutableSharedFlow<Unit>? = null
     private val stylusHandwritingTrigger: MutableSharedFlow<Unit>?
@@ -192,155 +193,157 @@
             if (finalStylusHandwritingTrigger != null) return finalStylusHandwritingTrigger
             if (!isStylusHandwritingSupported) return null
             return MutableSharedFlow<Unit>(
-                replay = 1,
-                onBufferOverflow = BufferOverflow.DROP_LATEST
-            ).also { backingStylusHandwritingTrigger = it }
+                    replay = 1,
+                    onBufferOverflow = BufferOverflow.DROP_LATEST
+                )
+                .also { backingStylusHandwritingTrigger = it }
         }
 
-    private val pointerInputNode = delegate(SuspendingPointerInputModifierNode {
-        coroutineScope {
-            with(textFieldSelectionState) {
-                val requestFocus = {
-                    if (!isFocused) requestFocus()
-                }
+    private val pointerInputNode =
+        delegate(
+            SuspendingPointerInputModifierNode {
+                coroutineScope {
+                    with(textFieldSelectionState) {
+                        val requestFocus = { if (!isFocused) requestFocus() }
 
-                launch(start = CoroutineStart.UNDISPATCHED) {
-                    detectTouchMode()
-                }
-                launch(start = CoroutineStart.UNDISPATCHED) {
-                    detectTextFieldTapGestures(
-                        requestFocus = requestFocus,
-                        showKeyboard = {
-                            if (inputSessionJob != null) {
-                                // just reshow the keyboard in existing session
-                                requireKeyboardController().show()
-                            } else {
-                                startInputSession(fromTap = true)
-                            }
-                        },
-                        interactionSource = interactionSource
-                    )
-                }
-                launch(start = CoroutineStart.UNDISPATCHED) {
-                    textFieldSelectionGestures(requestFocus)
+                        launch(start = CoroutineStart.UNDISPATCHED) { detectTouchMode() }
+                        launch(start = CoroutineStart.UNDISPATCHED) {
+                            detectTextFieldTapGestures(
+                                requestFocus = requestFocus,
+                                showKeyboard = {
+                                    if (inputSessionJob != null) {
+                                        // just reshow the keyboard in existing session
+                                        requireKeyboardController().show()
+                                    } else {
+                                        startInputSession(fromTap = true)
+                                    }
+                                },
+                                interactionSource = interactionSource
+                            )
+                        }
+                        launch(start = CoroutineStart.UNDISPATCHED) {
+                            textFieldSelectionGestures(requestFocus)
+                        }
+                    }
                 }
             }
-        }
-    })
+        )
 
-    private val stylusHandwritingNode = delegate(StylusHandwritingNode {
-        if (!isFocused) {
-            requestFocus()
-        }
+    private val stylusHandwritingNode =
+        delegate(
+            StylusHandwritingNode {
+                if (!isFocused) {
+                    requestFocus()
+                }
 
-        // If this is a password field, we can't trigger handwriting.
-        // The expected behavior is 1) request focus 2) show software keyboard.
-        // Note: TextField will show software keyboard automatically when it
-        // gain focus. 3) show a toast message telling that handwriting is not
-        // supported for password fields. TODO(b/335294152)
-        if (keyboardOptions.keyboardType != KeyboardType.Password &&
-            keyboardOptions.keyboardType != KeyboardType.NumberPassword
-        ) {
-            // Send the handwriting start signal to platform.
-            // The editor should send the signal when it is focused or is about
-            // to gain focus, Here are more details:
-            //   1) if the editor already has an active input session, the
-            //   platform handwriting service should already listen to this flow
-            //   and it'll start handwriting right away.
-            //
-            //   2) if the editor is not focused, but it'll be focused and
-            //   create a new input session, one handwriting signal will be
-            //   replayed when the platform collect this flow. And the platform
-            //   should trigger handwriting accordingly.
-            stylusHandwritingTrigger?.tryEmit(Unit)
-        }
-        return@StylusHandwritingNode true
-    })
+                // If this is a password field, we can't trigger handwriting.
+                // The expected behavior is 1) request focus 2) show software keyboard.
+                // Note: TextField will show software keyboard automatically when it
+                // gain focus. 3) show a toast message telling that handwriting is not
+                // supported for password fields. TODO(b/335294152)
+                if (
+                    keyboardOptions.keyboardType != KeyboardType.Password &&
+                        keyboardOptions.keyboardType != KeyboardType.NumberPassword
+                ) {
+                    // Send the handwriting start signal to platform.
+                    // The editor should send the signal when it is focused or is about
+                    // to gain focus, Here are more details:
+                    //   1) if the editor already has an active input session, the
+                    //   platform handwriting service should already listen to this flow
+                    //   and it'll start handwriting right away.
+                    //
+                    //   2) if the editor is not focused, but it'll be focused and
+                    //   create a new input session, one handwriting signal will be
+                    //   replayed when the platform collect this flow. And the platform
+                    //   should trigger handwriting accordingly.
+                    stylusHandwritingTrigger?.tryEmit(Unit)
+                }
+                return@StylusHandwritingNode true
+            }
+        )
 
     /**
      * The last enter event that was submitted to [interactionSource] from [dragAndDropNode]. We
      * need to keep a reference to this event to send a follow-up exit event.
      *
      * We are using interaction source hover state as a hacky capsule to carry dragging events to
-     * core modifier node which draws the cursor and shows the magnifier. TextFields are not
-     * really focused when a dragging text hovers over them. Focused TextFields should have active
-     * input connections that is not required in a drag and drop scenario.
+     * core modifier node which draws the cursor and shows the magnifier. TextFields are not really
+     * focused when a dragging text hovers over them. Focused TextFields should have active input
+     * connections that is not required in a drag and drop scenario.
      *
      * When proper hover events are implemented for [interactionSource], the below code in
      * [dragAndDropNode] should be revised.
      */
     private var dragEnterEvent: HoverInteraction.Enter? = null
 
-    /**
-     * Special Drag and Drop node for BasicTextField that is also aware of `receiveContent` API.
-     */
-    private val dragAndDropNode = delegate(
-        textFieldDragAndDropNode(
-            hintMediaTypes = {
-                val receiveContentConfiguration = getReceiveContentConfiguration()
-                // if ReceiveContentConfiguration is set, all drag events should be accepted.
-                // ContentReceiver handler should evaluate the incoming content.
-                if (receiveContentConfiguration != null) {
-                    MediaTypesAll
-                } else {
-                    MediaTypesText
-                }
-            },
-            dragAndDropRequestPermission = {
-                if (getReceiveContentConfiguration() != null) {
-                    dragAndDropRequestPermission(it)
-                }
-            },
-            onEntered = {
-                dragEnterEvent = HoverInteraction.Enter().also {
-                    interactionSource.tryEmit(it)
-                }
-                // Although BasicTextField itself is not a `receiveContent` node, it should
-                // behave like one. Delegate the enter event to the ancestor nodes just like
-                // `receiveContent` itself would.
-                getReceiveContentConfiguration()?.receiveContentListener?.onDragEnter()
-            },
-            onMoved = { position ->
-                val positionOnTextField = textLayoutState.fromWindowToDecoration(position)
-                val cursorPosition = textLayoutState.getOffsetForPosition(positionOnTextField)
-                textFieldState.selectCharsIn(TextRange(cursorPosition))
-                textFieldSelectionState.updateHandleDragging(Handle.Cursor, positionOnTextField)
-            },
-            onDrop = { clipEntry, clipMetadata ->
-                emitDragExitEvent()
-                textFieldSelectionState.clearHandleDragging()
-                var plainText = clipEntry.readPlainText()
+    /** Special Drag and Drop node for BasicTextField that is also aware of `receiveContent` API. */
+    private val dragAndDropNode =
+        delegate(
+            textFieldDragAndDropNode(
+                hintMediaTypes = {
+                    val receiveContentConfiguration = getReceiveContentConfiguration()
+                    // if ReceiveContentConfiguration is set, all drag events should be accepted.
+                    // ContentReceiver handler should evaluate the incoming content.
+                    if (receiveContentConfiguration != null) {
+                        MediaTypesAll
+                    } else {
+                        MediaTypesText
+                    }
+                },
+                dragAndDropRequestPermission = {
+                    if (getReceiveContentConfiguration() != null) {
+                        dragAndDropRequestPermission(it)
+                    }
+                },
+                onEntered = {
+                    dragEnterEvent = HoverInteraction.Enter().also { interactionSource.tryEmit(it) }
+                    // Although BasicTextField itself is not a `receiveContent` node, it should
+                    // behave like one. Delegate the enter event to the ancestor nodes just like
+                    // `receiveContent` itself would.
+                    getReceiveContentConfiguration()?.receiveContentListener?.onDragEnter()
+                },
+                onMoved = { position ->
+                    val positionOnTextField = textLayoutState.fromWindowToDecoration(position)
+                    val cursorPosition = textLayoutState.getOffsetForPosition(positionOnTextField)
+                    textFieldState.selectCharsIn(TextRange(cursorPosition))
+                    textFieldSelectionState.updateHandleDragging(Handle.Cursor, positionOnTextField)
+                },
+                onDrop = { clipEntry, clipMetadata ->
+                    emitDragExitEvent()
+                    textFieldSelectionState.clearHandleDragging()
+                    var plainText = clipEntry.readPlainText()
 
-                val receiveContentConfiguration = getReceiveContentConfiguration()
-                // if receiveContent configuration is set, all drag operations should be
-                // accepted. ReceiveContent handler should evaluate the incoming content.
-                if (receiveContentConfiguration != null) {
-                    val transferableContent = TransferableContent(
-                        clipEntry,
-                        clipMetadata,
-                        TransferableContent.Source.DragAndDrop
-                    )
+                    val receiveContentConfiguration = getReceiveContentConfiguration()
+                    // if receiveContent configuration is set, all drag operations should be
+                    // accepted. ReceiveContent handler should evaluate the incoming content.
+                    if (receiveContentConfiguration != null) {
+                        val transferableContent =
+                            TransferableContent(
+                                clipEntry,
+                                clipMetadata,
+                                TransferableContent.Source.DragAndDrop
+                            )
 
-                    val remaining = receiveContentConfiguration
-                        .receiveContentListener
-                        .onReceive(transferableContent)
-                    plainText = remaining?.clipEntry?.readPlainText()
-                }
-                plainText?.let(textFieldState::replaceSelectedText)
-                true
-            },
-            onExited = {
-                emitDragExitEvent()
-                textFieldSelectionState.clearHandleDragging()
-                // Although BasicTextField itself is not a `receiveContent` node, it should
-                // behave like one. Delegate the exit event to the ancestor nodes just like
-                // `receiveContent` itself would.
-                getReceiveContentConfiguration()?.receiveContentListener?.onDragExit()
-            },
-            onEnded = {
-                emitDragExitEvent()
-            })
-    )
+                        val remaining =
+                            receiveContentConfiguration.receiveContentListener.onReceive(
+                                transferableContent
+                            )
+                        plainText = remaining?.clipEntry?.readPlainText()
+                    }
+                    plainText?.let(textFieldState::replaceSelectedText)
+                    true
+                },
+                onExited = {
+                    emitDragExitEvent()
+                    textFieldSelectionState.clearHandleDragging()
+                    // Although BasicTextField itself is not a `receiveContent` node, it should
+                    // behave like one. Delegate the exit event to the ancestor nodes just like
+                    // `receiveContent` itself would.
+                    getReceiveContentConfiguration()?.receiveContentListener?.onDragExit()
+                },
+                onEnded = { emitDragExitEvent() }
+            )
+        )
 
     var keyboardOptions: KeyboardOptions =
         keyboardOptions.fillUnspecifiedValuesWith(filter?.keyboardOptions)
@@ -352,12 +355,11 @@
      */
     private var isElementFocused: Boolean = false
 
-    /**
-     * Keeps focus state of the window
-     */
+    /** Keeps focus state of the window */
     private var windowInfo: WindowInfo? = null
 
-    private val isFocused: Boolean get() = isElementFocused && windowInfo?.isWindowFocused == true
+    private val isFocused: Boolean
+        get() = isElementFocused && windowInfo?.isWindowFocused == true
 
     /**
      * We observe text changes to show/hide text toolbar and cursor handles. This job is only run
@@ -371,25 +373,26 @@
      */
     private val textFieldKeyEventHandler = createTextFieldKeyEventHandler()
 
-    private val keyboardActionScope = object : KeyboardActionScope {
-        private val focusManager: FocusManager
-            get() = currentValueOf(LocalFocusManager)
+    private val keyboardActionScope =
+        object : KeyboardActionScope {
+            private val focusManager: FocusManager
+                get() = currentValueOf(LocalFocusManager)
 
-        override fun defaultKeyboardAction(imeAction: ImeAction) {
-            when (imeAction) {
-                ImeAction.Next -> {
-                    focusManager.moveFocus(FocusDirection.Next)
+            override fun defaultKeyboardAction(imeAction: ImeAction) {
+                when (imeAction) {
+                    ImeAction.Next -> {
+                        focusManager.moveFocus(FocusDirection.Next)
+                    }
+                    ImeAction.Previous -> {
+                        focusManager.moveFocus(FocusDirection.Previous)
+                    }
+                    ImeAction.Done -> {
+                        requireKeyboardController().hide()
+                    }
+                    else -> Unit
                 }
-                ImeAction.Previous -> {
-                    focusManager.moveFocus(FocusDirection.Previous)
-                }
-                ImeAction.Done -> {
-                    requireKeyboardController().hide()
-                }
-                else -> Unit
             }
         }
-    }
 
     /**
      * A coroutine job that observes text and layout changes in selection state to react to those
@@ -401,9 +404,7 @@
         getReceiveContentConfiguration()
     }
 
-    /**
-     * Updates all the related properties and invalidates internal state based on the changes.
-     */
+    /** Updates all the related properties and invalidates internal state based on the changes. */
     fun updateNode(
         textFieldState: TransformedTextFieldState,
         textLayoutState: TextLayoutState,
@@ -440,10 +441,11 @@
 
         // React to diff.
         // Something about the session changed, restart the session.
-        if (writeable != previousWriteable ||
-            textFieldState != previousTextFieldState ||
-            // compare with the new keyboardOptions that's merged
-            this.keyboardOptions != previousKeyboardOptions
+        if (
+            writeable != previousWriteable ||
+                textFieldState != previousTextFieldState ||
+                // compare with the new keyboardOptions that's merged
+                this.keyboardOptions != previousKeyboardOptions
         ) {
             if (writeable && isFocused) {
                 // The old session will be implicitly disposed.
@@ -501,17 +503,15 @@
             // `textSelectionRange` semantics which is selection in original text. In non-traversal
             // mode selection comes from the Talkback and indices are relative to the transformed
             // text
-            val text = if (relativeToOriginal) {
-                textFieldState.untransformedText
-            } else {
-                textFieldState.visualText
-            }
+            val text =
+                if (relativeToOriginal) {
+                    textFieldState.untransformedText
+                } else {
+                    textFieldState.visualText
+                }
             val selection = text.selection
 
-            if (!enabled ||
-                minOf(start, end) < 0 ||
-                maxOf(start, end) > text.length
-            ) {
+            if (!enabled || minOf(start, end) < 0 || maxOf(start, end) > text.length) {
                 return@setSelection false
             }
 
@@ -585,11 +585,7 @@
             }
         }
 
-        filter?.let {
-            with(it) {
-                applySemantics()
-            }
-        }
+        filter?.let { with(it) { applySemantics() } }
     }
 
     override fun onFocusEvent(focusState: FocusState) {
@@ -619,9 +615,7 @@
         textFieldSelectionState.isFocused = this.isFocused
         if (isFocused && observeChangesJob == null) {
             // only start a new job is there's not an ongoing one.
-            observeChangesJob = coroutineScope.launch {
-                textFieldSelectionState.observeChanges()
-            }
+            observeChangesJob = coroutineScope.launch { textFieldSelectionState.observeChanges() }
         } else if (!isFocused) {
             observeChangesJob?.cancel()
             observeChangesJob = null
@@ -691,21 +685,22 @@
 
         val receiveContentConfiguration = getReceiveContentConfiguration()
 
-        inputSessionJob = coroutineScope.launch {
-            // This will automatically cancel the previous session, if any, so we don't need to
-            // cancel the inputSessionJob ourselves.
-            establishTextInputSession {
-                platformSpecificTextInputSession(
-                    state = textFieldState,
-                    layoutState = textLayoutState,
-                    imeOptions = keyboardOptions.toImeOptions(singleLine),
-                    receiveContentConfiguration = receiveContentConfiguration,
-                    onImeAction = ::onImeActionPerformed,
-                    stylusHandwritingTrigger = stylusHandwritingTrigger,
-                    viewConfiguration = currentValueOf(LocalViewConfiguration)
-                )
+        inputSessionJob =
+            coroutineScope.launch {
+                // This will automatically cancel the previous session, if any, so we don't need to
+                // cancel the inputSessionJob ourselves.
+                establishTextInputSession {
+                    platformSpecificTextInputSession(
+                        state = textFieldState,
+                        layoutState = textLayoutState,
+                        imeOptions = keyboardOptions.toImeOptions(singleLine),
+                        receiveContentConfiguration = receiveContentConfiguration,
+                        onImeAction = ::onImeActionPerformed,
+                        stylusHandwritingTrigger = stylusHandwritingTrigger,
+                        viewConfiguration = currentValueOf(LocalViewConfiguration)
+                    )
+                }
             }
-        }
     }
 
     @OptIn(ExperimentalCoroutinesApi::class)
@@ -725,8 +720,7 @@
     }
 
     private fun requireKeyboardController(): SoftwareKeyboardController =
-        currentValueOf(LocalSoftwareKeyboardController)
-            ?: error("No software keyboard controller")
+        currentValueOf(LocalSoftwareKeyboardController) ?: error("No software keyboard controller")
 
     private fun emitDragExitEvent() {
         dragEnterEvent?.let {
@@ -736,25 +730,23 @@
     }
 
     private fun onImeActionPerformed(imeAction: ImeAction) {
-        if (imeAction == ImeAction.None ||
-            imeAction == ImeAction.Default ||
-            keyboardActionHandler == null) {
+        if (
+            imeAction == ImeAction.None ||
+                imeAction == ImeAction.Default ||
+                keyboardActionHandler == null
+        ) {
             // this should never happen but better be safe
             keyboardActionScope.defaultKeyboardAction(imeAction)
             return
         }
 
         keyboardActionHandler?.onKeyboardAction(
-            performDefaultAction = {
-                keyboardActionScope.defaultKeyboardAction(imeAction)
-            }
+            performDefaultAction = { keyboardActionScope.defaultKeyboardAction(imeAction) }
         )
     }
 }
 
-/**
- * Runs platform-specific text input logic.
- */
+/** Runs platform-specific text input logic. */
 internal expect suspend fun PlatformTextInputSession.platformSpecificTextInputSession(
     state: TransformedTextFieldState,
     layoutState: TextLayoutState,
diff --git a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/input/internal/TextFieldKeyEventHandler.kt b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/input/internal/TextFieldKeyEventHandler.kt
index 0bf1698..1481d93 100644
--- a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/input/internal/TextFieldKeyEventHandler.kt
+++ b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/input/internal/TextFieldKeyEventHandler.kt
@@ -34,22 +34,18 @@
 import androidx.compose.ui.platform.SoftwareKeyboardController
 import androidx.compose.ui.text.TextRange
 
-/**
- * Factory function to create a platform specific [TextFieldKeyEventHandler].
- */
+/** Factory function to create a platform specific [TextFieldKeyEventHandler]. */
 internal expect fun createTextFieldKeyEventHandler(): TextFieldKeyEventHandler
 
-/**
- * Returns whether this key event is created by the software keyboard.
- */
+/** Returns whether this key event is created by the software keyboard. */
 internal expect val KeyEvent.isFromSoftKeyboard: Boolean
 
 /**
- * Handles KeyEvents coming to a BasicTextField. This is mostly to support hardware keyboard but
- * any KeyEvent can also be sent by the IME or other platform systems.
+ * Handles KeyEvents coming to a BasicTextField. This is mostly to support hardware keyboard but any
+ * KeyEvent can also be sent by the IME or other platform systems.
  *
- * This class is left abstract to make sure that each platform extends from it. Platforms can
- * decide to extend or completely override KeyEvent actions defined here.
+ * This class is left abstract to make sure that each platform extends from it. Platforms can decide
+ * to extend or completely override KeyEvent actions defined here.
  */
 internal abstract class TextFieldKeyEventHandler {
     private val preparedSelectionState = TextFieldPreparedSelectionState()
@@ -132,46 +128,32 @@
                 KeyCommand.END -> moveCursorToEnd()
                 KeyCommand.DELETE_PREV_CHAR -> {
                     deleteIfSelectedOr {
-                        getPrecedingCharacterIndex().takeIf { it != NoCharacterFound }?.let {
-                            TextRange(it, selection.end)
-                        }
+                        getPrecedingCharacterIndex()
+                            .takeIf { it != NoCharacterFound }
+                            ?.let { TextRange(it, selection.end) }
                     }
                 }
-
                 KeyCommand.DELETE_NEXT_CHAR -> {
                     // Note that some software keyboards, such as Samsung, go through this code
                     // path instead of making calls on the InputConnection directly.
                     deleteIfSelectedOr {
-                        getNextCharacterIndex().takeIf { it != NoCharacterFound }?.let {
-                            TextRange(selection.start, it)
-                        }
+                        getNextCharacterIndex()
+                            .takeIf { it != NoCharacterFound }
+                            ?.let { TextRange(selection.start, it) }
                     }
                 }
-
                 KeyCommand.DELETE_PREV_WORD -> {
-                    deleteIfSelectedOr {
-                        TextRange(getPreviousWordOffset(), selection.end)
-                    }
+                    deleteIfSelectedOr { TextRange(getPreviousWordOffset(), selection.end) }
                 }
-
                 KeyCommand.DELETE_NEXT_WORD -> {
-                    deleteIfSelectedOr {
-                        TextRange(selection.start, getNextWordOffset())
-                    }
+                    deleteIfSelectedOr { TextRange(selection.start, getNextWordOffset()) }
                 }
-
                 KeyCommand.DELETE_FROM_LINE_START -> {
-                    deleteIfSelectedOr {
-                        TextRange(getLineStartByOffset(), selection.end)
-                    }
+                    deleteIfSelectedOr { TextRange(getLineStartByOffset(), selection.end) }
                 }
-
                 KeyCommand.DELETE_TO_LINE_END -> {
-                    deleteIfSelectedOr {
-                        TextRange(selection.start, getLineEndByOffset())
-                    }
+                    deleteIfSelectedOr { TextRange(selection.start, getLineEndByOffset()) }
                 }
-
                 KeyCommand.NEW_LINE -> {
                     if (!singleLine) {
                         textFieldState.editUntransformedTextAsUser {
@@ -182,7 +164,6 @@
                         onSubmit()
                     }
                 }
-
                 KeyCommand.TAB -> {
                     if (!singleLine) {
                         textFieldState.editUntransformedTextAsUser {
@@ -193,7 +174,6 @@
                         consumed = false // let propagate to focus system
                     }
                 }
-
                 KeyCommand.SELECT_ALL -> selectAll()
                 KeyCommand.SELECT_LEFT_CHAR -> moveCursorLeft().selectMovement()
                 KeyCommand.SELECT_RIGHT_CHAR -> moveCursorRight().selectMovement()
@@ -215,11 +195,9 @@
                 KeyCommand.UNDO -> {
                     textFieldState.undo()
                 }
-
                 KeyCommand.REDO -> {
                     textFieldState.redo()
                 }
-
                 KeyCommand.CHARACTER_PALETTE -> {
                     showCharacterPalette()
                 }
@@ -236,13 +214,14 @@
     ) {
         val layoutResult = textLayoutState.layoutResult
         val visibleTextLayoutHeight = textLayoutState.getVisibleTextLayoutHeight()
-        val preparedSelection = TextFieldPreparedSelection(
-            state = state,
-            textLayoutResult = layoutResult,
-            isFromSoftKeyboard = isFromSoftKeyboard,
-            visibleTextLayoutHeight = visibleTextLayoutHeight,
-            textPreparedSelectionState = preparedSelectionState
-        )
+        val preparedSelection =
+            TextFieldPreparedSelection(
+                state = state,
+                textLayoutResult = layoutResult,
+                isFromSoftKeyboard = isFromSoftKeyboard,
+                visibleTextLayoutHeight = visibleTextLayoutHeight,
+                textPreparedSelectionState = preparedSelectionState
+            )
         preparedSelection.block()
         if (preparedSelection.selection != preparedSelection.initialValue.selection) {
             // selection changes are applied atomically at the end of context evaluation
@@ -256,9 +235,14 @@
      * [Float.NaN].
      */
     private fun TextLayoutState.getVisibleTextLayoutHeight(): Float {
-        return textLayoutNodeCoordinates?.takeIf { it.isAttached }?.let { textLayoutCoordinates ->
-            decoratorNodeCoordinates?.takeIf { it.isAttached }
-                ?.localBoundingBoxOf(textLayoutCoordinates)
-        }?.size?.height ?: Float.NaN
+        return textLayoutNodeCoordinates
+            ?.takeIf { it.isAttached }
+            ?.let { textLayoutCoordinates ->
+                decoratorNodeCoordinates
+                    ?.takeIf { it.isAttached }
+                    ?.localBoundingBoxOf(textLayoutCoordinates)
+            }
+            ?.size
+            ?.height ?: Float.NaN
     }
 }
diff --git a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/input/internal/TextFieldLayoutStateCache.kt b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/input/internal/TextFieldLayoutStateCache.kt
index c5c4deb..d64d03d 100644
--- a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/input/internal/TextFieldLayoutStateCache.kt
+++ b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/input/internal/TextFieldLayoutStateCache.kt
@@ -50,36 +50,32 @@
  * You can basically think of this as a `derivedStateOf` that combines all the inputs to text layout
  * — the text itself, configuration parameters, and layout inputs — and spits out a
  * [TextLayoutResult]. The [value] property will register snapshot reads for all the inputs and
- * either return a cached result or re-compute the result and cache it in the current snapshot.
- * The cache is snapshot aware: when a new layout is computed, it will only be cached in the current
+ * either return a cached result or re-compute the result and cache it in the current snapshot. The
+ * cache is snapshot aware: when a new layout is computed, it will only be cached in the current
  * snapshot. When the snapshot with the new result is applied, its cache will also be visible to the
  * parent snapshot.
  *
  * All the possible inputs to text layout are grouped into two groups: those that come from the
  * layout system ([MeasureInputs]) and those that are passed explicitly to the text field composable
  * ([NonMeasureInputs]). Each of these groups can only be updated in bulk, and each group is stored
- * in an instance of a dedicated class. This means for each type of update, only one state object
- * is needed.
+ * in an instance of a dedicated class. This means for each type of update, only one state object is
+ * needed.
  */
 internal class TextFieldLayoutStateCache : State<TextLayoutResult?>, StateObject {
-    private var nonMeasureInputs: NonMeasureInputs? by mutableStateOf(
-        value = null,
-        policy = NonMeasureInputs.mutationPolicy
-    )
-    private var measureInputs: MeasureInputs? by mutableStateOf(
-        value = null,
-        policy = MeasureInputs.mutationPolicy
-    )
+    private var nonMeasureInputs: NonMeasureInputs? by
+        mutableStateOf(value = null, policy = NonMeasureInputs.mutationPolicy)
+    private var measureInputs: MeasureInputs? by
+        mutableStateOf(value = null, policy = MeasureInputs.mutationPolicy)
 
     /**
-     * Returns the [TextLayoutResult] for the current text field state and layout inputs, or null
-     * if the layout cannot be computed at this time.
+     * Returns the [TextLayoutResult] for the current text field state and layout inputs, or null if
+     * the layout cannot be computed at this time.
      *
      * This method will re-calculate the text layout if the text or any of the other layout inputs
      * have changed, otherwise it will return a cached value.
      *
-     * [updateNonMeasureInputs] and [layoutWithNewMeasureInputs] must both be called before this
-     * to initialize all the inputs, or it will return null.
+     * [updateNonMeasureInputs] and [layoutWithNewMeasureInputs] must both be called before this to
+     * initialize all the inputs, or it will return null.
      */
     override val value: TextLayoutResult?
         get() {
@@ -108,12 +104,13 @@
         singleLine: Boolean,
         softWrap: Boolean,
     ) {
-        nonMeasureInputs = NonMeasureInputs(
-            textFieldState = textFieldState,
-            textStyle = textStyle,
-            singleLine = singleLine,
-            softWrap = softWrap,
-        )
+        nonMeasureInputs =
+            NonMeasureInputs(
+                textFieldState = textFieldState,
+                textStyle = textStyle,
+                singleLine = singleLine,
+                softWrap = softWrap,
+            )
     }
 
     /**
@@ -131,16 +128,18 @@
         fontFamilyResolver: FontFamily.Resolver,
         constraints: Constraints,
     ): TextLayoutResult {
-        val measureInputs = MeasureInputs(
-            density = density,
-            layoutDirection = layoutDirection,
-            fontFamilyResolver = fontFamilyResolver,
-            constraints = constraints,
-        )
+        val measureInputs =
+            MeasureInputs(
+                density = density,
+                layoutDirection = layoutDirection,
+                fontFamilyResolver = fontFamilyResolver,
+                constraints = constraints,
+            )
         this.measureInputs = measureInputs
-        val nonMeasureInputs = checkNotNull(nonMeasureInputs) {
-            "Called layoutWithNewMeasureInputs before updateNonMeasureInputs"
-        }
+        val nonMeasureInputs =
+            checkNotNull(nonMeasureInputs) {
+                "Called layoutWithNewMeasureInputs before updateNonMeasureInputs"
+            }
         return getOrComputeLayout(nonMeasureInputs, measureInputs)
     }
 
@@ -157,26 +156,32 @@
         record.withCurrent { cachedRecord ->
             val cachedResult = cachedRecord.layoutResult
 
-            if (cachedResult != null &&
-                cachedRecord.visualText?.contentEquals(visualText) == true &&
-                cachedRecord.composition == visualText.composition &&
-                cachedRecord.singleLine == nonMeasureInputs.singleLine &&
-                cachedRecord.softWrap == nonMeasureInputs.softWrap &&
-                cachedRecord.layoutDirection == measureInputs.layoutDirection &&
-                cachedRecord.densityValue == measureInputs.density.density &&
-                cachedRecord.fontScale == measureInputs.density.fontScale &&
-                cachedRecord.constraints == measureInputs.constraints &&
-                cachedRecord.fontFamilyResolver == measureInputs.fontFamilyResolver &&
-                // one of the resolved fonts has updated, and this MultiParagraph is no longer
-                // valid for measure or display. This read is also a snapshot read guaranteeing
-                // that when the resolved font is stale, readers of text layout will be notified.
-                !cachedResult.multiParagraph.intrinsics.hasStaleResolvedFonts
+            if (
+                cachedResult != null &&
+                    cachedRecord.visualText?.contentEquals(visualText) == true &&
+                    cachedRecord.composition == visualText.composition &&
+                    cachedRecord.singleLine == nonMeasureInputs.singleLine &&
+                    cachedRecord.softWrap == nonMeasureInputs.softWrap &&
+                    cachedRecord.layoutDirection == measureInputs.layoutDirection &&
+                    cachedRecord.densityValue == measureInputs.density.density &&
+                    cachedRecord.fontScale == measureInputs.density.fontScale &&
+                    cachedRecord.constraints == measureInputs.constraints &&
+                    cachedRecord.fontFamilyResolver == measureInputs.fontFamilyResolver &&
+                    // one of the resolved fonts has updated, and this MultiParagraph is no longer
+                    // valid for measure or display. This read is also a snapshot read guaranteeing
+                    // that when the resolved font is stale, readers of text layout will be
+                    // notified.
+                    !cachedResult.multiParagraph.intrinsics.hasStaleResolvedFonts
             ) {
-                val isLayoutAffectingSame = cachedRecord.textStyle
-                    ?.hasSameLayoutAffectingAttributes(nonMeasureInputs.textStyle) ?: false
+                val isLayoutAffectingSame =
+                    cachedRecord.textStyle?.hasSameLayoutAffectingAttributes(
+                        nonMeasureInputs.textStyle
+                    ) ?: false
 
-                val isDrawAffectingSame = cachedRecord.textStyle
-                    ?.hasSameDrawAffectingAttributes(nonMeasureInputs.textStyle) ?: false
+                val isDrawAffectingSame =
+                    cachedRecord.textStyle?.hasSameDrawAffectingAttributes(
+                        nonMeasureInputs.textStyle
+                    ) ?: false
 
                 // Fast path: None of the inputs changed.
                 if (isLayoutAffectingSame && isDrawAffectingSame) {
@@ -185,45 +190,45 @@
                 // Slightly slower than fast path: Layout did not change but TextLayoutInput did
                 if (isLayoutAffectingSame) {
                     return cachedResult.copy(
-                        layoutInput = TextLayoutInput(
-                            cachedResult.layoutInput.text,
-                            nonMeasureInputs.textStyle,
-                            cachedResult.layoutInput.placeholders,
-                            cachedResult.layoutInput.maxLines,
-                            cachedResult.layoutInput.softWrap,
-                            cachedResult.layoutInput.overflow,
-                            cachedResult.layoutInput.density,
-                            cachedResult.layoutInput.layoutDirection,
-                            cachedResult.layoutInput.fontFamilyResolver,
-                            cachedResult.layoutInput.constraints
-                        )
+                        layoutInput =
+                            TextLayoutInput(
+                                cachedResult.layoutInput.text,
+                                nonMeasureInputs.textStyle,
+                                cachedResult.layoutInput.placeholders,
+                                cachedResult.layoutInput.maxLines,
+                                cachedResult.layoutInput.softWrap,
+                                cachedResult.layoutInput.overflow,
+                                cachedResult.layoutInput.density,
+                                cachedResult.layoutInput.layoutDirection,
+                                cachedResult.layoutInput.fontFamilyResolver,
+                                cachedResult.layoutInput.constraints
+                            )
                     )
                 }
             }
 
             // Slow path: Some input changed, need to re-layout.
-            return computeLayout(visualText, nonMeasureInputs, measureInputs)
-                .also { newResult ->
-                    // Although the snapshot-aware cache is only updated when the current snapshot
-                    // is writable, we still would like to cache the results of text layout
-                    // computation since it's very likely that a follow-up access to the text layout
-                    // result will use the same measure and non-measure inputs. Therefore, we use
-                    // a `TextMeasurer` with a cache size of 1 to compute the text layout result.
-                    if (newResult != cachedResult) {
-                        updateCacheIfWritable {
-                            this.visualText = visualText
-                            this.singleLine = nonMeasureInputs.singleLine
-                            this.softWrap = nonMeasureInputs.softWrap
-                            this.textStyle = nonMeasureInputs.textStyle
-                            this.layoutDirection = measureInputs.layoutDirection
-                            this.densityValue = measureInputs.densityValue
-                            this.fontScale = measureInputs.fontScale
-                            this.constraints = measureInputs.constraints
-                            this.fontFamilyResolver = measureInputs.fontFamilyResolver
-                            this.layoutResult = newResult
-                        }
+            return computeLayout(visualText, nonMeasureInputs, measureInputs).also { newResult ->
+                // Although the snapshot-aware cache is only updated when the current snapshot
+                // is writable, we still would like to cache the results of text layout
+                // computation since it's very likely that a follow-up access to the text layout
+                // result will use the same measure and non-measure inputs. Therefore, we use
+                // a `TextMeasurer` with a cache size of 1 to compute the text layout result.
+                if (newResult != cachedResult) {
+                    updateCacheIfWritable {
+                        this.visualText = visualText
+                        this.singleLine = nonMeasureInputs.singleLine
+                        this.softWrap = nonMeasureInputs.softWrap
+                        this.textStyle = nonMeasureInputs.textStyle
+                        this.layoutDirection = measureInputs.layoutDirection
+                        this.densityValue = measureInputs.densityValue
+                        this.fontScale = measureInputs.fontScale
+                        this.constraints = measureInputs.constraints
+                        this.fontFamilyResolver = measureInputs.fontFamilyResolver
+                        this.layoutResult = newResult
                     }
                 }
+            }
         }
     }
 
@@ -242,16 +247,18 @@
      * previously created. If a cached [TextMeasurer] is returned and [measureInputs] do not match
      * the attributes of previous instance, make sure to call [TextMeasurer.measure] with the
      * up-to-date parameters. [TextMeasurer] will override its fallback values for
-     * [FontFamily.Resolver], [Density], and [LayoutDirection] when these are passed explicitly
-     * to the [TextMeasurer.measure] function.
+     * [FontFamily.Resolver], [Density], and [LayoutDirection] when these are passed explicitly to
+     * the [TextMeasurer.measure] function.
      */
     private fun obtainTextMeasurer(measureInputs: MeasureInputs): TextMeasurer {
-        return textMeasurer ?: TextMeasurer(
-            defaultFontFamilyResolver = measureInputs.fontFamilyResolver,
-            defaultDensity = measureInputs.density,
-            defaultLayoutDirection = measureInputs.layoutDirection,
-            cacheSize = 1
-        ).also { textMeasurer = it }
+        return textMeasurer
+            ?: TextMeasurer(
+                    defaultFontFamilyResolver = measureInputs.fontFamilyResolver,
+                    defaultDensity = measureInputs.density,
+                    defaultLayoutDirection = measureInputs.layoutDirection,
+                    cacheSize = 1
+                )
+                .also { textMeasurer = it }
     }
 
     private fun computeLayout(
@@ -266,16 +273,17 @@
         val textMeasurer = obtainTextMeasurer(measureInputs)
 
         return textMeasurer.measure(
-            text = buildAnnotatedString {
-                append(visualText.toString())
-                if (visualText.composition != null) {
-                    addStyle(
-                        style = SpanStyle(textDecoration = TextDecoration.Underline),
-                        start = visualText.composition.min,
-                        end = visualText.composition.max
-                    )
-                }
-            },
+            text =
+                buildAnnotatedString {
+                    append(visualText.toString())
+                    if (visualText.composition != null) {
+                        addStyle(
+                            style = SpanStyle(textDecoration = TextDecoration.Underline),
+                            start = visualText.composition.min,
+                            end = visualText.composition.max
+                        )
+                    }
+                },
             style = nonMeasureInputs.textStyle,
             softWrap = nonMeasureInputs.softWrap,
             maxLines = if (nonMeasureInputs.singleLine) 1 else Int.MAX_VALUE,
@@ -355,20 +363,22 @@
             layoutResult = value.layoutResult
         }
 
-        override fun toString(): String = "CacheRecord(" +
-            "visualText=$visualText, " +
-            "composition=$composition, " +
-            "textStyle=$textStyle, " +
-            "singleLine=$singleLine, " +
-            "softWrap=$softWrap, " +
-            "densityValue=$densityValue, " +
-            "fontScale=$fontScale, " +
-            "layoutDirection=$layoutDirection, " +
-            "fontFamilyResolver=$fontFamilyResolver, " +
-            "constraints=$constraints, " +
-            "layoutResult=$layoutResult" +
-            ")"
+        override fun toString(): String =
+            "CacheRecord(" +
+                "visualText=$visualText, " +
+                "composition=$composition, " +
+                "textStyle=$textStyle, " +
+                "singleLine=$singleLine, " +
+                "softWrap=$softWrap, " +
+                "densityValue=$densityValue, " +
+                "fontScale=$fontScale, " +
+                "layoutDirection=$layoutDirection, " +
+                "fontFamilyResolver=$fontFamilyResolver, " +
+                "constraints=$constraints, " +
+                "layoutResult=$layoutResult" +
+                ")"
     }
+
     // endregion
 
     // region Input holders
@@ -379,12 +389,13 @@
         val softWrap: Boolean,
     ) {
 
-        override fun toString(): String = "NonMeasureInputs(" +
-            "textFieldState=$textFieldState, " +
-            "textStyle=$textStyle, " +
-            "singleLine=$singleLine, " +
-            "softWrap=$softWrap" +
-            ")"
+        override fun toString(): String =
+            "NonMeasureInputs(" +
+                "textFieldState=$textFieldState, " +
+                "textStyle=$textStyle, " +
+                "singleLine=$singleLine, " +
+                "softWrap=$softWrap" +
+                ")"
 
         companion object {
             /**
@@ -393,22 +404,27 @@
              * property and compares only the text (not selection). This means that when the text
              * state changes it will invalidate any snapshot observer that sets this state.
              */
-            val mutationPolicy = object : SnapshotMutationPolicy<NonMeasureInputs?> {
-                override fun equivalent(a: NonMeasureInputs?, b: NonMeasureInputs?): Boolean =
-                    if (a != null && b != null) {
-                        // We don't need to compare text contents here because the text state is read
-                        // by getOrComputeLayout – if the text state changes, that method will already
-                        // be invalidated. The only reason to compare text here would be to avoid
-                        // invalidating if the TextFieldState is a different instance but with the same
-                        // text, but that is unlikely to happen.
-                        a.textFieldState === b.textFieldState &&
-                            a.textStyle == b.textStyle &&
-                            a.singleLine == b.singleLine &&
-                            a.softWrap == b.softWrap
-                    } else {
-                        !((a == null) xor (b == null))
-                    }
-            }
+            val mutationPolicy =
+                object : SnapshotMutationPolicy<NonMeasureInputs?> {
+                    override fun equivalent(a: NonMeasureInputs?, b: NonMeasureInputs?): Boolean =
+                        if (a != null && b != null) {
+                            // We don't need to compare text contents here because the text state is
+                            // read
+                            // by getOrComputeLayout – if the text state changes, that method will
+                            // already
+                            // be invalidated. The only reason to compare text here would be to
+                            // avoid
+                            // invalidating if the TextFieldState is a different instance but with
+                            // the same
+                            // text, but that is unlikely to happen.
+                            a.textFieldState === b.textFieldState &&
+                                a.textStyle == b.textStyle &&
+                                a.singleLine == b.singleLine &&
+                                a.softWrap == b.softWrap
+                        } else {
+                            !((a == null) xor (b == null))
+                        }
+                }
         }
     }
 
@@ -426,30 +442,33 @@
         val densityValue: Float = density.density
         val fontScale: Float = density.fontScale
 
-        override fun toString(): String = "MeasureInputs(" +
-            "density=$density, " +
-            "densityValue=$densityValue, " +
-            "fontScale=$fontScale, " +
-            "layoutDirection=$layoutDirection, " +
-            "fontFamilyResolver=$fontFamilyResolver, " +
-            "constraints=$constraints" +
-            ")"
+        override fun toString(): String =
+            "MeasureInputs(" +
+                "density=$density, " +
+                "densityValue=$densityValue, " +
+                "fontScale=$fontScale, " +
+                "layoutDirection=$layoutDirection, " +
+                "fontFamilyResolver=$fontFamilyResolver, " +
+                "constraints=$constraints" +
+                ")"
 
         companion object {
-            val mutationPolicy = object : SnapshotMutationPolicy<MeasureInputs?> {
-                override fun equivalent(a: MeasureInputs?, b: MeasureInputs?): Boolean =
-                    if (a != null && b != null) {
-                        // Don't compare density – we don't care if the density instance changed,
-                        // only if the actual values used in density calculations did.
-                        a.densityValue == b.densityValue &&
-                            a.fontScale == b.fontScale &&
-                            a.layoutDirection == b.layoutDirection &&
-                            a.fontFamilyResolver == b.fontFamilyResolver &&
-                            a.constraints == b.constraints
-                    } else {
-                        !((a == null) xor (b == null))
-                    }
-            }
+            val mutationPolicy =
+                object : SnapshotMutationPolicy<MeasureInputs?> {
+                    override fun equivalent(a: MeasureInputs?, b: MeasureInputs?): Boolean =
+                        if (a != null && b != null) {
+                            // Don't compare density – we don't care if the density instance
+                            // changed,
+                            // only if the actual values used in density calculations did.
+                            a.densityValue == b.densityValue &&
+                                a.fontScale == b.fontScale &&
+                                a.layoutDirection == b.layoutDirection &&
+                                a.fontFamilyResolver == b.fontFamilyResolver &&
+                                a.constraints == b.constraints
+                        } else {
+                            !((a == null) xor (b == null))
+                        }
+                }
         }
     }
     // endregion
diff --git a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/input/internal/TextFieldTextLayoutModifier.kt b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/input/internal/TextFieldTextLayoutModifier.kt
index 9050c21..818e5db 100644
--- a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/input/internal/TextFieldTextLayoutModifier.kt
+++ b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/input/internal/TextFieldTextLayoutModifier.kt
@@ -53,13 +53,14 @@
     private val singleLine: Boolean,
     private val onTextLayout: (Density.(getResult: () -> TextLayoutResult?) -> Unit)?
 ) : ModifierNodeElement<TextFieldTextLayoutModifierNode>() {
-    override fun create(): TextFieldTextLayoutModifierNode = TextFieldTextLayoutModifierNode(
-        textLayoutState = textLayoutState,
-        textFieldState = textFieldState,
-        textStyle = textStyle,
-        singleLine = singleLine,
-        onTextLayout = onTextLayout
-    )
+    override fun create(): TextFieldTextLayoutModifierNode =
+        TextFieldTextLayoutModifierNode(
+            textLayoutState = textLayoutState,
+            textFieldState = textFieldState,
+            textStyle = textStyle,
+            singleLine = singleLine,
+            onTextLayout = onTextLayout
+        )
 
     override fun update(node: TextFieldTextLayoutModifierNode) {
         node.updateNode(
@@ -82,7 +83,8 @@
     textStyle: TextStyle,
     private var singleLine: Boolean,
     onTextLayout: (Density.(getResult: () -> TextLayoutResult?) -> Unit)?
-) : Modifier.Node(),
+) :
+    Modifier.Node(),
     LayoutModifierNode,
     GlobalPositionAwareModifierNode,
     CompositionLocalConsumerModifierNode {
@@ -100,9 +102,7 @@
     @Suppress("PrimitiveInCollection")
     private var baselineCache: MutableMap<AlignmentLine, Int>? = null
 
-    /**
-     * Updates all the related properties and invalidates internal state based on the changes.
-     */
+    /** Updates all the related properties and invalidates internal state based on the changes. */
     fun updateNode(
         textLayoutState: TextLayoutState,
         textFieldState: TransformedTextFieldState,
@@ -129,29 +129,28 @@
         measurable: Measurable,
         constraints: Constraints
     ): MeasureResult {
-        val result = textLayoutState.layoutWithNewMeasureInputs(
-            density = this,
-            layoutDirection = layoutDirection,
-            fontFamilyResolver = currentValueOf(LocalFontFamilyResolver),
-            constraints = constraints,
-        )
+        val result =
+            textLayoutState.layoutWithNewMeasureInputs(
+                density = this,
+                layoutDirection = layoutDirection,
+                fontFamilyResolver = currentValueOf(LocalFontFamilyResolver),
+                constraints = constraints,
+            )
 
-        val placeable = measurable.measure(
-            Constraints.fixed(result.size.width, result.size.height)
-        )
+        val placeable = measurable.measure(Constraints.fixed(result.size.width, result.size.height))
 
         // calculate the min height for single line text to prevent text cuts.
         // for single line text maxLines puts in max height constraint based on
         // constant characters therefore if the user enters a character that is
         // longer (i.e. emoji or a tall script) the text is cut
-        textLayoutState.minHeightForSingleLineField = if (singleLine) {
-            result.getLineBottom(0).ceilToIntPx().toDp()
-        } else {
-            0.dp
-        }
+        textLayoutState.minHeightForSingleLineField =
+            if (singleLine) {
+                result.getLineBottom(0).ceilToIntPx().toDp()
+            } else {
+                0.dp
+            }
 
-        @Suppress("PrimitiveInCollection")
-        val cache = baselineCache ?: LinkedHashMap(2)
+        @Suppress("PrimitiveInCollection") val cache = baselineCache ?: LinkedHashMap(2)
         cache[FirstBaseline] = result.firstBaseline.fastRoundToInt()
         cache[LastBaseline] = result.lastBaseline.fastRoundToInt()
         baselineCache = cache
diff --git a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/input/internal/TextLayoutState.kt b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/input/internal/TextLayoutState.kt
index 0104ada..7de8d8e 100644
--- a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/input/internal/TextLayoutState.kt
+++ b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/input/internal/TextLayoutState.kt
@@ -50,21 +50,15 @@
      *
      * DecoratorNode
      * -------------------
-     * |  CoreNode       |--> Outer Decoration Box with padding
-     * |  -------------  |
-     * |  |           |  |
-     * |  |           |--|--> Visible inner text field
-     * |  -------------  |    (Below the dashed line is not visible)
-     * |  |           |  |
-     * |  |           |  |
+     * | CoreNode |--> Outer Decoration Box with padding | ------------- | | | | | | | |--|-->
+     * Visible inner text field | ------------- | (Below the dashed line is not visible) | | | | | |
+     * | |
      * -------------------
-     *    |           |
-     *    |           |---> Scrollable part (TextLayoutNode)
-     *    -------------
-     *
-     * These coordinates are used to calculate the relative positioning between multiple layers
-     * of a BasicTextField. For example, touches are processed by the decoration box but these
-     * should be converted to text layout positions to find out which character is pressed.
+     * | | | |---> Scrollable part (TextLayoutNode)
+     * -------------
+     * These coordinates are used to calculate the relative positioning between multiple layers of a
+     * BasicTextField. For example, touches are processed by the decoration box but these should be
+     * converted to text layout positions to find out which character is pressed.
      *
      * [LayoutCoordinates] object returned from onGloballyPositioned callback is usually the same
      * instance unless a node is detached and re-attached to the tree. To react to layout and
@@ -74,9 +68,7 @@
     var coreNodeCoordinates: LayoutCoordinates? by mutableStateOf(null, neverEqualPolicy())
     var decoratorNodeCoordinates: LayoutCoordinates? by mutableStateOf(null, neverEqualPolicy())
 
-    /**
-     * Set to a non-zero value for single line TextFields in order to prevent text cuts.
-     */
+    /** Set to a non-zero value for single line TextFields in order to prevent text cuts. */
     var minHeightForSingleLineField by mutableStateOf(0.dp)
 
     /**
@@ -90,9 +82,9 @@
 
     /**
      * Updates the [TextFieldLayoutStateCache] with inputs that don't come from the measure phase.
-     * This method will initialize the cache the first time it's called.
-     * If the new inputs require re-calculating text layout, any readers of [layoutResult] called
-     * from a snapshot observer will be invalidated.
+     * This method will initialize the cache the first time it's called. If the new inputs require
+     * re-calculating text layout, any readers of [layoutResult] called from a snapshot observer
+     * will be invalidated.
      *
      * @see layoutWithNewMeasureInputs
      */
@@ -111,10 +103,11 @@
     }
 
     /**
-     * Updates the [TextFieldLayoutStateCache] with inputs that come from the measure phase and returns the
-     * latest [TextLayoutResult]. If the measure inputs haven't changed significantly since the
-     * last call, this will be the cached result. If the new inputs require re-calculating text
-     * layout, any readers of [layoutResult] called from a snapshot observer will be invalidated.
+     * Updates the [TextFieldLayoutStateCache] with inputs that come from the measure phase and
+     * returns the latest [TextLayoutResult]. If the measure inputs haven't changed significantly
+     * since the last call, this will be the cached result. If the new inputs require re-calculating
+     * text layout, any readers of [layoutResult] called from a snapshot observer will be
+     * invalidated.
      *
      * [updateNonMeasureInputs] must be called before this method to initialize the cache.
      */
@@ -124,12 +117,13 @@
         fontFamilyResolver: FontFamily.Resolver,
         constraints: Constraints,
     ): TextLayoutResult {
-        val layoutResult = layoutCache.layoutWithNewMeasureInputs(
-            density = density,
-            layoutDirection = layoutDirection,
-            fontFamilyResolver = fontFamilyResolver,
-            constraints = constraints,
-        )
+        val layoutResult =
+            layoutCache.layoutWithNewMeasureInputs(
+                density = density,
+                layoutDirection = layoutDirection,
+                fontFamilyResolver = fontFamilyResolver,
+                constraints = constraints,
+            )
 
         onTextLayout?.let { onTextLayout ->
             val textLayoutProvider = { layoutCache.value }
@@ -140,38 +134,38 @@
     }
 
     /**
-     * Translates the position of the touch on the screen to the position in text. Because touch
-     * is relative to the decoration box, we need to translate it to the inner text field's
-     * coordinates first before calculating position of the symbol in text.
+     * Translates the position of the touch on the screen to the position in text. Because touch is
+     * relative to the decoration box, we need to translate it to the inner text field's coordinates
+     * first before calculating position of the symbol in text.
      *
      * @param position original position of the gesture relative to the decoration box
-     * @param coerceInVisibleBounds if true and original [position] is outside visible bounds
-     * of the inner text field, the [position] will be shifted to the closest edge of the inner
-     * text field's visible bounds. This is useful when you have a decoration box
-     * bigger than the inner text field, so when user touches to the decoration box area, the cursor
-     * goes to the beginning or the end of the visible inner text field; otherwise if we put the
-     * cursor under the touch in the invisible part of the inner text field, it would scroll to
-     * make the cursor visible. This behavior is not needed, and therefore
-     * [coerceInVisibleBounds] should be set to false, when the user drags outside visible bounds
-     * to make a selection.
-     * @return The offset that corresponds to the [position]. Returns -1 if text layout has not
-     * been measured yet.
+     * @param coerceInVisibleBounds if true and original [position] is outside visible bounds of the
+     *   inner text field, the [position] will be shifted to the closest edge of the inner text
+     *   field's visible bounds. This is useful when you have a decoration box bigger than the inner
+     *   text field, so when user touches to the decoration box area, the cursor goes to the
+     *   beginning or the end of the visible inner text field; otherwise if we put the cursor under
+     *   the touch in the invisible part of the inner text field, it would scroll to make the cursor
+     *   visible. This behavior is not needed, and therefore [coerceInVisibleBounds] should be set
+     *   to false, when the user drags outside visible bounds to make a selection.
+     * @return The offset that corresponds to the [position]. Returns -1 if text layout has not been
+     *   measured yet.
      */
     fun getOffsetForPosition(position: Offset, coerceInVisibleBounds: Boolean = true): Int {
         val layoutResult = layoutResult ?: return -1
-        val coercedPosition = if (coerceInVisibleBounds) {
-            coercedInVisibleBoundsOfInputText(position)
-        } else {
-            position
-        }
+        val coercedPosition =
+            if (coerceInVisibleBounds) {
+                coercedInVisibleBoundsOfInputText(position)
+            } else {
+                position
+            }
         val relativePosition = fromDecorationToTextLayout(coercedPosition)
         return layoutResult.getOffsetForPosition(relativePosition)
     }
 
     /**
-     * Returns true if the screen coordinates position (x,y) corresponds to a character displayed
-     * in the view. Returns false when the position is in the empty space of left/right of text.
-     * This function may return true even when [offset] is below or above the text layout.
+     * Returns true if the screen coordinates position (x,y) corresponds to a character displayed in
+     * the view. Returns false when the position is in the empty space of left/right of text. This
+     * function may return true even when [offset] is below or above the text layout.
      */
     fun isPositionOnText(offset: Offset): Boolean {
         val layoutResult = layoutResult ?: return false
@@ -200,27 +194,30 @@
 }
 
 internal fun Offset.coerceIn(rect: Rect): Offset {
-    val xOffset = when {
-        x < rect.left -> rect.left
-        x > rect.right -> rect.right
-        else -> x
-    }
-    val yOffset = when {
-        y < rect.top -> rect.top
-        y > rect.bottom -> rect.bottom
-        else -> y
-    }
+    val xOffset =
+        when {
+            x < rect.left -> rect.left
+            x > rect.right -> rect.right
+            else -> x
+        }
+    val yOffset =
+        when {
+            y < rect.top -> rect.top
+            y > rect.bottom -> rect.bottom
+            else -> y
+        }
     return Offset(xOffset, yOffset)
 }
 
-/**
- * Translates a position from text layout node coordinates to core node coordinates.
- */
+/** Translates a position from text layout node coordinates to core node coordinates. */
 internal fun TextLayoutState.fromTextLayoutToCore(offset: Offset): Offset {
-    return textLayoutNodeCoordinates?.takeIf { it.isAttached }?.let { textLayoutNodeCoordinates ->
-        coreNodeCoordinates?.takeIf { it.isAttached }
-            ?.localPositionOf(textLayoutNodeCoordinates, offset)
-    } ?: offset
+    return textLayoutNodeCoordinates
+        ?.takeIf { it.isAttached }
+        ?.let { textLayoutNodeCoordinates ->
+            coreNodeCoordinates
+                ?.takeIf { it.isAttached }
+                ?.localPositionOf(textLayoutNodeCoordinates, offset)
+        } ?: offset
 }
 
 /**
diff --git a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/input/internal/TransformedTextFieldState.kt b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/input/internal/TransformedTextFieldState.kt
index a25fbc4..5fc0419 100644
--- a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/input/internal/TransformedTextFieldState.kt
+++ b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/input/internal/TransformedTextFieldState.kt
@@ -61,9 +61,9 @@
  *
  * Text is transformed in two phases:
  * 1. The first phase applies [outputTransformation], and the resulting text, [outputText], is
- *   published to the semantics system (consumed by a11y services and tests).
+ *    published to the semantics system (consumed by a11y services and tests).
  * 2. The second phase applies [codepointTransformation] and the resulting text, [visualText], is
- *  laid out and drawn to the screen.
+ *    laid out and drawn to the screen.
  *
  * Any transformations that change the semantics (in the generic sense, not Compose semantics)
  * should be done in the first phase. Examples include adding prefixes or suffixes to the text or
@@ -72,11 +72,10 @@
  * The second phase should only be used for purely visual or layout transformations. Examples
  * include password masking or inserting spaces for Scribe.
  *
- * In most cases, one or both phases will be noops. E.g., password fields will usually only use
- * the second phase, and non-password fields will usually only use the first phase.
+ * In most cases, one or both phases will be noops. E.g., password fields will usually only use the
+ * second phase, and non-password fields will usually only use the first phase.
  *
  * Here's a diagram explaining the phases:
- *
  * ```
  *  ┌──────────────────┐
  *  │                  │
@@ -175,8 +174,8 @@
 
     /**
      * [TransformedTextFieldState] is not recreated when only [InputTransformation] changes. This
-     * method simply updates the internal [InputTransformation] to be used by input methods like
-     * the IME, hardware keyboard, or gestures.
+     * method simply updates the internal [InputTransformation] to be used by input methods like the
+     * IME, hardware keyboard, or gestures.
      *
      * [InputTransformation] property is not backed by snapshot state, so it can't be updated
      * directly in composition. Make sure to call this method from outside the composition.
@@ -215,9 +214,7 @@
     }
 
     fun selectAll() {
-        textFieldState.editAsUser(inputTransformation) {
-            setSelection(0, length)
-        }
+        textFieldState.editAsUser(inputTransformation) { setSelection(0, length) }
     }
 
     fun deleteSelectedText() {
@@ -247,11 +244,7 @@
             restartImeIfContentChanges = restartImeIfContentChanges
         ) {
             val selection = mapFromTransformed(range)
-            replace(
-                selection.min,
-                selection.max,
-                newText
-            )
+            replace(selection.min, selection.max, newText)
             val cursor = selection.min + newText.length
             setSelection(cursor, cursor)
         }
@@ -269,11 +262,7 @@
 
             // `selection` is read from the buffer, so we don't need to transform it.
             val selection = selection
-            replace(
-                selection.min,
-                selection.max,
-                newText
-            )
+            replace(selection.min, selection.max, newText)
             val cursor = selection.min + newText.length
             setSelection(cursor, cursor)
         }
@@ -305,8 +294,8 @@
      * Runs [block] with a buffer that contains the source untransformed text. This is the text that
      * will be fed into the [outputTransformation]. Any operations performed on this buffer MUST
      * take care to explicitly convert between transformed and untransformed offsets and ranges.
-     * When possible, use the other methods on this class to manipulate selection to avoid having
-     * to do these conversions manually.
+     * When possible, use the other methods on this class to manipulate selection to avoid having to
+     * do these conversions manually.
      *
      * @see mapToTransformed
      * @see mapFromTransformed
@@ -323,10 +312,11 @@
     }
 
     /**
-     * Maps an [offset] in the untransformed text to the corresponding offset or range in [visualText].
+     * Maps an [offset] in the untransformed text to the corresponding offset or range in
+     * [visualText].
      *
-     * An untransformed offset will map to non-collapsed range if the offset is in the middle of
-     * a surrogate pair in the untransformed text, in which case it will return the range of the
+     * An untransformed offset will map to non-collapsed range if the offset is in the middle of a
+     * surrogate pair in the untransformed text, in which case it will return the range of the
      * codepoint that the surrogate maps to. Offsets on either side of a surrogate pair will return
      * collapsed ranges.
      *
@@ -339,18 +329,17 @@
         val presentMapping = outputTransformedText?.value?.offsetMapping
         val visualMapping = codepointTransformedText?.value?.offsetMapping
 
-        val intermediateRange = presentMapping?.mapFromSource(offset)
-            ?: TextRange(offset)
-        return visualMapping
-            ?.let { mapToTransformed(intermediateRange, it, selectionWedgeAffinity) }
-            ?: intermediateRange
+        val intermediateRange = presentMapping?.mapFromSource(offset) ?: TextRange(offset)
+        return visualMapping?.let {
+            mapToTransformed(intermediateRange, it, selectionWedgeAffinity)
+        } ?: intermediateRange
     }
 
     /**
      * Maps a [range] in the untransformed text to the corresponding range in [visualText].
      *
-     * If there is no transformation, or the transformation does not change the text, [range]
-     * will be returned.
+     * If there is no transformation, or the transformation does not change the text, [range] will
+     * be returned.
      *
      * @see mapFromTransformed
      */
@@ -360,23 +349,21 @@
 
         // Only apply the wedge affinity to the final range. If the first mapping returns a range,
         // the first range should have both edges expanded by the second.
-        val intermediateRange = presentMapping
-            ?.let { mapToTransformed(range, it) }
-            ?: range
-        return visualMapping
-            ?.let { mapToTransformed(intermediateRange, it, selectionWedgeAffinity) }
-            ?: intermediateRange
+        val intermediateRange = presentMapping?.let { mapToTransformed(range, it) } ?: range
+        return visualMapping?.let {
+            mapToTransformed(intermediateRange, it, selectionWedgeAffinity)
+        } ?: intermediateRange
     }
 
     /**
      * Maps an [offset] in [visualText] to the corresponding offset in the untransformed text.
      *
      * Multiple transformed offsets may map to the same untransformed offset. In particular, any
-     * offset in the middle of a surrogate pair will map to offset of the corresponding codepoint
-     * in the untransformed text.
+     * offset in the middle of a surrogate pair will map to offset of the corresponding codepoint in
+     * the untransformed text.
      *
-     * If there is no transformation, or the transformation does not change the text, [offset]
-     * will be returned.
+     * If there is no transformation, or the transformation does not change the text, [offset] will
+     * be returned.
      *
      * @see mapToTransformed
      */
@@ -384,8 +371,7 @@
         val presentMapping = outputTransformedText?.value?.offsetMapping
         val visualMapping = codepointTransformedText?.value?.offsetMapping
 
-        val intermediateOffset = visualMapping?.mapFromDest(offset)
-            ?: TextRange(offset)
+        val intermediateOffset = visualMapping?.mapFromDest(offset) ?: TextRange(offset)
         return presentMapping?.let { mapFromTransformed(intermediateOffset, it) }
             ?: intermediateOffset
     }
@@ -393,8 +379,8 @@
     /**
      * Maps a [range] in [visualText] to the corresponding range in the untransformed text.
      *
-     * If there is no transformation, or the transformation does not change the text, [range]
-     * will be returned.
+     * If there is no transformation, or the transformation does not change the text, [range] will
+     * be returned.
      *
      * @see mapToTransformed
      */
@@ -402,8 +388,7 @@
         val presentMapping = outputTransformedText?.value?.offsetMapping
         val visualMapping = codepointTransformedText?.value?.offsetMapping
 
-        val intermediateRange = visualMapping?.let { mapFromTransformed(range, it) }
-            ?: range
+        val intermediateRange = visualMapping?.let { mapFromTransformed(range, it) } ?: range
         return presentMapping?.let { mapFromTransformed(intermediateRange, it) }
             ?: intermediateRange
     }
@@ -439,15 +424,16 @@
         return result
     }
 
-    override fun toString(): String = "TransformedTextFieldState(" +
-        "textFieldState=$textFieldState, " +
-        "outputTransformation=$outputTransformation, " +
-        "outputTransformedText=$outputTransformedText, " +
-        "codepointTransformation=$codepointTransformation, " +
-        "codepointTransformedText=$codepointTransformedText, " +
-        "outputText=\"$outputText\", " +
-        "visualText=\"$visualText\"" +
-        ")"
+    override fun toString(): String =
+        "TransformedTextFieldState(" +
+            "textFieldState=$textFieldState, " +
+            "outputTransformation=$outputTransformation, " +
+            "outputTransformedText=$outputTransformedText, " +
+            "codepointTransformation=$codepointTransformation, " +
+            "codepointTransformedText=$codepointTransformedText, " +
+            "outputText=\"$outputText\", " +
+            "visualText=\"$visualText\"" +
+            ")"
 
     private data class TransformedText(
         val text: TextFieldCharSequence,
@@ -457,13 +443,13 @@
     private companion object {
 
         /**
-         * Applies an [OutputTransformation] to a [TextFieldCharSequence], returning the
-         * transformed text content, the selection/cursor from the [untransformedValue] mapped to the
-         * offsets in the transformed text, and an [OffsetMappingCalculator] that can be used to map
-         * offsets in both directions between the transformed and untransformed text.
+         * Applies an [OutputTransformation] to a [TextFieldCharSequence], returning the transformed
+         * text content, the selection/cursor from the [untransformedValue] mapped to the offsets in
+         * the transformed text, and an [OffsetMappingCalculator] that can be used to map offsets in
+         * both directions between the transformed and untransformed text.
          *
-         * This function is relatively expensive, since it creates a copy of [untransformedValue], so
-         * its result should be cached.
+         * This function is relatively expensive, since it creates a copy of [untransformedValue],
+         * so its result should be cached.
          */
         @kotlin.jvm.JvmStatic
         private fun calculateTransformedText(
@@ -472,10 +458,11 @@
             wedgeAffinity: SelectionWedgeAffinity
         ): TransformedText? {
             val offsetMappingCalculator = OffsetMappingCalculator()
-            val buffer = TextFieldBuffer(
-                initialValue = untransformedValue,
-                offsetMappingCalculator = offsetMappingCalculator
-            )
+            val buffer =
+                TextFieldBuffer(
+                    initialValue = untransformedValue,
+                    offsetMappingCalculator = offsetMappingCalculator
+                )
 
             // This is the call to external code.
             with(outputTransformation) { buffer.transformOutput() }
@@ -485,33 +472,37 @@
                 return null
             }
 
-            val transformedTextWithSelection = buffer.toTextFieldCharSequence(
-                // Pass the calculator explicitly since the one on transformedText won't be updated
-                // yet.
-                selection = mapToTransformed(
-                    range = untransformedValue.selection,
-                    mapping = offsetMappingCalculator,
-                    wedgeAffinity = wedgeAffinity
-                ),
-                composition = untransformedValue.composition?.let {
-                    mapToTransformed(
-                        range = it,
-                        mapping = offsetMappingCalculator,
-                        wedgeAffinity = wedgeAffinity
-                    )
-                }
-            )
+            val transformedTextWithSelection =
+                buffer.toTextFieldCharSequence(
+                    // Pass the calculator explicitly since the one on transformedText won't be
+                    // updated
+                    // yet.
+                    selection =
+                        mapToTransformed(
+                            range = untransformedValue.selection,
+                            mapping = offsetMappingCalculator,
+                            wedgeAffinity = wedgeAffinity
+                        ),
+                    composition =
+                        untransformedValue.composition?.let {
+                            mapToTransformed(
+                                range = it,
+                                mapping = offsetMappingCalculator,
+                                wedgeAffinity = wedgeAffinity
+                            )
+                        }
+                )
             return TransformedText(transformedTextWithSelection, offsetMappingCalculator)
         }
 
         /**
          * Applies a [CodepointTransformation] to a [TextFieldCharSequence], returning the
-         * transformed text content, the selection/cursor from the [untransformedValue] mapped to the
-         * offsets in the transformed text, and an [OffsetMappingCalculator] that can be used to map
-         * offsets in both directions between the transformed and untransformed text.
+         * transformed text content, the selection/cursor from the [untransformedValue] mapped to
+         * the offsets in the transformed text, and an [OffsetMappingCalculator] that can be used to
+         * map offsets in both directions between the transformed and untransformed text.
          *
-         * This function is relatively expensive, since it creates a copy of [untransformedValue], so
-         * its result should be cached.
+         * This function is relatively expensive, since it creates a copy of [untransformedValue],
+         * so its result should be cached.
          */
         @kotlin.jvm.JvmStatic
         private fun calculateTransformedText(
@@ -530,19 +521,23 @@
                 return null
             }
 
-            val transformedTextWithSelection = TextFieldCharSequence(
-                text = transformedText,
-                // Pass the calculator explicitly since the one on transformedText won't be updated
-                // yet.
-                selection = mapToTransformed(
-                    untransformedValue.selection,
-                    offsetMappingCalculator,
-                    wedgeAffinity
-                ),
-                composition = untransformedValue.composition?.let {
-                    mapToTransformed(it, offsetMappingCalculator, wedgeAffinity)
-                }
-            )
+            val transformedTextWithSelection =
+                TextFieldCharSequence(
+                    text = transformedText,
+                    // Pass the calculator explicitly since the one on transformedText won't be
+                    // updated
+                    // yet.
+                    selection =
+                        mapToTransformed(
+                            untransformedValue.selection,
+                            offsetMappingCalculator,
+                            wedgeAffinity
+                        ),
+                    composition =
+                        untransformedValue.composition?.let {
+                            mapToTransformed(it, offsetMappingCalculator, wedgeAffinity)
+                        }
+                )
             return TransformedText(transformedTextWithSelection, offsetMappingCalculator)
         }
 
@@ -550,7 +545,7 @@
          * Maps [range] from untransformed to transformed indices.
          *
          * @param wedgeAffinity The [SelectionWedgeAffinity] to use to collapse the transformed
-         * range if necessary. If null, the range will be returned uncollapsed.
+         *   range if necessary. If null, the range will be returned uncollapsed.
          */
         @kotlin.jvm.JvmStatic
         private fun mapToTransformed(
@@ -560,17 +555,20 @@
         ): TextRange {
             val transformedStart = mapping.mapFromSource(range.start)
             // Avoid calculating mapping again if it's going to be the same value.
-            val transformedEnd = if (range.collapsed) transformedStart else {
-                mapping.mapFromSource(range.end)
-            }
+            val transformedEnd =
+                if (range.collapsed) transformedStart
+                else {
+                    mapping.mapFromSource(range.end)
+                }
 
             val transformedMin = minOf(transformedStart.min, transformedEnd.min)
             val transformedMax = maxOf(transformedStart.max, transformedEnd.max)
-            val transformedRange = if (range.reversed) {
-                TextRange(transformedMax, transformedMin)
-            } else {
-                TextRange(transformedMin, transformedMax)
-            }
+            val transformedRange =
+                if (range.reversed) {
+                    TextRange(transformedMax, transformedMin)
+                } else {
+                    TextRange(transformedMin, transformedMax)
+                }
 
             return if (range.collapsed && !transformedRange.collapsed) {
                 // In a wedge.
@@ -591,9 +589,11 @@
         ): TextRange {
             val untransformedStart = mapping.mapFromDest(range.start)
             // Avoid calculating mapping again if it's going to be the same value.
-            val untransformedEnd = if (range.collapsed) untransformedStart else {
-                mapping.mapFromDest(range.end)
-            }
+            val untransformedEnd =
+                if (range.collapsed) untransformedStart
+                else {
+                    mapping.mapFromDest(range.end)
+                }
 
             val untransformedMin = minOf(untransformedStart.min, untransformedEnd.min)
             val untransformedMax = maxOf(untransformedStart.max, untransformedEnd.max)
@@ -606,9 +606,7 @@
     }
 }
 
-/**
- * Represents the [WedgeAffinity] for both sides of a selection.
- */
+/** Represents the [WedgeAffinity] for both sides of a selection. */
 internal data class SelectionWedgeAffinity(
     val startAffinity: WedgeAffinity,
     val endAffinity: WedgeAffinity,
@@ -622,7 +620,8 @@
  * created when an [OutputTransformation] either inserts or replaces a non-empty string.
  */
 internal enum class WedgeAffinity {
-    Start, End
+    Start,
+    End
 }
 
 internal enum class IndexTransformationType {
@@ -639,39 +638,34 @@
  * This function uses continuation-passing style to return multiple values without allocating.
  *
  * @param onResult Called with the determined [IndexTransformationType] and the ranges that
- * [transformedQueryIndex] maps to both in the [TransformedTextFieldState.untransformedText] and
- * when that range is mapped back into the [TransformedTextFieldState.visualText].
+ *   [transformedQueryIndex] maps to both in the [TransformedTextFieldState.untransformedText] and
+ *   when that range is mapped back into the [TransformedTextFieldState.visualText].
  */
 internal inline fun <R> TransformedTextFieldState.getIndexTransformationType(
     transformedQueryIndex: Int,
-    onResult: (
-        IndexTransformationType,
-        untransformed: TextRange,
-        retransformed: TextRange
-    ) -> R
+    onResult: (IndexTransformationType, untransformed: TextRange, retransformed: TextRange) -> R
 ): R {
     val untransformed = mapFromTransformed(transformedQueryIndex)
     val retransformed = mapToTransformed(untransformed)
-    val type = when {
-        untransformed.collapsed && retransformed.collapsed -> {
-            // Simple case: no transformation in effect.
-            Untransformed
+    val type =
+        when {
+            untransformed.collapsed && retransformed.collapsed -> {
+                // Simple case: no transformation in effect.
+                Untransformed
+            }
+            !untransformed.collapsed && !retransformed.collapsed -> {
+                // Replacement: An non-empty range in the source was replaced with a non-empty
+                // string.
+                Replacement
+            }
+            untransformed.collapsed && !retransformed.collapsed -> {
+                // Insertion: An empty range in the source was replaced with a non-empty range.
+                Insertion
+            }
+            else /* !untransformed.collapsed && retransformed.collapsed */ -> {
+                // Deletion: A non-empty range in the source was replaced with an empty string.
+                Deletion
+            }
         }
-
-        !untransformed.collapsed && !retransformed.collapsed -> {
-            // Replacement: An non-empty range in the source was replaced with a non-empty string.
-            Replacement
-        }
-
-        untransformed.collapsed && !retransformed.collapsed -> {
-            // Insertion: An empty range in the source was replaced with a non-empty range.
-            Insertion
-        }
-
-        else /* !untransformed.collapsed && retransformed.collapsed */ -> {
-            // Deletion: A non-empty range in the source was replaced with an empty string.
-            Deletion
-        }
-    }
     return onResult(type, untransformed, retransformed)
 }
diff --git a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/input/internal/selection/PressDownGesture.kt b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/input/internal/selection/PressDownGesture.kt
index 10fa1cb..3700003 100644
--- a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/input/internal/selection/PressDownGesture.kt
+++ b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/input/internal/selection/PressDownGesture.kt
@@ -22,9 +22,7 @@
 import androidx.compose.ui.input.pointer.PointerInputScope
 import androidx.compose.ui.util.fastAny
 
-/**
- * Detects pointer down and up events. This detector does not require events to be unconsumed.
- */
+/** Detects pointer down and up events. This detector does not require events to be unconsumed. */
 internal suspend fun PointerInputScope.detectPressDownGesture(
     onDown: TapOnPosition,
     onUp: (() -> Unit)? = null
diff --git a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/input/internal/selection/TextFieldHandleState.kt b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/input/internal/selection/TextFieldHandleState.kt
index 8b9a57f..7b1ca57 100644
--- a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/input/internal/selection/TextFieldHandleState.kt
+++ b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/input/internal/selection/TextFieldHandleState.kt
@@ -19,9 +19,7 @@
 import androidx.compose.ui.geometry.Offset
 import androidx.compose.ui.text.style.ResolvedTextDirection
 
-/**
- * Defines how to render a selection or cursor handle on a TextField.
- */
+/** Defines how to render a selection or cursor handle on a TextField. */
 internal data class TextFieldHandleState(
     val visible: Boolean,
     val position: Offset,
@@ -29,11 +27,12 @@
     val handlesCrossed: Boolean
 ) {
     companion object {
-        val Hidden = TextFieldHandleState(
-            visible = false,
-            position = Offset.Unspecified,
-            direction = ResolvedTextDirection.Ltr,
-            handlesCrossed = false
-        )
+        val Hidden =
+            TextFieldHandleState(
+                visible = false,
+                position = Offset.Unspecified,
+                direction = ResolvedTextDirection.Ltr,
+                handlesCrossed = false
+            )
     }
 }
diff --git a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/input/internal/selection/TextFieldMagnifier.kt b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/input/internal/selection/TextFieldMagnifier.kt
index fe8166b..c47875b 100644
--- a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/input/internal/selection/TextFieldMagnifier.kt
+++ b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/input/internal/selection/TextFieldMagnifier.kt
@@ -34,10 +34,8 @@
 import androidx.compose.ui.unit.IntSize
 import kotlin.math.absoluteValue
 
-internal abstract class TextFieldMagnifierNode : DelegatingNode(),
-    OnGloballyPositionedModifier,
-    DrawModifierNode,
-    SemanticsModifierNode {
+internal abstract class TextFieldMagnifierNode :
+    DelegatingNode(), OnGloballyPositionedModifier, DrawModifierNode, SemanticsModifierNode {
 
     abstract fun update(
         textFieldState: TransformedTextFieldState,
@@ -77,12 +75,13 @@
     }
 
     val selection = textFieldState.visualText.selection
-    val textOffset = when (selectionState.draggingHandle) {
-        null -> return Offset.Unspecified
-        Handle.Cursor,
-        Handle.SelectionStart -> selection.start
-        Handle.SelectionEnd -> selection.end
-    }
+    val textOffset =
+        when (selectionState.draggingHandle) {
+            null -> return Offset.Unspecified
+            Handle.Cursor,
+            Handle.SelectionStart -> selection.start
+            Handle.SelectionEnd -> selection.end
+        }
 
     // If the text hasn't been laid out yet, don't show the modifier.
     val layoutResult = textLayoutState.layoutResult ?: return Offset.Unspecified
@@ -104,8 +103,9 @@
     // It is very unlikely that this behavior would cause a flicker since magnifier immediately
     // shows up where the pointer is being dragged. The pointer needs to drag further than the half
     // of magnifier's width to hide by the following logic.
-    if (magnifierSize != IntSize.Zero &&
-        (dragX - centerX).absoluteValue > magnifierSize.width / 2) {
+    if (
+        magnifierSize != IntSize.Zero && (dragX - centerX).absoluteValue > magnifierSize.width / 2
+    ) {
         return Offset.Unspecified
     }
 
@@ -115,8 +115,8 @@
     val centerY = ((bottom - top) / 2) + top
 
     var offset = Offset(centerX, centerY)
-    textLayoutState.textLayoutNodeCoordinates?.takeIf { it.isAttached }?.let { innerCoordinates ->
-        offset = offset.coerceIn(innerCoordinates.visibleBounds())
-    }
+    textLayoutState.textLayoutNodeCoordinates
+        ?.takeIf { it.isAttached }
+        ?.let { innerCoordinates -> offset = offset.coerceIn(innerCoordinates.visibleBounds()) }
     return textLayoutState.fromTextLayoutToCore(offset)
 }
diff --git a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/input/internal/selection/TextFieldSelectionState.kt b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/input/internal/selection/TextFieldSelectionState.kt
index 0c74a29..b71bd31 100644
--- a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/input/internal/selection/TextFieldSelectionState.kt
+++ b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/input/internal/selection/TextFieldSelectionState.kt
@@ -109,24 +109,16 @@
     var isFocused: Boolean,
     private var isPassword: Boolean,
 ) {
-    /**
-     * [HapticFeedback] handle to perform haptic feedback.
-     */
+    /** [HapticFeedback] handle to perform haptic feedback. */
     private var hapticFeedBack: HapticFeedback? = null
 
-    /**
-     * [TextToolbar] to show floating toolbar(post-M) or primary toolbar(pre-M).
-     */
+    /** [TextToolbar] to show floating toolbar(post-M) or primary toolbar(pre-M). */
     private var textToolbar: TextToolbar? = null
 
-    /**
-     * [ClipboardManager] to perform clipboard features.
-     */
+    /** [ClipboardManager] to perform clipboard features. */
     private var clipboardManager: ClipboardManager? = null
 
-    /**
-     * Whether user is interacting with the UI in touch mode.
-     */
+    /** Whether user is interacting with the UI in touch mode. */
     var isInTouchMode: Boolean by mutableStateOf(true)
 
     /**
@@ -136,32 +128,29 @@
     var receiveContentConfiguration: (() -> ReceiveContentConfiguration?)? = null
 
     /**
-     * The position of text layout when dragging is started by a cursor or a selection handle.
-     * Total drag value needs to account for any auto scrolling that happens during dragging of a
-     * handle.
+     * The position of text layout when dragging is started by a cursor or a selection handle. Total
+     * drag value needs to account for any auto scrolling that happens during dragging of a handle.
      * This value is an anchor to calculate how much the text layout has moved in the window as
      * dragging continues. If a cursor or a selection handle is not dragging, this value needs to be
      * [Offset.Unspecified]. This includes long press and drag gesture defined on TextField.
      */
     private var startTextLayoutPositionInWindow by mutableStateOf(Offset.Unspecified)
 
-    /**
-     * Calculates the offset of currently visible bounds.
-     */
+    /** Calculates the offset of currently visible bounds. */
     private val currentTextLayoutPositionInWindow: Offset
         get() = textLayoutCoordinates?.positionInWindow() ?: Offset.Unspecified
 
     /**
-     * Current drag position of a handle for magnifier to read. Only one handle can be dragged
-     * at one time. This uses raw position as in only gesture start position and delta are used to
-     * calculate it. If auto-scroll happens due to selection changes while the gesture is active,
-     * it is not reflected on this value. See [handleDragPosition] for such a behavior.
+     * Current drag position of a handle for magnifier to read. Only one handle can be dragged at
+     * one time. This uses raw position as in only gesture start position and delta are used to
+     * calculate it. If auto-scroll happens due to selection changes while the gesture is active, it
+     * is not reflected on this value. See [handleDragPosition] for such a behavior.
      *
      * This value can reflect the drag position of either a real handle like cursor or selection or
      * an acting handle when long press dragging happens directly on the text field. However, these
-     * two systems (real and acting handles) use different coordinate systems. When real handles
-     * set this value, they send inner text field coordinates. On the other hand, long press and
-     * drag gesture defined on text field would send coordinates in the decoration coordinates.
+     * two systems (real and acting handles) use different coordinate systems. When real handles set
+     * this value, they send inner text field coordinates. On the other hand, long press and drag
+     * gesture defined on text field would send coordinates in the decoration coordinates.
      */
     private var rawHandleDragPosition by mutableStateOf(Offset.Unspecified)
 
@@ -175,30 +164,33 @@
      * represented in the same coordinate system.
      */
     val handleDragPosition: Offset
-        get() = when {
-            // nothing is being dragged.
-            rawHandleDragPosition.isUnspecified -> {
-                Offset.Unspecified
+        get() =
+            when {
+                // nothing is being dragged.
+                rawHandleDragPosition.isUnspecified -> {
+                    Offset.Unspecified
+                }
+                // no real handle is being dragged, we need to offset the drag position by current
+                // inner-decorator relative positioning.
+                startTextLayoutPositionInWindow.isUnspecified -> {
+                    textLayoutState.fromDecorationToTextLayout(rawHandleDragPosition)
+                }
+                // a cursor or a selection handle is being dragged, offset by comparing the current
+                // and starting text layout positions.
+                else -> {
+                    rawHandleDragPosition +
+                        (startTextLayoutPositionInWindow - currentTextLayoutPositionInWindow)
+                }
             }
-            // no real handle is being dragged, we need to offset the drag position by current
-            // inner-decorator relative positioning.
-            startTextLayoutPositionInWindow.isUnspecified -> {
-                textLayoutState.fromDecorationToTextLayout(rawHandleDragPosition)
-            }
-            // a cursor or a selection handle is being dragged, offset by comparing the current
-            // and starting text layout positions.
-            else -> {
-                rawHandleDragPosition +
-                    (startTextLayoutPositionInWindow - currentTextLayoutPositionInWindow)
-            }
-        }
 
-    /**
-     * Which selection handle is currently being dragged.
-     */
+    /** Which selection handle is currently being dragged. */
     var draggingHandle by mutableStateOf<Handle?>(null)
 
-    enum class InputType { None, Touch, Mouse }
+    enum class InputType {
+        None,
+        Touch,
+        Mouse
+    }
 
     /**
      * The initiator of the current drag directly on the text field. This does not include drags of
@@ -207,9 +199,7 @@
      */
     var directDragGestureInitiator: InputType by mutableStateOf(InputType.None)
 
-    /**
-     * Whether to show the cursor handle below cursor indicator when the TextField is focused.
-     */
+    /** Whether to show the cursor handle below cursor indicator when the TextField is focused. */
     private var showCursorHandle by mutableStateOf(false)
 
     /**
@@ -218,29 +208,24 @@
      */
     private var textToolbarState by mutableStateOf(None)
 
-    /**
-     * Access helper for text layout node coordinates that checks attached state.
-     */
+    /** Access helper for text layout node coordinates that checks attached state. */
     private val textLayoutCoordinates: LayoutCoordinates?
         get() = textLayoutState.textLayoutNodeCoordinates?.takeIf { it.isAttached }
 
-    /**
-     * Whether the contents of this TextField can be changed by the user.
-     */
+    /** Whether the contents of this TextField can be changed by the user. */
     private val editable: Boolean
         get() = enabled && !readOnly
 
     /**
      * The most recent [SelectionLayout] that passed the [SelectionLayout.shouldRecomputeSelection]
-     * check. Provides context to the next selection update such as if the selection is shrinking
-     * or not.
+     * check. Provides context to the next selection update such as if the selection is shrinking or
+     * not.
      */
     private var previousSelectionLayout: SelectionLayout? = null
 
     /**
-     * The previous offset of a drag, before selection adjustments.
-     * Only update when a selection layout change has occurred,
-     * or set to -1 if a new drag begins.
+     * The previous offset of a drag, before selection adjustments. Only update when a selection
+     * layout change has occurred, or set to -1 if a new drag begins.
      */
     private var previousRawDragOffset: Int = -1
 
@@ -267,12 +252,13 @@
         val notBeingDragged = directDragGestureInitiator == InputType.None
         val draggingHandle = draggingHandle
 
-        val visible = showCursorHandle &&
-            notBeingDragged &&
-            text.selection.collapsed &&
-            text.shouldShowSelection() &&
-            text.isNotEmpty() &&
-            (draggingHandle == Handle.Cursor || isCursorHandleInVisibleBounds())
+        val visible =
+            showCursorHandle &&
+                notBeingDragged &&
+                text.selection.collapsed &&
+                text.shouldShowSelection() &&
+                text.isNotEmpty() &&
+                (draggingHandle == Handle.Cursor || isCursorHandleInVisibleBounds())
 
         if (!visible) return TextFieldHandleState.Hidden
 
@@ -286,12 +272,11 @@
     }
 
     /**
-     * Whether currently cursor handle is in visible bounds. This function does not register a
-     * state read because every selection change is processed in layout phase by the auto-scroll
-     * behavior.
+     * Whether currently cursor handle is in visible bounds. This function does not register a state
+     * read because every selection change is processed in layout phase by the auto-scroll behavior.
      *
-     * We can say that whether cursor is in visible bounds or not only after giving auto-scroll
-     * time to process the cursor movement, and possibly scroll the cursor back into view. This is
+     * We can say that whether cursor is in visible bounds or not only after giving auto-scroll time
+     * to process the cursor movement, and possibly scroll the cursor back into view. This is
      * guaranteed to happen after scroll since new [textLayoutCoordinates] are reported after the
      * layout phase ends.
      */
@@ -316,19 +301,21 @@
         val cursorWidth = with(density) { DefaultCursorThickness.toPx() }
         // left and right values in cursorRect should be the same but in any case use the
         // logically correct anchor.
-        val cursorCenterX = if (layoutResult.layoutInput.layoutDirection == LayoutDirection.Ltr) {
-            (cursorRect.left + cursorWidth / 2)
-        } else {
-            (cursorRect.right - cursorWidth / 2)
-        }
+        val cursorCenterX =
+            if (layoutResult.layoutInput.layoutDirection == LayoutDirection.Ltr) {
+                (cursorRect.left + cursorWidth / 2)
+            } else {
+                (cursorRect.right - cursorWidth / 2)
+            }
 
         // don't let cursor go beyond the bounds of text layout node or cursor will be clipped.
         // but also make sure that empty Text Layout still draws a cursor.
-        val coercedCursorCenterX = cursorCenterX
-            // do not use coerceIn because it is not guaranteed that minimum value is smaller
-            // than the maximum value.
-            .coerceAtMost(layoutResult.size.width - cursorWidth / 2)
-            .coerceAtLeast(cursorWidth / 2)
+        val coercedCursorCenterX =
+            cursorCenterX
+                // do not use coerceIn because it is not guaranteed that minimum value is smaller
+                // than the maximum value.
+                .coerceAtMost(layoutResult.size.width - cursorWidth / 2)
+                .coerceAtLeast(cursorWidth / 2)
 
         return Rect(
             left = coercedCursorCenterX - cursorWidth / 2,
@@ -359,53 +346,45 @@
         this.isPassword = isPassword
     }
 
-    /**
-     * Implements the complete set of gestures supported by the cursor handle.
-     */
+    /** Implements the complete set of gestures supported by the cursor handle. */
     suspend fun PointerInputScope.cursorHandleGestures() {
         coroutineScope {
+            launch(start = CoroutineStart.UNDISPATCHED) { detectTouchMode() }
+            launch(start = CoroutineStart.UNDISPATCHED) { detectCursorHandleDragGestures() }
             launch(start = CoroutineStart.UNDISPATCHED) {
-                detectTouchMode()
-            }
-            launch(start = CoroutineStart.UNDISPATCHED) {
-                detectCursorHandleDragGestures()
-            }
-            launch(start = CoroutineStart.UNDISPATCHED) {
-                detectTapGestures(onTap = {
-                    textToolbarState = if (textToolbarState == Cursor) {
-                        None
-                    } else {
-                        Cursor
+                detectTapGestures(
+                    onTap = {
+                        textToolbarState =
+                            if (textToolbarState == Cursor) {
+                                None
+                            } else {
+                                Cursor
+                            }
                     }
-                })
+                )
             }
         }
     }
 
-    /**
-     * Gesture detector for dragging the selection handles to change the selection in TextField.
-     */
+    /** Gesture detector for dragging the selection handles to change the selection in TextField. */
     suspend fun PointerInputScope.selectionHandleGestures(isStartHandle: Boolean) {
         coroutineScope {
-            launch(start = CoroutineStart.UNDISPATCHED) {
-                detectTouchMode()
-            }
+            launch(start = CoroutineStart.UNDISPATCHED) { detectTouchMode() }
             launch(start = CoroutineStart.UNDISPATCHED) {
                 detectPressDownGesture(
                     onDown = {
                         markStartContentVisibleOffset()
                         updateHandleDragging(
-                            handle = if (isStartHandle) {
-                                Handle.SelectionStart
-                            } else {
-                                Handle.SelectionEnd
-                            },
+                            handle =
+                                if (isStartHandle) {
+                                    Handle.SelectionStart
+                                } else {
+                                    Handle.SelectionEnd
+                                },
                             position = getAdjustedCoordinates(getHandlePosition(isStartHandle))
                         )
                     },
-                    onUp = {
-                        clearHandleDragging()
-                    }
+                    onUp = { clearHandleDragging() }
                 )
             }
             launch(start = CoroutineStart.UNDISPATCHED) {
@@ -446,8 +425,8 @@
 
     /**
      * Detects the current pointer type in this [PointerInputScope] to update the touch mode state.
-     * This helper gesture detector should be added to all TextField pointer input receivers such
-     * as TextFieldDecorator, cursor handle, and selection handles.
+     * This helper gesture detector should be added to all TextField pointer input receivers such as
+     * TextFieldDecorator, cursor handle, and selection handles.
      */
     suspend fun PointerInputScope.detectTouchMode() {
         awaitPointerEventScope {
@@ -503,11 +482,12 @@
                         }
                         val success = tryAwaitRelease()
                         pressInteraction?.let { pressInteraction ->
-                            val endInteraction = if (success) {
-                                PressInteraction.Release(pressInteraction)
-                            } else {
-                                PressInteraction.Cancel(pressInteraction)
-                            }
+                            val endInteraction =
+                                if (success) {
+                                    PressInteraction.Release(pressInteraction)
+                                } else {
+                                    PressInteraction.Cancel(pressInteraction)
+                                }
                             interactionSource.emit(endInteraction)
                         }
                         pressInteraction = null
@@ -518,16 +498,16 @@
     }
 
     /**
-     * Calculates the valid cursor position nearest to [offset] and sets the cursor to it.
-     * Takes into account text transformations ([TransformedTextFieldState]) to avoid putting the
-     * cursor in the middle of replacements.
+     * Calculates the valid cursor position nearest to [offset] and sets the cursor to it. Takes
+     * into account text transformations ([TransformedTextFieldState]) to avoid putting the cursor
+     * in the middle of replacements.
      *
      * If the cursor would end up in the middle of an insertion or replacement, it is instead pushed
      * to the nearest edge of the wedge to the [offset].
      *
-     * @param offset Where the cursor is in text layout coordinates. If the caller has the offset
-     * in decorator coordinates, [TextLayoutState.fromDecorationToTextLayout] can be used to convert
-     * between the two spaces.
+     * @param offset Where the cursor is in text layout coordinates. If the caller has the offset in
+     *   decorator coordinates, [TextLayoutState.fromDecorationToTextLayout] can be used to convert
+     *   between the two spaces.
      * @return true if the cursor moved, false if the cursor position did not need to change.
      */
     private fun placeCursorAtNearestOffset(offset: Offset): Boolean {
@@ -555,15 +535,14 @@
                     Insertion -> {
                         val wedgeStartCursorRect = layoutResult.getCursorRect(retransformed.start)
                         val wedgeEndCursorRect = layoutResult.getCursorRect(retransformed.end)
-                        newAffinity = if (offset.findClosestRect(
-                                wedgeStartCursorRect,
-                                wedgeEndCursorRect
-                            ) < 0
-                        ) {
-                            SelectionWedgeAffinity(WedgeAffinity.Start)
-                        } else {
-                            SelectionWedgeAffinity(WedgeAffinity.End)
-                        }
+                        newAffinity =
+                            if (
+                                offset.findClosestRect(wedgeStartCursorRect, wedgeEndCursorRect) < 0
+                            ) {
+                                SelectionWedgeAffinity(WedgeAffinity.Start)
+                            } else {
+                                SelectionWedgeAffinity(WedgeAffinity.End)
+                            }
                         untransformed.start
                     }
 
@@ -583,16 +562,15 @@
         val untransformedCursorRange = TextRange(untransformedCursor)
 
         // Nothing changed, skip onValueChange and hapticFeedback.
-        if (untransformedCursorRange == textFieldState.untransformedText.selection &&
-            (newAffinity == null || newAffinity == textFieldState.selectionWedgeAffinity)
+        if (
+            untransformedCursorRange == textFieldState.untransformedText.selection &&
+                (newAffinity == null || newAffinity == textFieldState.selectionWedgeAffinity)
         ) {
             return false
         }
 
         textFieldState.selectUntransformedCharsIn(untransformedCursorRange)
-        newAffinity?.let {
-            textFieldState.selectionWedgeAffinity = it
-        }
+        newAffinity?.let { textFieldState.selectionWedgeAffinity = it }
         return true
     }
 
@@ -623,16 +601,17 @@
                 onDragEnd = { onDragStop() },
                 onDragCancel = { onDragStop() },
                 onDrag = onDrag@{ change, dragAmount ->
-                    cursorDragDelta += dragAmount
+                        cursorDragDelta += dragAmount
 
-                    updateHandleDragging(Handle.Cursor, cursorDragStart + cursorDragDelta)
+                        updateHandleDragging(Handle.Cursor, cursorDragStart + cursorDragDelta)
 
-                    if (placeCursorAtNearestOffset(handleDragPosition)) {
-                        change.consume()
-                        // TODO: only perform haptic feedback if filter does not override the change
-                        hapticFeedBack?.performHapticFeedback(HapticFeedbackType.TextHandleMove)
+                        if (placeCursorAtNearestOffset(handleDragPosition)) {
+                            change.consume()
+                            // TODO: only perform haptic feedback if filter does not override the
+                            // change
+                            hapticFeedBack?.performHapticFeedback(HapticFeedbackType.TextHandleMove)
+                        }
                     }
-                }
             )
         } finally {
             onDragStop()
@@ -648,14 +627,13 @@
      *     * Subsequent quick taps still act as a double tap.
      * * Mouse
      *     * Clicks immediately start a selection and begins detecting drags:
-     *         * 1 -> click creates collapsed selection (places cursor) drags select individual
-     *           chars.
+     *         * 1 -> click creates collapsed selection (places cursor) drags select individual chars.
      *         * 2 -> click selects current word, drags select words.
      *         * 3+ -> click selects current paragraph, drags select paragraphs.
      *
      * Notably does *not* include:
-     * * Single taps from any source. This is handled by [detectTextFieldTapGestures].
-     *   Only exception is the first mouse down does immediately place the cursor at the position.
+     * * Single taps from any source. This is handled by [detectTextFieldTapGestures]. Only
+     *   exception is the first mouse down does immediately place the cursor at the position.
      */
     suspend fun PointerInputScope.textFieldSelectionGestures(requestFocus: () -> Unit) {
         selectionGesturePointerInputBtf2(
@@ -664,9 +642,8 @@
         )
     }
 
-    private inner class TextFieldMouseSelectionObserver(
-        private val requestFocus: () -> Unit
-    ) : MouseSelectionObserver {
+    private inner class TextFieldMouseSelectionObserver(private val requestFocus: () -> Unit) :
+        MouseSelectionObserver {
         private var dragBeginOffsetInText = -1
         private var dragBeginPosition: Offset = Offset.Unspecified
 
@@ -699,26 +676,29 @@
             adjustment: SelectionAdjustment,
             isStartOfSelection: Boolean,
         ): TextRange {
-            val startOffset: Int = dragBeginOffsetInText.takeIf { it >= 0 }
-                ?: textLayoutState.getOffsetForPosition(
-                    position = dragBeginPosition,
+            val startOffset: Int =
+                dragBeginOffsetInText.takeIf { it >= 0 }
+                    ?: textLayoutState.getOffsetForPosition(
+                        position = dragBeginPosition,
+                        coerceInVisibleBounds = false
+                    )
+
+            val endOffset: Int =
+                textLayoutState.getOffsetForPosition(
+                    position = dragPosition,
                     coerceInVisibleBounds = false
                 )
 
-            val endOffset: Int = textLayoutState.getOffsetForPosition(
-                position = dragPosition,
-                coerceInVisibleBounds = false
-            )
-
-            var newSelection = updateSelection(
-                textFieldCharSequence = textFieldState.visualText,
-                startOffset = startOffset,
-                endOffset = endOffset,
-                isStartHandle = false,
-                adjustment = adjustment,
-                allowPreviousSelectionCollapsed = false,
-                isStartOfSelection = isStartOfSelection,
-            )
+            var newSelection =
+                updateSelection(
+                    textFieldCharSequence = textFieldState.visualText,
+                    startOffset = startOffset,
+                    endOffset = endOffset,
+                    isStartHandle = false,
+                    adjustment = adjustment,
+                    allowPreviousSelectionCollapsed = false,
+                    isStartOfSelection = isStartOfSelection,
+                )
 
             // When drag starts from the end padding, we eventually need to update the start
             // point once a selection is initiated. Otherwise, startOffset is always calculated
@@ -759,9 +739,8 @@
         }
     }
 
-    private inner class TextFieldTextDragObserver(
-        private val requestFocus: () -> Unit
-    ) : TextDragObserver {
+    private inner class TextFieldTextDragObserver(private val requestFocus: () -> Unit) :
+        TextDragObserver {
         private var dragBeginOffsetInText = -1
         private var dragBeginPosition: Offset = Offset.Unspecified
         private var dragTotalDistance: Offset = Offset.Zero
@@ -783,8 +762,11 @@
         }
 
         override fun onDown(point: Offset) = Unit
+
         override fun onUp() = Unit
+
         override fun onStop() = onDragStop()
+
         override fun onCancel() = onDragStop()
 
         override fun onStart(startPoint: Offset) {
@@ -792,10 +774,7 @@
             logDebug { "Touch.onDragStart after longPress at $startPoint" }
             // this gesture detector is applied on the decoration box. We do not need to
             // convert the gesture offset, that's going to be calculated by [handleDragPosition]
-            updateHandleDragging(
-                handle = actingHandle,
-                position = startPoint
-            )
+            updateHandleDragging(handle = actingHandle, position = startPoint)
 
             showCursorHandle = false
             directDragGestureInitiator = InputType.Touch
@@ -815,18 +794,17 @@
             } else {
                 if (textFieldState.visualText.isEmpty()) return
                 val offset = textLayoutState.getOffsetForPosition(startPoint)
-                val newSelection = updateSelection(
-                    // reset selection, otherwise a previous selection may be used
-                    // as context for creating the next selection
-                    textFieldCharSequence = TextFieldCharSequence(
-                        textFieldState.visualText,
-                        TextRange.Zero
-                    ),
-                    startOffset = offset,
-                    endOffset = offset,
-                    isStartHandle = false,
-                    adjustment = SelectionAdjustment.Word,
-                )
+                val newSelection =
+                    updateSelection(
+                        // reset selection, otherwise a previous selection may be used
+                        // as context for creating the next selection
+                        textFieldCharSequence =
+                            TextFieldCharSequence(textFieldState.visualText, TextRange.Zero),
+                        startOffset = offset,
+                        endOffset = offset,
+                        isStartHandle = false,
+                        adjustment = SelectionAdjustment.Word,
+                    )
                 textFieldState.selectCharsIn(newSelection)
                 updateTextToolbarState(Selection)
 
@@ -856,27 +834,30 @@
 
             if (
                 dragBeginOffsetInText < 0 && // drag started in end padding
-                !textLayoutState.isPositionOnText(currentDragPosition) // still in end padding
+                    !textLayoutState.isPositionOnText(currentDragPosition) // still in end padding
             ) {
                 startOffset = textLayoutState.getOffsetForPosition(dragBeginPosition)
                 endOffset = textLayoutState.getOffsetForPosition(currentDragPosition)
 
-                adjustment = if (startOffset == endOffset) {
-                    // start and end is in the same end padding, keep the collapsed selection
-                    SelectionAdjustment.None
-                } else {
-                    SelectionAdjustment.Word
-                }
+                adjustment =
+                    if (startOffset == endOffset) {
+                        // start and end is in the same end padding, keep the collapsed selection
+                        SelectionAdjustment.None
+                    } else {
+                        SelectionAdjustment.Word
+                    }
             } else {
-                startOffset = dragBeginOffsetInText.takeIf { it >= 0 }
-                    ?: textLayoutState.getOffsetForPosition(
-                        position = dragBeginPosition,
+                startOffset =
+                    dragBeginOffsetInText.takeIf { it >= 0 }
+                        ?: textLayoutState.getOffsetForPosition(
+                            position = dragBeginPosition,
+                            coerceInVisibleBounds = false
+                        )
+                endOffset =
+                    textLayoutState.getOffsetForPosition(
+                        position = currentDragPosition,
                         coerceInVisibleBounds = false
                     )
-                endOffset = textLayoutState.getOffsetForPosition(
-                    position = currentDragPosition,
-                    coerceInVisibleBounds = false
-                )
 
                 if (dragBeginOffsetInText < 0 && startOffset == endOffset) {
                     // if we are selecting starting from end padding,
@@ -889,14 +870,15 @@
             }
 
             val prevSelection = textFieldState.visualText.selection
-            var newSelection = updateSelection(
-                textFieldCharSequence = textFieldState.visualText,
-                startOffset = startOffset,
-                endOffset = endOffset,
-                isStartHandle = false,
-                adjustment = adjustment,
-                allowPreviousSelectionCollapsed = false,
-            )
+            var newSelection =
+                updateSelection(
+                    textFieldCharSequence = textFieldState.visualText,
+                    startOffset = startOffset,
+                    endOffset = endOffset,
+                    isStartHandle = false,
+                    adjustment = adjustment,
+                    allowPreviousSelectionCollapsed = false,
+                )
 
             // When drag starts from the end padding, we eventually need to update the start
             // point once a selection is initiated. Otherwise, startOffset is always calculated
@@ -927,23 +909,22 @@
                 // - If both change, find the middle point and see how it moves.
                 //   - If middle point moves right, acting handle is SelectionEnd
                 //   - Otherwise, acting handle is SelectionStart
-                actingHandle = when {
-                    newSelection.start != prevSelection.start &&
-                        newSelection.end == prevSelection.end -> Handle.SelectionStart
-
-                    newSelection.start == prevSelection.start &&
-                        newSelection.end != prevSelection.end -> Handle.SelectionEnd
-
-                    else -> {
-                        val newMiddle = (newSelection.start + newSelection.end) / 2f
-                        val prevMiddle = (prevSelection.start + prevSelection.end) / 2f
-                        if (newMiddle > prevMiddle) {
-                            Handle.SelectionEnd
-                        } else {
-                            Handle.SelectionStart
+                actingHandle =
+                    when {
+                        newSelection.start != prevSelection.start &&
+                            newSelection.end == prevSelection.end -> Handle.SelectionStart
+                        newSelection.start == prevSelection.start &&
+                            newSelection.end != prevSelection.end -> Handle.SelectionEnd
+                        else -> {
+                            val newMiddle = (newSelection.start + newSelection.end) / 2f
+                            val prevMiddle = (prevSelection.start + prevSelection.end) / 2f
+                            if (newMiddle > prevMiddle) {
+                                Handle.SelectionEnd
+                            } else {
+                                Handle.SelectionStart
+                            }
                         }
                     }
-                }
             }
 
             // Do not allow selection to collapse on itself while dragging. Selection can
@@ -951,10 +932,7 @@
             if (prevSelection.collapsed || !newSelection.collapsed) {
                 textFieldState.selectCharsIn(newSelection)
             }
-            updateHandleDragging(
-                handle = actingHandle,
-                position = currentDragPosition
-            )
+            updateHandleDragging(handle = actingHandle, position = currentDragPosition)
         }
     }
 
@@ -995,37 +973,40 @@
                 onDragEnd = { onDragStop() },
                 onDragCancel = { onDragStop() },
                 onDrag = onDrag@{ _, delta ->
-                    dragTotalDistance += delta
-                    val layoutResult = textLayoutState.layoutResult ?: return@onDrag
+                        dragTotalDistance += delta
+                        val layoutResult = textLayoutState.layoutResult ?: return@onDrag
 
-                    updateHandleDragging(handle, dragBeginPosition + dragTotalDistance)
+                        updateHandleDragging(handle, dragBeginPosition + dragTotalDistance)
 
-                    val startOffset = if (isStartHandle) {
-                        layoutResult.getOffsetForPosition(handleDragPosition)
-                    } else {
-                        textFieldState.visualText.selection.start
+                        val startOffset =
+                            if (isStartHandle) {
+                                layoutResult.getOffsetForPosition(handleDragPosition)
+                            } else {
+                                textFieldState.visualText.selection.start
+                            }
+
+                        val endOffset =
+                            if (isStartHandle) {
+                                textFieldState.visualText.selection.end
+                            } else {
+                                layoutResult.getOffsetForPosition(handleDragPosition)
+                            }
+
+                        val prevSelection = textFieldState.visualText.selection
+                        val newSelection =
+                            updateSelection(
+                                textFieldCharSequence = textFieldState.visualText,
+                                startOffset = startOffset,
+                                endOffset = endOffset,
+                                isStartHandle = isStartHandle,
+                                adjustment = SelectionAdjustment.CharacterWithWordAccelerate,
+                            )
+                        // Do not allow selection to collapse on itself while dragging selection
+                        // handles. Selection can reverse but does not collapse.
+                        if (prevSelection.collapsed || !newSelection.collapsed) {
+                            textFieldState.selectCharsIn(newSelection)
+                        }
                     }
-
-                    val endOffset = if (isStartHandle) {
-                        textFieldState.visualText.selection.end
-                    } else {
-                        layoutResult.getOffsetForPosition(handleDragPosition)
-                    }
-
-                    val prevSelection = textFieldState.visualText.selection
-                    val newSelection = updateSelection(
-                        textFieldCharSequence = textFieldState.visualText,
-                        startOffset = startOffset,
-                        endOffset = endOffset,
-                        isStartHandle = isStartHandle,
-                        adjustment = SelectionAdjustment.CharacterWithWordAccelerate,
-                    )
-                    // Do not allow selection to collapse on itself while dragging selection
-                    // handles. Selection can reverse but does not collapse.
-                    if (prevSelection.collapsed || !newSelection.collapsed) {
-                        textFieldState.selectCharsIn(newSelection)
-                    }
-                }
             )
         } finally {
             logDebug {
@@ -1053,69 +1034,72 @@
     /**
      * Manages the visibility of text toolbar according to current state and received events from
      * various sources.
-     *
      * - Tapping the cursor handle toggles the visibility of the toolbar [TextToolbarState.Cursor].
      * - Dragging the cursor handle or selection handles temporarily hides the toolbar
-     * [draggingHandle].
+     *   [draggingHandle].
      * - Tapping somewhere on the TextField, whether it causes a cursor position change or not,
-     * fully hides the toolbar [TextToolbarState.None].
+     *   fully hides the toolbar [TextToolbarState.None].
      * - When cursor or selection leaves the visible bounds, text toolbar is temporarily hidden.
-     * [getContentRect]
+     *   [getContentRect]
      * - When selection is initiated via long press, double click, or semantics, text toolbar shows
-     * [TextToolbarState.Selection]
+     *   [TextToolbarState.Selection]
      */
     private suspend fun observeTextToolbarVisibility() {
         snapshotFlow {
-            val isCollapsed = textFieldState.visualText.selection.collapsed
-            val textToolbarStateVisible =
-                isCollapsed && textToolbarState == Cursor ||
-                    !isCollapsed && textToolbarState == Selection
+                val isCollapsed = textFieldState.visualText.selection.collapsed
+                val textToolbarStateVisible =
+                    isCollapsed && textToolbarState == Cursor ||
+                        !isCollapsed && textToolbarState == Selection
 
-            val textToolbarVisible =
-                // toolbar is requested specifically for the current selection state
-                textToolbarStateVisible &&
-                    draggingHandle == null && // not dragging any selection handles
-                    isInTouchMode // toolbar hidden when not in touch mode
+                val textToolbarVisible =
+                    // toolbar is requested specifically for the current selection state
+                    textToolbarStateVisible &&
+                        draggingHandle == null && // not dragging any selection handles
+                        isInTouchMode // toolbar hidden when not in touch mode
 
-            // final visibility decision is made by contentRect visibility.
-            // if contentRect is not in visible bounds, just pass Rect.Zero to the observer so that
-            // it hides the toolbar. If Rect is successfully passed to the observer, toolbar will
-            // be displayed.
-            if (!textToolbarVisible) {
-                Rect.Zero
-            } else {
-                // contentRect is calculated in root coordinates. VisibleBounds are in
-                // textLayoutCoordinates. Convert visibleBounds to root before checking the overlap.
-                val visibleBounds = textLayoutCoordinates?.visibleBounds()
-                if (visibleBounds != null) {
-                    val visibleBoundsTopLeftInRoot =
-                        textLayoutCoordinates?.localToRoot(visibleBounds.topLeft)
-                    val visibleBoundsInRoot =
-                        Rect(visibleBoundsTopLeftInRoot!!, visibleBounds.size)
-
-                    // contentRect can be very wide if a big part of text is selected. Our toolbar
-                    // should be aligned only to visible region.
-                    getContentRect()
-                        .takeIf { visibleBoundsInRoot.overlaps(it) }
-                        ?.intersect(visibleBoundsInRoot)
-                        ?: Rect.Zero
-                } else {
+                // final visibility decision is made by contentRect visibility.
+                // if contentRect is not in visible bounds, just pass Rect.Zero to the observer so
+                // that
+                // it hides the toolbar. If Rect is successfully passed to the observer, toolbar
+                // will
+                // be displayed.
+                if (!textToolbarVisible) {
                     Rect.Zero
+                } else {
+                    // contentRect is calculated in root coordinates. VisibleBounds are in
+                    // textLayoutCoordinates. Convert visibleBounds to root before checking the
+                    // overlap.
+                    val visibleBounds = textLayoutCoordinates?.visibleBounds()
+                    if (visibleBounds != null) {
+                        val visibleBoundsTopLeftInRoot =
+                            textLayoutCoordinates?.localToRoot(visibleBounds.topLeft)
+                        val visibleBoundsInRoot =
+                            Rect(visibleBoundsTopLeftInRoot!!, visibleBounds.size)
+
+                        // contentRect can be very wide if a big part of text is selected. Our
+                        // toolbar
+                        // should be aligned only to visible region.
+                        getContentRect()
+                            .takeIf { visibleBoundsInRoot.overlaps(it) }
+                            ?.intersect(visibleBoundsInRoot) ?: Rect.Zero
+                    } else {
+                        Rect.Zero
+                    }
                 }
             }
-        }.collect { rect ->
-            if (rect == Rect.Zero) {
-                hideTextToolbar()
-            } else {
-                showTextToolbar(rect)
+            .collect { rect ->
+                if (rect == Rect.Zero) {
+                    hideTextToolbar()
+                } else {
+                    showTextToolbar(rect)
+                }
             }
-        }
     }
 
     /**
-     * Calculate selected region as [Rect]. The top is the top of the first selected
-     * line, and the bottom is the bottom of the last selected line. The left is the leftmost
-     * handle's horizontal coordinates, and the right is the rightmost handle's coordinates.
+     * Calculate selected region as [Rect]. The top is the top of the first selected line, and the
+     * bottom is the bottom of the last selected line. The left is the leftmost handle's horizontal
+     * coordinates, and the right is the rightmost handle's coordinates.
      */
     private fun getContentRect(): Rect {
         val text = textFieldState.visualText
@@ -1127,28 +1111,26 @@
             val topLeft = textLayoutCoordinates?.localToRoot(cursorRect.topLeft) ?: Offset.Zero
             return Rect(topLeft, cursorRect.size)
         }
-        val startOffset =
-            textLayoutCoordinates?.localToRoot(getHandlePosition(true)) ?: Offset.Zero
-        val endOffset =
-            textLayoutCoordinates?.localToRoot(getHandlePosition(false)) ?: Offset.Zero
+        val startOffset = textLayoutCoordinates?.localToRoot(getHandlePosition(true)) ?: Offset.Zero
+        val endOffset = textLayoutCoordinates?.localToRoot(getHandlePosition(false)) ?: Offset.Zero
         val startTop =
-            textLayoutCoordinates?.localToRoot(
-                Offset(
-                    0f,
-                    textLayoutState.layoutResult?.getCursorRect(
-                        text.selection.start
-                    )?.top ?: 0f
+            textLayoutCoordinates
+                ?.localToRoot(
+                    Offset(
+                        0f,
+                        textLayoutState.layoutResult?.getCursorRect(text.selection.start)?.top ?: 0f
+                    )
                 )
-            )?.y ?: 0f
+                ?.y ?: 0f
         val endTop =
-            textLayoutCoordinates?.localToRoot(
-                Offset(
-                    0f,
-                    textLayoutState.layoutResult?.getCursorRect(
-                        text.selection.end
-                    )?.top ?: 0f
+            textLayoutCoordinates
+                ?.localToRoot(
+                    Offset(
+                        0f,
+                        textLayoutState.layoutResult?.getCursorRect(text.selection.end)?.top ?: 0f
+                    )
                 )
-            )?.y ?: 0f
+                ?.y ?: 0f
 
         return Rect(
             left = min(startOffset.x, endOffset.x),
@@ -1178,8 +1160,10 @@
 
         val position = getHandlePosition(isStartHandle)
 
-        val visible = directDragGestureInitiator == InputType.None && (draggingHandle == handle ||
-            (textLayoutCoordinates?.visibleBounds()?.containsInclusive(position) ?: false))
+        val visible =
+            directDragGestureInitiator == InputType.None &&
+                (draggingHandle == handle ||
+                    (textLayoutCoordinates?.visibleBounds()?.containsInclusive(position) ?: false))
 
         if (!visible) return TextFieldHandleState.Hidden
 
@@ -1193,11 +1177,12 @@
         // we let it stay on the screen to maintain gesture continuation. However, we still want
         // to coerce handle's position to visible bounds to not let it jitter while scrolling the
         // TextField as the selection is expanding.
-        val coercedPosition = if (includePosition) {
-            textLayoutCoordinates?.visibleBounds()?.let { position.coerceIn(it) } ?: position
-        } else {
-            Offset.Unspecified
-        }
+        val coercedPosition =
+            if (includePosition) {
+                textLayoutCoordinates?.visibleBounds()?.let { position.coerceIn(it) } ?: position
+            } else {
+                Offset.Unspecified
+            }
         return TextFieldHandleState(
             visible = true,
             position = coercedPosition,
@@ -1209,11 +1194,12 @@
     private fun getHandlePosition(isStartHandle: Boolean): Offset {
         val layoutResult = textLayoutState.layoutResult ?: return Offset.Zero
         val selection = textFieldState.visualText.selection
-        val offset = if (isStartHandle) {
-            selection.start
-        } else {
-            selection.end
-        }
+        val offset =
+            if (isStartHandle) {
+                selection.start
+            } else {
+                selection.end
+            }
         return getSelectionHandleCoordinates(
             textLayoutResult = layoutResult,
             offset = offset,
@@ -1229,26 +1215,21 @@
      * @param handle A real or acting handle that specifies which one is being dragged.
      * @param position Where the handle currently is
      */
-    fun updateHandleDragging(
-        handle: Handle,
-        position: Offset
-    ) {
+    fun updateHandleDragging(handle: Handle, position: Offset) {
         draggingHandle = handle
         rawHandleDragPosition = position
     }
 
     /**
-     * When a Selection or Cursor Handle starts being dragged, this function should be called
-     * to mark the current visible offset, so that if content gets scrolled during the drag, we
-     * can correctly offset the actual position where drag corresponds to.
+     * When a Selection or Cursor Handle starts being dragged, this function should be called to
+     * mark the current visible offset, so that if content gets scrolled during the drag, we can
+     * correctly offset the actual position where drag corresponds to.
      */
     private fun markStartContentVisibleOffset() {
         startTextLayoutPositionInWindow = currentTextLayoutPositionInWindow
     }
 
-    /**
-     * Call this function when a selection or cursor handle is stopped dragging.
-     */
+    /** Call this function when a selection or cursor handle is stopped dragging. */
     fun clearHandleDragging() {
         draggingHandle = null
         rawHandleDragPosition = Offset.Unspecified
@@ -1256,9 +1237,9 @@
     }
 
     /**
-     * Whether a copy operation can execute now and modify the clipboard.
-     * The paste operation requires the selection to not be collapsed,
-     * the text field to be editable, and for it to NOT be a password.
+     * Whether a copy operation can execute now and modify the clipboard. The paste operation
+     * requires the selection to not be collapsed, the text field to be editable, and for it to NOT
+     * be a password.
      */
     fun canCut(): Boolean =
         !textFieldState.visualText.selection.collapsed && editable && !isPassword
@@ -1266,11 +1247,10 @@
     /**
      * The method for cutting text.
      *
-     * If there is no selection, return.
-     * Put the selected text into the [ClipboardManager].
-     * The new text should be the text before the selection plus the text after the selection.
-     * And the new cursor offset should be between the text before the selection, and the text
-     * after the selection.
+     * If there is no selection, return. Put the selected text into the [ClipboardManager]. The new
+     * text should be the text before the selection plus the text after the selection. And the new
+     * cursor offset should be between the text before the selection, and the text after the
+     * selection.
      */
     fun cut() {
         val text = textFieldState.visualText
@@ -1282,21 +1262,18 @@
     }
 
     /**
-     * Whether a copy operation can execute now and modify the clipboard.
-     * The copy operation requires the selection to not be collapsed,
-     * and the text field to NOT be a password.
+     * Whether a copy operation can execute now and modify the clipboard. The copy operation
+     * requires the selection to not be collapsed, and the text field to NOT be a password.
      */
     fun canCopy(): Boolean = !textFieldState.visualText.selection.collapsed && !isPassword
 
     /**
      * The method for copying text.
      *
-     * If there is no selection, return.
-     * Put the selected text into the [ClipboardManager], and cancel the selection, if
-     * [cancelSelection] is true.
-     * The text in the text field should be unchanged.
-     * If [cancelSelection] is true, the new cursor offset should be at the end of the previous
-     * selected text.
+     * If there is no selection, return. Put the selected text into the [ClipboardManager], and
+     * cancel the selection, if [cancelSelection] is true. The text in the text field should be
+     * unchanged. If [cancelSelection] is true, the new cursor offset should be at the end of the
+     * previous selected text.
      */
     fun copy(cancelSelection: Boolean = true) {
         val text = textFieldState.visualText
@@ -1310,9 +1287,8 @@
     }
 
     /**
-     * Whether a paste operation can execute now and have a meaningful effect.
-     * The paste operation requires the text field to be editable,
-     * and the clipboard manager to have content to paste.
+     * Whether a paste operation can execute now and have a meaningful effect. The paste operation
+     * requires the text field to be editable, and the clipboard manager to have content to paste.
      */
     fun canPaste(): Boolean {
         if (!editable) return false
@@ -1323,19 +1299,20 @@
     }
 
     fun paste() {
-        val receiveContentConfiguration = receiveContentConfiguration?.invoke()
-            ?: return pasteAsPlainText()
+        val receiveContentConfiguration =
+            receiveContentConfiguration?.invoke() ?: return pasteAsPlainText()
 
         val clipEntry = clipboardManager?.getClip() ?: return pasteAsPlainText()
         val clipMetadata = clipEntry.clipMetadata
 
-        val remaining = receiveContentConfiguration.receiveContentListener.onReceive(
-            TransferableContent(
-                clipEntry = clipEntry,
-                source = TransferableContent.Source.Clipboard,
-                clipMetadata = clipMetadata
+        val remaining =
+            receiveContentConfiguration.receiveContentListener.onReceive(
+                TransferableContent(
+                    clipEntry = clipEntry,
+                    source = TransferableContent.Source.Clipboard,
+                    clipMetadata = clipMetadata
+                )
             )
-        )
 
         // TODO(halilibo): this is not 1-to-1 compatible with ClipboardManager.getText() which
         //  returns an AnnotatedString and supports copy-pasting AnnotatedStrings inside the app.
@@ -1350,11 +1327,10 @@
     /**
      * The method for pasting text.
      *
-     * Get the text from [ClipboardManager]. If it's null, return.
-     * The new content should be the text before the selected text, plus the text from the
-     * [ClipboardManager], and plus the text after the selected text.
-     * Then the selection should collapse, and the new cursor offset should be at the end of the
-     * newly added text.
+     * Get the text from [ClipboardManager]. If it's null, return. The new content should be the
+     * text before the selected text, plus the text from the [ClipboardManager], and plus the text
+     * after the selected text. Then the selection should collapse, and the new cursor offset should
+     * be at the end of the newly added text.
      */
     private fun pasteAsPlainText() {
         val clipboardText = clipboardManager?.getText()?.text ?: return
@@ -1366,9 +1342,8 @@
     }
 
     /**
-     * Whether a select all operation can execute now and have a meaningful effect.
-     * The select all operation requires the selection to not already be selecting the
-     * entire text field.
+     * Whether a select all operation can execute now and have a meaningful effect. The select all
+     * operation requires the selection to not already be selecting the entire text field.
      */
     fun canSelectAll(): Boolean =
         textFieldState.visualText.selection.length != textFieldState.visualText.length
@@ -1383,9 +1358,9 @@
     }
 
     /**
-     * This function get the selected region as a Rectangle region, and pass it to [TextToolbar]
-     * to make the FloatingToolbar show up in the proper place. In addition, this function passes
-     * the copy, paste and cut method as callbacks when "copy", "cut" or "paste" is clicked.
+     * This function get the selected region as a Rectangle region, and pass it to [TextToolbar] to
+     * make the FloatingToolbar show up in the proper place. In addition, this function passes the
+     * copy, paste and cut method as callbacks when "copy", "cut" or "paste" is clicked.
      *
      * @param contentRect Rectangle region where the toolbar will be anchored.
      */
@@ -1396,9 +1371,7 @@
             onCopyRequested = menuItem(canCopy(), None) { copy() },
             onPasteRequested = menuItem(canPaste(), None) { paste() },
             onCutRequested = menuItem(canCut(), None) { cut() },
-            onSelectAllRequested = menuItem(canSelectAll(), Selection) {
-                selectAll()
-            },
+            onSelectAllRequested = menuItem(canSelectAll(), Selection) { selectAll() },
         )
     }
 
@@ -1406,12 +1379,14 @@
         enabled: Boolean,
         desiredState: TextToolbarState,
         crossinline operation: () -> Unit
-    ): (() -> Unit)? = if (!enabled) null else {
-        {
-            operation()
-            updateTextToolbarState(desiredState)
+    ): (() -> Unit)? =
+        if (!enabled) null
+        else {
+            {
+                operation()
+                updateTextToolbarState(desiredState)
+            }
         }
-    }
 
     fun deselect() {
         if (!textFieldState.visualText.selection.collapsed) {
@@ -1437,9 +1412,9 @@
      * @param isStartHandle whether the start or end handle is being updated
      * @param adjustment The selection adjustment to use
      * @param allowPreviousSelectionCollapsed Allow a collapsed selection to be passed to selection
-     * adjustment. In most cases, a collapsed selection should be considered "no previous
-     * selection" for selection adjustment. However, in some cases - like starting a selection in
-     * end padding - a collapsed selection may be necessary context to avoid selection flickering.
+     *   adjustment. In most cases, a collapsed selection should be considered "no previous
+     *   selection" for selection adjustment. However, in some cases - like starting a selection in
+     *   end padding - a collapsed selection may be necessary context to avoid selection flickering.
      * @param isStartOfSelection Whether this is, for certain, the beginning of a selection.
      */
     private fun updateSelection(
@@ -1451,15 +1426,17 @@
         allowPreviousSelectionCollapsed: Boolean = false,
         isStartOfSelection: Boolean = false
     ): TextRange {
-        val newSelection = getTextFieldSelection(
-            rawStartOffset = startOffset,
-            rawEndOffset = endOffset,
-            previousSelection = textFieldCharSequence.selection.takeIf {
-                !isStartOfSelection && (allowPreviousSelectionCollapsed || !it.collapsed)
-            },
-            isStartHandle = isStartHandle,
-            adjustment = adjustment,
-        )
+        val newSelection =
+            getTextFieldSelection(
+                rawStartOffset = startOffset,
+                rawEndOffset = endOffset,
+                previousSelection =
+                    textFieldCharSequence.selection.takeIf {
+                        !isStartOfSelection && (allowPreviousSelectionCollapsed || !it.collapsed)
+                    },
+                isStartHandle = isStartHandle,
+                adjustment = adjustment,
+            )
 
         if (newSelection == textFieldCharSequence.selection) return newSelection
 
@@ -1490,18 +1467,20 @@
             return TextRange(rawStartOffset, rawEndOffset)
         }
 
-        val selectionLayout = getTextFieldSelectionLayout(
-            layoutResult = layoutResult,
-            rawStartHandleOffset = rawStartOffset,
-            rawEndHandleOffset = rawEndOffset,
-            rawPreviousHandleOffset = previousRawDragOffset,
-            previousSelectionRange = previousSelection ?: TextRange.Zero,
-            isStartOfSelection = previousSelection == null,
-            isStartHandle = isStartHandle,
-        )
+        val selectionLayout =
+            getTextFieldSelectionLayout(
+                layoutResult = layoutResult,
+                rawStartHandleOffset = rawStartOffset,
+                rawEndHandleOffset = rawEndOffset,
+                rawPreviousHandleOffset = previousRawDragOffset,
+                previousSelectionRange = previousSelection ?: TextRange.Zero,
+                isStartOfSelection = previousSelection == null,
+                isStartHandle = isStartHandle,
+            )
 
-        if (previousSelection != null &&
-            !selectionLayout.shouldRecomputeSelection(previousSelectionLayout)
+        if (
+            previousSelection != null &&
+                !selectionLayout.shouldRecomputeSelection(previousSelectionLayout)
         ) {
             return previousSelection
         }
@@ -1518,7 +1497,6 @@
 
 /**
  * A state that indicates when to show TextToolbar.
- *
  * - [None] Do not show the TextToolbar at all.
  * - [Cursor] if selection is collapsed and all the other criteria are met, show the TextToolbar.
  * - [Selection] if selection is expanded and all the other criteria are met, show the TextToolbar.
diff --git a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/input/internal/selection/TextPreparedSelection.kt b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/input/internal/selection/TextPreparedSelection.kt
index 4357482..d3f6319 100644
--- a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/input/internal/selection/TextPreparedSelection.kt
+++ b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/input/internal/selection/TextPreparedSelection.kt
@@ -51,36 +51,34 @@
      */
     var cachedX: Float = Float.NaN
 
-    /**
-     * Remove and forget the cached X used for vertical navigation.
-     */
+    /** Remove and forget the cached X used for vertical navigation. */
     fun resetCachedX() {
         cachedX = Float.NaN
     }
 }
 
 /**
- * This utility class implements many selection-related operations on text (including basic
- * cursor movements and deletions) and combines them, taking into account how the text was
- * rendered. So, for example, [moveCursorToLineEnd] moves it to the visual line end.
+ * This utility class implements many selection-related operations on text (including basic cursor
+ * movements and deletions) and combines them, taking into account how the text was rendered. So,
+ * for example, [moveCursorToLineEnd] moves it to the visual line end.
  *
  * For many of these operations, it's particularly important to keep the difference between
  * selection start and selection end. In some systems, they are called "anchor" and "caret"
  * respectively. For example, for selection from scratch, after [moveCursorLeftByWord]
- * [moveCursorRight] will move the left side of the selection, but after [moveCursorRightByWord]
- * the right one.
+ * [moveCursorRight] will move the left side of the selection, but after [moveCursorRightByWord] the
+ * right one.
  *
  * @param state Transformed version of TextFieldState that helps to manipulate underlying buffer
- * through transformed coordinates.
- * @param textLayoutResult Visual representation of text inside [state]. Used to calculate line
- * and paragraph metrics.
+ *   through transformed coordinates.
+ * @param textLayoutResult Visual representation of text inside [state]. Used to calculate line and
+ *   paragraph metrics.
  * @param isFromSoftKeyboard Whether the source event that created this selection context is coming
- * from the IME.
+ *   from the IME.
  * @param visibleTextLayoutHeight Height of the visible area of text inside TextField to decide
- * where cursor needs to move when page up/down is requested.
+ *   where cursor needs to move when page up/down is requested.
  * @param textPreparedSelectionState An object that holds any context that needs to be long lived
- * between successive [TextFieldPreparedSelection]s, e.g. original X position of the cursor while
- * moving the cursor up/down.
+ *   between successive [TextFieldPreparedSelection]s, e.g. original X position of the cursor while
+ *   moving the cursor up/down.
  */
 internal class TextFieldPreparedSelection(
     private val state: TransformedTextFieldState,
@@ -97,14 +95,10 @@
      */
     val initialValue = Snapshot.withoutReadObservation { state.visualText }
 
-    /**
-     * Current active selection in the context of this [TextFieldPreparedSelection]
-     */
+    /** Current active selection in the context of this [TextFieldPreparedSelection] */
     var selection = initialValue.selection
 
-    /**
-     * Initial text value.
-     */
+    /** Initial text value. */
     private val text: String = initialValue.toString()
 
     /**
@@ -129,34 +123,27 @@
         }
     }
 
-    /**
-     * Executes PageUp key
-     */
-    fun moveCursorUpByPage() = applyIfNotEmpty(false) {
-        setCursor(jumpByPagesOffset(-1))
-    }
+    /** Executes PageUp key */
+    fun moveCursorUpByPage() = applyIfNotEmpty(false) { setCursor(jumpByPagesOffset(-1)) }
+
+    /** Executes PageDown key */
+    fun moveCursorDownByPage() = applyIfNotEmpty(false) { setCursor(jumpByPagesOffset(1)) }
 
     /**
-     * Executes PageDown key
-     */
-    fun moveCursorDownByPage() = applyIfNotEmpty(false) {
-        setCursor(jumpByPagesOffset(1))
-    }
-
-    /**
-     * Returns a cursor position after jumping back or forth by [pagesAmount] number of pages,
-     * where `page` is the visible amount of space in the text field. Visible rectangle is
-     * calculated by the coordinates of decoration box around the TextField. If text layout has not
-     * been measured yet, this function returns the current offset.
+     * Returns a cursor position after jumping back or forth by [pagesAmount] number of pages, where
+     * `page` is the visible amount of space in the text field. Visible rectangle is calculated by
+     * the coordinates of decoration box around the TextField. If text layout has not been measured
+     * yet, this function returns the current offset.
      */
     private fun jumpByPagesOffset(pagesAmount: Int): Int {
         val currentOffset = initialValue.selection.end
         if (textLayoutResult == null || visibleTextLayoutHeight.isNaN()) return currentOffset
         val currentPos = textLayoutResult.getCursorRect(currentOffset)
-        val newPos = currentPos.translate(
-            translateX = 0f,
-            translateY = visibleTextLayoutHeight * pagesAmount
-        )
+        val newPos =
+            currentPos.translate(
+                translateX = 0f,
+                translateY = visibleTextLayoutHeight * pagesAmount
+            )
         // which line does the new cursor position belong?
         val topLine = textLayoutResult.getLineForVerticalPosition(newPos.top)
         val lineSeparator = textLayoutResult.getLineBottom(topLine)
@@ -172,7 +159,8 @@
     /**
      * Only apply the given [block] if the text is not empty.
      *
-     * @param resetCachedX Whether to reset the cachedX parameter in [TextFieldPreparedSelectionState].
+     * @param resetCachedX Whether to reset the cachedX parameter in
+     *   [TextFieldPreparedSelectionState].
      */
     private inline fun applyIfNotEmpty(
         resetCachedX: Boolean = true,
@@ -187,20 +175,14 @@
         return this
     }
 
-    /**
-     * Sets a collapsed selection at given [offset].
-     */
+    /** Sets a collapsed selection at given [offset]. */
     private fun setCursor(offset: Int) {
         selection = TextRange(offset, offset)
     }
 
-    fun selectAll() = applyIfNotEmpty {
-        selection = TextRange(0, text.length)
-    }
+    fun selectAll() = applyIfNotEmpty { selection = TextRange(0, text.length) }
 
-    fun deselect() = applyIfNotEmpty {
-        setCursor(selection.end)
-    }
+    fun deselect() = applyIfNotEmpty { setCursor(selection.end) }
 
     fun moveCursorLeft() = applyIfNotEmpty {
         if (isLtr()) {
@@ -218,9 +200,7 @@
         }
     }
 
-    /**
-     * If there is already a selection, collapse it to the left side. Otherwise, execute [or]
-     */
+    /** If there is already a selection, collapse it to the left side. Otherwise, execute [or] */
     fun collapseLeftOr(or: TextFieldPreparedSelection.() -> Unit) = applyIfNotEmpty {
         if (selection.collapsed) {
             or(this)
@@ -233,9 +213,7 @@
         }
     }
 
-    /**
-     * If there is already a selection, collapse it to the right side. Otherwise, execute [or]
-     */
+    /** If there is already a selection, collapse it to the right side. Otherwise, execute [or] */
     fun collapseRightOr(or: TextFieldPreparedSelection.() -> Unit) = applyIfNotEmpty {
         if (selection.collapsed) {
             or(this)
@@ -248,9 +226,7 @@
         }
     }
 
-    /**
-     * Returns the index of the character break preceding the end of [selection].
-     */
+    /** Returns the index of the character break preceding the end of [selection]. */
     fun getPrecedingCharacterIndex() = text.findPrecedingBreak(selection.end)
 
     /**
@@ -275,13 +251,9 @@
         }
     }
 
-    fun moveCursorToHome() = applyIfNotEmpty {
-        setCursor(0)
-    }
+    fun moveCursorToHome() = applyIfNotEmpty { setCursor(0) }
 
-    fun moveCursorToEnd() = applyIfNotEmpty {
-        setCursor(text.length)
-    }
+    fun moveCursorToEnd() = applyIfNotEmpty { setCursor(text.length) }
 
     fun moveCursorLeftByWord() = applyIfNotEmpty {
         if (isLtr()) {
@@ -299,18 +271,13 @@
         }
     }
 
-    fun getNextWordOffset(): Int =
-        textLayoutResult?.getNextWordOffsetForLayout() ?: text.length
+    fun getNextWordOffset(): Int = textLayoutResult?.getNextWordOffsetForLayout() ?: text.length
 
-    private fun moveCursorNextByWord() = applyIfNotEmpty {
-        setCursor(getNextWordOffset())
-    }
+    private fun moveCursorNextByWord() = applyIfNotEmpty { setCursor(getNextWordOffset()) }
 
     fun getPreviousWordOffset(): Int = textLayoutResult?.getPrevWordOffsetForLayout() ?: 0
 
-    private fun moveCursorPrevByWord() = applyIfNotEmpty {
-        setCursor(getPreviousWordOffset())
-    }
+    private fun moveCursorPrevByWord() = applyIfNotEmpty { setCursor(getPreviousWordOffset()) }
 
     fun moveCursorPrevByParagraph() = applyIfNotEmpty {
         var paragraphStart = text.findParagraphStart(selection.min)
@@ -330,30 +297,21 @@
 
     fun moveCursorUpByLine(): TextFieldPreparedSelection {
         textLayoutResult ?: return this
-        return applyIfNotEmpty(false) {
-            setCursor(textLayoutResult!!.jumpByLinesOffset(-1))
-        }
+        return applyIfNotEmpty(false) { setCursor(textLayoutResult!!.jumpByLinesOffset(-1)) }
     }
 
     fun moveCursorDownByLine(): TextFieldPreparedSelection {
         textLayoutResult ?: return this
-        return applyIfNotEmpty(false) {
-            setCursor(textLayoutResult!!.jumpByLinesOffset(1))
-        }
+        return applyIfNotEmpty(false) { setCursor(textLayoutResult!!.jumpByLinesOffset(1)) }
     }
 
     fun getLineStartByOffset(): Int = textLayoutResult?.getLineStartByOffsetForLayout() ?: 0
 
-    fun moveCursorToLineStart() = applyIfNotEmpty {
-        setCursor(getLineStartByOffset())
-    }
+    fun moveCursorToLineStart() = applyIfNotEmpty { setCursor(getLineStartByOffset()) }
 
-    fun getLineEndByOffset(): Int =
-        textLayoutResult?.getLineEndByOffsetForLayout() ?: text.length
+    fun getLineEndByOffset(): Int = textLayoutResult?.getLineEndByOffsetForLayout() ?: text.length
 
-    fun moveCursorToLineEnd() = applyIfNotEmpty {
-        setCursor(getLineEndByOffset())
-    }
+    fun moveCursorToLineEnd() = applyIfNotEmpty { setCursor(getLineEndByOffset()) }
 
     fun moveCursorToLineLeftSide() = applyIfNotEmpty {
         if (isLtr()) {
@@ -372,9 +330,10 @@
     }
 
     /** Selects a text from the original selection start to a current selection end. */
-    fun selectMovement() = applyIfNotEmpty(resetCachedX = false) {
-        selection = TextRange(initialValue.selection.start, selection.end)
-    }
+    fun selectMovement() =
+        applyIfNotEmpty(resetCachedX = false) {
+            selection = TextRange(initialValue.selection.start, selection.end)
+        }
 
     private fun isLtr(): Boolean {
         val direction = textLayoutResult?.getParagraphDirection(selection.end) ?: return true
@@ -435,20 +394,21 @@
             targetLine < 0 -> {
                 return 0
             }
-
             targetLine >= lineCount -> {
                 return text.length
             }
         }
 
         val y = getLineBottom(targetLine) - 1
-        val x = textPreparedSelectionState.cachedX.also {
-            if ((isLtr() && it >= getLineRight(targetLine)) ||
-                (!isLtr() && it <= getLineLeft(targetLine))
-            ) {
-                return getLineEnd(targetLine, true)
+        val x =
+            textPreparedSelectionState.cachedX.also {
+                if (
+                    (isLtr() && it >= getLineRight(targetLine)) ||
+                        (!isLtr() && it <= getLineLeft(targetLine))
+                ) {
+                    return getLineEnd(targetLine, true)
+                }
             }
-        }
 
         return getOffsetForPosition(Offset(x, y))
     }
@@ -482,11 +442,12 @@
     // First step: find the index of the next cursor position in the visual text. In most cases this
     // will be the final result, however if transformations are applied we may need to jump the
     // cursor forward or backward.
-    val proposedCursor = if (forward) {
-        transformedText.findFollowingBreak(cursor)
-    } else {
-        transformedText.findPrecedingBreak(cursor)
-    }
+    val proposedCursor =
+        if (forward) {
+            transformedText.findFollowingBreak(cursor)
+        } else {
+            transformedText.findPrecedingBreak(cursor)
+        }
     if (proposedCursor == NoCharacterFound) {
         // At the start or end of the text, no change.
         return cursor
diff --git a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/input/internal/undo/TextUndoOperation.kt b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/input/internal/undo/TextUndoOperation.kt
index c1733d8..96cfeda 100644
--- a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/input/internal/undo/TextUndoOperation.kt
+++ b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/input/internal/undo/TextUndoOperation.kt
@@ -33,8 +33,8 @@
  * @param postSelection New selection after changes are applied
  * @param timeInMillis When did this change was first committed
  * @param canMerge Whether this change can be merged with the next or previous change in an undo
- * stack. There are many other rules that affect the merging strategy between two
- * [TextUndoOperation]s but this flag is a sure way to force a non-mergeable property.
+ *   stack. There are many other rules that affect the merging strategy between two
+ *   [TextUndoOperation]s but this flag is a sure way to force a non-mergeable property.
  */
 internal class TextUndoOperation(
     val index: Int,
@@ -50,18 +50,16 @@
      * What kind of edit operation is defined by this change. Edit type is decided by forward the
      * behavior of this change in forward direction (pre -> post).
      */
-    val textEditType: TextEditType = when {
-        preText.isEmpty() && postText.isEmpty() ->
-            throw IllegalArgumentException("Either pre or post text must not be empty")
+    val textEditType: TextEditType =
+        when {
+            preText.isEmpty() && postText.isEmpty() ->
+                throw IllegalArgumentException("Either pre or post text must not be empty")
+            preText.isEmpty() && postText.isNotEmpty() -> TextEditType.Insert
+            preText.isNotEmpty() && postText.isEmpty() -> TextEditType.Delete
+            else -> TextEditType.Replace
+        }
 
-        preText.isEmpty() && postText.isNotEmpty() -> TextEditType.Insert
-        preText.isNotEmpty() && postText.isEmpty() -> TextEditType.Delete
-        else -> TextEditType.Replace
-    }
-
-    /**
-     * Only required while deciding whether to merge two deletion type undo operations.
-     */
+    /** Only required while deciding whether to merge two deletion type undo operations. */
     val deletionType: TextDeleteType
         get() {
             if (textEditType != TextEditType.Delete) return TextDeleteType.NotByUser
@@ -80,37 +78,37 @@
 
     companion object {
 
-        val Saver = object : Saver<TextUndoOperation, Any> {
-            override fun SaverScope.save(value: TextUndoOperation): Any = listOf(
-                value.index,
-                value.preText,
-                value.postText,
-                value.preSelection.start,
-                value.preSelection.end,
-                value.postSelection.start,
-                value.postSelection.end,
-                value.timeInMillis
-            )
-
-            override fun restore(value: Any): TextUndoOperation {
-                return with((value as List<*>)) {
-                    TextUndoOperation(
-                        index = get(0) as Int,
-                        preText = get(1) as String,
-                        postText = get(2) as String,
-                        preSelection = TextRange(get(3) as Int, get(4) as Int),
-                        postSelection = TextRange(get(5) as Int, get(6) as Int),
-                        timeInMillis = get(7) as Long,
+        val Saver =
+            object : Saver<TextUndoOperation, Any> {
+                override fun SaverScope.save(value: TextUndoOperation): Any =
+                    listOf(
+                        value.index,
+                        value.preText,
+                        value.postText,
+                        value.preSelection.start,
+                        value.preSelection.end,
+                        value.postSelection.start,
+                        value.postSelection.end,
+                        value.timeInMillis
                     )
+
+                override fun restore(value: Any): TextUndoOperation {
+                    return with((value as List<*>)) {
+                        TextUndoOperation(
+                            index = get(0) as Int,
+                            preText = get(1) as String,
+                            postText = get(2) as String,
+                            preSelection = TextRange(get(3) as Int, get(4) as Int),
+                            postSelection = TextRange(get(5) as Int, get(6) as Int),
+                            timeInMillis = get(7) as Long,
+                        )
+                    }
                 }
             }
-        }
     }
 }
 
-/**
- * Apply a given [TextUndoOperation] in reverse to undo this [TextFieldState].
- */
+/** Apply a given [TextUndoOperation] in reverse to undo this [TextFieldState]. */
 internal fun TextFieldState.undo(op: TextUndoOperation) {
     editWithNoSideEffects {
         replace(op.index, op.index + op.postText.length, op.preText)
@@ -118,9 +116,7 @@
     }
 }
 
-/**
- * Apply a given [TextUndoOperation] in forward direction to redo this [TextFieldState].
- */
+/** Apply a given [TextUndoOperation] in forward direction to redo this [TextFieldState]. */
 internal fun TextFieldState.redo(op: TextUndoOperation) {
     editWithNoSideEffects {
         replace(op.index, op.index + op.preText.length, op.postText)
@@ -130,43 +126,41 @@
 
 /**
  * Possible types of a text operation.
- *
  * 1. Insert; if the edited range has 0 length, and the new text is longer than 0 length
  * 2. Delete: if the edited range is longer than 0, and the new text has 0 length
  * 3. Replace: All other changes.
  */
 internal enum class TextEditType {
-    Insert, Delete, Replace
+    Insert,
+    Delete,
+    Replace
 }
 
 /**
  * When a delete occurs during text editing, it can happen in various shapes.
- *
  * 1. Start; When a single character is removed to the start (towards 0) of the cursor, backspace
- * key behavior.
- *   "abcd|efg" -> "abc|efg"
- * 2. End; When a single character is removed to the end (towards length) of the cursor, delete
- * key behavior.
- *   "abcd|efg" -> "abcd|fg"
+ *    key behavior. "abcd|efg" -> "abc|efg"
+ * 2. End; When a single character is removed to the end (towards length) of the cursor, delete key
+ *    behavior. "abcd|efg" -> "abcd|fg"
  * 3. Inner; When a selection of characters are removed, directionless. Both backspace and delete
- * express the same behavior in this case.
- *   "ab|cde|fg" -> "ab|fg"
+ *    express the same behavior in this case. "ab|cde|fg" -> "ab|fg"
  * 4. NotByUser; A text editing operation that cannot be executed via a hardware or software
- * keyboard. For example when a portion of text is removed but it's not next to a cursor or
- * selection, or selection remains after removal.
- *   "abcd|efg"  -> "bcd|efg"
- *   "abc|def|g" -> "a|bc|g"
+ *    keyboard. For example when a portion of text is removed but it's not next to a cursor or
+ *    selection, or selection remains after removal. "abcd|efg" -> "bcd|efg" "abc|def|g" -> "a|bc|g"
  */
 internal enum class TextDeleteType {
-    Start, End, Inner, NotByUser
+    Start,
+    End,
+    Inner,
+    NotByUser
 }
 
 /**
  * There are multiple strategies while deciding how to add certain edit operations to undo stack.
- *   - Normally, merge is decided by UndoOperation's own merge logic, comparing itself to the
- *   latest operation in the Undo stack.
- *   - Programmatic updates should clear the history completely.
- *   - Some atomic actions like cut, and paste shouldn't merge to previous or next actions.
+ * - Normally, merge is decided by UndoOperation's own merge logic, comparing itself to the latest
+ *   operation in the Undo stack.
+ * - Programmatic updates should clear the history completely.
+ * - Some atomic actions like cut, and paste shouldn't merge to previous or next actions.
  */
 internal enum class TextFieldEditUndoBehavior {
     MergeIfPossible,
diff --git a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/input/internal/undo/UndoManager.kt b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/input/internal/undo/UndoManager.kt
index b27c60c..b54b8b8 100644
--- a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/input/internal/undo/UndoManager.kt
+++ b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/input/internal/undo/UndoManager.kt
@@ -27,7 +27,7 @@
  * @param initialUndoStack Previous undo stack if this manager is being restored from a saved state.
  * @param initialRedoStack Previous redo stack if this manager is being restored from a saved state.
  * @param capacity Maximum number of elements that can be hosted by this UndoManager. Total element
- * count is the sum of undo and redo stack sizes.
+ *   count is the sum of undo and redo stack sizes.
  */
 internal class UndoManager<T>(
     initialUndoStack: List<T> = emptyList(),
@@ -35,12 +35,8 @@
     private val capacity: Int = 100
 ) {
 
-    private var undoStack = SnapshotStateList<T>().apply {
-        addAll(initialUndoStack)
-    }
-    private var redoStack = SnapshotStateList<T>().apply {
-        addAll(initialRedoStack)
-    }
+    private var undoStack = SnapshotStateList<T>().apply { addAll(initialUndoStack) }
+    private var redoStack = SnapshotStateList<T>().apply { addAll(initialRedoStack) }
 
     internal val canUndo: Boolean
         get() = undoStack.isNotEmpty()
@@ -52,9 +48,7 @@
         get() = undoStack.size + redoStack.size
 
     init {
-        require(capacity >= 0) {
-            "Capacity must be a positive integer"
-        }
+        require(capacity >= 0) { "Capacity must be a positive integer" }
         require(size <= capacity) {
             "Initial list of undo and redo operations have a size=($size) greater " +
                 "than the given capacity=($capacity)."
@@ -118,56 +112,47 @@
          * Saver factory for a generic [UndoManager].
          *
          * @param itemSaver Since [UndoManager] is defined as a generic class, a specific item saver
-         * is required to _serialize_ each individual item in undo and redo stacks.
+         *   is required to _serialize_ each individual item in undo and redo stacks.
          */
-        inline fun <reified T> createSaver(
-            itemSaver: Saver<T, Any>
-        ) = object : Saver<UndoManager<T>, Any> {
-            /**
-             * Saves the contents of given [value] to a list.
-             *
-             * List's structure is
-             *   - Capacity
-             *   - n; Number of items in undo stack
-             *   - m; Number of items in redo stack
-             *   - n items in order from undo stack
-             *   - m items in order from redo stack
-             */
-            override fun SaverScope.save(value: UndoManager<T>): Any = buildList {
-                add(value.capacity)
-                add(value.undoStack.size)
-                add(value.redoStack.size)
-                value.undoStack.fastForEach {
-                    with(itemSaver) {
-                        add(save(it))
-                    }
+        inline fun <reified T> createSaver(itemSaver: Saver<T, Any>) =
+            object : Saver<UndoManager<T>, Any> {
+                /**
+                 * Saves the contents of given [value] to a list.
+                 *
+                 * List's structure is
+                 * - Capacity
+                 * - n; Number of items in undo stack
+                 * - m; Number of items in redo stack
+                 * - n items in order from undo stack
+                 * - m items in order from redo stack
+                 */
+                override fun SaverScope.save(value: UndoManager<T>): Any = buildList {
+                    add(value.capacity)
+                    add(value.undoStack.size)
+                    add(value.redoStack.size)
+                    value.undoStack.fastForEach { with(itemSaver) { add(save(it)) } }
+                    value.redoStack.fastForEach { with(itemSaver) { add(save(it)) } }
                 }
-                value.redoStack.fastForEach {
-                    with(itemSaver) {
-                        add(save(it))
-                    }
-                }
-            }
 
-            @Suppress("UNCHECKED_CAST")
-            override fun restore(value: Any): UndoManager<T> {
-                val list = value as List<Any>
-                val (capacity, undoSize, redoSize) = (list as List<Int>)
-                var i = 3
-                val undoStackItems = buildList {
-                    while (i < undoSize + 3) {
-                        add(itemSaver.restore(list[i])!!)
-                        i++
+                @Suppress("UNCHECKED_CAST")
+                override fun restore(value: Any): UndoManager<T> {
+                    val list = value as List<Any>
+                    val (capacity, undoSize, redoSize) = (list as List<Int>)
+                    var i = 3
+                    val undoStackItems = buildList {
+                        while (i < undoSize + 3) {
+                            add(itemSaver.restore(list[i])!!)
+                            i++
+                        }
                     }
-                }
-                val redoStackItems = buildList {
-                    while (i < undoSize + redoSize + 3) {
-                        add(itemSaver.restore(list[i])!!)
-                        i++
+                    val redoStackItems = buildList {
+                        while (i < undoSize + redoSize + 3) {
+                            add(itemSaver.restore(list[i])!!)
+                            i++
+                        }
                     }
+                    return UndoManager(undoStackItems, redoStackItems, capacity)
                 }
-                return UndoManager(undoStackItems, redoStackItems, capacity)
             }
-        }
     }
 }
diff --git a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/modifiers/LayoutUtils.kt b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/modifiers/LayoutUtils.kt
index 201baaf..1873ed3 100644
--- a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/modifiers/LayoutUtils.kt
+++ b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/modifiers/LayoutUtils.kt
@@ -20,24 +20,21 @@
 import androidx.compose.ui.text.style.TextOverflow
 import androidx.compose.ui.unit.Constraints
 
-/**
- * Find the constraints to pass to Paragraph based on all the parameters.
- */
+/** Find the constraints to pass to Paragraph based on all the parameters. */
 internal fun finalConstraints(
     constraints: Constraints,
     softWrap: Boolean,
     overflow: TextOverflow,
     maxIntrinsicWidth: Float
-): Constraints = Constraints(
+): Constraints =
+    Constraints(
         minWidth = 0,
         maxWidth = finalMaxWidth(constraints, softWrap, overflow, maxIntrinsicWidth),
         minHeight = 0,
         maxHeight = constraints.maxHeight
     )
 
-/**
- * Find the final max width a Paragraph would use based on all parameters.
- */
+/** Find the final max width a Paragraph would use based on all parameters. */
 internal fun finalMaxWidth(
     constraints: Constraints,
     softWrap: Boolean,
@@ -45,11 +42,12 @@
     maxIntrinsicWidth: Float
 ): Int {
     val widthMatters = softWrap || overflow == TextOverflow.Ellipsis
-    val maxWidth = if (widthMatters && constraints.hasBoundedWidth) {
-        constraints.maxWidth
-    } else {
-        Constraints.Infinity
-    }
+    val maxWidth =
+        if (widthMatters && constraints.hasBoundedWidth) {
+            constraints.maxWidth
+        } else {
+            Constraints.Infinity
+        }
 
     // if minWidth == maxWidth the width is fixed.
     //    therefore we can pass that value to our paragraph and use it
@@ -67,9 +65,7 @@
     }
 }
 
-/**
- * Find the maxLines to pass to text layout based on all parameters
- */
+/** Find the maxLines to pass to text layout based on all parameters */
 internal fun finalMaxLines(softWrap: Boolean, overflow: TextOverflow, maxLinesIn: Int): Int {
     // This is a fallback behavior because native text layout doesn't support multiple
     // ellipsis in one text layout.
diff --git a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/modifiers/MinLinesConstrainer.kt b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/modifiers/MinLinesConstrainer.kt
index 1774883..283083b 100644
--- a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/modifiers/MinLinesConstrainer.kt
+++ b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/modifiers/MinLinesConstrainer.kt
@@ -30,7 +30,8 @@
  *
  * Results are cached with the assumption that there is typically N=1 style being coerced at once.
  */
-internal class MinLinesConstrainer private constructor(
+internal class MinLinesConstrainer
+private constructor(
     val layoutDirection: LayoutDirection,
     val inputTextStyle: TextStyle,
     val density: Density,
@@ -45,9 +46,7 @@
         // ... it may be useful to increase this cache if requested by some dev use case
         private var last: MinLinesConstrainer? = null
 
-        /**
-         * Returns a coercer (possibly cached) with these parameters
-         */
+        /** Returns a coercer (possibly cached) with these parameters */
         fun from(
             minMaxUtil: MinLinesConstrainer?,
             layoutDirection: LayoutDirection,
@@ -56,29 +55,32 @@
             fontFamilyResolver: FontFamily.Resolver
         ): MinLinesConstrainer {
             minMaxUtil?.let {
-                if (layoutDirection == it.layoutDirection &&
-                    paramStyle == it.inputTextStyle &&
-                    density.density == it.density.density &&
-                    fontFamilyResolver === it.fontFamilyResolver) {
+                if (
+                    layoutDirection == it.layoutDirection &&
+                        paramStyle == it.inputTextStyle &&
+                        density.density == it.density.density &&
+                        fontFamilyResolver === it.fontFamilyResolver
+                ) {
                     return it
                 }
             }
             last?.let {
-                if (layoutDirection == it.layoutDirection &&
-                    paramStyle == it.inputTextStyle &&
-                    density.density == it.density.density &&
-                    fontFamilyResolver === it.fontFamilyResolver) {
+                if (
+                    layoutDirection == it.layoutDirection &&
+                        paramStyle == it.inputTextStyle &&
+                        density.density == it.density.density &&
+                        fontFamilyResolver === it.fontFamilyResolver
+                ) {
                     return it
                 }
             }
             return MinLinesConstrainer(
-                layoutDirection,
-                resolveDefaults(paramStyle, layoutDirection),
-                density,
-                fontFamilyResolver
-            ).also {
-                last = it
-            }
+                    layoutDirection,
+                    resolveDefaults(paramStyle, layoutDirection),
+                    density,
+                    fontFamilyResolver
+                )
+                .also { last = it }
         }
     }
 
@@ -87,44 +89,47 @@
      *
      * On first invocation this will cause (2) Paragraph measurements.
      */
-    internal fun coerceMinLines(
-        inConstraints: Constraints,
-        minLines: Int
-    ): Constraints {
+    internal fun coerceMinLines(inConstraints: Constraints, minLines: Int): Constraints {
         var oneLineHeight = oneLineHeightCache
         var lineHeight = lineHeightCache
         if (oneLineHeight.isNaN() || lineHeight.isNaN()) {
-            oneLineHeight = Paragraph(
-                text = EmptyTextReplacement,
-                style = resolvedStyle,
-                constraints = Constraints(),
-                density = density,
-                fontFamilyResolver = fontFamilyResolver,
-                maxLines = 1,
-                ellipsis = false
-            ).height
+            oneLineHeight =
+                Paragraph(
+                        text = EmptyTextReplacement,
+                        style = resolvedStyle,
+                        constraints = Constraints(),
+                        density = density,
+                        fontFamilyResolver = fontFamilyResolver,
+                        maxLines = 1,
+                        ellipsis = false
+                    )
+                    .height
 
-            val twoLineHeight = Paragraph(
-                text = TwoLineTextReplacement,
-                style = resolvedStyle,
-                constraints = Constraints(),
-                density = density,
-                fontFamilyResolver = fontFamilyResolver,
-                maxLines = 2,
-                ellipsis = false
-            ).height
+            val twoLineHeight =
+                Paragraph(
+                        text = TwoLineTextReplacement,
+                        style = resolvedStyle,
+                        constraints = Constraints(),
+                        density = density,
+                        fontFamilyResolver = fontFamilyResolver,
+                        maxLines = 2,
+                        ellipsis = false
+                    )
+                    .height
 
             lineHeight = twoLineHeight - oneLineHeight
             oneLineHeightCache = oneLineHeight
             lineHeightCache = lineHeight
         }
-        val minHeight = if (minLines != 1) {
-            (oneLineHeight + (lineHeight * (minLines - 1))).fastRoundToInt()
-                .coerceAtLeast(0)
-                .coerceAtMost(inConstraints.maxHeight)
-        } else {
-            inConstraints.minHeight
-        }
+        val minHeight =
+            if (minLines != 1) {
+                (oneLineHeight + (lineHeight * (minLines - 1)))
+                    .fastRoundToInt()
+                    .coerceAtLeast(0)
+                    .coerceAtMost(inConstraints.maxHeight)
+            } else {
+                inConstraints.minHeight
+            }
         return Constraints(
             minHeight = minHeight,
             maxHeight = inConstraints.maxHeight,
diff --git a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/modifiers/ModifierUtils.kt b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/modifiers/ModifierUtils.kt
index f4a6cc0..dbd2f89 100644
--- a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/modifiers/ModifierUtils.kt
+++ b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/modifiers/ModifierUtils.kt
@@ -19,15 +19,13 @@
 import androidx.compose.ui.text.style.TextOverflow
 import androidx.compose.ui.unit.Constraints
 
-internal fun Constraints.maxWidthForTextLayout(
-    softWrap: Boolean,
-    overflow: TextOverflow
-): Int {
+internal fun Constraints.maxWidthForTextLayout(softWrap: Boolean, overflow: TextOverflow): Int {
     val widthMatters = softWrap || overflow == TextOverflow.Ellipsis
-    val maxWidth = if (widthMatters && hasBoundedWidth) {
-        maxWidth
-    } else {
-        Constraints.Infinity
-    }
+    val maxWidth =
+        if (widthMatters && hasBoundedWidth) {
+            maxWidth
+        } else {
+            Constraints.Infinity
+        }
     return maxWidth
 }
diff --git a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/modifiers/MultiParagraphLayoutCache.kt b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/modifiers/MultiParagraphLayoutCache.kt
index accb3b5..fe403c3 100644
--- a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/modifiers/MultiParagraphLayoutCache.kt
+++ b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/modifiers/MultiParagraphLayoutCache.kt
@@ -53,22 +53,18 @@
     private var minLines: Int = DefaultMinLines,
     private var placeholders: List<AnnotatedString.Range<Placeholder>>? = null,
 ) {
-    /**
-     * Convert min max lines into actual constraints
-     */
+    /** Convert min max lines into actual constraints */
     private var mMinLinesConstrainer: MinLinesConstrainer? = null
 
     /**
      * Density is an interface which makes it behave like a provider, rather than a final class.
      * Whenever Density changes, the object itself may remain the same, making the below density
-     * variable mutate internally. This value holds the last seen density whenever Compose sends
-     * us a Density may have changed notification via layout or draw phase.
+     * variable mutate internally. This value holds the last seen density whenever Compose sends us
+     * a Density may have changed notification via layout or draw phase.
      */
     private var lastDensity: InlineDensity = InlineDensity.Unspecified
 
-    /**
-     * Density that text layout is performed in
-     */
+    /** Density that text layout is performed in */
     internal var density: Density? = null
         set(value) {
             val localField = field
@@ -86,41 +82,27 @@
             }
         }
 
-    /**
-     * [MultiParagraphIntrinsics] will be initialized lazily
-     */
+    /** [MultiParagraphIntrinsics] will be initialized lazily */
     private var paragraphIntrinsics: MultiParagraphIntrinsics? = null
 
-    /**
-     * [LayoutDirection] used to compute [MultiParagraphIntrinsics]
-     */
+    /** [LayoutDirection] used to compute [MultiParagraphIntrinsics] */
     private var intrinsicsLayoutDirection: LayoutDirection? = null
 
-    /**
-     * Cached value of final [TextLayoutResult]
-     */
+    /** Cached value of final [TextLayoutResult] */
     private var layoutCache: TextLayoutResult? = null
 
-    /**
-     * Input width for the last call to [intrinsicHeight]
-     */
+    /** Input width for the last call to [intrinsicHeight] */
     private var cachedIntrinsicHeightInputWidth: Int = -1
 
-    /**
-     * Output height for last call to [intrinsicHeight] at [cachedIntrinsicHeightInputWidth]
-     */
+    /** Output height for last call to [intrinsicHeight] at [cachedIntrinsicHeightInputWidth] */
     private var cachedIntrinsicHeight: Int = -1
 
-    /**
-     * The last computed TextLayoutResult, or throws if not initialized.
-     */
+    /** The last computed TextLayoutResult, or throws if not initialized. */
     val textLayoutResult: TextLayoutResult
-        get() = layoutCache
-            ?: throw IllegalStateException("You must call layoutWithConstraints first")
+        get() =
+            layoutCache ?: throw IllegalStateException("You must call layoutWithConstraints first")
 
-    /**
-     * The last computed TextLayoutResult, or null if not initialized.
-     */
+    /** The last computed TextLayoutResult, or null if not initialized. */
     val layoutOrNull: TextLayoutResult?
         get() = layoutCache
 
@@ -129,35 +111,31 @@
      *
      * @return true if constraints caused a text layout invalidation
      */
-    fun layoutWithConstraints(
-        constraints: Constraints,
-        layoutDirection: LayoutDirection
-    ): Boolean {
-        val finalConstraints = if (minLines > 1) {
-            val localMin = MinLinesConstrainer.from(
-                mMinLinesConstrainer,
-                layoutDirection,
-                style,
-                density!!,
-                fontFamilyResolver
-            ).also {
-                mMinLinesConstrainer = it
+    fun layoutWithConstraints(constraints: Constraints, layoutDirection: LayoutDirection): Boolean {
+        val finalConstraints =
+            if (minLines > 1) {
+                val localMin =
+                    MinLinesConstrainer.from(
+                            mMinLinesConstrainer,
+                            layoutDirection,
+                            style,
+                            density!!,
+                            fontFamilyResolver
+                        )
+                        .also { mMinLinesConstrainer = it }
+                localMin.coerceMinLines(inConstraints = constraints, minLines = minLines)
+            } else {
+                constraints
             }
-            localMin.coerceMinLines(
-                inConstraints = constraints,
-                minLines = minLines
-            )
-        } else {
-            constraints
-        }
         if (!layoutCache.newLayoutWillBeDifferent(finalConstraints, layoutDirection)) {
             if (finalConstraints == layoutCache!!.layoutInput.constraints) return false
             // we need to regen the input, constraints aren't the same
-            layoutCache = textLayoutResult(
-                layoutDirection = layoutDirection,
-                finalConstraints = finalConstraints,
-                multiParagraph = layoutCache!!.multiParagraph
-            )
+            layoutCache =
+                textLayoutResult(
+                    layoutDirection = layoutDirection,
+                    finalConstraints = finalConstraints,
+                    multiParagraph = layoutCache!!.multiParagraph
+                )
             return true
         }
         val multiParagraph = layoutText(finalConstraints, layoutDirection)
@@ -187,34 +165,27 @@
             ),
             multiParagraph,
             finalConstraints.constrain(
-                IntSize(
-                    layoutWidth.ceilToIntPx(),
-                    multiParagraph.height.ceilToIntPx()
-                )
+                IntSize(layoutWidth.ceilToIntPx(), multiParagraph.height.ceilToIntPx())
             )
         )
     }
 
-    /**
-     * The natural height of text at [width] in [layoutDirection]
-     */
+    /** The natural height of text at [width] in [layoutDirection] */
     fun intrinsicHeight(width: Int, layoutDirection: LayoutDirection): Int {
         val localWidth = cachedIntrinsicHeightInputWidth
         val localHeght = cachedIntrinsicHeight
         if (width == localWidth && localWidth != -1) return localHeght
-        val result = layoutText(
-            Constraints(0, width, 0, Constraints.Infinity),
-            layoutDirection
-        ).height.ceilToIntPx()
+        val result =
+            layoutText(Constraints(0, width, 0, Constraints.Infinity), layoutDirection)
+                .height
+                .ceilToIntPx()
 
         cachedIntrinsicHeightInputWidth = width
         cachedIntrinsicHeight = result
         return result
     }
 
-    /**
-     * Call when any parameters change, invalidation is a result of calling this method.
-     */
+    /** Call when any parameters change, invalidation is a result of calling this method. */
     fun update(
         text: AnnotatedString,
         style: TextStyle,
@@ -243,22 +214,23 @@
      */
     private fun setLayoutDirection(layoutDirection: LayoutDirection): MultiParagraphIntrinsics {
         val localIntrinsics = paragraphIntrinsics
-        val intrinsics = if (
-            localIntrinsics == null ||
-            layoutDirection != intrinsicsLayoutDirection ||
-            localIntrinsics.hasStaleResolvedFonts
-        ) {
-            intrinsicsLayoutDirection = layoutDirection
-            MultiParagraphIntrinsics(
-                annotatedString = text,
-                style = resolveDefaults(style, layoutDirection),
-                density = density!!,
-                fontFamilyResolver = fontFamilyResolver,
-                placeholders = placeholders.orEmpty()
-            )
-        } else {
-            localIntrinsics
-        }
+        val intrinsics =
+            if (
+                localIntrinsics == null ||
+                    layoutDirection != intrinsicsLayoutDirection ||
+                    localIntrinsics.hasStaleResolvedFonts
+            ) {
+                intrinsicsLayoutDirection = layoutDirection
+                MultiParagraphIntrinsics(
+                    annotatedString = text,
+                    style = resolveDefaults(style, layoutDirection),
+                    density = density!!,
+                    fontFamilyResolver = fontFamilyResolver,
+                    placeholders = placeholders.orEmpty()
+                )
+            } else {
+                localIntrinsics
+            }
 
         paragraphIntrinsics = intrinsics
         return intrinsics
@@ -278,12 +250,13 @@
 
         return MultiParagraph(
             intrinsics = localParagraphIntrinsics,
-            constraints = finalConstraints(
-                constraints,
-                softWrap,
-                overflow,
-                localParagraphIntrinsics.maxIntrinsicWidth
-            ),
+            constraints =
+                finalConstraints(
+                    constraints,
+                    softWrap,
+                    overflow,
+                    localParagraphIntrinsics.maxIntrinsicWidth
+                ),
             // This is a fallback behavior for ellipsis. Native
             maxLines = finalMaxLines(softWrap, overflow, maxLines),
             ellipsis = overflow == TextOverflow.Ellipsis
@@ -327,12 +300,8 @@
      *
      * Falls back to [paragraphIntrinsics.maxIntrinsicWidth] when not exact constraints.
      */
-    private fun maxWidth(constraints: Constraints): Int = finalMaxWidth(
-            constraints,
-            softWrap,
-            overflow,
-            paragraphIntrinsics!!.maxIntrinsicWidth
-        )
+    private fun maxWidth(constraints: Constraints): Int =
+        finalMaxWidth(constraints, softWrap, overflow, paragraphIntrinsics!!.maxIntrinsicWidth)
 
     private fun markDirty() {
         paragraphIntrinsics = null
@@ -341,16 +310,12 @@
         cachedIntrinsicHeightInputWidth = -1
     }
 
-    /**
-     * The width at which increasing the width of the text no longer decreases the height.
-     */
+    /** The width at which increasing the width of the text no longer decreases the height. */
     fun maxIntrinsicWidth(layoutDirection: LayoutDirection): Int {
         return setLayoutDirection(layoutDirection).maxIntrinsicWidth.ceilToIntPx()
     }
 
-    /**
-     * The width for text if all soft wrap opportunities were taken.
-     */
+    /** The width for text if all soft wrap opportunities were taken. */
     fun minIntrinsicWidth(layoutDirection: LayoutDirection): Int {
         return setLayoutDirection(layoutDirection).minIntrinsicWidth.ceilToIntPx()
     }
diff --git a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/modifiers/ParagraphLayoutCache.kt b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/modifiers/ParagraphLayoutCache.kt
index 4f15ecd..40a4249 100644
--- a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/modifiers/ParagraphLayoutCache.kt
+++ b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/modifiers/ParagraphLayoutCache.kt
@@ -57,14 +57,12 @@
     /**
      * Density is an interface which makes it behave like a provider, rather than a final class.
      * Whenever Density changes, the object itself may remain the same, making the below density
-     * variable mutate internally. This value holds the last seen density whenever Compose sends
-     * us a Density may have changed notification via layout or draw phase.
+     * variable mutate internally. This value holds the last seen density whenever Compose sends us
+     * a Density may have changed notification via layout or draw phase.
      */
     private var lastDensity: InlineDensity = InlineDensity.Unspecified
 
-    /**
-     * Density that text layout is performed in
-     */
+    /** Density that text layout is performed in */
     internal var density: Density? = null
         set(value) {
             val localField = field
@@ -82,57 +80,37 @@
             }
         }
 
-    /**
-     * Read to set up a snapshot observer observe changes to fonts.
-     */
+    /** Read to set up a snapshot observer observe changes to fonts. */
     internal val observeFontChanges: Unit
         get() {
             paragraphIntrinsics?.hasStaleResolvedFonts
         }
 
-    /**
-     * The last computed paragraph
-     */
+    /** The last computed paragraph */
     internal var paragraph: Paragraph? = null
 
-    /**
-     * The text did overflow
-     */
+    /** The text did overflow */
     internal var didOverflow: Boolean = false
 
-    /**
-     * The last computed layout size (as would have been reported in TextLayoutResult)
-     */
+    /** The last computed layout size (as would have been reported in TextLayoutResult) */
     internal var layoutSize: IntSize = IntSize(0, 0)
 
-    /**
-     * Convert min max lines into actual constraints
-     */
+    /** Convert min max lines into actual constraints */
     private var mMinLinesConstrainer: MinLinesConstrainer? = null
 
-    /**
-     * [ParagraphIntrinsics] will be initialized lazily
-     */
+    /** [ParagraphIntrinsics] will be initialized lazily */
     private var paragraphIntrinsics: ParagraphIntrinsics? = null
 
-    /**
-     * [LayoutDirection] used to compute [ParagraphIntrinsics]
-     */
+    /** [LayoutDirection] used to compute [ParagraphIntrinsics] */
     private var intrinsicsLayoutDirection: LayoutDirection? = null
 
-    /**
-     * Constraints passed to last layout.
-     */
+    /** Constraints passed to last layout. */
     private var prevConstraints: Constraints = Constraints.fixed(0, 0)
 
-    /**
-     * Input width for the last call to [intrinsicHeight]
-     */
+    /** Input width for the last call to [intrinsicHeight] */
     private var cachedIntrinsicHeightInputWidth: Int = -1
 
-    /**
-     * Output height for last call to [intrinsicHeight] at [cachedIntrinsicHeightInputWidth]
-     */
+    /** Output height for last call to [intrinsicHeight] at [cachedIntrinsicHeightInputWidth] */
     private var cachedIntrinsicHeight: Int = -1
 
     /**
@@ -140,81 +118,71 @@
      *
      * @return true if constraints caused a text layout invalidation
      */
-    fun layoutWithConstraints(
-        constraints: Constraints,
-        layoutDirection: LayoutDirection
-    ): Boolean {
-        val finalConstraints = if (minLines > 1) {
-            val localMin = MinLinesConstrainer.from(
-                mMinLinesConstrainer,
-                layoutDirection,
-                style,
-                density!!,
-                fontFamilyResolver
-            ).also {
-                mMinLinesConstrainer = it
+    fun layoutWithConstraints(constraints: Constraints, layoutDirection: LayoutDirection): Boolean {
+        val finalConstraints =
+            if (minLines > 1) {
+                val localMin =
+                    MinLinesConstrainer.from(
+                            mMinLinesConstrainer,
+                            layoutDirection,
+                            style,
+                            density!!,
+                            fontFamilyResolver
+                        )
+                        .also { mMinLinesConstrainer = it }
+                localMin.coerceMinLines(inConstraints = constraints, minLines = minLines)
+            } else {
+                constraints
             }
-            localMin.coerceMinLines(
-                inConstraints = constraints,
-                minLines = minLines
-            )
-        } else {
-            constraints
-        }
         if (!newLayoutWillBeDifferent(finalConstraints, layoutDirection)) {
             if (finalConstraints != prevConstraints) {
                 // ensure size and overflow is still accurate
                 val localParagraph = paragraph!!
                 val layoutWidth = min(localParagraph.maxIntrinsicWidth, localParagraph.width)
-                val localSize = finalConstraints.constrain(
-                    IntSize(
-                        layoutWidth.ceilToIntPx(),
-                        localParagraph.height.ceilToIntPx()
+                val localSize =
+                    finalConstraints.constrain(
+                        IntSize(layoutWidth.ceilToIntPx(), localParagraph.height.ceilToIntPx())
                     )
-                )
                 layoutSize = localSize
-                didOverflow = overflow != TextOverflow.Visible &&
-                    (localSize.width < localParagraph.width ||
-                        localSize.height < localParagraph.height)
+                didOverflow =
+                    overflow != TextOverflow.Visible &&
+                        (localSize.width < localParagraph.width ||
+                            localSize.height < localParagraph.height)
                 prevConstraints = finalConstraints
             }
             return false
         }
-        paragraph = layoutText(finalConstraints, layoutDirection).also {
-            prevConstraints = finalConstraints
-            val localSize = finalConstraints.constrain(
-                IntSize(
-                    it.width.ceilToIntPx(),
-                    it.height.ceilToIntPx()
-                )
-            )
-            layoutSize = localSize
-            didOverflow = overflow != TextOverflow.Visible &&
-                (localSize.width < it.width || localSize.height < it.height)
-        }
+        paragraph =
+            layoutText(finalConstraints, layoutDirection).also {
+                prevConstraints = finalConstraints
+                val localSize =
+                    finalConstraints.constrain(
+                        IntSize(it.width.ceilToIntPx(), it.height.ceilToIntPx())
+                    )
+                layoutSize = localSize
+                didOverflow =
+                    overflow != TextOverflow.Visible &&
+                        (localSize.width < it.width || localSize.height < it.height)
+            }
         return true
     }
 
-    /**
-     * The natural height of text at [width] in [layoutDirection]
-     */
+    /** The natural height of text at [width] in [layoutDirection] */
     fun intrinsicHeight(width: Int, layoutDirection: LayoutDirection): Int {
         val localWidth = cachedIntrinsicHeightInputWidth
         val localHeght = cachedIntrinsicHeight
         if (width == localWidth && localWidth != -1) return localHeght
-        val result = layoutText(
-            Constraints(0, width, 0, Constraints.Infinity),
-            layoutDirection
-        ).height.ceilToIntPx()
+        val result =
+            layoutText(Constraints(0, width, 0, Constraints.Infinity), layoutDirection)
+                .height
+                .ceilToIntPx()
 
         cachedIntrinsicHeightInputWidth = width
         cachedIntrinsicHeight = result
         return result
     }
 
-    /**
-     * Call when any parameters change, invalidation is a result of calling this method.
-     */
+    /** Call when any parameters change, invalidation is a result of calling this method. */
     fun update(
         text: String,
         style: TextStyle,
@@ -241,21 +209,22 @@
      */
     private fun setLayoutDirection(layoutDirection: LayoutDirection): ParagraphIntrinsics {
         val localIntrinsics = paragraphIntrinsics
-        val intrinsics = if (
-            localIntrinsics == null ||
-            layoutDirection != intrinsicsLayoutDirection ||
-            localIntrinsics.hasStaleResolvedFonts
-        ) {
-            intrinsicsLayoutDirection = layoutDirection
-            ParagraphIntrinsics(
-                text = text,
-                style = resolveDefaults(style, layoutDirection),
-                density = density!!,
-                fontFamilyResolver = fontFamilyResolver
-            )
-        } else {
-            localIntrinsics
-        }
+        val intrinsics =
+            if (
+                localIntrinsics == null ||
+                    layoutDirection != intrinsicsLayoutDirection ||
+                    localIntrinsics.hasStaleResolvedFonts
+            ) {
+                intrinsicsLayoutDirection = layoutDirection
+                ParagraphIntrinsics(
+                    text = text,
+                    style = resolveDefaults(style, layoutDirection),
+                    density = density!!,
+                    fontFamilyResolver = fontFamilyResolver
+                )
+            } else {
+                localIntrinsics
+            }
         paragraphIntrinsics = intrinsics
         return intrinsics
     }
@@ -266,20 +235,18 @@
      * The text will layout with a width that's as close to its max intrinsic width as possible
      * while still being greater than or equal to `minWidth` and less than or equal to `maxWidth`.
      */
-    private fun layoutText(
-        constraints: Constraints,
-        layoutDirection: LayoutDirection
-    ): Paragraph {
+    private fun layoutText(constraints: Constraints, layoutDirection: LayoutDirection): Paragraph {
         val localParagraphIntrinsics = setLayoutDirection(layoutDirection)
 
         return Paragraph(
             paragraphIntrinsics = localParagraphIntrinsics,
-            constraints = finalConstraints(
-                constraints,
-                softWrap,
-                overflow,
-                localParagraphIntrinsics.maxIntrinsicWidth
-            ),
+            constraints =
+                finalConstraints(
+                    constraints,
+                    softWrap,
+                    overflow,
+                    localParagraphIntrinsics.maxIntrinsicWidth
+                ),
             // This is a fallback behavior for ellipsis. Native
             maxLines = finalMaxLines(softWrap, overflow, maxLines),
             ellipsis = overflow == TextOverflow.Ellipsis
@@ -377,16 +344,12 @@
         )
     }
 
-    /**
-     * The width for text if all soft wrap opportunities were taken.
-     */
+    /** The width for text if all soft wrap opportunities were taken. */
     fun minIntrinsicWidth(layoutDirection: LayoutDirection): Int {
         return setLayoutDirection(layoutDirection).minIntrinsicWidth.ceilToIntPx()
     }
 
-    /**
-     * The width at which increasing the width of the text no lonfger decreases the height.
-     */
+    /** The width at which increasing the width of the text no lonfger decreases the height. */
     fun maxIntrinsicWidth(layoutDirection: LayoutDirection): Int {
         return setLayoutDirection(layoutDirection).maxIntrinsicWidth.ceilToIntPx()
     }
diff --git a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/modifiers/SelectableTextAnnotatedStringElement.kt b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/modifiers/SelectableTextAnnotatedStringElement.kt
index 7a1cd33..1e878ac 100644
--- a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/modifiers/SelectableTextAnnotatedStringElement.kt
+++ b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/modifiers/SelectableTextAnnotatedStringElement.kt
@@ -28,9 +28,7 @@
 import androidx.compose.ui.text.font.FontFamily
 import androidx.compose.ui.text.style.TextOverflow
 
-/**
- * Element for any text that is in a selection container.
- */
+/** Element for any text that is in a selection container. */
 internal data class SelectableTextAnnotatedStringElement(
     private val text: AnnotatedString,
     private val style: TextStyle,
@@ -46,24 +44,23 @@
     private val color: ColorProducer? = null
 ) : ModifierNodeElement<SelectableTextAnnotatedStringNode>() {
 
-    override fun create(): SelectableTextAnnotatedStringNode = SelectableTextAnnotatedStringNode(
-        text,
-        style,
-        fontFamilyResolver,
-        onTextLayout,
-        overflow,
-        softWrap,
-        maxLines,
-        minLines,
-        placeholders,
-        onPlaceholderLayout,
-        selectionController,
-        color
-    )
+    override fun create(): SelectableTextAnnotatedStringNode =
+        SelectableTextAnnotatedStringNode(
+            text,
+            style,
+            fontFamilyResolver,
+            onTextLayout,
+            overflow,
+            softWrap,
+            maxLines,
+            minLines,
+            placeholders,
+            onPlaceholderLayout,
+            selectionController,
+            color
+        )
 
-    override fun update(
-        node: SelectableTextAnnotatedStringNode
-    ) {
+    override fun update(node: SelectableTextAnnotatedStringNode) {
         node.update(
             text = text,
             style = style,
diff --git a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/modifiers/SelectableTextAnnotatedStringNode.kt b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/modifiers/SelectableTextAnnotatedStringNode.kt
index 282e349..03b6402 100644
--- a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/modifiers/SelectableTextAnnotatedStringNode.kt
+++ b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/modifiers/SelectableTextAnnotatedStringNode.kt
@@ -60,23 +60,24 @@
     private var onShowTranslation: ((TextAnnotatedStringNode.TextSubstitutionValue) -> Unit)? = null
 ) : DelegatingNode(), LayoutModifierNode, DrawModifierNode, GlobalPositionAwareModifierNode {
 
-    private val delegate = delegate(
-        TextAnnotatedStringNode(
-            text = text,
-            style = style,
-            fontFamilyResolver = fontFamilyResolver,
-            onTextLayout = onTextLayout,
-            overflow = overflow,
-            softWrap = softWrap,
-            maxLines = maxLines,
-            minLines = minLines,
-            placeholders = placeholders,
-            onPlaceholderLayout = onPlaceholderLayout,
-            selectionController = selectionController,
-            overrideColor = overrideColor,
-            onShowTranslation = onShowTranslation
+    private val delegate =
+        delegate(
+            TextAnnotatedStringNode(
+                text = text,
+                style = style,
+                fontFamilyResolver = fontFamilyResolver,
+                onTextLayout = onTextLayout,
+                overflow = overflow,
+                softWrap = softWrap,
+                maxLines = maxLines,
+                minLines = minLines,
+                placeholders = placeholders,
+                onPlaceholderLayout = onPlaceholderLayout,
+                selectionController = selectionController,
+                overrideColor = overrideColor,
+                onShowTranslation = onShowTranslation
+            )
         )
-    )
 
     init {
         requireNotNull(selectionController) {
@@ -131,24 +132,24 @@
     ) {
         delegate.doInvalidations(
             drawChanged = delegate.updateDraw(color, style),
-            textChanged = delegate.updateText(
-                text = text
-            ),
-            layoutChanged = delegate.updateLayoutRelatedArgs(
-                style = style,
-                placeholders = placeholders,
-                minLines = minLines,
-                maxLines = maxLines,
-                softWrap = softWrap,
-                fontFamilyResolver = fontFamilyResolver,
-                overflow = overflow
-            ),
-            callbacksChanged = delegate.updateCallbacks(
-                onTextLayout = onTextLayout,
-                onPlaceholderLayout = onPlaceholderLayout,
-                selectionController = selectionController,
-                onShowTranslation = onShowTranslation
-            ),
+            textChanged = delegate.updateText(text = text),
+            layoutChanged =
+                delegate.updateLayoutRelatedArgs(
+                    style = style,
+                    placeholders = placeholders,
+                    minLines = minLines,
+                    maxLines = maxLines,
+                    softWrap = softWrap,
+                    fontFamilyResolver = fontFamilyResolver,
+                    overflow = overflow
+                ),
+            callbacksChanged =
+                delegate.updateCallbacks(
+                    onTextLayout = onTextLayout,
+                    onPlaceholderLayout = onPlaceholderLayout,
+                    selectionController = selectionController,
+                    onShowTranslation = onShowTranslation
+                ),
         )
         this.selectionController = selectionController
         // we always relayout when we're selectable
diff --git a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/modifiers/SelectionController.kt b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/modifiers/SelectionController.kt
index b7aad4e..0ecb6cb 100644
--- a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/modifiers/SelectionController.kt
+++ b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/modifiers/SelectionController.kt
@@ -50,25 +50,21 @@
     }
 
     open val shouldClip: Boolean
-        get() = textLayoutResult?.let {
-            it.layoutInput.overflow != TextOverflow.Visible && it.hasVisualOverflow
-        } ?: false
+        get() =
+            textLayoutResult?.let {
+                it.layoutInput.overflow != TextOverflow.Visible && it.hasVisualOverflow
+            } ?: false
 
     // if this copy shows up in traces, this class may become mutable
     fun copy(
         layoutCoordinates: LayoutCoordinates? = this.layoutCoordinates,
         textLayoutResult: TextLayoutResult? = this.textLayoutResult
     ): StaticTextSelectionParams {
-        return StaticTextSelectionParams(
-            layoutCoordinates,
-            textLayoutResult
-        )
+        return StaticTextSelectionParams(layoutCoordinates, textLayoutResult)
     }
 }
 
-/**
- * Holder for selection modifiers while we wait for pointerInput to be ported to new modifiers.
- */
+/** Holder for selection modifiers while we wait for pointerInput to be ported to new modifiers. */
 // This is _basically_ a Modifier.Node but moved into remember because we need to do pointerInput
 internal class SelectionController(
     private val selectableId: Long,
@@ -79,21 +75,23 @@
 ) : RememberObserver {
     private var selectable: Selectable? = null
 
-    val modifier: Modifier = selectionRegistrar
-        .makeSelectionModifier(
-            selectableId = selectableId,
-            layoutCoordinates = { params.layoutCoordinates },
-        )
-        .pointerHoverIcon(textPointerIcon)
+    val modifier: Modifier =
+        selectionRegistrar
+            .makeSelectionModifier(
+                selectableId = selectableId,
+                layoutCoordinates = { params.layoutCoordinates },
+            )
+            .pointerHoverIcon(textPointerIcon)
 
     override fun onRemembered() {
-        selectable = selectionRegistrar.subscribe(
-            MultiWidgetSelectionDelegate(
-                selectableId = selectableId,
-                coordinatesCallback = { params.layoutCoordinates },
-                layoutResultCallback = { params.textLayoutResult }
+        selectable =
+            selectionRegistrar.subscribe(
+                MultiWidgetSelectionDelegate(
+                    selectableId = selectableId,
+                    coordinatesCallback = { params.layoutCoordinates },
+                    layoutResultCallback = { params.textLayoutResult }
+                )
             )
-        )
     }
 
     override fun onForgotten() {
@@ -117,8 +115,9 @@
 
         // Don't notify on null. We don't want every new Text that enters composition to
         // notify a selectable change. It was already handled when it was created.
-        if (prevTextLayoutResult != null &&
-            prevTextLayoutResult.layoutInput.text != textLayoutResult.layoutInput.text
+        if (
+            prevTextLayoutResult != null &&
+                prevTextLayoutResult.layoutInput.text != textLayoutResult.layoutInput.text
         ) {
             // Text content changed, notify selection to update itself.
             selectionRegistrar.notifySelectableChange(selectableId)
@@ -134,16 +133,18 @@
     fun draw(drawScope: DrawScope) {
         val selection = selectionRegistrar.subselections[selectableId] ?: return
 
-        val start = if (!selection.handlesCrossed) {
-            selection.start.offset
-        } else {
-            selection.end.offset
-        }
-        val end = if (!selection.handlesCrossed) {
-            selection.end.offset
-        } else {
-            selection.start.offset
-        }
+        val start =
+            if (!selection.handlesCrossed) {
+                selection.start.offset
+            } else {
+                selection.end.offset
+            }
+        val end =
+            if (!selection.handlesCrossed) {
+                selection.end.offset
+            } else {
+                selection.start.offset
+            }
 
         if (start == end) return
 
@@ -155,9 +156,7 @@
 
         with(drawScope) {
             if (params.shouldClip) {
-                clipRect {
-                    drawPath(selectionPath, backgroundSelectionColor)
-                }
+                clipRect { drawPath(selectionPath, backgroundSelectionColor) }
             } else {
                 drawPath(selectionPath, backgroundSelectionColor)
             }
@@ -171,16 +170,17 @@
     selectableId: Long,
     layoutCoordinates: () -> LayoutCoordinates?,
 ): Modifier {
-        val longPressDragObserver = object : TextDragObserver {
+    val longPressDragObserver =
+        object : TextDragObserver {
             /**
-             * The beginning position of the drag gesture. Every time a new drag gesture starts, it wil be
-             * recalculated.
+             * The beginning position of the drag gesture. Every time a new drag gesture starts, it
+             * wil be recalculated.
              */
             var lastPosition = Offset.Zero
 
             /**
-             * The total distance being dragged of the drag gesture. Every time a new drag gesture starts,
-             * it will be zeroed out.
+             * The total distance being dragged of the drag gesture. Every time a new drag gesture
+             * starts, it will be zeroed out.
              */
             var dragTotalDistance = Offset.Zero
 
@@ -225,14 +225,15 @@
                     // long-press is using SelectionAdjustment.WORD or
                     // SelectionAdjustment.PARAGRAPH that updates the start handle position from
                     // the dragBeginPosition.
-                    val consumed = notifySelectionUpdate(
-                        layoutCoordinates = it,
-                        previousPosition = lastPosition,
-                        newPosition = newPosition,
-                        isStartHandle = false,
-                        adjustment = SelectionAdjustment.Word,
-                        isInTouchMode = true
-                    )
+                    val consumed =
+                        notifySelectionUpdate(
+                            layoutCoordinates = it,
+                            previousPosition = lastPosition,
+                            newPosition = newPosition,
+                            isStartHandle = false,
+                            adjustment = SelectionAdjustment.Word,
+                            isInTouchMode = true
+                        )
                     if (consumed) {
                         lastPosition = newPosition
                         dragTotalDistance = Offset.Zero
@@ -253,20 +254,22 @@
             }
         }
 
-        val mouseSelectionObserver = object : MouseSelectionObserver {
+    val mouseSelectionObserver =
+        object : MouseSelectionObserver {
             var lastPosition = Offset.Zero
 
             override fun onExtend(downPosition: Offset): Boolean {
                 layoutCoordinates()?.let { layoutCoordinates ->
                     if (!layoutCoordinates.isAttached) return false
-                    val consumed = notifySelectionUpdate(
-                        layoutCoordinates = layoutCoordinates,
-                        newPosition = downPosition,
-                        previousPosition = lastPosition,
-                        isStartHandle = false,
-                        adjustment = SelectionAdjustment.None,
-                        isInTouchMode = false
-                    )
+                    val consumed =
+                        notifySelectionUpdate(
+                            layoutCoordinates = layoutCoordinates,
+                            newPosition = downPosition,
+                            previousPosition = lastPosition,
+                            isStartHandle = false,
+                            adjustment = SelectionAdjustment.None,
+                            isInTouchMode = false
+                        )
                     if (consumed) {
                         lastPosition = downPosition
                     }
@@ -280,14 +283,15 @@
                     if (!layoutCoordinates.isAttached) return false
                     if (!hasSelection(selectableId)) return false
 
-                    val consumed = notifySelectionUpdate(
-                        layoutCoordinates = layoutCoordinates,
-                        newPosition = dragPosition,
-                        previousPosition = lastPosition,
-                        isStartHandle = false,
-                        adjustment = SelectionAdjustment.None,
-                        isInTouchMode = false
-                    )
+                    val consumed =
+                        notifySelectionUpdate(
+                            layoutCoordinates = layoutCoordinates,
+                            newPosition = dragPosition,
+                            previousPosition = lastPosition,
+                            isStartHandle = false,
+                            adjustment = SelectionAdjustment.None,
+                            isInTouchMode = false
+                        )
 
                     if (consumed) {
                         lastPosition = dragPosition
@@ -296,10 +300,7 @@
                 return true
             }
 
-            override fun onStart(
-                downPosition: Offset,
-                adjustment: SelectionAdjustment
-            ): Boolean {
+            override fun onStart(downPosition: Offset, adjustment: SelectionAdjustment): Boolean {
                 layoutCoordinates()?.let {
                     if (!it.isAttached) return false
 
@@ -317,22 +318,20 @@
                 return false
             }
 
-            override fun onDrag(
-                dragPosition: Offset,
-                adjustment: SelectionAdjustment
-            ): Boolean {
+            override fun onDrag(dragPosition: Offset, adjustment: SelectionAdjustment): Boolean {
                 layoutCoordinates()?.let {
                     if (!it.isAttached) return false
                     if (!hasSelection(selectableId)) return false
 
-                    val consumed = notifySelectionUpdate(
-                        layoutCoordinates = it,
-                        previousPosition = lastPosition,
-                        newPosition = dragPosition,
-                        isStartHandle = false,
-                        adjustment = adjustment,
-                        isInTouchMode = false
-                    )
+                    val consumed =
+                        notifySelectionUpdate(
+                            layoutCoordinates = it,
+                            previousPosition = lastPosition,
+                            newPosition = dragPosition,
+                            isStartHandle = false,
+                            adjustment = adjustment,
+                            isInTouchMode = false
+                        )
                     if (consumed) {
                         lastPosition = dragPosition
                     }
diff --git a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/modifiers/TextAnnotatedStringElement.kt b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/modifiers/TextAnnotatedStringElement.kt
index 6525c51..ff05c9b 100644
--- a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/modifiers/TextAnnotatedStringElement.kt
+++ b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/modifiers/TextAnnotatedStringElement.kt
@@ -49,43 +49,44 @@
     private val onShowTranslation: ((TextAnnotatedStringNode.TextSubstitutionValue) -> Unit)? = null
 ) : ModifierNodeElement<TextAnnotatedStringNode>() {
 
-    override fun create(): TextAnnotatedStringNode = TextAnnotatedStringNode(
-        text,
-        style,
-        fontFamilyResolver,
-        onTextLayout,
-        overflow,
-        softWrap,
-        maxLines,
-        minLines,
-        placeholders,
-        onPlaceholderLayout,
-        selectionController,
-        color,
-        onShowTranslation
-    )
+    override fun create(): TextAnnotatedStringNode =
+        TextAnnotatedStringNode(
+            text,
+            style,
+            fontFamilyResolver,
+            onTextLayout,
+            overflow,
+            softWrap,
+            maxLines,
+            minLines,
+            placeholders,
+            onPlaceholderLayout,
+            selectionController,
+            color,
+            onShowTranslation
+        )
 
     override fun update(node: TextAnnotatedStringNode) {
         node.doInvalidations(
             drawChanged = node.updateDraw(color, style),
-            textChanged = node.updateText(
-                text = text
-            ),
-            layoutChanged = node.updateLayoutRelatedArgs(
-                style = style,
-                placeholders = placeholders,
-                minLines = minLines,
-                maxLines = maxLines,
-                softWrap = softWrap,
-                fontFamilyResolver = fontFamilyResolver,
-                overflow = overflow
-            ),
-            callbacksChanged = node.updateCallbacks(
-                onTextLayout = onTextLayout,
-                onPlaceholderLayout = onPlaceholderLayout,
-                selectionController = selectionController,
-                onShowTranslation = onShowTranslation
-            )
+            textChanged = node.updateText(text = text),
+            layoutChanged =
+                node.updateLayoutRelatedArgs(
+                    style = style,
+                    placeholders = placeholders,
+                    minLines = minLines,
+                    maxLines = maxLines,
+                    softWrap = softWrap,
+                    fontFamilyResolver = fontFamilyResolver,
+                    overflow = overflow
+                ),
+            callbacksChanged =
+                node.updateCallbacks(
+                    onTextLayout = onTextLayout,
+                    onPlaceholderLayout = onPlaceholderLayout,
+                    selectionController = selectionController,
+                    onShowTranslation = onShowTranslation
+                )
         )
     }
 
diff --git a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/modifiers/TextAnnotatedStringNode.kt b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/modifiers/TextAnnotatedStringNode.kt
index c552332..881527f 100644
--- a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/modifiers/TextAnnotatedStringNode.kt
+++ b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/modifiers/TextAnnotatedStringNode.kt
@@ -64,9 +64,7 @@
 import androidx.compose.ui.unit.Density
 import androidx.compose.ui.util.fastRoundToInt
 
-/**
- * Node that implements Text for [AnnotatedString] or [onTextLayout] parameters.
- */
+/** Node that implements Text for [AnnotatedString] or [onTextLayout] parameters. */
 internal class TextAnnotatedStringNode(
     private var text: AnnotatedString,
     private var style: TextStyle,
@@ -89,16 +87,17 @@
     private val layoutCache: MultiParagraphLayoutCache
         get() {
             if (_layoutCache == null) {
-                _layoutCache = MultiParagraphLayoutCache(
-                    text,
-                    style,
-                    fontFamilyResolver,
-                    overflow,
-                    softWrap,
-                    maxLines,
-                    minLines,
-                    placeholders
-                )
+                _layoutCache =
+                    MultiParagraphLayoutCache(
+                        text,
+                        style,
+                        fontFamilyResolver,
+                        overflow,
+                        softWrap,
+                        maxLines,
+                        minLines,
+                        placeholders
+                    )
             }
             return _layoutCache!!
         }
@@ -120,9 +119,7 @@
         return layoutCache.also { it.density = density }
     }
 
-    /**
-     * Element has draw parameters to update
-     */
+    /** Element has draw parameters to update */
     fun updateDraw(color: ColorProducer?, style: TextStyle): Boolean {
         var changed = false
         if (color != this.overrideColor) {
@@ -133,9 +130,7 @@
         return changed
     }
 
-    /**
-     * Element has text parameters to update
-     */
+    /** Element has text parameters to update */
     internal fun updateText(text: AnnotatedString): Boolean {
         val charDiff = this.text.text != text.text
         val spanDiff = this.text.spanStyles != text.spanStyles
@@ -152,9 +147,7 @@
         return anyDiff
     }
 
-    /**
-     * Element has layout parameters to update
-     */
+    /** Element has layout parameters to update */
     fun updateLayoutRelatedArgs(
         style: TextStyle,
         placeholders: List<AnnotatedString.Range<Placeholder>>?,
@@ -202,9 +195,7 @@
         return changed
     }
 
-    /**
-     * Element has callback parameters to update
-     */
+    /** Element has callback parameters to update */
     fun updateCallbacks(
         onTextLayout: ((TextLayoutResult) -> Unit)?,
         onPlaceholderLayout: ((List<Rect?>) -> Unit)?,
@@ -235,9 +226,7 @@
         return changed
     }
 
-    /**
-     * Do appropriate invalidate calls based on the results of update above.
-     */
+    /** Do appropriate invalidate calls based on the results of update above. */
     fun doInvalidations(
         drawChanged: Boolean,
         textChanged: Boolean,
@@ -306,16 +295,17 @@
             ) ?: return false
         } else {
             val newTextSubstitution = TextSubstitutionValue(text, updatedText)
-            val substitutionLayoutCache = MultiParagraphLayoutCache(
-                updatedText,
-                style,
-                fontFamilyResolver,
-                overflow,
-                softWrap,
-                maxLines,
-                minLines,
-                placeholders
-            )
+            val substitutionLayoutCache =
+                MultiParagraphLayoutCache(
+                    updatedText,
+                    style,
+                    fontFamilyResolver,
+                    overflow,
+                    softWrap,
+                    maxLines,
+                    minLines,
+                    placeholders
+                )
             substitutionLayoutCache.density = layoutCache.density
             newTextSubstitution.layoutCache = substitutionLayoutCache
             textSubstitution = newTextSubstitution
@@ -323,9 +313,7 @@
         return true
     }
 
-    /**
-     * Call whenever text substitution changes state
-     */
+    /** Call whenever text substitution changes state */
     private fun invalidateForTranslate() {
         invalidateSemantics()
         invalidateMeasurement()
@@ -341,24 +329,27 @@
         if (localSemanticsTextLayoutResult == null) {
             localSemanticsTextLayoutResult = { textLayoutResult ->
                 val inputLayout = layoutCache.layoutOrNull
-                val layout = inputLayout?.copy(
-                    layoutInput = TextLayoutInput(
-                        text = inputLayout.layoutInput.text,
-                        style = this@TextAnnotatedStringNode.style.merge(
-                            color = overrideColor?.invoke() ?: Color.Unspecified
-                        ),
-                        placeholders = inputLayout.layoutInput.placeholders,
-                        maxLines = inputLayout.layoutInput.maxLines,
-                        softWrap = inputLayout.layoutInput.softWrap,
-                        overflow = inputLayout.layoutInput.overflow,
-                        density = inputLayout.layoutInput.density,
-                        layoutDirection = inputLayout.layoutInput.layoutDirection,
-                        fontFamilyResolver = inputLayout.layoutInput.fontFamilyResolver,
-                        constraints = inputLayout.layoutInput.constraints
-                    )
-                )?.also {
-                    textLayoutResult.add(it)
-                }
+                val layout =
+                    inputLayout
+                        ?.copy(
+                            layoutInput =
+                                TextLayoutInput(
+                                    text = inputLayout.layoutInput.text,
+                                    style =
+                                        this@TextAnnotatedStringNode.style.merge(
+                                            color = overrideColor?.invoke() ?: Color.Unspecified
+                                        ),
+                                    placeholders = inputLayout.layoutInput.placeholders,
+                                    maxLines = inputLayout.layoutInput.maxLines,
+                                    softWrap = inputLayout.layoutInput.softWrap,
+                                    overflow = inputLayout.layoutInput.overflow,
+                                    density = inputLayout.layoutInput.density,
+                                    layoutDirection = inputLayout.layoutInput.layoutDirection,
+                                    fontFamilyResolver = inputLayout.layoutInput.fontFamilyResolver,
+                                    constraints = inputLayout.layoutInput.constraints
+                                )
+                        )
+                        ?.also { textLayoutResult.add(it) }
                 layout != null
             }
             semanticsTextLayoutResult = localSemanticsTextLayoutResult
@@ -411,9 +402,7 @@
         return measureScope.measure(measurable, constraints)
     }
 
-    /**
-     * Text layout is performed here.
-     */
+    /** Text layout is performed here. */
     override fun MeasureScope.measure(
         measurable: Measurable,
         constraints: Constraints
@@ -431,8 +420,7 @@
             onTextLayout?.invoke(textLayoutResult)
             selectionController?.updateTextLayout(textLayoutResult)
 
-            @Suppress("PrimitiveInCollection")
-            val cache = baselineCache ?: LinkedHashMap(2)
+            @Suppress("PrimitiveInCollection") val cache = baselineCache ?: LinkedHashMap(2)
             cache[FirstBaseline] = textLayoutResult.firstBaseline.fastRoundToInt()
             cache[LastBaseline] = textLayoutResult.lastBaseline.fastRoundToInt()
             baselineCache = cache
@@ -442,20 +430,17 @@
         onPlaceholderLayout?.invoke(textLayoutResult.placeholderRects)
 
         // then allow children to measure _inside_ our final box, with the above placeholders
-        val placeable = measurable.measure(
-            fitPrioritizingWidth(
-                minWidth = textLayoutResult.size.width,
-                maxWidth = textLayoutResult.size.width,
-                minHeight = textLayoutResult.size.height,
-                maxHeight = textLayoutResult.size.height
+        val placeable =
+            measurable.measure(
+                fitPrioritizingWidth(
+                    minWidth = textLayoutResult.size.width,
+                    maxWidth = textLayoutResult.size.width,
+                    minHeight = textLayoutResult.size.height,
+                    maxHeight = textLayoutResult.size.height
+                )
             )
-        )
 
-        return layout(
-            textLayoutResult.size.width,
-            textLayoutResult.size.height,
-            baselineCache!!
-        ) {
+        return layout(textLayoutResult.size.width, textLayoutResult.size.height, baselineCache!!) {
             placeable.place(0, 0)
         }
     }
@@ -510,11 +495,10 @@
         width: Int
     ): Int = getLayoutCache(this).intrinsicHeight(width, layoutDirection)
 
-    fun drawNonExtension(
-        contentDrawScope: ContentDrawScope
-    ) {
+    fun drawNonExtension(contentDrawScope: ContentDrawScope) {
         return contentDrawScope.draw()
     }
+
     override fun ContentDrawScope.draw() {
         if (!isAttached) {
             // no-up for !isAttached. The node will invalidate when attaching again.
@@ -551,13 +535,14 @@
                     )
                 } else {
                     val overrideColorVal = overrideColor?.invoke() ?: Color.Unspecified
-                    val color = if (overrideColorVal.isSpecified) {
-                        overrideColorVal
-                    } else if (style.color.isSpecified) {
-                        style.color
-                    } else {
-                        Color.Black
-                    }
+                    val color =
+                        if (overrideColorVal.isSpecified) {
+                            overrideColorVal
+                        } else if (style.color.isSpecified) {
+                            style.color
+                        } else {
+                            Color.Black
+                        }
                     localParagraph.paint(
                         canvas = canvas,
                         color = color,
@@ -573,11 +558,12 @@
             }
 
             // draw inline content and links indication
-            val hasLinks = if (textSubstitution?.isShowingSubstitution == true) {
-                false
-            } else {
-                text.hasLinks()
-            }
+            val hasLinks =
+                if (textSubstitution?.isShowingSubstitution == true) {
+                    false
+                } else {
+                    text.hasLinks()
+                }
             if (hasLinks || !placeholders.isNullOrEmpty()) {
                 drawContent()
             }
diff --git a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/modifiers/TextStringSimpleElement.kt b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/modifiers/TextStringSimpleElement.kt
index 51094bc..5543ebc 100644
--- a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/modifiers/TextStringSimpleElement.kt
+++ b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/modifiers/TextStringSimpleElement.kt
@@ -40,34 +40,31 @@
     private val color: ColorProducer? = null
 ) : ModifierNodeElement<TextStringSimpleNode>() {
 
-    override fun create(): TextStringSimpleNode = TextStringSimpleNode(
-        text,
-        style,
-        fontFamilyResolver,
-        overflow,
-        softWrap,
-        maxLines,
-        minLines,
-        color
-    )
+    override fun create(): TextStringSimpleNode =
+        TextStringSimpleNode(
+            text,
+            style,
+            fontFamilyResolver,
+            overflow,
+            softWrap,
+            maxLines,
+            minLines,
+            color
+        )
 
     override fun update(node: TextStringSimpleNode) {
         node.doInvalidations(
-            drawChanged = node.updateDraw(
-                color,
-                style
-            ),
-            textChanged = node.updateText(
-                text = text
-            ),
-            layoutChanged = node.updateLayoutRelatedArgs(
-                style = style,
-                minLines = minLines,
-                maxLines = maxLines,
-                softWrap = softWrap,
-                fontFamilyResolver = fontFamilyResolver,
-                overflow = overflow
-            )
+            drawChanged = node.updateDraw(color, style),
+            textChanged = node.updateText(text = text),
+            layoutChanged =
+                node.updateLayoutRelatedArgs(
+                    style = style,
+                    minLines = minLines,
+                    maxLines = maxLines,
+                    softWrap = softWrap,
+                    fontFamilyResolver = fontFamilyResolver,
+                    overflow = overflow
+                )
         )
     }
 
diff --git a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/modifiers/TextStringSimpleNode.kt b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/modifiers/TextStringSimpleNode.kt
index 5dbf89d..3fa4234 100644
--- a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/modifiers/TextStringSimpleNode.kt
+++ b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/modifiers/TextStringSimpleNode.kt
@@ -86,15 +86,16 @@
     private val layoutCache: ParagraphLayoutCache
         get() {
             if (_layoutCache == null) {
-                _layoutCache = ParagraphLayoutCache(
-                    text,
-                    style,
-                    fontFamilyResolver,
-                    overflow,
-                    softWrap,
-                    maxLines,
-                    minLines,
-                )
+                _layoutCache =
+                    ParagraphLayoutCache(
+                        text,
+                        style,
+                        fontFamilyResolver,
+                        overflow,
+                        softWrap,
+                        maxLines,
+                        minLines,
+                    )
             }
             return _layoutCache!!
         }
@@ -105,7 +106,6 @@
      * If text substitution is active, this will return the layout cache for the substitution.
      * Otherwise, it will return the layout cache for the original text.
      */
-
     private fun getLayoutCache(density: Density): ParagraphLayoutCache {
         textSubstitution?.let { textSubstitutionValue ->
             if (textSubstitutionValue.isShowingSubstitution) {
@@ -127,9 +127,7 @@
         return changed
     }
 
-    /**
-     * Element has text params to update
-     */
+    /** Element has text params to update */
     fun updateText(text: String): Boolean {
         if (this.text == text) return false
         this.text = text
@@ -137,9 +135,7 @@
         return true
     }
 
-    /**
-     * Element has layout related params to update
-     */
+    /** Element has layout related params to update */
     fun updateLayoutRelatedArgs(
         style: TextStyle,
         minLines: Int,
@@ -181,14 +177,8 @@
         return changed
     }
 
-    /**
-     * request invalidate based on the results of [updateText] and [updateLayoutRelatedArgs]
-     */
-    fun doInvalidations(
-        drawChanged: Boolean,
-        textChanged: Boolean,
-        layoutChanged: Boolean
-    ) {
+    /** request invalidate based on the results of [updateText] and [updateLayoutRelatedArgs] */
+    fun doInvalidations(drawChanged: Boolean, textChanged: Boolean, layoutChanged: Boolean) {
         // bring caches up to date even if the node is detached in case it is used again later
         if (textChanged || layoutChanged) {
             layoutCache.update(
@@ -256,15 +246,16 @@
             ) ?: return false
         } else {
             val newTextSubstitution = TextSubstitutionValue(text, updatedText)
-            val substitutionLayoutCache = ParagraphLayoutCache(
-                updatedText,
-                style,
-                fontFamilyResolver,
-                overflow,
-                softWrap,
-                maxLines,
-                minLines,
-            )
+            val substitutionLayoutCache =
+                ParagraphLayoutCache(
+                    updatedText,
+                    style,
+                    fontFamilyResolver,
+                    overflow,
+                    softWrap,
+                    maxLines,
+                    minLines,
+                )
             substitutionLayoutCache.density = layoutCache.density
             newTextSubstitution.layoutCache = substitutionLayoutCache
             textSubstitution = newTextSubstitution
@@ -280,13 +271,13 @@
         var localSemanticsTextLayoutResult = semanticsTextLayoutResult
         if (localSemanticsTextLayoutResult == null) {
             localSemanticsTextLayoutResult = { textLayoutResult ->
-                val layout = layoutCache.slowCreateTextLayoutResultOrNull(
-                    style = style.merge(
-                        color = overrideColor?.invoke() ?: Color.Unspecified
-                    )
-                )?.also {
-                    textLayoutResult.add(it)
-                }
+                val layout =
+                    layoutCache
+                        .slowCreateTextLayoutResultOrNull(
+                            style =
+                                style.merge(color = overrideColor?.invoke() ?: Color.Unspecified)
+                        )
+                        ?.also { textLayoutResult.add(it) }
                 layout != null
             }
             semanticsTextLayoutResult = localSemanticsTextLayoutResult
@@ -327,18 +318,14 @@
         getTextLayoutResult(action = localSemanticsTextLayoutResult)
     }
 
-    /**
-     * Call whenever text substitution changes state
-     */
+    /** Call whenever text substitution changes state */
     private fun invalidateForTranslate() {
         invalidateSemantics()
         invalidateMeasurement()
         invalidateDraw()
     }
 
-    /**
-     * Text layout happens here
-     */
+    /** Text layout happens here */
     override fun MeasureScope.measure(
         measurable: Measurable,
         constraints: Constraints
@@ -354,8 +341,7 @@
         if (didChangeLayout) {
             invalidateLayer()
             // Map<AlignmentLine, Int> required for use in public API `layout` below
-            @Suppress("PrimitiveInCollection")
-            var cache = baselineCache
+            @Suppress("PrimitiveInCollection") var cache = baselineCache
             if (cache == null) {
                 cache = LinkedHashMap(2)
             }
@@ -365,20 +351,17 @@
         }
 
         // then allow children to measure _inside_ our final box, with the above placeholders
-        val placeable = measurable.measure(
-            fitPrioritizingWidth(
-                minWidth = layoutSize.width,
-                maxWidth = layoutSize.width,
-                minHeight = layoutSize.height,
-                maxHeight = layoutSize.height
+        val placeable =
+            measurable.measure(
+                fitPrioritizingWidth(
+                    minWidth = layoutSize.width,
+                    maxWidth = layoutSize.width,
+                    minHeight = layoutSize.height,
+                    maxHeight = layoutSize.height
+                )
             )
-        )
 
-        return layout(
-            layoutSize.width,
-            layoutSize.height,
-            baselineCache!!
-        ) {
+        return layout(layoutSize.width, layoutSize.height, baselineCache!!) {
             placeable.place(0, 0)
         }
     }
@@ -405,9 +388,7 @@
         width: Int
     ): Int = getLayoutCache(this).intrinsicHeight(width, layoutDirection)
 
-    /**
-     * Optimized Text draw.
-     */
+    /** Optimized Text draw. */
     override fun ContentDrawScope.draw() {
         if (!isAttached) {
             // no-up for !isAttached. The node will invalidate when attaching again.
@@ -415,9 +396,10 @@
         }
 
         val layoutCache = getLayoutCache(this)
-        val localParagraph = requireNotNull(layoutCache.paragraph) {
-            "no paragraph (layoutCache=$_layoutCache, textSubstitution=$textSubstitution)"
-        }
+        val localParagraph =
+            requireNotNull(layoutCache.paragraph) {
+                "no paragraph (layoutCache=$_layoutCache, textSubstitution=$textSubstitution)"
+            }
 
         drawIntoCanvas { canvas ->
             val willClip = layoutCache.didOverflow
@@ -444,13 +426,14 @@
                     )
                 } else {
                     val overrideColorVal = overrideColor?.invoke() ?: Color.Unspecified
-                    val color = if (overrideColorVal.isSpecified) {
-                        overrideColorVal
-                    } else if (style.color.isSpecified) {
-                        style.color
-                    } else {
-                        Color.Black
-                    }
+                    val color =
+                        if (overrideColorVal.isSpecified) {
+                            overrideColorVal
+                        } else if (style.color.isSpecified) {
+                            style.color
+                        } else {
+                            Color.Black
+                        }
                     localParagraph.paint(
                         canvas = canvas,
                         color = color,
diff --git a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/selection/MultiWidgetSelectionDelegate.kt b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/selection/MultiWidgetSelectionDelegate.kt
index 7e9bfd0..e8adbcb 100644
--- a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/selection/MultiWidgetSelectionDelegate.kt
+++ b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/selection/MultiWidgetSelectionDelegate.kt
@@ -41,27 +41,29 @@
      * most TextLayoutResult changes would likely affect Selection logic in some way. Therefore,
      * this value only caches the last visible offset calculation for the latest seen
      * TextLayoutResult instance. Object equality check is not worth the extra calculation as
-     * instance check is enough to accomplish whether a text layout has changed in a meaningful
-     * way.
+     * instance check is enough to accomplish whether a text layout has changed in a meaningful way.
      */
     private val TextLayoutResult.lastVisibleOffset: Int
-        @Synchronized get() {
+        @Synchronized
+        get() {
             if (_previousTextLayoutResult !== this) {
-                val lastVisibleLine = when {
-                    !didOverflowHeight || multiParagraph.didExceedMaxLines -> lineCount - 1
-                    else -> { // size.height < multiParagraph.height
-                        var finalVisibleLine = getLineForVerticalPosition(size.height.toFloat())
-                            .coerceAtMost(lineCount - 1)
-                        // if final visible line's top is equal to or larger than text layout
-                        // result's height, we need to check above lines one by one until we find
-                        // a line that fits in boundaries.
-                        while (
-                            finalVisibleLine >= 0 &&
-                            getLineTop(finalVisibleLine) >= size.height
-                        ) finalVisibleLine--
-                        finalVisibleLine.coerceAtLeast(0)
+                val lastVisibleLine =
+                    when {
+                        !didOverflowHeight || multiParagraph.didExceedMaxLines -> lineCount - 1
+                        else -> { // size.height < multiParagraph.height
+                            var finalVisibleLine =
+                                getLineForVerticalPosition(size.height.toFloat())
+                                    .coerceAtMost(lineCount - 1)
+                            // if final visible line's top is equal to or larger than text layout
+                            // result's height, we need to check above lines one by one until we
+                            // find
+                            // a line that fits in boundaries.
+                            while (
+                                finalVisibleLine >= 0 && getLineTop(finalVisibleLine) >= size.height
+                            ) finalVisibleLine--
+                            finalVisibleLine.coerceAtLeast(0)
+                        }
                     }
-                }
                 _previousLastVisibleOffset = getLineEnd(lastVisibleLine, true)
                 _previousTextLayoutResult = this
             }
@@ -75,11 +77,12 @@
         val relativePosition =
             builder.containerCoordinates.localPositionOf(layoutCoordinates, Offset.Zero)
         val localPosition = builder.currentPosition - relativePosition
-        val localPreviousHandlePosition = if (builder.previousHandlePosition.isUnspecified) {
-            Offset.Unspecified
-        } else {
-            builder.previousHandlePosition - relativePosition
-        }
+        val localPreviousHandlePosition =
+            if (builder.previousHandlePosition.isUnspecified) {
+                Offset.Unspecified
+            } else {
+                builder.previousHandlePosition - relativePosition
+            }
 
         builder.appendSelectableInfo(
             textLayoutResult = textLayoutResult,
@@ -95,24 +98,27 @@
         val end = textLayoutResult.layoutInput.text.length
 
         return Selection(
-            start = Selection.AnchorInfo(
-                direction = textLayoutResult.getBidiRunDirection(start),
-                offset = start,
-                selectableId = selectableId
-            ),
-            end = Selection.AnchorInfo(
-                direction = textLayoutResult.getBidiRunDirection(max(end - 1, 0)),
-                offset = end,
-                selectableId = selectableId
-            ),
+            start =
+                Selection.AnchorInfo(
+                    direction = textLayoutResult.getBidiRunDirection(start),
+                    offset = start,
+                    selectableId = selectableId
+                ),
+            end =
+                Selection.AnchorInfo(
+                    direction = textLayoutResult.getBidiRunDirection(max(end - 1, 0)),
+                    offset = end,
+                    selectableId = selectableId
+                ),
             handlesCrossed = false
         )
     }
 
     override fun getHandlePosition(selection: Selection, isStartHandle: Boolean): Offset {
         // Check if the selection handle's selectable is the current selectable.
-        if (isStartHandle && selection.start.selectableId != this.selectableId ||
-            !isStartHandle && selection.end.selectableId != this.selectableId
+        if (
+            isStartHandle && selection.start.selectableId != this.selectableId ||
+                !isStartHandle && selection.end.selectableId != this.selectableId
         ) {
             return Offset.Unspecified
         }
@@ -145,9 +151,7 @@
         val textLayoutResult = layoutResultCallback() ?: return Rect.Zero
         val textLength = textLayoutResult.layoutInput.text.length
         if (textLength < 1) return Rect.Zero
-        return textLayoutResult.getBoundingBox(
-            offset.coerceIn(0, textLength - 1)
-        )
+        return textLayoutResult.getBoundingBox(offset.coerceIn(0, textLength - 1))
     }
 
     override fun getLineLeft(offset: Int): Float {
@@ -194,8 +198,8 @@
  * Appends a [SelectableInfo] to this [SelectionLayoutBuilder].
  *
  * @param textLayoutResult the [TextLayoutResult] for the selectable
- * @param localPosition the position of the current handle if not being dragged
- * or the drag position if it is
+ * @param localPosition the position of the current handle if not being dragged or the drag position
+ *   if it is
  * @param previousHandlePosition the position of the previous handle
  * @param selectableId the selectableId for the selectable
  */
@@ -205,19 +209,20 @@
     previousHandlePosition: Offset,
     selectableId: Long,
 ) {
-    val bounds = Rect(
-        0.0f,
-        0.0f,
-        textLayoutResult.size.width.toFloat(),
-        textLayoutResult.size.height.toFloat()
-    )
+    val bounds =
+        Rect(
+            0.0f,
+            0.0f,
+            textLayoutResult.size.width.toFloat(),
+            textLayoutResult.size.height.toFloat()
+        )
 
     val currentXDirection = getXDirection(localPosition, bounds)
     val currentYDirection = getYDirection(localPosition, bounds)
 
-    fun otherDirection(anchor: Selection.AnchorInfo?): Direction = anchor
-        ?.let { getDirectionById(it.selectableId, selectableId) }
-        ?: resolve2dDirection(currentXDirection, currentYDirection)
+    fun otherDirection(anchor: Selection.AnchorInfo?): Direction =
+        anchor?.let { getDirectionById(it.selectableId, selectableId) }
+            ?: resolve2dDirection(currentXDirection, currentYDirection)
 
     val otherDirection: Direction
     val startXHandleDirection: Direction
@@ -247,19 +252,31 @@
     val rawEndHandleOffset: Int
     if (isStartHandle) {
         rawStartHandleOffset = getOffsetForPosition(localPosition, textLayoutResult)
-        rawEndHandleOffset = previousSelection?.end
-            ?.getPreviousAdjustedOffset(selectableIdOrderingComparator, selectableId, textLength)
-            ?: rawStartHandleOffset
+        rawEndHandleOffset =
+            previousSelection
+                ?.end
+                ?.getPreviousAdjustedOffset(
+                    selectableIdOrderingComparator,
+                    selectableId,
+                    textLength
+                ) ?: rawStartHandleOffset
     } else {
         rawEndHandleOffset = getOffsetForPosition(localPosition, textLayoutResult)
-        rawStartHandleOffset = previousSelection?.start
-            ?.getPreviousAdjustedOffset(selectableIdOrderingComparator, selectableId, textLength)
-            ?: rawEndHandleOffset
+        rawStartHandleOffset =
+            previousSelection
+                ?.start
+                ?.getPreviousAdjustedOffset(
+                    selectableIdOrderingComparator,
+                    selectableId,
+                    textLength
+                ) ?: rawEndHandleOffset
     }
 
-    val rawPreviousHandleOffset = if (previousHandlePosition.isUnspecified) -1 else {
-        getOffsetForPosition(previousHandlePosition, textLayoutResult)
-    }
+    val rawPreviousHandleOffset =
+        if (previousHandlePosition.isUnspecified) -1
+        else {
+            getOffsetForPosition(previousHandlePosition, textLayoutResult)
+        }
 
     appendInfo(
         selectableId = selectableId,
@@ -279,10 +296,8 @@
     currentSelectableId: Long,
     currentTextLength: Int
 ): Int {
-    val compareResult = selectableIdOrderingComparator.compare(
-        this.selectableId,
-        currentSelectableId
-    )
+    val compareResult =
+        selectableIdOrderingComparator.compare(this.selectableId, currentSelectableId)
 
     return when {
         compareResult < 0 -> 0
@@ -291,26 +306,26 @@
     }
 }
 
-private fun getXDirection(position: Offset, bounds: Rect): Direction = when {
-    position.x < bounds.left -> Direction.BEFORE
-    position.x > bounds.right -> Direction.AFTER
-    else -> Direction.ON
-}
+private fun getXDirection(position: Offset, bounds: Rect): Direction =
+    when {
+        position.x < bounds.left -> Direction.BEFORE
+        position.x > bounds.right -> Direction.AFTER
+        else -> Direction.ON
+    }
 
-private fun getYDirection(position: Offset, bounds: Rect): Direction = when {
-    position.y < bounds.top -> Direction.BEFORE
-    position.y > bounds.bottom -> Direction.AFTER
-    else -> Direction.ON
-}
+private fun getYDirection(position: Offset, bounds: Rect): Direction =
+    when {
+        position.y < bounds.top -> Direction.BEFORE
+        position.y > bounds.bottom -> Direction.AFTER
+        else -> Direction.ON
+    }
 
 private fun SelectionLayoutBuilder.getDirectionById(
     anchorSelectableId: Long,
     currentSelectableId: Long,
 ): Direction {
-    val compareResult = selectableIdOrderingComparator.compare(
-        anchorSelectableId,
-        currentSelectableId
-    )
+    val compareResult =
+        selectableIdOrderingComparator.compare(anchorSelectableId, currentSelectableId)
 
     return when {
         compareResult < 0 -> Direction.BEFORE
@@ -320,15 +335,17 @@
 }
 
 /**
- * Returns true if either of the directions are [Direction.ON]
- * or if the directions are not both [Direction.BEFORE] or [Direction.AFTER].
+ * Returns true if either of the directions are [Direction.ON] or if the directions are not both
+ * [Direction.BEFORE] or [Direction.AFTER].
  */
 private fun isSelected(currentDirection: Direction, otherDirection: Direction): Boolean =
     currentDirection == Direction.ON || currentDirection != otherDirection
 
 // map offsets above/below the text to 0/length respectively
-private fun getOffsetForPosition(position: Offset, textLayoutResult: TextLayoutResult): Int = when {
-    position.y <= 0f -> 0
-    position.y >= textLayoutResult.multiParagraph.height -> textLayoutResult.layoutInput.text.length
-    else -> textLayoutResult.getOffsetForPosition(position)
-}
+private fun getOffsetForPosition(position: Offset, textLayoutResult: TextLayoutResult): Int =
+    when {
+        position.y <= 0f -> 0
+        position.y >= textLayoutResult.multiParagraph.height ->
+            textLayoutResult.layoutInput.text.length
+        else -> textLayoutResult.getOffsetForPosition(position)
+    }
diff --git a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/selection/Selectable.kt b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/selection/Selectable.kt
index 4d87425..52aec43 100644
--- a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/selection/Selectable.kt
+++ b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/selection/Selectable.kt
@@ -26,23 +26,22 @@
 import androidx.compose.ui.unit.Constraints
 
 /**
- * Provides [Selection] information for a composable to SelectionContainer. Composables who can
- * be selected should subscribe to [SelectionRegistrar] using this interface.
+ * Provides [Selection] information for a composable to SelectionContainer. Composables who can be
+ * selected should subscribe to [SelectionRegistrar] using this interface.
  */
-
 internal interface Selectable {
     /**
      * An ID used by [SelectionRegistrar] to identify this [Selectable]. This value should not be
-     * [SelectionRegistrar.InvalidSelectableId].
-     * When a [Selectable] is created, it can request an ID from [SelectionRegistrar] by
-     * calling [SelectionRegistrar.nextSelectableId].
+     * [SelectionRegistrar.InvalidSelectableId]. When a [Selectable] is created, it can request an
+     * ID from [SelectionRegistrar] by calling [SelectionRegistrar.nextSelectableId].
+     *
      * @see SelectionRegistrar.nextSelectableId
      */
     val selectableId: Long
 
     /**
-     * A function which adds [SelectableInfo] representing this [Selectable]
-     * to the [SelectionLayoutBuilder].
+     * A function which adds [SelectableInfo] representing this [Selectable] to the
+     * [SelectionLayoutBuilder].
      */
     fun appendSelectableInfoToBuilder(builder: SelectionLayoutBuilder)
 
@@ -51,7 +50,7 @@
      * provided null should be returned.
      *
      * @return selectAll [Selection] information for a selectable composable. If no selection can be
-     * provided null should be returned.
+     *   provided null should be returned.
      */
     fun getSelectAllSelection(): Selection?
 
@@ -60,7 +59,6 @@
      *
      * @param selection [Selection] contains the [SelectionHandle]
      * @param isStartHandle true if it's the start handle, false if it's the end handle.
-     *
      * @return [Offset] of this handle, based on which the [SelectionHandle] will be drawn.
      */
     fun getHandlePosition(selection: Selection, isStartHandle: Boolean): Offset
@@ -69,7 +67,7 @@
      * Return the [LayoutCoordinates] of the [Selectable].
      *
      * @return [LayoutCoordinates] of the [Selectable]. This could be null if called before
-     * composing.
+     *   composing.
      */
     fun getLayoutCoordinates(): LayoutCoordinates?
 
@@ -82,14 +80,13 @@
 
     /**
      * Return the bounding box of the character for given character offset. This is currently for
-     * text.
-     * In future when we implemented other selectable Composables, we can return the bounding box of
-     * the wanted rectangle. For example, for an image selectable, this should return the
+     * text. In future when we implemented other selectable Composables, we can return the bounding
+     * box of the wanted rectangle. For example, for an image selectable, this should return the
      * bounding box of the image.
      *
      * @param offset a character offset
      * @return the bounding box for the character in [Rect], or [Rect.Zero] if the selectable is
-     * empty.
+     *   empty.
      */
     fun getBoundingBox(offset: Int): Rect
 
@@ -112,8 +109,8 @@
     /**
      * Returns the center y coordinate of the line on which the specified text offset appears.
      *
-     * If you ask for a position before 0, you get the center of the first line;
-     * if you ask for a position beyond the end of the text, you get the center of the last line.
+     * If you ask for a position before 0, you get the center of the first line; if you ask for a
+     * position beyond the end of the text, you get the center of the last line.
      *
      * @param offset a character offset
      * @return the line center y coordinate of the line containing [offset]
@@ -124,9 +121,9 @@
      * Return the offsets of the start and end of the line containing [offset], or [TextRange.Zero]
      * if the selectable is empty. These offsets are in the same "coordinate space" as
      * [getBoundingBox], and despite being returned in a [TextRange], may not refer to offsets in
-     * actual text if the selectable contains other types of content. This function returns
-     * the last visible line's boundaries if offset is larger than text length or the character at
-     * given offset would fall on a line which is hidden by maxLines or Constraints.
+     * actual text if the selectable contains other types of content. This function returns the last
+     * visible line's boundaries if offset is larger than text length or the character at given
+     * offset would fall on a line which is hidden by maxLines or Constraints.
      */
     fun getRangeOfLineContaining(offset: Int): TextRange
 
diff --git a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/selection/Selection.kt b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/selection/Selection.kt
index 9efe95d..c224bc8 100644
--- a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/selection/Selection.kt
+++ b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/selection/Selection.kt
@@ -20,24 +20,18 @@
 import androidx.compose.ui.text.TextRange
 import androidx.compose.ui.text.style.ResolvedTextDirection
 
-/**
- * Information about the current Selection.
- */
+/** Information about the current Selection. */
 @Immutable
 internal data class Selection(
-    /**
-     * Information about the start of the selection.
-     */
+    /** Information about the start of the selection. */
     val start: AnchorInfo,
 
-    /**
-     * Information about the end of the selection.
-     */
+    /** Information about the end of the selection. */
     val end: AnchorInfo,
     /**
-     * The flag to show that the selection handles are dragged across each other. After selection
-     * is initialized, if user drags one handle to cross the other handle, this is true, otherwise
-     * it's false.
+     * The flag to show that the selection handles are dragged across each other. After selection is
+     * initialized, if user drags one handle to cross the other handle, this is true, otherwise it's
+     * false.
      */
     // If selection happens in single widget, checking [TextRange.start] > [TextRange.end] is
     // enough.
@@ -45,14 +39,10 @@
     // calculation. To avoid repeated calculation, making it as a flag is cheaper.
     val handlesCrossed: Boolean = false
 ) {
-    /**
-     * Contains information about an anchor (start/end) of selection.
-     */
+    /** Contains information about an anchor (start/end) of selection. */
     @Immutable
     internal data class AnchorInfo(
-        /**
-         * Text direction of the character in selection edge.
-         */
+        /** Text direction of the character in selection edge. */
         val direction: ResolvedTextDirection,
 
         /**
@@ -61,9 +51,7 @@
          */
         val offset: Int,
 
-        /**
-         * The id of the [Selectable] which contains this [Selection] Anchor.
-         */
+        /** The id of the [Selectable] which contains this [Selection] Anchor. */
         val selectableId: Long
     )
 
@@ -83,9 +71,7 @@
         }
     }
 
-    /**
-     * Returns the selection offset information as a [TextRange]
-     */
+    /** Returns the selection offset information as a [TextRange] */
     fun toTextRange(): TextRange {
         return TextRange(start.offset, end.offset)
     }
diff --git a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/selection/SelectionAdjustment.kt b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/selection/SelectionAdjustment.kt
index bb040cd..fdcab51 100644
--- a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/selection/SelectionAdjustment.kt
+++ b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/selection/SelectionAdjustment.kt
@@ -23,22 +23,23 @@
 
 /**
  * Selection can be adjusted depends on context. For example, in touch mode dragging after a long
- * press adjusts selection by word. But selection by dragging handles is character precise
- * without adjustments. With a mouse, double-click selects by words and triple-clicks by paragraph.
+ * press adjusts selection by word. But selection by dragging handles is character precise without
+ * adjustments. With a mouse, double-click selects by words and triple-clicks by paragraph.
+ *
  * @see [SelectionRegistrar.notifySelectionUpdate]
  */
 internal fun interface SelectionAdjustment {
 
     /**
-     * The callback function that is called once a new selection arrives, the return value of
-     * this function will be the final adjusted [Selection].
+     * The callback function that is called once a new selection arrives, the return value of this
+     * function will be the final adjusted [Selection].
      */
     fun adjust(layout: SelectionLayout): Selection
 
     companion object {
         /**
-         * The selection adjustment that does nothing and directly return the input raw
-         * selection range.
+         * The selection adjustment that does nothing and directly return the input raw selection
+         * range.
          */
         val None = SelectionAdjustment { layout ->
             Selection(
@@ -50,58 +51,53 @@
 
         /**
          * The character based selection. It normally won't change the raw selection range except
-         * when the input raw selection range is collapsed. In this case, it will almost
-         * always make sure at least one character is selected.
+         * when the input raw selection range is collapsed. In this case, it will almost always make
+         * sure at least one character is selected.
          */
         val Character = SelectionAdjustment { layout ->
             None.adjust(layout).ensureAtLeastOneChar(layout)
         }
 
         /**
-         * The word based selection adjustment. It will adjust the raw input selection such that
-         * the selection boundary snap to the word boundary. It will always expand the raw input
-         * selection range to the closest word boundary. If the raw selection is reversed, it
-         * will always return a reversed selection, and vice versa.
+         * The word based selection adjustment. It will adjust the raw input selection such that the
+         * selection boundary snap to the word boundary. It will always expand the raw input
+         * selection range to the closest word boundary. If the raw selection is reversed, it will
+         * always return a reversed selection, and vice versa.
          */
         val Word = SelectionAdjustment { layout ->
-            adjustToBoundaries(layout) {
-                textLayoutResult.getWordBoundary(it)
-            }
+            adjustToBoundaries(layout) { textLayoutResult.getWordBoundary(it) }
         }
 
         /**
          * The paragraph based selection adjustment. It will adjust the raw input selection such
-         * that the selection boundary snap to the paragraph boundary. It will always expand the
-         * raw input selection range to the closest paragraph boundary. If the raw selection is
+         * that the selection boundary snap to the paragraph boundary. It will always expand the raw
+         * input selection range to the closest paragraph boundary. If the raw selection is
          * reversed, it will always return a reversed selection, and vice versa.
          */
         val Paragraph = SelectionAdjustment { layout ->
-            adjustToBoundaries(layout) {
-                inputText.getParagraphBoundary(it)
-            }
+            adjustToBoundaries(layout) { inputText.getParagraphBoundary(it) }
         }
 
         /**
-         * A special version of character based selection that accelerates the selection update
-         * with word based selection. In short, it expands by word and shrinks by character.
-         * Here is more details of the behavior:
+         * A special version of character based selection that accelerates the selection update with
+         * word based selection. In short, it expands by word and shrinks by character. Here is more
+         * details of the behavior:
          * 1. When previous selection is null, it will use word based selection.
-         * 2. When the start/end offset has moved to a different line/Text, it will use word
-         * based selection.
+         * 2. When the start/end offset has moved to a different line/Text, it will use word based
+         *    selection.
          * 3. When the selection is shrinking, it behave same as the character based selection.
-         * Shrinking means that the start/end offset is moving in the direction that makes
-         * selected text shorter.
-         * 4. The selection boundary is expanding,
-         *  a.if the previous start/end offset is not a word boundary, use character based
-         * selection.
-         *  b.if the previous start/end offset is a word boundary, use word based selection.
+         *    Shrinking means that the start/end offset is moving in the direction that makes
+         *    selected text shorter.
+         * 4. The selection boundary is expanding, a.if the previous start/end offset is not a word
+         *    boundary, use character based selection. b.if the previous start/end offset is a word
+         *    boundary, use word based selection.
          *
-         *  Notice that this selection adjustment assumes that when isStartHandle is true, only
-         *  start handle is moving(or unchanged), and vice versa.
+         * Notice that this selection adjustment assumes that when isStartHandle is true, only start
+         * handle is moving(or unchanged), and vice versa.
          */
         val CharacterWithWordAccelerate = SelectionAdjustment { layout ->
-            val previousSelection = layout.previousSelection
-                ?: return@SelectionAdjustment Word.adjust(layout)
+            val previousSelection =
+                layout.previousSelection ?: return@SelectionAdjustment Word.adjust(layout)
 
             val previousAnchor: Selection.AnchorInfo
             val newAnchor: Selection.AnchorInfo
@@ -129,25 +125,22 @@
                 // It also saves an allocation.
                 previousSelection
             } else {
-                val crossed = layout.crossStatus == CrossStatus.CROSSED ||
-                    (layout.crossStatus == CrossStatus.COLLAPSED &&
-                        startAnchor.offset > endAnchor.offset)
+                val crossed =
+                    layout.crossStatus == CrossStatus.CROSSED ||
+                        (layout.crossStatus == CrossStatus.COLLAPSED &&
+                            startAnchor.offset > endAnchor.offset)
                 Selection(startAnchor, endAnchor, crossed).ensureAtLeastOneChar(layout)
             }
         }
     }
 }
 
-/**
- * @receiver The selection layout. It is expected that its previousSelection is non-null
- */
+/** @receiver The selection layout. It is expected that its previousSelection is non-null */
 private fun SelectionLayout.updateSelectionBoundary(
     info: SelectableInfo,
     previousSelectionAnchor: Selection.AnchorInfo
 ): Selection.AnchorInfo {
-    val currentRawOffset =
-        if (isStartHandle) info.rawStartHandleOffset
-        else info.rawEndHandleOffset
+    val currentRawOffset = if (isStartHandle) info.rawStartHandleOffset else info.rawEndHandleOffset
 
     val currentSlot = if (isStartHandle) startSlot else endSlot
     if (currentSlot != info.slot) {
@@ -155,23 +148,21 @@
         return info.anchorForOffset(currentRawOffset)
     }
 
-    val currentRawLine by lazy(LazyThreadSafetyMode.NONE) {
-        info.textLayoutResult.getLineForOffset(currentRawOffset)
-    }
+    val currentRawLine by
+        lazy(LazyThreadSafetyMode.NONE) { info.textLayoutResult.getLineForOffset(currentRawOffset) }
 
-    val otherRawOffset =
-        if (isStartHandle) info.rawEndHandleOffset
-        else info.rawStartHandleOffset
+    val otherRawOffset = if (isStartHandle) info.rawEndHandleOffset else info.rawStartHandleOffset
 
-    val anchorSnappedToWordBoundary by lazy(LazyThreadSafetyMode.NONE) {
-        info.snapToWordBoundary(
-            currentLine = currentRawLine,
-            currentOffset = currentRawOffset,
-            otherOffset = otherRawOffset,
-            isStart = isStartHandle,
-            crossed = crossStatus == CrossStatus.CROSSED
-        )
-    }
+    val anchorSnappedToWordBoundary by
+        lazy(LazyThreadSafetyMode.NONE) {
+            info.snapToWordBoundary(
+                currentLine = currentRawLine,
+                currentOffset = currentRawOffset,
+                otherOffset = otherRawOffset,
+                isStart = isStartHandle,
+                crossed = crossStatus == CrossStatus.CROSSED
+            )
+        }
 
     if (info.selectableId != previousSelectionAnchor.selectableId) {
         // moved to an entirely new Text, use word based adjustment
@@ -203,8 +194,9 @@
         return info.anchorForOffset(currentRawOffset)
     }
 
-    if (previousSelectionOffset == previousSelectionWordBoundary.start ||
-        previousSelectionOffset == previousSelectionWordBoundary.end
+    if (
+        previousSelectionOffset == previousSelectionWordBoundary.start ||
+            previousSelectionOffset == previousSelectionWordBoundary.end
     ) {
         // We are expanding, and the previous offset was a word boundary,
         // so continue using word boundaries.
@@ -216,10 +208,7 @@
     return info.anchorForOffset(currentRawOffset)
 }
 
-private fun SelectableInfo.isExpanding(
-    currentRawOffset: Int,
-    isStart: Boolean
-): Boolean {
+private fun SelectableInfo.isExpanding(currentRawOffset: Int, isStart: Boolean): Boolean {
     if (rawPreviousHandleOffset == -1) {
         return true
     }
@@ -248,28 +237,30 @@
     // being too long, we use the line start/end to keep the adjusted offset at the
     // same line.
     val wordStartLine = textLayoutResult.getLineForOffset(wordBoundary.start)
-    val start = if (wordStartLine == currentLine) {
-        wordBoundary.start
-    } else if (currentLine >= textLayoutResult.lineCount) {
-        // We cannot find the line start, because this line is not even visible.
-        // Since we cannot really select meaningfully in this area,
-        // just use the start of the last visible line.
-        textLayoutResult.getLineStart(textLayoutResult.lineCount - 1)
-    } else {
-        textLayoutResult.getLineStart(currentLine)
-    }
+    val start =
+        if (wordStartLine == currentLine) {
+            wordBoundary.start
+        } else if (currentLine >= textLayoutResult.lineCount) {
+            // We cannot find the line start, because this line is not even visible.
+            // Since we cannot really select meaningfully in this area,
+            // just use the start of the last visible line.
+            textLayoutResult.getLineStart(textLayoutResult.lineCount - 1)
+        } else {
+            textLayoutResult.getLineStart(currentLine)
+        }
 
     val wordEndLine = textLayoutResult.getLineForOffset(wordBoundary.end)
-    val end = if (wordEndLine == currentLine) {
-        wordBoundary.end
-    } else if (currentLine >= textLayoutResult.lineCount) {
-        // We cannot find the line end, because this line is not even visible.
-        // Since we cannot really select meaningfully in this area,
-        // just use the end of the last visible line.
-        textLayoutResult.getLineEnd(textLayoutResult.lineCount - 1)
-    } else {
-        textLayoutResult.getLineEnd(currentLine)
-    }
+    val end =
+        if (wordEndLine == currentLine) {
+            wordBoundary.end
+        } else if (currentLine >= textLayoutResult.lineCount) {
+            // We cannot find the line end, because this line is not even visible.
+            // Since we cannot really select meaningfully in this area,
+            // just use the end of the last visible line.
+            textLayoutResult.getLineEnd(textLayoutResult.lineCount - 1)
+        } else {
+            textLayoutResult.getLineEnd(currentLine)
+        }
 
     // If one of the word boundary is exactly same as the otherBoundaryOffset, we
     // can't snap to this word boundary since it will result in an empty selection
@@ -281,17 +272,18 @@
         return anchorForOffset(start)
     }
 
-    val resultOffset = if (isStart xor crossed) {
-        // In this branch when:
-        // 1. selection is updating the start offset, and selection is not reversed.
-        // 2. selection is updating the end offset, and selection is reversed.
-        if (currentOffset <= end) start else end
-    } else {
-        // In this branch when:
-        // 1. selection is updating the end offset, and selection is not reversed.
-        // 2. selection is updating the start offset, and selection is reversed.
-        if (currentOffset >= start) end else start
-    }
+    val resultOffset =
+        if (isStart xor crossed) {
+            // In this branch when:
+            // 1. selection is updating the start offset, and selection is not reversed.
+            // 2. selection is updating the end offset, and selection is reversed.
+            if (currentOffset <= end) start else end
+        } else {
+            // In this branch when:
+            // 1. selection is updating the end offset, and selection is not reversed.
+            // 2. selection is updating the start offset, and selection is reversed.
+            if (currentOffset >= start) end else start
+        }
 
     return anchorForOffset(resultOffset)
 }
@@ -306,18 +298,20 @@
 ): Selection {
     val crossed = layout.crossStatus == CrossStatus.CROSSED
     return Selection(
-        start = layout.startInfo.anchorOnBoundary(
-            crossed = crossed,
-            isStart = true,
-            slot = layout.startSlot,
-            boundaryFunction = boundaryFunction,
-        ),
-        end = layout.endInfo.anchorOnBoundary(
-            crossed = crossed,
-            isStart = false,
-            slot = layout.endSlot,
-            boundaryFunction = boundaryFunction,
-        ),
+        start =
+            layout.startInfo.anchorOnBoundary(
+                crossed = crossed,
+                isStart = true,
+                slot = layout.startSlot,
+                boundaryFunction = boundaryFunction,
+            ),
+        end =
+            layout.endInfo.anchorOnBoundary(
+                crossed = crossed,
+                isStart = false,
+                slot = layout.endSlot,
+                boundaryFunction = boundaryFunction,
+            ),
         handlesCrossed = crossed
     )
 }
@@ -334,16 +328,14 @@
         return anchorForOffset(offset)
     }
 
-    val range = with(boundaryFunction) {
-        getBoundary(offset)
-    }
+    val range = with(boundaryFunction) { getBoundary(offset) }
 
     return anchorForOffset(if (isStart xor crossed) range.start else range.end)
 }
 
 /**
- * This method adjusts the selection to one character respecting [String.findPrecedingBreak]
- * and [String.findFollowingBreak].
+ * This method adjusts the selection to one character respecting [String.findPrecedingBreak] and
+ * [String.findFollowingBreak].
  */
 internal fun Selection.ensureAtLeastOneChar(layout: SelectionLayout): Selection {
     // There already is at least one char in this selection, return this selection unchanged.
@@ -370,9 +362,7 @@
     return expandOneChar(layout)
 }
 
-/**
- * Precondition: the selection is empty.
- */
+/** Precondition: the selection is empty. */
 private fun Selection.expandOneChar(layout: SelectionLayout): Selection {
     val info = layout.currentInfo
     val text = info.inputText
@@ -390,7 +380,6 @@
                 copy(end = end.changeOffset(info, followingBreak), handlesCrossed = false)
             }
         }
-
         lastOffset -> {
             val precedingBreak = text.findPrecedingBreak(lastOffset)
             if (layout.isStartHandle) {
@@ -399,7 +388,6 @@
                 copy(end = end.changeOffset(info, precedingBreak), handlesCrossed = true)
             }
         }
-
         else -> {
             // In cases where offset is not along the boundary,
             // we will try to maintain the current cross handle states.
@@ -424,7 +412,5 @@
 private fun Selection.AnchorInfo.changeOffset(
     info: SelectableInfo,
     newOffset: Int,
-): Selection.AnchorInfo = copy(
-    offset = newOffset,
-    direction = info.textLayoutResult.getBidiRunDirection(newOffset)
-)
+): Selection.AnchorInfo =
+    copy(offset = newOffset, direction = info.textLayoutResult.getBidiRunDirection(newOffset))
diff --git a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/selection/SelectionContainer.kt b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/selection/SelectionContainer.kt
index 3becb0e..7950548 100644
--- a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/selection/SelectionContainer.kt
+++ b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/selection/SelectionContainer.kt
@@ -38,10 +38,10 @@
  * Enables text selection for its direct or indirect children.
  *
  * Use of a lazy layout, such as [LazyRow][androidx.compose.foundation.lazy.LazyRow] or
- * [LazyColumn][androidx.compose.foundation.lazy.LazyColumn], within a [SelectionContainer]
- * has undefined behavior on text items that aren't composed. For example, texts that aren't
- * composed will not be included in copy operations and select all will not expand the
- * selection to include them.
+ * [LazyColumn][androidx.compose.foundation.lazy.LazyColumn], within a [SelectionContainer] has
+ * undefined behavior on text items that aren't composed. For example, texts that aren't composed
+ * will not be included in copy operations and select all will not expand the selection to include
+ * them.
  *
  * @sample androidx.compose.foundation.samples.SelectionSample
  */
@@ -51,25 +51,20 @@
     SelectionContainer(
         modifier = modifier,
         selection = selection,
-        onSelectionChange = {
-            selection = it
-        },
+        onSelectionChange = { selection = it },
         children = content
     )
 }
 
 /**
- * Disables text selection for its direct or indirect children. To use this, simply add this
- * to wrap one or more text composables.
+ * Disables text selection for its direct or indirect children. To use this, simply add this to wrap
+ * one or more text composables.
  *
  * @sample androidx.compose.foundation.samples.DisableSelectionSample
  */
 @Composable
 fun DisableSelection(content: @Composable () -> Unit) {
-    CompositionLocalProvider(
-        LocalSelectionRegistrar provides null,
-        content = content
-    )
+    CompositionLocalProvider(LocalSelectionRegistrar provides null, content = content)
 }
 
 /**
@@ -83,15 +78,14 @@
 internal fun SelectionContainer(
     /** A [Modifier] for SelectionContainer. */
     modifier: Modifier = Modifier,
-    /** Current Selection status.*/
+    /** Current Selection status. */
     selection: Selection?,
     /** A function containing customized behaviour when selection changes. */
     onSelectionChange: (Selection?) -> Unit,
     children: @Composable () -> Unit
 ) {
-    val registrarImpl = rememberSaveable(saver = SelectionRegistrarImpl.Saver) {
-        SelectionRegistrarImpl()
-    }
+    val registrarImpl =
+        rememberSaveable(saver = SelectionRegistrarImpl.Saver) { SelectionRegistrarImpl() }
 
     val manager = remember { SelectionManager(registrarImpl) }
 
@@ -107,38 +101,43 @@
             // cross-composable selection.
             SimpleLayout(modifier = modifier.then(manager.modifier)) {
                 children()
-                if (manager.isInTouchMode &&
-                    manager.hasFocus &&
-                    !manager.isTriviallyCollapsedSelection()
+                if (
+                    manager.isInTouchMode &&
+                        manager.hasFocus &&
+                        !manager.isTriviallyCollapsedSelection()
                 ) {
                     manager.selection?.let {
                         listOf(true, false).fastForEach { isStartHandle ->
-                            val observer = remember(isStartHandle) {
-                                manager.handleDragObserver(isStartHandle)
-                            }
-
-                            val positionProvider: () -> Offset = remember(isStartHandle) {
-                                if (isStartHandle) {
-                                    { manager.startHandlePosition ?: Offset.Unspecified }
-                                } else {
-                                    { manager.endHandlePosition ?: Offset.Unspecified }
+                            val observer =
+                                remember(isStartHandle) {
+                                    manager.handleDragObserver(isStartHandle)
                                 }
-                            }
 
-                            val direction = if (isStartHandle) {
-                                it.start.direction
-                            } else {
-                                it.end.direction
-                            }
+                            val positionProvider: () -> Offset =
+                                remember(isStartHandle) {
+                                    if (isStartHandle) {
+                                        { manager.startHandlePosition ?: Offset.Unspecified }
+                                    } else {
+                                        { manager.endHandlePosition ?: Offset.Unspecified }
+                                    }
+                                }
+
+                            val direction =
+                                if (isStartHandle) {
+                                    it.start.direction
+                                } else {
+                                    it.end.direction
+                                }
 
                             SelectionHandle(
                                 offsetProvider = positionProvider,
                                 isStartHandle = isStartHandle,
                                 direction = direction,
                                 handlesCrossed = it.handlesCrossed,
-                                modifier = Modifier.pointerInput(observer) {
-                                    detectDownAndDragGesturesWithObserver(observer)
-                                },
+                                modifier =
+                                    Modifier.pointerInput(observer) {
+                                        detectDownAndDragGesturesWithObserver(observer)
+                                    },
                             )
                         }
                     }
diff --git a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/selection/SelectionGestures.kt b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/selection/SelectionGestures.kt
index e8a0ad3..ca04334 100644
--- a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/selection/SelectionGestures.kt
+++ b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/selection/SelectionGestures.kt
@@ -43,26 +43,28 @@
 import kotlinx.coroutines.CancellationException
 
 /**
- * Without shift it starts the new selection from scratch.
- * With shift it expands/shrinks existing selection.
- * A click sets the start and end of the selection,
- * but shift click only sets the end of the selection.
+ * Without shift it starts the new selection from scratch. With shift it expands/shrinks existing
+ * selection. A click sets the start and end of the selection, but shift click only sets the end of
+ * the selection.
  */
 internal interface MouseSelectionObserver {
     /**
      * Invoked on click (with shift).
+     *
      * @return if event will be consumed
      */
     fun onExtend(downPosition: Offset): Boolean
 
     /**
      * Invoked on drag after shift click.
+     *
      * @return if event will be consumed
      */
     fun onExtendDrag(dragPosition: Offset): Boolean
 
     /**
      * Invoked on first click (without shift).
+     *
      * @return if event will be consumed
      */
     // if returns true event will be consumed
@@ -70,13 +72,12 @@
 
     /**
      * Invoked when dragging (without shift).
+     *
      * @return if event will be consumed
      */
     fun onDrag(dragPosition: Offset, adjustment: SelectionAdjustment): Boolean
 
-    /**
-     * Invoked when finishing a selection mouse gesture.
-     */
+    /** Invoked when finishing a selection mouse gesture. */
     fun onDragDone()
 }
 
@@ -85,35 +86,36 @@
 //  This only updates when the pointer is within the bounds of what it is modifying,
 //  thus it is a placeholder until the other functionality is implemented.
 private const val STATIC_KEY = 867_5309 // unique key to not clash with other global pointer inputs
-internal fun Modifier.updateSelectionTouchMode(
-    updateTouchMode: (Boolean) -> Unit
-): Modifier = this.pointerInput(STATIC_KEY) {
-    awaitPointerEventScope {
-        while (true) {
-            val event = awaitPointerEvent(PointerEventPass.Initial)
-            updateTouchMode(!event.isPrecisePointer)
+
+internal fun Modifier.updateSelectionTouchMode(updateTouchMode: (Boolean) -> Unit): Modifier =
+    this.pointerInput(STATIC_KEY) {
+        awaitPointerEventScope {
+            while (true) {
+                val event = awaitPointerEvent(PointerEventPass.Initial)
+                updateTouchMode(!event.isPrecisePointer)
+            }
         }
     }
-}
 
 internal fun Modifier.selectionGestureInput(
     mouseSelectionObserver: MouseSelectionObserver,
     textDragObserver: TextDragObserver,
-) = this.pointerInput(mouseSelectionObserver, textDragObserver) {
-    val clicksCounter = ClicksCounter(viewConfiguration)
-    awaitEachGesture {
-        val down = awaitDown()
-        if (
-            down.isPrecisePointer &&
-            down.buttons.isPrimaryPressed &&
-            down.changes.fastAll { !it.isConsumed }
-        ) {
-            mouseSelection(mouseSelectionObserver, clicksCounter, down)
-        } else if (!down.isPrecisePointer) {
-            touchSelection(textDragObserver, down)
+) =
+    this.pointerInput(mouseSelectionObserver, textDragObserver) {
+        val clicksCounter = ClicksCounter(viewConfiguration)
+        awaitEachGesture {
+            val down = awaitDown()
+            if (
+                down.isPrecisePointer &&
+                    down.buttons.isPrimaryPressed &&
+                    down.changes.fastAll { !it.isConsumed }
+            ) {
+                mouseSelection(mouseSelectionObserver, clicksCounter, down)
+            } else if (!down.isPrecisePointer) {
+                touchSelection(textDragObserver, down)
+            }
         }
     }
-}
 
 private suspend fun AwaitPointerEventScope.touchSelection(
     observer: TextDragObserver,
@@ -131,9 +133,7 @@
                 }
             ) {
                 // consume up if we quit drag gracefully with the up
-                currentEvent.changes.fastForEach {
-                    if (it.changedToUp()) it.consume()
-                }
+                currentEvent.changes.fastForEach { if (it.changedToUp()) it.consume() }
                 observer.onStop()
             } else {
                 observer.onCancel()
@@ -155,39 +155,38 @@
     if (down.isShiftPressed) {
         val started = observer.onExtend(downChange.position)
         if (started) {
-            val shouldConsumeUp = drag(downChange.id) {
-                if (observer.onExtendDrag(it.position)) {
-                    it.consume()
+            val shouldConsumeUp =
+                drag(downChange.id) {
+                    if (observer.onExtendDrag(it.position)) {
+                        it.consume()
+                    }
                 }
-            }
 
             if (shouldConsumeUp) {
-                currentEvent.changes.fastForEach {
-                    if (it.changedToUp()) it.consume()
-                }
+                currentEvent.changes.fastForEach { if (it.changedToUp()) it.consume() }
             }
 
             observer.onDragDone()
         }
     } else {
-        val selectionAdjustment = when (clicksCounter.clicks) {
-            1 -> SelectionAdjustment.None
-            2 -> SelectionAdjustment.Word
-            else -> SelectionAdjustment.Paragraph
-        }
+        val selectionAdjustment =
+            when (clicksCounter.clicks) {
+                1 -> SelectionAdjustment.None
+                2 -> SelectionAdjustment.Word
+                else -> SelectionAdjustment.Paragraph
+            }
 
         val started = observer.onStart(downChange.position, selectionAdjustment)
         if (started) {
-            val shouldConsumeUp = drag(downChange.id) {
-                if (observer.onDrag(it.position, selectionAdjustment)) {
-                    it.consume()
+            val shouldConsumeUp =
+                drag(downChange.id) {
+                    if (observer.onDrag(it.position, selectionAdjustment)) {
+                        it.consume()
+                    }
                 }
-            }
 
             if (shouldConsumeUp) {
-                currentEvent.changes.fastForEach {
-                    if (it.changedToUp()) it.consume()
-                }
+                currentEvent.changes.fastForEach { if (it.changedToUp()) it.consume() }
             }
 
             observer.onDragDone()
@@ -196,9 +195,8 @@
 }
 
 /**
- * Gesture handler for mouse and touch. Determines whether this is mouse or touch based on the
- * first down, then uses the gesture handler for that input type, delegating to the appropriate
- * observer.
+ * Gesture handler for mouse and touch. Determines whether this is mouse or touch based on the first
+ * down, then uses the gesture handler for that input type, delegating to the appropriate observer.
  */
 internal suspend fun PointerInputScope.selectionGesturePointerInputBtf2(
     mouseSelectionObserver: MouseSelectionObserver,
@@ -211,8 +209,8 @@
         val isPrecise = downEvent.isPrecisePointer
         if (
             isPrecise &&
-            downEvent.buttons.isPrimaryPressed &&
-            downEvent.changes.fastAll { !it.isConsumed }
+                downEvent.buttons.isPrimaryPressed &&
+                downEvent.changes.fastAll { !it.isConsumed }
         ) {
             mouseSelectionBtf2(mouseSelectionObserver, clicksCounter, downEvent)
         } else if (!isPrecise) {
@@ -225,9 +223,9 @@
 }
 
 /**
- * Gesture handler for touch selection on only the first press.
- * The first press will wait for a long press instead of immediately looking for drags.
- * If no long press is found, this does not trigger any observer.
+ * Gesture handler for touch selection on only the first press. The first press will wait for a long
+ * press instead of immediately looking for drags. If no long press is found, this does not trigger
+ * any observer.
  */
 private suspend fun AwaitPointerEventScope.touchSelectionFirstPress(
     observer: TextDragObserver,
@@ -238,15 +236,14 @@
         val longPress = awaitLongPressOrCancellation(firstDown.id)
         if (longPress != null && distanceIsTolerable(viewConfiguration, firstDown, longPress)) {
             observer.onStart(longPress.position)
-            val dragCompletedWithUp = drag(longPress.id) {
-                observer.onDrag(it.positionChange())
-                it.consume()
-            }
+            val dragCompletedWithUp =
+                drag(longPress.id) {
+                    observer.onDrag(it.positionChange())
+                    it.consume()
+                }
             if (dragCompletedWithUp) {
                 // consume up if we quit drag gracefully with the up
-                currentEvent.changes.fastForEach {
-                    if (it.changedToUp()) it.consume()
-                }
+                currentEvent.changes.fastForEach { if (it.changedToUp()) it.consume() }
                 observer.onStop()
             } else {
                 observer.onCancel()
@@ -258,11 +255,16 @@
     }
 }
 
-private enum class DownResolution { Up, Drag, Timeout, Cancel }
+private enum class DownResolution {
+    Up,
+    Drag,
+    Timeout,
+    Cancel
+}
 
 /**
- * Gesture handler for touch selection on all presses except for the first.
- * Subsequent presses immediately starts looking for drags when the press is received.
+ * Gesture handler for touch selection on all presses except for the first. Subsequent presses
+ * immediately starts looking for drags when the press is received.
  */
 private suspend fun AwaitPointerEventScope.touchSelectionSubsequentPress(
     observer: TextDragObserver,
@@ -273,26 +275,28 @@
         val pointerId = firstDown.id
 
         var overSlop: Offset = Offset.Unspecified
-        val downResolution = withTimeoutOrNull(viewConfiguration.longPressTimeoutMillis) {
-            val firstDragPastSlop = awaitTouchSlopOrCancellation(pointerId) { change, slop ->
-                change.consume()
-                overSlop = slop
-            }
+        val downResolution =
+            withTimeoutOrNull(viewConfiguration.longPressTimeoutMillis) {
+                val firstDragPastSlop =
+                    awaitTouchSlopOrCancellation(pointerId) { change, slop ->
+                        change.consume()
+                        overSlop = slop
+                    }
 
-            // If slop is passed, we have started a drag.
-            if (firstDragPastSlop != null && overSlop.isSpecified) {
-                return@withTimeoutOrNull DownResolution.Drag
-            }
+                // If slop is passed, we have started a drag.
+                if (firstDragPastSlop != null && overSlop.isSpecified) {
+                    return@withTimeoutOrNull DownResolution.Drag
+                }
 
-            // Otherwise, this either was cancelled or the pointer is now up.
-            val currentChange = currentEvent.changes.first()
-            return@withTimeoutOrNull if (currentChange.changedToUpIgnoreConsumed()) {
-                currentChange.consume()
-                DownResolution.Up
-            } else {
-                DownResolution.Cancel
-            }
-        } ?: DownResolution.Timeout
+                // Otherwise, this either was cancelled or the pointer is now up.
+                val currentChange = currentEvent.changes.first()
+                return@withTimeoutOrNull if (currentChange.changedToUpIgnoreConsumed()) {
+                    currentChange.consume()
+                    DownResolution.Up
+                } else {
+                    DownResolution.Cancel
+                }
+            } ?: DownResolution.Timeout
 
         if (downResolution == DownResolution.Cancel) {
             // On a cancel, we simply take no action.
@@ -312,10 +316,11 @@
         }
         // Finally, if waitResult was a Timeout, then this was a long press. Simply wait for drags.
 
-        val dragCompletedWithUp = drag(pointerId) {
-            observer.onDrag(it.positionChange())
-            it.consume()
-        }
+        val dragCompletedWithUp =
+            drag(pointerId) {
+                observer.onDrag(it.positionChange())
+                it.consume()
+            }
 
         if (dragCompletedWithUp) {
             // consume up if we quit drag gracefully with the up
@@ -334,9 +339,7 @@
     }
 }
 
-/**
- * Gesture handler for mouse selection.
- */
+/** Gesture handler for mouse selection. */
 private suspend fun AwaitPointerEventScope.mouseSelectionBtf2(
     observer: MouseSelectionObserver,
     clicksCounter: ClicksCounter,
@@ -348,42 +351,41 @@
         if (started) {
             try {
                 downChange.consume()
-                val shouldConsumeUp = drag(downChange.id) {
-                    if (observer.onExtendDrag(it.position)) {
-                        it.consume()
+                val shouldConsumeUp =
+                    drag(downChange.id) {
+                        if (observer.onExtendDrag(it.position)) {
+                            it.consume()
+                        }
                     }
-                }
 
                 if (shouldConsumeUp) {
-                    currentEvent.changes.fastForEach {
-                        if (it.changedToUp()) it.consume()
-                    }
+                    currentEvent.changes.fastForEach { if (it.changedToUp()) it.consume() }
                 }
             } finally {
                 observer.onDragDone()
             }
         }
     } else {
-        val selectionAdjustment = when (clicksCounter.clicks) {
-            1 -> SelectionAdjustment.None
-            2 -> SelectionAdjustment.Word
-            else -> SelectionAdjustment.Paragraph
-        }
+        val selectionAdjustment =
+            when (clicksCounter.clicks) {
+                1 -> SelectionAdjustment.None
+                2 -> SelectionAdjustment.Word
+                else -> SelectionAdjustment.Paragraph
+            }
 
         val started = observer.onStart(downChange.position, selectionAdjustment)
         if (started) {
             try {
                 downChange.consume()
-                val shouldConsumeUp = drag(downChange.id) {
-                    if (observer.onDrag(it.position, selectionAdjustment)) {
-                        it.consume()
+                val shouldConsumeUp =
+                    drag(downChange.id) {
+                        if (observer.onDrag(it.position, selectionAdjustment)) {
+                            it.consume()
+                        }
                     }
-                }
 
                 if (shouldConsumeUp) {
-                    currentEvent.changes.fastForEach {
-                        if (it.changedToUp()) it.consume()
-                    }
+                    currentEvent.changes.fastForEach { if (it.changedToUp()) it.consume() }
                 }
             } finally {
                 observer.onDragDone()
@@ -392,18 +394,17 @@
     }
 }
 
-private class ClicksCounter(
-    private val viewConfiguration: ViewConfiguration
-) {
+private class ClicksCounter(private val viewConfiguration: ViewConfiguration) {
     var clicks = 0
     var prevClick: PointerInputChange? = null
 
     fun update(event: PointerEvent) {
         val currentPrevClick = prevClick
         val newClick = event.changes[0]
-        if (currentPrevClick != null &&
-            timeIsTolerable(currentPrevClick, newClick) &&
-            positionIsTolerable(currentPrevClick, newClick)
+        if (
+            currentPrevClick != null &&
+                timeIsTolerable(currentPrevClick, newClick) &&
+                positionIsTolerable(currentPrevClick, newClick)
         ) {
             clicks += 1
         } else {
diff --git a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/selection/SelectionHandles.kt b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/selection/SelectionHandles.kt
index ff62025..23c2bc0 100644
--- a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/selection/SelectionHandles.kt
+++ b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/selection/SelectionHandles.kt
@@ -48,8 +48,8 @@
  *
  * @param handle Which selection [Handle] this is about.
  * @param position The position that the handle is anchored to relative to the selectable content.
- * This position is not necessarily the position of the popup itself, it's the position that the
- * handle "points" to (so e.g. top-middle for [Handle.Cursor]).
+ *   This position is not necessarily the position of the popup itself, it's the position that the
+ *   handle "points" to (so e.g. top-middle for [Handle.Cursor]).
  * @param anchor How the selection handle is anchored to its position
  * @param visible Whether the icon of the handle is actually shown
  */
@@ -63,9 +63,8 @@
 /**
  * How the selection handle is anchored to its position
  *
- * In a regular text selection, selection start is anchored to left.
- * Only cursor handle is always anchored at the middle.
- * In a regular text selection, selection end is anchored to right.
+ * In a regular text selection, selection start is anchored to left. Only cursor handle is always
+ * anchored at the middle. In a regular text selection, selection end is anchored to right.
  */
 internal enum class SelectionHandleAnchor {
     Left,
@@ -83,9 +82,7 @@
     modifier: Modifier,
 )
 
-/**
- * Avoids boxing of [Offset] which is an inline value class.
- */
+/** Avoids boxing of [Offset] which is an inline value class. */
 internal fun interface OffsetProvider {
     fun provide(): Offset
 }
@@ -93,17 +90,17 @@
 /**
  * Adjust coordinates for given text offset.
  *
- * Currently [android.text.Layout.getLineBottom] returns y coordinates of the next
- * line's top offset, which is not included in current line's hit area. To be able to
- * hit current line, move up this y coordinates by 1 pixel.
+ * Currently [android.text.Layout.getLineBottom] returns y coordinates of the next line's top
+ * offset, which is not included in current line's hit area. To be able to hit current line, move up
+ * this y coordinates by 1 pixel.
  */
 internal fun getAdjustedCoordinates(position: Offset): Offset {
     return Offset(position.x, position.y - 1f)
 }
 
 /**
- * This [PopupPositionProvider] for a selection handle. It will position the selection handle
- * to the result of [positionProvider] in its anchor layout.
+ * This [PopupPositionProvider] for a selection handle. It will position the selection handle to the
+ * result of [positionProvider] in its anchor layout.
  */
 internal class HandlePositionProvider(
     private val handleReferencePoint: Alignment,
@@ -133,9 +130,7 @@
     }
 }
 
-/**
- * Computes whether the handle's appearance should be left-pointing or right-pointing.
- */
+/** Computes whether the handle's appearance should be left-pointing or right-pointing. */
 internal fun isLeftSelectionHandle(
     isStartHandle: Boolean,
     direction: ResolvedTextDirection,
@@ -149,14 +144,13 @@
 }
 
 /**
- * This method is to check if the selection handles should use the natural Ltr pointing
- * direction.
+ * This method is to check if the selection handles should use the natural Ltr pointing direction.
  * If the context is Ltr and the handles are not crossed, or if the context is Rtl and the handles
  * are crossed, return true.
  *
- * In Ltr context, the start handle should point to the left, and the end handle should point to
- * the right. However, in Rtl context or when handles are crossed, the start handle should point to
- * the right, and the end handle should point to left.
+ * In Ltr context, the start handle should point to the left, and the end handle should point to the
+ * right. However, in Rtl context or when handles are crossed, the start handle should point to the
+ * right, and the end handle should point to left.
  */
 /*@VisibleForTesting*/
 internal fun isHandleLtrDirection(
diff --git a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/selection/SelectionLayout.kt b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/selection/SelectionLayout.kt
index 7ca37ee..482e49c 100644
--- a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/selection/SelectionLayout.kt
+++ b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/selection/SelectionLayout.kt
@@ -38,11 +38,11 @@
  *
  * # Explanation of Slots
  *
- * The Slot value is meant to sit either *on* an index or *between* indices.
- * The former means the pointer is on a `Text` (like slot value `1` and index `0` below).
- * The latter means the pointer is not on a `Text`, but between `Text`s (like slot value
- * `0` or `2` below). So a slot value of `2` means that the pointer is between
- * the `Text`s at index `0` and `1`, perhaps in padding or a non-selectable `Text`.
+ * The Slot value is meant to sit either *on* an index or *between* indices. The former means the
+ * pointer is on a `Text` (like slot value `1` and index `0` below). The latter means the pointer is
+ * not on a `Text`, but between `Text`s (like slot value `0` or `2` below). So a slot value of `2`
+ * means that the pointer is between the `Text`s at index `0` and `1`, perhaps in padding or a
+ * non-selectable `Text`.
  *
  * ```
  * slot value  0  1  2  3  4  5  6  7  8  9  10
@@ -50,8 +50,7 @@
  * ```
  *
  * ## Mappings:
- * The `X` represents an impossible slot assignment
- * The `|`, `/`, and `\` represent a slot mapping.
+ * The `X` represents an impossible slot assignment The `|`, `/`, and `\` represent a slot mapping.
  *
  * ### Mapping minimum slot:
  * ```
@@ -75,8 +74,8 @@
  * Maximum slot cannot be before the first `Text` (index `0`).
  *
  * ## Assertions
- * * The non-dragging slot should always be directly on a text (odd) because the non-dragging
- * handle must be anchored somewhere.
+ * * The non-dragging slot should always be directly on a text (odd) because the non-dragging handle
+ *   must be anchored somewhere.
  *     * Because of this, we can determine that if `startSlot == endSlot` then it also follows that
  *       `startSlot` and `endSlot` are even.
  */
@@ -109,8 +108,8 @@
     val lastInfo: SelectableInfo
 
     /**
-     * Run a function on every [SelectableInfo] between [firstInfo] and [lastInfo]
-     * (not including [firstInfo]/[lastInfo]).
+     * Run a function on every [SelectableInfo] between [firstInfo] and [lastInfo] (not including
+     * [firstInfo]/[lastInfo]).
      */
     fun forEachMiddleInfo(block: (SelectableInfo) -> Unit)
 
@@ -123,6 +122,7 @@
     /**
      * Whether this layout, compared to another layout, has any relevant changes that would require
      * recomputing selection.
+     *
      * @param other the selection layout to check for changes compared to this one
      */
     fun shouldRecomputeSelection(other: SelectionLayout?): Boolean
@@ -152,18 +152,21 @@
     // Most of these properties are unused unless shouldRecomputeSelection returns true,
     // hence why getters are used everywhere.
 
-    override val size get() = infoList.size
+    override val size
+        get() = infoList.size
 
     override val crossStatus: CrossStatus
-        get() = when {
-            startSlot < endSlot -> CrossStatus.NOT_CROSSED
-            startSlot > endSlot -> CrossStatus.CROSSED
-            // because one of the slots is not-dragging, it must be on a text directly
-            // because one of the slots is on a text directly and the start/end slots are equal,
-            // they both must be odd. Given this, dividing the slot by 2 should give us the correct
-            // info index.
-            else -> infoList[startSlot / 2].rawCrossStatus
-        }
+        get() =
+            when {
+                startSlot < endSlot -> CrossStatus.NOT_CROSSED
+                startSlot > endSlot -> CrossStatus.CROSSED
+                // because one of the slots is not-dragging, it must be on a text directly
+                // because one of the slots is on a text directly and the start/end slots are equal,
+                // they both must be odd. Given this, dividing the slot by 2 should give us the
+                // correct
+                // info index.
+                else -> infoList[startSlot / 2].rawCrossStatus
+            }
 
     override val startInfo: SelectableInfo
         get() = infoList[startOrEndSlotToIndex(startSlot, isStartSlot = true)]
@@ -225,29 +228,36 @@
                 "unexpectedly miss-crossed selection: $selection"
             }
             longObjectMapOf(selection.start.selectableId, selection)
-        } else mutableLongObjectMapOf<Selection>().apply {
-            val minAnchor = with(selection) { if (handlesCrossed) end else start }
-            createAndPutSubSelection(selection, firstInfo, minAnchor.offset, firstInfo.textLength)
+        } else
+            mutableLongObjectMapOf<Selection>().apply {
+                val minAnchor = with(selection) { if (handlesCrossed) end else start }
+                createAndPutSubSelection(
+                    selection,
+                    firstInfo,
+                    minAnchor.offset,
+                    firstInfo.textLength
+                )
 
-            forEachMiddleInfo { info ->
-                createAndPutSubSelection(selection, info, minOffset = 0, info.textLength)
+                forEachMiddleInfo { info ->
+                    createAndPutSubSelection(selection, info, minOffset = 0, info.textLength)
+                }
+
+                val maxAnchor = with(selection) { if (handlesCrossed) start else end }
+                createAndPutSubSelection(selection, lastInfo, minOffset = 0, maxAnchor.offset)
             }
 
-            val maxAnchor = with(selection) { if (handlesCrossed) start else end }
-            createAndPutSubSelection(selection, lastInfo, minOffset = 0, maxAnchor.offset)
-        }
-
     private fun MutableLongObjectMap<Selection>.createAndPutSubSelection(
         selection: Selection,
         info: SelectableInfo,
         minOffset: Int,
         maxOffset: Int
     ) {
-        val subSelection = if (selection.handlesCrossed) {
-            info.makeSingleLayoutSelection(start = maxOffset, end = minOffset)
-        } else {
-            info.makeSingleLayoutSelection(start = minOffset, end = maxOffset)
-        }
+        val subSelection =
+            if (selection.handlesCrossed) {
+                info.makeSingleLayoutSelection(start = maxOffset, end = minOffset)
+            } else {
+                info.makeSingleLayoutSelection(start = minOffset, end = maxOffset)
+            }
 
         // this check, if not passed, leads to exceptions when selection
         // highlighting is rendered, so check here instead.
@@ -258,11 +268,12 @@
         put(info.selectableId, subSelection)
     }
 
-    override fun toString(): String = "MultiSelectionLayout(isStartHandle=$isStartHandle, " +
-        "startPosition=${(startSlot + 1).toFloat() / 2}, " +
-        "endPosition=${(endSlot + 1).toFloat() / 2}, " +
-        "crossed=$crossStatus, " +
-        "infos=${
+    override fun toString(): String =
+        "MultiSelectionLayout(isStartHandle=$isStartHandle, " +
+            "startPosition=${(startSlot + 1).toFloat() / 2}, " +
+            "endPosition=${(endSlot + 1).toFloat() / 2}, " +
+            "crossed=$crossStatus, " +
+            "infos=${
             buildString {
                 append("[\n\t")
                 var first = true
@@ -282,12 +293,14 @@
     private fun startOrEndSlotToIndex(slot: Int, isStartSlot: Boolean): Int =
         slotToIndex(
             slot = slot,
-            isMinimumSlot = when (crossStatus) {
-                // collapsed: doesn't matter whether true or false, it will result in the same index
-                CrossStatus.COLLAPSED -> true
-                CrossStatus.NOT_CROSSED -> isStartSlot
-                CrossStatus.CROSSED -> !isStartSlot
-            }
+            isMinimumSlot =
+                when (crossStatus) {
+                    // collapsed: doesn't matter whether true or false, it will result in the same
+                    // index
+                    CrossStatus.COLLAPSED -> true
+                    CrossStatus.NOT_CROSSED -> isStartSlot
+                    CrossStatus.CROSSED -> !isStartSlot
+                }
         )
 
     private fun slotToIndex(slot: Int, isMinimumSlot: Boolean): Int {
@@ -295,11 +308,12 @@
         return (slot - slotAdjustment) / 2
     }
 
-    private fun getInfoListIndexBySelectableId(id: Long): Int = try {
-        selectableIdToInfoListIndex[id]
-    } catch (e: NoSuchElementException) {
-        throw IllegalStateException("Invalid selectableId: $id", e)
-    }
+    private fun getInfoListIndexBySelectableId(id: Long): Int =
+        try {
+            selectableIdToInfoListIndex[id]
+        } catch (e: NoSuchElementException) {
+            throw IllegalStateException("Invalid selectableId: $id", e)
+        }
 }
 
 /**
@@ -321,18 +335,31 @@
         const val DEFAULT_SELECTABLE_ID = 1L
     }
 
-    override val size get() = 1
+    override val size
+        get() = 1
+
     override val crossStatus: CrossStatus
-        get() = when {
-            startSlot < endSlot -> CrossStatus.NOT_CROSSED
-            startSlot > endSlot -> CrossStatus.CROSSED
-            else -> info.rawCrossStatus
-        }
-    override val startInfo: SelectableInfo get() = info
-    override val endInfo: SelectableInfo get() = info
-    override val currentInfo: SelectableInfo get() = info
-    override val firstInfo: SelectableInfo get() = info
-    override val lastInfo: SelectableInfo get() = info
+        get() =
+            when {
+                startSlot < endSlot -> CrossStatus.NOT_CROSSED
+                startSlot > endSlot -> CrossStatus.CROSSED
+                else -> info.rawCrossStatus
+            }
+
+    override val startInfo: SelectableInfo
+        get() = info
+
+    override val endInfo: SelectableInfo
+        get() = info
+
+    override val currentInfo: SelectableInfo
+        get() = info
+
+    override val firstInfo: SelectableInfo
+        get() = info
+
+    override val lastInfo: SelectableInfo
+        get() = info
 
     override fun forEachMiddleInfo(block: (SelectableInfo) -> Unit) {
         // there are no middle infos, so do nothing
@@ -348,16 +375,18 @@
             info.shouldRecomputeSelection(other.info)
 
     override fun createSubSelections(selection: Selection): LongObjectMap<Selection> {
-        val finalSelection = selection.run {
-            // uncross handles if necessary
-            if ((!handlesCrossed && start.offset > end.offset) ||
-                (handlesCrossed && start.offset <= end.offset)
-            ) {
-                copy(handlesCrossed = !handlesCrossed)
-            } else {
-                this
+        val finalSelection =
+            selection.run {
+                // uncross handles if necessary
+                if (
+                    (!handlesCrossed && start.offset > end.offset) ||
+                        (handlesCrossed && start.offset <= end.offset)
+                ) {
+                    copy(handlesCrossed = !handlesCrossed)
+                } else {
+                    this
+                }
             }
-        }
         return longObjectMapOf(info.selectableId, finalSelection)
     }
 
@@ -373,8 +402,8 @@
  * @param layoutResult the [TextLayoutResult] for the text field
  * @param rawStartHandleOffset the index of the start handle
  * @param rawEndHandleOffset the index of the end handle
- * @param rawPreviousHandleOffset the previous handle offset based on [isStartHandle],
- * or [UNASSIGNED_SLOT] if none
+ * @param rawPreviousHandleOffset the previous handle offset based on [isStartHandle], or
+ *   [UNASSIGNED_SLOT] if none
  * @param previousSelectionRange the previous selection
  * @param isStartOfSelection whether this is the start of a selection gesture (no previous context)
  * @param isStartHandle whether this is the start or end anchor
@@ -387,36 +416,41 @@
     previousSelectionRange: TextRange,
     isStartOfSelection: Boolean,
     isStartHandle: Boolean,
-): SelectionLayout = SingleSelectionLayout(
-    isStartHandle = isStartHandle,
-    startSlot = SingleSelectionLayout.DEFAULT_SLOT,
-    endSlot = SingleSelectionLayout.DEFAULT_SLOT,
-    previousSelection = if (isStartOfSelection) null else Selection(
-        start = Selection.AnchorInfo(
-            layoutResult.getTextDirectionForOffset(previousSelectionRange.start),
-            previousSelectionRange.start,
-            SingleSelectionLayout.DEFAULT_SELECTABLE_ID
-        ),
-        end = Selection.AnchorInfo(
-            layoutResult.getTextDirectionForOffset(previousSelectionRange.end),
-            previousSelectionRange.end,
-            SingleSelectionLayout.DEFAULT_SELECTABLE_ID
-        ),
-        handlesCrossed = previousSelectionRange.reversed
-    ),
-    info = SelectableInfo(
-        selectableId = SingleSelectionLayout.DEFAULT_SELECTABLE_ID,
-        slot = SingleSelectionLayout.DEFAULT_SLOT,
-        rawStartHandleOffset = rawStartHandleOffset,
-        rawEndHandleOffset = rawEndHandleOffset,
-        textLayoutResult = layoutResult,
-        rawPreviousHandleOffset = rawPreviousHandleOffset
-    ),
-)
+): SelectionLayout =
+    SingleSelectionLayout(
+        isStartHandle = isStartHandle,
+        startSlot = SingleSelectionLayout.DEFAULT_SLOT,
+        endSlot = SingleSelectionLayout.DEFAULT_SLOT,
+        previousSelection =
+            if (isStartOfSelection) null
+            else
+                Selection(
+                    start =
+                        Selection.AnchorInfo(
+                            layoutResult.getTextDirectionForOffset(previousSelectionRange.start),
+                            previousSelectionRange.start,
+                            SingleSelectionLayout.DEFAULT_SELECTABLE_ID
+                        ),
+                    end =
+                        Selection.AnchorInfo(
+                            layoutResult.getTextDirectionForOffset(previousSelectionRange.end),
+                            previousSelectionRange.end,
+                            SingleSelectionLayout.DEFAULT_SELECTABLE_ID
+                        ),
+                    handlesCrossed = previousSelectionRange.reversed
+                ),
+        info =
+            SelectableInfo(
+                selectableId = SingleSelectionLayout.DEFAULT_SELECTABLE_ID,
+                slot = SingleSelectionLayout.DEFAULT_SLOT,
+                rawStartHandleOffset = rawStartHandleOffset,
+                rawEndHandleOffset = rawEndHandleOffset,
+                textLayoutResult = layoutResult,
+                rawPreviousHandleOffset = rawPreviousHandleOffset
+            ),
+    )
 
-/**
- * Whether something is crossed as determined by the position of the start/end.
- */
+/** Whether something is crossed as determined by the position of the start/end. */
 internal enum class CrossStatus {
     /** The start comes after the end. */
     CROSSED,
@@ -432,13 +466,13 @@
 internal const val UNASSIGNED_SLOT = -1
 
 /**
- * A builder for [SelectionLayout] that ensures the data structures and slots
- * are properly constructed.
+ * A builder for [SelectionLayout] that ensures the data structures and slots are properly
+ * constructed.
  *
  * @param previousHandlePosition the previous handle position matching the handle directed to by
- * [isStartHandle]
+ *   [isStartHandle]
  * @param containerCoordinates the coordinates of the [SelectionContainer] for converting
- * [SelectionContainer] coordinates to their respective [Selectable] coordinates
+ *   [SelectionContainer] coordinates to their respective [Selectable] coordinates
  * @param isStartHandle whether the currently pressed/clicked handle is the start
  * @param selectableIdOrderingComparator determines the ordering of selectables by their IDs
  */
@@ -467,7 +501,6 @@
             0 -> {
                 throw IllegalStateException("SelectionLayout must not be empty.")
             }
-
             1 -> {
                 SingleSelectionLayout(
                     info = infoList.single(),
@@ -477,7 +510,6 @@
                     isStartHandle = isStartHandle,
                 )
             }
-
             else -> {
                 MultiSelectionLayout(
                     selectableIdToInfoListIndex = selectableIdToInfoListIndex,
@@ -491,9 +523,7 @@
         }
     }
 
-    /**
-     * Appends a selection info to this builder.
-     */
+    /** Appends a selection info to this builder. */
     fun appendInfo(
         selectableId: Long,
         rawStartHandleOffset: Int,
@@ -509,14 +539,15 @@
         // so increment this before adding the info and leave the correct slot in place at the end.
         currentSlot += 2
 
-        val selectableInfo = SelectableInfo(
-            selectableId = selectableId,
-            slot = currentSlot,
-            rawStartHandleOffset = rawStartHandleOffset,
-            rawEndHandleOffset = rawEndHandleOffset,
-            rawPreviousHandleOffset = rawPreviousHandleOffset,
-            textLayoutResult = textLayoutResult,
-        )
+        val selectableInfo =
+            SelectableInfo(
+                selectableId = selectableId,
+                slot = currentSlot,
+                rawStartHandleOffset = rawStartHandleOffset,
+                rawEndHandleOffset = rawEndHandleOffset,
+                rawPreviousHandleOffset = rawPreviousHandleOffset,
+                textLayoutResult = textLayoutResult,
+            )
 
         startSlot = updateSlot(startSlot, startXHandleDirection, startYHandleDirection)
         endSlot = updateSlot(endSlot, endXHandleDirection, endYHandleDirection)
@@ -528,8 +559,8 @@
     /**
      * Find the slot for a selectable given the current position's directions from the selectable.
      *
-     * The selectables must be ordered in the order in which they would be selected, and then
-     * this function should be called for each of those selectables.
+     * The selectables must be ordered in the order in which they would be selected, and then this
+     * function should be called for each of those selectables.
      *
      * It is expected that the input [slot] is also assigned the result of this function.
      *
@@ -566,9 +597,7 @@
     }
 }
 
-/**
- * Where the position of a cursor/press is compared to a selectable.
- */
+/** Where the position of a cursor/press is compared to a selectable. */
 internal enum class Direction {
     /** The cursor/press is before the selectable */
     BEFORE,
@@ -583,24 +612,21 @@
 /**
  * Determine direction based on an x/y direction.
  *
- * This will use the [y] direction unless it is [ON],
- * in which case it will use the [x] direction.
+ * This will use the [y] direction unless it is [ON], in which case it will use the [x] direction.
  */
 internal fun resolve2dDirection(x: Direction, y: Direction): Direction =
     when (y) {
         BEFORE -> BEFORE
-        ON -> when (x) {
-            BEFORE -> BEFORE
-            ON -> ON
-            AFTER -> AFTER
-        }
-
+        ON ->
+            when (x) {
+                BEFORE -> BEFORE
+                ON -> ON
+                AFTER -> AFTER
+            }
         AFTER -> AFTER
     }
 
-/**
- * Data about a specific selectable within a [SelectionLayout].
- */
+/** Data about a specific selectable within a [SelectionLayout]. */
 internal class SelectableInfo(
     val selectableId: Long,
     val slot: Int,
@@ -620,11 +646,12 @@
 
     /** Whether the raw offsets of this info are crossed. */
     val rawCrossStatus: CrossStatus
-        get() = when {
-            rawStartHandleOffset < rawEndHandleOffset -> CrossStatus.NOT_CROSSED
-            rawStartHandleOffset > rawEndHandleOffset -> CrossStatus.CROSSED
-            else -> CrossStatus.COLLAPSED
-        }
+        get() =
+            when {
+                rawStartHandleOffset < rawEndHandleOffset -> CrossStatus.NOT_CROSSED
+                rawStartHandleOffset > rawEndHandleOffset -> CrossStatus.CROSSED
+                else -> CrossStatus.COLLAPSED
+            }
 
     private val startRunDirection
         get() = textLayoutResult.getTextDirectionForOffset(rawStartHandleOffset)
@@ -635,6 +662,7 @@
     /**
      * Whether this info, compared to another info, has any relevant changes that would require
      * recomputing selection.
+     *
      * @param other the selectable info to check for changes compared to this one
      */
     fun shouldRecomputeSelection(other: SelectableInfo): Boolean =
@@ -642,28 +670,29 @@
             rawStartHandleOffset != other.rawStartHandleOffset ||
             rawEndHandleOffset != other.rawEndHandleOffset
 
-    /**
-     * Get a [Selection.AnchorInfo] for this [SelectableInfo] at the given [offset].
-     */
-    fun anchorForOffset(offset: Int): Selection.AnchorInfo = Selection.AnchorInfo(
-        direction = textLayoutResult.getTextDirectionForOffset(offset),
-        offset = offset,
-        selectableId = selectableId
-    )
+    /** Get a [Selection.AnchorInfo] for this [SelectableInfo] at the given [offset]. */
+    fun anchorForOffset(offset: Int): Selection.AnchorInfo =
+        Selection.AnchorInfo(
+            direction = textLayoutResult.getTextDirectionForOffset(offset),
+            offset = offset,
+            selectableId = selectableId
+        )
 
     /**
-     * Get a [Selection] within the selectable represented by this [SelectableInfo]
-     * for the given [start] and [end] offsets.
+     * Get a [Selection] within the selectable represented by this [SelectableInfo] for the given
+     * [start] and [end] offsets.
      */
-    fun makeSingleLayoutSelection(start: Int, end: Int): Selection = Selection(
-        start = anchorForOffset(start),
-        end = anchorForOffset(end),
-        handlesCrossed = start > end
-    )
+    fun makeSingleLayoutSelection(start: Int, end: Int): Selection =
+        Selection(
+            start = anchorForOffset(start),
+            end = anchorForOffset(end),
+            handlesCrossed = start > end
+        )
 
-    override fun toString(): String = "SelectionInfo(id=$selectableId, " +
-        "range=($rawStartHandleOffset-$startRunDirection,$rawEndHandleOffset-$endRunDirection), " +
-        "prevOffset=$rawPreviousHandleOffset)"
+    override fun toString(): String =
+        "SelectionInfo(id=$selectableId, " +
+            "range=($rawStartHandleOffset-$startRunDirection,$rawEndHandleOffset-$endRunDirection), " +
+            "prevOffset=$rawPreviousHandleOffset)"
 }
 
 /**
@@ -677,25 +706,24 @@
 // TODO(b/295197585)
 //   Can this logic be moved to a new method in `androidx.compose.ui.text.Paragraph`?
 private fun TextLayoutResult.getTextDirectionForOffset(offset: Int): ResolvedTextDirection =
-    if (isOffsetAnEmptyLine(offset)) getParagraphDirection(offset)
-    else getBidiRunDirection(offset)
+    if (isOffsetAnEmptyLine(offset)) getParagraphDirection(offset) else getBidiRunDirection(offset)
 
 private fun TextLayoutResult.isOffsetAnEmptyLine(offset: Int): Boolean =
-    layoutInput.text.isEmpty() || getLineForOffset(offset).let { currentLine ->
-        // verify the previous and next offsets either don't exist because they're at a boundary
-        // or that they are different lines than the current line.
-        (offset == 0 || currentLine != getLineForOffset(offset - 1)) &&
-            (offset == layoutInput.text.length || currentLine != getLineForOffset(offset + 1))
-    }
+    layoutInput.text.isEmpty() ||
+        getLineForOffset(offset).let { currentLine ->
+            // verify the previous and next offsets either don't exist because they're at a boundary
+            // or that they are different lines than the current line.
+            (offset == 0 || currentLine != getLineForOffset(offset - 1)) &&
+                (offset == layoutInput.text.length || currentLine != getLineForOffset(offset + 1))
+        }
 
 /**
  * Verify that the selection is truly collapsed.
  *
- * If the selection is contained within one selectable,
- * this simply checks if the offsets are equal.
+ * If the selection is contained within one selectable, this simply checks if the offsets are equal.
  *
- * If the Selection spans multiple selectables, then this will verify that every selected
- * selectable contains a zero-width selection.
+ * If the Selection spans multiple selectables, then this will verify that every selected selectable
+ * contains a zero-width selection.
  */
 internal fun Selection?.isCollapsed(layout: SelectionLayout?): Boolean {
     this ?: return true
diff --git a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/selection/SelectionMagnifier.kt b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/selection/SelectionMagnifier.kt
index bd21e29..f717335 100644
--- a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/selection/SelectionMagnifier.kt
+++ b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/selection/SelectionMagnifier.kt
@@ -37,21 +37,20 @@
 private val UnspecifiedAnimationVector2D = AnimationVector2D(Float.NaN, Float.NaN)
 
 /** Like `Offset.VectorConverter` but propagates [Offset.Unspecified] values. */
-internal val UnspecifiedSafeOffsetVectorConverter = TwoWayConverter<Offset, AnimationVector2D>(
-    convertToVector = {
-        if (it.isSpecified) {
-            AnimationVector2D(it.x, it.y)
-        } else {
-            UnspecifiedAnimationVector2D
-        }
-    },
-    convertFromVector = { Offset(it.v1, it.v2) }
-)
+internal val UnspecifiedSafeOffsetVectorConverter =
+    TwoWayConverter<Offset, AnimationVector2D>(
+        convertToVector = {
+            if (it.isSpecified) {
+                AnimationVector2D(it.x, it.y)
+            } else {
+                UnspecifiedAnimationVector2D
+            }
+        },
+        convertFromVector = { Offset(it.v1, it.v2) }
+    )
 
-internal val OffsetDisplacementThreshold = Offset(
-    Spring.DefaultDisplacementThreshold,
-    Spring.DefaultDisplacementThreshold
-)
+internal val OffsetDisplacementThreshold =
+    Offset(Spring.DefaultDisplacementThreshold, Spring.DefaultDisplacementThreshold)
 
 internal val MagnifierSpringSpec = SpringSpec(visibilityThreshold = OffsetDisplacementThreshold)
 
@@ -89,16 +88,14 @@
                 // possible and animation would only add unnecessary lag.
                 if (
                     animatable.value.isSpecified &&
-                    targetValue.isSpecified &&
-                    animatable.value.y != targetValue.y
+                        targetValue.isSpecified &&
+                        animatable.value.y != targetValue.y
                 ) {
                     // Launch the animation, instead of cancelling and re-starting manually via
                     // collectLatest, so if another animation is started before this one finishes,
                     // the new one will use the correct velocity, e.g. in order to propagate spring
                     // inertia.
-                    animationScope.launch {
-                        animatable.animateTo(targetValue, MagnifierSpringSpec)
-                    }
+                    animationScope.launch { animatable.animateTo(targetValue, MagnifierSpringSpec) }
                 } else {
                     animatable.snapTo(targetValue)
                 }
diff --git a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/selection/SelectionManager.kt b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/selection/SelectionManager.kt
index 465fc46..614d8a4 100644
--- a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/selection/SelectionManager.kt
+++ b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/selection/SelectionManager.kt
@@ -66,16 +66,12 @@
 import androidx.compose.ui.util.fastMapNotNull
 import kotlin.math.absoluteValue
 
-/**
- * A bridge class between user interaction to the text composables for text selection.
- */
+/** A bridge class between user interaction to the text composables for text selection. */
 internal class SelectionManager(private val selectionRegistrar: SelectionRegistrarImpl) {
 
     private val _selection: MutableState<Selection?> = mutableStateOf(null)
 
-    /**
-     * The current selection.
-     */
+    /** The current selection. */
     var selection: Selection?
         get() = _selection.value
         set(value) {
@@ -85,9 +81,7 @@
             }
         }
 
-    /**
-     * Is touch mode active
-     */
+    /** Is touch mode active */
     private val _isInTouchMode = mutableStateOf(true)
     var isInTouchMode: Boolean
         get() = _isInTouchMode.value
@@ -117,62 +111,48 @@
             }
         }
 
-    /**
-     * [HapticFeedback] handle to perform haptic feedback.
-     */
+    /** [HapticFeedback] handle to perform haptic feedback. */
     var hapticFeedBack: HapticFeedback? = null
 
-    /**
-     * [ClipboardManager] to perform clipboard features.
-     */
+    /** [ClipboardManager] to perform clipboard features. */
     var clipboardManager: ClipboardManager? = null
 
-    /**
-     * [TextToolbar] to show floating toolbar(post-M) or primary toolbar(pre-M).
-     */
+    /** [TextToolbar] to show floating toolbar(post-M) or primary toolbar(pre-M). */
     var textToolbar: TextToolbar? = null
 
-    /**
-     * Focus requester used to request focus when selection becomes active.
-     */
+    /** Focus requester used to request focus when selection becomes active. */
     var focusRequester: FocusRequester = FocusRequester()
 
-    /**
-     * Return true if the corresponding SelectionContainer is focused.
-     */
+    /** Return true if the corresponding SelectionContainer is focused. */
     var hasFocus: Boolean by mutableStateOf(false)
 
-    /**
-     * Modifier for selection container.
-     */
+    /** Modifier for selection container. */
     val modifier
-        get() = Modifier
-            .onClearSelectionRequested { onRelease() }
-            .onGloballyPositioned { containerLayoutCoordinates = it }
-            .focusRequester(focusRequester)
-            .onFocusChanged { focusState ->
-                if (!focusState.isFocused && hasFocus) {
-                    onRelease()
+        get() =
+            Modifier.onClearSelectionRequested { onRelease() }
+                .onGloballyPositioned { containerLayoutCoordinates = it }
+                .focusRequester(focusRequester)
+                .onFocusChanged { focusState ->
+                    if (!focusState.isFocused && hasFocus) {
+                        onRelease()
+                    }
+                    hasFocus = focusState.isFocused
                 }
-                hasFocus = focusState.isFocused
-            }
-            .focusable()
-            .updateSelectionTouchMode { isInTouchMode = it }
-            .onKeyEvent {
-                if (isCopyKeyEvent(it)) {
-                    copy()
-                    true
-                } else {
-                    false
+                .focusable()
+                .updateSelectionTouchMode { isInTouchMode = it }
+                .onKeyEvent {
+                    if (isCopyKeyEvent(it)) {
+                        copy()
+                        true
+                    } else {
+                        false
+                    }
                 }
-            }
-            .then(if (shouldShowMagnifier) Modifier.selectionMagnifier(this) else Modifier)
+                .then(if (shouldShowMagnifier) Modifier.selectionMagnifier(this) else Modifier)
 
     private var previousPosition: Offset? = null
 
-    /**
-     * Layout Coordinates of the selection container.
-     */
+    /** Layout Coordinates of the selection container. */
     var containerLayoutCoordinates: LayoutCoordinates? = null
         set(value) {
             field = value
@@ -201,19 +181,17 @@
         private set
 
     /**
-     * The calculated position of the start handle in the [SelectionContainer] coordinates. It
-     * is null when handle shouldn't be displayed.
-     * It is a [State] so reading it during the composition will cause recomposition every time
-     * the position has been changed.
+     * The calculated position of the start handle in the [SelectionContainer] coordinates. It is
+     * null when handle shouldn't be displayed. It is a [State] so reading it during the composition
+     * will cause recomposition every time the position has been changed.
      */
     var startHandlePosition: Offset? by mutableStateOf(null)
         private set
 
     /**
-     * The calculated position of the end handle in the [SelectionContainer] coordinates. It
-     * is null when handle shouldn't be displayed.
-     * It is a [State] so reading it during the composition will cause recomposition every time
-     * the position has been changed.
+     * The calculated position of the end handle in the [SelectionContainer] coordinates. It is null
+     * when handle shouldn't be displayed. It is a [State] so reading it during the composition will
+     * cause recomposition every time the position has been changed.
      */
     var endHandlePosition: Offset? by mutableStateOf(null)
         private set
@@ -235,8 +213,7 @@
     private val shouldShowMagnifier
         get() = draggingHandle != null && isInTouchMode && !isTriviallyCollapsedSelection()
 
-    @VisibleForTesting
-    internal var previousSelectionLayout: SelectionLayout? = null
+    @VisibleForTesting internal var previousSelectionLayout: SelectionLayout? = null
 
     init {
         selectionRegistrar.onPositionChangeCallback = { selectableId ->
@@ -248,20 +225,17 @@
 
         selectionRegistrar.onSelectionUpdateStartCallback =
             { isInTouchMode, layoutCoordinates, rawPosition, selectionMode ->
-                val textRect = with(layoutCoordinates.size) {
-                    Rect(0f, 0f, width.toFloat(), height.toFloat())
-                }
+                val textRect =
+                    with(layoutCoordinates.size) { Rect(0f, 0f, width.toFloat(), height.toFloat()) }
 
-                val position = if (textRect.containsInclusive(rawPosition)) {
-                    rawPosition
-                } else {
-                    rawPosition.coerceIn(textRect)
-                }
+                val position =
+                    if (textRect.containsInclusive(rawPosition)) {
+                        rawPosition
+                    } else {
+                        rawPosition.coerceIn(textRect)
+                    }
 
-                val positionInContainer = convertToContainerCoordinates(
-                    layoutCoordinates,
-                    position
-                )
+                val positionInContainer = convertToContainerCoordinates(layoutCoordinates, position)
 
                 if (positionInContainer.isSpecified) {
                     this.isInTouchMode = isInTouchMode
@@ -276,24 +250,25 @@
                 }
             }
 
-        selectionRegistrar.onSelectionUpdateSelectAll =
-            { isInTouchMode, selectableId ->
-                val (newSelection, newSubselection) = selectAllInSelectable(
+        selectionRegistrar.onSelectionUpdateSelectAll = { isInTouchMode, selectableId ->
+            val (newSelection, newSubselection) =
+                selectAllInSelectable(
                     selectableId = selectableId,
                     previousSelection = selection,
                 )
-                if (newSelection != selection) {
-                    selectionRegistrar.subselections = newSubselection
-                    onSelectionChange(newSelection)
-                }
-
-                this.isInTouchMode = isInTouchMode
-                focusRequester.requestFocus()
-                showToolbar = false
+            if (newSelection != selection) {
+                selectionRegistrar.subselections = newSubselection
+                onSelectionChange(newSelection)
             }
 
+            this.isInTouchMode = isInTouchMode
+            focusRequester.requestFocus()
+            showToolbar = false
+        }
+
         selectionRegistrar.onSelectionUpdateCallback =
-            { isInTouchMode,
+            {
+                isInTouchMode,
                 layoutCoordinates,
                 newPosition,
                 previousPosition,
@@ -366,9 +341,9 @@
 
         if (
             selection == null ||
-            containerCoordinates == null ||
-            !containerCoordinates.isAttached ||
-            (startLayoutCoordinates == null && endLayoutCoordinates == null)
+                containerCoordinates == null ||
+                !containerCoordinates.isAttached ||
+                (startLayoutCoordinates == null && endLayoutCoordinates == null)
         ) {
             this.startHandlePosition = null
             this.endHandlePosition = null
@@ -376,33 +351,37 @@
         }
 
         val visibleBounds = containerCoordinates.visibleBounds()
-        this.startHandlePosition = startLayoutCoordinates?.let { handleCoordinates ->
-            // Set the new handle position only if the handle is in visible bounds or
-            // the handle is still dragging. If handle goes out of visible bounds during drag,
-            // handle popup is also removed from composition, halting the drag gesture. This
-            // affects multiple text selection when selected text is configured with maxLines=1
-            // and overflow=clip.
-            val handlePosition = startSelectable.getHandlePosition(selection, isStartHandle = true)
-            if (handlePosition.isUnspecified) return@let null
-            val position = containerCoordinates.localPositionOf(handleCoordinates, handlePosition)
-            position.takeIf {
-                draggingHandle == Handle.SelectionStart || visibleBounds.containsInclusive(it)
+        this.startHandlePosition =
+            startLayoutCoordinates?.let { handleCoordinates ->
+                // Set the new handle position only if the handle is in visible bounds or
+                // the handle is still dragging. If handle goes out of visible bounds during drag,
+                // handle popup is also removed from composition, halting the drag gesture. This
+                // affects multiple text selection when selected text is configured with maxLines=1
+                // and overflow=clip.
+                val handlePosition =
+                    startSelectable.getHandlePosition(selection, isStartHandle = true)
+                if (handlePosition.isUnspecified) return@let null
+                val position =
+                    containerCoordinates.localPositionOf(handleCoordinates, handlePosition)
+                position.takeIf {
+                    draggingHandle == Handle.SelectionStart || visibleBounds.containsInclusive(it)
+                }
             }
-        }
 
-        this.endHandlePosition = endLayoutCoordinates?.let { handleCoordinates ->
-            val handlePosition = endSelectable.getHandlePosition(selection, isStartHandle = false)
-            if (handlePosition.isUnspecified) return@let null
-            val position = containerCoordinates.localPositionOf(handleCoordinates, handlePosition)
-            position.takeIf {
-                draggingHandle == Handle.SelectionEnd || visibleBounds.containsInclusive(it)
+        this.endHandlePosition =
+            endLayoutCoordinates?.let { handleCoordinates ->
+                val handlePosition =
+                    endSelectable.getHandlePosition(selection, isStartHandle = false)
+                if (handlePosition.isUnspecified) return@let null
+                val position =
+                    containerCoordinates.localPositionOf(handleCoordinates, handlePosition)
+                position.takeIf {
+                    draggingHandle == Handle.SelectionEnd || visibleBounds.containsInclusive(it)
+                }
             }
-        }
     }
 
-    /**
-     * Returns non-nullable [containerLayoutCoordinates].
-     */
+    /** Returns non-nullable [containerLayoutCoordinates]. */
     internal fun requireContainerCoordinates(): LayoutCoordinates {
         val coordinates = containerLayoutCoordinates
         requireNotNull(coordinates) { "null coordinates" }
@@ -415,10 +394,13 @@
         previousSelection: Selection?
     ): Pair<Selection?, LongObjectMap<Selection>> {
         val subselections = mutableLongObjectMapOf<Selection>()
-        val newSelection = selectionRegistrar.sort(requireContainerCoordinates())
-            .fastFold(null) { mergedSelection: Selection?, selectable: Selectable ->
-                val selection = if (selectable.selectableId == selectableId)
-                    selectable.getSelectAllSelection() else null
+        val newSelection =
+            selectionRegistrar.sort(requireContainerCoordinates()).fastFold(null) {
+                mergedSelection: Selection?,
+                selectable: Selectable ->
+                val selection =
+                    if (selectable.selectableId == selectableId) selectable.getSelectAllSelection()
+                    else null
                 selection?.let { subselections[selectable.selectableId] = it }
                 merge(mergedSelection, selection)
             }
@@ -428,9 +410,7 @@
         return Pair(newSelection, subselections)
     }
 
-    /**
-     * Returns whether the selection encompasses the entire container.
-     */
+    /** Returns whether the selection encompasses the entire container. */
     internal fun isEntireContainerSelected(): Boolean {
         val selectables = selectionRegistrar.sort(requireContainerCoordinates())
 
@@ -444,8 +424,8 @@
 
             // If a non-empty selectable isn't included in the sub-selections,
             // then some text in the container is not selected.
-            val subSelection = selectionRegistrar.subselections[it.selectableId]
-                ?: return@fastAll false
+            val subSelection =
+                selectionRegistrar.subselections[it.selectableId] ?: return@fastAll false
 
             val selectionStart = subSelection.start.offset
             val selectionEnd = subSelection.end.offset
@@ -456,36 +436,36 @@
         }
     }
 
-    /**
-     * Creates and sets a selection spanning the entire container.
-     */
+    /** Creates and sets a selection spanning the entire container. */
     internal fun selectAll() {
         val selectables = selectionRegistrar.sort(requireContainerCoordinates())
         if (selectables.isEmpty()) return
 
         var firstSubSelection: Selection? = null
         var lastSubSelection: Selection? = null
-        val newSubSelections = mutableLongObjectMapOf<Selection>().apply {
-            selectables.fastForEach { selectable ->
-                val subSelection = selectable.getSelectAllSelection() ?: return@fastForEach
-                if (firstSubSelection == null) firstSubSelection = subSelection
-                lastSubSelection = subSelection
-                put(selectable.selectableId, subSelection)
+        val newSubSelections =
+            mutableLongObjectMapOf<Selection>().apply {
+                selectables.fastForEach { selectable ->
+                    val subSelection = selectable.getSelectAllSelection() ?: return@fastForEach
+                    if (firstSubSelection == null) firstSubSelection = subSelection
+                    lastSubSelection = subSelection
+                    put(selectable.selectableId, subSelection)
+                }
             }
-        }
 
         if (newSubSelections.isEmpty()) return
 
         // first/last sub selections are implied to be non-null from here on out
-        val newSelection = if (firstSubSelection === lastSubSelection) {
-            firstSubSelection
-        } else {
-            Selection(
-                start = firstSubSelection!!.start,
-                end = lastSubSelection!!.end,
-                handlesCrossed = false,
-            )
-        }
+        val newSelection =
+            if (firstSubSelection === lastSubSelection) {
+                firstSubSelection
+            } else {
+                Selection(
+                    start = firstSubSelection!!.start,
+                    end = lastSubSelection!!.end,
+                    handlesCrossed = false,
+                )
+            }
 
         selectionRegistrar.subselections = newSubSelections
         onSelectionChange(newSelection)
@@ -526,9 +506,9 @@
 
         // All subselections associated with a selectable must be an empty selection.
         return selectionRegistrar.sort(requireContainerCoordinates()).fastAny { selectable ->
-            selectionRegistrar.subselections[selectable.selectableId]
-                ?.run { start.offset != end.offset }
-                ?: false
+            selectionRegistrar.subselections[selectable.selectableId]?.run {
+                start.offset != end.offset
+            } ?: false
         }
     }
 
@@ -541,17 +521,18 @@
             selectionRegistrar.sort(requireContainerCoordinates()).fastForEach { selectable ->
                 selectionRegistrar.subselections[selectable.selectableId]?.let { subSelection ->
                     val currentText = selectable.getText()
-                    val currentSelectedText = if (subSelection.handlesCrossed) {
-                        currentText.subSequence(
-                            subSelection.end.offset,
-                            subSelection.start.offset
-                        )
-                    } else {
-                        currentText.subSequence(
-                            subSelection.start.offset,
-                            subSelection.end.offset
-                        )
-                    }
+                    val currentSelectedText =
+                        if (subSelection.handlesCrossed) {
+                            currentText.subSequence(
+                                subSelection.end.offset,
+                                subSelection.start.offset
+                            )
+                        } else {
+                            currentText.subSequence(
+                                subSelection.start.offset,
+                                subSelection.end.offset
+                            )
+                        }
 
                     append(currentSelectedText)
                 }
@@ -564,10 +545,8 @@
     }
 
     /**
-     * Whether toolbar should be shown right now.
-     * Examples: Show toolbar after user finishes selection.
-     * Hide it during selection.
-     * Hide it when no selection exists.
+     * Whether toolbar should be shown right now. Examples: Show toolbar after user finishes
+     * selection. Hide it during selection. Hide it when no selection exists.
      */
     internal var showToolbar = false
         internal set(value) {
@@ -599,21 +578,23 @@
     }
 
     /**
-     * Calculate selected region as [Rect].
-     * The result is the smallest [Rect] that encapsulates the entire selection,
-     * coerced into visible bounds.
+     * Calculate selected region as [Rect]. The result is the smallest [Rect] that encapsulates the
+     * entire selection, coerced into visible bounds.
      */
     private fun getContentRect(): Rect? {
         selection ?: return null
         val containerCoordinates = containerLayoutCoordinates ?: return null
         if (!containerCoordinates.isAttached) return null
 
-        val selectableSubSelections = selectionRegistrar.sort(requireContainerCoordinates())
-            .fastMapNotNull { selectable ->
-                selectionRegistrar.subselections[selectable.selectableId]
-                    ?.let { selectable to it }
-            }
-            .firstAndLast()
+        val selectableSubSelections =
+            selectionRegistrar
+                .sort(requireContainerCoordinates())
+                .fastMapNotNull { selectable ->
+                    selectionRegistrar.subselections[selectable.selectableId]?.let {
+                        selectable to it
+                    }
+                }
+                .firstAndLast()
 
         if (selectableSubSelections.isEmpty()) return null
         val selectedRegionRect =
@@ -641,105 +622,103 @@
         }
     }
 
-    fun handleDragObserver(isStartHandle: Boolean): TextDragObserver = object : TextDragObserver {
-        override fun onDown(point: Offset) {
-            // if the handle position is null, then it is invisible, so ignore the gesture
-            (if (isStartHandle) startHandlePosition else endHandlePosition) ?: return
+    fun handleDragObserver(isStartHandle: Boolean): TextDragObserver =
+        object : TextDragObserver {
+            override fun onDown(point: Offset) {
+                // if the handle position is null, then it is invisible, so ignore the gesture
+                (if (isStartHandle) startHandlePosition else endHandlePosition) ?: return
 
-            val selection = selection ?: return
-            val anchor = if (isStartHandle) selection.start else selection.end
-            val selectable = getAnchorSelectable(anchor) ?: return
-            // The LayoutCoordinates of the composable where the drag gesture should begin. This
-            // is used to convert the position of the beginning of the drag gesture from the
-            // composable coordinates to selection container coordinates.
-            val beginLayoutCoordinates = selectable.getLayoutCoordinates() ?: return
+                val selection = selection ?: return
+                val anchor = if (isStartHandle) selection.start else selection.end
+                val selectable = getAnchorSelectable(anchor) ?: return
+                // The LayoutCoordinates of the composable where the drag gesture should begin. This
+                // is used to convert the position of the beginning of the drag gesture from the
+                // composable coordinates to selection container coordinates.
+                val beginLayoutCoordinates = selectable.getLayoutCoordinates() ?: return
 
-            // The position of the character where the drag gesture should begin. This is in
-            // the composable coordinates.
-            val handlePosition = selectable.getHandlePosition(selection, isStartHandle)
-            if (handlePosition.isUnspecified) return
-            val beginCoordinates = getAdjustedCoordinates(handlePosition)
+                // The position of the character where the drag gesture should begin. This is in
+                // the composable coordinates.
+                val handlePosition = selectable.getHandlePosition(selection, isStartHandle)
+                if (handlePosition.isUnspecified) return
+                val beginCoordinates = getAdjustedCoordinates(handlePosition)
 
-            // Convert the position where drag gesture begins from composable coordinates to
-            // selection container coordinates.
-            currentDragPosition = requireContainerCoordinates().localPositionOf(
-                beginLayoutCoordinates,
-                beginCoordinates
-            )
-            draggingHandle = if (isStartHandle) Handle.SelectionStart else Handle.SelectionEnd
-            showToolbar = false
-        }
-
-        override fun onStart(startPoint: Offset) {
-            draggingHandle ?: return
-
-            val selection = selection!!
-            val anchor = if (isStartHandle) selection.start else selection.end
-            val selectable = checkNotNull(selectionRegistrar.selectableMap[anchor.selectableId]) {
-                "SelectionRegistrar should contain the current selection's selectableIds"
+                // Convert the position where drag gesture begins from composable coordinates to
+                // selection container coordinates.
+                currentDragPosition =
+                    requireContainerCoordinates()
+                        .localPositionOf(beginLayoutCoordinates, beginCoordinates)
+                draggingHandle = if (isStartHandle) Handle.SelectionStart else Handle.SelectionEnd
+                showToolbar = false
             }
 
-            // The LayoutCoordinates of the composable where the drag gesture should begin. This
-            // is used to convert the position of the beginning of the drag gesture from the
-            // composable coordinates to selection container coordinates.
-            val beginLayoutCoordinates = checkNotNull(selectable.getLayoutCoordinates()) {
-                "Current selectable should have layout coordinates."
-            }
+            override fun onStart(startPoint: Offset) {
+                draggingHandle ?: return
 
-            // The position of the character where the drag gesture should begin. This is in
-            // the composable coordinates.
-            val handlePosition = selectable.getHandlePosition(selection, isStartHandle)
-            if (handlePosition.isUnspecified) return
-            val beginCoordinates = getAdjustedCoordinates(handlePosition)
+                val selection = selection!!
+                val anchor = if (isStartHandle) selection.start else selection.end
+                val selectable =
+                    checkNotNull(selectionRegistrar.selectableMap[anchor.selectableId]) {
+                        "SelectionRegistrar should contain the current selection's selectableIds"
+                    }
 
-            // Convert the position where drag gesture begins from composable coordinates to
-            // selection container coordinates.
-            dragBeginPosition = requireContainerCoordinates().localPositionOf(
-                beginLayoutCoordinates,
-                beginCoordinates
-            )
+                // The LayoutCoordinates of the composable where the drag gesture should begin. This
+                // is used to convert the position of the beginning of the drag gesture from the
+                // composable coordinates to selection container coordinates.
+                val beginLayoutCoordinates =
+                    checkNotNull(selectable.getLayoutCoordinates()) {
+                        "Current selectable should have layout coordinates."
+                    }
 
-            // Zero out the total distance that being dragged.
-            dragTotalDistance = Offset.Zero
-        }
+                // The position of the character where the drag gesture should begin. This is in
+                // the composable coordinates.
+                val handlePosition = selectable.getHandlePosition(selection, isStartHandle)
+                if (handlePosition.isUnspecified) return
+                val beginCoordinates = getAdjustedCoordinates(handlePosition)
 
-        override fun onDrag(delta: Offset) {
-            draggingHandle ?: return
+                // Convert the position where drag gesture begins from composable coordinates to
+                // selection container coordinates.
+                dragBeginPosition =
+                    requireContainerCoordinates()
+                        .localPositionOf(beginLayoutCoordinates, beginCoordinates)
 
-            dragTotalDistance += delta
-            val endPosition = dragBeginPosition + dragTotalDistance
-            val consumed = updateSelection(
-                newPosition = endPosition,
-                previousPosition = dragBeginPosition,
-                isStartHandle = isStartHandle,
-                adjustment = SelectionAdjustment.CharacterWithWordAccelerate
-            )
-            if (consumed) {
-                dragBeginPosition = endPosition
+                // Zero out the total distance that being dragged.
                 dragTotalDistance = Offset.Zero
             }
-        }
 
-        private fun done() {
-            showToolbar = true
-            draggingHandle = null
-            currentDragPosition = null
-        }
+            override fun onDrag(delta: Offset) {
+                draggingHandle ?: return
 
-        override fun onUp() = done()
-        override fun onStop() = done()
-        override fun onCancel() = done()
-    }
-
-    /**
-     * Detect tap without consuming the up event.
-     */
-    private suspend fun PointerInputScope.detectNonConsumingTap(onTap: (Offset) -> Unit) {
-        awaitEachGesture {
-            waitForUpOrCancellation()?.let {
-                onTap(it.position)
+                dragTotalDistance += delta
+                val endPosition = dragBeginPosition + dragTotalDistance
+                val consumed =
+                    updateSelection(
+                        newPosition = endPosition,
+                        previousPosition = dragBeginPosition,
+                        isStartHandle = isStartHandle,
+                        adjustment = SelectionAdjustment.CharacterWithWordAccelerate
+                    )
+                if (consumed) {
+                    dragBeginPosition = endPosition
+                    dragTotalDistance = Offset.Zero
+                }
             }
+
+            private fun done() {
+                showToolbar = true
+                draggingHandle = null
+                currentDragPosition = null
+            }
+
+            override fun onUp() = done()
+
+            override fun onStop() = done()
+
+            override fun onCancel() = done()
         }
+
+    /** Detect tap without consuming the up event. */
+    private suspend fun PointerInputScope.detectNonConsumingTap(onTap: (Offset) -> Unit) {
+        awaitEachGesture { waitForUpOrCancellation()?.let { onTap(it.position) } }
     }
 
     private fun Modifier.onClearSelectionRequested(block: () -> Unit): Modifier {
@@ -756,14 +735,14 @@
     }
 
     /**
-     * Cancel the previous selection and start a new selection at the given [position].
-     * It's used for long-press, double-click, triple-click and so on to start selection.
+     * Cancel the previous selection and start a new selection at the given [position]. It's used
+     * for long-press, double-click, triple-click and so on to start selection.
      *
-     * @param position initial position of the selection. Both start and end handle is considered
-     * at this position.
-     * @param isStartHandle whether it's considered as the start handle moving. This parameter
-     * will influence the [SelectionAdjustment]'s behavior. For example,
-     * [SelectionAdjustment.Character] only adjust the moving handle.
+     * @param position initial position of the selection. Both start and end handle is considered at
+     *   this position.
+     * @param isStartHandle whether it's considered as the start handle moving. This parameter will
+     *   influence the [SelectionAdjustment]'s behavior. For example,
+     *   [SelectionAdjustment.Character] only adjust the moving handle.
      * @param adjustment the selection adjustment.
      */
     private fun startSelection(
@@ -787,10 +766,8 @@
      * @param previousPosition the previous position of the moving selection handle.
      * @param isStartHandle whether the moving selection handle is the start handle.
      * @param adjustment the [SelectionAdjustment] used to adjust the raw selection range and
-     * produce the final selection range.
-     *
+     *   produce the final selection range.
      * @return a boolean representing whether the movement is consumed.
-     *
      * @see SelectionAdjustment
      */
     internal fun updateSelection(
@@ -819,13 +796,11 @@
      * @param previousHandlePosition the position of the moving handle before the update.
      * @param isStartHandle whether the moving selection handle is the start handle.
      * @param adjustment the [SelectionAdjustment] used to adjust the raw selection range and
-     * produce the final selection range.
-     *
+     *   produce the final selection range.
      * @return a boolean representing whether the movement is consumed. It's useful for the case
-     * where a selection handle is updating consecutively. When the return value is true, it's
-     * expected that the caller will update the [startHandlePosition] to be the given
-     * [endHandlePosition] in following calls.
-     *
+     *   where a selection handle is updating consecutively. When the return value is true, it's
+     *   expected that the caller will update the [startHandlePosition] to be the given
+     *   [endHandlePosition] in following calls.
      * @see SelectionAdjustment
      */
     internal fun updateSelection(
@@ -867,18 +842,17 @@
 
         // if previous handle is null, then treat this as a new selection.
         val previousSelection = if (previousHandlePosition.isUnspecified) null else selection
-        val builder = SelectionLayoutBuilder(
-            currentPosition = position,
-            previousHandlePosition = previousHandlePosition,
-            containerCoordinates = containerCoordinates,
-            isStartHandle = isStartHandle,
-            previousSelection = previousSelection,
-            selectableIdOrderingComparator = selectableIdOrderingComparator,
-        )
+        val builder =
+            SelectionLayoutBuilder(
+                currentPosition = position,
+                previousHandlePosition = previousHandlePosition,
+                containerCoordinates = containerCoordinates,
+                isStartHandle = isStartHandle,
+                previousSelection = previousSelection,
+                selectableIdOrderingComparator = selectableIdOrderingComparator,
+            )
 
-        sortedSelectables.fastForEach {
-            it.appendSelectableInfoToBuilder(builder)
-        }
+        sortedSelectables.fastForEach { it.appendSelectableInfoToBuilder(builder) }
 
         return builder.build()
     }
@@ -917,23 +891,25 @@
 
 internal expect fun Modifier.selectionMagnifier(manager: SelectionManager): Modifier
 
-private val invertedInfiniteRect = Rect(
-    left = Float.POSITIVE_INFINITY,
-    top = Float.POSITIVE_INFINITY,
-    right = Float.NEGATIVE_INFINITY,
-    bottom = Float.NEGATIVE_INFINITY
-)
+private val invertedInfiniteRect =
+    Rect(
+        left = Float.POSITIVE_INFINITY,
+        top = Float.POSITIVE_INFINITY,
+        right = Float.NEGATIVE_INFINITY,
+        bottom = Float.NEGATIVE_INFINITY
+    )
 
-private fun <T> List<T>.firstAndLast(): List<T> = when (size) {
-    0, 1 -> this
-    else -> listOf(first(), last())
-}
+private fun <T> List<T>.firstAndLast(): List<T> =
+    when (size) {
+        0,
+        1 -> this
+        else -> listOf(first(), last())
+    }
 
 /**
- * Get the selected region rect in the given [containerCoordinates].
- * This will compute the smallest rect that contains every first/last
- * character bounding box of each selectable. If for any reason there are no
- * bounding boxes, then the [invertedInfiniteRect] is returned.
+ * Get the selected region rect in the given [containerCoordinates]. This will compute the smallest
+ * rect that contains every first/last character bounding box of each selectable. If for any reason
+ * there are no bounding boxes, then the [invertedInfiniteRect] is returned.
  */
 @VisibleForTesting
 internal fun getSelectedRegionRect(
@@ -950,11 +926,12 @@
 
         val minOffset = minOf(startOffset, endOffset)
         val maxOffset = maxOf(startOffset, endOffset)
-        val offsets = if (minOffset == maxOffset - 1) {
-            intArrayOf(minOffset)
-        } else {
-            intArrayOf(minOffset, maxOffset - 1)
-        }
+        val offsets =
+            if (minOffset == maxOffset - 1) {
+                intArrayOf(minOffset)
+            } else {
+                intArrayOf(minOffset, maxOffset - 1)
+            }
         var (left, top, right, bottom) = invertedInfiniteRect
         for (i in offsets) {
             val rect = selectable.getBoundingBox(i)
@@ -967,8 +944,7 @@
         val localTopLeft = Offset(left, top)
         val localBottomRight = Offset(right, bottom)
 
-        val containerTopLeft =
-            containerCoordinates.localPositionOf(localCoordinates, localTopLeft)
+        val containerTopLeft = containerCoordinates.localPositionOf(localCoordinates, localTopLeft)
         val containerBottomRight =
             containerCoordinates.localPositionOf(localCoordinates, localBottomRight)
 
@@ -1007,26 +983,25 @@
 
     // The horizontal position doesn't snap to cursor positions but should directly track the
     // actual drag.
-    val localDragPosition = selectableCoordinates.localPositionOf(
-        containerCoordinates,
-        manager.currentDragPosition!!
-    )
+    val localDragPosition =
+        selectableCoordinates.localPositionOf(containerCoordinates, manager.currentDragPosition!!)
     val dragX = localDragPosition.x
 
     // But it is constrained by the horizontal bounds of the current line.
     val lineRange = selectable.getRangeOfLineContaining(offset)
-    val textConstrainedX = if (lineRange.collapsed) {
-        // A collapsed range implies the text is empty.
-        // line left and right are equal for this offset, so use either
-        selectable.getLineLeft(offset)
-    } else {
-        val lineStartX = selectable.getLineLeft(lineRange.start)
-        val lineEndX = selectable.getLineRight(lineRange.end - 1)
-        // in RTL/BiDi, lineStartX may be larger than lineEndX
-        val minX = minOf(lineStartX, lineEndX)
-        val maxX = maxOf(lineStartX, lineEndX)
-        dragX.coerceIn(minX, maxX)
-    }
+    val textConstrainedX =
+        if (lineRange.collapsed) {
+            // A collapsed range implies the text is empty.
+            // line left and right are equal for this offset, so use either
+            selectable.getLineLeft(offset)
+        } else {
+            val lineStartX = selectable.getLineLeft(lineRange.start)
+            val lineEndX = selectable.getLineRight(lineRange.end - 1)
+            // in RTL/BiDi, lineStartX may be larger than lineEndX
+            val minX = minOf(lineStartX, lineEndX)
+            val maxX = maxOf(lineStartX, lineEndX)
+            dragX.coerceIn(minX, maxX)
+        }
 
     // selectable couldn't determine horizontals
     if (textConstrainedX == -1f) return Offset.Unspecified
@@ -1040,8 +1015,10 @@
     // It is very unlikely that this behavior would cause a flicker since magnifier immediately
     // shows up where the pointer is being dragged. The pointer needs to drag further than the half
     // of magnifier's width to hide by the following logic.
-    if (magnifierSize != IntSize.Zero &&
-        (dragX - textConstrainedX).absoluteValue > magnifierSize.width / 2) {
+    if (
+        magnifierSize != IntSize.Zero &&
+            (dragX - textConstrainedX).absoluteValue > magnifierSize.width / 2
+    ) {
         return Offset.Unspecified
     }
 
@@ -1062,10 +1039,7 @@
     // parents. We can think it as the global visible bounds of this Layout. Here globalBounds
     // is convert to local, which is the boundary of the visible area within the LayoutCoordinates.
     val boundsInWindow = boundsInWindow()
-    return Rect(
-        windowToLocal(boundsInWindow.topLeft),
-        windowToLocal(boundsInWindow.bottomRight)
-    )
+    return Rect(windowToLocal(boundsInWindow.topLeft), windowToLocal(boundsInWindow.bottomRight))
 }
 
 internal fun Rect.containsInclusive(offset: Offset): Boolean =
diff --git a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/selection/SelectionMode.kt b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/selection/SelectionMode.kt
index e1f38fd..183601f 100644
--- a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/selection/SelectionMode.kt
+++ b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/selection/SelectionMode.kt
@@ -19,9 +19,7 @@
 import androidx.compose.ui.geometry.Offset
 import androidx.compose.ui.geometry.Rect
 
-/**
- * The enum class allows user to decide the selection mode.
- */
+/** The enum class allows user to decide the selection mode. */
 internal enum class SelectionMode {
     /**
      * When selection handles are dragged across composables, selection extends by row, for example,
@@ -46,9 +44,9 @@
     },
 
     /**
-     * When selection handles are dragged across composables, selection extends by column, for example,
-     * when the end selection handle is dragged to the right, left columns will be selected first,
-     * and the right rows.
+     * When selection handles are dragged across composables, selection extends by column, for
+     * example, when the end selection handle is dragged to the right, left columns will be selected
+     * first, and the right rows.
      */
     Horizontal {
         override fun compare(position: Offset, bounds: Rect): Int {
@@ -68,32 +66,28 @@
     };
 
     /**
-     * A compare a selection handle with a  [Selectable] boundary. This defines whether an out of
+     * A compare a selection handle with a [Selectable] boundary. This defines whether an out of
      * boundary selection handle is treated as the start or the end of the Selectable. If the
-     * [Selectable] is a text selectable, then the start is the index 0, and end corresponds to
-     * the text length.
+     * [Selectable] is a text selectable, then the start is the index 0, and end corresponds to the
+     * text length.
      *
      * @param position the position of the selection handle.
      * @param bounds the boundary of the [Selectable].
-     * @return 0 if the selection handle [position] is within the [bounds]; a negative value if
-     * the selection handle is considered as "start" of the [Selectable]; a positive value if the
-     * selection handle is considered as the "end" of the [Selectable].
+     * @return 0 if the selection handle [position] is within the [bounds]; a negative value if the
+     *   selection handle is considered as "start" of the [Selectable]; a positive value if the
+     *   selection handle is considered as the "end" of the [Selectable].
      */
     internal abstract fun compare(position: Offset, bounds: Rect): Int
 
     /**
-     * Decides if Composable which has [bounds], should be accepted by the selection and
-     * change its selected state for a selection that starts at [start] and ends at [end].
+     * Decides if Composable which has [bounds], should be accepted by the selection and change its
+     * selected state for a selection that starts at [start] and ends at [end].
      *
      * @param bounds Composable bounds of the widget to be checked.
      * @param start The start coordinates of the selection, in SelectionContainer range.
      * @param end The end coordinates of the selection, in SelectionContainer range.
      */
-    internal fun isSelected(
-        bounds: Rect,
-        start: Offset,
-        end: Offset
-    ): Boolean {
+    internal fun isSelected(bounds: Rect, start: Offset, end: Offset): Boolean {
         // If either of the start or end is contained by bounds, the composable is selected.
         if (bounds.containsInclusive(start) || bounds.containsInclusive(end)) {
             return true
@@ -106,10 +100,10 @@
     }
 
     /**
-     * The regular contains function ([Rect.contains]) is only inclusive of left and top,
-     * but there are many times where we want to include when the offset is on the right/bottom
-     * bounds. This commonly happens when the selection handle is placed at the right of the bounds
-     * and then that offset is used in this function.
+     * The regular contains function ([Rect.contains]) is only inclusive of left and top, but there
+     * are many times where we want to include when the offset is on the right/bottom bounds. This
+     * commonly happens when the selection handle is placed at the right of the bounds and then that
+     * offset is used in this function.
      */
     private fun Rect.containsInclusive(offset: Offset): Boolean =
         offset.x in left..right && offset.y in top..bottom
diff --git a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/selection/SelectionRegistrar.kt b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/selection/SelectionRegistrar.kt
index 80caabf..6669c60 100644
--- a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/selection/SelectionRegistrar.kt
+++ b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/selection/SelectionRegistrar.kt
@@ -22,60 +22,55 @@
 import androidx.compose.ui.geometry.Offset
 import androidx.compose.ui.layout.LayoutCoordinates
 
-/**
- *  An interface allowing a composable to subscribe and unsubscribe to selection changes.
- */
+/** An interface allowing a composable to subscribe and unsubscribe to selection changes. */
 internal interface SelectionRegistrar {
     /**
-     * The map stored current selection information on each [Selectable]. A selectable can query
-     * its selected range using its [Selectable.selectableId]. This field is backed by a
-     * [MutableState]. And any composable reading this field will be recomposed once its value
-     * changed.
+     * The map stored current selection information on each [Selectable]. A selectable can query its
+     * selected range using its [Selectable.selectableId]. This field is backed by a [MutableState].
+     * And any composable reading this field will be recomposed once its value changed.
      */
     val subselections: LongObjectMap<Selection>
 
     /**
      * Subscribe to SelectionContainer selection changes.
+     *
      * @param selectable the [Selectable] that is subscribing to this [SelectionRegistrar].
      */
     fun subscribe(selectable: Selectable): Selectable
 
     /**
      * Unsubscribe from SelectionContainer selection changes.
+     *
      * @param selectable the [Selectable] that is unsubscribing to this [SelectionRegistrar].
      */
     fun unsubscribe(selectable: Selectable)
 
     /**
      * Return a unique ID for a [Selectable].
+     *
      * @see [Selectable.selectableId]
      */
     fun nextSelectableId(): Long
 
-    /**
-     * When the Global Position of a subscribed [Selectable] changes, this method
-     * is called.
-     */
+    /** When the Global Position of a subscribed [Selectable] changes, this method is called. */
     fun notifyPositionChange(selectableId: Long)
 
     /**
      * Call this method to notify the [SelectionContainer] that the selection has been initiated.
      * Depends on the input, [notifySelectionUpdate] may be called repeatedly after
      * [notifySelectionUpdateStart] is called. And [notifySelectionUpdateEnd] should always be
-     * called after selection finished.
-     * For example:
-     *  1. User long pressed the text and then release. [notifySelectionUpdateStart] should be
-     *  called followed by [notifySelectionUpdateEnd] being called once.
-     *  2. User long pressed the text and then drag a distance and then release.
-     *  [notifySelectionUpdateStart] should be called first after the user long press, and then
-     *  [notifySelectionUpdate] is called several times reporting the updates, in the end
-     *  [notifySelectionUpdateEnd] is called to finish the selection.
+     * called after selection finished. For example:
+     * 1. User long pressed the text and then release. [notifySelectionUpdateStart] should be called
+     *    followed by [notifySelectionUpdateEnd] being called once.
+     * 2. User long pressed the text and then drag a distance and then release.
+     *    [notifySelectionUpdateStart] should be called first after the user long press, and then
+     *    [notifySelectionUpdate] is called several times reporting the updates, in the end
+     *    [notifySelectionUpdateEnd] is called to finish the selection.
      *
      * @param layoutCoordinates [LayoutCoordinates] of the [Selectable].
      * @param startPosition coordinates of where the selection is initiated.
      * @param adjustment selection should be adjusted according to this param
      * @param isInTouchMode whether the update is from a touch pointer
-     *
      * @see notifySelectionUpdate
      * @see notifySelectionUpdateEnd
      */
@@ -97,10 +92,9 @@
 
     /**
      * Call this method to notify the [SelectionContainer] that one of the selection handle has
-     * moved and selection should be updated.
-     * The caller of this method should make sure that [notifySelectionUpdateStart] is always
-     * called once before calling this function. And [notifySelectionUpdateEnd] is always called
-     * once after the all updates finished.
+     * moved and selection should be updated. The caller of this method should make sure that
+     * [notifySelectionUpdateStart] is always called once before calling this function. And
+     * [notifySelectionUpdateEnd] is always called once after the all updates finished.
      *
      * @param layoutCoordinates [LayoutCoordinates] of the [Selectable].
      * @param previousPosition coordinates of where the selection starts.
@@ -108,12 +102,12 @@
      * @param isStartHandle whether the moving selection handle the start handle.
      * @param adjustment selection should be adjusted according to this parameter
      * @param isInTouchMode whether the update is from a touch pointer
-     *
-     * @return true if the selection handle movement is consumed. This function acts like a
-     * pointer input consumer when a selection handle is dragged. It expects the caller to
-     * accumulate the unconsumed pointer movement:
+     * @return true if the selection handle movement is consumed. This function acts like a pointer
+     *   input consumer when a selection handle is dragged. It expects the caller to accumulate the
+     *   unconsumed pointer movement:
      * 1. if it returns true, the caller will zero out the previous movement.
      * 2. if it returns false, the caller will continue accumulate pointer movement.
+     *
      * @see notifySelectionUpdateStart
      * @see notifySelectionUpdateEnd
      */
@@ -135,24 +129,20 @@
     fun notifySelectionUpdateEnd()
 
     /**
-     * Call this method to notify the [SelectionContainer] that the content of the passed
-     * selectable has been changed.
+     * Call this method to notify the [SelectionContainer] that the content of the passed selectable
+     * has been changed.
      *
      * @param selectableId the ID of the selectable whose the content has been updated.
      */
     fun notifySelectableChange(selectableId: Long)
 
     companion object {
-        /**
-         * Representing an invalid ID for [Selectable].
-         */
+        /** Representing an invalid ID for [Selectable]. */
         const val InvalidSelectableId = 0L
     }
 }
 
-/**
- * Helper function that checks if there is a selection on this CoreText.
- */
+/** Helper function that checks if there is a selection on this CoreText. */
 internal fun SelectionRegistrar?.hasSelection(selectableId: Long): Boolean {
     return this?.subselections?.containsKey(selectableId) ?: false
 }
diff --git a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/selection/SelectionRegistrarImpl.kt b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/selection/SelectionRegistrarImpl.kt
index 72b77d8..95052e3 100644
--- a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/selection/SelectionRegistrarImpl.kt
+++ b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/selection/SelectionRegistrarImpl.kt
@@ -27,84 +27,68 @@
 import androidx.compose.ui.geometry.Offset
 import androidx.compose.ui.layout.LayoutCoordinates
 
-internal class SelectionRegistrarImpl private constructor(
-    initialIncrementId: Long
-) : SelectionRegistrar {
+internal class SelectionRegistrarImpl private constructor(initialIncrementId: Long) :
+    SelectionRegistrar {
     companion object {
-        val Saver = Saver<SelectionRegistrarImpl, Long>(
-            save = { it.incrementId.get() },
-            restore = { SelectionRegistrarImpl(it) }
-        )
+        val Saver =
+            Saver<SelectionRegistrarImpl, Long>(
+                save = { it.incrementId.get() },
+                restore = { SelectionRegistrarImpl(it) }
+            )
     }
 
     constructor() : this(initialIncrementId = 1L)
 
-    /**
-     * A flag to check if the [Selectable]s have already been sorted.
-     */
+    /** A flag to check if the [Selectable]s have already been sorted. */
     internal var sorted: Boolean = false
 
     /**
-     * This is essentially the list of registered components that want
-     * to handle text selection that are below the SelectionContainer.
+     * This is essentially the list of registered components that want to handle text selection that
+     * are below the SelectionContainer.
      */
     private val _selectables = mutableListOf<Selectable>()
 
-    /**
-     * Getter for handlers that returns a List.
-     */
+    /** Getter for handlers that returns a List. */
     internal val selectables: List<Selectable>
         get() = _selectables
 
     private val _selectableMap = mutableLongObjectMapOf<Selectable>()
 
-    /**
-     * A map from selectable keys to subscribed selectables.
-     */
+    /** A map from selectable keys to subscribed selectables. */
     internal val selectableMap: LongObjectMap<Selectable>
         get() = _selectableMap
 
     /**
      * The incremental id to be assigned to each selectable. It starts from 1 and 0 is used to
      * denote an invalid id.
+     *
      * @see SelectionRegistrar.InvalidSelectableId
      */
     private var incrementId = AtomicLong(initialIncrementId)
 
-    /**
-     * The callback to be invoked when the position change was triggered.
-     */
+    /** The callback to be invoked when the position change was triggered. */
     internal var onPositionChangeCallback: ((Long) -> Unit)? = null
 
-    /**
-     * The callback to be invoked when the selection is initiated.
-     */
+    /** The callback to be invoked when the selection is initiated. */
     internal var onSelectionUpdateStartCallback:
-        ((Boolean, LayoutCoordinates, Offset, SelectionAdjustment) -> Unit)? = null
+        ((Boolean, LayoutCoordinates, Offset, SelectionAdjustment) -> Unit)? =
+        null
+
+    /** The callback to be invoked when the selection is initiated with selectAll [Selection]. */
+    internal var onSelectionUpdateSelectAll: ((Boolean, Long) -> Unit)? = null
 
     /**
-     * The callback to be invoked when the selection is initiated with selectAll [Selection].
-     */
-    internal var onSelectionUpdateSelectAll: (
-        (Boolean, Long) -> Unit
-    )? = null
-
-    /**
-     * The callback to be invoked when the selection is updated.
-     * If the first offset is null it means that the start of selection is unknown for the caller.
+     * The callback to be invoked when the selection is updated. If the first offset is null it
+     * means that the start of selection is unknown for the caller.
      */
     internal var onSelectionUpdateCallback:
         ((Boolean, LayoutCoordinates, Offset, Offset, Boolean, SelectionAdjustment) -> Boolean)? =
         null
 
-    /**
-     * The callback to be invoked when selection update finished.
-     */
+    /** The callback to be invoked when selection update finished. */
     internal var onSelectionUpdateEndCallback: (() -> Unit)? = null
 
-    /**
-     * The callback to be invoked when one of the selectable has changed.
-     */
+    /** The callback to be invoked when one of the selectable has changed. */
     internal var onSelectableChangeCallback: ((Long) -> Unit)? = null
 
     /**
@@ -154,16 +138,18 @@
                 val layoutCoordinatesA = a.getLayoutCoordinates()
                 val layoutCoordinatesB = b.getLayoutCoordinates()
 
-                val positionA = if (layoutCoordinatesA != null) {
-                    containerLayoutCoordinates.localPositionOf(layoutCoordinatesA, Offset.Zero)
-                } else {
-                    Offset.Zero
-                }
-                val positionB = if (layoutCoordinatesB != null) {
-                    containerLayoutCoordinates.localPositionOf(layoutCoordinatesB, Offset.Zero)
-                } else {
-                    Offset.Zero
-                }
+                val positionA =
+                    if (layoutCoordinatesA != null) {
+                        containerLayoutCoordinates.localPositionOf(layoutCoordinatesA, Offset.Zero)
+                    } else {
+                        Offset.Zero
+                    }
+                val positionB =
+                    if (layoutCoordinatesB != null) {
+                        containerLayoutCoordinates.localPositionOf(layoutCoordinatesB, Offset.Zero)
+                    } else {
+                        Offset.Zero
+                    }
 
                 if (positionA.y == positionB.y) {
                     compareValues(positionA.x, positionB.x)
diff --git a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/selection/SimpleLayout.kt b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/selection/SimpleLayout.kt
index ba1865c..48d0d2e 100644
--- a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/selection/SimpleLayout.kt
+++ b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/selection/SimpleLayout.kt
@@ -31,22 +31,14 @@
 @Composable
 internal fun SimpleLayout(modifier: Modifier = Modifier, content: @Composable () -> Unit) {
     Layout(modifier = modifier, content = content) { measurables, constraints ->
-        val placeables = measurables.fastMap { measurable ->
-            measurable.measure(constraints)
-        }
+        val placeables = measurables.fastMap { measurable -> measurable.measure(constraints) }
 
-        val width = placeables.fastFold(0) { maxWidth, placeable ->
-            max(maxWidth, (placeable.width))
-        }
+        val width =
+            placeables.fastFold(0) { maxWidth, placeable -> max(maxWidth, (placeable.width)) }
 
-        val height = placeables.fastFold(0) { minWidth, placeable ->
-            max(minWidth, (placeable.height))
-        }
+        val height =
+            placeables.fastFold(0) { minWidth, placeable -> max(minWidth, (placeable.height)) }
 
-        layout(width, height) {
-            placeables.fastForEach { placeable ->
-                placeable.place(0, 0)
-            }
-        }
+        layout(width, height) { placeables.fastForEach { placeable -> placeable.place(0, 0) } }
     }
 }
diff --git a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/selection/TextFieldSelectionManager.kt b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/selection/TextFieldSelectionManager.kt
index aaef688..be9265e 100644
--- a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/selection/TextFieldSelectionManager.kt
+++ b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/selection/TextFieldSelectionManager.kt
@@ -60,26 +60,16 @@
 import kotlin.math.max
 import kotlin.math.min
 
-/**
- * A bridge class between user interaction to the text field selection.
- */
-internal class TextFieldSelectionManager(
-    val undoManager: UndoManager? = null
-) {
+/** A bridge class between user interaction to the text field selection. */
+internal class TextFieldSelectionManager(val undoManager: UndoManager? = null) {
 
-    /**
-     * The current [OffsetMapping] for text field.
-     */
+    /** The current [OffsetMapping] for text field. */
     internal var offsetMapping: OffsetMapping = ValidatingEmptyOffsetMappingIdentity
 
-    /**
-     * Called when the input service updates the values in [TextFieldValue].
-     */
+    /** Called when the input service updates the values in [TextFieldValue]. */
     internal var onValueChange: (TextFieldValue) -> Unit = {}
 
-    /**
-     * The current [LegacyTextFieldState].
-     */
+    /** The current [LegacyTextFieldState]. */
     internal var state: LegacyTextFieldState? = null
 
     /**
@@ -89,45 +79,34 @@
     internal var value: TextFieldValue by mutableStateOf(TextFieldValue())
 
     /**
-     * The current transformed text from the [LegacyTextFieldState].
-     * The original text can be found in [value].
+     * The current transformed text from the [LegacyTextFieldState]. The original text can be found
+     * in [value].
      */
-    internal val transformedText get() = state?.textDelegate?.text
+    internal val transformedText
+        get() = state?.textDelegate?.text
 
     /**
-     * Visual transformation of the text field's text. Used to check if certain toolbar options
-     * are permitted. For example, 'cut' will not be available is it is password transformation.
+     * Visual transformation of the text field's text. Used to check if certain toolbar options are
+     * permitted. For example, 'cut' will not be available is it is password transformation.
      */
     internal var visualTransformation: VisualTransformation = VisualTransformation.None
 
-    /**
-     * [ClipboardManager] to perform clipboard features.
-     */
+    /** [ClipboardManager] to perform clipboard features. */
     internal var clipboardManager: ClipboardManager? = null
 
-    /**
-     * [TextToolbar] to show floating toolbar(post-M) or primary toolbar(pre-M).
-     */
+    /** [TextToolbar] to show floating toolbar(post-M) or primary toolbar(pre-M). */
     var textToolbar: TextToolbar? = null
 
-    /**
-     * [HapticFeedback] handle to perform haptic feedback.
-     */
+    /** [HapticFeedback] handle to perform haptic feedback. */
     var hapticFeedBack: HapticFeedback? = null
 
-    /**
-     * [FocusRequester] used to request focus for the TextField.
-     */
+    /** [FocusRequester] used to request focus for the TextField. */
     var focusRequester: FocusRequester? = null
 
-    /**
-     * Defines if paste and cut toolbar menu actions should be shown
-     */
+    /** Defines if paste and cut toolbar menu actions should be shown */
     var editable by mutableStateOf(true)
 
-    /**
-     * Whether the text field should be selectable at all.
-     */
+    /** Whether the text field should be selectable at all. */
     var enabled by mutableStateOf(true)
 
     /**
@@ -137,11 +116,10 @@
     private var dragBeginPosition = Offset.Zero
 
     /**
-     * The beginning offset of the drag gesture translated into position in text. Every time a
-     * new drag gesture starts, it wil be recalculated.
-     * Unlike [dragBeginPosition] that is relative to the decoration box,
-     * [dragBeginOffsetInText] represents index in text. Essentially, it is equal to
-     * `layoutResult.getOffsetForPosition(dragBeginPosition)`.
+     * The beginning offset of the drag gesture translated into position in text. Every time a new
+     * drag gesture starts, it wil be recalculated. Unlike [dragBeginPosition] that is relative to
+     * the decoration box, [dragBeginOffsetInText] represents index in text. Essentially, it is
+     * equal to `layoutResult.getOffsetForPosition(dragBeginPosition)`.
      */
     private var dragBeginOffsetInText: Int? = null
 
@@ -153,272 +131,276 @@
 
     /**
      * A flag to check if a selection or cursor handle is being dragged, and which handle is being
-     * dragged.
-     * If this value is non-null, then onPress will not select any text.
-     * This value will be set to non-null when either handle is being dragged, and be reset to null
-     * when the dragging is stopped.
+     * dragged. If this value is non-null, then onPress will not select any text. This value will be
+     * set to non-null when either handle is being dragged, and be reset to null when the dragging
+     * is stopped.
      */
     var draggingHandle: Handle? by mutableStateOf(null)
         private set
 
-    /**
-     * The current position of a drag, in decoration box coordinates.
-     */
+    /** The current position of a drag, in decoration box coordinates. */
     var currentDragPosition: Offset? by mutableStateOf(null)
         private set
 
     /**
-     * The previous offset of a drag, before selection adjustments.
-     * Only update when a selection layout change has occurred,
-     * or set to -1 if a new drag begins.
+     * The previous offset of a drag, before selection adjustments. Only update when a selection
+     * layout change has occurred, or set to -1 if a new drag begins.
      */
     private var previousRawDragOffset: Int = -1
 
     /**
-     * The old [TextFieldValue] before entering the selection mode on long press. Used to exit
-     * the selection mode.
+     * The old [TextFieldValue] before entering the selection mode on long press. Used to exit the
+     * selection mode.
      */
     private var oldValue: TextFieldValue = TextFieldValue()
 
-    /**
-     * The previous [SelectionLayout] where [SelectionLayout.shouldRecomputeSelection] was true.
-     */
+    /** The previous [SelectionLayout] where [SelectionLayout.shouldRecomputeSelection] was true. */
     private var previousSelectionLayout: SelectionLayout? = null
 
-    /**
-     * [TextDragObserver] for long press and drag to select in TextField.
-     */
-    internal val touchSelectionObserver = object : TextDragObserver {
-        override fun onDown(point: Offset) {
-            // Not supported for long-press-drag.
-        }
-
-        override fun onUp() {
-            // Nothing to do.
-        }
-
-        override fun onStart(startPoint: Offset) {
-            if (!enabled || draggingHandle != null) return
-            // While selecting by long-press-dragging, the "end" of the selection is always the one
-            // being controlled by the drag.
-            draggingHandle = Handle.SelectionEnd
-            previousRawDragOffset = -1
-
-            // ensuring that current action mode (selection toolbar) is invalidated
-            hideSelectionToolbar()
-
-            // Long Press at the blank area, the cursor should show up at the end of the line.
-            if (state?.layoutResult?.isPositionOnText(startPoint) != true) {
-                state?.layoutResult?.let { layoutResult ->
-                    val transformedOffset = layoutResult.getOffsetForPosition(startPoint)
-                    val offset = offsetMapping.transformedToOriginal(transformedOffset)
-
-                    val newValue = createTextFieldValue(
-                        annotatedString = value.annotatedString,
-                        selection = TextRange(offset, offset)
-                    )
-
-                    enterSelectionMode(showFloatingToolbar = false)
-                    hapticFeedBack?.performHapticFeedback(HapticFeedbackType.TextHandleMove)
-                    onValueChange(newValue)
-                }
-            } else {
-                if (value.text.isEmpty()) return
-                enterSelectionMode(showFloatingToolbar = false)
-                val adjustedStartSelection = updateSelection(
-                    // reset selection, otherwise a previous selection may be used
-                    // as context for creating the next selection
-                    value = value.copy(selection = TextRange.Zero),
-                    currentPosition = startPoint,
-                    isStartOfSelection = true,
-                    isStartHandle = false,
-                    adjustment = SelectionAdjustment.Word,
-                    isTouchBasedSelection = true,
-                )
-                // For touch, set the begin offset to the adjusted selection.
-                // When char based selection is used, we want to ensure we snap the
-                // beginning offset to the start word boundary of the first selected word.
-                dragBeginOffsetInText = adjustedStartSelection.start
+    /** [TextDragObserver] for long press and drag to select in TextField. */
+    internal val touchSelectionObserver =
+        object : TextDragObserver {
+            override fun onDown(point: Offset) {
+                // Not supported for long-press-drag.
             }
 
-            // don't set selection handle state until drag ends
-            setHandleState(None)
+            override fun onUp() {
+                // Nothing to do.
+            }
 
-            dragBeginPosition = startPoint
-            currentDragPosition = dragBeginPosition
-            dragTotalDistance = Offset.Zero
+            override fun onStart(startPoint: Offset) {
+                if (!enabled || draggingHandle != null) return
+                // While selecting by long-press-dragging, the "end" of the selection is always the
+                // one
+                // being controlled by the drag.
+                draggingHandle = Handle.SelectionEnd
+                previousRawDragOffset = -1
+
+                // ensuring that current action mode (selection toolbar) is invalidated
+                hideSelectionToolbar()
+
+                // Long Press at the blank area, the cursor should show up at the end of the line.
+                if (state?.layoutResult?.isPositionOnText(startPoint) != true) {
+                    state?.layoutResult?.let { layoutResult ->
+                        val transformedOffset = layoutResult.getOffsetForPosition(startPoint)
+                        val offset = offsetMapping.transformedToOriginal(transformedOffset)
+
+                        val newValue =
+                            createTextFieldValue(
+                                annotatedString = value.annotatedString,
+                                selection = TextRange(offset, offset)
+                            )
+
+                        enterSelectionMode(showFloatingToolbar = false)
+                        hapticFeedBack?.performHapticFeedback(HapticFeedbackType.TextHandleMove)
+                        onValueChange(newValue)
+                    }
+                } else {
+                    if (value.text.isEmpty()) return
+                    enterSelectionMode(showFloatingToolbar = false)
+                    val adjustedStartSelection =
+                        updateSelection(
+                            // reset selection, otherwise a previous selection may be used
+                            // as context for creating the next selection
+                            value = value.copy(selection = TextRange.Zero),
+                            currentPosition = startPoint,
+                            isStartOfSelection = true,
+                            isStartHandle = false,
+                            adjustment = SelectionAdjustment.Word,
+                            isTouchBasedSelection = true,
+                        )
+                    // For touch, set the begin offset to the adjusted selection.
+                    // When char based selection is used, we want to ensure we snap the
+                    // beginning offset to the start word boundary of the first selected word.
+                    dragBeginOffsetInText = adjustedStartSelection.start
+                }
+
+                // don't set selection handle state until drag ends
+                setHandleState(None)
+
+                dragBeginPosition = startPoint
+                currentDragPosition = dragBeginPosition
+                dragTotalDistance = Offset.Zero
+            }
+
+            override fun onDrag(delta: Offset) {
+                // selection never started, did not consume any drag
+                if (!enabled || value.text.isEmpty()) return
+
+                dragTotalDistance += delta
+                state?.layoutResult?.let { layoutResult ->
+                    currentDragPosition = dragBeginPosition + dragTotalDistance
+
+                    if (
+                        dragBeginOffsetInText == null &&
+                            !layoutResult.isPositionOnText(currentDragPosition!!)
+                    ) {
+                        // both start and end of drag is in end padding.
+                        val startOffset =
+                            offsetMapping.transformedToOriginal(
+                                layoutResult.getOffsetForPosition(dragBeginPosition)
+                            )
+
+                        val endOffset =
+                            offsetMapping.transformedToOriginal(
+                                layoutResult.getOffsetForPosition(currentDragPosition!!)
+                            )
+
+                        val adjustment =
+                            if (startOffset == endOffset) {
+                                // start and end is in the same end padding, keep the collapsed
+                                // selection
+                                SelectionAdjustment.None
+                            } else {
+                                SelectionAdjustment.Word
+                            }
+
+                        updateSelection(
+                            value = value,
+                            currentPosition = currentDragPosition!!,
+                            isStartOfSelection = false,
+                            isStartHandle = false,
+                            adjustment = adjustment,
+                            isTouchBasedSelection = true,
+                        )
+                    } else {
+                        val startOffset =
+                            dragBeginOffsetInText
+                                ?: layoutResult.getOffsetForPosition(
+                                    position = dragBeginPosition,
+                                    coerceInVisibleBounds = false
+                                )
+                        val endOffset =
+                            layoutResult.getOffsetForPosition(
+                                position = currentDragPosition!!,
+                                coerceInVisibleBounds = false
+                            )
+
+                        if (dragBeginOffsetInText == null && startOffset == endOffset) {
+                            // if we are selecting starting from end padding,
+                            // don't start selection until we have and un-collapsed selection.
+                            return
+                        }
+
+                        updateSelection(
+                            value = value,
+                            currentPosition = currentDragPosition!!,
+                            isStartOfSelection = false,
+                            isStartHandle = false,
+                            adjustment = SelectionAdjustment.Word,
+                            isTouchBasedSelection = true,
+                        )
+                    }
+                }
+                updateFloatingToolbar(show = false)
+            }
+
+            override fun onStop() = onEnd()
+
+            override fun onCancel() = onEnd()
+
+            private fun onEnd() {
+                draggingHandle = null
+                currentDragPosition = null
+                updateFloatingToolbar(show = true)
+                dragBeginOffsetInText = null
+
+                val collapsed = value.selection.collapsed
+                setHandleState(if (collapsed) Cursor else Selection)
+                state?.showSelectionHandleStart =
+                    !collapsed && isSelectionHandleInVisibleBound(isStartHandle = true)
+                state?.showSelectionHandleEnd =
+                    !collapsed && isSelectionHandleInVisibleBound(isStartHandle = false)
+                state?.showCursorHandle =
+                    collapsed && isSelectionHandleInVisibleBound(isStartHandle = true)
+            }
         }
 
-        override fun onDrag(delta: Offset) {
-            // selection never started, did not consume any drag
-            if (!enabled || value.text.isEmpty()) return
+    internal val mouseSelectionObserver =
+        object : MouseSelectionObserver {
+            override fun onExtend(downPosition: Offset): Boolean {
+                // can't update selection without a layoutResult, so don't consume
+                state?.layoutResult ?: return false
+                if (!enabled) return false
+                previousRawDragOffset = -1
+                updateMouseSelection(
+                    value = value,
+                    currentPosition = downPosition,
+                    isStartOfSelection = false,
+                    adjustment = SelectionAdjustment.None,
+                )
+                return true
+            }
 
-            dragTotalDistance += delta
-            state?.layoutResult?.let { layoutResult ->
-                currentDragPosition = dragBeginPosition + dragTotalDistance
+            override fun onExtendDrag(dragPosition: Offset): Boolean {
+                if (!enabled || value.text.isEmpty()) return false
+                // can't update selection without a layoutResult, so don't consume
+                state?.layoutResult ?: return false
 
-                if (
-                    dragBeginOffsetInText == null &&
-                    !layoutResult.isPositionOnText(currentDragPosition!!)
-                ) {
-                    // both start and end of drag is in end padding.
-                    val startOffset = offsetMapping.transformedToOriginal(
-                        layoutResult.getOffsetForPosition(dragBeginPosition)
-                    )
+                updateMouseSelection(
+                    value = value,
+                    currentPosition = dragPosition,
+                    isStartOfSelection = false,
+                    adjustment = SelectionAdjustment.None,
+                )
+                return true
+            }
 
-                    val endOffset = offsetMapping.transformedToOriginal(
-                        layoutResult.getOffsetForPosition(currentDragPosition!!)
-                    )
+            override fun onStart(downPosition: Offset, adjustment: SelectionAdjustment): Boolean {
+                if (!enabled || value.text.isEmpty()) return false
+                // can't update selection without a layoutResult, so don't consume
+                state?.layoutResult ?: return false
 
-                    val adjustment = if (startOffset == endOffset) {
-                        // start and end is in the same end padding, keep the collapsed selection
-                        SelectionAdjustment.None
-                    } else {
-                        SelectionAdjustment.Word
-                    }
+                focusRequester?.requestFocus()
+                dragBeginPosition = downPosition
+                previousRawDragOffset = -1
+                enterSelectionMode()
+                updateMouseSelection(
+                    value = value,
+                    currentPosition = dragBeginPosition,
+                    isStartOfSelection = true,
+                    adjustment = adjustment,
+                )
+                return true
+            }
 
+            override fun onDrag(dragPosition: Offset, adjustment: SelectionAdjustment): Boolean {
+                if (!enabled || value.text.isEmpty()) return false
+                // can't update selection without a layoutResult, so don't consume
+                state?.layoutResult ?: return false
+
+                updateMouseSelection(
+                    value = value,
+                    currentPosition = dragPosition,
+                    isStartOfSelection = false,
+                    adjustment = adjustment,
+                )
+                return true
+            }
+
+            fun updateMouseSelection(
+                value: TextFieldValue,
+                currentPosition: Offset,
+                isStartOfSelection: Boolean,
+                adjustment: SelectionAdjustment,
+            ) {
+                val newSelection =
                     updateSelection(
                         value = value,
-                        currentPosition = currentDragPosition!!,
-                        isStartOfSelection = false,
+                        currentPosition = currentPosition,
+                        isStartOfSelection = isStartOfSelection,
                         isStartHandle = false,
                         adjustment = adjustment,
-                        isTouchBasedSelection = true,
+                        isTouchBasedSelection = false,
                     )
-                } else {
-                    val startOffset = dragBeginOffsetInText ?: layoutResult.getOffsetForPosition(
-                        position = dragBeginPosition,
-                        coerceInVisibleBounds = false
-                    )
-                    val endOffset = layoutResult.getOffsetForPosition(
-                        position = currentDragPosition!!,
-                        coerceInVisibleBounds = false
-                    )
-
-                    if (dragBeginOffsetInText == null && startOffset == endOffset) {
-                        // if we are selecting starting from end padding,
-                        // don't start selection until we have and un-collapsed selection.
-                        return
-                    }
-
-                    updateSelection(
-                        value = value,
-                        currentPosition = currentDragPosition!!,
-                        isStartOfSelection = false,
-                        isStartHandle = false,
-                        adjustment = SelectionAdjustment.Word,
-                        isTouchBasedSelection = true,
-                    )
-                }
+                setHandleState(if (newSelection.collapsed) Cursor else Selection)
             }
-            updateFloatingToolbar(show = false)
+
+            override fun onDragDone() {
+                /* Nothing to do */
+            }
         }
 
-        override fun onStop() = onEnd()
-        override fun onCancel() = onEnd()
-        private fun onEnd() {
-            draggingHandle = null
-            currentDragPosition = null
-            updateFloatingToolbar(show = true)
-            dragBeginOffsetInText = null
-
-            val collapsed = value.selection.collapsed
-            setHandleState(if (collapsed) Cursor else Selection)
-            state?.showSelectionHandleStart =
-                !collapsed && isSelectionHandleInVisibleBound(isStartHandle = true)
-            state?.showSelectionHandleEnd =
-                !collapsed && isSelectionHandleInVisibleBound(isStartHandle = false)
-            state?.showCursorHandle =
-                collapsed && isSelectionHandleInVisibleBound(isStartHandle = true)
-        }
-    }
-
-    internal val mouseSelectionObserver = object : MouseSelectionObserver {
-        override fun onExtend(downPosition: Offset): Boolean {
-            // can't update selection without a layoutResult, so don't consume
-            state?.layoutResult ?: return false
-            if (!enabled) return false
-            previousRawDragOffset = -1
-            updateMouseSelection(
-                value = value,
-                currentPosition = downPosition,
-                isStartOfSelection = false,
-                adjustment = SelectionAdjustment.None,
-            )
-            return true
-        }
-
-        override fun onExtendDrag(dragPosition: Offset): Boolean {
-            if (!enabled || value.text.isEmpty()) return false
-            // can't update selection without a layoutResult, so don't consume
-            state?.layoutResult ?: return false
-
-            updateMouseSelection(
-                value = value,
-                currentPosition = dragPosition,
-                isStartOfSelection = false,
-                adjustment = SelectionAdjustment.None,
-            )
-            return true
-        }
-
-        override fun onStart(
-            downPosition: Offset,
-            adjustment: SelectionAdjustment
-        ): Boolean {
-            if (!enabled || value.text.isEmpty()) return false
-            // can't update selection without a layoutResult, so don't consume
-            state?.layoutResult ?: return false
-
-            focusRequester?.requestFocus()
-            dragBeginPosition = downPosition
-            previousRawDragOffset = -1
-            enterSelectionMode()
-            updateMouseSelection(
-                value = value,
-                currentPosition = dragBeginPosition,
-                isStartOfSelection = true,
-                adjustment = adjustment,
-            )
-            return true
-        }
-
-        override fun onDrag(dragPosition: Offset, adjustment: SelectionAdjustment): Boolean {
-            if (!enabled || value.text.isEmpty()) return false
-            // can't update selection without a layoutResult, so don't consume
-            state?.layoutResult ?: return false
-
-            updateMouseSelection(
-                value = value,
-                currentPosition = dragPosition,
-                isStartOfSelection = false,
-                adjustment = adjustment,
-            )
-            return true
-        }
-
-        fun updateMouseSelection(
-            value: TextFieldValue,
-            currentPosition: Offset,
-            isStartOfSelection: Boolean,
-            adjustment: SelectionAdjustment,
-        ) {
-            val newSelection = updateSelection(
-                value = value,
-                currentPosition = currentPosition,
-                isStartOfSelection = isStartOfSelection,
-                isStartHandle = false,
-                adjustment = adjustment,
-                isTouchBasedSelection = false,
-            )
-            setHandleState(if (newSelection.collapsed) Cursor else Selection)
-        }
-
-        override fun onDragDone() {
-            /* Nothing to do */
-        }
-    }
-
     /**
      * [TextDragObserver] for dragging the selection handles to change the selection in TextField.
      */
@@ -481,71 +463,71 @@
             override fun onCancel() {}
         }
 
-    /**
-     * [TextDragObserver] for dragging the cursor to change the selection in TextField.
-     */
-    internal fun cursorDragObserver(): TextDragObserver = object : TextDragObserver {
-        override fun onDown(point: Offset) {
-            // Nothing
-        }
-
-        override fun onUp() {
-            draggingHandle = null
-            currentDragPosition = null
-        }
-
-        override fun onStart(startPoint: Offset) {
-            // The position of the character where the drag gesture should begin. This is in
-            // the inner text field coordinates.
-            val handleCoordinates = getAdjustedCoordinates(getHandlePosition(true))
-
-            // translate to decoration box coordinates
-            val layoutResult = state?.layoutResult ?: return
-            val translatedPosition =
-                layoutResult.translateInnerToDecorationCoordinates(handleCoordinates)
-
-            dragBeginPosition = translatedPosition
-            currentDragPosition = translatedPosition
-            // Zero out the total distance that being dragged.
-            dragTotalDistance = Offset.Zero
-            draggingHandle = Handle.Cursor
-            updateFloatingToolbar(show = false)
-        }
-
-        override fun onDrag(delta: Offset) {
-            dragTotalDistance += delta
-
-            state?.layoutResult?.let { layoutResult ->
-                currentDragPosition = dragBeginPosition + dragTotalDistance
-                val offset = offsetMapping.transformedToOriginal(
-                    layoutResult.getOffsetForPosition(currentDragPosition!!)
-                )
-
-                val newSelection = TextRange(offset, offset)
-
-                // Nothing changed, skip onValueChange hand hapticFeedback.
-                if (newSelection == value.selection) return
-
-                if (state?.isInTouchMode != false) {
-                    hapticFeedBack?.performHapticFeedback(HapticFeedbackType.TextHandleMove)
-                }
-
-                onValueChange(
-                    createTextFieldValue(
-                        annotatedString = value.annotatedString,
-                        selection = newSelection
-                    )
-                )
+    /** [TextDragObserver] for dragging the cursor to change the selection in TextField. */
+    internal fun cursorDragObserver(): TextDragObserver =
+        object : TextDragObserver {
+            override fun onDown(point: Offset) {
+                // Nothing
             }
-        }
 
-        override fun onStop() {
-            draggingHandle = null
-            currentDragPosition = null
-        }
+            override fun onUp() {
+                draggingHandle = null
+                currentDragPosition = null
+            }
 
-        override fun onCancel() {}
-    }
+            override fun onStart(startPoint: Offset) {
+                // The position of the character where the drag gesture should begin. This is in
+                // the inner text field coordinates.
+                val handleCoordinates = getAdjustedCoordinates(getHandlePosition(true))
+
+                // translate to decoration box coordinates
+                val layoutResult = state?.layoutResult ?: return
+                val translatedPosition =
+                    layoutResult.translateInnerToDecorationCoordinates(handleCoordinates)
+
+                dragBeginPosition = translatedPosition
+                currentDragPosition = translatedPosition
+                // Zero out the total distance that being dragged.
+                dragTotalDistance = Offset.Zero
+                draggingHandle = Handle.Cursor
+                updateFloatingToolbar(show = false)
+            }
+
+            override fun onDrag(delta: Offset) {
+                dragTotalDistance += delta
+
+                state?.layoutResult?.let { layoutResult ->
+                    currentDragPosition = dragBeginPosition + dragTotalDistance
+                    val offset =
+                        offsetMapping.transformedToOriginal(
+                            layoutResult.getOffsetForPosition(currentDragPosition!!)
+                        )
+
+                    val newSelection = TextRange(offset, offset)
+
+                    // Nothing changed, skip onValueChange hand hapticFeedback.
+                    if (newSelection == value.selection) return
+
+                    if (state?.isInTouchMode != false) {
+                        hapticFeedBack?.performHapticFeedback(HapticFeedbackType.TextHandleMove)
+                    }
+
+                    onValueChange(
+                        createTextFieldValue(
+                            annotatedString = value.annotatedString,
+                            selection = newSelection
+                        )
+                    )
+                }
+            }
+
+            override fun onStop() {
+                draggingHandle = null
+                currentDragPosition = null
+            }
+
+            override fun onCancel() {}
+        }
 
     /**
      * The method to record the required state values on entering the selection mode.
@@ -578,13 +560,12 @@
             // if selection was not collapsed, set a default cursor location, otherwise
             // don't change the location of the cursor.
             val layoutResult = state?.layoutResult
-            val newCursorOffset = if (position != null && layoutResult != null) {
-                offsetMapping.transformedToOriginal(
-                    layoutResult.getOffsetForPosition(position)
-                )
-            } else {
-                value.selection.max
-            }
+            val newCursorOffset =
+                if (position != null && layoutResult != null) {
+                    offsetMapping.transformedToOriginal(layoutResult.getOffsetForPosition(position))
+                } else {
+                    value.selection.max
+                }
             val newValue = value.copy(selection = TextRange(newCursorOffset))
             onValueChange(newValue)
         }
@@ -615,12 +596,10 @@
     /**
      * The method for copying text.
      *
-     * If there is no selection, return.
-     * Put the selected text into the [ClipboardManager], and cancel the selection, if
-     * [cancelSelection] is true.
-     * The text in the text field should be unchanged.
-     * If [cancelSelection] is true, the new cursor offset should be at the end of the previous
-     * selected text.
+     * If there is no selection, return. Put the selected text into the [ClipboardManager], and
+     * cancel the selection, if [cancelSelection] is true. The text in the text field should be
+     * unchanged. If [cancelSelection] is true, the new cursor offset should be at the end of the
+     * previous selected text.
      */
     internal fun copy(cancelSelection: Boolean = true) {
         if (value.selection.collapsed) return
@@ -631,10 +610,11 @@
         if (!cancelSelection) return
 
         val newCursorOffset = value.selection.max
-        val newValue = createTextFieldValue(
-            annotatedString = value.annotatedString,
-            selection = TextRange(newCursorOffset, newCursorOffset)
-        )
+        val newValue =
+            createTextFieldValue(
+                annotatedString = value.annotatedString,
+                selection = TextRange(newCursorOffset, newCursorOffset)
+            )
         onValueChange(newValue)
         setHandleState(None)
     }
@@ -642,24 +622,25 @@
     /**
      * The method for pasting text.
      *
-     * Get the text from [ClipboardManager]. If it's null, return.
-     * The new text should be the text before the selected text, plus the text from the
-     * [ClipboardManager], and plus the text after the selected text.
-     * Then the selection should collapse, and the new cursor offset should be the end of the
-     * newly added text.
+     * Get the text from [ClipboardManager]. If it's null, return. The new text should be the text
+     * before the selected text, plus the text from the [ClipboardManager], and plus the text after
+     * the selected text. Then the selection should collapse, and the new cursor offset should be
+     * the end of the newly added text.
      */
     internal fun paste() {
         val text = clipboardManager?.getText() ?: return
 
-        val newText = value.getTextBeforeSelection(value.text.length) +
-            text +
-            value.getTextAfterSelection(value.text.length)
+        val newText =
+            value.getTextBeforeSelection(value.text.length) +
+                text +
+                value.getTextAfterSelection(value.text.length)
         val newCursorOffset = value.selection.min + text.length
 
-        val newValue = createTextFieldValue(
-            annotatedString = newText,
-            selection = TextRange(newCursorOffset, newCursorOffset)
-        )
+        val newValue =
+            createTextFieldValue(
+                annotatedString = newText,
+                selection = TextRange(newCursorOffset, newCursorOffset)
+            )
         onValueChange(newValue)
         setHandleState(None)
         undoManager?.forceNextSnapshot()
@@ -668,11 +649,10 @@
     /**
      * The method for cutting text.
      *
-     * If there is no selection, return.
-     * Put the selected text into the [ClipboardManager].
-     * The new text should be the text before the selection plus the text after the selection.
-     * And the new cursor offset should be between the text before the selection, and the text
-     * after the selection.
+     * If there is no selection, return. Put the selected text into the [ClipboardManager]. The new
+     * text should be the text before the selection plus the text after the selection. And the new
+     * cursor offset should be between the text before the selection, and the text after the
+     * selection.
      */
     internal fun cut() {
         if (value.selection.collapsed) return
@@ -680,14 +660,16 @@
         // TODO(b/171947959) check if original or transformed should be cut
         clipboardManager?.setText(value.getSelectedText())
 
-        val newText = value.getTextBeforeSelection(value.text.length) +
-            value.getTextAfterSelection(value.text.length)
+        val newText =
+            value.getTextBeforeSelection(value.text.length) +
+                value.getTextAfterSelection(value.text.length)
         val newCursorOffset = value.selection.min
 
-        val newValue = createTextFieldValue(
-            annotatedString = newText,
-            selection = TextRange(newCursorOffset, newCursorOffset)
-        )
+        val newValue =
+            createTextFieldValue(
+                annotatedString = newText,
+                selection = TextRange(newCursorOffset, newCursorOffset)
+            )
         onValueChange(newValue)
         setHandleState(None)
         undoManager?.forceNextSnapshot()
@@ -695,10 +677,11 @@
 
     /*@VisibleForTesting*/
     internal fun selectAll() {
-        val newValue = createTextFieldValue(
-            annotatedString = value.annotatedString,
-            selection = TextRange(0, value.text.length)
-        )
+        val newValue =
+            createTextFieldValue(
+                annotatedString = value.annotatedString,
+                selection = TextRange(0, value.text.length)
+            )
         onValueChange(newValue)
         oldValue = oldValue.copy(selection = newValue.selection)
         enterSelectionMode(showFloatingToolbar = true)
@@ -725,12 +708,9 @@
     internal fun getCursorPosition(density: Density): Offset {
         val offset = offsetMapping.originalToTransformed(value.selection.start)
         val layoutResult = state?.layoutResult!!.value
-        val cursorRect = layoutResult.getCursorRect(
-            offset.coerceIn(0, layoutResult.layoutInput.text.length)
-        )
-        val x = with(density) {
-            cursorRect.left + DefaultCursorThickness.toPx() / 2
-        }
+        val cursorRect =
+            layoutResult.getCursorRect(offset.coerceIn(0, layoutResult.layoutInput.text.length))
+        val x = with(density) { cursorRect.left + DefaultCursorThickness.toPx() / 2 }
         return Offset(x, cursorRect.bottom)
     }
 
@@ -739,8 +719,8 @@
      *
      * You may want to call [showSelectionToolbar] and [hideSelectionToolbar] directly without
      * updating the [LegacyTextFieldState.showFloatingToolbar] if you are simply hiding all touch
-     * selection behaviors (toolbar, handles, cursor, magnifier), but want the toolbar to come
-     * back when you un-hide all those behaviors.
+     * selection behaviors (toolbar, handles, cursor, magnifier), but want the toolbar to come back
+     * when you un-hide all those behaviors.
      */
     private fun updateFloatingToolbar(show: Boolean) {
         state?.showFloatingToolbar = show
@@ -748,39 +728,41 @@
     }
 
     /**
-     * This function get the selected region as a Rectangle region, and pass it to [TextToolbar]
-     * to make the FloatingToolbar show up in the proper place. In addition, this function passes
-     * the copy, paste and cut method as callbacks when "copy", "cut" or "paste" is clicked.
+     * This function get the selected region as a Rectangle region, and pass it to [TextToolbar] to
+     * make the FloatingToolbar show up in the proper place. In addition, this function passes the
+     * copy, paste and cut method as callbacks when "copy", "cut" or "paste" is clicked.
      */
     internal fun showSelectionToolbar() {
         if (!enabled || state?.isInTouchMode == false) return
         val isPassword = visualTransformation is PasswordVisualTransformation
-        val copy: (() -> Unit)? = if (!value.selection.collapsed && !isPassword) {
-            {
-                copy()
-                hideSelectionToolbar()
-            }
-        } else null
+        val copy: (() -> Unit)? =
+            if (!value.selection.collapsed && !isPassword) {
+                {
+                    copy()
+                    hideSelectionToolbar()
+                }
+            } else null
 
-        val cut: (() -> Unit)? = if (!value.selection.collapsed && editable && !isPassword) {
-            {
-                cut()
-                hideSelectionToolbar()
-            }
-        } else null
+        val cut: (() -> Unit)? =
+            if (!value.selection.collapsed && editable && !isPassword) {
+                {
+                    cut()
+                    hideSelectionToolbar()
+                }
+            } else null
 
-        val paste: (() -> Unit)? = if (editable && clipboardManager?.hasText() == true) {
-            {
-                paste()
-                hideSelectionToolbar()
-            }
-        } else null
+        val paste: (() -> Unit)? =
+            if (editable && clipboardManager?.hasText() == true) {
+                {
+                    paste()
+                    hideSelectionToolbar()
+                }
+            } else null
 
-        val selectAll: (() -> Unit)? = if (value.selection.length != value.text.length) {
-            {
-                selectAll()
-            }
-        } else null
+        val selectAll: (() -> Unit)? =
+            if (value.selection.length != value.text.length) {
+                { selectAll() }
+            } else null
 
         textToolbar?.showMenu(
             rect = getContentRect(),
@@ -815,55 +797,61 @@
     }
 
     /**
-     * Check if the text in the text field changed.
-     * When the content in the text field is modified, this method returns true.
+     * Check if the text in the text field changed. When the content in the text field is modified,
+     * this method returns true.
      */
     internal fun isTextChanged(): Boolean {
         return oldValue.text != value.text
     }
 
     /**
-     * Calculate selected region as [Rect]. The top is the top of the first selected
-     * line, and the bottom is the bottom of the last selected line. The left is the leftmost
-     * handle's horizontal coordinates, and the right is the rightmost handle's coordinates.
+     * Calculate selected region as [Rect]. The top is the top of the first selected line, and the
+     * bottom is the bottom of the last selected line. The left is the leftmost handle's horizontal
+     * coordinates, and the right is the rightmost handle's coordinates.
      */
     private fun getContentRect(): Rect {
         // if it's stale layout, return empty Rect
-        state?.takeIf { !it.isLayoutResultStale }?.let {
-            // value.selection is from the original representation.
-            // we need to convert original offsets into transformed offsets to query
-            // layoutResult because layoutResult belongs to the transformed text.
-            val transformedStart = offsetMapping.originalToTransformed(value.selection.start)
-            val transformedEnd = offsetMapping.originalToTransformed(value.selection.end)
-            val startOffset =
-                state?.layoutCoordinates?.localToRoot(getHandlePosition(true))
-                    ?: Offset.Zero
-            val endOffset =
-                state?.layoutCoordinates?.localToRoot(getHandlePosition(false))
-                    ?: Offset.Zero
-            val startTop =
-                state?.layoutCoordinates?.localToRoot(
-                    Offset(
-                        0f,
-                        it.layoutResult?.value?.getCursorRect(transformedStart)?.top ?: 0f
-                    )
-                )?.y ?: 0f
-            val endTop =
-                state?.layoutCoordinates?.localToRoot(
-                    Offset(
-                        x = 0f,
-                        y = it.layoutResult?.value?.getCursorRect(transformedEnd)?.top ?: 0f
-                    )
-                )?.y ?: 0f
+        state
+            ?.takeIf { !it.isLayoutResultStale }
+            ?.let {
+                // value.selection is from the original representation.
+                // we need to convert original offsets into transformed offsets to query
+                // layoutResult because layoutResult belongs to the transformed text.
+                val transformedStart = offsetMapping.originalToTransformed(value.selection.start)
+                val transformedEnd = offsetMapping.originalToTransformed(value.selection.end)
+                val startOffset =
+                    state?.layoutCoordinates?.localToRoot(getHandlePosition(true)) ?: Offset.Zero
+                val endOffset =
+                    state?.layoutCoordinates?.localToRoot(getHandlePosition(false)) ?: Offset.Zero
+                val startTop =
+                    state
+                        ?.layoutCoordinates
+                        ?.localToRoot(
+                            Offset(
+                                0f,
+                                it.layoutResult?.value?.getCursorRect(transformedStart)?.top ?: 0f
+                            )
+                        )
+                        ?.y ?: 0f
+                val endTop =
+                    state
+                        ?.layoutCoordinates
+                        ?.localToRoot(
+                            Offset(
+                                x = 0f,
+                                y = it.layoutResult?.value?.getCursorRect(transformedEnd)?.top ?: 0f
+                            )
+                        )
+                        ?.y ?: 0f
 
-            val left = min(startOffset.x, endOffset.x)
-            val right = max(startOffset.x, endOffset.x)
-            val top = min(startTop, endTop)
-            val bottom = max(startOffset.y, endOffset.y) +
-                25.dp.value * it.textDelegate.density.density
+                val left = min(startOffset.x, endOffset.x)
+                val right = max(startOffset.x, endOffset.x)
+                val top = min(startTop, endTop)
+                val bottom =
+                    max(startOffset.y, endOffset.y) + 25.dp.value * it.textDelegate.density.density
 
-            return Rect(left, top, right, bottom)
-        }
+                return Rect(left, top, right, bottom)
+            }
 
         return Rect.Zero
     }
@@ -873,9 +861,9 @@
      *
      * @param value the current [TextFieldValue]
      * @param currentPosition the current position of the cursor/drag in the decoration box
-     * coordinates
+     *   coordinates
      * @param isStartOfSelection whether this is the first updateSelection of a selection gesture.
-     * If true, will ignore any previous selection context.
+     *   If true, will ignore any previous selection context.
      * @param isStartHandle whether the start handle is being updated
      * @param adjustment The selection adjustment to use
      * @param isTouchBasedSelection Whether this is a touch based selection
@@ -889,42 +877,46 @@
         isTouchBasedSelection: Boolean,
     ): TextRange {
         val layoutResult = state?.layoutResult ?: return TextRange.Zero
-        val previousTransformedSelection = TextRange(
-            offsetMapping.originalToTransformed(value.selection.start),
-            offsetMapping.originalToTransformed(value.selection.end)
-        )
+        val previousTransformedSelection =
+            TextRange(
+                offsetMapping.originalToTransformed(value.selection.start),
+                offsetMapping.originalToTransformed(value.selection.end)
+            )
 
-        val currentOffset = layoutResult.getOffsetForPosition(
-            position = currentPosition,
-            coerceInVisibleBounds = false
-        )
+        val currentOffset =
+            layoutResult.getOffsetForPosition(
+                position = currentPosition,
+                coerceInVisibleBounds = false
+            )
 
-        val rawStartHandleOffset = if (isStartHandle || isStartOfSelection) currentOffset else
-            previousTransformedSelection.start
+        val rawStartHandleOffset =
+            if (isStartHandle || isStartOfSelection) currentOffset
+            else previousTransformedSelection.start
 
-        val rawEndHandleOffset = if (!isStartHandle || isStartOfSelection) currentOffset else
-            previousTransformedSelection.end
+        val rawEndHandleOffset =
+            if (!isStartHandle || isStartOfSelection) currentOffset
+            else previousTransformedSelection.end
 
         val previousSelectionLayout = previousSelectionLayout // for smart cast
-        val rawPreviousHandleOffset = if (
-            isStartOfSelection ||
-            previousSelectionLayout == null ||
-            previousRawDragOffset == -1
-        ) {
-            -1
-        } else {
-            previousRawDragOffset
-        }
+        val rawPreviousHandleOffset =
+            if (
+                isStartOfSelection || previousSelectionLayout == null || previousRawDragOffset == -1
+            ) {
+                -1
+            } else {
+                previousRawDragOffset
+            }
 
-        val selectionLayout = getTextFieldSelectionLayout(
-            layoutResult = layoutResult.value,
-            rawStartHandleOffset = rawStartHandleOffset,
-            rawEndHandleOffset = rawEndHandleOffset,
-            rawPreviousHandleOffset = rawPreviousHandleOffset,
-            previousSelectionRange = previousTransformedSelection,
-            isStartOfSelection = isStartOfSelection,
-            isStartHandle = isStartHandle,
-        )
+        val selectionLayout =
+            getTextFieldSelectionLayout(
+                layoutResult = layoutResult.value,
+                rawStartHandleOffset = rawStartHandleOffset,
+                rawEndHandleOffset = rawEndHandleOffset,
+                rawPreviousHandleOffset = rawPreviousHandleOffset,
+                previousSelectionRange = previousTransformedSelection,
+                isStartOfSelection = isStartOfSelection,
+                isStartHandle = isStartHandle,
+            )
 
         if (!selectionLayout.shouldRecomputeSelection(previousSelectionLayout)) {
             return value.selection
@@ -934,29 +926,30 @@
         previousRawDragOffset = currentOffset
 
         val newTransformedSelection = adjustment.adjust(selectionLayout)
-        val newSelection = TextRange(
-            start = offsetMapping.transformedToOriginal(newTransformedSelection.start.offset),
-            end = offsetMapping.transformedToOriginal(newTransformedSelection.end.offset)
-        )
+        val newSelection =
+            TextRange(
+                start = offsetMapping.transformedToOriginal(newTransformedSelection.start.offset),
+                end = offsetMapping.transformedToOriginal(newTransformedSelection.end.offset)
+            )
 
         if (newSelection == value.selection) return value.selection
 
-        val onlyChangeIsReversed = newSelection.reversed != value.selection.reversed &&
-            with(newSelection) { TextRange(end, start) } == value.selection
+        val onlyChangeIsReversed =
+            newSelection.reversed != value.selection.reversed &&
+                with(newSelection) { TextRange(end, start) } == value.selection
 
         val bothSelectionsCollapsed = newSelection.collapsed && value.selection.collapsed
-        if (isTouchBasedSelection &&
-            value.text.isNotEmpty() &&
-            !onlyChangeIsReversed &&
-            !bothSelectionsCollapsed
+        if (
+            isTouchBasedSelection &&
+                value.text.isNotEmpty() &&
+                !onlyChangeIsReversed &&
+                !bothSelectionsCollapsed
         ) {
             hapticFeedBack?.performHapticFeedback(HapticFeedbackType.TextHandleMove)
         }
 
-        val newValue = createTextFieldValue(
-            annotatedString = value.annotatedString,
-            selection = newSelection
-        )
+        val newValue =
+            createTextFieldValue(annotatedString = value.annotatedString, selection = newSelection)
         onValueChange(newValue)
 
         if (!isTouchBasedSelection) {
@@ -986,10 +979,7 @@
         annotatedString: AnnotatedString,
         selection: TextRange
     ): TextFieldValue {
-        return TextFieldValue(
-            annotatedString = annotatedString,
-            selection = selection
-        )
+        return TextFieldValue(annotatedString = annotatedString, selection = selection)
     }
 }
 
@@ -999,29 +989,24 @@
     direction: ResolvedTextDirection,
     manager: TextFieldSelectionManager
 ) {
-    val observer = remember(isStartHandle, manager) {
-        manager.handleDragObserver(isStartHandle)
-    }
+    val observer = remember(isStartHandle, manager) { manager.handleDragObserver(isStartHandle) }
 
     SelectionHandle(
         offsetProvider = { manager.getHandlePosition(isStartHandle) },
         isStartHandle = isStartHandle,
         direction = direction,
         handlesCrossed = manager.value.selection.reversed,
-        modifier = Modifier.pointerInput(observer) {
-            detectDownAndDragGesturesWithObserver(observer)
-        },
+        modifier =
+            Modifier.pointerInput(observer) { detectDownAndDragGesturesWithObserver(observer) },
     )
 }
 
-/**
- * Whether the selection handle is in the visible bound of the TextField.
- */
+/** Whether the selection handle is in the visible bound of the TextField. */
 internal fun TextFieldSelectionManager.isSelectionHandleInVisibleBound(
     isStartHandle: Boolean
-): Boolean = state?.layoutCoordinates?.visibleBounds()?.containsInclusive(
-    getHandlePosition(isStartHandle)
-) ?: false
+): Boolean =
+    state?.layoutCoordinates?.visibleBounds()?.containsInclusive(getHandlePosition(isStartHandle))
+        ?: false
 
 // TODO(b/180075467) it should be part of PointerEvent API in one way or another
 internal expect val PointerEvent.isShiftPressed: Boolean
@@ -1037,9 +1022,7 @@
  */
 internal expect fun Modifier.textFieldMagnifier(manager: TextFieldSelectionManager): Modifier
 
-/**
- * @return the location of the magnifier relative to the inner text field coordinates
- */
+/** @return the location of the magnifier relative to the inner text field coordinates */
 internal fun calculateSelectionMagnifierCenterAndroid(
     manager: TextFieldSelectionManager,
     magnifierSize: IntSize
@@ -1049,20 +1032,21 @@
 
     // Never show the magnifier in an empty text field.
     if (manager.transformedText?.isEmpty() != false) return Offset.Unspecified
-    val rawTextOffset = when (manager.draggingHandle) {
-        null -> return Offset.Unspecified
-        Handle.Cursor,
-        Handle.SelectionStart -> manager.value.selection.start
-
-        Handle.SelectionEnd -> manager.value.selection.end
-    }
+    val rawTextOffset =
+        when (manager.draggingHandle) {
+            null -> return Offset.Unspecified
+            Handle.Cursor,
+            Handle.SelectionStart -> manager.value.selection.start
+            Handle.SelectionEnd -> manager.value.selection.end
+        }
     // If the text hasn't been laid out yet, don't show the magnifier.
     val textLayoutResultProxy = manager.state?.layoutResult ?: return Offset.Unspecified
     val transformedText = manager.state?.textDelegate?.text ?: return Offset.Unspecified
 
-    val textOffset = manager.offsetMapping
-        .originalToTransformed(rawTextOffset)
-        .coerceIn(0, transformedText.length)
+    val textOffset =
+        manager.offsetMapping
+            .originalToTransformed(rawTextOffset)
+            .coerceIn(0, transformedText.length)
 
     val dragX = textLayoutResultProxy.translateDecorationToInnerCoordinates(localDragPosition).x
 
@@ -1083,8 +1067,8 @@
     // It is very unlikely that this behavior would cause a flicker since magnifier immediately
     // shows up where the pointer is being dragged. The pointer needs to drag further than the half
     // of magnifier's width to hide by the following logic.
-    if (magnifierSize != IntSize.Zero &&
-        (dragX - centerX).absoluteValue > magnifierSize.width / 2
+    if (
+        magnifierSize != IntSize.Zero && (dragX - centerX).absoluteValue > magnifierSize.width / 2
     ) {
         return Offset.Unspecified
     }
diff --git a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/selection/TextPreparedSelection.kt b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/selection/TextPreparedSelection.kt
index 216af82..28114cb 100644
--- a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/selection/TextPreparedSelection.kt
+++ b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/selection/TextPreparedSelection.kt
@@ -44,15 +44,15 @@
 }
 
 /**
- * This utility class implements many selection-related operations on text (including basic
- * cursor movements and deletions) and combines them, taking into account how the text was
- * rendered. So, for example, [moveCursorToLineEnd] moves it to the visual line end.
+ * This utility class implements many selection-related operations on text (including basic cursor
+ * movements and deletions) and combines them, taking into account how the text was rendered. So,
+ * for example, [moveCursorToLineEnd] moves it to the visual line end.
  *
  * For many of these operations, it's particularly important to keep the difference between
  * selection start and selection end. In some systems, they are called "anchor" and "caret"
  * respectively. For example, for selection from scratch, after [moveCursorLeftByWord]
- * [moveCursorRight] will move the left side of the selection, but after [moveCursorRightByWord]
- * the right one.
+ * [moveCursorRight] will move the left side of the selection, but after [moveCursorRightByWord] the
+ * right one.
  *
  * To use it in scope of text fields see [TextFieldPreparedSelection]
  */
@@ -88,13 +88,9 @@
         selection = TextRange(start, end)
     }
 
-    fun selectAll() = apply {
-        setSelection(0, text.length)
-    }
+    fun selectAll() = apply { setSelection(0, text.length) }
 
-    fun deselect() = apply {
-        setCursor(selection.end)
-    }
+    fun deselect() = apply { setCursor(selection.end) }
 
     fun moveCursorLeft() = apply {
         if (isLtr()) {
@@ -112,13 +108,10 @@
         }
     }
 
-    /**
-     * If there is already a selection, collapse it to the left side. Otherwise, execute [or]
-     */
+    /** If there is already a selection, collapse it to the left side. Otherwise, execute [or] */
     fun collapseLeftOr(or: T.() -> Unit) = apply {
         if (selection.collapsed) {
-            @Suppress("UNCHECKED_CAST")
-            or(this as T)
+            @Suppress("UNCHECKED_CAST") or(this as T)
         } else {
             if (isLtr()) {
                 setCursor(selection.min)
@@ -128,13 +121,10 @@
         }
     }
 
-    /**
-     * If there is already a selection, collapse it to the right side. Otherwise, execute [or]
-     */
+    /** If there is already a selection, collapse it to the right side. Otherwise, execute [or] */
     fun collapseRightOr(or: T.() -> Unit) = apply {
         if (selection.collapsed) {
-            @Suppress("UNCHECKED_CAST")
-            or(this as T)
+            @Suppress("UNCHECKED_CAST") or(this as T)
         } else {
             if (isLtr()) {
                 setCursor(selection.max)
@@ -144,9 +134,7 @@
         }
     }
 
-    /**
-     * Returns the index of the character break preceding the end of [selection].
-     */
+    /** Returns the index of the character break preceding the end of [selection]. */
     fun getPrecedingCharacterIndex() = annotatedString.text.findPrecedingBreak(selection.end)
 
     /**
@@ -165,13 +153,9 @@
         if (next != -1) setCursor(next)
     }
 
-    fun moveCursorToHome() = apply {
-        setCursor(0)
-    }
+    fun moveCursorToHome() = apply { setCursor(0) }
 
-    fun moveCursorToEnd() = apply {
-        setCursor(text.length)
-    }
+    fun moveCursorToEnd() = apply { setCursor(text.length) }
 
     fun moveCursorLeftByWord() = apply {
         if (isLtr()) {
@@ -191,15 +175,11 @@
 
     fun getNextWordOffset(): Int? = layoutResult?.getNextWordOffsetForLayout()
 
-    private fun moveCursorNextByWord() = apply {
-        getNextWordOffset()?.let { setCursor(it) }
-    }
+    private fun moveCursorNextByWord() = apply { getNextWordOffset()?.let { setCursor(it) } }
 
     fun getPreviousWordOffset(): Int? = layoutResult?.getPrevWordOffset()
 
-    private fun moveCursorPrevByWord() = apply {
-        getPreviousWordOffset()?.let { setCursor(it) }
-    }
+    private fun moveCursorPrevByWord() = apply { getPreviousWordOffset()?.let { setCursor(it) } }
 
     fun moveCursorPrevByParagraph() = apply {
         var paragraphStart = text.findParagraphStart(selection.min)
@@ -217,25 +197,19 @@
         setCursor(paragraphEnd)
     }
 
-    fun moveCursorUpByLine() = apply(false) {
-        layoutResult?.jumpByLinesOffset(-1)?.let { setCursor(it) }
-    }
+    fun moveCursorUpByLine() =
+        apply(false) { layoutResult?.jumpByLinesOffset(-1)?.let { setCursor(it) } }
 
-    fun moveCursorDownByLine() = apply(false) {
-        layoutResult?.jumpByLinesOffset(1)?.let { setCursor(it) }
-    }
+    fun moveCursorDownByLine() =
+        apply(false) { layoutResult?.jumpByLinesOffset(1)?.let { setCursor(it) } }
 
     fun getLineStartByOffset(): Int? = layoutResult?.getLineStartByOffsetForLayout()
 
-    fun moveCursorToLineStart() = apply {
-        getLineStartByOffset()?.let { setCursor(it) }
-    }
+    fun moveCursorToLineStart() = apply { getLineStartByOffset()?.let { setCursor(it) } }
 
     fun getLineEndByOffset(): Int? = layoutResult?.getLineEndByOffsetForLayout()
 
-    fun moveCursorToLineEnd() = apply {
-        getLineEndByOffset()?.let { setCursor(it) }
-    }
+    fun moveCursorToLineEnd() = apply { getLineEndByOffset()?.let { setCursor(it) } }
 
     fun moveCursorToLineLeftSide() = apply {
         if (isLtr()) {
@@ -254,9 +228,8 @@
     }
 
     // it selects a text from the original selection start to a current selection end
-    fun selectMovement() = apply(false) {
-        selection = TextRange(originalSelection.start, selection.end)
-    }
+    fun selectMovement() =
+        apply(false) { selection = TextRange(originalSelection.start, selection.end) }
 
     private fun isLtr(): Boolean {
         val direction = layoutResult?.getParagraphDirection(transformedEndOffset())
@@ -323,17 +296,18 @@
         }
 
         val y = getLineBottom(targetLine) - 1
-        val x = state.cachedX!!.also {
-            if ((isLtr() && it >= getLineRight(targetLine)) ||
-                (!isLtr() && it <= getLineLeft(targetLine))
-            ) {
-                return getLineEnd(targetLine, true)
+        val x =
+            state.cachedX!!.also {
+                if (
+                    (isLtr() && it >= getLineRight(targetLine)) ||
+                        (!isLtr() && it <= getLineLeft(targetLine))
+                ) {
+                    return getLineEnd(targetLine, true)
+                }
             }
-        }
 
-        val newOffset = getOffsetForPosition(Offset(x, y)).let {
-            offsetMapping.transformedToOriginal(it)
-        }
+        val newOffset =
+            getOffsetForPosition(Offset(x, y)).let { offsetMapping.transformedToOriginal(it) }
 
         return newOffset
     }
@@ -350,8 +324,7 @@
         return offsetMapping.originalToTransformed(selection.max)
     }
 
-    private fun charOffset(offset: Int) =
-        offset.coerceAtMost(text.length - 1)
+    private fun charOffset(offset: Int) = offset.coerceAtMost(text.length - 1)
 
     companion object {
         /**
@@ -370,67 +343,58 @@
     layoutResult: TextLayoutResult? = null,
     offsetMapping: OffsetMapping = OffsetMapping.Identity,
     state: TextPreparedSelectionState = TextPreparedSelectionState()
-) : BaseTextPreparedSelection<TextPreparedSelection>(
-    originalText = originalText,
-    originalSelection = originalSelection,
-    layoutResult = layoutResult,
-    offsetMapping = offsetMapping,
-    state = state
-)
+) :
+    BaseTextPreparedSelection<TextPreparedSelection>(
+        originalText = originalText,
+        originalSelection = originalSelection,
+        layoutResult = layoutResult,
+        offsetMapping = offsetMapping,
+        state = state
+    )
 
 internal class TextFieldPreparedSelection(
     val currentValue: TextFieldValue,
     offsetMapping: OffsetMapping = OffsetMapping.Identity,
     val layoutResultProxy: TextLayoutResultProxy?,
     state: TextPreparedSelectionState = TextPreparedSelectionState()
-) : BaseTextPreparedSelection<TextFieldPreparedSelection>(
-    originalText = currentValue.annotatedString,
-    originalSelection = currentValue.selection,
-    offsetMapping = offsetMapping,
-    layoutResult = layoutResultProxy?.value,
-    state = state
-) {
+) :
+    BaseTextPreparedSelection<TextFieldPreparedSelection>(
+        originalText = currentValue.annotatedString,
+        originalSelection = currentValue.selection,
+        offsetMapping = offsetMapping,
+        layoutResult = layoutResultProxy?.value,
+        state = state
+    ) {
     val value
-        get() = currentValue.copy(
-            annotatedString = annotatedString,
-            selection = selection
-        )
+        get() = currentValue.copy(annotatedString = annotatedString, selection = selection)
 
     fun deleteIfSelectedOr(or: TextFieldPreparedSelection.() -> EditCommand?): List<EditCommand>? {
         return if (selection.collapsed) {
-            or(this)?.let {
-                listOf(it)
-            }
+            or(this)?.let { listOf(it) }
         } else {
-            listOf(
-                CommitTextCommand("", 0),
-                SetSelectionCommand(selection.min, selection.min)
-            )
+            listOf(CommitTextCommand("", 0), SetSelectionCommand(selection.min, selection.min))
         }
     }
 
-    fun moveCursorUpByPage() = apply(false) {
-        layoutResultProxy?.jumpByPagesOffset(-1)?.let { setCursor(it) }
-    }
+    fun moveCursorUpByPage() =
+        apply(false) { layoutResultProxy?.jumpByPagesOffset(-1)?.let { setCursor(it) } }
 
-    fun moveCursorDownByPage() = apply(false) {
-        layoutResultProxy?.jumpByPagesOffset(1)?.let { setCursor(it) }
-    }
+    fun moveCursorDownByPage() =
+        apply(false) { layoutResultProxy?.jumpByPagesOffset(1)?.let { setCursor(it) } }
 
     /**
-     * Returns a cursor position after jumping back or forth by [pagesAmount] number of pages,
-     * where `page` is the visible amount of space in the text field
+     * Returns a cursor position after jumping back or forth by [pagesAmount] number of pages, where
+     * `page` is the visible amount of space in the text field
      */
     private fun TextLayoutResultProxy.jumpByPagesOffset(pagesAmount: Int): Int {
-        val visibleInnerTextFieldRect = innerTextFieldCoordinates?.let { inner ->
-            decorationBoxCoordinates?.localBoundingBoxOf(inner)
-        } ?: Rect.Zero
+        val visibleInnerTextFieldRect =
+            innerTextFieldCoordinates?.let { inner ->
+                decorationBoxCoordinates?.localBoundingBoxOf(inner)
+            } ?: Rect.Zero
         val currentOffset = offsetMapping.originalToTransformed(currentValue.selection.end)
         val currentPos = value.getCursorRect(currentOffset)
         val x = currentPos.left
         val y = currentPos.top + visibleInnerTextFieldRect.size.height * pagesAmount
-        return offsetMapping.transformedToOriginal(
-            value.getOffsetForPosition(Offset(x, y))
-        )
+        return offsetMapping.transformedToOriginal(value.getOffsetForPosition(Offset(x, y)))
     }
 }
diff --git a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/selection/TextSelectionColors.kt b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/selection/TextSelectionColors.kt
index c9da65a..0e71487 100644
--- a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/selection/TextSelectionColors.kt
+++ b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/selection/TextSelectionColors.kt
@@ -26,19 +26,15 @@
  *
  * See [LocalTextSelectionColors] to provide new values for this throughout the hierarchy.
  *
- * @property handleColor the color used for the selection handles on either side of the
- * selection region.
- * @property backgroundColor the color used to draw the background behind the selected
- * region. This color should have alpha applied to keep the text legible - this alpha is
- * typically 0.4f (40%) but this may need to be reduced in order to meet contrast requirements
- * depending on the color used for text, selection background, and the background behind the
- * selection background.
+ * @property handleColor the color used for the selection handles on either side of the selection
+ *   region.
+ * @property backgroundColor the color used to draw the background behind the selected region. This
+ *   color should have alpha applied to keep the text legible - this alpha is typically 0.4f (40%)
+ *   but this may need to be reduced in order to meet contrast requirements depending on the color
+ *   used for text, selection background, and the background behind the selection background.
  */
 @Immutable
-class TextSelectionColors(
-    val handleColor: Color,
-    val backgroundColor: Color
-) {
+class TextSelectionColors(val handleColor: Color, val backgroundColor: Color) {
     override fun equals(other: Any?): Boolean {
         if (this === other) return true
         if (other !is TextSelectionColors) return false
@@ -62,18 +58,17 @@
 }
 
 /**
- * CompositionLocal used to change the [TextSelectionColors] used by text and text field
- * components in the hierarchy.
+ * CompositionLocal used to change the [TextSelectionColors] used by text and text field components
+ * in the hierarchy.
  */
 val LocalTextSelectionColors = compositionLocalOf { DefaultTextSelectionColors }
 
-/**
- * Default color used is the blue from the Compose logo, b/172679845 for context
- */
+/** Default color used is the blue from the Compose logo, b/172679845 for context */
 private val DefaultSelectionColor = Color(0xFF4286F4)
 
 @Stable
-private val DefaultTextSelectionColors = TextSelectionColors(
-    handleColor = DefaultSelectionColor,
-    backgroundColor = DefaultSelectionColor.copy(alpha = 0.4f)
-)
+private val DefaultTextSelectionColors =
+    TextSelectionColors(
+        handleColor = DefaultSelectionColor,
+        backgroundColor = DefaultSelectionColor.copy(alpha = 0.4f)
+    )
diff --git a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/selection/TextSelectionDelegate.kt b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/selection/TextSelectionDelegate.kt
index d05e481..6d9e3fe 100644
--- a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/selection/TextSelectionDelegate.kt
+++ b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/selection/TextSelectionDelegate.kt
@@ -28,7 +28,6 @@
  * @param offset character offset to be calculated
  * @param isStart true if called for selection start handle
  * @param areHandlesCrossed true if the selection handles are crossed
- *
  * @return the graphical position where the selection handle should be.
  */
 internal fun getSelectionHandleCoordinates(
@@ -42,12 +41,12 @@
     // This happens if maxLines is set but the offset is on a line >= maxLines.
     if (line >= textLayoutResult.lineCount) return Offset.Unspecified
 
-    val x = textLayoutResult
-        .getHorizontalPosition(offset, isStart, areHandlesCrossed)
-        .coerceIn(0f, textLayoutResult.size.width.toFloat())
-    val y = textLayoutResult
-        .getLineBottom(line)
-        .coerceIn(0f, textLayoutResult.size.height.toFloat())
+    val x =
+        textLayoutResult
+            .getHorizontalPosition(offset, isStart, areHandlesCrossed)
+            .coerceIn(0f, textLayoutResult.size.width.toFloat())
+    val y =
+        textLayoutResult.getLineBottom(line).coerceIn(0f, textLayoutResult.size.height.toFloat())
     return Offset(x, y)
 }
 
diff --git a/compose/foundation/foundation/src/desktopMain/kotlin/androidx/compose/foundation/BasicContextMenuRepresentation.desktop.kt b/compose/foundation/foundation/src/desktopMain/kotlin/androidx/compose/foundation/BasicContextMenuRepresentation.desktop.kt
index d28c709..cdc9fb2 100644
--- a/compose/foundation/foundation/src/desktopMain/kotlin/androidx/compose/foundation/BasicContextMenuRepresentation.desktop.kt
+++ b/compose/foundation/foundation/src/desktopMain/kotlin/androidx/compose/foundation/BasicContextMenuRepresentation.desktop.kt
@@ -47,17 +47,19 @@
 // https://material.io/design/interaction/states.html#hover
 // https://material.io/components/menus#specs
 
-val LightDefaultContextMenuRepresentation = DefaultContextMenuRepresentation(
-    backgroundColor = Color.White,
-    textColor = Color.Black,
-    itemHoverColor = Color.Black.copy(alpha = 0.04f)
-)
+val LightDefaultContextMenuRepresentation =
+    DefaultContextMenuRepresentation(
+        backgroundColor = Color.White,
+        textColor = Color.Black,
+        itemHoverColor = Color.Black.copy(alpha = 0.04f)
+    )
 
-val DarkDefaultContextMenuRepresentation = DefaultContextMenuRepresentation(
-    backgroundColor = Color(0xFF121212), // like surface in darkColors
-    textColor = Color.White,
-    itemHoverColor = Color.White.copy(alpha = 0.04f)
-)
+val DarkDefaultContextMenuRepresentation =
+    DefaultContextMenuRepresentation(
+        backgroundColor = Color(0xFF121212), // like surface in darkColors
+        textColor = Color.White,
+        itemHoverColor = Color.White.copy(alpha = 0.04f)
+    )
 
 class DefaultContextMenuRepresentation(
     private val backgroundColor: Color,
@@ -74,25 +76,26 @@
                 properties = PopupProperties(focusable = true)
             ) {
                 Column(
-                    modifier = Modifier
-                        .shadow(8.dp)
-                        .background(backgroundColor)
-                        .padding(vertical = 4.dp)
-                        .width(IntrinsicSize.Max)
-                        .verticalScroll(rememberScrollState())
-
+                    modifier =
+                        Modifier.shadow(8.dp)
+                            .background(backgroundColor)
+                            .padding(vertical = 4.dp)
+                            .width(IntrinsicSize.Max)
+                            .verticalScroll(rememberScrollState())
                 ) {
-                    items.distinctBy { it.label }.forEach { item ->
-                        MenuItemContent(
-                            itemHoverColor = itemHoverColor,
-                            onClick = {
-                                state.status = ContextMenuState.Status.Closed
-                                item.onClick()
+                    items
+                        .distinctBy { it.label }
+                        .forEach { item ->
+                            MenuItemContent(
+                                itemHoverColor = itemHoverColor,
+                                onClick = {
+                                    state.status = ContextMenuState.Status.Closed
+                                    item.onClick()
+                                }
+                            ) {
+                                BasicText(text = item.label, style = TextStyle(color = textColor))
                             }
-                        ) {
-                            BasicText(text = item.label, style = TextStyle(color = textColor))
                         }
-                    }
                 }
             }
         }
@@ -107,39 +110,31 @@
 ) {
     var hovered by remember { mutableStateOf(false) }
     Row(
-        modifier = Modifier
-            .clickable(
-                onClick = onClick,
-            )
-            .onHover { hovered = it }
-            .background(if (hovered) itemHoverColor else Color.Transparent)
-            .fillMaxWidth()
-            // Preferred min and max width used during the intrinsic measurement.
-            .sizeIn(
-                minWidth = 112.dp,
-                maxWidth = 280.dp,
-                minHeight = 32.dp
-            )
-            .padding(
-                PaddingValues(
-                    horizontal = 16.dp,
-                    vertical = 0.dp
+        modifier =
+            Modifier.clickable(
+                    onClick = onClick,
                 )
-            ),
+                .onHover { hovered = it }
+                .background(if (hovered) itemHoverColor else Color.Transparent)
+                .fillMaxWidth()
+                // Preferred min and max width used during the intrinsic measurement.
+                .sizeIn(minWidth = 112.dp, maxWidth = 280.dp, minHeight = 32.dp)
+                .padding(PaddingValues(horizontal = 16.dp, vertical = 0.dp)),
         verticalAlignment = Alignment.CenterVertically
     ) {
         content()
     }
 }
 
-private fun Modifier.onHover(onHover: (Boolean) -> Unit) = pointerInput(Unit) {
-    awaitPointerEventScope {
-        while (true) {
-            val event = awaitPointerEvent()
-            when (event.type) {
-                PointerEventType.Enter -> onHover(true)
-                PointerEventType.Exit -> onHover(false)
+private fun Modifier.onHover(onHover: (Boolean) -> Unit) =
+    pointerInput(Unit) {
+        awaitPointerEventScope {
+            while (true) {
+                val event = awaitPointerEvent()
+                when (event.type) {
+                    PointerEventType.Enter -> onHover(true)
+                    PointerEventType.Exit -> onHover(false)
+                }
             }
         }
     }
-}
diff --git a/compose/foundation/foundation/src/desktopMain/kotlin/androidx/compose/foundation/BasicTooltip.desktop.kt b/compose/foundation/foundation/src/desktopMain/kotlin/androidx/compose/foundation/BasicTooltip.desktop.kt
index a0abc54..0b07030 100644
--- a/compose/foundation/foundation/src/desktopMain/kotlin/androidx/compose/foundation/BasicTooltip.desktop.kt
+++ b/compose/foundation/foundation/src/desktopMain/kotlin/androidx/compose/foundation/BasicTooltip.desktop.kt
@@ -26,21 +26,21 @@
 /**
  * BasicTooltipBox that wraps a composable with a tooltip.
  *
- * Tooltip that provides a descriptive message for an anchor.
- * It can be used to call the users attention to the anchor.
+ * Tooltip that provides a descriptive message for an anchor. It can be used to call the users
+ * attention to the anchor.
  *
- * @param positionProvider [PopupPositionProvider] that will be used to place the tooltip
- * relative to the anchor content.
+ * @param positionProvider [PopupPositionProvider] that will be used to place the tooltip relative
+ *   to the anchor content.
  * @param tooltip the composable that will be used to populate the tooltip's content.
  * @param state handles the state of the tooltip's visibility.
  * @param modifier the [Modifier] to be applied to this BasicTooltipBox.
- * @param focusable [Boolean] that determines if the tooltip is focusable. When true,
- * the tooltip will consume touch events while it's shown and will have accessibility
- * focus move to the first element of the component. When false, the tooltip
- * won't consume touch events while it's shown but assistive-tech users will need
- * to swipe or drag to get to the first element of the component.
- * @param enableUserInput [Boolean] which determines if this BasicTooltipBox will handle
- * long press and mouse hover to trigger the tooltip through the state provided.
+ * @param focusable [Boolean] that determines if the tooltip is focusable. When true, the tooltip
+ *   will consume touch events while it's shown and will have accessibility focus move to the first
+ *   element of the component. When false, the tooltip won't consume touch events while it's shown
+ *   but assistive-tech users will need to swipe or drag to get to the first element of the
+ *   component.
+ * @param enableUserInput [Boolean] which determines if this BasicTooltipBox will handle long press
+ *   and mouse hover to trigger the tooltip through the state provided.
  * @param content the composable that the tooltip will anchor to.
  */
 @Composable
@@ -62,11 +62,14 @@
             Popup(
                 popupPositionProvider = positionProvider,
                 onDismissRequest = { state.dismiss() },
-                properties = PopupProperties(
-                    // TODO(b/326167778): focusable = true cannot work with mouse
-                    focusable = false
-                )
-            ) { tooltip() }
+                properties =
+                    PopupProperties(
+                        // TODO(b/326167778): focusable = true cannot work with mouse
+                        focusable = false
+                    )
+            ) {
+                tooltip()
+            }
         }
     }
 }
diff --git a/compose/foundation/foundation/src/desktopMain/kotlin/androidx/compose/foundation/ContextMenuProvider.desktop.kt b/compose/foundation/foundation/src/desktopMain/kotlin/androidx/compose/foundation/ContextMenuProvider.desktop.kt
index 814e12e..e38f648 100644
--- a/compose/foundation/foundation/src/desktopMain/kotlin/androidx/compose/foundation/ContextMenuProvider.desktop.kt
+++ b/compose/foundation/foundation/src/desktopMain/kotlin/androidx/compose/foundation/ContextMenuProvider.desktop.kt
@@ -40,7 +40,7 @@
  * Representation of menu is defined by [LocalContextMenuRepresentation]`
  *
  * @param items List of context menu items. Final context menu contains all items from descendant
- * [ContextMenuArea] and [ContextMenuDataProvider].
+ *   [ContextMenuArea] and [ContextMenuDataProvider].
  * @param state [ContextMenuState] of menu controlled by this area.
  * @param enabled If false then gesture detector is disabled.
  * @param content The content of the [ContextMenuArea].
@@ -63,56 +63,37 @@
 }
 
 /**
- * Adds items to the hierarchy of context menu items. Can be used, for example, to customize
- * context menu of text fields.
+ * Adds items to the hierarchy of context menu items. Can be used, for example, to customize context
+ * menu of text fields.
  *
  * @param items List of context menu items. Final context menu contains all items from descendant
- * [ContextMenuArea] and [ContextMenuDataProvider].
+ *   [ContextMenuArea] and [ContextMenuDataProvider].
  * @param content The content of the [ContextMenuDataProvider].
- *
  * @see [[ContextMenuArea]]
  */
 @Composable
-fun ContextMenuDataProvider(
-    items: () -> List<ContextMenuItem>,
-    content: @Composable () -> Unit
-) {
-    ContextMenuDataProvider(
-        ContextMenuData(items, LocalContextMenuData.current),
-        content
-    )
+fun ContextMenuDataProvider(items: () -> List<ContextMenuItem>, content: @Composable () -> Unit) {
+    ContextMenuDataProvider(ContextMenuData(items, LocalContextMenuData.current), content)
 }
 
 @Composable
-internal fun ContextMenuDataProvider(
-    data: ContextMenuData,
-    content: @Composable () -> Unit
-) {
-    CompositionLocalProvider(
-        LocalContextMenuData provides data
-    ) {
-        content()
-    }
+internal fun ContextMenuDataProvider(data: ContextMenuData, content: @Composable () -> Unit) {
+    CompositionLocalProvider(LocalContextMenuData provides data) { content() }
 }
 
-private val LocalContextMenuData = staticCompositionLocalOf<ContextMenuData?> {
-    null
-}
+private val LocalContextMenuData = staticCompositionLocalOf<ContextMenuData?> { null }
 
 private fun Modifier.contextMenuDetector(
     state: ContextMenuState,
     enabled: Boolean = true
 ): Modifier {
-    return if (
-        enabled && state.status == ContextMenuState.Status.Closed
-    ) {
+    return if (enabled && state.status == ContextMenuState.Status.Closed) {
         this.pointerInput(state) {
             awaitEachGesture {
                 val event = awaitEventFirstDown()
                 if (event.buttons.isSecondaryPressed) {
                     event.changes.forEach { it.consume() }
-                    state.status =
-                        ContextMenuState.Status.Open(Rect(event.changes[0].position, 0f))
+                    state.status = ContextMenuState.Status.Open(Rect(event.changes[0].position, 0f))
                 }
             }
         }
@@ -125,9 +106,7 @@
     var event: PointerEvent
     do {
         event = awaitPointerEvent()
-    } while (
-        !event.changes.fastAll { it.changedToDown() }
-    )
+    } while (!event.changes.fastAll { it.changedToDown() })
     return event
 }
 
@@ -137,10 +116,7 @@
  * @param label The text to be displayed as a context menu item.
  * @param onClick The action to be executed after click on the item.
  */
-class ContextMenuItem(
-    val label: String,
-    val onClick: () -> Unit
-) {
+class ContextMenuItem(val label: String, val onClick: () -> Unit) {
     override fun equals(other: Any?): Boolean {
         if (this === other) return true
         if (other == null || this::class != other::class) return false
@@ -168,14 +144,9 @@
  * Data container contains all [ContextMenuItem]s were defined previously in the hierarchy.
  * [ContextMenuRepresentation] uses it to display context menu.
  */
-class ContextMenuData(
-    val items: () -> List<ContextMenuItem>,
-    val next: ContextMenuData?
-) {
+class ContextMenuData(val items: () -> List<ContextMenuItem>, val next: ContextMenuData?) {
 
-    internal val allItems: List<ContextMenuItem> by lazy {
-        allItemsSeq.toList()
-    }
+    internal val allItems: List<ContextMenuItem> by lazy { allItemsSeq.toList() }
 
     internal val allItemsSeq: Sequence<ContextMenuItem>
         get() = sequence {
@@ -203,15 +174,13 @@
 }
 
 /**
- * Represents a state of context menu in [ContextMenuArea]. [status] is implemented
- * via [androidx.compose.runtime.MutableState] so it's possible to track it inside @Composable
+ * Represents a state of context menu in [ContextMenuArea]. [status] is implemented via
+ * [androidx.compose.runtime.MutableState] so it's possible to track it inside @Composable
  * functions.
  */
 class ContextMenuState {
     sealed class Status {
-        class Open(
-            val rect: Rect
-        ) : Status() {
+        class Open(val rect: Rect) : Status() {
             override fun equals(other: Any?): Boolean {
                 if (this === other) return true
                 if (other == null || this::class != other::class) return false
@@ -241,19 +210,15 @@
 /**
  * Implementations of this interface are responsible for displaying context menus. There are two
  * implementations out of the box: [LightDefaultContextMenuRepresentation] and
- * [DarkDefaultContextMenuRepresentation].
- * To change currently used representation, different value for [LocalContextMenuRepresentation]
- * could be provided.
+ * [DarkDefaultContextMenuRepresentation]. To change currently used representation, different value
+ * for [LocalContextMenuRepresentation] could be provided.
  */
 interface ContextMenuRepresentation {
-    @Composable
-    fun Representation(state: ContextMenuState, items: List<ContextMenuItem>)
+    @Composable fun Representation(state: ContextMenuState, items: List<ContextMenuItem>)
 }
 
-/**
- * Composition local that keeps [ContextMenuRepresentation] which is used by [ContextMenuArea]s.
- */
-val LocalContextMenuRepresentation:
-    ProvidableCompositionLocal<ContextMenuRepresentation> = staticCompositionLocalOf {
-    LightDefaultContextMenuRepresentation
-}
+/** Composition local that keeps [ContextMenuRepresentation] which is used by [ContextMenuArea]s. */
+val LocalContextMenuRepresentation: ProvidableCompositionLocal<ContextMenuRepresentation> =
+    staticCompositionLocalOf {
+        LightDefaultContextMenuRepresentation
+    }
diff --git a/compose/foundation/foundation/src/desktopMain/kotlin/androidx/compose/foundation/DarkTheme.desktop.kt b/compose/foundation/foundation/src/desktopMain/kotlin/androidx/compose/foundation/DarkTheme.desktop.kt
index de92935..481ab1f 100644
--- a/compose/foundation/foundation/src/desktopMain/kotlin/androidx/compose/foundation/DarkTheme.desktop.kt
+++ b/compose/foundation/foundation/src/desktopMain/kotlin/androidx/compose/foundation/DarkTheme.desktop.kt
@@ -25,15 +25,15 @@
  * This function should be used to help build responsive UIs that follow the system setting, to
  * avoid harsh contrast changes when switching between applications.
  *
- * This function returns `true` if the [Configuration.UI_MODE_NIGHT_YES] bit is set. It is
- * also possible for this bit to be [Configuration.UI_MODE_NIGHT_UNDEFINED], in which case
- * light theme is treated as the default, and this function returns `false`.
+ * This function returns `true` if the [Configuration.UI_MODE_NIGHT_YES] bit is set. It is also
+ * possible for this bit to be [Configuration.UI_MODE_NIGHT_UNDEFINED], in which case light theme is
+ * treated as the default, and this function returns `false`.
  *
  * It is also recommended to provide user accessible overrides in your application, so users can
  * choose to force an always-light or always-dark theme. To do this, you should provide the current
  * theme value in a CompositionLocal or similar to components further down your hierarchy, only
- * calling this effect once at the top level if no user override has been set. This also helps
- * avoid multiple calls to this effect, which can be expensive as it queries system configuration.
+ * calling this effect once at the top level if no user override has been set. This also helps avoid
+ * multiple calls to this effect, which can be expensive as it queries system configuration.
  *
  * For example, to draw a white rectangle when in dark theme, and a black rectangle when in light
  * theme:
diff --git a/compose/foundation/foundation/src/desktopMain/kotlin/androidx/compose/foundation/DesktopPlatform.desktop.kt b/compose/foundation/foundation/src/desktopMain/kotlin/androidx/compose/foundation/DesktopPlatform.desktop.kt
index 98ad375..15969ef 100644
--- a/compose/foundation/foundation/src/desktopMain/kotlin/androidx/compose/foundation/DesktopPlatform.desktop.kt
+++ b/compose/foundation/foundation/src/desktopMain/kotlin/androidx/compose/foundation/DesktopPlatform.desktop.kt
@@ -23,9 +23,7 @@
     Unknown;
 
     companion object {
-        /**
-         * Identify OS on which the application is currently running.
-         */
+        /** Identify OS on which the application is currently running. */
         val Current: DesktopPlatform by lazy {
             val name = System.getProperty("os.name")
             when {
diff --git a/compose/foundation/foundation/src/desktopMain/kotlin/androidx/compose/foundation/Scrollbar.desktop.kt b/compose/foundation/foundation/src/desktopMain/kotlin/androidx/compose/foundation/Scrollbar.desktop.kt
index 3347f907..95b8e38 100644
--- a/compose/foundation/foundation/src/desktopMain/kotlin/androidx/compose/foundation/Scrollbar.desktop.kt
+++ b/compose/foundation/foundation/src/desktopMain/kotlin/androidx/compose/foundation/Scrollbar.desktop.kt
@@ -66,15 +66,14 @@
 import kotlinx.coroutines.runBlocking
 
 /**
- * [CompositionLocal] used to pass [ScrollbarStyle] down the tree.
- * This value is typically set in some "Theme" composable function
- * (DesktopTheme, MaterialTheme)
+ * [CompositionLocal] used to pass [ScrollbarStyle] down the tree. This value is typically set in
+ * some "Theme" composable function (DesktopTheme, MaterialTheme)
  */
 val LocalScrollbarStyle = staticCompositionLocalOf { defaultScrollbarStyle() }
 
 /**
- * Defines visual style of scrollbars (thickness, shapes, colors, etc).
- * Can be passed as a parameter of scrollbar through [LocalScrollbarStyle]
+ * Defines visual style of scrollbars (thickness, shapes, colors, etc). Can be passed as a parameter
+ * of scrollbar through [LocalScrollbarStyle]
  */
 @Immutable
 data class ScrollbarStyle(
@@ -86,32 +85,29 @@
     val hoverColor: Color
 )
 
-/**
- * Simple default [ScrollbarStyle] without applying MaterialTheme.
- */
-fun defaultScrollbarStyle() = ScrollbarStyle(
-    minimalHeight = 16.dp,
-    thickness = 8.dp,
-    shape = RoundedCornerShape(4.dp),
-    hoverDurationMillis = 300,
-    unhoverColor = Color.Black.copy(alpha = 0.12f),
-    hoverColor = Color.Black.copy(alpha = 0.50f)
-)
+/** Simple default [ScrollbarStyle] without applying MaterialTheme. */
+fun defaultScrollbarStyle() =
+    ScrollbarStyle(
+        minimalHeight = 16.dp,
+        thickness = 8.dp,
+        shape = RoundedCornerShape(4.dp),
+        hoverDurationMillis = 300,
+        unhoverColor = Color.Black.copy(alpha = 0.12f),
+        hoverColor = Color.Black.copy(alpha = 0.50f)
+    )
 
 /**
- * Vertical scrollbar that can be attached to some scrollable
- * component (ScrollableColumn, LazyColumn) and share common state with it.
+ * Vertical scrollbar that can be attached to some scrollable component (ScrollableColumn,
+ * LazyColumn) and share common state with it.
  *
  * Can be placed independently.
  *
- * Example:
- *     val state = rememberScrollState(0f)
+ * Example: val state = rememberScrollState(0f)
  *
  *     Box(Modifier.fillMaxSize()) {
  *         Box(modifier = Modifier.verticalScroll(state)) {
  *             ...
  *         }
- *
  *         VerticalScrollbar(
  *             Modifier.align(Alignment.CenterEnd).fillMaxHeight(),
  *             rememberScrollbarAdapter(state)
@@ -120,13 +116,12 @@
  *
  * @param adapter [ScrollbarAdapter] that will be used to communicate with scrollable component
  * @param modifier the modifier to apply to this layout
- * @param reverseLayout reverse the direction of scrolling and layout, when `true`
- * and [LazyListState.firstVisibleItemIndex] == 0 then scrollbar
- * will be at the bottom of the container.
- * It is usually used in pair with `LazyColumn(reverseLayout = true)`
+ * @param reverseLayout reverse the direction of scrolling and layout, when `true` and
+ *   [LazyListState.firstVisibleItemIndex] == 0 then scrollbar will be at the bottom of the
+ *   container. It is usually used in pair with `LazyColumn(reverseLayout = true)`
  * @param style [ScrollbarStyle] to define visual style of scrollbar
  * @param interactionSource optional [MutableInteractionSource] that will be used to dispatch
- * [DragInteraction.Start] when this Scrollbar is being dragged.
+ *   [DragInteraction.Start] when this Scrollbar is being dragged.
  */
 @Composable
 fun VerticalScrollbar(
@@ -135,29 +130,20 @@
     reverseLayout: Boolean = false,
     style: ScrollbarStyle = LocalScrollbarStyle.current,
     interactionSource: MutableInteractionSource? = null
-) = Scrollbar(
-    adapter,
-    modifier,
-    reverseLayout,
-    style,
-    interactionSource,
-    isVertical = true
-)
+) = Scrollbar(adapter, modifier, reverseLayout, style, interactionSource, isVertical = true)
 
 /**
- * Horizontal scrollbar that can be attached to some scrollable
- * component (Modifier.verticalScroll(), LazyRow) and share common state with it.
+ * Horizontal scrollbar that can be attached to some scrollable component
+ * (Modifier.verticalScroll(), LazyRow) and share common state with it.
  *
  * Can be placed independently.
  *
- * Example:
- *     val state = rememberScrollState(0f)
+ * Example: val state = rememberScrollState(0f)
  *
  *     Box(Modifier.fillMaxSize()) {
  *         Box(modifier = Modifier.verticalScroll(state)) {
  *             ...
  *         }
- *
  *         HorizontalScrollbar(
  *             Modifier.align(Alignment.BottomCenter).fillMaxWidth(),
  *             rememberScrollbarAdapter(state)
@@ -166,13 +152,12 @@
  *
  * @param adapter [ScrollbarAdapter] that will be used to communicate with scrollable component
  * @param modifier the modifier to apply to this layout
- * @param reverseLayout reverse the direction of scrolling and layout, when `true`
- * and [LazyListState.firstVisibleItemIndex] == 0 then scrollbar
- * will be at the end of the container.
- * It is usually used in pair with `LazyRow(reverseLayout = true)`
+ * @param reverseLayout reverse the direction of scrolling and layout, when `true` and
+ *   [LazyListState.firstVisibleItemIndex] == 0 then scrollbar will be at the end of the container.
+ *   It is usually used in pair with `LazyRow(reverseLayout = true)`
  * @param style [ScrollbarStyle] to define visual style of scrollbar
  * @param interactionSource optional [MutableInteractionSource] that will be used to dispatch
- * [DragInteraction.Start] when this Scrollbar is being dragged.
+ *   [DragInteraction.Start] when this Scrollbar is being dragged.
  */
 @Composable
 fun HorizontalScrollbar(
@@ -181,14 +166,15 @@
     reverseLayout: Boolean = false,
     style: ScrollbarStyle = LocalScrollbarStyle.current,
     interactionSource: MutableInteractionSource? = null
-) = Scrollbar(
-    adapter,
-    modifier,
-    if (LocalLayoutDirection.current == LayoutDirection.Rtl) !reverseLayout else reverseLayout,
-    style,
-    interactionSource,
-    isVertical = false
-)
+) =
+    Scrollbar(
+        adapter,
+        modifier,
+        if (LocalLayoutDirection.current == LayoutDirection.Rtl) !reverseLayout else reverseLayout,
+        style,
+        interactionSource,
+        isVertical = false
+    )
 
 // TODO(demin): do we need to stop dragging if cursor is beyond constraints?
 @Composable
@@ -199,72 +185,73 @@
     style: ScrollbarStyle,
     interactionSource: MutableInteractionSource?,
     isVertical: Boolean
-) = with(LocalDensity.current) {
-    @Suppress("NAME_SHADOWING")
-    val interactionSource = interactionSource ?: remember { MutableInteractionSource() }
-    val dragInteraction = remember { mutableStateOf<DragInteraction.Start?>(null) }
-    DisposableEffect(interactionSource) {
-        onDispose {
-            dragInteraction.value?.let { interaction ->
-                interactionSource.tryEmit(DragInteraction.Cancel(interaction))
-                dragInteraction.value = null
+) =
+    with(LocalDensity.current) {
+        @Suppress("NAME_SHADOWING")
+        val interactionSource = interactionSource ?: remember { MutableInteractionSource() }
+        val dragInteraction = remember { mutableStateOf<DragInteraction.Start?>(null) }
+        DisposableEffect(interactionSource) {
+            onDispose {
+                dragInteraction.value?.let { interaction ->
+                    interactionSource.tryEmit(DragInteraction.Cancel(interaction))
+                    dragInteraction.value = null
+                }
             }
         }
-    }
 
-    var containerSize by remember { mutableStateOf(0) }
-    val isHovered by interactionSource.collectIsHoveredAsState()
+        var containerSize by remember { mutableStateOf(0) }
+        val isHovered by interactionSource.collectIsHoveredAsState()
 
-    val isHighlighted by remember {
-        derivedStateOf {
-            isHovered || dragInteraction.value is DragInteraction.Start
+        val isHighlighted by remember {
+            derivedStateOf { isHovered || dragInteraction.value is DragInteraction.Start }
         }
-    }
 
-    val minimalHeight = style.minimalHeight.toPx()
-    val sliderAdapter = remember(adapter, containerSize, minimalHeight, reverseLayout) {
-        SliderAdapter(adapter, containerSize, minimalHeight, reverseLayout)
-    }
+        val minimalHeight = style.minimalHeight.toPx()
+        val sliderAdapter =
+            remember(adapter, containerSize, minimalHeight, reverseLayout) {
+                SliderAdapter(adapter, containerSize, minimalHeight, reverseLayout)
+            }
 
-    val scrollThickness = style.thickness.roundToPx()
-    val measurePolicy = if (isVertical) {
-        remember(sliderAdapter, scrollThickness) {
-            verticalMeasurePolicy(sliderAdapter, { containerSize = it }, scrollThickness)
-        }
-    } else {
-        remember(sliderAdapter, scrollThickness) {
-            horizontalMeasurePolicy(sliderAdapter, { containerSize = it }, scrollThickness)
-        }
-    }
+        val scrollThickness = style.thickness.roundToPx()
+        val measurePolicy =
+            if (isVertical) {
+                remember(sliderAdapter, scrollThickness) {
+                    verticalMeasurePolicy(sliderAdapter, { containerSize = it }, scrollThickness)
+                }
+            } else {
+                remember(sliderAdapter, scrollThickness) {
+                    horizontalMeasurePolicy(sliderAdapter, { containerSize = it }, scrollThickness)
+                }
+            }
 
-    val color by animateColorAsState(
-        if (isHighlighted) style.hoverColor else style.unhoverColor,
-        animationSpec = TweenSpec(durationMillis = style.hoverDurationMillis)
-    )
-
-    val isVisible = sliderAdapter.size < containerSize
-
-    Layout(
-        {
-            Box(
-                Modifier
-                    .background(if (isVisible) color else Color.Transparent, style.shape)
-                    .scrollbarDrag(
-                        interactionSource = interactionSource,
-                        draggedInteraction = dragInteraction,
-                        onDelta = { offset ->
-                            sliderAdapter.rawPosition += if (isVertical) offset.y else offset.x
-                        },
-                        onFinished = { sliderAdapter.rawPosition = sliderAdapter.position }
-                    )
+        val color by
+            animateColorAsState(
+                if (isHighlighted) style.hoverColor else style.unhoverColor,
+                animationSpec = TweenSpec(durationMillis = style.hoverDurationMillis)
             )
-        },
-        modifier
-            .hoverable(interactionSource = interactionSource)
-            .scrollOnPressOutsideSlider(isVertical, sliderAdapter, adapter, containerSize),
-        measurePolicy
-    )
-}
+
+        val isVisible = sliderAdapter.size < containerSize
+
+        Layout(
+            {
+                Box(
+                    Modifier.background(if (isVisible) color else Color.Transparent, style.shape)
+                        .scrollbarDrag(
+                            interactionSource = interactionSource,
+                            draggedInteraction = dragInteraction,
+                            onDelta = { offset ->
+                                sliderAdapter.rawPosition += if (isVertical) offset.y else offset.x
+                            },
+                            onFinished = { sliderAdapter.rawPosition = sliderAdapter.position }
+                        )
+                )
+            },
+            modifier
+                .hoverable(interactionSource = interactionSource)
+                .scrollOnPressOutsideSlider(isVertical, sliderAdapter, adapter, containerSize),
+            measurePolicy
+        )
+    }
 
 private fun Modifier.scrollbarDrag(
     interactionSource: MutableInteractionSource,
@@ -282,15 +269,17 @@
             val interaction = DragInteraction.Start()
             currentInteractionSource.tryEmit(interaction)
             currentDraggedInteraction.value = interaction
-            val isSuccess = drag(down.id) { change ->
-                currentOnDelta.invoke(change.positionChange())
-                change.consume()
-            }
-            val finishInteraction = if (isSuccess) {
-                DragInteraction.Stop(interaction)
-            } else {
-                DragInteraction.Cancel(interaction)
-            }
+            val isSuccess =
+                drag(down.id) { change ->
+                    currentOnDelta.invoke(change.positionChange())
+                    change.consume()
+                }
+            val finishInteraction =
+                if (isSuccess) {
+                    DragInteraction.Stop(interaction)
+                } else {
+                    DragInteraction.Cancel(interaction)
+                }
             currentInteractionSource.tryEmit(finishInteraction)
             currentDraggedInteraction.value = null
             currentOnFinished.invoke()
@@ -345,11 +334,8 @@
  * [scrollState]
  */
 @Composable
-fun rememberScrollbarAdapter(
-    scrollState: ScrollState
-): ScrollbarAdapter = remember(scrollState) {
-    ScrollbarAdapter(scrollState)
-}
+fun rememberScrollbarAdapter(scrollState: ScrollState): ScrollbarAdapter =
+    remember(scrollState) { ScrollbarAdapter(scrollState) }
 
 /**
  * Create and [remember] [ScrollbarAdapter] for lazy scrollable container and current instance of
@@ -359,9 +345,7 @@
 fun rememberScrollbarAdapter(
     scrollState: LazyListState,
 ): ScrollbarAdapter {
-    return remember(scrollState) {
-        ScrollbarAdapter(scrollState)
-    }
+    return remember(scrollState) { ScrollbarAdapter(scrollState) }
 }
 
 /**
@@ -369,35 +353,30 @@
  *
  * [scrollState] is instance of [ScrollState] which is used by scrollable component
  *
- * Example:
- *     val state = rememberScrollState(0f)
+ * Example: val state = rememberScrollState(0f)
  *
  *     Box(Modifier.fillMaxSize()) {
  *         Box(modifier = Modifier.verticalScroll(state)) {
  *             ...
  *         }
- *
  *         VerticalScrollbar(
  *             Modifier.align(Alignment.CenterEnd).fillMaxHeight(),
  *             rememberScrollbarAdapter(state)
  *         )
  *     }
  */
-fun ScrollbarAdapter(
-    scrollState: ScrollState
-): ScrollbarAdapter = ScrollableScrollbarAdapter(scrollState)
+fun ScrollbarAdapter(scrollState: ScrollState): ScrollbarAdapter =
+    ScrollableScrollbarAdapter(scrollState)
 
-private class ScrollableScrollbarAdapter(
-    private val scrollState: ScrollState
-) : ScrollbarAdapter {
-    override val scrollOffset: Float get() = scrollState.value.toFloat()
+private class ScrollableScrollbarAdapter(private val scrollState: ScrollState) : ScrollbarAdapter {
+    override val scrollOffset: Float
+        get() = scrollState.value.toFloat()
 
     override suspend fun scrollTo(containerSize: Int, scrollOffset: Float) {
         scrollState.scrollTo(scrollOffset.roundToInt())
     }
 
-    override fun maxScrollOffset(containerSize: Int) =
-        scrollState.maxValue.toFloat()
+    override fun maxScrollOffset(containerSize: Int) = scrollState.maxValue.toFloat()
 }
 
 /**
@@ -407,32 +386,25 @@
  *
  * Scrollbar size and position will be dynamically changed on the current visible content.
  *
- * Example:
- *     Box(Modifier.fillMaxSize()) {
- *         val state = rememberLazyListState()
+ * Example: Box(Modifier.fillMaxSize()) { val state = rememberLazyListState()
  *
  *         LazyColumn(state = state) {
  *             ...
  *         }
- *
  *         VerticalScrollbar(
  *             Modifier.align(Alignment.CenterEnd),
  *             rememberScrollbarAdapter(state)
  *         )
  *     }
  */
-fun ScrollbarAdapter(
-    scrollState: LazyListState
-): ScrollbarAdapter = LazyScrollbarAdapter(
-    scrollState
-)
+fun ScrollbarAdapter(scrollState: LazyListState): ScrollbarAdapter =
+    LazyScrollbarAdapter(scrollState)
 
-private class LazyScrollbarAdapter(
-    private val scrollState: LazyListState
-) : ScrollbarAdapter {
+private class LazyScrollbarAdapter(private val scrollState: LazyListState) : ScrollbarAdapter {
     override val scrollOffset: Float
-        get() = scrollState.firstVisibleItemIndex * averageItemSize +
-            scrollState.firstVisibleItemScrollOffset
+        get() =
+            scrollState.firstVisibleItemIndex * averageItemSize +
+                scrollState.firstVisibleItemScrollOffset
 
     override suspend fun scrollTo(containerSize: Int, scrollOffset: Float) {
         val distance = scrollOffset - this@LazyScrollbarAdapter.scrollOffset
@@ -452,24 +424,23 @@
     private suspend fun snapTo(containerSize: Int, scrollOffset: Float) {
         // In case of very big values, we can catch an overflow, so convert values to double and
         // coerce them
-//        val averageItemSize = 26.000002f
-//        val scrollOffsetCoerced = 2.54490608E8.toFloat()
-//        val index = (scrollOffsetCoerced / averageItemSize).toInt() // 9788100
-//        val offset = (scrollOffsetCoerced - index * averageItemSize) // -16.0
-//        println(offset)
+        //        val averageItemSize = 26.000002f
+        //        val scrollOffsetCoerced = 2.54490608E8.toFloat()
+        //        val index = (scrollOffsetCoerced / averageItemSize).toInt() // 9788100
+        //        val offset = (scrollOffsetCoerced - index * averageItemSize) // -16.0
+        //        println(offset)
 
         val maximumValue = maxScrollOffset(containerSize).toDouble()
         val scrollOffsetCoerced = scrollOffset.toDouble().coerceIn(0.0, maximumValue)
         val averageItemSize = averageItemSize.toDouble()
 
-        val index = (scrollOffsetCoerced / averageItemSize)
-            .toInt()
-            .coerceAtLeast(0)
-            .coerceAtMost(itemCount - 1)
+        val index =
+            (scrollOffsetCoerced / averageItemSize)
+                .toInt()
+                .coerceAtLeast(0)
+                .coerceAtMost(itemCount - 1)
 
-        val offset = (scrollOffsetCoerced - index * averageItemSize)
-            .toInt()
-            .coerceAtLeast(0)
+        val offset = (scrollOffsetCoerced - index * averageItemSize).toInt().coerceAtLeast(0)
 
         scrollState.scrollToItem(index = index, scrollOffset = offset)
     }
@@ -477,44 +448,37 @@
     override fun maxScrollOffset(containerSize: Int) =
         (averageItemSize * itemCount - containerSize).coerceAtLeast(0f)
 
-    private val itemCount get() = scrollState.layoutInfo.totalItemsCount
+    private val itemCount
+        get() = scrollState.layoutInfo.totalItemsCount
 
     private val averageItemSize by derivedStateOf {
-        scrollState
-            .layoutInfo
-            .visibleItemsInfo
-            .asSequence()
-            .map { it.size }
-            .average()
-            .toFloat()
+        scrollState.layoutInfo.visibleItemsInfo.asSequence().map { it.size }.average().toFloat()
     }
 }
 
-/**
- * Defines how to scroll the scrollable component
- */
+/** Defines how to scroll the scrollable component */
 interface ScrollbarAdapter {
     /**
-     * Scroll offset of the content inside the scrollable component.
-     * Offset "100" means that the content is scrolled by 100 pixels from the start.
+     * Scroll offset of the content inside the scrollable component. Offset "100" means that the
+     * content is scrolled by 100 pixels from the start.
      */
     val scrollOffset: Float
 
     /**
      * Instantly jump to [scrollOffset] in pixels
      *
-     * @param containerSize size of the scrollable container
-     *  (for example, it is height of ScrollableColumn if we use VerticalScrollbar)
-     * @param scrollOffset target value in pixels to jump to,
-     *  value will be coerced to 0..maxScrollOffset
+     * @param containerSize size of the scrollable container (for example, it is height of
+     *   ScrollableColumn if we use VerticalScrollbar)
+     * @param scrollOffset target value in pixels to jump to, value will be coerced to
+     *   0..maxScrollOffset
      */
     suspend fun scrollTo(containerSize: Int, scrollOffset: Float)
 
     /**
      * Maximum scroll offset of the content inside the scrollable component
      *
-     * @param containerSize size of the scrollable component
-     *  (for example, it is height of ScrollableColumn if we use VerticalScrollbar)
+     * @param containerSize size of the scrollable component (for example, it is height of
+     *   ScrollableColumn if we use VerticalScrollbar)
      */
     fun maxScrollOffset(containerSize: Int): Float
 }
@@ -525,13 +489,17 @@
     val minHeight: Float,
     val reverseLayout: Boolean
 ) {
-    private val contentSize get() = adapter.maxScrollOffset(containerSize) + containerSize
-    private val visiblePart get() = containerSize.toFloat() / contentSize
+    private val contentSize
+        get() = adapter.maxScrollOffset(containerSize) + containerSize
+
+    private val visiblePart
+        get() = containerSize.toFloat() / contentSize
 
     val size
-        get() = (containerSize * visiblePart)
-            .coerceAtLeast(minHeight)
-            .coerceAtMost(containerSize.toFloat())
+        get() =
+            (containerSize * visiblePart)
+                .coerceAtLeast(minHeight)
+                .coerceAtMost(containerSize.toFloat())
 
     private val scrollScale: Float
         get() {
@@ -540,40 +508,34 @@
             return if (extraContentSpace == 0f) 1f else extraScrollbarSpace / extraContentSpace
         }
 
-    /**
-     * A position with cumulative offset, may be out of the container when dragging
-     */
+    /** A position with cumulative offset, may be out of the container when dragging */
     var rawPosition: Float = position
         set(value) {
             field = value
             position = value
         }
 
-    /**
-     * Actual scroll of content regarding slider layout
-     */
+    /** Actual scroll of content regarding slider layout */
     private var scrollPosition: Float
         get() = scrollScale * adapter.scrollOffset
         set(value) {
-            runBlocking {
-                adapter.scrollTo(containerSize, value / scrollScale)
-            }
+            runBlocking { adapter.scrollTo(containerSize, value / scrollScale) }
         }
 
-    /**
-     * Actual position of a thumb within slider container
-     */
+    /** Actual position of a thumb within slider container */
     var position: Float
         get() = if (reverseLayout) containerSize - size - scrollPosition else scrollPosition
         set(value) {
-            scrollPosition = if (reverseLayout) {
-                containerSize - size - value
-            } else {
-                value
-            }
+            scrollPosition =
+                if (reverseLayout) {
+                    containerSize - size - value
+                } else {
+                    value
+                }
         }
 
-    val bounds get() = position..position + size
+    val bounds
+        get() = position..position + size
 }
 
 private fun verticalMeasurePolicy(
@@ -583,12 +545,10 @@
 ) = MeasurePolicy { measurables, constraints ->
     setContainerSize(constraints.maxHeight)
     val height = sliderAdapter.size.toInt()
-    val placeable = measurables.first().measure(
-        Constraints.fixed(
-            constraints.constrainWidth(scrollThickness),
-            height
-        )
-    )
+    val placeable =
+        measurables
+            .first()
+            .measure(Constraints.fixed(constraints.constrainWidth(scrollThickness), height))
     layout(placeable.width, constraints.maxHeight) {
         placeable.place(0, sliderAdapter.position.toInt())
     }
@@ -601,19 +561,17 @@
 ) = MeasurePolicy { measurables, constraints ->
     setContainerSize(constraints.maxWidth)
     val width = sliderAdapter.size.toInt()
-    val placeable = measurables.first().measure(
-        Constraints.fixed(
-            width,
-            constraints.constrainHeight(scrollThickness)
-        )
-    )
+    val placeable =
+        measurables
+            .first()
+            .measure(Constraints.fixed(width, constraints.constrainHeight(scrollThickness)))
     layout(constraints.maxWidth, placeable.height) {
         placeable.place(sliderAdapter.position.toInt(), 0)
     }
 }
 
 /**
- * The time that must elapse before a tap gesture sends onTapDown, if there's
- * any doubt that the gesture is a tap.
+ * The time that must elapse before a tap gesture sends onTapDown, if there's any doubt that the
+ * gesture is a tap.
  */
 private const val PressTimeoutMillis: Long = 100L
diff --git a/compose/foundation/foundation/src/desktopMain/kotlin/androidx/compose/foundation/TooltipArea.desktop.kt b/compose/foundation/foundation/src/desktopMain/kotlin/androidx/compose/foundation/TooltipArea.desktop.kt
index 9fa6d90..542ac91 100644
--- a/compose/foundation/foundation/src/desktopMain/kotlin/androidx/compose/foundation/TooltipArea.desktop.kt
+++ b/compose/foundation/foundation/src/desktopMain/kotlin/androidx/compose/foundation/TooltipArea.desktop.kt
@@ -59,9 +59,7 @@
 @Composable
 @Deprecated(
     "Use TooltipArea",
-    replaceWith = ReplaceWith(
-        "TooltipArea(tooltip, modifier, delay, tooltipPlacement, content)"
-    )
+    replaceWith = ReplaceWith("TooltipArea(tooltip, modifier, delay, tooltipPlacement, content)")
 )
 @Suppress("UNUSED_PARAMETER")
 fun BoxWithTooltip(
@@ -70,13 +68,10 @@
     contentAlignment: Alignment = Alignment.TopStart,
     propagateMinConstraints: Boolean = false,
     delay: Int = 500,
-    tooltipPlacement: TooltipPlacement = TooltipPlacement.CursorPoint(
-        offset = DpOffset(0.dp, 16.dp)
-    ),
+    tooltipPlacement: TooltipPlacement =
+        TooltipPlacement.CursorPoint(offset = DpOffset(0.dp, 16.dp)),
     content: @Composable () -> Unit
-) = TooltipArea(
-    tooltip, modifier, delay, tooltipPlacement, content
-)
+) = TooltipArea(tooltip, modifier, delay, tooltipPlacement, content)
 
 /**
  * Sets the tooltip for an element.
@@ -93,9 +88,8 @@
     tooltip: @Composable () -> Unit,
     modifier: Modifier = Modifier,
     delayMillis: Int = 500,
-    tooltipPlacement: TooltipPlacement = TooltipPlacement.CursorPoint(
-        offset = DpOffset(0.dp, 16.dp)
-    ),
+    tooltipPlacement: TooltipPlacement =
+        TooltipPlacement.CursorPoint(offset = DpOffset(0.dp, 16.dp)),
     content: @Composable () -> Unit
 ) {
     val mousePosition = remember { mutableStateOf(IntOffset.Zero) }
@@ -106,10 +100,11 @@
 
     fun startShowing() {
         job?.cancel()
-        job = scope.launch {
-            delay(delayMillis.toLong())
-            state.show()
-        }
+        job =
+            scope.launch {
+                delay(delayMillis.toLong())
+                state.show()
+            }
     }
 
     fun hide() {
@@ -120,47 +115,42 @@
     BasicTooltipBox(
         positionProvider = tooltipPlacement.positionProvider(),
         tooltip = tooltip,
-        modifier = modifier
-            .onGloballyPositioned { coordinates ->
-                val size = coordinates.size
-                val position = IntOffset(
-                    coordinates.positionInWindow().x.toInt(),
-                    coordinates.positionInWindow().y.toInt()
-                )
-                parentBounds = IntRect(position, size)
-            }
-            /**
-             * TODO: b/296850580 Figure out touch input story for desktop
-             */
-            .pointerInput(Unit) {
-                awaitPointerEventScope {
-                    while (true) {
-                        val event = awaitPointerEvent()
-                        val position = event.changes.first().position
-                        when (event.type) {
-                            PointerEventType.Move -> {
-                                mousePosition.value = IntOffset(
-                                    position.x.toInt() + parentBounds.left,
-                                    position.y.toInt() + parentBounds.top
-                                )
-                            }
-
-                            PointerEventType.Enter -> {
-                                startShowing()
-                            }
-
-                            PointerEventType.Exit -> {
-                                hide()
+        modifier =
+            modifier
+                .onGloballyPositioned { coordinates ->
+                    val size = coordinates.size
+                    val position =
+                        IntOffset(
+                            coordinates.positionInWindow().x.toInt(),
+                            coordinates.positionInWindow().y.toInt()
+                        )
+                    parentBounds = IntRect(position, size)
+                }
+                /** TODO: b/296850580 Figure out touch input story for desktop */
+                .pointerInput(Unit) {
+                    awaitPointerEventScope {
+                        while (true) {
+                            val event = awaitPointerEvent()
+                            val position = event.changes.first().position
+                            when (event.type) {
+                                PointerEventType.Move -> {
+                                    mousePosition.value =
+                                        IntOffset(
+                                            position.x.toInt() + parentBounds.left,
+                                            position.y.toInt() + parentBounds.top
+                                        )
+                                }
+                                PointerEventType.Enter -> {
+                                    startShowing()
+                                }
+                                PointerEventType.Exit -> {
+                                    hide()
+                                }
                             }
                         }
                     }
                 }
-            }
-            .pointerInput(Unit) {
-                detectDown {
-                    hide()
-                }
-            },
+                .pointerInput(Unit) { detectDown { hide() } },
         focusable = false,
         enableUserInput = true,
         state = state,
@@ -180,24 +170,20 @@
     }
 }
 
-/**
- * An interface for providing a [PopupPositionProvider] for the tooltip.
- */
+/** An interface for providing a [PopupPositionProvider] for the tooltip. */
 @ExperimentalFoundationApi
 interface TooltipPlacement {
-    /**
-     * Returns [PopupPositionProvider] implementation.
-     */
-    @Composable
-    fun positionProvider(): PopupPositionProvider
+    /** Returns [PopupPositionProvider] implementation. */
+    @Composable fun positionProvider(): PopupPositionProvider
 
     /**
-     * [TooltipPlacement] implementation for providing a [PopupPositionProvider] that calculates
-     * the position of the popup relative to the current mouse cursor position.
+     * [TooltipPlacement] implementation for providing a [PopupPositionProvider] that calculates the
+     * position of the popup relative to the current mouse cursor position.
      *
      * @param offset [DpOffset] to be added to the position of the popup.
      * @param alignment The alignment of the popup relative to the current cursor position.
-     * @param windowMargin Defines the area within the window that limits the placement of the popup.
+     * @param windowMargin Defines the area within the window that limits the placement of the
+     *   popup.
      */
     @ExperimentalFoundationApi
     class CursorPoint(
@@ -206,16 +192,13 @@
         private val windowMargin: Dp = 4.dp
     ) : TooltipPlacement {
         @Composable
-        override fun positionProvider() = rememberCursorPositionProvider(
-            offset,
-            alignment,
-            windowMargin
-        )
+        override fun positionProvider() =
+            rememberCursorPositionProvider(offset, alignment, windowMargin)
     }
 
     /**
-     * [TooltipPlacement] implementation for providing a [PopupPositionProvider] that calculates
-     * the position of the popup relative to the current component bounds.
+     * [TooltipPlacement] implementation for providing a [PopupPositionProvider] that calculates the
+     * position of the popup relative to the current component bounds.
      *
      * @param anchor The anchor point relative to the current component bounds.
      * @param alignment The alignment of the popup relative to the [anchor] point.
@@ -228,10 +211,7 @@
         private val offset: DpOffset = DpOffset.Zero
     ) : TooltipPlacement {
         @Composable
-        override fun positionProvider() = rememberComponentRectPositionProvider(
-            anchor,
-            alignment,
-            offset
-        )
+        override fun positionProvider() =
+            rememberComponentRectPositionProvider(anchor, alignment, offset)
     }
 }
diff --git a/compose/foundation/foundation/src/desktopMain/kotlin/androidx/compose/foundation/content/MediaType.desktop.kt b/compose/foundation/foundation/src/desktopMain/kotlin/androidx/compose/foundation/content/MediaType.desktop.kt
index 2e7a1e3..3f53af5 100644
--- a/compose/foundation/foundation/src/desktopMain/kotlin/androidx/compose/foundation/content/MediaType.desktop.kt
+++ b/compose/foundation/foundation/src/desktopMain/kotlin/androidx/compose/foundation/content/MediaType.desktop.kt
@@ -50,8 +50,6 @@
     }
 
     override fun toString(): String {
-        return "MediaType(" +
-            "dataFlavor=$dataFlavor, " +
-            "representation='$representation')"
+        return "MediaType(" + "dataFlavor=$dataFlavor, " + "representation='$representation')"
     }
 }
diff --git a/compose/foundation/foundation/src/desktopMain/kotlin/androidx/compose/foundation/content/TransferableContent.desktop.kt b/compose/foundation/foundation/src/desktopMain/kotlin/androidx/compose/foundation/content/TransferableContent.desktop.kt
index 4ef16ff..4ace256 100644
--- a/compose/foundation/foundation/src/desktopMain/kotlin/androidx/compose/foundation/content/TransferableContent.desktop.kt
+++ b/compose/foundation/foundation/src/desktopMain/kotlin/androidx/compose/foundation/content/TransferableContent.desktop.kt
@@ -22,9 +22,7 @@
 import java.awt.datatransfer.Transferable
 
 @ExperimentalFoundationApi
-actual class PlatformTransferableContent internal constructor(
-    val transferable: Transferable
-)
+actual class PlatformTransferableContent internal constructor(val transferable: Transferable)
 
 @ExperimentalFoundationApi
 actual fun TransferableContent.hasMediaType(mediaType: MediaType): Boolean {
diff --git a/compose/foundation/foundation/src/desktopMain/kotlin/androidx/compose/foundation/content/internal/DragAndDropRequestPermission.desktop.kt b/compose/foundation/foundation/src/desktopMain/kotlin/androidx/compose/foundation/content/internal/DragAndDropRequestPermission.desktop.kt
index 6190bf233..3eb9489 100644
--- a/compose/foundation/foundation/src/desktopMain/kotlin/androidx/compose/foundation/content/internal/DragAndDropRequestPermission.desktop.kt
+++ b/compose/foundation/foundation/src/desktopMain/kotlin/androidx/compose/foundation/content/internal/DragAndDropRequestPermission.desktop.kt
@@ -19,8 +19,6 @@
 import androidx.compose.ui.draganddrop.DragAndDropEvent
 import androidx.compose.ui.node.DelegatableNode
 
-internal actual fun DelegatableNode.dragAndDropRequestPermission(
-    event: DragAndDropEvent
-) {
+internal actual fun DelegatableNode.dragAndDropRequestPermission(event: DragAndDropEvent) {
     /* no-op */
 }
diff --git a/compose/foundation/foundation/src/desktopMain/kotlin/androidx/compose/foundation/gestures/BringIntoViewSpec.desktop.kt b/compose/foundation/foundation/src/desktopMain/kotlin/androidx/compose/foundation/gestures/BringIntoViewSpec.desktop.kt
index 061d648..e5a2917 100644
--- a/compose/foundation/foundation/src/desktopMain/kotlin/androidx/compose/foundation/gestures/BringIntoViewSpec.desktop.kt
+++ b/compose/foundation/foundation/src/desktopMain/kotlin/androidx/compose/foundation/gestures/BringIntoViewSpec.desktop.kt
@@ -21,10 +21,10 @@
 import androidx.compose.runtime.staticCompositionLocalOf
 
 /*
-* A composition local to customize the focus scrolling behavior used by some scrollable containers.
-* [LocalBringIntoViewSpec] has a platform defined behavior. The scroll default behavior will move
-* the least to bring the requested region into view.
-*/
+ * A composition local to customize the focus scrolling behavior used by some scrollable containers.
+ * [LocalBringIntoViewSpec] has a platform defined behavior. The scroll default behavior will move
+ * the least to bring the requested region into view.
+ */
 @Suppress("OPT_IN_MARKER_ON_WRONG_TARGET")
 @get:ExperimentalFoundationApi
 @ExperimentalFoundationApi
diff --git a/compose/foundation/foundation/src/desktopMain/kotlin/androidx/compose/foundation/gestures/DesktopScrollable.desktop.kt b/compose/foundation/foundation/src/desktopMain/kotlin/androidx/compose/foundation/gestures/DesktopScrollable.desktop.kt
index e57ca9b..ec05c06 100644
--- a/compose/foundation/foundation/src/desktopMain/kotlin/androidx/compose/foundation/gestures/DesktopScrollable.desktop.kt
+++ b/compose/foundation/foundation/src/desktopMain/kotlin/androidx/compose/foundation/gestures/DesktopScrollable.desktop.kt
@@ -96,12 +96,10 @@
 }
 
 private val PointerEvent.scrollAmount
-    get() =
-        (mouseEvent as? MouseWheelEvent)?.scrollAmount?.toFloat() ?: 1f
+    get() = (mouseEvent as? MouseWheelEvent)?.scrollAmount?.toFloat() ?: 1f
 
 private val PointerEvent.shouldScrollByPage
-    get() =
-        (mouseEvent as? MouseWheelEvent)?.scrollType == MouseWheelEvent.WHEEL_BLOCK_SCROLL
+    get() = (mouseEvent as? MouseWheelEvent)?.scrollType == MouseWheelEvent.WHEEL_BLOCK_SCROLL
 
 private val PointerEvent.totalScrollDelta
     get() = this.changes.fastFold(Offset.Zero) { acc, c -> acc + c.scrollDelta }
diff --git a/compose/foundation/foundation/src/desktopMain/kotlin/androidx/compose/foundation/lazy/layout/PrefetchScheduler.desktop.kt b/compose/foundation/foundation/src/desktopMain/kotlin/androidx/compose/foundation/lazy/layout/PrefetchScheduler.desktop.kt
index 8c034a8..da15b5f 100644
--- a/compose/foundation/foundation/src/desktopMain/kotlin/androidx/compose/foundation/lazy/layout/PrefetchScheduler.desktop.kt
+++ b/compose/foundation/foundation/src/desktopMain/kotlin/androidx/compose/foundation/lazy/layout/PrefetchScheduler.desktop.kt
@@ -27,6 +27,5 @@
 
 @ExperimentalFoundationApi
 private object NoOpPrefetchScheduler : PrefetchScheduler {
-    override fun schedulePrefetch(prefetchRequest: PrefetchRequest) {
-    }
+    override fun schedulePrefetch(prefetchRequest: PrefetchRequest) {}
 }
diff --git a/compose/foundation/foundation/src/desktopMain/kotlin/androidx/compose/foundation/relocation/BringIntoViewResponder.desktop.kt b/compose/foundation/foundation/src/desktopMain/kotlin/androidx/compose/foundation/relocation/BringIntoViewResponder.desktop.kt
index f306d6ac..b9165f3 100644
--- a/compose/foundation/foundation/src/desktopMain/kotlin/androidx/compose/foundation/relocation/BringIntoViewResponder.desktop.kt
+++ b/compose/foundation/foundation/src/desktopMain/kotlin/androidx/compose/foundation/relocation/BringIntoViewResponder.desktop.kt
@@ -20,9 +20,7 @@
 import androidx.compose.ui.layout.LayoutCoordinates
 import androidx.compose.ui.node.DelegatableNode
 
-/**
- * Platform specific internal API to bring a rectangle into view.
- */
+/** Platform specific internal API to bring a rectangle into view. */
 internal actual fun DelegatableNode.defaultBringIntoViewParent(): BringIntoViewParent =
     NoopBringIntoViewParent
 
diff --git a/compose/foundation/foundation/src/desktopMain/kotlin/androidx/compose/foundation/text/ContextMenu.desktop.kt b/compose/foundation/foundation/src/desktopMain/kotlin/androidx/compose/foundation/text/ContextMenu.desktop.kt
index adce116..0ea9b78 100644
--- a/compose/foundation/foundation/src/desktopMain/kotlin/androidx/compose/foundation/text/ContextMenu.desktop.kt
+++ b/compose/foundation/foundation/src/desktopMain/kotlin/androidx/compose/foundation/text/ContextMenu.desktop.kt
@@ -54,10 +54,7 @@
 }
 
 @Composable
-internal actual fun ContextMenuArea(
-    manager: SelectionManager,
-    content: @Composable () -> Unit
-) {
+internal actual fun ContextMenuArea(manager: SelectionManager, content: @Composable () -> Unit) {
     val state = remember { ContextMenuState() }
     if (DesktopPlatform.Current == DesktopPlatform.MacOS) {
         OpenMenuAdjuster(state) { manager.contextMenuOpenAdjustment(it) }
@@ -68,11 +65,12 @@
 @Composable
 internal fun OpenMenuAdjuster(state: ContextMenuState, adjustAction: (Offset) -> Unit) {
     LaunchedEffect(state) {
-        snapshotFlow { state.status }.collect { status ->
-            if (status is ContextMenuState.Status.Open) {
-                adjustAction(status.rect.center)
+        snapshotFlow { state.status }
+            .collect { status ->
+                if (status is ContextMenuState.Status.Open) {
+                    adjustAction(status.rect.center)
+                }
             }
-        }
     }
 }
 
@@ -124,11 +122,5 @@
 @Composable
 internal fun SelectionManager.contextMenuItems(): () -> List<ContextMenuItem> {
     val localization = LocalLocalization.current
-    return {
-        listOf(
-            ContextMenuItem(localization.copy) {
-                copy()
-            }
-        )
-    }
+    return { listOf(ContextMenuItem(localization.copy) { copy() }) }
 }
diff --git a/compose/foundation/foundation/src/desktopMain/kotlin/androidx/compose/foundation/text/KeyMapping.desktop.kt b/compose/foundation/foundation/src/desktopMain/kotlin/androidx/compose/foundation/text/KeyMapping.desktop.kt
index 94ab0b9..19b8e73 100644
--- a/compose/foundation/foundation/src/desktopMain/kotlin/androidx/compose/foundation/text/KeyMapping.desktop.kt
+++ b/compose/foundation/foundation/src/desktopMain/kotlin/androidx/compose/foundation/text/KeyMapping.desktop.kt
@@ -54,7 +54,6 @@
                                 MappedKeys.DirectionDown -> KeyCommand.SELECT_END
                                 else -> null
                             }
-
                         event.isMetaPressed ->
                             when (event.key) {
                                 MappedKeys.DirectionLeft -> KeyCommand.LINE_LEFT
@@ -129,7 +128,6 @@
                 }
             }
         }
-
         else -> defaultKeyMapping
     }
 
diff --git a/compose/foundation/foundation/src/desktopMain/kotlin/androidx/compose/foundation/text/TextFieldKeyInput.desktop.kt b/compose/foundation/foundation/src/desktopMain/kotlin/androidx/compose/foundation/text/TextFieldKeyInput.desktop.kt
index 63cc81c..c56f4b3 100644
--- a/compose/foundation/foundation/src/desktopMain/kotlin/androidx/compose/foundation/text/TextFieldKeyInput.desktop.kt
+++ b/compose/foundation/foundation/src/desktopMain/kotlin/androidx/compose/foundation/text/TextFieldKeyInput.desktop.kt
@@ -27,5 +27,6 @@
 }
 
 actual val KeyEvent.isTypedEvent: Boolean
-    get() = nativeKeyEvent.id == java.awt.event.KeyEvent.KEY_TYPED &&
-        nativeKeyEvent.keyChar.isPrintable()
+    get() =
+        nativeKeyEvent.id == java.awt.event.KeyEvent.KEY_TYPED &&
+            nativeKeyEvent.keyChar.isPrintable()
diff --git a/compose/foundation/foundation/src/desktopMain/kotlin/androidx/compose/foundation/text/TextPointerIcon.desktop.kt b/compose/foundation/foundation/src/desktopMain/kotlin/androidx/compose/foundation/text/TextPointerIcon.desktop.kt
index 07d44db..7e76272 100644
--- a/compose/foundation/foundation/src/desktopMain/kotlin/androidx/compose/foundation/text/TextPointerIcon.desktop.kt
+++ b/compose/foundation/foundation/src/desktopMain/kotlin/androidx/compose/foundation/text/TextPointerIcon.desktop.kt
@@ -19,5 +19,4 @@
 import androidx.compose.ui.input.pointer.PointerIcon
 import java.awt.Cursor
 
-internal actual val textPointerIcon: PointerIcon =
-    PointerIcon(Cursor(Cursor.TEXT_CURSOR))
+internal actual val textPointerIcon: PointerIcon = PointerIcon(Cursor(Cursor.TEXT_CURSOR))
diff --git a/compose/foundation/foundation/src/desktopMain/kotlin/androidx/compose/foundation/text/input/internal/DesktopTextInputSession.desktop.kt b/compose/foundation/foundation/src/desktopMain/kotlin/androidx/compose/foundation/text/input/internal/DesktopTextInputSession.desktop.kt
index d309139..c72411d2 100644
--- a/compose/foundation/foundation/src/desktopMain/kotlin/androidx/compose/foundation/text/input/internal/DesktopTextInputSession.desktop.kt
+++ b/compose/foundation/foundation/src/desktopMain/kotlin/androidx/compose/foundation/text/input/internal/DesktopTextInputSession.desktop.kt
@@ -24,9 +24,7 @@
 import kotlinx.coroutines.awaitCancellation
 import kotlinx.coroutines.flow.MutableSharedFlow
 
-/**
- * Runs desktop-specific text input session logic.
- */
+/** Runs desktop-specific text input session logic. */
 internal actual suspend fun PlatformTextInputSession.platformSpecificTextInputSession(
     state: TransformedTextFieldState,
     layoutState: TextLayoutState,
diff --git a/compose/foundation/foundation/src/desktopMain/kotlin/androidx/compose/foundation/text/input/internal/LegacyPlatformTextInputServiceAdapter.desktop.kt b/compose/foundation/foundation/src/desktopMain/kotlin/androidx/compose/foundation/text/input/internal/LegacyPlatformTextInputServiceAdapter.desktop.kt
index 079e229..db9a9b9 100644
--- a/compose/foundation/foundation/src/desktopMain/kotlin/androidx/compose/foundation/text/input/internal/LegacyPlatformTextInputServiceAdapter.desktop.kt
+++ b/compose/foundation/foundation/src/desktopMain/kotlin/androidx/compose/foundation/text/input/internal/LegacyPlatformTextInputServiceAdapter.desktop.kt
@@ -67,9 +67,8 @@
     ) {
         val node = textInputModifierNode ?: return
         node.launchTextInputSession {
-            val input = CurrentInput(
-                value, onEditCommand, onImeActionPerformed, imeOptions.imeAction
-            )
+            val input =
+                CurrentInput(value, onEditCommand, onImeActionPerformed, imeOptions.imeAction)
             currentInput = input
             try {
                 startInputMethod(LegacyTextInputMethodRequest(input, node.layoutCoordinates))
@@ -85,15 +84,11 @@
     }
 
     override fun updateState(oldValue: TextFieldValue?, newValue: TextFieldValue) {
-        currentInput?.let { input ->
-            input.value = newValue
-        }
+        currentInput?.let { input -> input.value = newValue }
     }
 
     override fun notifyFocusedRect(rect: Rect) {
-        currentInput?.let { input ->
-            input.focusedRect = rect
-        }
+        currentInput?.let { input -> input.focusedRect = rect }
     }
 
     override fun startStylusHandwriting() {
@@ -104,9 +99,7 @@
 internal class LegacyTextInputMethodRequest(
     private val input: CurrentInput,
     private val coordinates: LayoutCoordinates?,
-) : PlatformTextInputMethodRequest,
-    InputMethodRequests,
-    InputMethodListener {
+) : PlatformTextInputMethodRequest, InputMethodRequests, InputMethodListener {
 
     // This is required to support input of accented characters using press-and-hold method
     // (http://support.apple.com/kb/PH11264). JDK currently properly supports this functionality
@@ -118,6 +111,7 @@
 
     override val inputMethodListener: InputMethodListener
         get() = this
+
     override val inputMethodRequests: InputMethodRequests
         get() = this
 
@@ -227,12 +221,13 @@
             val res = text.substring(range)
             return AttributedString(res).iterator
         }
-        val committed = text.substring(
-            TextRange(
-                min(range.min, comp.min),
-                max(range.max, comp.max).coerceAtMost(text.length)
+        val committed =
+            text.substring(
+                TextRange(
+                    min(range.min, comp.min),
+                    max(range.max, comp.max).coerceAtMost(text.length)
+                )
             )
-        )
         return AttributedString(committed).iterator
     }
 }
diff --git a/compose/foundation/foundation/src/desktopMain/kotlin/androidx/compose/foundation/text/input/internal/TextFieldDragAndDropNode.desktop.kt b/compose/foundation/foundation/src/desktopMain/kotlin/androidx/compose/foundation/text/input/internal/TextFieldDragAndDropNode.desktop.kt
index 1a42b60..cc570df 100644
--- a/compose/foundation/foundation/src/desktopMain/kotlin/androidx/compose/foundation/text/input/internal/TextFieldDragAndDropNode.desktop.kt
+++ b/compose/foundation/foundation/src/desktopMain/kotlin/androidx/compose/foundation/text/input/internal/TextFieldDragAndDropNode.desktop.kt
@@ -24,9 +24,7 @@
 import androidx.compose.ui.platform.ClipEntry
 import androidx.compose.ui.platform.ClipMetadata
 
-/**
- * System DragAndDrop is not yet supported on Desktop flavor of BTF2.
- */
+/** System DragAndDrop is not yet supported on Desktop flavor of BTF2. */
 @OptIn(ExperimentalFoundationApi::class)
 internal actual fun textFieldDragAndDropNode(
     hintMediaTypes: () -> Set<MediaType>,
diff --git a/compose/foundation/foundation/src/desktopMain/kotlin/androidx/compose/foundation/text/input/internal/TextFieldKeyEventHandler.desktop.kt b/compose/foundation/foundation/src/desktopMain/kotlin/androidx/compose/foundation/text/input/internal/TextFieldKeyEventHandler.desktop.kt
index 7f7a0c4..00e60c9 100644
--- a/compose/foundation/foundation/src/desktopMain/kotlin/androidx/compose/foundation/text/input/internal/TextFieldKeyEventHandler.desktop.kt
+++ b/compose/foundation/foundation/src/desktopMain/kotlin/androidx/compose/foundation/text/input/internal/TextFieldKeyEventHandler.desktop.kt
@@ -18,9 +18,7 @@
 
 import androidx.compose.ui.input.key.KeyEvent
 
-/**
- * Factory function to create a platform specific [TextFieldKeyEventHandler].
- */
+/** Factory function to create a platform specific [TextFieldKeyEventHandler]. */
 internal actual fun createTextFieldKeyEventHandler() = object : TextFieldKeyEventHandler() {}
 
 internal actual val KeyEvent.isFromSoftKeyboard: Boolean
diff --git a/compose/foundation/foundation/src/desktopMain/kotlin/androidx/compose/foundation/text/input/internal/ToCharArray.desktop.kt b/compose/foundation/foundation/src/desktopMain/kotlin/androidx/compose/foundation/text/input/internal/ToCharArray.desktop.kt
index e6245d4..3ffc862 100644
--- a/compose/foundation/foundation/src/desktopMain/kotlin/androidx/compose/foundation/text/input/internal/ToCharArray.desktop.kt
+++ b/compose/foundation/foundation/src/desktopMain/kotlin/androidx/compose/foundation/text/input/internal/ToCharArray.desktop.kt
@@ -26,13 +26,8 @@
 ) {
     @Suppress("PLATFORM_CLASS_MAPPED_TO_KOTLIN")
     when (this) {
-        is TextFieldCharSequence -> toCharArray(
-            destination,
-            destinationOffset,
-            startIndex,
-            endIndex
-        )
-
+        is TextFieldCharSequence ->
+            toCharArray(destination, destinationOffset, startIndex, endIndex)
         is java.lang.String -> getChars(startIndex, endIndex, destination, destinationOffset)
         is StringBuilder -> getChars(startIndex, endIndex, destination, destinationOffset)
         else -> {
diff --git a/compose/foundation/foundation/src/desktopMain/kotlin/androidx/compose/foundation/text/input/internal/selection/DesktopTextFieldMagnifier.desktop.kt b/compose/foundation/foundation/src/desktopMain/kotlin/androidx/compose/foundation/text/input/internal/selection/DesktopTextFieldMagnifier.desktop.kt
index 76d9d25..3a9ee1e 100644
--- a/compose/foundation/foundation/src/desktopMain/kotlin/androidx/compose/foundation/text/input/internal/selection/DesktopTextFieldMagnifier.desktop.kt
+++ b/compose/foundation/foundation/src/desktopMain/kotlin/androidx/compose/foundation/text/input/internal/selection/DesktopTextFieldMagnifier.desktop.kt
@@ -19,19 +19,18 @@
 import androidx.compose.foundation.text.input.internal.TextLayoutState
 import androidx.compose.foundation.text.input.internal.TransformedTextFieldState
 
-/**
- * There is no magnifier on Desktop. Return a noop [TextFieldMagnifierNode] implementation.
- */
+/** There is no magnifier on Desktop. Return a noop [TextFieldMagnifierNode] implementation. */
 internal actual fun textFieldMagnifierNode(
     textFieldState: TransformedTextFieldState,
     textFieldSelectionState: TextFieldSelectionState,
     textLayoutState: TextLayoutState,
     visible: Boolean
-) = object : TextFieldMagnifierNode() {
-    override fun update(
-        textFieldState: TransformedTextFieldState,
-        textFieldSelectionState: TextFieldSelectionState,
-        textLayoutState: TextLayoutState,
-        visible: Boolean
-    ) {}
-}
+) =
+    object : TextFieldMagnifierNode() {
+        override fun update(
+            textFieldState: TransformedTextFieldState,
+            textFieldSelectionState: TextFieldSelectionState,
+            textLayoutState: TextLayoutState,
+            visible: Boolean
+        ) {}
+    }
diff --git a/compose/foundation/foundation/src/desktopMain/kotlin/androidx/compose/foundation/text/selection/SelectionManager.desktop.kt b/compose/foundation/foundation/src/desktopMain/kotlin/androidx/compose/foundation/text/selection/SelectionManager.desktop.kt
index cdcddcd..f4b0c74 100644
--- a/compose/foundation/foundation/src/desktopMain/kotlin/androidx/compose/foundation/text/selection/SelectionManager.desktop.kt
+++ b/compose/foundation/foundation/src/desktopMain/kotlin/androidx/compose/foundation/text/selection/SelectionManager.desktop.kt
@@ -28,12 +28,11 @@
 // it would end up being a function for any conceptual keyevent (selectall, cut, copy, paste)
 // TODO(b/1564937)
 internal actual fun isCopyKeyEvent(keyEvent: KeyEvent) =
-    keyEvent.key == MappedKeys.C && when (DesktopPlatform.Current) {
-        DesktopPlatform.MacOS -> keyEvent.isMetaPressed
-        else -> keyEvent.isCtrlPressed
-    } || keyEvent.key == MappedKeys.Copy
+    keyEvent.key == MappedKeys.C &&
+        when (DesktopPlatform.Current) {
+            DesktopPlatform.MacOS -> keyEvent.isMetaPressed
+            else -> keyEvent.isCtrlPressed
+        } || keyEvent.key == MappedKeys.Copy
 
-/**
- * Magnification is not supported on desktop.
- */
+/** Magnification is not supported on desktop. */
 internal actual fun Modifier.selectionMagnifier(manager: SelectionManager): Modifier = this
diff --git a/compose/foundation/foundation/src/desktopMain/kotlin/androidx/compose/foundation/text/selection/TextFieldSelectionManager.desktop.kt b/compose/foundation/foundation/src/desktopMain/kotlin/androidx/compose/foundation/text/selection/TextFieldSelectionManager.desktop.kt
index 4496168..7b9ce21 100644
--- a/compose/foundation/foundation/src/desktopMain/kotlin/androidx/compose/foundation/text/selection/TextFieldSelectionManager.desktop.kt
+++ b/compose/foundation/foundation/src/desktopMain/kotlin/androidx/compose/foundation/text/selection/TextFieldSelectionManager.desktop.kt
@@ -22,7 +22,5 @@
 internal actual val PointerEvent.isShiftPressed: Boolean
     get() = mouseEvent?.isShiftDown ?: false
 
-/**
- * Magnification is not supported on desktop.
- */
+/** Magnification is not supported on desktop. */
 internal actual fun Modifier.textFieldMagnifier(manager: TextFieldSelectionManager): Modifier = this
diff --git a/compose/foundation/foundation/src/desktopMain/kotlin/androidx/compose/foundation/window/WindowDraggableArea.desktop.kt b/compose/foundation/foundation/src/desktopMain/kotlin/androidx/compose/foundation/window/WindowDraggableArea.desktop.kt
index c525ae5..da67d5e 100644
--- a/compose/foundation/foundation/src/desktopMain/kotlin/androidx/compose/foundation/window/WindowDraggableArea.desktop.kt
+++ b/compose/foundation/foundation/src/desktopMain/kotlin/androidx/compose/foundation/window/WindowDraggableArea.desktop.kt
@@ -46,12 +46,13 @@
     val handler = remember { DragHandler(window) }
 
     Box(
-        modifier = modifier.pointerInput(Unit) {
-            awaitEachGesture {
-                awaitFirstDown()
-                handler.register()
+        modifier =
+            modifier.pointerInput(Unit) {
+                awaitEachGesture {
+                    awaitFirstDown()
+                    handler.register()
+                }
             }
-        }
     ) {
         content()
     }
@@ -61,15 +62,17 @@
     private var location = window.location.toComposeOffset()
     private var pointStart = MouseInfo.getPointerInfo().location.toComposeOffset()
 
-    private val dragListener = object : MouseMotionAdapter() {
-        override fun mouseDragged(event: MouseEvent) = drag()
-    }
-    private val removeListener = object : MouseAdapter() {
-        override fun mouseReleased(event: MouseEvent) {
-            window.removeMouseMotionListener(dragListener)
-            window.removeMouseListener(this)
+    private val dragListener =
+        object : MouseMotionAdapter() {
+            override fun mouseDragged(event: MouseEvent) = drag()
         }
-    }
+    private val removeListener =
+        object : MouseAdapter() {
+            override fun mouseReleased(event: MouseEvent) {
+                window.removeMouseMotionListener(dragListener)
+                window.removeMouseListener(this)
+            }
+        }
 
     fun register() {
         location = window.location.toComposeOffset()
diff --git a/compose/foundation/foundation/src/desktopTest/kotlin/androidx/compose/foundation/ScrollbarTest.kt b/compose/foundation/foundation/src/desktopTest/kotlin/androidx/compose/foundation/ScrollbarTest.kt
index a41bd6a..2428226 100644
--- a/compose/foundation/foundation/src/desktopTest/kotlin/androidx/compose/foundation/ScrollbarTest.kt
+++ b/compose/foundation/foundation/src/desktopTest/kotlin/androidx/compose/foundation/ScrollbarTest.kt
@@ -63,8 +63,7 @@
 
 @Suppress("WrapUnaryOperator")
 class ScrollbarTest {
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
     @Test
     fun `drag slider to the middle`() {
@@ -156,19 +155,19 @@
 
     // TODO(demin): write a test when we support DesktopComposeTestRule.mainClock:
     //  see https://github.com/JetBrains/compose-jb/issues/637
-//    fun `move mouse to the slider and drag it`() {
-//        ...
-//        rule.performMouseMove(0, 25)
-//        rule.mainClock.advanceTimeByFrame()
-//        down(Offset(0f, 25f))
-//        rule.mainClock.advanceTimeByFrame()
-//        moveTo(Offset(0f, 30f))
-//        rule.mainClock.advanceTimeByFrame()
-//        moveTo(Offset(0f, 50f))
-//        rule.mainClock.advanceTimeByFrame()
-//        up()
-//        ...
-//    }
+    //    fun `move mouse to the slider and drag it`() {
+    //        ...
+    //        rule.performMouseMove(0, 25)
+    //        rule.mainClock.advanceTimeByFrame()
+    //        down(Offset(0f, 25f))
+    //        rule.mainClock.advanceTimeByFrame()
+    //        moveTo(Offset(0f, 30f))
+    //        rule.mainClock.advanceTimeByFrame()
+    //        moveTo(Offset(0f, 50f))
+    //        rule.mainClock.advanceTimeByFrame()
+    //        up()
+    //        ...
+    //    }
 
     // TODO(demin): enable after we resolve b/171889442
     @Ignore("Enable after we resolve b/171889442")
@@ -242,9 +241,7 @@
             }
             rule.awaitIdle()
 
-            rule.onNodeWithTag("scrollbar").performTouchInput {
-                down(Offset(0f, 26f))
-            }
+            rule.onNodeWithTag("scrollbar").performTouchInput { down(Offset(0f, 26f)) }
 
             tryUntilSucceeded {
                 rule.awaitIdle()
@@ -261,9 +258,7 @@
             }
             rule.awaitIdle()
 
-            rule.onNodeWithTag("scrollbar").performTouchInput {
-                down(Offset(0f, 99f))
-            }
+            rule.onNodeWithTag("scrollbar").performTouchInput { down(Offset(0f, 99f)) }
 
             tryUntilSucceeded {
                 rule.awaitIdle()
@@ -277,14 +272,9 @@
         runBlocking(Dispatchers.Main) {
             val isContentVisible = mutableStateOf(false)
             rule.setContent {
-                TestBox(
-                    size = 100.dp,
-                    scrollbarWidth = 10.dp
-                ) {
+                TestBox(size = 100.dp, scrollbarWidth = 10.dp) {
                     if (isContentVisible.value) {
-                        repeat(10) {
-                            Box(Modifier.size(20.dp).testTag("box$it"))
-                        }
+                        repeat(10) { Box(Modifier.size(20.dp).testTag("box$it")) }
                     }
                 }
             }
@@ -426,7 +416,10 @@
         runBlocking(Dispatchers.Main) {
             rule.setContent {
                 LazyTestBox(
-                    size = 100.dp, childSize = 20.dp, childCount = 1, scrollbarWidth = 10.dp
+                    size = 100.dp,
+                    childSize = 20.dp,
+                    childCount = 1,
+                    scrollbarWidth = 10.dp
                 )
             }
             rule.awaitIdle()
@@ -451,19 +444,20 @@
 
     @OptIn(InternalTestApi::class, ExperimentalComposeUiApi::class)
     private fun ComposeTestRule.performMouseScroll(x: Int, y: Int, delta: Float) {
-        (this as DesktopComposeTestRule).scene.sendPointerEvent(
-            PointerEventType.Scroll,
-            Offset(x.toFloat(), y.toFloat()),
-            scrollDelta = Offset(x = 0f, y = delta)
-        )
+        (this as DesktopComposeTestRule)
+            .scene
+            .sendPointerEvent(
+                PointerEventType.Scroll,
+                Offset(x.toFloat(), y.toFloat()),
+                scrollDelta = Offset(x = 0f, y = delta)
+            )
     }
 
     @OptIn(ExperimentalComposeUiApi::class, InternalTestApi::class)
     private fun ComposeTestRule.performMouseMove(x: Int, y: Int) {
-        (this as DesktopComposeTestRule).scene.sendPointerEvent(
-            PointerEventType.Move,
-            Offset(x.toFloat(), y.toFloat())
-        )
+        (this as DesktopComposeTestRule)
+            .scene
+            .sendPointerEvent(PointerEventType.Move, Offset(x.toFloat(), y.toFloat()))
     }
 
     @Composable
@@ -476,20 +470,13 @@
         Box(Modifier.size(size)) {
             val state = rememberScrollState()
 
-            Column(
-                Modifier.fillMaxSize().testTag("column").verticalScroll(state)
-            ) {
-                repeat(childCount) {
-                    Box(Modifier.size(childSize).testTag("box$it"))
-                }
+            Column(Modifier.fillMaxSize().testTag("column").verticalScroll(state)) {
+                repeat(childCount) { Box(Modifier.size(childSize).testTag("box$it")) }
             }
 
             VerticalScrollbar(
                 adapter = rememberScrollbarAdapter(state),
-                modifier = Modifier
-                    .width(scrollbarWidth)
-                    .fillMaxHeight()
-                    .testTag("scrollbar")
+                modifier = Modifier.width(scrollbarWidth).fillMaxHeight().testTag("scrollbar")
             )
         }
     }
@@ -510,10 +497,7 @@
 
             VerticalScrollbar(
                 adapter = rememberScrollbarAdapter(state),
-                modifier = Modifier
-                    .width(scrollbarWidth)
-                    .fillMaxHeight()
-                    .testTag("scrollbar")
+                modifier = Modifier.width(scrollbarWidth).fillMaxHeight().testTag("scrollbar")
             )
         }
     }
@@ -543,10 +527,7 @@
             VerticalScrollbar(
                 adapter = rememberScrollbarAdapter(state),
                 reverseLayout = reverseLayout,
-                modifier = Modifier
-                    .width(scrollbarWidth)
-                    .fillMaxHeight()
-                    .testTag("scrollbar")
+                modifier = Modifier.width(scrollbarWidth).fillMaxHeight().testTag("scrollbar")
             )
         }
     }
@@ -558,18 +539,20 @@
     }
 
     @Composable
-    private fun withTestEnvironment(content: @Composable () -> Unit) = CompositionLocalProvider(
-        LocalScrollbarStyle provides ScrollbarStyle(
-            minimalHeight = 16.dp,
-            thickness = 8.dp,
-            shape = RectangleShape,
-            hoverDurationMillis = 300,
-            unhoverColor = Color.Black,
-            hoverColor = Color.Red
-        ),
-        LocalScrollConfig provides TestConfig,
-        content = content
-    )
+    private fun withTestEnvironment(content: @Composable () -> Unit) =
+        CompositionLocalProvider(
+            LocalScrollbarStyle provides
+                ScrollbarStyle(
+                    minimalHeight = 16.dp,
+                    thickness = 8.dp,
+                    shape = RectangleShape,
+                    hoverDurationMillis = 300,
+                    unhoverColor = Color.Black,
+                    hoverColor = Color.Red
+                ),
+            LocalScrollConfig provides TestConfig,
+            content = content
+        )
 }
 
 internal object TestConfig : ScrollConfig {
diff --git a/compose/foundation/foundation/src/desktopTest/kotlin/androidx/compose/foundation/gestures/DesktopScrollableTest.kt b/compose/foundation/foundation/src/desktopTest/kotlin/androidx/compose/foundation/gestures/DesktopScrollableTest.kt
index deb940b..43cdd7a 100644
--- a/compose/foundation/foundation/src/desktopTest/kotlin/androidx/compose/foundation/gestures/DesktopScrollableTest.kt
+++ b/compose/foundation/foundation/src/desktopTest/kotlin/androidx/compose/foundation/gestures/DesktopScrollableTest.kt
@@ -42,19 +42,19 @@
 //  after that we won't need `window.render`
 @OptIn(ExperimentalComposeUiApi::class)
 @RunWith(JUnit4::class)
-@Ignore // TODO(b/217238066) remove after migration to ImageComposeScene (it will be upstreamed from Compose MPP 1.0.0)
+@Ignore // TODO(b/217238066) remove after migration to ImageComposeScene (it will be upstreamed from
+// Compose MPP 1.0.0)
 class DesktopScrollableTest {
     private val density = 2f
 
-    private fun window() = TestComposeWindow(
-        width = 100,
-        height = 100,
-        density = Density(density)
-    )
+    private fun window() = TestComposeWindow(width = 100, height = 100, density = Density(density))
 
     private fun scrollLineLinux(bounds: Dp) = sqrt(bounds.value * density)
+
     private fun scrollLineWindows(bounds: Dp) = bounds.value * density / 20f
+
     private fun scrollLineMacOs() = density * 10f
+
     private fun scrollPage(bounds: Dp) = bounds.value * density
 
     @Test
@@ -63,12 +63,9 @@
         val context = TestColumn()
 
         window.setContent {
-            CompositionLocalProvider(
-                LocalScrollConfig provides LinuxGnomeConfig
-            ) {
+            CompositionLocalProvider(LocalScrollConfig provides LinuxGnomeConfig) {
                 Box(
-                    Modifier
-                        .scrollable(
+                    Modifier.scrollable(
                             orientation = Orientation.Vertical,
                             state = context.controller()
                         )
@@ -102,12 +99,9 @@
         val context = TestColumn()
 
         window.setContent {
-            CompositionLocalProvider(
-                LocalScrollConfig provides WindowsWinUIConfig
-            ) {
+            CompositionLocalProvider(LocalScrollConfig provides WindowsWinUIConfig) {
                 Box(
-                    Modifier
-                        .scrollable(
+                    Modifier.scrollable(
                             orientation = Orientation.Vertical,
                             state = context.controller()
                         )
@@ -141,12 +135,9 @@
         val context = TestColumn()
 
         window.setContent {
-            CompositionLocalProvider(
-                LocalScrollConfig provides WindowsWinUIConfig
-            ) {
+            CompositionLocalProvider(LocalScrollConfig provides WindowsWinUIConfig) {
                 Box(
-                    Modifier
-                        .scrollable(
+                    Modifier.scrollable(
                             orientation = Orientation.Vertical,
                             state = context.controller()
                         )
@@ -171,12 +162,9 @@
         val context = TestColumn()
 
         window.setContent {
-            CompositionLocalProvider(
-                LocalScrollConfig provides MacOSCocoaConfig
-            ) {
+            CompositionLocalProvider(LocalScrollConfig provides MacOSCocoaConfig) {
                 Box(
-                    Modifier
-                        .scrollable(
+                    Modifier.scrollable(
                             orientation = Orientation.Vertical,
                             state = context.controller()
                         )
@@ -201,12 +189,9 @@
         val column = TestColumn()
 
         window.setContent {
-            CompositionLocalProvider(
-                LocalScrollConfig provides LinuxGnomeConfig
-            ) {
+            CompositionLocalProvider(LocalScrollConfig provides LinuxGnomeConfig) {
                 Box(
-                    Modifier
-                        .scrollable(
+                    Modifier.scrollable(
                             orientation = Orientation.Vertical,
                             state = column.controller()
                         )
@@ -229,8 +214,7 @@
         var offset = 0f
             private set
 
-        @Composable
-        fun controller() = ScrollableState(::consumeScrollDelta)
+        @Composable fun controller() = ScrollableState(::consumeScrollDelta)
 
         private fun consumeScrollDelta(delta: Float): Float {
             offset += delta
diff --git a/compose/foundation/foundation/src/desktopTest/kotlin/androidx/compose/foundation/text/input/internal/LegacyPlatformTextInputServiceAdapterTest.kt b/compose/foundation/foundation/src/desktopTest/kotlin/androidx/compose/foundation/text/input/internal/LegacyPlatformTextInputServiceAdapterTest.kt
index 09944d9..15308ff 100644
--- a/compose/foundation/foundation/src/desktopTest/kotlin/androidx/compose/foundation/text/input/internal/LegacyPlatformTextInputServiceAdapterTest.kt
+++ b/compose/foundation/foundation/src/desktopTest/kotlin/androidx/compose/foundation/text/input/internal/LegacyPlatformTextInputServiceAdapterTest.kt
@@ -58,47 +58,48 @@
         val inputService = TextInputService(adapter)
         var currentRequest: PlatformTextInputMethodRequest? = null
 
-        adapter.registerModifier(object : LegacyPlatformTextInputNode {
-            override val softwareKeyboardController: SoftwareKeyboardController?
-                get() = null
-            override val layoutCoordinates: LayoutCoordinates?
-                get() = null
-            override val legacyTextFieldState: LegacyTextFieldState?
-                get() = null
-            override val textFieldSelectionManager: TextFieldSelectionManager?
-                get() = null
-            override val viewConfiguration: ViewConfiguration
-                get() = DefaultViewConfiguration(Density(1f))
+        adapter.registerModifier(
+            object : LegacyPlatformTextInputNode {
+                override val softwareKeyboardController: SoftwareKeyboardController?
+                    get() = null
 
-            override fun launchTextInputSession(
-                block: suspend PlatformTextInputSession.() -> Nothing
-            ): Job {
-                val session = object : PlatformTextInputSession {
-                    override suspend fun startInputMethod(
-                        request: PlatformTextInputMethodRequest
-                    ): Nothing {
-                        currentRequest = request
-                        try {
-                            awaitCancellation()
-                        } finally {
-                            currentRequest = null
+                override val layoutCoordinates: LayoutCoordinates?
+                    get() = null
+
+                override val legacyTextFieldState: LegacyTextFieldState?
+                    get() = null
+
+                override val textFieldSelectionManager: TextFieldSelectionManager?
+                    get() = null
+
+                override val viewConfiguration: ViewConfiguration
+                    get() = DefaultViewConfiguration(Density(1f))
+
+                override fun launchTextInputSession(
+                    block: suspend PlatformTextInputSession.() -> Nothing
+                ): Job {
+                    val session =
+                        object : PlatformTextInputSession {
+                            override suspend fun startInputMethod(
+                                request: PlatformTextInputMethodRequest
+                            ): Nothing {
+                                currentRequest = request
+                                try {
+                                    awaitCancellation()
+                                } finally {
+                                    currentRequest = null
+                                }
+                            }
                         }
-                    }
-                }
 
-                return backgroundScope.launch(Dispatchers.Unconfined) {
-                    block(session)
+                    return backgroundScope.launch(Dispatchers.Unconfined) { block(session) }
                 }
             }
-        })
-
-        val session = inputService.startInput(
-            TextFieldValue(),
-            ImeOptions.Default,
-            processor::apply,
-            {}
         )
 
+        val session =
+            inputService.startInput(TextFieldValue(), ImeOptions.Default, processor::apply, {})
+
         processor.reset(TextFieldValue("h"), session)
 
         val familyEmoji = "\uD83D\uDC68\u200D\uD83D\uDC69\u200D\uD83D\uDC66\u200D\uD83D\uDC66"
@@ -130,47 +131,48 @@
         val inputService = TextInputService(adapter)
         var currentRequest: PlatformTextInputMethodRequest? = null
 
-        adapter.registerModifier(object : LegacyPlatformTextInputNode {
-            override val softwareKeyboardController: SoftwareKeyboardController?
-                get() = null
-            override val layoutCoordinates: LayoutCoordinates?
-                get() = null
-            override val legacyTextFieldState: LegacyTextFieldState?
-                get() = null
-            override val textFieldSelectionManager: TextFieldSelectionManager?
-                get() = null
-            override val viewConfiguration: ViewConfiguration
-                get() = DefaultViewConfiguration(Density(1f))
+        adapter.registerModifier(
+            object : LegacyPlatformTextInputNode {
+                override val softwareKeyboardController: SoftwareKeyboardController?
+                    get() = null
 
-            override fun launchTextInputSession(
-                block: suspend PlatformTextInputSession.() -> Nothing
-            ): Job {
-                val session = object : PlatformTextInputSession {
-                    override suspend fun startInputMethod(
-                        request: PlatformTextInputMethodRequest
-                    ): Nothing {
-                        currentRequest = request
-                        try {
-                            awaitCancellation()
-                        } finally {
-                            currentRequest = null
+                override val layoutCoordinates: LayoutCoordinates?
+                    get() = null
+
+                override val legacyTextFieldState: LegacyTextFieldState?
+                    get() = null
+
+                override val textFieldSelectionManager: TextFieldSelectionManager?
+                    get() = null
+
+                override val viewConfiguration: ViewConfiguration
+                    get() = DefaultViewConfiguration(Density(1f))
+
+                override fun launchTextInputSession(
+                    block: suspend PlatformTextInputSession.() -> Nothing
+                ): Job {
+                    val session =
+                        object : PlatformTextInputSession {
+                            override suspend fun startInputMethod(
+                                request: PlatformTextInputMethodRequest
+                            ): Nothing {
+                                currentRequest = request
+                                try {
+                                    awaitCancellation()
+                                } finally {
+                                    currentRequest = null
+                                }
+                            }
                         }
-                    }
-                }
 
-                return backgroundScope.launch(Dispatchers.Unconfined) {
-                    block(session)
+                    return backgroundScope.launch(Dispatchers.Unconfined) { block(session) }
                 }
             }
-        })
-
-        val session = inputService.startInput(
-            TextFieldValue(),
-            ImeOptions.Default,
-            processor::apply,
-            {}
         )
 
+        val session =
+            inputService.startInput(TextFieldValue(), ImeOptions.Default, processor::apply, {})
+
         val request = assertIs<LegacyTextInputMethodRequest>(currentRequest)
         request.charKeyPressed = true
         processor.reset(TextFieldValue("a", selection = TextRange(1)), session)
diff --git a/compose/foundation/foundation/src/desktopTest/kotlin/androidx/compose/foundation/text/selection/DesktopTextFieldSelectionManagerTest.kt b/compose/foundation/foundation/src/desktopTest/kotlin/androidx/compose/foundation/text/selection/DesktopTextFieldSelectionManagerTest.kt
index 06b1cc0..63d9845 100644
--- a/compose/foundation/foundation/src/desktopTest/kotlin/androidx/compose/foundation/text/selection/DesktopTextFieldSelectionManagerTest.kt
+++ b/compose/foundation/foundation/src/desktopTest/kotlin/androidx/compose/foundation/text/selection/DesktopTextFieldSelectionManagerTest.kt
@@ -85,42 +85,41 @@
         manager.hapticFeedBack = hapticFeedback
         manager.focusRequester = focusRequester
 
-        whenever(layoutResult.layoutInput).thenReturn(
-            TextLayoutInput(
-                text = AnnotatedString(text),
-                style = TextStyle.Default,
-                placeholders = mock(),
-                maxLines = 2,
-                softWrap = true,
-                overflow = TextOverflow.Ellipsis,
-                density = density,
-                layoutDirection = LayoutDirection.Ltr,
-                fontFamilyResolver = mock(),
-                constraints = Constraints()
+        whenever(layoutResult.layoutInput)
+            .thenReturn(
+                TextLayoutInput(
+                    text = AnnotatedString(text),
+                    style = TextStyle.Default,
+                    placeholders = mock(),
+                    maxLines = 2,
+                    softWrap = true,
+                    overflow = TextOverflow.Ellipsis,
+                    density = density,
+                    layoutDirection = LayoutDirection.Ltr,
+                    fontFamilyResolver = mock(),
+                    constraints = Constraints()
+                )
             )
-        )
 
         whenever(layoutResult.getBoundingBox(any())).thenReturn(Rect.Zero)
         whenever(layoutResult.getOffsetForPosition(dragBeginPosition)).thenReturn(beginOffset)
         whenever(layoutResult.getOffsetForPosition(dragBeginPosition + dragDistance))
             .thenReturn(dragOffset)
-        whenever(
-            layoutResultProxy.getOffsetForPosition(dragBeginPosition, false)
-        ).thenReturn(beginOffset)
-        whenever(
-            layoutResultProxy.getOffsetForPosition(dragBeginPosition + dragDistance, false)
-        ).thenReturn(dragOffset)
-        whenever(
-            layoutResultProxy.getOffsetForPosition(dragBeginPosition + dragDistance)
-        ).thenReturn(dragOffset)
+        whenever(layoutResultProxy.getOffsetForPosition(dragBeginPosition, false))
+            .thenReturn(beginOffset)
+        whenever(layoutResultProxy.getOffsetForPosition(dragBeginPosition + dragDistance, false))
+            .thenReturn(dragOffset)
+        whenever(layoutResultProxy.getOffsetForPosition(dragBeginPosition + dragDistance))
+            .thenReturn(dragOffset)
 
         whenever(layoutResultProxy.value).thenReturn(layoutResult)
 
-        state = LegacyTextFieldState(
-            textDelegate = mock(),
-            recomposeScope = mock(),
-            keyboardController = null
-        )
+        state =
+            LegacyTextFieldState(
+                textDelegate = mock(),
+                recomposeScope = mock(),
+                keyboardController = null
+            )
         state.layoutResult = layoutResultProxy
         state.processor.reset(value, null)
         manager.state = state
diff --git a/compose/foundation/foundation/src/jvmMain/kotlin/androidx/compose/foundation/text/input/internal/CodepointHelpers.jvm.kt b/compose/foundation/foundation/src/jvmMain/kotlin/androidx/compose/foundation/text/input/internal/CodepointHelpers.jvm.kt
index 992d654..d8b0b2d 100644
--- a/compose/foundation/foundation/src/jvmMain/kotlin/androidx/compose/foundation/text/input/internal/CodepointHelpers.jvm.kt
+++ b/compose/foundation/foundation/src/jvmMain/kotlin/androidx/compose/foundation/text/input/internal/CodepointHelpers.jvm.kt
@@ -19,8 +19,7 @@
 internal actual fun CharSequence.codePointAt(index: Int): Int =
     java.lang.Character.codePointAt(this, index)
 
-internal actual fun charCount(codePoint: Int): Int =
-    java.lang.Character.charCount(codePoint)
+internal actual fun charCount(codePoint: Int): Int = java.lang.Character.charCount(codePoint)
 
 internal actual fun CharSequence.codePointBefore(index: Int): Int =
     java.lang.Character.codePointBefore(this, index)
diff --git a/compose/integration-tests/demos/common/src/main/java/androidx/compose/integration/demos/common/Demo.kt b/compose/integration-tests/demos/common/src/main/java/androidx/compose/integration/demos/common/Demo.kt
index 7271573..9b4fe6a 100644
--- a/compose/integration-tests/demos/common/src/main/java/androidx/compose/integration/demos/common/Demo.kt
+++ b/compose/integration-tests/demos/common/src/main/java/androidx/compose/integration/demos/common/Demo.kt
@@ -22,9 +22,7 @@
 import androidx.fragment.app.Fragment
 import kotlin.reflect.KClass
 
-/**
- * Generic demo with a [title] that will be displayed in the list of demos.
- */
+/** Generic demo with a [title] that will be displayed in the list of demos. */
 sealed class Demo(val title: String) {
     override fun toString() = title
 }
@@ -35,27 +33,22 @@
  * This should only be used for demos that need to customize the activity, the large majority of
  * demos should just use [ComposableDemo] instead.
  *
- * @property activityClass the KClass (Foo::class) of the activity that will be launched when
- * this demo is selected.
+ * @property activityClass the KClass (Foo::class) of the activity that will be launched when this
+ *   demo is selected.
  */
-class ActivityDemo<T : ComponentActivity>(title: String, val activityClass: KClass<T>) : Demo(title)
+class ActivityDemo<T : ComponentActivity>(title: String, val activityClass: KClass<T>) :
+    Demo(title)
 
 class FragmentDemo<T : Fragment>(title: String, val fragmentClass: KClass<T>) : Demo(title)
 
-/**
- * Demo that displays [Composable] [content] when selected.
- */
+/** Demo that displays [Composable] [content] when selected. */
 class ComposableDemo(title: String, val content: @Composable (onNavigateUp: () -> Unit) -> Unit) :
     Demo(title)
 
-/**
- * A category of [Demo]s, that will display a list of [demos] when selected.
- */
+/** A category of [Demo]s, that will display a list of [demos] when selected. */
 class DemoCategory(title: String, val demos: List<Demo>) : Demo(title)
 
-/**
- * Flattened recursive DFS [List] of every demo in [this].
- */
+/** Flattened recursive DFS [List] of every demo in [this]. */
 fun DemoCategory.allDemos(): List<Demo> {
     val allDemos = mutableListOf<Demo>()
     fun DemoCategory.addAllDemos() {
@@ -70,9 +63,7 @@
     return allDemos
 }
 
-/**
- * Flattened recursive DFS [List] of every launchable demo in [this].
- */
+/** Flattened recursive DFS [List] of every launchable demo in [this]. */
 fun DemoCategory.allLaunchableDemos(): List<Demo> {
     return allDemos().filter { it !is DemoCategory }
 }
diff --git a/compose/integration-tests/demos/src/main/java/androidx/compose/integration/demos/AccessibilityNodeInspector.kt b/compose/integration-tests/demos/src/main/java/androidx/compose/integration/demos/AccessibilityNodeInspector.kt
index 5e7b574..c0cabf7 100644
--- a/compose/integration-tests/demos/src/main/java/androidx/compose/integration/demos/AccessibilityNodeInspector.kt
+++ b/compose/integration-tests/demos/src/main/java/androidx/compose/integration/demos/AccessibilityNodeInspector.kt
@@ -174,27 +174,25 @@
     val state = rememberAccessibilityNodeInspectorState()
     Box(
         propagateMinConstraints = true,
-        modifier = modifier
-            // This node needs to have the same gesture modifier as the dedicated inspector overlay
-            // since when the button is dragged initially, the pointer events will all still be sent
-            // to the button, and not the overlay, even though the overlay will immediately be
-            // shown. Because node coordinates are all communicated in screen space, it doesn't
-            // actually matter which window accepts the pointer events.
-            .then(NodeSelectionGestureModifier(state, onDragStarted = { active = true }))
-            // Tag the button so the inspector can detect when the button itself is selected and
-            // show a help message.
-            .semantics(mergeDescendants = true) {
-                testTag = InspectorButtonTestTag
-            }
+        modifier =
+            modifier
+                // This node needs to have the same gesture modifier as the dedicated inspector
+                // overlay
+                // since when the button is dragged initially, the pointer events will all still be
+                // sent
+                // to the button, and not the overlay, even though the overlay will immediately be
+                // shown. Because node coordinates are all communicated in screen space, it doesn't
+                // actually matter which window accepts the pointer events.
+                .then(NodeSelectionGestureModifier(state, onDragStarted = { active = true }))
+                // Tag the button so the inspector can detect when the button itself is selected and
+                // show a help message.
+                .semantics(mergeDescendants = true) { testTag = InspectorButtonTestTag }
     ) {
         content()
 
         if (active) {
             if (Build.VERSION.SDK_INT >= 34) {
-                AccessibilityNodeInspector(
-                    state = state,
-                    onDismissRequest = { active = false }
-                )
+                AccessibilityNodeInspector(state = state, onDismissRequest = { active = false })
             } else {
                 AlertDialog(
                     onDismissRequest = { active = false },
@@ -203,9 +201,7 @@
                     buttons = {
                         Button(
                             onClick = { active = false },
-                            modifier = Modifier
-                                .padding(16.dp)
-                                .fillMaxWidth()
+                            modifier = Modifier.padding(16.dp).fillMaxWidth()
                         ) {
                             Text("DISMISS")
                         }
@@ -224,10 +220,11 @@
     get() {
         if (Build.VERSION.SDK_INT >= 26) {
             visitSelfAndAncestors {
-                val testTag = AccessibilityNodeInfoHelper.readExtraData(
-                    it.nodeInfo.unwrap(),
-                    TestTagExtrasKey
-                )
+                val testTag =
+                    AccessibilityNodeInfoHelper.readExtraData(
+                        it.nodeInfo.unwrap(),
+                        TestTagExtrasKey
+                    )
                 if (testTag == InspectorButtonTestTag) {
                     return true
                 }
@@ -238,9 +235,7 @@
 
 // region Selection UI
 
-/**
- * A popup that overlays another window and allows exploring its accessibility nodes by touch.
- */
+/** A popup that overlays another window and allows exploring its accessibility nodes by touch. */
 @Composable
 private fun AccessibilityNodeInspector(
     state: AccessibilityNodeInspectorState,
@@ -249,22 +244,22 @@
     if (state.isReady) {
         Popup(
             popupPositionProvider = state,
-            properties = PopupProperties(
-                focusable = true,
-                excludeFromSystemGesture = false,
-            ),
+            properties =
+                PopupProperties(
+                    focusable = true,
+                    excludeFromSystemGesture = false,
+                ),
             onDismissRequest = onDismissRequest
         ) {
             Box(
                 propagateMinConstraints = true,
-                modifier = Modifier
-                    .width { state.inspectorWindowSize.width }
-                    .height { state.inspectorWindowSize.height }
+                modifier =
+                    Modifier.width { state.inspectorWindowSize.width }
+                        .height { state.inspectorWindowSize.height }
             ) {
                 // Selection UI and input handling.
                 Box(
-                    Modifier
-                        .then(NodeSelectionGestureModifier(state))
+                    Modifier.then(NodeSelectionGestureModifier(state))
                         .then(DrawSelectionOverlayModifier(state))
                 )
 
@@ -273,11 +268,11 @@
                         // Don't use Surface here, it breaks touch input.
                         Text(
                             UsageMessage,
-                            modifier = Modifier
-                                .wrapContentSize()
-                                .padding(16.dp)
-                                .background(MaterialTheme.colors.surface)
-                                .padding(16.dp)
+                            modifier =
+                                Modifier.wrapContentSize()
+                                    .padding(16.dp)
+                                    .background(MaterialTheme.colors.surface)
+                                    .padding(16.dp)
                         )
                     } else {
                         InspectorNodeDetailsDialog(
@@ -296,9 +291,8 @@
  * A modifier that draws the current selection of an [AccessibilityNodeInspectorState] in an
  * [AccessibilityNodeInspector].
  */
-private data class DrawSelectionOverlayModifier(
-    val state: AccessibilityNodeInspectorState
-) : ModifierNodeElement<DrawSelectionOverlayModifierNode>() {
+private data class DrawSelectionOverlayModifier(val state: AccessibilityNodeInspectorState) :
+    ModifierNodeElement<DrawSelectionOverlayModifierNode>() {
     override fun create(): DrawSelectionOverlayModifierNode =
         DrawSelectionOverlayModifierNode(state)
 
@@ -309,9 +303,8 @@
     override fun InspectorInfo.inspectableProperties() {}
 }
 
-private class DrawSelectionOverlayModifierNode(
-    val state: AccessibilityNodeInspectorState
-) : Modifier.Node(), DrawModifierNode {
+private class DrawSelectionOverlayModifierNode(val state: AccessibilityNodeInspectorState) :
+    Modifier.Node(), DrawModifierNode {
     override fun ContentDrawScope.draw() {
         val coords = requireLayoutCoordinates()
         state.nodesUnderCursor.let { nodes ->
@@ -342,19 +335,21 @@
             )
         }
 
-        state.selectionOffset.takeIf { it.isSpecified }?.let { screenOffset ->
-            val localOffset = coords.screenToLocal(screenOffset)
-            drawLine(
-                Color.Red,
-                start = Offset(0f, localOffset.y),
-                end = Offset(size.width, localOffset.y)
-            )
-            drawLine(
-                Color.Red,
-                start = Offset(localOffset.x, 0f),
-                end = Offset(localOffset.x, size.height)
-            )
-        }
+        state.selectionOffset
+            .takeIf { it.isSpecified }
+            ?.let { screenOffset ->
+                val localOffset = coords.screenToLocal(screenOffset)
+                drawLine(
+                    Color.Red,
+                    start = Offset(0f, localOffset.y),
+                    end = Offset(size.width, localOffset.y)
+                )
+                drawLine(
+                    Color.Red,
+                    start = Offset(localOffset.x, 0f),
+                    end = Offset(localOffset.x, size.height)
+                )
+            }
     }
 
     private fun LayoutCoordinates.screenToLocal(rect: IntRect): IntRect {
@@ -392,31 +387,36 @@
     private val pass = PointerEventPass.Initial
 
     @Suppress("unused")
-    private val inputNode = delegate(SuspendingPointerInputModifierNode {
-        // Detect drag gestures but without slop.
-        val layoutCoords = requireLayoutCoordinates()
-        awaitEachGesture {
-            try {
-                val firstChange = awaitFirstDown(pass = pass)
-                state.setNodeCursor(firstChange.position, layoutCoords)
-                onDragStarted?.invoke()
-                firstChange.consume()
+    private val inputNode =
+        delegate(
+            SuspendingPointerInputModifierNode {
+                // Detect drag gestures but without slop.
+                val layoutCoords = requireLayoutCoordinates()
+                awaitEachGesture {
+                    try {
+                        val firstChange = awaitFirstDown(pass = pass)
+                        state.setNodeCursor(firstChange.position, layoutCoords)
+                        onDragStarted?.invoke()
+                        firstChange.consume()
 
-                while (true) {
-                    val event = awaitPointerEvent(pass = pass)
-                    event.changes.fastFirstOrNull { it.id == firstChange.id }?.let { change ->
-                        if (change.changedToUp()) {
-                            return@awaitEachGesture
-                        } else {
-                            state.setNodeCursor(change.position, layoutCoords)
+                        while (true) {
+                            val event = awaitPointerEvent(pass = pass)
+                            event.changes
+                                .fastFirstOrNull { it.id == firstChange.id }
+                                ?.let { change ->
+                                    if (change.changedToUp()) {
+                                        return@awaitEachGesture
+                                    } else {
+                                        state.setNodeCursor(change.position, layoutCoords)
+                                    }
+                                }
                         }
+                    } finally {
+                        state.inspectNodeUnderCursor()
                     }
                 }
-            } finally {
-                state.inspectNodeUnderCursor()
             }
-        }
-    })
+        )
 }
 
 // endregion
@@ -437,11 +437,7 @@
         properties = DialogProperties(usePlatformDefaultWidth = false),
         onDismissRequest = onBack
     ) {
-        InspectorNodeDetails(
-            leafNode = leafNode,
-            onNodeClick = onNodeClick,
-            onBack = onBack
-        )
+        InspectorNodeDetails(leafNode = leafNode, onNodeClick = onNodeClick, onBack = onBack)
     }
 }
 
@@ -455,9 +451,7 @@
         val peekInteractionSource = remember { MutableInteractionSource() }
         val peeking by peekInteractionSource.collectIsPressedAsState()
         Surface(
-            modifier = Modifier
-                .padding(16.dp)
-                .alpha(if (peeking) 0f else 1f),
+            modifier = Modifier.padding(16.dp).alpha(if (peeking) 0f else 1f),
             elevation = 4.dp
         ) {
             Column {
@@ -465,10 +459,7 @@
                     title = { NodeHeader(leafNode) },
                     navigationIcon = {
                         IconButton(onClick = onBack) {
-                            Icon(
-                                Icons.AutoMirrored.Filled.ArrowBack,
-                                contentDescription = null
-                            )
+                            Icon(Icons.AutoMirrored.Filled.ArrowBack, contentDescription = null)
                         }
                     },
                     actions = {
@@ -507,29 +498,27 @@
 }
 
 @Composable
-private fun NodeProperties(
-    node: NodeInfo,
-    onNodeClick: (NodeInfo) -> Unit,
-    modifier: Modifier
-) {
+private fun NodeProperties(node: NodeInfo, onNodeClick: (NodeInfo) -> Unit, modifier: Modifier) {
     SelectionContainer {
         Column(modifier = modifier) {
             NodeAncestorLinks(node, onNodeClick)
 
-            val properties = node.getProperties()
-                .mapValues { (_, v) ->
-                    // Turn references to other nodes into links that actually open those nodes
-                    // in the inspector.
-                    if (v is AccessibilityNodeInfoCompat) {
-                        nodeLinkRepresentation(
-                            node = v,
-                            onClick = { onNodeClick(v.toNodeInfo()) }
-                        )
-                    } else {
-                        PropertyValueRepresentation(v)
+            val properties =
+                node
+                    .getProperties()
+                    .mapValues { (_, v) ->
+                        // Turn references to other nodes into links that actually open those nodes
+                        // in the inspector.
+                        if (v is AccessibilityNodeInfoCompat) {
+                            nodeLinkRepresentation(
+                                node = v,
+                                onClick = { onNodeClick(v.toNodeInfo()) }
+                            )
+                        } else {
+                            PropertyValueRepresentation(v)
+                        }
                     }
-                }
-                .toList()
+                    .toList()
             KeyValueView(
                 elements = properties,
                 modifier = Modifier.padding(horizontal = 16.dp, vertical = 8.dp),
@@ -542,19 +531,22 @@
 private fun NodeAncestorLinks(node: NodeInfo, onNodeClick: (NodeInfo) -> Unit) {
     val ancestors = remember(node) { node.selfAndAncestorsToList().dropLast(1) }
     if (ancestors.isNotEmpty()) {
-        val ancestorLinks = remember(ancestors) {
-            buildAnnotatedString {
-                ancestors.fastForEachIndexed { index, ancestorNode ->
-                    withLink(LinkAnnotation.Clickable("ancestor") { onNodeClick(ancestorNode) }) {
-                        append(ancestorNode.nodeInfo.parseClassPackageAndName().second)
-                    }
+        val ancestorLinks =
+            remember(ancestors) {
+                buildAnnotatedString {
+                    ancestors.fastForEachIndexed { index, ancestorNode ->
+                        withLink(
+                            LinkAnnotation.Clickable("ancestor") { onNodeClick(ancestorNode) }
+                        ) {
+                            append(ancestorNode.nodeInfo.parseClassPackageAndName().second)
+                        }
 
-                    if (index < ancestors.size - 1) {
-                        append(" > ")
+                        if (index < ancestors.size - 1) {
+                            append(" > ")
+                        }
                     }
                 }
             }
-        }
 
         Surface(
             color = MaterialTheme.colors.primarySurface.copy(alpha = 0.5f),
@@ -565,16 +557,12 @@
     }
 }
 
-private fun nodeLinkRepresentation(
-    node: AccessibilityNodeInfoCompat,
-    onClick: () -> Unit
-) = PropertyValueRepresentation(
-    buildAnnotatedString {
-        withLink(LinkAnnotation.Clickable("node") { onClick() }) {
-            append(node.className)
+private fun nodeLinkRepresentation(node: AccessibilityNodeInfoCompat, onClick: () -> Unit) =
+    PropertyValueRepresentation(
+        buildAnnotatedString {
+            withLink(LinkAnnotation.Clickable("node") { onClick() }) { append(node.className) }
         }
-    }
-)
+    )
 
 /**
  * Shows a table of keys and their values. Values are rendered using [PropertyValueRepresentation].
@@ -584,13 +572,8 @@
     elements: List<Pair<String, PropertyValueRepresentation>>,
     modifier: Modifier = Modifier,
 ) {
-    Column(
-        modifier = modifier,
-        verticalArrangement = spacedBy(8.dp)
-    ) {
-        elements.forEach { (name, valueRepresentation) ->
-            KeyValueRow(name, valueRepresentation)
-        }
+    Column(modifier = modifier, verticalArrangement = spacedBy(8.dp)) {
+        elements.forEach { (name, valueRepresentation) -> KeyValueRow(name, valueRepresentation) }
     }
 }
 
@@ -639,17 +622,18 @@
     var nestingIndicator: Pair<Offset, Offset>? by remember { mutableStateOf(null) }
 
     Layout(
-        modifier = Modifier.drawBehind {
-            nestingIndicator?.let { (start, end) ->
-                drawLine(
-                    start = start,
-                    end = end,
-                    color = Color.Gray,
-                    alpha = 0.3f,
-                    strokeWidth = 1.dp.toPx(),
-                )
-            }
-        },
+        modifier =
+            Modifier.drawBehind {
+                nestingIndicator?.let { (start, end) ->
+                    drawLine(
+                        start = start,
+                        end = end,
+                        color = Color.Gray,
+                        alpha = 0.3f,
+                        strokeWidth = 1.dp.toPx(),
+                    )
+                }
+            },
         content = {
             Row(content = keyContent)
             Row(content = valueContent)
@@ -660,30 +644,32 @@
             val keyConstraints = constraints.copy(minWidth = 0, minHeight = 0)
             // contentPadding will either act as the spacing between items if they fit on the same
             // line, or indent if content wraps, so inset the constraints either way.
-            val valueConstraints = constraints.copy(minWidth = 0, minHeight = 0)
-                .offset(horizontal = -contentPaddingPx)
+            val valueConstraints =
+                constraints.copy(minWidth = 0, minHeight = 0).offset(horizontal = -contentPaddingPx)
             val keyPlaceable = keyMeasurable.measure(keyConstraints)
             val valuePlaceable = valueMeasurable.measure(valueConstraints)
             val wrap =
                 keyPlaceable.width + contentPaddingPx + valuePlaceable.width > constraints.maxWidth
 
             val totalWidth = constraints.maxWidth
-            val totalHeight = if (wrap) {
-                keyPlaceable.height + valuePlaceable.height
-            } else {
-                maxOf(keyPlaceable.height, valuePlaceable.height)
-            }
+            val totalHeight =
+                if (wrap) {
+                    keyPlaceable.height + valuePlaceable.height
+                } else {
+                    maxOf(keyPlaceable.height, valuePlaceable.height)
+                }
 
             // Only draw the nesting indicator if the value filled its max width, which indicates it
             // will probably be taller, and harder to track the start edge visually.
-            nestingIndicator = if (wrap && valuePlaceable.width == valueConstraints.maxWidth) {
-                Pair(
-                    Offset(contentPaddingPx / 2f, keyPlaceable.height.toFloat()),
-                    Offset(contentPaddingPx / 2f, totalHeight.toFloat())
-                )
-            } else {
-                null
-            }
+            nestingIndicator =
+                if (wrap && valuePlaceable.width == valueConstraints.maxWidth) {
+                    Pair(
+                        Offset(contentPaddingPx / 2f, keyPlaceable.height.toFloat()),
+                        Offset(contentPaddingPx / 2f, totalHeight.toFloat())
+                    )
+                } else {
+                    null
+                }
 
             layout(totalWidth, totalHeight) {
                 val valueX = totalWidth - valuePlaceable.width
@@ -693,16 +679,18 @@
                     valuePlaceable.placeRelative(valueX, keyPlaceable.height)
                 } else {
                     // Arrange horizontally.
-                    val keyY = Alignment.CenterVertically.align(
-                        size = keyPlaceable.height,
-                        space = totalHeight
-                    )
+                    val keyY =
+                        Alignment.CenterVertically.align(
+                            size = keyPlaceable.height,
+                            space = totalHeight
+                        )
                     keyPlaceable.placeRelative(0, keyY)
 
-                    val valueY = Alignment.CenterVertically.align(
-                        size = valuePlaceable.height,
-                        space = totalHeight
-                    )
+                    val valueY =
+                        Alignment.CenterVertically.align(
+                            size = valuePlaceable.height,
+                            space = totalHeight
+                        )
                     valuePlaceable.placeRelative(valueX, valueY)
                 }
             }
@@ -729,7 +717,6 @@
 private fun PropertyValueRepresentation(value: Any?): PropertyValueRepresentation =
     when (value) {
         is CharSequence -> PropertyValueRepresentation(value.toFormattedDebugString())
-
         is Iterable<*> -> {
             val valueType = value.javaClass.canonicalName ?: value.javaClass.name
             // No isEmpty on iterable.
@@ -739,14 +726,15 @@
                 PropertyValueRepresentation(AnnotatedString(value.toString())) {
                     Column {
                         Text(valueType, style = ValueTypeTextStyle)
-                        KeyValueView(value.mapIndexed { index, element ->
-                            Pair("[$index]", PropertyValueRepresentation(element))
-                        })
+                        KeyValueView(
+                            value.mapIndexed { index, element ->
+                                Pair("[$index]", PropertyValueRepresentation(element))
+                            }
+                        )
                     }
                 }
             }
         }
-
         is Map<*, *> -> {
             val valueType = value.javaClass.canonicalName ?: value.javaClass.name
             if (value.isEmpty()) {
@@ -755,50 +743,43 @@
                 PropertyValueRepresentation(AnnotatedString(value.toString())) {
                     Column {
                         Text(valueType, style = ValueTypeTextStyle)
-                        KeyValueView(value.entries.map { (key, value) ->
-                            Pair(key.toString(), PropertyValueRepresentation(value))
-                        })
+                        KeyValueView(
+                            value.entries.map { (key, value) ->
+                                Pair(key.toString(), PropertyValueRepresentation(value))
+                            }
+                        )
                     }
                 }
             }
         }
-
         is Bundle -> {
             if (value.isEmpty) {
                 PropertyValueRepresentation(
-                    AnnotatedString(
-                        "empty Bundle",
-                        SpanStyle(fontStyle = FontStyle.Italic)
-                    )
+                    AnnotatedString("empty Bundle", SpanStyle(fontStyle = FontStyle.Italic))
                 )
             } else {
                 PropertyValueRepresentation(AnnotatedString(value.toString())) {
-                    KeyValueView(value.keySet().map { key ->
-                        @Suppress("DEPRECATION")
-                        val rawValue = value.get(key)
-                        Pair(key, PropertyValueRepresentation(rawValue))
-                    })
+                    KeyValueView(
+                        value.keySet().map { key ->
+                            @Suppress("DEPRECATION") val rawValue = value.get(key)
+                            Pair(key, PropertyValueRepresentation(rawValue))
+                        }
+                    )
                 }
             }
         }
-
         else -> PropertyValueRepresentation(AnnotatedString(value.toString()))
     }
 
-/**
- * Returns the package and simple name parts of a FQCN by splitting at the last '.' character.
- */
+/** Returns the package and simple name parts of a FQCN by splitting at the last '.' character. */
 private fun AccessibilityNodeInfoCompat.parseClassPackageAndName(): Pair<String, String> {
     val separatorIndex = className.indexOfLast { it == '.' }
-    return Pair(
-        className.substring(0, separatorIndex),
-        className.substring(separatorIndex + 1)
-    )
+    return Pair(className.substring(0, separatorIndex), className.substring(separatorIndex + 1))
 }
 
 /**
- * A column of expandable headers. Only one header can be expanded at a time. To create an item
- * call [AccordionScope.item] in [content].
+ * A column of expandable headers. Only one header can be expanded at a time. To create an item call
+ * [AccordionScope.item] in [content].
  */
 @Composable
 private fun Accordion(
@@ -818,9 +799,7 @@
                 headerHeight = 40.dp,
                 isExpanded = isItemSelected,
                 shrinkHeader = !isItemSelected && isSelectedIndexValid,
-                onHeaderClick = {
-                    onSelectIndex(if (selectedIndex == index) -1 else index)
-                },
+                onHeaderClick = { onSelectIndex(if (selectedIndex == index) -1 else index) },
             )
             if (index < items.size - 1) {
                 Divider()
@@ -845,26 +824,22 @@
     val headerScale by animateFloatAsState(if (shrinkHeader) 0.8f else 1f, label = "headerScale")
     Row(
         verticalAlignment = Alignment.CenterVertically,
-        modifier = Modifier
-            .height { (headerHeight * headerScale).roundToPx() }
-            .fillMaxWidth()
-            .selectable(selected = isExpanded, onClick = onHeaderClick)
-            .graphicsLayer {
-                scaleX = headerScale
-                scaleY = headerScale
-                transformOrigin = TransformOrigin(0f, 0.5f)
-            },
+        modifier =
+            Modifier.height { (headerHeight * headerScale).roundToPx() }
+                .fillMaxWidth()
+                .selectable(selected = isExpanded, onClick = onHeaderClick)
+                .graphicsLayer {
+                    scaleX = headerScale
+                    scaleY = headerScale
+                    transformOrigin = TransformOrigin(0f, 0.5f)
+                },
     ) {
-        val iconRotation by animateFloatAsState(
-            if (isExpanded) 0f else -90f,
-            label = "iconRotation"
-        )
+        val iconRotation by
+            animateFloatAsState(if (isExpanded) 0f else -90f, label = "iconRotation")
         Icon(
             Icons.Filled.ArrowDropDown,
             contentDescription = null,
-            modifier = Modifier.graphicsLayer {
-                rotationZ = iconRotation
-            }
+            modifier = Modifier.graphicsLayer { rotationZ = iconRotation }
         )
         item.header()
     }
@@ -882,10 +857,7 @@
      * Creates an accordion item with a [header] that is always visible, and a [body] that is only
      * visible when the item is expanded.
      */
-    fun item(
-        header: @Composable () -> Unit,
-        body: @Composable () -> Unit
-    )
+    fun item(header: @Composable () -> Unit, body: @Composable () -> Unit)
 }
 
 private data class AccordionItem(
@@ -895,20 +867,17 @@
 
 private fun buildAccordionItems(content: AccordionScope.() -> Unit): List<AccordionItem> {
     return buildList {
-        content(object : AccordionScope {
-            override fun item(
-                header: @Composable () -> Unit,
-                body: @Composable () -> Unit
-            ) {
-                add(AccordionItem(header, body))
+        content(
+            object : AccordionScope {
+                override fun item(header: @Composable () -> Unit, body: @Composable () -> Unit) {
+                    add(AccordionItem(header, body))
+                }
             }
-        })
+        )
     }
 }
 
-/**
- * Sets [key] to [value] in this map if [value] is not [unspecifiedValue] (null by default).
- */
+/** Sets [key] to [value] in this map if [value] is not [unspecifiedValue] (null by default). */
 private fun MutableMap<String, Any?>.setIfSpecified(
     key: String,
     value: Any?,
@@ -919,9 +888,7 @@
     }
 }
 
-/**
- * Sets [key] to [value] in this map if [value] is not [unspecifiedValue] (false by default).
- */
+/** Sets [key] to [value] in this map if [value] is not [unspecifiedValue] (false by default). */
 private fun MutableMap<String, Any?>.setIfSpecified(
     key: String,
     value: Boolean,
@@ -932,9 +899,7 @@
     }
 }
 
-/**
- * Sets [key] to [value] in this map if [value] is not [unspecifiedValue] (0 by default).
- */
+/** Sets [key] to [value] in this map if [value] is not [unspecifiedValue] (0 by default). */
 private fun MutableMap<String, Any?>.setIfSpecified(
     key: String,
     value: Int,
@@ -951,14 +916,12 @@
  * control characters (e.g. `'\n'`) with their stylized literal escape sequences.
  */
 private fun CharSequence.toFormattedDebugString(): AnnotatedString = buildAnnotatedString {
-    val quoteStyle = SpanStyle(
-        color = Color.Gray,
-        fontWeight = FontWeight.Bold
-    )
-    val specialStyle = SpanStyle(
-        color = Color.Red,
-        fontWeight = FontWeight.Bold,
-    )
+    val quoteStyle = SpanStyle(color = Color.Gray, fontWeight = FontWeight.Bold)
+    val specialStyle =
+        SpanStyle(
+            color = Color.Red,
+            fontWeight = FontWeight.Bold,
+        )
 
     withStyle(quoteStyle) { append('"') }
 
@@ -971,9 +934,7 @@
             '\b' -> formattedChar = "\\b"
         }
         if (formattedChar != null) {
-            withStyle(specialStyle) {
-                append(formattedChar)
-            }
+            withStyle(specialStyle) { append(formattedChar) }
         } else {
             append(c)
         }
@@ -984,20 +945,14 @@
 
 // endregion
 
-/**
- * Like the standard [Modifier.width] modifier but the width is only calculated at measure time.
- */
+/** Like the standard [Modifier.width] modifier but the width is only calculated at measure time. */
 private fun Modifier.width(calculateWidth: Density.() -> Int): Modifier =
     layout { measurable, constraints ->
         val calculatedWidth = calculateWidth()
-        val childConstraints = constraints.copy(
-            minWidth = calculatedWidth,
-            maxWidth = calculatedWidth
-        )
+        val childConstraints =
+            constraints.copy(minWidth = calculatedWidth, maxWidth = calculatedWidth)
         val placeable = measurable.measure(childConstraints)
-        layout(placeable.width, placeable.height) {
-            placeable.place(0, 0)
-        }
+        layout(placeable.width, placeable.height) { placeable.place(0, 0) }
     }
 
 /**
@@ -1006,14 +961,10 @@
 private fun Modifier.height(calculateHeight: Density.() -> Int): Modifier =
     layout { measurable, constraints ->
         val calculatedHeight = calculateHeight()
-        val childConstraints = constraints.copy(
-            minHeight = calculatedHeight,
-            maxHeight = calculatedHeight
-        )
+        val childConstraints =
+            constraints.copy(minHeight = calculatedHeight, maxHeight = calculatedHeight)
         val placeable = measurable.measure(childConstraints)
-        layout(placeable.width, placeable.height) {
-            placeable.place(0, 0)
-        }
+        layout(placeable.width, placeable.height) { placeable.place(0, 0) }
     }
 
 // region Accessibility node access
@@ -1031,18 +982,14 @@
 
     DisposableEffect(hostView) {
         val testRoot = hostView as RootForTest
-        onDispose {
-            testRoot.forceAccessibilityForTesting(false)
-        }
+        onDispose { testRoot.forceAccessibilityForTesting(false) }
     }
     return state
 }
 
 /** State holder for an [AccessibilityNodeInspectorButton]. */
-private class AccessibilityNodeInspectorState(
-    private val hostView: View
-) : PopupPositionProvider,
-    View.OnLayoutChangeListener {
+private class AccessibilityNodeInspectorState(private val hostView: View) :
+    PopupPositionProvider, View.OnLayoutChangeListener {
 
     var inspectorWindowSize: IntSize by mutableStateOf(calculateInspectorWindowSize())
         private set
@@ -1075,9 +1022,7 @@
     var highlightedNode: NodeInfo? by mutableStateOf(null)
         private set
 
-    /**
-     * If non-null, the node being shown in the inspector.
-     */
+    /** If non-null, the node being shown in the inspector. */
     var nodeUnderInspection: NodeInfo? by mutableStateOf(null)
         private set
 
@@ -1093,14 +1038,10 @@
         highlightedNode = nodesUnderCursor.lastOrNull()
     }
 
-    /**
-     * Opens the node under the selection cursor in the inspector and dumps it to logcat.
-     */
+    /** Opens the node under the selection cursor in the inspector and dumps it to logcat. */
     fun inspectNodeUnderCursor() {
         selectionOffset = Offset.Unspecified
-        nodeUnderInspection = highlightedNode?.also {
-            it.dumpToLog(tag = LogTag)
-        }
+        nodeUnderInspection = highlightedNode?.also { it.dumpToLog(tag = LogTag) }
     }
 
     /**
@@ -1111,21 +1052,15 @@
         highlightedNode = node
         nodesUnderCursor = node?.selfAndAncestorsToList() ?: emptyList()
         nodeUnderInspection = node
-        node?.also {
-            it.dumpToLog(tag = LogTag)
-        }
+        node?.also { it.dumpToLog(tag = LogTag) }
     }
 
-    /**
-     * Hides the inspector dialog to allow the user to select a different node.
-     */
+    /** Hides the inspector dialog to allow the user to select a different node. */
     fun hideInspector() {
         nodeUnderInspection = null
     }
 
-    /**
-     * Runs any coroutine effects the state holder requires while it's connected to some UI.
-     */
+    /** Runs any coroutine effects the state holder requires while it's connected to some UI. */
     suspend fun runWhileDisplayed() {
         service.initialize()
 
@@ -1164,9 +1099,9 @@
     ): IntOffset = IntOffset.Zero
 
     private fun calculateInspectorWindowSize(): IntSize {
-        return Rect().also {
-            hostView.getWindowVisibleDisplayFrame(it)
-        }.let { IntSize(it.width(), it.height()) }
+        return Rect()
+            .also { hostView.getWindowVisibleDisplayFrame(it) }
+            .let { IntSize(it.width(), it.height()) }
     }
 }
 
@@ -1260,22 +1195,16 @@
 private val AccessibilityNodeInfoCompat.extrasWithoutExtraData: Bundle
     get() {
         val extras = Bundle(extras)
-        availableExtraData.forEach {
-            extras.remove(it)
-        }
+        availableExtraData.forEach { extras.remove(it) }
         return extras
     }
 
 /** Class verification helper for reading extras data from an [AccessibilityNodeInfo]. */
 @RequiresApi(26)
 private object AccessibilityNodeInfoHelper {
-    fun readExtraData(
-        node: AccessibilityNodeInfo,
-        key: String
-    ): Any? {
+    fun readExtraData(node: AccessibilityNodeInfo, key: String): Any? {
         if (key in node.availableExtraData && node.refreshWithExtraData(key, Bundle())) {
-            @Suppress("DEPRECATION")
-            return node.extras.get(key)
+            @Suppress("DEPRECATION") return node.extras.get(key)
         } else {
             return null
         }
@@ -1284,6 +1213,7 @@
 
 private interface InspectableTreeProvider {
     fun initialize() {}
+
     fun findNodesAt(screenOffset: Offset): List<NodeInfo>
 }
 
@@ -1292,9 +1222,8 @@
 }
 
 @RequiresApi(34)
-private class AccessibilityTreeInspectorApi34(
-    private val rootView: View
-) : InspectableTreeProvider {
+private class AccessibilityTreeInspectorApi34(private val rootView: View) :
+    InspectableTreeProvider {
 
     private val matrixCache = Matrix()
 
@@ -1364,10 +1293,11 @@
     }
 }
 
-private fun AccessibilityNodeInfoCompat.toNodeInfo(): NodeInfo = NodeInfo(
-    nodeInfo = this,
-    boundsInScreen = Rect().also(::getBoundsInScreen).toComposeIntRect(),
-)
+private fun AccessibilityNodeInfoCompat.toNodeInfo(): NodeInfo =
+    NodeInfo(
+        nodeInfo = this,
+        boundsInScreen = Rect().also(::getBoundsInScreen).toComposeIntRect(),
+    )
 
 private fun NodeInfo.dumpToLog(tag: String) {
     val indent = "  "
diff --git a/compose/integration-tests/demos/src/main/java/androidx/compose/integration/demos/DemoActivity.kt b/compose/integration-tests/demos/src/main/java/androidx/compose/integration/demos/DemoActivity.kt
index c409211..6210ebe 100644
--- a/compose/integration-tests/demos/src/main/java/androidx/compose/integration/demos/DemoActivity.kt
+++ b/compose/integration-tests/demos/src/main/java/androidx/compose/integration/demos/DemoActivity.kt
@@ -61,8 +61,8 @@
 /**
  * Main [Activity] containing all Compose related demos.
  *
- * You can pass a specific demo's name as string extra "demoname" to launch this demo only.
- * Read this module's readme to learn more!
+ * You can pass a specific demo's name as string extra "demoname" to launch this demo only. Read
+ * this module's readme to learn more!
  */
 @Suppress("DEPRECATION")
 class DemoActivity : FragmentActivity() {
@@ -72,75 +72,76 @@
     override fun onCreate(savedInstanceState: Bundle?) {
         super.onCreate(savedInstanceState)
 
-        val rootDemo = when (val demoName = intent.getStringExtra(DEMO_NAME)) {
-            null -> AllDemosCategory
-            else -> requireDemo(demoName, Navigator.findDemo(AllDemosCategory, demoName))
-        }
-
-        ComposeView(this).also {
-            setContentView(it)
-        }.setContent {
-            hostView = LocalView.current
-            focusManager = LocalFocusManager.current
-            val activityStarter = fun(demo: ActivityDemo<*>) {
-                startActivity(Intent(this, demo.activityClass.java))
-            }
-            val navigator = rememberSaveable(
-                saver = Navigator.Saver(rootDemo, onBackPressedDispatcher, activityStarter)
-            ) {
-                Navigator(rootDemo, onBackPressedDispatcher, activityStarter)
+        val rootDemo =
+            when (val demoName = intent.getStringExtra(DEMO_NAME)) {
+                null -> AllDemosCategory
+                else -> requireDemo(demoName, Navigator.findDemo(AllDemosCategory, demoName))
             }
 
-            SoftInputModeEffect(SoftInputModeSetting.asState().value, window)
-            DecorFitsSystemWindowsEffect(
-                DecorFitsSystemWindowsSetting.asState().value,
-                hostView,
-                window
-            )
-
-            CompositionLocalProvider(
-                LocalLayoutDirection provides LayoutDirectionSetting.asState().value,
-            ) {
-                DemoTheme(DynamicThemeSetting.asState().value, this.hostView, window) {
-                    val filteringMode = rememberSaveable(
-                        saver = FilterMode.Saver(onBackPressedDispatcher)
-                    ) {
-                        FilterMode(onBackPressedDispatcher)
+        ComposeView(this)
+            .also { setContentView(it) }
+            .setContent {
+                hostView = LocalView.current
+                focusManager = LocalFocusManager.current
+                val activityStarter =
+                    fun(demo: ActivityDemo<*>) {
+                        startActivity(Intent(this, demo.activityClass.java))
                     }
-                    val onStartFiltering = { filteringMode.isFiltering = true }
-                    val onEndFiltering = { filteringMode.isFiltering = false }
-                    DemoApp(
-                        currentDemo = navigator.currentDemo,
-                        backStackTitle = navigator.backStackTitle,
-                        isFiltering = filteringMode.isFiltering,
-                        onStartFiltering = onStartFiltering,
-                        onEndFiltering = onEndFiltering,
-                        onNavigateToDemo = { demo ->
-                            if (filteringMode.isFiltering) {
-                                onEndFiltering()
-                                navigator.popAll()
+                val navigator =
+                    rememberSaveable(
+                        saver = Navigator.Saver(rootDemo, onBackPressedDispatcher, activityStarter)
+                    ) {
+                        Navigator(rootDemo, onBackPressedDispatcher, activityStarter)
+                    }
+
+                SoftInputModeEffect(SoftInputModeSetting.asState().value, window)
+                DecorFitsSystemWindowsEffect(
+                    DecorFitsSystemWindowsSetting.asState().value,
+                    hostView,
+                    window
+                )
+
+                CompositionLocalProvider(
+                    LocalLayoutDirection provides LayoutDirectionSetting.asState().value,
+                ) {
+                    DemoTheme(DynamicThemeSetting.asState().value, this.hostView, window) {
+                        val filteringMode =
+                            rememberSaveable(saver = FilterMode.Saver(onBackPressedDispatcher)) {
+                                FilterMode(onBackPressedDispatcher)
                             }
-                            navigator.navigateTo(demo)
-                        },
-                        canNavigateUp = !navigator.isRoot,
-                        onNavigateUp = {
-                            onBackPressed()
-                        },
-                        launchSettings = {
-                            startActivity(Intent(this, DemoSettingsActivity::class.java))
-                        }
-                    )
+                        val onStartFiltering = { filteringMode.isFiltering = true }
+                        val onEndFiltering = { filteringMode.isFiltering = false }
+                        DemoApp(
+                            currentDemo = navigator.currentDemo,
+                            backStackTitle = navigator.backStackTitle,
+                            isFiltering = filteringMode.isFiltering,
+                            onStartFiltering = onStartFiltering,
+                            onEndFiltering = onEndFiltering,
+                            onNavigateToDemo = { demo ->
+                                if (filteringMode.isFiltering) {
+                                    onEndFiltering()
+                                    navigator.popAll()
+                                }
+                                navigator.navigateTo(demo)
+                            },
+                            canNavigateUp = !navigator.isRoot,
+                            onNavigateUp = { onBackPressed() },
+                            launchSettings = {
+                                startActivity(Intent(this, DemoSettingsActivity::class.java))
+                            }
+                        )
+                    }
                 }
             }
-        }
     }
 
     companion object {
         const val DEMO_NAME = "demoname"
 
-        internal fun requireDemo(demoName: String, demo: Demo?) = requireNotNull(demo) {
-            "No demo called \"$demoName\" could be found. Note substring matches are allowed."
-        }
+        internal fun requireDemo(demoName: String, demo: Demo?) =
+            requireNotNull(demo) {
+                "No demo called \"$demoName\" could be found. Note substring matches are allowed."
+            }
     }
 }
 
@@ -171,7 +172,8 @@
     MaterialTheme(colorScheme = colorScheme, content = content)
 }
 
-private class Navigator private constructor(
+private class Navigator
+private constructor(
     private val backDispatcher: OnBackPressedDispatcher,
     private val launchActivityDemo: (ActivityDemo<*>) -> Unit,
     private val rootDemo: Demo,
@@ -184,14 +186,16 @@
         launchActivityDemo: (ActivityDemo<*>) -> Unit
     ) : this(backDispatcher, launchActivityDemo, rootDemo, rootDemo, mutableListOf<Demo>())
 
-    private val onBackPressed = object : OnBackPressedCallback(false) {
-        override fun handleOnBackPressed() {
-            popBackStack()
-        }
-    }.apply {
-        isEnabled = !isRoot
-        backDispatcher.addCallback(this)
-    }
+    private val onBackPressed =
+        object : OnBackPressedCallback(false) {
+                override fun handleOnBackPressed() {
+                    popBackStack()
+                }
+            }
+            .apply {
+                isEnabled = !isRoot
+                backDispatcher.addCallback(this)
+            }
 
     private var _currentDemo by mutableStateOf(initialDemo)
     var currentDemo: Demo
@@ -201,11 +205,11 @@
             onBackPressed.isEnabled = !isRoot
         }
 
-    val isRoot: Boolean get() = backStack.isEmpty()
+    val isRoot: Boolean
+        get() = backStack.isEmpty()
 
     val backStackTitle: String
-        get() =
-            (backStack.drop(1) + currentDemo).joinToString(separator = " > ") { it.title }
+        get() = (backStack.drop(1) + currentDemo).joinToString(separator = " > ") { it.title }
 
     fun navigateTo(demo: Demo) {
         if (demo is ActivityDemo<*>) {
@@ -232,19 +236,21 @@
             rootDemo: Demo,
             backDispatcher: OnBackPressedDispatcher,
             launchActivityDemo: (ActivityDemo<*>) -> Unit
-        ): Saver<Navigator, *> = listSaver<Navigator, String>(
-            save = { navigator ->
-                (navigator.backStack + navigator.currentDemo).map { it.title }
-            },
-            restore = { restored ->
-                require(restored.isNotEmpty()) { "no restored items" }
-                val backStack = restored.mapTo(mutableListOf()) {
-                    requireNotNull(findDemo(rootDemo, it, exact = true)) { "no root demo" }
+        ): Saver<Navigator, *> =
+            listSaver<Navigator, String>(
+                save = { navigator ->
+                    (navigator.backStack + navigator.currentDemo).map { it.title }
+                },
+                restore = { restored ->
+                    require(restored.isNotEmpty()) { "no restored items" }
+                    val backStack =
+                        restored.mapTo(mutableListOf()) {
+                            requireNotNull(findDemo(rootDemo, it, exact = true)) { "no root demo" }
+                        }
+                    val initial = backStack.removeAt(backStack.lastIndex)
+                    Navigator(backDispatcher, launchActivityDemo, rootDemo, initial, backStack)
                 }
-                val initial = backStack.removeAt(backStack.lastIndex)
-                Navigator(backDispatcher, launchActivityDemo, rootDemo, initial, backStack)
-            }
-        )
+            )
 
         fun findDemo(demo: Demo, title: String, exact: Boolean = false): Demo? {
             if (exact) {
@@ -258,8 +264,9 @@
             }
             if (demo is DemoCategory) {
                 demo.demos.forEach { child ->
-                    findDemo(child, title, exact)
-                        ?.let { return it }
+                    findDemo(child, title, exact)?.let {
+                        return it
+                    }
                 }
             }
             return null
@@ -271,14 +278,16 @@
 
     private var _isFiltering by mutableStateOf(initialValue)
 
-    private val onBackPressed = object : OnBackPressedCallback(false) {
-        override fun handleOnBackPressed() {
-            isFiltering = false
-        }
-    }.apply {
-        isEnabled = initialValue
-        backDispatcher.addCallback(this)
-    }
+    private val onBackPressed =
+        object : OnBackPressedCallback(false) {
+                override fun handleOnBackPressed() {
+                    isFiltering = false
+                }
+            }
+            .apply {
+                isEnabled = initialValue
+                backDispatcher.addCallback(this)
+            }
 
     var isFiltering
         get() = _isFiltering
@@ -288,9 +297,10 @@
         }
 
     companion object {
-        fun Saver(backDispatcher: OnBackPressedDispatcher) = Saver<FilterMode, Boolean>(
-            save = { it.isFiltering },
-            restore = { FilterMode(backDispatcher, it) }
-        )
+        fun Saver(backDispatcher: OnBackPressedDispatcher) =
+            Saver<FilterMode, Boolean>(
+                save = { it.isFiltering },
+                restore = { FilterMode(backDispatcher, it) }
+            )
     }
 }
diff --git a/compose/integration-tests/demos/src/main/java/androidx/compose/integration/demos/DemoApp.kt b/compose/integration-tests/demos/src/main/java/androidx/compose/integration/demos/DemoApp.kt
index 2643314..ee19108 100644
--- a/compose/integration-tests/demos/src/main/java/androidx/compose/integration/demos/DemoApp.kt
+++ b/compose/integration-tests/demos/src/main/java/androidx/compose/integration/demos/DemoApp.kt
@@ -104,18 +104,12 @@
         },
         modifier = Modifier.nestedScroll(scrollBehavior.nestedScrollConnection)
     ) { innerPadding ->
-        val modifier = Modifier
-            // as scaffold currently doesn't consume - consume what's needed
-            .consumeWindowInsets(innerPadding)
-            .padding(innerPadding)
-        DemoContent(
-            modifier,
-            currentDemo,
-            isFiltering,
-            filterText,
-            onNavigateToDemo,
-            onNavigateUp
-        )
+        val modifier =
+            Modifier
+                // as scaffold currently doesn't consume - consume what's needed
+                .consumeWindowInsets(innerPadding)
+                .padding(innerPadding)
+        DemoContent(modifier, currentDemo, isFiltering, filterText, onNavigateToDemo, onNavigateUp)
     }
 }
 
@@ -178,9 +172,7 @@
             AndroidView(
                 modifier = Modifier.fillMaxSize(),
                 factory = { context ->
-                    view = FragmentContainerView(context).also {
-                        it.id = R.id.fragment_container
-                    }
+                    view = FragmentContainerView(context).also { it.id = R.id.fragment_container }
                     view
                 }
             )
@@ -192,7 +184,8 @@
                     .add(R.id.fragment_container, demo.fragmentClass.java, null, null)
                     .commit()
                 onDispose {
-                    fm.beginTransaction().remove(fm.findFragmentById(R.id.fragment_container)!!)
+                    fm.beginTransaction()
+                        .remove(fm.findFragmentById(R.id.fragment_container)!!)
                         .commit()
                 }
             }
@@ -207,9 +200,7 @@
         category.demos.forEach { demo ->
             ListItem(onClick = { onNavigate(demo) }) {
                 Text(
-                    modifier = Modifier
-                        .height(56.dp)
-                        .wrapContentSize(Alignment.Center),
+                    modifier = Modifier.height(56.dp).wrapContentSize(Alignment.Center),
                     text = demo.title
                 )
             }
@@ -240,9 +231,7 @@
         )
     } else {
         TopAppBar(
-            title = {
-                Text(title, Modifier.testTag(Tags.AppBarTitle))
-            },
+            title = { Text(title, Modifier.testTag(Tags.AppBarTitle)) },
             scrollBehavior = scrollBehavior,
             navigationIcon = navigationIcon,
             actions = {
@@ -257,17 +246,13 @@
 private object AppBarIcons {
     @Composable
     fun Back(onClick: () -> Unit) {
-        IconButton(onClick = onClick) {
-            Icon(Icons.AutoMirrored.Filled.ArrowBack, null)
-        }
+        IconButton(onClick = onClick) { Icon(Icons.AutoMirrored.Filled.ArrowBack, null) }
     }
 
     @Composable
     fun AccessibilityNodeInspector() {
         AccessibilityNodeInspectorButton {
-            IconButton(onClick = {}) {
-                Icon(Icons.Filled.Api, contentDescription = null)
-            }
+            IconButton(onClick = {}) { Icon(Icons.Filled.Api, contentDescription = null) }
         }
     }
 
@@ -280,9 +265,7 @@
 
     @Composable
     fun Settings(onClick: () -> Unit) {
-        IconButton(onClick = onClick) {
-            Icon(Icons.Filled.Settings, null)
-        }
+        IconButton(onClick = onClick) { Icon(Icons.Filled.Settings, null) }
     }
 }
 
@@ -300,5 +283,7 @@
             .padding(horizontal = 16.dp)
             .wrapContentHeight(Alignment.CenterVertically),
         contentAlignment = Alignment.CenterStart
-    ) { content() }
+    ) {
+        content()
+    }
 }
diff --git a/compose/integration-tests/demos/src/main/java/androidx/compose/integration/demos/DemoFilter.kt b/compose/integration-tests/demos/src/main/java/androidx/compose/integration/demos/DemoFilter.kt
index 8081212..8e8b6dd 100644
--- a/compose/integration-tests/demos/src/main/java/androidx/compose/integration/demos/DemoFilter.kt
+++ b/compose/integration-tests/demos/src/main/java/androidx/compose/integration/demos/DemoFilter.kt
@@ -45,28 +45,21 @@
 import androidx.compose.ui.text.withStyle
 import androidx.compose.ui.unit.dp
 
-/**
- * A scrollable list of [launchableDemos], filtered by [filterText].
- */
+/** A scrollable list of [launchableDemos], filtered by [filterText]. */
 @Composable
 fun DemoFilter(launchableDemos: List<Demo>, filterText: String, onNavigate: (Demo) -> Unit) {
-    val filteredDemos = launchableDemos
-        .filter { it.title.contains(filterText, ignoreCase = true) }
-        .sortedBy { it.title }
+    val filteredDemos =
+        launchableDemos
+            .filter { it.title.contains(filterText, ignoreCase = true) }
+            .sortedBy { it.title }
     LazyColumn {
         items(filteredDemos) { demo ->
-            FilteredDemoListItem(
-                demo,
-                filterText = filterText,
-                onNavigate = onNavigate
-            )
+            FilteredDemoListItem(demo, filterText = filterText, onNavigate = onNavigate)
         }
     }
 }
 
-/**
- * [TopAppBar] with a text field allowing filtering all the demos.
- */
+/** [TopAppBar] with a text field allowing filtering all the demos. */
 @OptIn(ExperimentalMaterial3Api::class)
 @Composable
 fun FilterAppBar(
@@ -76,25 +69,13 @@
     scrollBehavior: TopAppBarScrollBehavior
 ) {
     TopAppBar(
-        navigationIcon = {
-            IconButton(onClick = onClose) {
-                Icon(Icons.Filled.Close, null)
-            }
-        },
-        title = {
-            FilterField(
-                filterText,
-                onFilter,
-                Modifier.fillMaxWidth()
-            )
-        },
+        navigationIcon = { IconButton(onClick = onClose) { Icon(Icons.Filled.Close, null) } },
+        title = { FilterField(filterText, onFilter, Modifier.fillMaxWidth()) },
         scrollBehavior = scrollBehavior
     )
 }
 
-/**
- * [TextField] that edits the current [filterText], providing [onFilter] when edited.
- */
+/** [TextField] that edits the current [filterText], providing [onFilter] when edited. */
 @Composable
 @OptIn(ExperimentalMaterial3Api::class)
 private fun FilterField(
@@ -110,7 +91,7 @@
     )
     DisposableEffect(focusRequester) {
         focusRequester.requestFocus()
-        onDispose { }
+        onDispose {}
     }
 }
 
@@ -118,11 +99,7 @@
  * [ListItem] that displays a [demo] and highlights any matches for [filterText] inside [Demo.title]
  */
 @Composable
-private fun FilteredDemoListItem(
-    demo: Demo,
-    filterText: String,
-    onNavigate: (Demo) -> Unit
-) {
+private fun FilteredDemoListItem(demo: Demo, filterText: String, onNavigate: (Demo) -> Unit) {
     val primary = MaterialTheme.colorScheme.primary
     val annotatedString = buildAnnotatedString {
         val title = demo.title
@@ -134,9 +111,7 @@
                 append(title.substring(currentIndex, index))
                 currentIndex = index
             }
-            withStyle(SpanStyle(color = primary)) {
-                append(result.value)
-            }
+            withStyle(SpanStyle(color = primary)) { append(result.value) }
             currentIndex = result.range.last + 1
         }
         if (currentIndex <= title.lastIndex) {
@@ -144,12 +119,9 @@
         }
     }
     key(demo.title) {
-        ListItem(
-            onClick = { onNavigate(demo) }) {
+        ListItem(onClick = { onNavigate(demo) }) {
             Text(
-                modifier = Modifier
-                    .height(56.dp)
-                    .wrapContentSize(Alignment.Center),
+                modifier = Modifier.height(56.dp).wrapContentSize(Alignment.Center),
                 text = annotatedString
             )
         }
diff --git a/compose/integration-tests/demos/src/main/java/androidx/compose/integration/demos/DemoSettingsActivity.kt b/compose/integration-tests/demos/src/main/java/androidx/compose/integration/demos/DemoSettingsActivity.kt
index 87e5a57..5e2d80c 100644
--- a/compose/integration-tests/demos/src/main/java/androidx/compose/integration/demos/DemoSettingsActivity.kt
+++ b/compose/integration-tests/demos/src/main/java/androidx/compose/integration/demos/DemoSettingsActivity.kt
@@ -27,16 +27,17 @@
 import androidx.preference.PreferenceFragmentCompat
 import androidx.preference.plusAssign
 
-private val allSettings = listOf(
-    LayoutDirectionSetting,
-    DynamicThemeSetting,
-    SoftInputModeSetting,
-    DecorFitsSystemWindowsSetting,
-)
+private val allSettings =
+    listOf(
+        LayoutDirectionSetting,
+        DynamicThemeSetting,
+        SoftInputModeSetting,
+        DecorFitsSystemWindowsSetting,
+    )
 
 /**
- * Shell [AppCompatActivity] around [SettingsFragment], as we need a FragmentActivity subclass
- * to host the [SettingsFragment].
+ * Shell [AppCompatActivity] around [SettingsFragment], as we need a FragmentActivity subclass to
+ * host the [SettingsFragment].
  */
 class DemoSettingsActivity : AppCompatActivity() {
     override fun onCreate(savedInstanceState: Bundle?) {
@@ -52,14 +53,13 @@
             val context = preferenceManager.context
             val screen = preferenceManager.createPreferenceScreen(context)
 
-            val general = PreferenceCategory(context).apply {
-                title = "General options"
-                screen += this
-            }
+            val general =
+                PreferenceCategory(context).apply {
+                    title = "General options"
+                    screen += this
+                }
 
-            allSettings.forEach {
-                general += it.createPreference(context)
-            }
+            allSettings.forEach { general += it.createPreference(context) }
 
             preferenceScreen = screen
         }
diff --git a/compose/integration-tests/demos/src/main/java/androidx/compose/integration/demos/Demos.kt b/compose/integration-tests/demos/src/main/java/androidx/compose/integration/demos/Demos.kt
index a52e2ef..1d6ba12 100644
--- a/compose/integration-tests/demos/src/main/java/androidx/compose/integration/demos/Demos.kt
+++ b/compose/integration-tests/demos/src/main/java/androidx/compose/integration/demos/Demos.kt
@@ -29,22 +29,21 @@
 import androidx.navigation.compose.demos.NavigationDemos
 import androidx.paging.compose.demos.PagingFoundationDemos
 
-/**
- * [DemoCategory] containing all the top level demo categories.
- */
-val AllDemosCategory = DemoCategory(
-    "Jetpack Compose Demos",
-    listOf(
-        AnimationDemos,
-        FoundationDemos,
-        CoreDemos,
-        LayoutDemos,
-        MaterialDemos,
-        Material3Demos,
-        NavigationDemos,
-        PagingFoundationDemos,
-        TextDemos,
-        AccessibilityDemos,
-        PerformanceDemos
+/** [DemoCategory] containing all the top level demo categories. */
+val AllDemosCategory =
+    DemoCategory(
+        "Jetpack Compose Demos",
+        listOf(
+            AnimationDemos,
+            FoundationDemos,
+            CoreDemos,
+            LayoutDemos,
+            MaterialDemos,
+            Material3Demos,
+            NavigationDemos,
+            PagingFoundationDemos,
+            TextDemos,
+            AccessibilityDemos,
+            PerformanceDemos
+        )
     )
-)
diff --git a/compose/integration-tests/demos/src/main/java/androidx/compose/integration/demos/Tags.kt b/compose/integration-tests/demos/src/main/java/androidx/compose/integration/demos/Tags.kt
index 30a34d0..877da26 100644
--- a/compose/integration-tests/demos/src/main/java/androidx/compose/integration/demos/Tags.kt
+++ b/compose/integration-tests/demos/src/main/java/androidx/compose/integration/demos/Tags.kt
@@ -16,9 +16,7 @@
 
 package androidx.compose.integration.demos
 
-/**
- * Tags used for testing
- */
+/** Tags used for testing */
 object Tags {
     const val AppBarTitle = "AppBarTitle"
     const val FilterButton = "FilterButton"
diff --git a/compose/integration-tests/demos/src/main/java/androidx/compose/integration/demos/settings/DecorFitsSystemWindowsSetting.kt b/compose/integration-tests/demos/src/main/java/androidx/compose/integration/demos/settings/DecorFitsSystemWindowsSetting.kt
index c816651..9243b31 100644
--- a/compose/integration-tests/demos/src/main/java/androidx/compose/integration/demos/settings/DecorFitsSystemWindowsSetting.kt
+++ b/compose/integration-tests/demos/src/main/java/androidx/compose/integration/demos/settings/DecorFitsSystemWindowsSetting.kt
@@ -34,21 +34,19 @@
     private const val Key = "decorFitsSystemWindows"
     private const val DefaultValue = true
 
-    override fun createPreference(context: Context) = CheckBoxPreference(context).apply {
-        title = "Decor fits system windows"
-        key = Key
-        summaryOff =
-            "The framework will not fit the content view to the insets and will just pass through" +
-                " the WindowInsetsCompat to the content view.  WindowInsets APIs must be used to" +
-                " add necessary padding. Insets will be animated."
-        summaryOn = "The framework will fit the content view to the insets."
-        setDefaultValue(DefaultValue)
-    }
+    override fun createPreference(context: Context) =
+        CheckBoxPreference(context).apply {
+            title = "Decor fits system windows"
+            key = Key
+            summaryOff =
+                "The framework will not fit the content view to the insets and will just pass through" +
+                    " the WindowInsetsCompat to the content view.  WindowInsets APIs must be used to" +
+                    " add necessary padding. Insets will be animated."
+            summaryOn = "The framework will fit the content view to the insets."
+            setDefaultValue(DefaultValue)
+        }
 
-    @Composable
-    fun asState() = preferenceAsState(Key) {
-        getBoolean(Key, DefaultValue)
-    }
+    @Composable fun asState() = preferenceAsState(Key) { getBoolean(Key, DefaultValue) }
 }
 
 /**
@@ -64,11 +62,8 @@
     DisposableEffect(decorFitsSystemWindows, window) {
         setDecorFitsSystemWindows(window, decorFitsSystemWindows)
         ViewCompat.setOnApplyWindowInsetsListener(view) { _, insets ->
-            if (!decorFitsSystemWindows) WindowInsetsCompat.CONSUMED
-            else insets
+            if (!decorFitsSystemWindows) WindowInsetsCompat.CONSUMED else insets
         }
-        onDispose {
-            setDecorFitsSystemWindows(window, true)
-        }
+        onDispose { setDecorFitsSystemWindows(window, true) }
     }
 }
diff --git a/compose/integration-tests/demos/src/main/java/androidx/compose/integration/demos/settings/DynamicThemeSetting.kt b/compose/integration-tests/demos/src/main/java/androidx/compose/integration/demos/settings/DynamicThemeSetting.kt
index abd57e7..7895ac1 100644
--- a/compose/integration-tests/demos/src/main/java/androidx/compose/integration/demos/settings/DynamicThemeSetting.kt
+++ b/compose/integration-tests/demos/src/main/java/androidx/compose/integration/demos/settings/DynamicThemeSetting.kt
@@ -26,15 +26,17 @@
     private const val IsDynamicThemeOnKey = "material3_isDynamicThemeOn"
     private val IsDynamicThemingAvailable = Build.VERSION.SDK_INT >= Build.VERSION_CODES.S
 
-    override fun createPreference(context: Context) = CheckBoxPreference(context).apply {
-        title = "Dynamic theming (android S+)"
-        isEnabled = IsDynamicThemingAvailable
-        key = IsDynamicThemeOnKey
-        setDefaultValue(IsDynamicThemingAvailable)
-    }
+    override fun createPreference(context: Context) =
+        CheckBoxPreference(context).apply {
+            title = "Dynamic theming (android S+)"
+            isEnabled = IsDynamicThemingAvailable
+            key = IsDynamicThemeOnKey
+            setDefaultValue(IsDynamicThemingAvailable)
+        }
 
     @Composable
-    fun asState() = preferenceAsState(IsDynamicThemeOnKey) {
-        getBoolean(IsDynamicThemeOnKey, IsDynamicThemingAvailable)
-    }
+    fun asState() =
+        preferenceAsState(IsDynamicThemeOnKey) {
+            getBoolean(IsDynamicThemeOnKey, IsDynamicThemingAvailable)
+        }
 }
diff --git a/compose/integration-tests/demos/src/main/java/androidx/compose/integration/demos/settings/LayoutDirectionSetting.kt b/compose/integration-tests/demos/src/main/java/androidx/compose/integration/demos/settings/LayoutDirectionSetting.kt
index 5210632..bbe6d7d 100644
--- a/compose/integration-tests/demos/src/main/java/androidx/compose/integration/demos/settings/LayoutDirectionSetting.kt
+++ b/compose/integration-tests/demos/src/main/java/androidx/compose/integration/demos/settings/LayoutDirectionSetting.kt
@@ -23,28 +23,29 @@
 import androidx.preference.DropDownPreference
 import androidx.preference.Preference.SummaryProvider
 
-/**
- * Setting that determines which soft input mode the demo activity's window is configured with.
- */
+/** Setting that determines which soft input mode the demo activity's window is configured with. */
 internal object LayoutDirectionSetting : DemoSetting<LayoutDirection> {
     private const val Key = "layoutDirection"
 
-    override fun createPreference(context: Context) = DropDownPreference(context).apply {
-        title = "Layout direction"
-        key = Key
-        LayoutDirection.values().map { it.name }.toTypedArray().also {
-            entries = it
-            entryValues = it
+    override fun createPreference(context: Context) =
+        DropDownPreference(context).apply {
+            title = "Layout direction"
+            key = Key
+            LayoutDirection.values()
+                .map { it.name }
+                .toTypedArray()
+                .also {
+                    entries = it
+                    entryValues = it
+                }
+            summaryProvider = SummaryProvider<DropDownPreference> { it.entry }
+            setDefaultValue(Ltr.name)
         }
-        summaryProvider = SummaryProvider<DropDownPreference> {
-            it.entry
-        }
-        setDefaultValue(Ltr.name)
-    }
 
     @Composable
-    fun asState() = preferenceAsState(Key) {
-        val value = getString(Key, Ltr.name) ?: Ltr.name
-        LayoutDirection.valueOf(value)
-    }
+    fun asState() =
+        preferenceAsState(Key) {
+            val value = getString(Key, Ltr.name) ?: Ltr.name
+            LayoutDirection.valueOf(value)
+        }
 }
diff --git a/compose/integration-tests/demos/src/main/java/androidx/compose/integration/demos/settings/PreferenceAsState.kt b/compose/integration-tests/demos/src/main/java/androidx/compose/integration/demos/settings/PreferenceAsState.kt
index 417e47f..ea5e859 100644
--- a/compose/integration-tests/demos/src/main/java/androidx/compose/integration/demos/settings/PreferenceAsState.kt
+++ b/compose/integration-tests/demos/src/main/java/androidx/compose/integration/demos/settings/PreferenceAsState.kt
@@ -35,14 +35,10 @@
  * The state will be automatically updated whenever the shared preference changes.
  */
 @Composable
-internal fun <T> preferenceAsState(
-    key: String,
-    readValue: SharedPreferences.() -> T
-): State<T> {
+internal fun <T> preferenceAsState(key: String, readValue: SharedPreferences.() -> T): State<T> {
     val context = LocalContext.current
-    val sharedPreferences = remember(context) {
-        PreferenceManager.getDefaultSharedPreferences(context)
-    }
+    val sharedPreferences =
+        remember(context) { PreferenceManager.getDefaultSharedPreferences(context) }
     val lifecycle = LocalLifecycleOwner.current.lifecycle
 
     // De-duplicate passing keys explicitly to remembers and effects below.
@@ -57,9 +53,7 @@
                 }
             }
             sharedPreferences.registerOnSharedPreferenceChangeListener(listener)
-            onDispose {
-                sharedPreferences.unregisterOnSharedPreferenceChangeListener(listener)
-            }
+            onDispose { sharedPreferences.unregisterOnSharedPreferenceChangeListener(listener) }
         }
 
         // Also update the value when resumed.
@@ -70,9 +64,7 @@
                 }
             }
             lifecycle.addObserver(obs)
-            onDispose {
-                lifecycle.removeObserver(obs)
-            }
+            onDispose { lifecycle.removeObserver(obs) }
         }
 
         return@key value
diff --git a/compose/integration-tests/demos/src/main/java/androidx/compose/integration/demos/settings/SoftInputModeSetting.kt b/compose/integration-tests/demos/src/main/java/androidx/compose/integration/demos/settings/SoftInputModeSetting.kt
index ca9dffc..cd1422e 100644
--- a/compose/integration-tests/demos/src/main/java/androidx/compose/integration/demos/settings/SoftInputModeSetting.kt
+++ b/compose/integration-tests/demos/src/main/java/androidx/compose/integration/demos/settings/SoftInputModeSetting.kt
@@ -45,34 +45,39 @@
     ),
 }
 
-/**
- * Setting that determines which soft input mode the demo activity's window is configured with.
- */
+/** Setting that determines which soft input mode the demo activity's window is configured with. */
 internal object SoftInputModeSetting : DemoSetting<SoftInputMode> {
     private const val Key = "softInputMode"
 
-    override fun createPreference(context: Context) = DropDownPreference(context).apply {
-        title = "Soft input mode"
-        key = Key
-        SoftInputMode.values().map { it.name }.toTypedArray().also {
-            entries = it
-            entryValues = it
-        }
-        summaryProvider = SummaryProvider<DropDownPreference> {
-            val mode = SoftInputMode.valueOf(value)
-            """
+    override fun createPreference(context: Context) =
+        DropDownPreference(context).apply {
+            title = "Soft input mode"
+            key = Key
+            SoftInputMode.values()
+                .map { it.name }
+                .toTypedArray()
+                .also {
+                    entries = it
+                    entryValues = it
+                }
+            summaryProvider =
+                SummaryProvider<DropDownPreference> {
+                    val mode = SoftInputMode.valueOf(value)
+                    """
                 ${mode.name}
                 ${mode.summary}
-            """.trimIndent()
+            """
+                        .trimIndent()
+                }
+            setDefaultValue(AdjustPan.name)
         }
-        setDefaultValue(AdjustPan.name)
-    }
 
     @Composable
-    fun asState() = preferenceAsState(Key) {
-        val value = getString(Key, AdjustPan.name) ?: AdjustPan.name
-        SoftInputMode.valueOf(value)
-    }
+    fun asState() =
+        preferenceAsState(Key) {
+            val value = getString(Key, AdjustPan.name) ?: AdjustPan.name
+            SoftInputMode.valueOf(value)
+        }
 }
 
 /**
@@ -91,9 +96,7 @@
             // cleared, so wait until the second frame to set it. This is super hacky but no real
             // app should need to dynamically change its soft input mode like we do.
             withFrameMillis {}
-            snapshotFlow { updatedMode }.collect { mode ->
-                window.setSoftInputMode(mode.flagValue)
-            }
+            snapshotFlow { updatedMode }.collect { mode -> window.setSoftInputMode(mode.flagValue) }
         }
     }
 }
diff --git a/compose/integration-tests/docs-snippets/src/main/java/androidx/compose/integration/docs/navigation/Navigation.kt b/compose/integration-tests/docs-snippets/src/main/java/androidx/compose/integration/docs/navigation/Navigation.kt
index 0ac03ae..56c4d6e 100644
--- a/compose/integration-tests/docs-snippets/src/main/java/androidx/compose/integration/docs/navigation/Navigation.kt
+++ b/compose/integration-tests/docs-snippets/src/main/java/androidx/compose/integration/docs/navigation/Navigation.kt
@@ -55,7 +55,6 @@
  *
  * No action required if it's modified.
  */
-
 @Composable
 private fun NavigationSnippet1() {
     val navController = rememberNavController()
@@ -64,8 +63,8 @@
 @Composable
 private fun NavigationSnippet2(navController: NavHostController) {
     NavHost(navController = navController, startDestination = "profile") {
-        composable("profile") { Profile(/*...*/) }
-        composable("friendslist") { FriendsList(/*...*/) }
+        composable("profile") { Profile(/*...*/ ) }
+        composable("friendslist") { FriendsList(/*...*/ ) }
         /*...*/
     }
 }
@@ -74,9 +73,7 @@
     @Composable
     fun Profile(navController: NavController) {
         /*...*/
-        Button(onClick = { navController.navigate("friends") }) {
-            Text(text = "Navigate next")
-        }
+        Button(onClick = { navController.navigate("friends") }) { Text(text = "Navigate next") }
         /*...*/
     }
 }
@@ -96,7 +93,8 @@
         composable(
             "profile/{userId}",
             arguments = listOf(navArgument("userId") { type = NavType.StringType })
-        ) { /*...*/ }
+        ) { /*...*/
+        }
     }
 }
 
@@ -125,10 +123,8 @@
 private fun NavGraphBuilder.NavigationSnippet9(navController: NavHostController) {
     val uri = "https://example.com"
 
-    composable(
-        "profile?id={id}",
-        deepLinks = listOf(navDeepLink { uriPattern = "$uri/{id}" })
-    ) { backStackEntry ->
+    composable("profile?id={id}", deepLinks = listOf(navDeepLink { uriPattern = "$uri/{id}" })) {
+        backStackEntry ->
         Profile(navController, backStackEntry.arguments?.getString("id"))
     }
 }
@@ -137,17 +133,19 @@
 private fun NavigationSnippet10() {
     val id = "exampleId"
     val context = LocalContext.current
-    val deepLinkIntent = Intent(
-        Intent.ACTION_VIEW,
-        "https://example.com/$id".toUri(),
-        context,
-        MyActivity::class.java
-    )
+    val deepLinkIntent =
+        Intent(
+            Intent.ACTION_VIEW,
+            "https://example.com/$id".toUri(),
+            context,
+            MyActivity::class.java
+        )
 
-    val deepLinkPendingIntent: PendingIntent? = TaskStackBuilder.create(context).run {
-        addNextIntentWithParentStack(deepLinkIntent)
-        getPendingIntent(0, PendingIntent.FLAG_UPDATE_CURRENT)
-    }
+    val deepLinkPendingIntent: PendingIntent? =
+        TaskStackBuilder.create(context).run {
+            addNextIntentWithParentStack(deepLinkIntent)
+            getPendingIntent(0, PendingIntent.FLAG_UPDATE_CURRENT)
+        }
 }
 
 @Composable
@@ -166,11 +164,14 @@
                         onClick = {
                             // This is the equivalent to popUpTo the start destination
                             navController.popBackStack(
-                                navController.graph.startDestinationId, false
+                                navController.graph.startDestinationId,
+                                false
                             )
 
-                            // This if check gives us a "singleTop" behavior where we do not create a
-                            // second instance of the composable if we are already on that destination
+                            // This if check gives us a "singleTop" behavior where we do not create
+                            // a
+                            // second instance of the composable if we are already on that
+                            // destination
                             if (currentRoute != screen.route) {
                                 navController.navigate(screen.route)
                             }
@@ -213,25 +214,15 @@
     }
 }
 
-@Composable
-private fun Profile() {
-}
+@Composable private fun Profile() {}
 
-@Composable
-private fun Profile(userId: String?, content: @Composable (String) -> Unit) {
-}
+@Composable private fun Profile(userId: String?, content: @Composable (String) -> Unit) {}
 
-@Composable
-private fun Profile(navController: NavHostController) {
-}
+@Composable private fun Profile(navController: NavHostController) {}
 
-@Composable
-private fun FriendsList() {
-}
+@Composable private fun FriendsList() {}
 
-@Composable
-private fun FriendsList(navController: NavHostController) {
-}
+@Composable private fun FriendsList(navController: NavHostController) {}
 
 @Composable
 private fun Profile(navController: NavHostController, arg: String?) {
@@ -239,7 +230,9 @@
 }
 
 private class MyActivity
+
 private sealed class Screen(val route: String, @StringRes val resourceId: Int) {
     object Profile : Screen("profile", R.string.profile)
+
     object FriendsList : Screen("friendslist", R.string.friends_list)
 }
diff --git a/compose/integration-tests/docs-snippets/src/main/java/androidx/compose/integration/docs/navigation/NavigationResponsiveUi.kt b/compose/integration-tests/docs-snippets/src/main/java/androidx/compose/integration/docs/navigation/NavigationResponsiveUi.kt
index 440795f..ca4426c 100644
--- a/compose/integration-tests/docs-snippets/src/main/java/androidx/compose/integration/docs/navigation/NavigationResponsiveUi.kt
+++ b/compose/integration-tests/docs-snippets/src/main/java/androidx/compose/integration/docs/navigation/NavigationResponsiveUi.kt
@@ -36,76 +36,89 @@
  *
  * No action required if it's modified.
  */
-
 private object NavigationResponsiveUiSnippet1 {
 
-  enum class WindowSizeClass { Compact, Medium, Expanded }
-
-  @Composable
-  fun MyApp(windowSizeClass: WindowSizeClass) {
-    // Select a navigation element based on display size.
-    when (windowSizeClass) {
-      WindowSizeClass.Compact -> { /* Bottom bar */ }
-      WindowSizeClass.Medium -> { /* Rail */ }
-      WindowSizeClass.Expanded -> { /* Persistent drawer */ }
+    enum class WindowSizeClass {
+        Compact,
+        Medium,
+        Expanded
     }
-  }
+
+    @Composable
+    fun MyApp(windowSizeClass: WindowSizeClass) {
+        // Select a navigation element based on display size.
+        when (windowSizeClass) {
+            WindowSizeClass.Compact -> {
+                /* Bottom bar */
+            }
+            WindowSizeClass.Medium -> {
+                /* Rail */
+            }
+            WindowSizeClass.Expanded -> {
+                /* Persistent drawer */
+            }
+        }
+    }
 }
 
 private object NavigationResponsiveUiSnippet2 {
 
-  /* Displays a list of items. */
-  @Composable
-  fun ListOfItems(
-      onItemSelected: (String) -> Unit,
-  ) { /*...*/ }
-
-  /* Displays the detail for an item. */
-  @Composable
-  fun ItemDetail(
-      selectedItemId: String? = null,
-  ) { /*...*/ }
-
-  /* Displays a list and the detail for an item side by side. */
-  @Composable
-  fun ListAndDetail(
-      selectedItemId: String? = null,
-      onItemSelected: (String) -> Unit,
-  ) {
-    Row {
-      ListOfItems(onItemSelected = onItemSelected)
-      ItemDetail(selectedItemId = selectedItemId)
+    /* Displays a list of items. */
+    @Composable
+    fun ListOfItems(
+        onItemSelected: (String) -> Unit,
+    ) {
+        /*...*/
     }
-  }
+
+    /* Displays the detail for an item. */
+    @Composable
+    fun ItemDetail(
+        selectedItemId: String? = null,
+    ) {
+        /*...*/
+    }
+
+    /* Displays a list and the detail for an item side by side. */
+    @Composable
+    fun ListAndDetail(
+        selectedItemId: String? = null,
+        onItemSelected: (String) -> Unit,
+    ) {
+        Row {
+            ListOfItems(onItemSelected = onItemSelected)
+            ItemDetail(selectedItemId = selectedItemId)
+        }
+    }
 }
 
 private object NavigationResponsiveUiSnippet3 {
 
-  @Composable
-  fun ListDetailRoute(
-      // Indicates that the display size is represented by the expanded window size class.
-      isExpandedWindowSize: Boolean = false,
-      // Identifies the item selected from the list. If null, a item has not been selected.
-      selectedItemId: String?,
-  ) {
-    if (isExpandedWindowSize) {
-      ListAndDetail(
-        selectedItemId = selectedItemId,
-        /*...*/
-      )
-    } else {
-      // If the display size cannot accommodate both the list and the item detail,
-      // show one of them based on the user's focus.
-      if (selectedItemId != null) {
-        ItemDetail(
-          selectedItemId = selectedItemId,
-          /*...*/
-        )
-      } else {
-        ListOfItems(/*...*/)
-      }
+    @Composable
+    fun ListDetailRoute(
+        // Indicates that the display size is represented by the expanded window size class.
+        isExpandedWindowSize: Boolean = false,
+        // Identifies the item selected from the list. If null, a item has not been selected.
+        selectedItemId: String?,
+    ) {
+        if (isExpandedWindowSize) {
+            ListAndDetail(
+                selectedItemId = selectedItemId,
+                /*...*/
+            )
+        } else {
+            // If the display size cannot accommodate both the list and the item detail,
+            // show one of them based on the user's focus.
+            if (selectedItemId != null) {
+                ItemDetail(
+                    selectedItemId = selectedItemId,
+                    /*...*/
+                )
+            } else {
+                ListOfItems(/*...*/ )
+            }
+        }
     }
-  }
 }
 
 @Composable
@@ -115,116 +128,110 @@
     selectedItemId: String?,
 ) {
     NavHost(navController = navController, startDestination = "listDetailRoute") {
-      composable("listDetailRoute") {
-        ListDetailRoute(isExpandedWindowSize = isExpandedWindowSize,
-                        selectedItemId = selectedItemId)
-      }
-      /*...*/
+        composable("listDetailRoute") {
+            ListDetailRoute(
+                isExpandedWindowSize = isExpandedWindowSize,
+                selectedItemId = selectedItemId
+            )
+        }
+        /*...*/
     }
 }
 
 private object NavigationResponsiveUiSnippet5 {
 
-  class ListDetailViewModel : ViewModel() {
+    class ListDetailViewModel : ViewModel() {
 
-    data class ListDetailUiState(
-        val selectedItemId: String? = null,
-    )
-
-    private val viewModelState = MutableStateFlow(ListDetailUiState())
-
-    fun onItemSelected(itemId: String) {
-      viewModelState.update {
-        it.copy(selectedItemId = itemId)
-      }
-    }
-  }
-
-  val listDetailViewModel = ListDetailViewModel()
-
-  @Composable
-  fun ListDetailRoute(
-      isExpandedWindowSize: Boolean = false,
-      selectedItemId: String?,
-      onItemSelected: (String) -> Unit = { listDetailViewModel.onItemSelected(it) },
-  ) {
-    if (isExpandedWindowSize) {
-      ListAndDetail(
-        selectedItemId = selectedItemId,
-        onItemSelected = onItemSelected,
-        /*...*/
-      )
-    } else {
-      if (selectedItemId != null) {
-        ItemDetail(
-          selectedItemId = selectedItemId,
-          /*...*/
+        data class ListDetailUiState(
+            val selectedItemId: String? = null,
         )
-      } else {
-        ListOfItems(
-          onItemSelected = onItemSelected,
-          /*...*/
-        )
-      }
+
+        private val viewModelState = MutableStateFlow(ListDetailUiState())
+
+        fun onItemSelected(itemId: String) {
+            viewModelState.update { it.copy(selectedItemId = itemId) }
+        }
     }
-  }
+
+    val listDetailViewModel = ListDetailViewModel()
+
+    @Composable
+    fun ListDetailRoute(
+        isExpandedWindowSize: Boolean = false,
+        selectedItemId: String?,
+        onItemSelected: (String) -> Unit = { listDetailViewModel.onItemSelected(it) },
+    ) {
+        if (isExpandedWindowSize) {
+            ListAndDetail(
+                selectedItemId = selectedItemId,
+                onItemSelected = onItemSelected,
+                /*...*/
+            )
+        } else {
+            if (selectedItemId != null) {
+                ItemDetail(
+                    selectedItemId = selectedItemId,
+                    /*...*/
+                )
+            } else {
+                ListOfItems(
+                    onItemSelected = onItemSelected,
+                    /*...*/
+                )
+            }
+        }
+    }
 }
 
 private object NavigationResponsiveUiSnippet6 {
 
-  class ListDetailViewModel : ViewModel() {
+    class ListDetailViewModel : ViewModel() {
 
-    data class ListDetailUiState(
-        val selectedItemId: String? = null,
-    )
-
-    private val viewModelState = MutableStateFlow(ListDetailUiState())
-
-    fun onItemSelected(itemId: String) {
-      viewModelState.update {
-        it.copy(selectedItemId = itemId)
-      }
-    }
-
-    fun onItemBackPress() {
-      viewModelState.update {
-        it.copy(selectedItemId = null)
-      }
-    }
-  }
-
-  val listDetailViewModel = ListDetailViewModel()
-
-  @Composable
-  fun ListDetailRoute(
-      isExpandedWindowSize: Boolean = false,
-      selectedItemId: String?,
-      onItemSelected: (String) -> Unit = { listDetailViewModel.onItemSelected(it) },
-      onItemBackPress: () -> Unit = { listDetailViewModel.onItemBackPress() },
-  ) {
-    if (isExpandedWindowSize) {
-      ListAndDetail(
-        selectedItemId = selectedItemId,
-        onItemSelected = onItemSelected,
-        /*...*/
-      )
-    } else {
-      if (selectedItemId != null) {
-        ItemDetail(
-          selectedItemId = selectedItemId,
-          /*...*/
+        data class ListDetailUiState(
+            val selectedItemId: String? = null,
         )
-        BackHandler {
-          onItemBackPress()
+
+        private val viewModelState = MutableStateFlow(ListDetailUiState())
+
+        fun onItemSelected(itemId: String) {
+            viewModelState.update { it.copy(selectedItemId = itemId) }
         }
-      } else {
-        ListOfItems(
-          onItemSelected = onItemSelected,
-          /*...*/
-        )
-      }
+
+        fun onItemBackPress() {
+            viewModelState.update { it.copy(selectedItemId = null) }
+        }
     }
-  }
+
+    val listDetailViewModel = ListDetailViewModel()
+
+    @Composable
+    fun ListDetailRoute(
+        isExpandedWindowSize: Boolean = false,
+        selectedItemId: String?,
+        onItemSelected: (String) -> Unit = { listDetailViewModel.onItemSelected(it) },
+        onItemBackPress: () -> Unit = { listDetailViewModel.onItemBackPress() },
+    ) {
+        if (isExpandedWindowSize) {
+            ListAndDetail(
+                selectedItemId = selectedItemId,
+                onItemSelected = onItemSelected,
+                /*...*/
+            )
+        } else {
+            if (selectedItemId != null) {
+                ItemDetail(
+                    selectedItemId = selectedItemId,
+                    /*...*/
+                )
+                BackHandler { onItemBackPress() }
+            } else {
+                ListOfItems(
+                    onItemSelected = onItemSelected,
+                    /*...*/
+                )
+            }
+        }
+    }
 }
 
 @Composable
@@ -234,34 +241,37 @@
     selectedItemId: String?,
 ) {
     NavHost(navController = navController, startDestination = "listDetailRoute") {
-      composable("listDetailRoute") {
-        ListDetailRoute(isExpandedWindowSize = isExpandedWindowSize,
-                        selectedItemId = selectedItemId)
-      }
-      navigation(startDestination = "itemSubdetail1", route = "itemSubDetail") {
-        composable("itemSubdetail1") { ItemSubdetail1(/*...*/) }
-        composable("itemSubdetail2") { ItemSubdetail2(/*...*/) }
-        composable("itemSubdetail3") { ItemSubdetail3(/*...*/) }
-      }
-      /*...*/
+        composable("listDetailRoute") {
+            ListDetailRoute(
+                isExpandedWindowSize = isExpandedWindowSize,
+                selectedItemId = selectedItemId
+            )
+        }
+        navigation(startDestination = "itemSubdetail1", route = "itemSubDetail") {
+            composable("itemSubdetail1") { ItemSubdetail1(/*...*/ ) }
+            composable("itemSubdetail2") { ItemSubdetail2(/*...*/ ) }
+            composable("itemSubdetail3") { ItemSubdetail3(/*...*/ ) }
+        }
+        /*...*/
     }
 }
 
 private object NavigationResponsiveUiSnippet8 {
 
-  @Composable
-  fun ListDetailRoute(
-      // Indicates that the display size is represented by the expanded window size class.
-      isExpandedWindowSize: Boolean = false,
-      // Identifies the item selected from the list. If null, a item has not been selected.
-      selectedItemId: String?,
-  ) { /*...*/ }
+    @Composable
+    fun ListDetailRoute(
+        // Indicates that the display size is represented by the expanded window size class.
+        isExpandedWindowSize: Boolean = false,
+        // Identifies the item selected from the list. If null, a item has not been selected.
+        selectedItemId: String?,
+    ) {
+        /*...*/
+    }
 }
 
 /* Fakes needed for snippets to build. */
 
-@Composable
-private fun ListOfItems() = Unit
+@Composable private fun ListOfItems() = Unit
 
 @Composable
 private fun ListOfItems(
@@ -290,13 +300,10 @@
     selectedItemId: String?,
 ) = Unit
 
-@Composable
-private fun ItemSubdetail1() = Unit
+@Composable private fun ItemSubdetail1() = Unit
 
-@Composable
-private fun ItemSubdetail2() = Unit
+@Composable private fun ItemSubdetail2() = Unit
 
-@Composable
-private fun ItemSubdetail3() = Unit
+@Composable private fun ItemSubdetail3() = Unit
 
 private fun <T> MutableStateFlow<T>.update(function: (T) -> T) {}
diff --git a/compose/integration-tests/hero/benchmark/src/androidTest/java/androidx/compose/integration/hero/benchmark/jetsnack/JetsnackBenchmark.kt b/compose/integration-tests/hero/benchmark/src/androidTest/java/androidx/compose/integration/hero/benchmark/jetsnack/JetsnackBenchmark.kt
index 1bbc076..e569f43 100644
--- a/compose/integration-tests/hero/benchmark/src/androidTest/java/androidx/compose/integration/hero/benchmark/jetsnack/JetsnackBenchmark.kt
+++ b/compose/integration-tests/hero/benchmark/src/androidTest/java/androidx/compose/integration/hero/benchmark/jetsnack/JetsnackBenchmark.kt
@@ -33,8 +33,7 @@
 @LargeTest
 @RunWith(AndroidJUnit4::class)
 class JetsnackBenchmark {
-    @get:Rule
-    val benchmarkRule = ComposeBenchmarkRule()
+    @get:Rule val benchmarkRule = ComposeBenchmarkRule()
 
     private val jetsnackCaseFactory = { JetsnackCaseFactory() }
 
diff --git a/compose/integration-tests/hero/benchmark/src/androidTest/java/androidx/compose/integration/hero/benchmark/jetsnack/JetsnackCaseFactory.kt b/compose/integration-tests/hero/benchmark/src/androidTest/java/androidx/compose/integration/hero/benchmark/jetsnack/JetsnackCaseFactory.kt
index 2c61957..339092f 100644
--- a/compose/integration-tests/hero/benchmark/src/androidTest/java/androidx/compose/integration/hero/benchmark/jetsnack/JetsnackCaseFactory.kt
+++ b/compose/integration-tests/hero/benchmark/src/androidTest/java/androidx/compose/integration/hero/benchmark/jetsnack/JetsnackCaseFactory.kt
@@ -24,8 +24,6 @@
 class JetsnackCaseFactory : LayeredComposeTestCase() {
     @Composable
     override fun MeasuredContent() {
-        JetsnackTheme {
-            Feed(onSnackClick = {})
-        }
+        JetsnackTheme { Feed(onSnackClick = {}) }
     }
 }
diff --git a/compose/integration-tests/hero/hero-implementation/src/main/java/androidx/compose/integration/hero/implementation/jetsnack/DestinationBar.kt b/compose/integration-tests/hero/hero-implementation/src/main/java/androidx/compose/integration/hero/implementation/jetsnack/DestinationBar.kt
index 4a7a7aab..707996c 100644
--- a/compose/integration-tests/hero/hero-implementation/src/main/java/androidx/compose/integration/hero/implementation/jetsnack/DestinationBar.kt
+++ b/compose/integration-tests/hero/hero-implementation/src/main/java/androidx/compose/integration/hero/implementation/jetsnack/DestinationBar.kt
@@ -51,9 +51,7 @@
                 textAlign = TextAlign.Center,
                 maxLines = 1,
                 overflow = TextOverflow.Ellipsis,
-                modifier = Modifier
-                    .weight(1f)
-                    .align(Alignment.CenterVertically)
+                modifier = Modifier.weight(1f).align(Alignment.CenterVertically)
             )
             IconButton(
                 onClick = { /* todo */ },
diff --git a/compose/integration-tests/hero/hero-implementation/src/main/java/androidx/compose/integration/hero/implementation/jetsnack/Divider.kt b/compose/integration-tests/hero/hero-implementation/src/main/java/androidx/compose/integration/hero/implementation/jetsnack/Divider.kt
index bc3b9b9..d2f11a4 100644
--- a/compose/integration-tests/hero/hero-implementation/src/main/java/androidx/compose/integration/hero/implementation/jetsnack/Divider.kt
+++ b/compose/integration-tests/hero/hero-implementation/src/main/java/androidx/compose/integration/hero/implementation/jetsnack/Divider.kt
@@ -36,12 +36,7 @@
     thickness: Dp = 1.dp,
     startIndent: Dp = 0.dp
 ) {
-    Divider(
-        modifier = modifier,
-        color = color,
-        thickness = thickness,
-        startIndent = startIndent
-    )
+    Divider(modifier = modifier, color = color, thickness = thickness, startIndent = startIndent)
 }
 
 private const val DividerAlpha = 0.12f
diff --git a/compose/integration-tests/hero/hero-implementation/src/main/java/androidx/compose/integration/hero/implementation/jetsnack/Feed.kt b/compose/integration-tests/hero/hero-implementation/src/main/java/androidx/compose/integration/hero/implementation/jetsnack/Feed.kt
index 943abd2..467148f 100644
--- a/compose/integration-tests/hero/hero-implementation/src/main/java/androidx/compose/integration/hero/implementation/jetsnack/Feed.kt
+++ b/compose/integration-tests/hero/hero-implementation/src/main/java/androidx/compose/integration/hero/implementation/jetsnack/Feed.kt
@@ -37,16 +37,9 @@
 
 @OptIn(ExperimentalComposeUiApi::class)
 @Composable
-fun Feed(
-    onSnackClick: (Long) -> Unit,
-    modifier: Modifier = Modifier
-) {
+fun Feed(onSnackClick: (Long) -> Unit, modifier: Modifier = Modifier) {
     val snackCollections = remember { SnackRepo.getSnacks() }
-    Feed(
-        snackCollections,
-        onSnackClick,
-        modifier.semantics { testTagsAsResourceId = true }
-    )
+    Feed(snackCollections, onSnackClick, modifier.semantics { testTagsAsResourceId = true })
 }
 
 @Composable
@@ -54,48 +47,44 @@
     snackCollections: List<SnackCollection>,
     onSnackClick: (Long) -> Unit,
     modifier: Modifier = Modifier,
-) = trace("Feed") {
-    JetsnackSurface(
-        modifier = modifier
-            .fillMaxSize()
-    ) {
-        Box {
-            SnackCollectionList(snackCollections, onSnackClick)
-            DestinationBar()
+) =
+    trace("Feed") {
+        JetsnackSurface(modifier = modifier.fillMaxSize()) {
+            Box {
+                SnackCollectionList(snackCollections, onSnackClick)
+                DestinationBar()
+            }
         }
     }
-}
 
 @Composable
 private fun SnackCollectionList(
     snackCollections: List<SnackCollection>,
     onSnackClick: (Long) -> Unit,
     modifier: Modifier = Modifier
-) = trace("SnackCollectionList") {
-    Box(modifier) {
-        LazyColumn(
-            modifier = Modifier
-                .testTag("snack_list")
-        ) {
-            item {
-                Spacer(
-                    Modifier.windowInsetsTopHeight(
-                        WindowInsets.statusBars.add(WindowInsets(top = 56.dp))
+) =
+    trace("SnackCollectionList") {
+        Box(modifier) {
+            LazyColumn(modifier = Modifier.testTag("snack_list")) {
+                item {
+                    Spacer(
+                        Modifier.windowInsetsTopHeight(
+                            WindowInsets.statusBars.add(WindowInsets(top = 56.dp))
+                        )
                     )
-                )
-            }
-            itemsIndexed(snackCollections) { index, snackCollection ->
-                if (index > 0) {
-                    JetsnackDivider(thickness = 2.dp)
                 }
+                itemsIndexed(snackCollections) { index, snackCollection ->
+                    if (index > 0) {
+                        JetsnackDivider(thickness = 2.dp)
+                    }
 
-                SnackCollection(
-                    snackCollection = snackCollection,
-                    onSnackClick = onSnackClick,
-                    index = index,
-                    modifier = Modifier.testTag("snack_collection")
-                )
+                    SnackCollection(
+                        snackCollection = snackCollection,
+                        onSnackClick = onSnackClick,
+                        index = index,
+                        modifier = Modifier.testTag("snack_collection")
+                    )
+                }
             }
         }
     }
-}
diff --git a/compose/integration-tests/hero/hero-implementation/src/main/java/androidx/compose/integration/hero/implementation/jetsnack/Snack.kt b/compose/integration-tests/hero/hero-implementation/src/main/java/androidx/compose/integration/hero/implementation/jetsnack/Snack.kt
index 87b989e..cd83446 100644
--- a/compose/integration-tests/hero/hero-implementation/src/main/java/androidx/compose/integration/hero/implementation/jetsnack/Snack.kt
+++ b/compose/integration-tests/hero/hero-implementation/src/main/java/androidx/compose/integration/hero/implementation/jetsnack/Snack.kt
@@ -30,199 +30,167 @@
     val tags: Set<String> = emptySet()
 )
 
-/**
- * Static data
- */
-
-val snacks = listOf(
-    Snack(
-        id = 1L,
-        name = "Cupcake",
-        tagline = "A tag line",
-        imageDrawable = R.drawable.donut,
-        price = 299
-    ),
-    Snack(
-        id = 2L,
-        name = "Donut",
-        tagline = "A tag line",
-        imageDrawable = R.drawable.donut,
-        price = 299
-    ),
-    Snack(
-        id = 3L,
-        name = "Eclair",
-        tagline = "A tag line",
-        imageDrawable = R.drawable.eclair,
-        price = 299
-    ),
-    Snack(
-        id = 4L,
-        name = "Froyo",
-        tagline = "A tag line",
-        imageDrawable = R.drawable.eclair,
-        price = 299
-    ),
-    Snack(
-        id = 5L,
-        name = "Gingerbread",
-        tagline = "A tag line",
-        imageDrawable = R.drawable.donut,
-        price = 499
-    ),
-    Snack(
-        id = 6L,
-        name = "Honeycomb",
-        tagline = "A tag line",
-        imageDrawable = R.drawable.donut,
-        price = 299
-    ),
-    Snack(
-        id = 7L,
-        name = "Ice Cream Sandwich",
-        tagline = "A tag line",
-        imageDrawable = R.drawable.eclair,
-        price = 1299
-    ),
-    Snack(
-        id = 8L,
-        name = "Jellybean",
-        tagline = "A tag line",
-        imageDrawable = R.drawable.donut,
-        price = 299
-    ),
-    Snack(
-        id = 9L,
-        name = "KitKat",
-        tagline = "A tag line",
-        imageDrawable = R.drawable.eclair,
-        price = 549
-    ),
-    Snack(
-        id = 10L,
-        name = "Lollipop",
-        tagline = "A tag line",
-        imageDrawable = R.drawable.donut,
-        price = 299
-    ),
-    Snack(
-        id = 11L,
-        name = "Marshmallow",
-        tagline = "A tag line",
-        imageDrawable = R.drawable.eclair,
-        price = 299
-    ),
-    Snack(
-        id = 12L,
-        name = "Nougat",
-        tagline = "A tag line",
-        imageDrawable = R.drawable.donut,
-        price = 299
-    ),
-    Snack(
-        id = 13L,
-        name = "Oreo",
-        tagline = "A tag line",
-        imageDrawable = R.drawable.eclair,
-        price = 299
-    ),
-    Snack(
-        id = 14L,
-        name = "Pie",
-        tagline = "A tag line",
-        imageDrawable = R.drawable.donut,
-        price = 299
-    ),
-    Snack(
-        id = 15L,
-        name = "Chips",
-        imageDrawable = R.drawable.eclair,
-        price = 299
-    ),
-    Snack(
-        id = 16L,
-        name = "Pretzels",
-        imageDrawable = R.drawable.eclair,
-        price = 299
-    ),
-    Snack(
-        id = 17L,
-        name = "Smoothies",
-        imageDrawable = R.drawable.donut,
-        price = 299
-    ),
-    Snack(
-        id = 18L,
-        name = "Popcorn",
-        imageDrawable = R.drawable.donut,
-        price = 299
-    ),
-    Snack(
-        id = 19L,
-        name = "Almonds",
-        imageDrawable = R.drawable.eclair,
-        price = 299
-    ),
-    Snack(
-        id = 20L,
-        name = "Cheese",
-        imageDrawable = R.drawable.eclair,
-        price = 299
-    ),
-    Snack(
-        id = 21L,
-        name = "Apples",
-        tagline = "A tag line",
-        imageDrawable = R.drawable.donut,
-        price = 299
-    ),
-    Snack(
-        id = 22L,
-        name = "Apple sauce",
-        tagline = "A tag line",
-        imageDrawable = R.drawable.donut,
-        price = 299
-    ),
-    Snack(
-        id = 23L,
-        name = "Apple chips",
-        tagline = "A tag line",
-        imageDrawable = R.drawable.eclair,
-        price = 299
-    ),
-    Snack(
-        id = 24L,
-        name = "Apple juice",
-        tagline = "A tag line",
-        imageDrawable = R.drawable.eclair,
-        price = 299
-    ),
-    Snack(
-        id = 25L,
-        name = "Apple pie",
-        tagline = "A tag line",
-        imageDrawable = R.drawable.donut,
-        price = 299
-    ),
-    Snack(
-        id = 26L,
-        name = "Grapes",
-        tagline = "A tag line",
-        imageDrawable = R.drawable.donut,
-        price = 299
-    ),
-    Snack(
-        id = 27L,
-        name = "Kiwi",
-        tagline = "A tag line",
-        imageDrawable = R.drawable.eclair,
-        price = 299
-    ),
-    Snack(
-        id = 28L,
-        name = "Mango",
-        tagline = "A tag line",
-        imageDrawable = R.drawable.donut,
-        price = 299
+/** Static data */
+val snacks =
+    listOf(
+        Snack(
+            id = 1L,
+            name = "Cupcake",
+            tagline = "A tag line",
+            imageDrawable = R.drawable.donut,
+            price = 299
+        ),
+        Snack(
+            id = 2L,
+            name = "Donut",
+            tagline = "A tag line",
+            imageDrawable = R.drawable.donut,
+            price = 299
+        ),
+        Snack(
+            id = 3L,
+            name = "Eclair",
+            tagline = "A tag line",
+            imageDrawable = R.drawable.eclair,
+            price = 299
+        ),
+        Snack(
+            id = 4L,
+            name = "Froyo",
+            tagline = "A tag line",
+            imageDrawable = R.drawable.eclair,
+            price = 299
+        ),
+        Snack(
+            id = 5L,
+            name = "Gingerbread",
+            tagline = "A tag line",
+            imageDrawable = R.drawable.donut,
+            price = 499
+        ),
+        Snack(
+            id = 6L,
+            name = "Honeycomb",
+            tagline = "A tag line",
+            imageDrawable = R.drawable.donut,
+            price = 299
+        ),
+        Snack(
+            id = 7L,
+            name = "Ice Cream Sandwich",
+            tagline = "A tag line",
+            imageDrawable = R.drawable.eclair,
+            price = 1299
+        ),
+        Snack(
+            id = 8L,
+            name = "Jellybean",
+            tagline = "A tag line",
+            imageDrawable = R.drawable.donut,
+            price = 299
+        ),
+        Snack(
+            id = 9L,
+            name = "KitKat",
+            tagline = "A tag line",
+            imageDrawable = R.drawable.eclair,
+            price = 549
+        ),
+        Snack(
+            id = 10L,
+            name = "Lollipop",
+            tagline = "A tag line",
+            imageDrawable = R.drawable.donut,
+            price = 299
+        ),
+        Snack(
+            id = 11L,
+            name = "Marshmallow",
+            tagline = "A tag line",
+            imageDrawable = R.drawable.eclair,
+            price = 299
+        ),
+        Snack(
+            id = 12L,
+            name = "Nougat",
+            tagline = "A tag line",
+            imageDrawable = R.drawable.donut,
+            price = 299
+        ),
+        Snack(
+            id = 13L,
+            name = "Oreo",
+            tagline = "A tag line",
+            imageDrawable = R.drawable.eclair,
+            price = 299
+        ),
+        Snack(
+            id = 14L,
+            name = "Pie",
+            tagline = "A tag line",
+            imageDrawable = R.drawable.donut,
+            price = 299
+        ),
+        Snack(id = 15L, name = "Chips", imageDrawable = R.drawable.eclair, price = 299),
+        Snack(id = 16L, name = "Pretzels", imageDrawable = R.drawable.eclair, price = 299),
+        Snack(id = 17L, name = "Smoothies", imageDrawable = R.drawable.donut, price = 299),
+        Snack(id = 18L, name = "Popcorn", imageDrawable = R.drawable.donut, price = 299),
+        Snack(id = 19L, name = "Almonds", imageDrawable = R.drawable.eclair, price = 299),
+        Snack(id = 20L, name = "Cheese", imageDrawable = R.drawable.eclair, price = 299),
+        Snack(
+            id = 21L,
+            name = "Apples",
+            tagline = "A tag line",
+            imageDrawable = R.drawable.donut,
+            price = 299
+        ),
+        Snack(
+            id = 22L,
+            name = "Apple sauce",
+            tagline = "A tag line",
+            imageDrawable = R.drawable.donut,
+            price = 299
+        ),
+        Snack(
+            id = 23L,
+            name = "Apple chips",
+            tagline = "A tag line",
+            imageDrawable = R.drawable.eclair,
+            price = 299
+        ),
+        Snack(
+            id = 24L,
+            name = "Apple juice",
+            tagline = "A tag line",
+            imageDrawable = R.drawable.eclair,
+            price = 299
+        ),
+        Snack(
+            id = 25L,
+            name = "Apple pie",
+            tagline = "A tag line",
+            imageDrawable = R.drawable.donut,
+            price = 299
+        ),
+        Snack(
+            id = 26L,
+            name = "Grapes",
+            tagline = "A tag line",
+            imageDrawable = R.drawable.donut,
+            price = 299
+        ),
+        Snack(
+            id = 27L,
+            name = "Kiwi",
+            tagline = "A tag line",
+            imageDrawable = R.drawable.eclair,
+            price = 299
+        ),
+        Snack(
+            id = 28L,
+            name = "Mango",
+            tagline = "A tag line",
+            imageDrawable = R.drawable.donut,
+            price = 299
+        )
     )
-)
diff --git a/compose/integration-tests/hero/hero-implementation/src/main/java/androidx/compose/integration/hero/implementation/jetsnack/SnackCollection.kt b/compose/integration-tests/hero/hero-implementation/src/main/java/androidx/compose/integration/hero/implementation/jetsnack/SnackCollection.kt
index 27dbafb..a67d565 100644
--- a/compose/integration-tests/hero/hero-implementation/src/main/java/androidx/compose/integration/hero/implementation/jetsnack/SnackCollection.kt
+++ b/compose/integration-tests/hero/hero-implementation/src/main/java/androidx/compose/integration/hero/implementation/jetsnack/SnackCollection.kt
@@ -26,100 +26,66 @@
     val type: CollectionType = CollectionType.Normal
 )
 
-enum class CollectionType { Normal, Highlight }
+enum class CollectionType {
+    Normal,
+    Highlight
+}
 
-/**
- * A fake repo
- */
+/** A fake repo */
 object SnackRepo {
     fun getSnacks(): List<SnackCollection> = snackCollections
+
     fun getSnack(snackId: Long) = snacks.find { it.id == snackId }!!
+
     fun getRelated(@Suppress("UNUSED_PARAMETER") snackId: Long) = related
+
     fun getInspiredByCart() = inspiredByCart
+
     fun getCart() = cart
 }
 
-/**
- * Static data
- */
+/** Static data */
+private val tastyTreats =
+    SnackCollection(
+        id = 1L,
+        name = "Android's picks",
+        type = CollectionType.Highlight,
+        snacks = snacks.subList(0, 13)
+    )
 
-private val tastyTreats = SnackCollection(
-    id = 1L,
-    name = "Android's picks",
-    type = CollectionType.Highlight,
-    snacks = snacks.subList(0, 13)
-)
+private val popular =
+    SnackCollection(id = 2L, name = "Popular on Jetsnack", snacks = snacks.subList(14, 19))
 
-private val popular = SnackCollection(
-    id = 2L,
-    name = "Popular on Jetsnack",
-    snacks = snacks.subList(14, 19)
-)
+private val wfhFavs = tastyTreats.copy(id = 3L, name = "WFH favourites")
 
-private val wfhFavs = tastyTreats.copy(
-    id = 3L,
-    name = "WFH favourites"
-)
+private val newlyAdded = popular.copy(id = 4L, name = "Newly Added")
 
-private val newlyAdded = popular.copy(
-    id = 4L,
-    name = "Newly Added"
-)
+private val exclusive = tastyTreats.copy(id = 5L, name = "Only on Jetsnack")
 
-private val exclusive = tastyTreats.copy(
-    id = 5L,
-    name = "Only on Jetsnack"
-)
+private val also = tastyTreats.copy(id = 6L, name = "Customers also bought")
 
-private val also = tastyTreats.copy(
-    id = 6L,
-    name = "Customers also bought"
-)
+private val inspiredByCart = tastyTreats.copy(id = 7L, name = "Inspired by your cart")
 
-private val inspiredByCart = tastyTreats.copy(
-    id = 7L,
-    name = "Inspired by your cart"
-)
+private val offers = tastyTreats.copy(id = 8L, name = "Latest offers")
+private val bestSelling = popular.copy(id = 9L, name = "Best selling")
+private val preOrder = tastyTreats.copy(id = 10L, name = "Available for pre-order")
 
-private val offers = tastyTreats.copy(
-    id = 8L,
-    name = "Latest offers"
-)
-private val bestSelling = popular.copy(
-    id = 9L,
-    name = "Best selling"
-)
-private val preOrder = tastyTreats.copy(
-    id = 10L,
-    name = "Available for pre-order"
-)
+private val snackCollections =
+    listOf(
+        tastyTreats,
+        popular,
+        wfhFavs,
+        newlyAdded,
+        exclusive,
+        also,
+        inspiredByCart,
+        offers,
+        bestSelling,
+        preOrder,
+    )
 
-private val snackCollections = listOf(
-    tastyTreats,
-    popular,
-    wfhFavs,
-    newlyAdded,
-    exclusive,
-    also,
-    inspiredByCart,
-    offers,
-    bestSelling,
-    preOrder,
-)
+private val related = listOf(also, popular)
 
-private val related = listOf(
-    also,
-    popular
-)
+private val cart = listOf(OrderLine(snacks[4], 2), OrderLine(snacks[6], 3), OrderLine(snacks[8], 1))
 
-private val cart = listOf(
-    OrderLine(snacks[4], 2),
-    OrderLine(snacks[6], 3),
-    OrderLine(snacks[8], 1)
-)
-
-@Immutable
-data class OrderLine(
-    val snack: Snack,
-    val count: Int
-)
+@Immutable data class OrderLine(val snack: Snack, val count: Int)
diff --git a/compose/integration-tests/hero/hero-implementation/src/main/java/androidx/compose/integration/hero/implementation/jetsnack/Snacks.kt b/compose/integration-tests/hero/hero-implementation/src/main/java/androidx/compose/integration/hero/implementation/jetsnack/Snacks.kt
index b68b52e..8ec6916 100644
--- a/compose/integration-tests/hero/hero-implementation/src/main/java/androidx/compose/integration/hero/implementation/jetsnack/Snacks.kt
+++ b/compose/integration-tests/hero/hero-implementation/src/main/java/androidx/compose/integration/hero/implementation/jetsnack/Snacks.kt
@@ -65,42 +65,39 @@
     modifier: Modifier = Modifier,
     index: Int = 0,
     highlight: Boolean = true
-) = trace("SnackCollection") {
-    Column(modifier = modifier) {
-        Row(
-            verticalAlignment = Alignment.CenterVertically,
-            modifier = Modifier
-                .heightIn(min = 56.dp)
-                .padding(start = 24.dp)
-        ) {
-            Text(
-                text = snackCollection.name,
-                style = MaterialTheme.typography.h6,
-                color = JetsnackTheme.colors.brand,
-                maxLines = 1,
-                overflow = TextOverflow.Ellipsis,
-                modifier = Modifier
-                    .weight(1f)
-                    .wrapContentWidth(Alignment.Start)
-            )
-            IconButton(
-                onClick = { /* todo */ },
-                modifier = Modifier.align(Alignment.CenterVertically)
+) =
+    trace("SnackCollection") {
+        Column(modifier = modifier) {
+            Row(
+                verticalAlignment = Alignment.CenterVertically,
+                modifier = Modifier.heightIn(min = 56.dp).padding(start = 24.dp)
             ) {
-                Icon(
-                    imageVector = Icons.AutoMirrored.Outlined.ArrowBack,
-                    tint = JetsnackTheme.colors.brand,
-                    contentDescription = null
+                Text(
+                    text = snackCollection.name,
+                    style = MaterialTheme.typography.h6,
+                    color = JetsnackTheme.colors.brand,
+                    maxLines = 1,
+                    overflow = TextOverflow.Ellipsis,
+                    modifier = Modifier.weight(1f).wrapContentWidth(Alignment.Start)
                 )
+                IconButton(
+                    onClick = { /* todo */ },
+                    modifier = Modifier.align(Alignment.CenterVertically)
+                ) {
+                    Icon(
+                        imageVector = Icons.AutoMirrored.Outlined.ArrowBack,
+                        tint = JetsnackTheme.colors.brand,
+                        contentDescription = null
+                    )
+                }
+            }
+            if (highlight && snackCollection.type == CollectionType.Highlight) {
+                HighlightedSnacks(index, snackCollection.snacks, onSnackClick)
+            } else {
+                Snacks(snackCollection.snacks, onSnackClick)
             }
         }
-        if (highlight && snackCollection.type == CollectionType.Highlight) {
-            HighlightedSnacks(index, snackCollection.snacks, onSnackClick)
-        } else {
-            Snacks(snackCollection.snacks, onSnackClick)
-        }
     }
-}
 
 @Suppress("UNUSED_PARAMETER")
 @Composable
@@ -131,39 +128,26 @@
     onSnackClick: (Long) -> Unit,
     modifier: Modifier = Modifier
 ) {
-    LazyRow(
-        modifier = modifier,
-        contentPadding = PaddingValues(start = 12.dp, end = 12.dp)
-    ) {
-        items(snacks) { snack ->
-            SnackItem(snack, onSnackClick)
-        }
+    LazyRow(modifier = modifier, contentPadding = PaddingValues(start = 12.dp, end = 12.dp)) {
+        items(snacks) { snack -> SnackItem(snack, onSnackClick) }
     }
 }
 
 @Composable
-fun SnackItem(
-    snack: Snack,
-    onSnackClick: (Long) -> Unit,
-    modifier: Modifier = Modifier
-) {
+fun SnackItem(snack: Snack, onSnackClick: (Long) -> Unit, modifier: Modifier = Modifier) {
     JetsnackSurface(
         shape = MaterialTheme.shapes.medium,
-        modifier = modifier.padding(
-            start = 4.dp,
-            end = 4.dp,
-            bottom = 8.dp
-        )
+        modifier = modifier.padding(start = 4.dp, end = 4.dp, bottom = 8.dp)
     ) {
         Column(
             horizontalAlignment = Alignment.CenterHorizontally,
-            modifier = Modifier
-                .clickable(
-                    interactionSource = null,
-                    indication = ripple(),
-                    onClick = { onSnackClick(snack.id) }
-                )
-                .padding(8.dp)
+            modifier =
+                Modifier.clickable(
+                        interactionSource = null,
+                        indication = ripple(),
+                        onClick = { onSnackClick(snack.id) }
+                    )
+                    .padding(8.dp)
         ) {
             SnackImage(
                 imageDrawable = snack.imageDrawable,
@@ -189,39 +173,26 @@
     modifier: Modifier = Modifier
 ) {
     JetsnackCard(
-        modifier = modifier
-            .size(
-                width = 170.dp,
-                height = 250.dp
-            )
-            .padding(bottom = 16.dp)
+        modifier = modifier.size(width = 170.dp, height = 250.dp).padding(bottom = 16.dp)
     ) {
         Column(
-            modifier = Modifier
-                .clickable(
-                    interactionSource = null,
-                    indication = ripple(),
-                    onClick = { onSnackClick(snack.id) }
-                )
-                .fillMaxSize()
+            modifier =
+                Modifier.clickable(
+                        interactionSource = null,
+                        indication = ripple(),
+                        onClick = { onSnackClick(snack.id) }
+                    )
+                    .fillMaxSize()
         ) {
-            Box(
-                modifier = Modifier
-                    .height(160.dp)
-                    .fillMaxWidth()
-            ) {
+            Box(modifier = Modifier.height(160.dp).fillMaxWidth()) {
                 Box(
-                    modifier = Modifier
-                        .height(100.dp)
-                        .fillMaxWidth()
-                        .offsetGradientBackground(gradient)
+                    modifier =
+                        Modifier.height(100.dp).fillMaxWidth().offsetGradientBackground(gradient)
                 )
                 SnackImage(
                     imageDrawable = snack.imageDrawable,
                     contentDescription = null,
-                    modifier = Modifier
-                        .size(120.dp)
-                        .align(Alignment.BottomCenter)
+                    modifier = Modifier.size(120.dp).align(Alignment.BottomCenter)
                 )
             }
             Spacer(modifier = Modifier.height(8.dp))
@@ -268,8 +239,5 @@
     }
 }
 
-fun Modifier.offsetGradientBackground(
-    colors: List<Color>
-) = background(
-    Brush.horizontalGradient(colors)
-)
+fun Modifier.offsetGradientBackground(colors: List<Color>) =
+    background(Brush.horizontalGradient(colors))
diff --git a/compose/integration-tests/hero/hero-implementation/src/main/java/androidx/compose/integration/hero/implementation/jetsnack/Surface.kt b/compose/integration-tests/hero/hero-implementation/src/main/java/androidx/compose/integration/hero/implementation/jetsnack/Surface.kt
index 8cd89fe..fad5966 100644
--- a/compose/integration-tests/hero/hero-implementation/src/main/java/androidx/compose/integration/hero/implementation/jetsnack/Surface.kt
+++ b/compose/integration-tests/hero/hero-implementation/src/main/java/androidx/compose/integration/hero/implementation/jetsnack/Surface.kt
@@ -50,25 +50,28 @@
     border: BorderStroke? = null,
     elevation: Dp = 0.dp,
     content: @Composable () -> Unit
-) = trace("JetsnackSurface") {
-    Box(
-        modifier = modifier
-            .shadow(elevation = elevation, shape = shape, clip = false)
-            .zIndex(elevation.value)
-            .then(if (border != null) Modifier.border(border, shape) else Modifier)
-            .background(
-                color = getBackgroundColorForElevation(color, elevation),
-                shape = shape
-            )
-            .clip(shape)
-    ) {
-        CompositionLocalProvider(LocalContentColor provides contentColor, content = content)
+) =
+    trace("JetsnackSurface") {
+        Box(
+            modifier =
+                modifier
+                    .shadow(elevation = elevation, shape = shape, clip = false)
+                    .zIndex(elevation.value)
+                    .then(if (border != null) Modifier.border(border, shape) else Modifier)
+                    .background(
+                        color = getBackgroundColorForElevation(color, elevation),
+                        shape = shape
+                    )
+                    .clip(shape)
+        ) {
+            CompositionLocalProvider(LocalContentColor provides contentColor, content = content)
+        }
     }
-}
 
 @Composable
 private fun getBackgroundColorForElevation(color: Color, elevation: Dp): Color {
-    return if (elevation > 0.dp // && https://issuetracker.google.com/issues/161429530
+    return if (
+        elevation > 0.dp // && https://issuetracker.google.com/issues/161429530
     // JetsnackTheme.colors.isDark //&&
     // color == JetsnackTheme.colors.uiBackground
     ) {
@@ -90,8 +93,8 @@
 }
 
 /**
- * @return the alpha-modified [Color.White] to overlay on top of the surface color to produce
- * the resultant color.
+ * @return the alpha-modified [Color.White] to overlay on top of the surface color to produce the
+ *   resultant color.
  */
 private fun calculateForeground(elevation: Dp): Color {
     val alpha = ((4.5f * ln(elevation.value + 1)) + 2f) / 100f
diff --git a/compose/integration-tests/hero/hero-implementation/src/main/java/androidx/compose/integration/hero/implementation/jetsnack/theme/Shape.kt b/compose/integration-tests/hero/hero-implementation/src/main/java/androidx/compose/integration/hero/implementation/jetsnack/theme/Shape.kt
index c3bb218..b80a838 100644
--- a/compose/integration-tests/hero/hero-implementation/src/main/java/androidx/compose/integration/hero/implementation/jetsnack/theme/Shape.kt
+++ b/compose/integration-tests/hero/hero-implementation/src/main/java/androidx/compose/integration/hero/implementation/jetsnack/theme/Shape.kt
@@ -20,8 +20,9 @@
 import androidx.compose.material.Shapes
 import androidx.compose.ui.unit.dp
 
-val Shapes = Shapes(
-    small = RoundedCornerShape(percent = 50),
-    medium = RoundedCornerShape(20.dp),
-    large = RoundedCornerShape(0.dp)
-)
+val Shapes =
+    Shapes(
+        small = RoundedCornerShape(percent = 50),
+        medium = RoundedCornerShape(20.dp),
+        large = RoundedCornerShape(0.dp)
+    )
diff --git a/compose/integration-tests/hero/hero-implementation/src/main/java/androidx/compose/integration/hero/implementation/jetsnack/theme/Theme.kt b/compose/integration-tests/hero/hero-implementation/src/main/java/androidx/compose/integration/hero/implementation/jetsnack/theme/Theme.kt
index 48ff7c6..3182729 100644
--- a/compose/integration-tests/hero/hero-implementation/src/main/java/androidx/compose/integration/hero/implementation/jetsnack/theme/Theme.kt
+++ b/compose/integration-tests/hero/hero-implementation/src/main/java/androidx/compose/integration/hero/implementation/jetsnack/theme/Theme.kt
@@ -29,63 +29,62 @@
 import androidx.compose.runtime.staticCompositionLocalOf
 import androidx.compose.ui.graphics.Color
 
-private val LightColorPalette = JetsnackColors(
-    brand = Shadow5,
-    brandSecondary = Ocean3,
-    uiBackground = Neutral0,
-    uiBorder = Neutral4,
-    uiFloated = FunctionalGrey,
-    textSecondary = Neutral7,
-    textHelp = Neutral6,
-    textInteractive = Neutral0,
-    textLink = Ocean11,
-    iconSecondary = Neutral7,
-    iconInteractive = Neutral0,
-    iconInteractiveInactive = Neutral1,
-    error = FunctionalRed,
-    gradient6_1 = listOf(Shadow4, Ocean3, Shadow2, Ocean3, Shadow4),
-    gradient6_2 = listOf(Rose4, Lavender3, Rose2, Lavender3, Rose4),
-    gradient3_1 = listOf(Shadow2, Ocean3, Shadow4),
-    gradient3_2 = listOf(Rose2, Lavender3, Rose4),
-    gradient2_1 = listOf(Shadow4, Shadow11),
-    gradient2_2 = listOf(Ocean3, Shadow3),
-    gradient2_3 = listOf(Lavender3, Rose2),
-    tornado1 = listOf(Shadow4, Ocean3),
-    isDark = false
-)
+private val LightColorPalette =
+    JetsnackColors(
+        brand = Shadow5,
+        brandSecondary = Ocean3,
+        uiBackground = Neutral0,
+        uiBorder = Neutral4,
+        uiFloated = FunctionalGrey,
+        textSecondary = Neutral7,
+        textHelp = Neutral6,
+        textInteractive = Neutral0,
+        textLink = Ocean11,
+        iconSecondary = Neutral7,
+        iconInteractive = Neutral0,
+        iconInteractiveInactive = Neutral1,
+        error = FunctionalRed,
+        gradient6_1 = listOf(Shadow4, Ocean3, Shadow2, Ocean3, Shadow4),
+        gradient6_2 = listOf(Rose4, Lavender3, Rose2, Lavender3, Rose4),
+        gradient3_1 = listOf(Shadow2, Ocean3, Shadow4),
+        gradient3_2 = listOf(Rose2, Lavender3, Rose4),
+        gradient2_1 = listOf(Shadow4, Shadow11),
+        gradient2_2 = listOf(Ocean3, Shadow3),
+        gradient2_3 = listOf(Lavender3, Rose2),
+        tornado1 = listOf(Shadow4, Ocean3),
+        isDark = false
+    )
 
-private val DarkColorPalette = JetsnackColors(
-    brand = Shadow1,
-    brandSecondary = Ocean2,
-    uiBackground = Neutral8,
-    uiBorder = Neutral3,
-    uiFloated = FunctionalDarkGrey,
-    textPrimary = Shadow1,
-    textSecondary = Neutral0,
-    textHelp = Neutral1,
-    textInteractive = Neutral7,
-    textLink = Ocean2,
-    iconPrimary = Shadow1,
-    iconSecondary = Neutral0,
-    iconInteractive = Neutral7,
-    iconInteractiveInactive = Neutral6,
-    error = FunctionalRedDark,
-    gradient6_1 = listOf(Shadow5, Ocean7, Shadow9, Ocean7, Shadow5),
-    gradient6_2 = listOf(Rose11, Lavender7, Rose8, Lavender7, Rose11),
-    gradient3_1 = listOf(Shadow9, Ocean7, Shadow5),
-    gradient3_2 = listOf(Rose8, Lavender7, Rose11),
-    gradient2_1 = listOf(Ocean3, Shadow3),
-    gradient2_2 = listOf(Ocean4, Shadow2),
-    gradient2_3 = listOf(Lavender3, Rose3),
-    tornado1 = listOf(Shadow4, Ocean3),
-    isDark = true
-)
+private val DarkColorPalette =
+    JetsnackColors(
+        brand = Shadow1,
+        brandSecondary = Ocean2,
+        uiBackground = Neutral8,
+        uiBorder = Neutral3,
+        uiFloated = FunctionalDarkGrey,
+        textPrimary = Shadow1,
+        textSecondary = Neutral0,
+        textHelp = Neutral1,
+        textInteractive = Neutral7,
+        textLink = Ocean2,
+        iconPrimary = Shadow1,
+        iconSecondary = Neutral0,
+        iconInteractive = Neutral7,
+        iconInteractiveInactive = Neutral6,
+        error = FunctionalRedDark,
+        gradient6_1 = listOf(Shadow5, Ocean7, Shadow9, Ocean7, Shadow5),
+        gradient6_2 = listOf(Rose11, Lavender7, Rose8, Lavender7, Rose11),
+        gradient3_1 = listOf(Shadow9, Ocean7, Shadow5),
+        gradient3_2 = listOf(Rose8, Lavender7, Rose11),
+        gradient2_1 = listOf(Ocean3, Shadow3),
+        gradient2_2 = listOf(Ocean4, Shadow2),
+        gradient2_3 = listOf(Lavender3, Rose3),
+        tornado1 = listOf(Shadow4, Ocean3),
+        isDark = true
+    )
 
 @Composable
-fun JetsnackTheme(
-    darkTheme: Boolean = isSystemInDarkTheme(),
-    content: @Composable () -> Unit
-) {
+fun JetsnackTheme(darkTheme: Boolean = isSystemInDarkTheme(), content: @Composable () -> Unit) {
     val colors = if (darkTheme) DarkColorPalette else LightColorPalette
 
     ProvideJetsnackColors(colors) {
@@ -100,13 +99,10 @@
 
 object JetsnackTheme {
     val colors: JetsnackColors
-        @Composable
-        get() = LocalJetsnackColors.current
+        @Composable get() = LocalJetsnackColors.current
 }
 
-/**
- * Jetsnack custom Color Palette
- */
+/** Jetsnack custom Color Palette */
 @Stable
 class JetsnackColors(
     gradient6_1: List<Color>,
@@ -140,58 +136,85 @@
 ) {
     var gradient6_1 by mutableStateOf(gradient6_1)
         private set
+
     var gradient6_2 by mutableStateOf(gradient6_2)
         private set
+
     var gradient3_1 by mutableStateOf(gradient3_1)
         private set
+
     var gradient3_2 by mutableStateOf(gradient3_2)
         private set
+
     var gradient2_1 by mutableStateOf(gradient2_1)
         private set
+
     var gradient2_2 by mutableStateOf(gradient2_2)
         private set
+
     var gradient2_3 by mutableStateOf(gradient2_3)
         private set
+
     var brand by mutableStateOf(brand)
         private set
+
     var brandSecondary by mutableStateOf(brandSecondary)
         private set
+
     var uiBackground by mutableStateOf(uiBackground)
         private set
+
     var uiBorder by mutableStateOf(uiBorder)
         private set
+
     var uiFloated by mutableStateOf(uiFloated)
         private set
+
     var interactivePrimary by mutableStateOf(interactivePrimary)
         private set
+
     var interactiveSecondary by mutableStateOf(interactiveSecondary)
         private set
+
     var interactiveMask by mutableStateOf(interactiveMask)
         private set
+
     var textPrimary by mutableStateOf(textPrimary)
         private set
+
     var textSecondary by mutableStateOf(textSecondary)
         private set
+
     var textHelp by mutableStateOf(textHelp)
         private set
+
     var textInteractive by mutableStateOf(textInteractive)
         private set
+
     var tornado1 by mutableStateOf(tornado1)
         private set
+
     var textLink by mutableStateOf(textLink)
         private set
+
     var iconPrimary by mutableStateOf(iconPrimary)
         private set
+
     var iconSecondary by mutableStateOf(iconSecondary)
         private set
+
     var iconInteractive by mutableStateOf(iconInteractive)
         private set
+
     var iconInteractiveInactive by mutableStateOf(iconInteractiveInactive)
         private set
+
     var error by mutableStateOf(error)
         private set
+
     var notificationBadge by mutableStateOf(notificationBadge)
         private set
+
     var isDark by mutableStateOf(isDark)
         private set
 
@@ -226,43 +249,41 @@
         isDark = other.isDark
     }
 
-    fun copy(): JetsnackColors = JetsnackColors(
-        gradient6_1 = gradient6_1,
-        gradient6_2 = gradient6_2,
-        gradient3_1 = gradient3_1,
-        gradient3_2 = gradient3_2,
-        gradient2_1 = gradient2_1,
-        gradient2_2 = gradient2_2,
-        gradient2_3 = gradient2_3,
-        brand = brand,
-        brandSecondary = brandSecondary,
-        uiBackground = uiBackground,
-        uiBorder = uiBorder,
-        uiFloated = uiFloated,
-        interactivePrimary = interactivePrimary,
-        interactiveSecondary = interactiveSecondary,
-        interactiveMask = interactiveMask,
-        textPrimary = textPrimary,
-        textSecondary = textSecondary,
-        textHelp = textHelp,
-        textInteractive = textInteractive,
-        textLink = textLink,
-        tornado1 = tornado1,
-        iconPrimary = iconPrimary,
-        iconSecondary = iconSecondary,
-        iconInteractive = iconInteractive,
-        iconInteractiveInactive = iconInteractiveInactive,
-        error = error,
-        notificationBadge = notificationBadge,
-        isDark = isDark,
-    )
+    fun copy(): JetsnackColors =
+        JetsnackColors(
+            gradient6_1 = gradient6_1,
+            gradient6_2 = gradient6_2,
+            gradient3_1 = gradient3_1,
+            gradient3_2 = gradient3_2,
+            gradient2_1 = gradient2_1,
+            gradient2_2 = gradient2_2,
+            gradient2_3 = gradient2_3,
+            brand = brand,
+            brandSecondary = brandSecondary,
+            uiBackground = uiBackground,
+            uiBorder = uiBorder,
+            uiFloated = uiFloated,
+            interactivePrimary = interactivePrimary,
+            interactiveSecondary = interactiveSecondary,
+            interactiveMask = interactiveMask,
+            textPrimary = textPrimary,
+            textSecondary = textSecondary,
+            textHelp = textHelp,
+            textInteractive = textInteractive,
+            textLink = textLink,
+            tornado1 = tornado1,
+            iconPrimary = iconPrimary,
+            iconSecondary = iconSecondary,
+            iconInteractive = iconInteractive,
+            iconInteractiveInactive = iconInteractiveInactive,
+            error = error,
+            notificationBadge = notificationBadge,
+            isDark = isDark,
+        )
 }
 
 @Composable
-fun ProvideJetsnackColors(
-    colors: JetsnackColors,
-    content: @Composable () -> Unit
-) {
+fun ProvideJetsnackColors(colors: JetsnackColors, content: @Composable () -> Unit) {
     val colorPalette = remember {
         // Explicitly creating a new object here so we don't mutate the initial [colors]
         // provided, and overwrite the values set in it.
@@ -272,29 +293,26 @@
     CompositionLocalProvider(LocalJetsnackColors provides colorPalette, content = content)
 }
 
-private val LocalJetsnackColors = staticCompositionLocalOf<JetsnackColors> {
-    error("No JetsnackColorPalette provided")
-}
+private val LocalJetsnackColors =
+    staticCompositionLocalOf<JetsnackColors> { error("No JetsnackColorPalette provided") }
 
 /**
  * A Material [Colors] implementation which sets all colors to [debugColor] to discourage usage of
  * [MaterialTheme.colors] in preference to [JetsnackTheme.colors].
  */
-fun debugColors(
-    darkTheme: Boolean,
-    debugColor: Color = Color.Magenta
-) = Colors(
-    primary = debugColor,
-    primaryVariant = debugColor,
-    secondary = debugColor,
-    secondaryVariant = debugColor,
-    background = debugColor,
-    surface = debugColor,
-    error = debugColor,
-    onPrimary = debugColor,
-    onSecondary = debugColor,
-    onBackground = debugColor,
-    onSurface = debugColor,
-    onError = debugColor,
-    isLight = !darkTheme
-)
+fun debugColors(darkTheme: Boolean, debugColor: Color = Color.Magenta) =
+    Colors(
+        primary = debugColor,
+        primaryVariant = debugColor,
+        secondary = debugColor,
+        secondaryVariant = debugColor,
+        background = debugColor,
+        surface = debugColor,
+        error = debugColor,
+        onPrimary = debugColor,
+        onSecondary = debugColor,
+        onBackground = debugColor,
+        onSurface = debugColor,
+        onError = debugColor,
+        isLight = !darkTheme
+    )
diff --git a/compose/integration-tests/hero/hero-implementation/src/main/java/androidx/compose/integration/hero/implementation/jetsnack/theme/Type.kt b/compose/integration-tests/hero/hero-implementation/src/main/java/androidx/compose/integration/hero/implementation/jetsnack/theme/Type.kt
index e59951f..baca1762 100644
--- a/compose/integration-tests/hero/hero-implementation/src/main/java/androidx/compose/integration/hero/implementation/jetsnack/theme/Type.kt
+++ b/compose/integration-tests/hero/hero-implementation/src/main/java/androidx/compose/integration/hero/implementation/jetsnack/theme/Type.kt
@@ -24,96 +24,108 @@
 import androidx.compose.ui.text.font.FontWeight
 import androidx.compose.ui.unit.sp
 
-private val Karla = FontFamily(
-    Font(R.font.karla_regular, FontWeight.Normal)
-)
+private val Karla = FontFamily(Font(R.font.karla_regular, FontWeight.Normal))
 
-val Typography = Typography(
-    h1 = TextStyle(
-        fontFamily = Karla,
-        fontSize = 96.sp,
-        fontWeight = FontWeight.Normal,
-        lineHeight = 117.sp,
-        letterSpacing = (-1.5).sp
-    ),
-    h2 = TextStyle(
-        fontFamily = Karla,
-        fontSize = 60.sp,
-        fontWeight = FontWeight.Normal,
-        lineHeight = 73.sp,
-        letterSpacing = (-0.5).sp
-    ),
-    h3 = TextStyle(
-        fontFamily = Karla,
-        fontSize = 48.sp,
-        fontWeight = FontWeight.Normal,
-        lineHeight = 59.sp
-    ),
-    h4 = TextStyle(
-        fontFamily = Karla,
-        fontSize = 30.sp,
-        fontWeight = FontWeight.Normal,
-        lineHeight = 37.sp
-    ),
-    h5 = TextStyle(
-        fontFamily = Karla,
-        fontSize = 24.sp,
-        fontWeight = FontWeight.Normal,
-        lineHeight = 29.sp
-    ),
-    h6 = TextStyle(
-        fontFamily = Karla,
-        fontSize = 20.sp,
-        fontWeight = FontWeight.Normal,
-        lineHeight = 24.sp
-    ),
-    subtitle1 = TextStyle(
-        fontFamily = Karla,
-        fontSize = 16.sp,
-        fontWeight = FontWeight.Normal,
-        lineHeight = 24.sp,
-        letterSpacing = 0.15.sp
-    ),
-    subtitle2 = TextStyle(
-        fontFamily = Karla,
-        fontSize = 14.sp,
-        fontWeight = FontWeight.Normal,
-        lineHeight = 24.sp,
-        letterSpacing = 0.1.sp
-    ),
-    body1 = TextStyle(
-        fontFamily = Karla,
-        fontSize = 16.sp,
-        fontWeight = FontWeight.Normal,
-        lineHeight = 28.sp,
-        letterSpacing = 0.15.sp
-    ),
-    body2 = TextStyle(
-        fontFamily = Karla,
-        fontSize = 14.sp,
-        fontWeight = FontWeight.Normal,
-        lineHeight = 20.sp,
-        letterSpacing = 0.25.sp
-    ),
-    button = TextStyle(
-        fontFamily = Karla,
-        fontSize = 14.sp,
-        fontWeight = FontWeight.Normal,
-        lineHeight = 16.sp,
-        letterSpacing = 1.25.sp
-    ),
-    caption = TextStyle(
-        fontFamily = Karla,
-        fontSize = 12.sp,
-        fontWeight = FontWeight.Normal,
-        lineHeight = 16.sp,
-        letterSpacing = 0.4.sp
-    ),
-    overline = TextStyle(
-        fontFamily = Karla,
-        fontSize = 12.sp,
-        fontWeight = FontWeight.Normal,
-        lineHeight = 16.sp,
-        letterSpacing = 1.sp
+val Typography =
+    Typography(
+        h1 =
+            TextStyle(
+                fontFamily = Karla,
+                fontSize = 96.sp,
+                fontWeight = FontWeight.Normal,
+                lineHeight = 117.sp,
+                letterSpacing = (-1.5).sp
+            ),
+        h2 =
+            TextStyle(
+                fontFamily = Karla,
+                fontSize = 60.sp,
+                fontWeight = FontWeight.Normal,
+                lineHeight = 73.sp,
+                letterSpacing = (-0.5).sp
+            ),
+        h3 =
+            TextStyle(
+                fontFamily = Karla,
+                fontSize = 48.sp,
+                fontWeight = FontWeight.Normal,
+                lineHeight = 59.sp
+            ),
+        h4 =
+            TextStyle(
+                fontFamily = Karla,
+                fontSize = 30.sp,
+                fontWeight = FontWeight.Normal,
+                lineHeight = 37.sp
+            ),
+        h5 =
+            TextStyle(
+                fontFamily = Karla,
+                fontSize = 24.sp,
+                fontWeight = FontWeight.Normal,
+                lineHeight = 29.sp
+            ),
+        h6 =
+            TextStyle(
+                fontFamily = Karla,
+                fontSize = 20.sp,
+                fontWeight = FontWeight.Normal,
+                lineHeight = 24.sp
+            ),
+        subtitle1 =
+            TextStyle(
+                fontFamily = Karla,
+                fontSize = 16.sp,
+                fontWeight = FontWeight.Normal,
+                lineHeight = 24.sp,
+                letterSpacing = 0.15.sp
+            ),
+        subtitle2 =
+            TextStyle(
+                fontFamily = Karla,
+                fontSize = 14.sp,
+                fontWeight = FontWeight.Normal,
+                lineHeight = 24.sp,
+                letterSpacing = 0.1.sp
+            ),
+        body1 =
+            TextStyle(
+                fontFamily = Karla,
+                fontSize = 16.sp,
+                fontWeight = FontWeight.Normal,
+                lineHeight = 28.sp,
+                letterSpacing = 0.15.sp
+            ),
+        body2 =
+            TextStyle(
+                fontFamily = Karla,
+                fontSize = 14.sp,
+                fontWeight = FontWeight.Normal,
+                lineHeight = 20.sp,
+                letterSpacing = 0.25.sp
+            ),
+        button =
+            TextStyle(
+                fontFamily = Karla,
+                fontSize = 14.sp,
+                fontWeight = FontWeight.Normal,
+                lineHeight = 16.sp,
+                letterSpacing = 1.25.sp
+            ),
+        caption =
+            TextStyle(
+                fontFamily = Karla,
+                fontSize = 12.sp,
+                fontWeight = FontWeight.Normal,
+                lineHeight = 16.sp,
+                letterSpacing = 0.4.sp
+            ),
+        overline =
+            TextStyle(
+                fontFamily = Karla,
+                fontSize = 12.sp,
+                fontWeight = FontWeight.Normal,
+                lineHeight = 16.sp,
+                letterSpacing = 1.sp
+            )
     )
-)
diff --git a/compose/integration-tests/hero/macrobenchmark-target/src/main/java/androidx/compose/integration/hero/macrobenchmark/target/IdleTracking.kt b/compose/integration-tests/hero/macrobenchmark-target/src/main/java/androidx/compose/integration/hero/macrobenchmark/target/IdleTracking.kt
index eaed6b5..9fefb9f 100644
--- a/compose/integration-tests/hero/macrobenchmark-target/src/main/java/androidx/compose/integration/hero/macrobenchmark/target/IdleTracking.kt
+++ b/compose/integration-tests/hero/macrobenchmark-target/src/main/java/androidx/compose/integration/hero/macrobenchmark/target/IdleTracking.kt
@@ -23,15 +23,16 @@
 
 internal fun ComponentActivity.launchIdlenessTracking() {
     val contentView: View = findViewById(android.R.id.content)
-    val callback: Choreographer.FrameCallback = object : Choreographer.FrameCallback {
-        override fun doFrame(frameTimeNanos: Long) {
-            if (Recomposer.runningRecomposers.value.any { it.hasPendingWork }) {
-                contentView.contentDescription = "COMPOSE-BUSY"
-            } else {
-                contentView.contentDescription = "COMPOSE-IDLE"
+    val callback: Choreographer.FrameCallback =
+        object : Choreographer.FrameCallback {
+            override fun doFrame(frameTimeNanos: Long) {
+                if (Recomposer.runningRecomposers.value.any { it.hasPendingWork }) {
+                    contentView.contentDescription = "COMPOSE-BUSY"
+                } else {
+                    contentView.contentDescription = "COMPOSE-IDLE"
+                }
+                Choreographer.getInstance().postFrameCallback(this)
             }
-            Choreographer.getInstance().postFrameCallback(this)
         }
-    }
     Choreographer.getInstance().postFrameCallback(callback)
 }
diff --git a/compose/integration-tests/hero/macrobenchmark-target/src/main/java/androidx/compose/integration/hero/macrobenchmark/target/jetsnack/JetsnackActivity.kt b/compose/integration-tests/hero/macrobenchmark-target/src/main/java/androidx/compose/integration/hero/macrobenchmark/target/jetsnack/JetsnackActivity.kt
index 7de956d..0fbdab1 100644
--- a/compose/integration-tests/hero/macrobenchmark-target/src/main/java/androidx/compose/integration/hero/macrobenchmark/target/jetsnack/JetsnackActivity.kt
+++ b/compose/integration-tests/hero/macrobenchmark-target/src/main/java/androidx/compose/integration/hero/macrobenchmark/target/jetsnack/JetsnackActivity.kt
@@ -26,11 +26,7 @@
 class JetsnackActivity : ComponentActivity() {
     override fun onCreate(savedInstanceState: Bundle?) {
         super.onCreate(savedInstanceState)
-        setContent {
-            JetsnackTheme {
-                Feed(onSnackClick = { /* Do Nothing */ })
-            }
-        }
+        setContent { JetsnackTheme { Feed(onSnackClick = { /* Do Nothing */ }) } }
 
         launchIdlenessTracking()
     }
diff --git a/compose/integration-tests/hero/macrobenchmark/src/main/java/androidx/compose/integration/hero/macrobenchmark/jetsnack/JetsnackScrollBenchmark.kt b/compose/integration-tests/hero/macrobenchmark/src/main/java/androidx/compose/integration/hero/macrobenchmark/jetsnack/JetsnackScrollBenchmark.kt
index 960597a..70ac8aa 100644
--- a/compose/integration-tests/hero/macrobenchmark/src/main/java/androidx/compose/integration/hero/macrobenchmark/jetsnack/JetsnackScrollBenchmark.kt
+++ b/compose/integration-tests/hero/macrobenchmark/src/main/java/androidx/compose/integration/hero/macrobenchmark/jetsnack/JetsnackScrollBenchmark.kt
@@ -38,8 +38,7 @@
 @LargeTest
 @RunWith(Parameterized::class)
 class JetsnackScrollBenchmark(val compilationMode: CompilationMode) {
-    @get:Rule
-    val benchmarkRule = MacrobenchmarkRule()
+    @get:Rule val benchmarkRule = MacrobenchmarkRule()
 
     @Test
     fun scrollHome() {
diff --git a/compose/integration-tests/hero/macrobenchmark/src/main/java/androidx/compose/integration/hero/macrobenchmark/jetsnack/JetsnackStartupBenchmark.kt b/compose/integration-tests/hero/macrobenchmark/src/main/java/androidx/compose/integration/hero/macrobenchmark/jetsnack/JetsnackStartupBenchmark.kt
index 669943f..089b999 100644
--- a/compose/integration-tests/hero/macrobenchmark/src/main/java/androidx/compose/integration/hero/macrobenchmark/jetsnack/JetsnackStartupBenchmark.kt
+++ b/compose/integration-tests/hero/macrobenchmark/src/main/java/androidx/compose/integration/hero/macrobenchmark/jetsnack/JetsnackStartupBenchmark.kt
@@ -31,17 +31,17 @@
 @LargeTest
 @RunWith(Parameterized::class)
 class JetsnackStartupBenchmark(val startupMode: StartupMode, val compilationMode: CompilationMode) {
-    @get:Rule
-    val benchmarkRule = MacrobenchmarkRule()
+    @get:Rule val benchmarkRule = MacrobenchmarkRule()
 
     @Test
-    fun startup() = benchmarkRule.measureStartup(
-        compilationMode = compilationMode,
-        startupMode = startupMode,
-        packageName = PACKAGE_NAME,
-    ) {
-        action = "$PACKAGE_NAME.jetsnack.JETSNACK_ACTIVITY"
-    }
+    fun startup() =
+        benchmarkRule.measureStartup(
+            compilationMode = compilationMode,
+            startupMode = startupMode,
+            packageName = PACKAGE_NAME,
+        ) {
+            action = "$PACKAGE_NAME.jetsnack.JETSNACK_ACTIVITY"
+        }
 
     companion object {
         @Parameterized.Parameters(name = "startup={0},compilationMode={1}")
diff --git a/compose/integration-tests/macrobenchmark-target/src/main/java/androidx/compose/integration/macrobenchmark/target/AndroidViewListActivity.kt b/compose/integration-tests/macrobenchmark-target/src/main/java/androidx/compose/integration/macrobenchmark/target/AndroidViewListActivity.kt
index 39dace586..057ee3f 100644
--- a/compose/integration-tests/macrobenchmark-target/src/main/java/androidx/compose/integration/macrobenchmark/target/AndroidViewListActivity.kt
+++ b/compose/integration-tests/macrobenchmark-target/src/main/java/androidx/compose/integration/macrobenchmark/target/AndroidViewListActivity.kt
@@ -31,9 +31,9 @@
 import androidx.compose.ui.viewinterop.AndroidView
 
 /**
- * This activity uses AndroidViews inside a LazyColumn. This helps us benchmark
- * a common point of migration between views and Compose. The implementation is designed to
- * match the LazyColumnActivity and the RecyclerViewActivity for comparison.
+ * This activity uses AndroidViews inside a LazyColumn. This helps us benchmark a common point of
+ * migration between views and Compose. The implementation is designed to match the
+ * LazyColumnActivity and the RecyclerViewActivity for comparison.
  */
 class AndroidViewListActivity : AppCompatActivity() {
     override fun onCreate(savedInstanceState: Bundle?) {
@@ -44,9 +44,7 @@
             LazyColumn(
                 modifier = Modifier.fillMaxWidth().semantics { contentDescription = "IamLazy" }
             ) {
-                items(List(itemCount) { Entry("Item $it") }) {
-                    ListRow(it)
-                }
+                items(List(itemCount) { Entry("Item $it") }) { ListRow(it) }
             }
         }
 
diff --git a/compose/integration-tests/macrobenchmark-target/src/main/java/androidx/compose/integration/macrobenchmark/target/BaselineProfileActivity.kt b/compose/integration-tests/macrobenchmark-target/src/main/java/androidx/compose/integration/macrobenchmark/target/BaselineProfileActivity.kt
index 2178cd2..3ccf87d 100644
--- a/compose/integration-tests/macrobenchmark-target/src/main/java/androidx/compose/integration/macrobenchmark/target/BaselineProfileActivity.kt
+++ b/compose/integration-tests/macrobenchmark-target/src/main/java/androidx/compose/integration/macrobenchmark/target/BaselineProfileActivity.kt
@@ -43,9 +43,7 @@
 
         setContent {
             LazyColumn(
-                modifier = Modifier
-                    .fillMaxWidth()
-                    .semantics { contentDescription = "IamLazy" }
+                modifier = Modifier.fillMaxWidth().semantics { contentDescription = "IamLazy" }
             ) {
                 itemsIndexed(entries) { index, item ->
                     if (index % 2 == 0) {
@@ -69,16 +67,9 @@
 private fun ListRow(entry: Entry) {
     Card(modifier = Modifier.padding(8.dp)) {
         Row {
-            Text(
-                text = entry.contents,
-                modifier = Modifier.padding(16.dp)
-            )
+            Text(text = entry.contents, modifier = Modifier.padding(16.dp))
             Spacer(modifier = Modifier.weight(1f, fill = true))
-            Checkbox(
-                checked = false,
-                onCheckedChange = {},
-                modifier = Modifier.padding(16.dp)
-            )
+            Checkbox(checked = false, onCheckedChange = {}, modifier = Modifier.padding(16.dp))
         }
     }
 }
diff --git a/compose/integration-tests/macrobenchmark-target/src/main/java/androidx/compose/integration/macrobenchmark/target/ComplexNestedListsActivity.kt b/compose/integration-tests/macrobenchmark-target/src/main/java/androidx/compose/integration/macrobenchmark/target/ComplexNestedListsActivity.kt
index cab2d3d..f39805dd 100644
--- a/compose/integration-tests/macrobenchmark-target/src/main/java/androidx/compose/integration/macrobenchmark/target/ComplexNestedListsActivity.kt
+++ b/compose/integration-tests/macrobenchmark-target/src/main/java/androidx/compose/integration/macrobenchmark/target/ComplexNestedListsActivity.kt
@@ -82,16 +82,17 @@
 
     internal fun ComponentActivity.launchIdlenessTracking() {
         val contentView: View = findViewById(android.R.id.content)
-        val callback: Choreographer.FrameCallback = object : Choreographer.FrameCallback {
-            override fun doFrame(frameTimeNanos: Long) {
-                if (Recomposer.runningRecomposers.value.any { it.hasPendingWork }) {
-                    contentView.contentDescription = "COMPOSE-BUSY"
-                } else {
-                    contentView.contentDescription = "COMPOSE-IDLE"
+        val callback: Choreographer.FrameCallback =
+            object : Choreographer.FrameCallback {
+                override fun doFrame(frameTimeNanos: Long) {
+                    if (Recomposer.runningRecomposers.value.any { it.hasPendingWork }) {
+                        contentView.contentDescription = "COMPOSE-BUSY"
+                    } else {
+                        contentView.contentDescription = "COMPOSE-IDLE"
+                    }
+                    Choreographer.getInstance().postFrameCallback(this)
                 }
-                Choreographer.getInstance().postFrameCallback(this)
             }
-        }
         Choreographer.getInstance().postFrameCallback(callback)
     }
 }
@@ -101,21 +102,9 @@
     LazyColumn(Modifier.semantics { contentDescription = "IamLazy" }) {
         items(1000) {
             LazyRow {
-                items(10) {
-                    Video(
-                        modifier = Modifier
-                            .width(200.dp)
-                            .height(120.dp)
-                            .padding(16.dp)
-                    )
-                }
+                items(10) { Video(modifier = Modifier.width(200.dp).height(120.dp).padding(16.dp)) }
             }
-            Box(
-                modifier = Modifier
-                    .height(1.dp)
-                    .fillMaxWidth()
-                    .background(Color.Black)
-            )
+            Box(modifier = Modifier.height(1.dp).fillMaxWidth().background(Color.Black))
         }
     }
 }
@@ -129,11 +118,12 @@
     shimmerModifier: Modifier = Modifier
 ) {
     Column(
-        modifier = modifier.clickable(
-            interactionSource = remember { MutableInteractionSource() },
-            indication = null,
-            onClick = onVideoClick
-        )
+        modifier =
+            modifier.clickable(
+                interactionSource = remember { MutableInteractionSource() },
+                indication = null,
+                onClick = onVideoClick
+            )
     ) {
         VideoImageBox(
             modifier = Modifier.then(shimmerModifier),
@@ -150,38 +140,41 @@
     duration: String,
 ) {
     Card(
-        modifier = modifier
-            .aspectRatio(16f / 9)
-            .shadow(
-                elevation = 12.dp,
-                spotColor = Color.Gray,
-                shape = RoundedCornerShape(size = 12.dp)
-            )
+        modifier =
+            modifier
+                .aspectRatio(16f / 9)
+                .shadow(
+                    elevation = 12.dp,
+                    spotColor = Color.Gray,
+                    shape = RoundedCornerShape(size = 12.dp)
+                )
     ) {
         ConstraintLayout(Modifier.fillMaxSize()) {
             val (image, durationBox) = createRefs()
 
             AsyncImage(
-                modifier = Modifier.constrainAs(image) {
-                    top.linkTo(parent.top)
-                    bottom.linkTo(parent.bottom)
-                    start.linkTo(parent.start)
-                    end.linkTo(parent.end)
-                    width = Dimension.fillToConstraints
-                    height = Dimension.fillToConstraints
-                },
+                modifier =
+                    Modifier.constrainAs(image) {
+                        top.linkTo(parent.top)
+                        bottom.linkTo(parent.bottom)
+                        start.linkTo(parent.start)
+                        end.linkTo(parent.end)
+                        width = Dimension.fillToConstraints
+                        height = Dimension.fillToConstraints
+                    },
                 model = imageRes,
                 contentDescription = null,
                 contentScale = ContentScale.Crop
             )
 
             Row(
-                modifier = Modifier.constrainAs(durationBox) {
-                    bottom.linkTo(parent.bottom)
-                    end.linkTo(parent.end)
-                    width = Dimension.wrapContent
-                    height = Dimension.wrapContent
-                },
+                modifier =
+                    Modifier.constrainAs(durationBox) {
+                        bottom.linkTo(parent.bottom)
+                        end.linkTo(parent.end)
+                        width = Dimension.wrapContent
+                        height = Dimension.wrapContent
+                    },
                 verticalAlignment = Alignment.CenterVertically
             ) {
                 Text(
@@ -190,9 +183,7 @@
                 )
                 Spacer(modifier = Modifier.width(2.dp))
                 Icon(
-                    modifier = Modifier
-                        .size(12.dp)
-                        .padding(2.dp),
+                    modifier = Modifier.size(12.dp).padding(2.dp),
                     imageVector = Icons.Default.AccountBox,
                     contentDescription = null,
                     tint = Color.White
diff --git a/compose/integration-tests/macrobenchmark-target/src/main/java/androidx/compose/integration/macrobenchmark/target/CrossfadeActivity.kt b/compose/integration-tests/macrobenchmark-target/src/main/java/androidx/compose/integration/macrobenchmark/target/CrossfadeActivity.kt
index eed8a8d..59bdaf2 100644
--- a/compose/integration-tests/macrobenchmark-target/src/main/java/androidx/compose/integration/macrobenchmark/target/CrossfadeActivity.kt
+++ b/compose/integration-tests/macrobenchmark-target/src/main/java/androidx/compose/integration/macrobenchmark/target/CrossfadeActivity.kt
@@ -49,17 +49,18 @@
                         modifier = Modifier.size(150.dp),
                         label = "Crossfade",
                         targetState = targetState
-                    ) {
-                    }
+                    ) {}
                 }
                 Button(
                     modifier = Modifier.semantics { contentDescription = "toggle-crossfade" },
-                    onClick = { toggled = !toggled }) {
+                    onClick = { toggled = !toggled }
+                ) {
                     Text(toggled.toString())
                 }
                 Button(
                     modifier = Modifier.semantics { contentDescription = "toggle-target" },
-                    onClick = { targetState = !targetState }) {
+                    onClick = { targetState = !targetState }
+                ) {
                     Text(targetState.toString())
                 }
             }
diff --git a/compose/integration-tests/macrobenchmark-target/src/main/java/androidx/compose/integration/macrobenchmark/target/DifferentTypesListActivity.kt b/compose/integration-tests/macrobenchmark-target/src/main/java/androidx/compose/integration/macrobenchmark/target/DifferentTypesListActivity.kt
index 1e80c0e..30487ca 100644
--- a/compose/integration-tests/macrobenchmark-target/src/main/java/androidx/compose/integration/macrobenchmark/target/DifferentTypesListActivity.kt
+++ b/compose/integration-tests/macrobenchmark-target/src/main/java/androidx/compose/integration/macrobenchmark/target/DifferentTypesListActivity.kt
@@ -65,9 +65,7 @@
 
         setContent {
             LazyColumn(
-                modifier = Modifier
-                    .fillMaxWidth()
-                    .semantics { contentDescription = "IamLazy" }
+                modifier = Modifier.fillMaxWidth().semantics { contentDescription = "IamLazy" }
             ) {
                 items(count = itemCount, key = { it }, contentType = { it % 2 }) {
                     if (it % 2 == 0) {
@@ -84,16 +82,17 @@
 
     internal fun ComponentActivity.launchIdlenessTracking() {
         val contentView: View = findViewById(android.R.id.content)
-        val callback: Choreographer.FrameCallback = object : Choreographer.FrameCallback {
-            override fun doFrame(frameTimeNanos: Long) {
-                if (Recomposer.runningRecomposers.value.any { it.hasPendingWork }) {
-                    contentView.contentDescription = "COMPOSE-BUSY"
-                } else {
-                    contentView.contentDescription = "COMPOSE-IDLE"
+        val callback: Choreographer.FrameCallback =
+            object : Choreographer.FrameCallback {
+                override fun doFrame(frameTimeNanos: Long) {
+                    if (Recomposer.runningRecomposers.value.any { it.hasPendingWork }) {
+                        contentView.contentDescription = "COMPOSE-BUSY"
+                    } else {
+                        contentView.contentDescription = "COMPOSE-IDLE"
+                    }
+                    Choreographer.getInstance().postFrameCallback(this)
                 }
-                Choreographer.getInstance().postFrameCallback(this)
             }
-        }
         Choreographer.getInstance().postFrameCallback(callback)
     }
 
@@ -104,9 +103,7 @@
 
 @Composable
 private fun OddItem(index: Int) {
-    Card(modifier = Modifier
-        .padding(8.dp)
-        .fillMaxWidth()) {
+    Card(modifier = Modifier.padding(8.dp).fillMaxWidth()) {
         Column {
             Row(verticalAlignment = Alignment.CenterVertically) {
                 Text(
@@ -115,11 +112,7 @@
                     modifier = Modifier.padding(16.dp)
                 )
                 Spacer(modifier = Modifier.weight(1f, fill = true))
-                Checkbox(
-                    checked = false,
-                    onCheckedChange = {},
-                    modifier = Modifier.padding(16.dp)
-                )
+                Checkbox(checked = false, onCheckedChange = {}, modifier = Modifier.padding(16.dp))
             }
             Row {
                 LazyRow {
@@ -127,43 +120,26 @@
                         Image(
                             painter = painterResource(id = R.drawable.ic_launcher),
                             contentDescription = "ic launcher",
-                            modifier = Modifier
-                                .padding(8.dp)
-                                .border(2.dp, Color.White)
-                                .padding(8.dp)
-                                .border(2.dp, Color.Green)
-                                .padding(8.dp)
+                            modifier =
+                                Modifier.padding(8.dp)
+                                    .border(2.dp, Color.White)
+                                    .padding(8.dp)
+                                    .border(2.dp, Color.Green)
+                                    .padding(8.dp)
                         )
                     }
                 }
             }
             Row(verticalAlignment = Alignment.CenterVertically) {
-
                 var expanded by remember { mutableStateOf(false) }
-                Box(
-                    modifier = Modifier
-                        .fillMaxWidth()
-                        .wrapContentSize(Alignment.TopEnd)
-                ) {
+                Box(modifier = Modifier.fillMaxWidth().wrapContentSize(Alignment.TopEnd)) {
                     IconButton(onClick = { expanded = !expanded }) {
-                        Icon(
-                            imageVector = Icons.Default.MoreVert,
-                            contentDescription = "More"
-                        )
+                        Icon(imageVector = Icons.Default.MoreVert, contentDescription = "More")
                     }
 
-                    DropdownMenu(
-                        expanded = expanded,
-                        onDismissRequest = { expanded = false }
-                    ) {
-                        DropdownMenuItem(
-                            text = { Text("Load") },
-                            onClick = {}
-                        )
-                        DropdownMenuItem(
-                            text = { Text("Save") },
-                            onClick = {}
-                        )
+                    DropdownMenu(expanded = expanded, onDismissRequest = { expanded = false }) {
+                        DropdownMenuItem(text = { Text("Load") }, onClick = {})
+                        DropdownMenuItem(text = { Text("Save") }, onClick = {})
                     }
                 }
             }
@@ -173,7 +149,5 @@
 
 @Composable
 private fun EvenItem(index: Int) {
-    Column(modifier = Modifier.padding(16.dp)) {
-        Text(text = "Even item $index", fontSize = 17.sp)
-    }
+    Column(modifier = Modifier.padding(16.dp)) { Text(text = "Even item $index", fontSize = 17.sp) }
 }
diff --git a/compose/integration-tests/macrobenchmark-target/src/main/java/androidx/compose/integration/macrobenchmark/target/FrameExperimentActivity.kt b/compose/integration-tests/macrobenchmark-target/src/main/java/androidx/compose/integration/macrobenchmark/target/FrameExperimentActivity.kt
index 7c4f269..0f6c7fa 100644
--- a/compose/integration-tests/macrobenchmark-target/src/main/java/androidx/compose/integration/macrobenchmark/target/FrameExperimentActivity.kt
+++ b/compose/integration-tests/macrobenchmark-target/src/main/java/androidx/compose/integration/macrobenchmark/target/FrameExperimentActivity.kt
@@ -45,6 +45,7 @@
             invalidate()
         }
     }
+
     var remainingFrames = 0
 
     fun work(durationMs: Long = FRAME_ADDED_WORK_MS, label: String = "Added item work") {
@@ -52,8 +53,7 @@
 
         // spin!
         val endTime = System.nanoTime() + durationMs * 1_000_000
-        @Suppress("ControlFlowWithEmptyBody")
-        while (System.nanoTime() < endTime) {}
+        @Suppress("ControlFlowWithEmptyBody") while (System.nanoTime() < endTime) {}
 
         Trace.endSection()
     }
@@ -70,20 +70,17 @@
         work(durationMs = FRAME_BASELINE_WORK_MS, "Baseline work frame $remainingFrames")
 
         // small rect to reduce flicker
-        canvas.drawRect(
-            0f, 0f, 200f, 200f,
-            if (remainingFrames % 2 == 0) paintA else paintB
-        )
+        canvas.drawRect(0f, 0f, 200f, 200f, if (remainingFrames % 2 == 0) paintA else paintB)
 
         if (remainingFrames >= 1) {
             remainingFrames--
             invalidate()
 
-            if (mode == FrameMode.PrefetchEveryFrame ||
-                (mode == FrameMode.PrefetchSomeFrames && remainingFrames % 5 == 0)) {
-                this.post {
-                    work()
-                }
+            if (
+                mode == FrameMode.PrefetchEveryFrame ||
+                    (mode == FrameMode.PrefetchSomeFrames && remainingFrames % 5 == 0)
+            ) {
+                this.post { work() }
             }
         }
     }
@@ -96,9 +93,7 @@
         val frameModeId = intent.getIntExtra(EXTRA_FRAME_MODE, defaultMode.id)
         val frameMode = FrameMode.values().first { it.id == frameModeId }
 
-        setContentView(
-            FrameExperimentView(this, frameMode)
-        )
+        setContentView(FrameExperimentView(this, frameMode))
     }
 
     companion object {
diff --git a/compose/integration-tests/macrobenchmark-target/src/main/java/androidx/compose/integration/macrobenchmark/target/FullyDrawnStartupActivity.kt b/compose/integration-tests/macrobenchmark-target/src/main/java/androidx/compose/integration/macrobenchmark/target/FullyDrawnStartupActivity.kt
index 521111b..f52e5ec 100644
--- a/compose/integration-tests/macrobenchmark-target/src/main/java/androidx/compose/integration/macrobenchmark/target/FullyDrawnStartupActivity.kt
+++ b/compose/integration-tests/macrobenchmark-target/src/main/java/androidx/compose/integration/macrobenchmark/target/FullyDrawnStartupActivity.kt
@@ -30,22 +30,16 @@
 class FullyDrawnStartupActivity : ComponentActivity() {
     override fun onCreate(savedInstanceState: Bundle?) {
         super.onCreate(savedInstanceState)
-        setContent {
-            TextBlock("Compose Macrobenchmark Target")
-        }
+        setContent { TextBlock("Compose Macrobenchmark Target") }
     }
 
     @Composable
-    fun ReportFullyDrawn(
-        text: String
-    ) {
+    fun ReportFullyDrawn(text: String) {
         val localView: View = LocalView.current
         LaunchedEffect(text) {
             val activity = localView.context as? Activity
             if (activity != null) {
-                localView.doOnPreDraw {
-                    activity.reportFullyDrawn()
-                }
+                localView.doOnPreDraw { activity.reportFullyDrawn() }
             }
         }
     }
diff --git a/compose/integration-tests/macrobenchmark-target/src/main/java/androidx/compose/integration/macrobenchmark/target/IoSettingsActivity.kt b/compose/integration-tests/macrobenchmark-target/src/main/java/androidx/compose/integration/macrobenchmark/target/IoSettingsActivity.kt
index 17e5427..fe3867b 100644
--- a/compose/integration-tests/macrobenchmark-target/src/main/java/androidx/compose/integration/macrobenchmark/target/IoSettingsActivity.kt
+++ b/compose/integration-tests/macrobenchmark-target/src/main/java/androidx/compose/integration/macrobenchmark/target/IoSettingsActivity.kt
@@ -63,11 +63,7 @@
     override fun onCreate(savedInstanceState: Bundle?) {
         super.onCreate(savedInstanceState)
         setContent {
-            MaterialTheme {
-                Surface {
-                    SettingsScreen(isLoading.value, switchesOn.value)
-                }
-            }
+            MaterialTheme { Surface { SettingsScreen(isLoading.value, switchesOn.value) } }
 
             if (isLoading.value) {
                 // Forces another recomposition right after this one. Simulates a delayed ViewModel
@@ -82,10 +78,7 @@
 }
 
 @Composable
-fun SettingsScreen(
-    isLoading: Boolean,
-    switchesOn: Boolean
-) {
+fun SettingsScreen(isLoading: Boolean, switchesOn: Boolean) {
     Box(Modifier.fillMaxSize()) {
         SettingsScreenContent(
             isLoading = isLoading,
@@ -118,12 +111,8 @@
 }
 
 @Composable
-private fun ColumnScope.SettingsSection(
-    switchesOn: Boolean
-) {
-    val switchModifier = Modifier
-        .padding(marginNormal)
-        .fillMaxWidth()
+private fun ColumnScope.SettingsSection(switchesOn: Boolean) {
+    val switchModifier = Modifier.padding(marginNormal).fillMaxWidth()
     SwitchSetting(
         text = stringResource(R.string.io_settings_time_zone_label),
         checked = switchesOn,
@@ -145,13 +134,11 @@
 }
 
 @Composable
-private fun AboutSection(
-    openWebsiteLink: (String) -> Unit
-) {
+private fun AboutSection(openWebsiteLink: (String) -> Unit) {
     Text(
-        text = stringResource(R.string.io_about_title).uppercase(
-            LocaleListCompat.getDefault().get(0)!!
-        ),
+        text =
+            stringResource(R.string.io_about_title)
+                .uppercase(LocaleListCompat.getDefault().get(0)!!),
         style = MaterialTheme.typography.body2,
         fontWeight = FontWeight.SemiBold,
         color = MaterialTheme.colors.onSurface.copy(alpha = 0.6f),
@@ -159,49 +146,32 @@
     )
 
     val tosUrl = stringResource(R.string.io_tos_url)
-    TextButton(
-        modifier = Modifier.padding(marginSmall),
-        onClick = {
-            openWebsiteLink(tosUrl)
-        }
-    ) {
+    TextButton(modifier = Modifier.padding(marginSmall), onClick = { openWebsiteLink(tosUrl) }) {
         LinkText(stringResource(R.string.io_settings_tos))
     }
 
     val privacyPolicyUrl = stringResource(R.string.io_privacy_policy_url)
     TextButton(
         modifier = Modifier.padding(marginSmall),
-        onClick = {
-            openWebsiteLink(privacyPolicyUrl)
-        }
+        onClick = { openWebsiteLink(privacyPolicyUrl) }
     ) {
         LinkText(stringResource(R.string.io_settings_privacy_policy))
     }
 
-    TextButton(
-        modifier = Modifier.padding(marginSmall),
-        onClick = { Log.d("IO", "Click") }
-    ) {
+    TextButton(modifier = Modifier.padding(marginSmall), onClick = { Log.d("IO", "Click") }) {
         LinkText(stringResource(R.string.io_settings_oss_licenses))
     }
 
     Text(
         text = stringResource(R.string.io_version_name, "test"),
-        modifier = Modifier
-            .fillMaxWidth()
-            .sizeIn(minHeight = 48.dp)
-            .padding(marginNormal),
+        modifier = Modifier.fillMaxWidth().sizeIn(minHeight = 48.dp).padding(marginNormal),
         style = MaterialTheme.typography.body2,
     )
 }
 
 @Composable
 private fun LinkText(text: String) {
-    Text(
-        text = text,
-        modifier = Modifier.fillMaxWidth(),
-        style = MaterialTheme.typography.body1
-    )
+    Text(text = text, modifier = Modifier.fillMaxWidth(), style = MaterialTheme.typography.body1)
 }
 
 @Composable
@@ -214,17 +184,13 @@
     Row(modifier) {
         Text(
             text = text,
-            modifier = Modifier
-                .weight(1f)
-                .align(Alignment.CenterVertically),
+            modifier = Modifier.weight(1f).align(Alignment.CenterVertically),
             style = MaterialTheme.typography.body2
         )
         Switch(
             checked = checked,
             onCheckedChange = onCheck,
-            colors = SwitchDefaults.colors(
-                checkedThumbColor = MaterialTheme.colors.primary
-            )
+            colors = SwitchDefaults.colors(checkedThumbColor = MaterialTheme.colors.primary)
         )
     }
 }
diff --git a/compose/integration-tests/macrobenchmark-target/src/main/java/androidx/compose/integration/macrobenchmark/target/LazyBoxWithConstraintsActivity.kt b/compose/integration-tests/macrobenchmark-target/src/main/java/androidx/compose/integration/macrobenchmark/target/LazyBoxWithConstraintsActivity.kt
index 244dd6b..85ea57f 100644
--- a/compose/integration-tests/macrobenchmark-target/src/main/java/androidx/compose/integration/macrobenchmark/target/LazyBoxWithConstraintsActivity.kt
+++ b/compose/integration-tests/macrobenchmark-target/src/main/java/androidx/compose/integration/macrobenchmark/target/LazyBoxWithConstraintsActivity.kt
@@ -43,25 +43,16 @@
         super.onCreate(savedInstanceState)
 
         val itemCount = intent.getIntExtra(EXTRA_ITEM_COUNT, 3000)
-        val items = List(itemCount) { entryIndex ->
-            NestedListEntry(
-                buildList {
-                    repeat(10) {
-                        add("${entryIndex}x$it")
-                    }
-                }
-            )
-        }
+        val items =
+            List(itemCount) { entryIndex ->
+                NestedListEntry(buildList { repeat(10) { add("${entryIndex}x$it") } })
+            }
 
         setContent {
             LazyColumn(
-                modifier = Modifier
-                    .fillMaxWidth()
-                    .semantics { contentDescription = "IamLazy" }
+                modifier = Modifier.fillMaxWidth().semantics { contentDescription = "IamLazy" }
             ) {
-                items(items) { entry ->
-                    NonLazyRow(entry)
-                }
+                items(items) { entry -> NonLazyRow(entry) }
             }
         }
 
@@ -78,15 +69,9 @@
     // Need the nested subcompose layout for testing
     @Suppress("UnusedBoxWithConstraintsScope")
     BoxWithConstraints {
-        Row(
-            Modifier
-                .padding(16.dp)
-                .horizontalScroll(rememberScrollState())
-        ) {
+        Row(Modifier.padding(16.dp).horizontalScroll(rememberScrollState())) {
             entry.list.forEach {
-                Card(Modifier.size(80.dp)) {
-                    Text(text = it)
-                }
+                Card(Modifier.size(80.dp)) { Text(text = it) }
                 Spacer(Modifier.size(16.dp))
             }
         }
diff --git a/compose/integration-tests/macrobenchmark-target/src/main/java/androidx/compose/integration/macrobenchmark/target/LazyColumnActivity.kt b/compose/integration-tests/macrobenchmark-target/src/main/java/androidx/compose/integration/macrobenchmark/target/LazyColumnActivity.kt
index 4d7df44..4b8b54f 100644
--- a/compose/integration-tests/macrobenchmark-target/src/main/java/androidx/compose/integration/macrobenchmark/target/LazyColumnActivity.kt
+++ b/compose/integration-tests/macrobenchmark-target/src/main/java/androidx/compose/integration/macrobenchmark/target/LazyColumnActivity.kt
@@ -48,9 +48,7 @@
             LazyColumn(
                 modifier = Modifier.fillMaxWidth().semantics { contentDescription = "IamLazy" }
             ) {
-                items(entries) {
-                    ListRow(it)
-                }
+                items(entries) { ListRow(it) }
             }
         }
 
@@ -64,16 +62,17 @@
 
 internal fun ComponentActivity.launchIdlenessTracking() {
     val contentView: View = findViewById(android.R.id.content)
-    val callback: Choreographer.FrameCallback = object : Choreographer.FrameCallback {
-        override fun doFrame(frameTimeNanos: Long) {
-            if (Recomposer.runningRecomposers.value.any { it.hasPendingWork }) {
-                contentView.contentDescription = "COMPOSE-BUSY"
-            } else {
-                contentView.contentDescription = "COMPOSE-IDLE"
+    val callback: Choreographer.FrameCallback =
+        object : Choreographer.FrameCallback {
+            override fun doFrame(frameTimeNanos: Long) {
+                if (Recomposer.runningRecomposers.value.any { it.hasPendingWork }) {
+                    contentView.contentDescription = "COMPOSE-BUSY"
+                } else {
+                    contentView.contentDescription = "COMPOSE-IDLE"
+                }
+                Choreographer.getInstance().postFrameCallback(this)
             }
-            Choreographer.getInstance().postFrameCallback(this)
         }
-    }
     Choreographer.getInstance().postFrameCallback(callback)
 }
 
@@ -81,16 +80,9 @@
 private fun ListRow(entry: Entry) {
     Card(modifier = Modifier.padding(8.dp)) {
         Row {
-            Text(
-                text = entry.contents,
-                modifier = Modifier.padding(16.dp)
-            )
+            Text(text = entry.contents, modifier = Modifier.padding(16.dp))
             Spacer(modifier = Modifier.weight(1f, fill = true))
-            Checkbox(
-                checked = false,
-                onCheckedChange = {},
-                modifier = Modifier.padding(16.dp)
-            )
+            Checkbox(checked = false, onCheckedChange = {}, modifier = Modifier.padding(16.dp))
         }
     }
 }
diff --git a/compose/integration-tests/macrobenchmark-target/src/main/java/androidx/compose/integration/macrobenchmark/target/LazyVerticalGridActivity.kt b/compose/integration-tests/macrobenchmark-target/src/main/java/androidx/compose/integration/macrobenchmark/target/LazyVerticalGridActivity.kt
index c201d05..91504ab 100644
--- a/compose/integration-tests/macrobenchmark-target/src/main/java/androidx/compose/integration/macrobenchmark/target/LazyVerticalGridActivity.kt
+++ b/compose/integration-tests/macrobenchmark-target/src/main/java/androidx/compose/integration/macrobenchmark/target/LazyVerticalGridActivity.kt
@@ -47,9 +47,7 @@
                     columns = GridCells.Fixed(4),
                     modifier = Modifier.fillMaxWidth().semantics { contentDescription = "IamLazy" }
                 ) {
-                    items(entries) {
-                        ListCell(it)
-                    }
+                    items(entries) { ListCell(it) }
                 }
             }
         }
@@ -64,11 +62,7 @@
 
 @Composable
 private fun ListCell(entry: Entry) {
-    Card(
-        modifier = Modifier
-            .fillMaxWidth()
-            .padding(8.dp)
-    ) {
+    Card(modifier = Modifier.fillMaxWidth().padding(8.dp)) {
         Text(
             text = entry.contents,
             textAlign = TextAlign.Center,
diff --git a/compose/integration-tests/macrobenchmark-target/src/main/java/androidx/compose/integration/macrobenchmark/target/NestedListsActivity.kt b/compose/integration-tests/macrobenchmark-target/src/main/java/androidx/compose/integration/macrobenchmark/target/NestedListsActivity.kt
index cc5272a..113dd05 100644
--- a/compose/integration-tests/macrobenchmark-target/src/main/java/androidx/compose/integration/macrobenchmark/target/NestedListsActivity.kt
+++ b/compose/integration-tests/macrobenchmark-target/src/main/java/androidx/compose/integration/macrobenchmark/target/NestedListsActivity.kt
@@ -40,23 +40,16 @@
         super.onCreate(savedInstanceState)
 
         val itemCount = intent.getIntExtra(EXTRA_ITEM_COUNT, 3000)
-        val items = List(itemCount) { entryIndex ->
-            NestedListEntry(
-                buildList {
-                    repeat(10) {
-                        add("${entryIndex}x$it")
-                    }
-                }
-            )
-        }
+        val items =
+            List(itemCount) { entryIndex ->
+                NestedListEntry(buildList { repeat(10) { add("${entryIndex}x$it") } })
+            }
 
         setContent {
             LazyColumn(
                 modifier = Modifier.fillMaxWidth().semantics { contentDescription = "IamLazy" }
             ) {
-                items(items) {
-                    ListRow(it)
-                }
+                items(items) { ListRow(it) }
             }
         }
 
@@ -72,9 +65,7 @@
 private fun ListRow(entry: NestedListEntry) {
     LazyRow(contentPadding = PaddingValues(16.dp)) {
         items(entry.list) {
-            Card(Modifier.size(108.dp)) {
-                Text(text = it)
-            }
+            Card(Modifier.size(108.dp)) { Text(text = it) }
             Spacer(Modifier.size(16.dp))
         }
     }
diff --git a/compose/integration-tests/macrobenchmark-target/src/main/java/androidx/compose/integration/macrobenchmark/target/PagerActivity.kt b/compose/integration-tests/macrobenchmark-target/src/main/java/androidx/compose/integration/macrobenchmark/target/PagerActivity.kt
index c7e90d4..ca0da94 100644
--- a/compose/integration-tests/macrobenchmark-target/src/main/java/androidx/compose/integration/macrobenchmark/target/PagerActivity.kt
+++ b/compose/integration-tests/macrobenchmark-target/src/main/java/androidx/compose/integration/macrobenchmark/target/PagerActivity.kt
@@ -45,16 +45,12 @@
 
         setContent {
             val pagerState = rememberPagerState { itemCount }
-            Box(
-                modifier = Modifier
-                    .fillMaxSize(),
-                contentAlignment = Alignment.Center
-            ) {
+            Box(modifier = Modifier.fillMaxSize(), contentAlignment = Alignment.Center) {
                 HorizontalPager(
-                    modifier = Modifier
-                        .height(400.dp)
-                        .semantics { contentDescription = "Pager" }
-                        .background(Color.White),
+                    modifier =
+                        Modifier.height(400.dp)
+                            .semantics { contentDescription = "Pager" }
+                            .background(Color.White),
                     state = pagerState,
                     pageSize = PageSize.Fill
                 ) {
@@ -73,11 +69,7 @@
 
 @Composable
 private fun PagerItem(index: Int) {
-    Box(
-        modifier = Modifier
-            .fillMaxSize()
-            .background(Color.Black)
-    ) {
+    Box(modifier = Modifier.fillMaxSize().background(Color.Black)) {
         Text(text = index.toString(), color = Color.White)
     }
 }
diff --git a/compose/integration-tests/macrobenchmark-target/src/main/java/androidx/compose/integration/macrobenchmark/target/PagerAsCarouselActivity.kt b/compose/integration-tests/macrobenchmark-target/src/main/java/androidx/compose/integration/macrobenchmark/target/PagerAsCarouselActivity.kt
index 6bfa566..39da0f2 100644
--- a/compose/integration-tests/macrobenchmark-target/src/main/java/androidx/compose/integration/macrobenchmark/target/PagerAsCarouselActivity.kt
+++ b/compose/integration-tests/macrobenchmark-target/src/main/java/androidx/compose/integration/macrobenchmark/target/PagerAsCarouselActivity.kt
@@ -47,15 +47,13 @@
         setContent {
             val pagerState = rememberPagerState { itemCount }
             Box(
-                modifier = Modifier
-                    .fillMaxSize()
-                    .background(Color.White),
+                modifier = Modifier.fillMaxSize().background(Color.White),
                 contentAlignment = Alignment.Center
             ) {
                 HorizontalPager(
-                    modifier = Modifier
-                        .semantics { contentDescription = "Carousel" }
-                        .background(Color.White),
+                    modifier =
+                        Modifier.semantics { contentDescription = "Carousel" }
+                            .background(Color.White),
                     state = pagerState,
                     pageSize = PageSize.Fixed(200.dp)
                 ) {
@@ -74,12 +72,7 @@
 
 @Composable
 private fun PagerItem(index: Int) {
-    Box(
-        modifier = Modifier
-            .fillMaxWidth()
-            .height(200.dp)
-            .background(Color.Black)
-    ) {
+    Box(modifier = Modifier.fillMaxWidth().height(200.dp).background(Color.Black)) {
         Text(text = index.toString(), color = Color.White)
     }
 }
diff --git a/compose/integration-tests/macrobenchmark-target/src/main/java/androidx/compose/integration/macrobenchmark/target/PagerOfLazyGridActivity.kt b/compose/integration-tests/macrobenchmark-target/src/main/java/androidx/compose/integration/macrobenchmark/target/PagerOfLazyGridActivity.kt
index a18a1be..6a259f1 100644
--- a/compose/integration-tests/macrobenchmark-target/src/main/java/androidx/compose/integration/macrobenchmark/target/PagerOfLazyGridActivity.kt
+++ b/compose/integration-tests/macrobenchmark-target/src/main/java/androidx/compose/integration/macrobenchmark/target/PagerOfLazyGridActivity.kt
@@ -46,11 +46,7 @@
         val pageCount = intent.getIntExtra(PageCount, 100)
         val gridItemCount = intent.getIntExtra(GridItemCount, 100)
 
-        setContent {
-            MaterialTheme {
-                HorizontalPagerOfLazyGrid(pageCount, gridItemCount)
-            }
-        }
+        setContent { MaterialTheme { HorizontalPagerOfLazyGrid(pageCount, gridItemCount) } }
 
         launchIdlenessTracking()
     }
@@ -67,16 +63,12 @@
     val pagerState: PagerState = rememberPagerState(initialPage = 1) { pages }
     val coroutineScope = rememberCoroutineScope()
 
-    Column(
-        modifier = Modifier
-            .fillMaxSize()
-            .background(MaterialTheme.colors.background)
-    ) {
-        Button(onClick = {
-            coroutineScope.launch {
-                pagerState.animateScrollToPage(pagerState.currentPage + 1)
+    Column(modifier = Modifier.fillMaxSize().background(MaterialTheme.colors.background)) {
+        Button(
+            onClick = {
+                coroutineScope.launch { pagerState.animateScrollToPage(pagerState.currentPage + 1) }
             }
-        }) {
+        ) {
             Text("Next")
         }
 
@@ -97,9 +89,7 @@
         columns = GridCells.Fixed(3),
     ) {
         items(itemCount, contentType = { "cell" }) { _ ->
-            Button(onClick = {}) {
-                Text(text = text)
-            }
+            Button(onClick = {}) { Text(text = text) }
         }
     }
 }
diff --git a/compose/integration-tests/macrobenchmark-target/src/main/java/androidx/compose/integration/macrobenchmark/target/RecyclerViewAsCarouselActivity.kt b/compose/integration-tests/macrobenchmark-target/src/main/java/androidx/compose/integration/macrobenchmark/target/RecyclerViewAsCarouselActivity.kt
index 400ed7c..cf69466 100644
--- a/compose/integration-tests/macrobenchmark-target/src/main/java/androidx/compose/integration/macrobenchmark/target/RecyclerViewAsCarouselActivity.kt
+++ b/compose/integration-tests/macrobenchmark-target/src/main/java/androidx/compose/integration/macrobenchmark/target/RecyclerViewAsCarouselActivity.kt
@@ -51,9 +51,9 @@
         parent: ViewGroup,
         viewType: Int
     ): RecyclerViewAsPagerViewHolder {
-        val view = LayoutInflater
-            .from(parent.context)
-            .inflate(R.layout.recycler_view_as_carousel_item, parent, false)
+        val view =
+            LayoutInflater.from(parent.context)
+                .inflate(R.layout.recycler_view_as_carousel_item, parent, false)
 
         return RecyclerViewAsPagerViewHolder(view)
     }
diff --git a/compose/integration-tests/macrobenchmark-target/src/main/java/androidx/compose/integration/macrobenchmark/target/RecyclerViewListActivity.kt b/compose/integration-tests/macrobenchmark-target/src/main/java/androidx/compose/integration/macrobenchmark/target/RecyclerViewListActivity.kt
index 0c141f2..5aaac0c 100644
--- a/compose/integration-tests/macrobenchmark-target/src/main/java/androidx/compose/integration/macrobenchmark/target/RecyclerViewListActivity.kt
+++ b/compose/integration-tests/macrobenchmark-target/src/main/java/androidx/compose/integration/macrobenchmark/target/RecyclerViewListActivity.kt
@@ -35,9 +35,9 @@
 import androidx.recyclerview.widget.RecyclerView
 
 /**
- * This activity uses ComposeViews inside a RecyclerView. This helps us benchmark
- * a common point of migration between views and Compose. The implementation is designed to
- * match the LazyColumnActivity and the RecyclerViewActivity for comparison.
+ * This activity uses ComposeViews inside a RecyclerView. This helps us benchmark a common point of
+ * migration between views and Compose. The implementation is designed to match the
+ * LazyColumnActivity and the RecyclerViewActivity for comparison.
  */
 class RecyclerViewListActivity : AppCompatActivity() {
     override fun onCreate(savedInstanceState: Bundle?) {
@@ -53,9 +53,7 @@
         launchIdlenessTracking()
     }
 
-    private fun entries(size: Int) = List(size) {
-        Entry("Item $it")
-    }
+    private fun entries(size: Int) = List(size) { Entry("Item $it") }
 
     companion object {
         const val EXTRA_ITEM_COUNT = "ITEM_COUNT"
@@ -70,11 +68,7 @@
     }
 
     fun bind(entry: Entry) {
-        composeView.setContent {
-            MaterialTheme {
-                ListRow(entry)
-            }
-        }
+        composeView.setContent { MaterialTheme { ListRow(entry) } }
     }
 }
 
@@ -103,16 +97,9 @@
 private fun ListRow(entry: Entry) {
     Card(modifier = Modifier.padding(8.dp)) {
         Row {
-            Text(
-                text = entry.contents,
-                modifier = Modifier.padding(16.dp)
-            )
+            Text(text = entry.contents, modifier = Modifier.padding(16.dp))
             Spacer(modifier = Modifier.weight(1f, fill = true))
-            Checkbox(
-                checked = false,
-                onCheckedChange = {},
-                modifier = Modifier.padding(16.dp)
-            )
+            Checkbox(checked = false, onCheckedChange = {}, modifier = Modifier.padding(16.dp))
         }
     }
 }
diff --git a/compose/integration-tests/macrobenchmark-target/src/main/java/androidx/compose/integration/macrobenchmark/target/StaticScrollingContentWithChromeInitialCompositionActivity.kt b/compose/integration-tests/macrobenchmark-target/src/main/java/androidx/compose/integration/macrobenchmark/target/StaticScrollingContentWithChromeInitialCompositionActivity.kt
index 87810a2..aad899a 100644
--- a/compose/integration-tests/macrobenchmark-target/src/main/java/androidx/compose/integration/macrobenchmark/target/StaticScrollingContentWithChromeInitialCompositionActivity.kt
+++ b/compose/integration-tests/macrobenchmark-target/src/main/java/androidx/compose/integration/macrobenchmark/target/StaticScrollingContentWithChromeInitialCompositionActivity.kt
@@ -65,8 +65,10 @@
 class StaticScrollingContentWithChromeInitialCompositionActivity : ComponentActivity() {
 
     private val onlyPerformComposition: Boolean
-        get() = intent.action == "androidx.compose.integration.macrobenchmark.target" +
-            ".STATIC_SCROLLING_CONTENT_WITH_CHROME_INITIAL_COMPOSITION_ACTIVITY"
+        get() =
+            intent.action ==
+                "androidx.compose.integration.macrobenchmark.target" +
+                    ".STATIC_SCROLLING_CONTENT_WITH_CHROME_INITIAL_COMPOSITION_ACTIVITY"
 
     override fun onCreate(savedInstanceState: Bundle?) {
         super.onCreate(savedInstanceState)
@@ -74,17 +76,17 @@
             if (onlyPerformComposition) {
                 ComposeOnlyLayout {
                     StaticScrollingContentWithChrome(
-                        modifier = Modifier
-                            .onPlaced { _ ->
-                                throw RuntimeException(
-                                    "Content was placed, but should only be composed"
-                                )
-                            }
-                            .drawWithContent {
-                                throw RuntimeException(
-                                    "Content was drawn, but should only be composed"
-                                )
-                            }
+                        modifier =
+                            Modifier.onPlaced { _ ->
+                                    throw RuntimeException(
+                                        "Content was placed, but should only be composed"
+                                    )
+                                }
+                                .drawWithContent {
+                                    throw RuntimeException(
+                                        "Content was drawn, but should only be composed"
+                                    )
+                                }
                     )
                 }
             } else {
@@ -95,31 +97,28 @@
 }
 
 /**
- * A layout that will compose all of the [content], but will not place
- * (and therefore not layout or draw) any of its children.
+ * A layout that will compose all of the [content], but will not place (and therefore not layout or
+ * draw) any of its children.
  *
- * This is useful for this benchmark as we care about the composition time. A major limitation
- * of this approach is that any content in a SubcomposeLayout will not be composed
- * and will not contribute to the overall measured time of this test.
+ * This is useful for this benchmark as we care about the composition time. A major limitation of
+ * this approach is that any content in a SubcomposeLayout will not be composed and will not
+ * contribute to the overall measured time of this test.
  */
 @Composable
-private fun ComposeOnlyLayout(
-    content: @Composable () -> Unit
-) {
+private fun ComposeOnlyLayout(content: @Composable () -> Unit) {
     Layout(content) { _, _ -> layout(0, 0) {} }
 }
 
 @Preview
 @Composable
-private fun StaticScrollingContentWithChrome(
-    modifier: Modifier = Modifier
-) = trace(sectionName = "StaticScrollingContentWithChrome") {
-    Column(modifier) {
-        TopBar()
-        ScrollingContent(modifier = Modifier.weight(1f))
-        BottomBar()
+private fun StaticScrollingContentWithChrome(modifier: Modifier = Modifier) =
+    trace(sectionName = "StaticScrollingContentWithChrome") {
+        Column(modifier) {
+            TopBar()
+            ScrollingContent(modifier = Modifier.weight(1f))
+            BottomBar()
+        }
     }
-}
 
 @Composable
 private fun TopBar(modifier: Modifier = Modifier) {
@@ -139,16 +138,8 @@
                 )
             }
         },
-        navigationIcon = {
-            Button(onClick = {}) {
-                Icon(Icons.Default.Close, "Dismiss")
-            }
-        },
-        actions = {
-            Button(onClick = {}) {
-                Icon(Icons.Default.MoreVert, "Actions")
-            }
-        }
+        navigationIcon = { Button(onClick = {}) { Icon(Icons.Default.Close, "Dismiss") } },
+        actions = { Button(onClick = {}) { Icon(Icons.Default.MoreVert, "Actions") } }
     )
 }
 
@@ -170,20 +161,15 @@
 
 @Composable
 private fun ScrollingContent(modifier: Modifier = Modifier) {
-    Column(
-        modifier
-            .fillMaxSize()
-            .verticalScroll(rememberScrollState())
-            .padding(vertical = 16.dp)
-    ) {
+    Column(modifier.fillMaxSize().verticalScroll(rememberScrollState()).padding(vertical = 16.dp)) {
         Item(
             color = Color.DarkGray,
             icon = Icons.Filled.Info,
-            modifier = Modifier
-                .padding(horizontal = 16.dp)
-                .aspectRatio(16f / 9f)
-                .fillMaxWidth()
-                .clip(RoundedCornerShape(16.dp))
+            modifier =
+                Modifier.padding(horizontal = 16.dp)
+                    .aspectRatio(16f / 9f)
+                    .fillMaxWidth()
+                    .clip(RoundedCornerShape(16.dp))
         )
 
         repeat(5) { iteration ->
@@ -222,28 +208,20 @@
     modifier: Modifier = Modifier,
     count: Int = 10
 ) {
-    Column(
-        modifier = modifier
-    ) {
-        Text(
-            title,
-            style = MaterialTheme.typography.h6,
-            modifier = Modifier.padding(16.dp)
-        )
+    Column(modifier = modifier) {
+        Text(title, style = MaterialTheme.typography.h6, modifier = Modifier.padding(16.dp))
 
         Row(
-            modifier = Modifier
-                .horizontalScroll(rememberScrollState())
-                .padding(horizontal = 12.dp)
+            modifier = Modifier.horizontalScroll(rememberScrollState()).padding(horizontal = 12.dp)
         ) {
             repeat(count) {
                 Item(
                     color = groupColor,
                     icon = groupIcon,
-                    modifier = Modifier
-                        .padding(horizontal = 4.dp)
-                        .size(64.dp)
-                        .clip(RoundedCornerShape(4.dp))
+                    modifier =
+                        Modifier.padding(horizontal = 4.dp)
+                            .size(64.dp)
+                            .clip(RoundedCornerShape(4.dp))
                 )
             }
         }
@@ -251,15 +229,8 @@
 }
 
 @Composable
-private fun Item(
-    color: Color,
-    icon: ImageVector,
-    modifier: Modifier = Modifier
-) {
-    Box(
-        modifier = modifier.background(color),
-        contentAlignment = Alignment.Center
-    ) {
+private fun Item(color: Color, icon: ImageVector, modifier: Modifier = Modifier) {
+    Box(modifier = modifier.background(color), contentAlignment = Alignment.Center) {
         Icon(icon, null, tint = Color.White)
     }
 }
diff --git a/compose/integration-tests/macrobenchmark-target/src/main/java/androidx/compose/integration/macrobenchmark/target/TrivialStartupActivity.kt b/compose/integration-tests/macrobenchmark-target/src/main/java/androidx/compose/integration/macrobenchmark/target/TrivialStartupActivity.kt
index 9039903..d80b88b 100644
--- a/compose/integration-tests/macrobenchmark-target/src/main/java/androidx/compose/integration/macrobenchmark/target/TrivialStartupActivity.kt
+++ b/compose/integration-tests/macrobenchmark-target/src/main/java/androidx/compose/integration/macrobenchmark/target/TrivialStartupActivity.kt
@@ -25,8 +25,6 @@
     override fun onCreate(savedInstanceState: Bundle?) {
         super.onCreate(savedInstanceState)
 
-        setContent {
-            Text("Compose Macrobenchmark Target")
-        }
+        setContent { Text("Compose Macrobenchmark Target") }
     }
 }
diff --git a/compose/integration-tests/macrobenchmark-target/src/main/java/androidx/compose/integration/macrobenchmark/target/TrivialTracingActivity.kt b/compose/integration-tests/macrobenchmark-target/src/main/java/androidx/compose/integration/macrobenchmark/target/TrivialTracingActivity.kt
index 32c9b35..c859176 100644
--- a/compose/integration-tests/macrobenchmark-target/src/main/java/androidx/compose/integration/macrobenchmark/target/TrivialTracingActivity.kt
+++ b/compose/integration-tests/macrobenchmark-target/src/main/java/androidx/compose/integration/macrobenchmark/target/TrivialTracingActivity.kt
@@ -33,14 +33,10 @@
 }
 
 @Composable
-private fun Foo_BBC27C8E_13A7_4A5F_A735_AFDC433F54C3() =
-    Bar_4888EA32_ABC5_4550_BA78_1247FEC1AAC9()
+private fun Foo_BBC27C8E_13A7_4A5F_A735_AFDC433F54C3() = Bar_4888EA32_ABC5_4550_BA78_1247FEC1AAC9()
 
-@Composable
-private fun Bar_4888EA32_ABC5_4550_BA78_1247FEC1AAC9() {
-}
+@Composable private fun Bar_4888EA32_ABC5_4550_BA78_1247FEC1AAC9() {}
 
 @Suppress("NonAsciiCharacters")
 @Composable
-private fun Baz_609801AB_F5A9_47C3_94蛸5_2E82542F21B8() {
-}
+private fun Baz_609801AB_F5A9_47C3_94蛸5_2E82542F21B8() {}
diff --git a/compose/integration-tests/macrobenchmark-target/src/main/java/androidx/compose/integration/macrobenchmark/target/VectorsListActivity.kt b/compose/integration-tests/macrobenchmark-target/src/main/java/androidx/compose/integration/macrobenchmark/target/VectorsListActivity.kt
index bce140d..b7ccaff 100644
--- a/compose/integration-tests/macrobenchmark-target/src/main/java/androidx/compose/integration/macrobenchmark/target/VectorsListActivity.kt
+++ b/compose/integration-tests/macrobenchmark-target/src/main/java/androidx/compose/integration/macrobenchmark/target/VectorsListActivity.kt
@@ -48,6 +48,7 @@
 class VectorsListActivity : ComponentActivity() {
 
     private var contents = arrayListOf<String>()
+
     init {
         for (index in 0..1000) {
             contents.add("compose$index")
@@ -57,9 +58,7 @@
     override fun onCreate(savedInstanceState: Bundle?) {
         super.onCreate(savedInstanceState)
 
-        setContent {
-            ComposeLazyList()
-        }
+        setContent { ComposeLazyList() }
 
         launchIdlenessTracking()
     }
@@ -69,44 +68,26 @@
         LazyColumn(
             modifier = Modifier.fillMaxSize().semantics { contentDescription = "IamLazy" },
         ) {
-            items(
-                count = 1000,
-                key = { index ->
-                    index
-                },
-                contentType = {
-                    "test"
-                }
-            ) { index ->
+            items(count = 1000, key = { index -> index }, contentType = { "test" }) { index ->
                 val text = contents[index]
                 Row(
-                    modifier = Modifier
-                        .fillMaxWidth()
-                        .defaultMinSize(Dp(64F))
-                        .wrapContentHeight()
-                        .padding(
-                            vertical = Dp(12F),
-                            horizontal = Dp(12F)
-                        ),
+                    modifier =
+                        Modifier.fillMaxWidth()
+                            .defaultMinSize(Dp(64F))
+                            .wrapContentHeight()
+                            .padding(vertical = Dp(12F), horizontal = Dp(12F)),
                     verticalAlignment = Alignment.CenterVertically,
                     horizontalArrangement = Arrangement.SpaceEvenly
                 ) {
                     Image(
-                        painter = painterResource(
-                            id = R.drawable.ic_launcher
-                        ),
-                        modifier = Modifier
-                            .height(Dp(40F))
-                            .width(Dp(40F)),
+                        painter = painterResource(id = R.drawable.ic_launcher),
+                        modifier = Modifier.height(Dp(40F)).width(Dp(40F)),
                         contentScale = ContentScale.Fit,
                         alignment = Alignment.Center,
                         contentDescription = ""
                     )
                     Column(
-                        modifier = Modifier
-                            .weight(1f)
-                            .fillMaxWidth()
-                            .padding(horizontal = Dp(16F))
+                        modifier = Modifier.weight(1f).fillMaxWidth().padding(horizontal = Dp(16F))
                     ) {
                         Text(
                             fontStyle = FontStyle.Normal,
@@ -115,17 +96,14 @@
                             overflow = TextOverflow.Ellipsis,
                             text = text
                         )
-                        Row(
-                            verticalAlignment = Alignment.CenterVertically
-                        ) {
+                        Row(verticalAlignment = Alignment.CenterVertically) {
                             Image(
-                                painter = painterResource(
-                                    id = R.drawable.ic_cloud14 // Drawable id
-                                ),
-                                modifier = Modifier
-                                    .height(Dp(16F))
-                                    .width(Dp(16F))
-                                    .padding(end = Dp(1F)),
+                                painter =
+                                    painterResource(
+                                        id = R.drawable.ic_cloud14 // Drawable id
+                                    ),
+                                modifier =
+                                    Modifier.height(Dp(16F)).width(Dp(16F)).padding(end = Dp(1F)),
                                 contentScale = ContentScale.Fit,
                                 alignment = Alignment.Center,
                                 contentDescription = ""
@@ -140,23 +118,21 @@
                         }
                     }
                     Image(
-                        painter = painterResource(
-                            id = R.drawable.ic_favourite // Drawable id
-                        ),
-                        modifier = Modifier
-                            .height(Dp(24F))
-                            .width(Dp(24F)),
+                        painter =
+                            painterResource(
+                                id = R.drawable.ic_favourite // Drawable id
+                            ),
+                        modifier = Modifier.height(Dp(24F)).width(Dp(24F)),
                         contentScale = ContentScale.Fit,
                         alignment = Alignment.CenterEnd,
                         contentDescription = ""
                     )
                     Image(
-                        painter = painterResource(
-                            id = R.drawable.ic_more // Drawable id
-                        ),
-                        modifier = Modifier
-                            .height(Dp(24F))
-                            .width(Dp(24F)),
+                        painter =
+                            painterResource(
+                                id = R.drawable.ic_more // Drawable id
+                            ),
+                        modifier = Modifier.height(Dp(24F)).width(Dp(24F)),
                         contentScale = ContentScale.Fit,
                         alignment = Alignment.CenterEnd,
                         contentDescription = ""
diff --git a/compose/integration-tests/macrobenchmark-target/src/main/java/androidx/compose/integration/macrobenchmark/target/ViewPagerActivity.kt b/compose/integration-tests/macrobenchmark-target/src/main/java/androidx/compose/integration/macrobenchmark/target/ViewPagerActivity.kt
index 65a7d30..1babea1 100644
--- a/compose/integration-tests/macrobenchmark-target/src/main/java/androidx/compose/integration/macrobenchmark/target/ViewPagerActivity.kt
+++ b/compose/integration-tests/macrobenchmark-target/src/main/java/androidx/compose/integration/macrobenchmark/target/ViewPagerActivity.kt
@@ -43,9 +43,8 @@
 
 private class PagerAdapter(val items: Int) : RecyclerView.Adapter<PagerViewHolder>() {
     override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): PagerViewHolder {
-        val view = LayoutInflater
-            .from(parent.context)
-            .inflate(R.layout.view_pager_item, parent, false)
+        val view =
+            LayoutInflater.from(parent.context).inflate(R.layout.view_pager_item, parent, false)
 
         return PagerViewHolder(view)
     }
diff --git a/compose/integration-tests/macrobenchmark/src/main/java/androidx/compose/integration/macrobenchmark/AndroidViewListScrollBenchmark.kt b/compose/integration-tests/macrobenchmark/src/main/java/androidx/compose/integration/macrobenchmark/AndroidViewListScrollBenchmark.kt
index 2c7b6a6..c5db7fa 100644
--- a/compose/integration-tests/macrobenchmark/src/main/java/androidx/compose/integration/macrobenchmark/AndroidViewListScrollBenchmark.kt
+++ b/compose/integration-tests/macrobenchmark/src/main/java/androidx/compose/integration/macrobenchmark/AndroidViewListScrollBenchmark.kt
@@ -35,11 +35,8 @@
 
 @LargeTest
 @RunWith(Parameterized::class)
-class AndroidViewListScrollBenchmark(
-    private val compilationMode: CompilationMode
-) {
-    @get:Rule
-    val benchmarkRule = MacrobenchmarkRule()
+class AndroidViewListScrollBenchmark(private val compilationMode: CompilationMode) {
+    @get:Rule val benchmarkRule = MacrobenchmarkRule()
 
     private lateinit var device: UiDevice
 
diff --git a/compose/integration-tests/macrobenchmark/src/main/java/androidx/compose/integration/macrobenchmark/AndroidViewPagerBenchmark.kt b/compose/integration-tests/macrobenchmark/src/main/java/androidx/compose/integration/macrobenchmark/AndroidViewPagerBenchmark.kt
index e81532f..ad02f35 100644
--- a/compose/integration-tests/macrobenchmark/src/main/java/androidx/compose/integration/macrobenchmark/AndroidViewPagerBenchmark.kt
+++ b/compose/integration-tests/macrobenchmark/src/main/java/androidx/compose/integration/macrobenchmark/AndroidViewPagerBenchmark.kt
@@ -34,11 +34,8 @@
 
 @LargeTest
 @RunWith(Parameterized::class)
-class AndroidViewPagerBenchmark(
-    private val compilationMode: CompilationMode
-) {
-    @get:Rule
-    val benchmarkRule = MacrobenchmarkRule()
+class AndroidViewPagerBenchmark(private val compilationMode: CompilationMode) {
+    @get:Rule val benchmarkRule = MacrobenchmarkRule()
     private lateinit var device: UiDevice
 
     @Before
@@ -60,12 +57,7 @@
                 startActivityAndWait(intent)
             }
         ) {
-            val pager = device.findObject(
-                By.res(
-                    PackageName,
-                    ResourceId
-                )
-            )
+            val pager = device.findObject(By.res(PackageName, ResourceId))
             // Setting a gesture margin is important otherwise gesture nav is triggered.
             pager.setGestureMargin(device.displayWidth / 5)
             repeat(10) {
diff --git a/compose/integration-tests/macrobenchmark/src/main/java/androidx/compose/integration/macrobenchmark/ComplexNestedListsScrollBenchmark.kt b/compose/integration-tests/macrobenchmark/src/main/java/androidx/compose/integration/macrobenchmark/ComplexNestedListsScrollBenchmark.kt
index c070d43..ad51c92 100644
--- a/compose/integration-tests/macrobenchmark/src/main/java/androidx/compose/integration/macrobenchmark/ComplexNestedListsScrollBenchmark.kt
+++ b/compose/integration-tests/macrobenchmark/src/main/java/androidx/compose/integration/macrobenchmark/ComplexNestedListsScrollBenchmark.kt
@@ -32,8 +32,7 @@
 import org.junit.Test
 
 class ComplexNestedListsScrollBenchmark {
-    @get:Rule
-    val benchmarkRule = MacrobenchmarkRule()
+    @get:Rule val benchmarkRule = MacrobenchmarkRule()
 
     private lateinit var device: UiDevice
 
diff --git a/compose/integration-tests/macrobenchmark/src/main/java/androidx/compose/integration/macrobenchmark/CrossfadeBenchmark.kt b/compose/integration-tests/macrobenchmark/src/main/java/androidx/compose/integration/macrobenchmark/CrossfadeBenchmark.kt
index 2152b67a..0b2559f 100644
--- a/compose/integration-tests/macrobenchmark/src/main/java/androidx/compose/integration/macrobenchmark/CrossfadeBenchmark.kt
+++ b/compose/integration-tests/macrobenchmark/src/main/java/androidx/compose/integration/macrobenchmark/CrossfadeBenchmark.kt
@@ -31,8 +31,7 @@
 @RunWith(Parameterized::class)
 class CrossfadeBenchmark(private val compilationMode: CompilationMode) {
 
-    @get:Rule
-    val benchmarkRule = MacrobenchmarkRule()
+    @get:Rule val benchmarkRule = MacrobenchmarkRule()
 
     @Test
     fun crossfadeBenchmarkInitialComposition() {
diff --git a/compose/integration-tests/macrobenchmark/src/main/java/androidx/compose/integration/macrobenchmark/DifferentTypesListScrollBenchmark.kt b/compose/integration-tests/macrobenchmark/src/main/java/androidx/compose/integration/macrobenchmark/DifferentTypesListScrollBenchmark.kt
index 8b0db3d..d39fb36 100644
--- a/compose/integration-tests/macrobenchmark/src/main/java/androidx/compose/integration/macrobenchmark/DifferentTypesListScrollBenchmark.kt
+++ b/compose/integration-tests/macrobenchmark/src/main/java/androidx/compose/integration/macrobenchmark/DifferentTypesListScrollBenchmark.kt
@@ -34,8 +34,7 @@
 
 @LargeTest
 class DifferentTypesListScrollBenchmark {
-    @get:Rule
-    val benchmarkRule = MacrobenchmarkRule()
+    @get:Rule val benchmarkRule = MacrobenchmarkRule()
 
     private lateinit var device: UiDevice
 
diff --git a/compose/integration-tests/macrobenchmark/src/main/java/androidx/compose/integration/macrobenchmark/FrameExperimentBenchmark.kt b/compose/integration-tests/macrobenchmark/src/main/java/androidx/compose/integration/macrobenchmark/FrameExperimentBenchmark.kt
index 36e8335..8cff25b 100644
--- a/compose/integration-tests/macrobenchmark/src/main/java/androidx/compose/integration/macrobenchmark/FrameExperimentBenchmark.kt
+++ b/compose/integration-tests/macrobenchmark/src/main/java/androidx/compose/integration/macrobenchmark/FrameExperimentBenchmark.kt
@@ -31,14 +31,13 @@
 import org.junit.runners.Parameterized
 
 /**
- * Benchmark for experimenting with synthetic frame patterns/durations and how
- * they show up in metrics
+ * Benchmark for experimenting with synthetic frame patterns/durations and how they show up in
+ * metrics
  */
 @LargeTest
 @RunWith(AndroidJUnit4::class)
 class FrameExperimentBenchmark {
-    @get:Rule
-    val benchmarkRule = MacrobenchmarkRule()
+    @get:Rule val benchmarkRule = MacrobenchmarkRule()
 
     // NOTE: Keep in sync with FrameExperimentActivity!!
     private enum class FrameMode(val id: Int) {
@@ -48,14 +47,13 @@
         PrefetchSomeFrames(3),
     }
 
-    @Test
-    fun fast() = benchmark(FrameMode.Fast)
-    @Test
-    fun prefetchEveryFrame() = benchmark(FrameMode.PrefetchEveryFrame)
-    @Test
-    fun workDuringEveryFrame() = benchmark(FrameMode.WorkDuringEveryFrame)
-    @Test
-    fun prefetchSomeFrames() = benchmark(FrameMode.PrefetchSomeFrames)
+    @Test fun fast() = benchmark(FrameMode.Fast)
+
+    @Test fun prefetchEveryFrame() = benchmark(FrameMode.PrefetchEveryFrame)
+
+    @Test fun workDuringEveryFrame() = benchmark(FrameMode.WorkDuringEveryFrame)
+
+    @Test fun prefetchSomeFrames() = benchmark(FrameMode.PrefetchSomeFrames)
 
     @OptIn(ExperimentalMetricApi::class)
     private fun benchmark(mode: FrameMode) {
diff --git a/compose/integration-tests/macrobenchmark/src/main/java/androidx/compose/integration/macrobenchmark/FullyDrawnStartupBenchmark.kt b/compose/integration-tests/macrobenchmark/src/main/java/androidx/compose/integration/macrobenchmark/FullyDrawnStartupBenchmark.kt
index e38664e..6e82ca8 100644
--- a/compose/integration-tests/macrobenchmark/src/main/java/androidx/compose/integration/macrobenchmark/FullyDrawnStartupBenchmark.kt
+++ b/compose/integration-tests/macrobenchmark/src/main/java/androidx/compose/integration/macrobenchmark/FullyDrawnStartupBenchmark.kt
@@ -33,17 +33,18 @@
     private val startupMode: StartupMode,
     private val compilationMode: CompilationMode
 ) {
-    @get:Rule
-    val benchmarkRule = MacrobenchmarkRule()
+    @get:Rule val benchmarkRule = MacrobenchmarkRule()
 
     @Test
-    fun startup() = benchmarkRule.measureStartup(
-        compilationMode = compilationMode,
-        startupMode = startupMode,
-        packageName = "androidx.compose.integration.macrobenchmark.target"
-    ) {
-        action = "androidx.compose.integration.macrobenchmark.target.FULLY_DRAWN_STARTUP_ACTIVITY"
-    }
+    fun startup() =
+        benchmarkRule.measureStartup(
+            compilationMode = compilationMode,
+            startupMode = startupMode,
+            packageName = "androidx.compose.integration.macrobenchmark.target"
+        ) {
+            action =
+                "androidx.compose.integration.macrobenchmark.target.FULLY_DRAWN_STARTUP_ACTIVITY"
+        }
 
     companion object {
         @Parameterized.Parameters(name = "startup={0},compilation={1}")
diff --git a/compose/integration-tests/macrobenchmark/src/main/java/androidx/compose/integration/macrobenchmark/GridBenchmark.kt b/compose/integration-tests/macrobenchmark/src/main/java/androidx/compose/integration/macrobenchmark/GridBenchmark.kt
index 3fe31df..963d863 100644
--- a/compose/integration-tests/macrobenchmark/src/main/java/androidx/compose/integration/macrobenchmark/GridBenchmark.kt
+++ b/compose/integration-tests/macrobenchmark/src/main/java/androidx/compose/integration/macrobenchmark/GridBenchmark.kt
@@ -35,11 +35,8 @@
 
 @LargeTest
 @RunWith(Parameterized::class)
-class GridBenchmark(
-    private val compilationMode: CompilationMode
-) {
-    @get:Rule
-    val benchmarkRule = MacrobenchmarkRule()
+class GridBenchmark(private val compilationMode: CompilationMode) {
+    @get:Rule val benchmarkRule = MacrobenchmarkRule()
 
     private lateinit var device: UiDevice
 
diff --git a/compose/integration-tests/macrobenchmark/src/main/java/androidx/compose/integration/macrobenchmark/IoSettingsStartupBenchmark.kt b/compose/integration-tests/macrobenchmark/src/main/java/androidx/compose/integration/macrobenchmark/IoSettingsStartupBenchmark.kt
index cc5e31f..38e46d8 100644
--- a/compose/integration-tests/macrobenchmark/src/main/java/androidx/compose/integration/macrobenchmark/IoSettingsStartupBenchmark.kt
+++ b/compose/integration-tests/macrobenchmark/src/main/java/androidx/compose/integration/macrobenchmark/IoSettingsStartupBenchmark.kt
@@ -33,17 +33,17 @@
     private val startupMode: StartupMode,
     private val compilationMode: CompilationMode
 ) {
-    @get:Rule
-    val benchmarkRule = MacrobenchmarkRule()
+    @get:Rule val benchmarkRule = MacrobenchmarkRule()
 
     @Test
-    fun startup() = benchmarkRule.measureStartup(
-        compilationMode = compilationMode,
-        startupMode = startupMode,
-        packageName = "androidx.compose.integration.macrobenchmark.target"
-    ) {
-        action = "androidx.compose.integration.macrobenchmark.target.IO_SETTINGS_ACTIVITY"
-    }
+    fun startup() =
+        benchmarkRule.measureStartup(
+            compilationMode = compilationMode,
+            startupMode = startupMode,
+            packageName = "androidx.compose.integration.macrobenchmark.target"
+        ) {
+            action = "androidx.compose.integration.macrobenchmark.target.IO_SETTINGS_ACTIVITY"
+        }
 
     companion object {
         @Parameterized.Parameters(name = "startup={0},compilation={1}")
diff --git a/compose/integration-tests/macrobenchmark/src/main/java/androidx/compose/integration/macrobenchmark/LazyBoxWithConstraintsScrollBenchmark.kt b/compose/integration-tests/macrobenchmark/src/main/java/androidx/compose/integration/macrobenchmark/LazyBoxWithConstraintsScrollBenchmark.kt
index e19bc35..533ba27 100644
--- a/compose/integration-tests/macrobenchmark/src/main/java/androidx/compose/integration/macrobenchmark/LazyBoxWithConstraintsScrollBenchmark.kt
+++ b/compose/integration-tests/macrobenchmark/src/main/java/androidx/compose/integration/macrobenchmark/LazyBoxWithConstraintsScrollBenchmark.kt
@@ -35,11 +35,8 @@
 
 @LargeTest
 @RunWith(Parameterized::class)
-class LazyBoxWithConstraintsScrollBenchmark(
-    private val compilationMode: CompilationMode
-) {
-    @get:Rule
-    val benchmarkRule = MacrobenchmarkRule()
+class LazyBoxWithConstraintsScrollBenchmark(private val compilationMode: CompilationMode) {
+    @get:Rule val benchmarkRule = MacrobenchmarkRule()
 
     private lateinit var device: UiDevice
 
diff --git a/compose/integration-tests/macrobenchmark/src/main/java/androidx/compose/integration/macrobenchmark/NestedListsScrollBenchmark.kt b/compose/integration-tests/macrobenchmark/src/main/java/androidx/compose/integration/macrobenchmark/NestedListsScrollBenchmark.kt
index 6ef3995..01cc65d 100644
--- a/compose/integration-tests/macrobenchmark/src/main/java/androidx/compose/integration/macrobenchmark/NestedListsScrollBenchmark.kt
+++ b/compose/integration-tests/macrobenchmark/src/main/java/androidx/compose/integration/macrobenchmark/NestedListsScrollBenchmark.kt
@@ -35,11 +35,8 @@
 
 @LargeTest
 @RunWith(Parameterized::class)
-class NestedListsScrollBenchmark(
-    private val compilationMode: CompilationMode
-) {
-    @get:Rule
-    val benchmarkRule = MacrobenchmarkRule()
+class NestedListsScrollBenchmark(private val compilationMode: CompilationMode) {
+    @get:Rule val benchmarkRule = MacrobenchmarkRule()
 
     private lateinit var device: UiDevice
 
diff --git a/compose/integration-tests/macrobenchmark/src/main/java/androidx/compose/integration/macrobenchmark/PagerAsCarouselBenchmark.kt b/compose/integration-tests/macrobenchmark/src/main/java/androidx/compose/integration/macrobenchmark/PagerAsCarouselBenchmark.kt
index ffa23a2..0baaa7d 100644
--- a/compose/integration-tests/macrobenchmark/src/main/java/androidx/compose/integration/macrobenchmark/PagerAsCarouselBenchmark.kt
+++ b/compose/integration-tests/macrobenchmark/src/main/java/androidx/compose/integration/macrobenchmark/PagerAsCarouselBenchmark.kt
@@ -32,11 +32,8 @@
 
 @LargeTest
 @RunWith(Parameterized::class)
-class PagerAsCarouselBenchmark(
-    private val compilationMode: CompilationMode
-) {
-    @get:Rule
-    val benchmarkRule = MacrobenchmarkRule()
+class PagerAsCarouselBenchmark(private val compilationMode: CompilationMode) {
+    @get:Rule val benchmarkRule = MacrobenchmarkRule()
 
     @Test
     fun scroll() {
diff --git a/compose/integration-tests/macrobenchmark/src/main/java/androidx/compose/integration/macrobenchmark/PagerBenchmark.kt b/compose/integration-tests/macrobenchmark/src/main/java/androidx/compose/integration/macrobenchmark/PagerBenchmark.kt
index 2b74c72..35b7f99 100644
--- a/compose/integration-tests/macrobenchmark/src/main/java/androidx/compose/integration/macrobenchmark/PagerBenchmark.kt
+++ b/compose/integration-tests/macrobenchmark/src/main/java/androidx/compose/integration/macrobenchmark/PagerBenchmark.kt
@@ -35,11 +35,8 @@
 
 @LargeTest
 @RunWith(Parameterized::class)
-class PagerBenchmark(
-    private val compilationMode: CompilationMode
-) {
-    @get:Rule
-    val benchmarkRule = MacrobenchmarkRule()
+class PagerBenchmark(private val compilationMode: CompilationMode) {
+    @get:Rule val benchmarkRule = MacrobenchmarkRule()
 
     private lateinit var device: UiDevice
 
diff --git a/compose/integration-tests/macrobenchmark/src/main/java/androidx/compose/integration/macrobenchmark/PagerOfLazyGridBenchmark.kt b/compose/integration-tests/macrobenchmark/src/main/java/androidx/compose/integration/macrobenchmark/PagerOfLazyGridBenchmark.kt
index 91a4b14..d86f190 100644
--- a/compose/integration-tests/macrobenchmark/src/main/java/androidx/compose/integration/macrobenchmark/PagerOfLazyGridBenchmark.kt
+++ b/compose/integration-tests/macrobenchmark/src/main/java/androidx/compose/integration/macrobenchmark/PagerOfLazyGridBenchmark.kt
@@ -35,11 +35,8 @@
 
 @LargeTest
 @RunWith(Parameterized::class)
-class PagerOfLazyGridBenchmark(
-    private val compilationMode: CompilationMode
-) {
-    @get:Rule
-    val benchmarkRule = MacrobenchmarkRule()
+class PagerOfLazyGridBenchmark(private val compilationMode: CompilationMode) {
+    @get:Rule val benchmarkRule = MacrobenchmarkRule()
 
     private lateinit var device: UiDevice
 
diff --git a/compose/integration-tests/macrobenchmark/src/main/java/androidx/compose/integration/macrobenchmark/RecyclerViewAsCarouselBenchmark.kt b/compose/integration-tests/macrobenchmark/src/main/java/androidx/compose/integration/macrobenchmark/RecyclerViewAsCarouselBenchmark.kt
index 9abdf32..082dde7 100644
--- a/compose/integration-tests/macrobenchmark/src/main/java/androidx/compose/integration/macrobenchmark/RecyclerViewAsCarouselBenchmark.kt
+++ b/compose/integration-tests/macrobenchmark/src/main/java/androidx/compose/integration/macrobenchmark/RecyclerViewAsCarouselBenchmark.kt
@@ -31,11 +31,8 @@
 
 @LargeTest
 @RunWith(Parameterized::class)
-class RecyclerViewAsCarouselBenchmark(
-    private val compilationMode: CompilationMode
-) {
-    @get:Rule
-    val benchmarkRule = MacrobenchmarkRule()
+class RecyclerViewAsCarouselBenchmark(private val compilationMode: CompilationMode) {
+    @get:Rule val benchmarkRule = MacrobenchmarkRule()
 
     @Test
     fun scroll() {
@@ -51,12 +48,7 @@
             }
         ) {
             // Setting a gesture margin is important otherwise gesture nav is triggered.
-            val pager = device.findObject(
-                By.res(
-                    PackageName,
-                    ResourceId
-                )
-            )
+            val pager = device.findObject(By.res(PackageName, ResourceId))
             pager.setGestureMargin(device.displayWidth / 5)
             for (i in 1..10) {
                 pager.swipe(Direction.LEFT, 1.0f)
diff --git a/compose/integration-tests/macrobenchmark/src/main/java/androidx/compose/integration/macrobenchmark/RecyclerViewListScrollBenchmark.kt b/compose/integration-tests/macrobenchmark/src/main/java/androidx/compose/integration/macrobenchmark/RecyclerViewListScrollBenchmark.kt
index 97298ca..0af1a75 100644
--- a/compose/integration-tests/macrobenchmark/src/main/java/androidx/compose/integration/macrobenchmark/RecyclerViewListScrollBenchmark.kt
+++ b/compose/integration-tests/macrobenchmark/src/main/java/androidx/compose/integration/macrobenchmark/RecyclerViewListScrollBenchmark.kt
@@ -34,11 +34,8 @@
 
 @LargeTest
 @RunWith(Parameterized::class)
-class RecyclerViewListScrollBenchmark(
-    private val compilationMode: CompilationMode
-) {
-    @get:Rule
-    val benchmarkRule = MacrobenchmarkRule()
+class RecyclerViewListScrollBenchmark(private val compilationMode: CompilationMode) {
+    @get:Rule val benchmarkRule = MacrobenchmarkRule()
 
     private lateinit var device: UiDevice
 
diff --git a/compose/integration-tests/macrobenchmark/src/main/java/androidx/compose/integration/macrobenchmark/SmallListBaselineProfile.kt b/compose/integration-tests/macrobenchmark/src/main/java/androidx/compose/integration/macrobenchmark/SmallListBaselineProfile.kt
index a0b5b1c..92d7042 100644
--- a/compose/integration-tests/macrobenchmark/src/main/java/androidx/compose/integration/macrobenchmark/SmallListBaselineProfile.kt
+++ b/compose/integration-tests/macrobenchmark/src/main/java/androidx/compose/integration/macrobenchmark/SmallListBaselineProfile.kt
@@ -30,14 +30,11 @@
 @SdkSuppress(minSdkVersion = 28)
 class SmallListBaselineProfile {
 
-    @get:Rule
-    val baselineProfileRule = BaselineProfileRule()
+    @get:Rule val baselineProfileRule = BaselineProfileRule()
 
     @Test
     fun generateProfile() {
-        baselineProfileRule.collect(
-            packageName = PACKAGE_NAME
-        ) {
+        baselineProfileRule.collect(packageName = PACKAGE_NAME) {
             val intent = Intent()
             intent.apply {
                 setPackage(packageName)
@@ -46,17 +43,13 @@
                 putExtra("ITEM_COUNT", 200)
             }
             startActivityAndWait(intent)
-            val lazyColumn =
-                device.findObject(By.desc(CONTENT_DESCRIPTION))
+            val lazyColumn = device.findObject(By.desc(CONTENT_DESCRIPTION))
             // Setting a gesture margin is important otherwise gesture nav is triggered.
             lazyColumn.setGestureMargin(device.displayWidth / 5)
             for (i in 1..10) {
                 // From center we scroll 2/3 of it which is 1/3 of the screen.
                 lazyColumn.drag(Point(0, lazyColumn.visibleCenter.y / 3))
-                device.wait(
-                    Until.findObject(By.desc(COMPOSE_IDLE)),
-                    3000
-                )
+                device.wait(Until.findObject(By.desc(COMPOSE_IDLE)), 3000)
             }
         }
     }
diff --git a/compose/integration-tests/macrobenchmark/src/main/java/androidx/compose/integration/macrobenchmark/SmallListStartupBenchmark.kt b/compose/integration-tests/macrobenchmark/src/main/java/androidx/compose/integration/macrobenchmark/SmallListStartupBenchmark.kt
index b79175d..cc2bb08 100644
--- a/compose/integration-tests/macrobenchmark/src/main/java/androidx/compose/integration/macrobenchmark/SmallListStartupBenchmark.kt
+++ b/compose/integration-tests/macrobenchmark/src/main/java/androidx/compose/integration/macrobenchmark/SmallListStartupBenchmark.kt
@@ -34,8 +34,7 @@
     private val startupMode: StartupMode,
     private val compilationMode: CompilationMode
 ) {
-    @get:Rule
-    val benchmarkRule = MacrobenchmarkRule()
+    @get:Rule val benchmarkRule = MacrobenchmarkRule()
 
     /**
      * Temporary, tracking for b/231455742
@@ -45,15 +44,16 @@
     private val metrics = getStartupMetrics()
 
     @Test
-    fun startup() = benchmarkRule.measureStartup(
-        compilationMode = compilationMode,
-        startupMode = startupMode,
-        metrics = metrics,
-        packageName = "androidx.compose.integration.macrobenchmark.target"
-    ) {
-        action = "androidx.compose.integration.macrobenchmark.target.LAZY_COLUMN_ACTIVITY"
-        putExtra("ITEM_COUNT", 5)
-    }
+    fun startup() =
+        benchmarkRule.measureStartup(
+            compilationMode = compilationMode,
+            startupMode = startupMode,
+            metrics = metrics,
+            packageName = "androidx.compose.integration.macrobenchmark.target"
+        ) {
+            action = "androidx.compose.integration.macrobenchmark.target.LAZY_COLUMN_ACTIVITY"
+            putExtra("ITEM_COUNT", 5)
+        }
 
     companion object {
         @Parameterized.Parameters(name = "startup={0},compilation={1}")
diff --git a/compose/integration-tests/macrobenchmark/src/main/java/androidx/compose/integration/macrobenchmark/StaticScrollingContentWithChromeInitialCompositionBenchmark.kt b/compose/integration-tests/macrobenchmark/src/main/java/androidx/compose/integration/macrobenchmark/StaticScrollingContentWithChromeInitialCompositionBenchmark.kt
index b573368..a4147d3 100644
--- a/compose/integration-tests/macrobenchmark/src/main/java/androidx/compose/integration/macrobenchmark/StaticScrollingContentWithChromeInitialCompositionBenchmark.kt
+++ b/compose/integration-tests/macrobenchmark/src/main/java/androidx/compose/integration/macrobenchmark/StaticScrollingContentWithChromeInitialCompositionBenchmark.kt
@@ -33,28 +33,31 @@
     private val startupMode: StartupMode,
     private val compilationMode: CompilationMode
 ) {
-    @get:Rule
-    val benchmarkRule = MacrobenchmarkRule()
+    @get:Rule val benchmarkRule = MacrobenchmarkRule()
 
     @Test
-    fun initialComposition() = benchmarkRule.measureStartup(
-        compilationMode = compilationMode,
-        startupMode = startupMode,
-        packageName = "androidx.compose.integration.macrobenchmark.target"
-    ) {
-        action = "androidx.compose.integration.macrobenchmark.target" +
-            ".STATIC_SCROLLING_CONTENT_WITH_CHROME_INITIAL_COMPOSITION_ACTIVITY"
-    }
+    fun initialComposition() =
+        benchmarkRule.measureStartup(
+            compilationMode = compilationMode,
+            startupMode = startupMode,
+            packageName = "androidx.compose.integration.macrobenchmark.target"
+        ) {
+            action =
+                "androidx.compose.integration.macrobenchmark.target" +
+                    ".STATIC_SCROLLING_CONTENT_WITH_CHROME_INITIAL_COMPOSITION_ACTIVITY"
+        }
 
     @Test
-    fun firstFrame() = benchmarkRule.measureStartup(
-        compilationMode = compilationMode,
-        startupMode = startupMode,
-        packageName = "androidx.compose.integration.macrobenchmark.target"
-    ) {
-        action = "androidx.compose.integration.macrobenchmark.target" +
-            ".STATIC_SCROLLING_CONTENT_WITH_CHROME_FIRST_FRAME_ACTIVITY"
-    }
+    fun firstFrame() =
+        benchmarkRule.measureStartup(
+            compilationMode = compilationMode,
+            startupMode = startupMode,
+            packageName = "androidx.compose.integration.macrobenchmark.target"
+        ) {
+            action =
+                "androidx.compose.integration.macrobenchmark.target" +
+                    ".STATIC_SCROLLING_CONTENT_WITH_CHROME_FIRST_FRAME_ACTIVITY"
+        }
 
     companion object {
         @Parameterized.Parameters(name = "startup={0},compilation={1}")
diff --git a/compose/integration-tests/macrobenchmark/src/main/java/androidx/compose/integration/macrobenchmark/TrivialListScrollBenchmark.kt b/compose/integration-tests/macrobenchmark/src/main/java/androidx/compose/integration/macrobenchmark/TrivialListScrollBenchmark.kt
index 6d0939c..49594db 100644
--- a/compose/integration-tests/macrobenchmark/src/main/java/androidx/compose/integration/macrobenchmark/TrivialListScrollBenchmark.kt
+++ b/compose/integration-tests/macrobenchmark/src/main/java/androidx/compose/integration/macrobenchmark/TrivialListScrollBenchmark.kt
@@ -35,11 +35,8 @@
 
 @LargeTest
 @RunWith(Parameterized::class)
-class TrivialListScrollBenchmark(
-    private val compilationMode: CompilationMode
-) {
-    @get:Rule
-    val benchmarkRule = MacrobenchmarkRule()
+class TrivialListScrollBenchmark(private val compilationMode: CompilationMode) {
+    @get:Rule val benchmarkRule = MacrobenchmarkRule()
 
     private lateinit var device: UiDevice
 
diff --git a/compose/integration-tests/macrobenchmark/src/main/java/androidx/compose/integration/macrobenchmark/TrivialPerfettoSdkBenchmark.kt b/compose/integration-tests/macrobenchmark/src/main/java/androidx/compose/integration/macrobenchmark/TrivialPerfettoSdkBenchmark.kt
index 06ee17a..d07a053 100644
--- a/compose/integration-tests/macrobenchmark/src/main/java/androidx/compose/integration/macrobenchmark/TrivialPerfettoSdkBenchmark.kt
+++ b/compose/integration-tests/macrobenchmark/src/main/java/androidx/compose/integration/macrobenchmark/TrivialPerfettoSdkBenchmark.kt
@@ -37,37 +37,39 @@
 @LargeTest
 @RunWith(Parameterized::class)
 /**
- * End-to-end test for compose-runtime-tracing verifying that names of Composables show up in
- * a Perfetto trace.
+ * End-to-end test for compose-runtime-tracing verifying that names of Composables show up in a
+ * Perfetto trace.
  */
 @OptIn(ExperimentalMetricApi::class)
 @SdkSuppress(minSdkVersion = Build.VERSION_CODES.R) // TODO(234351579): Support API < 30
 class TrivialPerfettoSdkBenchmark(private val composableName: String) {
-    @get:Rule
-    val benchmarkRule = MacrobenchmarkRule()
+    @get:Rule val benchmarkRule = MacrobenchmarkRule()
 
     @RequiresApi(Build.VERSION_CODES.R) // TODO(234351579): Support API < 30
     @Test
     fun test_composable_names_present_in_trace() {
-        val metrics = listOf(
-            TraceSectionMetric(
-                "%$PACKAGE_NAME.$composableName %$FILE_NAME:%",
-                TraceSectionMetric.Mode.First
+        val metrics =
+            listOf(
+                TraceSectionMetric(
+                    "%$PACKAGE_NAME.$composableName %$FILE_NAME:%",
+                    TraceSectionMetric.Mode.First
+                )
             )
-        )
         benchmarkRule.measureRepeated(
             packageName = PACKAGE_NAME,
             metrics = metrics,
             iterations = 1, // we are only verifying the presence of entries (not the timing data)
             setupBlock = {
-                PerfettoCapture().enableAndroidxTracingPerfetto(
-                    PerfettoSdkConfig(PACKAGE_NAME, InitialProcessState.Alive)
-                ).let { (resultCode, _) ->
-                    assertTrue(
-                        "Ensuring Perfetto SDK is enabled",
-                        resultCode in arrayOf(1, 2) // 1 = success, 2 = already enabled
+                PerfettoCapture()
+                    .enableAndroidxTracingPerfetto(
+                        PerfettoSdkConfig(PACKAGE_NAME, InitialProcessState.Alive)
                     )
-                }
+                    .let { (resultCode, _) ->
+                        assertTrue(
+                            "Ensuring Perfetto SDK is enabled",
+                            resultCode in arrayOf(1, 2) // 1 = success, 2 = already enabled
+                        )
+                    }
             }
         ) {
             startActivityAndWait(Intent(ACTION))
@@ -82,14 +84,13 @@
 
         private const val FILE_NAME = "TrivialTracingActivity.kt"
 
-        private val COMPOSABLE_NAMES = listOf(
-            "Foo_BBC27C8E_13A7_4A5F_A735_AFDC433F54C3",
-            "Bar_4888EA32_ABC5_4550_BA78_1247FEC1AAC9",
-            "Baz_609801AB_F5A9_47C3_94蛸5_2E82542F21B8"
-        )
+        private val COMPOSABLE_NAMES =
+            listOf(
+                "Foo_BBC27C8E_13A7_4A5F_A735_AFDC433F54C3",
+                "Bar_4888EA32_ABC5_4550_BA78_1247FEC1AAC9",
+                "Baz_609801AB_F5A9_47C3_94蛸5_2E82542F21B8"
+            )
 
-        @JvmStatic
-        @Parameters(name = "{0}")
-        fun parameters() = COMPOSABLE_NAMES
+        @JvmStatic @Parameters(name = "{0}") fun parameters() = COMPOSABLE_NAMES
     }
 }
diff --git a/compose/integration-tests/macrobenchmark/src/main/java/androidx/compose/integration/macrobenchmark/TrivialStartupBenchmark.kt b/compose/integration-tests/macrobenchmark/src/main/java/androidx/compose/integration/macrobenchmark/TrivialStartupBenchmark.kt
index 1a6254b..6c78f72 100644
--- a/compose/integration-tests/macrobenchmark/src/main/java/androidx/compose/integration/macrobenchmark/TrivialStartupBenchmark.kt
+++ b/compose/integration-tests/macrobenchmark/src/main/java/androidx/compose/integration/macrobenchmark/TrivialStartupBenchmark.kt
@@ -33,17 +33,17 @@
     private val startupMode: StartupMode,
     private val compilationMode: CompilationMode
 ) {
-    @get:Rule
-    val benchmarkRule = MacrobenchmarkRule()
+    @get:Rule val benchmarkRule = MacrobenchmarkRule()
 
     @Test
-    fun startup() = benchmarkRule.measureStartup(
-        compilationMode = compilationMode,
-        startupMode = startupMode,
-        packageName = "androidx.compose.integration.macrobenchmark.target"
-    ) {
-        action = "androidx.compose.integration.macrobenchmark.target.TRIVIAL_STARTUP_ACTIVITY"
-    }
+    fun startup() =
+        benchmarkRule.measureStartup(
+            compilationMode = compilationMode,
+            startupMode = startupMode,
+            packageName = "androidx.compose.integration.macrobenchmark.target"
+        ) {
+            action = "androidx.compose.integration.macrobenchmark.target.TRIVIAL_STARTUP_ACTIVITY"
+        }
 
     companion object {
         @Parameterized.Parameters(name = "startup={0},compilation={1}")
diff --git a/compose/integration-tests/macrobenchmark/src/main/java/androidx/compose/integration/macrobenchmark/TrivialStartupPerfettoSdkBenchmark.kt b/compose/integration-tests/macrobenchmark/src/main/java/androidx/compose/integration/macrobenchmark/TrivialStartupPerfettoSdkBenchmark.kt
index 47a7b64f..ba33e23 100644
--- a/compose/integration-tests/macrobenchmark/src/main/java/androidx/compose/integration/macrobenchmark/TrivialStartupPerfettoSdkBenchmark.kt
+++ b/compose/integration-tests/macrobenchmark/src/main/java/androidx/compose/integration/macrobenchmark/TrivialStartupPerfettoSdkBenchmark.kt
@@ -41,53 +41,60 @@
     private val compilationMode: CompilationMode,
     private val isPerfettoSdkEnabled: Boolean
 ) {
-    @get:Rule
-    val benchmarkRule = MacrobenchmarkRule()
+    @get:Rule val benchmarkRule = MacrobenchmarkRule()
 
     @Test
-    fun startup() = try {
-        Arguments.perfettoSdkTracingEnableOverride = isPerfettoSdkEnabled
-        assertThat(Arguments.perfettoSdkTracingEnable, `is`(isPerfettoSdkEnabled))
-
+    fun startup() =
         try {
-            val perfettoSdkTraceSection = TraceSectionMetric(
-                "%TrivialStartupTracingActivity.onCreate%" +
-                    " (TrivialStartupTracingActivity.kt:%)",
-                    TraceSectionMetric.Mode.First
-            )
-            benchmarkRule.measureStartup(
-                compilationMode = compilationMode,
-                startupMode = startupMode,
-                iterations = 1, // we are only verifying presence of entries (not the timing data)
-                metrics = listOf(perfettoSdkTraceSection),
-                packageName = "androidx.compose.integration.macrobenchmark.target"
-            ) {
-                action = "androidx.compose.integration.macrobenchmark.target." +
-                    "TRIVIAL_STARTUP_TRACING_ACTIVITY"
+            Arguments.perfettoSdkTracingEnableOverride = isPerfettoSdkEnabled
+            assertThat(Arguments.perfettoSdkTracingEnable, `is`(isPerfettoSdkEnabled))
+
+            try {
+                val perfettoSdkTraceSection =
+                    TraceSectionMetric(
+                        "%TrivialStartupTracingActivity.onCreate%" +
+                            " (TrivialStartupTracingActivity.kt:%)",
+                        TraceSectionMetric.Mode.First
+                    )
+                benchmarkRule.measureStartup(
+                    compilationMode = compilationMode,
+                    startupMode = startupMode,
+                    iterations =
+                        1, // we are only verifying presence of entries (not the timing data)
+                    metrics = listOf(perfettoSdkTraceSection),
+                    packageName = "androidx.compose.integration.macrobenchmark.target"
+                ) {
+                    action =
+                        "androidx.compose.integration.macrobenchmark.target." +
+                            "TRIVIAL_STARTUP_TRACING_ACTIVITY"
+                }
+            } catch (e: IllegalArgumentException) {
+                if (
+                    !isPerfettoSdkEnabled &&
+                        e.message?.contains("Unable to read any metrics during benchmark") == true
+                ) {
+                    // We are relying on the fact that Macrobenchmark will throw an exception when
+                    // it
+                    // cannot find any metrics, and given we are looking for one specific metric
+                    // (a Composable function emitted by Compose Tracing), we are able to tell if
+                    // Compose Tracing is working (enabled) or not, both of which we want to verify
+                    // in
+                    // this test.
+                } else throw e // this is a legitimate failure
             }
-        } catch (e: IllegalArgumentException) {
-            if (!isPerfettoSdkEnabled &&
-                e.message?.contains("Unable to read any metrics during benchmark") == true
-            ) {
-                // We are relying on the fact that Macrobenchmark will throw an exception when it
-                // cannot find any metrics, and given we are looking for one specific metric
-                // (a Composable function emitted by Compose Tracing), we are able to tell if
-                // Compose Tracing is working (enabled) or not, both of which we want to verify in
-                // this test.
-            } else throw e // this is a legitimate failure
+        } finally {
+            Arguments.perfettoSdkTracingEnableOverride = null
         }
-    } finally {
-        Arguments.perfettoSdkTracingEnableOverride = null
-    }
 
     companion object {
         @Parameterized.Parameters(name = "startup={0},compilation={1},perfettoSdk={2}")
         @JvmStatic
-        fun parameters() = listOf(
-            arrayOf(StartupMode.COLD, CompilationMode.DEFAULT, /* perfettoSdk = */ true),
-            arrayOf(StartupMode.COLD, CompilationMode.DEFAULT, /* perfettoSdk = */ false),
-            arrayOf(StartupMode.WARM, CompilationMode.DEFAULT, /* perfettoSdk = */ true),
-            arrayOf(StartupMode.WARM, CompilationMode.DEFAULT, /* perfettoSdk = */ false),
-        )
+        fun parameters() =
+            listOf(
+                arrayOf(StartupMode.COLD, CompilationMode.DEFAULT, /* perfettoSdk= */ true),
+                arrayOf(StartupMode.COLD, CompilationMode.DEFAULT, /* perfettoSdk= */ false),
+                arrayOf(StartupMode.WARM, CompilationMode.DEFAULT, /* perfettoSdk= */ true),
+                arrayOf(StartupMode.WARM, CompilationMode.DEFAULT, /* perfettoSdk= */ false),
+            )
     }
 }
diff --git a/compose/integration-tests/macrobenchmark/src/main/java/androidx/compose/integration/macrobenchmark/TrivialStartupPerfettoSdkOverheadBenchmark.kt b/compose/integration-tests/macrobenchmark/src/main/java/androidx/compose/integration/macrobenchmark/TrivialStartupPerfettoSdkOverheadBenchmark.kt
index 28a6c97..81137bf 100644
--- a/compose/integration-tests/macrobenchmark/src/main/java/androidx/compose/integration/macrobenchmark/TrivialStartupPerfettoSdkOverheadBenchmark.kt
+++ b/compose/integration-tests/macrobenchmark/src/main/java/androidx/compose/integration/macrobenchmark/TrivialStartupPerfettoSdkOverheadBenchmark.kt
@@ -37,25 +37,26 @@
     private val compilationMode: CompilationMode,
     private val isPerfettoSdkEnabled: Boolean
 ) {
-    @get:Rule
-    val benchmarkRule = MacrobenchmarkRule()
+    @get:Rule val benchmarkRule = MacrobenchmarkRule()
 
     @Test
-    fun startup() = try {
-        Arguments.perfettoSdkTracingEnableOverride = isPerfettoSdkEnabled
-        assertThat(Arguments.perfettoSdkTracingEnable, `is`(isPerfettoSdkEnabled))
+    fun startup() =
+        try {
+            Arguments.perfettoSdkTracingEnableOverride = isPerfettoSdkEnabled
+            assertThat(Arguments.perfettoSdkTracingEnable, `is`(isPerfettoSdkEnabled))
 
-        benchmarkRule.measureStartup(
-            compilationMode = compilationMode,
-            startupMode = startupMode,
-            packageName = "androidx.compose.integration.macrobenchmark.target"
-        ) {
-            action = "androidx.compose.integration.macrobenchmark.target." +
-                "TRIVIAL_STARTUP_TRACING_ACTIVITY"
+            benchmarkRule.measureStartup(
+                compilationMode = compilationMode,
+                startupMode = startupMode,
+                packageName = "androidx.compose.integration.macrobenchmark.target"
+            ) {
+                action =
+                    "androidx.compose.integration.macrobenchmark.target." +
+                        "TRIVIAL_STARTUP_TRACING_ACTIVITY"
+            }
+        } finally {
+            Arguments.perfettoSdkTracingEnableOverride = null
         }
-    } finally {
-        Arguments.perfettoSdkTracingEnableOverride = null
-    }
 
     companion object {
         // intended for local testing of all possible configurations
@@ -67,16 +68,18 @@
             when {
                 exhaustiveMode ->
                     // complete set for testing locally
-                    createStartupCompilationParams()
-                        .flatMap { listOf(it + true, it + false) } /* perfetto sdk enabled */
+                    createStartupCompilationParams().flatMap {
+                        listOf(it + true, it + false)
+                    } /* perfetto sdk enabled */
                 else ->
                     // subset for testing in CI:
                     // compilation isn't expected to affect this, so we just look at startup time
                     // for cold and not, since the behavior is very different in those scenarios
                     createStartupCompilationParams(
-                        listOf(StartupMode.COLD, StartupMode.WARM),
-                        listOf(CompilationMode.DEFAULT)
-                    ).map { it + true } /* perfetto sdk enabled */
+                            listOf(StartupMode.COLD, StartupMode.WARM),
+                            listOf(CompilationMode.DEFAULT)
+                        )
+                        .map { it + true } /* perfetto sdk enabled */
             }
     }
 }
diff --git a/compose/integration-tests/macrobenchmark/src/main/java/androidx/compose/integration/macrobenchmark/VectorsListScrollBenchmark.kt b/compose/integration-tests/macrobenchmark/src/main/java/androidx/compose/integration/macrobenchmark/VectorsListScrollBenchmark.kt
index 287e602..efac0b9 100644
--- a/compose/integration-tests/macrobenchmark/src/main/java/androidx/compose/integration/macrobenchmark/VectorsListScrollBenchmark.kt
+++ b/compose/integration-tests/macrobenchmark/src/main/java/androidx/compose/integration/macrobenchmark/VectorsListScrollBenchmark.kt
@@ -32,8 +32,7 @@
 
 @LargeTest
 class VectorsListScrollBenchmark {
-    @get:Rule
-    val benchmarkRule = MacrobenchmarkRule()
+    @get:Rule val benchmarkRule = MacrobenchmarkRule()
 
     private lateinit var device: UiDevice
 
diff --git a/compose/integration-tests/material-catalog/src/main/java/androidx/compose/material/catalog/CatalogActivity.kt b/compose/integration-tests/material-catalog/src/main/java/androidx/compose/material/catalog/CatalogActivity.kt
index ef7bd31..4431454 100644
--- a/compose/integration-tests/material-catalog/src/main/java/androidx/compose/material/catalog/CatalogActivity.kt
+++ b/compose/integration-tests/material-catalog/src/main/java/androidx/compose/material/catalog/CatalogActivity.kt
@@ -36,9 +36,7 @@
         CoroutineScope(Dispatchers.Default).launch {
             val favoriteRoute = UserPreferencesRepository(this@CatalogActivity).getFavoriteRoute()
             withContext(Dispatchers.Main) {
-                setContent {
-                    CatalogApp(initialFavoriteRoute = favoriteRoute)
-                }
+                setContent { CatalogApp(initialFavoriteRoute = favoriteRoute) }
             }
         }
     }
diff --git a/compose/integration-tests/material-catalog/src/main/java/androidx/compose/material/catalog/CatalogApp.kt b/compose/integration-tests/material-catalog/src/main/java/androidx/compose/material/catalog/CatalogApp.kt
index 1e78f35..4b85a83 100644
--- a/compose/integration-tests/material-catalog/src/main/java/androidx/compose/material/catalog/CatalogApp.kt
+++ b/compose/integration-tests/material-catalog/src/main/java/androidx/compose/material/catalog/CatalogApp.kt
@@ -21,7 +21,5 @@
 
 @Composable
 fun CatalogApp(initialFavoriteRoute: String?) {
-    CatalogTheme {
-        NavGraph(initialFavoriteRoute = initialFavoriteRoute)
-    }
+    CatalogTheme { NavGraph(initialFavoriteRoute = initialFavoriteRoute) }
 }
diff --git a/compose/integration-tests/material-catalog/src/main/java/androidx/compose/material/catalog/model/Specifications.kt b/compose/integration-tests/material-catalog/src/main/java/androidx/compose/material/catalog/model/Specifications.kt
index d488090..42441f7 100644
--- a/compose/integration-tests/material-catalog/src/main/java/androidx/compose/material/catalog/model/Specifications.kt
+++ b/compose/integration-tests/material-catalog/src/main/java/androidx/compose/material/catalog/model/Specifications.kt
@@ -16,29 +16,15 @@
 
 package androidx.compose.material.catalog.model
 
-data class Specification(
-    val id: Int,
-    val name: String,
-    val artifact: String
-)
+data class Specification(val id: Int, val name: String, val artifact: String)
 
 private const val MaterialTitle = "Material Design 2"
 private const val MaterialArtifact = "androidx.compose.material"
-val MaterialSpecification = Specification(
-    id = 1,
-    name = MaterialTitle,
-    artifact = MaterialArtifact
-)
+val MaterialSpecification = Specification(id = 1, name = MaterialTitle, artifact = MaterialArtifact)
 
 private const val Material3Title = "Material Design 3"
 private const val Material3Artifact = "androidx.compose.material3"
-val Material3Specification = Specification(
-    id = 2,
-    name = Material3Title,
-    artifact = Material3Artifact
-)
+val Material3Specification =
+    Specification(id = 2, name = Material3Title, artifact = Material3Artifact)
 
-val Specifications = listOf(
-    MaterialSpecification,
-    Material3Specification
-)
+val Specifications = listOf(MaterialSpecification, Material3Specification)
diff --git a/compose/integration-tests/material-catalog/src/main/java/androidx/compose/material/catalog/ui/specification/Specification.kt b/compose/integration-tests/material-catalog/src/main/java/androidx/compose/material/catalog/ui/specification/Specification.kt
index 86be2ef..b4e23c6 100644
--- a/compose/integration-tests/material-catalog/src/main/java/androidx/compose/material/catalog/ui/specification/Specification.kt
+++ b/compose/integration-tests/material-catalog/src/main/java/androidx/compose/material/catalog/ui/specification/Specification.kt
@@ -43,9 +43,8 @@
     specifications: List<Specification>,
     onSpecificationClick: (specification: Specification) -> Unit
 ) {
-    SpecificationScaffold(
-        topBarTitle = stringResource(id = R.string.compose_material_catalog)
-    ) { paddingValues ->
+    SpecificationScaffold(topBarTitle = stringResource(id = R.string.compose_material_catalog)) {
+        paddingValues ->
         LazyColumn(
             content = {
                 item {
@@ -56,23 +55,21 @@
                     Spacer(modifier = Modifier.height(SpecificationPadding))
                 }
                 items(specifications) { specification ->
-                    SpecificationItem(
-                        specification = specification,
-                        onClick = onSpecificationClick
-                    )
+                    SpecificationItem(specification = specification, onClick = onSpecificationClick)
                     Spacer(modifier = Modifier.height(SpecificationItemPadding))
                 }
             },
-            contentPadding = WindowInsets.safeDrawing
-                .only(WindowInsetsSides.Horizontal + WindowInsetsSides.Top)
-                .add(
-                    WindowInsets(
-                        left = SpecificationPadding,
-                        top = SpecificationPadding,
-                        right = SpecificationPadding,
+            contentPadding =
+                WindowInsets.safeDrawing
+                    .only(WindowInsetsSides.Horizontal + WindowInsetsSides.Top)
+                    .add(
+                        WindowInsets(
+                            left = SpecificationPadding,
+                            top = SpecificationPadding,
+                            right = SpecificationPadding,
+                        )
                     )
-                )
-                .asPaddingValues(),
+                    .asPaddingValues(),
             modifier = Modifier.padding(paddingValues)
         )
     }
diff --git a/compose/integration-tests/material-catalog/src/main/java/androidx/compose/material/catalog/ui/specification/SpecificationItem.kt b/compose/integration-tests/material-catalog/src/main/java/androidx/compose/material/catalog/ui/specification/SpecificationItem.kt
index d06bd80..ce666da 100644
--- a/compose/integration-tests/material-catalog/src/main/java/androidx/compose/material/catalog/ui/specification/SpecificationItem.kt
+++ b/compose/integration-tests/material-catalog/src/main/java/androidx/compose/material/catalog/ui/specification/SpecificationItem.kt
@@ -38,10 +38,7 @@
     specification: Specification,
     onClick: (specification: Specification) -> Unit
 ) {
-    OutlinedCard(
-        onClick = { onClick(specification) },
-        modifier = Modifier.fillMaxWidth()
-    ) {
+    OutlinedCard(onClick = { onClick(specification) }, modifier = Modifier.fillMaxWidth()) {
         Row(
             modifier = Modifier.padding(SpecificationItemPadding),
             horizontalArrangement = Arrangement.spacedBy(SpecificationItemPadding),
@@ -51,10 +48,7 @@
                 modifier = Modifier.weight(1f, fill = true),
                 verticalArrangement = Arrangement.spacedBy(SpecificationItemTextPadding)
             ) {
-                Text(
-                    text = specification.name,
-                    style = MaterialTheme.typography.titleSmall
-                )
+                Text(text = specification.name, style = MaterialTheme.typography.titleSmall)
                 Text(
                     text = specification.artifact,
                     style = MaterialTheme.typography.bodySmall,
diff --git a/compose/integration-tests/material-catalog/src/main/java/androidx/compose/material/catalog/ui/specification/SpecificationScaffold.kt b/compose/integration-tests/material-catalog/src/main/java/androidx/compose/material/catalog/ui/specification/SpecificationScaffold.kt
index 5f938b9..eed0d31 100644
--- a/compose/integration-tests/material-catalog/src/main/java/androidx/compose/material/catalog/ui/specification/SpecificationScaffold.kt
+++ b/compose/integration-tests/material-catalog/src/main/java/androidx/compose/material/catalog/ui/specification/SpecificationScaffold.kt
@@ -23,12 +23,6 @@
 
 @OptIn(ExperimentalMaterial3Api::class)
 @Composable
-fun SpecificationScaffold(
-    topBarTitle: String,
-    content: @Composable (PaddingValues) -> Unit
-) {
-    Scaffold(
-        topBar = { SpecificationTopAppBar(title = topBarTitle) },
-        content = content
-    )
+fun SpecificationScaffold(topBarTitle: String, content: @Composable (PaddingValues) -> Unit) {
+    Scaffold(topBar = { SpecificationTopAppBar(title = topBarTitle) }, content = content)
 }
diff --git a/compose/integration-tests/material-catalog/src/main/java/androidx/compose/material/catalog/ui/specification/SpecificationTopAppBar.kt b/compose/integration-tests/material-catalog/src/main/java/androidx/compose/material/catalog/ui/specification/SpecificationTopAppBar.kt
index 93f2baf..1f1d14b 100644
--- a/compose/integration-tests/material-catalog/src/main/java/androidx/compose/material/catalog/ui/specification/SpecificationTopAppBar.kt
+++ b/compose/integration-tests/material-catalog/src/main/java/androidx/compose/material/catalog/ui/specification/SpecificationTopAppBar.kt
@@ -43,32 +43,31 @@
     title: String,
     scrollBehavior: TopAppBarScrollBehavior? = null,
 ) {
-    val backgroundColor = lerp(
-        MaterialTheme.colorScheme.surface,
-        MaterialTheme.colorScheme.surfaceColorAtElevation(elevation = 3.dp),
-        FastOutLinearInEasing.transform(scrollBehavior?.state?.overlappedFraction ?: 0f)
-    )
+    val backgroundColor =
+        lerp(
+            MaterialTheme.colorScheme.surface,
+            MaterialTheme.colorScheme.surfaceColorAtElevation(elevation = 3.dp),
+            FastOutLinearInEasing.transform(scrollBehavior?.state?.overlappedFraction ?: 0f)
+        )
 
-    val foregroundColors = TopAppBarDefaults.centerAlignedTopAppBarColors(
-        containerColor = Color.Transparent,
-        scrolledContainerColor = Color.Transparent
-    )
+    val foregroundColors =
+        TopAppBarDefaults.centerAlignedTopAppBarColors(
+            containerColor = Color.Transparent,
+            scrolledContainerColor = Color.Transparent
+        )
     // Wrapping in a Surface to handle window insets
     // https://issuetracker.google.com/issues/183161866
     Surface(color = backgroundColor) {
         CenterAlignedTopAppBar(
-            title = {
-                Text(
-                    text = title,
-                    maxLines = 1,
-                    overflow = TextOverflow.Ellipsis
-                )
-            },
+            title = { Text(text = title, maxLines = 1, overflow = TextOverflow.Ellipsis) },
             scrollBehavior = scrollBehavior,
             colors = foregroundColors,
-            modifier = Modifier.windowInsetsPadding(
-                WindowInsets.safeDrawing.only(WindowInsetsSides.Horizontal + WindowInsetsSides.Top)
-            )
+            modifier =
+                Modifier.windowInsetsPadding(
+                    WindowInsets.safeDrawing.only(
+                        WindowInsetsSides.Horizontal + WindowInsetsSides.Top
+                    )
+                )
         )
     }
 }
diff --git a/compose/integration-tests/material-catalog/src/main/java/androidx/compose/material/catalog/ui/theme/Theme.kt b/compose/integration-tests/material-catalog/src/main/java/androidx/compose/material/catalog/ui/theme/Theme.kt
index 512623a..571da07 100644
--- a/compose/integration-tests/material-catalog/src/main/java/androidx/compose/material/catalog/ui/theme/Theme.kt
+++ b/compose/integration-tests/material-catalog/src/main/java/androidx/compose/material/catalog/ui/theme/Theme.kt
@@ -39,10 +39,7 @@
         WindowCompat.getInsetsController(context.findActivity().window, view)
             .isAppearanceLightStatusBars = !darkTheme
     }
-    MaterialTheme(
-        colorScheme = colorScheme,
-        content = content
-    )
+    MaterialTheme(colorScheme = colorScheme, content = content)
 }
 
 private tailrec fun Context.findActivity(): Activity =
diff --git a/compose/lint/common-test/src/main/java/androidx/compose/lint/test/Stubs.kt b/compose/lint/common-test/src/main/java/androidx/compose/lint/test/Stubs.kt
index 747301d..d01e748 100644
--- a/compose/lint/common-test/src/main/java/androidx/compose/lint/test/Stubs.kt
+++ b/compose/lint/common-test/src/main/java/androidx/compose/lint/test/Stubs.kt
@@ -24,15 +24,15 @@
 import java.util.Locale
 import org.intellij.lang.annotations.Language
 
-/**
- * Common Compose-related bytecode lint stubs used for testing
- */
+/** Common Compose-related bytecode lint stubs used for testing */
 object Stubs {
-    val Color: TestFile = bytecodeStub(
-        filename = "Color.kt",
-        filepath = "androidx/compose/ui/graphics",
-        checksum = 0x143250ca,
-        source = """
+    val Color: TestFile =
+        bytecodeStub(
+            filename = "Color.kt",
+            filepath = "androidx/compose/ui/graphics",
+            checksum = 0x143250ca,
+            source =
+                """
             package androidx.compose.ui.graphics
 
             inline class Color(val value: ULong) {
@@ -74,13 +74,13 @@
                 alpha: Int = 0xFF
             ): Color = Color.Black
         """,
-"""
+            """
         META-INF/main.kotlin_module:
         H4sIAAAAAAAA/2NgYGBmYGBgBGJOBijgUuWSTMxLKcrPTKnQS87PLcgvTtXL
         TSxJLcpMzBHicM7PyS8q9i7hUueSxalMLy0/X4gtJLW4BKxQBkNhaaZeelFi
         QUZmcrEQO9hI7xIlBi0GAPW9qnSRAAAA
         """,
-        """
+            """
         androidx/compose/ui/graphics/Color＄Companion.class:
         H4sIAAAAAAAA/5WW3VfcRBiHf5P9JLvA8lmWtmhxrYCFBaytlloti8Vtl1Yp
         pVZUHLIRAtmEk8lie8fxHP0/9N4LruzxwsPBO/8oj28mC8E4OdqbmeR93mfe
@@ -108,7 +108,7 @@
         CnwmMCWwKjAv8FigX2BNYFjgicBVgXWBUYGnAjcEPhcYF3gmcEvgCxGsuSEw
         8zddh+AewgoAAA==
         """,
-        """
+            """
         androidx/compose/ui/graphics/Color.class:
         H4sIAAAAAAAA/41W+1Pc1hX+rvbBIgQIvMaACbFjYi8YvEDa5mHHsYHG2TXg
         xNi4hKSpWJRFIKS1pMV206bUfYT0MZ1OX5N2Op2k79Zu4zgBGnc6lPyW8Z/U
@@ -153,7 +153,7 @@
         Tzn8OYe/4K/E4lYOt/G3aTAff8f70zjgQ/Nxx0eNjw98POfjjI+Ej6SPlI+n
         xdaTPgZ9POEjK5bHffT6eFzw9T4afNz8Hx1rfp1uDwAA
         """,
-        """
+            """
         androidx/compose/ui/graphics/ColorKt.class:
         H4sIAAAAAAAA/5VUTW8bVRQ9b/wxnskkcRI7NJMm5MMFuzRxGgoFTFtSS5Em
         calESTdZoIk9uJOMZ6x546psoBt+BFv2bBBCEQtUseRHUc4bj9wQgVpG8j33
@@ -176,13 +176,15 @@
         jJyDpoMdh29m18H7uOXgA3x4DCFxGx8dY0aiIPGxxJrEJxIbEpsSNYmqxFya
         WZBopE7xb1ipCXciBgAA
         """
-    )
+        )
 
-    val Composable: TestFile = bytecodeStub(
-        filename = "Composable.kt",
-        filepath = "androidx/compose/runtime",
-        checksum = 0xbcdac3c7,
-        source = """
+    val Composable: TestFile =
+        bytecodeStub(
+            filename = "Composable.kt",
+            filepath = "androidx/compose/runtime",
+            checksum = 0xbcdac3c7,
+            source =
+                """
         package androidx.compose.runtime
 
         @MustBeDocumented
@@ -195,12 +197,12 @@
         )
         annotation class Composable
         """,
-"""
+            """
         META-INF/main.kotlin_module:
         H4sIAAAAAAAA/2NgYGBmYGBgBGJOBijgUuaSTMxLKcrPTKnQS0wuySzLLKnU
         S87PLcgvThViC0ktLvEu4RLl4gYK6aVWJOYW5MCFlRi0GADOEtiIVAAAAA==
         """,
-        """
+            """
         androidx/compose/runtime/Composable.class:
         H4sIAAAAAAAA/41SW28SQRT+ZoFCUVuwXqC19k6tJm5tfPMJ6FY34ZZl24Tw
         0EzZSbNl2W3YAds3Hkz8Tz4Y4qM/yngGImCyiWaTb7455ztzLnt+/vr2HcB7
@@ -215,13 +217,15 @@
         uMAKVhVkFGQVPMYaaZ9MtU/xDM8VbSMmkENeQVbBOjaQwAuym9g08dLEFraJ
         YsfELvbaYCH2cdCGFqIQ4vA3hGOdXq0DAAA=
         """
-    )
+        )
 
-    val Composables: TestFile = bytecodeStub(
-        filename = "Composables.kt",
-        filepath = "androidx/compose/runtime",
-        checksum = 0x8882d27,
-        source = """
+    val Composables: TestFile =
+        bytecodeStub(
+            filename = "Composables.kt",
+            filepath = "androidx/compose/runtime",
+            checksum = 0x8882d27,
+            source =
+                """
         package androidx.compose.runtime
 
         @Composable
@@ -247,13 +251,13 @@
             if (active) { content() }
         }
         """,
-        """
+            """
         META-INF/main.kotlin_module:
         H4sIAAAAAAAA/2NgYGBmYGBgBGJOBijgMuWSSMxLKcrPTKnQS87PLcgvTtUr
         Ks0rycxNFeJ1BgskJuWkFnuXCHEFpeam5ialFnmXcPFxsZSkFpcIsYUASe8S
         JQYtBgAsMUsXXwAAAA==
         """,
-        """
+            """
         androidx/compose/runtime/ComposablesKt.class:
         H4sIAAAAAAAA/51VzXLbVBT+rvwnK7ajyE5xXEhT103tGCrHpfzUaaBNKfHg
         BiY2gWlW17IaFNtSR5I9ZZdhwzN0yxPArrBgMmHHg/AUDMORLCdO7GkK49H5
@@ -278,13 +282,15 @@
         U0gCtnxawyPi35L1XeruvX2E6rhdh1pHBet1VHGnTn/nd/fBHHyAD/cx72DZ
         wUcOIj7NO/jYgehg1cGab7nnQPIFxUH0X0eNH/YRCAAA
         """
-    )
+        )
 
-    val Modifier: TestFile = bytecodeStub(
-        filename = "Modifier.kt",
-        filepath = "androidx/compose/ui",
-        checksum = 0x33b78359,
-        source = """
+    val Modifier: TestFile =
+        bytecodeStub(
+            filename = "Modifier.kt",
+            filepath = "androidx/compose/ui",
+            checksum = 0x33b78359,
+            source =
+                """
         package androidx.compose.ui
 
         @Suppress("ModifierFactoryExtensionFunction")
@@ -304,13 +310,13 @@
             private val inner: Modifier
         ) : Modifier
         """,
-"""
+            """
         META-INF/main.kotlin_module:
         H4sIAAAAAAAA/2NgYGBmYGBgBGJOBijgUueSTMxLKcrPTKnQS87PLcgvTtXL
         TSxJLcpMzBHiCk5OTEvLz0nxLuHi5WJOy88XYgtJLS7xLlFi0GIAADDzNLNQ
         AAAA
         """,
-        """
+            """
         androidx/compose/ui/CombinedModifier.class:
         H4sIAAAAAAAA/6VTWU8TURT+7nRlKFBG2RdBqnRBBhDXGoxiTJoUNECICb7c
         the47XSGzEwbHok/xV+gD0TigyE8+qOM57ZlsZDyYJqe7Z7znXV+//n5C8Ay
@@ -330,7 +336,7 @@
         iBG8aAAvUTqVkr5WhDC7g0AOyRxSOaSRIRFzOTzC/A6YBxMLOwh5mPAw5EH3
         YHiI/gWbMWV0lgUAAA==
         """,
-        """
+            """
         androidx/compose/ui/Modifier＄Companion.class:
         H4sIAAAAAAAA/41SXU8TQRQ9s1va7bLIggLlQ/ygQgFlofpgLCHBRuOaUo0Q
         EsPTdDvCtNtZs7tteOTJn+AP8BdIfMBoYgiP/ijj3VJRMEEfeufeM+fce3tm
@@ -348,7 +354,7 @@
         jXXFtMpXaK+PMPEJ1w+7gI5liibRNOoyT5KV7vQFFOl8RPg07XxjB7qLmy5u
         ubiNGUqRd3EHsztgEeZQ2EFfBCtCLoIRYSCC/RM2YumyXwQAAA==
         """,
-        """
+            """
         androidx/compose/ui/Modifier＄DefaultImpls.class:
         H4sIAAAAAAAA/6VS308TQRD+9gq9thShVUAE8QcVWqqcP3ir0Zgak4stGjFN
         jCZme13abe92yd224S/SV+OLRhPjs3+UcQ5OQDTVxIebm/lmdnbnm+/b909f
@@ -365,7 +371,7 @@
         wUnq7HgV9E1bSXBoU/QykBotlKlpEYvkFVCh/23CLWzgzkEzEgjVXnqJlIvL
         Lq64uIpVFyVcc7H2Ayw1Nq9+BAAA
         """,
-        """
+            """
         androidx/compose/ui/Modifier＄Element＄DefaultImpls.class:
         H4sIAAAAAAAA/6VSXW8SQRQ9A5QFSqVQW62t9aO0haJdm/jGk0FNNqFoWsOL
         vgzLFAZ2Z5rdWdKf5WPjg/HZH2W8C6u2NUESH/Z+nHvu3Zkz9/uPL18BvMQL
@@ -381,7 +387,7 @@
         KklmNo3nZB+QX0MZu9SyR34/m6dxe9P8aPq7A9jkd6gr5m59RNrBtoOHDmGP
         HDzGEwdPfwJuilgecwQAAA==
         """,
-        """
+            """
         androidx/compose/ui/Modifier＄Element.class:
         H4sIAAAAAAAA/42QTU/CQBCG32mVUkAFRAUlnohHC8SbJ+NH0gRiookXTgtd
         zEK7Jd2WcOR3eTCc/VHGaaKJJ8JhZ2efeedj5+v74xPADdqEjtBBEqtg5U3i
@@ -392,7 +398,7 @@
         hXw5sNFiW2dmMWkUXJyyd8b0nLmFJi747rGeV47iCLYP10fJR5kHgIsDH4c4
         GoEMqqiNYBnUDY5/AJ5HRJ4KAgAA
         """,
-        """
+            """
         androidx/compose/ui/Modifier.class:
         H4sIAAAAAAAA/4VRTW/TQBB94zhxkgZwKB/9orQ0lIaPulRwoVCpCkUYpQFR
         1EtOm2RbtnXWlXcT9Zhfwf8AbhxQxJEfhRhHhVKQgi3vm3m7+9545vuPL18B
@@ -408,13 +414,14 @@
         K+B+6oQ7eMD4jCUm2fNKE5kQV0NcC3EdUxxiOmSV2SbIYA43msgZzBvcNMga
         LBj4Bos/AU5gqBi8AwAA
         """
-    )
+        )
 
-    val PaddingValues: TestFile = bytecodeStub(
-        filename = "Padding.kt",
-        filepath = "androidx/compose/foundation/layout",
-        checksum = 0x393214e7,
-        """
+    val PaddingValues: TestFile =
+        bytecodeStub(
+            filename = "Padding.kt",
+            filepath = "androidx/compose/foundation/layout",
+            checksum = 0x393214e7,
+            """
 
             package androidx.compose.foundation.layout
 
@@ -423,13 +430,13 @@
             interface PaddingValues
 
         """,
-        """
+            """
         META-INF/main.kotlin_module:
         H4sIAAAAAAAA/2NgYGBmYGBgBGJOBijgUueSTMxLKcrPTKnQS87PLcgvTtXL
         TSxJLcpMzBHiCk5OTEvLz0nxLuHi5WJOy88XYgtJLS7xLlFi0GIAADDzNLNQ
         AAAA
         """,
-        """
+            """
         androidx/compose/foundation/layout/PaddingValues.class:
         H4sIAAAAAAAA/5VOTU/CQBB9syiF+lVUEvwTFog3T15MmmA0mnDpaWkXsrTd
         NeyWwI3f5cFw9kcZp+gfcCZ582Ze8t58fX98ArhDnzCUJl9ZnW/izFbv1ql4
@@ -439,13 +446,15 @@
         bwlcHfAS1zxHbHnM3U7RShAk6CToImSKkwSnOEtBDue4SCEcIofeD+cWtEFp
         AQAA
         """
-    )
+        )
 
-    val Remember: TestFile = bytecodeStub(
-        filename = "Remember.kt",
-        filepath = "androidx/compose/runtime",
-        checksum = 0x715f1bc1,
-        source = """
+    val Remember: TestFile =
+        bytecodeStub(
+            filename = "Remember.kt",
+            filepath = "androidx/compose/runtime",
+            checksum = 0x715f1bc1,
+            source =
+                """
         package androidx.compose.runtime
 
         import androidx.compose.runtime.Composable
@@ -480,13 +489,13 @@
             crossinline calculation: () -> V
         ): V = calculation()
         """,
-        """
+            """
         META-INF/main.kotlin_module:
         H4sIAAAAAAAA/2NgYGBmYGBgBGJOBijgUuOSSMxLKcrPTKnQS87PLcgvTtUr
         Ks0rycxNFeIKSs1NzU1KLfIu4RLl4gZK66VWJOYW5KQKsYWkFpd4lygxaDEA
         ALrkMh5XAAAA
         """,
-        """
+            """
         androidx/compose/runtime/RememberKt.class:
         H4sIAAAAAAAA/61WS3PbVBT+rvySHT8U50HiQAh5tM6rctxQoHZdQiDUgxuY
         2mOYyUq21VR+SB1JNmWXYcNvYMsvYFlYMJmw40cxnCvLjmM7qUu60NW5R+d+
@@ -513,13 +522,15 @@
         3MtDRipPazydx33sU4CFj/HgBJIFn4VPLIQsfGrBb2HZwmcWliysWlixsGFh
         zcJDC0nHf+c//GYG8S4LAAA=
         """
-    )
+        )
 
-    val StateFactoryMarker: TestFile = bytecodeStub(
-        filename = "StateFactoryMarker.kt",
-        filepath = "androidx/compose/runtime/snapshots",
-        checksum = 0x2ecf44e1,
-        source = """
+    val StateFactoryMarker: TestFile =
+        bytecodeStub(
+            filename = "StateFactoryMarker.kt",
+            filepath = "androidx/compose/runtime/snapshots",
+            checksum = 0x2ecf44e1,
+            source =
+                """
         package androidx.compose.runtime.snapshots
 
         @MustBeDocumented
@@ -527,13 +538,13 @@
         @Retention(AnnotationRetention.BINARY)
         annotation class StateFactoryMarker
         """,
-        """
+            """
         META-INF/main.kotlin_module:
         H4sIAAAAAAAA/2NgYGBmYGBgBGJOBijgsuOSSMxLKcrPTKnQS87PLcgvTtUr
         Ks0rycxNFRL0LS1JTMpJ9cwrCS5JLEn1LhHiD85LLCjOyIcJcOlwKeHSr5eT
         mVeiV5JaXCLEFgIkvUuUGLQYAH5U0JeGAAAA
         """,
-        """
+            """
         androidx/compose/runtime/snapshots/StateFactoryMarker.class:
         H4sIAAAAAAAA/51Sy27TQBQ945AmDVBSoJC0lD4o6Q6XCsSCVdI2wlIeKAlI
         KKupPSquHU/kGYdmlx3/xAJFLPkoxJ1GJEFYICFL1+fec+5rZr7/+PIVwAsc
@@ -547,13 +558,15 @@
         tT1Ahf4BcvQBeeJX+2ACBdzELfJuC6zhDopErs/cu7iH+wZe6zbwAA+RRamP
         jIOyg00HW3hEENsOHmOHVAq72OvDUthXePITiiesbIsDAAA=
         """
-    )
+        )
 
-    val SnapshotState: TestFile = bytecodeStub(
-        filename = "SnapshotState.kt",
-        filepath = "androidx/compose/runtime",
-        checksum = 0xe6e3c192,
-        source = """
+    val SnapshotState: TestFile =
+        bytecodeStub(
+            filename = "SnapshotState.kt",
+            filepath = "androidx/compose/runtime",
+            checksum = 0xe6e3c192,
+            source =
+                """
         package androidx.compose.runtime
 
         import kotlin.reflect.KProperty
@@ -671,13 +684,13 @@
             override fun toString() = "NeverEqualPolicy"
         }
         """,
-        """
+            """
         META-INF/main.kotlin_module:
         H4sIAAAAAAAA/2NgYGBmYGBgBGJOBijgsuOSSMxLKcrPTKnQS87PLcgvTtUr
         Ks0rycxNFRL0LS1JTMpJ9cwrCS5JLEn1LhHiD85LLCjOyIcJcOlwKeHSr5eT
         mVeiV5JaXCLEFgIkvUuUGLQYAH5U0JeGAAAA
         """,
-        """
+            """
         androidx/compose/runtime/DerivedState.class:
         H4sIAAAAAAAA/4VRTW/TQBB9Yzuxk4bghhbSAG1BQiQccKk4IFJVQnyISKmQ
         mihCymkbL2Ebx668m6jH/BYO/AgOyOqRH4UYp6hCRIXLzLzZN29Hb378/PYd
@@ -691,7 +704,7 @@
         wu7A72C9gxpucYmNDjZxewjSuIP6kE+ILY2Gxl2NezqHJY01jcovIuyLgMcC
         AAA=
         """,
-        """
+            """
         androidx/compose/runtime/DerivedStateImpl.class:
         H4sIAAAAAAAA/41S224SURRdZ2YYhpHClN5rvVVrgdpObXwwLcF4SSMJalII
         MfbpABN6Wphp5hxIH/kKP8Av0ERj4oMhffSjjHuANCom8rL32mv22Wtf5sfP
@@ -708,7 +721,7 @@
         XTW2P27M/G9T5lVTJpb/aEofIx0Phn4T2+QPKWOVtK8fQy9hrYQbJdzELYK4
         XcIdrB+DSdzFvWMkJOYkNiTuS6RkFM5LLEgsSaR/Aaib5exSBAAA
         """,
-        """
+            """
         androidx/compose/runtime/MutableState.class:
         H4sIAAAAAAAA/4VR0WoTURA9c3eT3aQxbmOradRaBTHxwa3FBzGlIKIYSBCa
         EIQ83SZr3GZzt+TeDX3cb/HBj/BBlj76UeJsKkUM1Zc7c+aeOTOc+fHz23cA
@@ -722,7 +735,7 @@
         A6+DzQ5quMUptjrYxu0RSOMO6iM+IXY0Ghp3Ne7pHJY0NjQqvwDJFOU0xwIA
         AA==
         """,
-        """
+            """
         androidx/compose/runtime/MutableStateImpl.class:
         H4sIAAAAAAAA/41S204TURRdZ2Y6nY6lDIVyE28o0hZhkPhgoKlRE2KToglt
         GiNPh3YCB9oZ0nPa8Niv8AP8Ak00Jj6Yhkc/yrhP2xBiTezLXmuv2Wdf59fv
@@ -739,7 +752,7 @@
         N7Y7asz+b1P2dVM26TebMkfMxJMBrmOTcJ8ilqn27SOYJayUcKeEu7hHFPdL
         eIDVIzCJh3h0hITErMSaxGOJlNTunERGYkFi+g+3c7/UUgQAAA==
         """,
-        """
+            """
         androidx/compose/runtime/NeverEqualPolicy.class:
         H4sIAAAAAAAA/5VU3W8bRRD/7Z0/zhcndZyQpmn4KA3UTpqeE8pnTNoSinqR
         ayJcBUGe1vbibnK+c+/2rCJeIv4Unnmg4qEIJBTBW/8oxOydCcFJUSLLO7Mz
@@ -762,7 +775,7 @@
         GF89x9LPuPEsMWRQp9WmsEVq2bvE+uOEnYnNRL6HOyRd8leoB9U9mC6WXay4
         uIlVUnHLpSbW9sAirGF9D3aEyQjvRLgdoRBhKlGmI8xEmCX9b4SHlftABwAA
         """,
-        """
+            """
         androidx/compose/runtime/ProduceStateScope.class:
         H4sIAAAAAAAA/41SW28SQRQ+s1BYkOoWb5TitTUqMe5KfHIJ0WhIMVQbQRPD
         07AMOLDMkJ1Z7CO/xQd/hA+G9NEfZTwL3TYWa/swc27f+c5cvl+/f/wEgOew
@@ -778,7 +791,7 @@
         Bga5xc9FewxMwP2FvQ3baOtYXUfSyx1INOBKA6wGbEAeXbjagGtwvQNEwQ24
         2YGMgoKCTQVFBaaCLQUlBbcWTuYPf2PH6TMEAAA=
         """,
-        """
+            """
         androidx/compose/runtime/ReferentialEqualityPolicy.class:
         H4sIAAAAAAAA/5VUW08bRxT+ZteX9WITYygBQq8hiblljUuvuDSUpoqRIShG
         RC1PY3viDKx3nb1YifqC+lP60L70oVEfUrVShdq3/qiqZ3Zd6hqoQJbnnDnn
@@ -802,7 +815,7 @@
         q0lhs9TG94j1esROx6eRfB/3SFbJX6Rrnj+AXsVCFYtVLGGZVNytUmNLB2A+
         VlA+gOkj5+NdH6s+Mj5GI2XMx7iPCdL/Br5SJwt/BwAA
         """,
-        """
+            """
         androidx/compose/runtime/SnapshotMutationPolicy＄DefaultImpls.class:
         H4sIAAAAAAAA/5VSTW/TQBB96yR1E1L6wWcotEADohwwlTiRqBIqQjJKS0Wi
         Hspp4yzpJvautV5HRfwpzhz4AfwoxKyTCmgQIpY9++bNm5n17H7/8fUbgBd4
@@ -817,7 +830,7 @@
         eQVaJVTC/QL7eDCrsUzrQ/pWykXTi6eEHbI14jzcwSYaaBaJd/GI1i3i10iz
         /gGlEBshroW4jhshbuJWiNs/AT8TejEUBAAA
         """,
-        """
+            """
         androidx/compose/runtime/SnapshotMutationPolicy.class:
         H4sIAAAAAAAA/5VTzW7TQBD+1kltx2mLC6WkKeU3NCkHnFYcEK2QEAjhKgXU
         RBzoaZNswybOOnjtqHDKs/AYHFDEkYdCjJ1WINIDlbzz/83szox//vr2HcBj
@@ -833,7 +846,7 @@
         xxZRh7S75LuH9bOoHKoZv48a8SPyL1H+5WPkfFzx4fpYwVUScc3HKq4fg2ms
         4cYxljRKGusaZQ0zoxsaNzUsjYLGpsYtjdsazm99oitP5wMAAA==
         """,
-        """
+            """
         androidx/compose/runtime/SnapshotStateKt＄produceState＄1.class:
         H4sIAAAAAAAA/41TbU8TQRB+9np94TxoqYBQFVGrtkU5qCZqCiSGSNJYNaGk
         MeHT0h5l4bpH7rYNH/sr/AH+Ak00Jn4wDR/9UcbZa2NQEEzTmWcnM888uzP3
@@ -851,7 +864,7 @@
         RHT2MGFENyS5RmcnomZRM2AOy2RN3EdxlBOjK2pfQpn8GmXOUVVuB7Eqrldx
         o4qbmCeIW1Us4PYOWIg7uLuDRKhhPsREiOkQMyHSvwDFJnyjsgQAAA==
         """,
-        """
+            """
         androidx/compose/runtime/SnapshotStateKt＄produceState＄2.class:
         H4sIAAAAAAAA/41TXU8TURA9d7v9YF1oqYCAiqhVt0VZqCYqBRJDIGmsmlDS
         mPC0bNdyob1Ldu82PPZX+AP8BZpoTHwwDY/+KOPcbWNQFHjYmXMnM2fm3jn7
@@ -869,7 +882,7 @@
         WInpzEHCkG5Aco3OdkzN4mbADJbI6riP4jAnQVdUvoQy+TXKnKGq2V0kqrhe
         xY0qbmKOIG5VMY/bu2Ah7uDuLlKhgoUQYyEmQ0yFyP4CSN9ZzcQEAAA=
         """,
-        """
+            """
         androidx/compose/runtime/SnapshotStateKt＄produceState＄3.class:
         H4sIAAAAAAAA/41TXU8TQRQ9s91+rQstFRBQEbXqtigLxURNgcQQmjRWTShp
         TPq0tGsZ2M6S3WnDY3+FP8BfoInGxAfT8OiPMt7ZNgZFwYe9H5N7zz0z9+z3
@@ -887,7 +900,7 @@
         WIngzFHBGG4Eco1yO4Jm0TBgHqtkddxHYVwToysqX0SJ/CZVzlPXQhOxKq5X
         caOKm1ikELeqWMLtJliIO7jbRCJUYT7EZIiZELMhMj8ByotGl7MEAAA=
         """,
-        """
+            """
         androidx/compose/runtime/SnapshotStateKt.class:
         H4sIAAAAAAAA/91Ya1cbxxl+RoAkZAHrtTEg20S2IWAwCLCT1IYSu8QYhYup
         wdTYdZxFLLBG7Co7K2LaJnFv7v2eXtImvaT3Nm3dfolTn9PDycf+kp72L/T0
@@ -943,7 +956,7 @@
         HI0c9zgGOXSOSxxjHD/luMxxnuNnHG9y/FyO/ILjWY4hjivycZojw9HBcY1j
         ieMmxzLHPMcKh/FftSsUaNEeAAA=
         """,
-        """
+            """
         androidx/compose/runtime/SnapshotStateList.class:
         H4sIAAAAAAAA/41QTUsjQRSs7smHGaMZdd2Nun7gSYM4KsKCK8IqCIFRYRNy
         yamTabRN0i3THfE4v2X/wZ4WPCyDR3/Usm+iF3cvXuq9qi7ee9XPfx5/AzjE
@@ -956,7 +969,7 @@
         PaxOXB7WJnUJ61S/kKdKnpkuvCZmm6g1EWCOWsw3sYAPXTCLRXzsomAxbfHJ
         om5R/gvbVDsvSgIAAA==
         """,
-        """
+            """
         androidx/compose/runtime/SnapshotStateMap.class:
         H4sIAAAAAAAA/41QyW4TQRB91eN1YpJJ2Bx2LogEiUkiTsGKBEhIViYgYTQX
         n9qeVtKx3W1Nt6Mc51v4A05IHNAox3wUosbJheXAoV5VvX5d2+XP7z8AvMJT
@@ -969,7 +982,7 @@
         Dxk7VwKEWGEf4NFSFeDx0t/DE/b7rOmw5sYQQR+rfaz1EWGdQ2z0cRO3hiCH
         27gzRN1hxeGuQ9dh06H5C310h9RqAgAA
         """,
-        """
+            """
         androidx/compose/runtime/State.class:
         H4sIAAAAAAAA/31QPU8bQRB9c18+XwKciQHjIERpp8g5KEWUGKQ0SJYcRcIW
         iuRqsRez+LyHvGuL8n5LivyIFNGJMj8qYs6kShDNvHlvdmbfzO8/P38BeI8D
@@ -981,7 +994,7 @@
         8b0C8N2xz8xBCPdv5qK5xgZeM57wiyr3RCO4Pbzo4WUPG9jkFFs9xKiNQAbb
         eDVCYFA32DHYNdgzJa08ADaVmL0DAgAA
         """,
-        """
+            """
         androidx/compose/runtime/StructuralEqualityPolicy.class:
         H4sIAAAAAAAA/5VVW08bRxT+ZteX9WLAcVJqCE2ThjbmljWkdygtIVQxciiq
         I6qWp7E9dcasd53dWStRX1B/Sp/70KgPiVqpQu1bflTVM7suIQYikOU5Z845
@@ -1006,13 +1019,14 @@
         YgnLxOJOlb6wH+2BhfgYn+zBDjEa4tMQn4XIhRiLmYkQpRCTxP8H9SluIpUH
         AAA=
         """
-    )
+        )
 
-    val Effects: TestFile = bytecodeStub(
-        filename = "Effects.kt",
-        filepath = "androidx/compose/runtime",
-        checksum = 0xade9931f,
-        """
+    val Effects: TestFile =
+        bytecodeStub(
+            filename = "Effects.kt",
+            filepath = "androidx/compose/runtime",
+            checksum = 0xade9931f,
+            """
             package androidx.compose.runtime
 
             @Composable
@@ -1126,13 +1140,13 @@
                 remember(*keys) { LaunchedEffectImpl(block) }
             }
         """,
-        """
+            """
         META-INF/main.kotlin_module:
         H4sIAAAAAAAA/2NgYGBmYGBgBGJOBijgMuSSSMxLKcrPTKnQS87PLcgvTtUr
         Ks0rycxNFeJ0TUtLTS4p9i4R4gpKzU3NTUot8i7h4uNiKUktLhFiCwGS3iVK
         DFoMAGDKMaZbAAAA
         """,
-        """
+            """
         androidx/compose/runtime/DisposableEffectImpl.class:
         H4sIAAAAAAAA/51TS08UQRD+enbZx4iyLPJGQEFZQJgFvS0hUYRkkxUNS4gJ
         p2a2gV5me8h0L8Eb0Yu/w3/gwWg8GMLRH2Ws3ocgxgAmM9VV1f1VfV1V/ePn
@@ -1151,7 +1165,7 @@
         fEliAiRZK6GDhYacwSKtK+QdIgLD24gVMVLEvSJGMUYqxou4jwfbYBoTmNxG
         SmNA46FGWuORxpRGTmNaI/EL6pV/cp8FAAA=
         """,
-        """
+            """
         androidx/compose/runtime/DisposableEffectResult.class:
         H4sIAAAAAAAA/5VPzU4CMRicrwssrIqLv+gDEL24QEw8eDJR4xqMCSZcOBW2
         mMKyJbQQjjyXB8PZhzJ+C09g0kxnvp/O9Of36xvALc4JkcySudHJKhqa6cxY
@@ -1161,7 +1175,7 @@
         oXrWKee/6O7We9pqXn3IMuOk0yazJbZEAdvgBUIRJWYCp1s8wRnfd/y0z51y
         H16MSowgxh72meIgRhWHfZBFiFofBYsji2OLIuMfte9Y6pYBAAA=
         """,
-        """
+            """
         androidx/compose/runtime/DisposableEffectScope＄onDispose＄1.class:
         H4sIAAAAAAAA/8VUXVPTQBQ9mxZKQ4HwIQIqVkFtA5Km4hcwzDBYxmpRh2p9
         4CltQ1mabpgk7fDk9CfpjI6jD06f/VGON0mRjjry8eJD9t69e/bs3bP35vuP
@@ -1181,7 +1195,7 @@
         KNJYxMOA4y4ekf3PlUFXBOVDr0ACXd1FJI9reczmcR1JcnEjj5uY2wVzMY9b
         u4i6vnvbxbiLO1ihzb5WS/RpASjzE60KhHSEBgAA
         """,
-        """
+            """
         androidx/compose/runtime/DisposableEffectScope.class:
         H4sIAAAAAAAA/51UW2/TSBT+xrnYdbtNGm5tYaFAgJZC7YT7hkXaLVsRFAoi
         UAn1aeJMy7TOuPI4FY8VD/wHXvkF8AQCCUXljR+12jNOWgo8dIslz7l/Z86c
@@ -1202,7 +1216,7 @@
         x9k6ynWcw3licaGOacwsg2lcxOwyHA1X45JGXmNY47JGQWOONP8BWe15VNUF
         AAA=
         """,
-        """
+            """
         androidx/compose/runtime/EffectsKt.class:
         H4sIAAAAAAAA/+1Y3VMb1xU/qw+0LALL4ltJHcWQBoSxtOLDYGFcB3CsGmMq
         2VCX1ukiFryw2lW0KxmctHGn05m+9B9IHjqT5770pUmbGTfTx/5Rnf7u3ZWQ
@@ -1251,7 +1265,7 @@
         bZGapW3ayaK/tQ0Uh3Zpb4P6LRq0SMez2qKiRYZFpkUli2b5zXmLPrJoicsL
         Fq1alLPoU4vuWpSxKGlRzKKgRWXeF11Y1canwr1X/wvUiR6dlRwAAA==
         """,
-        """
+            """
         androidx/compose/runtime/LaunchedEffectImpl.class:
         H4sIAAAAAAAA/5VSW08TURD+znbZtitCWQHLRUSLUKiwhfhWQqJETJOKBpSY
         8HS6Xcppt2fJXhp8a/wp/gMfjMYHQ3j0RxnntEUQVEKyO7f9Zubbmfnx89t3
@@ -1270,13 +1284,14 @@
         DTXYXZlHkfQmRSeJwNQ+EmVMl3GvjBncJxOzZTzAw32wEDnM7SMVIhviUYh0
         iPkQC13bCDH6C4u/Nd/9BAAA
         """
-    )
+        )
 
-    val Dp: TestFile = bytecodeStub(
-        filename = "Dp.kt",
-        filepath = "androidx/compose/ui/unit",
-        checksum = 0xe65966ab,
-        """
+    val Dp: TestFile =
+        bytecodeStub(
+            filename = "Dp.kt",
+            filepath = "androidx/compose/ui/unit",
+            checksum = 0xe65966ab,
+            """
             package androidx.compose.ui.unit
 
             @kotlin.jvm.JvmInline
@@ -1286,7 +1301,7 @@
 
             inline val Int.dp: Dp get() = Dp(value = this.toFloat())
         """,
-        """
+            """
         META-INF/main.kotlin_module:
         H4sIAAAAAAAA/3XNOwvCQBAE4JUExFUQrhARQbERLGIjWIt26QzYyiVZkoN7
         hMsG/PmeqFV0YZphPhYAIgAYhIzgc3jAhbSld6p8JIUzjWspkVYZycpZMcuU
@@ -1294,7 +1309,7 @@
         OGPJL7jFZQ92Kqm8bGpVtGJ4dtoFiesfH8Kws4pFfGnCYowxU8siuqe8gR08
         AekscysQAQAA
         """,
-        """
+            """
         androidx/compose/ui/unit/Dp.class:
         H4sIAAAAAAAA/31U31MbVRT+7s2v3WWBTdpSQktbQ20DSBOwQpWCUGhKEFot
         iLaodUlWWEiyMbthOj4xvuhf0Bn7Vl986XR0RiljZxykb/4d/hmO47mbS8iE
@@ -1327,7 +1342,7 @@
         Dyihh6sIZLGaxWdZfI4vaIlHWXwJcxXMxRpyq4i76HSRd6H5Y9bFvAvFhepi
         2bd0uzBcRF3M+Fv6TbiYdDHmYtQV8LRvPO+i9z+OvdduJAoAAA==
         """,
-        """
+            """
         androidx/compose/ui/unit/DpKt.class:
         H4sIAAAAAAAA/31Qy27TQBQ9M04cx5TWLVCalPAoRqJIxSligaAbRBTJIoBE
         UTdZTWxTprE9lmdcdZlVP4QPYI1YoAh2fBTiTum6m3PPPfc1Z/78/fETwHM8
@@ -1340,13 +1355,14 @@
         oH/+HSvfrHE8IHQvKl3sEN8kxkm5jlVSqRtrxGznwwu8h5DiS6oFtHt9CifG
         RowbMW7iVkzjt2NsoTcF0+hje4q2xh2NgcZdbbn7D0kxfkBPAgAA
         """
-    )
+        )
 
-    val Animatable: TestFile = bytecodeStub(
-        filename = "Animatable.kt",
-        filepath = "androidx/compose/animation/core",
-        checksum = 0xb1ce1ffe,
-        """
+    val Animatable: TestFile =
+        bytecodeStub(
+            filename = "Animatable.kt",
+            filepath = "androidx/compose/animation/core",
+            checksum = 0xb1ce1ffe,
+            """
             package androidx.compose.animation.core
 
             import androidx.compose.runtime.mutableStateOf
@@ -1362,14 +1378,14 @@
 
             fun Animatable(initialValue: Float): Animatable<Float, Any> = Animatable(initialValue)
         """,
-        """
+            """
         META-INF/main.kotlin_module:
         H4sIAAAAAAAA/3XLvQvCQAwF8IiiGEThBhERBBfBoS6Cszh2s+KetqE9uI9y
         TcE/3xN1KgZehsf7AcAQAAYxU/gennBNrgxel8+k8LbxLSfktCXR3qllpl1l
         +EGm48uvTQWPuP2vYhNYzT57yg1HcMZVD4TOibas8MaWbc4hFbXIHDVt7SUT
         kjfc46YHO51UgZpaF62aXL3xUeIcR8KtqPE9/lR2cIAXLlZThPEAAAA=
         """,
-        """
+            """
         androidx/compose/animation/core/Animatable.class:
         H4sIAAAAAAAA/41VXXPaRhQ9KyQQMtiC2gkmcZs4pAHsRo775Qbq1HHqGaYm
         ydiU6YwfOjIojoyQPFrBJC8t09/Ql772F7QzzaTtQ4fJY39Up3cl4hhDWj9o
@@ -1395,7 +1411,7 @@
         iMHtA8RqMGpYq1Fb18nEhzWK+PEBGMcn+PQAsxxXOTY4PuO4y7HEkeZIcFzm
         yHFc51jm4kyFo/Avb5BXyJQHAAA=
         """,
-        """
+            """
         androidx/compose/animation/core/AnimatableKt.class:
         H4sIAAAAAAAA/5VRy27TQBQ9Y+dB3NC44dW4PNsNSAinhRVBSBVSJAsTJFp1
         k9UkHkWT2DPIHkdd5pNYIhYoaz4KcceJFAk2VBqf+5hzr+ee++v3j58A3uCE
@@ -1409,25 +1425,26 @@
         nlScJp5uWbeq+FmFRzgm+9aOT/z9MdwInQh+hAN0I9zB3Qj3cH8MVuABDseo
         F/b0CgTV2fsD4lpb1BADAAA=
         """
-    )
+        )
 
-    val IntOffset: TestFile = bytecodeStub(
-        filename = "IntOffset.kt",
-        filepath = "androidx/compose/ui/unit",
-        checksum = 0xe18c78ef,
-        """
+    val IntOffset: TestFile =
+        bytecodeStub(
+            filename = "IntOffset.kt",
+            filepath = "androidx/compose/ui/unit",
+            checksum = 0xe18c78ef,
+            """
             package androidx.compose.ui.unit
 
             class IntOffset(val x: Int, val y: Int)
         """,
-        """
+            """
         META-INF/main.kotlin_module:
         H4sIAAAAAAAA/3XLOwvCQBAE4JUI4ioIV4iIINgIFrERrMUynQFb2SRLcnCP
         cNmAP98TtQoOTDPMBwAJAIxip/ANnnBNrgpeV8+09Lb1HafktCXR3qllrl1t
         +E6m58tvzQSPuP2v4hJYzT9/KgxHcMbVAITeibas8MaWbcEhE7XIHbVd4yUX
         kjfc42YAe53WgdpGl52aXL3xUeIMx8KdqOSRyQ4O8AJoAzD57gAAAA==
         """,
-        """
+            """
         androidx/compose/ui/unit/IntOffset.class:
         H4sIAAAAAAAA/41QTWsTURQ9781HJuO0mUwbTdOqtVZNs3Da4k4RVCgMpBZq
         CUo2TpJpfU0yI3kvJe7yW1y7ESyCCwku/VHifZMgCAWFmXvvOffcj3d//vr2
@@ -1442,23 +1459,22 @@
         sGhYRuXKYv9/ijnu53YLD8gfUO465W60YUSoRliLUMM6hdiIcBO32mASt7HZ
         RlEikLgj4eZ2WcKWWJFYlaj8BpHq1rYeAwAA
         """
-    )
+        )
 }
 
 /**
  * Utility for creating a [kotlin] and corresponding [bytecode] stub, to try and make it easier to
  * configure everything correctly.
  *
- * @param filename name of the Kotlin source file, with extension - e.g. "Test.kt". These should
- * be unique across a test.
- * @param filepath directory structure matching the package name of the Kotlin source file. E.g.
- * if the source has `package foo.bar`, this should be `foo/bar`. If this does _not_ match, lint
- * will not be able to match the generated classes with the source file, and so won't print them
- * to console.
+ * @param filename name of the Kotlin source file, with extension - e.g. "Test.kt". These should be
+ *   unique across a test.
+ * @param filepath directory structure matching the package name of the Kotlin source file. E.g. if
+ *   the source has `package foo.bar`, this should be `foo/bar`. If this does _not_ match, lint will
+ *   not be able to match the generated classes with the source file, and so won't print them to
+ *   console.
  * @param source Kotlin source for the bytecode
  * @param bytecode generated bytecode that will be used in tests. Leave empty to generate the
- * bytecode for [source].
- *
+ *   bytecode for [source].
  * @return a pair of kotlin test file, to bytecode test file
  */
 fun kotlinAndBytecodeStub(
@@ -1470,33 +1486,25 @@
 ): KotlinAndBytecodeStub {
     val filenameWithoutExtension = filename.substringBefore(".").lowercase(Locale.ROOT)
     val kotlin = kotlin(source).to("$filepath/$filename")
-    val bytecodeStub = bytecode(
-        "libs/$filenameWithoutExtension.jar",
-        kotlin,
-        checksum,
-        *bytecode
-    )
+    val bytecodeStub = bytecode("libs/$filenameWithoutExtension.jar", kotlin, checksum, *bytecode)
     return KotlinAndBytecodeStub(kotlin, bytecodeStub)
 }
 
-class KotlinAndBytecodeStub(
-    val kotlin: TestFile,
-    val bytecode: TestFile
-)
+class KotlinAndBytecodeStub(val kotlin: TestFile, val bytecode: TestFile)
 
 /**
  * Utility for creating a [bytecode] stub, to try and make it easier to configure everything
  * correctly.
  *
- * @param filename name of the Kotlin source file, with extension - e.g. "Test.kt". These should
- * be unique across a test.
- * @param filepath directory structure matching the package name of the Kotlin source file. E.g.
- * if the source has `package foo.bar`, this should be `foo/bar`. If this does _not_ match, lint
- * will not be able to match the generated classes with the source file, and so won't print them
- * to console.
+ * @param filename name of the Kotlin source file, with extension - e.g. "Test.kt". These should be
+ *   unique across a test.
+ * @param filepath directory structure matching the package name of the Kotlin source file. E.g. if
+ *   the source has `package foo.bar`, this should be `foo/bar`. If this does _not_ match, lint will
+ *   not be able to match the generated classes with the source file, and so won't print them to
+ *   console.
  * @param source Kotlin source for the bytecode
  * @param bytecode generated bytecode that will be used in tests. Leave empty to generate the
- * bytecode for [source].
+ *   bytecode for [source].
  */
 fun bytecodeStub(
     filename: String,
diff --git a/compose/lint/common/src/main/java/androidx/compose/lint/ComposableUtils.kt b/compose/lint/common/src/main/java/androidx/compose/lint/ComposableUtils.kt
index 0cdf01c..84183af 100644
--- a/compose/lint/common/src/main/java/androidx/compose/lint/ComposableUtils.kt
+++ b/compose/lint/common/src/main/java/androidx/compose/lint/ComposableUtils.kt
@@ -55,43 +55,40 @@
  * function or lambda without being `remember`ed, or whether it is invoked inside a `remember call
  * without the provided [keys][keyClassNames].
  * - Returns true if this [UCallExpression] is directly invoked inside a Composable function or
- * lambda without being `remember`ed
+ *   lambda without being `remember`ed
  * - Returns true if this [UCallExpression] is invoked inside a call to `remember`, but without all
- * of the provided [keys][keyClassNames] being used as key parameters to `remember`
+ *   of the provided [keys][keyClassNames] being used as key parameters to `remember`
  * - Returns false if this [UCallExpression] is correctly `remember`ed with the provided
- * [keys][keyClassNames], or is not called inside a `remember` block, and is not called inside a
- * Composable function or lambda
+ *   [keys][keyClassNames], or is not called inside a `remember` block, and is not called inside a
+ *   Composable function or lambda
  *
  * @param keyClassNames [Name]s representing the expected classes that should be used as a key
- * parameter to the `remember` call
+ *   parameter to the `remember` call
  */
 fun UCallExpression.isNotRememberedWithKeys(vararg keyClassNames: Name): Boolean {
     val visitor = ComposableBodyVisitor(this)
     // The nearest method or lambda expression that contains this call expression
     val boundaryElement = visitor.parentUElements().last()
     // Check if the nearest lambda expression is actually a call to remember
-    val rememberCall: UCallExpression? = (boundaryElement.uastParent as? UCallExpression)?.takeIf {
-        it.methodName == Names.Runtime.Remember.shortName &&
-            it.resolve()?.isInPackageName(Names.Runtime.PackageName) == true
-    }
+    val rememberCall: UCallExpression? =
+        (boundaryElement.uastParent as? UCallExpression)?.takeIf {
+            it.methodName == Names.Runtime.Remember.shortName &&
+                it.resolve()?.isInPackageName(Names.Runtime.PackageName) == true
+        }
     return if (rememberCall == null) {
         visitor.isComposable()
     } else {
-        val parameterTypes = rememberCall.valueArguments.mapNotNull {
-            it.getExpressionType()?.canonicalText
-        }
-        !keyClassNames.all {
-            parameterTypes.contains(it.javaFqn)
-        }
+        val parameterTypes =
+            rememberCall.valueArguments.mapNotNull { it.getExpressionType()?.canonicalText }
+        !keyClassNames.all { parameterTypes.contains(it.javaFqn) }
     }
 }
 
 /**
- * Returns whether this [UExpression] is invoked within the body of a Composable function or
- * lambda.
+ * Returns whether this [UExpression] is invoked within the body of a Composable function or lambda.
  *
- * This searches parent declarations until we find a lambda expression or a function, and looks
- * to see if these are Composable.
+ * This searches parent declarations until we find a lambda expression or a function, and looks to
+ * see if these are Composable.
  */
 fun UExpression.isInvokedWithinComposable(): Boolean {
     return ComposableBodyVisitor(this).isComposable()
@@ -100,119 +97,108 @@
 // TODO: https://youtrack.jetbrains.com/issue/KT-45406
 // KotlinUMethodWithFakeLightDelegate.hasAnnotation() (for reified functions for example)
 // doesn't find annotations, so just look at the annotations directly.
-/**
- * Returns whether this method is @Composable or not
- */
+/** Returns whether this method is @Composable or not */
 val PsiMethod.isComposable
     get() = annotations.any { it.qualifiedName == Names.Runtime.Composable.javaFqn }
 
-/**
- * Returns whether this variable's type is @Composable or not
- */
+/** Returns whether this variable's type is @Composable or not */
 val UVariable.isComposable: Boolean
     get() {
         // Annotation on the lambda
-        val annotationOnLambda = when (val initializer = uastInitializer) {
-            is ULambdaExpression -> {
-                val source = initializer.sourcePsi
-                if (source is KtFunction) {
-                    // Anonymous function, val foo = @Composable fun() {}
-                    source.hasComposableAnnotation
-                } else {
-                    // Lambda, val foo = @Composable {}
-                    initializer.findAnnotation(Names.Runtime.Composable.javaFqn) != null
+        val annotationOnLambda =
+            when (val initializer = uastInitializer) {
+                is ULambdaExpression -> {
+                    val source = initializer.sourcePsi
+                    if (source is KtFunction) {
+                        // Anonymous function, val foo = @Composable fun() {}
+                        source.hasComposableAnnotation
+                    } else {
+                        // Lambda, val foo = @Composable {}
+                        initializer.findAnnotation(Names.Runtime.Composable.javaFqn) != null
+                    }
                 }
+                else -> false
             }
-            else -> false
-        }
         // Annotation on the type, foo: @Composable () -> Unit = { }
         val annotationOnType = typeReference?.isComposable == true
         return annotationOnLambda || annotationOnType
     }
 
-/**
- * Returns whether this parameter's type is @Composable or not
- */
+/** Returns whether this parameter's type is @Composable or not */
 private val PsiParameter.isComposable: Boolean
-    get() = when {
-        // The parameter is in a class file. Currently type annotations aren't currently added to
-        // the underlying type (https://youtrack.jetbrains.com/issue/KT-45307), so instead we use
-        // the metadata annotation.
-        this is ClsParameterImpl ||
-            // In some cases when a method is defined in bytecode and the call fails to resolve
-            // to the ClsMethodImpl, we will instead get a LightParameter. Note that some Kotlin
-            // declarations too will also appear as a LightParameter, so we can check to see if
-            // the source language is Java, which means that this is a LightParameter for
-            // bytecode, as opposed to for a Kotlin declaration.
-            // https://youtrack.jetbrains.com/issue/KT-46883
-            (this is LightParameter && this.language is JavaLanguage) -> {
-            // Find the containing method, so we can get metadata from the containing class
-            val containingMethod = getParentOfType<PsiMethod>(true)
-            val kmFunction = containingMethod!!.toKmFunction()
+    get() =
+        when {
+            // The parameter is in a class file. Currently type annotations aren't currently added
+            // to
+            // the underlying type (https://youtrack.jetbrains.com/issue/KT-45307), so instead we
+            // use
+            // the metadata annotation.
+            this is ClsParameterImpl ||
+                // In some cases when a method is defined in bytecode and the call fails to resolve
+                // to the ClsMethodImpl, we will instead get a LightParameter. Note that some Kotlin
+                // declarations too will also appear as a LightParameter, so we can check to see if
+                // the source language is Java, which means that this is a LightParameter for
+                // bytecode, as opposed to for a Kotlin declaration.
+                // https://youtrack.jetbrains.com/issue/KT-46883
+                (this is LightParameter && this.language is JavaLanguage) -> {
+                // Find the containing method, so we can get metadata from the containing class
+                val containingMethod = getParentOfType<PsiMethod>(true)
+                val kmFunction = containingMethod!!.toKmFunction()
 
-            val kmValueParameter = kmFunction?.valueParameters?.find {
-                it.name == name
+                val kmValueParameter = kmFunction?.valueParameters?.find { it.name == name }
+
+                kmValueParameter?.type?.annotations?.find {
+                    it.className == Names.Runtime.Composable.kmClassName
+                } != null
             }
-
-            kmValueParameter?.type?.annotations?.find {
-                it.className == Names.Runtime.Composable.kmClassName
-            } != null
+            // The parameter is in a source declaration
+            else -> (toUElement() as? UParameter)?.typeReference?.isComposable == true
         }
-        // The parameter is in a source declaration
-        else -> (toUElement() as? UParameter)?.typeReference?.isComposable == true
-    }
 
-/**
- * Returns whether this lambda expression is @Composable or not
- */
+/** Returns whether this lambda expression is @Composable or not */
 val ULambdaExpression.isComposable: Boolean
-    get() = when (val lambdaParent = uastParent) {
-        // Function call with a lambda parameter
-        is UCallExpression -> {
-            val parameter = lambdaParent.getParameterForArgument(this)
-            parameter?.isComposable == true
+    get() =
+        when (val lambdaParent = uastParent) {
+            // Function call with a lambda parameter
+            is UCallExpression -> {
+                val parameter = lambdaParent.getParameterForArgument(this)
+                parameter?.isComposable == true
+            }
+            // A local / non-local lambda variable
+            is UVariable -> {
+                lambdaParent.isComposable
+            }
+            // Either a new UAST type we haven't handled, or non-Kotlin declarations
+            else -> false
         }
-        // A local / non-local lambda variable
-        is UVariable -> {
-            lambdaParent.isComposable
-        }
-        // Either a new UAST type we haven't handled, or non-Kotlin declarations
-        else -> false
-    }
 
 /**
- * Helper class that visits parent declarations above the provided [expression], until it
- * finds a lambda or method. This 'boundary' is used as the indicator for whether this
- * [expression] can be considered to be inside a Composable body or not.
+ * Helper class that visits parent declarations above the provided [expression], until it finds a
+ * lambda or method. This 'boundary' is used as the indicator for whether this [expression] can be
+ * considered to be inside a Composable body or not.
  *
  * @see isComposable
  * @see parentUElements
  */
-private class ComposableBodyVisitor(
-    private val expression: UExpression
-) {
-    /**
-     * @return whether the body can be considered Composable or not
-     */
-    fun isComposable(): Boolean = when (val element = parentUElements.last()) {
-        is UMethod -> element.isComposable
-        is ULambdaExpression -> element.isComposable
-        else -> false
-    }
+private class ComposableBodyVisitor(private val expression: UExpression) {
+    /** @return whether the body can be considered Composable or not */
+    fun isComposable(): Boolean =
+        when (val element = parentUElements.last()) {
+            is UMethod -> element.isComposable
+            is ULambdaExpression -> element.isComposable
+            else -> false
+        }
 
-    /**
-     * Returns all parent [UElement]s until and including the boundary lambda / method.
-     */
+    /** Returns all parent [UElement]s until and including the boundary lambda / method. */
     fun parentUElements() = parentUElements
 
     /**
      * The outermost UElement that corresponds to the surrounding UDeclaration that contains
      * [expression], with the following special cases:
-     *
-     * - if the containing UDeclaration is a local property, we ignore it and search above as
-     * it still could be created in the context of a Composable body
-     * - if the containing UDeclaration is an anonymous class (object { }), we ignore it and
-     * search above as it still could be created in the context of a Composable body
+     * - if the containing UDeclaration is a local property, we ignore it and search above as it
+     *   still could be created in the context of a Composable body
+     * - if the containing UDeclaration is an anonymous class (object { }), we ignore it and search
+     *   above as it still could be created in the context of a Composable body
      */
     private val boundaryUElement by lazy {
         // The nearest property / function / etc declaration that contains this call expression
@@ -225,11 +211,9 @@
 
         while (
             containingDeclaration != null &&
-            (
-                containingDeclaration.isLocalProperty() ||
+                (containingDeclaration.isLocalProperty() ||
                     containingDeclaration.isAnonymousClass() ||
-                    containingDeclaration.isPropertyInsideAnonymousClass()
-                )
+                    containingDeclaration.isPropertyInsideAnonymousClass())
         ) {
             containingDeclaration = containingDeclaration.getContainingDeclaration()
         }
@@ -260,9 +244,7 @@
     }
 }
 
-/**
- * Returns whether this type reference is @Composable or not
- */
+/** Returns whether this type reference is @Composable or not */
 val UTypeReferenceExpression.isComposable: Boolean
     get() {
         if (type.hasAnnotation(Names.Runtime.Composable.javaFqn)) return true
@@ -273,10 +255,9 @@
         return (sourcePsi as? KtTypeReference)?.hasComposableAnnotation == true
     }
 
-/**
- * Returns whether this annotated declaration has a Composable annotation
- */
+/** Returns whether this annotated declaration has a Composable annotation */
 private val KtAnnotated.hasComposableAnnotation: Boolean
-    get() = annotationEntries.any {
-        (it.toUElement() as UAnnotation).qualifiedName == Names.Runtime.Composable.javaFqn
-    }
+    get() =
+        annotationEntries.any {
+            (it.toUElement() as UAnnotation).qualifiedName == Names.Runtime.Composable.javaFqn
+        }
diff --git a/compose/lint/common/src/main/java/androidx/compose/lint/KotlinMetadataUtils.kt b/compose/lint/common/src/main/java/androidx/compose/lint/KotlinMetadataUtils.kt
index 166a376..1425e05 100644
--- a/compose/lint/common/src/main/java/androidx/compose/lint/KotlinMetadataUtils.kt
+++ b/compose/lint/common/src/main/java/androidx/compose/lint/KotlinMetadataUtils.kt
@@ -32,8 +32,8 @@
 
 /**
  * @return the corresponding [KmFunction] for this [PsiMethod], or `null` if there is no
- * corresponding [KmFunction]. This method is only meaningful if this [PsiMethod] represents a
- * method defined in bytecode (most often a [ClsMethodImpl]).
+ *   corresponding [KmFunction]. This method is only meaningful if this [PsiMethod] represents a
+ *   method defined in bytecode (most often a [ClsMethodImpl]).
  */
 fun PsiMethod.toKmFunction(): KmFunction? =
     containingClass!!.getKmDeclarationContainer()?.findKmFunctionForPsiMethod(this)
@@ -43,23 +43,26 @@
 // we need to manually inspect the annotations and work with Cls* (compiled PSI).
 /**
  * Returns the [KmDeclarationContainer] using the kotlin.Metadata annotation present on this
- * [PsiClass]. Returns null if there is no annotation (not parsing a Kotlin
- * class file), the annotation data is for an unsupported version of Kotlin, or if the metadata
- * represents a synthetic class.
+ * [PsiClass]. Returns null if there is no annotation (not parsing a Kotlin class file), the
+ * annotation data is for an unsupported version of Kotlin, or if the metadata represents a
+ * synthetic class.
  */
 private fun PsiClass.getKmDeclarationContainer(): KmDeclarationContainer? {
-    val classKotlinMetadataPsiAnnotation = annotations.find {
-        // hasQualifiedName() not available on the min version of Lint we compile against
-        it.qualifiedName == KotlinMetadataFqn
-    } ?: return null
+    val classKotlinMetadataPsiAnnotation =
+        annotations.find {
+            // hasQualifiedName() not available on the min version of Lint we compile against
+            it.qualifiedName == KotlinMetadataFqn
+        } ?: return null
 
-    val metadata = try {
-        KotlinClassMetadata.readStrict(classKotlinMetadataPsiAnnotation.toMetadataAnnotation())
-    } catch (e: Exception) {
-        // Don't crash if we are trying to parse metadata from a newer version of Kotlin, than is
-        // supported by the bundled version of kotlinx-metadata-jvm
-        return null
-    }
+    val metadata =
+        try {
+            KotlinClassMetadata.readStrict(classKotlinMetadataPsiAnnotation.toMetadataAnnotation())
+        } catch (e: Exception) {
+            // Don't crash if we are trying to parse metadata from a newer version of Kotlin, than
+            // is
+            // supported by the bundled version of kotlinx-metadata-jvm
+            return null
+        }
 
     return when (metadata) {
         is KotlinClassMetadata.Class -> metadata.kmClass
@@ -71,9 +74,7 @@
     }
 }
 
-/**
- * Returns a [Metadata] by parsing the attributes of this @kotlin.Metadata PSI annotation.
- */
+/** Returns a [Metadata] by parsing the attributes of this @kotlin.Metadata PSI annotation. */
 private fun PsiAnnotation.toMetadataAnnotation(): Metadata {
     val attributes = attributes.associate { it.attributeName to it.attributeValue }
 
@@ -84,14 +85,10 @@
         (this as JvmAnnotationConstantValue).constantValue as Int
 
     fun JvmAnnotationAttributeValue.parseStringArray(): Array<String> =
-        (this as JvmAnnotationArrayValue).values.map {
-            it.parseString()
-        }.toTypedArray()
+        (this as JvmAnnotationArrayValue).values.map { it.parseString() }.toTypedArray()
 
     fun JvmAnnotationAttributeValue.parseIntArray(): IntArray =
-        (this as JvmAnnotationArrayValue).values.map {
-            it.parseInt()
-        }.toTypedArray().toIntArray()
+        (this as JvmAnnotationArrayValue).values.map { it.parseInt() }.toTypedArray().toIntArray()
 
     val kind = attributes["k"]?.parseInt()
     val metadataVersion = attributes["mv"]?.parseIntArray()
@@ -101,20 +98,12 @@
     val packageName = attributes["pn"]?.parseString()
     val extraInt = attributes["xi"]?.parseInt()
 
-    return Metadata(
-        kind,
-        metadataVersion,
-        data1,
-        data2,
-        extraString,
-        packageName,
-        extraInt
-    )
+    return Metadata(kind, metadataVersion, data1, data2, extraString, packageName, extraInt)
 }
 
 /**
  * @return the corresponding [KmFunction] in [this] for the given [method], matching by name and
- * signature.
+ *   signature.
  */
 private fun KmDeclarationContainer.findKmFunctionForPsiMethod(method: PsiMethod): KmFunction? {
     // Strip any mangled part of the name in case of value / inline classes
@@ -124,19 +113,17 @@
     // to `kotlin.Unit`, even though in the actual metadata they are still void. Try to match those
     // cases as well
     val unitReturnTypeSuffix = "Lkotlin/Unit;"
-    val expectedSignatureConvertedFromUnitToVoid = if (
-        expectedSignature.endsWith(unitReturnTypeSuffix)
-    ) {
-        expectedSignature.substringBeforeLast(unitReturnTypeSuffix) + "V"
-    } else {
-        expectedSignature
-    }
+    val expectedSignatureConvertedFromUnitToVoid =
+        if (expectedSignature.endsWith(unitReturnTypeSuffix)) {
+            expectedSignature.substringBeforeLast(unitReturnTypeSuffix) + "V"
+        } else {
+            expectedSignature
+        }
 
     return functions.find {
-        it.name == expectedName && (
-            it.signature?.descriptor == expectedSignature ||
-                it.signature?.descriptor == expectedSignatureConvertedFromUnitToVoid
-        )
+        it.name == expectedName &&
+            (it.signature?.descriptor == expectedSignature ||
+                it.signature?.descriptor == expectedSignatureConvertedFromUnitToVoid)
     }
 }
 
diff --git a/compose/lint/common/src/main/java/androidx/compose/lint/KotlinUtils.kt b/compose/lint/common/src/main/java/androidx/compose/lint/KotlinUtils.kt
index 9ec00a4..91feac6 100644
--- a/compose/lint/common/src/main/java/androidx/compose/lint/KotlinUtils.kt
+++ b/compose/lint/common/src/main/java/androidx/compose/lint/KotlinUtils.kt
@@ -35,8 +35,8 @@
 }
 
 /**
- * Helper class that visits references inside [lambda], calculating what parameters within
- * [lambda] are unreferenced inside the expression.
+ * Helper class that visits references inside [lambda], calculating what parameters within [lambda]
+ * are unreferenced inside the expression.
  */
 private class LambdaParameterVisitor(private val lambda: KtLambdaExpression) {
     private val ItName = "it"
@@ -62,13 +62,9 @@
             // Otherwise, look for all named, non-destructured parameters
             lambda.valueParameters
                 // Ignore parameters with a destructuring declaration instead of a named parameter
-                .filter {
-                    it.destructuringDeclaration == null
-                }
+                .filter { it.destructuringDeclaration == null }
                 // Ignore referenced parameters
-                .filterNot {
-                    isParameterReferenced(it.name!!)
-                }
+                .filterNot { isParameterReferenced(it.name!!) }
                 // Return an UnreferencedParameters for each un-referenced parameter
                 .map { UnreferencedParameter(it.name!!, it) }
         }
@@ -82,23 +78,22 @@
 
         // Find lambdas that shadow this parameter name, to make sure that they aren't shadowing
         // the references we are looking through
-        val lambdasWithMatchingParameterName = innerLambdas.filter { innerLambda ->
-            // If the lambda has an implicit it parameter, it will shadow the outer parameter if
-            // the outer parameter also has an implicit it parameter (its name is "it").
-            if (innerLambda.hasImplicitItParameter) {
-                name == ItName
-            } else {
-                // Otherwise look to see if any of the parameters on the inner lambda have the
-                // same name
-                innerLambda.valueParameters
-                    // Ignore parameters with a destructuring declaration instead of a named
-                    // parameter
-                    .filter {
-                        it.destructuringDeclaration == null
-                    }
-                    .any { it.name == name }
+        val lambdasWithMatchingParameterName =
+            innerLambdas.filter { innerLambda ->
+                // If the lambda has an implicit it parameter, it will shadow the outer parameter if
+                // the outer parameter also has an implicit it parameter (its name is "it").
+                if (innerLambda.hasImplicitItParameter) {
+                    name == ItName
+                } else {
+                    // Otherwise look to see if any of the parameters on the inner lambda have the
+                    // same name
+                    innerLambda.valueParameters
+                        // Ignore parameters with a destructuring declaration instead of a named
+                        // parameter
+                        .filter { it.destructuringDeclaration == null }
+                        .any { it.name == name }
+                }
             }
-        }
 
         // The parameter is referenced if there is at least one reference that isn't shadowed by an
         // inner lambda
@@ -118,19 +113,16 @@
 /**
  * Represents an unreferenced parameter.
  *
- * @property name the name of the parameter - if the parameter is an implicit `it` parameter,
- * this will be "it"
+ * @property name the name of the parameter - if the parameter is an implicit `it` parameter, this
+ *   will be "it"
  * @property parameter the parameter that is not referenced - can be null if the parameter is an
- * implicit `it` parameter
+ *   implicit `it` parameter
  */
-class UnreferencedParameter(
-    val name: String,
-    val parameter: KtParameter?
-)
+class UnreferencedParameter(val name: String, val parameter: KtParameter?)
 
 /**
- * Returns whether this lambda expression has an implicit `it` parameter - meaning it has
- * one parameter, and the parameter is not named explicitly.
+ * Returns whether this lambda expression has an implicit `it` parameter - meaning it has one
+ * parameter, and the parameter is not named explicitly.
  */
 private val KtLambdaExpression.hasImplicitItParameter: Boolean
     get() {
diff --git a/compose/lint/common/src/main/java/androidx/compose/lint/Names.kt b/compose/lint/common/src/main/java/androidx/compose/lint/Names.kt
index 0c192ef..b9478f3 100644
--- a/compose/lint/common/src/main/java/androidx/compose/lint/Names.kt
+++ b/compose/lint/common/src/main/java/androidx/compose/lint/Names.kt
@@ -18,20 +18,21 @@
 
 import kotlinx.metadata.ClassName
 
-/**
- * Contains common names used for lint checks.
- */
+/** Contains common names used for lint checks. */
 object Names {
     object Animation {
         val PackageName = Package("androidx.compose.animation")
+
         object Core {
             val PackageName = Package("androidx.compose.animation.core")
             val Animatable = Name(PackageName, "Animatable")
         }
     }
+
     object AnimationCore {
         val PackageName = Package("androidx.compose.animation.core")
     }
+
     object Runtime {
         val PackageName = Package("androidx.compose.runtime")
 
@@ -56,10 +57,12 @@
         val Key = Name(PackageName, "key")
         val StructuralEqualityPolicy = Name(PackageName, "structuralEqualityPolicy")
     }
+
     object Ui {
         val PackageName = Package("androidx.compose.ui")
         val Composed = Name(PackageName, "composed")
         val Modifier = Name(PackageName, "Modifier")
+
         object Layout {
             val PackageName = Package("androidx.compose.ui.layout")
             val ParentDataModifier = Name(PackageName, "ParentDataModifier")
@@ -95,9 +98,7 @@
  * @property segments the segments representing the package
  */
 class PackageName internal constructor(internal val segments: List<String>) {
-    /**
-     * The Java-style package name for this [Name], separated with `.`
-     */
+    /** The Java-style package name for this [Name], separated with `.` */
     val javaPackageName: String
         get() = segments.joinToString(".")
 }
@@ -106,55 +107,37 @@
  * Represents the qualified name for an element
  *
  * @property pkg the package for this element
- * @property nameSegments the segments representing the element - there can be multiple in the
- * case of nested classes.
+ * @property nameSegments the segments representing the element - there can be multiple in the case
+ *   of nested classes.
  */
-class Name internal constructor(
-    private val pkg: PackageName,
-    private val nameSegments: List<String>
-) {
-    /**
-     * The short name for this [Name]
-     */
+class Name
+internal constructor(private val pkg: PackageName, private val nameSegments: List<String>) {
+    /** The short name for this [Name] */
     val shortName: String
         get() = nameSegments.last()
 
-    /**
-     * The Java-style fully qualified name for this [Name], separated with `.`
-     */
+    /** The Java-style fully qualified name for this [Name], separated with `.` */
     val javaFqn: String
-        get() = pkg.segments.joinToString(".", postfix = ".") +
-            nameSegments.joinToString(".")
+        get() = pkg.segments.joinToString(".", postfix = ".") + nameSegments.joinToString(".")
 
     /**
-     * The [ClassName] for use with kotlinx.metadata. Note that in kotlinx.metadata the actual
-     * type might be different from the underlying JVM type, for example:
-     * kotlin/Int -> java/lang/Integer
+     * The [ClassName] for use with kotlinx.metadata. Note that in kotlinx.metadata the actual type
+     * might be different from the underlying JVM type, for example: kotlin/Int -> java/lang/Integer
      */
     val kmClassName: ClassName
-        get() = pkg.segments.joinToString("/", postfix = "/") +
-            nameSegments.joinToString(".")
+        get() = pkg.segments.joinToString("/", postfix = "/") + nameSegments.joinToString(".")
 
-    /**
-     * The [PackageName] of this element.
-     */
-    val packageName: PackageName get() = pkg
+    /** The [PackageName] of this element. */
+    val packageName: PackageName
+        get() = pkg
 }
 
-/**
- * @return a [PackageName] with a Java-style (separated with `.`) [packageName].
- */
-fun Package(packageName: String): PackageName =
-    PackageName(packageName.split("."))
+/** @return a [PackageName] with a Java-style (separated with `.`) [packageName]. */
+fun Package(packageName: String): PackageName = PackageName(packageName.split("."))
 
-/**
- * @return a [PackageName] with a Java-style (separated with `.`) [packageName].
- */
+/** @return a [PackageName] with a Java-style (separated with `.`) [packageName]. */
 fun Package(packageName: PackageName, shortName: String): PackageName =
     PackageName(packageName.segments + shortName.split("."))
 
-/**
- * @return a [Name] with the provided [pkg] and Java-style (separated with `.`) [shortName].
- */
-fun Name(pkg: PackageName, shortName: String): Name =
-    Name(pkg, shortName.split("."))
+/** @return a [Name] with the provided [pkg] and Java-style (separated with `.`) [shortName]. */
+fun Name(pkg: PackageName, shortName: String): Name = Name(pkg, shortName.split("."))
diff --git a/compose/lint/common/src/main/java/androidx/compose/lint/PsiUtils.kt b/compose/lint/common/src/main/java/androidx/compose/lint/PsiUtils.kt
index 0485114..e6ee457 100644
--- a/compose/lint/common/src/main/java/androidx/compose/lint/PsiUtils.kt
+++ b/compose/lint/common/src/main/java/androidx/compose/lint/PsiUtils.kt
@@ -22,17 +22,13 @@
 import com.intellij.psi.PsiType
 import com.intellij.psi.util.InheritanceUtil
 
-/**
- * Returns whether [this] has [packageName] as its package name.
- */
+/** Returns whether [this] has [packageName] as its package name. */
 fun PsiMethod.isInPackageName(packageName: PackageName): Boolean {
     val actual = (containingFile as? PsiJavaFile)?.packageName
     return packageName.javaPackageName == actual
 }
 
-/**
- * Whether this [PsiMethod] returns Unit
- */
+/** Whether this [PsiMethod] returns Unit */
 val PsiMethod.returnsUnit
     get() = returnType.isVoidOrUnit
 
@@ -45,14 +41,8 @@
 val PsiType?.isVoidOrUnit
     get() = this == PsiType.VOID || this?.canonicalText == "kotlin.Unit"
 
-/**
- * @return whether [this] inherits from [name]. Returns `true` if [this] _is_ directly [name].
- */
-fun PsiType.inheritsFrom(name: Name) =
-    InheritanceUtil.isInheritor(this, name.javaFqn)
+/** @return whether [this] inherits from [name]. Returns `true` if [this] _is_ directly [name]. */
+fun PsiType.inheritsFrom(name: Name) = InheritanceUtil.isInheritor(this, name.javaFqn)
 
-/**
- * @return whether [this] inherits from [name]. Returns `true` if [this] _is_ directly [name].
- */
-fun PsiClass.inheritsFrom(name: Name) =
-    InheritanceUtil.isInheritor(this, name.javaFqn)
+/** @return whether [this] inherits from [name]. Returns `true` if [this] _is_ directly [name]. */
+fun PsiClass.inheritsFrom(name: Name) = InheritanceUtil.isInheritor(this, name.javaFqn)
diff --git a/compose/lint/internal-lint-checks/src/main/java/androidx/compose/lint/AsCollectionDetector.kt b/compose/lint/internal-lint-checks/src/main/java/androidx/compose/lint/AsCollectionDetector.kt
index f34baf9..5a1464b 100644
--- a/compose/lint/internal-lint-checks/src/main/java/androidx/compose/lint/AsCollectionDetector.kt
+++ b/compose/lint/internal-lint-checks/src/main/java/androidx/compose/lint/AsCollectionDetector.kt
@@ -40,73 +40,77 @@
 import org.jetbrains.uast.UElement
 
 /**
- * Using [ScatterMap.asMap], [ScatterSet.asSet], [ObjectList.asList], or their mutable
- * counterparts indicates that the developer may be using the collection incorrectly.
- * Using the interfaces is slower access. It is best to use those only for when it touches
- * public API.
+ * Using [ScatterMap.asMap], [ScatterSet.asSet], [ObjectList.asList], or their mutable counterparts
+ * indicates that the developer may be using the collection incorrectly. Using the interfaces is
+ * slower access. It is best to use those only for when it touches public API.
  */
 class AsCollectionDetector : Detector(), SourceCodeScanner {
-    override fun getApplicableUastTypes() = listOf<Class<out UElement>>(
-        UCallExpression::class.java
-    )
+    override fun getApplicableUastTypes() = listOf<Class<out UElement>>(UCallExpression::class.java)
 
-    override fun createUastHandler(context: JavaContext) = object : UElementHandler() {
-        override fun visitCallExpression(node: UCallExpression) {
-            val methodName = node.methodName ?: return
-            if (methodName in MethodNames) {
-                val receiverType = node.receiverType as? PsiClassReferenceType ?: return
-                val qualifiedName = receiverType.canonicalText
-                val indexOfAngleBracket = qualifiedName.indexOf('<')
-                if (indexOfAngleBracket > 0 &&
-                    qualifiedName.substring(0, indexOfAngleBracket) in CollectionClasses
-                ) {
-                    context.report(
-                        ISSUE,
-                        node,
-                        context.getLocation(node),
-                        "Use method $methodName() only for public API usage"
-                    )
+    override fun createUastHandler(context: JavaContext) =
+        object : UElementHandler() {
+            override fun visitCallExpression(node: UCallExpression) {
+                val methodName = node.methodName ?: return
+                if (methodName in MethodNames) {
+                    val receiverType = node.receiverType as? PsiClassReferenceType ?: return
+                    val qualifiedName = receiverType.canonicalText
+                    val indexOfAngleBracket = qualifiedName.indexOf('<')
+                    if (
+                        indexOfAngleBracket > 0 &&
+                            qualifiedName.substring(0, indexOfAngleBracket) in CollectionClasses
+                    ) {
+                        context.report(
+                            ISSUE,
+                            node,
+                            context.getLocation(node),
+                            "Use method $methodName() only for public API usage"
+                        )
+                    }
                 }
             }
         }
-    }
 
     companion object {
-        private val MethodNames = scatterSetOf(
-            "asMap",
-            "asMutableMap",
-            "asSet",
-            "asMutableSet",
-            "asList",
-            "asMutableList"
-        )
-        private val CollectionClasses = scatterSetOf(
-            ScatterMap::class.qualifiedName,
-            MutableScatterMap::class.qualifiedName,
-            ScatterSet::class.qualifiedName,
-            MutableScatterSet::class.qualifiedName,
-            ObjectList::class.qualifiedName,
-            MutableObjectList::class.qualifiedName,
-        )
+        private val MethodNames =
+            scatterSetOf(
+                "asMap",
+                "asMutableMap",
+                "asSet",
+                "asMutableSet",
+                "asList",
+                "asMutableList"
+            )
+        private val CollectionClasses =
+            scatterSetOf(
+                ScatterMap::class.qualifiedName,
+                MutableScatterMap::class.qualifiedName,
+                ScatterSet::class.qualifiedName,
+                MutableScatterSet::class.qualifiedName,
+                ObjectList::class.qualifiedName,
+                MutableObjectList::class.qualifiedName,
+            )
 
         private val AsCollectionDetectorId = "AsCollectionCall"
 
-        val ISSUE = Issue.create(
-            id = AsCollectionDetectorId,
-            briefDescription = "High performance collections don't implement standard collection " +
-                "interfaces so that they can remain high performance. Converting to standard " +
-                "collections wraps the classes with another object. Use these interface " +
-                "wrappers only for exposing to public API.",
-            explanation = "ScatterMap, ScatterSet, and AnyList are written for high " +
-                "performance access. Using the standard collection interfaces for these classes " +
-                "forces slower performance access to these collections. The methods returning " +
-                "these interfaces should be limited to public API, where standard collection " +
-                "interfaces are expected.",
-            category = Category.PERFORMANCE, priority = 3, severity = Severity.ERROR,
-            implementation = Implementation(
-                AsCollectionDetector::class.java,
-                EnumSet.of(Scope.JAVA_FILE)
+        val ISSUE =
+            Issue.create(
+                id = AsCollectionDetectorId,
+                briefDescription =
+                    "High performance collections don't implement standard collection " +
+                        "interfaces so that they can remain high performance. Converting to standard " +
+                        "collections wraps the classes with another object. Use these interface " +
+                        "wrappers only for exposing to public API.",
+                explanation =
+                    "ScatterMap, ScatterSet, and AnyList are written for high " +
+                        "performance access. Using the standard collection interfaces for these classes " +
+                        "forces slower performance access to these collections. The methods returning " +
+                        "these interfaces should be limited to public API, where standard collection " +
+                        "interfaces are expected.",
+                category = Category.PERFORMANCE,
+                priority = 3,
+                severity = Severity.ERROR,
+                implementation =
+                    Implementation(AsCollectionDetector::class.java, EnumSet.of(Scope.JAVA_FILE))
             )
-        )
     }
 }
diff --git a/compose/lint/internal-lint-checks/src/main/java/androidx/compose/lint/CommonModuleIncompatibilityDetector.kt b/compose/lint/internal-lint-checks/src/main/java/androidx/compose/lint/CommonModuleIncompatibilityDetector.kt
index 5ce93a2..4b98d0c 100644
--- a/compose/lint/internal-lint-checks/src/main/java/androidx/compose/lint/CommonModuleIncompatibilityDetector.kt
+++ b/compose/lint/internal-lint-checks/src/main/java/androidx/compose/lint/CommonModuleIncompatibilityDetector.kt
@@ -58,10 +58,11 @@
         return object : UElementHandler() {
             override fun visitImportStatement(node: UImportStatement) {
                 val reference = node.importReference?.asRenderString() ?: return
-                val isPlatformImport = PLATFORM_PACKAGES.any { platformPackage ->
-                    (platformPackage == reference && node.isOnDemand) ||
-                        reference.startsWith("$platformPackage.")
-                }
+                val isPlatformImport =
+                    PLATFORM_PACKAGES.any { platformPackage ->
+                        (platformPackage == reference && node.isOnDemand) ||
+                            reference.startsWith("$platformPackage.")
+                    }
                 if (!isPlatformImport) return
 
                 val target = node.importReference!!
@@ -118,63 +119,69 @@
     }
 
     companion object {
-        val IMPORT_ISSUE = Issue.create(
-            id = "PlatformImportInCommonModule",
-            briefDescription = "Platform-dependent import in a common module",
-            explanation = "Common Kotlin module cannot contain references to JVM or Android " +
-                "classes, as it reduces future portability to other Kotlin targets. Consider " +
-                "alternative methods allowed in common Kotlin code, or use expect/actual " +
-                "to reference the platform code instead.",
-            category = Category.CORRECTNESS,
-            priority = 5,
-            severity = Severity.ERROR,
-            implementation = Implementation(
-                CommonModuleIncompatibilityDetector::class.java,
-                Scope.JAVA_FILE_SCOPE
+        val IMPORT_ISSUE =
+            Issue.create(
+                id = "PlatformImportInCommonModule",
+                briefDescription = "Platform-dependent import in a common module",
+                explanation =
+                    "Common Kotlin module cannot contain references to JVM or Android " +
+                        "classes, as it reduces future portability to other Kotlin targets. Consider " +
+                        "alternative methods allowed in common Kotlin code, or use expect/actual " +
+                        "to reference the platform code instead.",
+                category = Category.CORRECTNESS,
+                priority = 5,
+                severity = Severity.ERROR,
+                implementation =
+                    Implementation(
+                        CommonModuleIncompatibilityDetector::class.java,
+                        Scope.JAVA_FILE_SCOPE
+                    )
             )
-        )
 
-        val REFERENCE_ISSUE = Issue.create(
-            id = "PlatformReferenceInCommonModule",
-            briefDescription = "Platform-dependent reference in a common module",
-            explanation = "Common Kotlin module cannot contain references to JVM or Android " +
-                "classes, as it reduces future portability to other Kotlin targets. Consider " +
-                "alternative methods allowed in common Kotlin code, or use expect/actual " +
-                "to reference the platform code instead.",
-            category = Category.CORRECTNESS,
-            priority = 5,
-            severity = Severity.ERROR,
-            implementation = Implementation(
-                CommonModuleIncompatibilityDetector::class.java,
-                Scope.JAVA_FILE_SCOPE
+        val REFERENCE_ISSUE =
+            Issue.create(
+                id = "PlatformReferenceInCommonModule",
+                briefDescription = "Platform-dependent reference in a common module",
+                explanation =
+                    "Common Kotlin module cannot contain references to JVM or Android " +
+                        "classes, as it reduces future portability to other Kotlin targets. Consider " +
+                        "alternative methods allowed in common Kotlin code, or use expect/actual " +
+                        "to reference the platform code instead.",
+                category = Category.CORRECTNESS,
+                priority = 5,
+                severity = Severity.ERROR,
+                implementation =
+                    Implementation(
+                        CommonModuleIncompatibilityDetector::class.java,
+                        Scope.JAVA_FILE_SCOPE
+                    )
             )
-        )
 
-        val EXTENDS_LAMBDA_ISSUE = Issue.create(
-            id = "ExtendedFunctionNInterface",
-            briefDescription = "Extending Kotlin FunctionN interfaces in common code",
-            explanation = "Common Kotlin module are ported to other Kotlin targets, including JS." +
-                " Kotlin JS backend does not support extending lambda interfaces. Consider" +
-                "extending fun interface in common Kotlin code, or use expect/actual instead.",
-            category = Category.CORRECTNESS,
-            priority = 5,
-            severity = Severity.ERROR,
-            implementation = Implementation(
-                CommonModuleIncompatibilityDetector::class.java,
-                Scope.JAVA_FILE_SCOPE
+        val EXTENDS_LAMBDA_ISSUE =
+            Issue.create(
+                id = "ExtendedFunctionNInterface",
+                briefDescription = "Extending Kotlin FunctionN interfaces in common code",
+                explanation =
+                    "Common Kotlin module are ported to other Kotlin targets, including JS." +
+                        " Kotlin JS backend does not support extending lambda interfaces. Consider" +
+                        "extending fun interface in common Kotlin code, or use expect/actual instead.",
+                category = Category.CORRECTNESS,
+                priority = 5,
+                severity = Severity.ERROR,
+                implementation =
+                    Implementation(
+                        CommonModuleIncompatibilityDetector::class.java,
+                        Scope.JAVA_FILE_SCOPE
+                    )
             )
-        )
 
         private const val COMMON_MAIN_PATH_PREFIX = "src/commonMain"
-        private val PLATFORM_PACKAGES = listOf(
-            "java",
-            "javax",
-            "android"
-        )
-        private val RESTRICTED_PROPERTIES = mapOf(
-            "javaClass" to Name(Package("kotlin.jvm"), "getJavaClass"),
-            "java" to Name(Package("kotlin.jvm"), "getJavaClass"),
-        )
+        private val PLATFORM_PACKAGES = listOf("java", "javax", "android")
+        private val RESTRICTED_PROPERTIES =
+            mapOf(
+                "javaClass" to Name(Package("kotlin.jvm"), "getJavaClass"),
+                "java" to Name(Package("kotlin.jvm"), "getJavaClass"),
+            )
     }
 }
 
diff --git a/compose/lint/internal-lint-checks/src/main/java/androidx/compose/lint/ComposeIssueRegistry.kt b/compose/lint/internal-lint-checks/src/main/java/androidx/compose/lint/ComposeIssueRegistry.kt
index 36ecaff..7baadf7 100644
--- a/compose/lint/internal-lint-checks/src/main/java/androidx/compose/lint/ComposeIssueRegistry.kt
+++ b/compose/lint/internal-lint-checks/src/main/java/androidx/compose/lint/ComposeIssueRegistry.kt
@@ -26,23 +26,26 @@
 class ComposeIssueRegistry : IssueRegistry() {
     override val minApi = CURRENT_API
     override val api = 14
-    override val issues get(): List<Issue> {
-        return listOf(
-            AsCollectionDetector.ISSUE,
-            ExceptionMessageDetector.ISSUE,
-            ListIteratorDetector.ISSUE,
-            SteppedForLoopDetector.ISSUE,
-            UnnecessaryLambdaCreationDetector.ISSUE,
-            CommonModuleIncompatibilityDetector.IMPORT_ISSUE,
-            CommonModuleIncompatibilityDetector.REFERENCE_ISSUE,
-            CommonModuleIncompatibilityDetector.EXTENDS_LAMBDA_ISSUE,
-            PrimitiveInCollectionDetector.ISSUE,
-            LambdaStructuralEqualityDetector.ISSUE
+    override val issues
+        get(): List<Issue> {
+            return listOf(
+                AsCollectionDetector.ISSUE,
+                ExceptionMessageDetector.ISSUE,
+                ListIteratorDetector.ISSUE,
+                SteppedForLoopDetector.ISSUE,
+                UnnecessaryLambdaCreationDetector.ISSUE,
+                CommonModuleIncompatibilityDetector.IMPORT_ISSUE,
+                CommonModuleIncompatibilityDetector.REFERENCE_ISSUE,
+                CommonModuleIncompatibilityDetector.EXTENDS_LAMBDA_ISSUE,
+                PrimitiveInCollectionDetector.ISSUE,
+                LambdaStructuralEqualityDetector.ISSUE
+            )
+        }
+
+    override val vendor =
+        Vendor(
+            vendorName = "Jetpack Compose",
+            identifier = "compose:lint:internal-lint-checks",
+            feedbackUrl = "https://issuetracker.google.com/issues/new?component=612128"
         )
-    }
-    override val vendor = Vendor(
-        vendorName = "Jetpack Compose",
-        identifier = "compose:lint:internal-lint-checks",
-        feedbackUrl = "https://issuetracker.google.com/issues/new?component=612128"
-    )
 }
diff --git a/compose/lint/internal-lint-checks/src/main/java/androidx/compose/lint/ExceptionMessageDetector.kt b/compose/lint/internal-lint-checks/src/main/java/androidx/compose/lint/ExceptionMessageDetector.kt
index 8e1b11e..e5d909b 100644
--- a/compose/lint/internal-lint-checks/src/main/java/androidx/compose/lint/ExceptionMessageDetector.kt
+++ b/compose/lint/internal-lint-checks/src/main/java/androidx/compose/lint/ExceptionMessageDetector.kt
@@ -33,13 +33,14 @@
 
     override fun getApplicableMethodNames(): List<String> =
         listOf(Check, CheckNotNull, Require, RequireNotNull).map { it.shortName }
+
     override fun visitMethodCall(context: JavaContext, node: UCallExpression, method: PsiMethod) {
 
         // We ignore other functions with the same name.
         if (!method.isInPackageName(KotlinPackage)) return
 
-        val lazyMessage = node.valueArguments
-            .find { node.getParameterForArgument(it)?.name == "lazyMessage" }
+        val lazyMessage =
+            node.valueArguments.find { node.getParameterForArgument(it)?.name == "lazyMessage" }
         if (lazyMessage == null) {
             context.report(
                 ISSUE,
@@ -56,10 +57,12 @@
         val CheckNotNull = Name(KotlinPackage, "checkNotNull")
         val Require = Name(KotlinPackage, "require")
         val RequireNotNull = Name(KotlinPackage, "requireNotNull")
-        val ISSUE = Issue.create(
-            id = "ExceptionMessage",
-            briefDescription = "Please provide a string for the lazyMessage parameter",
-            explanation = """
+        val ISSUE =
+            Issue.create(
+                id = "ExceptionMessage",
+                briefDescription = "Please provide a string for the lazyMessage parameter",
+                explanation =
+                    """
                 Calls to check(), checkNotNull(), require() and requireNotNull() should
                 include a message string that can be used to debug issues experienced
                 by users.
@@ -70,13 +73,14 @@
                 Consider supplying a lazyMessage parameter to identify the check()
                 or require() call.
             """,
-            category = Category.CORRECTNESS,
-            priority = 3,
-            severity = Severity.ERROR,
-            implementation = Implementation(
-                ExceptionMessageDetector::class.java,
-                EnumSet.of(Scope.JAVA_FILE)
+                category = Category.CORRECTNESS,
+                priority = 3,
+                severity = Severity.ERROR,
+                implementation =
+                    Implementation(
+                        ExceptionMessageDetector::class.java,
+                        EnumSet.of(Scope.JAVA_FILE)
+                    )
             )
-        )
     }
 }
diff --git a/compose/lint/internal-lint-checks/src/main/java/androidx/compose/lint/LambdaStructuralEqualityDetector.kt b/compose/lint/internal-lint-checks/src/main/java/androidx/compose/lint/LambdaStructuralEqualityDetector.kt
index 6d7c0c0..5ae70d2 100644
--- a/compose/lint/internal-lint-checks/src/main/java/androidx/compose/lint/LambdaStructuralEqualityDetector.kt
+++ b/compose/lint/internal-lint-checks/src/main/java/androidx/compose/lint/LambdaStructuralEqualityDetector.kt
@@ -43,60 +43,54 @@
  * referentially (=== or !==) to avoid this issue.
  */
 class LambdaStructuralEqualityDetector : Detector(), SourceCodeScanner {
-    override fun getApplicableUastTypes() = listOf(
-        UBinaryExpression::class.java,
-        UCallExpression::class.java
-    )
+    override fun getApplicableUastTypes() =
+        listOf(UBinaryExpression::class.java, UCallExpression::class.java)
 
-    override fun createUastHandler(context: JavaContext) = object : UElementHandler() {
-        override fun visitBinaryExpression(node: UBinaryExpression) {
-            val op = node.operator
-            if (op == UastBinaryOperator.EQUALS ||
-                op == UastBinaryOperator.NOT_EQUALS) {
-                val left = node.leftOperand.sourcePsi as? KtExpression ?: return
-                val right = node.rightOperand.sourcePsi as? KtExpression ?: return
-                if (left.isFunctionType() && right.isFunctionType()) {
-                    val replacement = if (op == UastBinaryOperator.EQUALS) "===" else "!=="
-                    context.report(
-                        ISSUE,
-                        node.operatorIdentifier,
-                        context.getNameLocation(node.operatorIdentifier ?: node),
-                        BriefDescription,
-                        LintFix.create()
-                            .replace()
-                            .name("Change to $replacement")
-                            .text(op.text)
-                            .with(replacement)
-                            .autoFix()
-                            .build()
-                    )
+    override fun createUastHandler(context: JavaContext) =
+        object : UElementHandler() {
+            override fun visitBinaryExpression(node: UBinaryExpression) {
+                val op = node.operator
+                if (op == UastBinaryOperator.EQUALS || op == UastBinaryOperator.NOT_EQUALS) {
+                    val left = node.leftOperand.sourcePsi as? KtExpression ?: return
+                    val right = node.rightOperand.sourcePsi as? KtExpression ?: return
+                    if (left.isFunctionType() && right.isFunctionType()) {
+                        val replacement = if (op == UastBinaryOperator.EQUALS) "===" else "!=="
+                        context.report(
+                            ISSUE,
+                            node.operatorIdentifier,
+                            context.getNameLocation(node.operatorIdentifier ?: node),
+                            BriefDescription,
+                            LintFix.create()
+                                .replace()
+                                .name("Change to $replacement")
+                                .text(op.text)
+                                .with(replacement)
+                                .autoFix()
+                                .build()
+                        )
+                    }
+                }
+            }
+
+            override fun visitCallExpression(node: UCallExpression) {
+                if (node.methodName == "equals") {
+                    val left = node.receiver?.sourcePsi as? KtExpression ?: return
+                    val right =
+                        node.valueArguments.firstOrNull()?.sourcePsi as? KtExpression ?: return
+                    if (left.isFunctionType() && right.isFunctionType()) {
+                        context.report(ISSUE, node, context.getNameLocation(node), BriefDescription)
+                    }
                 }
             }
         }
 
-        override fun visitCallExpression(node: UCallExpression) {
-            if (node.methodName == "equals") {
-                val left = node.receiver?.sourcePsi as? KtExpression ?: return
-                val right = node.valueArguments.firstOrNull()?.sourcePsi as? KtExpression ?: return
-                if (left.isFunctionType() && right.isFunctionType()) {
-                    context.report(
-                        ISSUE,
-                        node,
-                        context.getNameLocation(node),
-                        BriefDescription
-                    )
-                }
-            }
-        }
-    }
-
-    private fun KtExpression.isFunctionType(): Boolean = analyze(this) {
-        getKtType()?.isFunctionType == true
-    }
+    private fun KtExpression.isFunctionType(): Boolean =
+        analyze(this) { getKtType()?.isFunctionType == true }
 
     companion object {
-        private const val BriefDescription = "Checking lambdas for structural equality, instead " +
-            "of checking for referential equality"
+        private const val BriefDescription =
+            "Checking lambdas for structural equality, instead " +
+                "of checking for referential equality"
         private const val Explanation =
             "Checking structural equality on lambdas can lead to issues, as function references " +
                 "(::lambda) do not consider their capture scope in their equals implementation. " +
@@ -104,15 +98,18 @@
                 "different references with a different capture scope. Instead, lambdas should be" +
                 "compared referentially (=== or !==) to avoid this issue."
 
-        val ISSUE = Issue.create(
-            "LambdaStructuralEquality",
-            BriefDescription,
-            Explanation,
-            Category.CORRECTNESS, 5, Severity.ERROR,
-            Implementation(
-                LambdaStructuralEqualityDetector::class.java,
-                EnumSet.of(Scope.JAVA_FILE, Scope.TEST_SOURCES)
+        val ISSUE =
+            Issue.create(
+                "LambdaStructuralEquality",
+                BriefDescription,
+                Explanation,
+                Category.CORRECTNESS,
+                5,
+                Severity.ERROR,
+                Implementation(
+                    LambdaStructuralEqualityDetector::class.java,
+                    EnumSet.of(Scope.JAVA_FILE, Scope.TEST_SOURCES)
+                )
             )
-        )
     }
 }
diff --git a/compose/lint/internal-lint-checks/src/main/java/androidx/compose/lint/ListIteratorDetector.kt b/compose/lint/internal-lint-checks/src/main/java/androidx/compose/lint/ListIteratorDetector.kt
index b3a2280..a15c376 100644
--- a/compose/lint/internal-lint-checks/src/main/java/androidx/compose/lint/ListIteratorDetector.kt
+++ b/compose/lint/internal-lint-checks/src/main/java/androidx/compose/lint/ListIteratorDetector.kt
@@ -38,103 +38,105 @@
 import org.jetbrains.uast.toUElement
 
 /**
- * Lint [Detector] to prevent allocating Iterators when iterating on a [List]. Instead of using
- * `for (e in list)` or `list.forEach {}`, more efficient iteration methods should be used, such as
- * `for (i in list.indices) { list[i]... }` or `list.fastForEach`.
+ * Lint [Detector] to prevent allocating Iterators when iterating on a [List]. Instead of using `for
+ * (e in list)` or `list.forEach {}`, more efficient iteration methods should be used, such as `for
+ * (i in list.indices) { list[i]... }` or `list.fastForEach`.
  */
 class ListIteratorDetector : Detector(), SourceCodeScanner {
-    override fun getApplicableUastTypes() = listOf(
-        UForEachExpression::class.java,
-        UCallExpression::class.java
-    )
+    override fun getApplicableUastTypes() =
+        listOf(UForEachExpression::class.java, UCallExpression::class.java)
 
-    override fun createUastHandler(context: JavaContext) = object : UElementHandler() {
-        override fun visitForEachExpression(node: UForEachExpression) {
-            // Type of the variable we are iterating on, i.e the type of `b` in `for (a in b)`
-            val iteratedValueType = node.iteratedValue.getExpressionType()
-            // We are iterating on a List
-            if (iteratedValueType?.inheritsFrom(JavaList) == true) {
-                // Find the `in` keyword to use as location
-                val inKeyword = (node.sourcePsi as? KtForExpression)?.inKeyword
-                val location = if (inKeyword == null) {
-                    context.getNameLocation(node)
-                } else {
-                    context.getNameLocation(inKeyword)
+    override fun createUastHandler(context: JavaContext) =
+        object : UElementHandler() {
+            override fun visitForEachExpression(node: UForEachExpression) {
+                // Type of the variable we are iterating on, i.e the type of `b` in `for (a in b)`
+                val iteratedValueType = node.iteratedValue.getExpressionType()
+                // We are iterating on a List
+                if (iteratedValueType?.inheritsFrom(JavaList) == true) {
+                    // Find the `in` keyword to use as location
+                    val inKeyword = (node.sourcePsi as? KtForExpression)?.inKeyword
+                    val location =
+                        if (inKeyword == null) {
+                            context.getNameLocation(node)
+                        } else {
+                            context.getNameLocation(inKeyword)
+                        }
+                    context.report(
+                        ISSUE,
+                        node,
+                        location,
+                        "Creating an unnecessary Iterator to iterate through a List"
+                    )
                 }
+            }
+
+            override fun visitCallExpression(node: UCallExpression) {
+                val receiverType = node.receiverType
+
+                // We are calling a method on a `List` type
+                if (receiverType?.inheritsFrom(JavaList) == true) {
+                    when (val method = node.resolve()?.unwrapped) {
+                        // Parsing a class file
+                        is ClsMethodImpl -> {
+                            method.checkForIterableReceiver(node)
+                        }
+                        // Parsing Kotlin source
+                        is KtNamedFunction -> {
+                            method.checkForIterableReceiver(node)
+                        }
+                    }
+                }
+            }
+
+            private fun ClsMethodImpl.checkForIterableReceiver(node: UCallExpression) {
+                val kmFunction = this.toKmFunction()
+
+                kmFunction?.let {
+                    if (it.receiverParameterType?.classifier == KotlinIterableClassifier) {
+                        context.report(
+                            ISSUE,
+                            node,
+                            context.getNameLocation(node),
+                            "Creating an unnecessary Iterator to iterate through a List"
+                        )
+                    }
+                }
+            }
+
+            private fun KtNamedFunction.checkForIterableReceiver(node: UCallExpression) {
+                val receiver = receiverTypeReference
+                // If there is no receiver, or the receiver isn't an Iterable, ignore
+                if (
+                    (receiver.toUElement() as? UTypeReferenceExpression)?.getQualifiedName() !=
+                        JavaIterable.javaFqn
+                )
+                    return
+
                 context.report(
                     ISSUE,
                     node,
-                    location,
+                    context.getNameLocation(node),
                     "Creating an unnecessary Iterator to iterate through a List"
                 )
             }
         }
 
-        override fun visitCallExpression(node: UCallExpression) {
-            val receiverType = node.receiverType
-
-            // We are calling a method on a `List` type
-            if (receiverType?.inheritsFrom(JavaList) == true) {
-                when (val method = node.resolve()?.unwrapped) {
-                    // Parsing a class file
-                    is ClsMethodImpl -> {
-                        method.checkForIterableReceiver(node)
-                    }
-                    // Parsing Kotlin source
-                    is KtNamedFunction -> {
-                        method.checkForIterableReceiver(node)
-                    }
-                }
-            }
-        }
-
-        private fun ClsMethodImpl.checkForIterableReceiver(node: UCallExpression) {
-            val kmFunction = this.toKmFunction()
-
-            kmFunction?.let {
-                if (it.receiverParameterType?.classifier == KotlinIterableClassifier) {
-                    context.report(
-                        ISSUE,
-                        node,
-                        context.getNameLocation(node),
-                        "Creating an unnecessary Iterator to iterate through a List"
-                    )
-                }
-            }
-        }
-
-        private fun KtNamedFunction.checkForIterableReceiver(node: UCallExpression) {
-            val receiver = receiverTypeReference
-            // If there is no receiver, or the receiver isn't an Iterable, ignore
-            if ((receiver.toUElement() as? UTypeReferenceExpression)
-                ?.getQualifiedName() != JavaIterable.javaFqn
-            ) return
-
-            context.report(
-                ISSUE,
-                node,
-                context.getNameLocation(node),
-                "Creating an unnecessary Iterator to iterate through a List"
-            )
-        }
-    }
-
     companion object {
-        val ISSUE = Issue.create(
-            "ListIterator",
-            "Creating an unnecessary Iterator to iterate through a List",
-            "Iterable<T> extension methods and using `for (a in list)` will create an " +
-                "Iterator object - in hot code paths this can cause a lot of extra allocations " +
-                "which is something we want to avoid. Instead, use a method that doesn't " +
-                "allocate, such as `fastForEach`, or use `for (a in list.indices)` as iterating " +
-                "through an `IntRange` does not allocate an Iterator, and becomes just a simple " +
-                "for loop.",
-            Category.PERFORMANCE, 5, Severity.ERROR,
-            Implementation(
-                ListIteratorDetector::class.java,
-                Scope.JAVA_FILE_SCOPE
+        val ISSUE =
+            Issue.create(
+                "ListIterator",
+                "Creating an unnecessary Iterator to iterate through a List",
+                "Iterable<T> extension methods and using `for (a in list)` will create an " +
+                    "Iterator object - in hot code paths this can cause a lot of extra allocations " +
+                    "which is something we want to avoid. Instead, use a method that doesn't " +
+                    "allocate, such as `fastForEach`, or use `for (a in list.indices)` as iterating " +
+                    "through an `IntRange` does not allocate an Iterator, and becomes just a simple " +
+                    "for loop.",
+                Category.PERFORMANCE,
+                5,
+                Severity.ERROR,
+                Implementation(ListIteratorDetector::class.java, Scope.JAVA_FILE_SCOPE)
             )
-        )
     }
 }
 
diff --git a/compose/lint/internal-lint-checks/src/main/java/androidx/compose/lint/PrimitiveInCollectionDetector.kt b/compose/lint/internal-lint-checks/src/main/java/androidx/compose/lint/PrimitiveInCollectionDetector.kt
index 945f354..694892d 100644
--- a/compose/lint/internal-lint-checks/src/main/java/androidx/compose/lint/PrimitiveInCollectionDetector.kt
+++ b/compose/lint/internal-lint-checks/src/main/java/androidx/compose/lint/PrimitiveInCollectionDetector.kt
@@ -43,136 +43,138 @@
 import org.jetbrains.uast.getContainingUClass
 
 /**
- * This detects uses of Set, List, and Map with primitive type arguments. Internally, these
- * should be replaced by the primitive-specific collections in androidx.
+ * This detects uses of Set, List, and Map with primitive type arguments. Internally, these should
+ * be replaced by the primitive-specific collections in androidx.
  */
 class PrimitiveInCollectionDetector : Detector(), SourceCodeScanner {
-    override fun getApplicableUastTypes() = listOf<Class<out UElement>>(
-        UMethod::class.java,
-        UVariable::class.java
-    )
+    override fun getApplicableUastTypes() =
+        listOf<Class<out UElement>>(UMethod::class.java, UVariable::class.java)
 
-    override fun createUastHandler(context: JavaContext) = object : UElementHandler() {
-        override fun visitMethod(node: UMethod) {
-            if (context.evaluator.isOverride(node) ||
-                node.isDataClassGeneratedMethod(context)
-            ) {
-                return
-            }
-
-            val primitiveCollection = node.returnType?.primitiveCollectionReplacement(context)
-            if (primitiveCollection != null) {
-                // The location doesn't appear to work with property types with getters rather than
-                // full fields. Target the property name instead if we don't have a location.
-                val target = if (context.getLocation(node.returnTypeReference).start == null) {
-                    node
-                } else {
-                    node.returnTypeReference
-                }
-                report(
-                    context,
-                    node,
-                    target,
-                    "return type ${node.returnType?.presentableText} of ${node.name}:" +
-                        " replace with $primitiveCollection"
-                )
-            }
-        }
-
-        override fun visitVariable(node: UVariable) {
-            // Kotlin destructuring expression is desugared. E.g.,
-            //
-            //   val (x, y) = pair
-            //
-            // is mapped to
-            //
-            //   val varHash = pair // temp variable
-            //   val x = varHash.component1()
-            //   val y = varHash.component2()
-            //
-            // and thus we don't need to analyze the temporary variable.
-            // Their `sourcePsi`s are different:
-            //   KtDestructuringDeclaration (for overall expression) v.s.
-            //   KtDestructuringDeclarationEntry (for individual local variables)
-            if (node.sourcePsi is KtDestructuringDeclaration) return
-
-            val primitiveCollection = node.type.primitiveCollectionReplacement(context) ?: return
-            if (node.isLambdaParameter()) {
-                // Don't notify for lambda parameters. We'll be notifying for the method
-                // that accepts the lambda, so we already have it flagged there. The
-                // person using it doesn't really have a choice about the parameters that
-                // are passed.
-                return
-            }
-            val parent = node.uastParent
-            val messageContext = if (parent is UMethod) {
-                // Data class constructor parameters are caught 4 times:
-                // 1) constructor method parameter
-                // 2) the field of the backing 'val'
-                // 3) the getter for the field
-                // 4) the generated copy() method.
-                // We can eliminate the copy() at least, even if we get duplicates for the
-                // other 3. It would be ideal to eliminate 2 of the other 3, but it isn't
-                // easy to do and still catch all uses.
-                if (context.evaluator.isOverride(parent) ||
-                    (context.evaluator.isData(parent) && parent.name.startsWith("copy"))
+    override fun createUastHandler(context: JavaContext) =
+        object : UElementHandler() {
+            override fun visitMethod(node: UMethod) {
+                if (
+                    context.evaluator.isOverride(node) || node.isDataClassGeneratedMethod(context)
                 ) {
                     return
                 }
-                val methodName = if (parent.isConstructor) {
-                    "constructor ${parent.getContainingUClass()?.name}"
-                } else {
-                    "method ${parent.name}"
-                }
-                "$methodName has parameter ${node.name} " +
-                    "with type ${node.type.presentableText}: replace with $primitiveCollection"
-            } else {
-                val varOrField = if (node is UField) "field" else "variable"
 
-                "$varOrField ${node.name} with type ${node.type.presentableText}: replace" +
-                    " with $primitiveCollection"
+                val primitiveCollection = node.returnType?.primitiveCollectionReplacement(context)
+                if (primitiveCollection != null) {
+                    // The location doesn't appear to work with property types with getters rather
+                    // than
+                    // full fields. Target the property name instead if we don't have a location.
+                    val target =
+                        if (context.getLocation(node.returnTypeReference).start == null) {
+                            node
+                        } else {
+                            node.returnTypeReference
+                        }
+                    report(
+                        context,
+                        node,
+                        target,
+                        "return type ${node.returnType?.presentableText} of ${node.name}:" +
+                            " replace with $primitiveCollection"
+                    )
+                }
             }
-            report(
-                context,
-                node,
-                node.typeReference,
-                messageContext
-            )
+
+            override fun visitVariable(node: UVariable) {
+                // Kotlin destructuring expression is desugared. E.g.,
+                //
+                //   val (x, y) = pair
+                //
+                // is mapped to
+                //
+                //   val varHash = pair // temp variable
+                //   val x = varHash.component1()
+                //   val y = varHash.component2()
+                //
+                // and thus we don't need to analyze the temporary variable.
+                // Their `sourcePsi`s are different:
+                //   KtDestructuringDeclaration (for overall expression) v.s.
+                //   KtDestructuringDeclarationEntry (for individual local variables)
+                if (node.sourcePsi is KtDestructuringDeclaration) return
+
+                val primitiveCollection =
+                    node.type.primitiveCollectionReplacement(context) ?: return
+                if (node.isLambdaParameter()) {
+                    // Don't notify for lambda parameters. We'll be notifying for the method
+                    // that accepts the lambda, so we already have it flagged there. The
+                    // person using it doesn't really have a choice about the parameters that
+                    // are passed.
+                    return
+                }
+                val parent = node.uastParent
+                val messageContext =
+                    if (parent is UMethod) {
+                        // Data class constructor parameters are caught 4 times:
+                        // 1) constructor method parameter
+                        // 2) the field of the backing 'val'
+                        // 3) the getter for the field
+                        // 4) the generated copy() method.
+                        // We can eliminate the copy() at least, even if we get duplicates for the
+                        // other 3. It would be ideal to eliminate 2 of the other 3, but it isn't
+                        // easy to do and still catch all uses.
+                        if (
+                            context.evaluator.isOverride(parent) ||
+                                (context.evaluator.isData(parent) && parent.name.startsWith("copy"))
+                        ) {
+                            return
+                        }
+                        val methodName =
+                            if (parent.isConstructor) {
+                                "constructor ${parent.getContainingUClass()?.name}"
+                            } else {
+                                "method ${parent.name}"
+                            }
+                        "$methodName has parameter ${node.name} " +
+                            "with type ${node.type.presentableText}: replace with $primitiveCollection"
+                    } else {
+                        val varOrField = if (node is UField) "field" else "variable"
+
+                        "$varOrField ${node.name} with type ${node.type.presentableText}: replace" +
+                            " with $primitiveCollection"
+                    }
+                report(context, node, node.typeReference, messageContext)
+            }
         }
-    }
 
     private fun report(context: JavaContext, node: UElement, target: Any?, message: String) {
-        val location = if (target == null) {
-            context.getLocation(node)
-        } else {
-            context.getLocation(target)
-        }
-        context.report(
-            issue = ISSUE,
-            scope = node,
-            location = location,
-            message = message
-        )
+        val location =
+            if (target == null) {
+                context.getLocation(node)
+            } else {
+                context.getLocation(target)
+            }
+        context.report(issue = ISSUE, scope = node, location = location, message = message)
     }
 
     companion object {
         private const val PrimitiveInCollectionId = "PrimitiveInCollection"
 
-        val ISSUE = Issue.create(
-            id = PrimitiveInCollectionId,
-            briefDescription = "A primitive (Short, Int, Long, Char, Float, Double) or " +
-                "a value class wrapping a primitive was used as in a collection. Primitive " +
-                "versions of collections exist.",
-            explanation = "Using a primitive type in a collection will autobox the primitive " +
-                "value, causing an allocation. To avoid the allocation, use one of the androidx " +
-                "collections designed for use with primitives. For example instead of Set<Int>, " +
-                "use IntSet.",
-            category = Category.PERFORMANCE, priority = 3, severity = Severity.ERROR,
-            implementation = Implementation(
-                PrimitiveInCollectionDetector::class.java,
-                EnumSet.of(Scope.JAVA_FILE)
+        val ISSUE =
+            Issue.create(
+                id = PrimitiveInCollectionId,
+                briefDescription =
+                    "A primitive (Short, Int, Long, Char, Float, Double) or " +
+                        "a value class wrapping a primitive was used as in a collection. Primitive " +
+                        "versions of collections exist.",
+                explanation =
+                    "Using a primitive type in a collection will autobox the primitive " +
+                        "value, causing an allocation. To avoid the allocation, use one of the androidx " +
+                        "collections designed for use with primitives. For example instead of Set<Int>, " +
+                        "use IntSet.",
+                category = Category.PERFORMANCE,
+                priority = 3,
+                severity = Severity.ERROR,
+                implementation =
+                    Implementation(
+                        PrimitiveInCollectionDetector::class.java,
+                        EnumSet.of(Scope.JAVA_FILE)
+                    )
             )
-        )
     }
 }
 
@@ -182,19 +184,20 @@
 
 // Map from the kotlin type to the primitive type used in the collection
 // e.g. Set<Byte> -> IntSet
-private val BoxedTypeToSuggestedPrimitive = mapOf(
-    "java.lang.Byte" to "Int",
-    "java.lang.Character" to "Int",
-    "java.lang.Short" to "Int",
-    "java.lang.Integer" to "Int",
-    "java.lang.Long" to "Long",
-    "java.lang.Float" to "Float",
-    "java.lang.Double" to "Float",
-    "kotlin.UByte" to "Int",
-    "kotlin.UShort" to "Int",
-    "kotlin.UInt" to "Int",
-    "kotlin.ULong" to "Long",
-)
+private val BoxedTypeToSuggestedPrimitive =
+    mapOf(
+        "java.lang.Byte" to "Int",
+        "java.lang.Character" to "Int",
+        "java.lang.Short" to "Int",
+        "java.lang.Integer" to "Int",
+        "java.lang.Long" to "Long",
+        "java.lang.Float" to "Float",
+        "java.lang.Double" to "Float",
+        "kotlin.UByte" to "Int",
+        "kotlin.UShort" to "Int",
+        "kotlin.UInt" to "Int",
+        "kotlin.ULong" to "Long",
+    )
 
 private fun JvmType.primitiveCollectionReplacement(context: JavaContext): String? {
     if (this !is PsiClassReferenceType) return null
@@ -230,32 +233,34 @@
     return null
 }
 
-private fun JvmType.primitiveName(): String? = when (this) {
-    is PsiClassReferenceType -> toPrimitiveName()
-    is PsiWildcardType -> {
-        val bound = if (isBounded) {
-            bound!!
-        } else {
-            superBound
+private fun JvmType.primitiveName(): String? =
+    when (this) {
+        is PsiClassReferenceType -> toPrimitiveName()
+        is PsiWildcardType -> {
+            val bound =
+                if (isBounded) {
+                    bound!!
+                } else {
+                    superBound
+                }
+            when (bound) {
+                is PsiClassReferenceType -> bound.toPrimitiveName()
+                is PsiPrimitiveType -> BoxedTypeToSuggestedPrimitive[bound.boxedTypeName]
+                else -> null
+            }
         }
-        when (bound) {
-            is PsiClassReferenceType -> bound.toPrimitiveName()
-            is PsiPrimitiveType -> BoxedTypeToSuggestedPrimitive[bound.boxedTypeName]
-            else -> null
-        }
+        else -> null
     }
 
-    else -> null
-}
-
 private fun PsiClassReferenceType.toPrimitiveName(): String? {
     val resolvedType = resolve() ?: return null
     if (hasJvmInline(resolvedType)) {
         val constructorParam =
             resolvedType.constructors.firstOrNull { it.parameters.size == 1 }?.parameters?.first()
-                ?: resolvedType.methods.firstOrNull {
-                    it.parameters.size == 1 && it.name == "constructor-impl"
-                }?.parameters?.first()
+                ?: resolvedType.methods
+                    .firstOrNull { it.parameters.size == 1 && it.name == "constructor-impl" }
+                    ?.parameters
+                    ?.first()
         if (constructorParam != null) {
             val type = constructorParam.type
             if (type is PsiPrimitiveType) {
@@ -278,8 +283,7 @@
 private fun UVariable.isLambdaParameter(): Boolean {
     val sourcePsi = sourcePsi
     return ((sourcePsi == null && (javaPsi as? PsiParameter)?.name == "it") ||
-        (sourcePsi as? KtParameter)?.isLambdaParameter == true
-        )
+        (sourcePsi as? KtParameter)?.isLambdaParameter == true)
 }
 
 private fun hasJvmInline(type: PsiClass): Boolean {
diff --git a/compose/lint/internal-lint-checks/src/main/java/androidx/compose/lint/SteppedForLoopDetector.kt b/compose/lint/internal-lint-checks/src/main/java/androidx/compose/lint/SteppedForLoopDetector.kt
index cd820d9..0fbcec0 100644
--- a/compose/lint/internal-lint-checks/src/main/java/androidx/compose/lint/SteppedForLoopDetector.kt
+++ b/compose/lint/internal-lint-checks/src/main/java/androidx/compose/lint/SteppedForLoopDetector.kt
@@ -37,34 +37,33 @@
 import org.jetbrains.uast.skipParenthesizedExprDown
 
 /**
- * Lint [Detector] to prevent allocating ranges and progression when using `step()` in a
- * for loops. For instance: `for (i in a..b step 2)` .
- * See https://youtrack.jetbrains.com/issue/KT-59115
+ * Lint [Detector] to prevent allocating ranges and progression when using `step()` in a for loops.
+ * For instance: `for (i in a..b step 2)` . See https://youtrack.jetbrains.com/issue/KT-59115
  */
 class SteppedForLoopDetector : Detector(), SourceCodeScanner {
-    override fun getApplicableUastTypes() = listOf(
-        UForEachExpression::class.java
-    )
+    override fun getApplicableUastTypes() = listOf(UForEachExpression::class.java)
 
-    override fun createUastHandler(context: JavaContext) = object : UElementHandler() {
-        override fun visitForEachExpression(node: UForEachExpression) {
-            if (!isKotlin(node.lang)) return
+    override fun createUastHandler(context: JavaContext) =
+        object : UElementHandler() {
+            override fun visitForEachExpression(node: UForEachExpression) {
+                if (!isKotlin(node.lang)) return
 
-            when (val type = node.iteratedValue.skipParenthesizedExprDown()) {
-                is UBinaryExpression -> {
-                    // Check the expression is of the form a step b, where a is a Progression type
-                    if (
-                        isIntegerProgression(type.leftOperand.getExpressionType()) &&
-                        isUntilRange(type.leftOperand.skipParenthesizedExprDown()) &&
-                        type.operatorIdentifier?.name == "step" &&
-                        isInteger(type.rightOperand.getExpressionType())
-                    ) {
-                        report(context, node, type, type.rightOperand.textRepresentation())
+                when (val type = node.iteratedValue.skipParenthesizedExprDown()) {
+                    is UBinaryExpression -> {
+                        // Check the expression is of the form a step b, where a is a Progression
+                        // type
+                        if (
+                            isIntegerProgression(type.leftOperand.getExpressionType()) &&
+                                isUntilRange(type.leftOperand.skipParenthesizedExprDown()) &&
+                                type.operatorIdentifier?.name == "step" &&
+                                isInteger(type.rightOperand.getExpressionType())
+                        ) {
+                            report(context, node, type, type.rightOperand.textRepresentation())
+                        }
                     }
                 }
             }
         }
-    }
 
     private fun isIntegerProgression(type: PsiType?): Boolean {
         if (type == null) return false
@@ -72,12 +71,10 @@
         if (type is PsiClassType) {
             val cls = type.resolve()
             return cls != null &&
-                (
-                    IntegerProgressionTypes.contains(cls.qualifiedName) ||
+                (IntegerProgressionTypes.contains(cls.qualifiedName) ||
                     cls.superTypes.any {
                         IntegerProgressionTypes.contains(it.resolve()?.qualifiedName)
-                    }
-                )
+                    })
         }
 
         return false
@@ -105,25 +102,26 @@
     }
 
     companion object {
-        val ISSUE = Issue.create(
-            "SteppedForLoop",
-            "A loop over an 'until' or '..<' primitive range (Int/Long/ULong/Char)" +
-                " creates unnecessary allocations",
-            "Using 'until' or '..<' to create an iteration range bypasses a compiler" +
-                " optimization. Consider until '..' instead. " +
-                "See https://youtrack.jetbrains.com/issue/KT-59115",
-            Category.PERFORMANCE, 5, Severity.ERROR,
-            Implementation(
-                SteppedForLoopDetector::class.java,
-                Scope.JAVA_FILE_SCOPE
+        val ISSUE =
+            Issue.create(
+                "SteppedForLoop",
+                "A loop over an 'until' or '..<' primitive range (Int/Long/ULong/Char)" +
+                    " creates unnecessary allocations",
+                "Using 'until' or '..<' to create an iteration range bypasses a compiler" +
+                    " optimization. Consider until '..' instead. " +
+                    "See https://youtrack.jetbrains.com/issue/KT-59115",
+                Category.PERFORMANCE,
+                5,
+                Severity.ERROR,
+                Implementation(SteppedForLoopDetector::class.java, Scope.JAVA_FILE_SCOPE)
             )
-        )
-        val IntegerProgressionTypes = listOf(
-            "kotlin.ranges.IntProgression",
-            "kotlin.ranges.LongProgression",
-            "kotlin.ranges.CharProgression",
-            "kotlin.ranges.UIntProgression",
-            "kotlin.ranges.ULongProgression"
-        )
+        val IntegerProgressionTypes =
+            listOf(
+                "kotlin.ranges.IntProgression",
+                "kotlin.ranges.LongProgression",
+                "kotlin.ranges.CharProgression",
+                "kotlin.ranges.UIntProgression",
+                "kotlin.ranges.ULongProgression"
+            )
     }
 }
diff --git a/compose/lint/internal-lint-checks/src/main/java/androidx/compose/lint/UnnecessaryLambdaCreationDetector.kt b/compose/lint/internal-lint-checks/src/main/java/androidx/compose/lint/UnnecessaryLambdaCreationDetector.kt
index 41c356b..b883529 100644
--- a/compose/lint/internal-lint-checks/src/main/java/androidx/compose/lint/UnnecessaryLambdaCreationDetector.kt
+++ b/compose/lint/internal-lint-checks/src/main/java/androidx/compose/lint/UnnecessaryLambdaCreationDetector.kt
@@ -72,13 +72,12 @@
     /**
      * This handler visits every lambda expression and reports an issue if the following criteria
      * (in order) hold true:
-     *
      * 1. There is only one expression inside the lambda
      * 2. The lambda literal is created as part of a function call, and not as a property assignment
      *    such as val foo = @Composable {}
      * 3. The expression is an invoke() call
      * 4. The receiver type of the invoke call is a functional type, and it is a subtype of (i.e
-     * compatible to cast to) the lambda parameter functional type
+     *    compatible to cast to) the lambda parameter functional type
      * 5. The lambda parameter and literal have matching composability
      */
     class UnnecessaryLambdaCreationHandler(private val context: JavaContext) : UElementHandler() {
@@ -88,15 +87,16 @@
 
             if (expressions.size != 1) return
 
-            val expression = when (val expr = expressions.first().skipParenthesizedExprDown()) {
-                is UCallExpression -> expr
-                is UReturnExpression -> {
-                    if (expr.sourcePsi == null) { // implicit return
-                        expr.returnExpression?.skipParenthesizedExprDown() as? UCallExpression
-                    } else null
-                }
-                else -> null
-            } ?: return
+            val expression =
+                when (val expr = expressions.first().skipParenthesizedExprDown()) {
+                    is UCallExpression -> expr
+                    is UReturnExpression -> {
+                        if (expr.sourcePsi == null) { // implicit return
+                            expr.returnExpression?.skipParenthesizedExprDown() as? UCallExpression
+                        } else null
+                    }
+                    else -> null
+                } ?: return
 
             // This is the parent function call that contains the lambda expression.
             // I.e in Foo { bar() } this will be the call to `Foo`.
@@ -128,28 +128,38 @@
 
             // Try and get the UElement for the source of the lambda
             val sourcePsi = expression.sourcePsi as? KtCallElement ?: return
-            val resolvedLambdaSource = sourcePsi.calleeExpression?.toUElement()
-                ?.tryResolve()?.toUElement()
-                // Sometimes the above will give us a method (representing the getter for a`
-                // property), when the actual backing element is a property. Going to the source
-                // and back should give us the actual UVariable we are looking for.
-                ?.sourcePsi.toUElement()
+            val resolvedLambdaSource =
+                sourcePsi.calleeExpression
+                    ?.toUElement()
+                    ?.tryResolve()
+                    ?.toUElement()
+                    // Sometimes the above will give us a method (representing the getter for a`
+                    // property), when the actual backing element is a property. Going to the source
+                    // and back should give us the actual UVariable we are looking for.
+                    ?.sourcePsi
+                    .toUElement()
 
-            val isComposable = when (resolvedLambdaSource) {
-                is UVariable -> resolvedLambdaSource.isComposable
-                // If the source is a method, then the lambda is the return type of the method, so
-                // check the return type
-                is UMethod -> resolvedLambdaSource.returnTypeReference?.isComposable == true
-                // Safe return if we failed to resolve. This can happen for implicit `it` parameters
-                // that are lambdas, but this should only happen exceptionally for lambdas with
-                // an `Any` parameter, such as { any: Any -> }.let { it(Any()) }, since this passes
-                // the isSubTypeOf check above. In this case it isn't possible to inline this call,
-                // so no need to handle these implicit parameters.
-                null -> return
-                // Throw since this is an internal check, and we want to fix this for unknown types.
-                // If making this check public, it's safer to return instead without throwing.
-                else -> error(parentExpression.asSourceString())
-            }
+            val isComposable =
+                when (resolvedLambdaSource) {
+                    is UVariable -> resolvedLambdaSource.isComposable
+                    // If the source is a method, then the lambda is the return type of the method,
+                    // so
+                    // check the return type
+                    is UMethod -> resolvedLambdaSource.returnTypeReference?.isComposable == true
+                    // Safe return if we failed to resolve. This can happen for implicit `it`
+                    // parameters
+                    // that are lambdas, but this should only happen exceptionally for lambdas with
+                    // an `Any` parameter, such as { any: Any -> }.let { it(Any()) }, since this
+                    // passes
+                    // the isSubTypeOf check above. In this case it isn't possible to inline this
+                    // call,
+                    // so no need to handle these implicit parameters.
+                    null -> return
+                    // Throw since this is an internal check, and we want to fix this for unknown
+                    // types.
+                    // If making this check public, it's safer to return instead without throwing.
+                    else -> error(parentExpression.asSourceString())
+                }
 
             if (isComposable != expectedComposable) return
 
@@ -169,21 +179,22 @@
                 "this lambda to track invalidations. This adds some extra runtime cost so you" +
                 " should instead just directly pass the lambda as a parameter to the function."
 
-        val ISSUE = Issue.create(
-            "UnnecessaryLambdaCreation",
-            "Creating an unnecessary lambda to emit a captured lambda",
-            Explanation,
-            Category.PERFORMANCE, 5, Severity.ERROR,
-            Implementation(
-                UnnecessaryLambdaCreationDetector::class.java,
-                Scope.JAVA_FILE_SCOPE
+        val ISSUE =
+            Issue.create(
+                "UnnecessaryLambdaCreation",
+                "Creating an unnecessary lambda to emit a captured lambda",
+                Explanation,
+                Category.PERFORMANCE,
+                5,
+                Severity.ERROR,
+                Implementation(UnnecessaryLambdaCreationDetector::class.java, Scope.JAVA_FILE_SCOPE)
             )
-        )
     }
 }
 
 private fun KtAnalysisSession.dispatchReceiverType(callElement: KtCallElement): KtFunctionalType? =
-    callElement.resolveCall()
+    callElement
+        .resolveCall()
         ?.singleFunctionCallOrNull()
         ?.takeIf { it is KtSimpleFunctionCall && it.isImplicitInvoke }
         ?.partiallyAppliedSymbol
diff --git a/compose/lint/internal-lint-checks/src/test/java/androidx/compose/lint/AsCollectionDetectorTest.kt b/compose/lint/internal-lint-checks/src/test/java/androidx/compose/lint/AsCollectionDetectorTest.kt
index 39ce2a1..5ceb29d 100644
--- a/compose/lint/internal-lint-checks/src/test/java/androidx/compose/lint/AsCollectionDetectorTest.kt
+++ b/compose/lint/internal-lint-checks/src/test/java/androidx/compose/lint/AsCollectionDetectorTest.kt
@@ -25,25 +25,23 @@
 
 /* ktlint-disable max-line-length */
 @RunWith(Parameterized::class)
-class AsCollectionDetectorTest(
-    val types: CollectionType
-) : LintDetectorTest() {
+class AsCollectionDetectorTest(val types: CollectionType) : LintDetectorTest() {
 
     override fun getDetector(): Detector = AsCollectionDetector()
 
-    override fun getIssues(): MutableList<Issue> =
-        mutableListOf(AsCollectionDetector.ISSUE)
+    override fun getIssues(): MutableList<Issue> = mutableListOf(AsCollectionDetector.ISSUE)
 
     private val collectionTilde = "~".repeat(types.collection.length)
 
     @Test
     fun immutableAsImmutable() {
-        lint().files(
-            ScatterMapClass,
-            ScatterSetClass,
-            ObjectListClass,
-            kotlin(
-                """
+        lint()
+            .files(
+                ScatterMapClass,
+                ScatterSetClass,
+                ObjectListClass,
+                kotlin(
+                    """
                         package androidx.compose.lint
 
                         import androidx.collection.${types.immutable}
@@ -51,25 +49,28 @@
                         fun foo(collection: ${types.immutable}${types.params}): ${types.collection}${types.params} =
                             collection.as${types.collection}()
                         """
+                )
             )
-        ).run().expect(
-            """
+            .run()
+            .expect(
+                """
 src/androidx/compose/lint/test.kt:7: Error: Use method as${types.collection}() only for public API usage [AsCollectionCall]
                             collection.as${types.collection}()
                             ~~~~~~~~~~~~~$collectionTilde~~
 1 errors, 0 warnings
             """
-        )
+            )
     }
 
     @Test
     fun mutableAsImmutable() {
-        lint().files(
-            ScatterMapClass,
-            ScatterSetClass,
-            ObjectListClass,
-            kotlin(
-                """
+        lint()
+            .files(
+                ScatterMapClass,
+                ScatterSetClass,
+                ObjectListClass,
+                kotlin(
+                    """
                         package androidx.compose.lint
 
                         import androidx.collection.Mutable${types.immutable}
@@ -77,25 +78,28 @@
                         fun foo(collection: Mutable${types.immutable}${types.params}): ${types.collection}${types.params} =
                             collection.as${types.collection}()
                         """
+                )
             )
-        ).run().expect(
-            """
+            .run()
+            .expect(
+                """
 src/androidx/compose/lint/test.kt:7: Error: Use method as${types.collection}() only for public API usage [AsCollectionCall]
                             collection.as${types.collection}()
                             ~~~~~~~~~~~~~$collectionTilde~~
 1 errors, 0 warnings
             """
-        )
+            )
     }
 
     @Test
     fun mutableAsMutable() {
-        lint().files(
-            ScatterMapClass,
-            ScatterSetClass,
-            ObjectListClass,
-            kotlin(
-                """
+        lint()
+            .files(
+                ScatterMapClass,
+                ScatterSetClass,
+                ObjectListClass,
+                kotlin(
+                    """
                         package androidx.compose.lint
 
                         import androidx.collection.Mutable${types.immutable}
@@ -103,22 +107,25 @@
                         fun foo(collection: Mutable${types.immutable}${types.params}): Mutable${types.collection}${types.params} =
                             collection.asMutable${types.collection}()
                         """
+                )
             )
-        ).run().expect(
-            """
+            .run()
+            .expect(
+                """
 src/androidx/compose/lint/test.kt:7: Error: Use method asMutable${types.collection}() only for public API usage [AsCollectionCall]
                             collection.asMutable${types.collection}()
                             ~~~~~~~~~~~~~~~~~~~~$collectionTilde~~
 1 errors, 0 warnings
             """
-        )
+            )
     }
 
     @Test
     fun nonCollectionAs() {
-        lint().files(
-            kotlin(
-                """
+        lint()
+            .files(
+                kotlin(
+                    """
                         package androidx.compose.lint
 
                         fun foo(): ${types.collection}${types.params} =
@@ -130,27 +137,27 @@
                             fun asMap(): Map<String, String>? = null
                         }
                         """
+                )
             )
-        ).run().expectClean()
+            .run()
+            .expectClean()
     }
 
-    class CollectionType(
-        val immutable: String,
-        val collection: String,
-        val params: String
-    )
+    class CollectionType(val immutable: String, val collection: String, val params: String)
 
     companion object {
         @JvmStatic
         @Parameterized.Parameters(name = "{0}")
-        fun initParameters() = listOf(
-            CollectionType("ScatterMap", "Map", "<String, String>"),
-            CollectionType("ScatterSet", "Set", "<String>"),
-            CollectionType("ObjectList", "List", "<String>")
-        )
+        fun initParameters() =
+            listOf(
+                CollectionType("ScatterMap", "Map", "<String, String>"),
+                CollectionType("ScatterSet", "Set", "<String>"),
+                CollectionType("ObjectList", "List", "<String>")
+            )
 
-        val ScatterMapClass = kotlin(
-            """
+        val ScatterMapClass =
+            kotlin(
+                """
             package androidx.collection
             sealed class ScatterMap<K, V> {
                 fun asMap(): Map<K, V> = mapOf()
@@ -159,11 +166,13 @@
             class MutableScatterMap<K, V> : ScatterMap<K, V>() {
                 fun asMutableMap(): MutableMap<K, V> = mutableMapOf()
             }
-            """.trimIndent()
-        )
-
-        val ScatterSetClass = kotlin(
             """
+                    .trimIndent()
+            )
+
+        val ScatterSetClass =
+            kotlin(
+                """
             package androidx.collection
             sealed class ScatterSet<E> {
                 fun asSet(): Set<E> = setOf()
@@ -172,11 +181,13 @@
             class MutableScatterSet<E> : ScatterSet<E>() {
                 fun asMutableSet(): MutableSet<E> = mutableSetOf()
             }
-            """.trimIndent()
-        )
-
-        val ObjectListClass = kotlin(
             """
+                    .trimIndent()
+            )
+
+        val ObjectListClass =
+            kotlin(
+                """
             package androidx.collection
             sealed class ObjectList<E> {
                 fun asList(): List<E> = listOf()
@@ -185,7 +196,8 @@
             class MutableObjectList<E> : ObjectList<E>() {
                 fun asMutableList(): MutableList<E> = mutableListOf()
             }
-            """.trimIndent()
-        )
+            """
+                    .trimIndent()
+            )
     }
 }
diff --git a/compose/lint/internal-lint-checks/src/test/java/androidx/compose/lint/CommonModuleIncompatibilityDetectorTest.kt b/compose/lint/internal-lint-checks/src/test/java/androidx/compose/lint/CommonModuleIncompatibilityDetectorTest.kt
index 41970ad..3e5016f 100644
--- a/compose/lint/internal-lint-checks/src/test/java/androidx/compose/lint/CommonModuleIncompatibilityDetectorTest.kt
+++ b/compose/lint/internal-lint-checks/src/test/java/androidx/compose/lint/CommonModuleIncompatibilityDetectorTest.kt
@@ -30,17 +30,19 @@
 class CommonModuleIncompatibilityDetectorTest : LintDetectorTest() {
     override fun getDetector(): Detector = CommonModuleIncompatibilityDetector()
 
-    override fun getIssues(): MutableList<Issue> = mutableListOf(
-        CommonModuleIncompatibilityDetector.IMPORT_ISSUE,
-        CommonModuleIncompatibilityDetector.REFERENCE_ISSUE,
-        CommonModuleIncompatibilityDetector.EXTENDS_LAMBDA_ISSUE
-    )
+    override fun getIssues(): MutableList<Issue> =
+        mutableListOf(
+            CommonModuleIncompatibilityDetector.IMPORT_ISSUE,
+            CommonModuleIncompatibilityDetector.REFERENCE_ISSUE,
+            CommonModuleIncompatibilityDetector.EXTENDS_LAMBDA_ISSUE
+        )
 
     @Test
     fun detectsImportInCommonMain() {
-        val file = kotlin(
-            "commonMain/test/TestFile.kt",
-            """
+        val file =
+            kotlin(
+                    "commonMain/test/TestFile.kt",
+                    """
                 package test
 
                 import java.util.ArrayList as MyList
@@ -49,11 +51,11 @@
                 import android.os.Bundle
                 import android.*
             """
-        ).within("src")
+                )
+                .within("src")
 
-        lint().files(
-            file
-        )
+        lint()
+            .files(file)
             .run()
             .expect(
                 """
@@ -73,15 +75,17 @@
                 import android.*
                        ~~~~~~~
 5 errors, 0 warnings
-                """.trimIndent()
+                """
+                    .trimIndent()
             )
     }
 
     @Test
     fun detectsJavaClassCallsInCommonMain() {
-        val file = kotlin(
-            "commonMain/test/TestFile.kt",
-            """
+        val file =
+            kotlin(
+                    "commonMain/test/TestFile.kt",
+                    """
                 package test
 
                 fun test(test: String) {
@@ -97,11 +101,11 @@
                   }
                 }
             """
-        ).within("src")
+                )
+                .within("src")
 
-        lint().files(
-            file
-        )
+        lint()
+            .files(file)
             .run()
             .expect(
                 """
@@ -118,15 +122,17 @@
                     if (javaClass != other?.javaClass) return false
                                             ~~~~~~~~~
 4 errors, 0 warnings
-                """.trimIndent()
+                """
+                    .trimIndent()
             )
     }
 
     @Test
     fun detectsLambdaSuperTypeInCommonMain() {
-        val file = kotlin(
-            "commonMain/test/TestFile.kt",
-            """
+        val file =
+            kotlin(
+                    "commonMain/test/TestFile.kt",
+                    """
                 package test
 
                 abstract class Test : () -> Unit
@@ -138,11 +144,11 @@
                     override fun invoke() {}
                 }
             """
-        ).within("src")
+                )
+                .within("src")
 
-        lint().files(
-            file
-        )
+        lint()
+            .files(file)
             .run()
             .expect(
                 """
@@ -156,15 +162,17 @@
                 val a = object : () -> Unit {
                         ^
 3 errors, 0 warnings
-                """.trimIndent()
+                """
+                    .trimIndent()
             )
     }
 
     @Test
     fun ignoresImportInOtherModules() {
-        val jvmFile = kotlin(
-            "jvmMain/test/TestFile.kt",
-            """
+        val jvmFile =
+            kotlin(
+                    "jvmMain/test/TestFile.kt",
+                    """
                 package test
 
                 import java.util.ArrayList as MyList
@@ -173,11 +181,13 @@
                 import android.os.Bundle
                 import android.*
             """
-        ).within("src")
+                )
+                .within("src")
 
-        val androidFile = kotlin(
-            "androidMain/test/TestFile.kt",
-            """
+        val androidFile =
+            kotlin(
+                    "androidMain/test/TestFile.kt",
+                    """
                 package test
 
                 import java.util.*
@@ -185,11 +195,13 @@
                 import android.os.Bundle
                 import android.*
             """
-        ).within("src")
+                )
+                .within("src")
 
-        val file = kotlin(
-            "main/test/TestFile.kt",
-            """
+        val file =
+            kotlin(
+                    "main/test/TestFile.kt",
+                    """
                 package test
 
                 import java.util.*
@@ -197,22 +209,18 @@
                 import android.os.Bundle
                 import android.*
             """
-        ).within("src")
+                )
+                .within("src")
 
-        lint().files(
-            file,
-            androidFile,
-            jvmFile
-        )
-            .run()
-            .expectClean()
+        lint().files(file, androidFile, jvmFile).run().expectClean()
     }
 
     @Test
     fun ignoresJavaClassCallsInOtherSourceSets() {
-        val jvmFile = kotlin(
-            "jvmMain/test/TestFile.kt",
-            """
+        val jvmFile =
+            kotlin(
+                    "jvmMain/test/TestFile.kt",
+                    """
                 package test
 
                 fun test(test: String) {
@@ -228,11 +236,13 @@
                   }
                 }
             """
-        ).within("src")
+                )
+                .within("src")
 
-        val androidFile = kotlin(
-            "androidMain/test/TestFile.kt",
-            """
+        val androidFile =
+            kotlin(
+                    "androidMain/test/TestFile.kt",
+                    """
                 package test
 
                 fun test(test: String) {
@@ -248,11 +258,13 @@
                   }
                 }
             """
-        ).within("src")
+                )
+                .within("src")
 
-        val file = kotlin(
-            "main/test/TestFile.kt",
-            """
+        val file =
+            kotlin(
+                    "main/test/TestFile.kt",
+                    """
                 package test
 
                 fun test(test: String) {
@@ -268,22 +280,18 @@
                   }
                 }
             """
-        ).within("src")
+                )
+                .within("src")
 
-        lint().files(
-            file,
-            androidFile,
-            jvmFile
-        )
-            .run()
-            .expectClean()
+        lint().files(file, androidFile, jvmFile).run().expectClean()
     }
 
     @Test
     fun ignoreLambdaSuperTypeInPlatformSourceSets() {
-        val jvmFile = kotlin(
-            "jvmMain/test/TestFile.kt",
-            """
+        val jvmFile =
+            kotlin(
+                    "jvmMain/test/TestFile.kt",
+                    """
                 package test
 
                 abstract class Test : () -> Unit
@@ -295,11 +303,13 @@
                     override fun invoke() {}
                 }
             """
-        ).within("src")
+                )
+                .within("src")
 
-        val androidFile = kotlin(
-            "androidMain/test/TestFile.kt",
-            """
+        val androidFile =
+            kotlin(
+                    "androidMain/test/TestFile.kt",
+                    """
                 package test
 
                 abstract class Test : () -> Unit
@@ -311,11 +321,13 @@
                     override fun invoke() {}
                 }
             """
-        ).within("src")
+                )
+                .within("src")
 
-        val file = kotlin(
-            "main/test/TestFile.kt",
-            """
+        val file =
+            kotlin(
+                    "main/test/TestFile.kt",
+                    """
                 package test
 
                 abstract class Test : () -> Unit
@@ -327,15 +339,10 @@
                     override fun invoke() {}
                 }
             """
-        ).within("src")
+                )
+                .within("src")
 
-        lint().files(
-            jvmFile,
-            androidFile,
-            file
-        )
-            .run()
-            .expectClean()
+        lint().files(jvmFile, androidFile, file).run().expectClean()
     }
 }
 /* ktlint-enable max-line-length */
diff --git a/compose/lint/internal-lint-checks/src/test/java/androidx/compose/lint/LambdaStructuralEqualityDetectorTest.kt b/compose/lint/internal-lint-checks/src/test/java/androidx/compose/lint/LambdaStructuralEqualityDetectorTest.kt
index 0206fd9..589ca06 100644
--- a/compose/lint/internal-lint-checks/src/test/java/androidx/compose/lint/LambdaStructuralEqualityDetectorTest.kt
+++ b/compose/lint/internal-lint-checks/src/test/java/androidx/compose/lint/LambdaStructuralEqualityDetectorTest.kt
@@ -30,15 +30,15 @@
 class LambdaStructuralEqualityDetectorTest : LintDetectorTest() {
     override fun getDetector(): Detector = LambdaStructuralEqualityDetector()
 
-    override fun getIssues(): MutableList<Issue> = mutableListOf(
-        LambdaStructuralEqualityDetector.ISSUE
-    )
+    override fun getIssues(): MutableList<Issue> =
+        mutableListOf(LambdaStructuralEqualityDetector.ISSUE)
 
     @Test
     fun noErrors() {
-        lint().files(
-            kotlin(
-                """
+        lint()
+            .files(
+                kotlin(
+                    """
                 package test
 
                 val lambda1 = { 1 }
@@ -49,17 +49,18 @@
                     lambda1 !== lambda2
                 }
             """
+                )
             )
-        )
             .run()
             .expectClean()
     }
 
     @Test
     fun errors() {
-        lint().files(
-            kotlin(
-                """
+        lint()
+            .files(
+                kotlin(
+                    """
                 package test
 
                 val lambda1 = { 1 }
@@ -73,8 +74,8 @@
                     lambda3?.equals(lambda2)
                 }
             """
+                )
             )
-        )
             .run()
             .expect(
                 """
diff --git a/compose/lint/internal-lint-checks/src/test/java/androidx/compose/lint/ListIteratorDetectorTest.kt b/compose/lint/internal-lint-checks/src/test/java/androidx/compose/lint/ListIteratorDetectorTest.kt
index c816721..f84371c 100644
--- a/compose/lint/internal-lint-checks/src/test/java/androidx/compose/lint/ListIteratorDetectorTest.kt
+++ b/compose/lint/internal-lint-checks/src/test/java/androidx/compose/lint/ListIteratorDetectorTest.kt
@@ -30,17 +30,16 @@
 class ListIteratorDetectorTest : LintDetectorTest() {
     override fun getDetector(): Detector = ListIteratorDetector()
 
-    override fun getIssues(): MutableList<Issue> = mutableListOf(
-        ListIteratorDetector.ISSUE
-    )
+    override fun getIssues(): MutableList<Issue> = mutableListOf(ListIteratorDetector.ISSUE)
 
     // These come from class files, so there is a notable difference vs defining them in source
     // in terms of our parsing.
     @Test
     fun stdlibIterableExtensions_calledOnList() {
-        lint().files(
-            kotlin(
-                """
+        lint()
+            .files(
+                kotlin(
+                    """
                 package test
 
                 val list = listOf(1, 2, 3)
@@ -52,8 +51,8 @@
                     list.mapIndexed { _,_ -> }
                 }
             """
+                )
             )
-        )
             .run()
             .expect(
                 """
@@ -76,9 +75,10 @@
 
     @Test
     fun userDefinedExtensions_calledOnList() {
-        lint().files(
-            kotlin(
-                """
+        lint()
+            .files(
+                kotlin(
+                    """
                 package test
 
                 val list = listOf(1, 2, 3)
@@ -92,8 +92,8 @@
 
                 fun Iterable<*>.fancyDoSomething(): Boolean = true
             """
+                )
             )
-        )
             .run()
             .expect(
                 """
@@ -112,9 +112,10 @@
     // in terms of our parsing.
     @Test
     fun stdlibIterableExtensions_calledOnNonList() {
-        lint().files(
-            kotlin(
-                """
+        lint()
+            .files(
+                kotlin(
+                    """
                 package test
 
                 val set = setOf(1, 2, 3)
@@ -126,17 +127,18 @@
                     set.mapIndexed { _,_ -> }
                 }
             """
+                )
             )
-        )
             .run()
             .expectClean()
     }
 
     @Test
     fun userDefinedExtensions_calledOnNonList() {
-        lint().files(
-            kotlin(
-                """
+        lint()
+            .files(
+                kotlin(
+                    """
                 package test
 
                 val set = setOf(1, 2, 3)
@@ -150,17 +152,18 @@
 
                 fun Iterable<*>.fancyDoSomething(): Boolean = true
             """
+                )
             )
-        )
             .run()
             .expectClean()
     }
 
     @Test
     fun inOperatorCalledOnList() {
-        lint().files(
-            kotlin(
-                """
+        lint()
+            .files(
+                kotlin(
+                    """
                 package test
 
                 val list = listOf(1, 2, 3)
@@ -169,8 +172,8 @@
                     for (e in list) { }
                 }
             """
+                )
             )
-        )
             .run()
             .expect(
                 """
@@ -184,9 +187,10 @@
 
     @Test
     fun inOperatorCalledOnNonList() {
-        lint().files(
-            kotlin(
-                """
+        lint()
+            .files(
+                kotlin(
+                    """
                 val list = listOf(1, 2, 3)
                 val set = setOf(1, 2, 3)
 
@@ -195,8 +199,8 @@
                     for (e in set) { }
                 }
             """
+                )
             )
-        )
             .run()
             .expectClean()
     }
diff --git a/compose/lint/internal-lint-checks/src/test/java/androidx/compose/lint/PrimitiveInCollectionDetectorTest.kt b/compose/lint/internal-lint-checks/src/test/java/androidx/compose/lint/PrimitiveInCollectionDetectorTest.kt
index b14f040..797c33d 100644
--- a/compose/lint/internal-lint-checks/src/test/java/androidx/compose/lint/PrimitiveInCollectionDetectorTest.kt
+++ b/compose/lint/internal-lint-checks/src/test/java/androidx/compose/lint/PrimitiveInCollectionDetectorTest.kt
@@ -26,9 +26,7 @@
 
 /* ktlint-disable max-line-length */
 @RunWith(Parameterized::class)
-class PrimitiveInCollectionDetectorTest(
-    parameters: Parameters
-) : LintDetectorTest() {
+class PrimitiveInCollectionDetectorTest(parameters: Parameters) : LintDetectorTest() {
 
     private val type = parameters.type
     private val value = parameters.value
@@ -45,149 +43,168 @@
 
     @Test
     fun functionWithSetReturnType() {
-        lint().files(
-            ContainsIntClass,
-            SimpleValueClass.bytecode,
-            kotlin(
-                """
+        lint()
+            .files(
+                ContainsIntClass,
+                SimpleValueClass.bytecode,
+                kotlin(
+                    """
                         package androidx.compose.lint
 
                         fun foo(): Set<$type>? = null
                         fun bar(): Set<String>? = null // no warning for this
                         """
+                )
             )
-        ).run().expect(
-            """
+            .run()
+            .expect(
+                """
 src/androidx/compose/lint/test.kt:4: Error: return type Set<$longType> of foo: replace with ${collectionType}Set [PrimitiveInCollection]
                         fun foo(): Set<$type>? = null
                                    ~~~~$tild~~
 1 errors, 0 warnings
             """
-        )
+            )
     }
 
     @Test
     fun functionWithSetClassReturnType() {
-        lint().files(
-            ContainsIntClass,
-            SimpleValueClass.bytecode,
-            kotlin(
-                """
+        lint()
+            .files(
+                ContainsIntClass,
+                SimpleValueClass.bytecode,
+                kotlin(
+                    """
                         package androidx.compose.lint
 
                         fun foo(): HashSet<$type>? = null
                         fun bar(): HashSet<String>? = null // no warning for this
                         """
+                )
             )
-        ).run().expect(
-            """
+            .run()
+            .expect(
+                """
 src/androidx/compose/lint/test.kt:4: Error: return type HashSet<$longType> of foo: replace with ${collectionType}Set [PrimitiveInCollection]
                         fun foo(): HashSet<$type>? = null
                                    ~~~~~~~~$tild~~
 1 errors, 0 warnings
             """
-        )
+            )
     }
 
     @Test
     fun functionWithListReturnType() {
-        lint().files(
-            ContainsIntClass,
-            SimpleValueClass.bytecode,
-            kotlin(
-                """
+        lint()
+            .files(
+                ContainsIntClass,
+                SimpleValueClass.bytecode,
+                kotlin(
+                    """
                         package androidx.compose.lint
 
                         fun foo(): List<$type>? = null
                         fun bar(): List<String>? = null // no warning for this
                         """
+                )
             )
-        ).run().expect(
-            """
+            .run()
+            .expect(
+                """
 src/androidx/compose/lint/test.kt:4: Error: return type List<$longType> of foo: replace with ${collectionType}List [PrimitiveInCollection]
                         fun foo(): List<$type>? = null
                                    ~~~~$tild~~~
 1 errors, 0 warnings
             """
-        )
+            )
     }
 
     @Test
     fun functionWithListClassReturnType() {
-        lint().files(
-            ContainsIntClass,
-            SimpleValueClass.bytecode,
-            kotlin(
-                """
+        lint()
+            .files(
+                ContainsIntClass,
+                SimpleValueClass.bytecode,
+                kotlin(
+                    """
                         package androidx.compose.lint
 
                         fun foo(): ArrayList<$type>? = null
                         fun bar(): ArrayList<String>? = null // no warning for this
                         """
+                )
             )
-        ).run().expect(
-            """
+            .run()
+            .expect(
+                """
 src/androidx/compose/lint/test.kt:4: Error: return type ArrayList<$longType> of foo: replace with ${collectionType}List [PrimitiveInCollection]
                         fun foo(): ArrayList<$type>? = null
                                    ~~~~~~~~~~$tild~~
 1 errors, 0 warnings
             """
-        )
+            )
     }
 
     @Test
     fun functionWithMapReturnType() {
-        lint().files(
-            ContainsIntClass,
-            SimpleValueClass.bytecode,
-            kotlin(
-                """
+        lint()
+            .files(
+                ContainsIntClass,
+                SimpleValueClass.bytecode,
+                kotlin(
+                    """
                         package androidx.compose.lint
 
                         fun foo(): Map<$type, Any>? = null
                         fun bar(): Map<String, Any>? = null // no warning for this
                         """
+                )
             )
-        ).run().expect(
-            """
+            .run()
+            .expect(
+                """
 src/androidx/compose/lint/test.kt:4: Error: return type Map<$longType, Object> of foo: replace with ${collectionType}ObjectMap [PrimitiveInCollection]
                         fun foo(): Map<$type, Any>? = null
                                    ~~~~$tild~~~~~~~
 1 errors, 0 warnings
             """
-        )
+            )
     }
 
     @Test
     fun functionWithMapClassReturnType() {
-        lint().files(
-            ContainsIntClass,
-            SimpleValueClass.bytecode,
-            kotlin(
-                """
+        lint()
+            .files(
+                ContainsIntClass,
+                SimpleValueClass.bytecode,
+                kotlin(
+                    """
                         package androidx.compose.lint
 
                         fun foo(): HashMap<$type, Any>? = null
                         fun bar(): HashMap<String, Any>? = null // no warning for this
                         """
+                )
             )
-        ).run().expect(
-            """
+            .run()
+            .expect(
+                """
 src/androidx/compose/lint/test.kt:4: Error: return type HashMap<$longType, Object> of foo: replace with ${collectionType}ObjectMap [PrimitiveInCollection]
                         fun foo(): HashMap<$type, Any>? = null
                                    ~~~~~~~~$tild~~~~~~~
 1 errors, 0 warnings
             """
-        )
+            )
     }
 
     @Test
     fun variableSet() {
-        lint().files(
-            ContainsIntClass,
-            SimpleValueClass.bytecode,
-            kotlin(
-                """
+        lint()
+            .files(
+                ContainsIntClass,
+                SimpleValueClass.bytecode,
+                kotlin(
+                    """
                         package androidx.compose.lint
 
                         fun foo() {
@@ -200,24 +217,27 @@
                             println(s)
                         }
                         """
+                )
             )
-        ).run().expect(
-            """
+            .run()
+            .expect(
+                """
 src/androidx/compose/lint/test.kt:5: Error: variable s with type Set<$longType>: replace with ${collectionType}Set [PrimitiveInCollection]
                             val s = mutableSetOf($value)
                             ~~~~~~~~~~~~~~~~~~~~~$vtild~
 1 errors, 0 warnings
             """
-        )
+            )
     }
 
     @Test
     fun variableHashSet() {
-        lint().files(
-            ContainsIntClass,
-            SimpleValueClass.bytecode,
-            kotlin(
-                """
+        lint()
+            .files(
+                ContainsIntClass,
+                SimpleValueClass.bytecode,
+                kotlin(
+                    """
                         package androidx.compose.lint
 
                         fun foo() {
@@ -230,24 +250,27 @@
                             println(s)
                         }
                         """
+                )
             )
-        ).run().expect(
-            """
+            .run()
+            .expect(
+                """
 src/androidx/compose/lint/test.kt:5: Error: variable s with type HashSet<$longType>: replace with ${collectionType}Set [PrimitiveInCollection]
                             val s = HashSet<$type>()
                             ~~~~~~~~~~~~~~~~$tild~~~
 1 errors, 0 warnings
             """
-        )
+            )
     }
 
     @Test
     fun variableList() {
-        lint().files(
-            ContainsIntClass,
-            SimpleValueClass.bytecode,
-            kotlin(
-                """
+        lint()
+            .files(
+                ContainsIntClass,
+                SimpleValueClass.bytecode,
+                kotlin(
+                    """
                         package androidx.compose.lint
 
                         fun foo() {
@@ -260,24 +283,27 @@
                             println(s)
                         }
                         """
+                )
             )
-        ).run().expect(
-            """
+            .run()
+            .expect(
+                """
 src/androidx/compose/lint/test.kt:5: Error: variable s with type List<$longType>: replace with ${collectionType}List [PrimitiveInCollection]
                             val s = mutableListOf($value)
                             ~~~~~~~~~~~~~~~~~~~~~~$vtild~
 1 errors, 0 warnings
             """
-        )
+            )
     }
 
     @Test
     fun variableArrayList() {
-        lint().files(
-            ContainsIntClass,
-            SimpleValueClass.bytecode,
-            kotlin(
-                """
+        lint()
+            .files(
+                ContainsIntClass,
+                SimpleValueClass.bytecode,
+                kotlin(
+                    """
                         package androidx.compose.lint
 
                         fun foo() {
@@ -290,24 +316,27 @@
                             println(s)
                         }
                         """
+                )
             )
-        ).run().expect(
-            """
+            .run()
+            .expect(
+                """
 src/androidx/compose/lint/test.kt:5: Error: variable s with type ArrayList<$longType>: replace with ${collectionType}List [PrimitiveInCollection]
                             val s = ArrayList<$type>()
                             ~~~~~~~~~~~~~~~~~~$tild~~~
 1 errors, 0 warnings
             """
-        )
+            )
     }
 
     @Test
     fun variableHashMap() {
-        lint().files(
-            ContainsIntClass,
-            SimpleValueClass.bytecode,
-            kotlin(
-                """
+        lint()
+            .files(
+                ContainsIntClass,
+                SimpleValueClass.bytecode,
+                kotlin(
+                    """
                         package androidx.compose.lint
 
                         fun foo() {
@@ -320,24 +349,27 @@
                             println(s)
                         }
                         """
+                )
             )
-        ).run().expect(
-            """
+            .run()
+            .expect(
+                """
 src/androidx/compose/lint/test.kt:5: Error: variable s with type Map<String, $longType>: replace with Object${collectionType}Map [PrimitiveInCollection]
                             val s = mutableMapOf("Hello" to $value)
                             ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~$vtild~
 1 errors, 0 warnings
             """
-        )
+            )
     }
 
     @Test
     fun variableMap() {
-        lint().files(
-            ContainsIntClass,
-            SimpleValueClass.bytecode,
-            kotlin(
-                """
+        lint()
+            .files(
+                ContainsIntClass,
+                SimpleValueClass.bytecode,
+                kotlin(
+                    """
                         package androidx.compose.lint
 
                         fun foo() {
@@ -350,24 +382,27 @@
                             println(s)
                         }
                         """
+                )
             )
-        ).run().expect(
-            """
+            .run()
+            .expect(
+                """
 src/androidx/compose/lint/test.kt:5: Error: variable s with type HashMap<$longType, String>: replace with ${collectionType}ObjectMap [PrimitiveInCollection]
                             val s = HashMap<$type, String>()
                             ~~~~~~~~~~~~~~~~$tild~~~~~~~~~~~
 1 errors, 0 warnings
             """
-        )
+            )
     }
 
     @Test
     fun variablePrimitivePrimitiveMap() {
-        lint().files(
-            ContainsIntClass,
-            SimpleValueClass.bytecode,
-            kotlin(
-                """
+        lint()
+            .files(
+                ContainsIntClass,
+                SimpleValueClass.bytecode,
+                kotlin(
+                    """
                         package androidx.compose.lint
 
                         fun foo() {
@@ -375,31 +410,36 @@
                             println(s)
                         }
                         """
+                )
             )
-        ).run().expect(
-            """
+            .run()
+            .expect(
+                """
 src/androidx/compose/lint/test.kt:5: Error: variable s with type HashMap<$longType, $longType>: replace with ${collectionType}${collectionType}Map [PrimitiveInCollection]
                             val s = HashMap<$type, $type>()
                             ~~~~~~~~~~~~~~~~$tild~~$tild~~~
 1 errors, 0 warnings
             """
-        )
+            )
     }
 
     @Test
     fun dataClassConstructor() {
-        lint().files(
-            ContainsIntClass,
-            SimpleValueClass.bytecode,
-            kotlin(
-                """
+        lint()
+            .files(
+                ContainsIntClass,
+                SimpleValueClass.bytecode,
+                kotlin(
+                    """
                         package androidx.compose.lint
 
                         data class Foo(val foo: Set<$type>)
                         """
+                )
             )
-        ).run().expect(
-            """
+            .run()
+            .expect(
+                """
 src/androidx/compose/lint/Foo.kt:4: Error: constructor Foo has parameter foo with type Set<$longType>: replace with ${collectionType}Set [PrimitiveInCollection]
                         data class Foo(val foo: Set<$type>)
                                                 ~~~~$tild~
@@ -411,15 +451,16 @@
                                                 ~~~~$tild~
 3 errors, 0 warnings
             """
-        )
+            )
     }
 
     @Test
     fun hiddenVariableInDeconstruction() {
         // Regression test from b/328122546
-        lint().files(
-            kotlin(
-                """
+        lint()
+            .files(
+                kotlin(
+                    """
                         package androidx.compose.lint
 
                         fun foo(value: Any) {
@@ -430,8 +471,10 @@
                             println(third)
                         }
                 """
+                )
             )
-        ).run().expectClean()
+            .run()
+            .expectClean()
     }
 
     data class Parameters(
@@ -444,46 +487,57 @@
     companion object {
         @JvmStatic
         @Parameterized.Parameters(name = "{0}")
-        fun initParameters() = listOf(
-            Parameters("Char", "'a'", "Character", "Int"),
-            Parameters("Byte", "0.toByte()", "Byte", "Int"),
-            Parameters("UByte", "0u.toUByte()", "UByte", "Int"),
-            Parameters("Short", "0.toShort()", "Short", "Int"),
-            Parameters("UShort", "0u.toUShort()", "UShort", "Int"),
-            Parameters("Int", "1", "Integer", "Int"),
-            Parameters("UInt", "1u", "UInt", "Int"),
-            Parameters("Long", "1L", "Long", "Long"),
-            Parameters("ULong", "1uL", "ULong", "Long"),
-            Parameters("Float", "1f", "Float", "Float"),
-            Parameters("Double", "1.0", "Double", "Float"),
-            Parameters("ContainsInt", "ContainsInt(0)", "ContainsInt", "Int"),
-            Parameters("test.SimpleValueClass", "test.SimpleValueClass(0)", "SimpleValueClass", "Int")
-        )
+        fun initParameters() =
+            listOf(
+                Parameters("Char", "'a'", "Character", "Int"),
+                Parameters("Byte", "0.toByte()", "Byte", "Int"),
+                Parameters("UByte", "0u.toUByte()", "UByte", "Int"),
+                Parameters("Short", "0.toShort()", "Short", "Int"),
+                Parameters("UShort", "0u.toUShort()", "UShort", "Int"),
+                Parameters("Int", "1", "Integer", "Int"),
+                Parameters("UInt", "1u", "UInt", "Int"),
+                Parameters("Long", "1L", "Long", "Long"),
+                Parameters("ULong", "1uL", "ULong", "Long"),
+                Parameters("Float", "1f", "Float", "Float"),
+                Parameters("Double", "1.0", "Double", "Float"),
+                Parameters("ContainsInt", "ContainsInt(0)", "ContainsInt", "Int"),
+                Parameters(
+                    "test.SimpleValueClass",
+                    "test.SimpleValueClass(0)",
+                    "SimpleValueClass",
+                    "Int"
+                )
+            )
 
-        val ContainsIntClass = kotlin(
-            """
+        val ContainsIntClass =
+            kotlin(
+                """
             package androidx.compose.lint
 
             @JvmInline value class ContainsInt(val value: Int)
-            """.trimIndent()
-        )
+            """
+                    .trimIndent()
+            )
 
-        val SimpleValueClass = kotlinAndBytecodeStub(
-            filename = "SimpleValueClass.kt",
-            filepath = "test",
-            checksum = 0x8b98db3a,
-            source = """
+        val SimpleValueClass =
+            kotlinAndBytecodeStub(
+                filename = "SimpleValueClass.kt",
+                filepath = "test",
+                checksum = 0x8b98db3a,
+                source =
+                    """
                 package test
 
                 @JvmInline
                 value class SimpleValueClass(val value: Int)
-            """.trimIndent(),
-        """
+            """
+                        .trimIndent(),
+                """
             META-INF/main.kotlin_module:
             H4sIAAAAAAAA/2NgYGBmYGBgBGJOBijgkucSTcxLKcrPTKnQS87PLcgvTtXL
             ycwrEWILSS0u8S5RYtBiAAC6aGYHOQAAAA==
             """,
-            """
+                """
             test/SimpleValueClass.class:
             H4sIAAAAAAAA/31U31MbVRT+7s0m2Ww2sAktkAW1P7RN+NGkWGuVghS0djEU
             hRql+LKEHVhINpjdZPrIm/4FPviiow++8KAzCoydcRDf/Jscx3M3m4RZMs5k
@@ -511,6 +565,6 @@
             DHxkoGRgBU9pi1UDH+OTTTAXa1jfxJAL1cUzF3H/O+8i7yLqIubigW+5T+/K
             xYyLKRc5F9d9Y8rFwH8DJohDBwgAAA==
             """
-        )
+            )
     }
 }
diff --git a/compose/lint/internal-lint-checks/src/test/java/androidx/compose/lint/SteppedForLoopDetectorTest.kt b/compose/lint/internal-lint-checks/src/test/java/androidx/compose/lint/SteppedForLoopDetectorTest.kt
index 15559c9..54695ae 100644
--- a/compose/lint/internal-lint-checks/src/test/java/androidx/compose/lint/SteppedForLoopDetectorTest.kt
+++ b/compose/lint/internal-lint-checks/src/test/java/androidx/compose/lint/SteppedForLoopDetectorTest.kt
@@ -31,15 +31,14 @@
 class SteppedForLoopDetectorTest : LintDetectorTest() {
     override fun getDetector(): Detector = SteppedForLoopDetector()
 
-    override fun getIssues(): MutableList<Issue> = mutableListOf(
-        SteppedForLoopDetector.ISSUE
-    )
+    override fun getIssues(): MutableList<Issue> = mutableListOf(SteppedForLoopDetector.ISSUE)
 
     @Test
     fun skippedOnRegularLoops() {
-        lint().files(
-            kotlin(
-                """
+        lint()
+            .files(
+                kotlin(
+                    """
                 package test
 
                 fun test(a: Int, b: Int) {
@@ -54,17 +53,18 @@
                     }
                 }
             """
+                )
             )
-        )
             .run()
             .expectClean()
     }
 
     @Test
     fun skippedOnInclusiveSteppedLoops() {
-        lint().files(
-            kotlin(
-                """
+        lint()
+            .files(
+                kotlin(
+                    """
                 package test
 
                 fun test(a: Int, b: Int) {
@@ -76,8 +76,8 @@
                     }
                 }
             """
+                )
             )
-        )
             .run()
             .expectClean()
     }
@@ -85,9 +85,10 @@
     @Ignore("b/289814619")
     @Test
     fun calledOnSteppedLoop() {
-        lint().files(
-            kotlin(
-                """
+        lint()
+            .files(
+                kotlin(
+                    """
                 package test
 
                 fun test(a: Int, b: Int) {
@@ -99,8 +100,8 @@
                     }
                 }
             """
+                )
             )
-        )
             .run()
             .expect(
                 """
@@ -118,9 +119,10 @@
     @Ignore("b/289814619")
     @Test
     fun calledOnConstantSteppedLoop() {
-        lint().files(
-            kotlin(
-                """
+        lint()
+            .files(
+                kotlin(
+                    """
                 package test
 
                 fun test() {
@@ -132,8 +134,8 @@
                     }
                 }
             """
+                )
             )
-        )
             .run()
             .expect(
                 """
@@ -151,9 +153,10 @@
     @Ignore("b/289814619")
     @Test
     fun calledOnUnitSteppedLoop() {
-        lint().files(
-            kotlin(
-                """
+        lint()
+            .files(
+                kotlin(
+                    """
                 package test
 
                 fun test(a: Int, b: Int) {
@@ -165,8 +168,8 @@
                     }
                 }
             """
+                )
             )
-        )
             .run()
             .expect(
                 """
@@ -184,9 +187,10 @@
     @Ignore("b/289814619")
     @Test
     fun calledOnExpressionSteppedLoop() {
-        lint().files(
-            kotlin(
-                """
+        lint()
+            .files(
+                kotlin(
+                    """
                 package test
 
                 fun test(a: Int, b: Int, c: Int) {
@@ -198,8 +202,8 @@
                     }
                 }
             """
+                )
             )
-        )
             .run()
             .expect(
                 """
@@ -216,9 +220,10 @@
 
     @Test
     fun calledOnNonIntSteppedLoop() {
-        lint().files(
-            kotlin(
-                """
+        lint()
+            .files(
+                kotlin(
+                    """
                 package test
 
                 fun test(a: UInt, b: UInt) {
@@ -242,8 +247,8 @@
                     }
                 }
             """
+                )
             )
-        )
             .run()
             .expect(
                 """
diff --git a/compose/lint/internal-lint-checks/src/test/java/androidx/compose/lint/UnnecessaryLambdaCreationDetectorTest.kt b/compose/lint/internal-lint-checks/src/test/java/androidx/compose/lint/UnnecessaryLambdaCreationDetectorTest.kt
index 1c026c7..522cfe8 100644
--- a/compose/lint/internal-lint-checks/src/test/java/androidx/compose/lint/UnnecessaryLambdaCreationDetectorTest.kt
+++ b/compose/lint/internal-lint-checks/src/test/java/androidx/compose/lint/UnnecessaryLambdaCreationDetectorTest.kt
@@ -34,16 +34,17 @@
 /* ktlint-disable max-line-length */
 @RunWith(Parameterized::class)
 class UnnecessaryLambdaCreationDetectorTest(
-    @Suppress("unused")
-    private val parameterizedDebugString: String,
+    @Suppress("unused") private val parameterizedDebugString: String,
     private val stub: TestFile
 ) : LintDetectorTest() {
     companion object {
-        private val stub = kotlinAndBytecodeStub(
-            filename = "Stub.kt",
-            filepath = "test",
-            checksum = 0x8a5a4526,
-            source = """
+        private val stub =
+            kotlinAndBytecodeStub(
+                filename = "Stub.kt",
+                filepath = "test",
+                checksum = 0x8a5a4526,
+                source =
+                    """
                 package test
 
                 import androidx.compose.runtime.Composable
@@ -65,12 +66,12 @@
                     content()
                 }
             """,
-            """
+                """
             META-INF/main.kotlin_module:
             H4sIAAAAAAAA/2NgYGBmYGBgBGJOBijgEuNiKUktLhFiCy4pTfIG0iFAnneJ
             EoMWAwBxHEvpMAAAAA==
             """,
-            """
+                """
             test/StubKt.class:
             H4sIAAAAAAAA/51UXU8TQRQ9s4XuUoosFZQWxa8iBT+21G8hJoaEsLGiAcQH
             nqbbBYe2s2Z32vhIfPE3+GTiP/BNfTAE3/xRxjtbiiBV1CZ7Z+bec+bcO3em
@@ -91,14 +92,12 @@
             SNbAndgWcZfGBfJeoCZcXEfCxSUXeRcTuOxiEgUXU5heB4twBVfX0RfBjHAt
             QjrC9QipCGMRxiM4EXp/AGJveMs/BgAA
             """
-        )
+            )
 
         @JvmStatic
         @Parameterized.Parameters(name = "{0}")
-        fun params(): Array<Any> = arrayOf(
-            arrayOf("Source stubs", stub.kotlin),
-            arrayOf("Compiled stubs", stub.bytecode)
-        )
+        fun params(): Array<Any> =
+            arrayOf(arrayOf("Source stubs", stub.kotlin), arrayOf("Compiled stubs", stub.bytecode))
     }
 
     override fun getDetector(): Detector = UnnecessaryLambdaCreationDetector()
@@ -116,7 +115,7 @@
     @Test
     fun warnsForSingleExpressions() {
         check(
-            """
+                """
             package test
 
             import androidx.compose.runtime.Composable
@@ -157,8 +156,9 @@
                 }
             }
         """
-        ).expect(
-            """
+            )
+            .expect(
+                """
 src/test/test.kt:13: Error: Creating an unnecessary lambda to emit a captured lambda [UnnecessaryLambdaCreation]
         lambda()
         ~~~~~~
@@ -173,13 +173,13 @@
         ~~~~~~~~~~~~~~~~~
 4 errors, 0 warnings
         """
-        )
+            )
     }
 
     @Test
     fun warnsForMultipleLambdas() {
         check(
-            """
+                """
             package test
 
             import androidx.compose.runtime.Composable
@@ -199,8 +199,9 @@
                 }
             }
         """
-        ).expect(
-            """
+            )
+            .expect(
+                """
 src/test/test.kt:15: Error: Creating an unnecessary lambda to emit a captured lambda [UnnecessaryLambdaCreation]
     MultipleChildComposableFunction( { lambda() }) {
                                        ~~~~~~
@@ -209,13 +210,13 @@
         ~~~~~~
 2 errors, 0 warnings
         """
-        )
+            )
     }
 
     @Test
     fun ignoresMultipleExpressions() {
         check(
-            """
+                """
             package test
 
             import androidx.compose.runtime.Composable
@@ -230,13 +231,14 @@
                 }
             }
         """
-        ).expectClean()
+            )
+            .expectClean()
     }
 
     @Test
     fun ignoresPropertyAssignment() {
         check(
-            """
+                """
             package test
 
             import androidx.compose.runtime.Composable
@@ -247,13 +249,14 @@
                 lambda()
             }
         """
-        ).expectClean()
+            )
+            .expectClean()
     }
 
     @Test
     fun ignoresDifferentFunctionalTypes_parameters() {
         check(
-            """
+                """
             package test
 
             import androidx.compose.runtime.Composable
@@ -289,13 +292,14 @@
                 }
             }
         """
-        ).expectClean()
+            )
+            .expectClean()
     }
 
     @Test
     fun ignoresDifferentFunctionalTypes_receiverScopes() {
         check(
-            """
+                """
             package test
 
             import androidx.compose.runtime.Composable
@@ -327,20 +331,21 @@
                 }
             }
         """
-        ).expect(
-            """
+            )
+            .expect(
+                """
 src/test/SomeScope.kt:24: Error: Creating an unnecessary lambda to emit a captured lambda [UnnecessaryLambdaCreation]
         scopedLambda()
         ~~~~~~~~~~~~
 1 errors, 0 warnings
         """
-        )
+            )
     }
 
     @Test
     fun ignoresMismatchedComposability() {
         check(
-            """
+                """
             package test
 
             import androidx.compose.runtime.Composable
@@ -361,13 +366,14 @@
                 }
             }
         """
-        ).expectClean()
+            )
+            .expectClean()
     }
 
     @Test
     fun warnsForFunctionsReturningALambda() {
         check(
-            """
+                """
             package test
 
             import androidx.compose.runtime.Composable
@@ -402,8 +408,9 @@
                 }
             }
         """
-        ).expect(
-            """
+            )
+            .expect(
+                """
 src/test/test.kt:23: Error: Creating an unnecessary lambda to emit a captured lambda [UnnecessaryLambdaCreation]
         returnsComposableLambda()()
                                  ~
@@ -415,7 +422,7 @@
                                  ~
 3 errors, 0 warnings
         """
-        )
+            )
     }
 }
 /* ktlint-enable max-line-length */
diff --git a/compose/material/material-lint/src/main/java/androidx/compose/material/lint/ColorsDetector.kt b/compose/material/material-lint/src/main/java/androidx/compose/material/lint/ColorsDetector.kt
index cedd663..e1f4762 100644
--- a/compose/material/material-lint/src/main/java/androidx/compose/material/lint/ColorsDetector.kt
+++ b/compose/material/material-lint/src/main/java/androidx/compose/material/lint/ColorsDetector.kt
@@ -46,105 +46,113 @@
  * [Detector] that checks `Colors` definitions for correctness.
  *
  * Background colors that share the same color (such as `surface` and `background`) should also
- * share the same 'on' color (`onSurface` and `onBackground`) - otherwise we can't know which
- * color to use for a given background color by value.
+ * share the same 'on' color (`onSurface` and `onBackground`) - otherwise we can't know which color
+ * to use for a given background color by value.
  */
 class ColorsDetector : Detector(), SourceCodeScanner {
     override fun getApplicableUastTypes() = listOf(UCallExpression::class.java)
 
-    override fun createUastHandler(context: JavaContext) = object : UElementHandler() {
-        override fun visitCallExpression(node: UCallExpression) {
-            val method = node.resolve() ?: return
-            if (!method.isInPackageName(Material.PackageName)) return
+    override fun createUastHandler(context: JavaContext) =
+        object : UElementHandler() {
+            override fun visitCallExpression(node: UCallExpression) {
+                val method = node.resolve() ?: return
+                if (!method.isInPackageName(Material.PackageName)) return
 
-            if (node.isConstructorCall()) {
-                if (method.containingClass?.name != Colors.shortName) return
-            } else {
-                if (
-                    node.methodName != null &&
-                    node.methodName != LightColors.shortName &&
-                    node.methodName != DarkColors.shortName
-                ) return
-            }
-
-            val parameters = method.parameterList.parameters.mapIndexed { index, parameter ->
-                val argumentForParameter = node.getArgumentForParameter(index)
-                ParameterWithArgument(
-                    parameter,
-                    argumentForParameter
-                )
-            }
-
-            // Filter to only background colors, and group by their value
-            val backgroundColorGroups = parameters.filter {
-                it.parameter.name in OnColorMap.keys
-            }.filter {
-                // Filter out any parameters that have unknown defaults / arguments, we can't do
-                // anything here about them
-                it.sourceText != null
-            }.groupBy {
-                it.sourceText
-            }.values
-
-            // For each grouped pair of colors, make sure that all corresponding 'on' colors have
-            // the same color
-            backgroundColorGroups.forEach { colors ->
-                // Find all corresponding onColors for these colors and group them by value
-                val onColorGroups = colors.map { parameter ->
-                    val background = parameter.parameter.name
-                    val onColor = OnColorMap[background]
-                    parameters.first {
-                        it.parameter.name == onColor
-                    }
+                if (node.isConstructorCall()) {
+                    if (method.containingClass?.name != Colors.shortName) return
+                } else {
+                    if (
+                        node.methodName != null &&
+                            node.methodName != LightColors.shortName &&
+                            node.methodName != DarkColors.shortName
+                    )
+                        return
                 }
-                    // If multiple background colors have the same color (such as `primary` /
-                    // `primaryVariant`) then filter the duplicates out so we don't report the same
-                    // 'on' color multiple times.
-                    .distinctBy { it.parameter.name }
-                    .groupBy {
-                        it.sourceText
+
+                val parameters =
+                    method.parameterList.parameters.mapIndexed { index, parameter ->
+                        val argumentForParameter = node.getArgumentForParameter(index)
+                        ParameterWithArgument(parameter, argumentForParameter)
                     }
 
-                // Report if there are multiple groups (i.e different values between 'on' colors)
-                if (onColorGroups.size > 1) {
-                    onColorGroups.values.forEach { group ->
-                        group.forEach { parameter ->
-                            val argument = parameter.argument
-                            // If the conflicting color comes from the default value of a function,
-                            // there is nothing to report - just report the clashing colors that
-                            // the user explicitly provides.
-                            if (argument != null) {
-                                context.report(
-                                    ConflictingOnColor,
-                                    argument,
-                                    context.getNameLocation(argument),
-                                    "Conflicting 'on' color for a given background"
-                                )
+                // Filter to only background colors, and group by their value
+                val backgroundColorGroups =
+                    parameters
+                        .filter { it.parameter.name in OnColorMap.keys }
+                        .filter {
+                            // Filter out any parameters that have unknown defaults / arguments, we
+                            // can't do
+                            // anything here about them
+                            it.sourceText != null
+                        }
+                        .groupBy { it.sourceText }
+                        .values
+
+                // For each grouped pair of colors, make sure that all corresponding 'on' colors
+                // have
+                // the same color
+                backgroundColorGroups.forEach { colors ->
+                    // Find all corresponding onColors for these colors and group them by value
+                    val onColorGroups =
+                        colors
+                            .map { parameter ->
+                                val background = parameter.parameter.name
+                                val onColor = OnColorMap[background]
+                                parameters.first { it.parameter.name == onColor }
+                            }
+                            // If multiple background colors have the same color (such as `primary`
+                            // /
+                            // `primaryVariant`) then filter the duplicates out so we don't report
+                            // the same
+                            // 'on' color multiple times.
+                            .distinctBy { it.parameter.name }
+                            .groupBy { it.sourceText }
+
+                    // Report if there are multiple groups (i.e different values between 'on'
+                    // colors)
+                    if (onColorGroups.size > 1) {
+                        onColorGroups.values.forEach { group ->
+                            group.forEach { parameter ->
+                                val argument = parameter.argument
+                                // If the conflicting color comes from the default value of a
+                                // function,
+                                // there is nothing to report - just report the clashing colors that
+                                // the user explicitly provides.
+                                if (argument != null) {
+                                    context.report(
+                                        ConflictingOnColor,
+                                        argument,
+                                        context.getNameLocation(argument),
+                                        "Conflicting 'on' color for a given background"
+                                    )
+                                }
                             }
                         }
                     }
                 }
             }
         }
-    }
 
     companion object {
-        val ConflictingOnColor = Issue.create(
-            "ConflictingOnColor",
-            "Background colors with the same value should have the same 'on' color",
-            "In the Material color system background colors have a corresponding 'on' " +
-                "color which is used for the content color inside a component. For example, a " +
-                "button colored `primary` will have `onPrimary` text. Because of this, it is " +
-                "important that there is only one possible `onColor` for a given color value, " +
-                "otherwise there is no way to know which 'on' color should be used inside a " +
-                "component. To fix this either use the same 'on' color for identical background " +
-                "colors, or use a different background color for each 'on' color.",
-            Category.CORRECTNESS, 3, Severity.ERROR,
-            Implementation(
-                ColorsDetector::class.java,
-                EnumSet.of(Scope.JAVA_FILE, Scope.TEST_SOURCES)
+        val ConflictingOnColor =
+            Issue.create(
+                "ConflictingOnColor",
+                "Background colors with the same value should have the same 'on' color",
+                "In the Material color system background colors have a corresponding 'on' " +
+                    "color which is used for the content color inside a component. For example, a " +
+                    "button colored `primary` will have `onPrimary` text. Because of this, it is " +
+                    "important that there is only one possible `onColor` for a given color value, " +
+                    "otherwise there is no way to know which 'on' color should be used inside a " +
+                    "component. To fix this either use the same 'on' color for identical background " +
+                    "colors, or use a different background color for each 'on' color.",
+                Category.CORRECTNESS,
+                3,
+                Severity.ERROR,
+                Implementation(
+                    ColorsDetector::class.java,
+                    EnumSet.of(Scope.JAVA_FILE, Scope.TEST_SOURCES)
+                )
             )
-        )
     }
 }
 
@@ -152,16 +160,12 @@
  * Represents a [parameter] with the corresponding [argument] provided as the value for the
  * parameter. If [parameter] has a default value, [argument] may be null.
  */
-class ParameterWithArgument(
-    val parameter: PsiParameter,
-    val argument: UExpression?
-) {
+class ParameterWithArgument(val parameter: PsiParameter, val argument: UExpression?) {
     /**
      * String representing the text passed as the argument / provided within the default.
      *
      * Note: this will fail in rare cases where the same underlying value is referenced to in a
      * different way, such as:
-     *
      * ```
      * val white = Color.White
      * ...
@@ -171,34 +175,35 @@
      *
      * Theoretically we can resolve declarations, but this would require a lot of work to handle
      * different types of references, such as parameters and properties, and still will miss some
-     * cases such as when this is defined inside a function with an external parameter that we
-     * can't resolve.
+     * cases such as when this is defined inside a function with an external parameter that we can't
+     * resolve.
      *
      * This string is `null` if no argument was provided, and a default value exists in a class
      * file - so we can't resolve what it is.
      */
     val sourceText: String? by lazy {
-        val sourceExpression: UElement? = when {
-            // An argument was provided
-            argument != null -> argument
-            // A default value exists (so !! is safe), and we are browsing Kotlin source
-            // Note: this should be is KtLightParameter, but this was changed from an interface
-            // to a class, so we get an IncompatibleClassChangeError.
-            parameter is KtLightParameter -> {
-                parameter.kotlinOrigin!!.defaultValue.toUElement()
+        val sourceExpression: UElement? =
+            when {
+                // An argument was provided
+                argument != null -> argument
+                // A default value exists (so !! is safe), and we are browsing Kotlin source
+                // Note: this should be is KtLightParameter, but this was changed from an interface
+                // to a class, so we get an IncompatibleClassChangeError.
+                parameter is KtLightParameter -> {
+                    parameter.kotlinOrigin!!.defaultValue.toUElement()
+                }
+                // A default value exists, but it is in a class file so we can't access it anymore
+                else -> null
             }
-            // A default value exists, but it is in a class file so we can't access it anymore
-            else -> null
-        }
 
         sourceExpression?.resolveToDeclarationText()
     }
 
     /**
      * Returns a string that matches the original declaration for this UElement. If this is a
-     * literal or a reference to something out of scope (such as parameter), this will just be
-     * that text. If this is a reference to a variable, this will try and find the text of the
-     * variable, the last time it was assigned.
+     * literal or a reference to something out of scope (such as parameter), this will just be that
+     * text. If this is a reference to a variable, this will try and find the text of the variable,
+     * the last time it was assigned.
      */
     private fun UElement.resolveToDeclarationText(): String? {
         // Get the source psi and go back to a UElement since if the declaration is a property, it
@@ -216,18 +221,17 @@
     }
 }
 
-/**
- * Map of background colors to corresponding 'on' colors.
- */
-private val OnColorMap = mapOf(
-    "primary" to "onPrimary",
-    "primaryVariant" to "onPrimary",
-    "secondary" to "onSecondary",
-    "secondaryVariant" to "onSecondary",
-    "background" to "onBackground",
-    "surface" to "onSurface",
-    "error" to "onError"
-)
+/** Map of background colors to corresponding 'on' colors. */
+private val OnColorMap =
+    mapOf(
+        "primary" to "onPrimary",
+        "primaryVariant" to "onPrimary",
+        "secondary" to "onSecondary",
+        "secondaryVariant" to "onSecondary",
+        "background" to "onBackground",
+        "surface" to "onSurface",
+        "error" to "onError"
+    )
 
 private val LightColors = Name(Material.PackageName, "lightColors")
 private val DarkColors = Name(Material.PackageName, "darkColors")
diff --git a/compose/material/material-lint/src/main/java/androidx/compose/material/lint/MaterialIssueRegistry.kt b/compose/material/material-lint/src/main/java/androidx/compose/material/lint/MaterialIssueRegistry.kt
index f7b3b43..5977c35 100644
--- a/compose/material/material-lint/src/main/java/androidx/compose/material/lint/MaterialIssueRegistry.kt
+++ b/compose/material/material-lint/src/main/java/androidx/compose/material/lint/MaterialIssueRegistry.kt
@@ -20,20 +20,22 @@
 import com.android.tools.lint.client.api.Vendor
 import com.android.tools.lint.detector.api.CURRENT_API
 
-/**
- * [IssueRegistry] containing Material specific lint issues.
- */
+/** [IssueRegistry] containing Material specific lint issues. */
 class MaterialIssueRegistry : IssueRegistry() {
     // Tests are run with this version. We ensure that with ApiLintVersionsTest
     override val api = 14
     override val minApi = CURRENT_API
-    override val issues get() = listOf(
-        ColorsDetector.ConflictingOnColor,
-        ScaffoldPaddingDetector.UnusedMaterialScaffoldPaddingParameter
-    )
-    override val vendor = Vendor(
-        vendorName = "Jetpack Compose",
-        identifier = "androidx.compose.material",
-        feedbackUrl = "https://issuetracker.google.com/issues/new?component=612128"
-    )
+    override val issues
+        get() =
+            listOf(
+                ColorsDetector.ConflictingOnColor,
+                ScaffoldPaddingDetector.UnusedMaterialScaffoldPaddingParameter
+            )
+
+    override val vendor =
+        Vendor(
+            vendorName = "Jetpack Compose",
+            identifier = "androidx.compose.material",
+            feedbackUrl = "https://issuetracker.google.com/issues/new?component=612128"
+        )
 }
diff --git a/compose/material/material-lint/src/main/java/androidx/compose/material/lint/MaterialNames.kt b/compose/material/material-lint/src/main/java/androidx/compose/material/lint/MaterialNames.kt
index dae87fd..ff6cc46 100644
--- a/compose/material/material-lint/src/main/java/androidx/compose/material/lint/MaterialNames.kt
+++ b/compose/material/material-lint/src/main/java/androidx/compose/material/lint/MaterialNames.kt
@@ -18,9 +18,7 @@
 
 import androidx.compose.lint.Package
 
-/**
- * Contains common names used for Material lint checks.
- */
+/** Contains common names used for Material lint checks. */
 object MaterialNames {
     object Material {
         val PackageName = Package("androidx.compose.material")
diff --git a/compose/material/material-lint/src/main/java/androidx/compose/material/lint/ScaffoldPaddingDetector.kt b/compose/material/material-lint/src/main/java/androidx/compose/material/lint/ScaffoldPaddingDetector.kt
index 69b94b4..ed2b767 100644
--- a/compose/material/material-lint/src/main/java/androidx/compose/material/lint/ScaffoldPaddingDetector.kt
+++ b/compose/material/material-lint/src/main/java/androidx/compose/material/lint/ScaffoldPaddingDetector.kt
@@ -37,27 +37,26 @@
 /**
  * [Detector] that checks `Scaffold` usages for correctness.
  *
- * Scaffold provides an padding parameter to the `content` lambda. If this value is unused,
- * then the content may be obscured by app bars defined by the scaffold.
+ * Scaffold provides an padding parameter to the `content` lambda. If this value is unused, then the
+ * content may be obscured by app bars defined by the scaffold.
  */
 class ScaffoldPaddingDetector : Detector(), SourceCodeScanner {
     override fun getApplicableMethodNames(): List<String> = listOf(Scaffold.shortName)
 
     override fun visitMethodCall(context: JavaContext, node: UCallExpression, method: PsiMethod) {
         if (method.isInPackageName(Material.PackageName)) {
-            val contentArgument = computeKotlinArgumentMapping(node, method)
-                .orEmpty()
-                .filter { (_, parameter) ->
-                    parameter.name == "content"
-                }
-                .keys
-                .filterIsInstance<ULambdaExpression>()
-                .firstOrNull() ?: return
+            val contentArgument =
+                computeKotlinArgumentMapping(node, method)
+                    .orEmpty()
+                    .filter { (_, parameter) -> parameter.name == "content" }
+                    .keys
+                    .filterIsInstance<ULambdaExpression>()
+                    .firstOrNull() ?: return
 
             contentArgument.findUnreferencedParameters().forEach { unreferencedParameter ->
-                val location = unreferencedParameter.parameter
-                    ?.let { context.getLocation(it) }
-                    ?: context.getLocation(contentArgument)
+                val location =
+                    unreferencedParameter.parameter?.let { context.getLocation(it) }
+                        ?: context.getLocation(contentArgument)
                 val name = unreferencedParameter.name
                 context.report(
                     UnusedMaterialScaffoldPaddingParameter,
@@ -70,19 +69,22 @@
     }
 
     companion object {
-        val UnusedMaterialScaffoldPaddingParameter = Issue.create(
-            "UnusedMaterialScaffoldPaddingParameter",
-            "Scaffold content should use the padding provided as a lambda parameter",
-            "The `content` lambda in Scaffold has a padding parameter " +
-                "which will include any inner padding for the content due to app bars. If this " +
-                "parameter is ignored, then content may be obscured by the app bars resulting in " +
-                "visual issues or elements that can't be interacted with.",
-            Category.CORRECTNESS, 3, Severity.ERROR,
-            Implementation(
-                ScaffoldPaddingDetector::class.java,
-                EnumSet.of(Scope.JAVA_FILE, Scope.TEST_SOURCES)
+        val UnusedMaterialScaffoldPaddingParameter =
+            Issue.create(
+                "UnusedMaterialScaffoldPaddingParameter",
+                "Scaffold content should use the padding provided as a lambda parameter",
+                "The `content` lambda in Scaffold has a padding parameter " +
+                    "which will include any inner padding for the content due to app bars. If this " +
+                    "parameter is ignored, then content may be obscured by the app bars resulting in " +
+                    "visual issues or elements that can't be interacted with.",
+                Category.CORRECTNESS,
+                3,
+                Severity.ERROR,
+                Implementation(
+                    ScaffoldPaddingDetector::class.java,
+                    EnumSet.of(Scope.JAVA_FILE, Scope.TEST_SOURCES)
+                )
             )
-        )
     }
 }
 
diff --git a/compose/material/material-lint/src/test/java/androidx/compose/material/lint/ColorsDetectorTest.kt b/compose/material/material-lint/src/test/java/androidx/compose/material/lint/ColorsDetectorTest.kt
index d04646c..4f41366 100644
--- a/compose/material/material-lint/src/test/java/androidx/compose/material/lint/ColorsDetectorTest.kt
+++ b/compose/material/material-lint/src/test/java/androidx/compose/material/lint/ColorsDetectorTest.kt
@@ -33,10 +33,9 @@
 /**
  * Test for [ColorsDetector].
  *
- * Tests for when Colors.kt is available as source (during global / IDE analysis), and for when
- * it is available as bytecode (during partial / CLI analysis). Since we cannot resolve default
- * values when it is only available as bytecode, is it expected that we throw less errors in that
- * mode.
+ * Tests for when Colors.kt is available as source (during global / IDE analysis), and for when it
+ * is available as bytecode (during partial / CLI analysis). Since we cannot resolve default values
+ * when it is only available as bytecode, is it expected that we throw less errors in that mode.
  */
 class ColorsDetectorTest : LintDetectorTest() {
     override fun getDetector(): Detector = ColorsDetector()
@@ -44,11 +43,12 @@
     override fun getIssues(): MutableList<Issue> = mutableListOf(ColorsDetector.ConflictingOnColor)
 
     // Simplified Colors.kt stubs
-    private val ColorsStub = kotlinAndBytecodeStub(
-        filename = "Colors.kt",
-        filepath = "androidx/compose/material",
-        checksum = 0x73db7d2,
-        """
+    private val ColorsStub =
+        kotlinAndBytecodeStub(
+            filename = "Colors.kt",
+            filepath = "androidx/compose/material",
+            checksum = 0x73db7d2,
+            """
             package androidx.compose.material
 
             import androidx.compose.ui.graphics.*
@@ -127,13 +127,13 @@
                 false
             )
         """,
-"""
+            """
         META-INF/main.kotlin_module:
         H4sIAAAAAAAA/2NgYGBmYGBgBGJOBijgUuWSTMxLKcrPTKnQS87PLcgvTtXL
         TSxJLcpMzBHicM7PyS8q9i7hUueSxalMLy0/X4gtJLW4BKxQBkNhaaZeelFi
         QUZmcrEQO9hI7xIlBi0GAPW9qnSRAAAA
         """,
-        """
+            """
         androidx/compose/material/Colors.class:
         H4sIAAAAAAAA/5WUT28TRxjGn1n/2Xhtx3aMNzbp8jdAkrbZkPYGQippKwWZ
         tmpQDuSAJuslmdg7E82sI3rLJ+CGxJlvkBNSD1XEBYkPhXh3vFmoeqiwrHl+
@@ -154,7 +154,7 @@
         fQ+lbdzYxs1tLOMWIW5v4w5W9sAMVrG2hwWDusG3Bg2D7wzmDVqG/mLQMVmo
         a3DJoGfgGywa9A0GNnnpExMAv0xQBQAA
         """,
-        """
+            """
         androidx/compose/material/ColorsKt.class:
         H4sIAAAAAAAA/81WS1McVRT+7jDMDMMwNJOZzkBeGIgBExjCJBBDQgjkNbyi
         ISEP1NjMNKRh6MbuHipJWRZaZdSFGxdW6cIqdeHChSm1lDKWRWGVCzfuXORH
@@ -190,13 +190,14 @@
         whULVy3ELYxb/OOJOgsJy7EnLaQsyBZ2WkhbqLfQYKHXQsjCNQuV/wJPDAsN
         AgwAAA==
         """
-    )
+        )
 
     @Test
     fun constructorErrors_source() {
-        lint().files(
-            kotlin(
-                """
+        lint()
+            .files(
+                kotlin(
+                    """
                 package androidx.compose.material.foo
 
                 import androidx.compose.material.*
@@ -254,10 +255,10 @@
                     false
                 )
             """
-            ),
-            Stubs.Color,
-            ColorsStub.kotlin
-        )
+                ),
+                Stubs.Color,
+                ColorsStub.kotlin
+            )
             .run()
             .expect(
                 """
@@ -304,9 +305,10 @@
 
     @Test
     fun lightColorsErrors_source() {
-        lint().files(
-            kotlin(
-                """
+        lint()
+            .files(
+                kotlin(
+                    """
                 package androidx.compose.material.foo
 
                 import androidx.compose.material.*
@@ -329,10 +331,10 @@
                     onBackground = Color.Green,
                 )
             """
-            ),
-            Stubs.Color,
-            ColorsStub.kotlin
-        )
+                ),
+                Stubs.Color,
+                ColorsStub.kotlin
+            )
             .run()
             .expect(
                 """
@@ -352,9 +354,10 @@
 
     @Test
     fun darkColorsErrors_source() {
-        lint().files(
-            kotlin(
-                """
+        lint()
+            .files(
+                kotlin(
+                    """
                 package androidx.compose.material.foo
 
                 import androidx.compose.material.*
@@ -378,10 +381,10 @@
                     onBackground = Color.Green,
                 )
             """
-            ),
-            Stubs.Color,
-            ColorsStub.kotlin
-        )
+                ),
+                Stubs.Color,
+                ColorsStub.kotlin
+            )
             .run()
             .expect(
                 """
@@ -401,9 +404,10 @@
 
     @Test
     fun trackVariableAssignment_source() {
-        lint().files(
-            kotlin(
-                """
+        lint()
+            .files(
+                kotlin(
+                    """
                 package androidx.compose.material.foo
 
                 import androidx.compose.material.*
@@ -439,19 +443,20 @@
                     )
                 }
             """
-            ),
-            Stubs.Color,
-            ColorsStub.kotlin
-        )
+                ),
+                Stubs.Color,
+                ColorsStub.kotlin
+            )
             .run()
             .expectClean()
     }
 
     @Test
     fun noErrors_source() {
-        lint().files(
-            kotlin(
-                """
+        lint()
+            .files(
+                kotlin(
+                    """
                 package androidx.compose.material.foo
 
                 import androidx.compose.material.*
@@ -512,19 +517,20 @@
                 )
 
             """
-            ),
-            Stubs.Color,
-            ColorsStub.kotlin
-        )
+                ),
+                Stubs.Color,
+                ColorsStub.kotlin
+            )
             .run()
             .expectClean()
     }
 
     @Test
     fun constructorErrors_compiled() {
-        lint().files(
-            kotlin(
-                """
+        lint()
+            .files(
+                kotlin(
+                    """
                 package androidx.compose.material.foo
 
                 import androidx.compose.material.*
@@ -582,10 +588,10 @@
                     false
                 )
             """
-            ),
-            Stubs.Color,
-            ColorsStub.bytecode
-        )
+                ),
+                Stubs.Color,
+                ColorsStub.bytecode
+            )
             .run()
             // TODO: b/184856104 currently the constructor call to Colors cannot be resolved when
             // it is available as bytecode, so we don't see any errors.
@@ -594,9 +600,10 @@
 
     @Test
     fun lightColorsErrors_compiled() {
-        lint().files(
-            kotlin(
-                """
+        lint()
+            .files(
+                kotlin(
+                    """
                 package androidx.compose.material.foo
 
                 import androidx.compose.material.*
@@ -613,10 +620,10 @@
                     onBackground = Color.Green,
                 )
             """
-            ),
-            Stubs.Color,
-            ColorsStub.bytecode
-        )
+                ),
+                Stubs.Color,
+                ColorsStub.bytecode
+            )
             .run()
             .expect(
                 """
@@ -633,9 +640,10 @@
 
     @Test
     fun darkColorsErrors_compiled() {
-        lint().files(
-            kotlin(
-                """
+        lint()
+            .files(
+                kotlin(
+                    """
                 package androidx.compose.material.foo
 
                 import androidx.compose.material.*
@@ -652,10 +660,10 @@
                     onBackground = Color.Green,
                 )
             """
-            ),
-            Stubs.Color,
-            ColorsStub.bytecode
-        )
+                ),
+                Stubs.Color,
+                ColorsStub.bytecode
+            )
             .run()
             .expect(
                 """
@@ -672,9 +680,10 @@
 
     @Test
     fun trackVariableAssignment_compiled() {
-        lint().files(
-            kotlin(
-                """
+        lint()
+            .files(
+                kotlin(
+                    """
                 package androidx.compose.material.foo
 
                 import androidx.compose.material.*
@@ -710,19 +719,20 @@
                     )
                 }
             """
-            ),
-            Stubs.Color,
-            ColorsStub.bytecode
-        )
+                ),
+                Stubs.Color,
+                ColorsStub.bytecode
+            )
             .run()
             .expectClean()
     }
 
     @Test
     fun noErrors_compiled() {
-        lint().files(
-            kotlin(
-                """
+        lint()
+            .files(
+                kotlin(
+                    """
                 package androidx.compose.material.foo
 
                 import androidx.compose.material.*
@@ -783,10 +793,10 @@
                 )
 
             """
-            ),
-            Stubs.Color,
-            ColorsStub.bytecode
-        )
+                ),
+                Stubs.Color,
+                ColorsStub.bytecode
+            )
             .run()
             .expectClean()
     }
diff --git a/compose/material/material-lint/src/test/java/androidx/compose/material/lint/ScaffoldPaddingDetectorTest.kt b/compose/material/material-lint/src/test/java/androidx/compose/material/lint/ScaffoldPaddingDetectorTest.kt
index d581caf..3d48295 100644
--- a/compose/material/material-lint/src/test/java/androidx/compose/material/lint/ScaffoldPaddingDetectorTest.kt
+++ b/compose/material/material-lint/src/test/java/androidx/compose/material/lint/ScaffoldPaddingDetectorTest.kt
@@ -30,9 +30,7 @@
 /* ktlint-disable max-line-length */
 @RunWith(JUnit4::class)
 
-/**
- * Test for [ScaffoldPaddingDetector].
- */
+/** Test for [ScaffoldPaddingDetector]. */
 class ScaffoldPaddingDetectorTest : LintDetectorTest() {
     override fun getDetector(): Detector = ScaffoldPaddingDetector()
 
@@ -40,11 +38,12 @@
         mutableListOf(ScaffoldPaddingDetector.UnusedMaterialScaffoldPaddingParameter)
 
     // Simplified Scaffold.kt stubs
-    private val ScaffoldStub = bytecodeStub(
-        filename = "Scaffold.kt",
-        filepath = "androidx/compose/material",
-        checksum = 0x7045eee1,
-        """
+    private val ScaffoldStub =
+        bytecodeStub(
+            filename = "Scaffold.kt",
+            filepath = "androidx/compose/material",
+            checksum = 0x7045eee1,
+            """
             package androidx.compose.material
 
             import androidx.compose.foundation.layout.PaddingValues
@@ -60,13 +59,13 @@
             ) {}
 
         """,
-"""
+            """
         META-INF/main.kotlin_module:
         H4sIAAAAAAAA/2NgYGBmYGBgBGJOBijgUueSTMxLKcrPTKnQS87PLcgvTtXL
         TSxJLcpMzBHiCk5OTEvLz0nxLuHi5WJOy88XYgtJLS7xLlFi0GIAADDzNLNQ
         AAAA
         """,
-        """
+            """
         androidx/compose/material/ScaffoldKt＄Scaffold＄1.class:
         H4sIAAAAAAAA/6VU604TQRT+Zlt6xxZEuYj3qi0o2+LdNiSEQNxQMLHYxPBr
         2t3C0N1Z091t8B8P4RP4BKKJJJoY4k8fynhmaQ2GiBo32bMn53zfmXOb/fb9
@@ -85,7 +84,7 @@
         Ou9Q/Q/DQyJ4FH7LeBz+mujaE+vyJiIGrhi4auAarhvUjBsGbuLWJpiHAork
         9zDjYdZD9geSTRPs1wQAAA==
         """,
-        """
+            """
         androidx/compose/material/ScaffoldKt＄Scaffold＄2.class:
         H4sIAAAAAAAA/6VU604TQRT+Zlt6o9iCKBfxXrUFZdt6tw0JIRI3FEwsNjH8
         mna3MHR31nR3G/zHQ/gEPoFoIokmhvjThzKeWVrFEFHjJnv25JzvO3Nus1+/
@@ -104,7 +103,7 @@
         sM5bVP/98JAIHoTfEh6Gvya69sS6uIGIgUsGLhu4gqsGNeOageu4sQHmIY8C
         +T3MepjzkPkOclh0G9cEAAA=
         """,
-        """
+            """
         androidx/compose/material/ScaffoldKt.class:
         H4sIAAAAAAAA/8VVS3MbRRD+RpK1D0uJIluOrQQnxEri+JG1RHjKBBwRk8WS
         kkKJLz6NViux1u6sax+ucKFM8Re4cOUfwCnFgVJx5F/wR6j0riTjWJQTV6ji
@@ -130,13 +129,14 @@
         eF/HB/hQx0f4WMcnqO6B+djEp3uY9jHl474P1ce8j7yPz3zIPmZ9zPn43MfW
         S5104ZQXCQAA
         """
-    )
+        )
 
     @Test
     fun unreferencedParameters() {
-        lint().files(
-            kotlin(
-                """
+        lint()
+            .files(
+                kotlin(
+                    """
                 package foo
 
                 import androidx.compose.material.*
@@ -153,12 +153,12 @@
                     Scaffold(Modifier, topBar = {}, bottomBar = {}) { innerPadding -> /**/ }
                 }
             """
-            ),
-            ScaffoldStub,
-            Stubs.Modifier,
-            Stubs.PaddingValues,
-            Stubs.Composable
-        )
+                ),
+                ScaffoldStub,
+                Stubs.Modifier,
+                Stubs.PaddingValues,
+                Stubs.Composable
+            )
             .run()
             .expect(
                 """
@@ -187,9 +187,10 @@
 
     @Test
     fun unreferencedParameter_shadowedNames() {
-        lint().files(
-            kotlin(
-                """
+        lint()
+            .files(
+                kotlin(
+                    """
                 package foo
 
                 import androidx.compose.material.*
@@ -220,12 +221,12 @@
                     }
                 }
             """
-            ),
-            ScaffoldStub,
-            Stubs.Modifier,
-            Stubs.PaddingValues,
-            Stubs.Composable
-        )
+                ),
+                ScaffoldStub,
+                Stubs.Modifier,
+                Stubs.PaddingValues,
+                Stubs.Composable
+            )
             .run()
             .expect(
                 """
@@ -242,9 +243,10 @@
 
     @Test
     fun noErrors() {
-        lint().files(
-            kotlin(
-                """
+        lint()
+            .files(
+                kotlin(
+                    """
                 package foo
 
                 import androidx.compose.material.*
@@ -261,12 +263,12 @@
                     }
                 }
         """
-            ),
-            ScaffoldStub,
-            Stubs.Modifier,
-            Stubs.PaddingValues,
-            Stubs.Composable
-        )
+                ),
+                ScaffoldStub,
+                Stubs.Modifier,
+                Stubs.PaddingValues,
+                Stubs.Composable
+            )
             .run()
             .expectClean()
     }
diff --git a/compose/material/material-navigation/samples/src/main/java/androidx/compose/material/navigation/samples/ComposeMaterialNavigationSamples.kt b/compose/material/material-navigation/samples/src/main/java/androidx/compose/material/navigation/samples/ComposeMaterialNavigationSamples.kt
index bc17bef..b519a39 100644
--- a/compose/material/material-navigation/samples/src/main/java/androidx/compose/material/navigation/samples/ComposeMaterialNavigationSamples.kt
+++ b/compose/material/material-navigation/samples/src/main/java/androidx/compose/material/navigation/samples/ComposeMaterialNavigationSamples.kt
@@ -72,12 +72,8 @@
 private fun HomeScreen(showSheet: () -> Unit, showFeed: () -> Unit) {
     Column(Modifier.fillMaxSize(), horizontalAlignment = Alignment.CenterHorizontally) {
         Text("Body")
-        Button(onClick = showSheet) {
-            Text("Show sheet!")
-        }
-        Button(onClick = showFeed) {
-            Text("Navigate to Feed")
-        }
+        Button(onClick = showSheet) { Text("Show sheet!") }
+        Button(onClick = showFeed) { Text("Navigate to Feed") }
     }
 }
 
@@ -85,11 +81,7 @@
 private fun BottomSheet(showFeed: () -> Unit, showAnotherSheet: () -> Unit, arg: String) {
     Column(Modifier.fillMaxWidth(), horizontalAlignment = Alignment.CenterHorizontally) {
         Text("Sheet with arg: $arg")
-        Button(onClick = showFeed) {
-            Text("Click me to navigate!")
-        }
-        Button(onClick = showAnotherSheet) {
-            Text("Click me to show another sheet!")
-        }
+        Button(onClick = showFeed) { Text("Click me to navigate!") }
+        Button(onClick = showAnotherSheet) { Text("Click me to show another sheet!") }
     }
 }
diff --git a/compose/material/material-navigation/src/androidTest/java/androidx/compose/material/navigation/BottomSheetNavigatorTest.kt b/compose/material/material-navigation/src/androidTest/java/androidx/compose/material/navigation/BottomSheetNavigatorTest.kt
index 964957f..2309146 100644
--- a/compose/material/material-navigation/src/androidTest/java/androidx/compose/material/navigation/BottomSheetNavigatorTest.kt
+++ b/compose/material/material-navigation/src/androidTest/java/androidx/compose/material/navigation/BottomSheetNavigatorTest.kt
@@ -72,8 +72,7 @@
 @RunWith(AndroidJUnit4::class)
 internal class BottomSheetNavigatorTest {
 
-    @get:Rule
-    val composeTestRule = createComposeRule()
+    @get:Rule val composeTestRule = createComposeRule()
 
     @Test
     fun testNavigateAddsDestinationToBackStack(): Unit = runBlocking {
@@ -111,9 +110,9 @@
 
         navigator.navigate(listOf(secondEntry), null, null)
         assertWithMessage(
-            "The second entry has been added to the back stack and it still " +
-                "contains the first entry"
-        )
+                "The second entry has been added to the back stack and it still " +
+                    "contains the first entry"
+            )
             .that(navigatorState.backStack.value)
             .containsExactly(firstEntry, secondEntry)
             .inOrder()
@@ -127,34 +126,30 @@
         val navigatorState = TestNavigatorState()
         navigator.onAttach(navigatorState)
 
-        composeTestRule.setContent {
-            Column { navigator.sheetContent(this) }
-        }
+        composeTestRule.setContent { Column { navigator.sheetContent(this) } }
 
         var firstDestinationCompositions = 0
         val firstDestinationContentTag = "firstSheetContentTest"
-        val firstDestination = BottomSheetNavigator.Destination(navigator) {
-            DisposableEffect(Unit) {
-                firstDestinationCompositions++
-                onDispose { firstDestinationCompositions = 0 }
+        val firstDestination =
+            BottomSheetNavigator.Destination(navigator) {
+                DisposableEffect(Unit) {
+                    firstDestinationCompositions++
+                    onDispose { firstDestinationCompositions = 0 }
+                }
+                Text("Fake Sheet Content", Modifier.testTag(firstDestinationContentTag))
             }
-            Text("Fake Sheet Content", Modifier.testTag(firstDestinationContentTag))
-        }
         val firstEntry = navigatorState.createBackStackEntry(firstDestination, null)
 
         var secondDestinationCompositions = 0
         val secondDestinationContentTag = "secondSheetContentTest"
-        val secondDestination = BottomSheetNavigator.Destination(navigator) {
-            DisposableEffect(Unit) {
-                secondDestinationCompositions++
-                onDispose { secondDestinationCompositions = 0 }
+        val secondDestination =
+            BottomSheetNavigator.Destination(navigator) {
+                DisposableEffect(Unit) {
+                    secondDestinationCompositions++
+                    onDispose { secondDestinationCompositions = 0 }
+                }
+                Box(Modifier.size(64.dp).testTag(secondDestinationContentTag))
             }
-            Box(
-                Modifier
-                    .size(64.dp)
-                    .testTag(secondDestinationContentTag)
-            )
-        }
         val secondEntry = navigatorState.createBackStackEntry(secondDestination, null)
 
         navigator.navigate(listOf(firstEntry), null, null)
@@ -163,9 +158,11 @@
         composeTestRule.onNodeWithTag(firstDestinationContentTag).assertExists()
         composeTestRule.onNodeWithTag(secondDestinationContentTag).assertDoesNotExist()
         assertWithMessage("First destination should have been composed exactly once")
-            .that(firstDestinationCompositions).isEqualTo(1)
+            .that(firstDestinationCompositions)
+            .isEqualTo(1)
         assertWithMessage("Second destination should not have been composed yet")
-            .that(secondDestinationCompositions).isEqualTo(0)
+            .that(secondDestinationCompositions)
+            .isEqualTo(0)
 
         navigator.navigate(listOf(secondEntry), null, null)
         composeTestRule.awaitIdle()
@@ -173,9 +170,11 @@
         composeTestRule.onNodeWithTag(firstDestinationContentTag).assertDoesNotExist()
         composeTestRule.onNodeWithTag(secondDestinationContentTag).assertExists()
         assertWithMessage("First destination has not been disposed")
-            .that(firstDestinationCompositions).isEqualTo(0)
+            .that(firstDestinationCompositions)
+            .isEqualTo(0)
         assertWithMessage("Second destination should have been composed exactly once")
-            .that(secondDestinationCompositions).isEqualTo(1)
+            .that(secondDestinationCompositions)
+            .isEqualTo(1)
     }
 
     @Test
@@ -191,20 +190,15 @@
         composeTestRule.setContent {
             ModalBottomSheetLayout(
                 bottomSheetNavigator = navigator,
-                content = {
-                    Box(
-                        Modifier
-                            .fillMaxSize()
-                            .testTag(bodyContentTag)
-                    )
-                }
+                content = { Box(Modifier.fillMaxSize().testTag(bodyContentTag)) }
             )
         }
 
-        val destination = BottomSheetNavigator.Destination(
-            navigator = navigator,
-            content = { Box(Modifier.height(20.dp)) }
-        )
+        val destination =
+            BottomSheetNavigator.Destination(
+                navigator = navigator,
+                content = { Box(Modifier.height(20.dp)) }
+            )
         val backStackEntry = navigatorState.createBackStackEntry(destination, null)
         navigator.navigate(listOf(backStackEntry), null, null)
         composeTestRule.awaitIdle()
@@ -212,13 +206,11 @@
         assertWithMessage("Navigated to destination")
             .that(navigatorState.backStack.value)
             .containsExactly(backStackEntry)
-        assertWithMessage("Bottom sheet shown")
-            .that(sheetState.isVisible).isTrue()
+        assertWithMessage("Bottom sheet shown").that(sheetState.isVisible).isTrue()
 
         composeTestRule.onNodeWithTag(bodyContentTag).performClick()
         composeTestRule.awaitIdle()
-        assertWithMessage("Sheet should be hidden")
-            .that(sheetState.isVisible).isFalse()
+        assertWithMessage("Sheet should be hidden").that(sheetState.isVisible).isFalse()
         assertThat(navigatorState.transitionsInProgress.value).isEmpty()
         assertWithMessage("Back stack entry should be popped off the back stack")
             .that(navigatorState.backStack.value)
@@ -241,13 +233,9 @@
             navController = rememberNavController(navigator)
             if (savedState != null) navController.restoreState(savedState)
             if (compositionState == 0) {
-                ModalBottomSheetLayout(
-                    bottomSheetNavigator = navigator
-                ) {
+                ModalBottomSheetLayout(bottomSheetNavigator = navigator) {
                     NavHost(navController, startDestination = "first") {
-                        bottomSheet("first") {
-                            Text("Hello!", Modifier.testTag(textInSheetTag))
-                        }
+                        bottomSheet("first") { Text("Hello!", Modifier.testTag(textInSheetTag)) }
                     }
                 }
             }
@@ -268,8 +256,7 @@
         assertWithMessage("Destination is first destination")
             .that(navController.currentDestination?.route)
             .isEqualTo("first")
-        assertWithMessage("Bottom sheet is visible")
-            .that(sheetState.isVisible).isTrue()
+        assertWithMessage("Bottom sheet is visible").that(sheetState.isVisible).isTrue()
     }
 
     @Test
@@ -288,12 +275,10 @@
             )
         }
 
-        val backStackEntry1 = navigatorState.createBackStackEntry(
-            navigator.createFakeDestination(), null
-        )
-        val backStackEntry2 = navigatorState.createBackStackEntry(
-            navigator.createFakeDestination(), null
-        )
+        val backStackEntry1 =
+            navigatorState.createBackStackEntry(navigator.createFakeDestination(), null)
+        val backStackEntry2 =
+            navigatorState.createBackStackEntry(navigator.createFakeDestination(), null)
 
         navigator.navigate(
             entries = listOf(backStackEntry1, backStackEntry2),
@@ -326,15 +311,9 @@
         // ModalBottomSheetLayout
         navigator.onAttach(navigatorState)
 
-        val entry = navigatorState.createBackStackEntry(
-            navigator.createFakeDestination(), null
-        )
+        val entry = navigatorState.createBackStackEntry(navigator.createFakeDestination(), null)
 
-        navigator.navigate(
-            entries = listOf(entry),
-            navOptions = null,
-            navigatorExtras = null
-        )
+        navigator.navigate(entries = listOf(entry), navOptions = null, navigatorExtras = null)
 
         composeTestRule.awaitIdle()
 
@@ -356,11 +335,7 @@
 
             ModalBottomSheetLayout(bottomSheetNavigator) {
                 Box(modifier = Modifier.fillMaxSize()) {
-                    NavHost(
-                        navController = navController,
-                        startDestination = "mainScreen"
-                    ) {
-
+                    NavHost(navController = navController, startDestination = "mainScreen") {
                         composable(
                             route = "mainScreen",
                             content = {
@@ -374,9 +349,7 @@
                             route = "bottomSheet",
                             content = {
                                 Box(modifier = Modifier.fillMaxSize()) {
-                                    Text(
-                                        text = "bottomSheet"
-                                    )
+                                    Text(text = "bottomSheet")
                                 }
                             }
                         )
@@ -414,20 +387,11 @@
             ModalBottomSheetLayout(navigator) {
                 NavHost(navController, homeDestination) {
                     composable(homeDestination) {
-                        Box(
-                            Modifier
-                                .fillMaxSize()
-                                .background(Color.Blue)
-                        )
+                        Box(Modifier.fillMaxSize().background(Color.Blue))
                     }
                     bottomSheet(sheetDestination) { backStackEntry ->
                         sheetNavBackStackEntry = backStackEntry
-                        Box(
-                            Modifier
-                                .height(height)
-                                .fillMaxWidth()
-                                .background(Color.Red)
-                        )
+                        Box(Modifier.height(height).fillMaxWidth().background(Color.Red))
                     }
                 }
             }
@@ -604,12 +568,8 @@
             navController = rememberNavController(navigator)
             ModalBottomSheetLayout(navigator) {
                 NavHost(navController, "first") {
-                    composable("first") {
-                        Box(Modifier.fillMaxSize())
-                    }
-                    bottomSheet("sheet") {
-                        Box(Modifier.height(200.dp))
-                    }
+                    composable("first") { Box(Modifier.fillMaxSize()) }
+                    bottomSheet("sheet") { Box(Modifier.height(200.dp)) }
                 }
             }
         }
@@ -653,19 +613,10 @@
             ModalBottomSheetLayout(navigator, Modifier.testTag(sheetLayoutTestTag)) {
                 NavHost(navController, homeDestination) {
                     composable(homeDestination) {
-                        Box(
-                            Modifier
-                                .fillMaxSize()
-                                .background(Color.Red)
-                        )
+                        Box(Modifier.fillMaxSize().background(Color.Red))
                     }
                     bottomSheet(sheetDestination) {
-                        Box(
-                            Modifier
-                                .height(200.dp)
-                                .fillMaxWidth()
-                                .background(Color.Green)
-                        ) {
+                        Box(Modifier.height(200.dp).fillMaxWidth().background(Color.Green)) {
                             Text("Hello!")
                         }
                     }
@@ -673,23 +624,22 @@
             }
         }
 
-        assertThat(navController.currentBackStackEntry?.destination?.route).isEqualTo(
-            homeDestination
-        )
+        assertThat(navController.currentBackStackEntry?.destination?.route)
+            .isEqualTo(homeDestination)
         assertThat(navigator.navigatorSheetState.isVisible).isFalse()
 
         composeTestRule.runOnUiThread { navController.navigate(sheetDestination) }
         composeTestRule.waitForIdle()
 
-        assertThat(navController.currentBackStackEntry?.destination?.route).isEqualTo(
-            sheetDestination
-        )
+        assertThat(navController.currentBackStackEntry?.destination?.route)
+            .isEqualTo(sheetDestination)
         assertThat(navController.currentBackStackEntry?.lifecycle?.currentState)
             .isEqualTo(Lifecycle.State.RESUMED)
         assertThat(navigator.navigatorSheetState.isVisible).isTrue()
 
-        composeTestRule.onNodeWithTag(sheetLayoutTestTag)
-            .performTouchInput { click(position = topCenter) }
+        composeTestRule.onNodeWithTag(sheetLayoutTestTag).performTouchInput {
+            click(position = topCenter)
+        }
 
         composeTestRule.waitForIdle()
         assertThat(navigator.navigatorSheetState.isVisible).isFalse()
@@ -712,29 +662,15 @@
             ModalBottomSheetLayout(navigator, Modifier.testTag(sheetLayoutTestTag)) {
                 NavHost(navController, homeDestination) {
                     composable(homeDestination) {
-                        Box(
-                            Modifier
-                                .fillMaxSize()
-                                .background(Color.Red)
-                        )
+                        Box(Modifier.fillMaxSize().background(Color.Red))
                     }
                     bottomSheet(firstSheetDestination) {
-                        Box(
-                            Modifier
-                                .height(200.dp)
-                                .fillMaxWidth()
-                                .background(Color.Green)
-                        ) {
+                        Box(Modifier.height(200.dp).fillMaxWidth().background(Color.Green)) {
                             Text("Hello!")
                         }
                     }
                     bottomSheet(secondSheetDestination) {
-                        Box(
-                            Modifier
-                                .height(200.dp)
-                                .fillMaxWidth()
-                                .background(Color.Blue)
-                        ) {
+                        Box(Modifier.height(200.dp).fillMaxWidth().background(Color.Blue)) {
                             Text("Hello!")
                         }
                     }
@@ -808,13 +744,11 @@
                     composable(homeDestination) {
                         nestedNavController = rememberNavController()
                         NavHost(nestedNavController, "nested1") {
-                            composable(firstNestedDestination) { }
-                            composable(secondNestedDestination) { }
+                            composable(firstNestedDestination) {}
+                            composable(secondNestedDestination) {}
                         }
                     }
-                    bottomSheet(firstSheetDestination) {
-                        Text("SheetDestination")
-                    }
+                    bottomSheet(firstSheetDestination) { Text("SheetDestination") }
                 }
             }
         }
@@ -822,9 +756,7 @@
         assertThat(navController.currentBackStackEntry?.destination?.route)
             .isEqualTo(homeDestination)
 
-        composeTestRule.runOnUiThread {
-            nestedNavController.navigate(secondNestedDestination)
-        }
+        composeTestRule.runOnUiThread { nestedNavController.navigate(secondNestedDestination) }
         composeTestRule.waitForIdle()
 
         assertThat(navController.currentBackStackEntry?.destination?.route)
@@ -832,17 +764,13 @@
         assertThat(nestedNavController.currentBackStackEntry?.destination?.route)
             .isEqualTo(secondNestedDestination)
 
-        composeTestRule.runOnUiThread {
-            navController.navigate(firstSheetDestination)
-        }
+        composeTestRule.runOnUiThread { navController.navigate(firstSheetDestination) }
         composeTestRule.waitForIdle()
 
         assertThat(navigator.sheetState.currentValue)
             .isAnyOf(ModalBottomSheetValue.HalfExpanded, ModalBottomSheetValue.Expanded)
 
-        composeTestRule.runOnUiThread {
-            backDispatcher.onBackPressed()
-        }
+        composeTestRule.runOnUiThread { backDispatcher.onBackPressed() }
         composeTestRule.waitForIdle()
 
         assertThat(navController.currentBackStackEntry?.destination?.route)
@@ -854,9 +782,8 @@
     }
 
     private fun BottomSheetNavigator.createFakeDestination() =
-        BottomSheetNavigator.Destination(this) {
-            Text("Fake Sheet Content")
-        }
+        BottomSheetNavigator.Destination(this) { Text("Fake Sheet Content") }
 
-    private val ModalBottomSheetState.isAnimationRunning get() = currentValue != targetValue
+    private val ModalBottomSheetState.isAnimationRunning
+        get() = currentValue != targetValue
 }
diff --git a/compose/material/material-navigation/src/androidTest/java/androidx/compose/material/navigation/NavGraphBuilderTest.kt b/compose/material/material-navigation/src/androidTest/java/androidx/compose/material/navigation/NavGraphBuilderTest.kt
index 77192b7..a4248cf 100644
--- a/compose/material/material-navigation/src/androidTest/java/androidx/compose/material/navigation/NavGraphBuilderTest.kt
+++ b/compose/material/material-navigation/src/androidTest/java/androidx/compose/material/navigation/NavGraphBuilderTest.kt
@@ -38,8 +38,7 @@
 @LargeTest
 @RunWith(AndroidJUnit4::class)
 internal class NavGraphBuilderTest {
-    @get:Rule
-    val composeTestRule = createComposeRule()
+    @get:Rule val composeTestRule = createComposeRule()
 
     @Test
     fun testCurrentBackStackEntryNavigate() {
@@ -51,8 +50,8 @@
             navController.navigatorProvider += createBottomSheetNavigator()
 
             NavHost(navController, startDestination = firstRoute) {
-                bottomSheet(firstRoute) { }
-                bottomSheet("$secondRoute/{$key}") { }
+                bottomSheet(firstRoute) {}
+                bottomSheet("$secondRoute/{$key}") {}
             }
         }
 
@@ -73,11 +72,11 @@
             navController.navigatorProvider += createBottomSheetNavigator()
 
             NavHost(navController, startDestination = firstRoute) {
-                bottomSheet(firstRoute) { }
+                bottomSheet(firstRoute) {}
                 bottomSheet(
                     secondRoute,
                     arguments = listOf(navArgument(key) { defaultValue = defaultArg })
-                ) { }
+                ) {}
             }
         }
 
@@ -98,11 +97,11 @@
             navController.navigatorProvider += createBottomSheetNavigator()
 
             NavHost(navController, startDestination = firstRoute) {
-                bottomSheet(firstRoute) { }
+                bottomSheet(firstRoute) {}
                 bottomSheet(
                     secondRoute,
                     deepLinks = listOf(navDeepLink { uriPattern = uriString })
-                ) { }
+                ) {}
             }
         }
 
@@ -114,8 +113,10 @@
     }
 
     private fun createBottomSheetNavigator() =
-        BottomSheetNavigator(sheetState =
-        ModalBottomSheetState(ModalBottomSheetValue.Hidden, composeTestRule.density))
+        BottomSheetNavigator(
+            sheetState =
+                ModalBottomSheetState(ModalBottomSheetValue.Hidden, composeTestRule.density)
+        )
 }
 
 private const val firstRoute = "first"
diff --git a/compose/material/material-navigation/src/androidTest/java/androidx/compose/material/navigation/SheetContentHostTest.kt b/compose/material/material-navigation/src/androidTest/java/androidx/compose/material/navigation/SheetContentHostTest.kt
index 0b03487d..0cd670e 100644
--- a/compose/material/material-navigation/src/androidTest/java/androidx/compose/material/navigation/SheetContentHostTest.kt
+++ b/compose/material/material-navigation/src/androidTest/java/androidx/compose/material/navigation/SheetContentHostTest.kt
@@ -53,8 +53,7 @@
 internal class SheetContentHostTest {
     private val bodyContentTag = "testBodyContent"
 
-    @get:Rule
-    val composeTestRule = createComposeRule()
+    @get:Rule val composeTestRule = createComposeRule()
 
     @Test
     fun testOnSheetDismissedCalled_ManualDismiss() = runTest {
@@ -67,15 +66,14 @@
         composeTestRule.setBottomSheetContent(
             mutableStateOf(backStackEntry),
             sheetState,
-            onSheetShown = { },
+            onSheetShown = {},
             onSheetDismissed = { entry -> dismissedBackStackEntries.add(entry) }
         )
 
         assertThat(sheetState.currentValue == ModalBottomSheetValue.Expanded).isTrue()
         composeTestRule.onNodeWithTag(bodyContentTag).performClick()
         composeTestRule.runOnIdle {
-            assertWithMessage("Sheet is visible")
-                .that(sheetState.isVisible).isFalse()
+            assertWithMessage("Sheet is visible").that(sheetState.isVisible).isFalse()
             assertWithMessage("Back stack entry should be in the dismissed entries list")
                 .that(dismissedBackStackEntries)
                 .containsExactly(backStackEntry)
@@ -94,15 +92,14 @@
         composeTestRule.setBottomSheetContent(
             mutableStateOf(backStackEntry),
             sheetState,
-            onSheetShown = { },
+            onSheetShown = {},
             onSheetDismissed = { entry -> dismissedBackStackEntries.add(entry) }
         )
 
         assertThat(sheetState.currentValue == ModalBottomSheetValue.Expanded).isTrue()
         composeTestRule.onNodeWithTag(bodyContentTag).performClick()
         composeTestRule.runOnIdle {
-            assertWithMessage("Sheet is not visible")
-                .that(sheetState.isVisible).isFalse()
+            assertWithMessage("Sheet is not visible").that(sheetState.isVisible).isFalse()
             assertWithMessage("Back stack entry should be in the dismissed entries list")
                 .that(dismissedBackStackEntries)
                 .containsExactly(backStackEntry)
@@ -120,17 +117,14 @@
             backStackEntry = backStackEntryState,
             sheetState = sheetState,
             onSheetShown = { entry -> shownBackStackEntries.add(entry) },
-            onSheetDismissed = { }
+            onSheetDismissed = {}
         )
 
-        val backStackEntry = createBackStackEntry(sheetState) {
-            Box(Modifier.height(50.dp))
-        }
+        val backStackEntry = createBackStackEntry(sheetState) { Box(Modifier.height(50.dp)) }
         backStackEntryState.value = backStackEntry
 
         composeTestRule.runOnIdle {
-            assertWithMessage("Sheet is visible")
-                .that(sheetState.isVisible).isTrue()
+            assertWithMessage("Sheet is visible").that(sheetState.isVisible).isTrue()
             assertWithMessage("Back stack entry should be in the shown entries list")
                 .that(shownBackStackEntries)
                 .containsExactly(backStackEntry)
@@ -148,17 +142,14 @@
             backStackEntry = backStackEntryState,
             sheetState = sheetState,
             onSheetShown = { entry -> shownBackStackEntries.add(entry) },
-            onSheetDismissed = { }
+            onSheetDismissed = {}
         )
 
-        val backStackEntry = createBackStackEntry(sheetState) {
-            Box(Modifier.fillMaxSize())
-        }
+        val backStackEntry = createBackStackEntry(sheetState) { Box(Modifier.fillMaxSize()) }
         backStackEntryState.value = backStackEntry
 
         composeTestRule.runOnIdle {
-            assertWithMessage("Sheet is visible")
-                .that(sheetState.isVisible).isTrue()
+            assertWithMessage("Sheet is visible").that(sheetState.isVisible).isTrue()
             assertWithMessage("Back stack entry should be in the shown entries list")
                 .that(shownBackStackEntries)
                 .containsExactly(backStackEntry)
@@ -187,21 +178,16 @@
                     )
                 },
                 sheetState = sheetState,
-                content = {
-                    Box(
-                        Modifier
-                            .fillMaxSize()
-                            .testTag(bodyContentTag)
-                    )
-                }
+                content = { Box(Modifier.fillMaxSize().testTag(bodyContentTag)) }
             )
         }
     }
 
     private fun createBackStackEntry(
         sheetState: ModalBottomSheetState,
-        sheetContent:
-        @Composable ColumnScope.(NavBackStackEntry) -> Unit = { Text("Fake Sheet Content") }
+        sheetContent: @Composable ColumnScope.(NavBackStackEntry) -> Unit = {
+            Text("Fake Sheet Content")
+        }
     ): NavBackStackEntry {
         val navigatorState = TestNavigatorState()
         val navigator = BottomSheetNavigator(sheetState)
diff --git a/compose/material/material-navigation/src/main/java/androidx/compose/material/navigation/BottomSheetNavigator.kt b/compose/material/material-navigation/src/main/java/androidx/compose/material/navigation/BottomSheetNavigator.kt
index 92a2db1..7356ac4 100644
--- a/compose/material/material-navigation/src/main/java/androidx/compose/material/navigation/BottomSheetNavigator.kt
+++ b/compose/material/material-navigation/src/main/java/androidx/compose/material/navigation/BottomSheetNavigator.kt
@@ -50,62 +50,51 @@
  * @param sheetState The sheet state that is driven by the [BottomSheetNavigator]
  */
 public class BottomSheetNavigatorSheetState(private val sheetState: ModalBottomSheetState) {
-    /**
-     * @see ModalBottomSheetState.isVisible
-     */
+    /** @see ModalBottomSheetState.isVisible */
     public val isVisible: Boolean
         get() = sheetState.isVisible
 
-    /**
-     * @see ModalBottomSheetState.currentValue
-     */
+    /** @see ModalBottomSheetState.currentValue */
     public val currentValue: ModalBottomSheetValue
         get() = sheetState.currentValue
 
-    /**
-     * @see ModalBottomSheetState.targetValue
-     */
+    /** @see ModalBottomSheetState.targetValue */
     public val targetValue: ModalBottomSheetValue
         get() = sheetState.targetValue
 }
 
-/**
- * Create and remember a [BottomSheetNavigator]
- */
+/** Create and remember a [BottomSheetNavigator] */
 @Composable
 public fun rememberBottomSheetNavigator(
     animationSpec: AnimationSpec<Float> = SpringSpec()
 ): BottomSheetNavigator {
-    val sheetState = rememberModalBottomSheetState(
-        ModalBottomSheetValue.Hidden,
-        animationSpec = animationSpec
-    )
+    val sheetState =
+        rememberModalBottomSheetState(ModalBottomSheetValue.Hidden, animationSpec = animationSpec)
     return remember(sheetState) { BottomSheetNavigator(sheetState) }
 }
 
 /**
- * Navigator that drives a [ModalBottomSheetState] for use of [ModalBottomSheetLayout]s
- * with the navigation library. Every destination using this Navigator must set a valid
- * [Composable] by setting it directly on an instantiated [Destination] or calling
+ * Navigator that drives a [ModalBottomSheetState] for use of [ModalBottomSheetLayout]s with the
+ * navigation library. Every destination using this Navigator must set a valid [Composable] by
+ * setting it directly on an instantiated [Destination] or calling
  * [androidx.compose.material.navigation.bottomSheet].
  *
  * <b>The [sheetContent] [Composable] will always host the latest entry of the back stack. When
  * navigating from a [BottomSheetNavigator.Destination] to another
- * [BottomSheetNavigator.Destination], the content of the sheet will be replaced instead of a
- * new bottom sheet being shown.</b>
+ * [BottomSheetNavigator.Destination], the content of the sheet will be replaced instead of a new
+ * bottom sheet being shown.</b>
  *
  * When the sheet is dismissed by the user, the [state]'s [NavigatorState.backStack] will be popped.
  *
  * The primary constructor is not intended for public use. Please refer to
  * [rememberBottomSheetNavigator] instead.
  *
- * @param sheetState The [ModalBottomSheetState] that the [BottomSheetNavigator] will use to
- * drive the sheet state
+ * @param sheetState The [ModalBottomSheetState] that the [BottomSheetNavigator] will use to drive
+ *   the sheet state
  */
 @Navigator.Name("bottomSheet")
-public class BottomSheetNavigator(
-    internal val sheetState: ModalBottomSheetState
-) : Navigator<BottomSheetNavigator.Destination>() {
+public class BottomSheetNavigator(internal val sheetState: ModalBottomSheetState) :
+    Navigator<BottomSheetNavigator.Destination>() {
 
     private var attached by mutableStateOf(false)
 
@@ -115,11 +104,12 @@
      * attached yet.
      */
     private val backStack: StateFlow<List<NavBackStackEntry>>
-        get() = if (attached) {
-            state.backStack
-        } else {
-            MutableStateFlow(emptyList())
-        }
+        get() =
+            if (attached) {
+                state.backStack
+            } else {
+                MutableStateFlow(emptyList())
+            }
 
     /**
      * Get the transitionsInProgress from the [state]. In some cases, the [sheetContent] might be
@@ -127,15 +117,14 @@
      * aren't attached yet.
      */
     internal val transitionsInProgress: StateFlow<Set<NavBackStackEntry>>
-        get() = if (attached) {
-            state.transitionsInProgress
-        } else {
-            MutableStateFlow(emptySet())
-        }
+        get() =
+            if (attached) {
+                state.transitionsInProgress
+            } else {
+                MutableStateFlow(emptySet())
+            }
 
-    /**
-     * Access properties of the [ModalBottomSheetLayout]'s [ModalBottomSheetState]
-     */
+    /** Access properties of the [ModalBottomSheetLayout]'s [ModalBottomSheetState] */
     public val navigatorSheetState: BottomSheetNavigatorSheetState =
         BottomSheetNavigatorSheetState(sheetState)
 
@@ -150,46 +139,36 @@
         // The latest back stack entry, retained until the sheet is completely hidden
         // While the back stack is updated immediately, we might still be hiding the sheet, so
         // we keep the entry around until the sheet is hidden
-        val retainedEntry by produceState<NavBackStackEntry?>(
-            initialValue = null,
-            key1 = backStack
-        ) {
-            backStack
-                .transform { backStackEntries ->
-                    // Always hide the sheet when the back stack is updated
-                    // Regardless of whether we're popping or pushing, we always want to hide
-                    // the sheet first before deciding whether to re-show it or keep it hidden
-                    try {
-                        sheetState.hide()
-                    } catch (_: CancellationException) {
-                        // We catch but ignore possible cancellation exceptions as we don't want
-                        // them to bubble up and cancel the whole produceState coroutine
-                    } finally {
-                        emit(backStackEntries.lastOrNull())
+        val retainedEntry by
+            produceState<NavBackStackEntry?>(initialValue = null, key1 = backStack) {
+                backStack
+                    .transform { backStackEntries ->
+                        // Always hide the sheet when the back stack is updated
+                        // Regardless of whether we're popping or pushing, we always want to hide
+                        // the sheet first before deciding whether to re-show it or keep it hidden
+                        try {
+                            sheetState.hide()
+                        } catch (_: CancellationException) {
+                            // We catch but ignore possible cancellation exceptions as we don't want
+                            // them to bubble up and cancel the whole produceState coroutine
+                        } finally {
+                            emit(backStackEntries.lastOrNull())
+                        }
                     }
-                }
-                .collect {
-                    value = it
-                }
-        }
+                    .collect { value = it }
+            }
 
         if (retainedEntry != null) {
-            LaunchedEffect(retainedEntry) {
-                sheetState.show()
-            }
+            LaunchedEffect(retainedEntry) { sheetState.show() }
 
-            BackHandler {
-                state.popWithTransition(popUpTo = retainedEntry!!, saveState = false)
-            }
+            BackHandler { state.popWithTransition(popUpTo = retainedEntry!!, saveState = false) }
         }
 
         SheetContentHost(
             backStackEntry = retainedEntry,
             sheetState = sheetState,
             saveableStateHolder = saveableStateHolder,
-            onSheetShown = {
-                transitionsInProgressEntries.forEach(state::markTransitionComplete)
-            },
+            onSheetShown = { transitionsInProgressEntries.forEach(state::markTransitionComplete) },
             onSheetDismissed = { backStackEntry ->
                 // Sheet dismissal can be started through popBackStack in which case we have a
                 // transition that we'll want to complete
@@ -212,28 +191,21 @@
         attached = true
     }
 
-    override fun createDestination(): Destination = Destination(
-        navigator = this,
-        content = {}
-    )
+    override fun createDestination(): Destination = Destination(navigator = this, content = {})
 
     override fun navigate(
         entries: List<NavBackStackEntry>,
         navOptions: NavOptions?,
         navigatorExtras: Extras?
     ) {
-        entries.fastForEach { entry ->
-            state.pushWithTransition(entry)
-        }
+        entries.fastForEach { entry -> state.pushWithTransition(entry) }
     }
 
     override fun popBackStack(popUpTo: NavBackStackEntry, savedState: Boolean) {
         state.popWithTransition(popUpTo, savedState)
     }
 
-    /**
-     * [NavDestination] specific to [BottomSheetNavigator]
-     */
+    /** [NavDestination] specific to [BottomSheetNavigator] */
     @NavDestination.ClassType(Composable::class)
     public class Destination(
         navigator: BottomSheetNavigator,
diff --git a/compose/material/material-navigation/src/main/java/androidx/compose/material/navigation/NavGraphBuilder.kt b/compose/material/material-navigation/src/main/java/androidx/compose/material/navigation/NavGraphBuilder.kt
index 4f1590a..c03098e 100644
--- a/compose/material/material-navigation/src/main/java/androidx/compose/material/navigation/NavGraphBuilder.kt
+++ b/compose/material/material-navigation/src/main/java/androidx/compose/material/navigation/NavGraphBuilder.kt
@@ -40,17 +40,12 @@
     content: @Composable ColumnScope.(backstackEntry: NavBackStackEntry) -> Unit
 ) {
     addDestination(
-        BottomSheetNavigator.Destination(
-            provider[BottomSheetNavigator::class],
-            content
-        ).apply {
+        BottomSheetNavigator.Destination(provider[BottomSheetNavigator::class], content).apply {
             this.route = route
             arguments.fastForEach { (argumentName, argument) ->
                 addArgument(argumentName, argument)
             }
-            deepLinks.fastForEach { deepLink ->
-                addDeepLink(deepLink)
-            }
+            deepLinks.fastForEach { deepLink -> addDeepLink(deepLink) }
         }
     )
 }
diff --git a/compose/material/material-navigation/src/main/java/androidx/compose/material/navigation/SheetContentHost.kt b/compose/material/material-navigation/src/main/java/androidx/compose/material/navigation/SheetContentHost.kt
index c8c3bc7..60f3241 100644
--- a/compose/material/material-navigation/src/main/java/androidx/compose/material/navigation/SheetContentHost.kt
+++ b/compose/material/material-navigation/src/main/java/androidx/compose/material/navigation/SheetContentHost.kt
@@ -35,11 +35,11 @@
  * shows and hides the [ModalBottomSheetLayout] through the [sheetState] when the sheet content
  * enters or leaves the composition.
  *
- * @param backStackEntry The [NavBackStackEntry] holding the [BottomSheetNavigator.Destination],
- * or null if there is no [NavBackStackEntry]
+ * @param backStackEntry The [NavBackStackEntry] holding the [BottomSheetNavigator.Destination], or
+ *   null if there is no [NavBackStackEntry]
  * @param sheetState The [ModalBottomSheetState] used to observe and control the sheet visibility
- * @param onSheetDismissed Callback when the sheet has been dismissed. Typically, you'll want to
- * pop the back stack here.
+ * @param onSheetDismissed Callback when the sheet has been dismissed. Typically, you'll want to pop
+ *   the back stack here.
  */
 @Composable
 internal fun ColumnScope.SheetContentHost(
@@ -67,8 +67,7 @@
                 }
         }
         backStackEntry.LocalOwnersProvider(saveableStateHolder) {
-            val content =
-                (backStackEntry.destination as BottomSheetNavigator.Destination).content
+            val content = (backStackEntry.destination as BottomSheetNavigator.Destination).content
             content(backStackEntry)
         }
     }
diff --git a/compose/material/material-ripple/benchmark/src/androidTest/java/androidx/compose/material/ripple/benchmark/RippleBenchmark.kt b/compose/material/material-ripple/benchmark/src/androidTest/java/androidx/compose/material/ripple/benchmark/RippleBenchmark.kt
index 597fbd0..2be2738 100644
--- a/compose/material/material-ripple/benchmark/src/androidTest/java/androidx/compose/material/ripple/benchmark/RippleBenchmark.kt
+++ b/compose/material/material-ripple/benchmark/src/androidTest/java/androidx/compose/material/ripple/benchmark/RippleBenchmark.kt
@@ -49,15 +49,12 @@
 import org.junit.Test
 import org.junit.runner.RunWith
 
-/**
- * Benchmark for Android ripple performance
- */
+/** Benchmark for Android ripple performance */
 @LargeTest
 @RunWith(AndroidJUnit4::class)
 class RippleBenchmark {
 
-    @get:Rule
-    val benchmarkRule = ComposeBenchmarkRule()
+    @get:Rule val benchmarkRule = ComposeBenchmarkRule()
 
     @Test
     fun firstComposition() {
@@ -66,10 +63,12 @@
             object : LayeredComposeTestCase() {
                 @Composable
                 override fun MeasuredContent() {
-                    Box(Modifier.indication(
-                        interactionSource = interactionSource,
-                        indication = TestRipple
-                    ))
+                    Box(
+                        Modifier.indication(
+                            interactionSource = interactionSource,
+                            indication = TestRipple
+                        )
+                    )
                 }
             }
         }
@@ -89,18 +88,14 @@
         with(benchmarkRule) {
             runBenchmarkFor({ RippleInteractionTestCase() }) {
                 measureRepeatedOnUiThread {
-                    runWithTimingDisabled {
-                        doFramesUntilNoChangesMeasureLayoutOrDrawPending()
-                    }
+                    runWithTimingDisabled { doFramesUntilNoChangesMeasureLayoutOrDrawPending() }
 
                     runBlocking { getTestCase().emitInteraction(press) }
                     doFrame()
 
                     // We explicitly tear down after each iteration so we incur costs for anything
                     // cached at the view hierarchy level, in this case the RippleContainer.
-                    runWithTimingDisabled {
-                        disposeContent()
-                    }
+                    runWithTimingDisabled { disposeContent() }
                 }
             }
         }
@@ -136,9 +131,7 @@
                     runBlocking { getTestCase().emitInteraction(press2) }
                     doFrame()
 
-                    runWithTimingDisabled {
-                        disposeContent()
-                    }
+                    runWithTimingDisabled { disposeContent() }
                 }
             }
         }
@@ -158,9 +151,7 @@
         with(benchmarkRule) {
             runBenchmarkFor({ RippleInteractionTestCase() }) {
                 measureRepeatedOnUiThread {
-                    runWithTimingDisabled {
-                        doFramesUntilNoChangesMeasureLayoutOrDrawPending()
-                    }
+                    runWithTimingDisabled { doFramesUntilNoChangesMeasureLayoutOrDrawPending() }
 
                     runBlocking { getTestCase().emitInteraction(hover) }
                     doFrame()
@@ -169,9 +160,7 @@
                     // cached at the view hierarchy level. There shouldn't be anything cached in
                     // this way for the hover case, but we do it to be consistent with the press
                     // case.
-                    runWithTimingDisabled {
-                        disposeContent()
-                    }
+                    runWithTimingDisabled { disposeContent() }
                 }
             }
         }
@@ -202,29 +191,21 @@
                     runBlocking { getTestCase().emitInteraction(hover2) }
                     doFrame()
 
-                    runWithTimingDisabled {
-                        disposeContent()
-                    }
+                    runWithTimingDisabled { disposeContent() }
                 }
             }
         }
     }
 }
 
-/**
- * Test case a ripple that allows emitting [Interaction]s with [emitInteraction].
- */
+/** Test case a ripple that allows emitting [Interaction]s with [emitInteraction]. */
 @Suppress("DEPRECATION_ERROR")
 private class RippleInteractionTestCase : LayeredComposeTestCase() {
     private val interactionSource = MutableInteractionSource()
 
     @Composable
     override fun MeasuredContent() {
-        Box(
-            Modifier
-                .size(100.dp)
-                .indication(interactionSource, TestRipple)
-        )
+        Box(Modifier.size(100.dp).indication(interactionSource, TestRipple))
     }
 
     suspend fun emitInteraction(interaction: Interaction) {
@@ -265,12 +246,8 @@
 
 private val TestRippleColor = Color.Red
 
-private val TestRippleAlpha = RippleAlpha(
-    draggedAlpha = 0.1f,
-    focusedAlpha = 0.2f,
-    hoveredAlpha = 0.3f,
-    pressedAlpha = 0.4f
-)
+private val TestRippleAlpha =
+    RippleAlpha(draggedAlpha = 0.1f, focusedAlpha = 0.2f, hoveredAlpha = 0.3f, pressedAlpha = 0.4f)
 
 private class TestIndicationNodeFactory(
     private val color: ColorProducer,
diff --git a/compose/material/material-ripple/src/androidInstrumentedTest/kotlin/androidx/compose/material/ripple/RememberRippleTest.kt b/compose/material/material-ripple/src/androidInstrumentedTest/kotlin/androidx/compose/material/ripple/RememberRippleTest.kt
index bdcc72a..0715d98 100644
--- a/compose/material/material-ripple/src/androidInstrumentedTest/kotlin/androidx/compose/material/ripple/RememberRippleTest.kt
+++ b/compose/material/material-ripple/src/androidInstrumentedTest/kotlin/androidx/compose/material/ripple/RememberRippleTest.kt
@@ -64,9 +64,7 @@
 import org.junit.Test
 import org.junit.runner.RunWith
 
-/**
- * Test for (the deprecated) [rememberRipple] and [RippleTheme] APIs to ensure no regressions.
- */
+/** Test for (the deprecated) [rememberRipple] and [RippleTheme] APIs to ensure no regressions. */
 @LargeTest
 @RunWith(AndroidJUnit4::class)
 @SdkSuppress(
@@ -83,27 +81,28 @@
 @Suppress("DEPRECATION_ERROR")
 class RememberRippleTest {
 
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
     private val TestRippleColor = Color.Red
 
-    private val TestRippleAlpha = RippleAlpha(
-        draggedAlpha = 0.1f,
-        focusedAlpha = 0.2f,
-        hoveredAlpha = 0.3f,
-        pressedAlpha = 0.4f
-    )
+    private val TestRippleAlpha =
+        RippleAlpha(
+            draggedAlpha = 0.1f,
+            focusedAlpha = 0.2f,
+            hoveredAlpha = 0.3f,
+            pressedAlpha = 0.4f
+        )
 
-    private val TestRippleTheme = object : RippleTheme {
-        @Deprecated("Super method is deprecated")
-        @Composable
-        override fun defaultColor() = TestRippleColor
+    private val TestRippleTheme =
+        object : RippleTheme {
+            @Deprecated("Super method is deprecated")
+            @Composable
+            override fun defaultColor() = TestRippleColor
 
-        @Deprecated("Super method is deprecated")
-        @Composable
-        override fun rippleAlpha() = TestRippleAlpha
-    }
+            @Deprecated("Super method is deprecated")
+            @Composable
+            override fun rippleAlpha() = TestRippleAlpha
+        }
 
     @Test
     fun pressed() {
@@ -115,19 +114,16 @@
             scope = rememberCoroutineScope()
             CompositionLocalProvider(LocalRippleTheme provides TestRippleTheme) {
                 Box(Modifier.fillMaxSize(), contentAlignment = Alignment.Center) {
-                    RippleBoxWithBackground(
-                        interactionSource,
-                        rememberRipple(),
-                        bounded = true
-                    )
+                    RippleBoxWithBackground(interactionSource, rememberRipple(), bounded = true)
                 }
             }
         }
 
-        val expectedColor = calculateResultingRippleColor(
-            TestRippleColor,
-            rippleOpacity = TestRippleAlpha.pressedAlpha
-        )
+        val expectedColor =
+            calculateResultingRippleColor(
+                TestRippleColor,
+                rippleOpacity = TestRippleAlpha.pressedAlpha
+            )
 
         assertRippleMatches(
             scope!!,
@@ -147,26 +143,18 @@
             scope = rememberCoroutineScope()
             CompositionLocalProvider(LocalRippleTheme provides TestRippleTheme) {
                 Box(Modifier.fillMaxSize(), contentAlignment = Alignment.Center) {
-                    RippleBoxWithBackground(
-                        interactionSource,
-                        rememberRipple(),
-                        bounded = true
-                    )
+                    RippleBoxWithBackground(interactionSource, rememberRipple(), bounded = true)
                 }
             }
         }
 
-        val expectedColor = calculateResultingRippleColor(
-            TestRippleColor,
-            rippleOpacity = TestRippleAlpha.hoveredAlpha
-        )
+        val expectedColor =
+            calculateResultingRippleColor(
+                TestRippleColor,
+                rippleOpacity = TestRippleAlpha.hoveredAlpha
+            )
 
-        assertRippleMatches(
-            scope!!,
-            interactionSource,
-            HoverInteraction.Enter(),
-            expectedColor
-        )
+        assertRippleMatches(scope!!, interactionSource, HoverInteraction.Enter(), expectedColor)
     }
 
     @Test
@@ -179,26 +167,18 @@
             scope = rememberCoroutineScope()
             CompositionLocalProvider(LocalRippleTheme provides TestRippleTheme) {
                 Box(Modifier.fillMaxSize(), contentAlignment = Alignment.Center) {
-                    RippleBoxWithBackground(
-                        interactionSource,
-                        rememberRipple(),
-                        bounded = true
-                    )
+                    RippleBoxWithBackground(interactionSource, rememberRipple(), bounded = true)
                 }
             }
         }
 
-        val expectedColor = calculateResultingRippleColor(
-            TestRippleColor,
-            rippleOpacity = TestRippleAlpha.focusedAlpha
-        )
+        val expectedColor =
+            calculateResultingRippleColor(
+                TestRippleColor,
+                rippleOpacity = TestRippleAlpha.focusedAlpha
+            )
 
-        assertRippleMatches(
-            scope!!,
-            interactionSource,
-            FocusInteraction.Focus(),
-            expectedColor
-        )
+        assertRippleMatches(scope!!, interactionSource, FocusInteraction.Focus(), expectedColor)
     }
 
     @Test
@@ -211,49 +191,43 @@
             scope = rememberCoroutineScope()
             CompositionLocalProvider(LocalRippleTheme provides TestRippleTheme) {
                 Box(Modifier.fillMaxSize(), contentAlignment = Alignment.Center) {
-                    RippleBoxWithBackground(
-                        interactionSource,
-                        rememberRipple(),
-                        bounded = true
-                    )
+                    RippleBoxWithBackground(interactionSource, rememberRipple(), bounded = true)
                 }
             }
         }
 
-        val expectedColor = calculateResultingRippleColor(
-            TestRippleColor,
-            rippleOpacity = TestRippleAlpha.draggedAlpha
-        )
+        val expectedColor =
+            calculateResultingRippleColor(
+                TestRippleColor,
+                rippleOpacity = TestRippleAlpha.draggedAlpha
+            )
 
-        assertRippleMatches(
-            scope!!,
-            interactionSource,
-            DragInteraction.Start(),
-            expectedColor
-        )
+        assertRippleMatches(scope!!, interactionSource, DragInteraction.Start(), expectedColor)
     }
 
     /**
      * Test case for changing LocalRippleTheme during an existing ripple effect
      *
      * Note: no corresponding test for pressed ripples since RippleForeground does not update the
-     * color of currently active ripples unless they are being drawn on the UI thread
-     * (which should only happen if the target radius also changes).
+     * color of currently active ripples unless they are being drawn on the UI thread (which should
+     * only happen if the target radius also changes).
      */
     @Test
     fun themeChangeDuringRipple_dragged() {
         val interactionSource = MutableInteractionSource()
 
-        fun createRippleTheme(color: Color, alpha: Float) = object : RippleTheme {
-            val rippleAlpha = RippleAlpha(alpha, alpha, alpha, alpha)
-            @Deprecated("Super method is deprecated")
-            @Composable
-            override fun defaultColor() = color
+        fun createRippleTheme(color: Color, alpha: Float) =
+            object : RippleTheme {
+                val rippleAlpha = RippleAlpha(alpha, alpha, alpha, alpha)
 
-            @Deprecated("Super method is deprecated")
-            @Composable
-            override fun rippleAlpha() = rippleAlpha
-        }
+                @Deprecated("Super method is deprecated")
+                @Composable
+                override fun defaultColor() = color
+
+                @Deprecated("Super method is deprecated")
+                @Composable
+                override fun rippleAlpha() = rippleAlpha
+            }
 
         val initialColor = Color.Red
         val initialAlpha = 0.5f
@@ -266,33 +240,20 @@
             scope = rememberCoroutineScope()
             CompositionLocalProvider(LocalRippleTheme provides rippleTheme) {
                 Box(Modifier.fillMaxSize(), contentAlignment = Alignment.Center) {
-                    RippleBoxWithBackground(
-                        interactionSource,
-                        rememberRipple(),
-                        bounded = true
-                    )
+                    RippleBoxWithBackground(interactionSource, rememberRipple(), bounded = true)
                 }
             }
         }
 
-        rule.runOnIdle {
-            scope!!.launch {
-                interactionSource.emit(DragInteraction.Start())
-            }
-        }
+        rule.runOnIdle { scope!!.launch { interactionSource.emit(DragInteraction.Start()) } }
         rule.waitForIdle()
 
         with(rule.onNodeWithTag(Tag)) {
-            val centerPixel = captureToImage().asAndroidBitmap()
-                .run {
-                    getPixel(width / 2, height / 2)
-                }
+            val centerPixel =
+                captureToImage().asAndroidBitmap().run { getPixel(width / 2, height / 2) }
 
             val expectedColor =
-                calculateResultingRippleColor(
-                    initialColor,
-                    rippleOpacity = initialAlpha
-                )
+                calculateResultingRippleColor(initialColor, rippleOpacity = initialAlpha)
 
             Truth.assertThat(Color(centerPixel)).isEqualTo(expectedColor)
         }
@@ -301,21 +262,13 @@
         // TODO: changing alpha for existing state layers is not currently supported
         val newAlpha = 0.5f
 
-        rule.runOnUiThread {
-            rippleTheme = createRippleTheme(newColor, newAlpha)
-        }
+        rule.runOnUiThread { rippleTheme = createRippleTheme(newColor, newAlpha) }
 
         with(rule.onNodeWithTag(Tag)) {
-            val centerPixel = captureToImage().asAndroidBitmap()
-                .run {
-                    getPixel(width / 2, height / 2)
-                }
+            val centerPixel =
+                captureToImage().asAndroidBitmap().run { getPixel(width / 2, height / 2) }
 
-            val expectedColor =
-                calculateResultingRippleColor(
-                    newColor,
-                    rippleOpacity = newAlpha
-                )
+            val expectedColor = calculateResultingRippleColor(newColor, rippleOpacity = newAlpha)
 
             Truth.assertThat(Color(centerPixel)).isEqualTo(expectedColor)
         }
@@ -326,8 +279,8 @@
      * ripple effect
      *
      * Note: no corresponding test for pressed ripples since RippleForeground does not update the
-     * color of currently active ripples unless they are being drawn on the UI thread
-     * (which should only happen if the target radius also changes).
+     * color of currently active ripples unless they are being drawn on the UI thread (which should
+     * only happen if the target radius also changes).
      */
     @Test
     fun compositionLocalChangeDuringRipple_dragged() {
@@ -341,15 +294,16 @@
 
         val localThemeColor = compositionLocalOf { Color.Unspecified }
 
-        val rippleTheme = object : RippleTheme {
-            @Deprecated("Super method is deprecated")
-            @Composable
-            override fun defaultColor() = localThemeColor.current
+        val rippleTheme =
+            object : RippleTheme {
+                @Deprecated("Super method is deprecated")
+                @Composable
+                override fun defaultColor() = localThemeColor.current
 
-            @Deprecated("Super method is deprecated")
-            @Composable
-            override fun rippleAlpha() = rippleAlpha
-        }
+                @Deprecated("Super method is deprecated")
+                @Composable
+                override fun rippleAlpha() = rippleAlpha
+            }
 
         var scope: CoroutineScope? = null
 
@@ -360,54 +314,34 @@
                 localThemeColor provides themeColor
             ) {
                 Box(Modifier.fillMaxSize(), contentAlignment = Alignment.Center) {
-                    RippleBoxWithBackground(
-                        interactionSource,
-                        rememberRipple(),
-                        bounded = true
-                    )
+                    RippleBoxWithBackground(interactionSource, rememberRipple(), bounded = true)
                 }
             }
         }
 
-        rule.runOnIdle {
-            scope!!.launch {
-                interactionSource.emit(DragInteraction.Start())
-            }
-        }
+        rule.runOnIdle { scope!!.launch { interactionSource.emit(DragInteraction.Start()) } }
         rule.waitForIdle()
 
         with(rule.onNodeWithTag(Tag)) {
-            val centerPixel = captureToImage().asAndroidBitmap()
-                .run {
-                    getPixel(width / 2, height / 2)
-                }
+            val centerPixel =
+                captureToImage().asAndroidBitmap().run { getPixel(width / 2, height / 2) }
 
             val expectedColor =
-                calculateResultingRippleColor(
-                    initialColor,
-                    rippleOpacity = expectedAlpha
-                )
+                calculateResultingRippleColor(initialColor, rippleOpacity = expectedAlpha)
 
             Truth.assertThat(Color(centerPixel)).isEqualTo(expectedColor)
         }
 
         val newColor = Color.Green
 
-        rule.runOnUiThread {
-            themeColor = newColor
-        }
+        rule.runOnUiThread { themeColor = newColor }
 
         with(rule.onNodeWithTag(Tag)) {
-            val centerPixel = captureToImage().asAndroidBitmap()
-                .run {
-                    getPixel(width / 2, height / 2)
-                }
+            val centerPixel =
+                captureToImage().asAndroidBitmap().run { getPixel(width / 2, height / 2) }
 
             val expectedColor =
-                calculateResultingRippleColor(
-                    newColor,
-                    rippleOpacity = expectedAlpha
-                )
+                calculateResultingRippleColor(newColor, rippleOpacity = expectedAlpha)
 
             Truth.assertThat(Color(centerPixel)).isEqualTo(expectedColor)
         }
@@ -427,15 +361,16 @@
 
         val localThemeColor = compositionLocalOf { Color.Unspecified }
 
-        val rippleTheme = object : RippleTheme {
-            @Deprecated("Super method is deprecated")
-            @Composable
-            override fun defaultColor() = localThemeColor.current
+        val rippleTheme =
+            object : RippleTheme {
+                @Deprecated("Super method is deprecated")
+                @Composable
+                override fun defaultColor() = localThemeColor.current
 
-            @Deprecated("Super method is deprecated")
-            @Composable
-            override fun rippleAlpha() = rippleAlpha
-        }
+                @Deprecated("Super method is deprecated")
+                @Composable
+                override fun rippleAlpha() = rippleAlpha
+            }
 
         var scope: CoroutineScope? = null
 
@@ -458,28 +393,20 @@
         }
 
         rule.runOnIdle {
-            scope!!.launch {
-                interactionSource.emit(PressInteraction.Press(Offset(10f, 10f)))
-            }
+            scope!!.launch { interactionSource.emit(PressInteraction.Press(Offset(10f, 10f))) }
         }
 
         rule.waitForIdle()
         // Ripples are drawn on the RenderThread, not the main (UI) thread, so we can't wait for
         // synchronization. Instead just wait until after the ripples are finished animating.
-        @Suppress("BanThreadSleep")
-        Thread.sleep(300)
+        @Suppress("BanThreadSleep") Thread.sleep(300)
 
         with(rule.onNodeWithTag(Tag)) {
-            val centerPixel = captureToImage().asAndroidBitmap()
-                .run {
-                    getPixel(width / 2, height / 2)
-                }
+            val centerPixel =
+                captureToImage().asAndroidBitmap().run { getPixel(width / 2, height / 2) }
 
             val expectedColor =
-                calculateResultingRippleColor(
-                    expectedRippleColor,
-                    rippleOpacity = alpha
-                )
+                calculateResultingRippleColor(expectedRippleColor, rippleOpacity = alpha)
 
             Truth.assertThat(Color(centerPixel)).isEqualTo(expectedColor)
         }
@@ -491,7 +418,7 @@
      * @param interactionSource the [MutableInteractionSource] driving the ripple
      * @param interaction the [Interaction] to assert for
      * @param expectedCenterPixelColor the expected color for the pixel at the center of the
-     * [RippleBoxWithBackground]
+     *   [RippleBoxWithBackground]
      */
     private fun assertRippleMatches(
         scope: CoroutineScope,
@@ -505,11 +432,7 @@
         }
 
         // Start ripple
-        rule.runOnIdle {
-            scope.launch {
-                interactionSource.emit(interaction)
-            }
-        }
+        rule.runOnIdle { scope.launch { interactionSource.emit(interaction) } }
 
         // Advance to the end of the ripple / state layer animation
         rule.waitForIdle()
@@ -523,10 +446,8 @@
         }
 
         // Compare expected and actual pixel color
-        val centerPixel = rule.onNodeWithTag(Tag)
-            .captureToImage()
-            .asAndroidBitmap()
-            .run {
+        val centerPixel =
+            rule.onNodeWithTag(Tag).captureToImage().asAndroidBitmap().run {
                 getPixel(width / 2, height / 2)
             }
 
@@ -536,8 +457,8 @@
 
 /**
  * Generic Button like component with a border that allows injecting an [Indication], and has a
- * background with the same color around it - this makes the ripple contrast better and make it
- * more visible in screenshots.
+ * background with the same color around it - this makes the ripple contrast better and make it more
+ * visible in screenshots.
  *
  * @param interactionSource the [MutableInteractionSource] that is used to drive the ripple state
  * @param ripple ripple [Indication] placed inside the surface
@@ -550,35 +471,30 @@
     bounded: Boolean
 ) {
     Box(Modifier.semantics(mergeDescendants = true) {}.testTag(Tag)) {
-        Box(
-            Modifier.padding(25.dp).background(RippleBoxBackgroundColor)
-        ) {
+        Box(Modifier.padding(25.dp).background(RippleBoxBackgroundColor)) {
             val shape = RoundedCornerShape(20)
             // If the ripple is bounded, we want to clip to the shape, otherwise don't clip as
             // the ripple should draw outside the bounds.
             val clip = if (bounded) Modifier.clip(shape) else Modifier
             Box(
-                Modifier.padding(25.dp).width(40.dp).height(40.dp)
+                Modifier.padding(25.dp)
+                    .width(40.dp)
+                    .height(40.dp)
                     .border(BorderStroke(2.dp, Color.Black), shape)
                     .background(color = RippleBoxBackgroundColor, shape = shape)
                     .then(clip)
-                    .indication(
-                        interactionSource = interactionSource,
-                        indication = ripple
-                    )
+                    .indication(interactionSource = interactionSource, indication = ripple)
             ) {}
         }
     }
 }
 
 /**
- * Blends ([contentColor] with [rippleOpacity]) on top of [RippleBoxBackgroundColor] to provide
- * the resulting RGB color that can be used for pixel comparison.
+ * Blends ([contentColor] with [rippleOpacity]) on top of [RippleBoxBackgroundColor] to provide the
+ * resulting RGB color that can be used for pixel comparison.
  */
-private fun calculateResultingRippleColor(
-    contentColor: Color,
-    rippleOpacity: Float
-) = contentColor.copy(alpha = rippleOpacity).compositeOver(RippleBoxBackgroundColor)
+private fun calculateResultingRippleColor(contentColor: Color, rippleOpacity: Float) =
+    contentColor.copy(alpha = rippleOpacity).compositeOver(RippleBoxBackgroundColor)
 
 private val RippleBoxBackgroundColor = Color.Blue
 
diff --git a/compose/material/material-ripple/src/androidInstrumentedTest/kotlin/androidx/compose/material/ripple/RippleContainerTest.kt b/compose/material/material-ripple/src/androidInstrumentedTest/kotlin/androidx/compose/material/ripple/RippleContainerTest.kt
index 6eb6718..3095630 100644
--- a/compose/material/material-ripple/src/androidInstrumentedTest/kotlin/androidx/compose/material/ripple/RippleContainerTest.kt
+++ b/compose/material/material-ripple/src/androidInstrumentedTest/kotlin/androidx/compose/material/ripple/RippleContainerTest.kt
@@ -50,15 +50,12 @@
 import org.junit.Test
 import org.junit.runner.RunWith
 
-/**
- * Test for [RippleContainer]
- */
+/** Test for [RippleContainer] */
 @MediumTest
 @RunWith(AndroidJUnit4::class)
 class RippleContainerTest {
 
-    @get:Rule
-    val rule = createAndroidComposeRule<ComponentActivity>()
+    @get:Rule val rule = createAndroidComposeRule<ComponentActivity>()
 
     @Test
     fun cachesViews() {
@@ -203,8 +200,7 @@
                 androidComposeView = LocalView.current as ViewGroup
                 Column {
                     Box(
-                        Modifier
-                            .wrapContentSize(align = Alignment.Center)
+                        Modifier.wrapContentSize(align = Alignment.Center)
                             .size(40.dp)
                             .indication(
                                 interactionSource = interactionSource1,
@@ -212,8 +208,7 @@
                             )
                     )
                     Box(
-                        Modifier
-                            .wrapContentSize(align = Alignment.Center)
+                        Modifier.wrapContentSize(align = Alignment.Center)
                             .size(40.dp)
                             .indication(
                                 interactionSource = interactionSource2,
@@ -234,9 +229,7 @@
             requestLayoutTrackingFrameLayout.requestLayoutCalled = false
 
             // Emit press on first ripple
-            scope!!.launch {
-                interactionSource1.emit(PressInteraction.Press(Offset.Zero))
-            }
+            scope!!.launch { interactionSource1.emit(PressInteraction.Press(Offset.Zero)) }
         }
 
         rule.runOnIdle {
@@ -245,17 +238,13 @@
             val children = androidComposeView!!.children
             val rippleContainer = children.filterIsInstance<RippleContainer>().singleOrNull()
             Truth.assertThat(rippleContainer).isNotNull()
-            val rippleHostView = rippleContainer!!
-                .children
-                .filterIsInstance<RippleHostView>()
-                .singleOrNull()
+            val rippleHostView =
+                rippleContainer!!.children.filterIsInstance<RippleHostView>().singleOrNull()
             Truth.assertThat(rippleHostView).isNotNull()
             Truth.assertThat(requestLayoutTrackingFrameLayout.requestLayoutCalled).isFalse()
 
             // Emit press on second ripple
-            scope!!.launch {
-                interactionSource2.emit(PressInteraction.Press(Offset.Zero))
-            }
+            scope!!.launch { interactionSource2.emit(PressInteraction.Press(Offset.Zero)) }
         }
 
         rule.runOnIdle {
@@ -264,9 +253,8 @@
             val children = androidComposeView!!.children
             val rippleContainer = children.filterIsInstance<RippleContainer>().singleOrNull()
             Truth.assertThat(rippleContainer).isNotNull()
-            val rippleHostViews = rippleContainer!!
-                .children
-                .filterIsInstance<RippleHostView>().toList()
+            val rippleHostViews =
+                rippleContainer!!.children.filterIsInstance<RippleHostView>().toList()
             Truth.assertThat(rippleHostViews.size).isEqualTo(2)
             Truth.assertThat(requestLayoutTrackingFrameLayout.requestLayoutCalled).isFalse()
         }
@@ -274,8 +262,7 @@
 }
 
 private class TestRippleHostKey : RippleHostKey {
-    override fun onResetRippleHostView() {
-    }
+    override fun onResetRippleHostView() {}
 }
 
 private class RequestLayoutTrackingFrameLayout(context: Context) : FrameLayout(context) {
diff --git a/compose/material/material-ripple/src/androidInstrumentedTest/kotlin/androidx/compose/material/ripple/RippleModifierNodeTest.kt b/compose/material/material-ripple/src/androidInstrumentedTest/kotlin/androidx/compose/material/ripple/RippleModifierNodeTest.kt
index cb70f48..f120107 100644
--- a/compose/material/material-ripple/src/androidInstrumentedTest/kotlin/androidx/compose/material/ripple/RippleModifierNodeTest.kt
+++ b/compose/material/material-ripple/src/androidInstrumentedTest/kotlin/androidx/compose/material/ripple/RippleModifierNodeTest.kt
@@ -71,9 +71,7 @@
 import org.junit.Test
 import org.junit.runner.RunWith
 
-/**
- * Test for [createRippleModifierNode].
- */
+/** Test for [createRippleModifierNode]. */
 @LargeTest
 @RunWith(AndroidJUnit4::class)
 @SdkSuppress(
@@ -89,8 +87,7 @@
 )
 class RippleModifierNodeTest {
 
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
     private val TestRipple = TestIndicationNodeFactory({ TestRippleColor }, { TestRippleAlpha })
 
@@ -136,18 +133,15 @@
         rule.setContent {
             scope = rememberCoroutineScope()
             Box(Modifier.fillMaxSize(), contentAlignment = Alignment.Center) {
-                RippleBoxWithBackground(
-                    interactionSource,
-                    TestRipple,
-                    bounded = true
-                )
+                RippleBoxWithBackground(interactionSource, TestRipple, bounded = true)
             }
         }
 
-        val expectedColor = calculateResultingRippleColor(
-            TestRippleColor,
-            rippleOpacity = TestRippleAlpha.pressedAlpha
-        )
+        val expectedColor =
+            calculateResultingRippleColor(
+                TestRippleColor,
+                rippleOpacity = TestRippleAlpha.pressedAlpha
+            )
 
         assertRippleMatches(
             scope!!,
@@ -157,37 +151,37 @@
         )
     }
 
-    /**
-     * Regression test for b/329693006
-     */
+    /** Regression test for b/329693006 */
     @Test
     fun pressed_rippleCreatedBeforeDraw() {
         // Add a static press interaction so that when the ripple is added, it will add a ripple
         // immediately before the node is drawn
-        val interactionSource = object : MutableInteractionSource {
-            override val interactions: Flow<Interaction> =
-                flowOf(PressInteraction.Press(Offset.Zero))
-            override suspend fun emit(interaction: Interaction) {}
-            override fun tryEmit(interaction: Interaction): Boolean { return true }
-        }
+        val interactionSource =
+            object : MutableInteractionSource {
+                override val interactions: Flow<Interaction> =
+                    flowOf(PressInteraction.Press(Offset.Zero))
+
+                override suspend fun emit(interaction: Interaction) {}
+
+                override fun tryEmit(interaction: Interaction): Boolean {
+                    return true
+                }
+            }
 
         var scope: CoroutineScope? = null
 
         rule.setContent {
             scope = rememberCoroutineScope()
             Box(Modifier.fillMaxSize(), contentAlignment = Alignment.Center) {
-                RippleBoxWithBackground(
-                    interactionSource,
-                    TestRipple,
-                    bounded = true
-                )
+                RippleBoxWithBackground(interactionSource, TestRipple, bounded = true)
             }
         }
 
-        val expectedColor = calculateResultingRippleColor(
-            TestRippleColor,
-            rippleOpacity = TestRippleAlpha.pressedAlpha
-        )
+        val expectedColor =
+            calculateResultingRippleColor(
+                TestRippleColor,
+                rippleOpacity = TestRippleAlpha.pressedAlpha
+            )
 
         assertRippleMatches(
             scope!!,
@@ -206,12 +200,17 @@
     fun pressed_rippleLazilyDelegatedTo() {
         // Add a static press interaction so that when the ripple is added, it will add a ripple
         // immediately before the node is drawn
-        val interactionSource = object : MutableInteractionSource {
-            override val interactions: Flow<Interaction> =
-                flowOf(PressInteraction.Press(Offset.Zero))
-            override suspend fun emit(interaction: Interaction) {}
-            override fun tryEmit(interaction: Interaction): Boolean { return true }
-        }
+        val interactionSource =
+            object : MutableInteractionSource {
+                override val interactions: Flow<Interaction> =
+                    flowOf(PressInteraction.Press(Offset.Zero))
+
+                override suspend fun emit(interaction: Interaction) {}
+
+                override fun tryEmit(interaction: Interaction): Boolean {
+                    return true
+                }
+            }
 
         class TestRippleNode : DelegatingNode() {
             fun attachRipple() {
@@ -221,12 +220,16 @@
 
         val node = TestRippleNode()
 
-        val element = object : ModifierNodeElement<TestRippleNode>() {
-            override fun create(): TestRippleNode = node
-            override fun update(node: TestRippleNode) {}
-            override fun equals(other: Any?): Boolean = other === this
-            override fun hashCode(): Int = -1
-        }
+        val element =
+            object : ModifierNodeElement<TestRippleNode>() {
+                override fun create(): TestRippleNode = node
+
+                override fun update(node: TestRippleNode) {}
+
+                override fun equals(other: Any?): Boolean = other === this
+
+                override fun hashCode(): Int = -1
+            }
 
         var scope: CoroutineScope? = null
 
@@ -234,13 +237,13 @@
             scope = rememberCoroutineScope()
             Box(Modifier.fillMaxSize(), contentAlignment = Alignment.Center) {
                 Box(Modifier.semantics(mergeDescendants = true) {}.testTag(Tag)) {
-                    Box(
-                        Modifier.padding(25.dp).background(RippleBoxBackgroundColor)
-                    ) {
+                    Box(Modifier.padding(25.dp).background(RippleBoxBackgroundColor)) {
                         val shape = RoundedCornerShape(20)
                         val clip = Modifier.clip(shape)
                         Box(
-                            Modifier.padding(25.dp).width(40.dp).height(40.dp)
+                            Modifier.padding(25.dp)
+                                .width(40.dp)
+                                .height(40.dp)
                                 .border(BorderStroke(2.dp, Color.Black), shape)
                                 .background(color = RippleBoxBackgroundColor, shape = shape)
                                 .then(clip)
@@ -251,16 +254,15 @@
             }
         }
 
-        val expectedColor = calculateResultingRippleColor(
-            TestRippleColor,
-            rippleOpacity = TestRippleAlpha.pressedAlpha
-        )
+        val expectedColor =
+            calculateResultingRippleColor(
+                TestRippleColor,
+                rippleOpacity = TestRippleAlpha.pressedAlpha
+            )
 
         // Add the ripple node to the hierarchy, which should then create a ripple before the node
         // has been drawn
-        rule.runOnIdle {
-            node.attachRipple()
-        }
+        rule.runOnIdle { node.attachRipple() }
 
         assertRippleMatches(
             scope!!,
@@ -280,25 +282,17 @@
         rule.setContent {
             scope = rememberCoroutineScope()
             Box(Modifier.fillMaxSize(), contentAlignment = Alignment.Center) {
-                RippleBoxWithBackground(
-                    interactionSource,
-                    TestRipple,
-                    bounded = true
-                )
+                RippleBoxWithBackground(interactionSource, TestRipple, bounded = true)
             }
         }
 
-        val expectedColor = calculateResultingRippleColor(
-            TestRippleColor,
-            rippleOpacity = TestRippleAlpha.hoveredAlpha
-        )
+        val expectedColor =
+            calculateResultingRippleColor(
+                TestRippleColor,
+                rippleOpacity = TestRippleAlpha.hoveredAlpha
+            )
 
-        assertRippleMatches(
-            scope!!,
-            interactionSource,
-            HoverInteraction.Enter(),
-            expectedColor
-        )
+        assertRippleMatches(scope!!, interactionSource, HoverInteraction.Enter(), expectedColor)
     }
 
     @Test
@@ -310,25 +304,17 @@
         rule.setContent {
             scope = rememberCoroutineScope()
             Box(Modifier.fillMaxSize(), contentAlignment = Alignment.Center) {
-                RippleBoxWithBackground(
-                    interactionSource,
-                    TestRipple,
-                    bounded = true
-                )
+                RippleBoxWithBackground(interactionSource, TestRipple, bounded = true)
             }
         }
 
-        val expectedColor = calculateResultingRippleColor(
-            TestRippleColor,
-            rippleOpacity = TestRippleAlpha.focusedAlpha
-        )
+        val expectedColor =
+            calculateResultingRippleColor(
+                TestRippleColor,
+                rippleOpacity = TestRippleAlpha.focusedAlpha
+            )
 
-        assertRippleMatches(
-            scope!!,
-            interactionSource,
-            FocusInteraction.Focus(),
-            expectedColor
-        )
+        assertRippleMatches(scope!!, interactionSource, FocusInteraction.Focus(), expectedColor)
     }
 
     @Test
@@ -340,33 +326,25 @@
         rule.setContent {
             scope = rememberCoroutineScope()
             Box(Modifier.fillMaxSize(), contentAlignment = Alignment.Center) {
-                RippleBoxWithBackground(
-                    interactionSource,
-                    TestRipple,
-                    bounded = true
-                )
+                RippleBoxWithBackground(interactionSource, TestRipple, bounded = true)
             }
         }
 
-        val expectedColor = calculateResultingRippleColor(
-            TestRippleColor,
-            rippleOpacity = TestRippleAlpha.draggedAlpha
-        )
+        val expectedColor =
+            calculateResultingRippleColor(
+                TestRippleColor,
+                rippleOpacity = TestRippleAlpha.draggedAlpha
+            )
 
-        assertRippleMatches(
-            scope!!,
-            interactionSource,
-            DragInteraction.Start(),
-            expectedColor
-        )
+        assertRippleMatches(scope!!, interactionSource, DragInteraction.Start(), expectedColor)
     }
 
     /**
      * Test case for changing a color captured by the color lambda during an existing ripple effect
      *
      * Note: no corresponding test for pressed ripples since RippleForeground does not update the
-     * color of currently active ripples unless they are being drawn on the UI thread
-     * (which should only happen if the target radius also changes).
+     * color of currently active ripples unless they are being drawn on the UI thread (which should
+     * only happen if the target radius also changes).
      */
     @Test
     fun colorChangeDuringRipple_dragged() {
@@ -382,26 +360,16 @@
         rule.setContent {
             scope = rememberCoroutineScope()
             Box(Modifier.fillMaxSize(), contentAlignment = Alignment.Center) {
-                RippleBoxWithBackground(
-                    interactionSource,
-                    ripple,
-                    bounded = true
-                )
+                RippleBoxWithBackground(interactionSource, ripple, bounded = true)
             }
         }
 
-        rule.runOnIdle {
-            scope!!.launch {
-                interactionSource.emit(DragInteraction.Start())
-            }
-        }
+        rule.runOnIdle { scope!!.launch { interactionSource.emit(DragInteraction.Start()) } }
         rule.waitForIdle()
 
         with(rule.onNodeWithTag(Tag)) {
-            val centerPixel = captureToImage().asAndroidBitmap()
-                .run {
-                    getPixel(width / 2, height / 2)
-                }
+            val centerPixel =
+                captureToImage().asAndroidBitmap().run { getPixel(width / 2, height / 2) }
 
             val expectedColor =
                 calculateResultingRippleColor(
@@ -414,15 +382,11 @@
 
         val newColor = Color.Green
 
-        rule.runOnUiThread {
-            themeColor = newColor
-        }
+        rule.runOnUiThread { themeColor = newColor }
 
         with(rule.onNodeWithTag(Tag)) {
-            val centerPixel = captureToImage().asAndroidBitmap()
-                .run {
-                    getPixel(width / 2, height / 2)
-                }
+            val centerPixel =
+                captureToImage().asAndroidBitmap().run { getPixel(width / 2, height / 2) }
 
             val expectedColor =
                 calculateResultingRippleColor(
@@ -440,8 +404,8 @@
      * interactions (this should be a very rare case).
      *
      * Note: no corresponding test for pressed ripples since RippleForeground does not update the
-     * alpha of currently active ripples unless they are being drawn on the UI thread
-     * (which should only happen if the target radius also changes).
+     * alpha of currently active ripples unless they are being drawn on the UI thread (which should
+     * only happen if the target radius also changes).
      */
     @Test
     fun rippleAlphaChange() {
@@ -456,26 +420,16 @@
         rule.setContent {
             scope = rememberCoroutineScope()
             Box(Modifier.fillMaxSize(), contentAlignment = Alignment.Center) {
-                RippleBoxWithBackground(
-                    interactionSource,
-                    ripple,
-                    bounded = true
-                )
+                RippleBoxWithBackground(interactionSource, ripple, bounded = true)
             }
         }
 
-        rule.runOnIdle {
-            scope!!.launch {
-                interactionSource.emit(DragInteraction.Start())
-            }
-        }
+        rule.runOnIdle { scope!!.launch { interactionSource.emit(DragInteraction.Start()) } }
         rule.waitForIdle()
 
         with(rule.onNodeWithTag(Tag)) {
-            val centerPixel = captureToImage().asAndroidBitmap()
-                .run {
-                    getPixel(width / 2, height / 2)
-                }
+            val centerPixel =
+                captureToImage().asAndroidBitmap().run { getPixel(width / 2, height / 2) }
 
             val expectedColor =
                 calculateResultingRippleColor(
@@ -488,15 +442,11 @@
 
         val newRippleAlpha = RippleAlpha(0.5f, 0.5f, 0.5f, 0.5f)
 
-        rule.runOnUiThread {
-            rippleAlpha = newRippleAlpha
-        }
+        rule.runOnUiThread { rippleAlpha = newRippleAlpha }
 
         with(rule.onNodeWithTag(Tag)) {
-            val centerPixel = captureToImage().asAndroidBitmap()
-                .run {
-                    getPixel(width / 2, height / 2)
-                }
+            val centerPixel =
+                captureToImage().asAndroidBitmap().run { getPixel(width / 2, height / 2) }
 
             // Alpha shouldn't have changed, since we don't retarget existing interactions
             val expectedColor =
@@ -508,18 +458,12 @@
             Truth.assertThat(Color(centerPixel)).isEqualTo(expectedColor)
         }
 
-        rule.runOnIdle {
-            scope!!.launch {
-                interactionSource.emit(FocusInteraction.Focus())
-            }
-        }
+        rule.runOnIdle { scope!!.launch { interactionSource.emit(FocusInteraction.Focus()) } }
         rule.waitForIdle()
 
         with(rule.onNodeWithTag(Tag)) {
-            val centerPixel = captureToImage().asAndroidBitmap()
-                .run {
-                    getPixel(width / 2, height / 2)
-                }
+            val centerPixel =
+                captureToImage().asAndroidBitmap().run { getPixel(width / 2, height / 2) }
 
             // Now that we animate to a new state layer, the new ripple alpha should be used
             val expectedColor =
@@ -538,7 +482,7 @@
      * @param interactionSource the [MutableInteractionSource] driving the ripple
      * @param interaction the [Interaction] to assert for
      * @param expectedCenterPixelColor the expected color for the pixel at the center of the
-     * [RippleBoxWithBackground]
+     *   [RippleBoxWithBackground]
      */
     private fun assertRippleMatches(
         scope: CoroutineScope,
@@ -552,11 +496,7 @@
         }
 
         // Start ripple
-        rule.runOnIdle {
-            scope.launch {
-                interactionSource.emit(interaction)
-            }
-        }
+        rule.runOnIdle { scope.launch { interactionSource.emit(interaction) } }
 
         // Advance to the end of the ripple / state layer animation
         rule.waitForIdle()
@@ -570,10 +510,8 @@
         }
 
         // Compare expected and actual pixel color
-        val centerPixel = rule.onNodeWithTag(Tag)
-            .captureToImage()
-            .asAndroidBitmap()
-            .run {
+        val centerPixel =
+            rule.onNodeWithTag(Tag).captureToImage().asAndroidBitmap().run {
                 getPixel(width / 2, height / 2)
             }
 
@@ -583,8 +521,8 @@
 
 /**
  * Generic Button like component with a border that allows injecting an [Indication], and has a
- * background with the same color around it - this makes the ripple contrast better and make it
- * more visible in screenshots.
+ * background with the same color around it - this makes the ripple contrast better and make it more
+ * visible in screenshots.
  *
  * @param interactionSource the [MutableInteractionSource] that is used to drive the ripple state
  * @param ripple ripple [Indication] placed inside the surface
@@ -597,44 +535,35 @@
     bounded: Boolean
 ) {
     Box(Modifier.semantics(mergeDescendants = true) {}.testTag(Tag)) {
-        Box(
-            Modifier.padding(25.dp).background(RippleBoxBackgroundColor)
-        ) {
+        Box(Modifier.padding(25.dp).background(RippleBoxBackgroundColor)) {
             val shape = RoundedCornerShape(20)
             // If the ripple is bounded, we want to clip to the shape, otherwise don't clip as
             // the ripple should draw outside the bounds.
             val clip = if (bounded) Modifier.clip(shape) else Modifier
             Box(
-                Modifier.padding(25.dp).width(40.dp).height(40.dp)
+                Modifier.padding(25.dp)
+                    .width(40.dp)
+                    .height(40.dp)
                     .border(BorderStroke(2.dp, Color.Black), shape)
                     .background(color = RippleBoxBackgroundColor, shape = shape)
                     .then(clip)
-                    .indication(
-                        interactionSource = interactionSource,
-                        indication = ripple
-                    )
+                    .indication(interactionSource = interactionSource, indication = ripple)
             ) {}
         }
     }
 }
 
 /**
- * Blends ([contentColor] with [rippleOpacity]) on top of [RippleBoxBackgroundColor] to provide
- * the resulting RGB color that can be used for pixel comparison.
+ * Blends ([contentColor] with [rippleOpacity]) on top of [RippleBoxBackgroundColor] to provide the
+ * resulting RGB color that can be used for pixel comparison.
  */
-private fun calculateResultingRippleColor(
-    contentColor: Color,
-    rippleOpacity: Float
-) = contentColor.copy(alpha = rippleOpacity).compositeOver(RippleBoxBackgroundColor)
+private fun calculateResultingRippleColor(contentColor: Color, rippleOpacity: Float) =
+    contentColor.copy(alpha = rippleOpacity).compositeOver(RippleBoxBackgroundColor)
 
 private val TestRippleColor = Color.Red
 
-private val TestRippleAlpha = RippleAlpha(
-    draggedAlpha = 0.1f,
-    focusedAlpha = 0.2f,
-    hoveredAlpha = 0.3f,
-    pressedAlpha = 0.4f
-)
+private val TestRippleAlpha =
+    RippleAlpha(draggedAlpha = 0.1f, focusedAlpha = 0.2f, hoveredAlpha = 0.3f, pressedAlpha = 0.4f)
 
 private val RippleBoxBackgroundColor = Color.Blue
 
diff --git a/compose/material/material-ripple/src/androidMain/kotlin/androidx/compose/material/ripple/Ripple.android.kt b/compose/material/material-ripple/src/androidMain/kotlin/androidx/compose/material/ripple/Ripple.android.kt
index 766e2de5..6c8b99c 100644
--- a/compose/material/material-ripple/src/androidMain/kotlin/androidx/compose/material/ripple/Ripple.android.kt
+++ b/compose/material/material-ripple/src/androidMain/kotlin/androidx/compose/material/ripple/Ripple.android.kt
@@ -47,9 +47,9 @@
 
 /**
  * Android specific Ripple implementation that uses a [RippleDrawable] under the hood, which allows
- * rendering the ripple animation on the render thread (away from the main UI thread). This
- * allows the ripple to animate smoothly even while the UI thread is under heavy load, such as
- * when navigating between complex screens.
+ * rendering the ripple animation on the render thread (away from the main UI thread). This allows
+ * the ripple to animate smoothly even while the UI thread is under heavy load, such as when
+ * navigating between complex screens.
  *
  * @see RippleNode
  */
@@ -69,20 +69,18 @@
 
 /**
  * Android specific Ripple implementation that uses a [RippleDrawable] under the hood, which allows
- * rendering the ripple animation on the render thread (away from the main UI thread). This
- * allows the ripple to animate smoothly even while the UI thread is under heavy load, such as
- * when navigating between complex screens.
+ * rendering the ripple animation on the render thread (away from the main UI thread). This allows
+ * the ripple to animate smoothly even while the UI thread is under heavy load, such as when
+ * navigating between complex screens.
  *
  * @see Ripple
  */
 @Suppress("DEPRECATION")
 @Deprecated("Replaced by the new RippleNode implementation")
 @Stable
-internal actual class PlatformRipple actual constructor(
-    bounded: Boolean,
-    radius: Dp,
-    color: State<Color>
-) : Ripple(bounded, radius, color) {
+internal actual class PlatformRipple
+actual constructor(bounded: Boolean, radius: Dp, color: State<Color>) :
+    Ripple(bounded, radius, color) {
     @Composable
     actual override fun rememberUpdatedRippleInstance(
         interactionSource: InteractionSource,
@@ -99,8 +97,8 @@
 }
 
 /**
- * Android specific [RippleNode]. This uses a [RippleHostView] provided by [rippleContainer] to
- * draw ripples in the drawing bounds provided within [draw].
+ * Android specific [RippleNode]. This uses a [RippleHostView] provided by [rippleContainer] to draw
+ * ripples in the drawing bounds provided within [draw].
  *
  * The state layer is still handled by [stateLayer], and drawn inside Compose.
  */
@@ -112,14 +110,12 @@
     rippleAlpha: () -> RippleAlpha
 ) : RippleNode(interactionSource, bounded, radius, color, rippleAlpha), RippleHostKey {
     /**
-     * [RippleContainer] attached to the nearest [ViewGroup]. If it hasn't already been
-     * created by a another ripple, we will create it and attach it to the hierarchy.
+     * [RippleContainer] attached to the nearest [ViewGroup]. If it hasn't already been created by a
+     * another ripple, we will create it and attach it to the hierarchy.
      */
     private var rippleContainer: RippleContainer? = null
 
-    /**
-     * Backing [RippleHostView] used to draw ripples for this [RippleIndicationInstance].
-     */
+    /** Backing [RippleHostView] used to draw ripples for this [RippleIndicationInstance]. */
     private var rippleHostView: RippleHostView? = null
         set(value) {
             field = value
@@ -153,19 +149,20 @@
     }
 
     override fun addRipple(interaction: PressInteraction.Press, size: Size, targetRadius: Float) {
-        rippleHostView = with(getOrCreateRippleContainer()) {
-            getRippleHostView().apply {
-                addRipple(
-                    interaction = interaction,
-                    bounded = bounded,
-                    size = size,
-                    radius = targetRadius.roundToInt(),
-                    color = rippleColor,
-                    alpha = rippleAlpha().pressedAlpha,
-                    onInvalidateRipple = { invalidateDraw() }
-                )
+        rippleHostView =
+            with(getOrCreateRippleContainer()) {
+                getRippleHostView().apply {
+                    addRipple(
+                        interaction = interaction,
+                        bounded = bounded,
+                        size = size,
+                        radius = targetRadius.roundToInt(),
+                        color = rippleColor,
+                        alpha = rippleAlpha().pressedAlpha,
+                        onInvalidateRipple = { invalidateDraw() }
+                    )
+                }
             }
-        }
     }
 
     override fun removeRipple(interaction: PressInteraction.Press) {
@@ -173,9 +170,7 @@
     }
 
     override fun onDetach() {
-        rippleContainer?.run {
-            disposeRippleIfNeeded()
-        }
+        rippleContainer?.run { disposeRippleIfNeeded() }
     }
 
     override fun onResetRippleHostView() {
@@ -221,42 +216,38 @@
     /**
      * State we use to cause invalidations in Compose when the drawable requests an invalidation -
      * since we read this in the draw scope this is equivalent to manually invalidating the internal
-     * layer. This is needed as layers internal to the underlying LayoutNode, which we also
-     * cannot access from here.
+     * layer. This is needed as layers internal to the underlying LayoutNode, which we also cannot
+     * access from here.
      */
     private var invalidateTick by mutableStateOf(true)
 
     /**
      * Cache the size of the canvas we will draw the ripple into - this is updated each time
-     * [drawIndication] is called. This is needed as before we start animating the ripple, we
-     * need to know its size (changing the bounds mid-animation will cause us to continue the
-     * animation on the UI thread, not the render thread), but the size is only known inside the
-     * draw scope.
+     * [drawIndication] is called. This is needed as before we start animating the ripple, we need
+     * to know its size (changing the bounds mid-animation will cause us to continue the animation
+     * on the UI thread, not the render thread), but the size is only known inside the draw scope.
      */
     private var rippleSize: Size = Size.Zero
 
     private var rippleRadius: Int = -1
 
-    /**
-     * Flip [invalidateTick] to cause a re-draw when the ripple requests invalidation.
-     */
-    private val onInvalidateRipple = {
-        invalidateTick = !invalidateTick
-    }
+    /** Flip [invalidateTick] to cause a re-draw when the ripple requests invalidation. */
+    private val onInvalidateRipple = { invalidateTick = !invalidateTick }
 
     override fun ContentDrawScope.drawIndication() {
         // Update size and radius properties needed by addRipple()
 
         rippleSize = size
 
-        rippleRadius = if (radius.isUnspecified) {
-            // Explicitly calculate the radius instead of using RippleDrawable.RADIUS_AUTO
-            // since the latest spec does not match with the existing radius calculation in the
-            // framework.
-            getRippleEndRadius(bounded, size).roundToInt()
-        } else {
-            radius.roundToPx()
-        }
+        rippleRadius =
+            if (radius.isUnspecified) {
+                // Explicitly calculate the radius instead of using RippleDrawable.RADIUS_AUTO
+                // since the latest spec does not match with the existing radius calculation in the
+                // framework.
+                getRippleEndRadius(bounded, size).roundToInt()
+            } else {
+                radius.roundToPx()
+            }
 
         val color = color.value
         val alpha = rippleAlpha.value.pressedAlpha
@@ -274,11 +265,7 @@
                 // currently drawn ripples if the ripples are being drawn on the RenderThread,
                 // since only the software paint is updated, not the hardware paint used in
                 // RippleForeground.
-                setRippleProperties(
-                    size = size,
-                    color = color,
-                    alpha = alpha
-                )
+                setRippleProperties(size = size, color = color, alpha = alpha)
 
                 draw(canvas.nativeCanvas)
             }
@@ -286,19 +273,20 @@
     }
 
     override fun addRipple(interaction: PressInteraction.Press, scope: CoroutineScope) {
-        rippleHostView = with(getOrCreateRippleContainer()) {
-            getRippleHostView().apply {
-                addRipple(
-                    interaction = interaction,
-                    bounded = bounded,
-                    size = rippleSize,
-                    radius = rippleRadius,
-                    color = color.value,
-                    alpha = rippleAlpha.value.pressedAlpha,
-                    onInvalidateRipple = onInvalidateRipple
-                )
+        rippleHostView =
+            with(getOrCreateRippleContainer()) {
+                getRippleHostView().apply {
+                    addRipple(
+                        interaction = interaction,
+                        bounded = bounded,
+                        size = rippleSize,
+                        radius = rippleRadius,
+                        color = color.value,
+                        alpha = rippleAlpha.value.pressedAlpha,
+                        onInvalidateRipple = onInvalidateRipple
+                    )
+                }
             }
-        }
     }
 
     override fun removeRipple(interaction: PressInteraction.Press) {
@@ -316,9 +304,7 @@
     }
 
     private fun dispose() {
-        rippleContainer?.run {
-            disposeRippleIfNeeded()
-        }
+        rippleContainer?.run { disposeRippleIfNeeded() }
     }
 
     override fun onResetRippleHostView() {
@@ -342,18 +328,16 @@
     }
 
     // Create a new RippleContainer if needed and add to the hierarchy
-    return RippleContainer(view.context).apply {
-        view.addView(this)
-    }
+    return RippleContainer(view.context).apply { view.addView(this) }
 }
 
 /**
- * Returns [initialView] if it is a [ViewGroup], otherwise the nearest parent [ViewGroup] that
- * we will add a [RippleContainer] to.
+ * Returns [initialView] if it is a [ViewGroup], otherwise the nearest parent [ViewGroup] that we
+ * will add a [RippleContainer] to.
  *
- * In all normal scenarios this should just be [LocalView], but since [LocalView] is public
- * API theoretically its value can be overridden with a non-[ViewGroup], so we walk up the
- * tree to be safe.
+ * In all normal scenarios this should just be [LocalView], but since [LocalView] is public API
+ * theoretically its value can be overridden with a non-[ViewGroup], so we walk up the tree to be
+ * safe.
  */
 private fun findNearestViewGroup(initialView: View): ViewGroup {
     var view: View = initialView
diff --git a/compose/material/material-ripple/src/androidMain/kotlin/androidx/compose/material/ripple/RippleContainer.android.kt b/compose/material/material-ripple/src/androidMain/kotlin/androidx/compose/material/ripple/RippleContainer.android.kt
index 30c28cb..3b20635 100644
--- a/compose/material/material-ripple/src/androidMain/kotlin/androidx/compose/material/ripple/RippleContainer.android.kt
+++ b/compose/material/material-ripple/src/androidMain/kotlin/androidx/compose/material/ripple/RippleContainer.android.kt
@@ -40,24 +40,18 @@
      */
     private val MaxRippleHosts = 5
 
-    /**
-     * [RippleHostView]s that will be assigned to [RippleHostKey]s when
-     * necessary.
-     */
+    /** [RippleHostView]s that will be assigned to [RippleHostKey]s when necessary. */
     private val rippleHosts = mutableListOf<RippleHostView>()
 
     /**
-     * [RippleHostView]s that are not currently assigned to any
-     * [RippleHostKey], so they can be reused without needing to allocate new
-     * instances.
+     * [RippleHostView]s that are not currently assigned to any [RippleHostKey], so they can be
+     * reused without needing to allocate new instances.
      */
     private val unusedRippleHosts = mutableListOf<RippleHostView>()
 
     private val rippleHostMap = RippleHostMap()
 
-    /**
-     * Index of the next host that will be assigned to a ripple
-     */
+    /** Index of the next host that will be assigned to a ripple */
     private var nextHostIndex = 0
 
     init {
@@ -93,8 +87,8 @@
     }
 
     /**
-     * @return a [RippleHostView] for [this] [RippleHostKey]. This result will
-     * be cached if possible, to allow re-using the same [RippleHostView].
+     * @return a [RippleHostView] for [this] [RippleHostKey]. This result will be cached if
+     *   possible, to allow re-using the same [RippleHostView].
      */
     fun RippleHostKey.getRippleHostView(): RippleHostView {
         val existingRippleHostView = rippleHostMap[this]
@@ -108,32 +102,33 @@
         if (rippleHostView == null) {
             // If the next host is larger than the current index, we haven't reached maximum
             // capacity yet and so we need to allocate a new RippleHostView
-            rippleHostView = if (nextHostIndex > rippleHosts.lastIndex) {
-                RippleHostView(context).also {
-                    // Add this host to the view hierarchy
-                    addView(it)
-                    // And add it to the list of hosts
-                    rippleHosts += it
-                }
-            } else {
-                // Otherwise we are looping through the current hosts and re-using an existing,
-                // un-disposed host
-                val host = rippleHosts[nextHostIndex]
+            rippleHostView =
+                if (nextHostIndex > rippleHosts.lastIndex) {
+                    RippleHostView(context).also {
+                        // Add this host to the view hierarchy
+                        addView(it)
+                        // And add it to the list of hosts
+                        rippleHosts += it
+                    }
+                } else {
+                    // Otherwise we are looping through the current hosts and re-using an existing,
+                    // un-disposed host
+                    val host = rippleHosts[nextHostIndex]
 
-                // Since this host was re-used, and not in the unused host list, it may still be
-                // linked to an instance
-                val existingInstance = rippleHostMap[host]
+                    // Since this host was re-used, and not in the unused host list, it may still be
+                    // linked to an instance
+                    val existingInstance = rippleHostMap[host]
 
-                // TODO: possible future optimization
-                //  Consider checking to see if the existing ripple is still drawing, and if so,
-                //  create a new RippleHostView one instead of reassigning
-                if (existingInstance != null) {
-                    existingInstance.onResetRippleHostView()
-                    rippleHostMap.remove(existingInstance)
-                    host.disposeRipple()
+                    // TODO: possible future optimization
+                    //  Consider checking to see if the existing ripple is still drawing, and if so,
+                    //  create a new RippleHostView one instead of reassigning
+                    if (existingInstance != null) {
+                        existingInstance.onResetRippleHostView()
+                        rippleHostMap.remove(existingInstance)
+                        host.disposeRipple()
+                    }
+                    host
                 }
-                host
-            }
 
             // Update the index for the next host - loop around if we reach the maximum capacity
             if (nextHostIndex < MaxRippleHosts - 1) {
@@ -149,8 +144,8 @@
     }
 
     /**
-     * Unassigns the current [RippleHostView] from [this] [RippleHostKey] and
-     * resets its state, so it can be used by another [RippleHostKey].
+     * Unassigns the current [RippleHostView] from [this] [RippleHostKey] and resets its state, so
+     * it can be used by another [RippleHostKey].
      */
     fun RippleHostKey.disposeRippleIfNeeded() {
         onResetRippleHostView()
@@ -165,19 +160,12 @@
     }
 }
 
-/**
- * Simple bidirectional map for [RippleHostKey] : [RippleHostView].
- */
+/** Simple bidirectional map for [RippleHostKey] : [RippleHostView]. */
 private class RippleHostMap {
-    private val indicationToHostMap =
-        mutableMapOf<RippleHostKey, RippleHostView>()
-    private val hostToIndicationMap =
-        mutableMapOf<RippleHostView, RippleHostKey>()
+    private val indicationToHostMap = mutableMapOf<RippleHostKey, RippleHostView>()
+    private val hostToIndicationMap = mutableMapOf<RippleHostView, RippleHostKey>()
 
-    operator fun set(
-        indicationInstance: RippleHostKey,
-        rippleHostView: RippleHostView
-    ) {
+    operator fun set(indicationInstance: RippleHostKey, rippleHostView: RippleHostView) {
         indicationToHostMap[indicationInstance] = rippleHostView
         hostToIndicationMap[rippleHostView] = indicationInstance
     }
diff --git a/compose/material/material-ripple/src/androidMain/kotlin/androidx/compose/material/ripple/RippleHostView.android.kt b/compose/material/material-ripple/src/androidMain/kotlin/androidx/compose/material/ripple/RippleHostView.android.kt
index aa462e2..27114af 100644
--- a/compose/material/material-ripple/src/androidMain/kotlin/androidx/compose/material/ripple/RippleHostView.android.kt
+++ b/compose/material/material-ripple/src/androidMain/kotlin/androidx/compose/material/ripple/RippleHostView.android.kt
@@ -35,21 +35,16 @@
 import kotlin.math.roundToInt
 
 /**
- * Empty [View] that hosts a [RippleDrawable] as its background. This is needed as
- * [RippleDrawable]s cannot currently be drawn directly to a [android.graphics.RenderNode]
- * (b/184760109), so instead we rely on [View]'s internal implementation to draw to the
- * background [android.graphics.RenderNode].
+ * Empty [View] that hosts a [RippleDrawable] as its background. This is needed as [RippleDrawable]s
+ * cannot currently be drawn directly to a [android.graphics.RenderNode] (b/184760109), so instead
+ * we rely on [View]'s internal implementation to draw to the background
+ * [android.graphics.RenderNode].
  *
  * A [RippleContainer] is used to manage and assign RippleHostViews when needed - see
  * [RippleContainer.getRippleHostView].
  */
-internal class RippleHostView(
-    context: Context
-) : View(context) {
-    /**
-     * View related configuration
-     */
-
+internal class RippleHostView(context: Context) : View(context) {
+    /** View related configuration */
     override fun onMeasure(widthMeasureSpec: Int, heightMeasureSpec: Int) {
         setMeasuredDimension(0, 0)
     }
@@ -65,10 +60,10 @@
 
     /**
      * A [RippleDrawable] cannot be dynamically changed between bounded / unbounded states - as a
-     * result we need to create a new instance when we need to draw a different type.
-     * Alternatively we could maintain both a bounded and unbounded instance, but we would still
-     * need to reset state for both, and change what the view's background is - so it doesn't
-     * help us out that much.
+     * result we need to create a new instance when we need to draw a different type. Alternatively
+     * we could maintain both a bounded and unbounded instance, but we would still need to reset
+     * state for both, and change what the view's background is - so it doesn't help us out that
+     * much.
      */
     private var ripple: UnprojectedRipple? = null
     private var bounded: Boolean? = null
@@ -84,29 +79,31 @@
     /**
      * Creates a new [UnprojectedRipple] and assigns it to [ripple].
      *
-     * @param bounded whether the [UnprojectedRipple] is bounded (fills the bounds of the
-     * containing canvas, or unbounded (starts from the center of the canvas and fills outwards
-     * in a circle that may go outside the bounds of the canvas).
+     * @param bounded whether the [UnprojectedRipple] is bounded (fills the bounds of the containing
+     *   canvas, or unbounded (starts from the center of the canvas and fills outwards in a circle
+     *   that may go outside the bounds of the canvas).
      */
     private fun createRipple(bounded: Boolean) {
-        ripple = UnprojectedRipple(bounded).apply {
-            // Set the ripple to be the view's background - this will internally set the ripple's
-            // Drawable.Callback callback to equal this view so there is no need to manage this
-            // separately.
-            background = this
-        }
+        ripple =
+            UnprojectedRipple(bounded).apply {
+                // Set the ripple to be the view's background - this will internally set the
+                // ripple's
+                // Drawable.Callback callback to equal this view so there is no need to manage this
+                // separately.
+                background = this
+            }
     }
 
     /**
-     * Callback invoked when the underlying [RippleDrawable] requests to be
-     * invalidated - this callback should end up triggering a re-draw in the owning ripple instance.
+     * Callback invoked when the underlying [RippleDrawable] requests to be invalidated - this
+     * callback should end up triggering a re-draw in the owning ripple instance.
      */
     private var onInvalidateRipple: (() -> Unit)? = null
 
     /**
      * Pass through any drawable invalidations to the owning ripple instance - the normal
-     * [View.invalidate] circuitry won't trigger a re-draw / re-composition inside of Compose out
-     * of the box.
+     * [View.invalidate] circuitry won't trigger a re-draw / re-composition inside of Compose out of
+     * the box.
      */
     override fun invalidateDrawable(who: Drawable) {
         onInvalidateRipple?.invoke()
@@ -145,10 +142,7 @@
             // this change in spec was never made, so they currently animate from the press
             // position into a circle that starts at the center of the ripple, instead of
             // starting directly at the center.
-            ripple.setHotspot(
-                ripple.bounds.centerX().toFloat(),
-                ripple.bounds.centerY().toFloat()
-            )
+            ripple.setHotspot(ripple.bounds.centerX().toFloat(), ripple.bounds.centerY().toFloat())
         }
         setRippleState(pressed = true)
     }
@@ -161,26 +155,15 @@
         setRippleState(pressed = false)
     }
 
-    /**
-     * Update the underlying [RippleDrawable] with the new properties.
-     */
-    fun setRippleProperties(
-        size: Size,
-        color: Color,
-        alpha: Float
-    ) {
+    /** Update the underlying [RippleDrawable] with the new properties. */
+    fun setRippleProperties(size: Size, color: Color, alpha: Float) {
         val ripple = ripple ?: return
         // NOTE: if adding new properties here, make sure they are guarded with an equality check
         // (either here or internally in RippleDrawable). Many properties invalidate the ripple when
         // changed, which will lead to a call to updateRippleProperties again, which will cause
         // another invalidation, etc.
         ripple.setColor(color, alpha)
-        val newBounds = Rect(
-            0,
-            0,
-            size.width.roundToInt(),
-            size.height.roundToInt()
-        )
+        val newBounds = Rect(0, 0, size.width.roundToInt(), size.height.roundToInt())
         // Drawing the background causes the view to update the bounds of the drawable
         // based on the view's bounds, so we need to adjust the view itself to match the
         // canvas' bounds.
@@ -192,9 +175,7 @@
         ripple.bounds = newBounds
     }
 
-    /**
-     * Remove existing callbacks and clear any currently drawing ripples.
-     */
+    /** Remove existing callbacks and clear any currently drawing ripples. */
     fun disposeRipple() {
         onInvalidateRipple = null
         if (resetRippleRunnable != null) {
@@ -246,15 +227,15 @@
          * than this it is possible that the value of [AnimationUtils.currentAnimationTimeMillis]
          * might be different between where we check in [setRippleState], and where it is checked
          * inside [RippleDrawable] - so even if it appears different here, it might be the same
-         * value inside [RippleDrawable]. As a result if the time is smaller than this, we post
-         * the resting state change to be safe.
+         * value inside [RippleDrawable]. As a result if the time is smaller than this, we post the
+         * resting state change to be safe.
          */
         private const val MinimumRippleStateChangeTime = 5L
 
         /**
          * Delay between moving to [PressedState] and [RestingState], to ensure that the move to
-         * [RestingState] happens on a new value for [AnimationUtils.currentAnimationTimeMillis],
-         * so the ripple will cleanly animate out instead of instantly cancelling.
+         * [RestingState] happens on a new value for [AnimationUtils.currentAnimationTimeMillis], so
+         * the ripple will cleanly animate out instead of instantly cancelling.
          *
          * The actual value of this number doesn't matter, provided it is long enough that it is
          * guaranteed to happen on another frame / value for
@@ -263,10 +244,8 @@
          */
         private const val ResetRippleDelayDuration = 50L
 
-        private val PressedState = intArrayOf(
-            android.R.attr.state_pressed,
-            android.R.attr.state_enabled
-        )
+        private val PressedState =
+            intArrayOf(android.R.attr.state_pressed, android.R.attr.state_enabled)
         private val RestingState = intArrayOf()
     }
 }
@@ -277,14 +256,16 @@
  * owning [View]'s drawing is not clipped, which it won't be in Compose, so we can always return
  * `false` and just draw outside of the bounds if we need to.
  */
-private class UnprojectedRipple(private val bounded: Boolean) : RippleDrawable(
-    // Temporary default color that we will override later
-    /* color */ ColorStateList.valueOf(android.graphics.Color.BLACK),
-    /* content */null,
-    // The color of the mask here doesn't matter - we just need a mask to draw the bounded ripple
-    // against
-    /* mask */ if (bounded) ColorDrawable(android.graphics.Color.WHITE) else null
-) {
+private class UnprojectedRipple(private val bounded: Boolean) :
+    RippleDrawable(
+        // Temporary default color that we will override later
+        /* color */ ColorStateList.valueOf(android.graphics.Color.BLACK),
+        /* content */ null,
+        // The color of the mask here doesn't matter - we just need a mask to draw the bounded
+        // ripple
+        // against
+        /* mask */ if (bounded) ColorDrawable(android.graphics.Color.WHITE) else null
+    ) {
     /**
      * Store the ripple color so we can compare it later, as there is no way to get the currently
      * set color on the RippleDrawable itself.
@@ -292,14 +273,12 @@
     private var rippleColor: Color? = null
 
     /**
-     * Store the ripple radius so we can compare it later - [getRadius] is only available on M+,
-     * and we don't want to use reflection to read this below that.
+     * Store the ripple radius so we can compare it later - [getRadius] is only available on M+, and
+     * we don't want to use reflection to read this below that.
      */
     private var rippleRadius: Int? = null
 
-    /**
-     * Set a new [color] with [alpha] for this [RippleDrawable].
-     */
+    /** Set a new [color] with [alpha] for this [RippleDrawable]. */
     fun setColor(color: Color, alpha: Float) {
         val newColor = calculateRippleColor(color, alpha)
         if (rippleColor != newColor) {
@@ -311,8 +290,8 @@
     private var projected = false
 
     /**
-     * Return false (other than when calculating dirty bounds, see [getDirtyBounds]) to ensure
-     * that this [RippleDrawable] will be drawn inside the owning [View]'s RenderNode, and not an
+     * Return false (other than when calculating dirty bounds, see [getDirtyBounds]) to ensure that
+     * this [RippleDrawable] will be drawn inside the owning [View]'s RenderNode, and not an
      * ancestor that supports projection.
      */
     override fun isProjected(): Boolean {
@@ -320,10 +299,10 @@
     }
 
     /**
-     * On older API levels [isProjected] is used to control whether the dirty bounds (and hence
-     * how the ripple is clipped) are bounded / unbounded. Since we turn off projection for this
-     * ripple, if the ripple is unbounded we temporarily set isProjected to return true, so the
-     * super implementation will return us the correct bounds for an unbounded ripple.
+     * On older API levels [isProjected] is used to control whether the dirty bounds (and hence how
+     * the ripple is clipped) are bounded / unbounded. Since we turn off projection for this ripple,
+     * if the ripple is unbounded we temporarily set isProjected to return true, so the super
+     * implementation will return us the correct bounds for an unbounded ripple.
      */
     override fun getDirtyBounds(): Rect {
         if (!bounded) {
@@ -335,8 +314,8 @@
     }
 
     /**
-     * Compat wrapper for [setRadius] which is only available on [Build.VERSION_CODES.M] and
-     * above. This will try to call setMaxRadius below that if possible.
+     * Compat wrapper for [setRadius] which is only available on [Build.VERSION_CODES.M] and above.
+     * This will try to call setMaxRadius below that if possible.
      */
     fun trySetRadius(radius: Int) {
         if (rippleRadius != radius) {
@@ -345,10 +324,10 @@
                 try {
                     if (!setMaxRadiusFetched) {
                         setMaxRadiusFetched = true
-                        setMaxRadiusMethod = RippleDrawable::class.java.getDeclaredMethod(
-                            "setMaxRadius",
-                            Int::class.javaPrimitiveType
-                        )
+                        setMaxRadiusMethod =
+                            RippleDrawable::class
+                                .java
+                                .getDeclaredMethod("setMaxRadius", Int::class.javaPrimitiveType)
                     }
                     setMaxRadiusMethod?.invoke(this, radius)
                 } catch (e: Exception) {
@@ -371,24 +350,22 @@
         // original amount, so to ensure that the contrast is correct, and make the ripple alpha
         // match more closely with the provided value, we double it first.
         // Note that this is also consistent with MDC behavior.
-        val transformedAlpha = if (Build.VERSION.SDK_INT < Build.VERSION_CODES.P) {
-            alpha * 2
-        } else {
-            // Note: above 28 the ripple alpha is clamped to 50%, so this might not be the
-            // _actual_ alpha that is used in the ripple.
-            alpha
-        }.coerceAtMost(1f)
+        val transformedAlpha =
+            if (Build.VERSION.SDK_INT < Build.VERSION_CODES.P) {
+                    alpha * 2
+                } else {
+                    // Note: above 28 the ripple alpha is clamped to 50%, so this might not be the
+                    // _actual_ alpha that is used in the ripple.
+                    alpha
+                }
+                .coerceAtMost(1f)
         return color.copy(alpha = transformedAlpha)
     }
 
-    /**
-     * Separate class to avoid verification errors for methods introduced in M.
-     */
+    /** Separate class to avoid verification errors for methods introduced in M. */
     @RequiresApi(Build.VERSION_CODES.M)
     private object MRadiusHelper {
-        /**
-         * Sets the [radius] for the given [ripple].
-         */
+        /** Sets the [radius] for the given [ripple]. */
         @DoNotInline
         fun setRadius(ripple: RippleDrawable, radius: Int) {
             ripple.radius = radius
@@ -396,9 +373,7 @@
     }
 
     companion object {
-        /**
-         * Cache RippleDrawable#setMaxRadius to avoid retrieving it more times than necessary
-         */
+        /** Cache RippleDrawable#setMaxRadius to avoid retrieving it more times than necessary */
         private var setMaxRadiusMethod: Method? = null
         private var setMaxRadiusFetched = false
     }
diff --git a/compose/material/material-ripple/src/androidUnitTest/kotlin/androidx/compose/material/ripple/RippleAnimationTest.kt b/compose/material/material-ripple/src/androidUnitTest/kotlin/androidx/compose/material/ripple/RippleAnimationTest.kt
index 2bb2aec..8e7dfb5 100644
--- a/compose/material/material-ripple/src/androidUnitTest/kotlin/androidx/compose/material/ripple/RippleAnimationTest.kt
+++ b/compose/material/material-ripple/src/androidUnitTest/kotlin/androidx/compose/material/ripple/RippleAnimationTest.kt
@@ -43,10 +43,11 @@
         val height = 160f
         val size = Size(width, height)
         val density = Density(2f)
-        val expectedRadius = with(density) {
-            // 10 is an extra offset from spec
-            halfDistance(width, height) + 10.dp.toPx()
-        }
+        val expectedRadius =
+            with(density) {
+                // 10 is an extra offset from spec
+                halfDistance(width, height) + 10.dp.toPx()
+            }
         val result = with(density) { getRippleEndRadius(true, size) }
         assertThat(result).isEqualTo(expectedRadius)
     }
diff --git a/compose/material/material-ripple/src/commonMain/kotlin/androidx/compose/material/ripple/CommonRipple.kt b/compose/material/material-ripple/src/commonMain/kotlin/androidx/compose/material/ripple/CommonRipple.kt
index 7dfe12a..50cdde5 100644
--- a/compose/material/material-ripple/src/commonMain/kotlin/androidx/compose/material/ripple/CommonRipple.kt
+++ b/compose/material/material-ripple/src/commonMain/kotlin/androidx/compose/material/ripple/CommonRipple.kt
@@ -37,19 +37,16 @@
 import kotlinx.coroutines.launch
 
 /**
- * Common Ripple implementation that directly animates and draws to the underlying canvas
- * provided by [ContentDrawScope].
+ * Common Ripple implementation that directly animates and draws to the underlying canvas provided
+ * by [ContentDrawScope].
  *
  * @see Ripple
  */
 @Suppress("DEPRECATION")
 @Deprecated("Replaced by the new RippleNode implementation")
 @Stable
-internal class CommonRipple(
-    bounded: Boolean,
-    radius: Dp,
-    color: State<Color>
-) : Ripple(bounded, radius, color) {
+internal class CommonRipple(bounded: Boolean, radius: Dp, color: State<Color>) :
+    Ripple(bounded, radius, color) {
     @Composable
     override fun rememberUpdatedRippleInstance(
         interactionSource: InteractionSource,
@@ -77,11 +74,8 @@
         // Finish existing ripples
         ripples.forEach { _, ripple -> ripple.finish() }
         val origin = if (bounded) interaction.pressPosition else null
-        val rippleAnimation = RippleAnimation(
-            origin = origin,
-            radius = targetRadius,
-            bounded = bounded
-        )
+        val rippleAnimation =
+            RippleAnimation(origin = origin, radius = targetRadius, bounded = bounded)
         ripples[interaction] = rippleAnimation
         coroutineScope.launch {
             try {
@@ -101,11 +95,7 @@
     override fun DrawScope.drawRipples() {
         val alpha = rippleAlpha().pressedAlpha
         if (alpha != 0f) {
-            ripples.forEach { _, ripple ->
-                with(ripple) {
-                    draw(rippleColor.copy(alpha = alpha))
-                }
-            }
+            ripples.forEach { _, ripple -> with(ripple) { draw(rippleColor.copy(alpha = alpha)) } }
         }
     }
 
@@ -127,11 +117,12 @@
     private var targetRadius = Float.NaN
 
     override fun ContentDrawScope.drawIndication() {
-        targetRadius = if (radius.isUnspecified) {
-            getRippleEndRadius(bounded, size)
-        } else {
-            radius.toPx()
-        }
+        targetRadius =
+            if (radius.isUnspecified) {
+                getRippleEndRadius(bounded, size)
+            } else {
+                radius.toPx()
+            }
         val color = color.value
         drawContent()
         drawStateLayer(radius, color)
@@ -142,11 +133,8 @@
         // Finish existing ripples
         ripples.forEach { (_, ripple) -> ripple.finish() }
         val origin = if (bounded) interaction.pressPosition else null
-        val rippleAnimation = RippleAnimation(
-            origin = origin,
-            radius = targetRadius,
-            bounded = bounded
-        )
+        val rippleAnimation =
+            RippleAnimation(origin = origin, radius = targetRadius, bounded = bounded)
         ripples[interaction] = rippleAnimation
         scope.launch {
             try {
diff --git a/compose/material/material-ripple/src/commonMain/kotlin/androidx/compose/material/ripple/Ripple.kt b/compose/material/material-ripple/src/commonMain/kotlin/androidx/compose/material/ripple/Ripple.kt
index d747be5f..ea86a2e 100644
--- a/compose/material/material-ripple/src/commonMain/kotlin/androidx/compose/material/ripple/Ripple.kt
+++ b/compose/material/material-ripple/src/commonMain/kotlin/androidx/compose/material/ripple/Ripple.kt
@@ -59,12 +59,12 @@
 /**
  * Creates a Ripple node using the values provided.
  *
- * A Ripple is a Material implementation of [Indication] that expresses different [Interaction]s
- * by drawing ripple animations and state layers.
+ * A Ripple is a Material implementation of [Indication] that expresses different [Interaction]s by
+ * drawing ripple animations and state layers.
  *
- * A Ripple responds to [PressInteraction.Press] by starting a new [RippleAnimation], and
- * responds to other [Interaction]s by showing a fixed [StateLayer] with varying alpha values
- * depending on the [Interaction].
+ * A Ripple responds to [PressInteraction.Press] by starting a new [RippleAnimation], and responds
+ * to other [Interaction]s by showing a fixed [StateLayer] with varying alpha values depending on
+ * the [Interaction].
  *
  * This Ripple node is a low level building block for building IndicationNodeFactory implementations
  * that use a Ripple - higher level design system libraries such as material and material3 provide
@@ -78,16 +78,15 @@
  * will result in multiple ripple nodes being attached to the node.
  *
  * @param interactionSource the [InteractionSource] used to determine the state of the ripple.
- * @param bounded if true, ripples are clipped by the bounds of the target layout. Unbounded
- * ripples always animate from the target layout center, bounded ripples animate from the touch
- * position.
+ * @param bounded if true, ripples are clipped by the bounds of the target layout. Unbounded ripples
+ *   always animate from the target layout center, bounded ripples animate from the touch position.
  * @param radius the radius for the ripple. If [Dp.Unspecified] is provided then the size will be
- * calculated based on the target layout size.
+ *   calculated based on the target layout size.
  * @param color the color of the ripple. This color is usually the same color used by the text or
- * iconography in the component. This color will then have [rippleAlpha] applied to calculate the
- * final color used to draw the ripple.
+ *   iconography in the component. This color will then have [rippleAlpha] applied to calculate the
+ *   final color used to draw the ripple.
  * @param rippleAlpha the [RippleAlpha] that will be applied to the [color] depending on the state
- * of the ripple.
+ *   of the ripple.
  */
 public fun createRippleModifierNode(
     interactionSource: InteractionSource,
@@ -102,12 +101,12 @@
 /**
  * Creates and [remember]s a Ripple using values provided by [RippleTheme].
  *
- * A Ripple is a Material implementation of [Indication] that expresses different [Interaction]s
- * by drawing ripple animations and state layers.
+ * A Ripple is a Material implementation of [Indication] that expresses different [Interaction]s by
+ * drawing ripple animations and state layers.
  *
- * A Ripple responds to [PressInteraction.Press] by starting a new [RippleAnimation], and
- * responds to other [Interaction]s by showing a fixed [StateLayer] with varying alpha values
- * depending on the [Interaction].
+ * A Ripple responds to [PressInteraction.Press] by starting a new [RippleAnimation], and responds
+ * to other [Interaction]s by showing a fixed [StateLayer] with varying alpha values depending on
+ * the [Interaction].
  *
  * If you are using MaterialTheme in your hierarchy, a Ripple will be used as the default
  * [Indication] inside components such as [androidx.compose.foundation.clickable] and
@@ -118,15 +117,14 @@
  * You can also explicitly create a Ripple and provide it to components in order to change the
  * parameters from the default, such as to create an unbounded ripple with a fixed size.
  *
- * @param bounded If true, ripples are clipped by the bounds of the target layout. Unbounded
- * ripples always animate from the target layout center, bounded ripples animate from the touch
- * position.
+ * @param bounded If true, ripples are clipped by the bounds of the target layout. Unbounded ripples
+ *   always animate from the target layout center, bounded ripples animate from the touch position.
  * @param radius the radius for the ripple. If [Dp.Unspecified] is provided then the size will be
- * calculated based on the target layout size.
+ *   calculated based on the target layout size.
  * @param color the color of the ripple. This color is usually the same color used by the text or
- * iconography in the component. This color will then have [RippleTheme.rippleAlpha] applied to
- * calculate the final color used to draw the ripple. If [Color.Unspecified] is provided the color
- * used will be [RippleTheme.defaultColor] instead.
+ *   iconography in the component. This color will then have [RippleTheme.rippleAlpha] applied to
+ *   calculate the final color used to draw the ripple. If [Color.Unspecified] is provided the color
+ *   used will be [RippleTheme.defaultColor] instead.
  */
 @Deprecated(
     "rememberRipple has been deprecated - it returns an old Indication " +
@@ -146,14 +144,10 @@
     color: Color = Color.Unspecified
 ): Indication {
     val colorState = rememberUpdatedState(color)
-    return remember(bounded, radius) {
-        PlatformRipple(bounded, radius, colorState)
-    }
+    return remember(bounded, radius) { PlatformRipple(bounded, radius, colorState) }
 }
 
-/**
- * Creates the platform specific [RippleNode] implementation.
- */
+/** Creates the platform specific [RippleNode] implementation. */
 internal expect fun createPlatformRippleNode(
     interactionSource: InteractionSource,
     bounded: Boolean,
@@ -163,12 +157,12 @@
 ): DelegatableNode
 
 /**
- * A Ripple is a Material implementation of [Indication] that expresses different [Interaction]s
- * by drawing ripple animations and state layers.
+ * A Ripple is a Material implementation of [Indication] that expresses different [Interaction]s by
+ * drawing ripple animations and state layers.
  *
- * A Ripple responds to [PressInteraction.Press] by starting a new [RippleAnimation], and
- * responds to other [Interaction]s by showing a fixed [StateLayer] with varying alpha values
- * depending on the [Interaction].
+ * A Ripple responds to [PressInteraction.Press] by starting a new [RippleAnimation], and responds
+ * to other [Interaction]s by showing a fixed [StateLayer] with varying alpha values depending on
+ * the [Interaction].
  *
  * If you are using MaterialTheme in your hierarchy, a Ripple will be used as the default
  * [Indication] inside components such as [androidx.compose.foundation.clickable] and
@@ -196,24 +190,18 @@
         interactionSource: InteractionSource
     ): androidx.compose.foundation.IndicationInstance {
         val theme = LocalRippleTheme.current
-        val color = rememberUpdatedState(
-            if (color.value.isSpecified) {
-                color.value
-            } else {
-                @Suppress("DEPRECATION_ERROR")
-                theme.defaultColor()
-            }
-        )
-        @Suppress("DEPRECATION_ERROR")
-        val rippleAlpha = rememberUpdatedState(theme.rippleAlpha())
+        val color =
+            rememberUpdatedState(
+                if (color.value.isSpecified) {
+                    color.value
+                } else {
+                    @Suppress("DEPRECATION_ERROR") theme.defaultColor()
+                }
+            )
+        @Suppress("DEPRECATION_ERROR") val rippleAlpha = rememberUpdatedState(theme.rippleAlpha())
 
-        val instance = rememberUpdatedRippleInstance(
-            interactionSource,
-            bounded,
-            radius,
-            color,
-            rippleAlpha
-        )
+        val instance =
+            rememberUpdatedRippleInstance(interactionSource, bounded, radius, color, rippleAlpha)
 
         LaunchedEffect(instance, interactionSource) {
             interactionSource.interactions.collect { interaction ->
@@ -260,19 +248,16 @@
 }
 
 /**
- * Platform-specific implementation of [Ripple]. This is needed as expect classes cannot
- * (currently) have default implementations, otherwise we would make [Ripple] the expect class.
+ * Platform-specific implementation of [Ripple]. This is needed as expect classes cannot (currently)
+ * have default implementations, otherwise we would make [Ripple] the expect class.
  */
 @Suppress("DEPRECATION")
 @Deprecated("Replaced by the new RippleNode implementation")
 @Stable
-internal expect class PlatformRipple(
-    bounded: Boolean,
-    radius: Dp,
-    color: State<Color>
-) : Ripple {
+internal expect class PlatformRipple(bounded: Boolean, radius: Dp, color: State<Color>) : Ripple {
 
-    @Composable override fun rememberUpdatedRippleInstance(
+    @Composable
+    override fun rememberUpdatedRippleInstance(
         interactionSource: InteractionSource,
         bounded: Boolean,
         radius: Dp,
@@ -282,10 +267,10 @@
 }
 
 /**
- * Abstract [androidx.compose.foundation.IndicationInstance] that provides common functionality
- * used by [PlatformRipple] implementations. Implementing classes should call [drawStateLayer] to
- * draw the [StateLayer], so they only need to handle showing the ripple effect when pressed, and
- * not other [Interaction]s.
+ * Abstract [androidx.compose.foundation.IndicationInstance] that provides common functionality used
+ * by [PlatformRipple] implementations. Implementing classes should call [drawStateLayer] to draw
+ * the [StateLayer], so they only need to handle showing the ripple effect when pressed, and not
+ * other [Interaction]s.
  */
 @Suppress("DEPRECATION_ERROR")
 @Deprecated("Replaced by the new RippleNode implementation")
@@ -305,11 +290,12 @@
 
     fun DrawScope.drawStateLayer(radius: Dp, color: Color) {
         with(stateLayer) {
-            val targetRadius = if (radius.isUnspecified) {
-                getRippleEndRadius(bounded, size)
-            } else {
-                radius.toPx()
-            }
+            val targetRadius =
+                if (radius.isUnspecified) {
+                    getRippleEndRadius(bounded, size)
+                } else {
+                    radius.toPx()
+                }
             drawStateLayer(targetRadius, color)
         }
     }
@@ -326,7 +312,8 @@
     private val radius: Dp,
     private val color: ColorProducer,
     protected val rippleAlpha: () -> RippleAlpha
-) : Modifier.Node(),
+) :
+    Modifier.Node(),
     CompositionLocalConsumerModifierNode,
     DrawModifierNode,
     LayoutAwareModifierNode {
@@ -356,20 +343,21 @@
         hasValidSize = true
         val density = requireDensity()
         rippleSize = size.toSize()
-        targetRadius = with(density) {
-            if (radius.isUnspecified) {
-                // Explicitly calculate the radius instead of using RippleDrawable.RADIUS_AUTO on
-                // Android since the latest spec does not match with the existing radius calculation
-                // in the framework.
-                getRippleEndRadius(bounded, rippleSize)
-            } else {
-                radius.toPx()
+        targetRadius =
+            with(density) {
+                if (radius.isUnspecified) {
+                    // Explicitly calculate the radius instead of using RippleDrawable.RADIUS_AUTO
+                    // on
+                    // Android since the latest spec does not match with the existing radius
+                    // calculation
+                    // in the framework.
+                    getRippleEndRadius(bounded, rippleSize)
+                } else {
+                    radius.toPx()
+                }
             }
-        }
         // Flush any pending interactions that were waiting for measurement
-        pendingInteractions.forEach {
-            handlePressInteraction(it)
-        }
+        pendingInteractions.forEach { handlePressInteraction(it) }
         pendingInteractions.clear()
     }
 
@@ -401,22 +389,24 @@
 
     override fun ContentDrawScope.draw() {
         drawContent()
-        stateLayer?.run {
-            drawStateLayer(targetRadius, rippleColor)
-        }
+        stateLayer?.run { drawStateLayer(targetRadius, rippleColor) }
         drawRipples()
     }
 
     abstract fun DrawScope.drawRipples()
 
     abstract fun addRipple(interaction: PressInteraction.Press, size: Size, targetRadius: Float)
+
     abstract fun removeRipple(interaction: PressInteraction.Press)
+
     private fun updateStateLayer(interaction: Interaction, scope: CoroutineScope) {
-        val stateLayer = stateLayer ?: StateLayer(bounded, rippleAlpha).also { instance ->
-            // Invalidate when adding the state layer so we can start drawing it
-            invalidateDraw()
-            stateLayer = instance
-        }
+        val stateLayer =
+            stateLayer
+                ?: StateLayer(bounded, rippleAlpha).also { instance ->
+                    // Invalidate when adding the state layer so we can start drawing it
+                    invalidateDraw()
+                    stateLayer = instance
+                }
         stateLayer.handleInteraction(interaction, scope)
     }
 }
@@ -425,29 +415,24 @@
  * Represents the layer underneath the press ripple, that displays an overlay for states such as
  * [DragInteraction.Start].
  *
- * Typically, there should be both an 'incoming' and an 'outgoing' layer, so that when
- * transitioning between two states, the incoming of the new state, and the outgoing of the old
- * state can be displayed. However, because:
+ * Typically, there should be both an 'incoming' and an 'outgoing' layer, so that when transitioning
+ * between two states, the incoming of the new state, and the outgoing of the old state can be
+ * displayed. However, because:
  *
  * a) the duration of these outgoing transitions are so short (mostly 15ms, which is less than 1
- * frame at 60fps), and hence are barely noticeable if they happen at the same time as an
- * incoming transition
- * b) two layers cause a lot of extra work, and related performance concerns
+ * frame at 60fps), and hence are barely noticeable if they happen at the same time as an incoming
+ * transition b) two layers cause a lot of extra work, and related performance concerns
  *
  * We skip managing two layers, and instead only show one layer. The details for the
  * [AnimationSpec]s used are as follows:
  *
- * No state -> a state = incoming transition for the new state
- * A state -> a different state = incoming transition for the new state
- * A state -> no state = outgoing transition for the old state
+ * No state -> a state = incoming transition for the new state A state -> a different state =
+ * incoming transition for the new state A state -> no state = outgoing transition for the old state
  *
  * @see incomingStateLayerAnimationSpecFor
  * @see outgoingStateLayerAnimationSpecFor
  */
-private class StateLayer(
-    private val bounded: Boolean,
-    private val rippleAlpha: () -> RippleAlpha
-) {
+private class StateLayer(private val bounded: Boolean, private val rippleAlpha: () -> RippleAlpha) {
     private val animatedAlpha = Animatable(0f)
 
     private val interactions: MutableList<Interaction> = mutableListOf()
@@ -485,23 +470,20 @@
         if (currentInteraction != newInteraction) {
             if (newInteraction != null) {
                 val rippleAlpha = rippleAlpha()
-                val targetAlpha = when (interaction) {
-                    is HoverInteraction.Enter -> rippleAlpha.hoveredAlpha
-                    is FocusInteraction.Focus -> rippleAlpha.focusedAlpha
-                    is DragInteraction.Start -> rippleAlpha.draggedAlpha
-                    else -> 0f
-                }
+                val targetAlpha =
+                    when (interaction) {
+                        is HoverInteraction.Enter -> rippleAlpha.hoveredAlpha
+                        is FocusInteraction.Focus -> rippleAlpha.focusedAlpha
+                        is DragInteraction.Start -> rippleAlpha.draggedAlpha
+                        else -> 0f
+                    }
                 val incomingAnimationSpec = incomingStateLayerAnimationSpecFor(newInteraction)
 
-                scope.launch {
-                    animatedAlpha.animateTo(targetAlpha, incomingAnimationSpec)
-                }
+                scope.launch { animatedAlpha.animateTo(targetAlpha, incomingAnimationSpec) }
             } else {
                 val outgoingAnimationSpec = outgoingStateLayerAnimationSpecFor(currentInteraction)
 
-                scope.launch {
-                    animatedAlpha.animateTo(0f, outgoingAnimationSpec)
-                }
+                scope.launch { animatedAlpha.animateTo(0f, outgoingAnimationSpec) }
             }
             currentInteraction = newInteraction
         }
@@ -514,9 +496,7 @@
             val modulatedColor = color.copy(alpha = alpha)
 
             if (bounded) {
-                clipRect {
-                    drawCircle(modulatedColor, radius)
-                }
+                clipRect { drawCircle(modulatedColor, radius) }
             } else {
                 drawCircle(modulatedColor, radius)
             }
@@ -526,7 +506,7 @@
 
 /**
  * @return the [AnimationSpec] used when transitioning to [interaction], either from a previous
- * state, or no state.
+ *   state, or no state.
  */
 private fun incomingStateLayerAnimationSpecFor(interaction: Interaction): AnimationSpec<Float> {
     return when (interaction) {
@@ -537,9 +517,7 @@
     }
 }
 
-/**
- * @return the [AnimationSpec] used when transitioning away from [interaction], to no state.
- */
+/** @return the [AnimationSpec] used when transitioning away from [interaction], to no state. */
 private fun outgoingStateLayerAnimationSpecFor(interaction: Interaction?): AnimationSpec<Float> {
     return when (interaction) {
         is HoverInteraction.Enter -> DefaultTweenSpec
@@ -549,7 +527,5 @@
     }
 }
 
-/**
- * Default / fallback [AnimationSpec].
- */
+/** Default / fallback [AnimationSpec]. */
 private val DefaultTweenSpec = TweenSpec<Float>(durationMillis = 15, easing = LinearEasing)
diff --git a/compose/material/material-ripple/src/commonMain/kotlin/androidx/compose/material/ripple/RippleAnimation.kt b/compose/material/material-ripple/src/commonMain/kotlin/androidx/compose/material/ripple/RippleAnimation.kt
index 12ec448..230244d 100644
--- a/compose/material/material-ripple/src/commonMain/kotlin/androidx/compose/material/ripple/RippleAnimation.kt
+++ b/compose/material/material-ripple/src/commonMain/kotlin/androidx/compose/material/ripple/RippleAnimation.kt
@@ -37,21 +37,21 @@
 import kotlinx.coroutines.launch
 
 /**
- * [RippleAnimation]s are drawn as part of [Ripple] as a visual indicator for an
- * different [androidx.compose.foundation.interaction.Interaction]s.
+ * [RippleAnimation]s are drawn as part of [Ripple] as a visual indicator for an different
+ * [androidx.compose.foundation.interaction.Interaction]s.
  *
  * Use [androidx.compose.foundation.clickable] or [androidx.compose.foundation.indication] to add a
- * ripple to your component, which contains a RippleAnimation for pressed states, and
- * a state layer for other states.
+ * ripple to your component, which contains a RippleAnimation for pressed states, and a state layer
+ * for other states.
  *
  * This is a default implementation based on the Material Design specification.
  *
- * Draws a circular ripple effect with an origin starting at the input touch point and with a
- * radius expanding from 60% of the final value. The ripple origin animates to the center of its
- * target layout for the bounded version and stays in the center for the unbounded one.
+ * Draws a circular ripple effect with an origin starting at the input touch point and with a radius
+ * expanding from 60% of the final value. The ripple origin animates to the center of its target
+ * layout for the bounded version and stays in the center for the unbounded one.
  *
- * @param origin The position the animation will start from. If null the animation will start
- * from the center of the layout bounds.
+ * @param origin The position the animation will start from. If null the animation will start from
+ *   the center of the layout bounds.
  * @param radius Effects grow up to this size.
  * @param bounded If true the effect should be clipped by the target layout bounds.
  */
@@ -130,24 +130,24 @@
             targetCenter = Offset(size.width / 2.0f, size.height / 2.0f)
         }
 
-        val alpha = if (finishRequested && !finishedFadingIn) {
-            // If we are still fading-in we should immediately switch to the final alpha.
-            1f
-        } else {
-            animatedAlpha.value
-        }
+        val alpha =
+            if (finishRequested && !finishedFadingIn) {
+                // If we are still fading-in we should immediately switch to the final alpha.
+                1f
+            } else {
+                animatedAlpha.value
+            }
 
         val radius = lerp(startRadius!!, radius, animatedRadiusPercent.value)
-        val centerOffset = Offset(
-            lerp(origin!!.x, targetCenter!!.x, animatedCenterPercent.value),
-            lerp(origin!!.y, targetCenter!!.y, animatedCenterPercent.value),
-        )
+        val centerOffset =
+            Offset(
+                lerp(origin!!.x, targetCenter!!.x, animatedCenterPercent.value),
+                lerp(origin!!.y, targetCenter!!.y, animatedCenterPercent.value),
+            )
 
         val modulatedColor = color.copy(alpha = color.alpha * alpha)
         if (bounded) {
-            clipRect {
-                drawCircle(modulatedColor, radius, centerOffset)
-            }
+            clipRect { drawCircle(modulatedColor, radius, centerOffset) }
         } else {
             drawCircle(modulatedColor, radius, centerOffset)
         }
@@ -155,11 +155,10 @@
 }
 
 /**
- * According to specs the starting radius is equal to 60% of the largest dimension of the
- * surface it belongs to.
+ * According to specs the starting radius is equal to 60% of the largest dimension of the surface it
+ * belongs to.
  */
-internal fun getRippleStartRadius(size: Size) =
-    max(size.width, size.height) * 0.3f
+internal fun getRippleStartRadius(size: Size) = max(size.width, size.height) * 0.3f
 
 /**
  * According to specs the ending radius
@@ -167,8 +166,7 @@
  * - fits within the border of the surface it belongs to for unbounded ripples
  */
 internal fun Density.getRippleEndRadius(bounded: Boolean, size: Size): Float {
-    val radiusCoveringBounds =
-        (Offset(size.width, size.height).getDistance() / 2f)
+    val radiusCoveringBounds = (Offset(size.width, size.height).getDistance() / 2f)
     return if (bounded) {
         radiusCoveringBounds + BoundedRippleExtraRadius.toPx()
     } else {
diff --git a/compose/material/material-ripple/src/commonMain/kotlin/androidx/compose/material/ripple/RippleTheme.kt b/compose/material/material-ripple/src/commonMain/kotlin/androidx/compose/material/ripple/RippleTheme.kt
index 66ec98b..ec55c7a 100644
--- a/compose/material/material-ripple/src/commonMain/kotlin/androidx/compose/material/ripple/RippleTheme.kt
+++ b/compose/material/material-ripple/src/commonMain/kotlin/androidx/compose/material/ripple/RippleTheme.kt
@@ -26,16 +26,16 @@
 
 /**
  * Defines the appearance for Ripples. You can define a new theme and apply it using
- * [LocalRippleTheme]. See [defaultRippleColor] and [defaultRippleAlpha] for default values
- * that can be used when creating your own [RippleTheme].
+ * [LocalRippleTheme]. See [defaultRippleColor] and [defaultRippleAlpha] for default values that can
+ * be used when creating your own [RippleTheme].
  *
  * @see rememberRipple
  */
 @Deprecated(RippleThemeDeprecationMessage, level = DeprecationLevel.ERROR)
 public interface RippleTheme {
     /**
-     * @return the default ripple color at the call site's position in the hierarchy.
-     * This color will be used when a color is not explicitly set in the ripple itself.
+     * @return the default ripple color at the call site's position in the hierarchy. This color
+     *   will be used when a color is not explicitly set in the ripple itself.
      * @see defaultRippleColor
      */
     @Deprecated(RippleThemeDeprecationMessage, level = DeprecationLevel.ERROR)
@@ -44,8 +44,8 @@
 
     /**
      * @return the [RippleAlpha] used to calculate the alpha for the ripple depending on the
-     * [Interaction] for a given component. This will be set as the alpha channel for
-     * [defaultColor] or the color explicitly provided to the ripple.
+     *   [Interaction] for a given component. This will be set as the alpha channel for
+     *   [defaultColor] or the color explicitly provided to the ripple.
      * @see defaultRippleAlpha
      */
     @Deprecated(RippleThemeDeprecationMessage, level = DeprecationLevel.ERROR)
@@ -58,7 +58,7 @@
          * explicitly set on the ripple instance.
          *
          * @param contentColor the color of content (text or iconography) in the component that
-         * contains the ripple.
+         *   contains the ripple.
          * @param lightTheme whether the theme is light or not
          */
         @Deprecated(
@@ -71,10 +71,7 @@
                 "directly.",
             level = DeprecationLevel.WARNING
         )
-        public fun defaultRippleColor(
-            contentColor: Color,
-            lightTheme: Boolean
-        ): Color {
+        public fun defaultRippleColor(contentColor: Color, lightTheme: Boolean): Color {
             val contentLuminance = contentColor.luminance()
             // If we are on a colored surface (typically indicated by low luminance content), the
             // ripple color should be white.
@@ -91,7 +88,7 @@
          * states.
          *
          * @param contentColor the color of content (text or iconography) in the component that
-         * contains the ripple.
+         *   contains the ripple.
          * @param lightTheme whether the theme is light or not
          */
         @Deprecated(
@@ -130,11 +127,10 @@
  * as they do not rely on framework code. Specifically:
  *
  * API 21-27: The actual ripple is split into two 'layers', with the alpha applied to both layers,
- * so there is no uniform 'alpha'.
- * API 28-32: The ripple is just one layer, but the alpha is clamped to a maximum of 0.5f - it is
- * not possible to have a fully opaque ripple.
- * API 33: There is a bug where the ripple is clamped to a *minimum* of 0.5, instead of a maximum
- * like before - this should be resolved in future versions.
+ * so there is no uniform 'alpha'. API 28-32: The ripple is just one layer, but the alpha is clamped
+ * to a maximum of 0.5f - it is not possible to have a fully opaque ripple. API 33: There is a bug
+ * where the ripple is clamped to a *minimum* of 0.5, instead of a maximum like before - this should
+ * be resolved in future versions.
  *
  * @property draggedAlpha the alpha used when the ripple is dragged
  * @property focusedAlpha the alpha used when the ripple is focused
@@ -182,24 +178,26 @@
  */
 @Suppress("DEPRECATION_ERROR")
 @Deprecated(RippleThemeDeprecationMessage, level = DeprecationLevel.ERROR)
-public val LocalRippleTheme: ProvidableCompositionLocal<RippleTheme> =
-    staticCompositionLocalOf { DebugRippleTheme }
+public val LocalRippleTheme: ProvidableCompositionLocal<RippleTheme> = staticCompositionLocalOf {
+    DebugRippleTheme
+}
 
 /**
  * Alpha values for high luminance content in a light theme.
  *
- * This content will typically be placed on colored surfaces, so it is important that the
- * contrast here is higher to meet accessibility standards, and increase legibility.
+ * This content will typically be placed on colored surfaces, so it is important that the contrast
+ * here is higher to meet accessibility standards, and increase legibility.
  *
- * These levels are typically used for text / iconography in primary colored tabs /
- * bottom navigation / etc.
+ * These levels are typically used for text / iconography in primary colored tabs / bottom
+ * navigation / etc.
  */
-private val LightThemeHighContrastRippleAlpha = RippleAlpha(
-    pressedAlpha = 0.24f,
-    focusedAlpha = 0.24f,
-    draggedAlpha = 0.16f,
-    hoveredAlpha = 0.08f
-)
+private val LightThemeHighContrastRippleAlpha =
+    RippleAlpha(
+        pressedAlpha = 0.24f,
+        focusedAlpha = 0.24f,
+        draggedAlpha = 0.16f,
+        hoveredAlpha = 0.08f
+    )
 
 /**
  * Alpha levels for low luminance content in a light theme.
@@ -207,30 +205,30 @@
  * This content will typically be placed on grayscale surfaces, so the contrast here can be lower
  * without sacrificing accessibility and legibility.
  *
- * These levels are typically used for body text on the main surface (white in light theme, grey
- * in dark theme) and text / iconography in surface colored tabs / bottom navigation / etc.
+ * These levels are typically used for body text on the main surface (white in light theme, grey in
+ * dark theme) and text / iconography in surface colored tabs / bottom navigation / etc.
  */
-private val LightThemeLowContrastRippleAlpha = RippleAlpha(
-    pressedAlpha = 0.12f,
-    focusedAlpha = 0.12f,
-    draggedAlpha = 0.08f,
-    hoveredAlpha = 0.04f
-)
+private val LightThemeLowContrastRippleAlpha =
+    RippleAlpha(
+        pressedAlpha = 0.12f,
+        focusedAlpha = 0.12f,
+        draggedAlpha = 0.08f,
+        hoveredAlpha = 0.04f
+    )
+
+/** Alpha levels for all content in a dark theme. */
+private val DarkThemeRippleAlpha =
+    RippleAlpha(
+        pressedAlpha = 0.10f,
+        focusedAlpha = 0.12f,
+        draggedAlpha = 0.08f,
+        hoveredAlpha = 0.04f
+    )
 
 /**
- * Alpha levels for all content in a dark theme.
- */
-private val DarkThemeRippleAlpha = RippleAlpha(
-    pressedAlpha = 0.10f,
-    focusedAlpha = 0.12f,
-    draggedAlpha = 0.08f,
-    hoveredAlpha = 0.04f
-)
-
-/**
- * Simple debug indication that will assume black content color and light theme. You should
- * instead provide your own theme with meaningful values - this exists as an alternative to
- * crashing if no theme is provided.
+ * Simple debug indication that will assume black content color and light theme. You should instead
+ * provide your own theme with meaningful values - this exists as an alternative to crashing if no
+ * theme is provided.
  */
 @Suppress("DEPRECATION_ERROR", "deprecation")
 @Immutable
@@ -241,13 +239,12 @@
 
     @Deprecated("Super method is deprecated")
     @Composable
-    override fun rippleAlpha(): RippleAlpha = RippleTheme.defaultRippleAlpha(
-        Color.Black,
-        lightTheme = true
-    )
+    override fun rippleAlpha(): RippleAlpha =
+        RippleTheme.defaultRippleAlpha(Color.Black, lightTheme = true)
 }
 
-private const val RippleThemeDeprecationMessage = "RippleTheme and LocalRippleTheme have been " +
-    "deprecated - they are not compatible with the new ripple implementation using the new " +
-    "Indication APIs that provide notable performance improvements. For a migration guide and " +
-    "background information, please visit developer.android.com"
+private const val RippleThemeDeprecationMessage =
+    "RippleTheme and LocalRippleTheme have been " +
+        "deprecated - they are not compatible with the new ripple implementation using the new " +
+        "Indication APIs that provide notable performance improvements. For a migration guide and " +
+        "background information, please visit developer.android.com"
diff --git a/compose/material/material-ripple/src/desktopMain/kotlin/androidx/compose/material/ripple/Ripple.desktop.kt b/compose/material/material-ripple/src/desktopMain/kotlin/androidx/compose/material/ripple/Ripple.desktop.kt
index 62fa3d8..c13d208 100644
--- a/compose/material/material-ripple/src/desktopMain/kotlin/androidx/compose/material/ripple/Ripple.desktop.kt
+++ b/compose/material/material-ripple/src/desktopMain/kotlin/androidx/compose/material/ripple/Ripple.desktop.kt
@@ -22,9 +22,7 @@
 import androidx.compose.ui.node.DelegatableNode
 import androidx.compose.ui.unit.Dp
 
-/**
- * Desktop ripple implementation using the Compose-rendered [CommonRippleNode] implementation.
- */
+/** Desktop ripple implementation using the Compose-rendered [CommonRippleNode] implementation. */
 internal actual fun createPlatformRippleNode(
     interactionSource: InteractionSource,
     bounded: Boolean,
@@ -35,9 +33,7 @@
     return CommonRippleNode(interactionSource, bounded, radius, color, rippleAlpha)
 }
 
-/**
- * Desktop ripple implementation using the Compose-rendered [CommonRipple] implementation.
- */
+/** Desktop ripple implementation using the Compose-rendered [CommonRipple] implementation. */
 @Suppress("DEPRECATION")
 @Deprecated("Replaced by the new RippleNode implementation")
 internal actual typealias PlatformRipple = CommonRipple
diff --git a/compose/material/material/benchmark/src/androidTest/java/androidx/compose/material/benchmark/CheckboxesInRowsBenchmark.kt b/compose/material/material/benchmark/src/androidTest/java/androidx/compose/material/benchmark/CheckboxesInRowsBenchmark.kt
index 5dab3c3..d19d020 100644
--- a/compose/material/material/benchmark/src/androidTest/java/androidx/compose/material/benchmark/CheckboxesInRowsBenchmark.kt
+++ b/compose/material/material/benchmark/src/androidTest/java/androidx/compose/material/benchmark/CheckboxesInRowsBenchmark.kt
@@ -33,9 +33,7 @@
 import org.junit.runner.RunWith
 import org.junit.runners.Parameterized
 
-/**
- * Benchmark that runs [CheckboxesInRowsTestCase].
- */
+/** Benchmark that runs [CheckboxesInRowsTestCase]. */
 @LargeTest
 @RunWith(Parameterized::class)
 class CheckboxesInRowsBenchmark(private val numberOfCheckboxes: Int) {
@@ -46,8 +44,7 @@
         fun initParameters(): Array<Any> = arrayOf(1, 10)
     }
 
-    @get:Rule
-    val benchmarkRule = ComposeBenchmarkRule()
+    @get:Rule val benchmarkRule = ComposeBenchmarkRule()
 
     private val checkboxCaseFactory = { CheckboxesInRowsTestCase(numberOfCheckboxes) }
 
diff --git a/compose/material/material/benchmark/src/androidTest/java/androidx/compose/material/benchmark/CheckboxesInRowsTestCase.kt b/compose/material/material/benchmark/src/androidTest/java/androidx/compose/material/benchmark/CheckboxesInRowsTestCase.kt
index 194abdd..94e67b3 100644
--- a/compose/material/material/benchmark/src/androidTest/java/androidx/compose/material/benchmark/CheckboxesInRowsTestCase.kt
+++ b/compose/material/material/benchmark/src/androidTest/java/androidx/compose/material/benchmark/CheckboxesInRowsTestCase.kt
@@ -36,9 +36,8 @@
  * Test case that puts the given amount of checkboxes into a column of rows and makes changes by
  * toggling the first checkbox.
  */
-class CheckboxesInRowsTestCase(
-    private val amountOfCheckboxes: Int
-) : LayeredComposeTestCase(), ToggleableTestCase {
+class CheckboxesInRowsTestCase(private val amountOfCheckboxes: Int) :
+    LayeredComposeTestCase(), ToggleableTestCase {
 
     private val states = mutableListOf<MutableState<Boolean>>()
 
@@ -48,9 +47,7 @@
             repeat(amountOfCheckboxes) {
                 Row {
                     Text(text = "Check Me!")
-                    CheckboxWithState(
-                        Modifier.weight(1f).wrapContentSize(Alignment.CenterEnd)
-                    )
+                    CheckboxWithState(Modifier.weight(1f).wrapContentSize(Alignment.CenterEnd))
                 }
             }
         }
@@ -58,11 +55,7 @@
 
     @Composable
     override fun ContentWrappers(content: @Composable () -> Unit) {
-        MaterialTheme {
-            Surface {
-                content()
-            }
-        }
+        MaterialTheme { Surface { content() } }
     }
 
     override fun toggleState() {
diff --git a/compose/material/material/benchmark/src/androidTest/java/androidx/compose/material/benchmark/RadioGroupBenchmark.kt b/compose/material/material/benchmark/src/androidTest/java/androidx/compose/material/benchmark/RadioGroupBenchmark.kt
index 33ea12f..eaceade 100644
--- a/compose/material/material/benchmark/src/androidTest/java/androidx/compose/material/benchmark/RadioGroupBenchmark.kt
+++ b/compose/material/material/benchmark/src/androidTest/java/androidx/compose/material/benchmark/RadioGroupBenchmark.kt
@@ -43,15 +43,12 @@
 import org.junit.Test
 import org.junit.runner.RunWith
 
-/**
- * Benchmark for RadioGroup-like layout (column of rows of text and radio buttons).
- */
+/** Benchmark for RadioGroup-like layout (column of rows of text and radio buttons). */
 @LargeTest
 @RunWith(AndroidJUnit4::class)
 class RadioGroupBenchmark {
 
-    @get:Rule
-    val benchmarkRule = ComposeBenchmarkRule()
+    @get:Rule val benchmarkRule = ComposeBenchmarkRule()
 
     private val radioCaseFactory = { RadioGroupTestCase() }
 
@@ -114,10 +111,11 @@
         Column {
             options.forEach { item ->
                 Row(
-                    modifier = Modifier.selectable(
-                        selected = (select.value == item),
-                        onClick = { select.value = item }
-                    ),
+                    modifier =
+                        Modifier.selectable(
+                            selected = (select.value == item),
+                            onClick = { select.value = item }
+                        ),
                     verticalAlignment = Alignment.CenterVertically
                 ) {
                     Text(item.toString())
@@ -132,8 +130,6 @@
 
     @Composable
     override fun ContentWrappers(content: @Composable () -> Unit) {
-        MaterialTheme {
-            content()
-        }
+        MaterialTheme { content() }
     }
 }
diff --git a/compose/material/material/benchmark/src/androidTest/java/androidx/compose/material/benchmark/TextInColumnBenchmark.kt b/compose/material/material/benchmark/src/androidTest/java/androidx/compose/material/benchmark/TextInColumnBenchmark.kt
index 9e0c73c..4d393a6 100644
--- a/compose/material/material/benchmark/src/androidTest/java/androidx/compose/material/benchmark/TextInColumnBenchmark.kt
+++ b/compose/material/material/benchmark/src/androidTest/java/androidx/compose/material/benchmark/TextInColumnBenchmark.kt
@@ -43,8 +43,7 @@
         fun initParameters(): Array<Any> = arrayOf(10, 100)
     }
 
-    @get:Rule
-    val benchmarkRule = ComposeBenchmarkRule()
+    @get:Rule val benchmarkRule = ComposeBenchmarkRule()
 
     private val textInColumnCaseFactory = { TextInColumnSizeToggleTestCase(numberOfTexts) }
 
diff --git a/compose/material/material/benchmark/src/androidTest/java/androidx/compose/material/benchmark/TextInColumnSizeToggleTestCase.kt b/compose/material/material/benchmark/src/androidTest/java/androidx/compose/material/benchmark/TextInColumnSizeToggleTestCase.kt
index bda674e..9867bf0 100644
--- a/compose/material/material/benchmark/src/androidTest/java/androidx/compose/material/benchmark/TextInColumnSizeToggleTestCase.kt
+++ b/compose/material/material/benchmark/src/androidTest/java/androidx/compose/material/benchmark/TextInColumnSizeToggleTestCase.kt
@@ -33,9 +33,8 @@
  *
  * Note: Each rectangle has its own model so changes should always affect only the first one.
  */
-class TextInColumnSizeToggleTestCase(
-    private val numberOfTexts: Int
-) : LayeredComposeTestCase(), ToggleableTestCase {
+class TextInColumnSizeToggleTestCase(private val numberOfTexts: Int) :
+    LayeredComposeTestCase(), ToggleableTestCase {
 
     private val fontSize = mutableStateOf(20.sp)
 
@@ -54,18 +53,15 @@
 
     @Composable
     override fun ContentWrappers(content: @Composable () -> Unit) {
-        MaterialTheme {
-            Surface {
-                content()
-            }
-        }
+        MaterialTheme { Surface { content() } }
     }
 
     override fun toggleState() {
-        fontSize.value = if (fontSize.value == 20.sp) {
-            15.sp
-        } else {
-            20.sp
-        }
+        fontSize.value =
+            if (fontSize.value == 20.sp) {
+                15.sp
+            } else {
+                20.sp
+            }
     }
 }
diff --git a/compose/material/material/benchmark/src/androidTest/java/androidx/compose/material/benchmark/view/AndroidCheckboxesInLinearLayoutBenchmark.kt b/compose/material/material/benchmark/src/androidTest/java/androidx/compose/material/benchmark/view/AndroidCheckboxesInLinearLayoutBenchmark.kt
index 795a381..3f94e56 100644
--- a/compose/material/material/benchmark/src/androidTest/java/androidx/compose/material/benchmark/view/AndroidCheckboxesInLinearLayoutBenchmark.kt
+++ b/compose/material/material/benchmark/src/androidTest/java/androidx/compose/material/benchmark/view/AndroidCheckboxesInLinearLayoutBenchmark.kt
@@ -29,9 +29,7 @@
 import org.junit.runner.RunWith
 import org.junit.runners.Parameterized
 
-/**
- * Benchmark that runs [AndroidCheckboxesInLinearLayoutTestCase].
- */
+/** Benchmark that runs [AndroidCheckboxesInLinearLayoutTestCase]. */
 @LargeTest
 @RunWith(Parameterized::class)
 class AndroidCheckboxesInLinearLayoutBenchmark(private val numberOfCheckboxes: Int) {
@@ -42,8 +40,7 @@
         fun initParameters(): Array<Any> = arrayOf(1, 10)
     }
 
-    @get:Rule
-    val benchmarkRule = AndroidBenchmarkRule()
+    @get:Rule val benchmarkRule = AndroidBenchmarkRule()
 
     private val checkboxesCaseFactory = {
         AndroidCheckboxesInLinearLayoutTestCase(numberOfCheckboxes)
diff --git a/compose/material/material/benchmark/src/androidTest/java/androidx/compose/material/benchmark/view/AndroidCheckboxesInLinearLayoutTestCase.kt b/compose/material/material/benchmark/src/androidTest/java/androidx/compose/material/benchmark/view/AndroidCheckboxesInLinearLayoutTestCase.kt
index 76547cb..63a06c5 100644
--- a/compose/material/material/benchmark/src/androidTest/java/androidx/compose/material/benchmark/view/AndroidCheckboxesInLinearLayoutTestCase.kt
+++ b/compose/material/material/benchmark/src/androidTest/java/androidx/compose/material/benchmark/view/AndroidCheckboxesInLinearLayoutTestCase.kt
@@ -24,41 +24,42 @@
 import android.widget.TextView
 import androidx.compose.testutils.benchmark.android.AndroidTestCase
 
-/**
- * Version of [CheckboxesInRowsTestCase] using Android views.
- */
-class AndroidCheckboxesInLinearLayoutTestCase(
-    private val amountOfCheckboxes: Int
-) : AndroidTestCase {
+/** Version of [CheckboxesInRowsTestCase] using Android views. */
+class AndroidCheckboxesInLinearLayoutTestCase(private val amountOfCheckboxes: Int) :
+    AndroidTestCase {
 
     private val checkboxes = mutableListOf<CheckBox>()
 
     override fun getContent(activity: Activity): ViewGroup {
         val column = LinearLayout(activity)
         column.orientation = LinearLayout.VERTICAL
-        column.layoutParams = ViewGroup.LayoutParams(
-            ViewGroup.LayoutParams.MATCH_PARENT,
-            ViewGroup.LayoutParams.WRAP_CONTENT
-        )
-        repeat(amountOfCheckboxes) {
-            val row = LinearLayout(activity)
-            row.orientation = LinearLayout.HORIZONTAL
-            row.layoutParams = LinearLayout.LayoutParams(
+        column.layoutParams =
+            ViewGroup.LayoutParams(
                 ViewGroup.LayoutParams.MATCH_PARENT,
                 ViewGroup.LayoutParams.WRAP_CONTENT
             )
+        repeat(amountOfCheckboxes) {
+            val row = LinearLayout(activity)
+            row.orientation = LinearLayout.HORIZONTAL
+            row.layoutParams =
+                LinearLayout.LayoutParams(
+                    ViewGroup.LayoutParams.MATCH_PARENT,
+                    ViewGroup.LayoutParams.WRAP_CONTENT
+                )
             val text = TextView(activity)
             text.text = "Check Me!"
-            text.layoutParams = LinearLayout.LayoutParams(
-                ViewGroup.LayoutParams.WRAP_CONTENT,
-                ViewGroup.LayoutParams.WRAP_CONTENT
-            )
+            text.layoutParams =
+                LinearLayout.LayoutParams(
+                    ViewGroup.LayoutParams.WRAP_CONTENT,
+                    ViewGroup.LayoutParams.WRAP_CONTENT
+                )
             val checkbox = CheckBox(activity)
             checkbox.isChecked = false
-            checkbox.layoutParams = LinearLayout.LayoutParams(
-                ViewGroup.LayoutParams.WRAP_CONTENT,
-                ViewGroup.LayoutParams.WRAP_CONTENT
-            )
+            checkbox.layoutParams =
+                LinearLayout.LayoutParams(
+                    ViewGroup.LayoutParams.WRAP_CONTENT,
+                    ViewGroup.LayoutParams.WRAP_CONTENT
+                )
 
             val space = View(activity)
             val layoutParams = LinearLayout.LayoutParams(0, 1)
diff --git a/compose/material/material/benchmark/src/androidTest/java/androidx/compose/material/benchmark/view/AndroidTextViewBenchmark.kt b/compose/material/material/benchmark/src/androidTest/java/androidx/compose/material/benchmark/view/AndroidTextViewBenchmark.kt
index 39e7bc8..6479a7a 100644
--- a/compose/material/material/benchmark/src/androidTest/java/androidx/compose/material/benchmark/view/AndroidTextViewBenchmark.kt
+++ b/compose/material/material/benchmark/src/androidTest/java/androidx/compose/material/benchmark/view/AndroidTextViewBenchmark.kt
@@ -30,9 +30,7 @@
 import org.junit.runner.RunWith
 import org.junit.runners.Parameterized
 
-/**
- * Benchmark that runs [AndroidTextViewTestCase].
- */
+/** Benchmark that runs [AndroidTextViewTestCase]. */
 @LargeTest
 @RunWith(Parameterized::class)
 class AndroidTextViewBenchmark(private val textLength: Int) {
@@ -43,21 +41,18 @@
         fun initParameters(): Array<Any> = arrayOf(32, 512)
     }
 
-    @get:Rule
-    val textBenchmarkRule = TextBenchmarkTestRule()
+    @get:Rule val textBenchmarkRule = TextBenchmarkTestRule()
 
-    @get:Rule
-    val benchmarkRule = AndroidBenchmarkRule()
+    @get:Rule val benchmarkRule = AndroidBenchmarkRule()
 
     private val caseFactory = {
         textBenchmarkRule.generator { textGenerator ->
             AndroidTextViewTestCase(
-                List(textBenchmarkRule.repeatTimes) {
-                    textGenerator.nextParagraph(textLength)
-                }
+                List(textBenchmarkRule.repeatTimes) { textGenerator.nextParagraph(textLength) }
             )
         }
     }
+
     @Test
     fun first_setContent() {
         benchmarkRule.benchmarkFirstSetContent(caseFactory)
@@ -74,13 +69,9 @@
             runBenchmarkFor(caseFactory) {
                 measureRepeatedOnUiThread {
                     setupContent()
-                    runWithTimingDisabled {
-                        requestLayout()
-                    }
+                    runWithTimingDisabled { requestLayout() }
                     measure()
-                    runWithTimingDisabled {
-                        disposeContent()
-                    }
+                    runWithTimingDisabled { disposeContent() }
                 }
             }
         }
diff --git a/compose/material/material/benchmark/src/androidTest/java/androidx/compose/material/benchmark/view/AndroidTextViewTestCase.kt b/compose/material/material/benchmark/src/androidTest/java/androidx/compose/material/benchmark/view/AndroidTextViewTestCase.kt
index 486369d..6f6c454 100644
--- a/compose/material/material/benchmark/src/androidTest/java/androidx/compose/material/benchmark/view/AndroidTextViewTestCase.kt
+++ b/compose/material/material/benchmark/src/androidTest/java/androidx/compose/material/benchmark/view/AndroidTextViewTestCase.kt
@@ -24,32 +24,34 @@
 import androidx.compose.testutils.benchmark.android.AndroidTestCase
 import kotlin.math.roundToInt
 
-class AndroidTextViewTestCase(
-    private val texts: List<String>
-) : AndroidTestCase {
+class AndroidTextViewTestCase(private val texts: List<String>) : AndroidTestCase {
 
     private var fontSize = 8f
 
     override fun getContent(activity: Activity): ViewGroup {
         val column = LinearLayout(activity)
         column.orientation = LinearLayout.VERTICAL
-        column.layoutParams = ViewGroup.LayoutParams(
-            ViewGroup.LayoutParams.MATCH_PARENT,
-            ViewGroup.LayoutParams.WRAP_CONTENT
-        )
+        column.layoutParams =
+            ViewGroup.LayoutParams(
+                ViewGroup.LayoutParams.MATCH_PARENT,
+                ViewGroup.LayoutParams.WRAP_CONTENT
+            )
         for (text in texts) {
             val textView = TextView(activity)
             textView.text = text
-            textView.layoutParams = ViewGroup.LayoutParams(
-                ViewGroup.LayoutParams.WRAP_CONTENT,
-                ViewGroup.LayoutParams.WRAP_CONTENT
-            )
+            textView.layoutParams =
+                ViewGroup.LayoutParams(
+                    ViewGroup.LayoutParams.WRAP_CONTENT,
+                    ViewGroup.LayoutParams.WRAP_CONTENT
+                )
 
-            textView.width = TypedValue.applyDimension(
-                TypedValue.COMPLEX_UNIT_DIP,
-                160f,
-                activity.resources.displayMetrics
-            ).roundToInt()
+            textView.width =
+                TypedValue.applyDimension(
+                        TypedValue.COMPLEX_UNIT_DIP,
+                        160f,
+                        activity.resources.displayMetrics
+                    )
+                    .roundToInt()
 
             textView.setTextSize(TypedValue.COMPLEX_UNIT_SP, fontSize)
             column.addView(textView)
diff --git a/compose/material/material/benchmark/src/androidTest/java/androidx/compose/material/benchmark/view/AndroidTextViewsInLinearLayoutBenchmark.kt b/compose/material/material/benchmark/src/androidTest/java/androidx/compose/material/benchmark/view/AndroidTextViewsInLinearLayoutBenchmark.kt
index 3446b62..7a8c5fe 100644
--- a/compose/material/material/benchmark/src/androidTest/java/androidx/compose/material/benchmark/view/AndroidTextViewsInLinearLayoutBenchmark.kt
+++ b/compose/material/material/benchmark/src/androidTest/java/androidx/compose/material/benchmark/view/AndroidTextViewsInLinearLayoutBenchmark.kt
@@ -29,9 +29,7 @@
 import org.junit.runner.RunWith
 import org.junit.runners.Parameterized
 
-/**
- * Benchmark that runs [AndroidCheckboxesInLinearLayoutTestCase].
- */
+/** Benchmark that runs [AndroidCheckboxesInLinearLayoutTestCase]. */
 @LargeTest
 @RunWith(Parameterized::class)
 class AndroidTextViewsInLinearLayoutBenchmark(private val numberOfTexts: Int) {
@@ -42,12 +40,9 @@
         fun initParameters(): Array<Any> = arrayOf(10, 100)
     }
 
-    @get:Rule
-    val benchmarkRule = AndroidBenchmarkRule()
+    @get:Rule val benchmarkRule = AndroidBenchmarkRule()
 
-    private val rectanglesCaseFactory = {
-        AndroidTextViewsInLinearLayoutTestCase(numberOfTexts)
-    }
+    private val rectanglesCaseFactory = { AndroidTextViewsInLinearLayoutTestCase(numberOfTexts) }
 
     @Test
     fun first_setContent() {
diff --git a/compose/material/material/benchmark/src/androidTest/java/androidx/compose/material/benchmark/view/AndroidTextViewsInLinearLayoutTestCase.kt b/compose/material/material/benchmark/src/androidTest/java/androidx/compose/material/benchmark/view/AndroidTextViewsInLinearLayoutTestCase.kt
index 2603b87..c3ad70f 100644
--- a/compose/material/material/benchmark/src/androidTest/java/androidx/compose/material/benchmark/view/AndroidTextViewsInLinearLayoutTestCase.kt
+++ b/compose/material/material/benchmark/src/androidTest/java/androidx/compose/material/benchmark/view/AndroidTextViewsInLinearLayoutTestCase.kt
@@ -22,9 +22,8 @@
 import android.widget.TextView
 import androidx.compose.testutils.benchmark.android.AndroidTestCase
 
-class AndroidTextViewsInLinearLayoutTestCase(
-    private val amountOfCheckboxes: Int
-) : AndroidTestCase {
+class AndroidTextViewsInLinearLayoutTestCase(private val amountOfCheckboxes: Int) :
+    AndroidTestCase {
 
     private val textViews = mutableListOf<TextView>()
     private var fontSize = 20f
@@ -32,17 +31,19 @@
     override fun getContent(activity: Activity): ViewGroup {
         val column = LinearLayout(activity)
         column.orientation = LinearLayout.VERTICAL
-        column.layoutParams = ViewGroup.LayoutParams(
-            ViewGroup.LayoutParams.MATCH_PARENT,
-            ViewGroup.LayoutParams.WRAP_CONTENT
-        )
+        column.layoutParams =
+            ViewGroup.LayoutParams(
+                ViewGroup.LayoutParams.MATCH_PARENT,
+                ViewGroup.LayoutParams.WRAP_CONTENT
+            )
         repeat(amountOfCheckboxes) {
             val text = TextView(activity)
             text.text = "Hello World Hello World Hello W"
-            text.layoutParams = LinearLayout.LayoutParams(
-                ViewGroup.LayoutParams.WRAP_CONTENT,
-                ViewGroup.LayoutParams.WRAP_CONTENT
-            )
+            text.layoutParams =
+                LinearLayout.LayoutParams(
+                    ViewGroup.LayoutParams.WRAP_CONTENT,
+                    ViewGroup.LayoutParams.WRAP_CONTENT
+                )
             text.setTextSize(fontSize)
             column.addView(text)
             textViews += text
@@ -52,8 +53,6 @@
 
     fun toggleState() {
         fontSize = if (fontSize == 20f) 15f else 20f
-        textViews.forEach {
-            it.textSize = fontSize
-        }
+        textViews.forEach { it.textSize = fontSize }
     }
 }
diff --git a/compose/material/material/integration-tests/material-catalog/src/main/java/androidx/compose/material/catalog/library/CatalogApp.kt b/compose/material/material/integration-tests/material-catalog/src/main/java/androidx/compose/material/catalog/library/CatalogApp.kt
index 9a7e25b..97002ac 100644
--- a/compose/material/material/integration-tests/material-catalog/src/main/java/androidx/compose/material/catalog/library/CatalogApp.kt
+++ b/compose/material/material/integration-tests/material-catalog/src/main/java/androidx/compose/material/catalog/library/CatalogApp.kt
@@ -28,10 +28,5 @@
 @Composable
 fun MaterialCatalogApp() {
     var theme by rememberSaveable(stateSaver = ThemeSaver) { mutableStateOf(Theme()) }
-    CatalogTheme(theme = theme) {
-        NavGraph(
-            theme = theme,
-            onThemeChange = { theme = it }
-        )
-    }
+    CatalogTheme(theme = theme) { NavGraph(theme = theme, onThemeChange = { theme = it }) }
 }
diff --git a/compose/material/material/integration-tests/material-catalog/src/main/java/androidx/compose/material/catalog/library/NavGraph.kt b/compose/material/material/integration-tests/material-catalog/src/main/java/androidx/compose/material/catalog/library/NavGraph.kt
index 773458c..f48e202 100644
--- a/compose/material/material/integration-tests/material-catalog/src/main/java/androidx/compose/material/catalog/library/NavGraph.kt
+++ b/compose/material/material/integration-tests/material-catalog/src/main/java/androidx/compose/material/catalog/library/NavGraph.kt
@@ -29,15 +29,9 @@
 import androidx.navigation.navArgument
 
 @Composable
-fun NavGraph(
-    theme: Theme,
-    onThemeChange: (theme: Theme) -> Unit
-) {
+fun NavGraph(theme: Theme, onThemeChange: (theme: Theme) -> Unit) {
     val navController = rememberNavController()
-    NavHost(
-        navController = navController,
-        startDestination = HomeRoute
-    ) {
+    NavHost(navController = navController, startDestination = HomeRoute) {
         composable(HomeRoute) {
             Home(
                 components = Components,
@@ -51,11 +45,8 @@
             )
         }
         composable(
-            route = "$ComponentRoute/" +
-                "{$ComponentIdArgName}",
-            arguments = listOf(
-                navArgument(ComponentIdArgName) { type = NavType.IntType }
-            )
+            route = "$ComponentRoute/" + "{$ComponentIdArgName}",
+            arguments = listOf(navArgument(ComponentIdArgName) { type = NavType.IntType })
         ) { navBackStackEntry ->
             val arguments = requireNotNull(navBackStackEntry.arguments) { "No arguments" }
             val componentId = arguments.getInt(ComponentIdArgName)
@@ -73,13 +64,12 @@
             )
         }
         composable(
-            route = "$ExampleRoute/" +
-                "{$ComponentIdArgName}/" +
-                "{$ExampleIndexArgName}",
-            arguments = listOf(
-                navArgument(ComponentIdArgName) { type = NavType.IntType },
-                navArgument(ExampleIndexArgName) { type = NavType.IntType }
-            )
+            route = "$ExampleRoute/" + "{$ComponentIdArgName}/" + "{$ExampleIndexArgName}",
+            arguments =
+                listOf(
+                    navArgument(ComponentIdArgName) { type = NavType.IntType },
+                    navArgument(ExampleIndexArgName) { type = NavType.IntType }
+                )
         ) { navBackStackEntry ->
             val arguments = requireNotNull(navBackStackEntry.arguments) { "No arguments" }
             val componentId = arguments.getInt(ComponentIdArgName)
diff --git a/compose/material/material/integration-tests/material-catalog/src/main/java/androidx/compose/material/catalog/library/model/Components.kt b/compose/material/material/integration-tests/material-catalog/src/main/java/androidx/compose/material/catalog/library/model/Components.kt
index 1164f3e..9c5f74c 100644
--- a/compose/material/material/integration-tests/material-catalog/src/main/java/androidx/compose/material/catalog/library/model/Components.kt
+++ b/compose/material/material/integration-tests/material-catalog/src/main/java/androidx/compose/material/catalog/library/model/Components.kt
@@ -26,8 +26,7 @@
     val id: Int,
     val name: String,
     val description: String,
-    @DrawableRes
-    val icon: Int = R.drawable.ic_component,
+    @DrawableRes val icon: Int = R.drawable.ic_component,
     val tintIcon: Boolean = false,
     val guidelinesUrl: String,
     val docsUrl: String,
@@ -35,311 +34,348 @@
     val examples: List<Example>
 )
 
-private val AppBarsBottom = Component(
-    id = 1,
-    name = "App bars: bottom",
-    description = "A bottom app bar displays navigation and key actions at the bottom of mobile " +
-        "screens.",
-    icon = R.drawable.ic_app_bars_bottom,
-    guidelinesUrl = "$ComponentGuidelinesUrl/app-bars-bottom",
-    docsUrl = "$DocsUrl#bottomappbar",
-    sourceUrl = "$MaterialSourceUrl/AppBar.kt",
-    examples = AppBarsBottomExamples
-)
+private val AppBarsBottom =
+    Component(
+        id = 1,
+        name = "App bars: bottom",
+        description =
+            "A bottom app bar displays navigation and key actions at the bottom of mobile " +
+                "screens.",
+        icon = R.drawable.ic_app_bars_bottom,
+        guidelinesUrl = "$ComponentGuidelinesUrl/app-bars-bottom",
+        docsUrl = "$DocsUrl#bottomappbar",
+        sourceUrl = "$MaterialSourceUrl/AppBar.kt",
+        examples = AppBarsBottomExamples
+    )
 
-private val AppBarsTop = Component(
-    id = 2,
-    name = "App bars: top",
-    description = "The top app bar displays information and actions relating to the current " +
-        "screen.",
-    icon = R.drawable.ic_app_bars_top,
-    guidelinesUrl = "$ComponentGuidelinesUrl/app-bars-top",
-    docsUrl = "$DocsUrl#topappbar",
-    sourceUrl = "$MaterialSourceUrl/AppBar.kt",
-    examples = AppBarsTopExamples
-)
+private val AppBarsTop =
+    Component(
+        id = 2,
+        name = "App bars: top",
+        description =
+            "The top app bar displays information and actions relating to the current " + "screen.",
+        icon = R.drawable.ic_app_bars_top,
+        guidelinesUrl = "$ComponentGuidelinesUrl/app-bars-top",
+        docsUrl = "$DocsUrl#topappbar",
+        sourceUrl = "$MaterialSourceUrl/AppBar.kt",
+        examples = AppBarsTopExamples
+    )
 
-private val Backdrop = Component(
-    id = 3,
-    name = "Backdrop",
-    description = "A backdrop appears behind all other surfaces in an app, displaying contextual " +
-        "and actionable content.",
-    // No backdrop icon
-    tintIcon = true,
-    guidelinesUrl = "$ComponentGuidelinesUrl/backdrop",
-    docsUrl = "$DocsUrl#backdropscaffold",
-    sourceUrl = "$MaterialSourceUrl/BackdropScaffold.kt",
-    examples = BackdropExamples
-)
+private val Backdrop =
+    Component(
+        id = 3,
+        name = "Backdrop",
+        description =
+            "A backdrop appears behind all other surfaces in an app, displaying contextual " +
+                "and actionable content.",
+        // No backdrop icon
+        tintIcon = true,
+        guidelinesUrl = "$ComponentGuidelinesUrl/backdrop",
+        docsUrl = "$DocsUrl#backdropscaffold",
+        sourceUrl = "$MaterialSourceUrl/BackdropScaffold.kt",
+        examples = BackdropExamples
+    )
 
-private val Badge = Component(
-    id = 22,
-    name = "Badge",
-    description = "A badge can contain dynamic information, such as the presence of a new " +
-        "notification or a number of pending requests. Badges can be icon only or contain " +
-        "a short text.",
-    // No badge icon
-    tintIcon = true,
-    guidelinesUrl = "$ComponentGuidelinesUrl/bottom-navigation#behavior",
-    docsUrl = "$DocsUrl#badgebox",
-    sourceUrl = "$MaterialSourceUrl/Badge.kt",
-    examples = BadgeExamples
-)
+private val Badge =
+    Component(
+        id = 22,
+        name = "Badge",
+        description =
+            "A badge can contain dynamic information, such as the presence of a new " +
+                "notification or a number of pending requests. Badges can be icon only or contain " +
+                "a short text.",
+        // No badge icon
+        tintIcon = true,
+        guidelinesUrl = "$ComponentGuidelinesUrl/bottom-navigation#behavior",
+        docsUrl = "$DocsUrl#badgebox",
+        sourceUrl = "$MaterialSourceUrl/Badge.kt",
+        examples = BadgeExamples
+    )
 
-private val NavigationRail = Component(
-    id = 23,
-    name = "Navigation Rail",
-    description = "Navigation rails side navigation components allow movement between primary " +
-        "destinations in an app.",
-    icon = R.drawable.ic_navigation_rail,
-    guidelinesUrl = "$ComponentGuidelinesUrl/navigation-rail",
-    docsUrl = "$DocsUrl#navigationrail",
-    sourceUrl = "$MaterialSourceUrl/NavigationRail.kt",
-    examples = NavigationRailExamples
-)
+private val NavigationRail =
+    Component(
+        id = 23,
+        name = "Navigation Rail",
+        description =
+            "Navigation rails side navigation components allow movement between primary " +
+                "destinations in an app.",
+        icon = R.drawable.ic_navigation_rail,
+        guidelinesUrl = "$ComponentGuidelinesUrl/navigation-rail",
+        docsUrl = "$DocsUrl#navigationrail",
+        sourceUrl = "$MaterialSourceUrl/NavigationRail.kt",
+        examples = NavigationRailExamples
+    )
 
-private val BottomNavigation = Component(
-    id = 4,
-    name = "Bottom navigation",
-    description = "Bottom navigation bars allow movement between primary destinations in an app.",
-    icon = R.drawable.ic_bottom_navigation,
-    guidelinesUrl = "$ComponentGuidelinesUrl/bottom-navigation",
-    docsUrl = "$DocsUrl#bottomnavigation",
-    sourceUrl = "$MaterialSourceUrl/BottomNavigation.kt",
-    examples = BottomNavigationExamples
-)
+private val BottomNavigation =
+    Component(
+        id = 4,
+        name = "Bottom navigation",
+        description =
+            "Bottom navigation bars allow movement between primary destinations in an app.",
+        icon = R.drawable.ic_bottom_navigation,
+        guidelinesUrl = "$ComponentGuidelinesUrl/bottom-navigation",
+        docsUrl = "$DocsUrl#bottomnavigation",
+        sourceUrl = "$MaterialSourceUrl/BottomNavigation.kt",
+        examples = BottomNavigationExamples
+    )
 
-private val Buttons = Component(
-    id = 5,
-    name = "Buttons",
-    description = "Buttons allow users to take actions, and make choices, with a single tap.",
-    icon = R.drawable.ic_buttons,
-    guidelinesUrl = "$ComponentGuidelinesUrl/buttons",
-    docsUrl = "$DocsUrl#backdropscaffold",
-    sourceUrl = "$MaterialSourceUrl/BackdropScaffold.kt",
-    examples = ButtonsExamples
-)
+private val Buttons =
+    Component(
+        id = 5,
+        name = "Buttons",
+        description = "Buttons allow users to take actions, and make choices, with a single tap.",
+        icon = R.drawable.ic_buttons,
+        guidelinesUrl = "$ComponentGuidelinesUrl/buttons",
+        docsUrl = "$DocsUrl#backdropscaffold",
+        sourceUrl = "$MaterialSourceUrl/BackdropScaffold.kt",
+        examples = ButtonsExamples
+    )
 
-private val ButtonsFloatingActionButton = Component(
-    id = 6,
-    name = "Floating action buttons",
-    description = "A floating action button (FAB) represents the primary action of a screen.",
-    icon = R.drawable.ic_buttons_floating_action_button,
-    guidelinesUrl = "$ComponentGuidelinesUrl/buttons-floating-action-button",
-    docsUrl = "$DocsUrl#floatingactionbutton",
-    sourceUrl = "$MaterialSourceUrl/FloatingActionButton.kt",
-    examples = ButtonsFloatingActionButtonExamples
-)
+private val ButtonsFloatingActionButton =
+    Component(
+        id = 6,
+        name = "Floating action buttons",
+        description = "A floating action button (FAB) represents the primary action of a screen.",
+        icon = R.drawable.ic_buttons_floating_action_button,
+        guidelinesUrl = "$ComponentGuidelinesUrl/buttons-floating-action-button",
+        docsUrl = "$DocsUrl#floatingactionbutton",
+        sourceUrl = "$MaterialSourceUrl/FloatingActionButton.kt",
+        examples = ButtonsFloatingActionButtonExamples
+    )
 
-private val Cards = Component(
-    id = 7,
-    name = "Cards",
-    description = "Cards contain content and actions about a single subject.",
-    icon = R.drawable.ic_cards,
-    guidelinesUrl = "$ComponentGuidelinesUrl/cards",
-    docsUrl = "$DocsUrl#card",
-    sourceUrl = "$MaterialSourceUrl/Card.kt",
-    examples = CardsExamples
-)
+private val Cards =
+    Component(
+        id = 7,
+        name = "Cards",
+        description = "Cards contain content and actions about a single subject.",
+        icon = R.drawable.ic_cards,
+        guidelinesUrl = "$ComponentGuidelinesUrl/cards",
+        docsUrl = "$DocsUrl#card",
+        sourceUrl = "$MaterialSourceUrl/Card.kt",
+        examples = CardsExamples
+    )
 
-private val Checkboxes = Component(
-    id = 8,
-    name = "Checkboxes",
-    description = "Checkboxes allow the user to select one or more items from a set or turn an " +
-        "option on or off.",
-    icon = R.drawable.ic_checkboxes,
-    guidelinesUrl = "$ComponentGuidelinesUrl/checkboxes",
-    docsUrl = "$DocsUrl#checkbox",
-    sourceUrl = "$MaterialSourceUrl/Checkbox.kt",
-    examples = CheckboxesExamples
-)
+private val Checkboxes =
+    Component(
+        id = 8,
+        name = "Checkboxes",
+        description =
+            "Checkboxes allow the user to select one or more items from a set or turn an " +
+                "option on or off.",
+        icon = R.drawable.ic_checkboxes,
+        guidelinesUrl = "$ComponentGuidelinesUrl/checkboxes",
+        docsUrl = "$DocsUrl#checkbox",
+        sourceUrl = "$MaterialSourceUrl/Checkbox.kt",
+        examples = CheckboxesExamples
+    )
 
-private val Chips = Component(
-    id = 24,
-    name = "Chips",
-    description = "Chips allow users to enter information, make selections, filter content, or" +
-        " trigger actions.",
-    icon = R.drawable.ic_chips,
-    guidelinesUrl = "$ComponentGuidelinesUrl/chips",
-    docsUrl = "$DocsUrl#chip",
-    sourceUrl = "$MaterialSourceUrl/Chip.kt",
-    examples = ChipsExamples
-)
+private val Chips =
+    Component(
+        id = 24,
+        name = "Chips",
+        description =
+            "Chips allow users to enter information, make selections, filter content, or" +
+                " trigger actions.",
+        icon = R.drawable.ic_chips,
+        guidelinesUrl = "$ComponentGuidelinesUrl/chips",
+        docsUrl = "$DocsUrl#chip",
+        sourceUrl = "$MaterialSourceUrl/Chip.kt",
+        examples = ChipsExamples
+    )
 
-private val Dialogs = Component(
-    id = 9,
-    name = "Dialogs",
-    description = "Dialogs inform users about a task and can contain critical information, " +
-        "require decisions, or involve multiple tasks.",
-    icon = R.drawable.ic_dialogs,
-    guidelinesUrl = "$ComponentGuidelinesUrl/dialogs",
-    docsUrl = "$DocsUrl#alertdialog",
-    sourceUrl = "$MaterialSourceUrl/AlertDialog.kt",
-    examples = DialogsExamples
-)
+private val Dialogs =
+    Component(
+        id = 9,
+        name = "Dialogs",
+        description =
+            "Dialogs inform users about a task and can contain critical information, " +
+                "require decisions, or involve multiple tasks.",
+        icon = R.drawable.ic_dialogs,
+        guidelinesUrl = "$ComponentGuidelinesUrl/dialogs",
+        docsUrl = "$DocsUrl#alertdialog",
+        sourceUrl = "$MaterialSourceUrl/AlertDialog.kt",
+        examples = DialogsExamples
+    )
 
-private val Dividers = Component(
-    id = 10,
-    name = "Dividers",
-    description = "A divider is a thin line that groups content in lists and layouts.",
-    // No dividers icon
-    tintIcon = true,
-    guidelinesUrl = "$ComponentGuidelinesUrl/dividers",
-    docsUrl = "$DocsUrl#divider",
-    sourceUrl = "$MaterialSourceUrl/Divider.kt",
-    examples = DividersExamples
-)
+private val Dividers =
+    Component(
+        id = 10,
+        name = "Dividers",
+        description = "A divider is a thin line that groups content in lists and layouts.",
+        // No dividers icon
+        tintIcon = true,
+        guidelinesUrl = "$ComponentGuidelinesUrl/dividers",
+        docsUrl = "$DocsUrl#divider",
+        sourceUrl = "$MaterialSourceUrl/Divider.kt",
+        examples = DividersExamples
+    )
 
-private val Lists = Component(
-    id = 11,
-    name = "Lists",
-    description = "Lists are continuous, vertical indexes of text or images.",
-    icon = R.drawable.ic_lists,
-    guidelinesUrl = "$ComponentGuidelinesUrl/lists",
-    docsUrl = "$DocsUrl#listitem",
-    sourceUrl = "$MaterialSourceUrl/ListItem.kt",
-    examples = ListsExamples
-)
+private val Lists =
+    Component(
+        id = 11,
+        name = "Lists",
+        description = "Lists are continuous, vertical indexes of text or images.",
+        icon = R.drawable.ic_lists,
+        guidelinesUrl = "$ComponentGuidelinesUrl/lists",
+        docsUrl = "$DocsUrl#listitem",
+        sourceUrl = "$MaterialSourceUrl/ListItem.kt",
+        examples = ListsExamples
+    )
 
-private val Menus = Component(
-    id = 12,
-    name = "Menus",
-    description = "Menus display a list of choices on temporary surfaces.",
-    icon = R.drawable.ic_menus,
-    guidelinesUrl = "$ComponentGuidelinesUrl/menus",
-    docsUrl = "$DocsUrl#dropdownmenu",
-    sourceUrl = "$MaterialSourceUrl/Menu.kt",
-    examples = MenusExamples
-)
+private val Menus =
+    Component(
+        id = 12,
+        name = "Menus",
+        description = "Menus display a list of choices on temporary surfaces.",
+        icon = R.drawable.ic_menus,
+        guidelinesUrl = "$ComponentGuidelinesUrl/menus",
+        docsUrl = "$DocsUrl#dropdownmenu",
+        sourceUrl = "$MaterialSourceUrl/Menu.kt",
+        examples = MenusExamples
+    )
 
-private val NavigationDrawer = Component(
-    id = 13,
-    name = "Navigation drawer",
-    description = "Navigation drawers provide access to destinations in your app.",
-    icon = R.drawable.ic_navigation_drawer,
-    guidelinesUrl = "$ComponentGuidelinesUrl/navigation-drawer",
-    docsUrl = "$DocsUrl#modaldrawer",
-    sourceUrl = "$MaterialSourceUrl/Drawer.kt",
-    examples = NavigationDrawerExamples
-)
+private val NavigationDrawer =
+    Component(
+        id = 13,
+        name = "Navigation drawer",
+        description = "Navigation drawers provide access to destinations in your app.",
+        icon = R.drawable.ic_navigation_drawer,
+        guidelinesUrl = "$ComponentGuidelinesUrl/navigation-drawer",
+        docsUrl = "$DocsUrl#modaldrawer",
+        sourceUrl = "$MaterialSourceUrl/Drawer.kt",
+        examples = NavigationDrawerExamples
+    )
 
-private val ProgressIndicators = Component(
-    id = 14,
-    name = "Progress indicators",
-    description = "Progress indicators express an unspecified wait time or display the length of " +
-        "a process.",
-    icon = R.drawable.ic_progress_indicators,
-    guidelinesUrl = "$ComponentGuidelinesUrl/progress-indicators",
-    docsUrl = "$DocsUrl#circularprogressindicator",
-    sourceUrl = "$MaterialSourceUrl/ProgressIndicator.kt",
-    examples = ProgressIndicatorsExamples
-)
+private val ProgressIndicators =
+    Component(
+        id = 14,
+        name = "Progress indicators",
+        description =
+            "Progress indicators express an unspecified wait time or display the length of " +
+                "a process.",
+        icon = R.drawable.ic_progress_indicators,
+        guidelinesUrl = "$ComponentGuidelinesUrl/progress-indicators",
+        docsUrl = "$DocsUrl#circularprogressindicator",
+        sourceUrl = "$MaterialSourceUrl/ProgressIndicator.kt",
+        examples = ProgressIndicatorsExamples
+    )
 
-private val RadioButtons = Component(
-    id = 15,
-    name = "Radio buttons",
-    description = "Radio buttons allow the user to select one option from a set.",
-    icon = R.drawable.ic_radio_buttons,
-    guidelinesUrl = "$ComponentGuidelinesUrl/radio-buttons",
-    docsUrl = "$DocsUrl#radiobutton",
-    sourceUrl = "$MaterialSourceUrl/RadioButton.kt",
-    examples = RadioButtonsExamples
-)
+private val RadioButtons =
+    Component(
+        id = 15,
+        name = "Radio buttons",
+        description = "Radio buttons allow the user to select one option from a set.",
+        icon = R.drawable.ic_radio_buttons,
+        guidelinesUrl = "$ComponentGuidelinesUrl/radio-buttons",
+        docsUrl = "$DocsUrl#radiobutton",
+        sourceUrl = "$MaterialSourceUrl/RadioButton.kt",
+        examples = RadioButtonsExamples
+    )
 
-private val SheetsBottom = Component(
-    id = 16,
-    name = "Sheets: bottom",
-    description = "Bottom sheets are surfaces containing supplementary content that are anchored " +
-        "to the bottom of the screen.",
-    icon = R.drawable.ic_sheets_bottom,
-    guidelinesUrl = "$ComponentGuidelinesUrl/sheets-bottom",
-    docsUrl = "$DocsUrl#bottomsheetscaffold",
-    sourceUrl = "$MaterialSourceUrl/BottomSheetScaffold.kt",
-    examples = SheetsBottomExamples
-)
+private val SheetsBottom =
+    Component(
+        id = 16,
+        name = "Sheets: bottom",
+        description =
+            "Bottom sheets are surfaces containing supplementary content that are anchored " +
+                "to the bottom of the screen.",
+        icon = R.drawable.ic_sheets_bottom,
+        guidelinesUrl = "$ComponentGuidelinesUrl/sheets-bottom",
+        docsUrl = "$DocsUrl#bottomsheetscaffold",
+        sourceUrl = "$MaterialSourceUrl/BottomSheetScaffold.kt",
+        examples = SheetsBottomExamples
+    )
 
-private val Sliders = Component(
-    id = 17,
-    name = "Sliders",
-    description = "Sliders allow users to make selections from a range of values.",
-    icon = R.drawable.ic_sliders,
-    guidelinesUrl = "$ComponentGuidelinesUrl/sliders",
-    docsUrl = "$DocsUrl#slider",
-    sourceUrl = "$MaterialSourceUrl/Slider.kt",
-    examples = SlidersExamples
-)
+private val Sliders =
+    Component(
+        id = 17,
+        name = "Sliders",
+        description = "Sliders allow users to make selections from a range of values.",
+        icon = R.drawable.ic_sliders,
+        guidelinesUrl = "$ComponentGuidelinesUrl/sliders",
+        docsUrl = "$DocsUrl#slider",
+        sourceUrl = "$MaterialSourceUrl/Slider.kt",
+        examples = SlidersExamples
+    )
 
-private val Snackbars = Component(
-    id = 18,
-    name = "Snackbars",
-    description = "Snackbars provide brief messages about app processes at the bottom of the " +
-        "screen.",
-    icon = R.drawable.ic_snackbars,
-    guidelinesUrl = "$ComponentGuidelinesUrl/snackbars",
-    docsUrl = "$DocsUrl#snackbar",
-    sourceUrl = "$MaterialSourceUrl/Snackbar.kt",
-    examples = SnackbarsExamples
-)
+private val Snackbars =
+    Component(
+        id = 18,
+        name = "Snackbars",
+        description =
+            "Snackbars provide brief messages about app processes at the bottom of the " +
+                "screen.",
+        icon = R.drawable.ic_snackbars,
+        guidelinesUrl = "$ComponentGuidelinesUrl/snackbars",
+        docsUrl = "$DocsUrl#snackbar",
+        sourceUrl = "$MaterialSourceUrl/Snackbar.kt",
+        examples = SnackbarsExamples
+    )
 
-private val Switches = Component(
-    id = 19,
-    name = "Switches",
-    description = "Switches toggle the state of a single setting on or off.",
-    icon = R.drawable.ic_switches,
-    guidelinesUrl = "$ComponentGuidelinesUrl/switches",
-    docsUrl = "$DocsUrl#switch",
-    sourceUrl = "$MaterialSourceUrl/Switch.kt",
-    examples = SwitchesExamples
-)
+private val Switches =
+    Component(
+        id = 19,
+        name = "Switches",
+        description = "Switches toggle the state of a single setting on or off.",
+        icon = R.drawable.ic_switches,
+        guidelinesUrl = "$ComponentGuidelinesUrl/switches",
+        docsUrl = "$DocsUrl#switch",
+        sourceUrl = "$MaterialSourceUrl/Switch.kt",
+        examples = SwitchesExamples
+    )
 
-private val Tabs = Component(
-    id = 20,
-    name = "Tabs",
-    description = "Tabs organize content across different screens, data sets, and other " +
-        "interactions.",
-    icon = R.drawable.ic_tabs,
-    guidelinesUrl = "$ComponentGuidelinesUrl/tabs",
-    docsUrl = "$DocsUrl#tab",
-    sourceUrl = "$MaterialSourceUrl/Tab.kt",
-    examples = TabsExamples
-)
+private val Tabs =
+    Component(
+        id = 20,
+        name = "Tabs",
+        description =
+            "Tabs organize content across different screens, data sets, and other " +
+                "interactions.",
+        icon = R.drawable.ic_tabs,
+        guidelinesUrl = "$ComponentGuidelinesUrl/tabs",
+        docsUrl = "$DocsUrl#tab",
+        sourceUrl = "$MaterialSourceUrl/Tab.kt",
+        examples = TabsExamples
+    )
 
-private val TextFields = Component(
-    id = 21,
-    name = "Text fields",
-    description = "Text fields let users enter and edit text.",
-    icon = R.drawable.ic_text_fields,
-    guidelinesUrl = "$ComponentGuidelinesUrl/text-fields",
-    docsUrl = "$DocsUrl#textfield",
-    sourceUrl = "$MaterialSourceUrl/TextField.kt",
-    examples = TextFieldsExamples
-)
+private val TextFields =
+    Component(
+        id = 21,
+        name = "Text fields",
+        description = "Text fields let users enter and edit text.",
+        icon = R.drawable.ic_text_fields,
+        guidelinesUrl = "$ComponentGuidelinesUrl/text-fields",
+        docsUrl = "$DocsUrl#textfield",
+        sourceUrl = "$MaterialSourceUrl/TextField.kt",
+        examples = TextFieldsExamples
+    )
 
 // Next id = 25
 
-val Components = listOf(
-    AppBarsBottom,
-    AppBarsTop,
-    Backdrop,
-    Badge,
-    BottomNavigation,
-    NavigationRail,
-    Buttons,
-    ButtonsFloatingActionButton,
-    Cards,
-    Checkboxes,
-    Chips,
-    Dialogs,
-    Dividers,
-    Lists,
-    Menus,
-    NavigationDrawer,
-    ProgressIndicators,
-    RadioButtons,
-    SheetsBottom,
-    Sliders,
-    Snackbars,
-    Switches,
-    Tabs,
-    TextFields
-)
+val Components =
+    listOf(
+        AppBarsBottom,
+        AppBarsTop,
+        Backdrop,
+        Badge,
+        BottomNavigation,
+        NavigationRail,
+        Buttons,
+        ButtonsFloatingActionButton,
+        Cards,
+        Checkboxes,
+        Chips,
+        Dialogs,
+        Dividers,
+        Lists,
+        Menus,
+        NavigationDrawer,
+        ProgressIndicators,
+        RadioButtons,
+        SheetsBottom,
+        Sliders,
+        Snackbars,
+        Switches,
+        Tabs,
+        TextFields
+    )
diff --git a/compose/material/material/integration-tests/material-catalog/src/main/java/androidx/compose/material/catalog/library/model/Examples.kt b/compose/material/material/integration-tests/material-catalog/src/main/java/androidx/compose/material/catalog/library/model/Examples.kt
index 4154cf1..319d188 100644
--- a/compose/material/material/integration-tests/material-catalog/src/main/java/androidx/compose/material/catalog/library/model/Examples.kt
+++ b/compose/material/material/integration-tests/material-catalog/src/main/java/androidx/compose/material/catalog/library/model/Examples.kt
@@ -109,652 +109,672 @@
 
 private const val AppBarsBottomExampleDescription = "App bars: bottom examples"
 private const val AppBarsBottomExampleSourceUrl = "$SampleSourceUrl/AppBarSamples.kt"
-val AppBarsBottomExamples = listOf(
-    Example(
-        name = ::SimpleBottomAppBar.name,
-        description = AppBarsBottomExampleDescription,
-        sourceUrl = AppBarsBottomExampleSourceUrl,
-    ) {
-        SimpleBottomAppBar()
-    }
-)
+val AppBarsBottomExamples =
+    listOf(
+        Example(
+            name = ::SimpleBottomAppBar.name,
+            description = AppBarsBottomExampleDescription,
+            sourceUrl = AppBarsBottomExampleSourceUrl,
+        ) {
+            SimpleBottomAppBar()
+        }
+    )
 
 private const val AppBarsTopExampleDescription = "App bars: top examples"
 private const val AppBarsTopExampleSourceUrl = "$SampleSourceUrl/AppBarSamples.kt"
-val AppBarsTopExamples = listOf(
-    Example(
-        name = ::SimpleTopAppBar.name,
-        description = AppBarsTopExampleDescription,
-        sourceUrl = AppBarsTopExampleSourceUrl
-    ) {
-        SimpleTopAppBar()
-    }
-)
+val AppBarsTopExamples =
+    listOf(
+        Example(
+            name = ::SimpleTopAppBar.name,
+            description = AppBarsTopExampleDescription,
+            sourceUrl = AppBarsTopExampleSourceUrl
+        ) {
+            SimpleTopAppBar()
+        }
+    )
 
 private const val BackdropExampleDescription = "Backdrop examples"
 private const val BackdropExampleSourceUrl = "$SampleSourceUrl/BackdropScaffoldSamples.kt"
-val BackdropExamples = listOf(
-    Example(
-        name = ::BackdropScaffoldSample.name,
-        description = BackdropExampleDescription,
-        sourceUrl = BackdropExampleSourceUrl
-    ) {
-        BackdropScaffoldSample()
-    }
-)
+val BackdropExamples =
+    listOf(
+        Example(
+            name = ::BackdropScaffoldSample.name,
+            description = BackdropExampleDescription,
+            sourceUrl = BackdropExampleSourceUrl
+        ) {
+            BackdropScaffoldSample()
+        }
+    )
 
 private const val BadgeExampleDescription = "Badge examples"
 private const val BadgeExampleSourceUrl = "$SampleSourceUrl/BadgeSamples.kt"
-val BadgeExamples = listOf(
-    Example(
-        name = ::BottomNavigationItemWithBadge.name,
-        description = BadgeExampleDescription,
-        sourceUrl = BadgeExampleSourceUrl
-    ) {
-        BottomNavigationItemWithBadge()
-    }
-)
+val BadgeExamples =
+    listOf(
+        Example(
+            name = ::BottomNavigationItemWithBadge.name,
+            description = BadgeExampleDescription,
+            sourceUrl = BadgeExampleSourceUrl
+        ) {
+            BottomNavigationItemWithBadge()
+        }
+    )
 
 private const val BottomNavigationExampleDescription = "Bottom navigation examples"
 private const val BottomNavigationExampleSourceUrl = "$SampleSourceUrl/BottomNavigationSamples.kt"
-val BottomNavigationExamples = listOf(
-    Example(
-        name = ::BottomNavigationSample.name,
-        description = BottomNavigationExampleDescription,
-        sourceUrl = BottomNavigationExampleSourceUrl
-    ) {
-        BottomNavigationSample()
-    },
-    Example(
-        name = ::BottomNavigationWithOnlySelectedLabelsSample.name,
-        description = BottomNavigationExampleDescription,
-        sourceUrl = BottomNavigationExampleSourceUrl
-    ) {
-        BottomNavigationWithOnlySelectedLabelsSample()
-    }
-)
+val BottomNavigationExamples =
+    listOf(
+        Example(
+            name = ::BottomNavigationSample.name,
+            description = BottomNavigationExampleDescription,
+            sourceUrl = BottomNavigationExampleSourceUrl
+        ) {
+            BottomNavigationSample()
+        },
+        Example(
+            name = ::BottomNavigationWithOnlySelectedLabelsSample.name,
+            description = BottomNavigationExampleDescription,
+            sourceUrl = BottomNavigationExampleSourceUrl
+        ) {
+            BottomNavigationWithOnlySelectedLabelsSample()
+        }
+    )
 
 private const val ButtonsExampleDescription = "Buttons examples"
 private const val ButtonsExampleSourceUrl = "$SampleSourceUrl/ButtonSamples.kt"
-val ButtonsExamples = listOf(
-    Example(
-        name = ::ButtonSample.name,
-        description = ButtonsExampleDescription,
-        sourceUrl = ButtonsExampleSourceUrl
-    ) {
-        ButtonSample()
-    },
-    Example(
-        name = ::OutlinedButtonSample.name,
-        description = ButtonsExampleDescription,
-        sourceUrl = ButtonsExampleSourceUrl
-    ) {
-        OutlinedButtonSample()
-    },
-    Example(
-        name = ::TextButtonSample.name,
-        description = ButtonsExampleDescription,
-        sourceUrl = ButtonsExampleSourceUrl
-    ) {
-        TextButtonSample()
-    },
-    Example(
-        name = ::ButtonWithIconSample.name,
-        description = ButtonsExampleDescription,
-        sourceUrl = ButtonsExampleSourceUrl
-    ) {
-        ButtonWithIconSample()
-    }
-)
+val ButtonsExamples =
+    listOf(
+        Example(
+            name = ::ButtonSample.name,
+            description = ButtonsExampleDescription,
+            sourceUrl = ButtonsExampleSourceUrl
+        ) {
+            ButtonSample()
+        },
+        Example(
+            name = ::OutlinedButtonSample.name,
+            description = ButtonsExampleDescription,
+            sourceUrl = ButtonsExampleSourceUrl
+        ) {
+            OutlinedButtonSample()
+        },
+        Example(
+            name = ::TextButtonSample.name,
+            description = ButtonsExampleDescription,
+            sourceUrl = ButtonsExampleSourceUrl
+        ) {
+            TextButtonSample()
+        },
+        Example(
+            name = ::ButtonWithIconSample.name,
+            description = ButtonsExampleDescription,
+            sourceUrl = ButtonsExampleSourceUrl
+        ) {
+            ButtonWithIconSample()
+        }
+    )
 
 private const val ButtonsFloatingActionButtonExampleDescription = "Floating action button examples"
-private const val ButtonsFloatingActionButtonExampleSourceUrl = "$SampleSourceUrl/" +
-    "FloatingActionButtonSamples.kt"
-val ButtonsFloatingActionButtonExamples = listOf(
-    Example(
-        name = ::SimpleFab.name,
-        description = ButtonsFloatingActionButtonExampleDescription,
-        sourceUrl = ButtonsFloatingActionButtonExampleSourceUrl
-    ) {
-        SimpleFab()
-    },
-    Example(
-        name = ::SimpleExtendedFabNoIcon.name,
-        description = ButtonsFloatingActionButtonExampleDescription,
-        sourceUrl = ButtonsFloatingActionButtonExampleSourceUrl
-    ) {
-        SimpleExtendedFabNoIcon()
-    },
-    Example(
-        name = ::SimpleExtendedFabWithIcon.name,
-        description = ButtonsFloatingActionButtonExampleDescription,
-        sourceUrl = ButtonsFloatingActionButtonExampleSourceUrl
-    ) {
-        SimpleExtendedFabWithIcon()
-    },
-    Example(
-        name = ::FluidExtendedFab.name,
-        description = ButtonsFloatingActionButtonExampleDescription,
-        sourceUrl = ButtonsFloatingActionButtonExampleSourceUrl
-    ) {
-        FluidExtendedFab()
-    },
-)
+private const val ButtonsFloatingActionButtonExampleSourceUrl =
+    "$SampleSourceUrl/" + "FloatingActionButtonSamples.kt"
+val ButtonsFloatingActionButtonExamples =
+    listOf(
+        Example(
+            name = ::SimpleFab.name,
+            description = ButtonsFloatingActionButtonExampleDescription,
+            sourceUrl = ButtonsFloatingActionButtonExampleSourceUrl
+        ) {
+            SimpleFab()
+        },
+        Example(
+            name = ::SimpleExtendedFabNoIcon.name,
+            description = ButtonsFloatingActionButtonExampleDescription,
+            sourceUrl = ButtonsFloatingActionButtonExampleSourceUrl
+        ) {
+            SimpleExtendedFabNoIcon()
+        },
+        Example(
+            name = ::SimpleExtendedFabWithIcon.name,
+            description = ButtonsFloatingActionButtonExampleDescription,
+            sourceUrl = ButtonsFloatingActionButtonExampleSourceUrl
+        ) {
+            SimpleExtendedFabWithIcon()
+        },
+        Example(
+            name = ::FluidExtendedFab.name,
+            description = ButtonsFloatingActionButtonExampleDescription,
+            sourceUrl = ButtonsFloatingActionButtonExampleSourceUrl
+        ) {
+            FluidExtendedFab()
+        },
+    )
 
 private const val CardsExampleDescription = "Cards examples"
 private const val CardsExampleSourceUrl = "$SampleSourceUrl/CardSamples.kt"
-val CardsExamples = listOf(
-    Example(
-        name = ::CardSample.name,
-        description = CardsExampleDescription,
-        sourceUrl = CardsExampleSourceUrl
-    ) {
-        CardSample()
-    },
-    Example(
-        name = ::ClickableCardSample.name,
-        description = CardsExampleDescription,
-        sourceUrl = CardsExampleSourceUrl
-    ) {
-        ClickableCardSample()
-    }
-)
+val CardsExamples =
+    listOf(
+        Example(
+            name = ::CardSample.name,
+            description = CardsExampleDescription,
+            sourceUrl = CardsExampleSourceUrl
+        ) {
+            CardSample()
+        },
+        Example(
+            name = ::ClickableCardSample.name,
+            description = CardsExampleDescription,
+            sourceUrl = CardsExampleSourceUrl
+        ) {
+            ClickableCardSample()
+        }
+    )
 
 private const val CheckboxesExampleDescription = "Checkboxes examples"
 private const val CheckboxesExampleSourceUrl = "$SampleSourceUrl/SelectionControlsSamples.kt"
-val CheckboxesExamples = listOf(
-    Example(
-        name = ::CheckboxSample.name,
-        description = CheckboxesExampleDescription,
-        sourceUrl = CheckboxesExampleSourceUrl
-    ) {
-        CheckboxSample()
-    },
-    Example(
-        name = ::TriStateCheckboxSample.name,
-        description = CheckboxesExampleDescription,
-        sourceUrl = CheckboxesExampleSourceUrl
-    ) {
-        TriStateCheckboxSample()
-    }
-)
+val CheckboxesExamples =
+    listOf(
+        Example(
+            name = ::CheckboxSample.name,
+            description = CheckboxesExampleDescription,
+            sourceUrl = CheckboxesExampleSourceUrl
+        ) {
+            CheckboxSample()
+        },
+        Example(
+            name = ::TriStateCheckboxSample.name,
+            description = CheckboxesExampleDescription,
+            sourceUrl = CheckboxesExampleSourceUrl
+        ) {
+            TriStateCheckboxSample()
+        }
+    )
 
 private const val ChipsExampleDescription = "Chips examples"
 private const val ChipsExampleSourceUrl = "$SampleSourceUrl/ChipSamples.kt"
-val ChipsExamples = listOf(
-    Example(
-        name = ::ChipSample.name,
-        description = ChipsExampleDescription,
-        sourceUrl = ChipsExampleSourceUrl
-    ) {
-        ChipSample()
-    },
-    Example(
-        name = ::OutlinedChipWithIconSample.name,
-        description = ChipsExampleDescription,
-        sourceUrl = ChipsExampleSourceUrl
-    ) {
-        OutlinedChipWithIconSample()
-    },
-    Example(
-        name = ::ChipGroupSingleLineSample.name,
-        description = ChipsExampleDescription,
-        sourceUrl = ChipsExampleSourceUrl
-    ) {
-        ChipGroupSingleLineSample()
-    },
-    Example(
-        name = ::ChipGroupReflowSample.name,
-        description = ChipsExampleDescription,
-        sourceUrl = ChipsExampleSourceUrl
-    ) {
-        ChipGroupReflowSample()
-    }
-)
+val ChipsExamples =
+    listOf(
+        Example(
+            name = ::ChipSample.name,
+            description = ChipsExampleDescription,
+            sourceUrl = ChipsExampleSourceUrl
+        ) {
+            ChipSample()
+        },
+        Example(
+            name = ::OutlinedChipWithIconSample.name,
+            description = ChipsExampleDescription,
+            sourceUrl = ChipsExampleSourceUrl
+        ) {
+            OutlinedChipWithIconSample()
+        },
+        Example(
+            name = ::ChipGroupSingleLineSample.name,
+            description = ChipsExampleDescription,
+            sourceUrl = ChipsExampleSourceUrl
+        ) {
+            ChipGroupSingleLineSample()
+        },
+        Example(
+            name = ::ChipGroupReflowSample.name,
+            description = ChipsExampleDescription,
+            sourceUrl = ChipsExampleSourceUrl
+        ) {
+            ChipGroupReflowSample()
+        }
+    )
 
 private const val DialogsExampleDescription = "Dialogs examples"
 private const val DialogsExampleSourceUrl = "$SampleSourceUrl/AlertDialogSample.kt"
-val DialogsExamples = listOf(
-    Example(
-        name = ::AlertDialogSample.name,
-        description = DialogsExampleDescription,
-        sourceUrl = DialogsExampleSourceUrl
-    ) {
-        AlertDialogSample()
-    },
-    Example(
-        name = ::CustomAlertDialogSample.name,
-        description = DialogsExampleDescription,
-        sourceUrl = DialogsExampleSourceUrl
-    ) {
-        CustomAlertDialogSample()
-    }
-)
+val DialogsExamples =
+    listOf(
+        Example(
+            name = ::AlertDialogSample.name,
+            description = DialogsExampleDescription,
+            sourceUrl = DialogsExampleSourceUrl
+        ) {
+            AlertDialogSample()
+        },
+        Example(
+            name = ::CustomAlertDialogSample.name,
+            description = DialogsExampleDescription,
+            sourceUrl = DialogsExampleSourceUrl
+        ) {
+            CustomAlertDialogSample()
+        }
+    )
 
 // No divider samples
 val DividersExamples = emptyList<Example>()
 
 private const val ListsExampleDescription = "Lists examples"
 private const val ListsExampleSourceUrl = "$SampleSourceUrl/ListSamples.kt"
-val ListsExamples = listOf(
-    Example(
-        name = ::ClickableListItems.name,
-        description = ListsExampleDescription,
-        sourceUrl = ListsExampleSourceUrl
-    ) {
-        ClickableListItems()
-    },
-    Example(
-        name = ::OneLineListItems.name,
-        description = ListsExampleDescription,
-        sourceUrl = ListsExampleSourceUrl
-    ) {
-        OneLineListItems()
-    },
-    Example(
-        name = ::TwoLineListItems.name,
-        description = ListsExampleDescription,
-        sourceUrl = ListsExampleSourceUrl
-    ) {
-        TwoLineListItems()
-    },
-    Example(
-        name = ::ThreeLineListItems.name,
-        description = ListsExampleDescription,
-        sourceUrl = ListsExampleSourceUrl
-    ) {
-        ThreeLineListItems()
-    },
-    Example(
-        name = ::OneLineRtlLtrListItems.name,
-        description = ListsExampleDescription,
-        sourceUrl = ListsExampleSourceUrl
-    ) {
-        OneLineRtlLtrListItems()
-    },
-    Example(
-        name = ::TwoLineRtlLtrListItems.name,
-        description = ListsExampleDescription,
-        sourceUrl = ListsExampleSourceUrl
-    ) {
-        TwoLineRtlLtrListItems()
-    },
-    Example(
-        name = ::ThreeLineRtlLtrListItems.name,
-        description = ListsExampleDescription,
-        sourceUrl = ListsExampleSourceUrl
-    ) {
-        ThreeLineRtlLtrListItems()
-    }
-)
+val ListsExamples =
+    listOf(
+        Example(
+            name = ::ClickableListItems.name,
+            description = ListsExampleDescription,
+            sourceUrl = ListsExampleSourceUrl
+        ) {
+            ClickableListItems()
+        },
+        Example(
+            name = ::OneLineListItems.name,
+            description = ListsExampleDescription,
+            sourceUrl = ListsExampleSourceUrl
+        ) {
+            OneLineListItems()
+        },
+        Example(
+            name = ::TwoLineListItems.name,
+            description = ListsExampleDescription,
+            sourceUrl = ListsExampleSourceUrl
+        ) {
+            TwoLineListItems()
+        },
+        Example(
+            name = ::ThreeLineListItems.name,
+            description = ListsExampleDescription,
+            sourceUrl = ListsExampleSourceUrl
+        ) {
+            ThreeLineListItems()
+        },
+        Example(
+            name = ::OneLineRtlLtrListItems.name,
+            description = ListsExampleDescription,
+            sourceUrl = ListsExampleSourceUrl
+        ) {
+            OneLineRtlLtrListItems()
+        },
+        Example(
+            name = ::TwoLineRtlLtrListItems.name,
+            description = ListsExampleDescription,
+            sourceUrl = ListsExampleSourceUrl
+        ) {
+            TwoLineRtlLtrListItems()
+        },
+        Example(
+            name = ::ThreeLineRtlLtrListItems.name,
+            description = ListsExampleDescription,
+            sourceUrl = ListsExampleSourceUrl
+        ) {
+            ThreeLineRtlLtrListItems()
+        }
+    )
 
 private const val MenusExampleDescription = "Menus examples"
 private const val MenusExampleSourceUrl = "$SampleSourceUrl/MenuSamples.kt"
-val MenusExamples = listOf(
-    Example(
-        name = ::MenuSample.name,
-        description = MenusExampleDescription,
-        sourceUrl = MenusExampleSourceUrl
-    ) {
-        MenuSample()
-    },
-    Example(
-        name = ::MenuWithScrollStateSample.name,
-        description = MenusExampleDescription,
-        sourceUrl = MenusExampleSourceUrl
-    ) {
-        MenuWithScrollStateSample()
-    },
-    Example(
-        name = ::ExposedDropdownMenuSample.name,
-        description = MenusExampleDescription,
-        sourceUrl = MenusExampleSourceUrl
-    ) {
-        ExposedDropdownMenuSample()
-    }
-)
+val MenusExamples =
+    listOf(
+        Example(
+            name = ::MenuSample.name,
+            description = MenusExampleDescription,
+            sourceUrl = MenusExampleSourceUrl
+        ) {
+            MenuSample()
+        },
+        Example(
+            name = ::MenuWithScrollStateSample.name,
+            description = MenusExampleDescription,
+            sourceUrl = MenusExampleSourceUrl
+        ) {
+            MenuWithScrollStateSample()
+        },
+        Example(
+            name = ::ExposedDropdownMenuSample.name,
+            description = MenusExampleDescription,
+            sourceUrl = MenusExampleSourceUrl
+        ) {
+            ExposedDropdownMenuSample()
+        }
+    )
 
 private const val NavigationDrawerExampleDescription = "Navigation drawer examples"
 private const val NavigationDrawerExampleSourceUrl = "$SampleSourceUrl/DrawerSamples.kt"
-val NavigationDrawerExamples = listOf(
-    Example(
-        name = ::ModalDrawerSample.name,
-        description = NavigationDrawerExampleDescription,
-        sourceUrl = NavigationDrawerExampleSourceUrl
-    ) {
-        ModalDrawerSample()
-    },
-    Example(
-        name = ::BottomDrawerSample.name,
-        description = NavigationDrawerExampleDescription,
-        sourceUrl = NavigationDrawerExampleSourceUrl
-    ) {
-        BottomDrawerSample()
-    }
-)
+val NavigationDrawerExamples =
+    listOf(
+        Example(
+            name = ::ModalDrawerSample.name,
+            description = NavigationDrawerExampleDescription,
+            sourceUrl = NavigationDrawerExampleSourceUrl
+        ) {
+            ModalDrawerSample()
+        },
+        Example(
+            name = ::BottomDrawerSample.name,
+            description = NavigationDrawerExampleDescription,
+            sourceUrl = NavigationDrawerExampleSourceUrl
+        ) {
+            BottomDrawerSample()
+        }
+    )
 
 private const val ProgressIndicatorsExampleDescription = "Progress indicators examples"
-private const val ProgressIndicatorsExampleSourceUrl = "$SampleSourceUrl/" +
-    "ProgressIndicatorSamples.kt"
-val ProgressIndicatorsExamples = listOf(
-    Example(
-        name = ::LinearProgressIndicatorSample.name,
-        description = ProgressIndicatorsExampleDescription,
-        sourceUrl = ProgressIndicatorsExampleSourceUrl
-    ) {
-        LinearProgressIndicatorSample()
-    },
-    Example(
-        name = ::CircularProgressIndicatorSample.name,
-        description = ProgressIndicatorsExampleDescription,
-        sourceUrl = ProgressIndicatorsExampleSourceUrl
-    ) {
-        CircularProgressIndicatorSample()
-    }
-)
+private const val ProgressIndicatorsExampleSourceUrl =
+    "$SampleSourceUrl/" + "ProgressIndicatorSamples.kt"
+val ProgressIndicatorsExamples =
+    listOf(
+        Example(
+            name = ::LinearProgressIndicatorSample.name,
+            description = ProgressIndicatorsExampleDescription,
+            sourceUrl = ProgressIndicatorsExampleSourceUrl
+        ) {
+            LinearProgressIndicatorSample()
+        },
+        Example(
+            name = ::CircularProgressIndicatorSample.name,
+            description = ProgressIndicatorsExampleDescription,
+            sourceUrl = ProgressIndicatorsExampleSourceUrl
+        ) {
+            CircularProgressIndicatorSample()
+        }
+    )
 
 private const val RadioButtonsExampleDescription = "Radio buttons examples"
 private const val RadioButtonsExampleSourceUrl = "$SampleSourceUrl/SelectionControlsSamples.kt"
-val RadioButtonsExamples = listOf(
-    Example(
-        name = ::RadioButtonSample.name,
-        description = RadioButtonsExampleDescription,
-        sourceUrl = RadioButtonsExampleSourceUrl
-    ) {
-        RadioButtonSample()
-    },
-    Example(
-        name = ::RadioGroupSample.name,
-        description = RadioButtonsExampleDescription,
-        sourceUrl = RadioButtonsExampleSourceUrl
-    ) {
-        RadioGroupSample()
-    },
-)
+val RadioButtonsExamples =
+    listOf(
+        Example(
+            name = ::RadioButtonSample.name,
+            description = RadioButtonsExampleDescription,
+            sourceUrl = RadioButtonsExampleSourceUrl
+        ) {
+            RadioButtonSample()
+        },
+        Example(
+            name = ::RadioGroupSample.name,
+            description = RadioButtonsExampleDescription,
+            sourceUrl = RadioButtonsExampleSourceUrl
+        ) {
+            RadioGroupSample()
+        },
+    )
 
 private const val SheetsBottomExampleDescription = "Sheets: bottom examples"
-private const val SheetsBottomStandardExampleSourceUrl = "$SampleSourceUrl/" +
-    "BottomSheetScaffoldSamples.kt"
-private const val SheetsBottomModalExampleSourceUrl = "$SampleSourceUrl/" +
-    "ModalBottomSheetSamples.kt"
-val SheetsBottomExamples = listOf(
-    Example(
-        name = ::BottomSheetScaffoldSample.name,
-        description = SheetsBottomExampleDescription,
-        sourceUrl = SheetsBottomStandardExampleSourceUrl
-    ) {
-        BottomSheetScaffoldSample()
-    },
-    Example(
-        name = ::ModalBottomSheetSample.name,
-        description = SheetsBottomExampleDescription,
-        sourceUrl = SheetsBottomModalExampleSourceUrl
-    ) {
-        ModalBottomSheetSample()
-    }
-)
+private const val SheetsBottomStandardExampleSourceUrl =
+    "$SampleSourceUrl/" + "BottomSheetScaffoldSamples.kt"
+private const val SheetsBottomModalExampleSourceUrl =
+    "$SampleSourceUrl/" + "ModalBottomSheetSamples.kt"
+val SheetsBottomExamples =
+    listOf(
+        Example(
+            name = ::BottomSheetScaffoldSample.name,
+            description = SheetsBottomExampleDescription,
+            sourceUrl = SheetsBottomStandardExampleSourceUrl
+        ) {
+            BottomSheetScaffoldSample()
+        },
+        Example(
+            name = ::ModalBottomSheetSample.name,
+            description = SheetsBottomExampleDescription,
+            sourceUrl = SheetsBottomModalExampleSourceUrl
+        ) {
+            ModalBottomSheetSample()
+        }
+    )
 
 private const val SlidersExampleDescription = "Sliders examples"
 private const val SlidersExampleSourceUrl = "$SampleSourceUrl/SliderSample.kt"
-val SlidersExamples = listOf(
-    Example(
-        name = ::SliderSample.name,
-        description = SlidersExampleDescription,
-        sourceUrl = SlidersExampleSourceUrl
-    ) {
-        SliderSample()
-    },
-    Example(
-        name = ::StepsSliderSample.name,
-        description = SlidersExampleDescription,
-        sourceUrl = SlidersExampleSourceUrl
-    ) {
-        StepsSliderSample()
-    },
-    Example(
-        name = ::RangeSliderSample.name,
-        description = SlidersExampleDescription,
-        sourceUrl = SlidersExampleSourceUrl
-    ) {
-        RangeSliderSample()
-    },
-    Example(
-        name = ::StepRangeSliderSample.name,
-        description = SlidersExampleDescription,
-        sourceUrl = SlidersExampleSourceUrl
-    ) {
-        StepRangeSliderSample()
-    },
-)
+val SlidersExamples =
+    listOf(
+        Example(
+            name = ::SliderSample.name,
+            description = SlidersExampleDescription,
+            sourceUrl = SlidersExampleSourceUrl
+        ) {
+            SliderSample()
+        },
+        Example(
+            name = ::StepsSliderSample.name,
+            description = SlidersExampleDescription,
+            sourceUrl = SlidersExampleSourceUrl
+        ) {
+            StepsSliderSample()
+        },
+        Example(
+            name = ::RangeSliderSample.name,
+            description = SlidersExampleDescription,
+            sourceUrl = SlidersExampleSourceUrl
+        ) {
+            RangeSliderSample()
+        },
+        Example(
+            name = ::StepRangeSliderSample.name,
+            description = SlidersExampleDescription,
+            sourceUrl = SlidersExampleSourceUrl
+        ) {
+            StepRangeSliderSample()
+        },
+    )
 
 private const val SnackbarsExampleDescription = "Snackbars examples"
 private const val SnackbarsExampleSourceUrl = "$SampleSourceUrl/ScaffoldSamples.kt"
-val SnackbarsExamples = listOf(
-    Example(
-        name = ::ScaffoldWithSimpleSnackbar.name,
-        description = SnackbarsExampleDescription,
-        sourceUrl = SnackbarsExampleSourceUrl
-    ) {
-        ScaffoldWithSimpleSnackbar()
-    },
-    Example(
-        name = ::ScaffoldWithCustomSnackbar.name,
-        description = SnackbarsExampleDescription,
-        sourceUrl = SnackbarsExampleSourceUrl
-    ) {
-        ScaffoldWithCustomSnackbar()
-    },
-    Example(
-        name = ::ScaffoldWithCoroutinesSnackbar.name,
-        description = SnackbarsExampleDescription,
-        sourceUrl = SnackbarsExampleSourceUrl
-    ) {
-        ScaffoldWithCoroutinesSnackbar()
-    }
-)
+val SnackbarsExamples =
+    listOf(
+        Example(
+            name = ::ScaffoldWithSimpleSnackbar.name,
+            description = SnackbarsExampleDescription,
+            sourceUrl = SnackbarsExampleSourceUrl
+        ) {
+            ScaffoldWithSimpleSnackbar()
+        },
+        Example(
+            name = ::ScaffoldWithCustomSnackbar.name,
+            description = SnackbarsExampleDescription,
+            sourceUrl = SnackbarsExampleSourceUrl
+        ) {
+            ScaffoldWithCustomSnackbar()
+        },
+        Example(
+            name = ::ScaffoldWithCoroutinesSnackbar.name,
+            description = SnackbarsExampleDescription,
+            sourceUrl = SnackbarsExampleSourceUrl
+        ) {
+            ScaffoldWithCoroutinesSnackbar()
+        }
+    )
 
 private const val SwitchesExampleDescription = "Switches examples"
 private const val SwitchesExampleSourceUrl = "$SampleSourceUrl/SelectionControlsSamples.kt"
-val SwitchesExamples = listOf(
-    Example(
-        name = ::SwitchSample.name,
-        description = SwitchesExampleDescription,
-        sourceUrl = SwitchesExampleSourceUrl
-    ) {
-        SwitchSample()
-    }
-)
+val SwitchesExamples =
+    listOf(
+        Example(
+            name = ::SwitchSample.name,
+            description = SwitchesExampleDescription,
+            sourceUrl = SwitchesExampleSourceUrl
+        ) {
+            SwitchSample()
+        }
+    )
 
 private const val TabsExampleDescription = "Tabs examples"
 private const val TabsExampleSourceUrl = "$SampleSourceUrl/TabSamples.kt"
-val TabsExamples = listOf(
-    Example(
-        name = ::TextTabs.name,
-        description = TabsExampleDescription,
-        sourceUrl = TabsExampleSourceUrl
-    ) {
-        TextTabs()
-    },
-    Example(
-        name = ::IconTabs.name,
-        description = TabsExampleDescription,
-        sourceUrl = TabsExampleSourceUrl
-    ) {
-        IconTabs()
-    },
-    Example(
-        name = ::TextAndIconTabs.name,
-        description = TabsExampleDescription,
-        sourceUrl = TabsExampleSourceUrl
-    ) {
-        TextAndIconTabs()
-    },
-    Example(
-        name = ::LeadingIconTabs.name,
-        description = TabsExampleDescription,
-        sourceUrl = TabsExampleSourceUrl
-    ) {
-        LeadingIconTabs()
-    },
-    Example(
-        name = ::ScrollingTextTabs.name,
-        description = TabsExampleDescription,
-        sourceUrl = TabsExampleSourceUrl
-    ) {
-        ScrollingTextTabs()
-    },
-    Example(
-        name = ::FancyTabs.name,
-        description = TabsExampleDescription,
-        sourceUrl = TabsExampleSourceUrl
-    ) {
-        FancyTabs()
-    },
-    Example(
-        name = ::FancyIndicatorTabs.name,
-        description = TabsExampleDescription,
-        sourceUrl = TabsExampleSourceUrl
-    ) {
-        FancyIndicatorTabs()
-    },
-    Example(
-        name = ::FancyIndicatorContainerTabs.name,
-        description = TabsExampleDescription,
-        sourceUrl = TabsExampleSourceUrl
-    ) {
-        FancyIndicatorContainerTabs()
-    },
-    Example(
-        name = ::ScrollingFancyIndicatorContainerTabs.name,
-        description = TabsExampleDescription,
-        sourceUrl = TabsExampleSourceUrl
-    ) {
-        ScrollingFancyIndicatorContainerTabs()
-    }
-)
+val TabsExamples =
+    listOf(
+        Example(
+            name = ::TextTabs.name,
+            description = TabsExampleDescription,
+            sourceUrl = TabsExampleSourceUrl
+        ) {
+            TextTabs()
+        },
+        Example(
+            name = ::IconTabs.name,
+            description = TabsExampleDescription,
+            sourceUrl = TabsExampleSourceUrl
+        ) {
+            IconTabs()
+        },
+        Example(
+            name = ::TextAndIconTabs.name,
+            description = TabsExampleDescription,
+            sourceUrl = TabsExampleSourceUrl
+        ) {
+            TextAndIconTabs()
+        },
+        Example(
+            name = ::LeadingIconTabs.name,
+            description = TabsExampleDescription,
+            sourceUrl = TabsExampleSourceUrl
+        ) {
+            LeadingIconTabs()
+        },
+        Example(
+            name = ::ScrollingTextTabs.name,
+            description = TabsExampleDescription,
+            sourceUrl = TabsExampleSourceUrl
+        ) {
+            ScrollingTextTabs()
+        },
+        Example(
+            name = ::FancyTabs.name,
+            description = TabsExampleDescription,
+            sourceUrl = TabsExampleSourceUrl
+        ) {
+            FancyTabs()
+        },
+        Example(
+            name = ::FancyIndicatorTabs.name,
+            description = TabsExampleDescription,
+            sourceUrl = TabsExampleSourceUrl
+        ) {
+            FancyIndicatorTabs()
+        },
+        Example(
+            name = ::FancyIndicatorContainerTabs.name,
+            description = TabsExampleDescription,
+            sourceUrl = TabsExampleSourceUrl
+        ) {
+            FancyIndicatorContainerTabs()
+        },
+        Example(
+            name = ::ScrollingFancyIndicatorContainerTabs.name,
+            description = TabsExampleDescription,
+            sourceUrl = TabsExampleSourceUrl
+        ) {
+            ScrollingFancyIndicatorContainerTabs()
+        }
+    )
 
 private const val TextFieldsExampleDescription = "Text fields examples"
 private const val TextFieldsExampleSourceUrl = "$SampleSourceUrl/TextFieldSamples.kt"
-val TextFieldsExamples = listOf(
-    Example(
-        name = ::SimpleTextFieldSample.name,
-        description = TextFieldsExampleDescription,
-        sourceUrl = TextFieldsExampleSourceUrl
-    ) {
-        SimpleTextFieldSample()
-    },
-    Example(
-        name = ::TextFieldSample.name,
-        description = TextFieldsExampleDescription,
-        sourceUrl = TextFieldsExampleSourceUrl
-    ) {
-        TextFieldSample()
-    },
-    Example(
-        name = ::SimpleOutlinedTextFieldSample.name,
-        description = TextFieldsExampleDescription,
-        sourceUrl = TextFieldsExampleSourceUrl
-    ) {
-        SimpleOutlinedTextFieldSample()
-    },
-    Example(
-        name = ::OutlinedTextFieldSample.name,
-        description = TextFieldsExampleDescription,
-        sourceUrl = TextFieldsExampleSourceUrl
-    ) {
-        OutlinedTextFieldSample()
-    },
-    Example(
-        name = ::TextFieldWithIcons.name,
-        description = TextFieldsExampleDescription,
-        sourceUrl = TextFieldsExampleSourceUrl
-    ) {
-        TextFieldWithIcons()
-    },
-    Example(
-        name = ::TextFieldWithPlaceholder.name,
-        description = TextFieldsExampleDescription,
-        sourceUrl = TextFieldsExampleSourceUrl
-    ) {
-        TextFieldWithPlaceholder()
-    },
-    Example(
-        name = ::TextFieldWithErrorState.name,
-        description = TextFieldsExampleDescription,
-        sourceUrl = TextFieldsExampleSourceUrl
-    ) {
-        TextFieldWithErrorState()
-    },
-    Example(
-        name = ::TextFieldWithHelperMessage.name,
-        description = TextFieldsExampleDescription,
-        sourceUrl = TextFieldsExampleSourceUrl
-    ) {
-        TextFieldWithHelperMessage()
-    },
-    Example(
-        name = ::PasswordTextField.name,
-        description = TextFieldsExampleDescription,
-        sourceUrl = TextFieldsExampleSourceUrl
-    ) {
-        PasswordTextField()
-    },
-    Example(
-        name = ::TextFieldWithHideKeyboardOnImeAction.name,
-        description = TextFieldsExampleDescription,
-        sourceUrl = TextFieldsExampleSourceUrl
-    ) {
-        TextFieldWithHideKeyboardOnImeAction()
-    },
-    Example(
-        name = ::TextArea.name,
-        description = TextFieldsExampleDescription,
-        sourceUrl = TextFieldsExampleSourceUrl
-    ) {
-        TextArea()
-    }
-).map {
-    // By default text field samples are minimal and don't have a `width` modifier to restrict the
-    // width. As a result, they grow horizontally if enough text is typed. To prevent this behavior
-    // in Catalog app the code below restricts the width of every text field sample
-    it.copy(content = {
-        Box(
-            Modifier
-                .wrapContentWidth()
-                .width(280.dp)
-        ) { it.content() }
-    })
-}
+val TextFieldsExamples =
+    listOf(
+            Example(
+                name = ::SimpleTextFieldSample.name,
+                description = TextFieldsExampleDescription,
+                sourceUrl = TextFieldsExampleSourceUrl
+            ) {
+                SimpleTextFieldSample()
+            },
+            Example(
+                name = ::TextFieldSample.name,
+                description = TextFieldsExampleDescription,
+                sourceUrl = TextFieldsExampleSourceUrl
+            ) {
+                TextFieldSample()
+            },
+            Example(
+                name = ::SimpleOutlinedTextFieldSample.name,
+                description = TextFieldsExampleDescription,
+                sourceUrl = TextFieldsExampleSourceUrl
+            ) {
+                SimpleOutlinedTextFieldSample()
+            },
+            Example(
+                name = ::OutlinedTextFieldSample.name,
+                description = TextFieldsExampleDescription,
+                sourceUrl = TextFieldsExampleSourceUrl
+            ) {
+                OutlinedTextFieldSample()
+            },
+            Example(
+                name = ::TextFieldWithIcons.name,
+                description = TextFieldsExampleDescription,
+                sourceUrl = TextFieldsExampleSourceUrl
+            ) {
+                TextFieldWithIcons()
+            },
+            Example(
+                name = ::TextFieldWithPlaceholder.name,
+                description = TextFieldsExampleDescription,
+                sourceUrl = TextFieldsExampleSourceUrl
+            ) {
+                TextFieldWithPlaceholder()
+            },
+            Example(
+                name = ::TextFieldWithErrorState.name,
+                description = TextFieldsExampleDescription,
+                sourceUrl = TextFieldsExampleSourceUrl
+            ) {
+                TextFieldWithErrorState()
+            },
+            Example(
+                name = ::TextFieldWithHelperMessage.name,
+                description = TextFieldsExampleDescription,
+                sourceUrl = TextFieldsExampleSourceUrl
+            ) {
+                TextFieldWithHelperMessage()
+            },
+            Example(
+                name = ::PasswordTextField.name,
+                description = TextFieldsExampleDescription,
+                sourceUrl = TextFieldsExampleSourceUrl
+            ) {
+                PasswordTextField()
+            },
+            Example(
+                name = ::TextFieldWithHideKeyboardOnImeAction.name,
+                description = TextFieldsExampleDescription,
+                sourceUrl = TextFieldsExampleSourceUrl
+            ) {
+                TextFieldWithHideKeyboardOnImeAction()
+            },
+            Example(
+                name = ::TextArea.name,
+                description = TextFieldsExampleDescription,
+                sourceUrl = TextFieldsExampleSourceUrl
+            ) {
+                TextArea()
+            }
+        )
+        .map {
+            // By default text field samples are minimal and don't have a `width` modifier to
+            // restrict the
+            // width. As a result, they grow horizontally if enough text is typed. To prevent this
+            // behavior
+            // in Catalog app the code below restricts the width of every text field sample
+            it.copy(content = { Box(Modifier.wrapContentWidth().width(280.dp)) { it.content() } })
+        }
 
 private const val NavigationRailExampleDescription = "Navigation Rail examples"
 private const val NavigationRailExampleSourceUrl = "$SampleSourceUrl/NavigationRailSamples.kt"
-val NavigationRailExamples = listOf(
-    Example(
-        name = ::NavigationRailSample.name,
-        description = NavigationRailExampleDescription,
-        sourceUrl = NavigationRailExampleSourceUrl
-    ) {
-        NavigationRailSample()
-    },
-    Example(
-        name = ::NavigationRailWithOnlySelectedLabelsSample.name,
-        description = NavigationRailExampleDescription,
-        sourceUrl = NavigationRailExampleSourceUrl
-    ) {
-        NavigationRailWithOnlySelectedLabelsSample()
-    },
-    Example(
-        name = ::CompactNavigationRailSample.name,
-        description = NavigationRailExampleDescription,
-        sourceUrl = NavigationRailExampleSourceUrl
-    ) {
-        CompactNavigationRailSample()
-    },
-    Example(
-        name = ::NavigationRailBottomAlignSample.name,
-        description = NavigationRailExampleDescription,
-        sourceUrl = NavigationRailExampleSourceUrl
-    ) {
-        NavigationRailBottomAlignSample()
-    }
-)
+val NavigationRailExamples =
+    listOf(
+        Example(
+            name = ::NavigationRailSample.name,
+            description = NavigationRailExampleDescription,
+            sourceUrl = NavigationRailExampleSourceUrl
+        ) {
+            NavigationRailSample()
+        },
+        Example(
+            name = ::NavigationRailWithOnlySelectedLabelsSample.name,
+            description = NavigationRailExampleDescription,
+            sourceUrl = NavigationRailExampleSourceUrl
+        ) {
+            NavigationRailWithOnlySelectedLabelsSample()
+        },
+        Example(
+            name = ::CompactNavigationRailSample.name,
+            description = NavigationRailExampleDescription,
+            sourceUrl = NavigationRailExampleSourceUrl
+        ) {
+            CompactNavigationRailSample()
+        },
+        Example(
+            name = ::NavigationRailBottomAlignSample.name,
+            description = NavigationRailExampleDescription,
+            sourceUrl = NavigationRailExampleSourceUrl
+        ) {
+            NavigationRailBottomAlignSample()
+        }
+    )
diff --git a/compose/material/material/integration-tests/material-catalog/src/main/java/androidx/compose/material/catalog/library/model/Themes.kt b/compose/material/material/integration-tests/material-catalog/src/main/java/androidx/compose/material/catalog/library/model/Themes.kt
index 5f3e7bc..f77907c 100644
--- a/compose/material/material/integration-tests/material-catalog/src/main/java/androidx/compose/material/catalog/library/model/Themes.kt
+++ b/compose/material/material/integration-tests/material-catalog/src/main/java/androidx/compose/material/catalog/library/model/Themes.kt
@@ -49,18 +49,19 @@
     Yellow
 }
 
-fun ThemeColor.getColor(darkTheme: Boolean): Color = when (this) {
-    ThemeColor.Blue -> if (!darkTheme) Color(0xFF2196F3) else Color(0xFF90CAF9)
-    ThemeColor.Brown -> if (!darkTheme) Color(0xFF795548) else Color(0xFFBCAAA4)
-    ThemeColor.Green -> if (!darkTheme) Color(0xFF43A047) else Color(0xFFA5D6A7)
-    ThemeColor.Indigo -> if (!darkTheme) Color(0xFF3F51B5) else Color(0xFFC5CAE9)
-    ThemeColor.Orange -> if (!darkTheme) Color(0xFFE65100) else Color(0xFFFFB74D)
-    ThemeColor.Pink -> if (!darkTheme) Color(0xFFE91E63) else Color(0xFFF48FB1)
-    ThemeColor.Purple -> if (!darkTheme) Color(0xFF6200EE) else Color(0xFFBB86FC)
-    ThemeColor.Red -> if (!darkTheme) Color(0xFFB00020) else Color(0xFFCF6679)
-    ThemeColor.Teal -> if (!darkTheme) Color(0xFF03DAC6) else Color(0xFF03DAC6)
-    ThemeColor.Yellow -> if (!darkTheme) Color(0xFFFFEB3B) else Color(0xFFFFF59D)
-}
+fun ThemeColor.getColor(darkTheme: Boolean): Color =
+    when (this) {
+        ThemeColor.Blue -> if (!darkTheme) Color(0xFF2196F3) else Color(0xFF90CAF9)
+        ThemeColor.Brown -> if (!darkTheme) Color(0xFF795548) else Color(0xFFBCAAA4)
+        ThemeColor.Green -> if (!darkTheme) Color(0xFF43A047) else Color(0xFFA5D6A7)
+        ThemeColor.Indigo -> if (!darkTheme) Color(0xFF3F51B5) else Color(0xFFC5CAE9)
+        ThemeColor.Orange -> if (!darkTheme) Color(0xFFE65100) else Color(0xFFFFB74D)
+        ThemeColor.Pink -> if (!darkTheme) Color(0xFFE91E63) else Color(0xFFF48FB1)
+        ThemeColor.Purple -> if (!darkTheme) Color(0xFF6200EE) else Color(0xFFBB86FC)
+        ThemeColor.Red -> if (!darkTheme) Color(0xFFB00020) else Color(0xFFCF6679)
+        ThemeColor.Teal -> if (!darkTheme) Color(0xFF03DAC6) else Color(0xFF03DAC6)
+        ThemeColor.Yellow -> if (!darkTheme) Color(0xFFFFEB3B) else Color(0xFFFFF59D)
+    }
 
 enum class ThemeFontFamily(val label: String) {
     Default("Default"),
@@ -70,48 +71,51 @@
     Cursive("Cursive")
 }
 
-fun ThemeFontFamily.getFontFamily(): FontFamily = when (this) {
-    ThemeFontFamily.Default -> FontFamily.Default
-    ThemeFontFamily.SansSerif -> FontFamily.SansSerif
-    ThemeFontFamily.Serif -> FontFamily.Serif
-    ThemeFontFamily.Monospace -> FontFamily.Monospace
-    ThemeFontFamily.Cursive -> FontFamily.Cursive
-}
+fun ThemeFontFamily.getFontFamily(): FontFamily =
+    when (this) {
+        ThemeFontFamily.Default -> FontFamily.Default
+        ThemeFontFamily.SansSerif -> FontFamily.SansSerif
+        ThemeFontFamily.Serif -> FontFamily.Serif
+        ThemeFontFamily.Monospace -> FontFamily.Monospace
+        ThemeFontFamily.Cursive -> FontFamily.Cursive
+    }
 
 enum class ThemeShapeCornerFamily(val label: String) {
     Rounded("Rounded"),
     Cut("Cut")
 }
 
-fun ThemeShapeCornerFamily.getShape(size: Dp): CornerBasedShape = when (this) {
-    ThemeShapeCornerFamily.Rounded -> RoundedCornerShape(size = size)
-    ThemeShapeCornerFamily.Cut -> CutCornerShape(size = size)
-}
-
-val ThemeSaver = Saver<Theme, Map<String, Int>>(
-    save = { theme ->
-        mapOf(
-            PrimaryColorKey to theme.primaryColor.ordinal,
-            SecondaryColorKey to theme.secondaryColor.ordinal,
-            FontFamilyKey to theme.fontFamily.ordinal,
-            ShapeCornerFamilyKey to theme.shapeCornerFamily.ordinal,
-            SmallShapeCornerSizeKey to theme.smallShapeCornerSize,
-            MediumShapeCornerSizeKey to theme.mediumShapeCornerSize,
-            LargeShapeCornerSizeKey to theme.largeShapeCornerSize
-        )
-    },
-    restore = { map ->
-        Theme(
-            primaryColor = ThemeColor.values()[map[PrimaryColorKey]!!],
-            secondaryColor = ThemeColor.values()[map[SecondaryColorKey]!!],
-            fontFamily = ThemeFontFamily.values()[map[FontFamilyKey]!!],
-            shapeCornerFamily = ThemeShapeCornerFamily.values()[map[ShapeCornerFamilyKey]!!],
-            smallShapeCornerSize = map[SmallShapeCornerSizeKey]!!,
-            mediumShapeCornerSize = map[MediumShapeCornerSizeKey]!!,
-            largeShapeCornerSize = map[LargeShapeCornerSizeKey]!!
-        )
+fun ThemeShapeCornerFamily.getShape(size: Dp): CornerBasedShape =
+    when (this) {
+        ThemeShapeCornerFamily.Rounded -> RoundedCornerShape(size = size)
+        ThemeShapeCornerFamily.Cut -> CutCornerShape(size = size)
     }
-)
+
+val ThemeSaver =
+    Saver<Theme, Map<String, Int>>(
+        save = { theme ->
+            mapOf(
+                PrimaryColorKey to theme.primaryColor.ordinal,
+                SecondaryColorKey to theme.secondaryColor.ordinal,
+                FontFamilyKey to theme.fontFamily.ordinal,
+                ShapeCornerFamilyKey to theme.shapeCornerFamily.ordinal,
+                SmallShapeCornerSizeKey to theme.smallShapeCornerSize,
+                MediumShapeCornerSizeKey to theme.mediumShapeCornerSize,
+                LargeShapeCornerSizeKey to theme.largeShapeCornerSize
+            )
+        },
+        restore = { map ->
+            Theme(
+                primaryColor = ThemeColor.values()[map[PrimaryColorKey]!!],
+                secondaryColor = ThemeColor.values()[map[SecondaryColorKey]!!],
+                fontFamily = ThemeFontFamily.values()[map[FontFamilyKey]!!],
+                shapeCornerFamily = ThemeShapeCornerFamily.values()[map[ShapeCornerFamilyKey]!!],
+                smallShapeCornerSize = map[SmallShapeCornerSizeKey]!!,
+                mediumShapeCornerSize = map[MediumShapeCornerSizeKey]!!,
+                largeShapeCornerSize = map[LargeShapeCornerSizeKey]!!
+            )
+        }
+    )
 
 const val MaxSmallShapeCornerSize = 16
 const val MaxMediumShapeCornerSize = 32
diff --git a/compose/material/material/integration-tests/material-catalog/src/main/java/androidx/compose/material/catalog/library/ui/common/Border.kt b/compose/material/material/integration-tests/material-catalog/src/main/java/androidx/compose/material/catalog/library/ui/common/Border.kt
index 17b94a5..6375fe2 100644
--- a/compose/material/material/integration-tests/material-catalog/src/main/java/androidx/compose/material/catalog/library/ui/common/Border.kt
+++ b/compose/material/material/integration-tests/material-catalog/src/main/java/androidx/compose/material/catalog/library/ui/common/Border.kt
@@ -51,21 +51,22 @@
         start = Offset(0f, size.height),
         end = Offset(size.width, size.height)
     )
-    if (!end) drawLine(
-        color = color,
-        strokeWidth = width.toPx(),
-        cap = StrokeCap.Square,
-        start = Offset(size.width, size.height),
-        end = Offset(size.width, 0f)
-    )
+    if (!end)
+        drawLine(
+            color = color,
+            strokeWidth = width.toPx(),
+            cap = StrokeCap.Square,
+            start = Offset(size.width, size.height),
+            end = Offset(size.width, 0f)
+        )
 }
 
-/**
- * Composite of local content color at 12% alpha over background color, used by borders.
- */
+/** Composite of local content color at 12% alpha over background color, used by borders. */
 @Composable
-fun compositeBorderColor(): Color = LocalContentColor.current.copy(alpha = BorderAlpha)
-    .compositeOver(MaterialTheme.colors.background)
+fun compositeBorderColor(): Color =
+    LocalContentColor.current
+        .copy(alpha = BorderAlpha)
+        .compositeOver(MaterialTheme.colors.background)
 
 val BorderWidth = 1.dp
 private const val BorderAlpha = 0.12f
diff --git a/compose/material/material/integration-tests/material-catalog/src/main/java/androidx/compose/material/catalog/library/ui/common/CatalogTopAppBar.kt b/compose/material/material/integration-tests/material-catalog/src/main/java/androidx/compose/material/catalog/library/ui/common/CatalogTopAppBar.kt
index 963b6ee..38e0758 100644
--- a/compose/material/material/integration-tests/material-catalog/src/main/java/androidx/compose/material/catalog/library/ui/common/CatalogTopAppBar.kt
+++ b/compose/material/material/integration-tests/material-catalog/src/main/java/androidx/compose/material/catalog/library/ui/common/CatalogTopAppBar.kt
@@ -56,13 +56,7 @@
     var moreMenuExpanded by remember { mutableStateOf(false) }
     TopAppBar(
         windowInsets = AppBarDefaults.topAppBarWindowInsets,
-        title = {
-            Text(
-                text = title,
-                maxLines = 1,
-                overflow = TextOverflow.Ellipsis
-            )
-        },
+        title = { Text(text = title, maxLines = 1, overflow = TextOverflow.Ellipsis) },
         actions = {
             Box {
                 Row {
@@ -73,10 +67,7 @@
                         )
                     }
                     IconButton(onClick = { moreMenuExpanded = true }) {
-                        Icon(
-                            imageVector = Icons.Default.MoreVert,
-                            contentDescription = null
-                        )
+                        Icon(imageVector = Icons.Default.MoreVert, contentDescription = null)
                     }
                 }
                 MoreMenu(
@@ -113,18 +104,19 @@
                 )
             }
         },
-        navigationIcon = if (showBackNavigationIcon) {
-            {
-                IconButton(onClick = onBackClick) {
-                    Icon(
-                        imageVector = Icons.AutoMirrored.Filled.ArrowBack,
-                        contentDescription = null
-                    )
+        navigationIcon =
+            if (showBackNavigationIcon) {
+                {
+                    IconButton(onClick = onBackClick) {
+                        Icon(
+                            imageVector = Icons.AutoMirrored.Filled.ArrowBack,
+                            contentDescription = null
+                        )
+                    }
                 }
+            } else {
+                null
             }
-        } else {
-            null
-        }
     )
 }
 
@@ -140,10 +132,7 @@
     onPrivacyClick: () -> Unit,
     onLicensesClick: () -> Unit,
 ) {
-    DropdownMenu(
-        expanded = expanded,
-        onDismissRequest = onDismissRequest
-    ) {
+    DropdownMenu(expanded = expanded, onDismissRequest = onDismissRequest) {
         DropdownMenuItem(onClick = onGuidelinesClick) {
             Text(stringResource(id = R.string.view_design_guidelines))
         }
diff --git a/compose/material/material/integration-tests/material-catalog/src/main/java/androidx/compose/material/catalog/library/ui/component/Component.kt b/compose/material/material/integration-tests/material-catalog/src/main/java/androidx/compose/material/catalog/library/ui/component/Component.kt
index 7180680..8130435 100644
--- a/compose/material/material/integration-tests/material-catalog/src/main/java/androidx/compose/material/catalog/library/ui/component/Component.kt
+++ b/compose/material/material/integration-tests/material-catalog/src/main/java/androidx/compose/material/catalog/library/ui/component/Component.kt
@@ -62,29 +62,26 @@
         onBackClick = onBackClick
     ) { paddingValues ->
         LazyColumn(
-            modifier = Modifier
-                .padding(horizontal = ComponentPadding),
+            modifier = Modifier.padding(horizontal = ComponentPadding),
             contentPadding = paddingValues
         ) {
             item {
                 Box(
-                    modifier = Modifier
-                        .fillMaxWidth()
-                        .padding(vertical = ComponentIconVerticalPadding)
+                    modifier =
+                        Modifier.fillMaxWidth().padding(vertical = ComponentIconVerticalPadding)
                 ) {
                     Image(
                         painter = painterResource(id = component.icon),
                         contentDescription = null,
-                        modifier = Modifier
-                            .size(ComponentIconSize)
-                            .align(Alignment.Center),
-                        colorFilter = if (component.tintIcon) {
-                            ColorFilter.tint(
-                                LocalContentColor.current.copy(alpha = ContentAlpha.disabled)
-                            )
-                        } else {
-                            null
-                        }
+                        modifier = Modifier.size(ComponentIconSize).align(Alignment.Center),
+                        colorFilter =
+                            if (component.tintIcon) {
+                                ColorFilter.tint(
+                                    LocalContentColor.current.copy(alpha = ContentAlpha.disabled)
+                                )
+                            } else {
+                                null
+                            }
                     )
                 }
             }
@@ -94,10 +91,7 @@
                     style = MaterialTheme.typography.body1
                 )
                 Spacer(modifier = Modifier.height(ComponentPadding))
-                Text(
-                    text = component.description,
-                    style = MaterialTheme.typography.body2
-                )
+                Text(text = component.description, style = MaterialTheme.typography.body2)
                 Spacer(modifier = Modifier.height(ComponentDescriptionPadding))
             }
             item {
@@ -109,10 +103,7 @@
             }
             if (component.examples.isNotEmpty()) {
                 items(component.examples) { example ->
-                    ExampleItem(
-                        example = example,
-                        onClick = onExampleClick
-                    )
+                    ExampleItem(example = example, onClick = onExampleClick)
                     Spacer(modifier = Modifier.height(ComponentPadding))
                 }
             } else {
diff --git a/compose/material/material/integration-tests/material-catalog/src/main/java/androidx/compose/material/catalog/library/ui/component/ComponentItem.kt b/compose/material/material/integration-tests/material-catalog/src/main/java/androidx/compose/material/catalog/library/ui/component/ComponentItem.kt
index 94e9f4d..cd987c6 100644
--- a/compose/material/material/integration-tests/material-catalog/src/main/java/androidx/compose/material/catalog/library/ui/component/ComponentItem.kt
+++ b/compose/material/material/integration-tests/material-catalog/src/main/java/androidx/compose/material/catalog/library/ui/component/ComponentItem.kt
@@ -45,27 +45,26 @@
     cellsCount: Int,
 ) {
     Box(
-        modifier = Modifier
-            .height(ComponentItemHeight)
-            .clickable { onClick(component) }
-            .gridItemBorder(
-                itemIndex = index,
-                cellsCount = cellsCount,
-                color = compositeBorderColor()
-            )
-            .padding(ComponentItemPadding)
+        modifier =
+            Modifier.height(ComponentItemHeight)
+                .clickable { onClick(component) }
+                .gridItemBorder(
+                    itemIndex = index,
+                    cellsCount = cellsCount,
+                    color = compositeBorderColor()
+                )
+                .padding(ComponentItemPadding)
     ) {
         Image(
             painter = painterResource(id = component.icon),
             contentDescription = null,
-            modifier = Modifier
-                .size(ComponentItemIconSize)
-                .align(Alignment.Center),
-            colorFilter = if (component.tintIcon) {
-                ColorFilter.tint(LocalContentColor.current.copy(alpha = ContentAlpha.disabled))
-            } else {
-                null
-            },
+            modifier = Modifier.size(ComponentItemIconSize).align(Alignment.Center),
+            colorFilter =
+                if (component.tintIcon) {
+                    ColorFilter.tint(LocalContentColor.current.copy(alpha = ContentAlpha.disabled))
+                } else {
+                    null
+                },
             contentScale = ContentScale.Inside
         )
         Text(
diff --git a/compose/material/material/integration-tests/material-catalog/src/main/java/androidx/compose/material/catalog/library/ui/example/Example.kt b/compose/material/material/integration-tests/material-catalog/src/main/java/androidx/compose/material/catalog/library/ui/example/Example.kt
index 156c3a1..0b7142e 100644
--- a/compose/material/material/integration-tests/material-catalog/src/main/java/androidx/compose/material/catalog/library/ui/example/Example.kt
+++ b/compose/material/material/integration-tests/material-catalog/src/main/java/androidx/compose/material/catalog/library/ui/example/Example.kt
@@ -46,9 +46,7 @@
         onBackClick = onBackClick
     ) { paddingValues ->
         Box(
-            modifier = Modifier
-                .fillMaxSize()
-                .padding(paddingValues),
+            modifier = Modifier.fillMaxSize().padding(paddingValues),
             contentAlignment = Alignment.Center
         ) {
             example.content()
diff --git a/compose/material/material/integration-tests/material-catalog/src/main/java/androidx/compose/material/catalog/library/ui/example/ExampleItem.kt b/compose/material/material/integration-tests/material-catalog/src/main/java/androidx/compose/material/catalog/library/ui/example/ExampleItem.kt
index 2801d15..c627d30 100644
--- a/compose/material/material/integration-tests/material-catalog/src/main/java/androidx/compose/material/catalog/library/ui/example/ExampleItem.kt
+++ b/compose/material/material/integration-tests/material-catalog/src/main/java/androidx/compose/material/catalog/library/ui/example/ExampleItem.kt
@@ -43,34 +43,18 @@
 import androidx.compose.ui.unit.dp
 
 @Composable
-fun ExampleItem(
-    example: Example,
-    onClick: (example: Example) -> Unit
-) {
+fun ExampleItem(example: Example, onClick: (example: Example) -> Unit) {
     Card(
         elevation = 0.dp,
-        border = BorderStroke(
-            width = BorderWidth,
-            color = compositeBorderColor()
-        ),
+        border = BorderStroke(width = BorderWidth, color = compositeBorderColor()),
         modifier = Modifier.fillMaxWidth()
     ) {
-        Row(
-            modifier = Modifier
-                .clickable { onClick(example) }
-                .padding(ExampleItemPadding)
-        ) {
+        Row(modifier = Modifier.clickable { onClick(example) }.padding(ExampleItemPadding)) {
             Column(modifier = Modifier.weight(1f, fill = true)) {
-                Text(
-                    text = example.name,
-                    style = MaterialTheme.typography.subtitle2
-                )
+                Text(text = example.name, style = MaterialTheme.typography.subtitle2)
                 Spacer(modifier = Modifier.height(ExampleItemTextPadding))
                 CompositionLocalProvider(LocalContentAlpha provides ContentAlpha.medium) {
-                    Text(
-                        text = example.description,
-                        style = MaterialTheme.typography.caption
-                    )
+                    Text(text = example.description, style = MaterialTheme.typography.caption)
                 }
             }
             Spacer(modifier = Modifier.width(ExampleItemPadding))
diff --git a/compose/material/material/integration-tests/material-catalog/src/main/java/androidx/compose/material/catalog/library/ui/theme/Theme.kt b/compose/material/material/integration-tests/material-catalog/src/main/java/androidx/compose/material/catalog/library/ui/theme/Theme.kt
index 7e78f9d..ec3736a 100644
--- a/compose/material/material/integration-tests/material-catalog/src/main/java/androidx/compose/material/catalog/library/ui/theme/Theme.kt
+++ b/compose/material/material/integration-tests/material-catalog/src/main/java/androidx/compose/material/catalog/library/ui/theme/Theme.kt
@@ -43,10 +43,7 @@
 import androidx.core.view.WindowCompat
 
 @Composable
-fun CatalogTheme(
-    theme: Theme,
-    content: @Composable () -> Unit
-) {
+fun CatalogTheme(theme: Theme, content: @Composable () -> Unit) {
     val darkTheme = isSystemInDarkTheme()
     val themePrimaryColor = theme.primaryColor.getColor(darkTheme)
     val themeSecondaryColor = theme.secondaryColor.getColor(darkTheme)
@@ -59,24 +56,25 @@
     val smallShapeSize = animateDpAsState(theme.smallShapeCornerSize.dp)
     val mediumShapeSize = animateDpAsState(theme.mediumShapeCornerSize.dp)
     val largeShapeSize = animateDpAsState(theme.largeShapeCornerSize.dp)
-    val colors = if (!darkTheme) {
-        lightColors(
-            primary = primaryColor.value,
-            primaryVariant = primaryVariantColor.value,
-            onPrimary = onPrimaryColor.value,
-            secondary = secondaryColor.value,
-            secondaryVariant = secondaryVariantColor.value,
-            onSecondary = onSecondaryColor.value
-        )
-    } else {
-        darkColors(
-            primary = primaryColor.value,
-            primaryVariant = primaryVariantColor.value,
-            onPrimary = onPrimaryColor.value,
-            secondary = secondaryColor.value,
-            onSecondary = onSecondaryColor.value
-        )
-    }
+    val colors =
+        if (!darkTheme) {
+            lightColors(
+                primary = primaryColor.value,
+                primaryVariant = primaryVariantColor.value,
+                onPrimary = onPrimaryColor.value,
+                secondary = secondaryColor.value,
+                secondaryVariant = secondaryVariantColor.value,
+                onSecondary = onSecondaryColor.value
+            )
+        } else {
+            darkColors(
+                primary = primaryColor.value,
+                primaryVariant = primaryVariantColor.value,
+                onPrimary = onPrimaryColor.value,
+                secondary = secondaryColor.value,
+                onSecondary = onSecondaryColor.value
+            )
+        }
     val view = LocalView.current
     val context = LocalContext.current
     SideEffect {
@@ -86,11 +84,12 @@
     MaterialTheme(
         colors = colors,
         typography = Typography(defaultFontFamily = theme.fontFamily.getFontFamily()),
-        shapes = Shapes(
-            small = theme.shapeCornerFamily.getShape(size = smallShapeSize.value),
-            medium = theme.shapeCornerFamily.getShape(size = mediumShapeSize.value),
-            large = theme.shapeCornerFamily.getShape(size = largeShapeSize.value),
-        ),
+        shapes =
+            Shapes(
+                small = theme.shapeCornerFamily.getShape(size = smallShapeSize.value),
+                medium = theme.shapeCornerFamily.getShape(size = mediumShapeSize.value),
+                large = theme.shapeCornerFamily.getShape(size = largeShapeSize.value),
+            ),
         content = content
     )
 }
diff --git a/compose/material/material/integration-tests/material-catalog/src/main/java/androidx/compose/material/catalog/library/ui/theme/ThemePicker.kt b/compose/material/material/integration-tests/material-catalog/src/main/java/androidx/compose/material/catalog/library/ui/theme/ThemePicker.kt
index c8a0638..16c91a9 100644
--- a/compose/material/material/integration-tests/material-catalog/src/main/java/androidx/compose/material/catalog/library/ui/theme/ThemePicker.kt
+++ b/compose/material/material/integration-tests/material-catalog/src/main/java/androidx/compose/material/catalog/library/ui/theme/ThemePicker.kt
@@ -68,22 +68,15 @@
 import androidx.compose.ui.unit.dp
 
 @Composable
-fun ThemePicker(
-    theme: Theme,
-    onThemeChange: (theme: Theme) -> Unit
-) {
+fun ThemePicker(theme: Theme, onThemeChange: (theme: Theme) -> Unit) {
     var themeState by remember { mutableStateOf(theme) }
 
     LazyColumn(
-        contentPadding = WindowInsets.safeDrawing
-            .only(WindowInsetsSides.Horizontal + WindowInsetsSides.Bottom)
-            .add(
-                WindowInsets(
-                    top = ThemePickerPadding,
-                    bottom = ThemePickerPadding
-                )
-            )
-            .asPaddingValues()
+        contentPadding =
+            WindowInsets.safeDrawing
+                .only(WindowInsetsSides.Horizontal + WindowInsetsSides.Bottom)
+                .add(WindowInsets(top = ThemePickerPadding, bottom = ThemePickerPadding))
+                .asPaddingValues()
     ) {
         item {
             Text(
@@ -102,11 +95,12 @@
             LazyRow(contentPadding = PaddingValues(end = ThemePickerPadding)) {
                 items(ThemeColor.values()) { themeColor ->
                     ThemeColorItem(
-                        modifier = Modifier.padding(
-                            start = ThemePickerPadding,
-                            top = ThemePickerPadding,
-                            bottom = ThemePickerPadding
-                        ),
+                        modifier =
+                            Modifier.padding(
+                                start = ThemePickerPadding,
+                                top = ThemePickerPadding,
+                                bottom = ThemePickerPadding
+                            ),
                         themeColor = themeColor,
                         selected = { it == themeState.primaryColor },
                         onClick = { themeState = themeState.copy(primaryColor = it) }
@@ -123,11 +117,12 @@
             LazyRow(contentPadding = PaddingValues(end = ThemePickerPadding)) {
                 items(ThemeColor.values()) { themeColor ->
                     ThemeColorItem(
-                        modifier = Modifier.padding(
-                            start = ThemePickerPadding,
-                            top = ThemePickerPadding,
-                            bottom = ThemePickerPadding
-                        ),
+                        modifier =
+                            Modifier.padding(
+                                start = ThemePickerPadding,
+                                top = ThemePickerPadding,
+                                bottom = ThemePickerPadding
+                            ),
                         themeColor = themeColor,
                         selected = { it == themeState.secondaryColor },
                         onClick = { themeState = themeState.copy(secondaryColor = it) }
@@ -197,11 +192,12 @@
                 modifier = Modifier.padding(horizontal = ThemePickerPadding)
             )
             LazyRow(
-                contentPadding = PaddingValues(
-                    start = ThemePickerPadding,
-                    top = ThemePickerPadding,
-                    bottom = ThemePickerPadding
-                )
+                contentPadding =
+                    PaddingValues(
+                        start = ThemePickerPadding,
+                        top = ThemePickerPadding,
+                        bottom = ThemePickerPadding
+                    )
             ) {
                 items(ThemeShapeCornerFamily.values()) { themeShapeCornerFamily ->
                     ThemeShapeCornerFamilyItem(
@@ -220,9 +216,7 @@
                 modifier = Modifier.padding(horizontal = ThemePickerPadding)
             )
             ThemeShapeCornerSizeItem(
-                modifier = Modifier
-                    .fillMaxWidth()
-                    .padding(horizontal = ThemePickerPadding),
+                modifier = Modifier.fillMaxWidth().padding(horizontal = ThemePickerPadding),
                 themeShapeCornerSize = themeState.smallShapeCornerSize,
                 themeShapeCornerSizeMax = MaxSmallShapeCornerSize,
                 onValueChange = { themeState = themeState.copy(smallShapeCornerSize = it) }
@@ -236,9 +230,7 @@
                 modifier = Modifier.padding(horizontal = ThemePickerPadding)
             )
             ThemeShapeCornerSizeItem(
-                modifier = Modifier
-                    .fillMaxWidth()
-                    .padding(horizontal = ThemePickerPadding),
+                modifier = Modifier.fillMaxWidth().padding(horizontal = ThemePickerPadding),
                 themeShapeCornerSize = themeState.mediumShapeCornerSize,
                 themeShapeCornerSizeMax = MaxMediumShapeCornerSize,
                 onValueChange = { themeState = themeState.copy(mediumShapeCornerSize = it) }
@@ -252,9 +244,7 @@
                 modifier = Modifier.padding(horizontal = ThemePickerPadding)
             )
             ThemeShapeCornerSizeItem(
-                modifier = Modifier
-                    .fillMaxWidth()
-                    .padding(horizontal = ThemePickerPadding),
+                modifier = Modifier.fillMaxWidth().padding(horizontal = ThemePickerPadding),
                 themeShapeCornerSize = themeState.largeShapeCornerSize,
                 themeShapeCornerSizeMax = MaxLargeShapeCornerSize,
                 onValueChange = { themeState = themeState.copy(largeShapeCornerSize = it) }
@@ -266,9 +256,7 @@
         item {
             Row(modifier = Modifier.padding(horizontal = ThemePickerPadding)) {
                 Button(
-                    onClick = {
-                        onThemeChange(themeState)
-                    },
+                    onClick = { onThemeChange(themeState) },
                     modifier = Modifier.weight(1f),
                     enabled = themeState != theme,
                     elevation = null
@@ -303,10 +291,11 @@
         selected = selected(themeColor),
         onClick = { onClick(themeColor) },
         modifier = modifier,
-        colors = RadioButtonDefaults.colors(
-            selectedColor = themeColor.getColor(darkTheme),
-            unselectedColor = themeColor.getColor(darkTheme)
-        )
+        colors =
+            RadioButtonDefaults.colors(
+                selectedColor = themeColor.getColor(darkTheme),
+                unselectedColor = themeColor.getColor(darkTheme)
+            )
     )
 }
 
@@ -317,20 +306,13 @@
     selected: (themeFontFamily: ThemeFontFamily) -> Boolean,
     onClick: (themeFontFamily: ThemeFontFamily) -> Unit
 ) {
-    Row(
-        modifier = modifier,
-        verticalAlignment = Alignment.CenterVertically
-    ) {
-        RadioButton(
-            selected = selected(themeFontFamily),
-            onClick = { onClick(themeFontFamily) }
-        )
+    Row(modifier = modifier, verticalAlignment = Alignment.CenterVertically) {
+        RadioButton(selected = selected(themeFontFamily), onClick = { onClick(themeFontFamily) })
         Spacer(modifier = Modifier.width(ThemePickerPadding))
         Text(
             text = themeFontFamily.label,
-            style = MaterialTheme.typography.body2.copy(
-                fontFamily = themeFontFamily.getFontFamily()
-            )
+            style =
+                MaterialTheme.typography.body2.copy(fontFamily = themeFontFamily.getFontFamily())
         )
     }
 }
@@ -345,18 +327,20 @@
     TextButton(
         onClick = { onClick(themeShapeCornerFamily) },
         modifier = modifier,
-        colors = if (selected(themeShapeCornerFamily)) {
-            ButtonDefaults.textButtonColors()
-        } else {
-            ButtonDefaults.textButtonColors(
-                contentColor = MaterialTheme.colors.onSurface.copy(alpha = ContentAlpha.medium)
-            )
-        }
+        colors =
+            if (selected(themeShapeCornerFamily)) {
+                ButtonDefaults.textButtonColors()
+            } else {
+                ButtonDefaults.textButtonColors(
+                    contentColor = MaterialTheme.colors.onSurface.copy(alpha = ContentAlpha.medium)
+                )
+            }
     ) {
-        val iconId = when (themeShapeCornerFamily) {
-            ThemeShapeCornerFamily.Rounded -> R.drawable.ic_shape_rounded_corner_24dp
-            ThemeShapeCornerFamily.Cut -> R.drawable.ic_shape_cut_corner_24dp
-        }
+        val iconId =
+            when (themeShapeCornerFamily) {
+                ThemeShapeCornerFamily.Rounded -> R.drawable.ic_shape_rounded_corner_24dp
+                ThemeShapeCornerFamily.Cut -> R.drawable.ic_shape_cut_corner_24dp
+            }
         Row(verticalAlignment = Alignment.CenterVertically) {
             Icon(
                 painter = painterResource(iconId),
diff --git a/compose/material/material/integration-tests/material-catalog/src/main/java/androidx/compose/material/catalog/library/util/Color.kt b/compose/material/material/integration-tests/material-catalog/src/main/java/androidx/compose/material/catalog/library/util/Color.kt
index 46070f9..e87dcdd3 100644
--- a/compose/material/material/integration-tests/material-catalog/src/main/java/androidx/compose/material/catalog/library/util/Color.kt
+++ b/compose/material/material/integration-tests/material-catalog/src/main/java/androidx/compose/material/catalog/library/util/Color.kt
@@ -34,7 +34,6 @@
  * Calculates if this color is considered light.
  *
  * @return true or false, depending on the higher contrast between [Color.Black] and [Color.White].
- *
  */
 fun Color.isLightColor(): Boolean {
     val contrastForBlack = calculateContrast(foreground = Color.Black)
diff --git a/compose/material/material/integration-tests/material-catalog/src/main/java/androidx/compose/material/catalog/library/util/Url.kt b/compose/material/material/integration-tests/material-catalog/src/main/java/androidx/compose/material/catalog/library/util/Url.kt
index fad3e2e..6b3a777 100644
--- a/compose/material/material/integration-tests/material-catalog/src/main/java/androidx/compose/material/catalog/library/util/Url.kt
+++ b/compose/material/material/integration-tests/material-catalog/src/main/java/androidx/compose/material/catalog/library/util/Url.kt
@@ -28,18 +28,21 @@
 const val GuidelinesUrl = "https://material.io"
 const val ComponentGuidelinesUrl = "https://material.io/components"
 const val ReleasesUrl = "https://developer.android.com/jetpack/androidx/releases/compose-material"
-const val DocsUrl = "https://developer.android.com/reference/kotlin/androidx/compose/" +
-    "material/package-summary"
-const val SourceUrl = "https://cs.android.com/androidx/platform/frameworks/support/+/" +
-    "androidx-main:compose/material"
-const val MaterialSourceUrl = "https://cs.android.com/androidx/platform/frameworks/support/+/" +
-    "androidx-main:compose/material/" +
-    "material/src/commonMain/kotlin/androidx/compose/material"
-const val SampleSourceUrl = "https://cs.android.com/androidx/platform/frameworks/support/+/" +
-    "androidx-main:compose/material/" +
-    "material/samples/src/main/java/androidx/compose/material/samples"
+const val DocsUrl =
+    "https://developer.android.com/reference/kotlin/androidx/compose/" + "material/package-summary"
+const val SourceUrl =
+    "https://cs.android.com/androidx/platform/frameworks/support/+/" +
+        "androidx-main:compose/material"
+const val MaterialSourceUrl =
+    "https://cs.android.com/androidx/platform/frameworks/support/+/" +
+        "androidx-main:compose/material/" +
+        "material/src/commonMain/kotlin/androidx/compose/material"
+const val SampleSourceUrl =
+    "https://cs.android.com/androidx/platform/frameworks/support/+/" +
+        "androidx-main:compose/material/" +
+        "material/samples/src/main/java/androidx/compose/material/samples"
 const val IssueUrl = "https://issuetracker.google.com/issues/new?component=742043"
 const val TermsUrl = "https://policies.google.com/terms"
 const val PrivacyUrl = "https://policies.google.com/privacy"
-const val LicensesUrl = "https://cs.android.com/androidx/platform/frameworks/support/+/" +
-    "androidx-main:LICENSE.txt"
+const val LicensesUrl =
+    "https://cs.android.com/androidx/platform/frameworks/support/+/" + "androidx-main:LICENSE.txt"
diff --git a/compose/material/material/integration-tests/material-demos/src/main/java/androidx/compose/material/demos/BadgeDemo.kt b/compose/material/material/integration-tests/material-demos/src/main/java/androidx/compose/material/demos/BadgeDemo.kt
index e03a6c9..7834ff7 100644
--- a/compose/material/material/integration-tests/material-demos/src/main/java/androidx/compose/material/demos/BadgeDemo.kt
+++ b/compose/material/material/integration-tests/material-demos/src/main/java/androidx/compose/material/demos/BadgeDemo.kt
@@ -59,31 +59,17 @@
     Column(Modifier.verticalScroll(rememberScrollState())) {
         var badgeCount by remember { mutableIntStateOf(8) }
         Spacer(Modifier.requiredHeight(24.dp))
-        TopAppBarWithBadge(
-            { badgeCount = 0 },
-            badgeCount
-        )
+        TopAppBarWithBadge({ badgeCount = 0 }, badgeCount)
         Spacer(Modifier.requiredHeight(24.dp))
-        BottomNavigationWithBadge(
-            { badgeCount = 0 },
-            artistsBadgeCount = badgeCount
-        )
+        BottomNavigationWithBadge({ badgeCount = 0 }, artistsBadgeCount = badgeCount)
         Spacer(Modifier.requiredHeight(24.dp))
-        TextTabsWithBadge(
-            { badgeCount = 0 },
-            tab1BadgeCount = badgeCount
-        )
+        TextTabsWithBadge({ badgeCount = 0 }, tab1BadgeCount = badgeCount)
         Spacer(Modifier.requiredHeight(24.dp))
-        LeadingIconTabsWithBadge(
-            { badgeCount = 0 },
-            tab1BadgeCount = badgeCount
-        )
+        LeadingIconTabsWithBadge({ badgeCount = 0 }, tab1BadgeCount = badgeCount)
         Spacer(Modifier.requiredHeight(24.dp))
         Button(
             modifier = Modifier.align(Alignment.CenterHorizontally),
-            onClick = {
-                badgeCount++
-            },
+            onClick = { badgeCount++ },
             colors = ButtonDefaults.buttonColors(backgroundColor = Color.Cyan)
         ) {
             Text("+ badge number")
@@ -114,9 +100,7 @@
         },
         actions = {
             // RowScope here, so these icons will be placed horizontally
-            IconButton(
-                onClick = onActionIcon1BadgeClick
-            ) {
+            IconButton(onClick = onActionIcon1BadgeClick) {
                 if (actionIcon1BadgeCount > 0) {
                     DemoBadgedBox(actionIcon1BadgeCount.toString()) {
                         Icon(Icons.Filled.Favorite, contentDescription = "Localized description")
@@ -125,9 +109,7 @@
                     Icon(Icons.Filled.Favorite, contentDescription = "Localized description")
                 }
             }
-            IconButton(
-                onClick = { showActionIcon2Badge = false }
-            ) {
+            IconButton(onClick = { showActionIcon2Badge = false }) {
                 if (showActionIcon2Badge) {
                     DemoBadgedBox("99+") {
                         Icon(Icons.Filled.Favorite, contentDescription = "Localized description")
@@ -143,10 +125,7 @@
 private const val initialSelectedIndex = 0
 
 @Composable
-fun BottomNavigationWithBadge(
-    onArtistsBadgeClick: () -> Unit,
-    artistsBadgeCount: Int
-) {
+fun BottomNavigationWithBadge(onArtistsBadgeClick: () -> Unit, artistsBadgeCount: Int) {
     var selectedItem by remember { mutableIntStateOf(initialSelectedIndex) }
     val items = listOf("Songs", "Artists", "Playlists", "Something else")
 
@@ -156,12 +135,13 @@
     Column {
         BottomNavigation {
             items.forEachIndexed { index, item ->
-                val showBadge = when (index) {
-                    0 -> showSongsBadge
-                    1 -> artistsBadgeCount > 0
-                    2 -> showPlaylistsBadge
-                    else -> false
-                }
+                val showBadge =
+                    when (index) {
+                        0 -> showSongsBadge
+                        1 -> artistsBadgeCount > 0
+                        2 -> showPlaylistsBadge
+                        else -> false
+                    }
                 BottomNavigationItem(
                     icon = {
                         if (!showBadge) {
@@ -219,10 +199,7 @@
 }
 
 @Composable
-fun TextTabsWithBadge(
-    onTab1BadgeClick: () -> Unit,
-    tab1BadgeCount: Int
-) {
+fun TextTabsWithBadge(onTab1BadgeClick: () -> Unit, tab1BadgeCount: Int) {
     var state by remember { mutableIntStateOf(initialSelectedIndex) }
     val titles = listOf("TAB 1", "TAB 2", "TAB 3 WITH LOTS OF TEXT")
     val showTabBadgeList = remember { mutableStateListOf(true, true) }
@@ -230,12 +207,13 @@
     Column {
         TabRow(selectedTabIndex = state) {
             titles.forEachIndexed { index, title ->
-                val showBadge: Boolean = when (index) {
-                    0 -> showTabBadgeList[0]
-                    1 -> tab1BadgeCount > 0
-                    2 -> showTabBadgeList[1]
-                    else -> false
-                }
+                val showBadge: Boolean =
+                    when (index) {
+                        0 -> showTabBadgeList[0]
+                        1 -> tab1BadgeCount > 0
+                        2 -> showTabBadgeList[1]
+                        else -> false
+                    }
                 Tab(
                     text = {
                         if (!showBadge) {
@@ -279,22 +257,24 @@
     tab1BadgeCount: Int,
 ) {
     var state by remember { mutableIntStateOf(0) }
-    val titlesAndIcons = listOf(
-        "TAB" to Icons.Filled.Favorite,
-        "TAB & ICON" to Icons.Filled.Favorite,
-        "TAB 3 WITH LOTS OF TEXT" to Icons.Filled.Favorite
-    )
+    val titlesAndIcons =
+        listOf(
+            "TAB" to Icons.Filled.Favorite,
+            "TAB & ICON" to Icons.Filled.Favorite,
+            "TAB 3 WITH LOTS OF TEXT" to Icons.Filled.Favorite
+        )
     val showTabBadgeList = remember { mutableStateListOf(true, true) }
 
     Column {
         TabRow(selectedTabIndex = state) {
             titlesAndIcons.forEachIndexed { index, (title, icon) ->
-                val showBadge: Boolean = when (index) {
-                    0 -> showTabBadgeList[0]
-                    1 -> tab1BadgeCount > 0
-                    2 -> showTabBadgeList[1]
-                    else -> false
-                }
+                val showBadge: Boolean =
+                    when (index) {
+                        0 -> showTabBadgeList[0]
+                        1 -> tab1BadgeCount > 0
+                        2 -> showTabBadgeList[1]
+                        else -> false
+                    }
                 LeadingIconTab(
                     text = {
                         if (!showBadge) {
@@ -311,12 +291,7 @@
                             }
                         }
                     },
-                    icon = {
-                        Icon(
-                            icon,
-                            contentDescription = "Localized description"
-                        )
-                    },
+                    icon = { Icon(icon, contentDescription = "Localized description") },
                     selected = state == index,
                     onClick = {
                         state = index
@@ -338,10 +313,7 @@
 }
 
 @Composable
-private fun DemoBadgedBox(
-    badgeText: String?,
-    content: @Composable () -> Unit
-) {
+private fun DemoBadgedBox(badgeText: String?, content: @Composable () -> Unit) {
     BadgedBox(
         badge = {
             Badge(
@@ -351,9 +323,10 @@
                             Text(
                                 badgeText,
                                 textAlign = TextAlign.Center,
-                                modifier = Modifier.semantics {
-                                    this.contentDescription = "$badgeText notifications"
-                                }
+                                modifier =
+                                    Modifier.semantics {
+                                        this.contentDescription = "$badgeText notifications"
+                                    }
                             )
                         }
                     } else null
diff --git a/compose/material/material/integration-tests/material-demos/src/main/java/androidx/compose/material/demos/BottomNavigationDemo.kt b/compose/material/material/integration-tests/material-demos/src/main/java/androidx/compose/material/demos/BottomNavigationDemo.kt
index 02ff422..bb0bcaa 100644
--- a/compose/material/material/integration-tests/material-demos/src/main/java/androidx/compose/material/demos/BottomNavigationDemo.kt
+++ b/compose/material/material/integration-tests/material-demos/src/main/java/androidx/compose/material/demos/BottomNavigationDemo.kt
@@ -42,42 +42,33 @@
 @Composable
 fun BottomNavigationDemo() {
     var alwaysShowLabels by remember { mutableStateOf(false) }
-    Column(
-        modifier = Modifier.fillMaxHeight(),
-        verticalArrangement = Arrangement.Bottom
-    ) {
+    Column(modifier = Modifier.fillMaxHeight(), verticalArrangement = Arrangement.Bottom) {
         Column(Modifier.selectableGroup()) {
             Row(
-                modifier = Modifier
-                    .fillMaxWidth()
-                    .height(56.dp)
-                    .selectable(
-                        selected = !alwaysShowLabels,
-                        onClick = { alwaysShowLabels = false }
-                    ),
+                modifier =
+                    Modifier.fillMaxWidth()
+                        .height(56.dp)
+                        .selectable(
+                            selected = !alwaysShowLabels,
+                            onClick = { alwaysShowLabels = false }
+                        ),
                 verticalAlignment = Alignment.CenterVertically
             ) {
-                RadioButton(
-                    selected = !alwaysShowLabels,
-                    onClick = null
-                )
+                RadioButton(selected = !alwaysShowLabels, onClick = null)
                 Spacer(Modifier.requiredWidth(16.dp))
                 Text("Only show labels when selected")
             }
             Row(
-                modifier = Modifier
-                    .fillMaxWidth()
-                    .height(56.dp)
-                    .selectable(
-                        selected = alwaysShowLabels,
-                        onClick = { alwaysShowLabels = true }
-                    ),
+                modifier =
+                    Modifier.fillMaxWidth()
+                        .height(56.dp)
+                        .selectable(
+                            selected = alwaysShowLabels,
+                            onClick = { alwaysShowLabels = true }
+                        ),
                 verticalAlignment = Alignment.CenterVertically
             ) {
-                RadioButton(
-                    selected = alwaysShowLabels,
-                    onClick = null
-                )
+                RadioButton(selected = alwaysShowLabels, onClick = null)
                 Spacer(Modifier.requiredWidth(16.dp))
                 Text("Always show labels")
             }
diff --git a/compose/material/material/integration-tests/material-demos/src/main/java/androidx/compose/material/demos/ButtonDemo.kt b/compose/material/material/integration-tests/material-demos/src/main/java/androidx/compose/material/demos/ButtonDemo.kt
index 54dc11a..7bdf00f 100644
--- a/compose/material/material/integration-tests/material-demos/src/main/java/androidx/compose/material/demos/ButtonDemo.kt
+++ b/compose/material/material/integration-tests/material-demos/src/main/java/androidx/compose/material/demos/ButtonDemo.kt
@@ -65,18 +65,10 @@
         contentPadding = PaddingValues(10.dp),
         verticalArrangement = Arrangement.spacedBy(DefaultSpace)
     ) {
-        item {
-            Buttons()
-        }
-        item {
-            Fabs()
-        }
-        item {
-            IconButtons()
-        }
-        item {
-            CustomShapeButton()
-        }
+        item { Buttons() }
+        item { Fabs() }
+        item { IconButtons() }
+        item { CustomShapeButton() }
     }
 }
 
@@ -95,9 +87,7 @@
     Row(Modifier.fillMaxWidth(), horizontalArrangement = Arrangement.SpaceEvenly) {
         Button(
             onClick = {},
-            colors = ButtonDefaults.buttonColors(
-                backgroundColor = MaterialTheme.colors.secondary
-            )
+            colors = ButtonDefaults.buttonColors(backgroundColor = MaterialTheme.colors.secondary)
         ) {
             Text("Secondary Color")
         }
@@ -107,15 +97,9 @@
     Spacer(Modifier.height(DefaultSpace))
 
     Row(Modifier.fillMaxWidth(), horizontalArrangement = Arrangement.SpaceEvenly) {
-        Button(onClick = {}, enabled = false) {
-            Text("Disabled")
-        }
-        OutlinedButton(onClick = {}, enabled = false) {
-            Text("Disabled")
-        }
-        TextButton(onClick = {}, enabled = false) {
-            Text("Disabled")
-        }
+        Button(onClick = {}, enabled = false) { Text("Disabled") }
+        OutlinedButton(onClick = {}, enabled = false) { Text("Disabled") }
+        TextButton(onClick = {}, enabled = false) { Text("Disabled") }
     }
 }
 
@@ -153,9 +137,7 @@
         onClick = {},
         modifier = Modifier.size(110.dp),
         shape = TriangleShape,
-        colors = ButtonDefaults.outlinedButtonColors(
-            backgroundColor = Color.Yellow
-        ),
+        colors = ButtonDefaults.outlinedButtonColors(backgroundColor = Color.Yellow),
         border = BorderStroke(width = 2.dp, color = Color.Black)
     ) {
         Column {
diff --git a/compose/material/material/integration-tests/material-demos/src/main/java/androidx/compose/material/demos/ChipDemos.kt b/compose/material/material/integration-tests/material-demos/src/main/java/androidx/compose/material/demos/ChipDemos.kt
index 62523a5..66dfd3c 100644
--- a/compose/material/material/integration-tests/material-demos/src/main/java/androidx/compose/material/demos/ChipDemos.kt
+++ b/compose/material/material/integration-tests/material-demos/src/main/java/androidx/compose/material/demos/ChipDemos.kt
@@ -51,12 +51,8 @@
             contentPadding = PaddingValues(DefaultSpace),
             verticalArrangement = Arrangement.spacedBy(DefaultSpace)
         ) {
-            item {
-                Chips(chipEnabledState.value)
-            }
-            item {
-                FilterChips(chipEnabledState.value)
-            }
+            item { Chips(chipEnabledState.value) }
+            item { FilterChips(chipEnabledState.value) }
         }
         Row(horizontalArrangement = Arrangement.Center) {
             Text("Enabled")
@@ -75,24 +71,13 @@
     Text("Action Chips")
     Spacer(Modifier.height(DefaultSpace))
     Row(Modifier.fillMaxWidth(), horizontalArrangement = Arrangement.SpaceEvenly) {
-        Chip(
-            onClick = { /* Do something! */ },
-            enabled = enabled
-        ) {
-            Text("Action chip")
-        }
+        Chip(onClick = { /* Do something! */ }, enabled = enabled) { Text("Action chip") }
         Chip(
             onClick = { /* Do something! */ },
             border = ChipDefaults.outlinedBorder,
             colors = ChipDefaults.outlinedChipColors(),
             enabled = enabled,
-            leadingIcon =
-            {
-                Icon(
-                    Icons.Filled.Settings,
-                    contentDescription = null
-                )
-            }
+            leadingIcon = { Icon(Icons.Filled.Settings, contentDescription = null) }
         ) {
             Text("Action chip")
         }
@@ -107,7 +92,9 @@
     Row(Modifier.fillMaxWidth(), horizontalArrangement = Arrangement.SpaceEvenly) {
         val state1 = remember { mutableStateOf(false) }
         FilterChip(
-            selected = state1.value, onClick = { state1.value = !state1.value }, enabled = enabled,
+            selected = state1.value,
+            onClick = { state1.value = !state1.value },
+            enabled = enabled,
             selectedIcon = {
                 Icon(
                     imageVector = Icons.Filled.Done,
diff --git a/compose/material/material/integration-tests/material-demos/src/main/java/androidx/compose/material/demos/ColorPickerDemo.kt b/compose/material/material/integration-tests/material-demos/src/main/java/androidx/compose/material/demos/ColorPickerDemo.kt
index a2e1d22..0b47054 100644
--- a/compose/material/material/integration-tests/material-demos/src/main/java/androidx/compose/material/demos/ColorPickerDemo.kt
+++ b/compose/material/material/integration-tests/material-demos/src/main/java/androidx/compose/material/demos/ColorPickerDemo.kt
@@ -74,9 +74,9 @@
 import java.util.Locale
 
 /**
- * Demo that shows picking a color from a color wheel, which then dynamically updates
- * the color of a [TopAppBar]. This pattern could also be used to update the value of a
- * Colors, updating the overall theme for an application.
+ * Demo that shows picking a color from a color wheel, which then dynamically updates the color of a
+ * [TopAppBar]. This pattern could also be used to update the value of a Colors, updating the
+ * overall theme for an application.
  */
 @Composable
 fun ColorPickerDemo() {
@@ -91,38 +91,35 @@
 
 @Composable
 private fun ColorPicker(onColorChange: (Color) -> Unit) {
-    BoxWithConstraints(
-        Modifier.padding(50.dp)
-            .fillMaxSize()
-            .aspectRatio(1f)
-    ) {
+    BoxWithConstraints(Modifier.padding(50.dp).fillMaxSize().aspectRatio(1f)) {
         val diameter = constraints.maxWidth
         var position by remember { mutableStateOf(Offset.Zero) }
         val colorWheel = remember(diameter) { ColorWheel(diameter) }
 
         var hasInput by remember { mutableStateOf(false) }
-        val inputModifier = Modifier.pointerInput(colorWheel) {
-            fun updateColorWheel(newPosition: Offset) {
-                // Work out if the new position is inside the circle we are drawing, and has a
-                // valid color associated to it. If not, keep the current position
-                val newColor = colorWheel.colorForPosition(newPosition)
-                if (newColor.isSpecified) {
-                    position = newPosition
-                    onColorChange(newColor)
+        val inputModifier =
+            Modifier.pointerInput(colorWheel) {
+                fun updateColorWheel(newPosition: Offset) {
+                    // Work out if the new position is inside the circle we are drawing, and has a
+                    // valid color associated to it. If not, keep the current position
+                    val newColor = colorWheel.colorForPosition(newPosition)
+                    if (newColor.isSpecified) {
+                        position = newPosition
+                        onColorChange(newColor)
+                    }
                 }
-            }
 
-            awaitEachGesture {
-                val down = awaitFirstDown()
-                hasInput = true
-                updateColorWheel(down.position)
-                drag(down.id) { change ->
-                    change.consume()
-                    updateColorWheel(change.position)
+                awaitEachGesture {
+                    val down = awaitFirstDown()
+                    hasInput = true
+                    updateColorWheel(down.position)
+                    drag(down.id) { change ->
+                        change.consume()
+                        updateColorWheel(change.position)
+                    }
+                    hasInput = false
                 }
-                hasInput = false
             }
-        }
 
         Box(Modifier.fillMaxSize()) {
             Image(modifier = inputModifier, contentDescription = null, bitmap = colorWheel.image)
@@ -134,28 +131,22 @@
     }
 }
 
-/**
- * Magnifier displayed on top of [position] with the currently selected [color].
- */
+/** Magnifier displayed on top of [position] with the currently selected [color]. */
 @Composable
 private fun Magnifier(visible: Boolean, position: Offset, color: Color) {
-    val offset = with(LocalDensity.current) {
-        Modifier.offset(
-            position.x.toDp() - MagnifierWidth / 2,
-            // Align with the center of the selection circle
-            position.y.toDp() - (MagnifierHeight - (SelectionCircleDiameter / 2))
-        )
-    }
-    MagnifierTransition(
-        visible,
-        MagnifierWidth,
-        SelectionCircleDiameter
-    ) { labelWidth: Dp, selectionDiameter: Dp,
+    val offset =
+        with(LocalDensity.current) {
+            Modifier.offset(
+                position.x.toDp() - MagnifierWidth / 2,
+                // Align with the center of the selection circle
+                position.y.toDp() - (MagnifierHeight - (SelectionCircleDiameter / 2))
+            )
+        }
+    MagnifierTransition(visible, MagnifierWidth, SelectionCircleDiameter) {
+        labelWidth: Dp,
+        selectionDiameter: Dp,
         alpha: Float ->
-        Column(
-            offset.size(width = MagnifierWidth, height = MagnifierHeight)
-                .alpha(alpha)
-        ) {
+        Column(offset.size(width = MagnifierWidth, height = MagnifierHeight).alpha(alpha)) {
             Box(Modifier.fillMaxWidth(), contentAlignment = Alignment.Center) {
                 MagnifierLabel(Modifier.size(labelWidth, MagnifierLabelHeight), color)
             }
@@ -187,23 +178,22 @@
     content: @Composable (labelWidth: Dp, selectionDiameter: Dp, alpha: Float) -> Unit
 ) {
     val transition = updateTransition(visible)
-    val labelWidth by transition.animateDp(transitionSpec = { tween() }) {
-        if (it) maxWidth else 0.dp
-    }
-    val magnifierDiameter by transition.animateDp(transitionSpec = { tween() }) {
-        if (it) maxDiameter else 0.dp
-    }
-    val alpha by transition.animateFloat(
-        transitionSpec = {
-            if (true isTransitioningTo false) {
-                tween(delayMillis = 100, durationMillis = 200)
-            } else {
-                tween()
+    val labelWidth by
+        transition.animateDp(transitionSpec = { tween() }) { if (it) maxWidth else 0.dp }
+    val magnifierDiameter by
+        transition.animateDp(transitionSpec = { tween() }) { if (it) maxDiameter else 0.dp }
+    val alpha by
+        transition.animateFloat(
+            transitionSpec = {
+                if (true isTransitioningTo false) {
+                    tween(delayMillis = 100, durationMillis = 200)
+                } else {
+                    tween()
+                }
             }
+        ) {
+            if (it) 1f else 0f
         }
-    ) {
-        if (it) 1f else 0f
-    }
     content(labelWidth, magnifierDiameter, alpha)
 }
 
@@ -229,9 +219,7 @@
     }
 }
 
-/**
- * Selection circle drawn over the currently selected pixel of the color wheel.
- */
+/** Selection circle drawn over the currently selected pixel of the color wheel. */
 @Composable
 private fun MagnifierSelectionCircle(modifier: Modifier, color: Color) {
     Surface(
@@ -244,9 +232,7 @@
     )
 }
 
-/**
- * A [GenericShape] that draws a box with a triangle at the bottom center to indicate a popup.
- */
+/** A [GenericShape] that draws a box with a triangle at the bottom center to indicate a popup. */
 private val MagnifierPopupShape = GenericShape { size, _ ->
     val width = size.width
     val height = size.height
@@ -268,31 +254,34 @@
 private class ColorWheel(diameter: Int) {
     private val radius = diameter / 2f
 
-    private val sweepGradient = SweepGradientShader(
-        colors = listOf(
-            Color.Red,
-            Color.Magenta,
-            Color.Blue,
-            Color.Cyan,
-            Color.Green,
-            Color.Yellow,
-            Color.Red
-        ),
-        colorStops = null,
-        center = Offset(radius, radius)
-    )
+    private val sweepGradient =
+        SweepGradientShader(
+            colors =
+                listOf(
+                    Color.Red,
+                    Color.Magenta,
+                    Color.Blue,
+                    Color.Cyan,
+                    Color.Green,
+                    Color.Yellow,
+                    Color.Red
+                ),
+            colorStops = null,
+            center = Offset(radius, radius)
+        )
 
-    val image = ImageBitmap(diameter, diameter).also { imageBitmap ->
-        val canvas = Canvas(imageBitmap)
-        val center = Offset(radius, radius)
-        val paint = Paint().apply { shader = sweepGradient }
-        canvas.drawCircle(center, radius, paint)
-    }
+    val image =
+        ImageBitmap(diameter, diameter).also { imageBitmap ->
+            val canvas = Canvas(imageBitmap)
+            val center = Offset(radius, radius)
+            val paint = Paint().apply { shader = sweepGradient }
+            canvas.drawCircle(center, radius, paint)
+        }
 }
 
 /**
- * @return the matching color for [position] inside [ColorWheel], or `null` if there is no color
- * or the color is partially transparent.
+ * @return the matching color for [position] inside [ColorWheel], or `null` if there is no color or
+ *   the color is partially transparent.
  */
 private fun ColorWheel.colorForPosition(position: Offset): Color {
     val x = position.x.toInt().coerceAtLeast(0)
diff --git a/compose/material/material/integration-tests/material-demos/src/main/java/androidx/compose/material/demos/DynamicThemeActivity.kt b/compose/material/material/integration-tests/material-demos/src/main/java/androidx/compose/material/demos/DynamicThemeActivity.kt
index 8612e36..04dac12 100644
--- a/compose/material/material/integration-tests/material-demos/src/main/java/androidx/compose/material/demos/DynamicThemeActivity.kt
+++ b/compose/material/material/integration-tests/material-demos/src/main/java/androidx/compose/material/demos/DynamicThemeActivity.kt
@@ -74,37 +74,32 @@
     private val Colors.darkenedPrimary: Int
         get() {
             return with(primary) {
-                copy(
-                    red = red * 0.75f,
-                    green = green * 0.75f,
-                    blue = blue * 0.75f
-                )
-            }.toArgb()
+                    copy(red = red * 0.75f, green = green * 0.75f, blue = blue * 0.75f)
+                }
+                .toArgb()
         }
 }
 
 private typealias ScrollFraction = MutableState<Float>
 
-private val LazyListState.scrollOffset: Float get() {
-    val total = layoutInfo.totalItemsCount
-    if (total == 0 || layoutInfo.visibleItemsInfo.isEmpty()) {
-        return 0f
-    } else {
-        val itemSize = layoutInfo.visibleItemsInfo.first().size
-        val currentOffset = firstVisibleItemIndex * itemSize +
-            firstVisibleItemScrollOffset
-        return (currentOffset.toFloat() / (total * itemSize)).coerceIn(0f, 1f)
+private val LazyListState.scrollOffset: Float
+    get() {
+        val total = layoutInfo.totalItemsCount
+        if (total == 0 || layoutInfo.visibleItemsInfo.isEmpty()) {
+            return 0f
+        } else {
+            val itemSize = layoutInfo.visibleItemsInfo.first().size
+            val currentOffset = firstVisibleItemIndex * itemSize + firstVisibleItemScrollOffset
+            return (currentOffset.toFloat() / (total * itemSize)).coerceIn(0f, 1f)
+        }
     }
-}
 
 @Composable
 private fun DynamicThemeApp(scrollFraction: ScrollFraction, palette: Colors) {
     MaterialTheme(palette) {
         val state = rememberLazyListState()
         LaunchedEffect(state) {
-            snapshotFlow { state.scrollOffset }.collect {
-                scrollFraction.value = it
-            }
+            snapshotFlow { state.scrollOffset }.collect { scrollFraction.value = it }
         }
         Scaffold(
             topBar = { TopAppBar({ Text("Scroll down!") }) },
@@ -113,11 +108,7 @@
             floatingActionButtonPosition = FabPosition.Center,
             isFloatingActionButtonDocked = true,
             content = { innerPadding ->
-                LazyColumn(state = state, contentPadding = innerPadding) {
-                    items(20) {
-                        Card(it)
-                    }
-                }
+                LazyColumn(state = state, contentPadding = innerPadding) { items(20) { Card(it) } }
             }
         )
     }
@@ -140,7 +131,9 @@
     // colour from the Material theme to work out text colour, so we end up doing a
     // large amount of work here when the top level theme changes
     Box(
-        Modifier.padding(25.dp).fillMaxWidth().height(150.dp)
+        Modifier.padding(25.dp)
+            .fillMaxWidth()
+            .height(150.dp)
             .background(shapeColor, RoundedCornerShape(10.dp)),
         contentAlignment = Alignment.Center
     ) {
@@ -155,16 +148,10 @@
     val secondary = lerp(Color(0xFF03DAC6), Color(0xFFBB86FC), interpolatedFraction)
     val background = lerp(Color.White, Color(0xFF121212), interpolatedFraction)
 
-    return lightColors(
-        primary = primary,
-        secondary = secondary,
-        background = background
-    )
+    return lightColors(primary = primary, secondary = secondary, background = background)
 }
 
-/**
- * 'Animate' the emoji in the FAB from 'sun' to 'moon' as we darken the theme
- */
+/** 'Animate' the emoji in the FAB from 'sun' to 'moon' as we darken the theme */
 private fun emojiForScrollFraction(fraction: Float): String {
     return when {
         // Sun
diff --git a/compose/material/material/integration-tests/material-demos/src/main/java/androidx/compose/material/demos/ElevationDemo.kt b/compose/material/material/integration-tests/material-demos/src/main/java/androidx/compose/material/demos/ElevationDemo.kt
index 6459c68..bf479e9 100644
--- a/compose/material/material/integration-tests/material-demos/src/main/java/androidx/compose/material/demos/ElevationDemo.kt
+++ b/compose/material/material/integration-tests/material-demos/src/main/java/androidx/compose/material/demos/ElevationDemo.kt
@@ -45,13 +45,8 @@
             val text = getMessage(MaterialTheme.colors.isLight)
             Text(text)
         }
-        LazyColumn(
-            modifier = Modifier.fillMaxSize(),
-            contentPadding = PaddingValues(25.dp)
-        ) {
-            items(elevations) { elevation ->
-                ElevatedCard(elevation)
-            }
+        LazyColumn(modifier = Modifier.fillMaxSize(), contentPadding = PaddingValues(25.dp)) {
+            items(elevations) { elevation -> ElevatedCard(elevation) }
         }
     }
 }
@@ -66,36 +61,20 @@
         border = if (elevation == 0.dp) BorderStroke(1.dp, Color.Gray) else null,
         elevation = elevation
     ) {
-        Box(
-            Modifier
-                .fillMaxWidth()
-                .height(150.dp),
-            contentAlignment = Alignment.Center
-        ) {
+        Box(Modifier.fillMaxWidth().height(150.dp), contentAlignment = Alignment.Center) {
             Text("$elevation", style = MaterialTheme.typography.h4)
         }
     }
 }
 
-private val elevations = listOf(
-    0.dp,
-    1.dp,
-    2.dp,
-    3.dp,
-    4.dp,
-    6.dp,
-    8.dp,
-    12.dp,
-    16.dp,
-    24.dp
-)
+private val elevations = listOf(0.dp, 1.dp, 2.dp, 3.dp, 4.dp, 6.dp, 8.dp, 12.dp, 16.dp, 24.dp)
 
-private fun getMessage(isLight: Boolean) = (
-    if (isLight) {
+private fun getMessage(isLight: Boolean) =
+    (if (isLight) {
         "In a light theme elevation is represented by shadows"
     } else {
         "In a dark theme elevation is represented by shadows and a translucent white overlay " +
             "applied to the surface"
-    }
-    ) + "\n\nnote: drawing a small border around 0.dp elevation to make it visible where the " +
-    "card edges end"
+    }) +
+        "\n\nnote: drawing a small border around 0.dp elevation to make it visible where the " +
+        "card edges end"
diff --git a/compose/material/material/integration-tests/material-demos/src/main/java/androidx/compose/material/demos/ExposedDropdownMenuDemo.kt b/compose/material/material/integration-tests/material-demos/src/main/java/androidx/compose/material/demos/ExposedDropdownMenuDemo.kt
index c387e16..84eb4387 100644
--- a/compose/material/material/integration-tests/material-demos/src/main/java/androidx/compose/material/demos/ExposedDropdownMenuDemo.kt
+++ b/compose/material/material/integration-tests/material-demos/src/main/java/androidx/compose/material/demos/ExposedDropdownMenuDemo.kt
@@ -36,9 +36,7 @@
 
 @Composable
 fun ExposedDropdownMenuDemo() {
-    Column(
-        verticalArrangement = Arrangement.spacedBy(DefaultSpace)
-    ) {
+    Column(verticalArrangement = Arrangement.spacedBy(DefaultSpace)) {
         ExposedDropdownMenuSample()
 
         EditableExposedDropdownMenuSample()
@@ -61,23 +59,14 @@
     var expanded by remember { mutableStateOf(false) }
     var selectedOptionText by remember { mutableStateOf(if (isReadOnly) options[0] else "") }
     // We want to react on tap/press on TextField to show menu
-    ExposedDropdownMenuBox(
-        expanded = expanded,
-        onExpandedChange = {
-            expanded = !expanded
-        }
-    ) {
+    ExposedDropdownMenuBox(expanded = expanded, onExpandedChange = { expanded = !expanded }) {
         if (isOutlined) {
             OutlinedTextField(
                 readOnly = isReadOnly,
                 value = selectedOptionText,
                 onValueChange = { selectedOptionText = it },
                 label = { Text("Label") },
-                trailingIcon = {
-                    ExposedDropdownMenuDefaults.TrailingIcon(
-                        expanded = expanded
-                    )
-                },
+                trailingIcon = { ExposedDropdownMenuDefaults.TrailingIcon(expanded = expanded) },
                 colors = ExposedDropdownMenuDefaults.outlinedTextFieldColors()
             )
         } else {
@@ -86,33 +75,16 @@
                 value = selectedOptionText,
                 onValueChange = { selectedOptionText = it },
                 label = { Text("Label") },
-                trailingIcon = {
-                    ExposedDropdownMenuDefaults.TrailingIcon(
-                        expanded = expanded
-                    )
-                },
+                trailingIcon = { ExposedDropdownMenuDefaults.TrailingIcon(expanded = expanded) },
                 colors = ExposedDropdownMenuDefaults.textFieldColors()
             )
         }
-        if (
-            options.any {
-                it.contains(
-                        selectedOptionText,
-                        ignoreCase = true
-                    )
-            } || isReadOnly
-        ) {
-            ExposedDropdownMenu(
-                expanded = expanded,
-                onDismissRequest = {
-                    expanded = false
-                }
-            ) {
+        if (options.any { it.contains(selectedOptionText, ignoreCase = true) } || isReadOnly) {
+            ExposedDropdownMenu(expanded = expanded, onDismissRequest = { expanded = false }) {
                 options.forEach { selectionOption ->
-                    if (selectionOption.contains(
-                            selectedOptionText,
-                            ignoreCase = true
-                        ) || isReadOnly
+                    if (
+                        selectionOption.contains(selectedOptionText, ignoreCase = true) ||
+                            isReadOnly
                     ) {
                         DropdownMenuItem(
                             onClick = {
diff --git a/compose/material/material/integration-tests/material-demos/src/main/java/androidx/compose/material/demos/ListItemDemo.kt b/compose/material/material/integration-tests/material-demos/src/main/java/androidx/compose/material/demos/ListItemDemo.kt
index ca38f424..0072bb2 100644
--- a/compose/material/material/integration-tests/material-demos/src/main/java/androidx/compose/material/demos/ListItemDemo.kt
+++ b/compose/material/material/integration-tests/material-demos/src/main/java/androidx/compose/material/demos/ListItemDemo.kt
@@ -29,32 +29,18 @@
 @Composable
 fun ListItemDemo() {
     LazyColumn {
-        item {
-            ClickableListItems()
-        }
-        item {
-            OneLineListItems()
-        }
-        item {
-            TwoLineListItems()
-        }
-        item {
-            ThreeLineListItems()
-        }
+        item { ClickableListItems() }
+        item { OneLineListItems() }
+        item { TwoLineListItems() }
+        item { ThreeLineListItems() }
     }
 }
 
 @Composable
 fun MixedRtlLtrListItemDemo() {
     LazyColumn {
-        item {
-            OneLineRtlLtrListItems()
-        }
-        item {
-            TwoLineRtlLtrListItems()
-        }
-        item {
-            ThreeLineRtlLtrListItems()
-        }
+        item { OneLineRtlLtrListItems() }
+        item { TwoLineRtlLtrListItems() }
+        item { ThreeLineRtlLtrListItems() }
     }
 }
diff --git a/compose/material/material/integration-tests/material-demos/src/main/java/androidx/compose/material/demos/MaterialDemos.kt b/compose/material/material/integration-tests/material-demos/src/main/java/androidx/compose/material/demos/MaterialDemos.kt
index 4ca1db4..062f530 100644
--- a/compose/material/material/integration-tests/material-demos/src/main/java/androidx/compose/material/demos/MaterialDemos.kt
+++ b/compose/material/material/integration-tests/material-demos/src/main/java/androidx/compose/material/demos/MaterialDemos.kt
@@ -37,95 +37,98 @@
 import androidx.compose.material.samples.ScaffoldWithSimpleSnackbar
 import androidx.compose.material.samples.SimpleScaffoldWithTopBar
 
-val MaterialDemos = DemoCategory(
-    "Material",
-    listOf(
-        DemoCategory(
-            "AlertDialog",
-            listOf(
-                ComposableDemo("Default dialog") { AlertDialogSample() },
-                ComposableDemo("Custom buttons") { CustomAlertDialogSample() }
-            )
-        ),
-        ComposableDemo("App Bars") { AppBarDemo() },
-        ComposableDemo("Backdrop") { BackdropScaffoldSample() },
-        ComposableDemo("Badge") { BadgeDemo() },
-        ComposableDemo("Bottom Navigation") { BottomNavigationDemo() },
-        DemoCategory(
-            "Bottom Sheets",
-            listOf(
-                ComposableDemo("Standard Bottom Sheet") { BottomSheetScaffoldSample() },
-                ComposableDemo("Standard Bottom Sheet with Drawer") {
-                    BottomSheetScaffoldWithDrawerSample()
-                },
-                ComposableDemo("Modal Bottom Sheet") { ModalBottomSheetSample() },
-                ComposableDemo("Modal Bottom Sheet In Navigation") { BottomSheetNavDemo() },
-            )
-        ),
-        ComposableDemo("Buttons & FABs") { ButtonDemo() },
-        ComposableDemo("Chips") { ChipDemo() },
-        DemoCategory(
-            "Navigation drawer",
-            listOf(
-                ComposableDemo("Modal drawer") { ModalDrawerSample() },
-                ComposableDemo("Bottom drawer") { BottomDrawerSample() }
-            )
-        ),
-        ComposableDemo("Elevation") { ElevationDemo() },
-        ComposableDemo("Content alpha") { ContentAlphaSample() },
-        DemoCategory(
-            "ListItems",
-            listOf(
-                ComposableDemo("ListItems") { ListItemDemo() },
-                ComposableDemo("Mixing RTL and LTR") { MixedRtlLtrListItemDemo() }
-            )
-        ),
-        ComposableDemo("Material Theme") { MaterialThemeDemo() },
-        DemoCategory(
-            "Menus",
-            listOf(
-                ComposableDemo("Dropdown Menu positioning") { MenuDemo() },
-                ComposableDemo("ExposedDropdownMenu") { ExposedDropdownMenuDemo() }
-            )
-        ),
-        ComposableDemo("Navigation Rail") { NavigationRailDemo() },
-        DemoCategory(
-            "Playground",
-            listOf(
-                ComposableDemo("Color Picker") { ColorPickerDemo() },
-                ActivityDemo("Dynamic Theme", DynamicThemeActivity::class)
-            )
-        ),
-        ComposableDemo("Progress Indicators") { ProgressIndicatorDemo() },
-        DemoCategory(
-            "Scaffold",
-            listOf(
-                ComposableDemo("Scaffold with top bar") { SimpleScaffoldWithTopBar() },
-                ComposableDemo("Scaffold with docked FAB") { ScaffoldWithBottomBarAndCutout() },
-                ComposableDemo("Scaffold with snackbar") { ScaffoldWithSimpleSnackbar() }
-            )
-        ),
-        ComposableDemo("Selection Controls") { SelectionControlsDemo() },
-        ComposableDemo("Slider") { SliderDemo() },
-        ComposableDemo("Snackbar") { ScaffoldWithCoroutinesSnackbar() },
-        ComposableDemo("Swipe to dismiss") { SwipeToDismissDemo() },
-        ComposableDemo("Tabs") { TabDemo() },
-        DemoCategory(
-            "TextFields",
-            listOf(
-                ComposableDemo("FilledTextField/OutlinedTextField") { MaterialTextFieldDemo() },
-                ComposableDemo("Multiple text fields") { TextFieldsDemo() },
-                ComposableDemo("Textfield decoration box") { DecorationBoxDemos() },
-                ComposableDemo("Alignment inside text fields") { VerticalAlignmentsInTextField() }
-            )
-        ),
-        DemoCategory(
-            "PullRefresh",
-            listOf(
-                ComposableDemo("PullRefresh") { PullRefreshSample() },
-                ComposableDemo("Custom PullRefresh") { CustomPullRefreshSample() },
-                ComposableDemo("Custom Indicator") { PullRefreshIndicatorTransformSample() }
+val MaterialDemos =
+    DemoCategory(
+        "Material",
+        listOf(
+            DemoCategory(
+                "AlertDialog",
+                listOf(
+                    ComposableDemo("Default dialog") { AlertDialogSample() },
+                    ComposableDemo("Custom buttons") { CustomAlertDialogSample() }
+                )
+            ),
+            ComposableDemo("App Bars") { AppBarDemo() },
+            ComposableDemo("Backdrop") { BackdropScaffoldSample() },
+            ComposableDemo("Badge") { BadgeDemo() },
+            ComposableDemo("Bottom Navigation") { BottomNavigationDemo() },
+            DemoCategory(
+                "Bottom Sheets",
+                listOf(
+                    ComposableDemo("Standard Bottom Sheet") { BottomSheetScaffoldSample() },
+                    ComposableDemo("Standard Bottom Sheet with Drawer") {
+                        BottomSheetScaffoldWithDrawerSample()
+                    },
+                    ComposableDemo("Modal Bottom Sheet") { ModalBottomSheetSample() },
+                    ComposableDemo("Modal Bottom Sheet In Navigation") { BottomSheetNavDemo() },
+                )
+            ),
+            ComposableDemo("Buttons & FABs") { ButtonDemo() },
+            ComposableDemo("Chips") { ChipDemo() },
+            DemoCategory(
+                "Navigation drawer",
+                listOf(
+                    ComposableDemo("Modal drawer") { ModalDrawerSample() },
+                    ComposableDemo("Bottom drawer") { BottomDrawerSample() }
+                )
+            ),
+            ComposableDemo("Elevation") { ElevationDemo() },
+            ComposableDemo("Content alpha") { ContentAlphaSample() },
+            DemoCategory(
+                "ListItems",
+                listOf(
+                    ComposableDemo("ListItems") { ListItemDemo() },
+                    ComposableDemo("Mixing RTL and LTR") { MixedRtlLtrListItemDemo() }
+                )
+            ),
+            ComposableDemo("Material Theme") { MaterialThemeDemo() },
+            DemoCategory(
+                "Menus",
+                listOf(
+                    ComposableDemo("Dropdown Menu positioning") { MenuDemo() },
+                    ComposableDemo("ExposedDropdownMenu") { ExposedDropdownMenuDemo() }
+                )
+            ),
+            ComposableDemo("Navigation Rail") { NavigationRailDemo() },
+            DemoCategory(
+                "Playground",
+                listOf(
+                    ComposableDemo("Color Picker") { ColorPickerDemo() },
+                    ActivityDemo("Dynamic Theme", DynamicThemeActivity::class)
+                )
+            ),
+            ComposableDemo("Progress Indicators") { ProgressIndicatorDemo() },
+            DemoCategory(
+                "Scaffold",
+                listOf(
+                    ComposableDemo("Scaffold with top bar") { SimpleScaffoldWithTopBar() },
+                    ComposableDemo("Scaffold with docked FAB") { ScaffoldWithBottomBarAndCutout() },
+                    ComposableDemo("Scaffold with snackbar") { ScaffoldWithSimpleSnackbar() }
+                )
+            ),
+            ComposableDemo("Selection Controls") { SelectionControlsDemo() },
+            ComposableDemo("Slider") { SliderDemo() },
+            ComposableDemo("Snackbar") { ScaffoldWithCoroutinesSnackbar() },
+            ComposableDemo("Swipe to dismiss") { SwipeToDismissDemo() },
+            ComposableDemo("Tabs") { TabDemo() },
+            DemoCategory(
+                "TextFields",
+                listOf(
+                    ComposableDemo("FilledTextField/OutlinedTextField") { MaterialTextFieldDemo() },
+                    ComposableDemo("Multiple text fields") { TextFieldsDemo() },
+                    ComposableDemo("Textfield decoration box") { DecorationBoxDemos() },
+                    ComposableDemo("Alignment inside text fields") {
+                        VerticalAlignmentsInTextField()
+                    }
+                )
+            ),
+            DemoCategory(
+                "PullRefresh",
+                listOf(
+                    ComposableDemo("PullRefresh") { PullRefreshSample() },
+                    ComposableDemo("Custom PullRefresh") { CustomPullRefreshSample() },
+                    ComposableDemo("Custom Indicator") { PullRefreshIndicatorTransformSample() }
+                )
             )
         )
     )
-)
diff --git a/compose/material/material/integration-tests/material-demos/src/main/java/androidx/compose/material/demos/MaterialTextField.kt b/compose/material/material/integration-tests/material-demos/src/main/java/androidx/compose/material/demos/MaterialTextField.kt
index 77c8de6..4fbb9e4 100644
--- a/compose/material/material/integration-tests/material-demos/src/main/java/androidx/compose/material/demos/MaterialTextField.kt
+++ b/compose/material/material/integration-tests/material-demos/src/main/java/androidx/compose/material/demos/MaterialTextField.kt
@@ -131,24 +131,21 @@
             checked = singleLine.value,
             onCheckedChange = { singleLine.value = it }
         )
-        OptionRow(
-            title = "Label",
-            checked = label.value,
-            onCheckedChange = { label.value = it }
-        )
+        OptionRow(title = "Label", checked = label.value, onCheckedChange = { label.value = it })
 
         Spacer(Modifier.requiredHeight(10.dp))
-        val textFieldModifier = Modifier
-            .align(Alignment.CenterHorizontally)
-            .requiredWidth(300.dp)
-            .requiredHeightIn(max = 200.dp)
-            .then(if (singleLine.value) Modifier else Modifier.requiredHeightIn(min = 100.dp))
+        val textFieldModifier =
+            Modifier.align(Alignment.CenterHorizontally)
+                .requiredWidth(300.dp)
+                .requiredHeightIn(max = 200.dp)
+                .then(if (singleLine.value) Modifier else Modifier.requiredHeightIn(min = 100.dp))
         TextField(
             value = text.value,
             onValueChange = { text.value = it },
-            label = if (label.value) {
-                @Composable { Text("Label") }
-            } else null,
+            label =
+                if (label.value) {
+                    @Composable { Text("Label") }
+                } else null,
             singleLine = singleLine.value,
             modifier = textFieldModifier
         )
@@ -156,9 +153,10 @@
         OutlinedTextField(
             value = text.value,
             onValueChange = { text.value = it },
-            label = if (label.value) {
-                @Composable { Text("Label") }
-            } else null,
+            label =
+                if (label.value) {
+                    @Composable { Text("Label") }
+                } else null,
             singleLine = singleLine.value,
             modifier = textFieldModifier
         )
@@ -178,60 +176,65 @@
         var disabled by rememberSaveable { mutableStateOf(false) }
         var readOnly by rememberSaveable { mutableStateOf(false) }
 
-        val textField: @Composable () -> Unit = @Composable {
-            when (selectedTextField) {
-                TextFieldType.Filled ->
-                    TextField(
-                        value = text,
-                        onValueChange = { text = it },
-                        enabled = !disabled,
-                        readOnly = readOnly,
-                        singleLine = singleLineChecked,
-                        label = {
-                            val label =
-                                "Label" + if (selectedOption == Option.Error) "*" else ""
-                            Text(text = label)
-                        },
-                        leadingIcon = if (leadingChecked) {
-                            @Composable { Icon(Icons.Filled.Favorite, "Favorite") }
-                        } else {
-                            null
-                        },
-                        trailingIcon = if (trailingChecked) {
-                            @Composable { Icon(Icons.Filled.Info, "Info") }
-                        } else {
-                            null
-                        },
-                        isError = selectedOption == Option.Error,
-                        modifier = Modifier.requiredWidth(300.dp)
-                    )
-                TextFieldType.Outlined ->
-                    OutlinedTextField(
-                        value = text,
-                        onValueChange = { text = it },
-                        enabled = !disabled,
-                        readOnly = readOnly,
-                        singleLine = singleLineChecked,
-                        label = {
-                            val label =
-                                "Label" + if (selectedOption == Option.Error) "*" else ""
-                            Text(text = label)
-                        },
-                        leadingIcon = if (leadingChecked) {
-                            @Composable { Icon(Icons.Filled.Favorite, "Favorite") }
-                        } else {
-                            null
-                        },
-                        trailingIcon = if (trailingChecked) {
-                            @Composable { Icon(Icons.Filled.Info, "Info") }
-                        } else {
-                            null
-                        },
-                        isError = selectedOption == Option.Error,
-                        modifier = Modifier.requiredWidth(300.dp)
-                    )
+        val textField: @Composable () -> Unit =
+            @Composable {
+                when (selectedTextField) {
+                    TextFieldType.Filled ->
+                        TextField(
+                            value = text,
+                            onValueChange = { text = it },
+                            enabled = !disabled,
+                            readOnly = readOnly,
+                            singleLine = singleLineChecked,
+                            label = {
+                                val label =
+                                    "Label" + if (selectedOption == Option.Error) "*" else ""
+                                Text(text = label)
+                            },
+                            leadingIcon =
+                                if (leadingChecked) {
+                                    @Composable { Icon(Icons.Filled.Favorite, "Favorite") }
+                                } else {
+                                    null
+                                },
+                            trailingIcon =
+                                if (trailingChecked) {
+                                    @Composable { Icon(Icons.Filled.Info, "Info") }
+                                } else {
+                                    null
+                                },
+                            isError = selectedOption == Option.Error,
+                            modifier = Modifier.requiredWidth(300.dp)
+                        )
+                    TextFieldType.Outlined ->
+                        OutlinedTextField(
+                            value = text,
+                            onValueChange = { text = it },
+                            enabled = !disabled,
+                            readOnly = readOnly,
+                            singleLine = singleLineChecked,
+                            label = {
+                                val label =
+                                    "Label" + if (selectedOption == Option.Error) "*" else ""
+                                Text(text = label)
+                            },
+                            leadingIcon =
+                                if (leadingChecked) {
+                                    @Composable { Icon(Icons.Filled.Favorite, "Favorite") }
+                                } else {
+                                    null
+                                },
+                            trailingIcon =
+                                if (trailingChecked) {
+                                    @Composable { Icon(Icons.Filled.Info, "Info") }
+                                } else {
+                                    null
+                                },
+                            isError = selectedOption == Option.Error,
+                            modifier = Modifier.requiredWidth(300.dp)
+                        )
+                }
             }
-        }
 
         Box(Modifier.height(150.dp).align(Alignment.CenterHorizontally)) {
             if (selectedOption == Option.None) {
@@ -243,29 +246,25 @@
 
         Column {
             Title("Text field type")
-            TextFieldType.values().map { it.name }.forEach { textType ->
-                Row(
-                    Modifier
-                        .fillMaxWidth()
-                        .selectable(
-                            selected = (textType == selectedTextField.name),
-                            onClick = {
-                                selectedTextField = TextFieldType.valueOf(textType)
-                            }
+            TextFieldType.values()
+                .map { it.name }
+                .forEach { textType ->
+                    Row(
+                        Modifier.fillMaxWidth()
+                            .selectable(
+                                selected = (textType == selectedTextField.name),
+                                onClick = { selectedTextField = TextFieldType.valueOf(textType) }
+                            )
+                            .padding(horizontal = 16.dp)
+                    ) {
+                        RadioButton(selected = (textType == selectedTextField.name), onClick = null)
+                        Text(
+                            text = textType,
+                            style = MaterialTheme.typography.body1.merge(),
+                            modifier = Modifier.padding(start = 16.dp)
                         )
-                        .padding(horizontal = 16.dp)
-                ) {
-                    RadioButton(
-                        selected = (textType == selectedTextField.name),
-                        onClick = null
-                    )
-                    Text(
-                        text = textType,
-                        style = MaterialTheme.typography.body1.merge(),
-                        modifier = Modifier.padding(start = 16.dp)
-                    )
+                    }
                 }
-            }
 
             Title("Options")
             OptionRow(
@@ -293,39 +292,29 @@
             Spacer(Modifier.height(20.dp))
 
             Title("Assistive text")
-            Option.values().map { it.name }.forEach { text ->
-                Row(
-                    Modifier
-                        .fillMaxWidth()
-                        .selectable(
-                            selected = (text == selectedOption.name),
-                            onClick = { selectedOption = Option.valueOf(text) }
+            Option.values()
+                .map { it.name }
+                .forEach { text ->
+                    Row(
+                        Modifier.fillMaxWidth()
+                            .selectable(
+                                selected = (text == selectedOption.name),
+                                onClick = { selectedOption = Option.valueOf(text) }
+                            )
+                            .padding(horizontal = 16.dp)
+                    ) {
+                        RadioButton(selected = (text == selectedOption.name), onClick = null)
+                        Text(
+                            text = text,
+                            style = MaterialTheme.typography.body1.merge(),
+                            modifier = Modifier.padding(start = 16.dp)
                         )
-                        .padding(horizontal = 16.dp)
-                ) {
-                    RadioButton(
-                        selected = (text == selectedOption.name),
-                        onClick = null
-                    )
-                    Text(
-                        text = text,
-                        style = MaterialTheme.typography.body1.merge(),
-                        modifier = Modifier.padding(start = 16.dp)
-                    )
+                    }
                 }
-            }
 
             Title("Other settings")
-            OptionRow(
-                title = "Read-only",
-                checked = readOnly,
-                onCheckedChange = { readOnly = it }
-            )
-            OptionRow(
-                title = "Disabled",
-                checked = disabled,
-                onCheckedChange = { disabled = it }
-            )
+            OptionRow(title = "Read-only", checked = readOnly, onCheckedChange = { readOnly = it })
+            OptionRow(title = "Disabled", checked = disabled, onCheckedChange = { disabled = it })
         }
     }
 }
@@ -342,22 +331,18 @@
     )
 }
 
-/**
- * Text field with helper or error message below.
- */
+/** Text field with helper or error message below. */
 @Composable
-private fun TextFieldWithMessage(
-    helperMessageOption: Option,
-    content: @Composable () -> Unit
-) {
+private fun TextFieldWithMessage(helperMessageOption: Option, content: @Composable () -> Unit) {
     val typography = MaterialTheme.typography.caption
-    val color = when (helperMessageOption) {
-        Option.Helper -> {
-            MaterialTheme.colors.onSurface.copy(alpha = ContentAlpha.medium)
+    val color =
+        when (helperMessageOption) {
+            Option.Helper -> {
+                MaterialTheme.colors.onSurface.copy(alpha = ContentAlpha.medium)
+            }
+            Option.Error -> MaterialTheme.colors.error
+            else -> Color.Unspecified
         }
-        Option.Error -> MaterialTheme.colors.error
-        else -> Color.Unspecified
-    }
 
     Column {
         Box(modifier = Modifier.weight(1f, fill = false)) { content() }
@@ -388,12 +373,9 @@
     enabled: Boolean = true
 ) {
     Row(
-        Modifier
-            .padding(start = 10.dp, top = 10.dp)
+        Modifier.padding(start = 10.dp, top = 10.dp)
             .fillMaxWidth()
-            .toggleable(
-                value = checked, onValueChange = onCheckedChange, enabled = enabled
-            )
+            .toggleable(value = checked, onValueChange = onCheckedChange, enabled = enabled)
     ) {
         Checkbox(checked = checked, onCheckedChange = null, enabled = enabled)
         Spacer(Modifier.width(20.dp))
@@ -401,9 +383,14 @@
     }
 }
 
-/**
- * Helper message option
- */
-private enum class Option { None, Helper, Error }
+/** Helper message option */
+private enum class Option {
+    None,
+    Helper,
+    Error
+}
 
-private enum class TextFieldType { Filled, Outlined }
+private enum class TextFieldType {
+    Filled,
+    Outlined
+}
diff --git a/compose/material/material/integration-tests/material-demos/src/main/java/androidx/compose/material/demos/MenuDemo.kt b/compose/material/material/integration-tests/material-demos/src/main/java/androidx/compose/material/demos/MenuDemo.kt
index 040f8ab..a417f1e 100644
--- a/compose/material/material/integration-tests/material-demos/src/main/java/androidx/compose/material/demos/MenuDemo.kt
+++ b/compose/material/material/integration-tests/material-demos/src/main/java/androidx/compose/material/demos/MenuDemo.kt
@@ -46,18 +46,20 @@
         for (i in 0..10) {
             for (j in 0..10) {
                 MenuInstance(
-                    Modifier.fillMaxSize().wrapContentSize(
-                        object : Alignment {
-                            override fun align(
-                                size: IntSize,
-                                space: IntSize,
-                                layoutDirection: LayoutDirection
-                            ) = IntOffset(
-                                (space.width * i / 10f).roundToInt(),
-                                (space.height * j / 10f).roundToInt()
-                            )
-                        }
-                    )
+                    Modifier.fillMaxSize()
+                        .wrapContentSize(
+                            object : Alignment {
+                                override fun align(
+                                    size: IntSize,
+                                    space: IntSize,
+                                    layoutDirection: LayoutDirection
+                                ) =
+                                    IntOffset(
+                                        (space.width * i / 10f).roundToInt(),
+                                        (space.height * j / 10f).roundToInt()
+                                    )
+                            }
+                        )
                 )
             }
         }
@@ -66,30 +68,18 @@
 
 @Composable
 fun MenuInstance(modifier: Modifier = Modifier) {
-    val options = listOf(
-        "Refresh",
-        "Settings",
-        "Send Feedback",
-        "Help",
-        "Signout"
-    )
+    val options = listOf("Refresh", "Settings", "Send Feedback", "Help", "Signout")
 
     var expanded by remember { mutableStateOf(false) }
 
     Box(modifier) {
-        IconButton(onClick = { expanded = true }) {
-            Icon(Icons.Default.MoreVert, null)
-        }
+        IconButton(onClick = { expanded = true }) { Icon(Icons.Default.MoreVert, null) }
         DropdownMenu(
             expanded = expanded,
             onDismissRequest = { expanded = false },
             offset = DpOffset(24.dp, 0.dp),
         ) {
-            options.forEach {
-                DropdownMenuItem(onClick = {}) {
-                    Text(it)
-                }
-            }
+            options.forEach { DropdownMenuItem(onClick = {}) { Text(it) } }
         }
     }
 }
diff --git a/compose/material/material/integration-tests/material-demos/src/main/java/androidx/compose/material/demos/NavigationRailDemo.kt b/compose/material/material/integration-tests/material-demos/src/main/java/androidx/compose/material/demos/NavigationRailDemo.kt
index 444854b..a7fbd81 100644
--- a/compose/material/material/integration-tests/material-demos/src/main/java/androidx/compose/material/demos/NavigationRailDemo.kt
+++ b/compose/material/material/integration-tests/material-demos/src/main/java/androidx/compose/material/demos/NavigationRailDemo.kt
@@ -52,10 +52,7 @@
 fun NavigationRailDemo() {
     val alwaysShowLabelsState = remember { mutableStateOf(false) }
     val compactNavRail = remember { mutableStateOf(false) }
-    Row(
-        modifier = Modifier.fillMaxWidth(),
-        horizontalArrangement = Arrangement.Start
-    ) {
+    Row(modifier = Modifier.fillMaxWidth(), horizontalArrangement = Arrangement.Start) {
         if (compactNavRail.value) {
             CompactNavigationRailSample()
         } else {
@@ -91,40 +88,32 @@
             .padding(start = 16.dp)
     ) {
         Row(
-            modifier = Modifier
-                .fillMaxWidth()
-                .height(56.dp)
-                .selectable(
-                    enabled = enabled,
-                    selected = !alwaysShowLabelsState.value,
-                    onClick = { alwaysShowLabelsState.value = false }
-                ),
+            modifier =
+                Modifier.fillMaxWidth()
+                    .height(56.dp)
+                    .selectable(
+                        enabled = enabled,
+                        selected = !alwaysShowLabelsState.value,
+                        onClick = { alwaysShowLabelsState.value = false }
+                    ),
             verticalAlignment = Alignment.CenterVertically
         ) {
-            RadioButton(
-                enabled = enabled,
-                selected = !alwaysShowLabelsState.value,
-                onClick = null
-            )
+            RadioButton(enabled = enabled, selected = !alwaysShowLabelsState.value, onClick = null)
             Spacer(Modifier.requiredWidth(16.dp))
             Text("Only show labels when selected")
         }
         Row(
-            modifier = Modifier
-                .fillMaxWidth()
-                .height(56.dp)
-                .selectable(
-                    enabled = enabled,
-                    selected = alwaysShowLabelsState.value,
-                    onClick = { alwaysShowLabelsState.value = true }
-                ),
+            modifier =
+                Modifier.fillMaxWidth()
+                    .height(56.dp)
+                    .selectable(
+                        enabled = enabled,
+                        selected = alwaysShowLabelsState.value,
+                        onClick = { alwaysShowLabelsState.value = true }
+                    ),
             verticalAlignment = Alignment.CenterVertically
         ) {
-            RadioButton(
-                enabled = enabled,
-                selected = alwaysShowLabelsState.value,
-                onClick = null
-            )
+            RadioButton(enabled = enabled, selected = alwaysShowLabelsState.value, onClick = null)
             Spacer(Modifier.requiredWidth(16.dp))
             Text("Always show labels")
         }
@@ -134,20 +123,17 @@
 @Composable
 private fun CompactNavRailConfig(compactNavRailState: MutableState<Boolean>) {
     Row(
-        modifier = Modifier
-            .fillMaxWidth()
-            .padding(start = 16.dp)
-            .height(56.dp)
-            .toggleable(
-                value = compactNavRailState.value,
-                onValueChange = { compactNavRailState.value = !compactNavRailState.value }
-            ),
+        modifier =
+            Modifier.fillMaxWidth()
+                .padding(start = 16.dp)
+                .height(56.dp)
+                .toggleable(
+                    value = compactNavRailState.value,
+                    onValueChange = { compactNavRailState.value = !compactNavRailState.value }
+                ),
         verticalAlignment = Alignment.CenterVertically
     ) {
-        Checkbox(
-            checked = compactNavRailState.value,
-            onCheckedChange = null
-        )
+        Checkbox(checked = compactNavRailState.value, onCheckedChange = null)
         Spacer(Modifier.requiredWidth(16.dp))
         Text("Compact Navigation Rail")
     }
diff --git a/compose/material/material/integration-tests/material-demos/src/main/java/androidx/compose/material/demos/ProgressIndicatorDemo.kt b/compose/material/material/integration-tests/material-demos/src/main/java/androidx/compose/material/demos/ProgressIndicatorDemo.kt
index c3edd69..417f36c4 100644
--- a/compose/material/material/integration-tests/material-demos/src/main/java/androidx/compose/material/demos/ProgressIndicatorDemo.kt
+++ b/compose/material/material/integration-tests/material-demos/src/main/java/androidx/compose/material/demos/ProgressIndicatorDemo.kt
@@ -49,36 +49,25 @@
 
     DisposableEffect(Unit) {
         state.start()
-        onDispose {
-            state.stop()
-        }
+        onDispose { state.stop() }
     }
 
     Column {
-        val modifier = Modifier.weight(1f, true)
-            .align(Alignment.CenterHorizontally)
-            .fillMaxWidth()
-            .border(1.dp, MaterialTheme.colors.primary)
+        val modifier =
+            Modifier.weight(1f, true)
+                .align(Alignment.CenterHorizontally)
+                .fillMaxWidth()
+                .border(1.dp, MaterialTheme.colors.primary)
         // Determinate indicators
-        Box(modifier, contentAlignment = Alignment.Center) {
-            LinearProgressIndicatorSample()
-        }
+        Box(modifier, contentAlignment = Alignment.Center) { LinearProgressIndicatorSample() }
         Box(modifier, contentAlignment = Alignment.Center) {
             Column(horizontalAlignment = Alignment.CenterHorizontally) {
                 LinearProgressIndicator(progress = state.progress)
                 Spacer(Modifier.requiredHeight(30.dp))
-                OutlinedButton(
-                    onClick = {
-                        state.progress = 0f
-                    }
-                ) {
-                    Text("Reset")
-                }
+                OutlinedButton(onClick = { state.progress = 0f }) { Text("Reset") }
             }
         }
-        Box(modifier, contentAlignment = Alignment.Center) {
-            CircularProgressIndicatorSample()
-        }
+        Box(modifier, contentAlignment = Alignment.Center) { CircularProgressIndicatorSample() }
         Row(
             modifier,
             horizontalArrangement = Arrangement.SpaceEvenly,
@@ -103,12 +92,13 @@
     }
 
     val handler = Handler(Looper.getMainLooper())
-    val updateProgress: Runnable = object : Runnable {
-        override fun run() {
-            if (progress < 1f) {
-                progress += 0.05f
+    val updateProgress: Runnable =
+        object : Runnable {
+            override fun run() {
+                if (progress < 1f) {
+                    progress += 0.05f
+                }
+                handler.postDelayed(this, 500)
             }
-            handler.postDelayed(this, 500)
         }
-    }
 }
diff --git a/compose/material/material/integration-tests/material-demos/src/main/java/androidx/compose/material/demos/TabDemo.kt b/compose/material/material/integration-tests/material-demos/src/main/java/androidx/compose/material/demos/TabDemo.kt
index 2837fc3..cbe66cb 100644
--- a/compose/material/material/integration-tests/material-demos/src/main/java/androidx/compose/material/demos/TabDemo.kt
+++ b/compose/material/material/integration-tests/material-demos/src/main/java/androidx/compose/material/demos/TabDemo.kt
@@ -71,9 +71,7 @@
         Spacer(Modifier.requiredHeight(24.dp))
         Button(
             modifier = Modifier.align(Alignment.CenterHorizontally),
-            onClick = {
-                showingSimple.value = !showingSimple.value
-            },
+            onClick = { showingSimple.value = !showingSimple.value },
             colors = ButtonDefaults.buttonColors(backgroundColor = Color.Cyan)
         ) {
             Text(buttonText)
diff --git a/compose/material/material/integration-tests/material-demos/src/main/java/androidx/compose/material/demos/TextFieldDecorationBoxDemos.kt b/compose/material/material/integration-tests/material-demos/src/main/java/androidx/compose/material/demos/TextFieldDecorationBoxDemos.kt
index 1144cc1..b8bf2d1 100644
--- a/compose/material/material/integration-tests/material-demos/src/main/java/androidx/compose/material/demos/TextFieldDecorationBoxDemos.kt
+++ b/compose/material/material/integration-tests/material-demos/src/main/java/androidx/compose/material/demos/TextFieldDecorationBoxDemos.kt
@@ -110,10 +110,12 @@
             singleLine = singleLine,
             visualTransformation = VisualTransformation.None,
             interactionSource = interactionSource,
-            contentPadding = TextFieldDefaults.outlinedTextFieldPadding(
-                // make it dense, Modifier.height controls the height in this case
-                top = 0.dp, bottom = 0.dp
-            )
+            contentPadding =
+                TextFieldDefaults.outlinedTextFieldPadding(
+                    // make it dense, Modifier.height controls the height in this case
+                    top = 0.dp,
+                    bottom = 0.dp
+                )
         )
     }
 }
@@ -128,9 +130,14 @@
     BasicTextField(
         value = text,
         onValueChange = { text = it },
-        modifier = Modifier
-            .indicatorLine(enabled, false, interactionSource, TextFieldDefaults.textFieldColors())
-            .width(TextFieldDefaults.MinWidth),
+        modifier =
+            Modifier.indicatorLine(
+                    enabled,
+                    false,
+                    interactionSource,
+                    TextFieldDefaults.textFieldColors()
+                )
+                .width(TextFieldDefaults.MinWidth),
         singleLine = singleLine,
         interactionSource = interactionSource
     ) { innerTextField ->
@@ -142,11 +149,12 @@
             visualTransformation = VisualTransformation.None,
             interactionSource = interactionSource,
             label = { Text("Label") },
-            contentPadding = TextFieldDefaults.textFieldWithLabelPadding(
-                start = 4.dp,
-                end = 4.dp,
-                bottom = 4.dp // make it dense
-            )
+            contentPadding =
+                TextFieldDefaults.textFieldWithLabelPadding(
+                    start = 4.dp,
+                    end = 4.dp,
+                    bottom = 4.dp // make it dense
+                )
         )
     }
 }
@@ -159,13 +167,14 @@
     val interactionSource = remember { MutableInteractionSource() }
 
     val colors = TextFieldDefaults.textFieldColors()
-    val indicator = when (type) {
-        IndicatorType.Progress -> Modifier.progressIndicatorLine(text, interactionSource, enabled)
-        IndicatorType.Animated -> Modifier.animatedIndicator(
-            interactionSource, enabled, false, colors
-        )
-        IndicatorType.Gradient -> Modifier.animatedGradient(interactionSource, enabled)
-    }
+    val indicator =
+        when (type) {
+            IndicatorType.Progress ->
+                Modifier.progressIndicatorLine(text, interactionSource, enabled)
+            IndicatorType.Animated ->
+                Modifier.animatedIndicator(interactionSource, enabled, false, colors)
+            IndicatorType.Gradient -> Modifier.animatedGradient(interactionSource, enabled)
+        }
     BasicTextField(
         value = text,
         onValueChange = { text = it },
@@ -189,6 +198,7 @@
 }
 
 private const val ExpectedInputLength = 8
+
 private fun Modifier.progressIndicatorLine(
     text: String,
     interactionSource: InteractionSource,
@@ -199,19 +209,16 @@
 
     // height of line
     val targetHeight = if (focused) 4.dp else 2.dp
-    val animatedHeight = if (enabled)
-        animateDpAsState(targetHeight, tween(durationMillis = animationDuration))
-    else
-        rememberUpdatedState(1.dp)
+    val animatedHeight =
+        if (enabled) animateDpAsState(targetHeight, tween(durationMillis = animationDuration))
+        else rememberUpdatedState(1.dp)
 
     // width of line
     val target = (text.length.toFloat() / ExpectedInputLength).coerceAtMost(1.0f)
     val progress = animateFloatAsState(target, tween(durationMillis = animationDuration))
 
-    val unfocusedEmptyColor = MaterialTheme
-        .colors
-        .onSurface
-        .copy(alpha = TextFieldDefaults.UnfocusedIndicatorLineOpacity)
+    val unfocusedEmptyColor =
+        MaterialTheme.colors.onSurface.copy(alpha = TextFieldDefaults.UnfocusedIndicatorLineOpacity)
     val progressColor = MaterialTheme.colors.primary.copy(alpha = ContentAlpha.high)
 
     drawWithContent {
@@ -220,19 +227,9 @@
         val y = size.height - strokeWidth / 2
         val x = size.width * progress.value
 
-        drawLine(
-            SolidColor(unfocusedEmptyColor),
-            Offset(0f, y),
-            Offset(size.width, y),
-            strokeWidth
-        )
+        drawLine(SolidColor(unfocusedEmptyColor), Offset(0f, y), Offset(size.width, y), strokeWidth)
 
-        drawLine(
-            SolidColor(progressColor),
-            Offset(0f, y),
-            Offset(x, y),
-            strokeWidth
-        )
+        drawLine(SolidColor(progressColor), Offset(0f, y), Offset(x, y), strokeWidth)
     }
 }
 
@@ -246,18 +243,20 @@
     val focused by interactionSource.collectIsFocusedAsState()
     // height of line
     val targetHeight = if (focused) 2.dp else 1.dp
-    val animatedHeight = if (enabled) {
-        animateDpAsState(targetHeight, tween(animationDuration))
-    } else {
-        rememberUpdatedState(1.dp)
-    }
+    val animatedHeight =
+        if (enabled) {
+            animateDpAsState(targetHeight, tween(animationDuration))
+        } else {
+            rememberUpdatedState(1.dp)
+        }
     // width of line
     val targetFloat = if (focused) 1f else 0f
-    val progress = if (enabled) {
-        animateFloatAsState(targetFloat, tween(animationDuration))
-    } else {
-        rememberUpdatedState(1f)
-    }
+    val progress =
+        if (enabled) {
+            animateFloatAsState(targetFloat, tween(animationDuration))
+        } else {
+            rememberUpdatedState(1f)
+        }
 
     val color = colors.indicatorColor(enabled, isError, interactionSource)
     drawWithContent {
@@ -267,12 +266,7 @@
         val deltaX = size.width * (progress.value) / 2
         val offset1 = if (focused) Offset(size.width / 2 - deltaX, y) else Offset(0f, y)
         val offset2 = if (focused) Offset(size.width / 2 + deltaX, y) else Offset(size.width, y)
-        drawLine(
-            SolidColor(color.value),
-            offset1,
-            offset2,
-            strokeWidth
-        )
+        drawLine(SolidColor(color.value), offset1, offset2, strokeWidth)
     }
 }
 
@@ -288,44 +282,44 @@
 
     // height of line
     val targetHeight = if (focused) 2.dp else 1.dp
-    val animatedHeight = if (enabled) {
-        animateDpAsState(targetHeight, tween(animationDuration))
-    } else {
-        rememberUpdatedState(1.dp)
-    }
+    val animatedHeight =
+        if (enabled) {
+            animateDpAsState(targetHeight, tween(animationDuration))
+        } else {
+            rememberUpdatedState(1.dp)
+        }
 
     val infiniteTransition = rememberInfiniteTransition()
-    val brush = when {
-        !enabled -> SolidColor(disabledColor)
-        !focused -> SolidColor(unfocusedColor)
-        else -> {
-            val progress = infiniteTransition.animateFloat(
-                0.2f,
-                0.8f,
-                infiniteRepeatable(tween(3_000), RepeatMode.Reverse)
-            )
-            Brush.horizontalGradient(
-                0.0f to Color.Blue,
-                progress.value to Color.Cyan,
-                1f to Color.Blue
-            )
+    val brush =
+        when {
+            !enabled -> SolidColor(disabledColor)
+            !focused -> SolidColor(unfocusedColor)
+            else -> {
+                val progress =
+                    infiniteTransition.animateFloat(
+                        0.2f,
+                        0.8f,
+                        infiniteRepeatable(tween(3_000), RepeatMode.Reverse)
+                    )
+                Brush.horizontalGradient(
+                    0.0f to Color.Blue,
+                    progress.value to Color.Cyan,
+                    1f to Color.Blue
+                )
+            }
         }
-    }
 
     drawWithContent {
         drawContent()
 
         val strokeWidth = animatedHeight.value.value * density
         val y = size.height - strokeWidth / 2
-        drawLine(
-            brush,
-            Offset(0f, y),
-            Offset(size.width, y),
-            strokeWidth
-        )
+        drawLine(brush, Offset(0f, y), Offset(size.width, y), strokeWidth)
     }
 }
 
 private enum class IndicatorType {
-    Progress, Animated, Gradient
+    Progress,
+    Animated,
+    Gradient
 }
diff --git a/compose/material/material/samples/src/main/java/androidx/compose/material/samples/AlertDialogSample.kt b/compose/material/material/samples/src/main/java/androidx/compose/material/samples/AlertDialogSample.kt
index 3660f3c..02818ce 100644
--- a/compose/material/material/samples/src/main/java/androidx/compose/material/samples/AlertDialogSample.kt
+++ b/compose/material/material/samples/src/main/java/androidx/compose/material/samples/AlertDialogSample.kt
@@ -44,9 +44,7 @@
                 // onCloseRequest.
                 openDialog.value = false
             },
-            title = {
-                Text(text = "Title")
-            },
+            title = { Text(text = "Title") },
             text = {
                 Text(
                     "This area typically contains the supportive text " +
@@ -54,22 +52,10 @@
                 )
             },
             confirmButton = {
-                TextButton(
-                    onClick = {
-                        openDialog.value = false
-                    }
-                ) {
-                    Text("Confirm")
-                }
+                TextButton(onClick = { openDialog.value = false }) { Text("Confirm") }
             },
             dismissButton = {
-                TextButton(
-                    onClick = {
-                        openDialog.value = false
-                    }
-                ) {
-                    Text("Dismiss")
-                }
+                TextButton(onClick = { openDialog.value = false }) { Text("Dismiss") }
             }
         )
     }
@@ -82,12 +68,8 @@
 
     if (openDialog.value) {
         AlertDialog(
-            onDismissRequest = {
-                openDialog.value = false
-            },
-            title = {
-                Text(text = "Title")
-            },
+            onDismissRequest = { openDialog.value = false },
+            title = { Text(text = "Title") },
             text = {
                 Text(
                     "This area typically contains the supportive text " +
diff --git a/compose/material/material/samples/src/main/java/androidx/compose/material/samples/BackdropScaffoldSamples.kt b/compose/material/material/samples/src/main/java/androidx/compose/material/samples/BackdropScaffoldSamples.kt
index 6ce3aef..e353666 100644
--- a/compose/material/material/samples/src/main/java/androidx/compose/material/samples/BackdropScaffoldSamples.kt
+++ b/compose/material/material/samples/src/main/java/androidx/compose/material/samples/BackdropScaffoldSamples.kt
@@ -51,9 +51,7 @@
     val scope = rememberCoroutineScope()
     val selection = remember { mutableStateOf(1) }
     val scaffoldState = rememberBackdropScaffoldState(BackdropValue.Concealed)
-    LaunchedEffect(scaffoldState) {
-        scaffoldState.reveal()
-    }
+    LaunchedEffect(scaffoldState) { scaffoldState.reveal() }
     BackdropScaffold(
         scaffoldState = scaffoldState,
         appBar = {
@@ -76,8 +74,9 @@
                         onClick = {
                             // show snackbar as a suspend function
                             scope.launch {
-                                scaffoldState.snackbarHostState
-                                    .showSnackbar("Snackbar #${++clickCount}")
+                                scaffoldState.snackbarHostState.showSnackbar(
+                                    "Snackbar #${++clickCount}"
+                                )
                             }
                         }
                     ) {
diff --git a/compose/material/material/samples/src/main/java/androidx/compose/material/samples/BadgeSamples.kt b/compose/material/material/samples/src/main/java/androidx/compose/material/samples/BadgeSamples.kt
index add87c8..b3d547f 100644
--- a/compose/material/material/samples/src/main/java/androidx/compose/material/samples/BadgeSamples.kt
+++ b/compose/material/material/samples/src/main/java/androidx/compose/material/samples/BadgeSamples.kt
@@ -36,21 +36,21 @@
     BottomNavigation {
         BottomNavigationItem(
             icon = {
-                BadgedBox(badge = {
-                    Badge {
-                        val badgeNumber = "8"
-                        Text(
-                            badgeNumber,
-                            modifier = Modifier.semantics {
-                                contentDescription = "$badgeNumber new notifications"
-                            }
-                        )
+                BadgedBox(
+                    badge = {
+                        Badge {
+                            val badgeNumber = "8"
+                            Text(
+                                badgeNumber,
+                                modifier =
+                                    Modifier.semantics {
+                                        contentDescription = "$badgeNumber new notifications"
+                                    }
+                            )
+                        }
                     }
-                }) {
-                    Icon(
-                        Icons.Filled.Favorite,
-                        contentDescription = "Favorite"
-                    )
+                ) {
+                    Icon(Icons.Filled.Favorite, contentDescription = "Favorite")
                 }
             },
             selected = false,
diff --git a/compose/material/material/samples/src/main/java/androidx/compose/material/samples/BottomSheetScaffoldSamples.kt b/compose/material/material/samples/src/main/java/androidx/compose/material/samples/BottomSheetScaffoldSamples.kt
index cb3994c..f9148cb8 100644
--- a/compose/material/material/samples/src/main/java/androidx/compose/material/samples/BottomSheetScaffoldSamples.kt
+++ b/compose/material/material/samples/src/main/java/androidx/compose/material/samples/BottomSheetScaffoldSamples.kt
@@ -53,13 +53,14 @@
 import androidx.compose.ui.unit.dp
 import kotlinx.coroutines.launch
 
-private val colors = listOf(
-    Color(0xFFffd7d7.toInt()),
-    Color(0xFFffe9d6.toInt()),
-    Color(0xFFfffbd0.toInt()),
-    Color(0xFFe3ffd9.toInt()),
-    Color(0xFFd0fff8.toInt())
-)
+private val colors =
+    listOf(
+        Color(0xFFffd7d7.toInt()),
+        Color(0xFFffe9d6.toInt()),
+        Color(0xFFfffbd0.toInt()),
+        Color(0xFFe3ffd9.toInt()),
+        Color(0xFFd0fff8.toInt())
+    )
 
 @Sampled
 @Composable
@@ -69,37 +70,22 @@
     val scaffoldState = rememberBottomSheetScaffoldState()
     BottomSheetScaffold(
         sheetContent = {
-            Box(
-                Modifier
-                    .fillMaxWidth()
-                    .height(128.dp),
-                contentAlignment = Alignment.Center
-            ) {
+            Box(Modifier.fillMaxWidth().height(128.dp), contentAlignment = Alignment.Center) {
                 Text("Swipe up to expand sheet")
             }
             Column(
-                Modifier
-                    .fillMaxWidth()
-                    .padding(64.dp),
+                Modifier.fillMaxWidth().padding(64.dp),
                 horizontalAlignment = Alignment.CenterHorizontally
             ) {
                 Text("Sheet content")
                 Spacer(Modifier.height(20.dp))
-                Button(
-                    onClick = {
-                        scope.launch { scaffoldState.bottomSheetState.collapse() }
-                    }
-                ) {
+                Button(onClick = { scope.launch { scaffoldState.bottomSheetState.collapse() } }) {
                     Text("Click to collapse sheet")
                 }
             }
         },
         scaffoldState = scaffoldState,
-        topBar = {
-            TopAppBar {
-                Text("Bottom sheet scaffold")
-            }
-        },
+        topBar = { TopAppBar { Text("Bottom sheet scaffold") } },
         floatingActionButton = {
             var clickCount by remember { mutableStateOf(0) }
             FloatingActionButton(
@@ -118,12 +104,7 @@
     ) { innerPadding ->
         LazyColumn(contentPadding = innerPadding) {
             items(100) {
-                Box(
-                    Modifier
-                        .fillMaxWidth()
-                        .height(50.dp)
-                        .background(colors[it % colors.size])
-                )
+                Box(Modifier.fillMaxWidth().height(50.dp).background(colors[it % colors.size]))
             }
         }
     }
@@ -139,9 +120,7 @@
         drawerState = drawerState,
         drawerContent = {
             Column(
-                Modifier
-                    .fillMaxWidth()
-                    .padding(16.dp),
+                Modifier.fillMaxWidth().padding(16.dp),
                 horizontalAlignment = Alignment.CenterHorizontally
             ) {
                 Text("Drawer content")
@@ -154,26 +133,17 @@
     ) {
         BottomSheetScaffold(
             sheetContent = {
-                Box(
-                    Modifier
-                        .fillMaxWidth()
-                        .height(128.dp),
-                    contentAlignment = Alignment.Center
-                ) {
+                Box(Modifier.fillMaxWidth().height(128.dp), contentAlignment = Alignment.Center) {
                     Text("Swipe up to expand sheet")
                 }
                 Column(
-                    Modifier
-                        .fillMaxWidth()
-                        .padding(64.dp),
+                    Modifier.fillMaxWidth().padding(64.dp),
                     horizontalAlignment = Alignment.CenterHorizontally
                 ) {
                     Text("Sheet content")
                     Spacer(Modifier.height(20.dp))
                     Button(
-                        onClick = {
-                            scope.launch { scaffoldState.bottomSheetState.collapse() }
-                        }
+                        onClick = { scope.launch { scaffoldState.bottomSheetState.collapse() } }
                     ) {
                         Text("Click to collapse sheet")
                     }
@@ -196,8 +166,9 @@
                     onClick = {
                         // show snackbar as a suspend function
                         scope.launch {
-                            scaffoldState.snackbarHostState
-                                .showSnackbar("Snackbar #${++clickCount}")
+                            scaffoldState.snackbarHostState.showSnackbar(
+                                "Snackbar #${++clickCount}"
+                            )
                         }
                     }
                 ) {
@@ -209,12 +180,7 @@
         ) { innerPadding ->
             LazyColumn(contentPadding = innerPadding) {
                 items(100) {
-                    Box(
-                        Modifier
-                            .fillMaxWidth()
-                            .height(50.dp)
-                            .background(colors[it % colors.size])
-                    )
+                    Box(Modifier.fillMaxWidth().height(50.dp).background(colors[it % colors.size]))
                 }
             }
         }
diff --git a/compose/material/material/samples/src/main/java/androidx/compose/material/samples/ButtonSamples.kt b/compose/material/material/samples/src/main/java/androidx/compose/material/samples/ButtonSamples.kt
index 3539c00..35c95ed 100644
--- a/compose/material/material/samples/src/main/java/androidx/compose/material/samples/ButtonSamples.kt
+++ b/compose/material/material/samples/src/main/java/androidx/compose/material/samples/ButtonSamples.kt
@@ -33,25 +33,19 @@
 @Sampled
 @Composable
 fun ButtonSample() {
-    Button(onClick = { /* Do something! */ }) {
-        Text("Button")
-    }
+    Button(onClick = { /* Do something! */ }) { Text("Button") }
 }
 
 @Sampled
 @Composable
 fun OutlinedButtonSample() {
-    OutlinedButton(onClick = { /* Do something! */ }) {
-        Text("Outlined Button")
-    }
+    OutlinedButton(onClick = { /* Do something! */ }) { Text("Outlined Button") }
 }
 
 @Sampled
 @Composable
 fun TextButtonSample() {
-    TextButton(onClick = { /* Do something! */ }) {
-        Text("Text Button")
-    }
+    TextButton(onClick = { /* Do something! */ }) { Text("Text Button") }
 }
 
 @Sampled
diff --git a/compose/material/material/samples/src/main/java/androidx/compose/material/samples/CardSamples.kt b/compose/material/material/samples/src/main/java/androidx/compose/material/samples/CardSamples.kt
index 98b08ca..b149d40 100644
--- a/compose/material/material/samples/src/main/java/androidx/compose/material/samples/CardSamples.kt
+++ b/compose/material/material/samples/src/main/java/androidx/compose/material/samples/CardSamples.kt
@@ -29,9 +29,7 @@
 @Sampled
 @Composable
 fun CardSample() {
-    Card {
-        Text("Card Content")
-    }
+    Card { Text("Card Content") }
 }
 
 @OptIn(ExperimentalMaterialApi::class)
@@ -39,7 +37,5 @@
 @Composable
 fun ClickableCardSample() {
     var count by remember { mutableStateOf(0) }
-    Card(onClick = { count++ }) {
-        Text("Clickable card content with count: $count")
-    }
+    Card(onClick = { count++ }) { Text("Clickable card content with count: $count") }
 }
diff --git a/compose/material/material/samples/src/main/java/androidx/compose/material/samples/ChipSamples.kt b/compose/material/material/samples/src/main/java/androidx/compose/material/samples/ChipSamples.kt
index 9b0e0e8..4050989 100644
--- a/compose/material/material/samples/src/main/java/androidx/compose/material/samples/ChipSamples.kt
+++ b/compose/material/material/samples/src/main/java/androidx/compose/material/samples/ChipSamples.kt
@@ -49,9 +49,7 @@
 @Sampled
 @Composable
 fun ChipSample() {
-    Chip(onClick = { /* Do something! */ }) {
-        Text("Action Chip")
-    }
+    Chip(onClick = { /* Do something! */ }) { Text("Action Chip") }
 }
 
 @OptIn(ExperimentalMaterialApi::class)
@@ -62,12 +60,7 @@
         onClick = { /* Do something! */ },
         border = ChipDefaults.outlinedBorder,
         colors = ChipDefaults.outlinedChipColors(),
-        leadingIcon = {
-            Icon(
-                Icons.Filled.Settings,
-                contentDescription = "Localized description"
-            )
-        }
+        leadingIcon = { Icon(Icons.Filled.Settings, contentDescription = "Localized description") }
     ) {
         Text("Change settings")
     }
@@ -87,7 +80,8 @@
                 contentDescription = "Localized Description",
                 modifier = Modifier.requiredSize(ChipDefaults.SelectedIconSize)
             )
-        }) {
+        }
+    ) {
         Text("Filter chip")
     }
 }
@@ -108,7 +102,8 @@
                 contentDescription = "Localized Description",
                 modifier = Modifier.requiredSize(ChipDefaults.SelectedIconSize)
             )
-        }) {
+        }
+    ) {
         Text("Filter chip")
     }
 }
@@ -149,7 +144,8 @@
             repeat(9) { index ->
                 Chip(
                     modifier = Modifier.padding(horizontal = 4.dp),
-                    onClick = { /* do something*/ }) {
+                    onClick = { /* do something*/ }
+                ) {
                     Text("Chip $index")
                 }
             }
@@ -163,17 +159,16 @@
 fun ChipGroupReflowSample() {
     Column {
         FlowRow(
-            Modifier
-                .fillMaxWidth(1f)
-                .wrapContentHeight(align = Alignment.Top),
+            Modifier.fillMaxWidth(1f).wrapContentHeight(align = Alignment.Top),
             horizontalArrangement = Arrangement.Start,
         ) {
             repeat(10) { index ->
                 Chip(
-                    modifier = Modifier
-                        .padding(horizontal = 4.dp)
-                        .align(alignment = Alignment.CenterVertically),
-                    onClick = { /* do something*/ }) {
+                    modifier =
+                        Modifier.padding(horizontal = 4.dp)
+                            .align(alignment = Alignment.CenterVertically),
+                    onClick = { /* do something*/ }
+                ) {
                     Text("Chip $index")
                 }
             }
diff --git a/compose/material/material/samples/src/main/java/androidx/compose/material/samples/DrawerSamples.kt b/compose/material/material/samples/src/main/java/androidx/compose/material/samples/DrawerSamples.kt
index 2681624..f5ab3b1 100644
--- a/compose/material/material/samples/src/main/java/androidx/compose/material/samples/DrawerSamples.kt
+++ b/compose/material/material/samples/src/main/java/androidx/compose/material/samples/DrawerSamples.kt
@@ -70,9 +70,7 @@
             ) {
                 Text(text = if (drawerState.isClosed) ">>> Swipe >>>" else "<<< Swipe <<<")
                 Spacer(Modifier.height(20.dp))
-                Button(onClick = { scope.launch { drawerState.open() } }) {
-                    Text("Click to open")
-                }
+                Button(onClick = { scope.launch { drawerState.open() } }) { Text("Click to open") }
             }
         }
     )
@@ -86,10 +84,9 @@
     val scope = rememberCoroutineScope()
     Column {
         Row(
-            modifier = Modifier.fillMaxWidth().toggleable(
-                value = gesturesEnabled,
-                onValueChange = toggleGesturesEnabled
-            )
+            modifier =
+                Modifier.fillMaxWidth()
+                    .toggleable(value = gesturesEnabled, onValueChange = toggleGesturesEnabled)
         ) {
             Checkbox(gesturesEnabled, null)
             Text(text = if (gesturesEnabled) "Gestures Enabled" else "Gestures Disabled")
diff --git a/compose/material/material/samples/src/main/java/androidx/compose/material/samples/ExposedDropdownMenuSamples.kt b/compose/material/material/samples/src/main/java/androidx/compose/material/samples/ExposedDropdownMenuSamples.kt
index 60688f3..02c7680 100644
--- a/compose/material/material/samples/src/main/java/androidx/compose/material/samples/ExposedDropdownMenuSamples.kt
+++ b/compose/material/material/samples/src/main/java/androidx/compose/material/samples/ExposedDropdownMenuSamples.kt
@@ -44,21 +44,12 @@
         TextField(
             readOnly = true,
             value = selectedOptionText,
-            onValueChange = { },
+            onValueChange = {},
             label = { Text("Label") },
-            trailingIcon = {
-                ExposedDropdownMenuDefaults.TrailingIcon(
-                    expanded = expanded
-                )
-            },
+            trailingIcon = { ExposedDropdownMenuDefaults.TrailingIcon(expanded = expanded) },
             colors = ExposedDropdownMenuDefaults.textFieldColors()
         )
-        ExposedDropdownMenu(
-            expanded = expanded,
-            onDismissRequest = {
-                expanded = false
-            }
-        ) {
+        ExposedDropdownMenu(expanded = expanded, onDismissRequest = { expanded = false }) {
             options.forEach { selectionOption ->
                 DropdownMenuItem(
                     onClick = {
@@ -88,23 +79,13 @@
             value = selectedOptionText,
             onValueChange = { selectedOptionText = it },
             label = { Text("Label") },
-            trailingIcon = {
-                ExposedDropdownMenuDefaults.TrailingIcon(
-                    expanded = expanded
-                )
-            },
+            trailingIcon = { ExposedDropdownMenuDefaults.TrailingIcon(expanded = expanded) },
             colors = ExposedDropdownMenuDefaults.textFieldColors()
         )
         // filter options based on text field value
-        val filteringOptions =
-            options.filter { it.contains(selectedOptionText, ignoreCase = true) }
+        val filteringOptions = options.filter { it.contains(selectedOptionText, ignoreCase = true) }
         if (filteringOptions.isNotEmpty()) {
-            ExposedDropdownMenu(
-                expanded = expanded,
-                onDismissRequest = {
-                    expanded = false
-                }
-            ) {
+            ExposedDropdownMenu(expanded = expanded, onDismissRequest = { expanded = false }) {
                 filteringOptions.forEach { selectionOption ->
                     DropdownMenuItem(
                         onClick = {
diff --git a/compose/material/material/samples/src/main/java/androidx/compose/material/samples/FloatingActionButtonSamples.kt b/compose/material/material/samples/src/main/java/androidx/compose/material/samples/FloatingActionButtonSamples.kt
index de84531..276e391 100644
--- a/compose/material/material/samples/src/main/java/androidx/compose/material/samples/FloatingActionButtonSamples.kt
+++ b/compose/material/material/samples/src/main/java/androidx/compose/material/samples/FloatingActionButtonSamples.kt
@@ -37,10 +37,7 @@
 
 @Composable
 fun SimpleExtendedFabNoIcon() {
-    ExtendedFloatingActionButton(
-        text = { Text("EXTENDED") },
-        onClick = {}
-    )
+    ExtendedFloatingActionButton(text = { Text("EXTENDED") }, onClick = {})
 }
 
 @Sampled
diff --git a/compose/material/material/samples/src/main/java/androidx/compose/material/samples/ListSamples.kt b/compose/material/material/samples/src/main/java/androidx/compose/material/samples/ListSamples.kt
index dfe5161..3ddfcc8 100644
--- a/compose/material/material/samples/src/main/java/androidx/compose/material/samples/ListSamples.kt
+++ b/compose/material/material/samples/src/main/java/androidx/compose/material/samples/ListSamples.kt
@@ -54,11 +54,12 @@
                     onCheckedChange = null // null recommended for accessibility with screenreaders
                 )
             },
-            modifier = Modifier.toggleable(
-                role = Role.Switch,
-                value = switched,
-                onValueChange = onSwitchedChange
-            )
+            modifier =
+                Modifier.toggleable(
+                    role = Role.Switch,
+                    value = switched,
+                    onValueChange = onSwitchedChange
+                )
         )
         Divider()
         var checked by remember { mutableStateOf(true) }
@@ -71,11 +72,12 @@
                     onCheckedChange = null // null recommended for accessibility with screenreaders
                 )
             },
-            modifier = Modifier.toggleable(
-                role = Role.Checkbox,
-                value = checked,
-                onValueChange = onCheckedChange
-            )
+            modifier =
+                Modifier.toggleable(
+                    role = Role.Checkbox,
+                    value = checked,
+                    onValueChange = onCheckedChange
+                )
         )
         Divider()
     }
@@ -90,12 +92,7 @@
         Divider()
         ListItem(
             text = { Text("One line list item with 24x24 icon") },
-            icon = {
-                Icon(
-                    Icons.Filled.Favorite,
-                    contentDescription = null
-                )
-            }
+            icon = { Icon(Icons.Filled.Favorite, contentDescription = null) }
         )
         Divider()
         ListItem(
@@ -129,17 +126,12 @@
                     modifier = Modifier.size(56.dp)
                 )
             },
-            modifier = Modifier.clickable { }
+            modifier = Modifier.clickable {}
         )
         Divider()
         ListItem(
             text = { Text("One line list item with trailing icon") },
-            trailing = {
-                Icon(
-                    Icons.Filled.Favorite,
-                    contentDescription = "Localized Description"
-                )
-            }
+            trailing = { Icon(Icons.Filled.Favorite, contentDescription = "Localized Description") }
         )
         Divider()
         ListItem(
@@ -151,12 +143,7 @@
                     modifier = Modifier.size(40.dp)
                 )
             },
-            trailing = {
-                Icon(
-                    Icons.Filled.Favorite,
-                    contentDescription = "Localized description"
-                )
-            }
+            trailing = { Icon(Icons.Filled.Favorite, contentDescription = "Localized description") }
         )
         Divider()
     }
@@ -167,25 +154,14 @@
 @OptIn(ExperimentalMaterialApi::class)
 fun TwoLineListItems() {
     Column {
-        ListItem(
-            text = { Text("Two line list item") },
-            secondaryText = { Text("Secondary text") }
-        )
+        ListItem(text = { Text("Two line list item") }, secondaryText = { Text("Secondary text") })
         Divider()
-        ListItem(
-            text = { Text("Two line list item") },
-            overlineText = { Text("OVERLINE") }
-        )
+        ListItem(text = { Text("Two line list item") }, overlineText = { Text("OVERLINE") })
         Divider()
         ListItem(
             text = { Text("Two line list item with 24x24 icon") },
             secondaryText = { Text("Secondary text") },
-            icon = {
-                Icon(
-                    Icons.Filled.Favorite,
-                    contentDescription = null
-                )
-            }
+            icon = { Icon(Icons.Filled.Favorite, contentDescription = null) }
         )
         Divider()
         ListItem(
@@ -248,12 +224,7 @@
                 )
             },
             singleLineSecondaryText = false,
-            icon = {
-                Icon(
-                    Icons.Filled.Favorite,
-                    contentDescription = null
-                )
-            }
+            icon = { Icon(Icons.Filled.Favorite, contentDescription = null) }
         )
         Divider()
         ListItem(
@@ -265,12 +236,7 @@
                 )
             },
             singleLineSecondaryText = false,
-            trailing = {
-                Icon(
-                    Icons.Filled.Favorite,
-                    contentDescription = "Localized description"
-                )
-            }
+            trailing = { Icon(Icons.Filled.Favorite, contentDescription = "Localized description") }
         )
         Divider()
         ListItem(
@@ -304,22 +270,12 @@
         Divider()
         ListItem(
             text = { Text("One line list item with 24x24 icon") },
-            icon = {
-                Icon(
-                    Icons.Filled.Favorite,
-                    contentDescription = null
-                )
-            }
+            icon = { Icon(Icons.Filled.Favorite, contentDescription = null) }
         )
         Divider()
         ListItem(
             text = { Text("عنصر قائمة واحد مع رمز زائدة") },
-            trailing = {
-                Icon(
-                    Icons.Filled.Favorite,
-                    contentDescription = null
-                )
-            }
+            trailing = { Icon(Icons.Filled.Favorite, contentDescription = null) }
         )
         Divider()
     }
@@ -329,18 +285,12 @@
 @OptIn(ExperimentalMaterialApi::class)
 fun TwoLineRtlLtrListItems() {
     Column {
-        ListItem(
-            text = { Text("Two line list item") },
-            secondaryText = { Text("Secondary text") }
-        )
+        ListItem(text = { Text("Two line list item") }, secondaryText = { Text("Secondary text") })
+        Divider()
+        ListItem(text = { Text("بند قائمة من سطرين") }, secondaryText = { Text("نص ثانوي") })
         Divider()
         ListItem(
-            text = { Text("بند قائمة من سطرين") },
-            secondaryText = { Text("نص ثانوي") }
-        )
-        Divider()
-        ListItem(
-            modifier = Modifier.clickable { },
+            modifier = Modifier.clickable {},
             text = { Text("Clickable") },
             secondaryText = { Text("Short item") }
         )
@@ -367,7 +317,7 @@
                     modifier = Modifier.size(40.dp)
                 )
             },
-            modifier = Modifier.clickable { }
+            modifier = Modifier.clickable {}
         )
         Divider()
     }
diff --git a/compose/material/material/samples/src/main/java/androidx/compose/material/samples/MenuSamples.kt b/compose/material/material/samples/src/main/java/androidx/compose/material/samples/MenuSamples.kt
index f9c6a77..290ccfc 100644
--- a/compose/material/material/samples/src/main/java/androidx/compose/material/samples/MenuSamples.kt
+++ b/compose/material/material/samples/src/main/java/androidx/compose/material/samples/MenuSamples.kt
@@ -43,26 +43,15 @@
 fun MenuSample() {
     var expanded by remember { mutableStateOf(false) }
 
-    Box(modifier = Modifier
-        .fillMaxSize()
-        .wrapContentSize(Alignment.TopStart)) {
+    Box(modifier = Modifier.fillMaxSize().wrapContentSize(Alignment.TopStart)) {
         IconButton(onClick = { expanded = true }) {
             Icon(Icons.Default.MoreVert, contentDescription = "Localized description")
         }
-        DropdownMenu(
-            expanded = expanded,
-            onDismissRequest = { expanded = false }
-        ) {
-            DropdownMenuItem(onClick = { /* Handle refresh! */ }) {
-                Text("Refresh")
-            }
-            DropdownMenuItem(onClick = { /* Handle settings! */ }) {
-                Text("Settings")
-            }
+        DropdownMenu(expanded = expanded, onDismissRequest = { expanded = false }) {
+            DropdownMenuItem(onClick = { /* Handle refresh! */ }) { Text("Refresh") }
+            DropdownMenuItem(onClick = { /* Handle settings! */ }) { Text("Settings") }
             Divider()
-            DropdownMenuItem(onClick = { /* Handle send feedback! */ }) {
-                Text("Send Feedback")
-            }
+            DropdownMenuItem(onClick = { /* Handle send feedback! */ }) { Text("Send Feedback") }
         }
     }
 }
@@ -72,11 +61,7 @@
 fun MenuWithScrollStateSample() {
     var expanded by remember { mutableStateOf(false) }
     val scrollState = rememberScrollState()
-    Box(
-        modifier = Modifier
-            .fillMaxSize()
-            .wrapContentSize(Alignment.TopStart)
-    ) {
+    Box(modifier = Modifier.fillMaxSize().wrapContentSize(Alignment.TopStart)) {
         IconButton(onClick = { expanded = true }) {
             Icon(Icons.Default.MoreVert, contentDescription = "Localized description")
         }
@@ -86,9 +71,7 @@
             scrollState = scrollState
         ) {
             repeat(30) {
-                DropdownMenuItem(onClick = { /* Handle item! */ }) {
-                    Text("Item ${it + 1}")
-                }
+                DropdownMenuItem(onClick = { /* Handle item! */ }) { Text("Item ${it + 1}") }
             }
         }
         LaunchedEffect(expanded) {
diff --git a/compose/material/material/samples/src/main/java/androidx/compose/material/samples/ModalBottomSheetSamples.kt b/compose/material/material/samples/src/main/java/androidx/compose/material/samples/ModalBottomSheetSamples.kt
index 18462f3..ae6a7f9 100644
--- a/compose/material/material/samples/src/main/java/androidx/compose/material/samples/ModalBottomSheetSamples.kt
+++ b/compose/material/material/samples/src/main/java/androidx/compose/material/samples/ModalBottomSheetSamples.kt
@@ -54,10 +54,11 @@
 @OptIn(ExperimentalMaterialApi::class)
 fun ModalBottomSheetSample() {
     var skipHalfExpanded by remember { mutableStateOf(false) }
-    val state = rememberModalBottomSheetState(
-        initialValue = ModalBottomSheetValue.Hidden,
-        skipHalfExpanded = skipHalfExpanded
-    )
+    val state =
+        rememberModalBottomSheetState(
+            initialValue = ModalBottomSheetValue.Hidden,
+            skipHalfExpanded = skipHalfExpanded
+        )
     val scope = rememberCoroutineScope()
     ModalBottomSheetLayout(
         sheetState = state,
@@ -93,9 +94,7 @@
                 Text("Skip Half Expanded State")
             }
             Spacer(Modifier.height(20.dp))
-            Button(onClick = { scope.launch { state.show() } }) {
-                Text("Click to show sheet")
-            }
+            Button(onClick = { scope.launch { state.show() } }) { Text("Click to show sheet") }
         }
     }
 }
diff --git a/compose/material/material/samples/src/main/java/androidx/compose/material/samples/ProgressIndicatorSamples.kt b/compose/material/material/samples/src/main/java/androidx/compose/material/samples/ProgressIndicatorSamples.kt
index cc72981..44ac739 100644
--- a/compose/material/material/samples/src/main/java/androidx/compose/material/samples/ProgressIndicatorSamples.kt
+++ b/compose/material/material/samples/src/main/java/androidx/compose/material/samples/ProgressIndicatorSamples.kt
@@ -39,21 +39,16 @@
 @Composable
 fun LinearProgressIndicatorSample() {
     var progress by remember { mutableStateOf(0.1f) }
-    val animatedProgress by animateFloatAsState(
-        targetValue = progress,
-        animationSpec = ProgressIndicatorDefaults.ProgressAnimationSpec
-    )
+    val animatedProgress by
+        animateFloatAsState(
+            targetValue = progress,
+            animationSpec = ProgressIndicatorDefaults.ProgressAnimationSpec
+        )
 
     Column(horizontalAlignment = Alignment.CenterHorizontally) {
         LinearProgressIndicator(progress = animatedProgress)
         Spacer(Modifier.requiredHeight(30.dp))
-        OutlinedButton(
-            onClick = {
-                if (progress < 1f) progress += 0.1f
-            }
-        ) {
-            Text("Increase")
-        }
+        OutlinedButton(onClick = { if (progress < 1f) progress += 0.1f }) { Text("Increase") }
     }
 }
 
@@ -61,20 +56,15 @@
 @Composable
 fun CircularProgressIndicatorSample() {
     var progress by remember { mutableStateOf(0.1f) }
-    val animatedProgress by animateFloatAsState(
-        targetValue = progress,
-        animationSpec = ProgressIndicatorDefaults.ProgressAnimationSpec
-    )
+    val animatedProgress by
+        animateFloatAsState(
+            targetValue = progress,
+            animationSpec = ProgressIndicatorDefaults.ProgressAnimationSpec
+        )
 
     Column(horizontalAlignment = Alignment.CenterHorizontally) {
         CircularProgressIndicator(progress = animatedProgress)
         Spacer(Modifier.requiredHeight(30.dp))
-        OutlinedButton(
-            onClick = {
-                if (progress < 1f) progress += 0.1f
-            }
-        ) {
-            Text("Increase")
-        }
+        OutlinedButton(onClick = { if (progress < 1f) progress += 0.1f }) { Text("Increase") }
     }
 }
diff --git a/compose/material/material/samples/src/main/java/androidx/compose/material/samples/PullRefreshSamples.kt b/compose/material/material/samples/src/main/java/androidx/compose/material/samples/PullRefreshSamples.kt
index cc5a0b7..9b6e955 100644
--- a/compose/material/material/samples/src/main/java/androidx/compose/material/samples/PullRefreshSamples.kt
+++ b/compose/material/material/samples/src/main/java/androidx/compose/material/samples/PullRefreshSamples.kt
@@ -59,21 +59,20 @@
     var refreshing by remember { mutableStateOf(false) }
     var itemCount by remember { mutableStateOf(15) }
 
-    fun refresh() = refreshScope.launch {
-        refreshing = true
-        delay(1500)
-        itemCount += 5
-        refreshing = false
-    }
+    fun refresh() =
+        refreshScope.launch {
+            refreshing = true
+            delay(1500)
+            itemCount += 5
+            refreshing = false
+        }
 
     val state = rememberPullRefreshState(refreshing, ::refresh)
 
     Box(Modifier.pullRefresh(state)) {
         LazyColumn(Modifier.fillMaxSize()) {
             if (!refreshing) {
-                items(itemCount) {
-                    ListItem { Text(text = "Item ${itemCount - it}") }
-                }
+                items(itemCount) { ListItem { Text(text = "Item ${itemCount - it}") } }
             }
         }
 
@@ -82,8 +81,7 @@
 }
 
 /**
- * An example to show how [pullRefresh] could be used to build a custom
- * pull to refresh component.
+ * An example to show how [pullRefresh] could be used to build a custom pull to refresh component.
  */
 @Sampled
 @Composable
@@ -98,22 +96,24 @@
 
     val progress = currentDistance / threshold
 
-    fun refresh() = refreshScope.launch {
-        refreshing = true
-        delay(1500)
-        itemCount += 5
-        refreshing = false
-    }
-
-    fun onPull(pullDelta: Float): Float = when {
-        refreshing -> 0f
-        else -> {
-            val newOffset = (currentDistance + pullDelta).coerceAtLeast(0f)
-            val dragConsumed = newOffset - currentDistance
-            currentDistance = newOffset
-            dragConsumed
+    fun refresh() =
+        refreshScope.launch {
+            refreshing = true
+            delay(1500)
+            itemCount += 5
+            refreshing = false
         }
-    }
+
+    fun onPull(pullDelta: Float): Float =
+        when {
+            refreshing -> 0f
+            else -> {
+                val newOffset = (currentDistance + pullDelta).coerceAtLeast(0f)
+                val dragConsumed = newOffset - currentDistance
+                currentDistance = newOffset
+                dragConsumed
+            }
+        }
 
     fun onRelease(velocity: Float): Float {
         if (refreshing) return 0f // Already refreshing - don't call refresh again.
@@ -136,9 +136,7 @@
     Box(Modifier.pullRefresh(::onPull, ::onRelease)) {
         LazyColumn {
             if (!refreshing) {
-                items(itemCount) {
-                    ListItem { Text(text = "Item ${itemCount - it}") }
-                }
+                items(itemCount) { ListItem { Text(text = "Item ${itemCount - it}") } }
             }
         }
 
@@ -154,8 +152,8 @@
 }
 
 /**
- * An example to show how [pullRefreshIndicatorTransform] can be given custom contents to create
- * a custom indicator.
+ * An example to show how [pullRefreshIndicatorTransform] can be given custom contents to create a
+ * custom indicator.
  */
 @Sampled
 @Composable
@@ -165,35 +163,30 @@
     var refreshing by remember { mutableStateOf(false) }
     var itemCount by remember { mutableStateOf(15) }
 
-    fun refresh() = refreshScope.launch {
-        refreshing = true
-        delay(1500)
-        itemCount += 5
-        refreshing = false
-    }
+    fun refresh() =
+        refreshScope.launch {
+            refreshing = true
+            delay(1500)
+            itemCount += 5
+            refreshing = false
+        }
 
     val state = rememberPullRefreshState(refreshing, ::refresh)
     val rotation = animateFloatAsState(state.progress * 120)
 
-    Box(
-        Modifier
-            .fillMaxSize()
-            .pullRefresh(state)
-    ) {
+    Box(Modifier.fillMaxSize().pullRefresh(state)) {
         LazyColumn {
             if (!refreshing) {
-                items(itemCount) {
-                    ListItem { Text(text = "Item ${itemCount - it}") }
-                }
+                items(itemCount) { ListItem { Text(text = "Item ${itemCount - it}") } }
             }
         }
 
         Surface(
-            modifier = Modifier
-                .size(40.dp)
-                .align(Alignment.TopCenter)
-                .pullRefreshIndicatorTransform(state)
-                .rotate(rotation.value),
+            modifier =
+                Modifier.size(40.dp)
+                    .align(Alignment.TopCenter)
+                    .pullRefreshIndicatorTransform(state)
+                    .rotate(rotation.value),
             shape = RoundedCornerShape(10.dp),
             color = Color.DarkGray,
             elevation = if (state.progress > 0 || refreshing) 20.dp else 0.dp,
@@ -201,9 +194,7 @@
             Box {
                 if (refreshing) {
                     CircularProgressIndicator(
-                        modifier = Modifier
-                            .align(Alignment.Center)
-                            .size(25.dp),
+                        modifier = Modifier.align(Alignment.Center).size(25.dp),
                         color = Color.White,
                         strokeWidth = 3.dp
                     )
diff --git a/compose/material/material/samples/src/main/java/androidx/compose/material/samples/ScaffoldSamples.kt b/compose/material/material/samples/src/main/java/androidx/compose/material/samples/ScaffoldSamples.kt
index 4198525..1f868ab 100644
--- a/compose/material/material/samples/src/main/java/androidx/compose/material/samples/ScaffoldSamples.kt
+++ b/compose/material/material/samples/src/main/java/androidx/compose/material/samples/ScaffoldSamples.kt
@@ -65,13 +65,14 @@
 import kotlinx.coroutines.flow.receiveAsFlow
 import kotlinx.coroutines.launch
 
-private val colors = listOf(
-    Color(0xFFffd7d7.toInt()),
-    Color(0xFFffe9d6.toInt()),
-    Color(0xFFfffbd0.toInt()),
-    Color(0xFFe3ffd9.toInt()),
-    Color(0xFFd0fff8.toInt())
-)
+private val colors =
+    listOf(
+        Color(0xFFffd7d7.toInt()),
+        Color(0xFFffe9d6.toInt()),
+        Color(0xFFfffbd0.toInt()),
+        Color(0xFFe3ffd9.toInt()),
+        Color(0xFFd0fff8.toInt())
+    )
 
 @Sampled
 @Composable
@@ -85,11 +86,7 @@
             TopAppBar(
                 title = { Text("Simple Scaffold Screen") },
                 navigationIcon = {
-                    IconButton(
-                        onClick = {
-                            scope.launch { scaffoldState.drawerState.open() }
-                        }
-                    ) {
+                    IconButton(onClick = { scope.launch { scaffoldState.drawerState.open() } }) {
                         Icon(Icons.Filled.Menu, contentDescription = "Localized description")
                     }
                 }
@@ -106,12 +103,7 @@
         content = { innerPadding ->
             LazyColumn(contentPadding = innerPadding) {
                 items(count = 100) {
-                    Box(
-                        Modifier
-                            .fillMaxWidth()
-                            .height(50.dp)
-                            .background(colors[it % colors.size])
-                    )
+                    Box(Modifier.fillMaxWidth().height(50.dp).background(colors[it % colors.size]))
                 }
             }
         }
@@ -135,13 +127,14 @@
 
     // When progress is 0, there is no modification to the edges so we are just drawing a rectangle.
     // This allows for a smooth transition between cut corners and round corners.
-    val fabShape = if (progress < 0) {
-        CutCornerShape(abs(progress))
-    } else if (progress == roundEdgePercent.toInt()) {
-        CircleShape
-    } else {
-        RoundedCornerShape(progress)
-    }
+    val fabShape =
+        if (progress < 0) {
+            CutCornerShape(abs(progress))
+        } else if (progress == roundEdgePercent.toInt()) {
+            CircleShape
+        } else {
+            RoundedCornerShape(progress)
+        }
     // lambda to call to trigger shape animation
     val changeShape: () -> Unit = {
         val target = animatedProgress.targetValue
@@ -161,9 +154,7 @@
         bottomBar = {
             BottomAppBar(cutoutShape = fabShape) {
                 IconButton(
-                    onClick = {
-                        coroutineScope.launch { scaffoldState.drawerState.open() }
-                    }
+                    onClick = { coroutineScope.launch { scaffoldState.drawerState.open() } }
                 ) {
                     Icon(Icons.Filled.Menu, contentDescription = "Localized description")
                 }
@@ -182,12 +173,7 @@
         content = { innerPadding ->
             LazyColumn(contentPadding = innerPadding) {
                 items(count = 100) {
-                    Box(
-                        Modifier
-                            .fillMaxWidth()
-                            .height(50.dp)
-                            .background(colors[it % colors.size])
-                    )
+                    Box(Modifier.fillMaxWidth().height(50.dp).background(colors[it % colors.size]))
                 }
             }
         }
@@ -271,10 +257,11 @@
     val channel = remember { Channel<Int>(Channel.Factory.CONFLATED) }
     LaunchedEffect(channel) {
         channel.receiveAsFlow().collect { index ->
-            val result = snackbarHostState.showSnackbar(
-                message = "Snackbar # $index",
-                actionLabel = "Action on $index"
-            )
+            val result =
+                snackbarHostState.showSnackbar(
+                    message = "Snackbar # $index",
+                    actionLabel = "Action on $index"
+                )
             when (result) {
                 SnackbarResult.ActionPerformed -> {
                     /* action has been performed */
diff --git a/compose/material/material/samples/src/main/java/androidx/compose/material/samples/SelectionControlsSamples.kt b/compose/material/material/samples/src/main/java/androidx/compose/material/samples/SelectionControlsSamples.kt
index ca9f13f..1a726c5 100644
--- a/compose/material/material/samples/src/main/java/androidx/compose/material/samples/SelectionControlsSamples.kt
+++ b/compose/material/material/samples/src/main/java/androidx/compose/material/samples/SelectionControlsSamples.kt
@@ -64,11 +64,11 @@
         val (state2, onStateChange2) = remember { mutableStateOf(true) }
 
         // TriStateCheckbox state reflects state of dependent checkboxes
-        val parentState = remember(state, state2) {
-            if (state && state2) ToggleableState.On
-            else if (!state && !state2) ToggleableState.Off
-            else ToggleableState.Indeterminate
-        }
+        val parentState =
+            remember(state, state2) {
+                if (state && state2) ToggleableState.On
+                else if (!state && !state2) ToggleableState.Off else ToggleableState.Indeterminate
+            }
         // click on TriStateCheckbox can set state for dependent checkboxes
         val onParentClick = {
             val s = parentState != ToggleableState.On
@@ -79,9 +79,7 @@
         TriStateCheckbox(
             state = parentState,
             onClick = onParentClick,
-            colors = CheckboxDefaults.colors(
-                checkedColor = MaterialTheme.colors.primary
-            )
+            colors = CheckboxDefaults.colors(checkedColor = MaterialTheme.colors.primary)
         )
         Spacer(Modifier.size(25.dp))
         Column(Modifier.padding(10.dp, 0.dp, 0.dp, 0.dp)) {
@@ -100,10 +98,9 @@
     val focusRequester = FocusRequester()
     Box(Modifier.wrapContentSize(Alignment.TopStart)) {
         Checkbox(
-            modifier = Modifier.wrapContentSize(Alignment.TopStart)
-                .focusRequester(focusRequester),
+            modifier = Modifier.wrapContentSize(Alignment.TopStart).focusRequester(focusRequester),
             checked = true,
-            onCheckedChange = { }
+            onCheckedChange = {}
         )
     }
 
@@ -119,26 +116,19 @@
 @Composable
 fun CheckboxSample() {
     val checkedState = remember { mutableStateOf(true) }
-    Checkbox(
-        checked = checkedState.value,
-        onCheckedChange = { checkedState.value = it }
-    )
+    Checkbox(checked = checkedState.value, onCheckedChange = { checkedState.value = it })
 }
 
 @Sampled
 @Composable
 fun SwitchSample() {
     val checkedState = remember { mutableStateOf(true) }
-    Switch(
-        checked = checkedState.value,
-        onCheckedChange = { checkedState.value = it }
-    )
+    Switch(checked = checkedState.value, onCheckedChange = { checkedState.value = it })
 
     var pineappleOnPizza by remember { mutableStateOf(true) }
 
     Row(
-        Modifier
-            .padding(16.dp)
+        Modifier.padding(16.dp)
             .toggleable(
                 role = Role.Switch,
                 value = pineappleOnPizza,
@@ -158,14 +148,8 @@
     var state by remember { mutableStateOf(true) }
     // Note that Modifier.selectableGroup() is essential to ensure correct accessibility behavior
     Row(Modifier.selectableGroup()) {
-        RadioButton(
-            selected = state,
-            onClick = { state = true }
-        )
-        RadioButton(
-            selected = !state,
-            onClick = { state = false }
-        )
+        RadioButton(selected = state, onClick = { state = true })
+        RadioButton(selected = !state, onClick = { state = false })
     }
 }
 
@@ -178,8 +162,7 @@
     Column(Modifier.selectableGroup()) {
         radioOptions.forEach { text ->
             Row(
-                Modifier
-                    .fillMaxWidth()
+                Modifier.fillMaxWidth()
                     .height(56.dp)
                     .selectable(
                         selected = (text == selectedOption),
diff --git a/compose/material/material/samples/src/main/java/androidx/compose/material/samples/SliderSample.kt b/compose/material/material/samples/src/main/java/androidx/compose/material/samples/SliderSample.kt
index 0e014ff..d192548 100644
--- a/compose/material/material/samples/src/main/java/androidx/compose/material/samples/SliderSample.kt
+++ b/compose/material/material/samples/src/main/java/androidx/compose/material/samples/SliderSample.kt
@@ -61,10 +61,11 @@
             // Only allow multiples of 10. Excluding the endpoints of `valueRange`,
             // there are 9 steps (10, 20, ..., 90).
             steps = 9,
-            colors = SliderDefaults.colors(
-                thumbColor = MaterialTheme.colors.secondary,
-                activeTrackColor = MaterialTheme.colors.secondary
-            )
+            colors =
+                SliderDefaults.colors(
+                    thumbColor = MaterialTheme.colors.secondary,
+                    activeTrackColor = MaterialTheme.colors.secondary
+                )
         )
     }
 }
@@ -110,10 +111,11 @@
             // Only allow multiples of 10. Excluding the endpoints of `valueRange`,
             // there are 9 steps (10, 20, ..., 90).
             steps = 9,
-            colors = SliderDefaults.colors(
-                thumbColor = MaterialTheme.colors.secondary,
-                activeTrackColor = MaterialTheme.colors.secondary
-            )
+            colors =
+                SliderDefaults.colors(
+                    thumbColor = MaterialTheme.colors.secondary,
+                    activeTrackColor = MaterialTheme.colors.secondary
+                )
         )
     }
 }
diff --git a/compose/material/material/samples/src/main/java/androidx/compose/material/samples/SurfaceSamples.kt b/compose/material/material/samples/src/main/java/androidx/compose/material/samples/SurfaceSamples.kt
index 3565446..aafd063 100644
--- a/compose/material/material/samples/src/main/java/androidx/compose/material/samples/SurfaceSamples.kt
+++ b/compose/material/material/samples/src/main/java/androidx/compose/material/samples/SurfaceSamples.kt
@@ -31,11 +31,7 @@
 @Sampled
 @Composable
 fun SurfaceSample() {
-    Surface(
-        color = MaterialTheme.colors.background
-    ) {
-        Text("Text color is `onBackground`")
-    }
+    Surface(color = MaterialTheme.colors.background) { Text("Text color is `onBackground`") }
 }
 
 @OptIn(ExperimentalMaterialApi::class)
@@ -43,10 +39,7 @@
 @Composable
 fun ClickableSurfaceSample() {
     var count by remember { mutableStateOf(0) }
-    Surface(
-        onClick = { count++ },
-        color = MaterialTheme.colors.background
-    ) {
+    Surface(onClick = { count++ }, color = MaterialTheme.colors.background) {
         Text("Clickable surface Text with `onBackground` color and count: $count")
     }
 }
@@ -61,10 +54,7 @@
         onClick = { selected = !selected },
         color = MaterialTheme.colors.background
     ) {
-        Text(
-            text = if (selected) "Selected" else "Not Selected",
-            textAlign = TextAlign.Center
-        )
+        Text(text = if (selected) "Selected" else "Not Selected", textAlign = TextAlign.Center)
     }
 }
 
@@ -76,15 +66,13 @@
     Surface(
         checked = checked,
         onCheckedChange = { checked = !checked },
-        color = if (checked) {
-            MaterialTheme.colors.primary
-        } else {
-            MaterialTheme.colors.background
-        }
+        color =
+            if (checked) {
+                MaterialTheme.colors.primary
+            } else {
+                MaterialTheme.colors.background
+            }
     ) {
-        Text(
-            text = if (checked) "ON" else "OFF",
-            textAlign = TextAlign.Center
-        )
+        Text(text = if (checked) "ON" else "OFF", textAlign = TextAlign.Center)
     }
 }
diff --git a/compose/material/material/samples/src/main/java/androidx/compose/material/samples/SwipeToDismissSamples.kt b/compose/material/material/samples/src/main/java/androidx/compose/material/samples/SwipeToDismissSamples.kt
index 03d234b..8775532 100644
--- a/compose/material/material/samples/src/main/java/androidx/compose/material/samples/SwipeToDismissSamples.kt
+++ b/compose/material/material/samples/src/main/java/androidx/compose/material/samples/SwipeToDismissSamples.kt
@@ -53,22 +53,23 @@
 import androidx.compose.ui.text.font.FontWeight
 import androidx.compose.ui.unit.dp
 
-private val items = listOf(
-    "Cupcake",
-    "Donut",
-    "Eclair",
-    "Froyo",
-    "Gingerbread",
-    "Honeycomb",
-    "Ice cream sandwich",
-    "Jelly bean",
-    "KitKat",
-    "Lollipop",
-    "Marshmallow",
-    "Nougat",
-    "Oreo",
-    "Pie"
-)
+private val items =
+    listOf(
+        "Cupcake",
+        "Donut",
+        "Eclair",
+        "Froyo",
+        "Gingerbread",
+        "Honeycomb",
+        "Ice cream sandwich",
+        "Jelly bean",
+        "KitKat",
+        "Lollipop",
+        "Marshmallow",
+        "Nougat",
+        "Oreo",
+        "Pie"
+    )
 
 @Sampled
 @Composable
@@ -83,36 +84,39 @@
     LazyColumn {
         items(items) { item ->
             var unread by remember { mutableStateOf(false) }
-            val dismissState = rememberDismissState(
-                confirmStateChange = {
-                    if (it == DismissedToEnd) unread = !unread
-                    it != DismissedToEnd
-                }
-            )
+            val dismissState =
+                rememberDismissState(
+                    confirmStateChange = {
+                        if (it == DismissedToEnd) unread = !unread
+                        it != DismissedToEnd
+                    }
+                )
             SwipeToDismiss(
                 state = dismissState,
                 modifier = Modifier.padding(vertical = 4.dp),
                 directions = setOf(StartToEnd, EndToStart),
                 background = {
                     val direction = dismissState.dismissDirection ?: return@SwipeToDismiss
-                    val color by animateColorAsState(
-                        when (dismissState.targetValue) {
-                            Default -> Color.LightGray
-                            DismissedToEnd -> Color.Green
-                            DismissedToStart -> Color.Red
+                    val color by
+                        animateColorAsState(
+                            when (dismissState.targetValue) {
+                                Default -> Color.LightGray
+                                DismissedToEnd -> Color.Green
+                                DismissedToStart -> Color.Red
+                            }
+                        )
+                    val alignment =
+                        when (direction) {
+                            StartToEnd -> Alignment.CenterStart
+                            EndToStart -> Alignment.CenterEnd
                         }
-                    )
-                    val alignment = when (direction) {
-                        StartToEnd -> Alignment.CenterStart
-                        EndToStart -> Alignment.CenterEnd
-                    }
-                    val icon = when (direction) {
-                        StartToEnd -> Icons.Default.Done
-                        EndToStart -> Icons.Default.Delete
-                    }
-                    val scale by animateFloatAsState(
-                        if (dismissState.targetValue == Default) 0.75f else 1f
-                    )
+                    val icon =
+                        when (direction) {
+                            StartToEnd -> Icons.Default.Done
+                            EndToStart -> Icons.Default.Delete
+                        }
+                    val scale by
+                        animateFloatAsState(if (dismissState.targetValue == Default) 0.75f else 1f)
 
                     Box(
                         Modifier.fillMaxSize().background(color).padding(horizontal = 20.dp),
@@ -127,9 +131,11 @@
                 },
                 dismissContent = {
                     Card(
-                        elevation = animateDpAsState(
-                            if (dismissState.dismissDirection != null) 4.dp else 0.dp
-                        ).value
+                        elevation =
+                            animateDpAsState(
+                                    if (dismissState.dismissDirection != null) 4.dp else 0.dp
+                                )
+                                .value
                     ) {
                         ListItem(
                             text = {
diff --git a/compose/material/material/samples/src/main/java/androidx/compose/material/samples/SwipeableSamples.kt b/compose/material/material/samples/src/main/java/androidx/compose/material/samples/SwipeableSamples.kt
index b28e7f7..77f5599 100644
--- a/compose/material/material/samples/src/main/java/androidx/compose/material/samples/SwipeableSamples.kt
+++ b/compose/material/material/samples/src/main/java/androidx/compose/material/samples/SwipeableSamples.kt
@@ -53,19 +53,18 @@
     val anchors = mapOf(0f to "A", sizePx / 2 to "B", sizePx to "C")
 
     Box(
-        modifier = Modifier
-            .width(width)
-            .swipeable(
-                state = swipeableState,
-                anchors = anchors,
-                thresholds = { _, _ -> FractionalThreshold(0.5f) },
-                orientation = Orientation.Horizontal
-            )
-            .background(Color.Black)
+        modifier =
+            Modifier.width(width)
+                .swipeable(
+                    state = swipeableState,
+                    anchors = anchors,
+                    thresholds = { _, _ -> FractionalThreshold(0.5f) },
+                    orientation = Orientation.Horizontal
+                )
+                .background(Color.Black)
     ) {
         Box(
-            Modifier
-                .offset { IntOffset(swipeableState.offset.value.roundToInt(), 0) }
+            Modifier.offset { IntOffset(swipeableState.offset.value.roundToInt(), 0) }
                 .size(squareSize)
                 .background(Color.Red),
             contentAlignment = Alignment.Center
diff --git a/compose/material/material/samples/src/main/java/androidx/compose/material/samples/TabSamples.kt b/compose/material/material/samples/src/main/java/androidx/compose/material/samples/TabSamples.kt
index 6ac79a1..8c6a346 100644
--- a/compose/material/material/samples/src/main/java/androidx/compose/material/samples/TabSamples.kt
+++ b/compose/material/material/samples/src/main/java/androidx/compose/material/samples/TabSamples.kt
@@ -65,11 +65,7 @@
     Column {
         TabRow(selectedTabIndex = state) {
             titles.forEachIndexed { index, title ->
-                Tab(
-                    text = { Text(title) },
-                    selected = state == index,
-                    onClick = { state = index }
-                )
+                Tab(text = { Text(title) }, selected = state == index, onClick = { state = index })
             }
         }
         Text(
@@ -105,11 +101,12 @@
 @Composable
 fun TextAndIconTabs() {
     var state by remember { mutableStateOf(0) }
-    val titlesAndIcons = listOf(
-        "TAB 1" to Icons.Filled.Favorite,
-        "TAB 2" to Icons.Filled.Favorite,
-        "TAB 3 WITH LOTS OF TEXT" to Icons.Filled.Favorite
-    )
+    val titlesAndIcons =
+        listOf(
+            "TAB 1" to Icons.Filled.Favorite,
+            "TAB 2" to Icons.Filled.Favorite,
+            "TAB 3 WITH LOTS OF TEXT" to Icons.Filled.Favorite
+        )
     Column {
         TabRow(selectedTabIndex = state) {
             titlesAndIcons.forEachIndexed { index, (title, icon) ->
@@ -132,11 +129,12 @@
 @Composable
 fun LeadingIconTabs() {
     var state by remember { mutableStateOf(0) }
-    val titlesAndIcons = listOf(
-        "TAB" to Icons.Filled.Favorite,
-        "TAB & ICON" to Icons.Filled.Favorite,
-        "TAB 3 WITH LOTS OF TEXT" to Icons.Filled.Favorite
-    )
+    val titlesAndIcons =
+        listOf(
+            "TAB" to Icons.Filled.Favorite,
+            "TAB & ICON" to Icons.Filled.Favorite,
+            "TAB 3 WITH LOTS OF TEXT" to Icons.Filled.Favorite
+        )
     Column {
         TabRow(selectedTabIndex = state) {
             titlesAndIcons.forEachIndexed { index, (title, icon) ->
@@ -159,26 +157,23 @@
 @Composable
 fun ScrollingTextTabs() {
     var state by remember { mutableStateOf(0) }
-    val titles = listOf(
-        "TAB 1",
-        "TAB 2",
-        "TAB 3 WITH LOTS OF TEXT",
-        "TAB 4",
-        "TAB 5",
-        "TAB 6 WITH LOTS OF TEXT",
-        "TAB 7",
-        "TAB 8",
-        "TAB 9 WITH LOTS OF TEXT",
-        "TAB 10"
-    )
+    val titles =
+        listOf(
+            "TAB 1",
+            "TAB 2",
+            "TAB 3 WITH LOTS OF TEXT",
+            "TAB 4",
+            "TAB 5",
+            "TAB 6 WITH LOTS OF TEXT",
+            "TAB 7",
+            "TAB 8",
+            "TAB 9 WITH LOTS OF TEXT",
+            "TAB 10"
+        )
     Column {
         ScrollableTabRow(selectedTabIndex = state) {
             titles.forEachIndexed { index, title ->
-                Tab(
-                    text = { Text(title) },
-                    selected = state == index,
-                    onClick = { state = index }
-                )
+                Tab(text = { Text(title) }, selected = state == index, onClick = { state = index })
             }
         }
         Text(
@@ -215,21 +210,15 @@
     val titles = listOf("TAB 1", "TAB 2", "TAB 3")
 
     // Reuse the default offset animation modifier, but use our own indicator
-    val indicator = @Composable { tabPositions: List<TabPosition> ->
-        FancyIndicator(Color.White, Modifier.tabIndicatorOffset(tabPositions[state]))
-    }
+    val indicator =
+        @Composable { tabPositions: List<TabPosition> ->
+            FancyIndicator(Color.White, Modifier.tabIndicatorOffset(tabPositions[state]))
+        }
 
     Column {
-        TabRow(
-            selectedTabIndex = state,
-            indicator = indicator
-        ) {
+        TabRow(selectedTabIndex = state, indicator = indicator) {
             titles.forEachIndexed { index, title ->
-                Tab(
-                    text = { Text(title) },
-                    selected = state == index,
-                    onClick = { state = index }
-                )
+                Tab(text = { Text(title) }, selected = state == index, onClick = { state = index })
             }
         }
         Text(
@@ -246,21 +235,15 @@
     var state by remember { mutableStateOf(0) }
     val titles = listOf("TAB 1", "TAB 2", "TAB 3")
 
-    val indicator = @Composable { tabPositions: List<TabPosition> ->
-        FancyAnimatedIndicator(tabPositions = tabPositions, selectedTabIndex = state)
-    }
+    val indicator =
+        @Composable { tabPositions: List<TabPosition> ->
+            FancyAnimatedIndicator(tabPositions = tabPositions, selectedTabIndex = state)
+        }
 
     Column {
-        TabRow(
-            selectedTabIndex = state,
-            indicator = indicator
-        ) {
+        TabRow(selectedTabIndex = state, indicator = indicator) {
             titles.forEachIndexed { index, title ->
-                Tab(
-                    text = { Text(title) },
-                    selected = state == index,
-                    onClick = { state = index }
-                )
+                Tab(text = { Text(title) }, selected = state == index, onClick = { state = index })
             }
         }
         Text(
@@ -274,33 +257,28 @@
 @Composable
 fun ScrollingFancyIndicatorContainerTabs() {
     var state by remember { mutableStateOf(0) }
-    val titles = listOf(
-        "TAB 1",
-        "TAB 2",
-        "TAB 3 WITH LOTS OF TEXT",
-        "TAB 4",
-        "TAB 5",
-        "TAB 6 WITH LOTS OF TEXT",
-        "TAB 7",
-        "TAB 8",
-        "TAB 9 WITH LOTS OF TEXT",
-        "TAB 10"
-    )
-    val indicator = @Composable { tabPositions: List<TabPosition> ->
-        FancyAnimatedIndicator(tabPositions = tabPositions, selectedTabIndex = state)
-    }
+    val titles =
+        listOf(
+            "TAB 1",
+            "TAB 2",
+            "TAB 3 WITH LOTS OF TEXT",
+            "TAB 4",
+            "TAB 5",
+            "TAB 6 WITH LOTS OF TEXT",
+            "TAB 7",
+            "TAB 8",
+            "TAB 9 WITH LOTS OF TEXT",
+            "TAB 10"
+        )
+    val indicator =
+        @Composable { tabPositions: List<TabPosition> ->
+            FancyAnimatedIndicator(tabPositions = tabPositions, selectedTabIndex = state)
+        }
 
     Column {
-        ScrollableTabRow(
-            selectedTabIndex = state,
-            indicator = indicator
-        ) {
+        ScrollableTabRow(selectedTabIndex = state, indicator = indicator) {
             titles.forEachIndexed { index, title ->
-                Tab(
-                    text = { Text(title) },
-                    selected = state == index,
-                    onClick = { state = index }
-                )
+                Tab(text = { Text(title) }, selected = state == index, onClick = { state = index })
             }
         }
         Text(
@@ -351,50 +329,51 @@
 fun FancyAnimatedIndicator(tabPositions: List<TabPosition>, selectedTabIndex: Int) {
     val colors = listOf(Color.Yellow, Color.Red, Color.Green)
     val transition = updateTransition(selectedTabIndex)
-    val indicatorStart by transition.animateDp(
-        transitionSpec = {
-            // Handle directionality here, if we are moving to the right, we
-            // want the right side of the indicator to move faster, if we are
-            // moving to the left, we want the left side to move faster.
-            if (initialState < targetState) {
-                spring(dampingRatio = 1f, stiffness = 50f)
-            } else {
-                spring(dampingRatio = 1f, stiffness = 1000f)
+    val indicatorStart by
+        transition.animateDp(
+            transitionSpec = {
+                // Handle directionality here, if we are moving to the right, we
+                // want the right side of the indicator to move faster, if we are
+                // moving to the left, we want the left side to move faster.
+                if (initialState < targetState) {
+                    spring(dampingRatio = 1f, stiffness = 50f)
+                } else {
+                    spring(dampingRatio = 1f, stiffness = 1000f)
+                }
             }
+        ) {
+            tabPositions[it].left
         }
-    ) {
-        tabPositions[it].left
-    }
 
-    val indicatorEnd by transition.animateDp(
-        transitionSpec = {
-            // Handle directionality here, if we are moving to the right, we
-            // want the right side of the indicator to move faster, if we are
-            // moving to the left, we want the left side to move faster.
-            if (initialState < targetState) {
-                spring(dampingRatio = 1f, stiffness = 1000f)
-            } else {
-                spring(dampingRatio = 1f, stiffness = 50f)
+    val indicatorEnd by
+        transition.animateDp(
+            transitionSpec = {
+                // Handle directionality here, if we are moving to the right, we
+                // want the right side of the indicator to move faster, if we are
+                // moving to the left, we want the left side to move faster.
+                if (initialState < targetState) {
+                    spring(dampingRatio = 1f, stiffness = 1000f)
+                } else {
+                    spring(dampingRatio = 1f, stiffness = 50f)
+                }
             }
+        ) {
+            tabPositions[it].right
         }
-    ) {
-        tabPositions[it].right
-    }
 
-    val indicatorColor by transition.animateColor {
-        colors[it % colors.size]
-    }
+    val indicatorColor by transition.animateColor { colors[it % colors.size] }
 
     FancyIndicator(
         // Pass the current color to the indicator
         indicatorColor,
-        modifier = Modifier
-            // Fill up the entire TabRow, and place the indicator at the start
-            .fillMaxSize()
-            .wrapContentSize(align = Alignment.BottomStart)
-            // Apply an offset from the start to correctly position the indicator around the tab
-            .offset(x = indicatorStart)
-            // Make the width of the indicator follow the animated width as we move between tabs
-            .width(indicatorEnd - indicatorStart)
+        modifier =
+            Modifier
+                // Fill up the entire TabRow, and place the indicator at the start
+                .fillMaxSize()
+                .wrapContentSize(align = Alignment.BottomStart)
+                // Apply an offset from the start to correctly position the indicator around the tab
+                .offset(x = indicatorStart)
+                // Make the width of the indicator follow the animated width as we move between tabs
+                .width(indicatorEnd - indicatorStart)
     )
 }
diff --git a/compose/material/material/samples/src/main/java/androidx/compose/material/samples/TextFieldSamples.kt b/compose/material/material/samples/src/main/java/androidx/compose/material/samples/TextFieldSamples.kt
index f94d0ef..b3fc1cb 100644
--- a/compose/material/material/samples/src/main/java/androidx/compose/material/samples/TextFieldSamples.kt
+++ b/compose/material/material/samples/src/main/java/androidx/compose/material/samples/TextFieldSamples.kt
@@ -80,11 +80,7 @@
 fun SimpleOutlinedTextFieldSample() {
     var text by rememberSaveable { mutableStateOf("") }
 
-    OutlinedTextField(
-        value = text,
-        onValueChange = { text = it },
-        label = { Text("Label") }
-    )
+    OutlinedTextField(value = text, onValueChange = { text = it }, label = { Text("Label") })
 }
 
 @Sampled
@@ -134,10 +130,11 @@
         label = { Text(if (isError) "Email*" else "Email") },
         isError = isError,
         keyboardActions = KeyboardActions { validate(text) },
-        modifier = Modifier.semantics {
-            // Provide localized description of the error
-            if (isError) error("Email format is invalid.")
-        }
+        modifier =
+            Modifier.semantics {
+                // Provide localized description of the error
+                if (isError) error("Email format is invalid.")
+            }
     )
 }
 
@@ -147,11 +144,7 @@
     var text by rememberSaveable { mutableStateOf("") }
 
     Column {
-        TextField(
-            value = text,
-            onValueChange = { text = it },
-            label = { Text("Label") }
-        )
+        TextField(value = text, onValueChange = { text = it }, label = { Text("Label") })
         Text(
             text = "Helper message",
             color = MaterialTheme.colors.onSurface.copy(alpha = ContentAlpha.medium),
@@ -172,7 +165,7 @@
         singleLine = true,
         label = { Text("Enter password") },
         visualTransformation =
-        if (passwordHidden) PasswordVisualTransformation() else VisualTransformation.None,
+            if (passwordHidden) PasswordVisualTransformation() else VisualTransformation.None,
         keyboardOptions = KeyboardOptions(keyboardType = KeyboardType.Password),
         trailingIcon = {
             IconButton(onClick = { passwordHidden = !passwordHidden }) {
@@ -186,37 +179,39 @@
     )
 }
 
-/** We copy the implementation of Visibility and VisibilityOff icons to showcase them in the
- * password text field sample but to avoid adding material-icons-extended library as a dependency
- * to the samples not to increase the build time
+/**
+ * We copy the implementation of Visibility and VisibilityOff icons to showcase them in the password
+ * text field sample but to avoid adding material-icons-extended library as a dependency to the
+ * samples not to increase the build time
  */
 private val Icons.Filled.Visibility: ImageVector
     get() {
         if (_visibility != null) {
             return _visibility!!
         }
-        _visibility = materialIcon(name = "Filled.Visibility") {
-            materialPath {
-                moveTo(12.0f, 4.5f)
-                curveTo(7.0f, 4.5f, 2.73f, 7.61f, 1.0f, 12.0f)
-                curveToRelative(1.73f, 4.39f, 6.0f, 7.5f, 11.0f, 7.5f)
-                reflectiveCurveToRelative(9.27f, -3.11f, 11.0f, -7.5f)
-                curveToRelative(-1.73f, -4.39f, -6.0f, -7.5f, -11.0f, -7.5f)
-                close()
-                moveTo(12.0f, 17.0f)
-                curveToRelative(-2.76f, 0.0f, -5.0f, -2.24f, -5.0f, -5.0f)
-                reflectiveCurveToRelative(2.24f, -5.0f, 5.0f, -5.0f)
-                reflectiveCurveToRelative(5.0f, 2.24f, 5.0f, 5.0f)
-                reflectiveCurveToRelative(-2.24f, 5.0f, -5.0f, 5.0f)
-                close()
-                moveTo(12.0f, 9.0f)
-                curveToRelative(-1.66f, 0.0f, -3.0f, 1.34f, -3.0f, 3.0f)
-                reflectiveCurveToRelative(1.34f, 3.0f, 3.0f, 3.0f)
-                reflectiveCurveToRelative(3.0f, -1.34f, 3.0f, -3.0f)
-                reflectiveCurveToRelative(-1.34f, -3.0f, -3.0f, -3.0f)
-                close()
+        _visibility =
+            materialIcon(name = "Filled.Visibility") {
+                materialPath {
+                    moveTo(12.0f, 4.5f)
+                    curveTo(7.0f, 4.5f, 2.73f, 7.61f, 1.0f, 12.0f)
+                    curveToRelative(1.73f, 4.39f, 6.0f, 7.5f, 11.0f, 7.5f)
+                    reflectiveCurveToRelative(9.27f, -3.11f, 11.0f, -7.5f)
+                    curveToRelative(-1.73f, -4.39f, -6.0f, -7.5f, -11.0f, -7.5f)
+                    close()
+                    moveTo(12.0f, 17.0f)
+                    curveToRelative(-2.76f, 0.0f, -5.0f, -2.24f, -5.0f, -5.0f)
+                    reflectiveCurveToRelative(2.24f, -5.0f, 5.0f, -5.0f)
+                    reflectiveCurveToRelative(5.0f, 2.24f, 5.0f, 5.0f)
+                    reflectiveCurveToRelative(-2.24f, 5.0f, -5.0f, 5.0f)
+                    close()
+                    moveTo(12.0f, 9.0f)
+                    curveToRelative(-1.66f, 0.0f, -3.0f, 1.34f, -3.0f, 3.0f)
+                    reflectiveCurveToRelative(1.34f, 3.0f, 3.0f, 3.0f)
+                    reflectiveCurveToRelative(3.0f, -1.34f, 3.0f, -3.0f)
+                    reflectiveCurveToRelative(-1.34f, -3.0f, -3.0f, -3.0f)
+                    close()
+                }
             }
-        }
         return _visibility!!
     }
 private var _visibility: ImageVector? = null
@@ -226,48 +221,49 @@
         if (_visibilityOff != null) {
             return _visibilityOff!!
         }
-        _visibilityOff = materialIcon(name = "Filled.VisibilityOff") {
-            materialPath {
-                moveTo(12.0f, 7.0f)
-                curveToRelative(2.76f, 0.0f, 5.0f, 2.24f, 5.0f, 5.0f)
-                curveToRelative(0.0f, 0.65f, -0.13f, 1.26f, -0.36f, 1.83f)
-                lineToRelative(2.92f, 2.92f)
-                curveToRelative(1.51f, -1.26f, 2.7f, -2.89f, 3.43f, -4.75f)
-                curveToRelative(-1.73f, -4.39f, -6.0f, -7.5f, -11.0f, -7.5f)
-                curveToRelative(-1.4f, 0.0f, -2.74f, 0.25f, -3.98f, 0.7f)
-                lineToRelative(2.16f, 2.16f)
-                curveTo(10.74f, 7.13f, 11.35f, 7.0f, 12.0f, 7.0f)
-                close()
-                moveTo(2.0f, 4.27f)
-                lineToRelative(2.28f, 2.28f)
-                lineToRelative(0.46f, 0.46f)
-                curveTo(3.08f, 8.3f, 1.78f, 10.02f, 1.0f, 12.0f)
-                curveToRelative(1.73f, 4.39f, 6.0f, 7.5f, 11.0f, 7.5f)
-                curveToRelative(1.55f, 0.0f, 3.03f, -0.3f, 4.38f, -0.84f)
-                lineToRelative(0.42f, 0.42f)
-                lineTo(19.73f, 22.0f)
-                lineTo(21.0f, 20.73f)
-                lineTo(3.27f, 3.0f)
-                lineTo(2.0f, 4.27f)
-                close()
-                moveTo(7.53f, 9.8f)
-                lineToRelative(1.55f, 1.55f)
-                curveToRelative(-0.05f, 0.21f, -0.08f, 0.43f, -0.08f, 0.65f)
-                curveToRelative(0.0f, 1.66f, 1.34f, 3.0f, 3.0f, 3.0f)
-                curveToRelative(0.22f, 0.0f, 0.44f, -0.03f, 0.65f, -0.08f)
-                lineToRelative(1.55f, 1.55f)
-                curveToRelative(-0.67f, 0.33f, -1.41f, 0.53f, -2.2f, 0.53f)
-                curveToRelative(-2.76f, 0.0f, -5.0f, -2.24f, -5.0f, -5.0f)
-                curveToRelative(0.0f, -0.79f, 0.2f, -1.53f, 0.53f, -2.2f)
-                close()
-                moveTo(11.84f, 9.02f)
-                lineToRelative(3.15f, 3.15f)
-                lineToRelative(0.02f, -0.16f)
-                curveToRelative(0.0f, -1.66f, -1.34f, -3.0f, -3.0f, -3.0f)
-                lineToRelative(-0.17f, 0.01f)
-                close()
+        _visibilityOff =
+            materialIcon(name = "Filled.VisibilityOff") {
+                materialPath {
+                    moveTo(12.0f, 7.0f)
+                    curveToRelative(2.76f, 0.0f, 5.0f, 2.24f, 5.0f, 5.0f)
+                    curveToRelative(0.0f, 0.65f, -0.13f, 1.26f, -0.36f, 1.83f)
+                    lineToRelative(2.92f, 2.92f)
+                    curveToRelative(1.51f, -1.26f, 2.7f, -2.89f, 3.43f, -4.75f)
+                    curveToRelative(-1.73f, -4.39f, -6.0f, -7.5f, -11.0f, -7.5f)
+                    curveToRelative(-1.4f, 0.0f, -2.74f, 0.25f, -3.98f, 0.7f)
+                    lineToRelative(2.16f, 2.16f)
+                    curveTo(10.74f, 7.13f, 11.35f, 7.0f, 12.0f, 7.0f)
+                    close()
+                    moveTo(2.0f, 4.27f)
+                    lineToRelative(2.28f, 2.28f)
+                    lineToRelative(0.46f, 0.46f)
+                    curveTo(3.08f, 8.3f, 1.78f, 10.02f, 1.0f, 12.0f)
+                    curveToRelative(1.73f, 4.39f, 6.0f, 7.5f, 11.0f, 7.5f)
+                    curveToRelative(1.55f, 0.0f, 3.03f, -0.3f, 4.38f, -0.84f)
+                    lineToRelative(0.42f, 0.42f)
+                    lineTo(19.73f, 22.0f)
+                    lineTo(21.0f, 20.73f)
+                    lineTo(3.27f, 3.0f)
+                    lineTo(2.0f, 4.27f)
+                    close()
+                    moveTo(7.53f, 9.8f)
+                    lineToRelative(1.55f, 1.55f)
+                    curveToRelative(-0.05f, 0.21f, -0.08f, 0.43f, -0.08f, 0.65f)
+                    curveToRelative(0.0f, 1.66f, 1.34f, 3.0f, 3.0f, 3.0f)
+                    curveToRelative(0.22f, 0.0f, 0.44f, -0.03f, 0.65f, -0.08f)
+                    lineToRelative(1.55f, 1.55f)
+                    curveToRelative(-0.67f, 0.33f, -1.41f, 0.53f, -2.2f, 0.53f)
+                    curveToRelative(-2.76f, 0.0f, -5.0f, -2.24f, -5.0f, -5.0f)
+                    curveToRelative(0.0f, -0.79f, 0.2f, -1.53f, 0.53f, -2.2f)
+                    close()
+                    moveTo(11.84f, 9.02f)
+                    lineToRelative(3.15f, 3.15f)
+                    lineToRelative(0.02f, -0.16f)
+                    curveToRelative(0.0f, -1.66f, -1.34f, -3.0f, -3.0f, -3.0f)
+                    lineToRelative(-0.17f, 0.01f)
+                    close()
+                }
             }
-        }
         return _visibilityOff!!
     }
 private var _visibilityOff: ImageVector? = null
@@ -275,29 +271,23 @@
 @Sampled
 @Composable
 fun TextFieldSample() {
-    var text by rememberSaveable(stateSaver = TextFieldValue.Saver) {
-        mutableStateOf(TextFieldValue("example", TextRange(0, 7)))
-    }
+    var text by
+        rememberSaveable(stateSaver = TextFieldValue.Saver) {
+            mutableStateOf(TextFieldValue("example", TextRange(0, 7)))
+        }
 
-    TextField(
-        value = text,
-        onValueChange = { text = it },
-        label = { Text("Label") }
-    )
+    TextField(value = text, onValueChange = { text = it }, label = { Text("Label") })
 }
 
 @Sampled
 @Composable
 fun OutlinedTextFieldSample() {
-    var text by rememberSaveable(stateSaver = TextFieldValue.Saver) {
-        mutableStateOf(TextFieldValue("example", TextRange(0, 7)))
-    }
+    var text by
+        rememberSaveable(stateSaver = TextFieldValue.Saver) {
+            mutableStateOf(TextFieldValue("example", TextRange(0, 7)))
+        }
 
-    OutlinedTextField(
-        value = text,
-        onValueChange = { text = it },
-        label = { Text("Label") }
-    )
+    OutlinedTextField(value = text, onValueChange = { text = it }, label = { Text("Label") })
 }
 
 @OptIn(ExperimentalComposeUiApi::class)
@@ -311,12 +301,13 @@
         onValueChange = { text = it },
         label = { Text("Label") },
         keyboardOptions = KeyboardOptions(imeAction = ImeAction.Done),
-        keyboardActions = KeyboardActions(
-            onDone = {
-                keyboardController?.hide()
-                // do something here
-            }
-        )
+        keyboardActions =
+            KeyboardActions(
+                onDone = {
+                    keyboardController?.hide()
+                    // do something here
+                }
+            )
     )
 }
 
@@ -324,8 +315,7 @@
 fun TextArea() {
     var text by rememberSaveable {
         mutableStateOf(
-            "This is a very long input that extends beyond " +
-                "the height of the text area."
+            "This is a very long input that extends beyond " + "the height of the text area."
         )
     }
     TextField(
@@ -357,17 +347,18 @@
         BasicTextField(
             value = value,
             onValueChange = onValueChange,
-            modifier = modifier
-                .background(
-                    color = colors.backgroundColor(enabled).value,
-                    shape = TextFieldDefaults.TextFieldShape
-                )
-                .indicatorLine(
-                    enabled = enabled,
-                    isError = false,
-                    interactionSource = interactionSource,
-                    colors = colors
-                ),
+            modifier =
+                modifier
+                    .background(
+                        color = colors.backgroundColor(enabled).value,
+                        shape = TextFieldDefaults.TextFieldShape
+                    )
+                    .indicatorLine(
+                        enabled = enabled,
+                        isError = false,
+                        interactionSource = interactionSource,
+                        colors = colors
+                    ),
             visualTransformation = passwordTransformation,
             // internal implementation of the BasicTextField will dispatch focus events
             interactionSource = interactionSource,
@@ -384,9 +375,8 @@
                 // for text field styling
                 interactionSource = interactionSource,
                 // keep vertical paddings but change the horizontal
-                contentPadding = TextFieldDefaults.textFieldWithoutLabelPadding(
-                    start = 8.dp, end = 8.dp
-                )
+                contentPadding =
+                    TextFieldDefaults.textFieldWithoutLabelPadding(start = 8.dp, end = 8.dp)
             )
         }
     }
@@ -408,10 +398,11 @@
         val enabled = true
         val singleLine = true
 
-        val colors = TextFieldDefaults.outlinedTextFieldColors(
-            unfocusedBorderColor = Color.LightGray,
-            focusedBorderColor = Color.DarkGray
-        )
+        val colors =
+            TextFieldDefaults.outlinedTextFieldColors(
+                unfocusedBorderColor = Color.LightGray,
+                focusedBorderColor = Color.DarkGray
+            )
         BasicTextField(
             value = value,
             onValueChange = onValueChange,
@@ -431,9 +422,8 @@
                 // for text field styling
                 interactionSource = interactionSource,
                 // keep vertical paddings but change the horizontal
-                contentPadding = TextFieldDefaults.textFieldWithoutLabelPadding(
-                    start = 8.dp, end = 8.dp
-                ),
+                contentPadding =
+                    TextFieldDefaults.textFieldWithoutLabelPadding(start = 8.dp, end = 8.dp),
                 // update border thickness and shape
                 border = {
                     TextFieldDefaults.BorderBox(
diff --git a/compose/material/material/samples/src/main/java/androidx/compose/material/samples/TextSamples.kt b/compose/material/material/samples/src/main/java/androidx/compose/material/samples/TextSamples.kt
index 6ed29c7..23919b4 100644
--- a/compose/material/material/samples/src/main/java/androidx/compose/material/samples/TextSamples.kt
+++ b/compose/material/material/samples/src/main/java/androidx/compose/material/samples/TextSamples.kt
@@ -37,9 +37,7 @@
 
     val annotatedString = buildAnnotatedString {
         append("Build better apps faster with ")
-        withLink(
-            LinkAnnotation.Url(url = url, styles = TextLinkStyles(style = linkStyle))
-        ) {
+        withLink(LinkAnnotation.Url(url = url, styles = TextLinkStyles(style = linkStyle))) {
             append("Jetpack Compose")
         }
     }
diff --git a/compose/material/material/samples/src/main/java/androidx/compose/material/samples/ThemeSamples.kt b/compose/material/material/samples/src/main/java/androidx/compose/material/samples/ThemeSamples.kt
index b020fdc..5575f21 100644
--- a/compose/material/material/samples/src/main/java/androidx/compose/material/samples/ThemeSamples.kt
+++ b/compose/material/material/samples/src/main/java/androidx/compose/material/samples/ThemeSamples.kt
@@ -38,26 +38,17 @@
 @Sampled
 @Composable
 fun MaterialThemeSample() {
-    val lightColors = lightColors(
-        primary = Color(0xFF1EB980)
-    )
+    val lightColors = lightColors(primary = Color(0xFF1EB980))
 
-    val darkColors = darkColors(
-        primary = Color(0xFF66ffc7)
-    )
+    val darkColors = darkColors(primary = Color(0xFF66ffc7))
 
     val colors = if (isSystemInDarkTheme()) darkColors else lightColors
 
-    val typography = Typography(
-        h1 = TextStyle(
-            fontWeight = FontWeight.W100,
-            fontSize = 96.sp
-        ),
-        button = TextStyle(
-            fontWeight = FontWeight.W600,
-            fontSize = 14.sp
+    val typography =
+        Typography(
+            h1 = TextStyle(fontWeight = FontWeight.W100, fontSize = 96.sp),
+            button = TextStyle(fontWeight = FontWeight.W600, fontSize = 14.sp)
         )
-    )
 
     MaterialTheme(colors = colors, typography = typography) {
         val currentTheme = if (MaterialTheme.colors.isLight) "light" else "dark"
diff --git a/compose/material/material/src/androidInstrumentedTest/kotlin/androidx/compose/material/AlertDialogScreenshotTest.kt b/compose/material/material/src/androidInstrumentedTest/kotlin/androidx/compose/material/AlertDialogScreenshotTest.kt
index d88aff2..497a4927 100644
--- a/compose/material/material/src/androidInstrumentedTest/kotlin/androidx/compose/material/AlertDialogScreenshotTest.kt
+++ b/compose/material/material/src/androidInstrumentedTest/kotlin/androidx/compose/material/AlertDialogScreenshotTest.kt
@@ -42,11 +42,9 @@
 @OptIn(ExperimentalComposeUiApi::class)
 class AlertDialogScreenshotTest {
 
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
-    @get:Rule
-    val screenshotRule = AndroidXScreenshotTestRule(GOLDEN_MATERIAL)
+    @get:Rule val screenshotRule = AndroidXScreenshotTestRule(GOLDEN_MATERIAL)
 
     @Test
     fun sideBySideButtons() {
@@ -55,21 +53,14 @@
                 onDismissRequest = {},
                 title = { Text("Title") },
                 text = { Text("Some content") },
-                confirmButton = {
-                    TextButton(onClick = {}) {
-                        Text("Confirm")
-                    }
-                },
-                dismissButton = {
-                    TextButton(onClick = {}) {
-                        Text("Dismiss")
-                    }
-                },
+                confirmButton = { TextButton(onClick = {}) { Text("Confirm") } },
+                dismissButton = { TextButton(onClick = {}) { Text("Dismiss") } },
                 properties = DialogProperties(usePlatformDefaultWidth = true)
             )
         }
 
-        rule.onNode(isDialog())
+        rule
+            .onNode(isDialog())
             .captureToImage()
             .assertAgainstGolden(screenshotRule, "dialog_sideBySideButtons")
     }
@@ -81,21 +72,14 @@
                 onDismissRequest = {},
                 title = { Text("Title") },
                 text = { Text("Some content") },
-                confirmButton = {
-                    TextButton(onClick = {}) {
-                        Text("Very long confirm button")
-                    }
-                },
-                dismissButton = {
-                    TextButton(onClick = {}) {
-                        Text("Very long dismiss button")
-                    }
-                },
+                confirmButton = { TextButton(onClick = {}) { Text("Very long confirm button") } },
+                dismissButton = { TextButton(onClick = {}) { Text("Very long dismiss button") } },
                 properties = DialogProperties(usePlatformDefaultWidth = true)
             )
         }
 
-        rule.onNode(isDialog())
+        rule
+            .onNode(isDialog())
             .captureToImage()
             .assertAgainstGolden(screenshotRule, "dialog_stackedButtons")
     }
@@ -106,16 +90,13 @@
             AlertDialog(
                 onDismissRequest = {},
                 title = { Text("Title") },
-                confirmButton = {
-                    TextButton(onClick = {}) {
-                        Text("Ok")
-                    }
-                },
+                confirmButton = { TextButton(onClick = {}) { Text("Ok") } },
                 properties = DialogProperties(usePlatformDefaultWidth = true)
             )
         }
 
-        rule.onNode(isDialog())
+        rule
+            .onNode(isDialog())
             .captureToImage()
             .assertAgainstGolden(screenshotRule, "dialog_onlyTitle")
     }
@@ -126,16 +107,13 @@
             AlertDialog(
                 onDismissRequest = {},
                 text = { Text("Text") },
-                confirmButton = {
-                    TextButton(onClick = {}) {
-                        Text("Ok")
-                    }
-                },
+                confirmButton = { TextButton(onClick = {}) { Text("Ok") } },
                 properties = DialogProperties(usePlatformDefaultWidth = true)
             )
         }
 
-        rule.onNode(isDialog())
+        rule
+            .onNode(isDialog())
             .captureToImage()
             .assertAgainstGolden(screenshotRule, "dialog_onlyText")
     }
@@ -145,16 +123,13 @@
         rule.setContent {
             AlertDialog(
                 onDismissRequest = {},
-                confirmButton = {
-                    TextButton(onClick = {}) {
-                        Text("Ok")
-                    }
-                },
+                confirmButton = { TextButton(onClick = {}) { Text("Ok") } },
                 properties = DialogProperties(usePlatformDefaultWidth = true)
             )
         }
 
-        rule.onNode(isDialog())
+        rule
+            .onNode(isDialog())
             .captureToImage()
             .assertAgainstGolden(screenshotRule, "dialog_noTitleOrText")
     }
@@ -170,16 +145,13 @@
                     )
                 },
                 text = { Text("Text") },
-                confirmButton = {
-                    TextButton(onClick = {}) {
-                        Text("Ok")
-                    }
-                },
+                confirmButton = { TextButton(onClick = {}) { Text("Ok") } },
                 properties = DialogProperties(usePlatformDefaultWidth = true)
             )
         }
 
-        rule.onNode(isDialog())
+        rule
+            .onNode(isDialog())
             .captureToImage()
             .assertAgainstGolden(screenshotRule, "dialog_titleWithoutTextBaseline")
     }
@@ -196,16 +168,13 @@
                             .background(MaterialTheme.colors.primary)
                     )
                 },
-                confirmButton = {
-                    TextButton(onClick = {}) {
-                        Text("Ok")
-                    }
-                },
+                confirmButton = { TextButton(onClick = {}) { Text("Ok") } },
                 properties = DialogProperties(usePlatformDefaultWidth = true)
             )
         }
 
-        rule.onNode(isDialog())
+        rule
+            .onNode(isDialog())
             .captureToImage()
             .assertAgainstGolden(screenshotRule, "dialog_textWithoutTextBaseline")
     }
@@ -217,8 +186,7 @@
                 onDismissRequest = {},
                 title = {
                     Box(
-                        Modifier.requiredSize(75.dp, 25.dp)
-                            .background(MaterialTheme.colors.primary)
+                        Modifier.requiredSize(75.dp, 25.dp).background(MaterialTheme.colors.primary)
                     )
                 },
                 text = {
@@ -227,16 +195,13 @@
                             .background(MaterialTheme.colors.primary)
                     )
                 },
-                confirmButton = {
-                    TextButton(onClick = {}) {
-                        Text("Ok")
-                    }
-                },
+                confirmButton = { TextButton(onClick = {}) { Text("Ok") } },
                 properties = DialogProperties(usePlatformDefaultWidth = true)
             )
         }
 
-        rule.onNode(isDialog())
+        rule
+            .onNode(isDialog())
             .captureToImage()
             .assertAgainstGolden(screenshotRule, "dialog_titleAndTextWithoutTextBaselines")
     }
diff --git a/compose/material/material/src/androidInstrumentedTest/kotlin/androidx/compose/material/AlertDialogTest.kt b/compose/material/material/src/androidInstrumentedTest/kotlin/androidx/compose/material/AlertDialogTest.kt
index 147f199..0005f50 100644
--- a/compose/material/material/src/androidInstrumentedTest/kotlin/androidx/compose/material/AlertDialogTest.kt
+++ b/compose/material/material/src/androidInstrumentedTest/kotlin/androidx/compose/material/AlertDialogTest.kt
@@ -53,8 +53,7 @@
 @SdkSuppress(minSdkVersion = Build.VERSION_CODES.P) // Should be O: b/163023027
 class AlertDialogTest {
 
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
     @FlakyTest(bugId = 170333139)
     @Test
@@ -75,7 +74,8 @@
         }
 
         // Assert background
-        rule.onNode(isDialog())
+        rule
+            .onNode(isDialog())
             .captureToImage()
             .assertContainsColor(Color.Yellow) // Background
             .assertContainsColor(Color.Blue) // Modifier border
@@ -87,9 +87,7 @@
         }
     }
 
-    /**
-     * Ensure that AlertDialogs don't press up against the edges of the screen.
-     */
+    /** Ensure that AlertDialogs don't press up against the edges of the screen. */
     @Test
     fun alertDialogDoesNotConsumeFullScreenWidth() {
         val dialogWidthCh = Channel<Int>(Channel.CONFLATED)
@@ -101,8 +99,8 @@
             with(density) { screenWidth = resScreenWidth.dp.roundToPx() }
 
             AlertDialog(
-                modifier = Modifier.onSizeChanged { dialogWidthCh.trySend(it.width) }
-                    .fillMaxWidth(),
+                modifier =
+                    Modifier.onSizeChanged { dialogWidthCh.trySend(it.width) }.fillMaxWidth(),
                 onDismissRequest = {},
                 title = { Text(text = "Title") },
                 text = {
@@ -132,9 +130,7 @@
                 confirmButton = {
                     TextButton(
                         onClick = { /* doSomething() */ },
-                        Modifier
-                            .testTag(ConfirmButtonTestTag)
-                            .semantics(mergeDescendants = true) {}
+                        Modifier.testTag(ConfirmButtonTestTag).semantics(mergeDescendants = true) {}
                     ) {
                         Text("Confirm with a long text")
                     }
@@ -142,9 +138,7 @@
                 dismissButton = {
                     TextButton(
                         onClick = { /* doSomething() */ },
-                        Modifier
-                            .testTag(DismissButtonTestTag)
-                            .semantics(mergeDescendants = true) {}
+                        Modifier.testTag(DismissButtonTestTag).semantics(mergeDescendants = true) {}
                     ) {
                         Text("Dismiss with a long text")
                     }
diff --git a/compose/material/material/src/androidInstrumentedTest/kotlin/androidx/compose/material/AppBarTest.kt b/compose/material/material/src/androidInstrumentedTest/kotlin/androidx/compose/material/AppBarTest.kt
index 7eb23a7..45c64bc 100644
--- a/compose/material/material/src/androidInstrumentedTest/kotlin/androidx/compose/material/AppBarTest.kt
+++ b/compose/material/material/src/androidInstrumentedTest/kotlin/androidx/compose/material/AppBarTest.kt
@@ -49,17 +49,14 @@
 @RunWith(AndroidJUnit4::class)
 class AppBarTest {
 
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
     private val appBarHeight = 56.dp
 
     @Test
     fun topAppBar_expandsToScreen() {
         rule
-            .setMaterialContentForSizeAssertions {
-                TopAppBar(title = { Text("Title") })
-            }
+            .setMaterialContentForSizeAssertions { TopAppBar(title = { Text("Title") }) }
             .assertHeightIsEqualTo(appBarHeight)
             .assertWidthIsEqualTo(rule.rootWidth())
     }
@@ -67,9 +64,7 @@
     @Test
     fun topAppBar_withTitle() {
         val title = "Title"
-        rule.setMaterialContent {
-            TopAppBar(title = { Text(title) })
-        }
+        rule.setMaterialContent { TopAppBar(title = { Text(title) }) }
         rule.onNodeWithText(title).assertIsDisplayed()
     }
 
@@ -78,15 +73,9 @@
         rule.setMaterialContent {
             Box(Modifier.testTag("bar")) {
                 TopAppBar(
-                    navigationIcon = {
-                        FakeIcon(Modifier.testTag("navigationIcon"))
-                    },
-                    title = {
-                        Text("title", Modifier.testTag("title"))
-                    },
-                    actions = {
-                        FakeIcon(Modifier.testTag("action"))
-                    }
+                    navigationIcon = { FakeIcon(Modifier.testTag("navigationIcon")) },
+                    title = { Text("title", Modifier.testTag("title")) },
+                    actions = { FakeIcon(Modifier.testTag("action")) }
                 )
             }
         }
@@ -95,7 +84,8 @@
         val titleBounds = rule.onNodeWithTag("title").getUnclippedBoundsInRoot()
         val appBarBottomEdgeY = appBarBounds.top + appBarBounds.height
 
-        rule.onNodeWithTag("navigationIcon")
+        rule
+            .onNodeWithTag("navigationIcon")
             // Navigation icon should be 4.dp from the start
             .assertLeftPositionInRootIsEqualTo(AppBarStartAndEndPadding)
             // Navigation icon should be 4.dp from the bottom
@@ -103,14 +93,16 @@
                 appBarBottomEdgeY - AppBarStartAndEndPadding - FakeIconSize
             )
 
-        rule.onNodeWithTag("title")
+        rule
+            .onNodeWithTag("title")
             // Title should be 72.dp from the start
             // 4.dp padding for the whole app bar + 68.dp inset
             .assertLeftPositionInRootIsEqualTo(4.dp + 68.dp)
             // Title should be vertically centered
             .assertTopPositionInRootIsEqualTo((appBarBounds.height - titleBounds.height) / 2)
 
-        rule.onNodeWithTag("action")
+        rule
+            .onNodeWithTag("action")
             // Action should be placed at the end
             .assertLeftPositionInRootIsEqualTo(expectedActionPosition(appBarBounds.width))
             // Action should be 4.dp from the bottom
@@ -126,15 +118,9 @@
             Box(Modifier.testTag("bar")) {
                 TopAppBar(
                     windowInsets = WindowInsets(fakeInset, fakeInset, fakeInset, fakeInset),
-                    navigationIcon = {
-                        FakeIcon(Modifier.testTag("navigationIcon"))
-                    },
-                    title = {
-                        Text("title", Modifier.testTag("title"))
-                    },
-                    actions = {
-                        FakeIcon(Modifier.testTag("action"))
-                    }
+                    navigationIcon = { FakeIcon(Modifier.testTag("navigationIcon")) },
+                    title = { Text("title", Modifier.testTag("title")) },
+                    actions = { FakeIcon(Modifier.testTag("action")) }
                 )
             }
         }
@@ -143,7 +129,8 @@
         val titleBounds = rule.onNodeWithTag("title").getUnclippedBoundsInRoot()
         val appBarBottomEdgeY = appBarBounds.top + appBarBounds.height
 
-        rule.onNodeWithTag("navigationIcon")
+        rule
+            .onNodeWithTag("navigationIcon")
             // Navigation icon should be 4.dp from the start
             .assertLeftPositionInRootIsEqualTo(AppBarStartAndEndPadding + fakeInset)
             // Navigation icon should be 4.dp from the bottom
@@ -151,7 +138,8 @@
                 appBarBottomEdgeY - AppBarStartAndEndPadding - FakeIconSize - fakeInset
             )
 
-        rule.onNodeWithTag("title")
+        rule
+            .onNodeWithTag("title")
             // Title should be 72.dp from the start
             // 4.dp padding for the whole app bar + 68.dp inset
             .assertLeftPositionInRootIsEqualTo(4.dp + 68.dp + fakeInset)
@@ -161,7 +149,8 @@
                 (appBarBounds.height - titleBounds.height) / 2
             )
 
-        rule.onNodeWithTag("action")
+        rule
+            .onNodeWithTag("action")
             // Action should be placed at the end
             .assertLeftPositionInRootIsEqualTo(
                 expectedActionPosition(appBarBounds.width) - fakeInset
@@ -177,24 +166,22 @@
         rule.setMaterialContent {
             Box(Modifier.testTag("bar")) {
                 TopAppBar(
-                    title = {
-                        Text("title", Modifier.testTag("title"))
-                    },
-                    actions = {
-                        FakeIcon(Modifier.testTag("action"))
-                    }
+                    title = { Text("title", Modifier.testTag("title")) },
+                    actions = { FakeIcon(Modifier.testTag("action")) }
                 )
             }
         }
 
         val appBarBounds = rule.onNodeWithTag("bar").getUnclippedBoundsInRoot()
 
-        rule.onNodeWithTag("title")
+        rule
+            .onNodeWithTag("title")
             // Title should now be placed 16.dp from the start, as there is no navigation icon
             // 4.dp padding for the whole app bar + 12.dp inset
             .assertLeftPositionInRootIsEqualTo(4.dp + 12.dp)
 
-        rule.onNodeWithTag("action")
+        rule
+            .onNodeWithTag("action")
             // Action should still be placed at the end
             .assertLeftPositionInRootIsEqualTo(expectedActionPosition(appBarBounds.width))
     }
@@ -268,9 +255,7 @@
     @Test
     fun bottomAppBar_expandsToScreen() {
         rule
-            .setMaterialContentForSizeAssertions {
-                BottomAppBar {}
-            }
+            .setMaterialContentForSizeAssertions { BottomAppBar {} }
             .assertHeightIsEqualTo(appBarHeight)
             .assertWidthIsEqualTo(rule.rootWidth())
     }
@@ -278,15 +263,14 @@
     @Test
     fun bottomAppBar_default_positioning() {
         rule.setMaterialContent {
-            BottomAppBar(Modifier.testTag("bar")) {
-                FakeIcon(Modifier.testTag("icon"))
-            }
+            BottomAppBar(Modifier.testTag("bar")) { FakeIcon(Modifier.testTag("icon")) }
         }
 
         val appBarBounds = rule.onNodeWithTag("bar").getUnclippedBoundsInRoot()
         val appBarBottomEdgeY = appBarBounds.top + appBarBounds.height
 
-        rule.onNodeWithTag("icon")
+        rule
+            .onNodeWithTag("icon")
             // Child icon should be 4.dp from the start
             .assertLeftPositionInRootIsEqualTo(AppBarStartAndEndPadding)
             // Child icon should be 4.dp from the bottom
@@ -310,7 +294,8 @@
         val appBarBounds = rule.onNodeWithTag("bar").getUnclippedBoundsInRoot()
         val appBarBottomEdgeY = appBarBounds.top + appBarBounds.height
 
-        rule.onNodeWithTag("icon")
+        rule
+            .onNodeWithTag("icon")
             // Child icon should be 4.dp from the start
             .assertLeftPositionInRootIsEqualTo(AppBarStartAndEndPadding + fakeInsets)
             // Child icon should be 4.dp from the bottom
@@ -340,11 +325,10 @@
      * A 48.dp box with a red box inside, to simulate an [IconButton] with a real icon inside for
      * testing positions.
      */
-    private val FakeIcon = @Composable { modifier: Modifier ->
-        Box(Modifier.size(48.dp)) {
-            Icon(ColorPainter(Color.Red), null, modifier)
+    private val FakeIcon =
+        @Composable { modifier: Modifier ->
+            Box(Modifier.size(48.dp)) { Icon(ColorPainter(Color.Red), null, modifier) }
         }
-    }
 
     private fun expectedActionPosition(appBarWidth: Dp): Dp =
         appBarWidth - AppBarStartAndEndPadding - FakeIconSize
diff --git a/compose/material/material/src/androidInstrumentedTest/kotlin/androidx/compose/material/BackdropScaffoldTest.kt b/compose/material/material/src/androidInstrumentedTest/kotlin/androidx/compose/material/BackdropScaffoldTest.kt
index 9f300e9..fda7810 100644
--- a/compose/material/material/src/androidInstrumentedTest/kotlin/androidx/compose/material/BackdropScaffoldTest.kt
+++ b/compose/material/material/src/androidInstrumentedTest/kotlin/androidx/compose/material/BackdropScaffoldTest.kt
@@ -69,8 +69,7 @@
 @RunWith(AndroidJUnit4::class)
 class BackdropScaffoldTest {
 
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
     private val peekHeight = 75.dp
     private val headerHeight = 100.dp
@@ -91,15 +90,11 @@
                 headerHeight = headerHeight,
                 appBar = { Box(Modifier.height(peekHeight)) },
                 backLayerContent = { Box(Modifier.height(contentHeight)) },
-                frontLayerContent = { Box(
-                    Modifier
-                        .fillMaxSize()
-                        .testTag(frontLayer)) }
+                frontLayerContent = { Box(Modifier.fillMaxSize().testTag(frontLayer)) }
             )
         }
 
-        rule.onNodeWithTag(frontLayer)
-            .assertTopPositionInRootIsEqualTo(peekHeight)
+        rule.onNodeWithTag(frontLayer).assertTopPositionInRootIsEqualTo(peekHeight)
     }
 
     @Test
@@ -112,22 +107,20 @@
                 headerHeight = headerHeight,
                 appBar = { Box(Modifier.height(peekHeight)) },
                 backLayerContent = { Box(Modifier.height(contentHeight)) },
-                frontLayerContent = { Box(
-                    Modifier
-                        .fillMaxSize()
-                        .testTag(frontLayer)) }
+                frontLayerContent = { Box(Modifier.fillMaxSize().testTag(frontLayer)) }
             )
         }
 
-        rule.onNodeWithTag(frontLayer).onParent()
+        rule
+            .onNodeWithTag(frontLayer)
+            .onParent()
             .assert(SemanticsMatcher.keyNotDefined(SemanticsActions.Expand))
             .assert(SemanticsMatcher.keyIsDefined(SemanticsActions.Collapse))
             .performSemanticsAction(SemanticsActions.Collapse)
 
         advanceClock()
 
-        rule.onNodeWithTag(frontLayer)
-            .assertTopPositionInRootIsEqualTo(peekHeight + contentHeight)
+        rule.onNodeWithTag(frontLayer).assertTopPositionInRootIsEqualTo(peekHeight + contentHeight)
     }
 
     @Test
@@ -139,15 +132,11 @@
                 headerHeight = headerHeight,
                 appBar = { Box(Modifier.height(peekHeight)) },
                 backLayerContent = { Box(Modifier.height(contentHeight)) },
-                frontLayerContent = { Box(
-                    Modifier
-                        .fillMaxSize()
-                        .testTag(frontLayer)) }
+                frontLayerContent = { Box(Modifier.fillMaxSize().testTag(frontLayer)) }
             )
         }
 
-        rule.onNodeWithTag(frontLayer)
-            .assertTopPositionInRootIsEqualTo(peekHeight + contentHeight)
+        rule.onNodeWithTag(frontLayer).assertTopPositionInRootIsEqualTo(peekHeight + contentHeight)
     }
 
     @Test
@@ -160,22 +149,20 @@
                 headerHeight = headerHeight,
                 appBar = { Box(Modifier.height(peekHeight)) },
                 backLayerContent = { Box(Modifier.height(contentHeight)) },
-                frontLayerContent = { Box(
-                    Modifier
-                        .fillMaxSize()
-                        .testTag(frontLayer)) }
+                frontLayerContent = { Box(Modifier.fillMaxSize().testTag(frontLayer)) }
             )
         }
 
-        rule.onNodeWithTag(frontLayer).onParent()
+        rule
+            .onNodeWithTag(frontLayer)
+            .onParent()
             .assert(SemanticsMatcher.keyNotDefined(SemanticsActions.Collapse))
             .assert(SemanticsMatcher.keyIsDefined(SemanticsActions.Expand))
             .performSemanticsAction(SemanticsActions.Expand)
 
         advanceClock()
 
-        rule.onNodeWithTag(frontLayer)
-            .assertTopPositionInRootIsEqualTo(peekHeight)
+        rule.onNodeWithTag(frontLayer).assertTopPositionInRootIsEqualTo(peekHeight)
     }
 
     @Test
@@ -187,14 +174,12 @@
                 headerHeight = headerHeight,
                 appBar = { Box(Modifier.height(peekHeight)) },
                 backLayerContent = { Box(Modifier.fillMaxHeight()) },
-                frontLayerContent = { Box(
-                    Modifier
-                        .fillMaxSize()
-                        .testTag(frontLayer)) }
+                frontLayerContent = { Box(Modifier.fillMaxSize().testTag(frontLayer)) }
             )
         }
 
-        rule.onNodeWithTag(frontLayer)
+        rule
+            .onNodeWithTag(frontLayer)
             .assertTopPositionInRootIsEqualTo(rule.rootHeight() - headerHeight)
     }
 
@@ -208,15 +193,11 @@
                 persistentAppBar = false,
                 appBar = { Box(Modifier.height(peekHeight)) },
                 backLayerContent = { Box(Modifier.height(contentHeight)) },
-                frontLayerContent = { Box(
-                    Modifier
-                        .fillMaxSize()
-                        .testTag(frontLayer)) }
+                frontLayerContent = { Box(Modifier.fillMaxSize().testTag(frontLayer)) }
             )
         }
 
-        rule.onNodeWithTag(frontLayer)
-            .assertTopPositionInRootIsEqualTo(contentHeight)
+        rule.onNodeWithTag(frontLayer).assertTopPositionInRootIsEqualTo(contentHeight)
     }
 
     @Test
@@ -229,54 +210,49 @@
                 stickyFrontLayer = false,
                 appBar = { Box(Modifier.height(peekHeight)) },
                 backLayerContent = { Box(Modifier.height(contentHeight)) },
-                frontLayerContent = { Box(
-                    Modifier
-                        .fillMaxSize()
-                        .testTag(frontLayer)) }
+                frontLayerContent = { Box(Modifier.fillMaxSize().testTag(frontLayer)) }
             )
         }
 
-        rule.onNodeWithTag(frontLayer)
+        rule
+            .onNodeWithTag(frontLayer)
             .assertTopPositionInRootIsEqualTo(rule.rootHeight() - headerHeight)
     }
 
     @Test
     @LargeTest
-    fun backdropScaffold_revealAndConceal_manually(): Unit = runBlocking(AutoTestFrameClock()) {
-        lateinit var scaffoldState: BackdropScaffoldState
-        rule.setContent {
-            scaffoldState = rememberBackdropScaffoldState(Concealed)
-            BackdropScaffold(
-                scaffoldState = scaffoldState,
-                peekHeight = peekHeight,
-                headerHeight = headerHeight,
-                appBar = { Box(Modifier.height(peekHeight)) },
-                backLayerContent = { Box(Modifier.height(contentHeight)) },
-                frontLayerContent = { Box(
-                    Modifier
-                        .fillMaxSize()
-                        .testTag(frontLayer)) }
-            )
+    fun backdropScaffold_revealAndConceal_manually(): Unit =
+        runBlocking(AutoTestFrameClock()) {
+            lateinit var scaffoldState: BackdropScaffoldState
+            rule.setContent {
+                scaffoldState = rememberBackdropScaffoldState(Concealed)
+                BackdropScaffold(
+                    scaffoldState = scaffoldState,
+                    peekHeight = peekHeight,
+                    headerHeight = headerHeight,
+                    appBar = { Box(Modifier.height(peekHeight)) },
+                    backLayerContent = { Box(Modifier.height(contentHeight)) },
+                    frontLayerContent = { Box(Modifier.fillMaxSize().testTag(frontLayer)) }
+                )
+            }
+
+            rule.onNodeWithTag(frontLayer).assertTopPositionInRootIsEqualTo(peekHeight)
+
+            scaffoldState.reveal()
+
+            advanceClock()
+
+            rule
+                .onNodeWithTag(frontLayer)
+                .assertTopPositionInRootIsEqualTo(peekHeight + contentHeight)
+
+            scaffoldState.conceal()
+
+            advanceClock()
+
+            rule.onNodeWithTag(frontLayer).assertTopPositionInRootIsEqualTo(peekHeight)
         }
 
-        rule.onNodeWithTag(frontLayer)
-            .assertTopPositionInRootIsEqualTo(peekHeight)
-
-        scaffoldState.reveal()
-
-        advanceClock()
-
-        rule.onNodeWithTag(frontLayer)
-            .assertTopPositionInRootIsEqualTo(peekHeight + contentHeight)
-
-        scaffoldState.conceal()
-
-        advanceClock()
-
-        rule.onNodeWithTag(frontLayer)
-            .assertTopPositionInRootIsEqualTo(peekHeight)
-    }
-
     @Test
     fun backdropScaffold_revealBySwiping() {
         lateinit var scaffoldState: BackdropScaffoldState
@@ -288,62 +264,42 @@
                 headerHeight = headerHeight,
                 appBar = { Box(Modifier.height(peekHeight)) },
                 backLayerContent = { Box(Modifier.height(contentHeight)) },
-                frontLayerContent = { Box(
-                    Modifier
-                        .fillMaxSize()
-                        .testTag(frontLayer)) }
+                frontLayerContent = { Box(Modifier.fillMaxSize().testTag(frontLayer)) }
             )
         }
 
-        rule.runOnIdle {
-            assertThat(scaffoldState.currentValue).isEqualTo(Concealed)
-        }
+        rule.runOnIdle { assertThat(scaffoldState.currentValue).isEqualTo(Concealed) }
 
-        rule.onNodeWithTag(frontLayer)
-            .performTouchInput { swipeDown() }
+        rule.onNodeWithTag(frontLayer).performTouchInput { swipeDown() }
 
         advanceClock()
 
-        rule.runOnIdle {
-            assertThat(scaffoldState.currentValue).isEqualTo(Revealed)
-        }
+        rule.runOnIdle { assertThat(scaffoldState.currentValue).isEqualTo(Revealed) }
     }
 
     @Test
     fun backdropScaffold_respectsConfirmStateChange() {
         lateinit var scaffoldState: BackdropScaffoldState
         rule.setContent {
-            scaffoldState = rememberBackdropScaffoldState(
-                Concealed,
-                confirmStateChange = {
-                    it != Revealed
-                }
-            )
+            scaffoldState =
+                rememberBackdropScaffoldState(Concealed, confirmStateChange = { it != Revealed })
             BackdropScaffold(
                 scaffoldState = scaffoldState,
                 peekHeight = peekHeight,
                 headerHeight = headerHeight,
                 appBar = { Box(Modifier.height(peekHeight)) },
                 backLayerContent = { Box(Modifier.height(contentHeight)) },
-                frontLayerContent = { Box(
-                    Modifier
-                        .fillMaxSize()
-                        .testTag(frontLayer)) }
+                frontLayerContent = { Box(Modifier.fillMaxSize().testTag(frontLayer)) }
             )
         }
 
-        rule.runOnIdle {
-            assertThat(scaffoldState.currentValue).isEqualTo(Concealed)
-        }
+        rule.runOnIdle { assertThat(scaffoldState.currentValue).isEqualTo(Concealed) }
 
-        rule.onNodeWithTag(frontLayer)
-            .performTouchInput { swipeDown() }
+        rule.onNodeWithTag(frontLayer).performTouchInput { swipeDown() }
 
         advanceClock()
 
-        rule.runOnIdle {
-            assertThat(scaffoldState.currentValue).isEqualTo(Concealed)
-        }
+        rule.runOnIdle { assertThat(scaffoldState.currentValue).isEqualTo(Concealed) }
     }
 
     @Suppress("DEPRECATION")
@@ -351,30 +307,21 @@
     fun backdropScaffold_deprecateScaffoldState_doesNotCrash() {
         lateinit var scaffoldState: BackdropScaffoldState
         rule.setContent {
-            scaffoldState = BackdropScaffoldState(
-                initialValue = Revealed
-            )
+            scaffoldState = BackdropScaffoldState(initialValue = Revealed)
             BackdropScaffold(
                 scaffoldState = scaffoldState,
                 peekHeight = peekHeight,
                 headerHeight = headerHeight,
                 appBar = { Box(Modifier.height(peekHeight)) },
                 backLayerContent = { Box(Modifier.height(contentHeight)) },
-                frontLayerContent = { Box(
-                    Modifier
-                        .fillMaxSize()
-                        .testTag(frontLayer)) }
+                frontLayerContent = { Box(Modifier.fillMaxSize().testTag(frontLayer)) }
             )
         }
 
-        rule.runOnIdle {
-            assertThat(scaffoldState.currentValue).isEqualTo(Revealed)
-        }
+        rule.runOnIdle { assertThat(scaffoldState.currentValue).isEqualTo(Revealed) }
     }
 
-    /**
-     * Tests that the state and offset of [swipeable] are updated when swiping.
-     */
+    /** Tests that the state and offset of [swipeable] are updated when swiping. */
     @Test
     fun backdropScaffold_syncThresholdUpdate() {
         val increasedAnchor = mutableStateOf(false)
@@ -384,30 +331,26 @@
             BackdropScaffold(
                 scaffoldState = scaffoldState!!,
                 frontLayerScrimColor = Color.Red,
-                appBar = { },
+                appBar = {},
                 backLayerContent = {
                     Box(
-                        Modifier
-                            .height(if (increasedAnchor.value) 400.dp else 200.dp)
+                        Modifier.height(if (increasedAnchor.value) 400.dp else 200.dp)
                             .background(Color.Blue)
                     )
                 },
                 frontLayerContent = {
-                    Box(
-                        Modifier
-                            .height(1000.dp)
-                            .testTag(frontLayer)
-                            .background(Color.Yellow))
+                    Box(Modifier.height(1000.dp).testTag(frontLayer).background(Color.Yellow))
                 }
             )
         }
 
-        val revealedOffset = rule.runOnIdle {
-            assertThat(scaffoldState?.currentValue).isEqualTo(Revealed)
-            // state change changes the anchors, causing the recalculation
-            increasedAnchor.value = true
-            scaffoldState?.requireOffset()
-        }
+        val revealedOffset =
+            rule.runOnIdle {
+                assertThat(scaffoldState?.currentValue).isEqualTo(Revealed)
+                // state change changes the anchors, causing the recalculation
+                increasedAnchor.value = true
+                scaffoldState?.requireOffset()
+            }
 
         rule.runOnIdle {
             assertThat(scaffoldState?.requireOffset()).isNotEqualTo(revealedOffset)
@@ -424,19 +367,20 @@
     @Test
     fun backdropScaffold_animatesAsSideEffect() {
         lateinit var scope: CoroutineScope
-        val bottomSheetState = ModalBottomSheetState(
-            initialValue = ModalBottomSheetValue.Hidden,
-            density = rule.density
-        )
+        val bottomSheetState =
+            ModalBottomSheetState(
+                initialValue = ModalBottomSheetValue.Hidden,
+                density = rule.density
+            )
 
         @Composable
         fun BottomSheet(message: String?) {
             Text(
                 text = message ?: "",
-                modifier = Modifier
-                    .fillMaxWidth()
-                    .background(color = MaterialTheme.colors.primary)
-                    .padding(vertical = 50.dp),
+                modifier =
+                    Modifier.fillMaxWidth()
+                        .background(color = MaterialTheme.colors.primary)
+                        .padding(vertical = 50.dp),
                 color = MaterialTheme.colors.onPrimary
             )
         }
@@ -445,9 +389,7 @@
         fun BottomSheetScreen(message: String?) {
             ModalBottomSheetLayout(
                 modifier = Modifier.fillMaxSize(),
-                sheetContent = {
-                    BottomSheet(message = message)
-                },
+                sheetContent = { BottomSheet(message = message) },
                 sheetState = bottomSheetState
             ) {
                 Column(
@@ -485,10 +427,10 @@
         fun BottomSheet(message: String?) {
             Text(
                 text = message ?: "",
-                modifier = Modifier
-                    .fillMaxWidth()
-                    .background(color = MaterialTheme.colors.primary)
-                    .padding(vertical = 50.dp),
+                modifier =
+                    Modifier.fillMaxWidth()
+                        .background(color = MaterialTheme.colors.primary)
+                        .padding(vertical = 50.dp),
                 color = MaterialTheme.colors.onPrimary
             )
         }
@@ -510,9 +452,7 @@
 
             ModalBottomSheetLayout(
                 modifier = Modifier.fillMaxSize(),
-                sheetContent = {
-                    BottomSheet(message = message)
-                },
+                sheetContent = { BottomSheet(message = message) },
                 sheetState = bottomSheetState
             ) {
                 Column(
@@ -527,13 +467,9 @@
 
         val stringState = mutableStateOf<String?>(null)
 
-        rule.setContent {
-            BottomSheetScreen(message = stringState.value)
-        }
+        rule.setContent { BottomSheetScreen(message = stringState.value) }
 
-        rule.runOnIdle {
-            stringState.value = "line 1 \n line2 \n line 3"
-        }
+        rule.runOnIdle { stringState.value = "line 1 \n line2 \n line 3" }
         rule.waitForIdle()
     }
 
@@ -549,25 +485,17 @@
                 frontLayerScrimColor = Color.Red,
                 appBar = { Box(Modifier.height(peekHeight)) },
                 backLayerContent = { Box(Modifier.height(contentHeight)) },
-                frontLayerContent = { Box(
-                    Modifier
-                        .fillMaxSize()
-                        .testTag(frontLayer)) }
+                frontLayerContent = { Box(Modifier.fillMaxSize().testTag(frontLayer)) }
             )
         }
 
-        rule.runOnIdle {
-            assertThat(scaffoldState.currentValue).isEqualTo(Revealed)
-        }
+        rule.runOnIdle { assertThat(scaffoldState.currentValue).isEqualTo(Revealed) }
 
-        rule.onNodeWithTag(frontLayer)
-            .performTouchInput { click() }
+        rule.onNodeWithTag(frontLayer).performTouchInput { click() }
 
         advanceClock()
 
-        rule.runOnIdle {
-            assertThat(scaffoldState.currentValue).isEqualTo(Concealed)
-        }
+        rule.runOnIdle { assertThat(scaffoldState.currentValue).isEqualTo(Concealed) }
     }
 
     @Test
@@ -582,38 +510,26 @@
                 frontLayerScrimColor = Color.Unspecified,
                 appBar = { Box(Modifier.height(peekHeight)) },
                 backLayerContent = { Box(Modifier.height(contentHeight)) },
-                frontLayerContent = { Box(
-                    Modifier
-                        .fillMaxSize()
-                        .testTag(frontLayer)) }
+                frontLayerContent = { Box(Modifier.fillMaxSize().testTag(frontLayer)) }
             )
         }
 
-        rule.runOnIdle {
-            assertThat(scaffoldState.currentValue).isEqualTo(Revealed)
-        }
+        rule.runOnIdle { assertThat(scaffoldState.currentValue).isEqualTo(Revealed) }
 
-        rule.onNodeWithTag(frontLayer)
-            .performTouchInput { click() }
+        rule.onNodeWithTag(frontLayer).performTouchInput { click() }
 
         advanceClock()
 
         // still revealed if the color is unspecified
-        rule.runOnIdle {
-            assertThat(scaffoldState.currentValue).isEqualTo(Revealed)
-        }
+        rule.runOnIdle { assertThat(scaffoldState.currentValue).isEqualTo(Revealed) }
     }
 
     @Test
     fun backdropScaffold_tapOnFrontLayerScrim_respectsVeto() {
         lateinit var scaffoldState: BackdropScaffoldState
         rule.setContent {
-            scaffoldState = rememberBackdropScaffoldState(
-                Revealed,
-                confirmStateChange = {
-                    it != Concealed
-                }
-            )
+            scaffoldState =
+                rememberBackdropScaffoldState(Revealed, confirmStateChange = { it != Concealed })
             BackdropScaffold(
                 scaffoldState = scaffoldState,
                 peekHeight = peekHeight,
@@ -621,25 +537,17 @@
                 frontLayerScrimColor = Color.Red,
                 appBar = { Box(Modifier.height(peekHeight)) },
                 backLayerContent = { Box(Modifier.height(contentHeight)) },
-                frontLayerContent = { Box(
-                    Modifier
-                        .fillMaxSize()
-                        .testTag(frontLayer)) }
+                frontLayerContent = { Box(Modifier.fillMaxSize().testTag(frontLayer)) }
             )
         }
 
-        rule.runOnIdle {
-            assertThat(scaffoldState.currentValue).isEqualTo(Revealed)
-        }
+        rule.runOnIdle { assertThat(scaffoldState.currentValue).isEqualTo(Revealed) }
 
-        rule.onNodeWithTag(frontLayer)
-            .performTouchInput { click() }
+        rule.onNodeWithTag(frontLayer).performTouchInput { click() }
 
         advanceClock()
 
-        rule.runOnIdle {
-            assertThat(scaffoldState.currentValue).isEqualTo(Revealed)
-        }
+        rule.runOnIdle { assertThat(scaffoldState.currentValue).isEqualTo(Revealed) }
     }
 
     @Test
@@ -657,12 +565,9 @@
                 backLayerContent = { Box(Modifier.height(contentHeight)) },
                 frontLayerContent = {
                     Box(
-                        Modifier
-                            .fillMaxSize()
-                            .testTag(frontLayer)
-                            .clickable {
-                                frontLayerClicks += 1
-                            }
+                        Modifier.fillMaxSize().testTag(frontLayer).clickable {
+                            frontLayerClicks += 1
+                        }
                     )
                 }
             )
@@ -673,8 +578,7 @@
             assertThat(scaffoldState.currentValue).isEqualTo(Revealed)
         }
 
-        rule.onNodeWithTag(frontLayer)
-            .performTouchInput { click() }
+        rule.onNodeWithTag(frontLayer).performTouchInput { click() }
 
         advanceClock()
 
@@ -699,12 +603,9 @@
                 backLayerContent = { Box(Modifier.height(contentHeight)) },
                 frontLayerContent = {
                     Box(
-                        Modifier
-                            .fillMaxSize()
-                            .testTag(frontLayer)
-                            .clickable {
-                                frontLayerClicks += 1
-                            }
+                        Modifier.fillMaxSize().testTag(frontLayer).clickable {
+                            frontLayerClicks += 1
+                        }
                     )
                 }
             )
@@ -715,8 +616,7 @@
             assertThat(scaffoldState.currentValue).isEqualTo(Revealed)
         }
 
-        rule.onNodeWithTag(frontLayer)
-            .performTouchInput { click() }
+        rule.onNodeWithTag(frontLayer).performTouchInput { click() }
 
         advanceClock()
 
@@ -734,10 +634,11 @@
         val animationLengthMillis = 192
         val amountOfFramesForAnimation = animationLengthMillis / 16
         rule.setContent {
-            backdropScaffoldState = rememberBackdropScaffoldState(
-                initialValue = Concealed,
-                animationSpec = tween(animationLengthMillis, easing = LinearEasing)
-            )
+            backdropScaffoldState =
+                rememberBackdropScaffoldState(
+                    initialValue = Concealed,
+                    animationSpec = tween(animationLengthMillis, easing = LinearEasing)
+                )
             scope = rememberCoroutineScope()
             BackdropScaffold(
                 scaffoldState = backdropScaffoldState,
@@ -745,32 +646,23 @@
                 headerHeight = headerHeight,
                 appBar = { Box(Modifier.height(peekHeight)) },
                 backLayerContent = { Box(Modifier.height(contentHeight)) },
-                frontLayerContent = {
-                    Box(
-                        Modifier
-                            .fillMaxSize()
-                            .testTag(frontLayer)
-                    )
-                }
+                frontLayerContent = { Box(Modifier.fillMaxSize().testTag(frontLayer)) }
             )
         }
 
         assertThat(backdropScaffoldState.currentValue).isEqualTo(Concealed)
         assertThat(backdropScaffoldState.targetValue).isEqualTo(Concealed)
-        assertThat(backdropScaffoldState.progress(from = Concealed, to = Revealed))
-            .isEqualTo(0f)
+        assertThat(backdropScaffoldState.progress(from = Concealed, to = Revealed)).isEqualTo(0f)
 
         scope.launch { backdropScaffoldState.reveal() }
         rule.mainClock.advanceTimeByFrame() // Start dispatching and running the animation
 
         repeat(amountOfFramesForAnimation) { frame ->
             val frameFraction = (frame / amountOfFramesForAnimation.toFloat())
-            val concealedToRevealedProgress = backdropScaffoldState.progress(
-                from = Concealed, to = Revealed
-            )
-            val revealedToConcealedProgress = backdropScaffoldState.progress(
-                from = Revealed, to = Concealed
-            )
+            val concealedToRevealedProgress =
+                backdropScaffoldState.progress(from = Concealed, to = Revealed)
+            val revealedToConcealedProgress =
+                backdropScaffoldState.progress(from = Revealed, to = Concealed)
             assertThat(concealedToRevealedProgress).isWithin(0.001f).of(frameFraction)
             assertThat(revealedToConcealedProgress).isWithin(0.001f).of(1 - frameFraction)
             rule.mainClock.advanceTimeByFrame()
@@ -785,12 +677,10 @@
 
         repeat(amountOfFramesForAnimation) { frame ->
             val frameFraction = (frame / amountOfFramesForAnimation.toFloat())
-            val concealedToRevealedProgress = backdropScaffoldState.progress(
-                from = Concealed, to = Revealed
-            )
-            val revealedToConcealedProgress = backdropScaffoldState.progress(
-                from = Revealed, to = Concealed
-            )
+            val concealedToRevealedProgress =
+                backdropScaffoldState.progress(from = Concealed, to = Revealed)
+            val revealedToConcealedProgress =
+                backdropScaffoldState.progress(from = Revealed, to = Concealed)
             assertThat(concealedToRevealedProgress).isWithin(0.001f).of(1 - frameFraction)
             assertThat(revealedToConcealedProgress).isWithin(0.001f).of(frameFraction)
             rule.mainClock.advanceTimeByFrame()
diff --git a/compose/material/material/src/androidInstrumentedTest/kotlin/androidx/compose/material/BadgeScreenshotTest.kt b/compose/material/material/src/androidInstrumentedTest/kotlin/androidx/compose/material/BadgeScreenshotTest.kt
index c0eda44..abb9f77 100644
--- a/compose/material/material/src/androidInstrumentedTest/kotlin/androidx/compose/material/BadgeScreenshotTest.kt
+++ b/compose/material/material/src/androidInstrumentedTest/kotlin/androidx/compose/material/BadgeScreenshotTest.kt
@@ -44,11 +44,9 @@
 @SdkSuppress(minSdkVersion = Build.VERSION_CODES.O)
 class BadgeScreenshotTest {
 
-    @get:Rule
-    val composeTestRule = createComposeRule()
+    @get:Rule val composeTestRule = createComposeRule()
 
-    @get:Rule
-    val screenshotRule = AndroidXScreenshotTestRule(GOLDEN_MATERIAL)
+    @get:Rule val screenshotRule = AndroidXScreenshotTestRule(GOLDEN_MATERIAL)
 
     @Test
     fun darkTheme_withContent() {
@@ -58,16 +56,12 @@
                     Modifier.size(56.dp).semantics(mergeDescendants = true) {}.testTag(TestTag),
                     contentAlignment = Alignment.Center
                 ) {
-                    BadgedBox(badge = { Badge { Text("8") } }) {
-                        Icon(Icons.Filled.Favorite, null)
-                    }
+                    BadgedBox(badge = { Badge { Text("8") } }) { Icon(Icons.Filled.Favorite, null) }
                 }
             }
         }
 
-        assertBadgeAgainstGolden(
-            goldenIdentifier = "badge_darkTheme_withContent"
-        )
+        assertBadgeAgainstGolden(goldenIdentifier = "badge_darkTheme_withContent")
     }
 
     @Test
@@ -79,9 +73,7 @@
                 ) {
                     BottomNavigationItem(
                         icon = {
-                            BadgedBox(badge = { Badge() }) {
-                                Icon(Icons.Filled.Favorite, null)
-                            }
+                            BadgedBox(badge = { Badge() }) { Icon(Icons.Filled.Favorite, null) }
                         },
                         selected = true,
                         onClick = {},
@@ -90,9 +82,7 @@
             }
         }
 
-        assertBadgeAgainstGolden(
-            goldenIdentifier = "badge_lightTheme_noContent_bottomNavigation"
-        )
+        assertBadgeAgainstGolden(goldenIdentifier = "badge_lightTheme_noContent_bottomNavigation")
     }
 
     @Test
@@ -105,14 +95,7 @@
                     BottomNavigationItem(
                         icon = {
                             BadgedBox(
-                                badge = {
-                                    Badge {
-                                        Text(
-                                            "8",
-                                            textAlign = TextAlign.Center
-                                        )
-                                    }
-                                }
+                                badge = { Badge { Text("8", textAlign = TextAlign.Center) } }
                             ) {
                                 Icon(Icons.Filled.Favorite, null)
                             }
@@ -139,14 +122,7 @@
                     BottomNavigationItem(
                         icon = {
                             BadgedBox(
-                                badge = {
-                                    Badge {
-                                        Text(
-                                            "99+",
-                                            textAlign = TextAlign.Center
-                                        )
-                                    }
-                                }
+                                badge = { Badge { Text("99+", textAlign = TextAlign.Center) } }
                             ) {
                                 Icon(Icons.Filled.Favorite, null)
                             }
@@ -158,9 +134,7 @@
             }
         }
 
-        assertBadgeAgainstGolden(
-            goldenIdentifier = "badge_lightTheme_longContent_bottomNavigation"
-        )
+        assertBadgeAgainstGolden(goldenIdentifier = "badge_lightTheme_longContent_bottomNavigation")
     }
 
     @Test
@@ -168,11 +142,7 @@
         composeTestRule.setContent {
             MaterialTheme(lightColors()) {
                 Tab(
-                    text = {
-                        BadgedBox(badge = { Badge() }) {
-                            Text("TAB")
-                        }
-                    },
+                    text = { BadgedBox(badge = { Badge() }) { Text("TAB") } },
                     selected = true,
                     onClick = {},
                     modifier = Modifier.semantics(mergeDescendants = true) {}.testTag(TestTag)
@@ -180,9 +150,7 @@
             }
         }
 
-        assertBadgeAgainstGolden(
-            goldenIdentifier = "badge_lightTheme_noContent_tab"
-        )
+        assertBadgeAgainstGolden(goldenIdentifier = "badge_lightTheme_noContent_tab")
     }
 
     @Test
@@ -192,16 +160,7 @@
                 // A round badge with the text `8` attached to a tab.
                 Tab(
                     text = {
-                        BadgedBox(
-                            badge = {
-                                Badge {
-                                    Text(
-                                        "8",
-                                        textAlign = TextAlign.Center
-                                    )
-                                }
-                            }
-                        ) {
+                        BadgedBox(badge = { Badge { Text("8", textAlign = TextAlign.Center) } }) {
                             Text("TAB")
                         }
                     },
@@ -212,9 +171,7 @@
             }
         }
 
-        assertBadgeAgainstGolden(
-            goldenIdentifier = "badge_lightTheme_shortContent_tab"
-        )
+        assertBadgeAgainstGolden(goldenIdentifier = "badge_lightTheme_shortContent_tab")
     }
 
     @Test
@@ -224,16 +181,7 @@
                 // Tab with a pilled shape badge with the text `99+`.
                 Tab(
                     text = {
-                        BadgedBox(
-                            badge = {
-                                Badge {
-                                    Text(
-                                        "99+",
-                                        textAlign = TextAlign.Center
-                                    )
-                                }
-                            }
-                        ) {
+                        BadgedBox(badge = { Badge { Text("99+", textAlign = TextAlign.Center) } }) {
                             Text("TAB")
                         }
                     },
@@ -244,9 +192,7 @@
             }
         }
 
-        assertBadgeAgainstGolden(
-            goldenIdentifier = "badge_lightTheme_longContent_tab"
-        )
+        assertBadgeAgainstGolden(goldenIdentifier = "badge_lightTheme_longContent_tab")
     }
 
     @Test
@@ -256,22 +202,11 @@
                 // A round badge with the text `8` attached to a leading icon tab.
                 LeadingIconTab(
                     icon = {
-                        BadgedBox(
-                            badge = {
-                                Badge {
-                                    Text(
-                                        "8",
-                                        textAlign = TextAlign.Center
-                                    )
-                                }
-                            }
-                        ) {
+                        BadgedBox(badge = { Badge { Text("8", textAlign = TextAlign.Center) } }) {
                             Icon(Icons.Filled.Favorite, null)
                         }
                     },
-                    text = {
-                        Text("TAB")
-                    },
+                    text = { Text("TAB") },
                     selected = true,
                     onClick = {},
                     modifier = Modifier.semantics(mergeDescendants = true) {}.testTag(TestTag)
@@ -279,13 +214,12 @@
             }
         }
 
-        assertBadgeAgainstGolden(
-            goldenIdentifier = "badge_lightTheme_shortContent_leadingIconTab"
-        )
+        assertBadgeAgainstGolden(goldenIdentifier = "badge_lightTheme_shortContent_leadingIconTab")
     }
 
     private fun assertBadgeAgainstGolden(goldenIdentifier: String) {
-        composeTestRule.onNodeWithTag(TestTag)
+        composeTestRule
+            .onNodeWithTag(TestTag)
             .captureToImage()
             .assertAgainstGolden(screenshotRule, goldenIdentifier)
     }
diff --git a/compose/material/material/src/androidInstrumentedTest/kotlin/androidx/compose/material/BadgeTest.kt b/compose/material/material/src/androidInstrumentedTest/kotlin/androidx/compose/material/BadgeTest.kt
index 706b93a..f116c79 100644
--- a/compose/material/material/src/androidInstrumentedTest/kotlin/androidx/compose/material/BadgeTest.kt
+++ b/compose/material/material/src/androidInstrumentedTest/kotlin/androidx/compose/material/BadgeTest.kt
@@ -66,15 +66,12 @@
 
     private val icon = Icons.Filled.Favorite
 
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
     @Test
     fun badge_noContent_size() {
         rule
-            .setMaterialContentForSizeAssertions {
-                Badge()
-            }
+            .setMaterialContentForSizeAssertions { Badge() }
             .assertHeightIsEqualTo(BadgeRadius * 2)
             .assertWidthIsEqualTo(BadgeRadius * 2)
     }
@@ -82,9 +79,7 @@
     @Test
     fun badge_shortContent_size() {
         rule
-            .setMaterialContentForSizeAssertions {
-                Badge { Text("1") }
-            }
+            .setMaterialContentForSizeAssertions { Badge { Text("1") } }
             .assertHeightIsEqualTo(BadgeWithContentRadius * 2)
             .assertWidthIsEqualTo(BadgeWithContentRadius * 2)
     }
@@ -92,9 +87,7 @@
     @Test
     fun badge_longContent_size() {
         rule
-            .setMaterialContentForSizeAssertions {
-                Badge { Text("999+") }
-            }
+            .setMaterialContentForSizeAssertions { Badge { Text("999+") } }
             .assertHeightIsEqualTo(BadgeWithContentRadius * 2)
             .assertWidthIsAtLeast(BadgeWithContentRadius * 2)
     }
@@ -105,9 +98,7 @@
         val customHeight = 6.dp
         rule
             .setMaterialContentForSizeAssertions {
-                Badge(modifier = Modifier.size(customWidth, customHeight)) {
-                    Text("1")
-                }
+                Badge(modifier = Modifier.size(customWidth, customHeight)) { Text("1") }
             }
             .assertHeightIsEqualTo(customHeight)
             .assertWidthIsEqualTo(customWidth)
@@ -123,7 +114,8 @@
             Badge(modifier = Modifier.testTag(TestBadgeTag))
         }
 
-        rule.onNodeWithTag(TestBadgeTag)
+        rule
+            .onNodeWithTag(TestBadgeTag)
             .captureToImage()
             .assertShape(
                 density = rule.density,
@@ -135,22 +127,18 @@
 
     @Test
     fun badgeBox_noContent_position() {
-        rule
-            .setMaterialContent {
-                BadgedBox(badge = { Badge(Modifier.testTag(TestBadgeTag)) }) {
-                    Icon(
-                        icon,
-                        null,
-                        modifier = Modifier.testTag(TestAnchorTag)
-                    )
-                }
+        rule.setMaterialContent {
+            BadgedBox(badge = { Badge(Modifier.testTag(TestBadgeTag)) }) {
+                Icon(icon, null, modifier = Modifier.testTag(TestAnchorTag))
             }
+        }
         val badge = rule.onNodeWithTag(TestBadgeTag)
         val anchorBounds = rule.onNodeWithTag(TestAnchorTag).getUnclippedBoundsInRoot()
         val badgeBounds = badge.getUnclippedBoundsInRoot()
         badge.assertPositionInRootIsEqualTo(
             expectedLeft =
-                anchorBounds.right + BadgeHorizontalOffset +
+                anchorBounds.right +
+                    BadgeHorizontalOffset +
                     max((BadgeRadius - badgeBounds.width) / 2, 0.dp),
             expectedTop = -badgeBounds.height / 2
         )
@@ -158,49 +146,37 @@
 
     @Test
     fun badgeBox_shortContent_position() {
-        rule
-            .setMaterialContent {
-                BadgedBox(badge = { Badge { Text("8") } }) {
-                    Icon(
-                        icon,
-                        null,
-                        modifier = Modifier.testTag(TestAnchorTag)
-                    )
-                }
+        rule.setMaterialContent {
+            BadgedBox(badge = { Badge { Text("8") } }) {
+                Icon(icon, null, modifier = Modifier.testTag(TestAnchorTag))
             }
+        }
         val badge = rule.onNodeWithTag(TestAnchorTag).onSibling()
         val anchorBounds = rule.onNodeWithTag(TestAnchorTag).getUnclippedBoundsInRoot()
         val badgeBounds = badge.getUnclippedBoundsInRoot()
         badge.assertPositionInRootIsEqualTo(
-            expectedLeft = anchorBounds.right + BadgeWithContentHorizontalOffset + 4.dp + max
-            (
-                (
-                    BadgeWithContentRadius - badgeBounds.width
-                    ) / 2,
-                0.dp
-            ),
+            expectedLeft =
+                anchorBounds.right +
+                    BadgeWithContentHorizontalOffset +
+                    4.dp +
+                    max((BadgeWithContentRadius - badgeBounds.width) / 2, 0.dp),
             expectedTop = -badgeBounds.height / 2
         )
     }
 
     @Test
     fun badgeBox_longContent_position() {
-        rule
-            .setMaterialContent {
-                BadgedBox(badge = { Badge { Text("999+") } }) {
-                    Icon(
-                        icon,
-                        null,
-                        modifier = Modifier.testTag(TestAnchorTag)
-                    )
-                }
+        rule.setMaterialContent {
+            BadgedBox(badge = { Badge { Text("999+") } }) {
+                Icon(icon, null, modifier = Modifier.testTag(TestAnchorTag))
             }
+        }
         val badge = rule.onNodeWithTag(TestAnchorTag).onSibling()
         val anchorBounds = rule.onNodeWithTag(TestAnchorTag).getUnclippedBoundsInRoot()
         val badgeBounds = badge.getUnclippedBoundsInRoot()
 
-        val totalBadgeHorizontalOffset = BadgeWithContentHorizontalOffset +
-            BadgeWithContentHorizontalPadding
+        val totalBadgeHorizontalOffset =
+            BadgeWithContentHorizontalOffset + BadgeWithContentHorizontalPadding
         badge.assertPositionInRootIsEqualTo(
             expectedLeft = anchorBounds.right + totalBadgeHorizontalOffset,
             expectedTop = -badgeBounds.height / 2
@@ -216,17 +192,13 @@
                     text = { Text("Text") },
                     selected = true,
                     onClick = { count.value += 1 },
-                    modifier = Modifier
-                        .testTag("tab")
+                    modifier = Modifier.testTag("tab")
                 )
             }
         }
-        rule.onNodeWithTag(TestBadgeTag)
-            .assertHasNoClickAction()
+        rule.onNodeWithTag(TestBadgeTag).assertHasNoClickAction()
         Truth.assertThat(count.value).isEqualTo(0)
-        rule.onNodeWithTag("tab")
-            .performClick()
-            .performClick()
+        rule.onNodeWithTag("tab").performClick().performClick()
         Truth.assertThat(count.value).isEqualTo(2)
     }
 
@@ -243,13 +215,15 @@
             }
         }
 
-        rule.onNodeWithTag("tab")
+        rule
+            .onNodeWithTag("tab")
             .assert(SemanticsMatcher.expectValue(SemanticsProperties.Role, Role.Tab))
             .assertIsSelected()
             .assertIsEnabled()
             .assertHasClickAction()
 
-        rule.onNodeWithTag("tab")
+        rule
+            .onNodeWithTag("tab")
             .onParent()
             .assert(SemanticsMatcher.keyIsDefined(SemanticsProperties.SelectableGroup))
     }
@@ -268,7 +242,8 @@
             }
         }
 
-        rule.onNodeWithTag("tab")
+        rule
+            .onNodeWithTag("tab")
             .assert(SemanticsMatcher.expectValue(SemanticsProperties.Role, Role.Tab))
             .assertIsSelected()
             .assertIsNotEnabled()
@@ -279,18 +254,15 @@
     fun badge_notMergingDescendants_withOwnContentDescription() {
         rule.setMaterialContent {
             BadgedBox(
-                badge = {
-                    Badge { Text("99+") }
-                },
-                modifier = Modifier.testTag(TestBadgeTag).semantics {
-                    this.contentDescription = "more than 99 new email"
-                }
+                badge = { Badge { Text("99+") } },
+                modifier =
+                    Modifier.testTag(TestBadgeTag).semantics {
+                        this.contentDescription = "more than 99 new email"
+                    }
             ) {
                 Text(
                     "inbox",
-                    Modifier.semantics {
-                        this.contentDescription = "inbox"
-                    }.testTag(TestAnchorTag)
+                    Modifier.semantics { this.contentDescription = "inbox" }.testTag(TestAnchorTag)
                 )
             }
         }
@@ -301,11 +273,10 @@
 
     @Test
     fun badgeBox_size() {
-        rule.setMaterialContentForSizeAssertions {
-            BadgedBox(badge = { Badge { Text("999+") } }) {
-                Icon(icon, null)
+        rule
+            .setMaterialContentForSizeAssertions {
+                BadgedBox(badge = { Badge { Text("999+") } }) { Icon(icon, null) }
             }
-        }
             .assertWidthIsEqualTo(icon.defaultWidth)
             .assertHeightIsEqualTo(icon.defaultHeight)
     }
diff --git a/compose/material/material/src/androidInstrumentedTest/kotlin/androidx/compose/material/BottomNavigationScreenshotTest.kt b/compose/material/material/src/androidInstrumentedTest/kotlin/androidx/compose/material/BottomNavigationScreenshotTest.kt
index 893853e..020a84e 100644
--- a/compose/material/material/src/androidInstrumentedTest/kotlin/androidx/compose/material/BottomNavigationScreenshotTest.kt
+++ b/compose/material/material/src/androidInstrumentedTest/kotlin/androidx/compose/material/BottomNavigationScreenshotTest.kt
@@ -50,11 +50,9 @@
 @OptIn(ExperimentalMaterialApi::class)
 class BottomNavigationScreenshotTest {
 
-    @get:Rule
-    val composeTestRule = createComposeRule()
+    @get:Rule val composeTestRule = createComposeRule()
 
-    @get:Rule
-    val screenshotRule = AndroidXScreenshotTestRule(GOLDEN_MATERIAL)
+    @get:Rule val screenshotRule = AndroidXScreenshotTestRule(GOLDEN_MATERIAL)
 
     @Test
     fun lightTheme_defaultColors() {
@@ -304,7 +302,7 @@
      *
      * @param scope [CoroutineScope] used to interact with [MutableInteractionSource]
      * @param interactionSource the [MutableInteractionSource] used for the first
-     * BottomNavigationItem
+     *   BottomNavigationItem
      * @param interaction the [Interaction] to assert for, or `null` if no [Interaction].
      * @param goldenIdentifier the identifier for the corresponding screenshot
      */
@@ -317,9 +315,7 @@
         if (interaction != null) {
             composeTestRule.runOnIdle {
                 // Start ripple
-                scope.launch {
-                    interactionSource.emit(interaction)
-                }
+                scope.launch { interactionSource.emit(interaction) }
             }
 
             composeTestRule.waitForIdle()
@@ -330,7 +326,8 @@
         }
 
         // Capture and compare screenshots
-        composeTestRule.onNodeWithTag(Tag)
+        composeTestRule
+            .onNodeWithTag(Tag)
             .captureToImage()
             .assertAgainstGolden(screenshotRule, goldenIdentifier)
     }
@@ -341,12 +338,10 @@
  * [BottomNavigationItem] is selected, and the rest are not.
  *
  * @param interactionSource the [MutableInteractionSource] for the first [BottomNavigationItem], to
- * control its visual state.
+ *   control its visual state.
  */
 @Composable
-private fun DefaultBottomNavigation(
-    interactionSource: MutableInteractionSource
-) {
+private fun DefaultBottomNavigation(interactionSource: MutableInteractionSource) {
     Box(Modifier.semantics(mergeDescendants = true) {}.testTag(Tag)) {
         BottomNavigation {
             BottomNavigationItem(
@@ -374,11 +369,11 @@
  * [BottomNavigationItem] is selected, and the rest are not.
  *
  * @param interactionSource the [MutableInteractionSource] for the first [BottomNavigationItem], to
- * control its visual state.
+ *   control its visual state.
  * @param backgroundColor the backgroundColor of the [BottomNavigation]
  * @param selectedContentColor the content color for a selected [BottomNavigationItem] (first item)
  * @param unselectedContentColor the content color for an unselected [BottomNavigationItem] (second
- * and third items)
+ *   and third items)
  */
 @Composable
 private fun CustomBottomNavigation(
diff --git a/compose/material/material/src/androidInstrumentedTest/kotlin/androidx/compose/material/BottomNavigationTest.kt b/compose/material/material/src/androidInstrumentedTest/kotlin/androidx/compose/material/BottomNavigationTest.kt
index 6da36d4..290d0c4 100644
--- a/compose/material/material/src/androidInstrumentedTest/kotlin/androidx/compose/material/BottomNavigationTest.kt
+++ b/compose/material/material/src/androidInstrumentedTest/kotlin/androidx/compose/material/BottomNavigationTest.kt
@@ -65,12 +65,9 @@
 
 @LargeTest
 @RunWith(AndroidJUnit4::class)
-/**
- * Test for [BottomNavigation] and [BottomNavigationItem].
- */
+/** Test for [BottomNavigation] and [BottomNavigationItem]. */
 class BottomNavigationTest {
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
     @Test
     fun defaultSemantics() {
@@ -78,25 +75,23 @@
             BottomNavigation {
                 BottomNavigationItem(
                     modifier = Modifier.testTag("item"),
-                    icon = {
-                        Icon(Icons.Filled.Favorite, null)
-                    },
-                    label = {
-                        Text("ItemText")
-                    },
+                    icon = { Icon(Icons.Filled.Favorite, null) },
+                    label = { Text("ItemText") },
                     selected = true,
                     onClick = {}
                 )
             }
         }
 
-        rule.onNodeWithTag("item")
+        rule
+            .onNodeWithTag("item")
             .assert(SemanticsMatcher.expectValue(SemanticsProperties.Role, Role.Tab))
             .assertIsSelected()
             .assertIsEnabled()
             .assertHasClickAction()
 
-        rule.onNodeWithTag("item")
+        rule
+            .onNodeWithTag("item")
             .onParent()
             .assert(SemanticsMatcher.keyIsDefined(SemanticsProperties.SelectableGroup))
     }
@@ -108,19 +103,16 @@
                 BottomNavigationItem(
                     enabled = false,
                     modifier = Modifier.testTag("item"),
-                    icon = {
-                        Icon(Icons.Filled.Favorite, null)
-                    },
-                    label = {
-                        Text("ItemText")
-                    },
+                    icon = { Icon(Icons.Filled.Favorite, null) },
+                    label = { Text("ItemText") },
                     selected = true,
                     onClick = {}
                 )
             }
         }
 
-        rule.onNodeWithTag("item")
+        rule
+            .onNodeWithTag("item")
             .assert(SemanticsMatcher.expectValue(SemanticsProperties.Role, Role.Tab))
             .assertIsSelected()
             .assertIsNotEnabled()
@@ -130,9 +122,8 @@
     @Test
     fun bottomNavigation_size() {
         val height = 56.dp
-        rule.setMaterialContentForSizeAssertions {
-            BottomNavigationSample()
-        }
+        rule
+            .setMaterialContentForSizeAssertions { BottomNavigationSample() }
             .assertWidthIsEqualTo(rule.rootWidth())
             .assertHeightIsEqualTo(height)
     }
@@ -141,23 +132,24 @@
     fun bottomNavigation_size_withInsets() {
         val height = 56.dp
         val fakeInset = 5.dp
-        rule.setMaterialContentForSizeAssertions {
-            var selectedItem by remember { mutableStateOf(0) }
-            val items = listOf("Songs", "Artists", "Playlists")
+        rule
+            .setMaterialContentForSizeAssertions {
+                var selectedItem by remember { mutableStateOf(0) }
+                val items = listOf("Songs", "Artists", "Playlists")
 
-            BottomNavigation(
-                windowInsets = WindowInsets(fakeInset, fakeInset, fakeInset, fakeInset),
-            ) {
-                items.forEachIndexed { index, item ->
-                    BottomNavigationItem(
-                        icon = { Icon(Icons.Filled.Favorite, contentDescription = null) },
-                        label = { Text(item) },
-                        selected = selectedItem == index,
-                        onClick = { selectedItem = index }
-                    )
+                BottomNavigation(
+                    windowInsets = WindowInsets(fakeInset, fakeInset, fakeInset, fakeInset),
+                ) {
+                    items.forEachIndexed { index, item ->
+                        BottomNavigationItem(
+                            icon = { Icon(Icons.Filled.Favorite, contentDescription = null) },
+                            label = { Text(item) },
+                            selected = selectedItem == index,
+                            onClick = { selectedItem = index }
+                        )
+                    }
                 }
             }
-        }
             .assertWidthIsEqualTo(rule.rootWidth())
             .assertHeightIsEqualTo(height + fakeInset * 2)
     }
@@ -167,9 +159,7 @@
         lateinit var parentCoords: LayoutCoordinates
         val itemCoords = mutableMapOf<Int, LayoutCoordinates>()
         rule.setMaterialContent(
-            Modifier.onGloballyPositioned { coords: LayoutCoordinates ->
-                parentCoords = coords
-            }
+            Modifier.onGloballyPositioned { coords: LayoutCoordinates -> parentCoords = coords }
         ) {
             Box {
                 BottomNavigation {
@@ -179,9 +169,10 @@
                             label = { Text("Item $index") },
                             selected = index == 0,
                             onClick = {},
-                            modifier = Modifier.onGloballyPositioned { coords ->
-                                itemCoords[index] = coords
-                            }
+                            modifier =
+                                Modifier.onGloballyPositioned { coords ->
+                                    itemCoords[index] = coords
+                                }
                         )
                     }
                 }
@@ -200,7 +191,8 @@
                 Truth.assertThat(coord.size.width.toFloat()).isWithin(1f).of(expectedItemWidth)
                 Truth.assertThat(coord.size.height.toFloat()).isWithin(1f).of(expectedItemHeight)
                 Truth.assertThat(coord.positionInWindow().x)
-                    .isWithin(1f).of(expectedItemWidth * index)
+                    .isWithin(1f)
+                    .of(expectedItemWidth * index)
             }
         }
     }
@@ -211,9 +203,7 @@
         val itemCoords = mutableMapOf<Int, LayoutCoordinates>()
         val fakeInset = 6.dp
         rule.setMaterialContent(
-            Modifier.onGloballyPositioned { coords: LayoutCoordinates ->
-                parentCoords = coords
-            }
+            Modifier.onGloballyPositioned { coords: LayoutCoordinates -> parentCoords = coords }
         ) {
             Box {
                 BottomNavigation(
@@ -225,9 +215,10 @@
                             label = { Text("Item $index") },
                             selected = index == 0,
                             onClick = {},
-                            modifier = Modifier.onGloballyPositioned { coords ->
-                                itemCoords[index] = coords
-                            }
+                            modifier =
+                                Modifier.onGloballyPositioned { coords ->
+                                    itemCoords[index] = coords
+                                }
                         )
                     }
                 }
@@ -246,9 +237,9 @@
                 Truth.assertThat(coord.size.width.toFloat()).isWithin(1f).of(expectedItemWidth)
                 Truth.assertThat(coord.size.height.toFloat()).isWithin(1f).of(expectedItemHeight)
                 Truth.assertThat(coord.positionInWindow().x)
-                    .isWithin(1f).of(expectedItemWidth * index + fakeInset.toPx())
-                Truth.assertThat(coord.positionInWindow().y)
-                    .isWithin(1f).of(fakeInset.toPx())
+                    .isWithin(1f)
+                    .of(expectedItemWidth * index + fakeInset.toPx())
+                Truth.assertThat(coord.positionInWindow().y).isWithin(1f).of(fakeInset.toPx())
             }
         }
     }
@@ -279,12 +270,8 @@
                 BottomNavigation {
                     BottomNavigationItem(
                         modifier = Modifier.testTag("item"),
-                        icon = {
-                            Icon(Icons.Filled.Favorite, null, Modifier.testTag("icon"))
-                        },
-                        label = {
-                            Text("ItemText")
-                        },
+                        icon = { Icon(Icons.Filled.Favorite, null, Modifier.testTag("icon")) },
+                        label = { Text("ItemText") },
                         selected = true,
                         onClick = {}
                     )
@@ -293,8 +280,8 @@
         }
 
         val itemBounds = rule.onNodeWithTag("item").getUnclippedBoundsInRoot()
-        val iconBounds = rule.onNodeWithTag("icon", useUnmergedTree = true)
-            .getUnclippedBoundsInRoot()
+        val iconBounds =
+            rule.onNodeWithTag("icon", useUnmergedTree = true).getUnclippedBoundsInRoot()
         val textBounds = rule.onNodeWithText("ItemText").getUnclippedBoundsInRoot()
 
         val topPadding = 8.dp
@@ -310,7 +297,8 @@
         // Text baseline should be 12.dp from the bottom of the icon
         absoluteTextBaseline.assertIsEqualTo(iconBottom + textBaseline)
 
-        rule.onNodeWithTag("icon", useUnmergedTree = true)
+        rule
+            .onNodeWithTag("icon", useUnmergedTree = true)
             // The icon should be horizontally centered in the item
             .assertLeftPositionInRootIsEqualTo((itemBounds.width - iconBounds.width) / 2)
             // The icon is 8.dp from the top
@@ -324,12 +312,8 @@
                 BottomNavigation {
                     BottomNavigationItem(
                         modifier = Modifier.testTag("item"),
-                        icon = {
-                            Icon(Icons.Filled.Favorite, null, Modifier.testTag("icon"))
-                        },
-                        label = {
-                            Text("ItemText")
-                        },
+                        icon = { Icon(Icons.Filled.Favorite, null, Modifier.testTag("icon")) },
+                        label = { Text("ItemText") },
                         selected = false,
                         onClick = {},
                         alwaysShowLabel = false
@@ -343,10 +327,11 @@
         rule.onNodeWithText("ItemText", useUnmergedTree = true).assertIsNotDisplayed()
 
         val itemBounds = rule.onNodeWithTag("item").getUnclippedBoundsInRoot()
-        val iconBounds = rule.onNodeWithTag("icon", useUnmergedTree = true)
-            .getUnclippedBoundsInRoot()
+        val iconBounds =
+            rule.onNodeWithTag("icon", useUnmergedTree = true).getUnclippedBoundsInRoot()
 
-        rule.onNodeWithTag("icon", useUnmergedTree = true)
+        rule
+            .onNodeWithTag("icon", useUnmergedTree = true)
             .assertLeftPositionInRootIsEqualTo((itemBounds.width - iconBounds.width) / 2)
             .assertTopPositionInRootIsEqualTo((itemBounds.height - iconBounds.height) / 2)
     }
@@ -358,9 +343,7 @@
                 BottomNavigation {
                     BottomNavigationItem(
                         modifier = Modifier.testTag("item"),
-                        icon = {
-                            Icon(Icons.Filled.Favorite, null, Modifier.testTag("icon"))
-                        },
+                        icon = { Icon(Icons.Filled.Favorite, null, Modifier.testTag("icon")) },
                         label = null,
                         selected = false,
                         onClick = {}
@@ -370,23 +353,23 @@
         }
 
         val itemBounds = rule.onNodeWithTag("item").getUnclippedBoundsInRoot()
-        val iconBounds = rule.onNodeWithTag("icon", useUnmergedTree = true)
-            .getUnclippedBoundsInRoot()
+        val iconBounds =
+            rule.onNodeWithTag("icon", useUnmergedTree = true).getUnclippedBoundsInRoot()
 
         // The icon should be centered in the item, as there is no text placeable provided
-        rule.onNodeWithTag("icon", useUnmergedTree = true)
+        rule
+            .onNodeWithTag("icon", useUnmergedTree = true)
             .assertLeftPositionInRootIsEqualTo((itemBounds.width - iconBounds.width) / 2)
             .assertTopPositionInRootIsEqualTo((itemBounds.height - iconBounds.height) / 2)
     }
 
     @Test
     fun bottomNavigation_selectNewItem() {
-        rule.setMaterialContent {
-            BottomNavigationSample()
-        }
+        rule.setMaterialContent { BottomNavigationSample() }
 
         // Find all items and ensure there are 3
-        rule.onAllNodes(isSelectable())
+        rule
+            .onAllNodes(isSelectable())
             .assertCountEquals(3)
             // Ensure semantics match for selected state of the items
             .apply {
@@ -395,9 +378,7 @@
                 get(2).assertIsNotSelected()
             }
             // Click the last item
-            .apply {
-                get(2).performClick()
-            }
+            .apply { get(2).performClick() }
             .apply {
                 get(0).assertIsNotSelected()
                 get(1).assertIsNotSelected()
@@ -413,23 +394,16 @@
                 BottomNavigationItem(
                     enabled = false,
                     modifier = Modifier.testTag("item"),
-                    icon = {
-                        Icon(Icons.Filled.Favorite, null)
-                    },
-                    label = {
-                        Text("ItemText")
-                    },
+                    icon = { Icon(Icons.Filled.Favorite, null) },
+                    label = { Text("ItemText") },
                     selected = true,
                     onClick = { clicks++ }
                 )
             }
         }
 
-        rule.onNodeWithTag("item")
-            .performClick()
+        rule.onNodeWithTag("item").performClick()
 
-        rule.runOnIdle {
-            Truth.assertThat(clicks).isEqualTo(0)
-        }
+        rule.runOnIdle { Truth.assertThat(clicks).isEqualTo(0) }
     }
 }
diff --git a/compose/material/material/src/androidInstrumentedTest/kotlin/androidx/compose/material/BottomSheetScaffoldTest.kt b/compose/material/material/src/androidInstrumentedTest/kotlin/androidx/compose/material/BottomSheetScaffoldTest.kt
index 2769c3f..c82f344 100644
--- a/compose/material/material/src/androidInstrumentedTest/kotlin/androidx/compose/material/BottomSheetScaffoldTest.kt
+++ b/compose/material/material/src/androidInstrumentedTest/kotlin/androidx/compose/material/BottomSheetScaffoldTest.kt
@@ -79,8 +79,7 @@
 @RunWith(AndroidJUnit4::class)
 class BottomSheetScaffoldTest {
 
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
     private val peekHeight = 75.dp
 
@@ -96,19 +95,15 @@
     fun bottomSheetScaffold_testOffset_whenCollapsed() {
         rule.setContent {
             BottomSheetScaffold(
-                sheetContent = {
-                    Box(
-                        Modifier
-                            .fillMaxSize()
-                            .testTag(sheetContent))
-                },
+                sheetContent = { Box(Modifier.fillMaxSize().testTag(sheetContent)) },
                 sheetPeekHeight = peekHeight
             ) {
                 Text("Content")
             }
         }
 
-        rule.onNodeWithTag(sheetContent)
+        rule
+            .onNodeWithTag(sheetContent)
             .assertTopPositionInRootIsEqualTo(rule.rootHeight() - peekHeight)
     }
 
@@ -116,15 +111,12 @@
     fun bottomSheetScaffold_testOffset_whenExpanded() {
         rule.setContent {
             BottomSheetScaffold(
-                scaffoldState = rememberBottomSheetScaffoldState(
-                    bottomSheetState = rememberBottomSheetState(BottomSheetValue.Expanded)
-                ),
+                scaffoldState =
+                    rememberBottomSheetScaffoldState(
+                        bottomSheetState = rememberBottomSheetState(BottomSheetValue.Expanded)
+                    ),
                 sheetContent = {
-                    Box(
-                        Modifier
-                            .fillMaxWidth()
-                            .requiredHeight(300.dp)
-                            .testTag(sheetContent))
+                    Box(Modifier.fillMaxWidth().requiredHeight(300.dp).testTag(sheetContent))
                 },
                 sheetPeekHeight = peekHeight
             ) {
@@ -132,7 +124,8 @@
             }
         }
 
-        rule.onNodeWithTag(sheetContent)
+        rule
+            .onNodeWithTag(sheetContent)
             .assertTopPositionInRootIsEqualTo(rule.rootHeight() - 300.dp)
     }
 
@@ -140,15 +133,12 @@
     fun bottomSheetScaffold_testExpandAction_whenCollapsed() {
         rule.setContent {
             BottomSheetScaffold(
-                scaffoldState = rememberBottomSheetScaffoldState(
-                    bottomSheetState = rememberBottomSheetState(BottomSheetValue.Collapsed)
-                ),
+                scaffoldState =
+                    rememberBottomSheetScaffoldState(
+                        bottomSheetState = rememberBottomSheetState(BottomSheetValue.Collapsed)
+                    ),
                 sheetContent = {
-                    Box(
-                        Modifier
-                            .fillMaxWidth()
-                            .requiredHeight(300.dp)
-                            .testTag(sheetContent))
+                    Box(Modifier.fillMaxWidth().requiredHeight(300.dp).testTag(sheetContent))
                 },
                 sheetPeekHeight = peekHeight
             ) {
@@ -156,14 +146,17 @@
             }
         }
 
-        rule.onNodeWithTag(sheetContent).onParent()
+        rule
+            .onNodeWithTag(sheetContent)
+            .onParent()
             .assert(SemanticsMatcher.keyNotDefined(SemanticsActions.Collapse))
             .assert(SemanticsMatcher.keyIsDefined(SemanticsActions.Expand))
             .performSemanticsAction(SemanticsActions.Expand)
 
         advanceClock()
 
-        rule.onNodeWithTag(sheetContent)
+        rule
+            .onNodeWithTag(sheetContent)
             .assertTopPositionInRootIsEqualTo(rule.rootHeight() - 300.dp)
     }
 
@@ -171,15 +164,12 @@
     fun bottomSheetScaffold_testCollapseAction_whenExpanded() {
         rule.setContent {
             BottomSheetScaffold(
-                scaffoldState = rememberBottomSheetScaffoldState(
-                    bottomSheetState = rememberBottomSheetState(BottomSheetValue.Expanded)
-                ),
+                scaffoldState =
+                    rememberBottomSheetScaffoldState(
+                        bottomSheetState = rememberBottomSheetState(BottomSheetValue.Expanded)
+                    ),
                 sheetContent = {
-                    Box(
-                        Modifier
-                            .fillMaxWidth()
-                            .requiredHeight(300.dp)
-                            .testTag(sheetContent))
+                    Box(Modifier.fillMaxWidth().requiredHeight(300.dp).testTag(sheetContent))
                 },
                 sheetPeekHeight = peekHeight
             ) {
@@ -187,14 +177,17 @@
             }
         }
 
-        rule.onNodeWithTag(sheetContent).onParent()
+        rule
+            .onNodeWithTag(sheetContent)
+            .onParent()
             .assert(SemanticsMatcher.keyNotDefined(SemanticsActions.Expand))
             .assert(SemanticsMatcher.keyIsDefined(SemanticsActions.Collapse))
             .performSemanticsAction(SemanticsActions.Collapse)
 
         advanceClock()
 
-        rule.onNodeWithTag(sheetContent)
+        rule
+            .onNodeWithTag(sheetContent)
             .assertTopPositionInRootIsEqualTo(rule.rootHeight() - peekHeight)
     }
 
@@ -203,15 +196,13 @@
         rule.setContent {
             CompositionLocalProvider(LocalDensity provides Density(1f, 1f)) {
                 BottomSheetScaffold(
-                    scaffoldState = rememberBottomSheetScaffoldState(
-                        bottomSheetState = rememberBottomSheetState(BottomSheetValue.Collapsed)
-                    ),
+                    scaffoldState =
+                        rememberBottomSheetScaffoldState(
+                            bottomSheetState = rememberBottomSheetState(BottomSheetValue.Collapsed)
+                        ),
                     sheetContent = {
                         Box(
-                            Modifier
-                                .fillMaxWidth()
-                                .requiredHeight(peekHeight)
-                                .testTag(sheetContent)
+                            Modifier.fillMaxWidth().requiredHeight(peekHeight).testTag(sheetContent)
                         )
                     },
                     sheetPeekHeight = peekHeight
@@ -221,65 +212,61 @@
             }
         }
 
-        rule.onNodeWithTag(sheetContent).onParent()
+        rule
+            .onNodeWithTag(sheetContent)
+            .onParent()
             .assert(SemanticsMatcher.keyNotDefined(SemanticsActions.Expand))
             .assert(SemanticsMatcher.keyNotDefined(SemanticsActions.Collapse))
     }
 
     @Test
-    fun bottomSheetScaffold_revealAndConceal_manually(): Unit = runBlocking(AutoTestFrameClock()) {
-        lateinit var bottomSheetState: BottomSheetState
-        rule.setContent {
-            bottomSheetState = rememberBottomSheetState(BottomSheetValue.Collapsed)
-            BottomSheetScaffold(
-                scaffoldState = rememberBottomSheetScaffoldState(
-                    bottomSheetState = bottomSheetState
-                ),
-                sheetContent = {
-                    Box(
-                        Modifier
-                            .fillMaxWidth()
-                            .requiredHeight(300.dp)
-                            .testTag(sheetContent))
-                },
-                sheetPeekHeight = peekHeight,
-                content = { Text("Content") }
-            )
+    fun bottomSheetScaffold_revealAndConceal_manually(): Unit =
+        runBlocking(AutoTestFrameClock()) {
+            lateinit var bottomSheetState: BottomSheetState
+            rule.setContent {
+                bottomSheetState = rememberBottomSheetState(BottomSheetValue.Collapsed)
+                BottomSheetScaffold(
+                    scaffoldState =
+                        rememberBottomSheetScaffoldState(bottomSheetState = bottomSheetState),
+                    sheetContent = {
+                        Box(Modifier.fillMaxWidth().requiredHeight(300.dp).testTag(sheetContent))
+                    },
+                    sheetPeekHeight = peekHeight,
+                    content = { Text("Content") }
+                )
+            }
+
+            rule
+                .onNodeWithTag(sheetContent)
+                .assertTopPositionInRootIsEqualTo(rule.rootHeight() - peekHeight)
+
+            bottomSheetState.expand()
+
+            advanceClock()
+
+            rule
+                .onNodeWithTag(sheetContent)
+                .assertTopPositionInRootIsEqualTo(rule.rootHeight() - 300.dp)
+
+            bottomSheetState.collapse()
+
+            advanceClock()
+
+            rule
+                .onNodeWithTag(sheetContent)
+                .assertTopPositionInRootIsEqualTo(rule.rootHeight() - peekHeight)
         }
 
-        rule.onNodeWithTag(sheetContent)
-            .assertTopPositionInRootIsEqualTo(rule.rootHeight() - peekHeight)
-
-        bottomSheetState.expand()
-
-        advanceClock()
-
-        rule.onNodeWithTag(sheetContent)
-            .assertTopPositionInRootIsEqualTo(rule.rootHeight() - 300.dp)
-
-        bottomSheetState.collapse()
-
-        advanceClock()
-
-        rule.onNodeWithTag(sheetContent)
-            .assertTopPositionInRootIsEqualTo(rule.rootHeight() - peekHeight)
-    }
-
     @Test
     fun bottomSheetScaffold_revealBySwiping() {
         lateinit var bottomSheetState: BottomSheetState
         rule.setContent {
             bottomSheetState = rememberBottomSheetState(BottomSheetValue.Collapsed)
             BottomSheetScaffold(
-                scaffoldState = rememberBottomSheetScaffoldState(
-                    bottomSheetState = bottomSheetState
-                ),
+                scaffoldState =
+                    rememberBottomSheetScaffoldState(bottomSheetState = bottomSheetState),
                 sheetContent = {
-                    Box(
-                        Modifier
-                            .fillMaxWidth()
-                            .requiredHeight(300.dp)
-                            .testTag(sheetContent))
+                    Box(Modifier.fillMaxWidth().requiredHeight(300.dp).testTag(sheetContent))
                 },
                 sheetPeekHeight = peekHeight,
                 content = { Text("Content") }
@@ -290,8 +277,7 @@
             Truth.assertThat(bottomSheetState.currentValue).isEqualTo(BottomSheetValue.Collapsed)
         }
 
-        rule.onNodeWithTag(sheetContent)
-            .performTouchInput { swipeUp() }
+        rule.onNodeWithTag(sheetContent).performTouchInput { swipeUp() }
 
         advanceClock()
 
@@ -299,8 +285,7 @@
             Truth.assertThat(bottomSheetState.currentValue).isEqualTo(BottomSheetValue.Expanded)
         }
 
-        rule.onNodeWithTag(sheetContent)
-            .performTouchInput { swipeDown() }
+        rule.onNodeWithTag(sheetContent).performTouchInput { swipeDown() }
 
         advanceClock()
 
@@ -313,22 +298,18 @@
     fun bottomSheetScaffold_respectsConfirmStateChange() {
         lateinit var bottomSheetState: BottomSheetState
         rule.setContent {
-            bottomSheetState = rememberBottomSheetState(
-                BottomSheetValue.Collapsed,
-                confirmStateChange = {
-                    it != BottomSheetValue.Expanded
-                }
-            )
+            bottomSheetState =
+                rememberBottomSheetState(
+                    BottomSheetValue.Collapsed,
+                    confirmStateChange = { it != BottomSheetValue.Expanded }
+                )
             BottomSheetScaffold(
-                scaffoldState = rememberBottomSheetScaffoldState(
-                    bottomSheetState = bottomSheetState,
-                ),
+                scaffoldState =
+                    rememberBottomSheetScaffoldState(
+                        bottomSheetState = bottomSheetState,
+                    ),
                 sheetContent = {
-                    Box(
-                        Modifier
-                            .fillMaxWidth()
-                            .requiredHeight(300.dp)
-                            .testTag(sheetContent))
+                    Box(Modifier.fillMaxWidth().requiredHeight(300.dp).testTag(sheetContent))
                 },
                 sheetPeekHeight = peekHeight,
                 content = { Text("Content") }
@@ -339,8 +320,7 @@
             Truth.assertThat(bottomSheetState.currentValue).isEqualTo(BottomSheetValue.Collapsed)
         }
 
-        rule.onNodeWithTag(sheetContent)
-            .performTouchInput { swipeUp() }
+        rule.onNodeWithTag(sheetContent).performTouchInput { swipeUp() }
 
         advanceClock()
 
@@ -348,7 +328,9 @@
             Truth.assertThat(bottomSheetState.currentValue).isEqualTo(BottomSheetValue.Collapsed)
         }
 
-        rule.onNodeWithTag(sheetContent).onParent()
+        rule
+            .onNodeWithTag(sheetContent)
+            .onParent()
             .assert(SemanticsMatcher.keyNotDefined(SemanticsActions.Collapse))
             .assert(SemanticsMatcher.keyIsDefined(SemanticsActions.Expand))
             .performSemanticsAction(SemanticsActions.Expand)
@@ -366,15 +348,10 @@
         rule.setContent {
             bottomSheetState = rememberBottomSheetState(BottomSheetValue.Collapsed)
             BottomSheetScaffold(
-                scaffoldState = rememberBottomSheetScaffoldState(
-                    bottomSheetState = bottomSheetState
-                ),
+                scaffoldState =
+                    rememberBottomSheetScaffoldState(bottomSheetState = bottomSheetState),
                 sheetContent = {
-                    Box(
-                        Modifier
-                            .fillMaxWidth()
-                            .requiredHeight(300.dp)
-                            .testTag(sheetContent))
+                    Box(Modifier.fillMaxWidth().requiredHeight(300.dp).testTag(sheetContent))
                 },
                 sheetGesturesEnabled = false,
                 sheetPeekHeight = peekHeight,
@@ -386,8 +363,7 @@
             Truth.assertThat(bottomSheetState.currentValue).isEqualTo(BottomSheetValue.Collapsed)
         }
 
-        rule.onNodeWithTag(sheetContent)
-            .performTouchInput { swipeUp() }
+        rule.onNodeWithTag(sheetContent).performTouchInput { swipeUp() }
 
         advanceClock()
 
@@ -408,13 +384,11 @@
             rule.setContent {
                 bottomSheetState = rememberBottomSheetState(BottomSheetValue.Expanded)
                 BottomSheetScaffold(
-                    scaffoldState = rememberBottomSheetScaffoldState(
-                        bottomSheetState = bottomSheetState
-                    ),
+                    scaffoldState =
+                        rememberBottomSheetScaffoldState(bottomSheetState = bottomSheetState),
                     sheetContent = {
                         Box(
-                            Modifier
-                                .fillMaxWidth()
+                            Modifier.fillMaxWidth()
                                 .requiredHeight(sheetHeight)
                                 .nestedScroll(scrollConnection, scrollDispatcher)
                                 .testTag(sheetContent)
@@ -435,7 +409,8 @@
             )
             rule.waitForIdle()
             Truth.assertWithMessage("Offset after scroll is equal to offset before scroll")
-                .that(bottomSheetState.requireOffset()).isEqualTo(offsetBeforeScroll)
+                .that(bottomSheetState.requireOffset())
+                .isEqualTo(offsetBeforeScroll)
 
             val highFlingVelocity = Velocity(x = 0f, y = with(rule.density) { 500.dp.toPx() })
             scrollDispatcher.dispatchPreFling(highFlingVelocity)
@@ -452,8 +427,7 @@
             BottomSheetScaffold(
                 topBar = {
                     Box(
-                        Modifier
-                            .fillMaxWidth()
+                        Modifier.fillMaxWidth()
                             .height(50.dp)
                             .background(color = Color.Red)
                             .onGloballyPositioned { positioned: LayoutCoordinates ->
@@ -462,13 +436,12 @@
                             }
                     )
                 },
-                sheetContent = {
-                    Box(Modifier.requiredSize(10.dp))
-                }
+                sheetContent = { Box(Modifier.requiredSize(10.dp)) }
             ) {
                 Box(
-                    Modifier
-                        .onGloballyPositioned { contentPosition = it.localToWindow(Offset.Zero) }
+                    Modifier.onGloballyPositioned {
+                            contentPosition = it.localToWindow(Offset.Zero)
+                        }
                         .fillMaxWidth()
                         .height(50.dp)
                         .background(Color.Blue)
@@ -480,152 +453,145 @@
     }
 
     @Test
-    fun bottomSheetScaffold_fab_startPosition(): Unit = runBlocking(AutoTestFrameClock()) {
-        val fabTag = "fab"
-        var fabSize: IntSize = IntSize.Zero
-        lateinit var scaffoldState: BottomSheetScaffoldState
-        rule.setContent {
-            scaffoldState = rememberBottomSheetScaffoldState()
-            BottomSheetScaffold(
-                scaffoldState = scaffoldState,
-                sheetContent = {
-                    Box(
-                        Modifier
-                            .fillMaxWidth()
-                            .requiredHeight(300.dp)
-                            .testTag(sheetContent))
-                },
-                sheetGesturesEnabled = false,
-                sheetPeekHeight = peekHeight,
-                floatingActionButton = {
-                    FloatingActionButton(
-                        modifier = Modifier
-                            .onGloballyPositioned { positioned ->
-                                fabSize = positioned.size
-                            }
-                            .testTag(fabTag),
-                        onClick = {}
-                    ) {
-                        Icon(Icons.Filled.Favorite, null)
-                    }
-                },
-                floatingActionButtonPosition = FabPosition.Start,
-                content = { Text("Content") },
-            )
-        }
-        with(rule.density) {
-            rule.onNodeWithTag(fabTag).assertLeftPositionInRootIsEqualTo(
-                fabSpacing
-            ).assertTopPositionInRootIsEqualTo(
-                rule.rootHeight() - peekHeight - fabSize.height.toDp() / 2
-            )
-        }
-        scaffoldState.bottomSheetState.expand()
-        advanceClock()
+    fun bottomSheetScaffold_fab_startPosition(): Unit =
+        runBlocking(AutoTestFrameClock()) {
+            val fabTag = "fab"
+            var fabSize: IntSize = IntSize.Zero
+            lateinit var scaffoldState: BottomSheetScaffoldState
+            rule.setContent {
+                scaffoldState = rememberBottomSheetScaffoldState()
+                BottomSheetScaffold(
+                    scaffoldState = scaffoldState,
+                    sheetContent = {
+                        Box(Modifier.fillMaxWidth().requiredHeight(300.dp).testTag(sheetContent))
+                    },
+                    sheetGesturesEnabled = false,
+                    sheetPeekHeight = peekHeight,
+                    floatingActionButton = {
+                        FloatingActionButton(
+                            modifier =
+                                Modifier.onGloballyPositioned { positioned ->
+                                        fabSize = positioned.size
+                                    }
+                                    .testTag(fabTag),
+                            onClick = {}
+                        ) {
+                            Icon(Icons.Filled.Favorite, null)
+                        }
+                    },
+                    floatingActionButtonPosition = FabPosition.Start,
+                    content = { Text("Content") },
+                )
+            }
+            with(rule.density) {
+                rule
+                    .onNodeWithTag(fabTag)
+                    .assertLeftPositionInRootIsEqualTo(fabSpacing)
+                    .assertTopPositionInRootIsEqualTo(
+                        rule.rootHeight() - peekHeight - fabSize.height.toDp() / 2
+                    )
+            }
+            scaffoldState.bottomSheetState.expand()
+            advanceClock()
 
-        with(rule.density) {
-            rule.onNodeWithTag(fabTag).assertLeftPositionInRootIsEqualTo(
-                fabSpacing
-            ).assertTopPositionInRootIsEqualTo(
-                rule.rootHeight() - 300.dp - fabSize.height.toDp() / 2
-            )
+            with(rule.density) {
+                rule
+                    .onNodeWithTag(fabTag)
+                    .assertLeftPositionInRootIsEqualTo(fabSpacing)
+                    .assertTopPositionInRootIsEqualTo(
+                        rule.rootHeight() - 300.dp - fabSize.height.toDp() / 2
+                    )
+            }
         }
-    }
 
     @Test
-    fun bottomSheetScaffold_fab_endPosition(): Unit = runBlocking(AutoTestFrameClock()) {
-        val fabTag = "fab"
-        var fabSize: IntSize = IntSize.Zero
-        lateinit var scaffoldState: BottomSheetScaffoldState
-        rule.setContent {
-            scaffoldState = rememberBottomSheetScaffoldState()
-            BottomSheetScaffold(
-                scaffoldState = scaffoldState,
-                sheetContent = {
-                    Box(
-                        Modifier
-                            .fillMaxWidth()
-                            .requiredHeight(300.dp)
-                            .testTag(sheetContent))
-                },
-                sheetGesturesEnabled = false,
-                sheetPeekHeight = peekHeight,
-                floatingActionButton = {
-                    FloatingActionButton(
-                        modifier = Modifier
-                            .onGloballyPositioned { positioned ->
-                                fabSize = positioned.size
-                            }
-                            .testTag(fabTag),
-                        onClick = {}
-                    ) {
-                        Icon(Icons.Filled.Favorite, null)
-                    }
-                },
-                floatingActionButtonPosition = FabPosition.End,
-                content = { Text("Content") }
-            )
-        }
-        with(rule.density) {
-            rule.onNodeWithTag(fabTag).assertLeftPositionInRootIsEqualTo(
-                rule.rootWidth() - fabSize.width.toDp() - fabSpacing
-            ).assertTopPositionInRootIsEqualTo(
-                rule.rootHeight() - peekHeight - fabSize.height.toDp() / 2
-            )
-        }
-        scaffoldState.bottomSheetState.expand()
-        advanceClock()
+    fun bottomSheetScaffold_fab_endPosition(): Unit =
+        runBlocking(AutoTestFrameClock()) {
+            val fabTag = "fab"
+            var fabSize: IntSize = IntSize.Zero
+            lateinit var scaffoldState: BottomSheetScaffoldState
+            rule.setContent {
+                scaffoldState = rememberBottomSheetScaffoldState()
+                BottomSheetScaffold(
+                    scaffoldState = scaffoldState,
+                    sheetContent = {
+                        Box(Modifier.fillMaxWidth().requiredHeight(300.dp).testTag(sheetContent))
+                    },
+                    sheetGesturesEnabled = false,
+                    sheetPeekHeight = peekHeight,
+                    floatingActionButton = {
+                        FloatingActionButton(
+                            modifier =
+                                Modifier.onGloballyPositioned { positioned ->
+                                        fabSize = positioned.size
+                                    }
+                                    .testTag(fabTag),
+                            onClick = {}
+                        ) {
+                            Icon(Icons.Filled.Favorite, null)
+                        }
+                    },
+                    floatingActionButtonPosition = FabPosition.End,
+                    content = { Text("Content") }
+                )
+            }
+            with(rule.density) {
+                rule
+                    .onNodeWithTag(fabTag)
+                    .assertLeftPositionInRootIsEqualTo(
+                        rule.rootWidth() - fabSize.width.toDp() - fabSpacing
+                    )
+                    .assertTopPositionInRootIsEqualTo(
+                        rule.rootHeight() - peekHeight - fabSize.height.toDp() / 2
+                    )
+            }
+            scaffoldState.bottomSheetState.expand()
+            advanceClock()
 
-        with(rule.density) {
-            rule.onNodeWithTag(fabTag).assertLeftPositionInRootIsEqualTo(
-                rule.rootWidth() - fabSize.width.toDp() - fabSpacing
-            ).assertTopPositionInRootIsEqualTo(
-                rule.rootHeight() - 300.dp - fabSize.height.toDp() / 2
-            )
+            with(rule.density) {
+                rule
+                    .onNodeWithTag(fabTag)
+                    .assertLeftPositionInRootIsEqualTo(
+                        rule.rootWidth() - fabSize.width.toDp() - fabSpacing
+                    )
+                    .assertTopPositionInRootIsEqualTo(
+                        rule.rootHeight() - 300.dp - fabSize.height.toDp() / 2
+                    )
+            }
         }
-    }
 
     @SdkSuppress(minSdkVersion = Build.VERSION_CODES.O)
     @Test
     fun bottomSheetScaffold_topAppBarIsDrawnOnTopOfContent() {
         rule.setContent {
             Box(
-                Modifier
-                    .requiredSize(10.dp, 20.dp)
+                Modifier.requiredSize(10.dp, 20.dp)
                     .semantics(mergeDescendants = true) {}
                     .testTag("Scaffold")
             ) {
                 BottomSheetScaffold(
                     topBar = {
                         Box(
-                            Modifier
-                                .requiredSize(10.dp)
+                            Modifier.requiredSize(10.dp)
                                 .shadow(4.dp)
                                 .zIndex(4f)
                                 .background(color = Color.White)
                         )
                     },
-                    sheetContent = {
-                        Box(Modifier.requiredSize(0.dp))
-                    }
+                    sheetContent = { Box(Modifier.requiredSize(0.dp)) }
                 ) {
-                    Box(
-                        Modifier
-                            .requiredSize(10.dp)
-                            .background(color = Color.White)
-                    )
+                    Box(Modifier.requiredSize(10.dp).background(color = Color.White))
                 }
             }
         }
 
-        rule.onNodeWithTag("Scaffold")
-            .captureToImage().asAndroidBitmap().apply {
-                // asserts the appbar(top half part) has the shadow
-                val yPos = height / 2 + 2
-                Truth.assertThat(Color(getPixel(0, yPos))).isNotEqualTo(Color.White)
-                Truth.assertThat(Color(getPixel(width / 2, yPos))).isNotEqualTo(Color.White)
-                Truth.assertThat(Color(getPixel(width - 1, yPos))).isNotEqualTo(Color.White)
-            }
+        rule.onNodeWithTag("Scaffold").captureToImage().asAndroidBitmap().apply {
+            // asserts the appbar(top half part) has the shadow
+            val yPos = height / 2 + 2
+            Truth.assertThat(Color(getPixel(0, yPos))).isNotEqualTo(Color.White)
+            Truth.assertThat(Color(getPixel(width / 2, yPos))).isNotEqualTo(Color.White)
+            Truth.assertThat(Color(getPixel(width - 1, yPos))).isNotEqualTo(Color.White)
+        }
     }
 
     @Test
@@ -634,12 +600,7 @@
 
         rule.setContent {
             BottomSheetScaffold(
-                sheetContent = {
-                    Box(
-                        Modifier
-                            .fillMaxWidth()
-                            .requiredHeight(100.dp))
-                },
+                sheetContent = { Box(Modifier.fillMaxWidth().requiredHeight(100.dp)) },
                 sheetPeekHeight = peekHeight
             ) {
                 innerPadding = it
@@ -659,11 +620,11 @@
     fun bottomSheetScaffold_emptySlots_doesNotCrash() {
         rule.setMaterialContent {
             BottomSheetScaffold(
-                sheetContent = { },
-                topBar = { },
-                snackbarHost = { },
-                floatingActionButton = { },
-                content = { }
+                sheetContent = {},
+                topBar = {},
+                snackbarHost = {},
+                floatingActionButton = {},
+                content = {}
             )
         }
     }
@@ -676,10 +637,11 @@
         val animationLengthMillis = 192
         val amountOfFramesForAnimation = animationLengthMillis / 16
         rule.setContent {
-            state = rememberBottomSheetState(
-                BottomSheetValue.Collapsed,
-                tween(animationLengthMillis, easing = LinearEasing)
-            )
+            state =
+                rememberBottomSheetState(
+                    BottomSheetValue.Collapsed,
+                    tween(animationLengthMillis, easing = LinearEasing)
+                )
             scope = rememberCoroutineScope()
             BottomSheetScaffold(
                 scaffoldState = rememberBottomSheetScaffoldState(state),
@@ -690,18 +652,18 @@
 
         Truth.assertThat(state.currentValue).isEqualTo(BottomSheetValue.Collapsed)
         Truth.assertThat(state.targetValue).isEqualTo(BottomSheetValue.Collapsed)
-        assertThat(state.progress(
-            from = BottomSheetValue.Collapsed, to = BottomSheetValue.Expanded
-        )).isEqualTo(0f)
+        assertThat(
+                state.progress(from = BottomSheetValue.Collapsed, to = BottomSheetValue.Expanded)
+            )
+            .isEqualTo(0f)
 
         scope.launch { state.expand() }
         rule.mainClock.advanceTimeByFrame() // Start dispatching and running the animation
 
         repeat(amountOfFramesForAnimation) { frame ->
             val frameFraction = (frame / amountOfFramesForAnimation.toFloat())
-            val collapsedToExpandedProgress = state.progress(
-                from = BottomSheetValue.Collapsed, to = BottomSheetValue.Expanded
-            )
+            val collapsedToExpandedProgress =
+                state.progress(from = BottomSheetValue.Collapsed, to = BottomSheetValue.Expanded)
             assertThat(collapsedToExpandedProgress).isWithin(0.001f).of(frameFraction)
             rule.mainClock.advanceTimeByFrame()
         }
@@ -715,9 +677,8 @@
 
         repeat(amountOfFramesForAnimation) { frame ->
             val frameFraction = (frame / amountOfFramesForAnimation.toFloat())
-            val collapsedToExpandedProgress = state.progress(
-                from = BottomSheetValue.Collapsed, to = BottomSheetValue.Expanded
-            )
+            val collapsedToExpandedProgress =
+                state.progress(from = BottomSheetValue.Collapsed, to = BottomSheetValue.Expanded)
             assertThat(collapsedToExpandedProgress).isWithin(0.001f).of(1 - frameFraction)
             rule.mainClock.advanceTimeByFrame()
         }
diff --git a/compose/material/material/src/androidInstrumentedTest/kotlin/androidx/compose/material/ButtonScreenshotTest.kt b/compose/material/material/src/androidInstrumentedTest/kotlin/androidx/compose/material/ButtonScreenshotTest.kt
index 21f2cab..2a69f6a 100644
--- a/compose/material/material/src/androidInstrumentedTest/kotlin/androidx/compose/material/ButtonScreenshotTest.kt
+++ b/compose/material/material/src/androidInstrumentedTest/kotlin/androidx/compose/material/ButtonScreenshotTest.kt
@@ -53,40 +53,33 @@
 @OptIn(ExperimentalTestApi::class)
 class ButtonScreenshotTest {
 
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
-    @get:Rule
-    val screenshotRule = AndroidXScreenshotTestRule(GOLDEN_MATERIAL)
+    @get:Rule val screenshotRule = AndroidXScreenshotTestRule(GOLDEN_MATERIAL)
 
     // TODO(b/267253920): Add a compose test API to set/reset InputMode.
     @After
-    fun resetTouchMode() = with(InstrumentationRegistry.getInstrumentation()) {
-        if (SDK_INT < 33) setInTouchMode(true) else resetInTouchMode()
-    }
+    fun resetTouchMode() =
+        with(InstrumentationRegistry.getInstrumentation()) {
+            if (SDK_INT < 33) setInTouchMode(true) else resetInTouchMode()
+        }
 
     @Test
     fun default_button() {
-        rule.setMaterialContent {
-            Button(onClick = { }) {
-                Text("Button")
-            }
-        }
+        rule.setMaterialContent { Button(onClick = {}) { Text("Button") } }
 
-        rule.onNode(hasClickAction())
+        rule
+            .onNode(hasClickAction())
             .captureToImage()
             .assertAgainstGolden(screenshotRule, "button_default")
     }
 
     @Test
     fun disabled_button() {
-        rule.setMaterialContent {
-            Button(onClick = { }, enabled = false) {
-                Text("Button")
-            }
-        }
+        rule.setMaterialContent { Button(onClick = {}, enabled = false) { Text("Button") } }
 
-        rule.onNodeWithText("Button")
+        rule
+            .onNodeWithText("Button")
             .captureToImage()
             .assertAgainstGolden(screenshotRule, "button_disabled")
     }
@@ -94,14 +87,11 @@
     @Test
     fun ripple() {
         rule.setMaterialContent {
-            Box(Modifier.requiredSize(200.dp, 100.dp).wrapContentSize()) {
-                Button(onClick = { }) { }
-            }
+            Box(Modifier.requiredSize(200.dp, 100.dp).wrapContentSize()) { Button(onClick = {}) {} }
         }
 
         // Start ripple
-        rule.onNode(hasClickAction())
-            .performTouchInput { down(center) }
+        rule.onNode(hasClickAction()).performTouchInput { down(center) }
 
         rule.waitForIdle()
         // Ripples are drawn on the RenderThread, not the main (UI) thread, so we can't
@@ -109,27 +99,20 @@
         // finished animating.
         Thread.sleep(300)
 
-        rule.onRoot()
-            .captureToImage()
-            .assertAgainstGolden(screenshotRule, "button_ripple")
+        rule.onRoot().captureToImage().assertAgainstGolden(screenshotRule, "button_ripple")
     }
 
     @Test
     fun hover() {
         rule.setMaterialContent {
-            Box(Modifier.requiredSize(200.dp, 100.dp).wrapContentSize()) {
-                Button(onClick = { }) { }
-            }
+            Box(Modifier.requiredSize(200.dp, 100.dp).wrapContentSize()) { Button(onClick = {}) {} }
         }
 
-        rule.onNode(hasClickAction())
-            .performMouseInput { enter(center) }
+        rule.onNode(hasClickAction()).performMouseInput { enter(center) }
 
         rule.waitForIdle()
 
-        rule.onRoot()
-            .captureToImage()
-            .assertAgainstGolden(screenshotRule, "button_hover")
+        rule.onRoot().captureToImage().assertAgainstGolden(screenshotRule, "button_hover")
     }
 
     @Test
@@ -140,11 +123,7 @@
         rule.setMaterialContent {
             localInputModeManager = LocalInputModeManager.current
             Box(Modifier.requiredSize(200.dp, 100.dp).wrapContentSize()) {
-                Button(
-                    onClick = { },
-                    modifier = Modifier
-                        .focusRequester(focusRequester)
-                ) { }
+                Button(onClick = {}, modifier = Modifier.focusRequester(focusRequester)) {}
             }
         }
 
@@ -156,8 +135,6 @@
 
         rule.waitForIdle()
 
-        rule.onRoot()
-            .captureToImage()
-            .assertAgainstGolden(screenshotRule, "button_focus")
+        rule.onRoot().captureToImage().assertAgainstGolden(screenshotRule, "button_focus")
     }
 }
diff --git a/compose/material/material/src/androidInstrumentedTest/kotlin/androidx/compose/material/ButtonTest.kt b/compose/material/material/src/androidInstrumentedTest/kotlin/androidx/compose/material/ButtonTest.kt
index 863e352..cb3a4b0 100644
--- a/compose/material/material/src/androidInstrumentedTest/kotlin/androidx/compose/material/ButtonTest.kt
+++ b/compose/material/material/src/androidInstrumentedTest/kotlin/androidx/compose/material/ButtonTest.kt
@@ -88,20 +88,18 @@
 @RunWith(AndroidJUnit4::class)
 class ButtonTest {
 
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
     @Test
     fun defaultSemantics() {
         rule.setMaterialContent {
             Box {
-                Button(modifier = Modifier.testTag("myButton"), onClick = {}) {
-                    Text("myButton")
-                }
+                Button(modifier = Modifier.testTag("myButton"), onClick = {}) { Text("myButton") }
             }
         }
 
-        rule.onNodeWithTag("myButton")
+        rule
+            .onNodeWithTag("myButton")
             .assert(SemanticsMatcher.expectValue(SemanticsProperties.Role, Role.Button))
             .assertIsEnabled()
     }
@@ -116,7 +114,8 @@
             }
         }
 
-        rule.onNodeWithTag("myButton")
+        rule
+            .onNodeWithTag("myButton")
             .assert(SemanticsMatcher.expectValue(SemanticsProperties.Role, Role.Button))
             .assertIsNotEnabled()
     }
@@ -127,22 +126,13 @@
         val onClick: () -> Unit = { ++counter }
         val text = "myButton"
 
-        rule.setMaterialContent {
-            Box {
-                Button(onClick = onClick) {
-                    Text(text)
-                }
-            }
-        }
+        rule.setMaterialContent { Box { Button(onClick = onClick) { Text(text) } } }
 
         // TODO(b/129400818): this actually finds the text, not the button as
         // merge semantics aren't implemented yet
-        rule.onNodeWithText(text)
-            .performClick()
+        rule.onNodeWithText(text).performClick()
 
-        rule.runOnIdle {
-            assertThat(counter).isEqualTo(1)
-        }
+        rule.runOnIdle { assertThat(counter).isEqualTo(1) }
     }
 
     @Test
@@ -158,7 +148,8 @@
                 }
             }
         }
-        rule.onNodeWithTag(tag)
+        rule
+            .onNodeWithTag(tag)
             // Confirm the button starts off enabled, with a click action
             .assertHasClickAction()
             .assertIsEnabled()
@@ -191,16 +182,14 @@
             }
         }
 
-        rule.onNodeWithTag(button1Tag)
-            .performClick()
+        rule.onNodeWithTag(button1Tag).performClick()
 
         rule.runOnIdle {
             assertThat(button1Counter).isEqualTo(1)
             assertThat(button2Counter).isEqualTo(0)
         }
 
-        rule.onNodeWithTag(button2Tag)
-            .performClick()
+        rule.onNodeWithTag(button2Tag).performClick()
 
         rule.runOnIdle {
             assertThat(button1Counter).isEqualTo(1)
@@ -209,35 +198,25 @@
     }
 
     @Test
-    fun buttonHeightIsFromSpec(): Unit = with(rule.density) {
-        if (rule.density.fontScale > 1f) {
-            // This test can be reasonable failing on the non default font scales
-            // so lets skip it.
-            return
-        }
-        rule.setMaterialContent {
-            Button(onClick = {}) {
-                Text("Test button")
+    fun buttonHeightIsFromSpec(): Unit =
+        with(rule.density) {
+            if (rule.density.fontScale > 1f) {
+                // This test can be reasonable failing on the non default font scales
+                // so lets skip it.
+                return
             }
-        }
+            rule.setMaterialContent { Button(onClick = {}) { Text("Test button") } }
 
-        rule.onNode(hasClickAction())
-            .getBoundsInRoot().height.assertIsEqualTo(36.dp, "height")
-    }
+            rule.onNode(hasClickAction()).getBoundsInRoot().height.assertIsEqualTo(36.dp, "height")
+        }
 
     @Test
     fun ButtonWithLargeFontSizeIsLargerThenMinHeight() {
         rule.setMaterialContent {
-            Button(onClick = {}) {
-                Text(
-                    text = "Test button",
-                    fontSize = 50.sp
-                )
-            }
+            Button(onClick = {}) { Text(text = "Test button", fontSize = 50.sp) }
         }
 
-        rule.onNode(hasClickAction())
-            .assertHeightIsAtLeast(37.dp)
+        rule.onNode(hasClickAction()).assertHeightIsAtLeast(37.dp)
     }
 
     @Test
@@ -305,7 +284,8 @@
             }
         }
 
-        rule.onNodeWithTag("myButton")
+        rule
+            .onNodeWithTag("myButton")
             .captureToImage()
             .assertShape(
                 density = rule.density,
@@ -322,9 +302,7 @@
         var content = Color.Transparent
         rule.setMaterialContent {
             onPrimary = MaterialTheme.colors.onPrimary
-            Button(onClick = {}) {
-                content = LocalContentColor.current
-            }
+            Button(onClick = {}) { content = LocalContentColor.current }
         }
 
         assertThat(content).isEqualTo(onPrimary)
@@ -336,9 +314,7 @@
         var content = Color.Transparent
         rule.setMaterialContent {
             primary = MaterialTheme.colors.primary
-            OutlinedButton(onClick = {}) {
-                content = LocalContentColor.current
-            }
+            OutlinedButton(onClick = {}) { content = LocalContentColor.current }
         }
 
         assertThat(content).isEqualTo(primary)
@@ -350,9 +326,7 @@
         var content = Color.Transparent
         rule.setMaterialContent {
             primary = MaterialTheme.colors.primary
-            TextButton(onClick = {}) {
-                content = LocalContentColor.current
-            }
+            TextButton(onClick = {}) { content = LocalContentColor.current }
         }
 
         assertThat(content).isEqualTo(primary)
@@ -375,7 +349,8 @@
             ) {}
         }
 
-        rule.onNodeWithTag("myButton")
+        rule
+            .onNodeWithTag("myButton")
             .captureToImage()
             .assertShape(
                 density = rule.density,
@@ -399,14 +374,13 @@
                 modifier = Modifier.testTag("myButton"),
                 onClick = {},
                 enabled = false,
-                colors = ButtonDefaults.buttonColors(
-                    backgroundColor = Color.Red
-                ),
+                colors = ButtonDefaults.buttonColors(backgroundColor = Color.Red),
                 shape = RectangleShape
             ) {}
         }
 
-        rule.onNodeWithTag("myButton")
+        rule
+            .onNodeWithTag("myButton")
             .captureToImage()
             .assertShape(
                 density = rule.density,
@@ -433,7 +407,8 @@
             ) {}
         }
 
-        rule.onNodeWithTag("myButton")
+        rule
+            .onNodeWithTag("myButton")
             .captureToImage()
             .assertShape(
                 density = rule.density,
@@ -460,7 +435,8 @@
             ) {}
         }
 
-        rule.onNodeWithTag("myButton")
+        rule
+            .onNodeWithTag("myButton")
             .captureToImage()
             .assertShape(
                 density = rule.density,
@@ -527,10 +503,7 @@
         rule.setMaterialContent {
             Box {
                 Button({}, Modifier.onGloballyPositioned { buttonCoordinates = it }) {
-                    Box(
-                        Modifier.size(2.dp)
-                            .onGloballyPositioned { contentCoordinates = it }
-                    )
+                    Box(Modifier.size(2.dp).onGloballyPositioned { contentCoordinates = it })
                 }
             }
         }
@@ -560,13 +533,12 @@
             }
         }
 
-        rule.onNodeWithTag("button")
-            .apply {
-                with(getBoundsInRoot()) {
-                    width.assertIsEqualTo(20.dp, "width")
-                    height.assertIsEqualTo(15.dp, "height")
-                }
+        rule.onNodeWithTag("button").apply {
+            with(getBoundsInRoot()) {
+                width.assertIsEqualTo(20.dp, "width")
+                height.assertIsEqualTo(15.dp, "height")
             }
+        }
     }
 
     @Test
@@ -583,9 +555,10 @@
 
                 Button(
                     onClick = {},
-                    modifier = Modifier.weight(1f).onGloballyPositioned {
-                        buttonBounds = it.boundsInRoot()
-                    }
+                    modifier =
+                        Modifier.weight(1f).onGloballyPositioned {
+                            buttonBounds = it.boundsInRoot()
+                        }
                 ) {
                     Text("Button")
                 }
@@ -606,9 +579,7 @@
         rule.setMaterialContent {
             Button(
                 onClick = {},
-                modifier = Modifier.onGloballyPositioned {
-                    buttonBounds = it.boundsInRoot()
-                }
+                modifier = Modifier.onGloballyPositioned { buttonBounds = it.boundsInRoot() }
             ) {
                 Spacer(
                     Modifier.requiredSize(10.dp).onGloballyPositioned {
@@ -644,14 +615,13 @@
             }
         }
 
-        rule.onNodeWithTag(tag)
+        rule
+            .onNodeWithTag(tag)
             .assertWidthIsEqualTo(10.dp)
             .assertHeightIsEqualTo(10.dp)
             .assertTouchWidthIsEqualTo(48.dp)
             .assertTouchHeightIsEqualTo(48.dp)
-            .performTouchInput {
-                click(Offset(-1f, -1f))
-            }
+            .performTouchInput { click(Offset(-1f, -1f)) }
 
         assertThat(clicked).isTrue()
     }
@@ -665,20 +635,16 @@
         rule.setMaterialContent {
             Box {
                 button(Modifier.onGloballyPositioned { parentCoordinates = it }) {
-                    Text(
-                        "Test button",
-                        Modifier.onGloballyPositioned { childCoordinates = it }
-                    )
+                    Text("Test button", Modifier.onGloballyPositioned { childCoordinates = it })
                 }
             }
         }
 
         rule.runOnIdle {
-            val topLeft = childCoordinates!!.localToWindow(Offset.Zero).x -
-                parentCoordinates!!.localToWindow(Offset.Zero).x
-            val currentPadding = with(rule.density) {
-                padding.roundToPx().toFloat()
-            }
+            val topLeft =
+                childCoordinates!!.localToWindow(Offset.Zero).x -
+                    parentCoordinates!!.localToWindow(Offset.Zero).x
+            val currentPadding = with(rule.density) { padding.roundToPx().toFloat() }
             assertThat(currentPadding).isEqualTo(topLeft)
         }
     }
diff --git a/compose/material/material/src/androidInstrumentedTest/kotlin/androidx/compose/material/CardTest.kt b/compose/material/material/src/androidInstrumentedTest/kotlin/androidx/compose/material/CardTest.kt
index e75252f..59dbf1d 100644
--- a/compose/material/material/src/androidInstrumentedTest/kotlin/androidx/compose/material/CardTest.kt
+++ b/compose/material/material/src/androidInstrumentedTest/kotlin/androidx/compose/material/CardTest.kt
@@ -63,8 +63,7 @@
 @RunWith(AndroidJUnit4::class)
 class CardTest {
 
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
     @SdkSuppress(minSdkVersion = Build.VERSION_CODES.O)
     @Test
@@ -79,9 +78,8 @@
                     cardColor = MaterialTheme.colors.surface
                     CompositionLocalProvider(LocalShapes provides Shapes(medium = shape)) {
                         Card(
-                            modifier = Modifier
-                                .semantics(mergeDescendants = true) {}
-                                .testTag("card"),
+                            modifier =
+                                Modifier.semantics(mergeDescendants = true) {}.testTag("card"),
                             elevation = 0.dp
                         ) {
                             Box(Modifier.size(50.dp, 50.dp))
@@ -91,7 +89,8 @@
             }
         }
 
-        rule.onNodeWithTag("card")
+        rule
+            .onNodeWithTag("card")
             .captureToImage()
             .assertShape(
                 density = rule.density,
@@ -107,15 +106,13 @@
     fun clickableOverload_semantics() {
         val count = mutableStateOf(0)
         rule.setMaterialContent {
-            Card(
-                onClick = { count.value += 1 },
-                modifier = Modifier.testTag("card")
-            ) {
+            Card(onClick = { count.value += 1 }, modifier = Modifier.testTag("card")) {
                 Text("${count.value}")
                 Spacer(Modifier.size(30.dp))
             }
         }
-        rule.onNodeWithTag("card")
+        rule
+            .onNodeWithTag("card")
             .assertHasClickAction()
             .assert(SemanticsMatcher.keyNotDefined(SemanticsProperties.Role))
             .assertIsEnabled()
@@ -130,20 +127,14 @@
     fun clickableOverload_clickAction() {
         val count = mutableStateOf(0f)
         rule.setMaterialContent {
-            Card(
-                modifier = Modifier.testTag("card"),
-                onClick = { count.value += 1 }
-            ) {
+            Card(modifier = Modifier.testTag("card"), onClick = { count.value += 1 }) {
                 Spacer(Modifier.size(30.dp))
             }
         }
-        rule.onNodeWithTag("card")
-            .performClick()
+        rule.onNodeWithTag("card").performClick()
         Truth.assertThat(count.value).isEqualTo(1)
 
-        rule.onNodeWithTag("card")
-            .performClick()
-            .performClick()
+        rule.onNodeWithTag("card").performClick().performClick()
         Truth.assertThat(count.value).isEqualTo(3)
     }
 
@@ -161,19 +152,12 @@
                 Spacer(Modifier.size(30.dp))
             }
         }
-        rule.onNodeWithTag("card")
-            .assertIsEnabled()
-            .performClick()
+        rule.onNodeWithTag("card").assertIsEnabled().performClick()
 
         Truth.assertThat(count.value).isEqualTo(1)
-        rule.runOnIdle {
-            enabled.value = false
-        }
+        rule.runOnIdle { enabled.value = false }
 
-        rule.onNodeWithTag("card")
-            .assertIsNotEnabled()
-            .performClick()
-            .performClick()
+        rule.onNodeWithTag("card").assertIsNotEnabled().performClick().performClick()
         Truth.assertThat(count.value).isEqualTo(1)
     }
 
@@ -197,24 +181,18 @@
 
         val interactions = mutableListOf<Interaction>()
 
-        scope!!.launch {
-            interactionSource.interactions.collect { interactions.add(it) }
-        }
+        scope!!.launch { interactionSource.interactions.collect { interactions.add(it) } }
 
-        rule.runOnIdle {
-            Truth.assertThat(interactions).isEmpty()
-        }
+        rule.runOnIdle { Truth.assertThat(interactions).isEmpty() }
 
-        rule.onNodeWithTag("card")
-            .performTouchInput { down(center) }
+        rule.onNodeWithTag("card").performTouchInput { down(center) }
 
         rule.runOnIdle {
             Truth.assertThat(interactions).hasSize(1)
             Truth.assertThat(interactions.first()).isInstanceOf(PressInteraction.Press::class.java)
         }
 
-        rule.onNodeWithTag("card")
-            .performTouchInput { up() }
+        rule.onNodeWithTag("card").performTouchInput { up() }
 
         rule.runOnIdle {
             Truth.assertThat(interactions).hasSize(2)
@@ -239,9 +217,7 @@
                 Card(Modifier.fillMaxSize()) {}
             }
         }
-        rule.onNodeWithTag("clickable")
-            .assertHasClickAction()
-            .performClick()
+        rule.onNodeWithTag("clickable").assertHasClickAction().performClick()
         // still 0
         Truth.assertThat(state.value).isEqualTo(0)
     }
diff --git a/compose/material/material/src/androidInstrumentedTest/kotlin/androidx/compose/material/CheckboxScreenshotTest.kt b/compose/material/material/src/androidInstrumentedTest/kotlin/androidx/compose/material/CheckboxScreenshotTest.kt
index 8fde111..ec6f4b5 100644
--- a/compose/material/material/src/androidInstrumentedTest/kotlin/androidx/compose/material/CheckboxScreenshotTest.kt
+++ b/compose/material/material/src/androidInstrumentedTest/kotlin/androidx/compose/material/CheckboxScreenshotTest.kt
@@ -54,17 +54,16 @@
 @OptIn(ExperimentalTestApi::class)
 class CheckboxScreenshotTest {
 
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
-    @get:Rule
-    val screenshotRule = AndroidXScreenshotTestRule(GOLDEN_MATERIAL)
+    @get:Rule val screenshotRule = AndroidXScreenshotTestRule(GOLDEN_MATERIAL)
 
     // TODO(b/267253920): Add a compose test API to set/reset InputMode.
     @After
-    fun resetTouchMode() = with(InstrumentationRegistry.getInstrumentation()) {
-        if (SDK_INT < 33) setInTouchMode(true) else resetInTouchMode()
-    }
+    fun resetTouchMode() =
+        with(InstrumentationRegistry.getInstrumentation()) {
+            if (SDK_INT < 33) setInTouchMode(true) else resetInTouchMode()
+        }
 
     val wrap = Modifier.wrapContentSize(Alignment.TopStart)
 
@@ -75,9 +74,7 @@
     @Test
     fun checkBoxTest_checked() {
         rule.setMaterialContent {
-            Box(wrap.testTag(wrapperTestTag)) {
-                Checkbox(checked = true, onCheckedChange = { })
-            }
+            Box(wrap.testTag(wrapperTestTag)) { Checkbox(checked = true, onCheckedChange = {}) }
         }
         assertToggeableAgainstGolden("checkbox_checked")
     }
@@ -86,7 +83,7 @@
     fun checkBoxTest_unchecked() {
         rule.setMaterialContent {
             Box(wrap.testTag(wrapperTestTag)) {
-                Checkbox(modifier = wrap, checked = false, onCheckedChange = { })
+                Checkbox(modifier = wrap, checked = false, onCheckedChange = {})
             }
         }
         assertToggeableAgainstGolden("checkbox_unchecked")
@@ -96,13 +93,11 @@
     fun checkBoxTest_pressed() {
         rule.setMaterialContent {
             Box(wrap.testTag(wrapperTestTag)) {
-                Checkbox(modifier = wrap, checked = false, onCheckedChange = { })
+                Checkbox(modifier = wrap, checked = false, onCheckedChange = {})
             }
         }
 
-        rule.onNode(isToggleable()).performTouchInput {
-            down(center)
-        }
+        rule.onNode(isToggleable()).performTouchInput { down(center) }
 
         // Ripples are drawn on the RenderThread, not the main (UI) thread, so we can't wait for
         // synchronization. Instead just wait until after the ripples are finished animating.
@@ -129,7 +124,7 @@
     fun checkBoxTest_disabled_checked() {
         rule.setMaterialContent {
             Box(wrap.testTag(wrapperTestTag)) {
-                Checkbox(modifier = wrap, checked = true, enabled = false, onCheckedChange = { })
+                Checkbox(modifier = wrap, checked = true, enabled = false, onCheckedChange = {})
             }
         }
         assertToggeableAgainstGolden("checkbox_disabled_checked")
@@ -139,7 +134,7 @@
     fun checkBoxTest_disabled_unchecked() {
         rule.setMaterialContent {
             Box(wrap.testTag(wrapperTestTag)) {
-                Checkbox(modifier = wrap, checked = false, enabled = false, onCheckedChange = { })
+                Checkbox(modifier = wrap, checked = false, enabled = false, onCheckedChange = {})
             }
         }
         assertToggeableAgainstGolden("checkbox_disabled_unchecked")
@@ -178,9 +173,7 @@
         // Because Ripples are drawn on the RenderThread, it is hard to synchronize them with
         // Compose animations, so instead just manually change the value instead of triggering
         // and trying to screenshot a ripple
-        rule.runOnIdle {
-            isChecked.value = true
-        }
+        rule.runOnIdle { isChecked.value = true }
 
         rule.mainClock.advanceTimeByFrame()
         rule.waitForIdle() // Wait for measure
@@ -207,9 +200,7 @@
         // Because Ripples are drawn on the RenderThread, it is hard to synchronize them with
         // Compose animations, so instead just manually change the value instead of triggering
         // and trying to screenshot a ripple
-        rule.runOnIdle {
-            isChecked.value = false
-        }
+        rule.runOnIdle { isChecked.value = false }
 
         rule.mainClock.advanceTimeByFrame()
         rule.waitForIdle() // Wait for measure
@@ -222,16 +213,11 @@
     fun checkBoxTest_hover() {
         rule.setMaterialContent {
             Box(wrap.testTag(wrapperTestTag)) {
-                Checkbox(
-                    modifier = wrap,
-                    checked = true,
-                    onCheckedChange = { }
-                )
+                Checkbox(modifier = wrap, checked = true, onCheckedChange = {})
             }
         }
 
-        rule.onNode(isToggleable())
-            .performMouseInput { enter(center) }
+        rule.onNode(isToggleable()).performMouseInput { enter(center) }
 
         rule.waitForIdle()
 
@@ -247,10 +233,9 @@
             localInputModeManager = LocalInputModeManager.current
             Box(wrap.testTag(wrapperTestTag)) {
                 Checkbox(
-                    modifier = wrap
-                        .focusRequester(focusRequester),
+                    modifier = wrap.focusRequester(focusRequester),
                     checked = true,
-                    onCheckedChange = { }
+                    onCheckedChange = {}
                 )
             }
         }
@@ -268,7 +253,8 @@
 
     private fun assertToggeableAgainstGolden(goldenName: String) {
         // TODO: replace with find(isToggeable()) after b/157687898 is fixed
-        rule.onNodeWithTag(wrapperTestTag)
+        rule
+            .onNodeWithTag(wrapperTestTag)
             .captureToImage()
             .assertAgainstGolden(screenshotRule, goldenName)
     }
diff --git a/compose/material/material/src/androidInstrumentedTest/kotlin/androidx/compose/material/CheckboxTest.kt b/compose/material/material/src/androidInstrumentedTest/kotlin/androidx/compose/material/CheckboxTest.kt
index c30c491..fd5c606 100644
--- a/compose/material/material/src/androidInstrumentedTest/kotlin/androidx/compose/material/CheckboxTest.kt
+++ b/compose/material/material/src/androidInstrumentedTest/kotlin/androidx/compose/material/CheckboxTest.kt
@@ -65,8 +65,7 @@
 @RunWith(AndroidJUnit4::class)
 class CheckboxTest {
 
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
     private val defaultTag = "myCheckbox"
 
@@ -79,12 +78,14 @@
             }
         }
 
-        rule.onNodeWithTag("checkboxUnchecked")
+        rule
+            .onNodeWithTag("checkboxUnchecked")
             .assert(SemanticsMatcher.expectValue(SemanticsProperties.Role, Role.Checkbox))
             .assertIsEnabled()
             .assertIsOff()
 
-        rule.onNodeWithTag("checkboxChecked")
+        rule
+            .onNodeWithTag("checkboxChecked")
             .assert(SemanticsMatcher.expectValue(SemanticsProperties.Role, Role.Checkbox))
             .assertIsEnabled()
             .assertIsOn()
@@ -97,10 +98,7 @@
             Checkbox(checked, onCheckedChange, modifier = Modifier.testTag(defaultTag))
         }
 
-        rule.onNodeWithTag(defaultTag)
-            .assertIsOff()
-            .performClick()
-            .assertIsOn()
+        rule.onNodeWithTag(defaultTag).assertIsOff().performClick().assertIsOn()
     }
 
     @Test
@@ -110,7 +108,8 @@
             Checkbox(checked, onCheckedChange, modifier = Modifier.testTag(defaultTag))
         }
 
-        rule.onNodeWithTag(defaultTag)
+        rule
+            .onNodeWithTag(defaultTag)
             .assertIsOff()
             .performClick()
             .assertIsOn()
@@ -134,12 +133,10 @@
             }
         }
 
-        rule.onNodeWithTag(defaultTag)
-            .assertHasClickAction()
+        rule.onNodeWithTag(defaultTag).assertHasClickAction()
 
         // Check not merged into parent
-        rule.onNodeWithTag(parentTag)
-            .assert(isNotFocusable())
+        rule.onNodeWithTag(parentTag).assert(isNotFocusable())
     }
 
     @Test
@@ -147,53 +144,34 @@
         rule.setMaterialContent {
             val (checked, _) = remember { mutableStateOf(false) }
             Box(Modifier.semantics(mergeDescendants = true) {}.testTag(defaultTag)) {
-                Checkbox(
-                    checked,
-                    null,
-                    modifier = Modifier.semantics { focused = true }
-                )
+                Checkbox(checked, null, modifier = Modifier.semantics { focused = true })
             }
         }
 
-        rule.onNodeWithTag(defaultTag)
+        rule
+            .onNodeWithTag(defaultTag)
             .assertHasNoClickAction()
             .assert(isFocusable()) // Check merged into parent
     }
 
     @Test
     fun checkBoxTest_MaterialSize_WhenChecked_minimumTouchTarget() {
-        materialSizeTestForValue(
-            checkboxValue = On,
-            clickable = true,
-            minimumTouchTarget = true
-        )
+        materialSizeTestForValue(checkboxValue = On, clickable = true, minimumTouchTarget = true)
     }
 
     @Test
     fun checkBoxTest_MaterialSize_WhenChecked_withoutMinimumTouchTarget() {
-        materialSizeTestForValue(
-            checkboxValue = On,
-            clickable = true,
-            minimumTouchTarget = false
-        )
+        materialSizeTestForValue(checkboxValue = On, clickable = true, minimumTouchTarget = false)
     }
 
     @Test
     fun checkBoxTest_MaterialSize_WhenUnchecked_minimumTouchTarget() {
-        materialSizeTestForValue(
-            checkboxValue = Off,
-            clickable = true,
-            minimumTouchTarget = true
-        )
+        materialSizeTestForValue(checkboxValue = Off, clickable = true, minimumTouchTarget = true)
     }
 
     @Test
     fun checkBoxTest_MaterialSize_WhenUnchecked_withoutMinimumTouchTarget() {
-        materialSizeTestForValue(
-            checkboxValue = Off,
-            clickable = true,
-            minimumTouchTarget = false
-        )
+        materialSizeTestForValue(checkboxValue = Off, clickable = true, minimumTouchTarget = false)
     }
 
     @Test
@@ -216,38 +194,22 @@
 
     @Test
     fun checkBoxTest_MaterialSize_WhenChecked_notClickable_minimumTouchTarget() {
-        materialSizeTestForValue(
-            checkboxValue = On,
-            clickable = false,
-            minimumTouchTarget = true
-        )
+        materialSizeTestForValue(checkboxValue = On, clickable = false, minimumTouchTarget = true)
     }
 
     @Test
     fun checkBoxTest_MaterialSize_WhenChecked_notClickable_withoutMinimumTouchTarget() {
-        materialSizeTestForValue(
-            checkboxValue = On,
-            clickable = false,
-            minimumTouchTarget = false
-        )
+        materialSizeTestForValue(checkboxValue = On, clickable = false, minimumTouchTarget = false)
     }
 
     @Test
     fun checkBoxTest_MaterialSize_WhenUnchecked_notClickable_minimumTouchTarget() {
-        materialSizeTestForValue(
-            checkboxValue = Off,
-            clickable = false,
-            minimumTouchTarget = true
-        )
+        materialSizeTestForValue(checkboxValue = Off, clickable = false, minimumTouchTarget = true)
     }
 
     @Test
     fun checkBoxTest_MaterialSize_WhenUnchecked_notClickable_withoutMinimumTouchTarget() {
-        materialSizeTestForValue(
-            checkboxValue = Off,
-            clickable = false,
-            minimumTouchTarget = false
-        )
+        materialSizeTestForValue(checkboxValue = Off, clickable = false, minimumTouchTarget = false)
     }
 
     @Test
@@ -281,7 +243,10 @@
                 ) {
                     TriStateCheckbox(
                         state = checkboxValue,
-                        onClick = if (clickable) { {} } else null,
+                        onClick =
+                            if (clickable) {
+                                {}
+                            } else null,
                         enabled = false
                     )
                 }
@@ -296,27 +261,28 @@
     }
 
     @Test
-    fun checkBoxTest_clickInMinimumTouchTarget(): Unit = with(rule.density) {
-        val tag = "switch"
-        var state by mutableStateOf(Off)
-        rule.setMaterialContent {
-            // Box is needed because otherwise the control will be expanded to fill its parent
-            Box(Modifier.fillMaxSize()) {
-                TriStateCheckbox(
-                    state = state,
-                    onClick = { state = On },
-                    modifier = Modifier.align(Alignment.Center).requiredSize(2.dp).testTag(tag)
-                )
+    fun checkBoxTest_clickInMinimumTouchTarget(): Unit =
+        with(rule.density) {
+            val tag = "switch"
+            var state by mutableStateOf(Off)
+            rule.setMaterialContent {
+                // Box is needed because otherwise the control will be expanded to fill its parent
+                Box(Modifier.fillMaxSize()) {
+                    TriStateCheckbox(
+                        state = state,
+                        onClick = { state = On },
+                        modifier = Modifier.align(Alignment.Center).requiredSize(2.dp).testTag(tag)
+                    )
+                }
             }
+            rule
+                .onNodeWithTag(tag)
+                .assertIsOff()
+                .assertWidthIsEqualTo(2.dp)
+                .assertHeightIsEqualTo(2.dp)
+                .assertTouchWidthIsEqualTo(48.dp)
+                .assertTouchHeightIsEqualTo(48.dp)
+                .performTouchInput { click(position = Offset(-1f, -1f)) }
+                .assertIsOn()
         }
-        rule.onNodeWithTag(tag)
-            .assertIsOff()
-            .assertWidthIsEqualTo(2.dp)
-            .assertHeightIsEqualTo(2.dp)
-            .assertTouchWidthIsEqualTo(48.dp)
-            .assertTouchHeightIsEqualTo(48.dp)
-            .performTouchInput {
-                click(position = Offset(-1f, -1f))
-            }.assertIsOn()
-    }
 }
diff --git a/compose/material/material/src/androidInstrumentedTest/kotlin/androidx/compose/material/ChipScreenshotTest.kt b/compose/material/material/src/androidInstrumentedTest/kotlin/androidx/compose/material/ChipScreenshotTest.kt
index fdc00a0..4f423c56 100644
--- a/compose/material/material/src/androidInstrumentedTest/kotlin/androidx/compose/material/ChipScreenshotTest.kt
+++ b/compose/material/material/src/androidInstrumentedTest/kotlin/androidx/compose/material/ChipScreenshotTest.kt
@@ -41,20 +41,14 @@
 @OptIn(ExperimentalMaterialApi::class)
 class ChipScreenshotTest {
 
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
-    @get:Rule
-    val screenshotRule = AndroidXScreenshotTestRule(GOLDEN_MATERIAL)
+    @get:Rule val screenshotRule = AndroidXScreenshotTestRule(GOLDEN_MATERIAL)
 
     @Test
     fun actionChip() {
         rule.setMaterialContent {
-            Chip(
-                onClick = {},
-                enabled = true,
-                modifier = Modifier.testTag(TestTag)
-            ) {
+            Chip(onClick = {}, enabled = true, modifier = Modifier.testTag(TestTag)) {
                 Text("Action Chip")
             }
         }
@@ -64,11 +58,7 @@
     @Test
     fun actionChip_disabled() {
         rule.setMaterialContent {
-            Chip(
-                onClick = {},
-                enabled = false,
-                modifier = Modifier.testTag(TestTag)
-            ) {
+            Chip(onClick = {}, enabled = false, modifier = Modifier.testTag(TestTag)) {
                 Text("Action Chip")
             }
         }
@@ -136,10 +126,7 @@
                 onClick = {},
                 modifier = Modifier.testTag(TestTag),
                 leadingIcon = {
-                    Icon(
-                        Icons.Filled.Home,
-                        contentDescription = "Localized Description"
-                    )
+                    Icon(Icons.Filled.Home, contentDescription = "Localized Description")
                 },
                 selectedIcon = {
                     Icon(
@@ -197,10 +184,7 @@
                 enabled = false,
                 modifier = Modifier.testTag(TestTag),
                 leadingIcon = {
-                    Icon(
-                        Icons.Filled.Home,
-                        contentDescription = "Localized Description"
-                    )
+                    Icon(Icons.Filled.Home, contentDescription = "Localized Description")
                 },
                 selectedIcon = {
                     Icon(
@@ -232,7 +216,8 @@
     }
 
     private fun assertChipAgainstGolden(goldenIdentifier: String) {
-        rule.onNodeWithTag(TestTag)
+        rule
+            .onNodeWithTag(TestTag)
             .captureToImage()
             .assertAgainstGolden(screenshotRule, goldenIdentifier)
     }
diff --git a/compose/material/material/src/androidInstrumentedTest/kotlin/androidx/compose/material/ChipTest.kt b/compose/material/material/src/androidInstrumentedTest/kotlin/androidx/compose/material/ChipTest.kt
index 1694d7c..922ae7e 100644
--- a/compose/material/material/src/androidInstrumentedTest/kotlin/androidx/compose/material/ChipTest.kt
+++ b/compose/material/material/src/androidInstrumentedTest/kotlin/androidx/compose/material/ChipTest.kt
@@ -88,20 +88,18 @@
 @RunWith(AndroidJUnit4::class)
 @OptIn(ExperimentalMaterialApi::class)
 class ChipTest {
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
     @Test
     fun defaultSemantics() {
         rule.setMaterialContent {
             Box {
-                Chip(modifier = Modifier.testTag(TestChipTag), onClick = {}) {
-                    Text(TestChipTag)
-                }
+                Chip(modifier = Modifier.testTag(TestChipTag), onClick = {}) { Text(TestChipTag) }
             }
         }
 
-        rule.onNodeWithTag(TestChipTag)
+        rule
+            .onNodeWithTag(TestChipTag)
             .assert(SemanticsMatcher.expectValue(SemanticsProperties.Role, Role.Button))
             .assertIsEnabled()
             .assertHasClickAction()
@@ -111,17 +109,14 @@
     fun disabledSemantics() {
         rule.setMaterialContent {
             Box {
-                Chip(
-                    modifier = Modifier.testTag(TestChipTag),
-                    onClick = {},
-                    enabled = false
-                ) {
+                Chip(modifier = Modifier.testTag(TestChipTag), onClick = {}, enabled = false) {
                     Text(TestChipTag)
                 }
             }
         }
 
-        rule.onNodeWithTag(TestChipTag)
+        rule
+            .onNodeWithTag(TestChipTag)
             .assert(SemanticsMatcher.expectValue(SemanticsProperties.Role, Role.Button))
             .assertIsNotEnabled()
             .assertHasClickAction()
@@ -142,7 +137,8 @@
             }
         }
 
-        rule.onNodeWithTag(TestChipTag)
+        rule
+            .onNodeWithTag(TestChipTag)
             .assert(SemanticsMatcher.expectValue(SemanticsProperties.Role, Role.Checkbox))
             .assertIsNotEnabled()
             .assertHasClickAction()
@@ -155,19 +151,12 @@
         val text = "Test chip"
 
         rule.setMaterialContent {
-            Box {
-                Chip(onClick = onClick, modifier = Modifier.testTag(TestChipTag)) {
-                    Text(text)
-                }
-            }
+            Box { Chip(onClick = onClick, modifier = Modifier.testTag(TestChipTag)) { Text(text) } }
         }
 
-        rule.onNodeWithTag(TestChipTag)
-            .performClick()
+        rule.onNodeWithTag(TestChipTag).performClick()
 
-        rule.runOnIdle {
-            Truth.assertThat(counter).isEqualTo(1)
-        }
+        rule.runOnIdle { Truth.assertThat(counter).isEqualTo(1) }
     }
 
     @Test
@@ -185,7 +174,8 @@
                 }
             }
         }
-        rule.onNodeWithTag(TestChipTag)
+        rule
+            .onNodeWithTag(TestChipTag)
             // Confirm the chip starts off enabled, with a click action
             .assertHasClickAction()
             .assertIsEnabled()
@@ -211,7 +201,8 @@
                 }
             }
         }
-        rule.onNodeWithTag(TestChipTag)
+        rule
+            .onNodeWithTag(TestChipTag)
             // Confirm the filter chip starts off enabled, with a click action
             .assertHasClickAction()
             .assertIsEnabled()
@@ -226,29 +217,18 @@
         // This test can be reasonable failing on the non default font scales
         // so lets skip it.
         Assume.assumeTrue(rule.density.fontScale <= 1f)
-        rule.setMaterialContent {
-            Chip(onClick = {}) {
-                Text("Test chip")
-            }
-        }
+        rule.setMaterialContent { Chip(onClick = {}) { Text("Test chip") } }
 
-        rule.onNode(hasClickAction())
-            .assertHeightIsEqualTo(ChipDefaults.MinHeight)
+        rule.onNode(hasClickAction()).assertHeightIsEqualTo(ChipDefaults.MinHeight)
     }
 
     @Test
     fun withLargeFontSizeIsLargerThenMinHeight() {
         rule.setMaterialContent {
-            Chip(onClick = {}) {
-                Text(
-                    text = "Test chip",
-                    fontSize = 50.sp
-                )
-            }
+            Chip(onClick = {}) { Text(text = "Test chip", fontSize = 50.sp) }
         }
 
-        rule.onNode(hasClickAction())
-            .assertHeightIsAtLeast(ChipDefaults.MinHeight + 1.dp)
+        rule.onNode(hasClickAction()).assertHeightIsAtLeast(ChipDefaults.MinHeight + 1.dp)
     }
 
     @Test
@@ -298,16 +278,15 @@
             )
         }
 
-        rule.onNodeWithTag("Leading", useUnmergedTree = true)
+        rule
+            .onNodeWithTag("Leading", useUnmergedTree = true)
             .assertLeftPositionInRootIsEqualTo(4.dp)
-        rule.onNodeWithText("Test chip", useUnmergedTree = true)
-            .assertLeftPositionInRootIsEqualTo(
-                4.dp + ChipDefaults.LeadingIconSize + 8.dp
-            )
-        rule.onNodeWithTag("Trailing", useUnmergedTree = true)
-            .assertLeftPositionInRootIsEqualTo(
-                chipWidth - 8.dp - ChipDefaults.LeadingIconSize
-            )
+        rule
+            .onNodeWithText("Test chip", useUnmergedTree = true)
+            .assertLeftPositionInRootIsEqualTo(4.dp + ChipDefaults.LeadingIconSize + 8.dp)
+        rule
+            .onNodeWithTag("Trailing", useUnmergedTree = true)
+            .assertLeftPositionInRootIsEqualTo(chipWidth - 8.dp - ChipDefaults.LeadingIconSize)
     }
 
     @Test
@@ -316,14 +295,10 @@
         var content = Color.Unspecified
         rule.setMaterialContent {
             onSurface = MaterialTheme.colors.onSurface
-            Chip(onClick = {}) {
-                content = LocalContentColor.current
-            }
+            Chip(onClick = {}) { content = LocalContentColor.current }
         }
 
-        rule.runOnIdle {
-            Truth.assertThat(content).isEqualTo(onSurface)
-        }
+        rule.runOnIdle { Truth.assertThat(content).isEqualTo(onSurface) }
     }
 
     @SdkSuppress(minSdkVersion = Build.VERSION_CODES.O)
@@ -343,15 +318,15 @@
             ) {}
         }
 
-        rule.onNodeWithTag(TestChipTag)
+        rule
+            .onNodeWithTag(TestChipTag)
             .captureToImage()
             .assertShape(
                 density = rule.density,
                 horizontalPadding = 0.dp,
                 verticalPadding = 0.dp,
                 backgroundColor = surface,
-                shapeColor = onSurface.copy(0.38f * 0.12f * 0.87f)
-                    .compositeOver(surface)
+                shapeColor = onSurface.copy(0.38f * 0.12f * 0.87f).compositeOver(surface)
             )
     }
 
@@ -363,24 +338,17 @@
         rule.setMaterialContent {
             Chip(
                 onClick = {},
-                modifier = Modifier.onGloballyPositioned {
-                    chipBounds = it.boundsInRoot()
-                }
+                modifier = Modifier.onGloballyPositioned { chipBounds = it.boundsInRoot() }
             ) {
                 Spacer(
-                    Modifier
-                        .requiredSize(10.dp)
-                        .onGloballyPositioned {
-                            item1Bounds = it.boundsInRoot()
-                        }
+                    Modifier.requiredSize(10.dp).onGloballyPositioned {
+                        item1Bounds = it.boundsInRoot()
+                    }
                 )
                 Spacer(
-                    Modifier
-                        .requiredWidth(10.dp)
-                        .requiredHeight(5.dp)
-                        .onGloballyPositioned {
-                            item2Bounds = it.boundsInRoot()
-                        }
+                    Modifier.requiredWidth(10.dp).requiredHeight(5.dp).onGloballyPositioned {
+                        item2Bounds = it.boundsInRoot()
+                    }
                 )
             }
         }
@@ -405,7 +373,8 @@
             }
         }
 
-        rule.onNode(hasClickAction())
+        rule
+            .onNode(hasClickAction())
             .assertHeightIsEqualTo(ChipDefaults.MinHeight)
             .assertWidthIsEqualTo(labelWidth + horizontalPadding * 2)
     }
@@ -431,8 +400,10 @@
                     )
                 }
             ) {
-                Text("Long long long long long long long long long long long long long long" +
-                    "long long long long long long long long long long long long long long long")
+                Text(
+                    "Long long long long long long long long long long long long long long" +
+                        "long long long long long long long long long long long long long long long"
+                )
             }
         }
 
@@ -445,10 +416,8 @@
         rule.setMaterialContent {
             Box(Modifier.fillMaxSize()) {
                 Chip(
-                    modifier = Modifier
-                        .align(Alignment.Center)
-                        .testTag(TestChipTag)
-                        .requiredSize(10.dp),
+                    modifier =
+                        Modifier.align(Alignment.Center).testTag(TestChipTag).requiredSize(10.dp),
                     onClick = { clicked = !clicked }
                 ) {
                     Box(Modifier.size(10.dp))
@@ -456,14 +425,13 @@
             }
         }
 
-        rule.onNodeWithTag(TestChipTag)
+        rule
+            .onNodeWithTag(TestChipTag)
             .assertWidthIsEqualTo(10.dp)
             .assertHeightIsEqualTo(10.dp)
             .assertTouchWidthIsEqualTo(48.dp)
             .assertTouchHeightIsEqualTo(48.dp)
-            .performTouchInput {
-                click(Offset(-1f, -1f))
-            }
+            .performTouchInput { click(Offset(-1f, -1f)) }
 
         Truth.assertThat(clicked).isTrue()
     }
@@ -477,10 +445,7 @@
         rule.setMaterialContent {
             Box {
                 chip(Modifier.onGloballyPositioned { parentCoordinates = it }) {
-                    Text(
-                        "Test chip",
-                        Modifier.onGloballyPositioned { childCoordinates = it }
-                    )
+                    Text("Test chip", Modifier.onGloballyPositioned { childCoordinates = it })
                 }
             }
         }
@@ -492,16 +457,11 @@
             val topLeft =
                 childCoordinates!!.localToWindow(Offset.Zero).x -
                     parentCoordinates!!.localToWindow(Offset.Zero).x
-            val topRight = parentCoordinates!!.localToWindow(
-                Offset(
-                    parentBounds.right,
-                    parentBounds.top
-                )
-            ).x - childCoordinates!!.localToWindow(Offset(childBounds.right, childBounds.top)).x
+            val topRight =
+                parentCoordinates!!.localToWindow(Offset(parentBounds.right, parentBounds.top)).x -
+                    childCoordinates!!.localToWindow(Offset(childBounds.right, childBounds.top)).x
 
-            val expectedPadding = with(rule.density) {
-                padding.roundToPx().toFloat()
-            }
+            val expectedPadding = with(rule.density) { padding.roundToPx().toFloat() }
             Truth.assertThat(expectedPadding).isEqualTo(topLeft)
             Truth.assertThat(expectedPadding).isEqualTo(-topRight)
         }
diff --git a/compose/material/material/src/androidInstrumentedTest/kotlin/androidx/compose/material/ColorsTest.kt b/compose/material/material/src/androidInstrumentedTest/kotlin/androidx/compose/material/ColorsTest.kt
index 0e412bf..84c6526 100644
--- a/compose/material/material/src/androidInstrumentedTest/kotlin/androidx/compose/material/ColorsTest.kt
+++ b/compose/material/material/src/androidInstrumentedTest/kotlin/androidx/compose/material/ColorsTest.kt
@@ -30,12 +30,11 @@
 @RunWith(AndroidJUnit4::class)
 class ColorsTest {
 
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
     /**
-     * Test for switching between provided [Colors], ensuring that the existing colors objects
-     * are preserved. (b/182635582)
+     * Test for switching between provided [Colors], ensuring that the existing colors objects are
+     * preserved. (b/182635582)
      */
     @Test
     fun switchingBetweenColors() {
@@ -44,9 +43,7 @@
         val colorState = mutableStateOf(lightColors)
         var currentColors: Colors? = null
         rule.setContent {
-            MaterialTheme(colorState.value) {
-                Button(onReadColors = { currentColors = it })
-            }
+            MaterialTheme(colorState.value) { Button(onReadColors = { currentColors = it }) }
         }
 
         rule.runOnIdle {
diff --git a/compose/material/material/src/androidInstrumentedTest/kotlin/androidx/compose/material/ContentAlphaTest.kt b/compose/material/material/src/androidInstrumentedTest/kotlin/androidx/compose/material/ContentAlphaTest.kt
index 8276636..4033718 100644
--- a/compose/material/material/src/androidInstrumentedTest/kotlin/androidx/compose/material/ContentAlphaTest.kt
+++ b/compose/material/material/src/androidInstrumentedTest/kotlin/androidx/compose/material/ContentAlphaTest.kt
@@ -41,14 +41,11 @@
     companion object {
         @JvmStatic
         @Parameterized.Parameters(name = "{1}")
-        fun initColors() = arrayOf(
-            arrayOf(lightColors(), "Light theme"),
-            arrayOf(darkColors(), "Dark theme")
-        )
+        fun initColors() =
+            arrayOf(arrayOf(lightColors(), "Light theme"), arrayOf(darkColors(), "Dark theme"))
     }
 
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
     @Test
     fun noContentAlphaSpecified_contentColorUnmodified_surface() {
@@ -178,11 +175,12 @@
                 val contentColor = Color(0.9f, 0.9f, 0.9f)
                 Surface(contentColor = contentColor) {
                     CompositionLocalProvider(LocalContentAlpha provides ContentAlpha.high) {
-                        val expectedAlpha = if (colors.isLight) {
-                            HighContrastHighContentAlpha
-                        } else {
-                            ReducedContrastHighContentAlpha
-                        }
+                        val expectedAlpha =
+                            if (colors.isLight) {
+                                HighContrastHighContentAlpha
+                            } else {
+                                ReducedContrastHighContentAlpha
+                            }
                         assertThat(LocalContentAlpha.current).isEqualTo(expectedAlpha)
                     }
                 }
@@ -197,11 +195,12 @@
                 val contentColor = Color(0.9f, 0.9f, 0.9f)
                 Surface(contentColor = contentColor) {
                     CompositionLocalProvider(LocalContentAlpha provides ContentAlpha.medium) {
-                        val expectedAlpha = if (colors.isLight) {
-                            HighContrastMediumContentAlpha
-                        } else {
-                            ReducedContrastMediumContentAlpha
-                        }
+                        val expectedAlpha =
+                            if (colors.isLight) {
+                                HighContrastMediumContentAlpha
+                            } else {
+                                ReducedContrastMediumContentAlpha
+                            }
                         assertThat(LocalContentAlpha.current).isEqualTo(expectedAlpha)
                     }
                 }
@@ -216,11 +215,12 @@
                 val contentColor = Color(0.9f, 0.9f, 0.9f)
                 Surface(contentColor = contentColor) {
                     CompositionLocalProvider(LocalContentAlpha provides ContentAlpha.disabled) {
-                        val expectedAlpha = if (colors.isLight) {
-                            HighContrastDisabledContentAlpha
-                        } else {
-                            ReducedContrastDisabledContentAlpha
-                        }
+                        val expectedAlpha =
+                            if (colors.isLight) {
+                                HighContrastDisabledContentAlpha
+                            } else {
+                                ReducedContrastDisabledContentAlpha
+                            }
                         assertThat(LocalContentAlpha.current).isEqualTo(expectedAlpha)
                     }
                 }
@@ -235,11 +235,12 @@
                 val contentColor = Color(0.1f, 0.1f, 0.1f)
                 Surface(contentColor = contentColor) {
                     CompositionLocalProvider(LocalContentAlpha provides ContentAlpha.high) {
-                        val expectedAlpha = if (colors.isLight) {
-                            ReducedContrastHighContentAlpha
-                        } else {
-                            HighContrastHighContentAlpha
-                        }
+                        val expectedAlpha =
+                            if (colors.isLight) {
+                                ReducedContrastHighContentAlpha
+                            } else {
+                                HighContrastHighContentAlpha
+                            }
                         assertThat(LocalContentAlpha.current).isEqualTo(expectedAlpha)
                     }
                 }
@@ -254,11 +255,12 @@
                 val contentColor = Color(0.1f, 0.1f, 0.1f)
                 Surface(contentColor = contentColor) {
                     CompositionLocalProvider(LocalContentAlpha provides ContentAlpha.medium) {
-                        val expectedAlpha = if (colors.isLight) {
-                            ReducedContrastMediumContentAlpha
-                        } else {
-                            HighContrastMediumContentAlpha
-                        }
+                        val expectedAlpha =
+                            if (colors.isLight) {
+                                ReducedContrastMediumContentAlpha
+                            } else {
+                                HighContrastMediumContentAlpha
+                            }
                         assertThat(LocalContentAlpha.current).isEqualTo(expectedAlpha)
                     }
                 }
@@ -273,11 +275,12 @@
                 val contentColor = Color(0.1f, 0.1f, 0.1f)
                 Surface(contentColor = contentColor) {
                     CompositionLocalProvider(LocalContentAlpha provides ContentAlpha.disabled) {
-                        val expectedAlpha = if (colors.isLight) {
-                            ReducedContrastDisabledContentAlpha
-                        } else {
-                            HighContrastDisabledContentAlpha
-                        }
+                        val expectedAlpha =
+                            if (colors.isLight) {
+                                ReducedContrastDisabledContentAlpha
+                            } else {
+                                HighContrastDisabledContentAlpha
+                            }
                         assertThat(LocalContentAlpha.current).isEqualTo(expectedAlpha)
                     }
                 }
diff --git a/compose/material/material/src/androidInstrumentedTest/kotlin/androidx/compose/material/DividerUiTest.kt b/compose/material/material/src/androidInstrumentedTest/kotlin/androidx/compose/material/DividerUiTest.kt
index 4569c65..c6c355c 100644
--- a/compose/material/material/src/androidInstrumentedTest/kotlin/androidx/compose/material/DividerUiTest.kt
+++ b/compose/material/material/src/androidInstrumentedTest/kotlin/androidx/compose/material/DividerUiTest.kt
@@ -46,17 +46,14 @@
 @RunWith(AndroidJUnit4::class)
 class DividerUiTest {
 
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
     private val defaultHeight = 1.dp
 
     @Test
     fun divider_DefaultSizes() {
         rule
-            .setMaterialContentForSizeAssertions {
-                Divider()
-            }
+            .setMaterialContentForSizeAssertions { Divider() }
             .assertHeightIsEqualTo(defaultHeight)
             .assertWidthIsEqualTo(rule.rootWidth())
     }
@@ -65,9 +62,7 @@
     fun divider_CustomSizes() {
         val height = 20.dp
         rule
-            .setMaterialContentForSizeAssertions {
-                Divider(thickness = height)
-            }
+            .setMaterialContentForSizeAssertions { Divider(thickness = height) }
             .assertWidthIsEqualTo(rule.rootWidth())
             .assertHeightIsEqualTo(height)
     }
@@ -102,8 +97,6 @@
             }
         }
 
-        rule.onNodeWithTag(testTag).captureToImage().assertPixels(IntSize(sizePx, 1)) {
-            Color.Blue
-        }
+        rule.onNodeWithTag(testTag).captureToImage().assertPixels(IntSize(sizePx, 1)) { Color.Blue }
     }
 }
diff --git a/compose/material/material/src/androidInstrumentedTest/kotlin/androidx/compose/material/DrawerScreenshotTest.kt b/compose/material/material/src/androidInstrumentedTest/kotlin/androidx/compose/material/DrawerScreenshotTest.kt
index 07777ec..195fe6d 100644
--- a/compose/material/material/src/androidInstrumentedTest/kotlin/androidx/compose/material/DrawerScreenshotTest.kt
+++ b/compose/material/material/src/androidInstrumentedTest/kotlin/androidx/compose/material/DrawerScreenshotTest.kt
@@ -44,12 +44,9 @@
 @SdkSuppress(minSdkVersion = Build.VERSION_CODES.O)
 class DrawerScreenshotTest {
 
-    @Suppress("DEPRECATION")
-    @get:Rule
-    val rule = createComposeRule()
+    @Suppress("DEPRECATION") @get:Rule val rule = createComposeRule()
 
-    @get:Rule
-    val screenshotRule = AndroidXScreenshotTestRule(GOLDEN_MATERIAL)
+    @get:Rule val screenshotRule = AndroidXScreenshotTestRule(GOLDEN_MATERIAL)
 
     private fun ComposeContentTestRule.setBottomDrawer(drawerValue: BottomDrawerValue) {
         setMaterialContent {
@@ -100,7 +97,8 @@
     }
 
     private fun assertScreenshotAgainstGolden(goldenName: String) {
-        rule.onNodeWithTag("container")
+        rule
+            .onNodeWithTag("container")
             .captureToImage()
             .assertAgainstGolden(screenshotRule, goldenName)
     }
diff --git a/compose/material/material/src/androidInstrumentedTest/kotlin/androidx/compose/material/DrawerTest.kt b/compose/material/material/src/androidInstrumentedTest/kotlin/androidx/compose/material/DrawerTest.kt
index 9a4b666..546a826 100644
--- a/compose/material/material/src/androidInstrumentedTest/kotlin/androidx/compose/material/DrawerTest.kt
+++ b/compose/material/material/src/androidInstrumentedTest/kotlin/androidx/compose/material/DrawerTest.kt
@@ -74,8 +74,7 @@
 @RunWith(AndroidJUnit4::class)
 class DrawerTest {
 
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
     private val bottomDrawerTag = "drawerContentTag"
     private val shortBottomDrawerHeight = 256.dp
@@ -90,19 +89,12 @@
             val drawerState = rememberDrawerState(DrawerValue.Open)
             ModalDrawer(
                 drawerState = drawerState,
-                drawerContent = {
-                    Box(
-                        Modifier
-                            .fillMaxSize()
-                            .testTag("content")
-                    )
-                },
+                drawerContent = { Box(Modifier.fillMaxSize().testTag("content")) },
                 content = {}
             )
         }
 
-        rule.onNodeWithTag("content")
-            .assertLeftPositionInRootIsEqualTo(0.dp)
+        rule.onNodeWithTag("content").assertLeftPositionInRootIsEqualTo(0.dp)
     }
 
     @Test
@@ -111,20 +103,13 @@
             val drawerState = rememberDrawerState(DrawerValue.Closed)
             ModalDrawer(
                 drawerState = drawerState,
-                drawerContent = {
-                    Box(
-                        Modifier
-                            .fillMaxSize()
-                            .testTag("content")
-                    )
-                },
+                drawerContent = { Box(Modifier.fillMaxSize().testTag("content")) },
                 content = {}
             )
         }
 
         val width = rule.rootWidth()
-        rule.onNodeWithTag("content")
-            .assertLeftPositionInRootIsEqualTo(-width)
+        rule.onNodeWithTag("content").assertLeftPositionInRootIsEqualTo(-width)
     }
 
     @Test
@@ -133,19 +118,12 @@
             val drawerState = rememberDrawerState(DrawerValue.Open)
             ModalDrawer(
                 drawerState = drawerState,
-                drawerContent = {
-                    Box(
-                        Modifier
-                            .fillMaxSize()
-                            .testTag("content")
-                    )
-                },
+                drawerContent = { Box(Modifier.fillMaxSize().testTag("content")) },
                 content = {}
             )
         }
 
-        rule.onNodeWithTag("content")
-            .assertWidthIsEqualTo(rule.rootWidth() - 56.dp)
+        rule.onNodeWithTag("content").assertWidthIsEqualTo(rule.rootWidth() - 56.dp)
     }
 
     @OptIn(ExperimentalMaterialApi::class)
@@ -155,20 +133,13 @@
             val drawerState = rememberBottomDrawerState(BottomDrawerValue.Closed)
             BottomDrawer(
                 drawerState = drawerState,
-                drawerContent = {
-                    Box(
-                        Modifier
-                            .fillMaxSize()
-                            .testTag(bottomDrawerTag)
-                    )
-                },
-                content = { }
+                drawerContent = { Box(Modifier.fillMaxSize().testTag(bottomDrawerTag)) },
+                content = {}
             )
         }
 
         val height = rule.rootHeight()
-        rule.onNodeWithTag(bottomDrawerTag)
-            .assertTopPositionInRootIsEqualTo(height)
+        rule.onNodeWithTag(bottomDrawerTag).assertTopPositionInRootIsEqualTo(height)
     }
 
     @OptIn(ExperimentalMaterialApi::class)
@@ -180,11 +151,7 @@
             BottomDrawer(
                 drawerState = drawerState,
                 drawerContent = {
-                    Box(
-                        Modifier
-                            .height(shortBottomDrawerHeight)
-                            .testTag(bottomDrawerTag)
-                    )
+                    Box(Modifier.height(shortBottomDrawerHeight).testTag(bottomDrawerTag))
                 },
                 content = {}
             )
@@ -192,8 +159,7 @@
 
         val height = rule.rootHeight()
         val expectedTop = height - shortBottomDrawerHeight
-        rule.onNodeWithTag(bottomDrawerTag)
-            .assertTopPositionInRootIsEqualTo(expectedTop)
+        rule.onNodeWithTag(bottomDrawerTag).assertTopPositionInRootIsEqualTo(expectedTop)
     }
 
     @OptIn(ExperimentalMaterialApi::class)
@@ -203,21 +169,14 @@
             val drawerState = rememberBottomDrawerState(BottomDrawerValue.Closed)
             BottomDrawer(
                 drawerState = drawerState,
-                drawerContent = {
-                    Box(
-                        Modifier
-                            .fillMaxSize()
-                            .testTag(bottomDrawerTag)
-                    )
-                },
+                drawerContent = { Box(Modifier.fillMaxSize().testTag(bottomDrawerTag)) },
                 content = {}
             )
         }
 
         val height = rule.rootHeight()
         val expectedTop = height
-        rule.onNodeWithTag(bottomDrawerTag)
-            .assertTopPositionInRootIsEqualTo(expectedTop)
+        rule.onNodeWithTag(bottomDrawerTag).assertTopPositionInRootIsEqualTo(expectedTop)
     }
 
     @OptIn(ExperimentalMaterialApi::class)
@@ -227,13 +186,7 @@
             val drawerState = rememberBottomDrawerState(BottomDrawerValue.Open)
             BottomDrawer(
                 drawerState = drawerState,
-                drawerContent = {
-                    Box(
-                        Modifier
-                            .fillMaxSize()
-                            .testTag(bottomDrawerTag)
-                    )
-                },
+                drawerContent = { Box(Modifier.fillMaxSize().testTag(bottomDrawerTag)) },
                 content = {}
             )
         }
@@ -241,8 +194,7 @@
         val width = rule.rootWidth()
         val height = rule.rootHeight()
         val expectedTop = if (width > height) 0.dp else (height / 2)
-        rule.onNodeWithTag(bottomDrawerTag)
-            .assertTopPositionInRootIsEqualTo(expectedTop)
+        rule.onNodeWithTag(bottomDrawerTag).assertTopPositionInRootIsEqualTo(expectedTop)
     }
 
     @OptIn(ExperimentalMaterialApi::class)
@@ -252,20 +204,13 @@
             val drawerState = rememberBottomDrawerState(BottomDrawerValue.Expanded)
             BottomDrawer(
                 drawerState = drawerState,
-                drawerContent = {
-                    Box(
-                        Modifier
-                            .fillMaxSize()
-                            .testTag(bottomDrawerTag)
-                    )
-                },
+                drawerContent = { Box(Modifier.fillMaxSize().testTag(bottomDrawerTag)) },
                 content = {}
             )
         }
 
         val expectedTop = 0.dp
-        rule.onNodeWithTag(bottomDrawerTag)
-            .assertTopPositionInRootIsEqualTo(expectedTop)
+        rule.onNodeWithTag(bottomDrawerTag).assertTopPositionInRootIsEqualTo(expectedTop)
     }
 
     @OptIn(ExperimentalMaterialApi::class)
@@ -276,19 +221,14 @@
         rule.setMaterialContent {
             BottomDrawer(
                 drawerState = rememberBottomDrawerState(BottomDrawerValue.Open),
-                drawerContent = {
-                    Box(
-                        Modifier
-                            .fillMaxSize()
-                            .testTag(bottomDrawerTag)
-                    )
-                },
+                drawerContent = { Box(Modifier.fillMaxSize().testTag(bottomDrawerTag)) },
                 content = {}
             )
             navigationMenu = getString(Strings.NavigationMenu)
         }
 
-        rule.onNodeWithTag(bottomDrawerTag, useUnmergedTree = true)
+        rule
+            .onNodeWithTag(bottomDrawerTag, useUnmergedTree = true)
             .onParent()
             .assert(SemanticsMatcher.expectValue(SemanticsProperties.PaneTitle, navigationMenu))
     }
@@ -300,252 +240,199 @@
         rule.setMaterialContent {
             ModalDrawer(
                 drawerState = rememberDrawerState(DrawerValue.Open),
-                drawerContent = {
-                    Box(
-                        Modifier
-                            .fillMaxSize()
-                            .testTag("modalDrawerTag")
-                    )
-                },
+                drawerContent = { Box(Modifier.fillMaxSize().testTag("modalDrawerTag")) },
                 content = {}
             )
             navigationMenu = getString(Strings.NavigationMenu)
         }
 
-        rule.onNodeWithTag("modalDrawerTag", useUnmergedTree = true)
+        rule
+            .onNodeWithTag("modalDrawerTag", useUnmergedTree = true)
             .onParent()
             .assert(SemanticsMatcher.expectValue(SemanticsProperties.PaneTitle, navigationMenu))
     }
 
     @Test
     @LargeTest
-    fun modalDrawer_openAndClose(): Unit = runBlocking(AutoTestFrameClock()) {
-        lateinit var drawerState: DrawerState
-        rule.setMaterialContent {
-            drawerState = rememberDrawerState(DrawerValue.Closed)
-            ModalDrawer(
-                drawerState = drawerState,
-                drawerContent = {
-                    Box(
-                        Modifier
-                            .fillMaxSize()
-                            .testTag("drawer")
-                    )
-                },
-                content = {}
-            )
+    fun modalDrawer_openAndClose(): Unit =
+        runBlocking(AutoTestFrameClock()) {
+            lateinit var drawerState: DrawerState
+            rule.setMaterialContent {
+                drawerState = rememberDrawerState(DrawerValue.Closed)
+                ModalDrawer(
+                    drawerState = drawerState,
+                    drawerContent = { Box(Modifier.fillMaxSize().testTag("drawer")) },
+                    content = {}
+                )
+            }
+
+            val width = rule.rootWidth()
+
+            // Drawer should start in closed state
+            rule.onNodeWithTag("drawer").assertLeftPositionInRootIsEqualTo(-width)
+
+            // When the drawer state is set to Opened
+            drawerState.open()
+            // Then the drawer should be opened
+            rule.onNodeWithTag("drawer").assertLeftPositionInRootIsEqualTo(0.dp)
+
+            // When the drawer state is set to Closed
+            drawerState.close()
+            // Then the drawer should be closed
+            rule.onNodeWithTag("drawer").assertLeftPositionInRootIsEqualTo(-width)
         }
 
-        val width = rule.rootWidth()
-
-        // Drawer should start in closed state
-        rule.onNodeWithTag("drawer").assertLeftPositionInRootIsEqualTo(-width)
-
-        // When the drawer state is set to Opened
-        drawerState.open()
-        // Then the drawer should be opened
-        rule.onNodeWithTag("drawer").assertLeftPositionInRootIsEqualTo(0.dp)
-
-        // When the drawer state is set to Closed
-        drawerState.close()
-        // Then the drawer should be closed
-        rule.onNodeWithTag("drawer").assertLeftPositionInRootIsEqualTo(-width)
-    }
-
     @Test
     @LargeTest
-    fun modalDrawer_animateTo(): Unit = runBlocking(AutoTestFrameClock()) {
-        lateinit var drawerState: DrawerState
-        rule.setMaterialContent {
-            drawerState = rememberDrawerState(DrawerValue.Closed)
-            ModalDrawer(
-                drawerState = drawerState,
-                drawerContent = {
-                    Box(
-                        Modifier
-                            .fillMaxSize()
-                            .testTag("drawer")
-                    )
-                },
-                content = {}
-            )
+    fun modalDrawer_animateTo(): Unit =
+        runBlocking(AutoTestFrameClock()) {
+            lateinit var drawerState: DrawerState
+            rule.setMaterialContent {
+                drawerState = rememberDrawerState(DrawerValue.Closed)
+                ModalDrawer(
+                    drawerState = drawerState,
+                    drawerContent = { Box(Modifier.fillMaxSize().testTag("drawer")) },
+                    content = {}
+                )
+            }
+
+            val width = rule.rootWidth()
+
+            // Drawer should start in closed state
+            rule.onNodeWithTag("drawer").assertLeftPositionInRootIsEqualTo(-width)
+
+            // When the drawer state is set to Opened
+            drawerState.open()
+            // Then the drawer should be opened
+            rule.onNodeWithTag("drawer").assertLeftPositionInRootIsEqualTo(0.dp)
+
+            // When the drawer state is set to Closed
+            drawerState.close()
+            // Then the drawer should be closed
+            rule.onNodeWithTag("drawer").assertLeftPositionInRootIsEqualTo(-width)
         }
 
-        val width = rule.rootWidth()
-
-        // Drawer should start in closed state
-        rule.onNodeWithTag("drawer").assertLeftPositionInRootIsEqualTo(-width)
-
-        // When the drawer state is set to Opened
-        drawerState.open()
-        // Then the drawer should be opened
-        rule.onNodeWithTag("drawer").assertLeftPositionInRootIsEqualTo(0.dp)
-
-        // When the drawer state is set to Closed
-        drawerState.close()
-        // Then the drawer should be closed
-        rule.onNodeWithTag("drawer").assertLeftPositionInRootIsEqualTo(-width)
-    }
-
     @Test
     @LargeTest
-    fun modalDrawer_snapTo(): Unit = runBlocking(AutoTestFrameClock()) {
-        lateinit var drawerState: DrawerState
-        rule.setMaterialContent {
-            drawerState = rememberDrawerState(DrawerValue.Closed)
-            ModalDrawer(
-                drawerState = drawerState,
-                drawerContent = {
-                    Box(
-                        Modifier
-                            .fillMaxSize()
-                            .testTag("drawer")
-                    )
-                },
-                content = {}
-            )
+    fun modalDrawer_snapTo(): Unit =
+        runBlocking(AutoTestFrameClock()) {
+            lateinit var drawerState: DrawerState
+            rule.setMaterialContent {
+                drawerState = rememberDrawerState(DrawerValue.Closed)
+                ModalDrawer(
+                    drawerState = drawerState,
+                    drawerContent = { Box(Modifier.fillMaxSize().testTag("drawer")) },
+                    content = {}
+                )
+            }
+
+            val width = rule.rootWidth()
+
+            // Drawer should start in closed state
+            rule.onNodeWithTag("drawer").assertLeftPositionInRootIsEqualTo(-width)
+
+            // When the drawer state is set to Opened
+            drawerState.snapTo(DrawerValue.Open)
+            // Then the drawer should be opened
+            rule.onNodeWithTag("drawer").assertLeftPositionInRootIsEqualTo(0.dp)
+
+            // When the drawer state is set to Closed
+            drawerState.snapTo(DrawerValue.Closed)
+            // Then the drawer should be closed
+            rule.onNodeWithTag("drawer").assertLeftPositionInRootIsEqualTo(-width)
         }
 
-        val width = rule.rootWidth()
-
-        // Drawer should start in closed state
-        rule.onNodeWithTag("drawer").assertLeftPositionInRootIsEqualTo(-width)
-
-        // When the drawer state is set to Opened
-        drawerState.snapTo(DrawerValue.Open)
-        // Then the drawer should be opened
-        rule.onNodeWithTag("drawer").assertLeftPositionInRootIsEqualTo(0.dp)
-
-        // When the drawer state is set to Closed
-        drawerState.snapTo(DrawerValue.Closed)
-        // Then the drawer should be closed
-        rule.onNodeWithTag("drawer").assertLeftPositionInRootIsEqualTo(-width)
-    }
-
     @Test
     @LargeTest
-    fun modalDrawer_currentValue(): Unit = runBlocking(AutoTestFrameClock()) {
-        lateinit var drawerState: DrawerState
-        rule.setMaterialContent {
-            drawerState = rememberDrawerState(DrawerValue.Closed)
-            ModalDrawer(
-                drawerState = drawerState,
-                drawerContent = {
-                    Box(
-                        Modifier
-                            .fillMaxSize()
-                            .testTag("drawer")
-                    )
-                },
-                content = {}
-            )
+    fun modalDrawer_currentValue(): Unit =
+        runBlocking(AutoTestFrameClock()) {
+            lateinit var drawerState: DrawerState
+            rule.setMaterialContent {
+                drawerState = rememberDrawerState(DrawerValue.Closed)
+                ModalDrawer(
+                    drawerState = drawerState,
+                    drawerContent = { Box(Modifier.fillMaxSize().testTag("drawer")) },
+                    content = {}
+                )
+            }
+
+            // Drawer should start in closed state
+            assertThat(drawerState.currentValue).isEqualTo(DrawerValue.Closed)
+
+            // When the drawer state is set to Opened
+            drawerState.snapTo(DrawerValue.Open)
+            // Then the drawer should be opened
+            assertThat(drawerState.currentValue).isEqualTo(DrawerValue.Open)
+
+            // When the drawer state is set to Closed
+            drawerState.snapTo(DrawerValue.Closed)
+            // Then the drawer should be closed
+            assertThat(drawerState.currentValue).isEqualTo(DrawerValue.Closed)
         }
 
-        // Drawer should start in closed state
-        assertThat(drawerState.currentValue).isEqualTo(DrawerValue.Closed)
-
-        // When the drawer state is set to Opened
-        drawerState.snapTo(DrawerValue.Open)
-        // Then the drawer should be opened
-        assertThat(drawerState.currentValue).isEqualTo(DrawerValue.Open)
-
-        // When the drawer state is set to Closed
-        drawerState.snapTo(DrawerValue.Closed)
-        // Then the drawer should be closed
-        assertThat(drawerState.currentValue).isEqualTo(DrawerValue.Closed)
-    }
-
     @Test
     @LargeTest
-    fun modalDrawer_bodyContent_clickable(): Unit = runBlocking(AutoTestFrameClock()) {
-        var drawerClicks = 0
-        var bodyClicks = 0
-        lateinit var drawerState: DrawerState
-        rule.setMaterialContent {
-            drawerState = rememberDrawerState(DrawerValue.Closed)
-            // emulate click on the screen
-            ModalDrawer(
-                drawerState = drawerState,
-                drawerContent = {
-                    Box(
-                        Modifier
-                            .fillMaxSize()
-                            .clickable { drawerClicks += 1 })
-                },
-                content = {
-                    Box(
-                        Modifier
-                            .testTag("Drawer")
-                            .fillMaxSize()
-                            .clickable { bodyClicks += 1 })
-                }
-            )
-        }
+    fun modalDrawer_bodyContent_clickable(): Unit =
+        runBlocking(AutoTestFrameClock()) {
+            var drawerClicks = 0
+            var bodyClicks = 0
+            lateinit var drawerState: DrawerState
+            rule.setMaterialContent {
+                drawerState = rememberDrawerState(DrawerValue.Closed)
+                // emulate click on the screen
+                ModalDrawer(
+                    drawerState = drawerState,
+                    drawerContent = { Box(Modifier.fillMaxSize().clickable { drawerClicks += 1 }) },
+                    content = {
+                        Box(Modifier.testTag("Drawer").fillMaxSize().clickable { bodyClicks += 1 })
+                    }
+                )
+            }
 
-        // Click in the middle of the drawer (which is the middle of the body)
-        rule.onNodeWithTag("Drawer").performTouchInput { click() }
+            // Click in the middle of the drawer (which is the middle of the body)
+            rule.onNodeWithTag("Drawer").performTouchInput { click() }
 
-        rule.runOnIdle {
-            assertThat(drawerClicks).isEqualTo(0)
-            assertThat(bodyClicks).isEqualTo(1)
-        }
-        drawerState.open()
+            rule.runOnIdle {
+                assertThat(drawerClicks).isEqualTo(0)
+                assertThat(bodyClicks).isEqualTo(1)
+            }
+            drawerState.open()
 
-        // Click on the left-center pixel of the drawer
-        rule.onNodeWithTag("Drawer").performTouchInput {
-            click(centerLeft)
-        }
+            // Click on the left-center pixel of the drawer
+            rule.onNodeWithTag("Drawer").performTouchInput { click(centerLeft) }
 
-        rule.runOnIdle {
-            assertThat(drawerClicks).isEqualTo(1)
-            assertThat(bodyClicks).isEqualTo(1)
+            rule.runOnIdle {
+                assertThat(drawerClicks).isEqualTo(1)
+                assertThat(bodyClicks).isEqualTo(1)
+            }
         }
-    }
 
     @Test
     @LargeTest
-    fun modalDrawer_drawerContent_doesntPropagateClicksWhenOpen(): Unit = runBlocking(
-        AutoTestFrameClock()
-    ) {
-        var bodyClicks = 0
-        lateinit var drawerState: DrawerState
-        rule.setMaterialContent {
-            drawerState = rememberDrawerState(DrawerValue.Closed)
-            ModalDrawer(
-                drawerState = drawerState,
-                drawerContent = {
-                    Box(
-                        Modifier
-                            .fillMaxSize()
-                            .testTag("Drawer")
-                    )
-                },
-                content = {
-                    Box(
-                        Modifier
-                            .fillMaxSize()
-                            .clickable { bodyClicks += 1 })
-                }
-            )
-        }
+    fun modalDrawer_drawerContent_doesntPropagateClicksWhenOpen(): Unit =
+        runBlocking(AutoTestFrameClock()) {
+            var bodyClicks = 0
+            lateinit var drawerState: DrawerState
+            rule.setMaterialContent {
+                drawerState = rememberDrawerState(DrawerValue.Closed)
+                ModalDrawer(
+                    drawerState = drawerState,
+                    drawerContent = { Box(Modifier.fillMaxSize().testTag("Drawer")) },
+                    content = { Box(Modifier.fillMaxSize().clickable { bodyClicks += 1 }) }
+                )
+            }
 
-        // Click in the middle of the drawer
-        rule.onNodeWithTag("Drawer").performClick()
+            // Click in the middle of the drawer
+            rule.onNodeWithTag("Drawer").performClick()
 
-        rule.runOnIdle {
-            assertThat(bodyClicks).isEqualTo(1)
-        }
-        drawerState.open()
+            rule.runOnIdle { assertThat(bodyClicks).isEqualTo(1) }
+            drawerState.open()
 
-        // Click on the left-center pixel of the drawer
-        rule.onNodeWithTag("Drawer").performTouchInput {
-            click(centerLeft)
-        }
+            // Click on the left-center pixel of the drawer
+            rule.onNodeWithTag("Drawer").performTouchInput { click(centerLeft) }
 
-        rule.runOnIdle {
-            assertThat(bodyClicks).isEqualTo(1)
+            rule.runOnIdle { assertThat(bodyClicks).isEqualTo(1) }
         }
-    }
 
     @Test
     @LargeTest
@@ -557,36 +444,20 @@
                 ModalDrawer(
                     drawerState = drawerState,
                     drawerContent = {
-                        Box(
-                            Modifier
-                                .fillMaxSize()
-                                .background(color = Color.Magenta)
-                        )
+                        Box(Modifier.fillMaxSize().background(color = Color.Magenta))
                     },
-                    content = {
-                        Box(
-                            Modifier
-                                .fillMaxSize()
-                                .background(color = Color.Red)
-                        )
-                    }
+                    content = { Box(Modifier.fillMaxSize().background(color = Color.Red)) }
                 )
             }
         }
 
-        rule.onNodeWithTag("Drawer")
-            .performTouchInput { swipeRight() }
+        rule.onNodeWithTag("Drawer").performTouchInput { swipeRight() }
 
-        rule.runOnIdle {
-            assertThat(drawerState.currentValue).isEqualTo(DrawerValue.Open)
-        }
+        rule.runOnIdle { assertThat(drawerState.currentValue).isEqualTo(DrawerValue.Open) }
 
-        rule.onNodeWithTag("Drawer")
-            .performTouchInput { swipeLeft() }
+        rule.onNodeWithTag("Drawer").performTouchInput { swipeLeft() }
 
-        rule.runOnIdle {
-            assertThat(drawerState.currentValue).isEqualTo(DrawerValue.Closed)
-        }
+        rule.runOnIdle { assertThat(drawerState.currentValue).isEqualTo(DrawerValue.Closed) }
     }
 
     @Test
@@ -594,49 +465,37 @@
     fun modalDrawer_confirmStateChangeRespect() {
         lateinit var drawerState: DrawerState
         rule.setMaterialContent {
-            drawerState = rememberDrawerState(
-                DrawerValue.Open,
-                confirmStateChange = {
-                    it != DrawerValue.Closed
-                }
-            )
+            drawerState =
+                rememberDrawerState(
+                    DrawerValue.Open,
+                    confirmStateChange = { it != DrawerValue.Closed }
+                )
             Box(Modifier.testTag("Drawer")) {
                 ModalDrawer(
                     drawerState = drawerState,
                     drawerContent = {
                         Box(
-                            Modifier
-                                .fillMaxSize()
+                            Modifier.fillMaxSize()
                                 .testTag("content")
                                 .background(color = Color.Magenta)
                         )
                     },
-                    content = {
-                        Box(
-                            Modifier
-                                .fillMaxSize()
-                                .background(color = Color.Red)
-                        )
-                    }
+                    content = { Box(Modifier.fillMaxSize().background(color = Color.Red)) }
                 )
             }
         }
 
-        rule.onNodeWithTag("Drawer")
-            .performTouchInput { swipeLeft() }
+        rule.onNodeWithTag("Drawer").performTouchInput { swipeLeft() }
 
         // still open
-        rule.runOnIdle {
-            assertThat(drawerState.currentValue).isEqualTo(DrawerValue.Open)
-        }
+        rule.runOnIdle { assertThat(drawerState.currentValue).isEqualTo(DrawerValue.Open) }
 
-        rule.onNodeWithTag("content", useUnmergedTree = true)
+        rule
+            .onNodeWithTag("content", useUnmergedTree = true)
             .onParent()
             .performSemanticsAction(SemanticsActions.Dismiss)
 
-        rule.runOnIdle {
-            assertThat(drawerState.currentValue).isEqualTo(DrawerValue.Open)
-        }
+        rule.runOnIdle { assertThat(drawerState.currentValue).isEqualTo(DrawerValue.Open) }
     }
 
     @Test
@@ -651,236 +510,177 @@
                     ModalDrawer(
                         drawerState = drawerState,
                         drawerContent = {
-                            Box(
-                                Modifier
-                                    .fillMaxSize()
-                                    .background(color = Color.Magenta)
-                            )
+                            Box(Modifier.fillMaxSize().background(color = Color.Magenta))
                         },
-                        content = {
-                            Box(
-                                Modifier
-                                    .fillMaxSize()
-                                    .background(color = Color.Red)
-                            )
-                        }
+                        content = { Box(Modifier.fillMaxSize().background(color = Color.Red)) }
                     )
                 }
             }
         }
 
-        rule.onNodeWithTag("Drawer")
-            .performTouchInput { swipeLeft() }
+        rule.onNodeWithTag("Drawer").performTouchInput { swipeLeft() }
 
-        rule.runOnIdle {
-            assertThat(drawerState.currentValue).isEqualTo(DrawerValue.Open)
-        }
+        rule.runOnIdle { assertThat(drawerState.currentValue).isEqualTo(DrawerValue.Open) }
 
-        rule.onNodeWithTag("Drawer")
-            .performTouchInput { swipeRight() }
+        rule.onNodeWithTag("Drawer").performTouchInput { swipeRight() }
 
-        rule.runOnIdle {
-            assertThat(drawerState.currentValue).isEqualTo(DrawerValue.Closed)
-        }
+        rule.runOnIdle { assertThat(drawerState.currentValue).isEqualTo(DrawerValue.Closed) }
     }
 
     @Test
     @LargeTest
-    fun modalDrawer_noDismissActionWhenClosed_hasDissmissActionWhenOpen(): Unit = runBlocking(
-        AutoTestFrameClock()
-    ) {
-        lateinit var drawerState: DrawerState
-        rule.setMaterialContent {
-            drawerState = rememberDrawerState(DrawerValue.Closed)
-            ModalDrawer(
-                drawerState = drawerState,
-                drawerContent = {
-                    Box(
-                        Modifier
-                            .fillMaxSize()
-                            .testTag("drawer")
-                    )
-                },
-                content = {}
-            )
+    fun modalDrawer_noDismissActionWhenClosed_hasDissmissActionWhenOpen(): Unit =
+        runBlocking(AutoTestFrameClock()) {
+            lateinit var drawerState: DrawerState
+            rule.setMaterialContent {
+                drawerState = rememberDrawerState(DrawerValue.Closed)
+                ModalDrawer(
+                    drawerState = drawerState,
+                    drawerContent = { Box(Modifier.fillMaxSize().testTag("drawer")) },
+                    content = {}
+                )
+            }
+
+            // Drawer should start in closed state and have no dismiss action
+            rule
+                .onNodeWithTag("drawer", useUnmergedTree = true)
+                .onParent()
+                .assert(SemanticsMatcher.keyNotDefined(SemanticsActions.Dismiss))
+
+            // When the drawer state is set to Opened
+            drawerState.open()
+            // Then the drawer should be opened and have dismiss action
+            rule
+                .onNodeWithTag("drawer", useUnmergedTree = true)
+                .onParent()
+                .assert(SemanticsMatcher.keyIsDefined(SemanticsActions.Dismiss))
+
+            // When the drawer state is set to Closed using dismiss action
+            rule
+                .onNodeWithTag("drawer", useUnmergedTree = true)
+                .onParent()
+                .performSemanticsAction(SemanticsActions.Dismiss)
+            // Then the drawer should be closed and have no dismiss action
+            rule
+                .onNodeWithTag("drawer", useUnmergedTree = true)
+                .onParent()
+                .assert(SemanticsMatcher.keyNotDefined(SemanticsActions.Dismiss))
         }
 
-        // Drawer should start in closed state and have no dismiss action
-        rule.onNodeWithTag("drawer", useUnmergedTree = true)
-            .onParent()
-            .assert(SemanticsMatcher.keyNotDefined(SemanticsActions.Dismiss))
-
-        // When the drawer state is set to Opened
-        drawerState.open()
-        // Then the drawer should be opened and have dismiss action
-        rule.onNodeWithTag("drawer", useUnmergedTree = true)
-            .onParent()
-            .assert(SemanticsMatcher.keyIsDefined(SemanticsActions.Dismiss))
-
-        // When the drawer state is set to Closed using dismiss action
-        rule.onNodeWithTag("drawer", useUnmergedTree = true)
-            .onParent()
-            .performSemanticsAction(SemanticsActions.Dismiss)
-        // Then the drawer should be closed and have no dismiss action
-        rule.onNodeWithTag("drawer", useUnmergedTree = true)
-            .onParent()
-            .assert(SemanticsMatcher.keyNotDefined(SemanticsActions.Dismiss))
-    }
-
     @OptIn(ExperimentalMaterialApi::class)
     @Test
-    fun bottomDrawer_bodyContent_clickable(): Unit = runBlocking(AutoTestFrameClock()) {
-        var drawerClicks = 0
-        var bodyClicks = 0
-        lateinit var drawerState: BottomDrawerState
-        rule.setMaterialContent {
-            drawerState = rememberBottomDrawerState(BottomDrawerValue.Closed)
-            // emulate click on the screen
-            BottomDrawer(
-                drawerState = drawerState,
-                drawerContent = {
-                    Box(
-                        Modifier
-                            .fillMaxSize()
-                            .clickable { drawerClicks += 1 })
-                },
-                content = {
-                    Box(
-                        Modifier
-                            .testTag(bottomDrawerTag)
-                            .fillMaxSize()
-                            .clickable { bodyClicks += 1 }
-                    )
-                }
-            )
-        }
+    fun bottomDrawer_bodyContent_clickable(): Unit =
+        runBlocking(AutoTestFrameClock()) {
+            var drawerClicks = 0
+            var bodyClicks = 0
+            lateinit var drawerState: BottomDrawerState
+            rule.setMaterialContent {
+                drawerState = rememberBottomDrawerState(BottomDrawerValue.Closed)
+                // emulate click on the screen
+                BottomDrawer(
+                    drawerState = drawerState,
+                    drawerContent = { Box(Modifier.fillMaxSize().clickable { drawerClicks += 1 }) },
+                    content = {
+                        Box(
+                            Modifier.testTag(bottomDrawerTag).fillMaxSize().clickable {
+                                bodyClicks += 1
+                            }
+                        )
+                    }
+                )
+            }
 
-        // Click in the middle of the drawer (which is the middle of the body)
-        rule.onNodeWithTag(bottomDrawerTag).performTouchInput { click() }
+            // Click in the middle of the drawer (which is the middle of the body)
+            rule.onNodeWithTag(bottomDrawerTag).performTouchInput { click() }
 
-        rule.runOnIdle {
-            assertThat(drawerClicks).isEqualTo(0)
+            rule.runOnIdle {
+                assertThat(drawerClicks).isEqualTo(0)
+                assertThat(bodyClicks).isEqualTo(1)
+            }
+
+            drawerState.open()
+            sleep(100) // TODO(147586311): remove this sleep when opening the drawer triggers a wait
+
+            // Click on the bottom-center pixel of the drawer
+            rule.onNodeWithTag(bottomDrawerTag).performTouchInput { click(bottomCenter) }
+
+            assertThat(drawerClicks).isEqualTo(1)
             assertThat(bodyClicks).isEqualTo(1)
         }
 
-        drawerState.open()
-        sleep(100) // TODO(147586311): remove this sleep when opening the drawer triggers a wait
-
-        // Click on the bottom-center pixel of the drawer
-        rule.onNodeWithTag(bottomDrawerTag).performTouchInput {
-            click(bottomCenter)
-        }
-
-        assertThat(drawerClicks).isEqualTo(1)
-        assertThat(bodyClicks).isEqualTo(1)
-    }
-
     @OptIn(ExperimentalMaterialApi::class)
     @Test
     @LargeTest
-    fun bottomDrawer_drawerContent_doesntPropagateClicksWhenOpen(): Unit = runBlocking(
-        AutoTestFrameClock()
-    ) {
-        var bodyClicks = 0
-        lateinit var drawerState: BottomDrawerState
-        rule.setMaterialContent {
-            drawerState = rememberBottomDrawerState(BottomDrawerValue.Closed)
-            BottomDrawer(
-                drawerState = drawerState,
-                drawerContent = {
-                    Box(
-                        Modifier
-                            .fillMaxSize()
-                            .testTag(bottomDrawerTag)
-                    )
-                },
-                content = {
-                    Box(
-                        Modifier
-                            .fillMaxSize()
-                            .clickable { bodyClicks += 1 })
-                }
-            )
-        }
+    fun bottomDrawer_drawerContent_doesntPropagateClicksWhenOpen(): Unit =
+        runBlocking(AutoTestFrameClock()) {
+            var bodyClicks = 0
+            lateinit var drawerState: BottomDrawerState
+            rule.setMaterialContent {
+                drawerState = rememberBottomDrawerState(BottomDrawerValue.Closed)
+                BottomDrawer(
+                    drawerState = drawerState,
+                    drawerContent = { Box(Modifier.fillMaxSize().testTag(bottomDrawerTag)) },
+                    content = { Box(Modifier.fillMaxSize().clickable { bodyClicks += 1 }) }
+                )
+            }
 
-        // Click in the middle of the drawer
-        rule.onNodeWithTag(bottomDrawerTag).performClick()
+            // Click in the middle of the drawer
+            rule.onNodeWithTag(bottomDrawerTag).performClick()
 
-        rule.runOnIdle {
-            assertThat(bodyClicks).isEqualTo(1)
-        }
-        drawerState.open()
+            rule.runOnIdle { assertThat(bodyClicks).isEqualTo(1) }
+            drawerState.open()
 
-        // Click on the left-center pixel of the drawer
-        rule.onNodeWithTag(bottomDrawerTag).performTouchInput {
-            click(centerLeft)
-        }
+            // Click on the left-center pixel of the drawer
+            rule.onNodeWithTag(bottomDrawerTag).performTouchInput { click(centerLeft) }
 
-        rule.runOnIdle {
-            assertThat(bodyClicks).isEqualTo(1)
-        }
-        drawerState.expand()
+            rule.runOnIdle { assertThat(bodyClicks).isEqualTo(1) }
+            drawerState.expand()
 
-        // Click on the left-center pixel of the drawer once again in a new state
-        rule.onNodeWithTag(bottomDrawerTag).performTouchInput {
-            click(centerLeft)
-        }
+            // Click on the left-center pixel of the drawer once again in a new state
+            rule.onNodeWithTag(bottomDrawerTag).performTouchInput { click(centerLeft) }
 
-        rule.runOnIdle {
-            assertThat(bodyClicks).isEqualTo(1)
+            rule.runOnIdle { assertThat(bodyClicks).isEqualTo(1) }
         }
-    }
 
     @OptIn(ExperimentalMaterialApi::class)
     @Test
     @LargeTest
-    fun bottomDrawer_openBySwipe_shortDrawer(): Unit = runBlocking(AutoTestFrameClock()) {
-        val contentTag = "contentTestTag"
-        lateinit var drawerState: BottomDrawerState
-        rule.setMaterialContent {
-            drawerState = rememberBottomDrawerState(BottomDrawerValue.Closed)
-            BottomDrawer(
-                drawerState = drawerState,
-                drawerContent = {
-                    Box(
-                        Modifier
-                            .height(shortBottomDrawerHeight)
-                            .testTag(bottomDrawerTag)
-                    )
-                },
-                content = {
-                    Box(
-                        Modifier
-                            .fillMaxSize()
-                            .testTag(contentTag)
-                    )
-                }
-            )
+    fun bottomDrawer_openBySwipe_shortDrawer(): Unit =
+        runBlocking(AutoTestFrameClock()) {
+            val contentTag = "contentTestTag"
+            lateinit var drawerState: BottomDrawerState
+            rule.setMaterialContent {
+                drawerState = rememberBottomDrawerState(BottomDrawerValue.Closed)
+                BottomDrawer(
+                    drawerState = drawerState,
+                    drawerContent = {
+                        Box(Modifier.height(shortBottomDrawerHeight).testTag(bottomDrawerTag))
+                    },
+                    content = { Box(Modifier.fillMaxSize().testTag(contentTag)) }
+                )
+            }
+
+            rule.runOnIdle {
+                assertThat(drawerState.currentValue).isEqualTo(BottomDrawerValue.Closed)
+            }
+
+            rule.onNodeWithTag(contentTag).performTouchInput { swipeUp() }
+
+            advanceClock()
+
+            rule.runOnIdle {
+                assertThat(drawerState.currentValue).isEqualTo(BottomDrawerValue.Expanded)
+            }
+
+            rule.onNodeWithTag(bottomDrawerTag).performTouchInput { swipeDown() }
+
+            advanceClock()
+
+            rule.runOnIdle {
+                assertThat(drawerState.currentValue).isEqualTo(BottomDrawerValue.Closed)
+            }
         }
 
-        rule.runOnIdle {
-            assertThat(drawerState.currentValue).isEqualTo(BottomDrawerValue.Closed)
-        }
-
-        rule.onNodeWithTag(contentTag)
-            .performTouchInput { swipeUp() }
-
-        advanceClock()
-
-        rule.runOnIdle {
-            assertThat(drawerState.currentValue).isEqualTo(BottomDrawerValue.Expanded)
-        }
-
-        rule.onNodeWithTag(bottomDrawerTag)
-            .performTouchInput { swipeDown() }
-
-        advanceClock()
-
-        rule.runOnIdle {
-            assertThat(drawerState.currentValue).isEqualTo(BottomDrawerValue.Closed)
-        }
-    }
-
     @OptIn(ExperimentalMaterialApi::class)
     @Test
     fun bottomDrawer_scrim_doesNotClickWhenTransparent() {
@@ -893,19 +693,9 @@
                 scrimColor = scrimColor.value,
                 drawerState = rememberBottomDrawerState(BottomDrawerValue.Open),
                 drawerContent = {
-                    Box(
-                        Modifier
-                            .height(shortBottomDrawerHeight)
-                            .testTag(bottomDrawerTag)
-                    )
+                    Box(Modifier.height(shortBottomDrawerHeight).testTag(bottomDrawerTag))
                 },
-                content = {
-                    Box(
-                        Modifier
-                            .fillMaxSize()
-                            .testTag("body")
-                    )
-                }
+                content = { Box(Modifier.fillMaxSize().testTag("body")) }
             )
             closeDrawer = getString(Strings.CloseDrawer)
         }
@@ -919,12 +709,9 @@
         var topNode = rule.onNodeWithTag(topTag).fetchSemanticsNode()
         assertEquals(3, topNode.children.size)
 
-        rule.onNodeWithContentDescription(closeDrawer)
-            .assertHasClickAction()
+        rule.onNodeWithContentDescription(closeDrawer).assertHasClickAction()
 
-        rule.runOnIdle {
-            scrimColor.value = Color.Unspecified
-        }
+        rule.runOnIdle { scrimColor.value = Color.Unspecified }
         rule.waitForIdle()
 
         topNode = rule.onNodeWithTag(topTag).fetchSemanticsNode()
@@ -943,19 +730,9 @@
                 drawerState = rememberBottomDrawerState(BottomDrawerValue.Open),
                 gesturesEnabled = false,
                 drawerContent = {
-                    Box(
-                        Modifier
-                            .height(shortBottomDrawerHeight)
-                            .testTag(bottomDrawerTag)
-                    )
+                    Box(Modifier.height(shortBottomDrawerHeight).testTag(bottomDrawerTag))
                 },
-                content = {
-                    Box(
-                        Modifier
-                            .fillMaxSize()
-                            .testTag("body")
-                    )
-                }
+                content = { Box(Modifier.fillMaxSize().testTag("body")) }
             )
         }
 
@@ -965,10 +742,7 @@
         // The drawer should be opened
         rule.onNodeWithTag(bottomDrawerTag).assertTopPositionInRootIsEqualTo(topWhenOpened)
 
-        rule.onNodeWithTag(topTag)
-            .onChildAt(1)
-            .assertHasClickAction()
-            .performClick()
+        rule.onNodeWithTag(topTag).onChildAt(1).assertHasClickAction().performClick()
         // still open since the scrim should be disabled
         rule.onNodeWithTag(bottomDrawerTag).assertTopPositionInRootIsEqualTo(topWhenOpened)
     }
@@ -976,332 +750,289 @@
     @OptIn(ExperimentalMaterialApi::class)
     @Test
     @LargeTest
-    fun bottomDrawer_respectsConfirmStateChange(): Unit = runBlocking(AutoTestFrameClock()) {
-        lateinit var drawerState: BottomDrawerState
-        rule.setMaterialContent {
-            drawerState = rememberBottomDrawerState(
-                BottomDrawerValue.Expanded,
-                confirmStateChange = {
-                    it != BottomDrawerValue.Closed
-                }
-            )
-            BottomDrawer(
-                drawerState = drawerState,
-                drawerContent = {
-                    Box(
-                        Modifier
-                            .height(shortBottomDrawerHeight)
-                            .testTag(bottomDrawerTag)
+    fun bottomDrawer_respectsConfirmStateChange(): Unit =
+        runBlocking(AutoTestFrameClock()) {
+            lateinit var drawerState: BottomDrawerState
+            rule.setMaterialContent {
+                drawerState =
+                    rememberBottomDrawerState(
+                        BottomDrawerValue.Expanded,
+                        confirmStateChange = { it != BottomDrawerValue.Closed }
                     )
-                },
-                content = {
-                    Box(
-                        Modifier
-                            .fillMaxSize()
-                    )
-                }
-            )
+                BottomDrawer(
+                    drawerState = drawerState,
+                    drawerContent = {
+                        Box(Modifier.height(shortBottomDrawerHeight).testTag(bottomDrawerTag))
+                    },
+                    content = { Box(Modifier.fillMaxSize()) }
+                )
+            }
+
+            rule.runOnIdle {
+                assertThat(drawerState.currentValue).isEqualTo(BottomDrawerValue.Expanded)
+            }
+
+            rule.onNodeWithTag(bottomDrawerTag).performTouchInput { swipeDown() }
+
+            advanceClock()
+
+            rule.runOnIdle {
+                assertThat(drawerState.currentValue).isEqualTo(BottomDrawerValue.Expanded)
+            }
+
+            rule
+                .onNodeWithTag(bottomDrawerTag, useUnmergedTree = true)
+                .onParent()
+                .performSemanticsAction(SemanticsActions.Dismiss)
+
+            advanceClock()
+
+            rule.runOnIdle {
+                assertThat(drawerState.currentValue).isEqualTo(BottomDrawerValue.Expanded)
+            }
         }
 
-        rule.runOnIdle {
-            assertThat(drawerState.currentValue).isEqualTo(BottomDrawerValue.Expanded)
-        }
-
-        rule.onNodeWithTag(bottomDrawerTag)
-            .performTouchInput { swipeDown() }
-
-        advanceClock()
-
-        rule.runOnIdle {
-            assertThat(drawerState.currentValue).isEqualTo(BottomDrawerValue.Expanded)
-        }
-
-        rule.onNodeWithTag(bottomDrawerTag, useUnmergedTree = true)
-            .onParent()
-            .performSemanticsAction(SemanticsActions.Dismiss)
-
-        advanceClock()
-
-        rule.runOnIdle {
-            assertThat(drawerState.currentValue).isEqualTo(BottomDrawerValue.Expanded)
-        }
-    }
-
     @OptIn(ExperimentalMaterialApi::class)
     @Test
     @LargeTest
-    fun bottomDrawer_expandBySwipe_tallDrawer(): Unit = runBlocking(AutoTestFrameClock()) {
-        val contentTag = "contentTestTag"
-        lateinit var drawerState: BottomDrawerState
-        rule.setMaterialContent {
-            drawerState = rememberBottomDrawerState(BottomDrawerValue.Closed)
-            BottomDrawer(
-                drawerState = drawerState,
-                drawerContent = {
-                    Box(
-                        Modifier
-                            .fillMaxSize()
-                            .testTag(bottomDrawerTag)
+    fun bottomDrawer_expandBySwipe_tallDrawer(): Unit =
+        runBlocking(AutoTestFrameClock()) {
+            val contentTag = "contentTestTag"
+            lateinit var drawerState: BottomDrawerState
+            rule.setMaterialContent {
+                drawerState = rememberBottomDrawerState(BottomDrawerValue.Closed)
+                BottomDrawer(
+                    drawerState = drawerState,
+                    drawerContent = { Box(Modifier.fillMaxSize().testTag(bottomDrawerTag)) },
+                    content = { Box(Modifier.fillMaxSize().testTag(contentTag)) }
+                )
+            }
+
+            val isLandscape = rule.rootWidth() > rule.rootHeight()
+            val peekHeight = with(rule.density) { rule.rootHeight().toPx() / 2 }
+
+            rule.runOnIdle {
+                assertThat(drawerState.currentValue).isEqualTo(BottomDrawerValue.Closed)
+            }
+
+            rule.onNodeWithTag(contentTag).performTouchInput { swipeUp(endY = peekHeight) }
+
+            advanceClock()
+
+            rule.runOnIdle {
+                assertThat(drawerState.currentValue)
+                    .isEqualTo(
+                        if (isLandscape) BottomDrawerValue.Expanded else BottomDrawerValue.Open
                     )
-                },
-                content = {
-                    Box(
-                        Modifier
-                            .fillMaxSize()
-                            .testTag(contentTag)
+            }
+
+            rule.onNodeWithTag(bottomDrawerTag).performTouchInput { swipeUp() }
+
+            advanceClock()
+
+            rule.runOnIdle {
+                assertThat(drawerState.currentValue).isEqualTo(BottomDrawerValue.Expanded)
+            }
+
+            rule.onNodeWithTag(bottomDrawerTag).performTouchInput { swipeDown(endY = peekHeight) }
+
+            advanceClock()
+
+            rule.runOnIdle {
+                assertThat(drawerState.currentValue)
+                    .isEqualTo(
+                        if (isLandscape) BottomDrawerValue.Closed else BottomDrawerValue.Open
                     )
-                }
-            )
+            }
+
+            rule.onNodeWithTag(bottomDrawerTag).performTouchInput { swipeDown() }
+
+            advanceClock()
+
+            rule.runOnIdle {
+                assertThat(drawerState.currentValue).isEqualTo(BottomDrawerValue.Closed)
+            }
         }
 
-        val isLandscape = rule.rootWidth() > rule.rootHeight()
-        val peekHeight = with(rule.density) { rule.rootHeight().toPx() / 2 }
+    @OptIn(ExperimentalMaterialApi::class)
+    @Test
+    fun bottomDrawer_openBySwipe_onBodyContent(): Unit =
+        runBlocking(AutoTestFrameClock()) {
+            val contentTag = "contentTestTag"
+            lateinit var drawerState: BottomDrawerState
+            rule.setMaterialContent {
+                drawerState = rememberBottomDrawerState(BottomDrawerValue.Closed)
+                BottomDrawer(
+                    drawerState = drawerState,
+                    drawerContent = { Box(Modifier.height(shortBottomDrawerHeight)) },
+                    content = { Box(Modifier.fillMaxSize().testTag(contentTag)) }
+                )
+            }
 
-        rule.runOnIdle {
+            rule.runOnIdle {
+                assertThat(drawerState.currentValue).isEqualTo(BottomDrawerValue.Closed)
+            }
+
+            rule.onNodeWithTag(contentTag).performTouchInput { swipeUp() }
+
+            advanceClock()
+
+            rule.runOnIdle {
+                assertThat(drawerState.currentValue).isEqualTo(BottomDrawerValue.Expanded)
+            }
+        }
+
+    @OptIn(ExperimentalMaterialApi::class)
+    @Test
+    fun bottomDrawer_hasDismissAction_whenExpanded(): Unit =
+        runBlocking(AutoTestFrameClock()) {
+            lateinit var drawerState: BottomDrawerState
+            rule.setMaterialContent {
+                drawerState = rememberBottomDrawerState(BottomDrawerValue.Expanded)
+                BottomDrawer(
+                    drawerState = drawerState,
+                    drawerContent = { Box(Modifier.fillMaxSize().testTag(bottomDrawerTag)) },
+                    content = {}
+                )
+            }
+
+            val height = rule.rootHeight()
+            rule
+                .onNodeWithTag(bottomDrawerTag)
+                .onParent()
+                .assert(SemanticsMatcher.keyIsDefined(SemanticsActions.Dismiss))
+                .performSemanticsAction(SemanticsActions.Dismiss)
+
+            advanceClock()
+
+            rule.onNodeWithTag(bottomDrawerTag).assertTopPositionInRootIsEqualTo(height)
+        }
+
+    @OptIn(ExperimentalMaterialApi::class)
+    @Test
+    @LargeTest
+    fun bottomDrawer_noDismissActionWhenClosed_hasDissmissActionWhenOpen(): Unit =
+        runBlocking(AutoTestFrameClock()) {
+            lateinit var drawerState: BottomDrawerState
+            rule.setMaterialContent {
+                drawerState = rememberBottomDrawerState(BottomDrawerValue.Closed)
+                BottomDrawer(
+                    drawerState = drawerState,
+                    drawerContent = { Box(Modifier.fillMaxSize().testTag(bottomDrawerTag)) },
+                    content = {}
+                )
+            }
+
+            // Drawer should start in closed state and have no dismiss action
             assertThat(drawerState.currentValue).isEqualTo(BottomDrawerValue.Closed)
+            rule
+                .onNodeWithTag(bottomDrawerTag, useUnmergedTree = true)
+                .onParent()
+                .assert(SemanticsMatcher.keyNotDefined(SemanticsActions.Dismiss))
+
+            // When the drawer state is set to Open or Expanded
+            drawerState.open()
+            assertThat(drawerState.currentValue)
+                .isAnyOf(BottomDrawerValue.Open, BottomDrawerValue.Expanded)
+            // Then the drawer should be opened and have dismiss action
+            rule
+                .onNodeWithTag(bottomDrawerTag, useUnmergedTree = true)
+                .onParent()
+                .assert(SemanticsMatcher.keyIsDefined(SemanticsActions.Dismiss))
+
+            // When the drawer state is set to Closed using dismiss action
+            rule
+                .onNodeWithTag(bottomDrawerTag, useUnmergedTree = true)
+                .onParent()
+                .performSemanticsAction(SemanticsActions.Dismiss)
+            // Then the drawer should be closed and have no dismiss action
+            rule
+                .onNodeWithTag(bottomDrawerTag, useUnmergedTree = true)
+                .onParent()
+                .assert(SemanticsMatcher.keyNotDefined(SemanticsActions.Dismiss))
         }
 
-        rule.onNodeWithTag(contentTag)
-            .performTouchInput { swipeUp(endY = peekHeight) }
-
-        advanceClock()
-
-        rule.runOnIdle {
-            assertThat(drawerState.currentValue).isEqualTo(
-                if (isLandscape) BottomDrawerValue.Expanded else BottomDrawerValue.Open
-            )
-        }
-
-        rule.onNodeWithTag(bottomDrawerTag)
-            .performTouchInput { swipeUp() }
-
-        advanceClock()
-
-        rule.runOnIdle {
-            assertThat(drawerState.currentValue).isEqualTo(BottomDrawerValue.Expanded)
-        }
-
-        rule.onNodeWithTag(bottomDrawerTag)
-            .performTouchInput { swipeDown(endY = peekHeight) }
-
-        advanceClock()
-
-        rule.runOnIdle {
-            assertThat(drawerState.currentValue).isEqualTo(
-                if (isLandscape) BottomDrawerValue.Closed else BottomDrawerValue.Open
-            )
-        }
-
-        rule.onNodeWithTag(bottomDrawerTag)
-            .performTouchInput { swipeDown() }
-
-        advanceClock()
-
-        rule.runOnIdle {
-            assertThat(drawerState.currentValue).isEqualTo(BottomDrawerValue.Closed)
-        }
-    }
-
-    @OptIn(ExperimentalMaterialApi::class)
-    @Test
-    fun bottomDrawer_openBySwipe_onBodyContent(): Unit = runBlocking(AutoTestFrameClock()) {
-        val contentTag = "contentTestTag"
-        lateinit var drawerState: BottomDrawerState
-        rule.setMaterialContent {
-            drawerState = rememberBottomDrawerState(BottomDrawerValue.Closed)
-            BottomDrawer(
-                drawerState = drawerState,
-                drawerContent = { Box(Modifier.height(shortBottomDrawerHeight)) },
-                content = {
-                    Box(
-                        Modifier
-                            .fillMaxSize()
-                            .testTag(contentTag)
-                    )
-                }
-            )
-        }
-
-        rule.runOnIdle {
-            assertThat(drawerState.currentValue).isEqualTo(BottomDrawerValue.Closed)
-        }
-
-        rule.onNodeWithTag(contentTag)
-            .performTouchInput { swipeUp() }
-
-        advanceClock()
-
-        rule.runOnIdle {
-            assertThat(drawerState.currentValue).isEqualTo(BottomDrawerValue.Expanded)
-        }
-    }
-
-    @OptIn(ExperimentalMaterialApi::class)
-    @Test
-    fun bottomDrawer_hasDismissAction_whenExpanded(): Unit = runBlocking(AutoTestFrameClock()) {
-        lateinit var drawerState: BottomDrawerState
-        rule.setMaterialContent {
-            drawerState = rememberBottomDrawerState(BottomDrawerValue.Expanded)
-            BottomDrawer(
-                drawerState = drawerState,
-                drawerContent = {
-                    Box(
-                        Modifier
-                            .fillMaxSize()
-                            .testTag(bottomDrawerTag)
-                    )
-                },
-                content = {}
-            )
-        }
-
-        val height = rule.rootHeight()
-        rule.onNodeWithTag(bottomDrawerTag).onParent()
-            .assert(SemanticsMatcher.keyIsDefined(SemanticsActions.Dismiss))
-            .performSemanticsAction(SemanticsActions.Dismiss)
-
-        advanceClock()
-
-        rule.onNodeWithTag(bottomDrawerTag)
-            .assertTopPositionInRootIsEqualTo(height)
-    }
-
     @OptIn(ExperimentalMaterialApi::class)
     @Test
     @LargeTest
-    fun bottomDrawer_noDismissActionWhenClosed_hasDissmissActionWhenOpen(): Unit = runBlocking(
-        AutoTestFrameClock()
-    ) {
-        lateinit var drawerState: BottomDrawerState
-        rule.setMaterialContent {
-            drawerState = rememberBottomDrawerState(BottomDrawerValue.Closed)
-            BottomDrawer(
-                drawerState = drawerState,
-                drawerContent = {
-                    Box(
-                        Modifier
-                            .fillMaxSize()
-                            .testTag(bottomDrawerTag)
-                    )
-                },
-                content = {}
-            )
+    fun bottomDrawer_openAndClose_shortDrawer(): Unit =
+        runBlocking(AutoTestFrameClock()) {
+            lateinit var drawerState: BottomDrawerState
+            rule.setMaterialContent {
+                drawerState = rememberBottomDrawerState(BottomDrawerValue.Closed)
+                BottomDrawer(
+                    drawerState = drawerState,
+                    drawerContent = {
+                        Box(Modifier.height(shortBottomDrawerHeight).testTag(bottomDrawerTag))
+                    },
+                    content = {}
+                )
+            }
+
+            val height = rule.rootHeight()
+            val topWhenOpened = height - shortBottomDrawerHeight
+            val topWhenExpanded = topWhenOpened
+            val topWhenClosed = height
+
+            // Drawer should start in closed state
+            rule.onNodeWithTag(bottomDrawerTag).assertTopPositionInRootIsEqualTo(topWhenClosed)
+
+            // When the drawer state is set to Opened
+            drawerState.open()
+            // Then the drawer should be opened
+            rule.onNodeWithTag(bottomDrawerTag).assertTopPositionInRootIsEqualTo(topWhenOpened)
+
+            // When the drawer state is set to Expanded
+            drawerState.expand()
+            // Then the drawer should be expanded
+            rule.onNodeWithTag(bottomDrawerTag).assertTopPositionInRootIsEqualTo(topWhenExpanded)
+
+            // When the drawer state is set to Closed
+            drawerState.close()
+            // Then the drawer should be closed
+            rule.onNodeWithTag(bottomDrawerTag).assertTopPositionInRootIsEqualTo(topWhenClosed)
         }
 
-        // Drawer should start in closed state and have no dismiss action
-        assertThat(drawerState.currentValue).isEqualTo(BottomDrawerValue.Closed)
-        rule.onNodeWithTag(bottomDrawerTag, useUnmergedTree = true)
-            .onParent()
-            .assert(SemanticsMatcher.keyNotDefined(SemanticsActions.Dismiss))
-
-        // When the drawer state is set to Open or Expanded
-        drawerState.open()
-        assertThat(drawerState.currentValue)
-            .isAnyOf(BottomDrawerValue.Open, BottomDrawerValue.Expanded)
-        // Then the drawer should be opened and have dismiss action
-        rule.onNodeWithTag(bottomDrawerTag, useUnmergedTree = true)
-            .onParent()
-            .assert(SemanticsMatcher.keyIsDefined(SemanticsActions.Dismiss))
-
-        // When the drawer state is set to Closed using dismiss action
-        rule.onNodeWithTag(bottomDrawerTag, useUnmergedTree = true)
-            .onParent()
-            .performSemanticsAction(SemanticsActions.Dismiss)
-        // Then the drawer should be closed and have no dismiss action
-        rule.onNodeWithTag(bottomDrawerTag, useUnmergedTree = true)
-            .onParent()
-            .assert(SemanticsMatcher.keyNotDefined(SemanticsActions.Dismiss))
-    }
-
     @OptIn(ExperimentalMaterialApi::class)
     @Test
     @LargeTest
-    fun bottomDrawer_openAndClose_shortDrawer(): Unit = runBlocking(AutoTestFrameClock()) {
-        lateinit var drawerState: BottomDrawerState
-        rule.setMaterialContent {
-            drawerState = rememberBottomDrawerState(BottomDrawerValue.Closed)
-            BottomDrawer(
-                drawerState = drawerState,
-                drawerContent = {
-                    Box(
-                        Modifier
-                            .height(shortBottomDrawerHeight)
-                            .testTag(bottomDrawerTag)
-                    )
-                },
-                content = {}
-            )
+    fun bottomDrawer_openAndClose_tallDrawer(): Unit =
+        runBlocking(AutoTestFrameClock()) {
+            lateinit var drawerState: BottomDrawerState
+            rule.setMaterialContent {
+                drawerState = rememberBottomDrawerState(BottomDrawerValue.Closed)
+                BottomDrawer(
+                    drawerState = drawerState,
+                    drawerContent = { Box(Modifier.fillMaxSize().testTag(bottomDrawerTag)) },
+                    content = {}
+                )
+            }
+
+            val width = rule.rootWidth()
+            val height = rule.rootHeight()
+            val topWhenOpened = if (width > height) 0.dp else (height / 2)
+            val topWhenExpanded = 0.dp
+            val topWhenClosed = height
+
+            // Drawer should start in closed state
+            rule.onNodeWithTag(bottomDrawerTag).assertTopPositionInRootIsEqualTo(topWhenClosed)
+
+            // When the drawer state is set to Opened
+            drawerState.open()
+            // Then the drawer should be opened
+            rule.onNodeWithTag(bottomDrawerTag).assertTopPositionInRootIsEqualTo(topWhenOpened)
+
+            // When the drawer state is set to Expanded
+            drawerState.expand()
+            // Then the drawer should be expanded
+            rule.onNodeWithTag(bottomDrawerTag).assertTopPositionInRootIsEqualTo(topWhenExpanded)
+
+            // When the drawer state is set to Closed
+            drawerState.close()
+            // Then the drawer should be closed
+            rule.onNodeWithTag(bottomDrawerTag).assertTopPositionInRootIsEqualTo(topWhenClosed)
         }
 
-        val height = rule.rootHeight()
-        val topWhenOpened = height - shortBottomDrawerHeight
-        val topWhenExpanded = topWhenOpened
-        val topWhenClosed = height
-
-        // Drawer should start in closed state
-        rule.onNodeWithTag(bottomDrawerTag).assertTopPositionInRootIsEqualTo(topWhenClosed)
-
-        // When the drawer state is set to Opened
-        drawerState.open()
-        // Then the drawer should be opened
-        rule.onNodeWithTag(bottomDrawerTag).assertTopPositionInRootIsEqualTo(topWhenOpened)
-
-        // When the drawer state is set to Expanded
-        drawerState.expand()
-        // Then the drawer should be expanded
-        rule.onNodeWithTag(bottomDrawerTag).assertTopPositionInRootIsEqualTo(topWhenExpanded)
-
-        // When the drawer state is set to Closed
-        drawerState.close()
-        // Then the drawer should be closed
-        rule.onNodeWithTag(bottomDrawerTag).assertTopPositionInRootIsEqualTo(topWhenClosed)
-    }
-
-    @OptIn(ExperimentalMaterialApi::class)
-    @Test
-    @LargeTest
-    fun bottomDrawer_openAndClose_tallDrawer(): Unit = runBlocking(AutoTestFrameClock()) {
-        lateinit var drawerState: BottomDrawerState
-        rule.setMaterialContent {
-            drawerState = rememberBottomDrawerState(BottomDrawerValue.Closed)
-            BottomDrawer(
-                drawerState = drawerState,
-                drawerContent = {
-                    Box(
-                        Modifier
-                            .fillMaxSize()
-                            .testTag(bottomDrawerTag)
-                    )
-                },
-                content = {}
-            )
-        }
-
-        val width = rule.rootWidth()
-        val height = rule.rootHeight()
-        val topWhenOpened = if (width > height) 0.dp else (height / 2)
-        val topWhenExpanded = 0.dp
-        val topWhenClosed = height
-
-        // Drawer should start in closed state
-        rule.onNodeWithTag(bottomDrawerTag).assertTopPositionInRootIsEqualTo(topWhenClosed)
-
-        // When the drawer state is set to Opened
-        drawerState.open()
-        // Then the drawer should be opened
-        rule.onNodeWithTag(bottomDrawerTag).assertTopPositionInRootIsEqualTo(topWhenOpened)
-
-        // When the drawer state is set to Expanded
-        drawerState.expand()
-        // Then the drawer should be expanded
-        rule.onNodeWithTag(bottomDrawerTag).assertTopPositionInRootIsEqualTo(topWhenExpanded)
-
-        // When the drawer state is set to Closed
-        drawerState.close()
-        // Then the drawer should be closed
-        rule.onNodeWithTag(bottomDrawerTag).assertTopPositionInRootIsEqualTo(topWhenClosed)
-    }
-
     @Test
     fun modalDrawer_scrimNode_reportToSemanticsWhenOpen_notReportToSemanticsWhenClosed() {
         val topTag = "ModalDrawer"
@@ -1310,20 +1041,8 @@
             ModalDrawer(
                 modifier = Modifier.testTag(topTag),
                 drawerState = rememberDrawerState(DrawerValue.Open),
-                drawerContent = {
-                    Box(
-                        Modifier
-                            .fillMaxSize()
-                            .testTag("drawer")
-                    )
-                },
-                content = {
-                    Box(
-                        Modifier
-                            .fillMaxSize()
-                            .testTag("body")
-                    )
-                }
+                drawerContent = { Box(Modifier.fillMaxSize().testTag("drawer")) },
+                content = { Box(Modifier.fillMaxSize().testTag("body")) }
             )
             closeDrawer = getString(Strings.CloseDrawer)
         }
@@ -1333,7 +1052,8 @@
 
         var topNode = rule.onNodeWithTag(topTag).fetchSemanticsNode()
         assertEquals(3, topNode.children.size)
-        rule.onNodeWithContentDescription(closeDrawer)
+        rule
+            .onNodeWithContentDescription(closeDrawer)
             .assertHasClickAction()
             .performSemanticsAction(SemanticsActions.OnClick)
 
@@ -1353,19 +1073,9 @@
                 modifier = Modifier.testTag(topTag),
                 drawerState = rememberBottomDrawerState(BottomDrawerValue.Open),
                 drawerContent = {
-                    Box(
-                        Modifier
-                            .height(shortBottomDrawerHeight)
-                            .testTag(bottomDrawerTag)
-                    )
+                    Box(Modifier.height(shortBottomDrawerHeight).testTag(bottomDrawerTag))
                 },
-                content = {
-                    Box(
-                        Modifier
-                            .fillMaxSize()
-                            .testTag("body")
-                    )
-                }
+                content = { Box(Modifier.fillMaxSize().testTag("body")) }
             )
         }
 
@@ -1377,7 +1087,8 @@
 
         var topNode = rule.onNodeWithTag(topTag).fetchSemanticsNode()
         assertEquals(3, topNode.children.size)
-        rule.onNodeWithTag(topTag)
+        rule
+            .onNodeWithTag(topTag)
             .onChildAt(1)
             .assertHasClickAction()
             .performSemanticsAction(SemanticsActions.OnClick)
@@ -1398,24 +1109,25 @@
         rule.setMaterialContent {
             BottomDrawer(
                 drawerState = state,
-                drawerContent = {
-                    Box(Modifier.height(size))
-                },
+                drawerContent = { Box(Modifier.height(size)) },
                 content = { Box(Modifier.fillMaxSize()) },
             )
         }
         val rootHeight = rule.rootHeight()
-        assertThat(state.requireOffset()).isWithin(0.5f)
+        assertThat(state.requireOffset())
+            .isWithin(0.5f)
             .of(with(rule.density) { (rootHeight - size).toPx() })
 
         size = 100.dp
         rule.waitForIdle()
-        assertThat(state.requireOffset()).isWithin(0.5f)
+        assertThat(state.requireOffset())
+            .isWithin(0.5f)
             .of(with(rule.density) { (rootHeight - size).toPx() })
 
         size = 30.dp
         rule.waitForIdle()
-        assertThat(state.requireOffset()).isWithin(0.5f)
+        assertThat(state.requireOffset())
+            .isWithin(0.5f)
             .of(with(rule.density) { (rootHeight - size).toPx() })
     }
 
@@ -1441,8 +1153,9 @@
         assertThat(drawerState.currentValue).isEqualTo(BottomDrawerValue.Closed)
         assertThat(drawerState.anchoredDraggableState.anchors.hasAnchorFor(BottomDrawerValue.Open))
             .isFalse()
-        assertThat(drawerState.anchoredDraggableState.anchors
-            .hasAnchorFor(BottomDrawerValue.Expanded))
+        assertThat(
+                drawerState.anchoredDraggableState.anchors.hasAnchorFor(BottomDrawerValue.Expanded)
+            )
             .isFalse()
 
         scope.launch { drawerState.open() }
@@ -1478,8 +1191,9 @@
         assertThat(drawerState.currentValue).isEqualTo(BottomDrawerValue.Closed)
         assertThat(drawerState.anchoredDraggableState.anchors.hasAnchorFor(BottomDrawerValue.Open))
             .isFalse()
-        assertThat(drawerState.anchoredDraggableState.anchors
-            .hasAnchorFor(BottomDrawerValue.Expanded))
+        assertThat(
+                drawerState.anchoredDraggableState.anchors.hasAnchorFor(BottomDrawerValue.Expanded)
+            )
             .isFalse()
 
         scope.launch { drawerState.open() }
@@ -1501,10 +1215,11 @@
         val animationLengthMillis = 192
         val amountOfFramesForAnimation = animationLengthMillis / 16
         rule.setContent {
-            drawerState = rememberBottomDrawerState(
-                BottomDrawerValue.Closed,
-                animationSpec = tween(animationLengthMillis, easing = LinearEasing)
-            )
+            drawerState =
+                rememberBottomDrawerState(
+                    BottomDrawerValue.Closed,
+                    animationSpec = tween(animationLengthMillis, easing = LinearEasing)
+                )
             scope = rememberCoroutineScope()
             BottomDrawer(
                 drawerState = drawerState,
@@ -1515,22 +1230,20 @@
 
         assertThat(drawerState.currentValue).isEqualTo(BottomDrawerValue.Closed)
         assertThat(drawerState.targetValue).isEqualTo(BottomDrawerValue.Closed)
-        assertThat(drawerState.progress(
-            from = BottomDrawerValue.Closed,
-            to = BottomDrawerValue.Open
-        )).isEqualTo(0f)
+        assertThat(
+                drawerState.progress(from = BottomDrawerValue.Closed, to = BottomDrawerValue.Open)
+            )
+            .isEqualTo(0f)
 
         scope.launch { drawerState.open() }
         rule.mainClock.advanceTimeByFrame() // Start dispatching and running the animation
 
         repeat(amountOfFramesForAnimation) { frame ->
             val frameFraction = (frame / amountOfFramesForAnimation.toFloat())
-            val closedToOpenProgress = drawerState.progress(
-                from = BottomDrawerValue.Closed, to = BottomDrawerValue.Open
-            )
-            val openToClosedProgress = drawerState.progress(
-                from = BottomDrawerValue.Open, to = BottomDrawerValue.Closed
-            )
+            val closedToOpenProgress =
+                drawerState.progress(from = BottomDrawerValue.Closed, to = BottomDrawerValue.Open)
+            val openToClosedProgress =
+                drawerState.progress(from = BottomDrawerValue.Open, to = BottomDrawerValue.Closed)
             assertThat(closedToOpenProgress).isWithin(0.001f).of(frameFraction)
             assertThat(openToClosedProgress).isWithin(0.001f).of(1 - frameFraction)
             rule.mainClock.advanceTimeByFrame()
@@ -1545,12 +1258,10 @@
 
         repeat(amountOfFramesForAnimation) { frame ->
             val frameFraction = (frame / amountOfFramesForAnimation.toFloat())
-            val closedToOpenProgress = drawerState.progress(
-                from = BottomDrawerValue.Closed, to = BottomDrawerValue.Open
-            )
-            val openToClosedProgress = drawerState.progress(
-                from = BottomDrawerValue.Open, to = BottomDrawerValue.Closed
-            )
+            val closedToOpenProgress =
+                drawerState.progress(from = BottomDrawerValue.Closed, to = BottomDrawerValue.Open)
+            val openToClosedProgress =
+                drawerState.progress(from = BottomDrawerValue.Open, to = BottomDrawerValue.Closed)
             assertThat(closedToOpenProgress).isWithin(0.001f).of(1 - frameFraction)
             assertThat(openToClosedProgress).isWithin(0.001f).of(frameFraction)
             rule.mainClock.advanceTimeByFrame()
diff --git a/compose/material/material/src/androidInstrumentedTest/kotlin/androidx/compose/material/ElevationOverlayTest.kt b/compose/material/material/src/androidInstrumentedTest/kotlin/androidx/compose/material/ElevationOverlayTest.kt
index 90d0c21..d820610 100644
--- a/compose/material/material/src/androidInstrumentedTest/kotlin/androidx/compose/material/ElevationOverlayTest.kt
+++ b/compose/material/material/src/androidInstrumentedTest/kotlin/androidx/compose/material/ElevationOverlayTest.kt
@@ -51,37 +51,37 @@
         @JvmStatic
         @Parameterized.Parameters(name = "{0}")
         // Mappings for elevation -> expected alpha for the overlay color in dark theme
-        fun initElevation(): Array<Any> = arrayOf(
-            arrayOf(0.dp, 0f, null),
-            arrayOf(1.dp, 0.05f, null),
-            arrayOf(2.dp, 0.07f, null),
-            arrayOf(3.dp, 0.08f, null),
-            arrayOf(4.dp, 0.09f, null),
-            arrayOf(6.dp, 0.11f, null),
-            arrayOf(8.dp, 0.12f, null),
-            arrayOf(12.dp, 0.14f, null),
-            arrayOf(16.dp, 0.15f, null),
-            arrayOf(24.dp, 0.16f, null)
-        )
+        fun initElevation(): Array<Any> =
+            arrayOf(
+                arrayOf(0.dp, 0f, null),
+                arrayOf(1.dp, 0.05f, null),
+                arrayOf(2.dp, 0.07f, null),
+                arrayOf(3.dp, 0.08f, null),
+                arrayOf(4.dp, 0.09f, null),
+                arrayOf(6.dp, 0.11f, null),
+                arrayOf(8.dp, 0.12f, null),
+                arrayOf(12.dp, 0.14f, null),
+                arrayOf(16.dp, 0.15f, null),
+                arrayOf(24.dp, 0.16f, null)
+            )
     }
 
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
     @Test
     fun correctElevationOverlayInDarkTheme() {
         val colors = darkColors()
 
-        rule.setContent {
-            TestSurface(elevation!!, colors)
-        }
+        rule.setContent { TestSurface(elevation!!, colors) }
 
-        val expectedSurfaceColor = calculateTestSurfaceColor(
-            surfaceColor = colors.surface,
-            foregroundColor = colors.onSurface
-        )
+        val expectedSurfaceColor =
+            calculateTestSurfaceColor(
+                surfaceColor = colors.surface,
+                foregroundColor = colors.onSurface
+            )
 
-        rule.onNodeWithTag(Tag)
+        rule
+            .onNodeWithTag(Tag)
             .captureToImage()
             .toPixelMap()
             .assertPixelColor(
@@ -102,11 +102,11 @@
             }
         }
 
-        val expectedSurfaceColor = colors.onSurface
-            .copy(alpha = 0.09f)
-            .compositeOver(colors.surface)
+        val expectedSurfaceColor =
+            colors.onSurface.copy(alpha = 0.09f).compositeOver(colors.surface)
 
-        rule.onNodeWithTag(Tag)
+        rule
+            .onNodeWithTag(Tag)
             .captureToImage()
             .toPixelMap()
             .assertPixelColor(
@@ -120,21 +120,19 @@
     fun correctElevationOverlayWithCustomContentColor() {
         val customContentColor = Color.Blue
 
-        val customColors = darkColors(
-            onBackground = customContentColor,
-            onSurface = customContentColor
-        )
+        val customColors =
+            darkColors(onBackground = customContentColor, onSurface = customContentColor)
 
-        rule.setContent {
-            TestSurface(elevation!!, customColors)
-        }
+        rule.setContent { TestSurface(elevation!!, customColors) }
 
-        val expectedSurfaceColor = calculateTestSurfaceColor(
-            surfaceColor = customColors.surface,
-            foregroundColor = customContentColor
-        )
+        val expectedSurfaceColor =
+            calculateTestSurfaceColor(
+                surfaceColor = customColors.surface,
+                foregroundColor = customContentColor
+            )
 
-        rule.onNodeWithTag(Tag)
+        rule
+            .onNodeWithTag(Tag)
             .captureToImage()
             .toPixelMap()
             .assertPixelColor(
@@ -148,14 +146,13 @@
     fun noChangesInLightTheme() {
         val colors = lightColors()
 
-        rule.setContent {
-            TestSurface(elevation!!, lightColors())
-        }
+        rule.setContent { TestSurface(elevation!!, lightColors()) }
 
         // No overlay should be applied in light theme
         val expectedSurfaceColor = colors.surface
 
-        rule.onNodeWithTag(Tag)
+        rule
+            .onNodeWithTag(Tag)
             .captureToImage()
             .toPixelMap()
             .assertPixelColor(
@@ -179,7 +176,8 @@
         // No overlay should be applied
         val expectedSurfaceColor = colors.surface
 
-        rule.onNodeWithTag(Tag)
+        rule
+            .onNodeWithTag(Tag)
             .captureToImage()
             .toPixelMap()
             .assertPixelColor(
@@ -193,10 +191,11 @@
     fun customElevationOverlay() {
         val customOverlayColor = Color.Red
 
-        val customOverlay = object : ElevationOverlay {
-            @Composable
-            override fun apply(color: Color, elevation: Dp): Color = customOverlayColor
-        }
+        val customOverlay =
+            object : ElevationOverlay {
+                @Composable
+                override fun apply(color: Color, elevation: Dp): Color = customOverlayColor
+            }
 
         rule.setContent {
             CompositionLocalProvider(LocalElevationOverlay provides customOverlay) {
@@ -204,7 +203,8 @@
             }
         }
 
-        rule.onNodeWithTag(Tag)
+        rule
+            .onNodeWithTag(Tag)
             .captureToImage()
             .toPixelMap()
             .assertPixelColor(
@@ -216,7 +216,7 @@
 
     /**
      * @return the resulting color from compositing [foregroundColor] with [expectedOverlayAlpha]
-     * over [surfaceColor].
+     *   over [surfaceColor].
      */
     private fun calculateTestSurfaceColor(surfaceColor: Color, foregroundColor: Color): Color {
         return foregroundColor.copy(expectedOverlayAlpha).compositeOver(surfaceColor)
@@ -231,10 +231,8 @@
                 with(LocalDensity.current) {
                     // Make the surface size small so we compare less pixels
                     Box(
-                        Modifier.size(
-                            SurfaceSize.width.toDp(),
-                            SurfaceSize.height.toDp()
-                        ).testTag(Tag)
+                        Modifier.size(SurfaceSize.width.toDp(), SurfaceSize.height.toDp())
+                            .testTag(Tag)
                     )
                 }
             }
diff --git a/compose/material/material/src/androidInstrumentedTest/kotlin/androidx/compose/material/ExposedDropdownMenuTest.kt b/compose/material/material/src/androidInstrumentedTest/kotlin/androidx/compose/material/ExposedDropdownMenuTest.kt
index 60db6d4..fec062f 100644
--- a/compose/material/material/src/androidInstrumentedTest/kotlin/androidx/compose/material/ExposedDropdownMenuTest.kt
+++ b/compose/material/material/src/androidInstrumentedTest/kotlin/androidx/compose/material/ExposedDropdownMenuTest.kt
@@ -69,8 +69,7 @@
 @RunWith(AndroidJUnit4::class)
 class ExposedDropdownMenuTest {
 
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
     private val EDMBoxTag = "ExposedDropdownMenuBoxTag"
     private val TFTag = "TextFieldTag"
@@ -87,9 +86,7 @@
             ExposedDropdownMenuForTest(
                 expanded = expanded,
                 onExpandChange = { expanded = it },
-                onTextFieldBoundsChanged = {
-                    textFieldBounds = it
-                }
+                onTextFieldBoundsChanged = { textFieldBounds = it }
             )
         }
 
@@ -102,10 +99,11 @@
         rule.onNodeWithTag(MenuItemTag).assertIsDisplayed()
 
         // Click outside EDM
-        UiDevice.getInstance(InstrumentationRegistry.getInstrumentation()).click(
-            (textFieldBounds.right + 1).toInt(),
-            (textFieldBounds.bottom + 1).toInt(),
-        )
+        UiDevice.getInstance(InstrumentationRegistry.getInstrumentation())
+            .click(
+                (textFieldBounds.right + 1).toInt(),
+                (textFieldBounds.bottom + 1).toInt(),
+            )
 
         rule.onNodeWithTag(MenuItemTag).assertDoesNotExist()
     }
@@ -114,10 +112,7 @@
     fun expandedBehaviour_collapseOnTextFieldClick() {
         rule.setMaterialContent {
             var expanded by remember { mutableStateOf(true) }
-            ExposedDropdownMenuForTest(
-                expanded = expanded,
-                onExpandChange = { expanded = it }
-            )
+            ExposedDropdownMenuForTest(expanded = expanded, onExpandChange = { expanded = it })
         }
 
         rule.onNodeWithTag(TFTag).assertIsDisplayed()
@@ -134,10 +129,7 @@
     fun edm_doesNotCollapse_whenTypingOnSoftKeyboard() {
         rule.setMaterialContent {
             var expanded by remember { mutableStateOf(false) }
-            ExposedDropdownMenuForTest(
-                expanded = expanded,
-                onExpandChange = { expanded = it }
-            )
+            ExposedDropdownMenuForTest(expanded = expanded, onExpandChange = { expanded = it })
         }
 
         rule.onNodeWithTag(TFTag).performClick()
@@ -159,9 +151,7 @@
         }
 
         val matcher = hasText("zzz")
-        rule.waitUntil {
-            matcher.matches(rule.onNodeWithTag(TFTag).fetchSemanticsNode())
-        }
+        rule.waitUntil { matcher.matches(rule.onNodeWithTag(TFTag).fetchSemanticsNode()) }
         rule.onNodeWithTag(MenuItemTag).assertIsDisplayed()
     }
 
@@ -193,9 +183,7 @@
             ExposedDropdownMenuForTest(
                 expanded = expanded,
                 onExpandChange = { expanded = it },
-                onTextFieldBoundsChanged = {
-                    textFieldBounds = it
-                }
+                onTextFieldBoundsChanged = { textFieldBounds = it }
             )
         }
 
@@ -242,11 +230,14 @@
                         modifier = Modifier.padding(8.dp),
                     ) {
                         TextField(
-                            modifier = Modifier.then(
-                                if (index == testIndex) Modifier.testTag(TFTag).onSizeChanged {
-                                    textFieldSize = it
-                                } else { Modifier }
-                            ),
+                            modifier =
+                                Modifier.then(
+                                    if (index == testIndex)
+                                        Modifier.testTag(TFTag).onSizeChanged { textFieldSize = it }
+                                    else {
+                                        Modifier
+                                    }
+                                ),
                             value = selectedOptionText,
                             onValueChange = { selectedOptionText = it },
                             label = { Text("Label") },
@@ -254,9 +245,12 @@
                             colors = ExposedDropdownMenuDefaults.textFieldColors()
                         )
                         ExposedDropdownMenu(
-                            modifier = if (index == testIndex) {
-                                Modifier.testTag(EDMTag)
-                            } else { Modifier },
+                            modifier =
+                                if (index == testIndex) {
+                                    Modifier.testTag(EDMTag)
+                                } else {
+                                    Modifier
+                                },
                             expanded = expanded,
                             onDismissRequest = { expanded = false }
                         ) {
@@ -265,9 +259,12 @@
                                     selectedOptionText = OptionName
                                     expanded = false
                                 },
-                                modifier = if (index == testIndex) {
-                                    Modifier.testTag(MenuItemTag)
-                                } else { Modifier }
+                                modifier =
+                                    if (index == testIndex) {
+                                        Modifier.testTag(MenuItemTag)
+                                    } else {
+                                        Modifier
+                                    }
                             ) {
                                 Text(OptionName)
                             }
@@ -311,31 +308,22 @@
             ExposedDropdownMenuForTest(
                 expanded = expanded,
                 onExpandChange = { expanded = it },
-                onTextFieldBoundsChanged = {
-                    textFieldBounds = it
-                },
-                onMenuBoundsChanged = {
-                    menuBounds = it
-                }
+                onTextFieldBoundsChanged = { textFieldBounds = it },
+                onMenuBoundsChanged = { menuBounds = it }
             )
         }
 
         rule.onNodeWithTag(TFTag).assertIsDisplayed()
         rule.onNodeWithTag(MenuItemTag).assertIsDisplayed()
 
-        rule.runOnIdle {
-            assertThat(menuBounds.width).isEqualTo(textFieldBounds.width)
-        }
+        rule.runOnIdle { assertThat(menuBounds.width).isEqualTo(textFieldBounds.width) }
     }
 
     @Test
     fun EDMBehaviour_rightOptionIsChosen() {
         rule.setMaterialContent {
             var expanded by remember { mutableStateOf(true) }
-            ExposedDropdownMenuForTest(
-                expanded = expanded,
-                onExpandChange = { expanded = it }
-            )
+            ExposedDropdownMenuForTest(expanded = expanded, onExpandChange = { expanded = it })
         }
 
         rule.onNodeWithTag(TFTag).assertIsDisplayed()
@@ -356,34 +344,39 @@
         rule.setContent {
             AndroidView(
                 factory = { context ->
-                    FrameLayout(context).apply {
-                        addView(ComposeView(context).apply {
-                            setContent {
-                                ExposedDropdownMenuBox(expanded = true, onExpandedChange = {}) {
-                                    TextField(
-                                        value = "Text",
-                                        onValueChange = {},
-                                    )
-                                    ExposedDropdownMenu(
-                                        expanded = true,
-                                        onDismissRequest = {},
-                                    ) {
-                                        DropdownMenuItem(
-                                            content = { Text(OptionName) },
-                                            onClick = {},
-                                        )
+                    FrameLayout(context)
+                        .apply {
+                            addView(
+                                ComposeView(context).apply {
+                                    setContent {
+                                        ExposedDropdownMenuBox(
+                                            expanded = true,
+                                            onExpandedChange = {}
+                                        ) {
+                                            TextField(
+                                                value = "Text",
+                                                onValueChange = {},
+                                            )
+                                            ExposedDropdownMenu(
+                                                expanded = true,
+                                                onDismissRequest = {},
+                                            ) {
+                                                DropdownMenuItem(
+                                                    content = { Text(OptionName) },
+                                                    onClick = {},
+                                                )
+                                            }
+                                        }
                                     }
                                 }
-                            }
-                        })
-                    }.also { parent = it }
+                            )
+                        }
+                        .also { parent = it }
                 }
             )
         }
 
-        rule.runOnIdle {
-            parent!!.removeAllViews()
-        }
+        rule.runOnIdle { parent!!.removeAllViews() }
 
         rule.waitForIdle()
 
@@ -397,30 +390,27 @@
                 ExposedDropdownMenuBox(
                     modifier = Modifier.align(Alignment.Center),
                     expanded = true,
-                    onExpandedChange = { }
+                    onExpandedChange = {}
                 ) {
                     val scrollState = rememberScrollState()
                     TextField(
                         value = "",
-                        onValueChange = { },
+                        onValueChange = {},
                         label = { Text("Label") },
                     )
                     ExposedDropdownMenu(
                         expanded = true,
-                        onDismissRequest = { },
+                        onDismissRequest = {},
                         scrollState = scrollState
                     ) {
                         repeat(100) {
                             Box(
-                                Modifier
-                                    .testTag("MenuContent ${it + 1}")
+                                Modifier.testTag("MenuContent ${it + 1}")
                                     .size(with(LocalDensity.current) { 70.toDp() })
                             )
                         }
                     }
-                    LaunchedEffect(Unit) {
-                        scrollState.scrollTo(scrollState.maxValue)
-                    }
+                    LaunchedEffect(Unit) { scrollState.scrollTo(scrollState.maxValue) }
                 }
             }
         }
@@ -446,28 +436,25 @@
                 onExpandedChange = onExpandChange,
             ) {
                 TextField(
-                    modifier = Modifier.testTag(TFTag)
-                        .onGloballyPositioned {
+                    modifier =
+                        Modifier.testTag(TFTag).onGloballyPositioned {
                             onTextFieldBoundsChanged?.invoke(it.boundsInRoot())
                         },
                     value = selectedOptionText,
                     onValueChange = { selectedOptionText = it },
                     label = { Text("Label") },
                     trailingIcon = {
-                        Box(
-                            modifier = Modifier.testTag(TrailingIconTag)
-                        ) {
-                            ExposedDropdownMenuDefaults.TrailingIcon(
-                                expanded = expanded
-                            )
+                        Box(modifier = Modifier.testTag(TrailingIconTag)) {
+                            ExposedDropdownMenuDefaults.TrailingIcon(expanded = expanded)
                         }
                     },
                     colors = ExposedDropdownMenuDefaults.textFieldColors()
                 )
                 ExposedDropdownMenu(
-                    modifier = Modifier.testTag(EDMTag).onGloballyPositioned {
-                        onMenuBoundsChanged?.invoke(it.boundsInRoot())
-                    },
+                    modifier =
+                        Modifier.testTag(EDMTag).onGloballyPositioned {
+                            onMenuBoundsChanged?.invoke(it.boundsInRoot())
+                        },
                     expanded = expanded,
                     onDismissRequest = { onExpandChange(false) }
                 ) {
@@ -478,9 +465,7 @@
                         },
                         modifier = Modifier.testTag(MenuItemTag)
                     ) {
-                        Text(
-                            text = OptionName
-                        )
+                        Text(text = OptionName)
                     }
                 }
             }
diff --git a/compose/material/material/src/androidInstrumentedTest/kotlin/androidx/compose/material/FloatingActionButtonScreenshotTest.kt b/compose/material/material/src/androidInstrumentedTest/kotlin/androidx/compose/material/FloatingActionButtonScreenshotTest.kt
index d19f746..cf4fe1f 100644
--- a/compose/material/material/src/androidInstrumentedTest/kotlin/androidx/compose/material/FloatingActionButtonScreenshotTest.kt
+++ b/compose/material/material/src/androidInstrumentedTest/kotlin/androidx/compose/material/FloatingActionButtonScreenshotTest.kt
@@ -54,27 +54,27 @@
 @OptIn(ExperimentalTestApi::class)
 class FloatingActionButtonScreenshotTest {
 
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
-    @get:Rule
-    val screenshotRule = AndroidXScreenshotTestRule(GOLDEN_MATERIAL)
+    @get:Rule val screenshotRule = AndroidXScreenshotTestRule(GOLDEN_MATERIAL)
 
     // TODO(b/267253920): Add a compose test API to set/reset InputMode.
     @After
-    fun resetTouchMode() = with(InstrumentationRegistry.getInstrumentation()) {
-        if (SDK_INT < 33) setInTouchMode(true) else resetInTouchMode()
-    }
+    fun resetTouchMode() =
+        with(InstrumentationRegistry.getInstrumentation()) {
+            if (SDK_INT < 33) setInTouchMode(true) else resetInTouchMode()
+        }
 
     @Test
     fun icon() {
         rule.setMaterialContent {
-            FloatingActionButton(onClick = { }) {
+            FloatingActionButton(onClick = {}) {
                 Icon(Icons.Filled.Favorite, contentDescription = null)
             }
         }
 
-        rule.onNode(hasClickAction())
+        rule
+            .onNode(hasClickAction())
             .captureToImage()
             .assertAgainstGolden(screenshotRule, "fab_icon")
     }
@@ -82,13 +82,11 @@
     @Test
     fun text() {
         rule.setMaterialContent {
-            ExtendedFloatingActionButton(
-                text = { Text("EXTENDED") },
-                onClick = {}
-            )
+            ExtendedFloatingActionButton(text = { Text("EXTENDED") }, onClick = {})
         }
 
-        rule.onNode(hasClickAction())
+        rule
+            .onNode(hasClickAction())
             .captureToImage()
             .assertAgainstGolden(screenshotRule, "fab_text")
     }
@@ -103,7 +101,8 @@
             )
         }
 
-        rule.onNode(hasClickAction())
+        rule
+            .onNode(hasClickAction())
             .captureToImage()
             .assertAgainstGolden(screenshotRule, "fab_textAndIcon")
     }
@@ -112,15 +111,14 @@
     fun ripple() {
         rule.setMaterialContent {
             Box(Modifier.requiredSize(100.dp, 100.dp).wrapContentSize()) {
-                FloatingActionButton(onClick = { }) {
+                FloatingActionButton(onClick = {}) {
                     Icon(Icons.Filled.Favorite, contentDescription = null)
                 }
             }
         }
 
         // Start ripple
-        rule.onNode(hasClickAction())
-            .performTouchInput { down(center) }
+        rule.onNode(hasClickAction()).performTouchInput { down(center) }
 
         rule.waitForIdle()
         // Ripples are drawn on the RenderThread, not the main (UI) thread, so we can't
@@ -128,29 +126,24 @@
         // finished animating.
         Thread.sleep(300)
 
-        rule.onRoot()
-            .captureToImage()
-            .assertAgainstGolden(screenshotRule, "fab_ripple")
+        rule.onRoot().captureToImage().assertAgainstGolden(screenshotRule, "fab_ripple")
     }
 
     @Test
     fun hover() {
         rule.setMaterialContent {
             Box(Modifier.requiredSize(100.dp, 100.dp).wrapContentSize()) {
-                FloatingActionButton(onClick = { }) {
+                FloatingActionButton(onClick = {}) {
                     Icon(Icons.Filled.Favorite, contentDescription = null)
                 }
             }
         }
 
-        rule.onNode(hasClickAction())
-            .performMouseInput { enter(center) }
+        rule.onNode(hasClickAction()).performMouseInput { enter(center) }
 
         rule.waitForIdle()
 
-        rule.onRoot()
-            .captureToImage()
-            .assertAgainstGolden(screenshotRule, "fab_hover")
+        rule.onRoot().captureToImage().assertAgainstGolden(screenshotRule, "fab_hover")
     }
 
     @Test
@@ -162,9 +155,8 @@
             localInputModeManager = LocalInputModeManager.current
             Box(Modifier.requiredSize(100.dp, 100.dp).wrapContentSize()) {
                 FloatingActionButton(
-                    onClick = { },
-                    modifier = Modifier
-                        .focusRequester(focusRequester)
+                    onClick = {},
+                    modifier = Modifier.focusRequester(focusRequester)
                 ) {
                     Icon(Icons.Filled.Favorite, contentDescription = null)
                 }
@@ -176,14 +168,10 @@
             localInputModeManager!!.requestInputMode(InputMode.Keyboard)
         }
 
-        rule.runOnIdle {
-            focusRequester.requestFocus()
-        }
+        rule.runOnIdle { focusRequester.requestFocus() }
 
         rule.waitForIdle()
 
-        rule.onRoot()
-            .captureToImage()
-            .assertAgainstGolden(screenshotRule, "fab_focus")
+        rule.onRoot().captureToImage().assertAgainstGolden(screenshotRule, "fab_focus")
     }
 }
diff --git a/compose/material/material/src/androidInstrumentedTest/kotlin/androidx/compose/material/FloatingActionButtonTest.kt b/compose/material/material/src/androidInstrumentedTest/kotlin/androidx/compose/material/FloatingActionButtonTest.kt
index 36e5ddc..0424b6b 100644
--- a/compose/material/material/src/androidInstrumentedTest/kotlin/androidx/compose/material/FloatingActionButtonTest.kt
+++ b/compose/material/material/src/androidInstrumentedTest/kotlin/androidx/compose/material/FloatingActionButtonTest.kt
@@ -69,8 +69,7 @@
 @RunWith(AndroidJUnit4::class)
 class FloatingActionButtonTest {
 
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
     @Test
     fun fabDefaultSemantics() {
@@ -82,7 +81,8 @@
             }
         }
 
-        rule.onNodeWithTag("myButton")
+        rule
+            .onNodeWithTag("myButton")
             .assert(SemanticsMatcher.expectValue(SemanticsProperties.Role, Role.Button))
             .assertIsEnabled()
     }
@@ -94,26 +94,19 @@
         val text = "myButton"
 
         rule.setMaterialContent {
-            Box {
-                ExtendedFloatingActionButton(text = { Text(text) }, onClick = onClick)
-            }
+            Box { ExtendedFloatingActionButton(text = { Text(text) }, onClick = onClick) }
         }
 
-        rule.onNodeWithText(text)
-            .performClick()
+        rule.onNodeWithText(text).performClick()
 
-        rule.runOnIdle {
-            assertThat(counter).isEqualTo(1)
-        }
+        rule.runOnIdle { assertThat(counter).isEqualTo(1) }
     }
 
     @Test
     fun defaultFabHasSizeFromSpec() {
         rule
             .setMaterialContentForSizeAssertions {
-                FloatingActionButton(onClick = {}) {
-                    Icon(Icons.Filled.Favorite, null)
-                }
+                FloatingActionButton(onClick = {}) { Icon(Icons.Filled.Favorite, null) }
             }
             .assertIsSquareWithSize(56.dp)
     }
@@ -129,9 +122,7 @@
             )
         }
 
-        rule.onNodeWithTag("FAB")
-            .assertHeightIsEqualTo(48.dp)
-            .assertWidthIsAtLeast(48.dp)
+        rule.onNodeWithTag("FAB").assertHeightIsEqualTo(48.dp).assertWidthIsAtLeast(48.dp)
     }
 
     @Test
@@ -144,9 +135,7 @@
             )
         }
 
-        rule.onNodeWithTag("FAB")
-            .assertWidthIsEqualTo(48.dp)
-            .assertHeightIsEqualTo(48.dp)
+        rule.onNodeWithTag("FAB").assertWidthIsEqualTo(48.dp).assertHeightIsEqualTo(48.dp)
     }
 
     @Test
@@ -156,29 +145,22 @@
         rule.setMaterialContent {
             Column {
                 Spacer(
-                    Modifier
-                        .requiredSize(10.dp)
-                        .weight(1f)
-                        .onGloballyPositioned {
-                            item1Bounds = it.boundsInRoot()
-                        }
+                    Modifier.requiredSize(10.dp).weight(1f).onGloballyPositioned {
+                        item1Bounds = it.boundsInRoot()
+                    }
                 )
 
                 FloatingActionButton(
                     onClick = {},
-                    modifier = Modifier
-                        .weight(1f)
-                        .onGloballyPositioned {
+                    modifier =
+                        Modifier.weight(1f).onGloballyPositioned {
                             buttonBounds = it.boundsInRoot()
                         }
                 ) {
                     Text("Button")
                 }
 
-                Spacer(
-                    Modifier
-                        .requiredSize(10.dp)
-                        .weight(1f))
+                Spacer(Modifier.requiredSize(10.dp).weight(1f))
             }
         }
 
@@ -202,9 +184,7 @@
                     FloatingActionButton(
                         modifier = Modifier.testTag("myButton"),
                         onClick = {},
-                        elevation = FloatingActionButtonDefaults.elevation(
-                            defaultElevation = 0.dp
-                        )
+                        elevation = FloatingActionButtonDefaults.elevation(defaultElevation = 0.dp)
                     ) {
                         Box(Modifier.size(10.dp, 10.dp))
                     }
@@ -212,7 +192,8 @@
             }
         }
 
-        rule.onNodeWithTag("myButton")
+        rule
+            .onNodeWithTag("myButton")
             .captureToImage()
             .assertShape(
                 density = rule.density,
@@ -239,16 +220,15 @@
                     ExtendedFloatingActionButton(
                         modifier = Modifier.testTag("myButton"),
                         onClick = {},
-                        elevation = FloatingActionButtonDefaults.elevation(
-                            defaultElevation = 0.dp
-                        ),
+                        elevation = FloatingActionButtonDefaults.elevation(defaultElevation = 0.dp),
                         text = { Box(Modifier.size(10.dp, 50.dp)) }
                     )
                 }
             }
         }
 
-        rule.onNodeWithTag("myButton")
+        rule
+            .onNodeWithTag("myButton")
             .captureToImage()
             .assertShape(
                 density = rule.density,
@@ -265,17 +245,8 @@
         var contentCoordinates: LayoutCoordinates? = null
         rule.setMaterialContent {
             Box {
-                FloatingActionButton(
-                    {},
-                    Modifier.onGloballyPositioned {
-                        buttonCoordinates = it
-                    }
-                ) {
-                    Box(
-                        Modifier
-                            .size(2.dp)
-                            .onGloballyPositioned { contentCoordinates = it }
-                    )
+                FloatingActionButton({}, Modifier.onGloballyPositioned { buttonCoordinates = it }) {
+                    Box(Modifier.size(2.dp).onGloballyPositioned { contentCoordinates = it })
                 }
             }
         }
@@ -301,11 +272,7 @@
             Box {
                 ExtendedFloatingActionButton(
                     text = {
-                        Box(
-                            Modifier
-                                .size(2.dp)
-                                .onGloballyPositioned { contentCoordinates = it }
-                        )
+                        Box(Modifier.size(2.dp).onGloballyPositioned { contentCoordinates = it })
                     },
                     onClick = {},
                     modifier = Modifier.onGloballyPositioned { buttonCoordinates = it }
@@ -335,18 +302,10 @@
             Box {
                 ExtendedFloatingActionButton(
                     text = {
-                        Box(
-                            Modifier
-                                .size(2.dp)
-                                .onGloballyPositioned { textCoordinates = it }
-                        )
+                        Box(Modifier.size(2.dp).onGloballyPositioned { textCoordinates = it })
                     },
                     icon = {
-                        Box(
-                            Modifier
-                                .size(10.dp)
-                                .onGloballyPositioned { iconCoordinates = it }
-                        )
+                        Box(Modifier.size(10.dp).onGloballyPositioned { iconCoordinates = it })
                     },
                     onClick = {},
                     modifier = Modifier.onGloballyPositioned { buttonCoordinates = it }
@@ -385,27 +344,22 @@
         lateinit var elevation: State<Dp>
 
         rule.setMaterialContent {
-            val fabElevation = FloatingActionButtonDefaults.elevation(
-                defaultElevation = defaultElevation,
-                pressedElevation = pressedElevation,
-                hoveredElevation = hoveredElevation,
-                focusedElevation = focusedElevation
-            )
+            val fabElevation =
+                FloatingActionButtonDefaults.elevation(
+                    defaultElevation = defaultElevation,
+                    pressedElevation = pressedElevation,
+                    hoveredElevation = hoveredElevation,
+                    focusedElevation = focusedElevation
+                )
 
             elevation = fabElevation.elevation(interactionSource)
         }
 
-        rule.runOnIdle {
-            assertThat(elevation.value).isEqualTo(defaultElevation)
-        }
+        rule.runOnIdle { assertThat(elevation.value).isEqualTo(defaultElevation) }
 
-        rule.runOnIdle {
-            interactionSource.tryEmit(PressInteraction.Press(Offset.Zero))
-        }
+        rule.runOnIdle { interactionSource.tryEmit(PressInteraction.Press(Offset.Zero)) }
 
-        rule.runOnIdle {
-            assertThat(elevation.value).isEqualTo(pressedElevation)
-        }
+        rule.runOnIdle { assertThat(elevation.value).isEqualTo(pressedElevation) }
     }
 
     @Test
@@ -418,27 +372,22 @@
         lateinit var elevation: State<Dp>
 
         rule.setMaterialContent {
-             val fabElevation = FloatingActionButtonDefaults.elevation(
-                defaultElevation = defaultElevation,
-                pressedElevation = pressedElevation,
-                hoveredElevation = hoveredElevation,
-                focusedElevation = focusedElevation
-            )
+            val fabElevation =
+                FloatingActionButtonDefaults.elevation(
+                    defaultElevation = defaultElevation,
+                    pressedElevation = pressedElevation,
+                    hoveredElevation = hoveredElevation,
+                    focusedElevation = focusedElevation
+                )
 
             elevation = fabElevation.elevation(interactionSource)
         }
 
-        rule.runOnIdle {
-            assertThat(elevation.value).isEqualTo(defaultElevation)
-        }
+        rule.runOnIdle { assertThat(elevation.value).isEqualTo(defaultElevation) }
 
-        rule.runOnIdle {
-            defaultElevation = 5.dp
-        }
+        rule.runOnIdle { defaultElevation = 5.dp }
 
-        rule.runOnIdle {
-            assertThat(elevation.value).isEqualTo(5.dp)
-        }
+        rule.runOnIdle { assertThat(elevation.value).isEqualTo(5.dp) }
     }
 
     @Test
@@ -451,35 +400,26 @@
         lateinit var elevation: State<Dp>
 
         rule.setMaterialContent {
-            val fabElevation = FloatingActionButtonDefaults.elevation(
-                defaultElevation = defaultElevation,
-                pressedElevation = pressedElevation,
-                hoveredElevation = hoveredElevation,
-                focusedElevation = focusedElevation
-            )
+            val fabElevation =
+                FloatingActionButtonDefaults.elevation(
+                    defaultElevation = defaultElevation,
+                    pressedElevation = pressedElevation,
+                    hoveredElevation = hoveredElevation,
+                    focusedElevation = focusedElevation
+                )
 
             elevation = fabElevation.elevation(interactionSource)
         }
 
-        rule.runOnIdle {
-            assertThat(elevation.value).isEqualTo(defaultElevation)
-        }
+        rule.runOnIdle { assertThat(elevation.value).isEqualTo(defaultElevation) }
 
-        rule.runOnIdle {
-            interactionSource.tryEmit(PressInteraction.Press(Offset.Zero))
-        }
+        rule.runOnIdle { interactionSource.tryEmit(PressInteraction.Press(Offset.Zero)) }
 
-        rule.runOnIdle {
-            assertThat(elevation.value).isEqualTo(pressedElevation)
-        }
+        rule.runOnIdle { assertThat(elevation.value).isEqualTo(pressedElevation) }
 
-        rule.runOnIdle {
-            pressedElevation = 5.dp
-        }
+        rule.runOnIdle { pressedElevation = 5.dp }
 
         // We are still pressed, so we should now show the updated value for the pressed state
-        rule.runOnIdle {
-            assertThat(elevation.value).isEqualTo(5.dp)
-        }
+        rule.runOnIdle { assertThat(elevation.value).isEqualTo(5.dp) }
     }
 }
diff --git a/compose/material/material/src/androidInstrumentedTest/kotlin/androidx/compose/material/IconButtonTest.kt b/compose/material/material/src/androidInstrumentedTest/kotlin/androidx/compose/material/IconButtonTest.kt
index b871905..11e13f6 100644
--- a/compose/material/material/src/androidInstrumentedTest/kotlin/androidx/compose/material/IconButtonTest.kt
+++ b/compose/material/material/src/androidInstrumentedTest/kotlin/androidx/compose/material/IconButtonTest.kt
@@ -56,21 +56,16 @@
 
 @LargeTest
 @RunWith(AndroidJUnit4::class)
-/**
- * Test for [IconButton] and [IconToggleButton].
- */
+/** Test for [IconButton] and [IconToggleButton]. */
 class IconButtonTest {
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
     @Test
     fun iconButton_size() {
         val width = 48.dp
         val height = 48.dp
         rule
-            .setMaterialContentForSizeAssertions {
-                IconButtonSample()
-            }
+            .setMaterialContentForSizeAssertions { IconButtonSample() }
             .assertWidthIsEqualTo(width)
             .assertHeightIsEqualTo(height)
     }
@@ -94,37 +89,26 @@
 
     @Test
     fun iconButton_defaultSemantics() {
-        rule.setMaterialContent {
-            IconButtonSample()
-        }
-        rule.onNode(hasClickAction()).apply {
-            assertIsEnabled()
-        }
+        rule.setMaterialContent { IconButtonSample() }
+        rule.onNode(hasClickAction()).apply { assertIsEnabled() }
     }
 
     @Test
     fun iconButton_disabledSemantics() {
-        rule.setMaterialContent {
-            IconButton(onClick = {}, enabled = false) {}
-        }
-        rule.onNode(hasClickAction()).apply {
-            assertIsNotEnabled()
-        }
+        rule.setMaterialContent { IconButton(onClick = {}, enabled = false) {} }
+        rule.onNode(hasClickAction()).apply { assertIsNotEnabled() }
     }
 
     @Test
     fun iconButton_materialIconSize_iconPositioning() {
         val diameter = 24.dp
         rule.setMaterialContent {
-            Box {
-                IconButton(onClick = {}) {
-                    Box(Modifier.size(diameter).testTag("icon"))
-                }
-            }
+            Box { IconButton(onClick = {}) { Box(Modifier.size(diameter).testTag("icon")) } }
         }
 
         // Icon should be centered inside the IconButton
-        rule.onNodeWithTag("icon", useUnmergedTree = true)
+        rule
+            .onNodeWithTag("icon", useUnmergedTree = true)
             .assertLeftPositionInRootIsEqualTo(24.dp / 2)
             .assertTopPositionInRootIsEqualTo(24.dp / 2)
     }
@@ -134,15 +118,12 @@
         val width = 36.dp
         val height = 14.dp
         rule.setMaterialContent {
-            Box {
-                IconButton(onClick = {}) {
-                    Box(Modifier.size(width, height).testTag("icon"))
-                }
-            }
+            Box { IconButton(onClick = {}) { Box(Modifier.size(width, height).testTag("icon")) } }
         }
 
         // Icon should be centered inside the IconButton
-        rule.onNodeWithTag("icon", useUnmergedTree = true)
+        rule
+            .onNodeWithTag("icon", useUnmergedTree = true)
             .assertLeftPositionInRootIsEqualTo((48.dp - width) / 2)
             .assertTopPositionInRootIsEqualTo((48.dp - height) / 2)
     }
@@ -161,17 +142,11 @@
             }
         }
 
-        rule.runOnIdle {
-            Truth.assertThat(contentAlpha!!).isEqualTo(highContentAlpha!!)
-        }
+        rule.runOnIdle { Truth.assertThat(contentAlpha!!).isEqualTo(highContentAlpha!!) }
 
-        rule.runOnIdle {
-            enabled = false
-        }
+        rule.runOnIdle { enabled = false }
 
-        rule.runOnIdle {
-            Truth.assertThat(contentAlpha!!).isEqualTo(disabledContentAlpha!!)
-        }
+        rule.runOnIdle { Truth.assertThat(contentAlpha!!).isEqualTo(disabledContentAlpha!!) }
     }
 
     @Test
@@ -179,9 +154,7 @@
         val width = 48.dp
         val height = 48.dp
         rule
-            .setMaterialContentForSizeAssertions {
-                IconToggleButtonSample()
-            }
+            .setMaterialContentForSizeAssertions { IconToggleButtonSample() }
             .assertWidthIsEqualTo(width)
             .assertHeightIsEqualTo(height)
     }
@@ -205,9 +178,7 @@
 
     @Test
     fun iconToggleButton_defaultSemantics() {
-        rule.setMaterialContent {
-            IconToggleButtonSample()
-        }
+        rule.setMaterialContent { IconToggleButtonSample() }
         rule.onNode(isToggleable()).apply {
             assertIsEnabled()
             assertIsOff()
@@ -239,7 +210,8 @@
         }
 
         // Icon should be centered inside the IconButton
-        rule.onNodeWithTag("icon", useUnmergedTree = true)
+        rule
+            .onNodeWithTag("icon", useUnmergedTree = true)
             .assertLeftPositionInRootIsEqualTo(24.dp / 2)
             .assertTopPositionInRootIsEqualTo(24.dp / 2)
     }
@@ -257,7 +229,8 @@
         }
 
         // Icon should be centered inside the IconButton
-        rule.onNodeWithTag("icon", useUnmergedTree = true)
+        rule
+            .onNodeWithTag("icon", useUnmergedTree = true)
             .assertLeftPositionInRootIsEqualTo((48.dp - width) / 2)
             .assertTopPositionInRootIsEqualTo((48.dp - height) / 2)
     }
@@ -276,43 +249,38 @@
             }
         }
 
-        rule.runOnIdle {
-            Truth.assertThat(contentAlpha!!).isEqualTo(highContentAlpha!!)
-        }
+        rule.runOnIdle { Truth.assertThat(contentAlpha!!).isEqualTo(highContentAlpha!!) }
 
-        rule.runOnIdle {
-            enabled = false
-        }
+        rule.runOnIdle { enabled = false }
 
-        rule.runOnIdle {
-            Truth.assertThat(contentAlpha!!).isEqualTo(disabledContentAlpha!!)
-        }
+        rule.runOnIdle { Truth.assertThat(contentAlpha!!).isEqualTo(disabledContentAlpha!!) }
     }
 
     @Test
-    fun iconToggleButton_clickInMinimumTouchTarget(): Unit = with(rule.density) {
-        val tag = "iconToggleButton"
-        var checked by mutableStateOf(false)
-        rule.setMaterialContent {
-            // Box is needed because otherwise the control will be expanded to fill its parent
-            Box(Modifier.fillMaxSize()) {
-                IconToggleButton(
-                    checked = checked,
-                    onCheckedChange = { checked = it },
-                    modifier = Modifier.align(Alignment.Center).requiredSize(2.dp).testTag(tag)
-                ) {
-                    Box(Modifier.size(2.dp))
+    fun iconToggleButton_clickInMinimumTouchTarget(): Unit =
+        with(rule.density) {
+            val tag = "iconToggleButton"
+            var checked by mutableStateOf(false)
+            rule.setMaterialContent {
+                // Box is needed because otherwise the control will be expanded to fill its parent
+                Box(Modifier.fillMaxSize()) {
+                    IconToggleButton(
+                        checked = checked,
+                        onCheckedChange = { checked = it },
+                        modifier = Modifier.align(Alignment.Center).requiredSize(2.dp).testTag(tag)
+                    ) {
+                        Box(Modifier.size(2.dp))
+                    }
                 }
             }
+            rule
+                .onNodeWithTag(tag)
+                .assertIsOff()
+                .assertWidthIsEqualTo(2.dp)
+                .assertHeightIsEqualTo(2.dp)
+                .assertTouchWidthIsEqualTo(48.dp)
+                .assertTouchHeightIsEqualTo(48.dp)
+                .performTouchInput { click(position = Offset(-1f, -1f)) }
+                .assertIsOn()
         }
-        rule.onNodeWithTag(tag)
-            .assertIsOff()
-            .assertWidthIsEqualTo(2.dp)
-            .assertHeightIsEqualTo(2.dp)
-            .assertTouchWidthIsEqualTo(48.dp)
-            .assertTouchHeightIsEqualTo(48.dp)
-            .performTouchInput {
-                click(position = Offset(-1f, -1f))
-            }.assertIsOn()
-    }
 }
diff --git a/compose/material/material/src/androidInstrumentedTest/kotlin/androidx/compose/material/IconTest.kt b/compose/material/material/src/androidInstrumentedTest/kotlin/androidx/compose/material/IconTest.kt
index e22a0c14..ecf36df 100644
--- a/compose/material/material/src/androidInstrumentedTest/kotlin/androidx/compose/material/IconTest.kt
+++ b/compose/material/material/src/androidInstrumentedTest/kotlin/androidx/compose/material/IconTest.kt
@@ -55,8 +55,7 @@
 @LargeTest
 @RunWith(AndroidJUnit4::class)
 class IconTest {
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
     @Test
     fun vector_materialIconSize_dimensions() {
@@ -64,9 +63,7 @@
         val height = 24.dp
         val vector = Icons.Filled.Menu
         rule
-            .setMaterialContentForSizeAssertions {
-                Icon(vector, null)
-            }
+            .setMaterialContentForSizeAssertions { Icon(vector, null) }
             .assertWidthIsEqualTo(width)
             .assertHeightIsEqualTo(height)
     }
@@ -75,14 +72,16 @@
     fun vector_customIconSize_dimensions() {
         val width = 35.dp
         val height = 83.dp
-        val vector = ImageVector.Builder(
-            defaultWidth = width, defaultHeight = height,
-            viewportWidth = width.value, viewportHeight = height.value
-        ).build()
+        val vector =
+            ImageVector.Builder(
+                    defaultWidth = width,
+                    defaultHeight = height,
+                    viewportWidth = width.value,
+                    viewportHeight = height.value
+                )
+                .build()
         rule
-            .setMaterialContentForSizeAssertions {
-                Icon(vector, null)
-            }
+            .setMaterialContentForSizeAssertions { Icon(vector, null) }
             .assertWidthIsEqualTo(width)
             .assertHeightIsEqualTo(height)
     }
@@ -93,9 +92,10 @@
         val height = 24.dp
         rule
             .setMaterialContentForSizeAssertions {
-                val image = with(LocalDensity.current) {
-                    ImageBitmap(width.roundToPx(), height.roundToPx())
-                }
+                val image =
+                    with(LocalDensity.current) {
+                        ImageBitmap(width.roundToPx(), height.roundToPx())
+                    }
 
                 Icon(image, null)
             }
@@ -110,9 +110,10 @@
 
         rule
             .setMaterialContentForSizeAssertions {
-                val image = with(LocalDensity.current) {
-                    ImageBitmap(width.roundToPx(), height.roundToPx())
-                }
+                val image =
+                    with(LocalDensity.current) {
+                        ImageBitmap(width.roundToPx(), height.roundToPx())
+                    }
 
                 Icon(image, null)
             }
@@ -126,9 +127,7 @@
         val height = 24.dp
         val painter = ColorPainter(Color.Red)
         rule
-            .setMaterialContentForSizeAssertions {
-                Icon(painter, null)
-            }
+            .setMaterialContentForSizeAssertions { Icon(painter, null) }
             .assertWidthIsEqualTo(width)
             .assertHeightIsEqualTo(height)
     }
@@ -140,9 +139,10 @@
 
         rule
             .setMaterialContentForSizeAssertions {
-                val image = with(LocalDensity.current) {
-                    ImageBitmap(width.roundToPx(), height.roundToPx())
-                }
+                val image =
+                    with(LocalDensity.current) {
+                        ImageBitmap(width.roundToPx(), height.roundToPx())
+                    }
 
                 val bitmapPainter = BitmapPainter(image)
                 Icon(bitmapPainter, null)
@@ -162,12 +162,8 @@
         rule.setMaterialContent {
             val image: ImageBitmap
             with(LocalDensity.current) {
-                image = createBitmapWithColor(
-                    this,
-                    width.roundToPx(),
-                    height.roundToPx(),
-                    Color.Red
-                )
+                image =
+                    createBitmapWithColor(this, width.roundToPx(), height.roundToPx(), Color.Red)
             }
             Icon(
                 image,
@@ -182,12 +178,11 @@
             }
         }
 
-        rule.onNodeWithTag(testTag)
+        rule
+            .onNodeWithTag(testTag)
             .captureToImage()
             // The icon should be 50x50 and fill the whole size with red pixels
-            .assertPixels(expectedSize = expectedIntSize!!) {
-                Color.Red
-            }
+            .assertPixels(expectedSize = expectedIntSize!!) { Color.Red }
     }
 
     @SdkSuppress(minSdkVersion = Build.VERSION_CODES.O)
@@ -199,12 +194,8 @@
         rule.setMaterialContent {
             val image: ImageBitmap
             with(LocalDensity.current) {
-                image = createBitmapWithColor(
-                    this,
-                    width.roundToPx(),
-                    height.roundToPx(),
-                    Color.Red
-                )
+                image =
+                    createBitmapWithColor(this, width.roundToPx(), height.roundToPx(), Color.Red)
             }
             Icon(image, null, modifier = Modifier.testTag(testTag), tint = Color.Unspecified)
         }
@@ -222,12 +213,8 @@
         rule.setMaterialContent {
             val image: ImageBitmap
             with(LocalDensity.current) {
-                image = createBitmapWithColor(
-                    this,
-                    width.roundToPx(),
-                    height.roundToPx(),
-                    Color.Red
-                )
+                image =
+                    createBitmapWithColor(this, width.roundToPx(), height.roundToPx(), Color.Red)
             }
             Icon(image, null, modifier = Modifier.testTag(testTag), tint = Color.Blue)
         }
@@ -247,7 +234,8 @@
             )
         }
 
-        rule.onNodeWithTag(testTag)
+        rule
+            .onNodeWithTag(testTag)
             .assertContentDescriptionEquals("qwerty")
             .assert(SemanticsMatcher.expectValue(SemanticsProperties.Role, Role.Image))
     }
@@ -260,12 +248,7 @@
     ): ImageBitmap {
         val size = Size(width.toFloat(), height.toFloat())
         val image = ImageBitmap(width, height)
-        CanvasDrawScope().draw(
-            density,
-            LayoutDirection.Ltr,
-            Canvas(image),
-            size
-        ) {
+        CanvasDrawScope().draw(density, LayoutDirection.Ltr, Canvas(image), size) {
             drawRect(color)
         }
         return image
diff --git a/compose/material/material/src/androidInstrumentedTest/kotlin/androidx/compose/material/ListItemTest.kt b/compose/material/material/src/androidInstrumentedTest/kotlin/androidx/compose/material/ListItemTest.kt
index e1e7ffd..9a8a15f 100644
--- a/compose/material/material/src/androidInstrumentedTest/kotlin/androidx/compose/material/ListItemTest.kt
+++ b/compose/material/material/src/androidInstrumentedTest/kotlin/androidx/compose/material/ListItemTest.kt
@@ -47,8 +47,7 @@
 @OptIn(ExperimentalMaterialApi::class)
 class ListItemTest {
 
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
     val icon24x24 by lazy { ImageBitmap(width = 24.dp.toIntPx(), height = 24.dp.toIntPx()) }
     val icon40x40 by lazy { ImageBitmap(width = 40.dp.toIntPx(), height = 40.dp.toIntPx()) }
@@ -58,9 +57,7 @@
     fun listItem_oneLine_size() {
         val expectedHeightNoIcon = 48.dp
         rule
-            .setMaterialContentForSizeAssertions {
-                ListItem(text = { Text("Primary text") })
-            }
+            .setMaterialContentForSizeAssertions { ListItem(text = { Text("Primary text") }) }
             .assertHeightIsEqualTo(expectedHeightNoIcon)
             .assertWidthIsEqualTo(rule.rootWidth())
     }
@@ -70,10 +67,7 @@
         val expectedHeightSmallIcon = 56.dp
         rule
             .setMaterialContentForSizeAssertions {
-                ListItem(
-                    text = { Text("Primary text") },
-                    icon = { Icon(icon24x24, null) }
-                )
+                ListItem(text = { Text("Primary text") }, icon = { Icon(icon24x24, null) })
             }
             .assertHeightIsEqualTo(expectedHeightSmallIcon)
             .assertWidthIsEqualTo(rule.rootWidth())
@@ -84,10 +78,7 @@
         val expectedHeightLargeIcon = 72.dp
         rule
             .setMaterialContentForSizeAssertions {
-                ListItem(
-                    text = { Text("Primary text") },
-                    icon = { Icon(icon56x56, null) }
-                )
+                ListItem(text = { Text("Primary text") }, icon = { Icon(icon56x56, null) })
             }
             .assertHeightIsEqualTo(expectedHeightLargeIcon)
             .assertWidthIsEqualTo(rule.rootWidth())
@@ -207,21 +198,25 @@
         }
         val ds = rule.onRoot().getUnclippedBoundsInRoot()
         rule.runOnIdleWithDensity {
-            assertThat(textPosition.value!!.x).isEqualTo(
-                expectedLeftPadding.roundToPx()
-                    .toFloat()
-            )
-            assertThat(textPosition.value!!.y).isEqualTo(
-                ((listItemHeight.roundToPx() - textSize.value!!.height) / 2f).roundToInt().toFloat()
-            )
-            assertThat(trailingPosition.value!!.x).isEqualTo(
-                ds.width.roundToPx() - trailingSize.value!!.width -
-                    expectedRightPadding.roundToPx().toFloat()
-            )
-            assertThat(trailingPosition.value!!.y).isEqualTo(
-                ((listItemHeight.roundToPx() - trailingSize.value!!.height) / 2f).roundToInt()
-                    .toFloat()
-            )
+            assertThat(textPosition.value!!.x).isEqualTo(expectedLeftPadding.roundToPx().toFloat())
+            assertThat(textPosition.value!!.y)
+                .isEqualTo(
+                    ((listItemHeight.roundToPx() - textSize.value!!.height) / 2f)
+                        .roundToInt()
+                        .toFloat()
+                )
+            assertThat(trailingPosition.value!!.x)
+                .isEqualTo(
+                    ds.width.roundToPx() -
+                        trailingSize.value!!.width -
+                        expectedRightPadding.roundToPx().toFloat()
+                )
+            assertThat(trailingPosition.value!!.y)
+                .isEqualTo(
+                    ((listItemHeight.roundToPx() - trailingSize.value!!.height) / 2f)
+                        .roundToInt()
+                        .toFloat()
+                )
         }
     }
 
@@ -244,20 +239,25 @@
             }
         }
         rule.runOnIdleWithDensity {
-            assertThat(iconPosition.value!!.x).isEqualTo(
-                expectedLeftPadding.roundToPx().toFloat()
-            )
-            assertThat(iconPosition.value!!.y).isEqualTo(
-                ((listItemHeight.roundToPx() - iconSize.value!!.height) / 2f).roundToInt().toFloat()
-            )
-            assertThat(textPosition.value!!.x).isEqualTo(
-                expectedLeftPadding.roundToPx().toFloat() +
-                    iconSize.value!!.width +
-                    expectedTextLeftPadding.roundToPx().toFloat()
-            )
-            assertThat(textPosition.value!!.y).isEqualTo(
-                ((listItemHeight.roundToPx() - textSize.value!!.height) / 2f).roundToInt().toFloat()
-            )
+            assertThat(iconPosition.value!!.x).isEqualTo(expectedLeftPadding.roundToPx().toFloat())
+            assertThat(iconPosition.value!!.y)
+                .isEqualTo(
+                    ((listItemHeight.roundToPx() - iconSize.value!!.height) / 2f)
+                        .roundToInt()
+                        .toFloat()
+                )
+            assertThat(textPosition.value!!.x)
+                .isEqualTo(
+                    expectedLeftPadding.roundToPx().toFloat() +
+                        iconSize.value!!.width +
+                        expectedTextLeftPadding.roundToPx().toFloat()
+                )
+            assertThat(textPosition.value!!.y)
+                .isEqualTo(
+                    ((listItemHeight.roundToPx() - textSize.value!!.height) / 2f)
+                        .roundToInt()
+                        .toFloat()
+                )
         }
     }
 
@@ -307,26 +307,23 @@
         }
         val ds = rule.onRoot().getUnclippedBoundsInRoot()
         rule.runOnIdleWithDensity {
-            assertThat(textPosition.value!!.x).isEqualTo(
-                expectedLeftPadding.roundToPx().toFloat()
-            )
-            assertThat(textBaseline.value!!).isEqualTo(
-                expectedTextBaseline.roundToPx().toFloat()
-            )
-            assertThat(secondaryTextPosition.value!!.x).isEqualTo(
-                expectedLeftPadding.roundToPx().toFloat()
-            )
-            assertThat(secondaryTextBaseline.value!!).isEqualTo(
-                expectedTextBaseline.roundToPx().toFloat() +
-                    expectedSecondaryTextBaselineOffset.roundToPx().toFloat()
-            )
-            assertThat(trailingPosition.value!!.x).isEqualTo(
-                ds.width.roundToPx() - trailingSize.value!!.width -
-                    expectedRightPadding.roundToPx().toFloat()
-            )
-            assertThat(trailingBaseline.value!!).isEqualTo(
-                expectedTextBaseline.roundToPx().toFloat()
-            )
+            assertThat(textPosition.value!!.x).isEqualTo(expectedLeftPadding.roundToPx().toFloat())
+            assertThat(textBaseline.value!!).isEqualTo(expectedTextBaseline.roundToPx().toFloat())
+            assertThat(secondaryTextPosition.value!!.x)
+                .isEqualTo(expectedLeftPadding.roundToPx().toFloat())
+            assertThat(secondaryTextBaseline.value!!)
+                .isEqualTo(
+                    expectedTextBaseline.roundToPx().toFloat() +
+                        expectedSecondaryTextBaselineOffset.roundToPx().toFloat()
+                )
+            assertThat(trailingPosition.value!!.x)
+                .isEqualTo(
+                    ds.width.roundToPx() -
+                        trailingSize.value!!.width -
+                        expectedRightPadding.roundToPx().toFloat()
+                )
+            assertThat(trailingBaseline.value!!)
+                .isEqualTo(expectedTextBaseline.roundToPx().toFloat())
         }
     }
 
@@ -365,35 +362,32 @@
                             )
                         )
                     },
-                    icon = {
-                        Image(icon24x24, null, Modifier.saveLayout(iconPosition, iconSize))
-                    }
+                    icon = { Image(icon24x24, null, Modifier.saveLayout(iconPosition, iconSize)) }
                 )
             }
         }
         rule.runOnIdleWithDensity {
-            assertThat(textPosition.value!!.x).isEqualTo(
-                expectedLeftPadding.roundToPx().toFloat() + iconSize.value!!.width +
-                    expectedContentLeftPadding.roundToPx().toFloat()
-            )
-            assertThat(textBaseline.value!!).isEqualTo(
-                expectedTextBaseline.roundToPx().toFloat()
-            )
-            assertThat(secondaryTextPosition.value!!.x).isEqualTo(
-                expectedLeftPadding.roundToPx().toFloat() +
-                    iconSize.value!!.width +
-                    expectedContentLeftPadding.roundToPx().toFloat()
-            )
-            assertThat(secondaryTextBaseline.value!!).isEqualTo(
-                expectedTextBaseline.roundToPx().toFloat() +
-                    expectedSecondaryTextBaselineOffset.roundToPx().toFloat()
-            )
-            assertThat(iconPosition.value!!.x).isEqualTo(
-                expectedLeftPadding.roundToPx().toFloat()
-            )
-            assertThat(iconPosition.value!!.y).isEqualTo(
-                expectedIconTopPadding.roundToPx().toFloat()
-            )
+            assertThat(textPosition.value!!.x)
+                .isEqualTo(
+                    expectedLeftPadding.roundToPx().toFloat() +
+                        iconSize.value!!.width +
+                        expectedContentLeftPadding.roundToPx().toFloat()
+                )
+            assertThat(textBaseline.value!!).isEqualTo(expectedTextBaseline.roundToPx().toFloat())
+            assertThat(secondaryTextPosition.value!!.x)
+                .isEqualTo(
+                    expectedLeftPadding.roundToPx().toFloat() +
+                        iconSize.value!!.width +
+                        expectedContentLeftPadding.roundToPx().toFloat()
+                )
+            assertThat(secondaryTextBaseline.value!!)
+                .isEqualTo(
+                    expectedTextBaseline.roundToPx().toFloat() +
+                        expectedSecondaryTextBaselineOffset.roundToPx().toFloat()
+                )
+            assertThat(iconPosition.value!!.x).isEqualTo(expectedLeftPadding.roundToPx().toFloat())
+            assertThat(iconPosition.value!!.y)
+                .isEqualTo(expectedIconTopPadding.roundToPx().toFloat())
         }
     }
 
@@ -436,9 +430,7 @@
                             )
                         )
                     },
-                    icon = {
-                        Image(icon40x40, null, Modifier.saveLayout(iconPosition, iconSize))
-                    },
+                    icon = { Image(icon40x40, null, Modifier.saveLayout(iconPosition, iconSize)) },
                     trailing = {
                         Image(icon24x24, null, Modifier.saveLayout(trailingPosition, trailingSize))
                     }
@@ -447,35 +439,37 @@
         }
         val ds = rule.onRoot().getUnclippedBoundsInRoot()
         rule.runOnIdleWithDensity {
-            assertThat(textPosition.value!!.x).isEqualTo(
-                expectedLeftPadding.roundToPx().toFloat() + iconSize.value!!.width +
-                    expectedContentLeftPadding.roundToPx().toFloat()
-            )
-            assertThat(textBaseline.value!!).isEqualTo(
-                expectedTextBaseline.roundToPx().toFloat()
-            )
-            assertThat(secondaryTextPosition.value!!.x).isEqualTo(
-                expectedLeftPadding.roundToPx().toFloat() +
-                    iconSize.value!!.width +
-                    expectedContentLeftPadding.roundToPx().toFloat()
-            )
-            assertThat(secondaryTextBaseline.value!!).isEqualTo(
-                expectedTextBaseline.roundToPx().toFloat() +
-                    expectedSecondaryTextBaselineOffset.roundToPx().toFloat()
-            )
-            assertThat(iconPosition.value!!.x).isEqualTo(
-                expectedLeftPadding.roundToPx().toFloat()
-            )
-            assertThat(iconPosition.value!!.y).isEqualTo(
-                expectedIconTopPadding.roundToPx().toFloat()
-            )
-            assertThat(trailingPosition.value!!.x).isEqualTo(
-                ds.width.roundToPx() - trailingSize.value!!.width -
-                    expectedRightPadding.roundToPx().toFloat()
-            )
-            assertThat(trailingPosition.value!!.y).isEqualTo(
-                ((listItemHeight.roundToPx() - trailingSize.value!!.height) / 2).toFloat()
-            )
+            assertThat(textPosition.value!!.x)
+                .isEqualTo(
+                    expectedLeftPadding.roundToPx().toFloat() +
+                        iconSize.value!!.width +
+                        expectedContentLeftPadding.roundToPx().toFloat()
+                )
+            assertThat(textBaseline.value!!).isEqualTo(expectedTextBaseline.roundToPx().toFloat())
+            assertThat(secondaryTextPosition.value!!.x)
+                .isEqualTo(
+                    expectedLeftPadding.roundToPx().toFloat() +
+                        iconSize.value!!.width +
+                        expectedContentLeftPadding.roundToPx().toFloat()
+                )
+            assertThat(secondaryTextBaseline.value!!)
+                .isEqualTo(
+                    expectedTextBaseline.roundToPx().toFloat() +
+                        expectedSecondaryTextBaselineOffset.roundToPx().toFloat()
+                )
+            assertThat(iconPosition.value!!.x).isEqualTo(expectedLeftPadding.roundToPx().toFloat())
+            assertThat(iconPosition.value!!.y)
+                .isEqualTo(expectedIconTopPadding.roundToPx().toFloat())
+            assertThat(trailingPosition.value!!.x)
+                .isEqualTo(
+                    ds.width.roundToPx() -
+                        trailingSize.value!!.width -
+                        expectedRightPadding.roundToPx().toFloat()
+                )
+            assertThat(trailingPosition.value!!.y)
+                .isEqualTo(
+                    ((listItemHeight.roundToPx() - trailingSize.value!!.height) / 2).toFloat()
+                )
         }
     }
 
@@ -518,9 +512,7 @@
                         )
                     },
                     singleLineSecondaryText = false,
-                    icon = {
-                        Image(icon24x24, null, Modifier.saveLayout(iconPosition, iconSize))
-                    },
+                    icon = { Image(icon24x24, null, Modifier.saveLayout(iconPosition, iconSize)) },
                     trailing = {
                         Image(icon24x24, null, Modifier.saveLayout(trailingPosition, trailingSize))
                     }
@@ -529,32 +521,35 @@
         }
         val ds = rule.onRoot().getUnclippedBoundsInRoot()
         rule.runOnIdleWithDensity {
-            assertThat(textPosition.value!!.x).isEqualTo(
-                expectedLeftPadding.roundToPx().toFloat() + iconSize.value!!.width +
-                    expectedContentLeftPadding.roundToPx().toFloat()
-            )
-            assertThat(textBaseline.value!!).isEqualTo(
-                expectedTextBaseline.roundToPx().toFloat()
-            )
-            assertThat(secondaryTextPosition.value!!.x).isEqualTo(
-                expectedLeftPadding.roundToPx().toFloat() + iconSize.value!!.width +
-                    expectedContentLeftPadding.roundToPx().toFloat()
-            )
-            assertThat(secondaryTextBaseline.value!!).isEqualTo(
-                expectedTextBaseline.roundToPx().toFloat() +
-                    expectedSecondaryTextBaselineOffset.roundToPx().toFloat()
-            )
+            assertThat(textPosition.value!!.x)
+                .isEqualTo(
+                    expectedLeftPadding.roundToPx().toFloat() +
+                        iconSize.value!!.width +
+                        expectedContentLeftPadding.roundToPx().toFloat()
+                )
+            assertThat(textBaseline.value!!).isEqualTo(expectedTextBaseline.roundToPx().toFloat())
+            assertThat(secondaryTextPosition.value!!.x)
+                .isEqualTo(
+                    expectedLeftPadding.roundToPx().toFloat() +
+                        iconSize.value!!.width +
+                        expectedContentLeftPadding.roundToPx().toFloat()
+                )
+            assertThat(secondaryTextBaseline.value!!)
+                .isEqualTo(
+                    expectedTextBaseline.roundToPx().toFloat() +
+                        expectedSecondaryTextBaselineOffset.roundToPx().toFloat()
+                )
             assertThat(iconPosition.value!!.x).isEqualTo(expectedLeftPadding.roundToPx().toFloat())
-            assertThat(iconPosition.value!!.y).isEqualTo(
-                expectedIconTopPadding.roundToPx().toFloat()
-            )
-            assertThat(trailingPosition.value!!.x).isEqualTo(
-                ds.width.roundToPx() - trailingSize.value!!.width.toFloat() -
-                    expectedRightPadding.roundToPx().toFloat()
-            )
-            assertThat(trailingPosition.value!!.y).isEqualTo(
-                expectedIconTopPadding.roundToPx().toFloat()
-            )
+            assertThat(iconPosition.value!!.y)
+                .isEqualTo(expectedIconTopPadding.roundToPx().toFloat())
+            assertThat(trailingPosition.value!!.x)
+                .isEqualTo(
+                    ds.width.roundToPx() -
+                        trailingSize.value!!.width.toFloat() -
+                        expectedRightPadding.roundToPx().toFloat()
+                )
+            assertThat(trailingPosition.value!!.y)
+                .isEqualTo(expectedIconTopPadding.roundToPx().toFloat())
         }
     }
 
@@ -611,21 +606,11 @@
                             )
                         )
                     },
-                    icon = {
-                        Image(
-                            icon40x40,
-                            null,
-                            Modifier.saveLayout(iconPosition, iconSize)
-                        )
-                    },
+                    icon = { Image(icon40x40, null, Modifier.saveLayout(iconPosition, iconSize)) },
                     trailing = {
                         Text(
                             "meta",
-                            Modifier.saveLayout(
-                                trailingPosition,
-                                trailingSize,
-                                trailingBaseline
-                            )
+                            Modifier.saveLayout(trailingPosition, trailingSize, trailingBaseline)
                         )
                     }
                 )
@@ -634,46 +619,48 @@
 
         val ds = rule.onRoot().getUnclippedBoundsInRoot()
         rule.runOnIdleWithDensity {
-            assertThat(textPosition.value!!.x).isEqualTo(
-                expectedLeftPadding.roundToPx().toFloat() +
-                    iconSize.value!!.width +
-                    expectedContentLeftPadding.roundToPx().toFloat()
-            )
-            assertThat(textBaseline.value!!).isEqualTo(
-                expectedOverlineBaseline.roundToPx().toFloat() +
-                    expectedTextBaselineOffset.roundToPx().toFloat()
-            )
-            assertThat(overlineTextPosition.value!!.x).isEqualTo(
-                expectedLeftPadding.roundToPx().toFloat() +
-                    iconSize.value!!.width +
-                    expectedContentLeftPadding.roundToPx().toFloat()
-            )
-            assertThat(overlineTextBaseline.value!!).isEqualTo(
-                expectedOverlineBaseline.roundToPx().toFloat()
-            )
-            assertThat(secondaryTextPosition.value!!.x).isEqualTo(
-                expectedLeftPadding.roundToPx().toFloat() +
-                    iconSize.value!!.width +
-                    expectedContentLeftPadding.roundToPx().toFloat()
-            )
-            assertThat(secondaryTextBaseline.value!!).isEqualTo(
-                expectedOverlineBaseline.roundToPx().toFloat() +
-                    expectedTextBaselineOffset.roundToPx().toFloat() +
-                    expectedSecondaryTextBaselineOffset.roundToPx().toFloat()
-            )
-            assertThat(iconPosition.value!!.x).isEqualTo(
-                expectedLeftPadding.roundToPx().toFloat()
-            )
-            assertThat(iconPosition.value!!.y).isEqualTo(
-                expectedIconTopPadding.roundToPx().toFloat()
-            )
-            assertThat(trailingPosition.value!!.x).isEqualTo(
-                ds.width.roundToPx() - trailingSize.value!!.width -
-                    expectedRightPadding.roundToPx().toFloat()
-            )
-            assertThat(trailingBaseline.value!!).isEqualTo(
-                expectedOverlineBaseline.roundToPx().toFloat()
-            )
+            assertThat(textPosition.value!!.x)
+                .isEqualTo(
+                    expectedLeftPadding.roundToPx().toFloat() +
+                        iconSize.value!!.width +
+                        expectedContentLeftPadding.roundToPx().toFloat()
+                )
+            assertThat(textBaseline.value!!)
+                .isEqualTo(
+                    expectedOverlineBaseline.roundToPx().toFloat() +
+                        expectedTextBaselineOffset.roundToPx().toFloat()
+                )
+            assertThat(overlineTextPosition.value!!.x)
+                .isEqualTo(
+                    expectedLeftPadding.roundToPx().toFloat() +
+                        iconSize.value!!.width +
+                        expectedContentLeftPadding.roundToPx().toFloat()
+                )
+            assertThat(overlineTextBaseline.value!!)
+                .isEqualTo(expectedOverlineBaseline.roundToPx().toFloat())
+            assertThat(secondaryTextPosition.value!!.x)
+                .isEqualTo(
+                    expectedLeftPadding.roundToPx().toFloat() +
+                        iconSize.value!!.width +
+                        expectedContentLeftPadding.roundToPx().toFloat()
+                )
+            assertThat(secondaryTextBaseline.value!!)
+                .isEqualTo(
+                    expectedOverlineBaseline.roundToPx().toFloat() +
+                        expectedTextBaselineOffset.roundToPx().toFloat() +
+                        expectedSecondaryTextBaselineOffset.roundToPx().toFloat()
+                )
+            assertThat(iconPosition.value!!.x).isEqualTo(expectedLeftPadding.roundToPx().toFloat())
+            assertThat(iconPosition.value!!.y)
+                .isEqualTo(expectedIconTopPadding.roundToPx().toFloat())
+            assertThat(trailingPosition.value!!.x)
+                .isEqualTo(
+                    ds.width.roundToPx() -
+                        trailingSize.value!!.width -
+                        expectedRightPadding.roundToPx().toFloat()
+                )
+            assertThat(trailingBaseline.value!!)
+                .isEqualTo(expectedOverlineBaseline.roundToPx().toFloat())
         }
     }
 
diff --git a/compose/material/material/src/androidInstrumentedTest/kotlin/androidx/compose/material/MaterialTest.kt b/compose/material/material/src/androidInstrumentedTest/kotlin/androidx/compose/material/MaterialTest.kt
index f4fed29..654457c 100644
--- a/compose/material/material/src/androidInstrumentedTest/kotlin/androidx/compose/material/MaterialTest.kt
+++ b/compose/material/material/src/androidInstrumentedTest/kotlin/androidx/compose/material/MaterialTest.kt
@@ -54,14 +54,13 @@
     }
 }
 
-private val WindowInfoFocused = object : WindowInfo {
-    override val isWindowFocused = true
-}
+private val WindowInfoFocused =
+    object : WindowInfo {
+        override val isWindowFocused = true
+    }
 
 fun <T> ComposeTestRule.runOnIdleWithDensity(action: Density.() -> T): T {
-    return runOnIdle {
-        density.action()
-    }
+    return runOnIdle { density.action() }
 }
 
 fun SemanticsNodeInteraction.getFirstBaselinePosition() = getAlignmentLinePosition(FirstBaseline)
@@ -75,9 +74,7 @@
 
 fun ComposeTestRule.rootHeight(): Dp = onRoot().getUnclippedBoundsInRoot().height
 
-/**
- * Constant to emulate very big but finite constraints
- */
+/** Constant to emulate very big but finite constraints */
 val BigTestMaxWidth = 5000.dp
 val BigTestMaxHeight = 5000.dp
 
@@ -92,10 +89,8 @@
             Surface {
                 Box {
                     Box(
-                        Modifier.sizeIn(
-                            maxWidth = parentMaxWidth,
-                            maxHeight = parentMaxHeight
-                        ).testTag("containerForSizeAssertion")
+                        Modifier.sizeIn(maxWidth = parentMaxWidth, maxHeight = parentMaxHeight)
+                            .testTag("containerForSizeAssertion")
                     ) {
                         content()
                     }
diff --git a/compose/material/material/src/androidInstrumentedTest/kotlin/androidx/compose/material/MaterialTextSelectionColorsScreenshotTest.kt b/compose/material/material/src/androidInstrumentedTest/kotlin/androidx/compose/material/MaterialTextSelectionColorsScreenshotTest.kt
index 39d9fa0..908c484 100644
--- a/compose/material/material/src/androidInstrumentedTest/kotlin/androidx/compose/material/MaterialTextSelectionColorsScreenshotTest.kt
+++ b/compose/material/material/src/androidInstrumentedTest/kotlin/androidx/compose/material/MaterialTextSelectionColorsScreenshotTest.kt
@@ -49,19 +49,17 @@
  * Screenshot test for the SelectionColors provided by [MaterialTheme] and used by the selection
  * handle / background.
  *
- * Note: because we cannot screenshot popups, we cannot see the selection handles in the popup,
- * so we can only test the background color here.
+ * Note: because we cannot screenshot popups, we cannot see the selection handles in the popup, so
+ * we can only test the background color here.
  */
 @LargeTest
 @RunWith(AndroidJUnit4::class)
 @SdkSuppress(minSdkVersion = Build.VERSION_CODES.O)
 class MaterialTextSelectionColorsScreenshotTest {
 
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
-    @get:Rule
-    val screenshotRule = AndroidXScreenshotTestRule(GOLDEN_MATERIAL)
+    @get:Rule val screenshotRule = AndroidXScreenshotTestRule(GOLDEN_MATERIAL)
 
     @Test
     fun rememberTextSelectionColors() {
@@ -89,18 +87,14 @@
     @FlakyTest(bugId = 230475771)
     @Test
     fun text_lightThemeSelectionColors() {
-        rule.setContent {
-            TextTestContent(lightColors())
-        }
+        rule.setContent { TextTestContent(lightColors()) }
 
-        rule.onNodeWithText(Text)
-            .performTouchInput {
-                longClick()
-            }
+        rule.onNodeWithText(Text).performTouchInput { longClick() }
 
         rule.waitForIdle()
 
-        rule.onNodeWithTag(Tag)
+        rule
+            .onNodeWithTag(Tag)
             .captureToImage()
             .assertAgainstGolden(screenshotRule, "text_lightThemeSelectionColors")
     }
@@ -108,98 +102,86 @@
     @FlakyTest(bugId = 191141357)
     @Test
     fun text_darkThemeSelectionColors() {
-        rule.setContent {
-            TextTestContent(darkColors())
-        }
+        rule.setContent { TextTestContent(darkColors()) }
 
-        rule.onNodeWithText(Text)
-            .performTouchInput {
-                longClick()
-            }
+        rule.onNodeWithText(Text).performTouchInput { longClick() }
 
         rule.waitForIdle()
 
-        rule.onNodeWithTag(Tag)
+        rule
+            .onNodeWithTag(Tag)
             .captureToImage()
             .assertAgainstGolden(screenshotRule, "text_darkThemeSelectionColors")
     }
 
     @Test
     fun filledTextField_lightThemeSelectionColors() {
-        rule.setContent {
-            FilledTextFieldTestContent(lightColors())
-        }
+        rule.setContent { FilledTextFieldTestContent(lightColors()) }
 
         // Click once to focus text field
-        rule.onNodeWithText(Text)
-            .performTouchInput {
-                click()
-                longClick()
-            }
+        rule.onNodeWithText(Text).performTouchInput {
+            click()
+            longClick()
+        }
 
         rule.waitForIdle()
 
-        rule.onNodeWithTag(Tag)
+        rule
+            .onNodeWithTag(Tag)
             .captureToImage()
             .assertAgainstGolden(screenshotRule, "filledTextField_lightThemeSelectionColors")
     }
 
     @Test
     fun filledTextField_darkThemeSelectionColors() {
-        rule.setContent {
-            FilledTextFieldTestContent(darkColors())
-        }
+        rule.setContent { FilledTextFieldTestContent(darkColors()) }
 
         // Click once to focus text field
-        rule.onNodeWithText(Text)
-            .performTouchInput {
-                click()
-                longClick()
-            }
+        rule.onNodeWithText(Text).performTouchInput {
+            click()
+            longClick()
+        }
 
         rule.waitForIdle()
 
-        rule.onNodeWithTag(Tag)
+        rule
+            .onNodeWithTag(Tag)
             .captureToImage()
             .assertAgainstGolden(screenshotRule, "filledTextField_darkThemeSelectionColors")
     }
 
     @Test
     fun outlinedTextField_lightThemeSelectionColors() {
-        rule.setContent {
-            OutlinedTextFieldTestContent(lightColors())
-        }
+        rule.setContent { OutlinedTextFieldTestContent(lightColors()) }
 
         // Click once to focus text field
-        rule.onNodeWithText(Text)
-            .performTouchInput {
-                click()
-                longClick()
-            }
+        rule.onNodeWithText(Text).performTouchInput {
+            click()
+            longClick()
+        }
 
         rule.waitForIdle()
 
-        rule.onNodeWithTag(Tag)
+        rule
+            .onNodeWithTag(Tag)
             .captureToImage()
             .assertAgainstGolden(screenshotRule, "outlinedTextField_lightThemeSelectionColors")
     }
 
     @Test
     fun outlinedTextField_darkThemeSelectionColors() {
-        rule.setContent {
-            OutlinedTextFieldTestContent(darkColors())
-        }
+        rule.setContent { OutlinedTextFieldTestContent(darkColors()) }
 
         // Click once to focus text field
-        rule.onNodeWithText(Text)
-            .performTouchInput {
-                click()
-                longClick()
-            }
+        rule.onNodeWithText(Text).performTouchInput {
+            click()
+            longClick()
+        }
 
         rule.waitForIdle()
 
-        rule.onNodeWithTag(Tag)
+        rule
+            .onNodeWithTag(Tag)
             .captureToImage()
             .assertAgainstGolden(screenshotRule, "outlinedTextField_darkThemeSelectionColors")
     }
@@ -207,13 +189,7 @@
 
 @Composable
 private fun TextTestContent(colors: Colors) {
-    MaterialTheme(colors) {
-        Surface(Modifier.testTag(Tag)) {
-            SelectionContainer {
-                Text(Text)
-            }
-        }
-    }
+    MaterialTheme(colors) { Surface(Modifier.testTag(Tag)) { SelectionContainer { Text(Text) } } }
 }
 
 @Composable
@@ -243,9 +219,10 @@
 }
 
 private const val Text = "Selected text"
-private val TextFieldText = TextFieldValue(
-    text = "Selected text",
-    selection = TextRange(0, 8),
-    composition = TextRange(0, 8)
-)
+private val TextFieldText =
+    TextFieldValue(
+        text = "Selected text",
+        selection = TextRange(0, 8),
+        composition = TextRange(0, 8)
+    )
 private const val Tag = "TestTag"
diff --git a/compose/material/material/src/androidInstrumentedTest/kotlin/androidx/compose/material/MenuTest.kt b/compose/material/material/src/androidInstrumentedTest/kotlin/androidx/compose/material/MenuTest.kt
index 89a8e30..5030a8b 100644
--- a/compose/material/material/src/androidInstrumentedTest/kotlin/androidx/compose/material/MenuTest.kt
+++ b/compose/material/material/src/androidInstrumentedTest/kotlin/androidx/compose/material/MenuTest.kt
@@ -55,8 +55,7 @@
 @MediumTest
 @RunWith(AndroidJUnit4::class)
 class MenuTest {
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
     @Test
     fun menu_canBeTriggered() {
@@ -64,10 +63,7 @@
 
         rule.setContent {
             Box(Modifier.requiredSize(20.dp).background(color = Color.Blue)) {
-                DropdownMenu(
-                    expanded = expanded,
-                    onDismissRequest = {}
-                ) {
+                DropdownMenu(expanded = expanded, onDismissRequest = {}) {
                     DropdownMenuItem(modifier = Modifier.testTag("MenuContent"), onClick = {}) {
                         Text("Option 1")
                     }
@@ -105,10 +101,7 @@
         rule.setContent {
             with(LocalDensity.current) {
                 Box(Modifier.requiredSize(20.toDp()).background(color = Color.Blue)) {
-                    DropdownMenu(
-                        expanded = true,
-                        onDismissRequest = {}
-                    ) {
+                    DropdownMenu(expanded = true, onDismissRequest = {}) {
                         Box(Modifier.testTag("MenuContent1").size(70.toDp()))
                         Box(Modifier.testTag("MenuContent2").size(130.toDp()))
                     }
@@ -118,10 +111,15 @@
 
         rule.onNodeWithTag("MenuContent1").assertExists()
         rule.onNodeWithTag("MenuContent2").assertExists()
-        val node = rule.onNode(
-            isPopup() and hasAnyDescendant(hasTestTag("MenuContent1")) and
-                hasAnyDescendant(hasTestTag("MenuContent2"))
-        ).assertExists().fetchSemanticsNode()
+        val node =
+            rule
+                .onNode(
+                    isPopup() and
+                        hasAnyDescendant(hasTestTag("MenuContent1")) and
+                        hasAnyDescendant(hasTestTag("MenuContent2"))
+                )
+                .assertExists()
+                .fetchSemanticsNode()
         with(rule.density) {
             assertThat(node.size.width).isEqualTo(130)
             assertThat(node.size.height)
@@ -133,11 +131,7 @@
     fun menu_scrolledContent() {
         rule.setContent {
             with(LocalDensity.current) {
-                Box(
-                    Modifier
-                        .requiredSize(20.toDp())
-                        .background(color = Color.Blue)
-                ) {
+                Box(Modifier.requiredSize(20.toDp()).background(color = Color.Blue)) {
                     val scrollState = rememberScrollState()
                     DropdownMenu(
                         expanded = true,
@@ -145,16 +139,10 @@
                         scrollState = scrollState
                     ) {
                         repeat(100) {
-                            Box(
-                                Modifier
-                                    .testTag("MenuContent ${it + 1}")
-                                    .size(70.toDp())
-                            )
+                            Box(Modifier.testTag("MenuContent ${it + 1}").size(70.toDp()))
                         }
                     }
-                    LaunchedEffect(Unit) {
-                        scrollState.scrollTo(scrollState.maxValue)
-                    }
+                    LaunchedEffect(Unit) { scrollState.scrollTo(scrollState.maxValue) }
                 }
             }
         }
@@ -177,39 +165,30 @@
         val offsetY = 40
         val popupSize = IntSize(50, 80)
 
-        val ltrPosition = DropdownMenuPositionProvider(
-            DpOffset(offsetX.dp, offsetY.dp),
-            density
-        ).calculatePosition(
-            IntRect(anchorPosition, anchorSize),
-            windowSize,
-            LayoutDirection.Ltr,
-            popupSize
-        )
+        val ltrPosition =
+            DropdownMenuPositionProvider(DpOffset(offsetX.dp, offsetY.dp), density)
+                .calculatePosition(
+                    IntRect(anchorPosition, anchorSize),
+                    windowSize,
+                    LayoutDirection.Ltr,
+                    popupSize
+                )
 
-        assertThat(ltrPosition.x).isEqualTo(
-            anchorPosition.x + offsetX
-        )
-        assertThat(ltrPosition.y).isEqualTo(
-            anchorPosition.y + anchorSize.height + offsetY
-        )
+        assertThat(ltrPosition.x).isEqualTo(anchorPosition.x + offsetX)
+        assertThat(ltrPosition.y).isEqualTo(anchorPosition.y + anchorSize.height + offsetY)
 
-        val rtlPosition = DropdownMenuPositionProvider(
-            DpOffset(offsetX.dp, offsetY.dp),
-            density
-        ).calculatePosition(
-            IntRect(anchorPosition, anchorSize),
-            windowSize,
-            LayoutDirection.Rtl,
-            popupSize
-        )
+        val rtlPosition =
+            DropdownMenuPositionProvider(DpOffset(offsetX.dp, offsetY.dp), density)
+                .calculatePosition(
+                    IntRect(anchorPosition, anchorSize),
+                    windowSize,
+                    LayoutDirection.Rtl,
+                    popupSize
+                )
 
-        assertThat(rtlPosition.x).isEqualTo(
-            anchorPosition.x + anchorSize.width - offsetX - popupSize.width
-        )
-        assertThat(rtlPosition.y).isEqualTo(
-            anchorPosition.y + anchorSize.height + offsetY
-        )
+        assertThat(rtlPosition.x)
+            .isEqualTo(anchorPosition.x + anchorSize.width - offsetX - popupSize.width)
+        assertThat(rtlPosition.y).isEqualTo(anchorPosition.y + anchorSize.height + offsetY)
     }
 
     @Test
@@ -225,39 +204,30 @@
         val offsetY = -40
         val popupSize = IntSize(150, 80)
 
-        val ltrPosition = DropdownMenuPositionProvider(
-            DpOffset(offsetX.dp, offsetY.dp),
-            density
-        ).calculatePosition(
-            IntRect(anchorPosition, anchorSize),
-            windowSize,
-            LayoutDirection.Ltr,
-            popupSize
-        )
+        val ltrPosition =
+            DropdownMenuPositionProvider(DpOffset(offsetX.dp, offsetY.dp), density)
+                .calculatePosition(
+                    IntRect(anchorPosition, anchorSize),
+                    windowSize,
+                    LayoutDirection.Ltr,
+                    popupSize
+                )
 
-        assertThat(ltrPosition.x).isEqualTo(
-            anchorPosition.x + anchorSize.width + offsetX - popupSize.width
-        )
-        assertThat(ltrPosition.y).isEqualTo(
-            anchorPosition.y - popupSize.height + offsetY
-        )
+        assertThat(ltrPosition.x)
+            .isEqualTo(anchorPosition.x + anchorSize.width + offsetX - popupSize.width)
+        assertThat(ltrPosition.y).isEqualTo(anchorPosition.y - popupSize.height + offsetY)
 
-        val rtlPosition = DropdownMenuPositionProvider(
-            DpOffset(offsetX.dp, offsetY.dp),
-            density
-        ).calculatePosition(
-            IntRect(anchorPositionRtl, anchorSize),
-            windowSize,
-            LayoutDirection.Rtl,
-            popupSize
-        )
+        val rtlPosition =
+            DropdownMenuPositionProvider(DpOffset(offsetX.dp, offsetY.dp), density)
+                .calculatePosition(
+                    IntRect(anchorPositionRtl, anchorSize),
+                    windowSize,
+                    LayoutDirection.Rtl,
+                    popupSize
+                )
 
-        assertThat(rtlPosition.x).isEqualTo(
-            anchorPositionRtl.x - offsetX
-        )
-        assertThat(rtlPosition.y).isEqualTo(
-            anchorPositionRtl.y - popupSize.height + offsetY
-        )
+        assertThat(rtlPosition.x).isEqualTo(anchorPositionRtl.x - offsetX)
+        assertThat(rtlPosition.y).isEqualTo(anchorPositionRtl.y - popupSize.height + offsetY)
     }
 
     @Test
@@ -274,19 +244,16 @@
         val MenuVerticalMargin = 48.dp
         val verticalMargin = with(density) { MenuVerticalMargin.roundToPx() }
 
-        val position = DropdownMenuPositionProvider(
-            DpOffset(0.dp, 0.dp),
-            density
-        ).calculatePosition(
-            IntRect(anchorPosition, anchorSize),
-            windowSize,
-            LayoutDirection.Ltr,
-            popupSize
-        )
+        val position =
+            DropdownMenuPositionProvider(DpOffset(0.dp, 0.dp), density)
+                .calculatePosition(
+                    IntRect(anchorPosition, anchorSize),
+                    windowSize,
+                    LayoutDirection.Ltr,
+                    popupSize
+                )
 
-        assertThat(position.y).isEqualTo(
-            verticalMargin
-        )
+        assertThat(position.y).isEqualTo(verticalMargin)
     }
 
     @Test
@@ -304,39 +271,29 @@
         val MenuVerticalMargin = 48.dp
         val verticalMargin = with(density) { MenuVerticalMargin.roundToPx() }
 
-        val position = DropdownMenuPositionProvider(
-            DpOffset(0.dp, 0.dp),
-            density
-        ).calculatePosition(
-            IntRect(anchorPosition, anchorSize),
-            windowSize,
-            LayoutDirection.Ltr,
-            popupSize
-        )
+        val position =
+            DropdownMenuPositionProvider(DpOffset(0.dp, 0.dp), density)
+                .calculatePosition(
+                    IntRect(anchorPosition, anchorSize),
+                    windowSize,
+                    LayoutDirection.Ltr,
+                    popupSize
+                )
 
-        assertThat(position.x).isEqualTo(
-            0
-        )
-        assertThat(position.y).isEqualTo(
-            verticalMargin
-        )
+        assertThat(position.x).isEqualTo(0)
+        assertThat(position.y).isEqualTo(verticalMargin)
 
-        val rtlPosition = DropdownMenuPositionProvider(
-            DpOffset(0.dp, 0.dp),
-            density
-        ).calculatePosition(
-            IntRect(anchorPositionRtl, anchorSize),
-            windowSize,
-            LayoutDirection.Rtl,
-            popupSize
-        )
+        val rtlPosition =
+            DropdownMenuPositionProvider(DpOffset(0.dp, 0.dp), density)
+                .calculatePosition(
+                    IntRect(anchorPositionRtl, anchorSize),
+                    windowSize,
+                    LayoutDirection.Rtl,
+                    popupSize
+                )
 
-        assertThat(rtlPosition.x).isEqualTo(
-            screenWidth - popupSize.width
-        )
-        assertThat(rtlPosition.y).isEqualTo(
-            verticalMargin
-        )
+        assertThat(rtlPosition.x).isEqualTo(screenWidth - popupSize.width)
+        assertThat(rtlPosition.y).isEqualTo(verticalMargin)
     }
 
     @Test
@@ -353,28 +310,29 @@
 
         var obtainedParentBounds = IntRect(0, 0, 0, 0)
         var obtainedMenuBounds = IntRect(0, 0, 0, 0)
-        DropdownMenuPositionProvider(
-            DpOffset(offsetX.dp, offsetY.dp),
-            density
-        ) { parentBounds, menuBounds ->
-            obtainedParentBounds = parentBounds
-            obtainedMenuBounds = menuBounds
-        }.calculatePosition(
-            IntRect(anchorPosition, anchorSize),
-            windowSize,
-            LayoutDirection.Ltr,
-            popupSize
-        )
+        DropdownMenuPositionProvider(DpOffset(offsetX.dp, offsetY.dp), density) {
+                parentBounds,
+                menuBounds ->
+                obtainedParentBounds = parentBounds
+                obtainedMenuBounds = menuBounds
+            }
+            .calculatePosition(
+                IntRect(anchorPosition, anchorSize),
+                windowSize,
+                LayoutDirection.Ltr,
+                popupSize
+            )
 
         assertThat(obtainedParentBounds).isEqualTo(IntRect(anchorPosition, anchorSize))
-        assertThat(obtainedMenuBounds).isEqualTo(
-            IntRect(
-                anchorPosition.x + offsetX,
-                anchorPosition.y + anchorSize.height + offsetY,
-                anchorPosition.x + offsetX + popupSize.width,
-                anchorPosition.y + anchorSize.height + offsetY + popupSize.height
+        assertThat(obtainedMenuBounds)
+            .isEqualTo(
+                IntRect(
+                    anchorPosition.x + offsetX,
+                    anchorPosition.y + anchorSize.height + offsetY,
+                    anchorPosition.x + offsetX + popupSize.width,
+                    anchorPosition.y + anchorSize.height + offsetY + popupSize.height
+                )
             )
-        )
     }
 
     @Test
@@ -390,17 +348,14 @@
             enabledContentAlpha = ContentAlpha.high
             disabledContentAlpha = ContentAlpha.disabled
             Box(Modifier.requiredSize(20.dp)) {
-                DropdownMenu(
-                    onDismissRequest = {},
-                    expanded = true
-                ) {
+                DropdownMenu(onDismissRequest = {}, expanded = true) {
                     DropdownMenuItem(onClick = {}) {
-                        enabledContentColor = LocalContentColor.current
-                            .copy(alpha = LocalContentAlpha.current)
+                        enabledContentColor =
+                            LocalContentColor.current.copy(alpha = LocalContentAlpha.current)
                     }
                     DropdownMenuItem(enabled = false, onClick = {}) {
-                        disabledContentColor = LocalContentColor.current
-                            .copy(alpha = LocalContentAlpha.current)
+                        disabledContentColor =
+                            LocalContentColor.current.copy(alpha = LocalContentAlpha.current)
                     }
                 }
             }
@@ -426,8 +381,6 @@
 
         rule.onNodeWithTag("MenuItem").performClick()
 
-        rule.runOnIdle {
-            assertThat(clicked).isTrue()
-        }
+        rule.runOnIdle { assertThat(clicked).isTrue() }
     }
 }
diff --git a/compose/material/material/src/androidInstrumentedTest/kotlin/androidx/compose/material/ModalBottomSheetStateTest.kt b/compose/material/material/src/androidInstrumentedTest/kotlin/androidx/compose/material/ModalBottomSheetStateTest.kt
index 1f3291c..9fc2214 100644
--- a/compose/material/material/src/androidInstrumentedTest/kotlin/androidx/compose/material/ModalBottomSheetStateTest.kt
+++ b/compose/material/material/src/androidInstrumentedTest/kotlin/androidx/compose/material/ModalBottomSheetStateTest.kt
@@ -31,8 +31,7 @@
 @RunWith(AndroidJUnit4::class)
 class ModalBottomSheetStateTest {
 
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
     private val restorationTester = StateRestorationTester(rule)
 
     @Test
@@ -42,11 +41,12 @@
         val animationSpec = SpringSpec<Float>(visibilityThreshold = 10F)
         lateinit var state: ModalBottomSheetState
         restorationTester.setContent {
-            state = rememberModalBottomSheetState(
-                initialValue = initialValue,
-                skipHalfExpanded = skipHalfExpanded,
-                animationSpec = animationSpec
-            )
+            state =
+                rememberModalBottomSheetState(
+                    initialValue = initialValue,
+                    skipHalfExpanded = skipHalfExpanded,
+                    animationSpec = animationSpec
+                )
         }
 
         assertThat(state.animationSpec).isEqualTo(animationSpec)
@@ -70,9 +70,7 @@
             )
             fail("ModalBottomSheetState didn't throw an exception")
         } catch (exception: IllegalArgumentException) {
-            assertThat(exception)
-                .hasMessageThat()
-                .isNotEmpty()
+            assertThat(exception).hasMessageThat().isNotEmpty()
         }
     }
 
diff --git a/compose/material/material/src/androidInstrumentedTest/kotlin/androidx/compose/material/ModalBottomSheetTest.kt b/compose/material/material/src/androidInstrumentedTest/kotlin/androidx/compose/material/ModalBottomSheetTest.kt
index 3b87fa0..d52fbf1 100644
--- a/compose/material/material/src/androidInstrumentedTest/kotlin/androidx/compose/material/ModalBottomSheetTest.kt
+++ b/compose/material/material/src/androidInstrumentedTest/kotlin/androidx/compose/material/ModalBottomSheetTest.kt
@@ -82,8 +82,7 @@
 @OptIn(ExperimentalMaterialApi::class)
 class ModalBottomSheetTest {
 
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
     private val sheetHeight = 256.dp
     private val sheetTag = "sheetContentTag"
@@ -100,19 +99,13 @@
                 sheetState = rememberModalBottomSheetState(ModalBottomSheetValue.Hidden),
                 content = {},
                 sheetContent = {
-                    Box(
-                        Modifier
-                            .fillMaxWidth()
-                            .height(sheetHeight)
-                            .testTag(sheetTag)
-                    )
+                    Box(Modifier.fillMaxWidth().height(sheetHeight).testTag(sheetTag))
                 }
             )
         }
 
         val height = rule.rootHeight()
-        rule.onNodeWithTag(sheetTag)
-            .assertTopPositionInRootIsEqualTo(height)
+        rule.onNodeWithTag(sheetTag).assertTopPositionInRootIsEqualTo(height)
     }
 
     @Test
@@ -122,19 +115,13 @@
                 sheetState = rememberModalBottomSheetState(ModalBottomSheetValue.Expanded),
                 content = {},
                 sheetContent = {
-                    Box(
-                        Modifier
-                            .fillMaxWidth()
-                            .height(sheetHeight)
-                            .testTag(sheetTag)
-                    )
+                    Box(Modifier.fillMaxWidth().height(sheetHeight).testTag(sheetTag))
                 }
             )
         }
 
         val height = rule.rootHeight()
-        rule.onNodeWithTag(sheetTag)
-            .assertTopPositionInRootIsEqualTo(height - sheetHeight)
+        rule.onNodeWithTag(sheetTag).assertTopPositionInRootIsEqualTo(height - sheetHeight)
     }
 
     @Test
@@ -144,18 +131,15 @@
                 sheetState = rememberModalBottomSheetState(ModalBottomSheetValue.Expanded),
                 content = {},
                 sheetContent = {
-                    Box(
-                        Modifier
-                            .fillMaxWidth()
-                            .height(sheetHeight)
-                            .testTag(sheetTag)
-                    )
+                    Box(Modifier.fillMaxWidth().height(sheetHeight).testTag(sheetTag))
                 }
             )
         }
 
         val height = rule.rootHeight()
-        rule.onNodeWithTag(sheetTag).onParent()
+        rule
+            .onNodeWithTag(sheetTag)
+            .onParent()
             .assert(SemanticsMatcher.keyNotDefined(SemanticsActions.Collapse))
             .assert(SemanticsMatcher.keyNotDefined(SemanticsActions.Expand))
             .assert(SemanticsMatcher.keyIsDefined(SemanticsActions.Dismiss))
@@ -163,8 +147,7 @@
 
         advanceClock()
 
-        rule.onNodeWithTag(sheetTag)
-            .assertTopPositionInRootIsEqualTo(height)
+        rule.onNodeWithTag(sheetTag).assertTopPositionInRootIsEqualTo(height)
     }
 
     @Test
@@ -173,19 +156,12 @@
             ModalBottomSheetLayout(
                 sheetState = rememberModalBottomSheetState(ModalBottomSheetValue.Hidden),
                 content = {},
-                sheetContent = {
-                    Box(
-                        Modifier
-                            .fillMaxSize()
-                            .testTag(sheetTag)
-                    )
-                }
+                sheetContent = { Box(Modifier.fillMaxSize().testTag(sheetTag)) }
             )
         }
 
         val height = rule.rootHeight()
-        rule.onNodeWithTag(sheetTag)
-            .assertTopPositionInRootIsEqualTo(height)
+        rule.onNodeWithTag(sheetTag).assertTopPositionInRootIsEqualTo(height)
     }
 
     @Test
@@ -194,18 +170,11 @@
             ModalBottomSheetLayout(
                 sheetState = rememberModalBottomSheetState(ModalBottomSheetValue.Expanded),
                 content = {},
-                sheetContent = {
-                    Box(
-                        Modifier
-                            .fillMaxSize()
-                            .testTag(sheetTag)
-                    )
-                }
+                sheetContent = { Box(Modifier.fillMaxSize().testTag(sheetTag)) }
             )
         }
 
-        rule.onNodeWithTag(sheetTag)
-            .assertTopPositionInRootIsEqualTo(0.dp)
+        rule.onNodeWithTag(sheetTag).assertTopPositionInRootIsEqualTo(0.dp)
     }
 
     @Test
@@ -214,18 +183,14 @@
             ModalBottomSheetLayout(
                 sheetState = rememberModalBottomSheetState(ModalBottomSheetValue.Expanded),
                 content = {},
-                sheetContent = {
-                    Box(
-                        Modifier
-                            .fillMaxSize()
-                            .testTag(sheetTag)
-                    )
-                }
+                sheetContent = { Box(Modifier.fillMaxSize().testTag(sheetTag)) }
             )
         }
 
         val height = rule.rootHeight()
-        rule.onNodeWithTag(sheetTag).onParent()
+        rule
+            .onNodeWithTag(sheetTag)
+            .onParent()
             .assert(SemanticsMatcher.keyNotDefined(SemanticsActions.Expand))
             .assert(SemanticsMatcher.keyIsDefined(SemanticsActions.Collapse))
             .assert(SemanticsMatcher.keyIsDefined(SemanticsActions.Dismiss))
@@ -233,8 +198,7 @@
 
         advanceClock()
 
-        rule.onNodeWithTag(sheetTag)
-            .assertTopPositionInRootIsEqualTo(height / 2)
+        rule.onNodeWithTag(sheetTag).assertTopPositionInRootIsEqualTo(height / 2)
     }
 
     @Test
@@ -243,18 +207,14 @@
             ModalBottomSheetLayout(
                 sheetState = rememberModalBottomSheetState(ModalBottomSheetValue.Expanded),
                 content = {},
-                sheetContent = {
-                    Box(
-                        Modifier
-                            .fillMaxSize()
-                            .testTag(sheetTag)
-                    )
-                }
+                sheetContent = { Box(Modifier.fillMaxSize().testTag(sheetTag)) }
             )
         }
 
         val height = rule.rootHeight()
-        rule.onNodeWithTag(sheetTag).onParent()
+        rule
+            .onNodeWithTag(sheetTag)
+            .onParent()
             .assert(SemanticsMatcher.keyNotDefined(SemanticsActions.Expand))
             .assert(SemanticsMatcher.keyIsDefined(SemanticsActions.Collapse))
             .assert(SemanticsMatcher.keyIsDefined(SemanticsActions.Dismiss))
@@ -262,8 +222,7 @@
 
         advanceClock()
 
-        rule.onNodeWithTag(sheetTag)
-            .assertTopPositionInRootIsEqualTo(height)
+        rule.onNodeWithTag(sheetTag).assertTopPositionInRootIsEqualTo(height)
     }
 
     @Test
@@ -272,19 +231,12 @@
             ModalBottomSheetLayout(
                 sheetState = rememberModalBottomSheetState(ModalBottomSheetValue.HalfExpanded),
                 content = {},
-                sheetContent = {
-                    Box(
-                        Modifier
-                            .fillMaxSize(0.6f)
-                            .testTag(sheetTag)
-                    )
-                }
+                sheetContent = { Box(Modifier.fillMaxSize(0.6f).testTag(sheetTag)) }
             )
         }
 
         val height = rule.rootHeight()
-        rule.onNodeWithTag(sheetTag)
-            .assertTopPositionInRootIsEqualTo(height / 2)
+        rule.onNodeWithTag(sheetTag).assertTopPositionInRootIsEqualTo(height / 2)
     }
 
     @Test
@@ -293,17 +245,13 @@
             ModalBottomSheetLayout(
                 sheetState = rememberModalBottomSheetState(ModalBottomSheetValue.HalfExpanded),
                 content = {},
-                sheetContent = {
-                    Box(
-                        Modifier
-                            .fillMaxSize()
-                            .testTag(sheetTag)
-                    )
-                }
+                sheetContent = { Box(Modifier.fillMaxSize().testTag(sheetTag)) }
             )
         }
 
-        rule.onNodeWithTag(sheetTag).onParent()
+        rule
+            .onNodeWithTag(sheetTag)
+            .onParent()
             .assert(SemanticsMatcher.keyNotDefined(SemanticsActions.Collapse))
             .assert(SemanticsMatcher.keyIsDefined(SemanticsActions.Expand))
             .assert(SemanticsMatcher.keyIsDefined(SemanticsActions.Dismiss))
@@ -311,8 +259,7 @@
 
         advanceClock()
 
-        rule.onNodeWithTag(sheetTag)
-            .assertTopPositionInRootIsEqualTo(0.dp)
+        rule.onNodeWithTag(sheetTag).assertTopPositionInRootIsEqualTo(0.dp)
     }
 
     @Test
@@ -321,18 +268,14 @@
             ModalBottomSheetLayout(
                 sheetState = rememberModalBottomSheetState(ModalBottomSheetValue.HalfExpanded),
                 content = {},
-                sheetContent = {
-                    Box(
-                        Modifier
-                            .fillMaxSize()
-                            .testTag(sheetTag)
-                    )
-                }
+                sheetContent = { Box(Modifier.fillMaxSize().testTag(sheetTag)) }
             )
         }
 
         val height = rule.rootHeight()
-        rule.onNodeWithTag(sheetTag).onParent()
+        rule
+            .onNodeWithTag(sheetTag)
+            .onParent()
             .assert(SemanticsMatcher.keyNotDefined(SemanticsActions.Collapse))
             .assert(SemanticsMatcher.keyIsDefined(SemanticsActions.Expand))
             .assert(SemanticsMatcher.keyIsDefined(SemanticsActions.Dismiss))
@@ -340,125 +283,101 @@
 
         advanceClock()
 
-        rule.onNodeWithTag(sheetTag)
-            .assertTopPositionInRootIsEqualTo(height)
+        rule.onNodeWithTag(sheetTag).assertTopPositionInRootIsEqualTo(height)
     }
 
     @Test
-    fun modalBottomSheet_showAndHide_manually(): Unit = runBlocking(AutoTestFrameClock()) {
-        lateinit var sheetState: ModalBottomSheetState
-        rule.setMaterialContent {
-            sheetState = rememberModalBottomSheetState(ModalBottomSheetValue.Hidden)
-            ModalBottomSheetLayout(
-                sheetState = sheetState,
-                content = {},
-                sheetContent = {
-                    Box(
-                        Modifier
-                            .fillMaxWidth()
-                            .height(sheetHeight)
-                            .testTag(sheetTag)
-                    )
-                }
-            )
+    fun modalBottomSheet_showAndHide_manually(): Unit =
+        runBlocking(AutoTestFrameClock()) {
+            lateinit var sheetState: ModalBottomSheetState
+            rule.setMaterialContent {
+                sheetState = rememberModalBottomSheetState(ModalBottomSheetValue.Hidden)
+                ModalBottomSheetLayout(
+                    sheetState = sheetState,
+                    content = {},
+                    sheetContent = {
+                        Box(Modifier.fillMaxWidth().height(sheetHeight).testTag(sheetTag))
+                    }
+                )
+            }
+
+            val height = rule.rootHeight()
+
+            rule.onNodeWithTag(sheetTag).assertTopPositionInRootIsEqualTo(height)
+
+            sheetState.show()
+
+            advanceClock()
+
+            rule.onNodeWithTag(sheetTag).assertTopPositionInRootIsEqualTo(height - sheetHeight)
+
+            sheetState.hide()
+
+            advanceClock()
+
+            rule.onNodeWithTag(sheetTag).assertTopPositionInRootIsEqualTo(height)
         }
 
-        val height = rule.rootHeight()
-
-        rule.onNodeWithTag(sheetTag)
-            .assertTopPositionInRootIsEqualTo(height)
-
-        sheetState.show()
-
-        advanceClock()
-
-        rule.onNodeWithTag(sheetTag)
-            .assertTopPositionInRootIsEqualTo(height - sheetHeight)
-
-        sheetState.hide()
-
-        advanceClock()
-
-        rule.onNodeWithTag(sheetTag)
-            .assertTopPositionInRootIsEqualTo(height)
-    }
-
     @Test
-    fun modalBottomSheet_showAndHide_manually_tallBottomSheet(): Unit = runBlocking(
-        AutoTestFrameClock()
-    ) {
-        lateinit var sheetState: ModalBottomSheetState
-        rule.setMaterialContent {
-            sheetState = rememberModalBottomSheetState(ModalBottomSheetValue.Hidden)
-            ModalBottomSheetLayout(
-                sheetState = sheetState,
-                content = {},
-                sheetContent = {
-                    Box(
-                        Modifier
-                            .fillMaxSize()
-                            .testTag(sheetTag)
-                    )
-                }
-            )
+    fun modalBottomSheet_showAndHide_manually_tallBottomSheet(): Unit =
+        runBlocking(AutoTestFrameClock()) {
+            lateinit var sheetState: ModalBottomSheetState
+            rule.setMaterialContent {
+                sheetState = rememberModalBottomSheetState(ModalBottomSheetValue.Hidden)
+                ModalBottomSheetLayout(
+                    sheetState = sheetState,
+                    content = {},
+                    sheetContent = { Box(Modifier.fillMaxSize().testTag(sheetTag)) }
+                )
+            }
+
+            val height = rule.rootHeight()
+
+            rule.onNodeWithTag(sheetTag).assertTopPositionInRootIsEqualTo(height)
+
+            sheetState.show()
+
+            advanceClock()
+
+            rule.onNodeWithTag(sheetTag).assertTopPositionInRootIsEqualTo(height / 2)
+
+            sheetState.hide()
+
+            advanceClock()
+
+            rule.onNodeWithTag(sheetTag).assertTopPositionInRootIsEqualTo(height)
         }
 
-        val height = rule.rootHeight()
-
-        rule.onNodeWithTag(sheetTag)
-            .assertTopPositionInRootIsEqualTo(height)
-
-        sheetState.show()
-
-        advanceClock()
-
-        rule.onNodeWithTag(sheetTag)
-            .assertTopPositionInRootIsEqualTo(height / 2)
-
-        sheetState.hide()
-
-        advanceClock()
-
-        rule.onNodeWithTag(sheetTag)
-            .assertTopPositionInRootIsEqualTo(height)
-    }
-
     @Test
-    fun modalBottomSheet_showAndHide_manually_skipHalfExpanded(): Unit = runBlocking(
-        AutoTestFrameClock()
-    ) {
-        lateinit var sheetState: ModalBottomSheetState
-        rule.setMaterialContent {
-            sheetState = rememberModalBottomSheetState(
-                ModalBottomSheetValue.Hidden,
-                skipHalfExpanded = true
-            )
-            ModalBottomSheetLayout(
-                sheetState = sheetState,
-                content = {},
-                sheetContent = {
-                    Box(
-                        Modifier
-                            .fillMaxSize()
-                            .testTag(sheetTag)
+    fun modalBottomSheet_showAndHide_manually_skipHalfExpanded(): Unit =
+        runBlocking(AutoTestFrameClock()) {
+            lateinit var sheetState: ModalBottomSheetState
+            rule.setMaterialContent {
+                sheetState =
+                    rememberModalBottomSheetState(
+                        ModalBottomSheetValue.Hidden,
+                        skipHalfExpanded = true
                     )
-                }
-            )
+                ModalBottomSheetLayout(
+                    sheetState = sheetState,
+                    content = {},
+                    sheetContent = { Box(Modifier.fillMaxSize().testTag(sheetTag)) }
+                )
+            }
+
+            assertThat(sheetState.currentValue == ModalBottomSheetValue.Hidden)
+
+            sheetState.show()
+
+            advanceClock()
+
+            assertThat(sheetState.currentValue == ModalBottomSheetValue.Expanded)
+
+            sheetState.hide()
+
+            assertThat(sheetState.currentValue == ModalBottomSheetValue.Hidden)
         }
 
-        assertThat(sheetState.currentValue == ModalBottomSheetValue.Hidden)
-
-        sheetState.show()
-
-        advanceClock()
-
-        assertThat(sheetState.currentValue == ModalBottomSheetValue.Expanded)
-
-        sheetState.hide()
-
-        assertThat(sheetState.currentValue == ModalBottomSheetValue.Hidden)
-    }
-
     @Test
     fun modalBottomSheet_hideBySwiping() {
         lateinit var sheetState: ModalBottomSheetState
@@ -466,20 +385,8 @@
             sheetState = rememberModalBottomSheetState(ModalBottomSheetValue.Expanded)
             ModalBottomSheetLayout(
                 sheetState = sheetState,
-                content = {
-                    Box(
-                        Modifier
-                            .fillMaxSize()
-                            .testTag(contentTag)
-                    )
-                },
-                sheetContent = {
-                    Box(
-                        Modifier
-                            .fillMaxSize()
-                            .testTag(sheetTag)
-                    )
-                }
+                content = { Box(Modifier.fillMaxSize().testTag(contentTag)) },
+                sheetContent = { Box(Modifier.fillMaxSize().testTag(sheetTag)) }
             )
         }
 
@@ -487,8 +394,9 @@
             assertThat(sheetState.currentValue).isEqualTo(ModalBottomSheetValue.Expanded)
         }
 
-        rule.onNodeWithTag(sheetTag)
-            .performTouchInput { swipeDown(endY = rule.rootHeight().toPx() / 2) }
+        rule.onNodeWithTag(sheetTag).performTouchInput {
+            swipeDown(endY = rule.rootHeight().toPx() / 2)
+        }
 
         advanceClock()
 
@@ -496,8 +404,7 @@
             assertThat(sheetState.currentValue).isEqualTo(ModalBottomSheetValue.HalfExpanded)
         }
 
-        rule.onNodeWithTag(sheetTag)
-            .performTouchInput { swipeDown() }
+        rule.onNodeWithTag(sheetTag).performTouchInput { swipeDown() }
 
         advanceClock()
 
@@ -510,26 +417,16 @@
     fun modalBottomSheet_hideBySwiping_skipHalfExpanded() {
         lateinit var sheetState: ModalBottomSheetState
         rule.setMaterialContent {
-            sheetState = rememberModalBottomSheetState(
-                ModalBottomSheetValue.Expanded,
-                skipHalfExpanded = true
-            )
+            sheetState =
+                rememberModalBottomSheetState(
+                    ModalBottomSheetValue.Expanded,
+                    skipHalfExpanded = true
+                )
             ModalBottomSheetLayout(
                 sheetState = sheetState,
-                content = {
-                    Box(
-                        Modifier
-                            .fillMaxSize()
-                            .testTag(contentTag)
-                    )
-                },
+                content = { Box(Modifier.fillMaxSize().testTag(contentTag)) },
                 sheetContent = {
-                    Box(
-                        Modifier
-                            .fillMaxWidth()
-                            .height(sheetHeight)
-                            .testTag(sheetTag)
-                    )
+                    Box(Modifier.fillMaxWidth().height(sheetHeight).testTag(sheetTag))
                 }
             )
         }
@@ -538,8 +435,7 @@
             assertThat(sheetState.currentValue).isEqualTo(ModalBottomSheetValue.Expanded)
         }
 
-        rule.onNodeWithTag(sheetTag)
-            .performTouchInput { swipeDown() }
+        rule.onNodeWithTag(sheetTag).performTouchInput { swipeDown() }
 
         advanceClock()
 
@@ -558,35 +454,19 @@
                 modifier = Modifier.testTag(topTag),
                 scrimColor = scrimColor.value,
                 sheetState = rememberModalBottomSheetState(ModalBottomSheetValue.HalfExpanded),
-                content = {
-                    Box(
-                        Modifier
-                            .fillMaxSize()
-                            .testTag(contentTag)
-                    )
-                },
-                sheetContent = {
-                    Box(
-                        Modifier
-                            .fillMaxSize()
-                            .testTag(sheetTag)
-                    )
-                }
+                content = { Box(Modifier.fillMaxSize().testTag(contentTag)) },
+                sheetContent = { Box(Modifier.fillMaxSize().testTag(sheetTag)) }
             )
             closeSheet = getString(Strings.CloseSheet)
         }
 
         val height = rule.rootHeight()
-        rule.onNodeWithTag(sheetTag)
-            .assertTopPositionInRootIsEqualTo(height / 2)
+        rule.onNodeWithTag(sheetTag).assertTopPositionInRootIsEqualTo(height / 2)
         var topNode = rule.onNodeWithTag(topTag).fetchSemanticsNode()
         assertEquals(3, topNode.children.size)
-        rule.onNodeWithContentDescription(closeSheet)
-            .assertHasClickAction()
+        rule.onNodeWithContentDescription(closeSheet).assertHasClickAction()
 
-        rule.runOnIdle {
-            scrimColor.value = Color.Unspecified
-        }
+        rule.runOnIdle { scrimColor.value = Color.Unspecified }
 
         topNode = rule.onNodeWithTag(topTag).fetchSemanticsNode()
         // only two nodes since there's no scrim
@@ -600,20 +480,8 @@
             sheetState = rememberModalBottomSheetState(ModalBottomSheetValue.Expanded)
             ModalBottomSheetLayout(
                 sheetState = sheetState,
-                content = {
-                    Box(
-                        Modifier
-                            .fillMaxSize()
-                            .testTag(contentTag)
-                    )
-                },
-                sheetContent = {
-                    Box(
-                        Modifier
-                            .fillMaxSize()
-                            .testTag(sheetTag)
-                    )
-                }
+                content = { Box(Modifier.fillMaxSize().testTag(contentTag)) },
+                sheetContent = { Box(Modifier.fillMaxSize().testTag(sheetTag)) }
             )
         }
 
@@ -621,8 +489,7 @@
             assertThat(sheetState.currentValue).isEqualTo(ModalBottomSheetValue.Expanded)
         }
 
-        rule.onNodeWithTag(sheetTag)
-            .performTouchInput { swipeDown() }
+        rule.onNodeWithTag(sheetTag).performTouchInput { swipeDown() }
 
         advanceClock()
 
@@ -635,28 +502,15 @@
     fun modalBottomSheet_respectsConfirmStateChange() {
         lateinit var sheetState: ModalBottomSheetState
         rule.setMaterialContent {
-            sheetState = rememberModalBottomSheetState(
-                ModalBottomSheetValue.Expanded,
-                confirmValueChange = { newState ->
-                    newState != ModalBottomSheetValue.Hidden
-                }
-            )
+            sheetState =
+                rememberModalBottomSheetState(
+                    ModalBottomSheetValue.Expanded,
+                    confirmValueChange = { newState -> newState != ModalBottomSheetValue.Hidden }
+                )
             ModalBottomSheetLayout(
                 sheetState = sheetState,
-                content = {
-                    Box(
-                        Modifier
-                            .fillMaxSize()
-                            .testTag(contentTag)
-                    )
-                },
-                sheetContent = {
-                    Box(
-                        Modifier
-                            .fillMaxSize()
-                            .testTag(sheetTag)
-                    )
-                }
+                content = { Box(Modifier.fillMaxSize().testTag(contentTag)) },
+                sheetContent = { Box(Modifier.fillMaxSize().testTag(sheetTag)) }
             )
         }
 
@@ -664,8 +518,7 @@
             assertThat(sheetState.currentValue).isEqualTo(ModalBottomSheetValue.Expanded)
         }
 
-        rule.onNodeWithTag(sheetTag)
-            .performTouchInput { swipeDown() }
+        rule.onNodeWithTag(sheetTag).performTouchInput { swipeDown() }
 
         advanceClock()
 
@@ -673,8 +526,7 @@
             assertThat(sheetState.currentValue).isEqualTo(ModalBottomSheetValue.Expanded)
         }
 
-        rule.onNodeWithTag(sheetTag).onParent()
-            .performSemanticsAction(SemanticsActions.Dismiss)
+        rule.onNodeWithTag(sheetTag).onParent().performSemanticsAction(SemanticsActions.Dismiss)
 
         advanceClock()
 
@@ -690,20 +542,8 @@
             sheetState = rememberModalBottomSheetState(ModalBottomSheetValue.HalfExpanded)
             ModalBottomSheetLayout(
                 sheetState = sheetState,
-                content = {
-                    Box(
-                        Modifier
-                            .fillMaxSize()
-                            .testTag(contentTag)
-                    )
-                },
-                sheetContent = {
-                    Box(
-                        Modifier
-                            .fillMaxSize()
-                            .testTag(sheetTag)
-                    )
-                }
+                content = { Box(Modifier.fillMaxSize().testTag(contentTag)) },
+                sheetContent = { Box(Modifier.fillMaxSize().testTag(sheetTag)) }
             )
         }
 
@@ -711,8 +551,7 @@
             assertThat(sheetState.currentValue).isEqualTo(ModalBottomSheetValue.HalfExpanded)
         }
 
-        rule.onNodeWithTag(sheetTag)
-            .performTouchInput { swipeUp() }
+        rule.onNodeWithTag(sheetTag).performTouchInput { swipeUp() }
 
         advanceClock()
 
@@ -728,37 +567,24 @@
             ModalBottomSheetLayout(
                 modifier = Modifier.testTag(topTag),
                 sheetState = rememberModalBottomSheetState(ModalBottomSheetValue.HalfExpanded),
-                content = {
-                    Box(
-                        Modifier
-                            .fillMaxSize()
-                            .testTag(contentTag)
-                    )
-                },
-                sheetContent = {
-                    Box(
-                        Modifier
-                            .fillMaxSize()
-                            .testTag(sheetTag)
-                    )
-                }
+                content = { Box(Modifier.fillMaxSize().testTag(contentTag)) },
+                sheetContent = { Box(Modifier.fillMaxSize().testTag(sheetTag)) }
             )
         }
 
         val height = rule.rootHeight()
-        rule.onNodeWithTag(sheetTag)
-            .assertTopPositionInRootIsEqualTo(height / 2)
+        rule.onNodeWithTag(sheetTag).assertTopPositionInRootIsEqualTo(height / 2)
         var topNode = rule.onNodeWithTag(topTag).fetchSemanticsNode()
         assertEquals(3, topNode.children.size)
-        rule.onNodeWithTag(topTag)
+        rule
+            .onNodeWithTag(topTag)
             .onChildAt(1)
             .assertHasClickAction()
             .performSemanticsAction(SemanticsActions.OnClick)
 
         advanceClock()
 
-        rule.onNodeWithTag(sheetTag)
-            .assertTopPositionInRootIsEqualTo(height)
+        rule.onNodeWithTag(sheetTag).assertTopPositionInRootIsEqualTo(height)
         topNode = rule.onNodeWithTag(topTag).fetchSemanticsNode()
         assertEquals(2, topNode.children.size)
     }
@@ -771,68 +597,45 @@
             ModalBottomSheetLayout(
                 modifier = Modifier.testTag(topTag),
                 sheetState = rememberModalBottomSheetState(ModalBottomSheetValue.Hidden),
-                content = {
-                    Box(
-                        Modifier
-                            .fillMaxSize()
-                            .testTag(contentTag)
-                    )
-                },
+                content = { Box(Modifier.fillMaxSize().testTag(contentTag)) },
                 sheetContent = {
                     Box(
-                        Modifier
-                            .fillMaxSize()
-                            .testTag(sheetTag)
-                            .onGloballyPositioned {
-                                if (lastKnownPosition != null) {
-                                    assertThat(lastKnownPosition).isEqualTo(it.positionInRoot())
-                                }
-                                lastKnownPosition = it.positionInRoot()
+                        Modifier.fillMaxSize().testTag(sheetTag).onGloballyPositioned {
+                            if (lastKnownPosition != null) {
+                                assertThat(lastKnownPosition).isEqualTo(it.positionInRoot())
                             }
+                            lastKnownPosition = it.positionInRoot()
+                        }
                     )
                 }
             )
         }
 
         val height = rule.rootHeight()
-        rule.onNodeWithTag(sheetTag)
-            .assertTopPositionInRootIsEqualTo(height)
+        rule.onNodeWithTag(sheetTag).assertTopPositionInRootIsEqualTo(height)
     }
 
     @Test
     fun modalBottomSheet_missingAnchors_findsClosest() {
         val topTag = "ModalBottomSheetLayout"
         var showShortContent by mutableStateOf(false)
-        val sheetState = ModalBottomSheetState(
-            initialValue = ModalBottomSheetValue.Hidden,
-            density = rule.density
-        )
+        val sheetState =
+            ModalBottomSheetState(
+                initialValue = ModalBottomSheetValue.Hidden,
+                density = rule.density
+            )
         lateinit var scope: CoroutineScope
         rule.setMaterialContent {
             scope = rememberCoroutineScope()
             ModalBottomSheetLayout(
                 modifier = Modifier.testTag(topTag),
                 sheetState = sheetState,
-                content = {
-                    Box(
-                        Modifier
-                            .fillMaxSize()
-                            .testTag(contentTag)
-                    )
-                },
+                content = { Box(Modifier.fillMaxSize().testTag(contentTag)) },
                 sheetContent = {
                     if (showShortContent) {
-                        Box(
-                            Modifier
-                                .fillMaxWidth()
-                                .height(100.dp)
-                        )
+                        Box(Modifier.fillMaxWidth().height(100.dp))
                     } else {
-                        Box(
-                            Modifier
-                                .fillMaxSize()
-                                .testTag(sheetTag)
-                        )
+                        Box(Modifier.fillMaxSize().testTag(sheetTag))
                     }
                 }
             )
@@ -868,21 +671,14 @@
         lateinit var scrollState: ScrollState
         val sheetContentTag = "sheetContent"
         rule.setContent {
-            sheetState = rememberModalBottomSheetState(
-                initialValue = ModalBottomSheetValue.HalfExpanded
-            )
+            sheetState =
+                rememberModalBottomSheetState(initialValue = ModalBottomSheetValue.HalfExpanded)
             ModalBottomSheetLayout(
                 sheetState = sheetState,
                 sheetContent = {
                     scrollState = rememberScrollState()
-                    Column(
-                        Modifier
-                            .verticalScroll(scrollState)
-                            .testTag(sheetContentTag)
-                    ) {
-                        repeat(100) {
-                            Text(it.toString(), Modifier.requiredHeight(50.dp))
-                        }
+                    Column(Modifier.verticalScroll(scrollState).testTag(sheetContentTag)) {
+                        repeat(100) { Text(it.toString(), Modifier.requiredHeight(50.dp)) }
                     }
                 },
                 sheetGesturesEnabled = true,
@@ -895,42 +691,37 @@
         assertThat(scrollState.value).isEqualTo(0)
         assertThat(sheetState.currentValue).isEqualTo(ModalBottomSheetValue.HalfExpanded)
 
-        rule.onNodeWithTag(sheetContentTag)
-            .performTouchInput {
-                swipeUp(startY = bottom, endY = bottom / 2)
-            }
+        rule.onNodeWithTag(sheetContentTag).performTouchInput {
+            swipeUp(startY = bottom, endY = bottom / 2)
+        }
         rule.waitForIdle()
         assertThat(scrollState.value).isEqualTo(0)
         assertThat(sheetState.currentValue).isEqualTo(ModalBottomSheetValue.Expanded)
 
-        rule.onNodeWithTag(sheetContentTag)
-            .performTouchInput {
-                swipeUp(startY = bottom, endY = top)
-            }
+        rule.onNodeWithTag(sheetContentTag).performTouchInput {
+            swipeUp(startY = bottom, endY = top)
+        }
         rule.waitForIdle()
         assertThat(scrollState.value).isGreaterThan(0)
         assertThat(sheetState.currentValue).isEqualTo(ModalBottomSheetValue.Expanded)
 
-        rule.onNodeWithTag(sheetContentTag)
-            .performTouchInput {
-                swipeDown(startY = top, endY = bottom)
-            }
+        rule.onNodeWithTag(sheetContentTag).performTouchInput {
+            swipeDown(startY = top, endY = bottom)
+        }
         rule.waitForIdle()
         assertThat(scrollState.value).isEqualTo(0)
         assertThat(sheetState.currentValue).isEqualTo(ModalBottomSheetValue.Expanded)
 
-        rule.onNodeWithTag(sheetContentTag)
-            .performTouchInput {
-                swipeDown(startY = top, endY = bottom / 2)
-            }
+        rule.onNodeWithTag(sheetContentTag).performTouchInput {
+            swipeDown(startY = top, endY = bottom / 2)
+        }
         rule.waitForIdle()
         assertThat(scrollState.value).isEqualTo(0)
         assertThat(sheetState.currentValue).isEqualTo(ModalBottomSheetValue.HalfExpanded)
 
-        rule.onNodeWithTag(sheetContentTag)
-            .performTouchInput {
-                swipeDown(startY = bottom / 2, endY = bottom)
-            }
+        rule.onNodeWithTag(sheetContentTag).performTouchInput {
+            swipeDown(startY = bottom / 2, endY = bottom)
+        }
         rule.waitForIdle()
         assertThat(scrollState.value).isEqualTo(0)
         assertThat(sheetState.currentValue).isEqualTo(ModalBottomSheetValue.Hidden)
@@ -947,15 +738,15 @@
             val sheetHeightPx = with(rule.density) { sheetHeight.toPx() }
 
             rule.setContent {
-                sheetState = rememberModalBottomSheetState(
-                    initialValue = ModalBottomSheetValue.Expanded,
-                )
+                sheetState =
+                    rememberModalBottomSheetState(
+                        initialValue = ModalBottomSheetValue.Expanded,
+                    )
                 ModalBottomSheetLayout(
                     sheetState = sheetState,
                     sheetContent = {
                         Box(
-                            Modifier
-                                .fillMaxWidth()
+                            Modifier.fillMaxWidth()
                                 .requiredHeight(sheetHeight)
                                 .nestedScroll(scrollConnection, scrollDispatcher)
                                 .testTag(sheetContentTag),
@@ -975,7 +766,8 @@
             )
             rule.waitForIdle()
             assertWithMessage("Offset after scroll is equal to offset before scroll")
-                .that(sheetState.requireOffset()).isEqualTo(offsetBeforeScroll)
+                .that(sheetState.requireOffset())
+                .isEqualTo(offsetBeforeScroll)
 
             val highFlingVelocity = Velocity(x = 0f, y = with(rule.density) { 500.dp.toPx() })
             scrollDispatcher.dispatchPreFling(highFlingVelocity)
@@ -994,11 +786,7 @@
                 sheetState = state,
                 sheetContent = {
                     scope = rememberCoroutineScope()
-                    LazyColumn {
-                        items(amountOfItems) {
-                            ListItem(text = { Text("$it") })
-                        }
-                    }
+                    LazyColumn { items(amountOfItems) { ListItem(text = { Text("$it") }) } }
                 },
                 content = { Box(Modifier.fillMaxSize()) }
             )
@@ -1008,9 +796,7 @@
 
         amountOfItems = 50
         rule.waitForIdle()
-        scope.launch {
-            state.show()
-        }
+        scope.launch { state.show() }
         // The anchors should now be {Hidden, HalfExpanded, Expanded}
 
         rule.waitForIdle()
@@ -1024,11 +810,15 @@
         assertThat(state.anchoredDraggableState.anchors.hasAnchorFor(ModalBottomSheetValue.Hidden))
             .isTrue()
         assertThat(
-            state.anchoredDraggableState.anchors.hasAnchorFor(ModalBottomSheetValue.HalfExpanded)
-        ).isTrue()
+                state.anchoredDraggableState.anchors.hasAnchorFor(
+                    ModalBottomSheetValue.HalfExpanded
+                )
+            )
+            .isTrue()
         assertThat(
-            state.anchoredDraggableState.anchors.hasAnchorFor(ModalBottomSheetValue.Expanded)
-        ).isTrue()
+                state.anchoredDraggableState.anchors.hasAnchorFor(ModalBottomSheetValue.Expanded)
+            )
+            .isTrue()
 
         amountOfItems = 0 // When the sheet height is 0, we should only have a hidden anchor
         rule.waitForIdle()
@@ -1047,7 +837,7 @@
             scope = rememberCoroutineScope()
             ModalBottomSheetLayout(
                 sheetState = state,
-                sheetContent = { },
+                sheetContent = {},
                 content = { Box(Modifier.fillMaxSize()) }
             )
         }
@@ -1056,8 +846,7 @@
         scope.launch { state.expand() }
         rule.waitForIdle()
 
-        assertThat(state.currentValue)
-            .isEqualTo(ModalBottomSheetValue.Hidden)
+        assertThat(state.currentValue).isEqualTo(ModalBottomSheetValue.Hidden)
     }
 
     @Test
@@ -1068,8 +857,9 @@
         var compositionCount = 0
         restorationTester.setContent {
             compositionCount++
-            val initialValue = if (tallSheet) ModalBottomSheetValue.HalfExpanded else
-                ModalBottomSheetValue.Expanded
+            val initialValue =
+                if (tallSheet) ModalBottomSheetValue.HalfExpanded
+                else ModalBottomSheetValue.Expanded
             state = rememberModalBottomSheetState(initialValue)
             ModalBottomSheetLayout(
                 sheetState = state,
@@ -1102,9 +892,7 @@
             state = rememberModalBottomSheetState(ModalBottomSheetValue.Expanded)
             ModalBottomSheetLayout(
                 sheetState = state,
-                sheetContent = {
-                    Box(Modifier.height(size))
-                },
+                sheetContent = { Box(Modifier.height(size)) },
                 content = { Box(Modifier.fillMaxSize()) },
             )
         }
@@ -1129,45 +917,39 @@
         rule.setContent {
             ModalBottomSheetLayout(
                 sheetState = rememberModalBottomSheetState(ModalBottomSheetValue.Expanded),
-                modifier = Modifier
-                    .testTag(layoutTag)
-                    .requiredSize(simulatedRootWidth, simulatedRootHeight),
-                sheetContent = {
-                    Box(
-                        Modifier
-                            .testTag(sheetTag)
-                            .fillMaxHeight(0.4f)
-                    )
-                },
+                modifier =
+                    Modifier.testTag(layoutTag)
+                        .requiredSize(simulatedRootWidth, simulatedRootHeight),
+                sheetContent = { Box(Modifier.testTag(sheetTag).fillMaxHeight(0.4f)) },
                 content = { Box(Modifier.fillMaxSize()) }
             )
         }
 
-        rule.onNodeWithTag(layoutTag)
-            .assertWidthIsEqualTo(simulatedRootWidth)
+        rule.onNodeWithTag(layoutTag).assertWidthIsEqualTo(simulatedRootWidth)
 
         val maxSheetWidth = 640.dp
         val expectedSheetWidth = maxSheetWidth.coerceAtMost(simulatedRootWidth)
         // Our sheet should be max 640 dp but fill the width if the container is less wide
-        val expectedSheetLeft = if (simulatedRootWidth <= expectedSheetWidth) {
-            0.dp
-        } else {
-            (simulatedRootWidth - expectedSheetWidth) / 2
-        }
+        val expectedSheetLeft =
+            if (simulatedRootWidth <= expectedSheetWidth) {
+                0.dp
+            } else {
+                (simulatedRootWidth - expectedSheetWidth) / 2
+            }
 
         // We are requiring a size on the layout that might be wider than the root width
         // In that case, our "actual" left might be outside the rule's bounds
-        val simulatedLeft = with(rule.density) {
-            rule.onNodeWithTag(layoutTag).fetchSemanticsNode().positionInRoot.x.toDp()
-        }
+        val simulatedLeft =
+            with(rule.density) {
+                rule.onNodeWithTag(layoutTag).fetchSemanticsNode().positionInRoot.x.toDp()
+            }
 
         val simulatedExpectedLeft = simulatedLeft + expectedSheetLeft
 
-        rule.onNodeWithTag(sheetTag)
+        rule
+            .onNodeWithTag(sheetTag)
             .onParent()
-            .assertLeftPositionInRootIsEqualTo(
-                expectedLeft = simulatedExpectedLeft
-            )
+            .assertLeftPositionInRootIsEqualTo(expectedLeft = simulatedExpectedLeft)
             .assertWidthIsEqualTo(expectedSheetWidth)
     }
 
@@ -1180,45 +962,39 @@
         rule.setContent {
             ModalBottomSheetLayout(
                 sheetState = rememberModalBottomSheetState(ModalBottomSheetValue.Expanded),
-                modifier = Modifier
-                    .testTag(layoutTag)
-                    .requiredSize(simulatedRootWidth, simulatedRootHeight),
-                sheetContent = {
-                    Box(
-                        Modifier
-                            .testTag(sheetTag)
-                            .fillMaxHeight(0.4f)
-                    )
-                },
+                modifier =
+                    Modifier.testTag(layoutTag)
+                        .requiredSize(simulatedRootWidth, simulatedRootHeight),
+                sheetContent = { Box(Modifier.testTag(sheetTag).fillMaxHeight(0.4f)) },
                 content = { Box(Modifier.fillMaxSize()) }
             )
         }
 
-        rule.onNodeWithTag(layoutTag)
-            .assertWidthIsEqualTo(simulatedRootWidth)
+        rule.onNodeWithTag(layoutTag).assertWidthIsEqualTo(simulatedRootWidth)
 
         val maxSheetWidth = 640.dp
         val expectedSheetWidth = maxSheetWidth.coerceAtMost(simulatedRootWidth)
         // Our sheet should be max 640 dp but fill the width if the container is less wide
-        val expectedSheetLeft = if (simulatedRootWidth <= expectedSheetWidth) {
-            0.dp
-        } else {
-            (simulatedRootWidth - expectedSheetWidth) / 2
-        }
+        val expectedSheetLeft =
+            if (simulatedRootWidth <= expectedSheetWidth) {
+                0.dp
+            } else {
+                (simulatedRootWidth - expectedSheetWidth) / 2
+            }
 
         // We are requiring a size on the layout that might be wider than the root width
         // In that case, our "actual" left might be outside the rule's bounds
-        val simulatedLeft = with(rule.density) {
-            rule.onNodeWithTag(layoutTag).fetchSemanticsNode().positionInRoot.x.toDp()
-        }
+        val simulatedLeft =
+            with(rule.density) {
+                rule.onNodeWithTag(layoutTag).fetchSemanticsNode().positionInRoot.x.toDp()
+            }
 
         val simulatedExpectedLeft = simulatedLeft + expectedSheetLeft
 
-        rule.onNodeWithTag(sheetTag)
+        rule
+            .onNodeWithTag(sheetTag)
             .onParent()
-            .assertLeftPositionInRootIsEqualTo(
-                expectedLeft = simulatedExpectedLeft
-            )
+            .assertLeftPositionInRootIsEqualTo(expectedLeft = simulatedExpectedLeft)
             .assertWidthIsEqualTo(expectedSheetWidth)
     }
 
@@ -1276,14 +1052,16 @@
 
         assertThat(sheetState.currentValue).isEqualTo(ModalBottomSheetValue.Hidden)
         assertThat(
-            sheetState.anchoredDraggableState.anchors
-                .hasAnchorFor(ModalBottomSheetValue.HalfExpanded)
-        )
+                sheetState.anchoredDraggableState.anchors.hasAnchorFor(
+                    ModalBottomSheetValue.HalfExpanded
+                )
+            )
             .isFalse()
         assertThat(
-            sheetState.anchoredDraggableState.anchors
-                .hasAnchorFor(ModalBottomSheetValue.Expanded)
-        )
+                sheetState.anchoredDraggableState.anchors.hasAnchorFor(
+                    ModalBottomSheetValue.Expanded
+                )
+            )
             .isFalse()
 
         scope.launch { sheetState.show() }
@@ -1310,9 +1088,7 @@
         stateRestorationTester.setContent {
             ModalBottomSheetLayout(
                 sheetState = sheetState,
-                sheetContent = {
-                    Box(Modifier.fillMaxHeight(if (tallSheetContent) 1f else 0.4f))
-                },
+                sheetContent = { Box(Modifier.fillMaxHeight(if (tallSheetContent) 1f else 0.4f)) },
                 content = { Box(Modifier.fillMaxSize()) }
             )
         }
@@ -1353,19 +1129,16 @@
         scope.launch { state.show() }
         rule.waitForIdle()
 
-        assertThat(state.currentValue)
-            .isEqualTo(ModalBottomSheetValue.HalfExpanded)
+        assertThat(state.currentValue).isEqualTo(ModalBottomSheetValue.HalfExpanded)
 
         scope.launch { state.show() }
         rule.waitForIdle()
-        assertThat(state.currentValue)
-            .isEqualTo(ModalBottomSheetValue.Expanded)
+        assertThat(state.currentValue).isEqualTo(ModalBottomSheetValue.Expanded)
 
         // Call show again to verify that we stay at Expanded
         scope.launch { state.show() }
         rule.waitForIdle()
-        assertThat(state.currentValue)
-            .isEqualTo(ModalBottomSheetValue.Expanded)
+        assertThat(state.currentValue).isEqualTo(ModalBottomSheetValue.Expanded)
     }
 
     @Test
@@ -1376,10 +1149,11 @@
         val animationLengthMillis = 192
         val amountOfFramesForAnimation = animationLengthMillis / 16
         rule.setContent {
-            state = rememberModalBottomSheetState(
-                ModalBottomSheetValue.Hidden,
-                tween(animationLengthMillis, easing = LinearEasing)
-            )
+            state =
+                rememberModalBottomSheetState(
+                    ModalBottomSheetValue.Hidden,
+                    tween(animationLengthMillis, easing = LinearEasing)
+                )
             scope = rememberCoroutineScope()
             ModalBottomSheetLayout(
                 sheetState = state,
@@ -1390,21 +1164,29 @@
 
         assertThat(state.currentValue).isEqualTo(ModalBottomSheetValue.Hidden)
         assertThat(state.targetValue).isEqualTo(ModalBottomSheetValue.Hidden)
-        assertThat(state.progress(
-            from = ModalBottomSheetValue.Hidden, to = ModalBottomSheetValue.Expanded
-        )).isEqualTo(0f)
+        assertThat(
+                state.progress(
+                    from = ModalBottomSheetValue.Hidden,
+                    to = ModalBottomSheetValue.Expanded
+                )
+            )
+            .isEqualTo(0f)
 
         scope.launch { state.show() }
         rule.mainClock.advanceTimeByFrame() // Start dispatching and running the animation
 
         repeat(amountOfFramesForAnimation) { frame ->
             val frameFraction = (frame / amountOfFramesForAnimation.toFloat())
-            val hiddenToHalfExpandedProgress = state.progress(
-                from = ModalBottomSheetValue.Hidden, to = ModalBottomSheetValue.HalfExpanded
-            )
-            val hiddenToExpandedProgress = state.progress(
-                from = ModalBottomSheetValue.Hidden, to = ModalBottomSheetValue.Expanded
-            )
+            val hiddenToHalfExpandedProgress =
+                state.progress(
+                    from = ModalBottomSheetValue.Hidden,
+                    to = ModalBottomSheetValue.HalfExpanded
+                )
+            val hiddenToExpandedProgress =
+                state.progress(
+                    from = ModalBottomSheetValue.Hidden,
+                    to = ModalBottomSheetValue.Expanded
+                )
             assertThat(hiddenToHalfExpandedProgress).isWithin(0.001f).of(frameFraction)
             assertThat(hiddenToExpandedProgress).isWithin(0.001f).of(frameFraction / 2f)
             rule.mainClock.advanceTimeByFrame()
@@ -1419,12 +1201,16 @@
 
         repeat(amountOfFramesForAnimation) { frame ->
             val frameFraction = (frame / amountOfFramesForAnimation.toFloat())
-            val hiddenToHalfExpandedProgress = state.progress(
-                from = ModalBottomSheetValue.Hidden, to = ModalBottomSheetValue.HalfExpanded
-            )
-            val hiddenToExpandedProgress = state.progress(
-                from = ModalBottomSheetValue.Hidden, to = ModalBottomSheetValue.Expanded
-            )
+            val hiddenToHalfExpandedProgress =
+                state.progress(
+                    from = ModalBottomSheetValue.Hidden,
+                    to = ModalBottomSheetValue.HalfExpanded
+                )
+            val hiddenToExpandedProgress =
+                state.progress(
+                    from = ModalBottomSheetValue.Hidden,
+                    to = ModalBottomSheetValue.Expanded
+                )
             assertThat(hiddenToHalfExpandedProgress).isWithin(0.001f).of(1 - frameFraction)
             // We start hiding from HalfExpanded, which in this test is situated at 50%, so we
             // calculate the progress from 0.5
diff --git a/compose/material/material/src/androidInstrumentedTest/kotlin/androidx/compose/material/NavigationRailScreenshotTest.kt b/compose/material/material/src/androidInstrumentedTest/kotlin/androidx/compose/material/NavigationRailScreenshotTest.kt
index a503594..7e5221a 100644
--- a/compose/material/material/src/androidInstrumentedTest/kotlin/androidx/compose/material/NavigationRailScreenshotTest.kt
+++ b/compose/material/material/src/androidInstrumentedTest/kotlin/androidx/compose/material/NavigationRailScreenshotTest.kt
@@ -50,11 +50,9 @@
 @RunWith(AndroidJUnit4::class)
 @SdkSuppress(minSdkVersion = Build.VERSION_CODES.O)
 class NavigationRailScreenshotTest {
-    @get:Rule
-    val composeTestRule = createComposeRule()
+    @get:Rule val composeTestRule = createComposeRule()
 
-    @get:Rule
-    val screenshotRule = AndroidXScreenshotTestRule(GOLDEN_MATERIAL)
+    @get:Rule val screenshotRule = AndroidXScreenshotTestRule(GOLDEN_MATERIAL)
 
     @Test
     fun lightTheme_defaultColors() {
@@ -186,8 +184,7 @@
      * Asserts that the NavigationRail matches the screenshot with identifier [goldenIdentifier].
      *
      * @param scope [CoroutineScope] used to interact with [MutableInteractionSource]
-     * @param interactionSource the [MutableInteractionSource] used for the first
-     * NavigationRailItem
+     * @param interactionSource the [MutableInteractionSource] used for the first NavigationRailItem
      * @param interaction the [Interaction] to assert for, or `null` if no [Interaction].
      * @param goldenIdentifier the identifier for the corresponding screenshot
      */
@@ -200,9 +197,7 @@
         if (interaction != null) {
             composeTestRule.runOnIdle {
                 // Start ripple
-                scope.launch {
-                    interactionSource.emit(interaction)
-                }
+                scope.launch { interactionSource.emit(interaction) }
             }
 
             composeTestRule.waitForIdle()
@@ -213,7 +208,8 @@
         }
 
         // Capture and compare screenshots
-        composeTestRule.onNodeWithTag(Tag)
+        composeTestRule
+            .onNodeWithTag(Tag)
             .captureToImage()
             .assertAgainstGolden(screenshotRule, goldenIdentifier)
     }
@@ -224,7 +220,7 @@
  * [NavigationRailItem] is selected, and the rest are not.
  *
  * @param interactionSource the [MutableInteractionSource] for the first [NavigationRailItem], to
- * control its visual state.
+ *   control its visual state.
  * @param withHeaderFab when true, shows a [FloatingActionButton] as the [NavigationRail] header.
  */
 @Composable
@@ -234,11 +230,12 @@
 ) {
     Box(Modifier.semantics(mergeDescendants = true) {}.testTag(Tag)) {
         NavigationRail(
-            header = if (withHeaderFab) {
-                { HeaderFab() }
-            } else {
-                null
-            }
+            header =
+                if (withHeaderFab) {
+                    { HeaderFab() }
+                } else {
+                    null
+                }
         ) {
             NavigationRailItem(
                 icon = { Icon(Icons.Filled.Favorite, null) },
@@ -270,7 +267,7 @@
 @Composable
 private fun HeaderFab() {
     FloatingActionButton(
-        onClick = { },
+        onClick = {},
     ) {
         Icon(Icons.Filled.Edit, contentDescription = "Edit")
     }
diff --git a/compose/material/material/src/androidInstrumentedTest/kotlin/androidx/compose/material/NavigationRailTest.kt b/compose/material/material/src/androidInstrumentedTest/kotlin/androidx/compose/material/NavigationRailTest.kt
index 92b1620..21e6358 100644
--- a/compose/material/material/src/androidInstrumentedTest/kotlin/androidx/compose/material/NavigationRailTest.kt
+++ b/compose/material/material/src/androidInstrumentedTest/kotlin/androidx/compose/material/NavigationRailTest.kt
@@ -63,12 +63,9 @@
 
 @LargeTest
 @RunWith(AndroidJUnit4::class)
-/**
- * Test for [NavigationRail] and [NavigationRailItem].
- */
+/** Test for [NavigationRail] and [NavigationRailItem]. */
 class NavigationRailTest {
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
     private val NavigationRailPadding = 8.dp
 
@@ -78,25 +75,23 @@
             NavigationRail {
                 NavigationRailItem(
                     modifier = Modifier.testTag("item"),
-                    icon = {
-                        Icon(Icons.Filled.Favorite, null)
-                    },
-                    label = {
-                        Text("ItemText")
-                    },
+                    icon = { Icon(Icons.Filled.Favorite, null) },
+                    label = { Text("ItemText") },
                     selected = true,
                     onClick = {}
                 )
             }
         }
 
-        rule.onNodeWithTag("item")
+        rule
+            .onNodeWithTag("item")
             .assert(SemanticsMatcher.expectValue(SemanticsProperties.Role, Role.Tab))
             .assertIsSelected()
             .assertIsEnabled()
             .assertHasClickAction()
 
-        rule.onNodeWithTag("item")
+        rule
+            .onNodeWithTag("item")
             .onParent()
             .assert(SemanticsMatcher.keyIsDefined(SemanticsProperties.SelectableGroup))
     }
@@ -108,19 +103,16 @@
                 NavigationRailItem(
                     enabled = false,
                     modifier = Modifier.testTag("item"),
-                    icon = {
-                        Icon(Icons.Filled.Favorite, null)
-                    },
-                    label = {
-                        Text("ItemText")
-                    },
+                    icon = { Icon(Icons.Filled.Favorite, null) },
+                    label = { Text("ItemText") },
                     selected = true,
                     onClick = {}
                 )
             }
         }
 
-        rule.onNodeWithTag("item")
+        rule
+            .onNodeWithTag("item")
             .assert(SemanticsMatcher.expectValue(SemanticsProperties.Role, Role.Tab))
             .assertIsSelected()
             .assertIsNotEnabled()
@@ -130,17 +122,17 @@
     @Test
     fun navigationRail_width() {
         val defaultWidth = 72.dp
-        rule.setMaterialContentForSizeAssertions {
-            NavigationRailSample()
-        }.assertWidthIsEqualTo(defaultWidth)
+        rule
+            .setMaterialContentForSizeAssertions { NavigationRailSample() }
+            .assertWidthIsEqualTo(defaultWidth)
     }
 
     @Test
     fun navigationRail_compactWidth() {
         val compactWidth = 56.dp
-        rule.setMaterialContentForSizeAssertions {
-            CompactNavigationRailSample()
-        }.assertWidthIsEqualTo(compactWidth)
+        rule
+            .setMaterialContentForSizeAssertions { CompactNavigationRailSample() }
+            .assertWidthIsEqualTo(compactWidth)
     }
 
     @Test
@@ -155,9 +147,10 @@
                             label = { Text("Item $index") },
                             selected = index == 0,
                             onClick = {},
-                            modifier = Modifier.onGloballyPositioned { coords ->
-                                itemCoords[index] = coords
-                            }
+                            modifier =
+                                Modifier.onGloballyPositioned { coords ->
+                                    itemCoords[index] = coords
+                                }
                         )
                     }
                 }
@@ -174,18 +167,17 @@
         val wi = WindowInsets(fakeInset, fakeInset, fakeInset, fakeInset)
         rule.setMaterialContent {
             Box {
-                NavigationRail(
-                    windowInsets = wi
-                ) {
+                NavigationRail(windowInsets = wi) {
                     repeat(4) { index ->
                         NavigationRailItem(
                             icon = { Icon(Icons.Filled.Favorite, null) },
                             label = { Text("Item $index") },
                             selected = index == 0,
                             onClick = {},
-                            modifier = Modifier.onGloballyPositioned { coords ->
-                                itemCoords[index] = coords
-                            }
+                            modifier =
+                                Modifier.onGloballyPositioned { coords ->
+                                    itemCoords[index] = coords
+                                }
                         )
                     }
                 }
@@ -207,9 +199,10 @@
                             icon = { Icon(Icons.Filled.Favorite, null) },
                             selected = index == 0,
                             onClick = {},
-                            modifier = Modifier.onGloballyPositioned { coords ->
-                                itemCoords[index] = coords
-                            }
+                            modifier =
+                                Modifier.onGloballyPositioned { coords ->
+                                    itemCoords[index] = coords
+                                }
                         )
                     }
                 }
@@ -231,9 +224,8 @@
                             label = { Text("Item $index") },
                             selected = index == 0,
                             onClick = {},
-                            modifier = Modifier
-                                .width(96.dp)
-                                .onGloballyPositioned { coords ->
+                            modifier =
+                                Modifier.width(96.dp).onGloballyPositioned { coords ->
                                     itemCoords[index] = coords
                                 }
                         )
@@ -259,9 +251,8 @@
                             label = { Text("Item $index") },
                             selected = index == 0,
                             onClick = {},
-                            modifier = Modifier
-                                .width(96.dp)
-                                .onGloballyPositioned { coords ->
+                            modifier =
+                                Modifier.width(96.dp).onGloballyPositioned { coords ->
                                     itemCoords[index] = coords
                                 }
                         )
@@ -291,11 +282,10 @@
                 Truth.assertThat(coord.size.height).isEqualTo(expectedItemHeightPx)
                 Truth.assertThat(coord.positionInWindow().y)
                     .isEqualTo(
-                        (expectedItemHeightPx * index +
-                            navigationRailPadding + inset.roundToPx()).toFloat()
+                        (expectedItemHeightPx * index + navigationRailPadding + inset.roundToPx())
+                            .toFloat()
                     )
-                Truth.assertThat(coord.positionInWindow().x)
-                    .isEqualTo(inset.roundToPx().toFloat())
+                Truth.assertThat(coord.positionInWindow().x).isEqualTo(inset.roundToPx().toFloat())
             }
         }
     }
@@ -307,12 +297,8 @@
                 NavigationRail {
                     NavigationRailItem(
                         modifier = Modifier.testTag("item"),
-                        icon = {
-                            Icon(Icons.Filled.Favorite, null, Modifier.testTag("icon"))
-                        },
-                        label = {
-                            Text("ItemText")
-                        },
+                        icon = { Icon(Icons.Filled.Favorite, null, Modifier.testTag("icon")) },
+                        label = { Text("ItemText") },
                         selected = true,
                         onClick = {}
                     )
@@ -321,8 +307,8 @@
         }
 
         val itemBounds = rule.onNodeWithTag("item").getUnclippedBoundsInRoot()
-        val iconBounds = rule.onNodeWithTag("icon", useUnmergedTree = true)
-            .getUnclippedBoundsInRoot()
+        val iconBounds =
+            rule.onNodeWithTag("icon", useUnmergedTree = true).getUnclippedBoundsInRoot()
         val textBounds = rule.onNodeWithText("ItemText").getUnclippedBoundsInRoot()
 
         // The space between the text label's baseline and the bottom of the container.
@@ -337,7 +323,8 @@
         // Text baseline should be 16.dp from the bottom of the item
         absoluteTextBaseline.assertIsEqualTo(itemBottom - textBaseline)
 
-        rule.onNodeWithTag("icon", useUnmergedTree = true)
+        rule
+            .onNodeWithTag("icon", useUnmergedTree = true)
             // The icon should be centered in the item
             .assertLeftPositionInRootIsEqualTo((itemBounds.width - iconBounds.width) / 2)
             // The top of the icon is 14.dp from the top of the item's container +
@@ -352,12 +339,8 @@
                 NavigationRail {
                     NavigationRailItem(
                         modifier = Modifier.testTag("item"),
-                        icon = {
-                            Icon(Icons.Filled.Favorite, null, Modifier.testTag("icon"))
-                        },
-                        label = {
-                            Text("ItemText")
-                        },
+                        icon = { Icon(Icons.Filled.Favorite, null, Modifier.testTag("icon")) },
+                        label = { Text("ItemText") },
                         selected = false,
                         onClick = {},
                         alwaysShowLabel = false
@@ -371,15 +354,15 @@
         rule.onNodeWithText("ItemText", useUnmergedTree = true).assertIsNotDisplayed()
 
         val itemBounds = rule.onNodeWithTag("item").getUnclippedBoundsInRoot()
-        val iconBounds = rule.onNodeWithTag("icon", useUnmergedTree = true)
-            .getUnclippedBoundsInRoot()
+        val iconBounds =
+            rule.onNodeWithTag("icon", useUnmergedTree = true).getUnclippedBoundsInRoot()
 
-        rule.onNodeWithTag("icon", useUnmergedTree = true)
+        rule
+            .onNodeWithTag("icon", useUnmergedTree = true)
             .assertLeftPositionInRootIsEqualTo((itemBounds.width - iconBounds.width) / 2)
             // The item's container has an [NavigationRailPadding] top-padding (8dp)
             .assertTopPositionInRootIsEqualTo(
-                NavigationRailPadding +
-                    (itemBounds.height - iconBounds.height) / 2
+                NavigationRailPadding + (itemBounds.height - iconBounds.height) / 2
             )
     }
 
@@ -390,9 +373,7 @@
                 NavigationRail {
                     NavigationRailItem(
                         modifier = Modifier.testTag("item"),
-                        icon = {
-                            Icon(Icons.Filled.Favorite, null, Modifier.testTag("icon"))
-                        },
+                        icon = { Icon(Icons.Filled.Favorite, null, Modifier.testTag("icon")) },
                         label = null,
                         selected = false,
                         onClick = {}
@@ -402,27 +383,26 @@
         }
 
         val itemBounds = rule.onNodeWithTag("item").getUnclippedBoundsInRoot()
-        val iconBounds = rule.onNodeWithTag("icon", useUnmergedTree = true)
-            .getUnclippedBoundsInRoot()
+        val iconBounds =
+            rule.onNodeWithTag("icon", useUnmergedTree = true).getUnclippedBoundsInRoot()
 
         // The icon should be centered in the item, as there is no text placeable provided
-        rule.onNodeWithTag("icon", useUnmergedTree = true)
+        rule
+            .onNodeWithTag("icon", useUnmergedTree = true)
             .assertLeftPositionInRootIsEqualTo((itemBounds.width - iconBounds.width) / 2)
             // The item's container has an [NavigationRailPadding] top-padding (8dp)
             .assertTopPositionInRootIsEqualTo(
-                NavigationRailPadding +
-                    (itemBounds.height - iconBounds.height) / 2
+                NavigationRailPadding + (itemBounds.height - iconBounds.height) / 2
             )
     }
 
     @Test
     fun navigationRail_selectNewItem() {
-        rule.setMaterialContent {
-            NavigationRailSample()
-        }
+        rule.setMaterialContent { NavigationRailSample() }
 
         // Find all items and ensure there are 3
-        rule.onAllNodes(isSelectable())
+        rule
+            .onAllNodes(isSelectable())
             .assertCountEquals(3)
             // Ensure semantics match for selected state of the items
             .apply {
@@ -431,9 +411,7 @@
                 get(2).assertIsNotSelected()
             }
             // Click the last item
-            .apply {
-                get(2).performClick()
-            }
+            .apply { get(2).performClick() }
             .apply {
                 get(0).assertIsNotSelected()
                 get(1).assertIsNotSelected()
@@ -449,23 +427,16 @@
                 NavigationRailItem(
                     enabled = false,
                     modifier = Modifier.testTag("item"),
-                    icon = {
-                        Icon(Icons.Filled.Favorite, null)
-                    },
-                    label = {
-                        Text("ItemText")
-                    },
+                    icon = { Icon(Icons.Filled.Favorite, null) },
+                    label = { Text("ItemText") },
                     selected = true,
                     onClick = { clicks++ }
                 )
             }
         }
 
-        rule.onNodeWithTag("item")
-            .performClick()
+        rule.onNodeWithTag("item").performClick()
 
-        rule.runOnIdle {
-            Truth.assertThat(clicks).isEqualTo(0)
-        }
+        rule.runOnIdle { Truth.assertThat(clicks).isEqualTo(0) }
     }
 }
diff --git a/compose/material/material/src/androidInstrumentedTest/kotlin/androidx/compose/material/ObservableThemeTest.kt b/compose/material/material/src/androidInstrumentedTest/kotlin/androidx/compose/material/ObservableThemeTest.kt
index c718ecb..8b95a4d 100644
--- a/compose/material/material/src/androidInstrumentedTest/kotlin/androidx/compose/material/ObservableThemeTest.kt
+++ b/compose/material/material/src/androidInstrumentedTest/kotlin/androidx/compose/material/ObservableThemeTest.kt
@@ -49,55 +49,50 @@
 @MediumTest
 @RunWith(AndroidJUnit4::class)
 class ObservableThemeTest {
-    @get:Rule
-    val composeTestRule = createAndroidComposeRule<ComponentActivity>()
+    @get:Rule val composeTestRule = createAndroidComposeRule<ComponentActivity>()
 
     @Test
     fun testObservableTheme() {
         val testCase = ObservableThemeTestCase()
-        composeTestRule
-            .forGivenTestCase(testCase)
-            .performTestWithEventsControl {
-                doFrame()
-                assertNoPendingChanges()
+        composeTestRule.forGivenTestCase(testCase).performTestWithEventsControl {
+            doFrame()
+            assertNoPendingChanges()
 
-                assertEquals(2, testCase.primaryCompositions)
-                assertEquals(1, testCase.secondaryCompositions)
+            assertEquals(2, testCase.primaryCompositions)
+            assertEquals(1, testCase.secondaryCompositions)
 
-                doFrame()
-                assertNoPendingChanges()
+            doFrame()
+            assertNoPendingChanges()
 
-                testCase.toggleState()
+            testCase.toggleState()
 
-                doFramesUntilNoChangesPending(maxAmountOfFrames = 1)
+            doFramesUntilNoChangesPending(maxAmountOfFrames = 1)
 
-                assertEquals(4, testCase.primaryCompositions)
-                assertEquals(1, testCase.secondaryCompositions)
-            }
+            assertEquals(4, testCase.primaryCompositions)
+            assertEquals(1, testCase.secondaryCompositions)
+        }
     }
 
     @Test
     fun testImmutableTheme() {
         val testCase = ImmutableThemeTestCase()
-        composeTestRule
-            .forGivenTestCase(testCase)
-            .performTestWithEventsControl {
-                doFrame()
-                assertNoPendingChanges()
+        composeTestRule.forGivenTestCase(testCase).performTestWithEventsControl {
+            doFrame()
+            assertNoPendingChanges()
 
-                assertEquals(2, testCase.primaryCompositions)
-                assertEquals(1, testCase.secondaryCompositions)
+            assertEquals(2, testCase.primaryCompositions)
+            assertEquals(1, testCase.secondaryCompositions)
 
-                doFrame()
-                assertNoPendingChanges()
+            doFrame()
+            assertNoPendingChanges()
 
-                testCase.toggleState()
+            testCase.toggleState()
 
-                doFramesUntilNoChangesPending(maxAmountOfFrames = 1)
+            doFramesUntilNoChangesPending(maxAmountOfFrames = 1)
 
-                assertEquals(4, testCase.primaryCompositions)
-                assertEquals(2, testCase.secondaryCompositions)
-            }
+            assertEquals(4, testCase.primaryCompositions)
+            assertEquals(2, testCase.secondaryCompositions)
+        }
     }
 }
 
@@ -118,16 +113,16 @@
     }
 
     override fun toggleState() {
-        with(primaryState!!) {
-            value = if (value == Color.Blue) Color.Red else Color.Blue
-        }
+        with(primaryState!!) { value = if (value == Color.Blue) Color.Red else Color.Blue }
     }
 
-    @Composable
-    internal abstract fun createTheme(primary: Color): TestTheme
+    @Composable internal abstract fun createTheme(primary: Color): TestTheme
 
-    val primaryCompositions get() = primaryTracker.compositions
-    val secondaryCompositions get() = secondaryTracker.compositions
+    val primaryCompositions
+        get() = primaryTracker.compositions
+
+    val secondaryCompositions
+        get() = secondaryTracker.compositions
 }
 
 private interface TestTheme {
@@ -136,8 +131,8 @@
 }
 
 /**
- * Test case using an observable [TestTheme] that will be memoized and mutated when
- * incoming values change, causing only functions consuming the specific changed color to recompose.
+ * Test case using an observable [TestTheme] that will be memoized and mutated when incoming values
+ * change, causing only functions consuming the specific changed color to recompose.
  */
 private class ObservableThemeTestCase : ThemeTestCase() {
     @Composable
@@ -200,9 +195,7 @@
  * Immutable as we want to ensure that we always skip recomposition unless the CompositionLocal
  * value inside the function changes.
  */
-@Immutable
-private class CompositionTracker(var compositions: Int = 0)
+@Immutable private class CompositionTracker(var compositions: Int = 0)
 
-private val LocalTestTheme = staticCompositionLocalOf<TestTheme> {
-    error("CompositionLocal LocalTestThemem not present")
-}
+private val LocalTestTheme =
+    staticCompositionLocalOf<TestTheme> { error("CompositionLocal LocalTestThemem not present") }
diff --git a/compose/material/material/src/androidInstrumentedTest/kotlin/androidx/compose/material/ProgressIndicatorTest.kt b/compose/material/material/src/androidInstrumentedTest/kotlin/androidx/compose/material/ProgressIndicatorTest.kt
index dba7db3..cb7c3f5 100644
--- a/compose/material/material/src/androidInstrumentedTest/kotlin/androidx/compose/material/ProgressIndicatorTest.kt
+++ b/compose/material/material/src/androidInstrumentedTest/kotlin/androidx/compose/material/ProgressIndicatorTest.kt
@@ -55,8 +55,7 @@
     private val ExpectedLinearWidth = 240.dp
     private val ExpectedLinearHeight = 4.dp
 
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
     @Test
     fun determinateLinearProgressIndicator_Progress() {
@@ -67,15 +66,15 @@
             LinearProgressIndicator(modifier = Modifier.testTag(tag), progress = progress.value)
         }
 
-        rule.onNodeWithTag(tag)
+        rule
+            .onNodeWithTag(tag)
             .assertIsDisplayed()
             .assertRangeInfoEquals(ProgressBarRangeInfo(0f, 0f..1f))
 
-        rule.runOnUiThread {
-            progress.value = 0.5f
-        }
+        rule.runOnUiThread { progress.value = 0.5f }
 
-        rule.onNodeWithTag(tag)
+        rule
+            .onNodeWithTag(tag)
             .assertIsDisplayed()
             .assertRangeInfoEquals(ProgressBarRangeInfo(0.5f, 0f..1f))
     }
@@ -89,15 +88,15 @@
             LinearProgressIndicator(modifier = Modifier.testTag(tag), progress = progress.value)
         }
 
-        rule.onNodeWithTag(tag)
+        rule
+            .onNodeWithTag(tag)
             .assertIsDisplayed()
             .assertRangeInfoEquals(ProgressBarRangeInfo(0f, 0f..1f))
 
-        rule.runOnUiThread {
-            progress.value = 1.5f
-        }
+        rule.runOnUiThread { progress.value = 1.5f }
 
-        rule.onNodeWithTag(tag)
+        rule
+            .onNodeWithTag(tag)
             .assertIsDisplayed()
             .assertRangeInfoEquals(ProgressBarRangeInfo(1f, 0f..1f))
     }
@@ -105,9 +104,7 @@
     @Test
     fun determinateLinearProgressIndicator_Size() {
         rule
-            .setMaterialContentForSizeAssertions {
-                LinearProgressIndicator(progress = 0f)
-            }
+            .setMaterialContentForSizeAssertions { LinearProgressIndicator(progress = 0f) }
             .assertWidthIsEqualTo(ExpectedLinearWidth)
             .assertHeightIsEqualTo(ExpectedLinearHeight)
     }
@@ -117,23 +114,17 @@
         val tag = "linear"
 
         rule.mainClock.autoAdvance = false
-        rule.setMaterialContent {
-            LinearProgressIndicator(modifier = Modifier.testTag(tag))
-        }
+        rule.setMaterialContent { LinearProgressIndicator(modifier = Modifier.testTag(tag)) }
 
         rule.mainClock.advanceTimeByFrame() // Kick off the animation
 
-        rule.onNodeWithTag(tag)
-            .assertRangeInfoEquals(ProgressBarRangeInfo.Indeterminate)
+        rule.onNodeWithTag(tag).assertRangeInfoEquals(ProgressBarRangeInfo.Indeterminate)
     }
 
     @Test
     fun indeterminateLinearProgressIndicator_Size() {
         rule.mainClock.autoAdvance = false
-        val contentToTest = rule
-            .setMaterialContentForSizeAssertions {
-                LinearProgressIndicator()
-            }
+        val contentToTest = rule.setMaterialContentForSizeAssertions { LinearProgressIndicator() }
 
         rule.mainClock.advanceTimeByFrame() // Kick off the animation
 
@@ -148,21 +139,18 @@
         val progress = mutableStateOf(0f)
 
         rule.setMaterialContent {
-            CircularProgressIndicator(
-                modifier = Modifier.testTag(tag),
-                progress = progress.value
-            )
+            CircularProgressIndicator(modifier = Modifier.testTag(tag), progress = progress.value)
         }
 
-        rule.onNodeWithTag(tag)
+        rule
+            .onNodeWithTag(tag)
             .assertIsDisplayed()
             .assertRangeInfoEquals(ProgressBarRangeInfo(0f, 0f..1f))
 
-        rule.runOnUiThread {
-            progress.value = 0.5f
-        }
+        rule.runOnUiThread { progress.value = 0.5f }
 
-        rule.onNodeWithTag(tag)
+        rule
+            .onNodeWithTag(tag)
             .assertIsDisplayed()
             .assertRangeInfoEquals(ProgressBarRangeInfo(0.5f, 0f..1f))
     }
@@ -173,21 +161,18 @@
         val progress = mutableStateOf(-1f)
 
         rule.setMaterialContent {
-            CircularProgressIndicator(
-                modifier = Modifier.testTag(tag),
-                progress = progress.value
-            )
+            CircularProgressIndicator(modifier = Modifier.testTag(tag), progress = progress.value)
         }
 
-        rule.onNodeWithTag(tag)
+        rule
+            .onNodeWithTag(tag)
             .assertIsDisplayed()
             .assertRangeInfoEquals(ProgressBarRangeInfo(0f, 0f..1f))
 
-        rule.runOnUiThread {
-            progress.value = 1.5f
-        }
+        rule.runOnUiThread { progress.value = 1.5f }
 
-        rule.onNodeWithTag(tag)
+        rule
+            .onNodeWithTag(tag)
             .assertIsDisplayed()
             .assertRangeInfoEquals(ProgressBarRangeInfo(1f, 0f..1f))
     }
@@ -195,9 +180,7 @@
     @Test
     fun determinateCircularProgressIndicator_Size() {
         rule
-            .setMaterialContentForSizeAssertions {
-                CircularProgressIndicator(progress = 0f)
-            }
+            .setMaterialContentForSizeAssertions { CircularProgressIndicator(progress = 0f) }
             .assertIsSquareWithSize(40.dp)
     }
 
@@ -206,28 +189,21 @@
         val tag = "circular"
 
         rule.mainClock.autoAdvance = false
-        rule.setMaterialContent {
-            CircularProgressIndicator(modifier = Modifier.testTag(tag))
-        }
+        rule.setMaterialContent { CircularProgressIndicator(modifier = Modifier.testTag(tag)) }
 
         rule.mainClock.advanceTimeByFrame() // Kick off the animation
 
-        rule.onNodeWithTag(tag)
-            .assertRangeInfoEquals(ProgressBarRangeInfo.Indeterminate)
+        rule.onNodeWithTag(tag).assertRangeInfoEquals(ProgressBarRangeInfo.Indeterminate)
     }
 
     @Test
     fun indeterminateCircularProgressIndicator_Size() {
         rule.mainClock.autoAdvance = false
-        val contentToTest = rule
-            .setMaterialContentForSizeAssertions {
-                CircularProgressIndicator()
-            }
+        val contentToTest = rule.setMaterialContentForSizeAssertions { CircularProgressIndicator() }
 
         rule.mainClock.advanceTimeByFrame() // Kick off the animation
 
-        contentToTest
-            .assertIsSquareWithSize(40.dp)
+        contentToTest.assertIsSquareWithSize(40.dp)
     }
 
     @SdkSuppress(minSdkVersion = Build.VERSION_CODES.O)
@@ -235,24 +211,22 @@
     fun determinateLinearProgressIndicator_sizeModifier() {
         val expectedWidth = 100.dp
         val expectedHeight = 10.dp
-        val expectedSize = with(rule.density) {
-            IntSize(expectedWidth.roundToPx(), expectedHeight.roundToPx())
-        }
+        val expectedSize =
+            with(rule.density) { IntSize(expectedWidth.roundToPx(), expectedHeight.roundToPx()) }
         val tag = "progress_indicator"
         rule.setContent {
             Box(Modifier.testTag(tag)) {
                 LinearProgressIndicator(
                     modifier = Modifier.size(expectedWidth, expectedHeight),
                     progress = 1f,
-                    color = Color.Blue)
+                    color = Color.Blue
+                )
             }
         }
 
-        rule.onNodeWithTag(tag)
-            .captureToImage()
-            .assertPixels(expectedSize = expectedSize) {
-                Color.Blue
-            }
+        rule.onNodeWithTag(tag).captureToImage().assertPixels(expectedSize = expectedSize) {
+            Color.Blue
+        }
     }
 
     @SdkSuppress(minSdkVersion = Build.VERSION_CODES.O)
@@ -260,34 +234,31 @@
     fun indeterminateLinearProgressIndicator_sizeModifier() {
         val expectedWidth = 100.dp
         val expectedHeight = 10.dp
-        val expectedSize = with(rule.density) {
-            IntSize(expectedWidth.roundToPx(), expectedHeight.roundToPx())
-        }
+        val expectedSize =
+            with(rule.density) { IntSize(expectedWidth.roundToPx(), expectedHeight.roundToPx()) }
         rule.mainClock.autoAdvance = false
         val tag = "progress_indicator"
         rule.setContent {
             Box(Modifier.testTag(tag)) {
                 LinearProgressIndicator(
                     modifier = Modifier.size(expectedWidth, expectedHeight),
-                    color = Color.Blue)
+                    color = Color.Blue
+                )
             }
         }
 
         rule.mainClock.advanceTimeBy(100)
 
-        rule.onNodeWithTag(tag)
-            .captureToImage()
-            .toPixelMap()
-            .let {
-                assertEquals(expectedSize.width, it.width)
-                assertEquals(expectedSize.height, it.height)
-                // Assert on the first pixel column, to make sure that the progress indicator draws
-                // to the expect height.
-                // We can't assert width as the width dynamically changes during the animation
-                for (i in 0 until it.height) {
-                    it.assertPixelColor(Color.Blue, 0, i)
-                }
+        rule.onNodeWithTag(tag).captureToImage().toPixelMap().let {
+            assertEquals(expectedSize.width, it.width)
+            assertEquals(expectedSize.height, it.height)
+            // Assert on the first pixel column, to make sure that the progress indicator draws
+            // to the expect height.
+            // We can't assert width as the width dynamically changes during the animation
+            for (i in 0 until it.height) {
+                it.assertPixelColor(Color.Blue, 0, i)
             }
+        }
     }
 
     @Test
@@ -302,12 +273,9 @@
         // Adding a testTag on the progress bar itself captures the progress bar as well as its
         // padding.
         val tag = "progress_indicator"
-        rule.setContent {
-            LinearProgressIndicator(Modifier.testTag(tag))
-        }
+        rule.setContent { LinearProgressIndicator(Modifier.testTag(tag)) }
 
-        val node = rule.onNodeWithTag(tag)
-            .fetchSemanticsNode("couldn't find node with tag $tag")
+        val node = rule.onNodeWithTag(tag).fetchSemanticsNode("couldn't find node with tag $tag")
         val nodeBounds = node.boundsInRoot
 
         // Check that the SemanticsNode bounds of a LinearProgressIndicator include the padding.
@@ -326,14 +294,9 @@
         // The bounds of a testTag on a box that contains the progress indicator are not affected
         // by the padding added on the layout of the progress bar.
         val tag = "progress_indicator"
-        rule.setContent {
-            Box(Modifier.testTag(tag)) {
-                LinearProgressIndicator()
-            }
-        }
+        rule.setContent { Box(Modifier.testTag(tag)) { LinearProgressIndicator() } }
 
-        val node = rule.onNodeWithTag(tag)
-            .fetchSemanticsNode("couldn't find node with tag $tag")
+        val node = rule.onNodeWithTag(tag).fetchSemanticsNode("couldn't find node with tag $tag")
         val nodeBounds = node.boundsInRoot
 
         // Check that the visual bounds of a LinearProgressIndicator are the expected visual size.
@@ -353,12 +316,9 @@
         // Adding a testTag on the progress bar itself captures the progress bar as well as its
         // padding.
         val tag = "progress_indicator"
-        rule.setContent {
-            LinearProgressIndicator(modifier = Modifier.testTag(tag), progress = 1f)
-        }
+        rule.setContent { LinearProgressIndicator(modifier = Modifier.testTag(tag), progress = 1f) }
 
-        val node = rule.onNodeWithTag(tag)
-            .fetchSemanticsNode("couldn't find node with tag $tag")
+        val node = rule.onNodeWithTag(tag).fetchSemanticsNode("couldn't find node with tag $tag")
         val nodeBounds = node.boundsInRoot
 
         // Check that the SemanticsNode bounds of a LinearProgressIndicator include the padding.
@@ -377,14 +337,9 @@
         // The bounds of a testTag on a box that contains the progress indicator are not affected
         // by the padding added on the layout of the progress bar.
         val tag = "progress_indicator"
-        rule.setContent {
-            Box(Modifier.testTag(tag)) {
-                LinearProgressIndicator(progress = 1f)
-            }
-        }
+        rule.setContent { Box(Modifier.testTag(tag)) { LinearProgressIndicator(progress = 1f) } }
 
-        val node = rule.onNodeWithTag(tag)
-            .fetchSemanticsNode("couldn't find node with tag $tag")
+        val node = rule.onNodeWithTag(tag).fetchSemanticsNode("couldn't find node with tag $tag")
         val nodeBounds = node.boundsInRoot
 
         // Check that the visual bounds of a LinearProgressIndicator are the expected visual size.
@@ -407,36 +362,34 @@
         val withPaddingTag = "with_padding"
         val visualTag = "visual_tag"
         rule.setContent {
-            Column(
-                modifier = Modifier
-                    .verticalScroll(rememberScrollState())
-            ) {
+            Column(modifier = Modifier.verticalScroll(rememberScrollState())) {
                 // Add some content to the scrollable column
-                repeat(20) {
-                    Text("Item $it")
-                }
+                repeat(20) { Text("Item $it") }
                 // The visual tag will measure the visual bounds of the indicator, while
                 // the withPadding tag will measure with padding.
                 Box(Modifier.testTag(visualTag)) {
                     LinearProgressIndicator(
-                        modifier = Modifier.testTag(withPaddingTag), progress = 1f
+                        modifier = Modifier.testTag(withPaddingTag),
+                        progress = 1f
                     )
                 }
-                repeat(20) {
-                    Text("Item $it")
-                }
+                repeat(20) { Text("Item $it") }
             }
         }
 
-        val indicatorNode = rule.onNodeWithTag(visualTag)
-            .fetchSemanticsNode("couldn't find node with tag $visualTag")
+        val indicatorNode =
+            rule
+                .onNodeWithTag(visualTag)
+                .fetchSemanticsNode("couldn't find node with tag $visualTag")
         val indicatorBounds = indicatorNode.boundsInRoot
         // Check that the visual bounds of a LinearProgressIndicator are the expected visual size.
         assertEquals(expectedSize.width.toFloat(), indicatorBounds.width)
         assertEquals(expectedSize.height.toFloat(), indicatorBounds.height)
 
-        val semanticsNode = rule.onNodeWithTag(withPaddingTag)
-            .fetchSemanticsNode("couldn't find node with tag $withPaddingTag")
+        val semanticsNode =
+            rule
+                .onNodeWithTag(withPaddingTag)
+                .fetchSemanticsNode("couldn't find node with tag $withPaddingTag")
         // Make sure to get the bounds with no clipping applied by
         // using Rect(positionInRoot, size.toSize()).
         val semanticsBound = Rect(semanticsNode.positionInRoot, semanticsNode.size.toSize())
diff --git a/compose/material/material/src/androidInstrumentedTest/kotlin/androidx/compose/material/RadioButtonScreenshotTest.kt b/compose/material/material/src/androidInstrumentedTest/kotlin/androidx/compose/material/RadioButtonScreenshotTest.kt
index 04d7406..9a3122f 100644
--- a/compose/material/material/src/androidInstrumentedTest/kotlin/androidx/compose/material/RadioButtonScreenshotTest.kt
+++ b/compose/material/material/src/androidInstrumentedTest/kotlin/androidx/compose/material/RadioButtonScreenshotTest.kt
@@ -56,17 +56,16 @@
 @OptIn(ExperimentalTestApi::class)
 class RadioButtonScreenshotTest {
 
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
-    @get:Rule
-    val screenshotRule = AndroidXScreenshotTestRule(GOLDEN_MATERIAL)
+    @get:Rule val screenshotRule = AndroidXScreenshotTestRule(GOLDEN_MATERIAL)
 
     // TODO(b/267253920): Add a compose test API to set/reset InputMode.
     @After
-    fun resetTouchMode() = with(InstrumentationRegistry.getInstrumentation()) {
-        if (SDK_INT < 33) setInTouchMode(true) else resetInTouchMode()
-    }
+    fun resetTouchMode() =
+        with(InstrumentationRegistry.getInstrumentation()) {
+            if (SDK_INT < 33) setInTouchMode(true) else resetInTouchMode()
+        }
 
     private val wrap = Modifier.wrapContentSize(Alignment.TopStart)
 
@@ -77,9 +76,7 @@
     @Test
     fun radioButtonTest_selected() {
         rule.setMaterialContent {
-            Box(wrap.testTag(wrapperTestTag)) {
-                RadioButton(selected = true, onClick = {})
-            }
+            Box(wrap.testTag(wrapperTestTag)) { RadioButton(selected = true, onClick = {}) }
         }
         assertSelectableAgainstGolden("radioButton_selected")
     }
@@ -87,9 +84,7 @@
     @Test
     fun radioButtonTest_notSelected() {
         rule.setMaterialContent {
-            Box(wrap.testTag(wrapperTestTag)) {
-                RadioButton(selected = false, onClick = {})
-            }
+            Box(wrap.testTag(wrapperTestTag)) { RadioButton(selected = false, onClick = {}) }
         }
         assertSelectableAgainstGolden("radioButton_notSelected")
     }
@@ -97,13 +92,9 @@
     @Test
     fun radioButtonTest_pressed() {
         rule.setMaterialContent {
-            Box(wrap.testTag(wrapperTestTag)) {
-                RadioButton(selected = false, onClick = {})
-            }
+            Box(wrap.testTag(wrapperTestTag)) { RadioButton(selected = false, onClick = {}) }
         }
-        rule.onNodeWithTag(wrapperTestTag).performTouchInput {
-            down(center)
-        }
+        rule.onNodeWithTag(wrapperTestTag).performTouchInput { down(center) }
 
         // Ripples are drawn on the RenderThread, not the main (UI) thread, so we can't wait for
         // synchronization. Instead just wait until after the ripples are finished animating.
@@ -115,13 +106,9 @@
     @Test
     fun radioButtonTest_hovered() {
         rule.setMaterialContent {
-            Box(wrap.testTag(wrapperTestTag)) {
-                RadioButton(selected = false, onClick = {})
-            }
+            Box(wrap.testTag(wrapperTestTag)) { RadioButton(selected = false, onClick = {}) }
         }
-        rule.onNodeWithTag(wrapperTestTag).performMouseInput {
-            enter(center)
-        }
+        rule.onNodeWithTag(wrapperTestTag).performMouseInput { enter(center) }
 
         assertSelectableAgainstGolden("radioButton_hovered")
     }
@@ -137,8 +124,7 @@
                 RadioButton(
                     selected = false,
                     onClick = {},
-                    modifier = Modifier
-                        .focusRequester(focusRequester)
+                    modifier = Modifier.focusRequester(focusRequester)
                 )
             }
         }
@@ -188,10 +174,14 @@
 
         rule.mainClock.autoAdvance = false
 
-        rule.onNode(isSelectable())
+        rule
+            .onNode(isSelectable())
             // split click into (down) and (move, up) to enforce a composition in between
             .performTouchInput { down(center) }
-            .performTouchInput { move(); up() }
+            .performTouchInput {
+                move()
+                up()
+            }
 
         rule.mainClock.advanceTimeByFrame()
         rule.waitForIdle() // Wait for measure
@@ -218,10 +208,14 @@
 
         rule.mainClock.autoAdvance = false
 
-        rule.onNode(isSelectable())
+        rule
+            .onNode(isSelectable())
             // split click into (down) and (move, up) to enforce a composition in between
             .performTouchInput { down(center) }
-            .performTouchInput { move(); up() }
+            .performTouchInput {
+                move()
+                up()
+            }
 
         rule.mainClock.advanceTimeByFrame()
         rule.waitForIdle() // Wait for measure
@@ -236,7 +230,8 @@
 
     private fun assertSelectableAgainstGolden(goldenName: String) {
         // TODO: replace with find(isInMutuallyExclusiveGroup()) after b/157687898 is fixed
-        rule.onNodeWithTag(wrapperTestTag)
+        rule
+            .onNodeWithTag(wrapperTestTag)
             .captureToImage()
             .assertAgainstGolden(screenshotRule, goldenName)
     }
diff --git a/compose/material/material/src/androidInstrumentedTest/kotlin/androidx/compose/material/RadioButtonTest.kt b/compose/material/material/src/androidInstrumentedTest/kotlin/androidx/compose/material/RadioButtonTest.kt
index e09a044..2963e73 100644
--- a/compose/material/material/src/androidInstrumentedTest/kotlin/androidx/compose/material/RadioButtonTest.kt
+++ b/compose/material/material/src/androidInstrumentedTest/kotlin/androidx/compose/material/RadioButtonTest.kt
@@ -47,8 +47,7 @@
 @RunWith(AndroidJUnit4::class)
 class RadioButtonTest {
 
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
     private val itemOne = "Bar"
     private val itemTwo = "Foo"
@@ -78,20 +77,17 @@
             }
         }
 
-        rule.onNodeWithTag(itemOne)
-            .assert(
-                SemanticsMatcher.expectValue(SemanticsProperties.Role, Role.RadioButton)
-            )
+        rule
+            .onNodeWithTag(itemOne)
+            .assert(SemanticsMatcher.expectValue(SemanticsProperties.Role, Role.RadioButton))
             .assertHasSelectedSemantics()
-        rule.onNodeWithTag(itemTwo)
+        rule
+            .onNodeWithTag(itemTwo)
             .assertHasUnSelectedSemantics()
-            .assert(
-                SemanticsMatcher.expectValue(SemanticsProperties.Role, Role.RadioButton)
-            )
-        rule.onNodeWithTag(itemThree)
-            .assert(
-                SemanticsMatcher.expectValue(SemanticsProperties.Role, Role.RadioButton)
-            )
+            .assert(SemanticsMatcher.expectValue(SemanticsProperties.Role, Role.RadioButton))
+        rule
+            .onNodeWithTag(itemThree)
+            .assert(SemanticsMatcher.expectValue(SemanticsProperties.Role, Role.RadioButton))
             .assertHasUnSelectedSemantics()
     }
 
@@ -111,16 +107,15 @@
             }
         }
 
-        rule.onNodeWithTag(itemOne)
+        rule
+            .onNodeWithTag(itemOne)
             .assertHasSelectedSemantics()
             .performClick()
             .assertHasSelectedSemantics()
 
-        rule.onNodeWithTag(itemTwo)
-            .assertHasUnSelectedSemantics()
+        rule.onNodeWithTag(itemTwo).assertHasUnSelectedSemantics()
 
-        rule.onNodeWithTag(itemThree)
-            .assertHasUnSelectedSemantics()
+        rule.onNodeWithTag(itemThree).assertHasUnSelectedSemantics()
     }
 
     @Test
@@ -137,16 +132,15 @@
                 }
             }
         }
-        rule.onNodeWithTag(itemTwo)
+        rule
+            .onNodeWithTag(itemTwo)
             .assertHasUnSelectedSemantics()
             .performClick()
             .assertHasSelectedSemantics()
 
-        rule.onNodeWithTag(itemOne)
-            .assertHasUnSelectedSemantics()
+        rule.onNodeWithTag(itemOne).assertHasUnSelectedSemantics()
 
-        rule.onNodeWithTag(itemThree)
-            .assertHasUnSelectedSemantics()
+        rule.onNodeWithTag(itemThree).assertHasUnSelectedSemantics()
     }
 
     @Test
@@ -162,7 +156,8 @@
             }
         }
 
-        rule.onNodeWithTag(parentTag)
+        rule
+            .onNodeWithTag(parentTag)
             .assertHasNoClickAction()
             .assert(isFocusable()) // Check merged into parent
     }
@@ -184,96 +179,63 @@
             }
         }
 
-        rule.onNodeWithTag(itemTwo)
+        rule
+            .onNodeWithTag(itemTwo)
             .assertHasUnSelectedSemantics()
             .performClick()
             .assertHasSelectedSemantics()
 
-        rule.onNodeWithTag(itemOne)
-            .assertHasUnSelectedSemantics()
+        rule.onNodeWithTag(itemOne).assertHasUnSelectedSemantics()
 
-        rule.onNodeWithTag(itemThree)
+        rule
+            .onNodeWithTag(itemThree)
             .assertHasUnSelectedSemantics()
             .performClick()
             .assertHasSelectedSemantics()
 
-        rule.onNodeWithTag(itemOne)
-            .assertHasUnSelectedSemantics()
+        rule.onNodeWithTag(itemOne).assertHasUnSelectedSemantics()
 
-        rule.onNodeWithTag(itemTwo)
-            .assertHasUnSelectedSemantics()
+        rule.onNodeWithTag(itemTwo).assertHasUnSelectedSemantics()
     }
 
     @Test
     fun radioButton_materialSizes_whenSelected_minimumTouchTarget() {
-        materialSizesTestForValue(
-            selected = true,
-            clickable = true,
-            minimumTouchTarget = true
-        )
+        materialSizesTestForValue(selected = true, clickable = true, minimumTouchTarget = true)
     }
 
     @Test
     fun radioButton_materialSizes_whenSelected_withoutMinimumTouchTarget() {
-        materialSizesTestForValue(
-            selected = true,
-            clickable = true,
-            minimumTouchTarget = false
-        )
+        materialSizesTestForValue(selected = true, clickable = true, minimumTouchTarget = false)
     }
 
     @Test
     fun radioButton_materialSizes_whenNotSelected_minimumTouchTarget() {
-        materialSizesTestForValue(
-            selected = false,
-            clickable = true,
-            minimumTouchTarget = true
-        )
+        materialSizesTestForValue(selected = false, clickable = true, minimumTouchTarget = true)
     }
 
     @Test
     fun radioButton_materialSizes_whenNotSelected_withoutMinimumTouchTarget() {
-        materialSizesTestForValue(
-            selected = false,
-            clickable = true,
-            minimumTouchTarget = false
-        )
+        materialSizesTestForValue(selected = false, clickable = true, minimumTouchTarget = false)
     }
 
     @Test
     fun radioButton_materialSizes_whenSelected_notClickable_minimumTouchTarget() {
-        materialSizesTestForValue(
-            selected = true,
-            clickable = false,
-            minimumTouchTarget = true
-        )
+        materialSizesTestForValue(selected = true, clickable = false, minimumTouchTarget = true)
     }
 
     @Test
     fun radioButton_materialSizes_whenSelected_notClickable_withoutMinimumTouchTarget() {
-        materialSizesTestForValue(
-            selected = true,
-            clickable = false,
-            minimumTouchTarget = false
-        )
+        materialSizesTestForValue(selected = true, clickable = false, minimumTouchTarget = false)
     }
 
     @Test
     fun radioButton_materialSizes_whenNotSelected_notClickable_minimumTouchTarget() {
-        materialSizesTestForValue(
-            selected = false,
-            clickable = false,
-            minimumTouchTarget = true
-        )
+        materialSizesTestForValue(selected = false, clickable = false, minimumTouchTarget = true)
     }
 
     @Test
     fun radioButton_materialSizes_whenNotSelected_notClickable_withoutMinimumTouchTarget() {
-        materialSizesTestForValue(
-            selected = false,
-            clickable = false,
-            minimumTouchTarget = false
-        )
+        materialSizesTestForValue(selected = false, clickable = false, minimumTouchTarget = false)
     }
 
     @OptIn(ExperimentalMaterialApi::class)
@@ -287,7 +249,13 @@
                 CompositionLocalProvider(
                     LocalMinimumInteractiveComponentEnforcement provides minimumTouchTarget
                 ) {
-                    RadioButton(selected = selected, onClick = if (clickable) { {} } else null)
+                    RadioButton(
+                        selected = selected,
+                        onClick =
+                            if (clickable) {
+                                {}
+                            } else null
+                    )
                 }
             }
             .run {
diff --git a/compose/material/material/src/androidInstrumentedTest/kotlin/androidx/compose/material/RippleTest.kt b/compose/material/material/src/androidInstrumentedTest/kotlin/androidx/compose/material/RippleTest.kt
index c52867d..4d30a23 100644
--- a/compose/material/material/src/androidInstrumentedTest/kotlin/androidx/compose/material/RippleTest.kt
+++ b/compose/material/material/src/androidInstrumentedTest/kotlin/androidx/compose/material/RippleTest.kt
@@ -65,9 +65,7 @@
 import org.junit.Test
 import org.junit.runner.RunWith
 
-/**
- * Test for [ripple], to verify colors and opacity in different configurations.
- */
+/** Test for [ripple], to verify colors and opacity in different configurations. */
 @LargeTest
 @RunWith(AndroidJUnit4::class)
 @SdkSuppress(
@@ -83,8 +81,7 @@
 )
 class RippleTest {
 
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
     @Test
     fun bounded_lightTheme_highLuminance_pressed() {
@@ -92,12 +89,13 @@
 
         val contentColor = Color.White
 
-        val scope = rule.setRippleContent(
-            interactionSource = interactionSource,
-            bounded = true,
-            lightTheme = true,
-            contentColor = contentColor
-        )
+        val scope =
+            rule.setRippleContent(
+                interactionSource = interactionSource,
+                bounded = true,
+                lightTheme = true,
+                contentColor = contentColor
+            )
 
         assertRippleMatches(
             scope,
@@ -113,12 +111,13 @@
 
         val contentColor = Color.White
 
-        val scope = rule.setRippleContent(
-            interactionSource = interactionSource,
-            bounded = true,
-            lightTheme = true,
-            contentColor = contentColor
-        )
+        val scope =
+            rule.setRippleContent(
+                interactionSource = interactionSource,
+                bounded = true,
+                lightTheme = true,
+                contentColor = contentColor
+            )
 
         assertRippleMatches(
             scope,
@@ -134,12 +133,13 @@
 
         val contentColor = Color.White
 
-        val scope = rule.setRippleContent(
-            interactionSource = interactionSource,
-            bounded = true,
-            lightTheme = true,
-            contentColor = contentColor
-        )
+        val scope =
+            rule.setRippleContent(
+                interactionSource = interactionSource,
+                bounded = true,
+                lightTheme = true,
+                contentColor = contentColor
+            )
 
         assertRippleMatches(
             scope,
@@ -155,12 +155,13 @@
 
         val contentColor = Color.White
 
-        val scope = rule.setRippleContent(
-            interactionSource = interactionSource,
-            bounded = true,
-            lightTheme = true,
-            contentColor = contentColor
-        )
+        val scope =
+            rule.setRippleContent(
+                interactionSource = interactionSource,
+                bounded = true,
+                lightTheme = true,
+                contentColor = contentColor
+            )
 
         assertRippleMatches(
             scope,
@@ -176,12 +177,13 @@
 
         val contentColor = Color.Black
 
-        val scope = rule.setRippleContent(
-            interactionSource = interactionSource,
-            bounded = true,
-            lightTheme = true,
-            contentColor = contentColor
-        )
+        val scope =
+            rule.setRippleContent(
+                interactionSource = interactionSource,
+                bounded = true,
+                lightTheme = true,
+                contentColor = contentColor
+            )
 
         assertRippleMatches(
             scope,
@@ -197,12 +199,13 @@
 
         val contentColor = Color.Black
 
-        val scope = rule.setRippleContent(
-            interactionSource = interactionSource,
-            bounded = true,
-            lightTheme = true,
-            contentColor = contentColor
-        )
+        val scope =
+            rule.setRippleContent(
+                interactionSource = interactionSource,
+                bounded = true,
+                lightTheme = true,
+                contentColor = contentColor
+            )
 
         assertRippleMatches(
             scope,
@@ -218,12 +221,13 @@
 
         val contentColor = Color.Black
 
-        val scope = rule.setRippleContent(
-            interactionSource = interactionSource,
-            bounded = true,
-            lightTheme = true,
-            contentColor = contentColor
-        )
+        val scope =
+            rule.setRippleContent(
+                interactionSource = interactionSource,
+                bounded = true,
+                lightTheme = true,
+                contentColor = contentColor
+            )
 
         assertRippleMatches(
             scope,
@@ -239,12 +243,13 @@
 
         val contentColor = Color.Black
 
-        val scope = rule.setRippleContent(
-            interactionSource = interactionSource,
-            bounded = true,
-            lightTheme = true,
-            contentColor = contentColor
-        )
+        val scope =
+            rule.setRippleContent(
+                interactionSource = interactionSource,
+                bounded = true,
+                lightTheme = true,
+                contentColor = contentColor
+            )
 
         assertRippleMatches(
             scope,
@@ -260,12 +265,13 @@
 
         val contentColor = Color.White
 
-        val scope = rule.setRippleContent(
-            interactionSource = interactionSource,
-            bounded = true,
-            lightTheme = false,
-            contentColor = contentColor
-        )
+        val scope =
+            rule.setRippleContent(
+                interactionSource = interactionSource,
+                bounded = true,
+                lightTheme = false,
+                contentColor = contentColor
+            )
 
         assertRippleMatches(
             scope,
@@ -281,12 +287,13 @@
 
         val contentColor = Color.White
 
-        val scope = rule.setRippleContent(
-            interactionSource = interactionSource,
-            bounded = true,
-            lightTheme = false,
-            contentColor = contentColor
-        )
+        val scope =
+            rule.setRippleContent(
+                interactionSource = interactionSource,
+                bounded = true,
+                lightTheme = false,
+                contentColor = contentColor
+            )
 
         assertRippleMatches(
             scope,
@@ -302,12 +309,13 @@
 
         val contentColor = Color.White
 
-        val scope = rule.setRippleContent(
-            interactionSource = interactionSource,
-            bounded = true,
-            lightTheme = false,
-            contentColor = contentColor
-        )
+        val scope =
+            rule.setRippleContent(
+                interactionSource = interactionSource,
+                bounded = true,
+                lightTheme = false,
+                contentColor = contentColor
+            )
 
         assertRippleMatches(
             scope,
@@ -323,12 +331,13 @@
 
         val contentColor = Color.White
 
-        val scope = rule.setRippleContent(
-            interactionSource = interactionSource,
-            bounded = true,
-            lightTheme = false,
-            contentColor = contentColor
-        )
+        val scope =
+            rule.setRippleContent(
+                interactionSource = interactionSource,
+                bounded = true,
+                lightTheme = false,
+                contentColor = contentColor
+            )
 
         assertRippleMatches(
             scope,
@@ -344,12 +353,13 @@
 
         val contentColor = Color.Black
 
-        val scope = rule.setRippleContent(
-            interactionSource = interactionSource,
-            bounded = true,
-            lightTheme = false,
-            contentColor = contentColor
-        )
+        val scope =
+            rule.setRippleContent(
+                interactionSource = interactionSource,
+                bounded = true,
+                lightTheme = false,
+                contentColor = contentColor
+            )
 
         assertRippleMatches(
             scope,
@@ -366,12 +376,13 @@
 
         val contentColor = Color.Black
 
-        val scope = rule.setRippleContent(
-            interactionSource = interactionSource,
-            bounded = true,
-            lightTheme = false,
-            contentColor = contentColor
-        )
+        val scope =
+            rule.setRippleContent(
+                interactionSource = interactionSource,
+                bounded = true,
+                lightTheme = false,
+                contentColor = contentColor
+            )
 
         assertRippleMatches(
             scope,
@@ -388,12 +399,13 @@
 
         val contentColor = Color.Black
 
-        val scope = rule.setRippleContent(
-            interactionSource = interactionSource,
-            bounded = true,
-            lightTheme = false,
-            contentColor = contentColor
-        )
+        val scope =
+            rule.setRippleContent(
+                interactionSource = interactionSource,
+                bounded = true,
+                lightTheme = false,
+                contentColor = contentColor
+            )
 
         assertRippleMatches(
             scope,
@@ -410,12 +422,13 @@
 
         val contentColor = Color.Black
 
-        val scope = rule.setRippleContent(
-            interactionSource = interactionSource,
-            bounded = true,
-            lightTheme = false,
-            contentColor = contentColor
-        )
+        val scope =
+            rule.setRippleContent(
+                interactionSource = interactionSource,
+                bounded = true,
+                lightTheme = false,
+                contentColor = contentColor
+            )
 
         assertRippleMatches(
             scope,
@@ -432,12 +445,13 @@
 
         val contentColor = Color.White
 
-        val scope = rule.setRippleContent(
-            interactionSource = interactionSource,
-            bounded = false,
-            lightTheme = true,
-            contentColor = contentColor
-        )
+        val scope =
+            rule.setRippleContent(
+                interactionSource = interactionSource,
+                bounded = false,
+                lightTheme = true,
+                contentColor = contentColor
+            )
 
         assertRippleMatches(
             scope,
@@ -453,12 +467,13 @@
 
         val contentColor = Color.White
 
-        val scope = rule.setRippleContent(
-            interactionSource = interactionSource,
-            bounded = false,
-            lightTheme = true,
-            contentColor = contentColor
-        )
+        val scope =
+            rule.setRippleContent(
+                interactionSource = interactionSource,
+                bounded = false,
+                lightTheme = true,
+                contentColor = contentColor
+            )
 
         assertRippleMatches(
             scope,
@@ -474,12 +489,13 @@
 
         val contentColor = Color.White
 
-        val scope = rule.setRippleContent(
-            interactionSource = interactionSource,
-            bounded = false,
-            lightTheme = true,
-            contentColor = contentColor
-        )
+        val scope =
+            rule.setRippleContent(
+                interactionSource = interactionSource,
+                bounded = false,
+                lightTheme = true,
+                contentColor = contentColor
+            )
 
         assertRippleMatches(
             scope,
@@ -495,12 +511,13 @@
 
         val contentColor = Color.White
 
-        val scope = rule.setRippleContent(
-            interactionSource = interactionSource,
-            bounded = false,
-            lightTheme = true,
-            contentColor = contentColor
-        )
+        val scope =
+            rule.setRippleContent(
+                interactionSource = interactionSource,
+                bounded = false,
+                lightTheme = true,
+                contentColor = contentColor
+            )
 
         assertRippleMatches(
             scope,
@@ -516,12 +533,13 @@
 
         val contentColor = Color.Black
 
-        val scope = rule.setRippleContent(
-            interactionSource = interactionSource,
-            bounded = false,
-            lightTheme = true,
-            contentColor = contentColor
-        )
+        val scope =
+            rule.setRippleContent(
+                interactionSource = interactionSource,
+                bounded = false,
+                lightTheme = true,
+                contentColor = contentColor
+            )
 
         assertRippleMatches(
             scope,
@@ -537,12 +555,13 @@
 
         val contentColor = Color.Black
 
-        val scope = rule.setRippleContent(
-            interactionSource = interactionSource,
-            bounded = false,
-            lightTheme = true,
-            contentColor = contentColor
-        )
+        val scope =
+            rule.setRippleContent(
+                interactionSource = interactionSource,
+                bounded = false,
+                lightTheme = true,
+                contentColor = contentColor
+            )
 
         assertRippleMatches(
             scope,
@@ -558,12 +577,13 @@
 
         val contentColor = Color.Black
 
-        val scope = rule.setRippleContent(
-            interactionSource = interactionSource,
-            bounded = false,
-            lightTheme = true,
-            contentColor = contentColor
-        )
+        val scope =
+            rule.setRippleContent(
+                interactionSource = interactionSource,
+                bounded = false,
+                lightTheme = true,
+                contentColor = contentColor
+            )
 
         assertRippleMatches(
             scope,
@@ -579,12 +599,13 @@
 
         val contentColor = Color.Black
 
-        val scope = rule.setRippleContent(
-            interactionSource = interactionSource,
-            bounded = false,
-            lightTheme = true,
-            contentColor = contentColor
-        )
+        val scope =
+            rule.setRippleContent(
+                interactionSource = interactionSource,
+                bounded = false,
+                lightTheme = true,
+                contentColor = contentColor
+            )
 
         assertRippleMatches(
             scope,
@@ -600,12 +621,13 @@
 
         val contentColor = Color.White
 
-        val scope = rule.setRippleContent(
-            interactionSource = interactionSource,
-            bounded = false,
-            lightTheme = false,
-            contentColor = contentColor
-        )
+        val scope =
+            rule.setRippleContent(
+                interactionSource = interactionSource,
+                bounded = false,
+                lightTheme = false,
+                contentColor = contentColor
+            )
 
         assertRippleMatches(
             scope,
@@ -621,12 +643,13 @@
 
         val contentColor = Color.White
 
-        val scope = rule.setRippleContent(
-            interactionSource = interactionSource,
-            bounded = false,
-            lightTheme = false,
-            contentColor = contentColor
-        )
+        val scope =
+            rule.setRippleContent(
+                interactionSource = interactionSource,
+                bounded = false,
+                lightTheme = false,
+                contentColor = contentColor
+            )
 
         assertRippleMatches(
             scope,
@@ -642,12 +665,13 @@
 
         val contentColor = Color.White
 
-        val scope = rule.setRippleContent(
-            interactionSource = interactionSource,
-            bounded = false,
-            lightTheme = false,
-            contentColor = contentColor
-        )
+        val scope =
+            rule.setRippleContent(
+                interactionSource = interactionSource,
+                bounded = false,
+                lightTheme = false,
+                contentColor = contentColor
+            )
 
         assertRippleMatches(
             scope,
@@ -663,12 +687,13 @@
 
         val contentColor = Color.White
 
-        val scope = rule.setRippleContent(
-            interactionSource = interactionSource,
-            bounded = false,
-            lightTheme = false,
-            contentColor = contentColor
-        )
+        val scope =
+            rule.setRippleContent(
+                interactionSource = interactionSource,
+                bounded = false,
+                lightTheme = false,
+                contentColor = contentColor
+            )
 
         assertRippleMatches(
             scope,
@@ -684,12 +709,13 @@
 
         val contentColor = Color.Black
 
-        val scope = rule.setRippleContent(
-            interactionSource = interactionSource,
-            bounded = false,
-            lightTheme = false,
-            contentColor = contentColor
-        )
+        val scope =
+            rule.setRippleContent(
+                interactionSource = interactionSource,
+                bounded = false,
+                lightTheme = false,
+                contentColor = contentColor
+            )
 
         assertRippleMatches(
             scope,
@@ -706,12 +732,13 @@
 
         val contentColor = Color.Black
 
-        val scope = rule.setRippleContent(
-            interactionSource = interactionSource,
-            bounded = false,
-            lightTheme = false,
-            contentColor = contentColor
-        )
+        val scope =
+            rule.setRippleContent(
+                interactionSource = interactionSource,
+                bounded = false,
+                lightTheme = false,
+                contentColor = contentColor
+            )
 
         assertRippleMatches(
             scope,
@@ -728,12 +755,13 @@
 
         val contentColor = Color.Black
 
-        val scope = rule.setRippleContent(
-            interactionSource = interactionSource,
-            bounded = false,
-            lightTheme = false,
-            contentColor = contentColor
-        )
+        val scope =
+            rule.setRippleContent(
+                interactionSource = interactionSource,
+                bounded = false,
+                lightTheme = false,
+                contentColor = contentColor
+            )
 
         assertRippleMatches(
             scope,
@@ -750,12 +778,13 @@
 
         val contentColor = Color.Black
 
-        val scope = rule.setRippleContent(
-            interactionSource = interactionSource,
-            bounded = false,
-            lightTheme = false,
-            contentColor = contentColor
-        )
+        val scope =
+            rule.setRippleContent(
+                interactionSource = interactionSource,
+                bounded = false,
+                lightTheme = false,
+                contentColor = contentColor
+            )
 
         assertRippleMatches(
             scope,
@@ -770,8 +799,8 @@
      * Test case for changing content color during an existing ripple effect
      *
      * Note: no corresponding test for pressed ripples since RippleForeground does not update the
-     * color of currently active ripples unless they are being drawn on the UI thread
-     * (which should only happen if the target radius also changes).
+     * color of currently active ripples unless they are being drawn on the UI thread (which should
+     * only happen if the target radius also changes).
      */
     @Test
     fun contentColorChangeDuringRipple_dragged() {
@@ -787,55 +816,33 @@
             MaterialTheme {
                 Surface(contentColor = contentColor) {
                     Box(Modifier.fillMaxSize(), contentAlignment = Alignment.Center) {
-                        RippleBoxWithBackground(
-                            interactionSource,
-                            ripple(),
-                            bounded = true
-                        )
+                        RippleBoxWithBackground(interactionSource, ripple(), bounded = true)
                     }
                 }
             }
         }
 
-        rule.runOnIdle {
-            scope!!.launch {
-                interactionSource.emit(DragInteraction.Start())
-            }
-        }
+        rule.runOnIdle { scope!!.launch { interactionSource.emit(DragInteraction.Start()) } }
         rule.waitForIdle()
 
         with(rule.onNodeWithTag(Tag)) {
-            val centerPixel = captureToImage().asAndroidBitmap()
-                .run {
-                    getPixel(width / 2, height / 2)
-                }
+            val centerPixel =
+                captureToImage().asAndroidBitmap().run { getPixel(width / 2, height / 2) }
 
-            val expectedColor =
-                calculateResultingRippleColor(
-                    initialColor,
-                    rippleOpacity = 0.08f
-                )
+            val expectedColor = calculateResultingRippleColor(initialColor, rippleOpacity = 0.08f)
 
             Truth.assertThat(Color(centerPixel)).isEqualTo(expectedColor)
         }
 
         val newColor = Color.Green
 
-        rule.runOnUiThread {
-            contentColor = newColor
-        }
+        rule.runOnUiThread { contentColor = newColor }
 
         with(rule.onNodeWithTag(Tag)) {
-            val centerPixel = captureToImage().asAndroidBitmap()
-                .run {
-                    getPixel(width / 2, height / 2)
-                }
+            val centerPixel =
+                captureToImage().asAndroidBitmap().run { getPixel(width / 2, height / 2) }
 
-            val expectedColor =
-                calculateResultingRippleColor(
-                    newColor,
-                    rippleOpacity = 0.08f
-                )
+            val expectedColor = calculateResultingRippleColor(newColor, rippleOpacity = 0.08f)
 
             Truth.assertThat(Color(centerPixel)).isEqualTo(expectedColor)
         }
@@ -846,9 +853,7 @@
     fun rippleConfiguration_color_dragged() {
         val interactionSource = MutableInteractionSource()
 
-        val rippleConfiguration = RippleConfiguration(
-            color = Color.Red
-        )
+        val rippleConfiguration = RippleConfiguration(color = Color.Red)
 
         var scope: CoroutineScope? = null
 
@@ -860,29 +865,19 @@
                         LocalRippleConfiguration provides rippleConfiguration
                     ) {
                         Box(Modifier.fillMaxSize(), contentAlignment = Alignment.Center) {
-                            RippleBoxWithBackground(
-                                interactionSource,
-                                ripple(),
-                                bounded = true
-                            )
+                            RippleBoxWithBackground(interactionSource, ripple(), bounded = true)
                         }
                     }
                 }
             }
         }
 
-        rule.runOnIdle {
-            scope!!.launch {
-                interactionSource.emit(DragInteraction.Start())
-            }
-        }
+        rule.runOnIdle { scope!!.launch { interactionSource.emit(DragInteraction.Start()) } }
         rule.waitForIdle()
 
         with(rule.onNodeWithTag(Tag)) {
-            val centerPixel = captureToImage().asAndroidBitmap()
-                .run {
-                    getPixel(width / 2, height / 2)
-                }
+            val centerPixel =
+                captureToImage().asAndroidBitmap().run { getPixel(width / 2, height / 2) }
 
             val expectedColor =
                 calculateResultingRippleColor(
@@ -901,9 +896,7 @@
     fun rippleConfiguration_color_explicitColorSet_dragged() {
         val interactionSource = MutableInteractionSource()
 
-        val rippleConfiguration = RippleConfiguration(
-            color = Color.Red
-        )
+        val rippleConfiguration = RippleConfiguration(color = Color.Red)
 
         val explicitColor = Color.Green
 
@@ -928,18 +921,12 @@
             }
         }
 
-        rule.runOnIdle {
-            scope!!.launch {
-                interactionSource.emit(DragInteraction.Start())
-            }
-        }
+        rule.runOnIdle { scope!!.launch { interactionSource.emit(DragInteraction.Start()) } }
         rule.waitForIdle()
 
         with(rule.onNodeWithTag(Tag)) {
-            val centerPixel = captureToImage().asAndroidBitmap()
-                .run {
-                    getPixel(width / 2, height / 2)
-                }
+            val centerPixel =
+                captureToImage().asAndroidBitmap().run { getPixel(width / 2, height / 2) }
 
             val expectedColor =
                 calculateResultingRippleColor(
@@ -960,9 +947,8 @@
 
         val contentColor = Color.Black
 
-        val rippleConfiguration = RippleConfiguration(
-            rippleAlpha = RippleAlpha(0.5f, 0.5f, 0.5f, 0.5f)
-        )
+        val rippleConfiguration =
+            RippleConfiguration(rippleAlpha = RippleAlpha(0.5f, 0.5f, 0.5f, 0.5f))
 
         var scope: CoroutineScope? = null
 
@@ -974,29 +960,19 @@
                         LocalRippleConfiguration provides rippleConfiguration
                     ) {
                         Box(Modifier.fillMaxSize(), contentAlignment = Alignment.Center) {
-                            RippleBoxWithBackground(
-                                interactionSource,
-                                ripple(),
-                                bounded = true
-                            )
+                            RippleBoxWithBackground(interactionSource, ripple(), bounded = true)
                         }
                     }
                 }
             }
         }
 
-        rule.runOnIdle {
-            scope!!.launch {
-                interactionSource.emit(DragInteraction.Start())
-            }
-        }
+        rule.runOnIdle { scope!!.launch { interactionSource.emit(DragInteraction.Start()) } }
         rule.waitForIdle()
 
         with(rule.onNodeWithTag(Tag)) {
-            val centerPixel = captureToImage().asAndroidBitmap()
-                .run {
-                    getPixel(width / 2, height / 2)
-                }
+            val centerPixel =
+                captureToImage().asAndroidBitmap().run { getPixel(width / 2, height / 2) }
 
             val expectedColor =
                 calculateResultingRippleColor(
@@ -1021,33 +997,21 @@
             scope = rememberCoroutineScope()
             MaterialTheme {
                 Surface {
-                    CompositionLocalProvider(
-                        LocalRippleConfiguration provides null
-                    ) {
+                    CompositionLocalProvider(LocalRippleConfiguration provides null) {
                         Box(Modifier.fillMaxSize(), contentAlignment = Alignment.Center) {
-                            RippleBoxWithBackground(
-                                interactionSource,
-                                ripple(),
-                                bounded = true
-                            )
+                            RippleBoxWithBackground(interactionSource, ripple(), bounded = true)
                         }
                     }
                 }
             }
         }
 
-        rule.runOnIdle {
-            scope!!.launch {
-                interactionSource.emit(DragInteraction.Start())
-            }
-        }
+        rule.runOnIdle { scope!!.launch { interactionSource.emit(DragInteraction.Start()) } }
         rule.waitForIdle()
 
         with(rule.onNodeWithTag(Tag)) {
-            val centerPixel = captureToImage().asAndroidBitmap()
-                .run {
-                    getPixel(width / 2, height / 2)
-                }
+            val centerPixel =
+                captureToImage().asAndroidBitmap().run { getPixel(width / 2, height / 2) }
 
             // No ripple should be showing
             Truth.assertThat(Color(centerPixel)).isEqualTo(RippleBoxBackgroundColor)
@@ -1058,8 +1022,8 @@
      * Test case for changing RippleConfiguration during an existing ripple effect
      *
      * Note: no corresponding test for pressed ripples since RippleForeground does not update the
-     * color of currently active ripples unless they are being drawn on the UI thread
-     * (which should only happen if the target radius also changes).
+     * color of currently active ripples unless they are being drawn on the UI thread (which should
+     * only happen if the target radius also changes).
      */
     @OptIn(ExperimentalMaterialApi::class)
     @Test
@@ -1080,76 +1044,52 @@
                         LocalRippleConfiguration provides rippleConfiguration
                     ) {
                         Box(Modifier.fillMaxSize(), contentAlignment = Alignment.Center) {
-                            RippleBoxWithBackground(
-                                interactionSource,
-                                ripple(),
-                                bounded = true
-                            )
+                            RippleBoxWithBackground(interactionSource, ripple(), bounded = true)
                         }
                     }
                 }
             }
         }
 
-        rule.runOnIdle {
-            scope!!.launch {
-                interactionSource.emit(DragInteraction.Start())
-            }
-        }
+        rule.runOnIdle { scope!!.launch { interactionSource.emit(DragInteraction.Start()) } }
         rule.waitForIdle()
 
         with(rule.onNodeWithTag(Tag)) {
-            val centerPixel = captureToImage().asAndroidBitmap()
-                .run {
-                    getPixel(width / 2, height / 2)
-                }
+            val centerPixel =
+                captureToImage().asAndroidBitmap().run { getPixel(width / 2, height / 2) }
 
             // Ripple should use default values
-            val expectedColor =
-                calculateResultingRippleColor(
-                    contentColor,
-                    rippleOpacity = 0.08f
-                )
+            val expectedColor = calculateResultingRippleColor(contentColor, rippleOpacity = 0.08f)
 
             Truth.assertThat(Color(centerPixel)).isEqualTo(expectedColor)
         }
 
-        val newConfiguration = RippleConfiguration(
-            color = Color.Red,
-            rippleAlpha = RippleAlpha(0.5f, 0.5f, 0.5f, 0.5f)
-        )
+        val newConfiguration =
+            RippleConfiguration(
+                color = Color.Red,
+                rippleAlpha = RippleAlpha(0.5f, 0.5f, 0.5f, 0.5f)
+            )
 
-        rule.runOnUiThread {
-            rippleConfiguration = newConfiguration
-        }
+        rule.runOnUiThread { rippleConfiguration = newConfiguration }
 
         with(rule.onNodeWithTag(Tag)) {
-            val centerPixel = captureToImage().asAndroidBitmap()
-                .run {
-                    getPixel(width / 2, height / 2)
-                }
+            val centerPixel =
+                captureToImage().asAndroidBitmap().run { getPixel(width / 2, height / 2) }
 
             // The ripple should now use the new configuration value for color. Ripple alpha
             // is not currently updated during an existing effect, so it should still use the old
             // value.
             val expectedColor =
-                calculateResultingRippleColor(
-                    newConfiguration.color,
-                    rippleOpacity = 0.08f
-                )
+                calculateResultingRippleColor(newConfiguration.color, rippleOpacity = 0.08f)
 
             Truth.assertThat(Color(centerPixel)).isEqualTo(expectedColor)
         }
 
-        rule.runOnUiThread {
-            rippleConfiguration = null
-        }
+        rule.runOnUiThread { rippleConfiguration = null }
 
         with(rule.onNodeWithTag(Tag)) {
-            val centerPixel = captureToImage().asAndroidBitmap()
-                .run {
-                    getPixel(width / 2, height / 2)
-                }
+            val centerPixel =
+                captureToImage().asAndroidBitmap().run { getPixel(width / 2, height / 2) }
 
             // The ripple should now be removed
             Truth.assertThat(Color(centerPixel)).isEqualTo(RippleBoxBackgroundColor)
@@ -1168,15 +1108,16 @@
         val expectedAlpha = 0.5f
         val rippleAlpha = RippleAlpha(expectedAlpha, expectedAlpha, expectedAlpha, expectedAlpha)
 
-        val rippleTheme = object : androidx.compose.material.ripple.RippleTheme {
-            @Deprecated("Super method is deprecated")
-            @Composable
-            override fun defaultColor() = rippleColor
+        val rippleTheme =
+            object : androidx.compose.material.ripple.RippleTheme {
+                @Deprecated("Super method is deprecated")
+                @Composable
+                override fun defaultColor() = rippleColor
 
-            @Deprecated("Super method is deprecated")
-            @Composable
-            override fun rippleAlpha() = rippleAlpha
-        }
+                @Deprecated("Super method is deprecated")
+                @Composable
+                override fun rippleAlpha() = rippleAlpha
+            }
 
         var scope: CoroutineScope? = null
 
@@ -1200,10 +1141,8 @@
             }
         }
 
-        val expectedColor = calculateResultingRippleColor(
-            rippleColor,
-            rippleOpacity = expectedAlpha
-        )
+        val expectedColor =
+            calculateResultingRippleColor(rippleColor, rippleOpacity = expectedAlpha)
 
         assertRippleMatches(
             scope!!,
@@ -1219,7 +1158,7 @@
      * @param interactionSource the [MutableInteractionSource] driving the ripple
      * @param interaction the [Interaction] to assert for
      * @param expectedCenterPixelColor the expected color for the pixel at the center of the
-     * [RippleBoxWithBackground]
+     *   [RippleBoxWithBackground]
      */
     private fun assertRippleMatches(
         scope: CoroutineScope,
@@ -1233,11 +1172,7 @@
         }
 
         // Start ripple
-        rule.runOnIdle {
-            scope.launch {
-                interactionSource.emit(interaction)
-            }
-        }
+        rule.runOnIdle { scope.launch { interactionSource.emit(interaction) } }
 
         // Advance to the end of the ripple / state layer animation
         rule.waitForIdle()
@@ -1251,10 +1186,8 @@
         }
 
         // Compare expected and actual pixel color
-        val centerPixel = rule.onNodeWithTag(Tag)
-            .captureToImage()
-            .asAndroidBitmap()
-            .run {
+        val centerPixel =
+            rule.onNodeWithTag(Tag).captureToImage().asAndroidBitmap().run {
                 getPixel(width / 2, height / 2)
             }
 
@@ -1264,8 +1197,8 @@
 
 /**
  * Generic Button like component with a border that allows injecting an [Indication], and has a
- * background with the same color around it - this makes the ripple contrast better and make it
- * more visible in screenshots.
+ * background with the same color around it - this makes the ripple contrast better and make it more
+ * visible in screenshots.
  *
  * @param interactionSource the [MutableInteractionSource] that is used to drive the ripple state
  * @param ripple ripple [Indication] placed inside the surface
@@ -1278,23 +1211,19 @@
     bounded: Boolean
 ) {
     Box(Modifier.semantics(mergeDescendants = true) {}.testTag(Tag)) {
-        Surface(
-            Modifier.padding(25.dp),
-            color = RippleBoxBackgroundColor
-        ) {
+        Surface(Modifier.padding(25.dp), color = RippleBoxBackgroundColor) {
             val shape = RoundedCornerShape(20)
             // If the ripple is bounded, we want to clip to the shape, otherwise don't clip as
             // the ripple should draw outside the bounds.
             val clip = if (bounded) Modifier.clip(shape) else Modifier
             Box(
-                Modifier.padding(25.dp).width(40.dp).height(40.dp)
+                Modifier.padding(25.dp)
+                    .width(40.dp)
+                    .height(40.dp)
                     .border(BorderStroke(2.dp, Color.Black), shape)
                     .background(color = RippleBoxBackgroundColor, shape = shape)
                     .then(clip)
-                    .indication(
-                        interactionSource = interactionSource,
-                        indication = ripple
-                    )
+                    .indication(interactionSource = interactionSource, indication = ripple)
             ) {}
         }
     }
@@ -1304,7 +1233,7 @@
  * Sets the content to a [RippleBoxWithBackground] with a [MaterialTheme] and surrounding [Surface]
  *
  * @param interactionSource [MutableInteractionSource] used to drive the ripple inside the
- * [RippleBoxWithBackground]
+ *   [RippleBoxWithBackground]
  * @param bounded whether the ripple inside the [RippleBoxWithBackground] is bounded
  * @param lightTheme whether the theme is light or dark
  * @param contentColor the contentColor that will be used for the ripple color
@@ -1334,13 +1263,11 @@
 }
 
 /**
- * Blends ([contentColor] with [rippleOpacity]) on top of [RippleBoxBackgroundColor] to provide
- * the resulting RGB color that can be used for pixel comparison.
+ * Blends ([contentColor] with [rippleOpacity]) on top of [RippleBoxBackgroundColor] to provide the
+ * resulting RGB color that can be used for pixel comparison.
  */
-private fun calculateResultingRippleColor(
-    contentColor: Color,
-    rippleOpacity: Float
-) = contentColor.copy(alpha = rippleOpacity).compositeOver(RippleBoxBackgroundColor)
+private fun calculateResultingRippleColor(contentColor: Color, rippleOpacity: Float) =
+    contentColor.copy(alpha = rippleOpacity).compositeOver(RippleBoxBackgroundColor)
 
 private val RippleBoxBackgroundColor = Color.Blue
 
diff --git a/compose/material/material/src/androidInstrumentedTest/kotlin/androidx/compose/material/ScaffoldScreenshotTest.kt b/compose/material/material/src/androidInstrumentedTest/kotlin/androidx/compose/material/ScaffoldScreenshotTest.kt
index 689a3fe..8e04c03 100644
--- a/compose/material/material/src/androidInstrumentedTest/kotlin/androidx/compose/material/ScaffoldScreenshotTest.kt
+++ b/compose/material/material/src/androidInstrumentedTest/kotlin/androidx/compose/material/ScaffoldScreenshotTest.kt
@@ -50,11 +50,9 @@
 @SdkSuppress(minSdkVersion = Build.VERSION_CODES.O)
 class ScaffoldScreenshotTest {
 
-    @get:Rule
-    val composeTestRule = createComposeRule()
+    @get:Rule val composeTestRule = createComposeRule()
 
-    @get:Rule
-    val screenshotRule = AndroidXScreenshotTestRule(GOLDEN_MATERIAL)
+    @get:Rule val screenshotRule = AndroidXScreenshotTestRule(GOLDEN_MATERIAL)
 
     @Test
     fun onlyContent() {
@@ -69,9 +67,7 @@
             }
         }
 
-        assertScaffoldMatches(
-            "scaffold_onlyContent"
-        )
+        assertScaffoldMatches("scaffold_onlyContent")
     }
 
     @Test
@@ -87,9 +83,7 @@
             }
         }
 
-        assertScaffoldMatches(
-            "scaffold_topAppBar"
-        )
+        assertScaffoldMatches("scaffold_topAppBar")
     }
 
     @Test
@@ -726,11 +720,10 @@
      *
      * @param goldenIdentifier the identifier for the corresponding screenshot
      */
-    private fun assertScaffoldMatches(
-        goldenIdentifier: String
-    ) {
+    private fun assertScaffoldMatches(goldenIdentifier: String) {
         // Capture and compare screenshots
-        composeTestRule.onNodeWithTag(Tag)
+        composeTestRule
+            .onNodeWithTag(Tag)
             .captureToImage()
             .assertAgainstGolden(screenshotRule, goldenIdentifier)
     }
@@ -743,11 +736,11 @@
  * @param showBottomAppBar whether to show a [BottomAppBar] or not
  * @param showFab whether to show a [FloatingActionButton] or not
  * @param dockedFab whether the FAB (if present) is docked to the [BottomAppBar] or not
- * @param fabCutout whether the [BottomAppBar] (if present) should draw a cutout where the FAB
- * (if present) is, when docked to the [BottomAppBar].
+ * @param fabCutout whether the [BottomAppBar] (if present) should draw a cutout where the FAB (if
+ *   present) is, when docked to the [BottomAppBar].
  * @param fabPosition the [FabPosition] of the FAB (if present)
  * @param rtl whether to set [LayoutDirection.Rtl] as the [LayoutDirection] for this Scaffold and
- * its content
+ *   its content
  */
 @Composable
 private fun ScreenshotScaffold(
@@ -760,51 +753,53 @@
     fabPosition: FabPosition = FabPosition.End,
     rtl: Boolean = false
 ) {
-    val topAppBar = @Composable {
-        if (showTopAppBar) {
-            TopAppBar(title = { Text("Scaffold") })
+    val topAppBar =
+        @Composable {
+            if (showTopAppBar) {
+                TopAppBar(title = { Text("Scaffold") })
+            }
         }
-    }
 
-    val bottomAppBar = @Composable {
-        if (showBottomAppBar) {
-            val cutoutShape = if (fabCutout) CircleShape else null
-            BottomAppBar(cutoutShape = cutoutShape) {
-                IconButton(onClick = {}) {
-                    Icon(Icons.Filled.Menu, null)
+    val bottomAppBar =
+        @Composable {
+            if (showBottomAppBar) {
+                val cutoutShape = if (fabCutout) CircleShape else null
+                BottomAppBar(cutoutShape = cutoutShape) {
+                    IconButton(onClick = {}) { Icon(Icons.Filled.Menu, null) }
                 }
             }
         }
-    }
 
-    val snackbar = @Composable {
-        if (showSnackbar) {
-            val snackbarData = object : SnackbarData {
-                override val message = "Snackbar"
-                override val actionLabel = "Click me"
-                override fun dismiss() {}
-                override fun performAction() {}
-                override val duration = SnackbarDuration.Indefinite
+    val snackbar =
+        @Composable {
+            if (showSnackbar) {
+                val snackbarData =
+                    object : SnackbarData {
+                        override val message = "Snackbar"
+                        override val actionLabel = "Click me"
+
+                        override fun dismiss() {}
+
+                        override fun performAction() {}
+
+                        override val duration = SnackbarDuration.Indefinite
+                    }
+                Snackbar(snackbarData)
             }
-            Snackbar(snackbarData)
         }
-    }
 
-    val fab = @Composable {
-        if (showFab) {
-            FloatingActionButton(
-                content = { Icon(Icons.Filled.Favorite, null) },
-                onClick = {}
-            )
+    val fab =
+        @Composable {
+            if (showFab) {
+                FloatingActionButton(content = { Icon(Icons.Filled.Favorite, null) }, onClick = {})
+            }
         }
-    }
 
     val layoutDirection = if (rtl) LayoutDirection.Rtl else LayoutDirection.Ltr
 
     CompositionLocalProvider(LocalLayoutDirection provides layoutDirection) {
         Box(
-            Modifier
-                .fillMaxSize(0.5f)
+            Modifier.fillMaxSize(0.5f)
                 .wrapContentSize()
                 .semantics(mergeDescendants = true) {}
                 .testTag(Tag)
@@ -818,10 +813,10 @@
                 isFloatingActionButtonDocked = dockedFab,
                 content = { innerPadding ->
                     Box(
-                        modifier = Modifier
-                            .padding(innerPadding)
-                            .fillMaxSize()
-                            .background(MaterialTheme.colors.secondary.copy(alpha = 0.3f))
+                        modifier =
+                            Modifier.padding(innerPadding)
+                                .fillMaxSize()
+                                .background(MaterialTheme.colors.secondary.copy(alpha = 0.3f))
                     ) {
                         Text(
                             text = "Scaffold Content",
diff --git a/compose/material/material/src/androidInstrumentedTest/kotlin/androidx/compose/material/ScaffoldTest.kt b/compose/material/material/src/androidInstrumentedTest/kotlin/androidx/compose/material/ScaffoldTest.kt
index 668246e..e9245e3 100644
--- a/compose/material/material/src/androidInstrumentedTest/kotlin/androidx/compose/material/ScaffoldTest.kt
+++ b/compose/material/material/src/androidInstrumentedTest/kotlin/androidx/compose/material/ScaffoldTest.kt
@@ -80,22 +80,20 @@
 @RunWith(AndroidJUnit4::class)
 class ScaffoldTest {
 
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
     private val fabSpacing = 16.dp
     private val scaffoldTag = "Scaffold"
 
     @Test
     fun scaffold_onlyContent_takesWholeScreen() {
-        rule.setMaterialContentForSizeAssertions(
-            parentMaxWidth = 100.dp,
-            parentMaxHeight = 100.dp
-        ) {
-            Scaffold {
-                Text("Scaffold body")
+        rule
+            .setMaterialContentForSizeAssertions(
+                parentMaxWidth = 100.dp,
+                parentMaxHeight = 100.dp
+            ) {
+                Scaffold { Text("Scaffold body") }
             }
-        }
             .assertWidthIsEqualTo(100.dp)
             .assertHeightIsEqualTo(100.dp)
     }
@@ -106,14 +104,8 @@
         var child2: Offset = Offset.Zero
         rule.setMaterialContent {
             Scaffold {
-                Text(
-                    "One",
-                    Modifier.onGloballyPositioned { child1 = it.positionInParent() }
-                )
-                Text(
-                    "Two",
-                    Modifier.onGloballyPositioned { child2 = it.positionInParent() }
-                )
+                Text("One", Modifier.onGloballyPositioned { child1 = it.positionInParent() })
+                Text("Two", Modifier.onGloballyPositioned { child2 = it.positionInParent() })
             }
         }
         assertThat(child1.y).isEqualTo(child2.y)
@@ -129,8 +121,7 @@
             Scaffold(
                 topBar = {
                     Box(
-                        Modifier
-                            .fillMaxWidth()
+                        Modifier.fillMaxWidth()
                             .height(50.dp)
                             .background(color = Color.Red)
                             .onGloballyPositioned { positioned: LayoutCoordinates ->
@@ -141,16 +132,14 @@
                 }
             ) {
                 Box(
-                    Modifier
-                        .fillMaxWidth()
+                    Modifier.fillMaxWidth()
                         .height(50.dp)
                         .background(Color.Blue)
                         .onGloballyPositioned { contentPosition = it.localToWindow(Offset.Zero) }
                 )
             }
         }
-        assertThat(appbarPosition.y + appbarSize.height.toFloat())
-            .isEqualTo(contentPosition.y)
+        assertThat(appbarPosition.y + appbarSize.height.toFloat()).isEqualTo(contentPosition.y)
     }
 
     @Test
@@ -163,8 +152,7 @@
             Scaffold(
                 bottomBar = {
                     Box(
-                        Modifier
-                            .fillMaxWidth()
+                        Modifier.fillMaxWidth()
                             .height(50.dp)
                             .background(color = Color.Red)
                             .onGloballyPositioned { positioned: LayoutCoordinates ->
@@ -175,8 +163,7 @@
                 }
             ) {
                 Box(
-                    Modifier
-                        .fillMaxSize()
+                    Modifier.fillMaxSize()
                         .height(50.dp)
                         .background(color = Color.Blue)
                         .onGloballyPositioned { positioned: LayoutCoordinates ->
@@ -201,8 +188,7 @@
                 Scaffold(
                     drawerContent = {
                         Box(
-                            Modifier
-                                .fillMaxWidth()
+                            Modifier.fillMaxWidth()
                                 .height(50.dp)
                                 .background(color = Color.Blue)
                                 .onGloballyPositioned { positioned: LayoutCoordinates ->
@@ -212,36 +198,21 @@
                     },
                     drawerGesturesEnabled = drawerGesturedEnabledState.value
                 ) {
-                    Box(
-                        Modifier
-                            .fillMaxWidth()
-                            .height(50.dp)
-                            .background(color = Color.Blue)
-                    )
+                    Box(Modifier.fillMaxWidth().height(50.dp).background(color = Color.Blue))
                 }
             }
         }
         assertThat(drawerChildPosition.x).isLessThan(0f)
-        rule.onNodeWithTag(scaffoldTag).performTouchInput {
-            swipeRight()
-        }
+        rule.onNodeWithTag(scaffoldTag).performTouchInput { swipeRight() }
         assertThat(drawerChildPosition.x).isLessThan(0f)
-        rule.onNodeWithTag(scaffoldTag).performTouchInput {
-            swipeLeft()
-        }
+        rule.onNodeWithTag(scaffoldTag).performTouchInput { swipeLeft() }
         assertThat(drawerChildPosition.x).isLessThan(0f)
 
-        rule.runOnUiThread {
-            drawerGesturedEnabledState.value = true
-        }
+        rule.runOnUiThread { drawerGesturedEnabledState.value = true }
 
-        rule.onNodeWithTag(scaffoldTag).performTouchInput {
-            swipeRight()
-        }
+        rule.onNodeWithTag(scaffoldTag).performTouchInput { swipeRight() }
         assertThat(drawerChildPosition.x).isEqualTo(0f)
-        rule.onNodeWithTag(scaffoldTag).performTouchInput {
-            swipeLeft()
-        }
+        rule.onNodeWithTag(scaffoldTag).performTouchInput { swipeLeft() }
         assertThat(drawerChildPosition.x).isLessThan(0f)
     }
 
@@ -257,8 +228,7 @@
                     scaffoldState = scaffoldState,
                     drawerContent = {
                         Box(
-                            Modifier
-                                .fillMaxWidth()
+                            Modifier.fillMaxWidth()
                                 .height(50.dp)
                                 .background(color = Color.Blue)
                                 .onGloballyPositioned { positioned: LayoutCoordinates ->
@@ -267,12 +237,7 @@
                         )
                     }
                 ) {
-                    Box(
-                        Modifier
-                            .fillMaxWidth()
-                            .height(50.dp)
-                            .background(color = Color.Blue)
-                    )
+                    Box(Modifier.fillMaxWidth().height(50.dp).background(color = Color.Blue))
                 }
             }
         }
@@ -292,10 +257,11 @@
             Scaffold(
                 floatingActionButton = {
                     FloatingActionButton(
-                        modifier = Modifier.onGloballyPositioned { positioned ->
-                            fabSize = positioned.size
-                            fabPosition = positioned.positionInRoot()
-                        },
+                        modifier =
+                            Modifier.onGloballyPositioned { positioned ->
+                                fabSize = positioned.size
+                                fabPosition = positioned.positionInRoot()
+                            },
                         onClick = {}
                     ) {
                         Icon(Icons.Filled.Favorite, null)
@@ -305,19 +271,16 @@
                 isFloatingActionButtonDocked = true,
                 bottomBar = {
                     BottomAppBar(
-                        Modifier
-                            .onGloballyPositioned { positioned: LayoutCoordinates ->
-                                bottomBarPosition = positioned.positionInRoot()
-                            }
+                        Modifier.onGloballyPositioned { positioned: LayoutCoordinates ->
+                            bottomBarPosition = positioned.positionInRoot()
+                        }
                     ) {}
                 }
             ) {
                 Text("body")
             }
         }
-        with(rule.density) {
-            assertThat(fabPosition.x).isWithin(1f).of(fabSpacing.toPx())
-        }
+        with(rule.density) { assertThat(fabPosition.x).isWithin(1f).of(fabSpacing.toPx()) }
         val expectedFabY = bottomBarPosition.y - (fabSize.height / 2)
         assertThat(fabPosition.y).isEqualTo(expectedFabY)
     }
@@ -331,10 +294,11 @@
             Scaffold(
                 floatingActionButton = {
                     FloatingActionButton(
-                        modifier = Modifier.onGloballyPositioned { positioned ->
-                            fabSize = positioned.size
-                            fabPosition = positioned.positionInRoot()
-                        },
+                        modifier =
+                            Modifier.onGloballyPositioned { positioned ->
+                                fabSize = positioned.size
+                                fabPosition = positioned.positionInRoot()
+                            },
                         onClick = {}
                     ) {
                         Icon(Icons.Filled.Favorite, null)
@@ -344,10 +308,9 @@
                 isFloatingActionButtonDocked = true,
                 bottomBar = {
                     BottomAppBar(
-                        Modifier
-                            .onGloballyPositioned { positioned: LayoutCoordinates ->
-                                bottomBarPosition = positioned.positionInRoot()
-                            }
+                        Modifier.onGloballyPositioned { positioned: LayoutCoordinates ->
+                            bottomBarPosition = positioned.positionInRoot()
+                        }
                     ) {}
                 }
             ) {
@@ -355,9 +318,9 @@
             }
         }
         with(rule.density) {
-            assertThat(fabPosition.x).isWithin(1f).of(
-                (rule.rootWidth().toPx() - fabSize.width) / 2f
-            )
+            assertThat(fabPosition.x)
+                .isWithin(1f)
+                .of((rule.rootWidth().toPx() - fabSize.width) / 2f)
         }
         val expectedFabY = bottomBarPosition.y - (fabSize.height / 2)
         assertThat(fabPosition.y).isEqualTo(expectedFabY)
@@ -372,10 +335,11 @@
             Scaffold(
                 floatingActionButton = {
                     FloatingActionButton(
-                        modifier = Modifier.onGloballyPositioned { positioned ->
-                            fabSize = positioned.size
-                            fabPosition = positioned.positionInRoot()
-                        },
+                        modifier =
+                            Modifier.onGloballyPositioned { positioned ->
+                                fabSize = positioned.size
+                                fabPosition = positioned.positionInRoot()
+                            },
                         onClick = {}
                     ) {
                         Icon(Icons.Filled.Favorite, null)
@@ -385,10 +349,9 @@
                 isFloatingActionButtonDocked = true,
                 bottomBar = {
                     BottomAppBar(
-                        Modifier
-                            .onGloballyPositioned { positioned: LayoutCoordinates ->
-                                bottomBarPosition = positioned.positionInRoot()
-                            }
+                        Modifier.onGloballyPositioned { positioned: LayoutCoordinates ->
+                            bottomBarPosition = positioned.positionInRoot()
+                        }
                     ) {}
                 }
             ) {
@@ -396,9 +359,9 @@
             }
         }
         with(rule.density) {
-            assertThat(fabPosition.x).isWithin(1f).of(
-                rule.rootWidth().toPx() - fabSize.width - fabSpacing.toPx()
-            )
+            assertThat(fabPosition.x)
+                .isWithin(1f)
+                .of(rule.rootWidth().toPx() - fabSize.width - fabSpacing.toPx())
         }
         val expectedFabY = bottomBarPosition.y - (fabSize.height / 2)
         assertThat(fabPosition.y).isEqualTo(expectedFabY)
@@ -409,39 +372,32 @@
     fun scaffold_topAppBarIsDrawnOnTopOfContent() {
         rule.setContent {
             Box(
-                Modifier
-                    .requiredSize(10.dp, 20.dp)
+                Modifier.requiredSize(10.dp, 20.dp)
                     .semantics(mergeDescendants = true) {}
                     .testTag("Scaffold")
             ) {
                 Scaffold(
                     topBar = {
                         Box(
-                            Modifier
-                                .requiredSize(10.dp)
+                            Modifier.requiredSize(10.dp)
                                 .shadow(4.dp)
                                 .zIndex(4f)
                                 .background(color = Color.White)
                         )
                     }
                 ) {
-                    Box(
-                        Modifier
-                            .requiredSize(10.dp)
-                            .background(color = Color.White)
-                    )
+                    Box(Modifier.requiredSize(10.dp).background(color = Color.White))
                 }
             }
         }
 
-        rule.onNodeWithTag("Scaffold")
-            .captureToImage().asAndroidBitmap().apply {
-                // asserts the appbar(top half part) has the shadow
-                val yPos = height / 2 + 2
-                assertThat(Color(getPixel(0, yPos))).isNotEqualTo(Color.White)
-                assertThat(Color(getPixel(width / 2, yPos))).isNotEqualTo(Color.White)
-                assertThat(Color(getPixel(width - 1, yPos))).isNotEqualTo(Color.White)
-            }
+        rule.onNodeWithTag("Scaffold").captureToImage().asAndroidBitmap().apply {
+            // asserts the appbar(top half part) has the shadow
+            val yPos = height / 2 + 2
+            assertThat(Color(getPixel(0, yPos))).isNotEqualTo(Color.White)
+            assertThat(Color(getPixel(width / 2, yPos))).isNotEqualTo(Color.White)
+            assertThat(Color(getPixel(width - 1, yPos))).isNotEqualTo(Color.White)
+        }
     }
 
     @Test
@@ -450,24 +406,24 @@
         val showFab = mutableStateOf(true)
         var fabPlacement: FabPlacement? = null
         rule.setContent {
-            val fab = @Composable {
-                if (showFab.value) {
-                    FloatingActionButton(
-                        modifier = Modifier.onGloballyPositioned { positioned ->
-                            fabSize = positioned.size
-                        },
-                        onClick = {}
-                    ) {
-                        Icon(Icons.Filled.Favorite, null)
+            val fab =
+                @Composable {
+                    if (showFab.value) {
+                        FloatingActionButton(
+                            modifier =
+                                Modifier.onGloballyPositioned { positioned ->
+                                    fabSize = positioned.size
+                                },
+                            onClick = {}
+                        ) {
+                            Icon(Icons.Filled.Favorite, null)
+                        }
                     }
                 }
-            }
             Scaffold(
                 floatingActionButton = fab,
                 floatingActionButtonPosition = FabPosition.End,
-                bottomBar = {
-                    fabPlacement = LocalFabPlacement.current
-                }
+                bottomBar = { fabPlacement = LocalFabPlacement.current }
             ) {
                 Text("body")
             }
@@ -492,26 +448,25 @@
         var actualFabPlacement: FabPlacement? = null
         rule.setContent {
             showFab = remember { mutableStateOf(true) }
-            val animatedFab = @Composable {
-                AnimatedVisibility(visible = showFab.value) {
-                    FloatingActionButton(
-                        modifier = Modifier
-                            .onGloballyPositioned { positioned ->
-                                actualFabSize = positioned.size
-                            }
-                            .testTag(fabTestTag),
-                        onClick = {}
-                    ) {
-                        Icon(Icons.Filled.Favorite, null)
+            val animatedFab =
+                @Composable {
+                    AnimatedVisibility(visible = showFab.value) {
+                        FloatingActionButton(
+                            modifier =
+                                Modifier.onGloballyPositioned { positioned ->
+                                        actualFabSize = positioned.size
+                                    }
+                                    .testTag(fabTestTag),
+                            onClick = {}
+                        ) {
+                            Icon(Icons.Filled.Favorite, null)
+                        }
                     }
                 }
-            }
             Scaffold(
                 floatingActionButton = animatedFab,
                 floatingActionButtonPosition = FabPosition.End,
-                bottomBar = {
-                    actualFabPlacement = LocalFabPlacement.current
-                }
+                bottomBar = { actualFabPlacement = LocalFabPlacement.current }
             ) {
                 Text("body")
             }
@@ -558,8 +513,7 @@
                 scaffoldState = scaffoldState,
                 bottomBar = {
                     Box(
-                        Modifier
-                            .fillMaxWidth()
+                        Modifier.fillMaxWidth()
                             .height(100.dp)
                             .background(color = Color.Red)
                             .onGloballyPositioned { positioned: LayoutCoordinates ->
@@ -585,13 +539,11 @@
     fun scaffold_respectsConsumedWindowInsets() {
         rule.setContent {
             Box(
-                Modifier
-                    .requiredSize(10.dp, 40.dp)
+                Modifier.requiredSize(10.dp, 40.dp)
                     .windowInsetsPadding(WindowInsets(top = 10.dp, bottom = 10.dp))
             ) {
-                Scaffold(
-                    contentWindowInsets = WindowInsets(top = 15.dp, bottom = 15.dp)
-                ) { paddingValues ->
+                Scaffold(contentWindowInsets = WindowInsets(top = 15.dp, bottom = 15.dp)) {
+                    paddingValues ->
                     // Consumed windowInsetsPadding is omitted. This replicates behavior from
                     // Modifier.windowInsetsPadding. (15.dp contentPadding - 10.dp consumedPadding)
                     assertDpIsWithinThreshold(
@@ -604,11 +556,7 @@
                         expected = 5.dp,
                         threshold = roundingError
                     )
-                    Box(
-                        Modifier
-                            .requiredSize(10.dp)
-                            .background(color = Color.White)
-                    )
+                    Box(Modifier.requiredSize(10.dp).background(color = Color.White))
                 }
             }
         }
@@ -621,9 +569,7 @@
             Box(Modifier.requiredSize(10.dp, 40.dp)) {
                 Scaffold(
                     contentWindowInsets = WindowInsets(top = 5.dp, bottom = 3.dp),
-                    topBar = {
-                        Box(Modifier.requiredSize(0.dp))
-                    }
+                    topBar = { Box(Modifier.requiredSize(0.dp)) }
                 ) { paddingValues ->
                     // top is like the collapsed top app bar (i.e. 0dp) + rounding error
                     assertDpIsWithinThreshold(
@@ -637,11 +583,7 @@
                         expected = 3.dp,
                         threshold = roundingError
                     )
-                    Box(
-                        Modifier
-                            .requiredSize(10.dp)
-                            .background(color = Color.White)
-                    )
+                    Box(Modifier.requiredSize(10.dp).background(color = Color.White))
                 }
             }
         }
@@ -654,9 +596,7 @@
             Box(Modifier.requiredSize(10.dp, 40.dp)) {
                 Scaffold(
                     contentWindowInsets = WindowInsets(top = 5.dp, bottom = 3.dp),
-                    bottomBar = {
-                        Box(Modifier.requiredSize(10.dp))
-                    }
+                    bottomBar = { Box(Modifier.requiredSize(10.dp)) }
                 ) { paddingValues ->
                     // bottom is like bottom app bar + rounding error
                     assertDpIsWithinThreshold(
@@ -670,11 +610,7 @@
                         expected = 5.dp,
                         threshold = roundingError
                     )
-                    Box(
-                        Modifier
-                            .requiredSize(10.dp)
-                            .background(color = Color.White)
-                    )
+                    Box(Modifier.requiredSize(10.dp).background(color = Color.White))
                 }
             }
         }
@@ -693,19 +629,17 @@
                 Scaffold(
                     contentWindowInsets = WindowInsets(top = 5.dp, bottom = 3.dp),
                     snackbarHost = {
-                        SnackbarHost(hostState = hostState,
-                            modifier = Modifier
-                                .onGloballyPositioned {
+                        SnackbarHost(
+                            hostState = hostState,
+                            modifier =
+                                Modifier.onGloballyPositioned {
                                     snackbarSize = it.size
                                     snackbarPosition = it.positionInRoot()
-                                })
+                                }
+                        )
                     }
                 ) {
-                    Box(
-                        Modifier
-                            .requiredSize(10.dp)
-                            .background(color = Color.White)
-                    )
+                    Box(Modifier.requiredSize(10.dp).background(color = Color.White))
                 }
             }
         }
@@ -726,21 +660,19 @@
                 Scaffold(
                     contentWindowInsets = WindowInsets(top = 5.dp, bottom = 3.dp),
                     floatingActionButton = {
-                        FloatingActionButton(onClick = {},
-                            modifier = Modifier
-                                .onGloballyPositioned {
+                        FloatingActionButton(
+                            onClick = {},
+                            modifier =
+                                Modifier.onGloballyPositioned {
                                     fabSize = it.size
                                     fabPosition = it.positionInRoot()
-                                }) {
+                                }
+                        ) {
                             Text("Fab")
                         }
                     },
                 ) {
-                    Box(
-                        Modifier
-                            .requiredSize(10.dp)
-                            .background(color = Color.White)
-                    )
+                    Box(Modifier.requiredSize(10.dp).background(color = Color.White))
                 }
             }
         }
@@ -760,22 +692,22 @@
             LookaheadScope {
                 Scaffold {
                     SubcomposeLayout { constraints ->
-                        val measurables = subcompose("second") {
-                            Box(
-                                Modifier
-                                    .size(45.dp)
-                                    .onSizeChanged {
+                        val measurables =
+                            subcompose("second") {
+                                Box(
+                                    Modifier.size(45.dp).onSizeChanged {
                                         onSizeChangedCount++
                                         size = it
                                     }
-                            )
-                        }
+                                )
+                            }
                         val placeables = measurables.map { it.measure(constraints) }
 
                         layout(constraints.maxWidth, constraints.maxHeight) {
                             onPlaceCount++
                             assertWithMessage("Expected onSizeChangedCount to be >= 1")
-                                .that(onSizeChangedCount).isAtLeast(1)
+                                .that(onSizeChangedCount)
+                                .isAtLeast(1)
                             assertThat(size).isNotNull()
                             placeables.forEach { it.place(0, 0) }
                         }
diff --git a/compose/material/material/src/androidInstrumentedTest/kotlin/androidx/compose/material/SliderScreenshotTest.kt b/compose/material/material/src/androidInstrumentedTest/kotlin/androidx/compose/material/SliderScreenshotTest.kt
index b0d8134..1e5c5c8 100644
--- a/compose/material/material/src/androidInstrumentedTest/kotlin/androidx/compose/material/SliderScreenshotTest.kt
+++ b/compose/material/material/src/androidInstrumentedTest/kotlin/androidx/compose/material/SliderScreenshotTest.kt
@@ -46,11 +46,9 @@
 @SdkSuppress(minSdkVersion = Build.VERSION_CODES.O)
 class SliderScreenshotTest {
 
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
-    @get:Rule
-    val screenshotRule = AndroidXScreenshotTestRule(GOLDEN_MATERIAL)
+    @get:Rule val screenshotRule = AndroidXScreenshotTestRule(GOLDEN_MATERIAL)
 
     val wrap = Modifier.requiredWidth(70.dp).wrapContentSize(Alignment.TopStart)
 
@@ -131,13 +129,13 @@
                     value = position,
                     onValueChange = { position = it },
                     steps = 5,
-                    colors = SliderDefaults.colors(
-                        thumbColor = Color.Red,
-                        activeTrackColor = Color.Blue,
-                        activeTickColor = Color.Yellow,
-                        inactiveTickColor = Color.Magenta
-                    )
-
+                    colors =
+                        SliderDefaults.colors(
+                            thumbColor = Color.Red,
+                            activeTrackColor = Color.Blue,
+                            activeTickColor = Color.Yellow,
+                            inactiveTickColor = Color.Magenta
+                        )
                 )
             }
         }
@@ -156,14 +154,14 @@
                     enabled = false,
                     // this is intentionally made to appear as enabled in disabled state for a
                     // brighter test
-                    colors = SliderDefaults.colors(
-                        disabledThumbColor = Color.Blue,
-                        disabledActiveTrackColor = Color.Red,
-                        disabledInactiveTrackColor = Color.Yellow,
-                        disabledActiveTickColor = Color.Magenta,
-                        disabledInactiveTickColor = Color.Cyan
-                    )
-
+                    colors =
+                        SliderDefaults.colors(
+                            disabledThumbColor = Color.Blue,
+                            disabledActiveTrackColor = Color.Red,
+                            disabledInactiveTrackColor = Color.Yellow,
+                            disabledActiveTickColor = Color.Magenta,
+                            disabledInactiveTickColor = Color.Cyan
+                        )
                 )
             }
         }
@@ -171,7 +169,8 @@
     }
 
     private fun assertSliderAgainstGolden(goldenName: String) {
-        rule.onNodeWithTag(wrapperTestTag)
+        rule
+            .onNodeWithTag(wrapperTestTag)
             .captureToImage()
             .assertAgainstGolden(screenshotRule, goldenName)
     }
@@ -233,14 +232,16 @@
                 RangeSlider(
                     value = position,
                     valueRange = 0f..100f,
-                    onValueChange = { position = it }, steps = 9,
-                    colors = SliderDefaults.colors(
-                        thumbColor = Color.Blue,
-                        activeTrackColor = Color.Red,
-                        inactiveTrackColor = Color.Yellow,
-                        activeTickColor = Color.Magenta,
-                        inactiveTickColor = Color.Cyan
-                    )
+                    onValueChange = { position = it },
+                    steps = 9,
+                    colors =
+                        SliderDefaults.colors(
+                            thumbColor = Color.Blue,
+                            activeTrackColor = Color.Red,
+                            inactiveTrackColor = Color.Yellow,
+                            activeTickColor = Color.Magenta,
+                            inactiveTickColor = Color.Cyan
+                        )
                 )
             }
         }
diff --git a/compose/material/material/src/androidInstrumentedTest/kotlin/androidx/compose/material/SliderTest.kt b/compose/material/material/src/androidInstrumentedTest/kotlin/androidx/compose/material/SliderTest.kt
index 82bef6b..b1fb7e1 100644
--- a/compose/material/material/src/androidInstrumentedTest/kotlin/androidx/compose/material/SliderTest.kt
+++ b/compose/material/material/src/androidInstrumentedTest/kotlin/androidx/compose/material/SliderTest.kt
@@ -73,8 +73,7 @@
 class SliderTest {
     private val tag = "slider"
 
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
     @Test
     fun sliderPosition_valueCoercion() {
@@ -87,21 +86,15 @@
                 valueRange = 0f..1f
             )
         }
-        rule.runOnIdle {
-            state.value = 2f
-        }
+        rule.runOnIdle { state.value = 2f }
         rule.onNodeWithTag(tag).assertRangeInfoEquals(ProgressBarRangeInfo(1f, 0f..1f, 0))
-        rule.runOnIdle {
-            state.value = -123145f
-        }
+        rule.runOnIdle { state.value = -123145f }
         rule.onNodeWithTag(tag).assertRangeInfoEquals(ProgressBarRangeInfo(0f, 0f..1f, 0))
     }
 
     @Test(expected = IllegalArgumentException::class)
     fun sliderPosition_stepsThrowWhenLessThanZero() {
-        rule.setContent {
-            Slider(value = 0f, onValueChange = {}, steps = -1)
-        }
+        rule.setContent { Slider(value = 0f, onValueChange = {}, steps = -1) }
     }
 
     @Test
@@ -110,23 +103,22 @@
 
         rule.setMaterialContent {
             Slider(
-                modifier = Modifier.testTag(tag), value = state.value,
+                modifier = Modifier.testTag(tag),
+                value = state.value,
                 onValueChange = { state.value = it }
             )
         }
 
-        rule.onNodeWithTag(tag)
+        rule
+            .onNodeWithTag(tag)
             .assertRangeInfoEquals(ProgressBarRangeInfo(0f, 0f..1f, 0))
             .assert(SemanticsMatcher.keyIsDefined(SemanticsActions.SetProgress))
 
-        rule.runOnUiThread {
-            state.value = 0.5f
-        }
+        rule.runOnUiThread { state.value = 0.5f }
 
         rule.onNodeWithTag(tag).assertRangeInfoEquals(ProgressBarRangeInfo(0.5f, 0f..1f, 0))
 
-        rule.onNodeWithTag(tag)
-            .performSemanticsAction(SemanticsActions.SetProgress) { it(0.7f) }
+        rule.onNodeWithTag(tag).performSemanticsAction(SemanticsActions.SetProgress) { it(0.7f) }
 
         rule.onNodeWithTag(tag).assertRangeInfoEquals(ProgressBarRangeInfo(0.7f, 0f..1f, 0))
     }
@@ -137,23 +129,23 @@
 
         rule.setMaterialContent {
             Slider(
-                modifier = Modifier.testTag(tag), value = state.value,
-                onValueChange = { state.value = it }, steps = 4
+                modifier = Modifier.testTag(tag),
+                value = state.value,
+                onValueChange = { state.value = it },
+                steps = 4
             )
         }
 
-        rule.onNodeWithTag(tag)
+        rule
+            .onNodeWithTag(tag)
             .assertRangeInfoEquals(ProgressBarRangeInfo(0f, 0f..1f, 4))
             .assert(SemanticsMatcher.keyIsDefined(SemanticsActions.SetProgress))
 
-        rule.runOnUiThread {
-            state.value = 0.6f
-        }
+        rule.runOnUiThread { state.value = 0.6f }
 
         rule.onNodeWithTag(tag).assertRangeInfoEquals(ProgressBarRangeInfo(0.6f, 0f..1f, 4))
 
-        rule.onNodeWithTag(tag)
-            .performSemanticsAction(SemanticsActions.SetProgress) { it(0.75f) }
+        rule.onNodeWithTag(tag).performSemanticsAction(SemanticsActions.SetProgress) { it(0.75f) }
 
         rule.onNodeWithTag(tag).assertRangeInfoEquals(ProgressBarRangeInfo(0.8f, 0f..1f, 4))
     }
@@ -164,8 +156,7 @@
             Slider(value = 0f, onValueChange = {}, modifier = Modifier.testTag(tag))
         }
 
-        rule.onNodeWithTag(tag)
-            .assert(SemanticsMatcher.keyIsDefined(SemanticsProperties.Focused))
+        rule.onNodeWithTag(tag).assert(SemanticsMatcher.keyIsDefined(SemanticsProperties.Focused))
     }
 
     @Test
@@ -179,8 +170,7 @@
             )
         }
 
-        rule.onNodeWithTag(tag)
-            .assert(SemanticsMatcher.keyIsDefined(SemanticsProperties.Disabled))
+        rule.onNodeWithTag(tag).assert(SemanticsMatcher.keyIsDefined(SemanticsProperties.Disabled))
     }
 
     @Test
@@ -197,22 +187,17 @@
             )
         }
 
-        rule.runOnUiThread {
-            Truth.assertThat(state.value).isEqualTo(0f)
-        }
+        rule.runOnUiThread { Truth.assertThat(state.value).isEqualTo(0f) }
 
         var expected = 0f
 
-        rule.onNodeWithTag(tag)
-            .performTouchInput {
-                down(center)
-                moveBy(Offset(100f, 0f))
-                up()
-                expected = calculateFraction(left, right, centerX + 100 - slop)
-            }
-        rule.runOnIdle {
-            Truth.assertThat(state.value).isWithin(0.001f).of(expected)
+        rule.onNodeWithTag(tag).performTouchInput {
+            down(center)
+            moveBy(Offset(100f, 0f))
+            up()
+            expected = calculateFraction(left, right, centerX + 100 - slop)
         }
+        rule.runOnIdle { Truth.assertThat(state.value).isWithin(0.001f).of(expected) }
     }
 
     @Test
@@ -229,25 +214,20 @@
             )
         }
 
-        rule.runOnUiThread {
-            Truth.assertThat(state.value).isEqualTo(0f)
-        }
+        rule.runOnUiThread { Truth.assertThat(state.value).isEqualTo(0f) }
 
         var expected = 0f
 
-        rule.onNodeWithTag(tag)
-            .performTouchInput {
-                down(center)
-                moveBy(Offset(width.toFloat(), 0f))
-                moveBy(Offset(-width.toFloat(), 0f))
-                moveBy(Offset(-width.toFloat(), 0f))
-                moveBy(Offset(width.toFloat() + 100f, 0f))
-                up()
-                expected = calculateFraction(left, right, centerX + 100 - slop)
-            }
-        rule.runOnIdle {
-            Truth.assertThat(state.value).isWithin(0.001f).of(expected)
+        rule.onNodeWithTag(tag).performTouchInput {
+            down(center)
+            moveBy(Offset(width.toFloat(), 0f))
+            moveBy(Offset(-width.toFloat(), 0f))
+            moveBy(Offset(-width.toFloat(), 0f))
+            moveBy(Offset(width.toFloat() + 100f, 0f))
+            up()
+            expected = calculateFraction(left, right, centerX + 100 - slop)
         }
+        rule.runOnIdle { Truth.assertThat(state.value).isWithin(0.001f).of(expected) }
     }
 
     @Test
@@ -262,26 +242,19 @@
             )
         }
 
-        rule.runOnUiThread {
-            Truth.assertThat(state.value).isEqualTo(0f)
-        }
+        rule.runOnUiThread { Truth.assertThat(state.value).isEqualTo(0f) }
 
         var expected = 0f
 
-        rule.onNodeWithTag(tag)
-            .performTouchInput {
-                down(Offset(centerX + 50, centerY))
-                up()
-                expected = calculateFraction(left, right, centerX + 50)
-            }
-        rule.runOnIdle {
-            Truth.assertThat(state.value).isWithin(0.001f).of(expected)
+        rule.onNodeWithTag(tag).performTouchInput {
+            down(Offset(centerX + 50, centerY))
+            up()
+            expected = calculateFraction(left, right, centerX + 50)
         }
+        rule.runOnIdle { Truth.assertThat(state.value).isWithin(0.001f).of(expected) }
     }
 
-    /**
-     * Guarantee slider doesn't move as we scroll, tapping still works
-     */
+    /** Guarantee slider doesn't move as we scroll, tapping still works */
     @Test
     fun slider_scrollableContainer() {
         val state = mutableStateOf(0f)
@@ -289,14 +262,16 @@
 
         rule.setContent {
             Column(
-                modifier = Modifier
-                    .height(2000.dp)
-                    .scrollable(
-                        orientation = Orientation.Vertical,
-                        state = rememberScrollableState { delta ->
-                            offset.value += delta
-                            delta
-                        })
+                modifier =
+                    Modifier.height(2000.dp)
+                        .scrollable(
+                            orientation = Orientation.Vertical,
+                            state =
+                                rememberScrollableState { delta ->
+                                    offset.value += delta
+                                    delta
+                                }
+                        )
             ) {
                 Slider(
                     modifier = Modifier.testTag(tag),
@@ -306,17 +281,14 @@
             }
         }
 
-        rule.runOnIdle {
-            Truth.assertThat(offset.value).isEqualTo(0f)
-        }
+        rule.runOnIdle { Truth.assertThat(offset.value).isEqualTo(0f) }
 
         // Just scroll
-        rule.onNodeWithTag(tag, useUnmergedTree = true)
-            .performTouchInput {
-                down(Offset(centerX, centerY))
-                moveBy(Offset(0f, 500f))
-                up()
-            }
+        rule.onNodeWithTag(tag, useUnmergedTree = true).performTouchInput {
+            down(Offset(centerX, centerY))
+            moveBy(Offset(0f, 500f))
+            up()
+        }
 
         rule.runOnIdle {
             Truth.assertThat(offset.value).isGreaterThan(0f)
@@ -325,15 +297,12 @@
 
         // Tap
         var expected = 0f
-        rule.onNodeWithTag(tag, useUnmergedTree = true)
-            .performTouchInput {
-                click(Offset(centerX, centerY))
-                expected = calculateFraction(left, right, centerX)
-            }
-
-        rule.runOnIdle {
-            Truth.assertThat(state.value).isWithin(0.001f).of(expected)
+        rule.onNodeWithTag(tag, useUnmergedTree = true).performTouchInput {
+            click(Offset(centerX, centerY))
+            expected = calculateFraction(left, right, centerX)
         }
+
+        rule.runOnIdle { Truth.assertThat(state.value).isWithin(0.001f).of(expected) }
     }
 
     @Test
@@ -350,22 +319,17 @@
             )
         }
         // change to 1 since [calculateFraction] coerces between 0..1
-        rule.runOnUiThread {
-            rangeEnd.value = 1f
-        }
+        rule.runOnUiThread { rangeEnd.value = 1f }
 
         var expected = 0f
 
-        rule.onNodeWithTag(tag)
-            .performTouchInput {
-                down(Offset(centerX + 50, centerY))
-                up()
-                expected = calculateFraction(left, right, centerX + 50)
-            }
-
-        rule.runOnIdle {
-            Truth.assertThat(state.value).isWithin(0.001f).of(expected)
+        rule.onNodeWithTag(tag).performTouchInput {
+            down(Offset(centerX + 50, centerY))
+            up()
+            expected = calculateFraction(left, right, centerX + 50)
         }
+
+        rule.runOnIdle { Truth.assertThat(state.value).isWithin(0.001f).of(expected) }
     }
 
     @Test
@@ -384,23 +348,18 @@
             }
         }
 
-        rule.runOnUiThread {
-            Truth.assertThat(state.value).isEqualTo(0f)
-        }
+        rule.runOnUiThread { Truth.assertThat(state.value).isEqualTo(0f) }
 
         var expected = 0f
 
-        rule.onNodeWithTag(tag)
-            .performTouchInput {
-                down(center)
-                moveBy(Offset(100f, 0f))
-                up()
-                // subtract here as we're in rtl and going in the opposite direction
-                expected = calculateFraction(left, right, centerX - 100 + slop)
-            }
-        rule.runOnIdle {
-            Truth.assertThat(state.value).isWithin(0.001f).of(expected)
+        rule.onNodeWithTag(tag).performTouchInput {
+            down(center)
+            moveBy(Offset(100f, 0f))
+            up()
+            // subtract here as we're in rtl and going in the opposite direction
+            expected = calculateFraction(left, right, centerX - 100 + slop)
         }
+        rule.runOnIdle { Truth.assertThat(state.value).isWithin(0.001f).of(expected) }
     }
 
     @Test
@@ -419,26 +378,21 @@
             }
         }
 
-        rule.runOnUiThread {
-            Truth.assertThat(state.value).isEqualTo(0f)
-        }
+        rule.runOnUiThread { Truth.assertThat(state.value).isEqualTo(0f) }
 
         var expected = 0f
 
-        rule.onNodeWithTag(tag)
-            .performTouchInput {
-                down(center)
-                moveBy(Offset(width.toFloat(), 0f))
-                moveBy(Offset(-width.toFloat(), 0f))
-                moveBy(Offset(-width.toFloat(), 0f))
-                moveBy(Offset(width.toFloat() + 100f, 0f))
-                up()
-                // subtract here as we're in rtl and going in the opposite direction
-                expected = calculateFraction(left, right, centerX - 100 + slop)
-            }
-        rule.runOnIdle {
-            Truth.assertThat(state.value).isWithin(0.001f).of(expected)
+        rule.onNodeWithTag(tag).performTouchInput {
+            down(center)
+            moveBy(Offset(width.toFloat(), 0f))
+            moveBy(Offset(-width.toFloat(), 0f))
+            moveBy(Offset(-width.toFloat(), 0f))
+            moveBy(Offset(width.toFloat() + 100f, 0f))
+            up()
+            // subtract here as we're in rtl and going in the opposite direction
+            expected = calculateFraction(left, right, centerX - 100 + slop)
         }
+        rule.runOnIdle { Truth.assertThat(state.value).isWithin(0.001f).of(expected) }
     }
 
     @Test
@@ -455,21 +409,16 @@
             }
         }
 
-        rule.runOnUiThread {
-            Truth.assertThat(state.value).isEqualTo(0f)
-        }
+        rule.runOnUiThread { Truth.assertThat(state.value).isEqualTo(0f) }
 
         var expected = 0f
 
-        rule.onNodeWithTag(tag)
-            .performTouchInput {
-                down(Offset(centerX + 50, centerY))
-                up()
-                expected = calculateFraction(left, right, centerX - 50)
-            }
-        rule.runOnIdle {
-            Truth.assertThat(state.value).isWithin(0.001f).of(expected)
+        rule.onNodeWithTag(tag).performTouchInput {
+            down(Offset(centerX + 50, centerY))
+            up()
+            expected = calculateFraction(left, right, centerX - 50)
         }
+        rule.runOnIdle { Truth.assertThat(state.value).isWithin(0.001f).of(expected) }
     }
 
     @Test
@@ -486,30 +435,26 @@
             }
         }
 
-        rule.runOnUiThread {
-            Truth.assertThat(state.value).isEqualTo(0f)
-        }
+        rule.runOnUiThread { Truth.assertThat(state.value).isEqualTo(0f) }
 
         var expected = 0f
 
-        rule.onNodeWithTag(tag)
-            .performTouchInput {
-                down(Offset(centerX + 50, centerY))
-                up()
-                expected = calculateFraction(left, right, centerX - 50)
-            }
-        rule.runOnIdle {
-            Truth.assertThat(state.value).isWithin(0.001f).of(expected)
+        rule.onNodeWithTag(tag).performTouchInput {
+            down(Offset(centerX + 50, centerY))
+            up()
+            expected = calculateFraction(left, right, centerX - 50)
         }
+        rule.runOnIdle { Truth.assertThat(state.value).isWithin(0.001f).of(expected) }
     }
 
-    private fun calculateFraction(left: Float, right: Float, pos: Float) = with(rule.density) {
-        val offset = ThumbRadius.toPx()
-        val start = left + offset
-        val end = right - offset
+    private fun calculateFraction(left: Float, right: Float, pos: Float) =
+        with(rule.density) {
+            val offset = ThumbRadius.toPx()
+            val start = left + offset
+            val end = right - offset
 
-        ((pos - start) / (end - start)).coerceIn(0f, 1f)
-    }
+            ((pos - start) / (end - start)).coerceIn(0f, 1f)
+        }
 
     @Test
     fun slider_sizes() {
@@ -518,7 +463,9 @@
             .setMaterialContentForSizeAssertions(
                 parentMaxWidth = 100.dp,
                 parentMaxHeight = 100.dp
-            ) { Slider(value = state.value, onValueChange = { state.value = it }) }
+            ) {
+                Slider(value = state.value, onValueChange = { state.value = it })
+            }
             .assertHeightIsEqualTo(48.dp)
             .assertWidthIsEqualTo(100.dp)
     }
@@ -527,15 +474,12 @@
     fun slider_min_size() {
         rule.setMaterialContent {
             Box(Modifier.requiredSize(0.dp)) {
-                Slider(
-                    modifier = Modifier.testTag(tag),
-                    value = 0f,
-                    onValueChange = { }
-                )
+                Slider(modifier = Modifier.testTag(tag), value = 0f, onValueChange = {})
             }
         }
 
-        rule.onNodeWithTag(tag)
+        rule
+            .onNodeWithTag(tag)
             .assertWidthIsEqualTo(ThumbRadius * 2)
             .assertHeightIsEqualTo(ThumbRadius * 2)
     }
@@ -549,15 +493,11 @@
             Slider(
                 modifier = Modifier.testTag(tag),
                 value = state.value,
-                onValueChange = {
-                    callCount.value += 1
-                }
+                onValueChange = { callCount.value += 1 }
             )
         }
 
-        rule.runOnIdle {
-            Truth.assertThat(callCount.value).isEqualTo(0f)
-        }
+        rule.runOnIdle { Truth.assertThat(callCount.value).isEqualTo(0f) }
     }
 
     @Test
@@ -569,16 +509,12 @@
             Slider(
                 modifier = Modifier.testTag(tag),
                 value = state.value,
-                onValueChangeFinished = {
-                    callCount.value += 1
-                },
+                onValueChangeFinished = { callCount.value += 1 },
                 onValueChange = { state.value = it }
             )
         }
 
-        rule.runOnIdle {
-            Truth.assertThat(callCount.value).isEqualTo(0)
-        }
+        rule.runOnIdle { Truth.assertThat(callCount.value).isEqualTo(0) }
 
         rule.onNodeWithTag(tag).performTouchInput {
             down(center)
@@ -586,9 +522,7 @@
             up()
         }
 
-        rule.runOnIdle {
-            Truth.assertThat(callCount.value).isEqualTo(1)
-        }
+        rule.runOnIdle { Truth.assertThat(callCount.value).isEqualTo(1) }
     }
 
     @Test
@@ -600,23 +534,16 @@
             Slider(
                 modifier = Modifier.testTag(tag),
                 value = state.value,
-                onValueChangeFinished = {
-                    callCount.value += 1
-                },
+                onValueChangeFinished = { callCount.value += 1 },
                 onValueChange = { state.value = it }
             )
         }
 
-        rule.runOnIdle {
-            Truth.assertThat(callCount.value).isEqualTo(0)
-        }
+        rule.runOnIdle { Truth.assertThat(callCount.value).isEqualTo(0) }
 
-        rule.onNodeWithTag(tag)
-            .performSemanticsAction(SemanticsActions.SetProgress) { it(0.8f) }
+        rule.onNodeWithTag(tag).performSemanticsAction(SemanticsActions.SetProgress) { it(0.8f) }
 
-        rule.runOnIdle {
-            Truth.assertThat(callCount.value).isEqualTo(1)
-        }
+        rule.runOnIdle { Truth.assertThat(callCount.value).isEqualTo(1) }
     }
 
     @Test
@@ -642,19 +569,14 @@
 
         val interactions = mutableListOf<Interaction>()
 
-        scope!!.launch {
-            interactionSource.interactions.collect { interactions.add(it) }
-        }
+        scope!!.launch { interactionSource.interactions.collect { interactions.add(it) } }
 
-        rule.runOnIdle {
-            Truth.assertThat(interactions).isEmpty()
-        }
+        rule.runOnIdle { Truth.assertThat(interactions).isEmpty() }
 
-        rule.onNodeWithTag(tag)
-            .performTouchInput {
-                down(center)
-                moveBy(Offset(100f, 0f))
-            }
+        rule.onNodeWithTag(tag).performTouchInput {
+            down(center)
+            moveBy(Offset(100f, 0f))
+        }
 
         rule.runOnIdle {
             Truth.assertThat(interactions).hasSize(1)
@@ -662,9 +584,7 @@
         }
 
         // Dispose
-        rule.runOnIdle {
-            emitSlider = false
-        }
+        rule.runOnIdle { emitSlider = false }
 
         rule.runOnIdle {
             Truth.assertThat(interactions).hasSize(2)
@@ -690,19 +610,16 @@
             )
         }
 
-        rule.runOnUiThread {
-            Truth.assertThat(state.value).isEqualTo(0f..1f)
-        }
+        rule.runOnUiThread { Truth.assertThat(state.value).isEqualTo(0f..1f) }
 
         var expected = 0f
 
-        rule.onNodeWithTag(tag)
-            .performTouchInput {
-                down(center)
-                moveBy(Offset(slop, 0f))
-                moveBy(Offset(100f, 0f))
-                expected = calculateFraction(left, right, centerX + 100)
-            }
+        rule.onNodeWithTag(tag).performTouchInput {
+            down(center)
+            moveBy(Offset(slop, 0f))
+            moveBy(Offset(100f, 0f))
+            expected = calculateFraction(left, right, centerX + 100)
+        }
         rule.runOnIdle {
             Truth.assertThat(state.value.start).isEqualTo(0f)
             Truth.assertThat(state.value.endInclusive).isWithin(0.001f).of(expected)
@@ -724,23 +641,20 @@
             )
         }
 
-        rule.runOnUiThread {
-            Truth.assertThat(state.value).isEqualTo(0f..1f)
-        }
+        rule.runOnUiThread { Truth.assertThat(state.value).isEqualTo(0f..1f) }
 
         var expected = 0f
 
-        rule.onNodeWithTag(tag)
-            .performTouchInput {
-                down(center)
-                moveBy(Offset(slop, 0f))
-                moveBy(Offset(width.toFloat(), 0f))
-                moveBy(Offset(-width.toFloat(), 0f))
-                moveBy(Offset(-width.toFloat(), 0f))
-                moveBy(Offset(width.toFloat() + 100f, 0f))
-                up()
-                expected = calculateFraction(left, right, centerX + 100)
-            }
+        rule.onNodeWithTag(tag).performTouchInput {
+            down(center)
+            moveBy(Offset(slop, 0f))
+            moveBy(Offset(width.toFloat(), 0f))
+            moveBy(Offset(-width.toFloat(), 0f))
+            moveBy(Offset(-width.toFloat(), 0f))
+            moveBy(Offset(width.toFloat() + 100f, 0f))
+            up()
+            expected = calculateFraction(left, right, centerX + 100)
+        }
         rule.runOnIdle {
             Truth.assertThat(state.value.start).isEqualTo(0f)
             Truth.assertThat(state.value.endInclusive).isWithin(0.001f).of(expected)
@@ -762,27 +676,21 @@
             )
         }
 
-        rule.onNodeWithTag(tag)
-            .performTouchInput {
-                down(centerRight)
-                moveBy(Offset(-slop, 0f))
-                moveBy(Offset(-width.toFloat(), 0f))
-                up()
-            }
-        rule.runOnIdle {
-            Truth.assertThat(state.value).isEqualTo(0.5f..0.5f)
+        rule.onNodeWithTag(tag).performTouchInput {
+            down(centerRight)
+            moveBy(Offset(-slop, 0f))
+            moveBy(Offset(-width.toFloat(), 0f))
+            up()
         }
+        rule.runOnIdle { Truth.assertThat(state.value).isEqualTo(0.5f..0.5f) }
 
-        rule.onNodeWithTag(tag)
-            .performTouchInput {
-                down(center)
-                moveBy(Offset(-slop, 0f))
-                moveBy(Offset(-width.toFloat(), 0f))
-                up()
-            }
-        rule.runOnIdle {
-            Truth.assertThat(state.value).isEqualTo(0.0f..0.5f)
+        rule.onNodeWithTag(tag).performTouchInput {
+            down(center)
+            moveBy(Offset(-slop, 0f))
+            moveBy(Offset(-width.toFloat(), 0f))
+            up()
         }
+        rule.runOnIdle { Truth.assertThat(state.value).isEqualTo(0.0f..0.5f) }
     }
 
     @OptIn(ExperimentalMaterialApi::class)
@@ -798,18 +706,15 @@
             )
         }
 
-        rule.runOnUiThread {
-            Truth.assertThat(state.value).isEqualTo(0f..1f)
-        }
+        rule.runOnUiThread { Truth.assertThat(state.value).isEqualTo(0f..1f) }
 
         var expected = 0f
 
-        rule.onNodeWithTag(tag)
-            .performTouchInput {
-                down(Offset(centerX + 50, centerY))
-                up()
-                expected = calculateFraction(left, right, centerX + 50)
-            }
+        rule.onNodeWithTag(tag).performTouchInput {
+            down(Offset(centerX + 50, centerY))
+            up()
+            expected = calculateFraction(left, right, centerX + 50)
+        }
         rule.runOnIdle {
             Truth.assertThat(state.value.endInclusive).isWithin(0.001f).of(expected)
             Truth.assertThat(state.value.start).isEqualTo(0f)
@@ -831,22 +736,17 @@
             )
         }
         // change to 1 since [calculateFraction] coerces between 0..1
-        rule.runOnUiThread {
-            rangeEnd.value = 1f
-        }
+        rule.runOnUiThread { rangeEnd.value = 1f }
 
         var expected = 0f
 
-        rule.onNodeWithTag(tag)
-            .performTouchInput {
-                down(Offset(centerX + 50, centerY))
-                up()
-                expected = calculateFraction(left, right, centerX + 50)
-            }
-
-        rule.runOnIdle {
-            Truth.assertThat(state.value.endInclusive).isWithin(0.001f).of(expected)
+        rule.onNodeWithTag(tag).performTouchInput {
+            down(Offset(centerX + 50, centerY))
+            up()
+            expected = calculateFraction(left, right, centerX + 50)
         }
+
+        rule.runOnIdle { Truth.assertThat(state.value.endInclusive).isWithin(0.001f).of(expected) }
     }
 
     @OptIn(ExperimentalMaterialApi::class)
@@ -866,21 +766,18 @@
             }
         }
 
-        rule.runOnUiThread {
-            Truth.assertThat(state.value).isEqualTo(0f..1f)
-        }
+        rule.runOnUiThread { Truth.assertThat(state.value).isEqualTo(0f..1f) }
 
         var expected = 0f
 
-        rule.onNodeWithTag(tag)
-            .performTouchInput {
-                down(center)
-                moveBy(Offset(slop, 0f))
-                moveBy(Offset(100f, 0f))
-                up()
-                // subtract here as we're in rtl and going in the opposite direction
-                expected = calculateFraction(left, right, centerX - 100)
-            }
+        rule.onNodeWithTag(tag).performTouchInput {
+            down(center)
+            moveBy(Offset(slop, 0f))
+            moveBy(Offset(100f, 0f))
+            up()
+            // subtract here as we're in rtl and going in the opposite direction
+            expected = calculateFraction(left, right, centerX - 100)
+        }
         rule.runOnIdle {
             Truth.assertThat(state.value.start).isEqualTo(0f)
             Truth.assertThat(state.value.endInclusive).isWithin(0.001f).of(expected)
@@ -904,24 +801,21 @@
             }
         }
 
-        rule.runOnUiThread {
-            Truth.assertThat(state.value).isEqualTo(0f..1f)
-        }
+        rule.runOnUiThread { Truth.assertThat(state.value).isEqualTo(0f..1f) }
 
         var expected = 0f
 
-        rule.onNodeWithTag(tag)
-            .performTouchInput {
-                down(center)
-                moveBy(Offset(slop, 0f))
-                moveBy(Offset(width.toFloat(), 0f))
-                moveBy(Offset(-width.toFloat(), 0f))
-                moveBy(Offset(-width.toFloat(), 0f))
-                moveBy(Offset(width.toFloat() + 100f, 0f))
-                up()
-                // subtract here as we're in rtl and going in the opposite direction
-                expected = calculateFraction(left, right, centerX - 100)
-            }
+        rule.onNodeWithTag(tag).performTouchInput {
+            down(center)
+            moveBy(Offset(slop, 0f))
+            moveBy(Offset(width.toFloat(), 0f))
+            moveBy(Offset(-width.toFloat(), 0f))
+            moveBy(Offset(-width.toFloat(), 0f))
+            moveBy(Offset(width.toFloat() + 100f, 0f))
+            up()
+            // subtract here as we're in rtl and going in the opposite direction
+            expected = calculateFraction(left, right, centerX - 100)
+        }
         rule.runOnIdle {
             Truth.assertThat(state.value.start).isEqualTo(0f)
             Truth.assertThat(state.value.endInclusive).isWithin(0.001f).of(expected)
@@ -943,21 +837,18 @@
             )
         }
 
-        rule.runOnUiThread {
-            Truth.assertThat(state.value).isEqualTo(0.5f..0.5f)
-        }
+        rule.runOnUiThread { Truth.assertThat(state.value).isEqualTo(0.5f..0.5f) }
 
         var expected = 0f
 
-        rule.onNodeWithTag(tag)
-            .performTouchInput {
-                down(center)
-                moveBy(Offset(slop, 0f))
-                moveBy(Offset(100f, 0f))
-                up()
-                // subtract here as we're in rtl and going in the opposite direction
-                expected = calculateFraction(left, right, centerX + 100)
-            }
+        rule.onNodeWithTag(tag).performTouchInput {
+            down(center)
+            moveBy(Offset(slop, 0f))
+            moveBy(Offset(100f, 0f))
+            up()
+            // subtract here as we're in rtl and going in the opposite direction
+            expected = calculateFraction(left, right, centerX + 100)
+        }
         rule.runOnIdle {
             Truth.assertThat(state.value.start).isEqualTo(0.5f)
             Truth.assertThat(state.value.endInclusive).isWithin(0.001f).of(expected)
@@ -979,21 +870,18 @@
             )
         }
 
-        rule.runOnUiThread {
-            Truth.assertThat(state.value).isEqualTo(0.5f..0.5f)
-        }
+        rule.runOnUiThread { Truth.assertThat(state.value).isEqualTo(0.5f..0.5f) }
 
         var expected = 0f
 
-        rule.onNodeWithTag(tag)
-            .performTouchInput {
-                down(center)
-                moveBy(Offset(-slop - 1, 0f))
-                moveBy(Offset(-100f, 0f))
-                up()
-                // subtract here as we're in rtl and going in the opposite direction
-                expected = calculateFraction(left, right, centerX - 100)
-            }
+        rule.onNodeWithTag(tag).performTouchInput {
+            down(center)
+            moveBy(Offset(-slop - 1, 0f))
+            moveBy(Offset(-100f, 0f))
+            up()
+            // subtract here as we're in rtl and going in the opposite direction
+            expected = calculateFraction(left, right, centerX - 100)
+        }
         rule.runOnIdle {
             Truth.assertThat(state.value.start).isWithin(0.001f).of(expected)
             Truth.assertThat(state.value.endInclusive).isEqualTo(0.5f)
@@ -1014,9 +902,10 @@
                     RangeSlider(
                         value = 0f..0.5f,
                         onValueChange = {},
-                        modifier = Modifier.testTag(tag).weight(1f).onGloballyPositioned {
-                            sliderBounds = it.boundsInParent()
-                        }
+                        modifier =
+                            Modifier.testTag(tag).weight(1f).onGloballyPositioned {
+                                sliderBounds = it.boundsInParent()
+                            }
                     )
                     Spacer(Modifier.requiredSize(100.toDp()))
                 }
@@ -1036,49 +925,50 @@
 
         rule.setMaterialContent {
             RangeSlider(
-                modifier = Modifier.testTag(tag), value = state.value,
+                modifier = Modifier.testTag(tag),
+                value = state.value,
                 onValueChange = { state.value = it }
             )
         }
 
-        rule.onAllNodes(isFocusable(), true)[0]
+        rule
+            .onAllNodes(isFocusable(), true)[0]
             .assertRangeInfoEquals(ProgressBarRangeInfo(0f, 0f..1f, 0))
             .assert(SemanticsMatcher.keyIsDefined(SemanticsActions.SetProgress))
 
-        rule.onAllNodes(isFocusable(), true)[1]
+        rule
+            .onAllNodes(isFocusable(), true)[1]
             .assertRangeInfoEquals(ProgressBarRangeInfo(1f, 0f..1f, 0))
             .assert(SemanticsMatcher.keyIsDefined(SemanticsActions.SetProgress))
 
-        rule.runOnUiThread {
-            state.value = 0.5f..0.75f
+        rule.runOnUiThread { state.value = 0.5f..0.75f }
+
+        rule
+            .onAllNodes(isFocusable(), true)[0]
+            .assertRangeInfoEquals(ProgressBarRangeInfo(0.5f, 0f..0.75f, 0))
+
+        rule
+            .onAllNodes(isFocusable(), true)[1]
+            .assertRangeInfoEquals(ProgressBarRangeInfo(0.75f, 0.5f..1f, 0))
+
+        rule.onAllNodes(isFocusable(), true)[0].performSemanticsAction(
+            SemanticsActions.SetProgress
+        ) {
+            it(0.6f)
         }
 
-        rule.onAllNodes(isFocusable(), true)[0].assertRangeInfoEquals(
-            ProgressBarRangeInfo(
-                0.5f,
-                0f..0.75f,
-                0
-            )
-        )
+        rule.onAllNodes(isFocusable(), true)[1].performSemanticsAction(
+            SemanticsActions.SetProgress
+        ) {
+            it(0.8f)
+        }
 
-        rule.onAllNodes(isFocusable(), true)[1].assertRangeInfoEquals(
-            ProgressBarRangeInfo(
-                0.75f,
-                0.5f..1f,
-                0
-            )
-        )
-
-        rule.onAllNodes(isFocusable(), true)[0]
-            .performSemanticsAction(SemanticsActions.SetProgress) { it(0.6f) }
-
-        rule.onAllNodes(isFocusable(), true)[1]
-            .performSemanticsAction(SemanticsActions.SetProgress) { it(0.8f) }
-
-        rule.onAllNodes(isFocusable(), true)[0]
+        rule
+            .onAllNodes(isFocusable(), true)[0]
             .assertRangeInfoEquals(ProgressBarRangeInfo(0.6f, 0f..0.8f, 0))
 
-        rule.onAllNodes(isFocusable(), true)[1]
+        rule
+            .onAllNodes(isFocusable(), true)[1]
             .assertRangeInfoEquals(ProgressBarRangeInfo(0.8f, 0.6f..1f, 0))
     }
 
@@ -1089,43 +979,48 @@
         // Slider with [0,5,10,15,20] possible values
         rule.setMaterialContent {
             RangeSlider(
-                modifier = Modifier.testTag(tag), value = state.value,
+                modifier = Modifier.testTag(tag),
+                value = state.value,
                 steps = 3,
                 valueRange = 0f..20f,
                 onValueChange = { state.value = it },
             )
         }
 
-        rule.runOnUiThread {
-            state.value = 5f..10f
+        rule.runOnUiThread { state.value = 5f..10f }
+
+        rule
+            .onAllNodes(isFocusable(), true)[0]
+            .assertRangeInfoEquals(ProgressBarRangeInfo(5f, 0f..10f, 1))
+
+        rule
+            .onAllNodes(isFocusable(), true)[1]
+            .assertRangeInfoEquals(
+                ProgressBarRangeInfo(
+                    10f,
+                    5f..20f,
+                    2,
+                )
+            )
+
+        rule.onAllNodes(isFocusable(), true)[0].performSemanticsAction(
+            SemanticsActions.SetProgress
+        ) {
+            it(10f)
         }
 
-        rule.onAllNodes(isFocusable(), true)[0].assertRangeInfoEquals(
-            ProgressBarRangeInfo(
-                5f,
-                0f..10f,
-                1
-            )
-        )
+        rule.onAllNodes(isFocusable(), true)[1].performSemanticsAction(
+            SemanticsActions.SetProgress
+        ) {
+            it(15f)
+        }
 
-        rule.onAllNodes(isFocusable(), true)[1].assertRangeInfoEquals(
-            ProgressBarRangeInfo(
-                10f,
-                5f..20f,
-                2,
-            )
-        )
-
-        rule.onAllNodes(isFocusable(), true)[0]
-            .performSemanticsAction(SemanticsActions.SetProgress) { it(10f) }
-
-        rule.onAllNodes(isFocusable(), true)[1]
-            .performSemanticsAction(SemanticsActions.SetProgress) { it(15f) }
-
-        rule.onAllNodes(isFocusable(), true)[0]
+        rule
+            .onAllNodes(isFocusable(), true)[0]
             .assertRangeInfoEquals(ProgressBarRangeInfo(10f, 0f..15f, 2))
 
-        rule.onAllNodes(isFocusable(), true)[1]
+        rule
+            .onAllNodes(isFocusable(), true)[1]
             .assertRangeInfoEquals(ProgressBarRangeInfo(15f, 10f..20f, 1))
     }
 }
diff --git a/compose/material/material/src/androidInstrumentedTest/kotlin/androidx/compose/material/SnackbarHostTest.kt b/compose/material/material/src/androidInstrumentedTest/kotlin/androidx/compose/material/SnackbarHostTest.kt
index fc208b9..ffbb3ba 100644
--- a/compose/material/material/src/androidInstrumentedTest/kotlin/androidx/compose/material/SnackbarHostTest.kt
+++ b/compose/material/material/src/androidInstrumentedTest/kotlin/androidx/compose/material/SnackbarHostTest.kt
@@ -53,8 +53,7 @@
 @LargeTest
 class SnackbarHostTest {
 
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
     @Test
     fun snackbarHost_observePushedData() {
@@ -70,14 +69,15 @@
                 }
             }
         }
-        val job = scope.launch {
-            hostState.showSnackbar("1")
-            Truth.assertThat(resultedInvocation).isEqualTo("1")
-            hostState.showSnackbar("2")
-            Truth.assertThat(resultedInvocation).isEqualTo("12")
-            hostState.showSnackbar("3")
-            Truth.assertThat(resultedInvocation).isEqualTo("123")
-        }
+        val job =
+            scope.launch {
+                hostState.showSnackbar("1")
+                Truth.assertThat(resultedInvocation).isEqualTo("1")
+                hostState.showSnackbar("2")
+                Truth.assertThat(resultedInvocation).isEqualTo("12")
+                hostState.showSnackbar("3")
+                Truth.assertThat(resultedInvocation).isEqualTo("123")
+            }
 
         rule.waitUntil { job.isCompleted }
     }
@@ -118,26 +118,22 @@
         lateinit var scope: CoroutineScope
         rule.setContent {
             scope = rememberCoroutineScope()
-            SnackbarHost(hostState) { data ->
-                Snackbar(data)
+            SnackbarHost(hostState) { data -> Snackbar(data) }
+        }
+        val job1 =
+            scope.launch {
+                val result = hostState.showSnackbar("1", actionLabel = "press")
+                Truth.assertThat(result).isEqualTo(SnackbarResult.ActionPerformed)
             }
-        }
-        val job1 = scope.launch {
-            val result = hostState.showSnackbar("1", actionLabel = "press")
-            Truth.assertThat(result).isEqualTo(SnackbarResult.ActionPerformed)
-        }
-        rule.onNodeWithText("press")
-            .performClick()
+        rule.onNodeWithText("press").performClick()
 
         rule.waitUntil { job1.isCompleted }
 
-        val job2 = scope.launch {
-            val result = hostState.showSnackbar(
-                message = "1",
-                actionLabel = "do not press"
-            )
-            Truth.assertThat(result).isEqualTo(SnackbarResult.Dismissed)
-        }
+        val job2 =
+            scope.launch {
+                val result = hostState.showSnackbar(message = "1", actionLabel = "do not press")
+                Truth.assertThat(result).isEqualTo(SnackbarResult.Dismissed)
+            }
 
         rule.mainClock.advanceTimeBy(5_000)
         rule.waitUntil { job2.isCompleted }
@@ -152,18 +148,18 @@
             if (switchState.value) {
                 scope = rememberCoroutineScope()
             }
-            SnackbarHost(hostState) { data ->
-                Snackbar(data)
+            SnackbarHost(hostState) { data -> Snackbar(data) }
+        }
+        val job1 =
+            scope.launch {
+                hostState.showSnackbar("1")
+                Truth.assertWithMessage("Result shouldn't happen due to cancellation").fail()
             }
-        }
-        val job1 = scope.launch {
-            hostState.showSnackbar("1")
-            Truth.assertWithMessage("Result shouldn't happen due to cancellation").fail()
-        }
-        val job2 = scope.launch {
-            delay(10)
-            switchState.value = false
-        }
+        val job2 =
+            scope.launch {
+                delay(10)
+                switchState.value = false
+            }
 
         rule.waitUntil { job1.isCompleted && job2.isCompleted }
     }
@@ -174,15 +170,17 @@
         lateinit var scope: CoroutineScope
         rule.setContent {
             scope = rememberCoroutineScope()
-            SnackbarHost(hostState) { data ->
-                Snackbar(data)
+            SnackbarHost(hostState) { data -> Snackbar(data) }
+        }
+        val job1 =
+            scope.launch {
+                val result = hostState.showSnackbar("1", actionLabel = "press")
+                Truth.assertThat(result).isEqualTo(SnackbarResult.Dismissed)
             }
-        }
-        val job1 = scope.launch {
-            val result = hostState.showSnackbar("1", actionLabel = "press")
-            Truth.assertThat(result).isEqualTo(SnackbarResult.Dismissed)
-        }
-        rule.onNodeWithText("1").onParent().onParent()
+        rule
+            .onNodeWithText("1")
+            .onParent()
+            .onParent()
             .assert(
                 SemanticsMatcher.expectValue(SemanticsProperties.LiveRegion, LiveRegionMode.Polite)
             )
@@ -235,29 +233,11 @@
 
     @Test
     fun snackbarDuration_toMillis_nullAccessibilityManager() {
-        assertEquals(
-            Long.MAX_VALUE,
-            SnackbarDuration.Indefinite.toMillis(true, null)
-        )
-        assertEquals(
-            Long.MAX_VALUE,
-            SnackbarDuration.Indefinite.toMillis(false, null)
-        )
-        assertEquals(
-            10000L,
-            SnackbarDuration.Long.toMillis(true, null)
-        )
-        assertEquals(
-            10000L,
-            SnackbarDuration.Long.toMillis(false, null)
-        )
-        assertEquals(
-            4000L,
-            SnackbarDuration.Short.toMillis(true, null)
-        )
-        assertEquals(
-            4000L,
-            SnackbarDuration.Short.toMillis(false, null)
-        )
+        assertEquals(Long.MAX_VALUE, SnackbarDuration.Indefinite.toMillis(true, null))
+        assertEquals(Long.MAX_VALUE, SnackbarDuration.Indefinite.toMillis(false, null))
+        assertEquals(10000L, SnackbarDuration.Long.toMillis(true, null))
+        assertEquals(10000L, SnackbarDuration.Long.toMillis(false, null))
+        assertEquals(4000L, SnackbarDuration.Short.toMillis(true, null))
+        assertEquals(4000L, SnackbarDuration.Short.toMillis(false, null))
     }
 }
diff --git a/compose/material/material/src/androidInstrumentedTest/kotlin/androidx/compose/material/SnackbarTest.kt b/compose/material/material/src/androidInstrumentedTest/kotlin/androidx/compose/material/SnackbarTest.kt
index 0df30f3..1c4df61 100644
--- a/compose/material/material/src/androidInstrumentedTest/kotlin/androidx/compose/material/SnackbarTest.kt
+++ b/compose/material/material/src/androidInstrumentedTest/kotlin/androidx/compose/material/SnackbarTest.kt
@@ -62,11 +62,11 @@
 @RunWith(AndroidJUnit4::class)
 class SnackbarTest {
 
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
-    private val longText = "Message is very long and long and long and long and long " +
-        "and long and long and long and long and long and long"
+    private val longText =
+        "Message is very long and long and long and long and long " +
+            "and long and long and long and long and long and long"
 
     @Test
     fun defaultSnackbar_semantics() {
@@ -75,22 +75,16 @@
             Box {
                 Snackbar(
                     content = { Text("Message") },
-                    action = {
-                        TextButton(onClick = { clicked = true }) {
-                            Text("UNDO")
-                        }
-                    }
+                    action = { TextButton(onClick = { clicked = true }) { Text("UNDO") } }
                 )
             }
         }
 
-        rule.onNodeWithText("Message")
-            .assertExists()
+        rule.onNodeWithText("Message").assertExists()
 
         assertThat(clicked).isFalse()
 
-        rule.onNodeWithText("UNDO")
-            .performClick()
+        rule.onNodeWithText("UNDO").performClick()
 
         assertThat(clicked).isTrue()
     }
@@ -114,23 +108,20 @@
                 Box(Modifier.testTag("content").size(contentSize))
             }
         }
-        rule.onNodeWithTag("content")
+        rule
+            .onNodeWithTag("content")
             .assertTopPositionInRootIsEqualTo((snackbarHeight - contentSize) / 2)
     }
 
     @Test
     fun snackbar_shortTextOnly_defaultSizes() {
-        val snackbar = rule.setMaterialContentForSizeAssertions(
-            parentMaxWidth = 300.dp
-        ) {
-            Snackbar(
-                content = {
-                    Text("Message")
+        val snackbar =
+            rule
+                .setMaterialContentForSizeAssertions(parentMaxWidth = 300.dp) {
+                    Snackbar(content = { Text("Message") })
                 }
-            )
-        }
-            .assertWidthIsEqualTo(300.dp)
-            .assertHeightIsEqualTo(48.dp)
+                .assertWidthIsEqualTo(300.dp)
+                .assertHeightIsEqualTo(48.dp)
 
         val firstBaseLine = rule.onNodeWithText("Message").getAlignmentLinePosition(FirstBaseline)
         val lastBaseLine = rule.onNodeWithText("Message").getAlignmentLinePosition(LastBaseline)
@@ -148,16 +139,12 @@
 
     @Test
     fun snackbar_shortTextOnly_bigFont_centered() {
-        val snackbar = rule.setMaterialContentForSizeAssertions(
-            parentMaxWidth = 300.dp
-        ) {
-            Snackbar(
-                content = {
-                    Text("Message", fontSize = 30.sp)
+        val snackbar =
+            rule
+                .setMaterialContentForSizeAssertions(parentMaxWidth = 300.dp) {
+                    Snackbar(content = { Text("Message", fontSize = 30.sp) })
                 }
-            )
-        }
-            .assertWidthIsEqualTo(300.dp)
+                .assertWidthIsEqualTo(300.dp)
 
         val firstBaseLine = rule.onNodeWithText("Message").getAlignmentLinePosition(FirstBaseline)
         val lastBaseLine = rule.onNodeWithText("Message").getAlignmentLinePosition(LastBaseline)
@@ -175,25 +162,23 @@
 
     @Test
     fun snackbar_shortTextAndButton_alignment() {
-        val snackbar = rule.setMaterialContentForSizeAssertions(
-            parentMaxWidth = 300.dp
-        ) {
-            Snackbar(
-                content = {
-                    Text("Message")
-                },
-                action = {
-                    TextButton(
-                        onClick = {},
-                        modifier = Modifier.clipToBounds().testTag("button")
-                    ) {
-                        Text("Undo")
-                    }
+        val snackbar =
+            rule
+                .setMaterialContentForSizeAssertions(parentMaxWidth = 300.dp) {
+                    Snackbar(
+                        content = { Text("Message") },
+                        action = {
+                            TextButton(
+                                onClick = {},
+                                modifier = Modifier.clipToBounds().testTag("button")
+                            ) {
+                                Text("Undo")
+                            }
+                        }
+                    )
                 }
-            )
-        }
-            .assertWidthIsEqualTo(300.dp)
-            .assertHeightIsEqualTo(48.dp)
+                .assertWidthIsEqualTo(300.dp)
+                .assertHeightIsEqualTo(48.dp)
 
         val textBaseLine = rule.onNodeWithText("Message").getAlignmentLinePosition(FirstBaseline)
         val buttonBaseLine = rule.onNodeWithTag("button").getAlignmentLinePosition(FirstBaseline)
@@ -214,24 +199,18 @@
 
     @Test
     fun snackbar_shortTextAndButton_bigFont_alignment() {
-        val snackbar = rule.setMaterialContentForSizeAssertions(
-            parentMaxWidth = 400.dp
-        ) {
-            val fontSize = 30.sp
-            Snackbar(
-                content = {
-                    Text("Message", fontSize = fontSize)
-                },
-                action = {
-                    TextButton(
-                        onClick = {},
-                        modifier = Modifier.testTag("button")
-                    ) {
-                        Text("Undo", fontSize = fontSize)
+        val snackbar =
+            rule.setMaterialContentForSizeAssertions(parentMaxWidth = 400.dp) {
+                val fontSize = 30.sp
+                Snackbar(
+                    content = { Text("Message", fontSize = fontSize) },
+                    action = {
+                        TextButton(onClick = {}, modifier = Modifier.testTag("button")) {
+                            Text("Undo", fontSize = fontSize)
+                        }
                     }
-                }
-            )
-        }
+                )
+            }
 
         val textBaseLine = rule.onNodeWithText("Message").getAlignmentLinePosition(FirstBaseline)
         val buttonBaseLine = rule.onNodeWithTag("button").getAlignmentLinePosition(FirstBaseline)
@@ -252,17 +231,13 @@
 
     @Test
     fun snackbar_longText_sizes() {
-        val snackbar = rule.setMaterialContentForSizeAssertions(
-            parentMaxWidth = 300.dp
-        ) {
-            Snackbar(
-                content = {
-                    Text(longText, Modifier.testTag("text"), maxLines = 2)
+        val snackbar =
+            rule
+                .setMaterialContentForSizeAssertions(parentMaxWidth = 300.dp) {
+                    Snackbar(content = { Text(longText, Modifier.testTag("text"), maxLines = 2) })
                 }
-            )
-        }
-            .assertWidthIsEqualTo(300.dp)
-            .assertHeightIsEqualTo(68.dp)
+                .assertWidthIsEqualTo(300.dp)
+                .assertHeightIsEqualTo(68.dp)
 
         val firstBaseline = rule.onNodeWithTag("text").getFirstBaselinePosition()
         val lastBaseline = rule.onNodeWithTag("text").getLastBaselinePosition()
@@ -282,25 +257,20 @@
 
     @Test
     fun snackbar_longTextAndButton_alignment() {
-        val snackbar = rule.setMaterialContentForSizeAssertions(
-            parentMaxWidth = 300.dp
-        ) {
-            Snackbar(
-                content = {
-                    Text(longText, Modifier.testTag("text"), maxLines = 2)
-                },
-                action = {
-                    TextButton(
-                        modifier = Modifier.testTag("button"),
-                        onClick = {}
-                    ) {
-                        Text("Undo")
-                    }
+        val snackbar =
+            rule
+                .setMaterialContentForSizeAssertions(parentMaxWidth = 300.dp) {
+                    Snackbar(
+                        content = { Text(longText, Modifier.testTag("text"), maxLines = 2) },
+                        action = {
+                            TextButton(modifier = Modifier.testTag("button"), onClick = {}) {
+                                Text("Undo")
+                            }
+                        }
+                    )
                 }
-            )
-        }
-            .assertWidthIsEqualTo(300.dp)
-            .assertHeightIsEqualTo(68.dp)
+                .assertWidthIsEqualTo(300.dp)
+                .assertHeightIsEqualTo(68.dp)
 
         val textFirstBaseLine = rule.onNodeWithTag("text").getFirstBaselinePosition()
         val textLastBaseLine = rule.onNodeWithTag("text").getLastBaselinePosition()
@@ -309,8 +279,7 @@
         textLastBaseLine.assertIsNotEqualTo(0.dp, "last baseline")
         textFirstBaseLine.assertIsNotEqualTo(textLastBaseLine, "first baseline")
 
-        rule.onNodeWithTag("text")
-            .assertTopPositionInRootIsEqualTo(30.dp - textFirstBaseLine)
+        rule.onNodeWithTag("text").assertTopPositionInRootIsEqualTo(30.dp - textFirstBaseLine)
 
         val buttonBounds = rule.onNodeWithTag("button").getUnclippedBoundsInRoot()
         val snackBounds = snackbar.getUnclippedBoundsInRoot()
@@ -321,38 +290,35 @@
 
     @Test
     fun snackbar_textAndButtonOnSeparateLine_alignment() {
-        val snackbar = rule.setMaterialContentForSizeAssertions(
-            parentMaxWidth = 300.dp
-        ) {
-            Snackbar(
-                content = {
-                    Text("Message", Modifier.sizeIn(minWidth = 48.dp, minHeight = 48.dp))
-                },
-                action = {
-                    TextButton(
-                        onClick = {},
-                        modifier = Modifier.testTag("button")
-                    ) {
-                        Text("Undo", Modifier.sizeIn(minWidth = 48.dp, minHeight = 48.dp))
-                    }
-                },
-                actionOnNewLine = true
-            )
-        }
+        val snackbar =
+            rule.setMaterialContentForSizeAssertions(parentMaxWidth = 300.dp) {
+                Snackbar(
+                    content = {
+                        Text("Message", Modifier.sizeIn(minWidth = 48.dp, minHeight = 48.dp))
+                    },
+                    action = {
+                        TextButton(onClick = {}, modifier = Modifier.testTag("button")) {
+                            Text("Undo", Modifier.sizeIn(minWidth = 48.dp, minHeight = 48.dp))
+                        }
+                    },
+                    actionOnNewLine = true
+                )
+            }
 
         val textFirstBaseLine = rule.onNodeWithText("Message").getFirstBaselinePosition()
         val textLastBaseLine = rule.onNodeWithText("Message").getLastBaselinePosition()
         val textBounds = rule.onNodeWithText("Message").getUnclippedBoundsInRoot()
         val buttonBounds = rule.onNodeWithTag("button").getUnclippedBoundsInRoot()
 
-        rule.onNodeWithText("Message")
-            .assertTopPositionInRootIsEqualTo(30.dp - textFirstBaseLine)
+        rule.onNodeWithText("Message").assertTopPositionInRootIsEqualTo(30.dp - textFirstBaseLine)
 
         val lastBaselineToBottom = max(18.dp, 48.dp - textLastBaseLine)
 
-        rule.onNodeWithTag("button").assertTopPositionInRootIsEqualTo(
-            lastBaselineToBottom + textBounds.top + textLastBaseLine
-        )
+        rule
+            .onNodeWithTag("button")
+            .assertTopPositionInRootIsEqualTo(
+                lastBaselineToBottom + textBounds.top + textLastBaseLine
+            )
 
         snackbar
             .assertHeightIsEqualTo(2.dp + buttonBounds.top + buttonBounds.height)
@@ -371,20 +337,20 @@
                 background = MaterialTheme.colors.surface
                 // Snackbar has a background color of onSurface with an alpha applied blended
                 // on top of surface
-                snackBarColor = MaterialTheme.colors.onSurface.copy(alpha = 0.8f)
-                    .compositeOver(background)
+                snackBarColor =
+                    MaterialTheme.colors.onSurface.copy(alpha = 0.8f).compositeOver(background)
                 CompositionLocalProvider(LocalShapes provides Shapes(medium = shape)) {
                     Snackbar(
-                        modifier = Modifier
-                            .semantics(mergeDescendants = true) {}
-                            .testTag("snackbar"),
+                        modifier =
+                            Modifier.semantics(mergeDescendants = true) {}.testTag("snackbar"),
                         content = { Text("") }
                     )
                 }
             }
         }
 
-        rule.onNodeWithTag("snackbar")
+        rule
+            .onNodeWithTag("snackbar")
             .captureToImage()
             .assertShape(
                 density = rule.density,
@@ -398,30 +364,25 @@
     @Test
     fun defaultSnackbar_dataVersion_proxiesParameters() {
         var clicked = false
-        val snackbarData = object : SnackbarData {
-            override val message: String = "Data message"
-            override val actionLabel: String? = "UNDO"
-            override val duration: SnackbarDuration = SnackbarDuration.Short
+        val snackbarData =
+            object : SnackbarData {
+                override val message: String = "Data message"
+                override val actionLabel: String? = "UNDO"
+                override val duration: SnackbarDuration = SnackbarDuration.Short
 
-            override fun performAction() {
-                clicked = true
+                override fun performAction() {
+                    clicked = true
+                }
+
+                override fun dismiss() {}
             }
+        rule.setMaterialContent { Box { Snackbar(snackbarData = snackbarData) } }
 
-            override fun dismiss() {}
-        }
-        rule.setMaterialContent {
-            Box {
-                Snackbar(snackbarData = snackbarData)
-            }
-        }
-
-        rule.onNodeWithText("Data message")
-            .assertExists()
+        rule.onNodeWithText("Data message").assertExists()
 
         assertThat(clicked).isFalse()
 
-        rule.onNodeWithText("UNDO")
-            .performClick()
+        rule.onNodeWithText("UNDO").performClick()
 
         assertThat(clicked).isTrue()
     }
diff --git a/compose/material/material/src/androidInstrumentedTest/kotlin/androidx/compose/material/SurfaceContentColorTest.kt b/compose/material/material/src/androidInstrumentedTest/kotlin/androidx/compose/material/SurfaceContentColorTest.kt
index 19e6b98..742df3e 100644
--- a/compose/material/material/src/androidInstrumentedTest/kotlin/androidx/compose/material/SurfaceContentColorTest.kt
+++ b/compose/material/material/src/androidInstrumentedTest/kotlin/androidx/compose/material/SurfaceContentColorTest.kt
@@ -29,16 +29,14 @@
 @RunWith(AndroidJUnit4::class)
 class SurfaceContentColorTest {
 
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
     @Test
     fun surfaceSetsCorrectContentColors_primary() {
         rule.setContent {
             MaterialTheme {
                 Surface(color = MaterialTheme.colors.primary) {
-                    assertThat(LocalContentColor.current)
-                        .isEqualTo(MaterialTheme.colors.onPrimary)
+                    assertThat(LocalContentColor.current).isEqualTo(MaterialTheme.colors.onPrimary)
                 }
             }
         }
@@ -73,8 +71,7 @@
         rule.setContent {
             MaterialTheme {
                 Surface(color = MaterialTheme.colors.surface) {
-                    assertThat(LocalContentColor.current)
-                        .isEqualTo(MaterialTheme.colors.onSurface)
+                    assertThat(LocalContentColor.current).isEqualTo(MaterialTheme.colors.onSurface)
                 }
             }
         }
diff --git a/compose/material/material/src/androidInstrumentedTest/kotlin/androidx/compose/material/SurfaceTest.kt b/compose/material/material/src/androidInstrumentedTest/kotlin/androidx/compose/material/SurfaceTest.kt
index f288a88..9c59dab 100644
--- a/compose/material/material/src/androidInstrumentedTest/kotlin/androidx/compose/material/SurfaceTest.kt
+++ b/compose/material/material/src/androidInstrumentedTest/kotlin/androidx/compose/material/SurfaceTest.kt
@@ -76,29 +76,20 @@
 @RunWith(AndroidJUnit4::class)
 class SurfaceTest {
 
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
     @SdkSuppress(minSdkVersion = Build.VERSION_CODES.O)
     @Test
     fun originalOrderingWhenTheDefaultElevationIsUsed() {
         rule.setMaterialContent {
-            Box(
-                Modifier
-                    .size(10.dp, 10.dp)
-                    .semantics(mergeDescendants = true) {}
-                    .testTag("box")
-            ) {
-                Surface(color = Color.Yellow) {
-                    Box(Modifier.fillMaxSize())
-                }
-                Surface(color = Color.Green) {
-                    Box(Modifier.fillMaxSize())
-                }
+            Box(Modifier.size(10.dp, 10.dp).semantics(mergeDescendants = true) {}.testTag("box")) {
+                Surface(color = Color.Yellow) { Box(Modifier.fillMaxSize()) }
+                Surface(color = Color.Green) { Box(Modifier.fillMaxSize()) }
             }
         }
 
-        rule.onNodeWithTag("box")
+        rule
+            .onNodeWithTag("box")
             .captureToImage()
             .assertShape(
                 density = rule.density,
@@ -115,9 +106,7 @@
         rule.setMaterialContent {
             Surface(elevation = 2.dp) {
                 outerElevation = LocalAbsoluteElevation.current
-                Surface(elevation = 4.dp) {
-                    innerElevation = LocalAbsoluteElevation.current
-                }
+                Surface(elevation = 4.dp) { innerElevation = LocalAbsoluteElevation.current }
             }
         }
 
@@ -133,8 +122,7 @@
         rule.setMaterialContent {
             Column {
                 Box(
-                    Modifier
-                        .padding(10.dp)
+                    Modifier.padding(10.dp)
                         .size(10.dp, 10.dp)
                         .semantics(mergeDescendants = true) {}
                         .testTag("top level")
@@ -150,8 +138,7 @@
                 // Nested surface to increase the absolute elevation
                 Surface(elevation = 2.dp) {
                     Box(
-                        Modifier
-                            .padding(10.dp)
+                        Modifier.padding(10.dp)
                             .size(10.dp, 10.dp)
                             .semantics(mergeDescendants = true) {}
                             .testTag("nested")
@@ -168,12 +155,9 @@
         }
 
         val topLevelSurfaceBitmap = rule.onNodeWithTag("top level").captureToImage()
-        val nestedSurfaceBitmap = rule.onNodeWithTag("nested").captureToImage()
-            .asAndroidBitmap()
+        val nestedSurfaceBitmap = rule.onNodeWithTag("nested").captureToImage().asAndroidBitmap()
 
-        topLevelSurfaceBitmap.assertPixels {
-            Color(nestedSurfaceBitmap.getPixel(it.x, it.y))
-        }
+        topLevelSurfaceBitmap.assertPixels { Color(nestedSurfaceBitmap.getPixel(it.x, it.y)) }
     }
 
     /**
@@ -198,9 +182,7 @@
             }
         }
 
-        rule.runOnIdle {
-            Truth.assertThat(contentColor).isEqualTo(expectedColor)
-        }
+        rule.runOnIdle { Truth.assertThat(contentColor).isEqualTo(expectedColor) }
     }
 
     @ExperimentalMaterialApi
@@ -208,15 +190,13 @@
     fun clickableOverload_semantics() {
         val count = mutableStateOf(0)
         rule.setMaterialContent {
-            Surface(
-                onClick = { count.value += 1 },
-                modifier = Modifier.testTag("surface")
-            ) {
+            Surface(onClick = { count.value += 1 }, modifier = Modifier.testTag("surface")) {
                 Text("${count.value}")
                 Spacer(Modifier.size(30.dp))
             }
         }
-        rule.onNodeWithTag("surface")
+        rule
+            .onNodeWithTag("surface")
             .assertHasClickAction()
             .assert(SemanticsMatcher.keyNotDefined(SemanticsProperties.Role))
             .assertIsEnabled()
@@ -239,7 +219,8 @@
                 Spacer(Modifier.size(30.dp))
             }
         }
-        rule.onNodeWithTag("surface")
+        rule
+            .onNodeWithTag("surface")
             .assertHasClickAction()
             .assert(SemanticsMatcher.expectValue(SemanticsProperties.Role, Role.Checkbox))
             .assertIsEnabled()
@@ -254,20 +235,14 @@
     fun clickableOverload_clickAction() {
         val count = mutableStateOf(0f)
         rule.setMaterialContent {
-            Surface(
-                modifier = Modifier.testTag("surface"),
-                onClick = { count.value += 1 }
-            ) {
+            Surface(modifier = Modifier.testTag("surface"), onClick = { count.value += 1 }) {
                 Spacer(Modifier.size(30.dp))
             }
         }
-        rule.onNodeWithTag("surface")
-            .performClick()
+        rule.onNodeWithTag("surface").performClick()
         Truth.assertThat(count.value).isEqualTo(1)
 
-        rule.onNodeWithTag("surface")
-            .performClick()
-            .performClick()
+        rule.onNodeWithTag("surface").performClick().performClick()
         Truth.assertThat(count.value).isEqualTo(3)
     }
 
@@ -285,19 +260,12 @@
                 Spacer(Modifier.size(30.dp))
             }
         }
-        rule.onNodeWithTag("surface")
-            .assertIsEnabled()
-            .performClick()
+        rule.onNodeWithTag("surface").assertIsEnabled().performClick()
 
         Truth.assertThat(count.value).isEqualTo(1)
-        rule.runOnIdle {
-            enabled.value = false
-        }
+        rule.runOnIdle { enabled.value = false }
 
-        rule.onNodeWithTag("surface")
-            .assertIsNotEnabled()
-            .performClick()
-            .performClick()
+        rule.onNodeWithTag("surface").assertIsNotEnabled().performClick().performClick()
         Truth.assertThat(count.value).isEqualTo(1)
     }
 
@@ -321,24 +289,18 @@
 
         val interactions = mutableListOf<Interaction>()
 
-        scope!!.launch {
-            interactionSource.interactions.collect { interactions.add(it) }
-        }
+        scope!!.launch { interactionSource.interactions.collect { interactions.add(it) } }
 
-        rule.runOnIdle {
-            Truth.assertThat(interactions).isEmpty()
-        }
+        rule.runOnIdle { Truth.assertThat(interactions).isEmpty() }
 
-        rule.onNodeWithTag("surface")
-            .performTouchInput { down(center) }
+        rule.onNodeWithTag("surface").performTouchInput { down(center) }
 
         rule.runOnIdle {
             Truth.assertThat(interactions).hasSize(1)
             Truth.assertThat(interactions.first()).isInstanceOf(PressInteraction.Press::class.java)
         }
 
-        rule.onNodeWithTag("surface")
-            .performTouchInput { up() }
+        rule.onNodeWithTag("surface").performTouchInput { up() }
 
         rule.runOnIdle {
             Truth.assertThat(interactions).hasSize(2)
@@ -362,7 +324,8 @@
                 Spacer(Modifier.size(30.dp))
             }
         }
-        rule.onNodeWithTag("surface")
+        rule
+            .onNodeWithTag("surface")
             .assertHasClickAction()
             .assert(SemanticsMatcher.keyNotDefined(SemanticsProperties.Role))
             .assertIsEnabled()
@@ -385,7 +348,8 @@
                 Spacer(Modifier.size(30.dp))
             }
         }
-        rule.onNodeWithTag("surface")
+        rule
+            .onNodeWithTag("surface")
             .assertHasClickAction()
             .assert(SemanticsMatcher.expectValue(SemanticsProperties.Role, Role.Switch))
             .assertIsEnabled()
@@ -403,7 +367,9 @@
                 selected = selected.value,
                 onClick = { selected.value = !selected.value },
                 modifier = Modifier.testTag("surface")
-            ) { Spacer(Modifier.size(30.dp)) }
+            ) {
+                Spacer(Modifier.size(30.dp))
+            }
         }
         rule.onNodeWithTag("surface").performClick()
         Truth.assertThat(selected.value).isTrue()
@@ -421,7 +387,9 @@
                 onClick = { selected.value = !selected.value },
                 modifier = Modifier.testTag("surface"),
                 shape = CircleShape
-            ) { Spacer(Modifier.size(100.dp)) }
+            ) {
+                Spacer(Modifier.size(100.dp))
+            }
         }
         // Click inside the circular shape bounds. Expecting a selection change.
         rule.onNodeWithTag("surface").performClick()
@@ -441,7 +409,9 @@
                 onClick = { selected.value = !selected.value },
                 modifier = Modifier.testTag("surface"),
                 shape = CircleShape
-            ) { Spacer(Modifier.size(40.dp)) }
+            ) {
+                Spacer(Modifier.size(40.dp))
+            }
         }
         // Click inside the circular shape bounds. Expecting a selection change.
         rule.onNodeWithTag("surface").performClick()
@@ -466,7 +436,8 @@
                 Spacer(Modifier.size(30.dp))
             }
         }
-        rule.onNodeWithTag("surface")
+        rule
+            .onNodeWithTag("surface")
             .assertHasClickAction()
             .assert(SemanticsMatcher.keyNotDefined(SemanticsProperties.Role))
             .assertIsEnabled()
@@ -489,7 +460,8 @@
                 Spacer(Modifier.size(30.dp))
             }
         }
-        rule.onNodeWithTag("surface")
+        rule
+            .onNodeWithTag("surface")
             .assertHasClickAction()
             .assert(SemanticsMatcher.expectValue(SemanticsProperties.Role, Role.Tab))
             .assertIsEnabled()
@@ -507,7 +479,9 @@
                 checked = toggled.value,
                 onCheckedChange = { toggled.value = !toggled.value },
                 modifier = Modifier.testTag("surface")
-            ) { Spacer(Modifier.size(30.dp)) }
+            ) {
+                Spacer(Modifier.size(30.dp))
+            }
         }
         rule.onNodeWithTag("surface").performClick()
         Truth.assertThat(toggled.value).isTrue()
@@ -525,7 +499,9 @@
                 onCheckedChange = { checked.value = !checked.value },
                 modifier = Modifier.testTag("surface"),
                 shape = CircleShape
-            ) { Spacer(Modifier.size(100.dp)) }
+            ) {
+                Spacer(Modifier.size(100.dp))
+            }
         }
         // Click inside the circular shape bounds. Expecting a checked state change.
         rule.onNodeWithTag("surface").performClick()
@@ -545,7 +521,9 @@
                 onCheckedChange = { checked.value = !checked.value },
                 modifier = Modifier.testTag("surface"),
                 shape = CircleShape
-            ) { Spacer(Modifier.size(40.dp)) }
+            ) {
+                Spacer(Modifier.size(40.dp))
+            }
         }
         // Click inside the circular shape bounds. Expecting a checked state change.
         rule.onNodeWithTag("surface").performClick()
@@ -573,9 +551,7 @@
                 ) {}
             }
         }
-        rule.onNodeWithTag("clickable")
-            .assertHasClickAction()
-            .performClick()
+        rule.onNodeWithTag("clickable").assertHasClickAction().performClick()
         // still 0
         Truth.assertThat(state.value).isEqualTo(0)
     }
@@ -590,26 +566,21 @@
                     Modifier.fillMaxSize().testTag("surface"),
                 ) {
                     Box(
-                        Modifier
-                            .fillMaxSize()
-                            .testTag("clickable")
-                            .pointerInput(Unit) {
-                                awaitEachGesture {
-                                    hitTested.value = true
-                                    val event = awaitPointerEvent(PointerEventPass.Final)
-                                    Truth.assertThat(event.changes[0].isConsumed)
-                                        .isFalse()
-                                }
+                        Modifier.fillMaxSize().testTag("clickable").pointerInput(Unit) {
+                            awaitEachGesture {
+                                hitTested.value = true
+                                val event = awaitPointerEvent(PointerEventPass.Final)
+                                Truth.assertThat(event.changes[0].isConsumed).isFalse()
                             }
+                        }
                     )
                 }
             }
         }
-        rule.onNodeWithTag("clickable")
-            .performTouchInput {
-                down(center)
-                up()
-            }
+        rule.onNodeWithTag("clickable").performTouchInput {
+            down(center)
+            up()
+        }
         Truth.assertThat(hitTested.value).isTrue()
     }
 }
diff --git a/compose/material/material/src/androidInstrumentedTest/kotlin/androidx/compose/material/SwipeToDismissTest.kt b/compose/material/material/src/androidInstrumentedTest/kotlin/androidx/compose/material/SwipeToDismissTest.kt
index 5b012b5..7475570 100644
--- a/compose/material/material/src/androidInstrumentedTest/kotlin/androidx/compose/material/SwipeToDismissTest.kt
+++ b/compose/material/material/src/androidInstrumentedTest/kotlin/androidx/compose/material/SwipeToDismissTest.kt
@@ -45,8 +45,7 @@
 @OptIn(ExperimentalMaterialApi::class)
 class SwipeToDismissTest {
 
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
     private val backgroundTag = "background"
     private val dismissContentTag = "dismissContent"
@@ -61,13 +60,12 @@
         rule.setContent {
             SwipeToDismiss(
                 state = rememberDismissState(DismissValue.Default),
-                background = { },
+                background = {},
                 dismissContent = { Box(Modifier.fillMaxSize().testTag(dismissContentTag)) }
             )
         }
 
-        rule.onNodeWithTag(dismissContentTag)
-            .assertLeftPositionInRootIsEqualTo(0.dp)
+        rule.onNodeWithTag(dismissContentTag).assertLeftPositionInRootIsEqualTo(0.dp)
     }
 
     @Test
@@ -75,14 +73,13 @@
         rule.setContent {
             SwipeToDismiss(
                 state = rememberDismissState(DismissValue.DismissedToEnd),
-                background = { },
+                background = {},
                 dismissContent = { Box(Modifier.fillMaxSize().testTag(dismissContentTag)) }
             )
         }
 
         val width = rule.rootWidth()
-        rule.onNodeWithTag(dismissContentTag)
-            .assertLeftPositionInRootIsEqualTo(width)
+        rule.onNodeWithTag(dismissContentTag).assertLeftPositionInRootIsEqualTo(width)
     }
 
     @Test
@@ -90,14 +87,13 @@
         rule.setContent {
             SwipeToDismiss(
                 state = rememberDismissState(DismissValue.DismissedToStart),
-                background = { },
+                background = {},
                 dismissContent = { Box(Modifier.fillMaxSize().testTag(dismissContentTag)) }
             )
         }
 
         val width = rule.rootWidth()
-        rule.onNodeWithTag(dismissContentTag)
-            .assertLeftPositionInRootIsEqualTo(-width)
+        rule.onNodeWithTag(dismissContentTag).assertLeftPositionInRootIsEqualTo(-width)
     }
 
     @Test
@@ -110,8 +106,7 @@
             )
         }
 
-        rule.onNodeWithTag(backgroundTag)
-            .assertIsSquareWithSize(100.dp)
+        rule.onNodeWithTag(backgroundTag).assertIsSquareWithSize(100.dp)
     }
 
     @Ignore("Fix test in a follow-up CL. b/179501119")
@@ -122,43 +117,38 @@
             dismissState = rememberDismissState(DismissValue.Default)
             SwipeToDismiss(
                 state = dismissState,
-                background = { },
+                background = {},
                 dismissContent = { Box(Modifier.fillMaxSize().testTag(dismissContentTag)) }
             )
         }
 
         val width = rule.rootWidth()
 
-        rule.onNodeWithTag(dismissContentTag)
-            .assertLeftPositionInRootIsEqualTo(0.dp)
+        rule.onNodeWithTag(dismissContentTag).assertLeftPositionInRootIsEqualTo(0.dp)
 
         dismissState.dismiss(DismissDirection.StartToEnd)
 
         advanceClock()
 
-        rule.onNodeWithTag(dismissContentTag)
-            .assertLeftPositionInRootIsEqualTo(width)
+        rule.onNodeWithTag(dismissContentTag).assertLeftPositionInRootIsEqualTo(width)
 
         dismissState.reset()
 
         advanceClock()
 
-        rule.onNodeWithTag(dismissContentTag)
-            .assertLeftPositionInRootIsEqualTo(0.dp)
+        rule.onNodeWithTag(dismissContentTag).assertLeftPositionInRootIsEqualTo(0.dp)
 
         dismissState.dismiss(DismissDirection.EndToStart)
 
         advanceClock()
 
-        rule.onNodeWithTag(dismissContentTag)
-            .assertLeftPositionInRootIsEqualTo(-width)
+        rule.onNodeWithTag(dismissContentTag).assertLeftPositionInRootIsEqualTo(-width)
 
         dismissState.reset()
 
         advanceClock()
 
-        rule.onNodeWithTag(dismissContentTag)
-            .assertLeftPositionInRootIsEqualTo(0.dp)
+        rule.onNodeWithTag(dismissContentTag).assertLeftPositionInRootIsEqualTo(0.dp)
     }
 
     @Test
@@ -170,7 +160,7 @@
                 modifier = Modifier.testTag(swipeToDismissTag),
                 state = dismissState,
                 directions = setOf(DismissDirection.StartToEnd),
-                background = { },
+                background = {},
                 dismissContent = { Box(Modifier.fillMaxSize()) }
             )
         }
@@ -193,7 +183,7 @@
                 modifier = Modifier.testTag(swipeToDismissTag),
                 state = dismissState,
                 directions = setOf(DismissDirection.EndToStart),
-                background = { },
+                background = {},
                 dismissContent = { Box(Modifier.fillMaxSize()) }
             )
         }
@@ -217,7 +207,7 @@
                     modifier = Modifier.testTag(swipeToDismissTag),
                     state = dismissState,
                     directions = setOf(DismissDirection.StartToEnd),
-                    background = { },
+                    background = {},
                     dismissContent = { Box(Modifier.fillMaxSize()) }
                 )
             }
@@ -242,7 +232,7 @@
                     modifier = Modifier.testTag(swipeToDismissTag),
                     state = dismissState,
                     directions = setOf(DismissDirection.EndToStart),
-                    background = { },
+                    background = {},
                     dismissContent = { Box(Modifier.fillMaxSize()) }
                 )
             }
@@ -266,7 +256,7 @@
                 modifier = Modifier.testTag(swipeToDismissTag),
                 state = dismissState,
                 directions = setOf(),
-                background = { },
+                background = {},
                 dismissContent = { Box(Modifier.fillMaxSize()) }
             )
         }
@@ -275,16 +265,12 @@
 
         advanceClock()
 
-        rule.runOnIdle {
-            assertThat(dismissState.currentValue).isEqualTo(DismissValue.Default)
-        }
+        rule.runOnIdle { assertThat(dismissState.currentValue).isEqualTo(DismissValue.Default) }
 
         rule.onNodeWithTag(swipeToDismissTag).performTouchInput { swipeLeft() }
 
         advanceClock()
 
-        rule.runOnIdle {
-            assertThat(dismissState.currentValue).isEqualTo(DismissValue.Default)
-        }
+        rule.runOnIdle { assertThat(dismissState.currentValue).isEqualTo(DismissValue.Default) }
     }
 }
diff --git a/compose/material/material/src/androidInstrumentedTest/kotlin/androidx/compose/material/SwipeableTest.kt b/compose/material/material/src/androidInstrumentedTest/kotlin/androidx/compose/material/SwipeableTest.kt
index a686c33..d01e374 100644
--- a/compose/material/material/src/androidInstrumentedTest/kotlin/androidx/compose/material/SwipeableTest.kt
+++ b/compose/material/material/src/androidInstrumentedTest/kotlin/androidx/compose/material/SwipeableTest.kt
@@ -70,8 +70,7 @@
 @OptIn(ExperimentalMaterialApi::class)
 class SwipeableTest {
 
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
     private val swipeableTag = "swipeableTag"
 
@@ -85,9 +84,7 @@
         isDebugInspectorInfoEnabled = false
     }
 
-    /**
-     * Tests that [swipeable] detects horizontal swipes and ignores vertical swipes.
-     */
+    /** Tests that [swipeable] detects horizontal swipes and ignores vertical swipes. */
     @Test
     fun swipeable_horizontalSwipe() {
         lateinit var state: SwipeableState<String>
@@ -101,42 +98,30 @@
             )
         }
 
-        rule.runOnIdle {
-            assertThat(state.currentValue).isEqualTo("A")
-        }
+        rule.runOnIdle { assertThat(state.currentValue).isEqualTo("A") }
 
         swipeRight()
         advanceClock()
 
-        rule.runOnIdle {
-            assertThat(state.currentValue).isEqualTo("B")
-        }
+        rule.runOnIdle { assertThat(state.currentValue).isEqualTo("B") }
 
         swipeLeft()
         advanceClock()
 
-        rule.runOnIdle {
-            assertThat(state.currentValue).isEqualTo("A")
-        }
+        rule.runOnIdle { assertThat(state.currentValue).isEqualTo("A") }
 
         swipeDown()
         advanceClock()
 
-        rule.runOnIdle {
-            assertThat(state.currentValue).isEqualTo("A")
-        }
+        rule.runOnIdle { assertThat(state.currentValue).isEqualTo("A") }
 
         swipeUp()
         advanceClock()
 
-        rule.runOnIdle {
-            assertThat(state.currentValue).isEqualTo("A")
-        }
+        rule.runOnIdle { assertThat(state.currentValue).isEqualTo("A") }
     }
 
-    /**
-     * Tests that [swipeable] detects vertical swipes and ignores horizontal swipes.
-     */
+    /** Tests that [swipeable] detects vertical swipes and ignores horizontal swipes. */
     @Test
     fun swipeable_verticalSwipe() {
         lateinit var state: SwipeableState<String>
@@ -150,42 +135,30 @@
             )
         }
 
-        rule.runOnIdle {
-            assertThat(state.currentValue).isEqualTo("A")
-        }
+        rule.runOnIdle { assertThat(state.currentValue).isEqualTo("A") }
 
         swipeDown()
         advanceClock()
 
-        rule.runOnIdle {
-            assertThat(state.currentValue).isEqualTo("B")
-        }
+        rule.runOnIdle { assertThat(state.currentValue).isEqualTo("B") }
 
         swipeUp()
         advanceClock()
 
-        rule.runOnIdle {
-            assertThat(state.currentValue).isEqualTo("A")
-        }
+        rule.runOnIdle { assertThat(state.currentValue).isEqualTo("A") }
 
         swipeRight()
         advanceClock()
 
-        rule.runOnIdle {
-            assertThat(state.currentValue).isEqualTo("A")
-        }
+        rule.runOnIdle { assertThat(state.currentValue).isEqualTo("A") }
 
         swipeLeft()
         advanceClock()
 
-        rule.runOnIdle {
-            assertThat(state.currentValue).isEqualTo("A")
-        }
+        rule.runOnIdle { assertThat(state.currentValue).isEqualTo("A") }
     }
 
-    /**
-     * Tests that [swipeable] ignores horizontal swipes.
-     */
+    /** Tests that [swipeable] ignores horizontal swipes. */
     @Test
     fun swipeable_disabled_horizontal() {
         lateinit var state: SwipeableState<String>
@@ -200,28 +173,20 @@
             )
         }
 
-        rule.runOnIdle {
-            assertThat(state.currentValue).isEqualTo("A")
-        }
+        rule.runOnIdle { assertThat(state.currentValue).isEqualTo("A") }
 
         swipeRight()
         advanceClock()
 
-        rule.runOnIdle {
-            assertThat(state.currentValue).isEqualTo("A")
-        }
+        rule.runOnIdle { assertThat(state.currentValue).isEqualTo("A") }
 
         swipeLeft()
         advanceClock()
 
-        rule.runOnIdle {
-            assertThat(state.currentValue).isEqualTo("A")
-        }
+        rule.runOnIdle { assertThat(state.currentValue).isEqualTo("A") }
     }
 
-    /**
-     * Tests that [swipeable] ignores vertical swipes.
-     */
+    /** Tests that [swipeable] ignores vertical swipes. */
     @Test
     fun swipeable_disabled_vertical() {
         lateinit var state: SwipeableState<String>
@@ -236,28 +201,20 @@
             )
         }
 
-        rule.runOnIdle {
-            assertThat(state.currentValue).isEqualTo("A")
-        }
+        rule.runOnIdle { assertThat(state.currentValue).isEqualTo("A") }
 
         swipeDown()
         advanceClock()
 
-        rule.runOnIdle {
-            assertThat(state.currentValue).isEqualTo("A")
-        }
+        rule.runOnIdle { assertThat(state.currentValue).isEqualTo("A") }
 
         swipeUp()
         advanceClock()
 
-        rule.runOnIdle {
-            assertThat(state.currentValue).isEqualTo("A")
-        }
+        rule.runOnIdle { assertThat(state.currentValue).isEqualTo("A") }
     }
 
-    /**
-     * Tests that [swipeable] reverses the direction of horizontal swipes.
-     */
+    /** Tests that [swipeable] reverses the direction of horizontal swipes. */
     @Test
     fun swipeable_reverseDirection_horizontal() {
         lateinit var state: SwipeableState<String>
@@ -272,35 +229,25 @@
             )
         }
 
-        rule.runOnIdle {
-            assertThat(state.currentValue).isEqualTo("A")
-        }
+        rule.runOnIdle { assertThat(state.currentValue).isEqualTo("A") }
 
         swipeRight()
         advanceClock()
 
-        rule.runOnIdle {
-            assertThat(state.currentValue).isEqualTo("A")
-        }
+        rule.runOnIdle { assertThat(state.currentValue).isEqualTo("A") }
 
         swipeLeft()
         advanceClock()
 
-        rule.runOnIdle {
-            assertThat(state.currentValue).isEqualTo("B")
-        }
+        rule.runOnIdle { assertThat(state.currentValue).isEqualTo("B") }
 
         swipeRight()
         advanceClock()
 
-        rule.runOnIdle {
-            assertThat(state.currentValue).isEqualTo("A")
-        }
+        rule.runOnIdle { assertThat(state.currentValue).isEqualTo("A") }
     }
 
-    /**
-     * Tests that [swipeable] reverses the direction of vertical swipes.
-     */
+    /** Tests that [swipeable] reverses the direction of vertical swipes. */
     @Test
     fun swipeable_reverseDirection_vertical() {
         lateinit var state: SwipeableState<String>
@@ -315,35 +262,25 @@
             )
         }
 
-        rule.runOnIdle {
-            assertThat(state.currentValue).isEqualTo("A")
-        }
+        rule.runOnIdle { assertThat(state.currentValue).isEqualTo("A") }
 
         swipeDown()
         advanceClock()
 
-        rule.runOnIdle {
-            assertThat(state.currentValue).isEqualTo("A")
-        }
+        rule.runOnIdle { assertThat(state.currentValue).isEqualTo("A") }
 
         swipeUp()
         advanceClock()
 
-        rule.runOnIdle {
-            assertThat(state.currentValue).isEqualTo("B")
-        }
+        rule.runOnIdle { assertThat(state.currentValue).isEqualTo("B") }
 
         swipeDown()
         advanceClock()
 
-        rule.runOnIdle {
-            assertThat(state.currentValue).isEqualTo("A")
-        }
+        rule.runOnIdle { assertThat(state.currentValue).isEqualTo("A") }
     }
 
-    /**
-     * Tests that the state and offset of [swipeable] are updated when swiping.
-     */
+    /** Tests that the state and offset of [swipeable] are updated when swiping. */
     @Test
     fun swipeable_updatedWhenSwiping() {
         rule.mainClock.autoAdvance = false
@@ -394,406 +331,369 @@
         }
     }
 
-    /**
-     * Tests that fixed thresholds work correctly.
-     */
+    /** Tests that fixed thresholds work correctly. */
     @Test
     @LargeTest
-    fun swipeable_thresholds_fixed_small() = runBlocking(AutoTestFrameClock()) {
-        rule.mainClock.autoAdvance = false
-        lateinit var state: SwipeableState<String>
-        val offsetDp = with(rule.density) { 35.toDp() }
-        setSwipeableContent {
-            state = rememberSwipeableState("A")
-            Modifier.swipeable(
-                state = state,
-                anchors = mapOf(0f to "A", 100f to "B"),
-                thresholds = { _, _ -> FixedThreshold(offsetDp) },
-                orientation = Orientation.Horizontal,
-                velocityThreshold = Dp.Infinity
-            )
-        }
-
-        val thresholdAtoB = 35f
-        val thresholdBtoA = 65f
-
-        for (i in 0..10) {
-            state.snapTo("A")
-
-            swipeRight(offset = 50f + i * 10f)
-
-            val passedThreshold = rule.runOnIdle {
-                state.offset.value >= thresholdAtoB
+    fun swipeable_thresholds_fixed_small() =
+        runBlocking(AutoTestFrameClock()) {
+            rule.mainClock.autoAdvance = false
+            lateinit var state: SwipeableState<String>
+            val offsetDp = with(rule.density) { 35.toDp() }
+            setSwipeableContent {
+                state = rememberSwipeableState("A")
+                Modifier.swipeable(
+                    state = state,
+                    anchors = mapOf(0f to "A", 100f to "B"),
+                    thresholds = { _, _ -> FixedThreshold(offsetDp) },
+                    orientation = Orientation.Horizontal,
+                    velocityThreshold = Dp.Infinity
+                )
             }
 
-            advanceClock()
+            val thresholdAtoB = 35f
+            val thresholdBtoA = 65f
 
-            rule.runOnIdle {
-                assertThat(state.currentValue).isEqualTo(if (passedThreshold) "B" else "A")
+            for (i in 0..10) {
+                state.snapTo("A")
+
+                swipeRight(offset = 50f + i * 10f)
+
+                val passedThreshold = rule.runOnIdle { state.offset.value >= thresholdAtoB }
+
+                advanceClock()
+
+                rule.runOnIdle {
+                    assertThat(state.currentValue).isEqualTo(if (passedThreshold) "B" else "A")
+                }
+            }
+
+            for (i in 0..10) {
+                state.snapTo("B")
+
+                swipeLeft(offset = 50f + i * 10f)
+
+                val passedThreshold = rule.runOnIdle { state.offset.value <= thresholdBtoA }
+
+                advanceClock()
+
+                rule.runOnIdle {
+                    assertThat(state.currentValue).isEqualTo(if (passedThreshold) "A" else "B")
+                }
             }
         }
 
-        for (i in 0..10) {
-            state.snapTo("B")
-
-            swipeLeft(offset = 50f + i * 10f)
-
-            val passedThreshold = rule.runOnIdle {
-                state.offset.value <= thresholdBtoA
-            }
-
-            advanceClock()
-
-            rule.runOnIdle {
-                assertThat(state.currentValue).isEqualTo(if (passedThreshold) "A" else "B")
-            }
-        }
-    }
-
-    /**
-     * Tests that fixed thresholds work correctly.
-     */
+    /** Tests that fixed thresholds work correctly. */
     @Test
     @LargeTest
-    fun swipeable_thresholds_fixed_large() = runBlocking(AutoTestFrameClock()) {
-        lateinit var state: SwipeableState<String>
-        val offsetDp = with(rule.density) { 65.toDp() }
-        setSwipeableContent {
-            state = rememberSwipeableState("A")
-            Modifier.swipeable(
-                state = state,
-                anchors = mapOf(0f to "A", 100f to "B"),
-                thresholds = { _, _ -> FixedThreshold(offsetDp) },
-                orientation = Orientation.Horizontal,
-                velocityThreshold = Dp.Infinity
-            )
-        }
-
-        val thresholdAtoB = 65f
-        val thresholdBtoA = 35f
-
-        for (i in 0..10) {
-            state.snapTo("A")
-
-            swipeRight(offset = 50f + i * 10f)
-
-            val passedThreshold = rule.runOnIdle {
-                state.offset.value >= thresholdAtoB
+    fun swipeable_thresholds_fixed_large() =
+        runBlocking(AutoTestFrameClock()) {
+            lateinit var state: SwipeableState<String>
+            val offsetDp = with(rule.density) { 65.toDp() }
+            setSwipeableContent {
+                state = rememberSwipeableState("A")
+                Modifier.swipeable(
+                    state = state,
+                    anchors = mapOf(0f to "A", 100f to "B"),
+                    thresholds = { _, _ -> FixedThreshold(offsetDp) },
+                    orientation = Orientation.Horizontal,
+                    velocityThreshold = Dp.Infinity
+                )
             }
 
-            advanceClock()
+            val thresholdAtoB = 65f
+            val thresholdBtoA = 35f
 
-            rule.runOnIdle {
-                assertThat(state.currentValue).isEqualTo(if (passedThreshold) "B" else "A")
+            for (i in 0..10) {
+                state.snapTo("A")
+
+                swipeRight(offset = 50f + i * 10f)
+
+                val passedThreshold = rule.runOnIdle { state.offset.value >= thresholdAtoB }
+
+                advanceClock()
+
+                rule.runOnIdle {
+                    assertThat(state.currentValue).isEqualTo(if (passedThreshold) "B" else "A")
+                }
+            }
+
+            for (i in 0..10) {
+                state.snapTo("B")
+
+                swipeLeft(offset = 50f + i * 10f)
+
+                val passedThreshold = rule.runOnIdle { state.offset.value <= thresholdBtoA }
+
+                advanceClock()
+
+                rule.runOnIdle {
+                    assertThat(state.currentValue).isEqualTo(if (passedThreshold) "A" else "B")
+                }
             }
         }
 
-        for (i in 0..10) {
-            state.snapTo("B")
-
-            swipeLeft(offset = 50f + i * 10f)
-
-            val passedThreshold = rule.runOnIdle {
-                state.offset.value <= thresholdBtoA
-            }
-
-            advanceClock()
-
-            rule.runOnIdle {
-                assertThat(state.currentValue).isEqualTo(if (passedThreshold) "A" else "B")
-            }
-        }
-    }
-
-    /**
-     * Tests that fractional thresholds work correctly.
-     */
+    /** Tests that fractional thresholds work correctly. */
     @Test
     @LargeTest
-    fun swipeable_thresholds_fractional_half() = runBlocking(AutoTestFrameClock()) {
-        lateinit var state: SwipeableState<String>
-        setSwipeableContent {
-            state = rememberSwipeableState("A")
-            Modifier.swipeable(
-                state = state,
-                anchors = mapOf(0f to "A", 100f to "B"),
-                thresholds = { _, _ -> FractionalThreshold(0.5f) },
-                orientation = Orientation.Horizontal,
-                velocityThreshold = Dp.Infinity
-            )
-        }
-
-        val thresholdAtoB = 50f
-        val thresholdBtoA = 50f
-
-        for (i in 0..10) {
-            state.snapTo("A")
-
-            swipeRight(offset = 50f + i * 10f)
-
-            val passedThreshold = rule.runOnIdle {
-                state.offset.value >= thresholdAtoB
+    fun swipeable_thresholds_fractional_half() =
+        runBlocking(AutoTestFrameClock()) {
+            lateinit var state: SwipeableState<String>
+            setSwipeableContent {
+                state = rememberSwipeableState("A")
+                Modifier.swipeable(
+                    state = state,
+                    anchors = mapOf(0f to "A", 100f to "B"),
+                    thresholds = { _, _ -> FractionalThreshold(0.5f) },
+                    orientation = Orientation.Horizontal,
+                    velocityThreshold = Dp.Infinity
+                )
             }
 
-            advanceClock()
+            val thresholdAtoB = 50f
+            val thresholdBtoA = 50f
 
-            rule.runOnIdle {
-                assertThat(state.currentValue).isEqualTo(if (passedThreshold) "B" else "A")
+            for (i in 0..10) {
+                state.snapTo("A")
+
+                swipeRight(offset = 50f + i * 10f)
+
+                val passedThreshold = rule.runOnIdle { state.offset.value >= thresholdAtoB }
+
+                advanceClock()
+
+                rule.runOnIdle {
+                    assertThat(state.currentValue).isEqualTo(if (passedThreshold) "B" else "A")
+                }
+            }
+
+            for (i in 0..10) {
+                state.snapTo("B")
+
+                swipeLeft(offset = 50f + i * 10f)
+
+                val passedThreshold = rule.runOnIdle { state.offset.value <= thresholdBtoA }
+
+                advanceClock()
+
+                rule.runOnIdle {
+                    assertThat(state.currentValue).isEqualTo(if (passedThreshold) "A" else "B")
+                }
             }
         }
 
-        for (i in 0..10) {
-            state.snapTo("B")
-
-            swipeLeft(offset = 50f + i * 10f)
-
-            val passedThreshold = rule.runOnIdle {
-                state.offset.value <= thresholdBtoA
-            }
-
-            advanceClock()
-
-            rule.runOnIdle {
-                assertThat(state.currentValue).isEqualTo(if (passedThreshold) "A" else "B")
-            }
-        }
-    }
-
-    /**
-     * Tests that fractional thresholds work correctly.
-     */
+    /** Tests that fractional thresholds work correctly. */
     @Test
     @LargeTest
-    fun swipeable_thresholds_fractional_quarter() = runBlocking(AutoTestFrameClock()) {
-        lateinit var state: SwipeableState<String>
-        setSwipeableContent {
-            state = rememberSwipeableState("A")
-            Modifier.swipeable(
-                state = state,
-                anchors = mapOf(0f to "A", 100f to "B"),
-                thresholds = { _, _ -> FractionalThreshold(0.25f) },
-                orientation = Orientation.Horizontal,
-                velocityThreshold = Dp.Infinity
-            )
-        }
-
-        val thresholdAtoB = 25f
-        val thresholdBtoA = 75f
-
-        for (i in 0..10) {
-            state.snapTo("A")
-
-            swipeRight(offset = 50f + i * 10f)
-
-            val passedThreshold = rule.runOnIdle {
-                state.offset.value >= thresholdAtoB
+    fun swipeable_thresholds_fractional_quarter() =
+        runBlocking(AutoTestFrameClock()) {
+            lateinit var state: SwipeableState<String>
+            setSwipeableContent {
+                state = rememberSwipeableState("A")
+                Modifier.swipeable(
+                    state = state,
+                    anchors = mapOf(0f to "A", 100f to "B"),
+                    thresholds = { _, _ -> FractionalThreshold(0.25f) },
+                    orientation = Orientation.Horizontal,
+                    velocityThreshold = Dp.Infinity
+                )
             }
 
-            advanceClock()
+            val thresholdAtoB = 25f
+            val thresholdBtoA = 75f
 
-            rule.runOnIdle {
-                assertThat(state.currentValue).isEqualTo(if (passedThreshold) "B" else "A")
+            for (i in 0..10) {
+                state.snapTo("A")
+
+                swipeRight(offset = 50f + i * 10f)
+
+                val passedThreshold = rule.runOnIdle { state.offset.value >= thresholdAtoB }
+
+                advanceClock()
+
+                rule.runOnIdle {
+                    assertThat(state.currentValue).isEqualTo(if (passedThreshold) "B" else "A")
+                }
+            }
+
+            for (i in 0..10) {
+                state.snapTo("B")
+
+                swipeLeft(offset = 50f + i * 10f)
+
+                val passedThreshold = rule.runOnIdle { state.offset.value <= thresholdBtoA }
+
+                advanceClock()
+
+                rule.runOnIdle {
+                    assertThat(state.currentValue).isEqualTo(if (passedThreshold) "A" else "B")
+                }
             }
         }
 
-        for (i in 0..10) {
-            state.snapTo("B")
-
-            swipeLeft(offset = 50f + i * 10f)
-
-            val passedThreshold = rule.runOnIdle {
-                state.offset.value <= thresholdBtoA
-            }
-
-            advanceClock()
-
-            rule.runOnIdle {
-                assertThat(state.currentValue).isEqualTo(if (passedThreshold) "A" else "B")
-            }
-        }
-    }
-
-    /**
-     * Tests that fractional thresholds work correctly.
-     */
+    /** Tests that fractional thresholds work correctly. */
     @Test
     @LargeTest
-    fun swipeable_thresholds_fractional_threeQuarters() = runBlocking(AutoTestFrameClock()) {
-        lateinit var state: SwipeableState<String>
-        setSwipeableContent {
-            state = rememberSwipeableState("A")
-            Modifier.swipeable(
-                state = state,
-                anchors = mapOf(0f to "A", 100f to "B"),
-                thresholds = { _, _ -> FractionalThreshold(0.75f) },
-                orientation = Orientation.Horizontal,
-                velocityThreshold = Dp.Infinity
-            )
-        }
-
-        val thresholdAtoB = 75f
-        val thresholdBtoA = 25f
-
-        for (i in 0..10) {
-            state.snapTo("A")
-
-            swipeRight(offset = 50f + i * 10f)
-
-            val passedThreshold = rule.runOnIdle {
-                state.offset.value >= thresholdAtoB
+    fun swipeable_thresholds_fractional_threeQuarters() =
+        runBlocking(AutoTestFrameClock()) {
+            lateinit var state: SwipeableState<String>
+            setSwipeableContent {
+                state = rememberSwipeableState("A")
+                Modifier.swipeable(
+                    state = state,
+                    anchors = mapOf(0f to "A", 100f to "B"),
+                    thresholds = { _, _ -> FractionalThreshold(0.75f) },
+                    orientation = Orientation.Horizontal,
+                    velocityThreshold = Dp.Infinity
+                )
             }
 
-            advanceClock()
+            val thresholdAtoB = 75f
+            val thresholdBtoA = 25f
 
-            rule.runOnIdle {
-                assertThat(state.currentValue).isEqualTo(if (passedThreshold) "B" else "A")
+            for (i in 0..10) {
+                state.snapTo("A")
+
+                swipeRight(offset = 50f + i * 10f)
+
+                val passedThreshold = rule.runOnIdle { state.offset.value >= thresholdAtoB }
+
+                advanceClock()
+
+                rule.runOnIdle {
+                    assertThat(state.currentValue).isEqualTo(if (passedThreshold) "B" else "A")
+                }
+            }
+
+            for (i in 0..10) {
+                state.snapTo("B")
+
+                swipeLeft(offset = 50f + i * 10f)
+
+                val passedThreshold = rule.runOnIdle { state.offset.value <= thresholdBtoA }
+
+                advanceClock()
+
+                rule.runOnIdle {
+                    assertThat(state.currentValue).isEqualTo(if (passedThreshold) "A" else "B")
+                }
             }
         }
 
-        for (i in 0..10) {
-            state.snapTo("B")
-
-            swipeLeft(offset = 50f + i * 10f)
-
-            val passedThreshold = rule.runOnIdle {
-                state.offset.value <= thresholdBtoA
-            }
-
-            advanceClock()
-
-            rule.runOnIdle {
-                assertThat(state.currentValue).isEqualTo(if (passedThreshold) "A" else "B")
-            }
-        }
-    }
-
-    /**
-     * Tests that mixing fixed and fractional thresholds works correctly.
-     */
+    /** Tests that mixing fixed and fractional thresholds works correctly. */
     @Test
     @LargeTest
-    fun swipeable_thresholds_mixed() = runBlocking(AutoTestFrameClock()) {
-        lateinit var state: SwipeableState<String>
-        val offsetDp = with(rule.density) { 35.toDp() }
-        setSwipeableContent {
-            state = rememberSwipeableState("A")
-            Modifier.swipeable(
-                state = state,
-                anchors = mapOf(0f to "A", 100f to "B"),
-                thresholds = { from, to ->
-                    if (from < to) {
-                        FixedThreshold(offsetDp)
-                    } else {
-                        FractionalThreshold(0.75f)
-                    }
-                },
-                orientation = Orientation.Horizontal,
-                velocityThreshold = Dp.Infinity
-            )
-        }
-
-        val thresholdAtoB = 35f
-        val thresholdBtoA = 25f
-
-        for (i in 0..10) {
-            state.snapTo("A")
-
-            swipeRight(offset = 50f + i * 10f)
-
-            val passedThreshold = rule.runOnIdle {
-                state.offset.value >= thresholdAtoB
-            }
-
-            advanceClock()
-
-            rule.runOnIdle {
-                assertThat(state.currentValue).isEqualTo(if (passedThreshold) "B" else "A")
-            }
-        }
-
-        for (i in 0..10) {
-            state.snapTo("B")
-
-            swipeLeft(offset = 50f + i * 10f)
-
-            val passedThreshold = rule.runOnIdle {
-                state.offset.value <= thresholdBtoA
-            }
-
-            advanceClock()
-
-            rule.runOnIdle {
-                assertThat(state.currentValue).isEqualTo(if (passedThreshold) "A" else "B")
-            }
-        }
-    }
-
-    /**
-     * Tests that a custom implementation of [ThresholdConfig] works correctly.
-     */
-    @Test
-    @LargeTest
-    fun swipeable_thresholds_custom() = runBlocking(AutoTestFrameClock()) {
-        lateinit var state: SwipeableState<String>
-        setSwipeableContent {
-            state = rememberSwipeableState("A")
-            Modifier.swipeable(
-                state = state,
-                anchors = mapOf(0f to "A", 100f to "B"),
-                thresholds = { _, _ ->
-                    object : ThresholdConfig {
-                        override fun Density.computeThreshold(
-                            fromValue: Float,
-                            toValue: Float
-                        ): Float {
-                            return 40 + 5 * sign(toValue - fromValue)
+    fun swipeable_thresholds_mixed() =
+        runBlocking(AutoTestFrameClock()) {
+            lateinit var state: SwipeableState<String>
+            val offsetDp = with(rule.density) { 35.toDp() }
+            setSwipeableContent {
+                state = rememberSwipeableState("A")
+                Modifier.swipeable(
+                    state = state,
+                    anchors = mapOf(0f to "A", 100f to "B"),
+                    thresholds = { from, to ->
+                        if (from < to) {
+                            FixedThreshold(offsetDp)
+                        } else {
+                            FractionalThreshold(0.75f)
                         }
-                    }
-                },
-                orientation = Orientation.Horizontal,
-                velocityThreshold = Dp.Infinity
-            )
-        }
-
-        val thresholdAtoB = 45f
-        val thresholdBtoA = 35f
-
-        for (i in 0..10) {
-            state.snapTo("A")
-
-            swipeRight(offset = 50f + i * 10f)
-
-            val passedThreshold = rule.runOnIdle {
-                state.offset.value >= thresholdAtoB
+                    },
+                    orientation = Orientation.Horizontal,
+                    velocityThreshold = Dp.Infinity
+                )
             }
 
-            advanceClock()
+            val thresholdAtoB = 35f
+            val thresholdBtoA = 25f
 
-            rule.runOnIdle {
-                assertThat(state.currentValue).isEqualTo(if (passedThreshold) "B" else "A")
+            for (i in 0..10) {
+                state.snapTo("A")
+
+                swipeRight(offset = 50f + i * 10f)
+
+                val passedThreshold = rule.runOnIdle { state.offset.value >= thresholdAtoB }
+
+                advanceClock()
+
+                rule.runOnIdle {
+                    assertThat(state.currentValue).isEqualTo(if (passedThreshold) "B" else "A")
+                }
+            }
+
+            for (i in 0..10) {
+                state.snapTo("B")
+
+                swipeLeft(offset = 50f + i * 10f)
+
+                val passedThreshold = rule.runOnIdle { state.offset.value <= thresholdBtoA }
+
+                advanceClock()
+
+                rule.runOnIdle {
+                    assertThat(state.currentValue).isEqualTo(if (passedThreshold) "A" else "B")
+                }
             }
         }
 
-        for (i in 0..10) {
-            state.snapTo("B")
-
-            swipeLeft(offset = 50f + i * 10f)
-
-            val passedThreshold = rule.runOnIdle {
-                state.offset.value <= thresholdBtoA
+    /** Tests that a custom implementation of [ThresholdConfig] works correctly. */
+    @Test
+    @LargeTest
+    fun swipeable_thresholds_custom() =
+        runBlocking(AutoTestFrameClock()) {
+            lateinit var state: SwipeableState<String>
+            setSwipeableContent {
+                state = rememberSwipeableState("A")
+                Modifier.swipeable(
+                    state = state,
+                    anchors = mapOf(0f to "A", 100f to "B"),
+                    thresholds = { _, _ ->
+                        object : ThresholdConfig {
+                            override fun Density.computeThreshold(
+                                fromValue: Float,
+                                toValue: Float
+                            ): Float {
+                                return 40 + 5 * sign(toValue - fromValue)
+                            }
+                        }
+                    },
+                    orientation = Orientation.Horizontal,
+                    velocityThreshold = Dp.Infinity
+                )
             }
 
-            advanceClock()
+            val thresholdAtoB = 45f
+            val thresholdBtoA = 35f
 
-            rule.runOnIdle {
-                assertThat(state.currentValue).isEqualTo(if (passedThreshold) "A" else "B")
+            for (i in 0..10) {
+                state.snapTo("A")
+
+                swipeRight(offset = 50f + i * 10f)
+
+                val passedThreshold = rule.runOnIdle { state.offset.value >= thresholdAtoB }
+
+                advanceClock()
+
+                rule.runOnIdle {
+                    assertThat(state.currentValue).isEqualTo(if (passedThreshold) "B" else "A")
+                }
+            }
+
+            for (i in 0..10) {
+                state.snapTo("B")
+
+                swipeLeft(offset = 50f + i * 10f)
+
+                val passedThreshold = rule.runOnIdle { state.offset.value <= thresholdBtoA }
+
+                advanceClock()
+
+                rule.runOnIdle {
+                    assertThat(state.currentValue).isEqualTo(if (passedThreshold) "A" else "B")
+                }
             }
         }
-    }
 
-    /**
-     * Tests that the velocity threshold works correctly.
-     */
+    /** Tests that the velocity threshold works correctly. */
     @Test
     fun swipeable_velocityThreshold() {
         lateinit var state: SwipeableState<String>
@@ -809,42 +709,30 @@
             )
         }
 
-        rule.runOnIdle {
-            assertThat(state.currentValue).isEqualTo("A")
-        }
+        rule.runOnIdle { assertThat(state.currentValue).isEqualTo("A") }
 
         swipeRight(velocity = 499f)
         advanceClock()
 
-        rule.runOnIdle {
-            assertThat(state.currentValue).isEqualTo("A")
-        }
+        rule.runOnIdle { assertThat(state.currentValue).isEqualTo("A") }
 
         swipeRight(velocity = 501f)
         advanceClock()
 
-        rule.runOnIdle {
-            assertThat(state.currentValue).isEqualTo("B")
-        }
+        rule.runOnIdle { assertThat(state.currentValue).isEqualTo("B") }
 
         swipeLeft(velocity = 499f)
         advanceClock()
 
-        rule.runOnIdle {
-            assertThat(state.currentValue).isEqualTo("B")
-        }
+        rule.runOnIdle { assertThat(state.currentValue).isEqualTo("B") }
 
         swipeLeft(velocity = 501f)
         advanceClock()
 
-        rule.runOnIdle {
-            assertThat(state.currentValue).isEqualTo("A")
-        }
+        rule.runOnIdle { assertThat(state.currentValue).isEqualTo("A") }
     }
 
-    /**
-     * Tests that [swipeable] will animate to a neighbouring state, after a high-velocity swipe.
-     */
+    /** Tests that [swipeable] will animate to a neighbouring state, after a high-velocity swipe. */
     @Test
     fun swipeable_cannotSkipStatesByFlinging() {
         lateinit var state: SwipeableState<String>
@@ -858,21 +746,15 @@
             )
         }
 
-        rule.runOnIdle {
-            assertThat(state.currentValue).isEqualTo("A")
-        }
+        rule.runOnIdle { assertThat(state.currentValue).isEqualTo("A") }
 
         swipeRight(velocity = 1000f)
         advanceClock()
 
-        rule.runOnIdle {
-            assertThat(state.currentValue).isNotEqualTo("C")
-        }
+        rule.runOnIdle { assertThat(state.currentValue).isNotEqualTo("C") }
     }
 
-    /**
-     * Tests that the overflow is updated when swiping past the bounds.
-     */
+    /** Tests that the overflow is updated when swiping past the bounds. */
     @Test
     fun swipeable_overflow() {
         rule.mainClock.autoAdvance = false
@@ -922,9 +804,7 @@
         }
     }
 
-    /**
-     * Tests that resistance is applied correctly when swiping past the min bound.
-     */
+    /** Tests that resistance is applied correctly when swiping past the min bound. */
     @Test
     fun swipeable_resistance_atMinBound() {
         lateinit var state: SwipeableState<String>
@@ -943,21 +823,16 @@
         swipeLeft()
 
         rule.runOnIdle {
-            assertThat(state.offset.value).isEqualTo(
-                resistance.computeResistance(state.overflow.value)
-            )
+            assertThat(state.offset.value)
+                .isEqualTo(resistance.computeResistance(state.overflow.value))
         }
 
         advanceClock()
 
-        rule.runOnIdle {
-            assertThat(state.offset.value).isEqualTo(0f)
-        }
+        rule.runOnIdle { assertThat(state.offset.value).isEqualTo(0f) }
     }
 
-    /**
-     * Tests that resistance is applied correctly when swiping past the max bound.
-     */
+    /** Tests that resistance is applied correctly when swiping past the max bound. */
     @Test
     fun swipeable_resistance_atMaxBound() {
         lateinit var state: SwipeableState<String>
@@ -976,68 +851,58 @@
         swipeRight()
 
         rule.runOnIdle {
-            assertThat(state.offset.value).isEqualTo(
-                resistance.computeResistance(state.overflow.value)
-            )
+            assertThat(state.offset.value)
+                .isEqualTo(resistance.computeResistance(state.overflow.value))
         }
 
         advanceClock()
 
-        rule.runOnIdle {
-            assertThat(state.offset.value).isEqualTo(0f)
-        }
+        rule.runOnIdle { assertThat(state.offset.value).isEqualTo(0f) }
     }
 
-    /**
-     * Tests that the target works correctly.
-     */
+    /** Tests that the target works correctly. */
     @Test
     @LargeTest
-    fun swipeable_targetValue() = runBlocking(AutoTestFrameClock()) {
-        lateinit var state: SwipeableState<String>
-        setSwipeableContent {
-            state = rememberSwipeableState("A")
-            Modifier.swipeable(
-                state = state,
-                anchors = mapOf(0f to "A", 100f to "B"),
-                thresholds = { _, _ -> FractionalThreshold(0.5f) },
-                orientation = Orientation.Horizontal,
-                velocityThreshold = Dp.Infinity
-            )
-        }
+    fun swipeable_targetValue() =
+        runBlocking(AutoTestFrameClock()) {
+            lateinit var state: SwipeableState<String>
+            setSwipeableContent {
+                state = rememberSwipeableState("A")
+                Modifier.swipeable(
+                    state = state,
+                    anchors = mapOf(0f to "A", 100f to "B"),
+                    thresholds = { _, _ -> FractionalThreshold(0.5f) },
+                    orientation = Orientation.Horizontal,
+                    velocityThreshold = Dp.Infinity
+                )
+            }
 
-        for (i in 0..10) {
-            state.snapTo("A")
+            for (i in 0..10) {
+                state.snapTo("A")
 
-            swipeRight(offset = 50f + i * 10f)
+                swipeRight(offset = 50f + i * 10f)
 
-            val target = rule.runOnIdle { state.targetValue }
+                val target = rule.runOnIdle { state.targetValue }
 
-            advanceClock()
+                advanceClock()
 
-            rule.runOnIdle {
-                assertThat(state.currentValue).isEqualTo(target)
+                rule.runOnIdle { assertThat(state.currentValue).isEqualTo(target) }
+            }
+
+            for (i in 0..10) {
+                state.snapTo("B")
+
+                swipeLeft(offset = 50f + i * 10f)
+
+                val target = rule.runOnIdle { state.targetValue }
+
+                advanceClock()
+
+                rule.runOnIdle { assertThat(state.currentValue).isEqualTo(target) }
             }
         }
 
-        for (i in 0..10) {
-            state.snapTo("B")
-
-            swipeLeft(offset = 50f + i * 10f)
-
-            val target = rule.runOnIdle { state.targetValue }
-
-            advanceClock()
-
-            rule.runOnIdle {
-                assertThat(state.currentValue).isEqualTo(target)
-            }
-        }
-    }
-
-    /**
-     * Tests that the progress works correctly.
-     */
+    /** Tests that the progress works correctly. */
     @Test
     fun swipeable_progress() {
         rule.mainClock.autoAdvance = false
@@ -1096,9 +961,7 @@
         }
     }
 
-    /**
-     * Tests that the direction works correctly.
-     */
+    /** Tests that the direction works correctly. */
     @Test
     fun swipeable_direction() {
         rule.mainClock.autoAdvance = false
@@ -1147,9 +1010,7 @@
         }
     }
 
-    /**
-     * Tests that the progress works correctly, after a swipe was in the opposite direction.
-     */
+    /** Tests that the progress works correctly, after a swipe was in the opposite direction. */
     @Test
     fun swipeable_progress_multipleSwipes() {
         rule.mainClock.autoAdvance = false
@@ -1222,9 +1083,7 @@
         }
     }
 
-    /**
-     * Tests that the direction works correctly, after a swipe was in the opposite direction.
-     */
+    /** Tests that the direction works correctly, after a swipe was in the opposite direction. */
     @Test
     fun swipeable_direction_multipleSwipes() {
         rule.mainClock.autoAdvance = false
@@ -1292,94 +1151,89 @@
         }
     }
 
-    /**
-     * Tests that 'snapTo' updates the state and offset immediately.
-     */
+    /** Tests that 'snapTo' updates the state and offset immediately. */
     @Test
-    fun swipeable_snapTo() = runBlocking(AutoTestFrameClock()) {
-        lateinit var state: SwipeableState<String>
-        setSwipeableContent {
-            state = rememberSwipeableState("A")
-            Modifier.swipeable(
-                state = state,
-                anchors = mapOf(0f to "A", 100f to "B"),
-                thresholds = { _, _ -> FractionalThreshold(0.5f) },
-                orientation = Orientation.Horizontal
-            )
+    fun swipeable_snapTo() =
+        runBlocking(AutoTestFrameClock()) {
+            lateinit var state: SwipeableState<String>
+            setSwipeableContent {
+                state = rememberSwipeableState("A")
+                Modifier.swipeable(
+                    state = state,
+                    anchors = mapOf(0f to "A", 100f to "B"),
+                    thresholds = { _, _ -> FractionalThreshold(0.5f) },
+                    orientation = Orientation.Horizontal
+                )
+            }
+
+            rule.runOnIdle {
+                assertThat(state.currentValue).isEqualTo("A")
+                assertThat(state.offset.value).isEqualTo(0f)
+            }
+
+            state.snapTo("B")
+
+            rule.runOnIdle {
+                assertThat(state.currentValue).isEqualTo("B")
+                assertThat(state.offset.value).isEqualTo(100f)
+            }
         }
 
-        rule.runOnIdle {
+    /** Tests that 'animateTo' starts an animation which updates the state and offset. */
+    @Test
+    fun swipeable_animateTo() =
+        runBlocking(AutoTestFrameClock()) {
+            lateinit var state: SwipeableState<String>
+            setSwipeableContent {
+                state = rememberSwipeableState("A")
+                Modifier.swipeable(
+                    state = state,
+                    anchors = mapOf(0f to "A", 100f to "B"),
+                    thresholds = { _, _ -> FractionalThreshold(0.5f) },
+                    orientation = Orientation.Horizontal
+                )
+            }
+
             assertThat(state.currentValue).isEqualTo("A")
             assertThat(state.offset.value).isEqualTo(0f)
-        }
 
-        state.snapTo("B")
+            val job = launch { state.animateTo("B") }
 
-        rule.runOnIdle {
+            assertThat(state.currentValue).isEqualTo("A")
+            assertThat(state.offset.value).isEqualTo(0f)
+
+            job.join()
+
             assertThat(state.currentValue).isEqualTo("B")
             assertThat(state.offset.value).isEqualTo(100f)
         }
-    }
 
-    /**
-     * Tests that 'animateTo' starts an animation which updates the state and offset.
-     */
+    /** Tests that the 'onEnd' callback of 'animateTo' is invoked and with the correct end value. */
     @Test
-    fun swipeable_animateTo() = runBlocking(AutoTestFrameClock()) {
-        lateinit var state: SwipeableState<String>
-        setSwipeableContent {
-            state = rememberSwipeableState("A")
-            Modifier.swipeable(
-                state = state,
-                anchors = mapOf(0f to "A", 100f to "B"),
-                thresholds = { _, _ -> FractionalThreshold(0.5f) },
-                orientation = Orientation.Horizontal
-            )
+    fun swipeable_animateTo_onEnd() =
+        runBlocking(AutoTestFrameClock()) {
+            lateinit var state: SwipeableState<String>
+            setSwipeableContent {
+                state = rememberSwipeableState("A")
+                Modifier.swipeable(
+                    state = state,
+                    anchors = mapOf(0f to "A", 100f to "B"),
+                    thresholds = { _, _ -> FractionalThreshold(0.5f) },
+                    orientation = Orientation.Horizontal
+                )
+            }
+
+            var result: Boolean?
+            try {
+                state.animateTo("B")
+                result = true
+            } catch (c: CancellationException) {
+                result = false
+            }
+            advanceClock()
+            assertThat(result).isEqualTo(true)
         }
 
-        assertThat(state.currentValue).isEqualTo("A")
-        assertThat(state.offset.value).isEqualTo(0f)
-
-        val job = launch {
-            state.animateTo("B")
-        }
-
-        assertThat(state.currentValue).isEqualTo("A")
-        assertThat(state.offset.value).isEqualTo(0f)
-
-        job.join()
-
-        assertThat(state.currentValue).isEqualTo("B")
-        assertThat(state.offset.value).isEqualTo(100f)
-    }
-
-    /**
-     * Tests that the 'onEnd' callback of 'animateTo' is invoked and with the correct end value.
-     */
-    @Test
-    fun swipeable_animateTo_onEnd() = runBlocking(AutoTestFrameClock()) {
-        lateinit var state: SwipeableState<String>
-        setSwipeableContent {
-            state = rememberSwipeableState("A")
-            Modifier.swipeable(
-                state = state,
-                anchors = mapOf(0f to "A", 100f to "B"),
-                thresholds = { _, _ -> FractionalThreshold(0.5f) },
-                orientation = Orientation.Horizontal
-            )
-        }
-
-        var result: Boolean?
-        try {
-            state.animateTo("B")
-            result = true
-        } catch (c: CancellationException) {
-            result = false
-        }
-        advanceClock()
-        assertThat(result).isEqualTo(true)
-    }
-
     /**
      * Tests that the 'onEnd' callback of 'animateTo' is invoked if the animation is interrupted.
      */
@@ -1398,9 +1252,7 @@
             )
         }
 
-        val job = async {
-            state.animateTo("B")
-        }
+        val job = async { state.animateTo("B") }
         rule.mainClock.advanceTimeByFrame()
         rule.onNodeWithTag(swipeableTag).performTouchInput {
             down(center)
@@ -1410,41 +1262,34 @@
         job.await()
     }
 
-    /**
-     * Tests that the [SwipeableState] is restored, when created with [rememberSwipeableState].
-     */
+    /** Tests that the [SwipeableState] is restored, when created with [rememberSwipeableState]. */
     @Test
-    fun swipeable_restoreSwipeableState() = runBlocking(AutoTestFrameClock()) {
-        val restorationTester = StateRestorationTester(rule)
-        var state: SwipeableState<String>? = null
+    fun swipeable_restoreSwipeableState() =
+        runBlocking(AutoTestFrameClock()) {
+            val restorationTester = StateRestorationTester(rule)
+            var state: SwipeableState<String>? = null
 
-        restorationTester.setContent {
-            state = rememberSwipeableState("A")
-            Box(
-                Modifier.swipeable(
-                    state = state!!,
-                    anchors = mapOf(0f to "A", 100f to "B"),
-                    thresholds = { _, _ -> FractionalThreshold(0.5f) },
-                    orientation = Orientation.Horizontal
+            restorationTester.setContent {
+                state = rememberSwipeableState("A")
+                Box(
+                    Modifier.swipeable(
+                        state = state!!,
+                        anchors = mapOf(0f to "A", 100f to "B"),
+                        thresholds = { _, _ -> FractionalThreshold(0.5f) },
+                        orientation = Orientation.Horizontal
+                    )
                 )
-            )
+            }
+
+            state!!.animateTo("B")
+            rule.runOnIdle { state = null }
+
+            restorationTester.emulateSavedInstanceStateRestore()
+
+            rule.runOnIdle { assertThat(state!!.currentValue).isEqualTo("B") }
         }
 
-        state!!.animateTo("B")
-        rule.runOnIdle {
-            state = null
-        }
-
-        restorationTester.emulateSavedInstanceStateRestore()
-
-        rule.runOnIdle {
-            assertThat(state!!.currentValue).isEqualTo("B")
-        }
-    }
-
-    /**
-     * Tests that the `onValueChange` callback of [rememberSwipeableState] is invoked correctly.
-     */
+    /** Tests that the `onValueChange` callback of [rememberSwipeableState] is invoked correctly. */
     @Test
     fun swipeable_swipeableStateFor_onValueChange() {
         var onStateChangeCallbacks = 0
@@ -1452,13 +1297,14 @@
         setSwipeableContent {
             state = remember { mutableStateOf("A") }
             Modifier.swipeable(
-                state = rememberSwipeableStateFor(
-                    value = state.value,
-                    onValueChange = {
-                        onStateChangeCallbacks += 1
-                        state.value = it
-                    }
-                ),
+                state =
+                    rememberSwipeableStateFor(
+                        value = state.value,
+                        onValueChange = {
+                            onStateChangeCallbacks += 1
+                            state.value = it
+                        }
+                    ),
                 anchors = mapOf(0f to "A", 100f to "B"),
                 thresholds = { _, _ -> FractionalThreshold(0.5f) },
                 orientation = Orientation.Horizontal
@@ -1478,9 +1324,7 @@
         }
     }
 
-    /**
-     * Tests that the [SwipeableState] is updated if the anchors change.
-     */
+    /** Tests that the [SwipeableState] is updated if the anchors change. */
     @Test
     fun swipeable_anchorsUpdated() {
         lateinit var swipeableState: SwipeableState<String>
@@ -1541,9 +1385,7 @@
         }
     }
 
-    /**
-     * Tests that the [SwipeableState] is updated if the anchors change.
-     */
+    /** Tests that the [SwipeableState] is updated if the anchors change. */
     @Test
     fun swipeable_anchorsUpdated_currentAnchorRemoved() {
         lateinit var swipeableState: SwipeableState<String>
@@ -1572,67 +1414,68 @@
         }
     }
 
-    /**
-     * Tests that the [SwipeableState] is updated if the anchors change.
-     */
+    /** Tests that the [SwipeableState] is updated if the anchors change. */
     @Test
-    fun swipeable_anchorsUpdated_whenAnimationInProgress() = runBlocking(AutoTestFrameClock()) {
-        rule.mainClock.autoAdvance = false
-        lateinit var swipeableState: SwipeableState<String>
-        lateinit var anchors: MutableState<Map<Float, String>>
-        setSwipeableContent {
-            swipeableState = rememberSwipeableState("A")
-            anchors = remember { mutableStateOf(mapOf(10f to "A", 50f to "B", 100f to "C")) }
-            Modifier.swipeable(
-                state = swipeableState,
-                anchors = anchors.value,
-                thresholds = { _, _ -> FractionalThreshold(0.5f) },
-                orientation = Orientation.Horizontal
-            )
+    fun swipeable_anchorsUpdated_whenAnimationInProgress() =
+        runBlocking(AutoTestFrameClock()) {
+            rule.mainClock.autoAdvance = false
+            lateinit var swipeableState: SwipeableState<String>
+            lateinit var anchors: MutableState<Map<Float, String>>
+            setSwipeableContent {
+                swipeableState = rememberSwipeableState("A")
+                anchors = remember { mutableStateOf(mapOf(10f to "A", 50f to "B", 100f to "C")) }
+                Modifier.swipeable(
+                    state = swipeableState,
+                    anchors = anchors.value,
+                    thresholds = { _, _ -> FractionalThreshold(0.5f) },
+                    orientation = Orientation.Horizontal
+                )
+            }
+
+            rule.runOnIdle {
+                assertThat(swipeableState.currentValue).isEqualTo("A")
+                assertThat(swipeableState.offset.value).isEqualTo(10f)
+            }
+
+            swipeableState.animateTo("B")
+
+            rule.mainClock.advanceTimeByFrame()
+
+            anchors.value = mapOf(10f to "A", 100f to "C")
+
+            advanceClock()
+
+            rule.runOnIdle {
+                // closes wins
+                assertThat(swipeableState.currentValue).isEqualTo("A")
+                assertThat(swipeableState.offset.value).isEqualTo(10f)
+            }
         }
 
-        rule.runOnIdle {
-            assertThat(swipeableState.currentValue).isEqualTo("A")
-            assertThat(swipeableState.offset.value).isEqualTo(10f)
-        }
-
-        swipeableState.animateTo("B")
-
-        rule.mainClock.advanceTimeByFrame()
-
-        anchors.value = mapOf(10f to "A", 100f to "C")
-
-        advanceClock()
-
-        rule.runOnIdle {
-            // closes wins
-            assertThat(swipeableState.currentValue).isEqualTo("A")
-            assertThat(swipeableState.offset.value).isEqualTo(10f)
-        }
-    }
-
     @Test
     fun testInspectorValue() {
         val anchors = mapOf(0f to "A", 100f to "B")
         rule.setContent {
-            val modifier = Modifier.swipeable(
-                state = rememberSwipeableState("A"),
-                anchors = anchors,
-                orientation = Orientation.Horizontal
-            ) as InspectableValue
+            val modifier =
+                Modifier.swipeable(
+                    state = rememberSwipeableState("A"),
+                    anchors = anchors,
+                    orientation = Orientation.Horizontal
+                ) as InspectableValue
             assertThat(modifier.nameFallback).isEqualTo("swipeable")
             assertThat(modifier.valueOverride).isNull()
-            assertThat(modifier.inspectableElements.map { it.name }.asIterable()).containsExactly(
-                "state",
-                "anchors",
-                "orientation",
-                "enabled",
-                "reverseDirection",
-                "interactionSource",
-                "thresholds",
-                "resistance",
-                "velocityThreshold"
-            )
+            assertThat(modifier.inspectableElements.map { it.name }.asIterable())
+                .containsExactly(
+                    "state",
+                    "anchors",
+                    "orientation",
+                    "enabled",
+                    "reverseDirection",
+                    "interactionSource",
+                    "thresholds",
+                    "resistance",
+                    "velocityThreshold"
+                )
         }
     }
 
@@ -1646,8 +1489,7 @@
             anchors = remember { mutableStateOf(mapOf(0f to "A", -1000f to "B")) }
             scrollState = rememberScrollState()
             Box(
-                Modifier
-                    .size(300.dp)
+                Modifier.size(300.dp)
                     .nestedScroll(swipeableState.PreUpPostDownNestedScrollConnection)
                     .swipeable(
                         state = swipeableState,
@@ -1656,9 +1498,7 @@
                         orientation = Orientation.Horizontal
                     )
             ) {
-                Column(
-                    Modifier.fillMaxWidth().testTag(swipeableTag).verticalScroll(scrollState)
-                ) {
+                Column(Modifier.fillMaxWidth().testTag(swipeableTag).verticalScroll(scrollState)) {
                     repeat(100) {
                         Text(text = it.toString(), modifier = Modifier.requiredHeight(50.dp))
                     }
@@ -1668,24 +1508,22 @@
 
         assertThat(swipeableState.currentValue).isEqualTo("A")
 
-        rule.onNodeWithTag(swipeableTag)
-            .performTouchInput {
-                down(Offset(x = 10f, y = 10f))
-                moveBy(Offset(x = 0f, y = -1500f))
-                up()
-            }
+        rule.onNodeWithTag(swipeableTag).performTouchInput {
+            down(Offset(x = 10f, y = 10f))
+            moveBy(Offset(x = 0f, y = -1500f))
+            up()
+        }
 
         advanceClock()
 
         assertThat(swipeableState.currentValue).isEqualTo("B")
         assertThat(scrollState.value).isGreaterThan(0)
 
-        rule.onNodeWithTag(swipeableTag)
-            .performTouchInput {
-                down(Offset(x = 10f, y = 10f))
-                moveBy(Offset(x = 0f, y = 1500f))
-                up()
-            }
+        rule.onNodeWithTag(swipeableTag).performTouchInput {
+            down(Offset(x = 10f, y = 10f))
+            moveBy(Offset(x = 0f, y = 1500f))
+            up()
+        }
 
         advanceClock()
 
@@ -1703,8 +1541,7 @@
             anchors = remember { mutableStateOf(mapOf(0f to "A", -1000f to "B")) }
             scrollState = rememberScrollState()
             Box(
-                Modifier
-                    .size(300.dp)
+                Modifier.size(300.dp)
                     .nestedScroll(swipeableState.PreUpPostDownNestedScrollConnection)
                     .swipeable(
                         state = swipeableState,
@@ -1713,9 +1550,7 @@
                         orientation = Orientation.Horizontal
                     )
             ) {
-                Column(
-                    Modifier.fillMaxWidth().testTag(swipeableTag).verticalScroll(scrollState)
-                ) {
+                Column(Modifier.fillMaxWidth().testTag(swipeableTag).verticalScroll(scrollState)) {
                     repeat(100) {
                         Text(text = it.toString(), modifier = Modifier.requiredHeight(50.dp))
                     }
@@ -1723,19 +1558,16 @@
             }
         }
 
-        rule.runOnIdle {
-            assertThat(swipeableState.currentValue).isEqualTo("A")
-        }
+        rule.runOnIdle { assertThat(swipeableState.currentValue).isEqualTo("A") }
 
-        rule.onNodeWithTag(swipeableTag)
-            .performTouchInput {
-                swipeWithVelocity(
-                    center,
-                    center.copy(y = centerY - 500, x = centerX),
-                    durationMillis = 50,
-                    endVelocity = 20000f
-                )
-            }
+        rule.onNodeWithTag(swipeableTag).performTouchInput {
+            swipeWithVelocity(
+                center,
+                center.copy(y = centerY - 500, x = centerX),
+                durationMillis = 50,
+                endVelocity = 20000f
+            )
+        }
 
         rule.runOnIdle {
             assertThat(swipeableState.currentValue).isEqualTo("B")
@@ -1743,15 +1575,14 @@
             assertThat(scrollState.value).isEqualTo(0)
         }
 
-        rule.onNodeWithTag(swipeableTag)
-            .performTouchInput {
-                swipeWithVelocity(
-                    center,
-                    center.copy(y = centerY + 500, x = centerX),
-                    durationMillis = 50,
-                    endVelocity = 20000f
-                )
-            }
+        rule.onNodeWithTag(swipeableTag).performTouchInput {
+            swipeWithVelocity(
+                center,
+                center.copy(y = centerY + 500, x = centerX),
+                durationMillis = 50,
+                endVelocity = 20000f
+            )
+        }
 
         rule.runOnIdle {
             assertThat(swipeableState.currentValue).isEqualTo("A")
@@ -1760,41 +1591,40 @@
     }
 
     @Test
-    fun swipeable_nestedScroll_postFlings() = runBlocking(AutoTestFrameClock()) {
-        lateinit var swipeableState: SwipeableState<String>
-        lateinit var anchors: MutableState<Map<Float, String>>
-        lateinit var scrollState: ScrollState
-        rule.setContent {
-            swipeableState = rememberSwipeableState("B")
-            anchors = remember { mutableStateOf(mapOf(0f to "A", -1000f to "B")) }
-            scrollState = rememberScrollState(initial = 5000)
-            Box(
-                Modifier
-                    .size(300.dp)
-                    .nestedScroll(swipeableState.PreUpPostDownNestedScrollConnection)
-                    .swipeable(
-                        state = swipeableState,
-                        anchors = anchors.value,
-                        thresholds = { _, _ -> FixedThreshold(56.dp) },
-                        orientation = Orientation.Horizontal
-                    )
-            ) {
-                Column(
-                    Modifier.fillMaxWidth().testTag(swipeableTag).verticalScroll(scrollState)
+    fun swipeable_nestedScroll_postFlings() =
+        runBlocking(AutoTestFrameClock()) {
+            lateinit var swipeableState: SwipeableState<String>
+            lateinit var anchors: MutableState<Map<Float, String>>
+            lateinit var scrollState: ScrollState
+            rule.setContent {
+                swipeableState = rememberSwipeableState("B")
+                anchors = remember { mutableStateOf(mapOf(0f to "A", -1000f to "B")) }
+                scrollState = rememberScrollState(initial = 5000)
+                Box(
+                    Modifier.size(300.dp)
+                        .nestedScroll(swipeableState.PreUpPostDownNestedScrollConnection)
+                        .swipeable(
+                            state = swipeableState,
+                            anchors = anchors.value,
+                            thresholds = { _, _ -> FixedThreshold(56.dp) },
+                            orientation = Orientation.Horizontal
+                        )
                 ) {
-                    repeat(100) {
-                        Text(text = it.toString(), modifier = Modifier.requiredHeight(50.dp))
+                    Column(
+                        Modifier.fillMaxWidth().testTag(swipeableTag).verticalScroll(scrollState)
+                    ) {
+                        repeat(100) {
+                            Text(text = it.toString(), modifier = Modifier.requiredHeight(50.dp))
+                        }
                     }
                 }
             }
-        }
 
-        rule.awaitIdle()
-        assertThat(swipeableState.currentValue).isEqualTo("B")
-        assertThat(scrollState.value).isEqualTo(5000)
+            rule.awaitIdle()
+            assertThat(swipeableState.currentValue).isEqualTo("B")
+            assertThat(scrollState.value).isEqualTo(5000)
 
-        rule.onNodeWithTag(swipeableTag)
-            .performTouchInput {
+            rule.onNodeWithTag(swipeableTag).performTouchInput {
                 // swipe less than scrollState.value but with velocity to test that backdrop won't
                 // move when receives, because it's at anchor
                 swipeWithVelocity(
@@ -1805,19 +1635,18 @@
                 )
             }
 
-        rule.awaitIdle()
-        assertThat(swipeableState.currentValue).isEqualTo("B")
-        assertThat(scrollState.value).isEqualTo(0)
-        // set value again to test overshoot
-        scrollState.scrollBy(500f)
-
-        rule.runOnIdle {
+            rule.awaitIdle()
             assertThat(swipeableState.currentValue).isEqualTo("B")
-            assertThat(scrollState.value).isEqualTo(500)
-        }
+            assertThat(scrollState.value).isEqualTo(0)
+            // set value again to test overshoot
+            scrollState.scrollBy(500f)
 
-        rule.onNodeWithTag(swipeableTag)
-            .performTouchInput {
+            rule.runOnIdle {
+                assertThat(swipeableState.currentValue).isEqualTo("B")
+                assertThat(scrollState.value).isEqualTo(500)
+            }
+
+            rule.onNodeWithTag(swipeableTag).performTouchInput {
                 // swipe more than scrollState.value so backdrop start receiving nested scroll
                 swipeWithVelocity(
                     center,
@@ -1827,31 +1656,23 @@
                 )
             }
 
-        rule.runOnIdle {
-            assertThat(swipeableState.currentValue).isEqualTo("A")
-            assertThat(scrollState.value).isEqualTo(0)
+            rule.runOnIdle {
+                assertThat(swipeableState.currentValue).isEqualTo("A")
+                assertThat(scrollState.value).isEqualTo(0)
+            }
         }
-    }
 
-    private fun swipeRight(
-        offset: Float = 100f,
-        velocity: Float? = null
-    ) = performSwipe(x = offset, velocity = velocity)
+    private fun swipeRight(offset: Float = 100f, velocity: Float? = null) =
+        performSwipe(x = offset, velocity = velocity)
 
-    private fun swipeLeft(
-        offset: Float = 100f,
-        velocity: Float? = null
-    ) = performSwipe(x = -offset, velocity = velocity)
+    private fun swipeLeft(offset: Float = 100f, velocity: Float? = null) =
+        performSwipe(x = -offset, velocity = velocity)
 
-    private fun swipeDown(
-        offset: Float = 100f,
-        velocity: Float? = null
-    ) = performSwipe(y = offset, velocity = velocity)
+    private fun swipeDown(offset: Float = 100f, velocity: Float? = null) =
+        performSwipe(y = offset, velocity = velocity)
 
-    private fun swipeUp(
-        offset: Float = 100f,
-        velocity: Float? = null
-    ) = performSwipe(y = -offset, velocity = velocity)
+    private fun swipeUp(offset: Float = 100f, velocity: Float? = null) =
+        performSwipe(y = -offset, velocity = velocity)
 
     private fun advanceClock() {
         rule.mainClock.advanceTimeBy(100_000L)
diff --git a/compose/material/material/src/androidInstrumentedTest/kotlin/androidx/compose/material/SwitchScreenshotTest.kt b/compose/material/material/src/androidInstrumentedTest/kotlin/androidx/compose/material/SwitchScreenshotTest.kt
index ba37996..372461d 100644
--- a/compose/material/material/src/androidInstrumentedTest/kotlin/androidx/compose/material/SwitchScreenshotTest.kt
+++ b/compose/material/material/src/androidInstrumentedTest/kotlin/androidx/compose/material/SwitchScreenshotTest.kt
@@ -62,32 +62,28 @@
 @OptIn(ExperimentalTestApi::class)
 class SwitchScreenshotTest {
 
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
-    @get:Rule
-    val screenshotRule = AndroidXScreenshotTestRule(GOLDEN_MATERIAL)
+    @get:Rule val screenshotRule = AndroidXScreenshotTestRule(GOLDEN_MATERIAL)
 
     // TODO(b/267253920): Add a compose test API to set/reset InputMode.
     @After
-    fun resetTouchMode() = with(InstrumentationRegistry.getInstrumentation()) {
-        if (SDK_INT < 33) setInTouchMode(true) else resetInTouchMode()
-    }
+    fun resetTouchMode() =
+        with(InstrumentationRegistry.getInstrumentation()) {
+            if (SDK_INT < 33) setInTouchMode(true) else resetInTouchMode()
+        }
 
     // TODO: this test tag as well as Boxes inside testa are temporarty, remove then b/157687898
     //  is fixed
     private val wrapperTestTag = "switchWrapper"
 
-    private val wrapperModifier = Modifier
-        .wrapContentSize(Alignment.TopStart)
-        .testTag(wrapperTestTag)
+    private val wrapperModifier =
+        Modifier.wrapContentSize(Alignment.TopStart).testTag(wrapperTestTag)
 
     @Test
     fun switchTest_checked() {
         rule.setMaterialContent {
-            Box(wrapperModifier) {
-                Switch(checked = true, onCheckedChange = { })
-            }
+            Box(wrapperModifier) { Switch(checked = true, onCheckedChange = {}) }
         }
         assertToggeableAgainstGolden("switch_checked")
     }
@@ -97,7 +93,7 @@
         rule.setMaterialContent {
             Box(wrapperModifier) {
                 CompositionLocalProvider(LocalLayoutDirection provides LayoutDirection.Rtl) {
-                    Switch(checked = true, onCheckedChange = { })
+                    Switch(checked = true, onCheckedChange = {})
                 }
             }
         }
@@ -110,7 +106,7 @@
             Box(wrapperModifier) {
                 Switch(
                     checked = true,
-                    onCheckedChange = { },
+                    onCheckedChange = {},
                     colors = SwitchDefaults.colors(checkedThumbColor = Color.Red)
                 )
             }
@@ -121,9 +117,7 @@
     @Test
     fun switchTest_unchecked() {
         rule.setMaterialContent {
-            Box(wrapperModifier) {
-                Switch(checked = false, onCheckedChange = { })
-            }
+            Box(wrapperModifier) { Switch(checked = false, onCheckedChange = {}) }
         }
         assertToggeableAgainstGolden("switch_unchecked")
     }
@@ -133,7 +127,7 @@
         rule.setMaterialContent {
             Box(wrapperModifier) {
                 CompositionLocalProvider(LocalLayoutDirection provides LayoutDirection.Rtl) {
-                    Switch(checked = false, onCheckedChange = { })
+                    Switch(checked = false, onCheckedChange = {})
                 }
             }
         }
@@ -144,7 +138,7 @@
     fun switchTest_bigSizeSpecified() {
         rule.setMaterialContent {
             Box(wrapperModifier.requiredSize(50.dp)) {
-                Switch(checked = true, onCheckedChange = { })
+                Switch(checked = true, onCheckedChange = {})
             }
         }
         assertToggeableAgainstGolden("switch_bigger_size")
@@ -153,14 +147,10 @@
     @Test
     fun switchTest_pressed() {
         rule.setMaterialContent {
-            Box(wrapperModifier) {
-                Switch(checked = false, enabled = true, onCheckedChange = { })
-            }
+            Box(wrapperModifier) { Switch(checked = false, enabled = true, onCheckedChange = {}) }
         }
 
-        rule.onNode(isToggleable()).performTouchInput {
-            down(center)
-        }
+        rule.onNode(isToggleable()).performTouchInput { down(center) }
 
         // Ripples are drawn on the RenderThread, not the main (UI) thread, so we can't wait for
         // synchronization. Instead just wait until after the ripples are finished animating.
@@ -172,9 +162,7 @@
     @Test
     fun switchTest_disabled_checked() {
         rule.setMaterialContent {
-            Box(wrapperModifier) {
-                Switch(checked = true, enabled = false, onCheckedChange = { })
-            }
+            Box(wrapperModifier) { Switch(checked = true, enabled = false, onCheckedChange = {}) }
         }
         assertToggeableAgainstGolden("switch_disabled_checked")
     }
@@ -182,9 +170,7 @@
     @Test
     fun switchTest_disabled_unchecked() {
         rule.setMaterialContent {
-            Box(wrapperModifier) {
-                Switch(checked = false, enabled = false, onCheckedChange = { })
-            }
+            Box(wrapperModifier) { Switch(checked = false, enabled = false, onCheckedChange = {}) }
         }
         assertToggeableAgainstGolden("switch_disabled_unchecked")
     }
@@ -194,10 +180,7 @@
         rule.setMaterialContent {
             val isChecked = remember { mutableStateOf(false) }
             Box(wrapperModifier) {
-                Switch(
-                    checked = isChecked.value,
-                    onCheckedChange = { isChecked.value = it }
-                )
+                Switch(checked = isChecked.value, onCheckedChange = { isChecked.value = it })
             }
         }
 
@@ -220,10 +203,7 @@
         rule.setMaterialContent {
             val isChecked = remember { mutableStateOf(true) }
             Box(wrapperModifier) {
-                Switch(
-                    checked = isChecked.value,
-                    onCheckedChange = { isChecked.value = it }
-                )
+                Switch(checked = isChecked.value, onCheckedChange = { isChecked.value = it })
             }
         }
 
@@ -244,16 +224,10 @@
     @Test
     fun switchTest_hover() {
         rule.setMaterialContent {
-            Box(wrapperModifier) {
-                Switch(
-                    checked = true,
-                    onCheckedChange = { }
-                )
-            }
+            Box(wrapperModifier) { Switch(checked = true, onCheckedChange = {}) }
         }
 
-        rule.onNode(isToggleable())
-            .performMouseInput { enter(center) }
+        rule.onNode(isToggleable()).performMouseInput { enter(center) }
 
         rule.waitForIdle()
 
@@ -270,9 +244,8 @@
             Box(wrapperModifier) {
                 Switch(
                     checked = true,
-                    onCheckedChange = { },
-                    modifier = Modifier
-                        .focusRequester(focusRequester)
+                    onCheckedChange = {},
+                    modifier = Modifier.focusRequester(focusRequester)
                 )
             }
         }
@@ -289,7 +262,8 @@
     }
 
     private fun assertToggeableAgainstGolden(goldenName: String) {
-        rule.onNodeWithTag(wrapperTestTag)
+        rule
+            .onNodeWithTag(wrapperTestTag)
             .captureToImage()
             .assertAgainstGolden(screenshotRule, goldenName)
     }
diff --git a/compose/material/material/src/androidInstrumentedTest/kotlin/androidx/compose/material/SwitchTest.kt b/compose/material/material/src/androidInstrumentedTest/kotlin/androidx/compose/material/SwitchTest.kt
index 57fc527..4654bfc 100644
--- a/compose/material/material/src/androidInstrumentedTest/kotlin/androidx/compose/material/SwitchTest.kt
+++ b/compose/material/material/src/androidInstrumentedTest/kotlin/androidx/compose/material/SwitchTest.kt
@@ -69,8 +69,7 @@
 @RunWith(AndroidJUnit4::class)
 class SwitchTest {
 
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
     private val defaultSwitchTag = "switch"
 
@@ -87,11 +86,13 @@
             }
         }
 
-        rule.onNodeWithTag("checked")
+        rule
+            .onNodeWithTag("checked")
             .assert(SemanticsMatcher.expectValue(SemanticsProperties.Role, Role.Switch))
             .assertIsEnabled()
             .assertIsOn()
-        rule.onNodeWithTag("unchecked")
+        rule
+            .onNodeWithTag("unchecked")
             .assert(SemanticsMatcher.expectValue(SemanticsProperties.Role, Role.Switch))
             .assertIsEnabled()
             .assertIsOff()
@@ -111,10 +112,7 @@
                 )
             }
         }
-        rule.onNodeWithTag(defaultSwitchTag)
-            .assertIsOff()
-            .performClick()
-            .assertIsOn()
+        rule.onNodeWithTag(defaultSwitchTag).assertIsOff().performClick().assertIsOn()
     }
 
     @Test
@@ -131,7 +129,8 @@
                 )
             }
         }
-        rule.onNodeWithTag(defaultSwitchTag)
+        rule
+            .onNodeWithTag(defaultSwitchTag)
             .assertIsOff()
             .performClick()
             .assertIsOn()
@@ -150,8 +149,7 @@
                 enabled = false
             )
         }
-        rule.onNodeWithTag(defaultSwitchTag)
-            .assertHasClickAction()
+        rule.onNodeWithTag(defaultSwitchTag).assertHasClickAction()
     }
 
     @Test
@@ -170,12 +168,10 @@
             }
         }
 
-        rule.onNodeWithTag(defaultSwitchTag)
-            .assertHasClickAction()
+        rule.onNodeWithTag(defaultSwitchTag).assertHasClickAction()
 
         // Check not merged into parent
-        rule.onNodeWithTag(parentTag)
-            .assert(isNotFocusable())
+        rule.onNodeWithTag(parentTag).assert(isNotFocusable())
     }
 
     @Test
@@ -183,89 +179,54 @@
         rule.setMaterialContent {
             val (checked, _) = remember { mutableStateOf(false) }
             Box(Modifier.semantics(mergeDescendants = true) {}.testTag(defaultSwitchTag)) {
-                Switch(
-                    checked,
-                    null,
-                    modifier = Modifier.semantics { focused = true }
-                )
+                Switch(checked, null, modifier = Modifier.semantics { focused = true })
             }
         }
 
-        rule.onNodeWithTag(defaultSwitchTag)
+        rule
+            .onNodeWithTag(defaultSwitchTag)
             .assertHasNoClickAction()
             .assert(isFocusable()) // Check merged into parent
     }
 
     @Test
     fun switch_materialSizes_whenChecked_minimumTouchTarget() {
-        materialSizesTestForValue(
-            checked = true,
-            clickable = true,
-            minimumTouchTarget = true
-        )
+        materialSizesTestForValue(checked = true, clickable = true, minimumTouchTarget = true)
     }
 
     @Test
     fun switch_materialSizes_whenChecked_withoutMinimumTouchTarget() {
-        materialSizesTestForValue(
-            checked = true,
-            clickable = true,
-            minimumTouchTarget = false
-        )
+        materialSizesTestForValue(checked = true, clickable = true, minimumTouchTarget = false)
     }
 
     @Test
     fun switch_materialSizes_whenUnchecked_minimumTouchTarget() {
-        materialSizesTestForValue(
-            checked = false,
-            clickable = true,
-            minimumTouchTarget = true
-        )
+        materialSizesTestForValue(checked = false, clickable = true, minimumTouchTarget = true)
     }
 
     @Test
     fun switch_materialSizes_whenUnchecked_withoutMinimumTouchTarget() {
-        materialSizesTestForValue(
-            checked = false,
-            clickable = true,
-            minimumTouchTarget = false
-        )
+        materialSizesTestForValue(checked = false, clickable = true, minimumTouchTarget = false)
     }
 
     @Test
     fun switch_materialSizes_whenChecked_notClickable_minimumTouchTarget() {
-        materialSizesTestForValue(
-            checked = true,
-            clickable = false,
-            minimumTouchTarget = true
-        )
+        materialSizesTestForValue(checked = true, clickable = false, minimumTouchTarget = true)
     }
 
     @Test
     fun switch_materialSizes_whenChecked_notClickable_withoutMinimumTouchTarget() {
-        materialSizesTestForValue(
-            checked = true,
-            clickable = false,
-            minimumTouchTarget = false
-        )
+        materialSizesTestForValue(checked = true, clickable = false, minimumTouchTarget = false)
     }
 
     @Test
     fun switch_materialSizes_whenUnchecked_notClickable_minimumTouchTarget() {
-        materialSizesTestForValue(
-            checked = false,
-            clickable = false,
-            minimumTouchTarget = true
-        )
+        materialSizesTestForValue(checked = false, clickable = false, minimumTouchTarget = true)
     }
 
     @Test
     fun switch_materialSizes_whenUnchecked_notClickable_withoutMinimumTouchTarget() {
-        materialSizesTestForValue(
-            checked = false,
-            clickable = false,
-            minimumTouchTarget = false
-        )
+        materialSizesTestForValue(checked = false, clickable = false, minimumTouchTarget = false)
     }
 
     @Test
@@ -283,19 +244,13 @@
             }
         }
 
-        rule.onNodeWithTag(defaultSwitchTag)
-            .performTouchInput { swipeRight() }
+        rule.onNodeWithTag(defaultSwitchTag).performTouchInput { swipeRight() }
 
-        rule.runOnIdle {
-            Truth.assertThat(state.value).isEqualTo(true)
-        }
+        rule.runOnIdle { Truth.assertThat(state.value).isEqualTo(true) }
 
-        rule.onNodeWithTag(defaultSwitchTag)
-            .performTouchInput { swipeLeft() }
+        rule.onNodeWithTag(defaultSwitchTag).performTouchInput { swipeLeft() }
 
-        rule.runOnIdle {
-            Truth.assertThat(state.value).isEqualTo(false)
-        }
+        rule.runOnIdle { Truth.assertThat(state.value).isEqualTo(false) }
     }
 
     @Test
@@ -315,19 +270,13 @@
             }
         }
 
-        rule.onNodeWithTag(defaultSwitchTag)
-            .performTouchInput { swipeLeft() }
+        rule.onNodeWithTag(defaultSwitchTag).performTouchInput { swipeLeft() }
 
-        rule.runOnIdle {
-            Truth.assertThat(state.value).isEqualTo(true)
-        }
+        rule.runOnIdle { Truth.assertThat(state.value).isEqualTo(true) }
 
-        rule.onNodeWithTag(defaultSwitchTag)
-            .performTouchInput { swipeRight() }
+        rule.onNodeWithTag(defaultSwitchTag).performTouchInput { swipeRight() }
 
-        rule.runOnIdle {
-            Truth.assertThat(state.value).isEqualTo(false)
-        }
+        rule.runOnIdle { Truth.assertThat(state.value).isEqualTo(false) }
     }
 
     // regression test for b/191375128
@@ -337,9 +286,7 @@
         var items by mutableStateOf(listOf(1 to false, 2 to true))
         rule.setContent {
             Column {
-                Button(onClick = { screenTwo.value = !screenTwo.value }) {
-                    Text("switch screen")
-                }
+                Button(onClick = { screenTwo.value = !screenTwo.value }) { Text("switch screen") }
                 val holder = rememberSaveableStateHolder()
                 holder.SaveableStateProvider(screenTwo.value) {
                     if (screenTwo.value) {
@@ -355,9 +302,10 @@
                                         modifier = Modifier.testTag(item.first.toString()),
                                         checked = item.second,
                                         onCheckedChange = {
-                                            items = items.toMutableList().also {
-                                                it[index] = item.first to !item.second
-                                            }
+                                            items =
+                                                items.toMutableList().also {
+                                                    it[index] = item.first to !item.second
+                                                }
                                         }
                                     )
                                 }
@@ -369,18 +317,15 @@
         }
         rule.onNodeWithTag("1").assertIsOff()
         rule.onNodeWithTag("2").assertIsOn()
+        rule.runOnIdle { screenTwo.value = true }
         rule.runOnIdle {
-            screenTwo.value = true
+            items =
+                items.toMutableList().also {
+                    it[0] = items[0].first to !items[0].second
+                    it[1] = items[1].first to !items[1].second
+                }
         }
-        rule.runOnIdle {
-            items = items.toMutableList().also {
-                it[0] = items[0].first to !items[0].second
-                it[1] = items[1].first to !items[1].second
-            }
-        }
-        rule.runOnIdle {
-            screenTwo.value = false
-        }
+        rule.runOnIdle { screenTwo.value = false }
         rule.onNodeWithTag("1").assertIsOn()
         rule.onNodeWithTag("2").assertIsOff()
     }
@@ -390,61 +335,72 @@
         checked: Boolean,
         clickable: Boolean,
         minimumTouchTarget: Boolean
-    ) = with(rule.density) {
-        rule.setMaterialContentForSizeAssertions {
-            CompositionLocalProvider(
-                LocalMinimumInteractiveComponentEnforcement provides minimumTouchTarget
-            ) {
-                Switch(
-                    checked = checked,
-                    onCheckedChange = if (clickable) { {} } else null,
-                    enabled = false
-                )
-            }
-        }.run {
-            if (clickable && minimumTouchTarget) {
-                assertIsSquareWithSize(48.dp)
-            } else {
-                // The padding should be 2 DP, but we round to pixels when determining layout
-                val paddingInPixels = 2.dp.roundToPx()
+    ) =
+        with(rule.density) {
+            rule
+                .setMaterialContentForSizeAssertions {
+                    CompositionLocalProvider(
+                        LocalMinimumInteractiveComponentEnforcement provides minimumTouchTarget
+                    ) {
+                        Switch(
+                            checked = checked,
+                            onCheckedChange =
+                                if (clickable) {
+                                    {}
+                                } else null,
+                            enabled = false
+                        )
+                    }
+                }
+                .run {
+                    if (clickable && minimumTouchTarget) {
+                        assertIsSquareWithSize(48.dp)
+                    } else {
+                        // The padding should be 2 DP, but we round to pixels when determining
+                        // layout
+                        val paddingInPixels = 2.dp.roundToPx()
 
-                // Convert back to DP so that we have an exact DP value to work with. We don't
-                // want to multiply the error by two (one for each padding), so we get the exact
-                // padding based on the expected pixels consumed by the padding.
-                val paddingInDp = paddingInPixels.toDp()
-                assertWidthIsEqualTo(34.dp + paddingInDp * 2)
-                assertHeightIsEqualTo(20.dp + paddingInDp * 2)
-            }
+                        // Convert back to DP so that we have an exact DP value to work with. We
+                        // don't
+                        // want to multiply the error by two (one for each padding), so we get the
+                        // exact
+                        // padding based on the expected pixels consumed by the padding.
+                        val paddingInDp = paddingInPixels.toDp()
+                        assertWidthIsEqualTo(34.dp + paddingInDp * 2)
+                        assertHeightIsEqualTo(20.dp + paddingInDp * 2)
+                    }
+                }
         }
-    }
 
     /**
-     * A switch should have a minimum touch target of 48 DP x 48 DP and the reported size
-     * should match that, despite the fact that we force the size to be smaller.
+     * A switch should have a minimum touch target of 48 DP x 48 DP and the reported size should
+     * match that, despite the fact that we force the size to be smaller.
      */
     @Test
-    fun switch_minTouchTargetArea(): Unit = with(rule.density) {
-        var checked by mutableStateOf(false)
-        rule.setMaterialContent {
-            // Box is needed because otherwise the control will be expanded to fill its parent
-            Box(Modifier.fillMaxSize()) {
-                Switch(
-                    modifier = Modifier.align(Alignment.Center)
-                        .testTag(defaultSwitchTag)
-                        .requiredSize(2.dp),
-                    checked = checked,
-                    onCheckedChange = { checked = it }
-                )
+    fun switch_minTouchTargetArea(): Unit =
+        with(rule.density) {
+            var checked by mutableStateOf(false)
+            rule.setMaterialContent {
+                // Box is needed because otherwise the control will be expanded to fill its parent
+                Box(Modifier.fillMaxSize()) {
+                    Switch(
+                        modifier =
+                            Modifier.align(Alignment.Center)
+                                .testTag(defaultSwitchTag)
+                                .requiredSize(2.dp),
+                        checked = checked,
+                        onCheckedChange = { checked = it }
+                    )
+                }
             }
+            rule
+                .onNodeWithTag(defaultSwitchTag)
+                .assertIsOff()
+                .assertWidthIsEqualTo(2.dp)
+                .assertHeightIsEqualTo(2.dp)
+                .assertTouchWidthIsEqualTo(48.dp)
+                .assertTouchHeightIsEqualTo(48.dp)
+                .performTouchInput { click(position = Offset(-1f, -1f)) }
+                .assertIsOn()
         }
-        rule.onNodeWithTag(defaultSwitchTag)
-            .assertIsOff()
-            .assertWidthIsEqualTo(2.dp)
-            .assertHeightIsEqualTo(2.dp)
-            .assertTouchWidthIsEqualTo(48.dp)
-            .assertTouchHeightIsEqualTo(48.dp)
-            .performTouchInput {
-                click(position = Offset(-1f, -1f))
-            }.assertIsOn()
-    }
 }
diff --git a/compose/material/material/src/androidInstrumentedTest/kotlin/androidx/compose/material/TabScreenshotTest.kt b/compose/material/material/src/androidInstrumentedTest/kotlin/androidx/compose/material/TabScreenshotTest.kt
index a0b17e9..7f1e27f 100644
--- a/compose/material/material/src/androidInstrumentedTest/kotlin/androidx/compose/material/TabScreenshotTest.kt
+++ b/compose/material/material/src/androidInstrumentedTest/kotlin/androidx/compose/material/TabScreenshotTest.kt
@@ -49,11 +49,9 @@
 @SdkSuppress(minSdkVersion = Build.VERSION_CODES.O)
 class TabScreenshotTest {
 
-    @get:Rule
-    val composeTestRule = createComposeRule()
+    @get:Rule val composeTestRule = createComposeRule()
 
-    @get:Rule
-    val screenshotRule = AndroidXScreenshotTestRule(GOLDEN_MATERIAL)
+    @get:Rule val screenshotRule = AndroidXScreenshotTestRule(GOLDEN_MATERIAL)
 
     @Test
     fun lightTheme_defaultColors() {
@@ -63,9 +61,7 @@
 
         composeTestRule.setContent {
             scope = rememberCoroutineScope()
-            MaterialTheme(lightColors()) {
-                DefaultTabs(interactionSource)
-            }
+            MaterialTheme(lightColors()) { DefaultTabs(interactionSource) }
         }
 
         assertTabsMatch(
@@ -84,9 +80,7 @@
 
         composeTestRule.setContent {
             scope = rememberCoroutineScope()
-            MaterialTheme(lightColors()) {
-                DefaultTabs(interactionSource)
-            }
+            MaterialTheme(lightColors()) { DefaultTabs(interactionSource) }
         }
 
         assertTabsMatch(
@@ -157,9 +151,7 @@
 
         composeTestRule.setContent {
             scope = rememberCoroutineScope()
-            MaterialTheme(darkColors()) {
-                DefaultTabs(interactionSource)
-            }
+            MaterialTheme(darkColors()) { DefaultTabs(interactionSource) }
         }
 
         assertTabsMatch(
@@ -178,9 +170,7 @@
 
         composeTestRule.setContent {
             scope = rememberCoroutineScope()
-            MaterialTheme(darkColors()) {
-                DefaultTabs(interactionSource)
-            }
+            MaterialTheme(darkColors()) { DefaultTabs(interactionSource) }
         }
 
         assertTabsMatch(
@@ -306,9 +296,7 @@
 
         composeTestRule.setContent {
             scope = rememberCoroutineScope()
-            MaterialTheme(lightColors()) {
-                DefaultLeadingIconTabs(interactionSource)
-            }
+            MaterialTheme(lightColors()) { DefaultLeadingIconTabs(interactionSource) }
         }
 
         assertTabsMatch(
@@ -327,9 +315,7 @@
 
         composeTestRule.setContent {
             scope = rememberCoroutineScope()
-            MaterialTheme(darkColors()) {
-                DefaultLeadingIconTabs(interactionSource)
-            }
+            MaterialTheme(darkColors()) { DefaultLeadingIconTabs(interactionSource) }
         }
 
         assertTabsMatch(
@@ -356,9 +342,7 @@
         if (interaction != null) {
             composeTestRule.runOnIdle {
                 // Start ripple
-                scope.launch {
-                    interactionSource.emit(interaction)
-                }
+                scope.launch { interactionSource.emit(interaction) }
             }
 
             composeTestRule.waitForIdle()
@@ -369,7 +353,8 @@
         }
 
         // Capture and compare screenshots
-        composeTestRule.onNodeWithTag(Tag)
+        composeTestRule
+            .onNodeWithTag(Tag)
             .captureToImage()
             .assertAgainstGolden(screenshotRule, goldenIdentifier)
     }
@@ -379,12 +364,10 @@
  * Default colored [TabRow] with three [Tab]s. The first [Tab] is selected, and the rest are not.
  *
  * @param interactionSource the [MutableInteractionSource] for the first [Tab], to control its
- * visual state.
+ *   visual state.
  */
 @Composable
-private fun DefaultTabs(
-    interactionSource: MutableInteractionSource
-) {
+private fun DefaultTabs(interactionSource: MutableInteractionSource) {
     Box(Modifier.semantics(mergeDescendants = true) {}.testTag(Tag)) {
         TabRow(selectedTabIndex = 0) {
             Tab(
@@ -393,16 +376,8 @@
                 interactionSource = interactionSource,
                 onClick = {}
             )
-            Tab(
-                text = { Text("TAB") },
-                selected = false,
-                onClick = {}
-            )
-            Tab(
-                text = { Text("TAB") },
-                selected = false,
-                onClick = {}
-            )
+            Tab(text = { Text("TAB") }, selected = false, onClick = {})
+            Tab(text = { Text("TAB") }, selected = false, onClick = {})
         }
     }
 }
@@ -411,7 +386,7 @@
  * Custom colored [TabRow] with three [Tab]s. The first [Tab] is selected, and the rest are not.
  *
  * @param interactionSource the [MutableInteractionSource] for the first [Tab], to control its
- * visual state.
+ *   visual state.
  * @param backgroundColor the backgroundColor of the [TabRow]
  * @param selectedContentColor the content color for a selected [Tab] (first tab)
  * @param unselectedContentColor the content color for an unselected [Tab] (second and third tabs)
@@ -458,13 +433,11 @@
  * Default colored [TabRow] with three [LeadingIconTab]s. The first [LeadingIconTab] is selected,
  * and the rest are not.
  *
- * @param interactionSource the [MutableInteractionSource] for the first [LeadingIconTab], to control its
- * visual state.
+ * @param interactionSource the [MutableInteractionSource] for the first [LeadingIconTab], to
+ *   control its visual state.
  */
 @Composable
-private fun DefaultLeadingIconTabs(
-    interactionSource: MutableInteractionSource
-) {
+private fun DefaultLeadingIconTabs(interactionSource: MutableInteractionSource) {
     Box(Modifier.semantics(mergeDescendants = true) {}.testTag(Tag)) {
         TabRow(selectedTabIndex = 0) {
             LeadingIconTab(
diff --git a/compose/material/material/src/androidInstrumentedTest/kotlin/androidx/compose/material/TabTest.kt b/compose/material/material/src/androidInstrumentedTest/kotlin/androidx/compose/material/TabTest.kt
index edd3c5f..dfe0510 100644
--- a/compose/material/material/src/androidInstrumentedTest/kotlin/androidx/compose/material/TabTest.kt
+++ b/compose/material/material/src/androidInstrumentedTest/kotlin/androidx/compose/material/TabTest.kt
@@ -77,8 +77,7 @@
 
     private val icon = Icons.Filled.Favorite
 
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
     @Before
     fun before() {
@@ -103,13 +102,15 @@
             }
         }
 
-        rule.onNodeWithTag("tab")
+        rule
+            .onNodeWithTag("tab")
             .assert(SemanticsMatcher.expectValue(SemanticsProperties.Role, Role.Tab))
             .assertIsSelected()
             .assertIsEnabled()
             .assertHasClickAction()
 
-        rule.onNodeWithTag("tab")
+        rule
+            .onNodeWithTag("tab")
             .onParent()
             .assert(SemanticsMatcher.keyIsDefined(SemanticsProperties.SelectableGroup))
     }
@@ -128,7 +129,8 @@
             }
         }
 
-        rule.onNodeWithTag("tab")
+        rule
+            .onNodeWithTag("tab")
             .assert(SemanticsMatcher.expectValue(SemanticsProperties.Role, Role.Tab))
             .assertIsSelected()
             .assertIsNotEnabled()
@@ -149,13 +151,15 @@
             }
         }
 
-        rule.onNodeWithTag("leadingIconTab")
+        rule
+            .onNodeWithTag("leadingIconTab")
             .assert(SemanticsMatcher.expectValue(SemanticsProperties.Role, Role.Tab))
             .assertIsSelected()
             .assertIsEnabled()
             .assertHasClickAction()
 
-        rule.onNodeWithTag("leadingIconTab")
+        rule
+            .onNodeWithTag("leadingIconTab")
             .onParent()
             .assert(SemanticsMatcher.keyIsDefined(SemanticsProperties.SelectableGroup))
     }
@@ -175,7 +179,8 @@
             }
         }
 
-        rule.onNodeWithTag("leadingIconTab")
+        rule
+            .onNodeWithTag("leadingIconTab")
             .assert(SemanticsMatcher.expectValue(SemanticsProperties.Role, Role.Tab))
             .assertIsSelected()
             .assertIsNotEnabled()
@@ -240,22 +245,19 @@
             var state by remember { mutableStateOf(0) }
             val titles = listOf("TAB 1", "TAB 2")
 
-            val indicator = @Composable { tabPositions: List<TabPosition> ->
-                Box(
-                    Modifier
-                        .tabIndicatorOffset(tabPositions[state])
-                        .fillMaxWidth()
-                        .height(indicatorHeight)
-                        .background(color = Color.Red)
-                        .testTag("indicator")
-                )
-            }
+            val indicator =
+                @Composable { tabPositions: List<TabPosition> ->
+                    Box(
+                        Modifier.tabIndicatorOffset(tabPositions[state])
+                            .fillMaxWidth()
+                            .height(indicatorHeight)
+                            .background(color = Color.Red)
+                            .testTag("indicator")
+                    )
+                }
 
             Box(Modifier.testTag("tabRow")) {
-                TabRow(
-                    selectedTabIndex = state,
-                    indicator = indicator
-                ) {
+                TabRow(selectedTabIndex = state, indicator = indicator) {
                     titles.forEachIndexed { index, title ->
                         Tab(
                             text = { Text(title) },
@@ -269,7 +271,8 @@
 
         val tabRowBounds = rule.onNodeWithTag("tabRow").getUnclippedBoundsInRoot()
 
-        rule.onNodeWithTag("indicator", true)
+        rule
+            .onNodeWithTag("indicator", true)
             .assertPositionInRootIsEqualTo(
                 expectedLeft = 0.dp,
                 expectedTop = tabRowBounds.height - indicatorHeight
@@ -280,7 +283,8 @@
 
         // Indicator should now be placed in the bottom left of the second tab, so its x coordinate
         // should be in the middle of the TabRow
-        rule.onNodeWithTag("indicator", true)
+        rule
+            .onNodeWithTag("indicator", true)
             .assertPositionInRootIsEqualTo(
                 expectedLeft = (tabRowBounds.width / 2),
                 expectedTop = tabRowBounds.height - indicatorHeight
@@ -315,7 +319,8 @@
 
         val tabRowBounds = rule.onNodeWithTag("tabRow").getBoundsInRoot()
 
-        rule.onNodeWithTag("divider", true)
+        rule
+            .onNodeWithTag("divider", true)
             .assertPositionInRootIsEqualTo(
                 expectedLeft = 0.dp,
                 expectedTop = tabRowBounds.height - TabRowDefaults.DividerThickness
@@ -330,15 +335,10 @@
             val titles = listOf("TAB")
 
             Box {
-                TabRow(
-                    modifier = Modifier.testTag("tabRow"),
-                    selectedTabIndex = state
-                ) {
+                TabRow(modifier = Modifier.testTag("tabRow"), selectedTabIndex = state) {
                     titles.forEachIndexed { index, title ->
                         Tab(
-                            text = {
-                                Text(title, Modifier.testTag("text"))
-                            },
+                            text = { Text(title, Modifier.testTag("text")) },
                             selected = state == index,
                             onClick = { state = index }
                         )
@@ -361,15 +361,10 @@
             val titles = listOf("TAB")
 
             Box {
-                TabRow(
-                    modifier = Modifier.testTag("tabRow"),
-                    selectedTabIndex = state
-                ) {
+                TabRow(modifier = Modifier.testTag("tabRow"), selectedTabIndex = state) {
                     titles.forEachIndexed { index, title ->
                         Tab(
-                            text = {
-                                Text(title, Modifier.testTag("text"))
-                            },
+                            text = { Text(title, Modifier.testTag("text")) },
                             icon = { Icon(Icons.Filled.Favorite, null) },
                             selected = state == index,
                             onClick = { state = index }
@@ -401,15 +396,10 @@
             val titles = listOf("Two line \n text")
 
             Box {
-                TabRow(
-                    modifier = Modifier.testTag("tabRow"),
-                    selectedTabIndex = state
-                ) {
+                TabRow(modifier = Modifier.testTag("tabRow"), selectedTabIndex = state) {
                     titles.forEachIndexed { index, title ->
                         Tab(
-                            text = {
-                                Text(title, Modifier.testTag("text"), maxLines = 2)
-                            },
+                            text = { Text(title, Modifier.testTag("text"), maxLines = 2) },
                             selected = state == index,
                             onClick = { state = index }
                         )
@@ -430,14 +420,9 @@
     fun LeadingIconTab_textAndIconPosition() {
         rule.setMaterialContent {
             Box {
-                TabRow(
-                    modifier = Modifier.testTag("tabRow"),
-                    selectedTabIndex = 0
-                ) {
+                TabRow(modifier = Modifier.testTag("tabRow"), selectedTabIndex = 0) {
                     LeadingIconTab(
-                        text = {
-                            Text("TAB", Modifier.testTag("text"))
-                        },
+                        text = { Text("TAB", Modifier.testTag("text")) },
                         icon = { Icon(Icons.Filled.Favorite, null, Modifier.testTag("icon")) },
                         selected = true,
                         onClick = {}
@@ -475,16 +460,16 @@
             var state by remember { mutableStateOf(0) }
             val titles = listOf("TAB 1", "TAB 2")
 
-            val indicator = @Composable { tabPositions: List<TabPosition> ->
-                Box(
-                    Modifier
-                        .tabIndicatorOffset(tabPositions[state])
-                        .fillMaxWidth()
-                        .height(indicatorHeight)
-                        .background(color = Color.Red)
-                        .testTag("indicator")
-                )
-            }
+            val indicator =
+                @Composable { tabPositions: List<TabPosition> ->
+                    Box(
+                        Modifier.tabIndicatorOffset(tabPositions[state])
+                            .fillMaxWidth()
+                            .height(indicatorHeight)
+                            .background(color = Color.Red)
+                            .testTag("indicator")
+                    )
+                }
 
             Box {
                 ScrollableTabRow(
@@ -506,7 +491,8 @@
         val tabRowBounds = rule.onNodeWithTag("tabRow").getUnclippedBoundsInRoot()
 
         // Indicator should be placed in the bottom left of the first tab
-        rule.onNodeWithTag("indicator", true)
+        rule
+            .onNodeWithTag("indicator", true)
             .assertPositionInRootIsEqualTo(
                 // Tabs in a scrollable tab row are offset 52.dp from each end
                 expectedLeft = TabRowDefaults.ScrollableTabRowPadding,
@@ -518,7 +504,8 @@
 
         // Indicator should now be placed in the bottom left of the second tab, so its x coordinate
         // should be in the middle of the TabRow
-        rule.onNodeWithTag("indicator", true)
+        rule
+            .onNodeWithTag("indicator", true)
             .assertPositionInRootIsEqualTo(
                 expectedLeft = TabRowDefaults.ScrollableTabRowPadding + minimumTabWidth,
                 expectedTop = tabRowBounds.height - indicatorHeight
@@ -553,7 +540,8 @@
 
         val tabRowBounds = rule.onNodeWithTag("tabRow").getBoundsInRoot()
 
-        rule.onNodeWithTag("divider", true)
+        rule
+            .onNodeWithTag("divider", true)
             .assertPositionInRootIsEqualTo(
                 expectedLeft = 0.dp,
                 expectedTop = tabRowBounds.height - TabRowDefaults.DividerThickness,
@@ -563,171 +551,124 @@
 
     @Test
     fun fixedTabRow_initialTabSelected() {
-        rule
-            .setMaterialContent {
-                TextTabs()
-            }
+        rule.setMaterialContent { TextTabs() }
 
         // Only the first tab should be selected
-        rule.onAllNodes(isSelectable())
-            .assertCountEquals(3)
-            .apply {
-                get(0).assertIsSelected()
-                get(1).assertIsNotSelected()
-                get(2).assertIsNotSelected()
-            }
+        rule.onAllNodes(isSelectable()).assertCountEquals(3).apply {
+            get(0).assertIsSelected()
+            get(1).assertIsNotSelected()
+            get(2).assertIsNotSelected()
+        }
     }
 
     @Test
     fun fixedTabRow_selectNewTab() {
-        rule
-            .setMaterialContent {
-                TextTabs()
-            }
+        rule.setMaterialContent { TextTabs() }
 
         // Only the first tab should be selected
-        rule.onAllNodes(isSelectable())
-            .assertCountEquals(3)
-            .apply {
-                get(0).assertIsSelected()
-                get(1).assertIsNotSelected()
-                get(2).assertIsNotSelected()
-            }
+        rule.onAllNodes(isSelectable()).assertCountEquals(3).apply {
+            get(0).assertIsSelected()
+            get(1).assertIsNotSelected()
+            get(2).assertIsNotSelected()
+        }
 
         // Click the last tab
         rule.onAllNodes(isSelectable())[2].performClick()
 
         // Now only the last tab should be selected
-        rule.onAllNodes(isSelectable())
-            .assertCountEquals(3)
-            .apply {
-                get(0).assertIsNotSelected()
-                get(1).assertIsNotSelected()
-                get(2).assertIsSelected()
-            }
+        rule.onAllNodes(isSelectable()).assertCountEquals(3).apply {
+            get(0).assertIsNotSelected()
+            get(1).assertIsNotSelected()
+            get(2).assertIsSelected()
+        }
     }
 
     @Test
     fun fixedLeadingIconTabRow_initialTabSelected() {
-        rule
-            .setMaterialContent {
-                LeadingIconTabs()
-            }
+        rule.setMaterialContent { LeadingIconTabs() }
 
         // Only the first tab should be selected
-        rule.onAllNodes(isSelectable())
-            .assertCountEquals(3)
-            .apply {
-                get(0).assertIsSelected()
-                get(1).assertIsNotSelected()
-                get(2).assertIsNotSelected()
-            }
+        rule.onAllNodes(isSelectable()).assertCountEquals(3).apply {
+            get(0).assertIsSelected()
+            get(1).assertIsNotSelected()
+            get(2).assertIsNotSelected()
+        }
     }
 
     @Test
     fun LeadingIconTabRow_selectNewTab() {
-        rule
-            .setMaterialContent {
-                LeadingIconTabs()
-            }
+        rule.setMaterialContent { LeadingIconTabs() }
 
         // Only the first tab should be selected
-        rule.onAllNodes(isSelectable())
-            .assertCountEquals(3)
-            .apply {
-                get(0).assertIsSelected()
-                get(1).assertIsNotSelected()
-                get(2).assertIsNotSelected()
-            }
+        rule.onAllNodes(isSelectable()).assertCountEquals(3).apply {
+            get(0).assertIsSelected()
+            get(1).assertIsNotSelected()
+            get(2).assertIsNotSelected()
+        }
 
         // Click the last tab
         rule.onAllNodes(isSelectable())[2].performClick()
 
         // Now only the last tab should be selected
-        rule.onAllNodes(isSelectable())
-            .assertCountEquals(3)
-            .apply {
-                get(0).assertIsNotSelected()
-                get(1).assertIsNotSelected()
-                get(2).assertIsSelected()
-            }
+        rule.onAllNodes(isSelectable()).assertCountEquals(3).apply {
+            get(0).assertIsNotSelected()
+            get(1).assertIsNotSelected()
+            get(2).assertIsSelected()
+        }
     }
 
     @Test
     fun scrollableTabRow_initialTabSelected() {
-        rule
-            .setMaterialContent {
-                ScrollingTextTabs()
-            }
+        rule.setMaterialContent { ScrollingTextTabs() }
 
         // Only the first tab should be selected
-        rule.onAllNodes(isSelectable())
-            .assertCountEquals(10)
-            .apply {
-                get(0).assertIsSelected()
-                (1..9).forEach {
-                    get(it).assertIsNotSelected()
-                }
-            }
+        rule.onAllNodes(isSelectable()).assertCountEquals(10).apply {
+            get(0).assertIsSelected()
+            (1..9).forEach { get(it).assertIsNotSelected() }
+        }
     }
 
     @Test
     fun scrollableTabRow_offScreenTabInitiallySelected() {
-        rule
-            .setMaterialContent {
-                var state by remember { mutableStateOf(9) }
-                val titles = List(10) { "Tab ${it + 1}" }
-                ScrollableTabRow(selectedTabIndex = state) {
-                    titles.forEachIndexed { index, title ->
-                        Tab(
-                            text = { Text(title) },
-                            selected = state == index,
-                            onClick = { state = index }
-                        )
-                    }
+        rule.setMaterialContent {
+            var state by remember { mutableStateOf(9) }
+            val titles = List(10) { "Tab ${it + 1}" }
+            ScrollableTabRow(selectedTabIndex = state) {
+                titles.forEachIndexed { index, title ->
+                    Tab(
+                        text = { Text(title) },
+                        selected = state == index,
+                        onClick = { state = index }
+                    )
                 }
             }
+        }
 
-        rule.onAllNodes(isSelectable())
-            .assertCountEquals(10)
-            .apply {
-                // The last tab should be selected and displayed (scrolled to)
-                get(9)
-                    .assertIsSelected()
-                    .assertIsDisplayed()
-            }
+        rule.onAllNodes(isSelectable()).assertCountEquals(10).apply {
+            // The last tab should be selected and displayed (scrolled to)
+            get(9).assertIsSelected().assertIsDisplayed()
+        }
     }
 
     @Test
     fun scrollableTabRow_selectNewTab() {
-        rule
-            .setMaterialContent {
-                ScrollingTextTabs()
-            }
+        rule.setMaterialContent { ScrollingTextTabs() }
 
         // Only the first tab should be selected
-        rule.onAllNodes(isSelectable())
-            .assertCountEquals(10)
-            .apply {
-                get(0).assertIsSelected()
-                (1..9).forEach {
-                    get(it).assertIsNotSelected()
-                }
-            }
+        rule.onAllNodes(isSelectable()).assertCountEquals(10).apply {
+            get(0).assertIsSelected()
+            (1..9).forEach { get(it).assertIsNotSelected() }
+        }
 
         // Click the second tab
         rule.onAllNodes(isSelectable())[1].performClick()
 
         // Now only the second tab should be selected
-        rule.onAllNodes(isSelectable())
-            .assertCountEquals(10)
-            .apply {
-                get(0).assertIsNotSelected()
-                get(1).assertIsSelected()
-                (2..9).forEach {
-                    get(it).assertIsNotSelected()
-                }
-            }
+        rule.onAllNodes(isSelectable()).assertCountEquals(10).apply {
+            get(0).assertIsNotSelected()
+            get(1).assertIsSelected()
+            (2..9).forEach { get(it).assertIsNotSelected() }
+        }
     }
 
     @Test
@@ -738,18 +679,15 @@
             var state by remember { mutableStateOf(0) }
             val titles = listOf("TAB 1", "TAB 2", "TAB 3 WITH LOTS OF TEXT")
 
-            val indicator = @Composable { tabPositions: List<TabPosition> ->
-                TabRowDefaults.Indicator(
-                    Modifier.tabIndicatorOffset(tabPositions[state])
-                        .testTag("indicator")
-                )
-            }
+            val indicator =
+                @Composable { tabPositions: List<TabPosition> ->
+                    TabRowDefaults.Indicator(
+                        Modifier.tabIndicatorOffset(tabPositions[state]).testTag("indicator")
+                    )
+                }
 
             Box {
-                ScrollableTabRow(
-                    selectedTabIndex = state,
-                    indicator = indicator
-                ) {
+                ScrollableTabRow(selectedTabIndex = state, indicator = indicator) {
                     titles.forEachIndexed { index, title ->
                         Tab(
                             text = { Text(title) },
@@ -806,12 +744,9 @@
             }
         }
 
-        rule.onNodeWithTag("tab")
-            .performClick()
+        rule.onNodeWithTag("tab").performClick()
 
-        rule.runOnIdle {
-            assertThat(clicks).isEqualTo(0)
-        }
+        rule.runOnIdle { assertThat(clicks).isEqualTo(0) }
     }
 
     @Test
@@ -830,11 +765,8 @@
             }
         }
 
-        rule.onNodeWithTag("tab")
-            .performClick()
+        rule.onNodeWithTag("tab").performClick()
 
-        rule.runOnIdle {
-            assertThat(clicks).isEqualTo(0)
-        }
+        rule.runOnIdle { assertThat(clicks).isEqualTo(0) }
     }
 }
diff --git a/compose/material/material/src/androidInstrumentedTest/kotlin/androidx/compose/material/TextTest.kt b/compose/material/material/src/androidInstrumentedTest/kotlin/androidx/compose/material/TextTest.kt
index e32bd12..68e6215 100644
--- a/compose/material/material/src/androidInstrumentedTest/kotlin/androidx/compose/material/TextTest.kt
+++ b/compose/material/material/src/androidInstrumentedTest/kotlin/androidx/compose/material/TextTest.kt
@@ -48,16 +48,16 @@
 @RunWith(AndroidJUnit4::class)
 class TextTest {
 
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
-    private val ExpectedTextStyle = TextStyle(
-        color = Color.Blue,
-        textAlign = TextAlign.End,
-        fontSize = 32.sp,
-        fontStyle = FontStyle.Italic,
-        letterSpacing = 0.3.em
-    )
+    private val ExpectedTextStyle =
+        TextStyle(
+            color = Color.Blue,
+            textAlign = TextAlign.End,
+            fontSize = 32.sp,
+            fontStyle = FontStyle.Italic,
+            letterSpacing = 0.3.em
+        )
 
     private val TestText = "TestText"
 
@@ -72,12 +72,10 @@
             }
         }
 
-        assertThat(
-            localTextStyle?.platformStyle?.paragraphStyle?.includeFontPadding
-        ).isEqualTo(false)
-        assertThat(
-            display1TextStyle?.platformStyle?.paragraphStyle?.includeFontPadding
-        ).isEqualTo(false)
+        assertThat(localTextStyle?.platformStyle?.paragraphStyle?.includeFontPadding)
+            .isEqualTo(false)
+        assertThat(display1TextStyle?.platformStyle?.paragraphStyle?.includeFontPadding)
+            .isEqualTo(false)
     }
 
     @Test
@@ -120,13 +118,14 @@
         var fontSize: TextUnit? = null
         var fontStyle: FontStyle? = null
         var letterSpacing: TextUnit? = null
-        val testStyle = TextStyle(
-            color = Color.Green,
-            textAlign = TextAlign.Center,
-            fontSize = 16.sp,
-            fontStyle = FontStyle.Normal,
-            letterSpacing = 0.6.em
-        )
+        val testStyle =
+            TextStyle(
+                color = Color.Green,
+                textAlign = TextAlign.Center,
+                fontSize = 16.sp,
+                fontStyle = FontStyle.Normal,
+                letterSpacing = 0.6.em
+            )
         rule.setContent {
             ProvideTextStyle(ExpectedTextStyle) {
                 Box(Modifier.background(Color.White)) {
@@ -245,38 +244,37 @@
         rule.setContent {
             ProvideTextStyle(ExpectedTextStyle) {
                 Box(Modifier.background(Color.White)) {
-                    Text(
-                        TestText,
-                        modifier = Modifier.testTag("text")
-                    )
+                    Text(TestText, modifier = Modifier.testTag("text"))
                 }
             }
         }
 
         val textLayoutResults = mutableListOf<TextLayoutResult>()
-        rule.onNodeWithTag("text")
-            .assertTextEquals(TestText)
-            .performSemanticsAction(SemanticsActions.GetTextLayoutResult) { it(textLayoutResults) }
+        rule.onNodeWithTag("text").assertTextEquals(TestText).performSemanticsAction(
+            SemanticsActions.GetTextLayoutResult
+        ) {
+            it(textLayoutResults)
+        }
         assert(textLayoutResults.size == 1) { "TextLayoutResult is null" }
     }
 
     @Test
     fun semantics_hasColor_providedByParameter() {
         val expectedColor = Color(0.7f, 0.13f, 1.0f, 0.323f)
-        rule.setContent {
-            Text(
-                "Test",
-                color = expectedColor
-            )
-        }
+        rule.setContent { Text("Test", color = expectedColor) }
 
-        rule.onNodeWithText("Test").assert(SemanticsMatcher("") {
-            val textLayoutResult = ArrayList<TextLayoutResult>()
-            it.config.getOrNull(SemanticsActions.GetTextLayoutResult)?.action?.invoke(
-                textLayoutResult
+        rule
+            .onNodeWithText("Test")
+            .assert(
+                SemanticsMatcher("") {
+                    val textLayoutResult = ArrayList<TextLayoutResult>()
+                    it.config
+                        .getOrNull(SemanticsActions.GetTextLayoutResult)
+                        ?.action
+                        ?.invoke(textLayoutResult)
+                    val color = textLayoutResult.first().layoutInput.style.color
+                    color == expectedColor
+                }
             )
-            val color = textLayoutResult.first().layoutInput.style.color
-            color == expectedColor
-        })
     }
 }
diff --git a/compose/material/material/src/androidInstrumentedTest/kotlin/androidx/compose/material/anchoredDraggable/AnchoredDraggableGestureTest.kt b/compose/material/material/src/androidInstrumentedTest/kotlin/androidx/compose/material/anchoredDraggable/AnchoredDraggableGestureTest.kt
index ced2446..bd159fc 100644
--- a/compose/material/material/src/androidInstrumentedTest/kotlin/androidx/compose/material/anchoredDraggable/AnchoredDraggableGestureTest.kt
+++ b/compose/material/material/src/androidInstrumentedTest/kotlin/androidx/compose/material/anchoredDraggable/AnchoredDraggableGestureTest.kt
@@ -69,20 +69,20 @@
 @OptIn(ExperimentalMaterialApi::class)
 class AnchoredDraggableGestureTest {
 
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
     private val AnchoredDraggableTestTag = "dragbox"
     private val AnchoredDraggableBoxSize = 200.dp
 
     @Test
     fun anchoredDraggable_swipe_horizontal() {
-        val state = AnchoredDraggableState(
-            initialValue = A,
-            positionalThreshold = DefaultPositionalThreshold,
-            velocityThreshold = DefaultVelocityThreshold,
-            animationSpec = tween()
-        )
+        val state =
+            AnchoredDraggableState(
+                initialValue = A,
+                positionalThreshold = DefaultPositionalThreshold,
+                velocityThreshold = DefaultVelocityThreshold,
+                animationSpec = tween()
+            )
         val anchors = DraggableAnchors {
             A at 0f
             B at 250f
@@ -95,20 +95,13 @@
                 WithTouchSlop(0f) {
                     Box(Modifier.fillMaxSize()) {
                         Box(
-                            Modifier
-                                .requiredSize(AnchoredDraggableBoxSize)
+                            Modifier.requiredSize(AnchoredDraggableBoxSize)
                                 .testTag(AnchoredDraggableTestTag)
                                 .anchoredDraggable(
                                     state = state,
                                     orientation = Orientation.Horizontal
                                 )
-                                .offset {
-                                    IntOffset(
-                                        state
-                                            .requireOffset()
-                                            .roundToInt(), 0
-                                    )
-                                }
+                                .offset { IntOffset(state.requireOffset().roundToInt(), 0) }
                                 .background(Color.Red)
                         )
                     }
@@ -118,28 +111,32 @@
 
         assertThat(state.currentValue).isEqualTo(A)
 
-        rule.onNodeWithTag(AnchoredDraggableTestTag)
-            .performTouchInput { swipeRight(endX = right / 2) }
+        rule.onNodeWithTag(AnchoredDraggableTestTag).performTouchInput {
+            swipeRight(endX = right / 2)
+        }
         rule.waitForIdle()
 
         assertThat(state.currentValue).isEqualTo(B)
         assertThat(state.offset).isEqualTo(anchors.positionOf(B))
 
-        rule.onNodeWithTag(AnchoredDraggableTestTag)
-            .performTouchInput { swipeRight(startX = right / 2, endX = right) }
+        rule.onNodeWithTag(AnchoredDraggableTestTag).performTouchInput {
+            swipeRight(startX = right / 2, endX = right)
+        }
         rule.waitForIdle()
         assertThat(state.currentValue).isEqualTo(C)
         assertThat(state.offset).isEqualTo(anchors.positionOf(C))
 
-        rule.onNodeWithTag(AnchoredDraggableTestTag)
-            .performTouchInput { swipeLeft(endX = right / 2) }
+        rule.onNodeWithTag(AnchoredDraggableTestTag).performTouchInput {
+            swipeLeft(endX = right / 2)
+        }
         rule.waitForIdle()
 
         assertThat(state.currentValue).isEqualTo(B)
         assertThat(state.offset).isEqualTo(anchors.positionOf(B))
 
-        rule.onNodeWithTag(AnchoredDraggableTestTag)
-            .performTouchInput { swipeLeft(startX = right / 2) }
+        rule.onNodeWithTag(AnchoredDraggableTestTag).performTouchInput {
+            swipeLeft(startX = right / 2)
+        }
         rule.waitForIdle()
 
         assertThat(state.currentValue).isEqualTo(A)
@@ -148,12 +145,13 @@
 
     @Test
     fun anchoredDraggable_swipe_vertical() {
-        val state = AnchoredDraggableState(
-            initialValue = A,
-            positionalThreshold = DefaultPositionalThreshold,
-            velocityThreshold = DefaultVelocityThreshold,
-            animationSpec = tween()
-        )
+        val state =
+            AnchoredDraggableState(
+                initialValue = A,
+                positionalThreshold = DefaultPositionalThreshold,
+                velocityThreshold = DefaultVelocityThreshold,
+                animationSpec = tween()
+            )
         val anchors = DraggableAnchors {
             A at 0f
             B at 250f
@@ -166,20 +164,13 @@
                 WithTouchSlop(0f) {
                     Box(Modifier.fillMaxSize()) {
                         Box(
-                            Modifier
-                                .requiredSize(AnchoredDraggableBoxSize)
+                            Modifier.requiredSize(AnchoredDraggableBoxSize)
                                 .testTag(AnchoredDraggableTestTag)
                                 .anchoredDraggable(
                                     state = state,
                                     orientation = Orientation.Vertical
                                 )
-                                .offset {
-                                    IntOffset(
-                                        state
-                                            .requireOffset()
-                                            .roundToInt(), 0
-                                    )
-                                }
+                                .offset { IntOffset(state.requireOffset().roundToInt(), 0) }
                                 .background(Color.Red)
                         )
                     }
@@ -189,28 +180,32 @@
 
         assertThat(state.currentValue).isEqualTo(A)
 
-        rule.onNodeWithTag(AnchoredDraggableTestTag)
-            .performTouchInput { swipeDown(startY = top, endY = bottom / 2) }
+        rule.onNodeWithTag(AnchoredDraggableTestTag).performTouchInput {
+            swipeDown(startY = top, endY = bottom / 2)
+        }
         rule.waitForIdle()
 
         assertThat(state.currentValue).isEqualTo(B)
         assertThat(state.offset).isEqualTo(anchors.positionOf(B))
 
-        rule.onNodeWithTag(AnchoredDraggableTestTag)
-            .performTouchInput { swipeDown(startY = bottom / 2, endY = bottom) }
+        rule.onNodeWithTag(AnchoredDraggableTestTag).performTouchInput {
+            swipeDown(startY = bottom / 2, endY = bottom)
+        }
         rule.waitForIdle()
         assertThat(state.currentValue).isEqualTo(C)
         assertThat(state.offset).isEqualTo(anchors.positionOf(C))
 
-        rule.onNodeWithTag(AnchoredDraggableTestTag)
-            .performTouchInput { swipeUp(startY = bottom, endY = bottom / 2) }
+        rule.onNodeWithTag(AnchoredDraggableTestTag).performTouchInput {
+            swipeUp(startY = bottom, endY = bottom / 2)
+        }
         rule.waitForIdle()
 
         assertThat(state.currentValue).isEqualTo(B)
         assertThat(state.offset).isEqualTo(anchors.positionOf(B))
 
-        rule.onNodeWithTag(AnchoredDraggableTestTag)
-            .performTouchInput { swipeUp(startY = bottom / 2, endY = top) }
+        rule.onNodeWithTag(AnchoredDraggableTestTag).performTouchInput {
+            swipeUp(startY = bottom / 2, endY = top)
+        }
         rule.waitForIdle()
 
         assertThat(state.currentValue).isEqualTo(A)
@@ -219,12 +214,13 @@
 
     @Test
     fun anchoredDraggable_swipe_disabled_horizontal() {
-        val state = AnchoredDraggableState(
-            initialValue = A,
-            positionalThreshold = DefaultPositionalThreshold,
-            velocityThreshold = DefaultVelocityThreshold,
-            animationSpec = tween()
-        )
+        val state =
+            AnchoredDraggableState(
+                initialValue = A,
+                positionalThreshold = DefaultPositionalThreshold,
+                velocityThreshold = DefaultVelocityThreshold,
+                animationSpec = tween()
+            )
         val anchors = DraggableAnchors {
             A at 0f
             B at 250f
@@ -237,21 +233,14 @@
                 WithTouchSlop(0f) {
                     Box(Modifier.fillMaxSize()) {
                         Box(
-                            Modifier
-                                .requiredSize(AnchoredDraggableBoxSize)
+                            Modifier.requiredSize(AnchoredDraggableBoxSize)
                                 .testTag(AnchoredDraggableTestTag)
                                 .anchoredDraggable(
                                     state = state,
                                     orientation = Orientation.Horizontal,
                                     enabled = false
                                 )
-                                .offset {
-                                    IntOffset(
-                                        state
-                                            .requireOffset()
-                                            .roundToInt(), 0
-                                    )
-                                }
+                                .offset { IntOffset(state.requireOffset().roundToInt(), 0) }
                                 .background(Color.Red)
                         )
                     }
@@ -261,8 +250,9 @@
 
         assertThat(state.currentValue).isEqualTo(A)
 
-        rule.onNodeWithTag(AnchoredDraggableTestTag)
-            .performTouchInput { swipeRight(startX = left, endX = right) }
+        rule.onNodeWithTag(AnchoredDraggableTestTag).performTouchInput {
+            swipeRight(startX = left, endX = right)
+        }
         rule.waitForIdle()
 
         assertThat(state.currentValue).isEqualTo(A)
@@ -271,12 +261,13 @@
 
     @Test
     fun anchoredDraggable_swipe_disabled_vertical() {
-        val state = AnchoredDraggableState(
-            initialValue = A,
-            positionalThreshold = DefaultPositionalThreshold,
-            velocityThreshold = DefaultVelocityThreshold,
-            animationSpec = tween()
-        )
+        val state =
+            AnchoredDraggableState(
+                initialValue = A,
+                positionalThreshold = DefaultPositionalThreshold,
+                velocityThreshold = DefaultVelocityThreshold,
+                animationSpec = tween()
+            )
         val anchors = DraggableAnchors {
             A at 0f
             B at 250f
@@ -289,21 +280,14 @@
                 WithTouchSlop(0f) {
                     Box(Modifier.fillMaxSize()) {
                         Box(
-                            Modifier
-                                .requiredSize(AnchoredDraggableBoxSize)
+                            Modifier.requiredSize(AnchoredDraggableBoxSize)
                                 .testTag(AnchoredDraggableTestTag)
                                 .anchoredDraggable(
                                     state = state,
                                     orientation = Orientation.Vertical,
                                     enabled = false
                                 )
-                                .offset {
-                                    IntOffset(
-                                        state
-                                            .requireOffset()
-                                            .roundToInt(), 0
-                                    )
-                                }
+                                .offset { IntOffset(state.requireOffset().roundToInt(), 0) }
                                 .background(Color.Red)
                         )
                     }
@@ -313,8 +297,9 @@
 
         assertThat(state.currentValue).isEqualTo(A)
 
-        rule.onNodeWithTag(AnchoredDraggableTestTag)
-            .performTouchInput { swipeDown(startY = top, endY = bottom) }
+        rule.onNodeWithTag(AnchoredDraggableTestTag).performTouchInput {
+            swipeDown(startY = top, endY = bottom)
+        }
         rule.waitForIdle()
 
         assertThat(state.currentValue).isEqualTo(A)
@@ -325,22 +310,19 @@
     fun anchoredDraggable_positionalThresholds_fractional_targetState() {
         val positionalThreshold = 0.5f
         val absThreshold = abs(positionalThreshold)
-        val state = AnchoredDraggableState(
-            initialValue = A,
-            positionalThreshold = { totalDistance -> totalDistance * positionalThreshold },
-            velocityThreshold = DefaultVelocityThreshold,
-            animationSpec = tween()
-        )
+        val state =
+            AnchoredDraggableState(
+                initialValue = A,
+                positionalThreshold = { totalDistance -> totalDistance * positionalThreshold },
+                velocityThreshold = DefaultVelocityThreshold,
+                animationSpec = tween()
+            )
         rule.setContent {
             Box(Modifier.fillMaxSize()) {
                 Box(
-                    Modifier
-                        .requiredSize(AnchoredDraggableBoxSize)
+                    Modifier.requiredSize(AnchoredDraggableBoxSize)
                         .testTag(AnchoredDraggableTestTag)
-                        .anchoredDraggable(
-                            state = state,
-                            orientation = Orientation.Horizontal
-                        )
+                        .anchoredDraggable(state = state, orientation = Orientation.Horizontal)
                         .onSizeChanged { layoutSize ->
                             val anchors = DraggableAnchors {
                                 A at 0f
@@ -349,13 +331,7 @@
                             }
                             state.updateAnchors(anchors)
                         }
-                        .offset {
-                            IntOffset(
-                                state
-                                    .requireOffset()
-                                    .roundToInt(), 0
-                            )
-                        }
+                        .offset { IntOffset(state.requireOffset().roundToInt(), 0) }
                         .background(Color.Red)
                 )
             }
@@ -405,22 +381,19 @@
     fun anchoredDraggable_positionalThresholds_fractional_negativeThreshold_targetState() {
         val positionalThreshold = -0.5f
         val absThreshold = abs(positionalThreshold)
-        val state = AnchoredDraggableState(
-            initialValue = A,
-            positionalThreshold = { totalDistance -> totalDistance * positionalThreshold },
-            velocityThreshold = DefaultVelocityThreshold,
-            animationSpec = tween()
-        )
+        val state =
+            AnchoredDraggableState(
+                initialValue = A,
+                positionalThreshold = { totalDistance -> totalDistance * positionalThreshold },
+                velocityThreshold = DefaultVelocityThreshold,
+                animationSpec = tween()
+            )
         rule.setContent {
             Box(Modifier.fillMaxSize()) {
                 Box(
-                    Modifier
-                        .requiredSize(AnchoredDraggableBoxSize)
+                    Modifier.requiredSize(AnchoredDraggableBoxSize)
                         .testTag(AnchoredDraggableTestTag)
-                        .anchoredDraggable(
-                            state = state,
-                            orientation = Orientation.Horizontal
-                        )
+                        .anchoredDraggable(state = state, orientation = Orientation.Horizontal)
                         .onSizeChanged { layoutSize ->
                             val anchors = DraggableAnchors {
                                 A at 0f
@@ -429,13 +402,7 @@
                             }
                             state.updateAnchors(anchors)
                         }
-                        .offset {
-                            IntOffset(
-                                state
-                                    .requireOffset()
-                                    .roundToInt(), 0
-                            )
-                        }
+                        .offset { IntOffset(state.requireOffset().roundToInt(), 0) }
                         .background(Color.Red)
                 )
             }
@@ -486,22 +453,19 @@
         val positionalThreshold = 56.dp
         val positionalThresholdPx = with(rule.density) { positionalThreshold.toPx() }
         val absThreshold = abs(positionalThresholdPx)
-        val state = AnchoredDraggableState(
-            initialValue = A,
-            positionalThreshold = { positionalThresholdPx },
-            velocityThreshold = DefaultVelocityThreshold,
-            animationSpec = tween()
-        )
+        val state =
+            AnchoredDraggableState(
+                initialValue = A,
+                positionalThreshold = { positionalThresholdPx },
+                velocityThreshold = DefaultVelocityThreshold,
+                animationSpec = tween()
+            )
         rule.setContent {
             Box(Modifier.fillMaxSize()) {
                 Box(
-                    Modifier
-                        .requiredSize(AnchoredDraggableBoxSize)
+                    Modifier.requiredSize(AnchoredDraggableBoxSize)
                         .testTag(AnchoredDraggableTestTag)
-                        .anchoredDraggable(
-                            state = state,
-                            orientation = Orientation.Horizontal
-                        )
+                        .anchoredDraggable(state = state, orientation = Orientation.Horizontal)
                         .onSizeChanged { layoutSize ->
                             val anchors = DraggableAnchors {
                                 A at 0f
@@ -510,13 +474,7 @@
                             }
                             state.updateAnchors(anchors)
                         }
-                        .offset {
-                            IntOffset(
-                                state
-                                    .requireOffset()
-                                    .roundToInt(), 0
-                            )
-                        }
+                        .offset { IntOffset(state.requireOffset().roundToInt(), 0) }
                         .background(Color.Red)
                 )
             }
@@ -570,22 +528,19 @@
         val positionalThreshold = (-56).dp
         val positionalThresholdPx = with(rule.density) { positionalThreshold.toPx() }
         val absThreshold = abs(positionalThresholdPx)
-        val state = AnchoredDraggableState(
-            initialValue = A,
-            positionalThreshold = { positionalThresholdPx },
-            velocityThreshold = DefaultVelocityThreshold,
-            animationSpec = tween()
-        )
+        val state =
+            AnchoredDraggableState(
+                initialValue = A,
+                positionalThreshold = { positionalThresholdPx },
+                velocityThreshold = DefaultVelocityThreshold,
+                animationSpec = tween()
+            )
         rule.setContent {
             Box(Modifier.fillMaxSize()) {
                 Box(
-                    Modifier
-                        .requiredSize(AnchoredDraggableBoxSize)
+                    Modifier.requiredSize(AnchoredDraggableBoxSize)
                         .testTag(AnchoredDraggableTestTag)
-                        .anchoredDraggable(
-                            state = state,
-                            orientation = Orientation.Horizontal
-                        )
+                        .anchoredDraggable(state = state, orientation = Orientation.Horizontal)
                         .onSizeChanged { layoutSize ->
                             val anchors = DraggableAnchors {
                                 A at 0f
@@ -594,13 +549,7 @@
                             }
                             state.updateAnchors(anchors)
                         }
-                        .offset {
-                            IntOffset(
-                                state
-                                    .requireOffset()
-                                    .roundToInt(), 0
-                            )
-                        }
+                        .offset { IntOffset(state.requireOffset().roundToInt(), 0) }
                         .background(Color.Red)
                 )
             }
@@ -654,12 +603,13 @@
         runBlocking(AutoTestFrameClock()) {
             val velocity = 100.dp
             val velocityPx = with(rule.density) { velocity.toPx() }
-            val state = AnchoredDraggableState(
-                initialValue = A,
-                positionalThreshold = DefaultPositionalThreshold,
-                velocityThreshold = { velocityPx / 2f },
-                animationSpec = tween()
-            )
+            val state =
+                AnchoredDraggableState(
+                    initialValue = A,
+                    positionalThreshold = DefaultPositionalThreshold,
+                    velocityThreshold = { velocityPx / 2f },
+                    animationSpec = tween()
+                )
             state.updateAnchors(
                 DraggableAnchors {
                     A at 0f
@@ -678,12 +628,13 @@
         runBlocking(AutoTestFrameClock()) {
             val velocity = 100.dp
             val velocityPx = with(rule.density) { velocity.toPx() }
-            val state = AnchoredDraggableState(
-                initialValue = A,
-                velocityThreshold = { velocityPx },
-                positionalThreshold = { Float.POSITIVE_INFINITY },
-                animationSpec = tween()
-            )
+            val state =
+                AnchoredDraggableState(
+                    initialValue = A,
+                    velocityThreshold = { velocityPx },
+                    positionalThreshold = { Float.POSITIVE_INFINITY },
+                    animationSpec = tween()
+                )
             state.updateAnchors(
                 DraggableAnchors {
                     A at 0f
@@ -699,22 +650,19 @@
     @Test
     fun anchoredDraggable_velocityThreshold_swipe_velocityHigherThanThreshold_advances() {
         val velocityThreshold = 100.dp
-        val state = AnchoredDraggableState(
-            initialValue = A,
-            positionalThreshold = DefaultPositionalThreshold,
-            velocityThreshold = { with(rule.density) { velocityThreshold.toPx() } },
-            animationSpec = tween()
-        )
+        val state =
+            AnchoredDraggableState(
+                initialValue = A,
+                positionalThreshold = DefaultPositionalThreshold,
+                velocityThreshold = { with(rule.density) { velocityThreshold.toPx() } },
+                animationSpec = tween()
+            )
         rule.setContent {
             Box(Modifier.fillMaxSize()) {
                 Box(
-                    Modifier
-                        .requiredSize(AnchoredDraggableBoxSize)
+                    Modifier.requiredSize(AnchoredDraggableBoxSize)
                         .testTag(AnchoredDraggableTestTag)
-                        .anchoredDraggable(
-                            state = state,
-                            orientation = Orientation.Horizontal
-                        )
+                        .anchoredDraggable(state = state, orientation = Orientation.Horizontal)
                         .onSizeChanged { layoutSize ->
                             val anchors = DraggableAnchors {
                                 A at 0f
@@ -723,26 +671,19 @@
                             }
                             state.updateAnchors(anchors)
                         }
-                        .offset {
-                            IntOffset(
-                                state
-                                    .requireOffset()
-                                    .roundToInt(), 0
-                            )
-                        }
+                        .offset { IntOffset(state.requireOffset().roundToInt(), 0) }
                         .background(Color.Red)
                 )
             }
         }
 
-        rule.onNodeWithTag(AnchoredDraggableTestTag)
-            .performTouchInput {
-                swipeWithVelocity(
-                    start = Offset(left, 0f),
-                    end = Offset(right / 2, 0f),
-                    endVelocity = with(rule.density) { velocityThreshold.toPx() } * 1.1f
-                )
-            }
+        rule.onNodeWithTag(AnchoredDraggableTestTag).performTouchInput {
+            swipeWithVelocity(
+                start = Offset(left, 0f),
+                end = Offset(right / 2, 0f),
+                endVelocity = with(rule.density) { velocityThreshold.toPx() } * 1.1f
+            )
+        }
 
         rule.waitForIdle()
         assertThat(state.currentValue).isEqualTo(B)
@@ -751,22 +692,19 @@
     @Test
     fun anchoredDraggable_velocityThreshold_swipe_velocityLowerThanThreshold_doesntAdvance() {
         val velocityThreshold = 100.dp
-        val state = AnchoredDraggableState(
-            initialValue = A,
-            velocityThreshold = { with(rule.density) { velocityThreshold.toPx() } },
-            positionalThreshold = { Float.POSITIVE_INFINITY },
-            animationSpec = tween()
-        )
+        val state =
+            AnchoredDraggableState(
+                initialValue = A,
+                velocityThreshold = { with(rule.density) { velocityThreshold.toPx() } },
+                positionalThreshold = { Float.POSITIVE_INFINITY },
+                animationSpec = tween()
+            )
         rule.setContent {
             Box(Modifier.fillMaxSize()) {
                 Box(
-                    Modifier
-                        .requiredSize(AnchoredDraggableBoxSize)
+                    Modifier.requiredSize(AnchoredDraggableBoxSize)
                         .testTag(AnchoredDraggableTestTag)
-                        .anchoredDraggable(
-                            state = state,
-                            orientation = Orientation.Horizontal
-                        )
+                        .anchoredDraggable(state = state, orientation = Orientation.Horizontal)
                         .onSizeChanged { layoutSize ->
                             val anchors = DraggableAnchors {
                                 A at 0f
@@ -775,26 +713,19 @@
                             }
                             state.updateAnchors(anchors)
                         }
-                        .offset {
-                            IntOffset(
-                                state
-                                    .requireOffset()
-                                    .roundToInt(), 0
-                            )
-                        }
+                        .offset { IntOffset(state.requireOffset().roundToInt(), 0) }
                         .background(Color.Red)
                 )
             }
         }
 
-        rule.onNodeWithTag(AnchoredDraggableTestTag)
-            .performTouchInput {
-                swipeWithVelocity(
-                    start = Offset(left, 0f),
-                    end = Offset(right / 2, 0f),
-                    endVelocity = with(rule.density) { velocityThreshold.toPx() } * 0.9f
-                )
-            }
+        rule.onNodeWithTag(AnchoredDraggableTestTag).performTouchInput {
+            swipeWithVelocity(
+                start = Offset(left, 0f),
+                end = Offset(right / 2, 0f),
+                endVelocity = with(rule.density) { velocityThreshold.toPx() } * 0.9f
+            )
+        }
 
         rule.waitForIdle()
         assertThat(state.currentValue).isEqualTo(A)
@@ -806,30 +737,21 @@
             A at 0f
             C at 500f
         }
-        val state = AnchoredDraggableState(
-            initialValue = A,
-            positionalThreshold = DefaultPositionalThreshold,
-            velocityThreshold = { 0f },
-            animationSpec = tween()
-        )
+        val state =
+            AnchoredDraggableState(
+                initialValue = A,
+                positionalThreshold = DefaultPositionalThreshold,
+                velocityThreshold = { 0f },
+                animationSpec = tween()
+            )
         state.updateAnchors(anchors)
         rule.setContent {
             Box(Modifier.fillMaxSize()) {
                 Box(
-                    Modifier
-                        .requiredSize(AnchoredDraggableBoxSize)
+                    Modifier.requiredSize(AnchoredDraggableBoxSize)
                         .testTag(AnchoredDraggableTestTag)
-                        .anchoredDraggable(
-                            state = state,
-                            orientation = Orientation.Horizontal
-                        )
-                        .offset {
-                            IntOffset(
-                                state
-                                    .requireOffset()
-                                    .roundToInt(), 0
-                            )
-                        }
+                        .anchoredDraggable(state = state, orientation = Orientation.Horizontal)
+                        .offset { IntOffset(state.requireOffset().roundToInt(), 0) }
                         .background(Color.Red)
                 )
             }
@@ -838,12 +760,11 @@
         val overdrag = 100f
         val maxBound = state.anchors.positionOf(C)
 
-        rule.onNodeWithTag(AnchoredDraggableTestTag)
-            .performTouchInput {
-                down(Offset(0f, 0f))
-                moveBy(Offset(x = maxBound + overdrag, y = 0f))
-                moveBy(Offset(x = -overdrag, y = 0f))
-            }
+        rule.onNodeWithTag(AnchoredDraggableTestTag).performTouchInput {
+            down(Offset(0f, 0f))
+            moveBy(Offset(x = maxBound + overdrag, y = 0f))
+            moveBy(Offset(x = -overdrag, y = 0f))
+        }
 
         rule.waitForIdle()
 
@@ -862,12 +783,13 @@
             B at 250f
             C at 500f
         }
-        val state = AnchoredDraggableState(
-            initialValue = A,
-            positionalThreshold = { totalDistance -> totalDistance * 0.5f },
-            velocityThreshold = DefaultVelocityThreshold,
-            animationSpec = tween()
-        )
+        val state =
+            AnchoredDraggableState(
+                initialValue = A,
+                positionalThreshold = { totalDistance -> totalDistance * 0.5f },
+                velocityThreshold = DefaultVelocityThreshold,
+                animationSpec = tween()
+            )
         state.updateAnchors(anchors)
         lateinit var scope: CoroutineScope
         rule.setContent {
@@ -875,20 +797,10 @@
                 scope = rememberCoroutineScope()
                 Box(Modifier.fillMaxSize()) {
                     Box(
-                        Modifier
-                            .requiredSize(AnchoredDraggableBoxSize)
+                        Modifier.requiredSize(AnchoredDraggableBoxSize)
                             .testTag(AnchoredDraggableTestTag)
-                            .anchoredDraggable(
-                                state = state,
-                                orientation = Orientation.Horizontal
-                            )
-                            .offset {
-                                IntOffset(
-                                    state
-                                        .requireOffset()
-                                        .roundToInt(), 0
-                                )
-                            }
+                            .anchoredDraggable(state = state, orientation = Orientation.Horizontal)
+                            .offset { IntOffset(state.requireOffset().roundToInt(), 0) }
                             .background(Color.Red)
                     )
                 }
@@ -905,10 +817,7 @@
         } // Advance until our closest anchor is B
         assertThat(state.targetValue).isEqualTo(C)
 
-        rule.onNodeWithTag(AnchoredDraggableTestTag)
-            .performTouchInput {
-                down(Offset.Zero)
-            }
+        rule.onNodeWithTag(AnchoredDraggableTestTag).performTouchInput { down(Offset.Zero) }
 
         assertThat(state.targetValue).isEqualTo(B) // B is the closest now so we should target it
     }
@@ -921,34 +830,28 @@
             B at 250f
             C at 500f
         }
-        val state = AnchoredDraggableState(
-            initialValue = A,
-            positionalThreshold = { totalDistance -> totalDistance * 0.5f },
-            velocityThreshold = DefaultVelocityThreshold,
-            animationSpec = tween(),
-            anchors = anchors
-        )
+        val state =
+            AnchoredDraggableState(
+                initialValue = A,
+                positionalThreshold = { totalDistance -> totalDistance * 0.5f },
+                velocityThreshold = DefaultVelocityThreshold,
+                animationSpec = tween(),
+                anchors = anchors
+            )
         lateinit var scope: CoroutineScope
         rule.setContent {
             WithTouchSlop(touchSlop = 0f) {
                 scope = rememberCoroutineScope()
                 Box(Modifier.fillMaxSize()) {
                     Box(
-                        Modifier
-                            .requiredSize(AnchoredDraggableBoxSize)
+                        Modifier.requiredSize(AnchoredDraggableBoxSize)
                             .testTag(AnchoredDraggableTestTag)
                             .anchoredDraggable(
                                 state = state,
                                 orientation = Orientation.Horizontal,
                                 startDragImmediately = false,
                             )
-                            .offset {
-                                IntOffset(
-                                    state
-                                        .requireOffset()
-                                        .roundToInt(), 0
-                                )
-                            }
+                            .offset { IntOffset(state.requireOffset().roundToInt(), 0) }
                             .background(Color.Red)
                     )
                 }
@@ -964,10 +867,7 @@
         } // Advance until our closest anchor is B
         assertThat(state.targetValue).isEqualTo(C)
 
-        rule.onNodeWithTag(AnchoredDraggableTestTag)
-            .performTouchInput {
-                down(Offset.Zero)
-            }
+        rule.onNodeWithTag(AnchoredDraggableTestTag).performTouchInput { down(Offset.Zero) }
         rule.waitForIdle()
 
         assertThat(state.targetValue).isEqualTo(C) // Animation will continue to C
@@ -980,7 +880,8 @@
     private val DefaultVelocityThreshold: () -> Float = { with(rule.density) { 125.dp.toPx() } }
 }
 
-private val NoOpDensity = object : Density {
-    override val density = 1f
-    override val fontScale = 1f
-}
+private val NoOpDensity =
+    object : Density {
+        override val density = 1f
+        override val fontScale = 1f
+    }
diff --git a/compose/material/material/src/androidInstrumentedTest/kotlin/androidx/compose/material/anchoredDraggable/AnchoredDraggableStateTest.kt b/compose/material/material/src/androidInstrumentedTest/kotlin/androidx/compose/material/anchoredDraggable/AnchoredDraggableStateTest.kt
index 87ac6cd..c03fba5 100644
--- a/compose/material/material/src/androidInstrumentedTest/kotlin/androidx/compose/material/anchoredDraggable/AnchoredDraggableStateTest.kt
+++ b/compose/material/material/src/androidInstrumentedTest/kotlin/androidx/compose/material/anchoredDraggable/AnchoredDraggableStateTest.kt
@@ -88,30 +88,26 @@
 @OptIn(ExperimentalMaterialApi::class)
 class AnchoredDraggableStateTest {
 
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
     private val AnchoredDraggableTestTag = "dragbox"
     private val AnchoredDraggableBoxSize = 200.dp
 
     @Test
     fun anchoredDraggable_state_canSkipStateByFling() {
-        val state = AnchoredDraggableState(
-            initialValue = A,
-            positionalThreshold = defaultPositionalThreshold,
-            velocityThreshold = defaultVelocityThreshold,
-            animationSpec = defaultAnimationSpec
-        )
+        val state =
+            AnchoredDraggableState(
+                initialValue = A,
+                positionalThreshold = defaultPositionalThreshold,
+                velocityThreshold = defaultVelocityThreshold,
+                animationSpec = defaultAnimationSpec
+            )
         rule.setContent {
             Box(Modifier.fillMaxSize()) {
                 Box(
-                    Modifier
-                        .requiredSize(AnchoredDraggableBoxSize)
+                    Modifier.requiredSize(AnchoredDraggableBoxSize)
                         .testTag(AnchoredDraggableTestTag)
-                        .anchoredDraggable(
-                            state = state,
-                            orientation = Orientation.Vertical
-                        )
+                        .anchoredDraggable(state = state, orientation = Orientation.Vertical)
                         .onSizeChanged { layoutSize ->
                             state.updateAnchors(
                                 DraggableAnchors {
@@ -121,20 +117,13 @@
                                 }
                             )
                         }
-                        .offset {
-                            IntOffset(
-                                state
-                                    .requireOffset()
-                                    .roundToInt(), 0
-                            )
-                        }
+                        .offset { IntOffset(state.requireOffset().roundToInt(), 0) }
                         .background(Color.Red)
                 )
             }
         }
 
-        rule.onNodeWithTag(AnchoredDraggableTestTag)
-            .performTouchInput { swipeDown() }
+        rule.onNodeWithTag(AnchoredDraggableTestTag).performTouchInput { swipeDown() }
 
         rule.waitForIdle()
 
@@ -143,22 +132,19 @@
 
     @Test
     fun anchoredDraggable_targetState_updatedOnSwipe() {
-        val state = AnchoredDraggableState(
-            initialValue = A,
-            positionalThreshold = defaultPositionalThreshold,
-            velocityThreshold = defaultVelocityThreshold,
-            animationSpec = defaultAnimationSpec
-        )
+        val state =
+            AnchoredDraggableState(
+                initialValue = A,
+                positionalThreshold = defaultPositionalThreshold,
+                velocityThreshold = defaultVelocityThreshold,
+                animationSpec = defaultAnimationSpec
+            )
         rule.setContent {
             Box(Modifier.fillMaxSize()) {
                 Box(
-                    Modifier
-                        .requiredSize(AnchoredDraggableBoxSize)
+                    Modifier.requiredSize(AnchoredDraggableBoxSize)
                         .testTag(AnchoredDraggableTestTag)
-                        .anchoredDraggable(
-                            state = state,
-                            orientation = Orientation.Vertical
-                        )
+                        .anchoredDraggable(state = state, orientation = Orientation.Vertical)
                         .onSizeChanged { layoutSize ->
                             state.updateAnchors(
                                 DraggableAnchors {
@@ -168,42 +154,41 @@
                                 }
                             )
                         }
-                        .offset {
-                            IntOffset(
-                                state
-                                    .requireOffset()
-                                    .roundToInt(), 0
-                            )
-                        }
+                        .offset { IntOffset(state.requireOffset().roundToInt(), 0) }
                         .background(Color.Red)
                 )
             }
         }
 
-        rule.onNodeWithTag(AnchoredDraggableTestTag)
-            .performTouchInput { swipeDown(endY = bottom * 0.45f) }
+        rule.onNodeWithTag(AnchoredDraggableTestTag).performTouchInput {
+            swipeDown(endY = bottom * 0.45f)
+        }
         rule.waitForIdle()
         assertThat(state.targetValue).isEqualTo(B)
 
         // Assert that swipe below threshold upward settles at current state
-        rule.onNodeWithTag(AnchoredDraggableTestTag)
-            .performTouchInput { swipeUp(endY = bottom * 0.95f, durationMillis = 1000) }
+        rule.onNodeWithTag(AnchoredDraggableTestTag).performTouchInput {
+            swipeUp(endY = bottom * 0.95f, durationMillis = 1000)
+        }
         rule.waitForIdle()
         assertThat(state.targetValue).isEqualTo(B)
 
         // Assert that swipe below threshold downward settles at current state
-        rule.onNodeWithTag(AnchoredDraggableTestTag)
-            .performTouchInput { swipeDown(endY = bottom * 0.05f) }
+        rule.onNodeWithTag(AnchoredDraggableTestTag).performTouchInput {
+            swipeDown(endY = bottom * 0.05f)
+        }
         rule.waitForIdle()
         assertThat(state.targetValue).isEqualTo(B)
 
-        rule.onNodeWithTag(AnchoredDraggableTestTag)
-            .performTouchInput { swipeDown(endY = bottom * 0.9f) }
+        rule.onNodeWithTag(AnchoredDraggableTestTag).performTouchInput {
+            swipeDown(endY = bottom * 0.9f)
+        }
         rule.waitForIdle()
         assertThat(state.targetValue).isEqualTo(C)
 
-        rule.onNodeWithTag(AnchoredDraggableTestTag)
-            .performTouchInput { swipeUp(endY = top * 1.1f) }
+        rule.onNodeWithTag(AnchoredDraggableTestTag).performTouchInput {
+            swipeUp(endY = top * 1.1f)
+        }
         rule.waitForIdle()
         assertThat(state.targetValue).isEqualTo(A)
     }
@@ -213,24 +198,21 @@
         rule.mainClock.autoAdvance = false
         val animationDuration = 300
         val frameLengthMillis = 16L
-        val state = AnchoredDraggableState(
-            initialValue = A,
-            animationSpec = tween(animationDuration, easing = LinearEasing),
-            positionalThreshold = { distance -> distance * 0.5f },
-            velocityThreshold = defaultVelocityThreshold
-        )
+        val state =
+            AnchoredDraggableState(
+                initialValue = A,
+                animationSpec = tween(animationDuration, easing = LinearEasing),
+                positionalThreshold = { distance -> distance * 0.5f },
+                velocityThreshold = defaultVelocityThreshold
+            )
         lateinit var scope: CoroutineScope
         rule.setContent {
             scope = rememberCoroutineScope()
             Box(Modifier.fillMaxSize()) {
                 Box(
-                    Modifier
-                        .requiredSize(AnchoredDraggableBoxSize)
+                    Modifier.requiredSize(AnchoredDraggableBoxSize)
                         .testTag(AnchoredDraggableTestTag)
-                        .anchoredDraggable(
-                            state = state,
-                            orientation = Orientation.Vertical
-                        )
+                        .anchoredDraggable(state = state, orientation = Orientation.Vertical)
                         .onSizeChanged { layoutSize ->
                             state.updateAnchors(
                                 DraggableAnchors {
@@ -240,60 +222,41 @@
                                 }
                             )
                         }
-                        .offset {
-                            IntOffset(
-                                state
-                                    .requireOffset()
-                                    .roundToInt(), 0
-                            )
-                        }
+                        .offset { IntOffset(state.requireOffset().roundToInt(), 0) }
                         .background(Color.Red)
                 )
             }
         }
 
-        scope.launch {
-            state.animateTo(targetValue = B)
-        }
+        scope.launch { state.animateTo(targetValue = B) }
         rule.mainClock.advanceTimeBy(1 * frameLengthMillis)
 
-        assertWithMessage("Current state")
-            .that(state.currentValue)
-            .isEqualTo(A)
-        assertWithMessage("Target state")
-            .that(state.targetValue)
-            .isEqualTo(B)
+        assertWithMessage("Current state").that(state.currentValue).isEqualTo(A)
+        assertWithMessage("Target state").that(state.targetValue).isEqualTo(B)
 
         rule.mainClock.autoAdvance = true
         rule.waitForIdle()
 
-        assertWithMessage("Current state")
-            .that(state.currentValue)
-            .isEqualTo(B)
-        assertWithMessage("Target state")
-            .that(state.targetValue)
-            .isEqualTo(B)
+        assertWithMessage("Current state").that(state.currentValue).isEqualTo(B)
+        assertWithMessage("Target state").that(state.targetValue).isEqualTo(B)
     }
 
     @Test
     fun anchoredDraggable_progress_matchesSwipePosition() {
-        val state = AnchoredDraggableState(
-            initialValue = A,
-            positionalThreshold = defaultPositionalThreshold,
-            velocityThreshold = defaultVelocityThreshold,
-            animationSpec = defaultAnimationSpec
-        )
+        val state =
+            AnchoredDraggableState(
+                initialValue = A,
+                positionalThreshold = defaultPositionalThreshold,
+                velocityThreshold = defaultVelocityThreshold,
+                animationSpec = defaultAnimationSpec
+            )
         rule.setContent {
             WithTouchSlop(touchSlop = 0f) {
                 Box(Modifier.fillMaxSize()) {
                     Box(
-                        Modifier
-                            .requiredSize(AnchoredDraggableBoxSize)
+                        Modifier.requiredSize(AnchoredDraggableBoxSize)
                             .testTag(AnchoredDraggableTestTag)
-                            .anchoredDraggable(
-                                state = state,
-                                orientation = Orientation.Vertical
-                            )
+                            .anchoredDraggable(state = state, orientation = Orientation.Vertical)
                             .onSizeChanged { layoutSize ->
                                 state.updateAnchors(
                                     DraggableAnchors {
@@ -303,13 +266,7 @@
                                     }
                                 )
                             }
-                            .offset {
-                                IntOffset(
-                                    state
-                                        .requireOffset()
-                                        .roundToInt(), 0
-                                )
-                            }
+                            .offset { IntOffset(state.requireOffset().roundToInt(), 0) }
                             .background(Color.Red)
                     )
                 }
@@ -321,8 +278,9 @@
         val almostAnchorB = anchorB * 0.9f
         var expectedProgress = almostAnchorB / (anchorB - anchorA)
 
-        rule.onNodeWithTag(AnchoredDraggableTestTag)
-            .performTouchInput { swipeDown(endY = almostAnchorB) }
+        rule.onNodeWithTag(AnchoredDraggableTestTag).performTouchInput {
+            swipeDown(endY = almostAnchorB)
+        }
 
         assertThat(state.targetValue).isEqualTo(B)
         assertThat(state.progress).isEqualTo(expectedProgress)
@@ -330,8 +288,9 @@
         val almostAnchorA = anchorA + ((anchorB - anchorA) * 0.1f)
         expectedProgress = 1 - (almostAnchorA / (anchorB - anchorA))
 
-        rule.onNodeWithTag(AnchoredDraggableTestTag)
-            .performTouchInput { swipeUp(startY = anchorB, endY = almostAnchorA) }
+        rule.onNodeWithTag(AnchoredDraggableTestTag).performTouchInput {
+            swipeUp(startY = anchorB, endY = almostAnchorA)
+        }
 
         assertThat(state.targetValue).isEqualTo(A)
         assertThat(state.progress).isEqualTo(expectedProgress)
@@ -339,22 +298,19 @@
 
     @Test
     fun anchoredDraggable_snapTo_updatesImmediately() = runBlocking {
-        val state = AnchoredDraggableState(
-            initialValue = A,
-            positionalThreshold = defaultPositionalThreshold,
-            velocityThreshold = defaultVelocityThreshold,
-            animationSpec = defaultAnimationSpec
-        )
+        val state =
+            AnchoredDraggableState(
+                initialValue = A,
+                positionalThreshold = defaultPositionalThreshold,
+                velocityThreshold = defaultVelocityThreshold,
+                animationSpec = defaultAnimationSpec
+            )
         rule.setContent {
             Box(Modifier.fillMaxSize()) {
                 Box(
-                    Modifier
-                        .requiredSize(AnchoredDraggableBoxSize)
+                    Modifier.requiredSize(AnchoredDraggableBoxSize)
                         .testTag(AnchoredDraggableTestTag)
-                        .anchoredDraggable(
-                            state = state,
-                            orientation = Orientation.Vertical
-                        )
+                        .anchoredDraggable(state = state, orientation = Orientation.Vertical)
                         .onSizeChanged { layoutSize ->
                             state.updateAnchors(
                                 DraggableAnchors {
@@ -364,21 +320,14 @@
                                 }
                             )
                         }
-                        .offset {
-                            IntOffset(
-                                state
-                                    .requireOffset()
-                                    .roundToInt(), 0
-                            )
-                        }
+                        .offset { IntOffset(state.requireOffset().roundToInt(), 0) }
                         .background(Color.Red)
                 )
             }
         }
 
         state.snapTo(C)
-        assertThat(state.currentValue)
-            .isEqualTo(C)
+        assertThat(state.currentValue).isEqualTo(C)
     }
 
     @Test
@@ -387,12 +336,13 @@
 
         val initialState = C
         val animationSpec = tween<Float>(durationMillis = 1000)
-        val state = AnchoredDraggableState(
-            initialValue = initialState,
-            positionalThreshold = defaultPositionalThreshold,
-            velocityThreshold = defaultVelocityThreshold,
-            animationSpec = animationSpec
-        )
+        val state =
+            AnchoredDraggableState(
+                initialValue = initialState,
+                positionalThreshold = defaultPositionalThreshold,
+                velocityThreshold = defaultVelocityThreshold,
+                animationSpec = animationSpec
+            )
         lateinit var scope: CoroutineScope
 
         restorationTester.setContent {
@@ -413,9 +363,7 @@
         assertThat(state.currentValue).isEqualTo(initialState)
         assertThat(state.animationSpec).isEqualTo(animationSpec)
 
-        scope.launch {
-            state.animateTo(B)
-        }
+        scope.launch { state.animateTo(B) }
         rule.waitForIdle()
         assertThat(state.currentValue).isEqualTo(B)
 
@@ -435,18 +383,12 @@
                     animationSpec = defaultAnimationSpec
                 )
             }
-            LaunchedEffect(state.targetValue) {
-                targetState = state.targetValue
-            }
+            LaunchedEffect(state.targetValue) { targetState = state.targetValue }
             Box(Modifier.fillMaxSize()) {
                 Box(
-                    Modifier
-                        .requiredSize(AnchoredDraggableBoxSize)
+                    Modifier.requiredSize(AnchoredDraggableBoxSize)
                         .testTag(AnchoredDraggableTestTag)
-                        .anchoredDraggable(
-                            state = state,
-                            orientation = Orientation.Horizontal
-                        )
+                        .anchoredDraggable(state = state, orientation = Orientation.Horizontal)
                         .onSizeChanged { layoutSize ->
                             state.updateAnchors(
                                 DraggableAnchors {
@@ -456,13 +398,7 @@
                                 }
                             )
                         }
-                        .offset {
-                            IntOffset(
-                                state
-                                    .requireOffset()
-                                    .roundToInt(), 0
-                            )
-                        }
+                        .offset { IntOffset(state.requireOffset().roundToInt(), 0) }
                         .background(Color.Red)
                 )
             }
@@ -483,18 +419,12 @@
                     animationSpec = defaultAnimationSpec
                 )
             }
-            LaunchedEffect(state.progress) {
-                progress = state.progress
-            }
+            LaunchedEffect(state.progress) { progress = state.progress }
             Box(Modifier.fillMaxSize()) {
                 Box(
-                    Modifier
-                        .requiredSize(AnchoredDraggableBoxSize)
+                    Modifier.requiredSize(AnchoredDraggableBoxSize)
                         .testTag(AnchoredDraggableTestTag)
-                        .anchoredDraggable(
-                            state = state,
-                            orientation = Orientation.Horizontal
-                        )
+                        .anchoredDraggable(state = state, orientation = Orientation.Horizontal)
                         .onSizeChanged { layoutSize ->
                             state.updateAnchors(
                                 DraggableAnchors {
@@ -504,13 +434,7 @@
                                 }
                             )
                         }
-                        .offset {
-                            IntOffset(
-                                state
-                                    .requireOffset()
-                                    .roundToInt(), 0
-                            )
-                        }
+                        .offset { IntOffset(state.requireOffset().roundToInt(), 0) }
                         .background(Color.Red)
                 )
             }
@@ -523,23 +447,20 @@
     @Ignore("Todo: Fix differences between tests and real code - this shouldn't work :)")
     fun anchoredDraggable_requireOffset_accessedInInitialComposition_throws() {
         var exception: Throwable? = null
-        val state = AnchoredDraggableState(
-            initialValue = B,
-            positionalThreshold = defaultPositionalThreshold,
-            velocityThreshold = defaultVelocityThreshold,
-            animationSpec = defaultAnimationSpec
-        )
+        val state =
+            AnchoredDraggableState(
+                initialValue = B,
+                positionalThreshold = defaultPositionalThreshold,
+                velocityThreshold = defaultVelocityThreshold,
+                animationSpec = defaultAnimationSpec
+            )
         var offset: Float? = null
         rule.setContent {
             Box(Modifier.fillMaxSize()) {
                 Box(
-                    Modifier
-                        .requiredSize(AnchoredDraggableBoxSize)
+                    Modifier.requiredSize(AnchoredDraggableBoxSize)
                         .testTag(AnchoredDraggableTestTag)
-                        .anchoredDraggable(
-                            state = state,
-                            orientation = Orientation.Horizontal
-                        )
+                        .anchoredDraggable(state = state, orientation = Orientation.Horizontal)
                         .onSizeChanged { layoutSize ->
                             state.updateAnchors(
                                 DraggableAnchors {
@@ -549,13 +470,7 @@
                                 }
                             )
                         }
-                        .offset {
-                            IntOffset(
-                                state
-                                    .requireOffset()
-                                    .roundToInt(), 0
-                            )
-                        }
+                        .offset { IntOffset(state.requireOffset().roundToInt(), 0) }
                         .background(Color.Red)
                 )
             }
@@ -601,49 +516,39 @@
         }
 
         val animationSpec = FloatSpringSpec(dampingRatio = Spring.DampingRatioHighBouncy)
-        val animationDuration = animationSpec.getDurationNanos(
-            initialValue = minBound,
-            targetValue = maxBound,
-            initialVelocity = 0f
-        ).let { TimeUnit.NANOSECONDS.toMillis(it) }
+        val animationDuration =
+            animationSpec
+                .getDurationNanos(
+                    initialValue = minBound,
+                    targetValue = maxBound,
+                    initialVelocity = 0f
+                )
+                .let { TimeUnit.NANOSECONDS.toMillis(it) }
 
-        val state = AnchoredDraggableState(
-            initialValue = A,
-            positionalThreshold = defaultPositionalThreshold,
-            velocityThreshold = defaultVelocityThreshold,
-            animationSpec = animationSpec
-        )
+        val state =
+            AnchoredDraggableState(
+                initialValue = A,
+                positionalThreshold = defaultPositionalThreshold,
+                velocityThreshold = defaultVelocityThreshold,
+                animationSpec = animationSpec
+            )
         lateinit var scope: CoroutineScope
 
         rule.setContent {
             scope = rememberCoroutineScope()
-            SideEffect {
-                state.updateAnchors(anchors)
-            }
+            SideEffect { state.updateAnchors(anchors) }
             Box(Modifier.fillMaxSize()) {
                 Box(
-                    Modifier
-                        .requiredSize(AnchoredDraggableBoxSize)
+                    Modifier.requiredSize(AnchoredDraggableBoxSize)
                         .testTag(AnchoredDraggableTestTag)
-                        .anchoredDraggable(
-                            state = state,
-                            orientation = Orientation.Vertical
-                        )
-                        .offset {
-                            IntOffset(
-                                state
-                                    .requireOffset()
-                                    .roundToInt(), 0
-                            )
-                        }
+                        .anchoredDraggable(state = state, orientation = Orientation.Vertical)
+                        .offset { IntOffset(state.requireOffset().roundToInt(), 0) }
                         .background(Color.Red)
                 )
             }
         }
 
-        scope.launch {
-            state.animateTo(C)
-        }
+        scope.launch { state.animateTo(C) }
         var highestOffset = 0f
         for (i in 0..animationDuration step 16) {
             highestOffset = state.requireOffset()
@@ -654,12 +559,13 @@
 
     @Test
     fun anchoredDraggable_targetNotInAnchors_animateTo_updatesCurrentValue() {
-        val state = AnchoredDraggableState(
-            initialValue = A,
-            positionalThreshold = defaultPositionalThreshold,
-            velocityThreshold = defaultVelocityThreshold,
-            animationSpec = defaultAnimationSpec
-        )
+        val state =
+            AnchoredDraggableState(
+                initialValue = A,
+                positionalThreshold = defaultPositionalThreshold,
+                velocityThreshold = defaultVelocityThreshold,
+                animationSpec = defaultAnimationSpec
+            )
         assertThat(state.anchors.size).isEqualTo(0)
         assertThat(state.currentValue).isEqualTo(A)
         runBlocking { state.animateTo(B) }
@@ -668,12 +574,13 @@
 
     @Test
     fun anchoredDraggable_targetNotInAnchors_snapTo_updatesCurrentValue() {
-        val state = AnchoredDraggableState(
-            initialValue = A,
-            positionalThreshold = defaultPositionalThreshold,
-            velocityThreshold = defaultVelocityThreshold,
-            animationSpec = defaultAnimationSpec
-        )
+        val state =
+            AnchoredDraggableState(
+                initialValue = A,
+                positionalThreshold = defaultPositionalThreshold,
+                velocityThreshold = defaultVelocityThreshold,
+                animationSpec = defaultAnimationSpec
+            )
         assertThat(state.anchors.size).isEqualTo(0)
         assertThat(state.currentValue).isEqualTo(A)
         runBlocking { state.snapTo(B) }
@@ -682,12 +589,13 @@
 
     @Test
     fun anchoredDraggable_updateAnchors_noOngoingDrag_shouldUpdateOffset() {
-        val anchoredDraggableState = AnchoredDraggableState(
-            initialValue = A,
-            positionalThreshold = defaultPositionalThreshold,
-            velocityThreshold = defaultVelocityThreshold,
-            animationSpec = defaultAnimationSpec
-        )
+        val anchoredDraggableState =
+            AnchoredDraggableState(
+                initialValue = A,
+                positionalThreshold = defaultPositionalThreshold,
+                velocityThreshold = defaultVelocityThreshold,
+                animationSpec = defaultAnimationSpec
+            )
 
         assertThat(anchoredDraggableState.currentValue).isEqualTo(A)
         assertThat(anchoredDraggableState.targetValue).isEqualTo(A)
@@ -695,10 +603,11 @@
 
         val offsetAtB = 100f
         anchoredDraggableState.updateAnchors(
-            newAnchors = DraggableAnchors {
-                A at 0f
-                B at offsetAtB
-            },
+            newAnchors =
+                DraggableAnchors {
+                    A at 0f
+                    B at offsetAtB
+                },
             newTarget = B
         )
         assertThat(anchoredDraggableState.currentValue).isEqualTo(B)
@@ -710,12 +619,13 @@
     @Test
     fun anchoredDraggable_updateAnchors_ongoingDrag_shouldRestartDrag() = runTest {
         // Given an anchored draggable state
-        val anchoredDraggableState = AnchoredDraggableState(
-            initialValue = 1,
-            defaultPositionalThreshold,
-            defaultVelocityThreshold,
-            animationSpec = defaultAnimationSpec
-        )
+        val anchoredDraggableState =
+            AnchoredDraggableState(
+                initialValue = 1,
+                defaultPositionalThreshold,
+                defaultVelocityThreshold,
+                animationSpec = defaultAnimationSpec
+            )
 
         val anchorUpdates = Channel<DraggableAnchors<Int>>()
         val dragJob = launch {
@@ -733,9 +643,7 @@
             1 at 100f
             2 at 200f
         }
-        Snapshot.withMutableSnapshot {
-            anchoredDraggableState.updateAnchors(newAnchors)
-        }
+        Snapshot.withMutableSnapshot { anchoredDraggableState.updateAnchors(newAnchors) }
 
         // Then the block should be invoked with the new anchors
         assertThat(dragJob.isActive).isTrue()
@@ -748,20 +656,22 @@
     @Test
     fun anchoredDraggable_updateAnchors_anchoredDrag_invokedWithLatestAnchors() = runTest {
         // Given an anchored draggable state
-        val anchoredDraggableState = AnchoredDraggableState(
-            initialValue = 1,
-            defaultPositionalThreshold,
-            defaultVelocityThreshold,
-            animationSpec = defaultAnimationSpec
-        )
+        val anchoredDraggableState =
+            AnchoredDraggableState(
+                initialValue = 1,
+                defaultPositionalThreshold,
+                defaultVelocityThreshold,
+                animationSpec = defaultAnimationSpec
+            )
 
         val anchorUpdates = Channel<DraggableAnchors<Int>>()
-        val dragJob = launch(Dispatchers.Unconfined) {
-            anchoredDraggableState.anchoredDrag { newAnchors ->
-                anchorUpdates.send(newAnchors)
-                suspendIndefinitely()
+        val dragJob =
+            launch(Dispatchers.Unconfined) {
+                anchoredDraggableState.anchoredDrag { newAnchors ->
+                    anchorUpdates.send(newAnchors)
+                    suspendIndefinitely()
+                }
             }
-        }
 
         val firstAnchors = anchorUpdates.receive()
         assertThat(firstAnchors.size).isEqualTo(0)
@@ -771,9 +681,7 @@
             1 at 100f
             2 at 200f
         }
-        Snapshot.withMutableSnapshot {
-            anchoredDraggableState.updateAnchors(newAnchors)
-        }
+        Snapshot.withMutableSnapshot { anchoredDraggableState.updateAnchors(newAnchors) }
 
         // Then the block should be invoked with the new anchors
         assertThat(dragJob.isActive).isTrue()
@@ -785,12 +693,13 @@
     @OptIn(ExperimentalCoroutinesApi::class)
     @Test
     fun anchoredDraggable_updateAnchors_anchoredDrag_invokedWithLatestTarget() = runTest {
-        val anchoredDraggableState = AnchoredDraggableState(
-            initialValue = A,
-            defaultPositionalThreshold,
-            defaultVelocityThreshold,
-            animationSpec = defaultAnimationSpec
-        )
+        val anchoredDraggableState =
+            AnchoredDraggableState(
+                initialValue = A,
+                defaultPositionalThreshold,
+                defaultVelocityThreshold,
+                animationSpec = defaultAnimationSpec
+            )
         anchoredDraggableState.updateAnchors(
             DraggableAnchors {
                 A at 0f
@@ -802,12 +711,13 @@
 
         val firstExpectedTarget = B
         val targetUpdates = Channel<AnchoredDraggableTestValue>()
-        val dragJob = launch(Dispatchers.Unconfined) {
-            anchoredDraggableState.anchoredDrag(firstExpectedTarget) { _, latestTarget ->
-                targetUpdates.send(latestTarget)
-                suspendIndefinitely()
+        val dragJob =
+            launch(Dispatchers.Unconfined) {
+                anchoredDraggableState.anchoredDrag(firstExpectedTarget) { _, latestTarget ->
+                    targetUpdates.send(latestTarget)
+                    suspendIndefinitely()
+                }
             }
-        }
 
         val firstTarget = targetUpdates.receive()
         assertThat(firstTarget).isEqualTo(firstExpectedTarget)
@@ -818,9 +728,7 @@
             A at 100f
             B at 200f
         }
-        Snapshot.withMutableSnapshot {
-            anchoredDraggableState.updateAnchors(newAnchors, newTarget)
-        }
+        Snapshot.withMutableSnapshot { anchoredDraggableState.updateAnchors(newAnchors, newTarget) }
 
         // Then the block should be invoked with the new anchors
         val secondTarget = targetUpdates.receive()
@@ -831,12 +739,13 @@
     @OptIn(ExperimentalCoroutinesApi::class)
     @Test
     fun anchoredDraggable_dragCompletesExceptionally_cleansUp() = runTest {
-        val anchoredDraggableState = AnchoredDraggableState(
-            initialValue = A,
-            defaultPositionalThreshold,
-            defaultVelocityThreshold,
-            animationSpec = defaultAnimationSpec
-        )
+        val anchoredDraggableState =
+            AnchoredDraggableState(
+                initialValue = A,
+                defaultPositionalThreshold,
+                defaultVelocityThreshold,
+                animationSpec = defaultAnimationSpec
+            )
         val cancellationSignal = CompletableDeferred(false)
         val anchoredDragUpdates = Channel<Unit>()
         val dragJob = launch {
@@ -856,12 +765,13 @@
 
     @Test
     fun anchoredDraggable_customDrag_updatesOffset() = runBlocking {
-        val state = AnchoredDraggableState(
-            initialValue = A,
-            positionalThreshold = defaultPositionalThreshold,
-            velocityThreshold = defaultVelocityThreshold,
-            animationSpec = defaultAnimationSpec
-        )
+        val state =
+            AnchoredDraggableState(
+                initialValue = A,
+                positionalThreshold = defaultPositionalThreshold,
+                velocityThreshold = defaultVelocityThreshold,
+                animationSpec = defaultAnimationSpec
+            )
         val anchors = DraggableAnchors {
             A at 0f
             B at 200f
@@ -869,26 +779,23 @@
         }
 
         state.updateAnchors(anchors)
-        state.anchoredDrag {
-            dragTo(150f)
-        }
+        state.anchoredDrag { dragTo(150f) }
 
         assertThat(state.requireOffset()).isEqualTo(150f)
 
-        state.anchoredDrag {
-            dragTo(250f)
-        }
+        state.anchoredDrag { dragTo(250f) }
         assertThat(state.requireOffset()).isEqualTo(250f)
     }
 
     @Test
     fun anchoredDraggable_customDrag_updatesVelocity() = runBlocking {
-        val state = AnchoredDraggableState(
-            initialValue = A,
-            positionalThreshold = defaultPositionalThreshold,
-            velocityThreshold = defaultVelocityThreshold,
-            animationSpec = defaultAnimationSpec
-        )
+        val state =
+            AnchoredDraggableState(
+                initialValue = A,
+                positionalThreshold = defaultPositionalThreshold,
+                velocityThreshold = defaultVelocityThreshold,
+                animationSpec = defaultAnimationSpec
+            )
         val anchors = DraggableAnchors {
             A at 0f
             B at 200f
@@ -896,9 +803,7 @@
         }
 
         state.updateAnchors(anchors)
-        state.anchoredDrag {
-            dragTo(150f, lastKnownVelocity = 454f)
-        }
+        state.anchoredDrag { dragTo(150f, lastKnownVelocity = 454f) }
         assertThat(state.lastVelocity).isEqualTo(454f)
     }
 
@@ -907,12 +812,13 @@
         val clock = HandPumpTestFrameClock()
         val dragScope = CoroutineScope(clock)
 
-        val state = AnchoredDraggableState(
-            initialValue = A,
-            positionalThreshold = defaultPositionalThreshold,
-            velocityThreshold = defaultVelocityThreshold,
-            animationSpec = defaultAnimationSpec
-        )
+        val state =
+            AnchoredDraggableState(
+                initialValue = A,
+                positionalThreshold = defaultPositionalThreshold,
+                velocityThreshold = defaultVelocityThreshold,
+                animationSpec = defaultAnimationSpec
+            )
         val anchors = DraggableAnchors {
             A at 0f
             B at 200f
@@ -923,9 +829,7 @@
         dragScope.launch(start = CoroutineStart.UNDISPATCHED) {
             state.anchoredDrag(targetValue = C) { _, _ ->
                 while (isActive) {
-                    withFrameNanos {
-                        dragTo(200f)
-                    }
+                    withFrameNanos { dragTo(200f) }
                 }
             }
         }
@@ -941,13 +845,14 @@
             A at initialValueOffset
             B at 200f
         }
-        val state = AnchoredDraggableState(
-            initialValue = A,
-            anchors = anchors,
-            positionalThreshold = defaultPositionalThreshold,
-            velocityThreshold = defaultVelocityThreshold,
-            animationSpec = defaultAnimationSpec
-        )
+        val state =
+            AnchoredDraggableState(
+                initialValue = A,
+                anchors = anchors,
+                positionalThreshold = defaultPositionalThreshold,
+                velocityThreshold = defaultVelocityThreshold,
+                animationSpec = defaultAnimationSpec
+            )
         assertThat(state.anchors).isEqualTo(anchors)
         assertThat(state.offset).isEqualTo(initialValueOffset)
     }
@@ -955,13 +860,14 @@
     @Test
     fun anchoredDraggable_constructorWithAnchors_initialValueNotInAnchors_updatesCurrentValue() {
         val anchors = DraggableAnchors { B at 200f }
-        val state = AnchoredDraggableState(
-            initialValue = A,
-            anchors = anchors,
-            positionalThreshold = defaultPositionalThreshold,
-            velocityThreshold = defaultVelocityThreshold,
-            animationSpec = defaultAnimationSpec
-        )
+        val state =
+            AnchoredDraggableState(
+                initialValue = A,
+                anchors = anchors,
+                positionalThreshold = defaultPositionalThreshold,
+                velocityThreshold = defaultVelocityThreshold,
+                animationSpec = defaultAnimationSpec
+            )
         assertThat(state.anchors).isEqualTo(anchors)
         assertThat(state.offset).isNaN()
     }
@@ -970,18 +876,17 @@
     fun anchoredDraggable_customDrag_settleOnInvalidState_shouldRespectConfirmValueChange() =
         runBlocking {
             var shouldBlockValueC = false
-            val state = AnchoredDraggableState(
-                initialValue = B,
-                positionalThreshold = defaultPositionalThreshold,
-                velocityThreshold = defaultVelocityThreshold,
-                animationSpec = defaultAnimationSpec,
-                confirmValueChange = {
-                    if (shouldBlockValueC)
-                        it != C // block state value C
-                    else
-                        true
-                }
-            )
+            val state =
+                AnchoredDraggableState(
+                    initialValue = B,
+                    positionalThreshold = defaultPositionalThreshold,
+                    velocityThreshold = defaultVelocityThreshold,
+                    animationSpec = defaultAnimationSpec,
+                    confirmValueChange = {
+                        if (shouldBlockValueC) it != C // block state value C
+                        else true
+                    }
+                )
             val anchors = DraggableAnchors {
                 A at 0f
                 B at 200f
@@ -989,25 +894,19 @@
             }
 
             state.updateAnchors(anchors)
-            state.anchoredDrag {
-                dragTo(300f)
-            }
+            state.anchoredDrag { dragTo(300f) }
 
             // confirm we can actually go to C
             assertThat(state.currentValue).isEqualTo(C)
 
             // go back to B
-            state.anchoredDrag {
-                dragTo(200f)
-            }
+            state.anchoredDrag { dragTo(200f) }
             assertThat(state.currentValue).isEqualTo(B)
 
             // disallow C
             shouldBlockValueC = true
 
-            state.anchoredDrag {
-                dragTo(300f)
-            }
+            state.anchoredDrag { dragTo(300f) }
             assertThat(state.currentValue).isNotEqualTo(C)
         }
 
@@ -1020,50 +919,59 @@
         )
 
         val innerLayoutExecutionOrder = mutableListOf<LayoutExecutionInfo>()
-        val state = AnchoredDraggableState(
-            initialValue = B,
-            positionalThreshold = defaultPositionalThreshold,
-            velocityThreshold = defaultVelocityThreshold,
-            animationSpec = defaultAnimationSpec
-        )
+        val state =
+            AnchoredDraggableState(
+                initialValue = B,
+                positionalThreshold = defaultPositionalThreshold,
+                velocityThreshold = defaultVelocityThreshold,
+                animationSpec = defaultAnimationSpec
+            )
         rule.setContent {
             LookaheadScope {
                 SubcomposeLayout { constraints ->
                     layout(0, 0) {
                         // Do all work in placement instead of measurement, so we run lookahead
                         // place before post-lookahead measure
-                        val placeables = subcompose("sheet") {
-                            Box(
-                                modifier = Modifier
-                                    .layout { measurable, innerConstraints ->
-                                        innerLayoutExecutionOrder
-                                            .add(LayoutExecutionInfo(0, isLookingAhead))
-                                        layout(
-                                            innerConstraints.maxWidth,
-                                            innerConstraints.maxHeight
-                                        ) {
-                                            val placeable = measurable.measure(innerConstraints)
-                                            innerLayoutExecutionOrder
-                                                .add(LayoutExecutionInfo(1, isLookingAhead))
-                                            placeable.place(0, 0)
-                                        }
-                                    }
-                                    // The offset should be initialized by draggableAnchors in
-                                    // lookahead measure. If lookahead place runs before
-                                    // post-lookahead measure and we were not initializing the
-                                    // offset in lookahead measure, this would crash as
-                                    // draggableAnchors uses requireOffset in placement.
-                                    .draggableAnchors(
-                                        state,
-                                        Orientation.Vertical
-                                    ) { size, constraints ->
-                                        DraggableAnchors {
-                                            A at 0f
-                                            C at constraints.maxHeight - size.height.toFloat()
-                                        } to A
-                                    }
-                            )
-                        }.map { it.measure(constraints) }
+                        val placeables =
+                            subcompose("sheet") {
+                                    Box(
+                                        modifier =
+                                            Modifier.layout { measurable, innerConstraints ->
+                                                    innerLayoutExecutionOrder.add(
+                                                        LayoutExecutionInfo(0, isLookingAhead)
+                                                    )
+                                                    layout(
+                                                        innerConstraints.maxWidth,
+                                                        innerConstraints.maxHeight
+                                                    ) {
+                                                        val placeable =
+                                                            measurable.measure(innerConstraints)
+                                                        innerLayoutExecutionOrder.add(
+                                                            LayoutExecutionInfo(1, isLookingAhead)
+                                                        )
+                                                        placeable.place(0, 0)
+                                                    }
+                                                }
+                                                // The offset should be initialized by
+                                                // draggableAnchors in
+                                                // lookahead measure. If lookahead place runs before
+                                                // post-lookahead measure and we were not
+                                                // initializing the
+                                                // offset in lookahead measure, this would crash as
+                                                // draggableAnchors uses requireOffset in placement.
+                                                .draggableAnchors(state, Orientation.Vertical) {
+                                                    size,
+                                                    constraints ->
+                                                    DraggableAnchors {
+                                                        A at 0f
+                                                        C at
+                                                            constraints.maxHeight -
+                                                                size.height.toFloat()
+                                                    } to A
+                                                }
+                                    )
+                                }
+                                .map { it.measure(constraints) }
                         placeables.map { it.place(0, 0) }
                     }
                 }
@@ -1081,19 +989,21 @@
     // Regression test for b/332930104
     @Test
     fun draggableAnchors_equals() {
-        val state = AnchoredDraggableState(
-            initialValue = B,
-            positionalThreshold = defaultPositionalThreshold,
-            velocityThreshold = defaultVelocityThreshold,
-            animationSpec = defaultAnimationSpec
-        )
-        val draggableAnchors = Modifier.draggableAnchors(state, Orientation.Vertical) { _, _ ->
-            DraggableAnchors<AnchoredDraggableTestValue> { } to A
-        }
+        val state =
+            AnchoredDraggableState(
+                initialValue = B,
+                positionalThreshold = defaultPositionalThreshold,
+                velocityThreshold = defaultVelocityThreshold,
+                animationSpec = defaultAnimationSpec
+            )
+        val draggableAnchors =
+            Modifier.draggableAnchors(state, Orientation.Vertical) { _, _ ->
+                DraggableAnchors<AnchoredDraggableTestValue> {} to A
+            }
         assertThat(draggableAnchors).isNotEqualTo(Modifier)
     }
 
-    private suspend fun suspendIndefinitely() = suspendCancellableCoroutine<Unit> { }
+    private suspend fun suspendIndefinitely() = suspendCancellableCoroutine<Unit> {}
 
     private class HandPumpTestFrameClock : MonotonicFrameClock {
         private val frameCh = Channel<Long>(1)
diff --git a/compose/material/material/src/androidInstrumentedTest/kotlin/androidx/compose/material/anchoredDraggable/AnchoredDraggableTestValue.kt b/compose/material/material/src/androidInstrumentedTest/kotlin/androidx/compose/material/anchoredDraggable/AnchoredDraggableTestValue.kt
index d655926..fc4153d 100644
--- a/compose/material/material/src/androidInstrumentedTest/kotlin/androidx/compose/material/anchoredDraggable/AnchoredDraggableTestValue.kt
+++ b/compose/material/material/src/androidInstrumentedTest/kotlin/androidx/compose/material/anchoredDraggable/AnchoredDraggableTestValue.kt
@@ -20,4 +20,8 @@
 
 import androidx.compose.material.ExperimentalMaterialApi
 
-internal enum class AnchoredDraggableTestValue { A, B, C }
+internal enum class AnchoredDraggableTestValue {
+    A,
+    B,
+    C
+}
diff --git a/compose/material/material/src/androidInstrumentedTest/kotlin/androidx/compose/material/pullrefresh/PullRefreshIndicatorTest.kt b/compose/material/material/src/androidInstrumentedTest/kotlin/androidx/compose/material/pullrefresh/PullRefreshIndicatorTest.kt
index 732d4c5..e391f63 100644
--- a/compose/material/material/src/androidInstrumentedTest/kotlin/androidx/compose/material/pullrefresh/PullRefreshIndicatorTest.kt
+++ b/compose/material/material/src/androidInstrumentedTest/kotlin/androidx/compose/material/pullrefresh/PullRefreshIndicatorTest.kt
@@ -54,8 +54,7 @@
 @OptIn(ExperimentalMaterialApi::class)
 class PullRefreshIndicatorTest {
 
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
     @Test
     fun indicatorDisplayed_refreshingInitially() {
@@ -94,19 +93,17 @@
         var refreshing by mutableStateOf(false)
 
         rule.setContent {
-            val state = rememberPullRefreshState(refreshing, { refreshing = true; refreshCount++ })
-
-            Box(
-                Modifier
-                    .pullRefresh(state)
-                    .testTag(PullRefreshTag)) {
-                LazyColumn {
-                    items(30) {
-                        ListItem {
-                            Text("Item: $it")
-                        }
+            val state =
+                rememberPullRefreshState(
+                    refreshing,
+                    {
+                        refreshing = true
+                        refreshCount++
                     }
-                }
+                )
+
+            Box(Modifier.pullRefresh(state).testTag(PullRefreshTag)) {
+                LazyColumn { items(30) { ListItem { Text("Item: $it") } } }
                 PullRefreshIndicator(refreshing, state, Modifier.testTag(IndicatorTag))
             }
         }
@@ -132,17 +129,8 @@
         rule.setContent {
             val state = rememberPullRefreshState(refreshing, {})
 
-            Box(
-                Modifier
-                    .pullRefresh(state)
-                    .testTag(PullRefreshTag)) {
-                LazyColumn {
-                    items(30) {
-                        ListItem {
-                            Text("Item: $it")
-                        }
-                    }
-                }
+            Box(Modifier.pullRefresh(state).testTag(PullRefreshTag)) {
+                LazyColumn { items(30) { ListItem { Text("Item: $it") } } }
                 PullRefreshIndicator(refreshing, state, Modifier.testTag(IndicatorTag))
             }
         }
@@ -180,20 +168,24 @@
             state = rememberPullRefreshState(false, {})
 
             Box {
-                Box(Modifier.fillMaxSize().pointerInput(Unit) {
-                    awaitEachGesture {
-                        downEvent = awaitFirstDown()
+                Box(
+                    Modifier.fillMaxSize().pointerInput(Unit) {
+                        awaitEachGesture { downEvent = awaitFirstDown() }
                     }
-                })
+                )
                 PullRefreshIndicator(
                     refreshing = false,
                     state = state,
-                    modifier = Modifier.onSizeChanged {
-                        // The indicator starts as offset by its negative height in the y direction,
-                        // so work out its height so we can place it inside its normal layout
-                        // bounds
-                        indicatorSize = it
-                    }.testTag(IndicatorTag)
+                    modifier =
+                        Modifier.onSizeChanged {
+                                // The indicator starts as offset by its negative height in the y
+                                // direction,
+                                // so work out its height so we can place it inside its normal
+                                // layout
+                                // bounds
+                                indicatorSize = it
+                            }
+                            .testTag(IndicatorTag)
                 )
             }
         }
@@ -213,8 +205,11 @@
         }
     }
 
-    private val pullRefreshNode get() = rule.onNodeWithTag(PullRefreshTag)
-    private val indicatorNode get() = rule.onNodeWithTag(IndicatorTag).onChild()
+    private val pullRefreshNode
+        get() = rule.onNodeWithTag(PullRefreshTag)
+
+    private val indicatorNode
+        get() = rule.onNodeWithTag(IndicatorTag).onChild()
 }
 
 private const val PullRefreshTag = "pull-refresh"
diff --git a/compose/material/material/src/androidInstrumentedTest/kotlin/androidx/compose/material/pullrefresh/PullRefreshIndicatorTransformTest.kt b/compose/material/material/src/androidInstrumentedTest/kotlin/androidx/compose/material/pullrefresh/PullRefreshIndicatorTransformTest.kt
index fc7af76..e8f8f93 100644
--- a/compose/material/material/src/androidInstrumentedTest/kotlin/androidx/compose/material/pullrefresh/PullRefreshIndicatorTransformTest.kt
+++ b/compose/material/material/src/androidInstrumentedTest/kotlin/androidx/compose/material/pullrefresh/PullRefreshIndicatorTransformTest.kt
@@ -45,12 +45,13 @@
 @OptIn(ExperimentalMaterialApi::class)
 class PullRefreshIndicatorTransformTest {
 
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
     // Convert from floats to DP to avoid rounding issues later
 
-    private val IndicatorSize get() = with(rule.density) { 200f.toDp() }
+    private val IndicatorSize
+        get() = with(rule.density) { 200f.toDp() }
+
     // Make the box large enough so that when the indicator is offset when not shown, it is still
     // offset to within the bounds of the containing box
     private val ContainingBoxSize = with(rule.density) { 800f.toDp() }
@@ -62,8 +63,7 @@
         rule.setContent {
             val state = rememberPullRefreshState(refreshing = false, {})
             Box(
-                Modifier
-                    .fillMaxSize()
+                Modifier.fillMaxSize()
                     .background(Color.White)
                     .wrapContentSize(Alignment.Center)
                     // Set a larger size so that when offset the indicator will still appear
@@ -71,10 +71,10 @@
                     .testTag(BoxTag),
                 contentAlignment = Alignment.Center
             ) {
-                Box(Modifier
-                    .pullRefreshIndicatorTransform(state)
-                    .size(IndicatorSize)
-                    .background(Color.Black)
+                Box(
+                    Modifier.pullRefreshIndicatorTransform(state)
+                        .size(IndicatorSize)
+                        .background(Color.Black)
                 )
             }
         }
@@ -89,12 +89,10 @@
         rule.setContent {
             // Pull down by 100 pixels (the actual position delta is half of this because the state
             // applies a multiplier)
-            state = rememberPullRefreshState(refreshing = false, onRefresh = {}).apply {
-                onPull(100f)
-            }
+            state =
+                rememberPullRefreshState(refreshing = false, onRefresh = {}).apply { onPull(100f) }
             Box(
-                Modifier
-                    .fillMaxSize()
+                Modifier.fillMaxSize()
                     .background(Color.White)
                     .wrapContentSize(Alignment.Center)
                     // Set a larger size so that when offset the indicator will still appear
@@ -102,19 +100,20 @@
                     .testTag(BoxTag),
                 contentAlignment = Alignment.Center
             ) {
-                Box(Modifier
-                    .pullRefreshIndicatorTransform(state)
-                    .size(IndicatorSize)
-                    .background(Color.Black)
+                Box(
+                    Modifier.pullRefreshIndicatorTransform(state)
+                        .size(IndicatorSize)
+                        .background(Color.Black)
                 )
             }
         }
         // The indicator should be partially clipped
         rule.onNodeWithTag(BoxTag).captureToImage().run {
             val indicatorStart = with(rule.density) { width / 2 - IndicatorSize.toPx() / 2 }.toInt()
-            val indicatorXRange = with(rule.density) {
-                indicatorStart until (indicatorStart + IndicatorSize.toPx()).toInt()
-            }
+            val indicatorXRange =
+                with(rule.density) {
+                    indicatorStart until (indicatorStart + IndicatorSize.toPx()).toInt()
+                }
 
             val indicatorTop = with(rule.density) { height / 2 - IndicatorSize.toPx() / 2 }.toInt()
             val indicatorYRange = indicatorTop until indicatorTop + state.position.toInt()
@@ -122,11 +121,12 @@
             val pixel = toPixelMap()
             for (x in 0 until width) {
                 for (y in 0 until height) {
-                    val expectedColor = if (x in indicatorXRange && y in indicatorYRange) {
-                        Color.Black
-                    } else {
-                        Color.White
-                    }
+                    val expectedColor =
+                        if (x in indicatorXRange && y in indicatorYRange) {
+                            Color.Black
+                        } else {
+                            Color.White
+                        }
                     pixel.assertPixelColor(expectedColor, x, y)
                 }
             }
@@ -141,14 +141,14 @@
             // Set refreshing and set the refreshing offset to match the indicator size -
             // this means that the indicator will start to show at an offset of 0 from its normal
             // layout position, since by default it is negatively offset by its height
-            state = rememberPullRefreshState(
-                refreshing = true,
-                onRefresh = {},
-                refreshingOffset = IndicatorSize
-            )
+            state =
+                rememberPullRefreshState(
+                    refreshing = true,
+                    onRefresh = {},
+                    refreshingOffset = IndicatorSize
+                )
             Box(
-                Modifier
-                    .fillMaxSize()
+                Modifier.fillMaxSize()
                     .background(Color.White)
                     .wrapContentSize(Alignment.Center)
                     // Set a larger size so that when offset the indicator will still appear
@@ -156,33 +156,36 @@
                     .testTag(BoxTag),
                 contentAlignment = Alignment.Center
             ) {
-                Box(Modifier
-                    .pullRefreshIndicatorTransform(state)
-                    .size(IndicatorSize)
-                    .background(Color.Black)
+                Box(
+                    Modifier.pullRefreshIndicatorTransform(state)
+                        .size(IndicatorSize)
+                        .background(Color.Black)
                 )
             }
         }
         // The indicator should be fully visible
         rule.onNodeWithTag(BoxTag).captureToImage().run {
             val indicatorStart = with(rule.density) { width / 2 - IndicatorSize.toPx() / 2 }.toInt()
-            val indicatorXRange = with(rule.density) {
-                indicatorStart until (indicatorStart + IndicatorSize.toPx()).toInt()
-            }
+            val indicatorXRange =
+                with(rule.density) {
+                    indicatorStart until (indicatorStart + IndicatorSize.toPx()).toInt()
+                }
 
             val indicatorTop = with(rule.density) { height / 2 - IndicatorSize.toPx() / 2 }.toInt()
-            val indicatorYRange = with(rule.density) {
-                indicatorTop until (indicatorTop + IndicatorSize.toPx()).toInt()
-            }
+            val indicatorYRange =
+                with(rule.density) {
+                    indicatorTop until (indicatorTop + IndicatorSize.toPx()).toInt()
+                }
 
             val pixel = toPixelMap()
             for (x in 0 until width) {
                 for (y in 0 until height) {
-                    val expectedColor = if (x in indicatorXRange && y in indicatorYRange) {
-                        Color.Black
-                    } else {
-                        Color.White
-                    }
+                    val expectedColor =
+                        if (x in indicatorXRange && y in indicatorYRange) {
+                            Color.Black
+                        } else {
+                            Color.White
+                        }
                     pixel.assertPixelColor(expectedColor, x, y)
                 }
             }
diff --git a/compose/material/material/src/androidInstrumentedTest/kotlin/androidx/compose/material/pullrefresh/PullRefreshStateTest.kt b/compose/material/material/src/androidInstrumentedTest/kotlin/androidx/compose/material/pullrefresh/PullRefreshStateTest.kt
index 01decee..5d6fcc4 100644
--- a/compose/material/material/src/androidInstrumentedTest/kotlin/androidx/compose/material/pullrefresh/PullRefreshStateTest.kt
+++ b/compose/material/material/src/androidInstrumentedTest/kotlin/androidx/compose/material/pullrefresh/PullRefreshStateTest.kt
@@ -52,8 +52,7 @@
 @OptIn(ExperimentalMaterialApi::class)
 class PullRefreshStateTest {
 
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
     private val pullRefreshNode = rule.onNodeWithTag(PullRefreshTag)
 
@@ -66,21 +65,15 @@
 
         rule.setContent {
             touchSlop = LocalViewConfiguration.current.touchSlop
-            val state = rememberPullRefreshState(
-                refreshing = false,
-                onRefresh = { refreshCount++ },
-                refreshThreshold = with(LocalDensity.current) { threshold.toDp() }
-            )
+            val state =
+                rememberPullRefreshState(
+                    refreshing = false,
+                    onRefresh = { refreshCount++ },
+                    refreshThreshold = with(LocalDensity.current) { threshold.toDp() }
+                )
 
-            Box(
-                Modifier
-                    .pullRefresh(state)
-                    .testTag(PullRefreshTag)) {
-                LazyColumn {
-                    items(100) {
-                        Text("item $it")
-                    }
-                }
+            Box(Modifier.pullRefresh(state).testTag(PullRefreshTag)) {
+                LazyColumn { items(100) { Text("item $it") } }
             }
         }
 
@@ -99,21 +92,15 @@
 
         rule.setContent {
             touchSlop = LocalViewConfiguration.current.touchSlop
-            state = rememberPullRefreshState(
-                refreshing = false,
-                onRefresh = { refreshCount++ },
-                refreshThreshold = with(LocalDensity.current) { threshold.toDp() }
-            )
+            state =
+                rememberPullRefreshState(
+                    refreshing = false,
+                    onRefresh = { refreshCount++ },
+                    refreshThreshold = with(LocalDensity.current) { threshold.toDp() }
+                )
 
-            Box(
-                Modifier
-                    .pullRefresh(state)
-                    .testTag(PullRefreshTag)) {
-                LazyColumn {
-                    items(100) {
-                        Text("item $it")
-                    }
-                }
+            Box(Modifier.pullRefresh(state).testTag(PullRefreshTag)) {
+                LazyColumn { items(100) { Text("item $it") } }
             }
         }
 
@@ -142,25 +129,19 @@
         val threshold = 400f
 
         rule.setContent {
-            state = rememberPullRefreshState(
-                refreshing = false,
-                onRefresh = {
-                    state.setRefreshing(true)
-                    refreshCount++
-                    state.setRefreshing(false)
-                },
-                refreshThreshold = with(LocalDensity.current) { threshold.toDp() }
-            )
+            state =
+                rememberPullRefreshState(
+                    refreshing = false,
+                    onRefresh = {
+                        state.setRefreshing(true)
+                        refreshCount++
+                        state.setRefreshing(false)
+                    },
+                    refreshThreshold = with(LocalDensity.current) { threshold.toDp() }
+                )
 
-            Box(
-                Modifier
-                    .pullRefresh(state)
-                    .testTag(PullRefreshTag)) {
-                LazyColumn {
-                    items(100) {
-                        Text("item $it")
-                    }
-                }
+            Box(Modifier.pullRefresh(state).testTag(PullRefreshTag)) {
+                LazyColumn { items(100) { Text("item $it") } }
             }
         }
 
@@ -178,9 +159,8 @@
         rule.runOnIdle {
             val adjustedDistancePulled = (2 * threshold + 1f) / 2 // Account for PullMultiplier.
             assertThat(state.progress).isEqualTo(adjustedDistancePulled / threshold)
-            assertThat(state.position).isEqualTo(
-                calculateIndicatorPosition(adjustedDistancePulled, threshold)
-            )
+            assertThat(state.position)
+                .isEqualTo(calculateIndicatorPosition(adjustedDistancePulled, threshold))
             assertThat(refreshCount).isEqualTo(0)
         }
 
@@ -200,21 +180,15 @@
         val threshold = 400f
 
         rule.setContent {
-            state = rememberPullRefreshState(
-                refreshing = false,
-                onRefresh = { refreshCount++ },
-                refreshThreshold = with(LocalDensity.current) { threshold.toDp() }
-            )
+            state =
+                rememberPullRefreshState(
+                    refreshing = false,
+                    onRefresh = { refreshCount++ },
+                    refreshThreshold = with(LocalDensity.current) { threshold.toDp() }
+                )
 
-            Box(
-                Modifier
-                    .pullRefresh(state)
-                    .testTag(PullRefreshTag)) {
-                LazyColumn {
-                    items(100) {
-                        Text("item $it")
-                    }
-                }
+            Box(Modifier.pullRefresh(state).testTag(PullRefreshTag)) {
+                LazyColumn { items(100) { Text("item $it") } }
             }
         }
 
@@ -231,9 +205,8 @@
         rule.runOnIdle {
             val adjustedDistancePulled = 3 * threshold / 2 // Account for PullMultiplier.
             assertThat(state.progress).isEqualTo(1.5f)
-            assertThat(state.position).isEqualTo(
-                calculateIndicatorPosition(adjustedDistancePulled, threshold)
-            )
+            assertThat(state.position)
+                .isEqualTo(calculateIndicatorPosition(adjustedDistancePulled, threshold))
             assertThat(refreshCount).isEqualTo(0)
         }
 
@@ -252,21 +225,15 @@
         val threshold = 400f
 
         rule.setContent {
-            state = rememberPullRefreshState(
-                refreshing = false,
-                onRefresh = { refreshCount++ },
-                refreshThreshold = with(LocalDensity.current) { threshold.toDp() }
-            )
+            state =
+                rememberPullRefreshState(
+                    refreshing = false,
+                    onRefresh = { refreshCount++ },
+                    refreshThreshold = with(LocalDensity.current) { threshold.toDp() }
+                )
 
-            Box(
-                Modifier
-                    .pullRefresh(state)
-                    .testTag(PullRefreshTag)) {
-                LazyColumn {
-                    items(100) {
-                        Text("item $it")
-                    }
-                }
+            Box(Modifier.pullRefresh(state).testTag(PullRefreshTag)) {
+                LazyColumn { items(100) { Text("item $it") } }
             }
         }
 
@@ -295,22 +262,16 @@
         val refreshingOffset = 200f
 
         rule.setContent {
-            state = rememberPullRefreshState(
-                refreshing = false,
-                onRefresh = { refreshCount++ },
-                refreshThreshold = with(LocalDensity.current) { threshold.toDp() },
-                refreshingOffset = with(LocalDensity.current) { refreshingOffset.toDp() }
-            )
+            state =
+                rememberPullRefreshState(
+                    refreshing = false,
+                    onRefresh = { refreshCount++ },
+                    refreshThreshold = with(LocalDensity.current) { threshold.toDp() },
+                    refreshingOffset = with(LocalDensity.current) { refreshingOffset.toDp() }
+                )
 
-            Box(
-                Modifier
-                    .pullRefresh(state)
-                    .testTag(PullRefreshTag)) {
-                LazyColumn {
-                    items(100) {
-                        Text("item $it")
-                    }
-                }
+            Box(Modifier.pullRefresh(state).testTag(PullRefreshTag)) {
+                LazyColumn { items(100) { Text("item $it") } }
             }
         }
 
@@ -352,21 +313,15 @@
 
         rule.setContent {
             touchSlop = LocalViewConfiguration.current.touchSlop
-            state = rememberPullRefreshState(
-                refreshing = false,
-                onRefresh = { refreshCount++ },
-                refreshThreshold = with(LocalDensity.current) { threshold.toDp() }
-            )
+            state =
+                rememberPullRefreshState(
+                    refreshing = false,
+                    onRefresh = { refreshCount++ },
+                    refreshThreshold = with(LocalDensity.current) { threshold.toDp() }
+                )
 
-            Box(
-                Modifier
-                    .pullRefresh(state)
-                    .testTag(PullRefreshTag)) {
-                LazyColumn {
-                    items(100) {
-                        Text("item $it")
-                    }
-                }
+            Box(Modifier.pullRefresh(state).testTag(PullRefreshTag)) {
+                LazyColumn { items(100) { Text("item $it") } }
             }
         }
 
@@ -394,12 +349,13 @@
         val refreshThreshold = mutableStateOf(initialThreshold)
 
         rule.setContent {
-            state = rememberPullRefreshState(
-                refreshing = true,
-                onRefresh = { },
-                refreshThreshold = with(LocalDensity.current) { refreshThreshold.value.toDp() },
-                refreshingOffset = with(LocalDensity.current) { refreshingOffset.value.toDp() }
-            )
+            state =
+                rememberPullRefreshState(
+                    refreshing = true,
+                    onRefresh = {},
+                    refreshThreshold = with(LocalDensity.current) { refreshThreshold.value.toDp() },
+                    refreshingOffset = with(LocalDensity.current) { refreshingOffset.value.toDp() }
+                )
         }
 
         rule.runOnIdle {
@@ -424,19 +380,14 @@
         val connection = object : NestedScrollConnection {}
 
         rule.setContent {
-            state = rememberPullRefreshState(
-                refreshing = false,
-                onRefresh = { },
-                refreshThreshold = with(LocalDensity.current) { refreshThreshold.toDp() }
-            )
-            Box(
-                Modifier
-                    .size(200.dp)
-                    .pullRefresh(state)) {
-                Box(
-                    Modifier
-                        .size(100.dp)
-                        .nestedScroll(connection, dispatcher))
+            state =
+                rememberPullRefreshState(
+                    refreshing = false,
+                    onRefresh = {},
+                    refreshThreshold = with(LocalDensity.current) { refreshThreshold.toDp() }
+                )
+            Box(Modifier.size(200.dp).pullRefresh(state)) {
+                Box(Modifier.size(100.dp).nestedScroll(connection, dispatcher))
             }
         }
 
@@ -473,19 +424,14 @@
         val connection = object : NestedScrollConnection {}
 
         rule.setContent {
-            state = rememberPullRefreshState(
-                refreshing = true,
-                onRefresh = { },
-                refreshingOffset = with(LocalDensity.current) { refreshingOffset.toDp() }
-            )
-            Box(
-                Modifier
-                    .size(200.dp)
-                    .pullRefresh(state)) {
-                Box(
-                    Modifier
-                        .size(100.dp)
-                        .nestedScroll(connection, dispatcher))
+            state =
+                rememberPullRefreshState(
+                    refreshing = true,
+                    onRefresh = {},
+                    refreshingOffset = with(LocalDensity.current) { refreshingOffset.toDp() }
+                )
+            Box(Modifier.size(200.dp).pullRefresh(state)) {
+                Box(Modifier.size(100.dp).nestedScroll(connection, dispatcher))
             }
         }
 
@@ -510,19 +456,14 @@
         val connection = object : NestedScrollConnection {}
 
         rule.setContent {
-            state = rememberPullRefreshState(
-                refreshing = false,
-                onRefresh = { },
-                refreshThreshold = with(LocalDensity.current) { refreshThreshold.toDp() }
-            )
-            Box(
-                Modifier
-                    .size(200.dp)
-                    .pullRefresh(state)) {
-                Box(
-                    Modifier
-                        .size(100.dp)
-                        .nestedScroll(connection, dispatcher))
+            state =
+                rememberPullRefreshState(
+                    refreshing = false,
+                    onRefresh = {},
+                    refreshThreshold = with(LocalDensity.current) { refreshThreshold.toDp() }
+                )
+            Box(Modifier.size(200.dp).pullRefresh(state)) {
+                Box(Modifier.size(100.dp).nestedScroll(connection, dispatcher))
             }
         }
 
@@ -559,19 +500,14 @@
         val connection = object : NestedScrollConnection {}
 
         rule.setContent {
-            state = rememberPullRefreshState(
-                refreshing = true,
-                onRefresh = { },
-                refreshingOffset = with(LocalDensity.current) { refreshingOffset.toDp() }
-            )
-            Box(
-                Modifier
-                    .size(200.dp)
-                    .pullRefresh(state)) {
-                Box(
-                    Modifier
-                        .size(100.dp)
-                        .nestedScroll(connection, dispatcher))
+            state =
+                rememberPullRefreshState(
+                    refreshing = true,
+                    onRefresh = {},
+                    refreshingOffset = with(LocalDensity.current) { refreshingOffset.toDp() }
+                )
+            Box(Modifier.size(200.dp).pullRefresh(state)) {
+                Box(Modifier.size(100.dp).nestedScroll(connection, dispatcher))
             }
         }
 
@@ -596,19 +532,14 @@
         val connection = object : NestedScrollConnection {}
 
         rule.setContent {
-            state = rememberPullRefreshState(
-                refreshing = false,
-                onRefresh = { },
-                refreshThreshold = with(LocalDensity.current) { refreshThreshold.toDp() }
-            )
-            Box(
-                Modifier
-                    .size(200.dp)
-                    .pullRefresh(state)) {
-                Box(
-                    Modifier
-                        .size(100.dp)
-                        .nestedScroll(connection, dispatcher))
+            state =
+                rememberPullRefreshState(
+                    refreshing = false,
+                    onRefresh = {},
+                    refreshThreshold = with(LocalDensity.current) { refreshThreshold.toDp() }
+                )
+            Box(Modifier.size(200.dp).pullRefresh(state)) {
+                Box(Modifier.size(100.dp).nestedScroll(connection, dispatcher))
             }
         }
 
@@ -616,11 +547,12 @@
         val dragUpOffset = Offset(0f, -100f)
 
         rule.runOnIdle {
-            val postConsumed = dispatcher.dispatchPostScroll(
-                Offset.Zero,
-                dragUpOffset,
-                NestedScrollSource.UserInput
-            )
+            val postConsumed =
+                dispatcher.dispatchPostScroll(
+                    Offset.Zero,
+                    dragUpOffset,
+                    NestedScrollSource.UserInput
+                )
             // We should ignore negative delta in postscroll, so we should consume nothing
             assertThat(postConsumed).isEqualTo(Offset.Zero)
             assertThat(state.position).isEqualTo(0f)
@@ -631,11 +563,12 @@
 
         rule.runOnIdle {
             assertThat(state.position).isEqualTo(100f /* 200 / 2 for drag multiplier */)
-            val postConsumed = dispatcher.dispatchPostScroll(
-                Offset.Zero,
-                dragUpOffset,
-                NestedScrollSource.UserInput
-            )
+            val postConsumed =
+                dispatcher.dispatchPostScroll(
+                    Offset.Zero,
+                    dragUpOffset,
+                    NestedScrollSource.UserInput
+                )
             // We should ignore negative delta in postscroll, so we should consume nothing
             assertThat(postConsumed).isEqualTo(Offset.Zero)
             assertThat(state.position).isEqualTo(100f /* 200 / 2 for drag multiplier */)
@@ -651,19 +584,14 @@
         val connection = object : NestedScrollConnection {}
 
         rule.setContent {
-            state = rememberPullRefreshState(
-                refreshing = true,
-                onRefresh = { },
-                refreshingOffset = with(LocalDensity.current) { refreshingOffset.toDp() }
-            )
-            Box(
-                Modifier
-                    .size(200.dp)
-                    .pullRefresh(state)) {
-                Box(
-                    Modifier
-                        .size(100.dp)
-                        .nestedScroll(connection, dispatcher))
+            state =
+                rememberPullRefreshState(
+                    refreshing = true,
+                    onRefresh = {},
+                    refreshingOffset = with(LocalDensity.current) { refreshingOffset.toDp() }
+                )
+            Box(Modifier.size(200.dp).pullRefresh(state)) {
+                Box(Modifier.size(100.dp).nestedScroll(connection, dispatcher))
             }
         }
 
@@ -671,11 +599,12 @@
         val dragUpOffset = Offset(0f, -100f)
 
         rule.runOnIdle {
-            val postConsumed = dispatcher.dispatchPostScroll(
-                Offset.Zero,
-                dragUpOffset,
-                NestedScrollSource.UserInput
-            )
+            val postConsumed =
+                dispatcher.dispatchPostScroll(
+                    Offset.Zero,
+                    dragUpOffset,
+                    NestedScrollSource.UserInput
+                )
             // Pull refresh is refreshing, so we should consume nothing
             assertThat(postConsumed).isEqualTo(Offset.Zero)
             assertThat(state.position).isEqualTo(refreshingOffset)
@@ -691,19 +620,14 @@
         val connection = object : NestedScrollConnection {}
 
         rule.setContent {
-            state = rememberPullRefreshState(
-                refreshing = false,
-                onRefresh = { },
-                refreshThreshold = with(LocalDensity.current) { refreshThreshold.toDp() }
-            )
-            Box(
-                Modifier
-                    .size(200.dp)
-                    .pullRefresh(state)) {
-                Box(
-                    Modifier
-                        .size(100.dp)
-                        .nestedScroll(connection, dispatcher))
+            state =
+                rememberPullRefreshState(
+                    refreshing = false,
+                    onRefresh = {},
+                    refreshThreshold = with(LocalDensity.current) { refreshThreshold.toDp() }
+                )
+            Box(Modifier.size(200.dp).pullRefresh(state)) {
+                Box(Modifier.size(100.dp).nestedScroll(connection, dispatcher))
             }
         }
 
@@ -711,11 +635,12 @@
         val dragUpOffset = Offset(0f, 100f)
 
         rule.runOnIdle {
-            val postConsumed = dispatcher.dispatchPostScroll(
-                Offset.Zero,
-                dragUpOffset,
-                NestedScrollSource.UserInput
-            )
+            val postConsumed =
+                dispatcher.dispatchPostScroll(
+                    Offset.Zero,
+                    dragUpOffset,
+                    NestedScrollSource.UserInput
+                )
             // We should consume all the delta
             assertThat(postConsumed).isEqualTo(dragUpOffset)
             assertThat(state.position).isEqualTo(50f /* 100 / 2 for drag multiplier */)
@@ -726,11 +651,12 @@
 
         rule.runOnIdle {
             assertThat(state.position).isEqualTo(150f /* (100 + 200) / 2 for drag multiplier */)
-            val postConsumed = dispatcher.dispatchPostScroll(
-                Offset.Zero,
-                dragUpOffset,
-                NestedScrollSource.UserInput
-            )
+            val postConsumed =
+                dispatcher.dispatchPostScroll(
+                    Offset.Zero,
+                    dragUpOffset,
+                    NestedScrollSource.UserInput
+                )
             // We should consume all the delta again
             assertThat(postConsumed).isEqualTo(dragUpOffset)
             assertThat(state.position)
@@ -747,19 +673,14 @@
         val connection = object : NestedScrollConnection {}
 
         rule.setContent {
-            state = rememberPullRefreshState(
-                refreshing = true,
-                onRefresh = { },
-                refreshingOffset = with(LocalDensity.current) { refreshingOffset.toDp() }
-            )
-            Box(
-                Modifier
-                    .size(200.dp)
-                    .pullRefresh(state)) {
-                Box(
-                    Modifier
-                        .size(100.dp)
-                        .nestedScroll(connection, dispatcher))
+            state =
+                rememberPullRefreshState(
+                    refreshing = true,
+                    onRefresh = {},
+                    refreshingOffset = with(LocalDensity.current) { refreshingOffset.toDp() }
+                )
+            Box(Modifier.size(200.dp).pullRefresh(state)) {
+                Box(Modifier.size(100.dp).nestedScroll(connection, dispatcher))
             }
         }
 
@@ -767,11 +688,12 @@
         val dragUpOffset = Offset(0f, 100f)
 
         rule.runOnIdle {
-            val postConsumed = dispatcher.dispatchPostScroll(
-                Offset.Zero,
-                dragUpOffset,
-                NestedScrollSource.UserInput
-            )
+            val postConsumed =
+                dispatcher.dispatchPostScroll(
+                    Offset.Zero,
+                    dragUpOffset,
+                    NestedScrollSource.UserInput
+                )
             // Pull refresh is refreshing, so we should consume nothing
             assertThat(postConsumed).isEqualTo(Offset.Zero)
             assertThat(state.position).isEqualTo(refreshingOffset)
@@ -788,19 +710,14 @@
         val connection = object : NestedScrollConnection {}
 
         rule.setContent {
-            state = rememberPullRefreshState(
-                refreshing = false,
-                onRefresh = { onRefreshCalled = true },
-                refreshThreshold = with(LocalDensity.current) { refreshThreshold.toDp() }
-            )
-            Box(
-                Modifier
-                    .size(200.dp)
-                    .pullRefresh(state)) {
-                Box(
-                    Modifier
-                        .size(100.dp)
-                        .nestedScroll(connection, dispatcher))
+            state =
+                rememberPullRefreshState(
+                    refreshing = false,
+                    onRefresh = { onRefreshCalled = true },
+                    refreshThreshold = with(LocalDensity.current) { refreshThreshold.toDp() }
+                )
+            Box(Modifier.size(200.dp).pullRefresh(state)) {
+                Box(Modifier.size(100.dp).nestedScroll(connection, dispatcher))
             }
         }
 
@@ -815,9 +732,7 @@
             assertThat(onRefreshCalled).isFalse()
         }
 
-        rule.runOnIdle {
-            assertThat(state.position).isEqualTo(0f)
-        }
+        rule.runOnIdle { assertThat(state.position).isEqualTo(0f) }
 
         // Pull the state but not past the threshold
         state.onPull(refreshThreshold / 2f)
@@ -870,19 +785,14 @@
         val connection = object : NestedScrollConnection {}
 
         rule.setContent {
-            state = rememberPullRefreshState(
-                refreshing = true,
-                onRefresh = {},
-                refreshingOffset = with(LocalDensity.current) { refreshingOffset.toDp() }
-            )
-            Box(
-                Modifier
-                    .size(200.dp)
-                    .pullRefresh(state)) {
-                Box(
-                    Modifier
-                        .size(100.dp)
-                        .nestedScroll(connection, dispatcher))
+            state =
+                rememberPullRefreshState(
+                    refreshing = true,
+                    onRefresh = {},
+                    refreshingOffset = with(LocalDensity.current) { refreshingOffset.toDp() }
+                )
+            Box(Modifier.size(200.dp).pullRefresh(state)) {
+                Box(Modifier.size(100.dp).nestedScroll(connection, dispatcher))
             }
         }
 
@@ -912,19 +822,14 @@
         val connection = object : NestedScrollConnection {}
 
         rule.setContent {
-            state = rememberPullRefreshState(
-                refreshing = false,
-                onRefresh = { onRefreshCalled = true },
-                refreshThreshold = with(LocalDensity.current) { refreshThreshold.toDp() }
-            )
-            Box(
-                Modifier
-                    .size(200.dp)
-                    .pullRefresh(state)) {
-                Box(
-                    Modifier
-                        .size(100.dp)
-                        .nestedScroll(connection, dispatcher))
+            state =
+                rememberPullRefreshState(
+                    refreshing = false,
+                    onRefresh = { onRefreshCalled = true },
+                    refreshThreshold = with(LocalDensity.current) { refreshThreshold.toDp() }
+                )
+            Box(Modifier.size(200.dp).pullRefresh(state)) {
+                Box(Modifier.size(100.dp).nestedScroll(connection, dispatcher))
             }
         }
 
@@ -939,9 +844,7 @@
             assertThat(onRefreshCalled).isFalse()
         }
 
-        rule.runOnIdle {
-            assertThat(state.position).isEqualTo(0f)
-        }
+        rule.runOnIdle { assertThat(state.position).isEqualTo(0f) }
 
         // Pull the state but not past the threshold
         state.onPull(refreshThreshold / 2f)
@@ -994,19 +897,14 @@
         val connection = object : NestedScrollConnection {}
 
         rule.setContent {
-            state = rememberPullRefreshState(
-                refreshing = true,
-                onRefresh = {},
-                refreshingOffset = with(LocalDensity.current) { refreshingOffset.toDp() }
-            )
-            Box(
-                Modifier
-                    .size(200.dp)
-                    .pullRefresh(state)) {
-                Box(
-                    Modifier
-                        .size(100.dp)
-                        .nestedScroll(connection, dispatcher))
+            state =
+                rememberPullRefreshState(
+                    refreshing = true,
+                    onRefresh = {},
+                    refreshingOffset = with(LocalDensity.current) { refreshingOffset.toDp() }
+                )
+            Box(Modifier.size(200.dp).pullRefresh(state)) {
+                Box(Modifier.size(100.dp).nestedScroll(connection, dispatcher))
             }
         }
 
@@ -1036,19 +934,14 @@
         val connection = object : NestedScrollConnection {}
 
         rule.setContent {
-            state = rememberPullRefreshState(
-                refreshing = false,
-                onRefresh = { onRefreshCalled = true },
-                refreshThreshold = with(LocalDensity.current) { refreshThreshold.toDp() }
-            )
-            Box(
-                Modifier
-                    .size(200.dp)
-                    .pullRefresh(state)) {
-                Box(
-                    Modifier
-                        .size(100.dp)
-                        .nestedScroll(connection, dispatcher))
+            state =
+                rememberPullRefreshState(
+                    refreshing = false,
+                    onRefresh = { onRefreshCalled = true },
+                    refreshThreshold = with(LocalDensity.current) { refreshThreshold.toDp() }
+                )
+            Box(Modifier.size(200.dp).pullRefresh(state)) {
+                Box(Modifier.size(100.dp).nestedScroll(connection, dispatcher))
             }
         }
 
@@ -1072,9 +965,7 @@
             assertThat(onRefreshCalled).isFalse()
         }
 
-        rule.runOnIdle {
-            assertThat(state.position).isEqualTo(0f)
-        }
+        rule.runOnIdle { assertThat(state.position).isEqualTo(0f) }
 
         // Pull the state but not past the threshold
         state.onPull(refreshThreshold / 2f)
@@ -1130,19 +1021,18 @@
         }
     }
 
-    /**
-     * Taken from the private function of the same name in [PullRefreshState].
-     */
-    private fun calculateIndicatorPosition(distance: Float, threshold: Float): Float = when {
-        distance <= threshold -> distance
-        else -> {
-            val overshootPercent = abs(distance / threshold) - 1.0f
-            val linearTension = overshootPercent.coerceIn(0f, 2f)
-            val tensionPercent = linearTension - linearTension.pow(2) / 4
-            val extraOffset = threshold * tensionPercent
-            threshold + extraOffset
+    /** Taken from the private function of the same name in [PullRefreshState]. */
+    private fun calculateIndicatorPosition(distance: Float, threshold: Float): Float =
+        when {
+            distance <= threshold -> distance
+            else -> {
+                val overshootPercent = abs(distance / threshold) - 1.0f
+                val linearTension = overshootPercent.coerceIn(0f, 2f)
+                val tensionPercent = linearTension - linearTension.pow(2) / 4
+                val extraOffset = threshold * tensionPercent
+                threshold + extraOffset
+            }
         }
-    }
 }
 
 private const val PullRefreshTag = "PullRefresh"
diff --git a/compose/material/material/src/androidInstrumentedTest/kotlin/androidx/compose/material/pullrefresh/PullRefreshTest.kt b/compose/material/material/src/androidInstrumentedTest/kotlin/androidx/compose/material/pullrefresh/PullRefreshTest.kt
index 260d45f..b004185 100644
--- a/compose/material/material/src/androidInstrumentedTest/kotlin/androidx/compose/material/pullrefresh/PullRefreshTest.kt
+++ b/compose/material/material/src/androidInstrumentedTest/kotlin/androidx/compose/material/pullrefresh/PullRefreshTest.kt
@@ -40,8 +40,7 @@
 @OptIn(ExperimentalMaterialApi::class)
 class PullRefreshTest {
 
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
     private val pullRefreshNode = rule.onNodeWithTag(PullRefreshTag)
 
@@ -57,9 +56,7 @@
         val touchSlop = setPullRefreshAndReturnSlop(::onPull) { 0f }
         val pullAmount = 400f
 
-        pullRefreshNode.performTouchInput {
-            swipeDown(endY = pullAmount + touchSlop)
-        }
+        pullRefreshNode.performTouchInput { swipeDown(endY = pullAmount + touchSlop) }
 
         rule.runOnIdle { assertThat(distancePulled).isEqualTo(pullAmount) }
     }
@@ -68,7 +65,10 @@
     fun onRelease_calledWhen_pullEnds() {
         var releaseCount = 0
 
-        setPullRefreshAndReturnSlop({ it }) { releaseCount++; 0f }
+        setPullRefreshAndReturnSlop({ it }) {
+            releaseCount++
+            0f
+        }
 
         pullRefreshNode.performTouchInput {
             down(Offset.Zero)
@@ -96,7 +96,11 @@
             return consumed
         }
 
-        val touchSlop = setPullRefreshAndReturnSlop(::onPull) { releaseCount++; 0f }
+        val touchSlop =
+            setPullRefreshAndReturnSlop(::onPull) {
+                releaseCount++
+                0f
+            }
 
         pullRefreshNode.performTouchInput {
             down(Offset(0f, 800f))
@@ -109,9 +113,7 @@
             assertThat(releaseCount).isEqualTo(0)
         }
 
-        pullRefreshNode.performTouchInput {
-            moveBy(Offset(0f, 200f))
-        }
+        pullRefreshNode.performTouchInput { moveBy(Offset(0f, 200f)) }
 
         rule.runOnIdle {
             assertThat(deltaGiven).isEqualTo(-400f)
@@ -119,9 +121,7 @@
             assertThat(releaseCount).isEqualTo(0)
         }
 
-        pullRefreshNode.performTouchInput {
-            moveBy(Offset(0f, 200f))
-        }
+        pullRefreshNode.performTouchInput { moveBy(Offset(0f, 200f)) }
 
         rule.runOnIdle {
             assertThat(deltaGiven).isEqualTo(-400f)
@@ -155,7 +155,11 @@
             return consumed
         }
 
-        val touchSlop = setPullRefreshAndReturnSlop(::onPull) { releaseCount++; 0f }
+        val touchSlop =
+            setPullRefreshAndReturnSlop(::onPull) {
+                releaseCount++
+                0f
+            }
 
         pullRefreshNode.performTouchInput {
             down(Offset.Zero)
@@ -168,9 +172,7 @@
             assertThat(releaseCount).isEqualTo(0)
         }
 
-        pullRefreshNode.performTouchInput {
-            moveBy(Offset(0f, -200f))
-        }
+        pullRefreshNode.performTouchInput { moveBy(Offset(0f, -200f)) }
 
         rule.runOnIdle {
             assertThat(deltaGiven).isEqualTo(200f)
@@ -178,9 +180,7 @@
             assertThat(releaseCount).isEqualTo(0)
         }
 
-        pullRefreshNode.performTouchInput {
-            moveBy(Offset(0f, -200f))
-        }
+        pullRefreshNode.performTouchInput { moveBy(Offset(0f, -200f)) }
 
         rule.runOnIdle {
             assertThat(deltaGiven).isEqualTo(0f)
@@ -207,15 +207,8 @@
         var slop = 0f
         rule.setContent {
             slop = LocalViewConfiguration.current.touchSlop
-            Box(
-                Modifier
-                    .pullRefresh({ onPull(it) }, { onRelease(it) })
-                    .testTag(PullRefreshTag)) {
-                LazyColumn {
-                    items(100) {
-                        Text("item $it")
-                    }
-                }
+            Box(Modifier.pullRefresh({ onPull(it) }, { onRelease(it) }).testTag(PullRefreshTag)) {
+                LazyColumn { items(100) { Text("item $it") } }
             }
         }
         return slop
diff --git a/compose/material/material/src/androidInstrumentedTest/kotlin/androidx/compose/material/textfield/OutlinedTextFieldScreenshotTest.kt b/compose/material/material/src/androidInstrumentedTest/kotlin/androidx/compose/material/textfield/OutlinedTextFieldScreenshotTest.kt
index 4de9ec8..d16fa1b 100644
--- a/compose/material/material/src/androidInstrumentedTest/kotlin/androidx/compose/material/textfield/OutlinedTextFieldScreenshotTest.kt
+++ b/compose/material/material/src/androidInstrumentedTest/kotlin/androidx/compose/material/textfield/OutlinedTextFieldScreenshotTest.kt
@@ -67,19 +67,18 @@
 class OutlinedTextFieldScreenshotTest {
     private val TextFieldTag = "OutlinedTextField"
 
-    private val longText = TextFieldValue(
-        "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do " +
-            "eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam," +
-            " quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. " +
-            "Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu " +
-            "fugiat nulla pariatur."
-    )
+    private val longText =
+        TextFieldValue(
+            "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do " +
+                "eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam," +
+                " quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. " +
+                "Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu " +
+                "fugiat nulla pariatur."
+        )
 
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
-    @get:Rule
-    val screenshotRule = AndroidXScreenshotTestRule(GOLDEN_MATERIAL)
+    @get:Rule val screenshotRule = AndroidXScreenshotTestRule(GOLDEN_MATERIAL)
 
     @Test
     fun outlinedTextField_withInput() {
@@ -204,9 +203,8 @@
                 value = TextFieldValue(text = text, selection = TextRange(text.length)),
                 onValueChange = {},
                 label = { Text("Label") },
-                modifier = Modifier.requiredHeight(300.dp)
-                    .requiredWidth(280.dp)
-                    .testTag(TextFieldTag)
+                modifier =
+                    Modifier.requiredHeight(300.dp).requiredWidth(280.dp).testTag(TextFieldTag)
             )
         }
 
@@ -220,9 +218,8 @@
             OutlinedTextField(
                 value = TextFieldValue(text = text, selection = TextRange(text.length)),
                 onValueChange = {},
-                modifier = Modifier.requiredHeight(300.dp)
-                    .requiredWidth(280.dp)
-                    .testTag(TextFieldTag)
+                modifier =
+                    Modifier.requiredHeight(300.dp).requiredWidth(280.dp).testTag(TextFieldTag)
             )
         }
 
@@ -237,9 +234,8 @@
                 onValueChange = {},
                 label = { Text("Label") },
                 placeholder = { Text("placeholder") },
-                modifier = Modifier.requiredHeight(300.dp)
-                    .requiredWidth(280.dp)
-                    .testTag(TextFieldTag)
+                modifier =
+                    Modifier.requiredHeight(300.dp).requiredWidth(280.dp).testTag(TextFieldTag)
             )
         }
 
@@ -255,9 +251,8 @@
                 value = "",
                 onValueChange = {},
                 placeholder = { Text("placeholder") },
-                modifier = Modifier.requiredHeight(300.dp)
-                    .requiredWidth(280.dp)
-                    .testTag(TextFieldTag)
+                modifier =
+                    Modifier.requiredHeight(300.dp).requiredWidth(280.dp).testTag(TextFieldTag)
             )
         }
 
@@ -273,9 +268,8 @@
                 value = "",
                 onValueChange = {},
                 label = { Text("Label") },
-                modifier = Modifier.requiredHeight(300.dp)
-                    .requiredWidth(280.dp)
-                    .testTag(TextFieldTag)
+                modifier =
+                    Modifier.requiredHeight(300.dp).requiredWidth(280.dp).testTag(TextFieldTag)
             )
         }
 
@@ -401,7 +395,7 @@
         rule.setMaterialContent {
             OutlinedTextField(
                 value = longText,
-                onValueChange = { },
+                onValueChange = {},
                 singleLine = true,
                 modifier = Modifier.testTag(TextFieldTag).requiredWidth(300.dp),
                 enabled = false
@@ -456,7 +450,7 @@
         rule.setMaterialContent {
             OutlinedTextField(
                 value = longText,
-                onValueChange = { },
+                onValueChange = {},
                 modifier = Modifier.testTag(TextFieldTag).requiredWidth(300.dp),
                 singleLine = true,
                 enabled = true,
@@ -509,7 +503,11 @@
 
     private fun SemanticsNodeInteraction.focus() {
         // split click into (down) and (move, up) to enforce a composition in between
-        this.performTouchInput { down(center) }.performTouchInput { move(); up() }
+        this.performTouchInput { down(center) }
+            .performTouchInput {
+                move()
+                up()
+            }
     }
 
     @Test
@@ -537,11 +535,12 @@
                 value = "Text",
                 onValueChange = {},
                 modifier = Modifier.width(300.dp).testTag(TextFieldTag),
-                label = if (makeLabelNull.value) {
-                    null
-                } else {
-                    { Text("Label") }
-                },
+                label =
+                    if (makeLabelNull.value) {
+                        null
+                    } else {
+                        { Text("Label") }
+                    },
             )
         }
 
@@ -585,7 +584,8 @@
     }
 
     private fun assertAgainstGolden(goldenIdentifier: String) {
-        rule.onNodeWithTag(TextFieldTag)
+        rule
+            .onNodeWithTag(TextFieldTag)
             .captureToImage()
             .assertAgainstGolden(screenshotRule, goldenIdentifier)
     }
diff --git a/compose/material/material/src/androidInstrumentedTest/kotlin/androidx/compose/material/textfield/OutlinedTextFieldTest.kt b/compose/material/material/src/androidInstrumentedTest/kotlin/androidx/compose/material/textfield/OutlinedTextFieldTest.kt
index 8a6a220..bdd1fc4 100644
--- a/compose/material/material/src/androidInstrumentedTest/kotlin/androidx/compose/material/textfield/OutlinedTextFieldTest.kt
+++ b/compose/material/material/src/androidInstrumentedTest/kotlin/androidx/compose/material/textfield/OutlinedTextFieldTest.kt
@@ -124,29 +124,27 @@
     private val IconColorAlpha = 0.54f
     private val TextfieldTag = "textField"
 
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
     @Test
     fun testOutlinedTextField_setSmallWidth() {
-        rule.setMaterialContentForSizeAssertions {
-            OutlinedTextField(
-                value = "input",
-                onValueChange = {},
-                modifier = Modifier.requiredWidth(40.dp)
-            )
-        }
+        rule
+            .setMaterialContentForSizeAssertions {
+                OutlinedTextField(
+                    value = "input",
+                    onValueChange = {},
+                    modifier = Modifier.requiredWidth(40.dp)
+                )
+            }
             .assertWidthIsEqualTo(40.dp)
     }
 
     @Test
     fun testOutlinedTextField_defaultWidth() {
-        rule.setMaterialContentForSizeAssertions {
-            OutlinedTextField(
-                value = "input",
-                onValueChange = {}
-            )
-        }
+        rule
+            .setMaterialContentForSizeAssertions {
+                OutlinedTextField(value = "input", onValueChange = {})
+            }
             .assertWidthIsEqualTo(ExpectedDefaultTextFieldWidth)
     }
 
@@ -161,16 +159,18 @@
         rule.setMaterialContent {
             Column {
                 OutlinedTextField(
-                    modifier = Modifier
-                        .testTag(textField1Tag)
-                        .onFocusChanged { textField1Focused = it.isFocused },
+                    modifier =
+                        Modifier.testTag(textField1Tag).onFocusChanged {
+                            textField1Focused = it.isFocused
+                        },
                     value = "input1",
                     onValueChange = {}
                 )
                 OutlinedTextField(
-                    modifier = Modifier
-                        .testTag(textField2Tag)
-                        .onFocusChanged { textField2Focused = it.isFocused },
+                    modifier =
+                        Modifier.testTag(textField2Tag).onFocusChanged {
+                            textField2Focused = it.isFocused
+                        },
                     value = "input2",
                     onValueChange = {}
                 )
@@ -198,9 +198,8 @@
         rule.setMaterialContent {
             Box {
                 OutlinedTextField(
-                    modifier = Modifier
-                        .testTag(TextfieldTag)
-                        .onFocusChanged { focused = it.isFocused },
+                    modifier =
+                        Modifier.testTag(TextfieldTag).onFocusChanged { focused = it.isFocused },
                     value = "input",
                     onValueChange = {}
                 )
@@ -208,13 +207,9 @@
         }
 
         // Click on (2, 2) which is a background area and outside input area
-        rule.onNodeWithTag(TextfieldTag).performTouchInput {
-            click(Offset(2f, 2f))
-        }
+        rule.onNodeWithTag(TextfieldTag).performTouchInput { click(Offset(2f, 2f)) }
 
-        rule.runOnIdleWithDensity {
-            assertThat(focused).isTrue()
-        }
+        rule.runOnIdleWithDensity { assertThat(focused).isTrue() }
     }
 
     @Test
@@ -223,31 +218,32 @@
         val density = Density(4f)
         rule.setMaterialContent {
             CompositionLocalProvider(LocalDensity provides density) {
-                Box(
-                    Modifier
-                        .testTag("box")
-                        .background(Color.Red)) {
+                Box(Modifier.testTag("box").background(Color.Red)) {
                     OutlinedTextField(
                         value = "",
                         onValueChange = {},
-                        colors = TextFieldDefaults.outlinedTextFieldColors(
-                            textColor = Color.White,
-                            unfocusedBorderColor = Color.White
-                        ),
+                        colors =
+                            TextFieldDefaults.outlinedTextFieldColors(
+                                textColor = Color.White,
+                                unfocusedBorderColor = Color.White
+                            ),
                         shape = RectangleShape
                     )
                 }
             }
         }
 
-        rule.onNodeWithTag("box").captureToImage().assertShape(
-            density = density,
-            horizontalPadding = 1.dp, // OutlinedTextField border thickness
-            verticalPadding = 1.dp, // OutlinedTextField border thickness
-            backgroundColor = Color.White, // OutlinedTextField border color
-            shapeColor = Color.Red, // Color of background as OutlinedTextField is transparent
-            shape = RectangleShape
-        )
+        rule
+            .onNodeWithTag("box")
+            .captureToImage()
+            .assertShape(
+                density = density,
+                horizontalPadding = 1.dp, // OutlinedTextField border thickness
+                verticalPadding = 1.dp, // OutlinedTextField border thickness
+                backgroundColor = Color.White, // OutlinedTextField border color
+                shapeColor = Color.Red, // Color of background as OutlinedTextField is transparent
+                shape = RectangleShape
+            )
     }
 
     @Test
@@ -263,10 +259,11 @@
                     label = {
                         Text(
                             text = "label",
-                            modifier = Modifier.onGloballyPositioned {
-                                labelPosition.value = it.positionInRoot()
-                                labelSize.value = it.size
-                            }
+                            modifier =
+                                Modifier.onGloballyPositioned {
+                                    labelPosition.value = it.positionInRoot()
+                                    labelSize.value = it.size
+                                }
                         )
                     }
                 )
@@ -278,14 +275,14 @@
             assertThat(labelSize.value).isNotNull()
             assertThat(labelSize.value?.height).isGreaterThan(0)
             assertThat(labelSize.value?.width).isGreaterThan(0)
-            assertThat(labelPosition.value?.x).isEqualTo(
-                ExpectedPadding.roundToPx().toFloat()
-            )
+            assertThat(labelPosition.value?.x).isEqualTo(ExpectedPadding.roundToPx().toFloat())
             // label is centered in 56.dp default container, plus additional 8.dp padding on top
             val minimumHeight = ExpectedMinimumTextFieldHeight.roundToPx()
-            assertThat(labelPosition.value?.y).isEqualTo(
-                ((minimumHeight - labelSize.value!!.height) / 2f).roundToInt() + 8.dp.roundToPx()
-            )
+            assertThat(labelPosition.value?.y)
+                .isEqualTo(
+                    ((minimumHeight - labelSize.value!!.height) / 2f).roundToInt() +
+                        8.dp.roundToPx()
+                )
         }
     }
 
@@ -302,9 +299,7 @@
                     label = {
                         Text(
                             text = "long long long long long long long long long long long long",
-                            modifier = Modifier.onGloballyPositioned {
-                                labelSize.value = it.size
-                            }
+                            modifier = Modifier.onGloballyPositioned { labelSize.value = it.size }
                         )
                     }
                 )
@@ -332,10 +327,11 @@
                     label = {
                         Text(
                             text = "label",
-                            modifier = Modifier.onGloballyPositioned {
-                                labelPosition.value = it.positionInRoot()
-                                labelSize.value = it.size
-                            }
+                            modifier =
+                                Modifier.onGloballyPositioned {
+                                    labelPosition.value = it.positionInRoot()
+                                    labelSize.value = it.size
+                                }
                         )
                     }
                 )
@@ -347,13 +343,10 @@
             assertThat(labelSize.value).isNotNull()
             assertThat(labelSize.value?.height).isGreaterThan(0)
             assertThat(labelSize.value?.width).isGreaterThan(0)
-            assertThat(labelPosition.value?.x).isEqualTo(
-                ExpectedPadding.roundToPx().toFloat()
-            )
+            assertThat(labelPosition.value?.x).isEqualTo(ExpectedPadding.roundToPx().toFloat())
             // label is aligned to the top with padding, plus additional 8.dp padding on top
-            assertThat(labelPosition.value?.y).isEqualTo(
-                TextFieldPadding.roundToPx() + 8.dp.roundToPx()
-            )
+            assertThat(labelPosition.value?.y)
+                .isEqualTo(TextFieldPadding.roundToPx() + 8.dp.roundToPx())
         }
     }
 
@@ -370,10 +363,11 @@
                 label = {
                     Text(
                         text = "label",
-                        modifier = Modifier.onGloballyPositioned {
-                            labelPosition.value = it.positionInRoot()
-                            labelSize.value = it.size
-                        }
+                        modifier =
+                            Modifier.onGloballyPositioned {
+                                labelPosition.value = it.positionInRoot()
+                                labelSize.value = it.size
+                            }
                     )
                 }
             )
@@ -388,9 +382,7 @@
             assertThat(labelSize.value?.height).isGreaterThan(0)
             assertThat(labelSize.value?.width).isGreaterThan(0)
             // label's top position
-            assertThat(labelPosition.value?.x).isEqualTo(
-                ExpectedPadding.roundToPx().toFloat()
-            )
+            assertThat(labelPosition.value?.x).isEqualTo(ExpectedPadding.roundToPx().toFloat())
 
             assertThat(labelPosition.value?.y).isEqualTo(getLabelPosition(labelSize))
         }
@@ -405,15 +397,11 @@
                 OutlinedTextField(
                     value = "",
                     onValueChange = {},
-                    modifier = Modifier
-                        .testTag(TextfieldTag)
-                        .requiredWidth(textFieldWidth),
+                    modifier = Modifier.testTag(TextfieldTag).requiredWidth(textFieldWidth),
                     label = {
                         Text(
                             text = "long long long long long long long long long long long long",
-                            modifier = Modifier.onGloballyPositioned {
-                                labelSize.value = it.size
-                            }
+                            modifier = Modifier.onGloballyPositioned { labelSize.value = it.size }
                         )
                     }
                 )
@@ -440,14 +428,9 @@
             OutlinedTextField(
                 value = "",
                 onValueChange = {},
-                modifier = Modifier
-                    .testTag(TextfieldTag)
-                    .onGloballyPositioned {
-                        tfSize.value = it.size
-                    },
-                label = {
-                    Box(Modifier.size(width = 50.dp, height = labelHeight))
-                },
+                modifier =
+                    Modifier.testTag(TextfieldTag).onGloballyPositioned { tfSize.value = it.size },
+                label = { Box(Modifier.size(width = 50.dp, height = labelHeight)) },
             )
         }
 
@@ -466,15 +449,12 @@
             OutlinedTextField(
                 value = "",
                 onValueChange = {},
-                modifier = Modifier
-                    .testTag(TextfieldTag)
-                    .requiredWidth(textFieldWidth),
+                modifier = Modifier.testTag(TextfieldTag).requiredWidth(textFieldWidth),
                 label = {
                     Text(
                         text = "Label",
-                        modifier = Modifier
-                            .width(labelRequestedWidth)
-                            .onGloballyPositioned {
+                        modifier =
+                            Modifier.width(labelRequestedWidth).onGloballyPositioned {
                                 labelSize.value = it.size
                             }
                     )
@@ -483,9 +463,7 @@
                     Icon(
                         Icons.Default.Favorite,
                         null,
-                        modifier = Modifier.onGloballyPositioned {
-                            trailingSize.value = it.size
-                        },
+                        modifier = Modifier.onGloballyPositioned { trailingSize.value = it.size },
                     )
                 },
             )
@@ -520,10 +498,11 @@
                 label = {
                     Text(
                         text = "label",
-                        modifier = Modifier.onGloballyPositioned {
-                            labelPosition.value = it.positionInRoot()
-                            labelSize.value = it.size
-                        }
+                        modifier =
+                            Modifier.onGloballyPositioned {
+                                labelPosition.value = it.positionInRoot()
+                                labelSize.value = it.size
+                            }
                     )
                 }
             )
@@ -535,9 +514,7 @@
             assertThat(labelSize.value?.height).isGreaterThan(0)
             assertThat(labelSize.value?.width).isGreaterThan(0)
             // label's top position
-            assertThat(labelPosition.value?.x).isEqualTo(
-                ExpectedPadding.roundToPx().toFloat()
-            )
+            assertThat(labelPosition.value?.x).isEqualTo(ExpectedPadding.roundToPx().toFloat())
 
             assertThat(labelPosition.value?.y).isEqualTo(getLabelPosition(labelSize))
         }
@@ -574,10 +551,11 @@
                     placeholder = {
                         Text(
                             text = "placeholder",
-                            modifier = Modifier.onGloballyPositioned {
-                                placeholderPosition.value = it.positionInRoot()
-                                placeholderSize.value = it.size
-                            }
+                            modifier =
+                                Modifier.onGloballyPositioned {
+                                    placeholderPosition.value = it.positionInRoot()
+                                    placeholderSize.value = it.size
+                                }
                         )
                     }
                 )
@@ -592,14 +570,12 @@
             assertThat(placeholderSize.value?.height).isGreaterThan(0)
             assertThat(placeholderSize.value?.width).isGreaterThan(0)
             // placeholder's position
-            assertThat(placeholderPosition.value?.x).isEqualTo(
-                ExpectedPadding.roundToPx().toFloat()
-            )
+            assertThat(placeholderPosition.value?.x)
+                .isEqualTo(ExpectedPadding.roundToPx().toFloat())
             // placeholder is centered in 56.dp default container,
             // plus additional 8.dp padding on top
-            assertThat(placeholderPosition.value?.y).isEqualTo(
-                TextFieldPadding.roundToPx() + 8.dp.roundToPx()
-            )
+            assertThat(placeholderPosition.value?.y)
+                .isEqualTo(TextFieldPadding.roundToPx() + 8.dp.roundToPx())
         }
     }
 
@@ -616,10 +592,11 @@
                     placeholder = {
                         Text(
                             text = "placeholder",
-                            modifier = Modifier.onGloballyPositioned {
-                                placeholderPosition.value = it.positionInRoot()
-                                placeholderSize.value = it.size
-                            }
+                            modifier =
+                                Modifier.onGloballyPositioned {
+                                    placeholderPosition.value = it.positionInRoot()
+                                    placeholderSize.value = it.size
+                                }
                         )
                     }
                 )
@@ -634,9 +611,8 @@
             assertThat(placeholderSize.value?.height).isGreaterThan(0)
             assertThat(placeholderSize.value?.width).isGreaterThan(0)
             // centered position
-            assertThat(placeholderPosition.value?.x).isEqualTo(
-                ExpectedPadding.roundToPx().toFloat()
-            )
+            assertThat(placeholderPosition.value?.x)
+                .isEqualTo(ExpectedPadding.roundToPx().toFloat())
             // placeholder is placed with fixed padding plus additional 8.dp padding on top
             assertThat(placeholderPosition.value?.y).isEqualTo(TextFieldPadding.roundToPx())
         }
@@ -655,10 +631,11 @@
                     placeholder = {
                         Text(
                             text = "placeholder",
-                            modifier = Modifier.onGloballyPositioned {
-                                placeholderPosition.value = it.positionInRoot()
-                                placeholderSize.value = it.size
-                            }
+                            modifier =
+                                Modifier.onGloballyPositioned {
+                                    placeholderPosition.value = it.positionInRoot()
+                                    placeholderSize.value = it.size
+                                }
                         )
                     }
                 )
@@ -683,18 +660,9 @@
                 onValueChange = {},
                 placeholder = {
                     Text("placeholder")
-                    assertThat(
-                        LocalContentColor.current.copy(
-                            alpha = LocalContentAlpha.current
-                        )
-                    )
-                        .isEqualTo(
-                            MaterialTheme.colors.onSurface.copy(
-                                alpha = 0.6f
-                            )
-                        )
-                    assertThat(LocalTextStyle.current)
-                        .isEqualTo(MaterialTheme.typography.subtitle1)
+                    assertThat(LocalContentColor.current.copy(alpha = LocalContentAlpha.current))
+                        .isEqualTo(MaterialTheme.colors.onSurface.copy(alpha = 0.6f))
+                    assertThat(LocalTextStyle.current).isEqualTo(MaterialTheme.typography.subtitle1)
                 }
             )
         }
@@ -749,27 +717,26 @@
                 // leading
                 assertThat(leadingSize.value).isEqualTo(IntSize(size.roundToPx(), size.roundToPx()))
                 assertThat(leadingPosition.value?.x).isEqualTo(IconPadding.roundToPx().toFloat())
-                assertThat(leadingPosition.value?.y).isEqualTo(
-                    ((minimumHeight - leadingSize.value!!.height) / 2f).roundToInt() +
-                        8.dp.roundToPx()
-                )
-                // trailing
-                assertThat(trailingSize.value).isEqualTo(
-                    IntSize(
-                        size.roundToPx(),
-                        size.roundToPx()
+                assertThat(leadingPosition.value?.y)
+                    .isEqualTo(
+                        ((minimumHeight - leadingSize.value!!.height) / 2f).roundToInt() +
+                            8.dp.roundToPx()
                     )
-                )
-                assertThat(trailingPosition.value?.x).isEqualTo(
-                    (
-                        textFieldWidth.roundToPx() - IconPadding.roundToPx() -
-                            trailingSize.value!!.width
-                        ).toFloat()
-                )
-                assertThat(trailingPosition.value?.y).isEqualTo(
-                    ((minimumHeight - trailingSize.value!!.height) / 2f).roundToInt() +
-                        8.dp.roundToPx()
-                )
+                // trailing
+                assertThat(trailingSize.value)
+                    .isEqualTo(IntSize(size.roundToPx(), size.roundToPx()))
+                assertThat(trailingPosition.value?.x)
+                    .isEqualTo(
+                        (textFieldWidth.roundToPx() -
+                                IconPadding.roundToPx() -
+                                trailingSize.value!!.width)
+                            .toFloat()
+                    )
+                assertThat(trailingPosition.value?.y)
+                    .isEqualTo(
+                        ((minimumHeight - trailingSize.value!!.height) / 2f).roundToInt() +
+                            8.dp.roundToPx()
+                    )
             }
         }
     }
@@ -790,26 +757,30 @@
                 OutlinedTextField(
                     value = "text",
                     onValueChange = {},
-                    modifier = Modifier
-                        .width(textFieldWidth)
-                        .height(textFieldHeight),
+                    modifier = Modifier.width(textFieldWidth).height(textFieldHeight),
                     leadingIcon = {
                         IconButton(
                             onClick = {},
-                            modifier = Modifier.onGloballyPositioned {
-                                leadingPosition = it.positionInRoot()
-                                leadingSize = it.size
-                            }
-                        ) { Icon(Icons.Default.Favorite, null) }
+                            modifier =
+                                Modifier.onGloballyPositioned {
+                                    leadingPosition = it.positionInRoot()
+                                    leadingSize = it.size
+                                }
+                        ) {
+                            Icon(Icons.Default.Favorite, null)
+                        }
                     },
                     trailingIcon = {
                         IconButton(
                             onClick = {},
-                            modifier = Modifier.onGloballyPositioned {
-                                trailingPosition = it.positionInRoot()
-                                trailingSize = it.size
-                            }
-                        ) { Icon(Icons.Default.Favorite, null) }
+                            modifier =
+                                Modifier.onGloballyPositioned {
+                                    trailingPosition = it.positionInRoot()
+                                    trailingSize = it.size
+                                }
+                        ) {
+                            Icon(Icons.Default.Favorite, null)
+                        }
                     }
                 )
             }
@@ -822,17 +793,18 @@
                 // leading
                 assertThat(leadingSize).isEqualTo(IntSize(size.roundToPx(), size.roundToPx()))
                 assertThat(leadingPosition?.x).isEqualTo(0f)
-                assertThat(leadingPosition?.y).isEqualTo(
-                    ((textFieldHeight.roundToPx() - leadingSize!!.height) / 2f).roundToInt()
-                )
+                assertThat(leadingPosition?.y)
+                    .isEqualTo(
+                        ((textFieldHeight.roundToPx() - leadingSize!!.height) / 2f).roundToInt()
+                    )
                 // trailing
                 assertThat(trailingSize).isEqualTo(IntSize(size.roundToPx(), size.roundToPx()))
-                assertThat(trailingPosition?.x).isEqualTo(
-                    (textFieldWidth.roundToPx() - trailingSize!!.width).toFloat()
-                )
-                assertThat(trailingPosition?.y).isEqualTo(
-                    ((textFieldHeight.roundToPx() - trailingSize!!.height) / 2f).roundToInt()
-                )
+                assertThat(trailingPosition?.x)
+                    .isEqualTo((textFieldWidth.roundToPx() - trailingSize!!.width).toFloat())
+                assertThat(trailingPosition?.y)
+                    .isEqualTo(
+                        ((textFieldHeight.roundToPx() - trailingSize!!.height) / 2f).roundToInt()
+                    )
             }
         }
     }
@@ -854,27 +826,21 @@
                 OutlinedTextField(
                     value = "text",
                     onValueChange = {},
-                    modifier = Modifier
-                        .width(textFieldWidth)
-                        .height(textFieldHeight),
+                    modifier = Modifier.width(textFieldWidth).height(textFieldHeight),
                     leadingIcon = {
                         Box(
-                            Modifier
-                                .size(size)
-                                .onGloballyPositioned {
-                                    leadingPosition = it.positionInRoot()
-                                    leadingSize = it.size
-                                }
+                            Modifier.size(size).onGloballyPositioned {
+                                leadingPosition = it.positionInRoot()
+                                leadingSize = it.size
+                            }
                         )
                     },
                     trailingIcon = {
                         Box(
-                            Modifier
-                                .size(size)
-                                .onGloballyPositioned {
-                                    trailingPosition = it.positionInRoot()
-                                    trailingSize = it.size
-                                }
+                            Modifier.size(size).onGloballyPositioned {
+                                trailingPosition = it.positionInRoot()
+                                trailingSize = it.size
+                            }
                         )
                     },
                 )
@@ -886,22 +852,18 @@
                 // leading
                 assertThat(leadingSize).isEqualTo(IntSize(size.roundToPx(), size.roundToPx()))
                 assertThat(leadingPosition?.x).isEqualTo(0f)
-                assertThat(leadingPosition?.y).isEqualTo(
-                    ((textFieldHeight.roundToPx() - leadingSize!!.height) / 2f).roundToInt()
-                )
-                // trailing
-                assertThat(trailingSize).isEqualTo(
-                    IntSize(
-                        size.roundToPx(),
-                        size.roundToPx()
+                assertThat(leadingPosition?.y)
+                    .isEqualTo(
+                        ((textFieldHeight.roundToPx() - leadingSize!!.height) / 2f).roundToInt()
                     )
-                )
-                assertThat(trailingPosition?.x).isEqualTo(
-                    (textFieldWidth.roundToPx() - trailingSize!!.width).toFloat()
-                )
-                assertThat(trailingPosition?.y).isEqualTo(
-                    ((textFieldHeight.roundToPx() - trailingSize!!.height) / 2f).roundToInt()
-                )
+                // trailing
+                assertThat(trailingSize).isEqualTo(IntSize(size.roundToPx(), size.roundToPx()))
+                assertThat(trailingPosition?.x)
+                    .isEqualTo((textFieldWidth.roundToPx() - trailingSize!!.width).toFloat())
+                assertThat(trailingPosition?.y)
+                    .isEqualTo(
+                        ((textFieldHeight.roundToPx() - trailingSize!!.height) / 2f).roundToInt()
+                    )
             }
         }
     }
@@ -917,9 +879,10 @@
                     label = {
                         Text(
                             text = "label",
-                            modifier = Modifier.onGloballyPositioned {
-                                labelPosition.value = it.positionInRoot()
-                            }
+                            modifier =
+                                Modifier.onGloballyPositioned {
+                                    labelPosition.value = it.positionInRoot()
+                                }
                         )
                     },
                     trailingIcon = { Icon(Icons.Default.Favorite, null) },
@@ -930,10 +893,11 @@
 
         rule.runOnIdleWithDensity {
             val iconSize = 24.dp // default icon size
-            assertThat(labelPosition.value?.x).isEqualTo(
-                (ExpectedPadding.roundToPx() + IconPadding.roundToPx() + iconSize.roundToPx())
-                    .toFloat()
-            )
+            assertThat(labelPosition.value?.x)
+                .isEqualTo(
+                    (ExpectedPadding.roundToPx() + IconPadding.roundToPx() + iconSize.roundToPx())
+                        .toFloat()
+                )
         }
     }
 
@@ -948,9 +912,10 @@
                     label = {
                         Text(
                             text = "label",
-                            modifier = Modifier.onGloballyPositioned {
-                                labelPosition.value = it.positionInRoot()
-                            }
+                            modifier =
+                                Modifier.onGloballyPositioned {
+                                    labelPosition.value = it.positionInRoot()
+                                }
                         )
                     },
                     trailingIcon = null,
@@ -960,9 +925,7 @@
         }
 
         rule.runOnIdleWithDensity {
-            assertThat(labelPosition.value?.x).isEqualTo(
-                ExpectedPadding.roundToPx().toFloat()
-            )
+            assertThat(labelPosition.value?.x).isEqualTo(ExpectedPadding.roundToPx().toFloat())
         }
     }
 
@@ -975,19 +938,11 @@
                 isError = false,
                 leadingIcon = {
                     assertThat(LocalContentColor.current)
-                        .isEqualTo(
-                            MaterialTheme.colors.onSurface.copy(
-                                IconColorAlpha
-                            )
-                        )
+                        .isEqualTo(MaterialTheme.colors.onSurface.copy(IconColorAlpha))
                 },
                 trailingIcon = {
                     assertThat(LocalContentColor.current)
-                        .isEqualTo(
-                            MaterialTheme.colors.onSurface.copy(
-                                IconColorAlpha
-                            )
-                        )
+                        .isEqualTo(MaterialTheme.colors.onSurface.copy(IconColorAlpha))
                 }
             )
         }
@@ -1002,11 +957,7 @@
                 isError = true,
                 leadingIcon = {
                     assertThat(LocalContentColor.current)
-                        .isEqualTo(
-                            MaterialTheme.colors.onSurface.copy(
-                                IconColorAlpha
-                            )
-                        )
+                        .isEqualTo(MaterialTheme.colors.onSurface.copy(IconColorAlpha))
                 },
                 trailingIcon = {
                     assertThat(LocalContentColor.current).isEqualTo(MaterialTheme.colors.error)
@@ -1033,10 +984,8 @@
                     modifier = Modifier.testTag(TextfieldTag),
                     value = text.value,
                     onValueChange = { text.value = it },
-                    keyboardOptions = KeyboardOptions(
-                        imeAction = ImeAction.Go,
-                        keyboardType = KeyboardType.Email
-                    )
+                    keyboardOptions =
+                        KeyboardOptions(imeAction = ImeAction.Go, keyboardType = KeyboardType.Email)
                 )
             }
         }
@@ -1068,7 +1017,8 @@
             }
         }
 
-        rule.onNodeWithTag(TextfieldTag)
+        rule
+            .onNodeWithTag(TextfieldTag)
             .captureToImage()
             .assertShape(
                 density = rule.density,
@@ -1084,19 +1034,14 @@
     fun testErrorSemantics_defaultMessage() {
         lateinit var errorMessage: String
         rule.setMaterialContent {
-            OutlinedTextField(
-                value = "test",
-                onValueChange = {},
-                isError = true
-            )
+            OutlinedTextField(value = "test", onValueChange = {}, isError = true)
             errorMessage = getString(Strings.DefaultErrorMessage)
         }
 
-        rule.onNodeWithText("test")
+        rule
+            .onNodeWithText("test")
             .assert(SemanticsMatcher.keyIsDefined(SemanticsProperties.Error))
-            .assert(
-                SemanticsMatcher.expectValue(SemanticsProperties.Error, errorMessage)
-            )
+            .assert(SemanticsMatcher.expectValue(SemanticsProperties.Error, errorMessage))
     }
 
     @Test
@@ -1108,20 +1053,23 @@
             OutlinedTextField(
                 value = "test",
                 onValueChange = {},
-                modifier = Modifier
-                    .testTag(TextfieldTag)
-                    .semantics { if (isError.value) error(errorMessage) },
+                modifier =
+                    Modifier.testTag(TextfieldTag).semantics {
+                        if (isError.value) error(errorMessage)
+                    },
                 isError = isError.value
             )
             defaultErrorMessage = getString(Strings.DefaultErrorMessage)
         }
 
-        rule.onNodeWithTag(TextfieldTag)
+        rule
+            .onNodeWithTag(TextfieldTag)
             .assert(SemanticsMatcher.keyIsDefined(SemanticsProperties.Error))
             .assert(SemanticsMatcher.expectValue(SemanticsProperties.Error, errorMessage))
 
         // Check that default error message is overwritten and not lingering in a child node
-        rule.onNodeWithTag(TextfieldTag, useUnmergedTree = true)
+        rule
+            .onNodeWithTag(TextfieldTag, useUnmergedTree = true)
             .onChildren()
             .fetchSemanticsNodes()
             .forEach { node ->
@@ -1139,10 +1087,10 @@
             Box(Modifier.onGloballyPositioned { size = it.size }) {
                 Row(Modifier.height(IntrinsicSize.Min)) {
                     Divider(
-                        modifier = Modifier
-                            .fillMaxHeight()
-                            .width(10.dp)
-                            .onGloballyPositioned { dividerSize = it.size }
+                        modifier =
+                            Modifier.fillMaxHeight().width(10.dp).onGloballyPositioned {
+                                dividerSize = it.size
+                            }
                     )
                     OutlinedTextField(
                         value = text.value,
@@ -1168,17 +1116,16 @@
                 value = "",
                 onValueChange = {},
                 modifier = Modifier.testTag(TextfieldTag),
-                colors = TextFieldDefaults.outlinedTextFieldColors(
-                    backgroundColor = Color.Red,
-                    unfocusedBorderColor = Color.Red
-                ),
+                colors =
+                    TextFieldDefaults.outlinedTextFieldColors(
+                        backgroundColor = Color.Red,
+                        unfocusedBorderColor = Color.Red
+                    ),
                 shape = RectangleShape
             )
         }
 
-        rule.onNodeWithTag(TextfieldTag).captureToImage().assertPixels {
-            Color.Red
-        }
+        rule.onNodeWithTag(TextfieldTag).captureToImage().assertPixels { Color.Red }
     }
 
     @Test
@@ -1190,10 +1137,10 @@
             Box {
                 Column(Modifier.width(IntrinsicSize.Min)) {
                     Divider(
-                        modifier = Modifier
-                            .fillMaxWidth()
-                            .height(10.dp)
-                            .onGloballyPositioned { dividerSize = it.size }
+                        modifier =
+                            Modifier.fillMaxWidth().height(10.dp).onGloballyPositioned {
+                                dividerSize = it.size
+                            }
                     )
                     OutlinedTextField(
                         value = text.value,
@@ -1216,28 +1163,24 @@
     @SdkSuppress(minSdkVersion = Build.VERSION_CODES.O)
     fun testOutlinedTextField_label_notUsingErrorColor_notFocused_withoutInput() {
         rule.setMaterialContent {
-            Box(
-                Modifier
-                    .background(Color.White)
-                    .padding(10.dp)) {
+            Box(Modifier.background(Color.White).padding(10.dp)) {
                 OutlinedTextField(
                     value = "",
                     onValueChange = {},
                     modifier = Modifier.testTag(TextfieldTag),
                     label = { Text("Label") },
                     isError = true,
-                    colors = TextFieldDefaults.outlinedTextFieldColors(
-                        unfocusedLabelColor = Color.White,
-                        errorLabelColor = Color.Red,
-                        errorBorderColor = Color.White
-                    )
+                    colors =
+                        TextFieldDefaults.outlinedTextFieldColors(
+                            unfocusedLabelColor = Color.White,
+                            errorLabelColor = Color.Red,
+                            errorBorderColor = Color.White
+                        )
                 )
             }
         }
 
-        rule.onNodeWithTag(TextfieldTag).captureToImage().assertPixels {
-            Color.White
-        }
+        rule.onNodeWithTag(TextfieldTag).captureToImage().assertPixels { Color.White }
     }
 
     @Test
@@ -1258,10 +1201,11 @@
                     contentColor = LocalContentColor.current
                 },
                 modifier = Modifier.focusRequester(focusRequester),
-                colors = TextFieldDefaults.textFieldColors(
-                    unfocusedLabelColor = unfocusedLabelColor,
-                    focusedLabelColor = focusedLabelColor
-                )
+                colors =
+                    TextFieldDefaults.textFieldColors(
+                        unfocusedLabelColor = unfocusedLabelColor,
+                        focusedLabelColor = focusedLabelColor
+                    )
             )
         }
 
@@ -1270,9 +1214,7 @@
             assertThat(textStyle.color).isEqualTo(Color.Unspecified)
         }
 
-        rule.runOnUiThread {
-            focusRequester.requestFocus()
-        }
+        rule.runOnUiThread { focusRequester.requestFocus() }
 
         rule.runOnIdle {
             assertThat(contentColor).isEqualTo(focusedLabelColor)
@@ -1301,10 +1243,11 @@
                         contentColor = LocalContentColor.current
                     },
                     modifier = Modifier.focusRequester(focusRequester),
-                    colors = TextFieldDefaults.textFieldColors(
-                        unfocusedLabelColor = unfocusedLabelColor,
-                        focusedLabelColor = focusedLabelColor
-                    )
+                    colors =
+                        TextFieldDefaults.textFieldColors(
+                            unfocusedLabelColor = unfocusedLabelColor,
+                            focusedLabelColor = focusedLabelColor
+                        )
                 )
             }
         }
@@ -1314,9 +1257,7 @@
             assertThat(contentColor).isEqualTo(unfocusedLabelColor)
         }
 
-        rule.runOnUiThread {
-            focusRequester.requestFocus()
-        }
+        rule.runOnUiThread { focusRequester.requestFocus() }
 
         rule.runOnIdle {
             assertThat(textStyle.color).isEqualTo(captionColor)
@@ -1344,17 +1285,16 @@
                         contentColor = LocalContentColor.current
                     },
                     modifier = Modifier.focusRequester(focusRequester),
-                    colors = TextFieldDefaults.textFieldColors(
-                        unfocusedLabelColor = expectedLabelColor,
-                        focusedLabelColor = focusedLabelColor
-                    )
+                    colors =
+                        TextFieldDefaults.textFieldColors(
+                            unfocusedLabelColor = expectedLabelColor,
+                            focusedLabelColor = focusedLabelColor
+                        )
                 )
             }
         }
 
-        rule.runOnUiThread {
-            focusRequester.requestFocus()
-        }
+        rule.runOnUiThread { focusRequester.requestFocus() }
 
         // animation duration is 150, advancing by 75 to get into middle of animation
         rule.mainClock.advanceTimeBy(75)
@@ -1390,10 +1330,11 @@
                         contentColor = LocalContentColor.current
                     },
                     modifier = Modifier.focusRequester(focusRequester),
-                    colors = TextFieldDefaults.textFieldColors(
-                        unfocusedLabelColor = unfocusedLabelColor,
-                        focusedLabelColor = focusedLabelColor
-                    )
+                    colors =
+                        TextFieldDefaults.textFieldColors(
+                            unfocusedLabelColor = unfocusedLabelColor,
+                            focusedLabelColor = focusedLabelColor
+                        )
                 )
             }
         }
@@ -1403,9 +1344,7 @@
             assertThat(contentColor).isEqualTo(unfocusedLabelColor)
         }
 
-        rule.runOnUiThread {
-            focusRequester.requestFocus()
-        }
+        rule.runOnUiThread { focusRequester.requestFocus() }
 
         rule.runOnIdle {
             assertThat(textStyle.color).isEqualTo(captionColor)
@@ -1427,10 +1366,7 @@
             }
         }
 
-        rule.onNodeWithText("Label")
-            .assertExists()
-            .assertIsDisplayed()
-            .performTextInput("text")
+        rule.onNodeWithText("Label").assertExists().assertIsDisplayed().performTextInput("text")
 
         rule.onNodeWithText("text").assertExists()
     }
@@ -1440,9 +1376,7 @@
         var height = 0
         rule.setMaterialContent {
             val text = remember { mutableStateOf("") }
-            Box(Modifier.onGloballyPositioned {
-                height = it.size.height
-            }) {
+            Box(Modifier.onGloballyPositioned { height = it.size.height }) {
                 Row(Modifier.height(IntrinsicSize.Min)) {
                     OutlinedTextField(
                         value = text.value,
@@ -1463,9 +1397,7 @@
         var height = 0
         rule.setMaterialContent {
             val text = remember { mutableStateOf("") }
-            Box(Modifier.onGloballyPositioned {
-                height = it.size.height
-            }) {
+            Box(Modifier.onGloballyPositioned { height = it.size.height }) {
                 Row(Modifier.height(IntrinsicSize.Min)) {
                     OutlinedTextField(
                         value = text.value,
@@ -1490,16 +1422,12 @@
         val text = "Long text input. ".repeat(20)
         rule.setMaterialContent {
             Row {
-                Box(
-                    Modifier
-                        .width(150.dp)
-                        .height(IntrinsicSize.Min)) {
+                Box(Modifier.width(150.dp).height(IntrinsicSize.Min)) {
                     OutlinedTextField(
                         value = text,
                         onValueChange = {},
-                        modifier = Modifier.onGloballyPositioned {
-                            tfHeightIntrinsic = it.size.height
-                        },
+                        modifier =
+                            Modifier.onGloballyPositioned { tfHeightIntrinsic = it.size.height },
                         leadingIcon = { Icon(Icons.Default.Favorite, null) },
                         trailingIcon = { Icon(Icons.Default.Favorite, null) },
                     )
@@ -1508,9 +1436,8 @@
                     OutlinedTextField(
                         value = text,
                         onValueChange = {},
-                        modifier = Modifier.onGloballyPositioned {
-                            tfHeightNoIntrinsic = it.size.height
-                        },
+                        modifier =
+                            Modifier.onGloballyPositioned { tfHeightNoIntrinsic = it.size.height },
                         leadingIcon = { Icon(Icons.Default.Favorite, null) },
                         trailingIcon = { Icon(Icons.Default.Favorite, null) },
                     )
@@ -1545,33 +1472,22 @@
             )
         }
 
-        rule.onNodeWithTag("tag")
-            .performClick()
+        rule.onNodeWithTag("tag").performClick()
         rule.waitForIdle()
 
-        rule.onNodeWithTag("tag")
-            .performTextClearance()
+        rule.onNodeWithTag("tag").performTextClearance()
 
-        rule.runOnIdle {
-            assertThat(callbackCounter).isEqualTo(1)
-        }
+        rule.runOnIdle { assertThat(callbackCounter).isEqualTo(1) }
     }
 
     @Test
     fun testTextFields_noCrashConstraintsInfinity() {
         rule.setMaterialContent {
             Column(
-                modifier = Modifier
-                    .height(IntrinsicSize.Min)
-                    .horizontalScroll(
-                        rememberScrollState()
-                    )
+                modifier =
+                    Modifier.height(IntrinsicSize.Min).horizontalScroll(rememberScrollState())
             ) {
-                OutlinedTextField(
-                    value = "Cat",
-                    onValueChange = {},
-                    leadingIcon = { Text("Icon") }
-                )
+                OutlinedTextField(value = "Cat", onValueChange = {}, leadingIcon = { Text("Icon") })
             }
         }
     }
diff --git a/compose/material/material/src/androidInstrumentedTest/kotlin/androidx/compose/material/textfield/TextFieldDecorationBoxTest.kt b/compose/material/material/src/androidInstrumentedTest/kotlin/androidx/compose/material/textfield/TextFieldDecorationBoxTest.kt
index 61d68c1..20cf3b8 100644
--- a/compose/material/material/src/androidInstrumentedTest/kotlin/androidx/compose/material/textfield/TextFieldDecorationBoxTest.kt
+++ b/compose/material/material/src/androidInstrumentedTest/kotlin/androidx/compose/material/textfield/TextFieldDecorationBoxTest.kt
@@ -70,8 +70,7 @@
 @RunWith(AndroidJUnit4::class)
 @OptIn(ExperimentalMaterialApi::class)
 class TextFieldDecorationBoxTest {
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
     private val Density = Density(1f)
     private val InnerTextFieldHeight = 50.dp
@@ -345,16 +344,16 @@
             CompositionLocalProvider(LocalDensity provides Density) {
                 val interactionSource = remember { MutableInteractionSource() }
                 val singleLine = true
-                val colors = TextFieldDefaults.outlinedTextFieldColors(
-                    unfocusedBorderColor = Color.Red
-                )
+                val colors =
+                    TextFieldDefaults.outlinedTextFieldColors(unfocusedBorderColor = Color.Red)
                 BasicTextField(
                     value = value,
                     onValueChange = {},
-                    modifier = Modifier.size(
-                        with(Density) { textFieldWidth.toDp() },
-                        with(Density) { textFieldHeight.toDp() }
-                    ),
+                    modifier =
+                        Modifier.size(
+                            with(Density) { textFieldWidth.toDp() },
+                            with(Density) { textFieldHeight.toDp() }
+                        ),
                     singleLine = singleLine,
                     interactionSource = interactionSource
                 ) {
@@ -382,14 +381,14 @@
             }
         }
 
-        rule.onNodeWithText(value)
-            .captureToImage()
-            .assertPixels(IntSize(textFieldWidth, textFieldHeight)) {
-                // to account for edge pixels
-                if (it.x in 2..(textFieldWidth - 2) && it.y in 2..(borderWidth - 2)) {
-                    Color.Red
-                } else null
-            }
+        rule.onNodeWithText(value).captureToImage().assertPixels(
+            IntSize(textFieldWidth, textFieldHeight)
+        ) {
+            // to account for edge pixels
+            if (it.x in 2..(textFieldWidth - 2) && it.y in 2..(borderWidth - 2)) {
+                Color.Red
+            } else null
+        }
     }
 
     @SdkSuppress(minSdkVersion = Build.VERSION_CODES.O)
@@ -404,24 +403,23 @@
             CompositionLocalProvider(LocalDensity provides Density) {
                 val interactionSource = remember { MutableInteractionSource() }
                 val singleLine = true
-                val colors = TextFieldDefaults.textFieldColors(
-                    unfocusedIndicatorColor = Color.Red
-                )
+                val colors = TextFieldDefaults.textFieldColors(unfocusedIndicatorColor = Color.Red)
                 BasicTextField(
                     value = value,
                     onValueChange = {},
-                    modifier = Modifier
-                        .indicatorLine(
-                            enabled = true,
-                            isError = false,
-                            colors = colors,
-                            interactionSource = interactionSource,
-                            unfocusedIndicatorLineThickness = with(Density) { borderWidth.toDp() }
-                        )
-                        .size(
-                            with(Density) { textFieldWidth.toDp() },
-                            with(Density) { textFieldHeight.toDp() }
-                        ),
+                    modifier =
+                        Modifier.indicatorLine(
+                                enabled = true,
+                                isError = false,
+                                colors = colors,
+                                interactionSource = interactionSource,
+                                unfocusedIndicatorLineThickness =
+                                    with(Density) { borderWidth.toDp() }
+                            )
+                            .size(
+                                with(Density) { textFieldWidth.toDp() },
+                                with(Density) { textFieldHeight.toDp() }
+                            ),
                     singleLine = singleLine,
                     interactionSource = interactionSource
                 ) {
@@ -439,16 +437,17 @@
             }
         }
 
-        rule.onNodeWithText(value)
-            .captureToImage()
-            .assertPixels(IntSize(textFieldWidth, textFieldHeight)) {
-                // to account for edge pixels
-                if (it.x in 2..(textFieldWidth - 2) &&
+        rule.onNodeWithText(value).captureToImage().assertPixels(
+            IntSize(textFieldWidth, textFieldHeight)
+        ) {
+            // to account for edge pixels
+            if (
+                it.x in 2..(textFieldWidth - 2) &&
                     it.y in (textFieldHeight - borderWidth + 2)..(textFieldHeight - 2)
-                ) {
-                    Color.Red
-                } else null
-            }
+            ) {
+                Color.Red
+            } else null
+        }
     }
 
     @SdkSuppress(minSdkVersion = Build.VERSION_CODES.O)
@@ -463,16 +462,15 @@
             CompositionLocalProvider(LocalDensity provides Density) {
                 val interactionSource = remember { MutableInteractionSource() }
                 val singleLine = true
-                val colors = TextFieldDefaults.outlinedTextFieldColors(
-                    backgroundColor = Color.Red
-                )
+                val colors = TextFieldDefaults.outlinedTextFieldColors(backgroundColor = Color.Red)
                 BasicTextField(
                     value = value,
                     onValueChange = {},
-                    modifier = Modifier.size(
-                        with(Density) { textFieldWidth.toDp() },
-                        with(Density) { textFieldHeight.toDp() }
-                    ),
+                    modifier =
+                        Modifier.size(
+                            with(Density) { textFieldWidth.toDp() },
+                            with(Density) { textFieldHeight.toDp() }
+                        ),
                     singleLine = singleLine,
                     interactionSource = interactionSource
                 ) {
@@ -500,15 +498,17 @@
             }
         }
 
-        rule.onNodeWithText(value)
-            .captureToImage()
-            .assertPixels(IntSize(textFieldWidth, textFieldHeight)) {
-                // to account for border + edge pixels
-                if (it.x in (borderWidth + 2)..(textFieldWidth - borderWidth - 2) &&
-                    it.y in (borderWidth + 2)..(textFieldHeight - borderWidth - 2)) {
-                    Color.Red
-                } else null
-            }
+        rule.onNodeWithText(value).captureToImage().assertPixels(
+            IntSize(textFieldWidth, textFieldHeight)
+        ) {
+            // to account for border + edge pixels
+            if (
+                it.x in (borderWidth + 2)..(textFieldWidth - borderWidth - 2) &&
+                    it.y in (borderWidth + 2)..(textFieldHeight - borderWidth - 2)
+            ) {
+                Color.Red
+            } else null
+        }
     }
 
     @SdkSuppress(minSdkVersion = Build.VERSION_CODES.O)
@@ -523,24 +523,23 @@
             CompositionLocalProvider(LocalDensity provides Density) {
                 val interactionSource = remember { MutableInteractionSource() }
                 val singleLine = true
-                val colors = TextFieldDefaults.textFieldColors(
-                    backgroundColor = Color.Red
-                )
+                val colors = TextFieldDefaults.textFieldColors(backgroundColor = Color.Red)
                 BasicTextField(
                     value = value,
                     onValueChange = {},
-                    modifier = Modifier
-                        .indicatorLine(
-                            enabled = true,
-                            isError = false,
-                            colors = colors,
-                            interactionSource = interactionSource,
-                            unfocusedIndicatorLineThickness = with(Density) { borderWidth.toDp() }
-                        )
-                        .size(
-                            with(Density) { textFieldWidth.toDp() },
-                            with(Density) { textFieldHeight.toDp() }
-                        ),
+                    modifier =
+                        Modifier.indicatorLine(
+                                enabled = true,
+                                isError = false,
+                                colors = colors,
+                                interactionSource = interactionSource,
+                                unfocusedIndicatorLineThickness =
+                                    with(Density) { borderWidth.toDp() }
+                            )
+                            .size(
+                                with(Density) { textFieldWidth.toDp() },
+                                with(Density) { textFieldHeight.toDp() }
+                            ),
                     singleLine = singleLine,
                     interactionSource = interactionSource
                 ) {
@@ -558,15 +557,14 @@
             }
         }
 
-        rule.onNodeWithText(value)
-            .captureToImage()
-            .assertPixels(IntSize(textFieldWidth, textFieldHeight)) {
-                // to account for border + edge pixels
-                if (it.x in 2..(textFieldWidth - 2) &&
-                    it.y in 2..(textFieldHeight - borderWidth - 2)) {
-                    Color.Red
-                } else null
-            }
+        rule.onNodeWithText(value).captureToImage().assertPixels(
+            IntSize(textFieldWidth, textFieldHeight)
+        ) {
+            // to account for border + edge pixels
+            if (it.x in 2..(textFieldWidth - 2) && it.y in 2..(textFieldHeight - borderWidth - 2)) {
+                Color.Red
+            } else null
+        }
     }
 
     @Test
@@ -663,12 +661,11 @@
                             value = value,
                             innerTextField = {
                                 Box(
-                                    Modifier
-                                        .size(InnerTextFieldWidth, InnerTextFieldHeight)
-                                        .onGloballyPositioned {
-                                            position = it.positionInRoot()
-                                        }
-                                ) { it() }
+                                    Modifier.size(InnerTextFieldWidth, InnerTextFieldHeight)
+                                        .onGloballyPositioned { position = it.positionInRoot() }
+                                ) {
+                                    it()
+                                }
                             },
                             enabled = true,
                             singleLine = singleLine,
@@ -682,9 +679,7 @@
             }
         }
 
-        rule.runOnUiThread {
-            focusRequester.requestFocus()
-        }
+        rule.runOnUiThread { focusRequester.requestFocus() }
 
         rule.runOnIdle {
             with(Density) {
@@ -766,19 +761,19 @@
                         singleLine = singleLine,
                         interactionSource = interactionSource
                     ) {
-                        val label: @Composable (() -> Unit)? = if (hasLabel) {
-                            @Composable { Text("Label") }
-                        } else null
+                        val label: @Composable (() -> Unit)? =
+                            if (hasLabel) {
+                                @Composable { Text("Label") }
+                            } else null
                         TextFieldDecorationBox(
                             value = value,
                             innerTextField = {
                                 Box(
-                                    Modifier
-                                        .size(InnerTextFieldWidth, InnerTextFieldHeight)
-                                        .onGloballyPositioned {
-                                            position = it.positionInRoot()
-                                        }
-                                ) { it() }
+                                    Modifier.size(InnerTextFieldWidth, InnerTextFieldHeight)
+                                        .onGloballyPositioned { position = it.positionInRoot() }
+                                ) {
+                                    it()
+                                }
                             },
                             enabled = true,
                             singleLine = singleLine,
@@ -792,9 +787,7 @@
             }
         }
 
-        rule.runOnUiThread {
-            focusRequester.requestFocus()
-        }
+        rule.runOnUiThread { focusRequester.requestFocus() }
 
         rule.runOnIdle {
             with(Density) {
diff --git a/compose/material/material/src/androidInstrumentedTest/kotlin/androidx/compose/material/textfield/TextFieldScreenshotTest.kt b/compose/material/material/src/androidInstrumentedTest/kotlin/androidx/compose/material/textfield/TextFieldScreenshotTest.kt
index b81fecd..dcd4562 100644
--- a/compose/material/material/src/androidInstrumentedTest/kotlin/androidx/compose/material/textfield/TextFieldScreenshotTest.kt
+++ b/compose/material/material/src/androidInstrumentedTest/kotlin/androidx/compose/material/textfield/TextFieldScreenshotTest.kt
@@ -65,21 +65,20 @@
 @SdkSuppress(minSdkVersion = Build.VERSION_CODES.O)
 class TextFieldScreenshotTest {
     private val TextFieldTag = "TextField"
-    private val longText = TextFieldValue(
-        "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do " +
-            "eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam," +
-            " quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. " +
-            "Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu " +
-            "fugiat nulla pariatur."
-    )
+    private val longText =
+        TextFieldValue(
+            "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do " +
+                "eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam," +
+                " quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. " +
+                "Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu " +
+                "fugiat nulla pariatur."
+        )
 
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
     private val platformTextStyle = defaultPlatformTextStyle()
 
-    @get:Rule
-    val screenshotRule = AndroidXScreenshotTestRule(GOLDEN_MATERIAL)
+    @get:Rule val screenshotRule = AndroidXScreenshotTestRule(GOLDEN_MATERIAL)
 
     @Test
     fun textField_withInput() {
@@ -212,9 +211,8 @@
                 value = TextFieldValue(text = text, selection = TextRange(text.length)),
                 onValueChange = {},
                 label = { Text("Label") },
-                modifier = Modifier.requiredHeight(300.dp)
-                    .requiredWidth(280.dp)
-                    .testTag(TextFieldTag)
+                modifier =
+                    Modifier.requiredHeight(300.dp).requiredWidth(280.dp).testTag(TextFieldTag)
             )
         }
 
@@ -228,9 +226,8 @@
             TextField(
                 value = TextFieldValue(text = text, selection = TextRange(text.length)),
                 onValueChange = {},
-                modifier = Modifier.requiredHeight(300.dp)
-                    .requiredWidth(280.dp)
-                    .testTag(TextFieldTag)
+                modifier =
+                    Modifier.requiredHeight(300.dp).requiredWidth(280.dp).testTag(TextFieldTag)
             )
         }
 
@@ -245,9 +242,8 @@
                 onValueChange = {},
                 label = { Text("Label") },
                 placeholder = { Text("placeholder") },
-                modifier = Modifier.requiredHeight(300.dp)
-                    .requiredWidth(280.dp)
-                    .testTag(TextFieldTag)
+                modifier =
+                    Modifier.requiredHeight(300.dp).requiredWidth(280.dp).testTag(TextFieldTag)
             )
         }
 
@@ -263,9 +259,8 @@
                 value = "",
                 onValueChange = {},
                 placeholder = { Text("placeholder") },
-                modifier = Modifier.requiredHeight(300.dp)
-                    .requiredWidth(280.dp)
-                    .testTag(TextFieldTag)
+                modifier =
+                    Modifier.requiredHeight(300.dp).requiredWidth(280.dp).testTag(TextFieldTag)
             )
         }
 
@@ -281,9 +276,8 @@
                 value = "",
                 onValueChange = {},
                 label = { Text("Label") },
-                modifier = Modifier.requiredHeight(300.dp)
-                    .requiredWidth(280.dp)
-                    .testTag(TextFieldTag)
+                modifier =
+                    Modifier.requiredHeight(300.dp).requiredWidth(280.dp).testTag(TextFieldTag)
             )
         }
 
@@ -409,7 +403,7 @@
         rule.setMaterialContent {
             TextField(
                 value = longText,
-                onValueChange = { },
+                onValueChange = {},
                 singleLine = true,
                 modifier = Modifier.testTag(TextFieldTag).requiredWidth(300.dp),
                 enabled = false
@@ -464,7 +458,7 @@
         rule.setMaterialContent {
             TextField(
                 value = longText,
-                onValueChange = { },
+                onValueChange = {},
                 modifier = Modifier.testTag(TextFieldTag).requiredWidth(300.dp),
                 singleLine = true,
                 enabled = true,
@@ -490,10 +484,8 @@
                 value = TextFieldValue(text = text, selection = TextRange(text.length)),
                 onValueChange = {},
                 modifier = Modifier.width(300.dp).testTag(TextFieldTag),
-                textStyle = TextStyle(
-                    textAlign = TextAlign.Center,
-                    platformStyle = platformTextStyle
-                ),
+                textStyle =
+                    TextStyle(textAlign = TextAlign.Center, platformStyle = platformTextStyle),
                 singleLine = true
             )
         }
@@ -552,11 +544,16 @@
 
     private fun SemanticsNodeInteraction.focus() {
         // split click into (down) and (move, up) to enforce a composition in between
-        this.performTouchInput { down(center) }.performTouchInput { move(); up() }
+        this.performTouchInput { down(center) }
+            .performTouchInput {
+                move()
+                up()
+            }
     }
 
     private fun assertAgainstGolden(goldenIdentifier: String) {
-        rule.onNodeWithTag(TextFieldTag)
+        rule
+            .onNodeWithTag(TextFieldTag)
             .captureToImage()
             .assertAgainstGolden(screenshotRule, goldenIdentifier)
     }
diff --git a/compose/material/material/src/androidInstrumentedTest/kotlin/androidx/compose/material/textfield/TextFieldTest.kt b/compose/material/material/src/androidInstrumentedTest/kotlin/androidx/compose/material/textfield/TextFieldTest.kt
index 470d4b7..05817bf 100644
--- a/compose/material/material/src/androidInstrumentedTest/kotlin/androidx/compose/material/textfield/TextFieldTest.kt
+++ b/compose/material/material/src/androidInstrumentedTest/kotlin/androidx/compose/material/textfield/TextFieldTest.kt
@@ -144,41 +144,34 @@
     private val IconColorAlpha = 0.54f
     private val TextFieldTag = "textField"
 
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
     @Test
     fun testTextField_minimumHeight() {
-        rule.setMaterialContentForSizeAssertions {
-            TextField(
-                value = "input",
-                onValueChange = {},
-                modifier = Modifier.height(20.dp)
-            )
-        }
+        rule
+            .setMaterialContentForSizeAssertions {
+                TextField(value = "input", onValueChange = {}, modifier = Modifier.height(20.dp))
+            }
             .assertHeightIsEqualTo(20.dp)
     }
 
     @Test
     fun testTextField_setSmallWidth() {
-        rule.setMaterialContentForSizeAssertions {
-            TextField(
-                value = "input",
-                onValueChange = {},
-                modifier = Modifier.requiredWidth(40.dp)
-            )
-        }
+        rule
+            .setMaterialContentForSizeAssertions {
+                TextField(
+                    value = "input",
+                    onValueChange = {},
+                    modifier = Modifier.requiredWidth(40.dp)
+                )
+            }
             .assertWidthIsEqualTo(40.dp)
     }
 
     @Test
     fun testTextField_defaultWidth() {
-        rule.setMaterialContentForSizeAssertions {
-            TextField(
-                value = "input",
-                onValueChange = {}
-            )
-        }
+        rule
+            .setMaterialContentForSizeAssertions { TextField(value = "input", onValueChange = {}) }
             .assertWidthIsEqualTo(ExpectedDefaultTextFieldWidth)
     }
 
@@ -212,12 +205,8 @@
         val interactions1 = mutableListOf<Interaction>()
         val interactions2 = mutableListOf<Interaction>()
 
-        scope!!.launch {
-            interactionSource1.interactions.collect { interactions1.add(it) }
-        }
-        scope!!.launch {
-            interactionSource2.interactions.collect { interactions2.add(it) }
-        }
+        scope!!.launch { interactionSource1.interactions.collect { interactions1.add(it) } }
+        scope!!.launch { interactionSource2.interactions.collect { interactions2.add(it) } }
 
         rule.runOnIdle {
             assertThat(interactions1).isEmpty()
@@ -260,18 +249,12 @@
 
         val interactions = mutableListOf<Interaction>()
 
-        scope!!.launch {
-            interactionSource.interactions.collect { interactions.add(it) }
-        }
+        scope!!.launch { interactionSource.interactions.collect { interactions.add(it) } }
 
-        rule.runOnIdle {
-            assertThat(interactions).isEmpty()
-        }
+        rule.runOnIdle { assertThat(interactions).isEmpty() }
 
         // Click on (2, 2) which is Surface area and outside input area
-        rule.onNodeWithTag(TextFieldTag).performTouchInput {
-            click(Offset(2f, 2f))
-        }
+        rule.onNodeWithTag(TextFieldTag).performTouchInput { click(Offset(2f, 2f)) }
 
         rule.runOnIdle {
             // Not asserting total size as we have other interactions here too
@@ -287,11 +270,11 @@
             hostView = LocalView.current
             Box {
                 TextField(
-                    modifier = Modifier
-                        .focusRequester(parentFocusRequester)
-                        .focusTarget()
-                        .focusRequester(focusRequester)
-                        .testTag(TextFieldTag),
+                    modifier =
+                        Modifier.focusRequester(parentFocusRequester)
+                            .focusTarget()
+                            .focusRequester(focusRequester)
+                            .testTag(TextFieldTag),
                     value = "input",
                     onValueChange = {}
                 )
@@ -318,11 +301,11 @@
             softwareKeyboardController = LocalSoftwareKeyboardController.current
             Box {
                 TextField(
-                    modifier = Modifier
-                        .focusRequester(parentFocusRequester)
-                        .focusTarget()
-                        .focusRequester(focusRequester)
-                        .testTag(TextFieldTag),
+                    modifier =
+                        Modifier.focusRequester(parentFocusRequester)
+                            .focusTarget()
+                            .focusRequester(focusRequester)
+                            .testTag(TextFieldTag),
                     value = "input",
                     onValueChange = {}
                 )
@@ -355,8 +338,8 @@
                         Text(
                             text = "label",
                             fontSize = 10.sp,
-                            modifier = Modifier
-                                .onGloballyPositioned {
+                            modifier =
+                                Modifier.onGloballyPositioned {
                                     labelPosition.value = it.positionInRoot()
                                     labelSize.value = it.size
                                 }
@@ -373,12 +356,10 @@
             assertThat(labelSize.value?.height).isGreaterThan(0)
             assertThat(labelSize.value?.width).isGreaterThan(0)
             // centered position
-            assertThat(labelPosition.value?.x).isWithin(1f).of(
-                ExpectedPadding.toPx()
-            )
-            assertThat(labelPosition.value?.y).isWithin(1f).of(
-                (ExpectedDefaultTextFieldHeight.toPx() - labelSize.value!!.height) / 2f
-            )
+            assertThat(labelPosition.value?.x).isWithin(1f).of(ExpectedPadding.toPx())
+            assertThat(labelPosition.value?.y)
+                .isWithin(1f)
+                .of((ExpectedDefaultTextFieldHeight.toPx() - labelSize.value!!.height) / 2f)
         }
     }
 
@@ -395,8 +376,8 @@
                         Text(
                             text = "label",
                             fontSize = 10.sp,
-                            modifier = Modifier
-                                .onGloballyPositioned {
+                            modifier =
+                                Modifier.onGloballyPositioned {
                                     labelPosition.value = it.positionInRoot()
                                     labelSize.value = it.size
                                 }
@@ -413,12 +394,8 @@
             assertThat(labelSize.value?.height).isGreaterThan(0)
             assertThat(labelSize.value?.width).isGreaterThan(0)
             // centered position
-            assertThat(labelPosition.value?.x).isEqualTo(
-                ExpectedPadding.roundToPx().toFloat()
-            )
-            assertThat(labelPosition.value?.y).isEqualTo(
-                ExpectedPadding.roundToPx()
-            )
+            assertThat(labelPosition.value?.x).isEqualTo(ExpectedPadding.roundToPx().toFloat())
+            assertThat(labelPosition.value?.y).isEqualTo(ExpectedPadding.roundToPx())
         }
     }
 
@@ -436,10 +413,11 @@
                     label = {
                         Text(
                             text = "label",
-                            modifier = Modifier.onGloballyPositioned {
-                                labelPosition.value = it.positionInRoot()
-                                labelSize.value = it.size
-                            }
+                            modifier =
+                                Modifier.onGloballyPositioned {
+                                    labelPosition.value = it.positionInRoot()
+                                    labelSize.value = it.size
+                                }
                         )
                     }
                 )
@@ -451,12 +429,8 @@
             assertThat(labelSize.value).isNotNull()
             assertThat(labelSize.value?.height).isGreaterThan(0)
             assertThat(labelSize.value?.width).isGreaterThan(0)
-            assertThat(labelPosition.value?.x).isEqualTo(
-                ExpectedPadding.roundToPx().toFloat()
-            )
-            assertThat(labelPosition.value?.y).isEqualTo(
-                ExpectedPadding.roundToPx()
-            )
+            assertThat(labelPosition.value?.x).isEqualTo(ExpectedPadding.roundToPx().toFloat())
+            assertThat(labelPosition.value?.y).isEqualTo(ExpectedPadding.roundToPx())
         }
     }
 
@@ -474,12 +448,13 @@
                     label = {
                         Text(
                             text = "label",
-                            modifier = Modifier.onGloballyPositioned {
-                                labelPosition.value = it.positionInRoot()
-                                labelSize.value = it.size
-                                baseline.value = it[FirstBaseline].toFloat() +
-                                    labelPosition.value!!.y
-                            }
+                            modifier =
+                                Modifier.onGloballyPositioned {
+                                    labelPosition.value = it.positionInRoot()
+                                    labelSize.value = it.size
+                                    baseline.value =
+                                        it[FirstBaseline].toFloat() + labelPosition.value!!.y
+                                }
                         )
                     }
                 )
@@ -495,12 +470,8 @@
             assertThat(labelSize.value?.height).isGreaterThan(0)
             assertThat(labelSize.value?.width).isGreaterThan(0)
             // label's top position
-            assertThat(labelPosition.value?.x).isEqualTo(
-                ExpectedPadding.roundToPx().toFloat()
-            )
-            assertThat(baseline.value).isEqualTo(
-                ExpectedBaselineOffset.roundToPx().toFloat()
-            )
+            assertThat(labelPosition.value?.x).isEqualTo(ExpectedPadding.roundToPx().toFloat())
+            assertThat(baseline.value).isEqualTo(ExpectedBaselineOffset.roundToPx().toFloat())
         }
     }
 
@@ -517,12 +488,13 @@
                     label = {
                         Text(
                             text = "label",
-                            modifier = Modifier.onGloballyPositioned {
-                                labelPosition.value = it.positionInRoot()
-                                labelSize.value = it.size
-                                baseline.value =
-                                    it[FirstBaseline].toFloat() + labelPosition.value!!.y
-                            }
+                            modifier =
+                                Modifier.onGloballyPositioned {
+                                    labelPosition.value = it.positionInRoot()
+                                    labelSize.value = it.size
+                                    baseline.value =
+                                        it[FirstBaseline].toFloat() + labelPosition.value!!.y
+                                }
                         )
                     }
                 )
@@ -535,12 +507,8 @@
             assertThat(labelSize.value?.height).isGreaterThan(0)
             assertThat(labelSize.value?.width).isGreaterThan(0)
             // label's top position
-            assertThat(labelPosition.value?.x).isEqualTo(
-                ExpectedPadding.roundToPx().toFloat()
-            )
-            assertThat(baseline.value).isEqualTo(
-                ExpectedBaselineOffset.roundToPx().toFloat()
-            )
+            assertThat(labelPosition.value?.x).isEqualTo(ExpectedPadding.roundToPx().toFloat())
+            assertThat(baseline.value).isEqualTo(ExpectedBaselineOffset.roundToPx().toFloat())
         }
     }
 
@@ -551,19 +519,18 @@
         rule.setMaterialContent {
             Box {
                 TextField(
-                    modifier = Modifier
-                        .height(60.dp)
-                        .testTag(TextFieldTag),
+                    modifier = Modifier.height(60.dp).testTag(TextFieldTag),
                     value = "",
                     onValueChange = {},
                     label = { Text("label") },
                     placeholder = {
                         Text(
                             text = "placeholder",
-                            modifier = Modifier.onGloballyPositioned {
-                                placeholderPosition.value = it.positionInRoot()
-                                placeholderSize.value = it.size
-                            }
+                            modifier =
+                                Modifier.onGloballyPositioned {
+                                    placeholderPosition.value = it.positionInRoot()
+                                    placeholderSize.value = it.size
+                                }
                         )
                     }
                 )
@@ -578,9 +545,8 @@
             assertThat(placeholderSize.value?.height).isGreaterThan(0)
             assertThat(placeholderSize.value?.width).isGreaterThan(0)
             // placeholder's position
-            assertThat(placeholderPosition.value?.x).isEqualTo(
-                ExpectedPadding.roundToPx().toFloat()
-            )
+            assertThat(placeholderPosition.value?.x)
+                .isEqualTo(ExpectedPadding.roundToPx().toFloat())
             assertThat(placeholderPosition.value?.y)
                 .isEqualTo(
                     (ExpectedBaselineOffset.roundToPx() + TopPaddingFilledTextfield.roundToPx())
@@ -597,17 +563,14 @@
         rule.setMaterialContent {
             Box {
                 TextField(
-                    modifier = Modifier
-                        .height(height)
-                        .testTag(TextFieldTag),
+                    modifier = Modifier.height(height).testTag(TextFieldTag),
                     value = "",
                     onValueChange = {},
                     placeholder = {
                         Text(
                             text = "placeholder",
-                            modifier = Modifier
-                                .requiredHeight(20.dp)
-                                .onGloballyPositioned {
+                            modifier =
+                                Modifier.requiredHeight(20.dp).onGloballyPositioned {
                                     placeholderPosition.value = it.positionInRoot()
                                     placeholderSize.value = it.size
                                 }
@@ -625,12 +588,9 @@
             assertThat(placeholderSize.value?.height).isEqualTo(20.dp.roundToPx())
             assertThat(placeholderSize.value?.width).isGreaterThan(0)
             // centered position
-            assertThat(placeholderPosition.value?.x).isEqualTo(
-                ExpectedPadding.roundToPx().toFloat()
-            )
-            assertThat(placeholderPosition.value?.y).isEqualTo(
-                TextFieldPadding.roundToPx()
-            )
+            assertThat(placeholderPosition.value?.x)
+                .isEqualTo(ExpectedPadding.roundToPx().toFloat())
+            assertThat(placeholderPosition.value?.y).isEqualTo(TextFieldPadding.roundToPx())
         }
     }
 
@@ -644,14 +604,14 @@
                     modifier = Modifier.testTag(TextFieldTag),
                     value = "input",
                     onValueChange = {},
-
                     placeholder = {
                         Text(
                             text = "placeholder",
-                            modifier = Modifier.onGloballyPositioned {
-                                placeholderPosition.value = it.positionInRoot()
-                                placeholderSize.value = it.size
-                            }
+                            modifier =
+                                Modifier.onGloballyPositioned {
+                                    placeholderPosition.value = it.positionInRoot()
+                                    placeholderSize.value = it.size
+                                }
                         )
                     }
                 )
@@ -676,18 +636,9 @@
                 onValueChange = {},
                 placeholder = {
                     Text("placeholder")
-                    assertThat(
-                        LocalContentColor.current.copy(
-                            alpha = LocalContentAlpha.current
-                        )
-                    )
-                        .isEqualTo(
-                            MaterialTheme.colors.onSurface.copy(
-                                alpha = 0.6f
-                            )
-                        )
-                    assertThat(LocalTextStyle.current)
-                        .isEqualTo(MaterialTheme.typography.subtitle1)
+                    assertThat(LocalContentColor.current.copy(alpha = LocalContentAlpha.current))
+                        .isEqualTo(MaterialTheme.colors.onSurface.copy(alpha = 0.6f))
+                    assertThat(LocalTextStyle.current).isEqualTo(MaterialTheme.typography.subtitle1)
                 }
             )
         }
@@ -742,27 +693,27 @@
                 // leading
                 assertThat(leadingSize.value).isEqualTo(IntSize(size.roundToPx(), size.roundToPx()))
                 assertThat(leadingPosition.value?.x).isEqualTo(IconPadding.roundToPx().toFloat())
-                assertThat(leadingPosition.value?.y).isEqualTo(
-                    ((textFieldHeight.roundToPx() - leadingSize.value!!.height) / 2f).roundToInt()
-                        .toFloat()
-                )
-                // trailing
-                assertThat(trailingSize.value).isEqualTo(
-                    IntSize(
-                        size.roundToPx(),
-                        size.roundToPx()
+                assertThat(leadingPosition.value?.y)
+                    .isEqualTo(
+                        ((textFieldHeight.roundToPx() - leadingSize.value!!.height) / 2f)
+                            .roundToInt()
+                            .toFloat()
                     )
-                )
-                assertThat(trailingPosition.value?.x).isEqualTo(
-                    (
-                        textFieldWidth.roundToPx() - IconPadding.roundToPx() -
-                            trailingSize.value!!.width
-                        ).toFloat()
-                )
+                // trailing
+                assertThat(trailingSize.value)
+                    .isEqualTo(IntSize(size.roundToPx(), size.roundToPx()))
+                assertThat(trailingPosition.value?.x)
+                    .isEqualTo(
+                        (textFieldWidth.roundToPx() -
+                                IconPadding.roundToPx() -
+                                trailingSize.value!!.width)
+                            .toFloat()
+                    )
                 assertThat(trailingPosition.value?.y)
                     .isEqualTo(
                         ((textFieldHeight.roundToPx() - trailingSize.value!!.height) / 2f)
-                            .roundToInt().toFloat()
+                            .roundToInt()
+                            .toFloat()
                     )
             }
         }
@@ -788,10 +739,11 @@
                     leadingIcon = {
                         IconButton(
                             onClick = {},
-                            modifier = Modifier.onGloballyPositioned {
-                                leadingPosition = it.positionInRoot()
-                                leadingSize = it.size
-                            }
+                            modifier =
+                                Modifier.onGloballyPositioned {
+                                    leadingPosition = it.positionInRoot()
+                                    leadingSize = it.size
+                                }
                         ) {
                             Icon(Icons.Default.Favorite, null)
                         }
@@ -799,10 +751,11 @@
                     trailingIcon = {
                         IconButton(
                             onClick = {},
-                            modifier = Modifier.onGloballyPositioned {
-                                trailingPosition = it.positionInRoot()
-                                trailingSize = it.size
-                            }
+                            modifier =
+                                Modifier.onGloballyPositioned {
+                                    trailingPosition = it.positionInRoot()
+                                    trailingSize = it.size
+                                }
                         ) {
                             Icon(Icons.Default.Favorite, null)
                         }
@@ -818,21 +771,21 @@
                 // leading
                 assertThat(leadingSize).isEqualTo(IntSize(size.roundToPx(), size.roundToPx()))
                 assertThat(leadingPosition?.x).isEqualTo(0f)
-                assertThat(leadingPosition?.y).isEqualTo(
-                    ((textFieldHeight.roundToPx() - leadingSize!!.height) / 2f).roundToInt()
-                        .toFloat()
-                )
+                assertThat(leadingPosition?.y)
+                    .isEqualTo(
+                        ((textFieldHeight.roundToPx() - leadingSize!!.height) / 2f)
+                            .roundToInt()
+                            .toFloat()
+                    )
                 // trailing
-                assertThat(trailingSize).isEqualTo(
-                    IntSize(size.roundToPx(), size.roundToPx())
-                )
-                assertThat(trailingPosition?.x).isEqualTo(
-                    (textFieldWidth.roundToPx() - trailingSize!!.width).toFloat()
-                )
+                assertThat(trailingSize).isEqualTo(IntSize(size.roundToPx(), size.roundToPx()))
+                assertThat(trailingPosition?.x)
+                    .isEqualTo((textFieldWidth.roundToPx() - trailingSize!!.width).toFloat())
                 assertThat(trailingPosition?.y)
                     .isEqualTo(
                         ((textFieldHeight.roundToPx() - trailingSize!!.height) / 2f)
-                            .roundToInt().toFloat()
+                            .roundToInt()
+                            .toFloat()
                     )
             }
         }
@@ -858,22 +811,18 @@
                     modifier = Modifier.size(textFieldWidth, textFieldHeight),
                     leadingIcon = {
                         Box(
-                            Modifier
-                                .size(size)
-                                .onGloballyPositioned {
-                                    leadingPosition = it.positionInRoot()
-                                    leadingSize = it.size
-                                }
+                            Modifier.size(size).onGloballyPositioned {
+                                leadingPosition = it.positionInRoot()
+                                leadingSize = it.size
+                            }
                         )
                     },
                     trailingIcon = {
                         Box(
-                            Modifier
-                                .size(size)
-                                .onGloballyPositioned {
-                                    trailingPosition = it.positionInRoot()
-                                    trailingSize = it.size
-                                }
+                            Modifier.size(size).onGloballyPositioned {
+                                trailingPosition = it.positionInRoot()
+                                trailingSize = it.size
+                            }
                         )
                     }
                 )
@@ -885,21 +834,21 @@
                 // leading
                 assertThat(leadingSize).isEqualTo(IntSize(size.roundToPx(), size.roundToPx()))
                 assertThat(leadingPosition?.x).isEqualTo(0f)
-                assertThat(leadingPosition?.y).isEqualTo(
-                    ((textFieldHeight.roundToPx() - leadingSize!!.height) / 2f).roundToInt()
-                        .toFloat()
-                )
+                assertThat(leadingPosition?.y)
+                    .isEqualTo(
+                        ((textFieldHeight.roundToPx() - leadingSize!!.height) / 2f)
+                            .roundToInt()
+                            .toFloat()
+                    )
                 // trailing
-                assertThat(trailingSize).isEqualTo(
-                    IntSize(size.roundToPx(), size.roundToPx())
-                )
-                assertThat(trailingPosition?.x).isEqualTo(
-                    (textFieldWidth.roundToPx() - trailingSize!!.width).toFloat()
-                )
+                assertThat(trailingSize).isEqualTo(IntSize(size.roundToPx(), size.roundToPx()))
+                assertThat(trailingPosition?.x)
+                    .isEqualTo((textFieldWidth.roundToPx() - trailingSize!!.width).toFloat())
                 assertThat(trailingPosition?.y)
                     .isEqualTo(
                         ((textFieldHeight.roundToPx() - trailingSize!!.height) / 2f)
-                            .roundToInt().toFloat()
+                            .roundToInt()
+                            .toFloat()
                     )
             }
         }
@@ -918,9 +867,10 @@
                     label = {
                         Text(
                             text = "label",
-                            modifier = Modifier.onGloballyPositioned {
-                                labelPosition.value = it.positionInRoot()
-                            }
+                            modifier =
+                                Modifier.onGloballyPositioned {
+                                    labelPosition.value = it.positionInRoot()
+                                }
                         )
                     },
                     trailingIcon = { Icon(Icons.Default.Favorite, null) },
@@ -931,10 +881,11 @@
 
         rule.runOnIdleWithDensity {
             val iconSize = 24.dp // default icon size
-            assertThat(labelPosition.value?.x).isEqualTo(
-                (ExpectedPadding.roundToPx() + IconPadding.roundToPx() + iconSize.roundToPx())
-                    .toFloat()
-            )
+            assertThat(labelPosition.value?.x)
+                .isEqualTo(
+                    (ExpectedPadding.roundToPx() + IconPadding.roundToPx() + iconSize.roundToPx())
+                        .toFloat()
+                )
         }
     }
 
@@ -951,9 +902,10 @@
                     label = {
                         Text(
                             text = "label",
-                            modifier = Modifier.onGloballyPositioned {
-                                labelPosition.value = it.positionInRoot()
-                            }
+                            modifier =
+                                Modifier.onGloballyPositioned {
+                                    labelPosition.value = it.positionInRoot()
+                                }
                         )
                     },
                     trailingIcon = null,
@@ -963,9 +915,7 @@
         }
 
         rule.runOnIdleWithDensity {
-            assertThat(labelPosition.value?.x).isEqualTo(
-                ExpectedPadding.roundToPx().toFloat()
-            )
+            assertThat(labelPosition.value?.x).isEqualTo(ExpectedPadding.roundToPx().toFloat())
         }
     }
 
@@ -978,19 +928,11 @@
                 isError = false,
                 leadingIcon = {
                     assertThat(LocalContentColor.current)
-                        .isEqualTo(
-                            MaterialTheme.colors.onSurface.copy(
-                                IconColorAlpha
-                            )
-                        )
+                        .isEqualTo(MaterialTheme.colors.onSurface.copy(IconColorAlpha))
                 },
                 trailingIcon = {
                     assertThat(LocalContentColor.current)
-                        .isEqualTo(
-                            MaterialTheme.colors.onSurface.copy(
-                                IconColorAlpha
-                            )
-                        )
+                        .isEqualTo(MaterialTheme.colors.onSurface.copy(IconColorAlpha))
                 }
             )
         }
@@ -1005,11 +947,7 @@
                 isError = true,
                 leadingIcon = {
                     assertThat(LocalContentColor.current)
-                        .isEqualTo(
-                            MaterialTheme.colors.onSurface.copy(
-                                IconColorAlpha
-                            )
-                        )
+                        .isEqualTo(MaterialTheme.colors.onSurface.copy(IconColorAlpha))
                 },
                 trailingIcon = {
                     assertThat(LocalContentColor.current).isEqualTo(MaterialTheme.colors.error)
@@ -1036,10 +974,8 @@
                     modifier = Modifier.testTag(TextFieldTag),
                     value = text.value,
                     onValueChange = { text.value = it },
-                    keyboardOptions = KeyboardOptions(
-                        imeAction = ImeAction.Go,
-                        keyboardType = KeyboardType.Email
-                    )
+                    keyboardOptions =
+                        KeyboardOptions(imeAction = ImeAction.Go, keyboardType = KeyboardType.Email)
                 )
             }
         }
@@ -1071,7 +1007,8 @@
             )
         }
 
-        rule.onNodeWithTag(TextFieldTag)
+        rule
+            .onNodeWithTag(TextFieldTag)
             .captureToImage()
             .assertShape(
                 density = rule.density,
@@ -1096,26 +1033,24 @@
                     onValueChange = {},
                     label = { Text("label") },
                     shape = RectangleShape,
-                    leadingIcon = {
-                        Icon(Icons.Default.Favorite, null, tint = Color.Transparent)
-                    },
-                    trailingIcon = {
-                        Icon(Icons.Default.Favorite, null, tint = Color.Transparent)
-                    },
-                    colors = TextFieldDefaults.textFieldColors(
-                        backgroundColor = Color.Blue,
-                        focusedIndicatorColor = Color.Transparent,
-                        unfocusedIndicatorColor = Color.Transparent,
-                        textColor = Color.Transparent,
-                        cursorColor = Color.Transparent,
-                        focusedLabelColor = Color.Transparent,
-                        unfocusedLabelColor = Color.Transparent
-                    )
+                    leadingIcon = { Icon(Icons.Default.Favorite, null, tint = Color.Transparent) },
+                    trailingIcon = { Icon(Icons.Default.Favorite, null, tint = Color.Transparent) },
+                    colors =
+                        TextFieldDefaults.textFieldColors(
+                            backgroundColor = Color.Blue,
+                            focusedIndicatorColor = Color.Transparent,
+                            unfocusedIndicatorColor = Color.Transparent,
+                            textColor = Color.Transparent,
+                            cursorColor = Color.Transparent,
+                            focusedLabelColor = Color.Transparent,
+                            unfocusedLabelColor = Color.Transparent
+                        )
                 )
             }
         }
 
-        rule.onNodeWithTag(TextFieldTag)
+        rule
+            .onNodeWithTag(TextFieldTag)
             .captureToImage()
             .assertShape(
                 density = rule.density,
@@ -1128,7 +1063,8 @@
 
         rule.onNodeWithTag(TextFieldTag).performClick()
 
-        rule.onNodeWithTag(TextFieldTag)
+        rule
+            .onNodeWithTag(TextFieldTag)
             .captureToImage()
             .assertShape(
                 density = rule.density,
@@ -1152,11 +1088,13 @@
                 append(prefix)
                 append(text)
             }
-            val mapping = object : OffsetMapping {
-                override fun originalToTransformed(offset: Int) = offset + prefix.length
-                override fun transformedToOriginal(offset: Int) =
-                    (offset - prefix.length).coerceAtLeast(0)
-            }
+            val mapping =
+                object : OffsetMapping {
+                    override fun originalToTransformed(offset: Int) = offset + prefix.length
+
+                    override fun transformedToOriginal(offset: Int) =
+                        (offset - prefix.length).coerceAtLeast(0)
+                }
             TransformedText(transformed, mapping)
         }
         rule.setMaterialContent {
@@ -1168,9 +1106,7 @@
                     Text(
                         text = "label",
                         color = Color.Red,
-                        modifier = Modifier
-                            .testTag("Label")
-                            .background(Color.Red)
+                        modifier = Modifier.testTag("Label").background(Color.Red)
                     )
                 },
                 textStyle = TextStyle(color = Color.Blue),
@@ -1179,8 +1115,7 @@
         }
         // Label's top padding is only TextFieldPadding in the unfocused state,
         // but state should be focused
-        val labelBounds = rule.onNodeWithTag("Label", true)
-            .getUnclippedBoundsInRoot()
+        val labelBounds = rule.onNodeWithTag("Label", true).getUnclippedBoundsInRoot()
         assertThat(labelBounds.top).isLessThan(TextFieldPadding)
     }
 
@@ -1196,11 +1131,13 @@
                 append(prefix)
                 append(text)
             }
-            val mapping = object : OffsetMapping {
-                override fun originalToTransformed(offset: Int) = offset + prefix.length
-                override fun transformedToOriginal(offset: Int) =
-                    (offset - prefix.length).coerceAtLeast(0)
-            }
+            val mapping =
+                object : OffsetMapping {
+                    override fun originalToTransformed(offset: Int) = offset + prefix.length
+
+                    override fun transformedToOriginal(offset: Int) =
+                        (offset - prefix.length).coerceAtLeast(0)
+                }
             TransformedText(transformed, mapping)
         }
         rule.setMaterialContent {
@@ -1217,32 +1154,26 @@
                     )
                 },
                 textStyle = TextStyle(color = Color.White),
-                colors = TextFieldDefaults.textFieldColors(
-                    backgroundColor = Color.White,
-                    unfocusedIndicatorColor = Color.Transparent
-                )
+                colors =
+                    TextFieldDefaults.textFieldColors(
+                        backgroundColor = Color.White,
+                        unfocusedIndicatorColor = Color.Transparent
+                    )
             )
         }
-        rule.onNodeWithTag(TextFieldTag)
-            .captureToImage()
-            .assertPixels {
-                Color.White
-            }
+        rule.onNodeWithTag(TextFieldTag).captureToImage().assertPixels { Color.White }
     }
 
     @Test
     fun testErrorSemantics_defaultMessage() {
         lateinit var errorMessage: String
         rule.setMaterialContent {
-            TextField(
-                value = "test",
-                onValueChange = {},
-                isError = true
-            )
+            TextField(value = "test", onValueChange = {}, isError = true)
             errorMessage = getString(DefaultErrorMessage)
         }
 
-        rule.onNodeWithText("test")
+        rule
+            .onNodeWithText("test")
             .assert(SemanticsMatcher.keyIsDefined(SemanticsProperties.Error))
             .assert(SemanticsMatcher.expectValue(SemanticsProperties.Error, errorMessage))
     }
@@ -1256,20 +1187,23 @@
             TextField(
                 value = "test",
                 onValueChange = {},
-                modifier = Modifier
-                    .testTag(TextFieldTag)
-                    .semantics { if (isError.value) error(errorMessage) },
+                modifier =
+                    Modifier.testTag(TextFieldTag).semantics {
+                        if (isError.value) error(errorMessage)
+                    },
                 isError = isError.value
             )
             defaultErrorMessage = getString(DefaultErrorMessage)
         }
 
-        rule.onNodeWithTag(TextFieldTag)
+        rule
+            .onNodeWithTag(TextFieldTag)
             .assert(SemanticsMatcher.keyIsDefined(SemanticsProperties.Error))
             .assert(SemanticsMatcher.expectValue(SemanticsProperties.Error, errorMessage))
 
         // Check that default error message is overwritten and not lingering in a child node
-        rule.onNodeWithTag(TextFieldTag, useUnmergedTree = true)
+        rule
+            .onNodeWithTag(TextFieldTag, useUnmergedTree = true)
             .onChildren()
             .fetchSemanticsNodes()
             .forEach { node ->
@@ -1286,16 +1220,12 @@
             Box(Modifier.onGloballyPositioned { size = it.size }) {
                 Row(Modifier.height(IntrinsicSize.Min)) {
                     Divider(
-                        modifier = Modifier
-                            .fillMaxHeight()
-                            .width(10.dp)
-                            .onGloballyPositioned { dividerSize = it.size }
+                        modifier =
+                            Modifier.fillMaxHeight().width(10.dp).onGloballyPositioned {
+                                dividerSize = it.size
+                            }
                     )
-                    TextField(
-                        value = "",
-                        label = { Text(text = "Label") },
-                        onValueChange = {}
-                    )
+                    TextField(value = "", label = { Text(text = "Label") }, onValueChange = {})
                 }
             }
         }
@@ -1316,10 +1246,10 @@
             Box {
                 Column(Modifier.width(IntrinsicSize.Min)) {
                     Divider(
-                        modifier = Modifier
-                            .fillMaxWidth()
-                            .height(10.dp)
-                            .onGloballyPositioned { dividerSize = it.size }
+                        modifier =
+                            Modifier.fillMaxWidth().height(10.dp).onGloballyPositioned {
+                                dividerSize = it.size
+                            }
                     )
                     TextField(
                         value = text.value,
@@ -1342,30 +1272,25 @@
     @SdkSuppress(minSdkVersion = Build.VERSION_CODES.O)
     fun testTextField_label_notUsingErrorColor_notFocused_withoutInput() {
         rule.setMaterialContent {
-            Box(
-                Modifier
-                    .background(Color.White)
-                    .padding(10.dp)
-            ) {
+            Box(Modifier.background(Color.White).padding(10.dp)) {
                 TextField(
                     value = "",
                     onValueChange = {},
                     modifier = Modifier.testTag(TextFieldTag),
                     label = { Text("Label") },
                     isError = true,
-                    colors = TextFieldDefaults.textFieldColors(
-                        unfocusedLabelColor = Color.White,
-                        errorLabelColor = Color.Red,
-                        backgroundColor = Color.White,
-                        errorIndicatorColor = Color.White
-                    )
+                    colors =
+                        TextFieldDefaults.textFieldColors(
+                            unfocusedLabelColor = Color.White,
+                            errorLabelColor = Color.Red,
+                            backgroundColor = Color.White,
+                            errorIndicatorColor = Color.White
+                        )
                 )
             }
         }
 
-        rule.onNodeWithTag(TextFieldTag).captureToImage().assertPixels {
-            Color.White
-        }
+        rule.onNodeWithTag(TextFieldTag).captureToImage().assertPixels { Color.White }
     }
 
     @Test
@@ -1386,9 +1311,11 @@
                     contentColor = LocalContentColor.current
                 },
                 modifier = Modifier.focusRequester(focusRequester),
-                colors = TextFieldDefaults.textFieldColors(
-                    unfocusedLabelColor = unfocusedLabelColor, focusedLabelColor = focusedLabelColor
-                )
+                colors =
+                    TextFieldDefaults.textFieldColors(
+                        unfocusedLabelColor = unfocusedLabelColor,
+                        focusedLabelColor = focusedLabelColor
+                    )
             )
         }
 
@@ -1397,9 +1324,7 @@
             assertThat(textStyle.color).isEqualTo(Color.Unspecified)
         }
 
-        rule.runOnUiThread {
-            focusRequester.requestFocus()
-        }
+        rule.runOnUiThread { focusRequester.requestFocus() }
 
         rule.runOnIdle {
             assertThat(contentColor).isEqualTo(focusedLabelColor)
@@ -1428,10 +1353,11 @@
                         contentColor = LocalContentColor.current
                     },
                     modifier = Modifier.focusRequester(focusRequester),
-                    colors = TextFieldDefaults.textFieldColors(
-                        unfocusedLabelColor = unfocusedLabelColor,
-                        focusedLabelColor = focusedLabelColor
-                    )
+                    colors =
+                        TextFieldDefaults.textFieldColors(
+                            unfocusedLabelColor = unfocusedLabelColor,
+                            focusedLabelColor = focusedLabelColor
+                        )
                 )
             }
         }
@@ -1441,9 +1367,7 @@
             assertThat(contentColor).isEqualTo(unfocusedLabelColor)
         }
 
-        rule.runOnUiThread {
-            focusRequester.requestFocus()
-        }
+        rule.runOnUiThread { focusRequester.requestFocus() }
 
         rule.runOnIdle {
             assertThat(textStyle.color).isEqualTo(captionColor)
@@ -1471,17 +1395,16 @@
                         contentColor = LocalContentColor.current
                     },
                     modifier = Modifier.focusRequester(focusRequester),
-                    colors = TextFieldDefaults.textFieldColors(
-                        unfocusedLabelColor = expectedLabelColor,
-                        focusedLabelColor = focusedLabelColor
-                    )
+                    colors =
+                        TextFieldDefaults.textFieldColors(
+                            unfocusedLabelColor = expectedLabelColor,
+                            focusedLabelColor = focusedLabelColor
+                        )
                 )
             }
         }
 
-        rule.runOnUiThread {
-            focusRequester.requestFocus()
-        }
+        rule.runOnUiThread { focusRequester.requestFocus() }
 
         // animation duration is 150, advancing by 75 to get into middle of animation
         rule.mainClock.advanceTimeBy(75)
@@ -1517,10 +1440,11 @@
                         contentColor = LocalContentColor.current
                     },
                     modifier = Modifier.focusRequester(focusRequester),
-                    colors = TextFieldDefaults.textFieldColors(
-                        unfocusedLabelColor = unfocusedLabelColor,
-                        focusedLabelColor = focusedLabelColor
-                    )
+                    colors =
+                        TextFieldDefaults.textFieldColors(
+                            unfocusedLabelColor = unfocusedLabelColor,
+                            focusedLabelColor = focusedLabelColor
+                        )
                 )
             }
         }
@@ -1530,9 +1454,7 @@
             assertThat(contentColor).isEqualTo(unfocusedLabelColor)
         }
 
-        rule.runOnUiThread {
-            focusRequester.requestFocus()
-        }
+        rule.runOnUiThread { focusRequester.requestFocus() }
 
         rule.runOnIdle {
             assertThat(textStyle.color).isEqualTo(captionColor)
@@ -1545,9 +1467,7 @@
         var height = 0
         rule.setMaterialContent {
             val text = remember { mutableStateOf("") }
-            Box(Modifier.onGloballyPositioned {
-                height = it.size.height
-            }) {
+            Box(Modifier.onGloballyPositioned { height = it.size.height }) {
                 Row(Modifier.height(IntrinsicSize.Min)) {
                     TextField(
                         value = text.value,
@@ -1568,9 +1488,7 @@
         var height = 0
         rule.setMaterialContent {
             val text = remember { mutableStateOf("") }
-            Box(Modifier.onGloballyPositioned {
-                height = it.size.height
-            }) {
+            Box(Modifier.onGloballyPositioned { height = it.size.height }) {
                 Row(Modifier.height(IntrinsicSize.Min)) {
                     TextField(
                         value = text.value,
@@ -1595,17 +1513,12 @@
         val text = "Long text input. ".repeat(20)
         rule.setMaterialContent {
             Row {
-                Box(
-                    Modifier
-                        .width(150.dp)
-                        .height(IntrinsicSize.Min)
-                ) {
+                Box(Modifier.width(150.dp).height(IntrinsicSize.Min)) {
                     TextField(
                         value = text,
                         onValueChange = {},
-                        modifier = Modifier.onGloballyPositioned {
-                            tfHeightIntrinsic = it.size.height
-                        },
+                        modifier =
+                            Modifier.onGloballyPositioned { tfHeightIntrinsic = it.size.height },
                         leadingIcon = { Icon(Icons.Default.Favorite, null) },
                         trailingIcon = { Icon(Icons.Default.Favorite, null) },
                     )
@@ -1614,9 +1527,8 @@
                     TextField(
                         value = text,
                         onValueChange = {},
-                        modifier = Modifier.onGloballyPositioned {
-                            tfHeightNoIntrinsic = it.size.height
-                        },
+                        modifier =
+                            Modifier.onGloballyPositioned { tfHeightNoIntrinsic = it.size.height },
                         leadingIcon = { Icon(Icons.Default.Favorite, null) },
                         trailingIcon = { Icon(Icons.Default.Favorite, null) },
                     )
@@ -1651,33 +1563,23 @@
             )
         }
 
-        rule.onNodeWithTag(TextFieldTag)
-            .performClick()
+        rule.onNodeWithTag(TextFieldTag).performClick()
         rule.waitForIdle()
 
-        rule.onNodeWithTag(TextFieldTag)
-            .performTextClearance()
+        rule.onNodeWithTag(TextFieldTag).performTextClearance()
 
-        rule.runOnIdle {
-            assertThat(callbackCounter).isEqualTo(1)
-        }
+        rule.runOnIdle { assertThat(callbackCounter).isEqualTo(1) }
     }
+
     @Test
     fun testTextFields_noCrashConstraintsInfinity() {
 
         rule.setMaterialContent {
             Column(
-                modifier = Modifier
-                    .height(IntrinsicSize.Min)
-                    .horizontalScroll(
-                        rememberScrollState()
-                    )
+                modifier =
+                    Modifier.height(IntrinsicSize.Min).horizontalScroll(rememberScrollState())
             ) {
-                TextField(
-                    value = "Cat",
-                    onValueChange = {},
-                    leadingIcon = { Text("Icon") }
-                )
+                TextField(value = "Cat", onValueChange = {}, leadingIcon = { Text("Icon") })
             }
         }
     }
diff --git a/compose/material/material/src/androidMain/kotlin/androidx/compose/material/AndroidAlertDialog.android.kt b/compose/material/material/src/androidMain/kotlin/androidx/compose/material/AndroidAlertDialog.android.kt
index 4033bc5..d58e0d7 100644
--- a/compose/material/material/src/androidMain/kotlin/androidx/compose/material/AndroidAlertDialog.android.kt
+++ b/compose/material/material/src/androidMain/kotlin/androidx/compose/material/AndroidAlertDialog.android.kt
@@ -38,18 +38,19 @@
     backgroundColor: Color,
     contentColor: Color,
     properties: DialogProperties
-): Unit = AlertDialogImpl(
-    onDismissRequest = onDismissRequest,
-    confirmButton = confirmButton,
-    modifier = modifier,
-    dismissButton = dismissButton,
-    title = title,
-    text = text,
-    shape = shape,
-    backgroundColor = backgroundColor,
-    contentColor = contentColor,
-    properties = properties
-)
+): Unit =
+    AlertDialogImpl(
+        onDismissRequest = onDismissRequest,
+        confirmButton = confirmButton,
+        modifier = modifier,
+        dismissButton = dismissButton,
+        title = title,
+        text = text,
+        shape = shape,
+        backgroundColor = backgroundColor,
+        contentColor = contentColor,
+        properties = properties
+    )
 
 @Composable
 actual fun AlertDialog(
@@ -62,14 +63,15 @@
     backgroundColor: Color,
     contentColor: Color,
     properties: DialogProperties
-): Unit = AlertDialogImpl(
-    onDismissRequest = onDismissRequest,
-    buttons = buttons,
-    modifier = modifier,
-    title = title,
-    text = text,
-    shape = shape,
-    backgroundColor = backgroundColor,
-    contentColor = contentColor,
-    properties = properties
-)
+): Unit =
+    AlertDialogImpl(
+        onDismissRequest = onDismissRequest,
+        buttons = buttons,
+        modifier = modifier,
+        title = title,
+        text = text,
+        shape = shape,
+        backgroundColor = backgroundColor,
+        contentColor = contentColor,
+        properties = properties
+    )
diff --git a/compose/material/material/src/androidMain/kotlin/androidx/compose/material/AndroidMenu.android.kt b/compose/material/material/src/androidMain/kotlin/androidx/compose/material/AndroidMenu.android.kt
index 244e789..b65cdd57 100644
--- a/compose/material/material/src/androidMain/kotlin/androidx/compose/material/AndroidMenu.android.kt
+++ b/compose/material/material/src/androidMain/kotlin/androidx/compose/material/AndroidMenu.android.kt
@@ -36,11 +36,13 @@
 
 @Deprecated(
     level = DeprecationLevel.HIDDEN,
-    replaceWith = ReplaceWith(
-        expression = "DropdownMenu(expanded,onDismissRequest, modifier, offset, " +
-            "rememberScrollState(), properties, content)",
-        "androidx.compose.foundation.rememberScrollState"
-    ),
+    replaceWith =
+        ReplaceWith(
+            expression =
+                "DropdownMenu(expanded,onDismissRequest, modifier, offset, " +
+                    "rememberScrollState(), properties, content)",
+            "androidx.compose.foundation.rememberScrollState"
+        ),
     message = "Replaced by a DropdownMenu function with a ScrollState parameter"
 )
 @Composable
@@ -51,15 +53,16 @@
     offset: DpOffset = DpOffset(0.dp, 0.dp),
     properties: PopupProperties = PopupProperties(focusable = true),
     content: @Composable ColumnScope.() -> Unit
-) = DropdownMenu(
-    expanded = expanded,
-    onDismissRequest = onDismissRequest,
-    modifier = modifier,
-    offset = offset,
-    scrollState = rememberScrollState(),
-    properties = properties,
-    content = content
-)
+) =
+    DropdownMenu(
+        expanded = expanded,
+        onDismissRequest = onDismissRequest,
+        modifier = modifier,
+        offset = offset,
+        scrollState = rememberScrollState(),
+        properties = properties,
+        content = content
+    )
 
 @Composable
 actual fun DropdownMenu(
@@ -77,12 +80,10 @@
     if (expandedStates.currentState || expandedStates.targetState) {
         val transformOriginState = remember { mutableStateOf(TransformOrigin.Center) }
         val density = LocalDensity.current
-        val popupPositionProvider = DropdownMenuPositionProvider(
-            offset,
-            density
-        ) { parentBounds, menuBounds ->
-            transformOriginState.value = calculateTransformOrigin(parentBounds, menuBounds)
-        }
+        val popupPositionProvider =
+            DropdownMenuPositionProvider(offset, density) { parentBounds, menuBounds ->
+                transformOriginState.value = calculateTransformOrigin(parentBounds, menuBounds)
+            }
 
         Popup(
             onDismissRequest = onDismissRequest,
@@ -108,14 +109,14 @@
     contentPadding: PaddingValues,
     interactionSource: MutableInteractionSource?,
     content: @Composable RowScope.() -> Unit
-): Unit = DropdownMenuItemContent(
-    onClick,
-    modifier,
-    enabled,
-    contentPadding,
-    interactionSource,
-    content = content
-)
+): Unit =
+    DropdownMenuItemContent(
+        onClick,
+        modifier,
+        enabled,
+        contentPadding,
+        interactionSource,
+        content = content
+    )
 
-internal actual val DefaultMenuProperties =
-    PopupProperties(focusable = true)
+internal actual val DefaultMenuProperties = PopupProperties(focusable = true)
diff --git a/compose/material/material/src/androidMain/kotlin/androidx/compose/material/DefaultPlatformTextStyle.android.kt b/compose/material/material/src/androidMain/kotlin/androidx/compose/material/DefaultPlatformTextStyle.android.kt
index 46cae05..c9430e4 100644
--- a/compose/material/material/src/androidMain/kotlin/androidx/compose/material/DefaultPlatformTextStyle.android.kt
+++ b/compose/material/material/src/androidMain/kotlin/androidx/compose/material/DefaultPlatformTextStyle.android.kt
@@ -21,7 +21,7 @@
 private const val DefaultIncludeFontPadding = false
 
 @Suppress("DEPRECATION")
-private val DefaultPlatformTextStyle = PlatformTextStyle(
-    includeFontPadding = DefaultIncludeFontPadding
-)
+private val DefaultPlatformTextStyle =
+    PlatformTextStyle(includeFontPadding = DefaultIncludeFontPadding)
+
 internal actual fun defaultPlatformTextStyle(): PlatformTextStyle? = DefaultPlatformTextStyle
diff --git a/compose/material/material/src/androidMain/kotlin/androidx/compose/material/ExposedDropdownMenu.android.kt b/compose/material/material/src/androidMain/kotlin/androidx/compose/material/ExposedDropdownMenu.android.kt
index a8da1da..ecd73db 100644
--- a/compose/material/material/src/androidMain/kotlin/androidx/compose/material/ExposedDropdownMenu.android.kt
+++ b/compose/material/material/src/androidMain/kotlin/androidx/compose/material/ExposedDropdownMenu.android.kt
@@ -68,7 +68,8 @@
 import kotlin.math.max
 
 /**
- * [Material Design Exposed Dropdown Menu](https://material.io/components/menus#exposed-dropdown-menu).
+ * [Material Design Exposed Dropdown
+ * Menu](https://material.io/components/menus#exposed-dropdown-menu).
  *
  * Box for Exposed Dropdown Menu. Expected to contain [TextField] and
  * [ExposedDropdownMenuBoxScope.ExposedDropdownMenu] as a content.
@@ -101,62 +102,57 @@
     val verticalMarginInPx = with(density) { MenuVerticalMargin.roundToPx() }
     val coordinates = remember { Ref<LayoutCoordinates>() }
 
-    val scope = remember(density, menuHeight, width) {
-        object : ExposedDropdownMenuBoxScope() {
-            override fun Modifier.exposedDropdownSize(matchTextFieldWidth: Boolean): Modifier {
-                return with(density) {
-                    heightIn(max = menuHeight.toDp()).let {
-                        if (matchTextFieldWidth) {
-                            it.width(width.toDp())
-                        } else it
+    val scope =
+        remember(density, menuHeight, width) {
+            object : ExposedDropdownMenuBoxScope() {
+                override fun Modifier.exposedDropdownSize(matchTextFieldWidth: Boolean): Modifier {
+                    return with(density) {
+                        heightIn(max = menuHeight.toDp()).let {
+                            if (matchTextFieldWidth) {
+                                it.width(width.toDp())
+                            } else it
+                        }
                     }
                 }
             }
         }
-    }
     val focusRequester = remember { FocusRequester() }
 
     Box(
-        modifier.onGloballyPositioned {
-            width = it.size.width
-            coordinates.value = it
-            updateHeight(
-                view.rootView,
-                coordinates.value,
-                verticalMarginInPx
-            ) { newHeight ->
-                menuHeight = newHeight
+        modifier
+            .onGloballyPositioned {
+                width = it.size.width
+                coordinates.value = it
+                updateHeight(view.rootView, coordinates.value, verticalMarginInPx) { newHeight ->
+                    menuHeight = newHeight
+                }
             }
-        }.expandable(
-            onExpandedChange = { onExpandedChange(!expanded) },
-            menuLabel = getString(Strings.ExposedDropdownMenu)
-        ).focusRequester(focusRequester)
+            .expandable(
+                onExpandedChange = { onExpandedChange(!expanded) },
+                menuLabel = getString(Strings.ExposedDropdownMenu)
+            )
+            .focusRequester(focusRequester)
     ) {
         scope.content()
     }
 
-    SideEffect {
-        if (expanded) focusRequester.requestFocus()
-    }
+    SideEffect { if (expanded) focusRequester.requestFocus() }
 
     DisposableEffect(view) {
-        val listener = OnGlobalLayoutListener(view) {
-            // We want to recalculate the menu height on relayout - e.g. when keyboard shows up.
-            updateHeight(
-                view.rootView,
-                coordinates.value,
-                verticalMarginInPx
-            ) { newHeight ->
-                menuHeight = newHeight
+        val listener =
+            OnGlobalLayoutListener(view) {
+                // We want to recalculate the menu height on relayout - e.g. when keyboard shows up.
+                updateHeight(view.rootView, coordinates.value, verticalMarginInPx) { newHeight ->
+                    menuHeight = newHeight
+                }
             }
-        }
         onDispose { listener.dispose() }
     }
 }
 
 /**
- * Subscribes to onGlobalLayout and correctly removes the callback when the View is detached.
- * Logic copied from AndroidPopup.android.kt.
+ * Subscribes to onGlobalLayout and correctly removes the callback when the View is detached. Logic
+ * copied from AndroidPopup.android.kt.
  */
 private class OnGlobalLayoutListener(
     private val view: View,
@@ -193,37 +189,28 @@
     }
 }
 
-/**
- * Scope for [ExposedDropdownMenuBox].
- */
+/** Scope for [ExposedDropdownMenuBox]. */
 @ExperimentalMaterialApi
 abstract class ExposedDropdownMenuBoxScope {
     /**
-     * Modifier which should be applied to an [ExposedDropdownMenu]
-     * placed inside the scope. It's responsible for
-     * setting the width of the [ExposedDropdownMenu], which
-     * will match the width of the [TextField]
-     * (if [matchTextFieldWidth] is set to true).
-     * Also it'll change the height of [ExposedDropdownMenu], so
-     * it'll take the largest possible height to not overlap
-     * the [TextField] and the software keyboard.
+     * Modifier which should be applied to an [ExposedDropdownMenu] placed inside the scope. It's
+     * responsible for setting the width of the [ExposedDropdownMenu], which will match the width of
+     * the [TextField] (if [matchTextFieldWidth] is set to true). Also it'll change the height of
+     * [ExposedDropdownMenu], so it'll take the largest possible height to not overlap the
+     * [TextField] and the software keyboard.
      *
-     * @param matchTextFieldWidth Whether menu should match
-     * the width of the text field to which it's attached.
-     * If set to true the width will match the width
-     * of the text field.
+     * @param matchTextFieldWidth Whether menu should match the width of the text field to which
+     *   it's attached. If set to true the width will match the width of the text field.
      */
-    abstract fun Modifier.exposedDropdownSize(
-        matchTextFieldWidth: Boolean = true
-    ): Modifier
+    abstract fun Modifier.exposedDropdownSize(matchTextFieldWidth: Boolean = true): Modifier
 
     /**
-     * Popup which contains content for Exposed Dropdown Menu.
-     * Should be used inside the content of [ExposedDropdownMenuBox].
+     * Popup which contains content for Exposed Dropdown Menu. Should be used inside the content of
+     * [ExposedDropdownMenuBox].
      *
      * @param expanded Whether the menu is currently open and visible to the user
-     * @param onDismissRequest Called when the user requests to dismiss the menu, such as by
-     * tapping outside the menu's bounds
+     * @param onDismissRequest Called when the user requests to dismiss the menu, such as by tapping
+     *   outside the menu's bounds
      * @param modifier The modifier to apply to this layout
      * @param scrollState a [ScrollState] to used by the menu's content for items vertical scrolling
      * @param content The content of the [ExposedDropdownMenu]
@@ -251,12 +238,10 @@
         if (expandedStates.currentState || expandedStates.targetState) {
             val transformOriginState = remember { mutableStateOf(TransformOrigin.Center) }
             val density = LocalDensity.current
-            val popupPositionProvider = DropdownMenuPositionProvider(
-                DpOffset.Zero,
-                density
-            ) { parentBounds, menuBounds ->
-                transformOriginState.value = calculateTransformOrigin(parentBounds, menuBounds)
-            }
+            val popupPositionProvider =
+                DropdownMenuPositionProvider(DpOffset.Zero, density) { parentBounds, menuBounds ->
+                    transformOriginState.value = calculateTransformOrigin(parentBounds, menuBounds)
+                }
 
             ExposedDropdownMenuPopup(
                 onDismissRequest = onDismissRequest,
@@ -274,38 +259,28 @@
     }
 }
 
-/**
- * Contains default values used by Exposed Dropdown Menu.
- */
+/** Contains default values used by Exposed Dropdown Menu. */
 @ExperimentalMaterialApi
 object ExposedDropdownMenuDefaults {
     /**
      * Default trailing icon for Exposed Dropdown Menu.
      *
-     * @param expanded Whether [ExposedDropdownMenuBoxScope.ExposedDropdownMenu]
-     * is expanded or not. Affects the appearance of the icon.
+     * @param expanded Whether [ExposedDropdownMenuBoxScope.ExposedDropdownMenu] is expanded or not.
+     *   Affects the appearance of the icon.
      * @param onIconClick Called when the icon was clicked.
      */
     @ExperimentalMaterialApi
     @Composable
-    fun TrailingIcon(
-        expanded: Boolean,
-        onIconClick: () -> Unit = {}
-    ) {
+    fun TrailingIcon(expanded: Boolean, onIconClick: () -> Unit = {}) {
         // Clear semantics here as otherwise icon will be a11y focusable but without an
         // action. When there's an API to check if Talkback is on, developer will be able to
         // expand the menu on icon click in a11y mode only esp. if using their own custom
         // trailing icon.
-        IconButton(onClick = onIconClick, modifier = Modifier.clearAndSetSemantics { }) {
+        IconButton(onClick = onIconClick, modifier = Modifier.clearAndSetSemantics {}) {
             Icon(
                 Icons.Filled.ArrowDropDown,
                 "Trailing icon for exposed dropdown menu",
-                Modifier.rotate(
-                    if (expanded)
-                        180f
-                    else
-                        360f
-                )
+                Modifier.rotate(if (expanded) 180f else 360f)
             )
         }
     }
@@ -315,43 +290,41 @@
      * (including label, placeholder, leading and trailing icons) colors used in a [TextField].
      *
      * @param textColor Represents the color used for the input text of this text field.
-     * @param disabledTextColor Represents the color used for the input text of this text field
-     * when it's disabled.
+     * @param disabledTextColor Represents the color used for the input text of this text field when
+     *   it's disabled.
      * @param backgroundColor Represents the background color for this text field.
      * @param cursorColor Represents the cursor color for this text field.
-     * @param errorCursorColor Represents the cursor color for this text field
-     * when it's in error state.
-     * @param focusedIndicatorColor Represents the indicator color for this text field
-     * when it's focused.
-     * @param unfocusedIndicatorColor Represents the indicator color for this text field
-     * when it's not focused.
-     * @param disabledIndicatorColor Represents the indicator color for this text field
-     * when it's disabled.
-     * @param errorIndicatorColor Represents the indicator color for this text field
-     * when it's in error state.
+     * @param errorCursorColor Represents the cursor color for this text field when it's in error
+     *   state.
+     * @param focusedIndicatorColor Represents the indicator color for this text field when it's
+     *   focused.
+     * @param unfocusedIndicatorColor Represents the indicator color for this text field when it's
+     *   not focused.
+     * @param disabledIndicatorColor Represents the indicator color for this text field when it's
+     *   disabled.
+     * @param errorIndicatorColor Represents the indicator color for this text field when it's in
+     *   error state.
      * @param leadingIconColor Represents the leading icon color for this text field.
-     * @param disabledLeadingIconColor Represents the leading icon color for this text field
-     * when it's disabled.
-     * @param errorLeadingIconColor Represents the leading icon color for this text field
-     * when it's in error state.
+     * @param disabledLeadingIconColor Represents the leading icon color for this text field when
+     *   it's disabled.
+     * @param errorLeadingIconColor Represents the leading icon color for this text field when it's
+     *   in error state.
      * @param trailingIconColor Represents the trailing icon color for this text field.
-     * @param focusedTrailingIconColor Represents the trailing icon color for this text field
-     * when it's focused.
-     * @param disabledTrailingIconColor Represents the trailing icon color for this text field
-     * when it's disabled.
-     * @param errorTrailingIconColor Represents the trailing icon color for this text field
-     * when it's in error state.
-     * @param focusedLabelColor Represents the label color for this text field
-     * when it's focused.
-     * @param unfocusedLabelColor Represents the label color for this text field
-     * when it's not focused.
-     * @param disabledLabelColor Represents the label color for this text field
-     * when it's disabled.
-     * @param errorLabelColor Represents the label color for this text field
-     * when it's in error state.
+     * @param focusedTrailingIconColor Represents the trailing icon color for this text field when
+     *   it's focused.
+     * @param disabledTrailingIconColor Represents the trailing icon color for this text field when
+     *   it's disabled.
+     * @param errorTrailingIconColor Represents the trailing icon color for this text field when
+     *   it's in error state.
+     * @param focusedLabelColor Represents the label color for this text field when it's focused.
+     * @param unfocusedLabelColor Represents the label color for this text field when it's not
+     *   focused.
+     * @param disabledLabelColor Represents the label color for this text field when it's disabled.
+     * @param errorLabelColor Represents the label color for this text field when it's in error
+     *   state.
      * @param placeholderColor Represents the placeholder color for this text field.
-     * @param disabledPlaceholderColor Represents the placeholder color for this text field
-     * when it's disabled.
+     * @param disabledPlaceholderColor Represents the placeholder color for this text field when
+     *   it's disabled.
      */
     @Composable
     fun textFieldColors(
@@ -361,8 +334,7 @@
             MaterialTheme.colors.onSurface.copy(alpha = TextFieldDefaults.BackgroundOpacity),
         cursorColor: Color = MaterialTheme.colors.primary,
         errorCursorColor: Color = MaterialTheme.colors.error,
-        focusedIndicatorColor: Color =
-            MaterialTheme.colors.primary.copy(alpha = ContentAlpha.high),
+        focusedIndicatorColor: Color = MaterialTheme.colors.primary.copy(alpha = ContentAlpha.high),
         unfocusedIndicatorColor: Color =
             MaterialTheme.colors.onSurface.copy(
                 alpha = TextFieldDefaults.UnfocusedIndicatorLineOpacity
@@ -379,8 +351,7 @@
             MaterialTheme.colors.primary.copy(alpha = ContentAlpha.high),
         disabledTrailingIconColor: Color = trailingIconColor.copy(alpha = ContentAlpha.disabled),
         errorTrailingIconColor: Color = MaterialTheme.colors.error,
-        focusedLabelColor: Color =
-            MaterialTheme.colors.primary.copy(alpha = ContentAlpha.high),
+        focusedLabelColor: Color = MaterialTheme.colors.primary.copy(alpha = ContentAlpha.high),
         unfocusedLabelColor: Color = MaterialTheme.colors.onSurface.copy(ContentAlpha.medium),
         disabledLabelColor: Color = unfocusedLabelColor.copy(ContentAlpha.disabled),
         errorLabelColor: Color = MaterialTheme.colors.error,
@@ -418,43 +389,40 @@
      * [OutlinedTextField].
      *
      * @param textColor Represents the color used for the input text of this text field.
-     * @param disabledTextColor Represents the color used for the input text of this text field
-     * when it's disabled.
+     * @param disabledTextColor Represents the color used for the input text of this text field when
+     *   it's disabled.
      * @param backgroundColor Represents the background color for this text field.
      * @param cursorColor Represents the cursor color for this text field.
-     * @param errorCursorColor Represents the cursor color for this text field
-     * when it's in error state.
-     * @param focusedBorderColor Represents the border color for this text field
-     * when it's focused.
-     * @param unfocusedBorderColor Represents the border color for this text field
-     * when it's not focused.
-     * @param disabledBorderColor Represents the border color for this text field
-     * when it's disabled.
-     * @param errorBorderColor Represents the border color for this text field
-     * when it's in error state.
+     * @param errorCursorColor Represents the cursor color for this text field when it's in error
+     *   state.
+     * @param focusedBorderColor Represents the border color for this text field when it's focused.
+     * @param unfocusedBorderColor Represents the border color for this text field when it's not
+     *   focused.
+     * @param disabledBorderColor Represents the border color for this text field when it's
+     *   disabled.
+     * @param errorBorderColor Represents the border color for this text field when it's in error
+     *   state.
      * @param leadingIconColor Represents the leading icon color for this text field.
-     * @param disabledLeadingIconColor Represents the leading icon color for this text field
-     * when it's disabled.
-     * @param errorLeadingIconColor Represents the leading icon color for this text field
-     * when it's in error state.
+     * @param disabledLeadingIconColor Represents the leading icon color for this text field when
+     *   it's disabled.
+     * @param errorLeadingIconColor Represents the leading icon color for this text field when it's
+     *   in error state.
      * @param trailingIconColor Represents the trailing icon color for this text field.
-     * @param focusedTrailingIconColor Represents the trailing icon color for this text field
-     * when it's focused.
-     * @param disabledTrailingIconColor Represents the trailing icon color for this text field
-     * when it's disabled.
-     * @param errorTrailingIconColor Represents the trailing icon color for this text field
-     * when it's in error state.
-     * @param focusedLabelColor Represents the label color for this text field
-     * when it's focused.
-     * @param unfocusedLabelColor Represents the label color for this text field
-     * when it's not focused.
-     * @param disabledLabelColor Represents the label color for this text field
-     * when it's disabled.
-     * @param errorLabelColor Represents the label color for this text field
-     * when it's in error state.
+     * @param focusedTrailingIconColor Represents the trailing icon color for this text field when
+     *   it's focused.
+     * @param disabledTrailingIconColor Represents the trailing icon color for this text field when
+     *   it's disabled.
+     * @param errorTrailingIconColor Represents the trailing icon color for this text field when
+     *   it's in error state.
+     * @param focusedLabelColor Represents the label color for this text field when it's focused.
+     * @param unfocusedLabelColor Represents the label color for this text field when it's not
+     *   focused.
+     * @param disabledLabelColor Represents the label color for this text field when it's disabled.
+     * @param errorLabelColor Represents the label color for this text field when it's in error
+     *   state.
      * @param placeholderColor Represents the placeholder color for this text field.
-     * @param disabledPlaceholderColor Represents the placeholder color for this text field
-     * when it's disabled.
+     * @param disabledPlaceholderColor Represents the placeholder color for this text field when
+     *   it's disabled.
      */
     @Composable
     fun outlinedTextFieldColors(
@@ -463,8 +431,7 @@
         backgroundColor: Color = Color.Transparent,
         cursorColor: Color = MaterialTheme.colors.primary,
         errorCursorColor: Color = MaterialTheme.colors.error,
-        focusedBorderColor: Color =
-            MaterialTheme.colors.primary.copy(alpha = ContentAlpha.high),
+        focusedBorderColor: Color = MaterialTheme.colors.primary.copy(alpha = ContentAlpha.high),
         unfocusedBorderColor: Color =
             MaterialTheme.colors.onSurface.copy(alpha = ContentAlpha.disabled),
         disabledBorderColor: Color = unfocusedBorderColor.copy(alpha = ContentAlpha.disabled),
@@ -479,8 +446,7 @@
             MaterialTheme.colors.primary.copy(alpha = ContentAlpha.high),
         disabledTrailingIconColor: Color = trailingIconColor.copy(alpha = ContentAlpha.disabled),
         errorTrailingIconColor: Color = MaterialTheme.colors.error,
-        focusedLabelColor: Color =
-            MaterialTheme.colors.primary.copy(alpha = ContentAlpha.high),
+        focusedLabelColor: Color = MaterialTheme.colors.primary.copy(alpha = ContentAlpha.high),
         unfocusedLabelColor: Color = MaterialTheme.colors.onSurface.copy(ContentAlpha.medium),
         disabledLabelColor: Color = unfocusedLabelColor.copy(ContentAlpha.disabled),
         errorLabelColor: Color = MaterialTheme.colors.error,
@@ -513,26 +479,26 @@
         )
 }
 
-private fun Modifier.expandable(
-    onExpandedChange: () -> Unit,
-    menuLabel: String
-) = pointerInput(onExpandedChange) {
-    awaitEachGesture {
-        // Must be PointerEventPass.Initial to observe events before the text field consumes them
-        // in the Main pass
-        awaitFirstDown(pass = PointerEventPass.Initial)
-        val upEvent = waitForUpOrCancellation(pass = PointerEventPass.Initial)
-        if (upEvent != null) {
-            onExpandedChange()
+private fun Modifier.expandable(onExpandedChange: () -> Unit, menuLabel: String) =
+    pointerInput(onExpandedChange) {
+            awaitEachGesture {
+                // Must be PointerEventPass.Initial to observe events before the text field consumes
+                // them
+                // in the Main pass
+                awaitFirstDown(pass = PointerEventPass.Initial)
+                val upEvent = waitForUpOrCancellation(pass = PointerEventPass.Initial)
+                if (upEvent != null) {
+                    onExpandedChange()
+                }
+            }
         }
-    }
-}.semantics {
-    contentDescription = menuLabel // this should be a localised string
-    onClick {
-        onExpandedChange()
-        true
-    }
-}
+        .semantics {
+            contentDescription = menuLabel // this should be a localised string
+            onClick {
+                onExpandedChange()
+                true
+            }
+        }
 
 private fun updateHeight(
     view: View,
@@ -541,10 +507,11 @@
     onHeightUpdate: (Int) -> Unit
 ) {
     coordinates ?: return
-    val visibleWindowBounds = Rect().let {
-        view.getWindowVisibleDisplayFrame(it)
-        it
-    }
+    val visibleWindowBounds =
+        Rect().let {
+            view.getWindowVisibleDisplayFrame(it)
+            it
+        }
     val heightAbove = coordinates.boundsInWindow().top - visibleWindowBounds.top
     val heightBelow =
         visibleWindowBounds.bottom - visibleWindowBounds.top - coordinates.boundsInWindow().bottom
@@ -628,12 +595,13 @@
     ): State<Color> {
         val focused by interactionSource.collectIsFocusedAsState()
 
-        val targetValue = when {
-            !enabled -> disabledIndicatorColor
-            isError -> errorIndicatorColor
-            focused -> focusedIndicatorColor
-            else -> unfocusedIndicatorColor
-        }
+        val targetValue =
+            when {
+                !enabled -> disabledIndicatorColor
+                isError -> errorIndicatorColor
+                focused -> focusedIndicatorColor
+                else -> unfocusedIndicatorColor
+            }
         return if (enabled) {
             animateColorAsState(targetValue, tween(durationMillis = AnimationDuration))
         } else {
@@ -659,12 +627,13 @@
     ): State<Color> {
         val focused by interactionSource.collectIsFocusedAsState()
 
-        val targetValue = when {
-            !enabled -> disabledLabelColor
-            error -> errorLabelColor
-            focused -> focusedLabelColor
-            else -> unfocusedLabelColor
-        }
+        val targetValue =
+            when {
+                !enabled -> disabledLabelColor
+                error -> errorLabelColor
+                focused -> focusedLabelColor
+                else -> unfocusedLabelColor
+            }
         return rememberUpdatedState(targetValue)
     }
 
diff --git a/compose/material/material/src/androidMain/kotlin/androidx/compose/material/SystemBarsDefaultInsets.android.kt b/compose/material/material/src/androidMain/kotlin/androidx/compose/material/SystemBarsDefaultInsets.android.kt
index fcb25cf..6977a047 100644
--- a/compose/material/material/src/androidMain/kotlin/androidx/compose/material/SystemBarsDefaultInsets.android.kt
+++ b/compose/material/material/src/androidMain/kotlin/androidx/compose/material/SystemBarsDefaultInsets.android.kt
@@ -21,5 +21,4 @@
 import androidx.compose.runtime.Composable
 
 internal actual val WindowInsets.Companion.systemBarsForVisualComponents: WindowInsets
-    @Composable
-    get() = systemBars
+    @Composable get() = systemBars
diff --git a/compose/material/material/src/androidMain/kotlin/androidx/compose/material/internal/ExposedDropdownMenuPopup.android.kt b/compose/material/material/src/androidMain/kotlin/androidx/compose/material/internal/ExposedDropdownMenuPopup.android.kt
index e810b09..b8d0db3 100644
--- a/compose/material/material/src/androidMain/kotlin/androidx/compose/material/internal/ExposedDropdownMenuPopup.android.kt
+++ b/compose/material/material/src/androidMain/kotlin/androidx/compose/material/internal/ExposedDropdownMenuPopup.android.kt
@@ -91,29 +91,29 @@
     val popupId = rememberSaveable { UUID.randomUUID() }
     val popupLayout = remember {
         PopupLayout(
-            onDismissRequest = onDismissRequest,
-            testTag = testTag,
-            composeView = view,
-            density = density,
-            initialPositionProvider = popupPositionProvider,
-            popupId = popupId
-        ).apply {
-            setContent(parentComposition) {
-                SimpleStack(
-                    Modifier
-                        .semantics { this.popup() }
-                        // Get the size of the content
-                        .onSizeChanged {
-                            popupContentSize = it
-                            updatePosition()
-                        }
-                        // Hide the popup while we can't position it correctly
-                        .alpha(if (canCalculatePosition) 1f else 0f)
-                ) {
-                    currentContent()
+                onDismissRequest = onDismissRequest,
+                testTag = testTag,
+                composeView = view,
+                density = density,
+                initialPositionProvider = popupPositionProvider,
+                popupId = popupId
+            )
+            .apply {
+                setContent(parentComposition) {
+                    SimpleStack(
+                        Modifier.semantics { this.popup() }
+                            // Get the size of the content
+                            .onSizeChanged {
+                                popupContentSize = it
+                                updatePosition()
+                            }
+                            // Hide the popup while we can't position it correctly
+                            .alpha(if (canCalculatePosition) 1f else 0f)
+                    ) {
+                        currentContent()
+                    }
                 }
             }
-        }
     }
 
     DisposableEffect(popupLayout) {
@@ -149,17 +149,18 @@
     // Get the parent's position, size and layout direction
     Layout(
         content = {},
-        modifier = Modifier.onGloballyPositioned { childCoordinates ->
-            val coordinates = childCoordinates.parentLayoutCoordinates!!
-            val layoutSize = coordinates.size
+        modifier =
+            Modifier.onGloballyPositioned { childCoordinates ->
+                val coordinates = childCoordinates.parentLayoutCoordinates!!
+                val layoutSize = coordinates.size
 
-            val position = coordinates.positionInWindow()
-            val layoutPosition = IntOffset(position.x.roundToInt(), position.y.roundToInt())
+                val position = coordinates.positionInWindow()
+                val layoutPosition = IntOffset(position.x.roundToInt(), position.y.roundToInt())
 
-            popupLayout.parentBounds = IntRect(layoutPosition, layoutSize)
-            // Update the popup's position
-            popupLayout.updatePosition()
-        }
+                popupLayout.parentBounds = IntRect(layoutPosition, layoutSize)
+                // Update the popup's position
+                popupLayout.updatePosition()
+            }
     ) { _, _ ->
         popupLayout.parentLayoutDirection = layoutDirection
         layout(0, 0) {}
@@ -181,9 +182,7 @@
             0 -> layout(0, 0) {}
             1 -> {
                 val p = measurables[0].measure(constraints)
-                layout(p.width, p.height) {
-                    p.placeRelative(0, 0)
-                }
+                layout(p.width, p.height) { p.placeRelative(0, 0) }
             }
             else -> {
                 val placeables = measurables.fastMap { it.measure(constraints) }
@@ -218,7 +217,8 @@
     density: Density,
     initialPositionProvider: PopupPositionProvider,
     popupId: UUID
-) : AbstractComposeView(composeView.context),
+) :
+    AbstractComposeView(composeView.context),
     ViewRootForInspector,
     ViewTreeObserver.OnGlobalLayoutListener {
     private val windowManager =
@@ -244,14 +244,17 @@
     private val previousWindowVisibleFrame = Rect()
     private val tmpWindowVisibleFrame = Rect()
 
-    override val subCompositionView: AbstractComposeView get() = this
+    override val subCompositionView: AbstractComposeView
+        get() = this
 
     // Specific to exposed dropdown menus.
     private val dismissOnOutsideClick = { offset: Offset?, bounds: IntRect ->
         if (offset == null) false
         else {
-            offset.x < bounds.left || offset.x > bounds.right ||
-                offset.y < bounds.top || offset.y > bounds.bottom
+            offset.x < bounds.left ||
+                offset.x > bounds.right ||
+                offset.y < bounds.top ||
+                offset.y > bounds.bottom
         }
     }
 
@@ -273,14 +276,17 @@
         // Note that the outline affects clickable area for the dismiss listener. In case of shapes
         // like circle the area for dismiss might be to small (rectangular outline consuming clicks
         // outside of the circle).
-        outlineProvider = object : ViewOutlineProvider() {
-            override fun getOutline(view: View, result: Outline) {
-                result.setRect(0, 0, view.width, view.height)
-                // We set alpha to 0 to hide the view's shadow and let the composable to draw its
-                // own shadow. This still enables us to get the extra space needed in the surface.
-                result.alpha = 0f
+        outlineProvider =
+            object : ViewOutlineProvider() {
+                override fun getOutline(view: View, result: Outline) {
+                    result.setRect(0, 0, view.width, view.height)
+                    // We set alpha to 0 to hide the view's shadow and let the composable to draw
+                    // its
+                    // own shadow. This still enables us to get the extra space needed in the
+                    // surface.
+                    result.alpha = 0f
+                }
             }
-        }
     }
 
     private var content: @Composable () -> Unit by mutableStateOf({})
@@ -303,9 +309,7 @@
         content()
     }
 
-    /**
-     * Taken from PopupWindow
-     */
+    /** Taken from PopupWindow */
     override fun dispatchKeyEvent(event: KeyEvent): Boolean {
         if (event.keyCode == KeyEvent.KEYCODE_BACK) {
             if (keyDispatcherState == null) {
@@ -336,25 +340,25 @@
         superSetLayoutDirection(layoutDirection)
     }
 
-    /**
-     * Updates the position of the popup based on current position properties.
-     */
+    /** Updates the position of the popup based on current position properties. */
     fun updatePosition() {
         val parentBounds = parentBounds ?: return
         val popupContentSize = popupContentSize ?: return
 
-        val windowSize = previousWindowVisibleFrame.let {
-            composeView.getWindowVisibleDisplayFrame(it)
-            val bounds = it.toIntBounds()
-            IntSize(width = bounds.width, height = bounds.height)
-        }
+        val windowSize =
+            previousWindowVisibleFrame.let {
+                composeView.getWindowVisibleDisplayFrame(it)
+                val bounds = it.toIntBounds()
+                IntSize(width = bounds.width, height = bounds.height)
+            }
 
-        val popupPosition = positionProvider.calculatePosition(
-            parentBounds,
-            windowSize,
-            parentLayoutDirection,
-            popupContentSize
-        )
+        val popupPosition =
+            positionProvider.calculatePosition(
+                parentBounds,
+                windowSize,
+                parentLayoutDirection,
+                popupContentSize
+            )
 
         params.x = popupPosition.x
         params.y = popupPosition.y
@@ -362,9 +366,7 @@
         windowManager.updateViewLayout(this, params)
     }
 
-    /**
-     * Remove the view from the [WindowManager].
-     */
+    /** Remove the view from the [WindowManager]. */
     fun dismiss() {
         setViewTreeLifecycleOwner(null)
         composeView.viewTreeObserver.removeOnGlobalLayoutListener(this)
@@ -372,8 +374,8 @@
     }
 
     /**
-     * Handles touch screen motion events and calls [onDismissRequest] when the
-     * users clicks outside the popup.
+     * Handles touch screen motion events and calls [onDismissRequest] when the users clicks outside
+     * the popup.
      */
     override fun onTouchEvent(event: MotionEvent?): Boolean {
         event ?: return super.onTouchEvent(event)
@@ -382,17 +384,23 @@
         // matter whether we return true or false as some upper layer decides on whether the
         // event is propagated to other windows or not. So for focusable the event is consumed but
         // for not focusable it is propagated to other windows.
-        if ((event.action == MotionEvent.ACTION_DOWN &&
+        if (
+            (event.action == MotionEvent.ACTION_DOWN &&
                 (event.x < 0 || event.x >= width || event.y < 0 || event.y >= height)) ||
-            event.action == MotionEvent.ACTION_OUTSIDE
+                event.action == MotionEvent.ACTION_OUTSIDE
         ) {
             val parentBounds = parentBounds
-            val shouldDismiss = parentBounds == null || dismissOnOutsideClick(
-                // Keep menu open if ACTION_OUTSIDE event is reported as raw coordinates of (0, 0).
-                // This means it belongs to another owner, e.g., the soft keyboard or other window.
-                if (event.rawX != 0f && event.rawY != 0f) Offset(event.rawX, event.rawY) else null,
-                parentBounds
-            )
+            val shouldDismiss =
+                parentBounds == null ||
+                    dismissOnOutsideClick(
+                        // Keep menu open if ACTION_OUTSIDE event is reported as raw coordinates of
+                        // (0, 0).
+                        // This means it belongs to another owner, e.g., the soft keyboard or other
+                        // window.
+                        if (event.rawX != 0f && event.rawY != 0f) Offset(event.rawX, event.rawY)
+                        else null,
+                        parentBounds
+                    )
             if (shouldDismiss) {
                 onDismissRequest?.invoke()
                 return true
@@ -408,25 +416,25 @@
 
     // Sets the "real" layout direction for our content that we obtain from the parent composition.
     private fun superSetLayoutDirection(layoutDirection: LayoutDirection) {
-        val direction = when (layoutDirection) {
-            LayoutDirection.Ltr -> android.util.LayoutDirection.LTR
-            LayoutDirection.Rtl -> android.util.LayoutDirection.RTL
-        }
+        val direction =
+            when (layoutDirection) {
+                LayoutDirection.Ltr -> android.util.LayoutDirection.LTR
+                LayoutDirection.Rtl -> android.util.LayoutDirection.RTL
+            }
         super.setLayoutDirection(direction)
     }
 
-    /**
-     * Initialize the LayoutParams specific to [android.widget.PopupWindow].
-     */
+    /** Initialize the LayoutParams specific to [android.widget.PopupWindow]. */
     private fun createLayoutParams(): WindowManager.LayoutParams {
         return WindowManager.LayoutParams().apply {
             // Start to position the popup in the top left corner, a new position will be calculated
             gravity = Gravity.START or Gravity.TOP
 
             // Flags specific to exposed dropdown menu.
-            flags = WindowManager.LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH or
-                WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL or
-                WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM
+            flags =
+                WindowManager.LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH or
+                    WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL or
+                    WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM
             softInputMode = WindowManager.LayoutParams.SOFT_INPUT_STATE_UNCHANGED
 
             type = WindowManager.LayoutParams.TYPE_APPLICATION_PANEL
@@ -446,12 +454,7 @@
         }
     }
 
-    private fun Rect.toIntBounds() = IntRect(
-        left = left,
-        top = top,
-        right = right,
-        bottom = bottom
-    )
+    private fun Rect.toIntBounds() = IntRect(left = left, top = top, right = right, bottom = bottom)
 
     override fun onGlobalLayout() {
         // Update the position of the popup, in case getWindowVisibleDisplayFrame has changed.
diff --git a/compose/material/material/src/androidUnitTest/kotlin/androidx/compose/material/DraggableAnchorsTest.kt b/compose/material/material/src/androidUnitTest/kotlin/androidx/compose/material/DraggableAnchorsTest.kt
index 6025350..1925376 100644
--- a/compose/material/material/src/androidUnitTest/kotlin/androidx/compose/material/DraggableAnchorsTest.kt
+++ b/compose/material/material/src/androidUnitTest/kotlin/androidx/compose/material/DraggableAnchorsTest.kt
@@ -43,7 +43,7 @@
 
     @Test
     fun draggableAnchors_get_nonexistentAnchor_returnsNaN() {
-        val anchors = DraggableAnchors<TestValue> { }
+        val anchors = DraggableAnchors<TestValue> {}
         assertThat(anchors.positionOf(A)).isNaN()
     }
 
@@ -54,12 +54,9 @@
             B at 100f
             C at 200f
         }
-        assertThat(anchors.closestAnchor(25f))
-            .isEqualTo(A)
-        assertThat(anchors.closestAnchor(75f))
-            .isEqualTo(B)
-        assertThat(anchors.closestAnchor(175f))
-            .isEqualTo(C)
+        assertThat(anchors.closestAnchor(25f)).isEqualTo(A)
+        assertThat(anchors.closestAnchor(75f)).isEqualTo(B)
+        assertThat(anchors.closestAnchor(175f)).isEqualTo(C)
     }
 
     @Test
@@ -68,10 +65,8 @@
             A at 0f
             B at 100f
         }
-        assertThat(anchors.closestAnchor(1f, searchUpwards = true))
-            .isEqualTo(B)
-        assertThat(anchors.closestAnchor(99f, searchUpwards = false))
-            .isEqualTo(A)
+        assertThat(anchors.closestAnchor(1f, searchUpwards = true)).isEqualTo(B)
+        assertThat(anchors.closestAnchor(99f, searchUpwards = false)).isEqualTo(A)
     }
 
     @Test
@@ -94,12 +89,14 @@
 
     @Test
     fun draggableAnchors_hasAnchorFor() {
-        val anchors = DraggableAnchors {
-            A at 100f
-        }
+        val anchors = DraggableAnchors { A at 100f }
         assertThat(anchors.positionOf(A)).isEqualTo(100f)
         assertThat(anchors.hasAnchorFor(A)).isTrue()
     }
 }
 
-private enum class TestValue { A, B, C }
+private enum class TestValue {
+    A,
+    B,
+    C
+}
diff --git a/compose/material/material/src/androidUnitTest/kotlin/androidx/compose/material/InternalMutatorMutexTest.kt b/compose/material/material/src/androidUnitTest/kotlin/androidx/compose/material/InternalMutatorMutexTest.kt
index b603846..d10ee31 100644
--- a/compose/material/material/src/androidUnitTest/kotlin/androidx/compose/material/InternalMutatorMutexTest.kt
+++ b/compose/material/material/src/androidUnitTest/kotlin/androidx/compose/material/InternalMutatorMutexTest.kt
@@ -44,17 +44,12 @@
     }
 
     class MutateWithoutReceiverCaller(private val mutex: InternalMutatorMutex) : MutateCaller {
-        override suspend fun <R> mutate(
-            priority: MutatePriority,
-            block: suspend () -> R
-        ): R = mutex.mutate(priority, block)
+        override suspend fun <R> mutate(priority: MutatePriority, block: suspend () -> R): R =
+            mutex.mutate(priority, block)
     }
 
     class MutateWithReceiverCaller(private val mutex: InternalMutatorMutex) : MutateCaller {
-        override suspend fun <R> mutate(
-            priority: MutatePriority,
-            block: suspend () -> R
-        ): R {
+        override suspend fun <R> mutate(priority: MutatePriority, block: suspend () -> R): R {
             val receiver = Any()
             return mutex.mutateWith(receiver, priority) {
                 assertSame("mutateWith receiver", receiver, this)
@@ -64,112 +59,127 @@
     }
 
     @Test
-    fun newMutatorCancelsOld() = runBlocking<Unit> {
-        val mutex = InternalMutatorMutex()
-        runNewMutatorCancelsOld(MutateWithoutReceiverCaller(mutex))
-        runNewMutatorCancelsOld(MutateWithReceiverCaller(mutex))
-    }
-
-    private suspend fun runNewMutatorCancelsOld(mutex: MutateCaller) = coroutineScope<Unit> {
-        val firstMutatorJob = launch(start = CoroutineStart.UNDISPATCHED) {
-            mutex.mutate {
-                // Suspend forever
-                suspendCancellableCoroutine<Unit> { }
-            }
-            fail("mutator should have thrown CancellationException")
+    fun newMutatorCancelsOld() =
+        runBlocking<Unit> {
+            val mutex = InternalMutatorMutex()
+            runNewMutatorCancelsOld(MutateWithoutReceiverCaller(mutex))
+            runNewMutatorCancelsOld(MutateWithReceiverCaller(mutex))
         }
 
-        // Cancel firstMutatorJob
-        mutex.mutate { }
-        assertTrue("first mutator was cancelled", firstMutatorJob.isCancelled)
-    }
-
-    @Test
-    fun mutatorsCancelByPriority() = runBlocking<Unit> {
-        val mutex = InternalMutatorMutex()
-        runMutatorsCancelByPriority(MutateWithoutReceiverCaller(mutex))
-        runMutatorsCancelByPriority(MutateWithReceiverCaller(mutex))
-    }
-
-    @Test
-    fun tryMutateBlockingSuspendsSubsequentMutate() = runBlocking<Unit> {
-        val mutex = InternalMutatorMutex()
-        val tryMutateJob = launch(start = CoroutineStart.LAZY) {
-            mutex.tryMutate {
-                while (true) { /* Block forever */ }
-            }
-        }
-        val mutateJob = launch(start = CoroutineStart.LAZY) {
-            mutex.mutate {
-                if (tryMutateJob.isActive) fail("Attempted to mutate before tryMutate finished")
-            }
-        }
-        tryMutateJob.start()
-        mutateJob.start()
-
-        tryMutateJob.cancelAndJoin()
-        mutateJob.cancelAndJoin()
-    }
-
-    @Test
-    fun tryMutateDoesNotOverrideActiveCaller() = runBlocking<Unit> {
-        val mutex = InternalMutatorMutex()
-        val mutateJob = launch(start = CoroutineStart.UNDISPATCHED) {
-            mutex.mutate {
-                suspendCancellableCoroutine { } // Suspend forever
-            }
-        }
-        val tryMutateSuccessful = mutex.tryMutate { }
-        Assert.assertFalse(
-            "tryMutate should not run if there is an ongoing mutation",
-            tryMutateSuccessful
-        )
-        mutateJob.cancelAndJoin()
-    }
-
-    @Test
-    fun tryMutateBlockingTryMutateLocks() = runBlocking<Unit> {
-        val mutex = InternalMutatorMutex()
-        mutex.tryMutate {
-            val tryMutateSuccessful = mutex.tryMutate { }
-            Assert.assertFalse(
-                "tryMutate should not run if there is an ongoing mutation",
-                tryMutateSuccessful
-            )
-        }
-    }
-
-    private suspend fun runMutatorsCancelByPriority(mutex: MutateCaller) = coroutineScope<Unit> {
-        for (firstPriority in MutatePriority.values()) {
-            for (secondPriority in MutatePriority.values()) {
-                val firstMutatorJob = launch(start = CoroutineStart.UNDISPATCHED) {
-                    mutex.mutate(firstPriority) {
+    private suspend fun runNewMutatorCancelsOld(mutex: MutateCaller) =
+        coroutineScope<Unit> {
+            val firstMutatorJob =
+                launch(start = CoroutineStart.UNDISPATCHED) {
+                    mutex.mutate {
                         // Suspend forever
-                        suspendCancellableCoroutine<Unit> { }
+                        suspendCancellableCoroutine<Unit> {}
                     }
                     fail("mutator should have thrown CancellationException")
                 }
 
-                // Attempt mutation and (maybe) cause cancellation
-                try {
-                    mutex.mutate(secondPriority) { }
-                } catch (ce: CancellationException) {
-                    assertTrue(
-                        "attempted second mutation was cancelled with lower priority",
-                        secondPriority < firstPriority
-                    )
-                }
-                assertEquals(
-                    "first mutator of priority $firstPriority cancelled by second " +
-                        "mutator of priority $secondPriority",
-                    secondPriority >= firstPriority,
-                    firstMutatorJob.isCancelled
-                )
+            // Cancel firstMutatorJob
+            mutex.mutate {}
+            assertTrue("first mutator was cancelled", firstMutatorJob.isCancelled)
+        }
 
-                // Cleanup regardless of results
-                firstMutatorJob.cancel()
-                firstMutatorJob.join()
+    @Test
+    fun mutatorsCancelByPriority() =
+        runBlocking<Unit> {
+            val mutex = InternalMutatorMutex()
+            runMutatorsCancelByPriority(MutateWithoutReceiverCaller(mutex))
+            runMutatorsCancelByPriority(MutateWithReceiverCaller(mutex))
+        }
+
+    @Test
+    fun tryMutateBlockingSuspendsSubsequentMutate() =
+        runBlocking<Unit> {
+            val mutex = InternalMutatorMutex()
+            val tryMutateJob =
+                launch(start = CoroutineStart.LAZY) {
+                    mutex.tryMutate {
+                        while (true) {
+                            /* Block forever */
+                        }
+                    }
+                }
+            val mutateJob =
+                launch(start = CoroutineStart.LAZY) {
+                    mutex.mutate {
+                        if (tryMutateJob.isActive)
+                            fail("Attempted to mutate before tryMutate finished")
+                    }
+                }
+            tryMutateJob.start()
+            mutateJob.start()
+
+            tryMutateJob.cancelAndJoin()
+            mutateJob.cancelAndJoin()
+        }
+
+    @Test
+    fun tryMutateDoesNotOverrideActiveCaller() =
+        runBlocking<Unit> {
+            val mutex = InternalMutatorMutex()
+            val mutateJob =
+                launch(start = CoroutineStart.UNDISPATCHED) {
+                    mutex.mutate {
+                        suspendCancellableCoroutine {} // Suspend forever
+                    }
+                }
+            val tryMutateSuccessful = mutex.tryMutate {}
+            Assert.assertFalse(
+                "tryMutate should not run if there is an ongoing mutation",
+                tryMutateSuccessful
+            )
+            mutateJob.cancelAndJoin()
+        }
+
+    @Test
+    fun tryMutateBlockingTryMutateLocks() =
+        runBlocking<Unit> {
+            val mutex = InternalMutatorMutex()
+            mutex.tryMutate {
+                val tryMutateSuccessful = mutex.tryMutate {}
+                Assert.assertFalse(
+                    "tryMutate should not run if there is an ongoing mutation",
+                    tryMutateSuccessful
+                )
             }
         }
-    }
+
+    private suspend fun runMutatorsCancelByPriority(mutex: MutateCaller) =
+        coroutineScope<Unit> {
+            for (firstPriority in MutatePriority.values()) {
+                for (secondPriority in MutatePriority.values()) {
+                    val firstMutatorJob =
+                        launch(start = CoroutineStart.UNDISPATCHED) {
+                            mutex.mutate(firstPriority) {
+                                // Suspend forever
+                                suspendCancellableCoroutine<Unit> {}
+                            }
+                            fail("mutator should have thrown CancellationException")
+                        }
+
+                    // Attempt mutation and (maybe) cause cancellation
+                    try {
+                        mutex.mutate(secondPriority) {}
+                    } catch (ce: CancellationException) {
+                        assertTrue(
+                            "attempted second mutation was cancelled with lower priority",
+                            secondPriority < firstPriority
+                        )
+                    }
+                    assertEquals(
+                        "first mutator of priority $firstPriority cancelled by second " +
+                            "mutator of priority $secondPriority",
+                        secondPriority >= firstPriority,
+                        firstMutatorJob.isCancelled
+                    )
+
+                    // Cleanup regardless of results
+                    firstMutatorJob.cancel()
+                    firstMutatorJob.join()
+                }
+            }
+        }
 }
diff --git a/compose/material/material/src/androidUnitTest/kotlin/androidx/compose/material/TextSelectionBackgroundColorTest.kt b/compose/material/material/src/androidUnitTest/kotlin/androidx/compose/material/TextSelectionBackgroundColorTest.kt
index 853e0ac..a7741df 100644
--- a/compose/material/material/src/androidUnitTest/kotlin/androidx/compose/material/TextSelectionBackgroundColorTest.kt
+++ b/compose/material/material/src/androidUnitTest/kotlin/androidx/compose/material/TextSelectionBackgroundColorTest.kt
@@ -36,34 +36,37 @@
     companion object {
         @JvmStatic
         @Parameterized.Parameters(name = "color={0}")
-        fun colors(): Array<Any> = arrayOf(
-            // Baseline palette primary
-            Color(0xFF6200EE),
-            // 500 colors from the Material 2014 palette
-            Color(0xFFF44336),
-            Color(0xFFE91E63),
-            Color(0xFF9C27B0),
-            Color(0xFF673AB7),
-            Color(0xFF3F51B5),
-            Color(0xFF2196F3),
-            Color(0xFF03A9F4),
-            Color(0xFF00BCD4),
-            Color(0xFF009688),
-            Color(0xFF4CAF50),
-            Color(0xFF8BC34A),
-            Color(0xFFCDDC39),
-            Color(0xFFFFEB3B),
-            Color(0xFFFFC107),
-            Color(0xFFFF9800),
-            Color(0xFFFF5722),
-            Color(0xFF795548),
-            Color(0xFF9E9E9E),
-            Color(0xFF607D8B)
-        ).map {
-            // Need to pass `null` as Color is an inline class and the `null` is needed when
-            // reflectively instantiating the class
-            arrayOf(it, null)
-        }.toTypedArray()
+        fun colors(): Array<Any> =
+            arrayOf(
+                    // Baseline palette primary
+                    Color(0xFF6200EE),
+                    // 500 colors from the Material 2014 palette
+                    Color(0xFFF44336),
+                    Color(0xFFE91E63),
+                    Color(0xFF9C27B0),
+                    Color(0xFF673AB7),
+                    Color(0xFF3F51B5),
+                    Color(0xFF2196F3),
+                    Color(0xFF03A9F4),
+                    Color(0xFF00BCD4),
+                    Color(0xFF009688),
+                    Color(0xFF4CAF50),
+                    Color(0xFF8BC34A),
+                    Color(0xFFCDDC39),
+                    Color(0xFFFFEB3B),
+                    Color(0xFFFFC107),
+                    Color(0xFFFF9800),
+                    Color(0xFFFF5722),
+                    Color(0xFF795548),
+                    Color(0xFF9E9E9E),
+                    Color(0xFF607D8B)
+                )
+                .map {
+                    // Need to pass `null` as Color is an inline class and the `null` is needed when
+                    // reflectively instantiating the class
+                    arrayOf(it, null)
+                }
+                .toTypedArray()
     }
 
     /**
@@ -122,21 +125,23 @@
     backgroundColor: Color
 ) {
     val textColorWithAlpha = textColor.copy(alpha = textAlpha)
-    val selectionBackgroundColor = calculateSelectionBackgroundColor(
-        selectionColor = selectionColor,
-        textColor = textColorWithAlpha,
-        backgroundColor = backgroundColor
-    )
+    val selectionBackgroundColor =
+        calculateSelectionBackgroundColor(
+            selectionColor = selectionColor,
+            textColor = textColorWithAlpha,
+            backgroundColor = backgroundColor
+        )
 
     // If the minimum alpha we allow still does not provide enough contrast, then we fall back to
     // using the default alpha for consistency with the spec.
-    val minimumCompositeBackground = selectionBackgroundColor.copy(alpha = MinimumSelectionAlpha)
-        .compositeOver(backgroundColor)
+    val minimumCompositeBackground =
+        selectionBackgroundColor.copy(alpha = MinimumSelectionAlpha).compositeOver(backgroundColor)
     val minimumCompositeTextColor = textColorWithAlpha.compositeOver(minimumCompositeBackground)
-    val minimumContrastRatio = calculateContrastRatio(
-        foreground = minimumCompositeTextColor,
-        background = minimumCompositeBackground
-    )
+    val minimumContrastRatio =
+        calculateContrastRatio(
+            foreground = minimumCompositeTextColor,
+            background = minimumCompositeBackground
+        )
 
     if (minimumContrastRatio < RequiredContrastRatio) {
         assertThat(selectionBackgroundColor.alpha).isEqualTo(MinimumSelectionAlpha)
@@ -146,10 +151,8 @@
     // Otherwise, ensure that the value we choose is accessible
     val compositeBackground = selectionBackgroundColor.compositeOver(backgroundColor)
     val compositeTextColor = textColorWithAlpha.compositeOver(compositeBackground)
-    val contrastRatio = calculateContrastRatio(
-        foreground = compositeTextColor,
-        background = compositeBackground
-    )
+    val contrastRatio =
+        calculateContrastRatio(foreground = compositeTextColor, background = compositeBackground)
 
     // The contrast ratio must always be >= 4.5
     assertThat(contrastRatio).isAtLeast(RequiredContrastRatio)
diff --git a/compose/material/material/src/commonMain/kotlin/androidx/compose/material/AlertDialog.kt b/compose/material/material/src/commonMain/kotlin/androidx/compose/material/AlertDialog.kt
index 14c9c6fd..5be1006 100644
--- a/compose/material/material/src/commonMain/kotlin/androidx/compose/material/AlertDialog.kt
+++ b/compose/material/material/src/commonMain/kotlin/androidx/compose/material/AlertDialog.kt
@@ -46,11 +46,13 @@
 import kotlin.math.max
 
 /**
- * <a href="https://material.io/components/dialogs#alert-dialog" class="external" target="_blank">Material Design alert dialog</a>.
+ * <a href="https://material.io/components/dialogs#alert-dialog" class="external"
+ * target="_blank">Material Design alert dialog</a>.
  *
  * Alert dialogs interrupt users with urgent information, details, or actions.
  *
- * ![Dialogs image](https://developer.android.com/images/reference/androidx/compose/material/dialogs.png)
+ * ![Dialogs
+ * image](https://developer.android.com/images/reference/androidx/compose/material/dialogs.png)
  *
  * The dialog will position its buttons based on the available space. By default it will try to
  * place them horizontally next to each other and fallback to horizontal placement if not enough
@@ -58,21 +60,22 @@
  * to provide custom buttons layout.
  *
  * Sample of dialog:
+ *
  * @sample androidx.compose.material.samples.AlertDialogSample
  *
- * @param onDismissRequest Executes when the user tries to dismiss the Dialog by clicking outside
- * or pressing the back button. This is not called when the dismiss button is clicked.
- * @param confirmButton A button which is meant to confirm a proposed action, thus resolving
- * what triggered the dialog. The dialog does not set up any events for this button so they need
- * to be set up by the caller.
+ * @param onDismissRequest Executes when the user tries to dismiss the Dialog by clicking outside or
+ *   pressing the back button. This is not called when the dismiss button is clicked.
+ * @param confirmButton A button which is meant to confirm a proposed action, thus resolving what
+ *   triggered the dialog. The dialog does not set up any events for this button so they need to be
+ *   set up by the caller.
  * @param modifier Modifier to be applied to the layout of the dialog.
  * @param dismissButton A button which is meant to dismiss the dialog. The dialog does not set up
- * any events for this button so they need to be set up by the caller.
- * @param title The title of the Dialog which should specify the purpose of the Dialog. The title
- * is not mandatory, because there may be sufficient information inside the [text]. Provided text
- * style will be [Typography.subtitle1].
+ *   any events for this button so they need to be set up by the caller.
+ * @param title The title of the Dialog which should specify the purpose of the Dialog. The title is
+ *   not mandatory, because there may be sufficient information inside the [text]. Provided text
+ *   style will be [Typography.subtitle1].
  * @param text The text which presents the details regarding the Dialog's purpose. Provided text
- * style will be [Typography.body2].
+ *   style will be [Typography.body2].
  * @param shape Defines the Dialog's shape
  * @param backgroundColor The background color of the dialog.
  * @param contentColor The preferred content color provided by this dialog to its children.
@@ -93,25 +96,27 @@
 )
 
 /**
- * <a href="https://material.io/components/dialogs#alert-dialog" class="external" target="_blank">Material Design alert dialog</a>.
+ * <a href="https://material.io/components/dialogs#alert-dialog" class="external"
+ * target="_blank">Material Design alert dialog</a>.
  *
  * Alert dialogs interrupt users with urgent information, details, or actions.
  *
- * ![Dialogs image](https://developer.android.com/images/reference/androidx/compose/material/dialogs.png)
+ * ![Dialogs
+ * image](https://developer.android.com/images/reference/androidx/compose/material/dialogs.png)
  *
  * This function can be used to fully customize the button area, e.g. with:
  *
  * @sample androidx.compose.material.samples.CustomAlertDialogSample
  *
- * @param onDismissRequest Executes when the user tries to dismiss the Dialog by clicking outside
- * or pressing the back button. This is not called when the dismiss button is clicked.
+ * @param onDismissRequest Executes when the user tries to dismiss the Dialog by clicking outside or
+ *   pressing the back button. This is not called when the dismiss button is clicked.
  * @param buttons Function that emits the layout with the buttons.
  * @param modifier Modifier to be applied to the layout of the dialog.
- * @param title The title of the Dialog which should specify the purpose of the Dialog. The title
- * is not mandatory, because there may be sufficient information inside the [text]. Provided text
- * style will be [Typography.subtitle1].
+ * @param title The title of the Dialog which should specify the purpose of the Dialog. The title is
+ *   not mandatory, because there may be sufficient information inside the [text]. Provided text
+ *   style will be [Typography.subtitle1].
  * @param text The text which presents the details regarding the Dialog's purpose. Provided text
- * style will be [Typography.body2].
+ *   style will be [Typography.body2].
  * @param shape Defines the Dialog's shape.
  * @param backgroundColor The background color of the dialog.
  * @param contentColor The preferred content color provided by this dialog to its children.
@@ -143,28 +148,26 @@
     backgroundColor: Color,
     contentColor: Color,
     properties: DialogProperties
-): Unit = AlertDialog(
-    onDismissRequest = onDismissRequest,
-    buttons = {
-        // TODO: move the modifiers to FlowRow when it supports a modifier parameter
-        Box(Modifier.fillMaxWidth().padding(horizontal = 8.dp, vertical = 2.dp)) {
-            AlertDialogFlowRow(
-                mainAxisSpacing = 8.dp,
-                crossAxisSpacing = 12.dp
-            ) {
-                dismissButton?.invoke()
-                confirmButton()
+): Unit =
+    AlertDialog(
+        onDismissRequest = onDismissRequest,
+        buttons = {
+            // TODO: move the modifiers to FlowRow when it supports a modifier parameter
+            Box(Modifier.fillMaxWidth().padding(horizontal = 8.dp, vertical = 2.dp)) {
+                AlertDialogFlowRow(mainAxisSpacing = 8.dp, crossAxisSpacing = 12.dp) {
+                    dismissButton?.invoke()
+                    confirmButton()
+                }
             }
-        }
-    },
-    modifier = modifier,
-    title = title,
-    text = text,
-    shape = shape,
-    backgroundColor = backgroundColor,
-    contentColor = contentColor,
-    properties = properties
-)
+        },
+        modifier = modifier,
+        title = title,
+        text = text,
+        shape = shape,
+        backgroundColor = backgroundColor,
+        contentColor = contentColor,
+        properties = properties
+    )
 
 @Suppress("NOTHING_TO_INLINE")
 @Composable
@@ -178,20 +181,18 @@
     backgroundColor: Color,
     contentColor: Color,
     properties: DialogProperties
-): Unit = Dialog(
-    onDismissRequest = onDismissRequest,
-    properties = properties
-) {
-    AlertDialogContent(
-        buttons = buttons,
-        modifier = modifier,
-        title = title,
-        text = text,
-        shape = shape,
-        backgroundColor = backgroundColor,
-        contentColor = contentColor
-    )
-}
+): Unit =
+    Dialog(onDismissRequest = onDismissRequest, properties = properties) {
+        AlertDialogContent(
+            buttons = buttons,
+            modifier = modifier,
+            title = title,
+            text = text,
+            shape = shape,
+            backgroundColor = backgroundColor,
+            contentColor = contentColor
+        )
+    }
 
 @Composable
 internal fun AlertDialogContent(
@@ -211,24 +212,26 @@
     ) {
         Column {
             AlertDialogBaselineLayout(
-                title = title?.let {
-                    @Composable {
-                        CompositionLocalProvider(LocalContentAlpha provides ContentAlpha.high) {
-                            val textStyle = MaterialTheme.typography.subtitle1
-                            ProvideTextStyle(textStyle, title)
+                title =
+                    title?.let {
+                        @Composable {
+                            CompositionLocalProvider(LocalContentAlpha provides ContentAlpha.high) {
+                                val textStyle = MaterialTheme.typography.subtitle1
+                                ProvideTextStyle(textStyle, title)
+                            }
+                        }
+                    },
+                text =
+                    text?.let {
+                        @Composable {
+                            CompositionLocalProvider(
+                                LocalContentAlpha provides ContentAlpha.medium
+                            ) {
+                                val textStyle = MaterialTheme.typography.body2
+                                ProvideTextStyle(textStyle, text)
+                            }
                         }
                     }
-                },
-                text = text?.let {
-                    @Composable {
-                        CompositionLocalProvider(
-                            LocalContentAlpha provides ContentAlpha.medium
-                        ) {
-                            val textStyle = MaterialTheme.typography.body2
-                            ProvideTextStyle(textStyle, text)
-                        }
-                    }
-                }
             )
             buttons()
         }
@@ -250,79 +253,85 @@
     Layout(
         {
             title?.let { title ->
-                Box(TitlePadding.layoutId("title").align(Alignment.Start)) {
-                    title()
-                }
+                Box(TitlePadding.layoutId("title").align(Alignment.Start)) { title() }
             }
             text?.let { text ->
-                Box(TextPadding.layoutId("text").align(Alignment.Start)) {
-                    text()
-                }
+                Box(TextPadding.layoutId("text").align(Alignment.Start)) { text() }
             }
         },
         Modifier.weight(1f, false)
     ) { measurables, constraints ->
         // Measure with loose constraints for height as we don't want the text to take up more
         // space than it needs
-        val titlePlaceable = measurables.fastFirstOrNull { it.layoutId == "title" }?.measure(
-            constraints.copy(minHeight = 0)
-        )
-        val textPlaceable = measurables.fastFirstOrNull { it.layoutId == "text" }?.measure(
-            constraints.copy(minHeight = 0)
-        )
+        val titlePlaceable =
+            measurables
+                .fastFirstOrNull { it.layoutId == "title" }
+                ?.measure(constraints.copy(minHeight = 0))
+        val textPlaceable =
+            measurables
+                .fastFirstOrNull { it.layoutId == "text" }
+                ?.measure(constraints.copy(minHeight = 0))
 
         val layoutWidth = max(titlePlaceable?.width ?: 0, textPlaceable?.width ?: 0)
 
-        val firstTitleBaseline = titlePlaceable?.get(FirstBaseline)?.let { baseline ->
-            if (baseline == AlignmentLine.Unspecified) null else baseline
-        } ?: 0
-        val lastTitleBaseline = titlePlaceable?.get(LastBaseline)?.let { baseline ->
-            if (baseline == AlignmentLine.Unspecified) null else baseline
-        } ?: 0
+        val firstTitleBaseline =
+            titlePlaceable?.get(FirstBaseline)?.let { baseline ->
+                if (baseline == AlignmentLine.Unspecified) null else baseline
+            } ?: 0
+        val lastTitleBaseline =
+            titlePlaceable?.get(LastBaseline)?.let { baseline ->
+                if (baseline == AlignmentLine.Unspecified) null else baseline
+            } ?: 0
 
         val titleOffset = TitleBaselineDistanceFromTop.roundToPx()
 
         // Place the title so that its first baseline is titleOffset from the top
         val titlePositionY = titleOffset - firstTitleBaseline
 
-        val firstTextBaseline = textPlaceable?.get(FirstBaseline)?.let { baseline ->
-            if (baseline == AlignmentLine.Unspecified) null else baseline
-        } ?: 0
+        val firstTextBaseline =
+            textPlaceable?.get(FirstBaseline)?.let { baseline ->
+                if (baseline == AlignmentLine.Unspecified) null else baseline
+            } ?: 0
 
-        val textOffset = if (titlePlaceable == null) {
-            TextBaselineDistanceFromTop.roundToPx()
-        } else {
-            TextBaselineDistanceFromTitle.roundToPx()
-        }
+        val textOffset =
+            if (titlePlaceable == null) {
+                TextBaselineDistanceFromTop.roundToPx()
+            } else {
+                TextBaselineDistanceFromTitle.roundToPx()
+            }
 
         // Combined height of title and spacing above
         val titleHeightWithSpacing = titlePlaceable?.let { it.height + titlePositionY } ?: 0
 
         // Align the bottom baseline of the text with the bottom baseline of the title, and then
         // add the offset
-        val textPositionY = if (titlePlaceable == null) {
-            // If there is no title, just place the text offset from the top of the dialog
-            textOffset - firstTextBaseline
-        } else {
-            if (lastTitleBaseline == 0) {
-                // If `title` has no baseline, just place the text's baseline textOffset from the
-                // bottom of the title
-                titleHeightWithSpacing - firstTextBaseline + textOffset
+        val textPositionY =
+            if (titlePlaceable == null) {
+                // If there is no title, just place the text offset from the top of the dialog
+                textOffset - firstTextBaseline
             } else {
-                // Otherwise place the text's baseline textOffset from the title's last baseline
-                (titlePositionY + lastTitleBaseline) - firstTextBaseline + textOffset
+                if (lastTitleBaseline == 0) {
+                    // If `title` has no baseline, just place the text's baseline textOffset from
+                    // the
+                    // bottom of the title
+                    titleHeightWithSpacing - firstTextBaseline + textOffset
+                } else {
+                    // Otherwise place the text's baseline textOffset from the title's last baseline
+                    (titlePositionY + lastTitleBaseline) - firstTextBaseline + textOffset
+                }
             }
-        }
 
         // Combined height of text and spacing above
-        val textHeightWithSpacing = textPlaceable?.let {
-            if (lastTitleBaseline == 0) {
-                textPlaceable.height + textOffset - firstTextBaseline
-            } else {
-                textPlaceable.height + textOffset - firstTextBaseline -
-                    ((titlePlaceable?.height ?: 0) - lastTitleBaseline)
-            }
-        } ?: 0
+        val textHeightWithSpacing =
+            textPlaceable?.let {
+                if (lastTitleBaseline == 0) {
+                    textPlaceable.height + textOffset - firstTextBaseline
+                } else {
+                    textPlaceable.height + textOffset -
+                        firstTextBaseline -
+                        ((titlePlaceable?.height ?: 0) - lastTitleBaseline)
+                }
+            } ?: 0
 
         val layoutHeight = titleHeightWithSpacing + textHeightWithSpacing
 
@@ -359,8 +368,9 @@
 
         // Return whether the placeable can be added to the current sequence.
         fun canAddToCurrentSequence(placeable: Placeable) =
-            currentSequence.isEmpty() || currentMainAxisSize + mainAxisSpacing.roundToPx() +
-                placeable.width <= constraints.maxWidth
+            currentSequence.isEmpty() ||
+                currentMainAxisSize + mainAxisSpacing.roundToPx() + placeable.width <=
+                    constraints.maxWidth
 
         // Store current sequence information and start a new sequence.
         fun startNewSequence() {
@@ -368,8 +378,7 @@
                 crossAxisSpace += crossAxisSpacing.roundToPx()
             }
             // Ensures that confirming actions appear above dismissive actions.
-            @Suppress("ListIterator")
-            sequences.add(0, currentSequence.toList())
+            @Suppress("ListIterator") sequences.add(0, currentSequence.toList())
             crossAxisSizes += currentCrossAxisSize
             crossAxisPositions += crossAxisSpace
 
@@ -399,11 +408,12 @@
 
         if (currentSequence.isNotEmpty()) startNewSequence()
 
-        val mainAxisLayoutSize = if (constraints.maxWidth != Constraints.Infinity) {
-            constraints.maxWidth
-        } else {
-            max(mainAxisSpace, constraints.minWidth)
-        }
+        val mainAxisLayoutSize =
+            if (constraints.maxWidth != Constraints.Infinity) {
+                constraints.maxWidth
+            } else {
+                max(mainAxisSpace, constraints.minWidth)
+            }
         val crossAxisLayoutSize = max(crossAxisSpace, constraints.minHeight)
 
         val layoutWidth = mainAxisLayoutSize
@@ -412,10 +422,11 @@
 
         layout(layoutWidth, layoutHeight) {
             sequences.fastForEachIndexed { i, placeables ->
-                val childrenMainAxisSizes = IntArray(placeables.size) { j ->
-                    placeables[j].width +
-                        if (j < placeables.lastIndex) mainAxisSpacing.roundToPx() else 0
-                }
+                val childrenMainAxisSizes =
+                    IntArray(placeables.size) { j ->
+                        placeables[j].width +
+                            if (j < placeables.lastIndex) mainAxisSpacing.roundToPx() else 0
+                    }
                 val arrangement = Arrangement.Bottom
                 // TODO(soboleva): rtl support
                 // Handle vertical direction
@@ -424,10 +435,7 @@
                     arrange(mainAxisLayoutSize, childrenMainAxisSizes, mainAxisPositions)
                 }
                 placeables.fastForEachIndexed { j, placeable ->
-                    placeable.place(
-                        x = mainAxisPositions[j],
-                        y = crossAxisPositions[i]
-                    )
+                    placeable.place(x = mainAxisPositions[j], y = crossAxisPositions[i])
                 }
             }
         }
diff --git a/compose/material/material/src/commonMain/kotlin/androidx/compose/material/AnchoredDraggable.kt b/compose/material/material/src/commonMain/kotlin/androidx/compose/material/AnchoredDraggable.kt
index 307d512..1764b73 100644
--- a/compose/material/material/src/commonMain/kotlin/androidx/compose/material/AnchoredDraggable.kt
+++ b/compose/material/material/src/commonMain/kotlin/androidx/compose/material/AnchoredDraggable.kt
@@ -82,7 +82,6 @@
      * Find the closest anchor to the [position].
      *
      * @param position The position to start searching from
-     *
      * @return The closest anchor or null if the anchors are empty
      */
     fun closestAnchor(position: Float): T?
@@ -92,24 +91,17 @@
      *
      * @param position The position to start searching from
      * @param searchUpwards Whether to search upwards from the current position or downwards
-     *
      * @return The closest anchor or null if the anchors are empty
      */
     fun closestAnchor(position: Float, searchUpwards: Boolean): T?
 
-    /**
-     * The smallest anchor, or [Float.NEGATIVE_INFINITY] if the anchors are empty.
-     */
+    /** The smallest anchor, or [Float.NEGATIVE_INFINITY] if the anchors are empty. */
     fun minAnchor(): Float
 
-    /**
-     * The biggest anchor, or [Float.POSITIVE_INFINITY] if the anchors are empty.
-     */
+    /** The biggest anchor, or [Float.POSITIVE_INFINITY] if the anchors are empty. */
     fun maxAnchor(): Float
 
-    /**
-     * The amount of anchors
-     */
+    /** The amount of anchors */
     val size: Int
 }
 
@@ -139,7 +131,7 @@
  *
  * @param builder A function with a [DraggableAnchorsConfig] that offers APIs to configure anchors
  * @return A new [DraggableAnchors] instance with the anchor positions set by the `builder`
- * function.
+ *   function.
  */
 @ExperimentalMaterialApi
 internal fun <T : Any> DraggableAnchors(
@@ -150,23 +142,23 @@
  * Enable drag gestures between a set of predefined values.
  *
  * When a drag is detected, the offset of the [AnchoredDraggableState] will be updated with the drag
- * delta. You should use this offset to move your content accordingly (see [Modifier.offset]).
- * When the drag ends, the offset will be animated to one of the anchors and when that anchor is
- * reached, the value of the [AnchoredDraggableState] will also be updated to the value
- * corresponding to the new anchor.
+ * delta. You should use this offset to move your content accordingly (see [Modifier.offset]). When
+ * the drag ends, the offset will be animated to one of the anchors and when that anchor is reached,
+ * the value of the [AnchoredDraggableState] will also be updated to the value corresponding to the
+ * new anchor.
  *
  * Dragging is constrained between the minimum and maximum anchors.
  *
  * @param state The associated [AnchoredDraggableState].
  * @param orientation The orientation in which the [anchoredDraggable] can be dragged.
  * @param enabled Whether this [anchoredDraggable] is enabled and should react to the user's input.
- * @param reverseDirection Whether to reverse the direction of the drag, so a top to bottom
- * drag will behave like bottom to top, and a left to right drag will behave like right to left.
- * @param interactionSource Optional [MutableInteractionSource] that will passed on to
- * the internal [Modifier.draggable].
+ * @param reverseDirection Whether to reverse the direction of the drag, so a top to bottom drag
+ *   will behave like bottom to top, and a left to right drag will behave like right to left.
+ * @param interactionSource Optional [MutableInteractionSource] that will passed on to the internal
+ *   [Modifier.draggable].
  * @param startDragImmediately when set to false, [draggable] will start dragging only when the
- * gesture crosses the touchSlop. This is useful to prevent users from "catching" an animating
- * widget when pressing on it. See [draggable] to learn more about startDragImmediately.
+ *   gesture crosses the touchSlop. This is useful to prevent users from "catching" an animating
+ *   widget when pressing on it. See [draggable] to learn more about startDragImmediately.
  */
 @ExperimentalMaterialApi
 internal fun <T> Modifier.anchoredDraggable(
@@ -176,22 +168,23 @@
     reverseDirection: Boolean = false,
     interactionSource: MutableInteractionSource? = null,
     startDragImmediately: Boolean = state.isAnimationRunning
-) = draggable(
-    state = state.draggableState,
-    orientation = orientation,
-    enabled = enabled,
-    interactionSource = interactionSource,
-    reverseDirection = reverseDirection,
-    startDragImmediately = startDragImmediately,
-    onDragStopped = { velocity -> launch { state.settle(velocity) } }
-)
+) =
+    draggable(
+        state = state.draggableState,
+        orientation = orientation,
+        enabled = enabled,
+        interactionSource = interactionSource,
+        reverseDirection = reverseDirection,
+        startDragImmediately = startDragImmediately,
+        onDragStopped = { velocity -> launch { state.settle(velocity) } }
+    )
 
 /**
  * Scope used for suspending anchored drag blocks. Allows to set [AnchoredDraggableState.offset] to
  * a new value.
  *
  * @see [AnchoredDraggableState.anchoredDrag] to learn how to start the anchored drag and get the
- * access to this scope.
+ *   access to this scope.
  */
 @ExperimentalMaterialApi
 internal interface AnchoredDragScope {
@@ -201,28 +194,25 @@
      * @param newOffset new value for [AnchoredDraggableState.offset].
      * @param lastKnownVelocity last known velocity (if known)
      */
-    fun dragTo(
-        newOffset: Float,
-        lastKnownVelocity: Float = 0f
-    )
+    fun dragTo(newOffset: Float, lastKnownVelocity: Float = 0f)
 }
 
 /**
- * State of the [anchoredDraggable] modifier.
- * Use the constructor overload with anchors if the anchors are defined in composition, or update
- * the anchors using [updateAnchors].
+ * State of the [anchoredDraggable] modifier. Use the constructor overload with anchors if the
+ * anchors are defined in composition, or update the anchors using [updateAnchors].
  *
- * This contains necessary information about any ongoing drag or animation and provides methods
- * to change the state either immediately or by starting an animation.
+ * This contains necessary information about any ongoing drag or animation and provides methods to
+ * change the state either immediately or by starting an animation.
  *
  * @param initialValue The initial value of the state.
  * @param positionalThreshold The positional threshold, in px, to be used when calculating the
- * target state while a drag is in progress and when settling after the drag ends. This is the
- * distance from the start of a transition. It will be, depending on the direction of the
- * interaction, added or subtracted from/to the origin offset. It should always be a positive value.
+ *   target state while a drag is in progress and when settling after the drag ends. This is the
+ *   distance from the start of a transition. It will be, depending on the direction of the
+ *   interaction, added or subtracted from/to the origin offset. It should always be a positive
+ *   value.
  * @param velocityThreshold The velocity threshold (in px per second) that the end velocity has to
- * exceed in order to animate to the next state, even if the [positionalThreshold] has not been
- * reached.
+ *   exceed in order to animate to the next state, even if the [positionalThreshold] has not been
+ *   reached.
  * @param animationSpec The default animation that will be used to animate to a new state.
  * @param confirmValueChange Optional callback invoked to confirm or veto a pending state change.
  */
@@ -243,15 +233,15 @@
      * @param anchors The anchors of the state. Use [updateAnchors] to update the anchors later.
      * @param animationSpec The default animation that will be used to animate to a new state.
      * @param confirmValueChange Optional callback invoked to confirm or veto a pending state
-     * change.
+     *   change.
      * @param positionalThreshold The positional threshold, in px, to be used when calculating the
-     * target state while a drag is in progress and when settling after the drag ends. This is the
-     * distance from the start of a transition. It will be, depending on the direction of the
-     * interaction, added or subtracted from/to the origin offset. It should always be a positive
-     * value.
+     *   target state while a drag is in progress and when settling after the drag ends. This is the
+     *   distance from the start of a transition. It will be, depending on the direction of the
+     *   interaction, added or subtracted from/to the origin offset. It should always be a positive
+     *   value.
      * @param velocityThreshold The velocity threshold (in px per second) that the end velocity has
-     * to exceed in order to animate to the next state, even if the [positionalThreshold] has not
-     * been reached.
+     *   to exceed in order to animate to the next state, even if the [positionalThreshold] has not
+     *   been reached.
      */
     @ExperimentalMaterialApi
     constructor(
@@ -274,48 +264,47 @@
 
     private val dragMutex = InternalMutatorMutex()
 
-    internal val draggableState = object : DraggableState {
+    internal val draggableState =
+        object : DraggableState {
 
-        private val dragScope = object : DragScope {
-            override fun dragBy(pixels: Float) {
-                with(anchoredDragScope) {
-                    dragTo(newOffsetForDelta(pixels))
+            private val dragScope =
+                object : DragScope {
+                    override fun dragBy(pixels: Float) {
+                        with(anchoredDragScope) { dragTo(newOffsetForDelta(pixels)) }
+                    }
+                }
+
+            override suspend fun drag(
+                dragPriority: MutatePriority,
+                block: suspend DragScope.() -> Unit
+            ) {
+                this@AnchoredDraggableState.anchoredDrag(dragPriority) {
+                    with(dragScope) { block() }
                 }
             }
-        }
 
-        override suspend fun drag(
-            dragPriority: MutatePriority,
-            block: suspend DragScope.() -> Unit
-        ) {
-            this@AnchoredDraggableState.anchoredDrag(dragPriority) {
-                with(dragScope) { block() }
+            override fun dispatchRawDelta(delta: Float) {
+                this@AnchoredDraggableState.dispatchRawDelta(delta)
             }
         }
 
-        override fun dispatchRawDelta(delta: Float) {
-            this@AnchoredDraggableState.dispatchRawDelta(delta)
-        }
-    }
-
-    /**
-     * The current value of the [AnchoredDraggableState].
-     */
+    /** The current value of the [AnchoredDraggableState]. */
     var currentValue: T by mutableStateOf(initialValue)
         private set
 
     /**
      * The target value. This is the closest value to the current offset, taking into account
-     * positional thresholds. If no interactions like animations or drags are in progress, this
-     * will be the current value.
+     * positional thresholds. If no interactions like animations or drags are in progress, this will
+     * be the current value.
      */
     val targetValue: T by derivedStateOf {
-        dragTarget ?: run {
-            val currentOffset = offset
-            if (!currentOffset.isNaN()) {
-                computeTarget(currentOffset, currentValue, velocity = 0f)
-            } else currentValue
-        }
+        dragTarget
+            ?: run {
+                val currentOffset = offset
+                if (!currentOffset.isNaN()) {
+                    computeTarget(currentOffset, currentValue, velocity = 0f)
+                } else currentValue
+            }
     }
 
     /**
@@ -324,12 +313,13 @@
      * specified).
      */
     internal val closestValue: T by derivedStateOf {
-        dragTarget ?: run {
-            val currentOffset = offset
-            if (!currentOffset.isNaN()) {
-                computeTargetWithoutThresholds(currentOffset, currentValue)
-            } else currentValue
-        }
+        dragTarget
+            ?: run {
+                val currentOffset = offset
+                if (!currentOffset.isNaN()) {
+                    computeTargetWithoutThresholds(currentOffset, currentValue)
+                } else currentValue
+            }
     }
 
     /**
@@ -346,9 +336,8 @@
     /**
      * Require the current offset.
      *
-     * @see offset
-     *
      * @throws IllegalStateException If the offset has not been initialized yet
+     * @see offset
      */
     fun requireOffset(): Float {
         check(!offset.isNaN()) {
@@ -358,32 +347,31 @@
         return offset
     }
 
-    /**
-     * Whether an animation is currently in progress.
-     */
-    val isAnimationRunning: Boolean get() = dragTarget != null
+    /** Whether an animation is currently in progress. */
+    val isAnimationRunning: Boolean
+        get() = dragTarget != null
 
     /**
      * The fraction of the progress going from [currentValue] to [closestValue], within [0f..1f]
      * bounds, or 1f if the [AnchoredDraggableState] is in a settled state.
      */
     @get:FloatRange(from = 0.0, to = 1.0)
-    val progress: Float by derivedStateOf(structuralEqualityPolicy()) {
-        val a = anchors.positionOf(currentValue)
-        val b = anchors.positionOf(closestValue)
-        val distance = abs(b - a)
-        if (!distance.isNaN() && distance > 1e-6f) {
-            val progress = (this.requireOffset() - a) / (b - a)
-            // If we are very close to 0f or 1f, we round to the closest
-            if (progress < 1e-6f) 0f else if (progress > 1 - 1e-6f) 1f else progress
-        } else 1f
-    }
+    val progress: Float by
+        derivedStateOf(structuralEqualityPolicy()) {
+            val a = anchors.positionOf(currentValue)
+            val b = anchors.positionOf(closestValue)
+            val distance = abs(b - a)
+            if (!distance.isNaN() && distance > 1e-6f) {
+                val progress = (this.requireOffset() - a) / (b - a)
+                // If we are very close to 0f or 1f, we round to the closest
+                if (progress < 1e-6f) 0f else if (progress > 1 - 1e-6f) 1f else progress
+            } else 1f
+        }
 
     /**
      * The velocity of the last known animation. Gets reset to 0f when an animation completes
-     * successfully, but does not get reset when an animation gets interrupted.
-     * You can use this value to provide smooth reconciliation behavior when re-targeting an
-     * animation.
+     * successfully, but does not get reset when an animation gets interrupted. You can use this
+     * value to provide smooth reconciliation behavior when re-targeting an animation.
      */
     var lastVelocity: Float by mutableFloatStateOf(0f)
         private set
@@ -400,19 +388,19 @@
      *
      * <b>If your anchors depend on the size of the layout, updateAnchors should be called in the
      * layout (placement) phase, e.g. through Modifier.onSizeChanged.</b> This ensures that the
-     * state is set up within the same frame.
-     * For static anchors, or anchors with different data dependencies, [updateAnchors] is safe to
-     * be called from side effects or layout.
+     * state is set up within the same frame. For static anchors, or anchors with different data
+     * dependencies, [updateAnchors] is safe to be called from side effects or layout.
      *
      * @param newAnchors The new anchors.
      * @param newTarget The new target, by default the closest anchor or the current target if there
-     * are no anchors.
+     *   are no anchors.
      */
     fun updateAnchors(
         newAnchors: DraggableAnchors<T>,
-        newTarget: T = if (!offset.isNaN()) {
-            newAnchors.closestAnchor(offset) ?: targetValue
-        } else targetValue
+        newTarget: T =
+            if (!offset.isNaN()) {
+                newAnchors.closestAnchor(offset) ?: targetValue
+            } else targetValue
     ) {
         if (anchors != newAnchors) {
             anchors = newAnchors
@@ -437,11 +425,12 @@
      */
     suspend fun settle(velocity: Float) {
         val previousValue = this.currentValue
-        val targetValue = computeTarget(
-            offset = requireOffset(),
-            currentValue = previousValue,
-            velocity = velocity
-        )
+        val targetValue =
+            computeTarget(
+                offset = requireOffset(),
+                currentValue = previousValue,
+                velocity = velocity
+            )
         if (confirmValueChange(targetValue)) {
             animateTo(targetValue, velocity)
         } else {
@@ -450,11 +439,7 @@
         }
     }
 
-    private fun computeTarget(
-        offset: Float,
-        currentValue: T,
-        velocity: Float
-    ): T {
+    private fun computeTarget(offset: Float, currentValue: T, velocity: Float): T {
         val currentAnchors = anchors
         val currentAnchorPosition = currentAnchors.positionOf(currentValue)
         val velocityThresholdPx = velocityThreshold()
@@ -506,20 +491,21 @@
         }
     }
 
-    private val anchoredDragScope: AnchoredDragScope = object : AnchoredDragScope {
-        override fun dragTo(newOffset: Float, lastKnownVelocity: Float) {
-            offset = newOffset
-            lastVelocity = lastKnownVelocity
+    private val anchoredDragScope: AnchoredDragScope =
+        object : AnchoredDragScope {
+            override fun dragTo(newOffset: Float, lastKnownVelocity: Float) {
+                offset = newOffset
+                lastVelocity = lastKnownVelocity
+            }
         }
-    }
 
     /**
      * Call this function to take control of drag logic and perform anchored drag with the latest
      * anchors.
      *
      * All actions that change the [offset] of this [AnchoredDraggableState] must be performed
-     * within an [anchoredDrag] block (even if they don't call any other methods on this object)
-     * in order to guarantee that mutual exclusion is enforced.
+     * within an [anchoredDrag] block (even if they don't call any other methods on this object) in
+     * order to guarantee that mutual exclusion is enforced.
      *
      * If [anchoredDrag] is called from elsewhere with the [dragPriority] higher or equal to ongoing
      * drag, the ongoing drag will be cancelled.
@@ -543,9 +529,10 @@
             }
         } finally {
             val closest = anchors.closestAnchor(offset)
-            if (closest != null &&
-                abs(offset - anchors.positionOf(closest)) <= 0.5f &&
-                confirmValueChange.invoke(closest)
+            if (
+                closest != null &&
+                    abs(offset - anchors.positionOf(closest)) <= 0.5f &&
+                    confirmValueChange.invoke(closest)
             ) {
                 currentValue = closest
             }
@@ -557,8 +544,8 @@
      * anchors and target.
      *
      * All actions that change the [offset] of this [AnchoredDraggableState] must be performed
-     * within an [anchoredDrag] block (even if they don't call any other methods on this object)
-     * in order to guarantee that mutual exclusion is enforced.
+     * within an [anchoredDrag] block (even if they don't call any other methods on this object) in
+     * order to guarantee that mutual exclusion is enforced.
      *
      * This overload allows the caller to hint the target value that this [anchoredDrag] is intended
      * to arrive to. This will set [AnchoredDraggableState.targetValue] to provided value so
@@ -584,18 +571,18 @@
             try {
                 dragMutex.mutate(dragPriority) {
                     dragTarget = targetValue
-                    restartable(
-                        inputs = { anchors to this@AnchoredDraggableState.targetValue }
-                    ) { (latestAnchors, latestTarget) ->
+                    restartable(inputs = { anchors to this@AnchoredDraggableState.targetValue }) {
+                        (latestAnchors, latestTarget) ->
                         anchoredDragScope.block(latestAnchors, latestTarget)
                     }
                 }
             } finally {
                 dragTarget = null
                 val closest = anchors.closestAnchor(offset)
-                if (closest != null &&
-                    abs(offset - anchors.positionOf(closest)) <= 0.5f &&
-                    confirmValueChange.invoke(closest)
+                if (
+                    closest != null &&
+                        abs(offset - anchors.positionOf(closest)) <= 0.5f &&
+                        confirmValueChange.invoke(closest)
                 ) {
                     currentValue = closest
                 }
@@ -607,8 +594,10 @@
     }
 
     internal fun newOffsetForDelta(delta: Float) =
-        ((if (offset.isNaN()) 0f else offset) + delta)
-            .coerceIn(anchors.minAnchor(), anchors.maxAnchor())
+        ((if (offset.isNaN()) 0f else offset) + delta).coerceIn(
+            anchors.minAnchor(),
+            anchors.maxAnchor()
+        )
 
     /**
      * Drag by the [delta], coerce it in the bounds and dispatch it to the [AnchoredDraggableState].
@@ -629,51 +618,50 @@
      *
      * @return true if the synchronous snap was successful, or false if we couldn't snap synchronous
      */
-    private fun trySnapTo(targetValue: T): Boolean = dragMutex.tryMutate {
-        with(anchoredDragScope) {
-            val targetOffset = anchors.positionOf(targetValue)
-            if (!targetOffset.isNaN()) {
-                dragTo(targetOffset)
-                dragTarget = null
+    private fun trySnapTo(targetValue: T): Boolean =
+        dragMutex.tryMutate {
+            with(anchoredDragScope) {
+                val targetOffset = anchors.positionOf(targetValue)
+                if (!targetOffset.isNaN()) {
+                    dragTo(targetOffset)
+                    dragTarget = null
+                }
+                currentValue = targetValue
             }
-            currentValue = targetValue
         }
-    }
 
     companion object {
-        /**
-         * The default [Saver] implementation for [AnchoredDraggableState].
-         */
+        /** The default [Saver] implementation for [AnchoredDraggableState]. */
         @ExperimentalMaterialApi
         fun <T : Any> Saver(
             animationSpec: AnimationSpec<Float>,
             confirmValueChange: (T) -> Boolean,
             positionalThreshold: (distance: Float) -> Float,
             velocityThreshold: () -> Float,
-        ) = Saver<AnchoredDraggableState<T>, T>(
-            save = { it.currentValue },
-            restore = {
-                AnchoredDraggableState(
-                    initialValue = it,
-                    animationSpec = animationSpec,
-                    confirmValueChange = confirmValueChange,
-                    positionalThreshold = positionalThreshold,
-                    velocityThreshold = velocityThreshold
-                )
-            }
-        )
+        ) =
+            Saver<AnchoredDraggableState<T>, T>(
+                save = { it.currentValue },
+                restore = {
+                    AnchoredDraggableState(
+                        initialValue = it,
+                        animationSpec = animationSpec,
+                        confirmValueChange = confirmValueChange,
+                        positionalThreshold = positionalThreshold,
+                        velocityThreshold = velocityThreshold
+                    )
+                }
+            )
     }
 }
 
 /**
- * Snap to a [targetValue] without any animation.
- * If the [targetValue] is not in the set of anchors, the [AnchoredDraggableState.currentValue] will
- * be updated to the [targetValue] without updating the offset.
- *
- * @throws CancellationException if the interaction interrupted by another interaction like a
- * gesture interaction or another programmatic interaction like a [animateTo] or [snapTo] call.
+ * Snap to a [targetValue] without any animation. If the [targetValue] is not in the set of anchors,
+ * the [AnchoredDraggableState.currentValue] will be updated to the [targetValue] without updating
+ * the offset.
  *
  * @param targetValue The target value of the animation
+ * @throws CancellationException if the interaction interrupted by another interaction like a
+ *   gesture interaction or another programmatic interaction like a [animateTo] or [snapTo] call.
  */
 @ExperimentalMaterialApi
 internal suspend fun <T> AnchoredDraggableState<T>.snapTo(targetValue: T) {
@@ -684,15 +672,14 @@
 }
 
 /**
- * Animate to a [targetValue].
- * If the [targetValue] is not in the set of anchors, the [AnchoredDraggableState.currentValue] will
- * be updated to the [targetValue] without updating the offset.
- *
- * @throws CancellationException if the interaction interrupted by another interaction like a
- * gesture interaction or another programmatic interaction like a [animateTo] or [snapTo] call.
+ * Animate to a [targetValue]. If the [targetValue] is not in the set of anchors, the
+ * [AnchoredDraggableState.currentValue] will be updated to the [targetValue] without updating the
+ * offset.
  *
  * @param targetValue The target value of the animation
  * @param velocity The velocity the animation should start with
+ * @throws CancellationException if the interaction interrupted by another interaction like a
+ *   gesture interaction or another programmatic interaction like a [animateTo] or [snapTo] call.
  */
 @ExperimentalMaterialApi
 internal suspend fun <T> AnchoredDraggableState<T>.animateTo(
@@ -715,15 +702,11 @@
     }
 }
 
-/**
- * Contains useful defaults for [anchoredDraggable] and [AnchoredDraggableState].
- */
+/** Contains useful defaults for [anchoredDraggable] and [AnchoredDraggableState]. */
 @Stable
 @ExperimentalMaterialApi
 internal object AnchoredDraggableDefaults {
-    /**
-     * The default animation used by [AnchoredDraggableState].
-     */
+    /** The default animation used by [AnchoredDraggableState]. */
     @get:ExperimentalMaterialApi
     @Suppress("OPT_IN_MARKER_ON_WRONG_TARGET")
     @ExperimentalMaterialApi
@@ -741,17 +724,17 @@
     try {
         coroutineScope {
             var previousDrag: Job? = null
-            snapshotFlow(inputs)
-                .collect { latestInputs ->
-                    previousDrag?.apply {
-                        cancel(AnchoredDragFinishedSignal())
-                        join()
-                    }
-                    previousDrag = launch(start = CoroutineStart.UNDISPATCHED) {
+            snapshotFlow(inputs).collect { latestInputs ->
+                previousDrag?.apply {
+                    cancel(AnchoredDragFinishedSignal())
+                    join()
+                }
+                previousDrag =
+                    launch(start = CoroutineStart.UNDISPATCHED) {
                         block(latestInputs)
                         this@coroutineScope.cancel(AnchoredDragFinishedSignal())
                     }
-                }
+            }
         }
     } catch (anchoredDragFinished: AnchoredDragFinishedSignal) {
         // Ignored
@@ -764,20 +747,19 @@
 private class MapDraggableAnchors<T>(private val anchors: Map<T, Float>) : DraggableAnchors<T> {
 
     override fun positionOf(value: T): Float = anchors[value] ?: Float.NaN
+
     override fun hasAnchorFor(value: T) = anchors.containsKey(value)
 
-    override fun closestAnchor(position: Float): T? = anchors.minByOrNull {
-        abs(position - it.value)
-    }?.key
+    override fun closestAnchor(position: Float): T? =
+        anchors.minByOrNull { abs(position - it.value) }?.key
 
-    override fun closestAnchor(
-        position: Float,
-        searchUpwards: Boolean
-    ): T? {
-        return anchors.minByOrNull { (_, anchor) ->
-            val delta = if (searchUpwards) anchor - position else position - anchor
-            if (delta < 0) Float.POSITIVE_INFINITY else delta
-        }?.key
+    override fun closestAnchor(position: Float, searchUpwards: Boolean): T? {
+        return anchors
+            .minByOrNull { (_, anchor) ->
+                val delta = if (searchUpwards) anchor - position else position - anchor
+                if (delta < 0) Float.POSITIVE_INFINITY else delta
+            }
+            ?.key
     }
 
     override fun minAnchor() = anchors.values.minOrNull() ?: Float.NaN
@@ -801,17 +783,16 @@
 
 /**
  * This Modifier allows configuring an [AnchoredDraggableState]'s anchors based on this layout
- * node's size and offsetting it.
- * It considers lookahead and reports the appropriate size and measurement for the appropriate
- * phase.
+ * node's size and offsetting it. It considers lookahead and reports the appropriate size and
+ * measurement for the appropriate phase.
  *
  * @param state The state the anchors should be attached to
  * @param orientation The orientation the component should be offset in
  * @param anchors Lambda to calculate the anchors based on this layout's size and the incoming
- * constraints. These can be useful to avoid subcomposition.
+ *   constraints. These can be useful to avoid subcomposition.
  */
 @ExperimentalMaterialApi
-internal fun<T> Modifier.draggableAnchors(
+internal fun <T> Modifier.draggableAnchors(
     state: AnchoredDraggableState<T>,
     orientation: Orientation,
     anchors: (size: IntSize, constraints: Constraints) -> Pair<DraggableAnchors<T>, T>,
@@ -890,9 +871,10 @@
             // In a lookahead pass, we use the position of the current target as this is where any
             // ongoing animations would move. If the component is in a settled state, lookahead
             // and post-lookahead will converge.
-            val offset = if (isLookingAhead) {
-                state.anchors.positionOf(state.targetValue)
-            } else state.requireOffset()
+            val offset =
+                if (isLookingAhead) {
+                    state.anchors.positionOf(state.targetValue)
+                } else state.requireOffset()
             val xOffset = if (orientation == Orientation.Horizontal) offset else 0f
             val yOffset = if (orientation == Orientation.Vertical) offset else 0f
             placeable.place(xOffset.roundToInt(), yOffset.roundToInt())
diff --git a/compose/material/material/src/commonMain/kotlin/androidx/compose/material/AppBar.kt b/compose/material/material/src/commonMain/kotlin/androidx/compose/material/AppBar.kt
index 43f922c..4fe3a9f 100644
--- a/compose/material/material/src/commonMain/kotlin/androidx/compose/material/AppBar.kt
+++ b/compose/material/material/src/commonMain/kotlin/androidx/compose/material/AppBar.kt
@@ -51,19 +51,20 @@
 import kotlin.math.sqrt
 
 /**
- * <a href="https://material.io/components/app-bars-top" class="external" target="_blank">Material Design top app bar</a>.
+ * <a href="https://material.io/components/app-bars-top" class="external" target="_blank">Material
+ * Design top app bar</a>.
  *
  * The top app bar displays information and actions relating to the current screen.
  *
- * ![App bars: top image](https://developer.android.com/images/reference/androidx/compose/material/app-bars-top.png)
+ * ![App bars: top
+ * image](https://developer.android.com/images/reference/androidx/compose/material/app-bars-top.png)
  *
  * This particular overload provides ability to specify [WindowInsets]. Recommended value can be
  * found in [AppBarDefaults.topAppBarWindowInsets].
  *
- * This TopAppBar has slots for a title, navigation icon, and actions. Note that the [title] slot
- * is inset from the start according to spec - for custom use cases such as horizontally
- * centering the title, use the other TopAppBar overload for a generic TopAppBar with no
- * restriction on content.
+ * This TopAppBar has slots for a title, navigation icon, and actions. Note that the [title] slot is
+ * inset from the start according to spec - for custom use cases such as horizontally centering the
+ * title, use the other TopAppBar overload for a generic TopAppBar with no restriction on content.
  *
  * @sample androidx.compose.material.samples.SimpleTopAppBar
  *
@@ -71,14 +72,14 @@
  * @param windowInsets a window insets that app bar will respect.
  * @param modifier The [Modifier] to be applied to this TopAppBar
  * @param navigationIcon The navigation icon displayed at the start of the TopAppBar. This should
- * typically be an [IconButton] or [IconToggleButton].
+ *   typically be an [IconButton] or [IconToggleButton].
  * @param actions The actions displayed at the end of the TopAppBar. This should typically be
- * [IconButton]s. The default layout here is a [Row], so icons inside will be placed horizontally.
- * @param backgroundColor The background color for the TopAppBar. Use [Color.Transparent] to have
- * no color.
+ *   [IconButton]s. The default layout here is a [Row], so icons inside will be placed horizontally.
+ * @param backgroundColor The background color for the TopAppBar. Use [Color.Transparent] to have no
+ *   color.
  * @param contentColor The preferred content color provided by this TopAppBar to its children.
- * Defaults to either the matching content color for [backgroundColor], or if [backgroundColor]
- * is not a color from the theme, this will keep the same value set above this TopAppBar.
+ *   Defaults to either the matching content color for [backgroundColor], or if [backgroundColor] is
+ *   not a color from the theme, this will keep the same value set above this TopAppBar.
  * @param elevation the elevation of this TopAppBar.
  */
 @Composable
@@ -112,12 +113,7 @@
             }
         }
 
-        Row(
-            Modifier
-                .fillMaxHeight()
-                .weight(1f),
-            verticalAlignment = Alignment.CenterVertically
-        ) {
+        Row(Modifier.fillMaxHeight().weight(1f), verticalAlignment = Alignment.CenterVertically) {
             ProvideTextStyle(value = MaterialTheme.typography.h6) {
                 CompositionLocalProvider(
                     LocalContentAlpha provides ContentAlpha.high,
@@ -138,30 +134,31 @@
 }
 
 /**
- * <a href="https://material.io/components/app-bars-top" class="external" target="_blank">Material Design top app bar</a>.
+ * <a href="https://material.io/components/app-bars-top" class="external" target="_blank">Material
+ * Design top app bar</a>.
  *
  * The top app bar displays information and actions relating to the current screen.
  *
- * ![App bars: top image](https://developer.android.com/images/reference/androidx/compose/material/app-bars-top.png)
+ * ![App bars: top
+ * image](https://developer.android.com/images/reference/androidx/compose/material/app-bars-top.png)
  *
- * This TopAppBar has slots for a title, navigation icon, and actions. Note that the [title] slot
- * is inset from the start according to spec - for custom use cases such as horizontally
- * centering the title, use the other TopAppBar overload for a generic TopAppBar with no
- * restriction on content.
+ * This TopAppBar has slots for a title, navigation icon, and actions. Note that the [title] slot is
+ * inset from the start according to spec - for custom use cases such as horizontally centering the
+ * title, use the other TopAppBar overload for a generic TopAppBar with no restriction on content.
  *
  * @sample androidx.compose.material.samples.SimpleTopAppBar
  *
  * @param title The title to be displayed in the center of the TopAppBar
  * @param modifier The [Modifier] to be applied to this TopAppBar
  * @param navigationIcon The navigation icon displayed at the start of the TopAppBar. This should
- * typically be an [IconButton] or [IconToggleButton].
+ *   typically be an [IconButton] or [IconToggleButton].
  * @param actions The actions displayed at the end of the TopAppBar. This should typically be
- * [IconButton]s. The default layout here is a [Row], so icons inside will be placed horizontally.
- * @param backgroundColor The background color for the TopAppBar. Use [Color.Transparent] to have
- * no color.
+ *   [IconButton]s. The default layout here is a [Row], so icons inside will be placed horizontally.
+ * @param backgroundColor The background color for the TopAppBar. Use [Color.Transparent] to have no
+ *   color.
  * @param contentColor The preferred content color provided by this TopAppBar to its children.
- * Defaults to either the matching content color for [backgroundColor], or if [backgroundColor]
- * is not a color from the theme, this will keep the same value set above this TopAppBar.
+ *   Defaults to either the matching content color for [backgroundColor], or if [backgroundColor] is
+ *   not a color from the theme, this will keep the same value set above this TopAppBar.
  * @param elevation the elevation of this TopAppBar.
  */
 @Composable
@@ -187,34 +184,36 @@
 }
 
 /**
- * <a href="https://material.io/components/app-bars-top" class="external" target="_blank">Material Design top app bar</a>.
+ * <a href="https://material.io/components/app-bars-top" class="external" target="_blank">Material
+ * Design top app bar</a>.
  *
  * The top app bar displays information and actions relating to the current screen.
  *
- * ![App bars: top image](https://developer.android.com/images/reference/androidx/compose/material/app-bars-top.png)
+ * ![App bars: top
+ * image](https://developer.android.com/images/reference/androidx/compose/material/app-bars-top.png)
  *
  * This particular overload provides ability to specify [WindowInsets]. Recommended value can be
  * found in [AppBarDefaults.topAppBarWindowInsets].
  *
  * This TopAppBar has no pre-defined slots for content, allowing you to customize the layout of
- * content inside. See the other TopAppBar overload for a TopAppBar that has opinionated slots
- * for title, navigation icon, and trailing actions.
+ * content inside. See the other TopAppBar overload for a TopAppBar that has opinionated slots for
+ * title, navigation icon, and trailing actions.
  *
- * The [LocalContentAlpha] inside this TopAppBar is [ContentAlpha.medium] - this is the default
- * for trailing and overflow icons. It is recommended that any text, and leading icons at the
- * start of the TopAppBar use [ContentAlpha.high] instead.
+ * The [LocalContentAlpha] inside this TopAppBar is [ContentAlpha.medium] - this is the default for
+ * trailing and overflow icons. It is recommended that any text, and leading icons at the start of
+ * the TopAppBar use [ContentAlpha.high] instead.
  *
  * @param windowInsets a window insets that app bar will respect.
  * @param modifier The [Modifier] to be applied to this TopAppBar
- * @param backgroundColor The background color for the TopAppBar. Use [Color.Transparent] to have
- * no color.
+ * @param backgroundColor The background color for the TopAppBar. Use [Color.Transparent] to have no
+ *   color.
  * @param contentColor The preferred content color provided by this TopAppBar to its children.
- * Defaults to either the matching content color for [backgroundColor], or if [backgroundColor] is
- * not a color from the theme, this will keep the same value set above this TopAppBar.
+ *   Defaults to either the matching content color for [backgroundColor], or if [backgroundColor] is
+ *   not a color from the theme, this will keep the same value set above this TopAppBar.
  * @param elevation the elevation of this TopAppBar.
  * @param contentPadding the padding applied to the content of this TopAppBar
- * @param content the content of this TopAppBar.The default layout here is a [Row],
- * so content inside will be placed horizontally.
+ * @param content the content of this TopAppBar.The default layout here is a [Row], so content
+ *   inside will be placed horizontally.
  */
 @Composable
 fun TopAppBar(
@@ -239,30 +238,32 @@
 }
 
 /**
- * <a href="https://material.io/components/app-bars-top" class="external" target="_blank">Material Design top app bar</a>.
+ * <a href="https://material.io/components/app-bars-top" class="external" target="_blank">Material
+ * Design top app bar</a>.
  *
  * The top app bar displays information and actions relating to the current screen.
  *
- * ![App bars: top image](https://developer.android.com/images/reference/androidx/compose/material/app-bars-top.png)
+ * ![App bars: top
+ * image](https://developer.android.com/images/reference/androidx/compose/material/app-bars-top.png)
  *
  * This TopAppBar has no pre-defined slots for content, allowing you to customize the layout of
- * content inside. See the other TopAppBar overload for a TopAppBar that has opinionated slots
- * for title, navigation icon, and trailing actions.
+ * content inside. See the other TopAppBar overload for a TopAppBar that has opinionated slots for
+ * title, navigation icon, and trailing actions.
  *
- * The [LocalContentAlpha] inside this TopAppBar is [ContentAlpha.medium] - this is the default
- * for trailing and overflow icons. It is recommended that any text, and leading icons at the
- * start of the TopAppBar use [ContentAlpha.high] instead.
+ * The [LocalContentAlpha] inside this TopAppBar is [ContentAlpha.medium] - this is the default for
+ * trailing and overflow icons. It is recommended that any text, and leading icons at the start of
+ * the TopAppBar use [ContentAlpha.high] instead.
  *
  * @param modifier The [Modifier] to be applied to this TopAppBar
- * @param backgroundColor The background color for the TopAppBar. Use [Color.Transparent] to have
- * no color.
+ * @param backgroundColor The background color for the TopAppBar. Use [Color.Transparent] to have no
+ *   color.
  * @param contentColor The preferred content color provided by this TopAppBar to its children.
- * Defaults to either the matching content color for [backgroundColor], or if [backgroundColor] is
- * not a color from the theme, this will keep the same value set above this TopAppBar.
+ *   Defaults to either the matching content color for [backgroundColor], or if [backgroundColor] is
+ *   not a color from the theme, this will keep the same value set above this TopAppBar.
  * @param elevation the elevation of this TopAppBar.
  * @param contentPadding the padding applied to the content of this TopAppBar
- * @param content the content of this TopAppBar.The default layout here is a [Row],
- * so content inside will be placed horizontally.
+ * @param content the content of this TopAppBar.The default layout here is a [Row], so content
+ *   inside will be placed horizontally.
  */
 @Composable
 fun TopAppBar(
@@ -286,17 +287,19 @@
 }
 
 /**
- * <a href="https://material.io/components/app-bars-bottom" class="external" target="_blank">Material Design bottom app bar</a>.
+ * <a href="https://material.io/components/app-bars-bottom" class="external"
+ * target="_blank">Material Design bottom app bar</a>.
  *
  * A bottom app bar displays navigation and key actions at the bottom of screens.
  *
- * ![App bars: bottom image](https://developer.android.com/images/reference/androidx/compose/material/app-bars-bottom.png)
+ * ![App bars: bottom
+ * image](https://developer.android.com/images/reference/androidx/compose/material/app-bars-bottom.png)
  *
  * This particular overload provides ability to specify [WindowInsets]. Recommended value can be
  * found in [AppBarDefaults.bottomAppBarWindowInsets].
  *
- * It can also optionally display a [FloatingActionButton], which is either overlaid
- * on top of the BottomAppBar, or inset, carving a cutout in the BottomAppBar.
+ * It can also optionally display a [FloatingActionButton], which is either overlaid on top of the
+ * BottomAppBar, or inset, carving a cutout in the BottomAppBar.
  *
  * See [BottomAppBar anatomy](https://material.io/components/app-bars-bottom/#anatomy) for the
  * recommended content depending on the [FloatingActionButton] position.
@@ -304,8 +307,8 @@
  * Note that when you pass a non-null [cutoutShape] this makes the AppBar shape concave. The shadows
  * for such shapes will not be drawn on Android versions less than 10.
  *
- * The [LocalContentAlpha] inside a BottomAppBar is [ContentAlpha.medium] - this is the default
- * for trailing and overflow icons. It is recommended that any leading icons at the start of the
+ * The [LocalContentAlpha] inside a BottomAppBar is [ContentAlpha.medium] - this is the default for
+ * trailing and overflow icons. It is recommended that any leading icons at the start of the
  * BottomAppBar, such as a menu icon, use [ContentAlpha.high] instead. This is demonstrated in the
  * sample below.
  *
@@ -315,19 +318,19 @@
  *
  * @param windowInsets a window insets that app bar will respect.
  * @param modifier The [Modifier] to be applied to this BottomAppBar
- * @param backgroundColor The background color for the BottomAppBar. Use [Color.Transparent] to
- * have no color.
+ * @param backgroundColor The background color for the BottomAppBar. Use [Color.Transparent] to have
+ *   no color.
  * @param contentColor The preferred content color provided by this BottomAppBar to its children.
- * Defaults to either the matching content color for [backgroundColor], or if [backgroundColor] is
- * not a color from the theme, this will keep the same value set above this BottomAppBar.
- * @param cutoutShape the shape of the cutout that will be added to the BottomAppBar - this
- * should typically be the same shape used inside the [FloatingActionButton], when [BottomAppBar]
- * and [FloatingActionButton] are being used together in [Scaffold]. This shape will be drawn with
- * an offset around all sides. If null, where will be no cutout.
+ *   Defaults to either the matching content color for [backgroundColor], or if [backgroundColor] is
+ *   not a color from the theme, this will keep the same value set above this BottomAppBar.
+ * @param cutoutShape the shape of the cutout that will be added to the BottomAppBar - this should
+ *   typically be the same shape used inside the [FloatingActionButton], when [BottomAppBar] and
+ *   [FloatingActionButton] are being used together in [Scaffold]. This shape will be drawn with an
+ *   offset around all sides. If null, where will be no cutout.
  * @param elevation the elevation of this BottomAppBar.
  * @param contentPadding the padding applied to the content of this BottomAppBar
- * @param content the content of this BottomAppBar. The default layout here is a [Row],
- * so content inside will be placed horizontally.
+ * @param content the content of this BottomAppBar. The default layout here is a [Row], so content
+ *   inside will be placed horizontally.
  */
 @Composable
 fun BottomAppBar(
@@ -341,11 +344,12 @@
     content: @Composable RowScope.() -> Unit
 ) {
     val fabPlacement = LocalFabPlacement.current
-    val shape = if (cutoutShape != null && fabPlacement?.isDocked == true) {
-        BottomAppBarCutoutShape(cutoutShape, fabPlacement)
-    } else {
-        RectangleShape
-    }
+    val shape =
+        if (cutoutShape != null && fabPlacement?.isDocked == true) {
+            BottomAppBarCutoutShape(cutoutShape, fabPlacement)
+        } else {
+            RectangleShape
+        }
     AppBar(
         backgroundColor,
         contentColor,
@@ -359,14 +363,16 @@
 }
 
 /**
- * <a href="https://material.io/components/app-bars-bottom" class="external" target="_blank">Material Design bottom app bar</a>.
+ * <a href="https://material.io/components/app-bars-bottom" class="external"
+ * target="_blank">Material Design bottom app bar</a>.
  *
  * A bottom app bar displays navigation and key actions at the bottom of screens.
  *
- * ![App bars: bottom image](https://developer.android.com/images/reference/androidx/compose/material/app-bars-bottom.png)
+ * ![App bars: bottom
+ * image](https://developer.android.com/images/reference/androidx/compose/material/app-bars-bottom.png)
  *
- * It can also optionally display a [FloatingActionButton], which is either overlaid
- * on top of the BottomAppBar, or inset, carving a cutout in the BottomAppBar.
+ * It can also optionally display a [FloatingActionButton], which is either overlaid on top of the
+ * BottomAppBar, or inset, carving a cutout in the BottomAppBar.
  *
  * See [BottomAppBar anatomy](https://material.io/components/app-bars-bottom/#anatomy) for the
  * recommended content depending on the [FloatingActionButton] position.
@@ -374,8 +380,8 @@
  * Note that when you pass a non-null [cutoutShape] this makes the AppBar shape concave. The shadows
  * for such shapes will not be drawn on Android versions less than 10.
  *
- * The [LocalContentAlpha] inside a BottomAppBar is [ContentAlpha.medium] - this is the default
- * for trailing and overflow icons. It is recommended that any leading icons at the start of the
+ * The [LocalContentAlpha] inside a BottomAppBar is [ContentAlpha.medium] - this is the default for
+ * trailing and overflow icons. It is recommended that any leading icons at the start of the
  * BottomAppBar, such as a menu icon, use [ContentAlpha.high] instead. This is demonstrated in the
  * sample below.
  *
@@ -384,19 +390,19 @@
  * @sample androidx.compose.material.samples.SimpleBottomAppBar
  *
  * @param modifier The [Modifier] to be applied to this BottomAppBar
- * @param backgroundColor The background color for the BottomAppBar. Use [Color.Transparent] to
- * have no color.
+ * @param backgroundColor The background color for the BottomAppBar. Use [Color.Transparent] to have
+ *   no color.
  * @param contentColor The preferred content color provided by this BottomAppBar to its children.
- * Defaults to either the matching content color for [backgroundColor], or if [backgroundColor] is
- * not a color from the theme, this will keep the same value set above this BottomAppBar.
- * @param cutoutShape the shape of the cutout that will be added to the BottomAppBar - this
- * should typically be the same shape used inside the [FloatingActionButton], when [BottomAppBar]
- * and [FloatingActionButton] are being used together in [Scaffold]. This shape will be drawn with
- * an offset around all sides. If null, where will be no cutout.
+ *   Defaults to either the matching content color for [backgroundColor], or if [backgroundColor] is
+ *   not a color from the theme, this will keep the same value set above this BottomAppBar.
+ * @param cutoutShape the shape of the cutout that will be added to the BottomAppBar - this should
+ *   typically be the same shape used inside the [FloatingActionButton], when [BottomAppBar] and
+ *   [FloatingActionButton] are being used together in [Scaffold]. This shape will be drawn with an
+ *   offset around all sides. If null, where will be no cutout.
  * @param elevation the elevation of this BottomAppBar.
  * @param contentPadding the padding applied to the content of this BottomAppBar
- * @param content the content of this BottomAppBar. The default layout here is a [Row],
- * so content inside will be placed horizontally.
+ * @param content the content of this BottomAppBar. The default layout here is a [Row], so content
+ *   inside will be placed horizontally.
  */
 @Composable
 fun BottomAppBar(
@@ -409,11 +415,12 @@
     content: @Composable RowScope.() -> Unit
 ) {
     val fabPlacement = LocalFabPlacement.current
-    val shape = if (cutoutShape != null && fabPlacement?.isDocked == true) {
-        BottomAppBarCutoutShape(cutoutShape, fabPlacement)
-    } else {
-        RectangleShape
-    }
+    val shape =
+        if (cutoutShape != null && fabPlacement?.isDocked == true) {
+            BottomAppBarCutoutShape(cutoutShape, fabPlacement)
+        } else {
+            RectangleShape
+        }
     AppBar(
         backgroundColor,
         contentColor,
@@ -426,46 +433,35 @@
     )
 }
 
-/**
- * Contains default values used for [TopAppBar] and [BottomAppBar].
- */
+/** Contains default values used for [TopAppBar] and [BottomAppBar]. */
 object AppBarDefaults {
     // TODO: clarify elevation in surface mapping - spec says 0.dp but it appears to have an
     //  elevation overlay applied in dark theme examples.
-    /**
-     * Default elevation used for [TopAppBar].
-     */
+    /** Default elevation used for [TopAppBar]. */
     val TopAppBarElevation = 4.dp
 
-    /**
-     * Default elevation used for [BottomAppBar].
-     */
+    /** Default elevation used for [BottomAppBar]. */
     val BottomAppBarElevation = 8.dp
 
-    /**
-     * Default padding used for [TopAppBar] and [BottomAppBar].
-     */
-    val ContentPadding = PaddingValues(
-        start = AppBarHorizontalPadding,
-        end = AppBarHorizontalPadding
-    )
+    /** Default padding used for [TopAppBar] and [BottomAppBar]. */
+    val ContentPadding =
+        PaddingValues(start = AppBarHorizontalPadding, end = AppBarHorizontalPadding)
 
-    /**
-     * Recommended insets to be used and consumed by the top app bars
-     */
+    /** Recommended insets to be used and consumed by the top app bars */
     val topAppBarWindowInsets: WindowInsets
         @Composable
-        get() = WindowInsets.systemBarsForVisualComponents
-            .only(WindowInsetsSides.Horizontal + WindowInsetsSides.Top)
+        get() =
+            WindowInsets.systemBarsForVisualComponents.only(
+                WindowInsetsSides.Horizontal + WindowInsetsSides.Top
+            )
 
-    /**
-     * Recommended insets to be used and consumed by the bottom app bars
-     */
+    /** Recommended insets to be used and consumed by the bottom app bars */
     val bottomAppBarWindowInsets: WindowInsets
         @Composable
         get() {
-            return WindowInsets.systemBarsForVisualComponents
-                .only(WindowInsetsSides.Horizontal + WindowInsetsSides.Bottom)
+            return WindowInsets.systemBarsForVisualComponents.only(
+                WindowInsetsSides.Horizontal + WindowInsetsSides.Bottom
+            )
         }
 }
 
@@ -475,24 +471,21 @@
  * A [Shape] that represents a bottom app bar with a cutout. The cutout drawn will be [cutoutShape]
  * increased in size by [BottomAppBarCutoutOffset] on all sides.
  */
-private data class BottomAppBarCutoutShape(
-    val cutoutShape: Shape,
-    val fabPlacement: FabPlacement
-) : Shape {
+private data class BottomAppBarCutoutShape(val cutoutShape: Shape, val fabPlacement: FabPlacement) :
+    Shape {
 
     override fun createOutline(
         size: Size,
         layoutDirection: LayoutDirection,
         density: Density
     ): Outline {
-        val boundingRectangle = Path().apply {
-            addRect(Rect(0f, 0f, size.width, size.height))
-        }
-        val path = Path().apply {
-            addCutoutShape(layoutDirection, density)
-            // Subtract this path from the bounding rectangle
-            op(boundingRectangle, this, PathOperation.Difference)
-        }
+        val boundingRectangle = Path().apply { addRect(Rect(0f, 0f, size.width, size.height)) }
+        val path =
+            Path().apply {
+                addCutoutShape(layoutDirection, density)
+                // Subtract this path from the bounding rectangle
+                op(boundingRectangle, this, PathOperation.Difference)
+            }
         return Outline.Generic(path)
     }
 
@@ -504,10 +497,11 @@
         // The gap on all sides between the FAB and the cutout
         val cutoutOffset = with(density) { BottomAppBarCutoutOffset.toPx() }
 
-        val cutoutSize = Size(
-            width = fabPlacement.width + (cutoutOffset * 2),
-            height = fabPlacement.height + (cutoutOffset * 2)
-        )
+        val cutoutSize =
+            Size(
+                width = fabPlacement.width + (cutoutOffset * 2),
+                height = fabPlacement.height + (cutoutOffset * 2)
+            )
 
         val cutoutStartX = fabPlacement.left - cutoutOffset
         val cutoutEndX = cutoutStartX + cutoutSize.width
@@ -532,16 +526,16 @@
      * Adds rounded edges to the [Path] representing a circular cutout in a BottomAppBar.
      *
      * Adds a curve for the left and right edges, with a straight line drawn between them - this
-     * combined with the cutout shape results in the overall cutout path that can be subtracted
-     * from the bounding rect of the app bar.
+     * combined with the cutout shape results in the overall cutout path that can be subtracted from
+     * the bounding rect of the app bar.
      *
      * @param cutoutStartPosition the absolute start position of the cutout
      * @param cutoutEndPosition the absolute end position of the cutout
      * @param cutoutRadius the radius of the cutout's circular edge - for a typical circular FAB
-     * this will just be the radius of the circular cutout, but in the case of an extended FAB, we
-     * can model this as two circles on either side attached to a rectangle.
+     *   this will just be the radius of the circular cutout, but in the case of an extended FAB, we
+     *   can model this as two circles on either side attached to a rectangle.
      * @param roundedEdgeRadius how far from the points where the cutout intersects with the app bar
-     * should the rounded edges be drawn to.
+     *   should the rounded edges be drawn to.
      * @param verticalOffset how far the app bar is from the center of the cutout circle
      */
     private fun Path.addRoundedEdges(
@@ -566,11 +560,8 @@
 
         // The coordinates offset from the center of the radius of the cutout, where we should
         // draw the curve to
-        val (curveInterceptXOffset, curveInterceptYOffset) = calculateRoundedEdgeIntercept(
-            controlPointRadiusOffset,
-            verticalOffset,
-            cutoutRadius
-        )
+        val (curveInterceptXOffset, curveInterceptYOffset) =
+            calculateRoundedEdgeIntercept(controlPointRadiusOffset, verticalOffset, cutoutRadius)
 
         // Convert the offset relative to the center of the cutout circle into an absolute
         // coordinate, by adding the radius of the shape to get a pure relative offset from the
@@ -599,21 +590,17 @@
     }
 }
 
-/**
- * Helper to make the following equations easier to read
- */
-@Suppress("NOTHING_TO_INLINE")
-private inline fun square(x: Float) = x * x
+/** Helper to make the following equations easier to read */
+@Suppress("NOTHING_TO_INLINE") private inline fun square(x: Float) = x * x
 
 /**
  * Returns the relative y intercept for a circle with the given [cutoutRadius] and [verticalOffset]
  *
  * Returns the leftmost intercept, so this will be a negative number that when added to the circle's
- * absolute origin will give the absolute position of the left intercept, where the circle meets
- * the app bar.
+ * absolute origin will give the absolute position of the left intercept, where the circle meets the
+ * app bar.
  *
- * Explanation:
- * First construct the equation for a circle with given radius and vertical offset:
+ * Explanation: First construct the equation for a circle with given radius and vertical offset:
  * x^2 + (y-verticalOffset)^2 = radius^2
  *
  * We want to find the y intercept where the cutout hits the top edge of the bottom app bar, so
@@ -635,19 +622,19 @@
 // TODO: Consider extracting this into the shape package / similar, might be useful for cutouts in
 // general.
 /**
- * For a given control point on a quadratic bezier curve, calculates the required intercept
- * point to create a smooth curve between the rounded edges near the cutout, and the actual curve
- * that is part of the cutout.
+ * For a given control point on a quadratic bezier curve, calculates the required intercept point to
+ * create a smooth curve between the rounded edges near the cutout, and the actual curve that is
+ * part of the cutout.
  *
- * This returns the relative offset from the center of a circle with radius that is half the
- * height of the cutout.
+ * This returns the relative offset from the center of a circle with radius that is half the height
+ * of the cutout.
  *
  * Explanation and derivation comes from the Flutter team: https://goo.gl/Ufzrqn
  *
  * @param controlPointX the horizontal offset of the control point from the center of the circle
  * @param verticalOffset the vertical offset of the top edge of the app bar from the center of the
- * circle. I.e, if this is 2f, then the top edge of the app bar is 2f below the center. If 0f, the
- * top edge of the app bar is in centered inside the circle.
+ *   circle. I.e, if this is 2f, then the top edge of the app bar is 2f below the center. If 0f, the
+ *   top edge of the app bar is in centered inside the circle.
  * @param radius the radius of the circle - essentially the 'depth' of the cutout
  */
 @Suppress("UnnecessaryVariable")
@@ -681,17 +668,19 @@
     // bar is always on the bottom edge of the circle, we are always interested in the bottom half
     // solution. To calculate which is which, it depends on whether the vertical offset is positive
     // or negative.
-    val (xSolution, ySolution) = if (b > 0) {
-        // When the offset is positive, the top edge of the app bar is below the center of the
-        // circle. The largest solution will be the one closest to the bottom of the circle, so we
-        // pick that.
-        if (ySolutionA > ySolutionB) xSolutionA to ySolutionA else xSolutionB to ySolutionB
-    } else {
-        // When the offset is negative, the top edge of the app bar is above the center of the
-        // circle. The smallest solution will be the one closest to the top of the circle, so we
-        // pick that.
-        if (ySolutionA < ySolutionB) xSolutionA to ySolutionA else xSolutionB to ySolutionB
-    }
+    val (xSolution, ySolution) =
+        if (b > 0) {
+            // When the offset is positive, the top edge of the app bar is below the center of the
+            // circle. The largest solution will be the one closest to the bottom of the circle, so
+            // we
+            // pick that.
+            if (ySolutionA > ySolutionB) xSolutionA to ySolutionA else xSolutionB to ySolutionB
+        } else {
+            // When the offset is negative, the top edge of the app bar is above the center of the
+            // circle. The smallest solution will be the one closest to the top of the circle, so we
+            // pick that.
+            if (ySolutionA < ySolutionB) xSolutionA to ySolutionA else xSolutionB to ySolutionB
+        }
 
     // If the calculated x coordinate is further away from the origin than the control point, the
     // curve will fold back on itself. In this scenario, we actually join the circle above the
@@ -727,8 +716,7 @@
     ) {
         CompositionLocalProvider(LocalContentAlpha provides ContentAlpha.medium) {
             Row(
-                Modifier
-                    .fillMaxWidth()
+                Modifier.fillMaxWidth()
                     .windowInsetsPadding(windowInsets)
                     .padding(contentPadding)
                     .height(AppBarHeight),
@@ -746,8 +734,7 @@
 // Start inset for the title when there is no navigation icon provided
 private val TitleInsetWithoutIcon = Modifier.width(16.dp - AppBarHorizontalPadding)
 // Start inset for the title when there is a navigation icon provided
-private val TitleIconModifier = Modifier.fillMaxHeight()
-    .width(72.dp - AppBarHorizontalPadding)
+private val TitleIconModifier = Modifier.fillMaxHeight().width(72.dp - AppBarHorizontalPadding)
 
 // The gap on all sides between the FAB and the cutout
 private val BottomAppBarCutoutOffset = 8.dp
diff --git a/compose/material/material/src/commonMain/kotlin/androidx/compose/material/BackdropScaffold.kt b/compose/material/material/src/commonMain/kotlin/androidx/compose/material/BackdropScaffold.kt
index 00636a4..5a09525 100644
--- a/compose/material/material/src/commonMain/kotlin/androidx/compose/material/BackdropScaffold.kt
+++ b/compose/material/material/src/commonMain/kotlin/androidx/compose/material/BackdropScaffold.kt
@@ -73,18 +73,12 @@
 import kotlinx.coroutines.CancellationException
 import kotlinx.coroutines.launch
 
-/**
- * Possible values of [BackdropScaffoldState].
- */
+/** Possible values of [BackdropScaffoldState]. */
 enum class BackdropValue {
-    /**
-     * Indicates the back layer is concealed and the front layer is active.
-     */
+    /** Indicates the back layer is concealed and the front layer is active. */
     Concealed,
 
-    /**
-     * Indicates the back layer is revealed and the front layer is inactive.
-     */
+    /** Indicates the back layer is revealed and the front layer is inactive. */
     Revealed
 }
 
@@ -105,14 +99,10 @@
     animationSpec: AnimationSpec<Float> = BackdropScaffoldDefaults.AnimationSpec,
     confirmValueChange: (BackdropValue) -> Boolean = { true },
     snackbarHostState: SnackbarHostState = SnackbarHostState(),
-) = BackdropScaffoldState(
-    initialValue,
-    animationSpec,
-    confirmValueChange,
-    snackbarHostState
-).also {
-    it.density = density
-}
+) =
+    BackdropScaffoldState(initialValue, animationSpec, confirmValueChange, snackbarHostState).also {
+        it.density = density
+    }
 
 /**
  * State of the [BackdropScaffold] composable.
@@ -124,7 +114,8 @@
  */
 @OptIn(ExperimentalMaterialApi::class)
 @Stable
-class BackdropScaffoldState @Deprecated(
+class BackdropScaffoldState
+@Deprecated(
     "This constructor is deprecated. Density must be provided by the component. " +
         "Please use the constructor that provides a [Density].",
     ReplaceWith(
@@ -137,15 +128,14 @@
             )
             """
     )
-) constructor(
+)
+constructor(
     initialValue: BackdropValue,
     animationSpec: AnimationSpec<Float> = BackdropScaffoldDefaults.AnimationSpec,
     val confirmValueChange: (BackdropValue) -> Boolean = { true },
     val snackbarHostState: SnackbarHostState = SnackbarHostState(),
 ) {
-    /**
-     * The current value of the [BottomSheetState].
-     */
+    /** The current value of the [BottomSheetState]. */
     val currentValue: BackdropValue
         get() = anchoredDraggableState.currentValue
 
@@ -163,21 +153,17 @@
      */
     fun requireOffset() = anchoredDraggableState.requireOffset()
 
-    /**
-     * Whether the back layer is revealed.
-     */
+    /** Whether the back layer is revealed. */
     val isRevealed: Boolean
         get() = anchoredDraggableState.currentValue == Revealed
 
-    /**
-     * Whether the back layer is concealed.
-     */
+    /** Whether the back layer is concealed. */
     val isConcealed: Boolean
         get() = anchoredDraggableState.currentValue == Concealed
 
     /**
-     * Reveal the back layer with animation and suspend until it if fully revealed or animation
-     * has been cancelled.  This method will throw [CancellationException] if the animation is
+     * Reveal the back layer with animation and suspend until it if fully revealed or animation has
+     * been cancelled. This method will throw [CancellationException] if the animation is
      * interrupted
      */
     suspend fun reveal() = anchoredDraggableState.animateTo(targetValue = Revealed)
@@ -197,70 +183,60 @@
      * @param to The end value used to calculate the distance
      */
     @FloatRange(from = 0.0, to = 1.0)
-    fun progress(
-        from: BackdropValue,
-        to: BackdropValue
-    ): Float {
+    fun progress(from: BackdropValue, to: BackdropValue): Float {
         val fromOffset = anchoredDraggableState.anchors.positionOf(from)
         val toOffset = anchoredDraggableState.anchors.positionOf(to)
-        val currentOffset = anchoredDraggableState.offset.coerceIn(
-            min(fromOffset, toOffset), // fromOffset might be > toOffset
-            max(fromOffset, toOffset)
-        )
+        val currentOffset =
+            anchoredDraggableState.offset.coerceIn(
+                min(fromOffset, toOffset), // fromOffset might be > toOffset
+                max(fromOffset, toOffset)
+            )
         val fraction = (currentOffset - fromOffset) / (toOffset - fromOffset)
         return if (fraction.isNaN()) 1f else abs(fraction)
     }
 
-    internal val anchoredDraggableState = AnchoredDraggableState(
-        initialValue = initialValue,
-        animationSpec = animationSpec,
-        confirmValueChange = confirmValueChange,
-        positionalThreshold = {
-            with(requireDensity()) {
-                PositionalThreshold.toPx()
-            }
-        },
-        velocityThreshold = {
-            with(requireDensity()) {
-                VelocityThreshold.toPx()
-            }
-        }
-    )
+    internal val anchoredDraggableState =
+        AnchoredDraggableState(
+            initialValue = initialValue,
+            animationSpec = animationSpec,
+            confirmValueChange = confirmValueChange,
+            positionalThreshold = { with(requireDensity()) { PositionalThreshold.toPx() } },
+            velocityThreshold = { with(requireDensity()) { VelocityThreshold.toPx() } }
+        )
 
     internal var density: Density? = null
-    private fun requireDensity() = requireNotNull(density) {
-        "The density on BackdropScaffoldState ($this) was not set." +
-            " Did you use BackdropScaffoldState with " +
-            "the BackdropScaffold composable?"
-    }
 
-    internal val nestedScrollConnection = ConsumeSwipeNestedScrollConnection(
-        anchoredDraggableState,
-        Orientation.Vertical
-    )
+    private fun requireDensity() =
+        requireNotNull(density) {
+            "The density on BackdropScaffoldState ($this) was not set." +
+                " Did you use BackdropScaffoldState with " +
+                "the BackdropScaffold composable?"
+        }
+
+    internal val nestedScrollConnection =
+        ConsumeSwipeNestedScrollConnection(anchoredDraggableState, Orientation.Vertical)
 
     companion object {
 
-        /**
-         * The default [Saver] implementation for [BackdropScaffoldState].
-         */
+        /** The default [Saver] implementation for [BackdropScaffoldState]. */
         fun Saver(
             animationSpec: AnimationSpec<Float>,
             confirmStateChange: (BackdropValue) -> Boolean,
             snackbarHostState: SnackbarHostState,
             density: Density
-        ): Saver<BackdropScaffoldState, *> = Saver(
-            save = { it.anchoredDraggableState.currentValue },
-            restore = {
-                BackdropScaffoldState(
-                    initialValue = it,
-                    animationSpec = animationSpec,
-                    confirmValueChange = confirmStateChange,
-                    snackbarHostState = snackbarHostState,
-                    density = density
-                )
-            }
-        )
+        ): Saver<BackdropScaffoldState, *> =
+            Saver(
+                save = { it.anchoredDraggableState.currentValue },
+                restore = {
+                    BackdropScaffoldState(
+                        initialValue = it,
+                        animationSpec = animationSpec,
+                        confirmValueChange = confirmStateChange,
+                        snackbarHostState = snackbarHostState,
+                        density = density
+                    )
+                }
+            )
     }
 }
 
@@ -284,12 +260,13 @@
         animationSpec,
         confirmStateChange,
         snackbarHostState,
-        saver = BackdropScaffoldState.Saver(
-            animationSpec = animationSpec,
-            confirmStateChange = confirmStateChange,
-            snackbarHostState = snackbarHostState,
-            density = density
-        )
+        saver =
+            BackdropScaffoldState.Saver(
+                animationSpec = animationSpec,
+                confirmStateChange = confirmStateChange,
+                snackbarHostState = snackbarHostState,
+                density = density
+            )
     ) {
         BackdropScaffoldState(
             initialValue = initialValue,
@@ -302,40 +279,42 @@
 }
 
 /**
- * <a href="https://material.io/components/backdrop" class="external" target="_blank">Material Design backdrop</a>.
+ * <a href="https://material.io/components/backdrop" class="external" target="_blank">Material
+ * Design backdrop</a>.
  *
  * A backdrop appears behind all other surfaces in an app, displaying contextual and actionable
  * content.
  *
- * ![Backdrop image](https://developer.android.com/images/reference/androidx/compose/material/backdrop.png)
+ * ![Backdrop
+ * image](https://developer.android.com/images/reference/androidx/compose/material/backdrop.png)
  *
  * This component provides an API to put together several material components to construct your
- * screen. For a similar component which implements the basic material design layout strategy
- * with app bars, floating action buttons and navigation drawers, use the standard [Scaffold].
- * For similar component that uses a bottom sheet as the centerpiece of the screen, use
+ * screen. For a similar component which implements the basic material design layout strategy with
+ * app bars, floating action buttons and navigation drawers, use the standard [Scaffold]. For
+ * similar component that uses a bottom sheet as the centerpiece of the screen, use
  * [BottomSheetScaffold].
  *
- * Either the back layer or front layer can be active at a time. When the front layer is active,
- * it sits at an offset below the top of the screen. This is the [peekHeight] and defaults to
- * 56dp which is the default app bar height. When the front layer is inactive, it sticks to the
- * height of the back layer's content if [stickyFrontLayer] is set to `true` and the height of
- * the front layer exceeds the [headerHeight], and otherwise it minimizes to the [headerHeight].
- * To switch between the back layer and front layer, you can either swipe on the front layer if
- * [gesturesEnabled] is set to `true` or use any of the methods in [BackdropScaffoldState].
+ * Either the back layer or front layer can be active at a time. When the front layer is active, it
+ * sits at an offset below the top of the screen. This is the [peekHeight] and defaults to 56dp
+ * which is the default app bar height. When the front layer is inactive, it sticks to the height of
+ * the back layer's content if [stickyFrontLayer] is set to `true` and the height of the front layer
+ * exceeds the [headerHeight], and otherwise it minimizes to the [headerHeight]. To switch between
+ * the back layer and front layer, you can either swipe on the front layer if [gesturesEnabled] is
+ * set to `true` or use any of the methods in [BackdropScaffoldState].
  *
- * The scaffold also contains an app bar, which by default is placed above the back layer's
- * content. If [persistentAppBar] is set to `false`, then the backdrop will not show the app bar
- * when the back layer is revealed; instead it will switch between the app bar and the provided
- * content with an animation. For best results, the [peekHeight] should match the app bar height.
- * To show a snackbar, use the method `showSnackbar` of [BackdropScaffoldState.snackbarHostState].
+ * The scaffold also contains an app bar, which by default is placed above the back layer's content.
+ * If [persistentAppBar] is set to `false`, then the backdrop will not show the app bar when the
+ * back layer is revealed; instead it will switch between the app bar and the provided content with
+ * an animation. For best results, the [peekHeight] should match the app bar height. To show a
+ * snackbar, use the method `showSnackbar` of [BackdropScaffoldState.snackbarHostState].
  *
  * A simple example of a backdrop scaffold looks like this:
  *
  * @sample androidx.compose.material.samples.BackdropScaffoldSample
  *
- * @param appBar App bar for the back layer. Make sure that the [peekHeight] is equal to the
- * height of the app bar, so that the app bar is fully visible. Consider using [TopAppBar] but
- * set the elevation to 0dp and background color to transparent as a surface is already provided.
+ * @param appBar App bar for the back layer. Make sure that the [peekHeight] is equal to the height
+ *   of the app bar, so that the app bar is fully visible. Consider using [TopAppBar] but set the
+ *   elevation to 0dp and background color to transparent as a surface is already provided.
  * @param backLayerContent The content of the back layer.
  * @param frontLayerContent The content of the front layer.
  * @param modifier Optional [Modifier] for the root of the scaffold.
@@ -344,23 +323,23 @@
  * @param gesturesEnabled Whether or not the backdrop can be interacted with by gestures.
  * @param peekHeight The height of the visible part of the back layer when it is concealed.
  * @param headerHeight The minimum height of the front layer when it is inactive.
- * @param persistentAppBar Whether the app bar should be shown when the back layer is revealed.
- * By default, it will always be shown above the back layer's content. If this is set to `false`,
- * the back layer will automatically switch between the app bar and its content with an animation.
+ * @param persistentAppBar Whether the app bar should be shown when the back layer is revealed. By
+ *   default, it will always be shown above the back layer's content. If this is set to `false`, the
+ *   back layer will automatically switch between the app bar and its content with an animation.
  * @param stickyFrontLayer Whether the front layer should stick to the height of the back layer.
  * @param backLayerBackgroundColor The background color of the back layer.
  * @param backLayerContentColor The preferred content color provided by the back layer to its
- * children. Defaults to the matching content color for [backLayerBackgroundColor], or if that
- * is not a color from the theme, this will keep the same content color set above the back layer.
+ *   children. Defaults to the matching content color for [backLayerBackgroundColor], or if that is
+ *   not a color from the theme, this will keep the same content color set above the back layer.
  * @param frontLayerShape The shape of the front layer.
  * @param frontLayerElevation The elevation of the front layer.
  * @param frontLayerBackgroundColor The background color of the front layer.
  * @param frontLayerContentColor The preferred content color provided by the back front to its
- * children. Defaults to the matching content color for [frontLayerBackgroundColor], or if that
- * is not a color from the theme, this will keep the same content color set above the front layer.
- * @param frontLayerScrimColor The color of the scrim applied to the front layer when the back
- * layer is revealed. If the color passed is [Color.Unspecified], then a scrim will not be
- * applied and interaction with the front layer will not be blocked when the back layer is revealed.
+ *   children. Defaults to the matching content color for [frontLayerBackgroundColor], or if that is
+ *   not a color from the theme, this will keep the same content color set above the front layer.
+ * @param frontLayerScrimColor The color of the scrim applied to the front layer when the back layer
+ *   is revealed. If the color passed is [Color.Unspecified], then a scrim will not be applied and
+ *   interaction with the front layer will not be blocked when the back layer is revealed.
  */
 @OptIn(ExperimentalMaterialApi::class)
 @Composable
@@ -386,26 +365,26 @@
 ) {
     // b/278692145 Remove this once deprecated methods without density are removed
     val density = LocalDensity.current
-    SideEffect {
-        scaffoldState.density = density
-    }
+    SideEffect { scaffoldState.density = density }
 
     val peekHeightPx = with(LocalDensity.current) { peekHeight.toPx() }
     val headerHeightPx = with(LocalDensity.current) { headerHeight.toPx() }
 
-    val backLayer = @Composable {
-        if (persistentAppBar) {
-            Column {
-                appBar()
-                backLayerContent()
+    val backLayer =
+        @Composable {
+            if (persistentAppBar) {
+                Column {
+                    appBar()
+                    backLayerContent()
+                }
+            } else {
+                BackLayerTransition(
+                    scaffoldState.anchoredDraggableState.targetValue,
+                    appBar,
+                    backLayerContent
+                )
             }
-        } else {
-            BackLayerTransition(
-                scaffoldState.anchoredDraggableState.targetValue,
-                appBar, backLayerContent
-            )
         }
-    }
     val calculateBackLayerConstraints: (Constraints) -> Constraints = {
         it.copy(minWidth = 0, minHeight = 0).offset(vertical = -headerHeightPx.roundToInt())
     }
@@ -413,26 +392,22 @@
     val state = scaffoldState.anchoredDraggableState
 
     // Back layer
-    Surface(
-        color = backLayerBackgroundColor,
-        contentColor = backLayerContentColor
-    ) {
+    Surface(color = backLayerBackgroundColor, contentColor = backLayerContentColor) {
         val scope = rememberCoroutineScope()
-        BackdropStack(
-            modifier.fillMaxSize(),
-            backLayer,
-            calculateBackLayerConstraints
-        ) { constraints, backLayerHeight ->
+        BackdropStack(modifier.fillMaxSize(), backLayer, calculateBackLayerConstraints) {
+            constraints,
+            backLayerHeight ->
             var revealedHeight = constraints.maxHeight - headerHeightPx
             if (stickyFrontLayer) {
                 revealedHeight = min(revealedHeight, backLayerHeight)
             }
 
-            val nestedScroll = if (gesturesEnabled) {
-                Modifier.nestedScroll(scaffoldState.nestedScrollConnection)
-            } else {
-                Modifier
-            }
+            val nestedScroll =
+                if (gesturesEnabled) {
+                    Modifier.nestedScroll(scaffoldState.nestedScrollConnection)
+                } else {
+                    Modifier
+                }
 
             // Front layer
             Surface(
@@ -448,11 +423,12 @@
                                 Revealed at revealedHeight
                             }
                         }
-                        val newTarget = when (scaffoldState.targetValue) {
-                            Concealed -> Concealed
-                            Revealed -> if (newAnchors.hasAnchorFor(Revealed)) Revealed else
-                                Concealed
-                        }
+                        val newTarget =
+                            when (scaffoldState.targetValue) {
+                                Concealed -> Concealed
+                                Revealed ->
+                                    if (newAnchors.hasAnchorFor(Revealed)) Revealed else Concealed
+                            }
                         return@draggableAnchors newAnchors to newTarget
                     }
                     .anchoredDraggable(
@@ -465,13 +441,15 @@
                             collapse {
                                 if (scaffoldState.confirmValueChange(Revealed)) {
                                     scope.launch { scaffoldState.reveal() }
-                                }; true
+                                }
+                                true
                             }
                         } else {
                             expand {
                                 if (scaffoldState.confirmValueChange(Concealed)) {
                                     scope.launch { scaffoldState.conceal() }
-                                }; true
+                                }
+                                true
                             }
                         }
                     },
@@ -496,12 +474,15 @@
 
             // Snackbar host
             Box(
-                Modifier
-                    .padding(
-                        bottom = if (scaffoldState.isRevealed &&
-                            revealedHeight == constraints.maxHeight - headerHeightPx
-                        ) headerHeight else 0.dp
-                    ),
+                Modifier.padding(
+                    bottom =
+                        if (
+                            scaffoldState.isRevealed &&
+                                revealedHeight == constraints.maxHeight - headerHeightPx
+                        )
+                            headerHeight
+                        else 0.dp
+                ),
                 contentAlignment = Alignment.BottomCenter
             ) {
                 snackbarHost(scaffoldState.snackbarHostState)
@@ -511,26 +492,17 @@
 }
 
 @Composable
-private fun Scrim(
-    color: Color,
-    onDismiss: () -> Unit,
-    visible: Boolean
-) {
+private fun Scrim(color: Color, onDismiss: () -> Unit, visible: Boolean) {
     if (color.isSpecified) {
-        val alpha by animateFloatAsState(
-            targetValue = if (visible) 1f else 0f,
-            animationSpec = TweenSpec()
-        )
-        val dismissModifier = if (visible) {
-            Modifier.pointerInput(Unit) { detectTapGestures { onDismiss() } }
-        } else {
-            Modifier
-        }
-        Canvas(
-            Modifier
-                .fillMaxSize()
-                .then(dismissModifier)
-        ) {
+        val alpha by
+            animateFloatAsState(targetValue = if (visible) 1f else 0f, animationSpec = TweenSpec())
+        val dismissModifier =
+            if (visible) {
+                Modifier.pointerInput(Unit) { detectTapGestures { onDismiss() } }
+            } else {
+                Modifier
+            }
+        Canvas(Modifier.fillMaxSize().then(dismissModifier)) {
             drawRect(color = color, alpha = alpha)
         }
     }
@@ -538,8 +510,8 @@
 
 /**
  * A shared axis transition, used in the back layer. Both the [appBar] and the [content] shift
- * vertically, while they crossfade. It is very important that both are composed and measured,
- * even if invisible, and that this component is as large as both of them.
+ * vertically, while they crossfade. It is very important that both are composed and measured, even
+ * if invisible, and that this component is as large as both of them.
  */
 @Composable
 private fun BackLayerTransition(
@@ -549,15 +521,16 @@
 ) {
     // The progress of the animation between Revealed (0) and Concealed (2).
     // The midpoint (1) is the point where the appBar and backContent are switched.
-    val animationProgress by animateFloatAsState(
-        targetValue = if (target == Revealed) 0f else 2f, animationSpec = TweenSpec()
-    )
+    val animationProgress by
+        animateFloatAsState(
+            targetValue = if (target == Revealed) 0f else 2f,
+            animationSpec = TweenSpec()
+        )
     val animationSlideOffset = with(LocalDensity.current) { AnimationSlideOffset.toPx() }
 
     Box {
         Box(
-            Modifier
-                .layout { measurable, constraints ->
+            Modifier.layout { measurable, constraints ->
                     val appBarFloat = (animationProgress - 1).fastCoerceIn(0f, 1f)
                     val placeable = measurable.measure(constraints)
                     layout(placeable.width, placeable.height) {
@@ -574,8 +547,7 @@
         }
         Box(
             @Suppress("SuspiciousIndentation") // b/320904953
-            Modifier
-                .layout { measurable, constraints ->
+            Modifier.layout { measurable, constraints ->
                     val contentFloat = (1 - animationProgress).fastCoerceIn(0f, 1f)
                     val placeable = measurable.measure(constraints)
                     layout(placeable.width, placeable.height) {
@@ -602,15 +574,15 @@
 ) {
     SubcomposeLayout(modifier) { constraints ->
         val backLayerPlaceable =
-            subcompose(BackdropLayers.Back, backLayer).first()
+            subcompose(BackdropLayers.Back, backLayer)
+                .first()
                 .measure(calculateBackLayerConstraints(constraints))
 
         val backLayerHeight = backLayerPlaceable.height.toFloat()
 
         val placeables =
-            subcompose(BackdropLayers.Front) {
-                frontLayer(constraints, backLayerHeight)
-            }.fastMap { it.measure(constraints) }
+            subcompose(BackdropLayers.Front) { frontLayer(constraints, backLayerHeight) }
+                .fastMap { it.measure(constraints) }
 
         var maxWidth = max(constraints.minWidth, backLayerPlaceable.width)
         var maxHeight = max(constraints.minHeight, backLayerPlaceable.height)
@@ -626,49 +598,39 @@
     }
 }
 
-private enum class BackdropLayers { Back, Front }
+private enum class BackdropLayers {
+    Back,
+    Front
+}
 
-/**
- * Contains useful defaults for [BackdropScaffold].
- */
+/** Contains useful defaults for [BackdropScaffold]. */
 object BackdropScaffoldDefaults {
 
-    /**
-     * The default peek height of the back layer.
-     */
+    /** The default peek height of the back layer. */
     val PeekHeight = 56.dp
 
-    /**
-     * The default header height of the front layer.
-     */
+    /** The default header height of the front layer. */
     val HeaderHeight = 48.dp
 
-    /**
-     * The default shape of the front layer.
-     */
+    /** The default shape of the front layer. */
     val frontLayerShape: Shape
         @Composable
-        get() = MaterialTheme.shapes.large
-            .copy(topStart = CornerSize(16.dp), topEnd = CornerSize(16.dp))
+        get() =
+            MaterialTheme.shapes.large.copy(
+                topStart = CornerSize(16.dp),
+                topEnd = CornerSize(16.dp)
+            )
 
-    /**
-     * The default elevation of the front layer.
-     */
+    /** The default elevation of the front layer. */
     val FrontLayerElevation = 1.dp
 
-    /**
-     * The default color of the scrim applied to the front layer.
-     */
+    /** The default color of the scrim applied to the front layer. */
     val frontLayerScrimColor: Color
         @Composable get() = MaterialTheme.colors.surface.copy(alpha = 0.60f)
 
-    /**
-     * The default animation spec used by [BottomSheetScaffoldState].
-     */
-    val AnimationSpec: AnimationSpec<Float> = tween(
-        durationMillis = 300,
-        easing = FastOutSlowInEasing
-    )
+    /** The default animation spec used by [BottomSheetScaffoldState]. */
+    val AnimationSpec: AnimationSpec<Float> =
+        tween(durationMillis = 300, easing = FastOutSlowInEasing)
 }
 
 private val AnimationSlideOffset = 20.dp
@@ -679,53 +641,55 @@
 internal fun ConsumeSwipeNestedScrollConnection(
     state: AnchoredDraggableState<*>,
     orientation: Orientation
-): NestedScrollConnection = object : NestedScrollConnection {
-    override fun onPreScroll(available: Offset, source: NestedScrollSource): Offset {
-        val delta = available.toFloat()
-        return if (delta < 0 && source == NestedScrollSource.UserInput) {
-            state.dispatchRawDelta(delta).toOffset()
-        } else {
-            Offset.Zero
+): NestedScrollConnection =
+    object : NestedScrollConnection {
+        override fun onPreScroll(available: Offset, source: NestedScrollSource): Offset {
+            val delta = available.toFloat()
+            return if (delta < 0 && source == NestedScrollSource.UserInput) {
+                state.dispatchRawDelta(delta).toOffset()
+            } else {
+                Offset.Zero
+            }
         }
-    }
 
-    override fun onPostScroll(
-        consumed: Offset,
-        available: Offset,
-        source: NestedScrollSource
-    ): Offset {
-        return if (source == NestedScrollSource.UserInput) {
-            state.dispatchRawDelta(available.toFloat()).toOffset()
-        } else {
-            Offset.Zero
+        override fun onPostScroll(
+            consumed: Offset,
+            available: Offset,
+            source: NestedScrollSource
+        ): Offset {
+            return if (source == NestedScrollSource.UserInput) {
+                state.dispatchRawDelta(available.toFloat()).toOffset()
+            } else {
+                Offset.Zero
+            }
         }
-    }
 
-    override suspend fun onPreFling(available: Velocity): Velocity {
-        val toFling = available.toFloat()
-        val currentOffset = state.requireOffset()
-        return if (toFling < 0 && currentOffset > state.anchors.minAnchor()) {
-            state.settle(velocity = toFling)
-            // since we go to the anchor with tween settling, consume all for the best UX
-            available
-        } else {
-            Velocity.Zero
+        override suspend fun onPreFling(available: Velocity): Velocity {
+            val toFling = available.toFloat()
+            val currentOffset = state.requireOffset()
+            return if (toFling < 0 && currentOffset > state.anchors.minAnchor()) {
+                state.settle(velocity = toFling)
+                // since we go to the anchor with tween settling, consume all for the best UX
+                available
+            } else {
+                Velocity.Zero
+            }
         }
+
+        override suspend fun onPostFling(consumed: Velocity, available: Velocity): Velocity {
+            state.settle(velocity = available.toFloat())
+            return available
+        }
+
+        private fun Float.toOffset(): Offset =
+            Offset(
+                x = if (orientation == Orientation.Horizontal) this else 0f,
+                y = if (orientation == Orientation.Vertical) this else 0f
+            )
+
+        @JvmName("velocityToFloat")
+        private fun Velocity.toFloat() = if (orientation == Orientation.Horizontal) x else y
+
+        @JvmName("offsetToFloat")
+        private fun Offset.toFloat(): Float = if (orientation == Orientation.Horizontal) x else y
     }
-
-    override suspend fun onPostFling(consumed: Velocity, available: Velocity): Velocity {
-        state.settle(velocity = available.toFloat())
-        return available
-    }
-
-    private fun Float.toOffset(): Offset = Offset(
-        x = if (orientation == Orientation.Horizontal) this else 0f,
-        y = if (orientation == Orientation.Vertical) this else 0f
-    )
-
-    @JvmName("velocityToFloat")
-    private fun Velocity.toFloat() = if (orientation == Orientation.Horizontal) x else y
-
-    @JvmName("offsetToFloat")
-    private fun Offset.toFloat(): Float = if (orientation == Orientation.Horizontal) x else y
-}
diff --git a/compose/material/material/src/commonMain/kotlin/androidx/compose/material/Badge.kt b/compose/material/material/src/commonMain/kotlin/androidx/compose/material/Badge.kt
index a8eb298..9d42989 100644
--- a/compose/material/material/src/commonMain/kotlin/androidx/compose/material/Badge.kt
+++ b/compose/material/material/src/commonMain/kotlin/androidx/compose/material/Badge.kt
@@ -41,20 +41,19 @@
 
 /**
  * A BadgeBox is used to decorate [content] with a [badge] that can contain dynamic information,
- * such
- * as the presence of a new notification or a number of pending requests. Badges can be icon only
- * or contain short text.
+ * such as the presence of a new notification or a number of pending requests. Badges can be icon
+ * only or contain short text.
  *
- * A common use case is to display a badge with bottom navigation items.
- * For more information, see [Bottom Navigation](https://material.io/components/bottom-navigation#behavior)
+ * A common use case is to display a badge with bottom navigation items. For more information, see
+ * [Bottom Navigation](https://material.io/components/bottom-navigation#behavior)
  *
  * A simple icon with badge example looks like:
+ *
  * @sample androidx.compose.material.samples.BottomNavigationItemWithBadge
  *
  * @param badge the badge to be displayed - typically a [Badge]
  * @param modifier optional [Modifier] for this item
  * @param content the anchor to which this badge will be positioned
- *
  */
 @Composable
 fun BadgedBox(
@@ -69,19 +68,19 @@
                 contentAlignment = Alignment.Center,
                 content = content
             )
-            Box(
-                modifier = Modifier.layoutId("badge"),
-                content = badge
-            )
+            Box(modifier = Modifier.layoutId("badge"), content = badge)
         },
         modifier = modifier
     ) { measurables, constraints ->
-
-        val badgePlaceable = measurables.fastFirst { it.layoutId == "badge" }.measure(
-            // Measure with loose constraints for height as we don't want the text to take up more
-            // space than it needs.
-            constraints.copy(minHeight = 0)
-        )
+        val badgePlaceable =
+            measurables
+                .fastFirst { it.layoutId == "badge" }
+                .measure(
+                    // Measure with loose constraints for height as we don't want the text to take
+                    // up more
+                    // space than it needs.
+                    constraints.copy(minHeight = 0)
+                )
 
         val anchorPlaceable = measurables.fastFirst { it.layoutId == "anchor" }.measure(constraints)
 
@@ -95,10 +94,7 @@
             totalHeight,
             // Provide custom baselines based only on the anchor content to avoid default baseline
             // calculations from including by any badge content.
-            mapOf(
-                FirstBaseline to firstBaseline,
-                LastBaseline to lastBaseline
-            )
+            mapOf(FirstBaseline to firstBaseline, LastBaseline to lastBaseline)
         ) {
             // Use the width of the badge to infer whether it has any content (based on radius used
             // in [Badge]) and determine its horizontal offset.
@@ -125,7 +121,6 @@
  * @param backgroundColor the background color for the badge
  * @param contentColor the color of label text rendered in the badge
  * @param content optional content to be rendered inside the badge
- *
  */
 @Composable
 fun Badge(
@@ -139,28 +134,19 @@
 
     // Draw badge container.
     Row(
-        modifier = modifier
-            .defaultMinSize(minWidth = radius * 2, minHeight = radius * 2)
-            .background(
-                color = backgroundColor,
-                shape = shape
-            )
-            .clip(shape)
-            .padding(
-                horizontal = BadgeWithContentHorizontalPadding
-            ),
+        modifier =
+            modifier
+                .defaultMinSize(minWidth = radius * 2, minHeight = radius * 2)
+                .background(color = backgroundColor, shape = shape)
+                .clip(shape)
+                .padding(horizontal = BadgeWithContentHorizontalPadding),
         verticalAlignment = Alignment.CenterVertically,
         horizontalArrangement = Arrangement.Center
     ) {
         if (content != null) {
-            CompositionLocalProvider(
-                LocalContentColor provides contentColor
-            ) {
+            CompositionLocalProvider(LocalContentColor provides contentColor) {
                 val style = MaterialTheme.typography.button.copy(fontSize = BadgeContentFontSize)
-                ProvideTextStyle(
-                    value = style,
-                    content = { content() }
-                )
+                ProvideTextStyle(value = style, content = { content() })
             }
         }
     }
diff --git a/compose/material/material/src/commonMain/kotlin/androidx/compose/material/BottomNavigation.kt b/compose/material/material/src/commonMain/kotlin/androidx/compose/material/BottomNavigation.kt
index 2a65978..85f4614 100644
--- a/compose/material/material/src/commonMain/kotlin/androidx/compose/material/BottomNavigation.kt
+++ b/compose/material/material/src/commonMain/kotlin/androidx/compose/material/BottomNavigation.kt
@@ -63,11 +63,13 @@
 // TODO: b/149825331 add documentation references to Scaffold here and samples for using
 // BottomNavigation inside a Scaffold
 /**
- * <a href="https://material.io/components/bottom-navigation" class="external" target="_blank">Material Design bottom navigation</a>.
+ * <a href="https://material.io/components/bottom-navigation" class="external"
+ * target="_blank">Material Design bottom navigation</a>.
  *
  * Bottom navigation bars allow movement between primary destinations in an app.
  *
- * ![Bottom navigation image](https://developer.android.com/images/reference/androidx/compose/material/bottom-navigation.png)
+ * ![Bottom navigation
+ * image](https://developer.android.com/images/reference/androidx/compose/material/bottom-navigation.png)
  *
  * This particular overload provides ability to specify [WindowInsets]. Recommended value can be
  * found in [BottomNavigationDefaults.windowInsets].
@@ -88,12 +90,12 @@
  * @param modifier optional [Modifier] for this BottomNavigation
  * @param backgroundColor The background color for this BottomNavigation
  * @param contentColor The preferred content color provided by this BottomNavigation to its
- * children. Defaults to either the matching content color for [backgroundColor], or if
- * [backgroundColor] is not a color from the theme, this will keep the same value set above this
- * BottomNavigation.
+ *   children. Defaults to either the matching content color for [backgroundColor], or if
+ *   [backgroundColor] is not a color from the theme, this will keep the same value set above this
+ *   BottomNavigation.
  * @param elevation elevation for this BottomNavigation
  * @param content destinations inside this BottomNavigation, this should contain multiple
- * [BottomNavigationItem]s
+ *   [BottomNavigationItem]s
  */
 @Composable
 fun BottomNavigation(
@@ -111,8 +113,7 @@
         modifier = modifier
     ) {
         Row(
-            Modifier
-                .fillMaxWidth()
+            Modifier.fillMaxWidth()
                 .windowInsetsPadding(windowInsets)
                 .defaultMinSize(minHeight = BottomNavigationHeight)
                 .selectableGroup(),
@@ -123,11 +124,13 @@
 }
 
 /**
- * <a href="https://material.io/components/bottom-navigation" class="external" target="_blank">Material Design bottom navigation</a>.
+ * <a href="https://material.io/components/bottom-navigation" class="external"
+ * target="_blank">Material Design bottom navigation</a>.
  *
  * Bottom navigation bars allow movement between primary destinations in an app.
  *
- * ![Bottom navigation image](https://developer.android.com/images/reference/androidx/compose/material/bottom-navigation.png)
+ * ![Bottom navigation
+ * image](https://developer.android.com/images/reference/androidx/compose/material/bottom-navigation.png)
  *
  * BottomNavigation should contain multiple [BottomNavigationItem]s, each representing a singular
  * destination.
@@ -144,12 +147,12 @@
  * @param modifier optional [Modifier] for this BottomNavigation
  * @param backgroundColor The background color for this BottomNavigation
  * @param contentColor The preferred content color provided by this BottomNavigation to its
- * children. Defaults to either the matching content color for [backgroundColor], or if
- * [backgroundColor] is not a color from the theme, this will keep the same value set above this
- * BottomNavigation.
+ *   children. Defaults to either the matching content color for [backgroundColor], or if
+ *   [backgroundColor] is not a color from the theme, this will keep the same value set above this
+ *   BottomNavigation.
  * @param elevation elevation for this BottomNavigation
  * @param content destinations inside this BottomNavigation, this should contain multiple
- * [BottomNavigationItem]s
+ *   [BottomNavigationItem]s
  */
 @Composable
 fun BottomNavigation(
@@ -163,35 +166,35 @@
 }
 
 /**
- * <a href="https://material.io/components/bottom-navigation" class="external" target="_blank">Material Design bottom navigation</a> item.
+ * <a href="https://material.io/components/bottom-navigation" class="external"
+ * target="_blank">Material Design bottom navigation</a> item.
  *
  * The recommended configuration for a BottomNavigationItem depends on how many items there are
  * inside a [BottomNavigation]:
- *
  * - Three destinations: Display icons and text labels for all destinations.
  * - Four destinations: Active destinations display an icon and text label. Inactive destinations
- * display icons, and text labels are recommended.
+ *   display icons, and text labels are recommended.
  * - Five destinations: Active destinations display an icon and text label. Inactive destinations
- * use icons, and use text labels if space permits.
+ *   use icons, and use text labels if space permits.
  *
- * A BottomNavigationItem always shows text labels (if it exists) when selected. Showing text
- * labels if not selected is controlled by [alwaysShowLabel].
+ * A BottomNavigationItem always shows text labels (if it exists) when selected. Showing text labels
+ * if not selected is controlled by [alwaysShowLabel].
  *
  * @param selected whether this item is selected
  * @param onClick the callback to be invoked when this item is selected
  * @param icon icon for this item, typically this will be an [Icon]
  * @param modifier optional [Modifier] for this item
- * @param enabled controls the enabled state of this item. When `false`, this item will not
- * be clickable and will appear disabled to accessibility services.
+ * @param enabled controls the enabled state of this item. When `false`, this item will not be
+ *   clickable and will appear disabled to accessibility services.
  * @param label optional text label for this item
  * @param alwaysShowLabel whether to always show the label for this item. If false, the label will
- * only be shown when this item is selected.
+ *   only be shown when this item is selected.
  * @param interactionSource an optional hoisted [MutableInteractionSource] for observing and
- * emitting [Interaction]s for this item. You can use this to change the item's
- * appearance or preview the item in different states. Note that if `null` is provided,
- * interactions will still happen internally.
- * @param selectedContentColor the color of the text label and icon when this item is selected,
- * and the color of the ripple.
+ *   emitting [Interaction]s for this item. You can use this to change the item's appearance or
+ *   preview the item in different states. Note that if `null` is provided, interactions will still
+ *   happen internally.
+ * @param selectedContentColor the color of the text label and icon when this item is selected, and
+ *   the color of the ripple.
  * @param unselectedContentColor the color of the text label and icon when this item is not selected
  */
 @Composable
@@ -207,12 +210,13 @@
     selectedContentColor: Color = LocalContentColor.current,
     unselectedContentColor: Color = selectedContentColor.copy(alpha = ContentAlpha.medium)
 ) {
-    val styledLabel: @Composable (() -> Unit)? = label?.let {
-        @Composable {
-            val style = MaterialTheme.typography.caption.copy(textAlign = TextAlign.Center)
-            ProvideTextStyle(style, content = label)
+    val styledLabel: @Composable (() -> Unit)? =
+        label?.let {
+            @Composable {
+                val style = MaterialTheme.typography.caption.copy(textAlign = TextAlign.Center)
+                ProvideTextStyle(style, content = label)
+            }
         }
-    }
     // The color of the Ripple should always the selected color, as we want to show the color
     // before the item is considered selected, and hence before the new contentColor is
     // provided by BottomNavigationTransition.
@@ -231,11 +235,8 @@
             .weight(1f),
         contentAlignment = Alignment.Center
     ) {
-        BottomNavigationTransition(
-            selectedContentColor,
-            unselectedContentColor,
-            selected
-        ) { progress ->
+        BottomNavigationTransition(selectedContentColor, unselectedContentColor, selected) {
+            progress ->
             val animationProgress = if (alwaysShowLabel) 1f else progress
 
             BottomNavigationItemBaselineLayout(
@@ -247,22 +248,18 @@
     }
 }
 
-/**
- * Contains default values used for [BottomNavigation].
- */
+/** Contains default values used for [BottomNavigation]. */
 object BottomNavigationDefaults {
-    /**
-     * Default elevation used for [BottomNavigation].
-     */
+    /** Default elevation used for [BottomNavigation]. */
     val Elevation = 8.dp
 
-    /**
-     * Recommended window insets to be used and consumed by bottom navigation
-     */
+    /** Recommended window insets to be used and consumed by bottom navigation */
     val windowInsets: WindowInsets
         @Composable
-        get() = WindowInsets.systemBarsForVisualComponents
-            .only(WindowInsetsSides.Horizontal + WindowInsetsSides.Bottom)
+        get() =
+            WindowInsets.systemBarsForVisualComponents.only(
+                WindowInsetsSides.Horizontal + WindowInsetsSides.Bottom
+            )
 }
 
 /**
@@ -275,7 +272,7 @@
  * @param inactiveColor [LocalContentColor] when this item is not [selected]
  * @param selected whether this item is selected
  * @param content the content of the [BottomNavigationItem] to animate [LocalContentColor] for,
- * where the animationProgress is the current progress of the animation from 0f to 1f.
+ *   where the animationProgress is the current progress of the animation from 0f to 1f.
  */
 @Composable
 private fun BottomNavigationTransition(
@@ -284,10 +281,11 @@
     selected: Boolean,
     content: @Composable (animationProgress: Float) -> Unit
 ) {
-    val animationProgress by animateFloatAsState(
-        targetValue = if (selected) 1f else 0f,
-        animationSpec = BottomNavigationAnimationSpec
-    )
+    val animationProgress by
+        animateFloatAsState(
+            targetValue = if (selected) 1f else 0f,
+            animationSpec = BottomNavigationAnimationSpec
+        )
 
     val color = lerp(inactiveColor, activeColor, animationProgress)
 
@@ -304,40 +302,42 @@
  *
  * @param icon icon for this item
  * @param label text label for this item
- * @param iconPositionAnimationProgress progress of the animation that controls icon position,
- * where 0 represents its unselected position and 1 represents its selected position. If both the
- * [icon] and [label] should be shown at all times, this will always be 1, as the icon position
- * should remain constant.
+ * @param iconPositionAnimationProgress progress of the animation that controls icon position, where
+ *   0 represents its unselected position and 1 represents its selected position. If both the [icon]
+ *   and [label] should be shown at all times, this will always be 1, as the icon position should
+ *   remain constant.
  */
 @Composable
 private fun BottomNavigationItemBaselineLayout(
     icon: @Composable () -> Unit,
     label: @Composable (() -> Unit)?,
-    @FloatRange(from = 0.0, to = 1.0)
-    iconPositionAnimationProgress: Float
+    @FloatRange(from = 0.0, to = 1.0) iconPositionAnimationProgress: Float
 ) {
-    Layout(
-        {
-            Box(Modifier.layoutId("icon")) { icon() }
-            if (label != null) {
-                Box(
-                    Modifier
-                        .layoutId("label")
-                        .alpha(iconPositionAnimationProgress)
-                        .padding(horizontal = BottomNavigationItemHorizontalPadding)
-                ) { label() }
+    Layout({
+        Box(Modifier.layoutId("icon")) { icon() }
+        if (label != null) {
+            Box(
+                Modifier.layoutId("label")
+                    .alpha(iconPositionAnimationProgress)
+                    .padding(horizontal = BottomNavigationItemHorizontalPadding)
+            ) {
+                label()
             }
         }
-    ) { measurables, constraints ->
+    }) { measurables, constraints ->
         val iconPlaceable = measurables.fastFirst { it.layoutId == "icon" }.measure(constraints)
 
-        val labelPlaceable = label?.let {
-            measurables.fastFirst { it.layoutId == "label" }.measure(
-                // Measure with loose constraints for height as we don't want the label to take up more
-                // space than it needs
-                constraints.copy(minHeight = 0)
-            )
-        }
+        val labelPlaceable =
+            label?.let {
+                measurables
+                    .fastFirst { it.layoutId == "label" }
+                    .measure(
+                        // Measure with loose constraints for height as we don't want the label to
+                        // take up more
+                        // space than it needs
+                        constraints.copy(minHeight = 0)
+                    )
+            }
 
         // If there is no label, just place the icon.
         if (label == null) {
@@ -353,18 +353,14 @@
     }
 }
 
-/**
- * Places the provided [iconPlaceable] in the vertical center of the provided [constraints]
- */
+/** Places the provided [iconPlaceable] in the vertical center of the provided [constraints] */
 private fun MeasureScope.placeIcon(
     iconPlaceable: Placeable,
     constraints: Constraints
 ): MeasureResult {
     val height = constraints.constrainHeight(BottomNavigationHeight.roundToPx())
     val iconY = (height - iconPlaceable.height) / 2
-    return layout(iconPlaceable.width, height) {
-        iconPlaceable.placeRelative(0, iconY)
-    }
+    return layout(iconPlaceable.width, height) { iconPlaceable.placeRelative(0, iconY) }
 }
 
 /**
@@ -384,15 +380,14 @@
  * @param iconPlaceable icon placeable inside this item
  * @param constraints constraints of the item
  * @param iconPositionAnimationProgress the progress of the icon position animation, where 0
- * represents centered icon and no label, and 1 represents top aligned icon with label.
- * Values between 0 and 1 interpolate the icon position so we can smoothly move the icon.
+ *   represents centered icon and no label, and 1 represents top aligned icon with label. Values
+ *   between 0 and 1 interpolate the icon position so we can smoothly move the icon.
  */
 private fun MeasureScope.placeLabelAndIcon(
     labelPlaceable: Placeable,
     iconPlaceable: Placeable,
     constraints: Constraints,
-    @FloatRange(from = 0.0, to = 1.0)
-    iconPositionAnimationProgress: Float
+    @FloatRange(from = 0.0, to = 1.0) iconPositionAnimationProgress: Float
 ): MeasureResult {
     val firstBaseline = labelPlaceable[FirstBaseline]
     val baselineOffset = CombinedItemTextBaseline.roundToPx()
@@ -434,24 +429,18 @@
  * [VectorizedAnimationSpec] controlling the transition between unselected and selected
  * [BottomNavigationItem]s.
  */
-private val BottomNavigationAnimationSpec = TweenSpec<Float>(
-    durationMillis = 300,
-    easing = FastOutSlowInEasing
-)
+private val BottomNavigationAnimationSpec =
+    TweenSpec<Float>(durationMillis = 300, easing = FastOutSlowInEasing)
 
-/**
- * Height of a [BottomNavigation] component
- */
+/** Height of a [BottomNavigation] component */
 private val BottomNavigationHeight = 56.dp
 
-/**
- * Padding at the start and end of a [BottomNavigationItem]
- */
+/** Padding at the start and end of a [BottomNavigationItem] */
 private val BottomNavigationItemHorizontalPadding = 12.dp
 
 /**
- * The space between the text baseline and the bottom of the [BottomNavigationItem], and between
- * the text baseline and the bottom of the icon placed above it.
+ * The space between the text baseline and the bottom of the [BottomNavigationItem], and between the
+ * text baseline and the bottom of the icon placed above it.
  */
 private val CombinedItemTextBaseline = 12.dp
 
diff --git a/compose/material/material/src/commonMain/kotlin/androidx/compose/material/BottomSheetScaffold.kt b/compose/material/material/src/commonMain/kotlin/androidx/compose/material/BottomSheetScaffold.kt
index 223a9db..a2747e5 100644
--- a/compose/material/material/src/commonMain/kotlin/androidx/compose/material/BottomSheetScaffold.kt
+++ b/compose/material/material/src/commonMain/kotlin/androidx/compose/material/BottomSheetScaffold.kt
@@ -60,18 +60,12 @@
 import kotlinx.coroutines.CancellationException
 import kotlinx.coroutines.launch
 
-/**
- * Possible values of [BottomSheetState].
- */
+/** Possible values of [BottomSheetState]. */
 enum class BottomSheetValue {
-    /**
-     * The bottom sheet is visible, but only showing its peek height.
-     */
+    /** The bottom sheet is visible, but only showing its peek height. */
     Collapsed,
 
-    /**
-     * The bottom sheet is visible at its maximum height.
-     */
+    /** The bottom sheet is visible at its maximum height. */
     Expanded
 }
 
@@ -92,17 +86,18 @@
     confirmValueChange: (BottomSheetValue) -> Boolean = { true }
 ) {
 
-    internal val anchoredDraggableState = AnchoredDraggableState(
-        initialValue = initialValue,
-        animationSpec = animationSpec,
-        confirmValueChange = confirmValueChange,
-        positionalThreshold = { with(density) { BottomSheetScaffoldPositionalThreshold.toPx() } },
-        velocityThreshold = { with(density) { BottomSheetScaffoldVelocityThreshold.toPx() } }
-    )
+    internal val anchoredDraggableState =
+        AnchoredDraggableState(
+            initialValue = initialValue,
+            animationSpec = animationSpec,
+            confirmValueChange = confirmValueChange,
+            positionalThreshold = {
+                with(density) { BottomSheetScaffoldPositionalThreshold.toPx() }
+            },
+            velocityThreshold = { with(density) { BottomSheetScaffoldVelocityThreshold.toPx() } }
+        )
 
-    /**
-     * The current value of the [BottomSheetState].
-     */
+    /** The current value of the [BottomSheetState]. */
     val currentValue: BottomSheetValue
         get() = anchoredDraggableState.currentValue
 
@@ -113,15 +108,11 @@
     val targetValue: BottomSheetValue
         get() = anchoredDraggableState.targetValue
 
-    /**
-     * Whether the bottom sheet is expanded.
-     */
+    /** Whether the bottom sheet is expanded. */
     val isExpanded: Boolean
         get() = anchoredDraggableState.currentValue == Expanded
 
-    /**
-     * Whether the bottom sheet is collapsed.
-     */
+    /** Whether the bottom sheet is collapsed. */
     val isCollapsed: Boolean
         get() = anchoredDraggableState.currentValue == Collapsed
 
@@ -146,34 +137,32 @@
      * @param to The end value used to calculate the distance
      */
     @FloatRange(from = 0.0, to = 1.0)
-    fun progress(
-        from: BottomSheetValue,
-        to: BottomSheetValue
-    ): Float {
+    fun progress(from: BottomSheetValue, to: BottomSheetValue): Float {
         val fromOffset = anchoredDraggableState.anchors.positionOf(from)
         val toOffset = anchoredDraggableState.anchors.positionOf(to)
-        val currentOffset = anchoredDraggableState.offset.coerceIn(
-            min(fromOffset, toOffset), // fromOffset might be > toOffset
-            max(fromOffset, toOffset)
-        )
+        val currentOffset =
+            anchoredDraggableState.offset.coerceIn(
+                min(fromOffset, toOffset), // fromOffset might be > toOffset
+                max(fromOffset, toOffset)
+            )
         val fraction = (currentOffset - fromOffset) / (toOffset - fromOffset)
         return if (fraction.isNaN()) 1f else abs(fraction)
     }
 
     /**
      * Expand the bottom sheet with an animation and suspend until the animation finishes or is
-     * cancelled.
-     * Note: If the peek height is equal to the sheet height, this method will animate to the
-     * [Collapsed] state.
+     * cancelled. Note: If the peek height is equal to the sheet height, this method will animate to
+     * the [Collapsed] state.
      *
      * This method will throw [CancellationException] if the animation is interrupted.
      */
     suspend fun expand() {
-        val target = if (anchoredDraggableState.anchors.hasAnchorFor(Expanded)) {
-            Expanded
-        } else {
-            Collapsed
-        }
+        val target =
+            if (anchoredDraggableState.anchors.hasAnchorFor(Expanded)) {
+                Expanded
+            } else {
+                Collapsed
+            }
         anchoredDraggableState.animateTo(target)
     }
 
@@ -200,24 +189,23 @@
 
     companion object {
 
-        /**
-         * The default [Saver] implementation for [BottomSheetState].
-         */
+        /** The default [Saver] implementation for [BottomSheetState]. */
         fun Saver(
             animationSpec: AnimationSpec<Float>,
             confirmStateChange: (BottomSheetValue) -> Boolean,
             density: Density
-        ): Saver<BottomSheetState, *> = Saver(
-            save = { it.anchoredDraggableState.currentValue },
-            restore = {
-                BottomSheetState(
-                    initialValue = it,
-                    density = density,
-                    animationSpec = animationSpec,
-                    confirmValueChange = confirmStateChange
-                )
-            }
-        )
+        ): Saver<BottomSheetState, *> =
+            Saver(
+                save = { it.anchoredDraggableState.currentValue },
+                restore = {
+                    BottomSheetState(
+                        initialValue = it,
+                        density = density,
+                        animationSpec = animationSpec,
+                        confirmValueChange = confirmStateChange
+                    )
+                }
+            )
     }
 }
 
@@ -237,11 +225,12 @@
     val density = LocalDensity.current
     return rememberSaveable(
         animationSpec,
-        saver = BottomSheetState.Saver(
-            animationSpec = animationSpec,
-            confirmStateChange = confirmStateChange,
-            density = density
-        )
+        saver =
+            BottomSheetState.Saver(
+                animationSpec = animationSpec,
+                confirmStateChange = confirmStateChange,
+                density = density
+            )
     ) {
         BottomSheetState(
             initialValue = initialValue,
@@ -284,20 +273,20 @@
 }
 
 /**
- * <a href="https://material.io/components/sheets-bottom#standard-bottom-sheet" class="external" target="_blank">Material Design standard bottom sheet</a>.
+ * <a href="https://material.io/components/sheets-bottom#standard-bottom-sheet" class="external"
+ * target="_blank">Material Design standard bottom sheet</a>.
  *
  * Standard bottom sheets co-exist with the screen’s main UI region and allow for simultaneously
- * viewing and interacting with both regions. They are commonly used to keep a feature or
- * secondary content visible on screen when content in main UI region is frequently scrolled or
- * panned.
+ * viewing and interacting with both regions. They are commonly used to keep a feature or secondary
+ * content visible on screen when content in main UI region is frequently scrolled or panned.
  *
- * ![Standard bottom sheet image](https://developer.android.com/images/reference/androidx/compose/material/standard-bottom-sheet.png)
+ * ![Standard bottom sheet
+ * image](https://developer.android.com/images/reference/androidx/compose/material/standard-bottom-sheet.png)
  *
  * This component provides an API to put together several material components to construct your
- * screen. For a similar component which implements the basic material design layout strategy
- * with app bars, floating action buttons and navigation drawers, use the standard [Scaffold].
- * For similar component that uses a backdrop as the centerpiece of the screen, use
- * [BackdropScaffold].
+ * screen. For a similar component which implements the basic material design layout strategy with
+ * app bars, floating action buttons and navigation drawers, use the standard [Scaffold]. For
+ * similar component that uses a backdrop as the centerpiece of the screen, use [BackdropScaffold].
  *
  * A simple example of a bottom sheet scaffold looks like this:
  *
@@ -315,16 +304,16 @@
  * @param sheetElevation The elevation of the bottom sheet.
  * @param sheetBackgroundColor The background color of the bottom sheet.
  * @param sheetContentColor The preferred content color provided by the bottom sheet to its
- * children. Defaults to the matching content color for [sheetBackgroundColor], or if that is
- * not a color from the theme, this will keep the same content color set above the bottom sheet.
+ *   children. Defaults to the matching content color for [sheetBackgroundColor], or if that is not
+ *   a color from the theme, this will keep the same content color set above the bottom sheet.
  * @param sheetPeekHeight The height of the bottom sheet when it is collapsed. If the peek height
- * equals the sheet's full height, the sheet will only have a collapsed state.
+ *   equals the sheet's full height, the sheet will only have a collapsed state.
  * @param backgroundColor The background color of the scaffold body.
  * @param contentColor The color of the content in scaffold body. Defaults to either the matching
- * content color for [backgroundColor], or, if it is not a color from the theme, this will keep
- * the same value set above this Surface.
- * @param content The main content of the screen. You should use the provided [PaddingValues]
- * to properly offset the content, so that it is not obstructed by the bottom sheet when collapsed.
+ *   content color for [backgroundColor], or, if it is not a color from the theme, this will keep
+ *   the same value set above this Surface.
+ * @param content The main content of the screen. You should use the provided [PaddingValues] to
+ *   properly offset the content, so that it is not obstructed by the bottom sheet when collapsed.
  */
 @OptIn(ExperimentalMaterialApi::class)
 @Composable
@@ -346,19 +335,14 @@
     contentColor: Color = contentColorFor(backgroundColor),
     content: @Composable (PaddingValues) -> Unit
 ) {
-    Surface(
-        modifier
-            .fillMaxSize(),
-        color = backgroundColor,
-        contentColor = contentColor
-    ) {
+    Surface(modifier.fillMaxSize(), color = backgroundColor, contentColor = contentColor) {
         BottomSheetScaffoldLayout(
             topBar = topBar,
             body = { content(PaddingValues(bottom = sheetPeekHeight)) },
             bottomSheet = {
-                val nestedScroll = if (sheetGesturesEnabled) {
-                    Modifier
-                        .nestedScroll(
+                val nestedScroll =
+                    if (sheetGesturesEnabled) {
+                        Modifier.nestedScroll(
                             remember(scaffoldState.bottomSheetState.anchoredDraggableState) {
                                 ConsumeSwipeWithinBottomSheetBoundsNestedScrollConnection(
                                     state = scaffoldState.bottomSheetState.anchoredDraggableState,
@@ -366,12 +350,10 @@
                                 )
                             }
                         )
-                } else Modifier
+                    } else Modifier
                 BottomSheet(
                     state = scaffoldState.bottomSheetState,
-                    modifier = nestedScroll
-                        .fillMaxWidth()
-                        .requiredHeightIn(min = sheetPeekHeight),
+                    modifier = nestedScroll.fillMaxWidth().requiredHeightIn(min = sheetPeekHeight),
                     sheetBackgroundColor = sheetBackgroundColor,
                     sheetContentColor = sheetContentColor,
                     sheetElevation = sheetElevation,
@@ -382,9 +364,7 @@
                 )
             },
             floatingActionButton = floatingActionButton,
-            snackbarHost = {
-                snackbarHost(scaffoldState.snackbarHostState)
-            },
+            snackbarHost = { snackbarHost(scaffoldState.snackbarHostState) },
             sheetPeekHeight = sheetPeekHeight,
             sheetState = scaffoldState.bottomSheetState,
             sheetOffset = { scaffoldState.bottomSheetState.requireOffset() },
@@ -410,23 +390,22 @@
     val peekHeightPx = with(LocalDensity.current) { sheetPeekHeight.toPx() }
     Surface(
         modifier
-            .draggableAnchors(
-                state.anchoredDraggableState,
-                Orientation.Vertical
-            ) { sheetSize, constraints ->
+            .draggableAnchors(state.anchoredDraggableState, Orientation.Vertical) {
+                sheetSize,
+                constraints ->
                 val layoutHeight = constraints.maxHeight
                 val sheetHeight = sheetSize.height.toFloat()
-                val newAnchors =
-                    DraggableAnchors {
-                        Collapsed at layoutHeight - peekHeightPx
-                        if (sheetHeight > 0f && sheetHeight != peekHeightPx) {
-                            Expanded at layoutHeight - sheetHeight
-                        }
+                val newAnchors = DraggableAnchors {
+                    Collapsed at layoutHeight - peekHeightPx
+                    if (sheetHeight > 0f && sheetHeight != peekHeightPx) {
+                        Expanded at layoutHeight - sheetHeight
                     }
-                val newTarget = when (state.anchoredDraggableState.targetValue) {
-                    Collapsed -> Collapsed
-                    Expanded -> if (newAnchors.hasAnchorFor(Expanded)) Expanded else Collapsed
                 }
+                val newTarget =
+                    when (state.anchoredDraggableState.targetValue) {
+                        Collapsed -> Collapsed
+                        Expanded -> if (newAnchors.hasAnchorFor(Expanded)) Expanded else Collapsed
+                    }
                 return@draggableAnchors newAnchors to newTarget
             }
             .anchoredDraggable(
@@ -463,27 +442,17 @@
     )
 }
 
-/**
- * Contains useful defaults for [BottomSheetScaffold].
- */
+/** Contains useful defaults for [BottomSheetScaffold]. */
 object BottomSheetScaffoldDefaults {
-    /**
-     * The default elevation used by [BottomSheetScaffold].
-     */
+    /** The default elevation used by [BottomSheetScaffold]. */
     val SheetElevation = 8.dp
 
-    /**
-     * The default peek height used by [BottomSheetScaffold].
-     */
+    /** The default peek height used by [BottomSheetScaffold]. */
     val SheetPeekHeight = 56.dp
 
-    /**
-     * The default animation spec used by [BottomSheetScaffoldState].
-     */
-    val AnimationSpec: AnimationSpec<Float> = tween(
-        durationMillis = 300,
-        easing = FastOutSlowInEasing
-    )
+    /** The default animation spec used by [BottomSheetScaffoldState]. */
+    val AnimationSpec: AnimationSpec<Float> =
+        tween(durationMillis = 300, easing = FastOutSlowInEasing)
 }
 
 @OptIn(ExperimentalMaterialApi::class)
@@ -500,20 +469,22 @@
     sheetState: BottomSheetState,
 ) {
     Layout(
-        contents = listOf<@Composable () -> Unit>(
-            topBar ?: { },
-            body,
-            bottomSheet,
-            floatingActionButton ?: { },
-            snackbarHost
-        )
-    ) { (
-        topBarMeasurables,
-        bodyMeasurables,
-        sheetMeasurables,
-        fabMeasurables,
-        snackbarHostMeasurables
-    ), constraints ->
+        contents =
+            listOf<@Composable () -> Unit>(
+                topBar ?: {},
+                body,
+                bottomSheet,
+                floatingActionButton ?: {},
+                snackbarHost
+            )
+    ) {
+        (
+            topBarMeasurables,
+            bodyMeasurables,
+            sheetMeasurables,
+            fabMeasurables,
+            snackbarHostMeasurables),
+        constraints ->
         val layoutWidth = constraints.maxWidth
         val layoutHeight = constraints.maxHeight
         val looseConstraints = constraints.copy(minWidth = 0, minHeight = 0)
@@ -537,22 +508,25 @@
         layout(layoutWidth, layoutHeight) {
             val sheetOffsetY = sheetOffset().roundToInt()
 
-            val fabOffsetX = when (floatingActionButtonPosition) {
-                FabPosition.Start -> FabSpacing.roundToPx()
-                FabPosition.Center -> (layoutWidth - fabWidth) / 2
-                else -> layoutWidth - fabWidth - FabSpacing.roundToPx()
-            }
+            val fabOffsetX =
+                when (floatingActionButtonPosition) {
+                    FabPosition.Start -> FabSpacing.roundToPx()
+                    FabPosition.Center -> (layoutWidth - fabWidth) / 2
+                    else -> layoutWidth - fabWidth - FabSpacing.roundToPx()
+                }
 
             // In case sheet peek height < (FAB height / 2), give the FAB some minimum space
-            val fabOffsetY = if (sheetPeekHeight.toPx() < fabHeight / 2) {
-                sheetOffsetY - fabHeight - FabSpacing.roundToPx()
-            } else sheetOffsetY - (fabHeight / 2)
+            val fabOffsetY =
+                if (sheetPeekHeight.toPx() < fabHeight / 2) {
+                    sheetOffsetY - fabHeight - FabSpacing.roundToPx()
+                } else sheetOffsetY - (fabHeight / 2)
 
             val snackbarOffsetX = (layoutWidth - snackbarWidth) / 2
-            val snackbarOffsetY = when (sheetState.currentValue) {
-                Collapsed -> fabOffsetY - snackbarHeight
-                Expanded -> layoutHeight - snackbarHeight
-            }
+            val snackbarOffsetY =
+                when (sheetState.currentValue) {
+                    Collapsed -> fabOffsetY - snackbarHeight
+                    Expanded -> layoutHeight - snackbarHeight
+                }
 
             // Placement order is important for elevation
             bodyPlaceables.fastForEach { it.placeRelative(0, topBarHeight) }
@@ -568,57 +542,59 @@
 private fun ConsumeSwipeWithinBottomSheetBoundsNestedScrollConnection(
     state: AnchoredDraggableState<*>,
     orientation: Orientation
-): NestedScrollConnection = object : NestedScrollConnection {
-    override fun onPreScroll(available: Offset, source: NestedScrollSource): Offset {
-        val delta = available.toFloat()
-        return if (delta < 0 && source == NestedScrollSource.UserInput) {
-            state.dispatchRawDelta(delta).toOffset()
-        } else {
-            Offset.Zero
+): NestedScrollConnection =
+    object : NestedScrollConnection {
+        override fun onPreScroll(available: Offset, source: NestedScrollSource): Offset {
+            val delta = available.toFloat()
+            return if (delta < 0 && source == NestedScrollSource.UserInput) {
+                state.dispatchRawDelta(delta).toOffset()
+            } else {
+                Offset.Zero
+            }
         }
-    }
 
-    override fun onPostScroll(
-        consumed: Offset,
-        available: Offset,
-        source: NestedScrollSource
-    ): Offset {
-        return if (source == NestedScrollSource.UserInput) {
-            state.dispatchRawDelta(available.toFloat()).toOffset()
-        } else {
-            Offset.Zero
+        override fun onPostScroll(
+            consumed: Offset,
+            available: Offset,
+            source: NestedScrollSource
+        ): Offset {
+            return if (source == NestedScrollSource.UserInput) {
+                state.dispatchRawDelta(available.toFloat()).toOffset()
+            } else {
+                Offset.Zero
+            }
         }
-    }
 
-    override suspend fun onPreFling(available: Velocity): Velocity {
-        val toFling = available.toFloat()
-        val currentOffset = state.requireOffset()
-        return if (toFling < 0 && currentOffset > state.anchors.minAnchor()) {
-            state.settle(velocity = toFling)
-            // since we go to the anchor with tween settling, consume all for the best UX
-            available
-        } else {
-            Velocity.Zero
+        override suspend fun onPreFling(available: Velocity): Velocity {
+            val toFling = available.toFloat()
+            val currentOffset = state.requireOffset()
+            return if (toFling < 0 && currentOffset > state.anchors.minAnchor()) {
+                state.settle(velocity = toFling)
+                // since we go to the anchor with tween settling, consume all for the best UX
+                available
+            } else {
+                Velocity.Zero
+            }
         }
+
+        override suspend fun onPostFling(consumed: Velocity, available: Velocity): Velocity {
+            state.settle(velocity = available.toFloat())
+            return available
+        }
+
+        private fun Float.toOffset(): Offset =
+            Offset(
+                x = if (orientation == Orientation.Horizontal) this else 0f,
+                y = if (orientation == Orientation.Vertical) this else 0f
+            )
+
+        @JvmName("velocityToFloat")
+        private fun Velocity.toFloat() = if (orientation == Orientation.Horizontal) x else y
+
+        @JvmName("offsetToFloat")
+        private fun Offset.toFloat(): Float = if (orientation == Orientation.Horizontal) x else y
     }
 
-    override suspend fun onPostFling(consumed: Velocity, available: Velocity): Velocity {
-        state.settle(velocity = available.toFloat())
-        return available
-    }
-
-    private fun Float.toOffset(): Offset = Offset(
-        x = if (orientation == Orientation.Horizontal) this else 0f,
-        y = if (orientation == Orientation.Vertical) this else 0f
-    )
-
-    @JvmName("velocityToFloat")
-    private fun Velocity.toFloat() = if (orientation == Orientation.Horizontal) x else y
-
-    @JvmName("offsetToFloat")
-    private fun Offset.toFloat(): Float = if (orientation == Orientation.Horizontal) x else y
-}
-
 private val FabSpacing = 16.dp
 private val BottomSheetScaffoldPositionalThreshold = 56.dp
 private val BottomSheetScaffoldVelocityThreshold = 125.dp
diff --git a/compose/material/material/src/commonMain/kotlin/androidx/compose/material/Button.kt b/compose/material/material/src/commonMain/kotlin/androidx/compose/material/Button.kt
index 7ea5447..34ba75e 100644
--- a/compose/material/material/src/commonMain/kotlin/androidx/compose/material/Button.kt
+++ b/compose/material/material/src/commonMain/kotlin/androidx/compose/material/Button.kt
@@ -55,38 +55,41 @@
 import androidx.compose.ui.unit.dp
 
 /**
- * <a href="https://material.io/components/buttons#contained-button" class="external" target="_blank">Material Design contained button</a>.
+ * <a href="https://material.io/components/buttons#contained-button" class="external"
+ * target="_blank">Material Design contained button</a>.
  *
  * Contained buttons are high-emphasis, distinguished by their use of elevation and fill. They
  * contain actions that are primary to your app.
  *
- * ![Contained button image](https://developer.android.com/images/reference/androidx/compose/material/contained-button.png)
+ * ![Contained button
+ * image](https://developer.android.com/images/reference/androidx/compose/material/contained-button.png)
  *
  * The default text style for internal [Text] components will be set to [Typography.button].
  *
  * @sample androidx.compose.material.samples.ButtonSample
  *
- * If you need to add an icon just put it inside the [content] slot together with a spacing
- * and a text:
+ * If you need to add an icon just put it inside the [content] slot together with a spacing and a
+ * text:
  *
  * @sample androidx.compose.material.samples.ButtonWithIconSample
  *
  * @param onClick Will be called when the user clicks the button
  * @param modifier Modifier to be applied to the button
- * @param enabled Controls the enabled state of the button. When `false`, this button will not
- * be clickable
+ * @param enabled Controls the enabled state of the button. When `false`, this button will not be
+ *   clickable
  * @param interactionSource an optional hoisted [MutableInteractionSource] for observing and
- * emitting [Interaction]s for this button. You can use this to change the button's appearance
- * or preview the button in different states. Note that if `null` is provided, interactions will
- * still happen internally.
+ *   emitting [Interaction]s for this button. You can use this to change the button's appearance or
+ *   preview the button in different states. Note that if `null` is provided, interactions will
+ *   still happen internally.
  * @param elevation [ButtonElevation] used to resolve the elevation for this button in different
- * states. This controls the size of the shadow below the button. Pass `null` here to disable
- * elevation for this button. See [ButtonDefaults.elevation].
+ *   states. This controls the size of the shadow below the button. Pass `null` here to disable
+ *   elevation for this button. See [ButtonDefaults.elevation].
  * @param shape Defines the button's shape as well as its shadow
  * @param border Border to draw around the button
  * @param colors [ButtonColors] that will be used to resolve the background and content color for
- * this button in different states. See [ButtonDefaults.buttonColors].
- * @param contentPadding The spacing values to apply internally between the container and the content
+ *   this button in different states. See [ButtonDefaults.buttonColors].
+ * @param contentPadding The spacing values to apply internally between the container and the
+ *   content
  */
 @OptIn(ExperimentalMaterialApi::class)
 @Composable
@@ -117,12 +120,9 @@
         interactionSource = interactionSource
     ) {
         CompositionLocalProvider(LocalContentAlpha provides contentColor.alpha) {
-            ProvideTextStyle(
-                value = MaterialTheme.typography.button
-            ) {
+            ProvideTextStyle(value = MaterialTheme.typography.button) {
                 Row(
-                    Modifier
-                        .defaultMinSize(
+                    Modifier.defaultMinSize(
                             minWidth = ButtonDefaults.MinWidth,
                             minHeight = ButtonDefaults.MinHeight
                         )
@@ -137,12 +137,14 @@
 }
 
 /**
- * <a href="https://material.io/components/buttons#outlined-button" class="external" target="_blank">Material Design outlined button</a>.
+ * <a href="https://material.io/components/buttons#outlined-button" class="external"
+ * target="_blank">Material Design outlined button</a>.
  *
  * Outlined buttons are medium-emphasis buttons. They contain actions that are important, but aren't
  * the primary action in an app.
  *
- * ![Outlined button image](https://developer.android.com/images/reference/androidx/compose/material/outlined-button.png)
+ * ![Outlined button
+ * image](https://developer.android.com/images/reference/androidx/compose/material/outlined-button.png)
  *
  * The default text style for internal [Text] components will be set to [Typography.button].
  *
@@ -150,19 +152,20 @@
  *
  * @param onClick Will be called when the user clicks the button
  * @param modifier Modifier to be applied to the button
- * @param enabled Controls the enabled state of the button. When `false`, this button will not
- * be clickable
+ * @param enabled Controls the enabled state of the button. When `false`, this button will not be
+ *   clickable
  * @param interactionSource an optional hoisted [MutableInteractionSource] for observing and
- * emitting [Interaction]s for this button. You can use this to change the button's appearance
- * or preview the button in different states. Note that if `null` is provided, interactions will
- * still happen internally.
+ *   emitting [Interaction]s for this button. You can use this to change the button's appearance or
+ *   preview the button in different states. Note that if `null` is provided, interactions will
+ *   still happen internally.
  * @param elevation [ButtonElevation] used to resolve the elevation for this button in different
- * states. An OutlinedButton typically has no elevation, see [Button] for a button with elevation.
+ *   states. An OutlinedButton typically has no elevation, see [Button] for a button with elevation.
  * @param shape Defines the button's shape as well as its shadow
  * @param border Border to draw around the button
  * @param colors [ButtonColors] that will be used to resolve the background and content color for
- * this button in different states. See [ButtonDefaults.outlinedButtonColors].
- * @param contentPadding The spacing values to apply internally between the container and the content
+ *   this button in different states. See [ButtonDefaults.outlinedButtonColors].
+ * @param contentPadding The spacing values to apply internally between the container and the
+ *   content
  */
 @Composable
 @NonRestartableComposable
@@ -177,26 +180,29 @@
     colors: ButtonColors = ButtonDefaults.outlinedButtonColors(),
     contentPadding: PaddingValues = ButtonDefaults.ContentPadding,
     content: @Composable RowScope.() -> Unit
-) = Button(
-    onClick = onClick,
-    modifier = modifier,
-    enabled = enabled,
-    interactionSource = interactionSource,
-    elevation = elevation,
-    shape = shape,
-    border = border,
-    colors = colors,
-    contentPadding = contentPadding,
-    content = content
-)
+) =
+    Button(
+        onClick = onClick,
+        modifier = modifier,
+        enabled = enabled,
+        interactionSource = interactionSource,
+        elevation = elevation,
+        shape = shape,
+        border = border,
+        colors = colors,
+        contentPadding = contentPadding,
+        content = content
+    )
 
 /**
- * <a href="https://material.io/components/buttons#text-button" class="external" target="_blank">Material Design text button</a>.
+ * <a href="https://material.io/components/buttons#text-button" class="external"
+ * target="_blank">Material Design text button</a>.
  *
  * Text buttons are typically used for less-pronounced actions, including those located in dialogs
  * and cards. In cards, text buttons help maintain an emphasis on card content.
  *
- * ![Text button image](https://developer.android.com/images/reference/androidx/compose/material/text-button.png)
+ * ![Text button
+ * image](https://developer.android.com/images/reference/androidx/compose/material/text-button.png)
  *
  * The default text style for internal [Text] components will be set to [Typography.button].
  *
@@ -204,19 +210,20 @@
  *
  * @param onClick Will be called when the user clicks the button
  * @param modifier Modifier to be applied to the button
- * @param enabled Controls the enabled state of the button. When `false`, this button will not
- * be clickable
+ * @param enabled Controls the enabled state of the button. When `false`, this button will not be
+ *   clickable
  * @param interactionSource an optional hoisted [MutableInteractionSource] for observing and
- * emitting [Interaction]s for this button. You can use this to change the button's appearance
- * or preview the button in different states. Note that if `null` is provided, interactions will
- * still happen internally.
+ *   emitting [Interaction]s for this button. You can use this to change the button's appearance or
+ *   preview the button in different states. Note that if `null` is provided, interactions will
+ *   still happen internally.
  * @param elevation [ButtonElevation] used to resolve the elevation for this button in different
- * states. A TextButton typically has no elevation, see [Button] for a button with elevation.
+ *   states. A TextButton typically has no elevation, see [Button] for a button with elevation.
  * @param shape Defines the button's shape as well as its shadow
  * @param border Border to draw around the button
  * @param colors [ButtonColors] that will be used to resolve the background and content color for
- * this button in different states. See [ButtonDefaults.textButtonColors].
- * @param contentPadding The spacing values to apply internally between the container and the content
+ *   this button in different states. See [ButtonDefaults.textButtonColors].
+ * @param contentPadding The spacing values to apply internally between the container and the
+ *   content
  */
 @Composable
 @NonRestartableComposable
@@ -231,18 +238,19 @@
     colors: ButtonColors = ButtonDefaults.textButtonColors(),
     contentPadding: PaddingValues = ButtonDefaults.TextButtonContentPadding,
     content: @Composable RowScope.() -> Unit
-) = Button(
-    onClick = onClick,
-    modifier = modifier,
-    enabled = enabled,
-    interactionSource = interactionSource,
-    elevation = elevation,
-    shape = shape,
-    border = border,
-    colors = colors,
-    contentPadding = contentPadding,
-    content = content
-)
+) =
+    Button(
+        onClick = onClick,
+        modifier = modifier,
+        enabled = enabled,
+        interactionSource = interactionSource,
+        elevation = elevation,
+        shape = shape,
+        border = border,
+        colors = colors,
+        contentPadding = contentPadding,
+        content = content
+    )
 
 /**
  * Represents the elevation for a button in different states.
@@ -252,23 +260,20 @@
 @Stable
 interface ButtonElevation {
     /**
-     * Represents the elevation used in a button, depending on [enabled] and
-     * [interactionSource].
+     * Represents the elevation used in a button, depending on [enabled] and [interactionSource].
      *
      * @param enabled whether the button is enabled
      * @param interactionSource the [InteractionSource] for this button
      */
-    @Composable
-    fun elevation(enabled: Boolean, interactionSource: InteractionSource): State<Dp>
+    @Composable fun elevation(enabled: Boolean, interactionSource: InteractionSource): State<Dp>
 }
 
 /**
  * Represents the background and content colors used in a button in different states.
  *
- * See [ButtonDefaults.buttonColors] for the default colors used in a [Button].
- * See [ButtonDefaults.outlinedButtonColors] for the default colors used in a
- * [OutlinedButton].
- * See [ButtonDefaults.textButtonColors] for the default colors used in a [TextButton].
+ * See [ButtonDefaults.buttonColors] for the default colors used in a [Button]. See
+ * [ButtonDefaults.outlinedButtonColors] for the default colors used in a [OutlinedButton]. See
+ * [ButtonDefaults.textButtonColors] for the default colors used in a [TextButton].
  */
 @Stable
 interface ButtonColors {
@@ -277,44 +282,39 @@
      *
      * @param enabled whether the button is enabled
      */
-    @Composable
-    fun backgroundColor(enabled: Boolean): State<Color>
+    @Composable fun backgroundColor(enabled: Boolean): State<Color>
 
     /**
      * Represents the content color for this button, depending on [enabled].
      *
      * @param enabled whether the button is enabled
      */
-    @Composable
-    fun contentColor(enabled: Boolean): State<Color>
+    @Composable fun contentColor(enabled: Boolean): State<Color>
 }
 
-/**
- * Contains the default values used by [Button]
- */
+/** Contains the default values used by [Button] */
 object ButtonDefaults {
     private val ButtonHorizontalPadding = 16.dp
     private val ButtonVerticalPadding = 8.dp
 
-    /**
-     * The default content padding used by [Button]
-     */
-    val ContentPadding = PaddingValues(
-        start = ButtonHorizontalPadding,
-        top = ButtonVerticalPadding,
-        end = ButtonHorizontalPadding,
-        bottom = ButtonVerticalPadding
-    )
+    /** The default content padding used by [Button] */
+    val ContentPadding =
+        PaddingValues(
+            start = ButtonHorizontalPadding,
+            top = ButtonVerticalPadding,
+            end = ButtonHorizontalPadding,
+            bottom = ButtonVerticalPadding
+        )
 
     /**
-     * The default min width applied for the [Button].
-     * Note that you can override it by applying Modifier.widthIn directly on [Button].
+     * The default min width applied for the [Button]. Note that you can override it by applying
+     * Modifier.widthIn directly on [Button].
      */
     val MinWidth = 64.dp
 
     /**
-     * The default min height applied for the [Button].
-     * Note that you can override it by applying Modifier.heightIn directly on [Button].
+     * The default min height applied for the [Button]. Note that you can override it by applying
+     * Modifier.heightIn directly on [Button].
      */
     val MinHeight = 36.dp
 
@@ -336,10 +336,9 @@
      * Creates a [ButtonElevation] that will animate between the provided values according to the
      * Material specification for a [Button].
      *
-     * @param defaultElevation the elevation to use when the [Button] is enabled, and has no
-     * other [Interaction]s.
-     * @param pressedElevation the elevation to use when the [Button] is enabled and
-     * is pressed.
+     * @param defaultElevation the elevation to use when the [Button] is enabled, and has no other
+     *   [Interaction]s.
+     * @param pressedElevation the elevation to use when the [Button] is enabled and is pressed.
      * @param disabledElevation the elevation to use when the [Button] is not enabled.
      */
     @Deprecated("Use another overload of elevation", level = DeprecationLevel.HIDDEN)
@@ -348,22 +347,22 @@
         defaultElevation: Dp = 2.dp,
         pressedElevation: Dp = 8.dp,
         disabledElevation: Dp = 0.dp
-    ): ButtonElevation = elevation(
-        defaultElevation,
-        pressedElevation,
-        disabledElevation,
-        hoveredElevation = 4.dp,
-        focusedElevation = 4.dp,
-    )
+    ): ButtonElevation =
+        elevation(
+            defaultElevation,
+            pressedElevation,
+            disabledElevation,
+            hoveredElevation = 4.dp,
+            focusedElevation = 4.dp,
+        )
 
     /**
      * Creates a [ButtonElevation] that will animate between the provided values according to the
      * Material specification for a [Button].
      *
-     * @param defaultElevation the elevation to use when the [Button] is enabled, and has no
-     * other [Interaction]s.
-     * @param pressedElevation the elevation to use when the [Button] is enabled and
-     * is pressed.
+     * @param defaultElevation the elevation to use when the [Button] is enabled, and has no other
+     *   [Interaction]s.
+     * @param pressedElevation the elevation to use when the [Button] is enabled and is pressed.
      * @param disabledElevation the elevation to use when the [Button] is not enabled.
      * @param hoveredElevation the elevation to use when the [Button] is enabled and is hovered.
      * @param focusedElevation the elevation to use when the [Button] is enabled and is focused.
@@ -395,8 +394,8 @@
     }
 
     /**
-     * Creates a [ButtonColors] that represents the default background and content colors used in
-     * a [Button].
+     * Creates a [ButtonColors] that represents the default background and content colors used in a
+     * [Button].
      *
      * @param backgroundColor the background color of this [Button] when enabled
      * @param contentColor the content color of this [Button] when enabled
@@ -407,20 +406,23 @@
     fun buttonColors(
         backgroundColor: Color = MaterialTheme.colors.primary,
         contentColor: Color = contentColorFor(backgroundColor),
-        disabledBackgroundColor: Color = MaterialTheme.colors.onSurface.copy(alpha = 0.12f)
-            .compositeOver(MaterialTheme.colors.surface),
-        disabledContentColor: Color = MaterialTheme.colors.onSurface
-            .copy(alpha = ContentAlpha.disabled)
-    ): ButtonColors = DefaultButtonColors(
-        backgroundColor = backgroundColor,
-        contentColor = contentColor,
-        disabledBackgroundColor = disabledBackgroundColor,
-        disabledContentColor = disabledContentColor
-    )
+        disabledBackgroundColor: Color =
+            MaterialTheme.colors.onSurface
+                .copy(alpha = 0.12f)
+                .compositeOver(MaterialTheme.colors.surface),
+        disabledContentColor: Color =
+            MaterialTheme.colors.onSurface.copy(alpha = ContentAlpha.disabled)
+    ): ButtonColors =
+        DefaultButtonColors(
+            backgroundColor = backgroundColor,
+            contentColor = contentColor,
+            disabledBackgroundColor = disabledBackgroundColor,
+            disabledContentColor = disabledContentColor
+        )
 
     /**
-     * Creates a [ButtonColors] that represents the default background and content colors used in
-     * an [OutlinedButton].
+     * Creates a [ButtonColors] that represents the default background and content colors used in an
+     * [OutlinedButton].
      *
      * @param backgroundColor the background color of this [OutlinedButton]
      * @param contentColor the content color of this [OutlinedButton] when enabled
@@ -430,18 +432,19 @@
     fun outlinedButtonColors(
         backgroundColor: Color = MaterialTheme.colors.surface,
         contentColor: Color = MaterialTheme.colors.primary,
-        disabledContentColor: Color = MaterialTheme.colors.onSurface
-            .copy(alpha = ContentAlpha.disabled)
-    ): ButtonColors = DefaultButtonColors(
-        backgroundColor = backgroundColor,
-        contentColor = contentColor,
-        disabledBackgroundColor = backgroundColor,
-        disabledContentColor = disabledContentColor
-    )
+        disabledContentColor: Color =
+            MaterialTheme.colors.onSurface.copy(alpha = ContentAlpha.disabled)
+    ): ButtonColors =
+        DefaultButtonColors(
+            backgroundColor = backgroundColor,
+            contentColor = contentColor,
+            disabledBackgroundColor = backgroundColor,
+            disabledContentColor = disabledContentColor
+        )
 
     /**
-     * Creates a [ButtonColors] that represents the default background and content colors used in
-     * a [TextButton].
+     * Creates a [ButtonColors] that represents the default background and content colors used in a
+     * [TextButton].
      *
      * @param backgroundColor the background color of this [TextButton]
      * @param contentColor the content color of this [TextButton] when enabled
@@ -451,50 +454,44 @@
     fun textButtonColors(
         backgroundColor: Color = Color.Transparent,
         contentColor: Color = MaterialTheme.colors.primary,
-        disabledContentColor: Color = MaterialTheme.colors.onSurface
-            .copy(alpha = ContentAlpha.disabled)
-    ): ButtonColors = DefaultButtonColors(
-        backgroundColor = backgroundColor,
-        contentColor = contentColor,
-        disabledBackgroundColor = backgroundColor,
-        disabledContentColor = disabledContentColor
-    )
+        disabledContentColor: Color =
+            MaterialTheme.colors.onSurface.copy(alpha = ContentAlpha.disabled)
+    ): ButtonColors =
+        DefaultButtonColors(
+            backgroundColor = backgroundColor,
+            contentColor = contentColor,
+            disabledBackgroundColor = backgroundColor,
+            disabledContentColor = disabledContentColor
+        )
 
-    /**
-     * The default color opacity used for an [OutlinedButton]'s border color
-     */
+    /** The default color opacity used for an [OutlinedButton]'s border color */
     const val OutlinedBorderOpacity = 0.12f
 
-    /**
-     * The default [OutlinedButton]'s border size
-     */
+    /** The default [OutlinedButton]'s border size */
     val OutlinedBorderSize = 1.dp
 
-    /**
-     * The default disabled content color used by all types of [Button]s
-     */
+    /** The default disabled content color used by all types of [Button]s */
     val outlinedBorder: BorderStroke
         @Composable
-        get() = BorderStroke(
-            OutlinedBorderSize, MaterialTheme.colors.onSurface.copy(alpha = OutlinedBorderOpacity)
-        )
+        get() =
+            BorderStroke(
+                OutlinedBorderSize,
+                MaterialTheme.colors.onSurface.copy(alpha = OutlinedBorderOpacity)
+            )
 
     private val TextButtonHorizontalPadding = 8.dp
 
-    /**
-     * The default content padding used by [TextButton]
-     */
-    val TextButtonContentPadding = PaddingValues(
-        start = TextButtonHorizontalPadding,
-        top = ContentPadding.calculateTopPadding(),
-        end = TextButtonHorizontalPadding,
-        bottom = ContentPadding.calculateBottomPadding()
-    )
+    /** The default content padding used by [TextButton] */
+    val TextButtonContentPadding =
+        PaddingValues(
+            start = TextButtonHorizontalPadding,
+            top = ContentPadding.calculateTopPadding(),
+            end = TextButtonHorizontalPadding,
+            bottom = ContentPadding.calculateBottomPadding()
+        )
 }
 
-/**
- * Default [ButtonElevation] implementation.
- */
+/** Default [ButtonElevation] implementation. */
 @Stable
 private class DefaultButtonElevation(
     private val defaultElevation: Dp,
@@ -536,16 +533,17 @@
 
         val interaction = interactions.lastOrNull()
 
-        val target = if (!enabled) {
-            disabledElevation
-        } else {
-            when (interaction) {
-                is PressInteraction.Press -> pressedElevation
-                is HoverInteraction.Enter -> hoveredElevation
-                is FocusInteraction.Focus -> focusedElevation
-                else -> defaultElevation
+        val target =
+            if (!enabled) {
+                disabledElevation
+            } else {
+                when (interaction) {
+                    is PressInteraction.Press -> pressedElevation
+                    is HoverInteraction.Enter -> hoveredElevation
+                    is FocusInteraction.Focus -> focusedElevation
+                    else -> defaultElevation
+                }
             }
-        }
 
         val animatable = remember { Animatable(target, Dp.VectorConverter) }
 
@@ -555,12 +553,13 @@
                     // No transition when moving to a disabled state
                     animatable.snapTo(target)
                 } else {
-                    val lastInteraction = when (animatable.targetValue) {
-                        pressedElevation -> PressInteraction.Press(Offset.Zero)
-                        hoveredElevation -> HoverInteraction.Enter()
-                        focusedElevation -> FocusInteraction.Focus()
-                        else -> null
-                    }
+                    val lastInteraction =
+                        when (animatable.targetValue) {
+                            pressedElevation -> PressInteraction.Press(Offset.Zero)
+                            hoveredElevation -> HoverInteraction.Enter()
+                            focusedElevation -> FocusInteraction.Focus()
+                            else -> null
+                        }
                     animatable.animateElevation(
                         from = lastInteraction,
                         to = interaction,
@@ -574,9 +573,7 @@
     }
 }
 
-/**
- * Default [ButtonColors] implementation.
- */
+/** Default [ButtonColors] implementation. */
 @Immutable
 private class DefaultButtonColors(
     private val backgroundColor: Color,
diff --git a/compose/material/material/src/commonMain/kotlin/androidx/compose/material/Card.kt b/compose/material/material/src/commonMain/kotlin/androidx/compose/material/Card.kt
index 6fec3907..fb6bc1c 100644
--- a/compose/material/material/src/commonMain/kotlin/androidx/compose/material/Card.kt
+++ b/compose/material/material/src/commonMain/kotlin/androidx/compose/material/Card.kt
@@ -28,27 +28,29 @@
 import androidx.compose.ui.unit.dp
 
 /**
- * <a href="https://material.io/components/cards" class="external" target="_blank">Material Design card</a>.
+ * <a href="https://material.io/components/cards" class="external" target="_blank">Material Design
+ * card</a>.
  *
  * Cards contain content and actions about a single subject.
  *
- * ![Cards image](https://developer.android.com/images/reference/androidx/compose/material/cards.png)
+ * ![Cards
+ * image](https://developer.android.com/images/reference/androidx/compose/material/cards.png)
  *
- * This version of Card will block clicks behind it. For clickable card, please use another
- * overload that accepts `onClick` as a parameter.
+ * This version of Card will block clicks behind it. For clickable card, please use another overload
+ * that accepts `onClick` as a parameter.
  *
  * @sample androidx.compose.material.samples.CardSample
  *
  * @param modifier Modifier to be applied to the layout of the card.
- * @param shape Defines the card's shape as well its shadow. A shadow is only
- *  displayed if the [elevation] is greater than zero.
+ * @param shape Defines the card's shape as well its shadow. A shadow is only displayed if the
+ *   [elevation] is greater than zero.
  * @param backgroundColor The background color.
- * @param contentColor The preferred content color provided by this card to its children.
- * Defaults to either the matching content color for [backgroundColor], or if [backgroundColor]
- * is not a color from the theme, this will keep the same value set above this card.
+ * @param contentColor The preferred content color provided by this card to its children. Defaults
+ *   to either the matching content color for [backgroundColor], or if [backgroundColor] is not a
+ *   color from the theme, this will keep the same value set above this card.
  * @param border Optional border to draw on top of the card
- * @param elevation The z-coordinate at which to place this card. This controls
- *  the size of the shadow below the card.
+ * @param elevation The z-coordinate at which to place this card. This controls the size of the
+ *   shadow below the card.
  */
 @Composable
 @NonRestartableComposable
@@ -75,28 +77,28 @@
 /**
  * Cards are [Surface]s that display content and actions on a single topic.
  *
- * This version of Card provides click handling as well. If you do not want Card to handle
- * clicks, consider using another overload.
+ * This version of Card provides click handling as well. If you do not want Card to handle clicks,
+ * consider using another overload.
  *
  * @sample androidx.compose.material.samples.ClickableCardSample
  *
  * @param onClick callback to be called when the card is clicked
  * @param modifier Modifier to be applied to the layout of the card.
- * @param enabled Controls the enabled state of the card. When `false`, this card will not
- * be clickable
- * @param shape Defines the card's shape as well its shadow. A shadow is only
- *  displayed if the [elevation] is greater than zero.
+ * @param enabled Controls the enabled state of the card. When `false`, this card will not be
+ *   clickable
+ * @param shape Defines the card's shape as well its shadow. A shadow is only displayed if the
+ *   [elevation] is greater than zero.
  * @param backgroundColor The background color.
- * @param contentColor The preferred content color provided by this card to its children.
- * Defaults to either the matching content color for [backgroundColor], or if [backgroundColor]
- * is not a color from the theme, this will keep the same value set above this card.
+ * @param contentColor The preferred content color provided by this card to its children. Defaults
+ *   to either the matching content color for [backgroundColor], or if [backgroundColor] is not a
+ *   color from the theme, this will keep the same value set above this card.
  * @param border Optional border to draw on top of the card
- * @param elevation The z-coordinate at which to place this card. This controls
- *  the size of the shadow below the card.
+ * @param elevation The z-coordinate at which to place this card. This controls the size of the
+ *   shadow below the card.
  * @param interactionSource an optional hoisted [MutableInteractionSource] for observing and
- * emitting [Interaction]s for this card. You can use this to change the card's
- * appearance or preview the card in different states. Note that if `null` is provided,
- * interactions will still happen internally.
+ *   emitting [Interaction]s for this card. You can use this to change the card's appearance or
+ *   preview the card in different states. Note that if `null` is provided, interactions will still
+ *   happen internally.
  */
 @ExperimentalMaterialApi
 @Composable
diff --git a/compose/material/material/src/commonMain/kotlin/androidx/compose/material/Checkbox.kt b/compose/material/material/src/commonMain/kotlin/androidx/compose/material/Checkbox.kt
index 5f39ed7..7bfde1f 100644
--- a/compose/material/material/src/commonMain/kotlin/androidx/compose/material/Checkbox.kt
+++ b/compose/material/material/src/commonMain/kotlin/androidx/compose/material/Checkbox.kt
@@ -56,30 +56,31 @@
 import kotlin.math.max
 
 /**
- * <a href="https://material.io/components/checkboxes" class="external" target="_blank">Material Design checkbox</a>.
+ * <a href="https://material.io/components/checkboxes" class="external" target="_blank">Material
+ * Design checkbox</a>.
  *
  * Checkboxes allow users to select one or more items from a set. Checkboxes can turn an option on
  * or off.
  *
- * ![Checkboxes image](https://developer.android.com/images/reference/androidx/compose/material/checkboxes.png)
+ * ![Checkboxes
+ * image](https://developer.android.com/images/reference/androidx/compose/material/checkboxes.png)
  *
  * @sample androidx.compose.material.samples.CheckboxSample
  *
- * @see [TriStateCheckbox] if you require support for an indeterminate state, or more advanced
- * color customization between states.
- *
  * @param checked whether Checkbox is checked or unchecked
- * @param onCheckedChange callback to be invoked when checkbox is being clicked,
- * therefore the change of checked state in requested.  If null, then this is passive
- * and relies entirely on a higher-level component to control the "checked" state.
+ * @param onCheckedChange callback to be invoked when checkbox is being clicked, therefore the
+ *   change of checked state in requested. If null, then this is passive and relies entirely on a
+ *   higher-level component to control the "checked" state.
  * @param modifier Modifier to be applied to the layout of the checkbox
  * @param enabled whether the component is enabled or grayed out
  * @param interactionSource an optional hoisted [MutableInteractionSource] for observing and
- * emitting [Interaction]s for this checkbox. You can use this to change the checkbox's
- * appearance or preview the checkbox in different states. Note that if `null` is provided,
- * interactions will still happen internally.
- * @param colors [CheckboxColors] that will be used to determine the color of the checkmark / box
- * / border in different states. See [CheckboxDefaults.colors].
+ *   emitting [Interaction]s for this checkbox. You can use this to change the checkbox's appearance
+ *   or preview the checkbox in different states. Note that if `null` is provided, interactions will
+ *   still happen internally.
+ * @param colors [CheckboxColors] that will be used to determine the color of the checkmark / box /
+ *   border in different states. See [CheckboxDefaults.colors].
+ * @see [TriStateCheckbox] if you require support for an indeterminate state, or more advanced color
+ *   customization between states.
  */
 @Composable
 fun Checkbox(
@@ -92,7 +93,10 @@
 ) {
     TriStateCheckbox(
         state = ToggleableState(checked),
-        onClick = if (onCheckedChange != null) { { onCheckedChange(!checked) } } else null,
+        onClick =
+            if (onCheckedChange != null) {
+                { onCheckedChange(!checked) }
+            } else null,
         interactionSource = interactionSource,
         enabled = enabled,
         colors = colors,
@@ -101,31 +105,32 @@
 }
 
 /**
- * <a href="https://material.io/components/checkboxes" class="external" target="_blank">Material Design checkbox</a> parent.
+ * <a href="https://material.io/components/checkboxes" class="external" target="_blank">Material
+ * Design checkbox</a> parent.
  *
  * Checkboxes can have a parent-child relationship with other checkboxes. When the parent checkbox
  * is checked, all child checkboxes are checked. If a parent checkbox is unchecked, all child
  * checkboxes are unchecked. If some, but not all, child checkboxes are checked, the parent checkbox
  * becomes an indeterminate checkbox.
  *
- * ![Checkboxes image](https://developer.android.com/images/reference/androidx/compose/material/checkboxes.png)
+ * ![Checkboxes
+ * image](https://developer.android.com/images/reference/androidx/compose/material/checkboxes.png)
  *
  * @sample androidx.compose.material.samples.TriStateCheckboxSample
  *
- * @see [Checkbox] if you want a simple component that represents Boolean state
- *
  * @param state whether TriStateCheckbox is checked, unchecked or in indeterminate state
- * @param onClick callback to be invoked when checkbox is being clicked,
- * therefore the change of ToggleableState state is requested.  If null, then this is passive
- * and relies entirely on a higher-level component to control the state.
+ * @param onClick callback to be invoked when checkbox is being clicked, therefore the change of
+ *   ToggleableState state is requested. If null, then this is passive and relies entirely on a
+ *   higher-level component to control the state.
  * @param modifier Modifier to be applied to the layout of the checkbox
  * @param enabled whether the component is enabled or grayed out
  * @param interactionSource an optional hoisted [MutableInteractionSource] for observing and
- * emitting [Interaction]s for this checkbox. You can use this to change the checkbox's
- * appearance or preview the checkbox in different states. Note that if `null` is provided,
- * interactions will still happen internally.
- * @param colors [CheckboxColors] that will be used to determine the color of the checkmark / box
- * / border in different states. See [CheckboxDefaults.colors].
+ *   emitting [Interaction]s for this checkbox. You can use this to change the checkbox's appearance
+ *   or preview the checkbox in different states. Note that if `null` is provided, interactions will
+ *   still happen internally.
+ * @param colors [CheckboxColors] that will be used to determine the color of the checkmark / box /
+ *   border in different states. See [CheckboxDefaults.colors].
+ * @see [Checkbox] if you want a simple component that represents Boolean state
  */
 @Composable
 fun TriStateCheckbox(
@@ -144,10 +149,8 @@
                 enabled = enabled,
                 role = Role.Checkbox,
                 interactionSource = interactionSource,
-                indication = rippleOrFallbackImplementation(
-                    bounded = false,
-                    radius = CheckboxRippleRadius
-                )
+                indication =
+                    rippleOrFallbackImplementation(bounded = false, radius = CheckboxRippleRadius)
             )
         } else {
             Modifier
@@ -155,16 +158,17 @@
     CheckboxImpl(
         enabled = enabled,
         value = state,
-        modifier = modifier
-            .then(
-                if (onClick != null) {
-                    Modifier.minimumInteractiveComponentSize()
-                } else {
-                    Modifier
-                }
-            )
-            .then(toggleableModifier)
-            .padding(CheckboxDefaultPadding),
+        modifier =
+            modifier
+                .then(
+                    if (onClick != null) {
+                        Modifier.minimumInteractiveComponentSize()
+                    } else {
+                        Modifier
+                    }
+                )
+                .then(toggleableModifier)
+                .padding(CheckboxDefaultPadding),
         colors = colors
     )
 }
@@ -184,8 +188,7 @@
      *
      * @param state the [ToggleableState] of the checkbox
      */
-    @Composable
-    fun checkmarkColor(state: ToggleableState): State<Color>
+    @Composable fun checkmarkColor(state: ToggleableState): State<Color>
 
     /**
      * Represents the color used for the box (background) of the checkbox, depending on [enabled]
@@ -194,8 +197,7 @@
      * @param enabled whether the checkbox is enabled or not
      * @param state the [ToggleableState] of the checkbox
      */
-    @Composable
-    fun boxColor(enabled: Boolean, state: ToggleableState): State<Color>
+    @Composable fun boxColor(enabled: Boolean, state: ToggleableState): State<Color>
 
     /**
      * Represents the color used for the border of the checkbox, depending on [enabled] and [state].
@@ -203,13 +205,10 @@
      * @param enabled whether the checkbox is enabled or not
      * @param state the [ToggleableState] of the checkbox
      */
-    @Composable
-    fun borderColor(enabled: Boolean, state: ToggleableState): State<Color>
+    @Composable fun borderColor(enabled: Boolean, state: ToggleableState): State<Color>
 }
 
-/**
- * Defaults used in [Checkbox] and [TriStateCheckbox].
- */
+/** Defaults used in [Checkbox] and [TriStateCheckbox]. */
 object CheckboxDefaults {
     /**
      * Creates a [CheckboxColors] that will animate between the provided colors according to the
@@ -219,8 +218,8 @@
      * @param uncheckedColor color that will be used for the border when unchecked
      * @param checkmarkColor color that will be used for the checkmark when checked
      * @param disabledColor color that will be used for the box and border when disabled
-     * @param disabledIndeterminateColor color that will be used for the box and
-     * border in a [TriStateCheckbox] when disabled AND in an [ToggleableState.Indeterminate] state.
+     * @param disabledIndeterminateColor color that will be used for the box and border in a
+     *   [TriStateCheckbox] when disabled AND in an [ToggleableState.Indeterminate] state.
      */
     @Composable
     fun colors(
@@ -262,37 +261,39 @@
     colors: CheckboxColors
 ) {
     val transition = updateTransition(value)
-    val checkDrawFraction by transition.animateFloat(
-        transitionSpec = {
-            when {
-                initialState == ToggleableState.Off -> tween(CheckAnimationDuration)
-                targetState == ToggleableState.Off -> snap(BoxOutDuration)
-                else -> spring()
+    val checkDrawFraction by
+        transition.animateFloat(
+            transitionSpec = {
+                when {
+                    initialState == ToggleableState.Off -> tween(CheckAnimationDuration)
+                    targetState == ToggleableState.Off -> snap(BoxOutDuration)
+                    else -> spring()
+                }
+            }
+        ) {
+            when (it) {
+                ToggleableState.On -> 1f
+                ToggleableState.Off -> 0f
+                ToggleableState.Indeterminate -> 1f
             }
         }
-    ) {
-        when (it) {
-            ToggleableState.On -> 1f
-            ToggleableState.Off -> 0f
-            ToggleableState.Indeterminate -> 1f
-        }
-    }
 
-    val checkCenterGravitationShiftFraction by transition.animateFloat(
-        transitionSpec = {
-            when {
-                initialState == ToggleableState.Off -> snap()
-                targetState == ToggleableState.Off -> snap(BoxOutDuration)
-                else -> tween(durationMillis = CheckAnimationDuration)
+    val checkCenterGravitationShiftFraction by
+        transition.animateFloat(
+            transitionSpec = {
+                when {
+                    initialState == ToggleableState.Off -> snap()
+                    targetState == ToggleableState.Off -> snap(BoxOutDuration)
+                    else -> tween(durationMillis = CheckAnimationDuration)
+                }
+            }
+        ) {
+            when (it) {
+                ToggleableState.On -> 0f
+                ToggleableState.Off -> 0f
+                ToggleableState.Indeterminate -> 1f
             }
         }
-    ) {
-        when (it) {
-            ToggleableState.On -> 0f
-            ToggleableState.Off -> 0f
-            ToggleableState.Indeterminate -> 1f
-        }
-    }
     val checkCache = remember { CheckDrawingCache() }
     val checkColor by colors.checkmarkColor(value)
     val boxColor by colors.boxColor(enabled, value)
@@ -379,9 +380,7 @@
         // TODO: replace with proper declarative non-android alternative when ready (b/158188351)
         pathMeasure.setPath(checkPath, false)
         pathToDraw.reset()
-        pathMeasure.getSegment(
-            0f, pathMeasure.length * checkFraction, pathToDraw, true
-        )
+        pathMeasure.getSegment(0f, pathMeasure.length * checkFraction, pathToDraw, true)
     }
     drawPath(drawingCache.pathToDraw, checkColor, style = stroke)
 }
@@ -393,9 +392,7 @@
     val pathToDraw: Path = Path()
 )
 
-/**
- * Default [CheckboxColors] implementation.
- */
+/** Default [CheckboxColors] implementation. */
 @Stable
 private class DefaultCheckboxColors(
     private val checkedCheckmarkColor: Color,
@@ -412,11 +409,12 @@
 ) : CheckboxColors {
     @Composable
     override fun checkmarkColor(state: ToggleableState): State<Color> {
-        val target = if (state == ToggleableState.Off) {
-            uncheckedCheckmarkColor
-        } else {
-            checkedCheckmarkColor
-        }
+        val target =
+            if (state == ToggleableState.Off) {
+                uncheckedCheckmarkColor
+            } else {
+                checkedCheckmarkColor
+            }
 
         val duration = if (state == ToggleableState.Off) BoxOutDuration else BoxInDuration
         return animateColorAsState(target, tween(durationMillis = duration))
@@ -424,18 +422,20 @@
 
     @Composable
     override fun boxColor(enabled: Boolean, state: ToggleableState): State<Color> {
-        val target = if (enabled) {
-            when (state) {
-                ToggleableState.On, ToggleableState.Indeterminate -> checkedBoxColor
-                ToggleableState.Off -> uncheckedBoxColor
+        val target =
+            if (enabled) {
+                when (state) {
+                    ToggleableState.On,
+                    ToggleableState.Indeterminate -> checkedBoxColor
+                    ToggleableState.Off -> uncheckedBoxColor
+                }
+            } else {
+                when (state) {
+                    ToggleableState.On -> disabledCheckedBoxColor
+                    ToggleableState.Indeterminate -> disabledIndeterminateBoxColor
+                    ToggleableState.Off -> disabledUncheckedBoxColor
+                }
             }
-        } else {
-            when (state) {
-                ToggleableState.On -> disabledCheckedBoxColor
-                ToggleableState.Indeterminate -> disabledIndeterminateBoxColor
-                ToggleableState.Off -> disabledUncheckedBoxColor
-            }
-        }
 
         // If not enabled 'snap' to the disabled state, as there should be no animations between
         // enabled / disabled.
@@ -449,17 +449,20 @@
 
     @Composable
     override fun borderColor(enabled: Boolean, state: ToggleableState): State<Color> {
-        val target = if (enabled) {
-            when (state) {
-                ToggleableState.On, ToggleableState.Indeterminate -> checkedBorderColor
-                ToggleableState.Off -> uncheckedBorderColor
+        val target =
+            if (enabled) {
+                when (state) {
+                    ToggleableState.On,
+                    ToggleableState.Indeterminate -> checkedBorderColor
+                    ToggleableState.Off -> uncheckedBorderColor
+                }
+            } else {
+                when (state) {
+                    ToggleableState.Indeterminate -> disabledIndeterminateBorderColor
+                    ToggleableState.On,
+                    ToggleableState.Off -> disabledBorderColor
+                }
             }
-        } else {
-            when (state) {
-                ToggleableState.Indeterminate -> disabledIndeterminateBorderColor
-                ToggleableState.On, ToggleableState.Off -> disabledBorderColor
-            }
-        }
 
         // If not enabled 'snap' to the disabled state, as there should be no animations between
         // enabled / disabled.
diff --git a/compose/material/material/src/commonMain/kotlin/androidx/compose/material/Chip.kt b/compose/material/material/src/commonMain/kotlin/androidx/compose/material/Chip.kt
index e871413..daf72ea 100644
--- a/compose/material/material/src/commonMain/kotlin/androidx/compose/material/Chip.kt
+++ b/compose/material/material/src/commonMain/kotlin/androidx/compose/material/Chip.kt
@@ -60,27 +60,30 @@
  *
  * @sample androidx.compose.material.samples.ChipSample
  *
- * You can create an [outlined action chip](https://material.io/components/chips#action-chips)
- * using [ChipDefaults.outlinedChipColors] and [ChipDefaults.outlinedBorder]
+ * You can create an [outlined action chip](https://material.io/components/chips#action-chips) using
+ * [ChipDefaults.outlinedChipColors] and [ChipDefaults.outlinedBorder]
+ *
  * @sample androidx.compose.material.samples.OutlinedChipWithIconSample
  *
  * Action chips should appear in a set and can be horizontally scrollable
+ *
  * @sample androidx.compose.material.samples.ChipGroupSingleLineSample
  *
  * Alternatively, use [androidx.compose.foundation.layout.FlowRow] to wrap chips to a new line.
+ *
  * @sample androidx.compose.material.samples.ChipGroupReflowSample
  *
  * @param onClick called when the chip is clicked.
  * @param modifier Modifier to be applied to the chip
  * @param enabled When disabled, chip will not respond to user input. It will also appear visually
- * disabled and disabled to accessibility services.
+ *   disabled and disabled to accessibility services.
  * @param interactionSource an optional hoisted [MutableInteractionSource] for observing and
- * emitting [Interaction]s for this chip. You can use this to change the chip's
- * appearance or preview the chip in different states. Note that if `null` is provided,
- * interactions will still happen internally.
+ *   emitting [Interaction]s for this chip. You can use this to change the chip's appearance or
+ *   preview the chip in different states. Note that if `null` is provided, interactions will still
+ *   happen internally.
  * @param border Border to draw around the chip. Pass `null` here for no border.
- * @param colors [ChipColors] that will be used to resolve the background and content color for
- * this chip in different states. See [ChipDefaults.chipColors].
+ * @param colors [ChipColors] that will be used to resolve the background and content color for this
+ *   chip in different states. See [ChipDefaults.chipColors].
  * @param leadingIcon Optional icon at the start of the chip, preceding the content text.
  * @param content the content of this chip
  */
@@ -109,18 +112,14 @@
         interactionSource = interactionSource,
     ) {
         CompositionLocalProvider(LocalContentAlpha provides contentColor.alpha) {
-            ProvideTextStyle(
-                value = MaterialTheme.typography.body2
-            ) {
+            ProvideTextStyle(value = MaterialTheme.typography.body2) {
                 Row(
-                    Modifier
-                        .defaultMinSize(
-                            minHeight = ChipDefaults.MinHeight
-                        )
+                    Modifier.defaultMinSize(minHeight = ChipDefaults.MinHeight)
                         .padding(
-                            start = if (leadingIcon == null) {
-                                HorizontalPadding
-                            } else 0.dp,
+                            start =
+                                if (leadingIcon == null) {
+                                    HorizontalPadding
+                                } else 0.dp,
                             end = HorizontalPadding,
                         ),
                     horizontalArrangement = Arrangement.Start,
@@ -147,37 +146,39 @@
  * <a href="https://material.io/components/chips#filter-chips" class="external"
  * target="_blank">Material Design filter chip</a>.
  *
- * Filter chips use tags or descriptive words to filter a collection.
- * They are a good alternative to toggle buttons or checkboxes.
+ * Filter chips use tags or descriptive words to filter a collection. They are a good alternative to
+ * toggle buttons or checkboxes.
  *
  * @sample androidx.compose.material.samples.FilterChipSample
  *
  * A filter chip with leading icon and selected icon looks like:
+ *
  * @sample androidx.compose.material.samples.FilterChipWithLeadingIconSample
  *
- * You can create an [outlined filter chip](https://material.io/components/chips#action-chips)
- * using [ChipDefaults.outlinedFilterChipColors] and [ChipDefaults.outlinedBorder]
+ * You can create an [outlined filter chip](https://material.io/components/chips#action-chips) using
+ * [ChipDefaults.outlinedFilterChipColors] and [ChipDefaults.outlinedBorder]
+ *
  * @sample androidx.compose.material.samples.OutlinedFilterChipSample
-
+ *
  * @param selected boolean state for this chip: either it is selected or not
  * @param onClick will be called when the user clicks the chip
  * @param modifier Modifier to be applied to the chip
- * @param enabled controls the enabled state of the chip. When `false`, this chip will not
- * be clickable
+ * @param enabled controls the enabled state of the chip. When `false`, this chip will not be
+ *   clickable
  * @param interactionSource an optional hoisted [MutableInteractionSource] for observing and
- * emitting [Interaction]s for this chip. You can use this to change the chip's
- * appearance or preview the chip in different states. Note that if `null` is provided,
- * interactions will still happen internally.
+ *   emitting [Interaction]s for this chip. You can use this to change the chip's appearance or
+ *   preview the chip in different states. Note that if `null` is provided, interactions will still
+ *   happen internally.
  * @param shape defines the chip's shape as well as its shadow
  * @param border border to draw around the chip
  * @param colors [SelectableChipColors] that will be used to resolve the background and content
- * color for this chip in different states. See [ChipDefaults.filterChipColors].
+ *   color for this chip in different states. See [ChipDefaults.filterChipColors].
  * @param leadingIcon Optional icon at the start of the chip, preceding the content text.
  * @param selectedIcon Icon used to indicate a chip's selected state, it is commonly a
- * [Icons.Filled.Done]. By default, if a leading icon is also provided, the leading icon will be
- * obscured by a circle overlay and then the selected icon.
+ *   [Icons.Filled.Done]. By default, if a leading icon is also provided, the leading icon will be
+ *   obscured by a circle overlay and then the selected icon.
  * @param trailingIcon Optional icon at the end of the chip, following the content text. Filter
- * chips commonly do not display any trailing icon.
+ *   chips commonly do not display any trailing icon.
  * @param content the content of this chip
  */
 @ExperimentalMaterialApi
@@ -210,28 +211,23 @@
         border = border,
     ) {
         CompositionLocalProvider(LocalContentAlpha provides contentColor.value.alpha) {
-            ProvideTextStyle(
-                value = MaterialTheme.typography.body2
-            ) {
+            ProvideTextStyle(value = MaterialTheme.typography.body2) {
                 Row(
-                    Modifier
-                        .width(IntrinsicSize.Max)
-                        .defaultMinSize(
-                            minHeight = ChipDefaults.MinHeight
-                        )
+                    Modifier.width(IntrinsicSize.Max)
+                        .defaultMinSize(minHeight = ChipDefaults.MinHeight)
                         .padding(
                             start =
-                            if (leadingIcon != null || (selected && selectedIcon != null)) {
-                                0.dp
-                            } else {
-                                HorizontalPadding
-                            },
+                                if (leadingIcon != null || (selected && selectedIcon != null)) {
+                                    0.dp
+                                } else {
+                                    HorizontalPadding
+                                },
                             end =
-                            if (trailingIcon == null) {
-                                HorizontalPadding
-                            } else {
-                                0.dp
-                            }
+                                if (trailingIcon == null) {
+                                    HorizontalPadding
+                                } else {
+                                    0.dp
+                                }
                         ),
                     horizontalArrangement = Arrangement.Start,
                     verticalAlignment = Alignment.CenterVertically
@@ -240,10 +236,7 @@
                         Spacer(Modifier.width(LeadingIconStartSpacing))
                         Box {
                             if (leadingIcon != null) {
-                                val leadingIconColor = colors.leadingIconColor(
-                                    enabled,
-                                    selected
-                                )
+                                val leadingIconColor = colors.leadingIconColor(enabled, selected)
                                 CompositionLocalProvider(
                                     LocalContentColor provides leadingIconColor.value,
                                     LocalContentAlpha provides leadingIconColor.value.alpha,
@@ -254,12 +247,13 @@
                                 var overlayModifier: Modifier = Modifier
                                 var iconColor = contentColor.value
                                 if (leadingIcon != null) {
-                                    overlayModifier = Modifier
-                                        .requiredSize(SelectedIconContainerSize)
-                                        .background(
-                                            color = contentColor.value,
-                                            shape = CircleShape
-                                        ).clip(CircleShape)
+                                    overlayModifier =
+                                        Modifier.requiredSize(SelectedIconContainerSize)
+                                            .background(
+                                                color = contentColor.value,
+                                                shape = CircleShape
+                                            )
+                                            .clip(CircleShape)
 
                                     iconColor = colors.backgroundColor(enabled, selected).value
                                 }
@@ -296,8 +290,8 @@
 /**
  * Represents the background and content colors used in a clickable chip in different states.
  *
- * See [ChipDefaults.chipColors] for the default colors used in a filled [Chip].
- * See [ChipDefaults.outlinedChipColors] for the default colors used in a outlined [Chip],
+ * See [ChipDefaults.chipColors] for the default colors used in a filled [Chip]. See
+ * [ChipDefaults.outlinedChipColors] for the default colors used in a outlined [Chip],
  */
 @Stable
 @ExperimentalMaterialApi
@@ -307,33 +301,30 @@
      *
      * @param enabled whether the chip is enabled
      */
-    @Composable
-    fun backgroundColor(enabled: Boolean): State<Color>
+    @Composable fun backgroundColor(enabled: Boolean): State<Color>
 
     /**
-     * Represents the content color for this chip, depending on [enabled], see [leadingIconContentColor].
+     * Represents the content color for this chip, depending on [enabled], see
+     * [leadingIconContentColor].
      *
      * @param enabled whether the chip is enabled
      */
-    @Composable
-    fun contentColor(enabled: Boolean): State<Color>
+    @Composable fun contentColor(enabled: Boolean): State<Color>
 
     /**
      * Represents the leading icon's content color for this chip, depending on [enabled].
      *
      * @param enabled whether the chip is enabled
      */
-    @Composable
-    fun leadingIconContentColor(enabled: Boolean): State<Color>
+    @Composable fun leadingIconContentColor(enabled: Boolean): State<Color>
 }
 
 // TODO(b/182821022): Add links choice and input chip colors.
 /**
  * Represents the background and content colors used in a selectable chip in different states.
- * [FilterChip], choice chip and input chip are types of selectable chips.
- * See [ChipDefaults.filterChipColors] for the default colors used in a filled [FilterChip].
- * See [ChipDefaults.outlinedFilterChipColors] for the default colors used in a outlined
- * [FilterChip].
+ * [FilterChip], choice chip and input chip are types of selectable chips. See
+ * [ChipDefaults.filterChipColors] for the default colors used in a filled [FilterChip]. See
+ * [ChipDefaults.outlinedFilterChipColors] for the default colors used in a outlined [FilterChip].
  */
 @ExperimentalMaterialApi
 interface SelectableChipColors {
@@ -343,8 +334,7 @@
      * @param enabled whether the chip is enabled
      * @param selected whether the chip is selected
      */
-    @Composable
-    fun backgroundColor(enabled: Boolean, selected: Boolean): State<Color>
+    @Composable fun backgroundColor(enabled: Boolean, selected: Boolean): State<Color>
 
     /**
      * Represents the content color for this chip, depending on [enabled] and [selected].
@@ -352,8 +342,7 @@
      * @param enabled whether the chip is enabled
      * @param selected whether the chip is selected
      */
-    @Composable
-    fun contentColor(enabled: Boolean, selected: Boolean): State<Color>
+    @Composable fun contentColor(enabled: Boolean, selected: Boolean): State<Color>
 
     /**
      * Represents the leading icon color for this chip, depending on [enabled] and [selected].
@@ -361,28 +350,25 @@
      * @param enabled whether the chip is enabled
      * @param selected whether the chip is selected
      */
-    @Composable
-    fun leadingIconColor(enabled: Boolean, selected: Boolean): State<Color>
+    @Composable fun leadingIconColor(enabled: Boolean, selected: Boolean): State<Color>
 }
 
-/**
- * Contains the baseline values used by chips.
- */
+/** Contains the baseline values used by chips. */
 @ExperimentalMaterialApi
 object ChipDefaults {
     /**
-     * The min height applied for a chip.
-     * Note that you can override it by applying Modifier.height directly on a chip.
+     * The min height applied for a chip. Note that you can override it by applying Modifier.height
+     * directly on a chip.
      */
     val MinHeight = 32.dp
 
     /**
-     * Creates a [ChipColors] that represents the default background and content colors used in
-     * a filled [Chip].
+     * Creates a [ChipColors] that represents the default background and content colors used in a
+     * filled [Chip].
      *
      * @param backgroundColor the background color of this chip when enabled
      * @param contentColor the content color of this chip when enabled, there is a separate param
-     * for icon colors
+     *   for icon colors
      * @param leadingIconContentColor the color of this chip's start icon when enabled
      * @param disabledBackgroundColor the background color of this chip when not enabled
      * @param disabledContentColor the content color of this chip when not enabled
@@ -390,39 +376,41 @@
      */
     @Composable
     fun chipColors(
-        backgroundColor: Color = MaterialTheme.colors.onSurface.copy(alpha = SurfaceOverlayOpacity)
-            .compositeOver(MaterialTheme.colors.surface),
+        backgroundColor: Color =
+            MaterialTheme.colors.onSurface
+                .copy(alpha = SurfaceOverlayOpacity)
+                .compositeOver(MaterialTheme.colors.surface),
         contentColor: Color = MaterialTheme.colors.onSurface.copy(alpha = ContentOpacity),
         leadingIconContentColor: Color = contentColor.copy(alpha = LeadingIconOpacity),
         disabledBackgroundColor: Color =
-            MaterialTheme.colors.onSurface.copy(
-                alpha = ContentAlpha.disabled * SurfaceOverlayOpacity
-            ).compositeOver(MaterialTheme.colors.surface),
-        disabledContentColor: Color = contentColor.copy(
-            alpha = ContentAlpha.disabled * ContentOpacity
-        ),
+            MaterialTheme.colors.onSurface
+                .copy(alpha = ContentAlpha.disabled * SurfaceOverlayOpacity)
+                .compositeOver(MaterialTheme.colors.surface),
+        disabledContentColor: Color =
+            contentColor.copy(alpha = ContentAlpha.disabled * ContentOpacity),
         disabledLeadingIconContentColor: Color =
             leadingIconContentColor.copy(alpha = ContentAlpha.disabled * LeadingIconOpacity),
-    ): ChipColors = DefaultChipColors(
-        backgroundColor = backgroundColor,
-        contentColor = contentColor,
-        leadingIconContentColor = leadingIconContentColor,
-        disabledBackgroundColor = disabledBackgroundColor,
-        disabledContentColor = disabledContentColor,
-        disabledLeadingIconContentColor = disabledLeadingIconContentColor,
-    )
+    ): ChipColors =
+        DefaultChipColors(
+            backgroundColor = backgroundColor,
+            contentColor = contentColor,
+            leadingIconContentColor = leadingIconContentColor,
+            disabledBackgroundColor = disabledBackgroundColor,
+            disabledContentColor = disabledContentColor,
+            disabledLeadingIconContentColor = disabledLeadingIconContentColor,
+        )
 
     /**
-     * Creates a [ChipColors] that represents the default background and content colors used in
-     * an outlined [Chip].
+     * Creates a [ChipColors] that represents the default background and content colors used in an
+     * outlined [Chip].
      *
      * @param backgroundColor the background color of this chip when enabled
      * @param contentColor the content color of this chip when enabled, there is a separate param
-     * for icon colors
-     * @para leadingIconContentColor the color of this chip's start icon when enabled
+     *   for icon colors
      * @param disabledBackgroundColor the background color of this chip when not enabled
      * @param disabledContentColor the content color of this chip when not enabled
      * @param disabledLeadingIconContentColor the color of this chip's start icon when not enabled
+     * @para leadingIconContentColor the color of this chip's start icon when enabled
      */
     @Composable
     fun outlinedChipColors(
@@ -430,19 +418,19 @@
         contentColor: Color = MaterialTheme.colors.onSurface.copy(alpha = ContentOpacity),
         leadingIconContentColor: Color = contentColor.copy(alpha = LeadingIconOpacity),
         disabledBackgroundColor: Color = backgroundColor,
-        disabledContentColor: Color = contentColor.copy(
-            alpha = ContentAlpha.disabled * ContentOpacity
-        ),
+        disabledContentColor: Color =
+            contentColor.copy(alpha = ContentAlpha.disabled * ContentOpacity),
         disabledLeadingIconContentColor: Color =
             leadingIconContentColor.copy(alpha = ContentAlpha.disabled * LeadingIconOpacity),
-    ): ChipColors = chipColors(
-        backgroundColor = backgroundColor,
-        contentColor = contentColor,
-        leadingIconContentColor = leadingIconContentColor,
-        disabledBackgroundColor = disabledBackgroundColor,
-        disabledContentColor = disabledContentColor,
-        disabledLeadingIconContentColor = disabledLeadingIconContentColor
-    )
+    ): ChipColors =
+        chipColors(
+            backgroundColor = backgroundColor,
+            contentColor = contentColor,
+            leadingIconContentColor = leadingIconContentColor,
+            disabledBackgroundColor = disabledBackgroundColor,
+            disabledContentColor = disabledContentColor,
+            disabledLeadingIconContentColor = disabledLeadingIconContentColor
+        )
 
     /**
      * Creates a [SelectableChipColors] that represents the default background and content colors
@@ -460,44 +448,48 @@
      */
     @Composable
     fun filterChipColors(
-        backgroundColor: Color = MaterialTheme.colors.onSurface.copy(alpha = SurfaceOverlayOpacity)
-            .compositeOver(MaterialTheme.colors.surface),
+        backgroundColor: Color =
+            MaterialTheme.colors.onSurface
+                .copy(alpha = SurfaceOverlayOpacity)
+                .compositeOver(MaterialTheme.colors.surface),
         contentColor: Color = MaterialTheme.colors.onSurface.copy(alpha = ContentOpacity),
         leadingIconColor: Color = contentColor.copy(LeadingIconOpacity),
         disabledBackgroundColor: Color =
-            MaterialTheme.colors.onSurface.copy(
-                alpha = ContentAlpha.disabled * SurfaceOverlayOpacity
-            ).compositeOver(MaterialTheme.colors.surface),
-        disabledContentColor: Color = contentColor.copy(
-            alpha = ContentAlpha.disabled * ContentOpacity
-        ),
-        disabledLeadingIconColor: Color = leadingIconColor.copy(
-            alpha = ContentAlpha.disabled * LeadingIconOpacity
-        ),
-        selectedBackgroundColor: Color = MaterialTheme.colors.onSurface.copy(
-            alpha = SurfaceOverlayOpacity
-        ).compositeOver(backgroundColor),
-        selectedContentColor: Color = MaterialTheme.colors.onSurface.copy(
-            alpha = SelectedOverlayOpacity
-        ).compositeOver(contentColor),
-        selectedLeadingIconColor: Color = MaterialTheme.colors.onSurface.copy(
-            alpha = SelectedOverlayOpacity
-        ).compositeOver(leadingIconColor)
-    ): SelectableChipColors = DefaultSelectableChipColors(
-        backgroundColor = backgroundColor,
-        contentColor = contentColor,
-        leadingIconColor = leadingIconColor,
-        disabledBackgroundColor = disabledBackgroundColor,
-        disabledContentColor = disabledContentColor,
-        disabledLeadingIconColor = disabledLeadingIconColor,
-        selectedBackgroundColor = selectedBackgroundColor,
-        selectedContentColor = selectedContentColor,
-        selectedLeadingIconColor = selectedLeadingIconColor
-    )
+            MaterialTheme.colors.onSurface
+                .copy(alpha = ContentAlpha.disabled * SurfaceOverlayOpacity)
+                .compositeOver(MaterialTheme.colors.surface),
+        disabledContentColor: Color =
+            contentColor.copy(alpha = ContentAlpha.disabled * ContentOpacity),
+        disabledLeadingIconColor: Color =
+            leadingIconColor.copy(alpha = ContentAlpha.disabled * LeadingIconOpacity),
+        selectedBackgroundColor: Color =
+            MaterialTheme.colors.onSurface
+                .copy(alpha = SurfaceOverlayOpacity)
+                .compositeOver(backgroundColor),
+        selectedContentColor: Color =
+            MaterialTheme.colors.onSurface
+                .copy(alpha = SelectedOverlayOpacity)
+                .compositeOver(contentColor),
+        selectedLeadingIconColor: Color =
+            MaterialTheme.colors.onSurface
+                .copy(alpha = SelectedOverlayOpacity)
+                .compositeOver(leadingIconColor)
+    ): SelectableChipColors =
+        DefaultSelectableChipColors(
+            backgroundColor = backgroundColor,
+            contentColor = contentColor,
+            leadingIconColor = leadingIconColor,
+            disabledBackgroundColor = disabledBackgroundColor,
+            disabledContentColor = disabledContentColor,
+            disabledLeadingIconColor = disabledLeadingIconColor,
+            selectedBackgroundColor = selectedBackgroundColor,
+            selectedContentColor = selectedContentColor,
+            selectedLeadingIconColor = selectedLeadingIconColor
+        )
 
     /**
-     * Creates a [ChipColors] that represents the default background and content colors used in
-     * a selectable outlined [FilterChip].
+     * Creates a [ChipColors] that represents the default background and content colors used in a
+     * selectable outlined [FilterChip].
      *
      * @param backgroundColor the background color of this chip when enabled
      * @param contentColor the content color of this chip when enabled
@@ -515,76 +507,64 @@
         contentColor: Color = MaterialTheme.colors.onSurface.copy(ContentOpacity),
         leadingIconColor: Color = contentColor.copy(LeadingIconOpacity),
         disabledBackgroundColor: Color = backgroundColor,
-        disabledContentColor: Color = contentColor.copy(
-            alpha = ContentAlpha.disabled * ContentOpacity
-        ),
-        disabledLeadingIconColor: Color = leadingIconColor.copy(
-            alpha = ContentAlpha.disabled * LeadingIconOpacity
-        ),
-        selectedBackgroundColor: Color = MaterialTheme.colors.onSurface.copy(
-            alpha = SelectedOverlayOpacity
-        ).compositeOver(backgroundColor),
-        selectedContentColor: Color = MaterialTheme.colors.onSurface.copy(
-            alpha = SelectedOverlayOpacity
-        ).compositeOver(contentColor),
-        selectedLeadingIconColor: Color = MaterialTheme.colors.onSurface.copy(
-            alpha = SelectedOverlayOpacity
-        ).compositeOver(leadingIconColor)
-    ): SelectableChipColors = DefaultSelectableChipColors(
-        backgroundColor = backgroundColor,
-        contentColor = contentColor,
-        leadingIconColor = leadingIconColor,
-        disabledBackgroundColor = disabledBackgroundColor,
-        disabledContentColor = disabledContentColor,
-        disabledLeadingIconColor = disabledLeadingIconColor,
-        selectedBackgroundColor = selectedBackgroundColor,
-        selectedContentColor = selectedContentColor,
-        selectedLeadingIconColor = selectedLeadingIconColor
-    )
-
-    /**
-     * The border used by all types of outlined chips
-     */
-    val outlinedBorder: BorderStroke
-        @Composable
-        get() = BorderStroke(
-            OutlinedBorderSize, MaterialTheme.colors.onSurface.copy(alpha = OutlinedBorderOpacity)
+        disabledContentColor: Color =
+            contentColor.copy(alpha = ContentAlpha.disabled * ContentOpacity),
+        disabledLeadingIconColor: Color =
+            leadingIconColor.copy(alpha = ContentAlpha.disabled * LeadingIconOpacity),
+        selectedBackgroundColor: Color =
+            MaterialTheme.colors.onSurface
+                .copy(alpha = SelectedOverlayOpacity)
+                .compositeOver(backgroundColor),
+        selectedContentColor: Color =
+            MaterialTheme.colors.onSurface
+                .copy(alpha = SelectedOverlayOpacity)
+                .compositeOver(contentColor),
+        selectedLeadingIconColor: Color =
+            MaterialTheme.colors.onSurface
+                .copy(alpha = SelectedOverlayOpacity)
+                .compositeOver(leadingIconColor)
+    ): SelectableChipColors =
+        DefaultSelectableChipColors(
+            backgroundColor = backgroundColor,
+            contentColor = contentColor,
+            leadingIconColor = leadingIconColor,
+            disabledBackgroundColor = disabledBackgroundColor,
+            disabledContentColor = disabledContentColor,
+            disabledLeadingIconColor = disabledLeadingIconColor,
+            selectedBackgroundColor = selectedBackgroundColor,
+            selectedContentColor = selectedContentColor,
+            selectedLeadingIconColor = selectedLeadingIconColor
         )
 
-    /**
-     * The color opacity used for chip's leading icon color
-     */
+    /** The border used by all types of outlined chips */
+    val outlinedBorder: BorderStroke
+        @Composable
+        get() =
+            BorderStroke(
+                OutlinedBorderSize,
+                MaterialTheme.colors.onSurface.copy(alpha = OutlinedBorderOpacity)
+            )
+
+    /** The color opacity used for chip's leading icon color */
     const val LeadingIconOpacity = 0.54f
 
-    /**
-     * The color opacity used for chip's content color
-     */
+    /** The color opacity used for chip's content color */
     const val ContentOpacity = 0.87f
 
-    /**
-     * The color opacity used for the outlined chip's border color
-     */
+    /** The color opacity used for the outlined chip's border color */
     const val OutlinedBorderOpacity = 0.12f
 
-    /**
-     * The outlined chip's border size
-     */
+    /** The outlined chip's border size */
     val OutlinedBorderSize = 1.dp
 
-    /**
-     * The size of a chip's leading icon
-     */
+    /** The size of a chip's leading icon */
     val LeadingIconSize = 20.dp
 
-    /**
-     * The size of a standalone selected icon
-     */
+    /** The size of a standalone selected icon */
     val SelectedIconSize = 18.dp
 }
 
-/**
- * Default [ChipColors] implementation.
- */
+/** Default [ChipColors] implementation. */
 @ExperimentalMaterialApi
 @Immutable
 private class DefaultChipColors(
@@ -641,9 +621,7 @@
     }
 }
 
-/**
- * Default [SelectableChipColors] implementation.
- */
+/** Default [SelectableChipColors] implementation. */
 @ExperimentalMaterialApi
 @Immutable
 private class DefaultSelectableChipColors(
@@ -660,31 +638,34 @@
 ) : SelectableChipColors {
     @Composable
     override fun backgroundColor(enabled: Boolean, selected: Boolean): State<Color> {
-        val target = when {
-            !enabled -> disabledBackgroundColor
-            !selected -> backgroundColor
-            else -> selectedBackgroundColor
-        }
+        val target =
+            when {
+                !enabled -> disabledBackgroundColor
+                !selected -> backgroundColor
+                else -> selectedBackgroundColor
+            }
         return rememberUpdatedState(target)
     }
 
     @Composable
     override fun contentColor(enabled: Boolean, selected: Boolean): State<Color> {
-        val target = when {
-            !enabled -> disabledContentColor
-            !selected -> contentColor
-            else -> selectedContentColor
-        }
+        val target =
+            when {
+                !enabled -> disabledContentColor
+                !selected -> contentColor
+                else -> selectedContentColor
+            }
         return rememberUpdatedState(target)
     }
 
     @Composable
     override fun leadingIconColor(enabled: Boolean, selected: Boolean): State<Color> {
-        val target = when {
-            !enabled -> disabledLeadingIconColor
-            !selected -> leadingIconColor
-            else -> selectedLeadingIconColor
-        }
+        val target =
+            when {
+                !enabled -> disabledLeadingIconColor
+                !selected -> leadingIconColor
+                else -> selectedLeadingIconColor
+            }
         return rememberUpdatedState(target)
     }
 
@@ -723,35 +704,24 @@
 }
 
 /**
- * The content padding used by a chip.
- * Used as start padding when there's leading icon, used as eng padding when there's no
- * trailing icon.
+ * The content padding used by a chip. Used as start padding when there's leading icon, used as eng
+ * padding when there's no trailing icon.
  */
 private val HorizontalPadding = 12.dp
 
-/**
- * The size of the spacing before the leading icon when they used inside a chip.
- */
+/** The size of the spacing before the leading icon when they used inside a chip. */
 private val LeadingIconStartSpacing = 4.dp
 
-/**
- * The size of the spacing between the leading icon and a text inside a chip.
- */
+/** The size of the spacing between the leading icon and a text inside a chip. */
 private val LeadingIconEndSpacing = 8.dp
 
-/**
- * The size of the horizontal spacing before and after the trailing icon inside an InputChip.
- */
+/** The size of the horizontal spacing before and after the trailing icon inside an InputChip. */
 private val TrailingIconSpacing = 8.dp
 
-/**
- * The color opacity used for chip's surface overlay.
- */
+/** The color opacity used for chip's surface overlay. */
 private const val SurfaceOverlayOpacity = 0.12f
 
-/**
- * The color opacity used for a selected chip's leading icon overlay.
- */
+/** The color opacity used for a selected chip's leading icon overlay. */
 private const val SelectedOverlayOpacity = 0.16f
 
 /**
diff --git a/compose/material/material/src/commonMain/kotlin/androidx/compose/material/Colors.kt b/compose/material/material/src/commonMain/kotlin/androidx/compose/material/Colors.kt
index cd270e8..96aa440 100644
--- a/compose/material/material/src/commonMain/kotlin/androidx/compose/material/Colors.kt
+++ b/compose/material/material/src/commonMain/kotlin/androidx/compose/material/Colors.kt
@@ -28,31 +28,34 @@
 import androidx.compose.ui.graphics.takeOrElse
 
 /**
- * <a href="https://material.io/design/color/the-color-system.html" class="external" target="_blank">Material Design color system</a>.
+ * <a href="https://material.io/design/color/the-color-system.html" class="external"
+ * target="_blank">Material Design color system</a>.
  *
  * The Material Design color system can help you create a color theme that reflects your brand or
  * style.
  *
- * ![Color image](https://developer.android.com/images/reference/androidx/compose/material/color.png)
+ * ![Color
+ * image](https://developer.android.com/images/reference/androidx/compose/material/color.png)
  *
- * To create a light set of colors using the baseline values, use [lightColors]
- * To create a dark set of colors using the baseline values, use [darkColors]
+ * To create a light set of colors using the baseline values, use [lightColors] To create a dark set
+ * of colors using the baseline values, use [darkColors]
  *
  * @property primary The primary color is the color displayed most frequently across your app’s
- * screens and components.
- * @property primaryVariant The primary variant color is used to distinguish two elements of the
- * app using the primary color, such as the top app bar and the system bar.
+ *   screens and components.
+ * @property primaryVariant The primary variant color is used to distinguish two elements of the app
+ *   using the primary color, such as the top app bar and the system bar.
  * @property secondary The secondary color provides more ways to accent and distinguish your
- * product. Secondary colors are best for:
+ *   product. Secondary colors are best for:
  * - Floating action buttons
  * - Selection controls, like checkboxes and radio buttons
  * - Highlighting selected text
  * - Links and headlines
+ *
  * @property secondaryVariant The secondary variant color is used to distinguish two elements of the
- * app using the secondary color.
+ *   app using the secondary color.
  * @property background The background color appears behind scrollable content.
  * @property surface The surface color is used on surfaces of components, such as cards, sheets and
- * menus.
+ *   menus.
  * @property error The error color is used to indicate error within components, such as text fields.
  * @property onPrimary Color used for text and icons displayed on top of the primary color.
  * @property onSecondary Color used for text and icons displayed on top of the secondary color.
@@ -60,8 +63,8 @@
  * @property onSurface Color used for text and icons displayed on top of the surface color.
  * @property onError Color used for text and icons displayed on top of the error color.
  * @property isLight Whether this Colors is considered as a 'light' or 'dark' set of colors. This
- * affects default behavior for some components: for example, in a light theme a [TopAppBar] will
- * use [primary] by default for its background color, when in a dark theme it will use [surface].
+ *   affects default behavior for some components: for example, in a light theme a [TopAppBar] will
+ *   use [primary] by default for its background color, when in a dark theme it will use [surface].
  */
 @Stable
 class Colors(
@@ -81,34 +84,44 @@
 ) {
     var primary by mutableStateOf(primary, structuralEqualityPolicy())
         internal set
+
     var primaryVariant by mutableStateOf(primaryVariant, structuralEqualityPolicy())
         internal set
+
     var secondary by mutableStateOf(secondary, structuralEqualityPolicy())
         internal set
+
     var secondaryVariant by mutableStateOf(secondaryVariant, structuralEqualityPolicy())
         internal set
+
     var background by mutableStateOf(background, structuralEqualityPolicy())
         internal set
+
     var surface by mutableStateOf(surface, structuralEqualityPolicy())
         internal set
+
     var error by mutableStateOf(error, structuralEqualityPolicy())
         internal set
+
     var onPrimary by mutableStateOf(onPrimary, structuralEqualityPolicy())
         internal set
+
     var onSecondary by mutableStateOf(onSecondary, structuralEqualityPolicy())
         internal set
+
     var onBackground by mutableStateOf(onBackground, structuralEqualityPolicy())
         internal set
+
     var onSurface by mutableStateOf(onSurface, structuralEqualityPolicy())
         internal set
+
     var onError by mutableStateOf(onError, structuralEqualityPolicy())
         internal set
+
     var isLight by mutableStateOf(isLight, structuralEqualityPolicy())
         internal set
 
-    /**
-     * Returns a copy of this Colors, optionally overriding some of the values.
-     */
+    /** Returns a copy of this Colors, optionally overriding some of the values. */
     fun copy(
         primary: Color = this.primary,
         primaryVariant: Color = this.primaryVariant,
@@ -123,21 +136,22 @@
         onSurface: Color = this.onSurface,
         onError: Color = this.onError,
         isLight: Boolean = this.isLight
-    ): Colors = Colors(
-        primary,
-        primaryVariant,
-        secondary,
-        secondaryVariant,
-        background,
-        surface,
-        error,
-        onPrimary,
-        onSecondary,
-        onBackground,
-        onSurface,
-        onError,
-        isLight
-    )
+    ): Colors =
+        Colors(
+            primary,
+            primaryVariant,
+            secondary,
+            secondaryVariant,
+            background,
+            surface,
+            error,
+            onPrimary,
+            onSecondary,
+            onBackground,
+            onSurface,
+            onError,
+            isLight
+        )
 
     override fun toString(): String {
         return "Colors(" +
@@ -178,29 +192,30 @@
     onBackground: Color = Color.Black,
     onSurface: Color = Color.Black,
     onError: Color = Color.White
-): Colors = Colors(
-    primary,
-    primaryVariant,
-    secondary,
-    secondaryVariant,
-    background,
-    surface,
-    error,
-    onPrimary,
-    onSecondary,
-    onBackground,
-    onSurface,
-    onError,
-    true
-)
+): Colors =
+    Colors(
+        primary,
+        primaryVariant,
+        secondary,
+        secondaryVariant,
+        background,
+        surface,
+        error,
+        onPrimary,
+        onSecondary,
+        onBackground,
+        onSurface,
+        onError,
+        true
+    )
 
 /**
  * Creates a complete color definition for the
  * [Material color specification](https://material.io/design/color/the-color-system.html#color-theme-creation)
  * using the default dark theme values.
  *
- * Note: [secondaryVariant] is typically the same as [secondary] in dark theme since contrast
- * levels are higher, and hence there is less need for a separate secondary color.
+ * Note: [secondaryVariant] is typically the same as [secondary] in dark theme since contrast levels
+ * are higher, and hence there is less need for a separate secondary color.
  *
  * @see lightColors
  */
@@ -217,36 +232,38 @@
     onBackground: Color = Color.White,
     onSurface: Color = Color.White,
     onError: Color = Color.Black
-): Colors = Colors(
-    primary,
-    primaryVariant,
-    secondary,
-    secondaryVariant,
-    background,
-    surface,
-    error,
-    onPrimary,
-    onSecondary,
-    onBackground,
-    onSurface,
-    onError,
-    false
-)
+): Colors =
+    Colors(
+        primary,
+        primaryVariant,
+        secondary,
+        secondaryVariant,
+        background,
+        surface,
+        error,
+        onPrimary,
+        onSecondary,
+        onBackground,
+        onSurface,
+        onError,
+        false
+    )
 
 /**
- * primarySurface represents the background color of components that are [Colors.primary]
- * in light theme, and [Colors.surface] in dark theme, such as [androidx.compose.material.TabRow]
- * and [androidx.compose.material.TopAppBar]. This is to reduce brightness of large surfaces in dark
+ * primarySurface represents the background color of components that are [Colors.primary] in light
+ * theme, and [Colors.surface] in dark theme, such as [androidx.compose.material.TabRow] and
+ * [androidx.compose.material.TopAppBar]. This is to reduce brightness of large surfaces in dark
  * theme, aiding contrast and readability. See
  * [Dark Theme](https://material.io/design/color/dark-theme.html#custom-application).
  *
  * @return [Colors.primary] if in light theme, else [Colors.surface]
  */
-val Colors.primarySurface: Color get() = if (isLight) primary else surface
+val Colors.primarySurface: Color
+    get() = if (isLight) primary else surface
 
 /**
- * The Material color system contains pairs of colors that are typically used for the background
- * and content color inside a component. For example, a [Button] typically uses `primary` for its
+ * The Material color system contains pairs of colors that are typically used for the background and
+ * content color inside a component. For example, a [Button] typically uses `primary` for its
  * background, and `onPrimary` for the color of its content (usually text or iconography).
  *
  * This function tries to match the provided [backgroundColor] to a 'background' color in this
@@ -257,8 +274,7 @@
  * [Color.Unspecified].
  *
  * @return the matching content color for [backgroundColor]. If [backgroundColor] is not present in
- * the theme's [Colors], then returns [Color.Unspecified].
- *
+ *   the theme's [Colors], then returns [Color.Unspecified].
  * @see contentColorFor
  */
 fun Colors.contentColorFor(backgroundColor: Color): Color {
@@ -275,20 +291,19 @@
 }
 
 /**
- * The Material color system contains pairs of colors that are typically used for the background
- * and content color inside a component. For example, a [Button] typically uses `primary` for its
+ * The Material color system contains pairs of colors that are typically used for the background and
+ * content color inside a component. For example, a [Button] typically uses `primary` for its
  * background, and `onPrimary` for the color of its content (usually text or iconography).
  *
  * This function tries to match the provided [backgroundColor] to a 'background' color in this
  * [Colors], and then will return the corresponding color used for content. For example, when
  * [backgroundColor] is [Colors.primary], this will return [Colors.onPrimary].
  *
- * If [backgroundColor] does not match a background color in the theme, this will return
- * the current value of [LocalContentColor] as a best-effort color.
+ * If [backgroundColor] does not match a background color in the theme, this will return the current
+ * value of [LocalContentColor] as a best-effort color.
  *
  * @return the matching content color for [backgroundColor]. If [backgroundColor] is not present in
- * the theme's [Colors], then returns the current value of [LocalContentColor].
- *
+ *   the theme's [Colors], then returns the current value of [LocalContentColor].
  * @see Colors.contentColorFor
  */
 @Composable
@@ -301,13 +316,13 @@
  * allows efficiently updating a subset of [Colors], without recomposing every composable that
  * consumes values from [LocalColors].
  *
- * Because [Colors] is very wide-reaching, and used by many expensive composables in the
- * hierarchy, providing a new value to [LocalColors] causes every composable consuming
- * [LocalColors] to recompose, which is prohibitively expensive in cases such as animating one
- * color in the theme. Instead, [Colors] is internally backed by [mutableStateOf], and this
- * function mutates the internal state of [this] to match values in [other]. This means that any
- * changes will mutate the internal state of [this], and only cause composables that are reading
- * the specific changed value to recompose.
+ * Because [Colors] is very wide-reaching, and used by many expensive composables in the hierarchy,
+ * providing a new value to [LocalColors] causes every composable consuming [LocalColors] to
+ * recompose, which is prohibitively expensive in cases such as animating one color in the theme.
+ * Instead, [Colors] is internally backed by [mutableStateOf], and this function mutates the
+ * internal state of [this] to match values in [other]. This means that any changes will mutate the
+ * internal state of [this], and only cause composables that are reading the specific changed value
+ * to recompose.
  */
 internal fun Colors.updateColorsFrom(other: Colors) {
     primary = other.primary
@@ -328,9 +343,9 @@
 /**
  * CompositionLocal used to pass [Colors] down the tree.
  *
- * Setting the value here is typically done as part of [MaterialTheme], which will
- * automatically handle efficiently updating any changed colors without causing unnecessary
- * recompositions, using [Colors.updateColorsFrom].
- * To retrieve the current value of this CompositionLocal, use [MaterialTheme.colors].
+ * Setting the value here is typically done as part of [MaterialTheme], which will automatically
+ * handle efficiently updating any changed colors without causing unnecessary recompositions, using
+ * [Colors.updateColorsFrom]. To retrieve the current value of this CompositionLocal, use
+ * [MaterialTheme.colors].
  */
 internal val LocalColors = staticCompositionLocalOf { lightColors() }
diff --git a/compose/material/material/src/commonMain/kotlin/androidx/compose/material/ContentAlpha.kt b/compose/material/material/src/commonMain/kotlin/androidx/compose/material/ContentAlpha.kt
index a3091b1..a7b0a06 100644
--- a/compose/material/material/src/commonMain/kotlin/androidx/compose/material/ContentAlpha.kt
+++ b/compose/material/material/src/commonMain/kotlin/androidx/compose/material/ContentAlpha.kt
@@ -33,21 +33,23 @@
      */
     val high: Float
         @Composable
-        get() = contentAlpha(
-            highContrastAlpha = HighContrastContentAlpha.high,
-            lowContrastAlpha = LowContrastContentAlpha.high
-        )
+        get() =
+            contentAlpha(
+                highContrastAlpha = HighContrastContentAlpha.high,
+                lowContrastAlpha = LowContrastContentAlpha.high
+            )
 
     /**
-     * A medium level of content alpha, used to represent medium emphasis text such as
-     * placeholder text in a [TextField].
+     * A medium level of content alpha, used to represent medium emphasis text such as placeholder
+     * text in a [TextField].
      */
     val medium: Float
         @Composable
-        get() = contentAlpha(
-            highContrastAlpha = HighContrastContentAlpha.medium,
-            lowContrastAlpha = LowContrastContentAlpha.medium
-        )
+        get() =
+            contentAlpha(
+                highContrastAlpha = HighContrastContentAlpha.medium,
+                lowContrastAlpha = LowContrastContentAlpha.medium
+            )
 
     /**
      * A low level of content alpha used to represent disabled components, such as text in a
@@ -55,25 +57,24 @@
      */
     val disabled: Float
         @Composable
-        get() = contentAlpha(
-            highContrastAlpha = HighContrastContentAlpha.disabled,
-            lowContrastAlpha = LowContrastContentAlpha.disabled
-        )
+        get() =
+            contentAlpha(
+                highContrastAlpha = HighContrastContentAlpha.disabled,
+                lowContrastAlpha = LowContrastContentAlpha.disabled
+            )
 
     /**
      * This default implementation uses separate alpha levels depending on the luminance of the
      * incoming color, and whether the theme is light or dark. This is to ensure correct contrast
      * and accessibility on all surfaces.
      *
-     * See [HighContrastContentAlpha] and [LowContrastContentAlpha] for what the levels are
-     * used for, and under what circumstances.
+     * See [HighContrastContentAlpha] and [LowContrastContentAlpha] for what the levels are used
+     * for, and under what circumstances.
      */
     @Composable
     private fun contentAlpha(
-        @FloatRange(from = 0.0, to = 1.0)
-        highContrastAlpha: Float,
-        @FloatRange(from = 0.0, to = 1.0)
-        lowContrastAlpha: Float
+        @FloatRange(from = 0.0, to = 1.0) highContrastAlpha: Float,
+        @FloatRange(from = 0.0, to = 1.0) lowContrastAlpha: Float
     ): Float {
         val contentColor = LocalContentColor.current
         val lightTheme = MaterialTheme.colors.isLight
@@ -104,11 +105,11 @@
 /**
  * Alpha levels for high luminance content in light theme, or low luminance content in dark theme.
  *
- * This content will typically be placed on colored surfaces, so it is important that the
- * contrast here is higher to meet accessibility standards, and increase legibility.
+ * This content will typically be placed on colored surfaces, so it is important that the contrast
+ * here is higher to meet accessibility standards, and increase legibility.
  *
- * These levels are typically used for text / iconography in primary colored tabs /
- * bottom navigation / etc.
+ * These levels are typically used for text / iconography in primary colored tabs / bottom
+ * navigation / etc.
  */
 private object HighContrastContentAlpha {
     const val high: Float = 1.00f
@@ -122,8 +123,8 @@
  * This content will typically be placed on grayscale surfaces, so the contrast here can be lower
  * without sacrificing accessibility and legibility.
  *
- * These levels are typically used for body text on the main surface (white in light theme, grey
- * in dark theme) and text / iconography in surface colored tabs / bottom navigation / etc.
+ * These levels are typically used for body text on the main surface (white in light theme, grey in
+ * dark theme) and text / iconography in surface colored tabs / bottom navigation / etc.
  */
 private object LowContrastContentAlpha {
     const val high: Float = 0.87f
diff --git a/compose/material/material/src/commonMain/kotlin/androidx/compose/material/Divider.kt b/compose/material/material/src/commonMain/kotlin/androidx/compose/material/Divider.kt
index 53b3b31..ab83ea2 100644
--- a/compose/material/material/src/commonMain/kotlin/androidx/compose/material/Divider.kt
+++ b/compose/material/material/src/commonMain/kotlin/androidx/compose/material/Divider.kt
@@ -29,15 +29,17 @@
 import androidx.compose.ui.unit.dp
 
 /**
- * <a href="https://material.io/components/dividers" class="external" target="_blank">Material Design divider</a>.
+ * <a href="https://material.io/components/dividers" class="external" target="_blank">Material
+ * Design divider</a>.
  *
  * A divider is a thin line that groups content in lists and layouts.
  *
- * ![Dividers image](https://developer.android.com/images/reference/androidx/compose/material/dividers.png)
+ * ![Dividers
+ * image](https://developer.android.com/images/reference/androidx/compose/material/dividers.png)
  *
  * @param color color of the divider line
- * @param thickness thickness of the divider line, 1 dp is used by default. Using [Dp.Hairline]
- * will produce a single pixel divider regardless of screen density.
+ * @param thickness thickness of the divider line, 1 dp is used by default. Using [Dp.Hairline] will
+ *   produce a single pixel divider regardless of screen density.
  * @param startIndent start offset of this line, no offset by default
  */
 @Composable
@@ -47,22 +49,19 @@
     thickness: Dp = 1.dp,
     startIndent: Dp = 0.dp
 ) {
-    val indentMod = if (startIndent.value != 0f) {
-        Modifier.padding(start = startIndent)
-    } else {
-        Modifier
-    }
-    val targetThickness = if (thickness == Dp.Hairline) {
-        (1f / LocalDensity.current.density).dp
-    } else {
-        thickness
-    }
-    Box(
-        modifier.then(indentMod)
-            .fillMaxWidth()
-            .height(targetThickness)
-            .background(color = color)
-    )
+    val indentMod =
+        if (startIndent.value != 0f) {
+            Modifier.padding(start = startIndent)
+        } else {
+            Modifier
+        }
+    val targetThickness =
+        if (thickness == Dp.Hairline) {
+            (1f / LocalDensity.current.density).dp
+        } else {
+            thickness
+        }
+    Box(modifier.then(indentMod).fillMaxWidth().height(targetThickness).background(color = color))
 }
 
 private const val DividerAlpha = 0.12f
diff --git a/compose/material/material/src/commonMain/kotlin/androidx/compose/material/DragGestureDetectorCopy.kt b/compose/material/material/src/commonMain/kotlin/androidx/compose/material/DragGestureDetectorCopy.kt
index e00ecc0..3685bce 100644
--- a/compose/material/material/src/commonMain/kotlin/androidx/compose/material/DragGestureDetectorCopy.kt
+++ b/compose/material/material/src/commonMain/kotlin/androidx/compose/material/DragGestureDetectorCopy.kt
@@ -37,12 +37,13 @@
     pointerId: PointerId,
     pointerType: PointerType,
     onPointerSlopReached: (change: PointerInputChange, overSlop: Float) -> Unit
-) = awaitPointerSlopOrCancellation(
-    pointerId = pointerId,
-    pointerType = pointerType,
-    onPointerSlopReached = onPointerSlopReached,
-    getDragDirectionValue = { it.x }
-)
+) =
+    awaitPointerSlopOrCancellation(
+        pointerId = pointerId,
+        pointerType = pointerType,
+        onPointerSlopReached = onPointerSlopReached,
+        getDragDirectionValue = { it.x }
+    )
 
 private suspend inline fun AwaitPointerEventScope.awaitPointerSlopOrCancellation(
     pointerId: PointerId,
@@ -73,8 +74,8 @@
         } else {
             val currentPosition = dragEvent.position
             val previousPosition = dragEvent.previousPosition
-            val positionChange = getDragDirectionValue(currentPosition) -
-                getDragDirectionValue(previousPosition)
+            val positionChange =
+                getDragDirectionValue(currentPosition) - getDragDirectionValue(previousPosition)
             totalPositionChange += positionChange
 
             val inDirection = abs(totalPositionChange)
diff --git a/compose/material/material/src/commonMain/kotlin/androidx/compose/material/Drawer.kt b/compose/material/material/src/commonMain/kotlin/androidx/compose/material/Drawer.kt
index c7e699b..eda49d5f 100644
--- a/compose/material/material/src/commonMain/kotlin/androidx/compose/material/Drawer.kt
+++ b/compose/material/material/src/commonMain/kotlin/androidx/compose/material/Drawer.kt
@@ -73,38 +73,24 @@
 import kotlinx.coroutines.CancellationException
 import kotlinx.coroutines.launch
 
-/**
- * Possible values of [DrawerState].
- */
+/** Possible values of [DrawerState]. */
 enum class DrawerValue {
-    /**
-     * The state of the drawer when it is closed.
-     */
+    /** The state of the drawer when it is closed. */
     Closed,
 
-    /**
-     * The state of the drawer when it is open.
-     */
+    /** The state of the drawer when it is open. */
     Open
 }
 
-/**
- * Possible values of [BottomDrawerState].
- */
+/** Possible values of [BottomDrawerState]. */
 enum class BottomDrawerValue {
-    /**
-     * The state of the bottom drawer when it is closed.
-     */
+    /** The state of the bottom drawer when it is closed. */
     Closed,
 
-    /**
-     * The state of the bottom drawer when it is open (i.e. at 50% height).
-     */
+    /** The state of the bottom drawer when it is open (i.e. at 50% height). */
     Open,
 
-    /**
-     * The state of the bottom drawer when it is expanded (i.e. at 100% height).
-     */
+    /** The state of the bottom drawer when it is expanded (i.e. at 100% height). */
     Expanded
 }
 
@@ -122,41 +108,36 @@
     confirmStateChange: (DrawerValue) -> Boolean = { true }
 ) {
 
-    internal val anchoredDraggableState = AnchoredDraggableState(
-        initialValue = initialValue,
-        animationSpec = AnimationSpec,
-        confirmValueChange = confirmStateChange,
-        positionalThreshold = { with(requireDensity()) { DrawerPositionalThreshold.toPx() } },
-        velocityThreshold = { with(requireDensity()) { DrawerVelocityThreshold.toPx() } },
-    )
+    internal val anchoredDraggableState =
+        AnchoredDraggableState(
+            initialValue = initialValue,
+            animationSpec = AnimationSpec,
+            confirmValueChange = confirmStateChange,
+            positionalThreshold = { with(requireDensity()) { DrawerPositionalThreshold.toPx() } },
+            velocityThreshold = { with(requireDensity()) { DrawerVelocityThreshold.toPx() } },
+        )
 
-    /**
-     * Whether the drawer is open.
-     */
+    /** Whether the drawer is open. */
     val isOpen: Boolean
         get() = currentValue == DrawerValue.Open
 
-    /**
-     * Whether the drawer is closed.
-     */
+    /** Whether the drawer is closed. */
     val isClosed: Boolean
         get() = currentValue == DrawerValue.Closed
 
     /**
      * The current value of the state.
      *
-     * If no swipe or animation is in progress, this corresponds to the start the drawer
-     * currently in. If a swipe or an animation is in progress, this corresponds the state drawer
-     * was in before the swipe or animation started.
+     * If no swipe or animation is in progress, this corresponds to the start the drawer currently
+     * in. If a swipe or an animation is in progress, this corresponds the state drawer was in
+     * before the swipe or animation started.
      */
     val currentValue: DrawerValue
         get() {
             return anchoredDraggableState.currentValue
         }
 
-    /**
-     * Whether the state is currently animating.
-     */
+    /** Whether the state is currently animating. */
     val isAnimationRunning: Boolean
         get() {
             return anchoredDraggableState.isAnimationRunning
@@ -164,8 +145,7 @@
 
     /**
      * Open the drawer with animation and suspend until it if fully opened or animation has been
-     * cancelled. This method will throw [CancellationException] if the animation is
-     * interrupted
+     * cancelled. This method will throw [CancellationException] if the animation is interrupted
      *
      * @return the reason the open animation ended
      */
@@ -173,8 +153,7 @@
 
     /**
      * Close the drawer with animation and suspend until it if fully closed or animation has been
-     * cancelled. This method will throw [CancellationException] if the animation is
-     * interrupted
+     * cancelled. This method will throw [CancellationException] if the animation is interrupted
      *
      * @return the reason the close animation ended
      */
@@ -188,8 +167,9 @@
      */
     @ExperimentalMaterialApi
     @Deprecated(
-        message = "This method has been replaced by the open and close methods. The animation " +
-            "spec is now an implementation detail of ModalDrawer.",
+        message =
+            "This method has been replaced by the open and close methods. The animation " +
+                "spec is now an implementation detail of ModalDrawer.",
         level = DeprecationLevel.ERROR
     )
     suspend fun animateTo(
@@ -211,9 +191,9 @@
     /**
      * The target value of the drawer state.
      *
-     * If a swipe is in progress, this is the value that the Drawer would animate to if the
-     * swipe finishes. If an animation is running, this is the target value of that animation.
-     * Finally, if no swipe or animation is in progress, this is the same as the [currentValue].
+     * If a swipe is in progress, this is the value that the Drawer would animate to if the swipe
+     * finishes. If an animation is running, this is the target value of that animation. Finally, if
+     * no swipe or animation is in progress, this is the same as the [currentValue].
      */
     @Suppress("OPT_IN_MARKER_ON_WRONG_TARGET")
     @ExperimentalMaterialApi
@@ -224,6 +204,7 @@
     /**
      * The current position (in pixels) of the drawer sheet, or [Float.NaN] before the offset is
      * initialized.
+     *
      * @see [AnchoredDraggableState.offset] for more information.
      */
     @Suppress("OPT_IN_MARKER_ON_WRONG_TARGET")
@@ -235,15 +216,15 @@
     internal fun requireOffset(): Float = anchoredDraggableState.requireOffset()
 
     internal var density: Density? = null
-    private fun requireDensity() = requireNotNull(density) {
-        "The density on DrawerState ($this) was not set. Did you use DrawerState with the Drawer " +
-            "composable?"
-    }
+
+    private fun requireDensity() =
+        requireNotNull(density) {
+            "The density on DrawerState ($this) was not set. Did you use DrawerState with the Drawer " +
+                "composable?"
+        }
 
     companion object {
-        /**
-         * The default [Saver] implementation for [DrawerState].
-         */
+        /** The default [Saver] implementation for [DrawerState]. */
         fun Saver(confirmStateChange: (DrawerValue) -> Boolean) =
             Saver<DrawerState, DrawerValue>(
                 save = { it.currentValue },
@@ -258,8 +239,8 @@
  * @param initialValue The initial value of the state.
  * @param density The density that this state can use to convert values to and from dp.
  * @param confirmStateChange Optional callback invoked to confirm or veto a pending state change.
- * @param animationSpec The animation spec to be used for open/close animations, as well as
- * settling when a user lets go.
+ * @param animationSpec The animation spec to be used for open/close animations, as well as settling
+ *   when a user lets go.
  */
 @OptIn(ExperimentalMaterialApi::class)
 @Suppress("NotCloseable")
@@ -269,13 +250,14 @@
     confirmStateChange: (BottomDrawerValue) -> Boolean = { true },
     animationSpec: AnimationSpec<Float> = DrawerDefaults.AnimationSpec
 ) {
-    internal val anchoredDraggableState = AnchoredDraggableState(
-        initialValue = initialValue,
-        animationSpec = animationSpec,
-        confirmValueChange = confirmStateChange,
-        positionalThreshold = { with(density) { DrawerPositionalThreshold.toPx() } },
-        velocityThreshold = { with(density) { DrawerVelocityThreshold.toPx() } },
-    )
+    internal val anchoredDraggableState =
+        AnchoredDraggableState(
+            initialValue = initialValue,
+            animationSpec = animationSpec,
+            confirmValueChange = confirmStateChange,
+            positionalThreshold = { with(density) { DrawerPositionalThreshold.toPx() } },
+            velocityThreshold = { with(density) { DrawerVelocityThreshold.toPx() } },
+        )
 
     /**
      * The target value the state will settle at once the current interaction ends, or the
@@ -284,34 +266,25 @@
     val targetValue: BottomDrawerValue
         get() = anchoredDraggableState.targetValue
 
-    /**
-     * The current offset in pixels, or [Float.NaN] if it has not been initialized yet.
-     */
+    /** The current offset in pixels, or [Float.NaN] if it has not been initialized yet. */
     val offset: Float
         get() = anchoredDraggableState.offset
 
     internal fun requireOffset(): Float = anchoredDraggableState.requireOffset()
 
-    /**
-     * The current value of the [BottomDrawerState].
-     */
-    val currentValue: BottomDrawerValue get() = anchoredDraggableState.currentValue
+    /** The current value of the [BottomDrawerState]. */
+    val currentValue: BottomDrawerValue
+        get() = anchoredDraggableState.currentValue
 
-    /**
-     * Whether the drawer is open, either in opened or expanded state.
-     */
+    /** Whether the drawer is open, either in opened or expanded state. */
     val isOpen: Boolean
         get() = anchoredDraggableState.currentValue != Closed
 
-    /**
-     * Whether the drawer is closed.
-     */
+    /** Whether the drawer is closed. */
     val isClosed: Boolean
         get() = anchoredDraggableState.currentValue == Closed
 
-    /**
-     * Whether the drawer is expanded.
-     */
+    /** Whether the drawer is expanded. */
     val isExpanded: Boolean
         get() = anchoredDraggableState.currentValue == Expanded
 
@@ -336,16 +309,14 @@
      * @param to The end value used to calculate the distance
      */
     @FloatRange(from = 0.0, to = 1.0)
-    fun progress(
-        from: BottomDrawerValue,
-        to: BottomDrawerValue
-    ): Float {
+    fun progress(from: BottomDrawerValue, to: BottomDrawerValue): Float {
         val fromOffset = anchoredDraggableState.anchors.positionOf(from)
         val toOffset = anchoredDraggableState.anchors.positionOf(to)
-        val currentOffset = anchoredDraggableState.offset.coerceIn(
-            min(fromOffset, toOffset), // fromOffset might be > toOffset
-            max(fromOffset, toOffset)
-        )
+        val currentOffset =
+            anchoredDraggableState.offset.coerceIn(
+                min(fromOffset, toOffset), // fromOffset might be > toOffset
+                max(fromOffset, toOffset)
+            )
         val fraction = (currentOffset - fromOffset) / (toOffset - fromOffset)
         return if (fraction.isNaN()) 1f else abs(fraction)
     }
@@ -356,11 +327,9 @@
      * will move to [BottomDrawerValue.Expanded] instead.
      *
      * @throws [CancellationException] if the animation is interrupted
-     *
      */
     suspend fun open() {
-        val targetValue =
-            if (isOpenEnabled) Open else Expanded
+        val targetValue = if (isOpenEnabled) Open else Expanded
         anchoredDraggableState.animateTo(targetValue)
     }
 
@@ -369,16 +338,14 @@
      * cancelled.
      *
      * @throws [CancellationException] if the animation is interrupted
-     *
      */
     suspend fun close() = anchoredDraggableState.animateTo(Closed)
 
     /**
-     * Expand the drawer with animation and suspend until it if fully expanded or animation has
-     * been cancelled.
+     * Expand the drawer with animation and suspend until it if fully expanded or animation has been
+     * cancelled.
      *
      * @throws [CancellationException] if the animation is interrupted
-     *
      */
     suspend fun expand() = anchoredDraggableState.animateTo(Expanded)
 
@@ -395,21 +362,19 @@
     private val isOpenEnabled: Boolean
         get() = anchoredDraggableState.anchors.hasAnchorFor(Open)
 
-    internal val nestedScrollConnection = ConsumeSwipeWithinBottomSheetBoundsNestedScrollConnection(
-        anchoredDraggableState
-    )
+    internal val nestedScrollConnection =
+        ConsumeSwipeWithinBottomSheetBoundsNestedScrollConnection(anchoredDraggableState)
 
     internal var density: Density? = null
 
     companion object {
-        /**
-         * The default [Saver] implementation for [BottomDrawerState].
-         */
+        /** The default [Saver] implementation for [BottomDrawerState]. */
         fun Saver(
             density: Density,
             confirmStateChange: (BottomDrawerValue) -> Boolean,
             animationSpec: AnimationSpec<Float>
-        ) = Saver<BottomDrawerState, BottomDrawerValue>(
+        ) =
+            Saver<BottomDrawerState, BottomDrawerValue>(
                 save = { it.anchoredDraggableState.currentValue },
                 restore = { BottomDrawerState(it, density, confirmStateChange, animationSpec) }
             )
@@ -437,8 +402,8 @@
  *
  * @param initialValue The initial value of the state.
  * @param confirmStateChange Optional callback invoked to confirm or veto a pending state change.
- * @param animationSpec The animation spec to be used for open/close animations, as well as
- * settling when a user lets go.
+ * @param animationSpec The animation spec to be used for open/close animations, as well as settling
+ *   when a user lets go.
  */
 @Composable
 fun rememberBottomDrawerState(
@@ -456,15 +421,17 @@
 }
 
 /**
- * <a href="https://material.io/components/navigation-drawer#modal-drawer" class="external" target="_blank">Material Design modal navigation drawer</a>.
+ * <a href="https://material.io/components/navigation-drawer#modal-drawer" class="external"
+ * target="_blank">Material Design modal navigation drawer</a>.
  *
- * Modal navigation drawers block interaction with the rest of an app’s content with a scrim.
- * They are elevated above most of the app’s UI and don’t affect the screen’s layout grid.
+ * Modal navigation drawers block interaction with the rest of an app’s content with a scrim. They
+ * are elevated above most of the app’s UI and don’t affect the screen’s layout grid.
  *
- * ![Modal drawer image](https://developer.android.com/images/reference/androidx/compose/material/modal-drawer.png)
+ * ![Modal drawer
+ * image](https://developer.android.com/images/reference/androidx/compose/material/modal-drawer.png)
  *
- * See [BottomDrawer] for a layout that introduces a bottom drawer, suitable when
- * using bottom navigation.
+ * See [BottomDrawer] for a layout that introduces a bottom drawer, suitable when using bottom
+ * navigation.
  *
  * @sample androidx.compose.material.samples.ModalDrawerSample
  *
@@ -474,14 +441,13 @@
  * @param gesturesEnabled whether or not drawer can be interacted by gestures
  * @param drawerShape shape of the drawer sheet
  * @param drawerElevation drawer sheet elevation. This controls the size of the shadow below the
- * drawer sheet
+ *   drawer sheet
  * @param drawerBackgroundColor background color to be used for the drawer sheet
- * @param drawerContentColor color of the content to use inside the drawer sheet. Defaults to
- * either the matching content color for [drawerBackgroundColor], or, if it is not a color from
- * the theme, this will keep the same value set above this Surface.
+ * @param drawerContentColor color of the content to use inside the drawer sheet. Defaults to either
+ *   the matching content color for [drawerBackgroundColor], or, if it is not a color from the
+ *   theme, this will keep the same value set above this Surface.
  * @param scrimColor color of the scrim that obscures content when the drawer is open
  * @param content content of the rest of the UI
- *
  * @throws IllegalStateException when parent has [Float.POSITIVE_INFINITY] width
  */
 @Composable
@@ -520,64 +486,57 @@
 
         val isRtl = LocalLayoutDirection.current == LayoutDirection.Rtl
         Box(
-            Modifier
-                .anchoredDraggable(
-                    state = drawerState.anchoredDraggableState,
-                    orientation = Orientation.Horizontal,
-                    enabled = gesturesEnabled,
-                    reverseDirection = isRtl
-                )
+            Modifier.anchoredDraggable(
+                state = drawerState.anchoredDraggableState,
+                orientation = Orientation.Horizontal,
+                enabled = gesturesEnabled,
+                reverseDirection = isRtl
+            )
         ) {
-            Box {
-                content()
-            }
+            Box { content() }
             Scrim(
                 open = drawerState.isOpen,
                 onClose = {
                     if (
                         gesturesEnabled &&
-                        drawerState.anchoredDraggableState.confirmValueChange(DrawerValue.Closed)
+                            drawerState.anchoredDraggableState.confirmValueChange(
+                                DrawerValue.Closed
+                            )
                     ) {
                         scope.launch { drawerState.close() }
                     }
                 },
-                fraction = {
-                    calculateFraction(minValue, maxValue, drawerState.requireOffset())
-                },
+                fraction = { calculateFraction(minValue, maxValue, drawerState.requireOffset()) },
                 color = scrimColor
             )
             val navigationMenu = getString(Strings.NavigationMenu)
             Surface(
-                modifier = with(LocalDensity.current) {
-                    Modifier
-                        .sizeIn(
-                            minWidth = modalDrawerConstraints.minWidth.toDp(),
-                            minHeight = modalDrawerConstraints.minHeight.toDp(),
-                            maxWidth = modalDrawerConstraints.maxWidth.toDp(),
-                            maxHeight = modalDrawerConstraints.maxHeight.toDp()
-                        )
-                }
-                    .offset {
-                        IntOffset(
-                            drawerState
-                                .requireOffset()
-                                .roundToInt(), 0
-                        )
-                    }
-                    .padding(end = EndDrawerPadding)
-                    .semantics {
-                        paneTitle = navigationMenu
-                        if (drawerState.isOpen) {
-                            dismiss {
-                                if (
-                                    drawerState.anchoredDraggableState
-                                        .confirmValueChange(DrawerValue.Closed)
-                                ) {
-                                    scope.launch { drawerState.close() }
-                                }; true
-                            }
+                modifier =
+                    with(LocalDensity.current) {
+                            Modifier.sizeIn(
+                                minWidth = modalDrawerConstraints.minWidth.toDp(),
+                                minHeight = modalDrawerConstraints.minHeight.toDp(),
+                                maxWidth = modalDrawerConstraints.maxWidth.toDp(),
+                                maxHeight = modalDrawerConstraints.maxHeight.toDp()
+                            )
                         }
-                    },
+                        .offset { IntOffset(drawerState.requireOffset().roundToInt(), 0) }
+                        .padding(end = EndDrawerPadding)
+                        .semantics {
+                            paneTitle = navigationMenu
+                            if (drawerState.isOpen) {
+                                dismiss {
+                                    if (
+                                        drawerState.anchoredDraggableState.confirmValueChange(
+                                            DrawerValue.Closed
+                                        )
+                                    ) {
+                                        scope.launch { drawerState.close() }
+                                    }
+                                    true
+                                }
+                            }
+                        },
                 shape = drawerShape,
                 color = drawerBackgroundColor,
                 contentColor = drawerContentColor,
@@ -590,12 +549,14 @@
 }
 
 /**
- * <a href="https://material.io/components/navigation-drawer#bottom-drawer" class="external" target="_blank">Material Design bottom navigation drawer</a>.
+ * <a href="https://material.io/components/navigation-drawer#bottom-drawer" class="external"
+ * target="_blank">Material Design bottom navigation drawer</a>.
  *
  * Bottom navigation drawers are modal drawers that are anchored to the bottom of the screen instead
  * of the left or right edge. They are only used with bottom app bars.
  *
- * ![Bottom drawer image](https://developer.android.com/images/reference/androidx/compose/material/bottom-drawer.png)
+ * ![Bottom drawer
+ * image](https://developer.android.com/images/reference/androidx/compose/material/bottom-drawer.png)
  *
  * See [ModalDrawer] for a layout that introduces a classic from-the-side drawer.
  *
@@ -607,14 +568,14 @@
  * @param gesturesEnabled whether or not drawer can be interacted by gestures
  * @param drawerShape shape of the drawer sheet
  * @param drawerElevation drawer sheet elevation. This controls the size of the shadow below the
- * drawer sheet
+ *   drawer sheet
  * @param drawerBackgroundColor background color to be used for the drawer sheet
- * @param drawerContentColor color of the content to use inside the drawer sheet. Defaults to
- * either the matching content color for [drawerBackgroundColor], or, if it is not a color from
- * the theme, this will keep the same value set above this Surface.
- * @param scrimColor color of the scrim that obscures content when the drawer is open. If the
- * color passed is [Color.Unspecified], then a scrim will no longer be applied and the bottom
- * drawer will not block interaction with the rest of the screen when visible.
+ * @param drawerContentColor color of the content to use inside the drawer sheet. Defaults to either
+ *   the matching content color for [drawerBackgroundColor], or, if it is not a color from the
+ *   theme, this will keep the same value set above this Surface.
+ * @param scrimColor color of the scrim that obscures content when the drawer is open. If the color
+ *   passed is [Color.Unspecified], then a scrim will no longer be applied and the bottom drawer
+ *   will not block interaction with the rest of the screen when visible.
  * @param content content of the rest of the UI
  */
 @OptIn(ExperimentalMaterialApi::class)
@@ -635,37 +596,36 @@
     BoxWithConstraints(modifier.fillMaxSize()) {
         val fullHeight = constraints.maxHeight.toFloat()
         val isLandscape = constraints.maxWidth > constraints.maxHeight
-        val drawerConstraints = with(LocalDensity.current) {
-            Modifier
-                .sizeIn(
+        val drawerConstraints =
+            with(LocalDensity.current) {
+                Modifier.sizeIn(
                     maxWidth = constraints.maxWidth.toDp(),
                     maxHeight = constraints.maxHeight.toDp()
                 )
-        }
-        val nestedScroll = if (gesturesEnabled) {
-            Modifier.nestedScroll(drawerState.nestedScrollConnection)
-        } else {
-            Modifier
-        }
+            }
+        val nestedScroll =
+            if (gesturesEnabled) {
+                Modifier.nestedScroll(drawerState.nestedScrollConnection)
+            } else {
+                Modifier
+            }
         val isRtl = LocalLayoutDirection.current == LayoutDirection.Rtl
 
-        val swipeable = Modifier
-            .then(nestedScroll)
-            .anchoredDraggable(
-                state = drawerState.anchoredDraggableState,
-                orientation = Orientation.Vertical,
-                enabled = gesturesEnabled,
-                reverseDirection = isRtl
-            )
+        val swipeable =
+            Modifier.then(nestedScroll)
+                .anchoredDraggable(
+                    state = drawerState.anchoredDraggableState,
+                    orientation = Orientation.Vertical,
+                    enabled = gesturesEnabled,
+                    reverseDirection = isRtl
+                )
 
         Box(swipeable) {
             content()
             BottomDrawerScrim(
                 color = scrimColor,
                 onDismiss = {
-                    if (
-                        gesturesEnabled && drawerState.confirmStateChange(Closed)
-                    ) {
+                    if (gesturesEnabled && drawerState.confirmStateChange(Closed)) {
                         scope.launch { drawerState.close() }
                     }
                 },
@@ -689,42 +649,39 @@
                         // If we are setting the anchors for the first time and have an anchor for
                         // the current (initial) value, prefer that
                         val hasAnchors = drawerState.anchoredDraggableState.anchors.size > 0
-                        val newTarget = if (!hasAnchors &&
-                            newAnchors.hasAnchorFor(drawerState.currentValue)
-                        ) {
-                            drawerState.currentValue
-                        } else {
-                            when (drawerState.targetValue) {
-                                Closed -> Closed
-                                Open, Expanded -> {
-                                    val hasHalfExpandedState = newAnchors.hasAnchorFor(Open)
-                                    val newTarget = if (hasHalfExpandedState) {
-                                        Open
-                                    } else {
-                                        if (newAnchors.hasAnchorFor(Expanded)) Expanded else Closed
+                        val newTarget =
+                            if (!hasAnchors && newAnchors.hasAnchorFor(drawerState.currentValue)) {
+                                drawerState.currentValue
+                            } else {
+                                when (drawerState.targetValue) {
+                                    Closed -> Closed
+                                    Open,
+                                    Expanded -> {
+                                        val hasHalfExpandedState = newAnchors.hasAnchorFor(Open)
+                                        val newTarget =
+                                            if (hasHalfExpandedState) {
+                                                Open
+                                            } else {
+                                                if (newAnchors.hasAnchorFor(Expanded)) Expanded
+                                                else Closed
+                                            }
+                                        newTarget
                                     }
-                                    newTarget
                                 }
                             }
-                        }
                         drawerState.anchoredDraggableState.updateAnchors(newAnchors, newTarget)
                     }
-                    .offset {
-                        IntOffset(
-                            x = 0,
-                            y = drawerState
-                                .requireOffset()
-                                .roundToInt()
-                        )
-                    }
+                    .offset { IntOffset(x = 0, y = drawerState.requireOffset().roundToInt()) }
                     .semantics {
                         paneTitle = navigationMenu
                         if (drawerState.isOpen) {
-                            // TODO(b/180101663) The action currently doesn't return the correct results
+                            // TODO(b/180101663) The action currently doesn't return the correct
+                            // results
                             dismiss {
                                 if (drawerState.confirmStateChange(Closed)) {
                                     scope.launch { drawerState.close() }
-                                }; true
+                                }
+                                true
                             }
                         }
                     },
@@ -739,9 +696,7 @@
     }
 }
 
-/**
- * Object to hold default values for [ModalDrawer] and [BottomDrawer]
- */
+/** Object to hold default values for [ModalDrawer] and [BottomDrawer] */
 object DrawerDefaults {
 
     /**
@@ -750,35 +705,22 @@
      */
     val AnimationSpec = TweenSpec<Float>(durationMillis = 256)
 
-    /**
-     * Default background color for drawer sheets
-     */
+    /** Default background color for drawer sheets */
     val backgroundColor: Color
-        @Composable
-        get() = MaterialTheme.colors.surface
+        @Composable get() = MaterialTheme.colors.surface
 
-    /**
-     * Default elevation for drawer sheet as specified in material specs
-     */
+    /** Default elevation for drawer sheet as specified in material specs */
     val Elevation = 16.dp
 
-    /**
-     * Default shape for drawer sheets
-     */
+    /** Default shape for drawer sheets */
     val shape: Shape
-        @Composable
-        get() = MaterialTheme.shapes.large
+        @Composable get() = MaterialTheme.shapes.large
 
-    /**
-     * Default color of the scrim that obscures content when the drawer is open
-     */
+    /** Default color of the scrim that obscures content when the drawer is open */
     val scrimColor: Color
-        @Composable
-        get() = MaterialTheme.colors.onSurface.copy(alpha = ScrimOpacity)
+        @Composable get() = MaterialTheme.colors.onSurface.copy(alpha = ScrimOpacity)
 
-    /**
-     * Default alpha for scrim color
-     */
+    /** Default alpha for scrim color */
     const val ScrimOpacity = 0.32f
 }
 
@@ -786,66 +728,49 @@
     ((pos - a) / (b - a)).fastCoerceIn(0f, 1f)
 
 @Composable
-private fun BottomDrawerScrim(
-    color: Color,
-    onDismiss: () -> Unit,
-    visible: Boolean
-) {
+private fun BottomDrawerScrim(color: Color, onDismiss: () -> Unit, visible: Boolean) {
     if (color.isSpecified) {
-        val alpha by animateFloatAsState(
-            targetValue = if (visible) 1f else 0f,
-            animationSpec = TweenSpec()
-        )
+        val alpha by
+            animateFloatAsState(targetValue = if (visible) 1f else 0f, animationSpec = TweenSpec())
         val closeDrawer = getString(Strings.CloseDrawer)
-        val dismissModifier = if (visible) {
-            Modifier
-                .pointerInput(onDismiss) {
-                    detectTapGestures { onDismiss() }
-                }
-                .semantics(mergeDescendants = true) {
-                    contentDescription = closeDrawer
-                    onClick { onDismiss(); true }
-                }
-        } else {
-            Modifier
-        }
+        val dismissModifier =
+            if (visible) {
+                Modifier.pointerInput(onDismiss) { detectTapGestures { onDismiss() } }
+                    .semantics(mergeDescendants = true) {
+                        contentDescription = closeDrawer
+                        onClick {
+                            onDismiss()
+                            true
+                        }
+                    }
+            } else {
+                Modifier
+            }
 
-        Canvas(
-            Modifier
-                .fillMaxSize()
-                .then(dismissModifier)
-        ) {
+        Canvas(Modifier.fillMaxSize().then(dismissModifier)) {
             drawRect(color = color, alpha = alpha)
         }
     }
 }
 
 @Composable
-private fun Scrim(
-    open: Boolean,
-    onClose: () -> Unit,
-    fraction: () -> Float,
-    color: Color
-) {
+private fun Scrim(open: Boolean, onClose: () -> Unit, fraction: () -> Float, color: Color) {
     val closeDrawer = getString(Strings.CloseDrawer)
-    val dismissDrawer = if (open) {
-        Modifier
-            .pointerInput(onClose) { detectTapGestures { onClose() } }
-            .semantics(mergeDescendants = true) {
-                contentDescription = closeDrawer
-                onClick { onClose(); true }
-            }
-    } else {
-        Modifier
-    }
+    val dismissDrawer =
+        if (open) {
+            Modifier.pointerInput(onClose) { detectTapGestures { onClose() } }
+                .semantics(mergeDescendants = true) {
+                    contentDescription = closeDrawer
+                    onClick {
+                        onClose()
+                        true
+                    }
+                }
+        } else {
+            Modifier
+        }
 
-    Canvas(
-        Modifier
-            .fillMaxSize()
-            .then(dismissDrawer)
-    ) {
-        drawRect(color, alpha = fraction())
-    }
+    Canvas(Modifier.fillMaxSize().then(dismissDrawer)) { drawRect(color, alpha = fraction()) }
 }
 
 private val EndDrawerPadding = 56.dp
@@ -861,55 +786,57 @@
 @OptIn(ExperimentalMaterialApi::class)
 private fun ConsumeSwipeWithinBottomSheetBoundsNestedScrollConnection(
     state: AnchoredDraggableState<*>
-): NestedScrollConnection = object : NestedScrollConnection {
-    val orientation: Orientation = Orientation.Vertical
+): NestedScrollConnection =
+    object : NestedScrollConnection {
+        val orientation: Orientation = Orientation.Vertical
 
-    override fun onPreScroll(available: Offset, source: NestedScrollSource): Offset {
-        val delta = available.toFloat()
-        return if (delta < 0 && source == NestedScrollSource.UserInput) {
-            state.dispatchRawDelta(delta).toOffset()
-        } else {
-            Offset.Zero
+        override fun onPreScroll(available: Offset, source: NestedScrollSource): Offset {
+            val delta = available.toFloat()
+            return if (delta < 0 && source == NestedScrollSource.UserInput) {
+                state.dispatchRawDelta(delta).toOffset()
+            } else {
+                Offset.Zero
+            }
         }
-    }
 
-    override fun onPostScroll(
-        consumed: Offset,
-        available: Offset,
-        source: NestedScrollSource
-    ): Offset {
-        return if (source == NestedScrollSource.UserInput) {
-            state.dispatchRawDelta(available.toFloat()).toOffset()
-        } else {
-            Offset.Zero
+        override fun onPostScroll(
+            consumed: Offset,
+            available: Offset,
+            source: NestedScrollSource
+        ): Offset {
+            return if (source == NestedScrollSource.UserInput) {
+                state.dispatchRawDelta(available.toFloat()).toOffset()
+            } else {
+                Offset.Zero
+            }
         }
-    }
 
-    override suspend fun onPreFling(available: Velocity): Velocity {
-        val toFling = available.toFloat()
-        val currentOffset = state.requireOffset()
-        return if (toFling < 0 && currentOffset > state.anchors.minAnchor()) {
-            state.settle(velocity = toFling)
-            // since we go to the anchor with tween settling, consume all for the best UX
-            available
-        } else {
-            Velocity.Zero
+        override suspend fun onPreFling(available: Velocity): Velocity {
+            val toFling = available.toFloat()
+            val currentOffset = state.requireOffset()
+            return if (toFling < 0 && currentOffset > state.anchors.minAnchor()) {
+                state.settle(velocity = toFling)
+                // since we go to the anchor with tween settling, consume all for the best UX
+                available
+            } else {
+                Velocity.Zero
+            }
         }
+
+        override suspend fun onPostFling(consumed: Velocity, available: Velocity): Velocity {
+            state.settle(velocity = available.toFloat())
+            return available
+        }
+
+        private fun Float.toOffset(): Offset =
+            Offset(
+                x = if (orientation == Orientation.Horizontal) this else 0f,
+                y = if (orientation == Orientation.Vertical) this else 0f
+            )
+
+        @JvmName("velocityToFloat")
+        private fun Velocity.toFloat() = if (orientation == Orientation.Horizontal) x else y
+
+        @JvmName("offsetToFloat")
+        private fun Offset.toFloat(): Float = if (orientation == Orientation.Horizontal) x else y
     }
-
-    override suspend fun onPostFling(consumed: Velocity, available: Velocity): Velocity {
-        state.settle(velocity = available.toFloat())
-        return available
-    }
-
-    private fun Float.toOffset(): Offset = Offset(
-        x = if (orientation == Orientation.Horizontal) this else 0f,
-        y = if (orientation == Orientation.Vertical) this else 0f
-    )
-
-    @JvmName("velocityToFloat")
-    private fun Velocity.toFloat() = if (orientation == Orientation.Horizontal) x else y
-
-    @JvmName("offsetToFloat")
-    private fun Offset.toFloat(): Float = if (orientation == Orientation.Horizontal) x else y
-}
diff --git a/compose/material/material/src/commonMain/kotlin/androidx/compose/material/Elevation.kt b/compose/material/material/src/commonMain/kotlin/androidx/compose/material/Elevation.kt
index bb9c2f4..5633fc8 100644
--- a/compose/material/material/src/commonMain/kotlin/androidx/compose/material/Elevation.kt
+++ b/compose/material/material/src/commonMain/kotlin/androidx/compose/material/Elevation.kt
@@ -35,27 +35,28 @@
  * [ElevationDefaults.outgoingAnimationSpecForInteraction] for more details.
  *
  * @param target the [Dp] target elevation for this component, corresponding to the elevation
- * desired for the [to] state.
- * @param from the previous [Interaction] that was used to calculate elevation. `null` if there
- * was no previous [Interaction], such as when the component is in its default state.
+ *   desired for the [to] state.
+ * @param from the previous [Interaction] that was used to calculate elevation. `null` if there was
+ *   no previous [Interaction], such as when the component is in its default state.
  * @param to the [Interaction] that this component is moving to, such as [PressInteraction.Press]
- * when this component is being pressed. `null` if this component is moving back to its default
- * state.
+ *   when this component is being pressed. `null` if this component is moving back to its default
+ *   state.
  */
 internal suspend fun Animatable<Dp, *>.animateElevation(
     target: Dp,
     from: Interaction? = null,
     to: Interaction? = null
 ) {
-    val spec = when {
-        // Moving to a new state
-        to != null -> ElevationDefaults.incomingAnimationSpecForInteraction(to)
-        // Moving to default, from a previous state
-        from != null -> ElevationDefaults.outgoingAnimationSpecForInteraction(from)
-        // Loading the initial state, or moving back to the baseline state from a disabled /
-        // unknown state, so just snap to the final value.
-        else -> null
-    }
+    val spec =
+        when {
+            // Moving to a new state
+            to != null -> ElevationDefaults.incomingAnimationSpecForInteraction(to)
+            // Moving to default, from a previous state
+            from != null -> ElevationDefaults.outgoingAnimationSpecForInteraction(from)
+            // Loading the initial state, or moving back to the baseline state from a disabled /
+            // unknown state, so just snap to the final value.
+            else -> null
+        }
     if (spec != null) animateTo(target, spec) else snapTo(target)
 }
 
@@ -72,8 +73,8 @@
 private object ElevationDefaults {
     /**
      * Returns the [AnimationSpec]s used when animating elevation to [interaction], either from a
-     * previous [Interaction], or from the default state. If [interaction] is unknown, then
-     * returns `null`.
+     * previous [Interaction], or from the default state. If [interaction] is unknown, then returns
+     * `null`.
      *
      * @param interaction the [Interaction] that is being animated to
      */
@@ -104,17 +105,10 @@
     }
 }
 
-private val DefaultIncomingSpec = TweenSpec<Dp>(
-    durationMillis = 120,
-    easing = FastOutSlowInEasing
-)
+private val DefaultIncomingSpec = TweenSpec<Dp>(durationMillis = 120, easing = FastOutSlowInEasing)
 
-private val DefaultOutgoingSpec = TweenSpec<Dp>(
-    durationMillis = 150,
-    easing = CubicBezierEasing(0.40f, 0.00f, 0.60f, 1.00f)
-)
+private val DefaultOutgoingSpec =
+    TweenSpec<Dp>(durationMillis = 150, easing = CubicBezierEasing(0.40f, 0.00f, 0.60f, 1.00f))
 
-private val HoveredOutgoingSpec = TweenSpec<Dp>(
-    durationMillis = 120,
-    easing = CubicBezierEasing(0.40f, 0.00f, 0.60f, 1.00f)
-)
+private val HoveredOutgoingSpec =
+    TweenSpec<Dp>(durationMillis = 120, easing = CubicBezierEasing(0.40f, 0.00f, 0.60f, 1.00f))
diff --git a/compose/material/material/src/commonMain/kotlin/androidx/compose/material/ElevationOverlay.kt b/compose/material/material/src/commonMain/kotlin/androidx/compose/material/ElevationOverlay.kt
index 3d84b81..44d96d3 100644
--- a/compose/material/material/src/commonMain/kotlin/androidx/compose/material/ElevationOverlay.kt
+++ b/compose/material/material/src/commonMain/kotlin/androidx/compose/material/ElevationOverlay.kt
@@ -28,41 +28,40 @@
 import kotlin.math.ln
 
 /**
- * CompositionLocal containing the [ElevationOverlay] used by [Surface] components. Provide
- * `null` to turn off [ElevationOverlay]s for the children within this CompositionLocal..
+ * CompositionLocal containing the [ElevationOverlay] used by [Surface] components. Provide `null`
+ * to turn off [ElevationOverlay]s for the children within this CompositionLocal..
  *
  * @see ElevationOverlay
  */
 val LocalElevationOverlay: ProvidableCompositionLocal<ElevationOverlay?> =
-    staticCompositionLocalOf { DefaultElevationOverlay }
+    staticCompositionLocalOf {
+        DefaultElevationOverlay
+    }
 
 // TODO: make this a fun interface
 /**
- * An ElevationOverlay is an overlay applied to the background color of [Surface] components,
- * used to emphasize elevation in dark theme, where shadows are not as visible. An
- * ElevationOverlay does not replace the shadows drawn by a [Surface], but is used as an
- * additional representation of elevation.
+ * An ElevationOverlay is an overlay applied to the background color of [Surface] components, used
+ * to emphasize elevation in dark theme, where shadows are not as visible. An ElevationOverlay does
+ * not replace the shadows drawn by a [Surface], but is used as an additional representation of
+ * elevation.
  *
  * The default ElevationOverlay only applies in dark theme (![Colors.isLight]), in accordance with
  * the Material specification for
  * [Dark Theme](https://material.io/design/color/dark-theme.html#properties).
  *
- * See [LocalElevationOverlay] to provide your own [ElevationOverlay]. You can provide `null`
- * to have no ElevationOverlay applied.
+ * See [LocalElevationOverlay] to provide your own [ElevationOverlay]. You can provide `null` to
+ * have no ElevationOverlay applied.
  */
 interface ElevationOverlay {
     /**
-     * Returns the new background [Color] to use, representing the original background [color]
-     * with an overlay corresponding to [elevation] applied. Typically this should only be
-     * applied to [Colors.surface].
+     * Returns the new background [Color] to use, representing the original background [color] with
+     * an overlay corresponding to [elevation] applied. Typically this should only be applied to
+     * [Colors.surface].
      */
-    @Composable
-    fun apply(color: Color, elevation: Dp): Color
+    @Composable fun apply(color: Color, elevation: Dp): Color
 }
 
-/**
- * The default [ElevationOverlay] implementation.
- */
+/** The default [ElevationOverlay] implementation. */
 private object DefaultElevationOverlay : ElevationOverlay {
     @ReadOnlyComposable
     @Composable
@@ -78,9 +77,9 @@
 }
 
 /**
- * @return the alpha-modified foreground color to overlay on top of the surface color to produce
- * the resultant color. This color is the [contentColorFor] the [backgroundColor], with alpha
- * applied depending on the value of [elevation].
+ * @return the alpha-modified foreground color to overlay on top of the surface color to produce the
+ *   resultant color. This color is the [contentColorFor] the [backgroundColor], with alpha applied
+ *   depending on the value of [elevation].
  */
 @ReadOnlyComposable
 @Composable
@@ -92,9 +91,9 @@
 
 /**
  * CompositionLocal containing the current absolute elevation provided by [Surface] components. This
- * absolute elevation is a sum of all the previous elevations. Absolute elevation is only
- * used for calculating elevation overlays in dark theme, and is *not* used for drawing the
- * shadow in a [Surface]. See [ElevationOverlay] for more information on elevation overlays.
+ * absolute elevation is a sum of all the previous elevations. Absolute elevation is only used for
+ * calculating elevation overlays in dark theme, and is *not* used for drawing the shadow in a
+ * [Surface]. See [ElevationOverlay] for more information on elevation overlays.
  *
  * @sample androidx.compose.material.samples.AbsoluteElevationSample
  */
diff --git a/compose/material/material/src/commonMain/kotlin/androidx/compose/material/ExperimentalMaterialApi.kt b/compose/material/material/src/commonMain/kotlin/androidx/compose/material/ExperimentalMaterialApi.kt
index 6b4b137..f10f326 100644
--- a/compose/material/material/src/commonMain/kotlin/androidx/compose/material/ExperimentalMaterialApi.kt
+++ b/compose/material/material/src/commonMain/kotlin/androidx/compose/material/ExperimentalMaterialApi.kt
@@ -17,8 +17,7 @@
 package androidx.compose.material
 
 @RequiresOptIn(
-    "This material API is experimental and is likely to change or to be removed in" +
-        " the future."
+    "This material API is experimental and is likely to change or to be removed in" + " the future."
 )
 @Retention(AnnotationRetention.BINARY)
 annotation class ExperimentalMaterialApi
diff --git a/compose/material/material/src/commonMain/kotlin/androidx/compose/material/FloatingActionButton.kt b/compose/material/material/src/commonMain/kotlin/androidx/compose/material/FloatingActionButton.kt
index 8bd8e6e..39cc6f1 100644
--- a/compose/material/material/src/commonMain/kotlin/androidx/compose/material/FloatingActionButton.kt
+++ b/compose/material/material/src/commonMain/kotlin/androidx/compose/material/FloatingActionButton.kt
@@ -50,11 +50,13 @@
 import kotlinx.coroutines.launch
 
 /**
- * <a href="https://material.io/components/buttons-floating-action-button" class="external" target="_blank">Material Design floating action button</a>.
+ * <a href="https://material.io/components/buttons-floating-action-button" class="external"
+ * target="_blank">Material Design floating action button</a>.
  *
  * A floating action button (FAB) represents the primary action of a screen.
  *
- * ![Floating action button image](https://developer.android.com/images/reference/androidx/compose/material/floating-action-button.png)
+ * ![Floating action button
+ * image](https://developer.android.com/images/reference/androidx/compose/material/floating-action-button.png)
  *
  * This FAB is typically used with an [Icon]:
  *
@@ -65,14 +67,14 @@
  * @param onClick callback invoked when this FAB is clicked
  * @param modifier [Modifier] to be applied to this FAB.
  * @param interactionSource an optional hoisted [MutableInteractionSource] for observing and
- * emitting [Interaction]s for this FAB. You can use this to change the FAB's
- * appearance or preview the FAB in different states. Note that if `null` is provided,
- * interactions will still happen internally.
+ *   emitting [Interaction]s for this FAB. You can use this to change the FAB's appearance or
+ *   preview the FAB in different states. Note that if `null` is provided, interactions will still
+ *   happen internally.
  * @param shape The [Shape] of this FAB
  * @param backgroundColor The background color. Use [Color.Transparent] to have no color
  * @param contentColor The preferred content color for content inside this FAB
- * @param elevation [FloatingActionButtonElevation] used to resolve the elevation for this FAB
- * in different states. This controls the size of the shadow below the FAB.
+ * @param elevation [FloatingActionButtonElevation] used to resolve the elevation for this FAB in
+ *   different states. This controls the size of the shadow below the FAB.
  * @param content the content of this FAB - this is typically an [Icon].
  */
 @OptIn(ExperimentalMaterialApi::class)
@@ -101,21 +103,24 @@
         CompositionLocalProvider(LocalContentAlpha provides contentColor.alpha) {
             ProvideTextStyle(MaterialTheme.typography.button) {
                 Box(
-                    modifier = Modifier
-                        .defaultMinSize(minWidth = FabSize, minHeight = FabSize),
+                    modifier = Modifier.defaultMinSize(minWidth = FabSize, minHeight = FabSize),
                     contentAlignment = Alignment.Center
-                ) { content() }
+                ) {
+                    content()
+                }
             }
         }
     }
 }
 
 /**
- * <a href="https://material.io/components/buttons-floating-action-button#extended-fab" class="external" target="_blank">Material Design extended floating action button</a>.
+ * <a href="https://material.io/components/buttons-floating-action-button#extended-fab"
+ * class="external" target="_blank">Material Design extended floating action button</a>.
  *
  * The extended FAB is wider than a regular FAB, and it includes a text label.
  *
- * ![Extended floating action button image](https://developer.android.com/images/reference/androidx/compose/material/extended-floating-action-button.png)
+ * ![Extended floating action button
+ * image](https://developer.android.com/images/reference/androidx/compose/material/extended-floating-action-button.png)
  *
  * This extended FAB contains text and an optional icon that will be placed at the start. See
  * [FloatingActionButton] for a FAB that just contains some content, typically an icon.
@@ -123,25 +128,24 @@
  * @sample androidx.compose.material.samples.SimpleExtendedFabWithIcon
  *
  * If you want FAB’s container to have a fluid width (to be defined by its relationship to something
- * else on screen, such as screen width or the layout grid) just apply an appropriate modifier.
- * For example to fill the whole available width you can do:
+ * else on screen, such as screen width or the layout grid) just apply an appropriate modifier. For
+ * example to fill the whole available width you can do:
  *
  * @sample androidx.compose.material.samples.FluidExtendedFab
  *
  * @param text Text label displayed inside this FAB
  * @param onClick callback invoked when this FAB is clicked
  * @param modifier [Modifier] to be applied to this FAB
- * @param icon Optional icon for this FAB, typically this will be a
- * [Icon].
+ * @param icon Optional icon for this FAB, typically this will be a [Icon].
  * @param interactionSource an optional hoisted [MutableInteractionSource] for observing and
- * emitting [Interaction]s for this FAB. You can use this to change the FAB's
- * appearance or preview the FAB in different states. Note that if `null` is provided,
- * interactions will still happen internally.
+ *   emitting [Interaction]s for this FAB. You can use this to change the FAB's appearance or
+ *   preview the FAB in different states. Note that if `null` is provided, interactions will still
+ *   happen internally.
  * @param shape The [Shape] of this FAB
  * @param backgroundColor The background color. Use [Color.Transparent] to have no color
  * @param contentColor The preferred content color. Will be used by text and iconography
- * @param elevation [FloatingActionButtonElevation] used to resolve the elevation for this FAB
- * in different states. This controls the size of the shadow below the FAB.
+ * @param elevation [FloatingActionButtonElevation] used to resolve the elevation for this FAB in
+ *   different states. This controls the size of the shadow below the FAB.
  */
 @Composable
 fun ExtendedFloatingActionButton(
@@ -156,10 +160,7 @@
     elevation: FloatingActionButtonElevation = FloatingActionButtonDefaults.elevation()
 ) {
     FloatingActionButton(
-        modifier = modifier.sizeIn(
-            minWidth = ExtendedFabSize,
-            minHeight = ExtendedFabSize
-        ),
+        modifier = modifier.sizeIn(minWidth = ExtendedFabSize, minHeight = ExtendedFabSize),
         onClick = onClick,
         interactionSource = interactionSource,
         shape = shape,
@@ -169,10 +170,7 @@
     ) {
         val startPadding = if (icon == null) ExtendedFabTextPadding else ExtendedFabIconPadding
         Row(
-            modifier = Modifier.padding(
-                start = startPadding,
-                end = ExtendedFabTextPadding
-            ),
+            modifier = Modifier.padding(start = startPadding, end = ExtendedFabTextPadding),
             verticalAlignment = Alignment.CenterVertically
         ) {
             if (icon != null) {
@@ -193,52 +191,45 @@
 @Stable
 interface FloatingActionButtonElevation {
     /**
-     * Represents the elevation used in a floating action button, depending on
-     * [interactionSource].
+     * Represents the elevation used in a floating action button, depending on [interactionSource].
      *
      * @param interactionSource the [InteractionSource] for this floating action button
      */
-    @Composable
-    fun elevation(interactionSource: InteractionSource): State<Dp>
+    @Composable fun elevation(interactionSource: InteractionSource): State<Dp>
 }
 
-/**
- * Contains the default values used by [FloatingActionButton]
- */
+/** Contains the default values used by [FloatingActionButton] */
 object FloatingActionButtonDefaults {
     /**
      * Creates a [FloatingActionButtonElevation] that will animate between the provided values
      * according to the Material specification.
      *
      * @param defaultElevation the elevation to use when the [FloatingActionButton] has no
-     * [Interaction]s
-     * @param pressedElevation the elevation to use when the [FloatingActionButton] is
-     * pressed.
+     *   [Interaction]s
+     * @param pressedElevation the elevation to use when the [FloatingActionButton] is pressed.
      */
     @Deprecated("Use another overload of elevation", level = DeprecationLevel.HIDDEN)
     @Composable
     fun elevation(
         defaultElevation: Dp = 6.dp,
         pressedElevation: Dp = 12.dp,
-    ): FloatingActionButtonElevation = elevation(
-        defaultElevation,
-        pressedElevation,
-        hoveredElevation = 8.dp,
-        focusedElevation = 8.dp,
-    )
+    ): FloatingActionButtonElevation =
+        elevation(
+            defaultElevation,
+            pressedElevation,
+            hoveredElevation = 8.dp,
+            focusedElevation = 8.dp,
+        )
 
     /**
      * Creates a [FloatingActionButtonElevation] that will animate between the provided values
      * according to the Material specification.
      *
      * @param defaultElevation the elevation to use when the [FloatingActionButton] has no
-     * [Interaction]s
-     * @param pressedElevation the elevation to use when the [FloatingActionButton] is
-     * pressed.
-     * @param hoveredElevation the elevation to use when the [FloatingActionButton] is
-     * hovered.
-     * @param focusedElevation the elevation to use when the [FloatingActionButton] is
-     * focused.
+     *   [Interaction]s
+     * @param pressedElevation the elevation to use when the [FloatingActionButton] is pressed.
+     * @param hoveredElevation the elevation to use when the [FloatingActionButton] is hovered.
+     * @param focusedElevation the elevation to use when the [FloatingActionButton] is focused.
      */
     @Composable
     fun elevation(
@@ -258,9 +249,7 @@
     }
 }
 
-/**
- * Default [FloatingActionButtonElevation] implementation.
- */
+/** Default [FloatingActionButtonElevation] implementation. */
 @Stable
 private class DefaultFloatingActionButtonElevation(
     private val defaultElevation: Dp,
@@ -270,14 +259,15 @@
 ) : FloatingActionButtonElevation {
     @Composable
     override fun elevation(interactionSource: InteractionSource): State<Dp> {
-        val animatable = remember(interactionSource) {
-            FloatingActionButtonElevationAnimatable(
-                defaultElevation = defaultElevation,
-                pressedElevation = pressedElevation,
-                hoveredElevation = hoveredElevation,
-                focusedElevation = focusedElevation
-            )
-        }
+        val animatable =
+            remember(interactionSource) {
+                FloatingActionButtonElevationAnimatable(
+                    defaultElevation = defaultElevation,
+                    pressedElevation = pressedElevation,
+                    hoveredElevation = hoveredElevation,
+                    focusedElevation = focusedElevation
+                )
+            }
 
         LaunchedEffect(this) {
             animatable.updateElevation(
@@ -315,9 +305,7 @@
                     }
                 }
                 val targetInteraction = interactions.lastOrNull()
-                launch {
-                    animatable.animateElevation(to = targetInteraction)
-                }
+                launch { animatable.animateElevation(to = targetInteraction) }
             }
         }
 
@@ -394,11 +382,7 @@
         targetInteraction = to
         try {
             if (animatable.targetValue != target) {
-                animatable.animateElevation(
-                    target = target,
-                    from = lastTargetInteraction,
-                    to = to
-                )
+                animatable.animateElevation(target = target, from = lastTargetInteraction, to = to)
             }
         } finally {
             lastTargetInteraction = to
diff --git a/compose/material/material/src/commonMain/kotlin/androidx/compose/material/Icon.kt b/compose/material/material/src/commonMain/kotlin/androidx/compose/material/Icon.kt
index a1ad2e6..0d873c8 100644
--- a/compose/material/material/src/commonMain/kotlin/androidx/compose/material/Icon.kt
+++ b/compose/material/material/src/commonMain/kotlin/androidx/compose/material/Icon.kt
@@ -40,8 +40,8 @@
 import androidx.compose.ui.unit.dp
 
 /**
- * A Material Design icon component that draws [imageVector] using [tint], with a default value
- * of [LocalContentColor]. If [imageVector] has no intrinsic size, this component will use the
+ * A Material Design icon component that draws [imageVector] using [tint], with a default value of
+ * [LocalContentColor]. If [imageVector] has no intrinsic size, this component will use the
  * recommended default size. Icon is an opinionated component designed to be used with single-color
  * icons so that they can be tinted correctly for the component they are placed in. For multicolored
  * icons and icons that should not be tinted, use [Color.Unspecified] for [tint]. For generic images
@@ -50,12 +50,12 @@
  *
  * @param imageVector [ImageVector] to draw inside this Icon
  * @param contentDescription text used by accessibility services to describe what this icon
- * represents. This should always be provided unless this icon is used for decorative purposes,
- * and does not represent a meaningful action that a user can take. This text should be
- * localized, such as by using [androidx.compose.ui.res.stringResource] or similar
+ *   represents. This should always be provided unless this icon is used for decorative purposes,
+ *   and does not represent a meaningful action that a user can take. This text should be localized,
+ *   such as by using [androidx.compose.ui.res.stringResource] or similar
  * @param modifier optional [Modifier] for this Icon
  * @param tint tint to be applied to [imageVector]. If [Color.Unspecified] is provided, then no tint
- * is applied
+ *   is applied
  */
 @Composable
 @NonRestartableComposable
@@ -74,22 +74,22 @@
 }
 
 /**
- * A Material Design icon component that draws [bitmap] using [tint], with a default value
- * of [LocalContentColor]. If [bitmap] has no intrinsic size, this component will use the
- * recommended default size. Icon is an opinionated component designed to be used with single-color
- * icons so that they can be tinted correctly for the component they are placed in. For multicolored
- * icons and icons that should not be tinted, use [Color.Unspecified] for [tint]. For generic images
- * that should not be tinted, and do not follow the recommended icon size, use the generic
+ * A Material Design icon component that draws [bitmap] using [tint], with a default value of
+ * [LocalContentColor]. If [bitmap] has no intrinsic size, this component will use the recommended
+ * default size. Icon is an opinionated component designed to be used with single-color icons so
+ * that they can be tinted correctly for the component they are placed in. For multicolored icons
+ * and icons that should not be tinted, use [Color.Unspecified] for [tint]. For generic images that
+ * should not be tinted, and do not follow the recommended icon size, use the generic
  * [androidx.compose.foundation.Image] instead. For a clickable icon, see [IconButton].
  *
  * @param bitmap [ImageBitmap] to draw inside this Icon
  * @param contentDescription text used by accessibility services to describe what this icon
- * represents. This should always be provided unless this icon is used for decorative purposes,
- * and does not represent a meaningful action that a user can take. This text should be
- * localized, such as by using [androidx.compose.ui.res.stringResource] or similar
+ *   represents. This should always be provided unless this icon is used for decorative purposes,
+ *   and does not represent a meaningful action that a user can take. This text should be localized,
+ *   such as by using [androidx.compose.ui.res.stringResource] or similar
  * @param modifier optional [Modifier] for this Icon
  * @param tint tint to be applied to [bitmap]. If [Color.Unspecified] is provided, then no tint is
- * applied
+ *   applied
  */
 @Composable
 @NonRestartableComposable
@@ -109,22 +109,22 @@
 }
 
 /**
- * A Material Design icon component that draws [painter] using [tint], with a default value
- * of [LocalContentColor]. If [painter] has no intrinsic size, this component will use the
- * recommended default size. Icon is an opinionated component designed to be used with single-color
- * icons so that they can be tinted correctly for the component they are placed in. For multicolored
- * icons and icons that should not be tinted, use [Color.Unspecified] for [tint]. For generic images
- * that should not be tinted, and do not follow the recommended icon size, use the generic
+ * A Material Design icon component that draws [painter] using [tint], with a default value of
+ * [LocalContentColor]. If [painter] has no intrinsic size, this component will use the recommended
+ * default size. Icon is an opinionated component designed to be used with single-color icons so
+ * that they can be tinted correctly for the component they are placed in. For multicolored icons
+ * and icons that should not be tinted, use [Color.Unspecified] for [tint]. For generic images that
+ * should not be tinted, and do not follow the recommended icon size, use the generic
  * [androidx.compose.foundation.Image] instead. For a clickable icon, see [IconButton].
  *
  * @param painter [Painter] to draw inside this Icon
  * @param contentDescription text used by accessibility services to describe what this icon
- * represents. This should always be provided unless this icon is used for decorative purposes,
- * and does not represent a meaningful action that a user can take. This text should be
- * localized, such as by using [androidx.compose.ui.res.stringResource] or similar
+ *   represents. This should always be provided unless this icon is used for decorative purposes,
+ *   and does not represent a meaningful action that a user can take. This text should be localized,
+ *   such as by using [androidx.compose.ui.res.stringResource] or similar
  * @param modifier optional [Modifier] for this Icon
  * @param tint tint to be applied to [painter]. If [Color.Unspecified] is provided, then no tint is
- * applied
+ *   applied
  */
 @Composable
 fun Icon(
@@ -133,24 +133,22 @@
     modifier: Modifier = Modifier,
     tint: Color = LocalContentColor.current.copy(alpha = LocalContentAlpha.current)
 ) {
-    val colorFilter = remember(tint) {
-        if (tint == Color.Unspecified) null else ColorFilter.tint(tint)
-    }
-    val semantics = if (contentDescription != null) {
-        Modifier.semantics {
-            this.contentDescription = contentDescription
-            this.role = Role.Image
+    val colorFilter =
+        remember(tint) { if (tint == Color.Unspecified) null else ColorFilter.tint(tint) }
+    val semantics =
+        if (contentDescription != null) {
+            Modifier.semantics {
+                this.contentDescription = contentDescription
+                this.role = Role.Image
+            }
+        } else {
+            Modifier
         }
-    } else {
-        Modifier
-    }
     Box(
-        modifier.toolingGraphicsLayer().defaultSizeFor(painter)
-            .paint(
-                painter,
-                colorFilter = colorFilter,
-                contentScale = ContentScale.Fit
-            )
+        modifier
+            .toolingGraphicsLayer()
+            .defaultSizeFor(painter)
+            .paint(painter, colorFilter = colorFilter, contentScale = ContentScale.Fit)
             .then(semantics)
     )
 }
diff --git a/compose/material/material/src/commonMain/kotlin/androidx/compose/material/IconButton.kt b/compose/material/material/src/commonMain/kotlin/androidx/compose/material/IconButton.kt
index 4a19e8f..0c3ee6f 100644
--- a/compose/material/material/src/commonMain/kotlin/androidx/compose/material/IconButton.kt
+++ b/compose/material/material/src/commonMain/kotlin/androidx/compose/material/IconButton.kt
@@ -30,28 +30,27 @@
 
 /**
  * IconButton is a clickable icon, used to represent actions. An IconButton has an overall minimum
- * touch target size of 48 x 48dp, to meet accessibility guidelines. [content] is centered
- * inside the IconButton.
+ * touch target size of 48 x 48dp, to meet accessibility guidelines. [content] is centered inside
+ * the IconButton.
  *
- * This component is typically used inside an App Bar for the navigation icon / actions. See App
- * Bar documentation for samples of this.
+ * This component is typically used inside an App Bar for the navigation icon / actions. See App Bar
+ * documentation for samples of this.
  *
  * [content] should typically be an [Icon], using an icon from
- * [androidx.compose.material.icons.Icons]. If using a custom icon, note that the typical size for the
- * internal icon is 24 x 24 dp.
+ * [androidx.compose.material.icons.Icons]. If using a custom icon, note that the typical size for
+ * the internal icon is 24 x 24 dp.
  *
  * @sample androidx.compose.material.samples.IconButtonSample
  *
  * @param onClick the lambda to be invoked when this icon is pressed
  * @param modifier optional [Modifier] for this IconButton
  * @param enabled whether or not this IconButton will handle input events and appear enabled for
- * semantics purposes
+ *   semantics purposes
  * @param interactionSource an optional hoisted [MutableInteractionSource] for observing and
- * emitting [Interaction]s for this IconButton. You can use this to change the IconButton's
- * appearance or preview the IconButton in different states. Note that if `null` is provided,
- * interactions will still happen internally.
- * @param content the content (icon) to be drawn inside the IconButton. This is typically an
- * [Icon].
+ *   emitting [Interaction]s for this IconButton. You can use this to change the IconButton's
+ *   appearance or preview the IconButton in different states. Note that if `null` is provided,
+ *   interactions will still happen internally.
+ * @param content the content (icon) to be drawn inside the IconButton. This is typically an [Icon].
  */
 @Composable
 fun IconButton(
@@ -62,15 +61,17 @@
     content: @Composable () -> Unit
 ) {
     Box(
-        modifier = modifier
-            .minimumInteractiveComponentSize()
-            .clickable(
-                onClick = onClick,
-                enabled = enabled,
-                role = Role.Button,
-                interactionSource = interactionSource,
-                indication = rippleOrFallbackImplementation(bounded = false, radius = RippleRadius)
-            ),
+        modifier =
+            modifier
+                .minimumInteractiveComponentSize()
+                .clickable(
+                    onClick = onClick,
+                    enabled = enabled,
+                    role = Role.Button,
+                    interactionSource = interactionSource,
+                    indication =
+                        rippleOrFallbackImplementation(bounded = false, radius = RippleRadius)
+                ),
         contentAlignment = Alignment.Center
     ) {
         val contentAlpha = if (enabled) LocalContentAlpha.current else ContentAlpha.disabled
@@ -79,8 +80,8 @@
 }
 
 /**
- * An [IconButton] with two states, for icons that can be toggled 'on' and 'off', such as a
- * bookmark icon, or a navigation icon that opens a drawer.
+ * An [IconButton] with two states, for icons that can be toggled 'on' and 'off', such as a bookmark
+ * icon, or a navigation icon that opens a drawer.
  *
  * @sample androidx.compose.material.samples.IconToggleButtonSample
  *
@@ -88,13 +89,13 @@
  * @param onCheckedChange callback to be invoked when this icon is selected
  * @param modifier optional [Modifier] for this IconToggleButton
  * @param enabled enabled whether or not this [IconToggleButton] will handle input events and appear
- * enabled for semantics purposes
+ *   enabled for semantics purposes
  * @param interactionSource an optional hoisted [MutableInteractionSource] for observing and
- * emitting [Interaction]s for this IconButton. You can use this to change the IconButton's
- * appearance or preview the IconButton in different states. Note that if `null` is provided,
- * interactions will still happen internally.
+ *   emitting [Interaction]s for this IconButton. You can use this to change the IconButton's
+ *   appearance or preview the IconButton in different states. Note that if `null` is provided,
+ *   interactions will still happen internally.
  * @param content the content (icon) to be drawn inside the IconToggleButton. This is typically an
- * [Icon].
+ *   [Icon].
  */
 @Composable
 fun IconToggleButton(
@@ -106,16 +107,18 @@
     content: @Composable () -> Unit
 ) {
     Box(
-        modifier = modifier
-            .minimumInteractiveComponentSize()
-            .toggleable(
-            value = checked,
-            onValueChange = onCheckedChange,
-            enabled = enabled,
-            role = Role.Checkbox,
-            interactionSource = interactionSource,
-            indication = rippleOrFallbackImplementation(bounded = false, radius = RippleRadius)
-        ),
+        modifier =
+            modifier
+                .minimumInteractiveComponentSize()
+                .toggleable(
+                    value = checked,
+                    onValueChange = onCheckedChange,
+                    enabled = enabled,
+                    role = Role.Checkbox,
+                    interactionSource = interactionSource,
+                    indication =
+                        rippleOrFallbackImplementation(bounded = false, radius = RippleRadius)
+                ),
         contentAlignment = Alignment.Center
     ) {
         val contentAlpha = if (enabled) LocalContentAlpha.current else ContentAlpha.disabled
diff --git a/compose/material/material/src/commonMain/kotlin/androidx/compose/material/InteractiveComponentSize.kt b/compose/material/material/src/commonMain/kotlin/androidx/compose/material/InteractiveComponentSize.kt
index f639ad9..d2497c9 100644
--- a/compose/material/material/src/commonMain/kotlin/androidx/compose/material/InteractiveComponentSize.kt
+++ b/compose/material/material/src/commonMain/kotlin/androidx/compose/material/InteractiveComponentSize.kt
@@ -41,15 +41,15 @@
  *
  * This uses the Material recommended minimum size of 48.dp x 48.dp, which may not the same as the
  * system enforced minimum size. The minimum clickable / touch target size (48.dp by default) is
- * controlled by the system via ViewConfiguration` and automatically expanded at the touch input layer.
+ * controlled by the system via ViewConfiguration` and automatically expanded at the touch input
+ * layer.
  *
  * This modifier is not needed for touch target expansion to happen. It only affects layout, to make
  * sure there is adequate space for touch target expansion.
  */
 fun Modifier.minimumInteractiveComponentSize(): Modifier = this then MinimumInteractiveModifier
 
-internal object MinimumInteractiveModifier :
-    ModifierNodeElement<MinimumInteractiveModifierNode>() {
+internal object MinimumInteractiveModifier : ModifierNodeElement<MinimumInteractiveModifierNode>() {
 
     override fun create(): MinimumInteractiveModifierNode = MinimumInteractiveModifierNode()
 
@@ -59,18 +59,18 @@
         name = "minimumInteractiveComponentSize"
         // TODO: b/214589635 - surface this information through the layout inspector in a better way
         //  - for now just add some information to help developers debug what this size represents.
-        properties["README"] = "Reserves at least 48.dp in size to disambiguate touch " +
-            "interactions if the element would measure smaller"
+        properties["README"] =
+            "Reserves at least 48.dp in size to disambiguate touch " +
+                "interactions if the element would measure smaller"
     }
 
     override fun hashCode(): Int = System.identityHashCode(this)
+
     override fun equals(other: Any?) = (other === this)
 }
 
 internal class MinimumInteractiveModifierNode :
-    Modifier.Node(),
-    CompositionLocalConsumerModifierNode,
-    LayoutModifierNode {
+    Modifier.Node(), CompositionLocalConsumerModifierNode, LayoutModifierNode {
 
     @OptIn(ExperimentalMaterialApi::class)
     override fun MeasureScope.measure(
@@ -82,16 +82,18 @@
         val placeable = measurable.measure(constraints)
 
         // Be at least as big as the minimum dimension in both dimensions
-        val width = if (enforcement) {
-            maxOf(placeable.width, size.width.roundToPx())
-        } else {
-            placeable.width
-        }
-        val height = if (enforcement) {
-            maxOf(placeable.height, size.height.roundToPx())
-        } else {
-            placeable.height
-        }
+        val width =
+            if (enforcement) {
+                maxOf(placeable.width, size.width.roundToPx())
+            } else {
+                placeable.width
+            }
+        val height =
+            if (enforcement) {
+                maxOf(placeable.height, size.height.roundToPx())
+            } else {
+                placeable.height
+            }
 
         return layout(width, height) {
             val centerX = ((width - placeable.width) / 2f).roundToInt()
@@ -103,34 +105,34 @@
 
 /**
  * CompositionLocal that configures whether Material components that have a visual size that is
- * lower than the minimum touch target size for accessibility (such as [Button]) will include
- * extra space outside the component to ensure that they are accessible. If set to false there
- * will be no extra space, and so it is possible that if the component is placed near the edge of
- * a layout / near to another component without any padding, there will not be enough space for
- * an accessible touch target.
+ * lower than the minimum touch target size for accessibility (such as [Button]) will include extra
+ * space outside the component to ensure that they are accessible. If set to false there will be no
+ * extra space, and so it is possible that if the component is placed near the edge of a layout /
+ * near to another component without any padding, there will not be enough space for an accessible
+ * touch target.
  */
 @Suppress("OPT_IN_MARKER_ON_WRONG_TARGET")
 @get:ExperimentalMaterialApi
 @ExperimentalMaterialApi
 val LocalMinimumInteractiveComponentEnforcement: ProvidableCompositionLocal<Boolean> =
-    staticCompositionLocalOf { true }
+    staticCompositionLocalOf {
+        true
+    }
 
 /**
  * CompositionLocal that configures whether Material components that have a visual size that is
- * lower than the minimum touch target size for accessibility (such as [Button]) will include
- * extra space outside the component to ensure that they are accessible. If set to false there
- * will be no extra space, and so it is possible that if the component is placed near the edge of
- * a layout / near to another component without any padding, there will not be enough space for
- * an accessible touch target.
+ * lower than the minimum touch target size for accessibility (such as [Button]) will include extra
+ * space outside the component to ensure that they are accessible. If set to false there will be no
+ * extra space, and so it is possible that if the component is placed near the edge of a layout /
+ * near to another component without any padding, there will not be enough space for an accessible
+ * touch target.
  */
 @Suppress("OPT_IN_MARKER_ON_WRONG_TARGET")
 @get:ExperimentalMaterialApi
 @ExperimentalMaterialApi
 @Deprecated(
     message = "Use LocalMinimumInteractiveComponentEnforcement instead.",
-    replaceWith = ReplaceWith(
-        "LocalMinimumInteractiveComponentEnforcement"
-    ),
+    replaceWith = ReplaceWith("LocalMinimumInteractiveComponentEnforcement"),
     level = DeprecationLevel.WARNING
 )
 val LocalMinimumTouchTargetEnforcement: ProvidableCompositionLocal<Boolean> =
diff --git a/compose/material/material/src/commonMain/kotlin/androidx/compose/material/InternalMutatorMutex.kt b/compose/material/material/src/commonMain/kotlin/androidx/compose/material/InternalMutatorMutex.kt
index 4a3e51c6..0ffc3db 100644
--- a/compose/material/material/src/commonMain/kotlin/androidx/compose/material/InternalMutatorMutex.kt
+++ b/compose/material/material/src/commonMain/kotlin/androidx/compose/material/InternalMutatorMutex.kt
@@ -24,29 +24,33 @@
 import kotlinx.coroutines.sync.Mutex
 import kotlinx.coroutines.sync.withLock
 
-/*** This is an internal copy of androidx.compose.foundation.MutatorMutex with an additional
- * tryMutate method. Do not modify, except for tryMutate. ***/
-
+/**
+ * This is an internal copy of androidx.compose.foundation.MutatorMutex with an additional tryMutate
+ * method. Do not modify, except for tryMutate. **
+ */
 internal expect class InternalAtomicReference<V>(value: V) {
     fun get(): V
+
     fun set(value: V)
+
     fun getAndSet(value: V): V
+
     fun compareAndSet(expect: V, newValue: V): Boolean
 }
 
 /**
  * Mutual exclusion for UI state mutation over time.
  *
- * [mutate] permits interruptible state mutation over time using a standard [MutatePriority].
- * A [InternalMutatorMutex] enforces that only a single writer can be active at a time for a particular
- * state resource. Instead of queueing callers that would acquire the lock like a traditional
- * [Mutex], new attempts to [mutate] the guarded state will either cancel the current mutator or
- * if the current mutator has a higher priority, the new caller will throw [CancellationException].
+ * [mutate] permits interruptible state mutation over time using a standard [MutatePriority]. A
+ * [InternalMutatorMutex] enforces that only a single writer can be active at a time for a
+ * particular state resource. Instead of queueing callers that would acquire the lock like a
+ * traditional [Mutex], new attempts to [mutate] the guarded state will either cancel the current
+ * mutator or if the current mutator has a higher priority, the new caller will throw
+ * [CancellationException].
  *
- * [InternalMutatorMutex] should be used for implementing hoisted state objects that many mutators may
- * want to manipulate over time such that those mutators can coordinate with one another. The
+ * [InternalMutatorMutex] should be used for implementing hoisted state objects that many mutators
+ * may want to manipulate over time such that those mutators can coordinate with one another. The
  * [InternalMutatorMutex] instance should be hidden as an implementation detail. For example:
- *
  */
 @Stable
 internal class InternalMutatorMutex {
@@ -77,14 +81,14 @@
      * If [mutate] is called while another call to [mutate] or [mutateWith] is in progress, their
      * [priority] values are compared. If the new caller has a [priority] equal to or higher than
      * the call in progress, the call in progress will be cancelled, throwing
-     * [CancellationException] and the new caller's [block] will be invoked. If the call in
-     * progress had a higher [priority] than the new caller, the new caller will throw
+     * [CancellationException] and the new caller's [block] will be invoked. If the call in progress
+     * had a higher [priority] than the new caller, the new caller will throw
      * [CancellationException] without invoking [block].
      *
-     * @param priority the priority of this mutation; [MutatePriority.Default] by default.
-     * Higher priority mutations will interrupt lower priority mutations.
+     * @param priority the priority of this mutation; [MutatePriority.Default] by default. Higher
+     *   priority mutations will interrupt lower priority mutations.
      * @param block mutation code to run mutually exclusive with any other call to [mutate],
-     * [mutateWith] or [tryMutate].
+     *   [mutateWith] or [tryMutate].
      */
     suspend fun <R> mutate(
         priority: MutatePriority = MutatePriority.Default,
@@ -107,22 +111,22 @@
      * Enforce that only a single caller may be active at a time.
      *
      * If [mutateWith] is called while another call to [mutate] or [mutateWith] is in progress,
-     * their [priority] values are compared. If the new caller has a [priority] equal to or
-     * higher than the call in progress, the call in progress will be cancelled, throwing
-     * [CancellationException] and the new caller's [block] will be invoked. If the call in
-     * progress had a higher [priority] than the new caller, the new caller will throw
+     * their [priority] values are compared. If the new caller has a [priority] equal to or higher
+     * than the call in progress, the call in progress will be cancelled, throwing
+     * [CancellationException] and the new caller's [block] will be invoked. If the call in progress
+     * had a higher [priority] than the new caller, the new caller will throw
      * [CancellationException] without invoking [block].
      *
-     * This variant of [mutate] calls its [block] with a [receiver], removing the need to create
-     * an additional capturing lambda to invoke it with a receiver object. This can be used to
-     * expose a mutable scope to the provided [block] while leaving the rest of the state object
-     * read-only. For example:
+     * This variant of [mutate] calls its [block] with a [receiver], removing the need to create an
+     * additional capturing lambda to invoke it with a receiver object. This can be used to expose a
+     * mutable scope to the provided [block] while leaving the rest of the state object read-only.
+     * For example:
      *
      * @param receiver the receiver `this` that [block] will be called with
-     * @param priority the priority of this mutation; [MutatePriority.Default] by default.
-     * Higher priority mutations will interrupt lower priority mutations.
+     * @param priority the priority of this mutation; [MutatePriority.Default] by default. Higher
+     *   priority mutations will interrupt lower priority mutations.
      * @param block mutation code to run mutually exclusive with any other call to [mutate],
-     * [mutateWith] or [tryMutate].
+     *   [mutateWith] or [tryMutate].
      */
     suspend fun <T, R> mutateWith(
         receiver: T,
@@ -143,18 +147,17 @@
     }
 
     /**
-     * Attempt to mutate synchronously if there is no other active caller.
-     * If there is no other active caller, the [block] will be executed in a lock. If there is
-     * another active caller, this method will return false, indicating that the active caller
-     * needs to be cancelled through a [mutate] or [mutateWith] call with an equal or higher
-     * mutation priority.
+     * Attempt to mutate synchronously if there is no other active caller. If there is no other
+     * active caller, the [block] will be executed in a lock. If there is another active caller,
+     * this method will return false, indicating that the active caller needs to be cancelled
+     * through a [mutate] or [mutateWith] call with an equal or higher mutation priority.
      *
      * Calls to [mutate] and [mutateWith] will suspend until execution of the [block] has finished.
      *
      * @param block mutation code to run mutually exclusive with any other call to [mutate],
-     * [mutateWith] or [tryMutate].
+     *   [mutateWith] or [tryMutate].
      * @return true if the [block] was executed, false if there was another active caller and the
-     * [block] was not executed.
+     *   [block] was not executed.
      */
     fun tryMutate(block: () -> Unit): Boolean {
         val didLock = mutex.tryLock()
diff --git a/compose/material/material/src/commonMain/kotlin/androidx/compose/material/ListItem.kt b/compose/material/material/src/commonMain/kotlin/androidx/compose/material/ListItem.kt
index 2a24638..c345415 100644
--- a/compose/material/material/src/commonMain/kotlin/androidx/compose/material/ListItem.kt
+++ b/compose/material/material/src/commonMain/kotlin/androidx/compose/material/ListItem.kt
@@ -43,24 +43,30 @@
 import kotlin.math.max
 
 /**
- * <a href="https://material.io/components/lists" class="external" target="_blank">Material Design list</a> item.
+ * <a href="https://material.io/components/lists" class="external" target="_blank">Material Design
+ * list</a> item.
  *
  * Lists are continuous, vertical indexes of text or images.
  *
- * ![Lists image](https://developer.android.com/images/reference/androidx/compose/material/lists.png)
+ * ![Lists
+ * image](https://developer.android.com/images/reference/androidx/compose/material/lists.png)
  *
- * To make this [ListItem] clickable, use [Modifier.clickable].
- * To add a background to the [ListItem], wrap it with a [Surface].
+ * To make this [ListItem] clickable, use [Modifier.clickable]. To add a background to the
+ * [ListItem], wrap it with a [Surface].
  *
  * This component can be used to achieve the list item templates existing in the spec. For example:
  * - one-line items
+ *
  * @sample androidx.compose.material.samples.OneLineListItems
  * - two-line items
+ *
  * @sample androidx.compose.material.samples.TwoLineListItems
  * - three-line items
+ *
  * @sample androidx.compose.material.samples.ThreeLineListItems
  *
  * You can combine this component with a checkbox or switch as in the following examples:
+ *
  * @sample androidx.compose.material.samples.ClickableListItems
  *
  * @param modifier Modifier to be applied to the list item
@@ -154,20 +160,24 @@
                             bottom = IconVerticalPadding
                         ),
                     contentAlignment = Alignment.CenterStart
-                ) { icon() }
+                ) {
+                    icon()
+                }
             }
             Box(
                 Modifier.weight(1f)
                     .align(Alignment.CenterVertically)
                     .padding(start = ContentLeftPadding, end = ContentRightPadding),
                 contentAlignment = Alignment.CenterStart
-            ) { text() }
+            ) {
+                text()
+            }
             if (trailing != null) {
                 Box(
-                    Modifier
-                        .align(Alignment.CenterVertically)
-                        .padding(end = TrailingRightPadding)
-                ) { trailing() }
+                    Modifier.align(Alignment.CenterVertically).padding(end = TrailingRightPadding)
+                ) {
+                    trailing()
+                }
             }
         }
     }
@@ -207,13 +217,12 @@
     ) {
         val minHeight = if (icon == null) MinHeight else MinHeightWithIcon
         Row(modifier.heightIn(min = minHeight)) {
-            val columnModifier = Modifier.weight(1f)
-                .padding(start = ContentLeftPadding, end = ContentRightPadding)
+            val columnModifier =
+                Modifier.weight(1f).padding(start = ContentLeftPadding, end = ContentRightPadding)
 
             if (icon != null) {
                 Box(
-                    Modifier
-                        .sizeIn(
+                    Modifier.sizeIn(
                             minWidth = IconLeftPadding + IconMinPaddedWidth,
                             minHeight = minHeight
                         )
@@ -223,7 +232,9 @@
                             bottom = IconVerticalPadding
                         ),
                     contentAlignment = Alignment.TopStart
-                ) { icon() }
+                ) {
+                    icon()
+                }
             }
 
             if (overlineText != null) {
@@ -264,10 +275,11 @@
                 ) {
                     Box(
                         // TODO(popam): find way to center and wrap content without minHeight
-                        Modifier.heightIn(min = minHeight)
-                            .padding(end = TrailingRightPadding),
+                        Modifier.heightIn(min = minHeight).padding(end = TrailingRightPadding),
                         contentAlignment = Alignment.Center
-                    ) { trailing() }
+                    ) {
+                        trailing()
+                    }
                 }
             }
         }
@@ -307,15 +319,16 @@
             if (icon != null) {
                 val minSize = IconLeftPadding + IconMinPaddedWidth
                 Box(
-                    Modifier
-                        .sizeIn(minWidth = minSize, minHeight = minSize)
+                    Modifier.sizeIn(minWidth = minSize, minHeight = minSize)
                         .padding(
                             start = IconLeftPadding,
                             top = IconThreeLineVerticalPadding,
                             bottom = IconThreeLineVerticalPadding
                         ),
                     contentAlignment = Alignment.CenterStart
-                ) { icon() }
+                ) {
+                    icon()
+                }
             }
             BaselinesOffsetColumn(
                 listOf(
@@ -323,8 +336,7 @@
                     ThreeLineBaselineSecondOffset,
                     ThreeLineBaselineThirdOffset
                 ),
-                Modifier.weight(1f)
-                    .padding(start = ContentLeftPadding, end = ContentRightPadding)
+                Modifier.weight(1f).padding(start = ContentLeftPadding, end = ContentRightPadding)
             ) {
                 if (overlineText != null) overlineText()
                 text()
@@ -342,9 +354,9 @@
 }
 
 /**
- * Layout that expects [Text] children, and positions them with specific offsets between the
- * top of the layout and the first text, as well as the last baseline and first baseline
- * for subsequent pairs of texts.
+ * Layout that expects [Text] children, and positions them with specific offsets between the top of
+ * the layout and the first text, as well as the last baseline and first baseline for subsequent
+ * pairs of texts.
  */
 // TODO(popam): consider making this a layout composable in `foundation-layout`.
 @Composable
@@ -357,19 +369,17 @@
         val childConstraints = constraints.copy(minHeight = 0, maxHeight = Constraints.Infinity)
         val placeables = measurables.fastMap { it.measure(childConstraints) }
 
-        val containerWidth = placeables.fastFold(0) { maxWidth, placeable ->
-            max(maxWidth, placeable.width)
-        }
+        val containerWidth =
+            placeables.fastFold(0) { maxWidth, placeable -> max(maxWidth, placeable.width) }
         val y = Array(placeables.size) { 0 }
         var containerHeight = 0
         placeables.fastForEachIndexed { index, placeable ->
-            val toPreviousBaseline = if (index > 0) {
-                placeables[index - 1].height - placeables[index - 1][LastBaseline]
-            } else 0
-            val topPadding = max(
-                0,
-                offsets[index].roundToPx() - placeable[FirstBaseline] - toPreviousBaseline
-            )
+            val toPreviousBaseline =
+                if (index > 0) {
+                    placeables[index - 1].height - placeables[index - 1][LastBaseline]
+                } else 0
+            val topPadding =
+                max(0, offsets[index].roundToPx() - placeable[FirstBaseline] - toPreviousBaseline)
             y[index] = topPadding + containerHeight
             containerHeight += topPadding + placeable.height
         }
@@ -384,9 +394,8 @@
 
 /**
  * Layout that takes a child and adds the necessary padding such that the first baseline of the
- * child is at a specific offset from the top of the container. If the child does not have
- * a first baseline, the layout will match the minHeight constraint and will center the
- * child.
+ * child is at a specific offset from the top of the container. If the child does not have a first
+ * baseline, the layout will match the minHeight constraint and will center the child.
  */
 // TODO(popam): support fallback alignment in AlignmentLineOffset, and use that here.
 @Composable
@@ -405,15 +414,15 @@
             containerHeight = max(constraints.minHeight, y + placeable.height)
         } else {
             containerHeight = max(constraints.minHeight, placeable.height)
-            y = Alignment.Center.align(
-                IntSize.Zero,
-                IntSize(0, containerHeight - placeable.height),
-                layoutDirection
-            ).y
+            y =
+                Alignment.Center.align(
+                        IntSize.Zero,
+                        IntSize(0, containerHeight - placeable.height),
+                        layoutDirection
+                    )
+                    .y
         }
-        layout(placeable.width, containerHeight) {
-            placeable.placeRelative(0, y)
-        }
+        layout(placeable.width, containerHeight) { placeable.placeRelative(0, y) }
     }
 }
 
@@ -423,10 +432,11 @@
     icon: @Composable (() -> Unit)?
 ): @Composable (() -> Unit)? {
     if (icon == null) return null
-    val lineHeightStyle = LineHeightStyle(
-        alignment = LineHeightStyle.Alignment.Proportional,
-        trim = LineHeightStyle.Trim.Both,
-    )
+    val lineHeightStyle =
+        LineHeightStyle(
+            alignment = LineHeightStyle.Alignment.Proportional,
+            trim = LineHeightStyle.Trim.Both,
+        )
     return {
         CompositionLocalProvider(LocalContentAlpha provides contentAlpha) {
             ProvideTextStyle(textStyle.copy(lineHeightStyle = lineHeightStyle), icon)
diff --git a/compose/material/material/src/commonMain/kotlin/androidx/compose/material/MaterialTextSelectionColors.kt b/compose/material/material/src/commonMain/kotlin/androidx/compose/material/MaterialTextSelectionColors.kt
index 3cbb183..926f27e 100644
--- a/compose/material/material/src/commonMain/kotlin/androidx/compose/material/MaterialTextSelectionColors.kt
+++ b/compose/material/material/src/commonMain/kotlin/androidx/compose/material/MaterialTextSelectionColors.kt
@@ -27,8 +27,8 @@
 import kotlin.math.min
 
 /**
- * Remembers a [TextSelectionColors] based on [colors]. The handle color will be [Colors.primary] and
- * the background color will be [Colors.primary] with alpha applied.
+ * Remembers a [TextSelectionColors] based on [colors]. The handle color will be [Colors.primary]
+ * and the background color will be [Colors.primary] with alpha applied.
  *
  * See [calculateSelectionBackgroundColor].
  */
@@ -39,40 +39,39 @@
     // Test with ContentAlpha.medium to ensure that the selection background is accessible in the
     // 'worst case' scenario. We explicitly don't test with ContentAlpha.disabled, as disabled
     // text shouldn't be selectable / is noted as disabled for accessibility purposes.
-    val textColorWithLowestAlpha = colors.contentColorFor(backgroundColor)
-        .takeOrElse {
-            LocalContentColor.current
-        }.copy(
-            alpha = ContentAlpha.medium
-        )
+    val textColorWithLowestAlpha =
+        colors
+            .contentColorFor(backgroundColor)
+            .takeOrElse { LocalContentColor.current }
+            .copy(alpha = ContentAlpha.medium)
     return remember(primaryColor, backgroundColor, textColorWithLowestAlpha) {
         TextSelectionColors(
             handleColor = colors.primary,
-            backgroundColor = calculateSelectionBackgroundColor(
-                selectionColor = primaryColor,
-                textColor = textColorWithLowestAlpha,
-                backgroundColor = backgroundColor
-            )
+            backgroundColor =
+                calculateSelectionBackgroundColor(
+                    selectionColor = primaryColor,
+                    textColor = textColorWithLowestAlpha,
+                    backgroundColor = backgroundColor
+                )
         )
     }
 }
 
 /**
- * Best-effort calculates a color (with alpha) for the selection background that (if possible)
- * will have at least [DesiredContrastRatio] with [textColor], when the selection background
- * is on top of [backgroundColor].
+ * Best-effort calculates a color (with alpha) for the selection background that (if possible) will
+ * have at least [DesiredContrastRatio] with [textColor], when the selection background is on top of
+ * [backgroundColor].
  *
- * Since this is a minimum contrast ratio, [textColor] should have the lowest alpha that
- * may be applied to content so we can ensure that the selection background color is accessible
- * in that worst-case scenario for contrast.
+ * Since this is a minimum contrast ratio, [textColor] should have the lowest alpha that may be
+ * applied to content so we can ensure that the selection background color is accessible in that
+ * worst-case scenario for contrast.
  *
  * @param selectionColor the 'raw' (without alpha) selection color that we should search alpha for
  * @param textColor the color of text with minimal alpha applied to test for contrast with
  * @param backgroundColor the color of the background that the selection color will typically be
- * placed against
- *
- * @return a resulting [selectionColor] with alpha applied that results in acceptable contrast
- * (if possible with the values for [selectionColor], [textColor] and [backgroundColor]).
+ *   placed against
+ * @return a resulting [selectionColor] with alpha applied that results in acceptable contrast (if
+ *   possible with the values for [selectionColor], [textColor] and [backgroundColor]).
  */
 /*@VisibleForTesting*/
 internal fun calculateSelectionBackgroundColor(
@@ -80,31 +79,36 @@
     textColor: Color,
     backgroundColor: Color
 ): Color {
-    val maximumContrastRatio = calculateContrastRatio(
-        selectionColor = selectionColor,
-        selectionColorAlpha = DefaultSelectionBackgroundAlpha,
-        textColor = textColor,
-        backgroundColor = backgroundColor
-    )
-
-    val minimumContrastRatio = calculateContrastRatio(
-        selectionColor = selectionColor,
-        selectionColorAlpha = MinimumSelectionBackgroundAlpha,
-        textColor = textColor,
-        backgroundColor = backgroundColor
-    )
-
-    val alpha = when {
-        // If the default alpha has enough contrast, use that
-        maximumContrastRatio >= DesiredContrastRatio -> DefaultSelectionBackgroundAlpha
-        // If the minimum alpha still does not have enough contrast, just use the minimum and return
-        minimumContrastRatio < DesiredContrastRatio -> MinimumSelectionBackgroundAlpha
-        else -> binarySearchForAccessibleSelectionColorAlpha(
+    val maximumContrastRatio =
+        calculateContrastRatio(
             selectionColor = selectionColor,
+            selectionColorAlpha = DefaultSelectionBackgroundAlpha,
             textColor = textColor,
             backgroundColor = backgroundColor
         )
-    }
+
+    val minimumContrastRatio =
+        calculateContrastRatio(
+            selectionColor = selectionColor,
+            selectionColorAlpha = MinimumSelectionBackgroundAlpha,
+            textColor = textColor,
+            backgroundColor = backgroundColor
+        )
+
+    val alpha =
+        when {
+            // If the default alpha has enough contrast, use that
+            maximumContrastRatio >= DesiredContrastRatio -> DefaultSelectionBackgroundAlpha
+            // If the minimum alpha still does not have enough contrast, just use the minimum and
+            // return
+            minimumContrastRatio < DesiredContrastRatio -> MinimumSelectionBackgroundAlpha
+            else ->
+                binarySearchForAccessibleSelectionColorAlpha(
+                    selectionColor = selectionColor,
+                    textColor = textColor,
+                    backgroundColor = backgroundColor
+                )
+        }
 
     return selectionColor.copy(alpha = alpha)
 }
@@ -116,25 +120,24 @@
  * The resulting alpha will be within the range of [MinimumSelectionBackgroundAlpha] and
  * [DefaultSelectionBackgroundAlpha] - since not all values for [selectionColor], [textColor] and
  * [backgroundColor] can be guaranteed to produce an accessible contrast ratio, this is a
- * best-effort attempt and [MinimumSelectionBackgroundAlpha] might still not produce an
- * accessible contrast ratio. In this case developers are encouraged to manually choose a
- * different color for selection that _is_ accessible with their chosen content and background
- * colors.
+ * best-effort attempt and [MinimumSelectionBackgroundAlpha] might still not produce an accessible
+ * contrast ratio. In this case developers are encouraged to manually choose a different color for
+ * selection that _is_ accessible with their chosen content and background colors.
  *
- * Caps the number of attempts at 7 for performance and to avoid infinite searching when there is
- * no value that results in an accessible contrast ratio. Because alpha is limited to [0,1], 7
- * steps results in a precision of ~0.01, since log2(1/0.01) ≈ 7.
+ * Caps the number of attempts at 7 for performance and to avoid infinite searching when there is no
+ * value that results in an accessible contrast ratio. Because alpha is limited to [0,1], 7 steps
+ * results in a precision of ~0.01, since log2(1/0.01) ≈ 7.
  *
  * Note: binary searching here is chosen since it is not possible to 'solve' for alpha, since the
- * transformation from color -> contrast ratio is not linear (the gamma exponent for sRGB colors
- * is 2.4). We can approximate this to 2, but this results in not that accurate solutions, and we
- * need to guarantee that they are at least above [DesiredContrastRatio] - falling just below is
- * not an acceptable result.
+ * transformation from color -> contrast ratio is not linear (the gamma exponent for sRGB colors is
+ * 2.4). We can approximate this to 2, but this results in not that accurate solutions, and we need
+ * to guarantee that they are at least above [DesiredContrastRatio] - falling just below is not an
+ * acceptable result.
  *
  * @param selectionColor the 'raw' (without alpha) selection color that we should search alpha for
  * @param textColor the color of text with minimal alpha applied to test for contrast with
  * @param backgroundColor the color of the background that the selection color will typically be
- * placed against
+ *   placed against
  */
 private fun binarySearchForAccessibleSelectionColorAlpha(
     selectionColor: Color,
@@ -149,12 +152,13 @@
     var highAlpha = DefaultSelectionBackgroundAlpha
 
     while (attempts < maxAttempts) {
-        val contrastRatio = calculateContrastRatio(
-            selectionColor = selectionColor,
-            selectionColorAlpha = alpha,
-            textColor = textColor,
-            backgroundColor = backgroundColor
-        )
+        val contrastRatio =
+            calculateContrastRatio(
+                selectionColor = selectionColor,
+                selectionColorAlpha = alpha,
+                textColor = textColor,
+                backgroundColor = backgroundColor
+            )
 
         // Percentage error of the calculated contrast compared to the actual contrast. Positive
         // numbers here mean we have higher contrast than needed.
@@ -176,8 +180,8 @@
 
 // TODO: this and other utilities might want to be commonized / made public at some point.
 /**
- * Calculates the contrast ratio of [textColor] against [selectionColor] with
- * [selectionColorAlpha], all on top of [backgroundColor].
+ * Calculates the contrast ratio of [textColor] against [selectionColor] with [selectionColorAlpha],
+ * all on top of [backgroundColor].
  *
  * Both the [selectionColor] and [textColor] will be composited to handle transparency.
  *
@@ -185,8 +189,7 @@
  * @param selectionColorAlpha the alpha for [selectionColor] to test contrast with
  * @param textColor the color of text with minimal alpha applied to test for contrast with
  * @param backgroundColor the color of the background that the selection color will typically be
- * placed against
- *
+ *   placed against
  * @return the contrast ratio as a value between 1 and 21. See [calculateContrastRatio]
  */
 private fun calculateContrastRatio(
@@ -195,17 +198,18 @@
     textColor: Color,
     backgroundColor: Color
 ): Float {
-    val compositeBackground = selectionColor.copy(alpha = selectionColorAlpha)
-        .compositeOver(backgroundColor)
+    val compositeBackground =
+        selectionColor.copy(alpha = selectionColorAlpha).compositeOver(backgroundColor)
     val compositeTextColor = textColor.compositeOver(compositeBackground)
     return calculateContrastRatio(compositeTextColor, compositeBackground)
 }
 
 /**
- * Calculates the contrast ratio of [foreground] against [background], returning a value between
- * 1 and 21. (1:1 and 21:1 ratios).
+ * Calculates the contrast ratio of [foreground] against [background], returning a value between 1
+ * and 21. (1:1 and 21:1 ratios).
  *
- * Formula taken from [WCAG 2.0](https://www.w3.org/TR/UNDERSTANDING-WCAG20/visual-audio-contrast-contrast.html#contrast-ratiodef)
+ * Formula taken from
+ * [WCAG 2.0](https://www.w3.org/TR/UNDERSTANDING-WCAG20/visual-audio-contrast-contrast.html#contrast-ratiodef)
  *
  * Note: [foreground] and [background] *must* be opaque. See [Color.compositeOver] to pre-composite
  * a translucent foreground over the background.
@@ -228,14 +232,12 @@
 private const val DefaultSelectionBackgroundAlpha = 0.4f
 
 /**
- * Not all combinations of text color and selection color will have a reasonable alpha that
- * produces a contrast ratio of at least [DesiredContrastRatio] - in this case just pick a low
- * but still visible alpha so at least the contrast ratio is as good as it can be - this is
- * preferable to crashing at runtime.
+ * Not all combinations of text color and selection color will have a reasonable alpha that produces
+ * a contrast ratio of at least [DesiredContrastRatio] - in this case just pick a low but still
+ * visible alpha so at least the contrast ratio is as good as it can be - this is preferable to
+ * crashing at runtime.
  */
 private const val MinimumSelectionBackgroundAlpha = DefaultSelectionBackgroundAlpha / 2f
 
-/**
- * Material and WCAG 2.0 sc 1.4.3 minimum contrast for AA text
- */
+/** Material and WCAG 2.0 sc 1.4.3 minimum contrast for AA text */
 private const val DesiredContrastRatio = 4.5f
diff --git a/compose/material/material/src/commonMain/kotlin/androidx/compose/material/MaterialTheme.kt b/compose/material/material/src/commonMain/kotlin/androidx/compose/material/MaterialTheme.kt
index b8fa051..2923d89 100644
--- a/compose/material/material/src/commonMain/kotlin/androidx/compose/material/MaterialTheme.kt
+++ b/compose/material/material/src/commonMain/kotlin/androidx/compose/material/MaterialTheme.kt
@@ -24,7 +24,8 @@
 import androidx.compose.runtime.remember
 
 /**
- * <a href="https://material.io/design/material-theming/overview.html" class="external" target="_blank">Material Theming</a>.
+ * <a href="https://material.io/design/material-theming/overview.html" class="external"
+ * target="_blank">Material Theming</a>.
  *
  * Material Theming refers to the customization of your Material Design app to better reflect your
  * product’s brand.
@@ -32,18 +33,21 @@
  * Material components such as [Button] and [Checkbox] use values provided here when retrieving
  * default values.
  *
- * It defines colors as specified in the [Material Color theme creation spec](https://material.io/design/color/the-color-system.html#color-theme-creation),
- * typography defined in the [Material Type Scale spec](https://material.io/design/typography/the-type-system.html#type-scale),
- * and shapes defined in the [Shape scheme](https://material.io/design/shape/applying-shape-to-ui.html#shape-scheme).
+ * It defines colors as specified in the
+ * [Material Color theme creation spec](https://material.io/design/color/the-color-system.html#color-theme-creation),
+ * typography defined in the
+ * [Material Type Scale spec](https://material.io/design/typography/the-type-system.html#type-scale),
+ * and shapes defined in the
+ * [Shape scheme](https://material.io/design/shape/applying-shape-to-ui.html#shape-scheme).
  *
  * All values may be set by providing this component with the [colors][Colors],
  * [typography][Typography], and [shapes][Shapes] attributes. Use this to configure the overall
  * theme of elements within this MaterialTheme.
  *
  * Any values that are not set will inherit the current value from the theme, falling back to the
- * defaults if there is no parent MaterialTheme. This allows using a MaterialTheme at the top
- * of your application, and then separate MaterialTheme(s) for different screens / parts of your
- * UI, overriding only the parts of the theme definition that need to change.
+ * defaults if there is no parent MaterialTheme. This allows using a MaterialTheme at the top of
+ * your application, and then separate MaterialTheme(s) for different screens / parts of your UI,
+ * overriding only the parts of the theme definition that need to change.
  *
  * @sample androidx.compose.material.samples.MaterialThemeSample
  *
@@ -58,11 +62,13 @@
     shapes: Shapes = MaterialTheme.shapes,
     content: @Composable () -> Unit
 ) {
-    val rememberedColors = remember {
-        // Explicitly creating a new object here so we don't mutate the initial [colors]
-        // provided, and overwrite the values set in it.
-        colors.copy()
-    }.apply { updateColorsFrom(colors) }
+    val rememberedColors =
+        remember {
+                // Explicitly creating a new object here so we don't mutate the initial [colors]
+                // provided, and overwrite the values set in it.
+                colors.copy()
+            }
+            .apply { updateColorsFrom(colors) }
     val rippleIndication = rippleOrFallbackImplementation()
     val selectionColors = rememberTextSelectionColors(rememberedColors)
     @Suppress("DEPRECATION_ERROR")
@@ -76,18 +82,15 @@
         LocalTextSelectionColors provides selectionColors,
         LocalTypography provides typography
     ) {
-        ProvideTextStyle(value = typography.body1) {
-            PlatformMaterialTheme(content)
-        }
+        ProvideTextStyle(value = typography.body1) { PlatformMaterialTheme(content) }
     }
 }
 
-@Composable
-internal expect fun PlatformMaterialTheme(content: @Composable () -> Unit)
+@Composable internal expect fun PlatformMaterialTheme(content: @Composable () -> Unit)
 
 /**
- * Contains functions to access the current theme values provided at the call site's position in
- * the hierarchy.
+ * Contains functions to access the current theme values provided at the call site's position in the
+ * hierarchy.
  */
 object MaterialTheme {
     /**
@@ -96,9 +99,7 @@
      * @sample androidx.compose.material.samples.ThemeColorSample
      */
     val colors: Colors
-        @Composable
-        @ReadOnlyComposable
-        get() = LocalColors.current
+        @Composable @ReadOnlyComposable get() = LocalColors.current
 
     /**
      * Retrieves the current [Typography] at the call site's position in the hierarchy.
@@ -106,15 +107,9 @@
      * @sample androidx.compose.material.samples.ThemeTextStyleSample
      */
     val typography: Typography
-        @Composable
-        @ReadOnlyComposable
-        get() = LocalTypography.current
+        @Composable @ReadOnlyComposable get() = LocalTypography.current
 
-    /**
-     * Retrieves the current [Shapes] at the call site's position in the hierarchy.
-     */
+    /** Retrieves the current [Shapes] at the call site's position in the hierarchy. */
     val shapes: Shapes
-        @Composable
-        @ReadOnlyComposable
-        get() = LocalShapes.current
+        @Composable @ReadOnlyComposable get() = LocalShapes.current
 }
diff --git a/compose/material/material/src/commonMain/kotlin/androidx/compose/material/Menu.kt b/compose/material/material/src/commonMain/kotlin/androidx/compose/material/Menu.kt
index 284b927..eaa34ea 100644
--- a/compose/material/material/src/commonMain/kotlin/androidx/compose/material/Menu.kt
+++ b/compose/material/material/src/commonMain/kotlin/androidx/compose/material/Menu.kt
@@ -60,12 +60,14 @@
 import kotlin.math.min
 
 /**
- * <a href="https://material.io/components/menus#dropdown-menu" class="external" target="_blank">Material Design dropdown menu</a>.
+ * <a href="https://material.io/components/menus#dropdown-menu" class="external"
+ * target="_blank">Material Design dropdown menu</a>.
  *
  * A dropdown menu is a compact way of displaying multiple choices. It appears upon interaction with
  * an element (such as an icon or button) or when users perform a specific action.
  *
- * ![Menus image](https://developer.android.com/images/reference/androidx/compose/material/menus.png)
+ * ![Menus
+ * image](https://developer.android.com/images/reference/androidx/compose/material/menus.png)
  *
  * A [DropdownMenu] behaves similarly to a [Popup], and will use the position of the parent layout
  * to position itself on screen. Commonly a [DropdownMenu] will be placed in a [Box] with a sibling
@@ -73,12 +75,12 @@
  * space in a layout, as the menu is displayed in a separate window, on top of other content.
  *
  * The [content] of a [DropdownMenu] will typically be [DropdownMenuItem]s, as well as custom
- * content. Using [DropdownMenuItem]s will result in a menu that matches the Material
- * specification for menus. Also note that the [content] is placed inside a scrollable [Column],
- * so using a [LazyColumn] as the root layout inside [content] is unsupported.
+ * content. Using [DropdownMenuItem]s will result in a menu that matches the Material specification
+ * for menus. Also note that the [content] is placed inside a scrollable [Column], so using a
+ * [LazyColumn] as the root layout inside [content] is unsupported.
  *
- * [onDismissRequest] will be called when the menu should close - for example when there is a
- * tap outside the menu, or when the back key is pressed.
+ * [onDismissRequest] will be called when the menu should close - for example when there is a tap
+ * outside the menu, or when the back key is pressed.
  *
  * [DropdownMenu] changes its positioning depending on the available space, always trying to be
  * fully visible. Depending on layout direction, first it will try to align its start to the start
@@ -90,17 +92,19 @@
  * bounds of its parent do not coincide with its visual bounds.
  *
  * Example usage:
+ *
  * @sample androidx.compose.material.samples.MenuSample
  *
  * Example usage with a [ScrollState] to control the menu items scroll position:
+ *
  * @sample androidx.compose.material.samples.MenuWithScrollStateSample
  *
  * @param expanded whether the menu is expanded or not
  * @param onDismissRequest called when the user requests to dismiss the menu, such as by tapping
- * outside the menu's bounds
+ *   outside the menu's bounds
  * @param modifier [Modifier] to be applied to the menu's content
  * @param offset [DpOffset] from the original position of the menu. The offset respects the
- * [LayoutDirection], so the offset's x position will be added in LTR and subtracted in RTL.
+ *   [LayoutDirection], so the offset's x position will be added in LTR and subtracted in RTL.
  * @param scrollState a [ScrollState] to used by the menu's content for items vertical scrolling
  * @param properties [PopupProperties] for further customization of this popup's behavior
  * @param content the content of this dropdown menu, typically a [DropdownMenuItem]
@@ -117,21 +121,22 @@
 )
 
 /**
- * <a href="https://material.io/components/menus#dropdown-menu" class="external" target="_blank">Material Design dropdown menu</a> item.
- *
+ * <a href="https://material.io/components/menus#dropdown-menu" class="external"
+ * target="_blank">Material Design dropdown menu</a> item.
  *
  * Example usage:
+ *
  * @sample androidx.compose.material.samples.MenuSample
  *
  * @param onClick Called when the menu item was clicked
  * @param modifier The modifier to be applied to the menu item
- * @param enabled Controls the enabled state of the menu item - when `false`, the menu item
- * will not be clickable and [onClick] will not be invoked
+ * @param enabled Controls the enabled state of the menu item - when `false`, the menu item will not
+ *   be clickable and [onClick] will not be invoked
  * @param contentPadding the padding applied to the content of this menu item
  * @param interactionSource an optional hoisted [MutableInteractionSource] for observing and
- * emitting [Interaction]s for this menu item. You can use this to change the menu item's appearance
- * or preview the menu item in different states. Note that if `null` is provided, interactions will
- * still happen internally.
+ *   emitting [Interaction]s for this menu item. You can use this to change the menu item's
+ *   appearance or preview the menu item in different states. Note that if `null` is provided,
+ *   interactions will still happen internally.
  * @param content the content of this menu item
  */
 @Composable
@@ -155,65 +160,63 @@
     // Menu open/close animation.
     val transition = rememberTransition(expandedStates, "DropDownMenu")
 
-    val scale by transition.animateFloat(
-        transitionSpec = {
-            if (false isTransitioningTo true) {
-                // Dismissed to expanded
-                tween(
-                    durationMillis = InTransitionDuration,
-                    easing = LinearOutSlowInEasing
-                )
+    val scale by
+        transition.animateFloat(
+            transitionSpec = {
+                if (false isTransitioningTo true) {
+                    // Dismissed to expanded
+                    tween(durationMillis = InTransitionDuration, easing = LinearOutSlowInEasing)
+                } else {
+                    // Expanded to dismissed.
+                    tween(durationMillis = 1, delayMillis = OutTransitionDuration - 1)
+                }
+            }
+        ) {
+            if (it) {
+                // Menu is expanded.
+                1f
             } else {
-                // Expanded to dismissed.
-                tween(
-                    durationMillis = 1,
-                    delayMillis = OutTransitionDuration - 1
-                )
+                // Menu is dismissed.
+                0.8f
             }
         }
-    ) {
-        if (it) {
-            // Menu is expanded.
-            1f
-        } else {
-            // Menu is dismissed.
-            0.8f
-        }
-    }
 
-    val alpha by transition.animateFloat(
-        transitionSpec = {
-            if (false isTransitioningTo true) {
-                // Dismissed to expanded
-                tween(durationMillis = 30)
+    val alpha by
+        transition.animateFloat(
+            transitionSpec = {
+                if (false isTransitioningTo true) {
+                    // Dismissed to expanded
+                    tween(durationMillis = 30)
+                } else {
+                    // Expanded to dismissed.
+                    tween(durationMillis = OutTransitionDuration)
+                }
+            }
+        ) {
+            if (it) {
+                // Menu is expanded.
+                1f
             } else {
-                // Expanded to dismissed.
-                tween(durationMillis = OutTransitionDuration)
+                // Menu is dismissed.
+                0f
             }
         }
-    ) {
-        if (it) {
-            // Menu is expanded.
-            1f
-        } else {
-            // Menu is dismissed.
-            0f
-        }
-    }
     Card(
-        modifier = Modifier.graphicsLayer {
-            scaleX = scale
-            scaleY = scale
-            this.alpha = alpha
-            transformOrigin = transformOriginState.value
-        },
+        modifier =
+            Modifier.graphicsLayer {
+                scaleX = scale
+                scaleY = scale
+                this.alpha = alpha
+                transformOrigin = transformOriginState.value
+            },
         elevation = MenuElevation
     ) {
         Column(
-            modifier = modifier
-                .padding(vertical = DropdownMenuVerticalPadding)
-                .width(IntrinsicSize.Max)
-                .verticalScroll(scrollState),
+            modifier =
+                modifier
+                    .padding(vertical = DropdownMenuVerticalPadding)
+                    .width(IntrinsicSize.Max)
+                    .verticalScroll(scrollState),
             content = content
         )
     }
@@ -230,44 +233,37 @@
 ) {
     // TODO(popam, b/156911853): investigate replacing this Row with ListItem
     Row(
-        modifier = modifier
-            .clickable(
-                enabled = enabled,
-                onClick = onClick,
-                interactionSource = interactionSource,
-                indication = rippleOrFallbackImplementation(true)
-            )
-            .fillMaxWidth()
-            // Preferred min and max width used during the intrinsic measurement.
-            .sizeIn(
-                minWidth = DropdownMenuItemDefaultMinWidth,
-                maxWidth = DropdownMenuItemDefaultMaxWidth,
-                minHeight = DropdownMenuItemDefaultMinHeight
-            )
-            .padding(contentPadding),
+        modifier =
+            modifier
+                .clickable(
+                    enabled = enabled,
+                    onClick = onClick,
+                    interactionSource = interactionSource,
+                    indication = rippleOrFallbackImplementation(true)
+                )
+                .fillMaxWidth()
+                // Preferred min and max width used during the intrinsic measurement.
+                .sizeIn(
+                    minWidth = DropdownMenuItemDefaultMinWidth,
+                    maxWidth = DropdownMenuItemDefaultMaxWidth,
+                    minHeight = DropdownMenuItemDefaultMinHeight
+                )
+                .padding(contentPadding),
         verticalAlignment = Alignment.CenterVertically
     ) {
         val typography = MaterialTheme.typography
         ProvideTextStyle(typography.subtitle1) {
             val contentAlpha = if (enabled) ContentAlpha.high else ContentAlpha.disabled
-            CompositionLocalProvider(LocalContentAlpha provides contentAlpha) {
-                content()
-            }
+            CompositionLocalProvider(LocalContentAlpha provides contentAlpha) { content() }
         }
     }
 }
 
-/**
- * Contains default values used for [DropdownMenuItem].
- */
+/** Contains default values used for [DropdownMenuItem]. */
 object MenuDefaults {
-    /**
-     * Default padding used for [DropdownMenuItem].
-     */
-    val DropdownMenuItemContentPadding = PaddingValues(
-        horizontal = DropdownMenuItemHorizontalPadding,
-        vertical = 0.dp
-    )
+    /** Default padding used for [DropdownMenuItem]. */
+    val DropdownMenuItemContentPadding =
+        PaddingValues(horizontal = DropdownMenuItemHorizontalPadding, vertical = 0.dp)
 }
 
 // TODO: Consider to move into public [MenuDefaults]
@@ -286,44 +282,37 @@
 internal const val InTransitionDuration = 120
 internal const val OutTransitionDuration = 75
 
-internal fun calculateTransformOrigin(
-    parentBounds: IntRect,
-    menuBounds: IntRect
-): TransformOrigin {
-    val pivotX = when {
-        menuBounds.left >= parentBounds.right -> 0f
-        menuBounds.right <= parentBounds.left -> 1f
-        menuBounds.width == 0 -> 0f
-        else -> {
-            val intersectionCenter =
-                (
-                    max(parentBounds.left, menuBounds.left) +
-                        min(parentBounds.right, menuBounds.right)
-                    ) / 2
-            (intersectionCenter - menuBounds.left).toFloat() / menuBounds.width
+internal fun calculateTransformOrigin(parentBounds: IntRect, menuBounds: IntRect): TransformOrigin {
+    val pivotX =
+        when {
+            menuBounds.left >= parentBounds.right -> 0f
+            menuBounds.right <= parentBounds.left -> 1f
+            menuBounds.width == 0 -> 0f
+            else -> {
+                val intersectionCenter =
+                    (max(parentBounds.left, menuBounds.left) +
+                        min(parentBounds.right, menuBounds.right)) / 2
+                (intersectionCenter - menuBounds.left).toFloat() / menuBounds.width
+            }
         }
-    }
-    val pivotY = when {
-        menuBounds.top >= parentBounds.bottom -> 0f
-        menuBounds.bottom <= parentBounds.top -> 1f
-        menuBounds.height == 0 -> 0f
-        else -> {
-            val intersectionCenter =
-                (
-                    max(parentBounds.top, menuBounds.top) +
-                        min(parentBounds.bottom, menuBounds.bottom)
-                    ) / 2
-            (intersectionCenter - menuBounds.top).toFloat() / menuBounds.height
+    val pivotY =
+        when {
+            menuBounds.top >= parentBounds.bottom -> 0f
+            menuBounds.bottom <= parentBounds.top -> 1f
+            menuBounds.height == 0 -> 0f
+            else -> {
+                val intersectionCenter =
+                    (max(parentBounds.top, menuBounds.top) +
+                        min(parentBounds.bottom, menuBounds.bottom)) / 2
+                (intersectionCenter - menuBounds.top).toFloat() / menuBounds.height
+            }
         }
-    }
     return TransformOrigin(pivotX, pivotY)
 }
 
 // Menu positioning.
 
-/**
- * Calculates the position of a Material [DropdownMenu].
- */
+/** Calculates the position of a Material [DropdownMenu]. */
 @Immutable
 internal data class DropdownMenuPositionProvider(
     val contentOffset: DpOffset,
@@ -339,9 +328,11 @@
         // The min margin above and below the menu, relative to the screen.
         val verticalMargin = with(density) { MenuVerticalMargin.roundToPx() }
         // The content offset specified using the dropdown offset parameter.
-        val contentOffsetX = with(density) {
-            contentOffset.x.roundToPx() * (if (layoutDirection == LayoutDirection.Ltr) 1 else -1)
-        }
+        val contentOffsetX =
+            with(density) {
+                contentOffset.x.roundToPx() *
+                    (if (layoutDirection == LayoutDirection.Ltr) 1 else -1)
+            }
         val contentOffsetY = with(density) { contentOffset.y.roundToPx() }
 
         // Compute horizontal position.
@@ -349,40 +340,45 @@
         val rightToAnchorRight = anchorBounds.right - popupContentSize.width + contentOffsetX
         val rightToWindowRight = windowSize.width - popupContentSize.width
         val leftToWindowLeft = 0
-        val x = if (layoutDirection == LayoutDirection.Ltr) {
-            sequenceOf(
-                leftToAnchorLeft,
-                rightToAnchorRight,
-                // If the anchor gets outside of the window on the left, we want to position
-                // toDisplayLeft for proximity to the anchor. Otherwise, toDisplayRight.
-                if (anchorBounds.left >= 0) rightToWindowRight else leftToWindowLeft
-            )
-        } else {
-            sequenceOf(
-                rightToAnchorRight,
-                leftToAnchorLeft,
-                // If the anchor gets outside of the window on the right, we want to position
-                // toDisplayRight for proximity to the anchor. Otherwise, toDisplayLeft.
-                if (anchorBounds.right <= windowSize.width) leftToWindowLeft else rightToWindowRight
-            )
-        }.firstOrNull {
-            it >= 0 && it + popupContentSize.width <= windowSize.width
-        } ?: rightToAnchorRight
+        val x =
+            if (layoutDirection == LayoutDirection.Ltr) {
+                    sequenceOf(
+                        leftToAnchorLeft,
+                        rightToAnchorRight,
+                        // If the anchor gets outside of the window on the left, we want to position
+                        // toDisplayLeft for proximity to the anchor. Otherwise, toDisplayRight.
+                        if (anchorBounds.left >= 0) rightToWindowRight else leftToWindowLeft
+                    )
+                } else {
+                    sequenceOf(
+                        rightToAnchorRight,
+                        leftToAnchorLeft,
+                        // If the anchor gets outside of the window on the right, we want to
+                        // position
+                        // toDisplayRight for proximity to the anchor. Otherwise, toDisplayLeft.
+                        if (anchorBounds.right <= windowSize.width) leftToWindowLeft
+                        else rightToWindowRight
+                    )
+                }
+                .firstOrNull { it >= 0 && it + popupContentSize.width <= windowSize.width }
+                ?: rightToAnchorRight
 
         // Compute vertical position.
         val topToAnchorBottom = maxOf(anchorBounds.bottom + contentOffsetY, verticalMargin)
         val bottomToAnchorTop = anchorBounds.top - popupContentSize.height + contentOffsetY
         val centerToAnchorTop = anchorBounds.top - popupContentSize.height / 2 + contentOffsetY
         val bottomToWindowBottom = windowSize.height - popupContentSize.height - verticalMargin
-        val y = sequenceOf(
-            topToAnchorBottom,
-            bottomToAnchorTop,
-            centerToAnchorTop,
-            bottomToWindowBottom
-        ).firstOrNull {
-            it >= verticalMargin &&
-                it + popupContentSize.height <= windowSize.height - verticalMargin
-        } ?: bottomToAnchorTop
+        val y =
+            sequenceOf(
+                    topToAnchorBottom,
+                    bottomToAnchorTop,
+                    centerToAnchorTop,
+                    bottomToWindowBottom
+                )
+                .firstOrNull {
+                    it >= verticalMargin &&
+                        it + popupContentSize.height <= windowSize.height - verticalMargin
+                } ?: bottomToAnchorTop
 
         onPositionCalculated(
             anchorBounds,
diff --git a/compose/material/material/src/commonMain/kotlin/androidx/compose/material/ModalBottomSheet.kt b/compose/material/material/src/commonMain/kotlin/androidx/compose/material/ModalBottomSheet.kt
index 65c3069..3dfde8d 100644
--- a/compose/material/material/src/commonMain/kotlin/androidx/compose/material/ModalBottomSheet.kt
+++ b/compose/material/material/src/commonMain/kotlin/androidx/compose/material/ModalBottomSheet.kt
@@ -68,23 +68,17 @@
 import kotlin.math.min
 import kotlinx.coroutines.launch
 
-/**
- * Possible values of [ModalBottomSheetState].
- */
+/** Possible values of [ModalBottomSheetState]. */
 enum class ModalBottomSheetValue {
-    /**
-     * The bottom sheet is not visible.
-     */
+    /** The bottom sheet is not visible. */
     Hidden,
 
-    /**
-     * The bottom sheet is visible at full height.
-     */
+    /** The bottom sheet is visible at full height. */
     Expanded,
 
     /**
-     * The bottom sheet is partially visible at 50% of the screen height. This state is only
-     * enabled if the height of the bottom sheet is more than 50% of the screen height.
+     * The bottom sheet is partially visible at 50% of the screen height. This state is only enabled
+     * if the height of the bottom sheet is more than 50% of the screen height.
      */
     HalfExpanded
 }
@@ -93,16 +87,16 @@
  * State of the [ModalBottomSheetLayout] composable.
  *
  * @param initialValue The initial value of the state. <b>Must not be set to
- * [ModalBottomSheetValue.HalfExpanded] if [isSkipHalfExpanded] is set to true.</b>
+ *   [ModalBottomSheetValue.HalfExpanded] if [isSkipHalfExpanded] is set to true.</b>
  * @param density The density that this state can use to convert values to and from dp.
  * @param confirmValueChange Optional callback invoked to confirm or veto a pending state change.
  * @param animationSpec The default animation that will be used to animate to a new state.
- * @param isSkipHalfExpanded Whether the half expanded state, if the sheet is tall enough, should
- * be skipped. If true, the sheet will always expand to the [Expanded] state and move to the
- * [Hidden] state when hiding the sheet, either programmatically or by user interaction.
- * <b>Must not be set to true if the initialValue is [ModalBottomSheetValue.HalfExpanded].</b>
- * If supplied with [ModalBottomSheetValue.HalfExpanded] for the initialValue, an
- * [IllegalArgumentException] will be thrown.
+ * @param isSkipHalfExpanded Whether the half expanded state, if the sheet is tall enough, should be
+ *   skipped. If true, the sheet will always expand to the [Expanded] state and move to the [Hidden]
+ *   state when hiding the sheet, either programmatically or by user interaction. <b>Must not be set
+ *   to true if the initialValue is [ModalBottomSheetValue.HalfExpanded].</b> If supplied with
+ *   [ModalBottomSheetValue.HalfExpanded] for the initialValue, an [IllegalArgumentException] will
+ *   be thrown.
  */
 @OptIn(ExperimentalMaterialApi::class)
 class ModalBottomSheetState(
@@ -113,21 +107,16 @@
     internal val isSkipHalfExpanded: Boolean = false,
 ) {
 
-    internal val anchoredDraggableState = AnchoredDraggableState(
-        initialValue = initialValue,
-        animationSpec = animationSpec,
-        confirmValueChange = confirmValueChange,
-        positionalThreshold = {
-            with(density) {
-                ModalBottomSheetPositionalThreshold.toPx()
-            }
-        },
-        velocityThreshold = { with(density) { ModalBottomSheetVelocityThreshold.toPx() } }
-    )
+    internal val anchoredDraggableState =
+        AnchoredDraggableState(
+            initialValue = initialValue,
+            animationSpec = animationSpec,
+            confirmValueChange = confirmValueChange,
+            positionalThreshold = { with(density) { ModalBottomSheetPositionalThreshold.toPx() } },
+            velocityThreshold = { with(density) { ModalBottomSheetVelocityThreshold.toPx() } }
+        )
 
-    /**
-     * The current value of the [ModalBottomSheetState].
-     */
+    /** The current value of the [ModalBottomSheetState]. */
     val currentValue: ModalBottomSheetValue
         get() = anchoredDraggableState.currentValue
 
@@ -159,23 +148,19 @@
      * @param to The end value used to calculate the distance
      */
     @FloatRange(from = 0.0, to = 1.0)
-    fun progress(
-        from: ModalBottomSheetValue,
-        to: ModalBottomSheetValue
-    ): Float {
+    fun progress(from: ModalBottomSheetValue, to: ModalBottomSheetValue): Float {
         val fromOffset = anchoredDraggableState.anchors.positionOf(from)
         val toOffset = anchoredDraggableState.anchors.positionOf(to)
-        val currentOffset = anchoredDraggableState.offset.coerceIn(
-            min(fromOffset, toOffset), // fromOffset might be > toOffset
-            max(fromOffset, toOffset)
-        )
+        val currentOffset =
+            anchoredDraggableState.offset.coerceIn(
+                min(fromOffset, toOffset), // fromOffset might be > toOffset
+                max(fromOffset, toOffset)
+            )
         val fraction = (currentOffset - fromOffset) / (toOffset - fromOffset)
         return if (fraction.isNaN()) 1f else abs(fraction)
     }
 
-    /**
-     * Whether the bottom sheet is visible.
-     */
+    /** Whether the bottom sheet is visible. */
     val isVisible: Boolean
         get() = anchoredDraggableState.currentValue != Hidden
 
@@ -198,10 +183,11 @@
      */
     suspend fun show() {
         val hasExpandedState = anchoredDraggableState.anchors.hasAnchorFor(Expanded)
-        val targetValue = when (currentValue) {
-            Hidden -> if (hasHalfExpandedState) HalfExpanded else Expanded
-            else -> if (hasExpandedState) Expanded else Hidden
-        }
+        val targetValue =
+            when (currentValue) {
+                Hidden -> if (hasHalfExpandedState) HalfExpanded else Expanded
+                else -> if (hasExpandedState) Expanded else Hidden
+            }
         animateTo(targetValue)
     }
 
@@ -245,27 +231,27 @@
 
     companion object {
         /**
-         * The default [Saver] implementation for [ModalBottomSheetState].
-         * Saves the [currentValue] and recreates a [ModalBottomSheetState] with the saved value as
-         * initial value.
+         * The default [Saver] implementation for [ModalBottomSheetState]. Saves the [currentValue]
+         * and recreates a [ModalBottomSheetState] with the saved value as initial value.
          */
         fun Saver(
             animationSpec: AnimationSpec<Float>,
             confirmValueChange: (ModalBottomSheetValue) -> Boolean,
             skipHalfExpanded: Boolean,
             density: Density
-        ): Saver<ModalBottomSheetState, *> = Saver(
-            save = { it.currentValue },
-            restore = {
-                ModalBottomSheetState(
-                    initialValue = it,
-                    density = density,
-                    animationSpec = animationSpec,
-                    isSkipHalfExpanded = skipHalfExpanded,
-                    confirmValueChange = confirmValueChange
-                )
-            }
-        )
+        ): Saver<ModalBottomSheetState, *> =
+            Saver(
+                save = { it.currentValue },
+                restore = {
+                    ModalBottomSheetState(
+                        initialValue = it,
+                        density = density,
+                        animationSpec = animationSpec,
+                        isSkipHalfExpanded = skipHalfExpanded,
+                        confirmValueChange = confirmValueChange
+                    )
+                }
+            )
     }
 }
 
@@ -275,12 +261,12 @@
  * @param initialValue The initial value of the state.
  * @param animationSpec The default animation that will be used to animate to a new state.
  * @param confirmValueChange Optional callback invoked to confirm or veto a pending state change.
- * @param skipHalfExpanded Whether the half expanded state, if the sheet is tall enough, should
- * be skipped. If true, the sheet will always expand to the [Expanded] state and move to the
- * [Hidden] state when hiding the sheet, either programmatically or by user interaction.
- * <b>Must not be set to true if the [initialValue] is [ModalBottomSheetValue.HalfExpanded].</b>
- * If supplied with [ModalBottomSheetValue.HalfExpanded] for the [initialValue], an
- * [IllegalArgumentException] will be thrown.
+ * @param skipHalfExpanded Whether the half expanded state, if the sheet is tall enough, should be
+ *   skipped. If true, the sheet will always expand to the [Expanded] state and move to the [Hidden]
+ *   state when hiding the sheet, either programmatically or by user interaction. <b>Must not be set
+ *   to true if the [initialValue] is [ModalBottomSheetValue.HalfExpanded].</b> If supplied with
+ *   [ModalBottomSheetValue.HalfExpanded] for the [initialValue], an [IllegalArgumentException] will
+ *   be thrown.
  */
 @Composable
 fun rememberModalBottomSheetState(
@@ -295,13 +281,18 @@
     // b/152014032
     return key(initialValue) {
         rememberSaveable(
-            initialValue, animationSpec, skipHalfExpanded, confirmValueChange, density,
-            saver = Saver(
-                density = density,
-                animationSpec = animationSpec,
-                skipHalfExpanded = skipHalfExpanded,
-                confirmValueChange = confirmValueChange
-            )
+            initialValue,
+            animationSpec,
+            skipHalfExpanded,
+            confirmValueChange,
+            density,
+            saver =
+                Saver(
+                    density = density,
+                    animationSpec = animationSpec,
+                    skipHalfExpanded = skipHalfExpanded,
+                    confirmValueChange = confirmValueChange
+                )
         ) {
             ModalBottomSheetState(
                 density = density,
@@ -315,13 +306,15 @@
 }
 
 /**
- * <a href="https://material.io/components/sheets-bottom#modal-bottom-sheet" class="external" target="_blank">Material Design modal bottom sheet</a>.
+ * <a href="https://material.io/components/sheets-bottom#modal-bottom-sheet" class="external"
+ * target="_blank">Material Design modal bottom sheet</a>.
  *
  * Modal bottom sheets present a set of choices while blocking interaction with the rest of the
- * screen. They are an alternative to inline menus and simple dialogs, providing
- * additional room for content, iconography, and actions.
+ * screen. They are an alternative to inline menus and simple dialogs, providing additional room for
+ * content, iconography, and actions.
  *
- * ![Modal bottom sheet image](https://developer.android.com/images/reference/androidx/compose/material/modal-bottom-sheet.png)
+ * ![Modal bottom sheet
+ * image](https://developer.android.com/images/reference/androidx/compose/material/modal-bottom-sheet.png)
  *
  * A simple example of a modal bottom sheet looks like this:
  *
@@ -335,12 +328,12 @@
  * @param sheetElevation The elevation of the bottom sheet.
  * @param sheetBackgroundColor The background color of the bottom sheet.
  * @param sheetContentColor The preferred content color provided by the bottom sheet to its
- * children. Defaults to the matching content color for [sheetBackgroundColor], or if that is not
- * a color from the theme, this will keep the same content color set above the bottom sheet.
+ *   children. Defaults to the matching content color for [sheetBackgroundColor], or if that is not
+ *   a color from the theme, this will keep the same content color set above the bottom sheet.
  * @param scrimColor The color of the scrim that is applied to the rest of the screen when the
- * bottom sheet is visible. If the color passed is [Color.Unspecified], then a scrim will no
- * longer be applied and the bottom sheet will not block interaction with the rest of the screen
- * when visible.
+ *   bottom sheet is visible. If the color passed is [Color.Unspecified], then a scrim will no
+ *   longer be applied and the bottom sheet will not block interaction with the rest of the screen
+ *   when visible.
  * @param content The content of rest of the screen.
  */
 @OptIn(ExperimentalMaterialApi::class)
@@ -349,8 +342,7 @@
 fun ModalBottomSheetLayout(
     sheetContent: @Composable ColumnScope.() -> Unit,
     modifier: Modifier = Modifier,
-    sheetState: ModalBottomSheetState =
-        rememberModalBottomSheetState(Hidden),
+    sheetState: ModalBottomSheetState = rememberModalBottomSheetState(Hidden),
     sheetGesturesEnabled: Boolean = true,
     sheetShape: Shape = MaterialTheme.shapes.large,
     sheetElevation: Dp = ModalBottomSheetDefaults.Elevation,
@@ -375,8 +367,7 @@
             )
         }
         Surface(
-            Modifier
-                .align(Alignment.TopCenter) // We offset from the top so we'll center from there
+            Modifier.align(Alignment.TopCenter) // We offset from the top so we'll center from there
                 .widthIn(max = MaxModalBottomSheetWidth)
                 .fillMaxWidth()
                 .then(
@@ -395,8 +386,9 @@
                 .anchoredDraggable(
                     state = sheetState.anchoredDraggableState,
                     orientation = orientation,
-                    enabled = sheetGesturesEnabled &&
-                        sheetState.anchoredDraggableState.currentValue != Hidden,
+                    enabled =
+                        sheetGesturesEnabled &&
+                            sheetState.anchoredDraggableState.currentValue != Hidden,
                 )
                 .then(
                     if (sheetGesturesEnabled) {
@@ -410,11 +402,12 @@
                                     }
                                     true
                                 }
-                                if (sheetState.anchoredDraggableState.currentValue
-                                    == HalfExpanded
+                                if (
+                                    sheetState.anchoredDraggableState.currentValue == HalfExpanded
                                 ) {
                                     expand {
-                                        if (sheetState.anchoredDraggableState.confirmValueChange(
+                                        if (
+                                            sheetState.anchoredDraggableState.confirmValueChange(
                                                 Expanded
                                             )
                                         ) {
@@ -424,7 +417,8 @@
                                     }
                                 } else if (sheetState.hasHalfExpandedState) {
                                     collapse {
-                                        if (sheetState.anchoredDraggableState.confirmValueChange(
+                                        if (
+                                            sheetState.anchoredDraggableState.confirmValueChange(
                                                 HalfExpanded
                                             )
                                         ) {
@@ -448,160 +442,148 @@
 }
 
 @OptIn(ExperimentalMaterialApi::class)
-private fun Modifier.modalBottomSheetAnchors(sheetState: ModalBottomSheetState) = draggableAnchors(
-    state = sheetState.anchoredDraggableState,
-    orientation = Orientation.Vertical
-) { sheetSize, constraints ->
-    val fullHeight = constraints.maxHeight.toFloat()
-    val newAnchors = DraggableAnchors {
-        Hidden at fullHeight
-        val halfHeight = fullHeight / 2f
-        if (!sheetState.isSkipHalfExpanded && sheetSize.height > halfHeight) {
-            HalfExpanded at halfHeight
-        }
-        if (sheetSize.height != 0) {
-            Expanded at max(0f, fullHeight - sheetSize.height)
-        }
-    }
-    // If we are setting the anchors for the first time and have an anchor for
-    // the current (initial) value, prefer that
-    val isInitialized = sheetState.anchoredDraggableState.anchors.size > 0
-    val previousValue = sheetState.currentValue
-    val newTarget = if (!isInitialized && newAnchors.hasAnchorFor(previousValue)) {
-        previousValue
-    } else {
-        when (sheetState.targetValue) {
-            Hidden -> Hidden
-            HalfExpanded, Expanded -> {
-                val hasHalfExpandedState = newAnchors.hasAnchorFor(HalfExpanded)
-                val newTarget = if (hasHalfExpandedState) {
-                    HalfExpanded
-                } else if (newAnchors.hasAnchorFor(Expanded)) {
-                    Expanded
-                } else {
-                    Hidden
-                }
-                newTarget
+private fun Modifier.modalBottomSheetAnchors(sheetState: ModalBottomSheetState) =
+    draggableAnchors(
+        state = sheetState.anchoredDraggableState,
+        orientation = Orientation.Vertical
+    ) { sheetSize, constraints ->
+        val fullHeight = constraints.maxHeight.toFloat()
+        val newAnchors = DraggableAnchors {
+            Hidden at fullHeight
+            val halfHeight = fullHeight / 2f
+            if (!sheetState.isSkipHalfExpanded && sheetSize.height > halfHeight) {
+                HalfExpanded at halfHeight
+            }
+            if (sheetSize.height != 0) {
+                Expanded at max(0f, fullHeight - sheetSize.height)
             }
         }
+        // If we are setting the anchors for the first time and have an anchor for
+        // the current (initial) value, prefer that
+        val isInitialized = sheetState.anchoredDraggableState.anchors.size > 0
+        val previousValue = sheetState.currentValue
+        val newTarget =
+            if (!isInitialized && newAnchors.hasAnchorFor(previousValue)) {
+                previousValue
+            } else {
+                when (sheetState.targetValue) {
+                    Hidden -> Hidden
+                    HalfExpanded,
+                    Expanded -> {
+                        val hasHalfExpandedState = newAnchors.hasAnchorFor(HalfExpanded)
+                        val newTarget =
+                            if (hasHalfExpandedState) {
+                                HalfExpanded
+                            } else if (newAnchors.hasAnchorFor(Expanded)) {
+                                Expanded
+                            } else {
+                                Hidden
+                            }
+                        newTarget
+                    }
+                }
+            }
+        return@draggableAnchors newAnchors to newTarget
     }
-    return@draggableAnchors newAnchors to newTarget
-}
 
 @Composable
-private fun Scrim(
-    color: Color,
-    onDismiss: () -> Unit,
-    visible: Boolean
-) {
+private fun Scrim(color: Color, onDismiss: () -> Unit, visible: Boolean) {
     if (color.isSpecified) {
-        val alpha by animateFloatAsState(
-            targetValue = if (visible) 1f else 0f,
-            animationSpec = TweenSpec()
-        )
+        val alpha by
+            animateFloatAsState(targetValue = if (visible) 1f else 0f, animationSpec = TweenSpec())
         val closeSheet = getString(Strings.CloseSheet)
-        val dismissModifier = if (visible) {
-            Modifier
-                .pointerInput(onDismiss) { detectTapGestures { onDismiss() } }
-                .semantics(mergeDescendants = true) {
-                    contentDescription = closeSheet
-                    onClick { onDismiss(); true }
-                }
-        } else {
-            Modifier
-        }
+        val dismissModifier =
+            if (visible) {
+                Modifier.pointerInput(onDismiss) { detectTapGestures { onDismiss() } }
+                    .semantics(mergeDescendants = true) {
+                        contentDescription = closeSheet
+                        onClick {
+                            onDismiss()
+                            true
+                        }
+                    }
+            } else {
+                Modifier
+            }
 
-        Canvas(
-            Modifier
-                .fillMaxSize()
-                .then(dismissModifier)
-        ) {
+        Canvas(Modifier.fillMaxSize().then(dismissModifier)) {
             drawRect(color = color, alpha = alpha)
         }
     }
 }
 
-/**
- * Contains useful Defaults for [ModalBottomSheetLayout].
- */
+/** Contains useful Defaults for [ModalBottomSheetLayout]. */
 object ModalBottomSheetDefaults {
 
-    /**
-     * The default elevation used by [ModalBottomSheetLayout].
-     */
+    /** The default elevation used by [ModalBottomSheetLayout]. */
     val Elevation = 16.dp
 
-    /**
-     * The default scrim color used by [ModalBottomSheetLayout].
-     */
+    /** The default scrim color used by [ModalBottomSheetLayout]. */
     val scrimColor: Color
-        @Composable
-        get() = MaterialTheme.colors.onSurface.copy(alpha = 0.32f)
+        @Composable get() = MaterialTheme.colors.onSurface.copy(alpha = 0.32f)
 
-    /**
-     * The default animation spec used by [ModalBottomSheetState].
-     */
-    val AnimationSpec: AnimationSpec<Float> = tween(
-        durationMillis = 300,
-        easing = FastOutSlowInEasing
-    )
+    /** The default animation spec used by [ModalBottomSheetState]. */
+    val AnimationSpec: AnimationSpec<Float> =
+        tween(durationMillis = 300, easing = FastOutSlowInEasing)
 }
 
 @OptIn(ExperimentalMaterialApi::class)
 private fun ConsumeSwipeWithinBottomSheetBoundsNestedScrollConnection(
     state: AnchoredDraggableState<*>,
     orientation: Orientation
-): NestedScrollConnection = object : NestedScrollConnection {
-    override fun onPreScroll(available: Offset, source: NestedScrollSource): Offset {
-        val delta = available.toFloat()
-        return if (delta < 0 && source == NestedScrollSource.UserInput) {
-            state.dispatchRawDelta(delta).toOffset()
-        } else {
-            Offset.Zero
+): NestedScrollConnection =
+    object : NestedScrollConnection {
+        override fun onPreScroll(available: Offset, source: NestedScrollSource): Offset {
+            val delta = available.toFloat()
+            return if (delta < 0 && source == NestedScrollSource.UserInput) {
+                state.dispatchRawDelta(delta).toOffset()
+            } else {
+                Offset.Zero
+            }
         }
-    }
 
-    override fun onPostScroll(
-        consumed: Offset,
-        available: Offset,
-        source: NestedScrollSource
-    ): Offset {
-        return if (source == NestedScrollSource.UserInput) {
-            state.dispatchRawDelta(available.toFloat()).toOffset()
-        } else {
-            Offset.Zero
+        override fun onPostScroll(
+            consumed: Offset,
+            available: Offset,
+            source: NestedScrollSource
+        ): Offset {
+            return if (source == NestedScrollSource.UserInput) {
+                state.dispatchRawDelta(available.toFloat()).toOffset()
+            } else {
+                Offset.Zero
+            }
         }
-    }
 
-    override suspend fun onPreFling(available: Velocity): Velocity {
-        val toFling = available.toFloat()
-        val currentOffset = state.requireOffset()
-        return if (toFling < 0 && currentOffset > state.anchors.minAnchor()) {
-            state.settle(velocity = toFling)
-            // since we go to the anchor with tween settling, consume all for the best UX
-            available
-        } else {
-            Velocity.Zero
+        override suspend fun onPreFling(available: Velocity): Velocity {
+            val toFling = available.toFloat()
+            val currentOffset = state.requireOffset()
+            return if (toFling < 0 && currentOffset > state.anchors.minAnchor()) {
+                state.settle(velocity = toFling)
+                // since we go to the anchor with tween settling, consume all for the best UX
+                available
+            } else {
+                Velocity.Zero
+            }
         }
+
+        override suspend fun onPostFling(consumed: Velocity, available: Velocity): Velocity {
+            state.settle(velocity = available.toFloat())
+            return available
+        }
+
+        private fun Float.toOffset(): Offset =
+            Offset(
+                x = if (orientation == Orientation.Horizontal) this else 0f,
+                y = if (orientation == Orientation.Vertical) this else 0f
+            )
+
+        @JvmName("velocityToFloat")
+        private fun Velocity.toFloat() = if (orientation == Orientation.Horizontal) x else y
+
+        @JvmName("offsetToFloat")
+        private fun Offset.toFloat(): Float = if (orientation == Orientation.Horizontal) x else y
     }
 
-    override suspend fun onPostFling(consumed: Velocity, available: Velocity): Velocity {
-        state.settle(velocity = available.toFloat())
-        return available
-    }
-
-    private fun Float.toOffset(): Offset = Offset(
-        x = if (orientation == Orientation.Horizontal) this else 0f,
-        y = if (orientation == Orientation.Vertical) this else 0f
-    )
-
-    @JvmName("velocityToFloat")
-    private fun Velocity.toFloat() = if (orientation == Orientation.Horizontal) x else y
-
-    @JvmName("offsetToFloat")
-    private fun Offset.toFloat(): Float = if (orientation == Orientation.Horizontal) x else y
-}
-
 private val ModalBottomSheetPositionalThreshold = 56.dp
 private val ModalBottomSheetVelocityThreshold = 125.dp
 private val MaxModalBottomSheetWidth = 640.dp
diff --git a/compose/material/material/src/commonMain/kotlin/androidx/compose/material/MutableWindowInsets.kt b/compose/material/material/src/commonMain/kotlin/androidx/compose/material/MutableWindowInsets.kt
index 99be9b7..28824c6 100644
--- a/compose/material/material/src/commonMain/kotlin/androidx/compose/material/MutableWindowInsets.kt
+++ b/compose/material/material/src/commonMain/kotlin/androidx/compose/material/MutableWindowInsets.kt
@@ -24,25 +24,27 @@
 import androidx.compose.ui.unit.LayoutDirection
 
 /**
- * A [WindowInsets] whose values can change without changing the instance. This is useful
- * to avoid recomposition when [WindowInsets] can change.
+ * A [WindowInsets] whose values can change without changing the instance. This is useful to avoid
+ * recomposition when [WindowInsets] can change.
  *
  * Copied from [androidx.compose.foundation.layout.MutableWindowInsets], which is marked as
  * experimental and thus cannot be used cross-module.
  */
-internal class MutableWindowInsets(
-    initialInsets: WindowInsets = WindowInsets(0, 0, 0, 0)
-) : WindowInsets {
+internal class MutableWindowInsets(initialInsets: WindowInsets = WindowInsets(0, 0, 0, 0)) :
+    WindowInsets {
     /**
-     * The [WindowInsets] that are used for [left][getLeft], [top][getTop], [right][getRight],
-     * and [bottom][getBottom] values.
+     * The [WindowInsets] that are used for [left][getLeft], [top][getTop], [right][getRight], and
+     * [bottom][getBottom] values.
      */
     var insets by mutableStateOf(initialInsets)
 
     override fun getLeft(density: Density, layoutDirection: LayoutDirection): Int =
         insets.getLeft(density, layoutDirection)
+
     override fun getTop(density: Density): Int = insets.getTop(density)
+
     override fun getRight(density: Density, layoutDirection: LayoutDirection): Int =
         insets.getRight(density, layoutDirection)
+
     override fun getBottom(density: Density): Int = insets.getBottom(density)
 }
diff --git a/compose/material/material/src/commonMain/kotlin/androidx/compose/material/NavigationRail.kt b/compose/material/material/src/commonMain/kotlin/androidx/compose/material/NavigationRail.kt
index 475fa72..ca98e3f 100644
--- a/compose/material/material/src/commonMain/kotlin/androidx/compose/material/NavigationRail.kt
+++ b/compose/material/material/src/commonMain/kotlin/androidx/compose/material/NavigationRail.kt
@@ -61,14 +61,16 @@
 import kotlin.math.roundToInt
 
 /**
- * <a href="https://material.io/components/navigation-rail" class="external" target="_blank">Material Design navigation rail</a>.
+ * <a href="https://material.io/components/navigation-rail" class="external"
+ * target="_blank">Material Design navigation rail</a>.
  *
  * A Navigation Rail is a side navigation component that allows movement between primary
  * destinations in an app. A navigation rail should be used to display three to seven app
  * destinations and, optionally, a [FloatingActionButton] or a logo inside [header]. Each
  * destination is typically represented by an icon and an optional text label.
  *
- * ![Navigation rail image](https://developer.android.com/images/reference/androidx/compose/material/navigation-rail.png)
+ * ![Navigation rail
+ * image](https://developer.android.com/images/reference/androidx/compose/material/navigation-rail.png)
  *
  * This particular overload provides ability to specify [WindowInsets]. Recommended value can be
  * found in [NavigationRailDefaults.windowInsets].
@@ -88,14 +90,13 @@
  * @param windowInsets a window insets that navigation rail will respect
  * @param modifier optional [Modifier] for this NavigationRail
  * @param backgroundColor The background color for this NavigationRail
- * @param contentColor The preferred content color provided by this NavigationRail to its
- * children. Defaults to either the matching content color for [backgroundColor], or if
- * [backgroundColor] is not a color from the theme, this will keep the same value set above this
- * NavigationRail.
+ * @param contentColor The preferred content color provided by this NavigationRail to its children.
+ *   Defaults to either the matching content color for [backgroundColor], or if [backgroundColor] is
+ *   not a color from the theme, this will keep the same value set above this NavigationRail.
  * @param elevation elevation for this NavigationRail
  * @param header an optional header that may hold a [FloatingActionButton] or a logo
  * @param content destinations inside this NavigationRail, this should contain multiple
- * [NavigationRailItem]s
+ *   [NavigationRailItem]s
  */
 @Composable
 fun NavigationRail(
@@ -114,8 +115,7 @@
         elevation = elevation
     ) {
         Column(
-            Modifier
-                .fillMaxHeight()
+            Modifier.fillMaxHeight()
                 .windowInsetsPadding(windowInsets)
                 .padding(vertical = NavigationRailPadding)
                 .selectableGroup(),
@@ -131,14 +131,16 @@
 }
 
 /**
- * <a href="https://material.io/components/navigation-rail" class="external" target="_blank">Material Design navigation rail</a>.
+ * <a href="https://material.io/components/navigation-rail" class="external"
+ * target="_blank">Material Design navigation rail</a>.
  *
  * A Navigation Rail is a side navigation component that allows movement between primary
  * destinations in an app. A navigation rail should be used to display three to seven app
  * destinations and, optionally, a [FloatingActionButton] or a logo inside [header]. Each
  * destination is typically represented by an icon and an optional text label.
  *
- * ![Navigation rail image](https://developer.android.com/images/reference/androidx/compose/material/navigation-rail.png)
+ * ![Navigation rail
+ * image](https://developer.android.com/images/reference/androidx/compose/material/navigation-rail.png)
  *
  * NavigationRail should contain multiple [NavigationRailItem]s, each representing a singular
  * destination.
@@ -154,14 +156,13 @@
  *
  * @param modifier optional [Modifier] for this NavigationRail
  * @param backgroundColor The background color for this NavigationRail
- * @param contentColor The preferred content color provided by this NavigationRail to its
- * children. Defaults to either the matching content color for [backgroundColor], or if
- * [backgroundColor] is not a color from the theme, this will keep the same value set above this
- * NavigationRail.
+ * @param contentColor The preferred content color provided by this NavigationRail to its children.
+ *   Defaults to either the matching content color for [backgroundColor], or if [backgroundColor] is
+ *   not a color from the theme, this will keep the same value set above this NavigationRail.
  * @param elevation elevation for this NavigationRail
  * @param header an optional header that may hold a [FloatingActionButton] or a logo
  * @param content destinations inside this NavigationRail, this should contain multiple
- * [NavigationRailItem]s
+ *   [NavigationRailItem]s
  */
 @Composable
 fun NavigationRail(
@@ -176,26 +177,27 @@
 }
 
 /**
- * <a href="https://material.io/components/navigation-rail" class="external" target="_blank">Material Design navigation rail</a> item.
+ * <a href="https://material.io/components/navigation-rail" class="external"
+ * target="_blank">Material Design navigation rail</a> item.
  *
- * A NavigationRailItem always shows text labels (if it exists) when selected. Showing text
- * labels if not selected is controlled by [alwaysShowLabel].
+ * A NavigationRailItem always shows text labels (if it exists) when selected. Showing text labels
+ * if not selected is controlled by [alwaysShowLabel].
  *
  * @param selected whether this item is selected (active)
  * @param onClick the callback to be invoked when this item is selected
  * @param icon icon for this item, typically this will be an [Icon]
  * @param modifier optional [Modifier] for this item
- * @param enabled controls the enabled state of this item. When `false`, this item will not
- * be clickable and will appear disabled to accessibility services.
+ * @param enabled controls the enabled state of this item. When `false`, this item will not be
+ *   clickable and will appear disabled to accessibility services.
  * @param label optional text label for this item
  * @param alwaysShowLabel whether to always show the label for this item. If false, the label will
- * only be shown when this item is selected.
+ *   only be shown when this item is selected.
  * @param interactionSource an optional hoisted [MutableInteractionSource] for observing and
- * emitting [Interaction]s for this item. You can use this to change the item's
- * appearance or preview the item in different states. Note that if `null` is provided,
- * interactions will still happen internally.
- * @param selectedContentColor the color of the text label and icon when this item is selected,
- * and the color of the ripple.
+ *   emitting [Interaction]s for this item. You can use this to change the item's appearance or
+ *   preview the item in different states. Note that if `null` is provided, interactions will still
+ *   happen internally.
+ * @param selectedContentColor the color of the text label and icon when this item is selected, and
+ *   the color of the ripple.
  * @param unselectedContentColor the color of the text label and icon when this item is not selected
  */
 @Composable
@@ -211,12 +213,13 @@
     selectedContentColor: Color = MaterialTheme.colors.primary,
     unselectedContentColor: Color = LocalContentColor.current.copy(alpha = ContentAlpha.medium)
 ) {
-    val styledLabel: @Composable (() -> Unit)? = label?.let {
-        @Composable {
-            val style = MaterialTheme.typography.caption.copy(textAlign = TextAlign.Center)
-            ProvideTextStyle(style, content = label)
+    val styledLabel: @Composable (() -> Unit)? =
+        label?.let {
+            @Composable {
+                val style = MaterialTheme.typography.caption.copy(textAlign = TextAlign.Center)
+                ProvideTextStyle(style, content = label)
+            }
         }
-    }
     // Default to compact size when the item has no label, or a regular size when it does.
     // Any size value that was set on the given Modifier will take precedence and allow custom
     // sizing.
@@ -224,10 +227,7 @@
     // The color of the Ripple should always the selected color, as we want to show the color
     // before the item is considered selected, and hence before the new contentColor is
     // provided by NavigationRailTransition.
-    val ripple = rippleOrFallbackImplementation(
-        bounded = false,
-        color = selectedContentColor
-    )
+    val ripple = rippleOrFallbackImplementation(bounded = false, color = selectedContentColor)
     Box(
         modifier
             .selectable(
@@ -241,11 +241,8 @@
             .size(itemSize),
         contentAlignment = Alignment.Center
     ) {
-        NavigationRailTransition(
-            selectedContentColor,
-            unselectedContentColor,
-            selected
-        ) { progress ->
+        NavigationRailTransition(selectedContentColor, unselectedContentColor, selected) { progress
+            ->
             val animationProgress = if (alwaysShowLabel) 1f else progress
 
             NavigationRailItemBaselineLayout(
@@ -257,22 +254,18 @@
     }
 }
 
-/**
- * Contains default values used for [NavigationRail].
- */
+/** Contains default values used for [NavigationRail]. */
 object NavigationRailDefaults {
-    /**
-     * Default elevation used for [NavigationRail].
-     */
+    /** Default elevation used for [NavigationRail]. */
     val Elevation = 8.dp
 
-    /**
-     * Recommended window insets for navigation rail.
-     */
+    /** Recommended window insets for navigation rail. */
     val windowInsets: WindowInsets
         @Composable
-        get() = WindowInsets.systemBarsForVisualComponents
-            .only(WindowInsetsSides.Vertical + WindowInsetsSides.Start)
+        get() =
+            WindowInsets.systemBarsForVisualComponents.only(
+                WindowInsetsSides.Vertical + WindowInsetsSides.Start
+            )
 }
 
 /**
@@ -284,8 +277,8 @@
  * @param activeColor [LocalContentColor] when this item is [selected]
  * @param inactiveColor [LocalContentColor] when this item is not [selected]
  * @param selected whether this item is selected
- * @param content the content of the [NavigationRailItem] to animate [LocalContentColor] for,
- * where the animationProgress is the current progress of the animation from 0f to 1f.
+ * @param content the content of the [NavigationRailItem] to animate [LocalContentColor] for, where
+ *   the animationProgress is the current progress of the animation from 0f to 1f.
  */
 @Composable
 private fun NavigationRailTransition(
@@ -294,10 +287,11 @@
     selected: Boolean,
     content: @Composable (animationProgress: Float) -> Unit
 ) {
-    val animationProgress by animateFloatAsState(
-        targetValue = if (selected) 1f else 0f,
-        animationSpec = NavigationRailAnimationSpec
-    )
+    val animationProgress by
+        animateFloatAsState(
+            targetValue = if (selected) 1f else 0f,
+            animationSpec = NavigationRailAnimationSpec
+        )
 
     val color = lerp(inactiveColor, activeColor, animationProgress)
 
@@ -314,39 +308,36 @@
  *
  * @param icon icon for this item
  * @param label text label for this item
- * @param iconPositionAnimationProgress progress of the animation that controls icon position,
- * where 0 represents its unselected position and 1 represents its selected position. If both the
- * [icon] and [label] should be shown at all times, this will always be 1, as the icon position
- * should remain constant.
+ * @param iconPositionAnimationProgress progress of the animation that controls icon position, where
+ *   0 represents its unselected position and 1 represents its selected position. If both the [icon]
+ *   and [label] should be shown at all times, this will always be 1, as the icon position should
+ *   remain constant.
  */
 @Composable
 private fun NavigationRailItemBaselineLayout(
     icon: @Composable () -> Unit,
     label: @Composable (() -> Unit)?,
-    @FloatRange(from = 0.0, to = 1.0)
-    iconPositionAnimationProgress: Float
+    @FloatRange(from = 0.0, to = 1.0) iconPositionAnimationProgress: Float
 ) {
-    Layout(
-        {
-            Box(Modifier.layoutId("icon")) { icon() }
-            if (label != null) {
-                Box(
-                    Modifier
-                        .layoutId("label")
-                        .alpha(iconPositionAnimationProgress)
-                ) { label() }
-            }
+    Layout({
+        Box(Modifier.layoutId("icon")) { icon() }
+        if (label != null) {
+            Box(Modifier.layoutId("label").alpha(iconPositionAnimationProgress)) { label() }
         }
-    ) { measurables, constraints ->
+    }) { measurables, constraints ->
         val iconPlaceable = measurables.fastFirst { it.layoutId == "icon" }.measure(constraints)
 
-        val labelPlaceable = label?.let {
-            measurables.fastFirst { it.layoutId == "label" }.measure(
-                // Measure with loose constraints for height as we don't want the label to take up more
-                // space than it needs
-                constraints.copy(minHeight = 0)
-            )
-        }
+        val labelPlaceable =
+            label?.let {
+                measurables
+                    .fastFirst { it.layoutId == "label" }
+                    .measure(
+                        // Measure with loose constraints for height as we don't want the label to
+                        // take up more
+                        // space than it needs
+                        constraints.copy(minHeight = 0)
+                    )
+            }
 
         // If there is no label, just place the icon.
         if (label == null) {
@@ -362,9 +353,7 @@
     }
 }
 
-/**
- * Places the provided [iconPlaceable] in the vertical center of the provided [constraints]
- */
+/** Places the provided [iconPlaceable] in the vertical center of the provided [constraints] */
 private fun MeasureScope.placeIcon(
     iconPlaceable: Placeable,
     constraints: Constraints
@@ -392,15 +381,14 @@
  * @param labelPlaceable text label placeable inside this item
  * @param iconPlaceable icon placeable inside this item
  * @param iconPositionAnimationProgress the progress of the icon position animation, where 0
- * represents centered icon and no label, and 1 represents top aligned icon with label.
- * Values between 0 and 1 interpolate the icon position so we can smoothly move the icon.
+ *   represents centered icon and no label, and 1 represents top aligned icon with label. Values
+ *   between 0 and 1 interpolate the icon position so we can smoothly move the icon.
  */
 private fun MeasureScope.placeLabelAndIcon(
     labelPlaceable: Placeable,
     iconPlaceable: Placeable,
     constraints: Constraints,
-    @FloatRange(from = 0.0, to = 1.0)
-    iconPositionAnimationProgress: Float
+    @FloatRange(from = 0.0, to = 1.0) iconPositionAnimationProgress: Float
 ): MeasureResult {
     val baseline = labelPlaceable[LastBaseline]
     val labelBaselineOffset = ItemLabelBaselineBottomOffset.roundToPx()
@@ -432,24 +420,16 @@
  * [VectorizedAnimationSpec] controlling the transition between unselected and selected
  * [NavigationRailItem]s.
  */
-private val NavigationRailAnimationSpec = TweenSpec<Float>(
-    durationMillis = 300,
-    easing = FastOutSlowInEasing
-)
+private val NavigationRailAnimationSpec =
+    TweenSpec<Float>(durationMillis = 300, easing = FastOutSlowInEasing)
 
-/**
- * Size of a regular [NavigationRailItem].
- */
+/** Size of a regular [NavigationRailItem]. */
 private val NavigationRailItemSize = 72.dp
 
-/**
- * Size of a compact [NavigationRailItem].
- */
+/** Size of a compact [NavigationRailItem]. */
 private val NavigationRailItemCompactSize = 56.dp
 
-/**
- * Padding at the top and the bottom of the [NavigationRail]
- */
+/** Padding at the top and the bottom of the [NavigationRail] */
 private val NavigationRailPadding = 8.dp
 
 /**
@@ -458,9 +438,7 @@
  */
 private val HeaderPadding = 8.dp
 
-/**
- * The space between the text label's baseline and the bottom of the container.
- */
+/** The space between the text label's baseline and the bottom of the container. */
 private val ItemLabelBaselineBottomOffset = 16.dp
 
 /**
diff --git a/compose/material/material/src/commonMain/kotlin/androidx/compose/material/OutlinedTextField.kt b/compose/material/material/src/commonMain/kotlin/androidx/compose/material/OutlinedTextField.kt
index 6cf332c..09d14b8 100644
--- a/compose/material/material/src/commonMain/kotlin/androidx/compose/material/OutlinedTextField.kt
+++ b/compose/material/material/src/commonMain/kotlin/androidx/compose/material/OutlinedTextField.kt
@@ -69,69 +69,71 @@
 import kotlin.math.roundToInt
 
 /**
- * <a href="https://material.io/components/text-fields#outlined-text-field" class="external" target="_blank">Material Design outlined text field</a>.
+ * <a href="https://material.io/components/text-fields#outlined-text-field" class="external"
+ * target="_blank">Material Design outlined text field</a>.
  *
  * Outlined text fields have less visual emphasis than filled text fields. When they appear in
  * places like forms, where many text fields are placed together, their reduced emphasis helps
  * simplify the layout.
  *
- * ![Outlined text field image](https://developer.android.com/images/reference/androidx/compose/material/outlined-text-field.png)
+ * ![Outlined text field
+ * image](https://developer.android.com/images/reference/androidx/compose/material/outlined-text-field.png)
  *
  * See example usage:
+ *
  * @sample androidx.compose.material.samples.SimpleOutlinedTextFieldSample
  *
- * If apart from input text change you also want to observe the cursor location, selection range,
- * or IME composition use the OutlinedTextField overload with the [TextFieldValue] parameter
- * instead.
+ * If apart from input text change you also want to observe the cursor location, selection range, or
+ * IME composition use the OutlinedTextField overload with the [TextFieldValue] parameter instead.
  *
  * @param value the input text to be shown in the text field
  * @param onValueChange the callback that is triggered when the input service updates the text. An
- * updated text comes as a parameter of the callback
+ *   updated text comes as a parameter of the callback
  * @param modifier a [Modifier] for this text field
- * @param enabled controls the enabled state of the [OutlinedTextField]. When `false`, the text field will
- * be neither editable nor focusable, the input of the text field will not be selectable,
- * visually text field will appear in the disabled UI state
+ * @param enabled controls the enabled state of the [OutlinedTextField]. When `false`, the text
+ *   field will be neither editable nor focusable, the input of the text field will not be
+ *   selectable, visually text field will appear in the disabled UI state
  * @param readOnly controls the editable state of the [OutlinedTextField]. When `true`, the text
- * field can not be modified, however, a user can focus it and copy text from it. Read-only text
- * fields are usually used to display pre-filled forms that user can not edit
+ *   field can not be modified, however, a user can focus it and copy text from it. Read-only text
+ *   fields are usually used to display pre-filled forms that user can not edit
  * @param textStyle the style to be applied to the input text. The default [textStyle] uses the
- * [LocalTextStyle] defined by the theme
- * @param label the optional label to be displayed inside the text field container. The default
- * text style for internal [Text] is [Typography.caption] when the text field is in focus and
- * [Typography.subtitle1] when the text field is not in focus
+ *   [LocalTextStyle] defined by the theme
+ * @param label the optional label to be displayed inside the text field container. The default text
+ *   style for internal [Text] is [Typography.caption] when the text field is in focus and
+ *   [Typography.subtitle1] when the text field is not in focus
  * @param placeholder the optional placeholder to be displayed when the text field is in focus and
- * the input text is empty. The default text style for internal [Text] is [Typography.subtitle1]
+ *   the input text is empty. The default text style for internal [Text] is [Typography.subtitle1]
  * @param leadingIcon the optional leading icon to be displayed at the beginning of the text field
- * container
+ *   container
  * @param trailingIcon the optional trailing icon to be displayed at the end of the text field
- * container
+ *   container
  * @param isError indicates if the text field's current value is in error. If set to true, the
- * label, bottom indicator and trailing icon by default will be displayed in error color
- * @param visualTransformation transforms the visual representation of the input [value]
- * For example, you can use
- * [PasswordVisualTransformation][androidx.compose.ui.text.input.PasswordVisualTransformation] to
- * create a password text field. By default no visual transformation is applied
+ *   label, bottom indicator and trailing icon by default will be displayed in error color
+ * @param visualTransformation transforms the visual representation of the input [value] For
+ *   example, you can use
+ *   [PasswordVisualTransformation][androidx.compose.ui.text.input.PasswordVisualTransformation] to
+ *   create a password text field. By default no visual transformation is applied
  * @param keyboardOptions software keyboard options that contains configuration such as
- * [KeyboardType] and [ImeAction]
- * @param keyboardActions when the input service emits an IME action, the corresponding callback
- * is called. Note that this IME action may be different from what you specified in
- * [KeyboardOptions.imeAction]
- * @param singleLine when set to true, this text field becomes a single horizontally scrolling
- * text field instead of wrapping onto multiple lines. The keyboard will be informed to not show
- * the return key as the [ImeAction]. Note that [maxLines] parameter will be ignored as the
- * maxLines attribute will be automatically set to 1
+ *   [KeyboardType] and [ImeAction]
+ * @param keyboardActions when the input service emits an IME action, the corresponding callback is
+ *   called. Note that this IME action may be different from what you specified in
+ *   [KeyboardOptions.imeAction]
+ * @param singleLine when set to true, this text field becomes a single horizontally scrolling text
+ *   field instead of wrapping onto multiple lines. The keyboard will be informed to not show the
+ *   return key as the [ImeAction]. Note that [maxLines] parameter will be ignored as the maxLines
+ *   attribute will be automatically set to 1
  * @param maxLines the maximum height in terms of maximum number of visible lines. It is required
- * that 1 <= [minLines] <= [maxLines]. This parameter is ignored when [singleLine] is true.
+ *   that 1 <= [minLines] <= [maxLines]. This parameter is ignored when [singleLine] is true.
  * @param minLines the minimum height in terms of minimum number of visible lines. It is required
- * that 1 <= [minLines] <= [maxLines]. This parameter is ignored when [singleLine] is true.
+ *   that 1 <= [minLines] <= [maxLines]. This parameter is ignored when [singleLine] is true.
  * @param interactionSource an optional hoisted [MutableInteractionSource] for observing and
- * emitting [Interaction]s for this text field. You can use this to change the text field's
- * appearance or preview the text field in different states. Note that if `null` is provided,
- * interactions will still happen internally.
+ *   emitting [Interaction]s for this text field. You can use this to change the text field's
+ *   appearance or preview the text field in different states. Note that if `null` is provided,
+ *   interactions will still happen internally.
  * @param shape the shape of the text field's border
  * @param colors [TextFieldColors] that will be used to resolve color of the text and content
- * (including label, placeholder, leading and trailing icons, border) for this text field in
- * different states. See [TextFieldDefaults.outlinedTextFieldColors]
+ *   (including label, placeholder, leading and trailing icons, border) for this text field in
+ *   different states. See [TextFieldDefaults.outlinedTextFieldColors]
  */
 @Composable
 fun OutlinedTextField(
@@ -159,9 +161,7 @@
     @Suppress("NAME_SHADOWING")
     val interactionSource = interactionSource ?: remember { MutableInteractionSource() }
     // If color is not provided via the text style, use content color as a default
-    val textColor = textStyle.color.takeOrElse {
-        colors.textColor(enabled).value
-    }
+    val textColor = textStyle.color.takeOrElse { colors.textColor(enabled).value }
     val mergedTextStyle = textStyle.merge(TextStyle(color = textColor))
 
     val density = LocalDensity.current
@@ -169,23 +169,24 @@
     @OptIn(ExperimentalMaterialApi::class)
     BasicTextField(
         value = value,
-        modifier = modifier
-            .then(
-                if (label != null) {
-                    Modifier
-                        // Merge semantics at the beginning of the modifier chain to ensure
-                        // padding is considered part of the text field.
-                        .semantics(mergeDescendants = true) {}
-                        .padding(top = with(density) { OutlinedTextFieldTopPadding.toDp() })
-                } else {
-                    Modifier
-                }
-            )
-            .defaultErrorSemantics(isError, getString(Strings.DefaultErrorMessage))
-            .defaultMinSize(
-                minWidth = TextFieldDefaults.MinWidth,
-                minHeight = TextFieldDefaults.MinHeight
-            ),
+        modifier =
+            modifier
+                .then(
+                    if (label != null) {
+                        Modifier
+                            // Merge semantics at the beginning of the modifier chain to ensure
+                            // padding is considered part of the text field.
+                            .semantics(mergeDescendants = true) {}
+                            .padding(top = with(density) { OutlinedTextFieldTopPadding.toDp() })
+                    } else {
+                        Modifier
+                    }
+                )
+                .defaultErrorSemantics(isError, getString(Strings.DefaultErrorMessage))
+                .defaultMinSize(
+                    minWidth = TextFieldDefaults.MinWidth,
+                    minHeight = TextFieldDefaults.MinHeight
+                ),
         onValueChange = onValueChange,
         enabled = enabled,
         readOnly = readOnly,
@@ -198,32 +199,33 @@
         singleLine = singleLine,
         maxLines = maxLines,
         minLines = minLines,
-        decorationBox = @Composable { innerTextField ->
-            TextFieldDefaults.OutlinedTextFieldDecorationBox(
-                value = value,
-                visualTransformation = visualTransformation,
-                innerTextField = innerTextField,
-                placeholder = placeholder,
-                label = label,
-                leadingIcon = leadingIcon,
-                trailingIcon = trailingIcon,
-                singleLine = singleLine,
-                enabled = enabled,
-                isError = isError,
-                interactionSource = interactionSource,
-                shape = shape,
-                colors = colors,
-                border = {
-                    TextFieldDefaults.BorderBox(
-                        enabled,
-                        isError,
-                        interactionSource,
-                        colors,
-                        shape
-                    )
-                }
-            )
-        }
+        decorationBox =
+            @Composable { innerTextField ->
+                TextFieldDefaults.OutlinedTextFieldDecorationBox(
+                    value = value,
+                    visualTransformation = visualTransformation,
+                    innerTextField = innerTextField,
+                    placeholder = placeholder,
+                    label = label,
+                    leadingIcon = leadingIcon,
+                    trailingIcon = trailingIcon,
+                    singleLine = singleLine,
+                    enabled = enabled,
+                    isError = isError,
+                    interactionSource = interactionSource,
+                    shape = shape,
+                    colors = colors,
+                    border = {
+                        TextFieldDefaults.BorderBox(
+                            enabled,
+                            isError,
+                            interactionSource,
+                            colors,
+                            shape
+                        )
+                    }
+                )
+            }
     )
 }
 
@@ -278,69 +280,72 @@
 }
 
 /**
- * <a href="https://material.io/components/text-fields#outlined-text-field" class="external" target="_blank">Material Design outlined text field</a>.
+ * <a href="https://material.io/components/text-fields#outlined-text-field" class="external"
+ * target="_blank">Material Design outlined text field</a>.
  *
  * Outlined text fields have less visual emphasis than filled text fields. When they appear in
  * places like forms, where many text fields are placed together, their reduced emphasis helps
  * simplify the layout.
  *
- * ![Outlined text field image](https://developer.android.com/images/reference/androidx/compose/material/outlined-text-field.png)
+ * ![Outlined text field
+ * image](https://developer.android.com/images/reference/androidx/compose/material/outlined-text-field.png)
  *
  * See example usage:
+ *
  * @sample androidx.compose.material.samples.OutlinedTextFieldSample
  *
- * This overload provides access to the input text, cursor position and selection range and
- * IME composition. If you only want to observe an input text change, use the OutlinedTextField
- * overload with the [String] parameter instead.
+ * This overload provides access to the input text, cursor position and selection range and IME
+ * composition. If you only want to observe an input text change, use the OutlinedTextField overload
+ * with the [String] parameter instead.
  *
  * @param value the input [TextFieldValue] to be shown in the text field
  * @param onValueChange the callback that is triggered when the input service updates values in
- * [TextFieldValue]. An updated [TextFieldValue] comes as a parameter of the callback
+ *   [TextFieldValue]. An updated [TextFieldValue] comes as a parameter of the callback
  * @param modifier a [Modifier] for this text field
- * @param enabled controls the enabled state of the [OutlinedTextField]. When `false`, the text field will
- * be neither editable nor focusable, the input of the text field will not be selectable,
- * visually text field will appear in the disabled UI state
+ * @param enabled controls the enabled state of the [OutlinedTextField]. When `false`, the text
+ *   field will be neither editable nor focusable, the input of the text field will not be
+ *   selectable, visually text field will appear in the disabled UI state
  * @param readOnly controls the editable state of the [OutlinedTextField]. When `true`, the text
- * field can not be modified, however, a user can focus it and copy text from it. Read-only text
- * fields are usually used to display pre-filled forms that user can not edit
+ *   field can not be modified, however, a user can focus it and copy text from it. Read-only text
+ *   fields are usually used to display pre-filled forms that user can not edit
  * @param textStyle the style to be applied to the input text. The default [textStyle] uses the
- * [LocalTextStyle] defined by the theme
- * @param label the optional label to be displayed inside the text field container. The default
- * text style for internal [Text] is [Typography.caption] when the text field is in focus and
- * [Typography.subtitle1] when the text field is not in focus
+ *   [LocalTextStyle] defined by the theme
+ * @param label the optional label to be displayed inside the text field container. The default text
+ *   style for internal [Text] is [Typography.caption] when the text field is in focus and
+ *   [Typography.subtitle1] when the text field is not in focus
  * @param placeholder the optional placeholder to be displayed when the text field is in focus and
- * the input text is empty. The default text style for internal [Text] is [Typography.subtitle1]
+ *   the input text is empty. The default text style for internal [Text] is [Typography.subtitle1]
  * @param leadingIcon the optional leading icon to be displayed at the beginning of the text field
- * container
+ *   container
  * @param trailingIcon the optional trailing icon to be displayed at the end of the text field
- * container
- * @param isError indicates if the text field's current value is in error state. If set to
- * true, the label, bottom indicator and trailing icon by default will be displayed in error color
- * @param visualTransformation transforms the visual representation of the input [value]
- * For example, you can use
- * [PasswordVisualTransformation][androidx.compose.ui.text.input.PasswordVisualTransformation] to
- * create a password text field. By default no visual transformation is applied
+ *   container
+ * @param isError indicates if the text field's current value is in error state. If set to true, the
+ *   label, bottom indicator and trailing icon by default will be displayed in error color
+ * @param visualTransformation transforms the visual representation of the input [value] For
+ *   example, you can use
+ *   [PasswordVisualTransformation][androidx.compose.ui.text.input.PasswordVisualTransformation] to
+ *   create a password text field. By default no visual transformation is applied
  * @param keyboardOptions software keyboard options that contains configuration such as
- * [KeyboardType] and [ImeAction]
- * @param keyboardActions when the input service emits an IME action, the corresponding callback
- * is called. Note that this IME action may be different from what you specified in
- * [KeyboardOptions.imeAction]
- * @param singleLine when set to true, this text field becomes a single horizontally scrolling
- * text field instead of wrapping onto multiple lines. The keyboard will be informed to not show
- * the return key as the [ImeAction]. Note that [maxLines] parameter will be ignored as the
- * maxLines attribute will be automatically set to 1
+ *   [KeyboardType] and [ImeAction]
+ * @param keyboardActions when the input service emits an IME action, the corresponding callback is
+ *   called. Note that this IME action may be different from what you specified in
+ *   [KeyboardOptions.imeAction]
+ * @param singleLine when set to true, this text field becomes a single horizontally scrolling text
+ *   field instead of wrapping onto multiple lines. The keyboard will be informed to not show the
+ *   return key as the [ImeAction]. Note that [maxLines] parameter will be ignored as the maxLines
+ *   attribute will be automatically set to 1
  * @param maxLines the maximum height in terms of maximum number of visible lines. It is required
- * that 1 <= [minLines] <= [maxLines]. This parameter is ignored when [singleLine] is true.
+ *   that 1 <= [minLines] <= [maxLines]. This parameter is ignored when [singleLine] is true.
  * @param minLines the minimum height in terms of minimum number of visible lines. It is required
- * that 1 <= [minLines] <= [maxLines]. This parameter is ignored when [singleLine] is true.
+ *   that 1 <= [minLines] <= [maxLines]. This parameter is ignored when [singleLine] is true.
  * @param interactionSource an optional hoisted [MutableInteractionSource] for observing and
- * emitting [Interaction]s for this text field. You can use this to change the text field's
- * appearance or preview the text field in different states. Note that if `null` is provided,
- * interactions will still happen internally.
+ *   emitting [Interaction]s for this text field. You can use this to change the text field's
+ *   appearance or preview the text field in different states. Note that if `null` is provided,
+ *   interactions will still happen internally.
  * @param shape the shape of the text field's border
  * @param colors [TextFieldColors] that will be used to resolve color of the text and content
- * (including label, placeholder, leading and trailing icons, border) for this text field in
- * different states. See [TextFieldDefaults.outlinedTextFieldColors]
+ *   (including label, placeholder, leading and trailing icons, border) for this text field in
+ *   different states. See [TextFieldDefaults.outlinedTextFieldColors]
  */
 @Composable
 fun OutlinedTextField(
@@ -368,9 +373,7 @@
     @Suppress("NAME_SHADOWING")
     val interactionSource = interactionSource ?: remember { MutableInteractionSource() }
     // If color is not provided via the text style, use content color as a default
-    val textColor = textStyle.color.takeOrElse {
-        colors.textColor(enabled).value
-    }
+    val textColor = textStyle.color.takeOrElse { colors.textColor(enabled).value }
     val mergedTextStyle = textStyle.merge(TextStyle(color = textColor))
 
     val density = LocalDensity.current
@@ -378,23 +381,24 @@
     @OptIn(ExperimentalMaterialApi::class)
     BasicTextField(
         value = value,
-        modifier = modifier
-            .then(
-                if (label != null) {
-                    Modifier
-                        // Merge semantics at the beginning of the modifier chain to ensure
-                        // padding is considered part of the text field.
-                        .semantics(mergeDescendants = true) {}
-                        .padding(top = with(density) { OutlinedTextFieldTopPadding.toDp() })
-                } else {
-                    Modifier
-                }
-            )
-            .defaultErrorSemantics(isError, getString(Strings.DefaultErrorMessage))
-            .defaultMinSize(
-                minWidth = TextFieldDefaults.MinWidth,
-                minHeight = TextFieldDefaults.MinHeight
-            ),
+        modifier =
+            modifier
+                .then(
+                    if (label != null) {
+                        Modifier
+                            // Merge semantics at the beginning of the modifier chain to ensure
+                            // padding is considered part of the text field.
+                            .semantics(mergeDescendants = true) {}
+                            .padding(top = with(density) { OutlinedTextFieldTopPadding.toDp() })
+                    } else {
+                        Modifier
+                    }
+                )
+                .defaultErrorSemantics(isError, getString(Strings.DefaultErrorMessage))
+                .defaultMinSize(
+                    minWidth = TextFieldDefaults.MinWidth,
+                    minHeight = TextFieldDefaults.MinHeight
+                ),
         onValueChange = onValueChange,
         enabled = enabled,
         readOnly = readOnly,
@@ -407,32 +411,33 @@
         singleLine = singleLine,
         maxLines = maxLines,
         minLines = minLines,
-        decorationBox = @Composable { innerTextField ->
-            TextFieldDefaults.OutlinedTextFieldDecorationBox(
-                value = value.text,
-                visualTransformation = visualTransformation,
-                innerTextField = innerTextField,
-                placeholder = placeholder,
-                label = label,
-                leadingIcon = leadingIcon,
-                trailingIcon = trailingIcon,
-                singleLine = singleLine,
-                enabled = enabled,
-                isError = isError,
-                interactionSource = interactionSource,
-                shape = shape,
-                colors = colors,
-                border = {
-                    TextFieldDefaults.BorderBox(
-                        enabled,
-                        isError,
-                        interactionSource,
-                        colors,
-                        shape
-                    )
-                }
-            )
-        }
+        decorationBox =
+            @Composable { innerTextField ->
+                TextFieldDefaults.OutlinedTextFieldDecorationBox(
+                    value = value.text,
+                    visualTransformation = visualTransformation,
+                    innerTextField = innerTextField,
+                    placeholder = placeholder,
+                    label = label,
+                    leadingIcon = leadingIcon,
+                    trailingIcon = trailingIcon,
+                    singleLine = singleLine,
+                    enabled = enabled,
+                    isError = isError,
+                    interactionSource = interactionSource,
+                    shape = shape,
+                    colors = colors,
+                    border = {
+                        TextFieldDefaults.BorderBox(
+                            enabled,
+                            isError,
+                            interactionSource,
+                            colors,
+                            shape
+                        )
+                    }
+                )
+            }
     )
 }
 
@@ -488,10 +493,9 @@
 
 /**
  * Layout of the leading and trailing icons and the text field, label and placeholder in
- * [OutlinedTextField].
- * It doesn't use Row to position the icons and middle part because label should not be
- * positioned in the middle part.
-\ */
+ * [OutlinedTextField]. It doesn't use Row to position the icons and middle part because label
+ * should not be positioned in the middle part. \
+ */
 @Composable
 internal fun OutlinedTextFieldLayout(
     modifier: Modifier,
@@ -506,14 +510,15 @@
     border: @Composable () -> Unit,
     paddingValues: PaddingValues
 ) {
-    val measurePolicy = remember(onLabelMeasured, singleLine, animationProgress, paddingValues) {
-        OutlinedTextFieldMeasurePolicy(
-            onLabelMeasured,
-            singleLine,
-            animationProgress,
-            paddingValues
-        )
-    }
+    val measurePolicy =
+        remember(onLabelMeasured, singleLine, animationProgress, paddingValues) {
+            OutlinedTextFieldMeasurePolicy(
+                onLabelMeasured,
+                singleLine,
+                animationProgress,
+                paddingValues
+            )
+        }
     val layoutDirection = LocalLayoutDirection.current
     Layout(
         modifier = modifier,
@@ -544,20 +549,21 @@
 
             val startTextFieldPadding = paddingValues.calculateStartPadding(layoutDirection)
             val endTextFieldPadding = paddingValues.calculateEndPadding(layoutDirection)
-            val padding = Modifier.padding(
-                start = if (leading != null) {
-                    (startTextFieldPadding - HorizontalIconPadding).coerceAtLeast(
-                        0.dp
-                    )
-                } else {
-                    startTextFieldPadding
-                },
-                end = if (trailing != null) {
-                    (endTextFieldPadding - HorizontalIconPadding).coerceAtLeast(0.dp)
-                } else {
-                    endTextFieldPadding
-                }
-            )
+            val padding =
+                Modifier.padding(
+                    start =
+                        if (leading != null) {
+                            (startTextFieldPadding - HorizontalIconPadding).coerceAtLeast(0.dp)
+                        } else {
+                            startTextFieldPadding
+                        },
+                    end =
+                        if (trailing != null) {
+                            (endTextFieldPadding - HorizontalIconPadding).coerceAtLeast(0.dp)
+                        } else {
+                            endTextFieldPadding
+                        }
+                )
             if (placeholder != null) {
                 placeholder(Modifier.layoutId(PlaceholderId).then(padding))
             }
@@ -593,57 +599,58 @@
 
         // measure leading icon
         val relaxedConstraints = constraints.copy(minWidth = 0, minHeight = 0)
-        val leadingPlaceable = measurables.fastFirstOrNull {
-            it.layoutId == LeadingId
-        }?.measure(relaxedConstraints)
-        occupiedSpaceHorizontally += widthOrZero(
-            leadingPlaceable
-        )
+        val leadingPlaceable =
+            measurables.fastFirstOrNull { it.layoutId == LeadingId }?.measure(relaxedConstraints)
+        occupiedSpaceHorizontally += widthOrZero(leadingPlaceable)
 
         // measure trailing icon
-        val trailingPlaceable = measurables.fastFirstOrNull { it.layoutId == TrailingId }
-            ?.measure(relaxedConstraints.offset(horizontal = -occupiedSpaceHorizontally))
-        occupiedSpaceHorizontally += widthOrZero(
-            trailingPlaceable
-        )
+        val trailingPlaceable =
+            measurables
+                .fastFirstOrNull { it.layoutId == TrailingId }
+                ?.measure(relaxedConstraints.offset(horizontal = -occupiedSpaceHorizontally))
+        occupiedSpaceHorizontally += widthOrZero(trailingPlaceable)
 
         // measure label
         val labelHorizontalPaddingOffset =
             paddingValues.calculateLeftPadding(layoutDirection).roundToPx() +
                 paddingValues.calculateRightPadding(layoutDirection).roundToPx()
-        val labelConstraints = relaxedConstraints.offset(
-            horizontal = lerp(
-                -occupiedSpaceHorizontally - labelHorizontalPaddingOffset,
-                -labelHorizontalPaddingOffset,
-                animationProgress,
-            ),
-            vertical = -bottomPadding
-        )
+        val labelConstraints =
+            relaxedConstraints.offset(
+                horizontal =
+                    lerp(
+                        -occupiedSpaceHorizontally - labelHorizontalPaddingOffset,
+                        -labelHorizontalPaddingOffset,
+                        animationProgress,
+                    ),
+                vertical = -bottomPadding
+            )
         val labelPlaceable =
             measurables.fastFirstOrNull { it.layoutId == LabelId }?.measure(labelConstraints)
-        val labelSize = labelPlaceable?.let {
-            Size(it.width.toFloat(), it.height.toFloat())
-        } ?: Size.Zero
+        val labelSize =
+            labelPlaceable?.let { Size(it.width.toFloat(), it.height.toFloat()) } ?: Size.Zero
         onLabelMeasured(labelSize)
 
         // measure text field
         // on top we offset either by default padding or by label's half height if its too big
         // minHeight must not be set to 0 due to how foundation TextField treats zero minHeight
-        val topPadding = max(
-            heightOrZero(labelPlaceable) / 2,
-            paddingValues.calculateTopPadding().roundToPx()
-        )
-        val textConstraints = constraints.offset(
-            horizontal = -occupiedSpaceHorizontally,
-            vertical = -bottomPadding - topPadding
-        ).copy(minHeight = 0)
+        val topPadding =
+            max(heightOrZero(labelPlaceable) / 2, paddingValues.calculateTopPadding().roundToPx())
+        val textConstraints =
+            constraints
+                .offset(
+                    horizontal = -occupiedSpaceHorizontally,
+                    vertical = -bottomPadding - topPadding
+                )
+                .copy(minHeight = 0)
         val textFieldPlaceable =
             measurables.fastFirst { it.layoutId == TextFieldId }.measure(textConstraints)
 
         // measure placeholder
         val placeholderConstraints = textConstraints.copy(minWidth = 0)
-        val placeholderPlaceable = measurables.fastFirstOrNull { it.layoutId == PlaceholderId }
-            ?.measure(placeholderConstraints)
+        val placeholderPlaceable =
+            measurables
+                .fastFirstOrNull { it.layoutId == PlaceholderId }
+                ?.measure(placeholderConstraints)
 
         val width =
             calculateWidth(
@@ -670,14 +677,17 @@
                 paddingValues = paddingValues,
             )
 
-        val borderPlaceable = measurables.fastFirst { it.layoutId == BorderId }.measure(
-            Constraints(
-                minWidth = if (width != Constraints.Infinity) width else 0,
-                maxWidth = width,
-                minHeight = if (height != Constraints.Infinity) height else 0,
-                maxHeight = height
-            )
-        )
+        val borderPlaceable =
+            measurables
+                .fastFirst { it.layoutId == BorderId }
+                .measure(
+                    Constraints(
+                        minWidth = if (width != Constraints.Infinity) width else 0,
+                        maxWidth = width,
+                        minHeight = if (height != Constraints.Infinity) height else 0,
+                        maxHeight = height
+                    )
+                )
         return layout(width, height) {
             place(
                 height,
@@ -740,18 +750,22 @@
     ): Int {
         val textFieldWidth =
             intrinsicMeasurer(measurables.fastFirst { it.layoutId == TextFieldId }, height)
-        val labelWidth = measurables.fastFirstOrNull { it.layoutId == LabelId }?.let {
-            intrinsicMeasurer(it, height)
-        } ?: 0
-        val trailingWidth = measurables.fastFirstOrNull { it.layoutId == TrailingId }?.let {
-            intrinsicMeasurer(it, height)
-        } ?: 0
-        val leadingWidth = measurables.fastFirstOrNull { it.layoutId == LeadingId }?.let {
-            intrinsicMeasurer(it, height)
-        } ?: 0
-        val placeholderWidth = measurables.fastFirstOrNull { it.layoutId == PlaceholderId }?.let {
-            intrinsicMeasurer(it, height)
-        } ?: 0
+        val labelWidth =
+            measurables
+                .fastFirstOrNull { it.layoutId == LabelId }
+                ?.let { intrinsicMeasurer(it, height) } ?: 0
+        val trailingWidth =
+            measurables
+                .fastFirstOrNull { it.layoutId == TrailingId }
+                ?.let { intrinsicMeasurer(it, height) } ?: 0
+        val leadingWidth =
+            measurables
+                .fastFirstOrNull { it.layoutId == LeadingId }
+                ?.let { intrinsicMeasurer(it, height) } ?: 0
+        val placeholderWidth =
+            measurables
+                .fastFirstOrNull { it.layoutId == PlaceholderId }
+                ?.let { intrinsicMeasurer(it, height) } ?: 0
         return calculateWidth(
             leadingPlaceableWidth = leadingWidth,
             trailingPlaceableWidth = trailingWidth,
@@ -771,28 +785,38 @@
         intrinsicMeasurer: (IntrinsicMeasurable, Int) -> Int
     ): Int {
         var remainingWidth = width
-        val leadingHeight = measurables.fastFirstOrNull { it.layoutId == LeadingId }?.let {
-            remainingWidth = remainingWidth.substractConstraintSafely(
-                it.maxIntrinsicWidth(Constraints.Infinity)
-            )
-            intrinsicMeasurer(it, width)
-        } ?: 0
-        val trailingHeight = measurables.fastFirstOrNull { it.layoutId == TrailingId }?.let {
-            remainingWidth = remainingWidth.substractConstraintSafely(
-                it.maxIntrinsicWidth(Constraints.Infinity)
-            )
-            intrinsicMeasurer(it, width)
-        } ?: 0
+        val leadingHeight =
+            measurables
+                .fastFirstOrNull { it.layoutId == LeadingId }
+                ?.let {
+                    remainingWidth =
+                        remainingWidth.substractConstraintSafely(
+                            it.maxIntrinsicWidth(Constraints.Infinity)
+                        )
+                    intrinsicMeasurer(it, width)
+                } ?: 0
+        val trailingHeight =
+            measurables
+                .fastFirstOrNull { it.layoutId == TrailingId }
+                ?.let {
+                    remainingWidth =
+                        remainingWidth.substractConstraintSafely(
+                            it.maxIntrinsicWidth(Constraints.Infinity)
+                        )
+                    intrinsicMeasurer(it, width)
+                } ?: 0
 
-        val labelHeight = measurables.fastFirstOrNull { it.layoutId == LabelId }?.let {
-            intrinsicMeasurer(it, lerp(remainingWidth, width, animationProgress))
-        } ?: 0
+        val labelHeight =
+            measurables
+                .fastFirstOrNull { it.layoutId == LabelId }
+                ?.let { intrinsicMeasurer(it, lerp(remainingWidth, width, animationProgress)) } ?: 0
 
         val textFieldHeight =
             intrinsicMeasurer(measurables.fastFirst { it.layoutId == TextFieldId }, remainingWidth)
-        val placeholderHeight = measurables.fastFirstOrNull { it.layoutId == PlaceholderId }?.let {
-            intrinsicMeasurer(it, remainingWidth)
-        } ?: 0
+        val placeholderHeight =
+            measurables
+                .fastFirstOrNull { it.layoutId == PlaceholderId }
+                ?.let { intrinsicMeasurer(it, remainingWidth) } ?: 0
 
         return calculateHeight(
             leadingPlaceableHeight = leadingHeight,
@@ -816,8 +840,7 @@
 }
 
 /**
- * Calculate the width of the [OutlinedTextField] given all elements that should be
- * placed inside
+ * Calculate the width of the [OutlinedTextField] given all elements that should be placed inside
  */
 private fun calculateWidth(
     leadingPlaceableWidth: Int,
@@ -830,17 +853,19 @@
     density: Float,
     paddingValues: PaddingValues,
 ): Int {
-    val middleSection = maxOf(
-        textFieldPlaceableWidth,
-        lerp(labelPlaceableWidth, 0, animationProgress),
-        placeholderPlaceableWidth
-    )
-    val wrappedWidth =
-        leadingPlaceableWidth + middleSection + trailingPlaceableWidth
+    val middleSection =
+        maxOf(
+            textFieldPlaceableWidth,
+            lerp(labelPlaceableWidth, 0, animationProgress),
+            placeholderPlaceableWidth
+        )
+    val wrappedWidth = leadingPlaceableWidth + middleSection + trailingPlaceableWidth
 
     // Actual LayoutDirection doesn't matter; we only need the sum
-    val labelHorizontalPadding = (paddingValues.calculateLeftPadding(LayoutDirection.Ltr) +
-        paddingValues.calculateRightPadding(LayoutDirection.Ltr)).value * density
+    val labelHorizontalPadding =
+        (paddingValues.calculateLeftPadding(LayoutDirection.Ltr) +
+                paddingValues.calculateRightPadding(LayoutDirection.Ltr))
+            .value * density
     val focusedLabelWidth =
         ((labelPlaceableWidth + labelHorizontalPadding) * animationProgress).roundToInt()
 
@@ -848,8 +873,7 @@
 }
 
 /**
- * Calculate the height of the [OutlinedTextField] given all elements that should be
- * placed inside
+ * Calculate the height of the [OutlinedTextField] given all elements that should be placed inside
  */
 private fun calculateHeight(
     leadingPlaceableHeight: Int,
@@ -862,27 +886,25 @@
     density: Float,
     paddingValues: PaddingValues
 ): Int {
-    val inputFieldHeight = maxOf(
-        textFieldPlaceableHeight,
-        placeholderPlaceableHeight,
-        lerp(labelPlaceableHeight, 0, animationProgress),
-    )
+    val inputFieldHeight =
+        maxOf(
+            textFieldPlaceableHeight,
+            placeholderPlaceableHeight,
+            lerp(labelPlaceableHeight, 0, animationProgress),
+        )
     val topPadding = paddingValues.calculateTopPadding().value * density
-    val actualTopPadding = lerp(
-        topPadding,
-        max(topPadding, labelPlaceableHeight / 2f),
-        animationProgress,
-    )
+    val actualTopPadding =
+        lerp(
+            topPadding,
+            max(topPadding, labelPlaceableHeight / 2f),
+            animationProgress,
+        )
     val bottomPadding = paddingValues.calculateBottomPadding().value * density
     val middleSectionHeight = actualTopPadding + inputFieldHeight + bottomPadding
 
     return max(
         constraints.minHeight,
-        maxOf(
-            leadingPlaceableHeight,
-            trailingPlaceableHeight,
-            middleSectionHeight.roundToInt()
-        )
+        maxOf(leadingPlaceableHeight, trailingPlaceableHeight, middleSectionHeight.roundToInt())
     )
 }
 
@@ -926,44 +948,47 @@
     // label position is animated
     // in single line text field label is centered vertically before animation starts
     labelPlaceable?.let {
-        val startPositionY = if (singleLine) {
-            Alignment.CenterVertically.align(it.height, height)
-        } else {
-            topPadding
-        }
-        val positionY = lerp(startPositionY, -(it.height / 2), animationProgress)
-        val positionX = (
-            if (leadingPlaceable == null) {
-                0f
+        val startPositionY =
+            if (singleLine) {
+                Alignment.CenterVertically.align(it.height, height)
             } else {
-                (widthOrZero(leadingPlaceable) - iconPadding) * (1 - animationProgress)
+                topPadding
             }
-            ).roundToInt() + startPadding
+        val positionY = lerp(startPositionY, -(it.height / 2), animationProgress)
+        val positionX =
+            (if (leadingPlaceable == null) {
+                    0f
+                } else {
+                    (widthOrZero(leadingPlaceable) - iconPadding) * (1 - animationProgress)
+                })
+                .roundToInt() + startPadding
         it.placeRelative(positionX, positionY)
     }
 
     // placed center vertically and after the leading icon horizontally if single line text field
     // placed to the top with padding for multi line text field
-    val textVerticalPosition = max(
-        if (singleLine) {
-            Alignment.CenterVertically.align(textFieldPlaceable.height, height)
-        } else {
-            topPadding
-        },
-        heightOrZero(labelPlaceable) / 2
-    )
-    textFieldPlaceable.placeRelative(widthOrZero(leadingPlaceable), textVerticalPosition)
-
-    // placed similar to the input text above
-    placeholderPlaceable?.let {
-        val placeholderVerticalPosition = max(
+    val textVerticalPosition =
+        max(
             if (singleLine) {
-                Alignment.CenterVertically.align(it.height, height)
+                Alignment.CenterVertically.align(textFieldPlaceable.height, height)
             } else {
                 topPadding
             },
             heightOrZero(labelPlaceable) / 2
         )
+    textFieldPlaceable.placeRelative(widthOrZero(leadingPlaceable), textVerticalPosition)
+
+    // placed similar to the input text above
+    placeholderPlaceable?.let {
+        val placeholderVerticalPosition =
+            max(
+                if (singleLine) {
+                    Alignment.CenterVertically.align(it.height, height)
+                } else {
+                    topPadding
+                },
+                heightOrZero(labelPlaceable) / 2
+            )
         it.placeRelative(widthOrZero(leadingPlaceable), placeholderVerticalPosition)
     }
 
@@ -978,14 +1003,16 @@
             val innerPadding = OutlinedTextFieldInnerPadding.toPx()
             val leftLtr = paddingValues.calculateLeftPadding(layoutDirection).toPx() - innerPadding
             val rightLtr = leftLtr + labelWidth + 2 * innerPadding
-            val left = when (layoutDirection) {
-                LayoutDirection.Rtl -> size.width - rightLtr
-                else -> leftLtr.coerceAtLeast(0f)
-            }
-            val right = when (layoutDirection) {
-                LayoutDirection.Rtl -> size.width - leftLtr.coerceAtLeast(0f)
-                else -> rightLtr
-            }
+            val left =
+                when (layoutDirection) {
+                    LayoutDirection.Rtl -> size.width - rightLtr
+                    else -> leftLtr.coerceAtLeast(0f)
+                }
+            val right =
+                when (layoutDirection) {
+                    LayoutDirection.Rtl -> size.width - leftLtr.coerceAtLeast(0f)
+                    else -> rightLtr
+                }
             val labelHeight = labelSize.height
             // using label height as a cutout area to make sure that no hairline artifacts are
             // left when we clip the border
@@ -1001,9 +1028,9 @@
 
 /**
  * In the focused state, the top half of the label sticks out above the text field. This default
- * padding is a best-effort approximation to keep the label from overlapping with the content
- * above it. It is sufficient when the label is a single line and developers do not override the
- * label's font size/style. Otherwise, developers will need to add additional padding themselves.
+ * padding is a best-effort approximation to keep the label from overlapping with the content above
+ * it. It is sufficient when the label is a single line and developers do not override the label's
+ * font size/style. Otherwise, developers will need to add additional padding themselves.
  */
 internal val OutlinedTextFieldTopPadding = 8.sp
 
diff --git a/compose/material/material/src/commonMain/kotlin/androidx/compose/material/ProgressIndicator.kt b/compose/material/material/src/commonMain/kotlin/androidx/compose/material/ProgressIndicator.kt
index ff76abf..b4b1268 100644
--- a/compose/material/material/src/commonMain/kotlin/androidx/compose/material/ProgressIndicator.kt
+++ b/compose/material/material/src/commonMain/kotlin/androidx/compose/material/ProgressIndicator.kt
@@ -56,8 +56,7 @@
 
 internal fun Modifier.increaseSemanticsBounds(): Modifier {
     val padding = 10.dp
-    return this
-        .layout { measurable, constraints ->
+    return this.layout { measurable, constraints ->
             val paddingPx = padding.roundToPx()
             // We need to add vertical padding to the semantics bounds in other to meet
             // screenreader green box minimum size, but we also want to
@@ -71,39 +70,39 @@
             // space. Place the placeable where it would've been without any extra padding.
             val height = placeable.height - paddingPx * 2
             val width = placeable.width
-            layout(width, height) {
-                placeable.place(0, -paddingPx)
-            }
+            layout(width, height) { placeable.place(0, -paddingPx) }
         }
         .semantics(mergeDescendants = true) {}
         .padding(vertical = padding)
 }
 
 /**
- * Determinate <a href="https://material.io/components/progress-indicators#linear-progress-indicators" class="external" target="_blank">Material Design linear progress indicator</a>.
+ * Determinate <a
+ * href="https://material.io/components/progress-indicators#linear-progress-indicators"
+ * class="external" target="_blank">Material Design linear progress indicator</a>.
  *
  * Progress indicators express an unspecified wait time or display the length of a process.
  *
- * ![Linear progress indicator image](https://developer.android.com/images/reference/androidx/compose/material/linear-progress-indicator.png)
+ * ![Linear progress indicator
+ * image](https://developer.android.com/images/reference/androidx/compose/material/linear-progress-indicator.png)
  *
  * By default there is no animation between [progress] values. You can use
- * [ProgressIndicatorDefaults.ProgressAnimationSpec] as the default recommended
- * [AnimationSpec] when animating progress, such as in the following example:
+ * [ProgressIndicatorDefaults.ProgressAnimationSpec] as the default recommended [AnimationSpec] when
+ * animating progress, such as in the following example:
  *
  * @sample androidx.compose.material.samples.LinearProgressIndicatorSample
  *
  * @param progress The progress of this progress indicator, where 0.0 represents no progress and 1.0
- * represents full progress. Values outside of this range are coerced into the range.
+ *   represents full progress. Values outside of this range are coerced into the range.
  * @param modifier the [Modifier] to be applied to this progress indicator
  * @param color The color of the progress indicator.
  * @param backgroundColor The color of the background behind the indicator, visible when the
- * progress has not reached that area of the overall indicator yet.
+ *   progress has not reached that area of the overall indicator yet.
  * @param strokeCap stroke cap to use for the ends of this progress indicator
  */
 @Composable
 fun LinearProgressIndicator(
-    @FloatRange(from = 0.0, to = 1.0)
-    progress: Float,
+    @FloatRange(from = 0.0, to = 1.0) progress: Float,
     modifier: Modifier = Modifier,
     color: Color = MaterialTheme.colors.primary,
     backgroundColor: Color = color.copy(alpha = IndicatorBackgroundOpacity),
@@ -123,16 +122,19 @@
 }
 
 /**
- * Indeterminate <a href="https://material.io/components/progress-indicators#linear-progress-indicators" class="external" target="_blank">Material Design linear progress indicator</a>.
+ * Indeterminate <a
+ * href="https://material.io/components/progress-indicators#linear-progress-indicators"
+ * class="external" target="_blank">Material Design linear progress indicator</a>.
  *
  * Progress indicators express an unspecified wait time or display the length of a process.
  *
- * ![Linear progress indicator image](https://developer.android.com/images/reference/androidx/compose/material/linear-progress-indicator.png)
+ * ![Linear progress indicator
+ * image](https://developer.android.com/images/reference/androidx/compose/material/linear-progress-indicator.png)
  *
  * @param modifier the [Modifier] to be applied to this progress indicator
  * @param color The color of the progress indicator.
  * @param backgroundColor The color of the background behind the indicator, visible when the
- * progress has not reached that area of the overall indicator yet.
+ *   progress has not reached that area of the overall indicator yet.
  * @param strokeCap stroke cap to use for the ends of this progress indicator
  */
 @Composable
@@ -146,50 +148,58 @@
     // Fractional position of the 'head' and 'tail' of the two lines drawn. I.e if the head is 0.8
     // and the tail is 0.2, there is a line drawn from between 20% along to 80% along the total
     // width.
-    val firstLineHead by infiniteTransition.animateFloat(
-        0f,
-        1f,
-        infiniteRepeatable(
-            animation = keyframes {
-                durationMillis = LinearAnimationDuration
-                0f at FirstLineHeadDelay using FirstLineHeadEasing
-                1f at FirstLineHeadDuration + FirstLineHeadDelay
-            }
+    val firstLineHead by
+        infiniteTransition.animateFloat(
+            0f,
+            1f,
+            infiniteRepeatable(
+                animation =
+                    keyframes {
+                        durationMillis = LinearAnimationDuration
+                        0f at FirstLineHeadDelay using FirstLineHeadEasing
+                        1f at FirstLineHeadDuration + FirstLineHeadDelay
+                    }
+            )
         )
-    )
-    val firstLineTail by infiniteTransition.animateFloat(
-        0f,
-        1f,
-        infiniteRepeatable(
-            animation = keyframes {
-                durationMillis = LinearAnimationDuration
-                0f at FirstLineTailDelay using FirstLineTailEasing
-                1f at FirstLineTailDuration + FirstLineTailDelay
-            }
+    val firstLineTail by
+        infiniteTransition.animateFloat(
+            0f,
+            1f,
+            infiniteRepeatable(
+                animation =
+                    keyframes {
+                        durationMillis = LinearAnimationDuration
+                        0f at FirstLineTailDelay using FirstLineTailEasing
+                        1f at FirstLineTailDuration + FirstLineTailDelay
+                    }
+            )
         )
-    )
-    val secondLineHead by infiniteTransition.animateFloat(
-        0f,
-        1f,
-        infiniteRepeatable(
-            animation = keyframes {
-                durationMillis = LinearAnimationDuration
-                0f at SecondLineHeadDelay using SecondLineHeadEasing
-                1f at SecondLineHeadDuration + SecondLineHeadDelay
-            }
+    val secondLineHead by
+        infiniteTransition.animateFloat(
+            0f,
+            1f,
+            infiniteRepeatable(
+                animation =
+                    keyframes {
+                        durationMillis = LinearAnimationDuration
+                        0f at SecondLineHeadDelay using SecondLineHeadEasing
+                        1f at SecondLineHeadDuration + SecondLineHeadDelay
+                    }
+            )
         )
-    )
-    val secondLineTail by infiniteTransition.animateFloat(
-        0f,
-        1f,
-        infiniteRepeatable(
-            animation = keyframes {
-                durationMillis = LinearAnimationDuration
-                0f at SecondLineTailDelay using SecondLineTailEasing
-                1f at SecondLineTailDuration + SecondLineTailDelay
-            }
+    val secondLineTail by
+        infiniteTransition.animateFloat(
+            0f,
+            1f,
+            infiniteRepeatable(
+                animation =
+                    keyframes {
+                        durationMillis = LinearAnimationDuration
+                        0f at SecondLineTailDelay using SecondLineTailEasing
+                        1f at SecondLineTailDuration + SecondLineTailDelay
+                    }
+            )
         )
-    )
     Canvas(
         modifier
             .increaseSemanticsBounds()
@@ -226,13 +236,14 @@
     modifier: Modifier = Modifier,
     color: Color = MaterialTheme.colors.primary,
     backgroundColor: Color = color.copy(alpha = IndicatorBackgroundOpacity)
-) = LinearProgressIndicator(
-    progress,
-    modifier,
-    color,
-    backgroundColor,
-    strokeCap = StrokeCap.Butt,
-)
+) =
+    LinearProgressIndicator(
+        progress,
+        modifier,
+        color,
+        backgroundColor,
+        strokeCap = StrokeCap.Butt,
+    )
 
 @Deprecated("Maintained for binary compatibility", level = DeprecationLevel.HIDDEN)
 @Composable
@@ -240,12 +251,13 @@
     modifier: Modifier = Modifier,
     color: Color = MaterialTheme.colors.primary,
     backgroundColor: Color = color.copy(alpha = IndicatorBackgroundOpacity)
-) = LinearProgressIndicator(
-    modifier,
-    color,
-    backgroundColor,
-    strokeCap = StrokeCap.Butt,
-)
+) =
+    LinearProgressIndicator(
+        modifier,
+        color,
+        backgroundColor,
+        strokeCap = StrokeCap.Butt,
+    )
 
 private fun DrawScope.drawLinearIndicator(
     startFraction: Float,
@@ -294,31 +306,33 @@
 ) = drawLinearIndicator(0f, 1f, color, strokeWidth, strokeCap)
 
 /**
- * Determinate <a href="https://material.io/components/progress-indicators#circular-progress-indicators" class="external" target="_blank">Material Design circular progress indicator</a>.
+ * Determinate <a
+ * href="https://material.io/components/progress-indicators#circular-progress-indicators"
+ * class="external" target="_blank">Material Design circular progress indicator</a>.
  *
  * Progress indicators express an unspecified wait time or display the length of a process.
  *
- * ![Circular progress indicator image](https://developer.android.com/images/reference/androidx/compose/material/circular-progress-indicator.png)
+ * ![Circular progress indicator
+ * image](https://developer.android.com/images/reference/androidx/compose/material/circular-progress-indicator.png)
  *
  * By default there is no animation between [progress] values. You can use
- * [ProgressIndicatorDefaults.ProgressAnimationSpec] as the default recommended
- * [AnimationSpec] when animating progress, such as in the following example:
+ * [ProgressIndicatorDefaults.ProgressAnimationSpec] as the default recommended [AnimationSpec] when
+ * animating progress, such as in the following example:
  *
  * @sample androidx.compose.material.samples.CircularProgressIndicatorSample
  *
  * @param progress The progress of this progress indicator, where 0.0 represents no progress and 1.0
- * represents full progress. Values outside of this range are coerced into the range.
+ *   represents full progress. Values outside of this range are coerced into the range.
  * @param modifier the [Modifier] to be applied to this progress indicator
  * @param color The color of the progress indicator.
  * @param strokeWidth The stroke width for the progress indicator.
  * @param backgroundColor The color of the background behind the indicator, visible when the
- * progress has not reached that area of the overall indicator yet.
+ *   progress has not reached that area of the overall indicator yet.
  * @param strokeCap stroke cap to use for the ends of this progress indicator
  */
 @Composable
 fun CircularProgressIndicator(
-    @FloatRange(from = 0.0, to = 1.0)
-    progress: Float,
+    @FloatRange(from = 0.0, to = 1.0) progress: Float,
     modifier: Modifier = Modifier,
     color: Color = MaterialTheme.colors.primary,
     strokeWidth: Dp = ProgressIndicatorDefaults.StrokeWidth,
@@ -326,14 +340,8 @@
     strokeCap: StrokeCap = StrokeCap.Butt,
 ) {
     val coercedProgress = progress.fastCoerceIn(0f, 1f)
-    val stroke = with(LocalDensity.current) {
-        Stroke(width = strokeWidth.toPx(), cap = strokeCap)
-    }
-    Canvas(
-        modifier
-            .progressSemantics(coercedProgress)
-            .size(CircularIndicatorDiameter)
-    ) {
+    val stroke = with(LocalDensity.current) { Stroke(width = strokeWidth.toPx(), cap = strokeCap) }
+    Canvas(modifier.progressSemantics(coercedProgress).size(CircularIndicatorDiameter)) {
         // Start at 12 O'clock
         val startAngle = 270f
         val sweep = coercedProgress * 360f
@@ -343,17 +351,20 @@
 }
 
 /**
- * Indeterminate <a href="https://material.io/components/progress-indicators#circular-progress-indicators" class="external" target="_blank">Material Design circular progress indicator</a>.
+ * Indeterminate <a
+ * href="https://material.io/components/progress-indicators#circular-progress-indicators"
+ * class="external" target="_blank">Material Design circular progress indicator</a>.
  *
  * Progress indicators express an unspecified wait time or display the length of a process.
  *
- * ![Circular progress indicator image](https://developer.android.com/images/reference/androidx/compose/material/circular-progress-indicator.png)
+ * ![Circular progress indicator
+ * image](https://developer.android.com/images/reference/androidx/compose/material/circular-progress-indicator.png)
  *
  * @param modifier the [Modifier] to be applied to this progress indicator
  * @param color The color of the progress indicator.
  * @param strokeWidth The stroke width for the progress indicator.
  * @param backgroundColor The color of the background behind the indicator, visible when the
- * progress has not reached that area of the overall indicator yet.
+ *   progress has not reached that area of the overall indicator yet.
  * @param strokeCap stroke cap to use for the ends of this progress indicator
  */
 @Composable
@@ -364,63 +375,61 @@
     backgroundColor: Color = Color.Transparent,
     strokeCap: StrokeCap = StrokeCap.Square,
 ) {
-    val stroke = with(LocalDensity.current) {
-        Stroke(width = strokeWidth.toPx(), cap = strokeCap)
-    }
+    val stroke = with(LocalDensity.current) { Stroke(width = strokeWidth.toPx(), cap = strokeCap) }
 
     val transition = rememberInfiniteTransition()
     // The current rotation around the circle, so we know where to start the rotation from
-    val currentRotation by transition.animateValue(
-        0,
-        RotationsPerCycle,
-        Int.VectorConverter,
-        infiniteRepeatable(
-            animation = tween(
-                durationMillis = RotationDuration * RotationsPerCycle,
-                easing = LinearEasing
+    val currentRotation by
+        transition.animateValue(
+            0,
+            RotationsPerCycle,
+            Int.VectorConverter,
+            infiniteRepeatable(
+                animation =
+                    tween(
+                        durationMillis = RotationDuration * RotationsPerCycle,
+                        easing = LinearEasing
+                    )
             )
         )
-    )
     // How far forward (degrees) the base point should be from the start point
-    val baseRotation by transition.animateFloat(
-        0f,
-        BaseRotationAngle,
-        infiniteRepeatable(
-            animation = tween(
-                durationMillis = RotationDuration,
-                easing = LinearEasing
+    val baseRotation by
+        transition.animateFloat(
+            0f,
+            BaseRotationAngle,
+            infiniteRepeatable(
+                animation = tween(durationMillis = RotationDuration, easing = LinearEasing)
             )
         )
-    )
     // How far forward (degrees) both the head and tail should be from the base point
-    val endAngle by transition.animateFloat(
-        0f,
-        JumpRotationAngle,
-        infiniteRepeatable(
-            animation = keyframes {
-                durationMillis = HeadAndTailAnimationDuration + HeadAndTailDelayDuration
-                0f at 0 using CircularEasing
-                JumpRotationAngle at HeadAndTailAnimationDuration
-            }
+    val endAngle by
+        transition.animateFloat(
+            0f,
+            JumpRotationAngle,
+            infiniteRepeatable(
+                animation =
+                    keyframes {
+                        durationMillis = HeadAndTailAnimationDuration + HeadAndTailDelayDuration
+                        0f at 0 using CircularEasing
+                        JumpRotationAngle at HeadAndTailAnimationDuration
+                    }
+            )
         )
-    )
 
-    val startAngle by transition.animateFloat(
-        0f,
-        JumpRotationAngle,
-        infiniteRepeatable(
-            animation = keyframes {
-                durationMillis = HeadAndTailAnimationDuration + HeadAndTailDelayDuration
-                0f at HeadAndTailDelayDuration using CircularEasing
-                JumpRotationAngle at durationMillis
-            }
+    val startAngle by
+        transition.animateFloat(
+            0f,
+            JumpRotationAngle,
+            infiniteRepeatable(
+                animation =
+                    keyframes {
+                        durationMillis = HeadAndTailAnimationDuration + HeadAndTailDelayDuration
+                        0f at HeadAndTailDelayDuration using CircularEasing
+                        JumpRotationAngle at durationMillis
+                    }
+            )
         )
-    )
-    Canvas(
-        modifier
-            .progressSemantics()
-            .size(CircularIndicatorDiameter)
-    ) {
+    Canvas(modifier.progressSemantics().size(CircularIndicatorDiameter)) {
         drawCircularIndicatorBackground(backgroundColor, stroke)
 
         val currentRotationAngleOffset = (currentRotation * RotationAngleOffset) % 360f
@@ -441,14 +450,15 @@
     modifier: Modifier = Modifier,
     color: Color = MaterialTheme.colors.primary,
     strokeWidth: Dp = ProgressIndicatorDefaults.StrokeWidth
-) = CircularProgressIndicator(
-    progress,
-    modifier,
-    color,
-    strokeWidth,
-    backgroundColor = Color.Transparent,
-    strokeCap = StrokeCap.Butt,
-)
+) =
+    CircularProgressIndicator(
+        progress,
+        modifier,
+        color,
+        strokeWidth,
+        backgroundColor = Color.Transparent,
+        strokeCap = StrokeCap.Butt,
+    )
 
 @Deprecated("Maintained for binary compatibility", level = DeprecationLevel.HIDDEN)
 @Composable
@@ -456,13 +466,14 @@
     modifier: Modifier = Modifier,
     color: Color = MaterialTheme.colors.primary,
     strokeWidth: Dp = ProgressIndicatorDefaults.StrokeWidth
-) = CircularProgressIndicator(
-    modifier,
-    color,
-    strokeWidth,
-    backgroundColor = Color.Transparent,
-    strokeCap = StrokeCap.Square,
-)
+) =
+    CircularProgressIndicator(
+        modifier,
+        color,
+        strokeWidth,
+        backgroundColor = Color.Transparent,
+        strokeCap = StrokeCap.Square,
+    )
 
 private fun DrawScope.drawCircularIndicator(
     startAngle: Float,
@@ -485,10 +496,8 @@
     )
 }
 
-private fun DrawScope.drawCircularIndicatorBackground(
-    color: Color,
-    stroke: Stroke
-) = drawCircularIndicator(0f, 360f, color, stroke)
+private fun DrawScope.drawCircularIndicatorBackground(color: Color, stroke: Stroke) =
+    drawCircularIndicator(0f, 360f, color, stroke)
 
 /**
  * Contains the default values used for [LinearProgressIndicator] and [CircularProgressIndicator].
@@ -498,8 +507,8 @@
      * Default stroke width for [CircularProgressIndicator], and default height for
      * [LinearProgressIndicator].
      *
-     * This can be customized with the `strokeWidth` parameter on [CircularProgressIndicator],
-     * and by passing a layout modifier setting the height for [LinearProgressIndicator].
+     * This can be customized with the `strokeWidth` parameter on [CircularProgressIndicator], and
+     * by passing a layout modifier setting the height for [LinearProgressIndicator].
      */
     val StrokeWidth = 4.dp
 
@@ -513,13 +522,14 @@
      * The default [AnimationSpec] that should be used when animating between progress in a
      * determinate progress indicator.
      */
-    val ProgressAnimationSpec = SpringSpec(
-        dampingRatio = Spring.DampingRatioNoBouncy,
-        stiffness = Spring.StiffnessVeryLow,
-        // The default threshold is 0.01, or 1% of the overall progress range, which is quite
-        // large and noticeable.
-        visibilityThreshold = 1 / 1000f
-    )
+    val ProgressAnimationSpec =
+        SpringSpec(
+            dampingRatio = Spring.DampingRatioNoBouncy,
+            stiffness = Spring.StiffnessVeryLow,
+            // The default threshold is 0.01, or 1% of the overall progress range, which is quite
+            // large and noticeable.
+            visibilityThreshold = 1 / 1000f
+        )
 }
 
 private fun DrawScope.drawDeterminateCircularIndicator(
@@ -536,14 +546,15 @@
     color: Color,
     stroke: Stroke
 ) {
-    val strokeCapOffset = if (stroke.cap == StrokeCap.Butt) {
-        0f
-    } else {
-        // Length of arc is angle * radius
-        // Angle (radians) is length / radius
-        // The length should be the same as the stroke width for calculating the min angle
-        (180.0 / PI).toFloat() * (strokeWidth / (CircularIndicatorDiameter / 2)) / 2f
-    }
+    val strokeCapOffset =
+        if (stroke.cap == StrokeCap.Butt) {
+            0f
+        } else {
+            // Length of arc is angle * radius
+            // Angle (radians) is length / radius
+            // The length should be the same as the stroke width for calculating the min angle
+            (180.0 / PI).toFloat() * (strokeWidth / (CircularIndicatorDiameter / 2)) / 2f
+        }
 
     // Adding a stroke cap draws half the stroke width behind the start point, so we want to
     // move it forward by that amount so the arc visually appears in the correct place
diff --git a/compose/material/material/src/commonMain/kotlin/androidx/compose/material/RadioButton.kt b/compose/material/material/src/commonMain/kotlin/androidx/compose/material/RadioButton.kt
index c92538e..4a8a098 100644
--- a/compose/material/material/src/commonMain/kotlin/androidx/compose/material/RadioButton.kt
+++ b/compose/material/material/src/commonMain/kotlin/androidx/compose/material/RadioButton.kt
@@ -43,11 +43,13 @@
 import androidx.compose.ui.unit.dp
 
 /**
- * <a href="https://material.io/components/radio-buttons" class="external" target="_blank">Material Design radio button</a>.
+ * <a href="https://material.io/components/radio-buttons" class="external" target="_blank">Material
+ * Design radio button</a>.
  *
  * Radio buttons allow users to select one option from a set.
  *
- * ![Radio buttons image](https://developer.android.com/images/reference/androidx/compose/material/radio-buttons.png)
+ * ![Radio buttons
+ * image](https://developer.android.com/images/reference/androidx/compose/material/radio-buttons.png)
  *
  * @sample androidx.compose.material.samples.RadioButtonSample
  *
@@ -58,16 +60,17 @@
  *
  * @param selected whether this radio button is selected or not
  * @param onClick callback to be invoked when the RadioButton is clicked. If null, then this
- * RadioButton will not handle input events, and only act as a visual indicator of [selected] state
+ *   RadioButton will not handle input events, and only act as a visual indicator of [selected]
+ *   state
  * @param modifier Modifier to be applied to the radio button
  * @param enabled Controls the enabled state of the [RadioButton]. When `false`, this button will
- * not be selectable and appears disabled
+ *   not be selectable and appears disabled
  * @param interactionSource an optional hoisted [MutableInteractionSource] for observing and
- * emitting [Interaction]s for this radio button. You can use this to change the radio button's
- * appearance or preview the radio button in different states. Note that if `null` is provided,
- * interactions will still happen internally.
+ *   emitting [Interaction]s for this radio button. You can use this to change the radio button's
+ *   appearance or preview the radio button in different states. Note that if `null` is provided,
+ *   interactions will still happen internally.
  * @param colors [RadioButtonColors] that will be used to resolve the color used for this
- * RadioButton in different states. See [RadioButtonDefaults.colors].
+ *   RadioButton in different states. See [RadioButtonDefaults.colors].
  */
 @Composable
 fun RadioButton(
@@ -78,10 +81,11 @@
     interactionSource: MutableInteractionSource? = null,
     colors: RadioButtonColors = RadioButtonDefaults.colors()
 ) {
-    val dotRadius = animateDpAsState(
-        targetValue = if (selected) RadioButtonDotSize / 2 else 0.dp,
-        animationSpec = tween(durationMillis = RadioAnimationDuration)
-    )
+    val dotRadius =
+        animateDpAsState(
+            targetValue = if (selected) RadioButtonDotSize / 2 else 0.dp,
+            animationSpec = tween(durationMillis = RadioAnimationDuration)
+        )
     val radioColor = colors.radioColor(enabled, selected)
     val selectableModifier =
         if (onClick != null) {
@@ -91,10 +95,11 @@
                 enabled = enabled,
                 role = Role.RadioButton,
                 interactionSource = interactionSource,
-                indication = rippleOrFallbackImplementation(
-                    bounded = false,
-                    radius = RadioButtonRippleRadius
-                )
+                indication =
+                    rippleOrFallbackImplementation(
+                        bounded = false,
+                        radius = RadioButtonRippleRadius
+                    )
             )
         } else {
             Modifier
@@ -135,23 +140,20 @@
 @Stable
 interface RadioButtonColors {
     /**
-     * Represents the main color used to draw the outer and inner circles, depending on whether
-     * the [RadioButton] is [enabled] / [selected].
+     * Represents the main color used to draw the outer and inner circles, depending on whether the
+     * [RadioButton] is [enabled] / [selected].
      *
      * @param enabled whether the [RadioButton] is enabled
      * @param selected whether the [RadioButton] is selected
      */
-    @Composable
-    fun radioColor(enabled: Boolean, selected: Boolean): State<Color>
+    @Composable fun radioColor(enabled: Boolean, selected: Boolean): State<Color>
 }
 
-/**
- * Defaults used in [RadioButton].
- */
+/** Defaults used in [RadioButton]. */
 object RadioButtonDefaults {
     /**
-     * Creates a [RadioButtonColors] that will animate between the provided colors according to
-     * the Material specification.
+     * Creates a [RadioButtonColors] that will animate between the provided colors according to the
+     * Material specification.
      *
      * @param selectedColor the color to use for the RadioButton when selected and enabled.
      * @param unselectedColor the color to use for the RadioButton when unselected and enabled.
@@ -164,19 +166,13 @@
         unselectedColor: Color = MaterialTheme.colors.onSurface.copy(alpha = 0.6f),
         disabledColor: Color = MaterialTheme.colors.onSurface.copy(alpha = ContentAlpha.disabled)
     ): RadioButtonColors {
-        return remember(
-            selectedColor,
-            unselectedColor,
-            disabledColor
-        ) {
+        return remember(selectedColor, unselectedColor, disabledColor) {
             DefaultRadioButtonColors(selectedColor, unselectedColor, disabledColor)
         }
     }
 }
 
-/**
- * Default [RadioButtonColors] implementation.
- */
+/** Default [RadioButtonColors] implementation. */
 @Immutable
 private class DefaultRadioButtonColors(
     private val selectedColor: Color,
@@ -185,11 +181,12 @@
 ) : RadioButtonColors {
     @Composable
     override fun radioColor(enabled: Boolean, selected: Boolean): State<Color> {
-        val target = when {
-            !enabled -> disabledColor
-            !selected -> unselectedColor
-            else -> selectedColor
-        }
+        val target =
+            when {
+                !enabled -> disabledColor
+                !selected -> unselectedColor
+                else -> selectedColor
+            }
 
         // If not enabled 'snap' to the disabled state, as there should be no animations between
         // enabled / disabled.
diff --git a/compose/material/material/src/commonMain/kotlin/androidx/compose/material/Ripple.kt b/compose/material/material/src/commonMain/kotlin/androidx/compose/material/Ripple.kt
index 7b371e3..3f85abe 100644
--- a/compose/material/material/src/commonMain/kotlin/androidx/compose/material/Ripple.kt
+++ b/compose/material/material/src/commonMain/kotlin/androidx/compose/material/Ripple.kt
@@ -44,17 +44,17 @@
 /**
  * Creates a Ripple using the provided values and values inferred from the theme.
  *
- * A Ripple is a Material implementation of [Indication] that expresses different [Interaction]s
- * by drawing ripple animations and state layers.
+ * A Ripple is a Material implementation of [Indication] that expresses different [Interaction]s by
+ * drawing ripple animations and state layers.
  *
- * A Ripple responds to [PressInteraction.Press] by starting a new animation, and
- * responds to other [Interaction]s by showing a fixed state layer with varying alpha values
- * depending on the [Interaction].
+ * A Ripple responds to [PressInteraction.Press] by starting a new animation, and responds to other
+ * [Interaction]s by showing a fixed state layer with varying alpha values depending on the
+ * [Interaction].
  *
  * [MaterialTheme] provides Ripples using [androidx.compose.foundation.LocalIndication], so a Ripple
  * will be used as the default [Indication] inside components such as
- * [androidx.compose.foundation.clickable] and [androidx.compose.foundation.indication], in
- * addition to Material provided components that use a Ripple as well.
+ * [androidx.compose.foundation.clickable] and [androidx.compose.foundation.indication], in addition
+ * to Material provided components that use a Ripple as well.
  *
  * You can also explicitly create a Ripple and provide it to custom components in order to change
  * the parameters from the default, such as to create an unbounded ripple with a fixed size.
@@ -63,15 +63,14 @@
  * [ripple] overload with a [ColorProducer] parameter. This will avoid unnecessary recompositions
  * when changing the color, and preserve existing ripple state when the color changes.
  *
- * @param bounded If true, ripples are clipped by the bounds of the target layout. Unbounded
- * ripples always animate from the target layout center, bounded ripples animate from the touch
- * position.
+ * @param bounded If true, ripples are clipped by the bounds of the target layout. Unbounded ripples
+ *   always animate from the target layout center, bounded ripples animate from the touch position.
  * @param radius the radius for the ripple. If [Dp.Unspecified] is provided then the size will be
- * calculated based on the target layout size.
+ *   calculated based on the target layout size.
  * @param color the color of the ripple. This color is usually the same color used by the text or
- * iconography in the component. This color will then have [RippleDefaults.rippleAlpha]
- * applied to calculate the final color used to draw the ripple. If [Color.Unspecified] is
- * provided the color used will be [RippleDefaults.rippleColor] instead.
+ *   iconography in the component. This color will then have [RippleDefaults.rippleAlpha] applied to
+ *   calculate the final color used to draw the ripple. If [Color.Unspecified] is provided the color
+ *   used will be [RippleDefaults.rippleColor] instead.
  */
 @Stable
 fun ripple(
@@ -89,17 +88,17 @@
 /**
  * Creates a Ripple using the provided values and values inferred from the theme.
  *
- * A Ripple is a Material implementation of [Indication] that expresses different [Interaction]s
- * by drawing ripple animations and state layers.
+ * A Ripple is a Material implementation of [Indication] that expresses different [Interaction]s by
+ * drawing ripple animations and state layers.
  *
- * A Ripple responds to [PressInteraction.Press] by starting a new ripple animation, and
- * responds to other [Interaction]s by showing a fixed state layer with varying alpha values
- * depending on the [Interaction].
+ * A Ripple responds to [PressInteraction.Press] by starting a new ripple animation, and responds to
+ * other [Interaction]s by showing a fixed state layer with varying alpha values depending on the
+ * [Interaction].
  *
  * [MaterialTheme] provides Ripples using [androidx.compose.foundation.LocalIndication], so a Ripple
  * will be used as the default [Indication] inside components such as
- * [androidx.compose.foundation.clickable] and [androidx.compose.foundation.indication], in
- * addition to Material provided components that use a Ripple as well.
+ * [androidx.compose.foundation.clickable] and [androidx.compose.foundation.indication], in addition
+ * to Material provided components that use a Ripple as well.
  *
  * You can also explicitly create a Ripple and provide it to custom components in order to change
  * the parameters from the default, such as to create an unbounded ripple with a fixed size.
@@ -109,16 +108,15 @@
  * unnecessary recompositions.
  *
  * @param color the color of the ripple. This color is usually the same color used by the text or
- * iconography in the component. This color will then have [RippleDefaults.rippleAlpha]
- * applied to calculate the final color used to draw the ripple. If you are creating this
- * [ColorProducer] outside of composition (where it will be automatically remembered), make sure
- * that its instance is stable (such as by remembering the object that holds it), or remember the
- * returned [ripple] object to make sure that ripple nodes are not being created each recomposition.
- * @param bounded If true, ripples are clipped by the bounds of the target layout. Unbounded
- * ripples always animate from the target layout center, bounded ripples animate from the touch
- * position.
+ *   iconography in the component. This color will then have [RippleDefaults.rippleAlpha] applied to
+ *   calculate the final color used to draw the ripple. If you are creating this [ColorProducer]
+ *   outside of composition (where it will be automatically remembered), make sure that its instance
+ *   is stable (such as by remembering the object that holds it), or remember the returned [ripple]
+ *   object to make sure that ripple nodes are not being created each recomposition.
+ * @param bounded If true, ripples are clipped by the bounds of the target layout. Unbounded ripples
+ *   always animate from the target layout center, bounded ripples animate from the touch position.
  * @param radius the radius for the ripple. If [Dp.Unspecified] is provided then the size will be
- * calculated based on the target layout size.
+ *   calculated based on the target layout size.
  */
 @Stable
 fun ripple(
@@ -129,22 +127,17 @@
     return RippleNodeFactory(bounded, radius, color)
 }
 
-/**
- * Default values used by [ripple].
- */
+/** Default values used by [ripple]. */
 object RippleDefaults {
     /**
      * Represents the default color that will be used for a ripple if a color has not been
      * explicitly set on the ripple instance.
      *
-     * @param contentColor the color of content (text or iconography) in the component that
-     * contains the ripple.
+     * @param contentColor the color of content (text or iconography) in the component that contains
+     *   the ripple.
      * @param lightTheme whether the theme is light or not
      */
-    fun rippleColor(
-        contentColor: Color,
-        lightTheme: Boolean
-    ): Color {
+    fun rippleColor(contentColor: Color, lightTheme: Boolean): Color {
         val contentLuminance = contentColor.luminance()
         // If we are on a colored surface (typically indicated by low luminance content), the
         // ripple color should be white.
@@ -160,8 +153,8 @@
      * Represents the default [RippleAlpha] that will be used for a ripple to indicate different
      * states.
      *
-     * @param contentColor the color of content (text or iconography) in the component that
-     * contains the ripple.
+     * @param contentColor the color of content (text or iconography) in the component that contains
+     *   the ripple.
      * @param lightTheme whether the theme is light or not
      */
     fun rippleAlpha(contentColor: Color, lightTheme: Boolean): RippleAlpha {
@@ -183,8 +176,8 @@
 /**
  * Temporary CompositionLocal to allow configuring whether the old ripple implementation that uses
  * the deprecated [androidx.compose.material.ripple.RippleTheme] API should be used in Material
- * components and LocalIndication, instead of the new [ripple] API. This flag defaults to false,
- * and will be removed after one stable release: it should only be used to temporarily unblock
+ * components and LocalIndication, instead of the new [ripple] API. This flag defaults to false, and
+ * will be removed after one stable release: it should only be used to temporarily unblock
  * upgrading.
  *
  * Provide this CompositionLocal before you provide [MaterialTheme] to make sure it is correctly
@@ -195,7 +188,9 @@
 @get:ExperimentalMaterialApi
 @ExperimentalMaterialApi
 val LocalUseFallbackRippleImplementation: ProvidableCompositionLocal<Boolean> =
-    staticCompositionLocalOf { false }
+    staticCompositionLocalOf {
+        false
+    }
 
 /**
  * CompositionLocal used for providing [RippleConfiguration] down the tree. This acts as a
@@ -205,27 +200,29 @@
  *
  * In most cases you should rely on the default theme behavior for consistency with other components
  * - this exists as an escape hatch for individual components and is not intended to be used for
- * full theme customization across an application. For this use case you should instead build your
- * own custom ripple that queries your design system theme values directly using
- * [createRippleModifierNode].
+ *   full theme customization across an application. For this use case you should instead build your
+ *   own custom ripple that queries your design system theme values directly using
+ *   [createRippleModifierNode].
  */
 @Suppress("OPT_IN_MARKER_ON_WRONG_TARGET")
 @get:ExperimentalMaterialApi
 @ExperimentalMaterialApi
 val LocalRippleConfiguration: ProvidableCompositionLocal<RippleConfiguration?> =
-    compositionLocalOf { RippleConfiguration() }
+    compositionLocalOf {
+        RippleConfiguration()
+    }
 
 /**
  * Configuration for [ripple] appearance, provided using [LocalRippleConfiguration]. In most cases
- * the default values should be used, for custom design system use cases you should instead
- * build your own custom ripple using [createRippleModifierNode]. To disable the ripple, provide
- * `null` using [LocalRippleConfiguration].
+ * the default values should be used, for custom design system use cases you should instead build
+ * your own custom ripple using [createRippleModifierNode]. To disable the ripple, provide `null`
+ * using [LocalRippleConfiguration].
  *
  * @param color the color override for the ripple. If [Color.Unspecified], then the default color
- * from the theme will be used instead. Note that if the ripple has a color explicitly set with
- * the parameter on [ripple], that will always be used instead of this value.
+ *   from the theme will be used instead. Note that if the ripple has a color explicitly set with
+ *   the parameter on [ripple], that will always be used instead of this value.
  * @param rippleAlpha the [RippleAlpha] override for this ripple. If null, then the default alpha
- * will be used instead.
+ *   will be used instead.
  */
 @Immutable
 @ExperimentalMaterialApi
@@ -277,21 +274,24 @@
 
     @Deprecated("Super method is deprecated")
     @Composable
-    override fun defaultColor() = RippleDefaults.rippleColor(
-        contentColor = LocalContentColor.current,
-        lightTheme = MaterialTheme.colors.isLight
-    )
+    override fun defaultColor() =
+        RippleDefaults.rippleColor(
+            contentColor = LocalContentColor.current,
+            lightTheme = MaterialTheme.colors.isLight
+        )
 
     @Deprecated("Super method is deprecated")
     @Composable
-    override fun rippleAlpha() = RippleDefaults.rippleAlpha(
-        contentColor = LocalContentColor.current,
-        lightTheme = MaterialTheme.colors.isLight
-    )
+    override fun rippleAlpha() =
+        RippleDefaults.rippleAlpha(
+            contentColor = LocalContentColor.current,
+            lightTheme = MaterialTheme.colors.isLight
+        )
 }
 
 @Stable
-private class RippleNodeFactory private constructor(
+private class RippleNodeFactory
+private constructor(
     private val bounded: Boolean,
     private val radius: Dp,
     private val colorProducer: ColorProducer?,
@@ -303,11 +303,7 @@
         colorProducer: ColorProducer
     ) : this(bounded, radius, colorProducer, Color.Unspecified)
 
-    constructor(
-        bounded: Boolean,
-        radius: Dp,
-        color: Color
-    ) : this(bounded, radius, null, color)
+    constructor(bounded: Boolean, radius: Dp, color: Color) : this(bounded, radius, null, color)
 
     override fun create(interactionSource: InteractionSource): DelegatableNode {
         val colorProducer = colorProducer ?: ColorProducer { color }
@@ -352,8 +348,8 @@
 
     /**
      * Handles [LocalRippleConfiguration] changing between null / non-null. Changes to
-     * [RippleConfiguration.color] and [RippleConfiguration.rippleAlpha] are handled as part of
-     * the ripple definition.
+     * [RippleConfiguration.color] and [RippleConfiguration.rippleAlpha] are handled as part of the
+     * ripple definition.
      */
     private fun updateConfiguration() {
         observeReads {
@@ -389,19 +385,23 @@
             // If this is null, the ripple will be removed, so this should always be non-null in
             // normal use
             val rippleConfiguration = currentValueOf(LocalRippleConfiguration)
-            rippleConfiguration?.rippleAlpha ?: RippleDefaults.rippleAlpha(
-                contentColor = currentValueOf(LocalContentColor),
-                lightTheme = currentValueOf(LocalColors).isLight
-            )
+            rippleConfiguration?.rippleAlpha
+                ?: RippleDefaults.rippleAlpha(
+                    contentColor = currentValueOf(LocalContentColor),
+                    lightTheme = currentValueOf(LocalColors).isLight
+                )
         }
 
-        rippleNode = delegate(createRippleModifierNode(
-            interactionSource,
-            bounded,
-            radius,
-            calculateColor,
-            calculateRippleAlpha
-        ))
+        rippleNode =
+            delegate(
+                createRippleModifierNode(
+                    interactionSource,
+                    bounded,
+                    radius,
+                    calculateColor,
+                    calculateRippleAlpha
+                )
+            )
     }
 
     private fun removeRipple() {
@@ -409,33 +409,28 @@
     }
 }
 
-private val DefaultBoundedRipple = RippleNodeFactory(
-    bounded = true,
-    radius = Dp.Unspecified,
-    color = Color.Unspecified
-)
+private val DefaultBoundedRipple =
+    RippleNodeFactory(bounded = true, radius = Dp.Unspecified, color = Color.Unspecified)
 
-private val DefaultUnboundedRipple = RippleNodeFactory(
-    bounded = false,
-    radius = Dp.Unspecified,
-    color = Color.Unspecified
-)
+private val DefaultUnboundedRipple =
+    RippleNodeFactory(bounded = false, radius = Dp.Unspecified, color = Color.Unspecified)
 
 /**
  * Alpha values for high luminance content in a light theme.
  *
- * This content will typically be placed on colored surfaces, so it is important that the
- * contrast here is higher to meet accessibility standards, and increase legibility.
+ * This content will typically be placed on colored surfaces, so it is important that the contrast
+ * here is higher to meet accessibility standards, and increase legibility.
  *
- * These levels are typically used for text / iconography in primary colored tabs /
- * bottom navigation / etc.
+ * These levels are typically used for text / iconography in primary colored tabs / bottom
+ * navigation / etc.
  */
-private val LightThemeHighContrastRippleAlpha = RippleAlpha(
-    pressedAlpha = 0.24f,
-    focusedAlpha = 0.24f,
-    draggedAlpha = 0.16f,
-    hoveredAlpha = 0.08f
-)
+private val LightThemeHighContrastRippleAlpha =
+    RippleAlpha(
+        pressedAlpha = 0.24f,
+        focusedAlpha = 0.24f,
+        draggedAlpha = 0.16f,
+        hoveredAlpha = 0.08f
+    )
 
 /**
  * Alpha levels for low luminance content in a light theme.
@@ -443,22 +438,22 @@
  * This content will typically be placed on grayscale surfaces, so the contrast here can be lower
  * without sacrificing accessibility and legibility.
  *
- * These levels are typically used for body text on the main surface (white in light theme, grey
- * in dark theme) and text / iconography in surface colored tabs / bottom navigation / etc.
+ * These levels are typically used for body text on the main surface (white in light theme, grey in
+ * dark theme) and text / iconography in surface colored tabs / bottom navigation / etc.
  */
-private val LightThemeLowContrastRippleAlpha = RippleAlpha(
-    pressedAlpha = 0.12f,
-    focusedAlpha = 0.12f,
-    draggedAlpha = 0.08f,
-    hoveredAlpha = 0.04f
-)
+private val LightThemeLowContrastRippleAlpha =
+    RippleAlpha(
+        pressedAlpha = 0.12f,
+        focusedAlpha = 0.12f,
+        draggedAlpha = 0.08f,
+        hoveredAlpha = 0.04f
+    )
 
-/**
- * Alpha levels for all content in a dark theme.
- */
-private val DarkThemeRippleAlpha = RippleAlpha(
-    pressedAlpha = 0.10f,
-    focusedAlpha = 0.12f,
-    draggedAlpha = 0.08f,
-    hoveredAlpha = 0.04f
-)
+/** Alpha levels for all content in a dark theme. */
+private val DarkThemeRippleAlpha =
+    RippleAlpha(
+        pressedAlpha = 0.10f,
+        focusedAlpha = 0.12f,
+        draggedAlpha = 0.08f,
+        hoveredAlpha = 0.04f
+    )
diff --git a/compose/material/material/src/commonMain/kotlin/androidx/compose/material/Scaffold.kt b/compose/material/material/src/commonMain/kotlin/androidx/compose/material/Scaffold.kt
index f2d382c..189a8b7 100644
--- a/compose/material/material/src/commonMain/kotlin/androidx/compose/material/Scaffold.kt
+++ b/compose/material/material/src/commonMain/kotlin/androidx/compose/material/Scaffold.kt
@@ -51,33 +51,25 @@
  * layout has happened
  *
  * @param drawerState the drawer state
- * @param snackbarHostState instance of [SnackbarHostState] to be used to show [Snackbar]s
- * inside of the [Scaffold]
+ * @param snackbarHostState instance of [SnackbarHostState] to be used to show [Snackbar]s inside of
+ *   the [Scaffold]
  */
-@Stable
-class ScaffoldState(
-    val drawerState: DrawerState,
-    val snackbarHostState: SnackbarHostState
-)
+@Stable class ScaffoldState(val drawerState: DrawerState, val snackbarHostState: SnackbarHostState)
 
 /**
  * Creates a [ScaffoldState] with the default animation clock and memoizes it.
  *
  * @param drawerState the drawer state
- * @param snackbarHostState instance of [SnackbarHostState] to be used to show [Snackbar]s
- * inside of the [Scaffold]
+ * @param snackbarHostState instance of [SnackbarHostState] to be used to show [Snackbar]s inside of
+ *   the [Scaffold]
  */
 @Composable
 fun rememberScaffoldState(
     drawerState: DrawerState = rememberDrawerState(DrawerValue.Closed),
     snackbarHostState: SnackbarHostState = remember { SnackbarHostState() }
-): ScaffoldState = remember {
-    ScaffoldState(drawerState, snackbarHostState)
-}
+): ScaffoldState = remember { ScaffoldState(drawerState, snackbarHostState) }
 
-/**
- * The possible positions for a [FloatingActionButton] attached to a [Scaffold].
- */
+/** The possible positions for a [FloatingActionButton] attached to a [Scaffold]. */
 @JvmInline
 value class FabPosition internal constructor(@Suppress("unused") private val value: Int) {
     companion object {
@@ -110,17 +102,18 @@
 }
 
 /**
- * <a href="https://material.io/design/layout/understanding-layout.html" class="external" target="_blank">Material Design layout</a>.
+ * <a href="https://material.io/design/layout/understanding-layout.html" class="external"
+ * target="_blank">Material Design layout</a>.
  *
  * Scaffold implements the basic material design visual layout structure.
  *
- * This component provides API to put together several material components to construct your
- * screen, by ensuring proper layout strategy for them and collecting necessary data so these
- * components will work together correctly.
+ * This component provides API to put together several material components to construct your screen,
+ * by ensuring proper layout strategy for them and collecting necessary data so these components
+ * will work together correctly.
  *
- * For similar components that implement different layout structures, see [BackdropScaffold],
- * which uses a backdrop as the centerpiece of the screen, and [BottomSheetScaffold], which uses
- * a persistent bottom sheet as the centerpiece of the screen.
+ * For similar components that implement different layout structures, see [BackdropScaffold], which
+ * uses a backdrop as the centerpiece of the screen, and [BottomSheetScaffold], which uses a
+ * persistent bottom sheet as the centerpiece of the screen.
  *
  * This particular overload provides ability to specify [WindowInsets]. Recommended value can be
  * found in [ScaffoldDefaults.contentWindowInsets].
@@ -134,49 +127,49 @@
  *
  * @sample androidx.compose.material.samples.ScaffoldWithBottomBarAndCutout
  *
- * To show a [Snackbar], use [SnackbarHostState.showSnackbar]. Scaffold state already
- * have [ScaffoldState.snackbarHostState] when created
+ * To show a [Snackbar], use [SnackbarHostState.showSnackbar]. Scaffold state already have
+ * [ScaffoldState.snackbarHostState] when created
  *
  * @sample androidx.compose.material.samples.ScaffoldWithSimpleSnackbar
  *
  * @param contentWindowInsets window insets to be passed to [content] slot via [PaddingValues]
- * params. Scaffold will take the insets into account from the top/bottom only if the [topBar]/
- * [bottomBar] are not present, as the scaffold expect [topBar]/[bottomBar] to handle insets
- * instead. Any insets consumed by other insets padding modifiers or [consumeWindowInsets] on a
- * parent layout will be excluded from [contentWindowInsets].
+ *   params. Scaffold will take the insets into account from the top/bottom only if the [topBar]/
+ *   [bottomBar] are not present, as the scaffold expect [topBar]/[bottomBar] to handle insets
+ *   instead. Any insets consumed by other insets padding modifiers or [consumeWindowInsets] on a
+ *   parent layout will be excluded from [contentWindowInsets].
  * @param modifier optional Modifier for the root of the [Scaffold]
  * @param scaffoldState state of this scaffold widget. It contains the state of the screen, e.g.
- * variables to provide manual control over the drawer behavior, sizes of components, etc
+ *   variables to provide manual control over the drawer behavior, sizes of components, etc
  * @param topBar top app bar of the screen. Consider using [TopAppBar].
  * @param bottomBar bottom bar of the screen. Consider using [BottomAppBar].
  * @param snackbarHost component to host [Snackbar]s that are pushed to be shown via
- * [SnackbarHostState.showSnackbar]. Usually it's a [SnackbarHost]
+ *   [SnackbarHostState.showSnackbar]. Usually it's a [SnackbarHost]
  * @param floatingActionButton Main action button of your screen. Consider using
- * [FloatingActionButton] for this slot.
+ *   [FloatingActionButton] for this slot.
  * @param floatingActionButtonPosition position of the FAB on the screen. See [FabPosition] for
- * possible options available.
+ *   possible options available.
  * @param isFloatingActionButtonDocked whether [floatingActionButton] should overlap with
- * [bottomBar] for half a height, if [bottomBar] exists. Ignored if there's no [bottomBar] or no
- * [floatingActionButton].
- * @param drawerContent content of the Drawer sheet that can be pulled from the left side (right
- * for RTL).
+ *   [bottomBar] for half a height, if [bottomBar] exists. Ignored if there's no [bottomBar] or no
+ *   [floatingActionButton].
+ * @param drawerContent content of the Drawer sheet that can be pulled from the left side (right for
+ *   RTL).
  * @param drawerGesturesEnabled whether or not drawer (if set) can be interacted with via gestures
  * @param drawerShape shape of the drawer sheet (if set)
- * @param drawerElevation drawer sheet elevation. This controls the size of the shadow
- * below the drawer sheet (if set)
+ * @param drawerElevation drawer sheet elevation. This controls the size of the shadow below the
+ *   drawer sheet (if set)
  * @param drawerBackgroundColor background color to be used for the drawer sheet
- * @param drawerContentColor color of the content to use inside the drawer sheet. Defaults to
- * either the matching content color for [drawerBackgroundColor], or, if it is not a color from
- * the theme, this will keep the same value set above this Surface.
+ * @param drawerContentColor color of the content to use inside the drawer sheet. Defaults to either
+ *   the matching content color for [drawerBackgroundColor], or, if it is not a color from the
+ *   theme, this will keep the same value set above this Surface.
  * @param drawerScrimColor color of the scrim that obscures content when the drawer is open
  * @param backgroundColor background of the scaffold body
  * @param contentColor color of the content in scaffold body. Defaults to either the matching
- * content color for [backgroundColor], or, if it is not a color from the theme, this will keep
- * the same value set above this Surface.
+ *   content color for [backgroundColor], or, if it is not a color from the theme, this will keep
+ *   the same value set above this Surface.
  * @param content content of your screen. The lambda receives an [PaddingValues] that should be
- * applied to the content root via Modifier.padding to properly offset top and bottom bars. If
- * you're using VerticalScroller, apply this modifier to the child of the scroller, and not on
- * the scroller itself.
+ *   applied to the content root via Modifier.padding to properly offset top and bottom bars. If
+ *   you're using VerticalScroller, apply this modifier to the child of the scroller, and not on the
+ *   scroller itself.
  */
 @Composable
 fun Scaffold(
@@ -200,33 +193,31 @@
     contentColor: Color = contentColorFor(backgroundColor),
     content: @Composable (PaddingValues) -> Unit
 ) {
-    val safeInsets = remember(contentWindowInsets) {
-        MutableWindowInsets(contentWindowInsets)
-    }
-    val child = @Composable { childModifier: Modifier ->
-        Surface(
-            modifier = childModifier
-                .onConsumedWindowInsetsChanged { consumedWindowInsets ->
-                    // Exclude currently consumed window insets from user provided contentWindowInsets
-                    safeInsets.insets = contentWindowInsets.exclude(consumedWindowInsets)
-                },
-            color = backgroundColor,
-            contentColor = contentColor
-        ) {
-            ScaffoldLayout(
-                isFabDocked = isFloatingActionButtonDocked,
-                fabPosition = floatingActionButtonPosition,
-                topBar = topBar,
-                content = content,
-                contentWindowInsets = safeInsets,
-                snackbar = {
-                    snackbarHost(scaffoldState.snackbarHostState)
-                },
-                fab = floatingActionButton,
-                bottomBar = bottomBar
-            )
+    val safeInsets = remember(contentWindowInsets) { MutableWindowInsets(contentWindowInsets) }
+    val child =
+        @Composable { childModifier: Modifier ->
+            Surface(
+                modifier =
+                    childModifier.onConsumedWindowInsetsChanged { consumedWindowInsets ->
+                        // Exclude currently consumed window insets from user provided
+                        // contentWindowInsets
+                        safeInsets.insets = contentWindowInsets.exclude(consumedWindowInsets)
+                    },
+                color = backgroundColor,
+                contentColor = contentColor
+            ) {
+                ScaffoldLayout(
+                    isFabDocked = isFloatingActionButtonDocked,
+                    fabPosition = floatingActionButtonPosition,
+                    topBar = topBar,
+                    content = content,
+                    contentWindowInsets = safeInsets,
+                    snackbar = { snackbarHost(scaffoldState.snackbarHostState) },
+                    fab = floatingActionButton,
+                    bottomBar = bottomBar
+                )
+            }
         }
-    }
 
     if (drawerContent != null) {
         ModalDrawer(
@@ -247,17 +238,18 @@
 }
 
 /**
- * <a href="https://material.io/design/layout/understanding-layout.html" class="external" target="_blank">Material Design layout</a>.
+ * <a href="https://material.io/design/layout/understanding-layout.html" class="external"
+ * target="_blank">Material Design layout</a>.
  *
  * Scaffold implements the basic material design visual layout structure.
  *
- * This component provides API to put together several material components to construct your
- * screen, by ensuring proper layout strategy for them and collecting necessary data so these
- * components will work together correctly.
+ * This component provides API to put together several material components to construct your screen,
+ * by ensuring proper layout strategy for them and collecting necessary data so these components
+ * will work together correctly.
  *
- * For similar components that implement different layout structures, see [BackdropScaffold],
- * which uses a backdrop as the centerpiece of the screen, and [BottomSheetScaffold], which uses
- * a persistent bottom sheet as the centerpiece of the screen.
+ * For similar components that implement different layout structures, see [BackdropScaffold], which
+ * uses a backdrop as the centerpiece of the screen, and [BottomSheetScaffold], which uses a
+ * persistent bottom sheet as the centerpiece of the screen.
  *
  * Simple example of a Scaffold with [TopAppBar], [FloatingActionButton] and drawer:
  *
@@ -268,44 +260,44 @@
  *
  * @sample androidx.compose.material.samples.ScaffoldWithBottomBarAndCutout
  *
- * To show a [Snackbar], use [SnackbarHostState.showSnackbar]. Scaffold state already
- * have [ScaffoldState.snackbarHostState] when created
+ * To show a [Snackbar], use [SnackbarHostState.showSnackbar]. Scaffold state already have
+ * [ScaffoldState.snackbarHostState] when created
  *
  * @sample androidx.compose.material.samples.ScaffoldWithSimpleSnackbar
  *
  * @param modifier optional Modifier for the root of the [Scaffold]
  * @param scaffoldState state of this scaffold widget. It contains the state of the screen, e.g.
- * variables to provide manual control over the drawer behavior, sizes of components, etc
+ *   variables to provide manual control over the drawer behavior, sizes of components, etc
  * @param topBar top app bar of the screen. Consider using [TopAppBar].
  * @param bottomBar bottom bar of the screen. Consider using [BottomAppBar].
  * @param snackbarHost component to host [Snackbar]s that are pushed to be shown via
- * [SnackbarHostState.showSnackbar]. Usually it's a [SnackbarHost]
+ *   [SnackbarHostState.showSnackbar]. Usually it's a [SnackbarHost]
  * @param floatingActionButton Main action button of your screen. Consider using
- * [FloatingActionButton] for this slot.
+ *   [FloatingActionButton] for this slot.
  * @param floatingActionButtonPosition position of the FAB on the screen. See [FabPosition] for
- * possible options available.
+ *   possible options available.
  * @param isFloatingActionButtonDocked whether [floatingActionButton] should overlap with
- * [bottomBar] for half a height, if [bottomBar] exists. Ignored if there's no [bottomBar] or no
- * [floatingActionButton].
- * @param drawerContent content of the Drawer sheet that can be pulled from the left side (right
- * for RTL).
+ *   [bottomBar] for half a height, if [bottomBar] exists. Ignored if there's no [bottomBar] or no
+ *   [floatingActionButton].
+ * @param drawerContent content of the Drawer sheet that can be pulled from the left side (right for
+ *   RTL).
  * @param drawerGesturesEnabled whether or not drawer (if set) can be interacted with via gestures
  * @param drawerShape shape of the drawer sheet (if set)
- * @param drawerElevation drawer sheet elevation. This controls the size of the shadow
- * below the drawer sheet (if set)
+ * @param drawerElevation drawer sheet elevation. This controls the size of the shadow below the
+ *   drawer sheet (if set)
  * @param drawerBackgroundColor background color to be used for the drawer sheet
- * @param drawerContentColor color of the content to use inside the drawer sheet. Defaults to
- * either the matching content color for [drawerBackgroundColor], or, if it is not a color from
- * the theme, this will keep the same value set above this Surface.
+ * @param drawerContentColor color of the content to use inside the drawer sheet. Defaults to either
+ *   the matching content color for [drawerBackgroundColor], or, if it is not a color from the
+ *   theme, this will keep the same value set above this Surface.
  * @param drawerScrimColor color of the scrim that obscures content when the drawer is open
  * @param backgroundColor background of the scaffold body
  * @param contentColor color of the content in scaffold body. Defaults to either the matching
- * content color for [backgroundColor], or, if it is not a color from the theme, this will keep
- * the same value set above this Surface.
+ *   content color for [backgroundColor], or, if it is not a color from the theme, this will keep
+ *   the same value set above this Surface.
  * @param content content of your screen. The lambda receives an [PaddingValues] that should be
- * applied to the content root via Modifier.padding to properly offset top and bottom bars. If
- * you're using VerticalScroller, apply this modifier to the child of the scroller, and not on
- * the scroller itself.
+ *   applied to the content root via Modifier.padding to properly offset top and bottom bars. If
+ *   you're using VerticalScroller, apply this modifier to the child of the scroller, and not on the
+ *   scroller itself.
  */
 @Composable
 fun Scaffold(
@@ -351,16 +343,11 @@
     )
 }
 
-/**
- * Object containing various default values for [Scaffold] component.
- */
+/** Object containing various default values for [Scaffold] component. */
 object ScaffoldDefaults {
-    /**
-     * Recommended insets to be used and consumed by the scaffold content slot
-     */
+    /** Recommended insets to be used and consumed by the scaffold content slot */
     val contentWindowInsets: WindowInsets
-        @Composable
-        get() = WindowInsets.systemBarsForVisualComponents
+        @Composable get() = WindowInsets.systemBarsForVisualComponents
 }
 
 /**
@@ -371,10 +358,10 @@
  * @param topBar the content to place at the top of the [Scaffold], typically a [TopAppBar]
  * @param content the main 'body' of the [Scaffold]
  * @param snackbar the [Snackbar] displayed on top of the [content]
- * @param fab the [FloatingActionButton] displayed on top of the [content], below the [snackbar]
- * and above the [bottomBar]
- * @param bottomBar the content to place at the bottom of the [Scaffold], on top of the
- * [content], typically a [BottomAppBar].
+ * @param fab the [FloatingActionButton] displayed on top of the [content], below the [snackbar] and
+ *   above the [bottomBar]
+ * @param bottomBar the content to place at the bottom of the [Scaffold], on top of the [content],
+ *   typically a [BottomAppBar].
  */
 @Composable
 @UiComposable
@@ -394,155 +381,150 @@
 
         val looseConstraints = constraints.copy(minWidth = 0, minHeight = 0)
 
-        val topBarPlaceables = subcompose(ScaffoldLayoutContent.TopBar, topBar).fastMap {
-            it.measure(looseConstraints)
-        }
+        val topBarPlaceables =
+            subcompose(ScaffoldLayoutContent.TopBar, topBar).fastMap {
+                it.measure(looseConstraints)
+            }
 
         val topBarHeight = topBarPlaceables.fastMaxBy { it.height }?.height ?: 0
 
-        val snackbarPlaceables = subcompose(ScaffoldLayoutContent.Snackbar, snackbar).fastMap {
-            // respect only bottom and horizontal for snackbar and fab
-            val leftInset = contentWindowInsets
-                .getLeft(this@SubcomposeLayout, layoutDirection)
-            val rightInset = contentWindowInsets
-                .getRight(this@SubcomposeLayout, layoutDirection)
-            val bottomInset = contentWindowInsets.getBottom(this@SubcomposeLayout)
-            // offset the snackbar constraints by the insets values
-            it.measure(
-                looseConstraints.offset(
-                    -leftInset - rightInset,
-                    -bottomInset
-                )
-            )
-        }
+        val snackbarPlaceables =
+            subcompose(ScaffoldLayoutContent.Snackbar, snackbar).fastMap {
+                // respect only bottom and horizontal for snackbar and fab
+                val leftInset = contentWindowInsets.getLeft(this@SubcomposeLayout, layoutDirection)
+                val rightInset =
+                    contentWindowInsets.getRight(this@SubcomposeLayout, layoutDirection)
+                val bottomInset = contentWindowInsets.getBottom(this@SubcomposeLayout)
+                // offset the snackbar constraints by the insets values
+                it.measure(looseConstraints.offset(-leftInset - rightInset, -bottomInset))
+            }
 
         val snackbarHeight = snackbarPlaceables.fastMaxBy { it.height }?.height ?: 0
 
         val fabPlaceables =
             subcompose(ScaffoldLayoutContent.Fab, fab).fastMap { measurable ->
                 // respect only bottom and horizontal for snackbar and fab
-                val leftInset =
-                    contentWindowInsets.getLeft(this@SubcomposeLayout, layoutDirection)
+                val leftInset = contentWindowInsets.getLeft(this@SubcomposeLayout, layoutDirection)
                 val rightInset =
                     contentWindowInsets.getRight(this@SubcomposeLayout, layoutDirection)
                 val bottomInset = contentWindowInsets.getBottom(this@SubcomposeLayout)
-                measurable.measure(
-                    looseConstraints.offset(
-                        -leftInset - rightInset,
-                        -bottomInset
-                    )
-                )
+                measurable.measure(looseConstraints.offset(-leftInset - rightInset, -bottomInset))
             }
 
-        val fabPlacement = if (fabPlaceables.isNotEmpty()) {
-            val fabWidth = fabPlaceables.fastMaxBy { it.width }?.width ?: 0
-            val fabHeight = fabPlaceables.fastMaxBy { it.height }?.height ?: 0
-            // FAB distance from the left of the layout, taking into account LTR / RTL
-            if (fabWidth != 0 && fabHeight != 0) {
-                val fabLeftOffset = when (fabPosition) {
-                    FabPosition.Start -> {
-                        if (layoutDirection == LayoutDirection.Ltr) {
-                            FabSpacing.roundToPx()
-                        } else {
-                            layoutWidth - FabSpacing.roundToPx() - fabWidth
+        val fabPlacement =
+            if (fabPlaceables.isNotEmpty()) {
+                val fabWidth = fabPlaceables.fastMaxBy { it.width }?.width ?: 0
+                val fabHeight = fabPlaceables.fastMaxBy { it.height }?.height ?: 0
+                // FAB distance from the left of the layout, taking into account LTR / RTL
+                if (fabWidth != 0 && fabHeight != 0) {
+                    val fabLeftOffset =
+                        when (fabPosition) {
+                            FabPosition.Start -> {
+                                if (layoutDirection == LayoutDirection.Ltr) {
+                                    FabSpacing.roundToPx()
+                                } else {
+                                    layoutWidth - FabSpacing.roundToPx() - fabWidth
+                                }
+                            }
+                            FabPosition.End -> {
+                                if (layoutDirection == LayoutDirection.Ltr) {
+                                    layoutWidth - FabSpacing.roundToPx() - fabWidth
+                                } else {
+                                    FabSpacing.roundToPx()
+                                }
+                            }
+                            else -> (layoutWidth - fabWidth) / 2
                         }
-                    }
 
-                    FabPosition.End -> {
-                        if (layoutDirection == LayoutDirection.Ltr) {
-                            layoutWidth - FabSpacing.roundToPx() - fabWidth
-                        } else {
-                            FabSpacing.roundToPx()
-                        }
-                    }
-
-                    else -> (layoutWidth - fabWidth) / 2
+                    FabPlacement(
+                        isDocked = isFabDocked,
+                        left = fabLeftOffset,
+                        width = fabWidth,
+                        height = fabHeight
+                    )
+                } else {
+                    null
                 }
-
-                FabPlacement(
-                    isDocked = isFabDocked,
-                    left = fabLeftOffset,
-                    width = fabWidth,
-                    height = fabHeight
-                )
             } else {
                 null
             }
-        } else {
-            null
-        }
 
-        val bottomBarPlaceables = subcompose(ScaffoldLayoutContent.BottomBar) {
-            CompositionLocalProvider(
-                LocalFabPlacement provides fabPlacement,
-                content = bottomBar
-            )
-        }.fastMap { it.measure(looseConstraints) }
+        val bottomBarPlaceables =
+            subcompose(ScaffoldLayoutContent.BottomBar) {
+                    CompositionLocalProvider(
+                        LocalFabPlacement provides fabPlacement,
+                        content = bottomBar
+                    )
+                }
+                .fastMap { it.measure(looseConstraints) }
 
         val bottomBarHeight = bottomBarPlaceables.fastMaxBy { it.height }?.height
-        val fabOffsetFromBottom = fabPlacement?.let {
-            if (bottomBarHeight == null) {
-                it.height + FabSpacing.roundToPx() +
-                    contentWindowInsets.getBottom(this@SubcomposeLayout)
-            } else {
-                if (isFabDocked) {
-                    // Total height is the bottom bar height + half the FAB height
-                    bottomBarHeight + (it.height / 2)
+        val fabOffsetFromBottom =
+            fabPlacement?.let {
+                if (bottomBarHeight == null) {
+                    it.height +
+                        FabSpacing.roundToPx() +
+                        contentWindowInsets.getBottom(this@SubcomposeLayout)
                 } else {
-                    // Total height is the bottom bar height + the FAB height + the padding
-                    // between the FAB and bottom bar
-                    bottomBarHeight + it.height + FabSpacing.roundToPx()
+                    if (isFabDocked) {
+                        // Total height is the bottom bar height + half the FAB height
+                        bottomBarHeight + (it.height / 2)
+                    } else {
+                        // Total height is the bottom bar height + the FAB height + the padding
+                        // between the FAB and bottom bar
+                        bottomBarHeight + it.height + FabSpacing.roundToPx()
+                    }
                 }
             }
-        }
 
-        val snackbarOffsetFromBottom = if (snackbarHeight != 0) {
-            snackbarHeight +
-                (fabOffsetFromBottom ?: bottomBarHeight
-                ?: contentWindowInsets.getBottom(this@SubcomposeLayout))
-        } else {
-            0
-        }
+        val snackbarOffsetFromBottom =
+            if (snackbarHeight != 0) {
+                snackbarHeight +
+                    (fabOffsetFromBottom
+                        ?: bottomBarHeight
+                        ?: contentWindowInsets.getBottom(this@SubcomposeLayout))
+            } else {
+                0
+            }
 
         val bodyContentHeight = layoutHeight - topBarHeight
 
-        val bodyContentPlaceables = subcompose(ScaffoldLayoutContent.MainContent) {
-            val insets = contentWindowInsets.asPaddingValues(this@SubcomposeLayout)
-            val innerPadding = PaddingValues(
-                top =
-                if (topBarPlaceables.isEmpty()) {
-                    insets.calculateTopPadding()
-                } else {
-                    0.dp
-                },
-                bottom =
-                if (bottomBarPlaceables.isEmpty() || bottomBarHeight == null) {
-                    insets.calculateBottomPadding()
-                } else {
-                    bottomBarHeight.toDp()
-                },
-                start = insets.calculateStartPadding((this@SubcomposeLayout).layoutDirection),
-                end = insets.calculateEndPadding((this@SubcomposeLayout).layoutDirection)
-            )
-            content(innerPadding)
-        }.fastMap { it.measure(looseConstraints.copy(maxHeight = bodyContentHeight)) }
+        val bodyContentPlaceables =
+            subcompose(ScaffoldLayoutContent.MainContent) {
+                    val insets = contentWindowInsets.asPaddingValues(this@SubcomposeLayout)
+                    val innerPadding =
+                        PaddingValues(
+                            top =
+                                if (topBarPlaceables.isEmpty()) {
+                                    insets.calculateTopPadding()
+                                } else {
+                                    0.dp
+                                },
+                            bottom =
+                                if (bottomBarPlaceables.isEmpty() || bottomBarHeight == null) {
+                                    insets.calculateBottomPadding()
+                                } else {
+                                    bottomBarHeight.toDp()
+                                },
+                            start =
+                                insets.calculateStartPadding(
+                                    (this@SubcomposeLayout).layoutDirection
+                                ),
+                            end =
+                                insets.calculateEndPadding((this@SubcomposeLayout).layoutDirection)
+                        )
+                    content(innerPadding)
+                }
+                .fastMap { it.measure(looseConstraints.copy(maxHeight = bodyContentHeight)) }
 
         layout(layoutWidth, layoutHeight) {
             // Placing to control drawing order to match default elevation of each placeable
 
-            bodyContentPlaceables.fastForEach {
-                it.place(0, topBarHeight)
-            }
-            topBarPlaceables.fastForEach {
-                it.place(0, 0)
-            }
-            snackbarPlaceables.fastForEach {
-                it.place(0, layoutHeight - snackbarOffsetFromBottom)
-            }
+            bodyContentPlaceables.fastForEach { it.place(0, topBarHeight) }
+            topBarPlaceables.fastForEach { it.place(0, 0) }
+            snackbarPlaceables.fastForEach { it.place(0, layoutHeight - snackbarOffsetFromBottom) }
             // The bottom bar is always at the bottom of the layout
-            bottomBarPlaceables.fastForEach {
-                it.place(0, layoutHeight - (bottomBarHeight ?: 0))
-            }
+            bottomBarPlaceables.fastForEach { it.place(0, layoutHeight - (bottomBarHeight ?: 0)) }
             // Explicitly not using placeRelative here as `leftOffset` already accounts for RTL
             fabPlaceables.fastForEach {
                 it.place(fabPlacement?.left ?: 0, layoutHeight - (fabOffsetFromBottom ?: 0))
@@ -556,17 +538,12 @@
  *
  * @property isDocked whether the FAB should be docked with the bottom bar
  * @property left the FAB's offset from the left edge of the bottom bar, already adjusted for RTL
- * support
+ *   support
  * @property width the width of the FAB
  * @property height the height of the FAB
  */
 @Immutable
-internal class FabPlacement(
-    val isDocked: Boolean,
-    val left: Int,
-    val width: Int,
-    val height: Int
-)
+internal class FabPlacement(val isDocked: Boolean, val left: Int, val width: Int, val height: Int)
 
 /**
  * CompositionLocal containing a [FabPlacement] that is read by [BottomAppBar] to calculate notch
@@ -577,4 +554,10 @@
 // FAB spacing above the bottom bar / bottom of the Scaffold
 private val FabSpacing = 16.dp
 
-private enum class ScaffoldLayoutContent { TopBar, MainContent, Snackbar, Fab, BottomBar }
+private enum class ScaffoldLayoutContent {
+    TopBar,
+    MainContent,
+    Snackbar,
+    Fab,
+    BottomBar
+}
diff --git a/compose/material/material/src/commonMain/kotlin/androidx/compose/material/Shapes.kt b/compose/material/material/src/commonMain/kotlin/androidx/compose/material/Shapes.kt
index 69d3c61..f94362c 100644
--- a/compose/material/material/src/commonMain/kotlin/androidx/compose/material/Shapes.kt
+++ b/compose/material/material/src/commonMain/kotlin/androidx/compose/material/Shapes.kt
@@ -23,16 +23,18 @@
 import androidx.compose.ui.unit.dp
 
 /**
- * <a href="https://material.io/design/shape/about-shape.html" class="external" target="_blank">Material Design shape</a>.
+ * <a href="https://material.io/design/shape/about-shape.html" class="external"
+ * target="_blank">Material Design shape</a>.
  *
  * Material surfaces can be displayed in different shapes. Shapes direct attention, identify
  * components, communicate state, and express brand.
  *
- * ![Shape image](https://developer.android.com/images/reference/androidx/compose/material/shape.png)
+ * ![Shape
+ * image](https://developer.android.com/images/reference/androidx/compose/material/shape.png)
  *
- * Components are grouped into shape categories based on their size. These categories provide a
- * way to change multiple component values at once, by changing the category’s values.
- * Shape categories include:
+ * Components are grouped into shape categories based on their size. These categories provide a way
+ * to change multiple component values at once, by changing the category’s values. Shape categories
+ * include:
  * - Small components
  * - Medium components
  * - Large components
@@ -43,33 +45,23 @@
 class Shapes(
     /**
      * Shape used by small components like [Button] or [Snackbar]. Components like
-     * [FloatingActionButton], [ExtendedFloatingActionButton] use this shape, but override
-     * the corner size to be 50%. [TextField] uses this shape with overriding the bottom corners
-     * to zero.
+     * [FloatingActionButton], [ExtendedFloatingActionButton] use this shape, but override the
+     * corner size to be 50%. [TextField] uses this shape with overriding the bottom corners to
+     * zero.
      */
     val small: CornerBasedShape = RoundedCornerShape(4.dp),
-    /**
-     * Shape used by medium components like [Card] or [AlertDialog].
-     */
+    /** Shape used by medium components like [Card] or [AlertDialog]. */
     val medium: CornerBasedShape = RoundedCornerShape(4.dp),
-    /**
-     * Shape used by large components like [ModalDrawer] or [ModalBottomSheetLayout].
-     */
+    /** Shape used by large components like [ModalDrawer] or [ModalBottomSheetLayout]. */
     val large: CornerBasedShape = RoundedCornerShape(0.dp)
 ) {
 
-    /**
-     * Returns a copy of this Shapes, optionally overriding some of the values.
-     */
+    /** Returns a copy of this Shapes, optionally overriding some of the values. */
     fun copy(
         small: CornerBasedShape = this.small,
         medium: CornerBasedShape = this.medium,
         large: CornerBasedShape = this.large
-    ): Shapes = Shapes(
-        small = small,
-        medium = medium,
-        large = large
-    )
+    ): Shapes = Shapes(small = small, medium = medium, large = large)
 
     override fun equals(other: Any?): Boolean {
         if (this === other) return true
@@ -94,7 +86,5 @@
     }
 }
 
-/**
- * CompositionLocal used to specify the default shapes for the surfaces.
- */
+/** CompositionLocal used to specify the default shapes for the surfaces. */
 internal val LocalShapes = staticCompositionLocalOf { Shapes() }
diff --git a/compose/material/material/src/commonMain/kotlin/androidx/compose/material/Slider.kt b/compose/material/material/src/commonMain/kotlin/androidx/compose/material/Slider.kt
index 85fc6f7..19c55e1 100644
--- a/compose/material/material/src/commonMain/kotlin/androidx/compose/material/Slider.kt
+++ b/compose/material/material/src/commonMain/kotlin/androidx/compose/material/Slider.kt
@@ -106,17 +106,19 @@
 import kotlinx.coroutines.launch
 
 /**
- * <a href="https://material.io/components/sliders" class="external" target="_blank">Material Design slider</a>.
+ * <a href="https://material.io/components/sliders" class="external" target="_blank">Material Design
+ * slider</a>.
  *
  * Sliders allow users to make selections from a range of values.
  *
- * Sliders reflect a range of values along a bar, from which users may select a single value.
- * They are ideal for adjusting settings such as volume, brightness, or applying image filters.
+ * Sliders reflect a range of values along a bar, from which users may select a single value. They
+ * are ideal for adjusting settings such as volume, brightness, or applying image filters.
  *
- * ![Sliders image](https://developer.android.com/images/reference/androidx/compose/material/sliders.png)
+ * ![Sliders
+ * image](https://developer.android.com/images/reference/androidx/compose/material/sliders.png)
  *
- * Use continuous sliders to allow users to make meaningful selections that don’t
- * require a specific value:
+ * Use continuous sliders to allow users to make meaningful selections that don’t require a specific
+ * value:
  *
  * @sample androidx.compose.material.samples.SliderSample
  *
@@ -126,24 +128,24 @@
  * @sample androidx.compose.material.samples.StepsSliderSample
  *
  * @param value current value of the Slider. If outside of [valueRange] provided, value will be
- * coerced to this range.
+ *   coerced to this range.
  * @param onValueChange lambda in which value should be updated
  * @param modifier modifiers for the Slider layout
  * @param enabled whether or not component is enabled and can be interacted with or not
  * @param valueRange range of values that Slider value can take. Passed [value] will be coerced to
- * this range
+ *   this range
  * @param steps if positive, specifies the amount of discrete allowable values (in addition to the
- * endpoints of the value range). Step values are evenly distributed across the range. If 0, the
- * slider will behave continuously and allow any value from the range. Must not be negative.
+ *   endpoints of the value range). Step values are evenly distributed across the range. If 0, the
+ *   slider will behave continuously and allow any value from the range. Must not be negative.
  * @param onValueChangeFinished lambda to be invoked when value change has ended. This callback
- * shouldn't be used to update the slider value (use [onValueChange] for that), but rather to
- * know when the user has completed selecting a new value by ending a drag or a click.
+ *   shouldn't be used to update the slider value (use [onValueChange] for that), but rather to know
+ *   when the user has completed selecting a new value by ending a drag or a click.
  * @param interactionSource an optional hoisted [MutableInteractionSource] for observing and
- * emitting [Interaction]s for this slider. You can use this to change the slider's
- * appearance or preview the slider in different states. Note that if `null` is provided,
- * interactions will still happen internally.
+ *   emitting [Interaction]s for this slider. You can use this to change the slider's appearance or
+ *   preview the slider in different states. Note that if `null` is provided, interactions will
+ *   still happen internally.
  * @param colors [SliderColors] that will be used to determine the color of the Slider parts in
- * different state. See [SliderDefaults.colors] to customize.
+ *   different state. See [SliderDefaults.colors] to customize.
  */
 @Composable
 fun Slider(
@@ -152,8 +154,7 @@
     modifier: Modifier = Modifier,
     enabled: Boolean = true,
     valueRange: ClosedFloatingPointRange<Float> = 0f..1f,
-    @IntRange(from = 0)
-    steps: Int = 0,
+    @IntRange(from = 0) steps: Int = 0,
     onValueChangeFinished: (() -> Unit)? = null,
     interactionSource: MutableInteractionSource? = null,
     colors: SliderColors = SliderDefaults.colors()
@@ -162,9 +163,7 @@
     val interactionSource = interactionSource ?: remember { MutableInteractionSource() }
     require(steps >= 0) { "steps should be >= 0" }
     val onValueChangeState = rememberUpdatedState(onValueChange)
-    val tickFractions = remember(steps) {
-        stepsToTickFractions(steps)
-    }
+    val tickFractions = remember(steps) { stepsToTickFractions(steps) }
     BoxWithConstraints(
         modifier
             .minimumInteractiveComponentSize()
@@ -199,50 +198,54 @@
         val rawOffset = remember { mutableFloatStateOf(scaleToOffset(value)) }
         val pressOffset = remember { mutableFloatStateOf(0f) }
 
-        val draggableState = remember(minPx, maxPx, valueRange) {
-            SliderDraggableState {
-                rawOffset.floatValue = (rawOffset.floatValue + it + pressOffset.floatValue)
-                pressOffset.floatValue = 0f
-                val offsetInTrack = rawOffset.floatValue.coerceIn(minPx, maxPx)
-                onValueChangeState.value.invoke(scaleToUserValue(offsetInTrack))
+        val draggableState =
+            remember(minPx, maxPx, valueRange) {
+                SliderDraggableState {
+                    rawOffset.floatValue = (rawOffset.floatValue + it + pressOffset.floatValue)
+                    pressOffset.floatValue = 0f
+                    val offsetInTrack = rawOffset.floatValue.coerceIn(minPx, maxPx)
+                    onValueChangeState.value.invoke(scaleToUserValue(offsetInTrack))
+                }
             }
-        }
 
         CorrectValueSideEffect(::scaleToOffset, valueRange, minPx..maxPx, rawOffset, value)
 
-        val gestureEndAction = rememberUpdatedState<(Float) -> Unit> { velocity: Float ->
-            val current = rawOffset.floatValue
-            val target = snapValueToTick(current, tickFractions, minPx, maxPx)
-            if (current != target) {
-                scope.launch {
-                    animateToTarget(draggableState, current, target, velocity)
+        val gestureEndAction =
+            rememberUpdatedState<(Float) -> Unit> { velocity: Float ->
+                val current = rawOffset.floatValue
+                val target = snapValueToTick(current, tickFractions, minPx, maxPx)
+                if (current != target) {
+                    scope.launch {
+                        animateToTarget(draggableState, current, target, velocity)
+                        onValueChangeFinished?.invoke()
+                    }
+                } else if (!draggableState.isDragging) {
+                    // check ifDragging in case the change is still in progress (touch -> drag case)
                     onValueChangeFinished?.invoke()
                 }
-            } else if (!draggableState.isDragging) {
-                // check ifDragging in case the change is still in progress (touch -> drag case)
-                onValueChangeFinished?.invoke()
             }
-        }
-        val press = Modifier.sliderTapModifier(
-            draggableState,
-            interactionSource,
-            widthPx,
-            isRtl,
-            rawOffset,
-            gestureEndAction,
-            pressOffset,
-            enabled
-        )
+        val press =
+            Modifier.sliderTapModifier(
+                draggableState,
+                interactionSource,
+                widthPx,
+                isRtl,
+                rawOffset,
+                gestureEndAction,
+                pressOffset,
+                enabled
+            )
 
-        val drag = Modifier.draggable(
-            orientation = Orientation.Horizontal,
-            reverseDirection = isRtl,
-            enabled = enabled,
-            interactionSource = interactionSource,
-            onDragStopped = { velocity -> gestureEndAction.value.invoke(velocity) },
-            startDragImmediately = draggableState.isDragging,
-            state = draggableState
-        )
+        val drag =
+            Modifier.draggable(
+                orientation = Orientation.Horizontal,
+                reverseDirection = isRtl,
+                enabled = enabled,
+                interactionSource = interactionSource,
+                onDragStopped = { velocity -> gestureEndAction.value.invoke(velocity) },
+                startDragImmediately = draggableState.isDragging,
+                state = draggableState
+            )
 
         val coerced = value.coerceIn(valueRange.start, valueRange.endInclusive)
         val fraction = calcFraction(valueRange.start, valueRange.endInclusive, coerced)
@@ -259,14 +262,15 @@
 }
 
 /**
- * <a href="https://material.io/components/sliders" class="external" target="_blank">Material Design slider</a>.
+ * <a href="https://material.io/components/sliders" class="external" target="_blank">Material Design
+ * slider</a>.
  *
  * Range Sliders expand upon [Slider] using the same concepts but allow the user to select 2 values.
  *
  * The two values are still bounded by the value range but they also cannot cross each other.
  *
- * Use continuous Range Sliders to allow users to make meaningful selections that don’t
- * require a specific values:
+ * Use continuous Range Sliders to allow users to make meaningful selections that don’t require a
+ * specific values:
  *
  * @sample androidx.compose.material.samples.RangeSliderSample
  *
@@ -276,20 +280,20 @@
  * @sample androidx.compose.material.samples.StepRangeSliderSample
  *
  * @param value current values of the RangeSlider. If either value is outside of [valueRange]
- * provided, it will be coerced to this range.
+ *   provided, it will be coerced to this range.
  * @param onValueChange lambda in which values should be updated
  * @param modifier modifiers for the Range Slider layout
  * @param enabled whether or not component is enabled and can we interacted with or not
  * @param valueRange range of values that Range Slider values can take. Passed [value] will be
- * coerced to this range
+ *   coerced to this range
  * @param steps if positive, specifies the amount of discrete allowable values (in addition to the
- * endpoints of the value range). Step values are evenly distributed across the range. If 0, the
- * range slider will behave continuously and allow any value from the range. Must not be negative.
+ *   endpoints of the value range). Step values are evenly distributed across the range. If 0, the
+ *   range slider will behave continuously and allow any value from the range. Must not be negative.
  * @param onValueChangeFinished lambda to be invoked when value change has ended. This callback
- * shouldn't be used to update the range slider values (use [onValueChange] for that), but rather to
- * know when the user has completed selecting a new value by ending a drag or a click.
- * @param colors [SliderColors] that will be used to determine the color of the Range Slider
- * parts in different state. See [SliderDefaults.colors] to customize.
+ *   shouldn't be used to update the range slider values (use [onValueChange] for that), but rather
+ *   to know when the user has completed selecting a new value by ending a drag or a click.
+ * @param colors [SliderColors] that will be used to determine the color of the Range Slider parts
+ *   in different state. See [SliderDefaults.colors] to customize.
  */
 @Composable
 @ExperimentalMaterialApi
@@ -299,8 +303,7 @@
     modifier: Modifier = Modifier,
     enabled: Boolean = true,
     valueRange: ClosedFloatingPointRange<Float> = 0f..1f,
-    @IntRange(from = 0)
-    steps: Int = 0,
+    @IntRange(from = 0) steps: Int = 0,
     onValueChangeFinished: (() -> Unit)? = null,
     colors: SliderColors = SliderDefaults.colors()
 ) {
@@ -309,14 +312,13 @@
 
     require(steps >= 0) { "steps should be >= 0" }
     val onValueChangeState = rememberUpdatedState(onValueChange)
-    val tickFractions = remember(steps) {
-        stepsToTickFractions(steps)
-    }
+    val tickFractions = remember(steps) { stepsToTickFractions(steps) }
 
     BoxWithConstraints(
-        modifier = modifier
-            .minimumInteractiveComponentSize()
-            .requiredSizeIn(minWidth = ThumbRadius * 4, minHeight = ThumbRadius * 2)
+        modifier =
+            modifier
+                .minimumInteractiveComponentSize()
+                .requiredSizeIn(minWidth = ThumbRadius * 4, minHeight = ThumbRadius * 2)
     ) {
         val isRtl = LocalLayoutDirection.current == LayoutDirection.Rtl
         val widthPx = constraints.maxWidth.toFloat()
@@ -353,60 +355,65 @@
         )
 
         val scope = rememberCoroutineScope()
-        val gestureEndAction = rememberUpdatedState<(Boolean) -> Unit> { isStart ->
-            val current = (if (isStart) rawOffsetStart else rawOffsetEnd).floatValue
-            // target is a closest anchor to the `current`, if exists
-            val target = snapValueToTick(current, tickFractions, minPx, maxPx)
-            if (current == target) {
-                onValueChangeFinished?.invoke()
-                return@rememberUpdatedState
-            }
-
-            scope.launch {
-                Animatable(initialValue = current).animateTo(
-                    target, SliderToTickAnimation,
-                    0f
-                ) {
-                    (if (isStart) rawOffsetStart else rawOffsetEnd).floatValue = this.value
-                    onValueChangeState.value.invoke(
-                        scaleToUserValue(rawOffsetStart.floatValue..rawOffsetEnd.floatValue)
-                    )
+        val gestureEndAction =
+            rememberUpdatedState<(Boolean) -> Unit> { isStart ->
+                val current = (if (isStart) rawOffsetStart else rawOffsetEnd).floatValue
+                // target is a closest anchor to the `current`, if exists
+                val target = snapValueToTick(current, tickFractions, minPx, maxPx)
+                if (current == target) {
+                    onValueChangeFinished?.invoke()
+                    return@rememberUpdatedState
                 }
 
-                onValueChangeFinished?.invoke()
-            }
-        }
+                scope.launch {
+                    Animatable(initialValue = current).animateTo(
+                        target,
+                        SliderToTickAnimation,
+                        0f
+                    ) {
+                        (if (isStart) rawOffsetStart else rawOffsetEnd).floatValue = this.value
+                        onValueChangeState.value.invoke(
+                            scaleToUserValue(rawOffsetStart.floatValue..rawOffsetEnd.floatValue)
+                        )
+                    }
 
-        val onDrag = rememberUpdatedState<(Boolean, Float) -> Unit> { isStart, offset ->
-            val offsetRange = if (isStart) {
-                rawOffsetStart.floatValue = (rawOffsetStart.floatValue + offset)
-                rawOffsetEnd.floatValue = scaleToOffset(value.endInclusive)
-                val offsetEnd = rawOffsetEnd.floatValue
-                val offsetStart = rawOffsetStart.floatValue.coerceIn(minPx, offsetEnd)
-                offsetStart..offsetEnd
-            } else {
-                rawOffsetEnd.floatValue = (rawOffsetEnd.floatValue + offset)
-                rawOffsetStart.floatValue = scaleToOffset(value.start)
-                val offsetStart = rawOffsetStart.floatValue
-                val offsetEnd = rawOffsetEnd.floatValue.coerceIn(offsetStart, maxPx)
-                offsetStart..offsetEnd
+                    onValueChangeFinished?.invoke()
+                }
             }
 
-            onValueChangeState.value.invoke(scaleToUserValue(offsetRange))
-        }
+        val onDrag =
+            rememberUpdatedState<(Boolean, Float) -> Unit> { isStart, offset ->
+                val offsetRange =
+                    if (isStart) {
+                        rawOffsetStart.floatValue = (rawOffsetStart.floatValue + offset)
+                        rawOffsetEnd.floatValue = scaleToOffset(value.endInclusive)
+                        val offsetEnd = rawOffsetEnd.floatValue
+                        val offsetStart = rawOffsetStart.floatValue.coerceIn(minPx, offsetEnd)
+                        offsetStart..offsetEnd
+                    } else {
+                        rawOffsetEnd.floatValue = (rawOffsetEnd.floatValue + offset)
+                        rawOffsetStart.floatValue = scaleToOffset(value.start)
+                        val offsetStart = rawOffsetStart.floatValue
+                        val offsetEnd = rawOffsetEnd.floatValue.coerceIn(offsetStart, maxPx)
+                        offsetStart..offsetEnd
+                    }
 
-        val pressDrag = Modifier.rangeSliderPressDragModifier(
-            startInteractionSource,
-            endInteractionSource,
-            rawOffsetStart,
-            rawOffsetEnd,
-            enabled,
-            isRtl,
-            widthPx,
-            valueRange,
-            gestureEndAction,
-            onDrag,
-        )
+                onValueChangeState.value.invoke(scaleToUserValue(offsetRange))
+            }
+
+        val pressDrag =
+            Modifier.rangeSliderPressDragModifier(
+                startInteractionSource,
+                endInteractionSource,
+                rawOffsetStart,
+                rawOffsetEnd,
+                enabled,
+                isRtl,
+                widthPx,
+                valueRange,
+                gestureEndAction,
+                onDrag,
+            )
 
         // The positions of the thumbs are dependant on each other.
         val coercedStart = value.start.coerceIn(valueRange.start, value.endInclusive)
@@ -416,22 +423,24 @@
         val startSteps = floor(steps * fractionEnd).toInt()
         val endSteps = floor(steps * (1f - fractionStart)).toInt()
 
-        val startThumbSemantics = Modifier.sliderSemantics(
-            coercedStart,
-            enabled,
-            { value -> onValueChangeState.value.invoke(value..coercedEnd) },
-            onValueChangeFinished,
-            valueRange.start..coercedEnd,
-            startSteps
-        )
-        val endThumbSemantics = Modifier.sliderSemantics(
-            coercedEnd,
-            enabled,
-            { value -> onValueChangeState.value.invoke(coercedStart..value) },
-            onValueChangeFinished,
-            coercedStart..valueRange.endInclusive,
-            endSteps
-        )
+        val startThumbSemantics =
+            Modifier.sliderSemantics(
+                coercedStart,
+                enabled,
+                { value -> onValueChangeState.value.invoke(value..coercedEnd) },
+                onValueChangeFinished,
+                valueRange.start..coercedEnd,
+                startSteps
+            )
+        val endThumbSemantics =
+            Modifier.sliderSemantics(
+                coercedEnd,
+                enabled,
+                { value -> onValueChangeState.value.invoke(coercedStart..value) },
+                onValueChangeFinished,
+                coercedStart..valueRange.endInclusive,
+                endSteps
+            )
 
         RangeSliderImpl(
             enabled,
@@ -449,44 +458,43 @@
     }
 }
 
-/**
- * Object to hold defaults used by [Slider]
- */
+/** Object to hold defaults used by [Slider] */
 object SliderDefaults {
 
     /**
-     * Creates a [SliderColors] that represents the different colors used in parts of the
-     * [Slider] in different states.
+     * Creates a [SliderColors] that represents the different colors used in parts of the [Slider]
+     * in different states.
      *
-     * For the name references below the words "active" and "inactive" are used. Active part of
-     * the slider is filled with progress, so if slider's progress is 30% out of 100%, left (or
-     * right in RTL) 30% of the track will be active, the rest is not active.
+     * For the name references below the words "active" and "inactive" are used. Active part of the
+     * slider is filled with progress, so if slider's progress is 30% out of 100%, left (or right in
+     * RTL) 30% of the track will be active, the rest is not active.
      *
      * @param thumbColor thumb color when enabled
      * @param disabledThumbColor thumb colors when disabled
      * @param activeTrackColor color of the track in the part that is "active", meaning that the
-     * thumb is ahead of it
+     *   thumb is ahead of it
      * @param inactiveTrackColor color of the track in the part that is "inactive", meaning that the
-     * thumb is before it
+     *   thumb is before it
      * @param disabledActiveTrackColor color of the track in the "active" part when the Slider is
-     * disabled
-     * @param disabledInactiveTrackColor color of the track in the "inactive" part when the
-     * Slider is disabled
+     *   disabled
+     * @param disabledInactiveTrackColor color of the track in the "inactive" part when the Slider
+     *   is disabled
      * @param activeTickColor colors to be used to draw tick marks on the active track, if `steps`
-     * is specified
+     *   is specified
      * @param inactiveTickColor colors to be used to draw tick marks on the inactive track, if
-     * `steps` are specified on the Slider is specified
-     * @param disabledActiveTickColor colors to be used to draw tick marks on the active track
-     * when Slider is disabled and when `steps` are specified on it
-     * @param disabledInactiveTickColor colors to be used to draw tick marks on the inactive part
-     * of the track when Slider is disabled and when `steps` are specified on it
+     *   `steps` are specified on the Slider is specified
+     * @param disabledActiveTickColor colors to be used to draw tick marks on the active track when
+     *   Slider is disabled and when `steps` are specified on it
+     * @param disabledInactiveTickColor colors to be used to draw tick marks on the inactive part of
+     *   the track when Slider is disabled and when `steps` are specified on it
      */
     @Composable
     fun colors(
         thumbColor: Color = MaterialTheme.colors.primary,
-        disabledThumbColor: Color = MaterialTheme.colors.onSurface
-            .copy(alpha = ContentAlpha.disabled)
-            .compositeOver(MaterialTheme.colors.surface),
+        disabledThumbColor: Color =
+            MaterialTheme.colors.onSurface
+                .copy(alpha = ContentAlpha.disabled)
+                .compositeOver(MaterialTheme.colors.surface),
         activeTrackColor: Color = MaterialTheme.colors.primary,
         inactiveTrackColor: Color = activeTrackColor.copy(alpha = InactiveTrackAlpha),
         disabledActiveTrackColor: Color =
@@ -496,52 +504,42 @@
         activeTickColor: Color = contentColorFor(activeTrackColor).copy(alpha = TickAlpha),
         inactiveTickColor: Color = activeTrackColor.copy(alpha = TickAlpha),
         disabledActiveTickColor: Color = activeTickColor.copy(alpha = DisabledTickAlpha),
-        disabledInactiveTickColor: Color = disabledInactiveTrackColor
-            .copy(alpha = DisabledTickAlpha)
-    ): SliderColors = DefaultSliderColors(
-        thumbColor = thumbColor,
-        disabledThumbColor = disabledThumbColor,
-        activeTrackColor = activeTrackColor,
-        inactiveTrackColor = inactiveTrackColor,
-        disabledActiveTrackColor = disabledActiveTrackColor,
-        disabledInactiveTrackColor = disabledInactiveTrackColor,
-        activeTickColor = activeTickColor,
-        inactiveTickColor = inactiveTickColor,
-        disabledActiveTickColor = disabledActiveTickColor,
-        disabledInactiveTickColor = disabledInactiveTickColor
-    )
+        disabledInactiveTickColor: Color =
+            disabledInactiveTrackColor.copy(alpha = DisabledTickAlpha)
+    ): SliderColors =
+        DefaultSliderColors(
+            thumbColor = thumbColor,
+            disabledThumbColor = disabledThumbColor,
+            activeTrackColor = activeTrackColor,
+            inactiveTrackColor = inactiveTrackColor,
+            disabledActiveTrackColor = disabledActiveTrackColor,
+            disabledInactiveTrackColor = disabledInactiveTrackColor,
+            activeTickColor = activeTickColor,
+            inactiveTickColor = inactiveTickColor,
+            disabledActiveTickColor = disabledActiveTickColor,
+            disabledInactiveTickColor = disabledInactiveTickColor
+        )
 
-    /**
-     * Default alpha of the inactive part of the track
-     */
+    /** Default alpha of the inactive part of the track */
     const val InactiveTrackAlpha = 0.24f
 
-    /**
-     * Default alpha for the track when it is disabled but active
-     */
+    /** Default alpha for the track when it is disabled but active */
     const val DisabledInactiveTrackAlpha = 0.12f
 
-    /**
-     * Default alpha for the track when it is disabled and inactive
-     */
+    /** Default alpha for the track when it is disabled and inactive */
     const val DisabledActiveTrackAlpha = 0.32f
 
-    /**
-     * Default alpha of the ticks that are drawn on top of the track
-     */
+    /** Default alpha of the ticks that are drawn on top of the track */
     const val TickAlpha = 0.54f
 
-    /**
-     * Default alpha for tick marks when they are disabled
-     */
+    /** Default alpha for tick marks when they are disabled */
     const val DisabledTickAlpha = 0.12f
 }
 
 /**
  * Represents the colors used by a [Slider] and its parts in different states
  *
- * See [SliderDefaults.colors] for the default implementation that follows Material
- * specifications.
+ * See [SliderDefaults.colors] for the default implementation that follows Material specifications.
  */
 @Stable
 interface SliderColors {
@@ -551,8 +549,7 @@
      *
      * @param enabled whether the [Slider] is enabled or not
      */
-    @Composable
-    fun thumbColor(enabled: Boolean): State<Color>
+    @Composable fun thumbColor(enabled: Boolean): State<Color>
 
     /**
      * Represents the color used for the sliders's track, depending on [enabled] and [active].
@@ -563,22 +560,20 @@
      * @param enabled whether the [Slider] is enabled or not
      * @param active whether the part of the track is active of not
      */
-    @Composable
-    fun trackColor(enabled: Boolean, active: Boolean): State<Color>
+    @Composable fun trackColor(enabled: Boolean, active: Boolean): State<Color>
 
     /**
-     * Represents the color used for the sliders's tick which is the dot separating steps, if
-     * they are set on the slider, depending on [enabled] and [active].
+     * Represents the color used for the sliders's tick which is the dot separating steps, if they
+     * are set on the slider, depending on [enabled] and [active].
      *
-     * Active tick is the tick that is in the part of the track filled with progress, so if
-     * sliders progress is 30% out of 100%, left (or right in RTL) 30% of the track and the ticks
-     * in this 30% will be active, the rest is not active.
+     * Active tick is the tick that is in the part of the track filled with progress, so if sliders
+     * progress is 30% out of 100%, left (or right in RTL) 30% of the track and the ticks in this
+     * 30% will be active, the rest is not active.
      *
      * @param enabled whether the [Slider] is enabled or not
      * @param active whether the part of the track this tick is in is active of not
      */
-    @Composable
-    fun tickColor(enabled: Boolean, active: Boolean): State<Color>
+    @Composable fun tickColor(enabled: Boolean, active: Boolean): State<Color>
 }
 
 @Composable
@@ -649,9 +644,7 @@
         val offsetStart = widthDp * positionFractionStart
         val offsetEnd = widthDp * positionFractionEnd
         Track(
-            Modifier
-                .align(Alignment.CenterStart)
-                .fillMaxSize(),
+            Modifier.align(Alignment.CenterStart).fillMaxSize(),
             colors,
             enabled,
             positionFractionStart,
@@ -662,8 +655,9 @@
         )
 
         SliderThumb(
-            Modifier
-                .semantics(mergeDescendants = true) { contentDescription = startContentDescription }
+            Modifier.semantics(mergeDescendants = true) {
+                    contentDescription = startContentDescription
+                }
                 .focusable(true, startInteractionSource)
                 .then(startThumbSemantics),
             offsetStart,
@@ -673,8 +667,9 @@
             thumbSize
         )
         SliderThumb(
-            Modifier
-                .semantics(mergeDescendants = true) { contentDescription = endContentDescription }
+            Modifier.semantics(mergeDescendants = true) {
+                    contentDescription = endContentDescription
+                }
                 .focusable(true, endInteractionSource)
                 .then(endThumbSemantics),
             offsetEnd,
@@ -695,10 +690,7 @@
     enabled: Boolean,
     thumbSize: Dp
 ) {
-    Box(
-        Modifier
-            .padding(start = offset)
-            .align(Alignment.CenterStart)) {
+    Box(Modifier.padding(start = offset).align(Alignment.CenterStart)) {
         val interactions = remember { mutableStateListOf<Interaction>() }
         LaunchedEffect(interactionSource) {
             interactionSource.interactions.collect { interaction ->
@@ -713,20 +705,19 @@
             }
         }
 
-        val elevation = if (interactions.isNotEmpty()) {
-            ThumbPressedElevation
-        } else {
-            ThumbDefaultElevation
-        }
+        val elevation =
+            if (interactions.isNotEmpty()) {
+                ThumbPressedElevation
+            } else {
+                ThumbDefaultElevation
+            }
         Spacer(
             modifier
                 .size(thumbSize, thumbSize)
                 .indication(
                     interactionSource = interactionSource,
-                    indication = rippleOrFallbackImplementation(
-                        bounded = false,
-                        radius = ThumbRippleRadius
-                    )
+                    indication =
+                        rippleOrFallbackImplementation(bounded = false, radius = ThumbRippleRadius)
                 )
                 .hoverable(interactionSource = interactionSource)
                 .shadow(if (enabled) elevation else 0.dp, CircleShape, clip = false)
@@ -763,15 +754,11 @@
             trackStrokeWidth,
             StrokeCap.Round
         )
-        val sliderValueEnd = Offset(
-            sliderStart.x + (sliderEnd.x - sliderStart.x) * positionFractionEnd,
-            center.y
-        )
+        val sliderValueEnd =
+            Offset(sliderStart.x + (sliderEnd.x - sliderStart.x) * positionFractionEnd, center.y)
 
-        val sliderValueStart = Offset(
-            sliderStart.x + (sliderEnd.x - sliderStart.x) * positionFractionStart,
-            center.y
-        )
+        val sliderValueStart =
+            Offset(sliderStart.x + (sliderEnd.x - sliderStart.x) * positionFractionStart, center.y)
 
         drawLine(
             activeTrackColor.value,
@@ -781,12 +768,11 @@
             StrokeCap.Round
         )
         @Suppress("ListIterator")
-        tickFractions.groupBy { it > positionFractionEnd || it < positionFractionStart }
+        tickFractions
+            .groupBy { it > positionFractionEnd || it < positionFractionStart }
             .forEach { (outsideFraction, list) ->
                 drawPoints(
-                    list.fastMap {
-                        Offset(lerp(sliderStart, sliderEnd, it).x, center.y)
-                    },
+                    list.fastMap { Offset(lerp(sliderStart, sliderEnd, it).x, center.y) },
                     PointMode.Points,
                     (if (outsideFraction) inactiveTickColor else activeTickColor).value,
                     trackStrokeWidth,
@@ -805,8 +791,7 @@
     // target is a closest anchor to the `current`, if exists
     return tickFractions
         .fastMinByOrNull { abs(lerp(minPx, maxPx, it) - current) }
-        ?.run { lerp(minPx, maxPx, this) }
-        ?: current
+        ?.run { lerp(minPx, maxPx, this) } ?: current
 }
 
 private suspend fun AwaitPointerEventScope.awaitSlop(
@@ -867,39 +852,43 @@
 ): Modifier {
     val coerced = value.coerceIn(valueRange.start, valueRange.endInclusive)
     return semantics {
-        if (!enabled) disabled()
-        setProgress(
-            action = { targetValue ->
-                var newValue = targetValue.coerceIn(valueRange.start, valueRange.endInclusive)
-                val originalVal = newValue
-                val resolvedValue = if (steps > 0) {
-                    var distance: Float = newValue
-                    for (i in 0..steps + 1) {
-                        val stepValue = lerp(
-                            valueRange.start,
-                            valueRange.endInclusive,
-                            i.toFloat() / (steps + 1))
-                        if (abs(stepValue - originalVal) <= distance) {
-                            distance = abs(stepValue - originalVal)
-                            newValue = stepValue
+            if (!enabled) disabled()
+            setProgress(
+                action = { targetValue ->
+                    var newValue = targetValue.coerceIn(valueRange.start, valueRange.endInclusive)
+                    val originalVal = newValue
+                    val resolvedValue =
+                        if (steps > 0) {
+                            var distance: Float = newValue
+                            for (i in 0..steps + 1) {
+                                val stepValue =
+                                    lerp(
+                                        valueRange.start,
+                                        valueRange.endInclusive,
+                                        i.toFloat() / (steps + 1)
+                                    )
+                                if (abs(stepValue - originalVal) <= distance) {
+                                    distance = abs(stepValue - originalVal)
+                                    newValue = stepValue
+                                }
+                            }
+                            newValue
+                        } else {
+                            newValue
                         }
+                    // This is to keep it consistent with AbsSeekbar.java: return false if no
+                    // change from current.
+                    if (resolvedValue == coerced) {
+                        false
+                    } else {
+                        onValueChange(resolvedValue)
+                        onValueChangeFinished?.invoke()
+                        true
                     }
-                    newValue
-                } else {
-                    newValue
                 }
-                // This is to keep it consistent with AbsSeekbar.java: return false if no
-                // change from current.
-                if (resolvedValue == coerced) {
-                    false
-                } else {
-                    onValueChange(resolvedValue)
-                    onValueChangeFinished?.invoke()
-                    true
-                }
-            }
-        )
-    }.progressSemantics(value, valueRange, steps)
+            )
+        }
+        .progressSemantics(value, valueRange, steps)
 }
 
 private fun Modifier.sliderTapModifier(
@@ -911,47 +900,50 @@
     gestureEndAction: State<(Float) -> Unit>,
     pressOffset: MutableState<Float>,
     enabled: Boolean
-) = composed(
-    factory = {
-        if (enabled) {
-            val scope = rememberCoroutineScope()
-            pointerInput(draggableState, interactionSource, maxPx, isRtl) {
-                detectTapGestures(
-                    onPress = { pos ->
-                        val to = if (isRtl) maxPx - pos.x else pos.x
-                        pressOffset.value = to - rawOffset.value
-                        try {
-                            awaitRelease()
-                        } catch (_: GestureCancellationException) {
-                            pressOffset.value = 0f
-                        }
-                    },
-                    onTap = {
-                        scope.launch {
-                            draggableState.drag(MutatePriority.UserInput) {
-                                // just trigger animation, press offset will be applied
-                                dragBy(0f)
+) =
+    composed(
+        factory = {
+            if (enabled) {
+                val scope = rememberCoroutineScope()
+                pointerInput(draggableState, interactionSource, maxPx, isRtl) {
+                    detectTapGestures(
+                        onPress = { pos ->
+                            val to = if (isRtl) maxPx - pos.x else pos.x
+                            pressOffset.value = to - rawOffset.value
+                            try {
+                                awaitRelease()
+                            } catch (_: GestureCancellationException) {
+                                pressOffset.value = 0f
                             }
-                            gestureEndAction.value.invoke(0f)
+                        },
+                        onTap = {
+                            scope.launch {
+                                draggableState.drag(MutatePriority.UserInput) {
+                                    // just trigger animation, press offset will be applied
+                                    dragBy(0f)
+                                }
+                                gestureEndAction.value.invoke(0f)
+                            }
                         }
-                    }
-                )
+                    )
+                }
+            } else {
+                this
             }
-        } else {
-            this
-        }
-    },
-    inspectorInfo = debugInspectorInfo {
-        name = "sliderTapModifier"
-        properties["draggableState"] = draggableState
-        properties["interactionSource"] = interactionSource
-        properties["maxPx"] = maxPx
-        properties["isRtl"] = isRtl
-        properties["rawOffset"] = rawOffset
-        properties["gestureEndAction"] = gestureEndAction
-        properties["pressOffset"] = pressOffset
-        properties["enabled"] = enabled
-    })
+        },
+        inspectorInfo =
+            debugInspectorInfo {
+                name = "sliderTapModifier"
+                properties["draggableState"] = draggableState
+                properties["interactionSource"] = interactionSource
+                properties["maxPx"] = maxPx
+                properties["isRtl"] = isRtl
+                properties["rawOffset"] = rawOffset
+                properties["gestureEndAction"] = gestureEndAction
+                properties["pressOffset"] = pressOffset
+                properties["enabled"] = enabled
+            }
+    )
 
 private suspend fun animateToTarget(
     draggableState: DraggableState,
@@ -982,29 +974,32 @@
 ): Modifier =
     if (enabled) {
         pointerInput(startInteractionSource, endInteractionSource, maxPx, isRtl, valueRange) {
-            val rangeSliderLogic = RangeSliderLogic(
-                startInteractionSource,
-                endInteractionSource,
-                rawOffsetStart,
-                rawOffsetEnd,
-                onDrag
-            )
+            val rangeSliderLogic =
+                RangeSliderLogic(
+                    startInteractionSource,
+                    endInteractionSource,
+                    rawOffsetStart,
+                    rawOffsetEnd,
+                    onDrag
+                )
             coroutineScope {
                 awaitEachGesture {
                     val event = awaitFirstDown(requireUnconsumed = false)
                     val interaction = DragInteraction.Start()
                     var posX = if (isRtl) maxPx - event.position.x else event.position.x
                     val compare = rangeSliderLogic.compareOffsets(posX)
-                    var draggingStart = if (compare != 0) {
-                        compare < 0
-                    } else {
-                        rawOffsetStart.value > posX
-                    }
+                    var draggingStart =
+                        if (compare != 0) {
+                            compare < 0
+                        } else {
+                            rawOffsetStart.value > posX
+                        }
 
                     awaitSlop(event.id, event.type)?.let {
                         val slop = viewConfiguration.pointerSlop(event.type)
-                        val shouldUpdateCapturedThumb = abs(rawOffsetEnd.value - posX) < slop &&
-                            abs(rawOffsetStart.value - posX) < slop
+                        val shouldUpdateCapturedThumb =
+                            abs(rawOffsetEnd.value - posX) < slop &&
+                                abs(rawOffsetStart.value - posX) < slop
                         if (shouldUpdateCapturedThumb) {
                             val dir = it.second
                             draggingStart = if (isRtl) dir >= 0f else dir < 0f
@@ -1019,25 +1014,28 @@
                         this@coroutineScope
                     )
 
-                    val finishInteraction = try {
-                        val success = horizontalDrag(pointerId = event.id) {
-                            val deltaX = it.positionChange().x
-                            onDrag.value.invoke(draggingStart, if (isRtl) -deltaX else deltaX)
-                        }
-                        if (success) {
-                            DragInteraction.Stop(interaction)
-                        } else {
+                    val finishInteraction =
+                        try {
+                            val success =
+                                horizontalDrag(pointerId = event.id) {
+                                    val deltaX = it.positionChange().x
+                                    onDrag.value.invoke(
+                                        draggingStart,
+                                        if (isRtl) -deltaX else deltaX
+                                    )
+                                }
+                            if (success) {
+                                DragInteraction.Stop(interaction)
+                            } else {
+                                DragInteraction.Cancel(interaction)
+                            }
+                        } catch (e: CancellationException) {
                             DragInteraction.Cancel(interaction)
                         }
-                    } catch (e: CancellationException) {
-                        DragInteraction.Cancel(interaction)
-                    }
 
                     gestureEndAction.value.invoke(draggingStart)
                     launch {
-                        rangeSliderLogic
-                            .activeInteraction(draggingStart)
-                            .emit(finishInteraction)
+                        rangeSliderLogic.activeInteraction(draggingStart).emit(finishInteraction)
                     }
                 }
             }
@@ -1072,9 +1070,7 @@
             draggingStart,
             posX - if (draggingStart) rawOffsetStart.value else rawOffsetEnd.value
         )
-        scope.launch {
-            activeInteraction(draggingStart).emit(interaction)
-        }
+        scope.launch { activeInteraction(draggingStart).emit(interaction) }
     }
 }
 
@@ -1165,22 +1161,19 @@
 private val SliderHeight = 48.dp
 private val SliderMinWidth = 144.dp // TODO: clarify min width
 private val DefaultSliderConstraints =
-    Modifier
-        .widthIn(min = SliderMinWidth)
-        .heightIn(max = SliderHeight)
+    Modifier.widthIn(min = SliderMinWidth).heightIn(max = SliderHeight)
 
 private val SliderToTickAnimation = TweenSpec<Float>(durationMillis = 100)
 
-private class SliderDraggableState(
-    val onDelta: (Float) -> Unit
-) : DraggableState {
+private class SliderDraggableState(val onDelta: (Float) -> Unit) : DraggableState {
 
     var isDragging by mutableStateOf(false)
         private set
 
-    private val dragScope: DragScope = object : DragScope {
-        override fun dragBy(pixels: Float): Unit = onDelta(pixels)
-    }
+    private val dragScope: DragScope =
+        object : DragScope {
+            override fun dragBy(pixels: Float): Unit = onDelta(pixels)
+        }
 
     private val scrollMutex = MutatorMutex()
 
diff --git a/compose/material/material/src/commonMain/kotlin/androidx/compose/material/Snackbar.kt b/compose/material/material/src/commonMain/kotlin/androidx/compose/material/Snackbar.kt
index 2e490ec..3550dcf 100644
--- a/compose/material/material/src/commonMain/kotlin/androidx/compose/material/Snackbar.kt
+++ b/compose/material/material/src/commonMain/kotlin/androidx/compose/material/Snackbar.kt
@@ -41,18 +41,20 @@
 import kotlin.math.max
 
 /**
- * <a href="https://material.io/components/snackbars" class="external" target="_blank">Material Design snackbar</a>.
+ * <a href="https://material.io/components/snackbars" class="external" target="_blank">Material
+ * Design snackbar</a>.
  *
  * Snackbars provide brief messages about app processes at the bottom of the screen.
  *
  * Snackbars inform users of a process that an app has performed or will perform. They appear
- * temporarily, towards the bottom of the screen. They shouldn’t interrupt the user experience,
- * and they don’t require user input to disappear.
+ * temporarily, towards the bottom of the screen. They shouldn’t interrupt the user experience, and
+ * they don’t require user input to disappear.
  *
  * A Snackbar can contain a single action. Because Snackbar disappears automatically, the action
  * shouldn't be "Dismiss" or "Cancel".
  *
- * ![Snackbars image](https://developer.android.com/images/reference/androidx/compose/material/snackbars.png)
+ * ![Snackbars
+ * image](https://developer.android.com/images/reference/androidx/compose/material/snackbars.png)
  *
  * This components provides only the visuals of the [Snackbar]. If you need to show a [Snackbar]
  * with defaults on the screen, use [ScaffoldState.snackbarHostState] and
@@ -62,23 +64,24 @@
  *
  * If you want to customize appearance of the [Snackbar], you can pass your own version as a child
  * of the [SnackbarHost] to the [Scaffold]:
+ *
  * @sample androidx.compose.material.samples.ScaffoldWithCustomSnackbar
  *
  * @param modifier modifiers for the Snackbar layout
  * @param action action / button component to add as an action to the snackbar. Consider using
- * [SnackbarDefaults.primaryActionColor] as the color for the action, if you do not
- * have a predefined color you wish to use instead.
- * @param actionOnNewLine whether or not action should be put on the separate line. Recommended
- * for action with long action text
+ *   [SnackbarDefaults.primaryActionColor] as the color for the action, if you do not have a
+ *   predefined color you wish to use instead.
+ * @param actionOnNewLine whether or not action should be put on the separate line. Recommended for
+ *   action with long action text
  * @param shape Defines the Snackbar's shape as well as its shadow
  * @param backgroundColor background color of the Snackbar
- * @param contentColor color of the content to use inside the snackbar. Defaults to
- * either the matching content color for [backgroundColor], or, if it is not a color from
- * the theme, this will keep the same value set above this Surface.
- * @param elevation The z-coordinate at which to place the SnackBar. This controls the size
- * of the shadow below the SnackBar
+ * @param contentColor color of the content to use inside the snackbar. Defaults to either the
+ *   matching content color for [backgroundColor], or, if it is not a color from the theme, this
+ *   will keep the same value set above this Surface.
+ * @param elevation The z-coordinate at which to place the SnackBar. This controls the size of the
+ *   shadow below the SnackBar
  * @param content content to show information about a process that an app has performed or will
- * perform
+ *   perform
  */
 @Composable
 fun Snackbar(
@@ -112,21 +115,23 @@
 }
 
 /**
- * <a href="https://material.io/components/snackbars" class="external" target="_blank">Material Design snackbar</a>.
+ * <a href="https://material.io/components/snackbars" class="external" target="_blank">Material
+ * Design snackbar</a>.
  *
  * Snackbars provide brief messages about app processes at the bottom of the screen.
  *
  * Snackbars inform users of a process that an app has performed or will perform. They appear
- * temporarily, towards the bottom of the screen. They shouldn’t interrupt the user experience,
- * and they don’t require user input to disappear.
+ * temporarily, towards the bottom of the screen. They shouldn’t interrupt the user experience, and
+ * they don’t require user input to disappear.
  *
  * A Snackbar can contain a single action. Because they disappear automatically, the action
  * shouldn't be "Dismiss" or "Cancel".
  *
- * ![Snackbars image](https://developer.android.com/images/reference/androidx/compose/material/snackbars.png)
+ * ![Snackbars
+ * image](https://developer.android.com/images/reference/androidx/compose/material/snackbars.png)
  *
- * This version of snackbar is designed to work with [SnackbarData] provided by the
- * [SnackbarHost], which is usually used inside of the [Scaffold].
+ * This version of snackbar is designed to work with [SnackbarData] provided by the [SnackbarHost],
+ * which is usually used inside of the [Scaffold].
  *
  * This components provides only the visuals of the [Snackbar]. If you need to show a [Snackbar]
  * with defaults on the screen, use [ScaffoldState.snackbarHostState] and
@@ -136,20 +141,21 @@
  *
  * If you want to customize appearance of the [Snackbar], you can pass your own version as a child
  * of the [SnackbarHost] to the [Scaffold]:
+ *
  * @sample androidx.compose.material.samples.ScaffoldWithCustomSnackbar
  *
  * @param snackbarData data about the current snackbar showing via [SnackbarHostState]
  * @param modifier modifiers for the Snackbar layout
- * @param actionOnNewLine whether or not action should be put on the separate line. Recommended
- * for action with long action text
+ * @param actionOnNewLine whether or not action should be put on the separate line. Recommended for
+ *   action with long action text
  * @param shape Defines the Snackbar's shape as well as its shadow
  * @param backgroundColor background color of the Snackbar
- * @param contentColor color of the content to use inside the snackbar. Defaults to
- * either the matching content color for [backgroundColor], or, if it is not a color from
- * the theme, this will keep the same value set above this Surface.
+ * @param contentColor color of the content to use inside the snackbar. Defaults to either the
+ *   matching content color for [backgroundColor], or, if it is not a color from the theme, this
+ *   will keep the same value set above this Surface.
  * @param actionColor color of the action
- * @param elevation The z-coordinate at which to place the SnackBar. This controls the size
- * of the shadow below the SnackBar
+ * @param elevation The z-coordinate at which to place the SnackBar. This controls the size of the
+ *   shadow below the SnackBar
  */
 @Composable
 fun Snackbar(
@@ -163,17 +169,18 @@
     elevation: Dp = 6.dp
 ) {
     val actionLabel = snackbarData.actionLabel
-    val actionComposable: (@Composable () -> Unit)? = if (actionLabel != null) {
-        @Composable {
-            TextButton(
-                colors = ButtonDefaults.textButtonColors(contentColor = actionColor),
-                onClick = { snackbarData.performAction() },
-                content = { Text(actionLabel) }
-            )
+    val actionComposable: (@Composable () -> Unit)? =
+        if (actionLabel != null) {
+            @Composable {
+                TextButton(
+                    colors = ButtonDefaults.textButtonColors(contentColor = actionColor),
+                    onClick = { snackbarData.performAction() },
+                    content = { Text(actionLabel) }
+                )
+            }
+        } else {
+            null
         }
-    } else {
-        null
-    }
     Snackbar(
         modifier = modifier.padding(12.dp),
         content = { Text(snackbarData.message) },
@@ -186,19 +193,13 @@
     )
 }
 
-/**
- * Object to hold defaults used by [Snackbar]
- */
+/** Object to hold defaults used by [Snackbar] */
 object SnackbarDefaults {
 
-    /**
-     * Default alpha of the overlay applied to the [backgroundColor]
-     */
+    /** Default alpha of the overlay applied to the [backgroundColor] */
     private const val SnackbarOverlayAlpha = 0.8f
 
-    /**
-     * Default background color of the [Snackbar]
-     */
+    /** Default background color of the [Snackbar] */
     val backgroundColor: Color
         @Composable
         get() =
@@ -213,8 +214,8 @@
      * incorrect contrast.
      *
      * If your light theme has a corresponding dark theme, you should instead directly use
-     * [Colors.primary] from the dark theme when in a light theme, and use
-     * [Colors.primaryVariant] from the dark theme when in a dark theme.
+     * [Colors.primary] from the dark theme when in a light theme, and use [Colors.primaryVariant]
+     * from the dark theme when in a dark theme.
      *
      * When in a light theme, this function applies a color overlay to [Colors.primary] from
      * [MaterialTheme.colors] to attempt to reduce the contrast, and when in a dark theme this
@@ -239,10 +240,8 @@
 private fun TextOnlySnackbar(content: @Composable () -> Unit) {
     Layout({
         Box(
-            modifier = Modifier.padding(
-                horizontal = HorizontalSpacing,
-                vertical = SnackbarVerticalPadding
-            )
+            modifier =
+                Modifier.padding(horizontal = HorizontalSpacing, vertical = SnackbarVerticalPadding)
         ) {
             content()
         }
@@ -255,21 +254,25 @@
         measurables.fastForEach {
             val placeable = it.measure(constraints)
             textPlaceables.add(placeable)
-            if (placeable[FirstBaseline] != AlignmentLine.Unspecified &&
-                (firstBaseline == AlignmentLine.Unspecified ||
-                    placeable[FirstBaseline] < firstBaseline)) {
+            if (
+                placeable[FirstBaseline] != AlignmentLine.Unspecified &&
+                    (firstBaseline == AlignmentLine.Unspecified ||
+                        placeable[FirstBaseline] < firstBaseline)
+            ) {
                 firstBaseline = placeable[FirstBaseline]
             }
-            if (placeable[LastBaseline] != AlignmentLine.Unspecified &&
-                (lastBaseline == AlignmentLine.Unspecified ||
-                    placeable[LastBaseline] > lastBaseline)) {
+            if (
+                placeable[LastBaseline] != AlignmentLine.Unspecified &&
+                    (lastBaseline == AlignmentLine.Unspecified ||
+                        placeable[LastBaseline] > lastBaseline)
+            ) {
                 lastBaseline = placeable[LastBaseline]
             }
             height = max(height, placeable.height)
         }
 
-        val hasText = firstBaseline != AlignmentLine.Unspecified &&
-            lastBaseline != AlignmentLine.Unspecified
+        val hasText =
+            firstBaseline != AlignmentLine.Unspecified && lastBaseline != AlignmentLine.Unspecified
 
         val minHeight =
             if (firstBaseline == lastBaseline || !hasText) {
@@ -288,31 +291,28 @@
 }
 
 @Composable
-private fun NewLineButtonSnackbar(
-    text: @Composable () -> Unit,
-    action: @Composable () -> Unit
-) {
+private fun NewLineButtonSnackbar(text: @Composable () -> Unit, action: @Composable () -> Unit) {
     Column(
-        modifier = Modifier.fillMaxWidth()
-            .padding(
-                start = HorizontalSpacing,
-                end = HorizontalSpacingButtonSide,
-                bottom = SeparateButtonExtraY
-            )
+        modifier =
+            Modifier.fillMaxWidth()
+                .padding(
+                    start = HorizontalSpacing,
+                    end = HorizontalSpacingButtonSide,
+                    bottom = SeparateButtonExtraY
+                )
     ) {
         Box(
             Modifier.paddingFromBaseline(HeightToFirstLine, LongButtonVerticalOffset)
                 .padding(end = HorizontalSpacingButtonSide)
-        ) { text() }
+        ) {
+            text()
+        }
         Box(Modifier.align(Alignment.End)) { action() }
     }
 }
 
 @Composable
-private fun OneRowSnackbar(
-    text: @Composable () -> Unit,
-    action: @Composable () -> Unit
-) {
+private fun OneRowSnackbar(text: @Composable () -> Unit, action: @Composable () -> Unit) {
     val textTag = "text"
     val actionTag = "action"
     Layout(
@@ -320,24 +320,23 @@
             Box(Modifier.layoutId(textTag).padding(vertical = SnackbarVerticalPadding)) { text() }
             Box(Modifier.layoutId(actionTag)) { action() }
         },
-        modifier = Modifier.padding(
-            start = HorizontalSpacing,
-            end = HorizontalSpacingButtonSide
-        )
+        modifier = Modifier.padding(start = HorizontalSpacing, end = HorizontalSpacingButtonSide)
     ) { measurables, constraints ->
-        val buttonPlaceable = measurables.fastFirst { it.layoutId == actionTag }
-            .measure(constraints)
+        val buttonPlaceable =
+            measurables.fastFirst { it.layoutId == actionTag }.measure(constraints)
         val textMaxWidth =
             (constraints.maxWidth - buttonPlaceable.width - TextEndExtraSpacing.roundToPx())
                 .coerceAtLeast(constraints.minWidth)
-        val textPlaceable = measurables.fastFirst { it.layoutId == textTag }.measure(
-            constraints.copy(minHeight = 0, maxWidth = textMaxWidth)
-        )
+        val textPlaceable =
+            measurables
+                .fastFirst { it.layoutId == textTag }
+                .measure(constraints.copy(minHeight = 0, maxWidth = textMaxWidth))
 
         val firstTextBaseline = textPlaceable[FirstBaseline]
         val lastTextBaseline = textPlaceable[LastBaseline]
-        val hasText = firstTextBaseline != AlignmentLine.Unspecified &&
-            lastTextBaseline != AlignmentLine.Unspecified
+        val hasText =
+            firstTextBaseline != AlignmentLine.Unspecified &&
+                lastTextBaseline != AlignmentLine.Unspecified
         val isOneLine = firstTextBaseline == lastTextBaseline || !hasText
         val buttonPlaceX = constraints.maxWidth - buttonPlaceable.width
 
@@ -350,13 +349,14 @@
             containerHeight = max(minContainerHeight, contentHeight)
             textPlaceY = (containerHeight - textPlaceable.height) / 2
             val buttonBaseline = buttonPlaceable[FirstBaseline]
-            buttonPlaceY = buttonBaseline.let {
-                if (it != AlignmentLine.Unspecified) {
-                    textPlaceY + firstTextBaseline - it
-                } else {
-                    0
+            buttonPlaceY =
+                buttonBaseline.let {
+                    if (it != AlignmentLine.Unspecified) {
+                        textPlaceY + firstTextBaseline - it
+                    } else {
+                        0
+                    }
                 }
-            }
         } else {
             val baselineOffset = HeightToFirstLine.roundToPx()
             textPlaceY = baselineOffset - firstTextBaseline
diff --git a/compose/material/material/src/commonMain/kotlin/androidx/compose/material/SnackbarHost.kt b/compose/material/material/src/commonMain/kotlin/androidx/compose/material/SnackbarHost.kt
index f6e201e..a22e53b 100644
--- a/compose/material/material/src/commonMain/kotlin/androidx/compose/material/SnackbarHost.kt
+++ b/compose/material/material/src/commonMain/kotlin/androidx/compose/material/SnackbarHost.kt
@@ -53,8 +53,8 @@
 import kotlinx.coroutines.sync.withLock
 
 /**
- * State of the [SnackbarHost], controls the queue and the current [Snackbar] being shown inside
- * the [SnackbarHost].
+ * State of the [SnackbarHost], controls the queue and the current [Snackbar] being shown inside the
+ * [SnackbarHost].
  *
  * This state usually lives as a part of a [ScaffoldState] and provided to the [SnackbarHost]
  * automatically, but can be decoupled from it and live separately when desired.
@@ -63,26 +63,23 @@
 class SnackbarHostState {
 
     /**
-     * Only one [Snackbar] can be shown at a time.
-     * Since a suspending Mutex is a fair queue, this manages our message queue
-     * and we don't have to maintain one.
+     * Only one [Snackbar] can be shown at a time. Since a suspending Mutex is a fair queue, this
+     * manages our message queue and we don't have to maintain one.
      */
     private val mutex = Mutex()
 
-    /**
-     * The current [SnackbarData] being shown by the [SnackbarHost], of `null` if none.
-     */
+    /** The current [SnackbarData] being shown by the [SnackbarHost], of `null` if none. */
     var currentSnackbarData by mutableStateOf<SnackbarData?>(null)
         private set
 
     /**
-     * Shows or queues to be shown a [Snackbar] at the bottom of the [Scaffold] at
-     * which this state is attached and suspends until snackbar is disappeared.
+     * Shows or queues to be shown a [Snackbar] at the bottom of the [Scaffold] at which this state
+     * is attached and suspends until snackbar is disappeared.
      *
      * [SnackbarHostState] guarantees to show at most one snackbar at a time. If this function is
-     * called while another snackbar is already visible, it will be suspended until this snack
-     * bar is shown and subsequently addressed. If the caller is cancelled, the snackbar will be
-     * removed from display and/or the queue to be displayed.
+     * called while another snackbar is already visible, it will be suspended until this snack bar
+     * is shown and subsequently addressed. If the caller is cancelled, the snackbar will be removed
+     * from display and/or the queue to be displayed.
      *
      * All of this allows for granular control over the snackbar queue from within:
      *
@@ -93,24 +90,25 @@
      * @param message text to be shown in the Snackbar
      * @param actionLabel optional action label to show as button in the Snackbar
      * @param duration duration to control how long snackbar will be shown in [SnackbarHost], either
-     * [SnackbarDuration.Short], [SnackbarDuration.Long] or [SnackbarDuration.Indefinite]
-     *
+     *   [SnackbarDuration.Short], [SnackbarDuration.Long] or [SnackbarDuration.Indefinite]
      * @return [SnackbarResult.ActionPerformed] if option action has been clicked or
-     * [SnackbarResult.Dismissed] if snackbar has been dismissed via timeout or by the user
+     *   [SnackbarResult.Dismissed] if snackbar has been dismissed via timeout or by the user
      */
     suspend fun showSnackbar(
         message: String,
         actionLabel: String? = null,
         duration: SnackbarDuration = SnackbarDuration.Short
-    ): SnackbarResult = mutex.withLock {
-        try {
-            return suspendCancellableCoroutine { continuation ->
-                currentSnackbarData = SnackbarDataImpl(message, actionLabel, duration, continuation)
+    ): SnackbarResult =
+        mutex.withLock {
+            try {
+                return suspendCancellableCoroutine { continuation ->
+                    currentSnackbarData =
+                        SnackbarDataImpl(message, actionLabel, duration, continuation)
+                }
+            } finally {
+                currentSnackbarData = null
             }
-        } finally {
-            currentSnackbarData = null
         }
-    }
 
     @Stable
     private class SnackbarDataImpl(
@@ -131,8 +129,8 @@
 }
 
 /**
- * Host for [Snackbar]s to be used in [Scaffold] to properly show, hide and dismiss items based
- * on material specification and the [hostState].
+ * Host for [Snackbar]s to be used in [Scaffold] to properly show, hide and dismiss items based on
+ * material specification and the [hostState].
  *
  * This component with default parameters comes build-in with [Scaffold], if you need to show a
  * default [Snackbar], use use [ScaffoldState.snackbarHostState] and
@@ -148,7 +146,7 @@
  * @param hostState state of this component to read and show [Snackbar]s accordingly
  * @param modifier optional modifier for this component
  * @param snackbar the instance of the [Snackbar] to be shown at the appropriate time with
- * appearance based on the [SnackbarData] provided as a param
+ *   appearance based on the [SnackbarData] provided as a param
  */
 @Composable
 fun SnackbarHost(
@@ -160,10 +158,11 @@
     val accessibilityManager = LocalAccessibilityManager.current
     LaunchedEffect(currentSnackbarData) {
         if (currentSnackbarData != null) {
-            val duration = currentSnackbarData.duration.toMillis(
-                currentSnackbarData.actionLabel != null,
-                accessibilityManager
-            )
+            val duration =
+                currentSnackbarData.duration.toMillis(
+                    currentSnackbarData.actionLabel != null,
+                    accessibilityManager
+                )
             delay(duration)
             currentSnackbarData.dismiss()
         }
@@ -187,49 +186,31 @@
     val actionLabel: String?
     val duration: SnackbarDuration
 
-    /**
-     * Function to be called when Snackbar action has been performed to notify the listeners
-     */
+    /** Function to be called when Snackbar action has been performed to notify the listeners */
     fun performAction()
 
-    /**
-     * Function to be called when Snackbar is dismissed either by timeout or by the user
-     */
+    /** Function to be called when Snackbar is dismissed either by timeout or by the user */
     fun dismiss()
 }
 
-/**
- * Possible results of the [SnackbarHostState.showSnackbar] call
- */
+/** Possible results of the [SnackbarHostState.showSnackbar] call */
 enum class SnackbarResult {
-    /**
-     * [Snackbar] that is shown has been dismissed either by timeout of by user
-     */
+    /** [Snackbar] that is shown has been dismissed either by timeout of by user */
     Dismissed,
 
-    /**
-     * Action on the [Snackbar] has been clicked before the time out passed
-     */
+    /** Action on the [Snackbar] has been clicked before the time out passed */
     ActionPerformed,
 }
 
-/**
- * Possible durations of the [Snackbar] in [SnackbarHost]
- */
+/** Possible durations of the [Snackbar] in [SnackbarHost] */
 enum class SnackbarDuration {
-    /**
-     * Show the Snackbar for a short period of time
-     */
+    /** Show the Snackbar for a short period of time */
     Short,
 
-    /**
-     * Show the Snackbar for a long period of time
-     */
+    /** Show the Snackbar for a long period of time */
     Long,
 
-    /**
-     * Show the Snackbar indefinitely until explicitly dismissed or action is clicked
-     */
+    /** Show the Snackbar indefinitely until explicitly dismissed or action is clicked */
     Indefinite
 }
 
@@ -238,11 +219,12 @@
     hasAction: Boolean,
     accessibilityManager: AccessibilityManager?
 ): Long {
-    val original = when (this) {
-        SnackbarDuration.Indefinite -> Long.MAX_VALUE
-        SnackbarDuration.Long -> 10000L
-        SnackbarDuration.Short -> 4000L
-    }
+    val original =
+        when (this) {
+            SnackbarDuration.Indefinite -> Long.MAX_VALUE
+            SnackbarDuration.Long -> 10000L
+            SnackbarDuration.Short -> 4000L
+        }
     if (accessibilityManager == null) {
         return original
     }
@@ -275,44 +257,51 @@
                 val isVisible = key == current
                 val duration = if (isVisible) SnackbarFadeInMillis else SnackbarFadeOutMillis
                 val delay = SnackbarFadeOutMillis + SnackbarInBetweenDelayMillis
-                val animationDelay = if (isVisible && keys.fastFilterNotNull().size != 1) {
-                    delay
-                } else {
-                    0
-                }
-                val opacity = animatedOpacity(
-                    animation = tween(
-                        easing = LinearEasing,
-                        delayMillis = animationDelay,
-                        durationMillis = duration
-                    ),
-                    visible = isVisible,
-                    onAnimationFinish = {
-                        if (key != state.current) {
-                            // leave only the current in the list
-                            state.items.removeAll { it.key == key }
-                            state.scope?.invalidate()
-                        }
+                val animationDelay =
+                    if (isVisible && keys.fastFilterNotNull().size != 1) {
+                        delay
+                    } else {
+                        0
                     }
-                )
-                val scale = animatedScale(
-                    animation = tween(
-                        easing = FastOutSlowInEasing,
-                        delayMillis = animationDelay,
-                        durationMillis = duration
-                    ),
-                    visible = isVisible
-                )
+                val opacity =
+                    animatedOpacity(
+                        animation =
+                            tween(
+                                easing = LinearEasing,
+                                delayMillis = animationDelay,
+                                durationMillis = duration
+                            ),
+                        visible = isVisible,
+                        onAnimationFinish = {
+                            if (key != state.current) {
+                                // leave only the current in the list
+                                state.items.removeAll { it.key == key }
+                                state.scope?.invalidate()
+                            }
+                        }
+                    )
+                val scale =
+                    animatedScale(
+                        animation =
+                            tween(
+                                easing = FastOutSlowInEasing,
+                                delayMillis = animationDelay,
+                                durationMillis = duration
+                            ),
+                        visible = isVisible
+                    )
                 Box(
-                    Modifier
-                        .graphicsLayer(
+                    Modifier.graphicsLayer(
                             scaleX = scale.value,
                             scaleY = scale.value,
                             alpha = opacity.value
                         )
                         .semantics {
                             liveRegion = LiveRegionMode.Polite
-                            dismiss { key.dismiss(); true }
+                            dismiss {
+                                key.dismiss()
+                                true
+                            }
                         }
                 ) {
                     children()
@@ -322,13 +311,7 @@
     }
     Box(modifier) {
         state.scope = currentRecomposeScope
-        state.items.fastForEach { (item, opacity) ->
-            key(item) {
-                opacity {
-                    content(item!!)
-                }
-            }
-        }
+        state.items.fastForEach { (item, opacity) -> key(item) { opacity { content(item!!) } } }
     }
 }
 
@@ -354,10 +337,7 @@
 ): State<Float> {
     val alpha = remember { Animatable(if (!visible) 1f else 0f) }
     LaunchedEffect(visible) {
-        alpha.animateTo(
-            if (visible) 1f else 0f,
-            animationSpec = animation
-        )
+        alpha.animateTo(if (visible) 1f else 0f, animationSpec = animation)
         onAnimationFinish()
     }
     return alpha.asState()
@@ -367,10 +347,7 @@
 private fun animatedScale(animation: AnimationSpec<Float>, visible: Boolean): State<Float> {
     val scale = remember { Animatable(if (!visible) 1f else 0.8f) }
     LaunchedEffect(visible) {
-        scale.animateTo(
-            if (visible) 1f else 0.8f,
-            animationSpec = animation
-        )
+        scale.animateTo(if (visible) 1f else 0.8f, animationSpec = animation)
     }
     return scale.asState()
 }
diff --git a/compose/material/material/src/commonMain/kotlin/androidx/compose/material/Strings.kt b/compose/material/material/src/commonMain/kotlin/androidx/compose/material/Strings.kt
index 6eef3d9..5294b4e 100644
--- a/compose/material/material/src/commonMain/kotlin/androidx/compose/material/Strings.kt
+++ b/compose/material/material/src/commonMain/kotlin/androidx/compose/material/Strings.kt
@@ -33,5 +33,4 @@
     }
 }
 
-@Composable
-internal expect fun getString(string: Strings): String
+@Composable internal expect fun getString(string: Strings): String
diff --git a/compose/material/material/src/commonMain/kotlin/androidx/compose/material/Surface.kt b/compose/material/material/src/commonMain/kotlin/androidx/compose/material/Surface.kt
index f471417..9f35894 100644
--- a/compose/material/material/src/commonMain/kotlin/androidx/compose/material/Surface.kt
+++ b/compose/material/material/src/commonMain/kotlin/androidx/compose/material/Surface.kt
@@ -22,7 +22,6 @@
 import androidx.compose.foundation.clickable
 import androidx.compose.foundation.interaction.Interaction
 import androidx.compose.foundation.interaction.MutableInteractionSource
-import androidx.compose.foundation.interaction.PressInteraction
 import androidx.compose.foundation.layout.Box
 import androidx.compose.foundation.selection.selectable
 import androidx.compose.foundation.selection.toggleable
@@ -35,7 +34,6 @@
 import androidx.compose.ui.graphics.RectangleShape
 import androidx.compose.ui.graphics.Shape
 import androidx.compose.ui.input.pointer.pointerInput
-import androidx.compose.ui.semantics.Role
 import androidx.compose.ui.semantics.isContainer
 import androidx.compose.ui.semantics.semantics
 import androidx.compose.ui.text.TextStyle
@@ -43,59 +41,54 @@
 import androidx.compose.ui.unit.dp
 
 /**
- * <a href="https://material.io/design/environment/surfaces.html" class="external" target="_blank">Material Design surface</a>.
+ * <a href="https://material.io/design/environment/surfaces.html" class="external"
+ * target="_blank">Material Design surface</a>.
  *
  * Material surface is the central metaphor in material design. Each surface exists at a given
- * elevation, which influences how that piece of surface visually relates to other surfaces and
- * how that surface casts shadows.
+ * elevation, which influences how that piece of surface visually relates to other surfaces and how
+ * that surface casts shadows.
  *
  * See the other overloads for clickable, selectable, and toggleable surfaces.
  *
  * The Surface is responsible for:
- *
  * 1) Clipping: Surface clips its children to the shape specified by [shape]
- *
- * 2) Elevation: Surface draws a shadow to represent depth, where [elevation] represents the
- * depth of this surface. If the passed [shape] is concave the shadow will not be drawn on Android
- * versions less than 10.
- *
+ * 2) Elevation: Surface draws a shadow to represent depth, where [elevation] represents the depth
+ *    of this surface. If the passed [shape] is concave the shadow will not be drawn on Android
+ *    versions less than 10.
  * 3) Borders: If [shape] has a border, then it will also be drawn.
- *
  * 4) Background: Surface fills the shape specified by [shape] with the [color]. If [color] is
- * [Colors.surface], the [ElevationOverlay] from [LocalElevationOverlay] will be used to apply
- * an overlay - by default this will only occur in dark theme. The color of the overlay depends
- * on the [elevation] of this Surface, and the [LocalAbsoluteElevation] set by any parent
- * surfaces. This ensures that a Surface never appears to have a lower elevation overlay than its
- * ancestors, by summing the elevation of all previous Surfaces.
- *
+ *    [Colors.surface], the [ElevationOverlay] from [LocalElevationOverlay] will be used to apply an
+ *    overlay - by default this will only occur in dark theme. The color of the overlay depends on
+ *    the [elevation] of this Surface, and the [LocalAbsoluteElevation] set by any parent surfaces.
+ *    This ensures that a Surface never appears to have a lower elevation overlay than its
+ *    ancestors, by summing the elevation of all previous Surfaces.
  * 5) Content color: Surface uses [contentColor] to specify a preferred color for the content of
- * this surface - this is used by the [Text] and [Icon] components as a default color.
- *
+ *    this surface - this is used by the [Text] and [Icon] components as a default color.
  * 6) Blocking touch propagation behind the surface.
  *
  * If no [contentColor] is set, this surface will try and match its background color to a color
- * defined in the theme [Colors], and return the corresponding content color. For example,
- * if the [color] of this surface is [Colors.surface], [contentColor] will be set to
- * [Colors.onSurface]. If [color] is not part of the theme palette, [contentColor] will keep
- * the same value set above this Surface.
+ * defined in the theme [Colors], and return the corresponding content color. For example, if the
+ * [color] of this surface is [Colors.surface], [contentColor] will be set to [Colors.onSurface]. If
+ * [color] is not part of the theme palette, [contentColor] will keep the same value set above this
+ * Surface.
  *
  * @sample androidx.compose.material.samples.SurfaceSample
  *
- * To modify these default style values used by text, use [ProvideTextStyle] or explicitly
- * pass a new [TextStyle] to your text.
+ * To modify these default style values used by text, use [ProvideTextStyle] or explicitly pass a
+ * new [TextStyle] to your text.
  *
  * To manually retrieve the content color inside a surface, use [LocalContentColor].
  *
  * @param modifier Modifier to be applied to the layout corresponding to the surface
- * @param shape Defines the surface's shape as well its shadow. A shadow is only
- *  displayed if the [elevation] is greater than zero.
+ * @param shape Defines the surface's shape as well its shadow. A shadow is only displayed if the
+ *   [elevation] is greater than zero.
  * @param color The background color. Use [Color.Transparent] to have no color.
  * @param contentColor The preferred content color provided by this Surface to its children.
- * Defaults to either the matching content color for [color], or if [color] is not a color from
- * the theme, this will keep the same value set above this Surface.
+ *   Defaults to either the matching content color for [color], or if [color] is not a color from
+ *   the theme, this will keep the same value set above this Surface.
  * @param border Optional border to draw on top of the surface
  * @param elevation The size of the shadow below the surface. Note that It will not affect z index
- * of the Surface. If you want to change the drawing order you can use `Modifier.zIndex`.
+ *   of the Surface. If you want to change the drawing order you can use `Modifier.zIndex`.
  */
 @Composable
 fun Surface(
@@ -113,22 +106,24 @@
         LocalAbsoluteElevation provides absoluteElevation
     ) {
         Box(
-            modifier = modifier
-                .surface(
-                    shape = shape,
-                    backgroundColor = surfaceColorAtElevation(
-                        color = color,
-                        elevationOverlay = LocalElevationOverlay.current,
-                        absoluteElevation = absoluteElevation
-                    ),
-                    border = border,
-                    elevation = elevation
-                )
-                .semantics(mergeDescendants = false) {
-                    @Suppress("DEPRECATION")
-                    isContainer = true
-                }
-                .pointerInput(Unit) {},
+            modifier =
+                modifier
+                    .surface(
+                        shape = shape,
+                        backgroundColor =
+                            surfaceColorAtElevation(
+                                color = color,
+                                elevationOverlay = LocalElevationOverlay.current,
+                                absoluteElevation = absoluteElevation
+                            ),
+                        border = border,
+                        elevation = elevation
+                    )
+                    .semantics(mergeDescendants = false) {
+                        @Suppress("DEPRECATION")
+                        isContainer = true
+                    }
+                    .pointerInput(Unit) {},
             propagateMinConstraints = true
         ) {
             content()
@@ -138,70 +133,63 @@
 
 /**
  * Material surface is the central metaphor in material design. Each surface exists at a given
- * elevation, which influences how that piece of surface visually relates to other surfaces and
- * how that surface casts shadows.
+ * elevation, which influences how that piece of surface visually relates to other surfaces and how
+ * that surface casts shadows.
  *
- * This version of Surface is responsible for a click handling as well al everything else that
- * a regular Surface does:
+ * This version of Surface is responsible for a click handling as well al everything else that a
+ * regular Surface does:
  *
  * This clickable Surface is responsible for:
- *
  * 1) Clipping: Surface clips its children to the shape specified by [shape]
- *
- * 2) Elevation: Surface draws a shadow to represent depth, where [elevation] represents the
- * depth of this surface. If the passed [shape] is convex the shadow will not be drawn on Android
- * versions less than 10.
- *
+ * 2) Elevation: Surface draws a shadow to represent depth, where [elevation] represents the depth
+ *    of this surface. If the passed [shape] is convex the shadow will not be drawn on Android
+ *    versions less than 10.
  * 3) Borders: If [shape] has a border, then it will also be drawn.
- *
  * 4) Background: Surface fills the shape specified by [shape] with the [color]. If [color] is
- * [Colors.surface], the [ElevationOverlay] from [LocalElevationOverlay] will be used to apply
- * an overlay - by default this will only occur in dark theme. The color of the overlay depends
- * on the [elevation] of this Surface, and the [LocalAbsoluteElevation] set by any parent
- * surfaces. This ensures that a Surface never appears to have a lower elevation overlay than its
- * ancestors, by summing the elevation of all previous Surfaces.
- *
+ *    [Colors.surface], the [ElevationOverlay] from [LocalElevationOverlay] will be used to apply an
+ *    overlay - by default this will only occur in dark theme. The color of the overlay depends on
+ *    the [elevation] of this Surface, and the [LocalAbsoluteElevation] set by any parent surfaces.
+ *    This ensures that a Surface never appears to have a lower elevation overlay than its
+ *    ancestors, by summing the elevation of all previous Surfaces.
  * 5) Content color: Surface uses [contentColor] to specify a preferred color for the content of
- * this surface - this is used by the [Text] and [Icon] components as a default color. If no
- * [contentColor] is set, this surface will try and match its background color to a color defined
- * in the theme [Colors], and return the corresponding content color. For example, if the [color]
- * of this surface is [Colors.surface], [contentColor] will be set to [Colors.onSurface]. If
- * [color] is not part of the theme palette, [contentColor] will keep the same value set above
- * this Surface.
- *
+ *    this surface - this is used by the [Text] and [Icon] components as a default color. If no
+ *    [contentColor] is set, this surface will try and match its background color to a color defined
+ *    in the theme [Colors], and return the corresponding content color. For example, if the [color]
+ *    of this surface is [Colors.surface], [contentColor] will be set to [Colors.onSurface]. If
+ *    [color] is not part of the theme palette, [contentColor] will keep the same value set above
+ *    this Surface.
  * 6) Click handling. This version of surface will react to the clicks, calling [onClick] lambda,
- * updating the [interactionSource] when [PressInteraction] occurs, and showing ripple indication in
- * response to press events. If you don't need click handling, consider using the Surface function
- * that doesn't require [onClick] param.
- *
+ *    updating the [interactionSource] when [PressInteraction] occurs, and showing ripple indication
+ *    in response to press events. If you don't need click handling, consider using the Surface
+ *    function that doesn't require [onClick] param.
  * 7) Semantics for clicks. Just like with [Modifier.clickable], clickable version of Surface will
- * produce semantics to indicate that it is clicked. No semantic role is set by default, you
- * may specify one by passing a desired [Role] with a [Modifier.semantics].
+ *    produce semantics to indicate that it is clicked. No semantic role is set by default, you may
+ *    specify one by passing a desired [Role] with a [Modifier.semantics].
  *
  * @sample androidx.compose.material.samples.ClickableSurfaceSample
  *
- * To modify these default style values used by text, use [ProvideTextStyle] or explicitly
- * pass a new [TextStyle] to your text.
+ * To modify these default style values used by text, use [ProvideTextStyle] or explicitly pass a
+ * new [TextStyle] to your text.
  *
  * To manually retrieve the content color inside a surface, use [LocalContentColor].
  *
  * @param onClick callback to be called when the surface is clicked
  * @param modifier Modifier to be applied to the layout corresponding to the surface
- * @param enabled Controls the enabled state of the surface. When `false`, this surface will not
- * be clickable
- * @param shape Defines the surface's shape as well its shadow. A shadow is only
- *  displayed if the [elevation] is greater than zero.
+ * @param enabled Controls the enabled state of the surface. When `false`, this surface will not be
+ *   clickable
+ * @param shape Defines the surface's shape as well its shadow. A shadow is only displayed if the
+ *   [elevation] is greater than zero.
  * @param color The background color. Use [Color.Transparent] to have no color.
  * @param contentColor The preferred content color provided by this Surface to its children.
- * Defaults to either the matching content color for [color], or if [color] is not a color from
- * the theme, this will keep the same value set above this Surface.
+ *   Defaults to either the matching content color for [color], or if [color] is not a color from
+ *   the theme, this will keep the same value set above this Surface.
  * @param border Optional border to draw on top of the surface
  * @param elevation The size of the shadow below the surface. Note that It will not affect z index
- * of the Surface. If you want to change the drawing order you can use `Modifier.zIndex`.
+ *   of the Surface. If you want to change the drawing order you can use `Modifier.zIndex`.
  * @param interactionSource an optional hoisted [MutableInteractionSource] for observing and
- * emitting [Interaction]s for this surface. You can use this to change the surface's
- * appearance or preview the surface in different states. Note that if `null` is provided,
- * interactions will still happen internally.
+ *   emitting [Interaction]s for this surface. You can use this to change the surface's appearance
+ *   or preview the surface in different states. Note that if `null` is provided, interactions will
+ *   still happen internally.
  */
 @ExperimentalMaterialApi
 @Composable
@@ -223,24 +211,26 @@
         LocalAbsoluteElevation provides absoluteElevation
     ) {
         Box(
-            modifier = modifier
-                .minimumInteractiveComponentSize()
-                .surface(
-                    shape = shape,
-                    backgroundColor = surfaceColorAtElevation(
-                        color = color,
-                        elevationOverlay = LocalElevationOverlay.current,
-                        absoluteElevation = absoluteElevation
+            modifier =
+                modifier
+                    .minimumInteractiveComponentSize()
+                    .surface(
+                        shape = shape,
+                        backgroundColor =
+                            surfaceColorAtElevation(
+                                color = color,
+                                elevationOverlay = LocalElevationOverlay.current,
+                                absoluteElevation = absoluteElevation
+                            ),
+                        border = border,
+                        elevation = elevation
+                    )
+                    .clickable(
+                        interactionSource = interactionSource,
+                        indication = rippleOrFallbackImplementation(),
+                        enabled = enabled,
+                        onClick = onClick
                     ),
-                    border = border,
-                    elevation = elevation
-                )
-                .clickable(
-                    interactionSource = interactionSource,
-                    indication = rippleOrFallbackImplementation(),
-                    enabled = enabled,
-                    onClick = onClick
-                ),
             propagateMinConstraints = true
         ) {
             content()
@@ -250,71 +240,64 @@
 
 /**
  * Material surface is the central metaphor in material design. Each surface exists at a given
- * elevation, which influences how that piece of surface visually relates to other surfaces and
- * how that surface casts shadows.
+ * elevation, which influences how that piece of surface visually relates to other surfaces and how
+ * that surface casts shadows.
  *
- * This version of Surface is responsible for a selection handling as well as everything else that
- * a regular Surface does:
+ * This version of Surface is responsible for a selection handling as well as everything else that a
+ * regular Surface does:
  *
  * This selectable Surface is responsible for:
- *
  * 1) Clipping: Surface clips its children to the shape specified by [shape]
- *
- * 2) Elevation: Surface draws a shadow to represent depth, where [elevation] represents the
- * depth of this surface. If the passed [shape] is convex the shadow will not be drawn on Android
- * versions less than 10.
- *
+ * 2) Elevation: Surface draws a shadow to represent depth, where [elevation] represents the depth
+ *    of this surface. If the passed [shape] is convex the shadow will not be drawn on Android
+ *    versions less than 10.
  * 3) Borders: If [shape] has a border, then it will also be drawn.
- *
  * 4) Background: Surface fills the shape specified by [shape] with the [color]. If [color] is
- * [Colors.surface], the [ElevationOverlay] from [LocalElevationOverlay] will be used to apply
- * an overlay - by default this will only occur in dark theme. The color of the overlay depends
- * on the [elevation] of this Surface, and the [LocalAbsoluteElevation] set by any parent
- * surfaces. This ensures that a Surface never appears to have a lower elevation overlay than its
- * ancestors, by summing the elevation of all previous Surfaces.
- *
+ *    [Colors.surface], the [ElevationOverlay] from [LocalElevationOverlay] will be used to apply an
+ *    overlay - by default this will only occur in dark theme. The color of the overlay depends on
+ *    the [elevation] of this Surface, and the [LocalAbsoluteElevation] set by any parent surfaces.
+ *    This ensures that a Surface never appears to have a lower elevation overlay than its
+ *    ancestors, by summing the elevation of all previous Surfaces.
  * 5) Content color: Surface uses [contentColor] to specify a preferred color for the content of
- * this surface - this is used by the [Text] and [Icon] components as a default color. If no
- * [contentColor] is set, this surface will try and match its background color to a color defined
- * in the theme [Colors], and return the corresponding content color. For example, if the [color]
- * of this surface is [Colors.surface], [contentColor] will be set to [Colors.onSurface]. If
- * [color] is not part of the theme palette, [contentColor] will keep the same value set above
- * this Surface.
- *
+ *    this surface - this is used by the [Text] and [Icon] components as a default color. If no
+ *    [contentColor] is set, this surface will try and match its background color to a color defined
+ *    in the theme [Colors], and return the corresponding content color. For example, if the [color]
+ *    of this surface is [Colors.surface], [contentColor] will be set to [Colors.onSurface]. If
+ *    [color] is not part of the theme palette, [contentColor] will keep the same value set above
+ *    this Surface.
  * 6) Click handling. This version of surface will react to the clicks, calling [onClick] lambda,
- * updating the [interactionSource] when [PressInteraction] occurs, and showing ripple indication in
- * response to press events. If you don't need click handling, consider using the Surface function
- * that doesn't require [onClick] param.
- *
+ *    updating the [interactionSource] when [PressInteraction] occurs, and showing ripple indication
+ *    in response to press events. If you don't need click handling, consider using the Surface
+ *    function that doesn't require [onClick] param.
  * 7) Semantics for selection. Just like with [Modifier.selectable], selectable version of Surface
- * will produce semantics to indicate that it is selected. No semantic role is set by default, you
- * may specify one by passing a desired [Role] with a [Modifier.semantics].
+ *    will produce semantics to indicate that it is selected. No semantic role is set by default,
+ *    you may specify one by passing a desired [Role] with a [Modifier.semantics].
  *
  * @sample androidx.compose.material.samples.SelectableSurfaceSample
  *
- * To modify these default style values used by text, use [ProvideTextStyle] or explicitly
- * pass a new [TextStyle] to your text.
+ * To modify these default style values used by text, use [ProvideTextStyle] or explicitly pass a
+ * new [TextStyle] to your text.
  *
  * To manually retrieve the content color inside a surface, use [LocalContentColor].
  *
  * @param selected whether this Surface is selected
  * @param onClick callback to be called when the surface is clicked
  * @param modifier Modifier to be applied to the layout corresponding to the surface
- * @param enabled Controls the enabled state of the surface. When `false`, this surface will not
- * be selectable
- * @param shape Defines the surface's shape as well its shadow. A shadow is only
- *  displayed if the [elevation] is greater than zero.
+ * @param enabled Controls the enabled state of the surface. When `false`, this surface will not be
+ *   selectable
+ * @param shape Defines the surface's shape as well its shadow. A shadow is only displayed if the
+ *   [elevation] is greater than zero.
  * @param color The background color. Use [Color.Transparent] to have no color.
  * @param contentColor The preferred content color provided by this Surface to its children.
- * Defaults to either the matching content color for [color], or if [color] is not a color from
- * the theme, this will keep the same value set above this Surface.
+ *   Defaults to either the matching content color for [color], or if [color] is not a color from
+ *   the theme, this will keep the same value set above this Surface.
  * @param border Optional border to draw on top of the surface
  * @param elevation The size of the shadow below the surface. Note that It will not affect z index
- * of the Surface. If you want to change the drawing order you can use `Modifier.zIndex`.
+ *   of the Surface. If you want to change the drawing order you can use `Modifier.zIndex`.
  * @param interactionSource an optional hoisted [MutableInteractionSource] for observing and
- * emitting [Interaction]s for this surface. You can use this to change the surface's
- * appearance or preview the surface in different states. Note that if `null` is provided,
- * interactions will still happen internally.
+ *   emitting [Interaction]s for this surface. You can use this to change the surface's appearance
+ *   or preview the surface in different states. Note that if `null` is provided, interactions will
+ *   still happen internally.
  */
 @ExperimentalMaterialApi
 @Composable
@@ -337,25 +320,27 @@
         LocalAbsoluteElevation provides absoluteElevation
     ) {
         Box(
-            modifier = modifier
-                .minimumInteractiveComponentSize()
-                .surface(
-                    shape = shape,
-                    backgroundColor = surfaceColorAtElevation(
-                        color = color,
-                        elevationOverlay = LocalElevationOverlay.current,
-                        absoluteElevation = absoluteElevation
+            modifier =
+                modifier
+                    .minimumInteractiveComponentSize()
+                    .surface(
+                        shape = shape,
+                        backgroundColor =
+                            surfaceColorAtElevation(
+                                color = color,
+                                elevationOverlay = LocalElevationOverlay.current,
+                                absoluteElevation = absoluteElevation
+                            ),
+                        border = border,
+                        elevation = elevation
+                    )
+                    .selectable(
+                        selected = selected,
+                        interactionSource = interactionSource,
+                        indication = rippleOrFallbackImplementation(),
+                        enabled = enabled,
+                        onClick = onClick
                     ),
-                    border = border,
-                    elevation = elevation
-                )
-                .selectable(
-                    selected = selected,
-                    interactionSource = interactionSource,
-                    indication = rippleOrFallbackImplementation(),
-                    enabled = enabled,
-                    onClick = onClick
-                ),
             propagateMinConstraints = true
         ) {
             content()
@@ -365,71 +350,64 @@
 
 /**
  * Material surface is the central metaphor in material design. Each surface exists at a given
- * elevation, which influences how that piece of surface visually relates to other surfaces and
- * how that surface casts shadows.
+ * elevation, which influences how that piece of surface visually relates to other surfaces and how
+ * that surface casts shadows.
  *
  * This version of Surface is responsible for a toggling its checked state as well as everything
  * else that a regular Surface does:
  *
  * This toggleable Surface is responsible for:
- *
  * 1) Clipping: Surface clips its children to the shape specified by [shape]
- *
- * 2) Elevation: Surface draws a shadow to represent depth, where [elevation] represents the
- * depth of this surface. If the passed [shape] is convex the shadow will not be drawn on Android
- * versions less than 10.
- *
+ * 2) Elevation: Surface draws a shadow to represent depth, where [elevation] represents the depth
+ *    of this surface. If the passed [shape] is convex the shadow will not be drawn on Android
+ *    versions less than 10.
  * 3) Borders: If [shape] has a border, then it will also be drawn.
- *
  * 4) Background: Surface fills the shape specified by [shape] with the [color]. If [color] is
- * [Colors.surface], the [ElevationOverlay] from [LocalElevationOverlay] will be used to apply
- * an overlay - by default this will only occur in dark theme. The color of the overlay depends
- * on the [elevation] of this Surface, and the [LocalAbsoluteElevation] set by any parent
- * surfaces. This ensures that a Surface never appears to have a lower elevation overlay than its
- * ancestors, by summing the elevation of all previous Surfaces.
- *
+ *    [Colors.surface], the [ElevationOverlay] from [LocalElevationOverlay] will be used to apply an
+ *    overlay - by default this will only occur in dark theme. The color of the overlay depends on
+ *    the [elevation] of this Surface, and the [LocalAbsoluteElevation] set by any parent surfaces.
+ *    This ensures that a Surface never appears to have a lower elevation overlay than its
+ *    ancestors, by summing the elevation of all previous Surfaces.
  * 5) Content color: Surface uses [contentColor] to specify a preferred color for the content of
- * this surface - this is used by the [Text] and [Icon] components as a default color. If no
- * [contentColor] is set, this surface will try and match its background color to a color defined
- * in the theme [Colors], and return the corresponding content color. For example, if the [color]
- * of this surface is [Colors.surface], [contentColor] will be set to [Colors.onSurface]. If
- * [color] is not part of the theme palette, [contentColor] will keep the same value set above
- * this Surface.
- *
+ *    this surface - this is used by the [Text] and [Icon] components as a default color. If no
+ *    [contentColor] is set, this surface will try and match its background color to a color defined
+ *    in the theme [Colors], and return the corresponding content color. For example, if the [color]
+ *    of this surface is [Colors.surface], [contentColor] will be set to [Colors.onSurface]. If
+ *    [color] is not part of the theme palette, [contentColor] will keep the same value set above
+ *    this Surface.
  * 6) Click handling. This version of surface will react to the check toggles, calling
- * [onCheckedChange] lambda, updating the [interactionSource] when [PressInteraction] occurs, and
- * showing ripple indication in response to press events. If you don't need check
- * handling, consider using a Surface function that doesn't require [onCheckedChange] param.
- *
- * 7) Semantics for toggle. Just like with [Modifier.toggleable], toggleable version of Surface
- * will produce semantics to indicate that it is checked.  No semantic role is set by default, you
- * may specify one by passing a desired [Role] with a [Modifier.semantics].
+ *    [onCheckedChange] lambda, updating the [interactionSource] when [PressInteraction] occurs, and
+ *    showing ripple indication in response to press events. If you don't need check handling,
+ *    consider using a Surface function that doesn't require [onCheckedChange] param.
+ * 7) Semantics for toggle. Just like with [Modifier.toggleable], toggleable version of Surface will
+ *    produce semantics to indicate that it is checked. No semantic role is set by default, you may
+ *    specify one by passing a desired [Role] with a [Modifier.semantics].
  *
  * @sample androidx.compose.material.samples.ToggleableSurfaceSample
  *
- * To modify these default style values used by text, use [ProvideTextStyle] or explicitly
- * pass a new [TextStyle] to your text.
+ * To modify these default style values used by text, use [ProvideTextStyle] or explicitly pass a
+ * new [TextStyle] to your text.
  *
  * To manually retrieve the content color inside a surface, use [LocalContentColor].
  *
  * @param checked whether or not this Surface is toggled on or off
  * @param onCheckedChange callback to be invoked when the toggleable Surface is clicked
  * @param modifier Modifier to be applied to the layout corresponding to the surface
- * @param enabled Controls the enabled state of the surface. When `false`, this surface will not
- * be selectable
- * @param shape Defines the surface's shape as well its shadow. A shadow is only
- *  displayed if the [elevation] is greater than zero.
+ * @param enabled Controls the enabled state of the surface. When `false`, this surface will not be
+ *   selectable
+ * @param shape Defines the surface's shape as well its shadow. A shadow is only displayed if the
+ *   [elevation] is greater than zero.
  * @param color The background color. Use [Color.Transparent] to have no color.
  * @param contentColor The preferred content color provided by this Surface to its children.
- * Defaults to either the matching content color for [color], or if [color] is not a color from
- * the theme, this will keep the same value set above this Surface.
+ *   Defaults to either the matching content color for [color], or if [color] is not a color from
+ *   the theme, this will keep the same value set above this Surface.
  * @param border Optional border to draw on top of the surface
  * @param elevation The size of the shadow below the surface. Note that It will not affect z index
- * of the Surface. If you want to change the drawing order you can use `Modifier.zIndex`.
+ *   of the Surface. If you want to change the drawing order you can use `Modifier.zIndex`.
  * @param interactionSource an optional hoisted [MutableInteractionSource] for observing and
- * emitting [Interaction]s for this surface. You can use this to change the surface's
- * appearance or preview the surface in different states. Note that if `null` is provided,
- * interactions will still happen internally.
+ *   emitting [Interaction]s for this surface. You can use this to change the surface's appearance
+ *   or preview the surface in different states. Note that if `null` is provided, interactions will
+ *   still happen internally.
  */
 @ExperimentalMaterialApi
 @Composable
@@ -452,25 +430,27 @@
         LocalAbsoluteElevation provides absoluteElevation
     ) {
         Box(
-            modifier = modifier
-                .minimumInteractiveComponentSize()
-                .surface(
-                    shape = shape,
-                    backgroundColor = surfaceColorAtElevation(
-                        color = color,
-                        elevationOverlay = LocalElevationOverlay.current,
-                        absoluteElevation = absoluteElevation
+            modifier =
+                modifier
+                    .minimumInteractiveComponentSize()
+                    .surface(
+                        shape = shape,
+                        backgroundColor =
+                            surfaceColorAtElevation(
+                                color = color,
+                                elevationOverlay = LocalElevationOverlay.current,
+                                absoluteElevation = absoluteElevation
+                            ),
+                        border = border,
+                        elevation = elevation
+                    )
+                    .toggleable(
+                        value = checked,
+                        interactionSource = interactionSource,
+                        indication = rippleOrFallbackImplementation(),
+                        enabled = enabled,
+                        onValueChange = onCheckedChange
                     ),
-                    border = border,
-                    elevation = elevation
-                )
-                .toggleable(
-                    value = checked,
-                    interactionSource = interactionSource,
-                    indication = rippleOrFallbackImplementation(),
-                    enabled = enabled,
-                    onValueChange = onCheckedChange
-                ),
             propagateMinConstraints = true
         ) {
             content()
@@ -483,10 +463,11 @@
     backgroundColor: Color,
     border: BorderStroke?,
     elevation: Dp
-) = this.shadow(elevation, shape, clip = false)
-    .then(if (border != null) Modifier.border(border, shape) else Modifier)
-    .background(color = backgroundColor, shape = shape)
-    .clip(shape)
+) =
+    this.shadow(elevation, shape, clip = false)
+        .then(if (border != null) Modifier.border(border, shape) else Modifier)
+        .background(color = backgroundColor, shape = shape)
+        .clip(shape)
 
 @Composable
 private fun surfaceColorAtElevation(
diff --git a/compose/material/material/src/commonMain/kotlin/androidx/compose/material/SwipeToDismiss.kt b/compose/material/material/src/commonMain/kotlin/androidx/compose/material/SwipeToDismiss.kt
index e4ab162..acd74fe 100644
--- a/compose/material/material/src/commonMain/kotlin/androidx/compose/material/SwipeToDismiss.kt
+++ b/compose/material/material/src/commonMain/kotlin/androidx/compose/material/SwipeToDismiss.kt
@@ -42,38 +42,24 @@
 import kotlin.math.roundToInt
 import kotlinx.coroutines.CancellationException
 
-/**
- * The directions in which a [SwipeToDismiss] can be dismissed.
- */
+/** The directions in which a [SwipeToDismiss] can be dismissed. */
 enum class DismissDirection {
-    /**
-     * Can be dismissed by swiping in the reading direction.
-     */
+    /** Can be dismissed by swiping in the reading direction. */
     StartToEnd,
 
-    /**
-     * Can be dismissed by swiping in the reverse of the reading direction.
-     */
+    /** Can be dismissed by swiping in the reverse of the reading direction. */
     EndToStart
 }
 
-/**
- * Possible values of [DismissState].
- */
+/** Possible values of [DismissState]. */
 enum class DismissValue {
-    /**
-     * Indicates the component has not been dismissed yet.
-     */
+    /** Indicates the component has not been dismissed yet. */
     Default,
 
-    /**
-     * Indicates the component has been dismissed in the reading direction.
-     */
+    /** Indicates the component has been dismissed in the reading direction. */
     DismissedToEnd,
 
-    /**
-     * Indicates the component has been dismissed in the reverse of the reading direction.
-     */
+    /** Indicates the component has been dismissed in the reverse of the reading direction. */
     DismissedToStart
 }
 
@@ -91,8 +77,8 @@
     /**
      * The direction (if any) in which the composable has been or is being dismissed.
      *
-     * If the composable is settled at the default state, then this will be null. Use this to
-     * change the background of the [SwipeToDismiss] if you want different actions on each side.
+     * If the composable is settled at the default state, then this will be null. Use this to change
+     * the background of the [SwipeToDismiss] if you want different actions on each side.
      */
     val dismissDirection: DismissDirection?
         get() = if (offset.value == 0f) null else if (offset.value > 0f) StartToEnd else EndToStart
@@ -108,8 +94,8 @@
 
     /**
      * Reset the component to the default position with animation and suspend until it if fully
-     * reset or animation has been cancelled. This method will throw [CancellationException] if
-     * the animation is interrupted
+     * reset or animation has been cancelled. This method will throw [CancellationException] if the
+     * animation is interrupted
      *
      * @return the reason the reset animation ended
      */
@@ -127,15 +113,12 @@
     }
 
     companion object {
-        /**
-         * The default [Saver] implementation for [DismissState].
-         */
-        fun Saver(
-            confirmStateChange: (DismissValue) -> Boolean
-        ) = Saver<DismissState, DismissValue>(
-            save = { it.currentValue },
-            restore = { DismissState(it, confirmStateChange) }
-        )
+        /** The default [Saver] implementation for [DismissState]. */
+        fun Saver(confirmStateChange: (DismissValue) -> Boolean) =
+            Saver<DismissState, DismissValue>(
+                save = { it.currentValue },
+                restore = { DismissState(it, confirmStateChange) }
+            )
     }
 }
 
@@ -165,8 +148,8 @@
  * @param modifier Optional [Modifier] for this component.
  * @param directions The set of directions in which the component can be dismissed.
  * @param dismissThresholds The thresholds the item needs to be swiped in order to be dismissed.
- * @param background A composable that is stacked behind the content and is exposed when the
- * content is swiped. You can/should use the [state] to have different backgrounds on each side.
+ * @param background A composable that is stacked behind the content and is exposed when the content
+ *   is swiped. You can/should use the [state] to have different backgrounds on each side.
  * @param dismissContent The content that can be dismissed.
  */
 @Composable
@@ -181,46 +164,45 @@
     },
     background: @Composable RowScope.() -> Unit,
     dismissContent: @Composable RowScope.() -> Unit
-) = BoxWithConstraints(modifier) {
-    val width = constraints.maxWidth.toFloat()
-    val isRtl = LocalLayoutDirection.current == LayoutDirection.Rtl
+) =
+    BoxWithConstraints(modifier) {
+        val width = constraints.maxWidth.toFloat()
+        val isRtl = LocalLayoutDirection.current == LayoutDirection.Rtl
 
-    val anchors = mutableMapOf(0f to Default)
-    if (StartToEnd in directions) anchors += width to DismissedToEnd
-    if (EndToStart in directions) anchors += -width to DismissedToStart
+        val anchors = mutableMapOf(0f to Default)
+        if (StartToEnd in directions) anchors += width to DismissedToEnd
+        if (EndToStart in directions) anchors += -width to DismissedToStart
 
-    val thresholds = { from: DismissValue, to: DismissValue ->
-        dismissThresholds(getDismissDirection(from, to)!!)
-    }
-    val minFactor =
-        if (EndToStart in directions) StandardResistanceFactor else StiffResistanceFactor
-    val maxFactor =
-        if (StartToEnd in directions) StandardResistanceFactor else StiffResistanceFactor
-    Box(
-        Modifier.swipeable(
-            state = state,
-            anchors = anchors,
-            thresholds = thresholds,
-            orientation = Orientation.Horizontal,
-            enabled = state.currentValue == Default,
-            reverseDirection = isRtl,
-            resistance = ResistanceConfig(
-                basis = width,
-                factorAtMin = minFactor,
-                factorAtMax = maxFactor
+        val thresholds = { from: DismissValue, to: DismissValue ->
+            dismissThresholds(getDismissDirection(from, to)!!)
+        }
+        val minFactor =
+            if (EndToStart in directions) StandardResistanceFactor else StiffResistanceFactor
+        val maxFactor =
+            if (StartToEnd in directions) StandardResistanceFactor else StiffResistanceFactor
+        Box(
+            Modifier.swipeable(
+                state = state,
+                anchors = anchors,
+                thresholds = thresholds,
+                orientation = Orientation.Horizontal,
+                enabled = state.currentValue == Default,
+                reverseDirection = isRtl,
+                resistance =
+                    ResistanceConfig(
+                        basis = width,
+                        factorAtMin = minFactor,
+                        factorAtMax = maxFactor
+                    )
             )
-        )
-    ) {
-        Row(
-            content = background,
-            modifier = Modifier.matchParentSize()
-        )
-        Row(
-            content = dismissContent,
-            modifier = Modifier.offset { IntOffset(state.offset.value.roundToInt(), 0) }
-        )
+        ) {
+            Row(content = background, modifier = Modifier.matchParentSize())
+            Row(
+                content = dismissContent,
+                modifier = Modifier.offset { IntOffset(state.offset.value.roundToInt(), 0) }
+            )
+        }
     }
-}
 
 private fun getDismissDirection(from: DismissValue, to: DismissValue): DismissDirection? {
     return when {
diff --git a/compose/material/material/src/commonMain/kotlin/androidx/compose/material/Swipeable.kt b/compose/material/material/src/commonMain/kotlin/androidx/compose/material/Swipeable.kt
index c98d89b..6891439 100644
--- a/compose/material/material/src/commonMain/kotlin/androidx/compose/material/Swipeable.kt
+++ b/compose/material/material/src/commonMain/kotlin/androidx/compose/material/Swipeable.kt
@@ -71,8 +71,8 @@
 /**
  * State of the [swipeable] modifier.
  *
- * This contains necessary information about any ongoing swipe or animation and provides methods
- * to change the state either immediately or by starting an animation. To create and remember a
+ * This contains necessary information about any ongoing swipe or animation and provides methods to
+ * change the state either immediately or by starting an animation. To create and remember a
  * [SwipeableState] with the default animation clock, use [rememberSwipeableState].
  *
  * @param initialValue The initial value of the state.
@@ -97,24 +97,22 @@
     var currentValue: T by mutableStateOf(initialValue)
         private set
 
-    /**
-     * Whether the state is currently animating.
-     */
+    /** Whether the state is currently animating. */
     var isAnimationRunning: Boolean by mutableStateOf(false)
         private set
 
     /**
      * The current position (in pixels) of the [swipeable].
      *
-     * You should use this state to offset your content accordingly. The recommended way is to
-     * use `Modifier.offsetPx`. This includes the resistance by default, if resistance is enabled.
+     * You should use this state to offset your content accordingly. The recommended way is to use
+     * `Modifier.offsetPx`. This includes the resistance by default, if resistance is enabled.
      */
-    val offset: State<Float> get() = offsetState
+    val offset: State<Float>
+        get() = offsetState
 
-    /**
-     * The amount by which the [swipeable] has been swiped past its bounds.
-     */
-    val overflow: State<Float> get() = overflowState
+    /** The amount by which the [swipeable] has been swiped past its bounds. */
+    val overflow: State<Float>
+        get() = overflowState
 
     // Use `Float.NaN` as a placeholder while the state is uninitialised.
     private val offsetState = mutableFloatStateOf(0f)
@@ -130,9 +128,7 @@
     internal var anchors by mutableStateOf(emptyMap<Float, T>())
 
     private val latestNonEmptyAnchorsFlow: Flow<Map<Float, T>> =
-        snapshotFlow { anchors }
-            .filter { it.isNotEmpty() }
-            .take(1)
+        snapshotFlow { anchors }.filter { it.isNotEmpty() }.take(1)
 
     internal var minBound = Float.NEGATIVE_INFINITY
     internal var maxBound = Float.POSITIVE_INFINITY
@@ -141,27 +137,20 @@
         if (anchors.isEmpty()) {
             // need to do initial synchronization synchronously :(
             val initialOffset = newAnchors.getOffset(currentValue)
-            requireNotNull(initialOffset) {
-                "The initial value must have an associated anchor."
-            }
+            requireNotNull(initialOffset) { "The initial value must have an associated anchor." }
             offsetState.floatValue = initialOffset
             absoluteOffset.floatValue = initialOffset
         }
     }
 
-    internal suspend fun processNewAnchors(
-        oldAnchors: Map<Float, T>,
-        newAnchors: Map<Float, T>
-    ) {
+    internal suspend fun processNewAnchors(oldAnchors: Map<Float, T>, newAnchors: Map<Float, T>) {
         if (oldAnchors.isEmpty()) {
             // If this is the first time that we receive anchors, then we need to initialise
             // the state so we snap to the offset associated to the initial value.
             minBound = newAnchors.keys.minOrNull()!!
             maxBound = newAnchors.keys.maxOrNull()!!
             val initialOffset = newAnchors.getOffset(currentValue)
-            requireNotNull(initialOffset) {
-                "The initial value must have an associated anchor."
-            }
+            requireNotNull(initialOffset) { "The initial value must have an associated anchor." }
             snapInternalToOffset(initialOffset)
         } else if (newAnchors != oldAnchors) {
             // If we have received new anchors, then the offset of the current value might
@@ -172,19 +161,20 @@
             maxBound = Float.POSITIVE_INFINITY
             val animationTargetValue = animationTarget.value
             // if we're in the animation already, let's find it a new home
-            val targetOffset = if (animationTargetValue != null) {
-                // first, try to map old state to the new state
-                val oldState = oldAnchors[animationTargetValue]
-                val newState = newAnchors.getOffset(oldState)
-                // return new state if exists, or find the closes one among new anchors
-                newState ?: newAnchors.keys.minByOrNull { abs(it - animationTargetValue) }!!
-            } else {
-                // we're not animating, proceed by finding the new anchors for an old value
-                val actualOldValue = oldAnchors[offset.value]
-                val value = if (actualOldValue == currentValue) currentValue else actualOldValue
-                newAnchors.getOffset(value) ?: newAnchors
-                    .keys.minByOrNull { abs(it - offset.value) }!!
-            }
+            val targetOffset =
+                if (animationTargetValue != null) {
+                    // first, try to map old state to the new state
+                    val oldState = oldAnchors[animationTargetValue]
+                    val newState = newAnchors.getOffset(oldState)
+                    // return new state if exists, or find the closes one among new anchors
+                    newState ?: newAnchors.keys.minByOrNull { abs(it - animationTargetValue) }!!
+                } else {
+                    // we're not animating, proceed by finding the new anchors for an old value
+                    val actualOldValue = oldAnchors[offset.value]
+                    val value = if (actualOldValue == currentValue) currentValue else actualOldValue
+                    newAnchors.getOffset(value)
+                        ?: newAnchors.keys.minByOrNull { abs(it - offset.value) }!!
+                }
             try {
                 animateInternalToOffset(targetOffset, animationSpec)
             } catch (c: CancellationException) {
@@ -215,9 +205,7 @@
     }
 
     private suspend fun snapInternalToOffset(target: Float) {
-        draggableState.drag {
-            dragBy(target - absoluteOffset.floatValue)
-        }
+        draggableState.drag { dragBy(target - absoluteOffset.floatValue) }
     }
 
     private suspend fun animateInternalToOffset(target: Float, spec: AnimationSpec<Float>) {
@@ -248,14 +236,16 @@
     val targetValue: T
         get() {
             // TODO(calintat): Track current velocity (b/149549482) and use that here.
-            val target = animationTarget.value ?: computeTarget(
-                offset = offset.value,
-                lastValue = anchors.getOffset(currentValue) ?: offset.value,
-                anchors = anchors.keys,
-                thresholds = thresholds,
-                velocity = 0f,
-                velocityThreshold = Float.POSITIVE_INFINITY
-            )
+            val target =
+                animationTarget.value
+                    ?: computeTarget(
+                        offset = offset.value,
+                        lastValue = anchors.getOffset(currentValue) ?: offset.value,
+                        anchors = anchors.keys,
+                        thresholds = thresholds,
+                        velocity = 0f,
+                        velocityThreshold = Float.POSITIVE_INFINITY
+                    )
             return anchors[target] ?: currentValue
         }
 
@@ -316,9 +306,7 @@
     suspend fun snapTo(targetValue: T) {
         latestNonEmptyAnchorsFlow.collect { anchors ->
             val targetOffset = anchors.getOffset(targetValue)
-            requireNotNull(targetOffset) {
-                "The target value must have an associated anchor."
-            }
+            requireNotNull(targetOffset) { "The target value must have an associated anchor." }
             snapInternalToOffset(targetOffset)
             currentValue = targetValue
         }
@@ -335,16 +323,17 @@
         latestNonEmptyAnchorsFlow.collect { anchors ->
             try {
                 val targetOffset = anchors.getOffset(targetValue)
-                requireNotNull(targetOffset) {
-                    "The target value must have an associated anchor."
-                }
+                requireNotNull(targetOffset) { "The target value must have an associated anchor." }
                 animateInternalToOffset(targetOffset, anim)
             } finally {
                 val endOffset = absoluteOffset.floatValue
-                val endValue = anchors
-                    // fighting rounding error once again, anchor should be as close as 0.5 pixels
-                    .filterKeys { anchorOffset -> abs(anchorOffset - endOffset) < 0.5f }
-                    .values.firstOrNull() ?: currentValue
+                val endValue =
+                    anchors
+                        // fighting rounding error once again, anchor should be as close as 0.5
+                        // pixels
+                        .filterKeys { anchorOffset -> abs(anchorOffset - endOffset) < 0.5f }
+                        .values
+                        .firstOrNull() ?: currentValue
                 currentValue = endValue
             }
         }
@@ -355,25 +344,25 @@
      * [velocity]. Fling with settling [swipeable] will always consume all the velocity provided
      * since it will settle at the anchor.
      *
-     * In general cases, [swipeable] flings by itself when being swiped. This method is to be
-     * used for nested scroll logic that wraps the [swipeable]. In nested scroll developer may
-     * want to trigger settling fling when the child scroll container reaches the bound.
+     * In general cases, [swipeable] flings by itself when being swiped. This method is to be used
+     * for nested scroll logic that wraps the [swipeable]. In nested scroll developer may want to
+     * trigger settling fling when the child scroll container reaches the bound.
      *
      * @param velocity velocity to fling and settle with
-     *
      * @return the reason fling ended
      */
     suspend fun performFling(velocity: Float) {
         latestNonEmptyAnchorsFlow.collect { anchors ->
             val lastAnchor = anchors.getOffset(currentValue)!!
-            val targetValue = computeTarget(
-                offset = offset.value,
-                lastValue = lastAnchor,
-                anchors = anchors.keys,
-                thresholds = thresholds,
-                velocity = velocity,
-                velocityThreshold = velocityThreshold
-            )
+            val targetValue =
+                computeTarget(
+                    offset = offset.value,
+                    lastValue = lastAnchor,
+                    anchors = anchors.keys,
+                    thresholds = thresholds,
+                    velocity = velocity,
+                    velocityThreshold = velocityThreshold
+                )
             val targetState = anchors[targetValue]
             if (targetState != null && confirmStateChange(targetState)) animateTo(targetState)
             // If the user vetoed the state change, rollback to the previous state.
@@ -386,15 +375,14 @@
      * gesture flow.
      *
      * Note: This method performs generic drag and it won't settle to any particular anchor, *
-     * leaving swipeable in between anchors. When done dragging, [performFling] must be
-     * called as well to ensure swipeable will settle at the anchor.
+     * leaving swipeable in between anchors. When done dragging, [performFling] must be called as
+     * well to ensure swipeable will settle at the anchor.
      *
-     * In general cases, [swipeable] drags by itself when being swiped. This method is to be
-     * used for nested scroll logic that wraps the [swipeable]. In nested scroll developer may
-     * want to force drag when the child scroll container reaches the bound.
+     * In general cases, [swipeable] drags by itself when being swiped. This method is to be used
+     * for nested scroll logic that wraps the [swipeable]. In nested scroll developer may want to
+     * force drag when the child scroll container reaches the bound.
      *
      * @param delta delta in pixels to drag by
-     *
      * @return the amount of [delta] consumed
      */
     fun performDrag(delta: Float): Float {
@@ -408,16 +396,15 @@
     }
 
     companion object {
-        /**
-         * The default [Saver] implementation for [SwipeableState].
-         */
+        /** The default [Saver] implementation for [SwipeableState]. */
         fun <T : Any> Saver(
             animationSpec: AnimationSpec<Float>,
             confirmStateChange: (T) -> Boolean
-        ) = Saver<SwipeableState<T>, T>(
-            save = { it.currentValue },
-            restore = { SwipeableState(it, animationSpec, confirmStateChange) }
-        )
+        ) =
+            Saver<SwipeableState<T>, T>(
+                save = { it.currentValue },
+                restore = { SwipeableState(it, animationSpec, confirmStateChange) }
+            )
     }
 }
 
@@ -428,8 +415,8 @@
  *
  * @param from The state corresponding to the anchor we are moving away from.
  * @param to The state corresponding to the anchor we are moving towards.
- * @param fraction The fraction that the current position represents between [from] and [to].
- * Must be between `0` and `1`.
+ * @param fraction The fraction that the current position represents between [from] and [to]. Must
+ *   be between `0` and `1`.
  */
 @Immutable
 @ExperimentalMaterialApi
@@ -479,10 +466,11 @@
     confirmStateChange: (newValue: T) -> Boolean = { true }
 ): SwipeableState<T> {
     return rememberSaveable(
-        saver = SwipeableState.Saver(
-            animationSpec = animationSpec,
-            confirmStateChange = confirmStateChange
-        )
+        saver =
+            SwipeableState.Saver(
+                animationSpec = animationSpec,
+                confirmStateChange = confirmStateChange
+            )
     ) {
         SwipeableState(
             initialValue = initialValue,
@@ -494,11 +482,11 @@
 
 /**
  * Create and [remember] a [SwipeableState] which is kept in sync with another state, i.e.:
- *  1. Whenever the [value] changes, the [SwipeableState] will be animated to that new value.
- *  2. Whenever the value of the [SwipeableState] changes (e.g. after a swipe), the owner of the
- *  [value] will be notified to update their state to the new value of the [SwipeableState] by
- *  invoking [onValueChange]. If the owner does not update their state to the provided value for
- *  some reason, then the [SwipeableState] will perform a rollback to the previous, correct value.
+ * 1. Whenever the [value] changes, the [SwipeableState] will be animated to that new value.
+ * 2. Whenever the value of the [SwipeableState] changes (e.g. after a swipe), the owner of the
+ *    [value] will be notified to update their state to the new value of the [SwipeableState] by
+ *    invoking [onValueChange]. If the owner does not update their state to the provided value for
+ *    some reason, then the [SwipeableState] will perform a rollback to the previous, correct value.
  */
 @Composable
 @ExperimentalMaterialApi
@@ -526,7 +514,7 @@
             onValueChange(swipeableState.currentValue)
             forceAnimationCheck.value = !forceAnimationCheck.value
         }
-        onDispose { }
+        onDispose {}
     }
     return swipeableState
 }
@@ -534,14 +522,14 @@
 /**
  * Enable swipe gestures between a set of predefined states.
  *
- * To use this, you must provide a map of anchors (in pixels) to states (of type [T]).
- * Note that this map cannot be empty and cannot have two anchors mapped to the same state.
+ * To use this, you must provide a map of anchors (in pixels) to states (of type [T]). Note that
+ * this map cannot be empty and cannot have two anchors mapped to the same state.
  *
  * When a swipe is detected, the offset of the [SwipeableState] will be updated with the swipe
  * delta. You should use this offset to move your content accordingly (see `Modifier.offsetPx`).
  * When the swipe ends, the offset will be animated to one of the anchors and when that anchor is
- * reached, the value of the [SwipeableState] will also be updated to the state corresponding to
- * the new anchor. The target anchor is calculated based on the provided positional [thresholds].
+ * reached, the value of the [SwipeableState] will also be updated to the state corresponding to the
+ * new anchor. The target anchor is calculated based on the provided positional [thresholds].
  *
  * Swiping is constrained between the minimum and maximum anchors. If the user attempts to swipe
  * past these bounds, a resistance effect will be applied by default. The amount of resistance at
@@ -555,18 +543,18 @@
  * @param state The state of the [swipeable].
  * @param anchors Pairs of anchors and states, used to map anchors to states and vice versa.
  * @param thresholds Specifies where the thresholds between the states are. The thresholds will be
- * used to determine which state to animate to when swiping stops. This is represented as a lambda
- * that takes two states and returns the threshold between them in the form of a [ThresholdConfig].
- * Note that the order of the states corresponds to the swipe direction.
+ *   used to determine which state to animate to when swiping stops. This is represented as a lambda
+ *   that takes two states and returns the threshold between them in the form of a
+ *   [ThresholdConfig]. Note that the order of the states corresponds to the swipe direction.
  * @param orientation The orientation in which the [swipeable] can be swiped.
  * @param enabled Whether this [swipeable] is enabled and should react to the user's input.
- * @param reverseDirection Whether to reverse the direction of the swipe, so a top to bottom
- * swipe will behave like bottom to top, and a left to right swipe will behave like right to left.
- * @param interactionSource Optional [MutableInteractionSource] that will passed on to
- * the internal [Modifier.draggable].
+ * @param reverseDirection Whether to reverse the direction of the swipe, so a top to bottom swipe
+ *   will behave like bottom to top, and a left to right swipe will behave like right to left.
+ * @param interactionSource Optional [MutableInteractionSource] that will passed on to the internal
+ *   [Modifier.draggable].
  * @param resistance Controls how much resistance will be applied when swiping past the bounds.
- * @param velocityThreshold The threshold (in dp per second) that the end velocity has to exceed
- * in order to animate to the next state, even if the positional [thresholds] have not been reached.
+ * @param velocityThreshold The threshold (in dp per second) that the end velocity has to exceed in
+ *   order to animate to the next state, even if the positional [thresholds] have not been reached.
  */
 @ExperimentalMaterialApi
 @Deprecated(SwipeableDeprecation)
@@ -580,53 +568,51 @@
     thresholds: (from: T, to: T) -> ThresholdConfig = { _, _ -> FixedThreshold(56.dp) },
     resistance: ResistanceConfig? = resistanceConfig(anchors.keys),
     velocityThreshold: Dp = VelocityThreshold
-) = composed(
-    inspectorInfo = debugInspectorInfo {
-        name = "swipeable"
-        properties["state"] = state
-        properties["anchors"] = anchors
-        properties["orientation"] = orientation
-        properties["enabled"] = enabled
-        properties["reverseDirection"] = reverseDirection
-        properties["interactionSource"] = interactionSource
-        properties["thresholds"] = thresholds
-        properties["resistance"] = resistance
-        properties["velocityThreshold"] = velocityThreshold
-    }
-) {
-    require(anchors.isNotEmpty()) {
-        "You must have at least one anchor."
-    }
-    require(anchors.values.distinct().count() == anchors.size) {
-        "You cannot have two anchors mapped to the same state."
-    }
-    val density = LocalDensity.current
-    state.ensureInit(anchors)
-    LaunchedEffect(anchors, state) {
-        val oldAnchors = state.anchors
-        state.anchors = anchors
-        state.resistance = resistance
-        state.thresholds = { a, b ->
-            val from = anchors.getValue(a)
-            val to = anchors.getValue(b)
-            with(thresholds(from, to)) { density.computeThreshold(a, b) }
+) =
+    composed(
+        inspectorInfo =
+            debugInspectorInfo {
+                name = "swipeable"
+                properties["state"] = state
+                properties["anchors"] = anchors
+                properties["orientation"] = orientation
+                properties["enabled"] = enabled
+                properties["reverseDirection"] = reverseDirection
+                properties["interactionSource"] = interactionSource
+                properties["thresholds"] = thresholds
+                properties["resistance"] = resistance
+                properties["velocityThreshold"] = velocityThreshold
+            }
+    ) {
+        require(anchors.isNotEmpty()) { "You must have at least one anchor." }
+        require(anchors.values.distinct().count() == anchors.size) {
+            "You cannot have two anchors mapped to the same state."
         }
-        with(density) {
-            state.velocityThreshold = velocityThreshold.toPx()
+        val density = LocalDensity.current
+        state.ensureInit(anchors)
+        LaunchedEffect(anchors, state) {
+            val oldAnchors = state.anchors
+            state.anchors = anchors
+            state.resistance = resistance
+            state.thresholds = { a, b ->
+                val from = anchors.getValue(a)
+                val to = anchors.getValue(b)
+                with(thresholds(from, to)) { density.computeThreshold(a, b) }
+            }
+            with(density) { state.velocityThreshold = velocityThreshold.toPx() }
+            state.processNewAnchors(oldAnchors, anchors)
         }
-        state.processNewAnchors(oldAnchors, anchors)
-    }
 
-    Modifier.draggable(
-        orientation = orientation,
-        enabled = enabled,
-        reverseDirection = reverseDirection,
-        interactionSource = interactionSource,
-        startDragImmediately = state.isAnimationRunning,
-        onDragStopped = { velocity -> launch { state.performFling(velocity) } },
-        state = state.draggableState
-    )
-}
+        Modifier.draggable(
+            orientation = orientation,
+            enabled = enabled,
+            reverseDirection = reverseDirection,
+            interactionSource = interactionSource,
+            startDragImmediately = state.isAnimationRunning,
+            onDragStopped = { velocity -> launch { state.performFling(velocity) } },
+            state = state.draggableState
+        )
+    }
 
 /**
  * Interface to compute a threshold between two anchors/states in a [swipeable].
@@ -637,9 +623,7 @@
 @ExperimentalMaterialApi
 @Deprecated(SwipeableDeprecation)
 interface ThresholdConfig {
-    /**
-     * Compute the value of the threshold (in pixels), once the values of the anchors are known.
-     */
+    /** Compute the value of the threshold (in pixels), once the values of the anchors are known. */
     fun Density.computeThreshold(fromValue: Float, toValue: Float): Float
 }
 
@@ -678,23 +662,23 @@
  * Specifies how resistance is calculated in [swipeable].
  *
  * There are two things needed to calculate resistance: the resistance basis determines how much
- * overflow will be consumed to achieve maximum resistance, and the resistance factor determines
- * the amount of resistance (the larger the resistance factor, the stronger the resistance).
+ * overflow will be consumed to achieve maximum resistance, and the resistance factor determines the
+ * amount of resistance (the larger the resistance factor, the stronger the resistance).
  *
- * The resistance basis is usually either the size of the component which [swipeable] is applied
- * to, or the distance between the minimum and maximum anchors. For a constructor in which the
+ * The resistance basis is usually either the size of the component which [swipeable] is applied to,
+ * or the distance between the minimum and maximum anchors. For a constructor in which the
  * resistance basis defaults to the latter, consider using [resistanceConfig].
  *
  * You may specify different resistance factors for each bound. Consider using one of the default
- * resistance factors in [SwipeableDefaults]: `StandardResistanceFactor` to convey that the user
- * has run out of things to see, and `StiffResistanceFactor` to convey that the user cannot swipe
- * this right now. Also, you can set either factor to 0 to disable resistance at that bound.
+ * resistance factors in [SwipeableDefaults]: `StandardResistanceFactor` to convey that the user has
+ * run out of things to see, and `StiffResistanceFactor` to convey that the user cannot swipe this
+ * right now. Also, you can set either factor to 0 to disable resistance at that bound.
  *
  * @param basis Specifies the maximum amount of overflow that will be consumed. Must be positive.
- * @param factorAtMin The factor by which to scale the resistance at the minimum bound.
- * Must not be negative.
- * @param factorAtMax The factor by which to scale the resistance at the maximum bound.
- * Must not be negative.
+ * @param factorAtMin The factor by which to scale the resistance at the minimum bound. Must not be
+ *   negative.
+ * @param factorAtMax The factor by which to scale the resistance at the maximum bound. Must not be
+ *   negative.
  */
 @Immutable
 @Deprecated(SwipeableDeprecation)
@@ -737,18 +721,15 @@
 }
 
 /**
- *  Given an offset x and a set of anchors, return a list of anchors:
- *   1. [ ] if the set of anchors is empty,
- *   2. [ x' ] if x is equal to one of the anchors, accounting for a small rounding error, where x'
- *      is x rounded to the exact value of the matching anchor,
- *   3. [ min ] if min is the minimum anchor and x < min,
- *   4. [ max ] if max is the maximum anchor and x > max, or
- *   5. [ a , b ] if a and b are anchors such that a < x < b and b - a is minimal.
+ * Given an offset x and a set of anchors, return a list of anchors:
+ * 1. [ ] if the set of anchors is empty,
+ * 2. [ x' ] if x is equal to one of the anchors, accounting for a small rounding error, where x' is
+ *    x rounded to the exact value of the matching anchor,
+ * 3. [ min ] if min is the minimum anchor and x < min,
+ * 4. [ max ] if max is the maximum anchor and x > max, or
+ * 5. [ a , b ] if a and b are anchors such that a < x < b and b - a is minimal.
  */
-private fun findBounds(
-    offset: Float,
-    anchors: Set<Float>
-): List<Float> {
+private fun findBounds(offset: Float, anchors: Set<Float>): List<Float> {
     // Find the anchors the target lies between with a little bit of rounding error.
     val a = anchors.filter { it <= offset + 0.001 }.fastMaxBy { it }
     val b = anchors.filter { it >= offset - 0.001 }.fastMinByOrNull { it }
@@ -811,36 +792,26 @@
     return entries.firstOrNull { it.value == state }?.key
 }
 
-/**
- * Contains useful defaults for [swipeable] and [SwipeableState].
- */
+/** Contains useful defaults for [swipeable] and [SwipeableState]. */
 @Deprecated(SwipeableDeprecation)
 object SwipeableDefaults {
-    /**
-     * The default animation used by [SwipeableState].
-     */
+    /** The default animation used by [SwipeableState]. */
     val AnimationSpec = SpringSpec<Float>()
 
-    /**
-     * The default velocity threshold (1.8 dp per millisecond) used by [swipeable].
-     */
+    /** The default velocity threshold (1.8 dp per millisecond) used by [swipeable]. */
     val VelocityThreshold = 125.dp
 
-    /**
-     * A stiff resistance factor which indicates that swiping isn't available right now.
-     */
+    /** A stiff resistance factor which indicates that swiping isn't available right now. */
     const val StiffResistanceFactor = 20f
 
-    /**
-     * A standard resistance factor which indicates that the user has run out of things to see.
-     */
+    /** A standard resistance factor which indicates that the user has run out of things to see. */
     const val StandardResistanceFactor = 10f
 
     /**
      * The default resistance config used by [swipeable].
      *
-     * This returns `null` if there is one anchor. If there are at least two anchors, it returns
-     * a [ResistanceConfig] with the resistance basis equal to the distance between the two bounds.
+     * This returns `null` if there is one anchor. If there are at least two anchors, it returns a
+     * [ResistanceConfig] with the resistance basis equal to the distance between the two bounds.
      */
     fun resistanceConfig(
         anchors: Set<Float>,
@@ -860,49 +831,51 @@
 // revisit in b/174756744 as all types will have their own specific connection probably
 @ExperimentalMaterialApi
 internal val <T> SwipeableState<T>.PreUpPostDownNestedScrollConnection: NestedScrollConnection
-    get() = object : NestedScrollConnection {
-        override fun onPreScroll(available: Offset, source: NestedScrollSource): Offset {
-            val delta = available.toFloat()
-            return if (delta < 0 && source == NestedScrollSource.UserInput) {
-                performDrag(delta).toOffset()
-            } else {
-                Offset.Zero
+    get() =
+        object : NestedScrollConnection {
+            override fun onPreScroll(available: Offset, source: NestedScrollSource): Offset {
+                val delta = available.toFloat()
+                return if (delta < 0 && source == NestedScrollSource.UserInput) {
+                    performDrag(delta).toOffset()
+                } else {
+                    Offset.Zero
+                }
             }
-        }
 
-        override fun onPostScroll(
-            consumed: Offset,
-            available: Offset,
-            source: NestedScrollSource
-        ): Offset {
-            return if (source == NestedScrollSource.UserInput) {
-                performDrag(available.toFloat()).toOffset()
-            } else {
-                Offset.Zero
+            override fun onPostScroll(
+                consumed: Offset,
+                available: Offset,
+                source: NestedScrollSource
+            ): Offset {
+                return if (source == NestedScrollSource.UserInput) {
+                    performDrag(available.toFloat()).toOffset()
+                } else {
+                    Offset.Zero
+                }
             }
-        }
 
-        override suspend fun onPreFling(available: Velocity): Velocity {
-            val toFling = Offset(available.x, available.y).toFloat()
-            return if (toFling < 0 && offset.value > minBound) {
-                performFling(velocity = toFling)
-                // since we go to the anchor with tween settling, consume all for the best UX
-                available
-            } else {
-                Velocity.Zero
+            override suspend fun onPreFling(available: Velocity): Velocity {
+                val toFling = Offset(available.x, available.y).toFloat()
+                return if (toFling < 0 && offset.value > minBound) {
+                    performFling(velocity = toFling)
+                    // since we go to the anchor with tween settling, consume all for the best UX
+                    available
+                } else {
+                    Velocity.Zero
+                }
             }
+
+            override suspend fun onPostFling(consumed: Velocity, available: Velocity): Velocity {
+                performFling(velocity = Offset(available.x, available.y).toFloat())
+                return available
+            }
+
+            private fun Float.toOffset(): Offset = Offset(0f, this)
+
+            private fun Offset.toFloat(): Float = this.y
         }
 
-        override suspend fun onPostFling(consumed: Velocity, available: Velocity): Velocity {
-            performFling(velocity = Offset(available.x, available.y).toFloat())
-            return available
-        }
-
-        private fun Float.toOffset(): Offset = Offset(0f, this)
-
-        private fun Offset.toFloat(): Float = this.y
-    }
-
-private const val SwipeableDeprecation = "Material's Swipeable has been replaced by Foundation's " +
-    "AnchoredDraggable APIs. Please see developer.android.com for an overview of the changes and " +
-    "a migration guide."
+private const val SwipeableDeprecation =
+    "Material's Swipeable has been replaced by Foundation's " +
+        "AnchoredDraggable APIs. Please see developer.android.com for an overview of the changes and " +
+        "a migration guide."
diff --git a/compose/material/material/src/commonMain/kotlin/androidx/compose/material/Switch.kt b/compose/material/material/src/commonMain/kotlin/androidx/compose/material/Switch.kt
index 9a6d49f..518c3d5 100644
--- a/compose/material/material/src/commonMain/kotlin/androidx/compose/material/Switch.kt
+++ b/compose/material/material/src/commonMain/kotlin/androidx/compose/material/Switch.kt
@@ -67,26 +67,28 @@
 import kotlinx.coroutines.flow.collectLatest
 
 /**
- * <a href="https://material.io/components/switches" class="external" target="_blank">Material Design switch</a>.
+ * <a href="https://material.io/components/switches" class="external" target="_blank">Material
+ * Design switch</a>.
  *
  * Switches toggle the state of a single item on or off.
  *
- * ![Switches image](https://developer.android.com/images/reference/androidx/compose/material/switches.png)
+ * ![Switches
+ * image](https://developer.android.com/images/reference/androidx/compose/material/switches.png)
  *
  * @sample androidx.compose.material.samples.SwitchSample
  *
  * @param checked whether or not this component is checked
- * @param onCheckedChange callback to be invoked when Switch is being clicked,
- * therefore the change of checked state is requested.  If null, then this is passive
- * and relies entirely on a higher-level component to control the "checked" state.
+ * @param onCheckedChange callback to be invoked when Switch is being clicked, therefore the change
+ *   of checked state is requested. If null, then this is passive and relies entirely on a
+ *   higher-level component to control the "checked" state.
  * @param modifier Modifier to be applied to the switch layout
  * @param enabled whether the component is enabled or grayed out
  * @param interactionSource an optional hoisted [MutableInteractionSource] for observing and
- * emitting [Interaction]s for this switch. You can use this to change the switch's
- * appearance or preview the switch in different states. Note that if `null` is provided,
- * interactions will still happen internally.
- * @param colors [SwitchColors] that will be used to determine the color of the thumb and track
- * in different states. See [SwitchDefaults.colors].
+ *   emitting [Interaction]s for this switch. You can use this to change the switch's appearance or
+ *   preview the switch in different states. Note that if `null` is provided, interactions will
+ *   still happen internally.
+ * @param colors [SwitchColors] that will be used to determine the color of the thumb and track in
+ *   different states. See [SwitchDefaults.colors].
  */
 @Composable
 @OptIn(ExperimentalMaterialApi::class)
@@ -108,18 +110,20 @@
     // a new checked value.
     var forceAnimationCheck by remember { mutableStateOf(false) }
     val switchVelocityThresholdPx = with(LocalDensity.current) { SwitchVelocityThreshold.toPx() }
-    val anchoredDraggableState = remember(maxBound, switchVelocityThresholdPx) {
-        AnchoredDraggableState(
-            initialValue = checked,
-            animationSpec = AnimationSpec,
-            anchors = DraggableAnchors {
-                false at minBound
-                true at maxBound
-            },
-            positionalThreshold = { distance -> distance * SwitchPositionalThreshold },
-            velocityThreshold = { switchVelocityThresholdPx }
-        )
-    }
+    val anchoredDraggableState =
+        remember(maxBound, switchVelocityThresholdPx) {
+            AnchoredDraggableState(
+                initialValue = checked,
+                animationSpec = AnimationSpec,
+                anchors =
+                    DraggableAnchors {
+                        false at minBound
+                        true at maxBound
+                    },
+                positionalThreshold = { distance -> distance * SwitchPositionalThreshold },
+                velocityThreshold = { switchVelocityThresholdPx }
+            )
+        }
     val currentOnCheckedChange by rememberUpdatedState(onCheckedChange)
     val currentChecked by rememberUpdatedState(checked)
     LaunchedEffect(anchoredDraggableState) {
@@ -186,8 +190,7 @@
 /**
  * Represents the colors used by a [Switch] in different states
  *
- * See [SwitchDefaults.colors] for the default implementation that follows Material
- * specifications.
+ * See [SwitchDefaults.colors] for the default implementation that follows Material specifications.
  */
 @Stable
 interface SwitchColors {
@@ -198,8 +201,7 @@
      * @param enabled whether the [Switch] is enabled or not
      * @param checked whether the [Switch] is checked or not
      */
-    @Composable
-    fun thumbColor(enabled: Boolean, checked: Boolean): State<Color>
+    @Composable fun thumbColor(enabled: Boolean, checked: Boolean): State<Color>
 
     /**
      * Represents the color used for the switch's track, depending on [enabled] and [checked].
@@ -207,8 +209,7 @@
      * @param enabled whether the [Switch] is enabled or not
      * @param checked whether the [Switch] is checked or not
      */
-    @Composable
-    fun trackColor(enabled: Boolean, checked: Boolean): State<Color>
+    @Composable fun trackColor(enabled: Boolean, checked: Boolean): State<Color>
 }
 
 @Composable
@@ -235,38 +236,34 @@
     }
 
     val hasInteraction = interactions.isNotEmpty()
-    val elevation = if (hasInteraction) {
-        ThumbPressedElevation
-    } else {
-        ThumbDefaultElevation
-    }
+    val elevation =
+        if (hasInteraction) {
+            ThumbPressedElevation
+        } else {
+            ThumbDefaultElevation
+        }
     val trackColor by colors.trackColor(enabled, checked)
-    Canvas(
-        Modifier
-            .align(Alignment.Center)
-            .fillMaxSize()) {
+    Canvas(Modifier.align(Alignment.Center).fillMaxSize()) {
         drawTrack(trackColor, TrackWidth.toPx(), TrackStrokeWidth.toPx())
     }
     val thumbColor by colors.thumbColor(enabled, checked)
     val elevationOverlay = LocalElevationOverlay.current
     val absoluteElevation = LocalAbsoluteElevation.current + elevation
-    val resolvedThumbColor by animateColorAsState(
-        if (thumbColor == MaterialTheme.colors.surface && elevationOverlay != null) {
-            elevationOverlay.apply(thumbColor, absoluteElevation)
-        } else {
-            thumbColor
-        }
-    )
+    val resolvedThumbColor by
+        animateColorAsState(
+            if (thumbColor == MaterialTheme.colors.surface && elevationOverlay != null) {
+                elevationOverlay.apply(thumbColor, absoluteElevation)
+            } else {
+                thumbColor
+            }
+        )
     Spacer(
-        Modifier
-            .align(Alignment.CenterStart)
+        Modifier.align(Alignment.CenterStart)
             .offset { IntOffset(thumbValue().roundToInt(), 0) }
             .indication(
                 interactionSource = interactionSource,
-                indication = rippleOrFallbackImplementation(
-                    bounded = false,
-                    radius = ThumbRippleRadius
-                )
+                indication =
+                    rippleOrFallbackImplementation(bounded = false, radius = ThumbRippleRadius)
             )
             .requiredSize(ThumbDiameter)
             .shadow(elevation, CircleShape, clip = false)
@@ -301,22 +298,20 @@
 private val ThumbDefaultElevation = 1.dp
 private val ThumbPressedElevation = 6.dp
 
-/**
- * Contains the default values used by [Switch]
- */
+/** Contains the default values used by [Switch] */
 object SwitchDefaults {
     /**
-     * Creates a [SwitchColors] that represents the different colors used in a [Switch] in
-     * different states.
+     * Creates a [SwitchColors] that represents the different colors used in a [Switch] in different
+     * states.
      *
      * @param checkedThumbColor the color used for the thumb when enabled and checked
      * @param checkedTrackColor the color used for the track when enabled and checked
      * @param checkedTrackAlpha the alpha applied to [checkedTrackColor] and
-     * [disabledCheckedTrackColor]
+     *   [disabledCheckedTrackColor]
      * @param uncheckedThumbColor the color used for the thumb when enabled and unchecked
      * @param uncheckedTrackColor the color used for the track when enabled and unchecked
      * @param uncheckedTrackAlpha the alpha applied to [uncheckedTrackColor] and
-     * [disabledUncheckedTrackColor]
+     *   [disabledUncheckedTrackColor]
      * @param disabledCheckedThumbColor the color used for the thumb when disabled and checked
      * @param disabledCheckedTrackColor the color used for the track when disabled and checked
      * @param disabledUncheckedThumbColor the color used for the thumb when disabled and unchecked
@@ -330,33 +325,37 @@
         uncheckedThumbColor: Color = MaterialTheme.colors.surface,
         uncheckedTrackColor: Color = MaterialTheme.colors.onSurface,
         uncheckedTrackAlpha: Float = 0.38f,
-        disabledCheckedThumbColor: Color = checkedThumbColor
-            .copy(alpha = ContentAlpha.disabled)
-            .compositeOver(MaterialTheme.colors.surface),
-        disabledCheckedTrackColor: Color = checkedTrackColor
-            .copy(alpha = ContentAlpha.disabled)
-            .compositeOver(MaterialTheme.colors.surface),
-        disabledUncheckedThumbColor: Color = uncheckedThumbColor
-            .copy(alpha = ContentAlpha.disabled)
-            .compositeOver(MaterialTheme.colors.surface),
-        disabledUncheckedTrackColor: Color = uncheckedTrackColor
-            .copy(alpha = ContentAlpha.disabled)
-            .compositeOver(MaterialTheme.colors.surface)
-    ): SwitchColors = DefaultSwitchColors(
-        checkedThumbColor = checkedThumbColor,
-        checkedTrackColor = checkedTrackColor.copy(alpha = checkedTrackAlpha),
-        uncheckedThumbColor = uncheckedThumbColor,
-        uncheckedTrackColor = uncheckedTrackColor.copy(alpha = uncheckedTrackAlpha),
-        disabledCheckedThumbColor = disabledCheckedThumbColor,
-        disabledCheckedTrackColor = disabledCheckedTrackColor.copy(alpha = checkedTrackAlpha),
-        disabledUncheckedThumbColor = disabledUncheckedThumbColor,
-        disabledUncheckedTrackColor = disabledUncheckedTrackColor.copy(alpha = uncheckedTrackAlpha)
-    )
+        disabledCheckedThumbColor: Color =
+            checkedThumbColor
+                .copy(alpha = ContentAlpha.disabled)
+                .compositeOver(MaterialTheme.colors.surface),
+        disabledCheckedTrackColor: Color =
+            checkedTrackColor
+                .copy(alpha = ContentAlpha.disabled)
+                .compositeOver(MaterialTheme.colors.surface),
+        disabledUncheckedThumbColor: Color =
+            uncheckedThumbColor
+                .copy(alpha = ContentAlpha.disabled)
+                .compositeOver(MaterialTheme.colors.surface),
+        disabledUncheckedTrackColor: Color =
+            uncheckedTrackColor
+                .copy(alpha = ContentAlpha.disabled)
+                .compositeOver(MaterialTheme.colors.surface)
+    ): SwitchColors =
+        DefaultSwitchColors(
+            checkedThumbColor = checkedThumbColor,
+            checkedTrackColor = checkedTrackColor.copy(alpha = checkedTrackAlpha),
+            uncheckedThumbColor = uncheckedThumbColor,
+            uncheckedTrackColor = uncheckedTrackColor.copy(alpha = uncheckedTrackAlpha),
+            disabledCheckedThumbColor = disabledCheckedThumbColor,
+            disabledCheckedTrackColor = disabledCheckedTrackColor.copy(alpha = checkedTrackAlpha),
+            disabledUncheckedThumbColor = disabledUncheckedThumbColor,
+            disabledUncheckedTrackColor =
+                disabledUncheckedTrackColor.copy(alpha = uncheckedTrackAlpha)
+        )
 }
 
-/**
- * Default [SwitchColors] implementation.
- */
+/** Default [SwitchColors] implementation. */
 @Immutable
 private class DefaultSwitchColors(
     private val checkedThumbColor: Color,
diff --git a/compose/material/material/src/commonMain/kotlin/androidx/compose/material/Tab.kt b/compose/material/material/src/commonMain/kotlin/androidx/compose/material/Tab.kt
index 9ed1843..ee13aa4 100644
--- a/compose/material/material/src/commonMain/kotlin/androidx/compose/material/Tab.kt
+++ b/compose/material/material/src/commonMain/kotlin/androidx/compose/material/Tab.kt
@@ -53,7 +53,8 @@
 import kotlin.math.max
 
 /**
- * <a href="https://material.io/components/tabs" class="external" target="_blank">Material Design tab</a>.
+ * <a href="https://material.io/components/tabs" class="external" target="_blank">Material Design
+ * tab</a>.
  *
  * Tabs organize content across different screens, data sets, and other interactions.
  *
@@ -65,24 +66,23 @@
  * This should typically be used inside of a [TabRow], see the corresponding documentation for
  * example usage.
  *
- * This Tab has slots for [text] and/or [icon] - see the other Tab overload for a generic Tab
- * that is not opinionated about its content.
+ * This Tab has slots for [text] and/or [icon] - see the other Tab overload for a generic Tab that
+ * is not opinionated about its content.
  *
  * @param selected whether this tab is selected or not
  * @param onClick the callback to be invoked when this tab is selected
  * @param modifier optional [Modifier] for this tab
- * @param enabled controls the enabled state of this tab. When `false`, this tab will not
- * be clickable and will appear disabled to accessibility services.
+ * @param enabled controls the enabled state of this tab. When `false`, this tab will not be
+ *   clickable and will appear disabled to accessibility services.
  * @param text the text label displayed in this tab
  * @param icon the icon displayed in this tab
  * @param interactionSource an optional hoisted [MutableInteractionSource] for observing and
- * emitting [Interaction]s for this tab. You can use this to change the tab's
- * appearance or preview the tab in different states. Note that if `null` is provided,
- * interactions will still happen internally.
- * @param selectedContentColor the color for the content of this tab when selected, and the color
- * of the ripple.
+ *   emitting [Interaction]s for this tab. You can use this to change the tab's appearance or
+ *   preview the tab in different states. Note that if `null` is provided, interactions will still
+ *   happen internally.
+ * @param selectedContentColor the color for the content of this tab when selected, and the color of
+ *   the ripple.
  * @param unselectedContentColor the color for the content of this tab when not selected
- *
  * @see LeadingIconTab
  */
 @Composable
@@ -97,12 +97,13 @@
     selectedContentColor: Color = LocalContentColor.current,
     unselectedContentColor: Color = selectedContentColor.copy(alpha = ContentAlpha.medium)
 ) {
-    val styledText: @Composable (() -> Unit)? = text?.let {
-        @Composable {
-            val style = MaterialTheme.typography.button.copy(textAlign = TextAlign.Center)
-            ProvideTextStyle(style, content = text)
+    val styledText: @Composable (() -> Unit)? =
+        text?.let {
+            @Composable {
+                val style = MaterialTheme.typography.button.copy(textAlign = TextAlign.Center)
+                ProvideTextStyle(style, content = text)
+            }
         }
-    }
     Tab(
         selected,
         onClick,
@@ -117,15 +118,16 @@
 }
 
 /**
- * <a href="https://material.io/components/tabs" class="external" target="_blank">Material Design tab</a>.
+ * <a href="https://material.io/components/tabs" class="external" target="_blank">Material Design
+ * tab</a>.
  *
  * Tabs organize content across different screens, data sets, and other interactions.
  *
  * ![Tab image](https://developer.android.com/images/reference/androidx/compose/material/tab.png)
  *
- * A LeadingIconTab represents a single page of content using a text label and an icon in
- * front of the label.
- * It represents its selected state by tinting the text label and icon with [selectedContentColor].
+ * A LeadingIconTab represents a single page of content using a text label and an icon in front of
+ * the label. It represents its selected state by tinting the text label and icon with
+ * [selectedContentColor].
  *
  * This should typically be used inside of a [TabRow], see the corresponding documentation for
  * example usage.
@@ -135,16 +137,15 @@
  * @param text the text label displayed in this tab
  * @param icon the icon displayed in this tab
  * @param modifier optional [Modifier] for this tab
- * @param enabled controls the enabled state of this tab. When `false`, this tab will not
- * be clickable and will appear disabled to accessibility services.
+ * @param enabled controls the enabled state of this tab. When `false`, this tab will not be
+ *   clickable and will appear disabled to accessibility services.
  * @param interactionSource an optional hoisted [MutableInteractionSource] for observing and
- * emitting [Interaction]s for this tab. You can use this to change the tab's
- * appearance or preview the tab in different states. Note that if `null` is provided,
- * interactions will still happen internally.
- * @param selectedContentColor the color for the content of this tab when selected, and the color
- * of the ripple.
+ *   emitting [Interaction]s for this tab. You can use this to change the tab's appearance or
+ *   preview the tab in different states. Note that if `null` is provided, interactions will still
+ *   happen internally.
+ * @param selectedContentColor the color for the content of this tab when selected, and the color of
+ *   the ripple.
  * @param unselectedContentColor the color for the content of this tab when not selected
- *
  * @see Tab
  */
 @Composable
@@ -166,18 +167,19 @@
 
     TabTransition(selectedContentColor, unselectedContentColor, selected) {
         Row(
-            modifier = modifier
-                .height(SmallTabHeight)
-                .selectable(
-                    selected = selected,
-                    onClick = onClick,
-                    enabled = enabled,
-                    role = Role.Tab,
-                    interactionSource = interactionSource,
-                    indication = ripple
-                )
-                .padding(horizontal = HorizontalTextPadding)
-                .fillMaxWidth(),
+            modifier =
+                modifier
+                    .height(SmallTabHeight)
+                    .selectable(
+                        selected = selected,
+                        onClick = onClick,
+                        enabled = enabled,
+                        role = Role.Tab,
+                        interactionSource = interactionSource,
+                        indication = ripple
+                    )
+                    .padding(horizontal = HorizontalTextPadding)
+                    .fillMaxWidth(),
             horizontalArrangement = Arrangement.Center,
             verticalAlignment = Alignment.CenterVertically
         ) {
@@ -190,15 +192,16 @@
 }
 
 /**
- * <a href="https://material.io/components/tabs" class="external" target="_blank">Material Design tab</a>.
+ * <a href="https://material.io/components/tabs" class="external" target="_blank">Material Design
+ * tab</a>.
  *
  * Tabs organize content across different screens, data sets, and other interactions.
  *
  * ![Tab image](https://developer.android.com/images/reference/androidx/compose/material/tab.png)
  *
- * Generic [Tab] overload that is not opinionated about content / color. See the other overload
- * for a Tab that has specific slots for text and / or an icon, as well as providing the correct
- * colors for selected / unselected states.
+ * Generic [Tab] overload that is not opinionated about content / color. See the other overload for
+ * a Tab that has specific slots for text and / or an icon, as well as providing the correct colors
+ * for selected / unselected states.
  *
  * A custom tab using this API may look like:
  *
@@ -207,14 +210,14 @@
  * @param selected whether this tab is selected or not
  * @param onClick the callback to be invoked when this tab is selected
  * @param modifier optional [Modifier] for this tab
- * @param enabled controls the enabled state of this tab. When `false`, this tab will not
- * be clickable and will appear disabled to accessibility services.
+ * @param enabled controls the enabled state of this tab. When `false`, this tab will not be
+ *   clickable and will appear disabled to accessibility services.
  * @param interactionSource an optional hoisted [MutableInteractionSource] for observing and
- * emitting [Interaction]s for this tab. You can use this to change the tab's
- * appearance or preview the tab in different states. Note that if `null` is provided,
- * interactions will still happen internally.
- * @param selectedContentColor the color for the content of this tab when selected, and the color
- * of the ripple.
+ *   emitting [Interaction]s for this tab. You can use this to change the tab's appearance or
+ *   preview the tab in different states. Note that if `null` is provided, interactions will still
+ *   happen internally.
+ * @param selectedContentColor the color for the content of this tab when selected, and the color of
+ *   the ripple.
  * @param unselectedContentColor the color for the content of this tab when not selected
  * @param content the content of this tab
  */
@@ -236,16 +239,17 @@
 
     TabTransition(selectedContentColor, unselectedContentColor, selected) {
         Column(
-            modifier = modifier
-                .selectable(
-                    selected = selected,
-                    onClick = onClick,
-                    enabled = enabled,
-                    role = Role.Tab,
-                    interactionSource = interactionSource,
-                    indication = ripple
-                )
-                .fillMaxWidth(),
+            modifier =
+                modifier
+                    .selectable(
+                        selected = selected,
+                        onClick = onClick,
+                        enabled = enabled,
+                        role = Role.Tab,
+                        interactionSource = interactionSource,
+                        indication = ripple
+                    )
+                    .fillMaxWidth(),
             horizontalAlignment = Alignment.CenterHorizontally,
             verticalArrangement = Arrangement.Center,
             content = content
@@ -255,8 +259,8 @@
 
 /**
  * Transition defining how the tint color for a tab animates, when a new tab is selected. This
- * component uses [LocalContentColor] to provide an interpolated value between [activeColor]
- * and [inactiveColor] depending on the animation status.
+ * component uses [LocalContentColor] to provide an interpolated value between [activeColor] and
+ * [inactiveColor] depending on the animation status.
  */
 @Composable
 private fun TabTransition(
@@ -266,24 +270,22 @@
     content: @Composable () -> Unit
 ) {
     val transition = updateTransition(selected)
-    val color by transition.animateColor(
-        transitionSpec = {
-            if (false isTransitioningTo true) {
-                tween(
-                    durationMillis = TabFadeInAnimationDuration,
-                    delayMillis = TabFadeInAnimationDelay,
-                    easing = LinearEasing
-                )
-            } else {
-                tween(
-                    durationMillis = TabFadeOutAnimationDuration,
-                    easing = LinearEasing
-                )
+    val color by
+        transition.animateColor(
+            transitionSpec = {
+                if (false isTransitioningTo true) {
+                    tween(
+                        durationMillis = TabFadeInAnimationDuration,
+                        delayMillis = TabFadeInAnimationDelay,
+                        easing = LinearEasing
+                    )
+                } else {
+                    tween(durationMillis = TabFadeOutAnimationDuration, easing = LinearEasing)
+                }
             }
+        ) {
+            if (it) activeColor else inactiveColor
         }
-    ) {
-        if (it) activeColor else inactiveColor
-    }
     CompositionLocalProvider(
         LocalContentColor provides color.copy(alpha = 1f),
         LocalContentAlpha provides color.alpha,
@@ -297,69 +299,64 @@
  * place the text and/or icon inside with the correct baseline alignment.
  */
 @Composable
-private fun TabBaselineLayout(
-    text: @Composable (() -> Unit)?,
-    icon: @Composable (() -> Unit)?
-) {
-    Layout(
-        {
-            if (text != null) {
-                Box(
-                    Modifier.layoutId("text").padding(horizontal = HorizontalTextPadding)
-                ) { text() }
-            }
-            if (icon != null) {
-                Box(Modifier.layoutId("icon")) { icon() }
-            }
+private fun TabBaselineLayout(text: @Composable (() -> Unit)?, icon: @Composable (() -> Unit)?) {
+    Layout({
+        if (text != null) {
+            Box(Modifier.layoutId("text").padding(horizontal = HorizontalTextPadding)) { text() }
         }
-    ) { measurables, constraints ->
-        val textPlaceable = text?.let {
-            measurables.fastFirst { it.layoutId == "text" }.measure(
-                // Measure with loose constraints for height as we don't want the text to take up more
-                // space than it needs
-                constraints.copy(minHeight = 0)
-            )
+        if (icon != null) {
+            Box(Modifier.layoutId("icon")) { icon() }
         }
+    }) { measurables, constraints ->
+        val textPlaceable =
+            text?.let {
+                measurables
+                    .fastFirst { it.layoutId == "text" }
+                    .measure(
+                        // Measure with loose constraints for height as we don't want the text to
+                        // take up more
+                        // space than it needs
+                        constraints.copy(minHeight = 0)
+                    )
+            }
 
-        val iconPlaceable = icon?.let {
-            measurables.fastFirst { it.layoutId == "icon" }.measure(constraints)
-        }
+        val iconPlaceable =
+            icon?.let { measurables.fastFirst { it.layoutId == "icon" }.measure(constraints) }
 
         val tabWidth = max(textPlaceable?.width ?: 0, iconPlaceable?.width ?: 0)
 
-        val tabHeight = if (textPlaceable != null && iconPlaceable != null) {
-            LargeTabHeight
-        } else {
-            SmallTabHeight
-        }.roundToPx()
+        val tabHeight =
+            if (textPlaceable != null && iconPlaceable != null) {
+                    LargeTabHeight
+                } else {
+                    SmallTabHeight
+                }
+                .roundToPx()
 
         val firstBaseline = textPlaceable?.get(FirstBaseline)
         val lastBaseline = textPlaceable?.get(LastBaseline)
 
         layout(tabWidth, tabHeight) {
             when {
-                textPlaceable != null && iconPlaceable != null -> placeTextAndIcon(
-                    density = this@Layout,
-                    textPlaceable = textPlaceable,
-                    iconPlaceable = iconPlaceable,
-                    tabWidth = tabWidth,
-                    tabHeight = tabHeight,
-                    firstBaseline = firstBaseline!!,
-                    lastBaseline = lastBaseline!!
-                )
+                textPlaceable != null && iconPlaceable != null ->
+                    placeTextAndIcon(
+                        density = this@Layout,
+                        textPlaceable = textPlaceable,
+                        iconPlaceable = iconPlaceable,
+                        tabWidth = tabWidth,
+                        tabHeight = tabHeight,
+                        firstBaseline = firstBaseline!!,
+                        lastBaseline = lastBaseline!!
+                    )
                 textPlaceable != null -> placeTextOrIcon(textPlaceable, tabHeight)
                 iconPlaceable != null -> placeTextOrIcon(iconPlaceable, tabHeight)
-                else -> {
-                }
+                else -> {}
             }
         }
     }
 }
 
-/**
- * Places the provided [textOrIconPlaceable] in the vertical center of the provided
- * [tabHeight].
- */
+/** Places the provided [textOrIconPlaceable] in the vertical center of the provided [tabHeight]. */
 private fun Placeable.PlacementScope.placeTextOrIcon(
     textOrIconPlaceable: Placeable,
     tabHeight: Int
@@ -369,9 +366,9 @@
 }
 
 /**
- * Places the provided [textPlaceable] offset from the bottom of the tab using the correct
- * baseline offset, with the provided [iconPlaceable] placed above the text using the correct
- * baseline offset.
+ * Places the provided [textPlaceable] offset from the bottom of the tab using the correct baseline
+ * offset, with the provided [iconPlaceable] placed above the text using the correct baseline
+ * offset.
  */
 private fun Placeable.PlacementScope.placeTextAndIcon(
     density: Density,
@@ -382,22 +379,23 @@
     firstBaseline: Int,
     lastBaseline: Int
 ) {
-    val baselineOffset = if (firstBaseline == lastBaseline) {
-        SingleLineTextBaselineWithIcon
-    } else {
-        DoubleLineTextBaselineWithIcon
-    }
+    val baselineOffset =
+        if (firstBaseline == lastBaseline) {
+            SingleLineTextBaselineWithIcon
+        } else {
+            DoubleLineTextBaselineWithIcon
+        }
 
     // Total offset between the last text baseline and the bottom of the Tab layout
-    val textOffset = with(density) {
-        baselineOffset.roundToPx() + TabRowDefaults.IndicatorHeight.roundToPx()
-    }
+    val textOffset =
+        with(density) { baselineOffset.roundToPx() + TabRowDefaults.IndicatorHeight.roundToPx() }
 
     // How much space there is between the top of the icon (essentially the top of this layout)
     // and the top of the text layout's bounding box (not baseline)
-    val iconOffset = with(density) {
-        iconPlaceable.height + IconDistanceFromBaseline.roundToPx() - firstBaseline
-    }
+    val iconOffset =
+        with(density) {
+            iconPlaceable.height + IconDistanceFromBaseline.roundToPx() - firstBaseline
+        }
 
     val textPlaceableX = (tabWidth - textPlaceable.width) / 2
     val textPlaceableY = tabHeight - lastBaseline - textOffset
diff --git a/compose/material/material/src/commonMain/kotlin/androidx/compose/material/TabRow.kt b/compose/material/material/src/commonMain/kotlin/androidx/compose/material/TabRow.kt
index 713a331..211681f 100644
--- a/compose/material/material/src/commonMain/kotlin/androidx/compose/material/TabRow.kt
+++ b/compose/material/material/src/commonMain/kotlin/androidx/compose/material/TabRow.kt
@@ -58,18 +58,20 @@
 import kotlinx.coroutines.launch
 
 /**
- * <a href="https://material.io/components/tabs#fixed-tabs" class="external" target="_blank">Material Design fixed tabs</a>.
+ * <a href="https://material.io/components/tabs#fixed-tabs" class="external"
+ * target="_blank">Material Design fixed tabs</a>.
  *
  * Fixed tabs display all tabs in a set simultaneously. They are best for switching between related
  * content quickly, such as between transportation methods in a map. To navigate between fixed tabs,
  * tap an individual tab, or swipe left or right in the content area.
  *
- * ![Fixed tabs image](https://developer.android.com/images/reference/androidx/compose/material/fixed-tabs.png)
+ * ![Fixed tabs
+ * image](https://developer.android.com/images/reference/androidx/compose/material/fixed-tabs.png)
  *
- * A TabRow contains a row of [Tab]s, and displays an indicator underneath the currently
- * selected tab. A TabRow places its tabs evenly spaced along the entire row, with each tab
- * taking up an equal amount of space. See [ScrollableTabRow] for a tab row that does not enforce
- * equal size, and allows scrolling to tabs that do not fit on screen.
+ * A TabRow contains a row of [Tab]s, and displays an indicator underneath the currently selected
+ * tab. A TabRow places its tabs evenly spaced along the entire row, with each tab taking up an
+ * equal amount of space. See [ScrollableTabRow] for a tab row that does not enforce equal size, and
+ * allows scrolling to tabs that do not fit on screen.
  *
  * A simple example with text tabs looks like:
  *
@@ -83,27 +85,27 @@
  *
  * @sample androidx.compose.material.samples.FancyTab
  *
- * As well as customizing the tab, you can also provide a custom [indicator], to customize
- * the indicator displayed for a tab. [indicator] will be placed to fill the entire TabRow, so it
- * should internally take care of sizing and positioning the indicator to match changes to
+ * As well as customizing the tab, you can also provide a custom [indicator], to customize the
+ * indicator displayed for a tab. [indicator] will be placed to fill the entire TabRow, so it should
+ * internally take care of sizing and positioning the indicator to match changes to
  * [selectedTabIndex].
  *
  * For example, given an indicator that draws a rounded rectangle near the edges of the [Tab]:
  *
  * @sample androidx.compose.material.samples.FancyIndicator
  *
- * We can reuse [TabRowDefaults.tabIndicatorOffset] and just provide this indicator,
- * as we aren't changing how the size and position of the indicator changes between tabs:
+ * We can reuse [TabRowDefaults.tabIndicatorOffset] and just provide this indicator, as we aren't
+ * changing how the size and position of the indicator changes between tabs:
  *
  * @sample androidx.compose.material.samples.FancyIndicatorTabs
  *
- * You may also want to use a custom transition, to allow you to dynamically change the
- * appearance of the indicator as it animates between tabs, such as changing its color or size.
- * [indicator] is stacked on top of the entire TabRow, so you just need to provide a custom
- * transition that animates the offset of the indicator from the start of the TabRow. For
- * example, take the following example that uses a transition to animate the offset, width, and
- * color of the same FancyIndicator from before, also adding a physics based 'spring' effect to
- * the indicator in the direction of motion:
+ * You may also want to use a custom transition, to allow you to dynamically change the appearance
+ * of the indicator as it animates between tabs, such as changing its color or size. [indicator] is
+ * stacked on top of the entire TabRow, so you just need to provide a custom transition that
+ * animates the offset of the indicator from the start of the TabRow. For example, take the
+ * following example that uses a transition to animate the offset, width, and color of the same
+ * FancyIndicator from before, also adding a physics based 'spring' effect to the indicator in the
+ * direction of motion:
  *
  * @sample androidx.compose.material.samples.FancyAnimatedIndicator
  *
@@ -113,21 +115,21 @@
  *
  * @param selectedTabIndex the index of the currently selected tab
  * @param modifier optional [Modifier] for this TabRow
- * @param backgroundColor The background color for the TabRow. Use [Color.Transparent] to have
- * no color.
- * @param contentColor The preferred content color provided by this TabRow to its children.
- * Defaults to either the matching content color for [backgroundColor], or if [backgroundColor] is
- * not a color from the theme, this will keep the same value set above this TabRow.
+ * @param backgroundColor The background color for the TabRow. Use [Color.Transparent] to have no
+ *   color.
+ * @param contentColor The preferred content color provided by this TabRow to its children. Defaults
+ *   to either the matching content color for [backgroundColor], or if [backgroundColor] is not a
+ *   color from the theme, this will keep the same value set above this TabRow.
  * @param indicator the indicator that represents which tab is currently selected. By default this
- * will be a [TabRowDefaults.Indicator], using a [TabRowDefaults.tabIndicatorOffset]
- * modifier to animate its position. Note that this indicator will be forced to fill up the
- * entire TabRow, so you should use [TabRowDefaults.tabIndicatorOffset] or similar to
- * animate the actual drawn indicator inside this space, and provide an offset from the start.
+ *   will be a [TabRowDefaults.Indicator], using a [TabRowDefaults.tabIndicatorOffset] modifier to
+ *   animate its position. Note that this indicator will be forced to fill up the entire TabRow, so
+ *   you should use [TabRowDefaults.tabIndicatorOffset] or similar to animate the actual drawn
+ *   indicator inside this space, and provide an offset from the start.
  * @param divider the divider displayed at the bottom of the TabRow. This provides a layer of
- * separation between the TabRow and the content displayed underneath.
+ *   separation between the TabRow and the content displayed underneath.
  * @param tabs the tabs inside this TabRow. Typically this will be multiple [Tab]s. Each element
- * inside this lambda will be measured and placed evenly across the TabRow, each taking up equal
- * space.
+ *   inside this lambda will be measured and placed evenly across the TabRow, each taking up equal
+ *   space.
  */
 @Composable
 @UiComposable
@@ -136,16 +138,11 @@
     modifier: Modifier = Modifier,
     backgroundColor: Color = MaterialTheme.colors.primarySurface,
     contentColor: Color = contentColorFor(backgroundColor),
-    indicator: @Composable @UiComposable
-        (tabPositions: List<TabPosition>) -> Unit = @Composable { tabPositions ->
-        TabRowDefaults.Indicator(
-            Modifier.tabIndicatorOffset(tabPositions[selectedTabIndex])
-        )
-    },
-    divider: @Composable @UiComposable () -> Unit =
-        @Composable {
-            TabRowDefaults.Divider()
+    indicator: @Composable @UiComposable (tabPositions: List<TabPosition>) -> Unit =
+        @Composable { tabPositions ->
+            TabRowDefaults.Indicator(Modifier.tabIndicatorOffset(tabPositions[selectedTabIndex]))
         },
+    divider: @Composable @UiComposable () -> Unit = @Composable { TabRowDefaults.Divider() },
     tabs: @Composable @UiComposable () -> Unit
 ) {
     Surface(
@@ -158,15 +155,15 @@
             val tabMeasurables = subcompose(TabSlots.Tabs, tabs)
             val tabCount = tabMeasurables.size
             val tabWidth = (tabRowWidth / tabCount)
-            val tabPlaceables = tabMeasurables.fastMap {
-                it.measure(constraints.copy(minWidth = tabWidth, maxWidth = tabWidth))
-            }
+            val tabPlaceables =
+                tabMeasurables.fastMap {
+                    it.measure(constraints.copy(minWidth = tabWidth, maxWidth = tabWidth))
+                }
 
             val tabRowHeight = tabPlaceables.fastMaxBy { it.height }?.height ?: 0
 
-            val tabPositions = List(tabCount) { index ->
-                TabPosition(tabWidth.toDp() * index, tabWidth.toDp())
-            }
+            val tabPositions =
+                List(tabCount) { index -> TabPosition(tabWidth.toDp() * index, tabWidth.toDp()) }
 
             layout(tabRowWidth, tabRowHeight) {
                 tabPlaceables.fastForEachIndexed { index, placeable ->
@@ -178,50 +175,51 @@
                     placeable.placeRelative(0, tabRowHeight - placeable.height)
                 }
 
-                subcompose(TabSlots.Indicator) {
-                    indicator(tabPositions)
-                }.fastForEach {
-                    it.measure(Constraints.fixed(tabRowWidth, tabRowHeight)).placeRelative(0, 0)
-                }
+                subcompose(TabSlots.Indicator) { indicator(tabPositions) }
+                    .fastForEach {
+                        it.measure(Constraints.fixed(tabRowWidth, tabRowHeight)).placeRelative(0, 0)
+                    }
             }
         }
     }
 }
 
 /**
- * <a href="https://material.io/components/tabs#scrollable-tabs" class="external" target="_blank">Material Design scrollable tabs</a>.
+ * <a href="https://material.io/components/tabs#scrollable-tabs" class="external"
+ * target="_blank">Material Design scrollable tabs</a>.
  *
  * When a set of tabs cannot fit on screen, use scrollable tabs. Scrollable tabs can use longer text
  * labels and a larger number of tabs. They are best used for browsing on touch interfaces.
  *
- * ![Scrollable tabs image](https://developer.android.com/images/reference/androidx/compose/material/scrollable-tabs.png)
+ * ![Scrollable tabs
+ * image](https://developer.android.com/images/reference/androidx/compose/material/scrollable-tabs.png)
  *
  * A ScrollableTabRow contains a row of [Tab]s, and displays an indicator underneath the currently
  * selected tab. A ScrollableTabRow places its tabs offset from the starting edge, and allows
- * scrolling to tabs that are placed off screen. For a fixed tab row that does not allow
- * scrolling, and evenly places its tabs, see [TabRow].
+ * scrolling to tabs that are placed off screen. For a fixed tab row that does not allow scrolling,
+ * and evenly places its tabs, see [TabRow].
  *
  * @param selectedTabIndex the index of the currently selected tab
  * @param modifier optional [Modifier] for this ScrollableTabRow
  * @param backgroundColor The background color for the ScrollableTabRow. Use [Color.Transparent] to
- * have no color.
+ *   have no color.
  * @param contentColor The preferred content color provided by this ScrollableTabRow to its
- * children. Defaults to either the matching content color for [backgroundColor], or if
- * [backgroundColor] is not a color from the theme, this will keep the same value set above this
- * ScrollableTabRow.
- * @param edgePadding the padding between the starting and ending edge of ScrollableTabRow, and
- * the tabs inside the ScrollableTabRow. This padding helps inform the user that this tab row can
- * be scrolled, unlike a [TabRow].
+ *   children. Defaults to either the matching content color for [backgroundColor], or if
+ *   [backgroundColor] is not a color from the theme, this will keep the same value set above this
+ *   ScrollableTabRow.
+ * @param edgePadding the padding between the starting and ending edge of ScrollableTabRow, and the
+ *   tabs inside the ScrollableTabRow. This padding helps inform the user that this tab row can be
+ *   scrolled, unlike a [TabRow].
  * @param indicator the indicator that represents which tab is currently selected. By default this
- * will be a [TabRowDefaults.Indicator], using a [TabRowDefaults.tabIndicatorOffset]
- * modifier to animate its position. Note that this indicator will be forced to fill up the
- * entire ScrollableTabRow, so you should use [TabRowDefaults.tabIndicatorOffset] or similar to
- * animate the actual drawn indicator inside this space, and provide an offset from the start.
+ *   will be a [TabRowDefaults.Indicator], using a [TabRowDefaults.tabIndicatorOffset] modifier to
+ *   animate its position. Note that this indicator will be forced to fill up the entire
+ *   ScrollableTabRow, so you should use [TabRowDefaults.tabIndicatorOffset] or similar to animate
+ *   the actual drawn indicator inside this space, and provide an offset from the start.
  * @param divider the divider displayed at the bottom of the ScrollableTabRow. This provides a layer
- * of separation between the ScrollableTabRow and the content displayed underneath.
+ *   of separation between the ScrollableTabRow and the content displayed underneath.
  * @param tabs the tabs inside this ScrollableTabRow. Typically this will be multiple [Tab]s. Each
- * element inside this lambda will be measured and placed evenly across the TabRow, each taking
- * up equal space.
+ *   element inside this lambda will be measured and placed evenly across the TabRow, each taking up
+ *   equal space.
  */
 @Composable
 @UiComposable
@@ -231,31 +229,20 @@
     backgroundColor: Color = MaterialTheme.colors.primarySurface,
     contentColor: Color = contentColorFor(backgroundColor),
     edgePadding: Dp = TabRowDefaults.ScrollableTabRowPadding,
-    indicator: @Composable @UiComposable
-        (tabPositions: List<TabPosition>) -> Unit = @Composable { tabPositions ->
-        TabRowDefaults.Indicator(
-            Modifier.tabIndicatorOffset(tabPositions[selectedTabIndex])
-        )
-    },
-    divider: @Composable @UiComposable () -> Unit =
-        @Composable {
-            TabRowDefaults.Divider()
+    indicator: @Composable @UiComposable (tabPositions: List<TabPosition>) -> Unit =
+        @Composable { tabPositions ->
+            TabRowDefaults.Indicator(Modifier.tabIndicatorOffset(tabPositions[selectedTabIndex]))
         },
+    divider: @Composable @UiComposable () -> Unit = @Composable { TabRowDefaults.Divider() },
     tabs: @Composable @UiComposable () -> Unit
 ) {
-    Surface(
-        modifier = modifier,
-        color = backgroundColor,
-        contentColor = contentColor
-    ) {
+    Surface(modifier = modifier, color = backgroundColor, contentColor = contentColor) {
         val scrollState = rememberScrollState()
         val coroutineScope = rememberCoroutineScope()
-        val scrollableTabData = remember(scrollState, coroutineScope) {
-            ScrollableTabData(
-                scrollState = scrollState,
-                coroutineScope = coroutineScope
-            )
-        }
+        val scrollableTabData =
+            remember(scrollState, coroutineScope) {
+                ScrollableTabData(scrollState = scrollState, coroutineScope = coroutineScope)
+            }
         SubcomposeLayout(
             Modifier.fillMaxWidth()
                 .wrapContentSize(align = Alignment.CenterStart)
@@ -267,8 +254,8 @@
             val padding = edgePadding.roundToPx()
             val tabConstraints = constraints.copy(minWidth = minTabWidth)
 
-            val tabPlaceables = subcompose(TabSlots.Tabs, tabs)
-                .fastMap { it.measure(tabConstraints) }
+            val tabPlaceables =
+                subcompose(TabSlots.Tabs, tabs).fastMap { it.measure(tabConstraints) }
 
             var layoutWidth = padding * 2
             var layoutHeight = 0
@@ -291,23 +278,23 @@
                 // The divider is measured with its own height, and width equal to the total width
                 // of the tab row, and then placed on top of the tabs.
                 subcompose(TabSlots.Divider, divider).fastForEach {
-                    val placeable = it.measure(
-                        constraints.copy(
-                            minHeight = 0,
-                            minWidth = layoutWidth,
-                            maxWidth = layoutWidth
+                    val placeable =
+                        it.measure(
+                            constraints.copy(
+                                minHeight = 0,
+                                minWidth = layoutWidth,
+                                maxWidth = layoutWidth
+                            )
                         )
-                    )
                     placeable.placeRelative(0, layoutHeight - placeable.height)
                 }
 
                 // The indicator container is measured to fill the entire space occupied by the tab
                 // row, and then placed on top of the divider.
-                subcompose(TabSlots.Indicator) {
-                    indicator(tabPositions)
-                }.fastForEach {
-                    it.measure(Constraints.fixed(layoutWidth, layoutHeight)).placeRelative(0, 0)
-                }
+                subcompose(TabSlots.Indicator) { indicator(tabPositions) }
+                    .fastForEach {
+                        it.measure(Constraints.fixed(layoutWidth, layoutHeight)).placeRelative(0, 0)
+                    }
 
                 scrollableTabData.onLaidOut(
                     density = this@SubcomposeLayout,
@@ -321,8 +308,8 @@
 }
 
 /**
- * Data class that contains information about a tab's position on screen, used for calculating
- * where to place the indicator that shows which tab is selected.
+ * Data class that contains information about a tab's position on screen, used for calculating where
+ * to place the indicator that shows which tab is selected.
  *
  * @property left the left edge's x position from the start of the [TabRow]
  * @property right the right edge's x position from the start of the [TabRow]
@@ -330,7 +317,8 @@
  */
 @Immutable
 class TabPosition internal constructor(val left: Dp, val width: Dp) {
-    val right: Dp get() = left + width
+    val right: Dp
+        get() = left + width
 
     override fun equals(other: Any?): Boolean {
         if (this === other) return true
@@ -353,9 +341,7 @@
     }
 }
 
-/**
- * Contains default implementations and values used for TabRow.
- */
+/** Contains default implementations and values used for TabRow. */
 object TabRowDefaults {
     /**
      * Default [Divider], which will be positioned at the bottom of the [TabRow], underneath the
@@ -388,61 +374,50 @@
         height: Dp = IndicatorHeight,
         color: Color = LocalContentColor.current
     ) {
-        Box(
-            modifier
-                .fillMaxWidth()
-                .height(height)
-                .background(color = color)
-        )
+        Box(modifier.fillMaxWidth().height(height).background(color = color))
     }
 
     /**
-     * [Modifier] that takes up all the available width inside the [TabRow], and then animates
-     * the offset of the indicator it is applied to, depending on the [currentTabPosition].
+     * [Modifier] that takes up all the available width inside the [TabRow], and then animates the
+     * offset of the indicator it is applied to, depending on the [currentTabPosition].
      *
      * @param currentTabPosition [TabPosition] of the currently selected tab. This is used to
-     * calculate the offset of the indicator this modifier is applied to, as well as its width.
+     *   calculate the offset of the indicator this modifier is applied to, as well as its width.
      */
-    fun Modifier.tabIndicatorOffset(
-        currentTabPosition: TabPosition
-    ): Modifier = composed(
-        inspectorInfo = debugInspectorInfo {
-            name = "tabIndicatorOffset"
-            value = currentTabPosition
+    fun Modifier.tabIndicatorOffset(currentTabPosition: TabPosition): Modifier =
+        composed(
+            inspectorInfo =
+                debugInspectorInfo {
+                    name = "tabIndicatorOffset"
+                    value = currentTabPosition
+                }
+        ) {
+            val currentTabWidth by
+                animateDpAsState(
+                    targetValue = currentTabPosition.width,
+                    animationSpec = tween(durationMillis = 250, easing = FastOutSlowInEasing)
+                )
+            val indicatorOffset by
+                animateDpAsState(
+                    targetValue = currentTabPosition.left,
+                    animationSpec = tween(durationMillis = 250, easing = FastOutSlowInEasing)
+                )
+            fillMaxWidth()
+                .wrapContentSize(Alignment.BottomStart)
+                .offset { IntOffset(x = indicatorOffset.roundToPx(), y = 0) }
+                .width(currentTabWidth)
         }
-    ) {
-        val currentTabWidth by animateDpAsState(
-            targetValue = currentTabPosition.width,
-            animationSpec = tween(durationMillis = 250, easing = FastOutSlowInEasing)
-        )
-        val indicatorOffset by animateDpAsState(
-            targetValue = currentTabPosition.left,
-            animationSpec = tween(durationMillis = 250, easing = FastOutSlowInEasing)
-        )
-        fillMaxWidth()
-            .wrapContentSize(Alignment.BottomStart)
-            .offset { IntOffset(x = indicatorOffset.roundToPx(), y = 0) }
-            .width(currentTabWidth)
-    }
 
-    /**
-     * Default opacity for the color of [Divider]
-     */
+    /** Default opacity for the color of [Divider] */
     const val DividerOpacity = 0.12f
 
-    /**
-     * Default thickness for [Divider]
-     */
+    /** Default thickness for [Divider] */
     val DividerThickness = 1.dp
 
-    /**
-     * Default height for [Indicator]
-     */
+    /** Default height for [Indicator] */
     val IndicatorHeight = 2.dp
 
-    /**
-     * The default padding from the starting edge before a tab in a [ScrollableTabRow].
-     */
+    /** The default padding from the starting edge before a tab in a [ScrollableTabRow]. */
     val ScrollableTabRowPadding = 52.dp
 }
 
@@ -452,9 +427,7 @@
     Indicator
 }
 
-/**
- * Class holding onto state needed for [ScrollableTabRow]
- */
+/** Class holding onto state needed for [ScrollableTabRow] */
 private class ScrollableTabData(
     private val scrollState: ScrollState,
     private val coroutineScope: CoroutineScope
@@ -488,34 +461,31 @@
     }
 
     /**
-     * @return the offset required to horizontally center the tab inside this TabRow.
-     * If the tab is at the start / end, and there is not enough space to fully centre the tab, this
-     * will just clamp to the min / max position given the max width.
+     * @return the offset required to horizontally center the tab inside this TabRow. If the tab is
+     *   at the start / end, and there is not enough space to fully centre the tab, this will just
+     *   clamp to the min / max position given the max width.
      */
     private fun TabPosition.calculateTabOffset(
         density: Density,
         edgeOffset: Int,
         tabPositions: List<TabPosition>
-    ): Int = with(density) {
-        val totalTabRowWidth = tabPositions.last().right.roundToPx() + edgeOffset
-        val visibleWidth = totalTabRowWidth - scrollState.maxValue
-        val tabOffset = left.roundToPx()
-        val scrollerCenter = visibleWidth / 2
-        val tabWidth = width.roundToPx()
-        val centeredTabOffset = tabOffset - (scrollerCenter - tabWidth / 2)
-        // How much space we have to scroll. If the visible width is <= to the total width, then
-        // we have no space to scroll as everything is always visible.
-        val availableSpace = (totalTabRowWidth - visibleWidth).coerceAtLeast(0)
-        return centeredTabOffset.coerceIn(0, availableSpace)
-    }
+    ): Int =
+        with(density) {
+            val totalTabRowWidth = tabPositions.last().right.roundToPx() + edgeOffset
+            val visibleWidth = totalTabRowWidth - scrollState.maxValue
+            val tabOffset = left.roundToPx()
+            val scrollerCenter = visibleWidth / 2
+            val tabWidth = width.roundToPx()
+            val centeredTabOffset = tabOffset - (scrollerCenter - tabWidth / 2)
+            // How much space we have to scroll. If the visible width is <= to the total width, then
+            // we have no space to scroll as everything is always visible.
+            val availableSpace = (totalTabRowWidth - visibleWidth).coerceAtLeast(0)
+            return centeredTabOffset.coerceIn(0, availableSpace)
+        }
 }
 
 private val ScrollableTabRowMinimumTabWidth = 90.dp
 
-/**
- * [AnimationSpec] used when scrolling to a tab that is not fully visible.
- */
-private val ScrollableTabRowScrollSpec: AnimationSpec<Float> = tween(
-    durationMillis = 250,
-    easing = FastOutSlowInEasing
-)
+/** [AnimationSpec] used when scrolling to a tab that is not fully visible. */
+private val ScrollableTabRowScrollSpec: AnimationSpec<Float> =
+    tween(durationMillis = 250, easing = FastOutSlowInEasing)
diff --git a/compose/material/material/src/commonMain/kotlin/androidx/compose/material/Text.kt b/compose/material/material/src/commonMain/kotlin/androidx/compose/material/Text.kt
index b527f7b..a3c32e4 100644
--- a/compose/material/material/src/commonMain/kotlin/androidx/compose/material/Text.kt
+++ b/compose/material/material/src/commonMain/kotlin/androidx/compose/material/Text.kt
@@ -41,52 +41,52 @@
  * High level element that displays text and provides semantics / accessibility information.
  *
  * The default [style] uses the [LocalTextStyle] provided by the [MaterialTheme] / components. If
- * you are setting your own style, you may want to consider first retrieving [LocalTextStyle],
- * and using [TextStyle.copy] to keep any theme defined attributes, only modifying the specific
+ * you are setting your own style, you may want to consider first retrieving [LocalTextStyle], and
+ * using [TextStyle.copy] to keep any theme defined attributes, only modifying the specific
  * attributes you want to override.
  *
  * For ease of use, commonly used parameters from [TextStyle] are also present here. The order of
  * precedence is as follows:
- * - If a parameter is explicitly set here (i.e, it is _not_ `null` or [TextUnit.Unspecified]),
- * then this parameter will always be used.
+ * - If a parameter is explicitly set here (i.e, it is _not_ `null` or [TextUnit.Unspecified]), then
+ *   this parameter will always be used.
  * - If a parameter is _not_ set, (`null` or [TextUnit.Unspecified]), then the corresponding value
- * from [style] will be used instead.
+ *   from [style] will be used instead.
  *
  * Additionally, for [color], if [color] is not set, and [style] does not have a color, then
- * [LocalContentColor] will be used with an alpha of [LocalContentAlpha]- this allows this
- * [Text] or element containing this [Text] to adapt to different background colors and still
- * maintain contrast and accessibility.
+ * [LocalContentColor] will be used with an alpha of [LocalContentAlpha]- this allows this [Text] or
+ * element containing this [Text] to adapt to different background colors and still maintain
+ * contrast and accessibility.
  *
  * @param text The text to be displayed.
  * @param modifier [Modifier] to apply to this layout node.
  * @param color [Color] to apply to the text. If [Color.Unspecified], and [style] has no color set,
- * this will be [LocalContentColor].
+ *   this will be [LocalContentColor].
  * @param fontSize The size of glyphs to use when painting the text. See [TextStyle.fontSize].
- * @param fontStyle The typeface variant to use when drawing the letters (e.g., italic).
- * See [TextStyle.fontStyle].
+ * @param fontStyle The typeface variant to use when drawing the letters (e.g., italic). See
+ *   [TextStyle.fontStyle].
  * @param fontWeight The typeface thickness to use when painting the text (e.g., [FontWeight.Bold]).
  * @param fontFamily The font family to be used when rendering the text. See [TextStyle.fontFamily].
- * @param letterSpacing The amount of space to add between each letter.
- * See [TextStyle.letterSpacing].
- * @param textDecoration The decorations to paint on the text (e.g., an underline).
- * See [TextStyle.textDecoration].
- * @param textAlign The alignment of the text within the lines of the paragraph.
- * See [TextStyle.textAlign].
- * @param lineHeight Line height for the [Paragraph] in [TextUnit] unit, e.g. SP or EM.
- * See [TextStyle.lineHeight].
+ * @param letterSpacing The amount of space to add between each letter. See
+ *   [TextStyle.letterSpacing].
+ * @param textDecoration The decorations to paint on the text (e.g., an underline). See
+ *   [TextStyle.textDecoration].
+ * @param textAlign The alignment of the text within the lines of the paragraph. See
+ *   [TextStyle.textAlign].
+ * @param lineHeight Line height for the [Paragraph] in [TextUnit] unit, e.g. SP or EM. See
+ *   [TextStyle.lineHeight].
  * @param overflow How visual overflow should be handled.
  * @param softWrap Whether the text should break at soft line breaks. If false, the glyphs in the
- * text will be positioned as if there was unlimited horizontal space. If [softWrap] is false,
- * [overflow] and TextAlign may have unexpected effects.
- * @param maxLines An optional maximum number of lines for the text to span, wrapping if
- * necessary. If the text exceeds the given number of lines, it will be truncated according to
- * [overflow] and [softWrap]. It is required that 1 <= [minLines] <= [maxLines].
+ *   text will be positioned as if there was unlimited horizontal space. If [softWrap] is false,
+ *   [overflow] and TextAlign may have unexpected effects.
+ * @param maxLines An optional maximum number of lines for the text to span, wrapping if necessary.
+ *   If the text exceeds the given number of lines, it will be truncated according to [overflow] and
+ *   [softWrap]. It is required that 1 <= [minLines] <= [maxLines].
  * @param minLines The minimum height in terms of minimum number of visible lines. It is required
- * that 1 <= [minLines] <= [maxLines].
+ *   that 1 <= [minLines] <= [maxLines].
  * @param onTextLayout Callback that is executed when a new text layout is calculated. A
- * [TextLayoutResult] object that callback provides contains paragraph information, size of the
- * text, baselines and other details. The callback can be used to add additional decoration or
- * functionality to the text. For example, to draw selection around the text.
+ *   [TextLayoutResult] object that callback provides contains paragraph information, size of the
+ *   text, baselines and other details. The callback can be used to add additional decoration or
+ *   functionality to the text. For example, to draw selection around the text.
  * @param style Style configuration for the text such as color, font, line height etc.
  */
 @Composable
@@ -128,27 +128,29 @@
     // profilers and benchmarks.
     val localContentColor = LocalContentColor.current
     val localContentAlpha = LocalContentAlpha.current
-    val overrideColorOrUnspecified: Color = if (color.isSpecified) {
-        color
-    } else if (style.color.isSpecified) {
-        style.color
-    } else {
-        localContentColor.copy(localContentAlpha)
-    }
+    val overrideColorOrUnspecified: Color =
+        if (color.isSpecified) {
+            color
+        } else if (style.color.isSpecified) {
+            style.color
+        } else {
+            localContentColor.copy(localContentAlpha)
+        }
 
     BasicText(
         text = text,
         modifier = modifier,
-        style = style.merge(
-            fontSize = fontSize,
-            fontWeight = fontWeight,
-            textAlign = textAlign ?: TextAlign.Unspecified,
-            lineHeight = lineHeight,
-            fontFamily = fontFamily,
-            textDecoration = textDecoration,
-            fontStyle = fontStyle,
-            letterSpacing = letterSpacing
-        ),
+        style =
+            style.merge(
+                fontSize = fontSize,
+                fontWeight = fontWeight,
+                textAlign = textAlign ?: TextAlign.Unspecified,
+                lineHeight = lineHeight,
+                fontFamily = fontFamily,
+                textDecoration = textDecoration,
+                fontStyle = fontStyle,
+                letterSpacing = letterSpacing
+            ),
         onTextLayout = onTextLayout,
         overflow = overflow,
         softWrap = softWrap,
@@ -206,57 +208,58 @@
  * High level element that displays text and provides semantics / accessibility information.
  *
  * The default [style] uses the [LocalTextStyle] provided by the [MaterialTheme] / components. If
- * you are setting your own style, you may want to consider first retrieving [LocalTextStyle],
- * and using [TextStyle.copy] to keep any theme defined attributes, only modifying the specific
+ * you are setting your own style, you may want to consider first retrieving [LocalTextStyle], and
+ * using [TextStyle.copy] to keep any theme defined attributes, only modifying the specific
  * attributes you want to override.
  *
  * For ease of use, commonly used parameters from [TextStyle] are also present here. The order of
  * precedence is as follows:
- * - If a parameter is explicitly set here (i.e, it is _not_ `null` or [TextUnit.Unspecified]),
- * then this parameter will always be used.
+ * - If a parameter is explicitly set here (i.e, it is _not_ `null` or [TextUnit.Unspecified]), then
+ *   this parameter will always be used.
  * - If a parameter is _not_ set, (`null` or [TextUnit.Unspecified]), then the corresponding value
- * from [style] will be used instead.
+ *   from [style] will be used instead.
  *
  * Additionally, for [color], if [color] is not set, and [style] does not have a color, then
- * [LocalContentColor] will be used with an alpha of [LocalContentAlpha]- this allows this
- * [Text] or element containing this [Text] to adapt to different background colors and still
- * maintain contrast and accessibility.
+ * [LocalContentColor] will be used with an alpha of [LocalContentAlpha]- this allows this [Text] or
+ * element containing this [Text] to adapt to different background colors and still maintain
+ * contrast and accessibility.
  *
  * See an example of displaying text with links where links apply the styling from the theme:
+ *
  * @sample androidx.compose.material.samples.TextWithLinks
  *
  * @param text The text to be displayed.
  * @param modifier [Modifier] to apply to this layout node.
  * @param color [Color] to apply to the text. If [Color.Unspecified], and [style] has no color set,
- * this will be [LocalContentColor].
+ *   this will be [LocalContentColor].
  * @param fontSize The size of glyphs to use when painting the text. See [TextStyle.fontSize].
- * @param fontStyle The typeface variant to use when drawing the letters (e.g., italic).
- * See [TextStyle.fontStyle].
+ * @param fontStyle The typeface variant to use when drawing the letters (e.g., italic). See
+ *   [TextStyle.fontStyle].
  * @param fontWeight The typeface thickness to use when painting the text (e.g., [FontWeight.Bold]).
  * @param fontFamily The font family to be used when rendering the text. See [TextStyle.fontFamily].
- * @param letterSpacing The amount of space to add between each letter.
- * See [TextStyle.letterSpacing].
- * @param textDecoration The decorations to paint on the text (e.g., an underline).
- * See [TextStyle.textDecoration].
- * @param textAlign The alignment of the text within the lines of the paragraph.
- * See [TextStyle.textAlign].
- * @param lineHeight Line height for the [Paragraph] in [TextUnit] unit, e.g. SP or EM.
- * See [TextStyle.lineHeight].
+ * @param letterSpacing The amount of space to add between each letter. See
+ *   [TextStyle.letterSpacing].
+ * @param textDecoration The decorations to paint on the text (e.g., an underline). See
+ *   [TextStyle.textDecoration].
+ * @param textAlign The alignment of the text within the lines of the paragraph. See
+ *   [TextStyle.textAlign].
+ * @param lineHeight Line height for the [Paragraph] in [TextUnit] unit, e.g. SP or EM. See
+ *   [TextStyle.lineHeight].
  * @param overflow How visual overflow should be handled.
  * @param softWrap Whether the text should break at soft line breaks. If false, the glyphs in the
- * text will be positioned as if there was unlimited horizontal space. If [softWrap] is false,
- * [overflow] and TextAlign may have unexpected effects.
- * @param maxLines An optional maximum number of lines for the text to span, wrapping if
- * necessary. If the text exceeds the given number of lines, it will be truncated according to
- * [overflow] and [softWrap]. It is required that 1 <= [minLines] <= [maxLines].
+ *   text will be positioned as if there was unlimited horizontal space. If [softWrap] is false,
+ *   [overflow] and TextAlign may have unexpected effects.
+ * @param maxLines An optional maximum number of lines for the text to span, wrapping if necessary.
+ *   If the text exceeds the given number of lines, it will be truncated according to [overflow] and
+ *   [softWrap]. It is required that 1 <= [minLines] <= [maxLines].
  * @param minLines The minimum height in terms of minimum number of visible lines. It is required
- * that 1 <= [minLines] <= [maxLines].
- * @param inlineContent A map store composables that replaces certain ranges of the text. It's
- * used to insert composables into text layout. Check [InlineTextContent] for more information.
+ *   that 1 <= [minLines] <= [maxLines].
+ * @param inlineContent A map store composables that replaces certain ranges of the text. It's used
+ *   to insert composables into text layout. Check [InlineTextContent] for more information.
  * @param onTextLayout Callback that is executed when a new text layout is calculated. A
- * [TextLayoutResult] object that callback provides contains paragraph information, size of the
- * text, baselines and other details. The callback can be used to add additional decoration or
- * functionality to the text. For example, to draw selection around the text.
+ *   [TextLayoutResult] object that callback provides contains paragraph information, size of the
+ *   text, baselines and other details. The callback can be used to add additional decoration or
+ *   functionality to the text. For example, to draw selection around the text.
  * @param style Style configuration for the text such as color, font, line height etc.
  */
 @Composable
@@ -299,27 +302,29 @@
     // profilers and benchmarks.
     val localContentColor = LocalContentColor.current
     val localContentAlpha = LocalContentAlpha.current
-    val overrideColorOrUnspecified = if (color.isSpecified) {
-        color
-    } else if (style.color.isSpecified) {
-        style.color
-    } else {
-        localContentColor.copy(localContentAlpha)
-    }
+    val overrideColorOrUnspecified =
+        if (color.isSpecified) {
+            color
+        } else if (style.color.isSpecified) {
+            style.color
+        } else {
+            localContentColor.copy(localContentAlpha)
+        }
 
     BasicText(
         text = text,
         modifier = modifier,
-        style = style.merge(
-            fontSize = fontSize,
-            fontWeight = fontWeight,
-            textAlign = textAlign ?: TextAlign.Unspecified,
-            lineHeight = lineHeight,
-            fontFamily = fontFamily,
-            textDecoration = textDecoration,
-            fontStyle = fontStyle,
-            letterSpacing = letterSpacing
-        ),
+        style =
+            style.merge(
+                fontSize = fontSize,
+                fontWeight = fontWeight,
+                textAlign = textAlign ?: TextAlign.Unspecified,
+                lineHeight = lineHeight,
+                fontFamily = fontFamily,
+                textDecoration = textDecoration,
+                fontStyle = fontStyle,
+                letterSpacing = letterSpacing
+            ),
         onTextLayout = onTextLayout,
         overflow = overflow,
         softWrap = softWrap,
@@ -387,9 +392,9 @@
 
 // TODO: b/156598010 remove this and replace with fold definition on the backing CompositionLocal
 /**
- * This function is used to set the current value of [LocalTextStyle], merging the given style
- * with the current style values for any missing attributes. Any [Text] components included in
- * this component's [content] will be styled with this style unless styled explicitly.
+ * This function is used to set the current value of [LocalTextStyle], merging the given style with
+ * the current style values for any missing attributes. Any [Text] components included in this
+ * component's [content] will be styled with this style unless styled explicitly.
  *
  * @see LocalTextStyle
  */
diff --git a/compose/material/material/src/commonMain/kotlin/androidx/compose/material/TextField.kt b/compose/material/material/src/commonMain/kotlin/androidx/compose/material/TextField.kt
index b85ec36..c641643 100644
--- a/compose/material/material/src/commonMain/kotlin/androidx/compose/material/TextField.kt
+++ b/compose/material/material/src/commonMain/kotlin/androidx/compose/material/TextField.kt
@@ -67,12 +67,14 @@
 import kotlin.math.roundToInt
 
 /**
- * <a href="https://material.io/components/text-fields#filled-text-field" class="external" target="_blank">Material Design filled text field</a>.
+ * <a href="https://material.io/components/text-fields#filled-text-field" class="external"
+ * target="_blank">Material Design filled text field</a>.
  *
  * Filled text fields have more visual emphasis than outlined text fields, making them stand out
  * when surrounded by other content and components.
  *
- * ![Filled text field image](https://developer.android.com/images/reference/androidx/compose/material/filled-text-field.png)
+ * ![Filled text field
+ * image](https://developer.android.com/images/reference/androidx/compose/material/filled-text-field.png)
  *
  * If you are looking for an outlined version, see [OutlinedTextField].
  *
@@ -104,57 +106,57 @@
  *
  * @sample androidx.compose.material.samples.TextFieldWithHideKeyboardOnImeAction
  *
- * If apart from input text change you also want to observe the cursor location, selection range,
- * or IME composition use the TextField overload with the [TextFieldValue] parameter instead.
+ * If apart from input text change you also want to observe the cursor location, selection range, or
+ * IME composition use the TextField overload with the [TextFieldValue] parameter instead.
  *
  * @param value the input text to be shown in the text field
  * @param onValueChange the callback that is triggered when the input service updates the text. An
- * updated text comes as a parameter of the callback
+ *   updated text comes as a parameter of the callback
  * @param modifier a [Modifier] for this text field
  * @param enabled controls the enabled state of the [TextField]. When `false`, the text field will
- * be neither editable nor focusable, the input of the text field will not be selectable,
- * visually text field will appear in the disabled UI state
- * @param readOnly controls the editable state of the [TextField]. When `true`, the text
- * field can not be modified, however, a user can focus it and copy text from it. Read-only text
- * fields are usually used to display pre-filled forms that user can not edit
+ *   be neither editable nor focusable, the input of the text field will not be selectable, visually
+ *   text field will appear in the disabled UI state
+ * @param readOnly controls the editable state of the [TextField]. When `true`, the text field can
+ *   not be modified, however, a user can focus it and copy text from it. Read-only text fields are
+ *   usually used to display pre-filled forms that user can not edit
  * @param textStyle the style to be applied to the input text. The default [textStyle] uses the
- * [LocalTextStyle] defined by the theme
- * @param label the optional label to be displayed inside the text field container. The default
- * text style for internal [Text] is [Typography.caption] when the text field is in focus and
- * [Typography.subtitle1] when the text field is not in focus
+ *   [LocalTextStyle] defined by the theme
+ * @param label the optional label to be displayed inside the text field container. The default text
+ *   style for internal [Text] is [Typography.caption] when the text field is in focus and
+ *   [Typography.subtitle1] when the text field is not in focus
  * @param placeholder the optional placeholder to be displayed when the text field is in focus and
- * the input text is empty. The default text style for internal [Text] is [Typography.subtitle1]
+ *   the input text is empty. The default text style for internal [Text] is [Typography.subtitle1]
  * @param leadingIcon the optional leading icon to be displayed at the beginning of the text field
- * container
+ *   container
  * @param trailingIcon the optional trailing icon to be displayed at the end of the text field
- * container
+ *   container
  * @param isError indicates if the text field's current value is in error. If set to true, the
- * label, bottom indicator and trailing icon by default will be displayed in error color
- * @param visualTransformation transforms the visual representation of the input [value]
- * For example, you can use
- * [PasswordVisualTransformation][androidx.compose.ui.text.input.PasswordVisualTransformation] to
- * create a password text field. By default no visual transformation is applied
+ *   label, bottom indicator and trailing icon by default will be displayed in error color
+ * @param visualTransformation transforms the visual representation of the input [value] For
+ *   example, you can use
+ *   [PasswordVisualTransformation][androidx.compose.ui.text.input.PasswordVisualTransformation] to
+ *   create a password text field. By default no visual transformation is applied
  * @param keyboardOptions software keyboard options that contains configuration such as
- * [KeyboardType] and [ImeAction].
- * @param keyboardActions when the input service emits an IME action, the corresponding callback
- * is called. Note that this IME action may be different from what you specified in
- * [KeyboardOptions.imeAction].
- * @param singleLine when set to true, this text field becomes a single horizontally scrolling
- * text field instead of wrapping onto multiple lines. The keyboard will be informed to not show
- * the return key as the [ImeAction]. Note that [maxLines] parameter will be ignored as the
- * maxLines attribute will be automatically set to 1.
+ *   [KeyboardType] and [ImeAction].
+ * @param keyboardActions when the input service emits an IME action, the corresponding callback is
+ *   called. Note that this IME action may be different from what you specified in
+ *   [KeyboardOptions.imeAction].
+ * @param singleLine when set to true, this text field becomes a single horizontally scrolling text
+ *   field instead of wrapping onto multiple lines. The keyboard will be informed to not show the
+ *   return key as the [ImeAction]. Note that [maxLines] parameter will be ignored as the maxLines
+ *   attribute will be automatically set to 1.
  * @param maxLines the maximum height in terms of maximum number of visible lines. It is required
- * that 1 <= [minLines] <= [maxLines]. This parameter is ignored when [singleLine] is true.
+ *   that 1 <= [minLines] <= [maxLines]. This parameter is ignored when [singleLine] is true.
  * @param minLines the minimum height in terms of minimum number of visible lines. It is required
- * that 1 <= [minLines] <= [maxLines]. This parameter is ignored when [singleLine] is true.
+ *   that 1 <= [minLines] <= [maxLines]. This parameter is ignored when [singleLine] is true.
  * @param interactionSource an optional hoisted [MutableInteractionSource] for observing and
- * emitting [Interaction]s for this text field. You can use this to change the text field's
- * appearance or preview the text field in different states. Note that if `null` is provided,
- * interactions will still happen internally.
+ *   emitting [Interaction]s for this text field. You can use this to change the text field's
+ *   appearance or preview the text field in different states. Note that if `null` is provided,
+ *   interactions will still happen internally.
  * @param shape the shape of the text field's container
  * @param colors [TextFieldColors] that will be used to resolve color of the text, content
- * (including label, placeholder, leading and trailing icons, indicator line) and background for
- * this text field in different states. See [TextFieldDefaults.textFieldColors]
+ *   (including label, placeholder, leading and trailing icons, indicator line) and background for
+ *   this text field in different states. See [TextFieldDefaults.textFieldColors]
  */
 @Composable
 fun TextField(
@@ -182,21 +184,20 @@
     @Suppress("NAME_SHADOWING")
     val interactionSource = interactionSource ?: remember { MutableInteractionSource() }
     // If color is not provided via the text style, use content color as a default
-    val textColor = textStyle.color.takeOrElse {
-        colors.textColor(enabled).value
-    }
+    val textColor = textStyle.color.takeOrElse { colors.textColor(enabled).value }
     val mergedTextStyle = textStyle.merge(TextStyle(color = textColor))
 
     @OptIn(ExperimentalMaterialApi::class)
     BasicTextField(
         value = value,
-        modifier = modifier
-            .indicatorLine(enabled, isError, interactionSource, colors)
-            .defaultErrorSemantics(isError, getString(Strings.DefaultErrorMessage))
-            .defaultMinSize(
-                minWidth = TextFieldDefaults.MinWidth,
-                minHeight = TextFieldDefaults.MinHeight
-            ),
+        modifier =
+            modifier
+                .indicatorLine(enabled, isError, interactionSource, colors)
+                .defaultErrorSemantics(isError, getString(Strings.DefaultErrorMessage))
+                .defaultMinSize(
+                    minWidth = TextFieldDefaults.MinWidth,
+                    minHeight = TextFieldDefaults.MinHeight
+                ),
         onValueChange = onValueChange,
         enabled = enabled,
         readOnly = readOnly,
@@ -209,24 +210,25 @@
         singleLine = singleLine,
         maxLines = maxLines,
         minLines = minLines,
-        decorationBox = @Composable { innerTextField ->
-            // places leading icon, text field with label and placeholder, trailing icon
-            TextFieldDefaults.TextFieldDecorationBox(
-                value = value,
-                visualTransformation = visualTransformation,
-                innerTextField = innerTextField,
-                placeholder = placeholder,
-                label = label,
-                leadingIcon = leadingIcon,
-                trailingIcon = trailingIcon,
-                singleLine = singleLine,
-                enabled = enabled,
-                isError = isError,
-                interactionSource = interactionSource,
-                shape = shape,
-                colors = colors,
-            )
-        }
+        decorationBox =
+            @Composable { innerTextField ->
+                // places leading icon, text field with label and placeholder, trailing icon
+                TextFieldDefaults.TextFieldDecorationBox(
+                    value = value,
+                    visualTransformation = visualTransformation,
+                    innerTextField = innerTextField,
+                    placeholder = placeholder,
+                    label = label,
+                    leadingIcon = leadingIcon,
+                    trailingIcon = trailingIcon,
+                    singleLine = singleLine,
+                    enabled = enabled,
+                    isError = isError,
+                    interactionSource = interactionSource,
+                    shape = shape,
+                    colors = colors,
+                )
+            }
     )
 }
 
@@ -282,70 +284,73 @@
 }
 
 /**
- * <a href="https://material.io/components/text-fields#filled-text-field" class="external" target="_blank">Material Design filled text field</a>.
+ * <a href="https://material.io/components/text-fields#filled-text-field" class="external"
+ * target="_blank">Material Design filled text field</a>.
  *
  * Filled text fields have more visual emphasis than outlined text fields, making them stand out
  * when surrounded by other content and components.
  *
- * ![Filled text field image](https://developer.android.com/images/reference/androidx/compose/material/filled-text-field.png)
+ * ![Filled text field
+ * image](https://developer.android.com/images/reference/androidx/compose/material/filled-text-field.png)
  *
  * If you are looking for an outlined version, see [OutlinedTextField].
  *
  * See example usage:
+ *
  * @sample androidx.compose.material.samples.TextFieldSample
  *
- * This overload provides access to the input text, cursor position, selection range and
- * IME composition. If you only want to observe an input text change, use the TextField
- * overload with the [String] parameter instead.
+ * This overload provides access to the input text, cursor position, selection range and IME
+ * composition. If you only want to observe an input text change, use the TextField overload with
+ * the [String] parameter instead.
  *
  * @param value the input [TextFieldValue] to be shown in the text field
  * @param onValueChange the callback that is triggered when the input service updates values in
- * [TextFieldValue]. An updated [TextFieldValue] comes as a parameter of the callback
+ *   [TextFieldValue]. An updated [TextFieldValue] comes as a parameter of the callback
  * @param modifier a [Modifier] for this text field
  * @param enabled controls the enabled state of the [TextField]. When `false`, the text field will
- * be neither editable nor focusable, the input of the text field will not be selectable,
- * visually text field will appear in the disabled UI state
- * @param readOnly controls the editable state of the [TextField]. When `true`, the text
- * field can not be modified, however, a user can focus it and copy text from it. Read-only text
- * fields are usually used to display pre-filled forms that user can not edit
+ *   be neither editable nor focusable, the input of the text field will not be selectable, visually
+ *   text field will appear in the disabled UI state
+ * @param readOnly controls the editable state of the [TextField]. When `true`, the text field can
+ *   not be modified, however, a user can focus it and copy text from it. Read-only text fields are
+ *   usually used to display pre-filled forms that user can not edit
  * @param textStyle the style to be applied to the input text. The default [textStyle] uses the
- * [LocalTextStyle] defined by the theme
- * @param label the optional label to be displayed inside the text field container. The default
- * text style for internal [Text] is [Typography.caption] when the text field is in focus and
- * [Typography.subtitle1] when the text field is not in focus
+ *   [LocalTextStyle] defined by the theme
+ * @param label the optional label to be displayed inside the text field container. The default text
+ *   style for internal [Text] is [Typography.caption] when the text field is in focus and
+ *   [Typography.subtitle1] when the text field is not in focus
  * @param placeholder the optional placeholder to be displayed when the text field is in focus and
- * the input text is empty. The default text style for internal [Text] is [Typography.subtitle1]
+ *   the input text is empty. The default text style for internal [Text] is [Typography.subtitle1]
  * @param leadingIcon the optional leading icon to be displayed at the beginning of the text field
- * container
+ *   container
  * @param trailingIcon the optional trailing icon to be displayed at the end of the text field
- * container
- * @param isError indicates if the text field's current value is in error state. If set to
- * true, the label, bottom indicator and trailing icon by default will be displayed in error color
- * @param visualTransformation transforms the visual representation of the input [value].
- * For example, you can use
- * [PasswordVisualTransformation][androidx.compose.ui.text.input.PasswordVisualTransformation] to
- * create a password text field. By default no visual transformation is applied
+ *   container
+ * @param isError indicates if the text field's current value is in error state. If set to true, the
+ *   label, bottom indicator and trailing icon by default will be displayed in error color
+ * @param visualTransformation transforms the visual representation of the input [value]. For
+ *   example, you can use
+ *   [PasswordVisualTransformation][androidx.compose.ui.text.input.PasswordVisualTransformation] to
+ *   create a password text field. By default no visual transformation is applied
  * @param keyboardOptions software keyboard options that contains configuration such as
- * [KeyboardType] and [ImeAction].
- * @param keyboardActions when the input service emits an IME action, the corresponding callback
- * is called. Note that this IME action may be different from what you specified in
- * [KeyboardOptions.imeAction].
- * @param singleLine when set to true, this text field becomes a single horizontally scrolling
- * text field instead of wrapping onto multiple lines. The keyboard will be informed to not show
- * the return key as the [ImeAction]. Note that [maxLines] parameter will be ignored as the
- * maxLines attribute will be automatically set to 1.
+ *   [KeyboardType] and [ImeAction].
+ * @param keyboardActions when the input service emits an IME action, the corresponding callback is
+ *   called. Note that this IME action may be different from what you specified in
+ *   [KeyboardOptions.imeAction].
+ * @param singleLine when set to true, this text field becomes a single horizontally scrolling text
+ *   field instead of wrapping onto multiple lines. The keyboard will be informed to not show the
+ *   return key as the [ImeAction]. Note that [maxLines] parameter will be ignored as the maxLines
+ *   attribute will be automatically set to 1.
  * @param maxLines the maximum height in terms of maximum number of visible lines. It is required
- * that 1 <= [minLines] <= [maxLines]. This parameter is ignored when [singleLine] is true.
+ *   that 1 <= [minLines] <= [maxLines]. This parameter is ignored when [singleLine] is true.
  * @param minLines the minimum height in terms of minimum number of visible lines. It is required
- * that 1 <= [minLines] <= [maxLines]. This parameter is ignored when [singleLine] is true.
+ *   that 1 <= [minLines] <= [maxLines]. This parameter is ignored when [singleLine] is true.
  * @param interactionSource an optional hoisted [MutableInteractionSource] for observing and
- * emitting [Interaction]s for this text field. You can use this to change the text field's
- * appearance or preview the text field in different states. Note that if `null` is provided,
- * interactions will still happen internally.
+ *   emitting [Interaction]s for this text field. You can use this to change the text field's
+ *   appearance or preview the text field in different states. Note that if `null` is provided,
+ *   interactions will still happen internally.
  * @param shape the shape of the text field's container
  * @param colors [TextFieldColors] that will be used to resolve color of the text, content
- * (including label, placeholder, leading and trailing icons, indicator line) and background for
- * this text field in different states. See [TextFieldDefaults.textFieldColors]
+ *   (including label, placeholder, leading and trailing icons, indicator line) and background for
+ *   this text field in different states. See [TextFieldDefaults.textFieldColors]
  */
 @Composable
 fun TextField(
@@ -373,21 +378,20 @@
     @Suppress("NAME_SHADOWING")
     val interactionSource = interactionSource ?: remember { MutableInteractionSource() }
     // If color is not provided via the text style, use content color as a default
-    val textColor = textStyle.color.takeOrElse {
-        colors.textColor(enabled).value
-    }
+    val textColor = textStyle.color.takeOrElse { colors.textColor(enabled).value }
     val mergedTextStyle = textStyle.merge(TextStyle(color = textColor))
 
     @OptIn(ExperimentalMaterialApi::class)
     BasicTextField(
         value = value,
-        modifier = modifier
-            .indicatorLine(enabled, isError, interactionSource, colors)
-            .defaultErrorSemantics(isError, getString(Strings.DefaultErrorMessage))
-            .defaultMinSize(
-                minWidth = TextFieldDefaults.MinWidth,
-                minHeight = TextFieldDefaults.MinHeight
-            ),
+        modifier =
+            modifier
+                .indicatorLine(enabled, isError, interactionSource, colors)
+                .defaultErrorSemantics(isError, getString(Strings.DefaultErrorMessage))
+                .defaultMinSize(
+                    minWidth = TextFieldDefaults.MinWidth,
+                    minHeight = TextFieldDefaults.MinHeight
+                ),
         onValueChange = onValueChange,
         enabled = enabled,
         readOnly = readOnly,
@@ -400,24 +404,25 @@
         singleLine = singleLine,
         maxLines = maxLines,
         minLines = minLines,
-        decorationBox = @Composable { innerTextField ->
-            // places leading icon, text field with label and placeholder, trailing icon
-            TextFieldDefaults.TextFieldDecorationBox(
-                value = value.text,
-                visualTransformation = visualTransformation,
-                innerTextField = innerTextField,
-                placeholder = placeholder,
-                label = label,
-                leadingIcon = leadingIcon,
-                trailingIcon = trailingIcon,
-                singleLine = singleLine,
-                enabled = enabled,
-                isError = isError,
-                interactionSource = interactionSource,
-                shape = shape,
-                colors = colors,
-            )
-        }
+        decorationBox =
+            @Composable { innerTextField ->
+                // places leading icon, text field with label and placeholder, trailing icon
+                TextFieldDefaults.TextFieldDecorationBox(
+                    value = value.text,
+                    visualTransformation = visualTransformation,
+                    innerTextField = innerTextField,
+                    placeholder = placeholder,
+                    label = label,
+                    leadingIcon = leadingIcon,
+                    trailingIcon = trailingIcon,
+                    singleLine = singleLine,
+                    enabled = enabled,
+                    isError = isError,
+                    interactionSource = interactionSource,
+                    shape = shape,
+                    colors = colors,
+                )
+            }
     )
 }
 
@@ -487,9 +492,10 @@
     animationProgress: Float,
     paddingValues: PaddingValues
 ) {
-    val measurePolicy = remember(singleLine, animationProgress, paddingValues) {
-        TextFieldMeasurePolicy(singleLine, animationProgress, paddingValues)
-    }
+    val measurePolicy =
+        remember(singleLine, animationProgress, paddingValues) {
+            TextFieldMeasurePolicy(singleLine, animationProgress, paddingValues)
+        }
     val layoutDirection = LocalLayoutDirection.current
     Layout(
         modifier = modifier,
@@ -513,20 +519,21 @@
 
             val startTextFieldPadding = paddingValues.calculateStartPadding(layoutDirection)
             val endTextFieldPadding = paddingValues.calculateEndPadding(layoutDirection)
-            val padding = Modifier.padding(
-                start = if (leading != null) {
-                    (startTextFieldPadding - HorizontalIconPadding).coerceAtLeast(
-                        0.dp
-                    )
-                } else {
-                    startTextFieldPadding
-                },
-                end = if (trailing != null) {
-                    (endTextFieldPadding - HorizontalIconPadding).coerceAtLeast(0.dp)
-                } else {
-                    endTextFieldPadding
-                }
-            )
+            val padding =
+                Modifier.padding(
+                    start =
+                        if (leading != null) {
+                            (startTextFieldPadding - HorizontalIconPadding).coerceAtLeast(0.dp)
+                        } else {
+                            startTextFieldPadding
+                        },
+                    end =
+                        if (trailing != null) {
+                            (endTextFieldPadding - HorizontalIconPadding).coerceAtLeast(0.dp)
+                        } else {
+                            endTextFieldPadding
+                        }
+                )
             if (placeholder != null) {
                 placeholder(Modifier.layoutId(PlaceholderId).then(padding))
             }
@@ -564,72 +571,75 @@
         val looseConstraints = constraints.copy(minWidth = 0, minHeight = 0)
         val leadingPlaceable =
             measurables.fastFirstOrNull { it.layoutId == LeadingId }?.measure(looseConstraints)
-        occupiedSpaceHorizontally += widthOrZero(
-            leadingPlaceable
-        )
+        occupiedSpaceHorizontally += widthOrZero(leadingPlaceable)
 
         // measure trailing icon
-        val trailingPlaceable = measurables.fastFirstOrNull { it.layoutId == TrailingId }
-            ?.measure(looseConstraints.offset(horizontal = -occupiedSpaceHorizontally))
-        occupiedSpaceHorizontally += widthOrZero(
-            trailingPlaceable
-        )
+        val trailingPlaceable =
+            measurables
+                .fastFirstOrNull { it.layoutId == TrailingId }
+                ?.measure(looseConstraints.offset(horizontal = -occupiedSpaceHorizontally))
+        occupiedSpaceHorizontally += widthOrZero(trailingPlaceable)
 
         // measure label
-        val labelConstraints = looseConstraints
-            .offset(
+        val labelConstraints =
+            looseConstraints.offset(
                 vertical = -bottomPaddingValue,
                 horizontal = -occupiedSpaceHorizontally
             )
         val labelPlaceable =
             measurables.fastFirstOrNull { it.layoutId == LabelId }?.measure(labelConstraints)
-        val lastBaseline = labelPlaceable?.get(LastBaseline)?.let {
-            if (it != AlignmentLine.Unspecified) it else labelPlaceable.height
-        } ?: 0
+        val lastBaseline =
+            labelPlaceable?.get(LastBaseline)?.let {
+                if (it != AlignmentLine.Unspecified) it else labelPlaceable.height
+            } ?: 0
         val effectiveLabelBaseline = max(lastBaseline, topPaddingValue)
 
         // measure input field
         // input field is laid out differently depending on whether the label is present or not
-        val verticalConstraintOffset = if (labelPlaceable != null) {
-            -bottomPaddingValue - topPadding - effectiveLabelBaseline
-        } else {
-            -topPaddingValue - bottomPaddingValue
-        }
-        val textFieldConstraints = constraints
-            .copy(minHeight = 0)
-            .offset(
-                vertical = verticalConstraintOffset,
-                horizontal = -occupiedSpaceHorizontally
-            )
-        val textFieldPlaceable = measurables
-            .fastFirst { it.layoutId == TextFieldId }
-            .measure(textFieldConstraints)
+        val verticalConstraintOffset =
+            if (labelPlaceable != null) {
+                -bottomPaddingValue - topPadding - effectiveLabelBaseline
+            } else {
+                -topPaddingValue - bottomPaddingValue
+            }
+        val textFieldConstraints =
+            constraints
+                .copy(minHeight = 0)
+                .offset(
+                    vertical = verticalConstraintOffset,
+                    horizontal = -occupiedSpaceHorizontally
+                )
+        val textFieldPlaceable =
+            measurables.fastFirst { it.layoutId == TextFieldId }.measure(textFieldConstraints)
 
         // measure placeholder
         val placeholderConstraints = textFieldConstraints.copy(minWidth = 0)
-        val placeholderPlaceable = measurables
-            .fastFirstOrNull { it.layoutId == PlaceholderId }
-            ?.measure(placeholderConstraints)
+        val placeholderPlaceable =
+            measurables
+                .fastFirstOrNull { it.layoutId == PlaceholderId }
+                ?.measure(placeholderConstraints)
 
-        val width = calculateWidth(
-            widthOrZero(leadingPlaceable),
-            widthOrZero(trailingPlaceable),
-            textFieldPlaceable.width,
-            widthOrZero(labelPlaceable),
-            widthOrZero(placeholderPlaceable),
-            constraints
-        )
-        val height = calculateHeight(
-            textFieldPlaceable.height,
-            labelPlaceable != null,
-            effectiveLabelBaseline,
-            heightOrZero(leadingPlaceable),
-            heightOrZero(trailingPlaceable),
-            heightOrZero(placeholderPlaceable),
-            constraints,
-            density,
-            paddingValues
-        )
+        val width =
+            calculateWidth(
+                widthOrZero(leadingPlaceable),
+                widthOrZero(trailingPlaceable),
+                textFieldPlaceable.width,
+                widthOrZero(labelPlaceable),
+                widthOrZero(placeholderPlaceable),
+                constraints
+            )
+        val height =
+            calculateHeight(
+                textFieldPlaceable.height,
+                labelPlaceable != null,
+                effectiveLabelBaseline,
+                heightOrZero(leadingPlaceable),
+                heightOrZero(trailingPlaceable),
+                heightOrZero(placeholderPlaceable),
+                constraints,
+                density,
+                paddingValues
+            )
 
         return layout(width, height) {
             if (labelPlaceable != null) {
@@ -708,18 +718,22 @@
     ): Int {
         val textFieldWidth =
             intrinsicMeasurer(measurables.fastFirst { it.layoutId == TextFieldId }, height)
-        val labelWidth = measurables.fastFirstOrNull { it.layoutId == LabelId }?.let {
-            intrinsicMeasurer(it, height)
-        } ?: 0
-        val trailingWidth = measurables.fastFirstOrNull { it.layoutId == TrailingId }?.let {
-            intrinsicMeasurer(it, height)
-        } ?: 0
-        val leadingWidth = measurables.fastFirstOrNull { it.layoutId == LeadingId }?.let {
-            intrinsicMeasurer(it, height)
-        } ?: 0
-        val placeholderWidth = measurables.fastFirstOrNull { it.layoutId == PlaceholderId }?.let {
-            intrinsicMeasurer(it, height)
-        } ?: 0
+        val labelWidth =
+            measurables
+                .fastFirstOrNull { it.layoutId == LabelId }
+                ?.let { intrinsicMeasurer(it, height) } ?: 0
+        val trailingWidth =
+            measurables
+                .fastFirstOrNull { it.layoutId == TrailingId }
+                ?.let { intrinsicMeasurer(it, height) } ?: 0
+        val leadingWidth =
+            measurables
+                .fastFirstOrNull { it.layoutId == LeadingId }
+                ?.let { intrinsicMeasurer(it, height) } ?: 0
+        val placeholderWidth =
+            measurables
+                .fastFirstOrNull { it.layoutId == PlaceholderId }
+                ?.let { intrinsicMeasurer(it, height) } ?: 0
         return calculateWidth(
             leadingWidth = leadingWidth,
             trailingWidth = trailingWidth,
@@ -736,28 +750,38 @@
         intrinsicMeasurer: (IntrinsicMeasurable, Int) -> Int
     ): Int {
         var remainingWidth = width
-        val leadingHeight = measurables.fastFirstOrNull { it.layoutId == LeadingId }?.let {
-            remainingWidth = remainingWidth.substractConstraintSafely(
-                it.maxIntrinsicWidth(Constraints.Infinity)
-            )
-            intrinsicMeasurer(it, width)
-        } ?: 0
-        val trailingHeight = measurables.fastFirstOrNull { it.layoutId == TrailingId }?.let {
-            remainingWidth = remainingWidth.substractConstraintSafely(
-                it.maxIntrinsicWidth(Constraints.Infinity)
-            )
-            intrinsicMeasurer(it, width)
-        } ?: 0
+        val leadingHeight =
+            measurables
+                .fastFirstOrNull { it.layoutId == LeadingId }
+                ?.let {
+                    remainingWidth =
+                        remainingWidth.substractConstraintSafely(
+                            it.maxIntrinsicWidth(Constraints.Infinity)
+                        )
+                    intrinsicMeasurer(it, width)
+                } ?: 0
+        val trailingHeight =
+            measurables
+                .fastFirstOrNull { it.layoutId == TrailingId }
+                ?.let {
+                    remainingWidth =
+                        remainingWidth.substractConstraintSafely(
+                            it.maxIntrinsicWidth(Constraints.Infinity)
+                        )
+                    intrinsicMeasurer(it, width)
+                } ?: 0
 
-        val labelHeight = measurables.fastFirstOrNull { it.layoutId == LabelId }?.let {
-            intrinsicMeasurer(it, remainingWidth)
-        } ?: 0
+        val labelHeight =
+            measurables
+                .fastFirstOrNull { it.layoutId == LabelId }
+                ?.let { intrinsicMeasurer(it, remainingWidth) } ?: 0
 
         val textFieldHeight =
             intrinsicMeasurer(measurables.fastFirst { it.layoutId == TextFieldId }, remainingWidth)
-        val placeholderHeight = measurables.fastFirstOrNull { it.layoutId == PlaceholderId }?.let {
-            intrinsicMeasurer(it, remainingWidth)
-        } ?: 0
+        val placeholderHeight =
+            measurables
+                .fastFirstOrNull { it.layoutId == PlaceholderId }
+                ?.let { intrinsicMeasurer(it, remainingWidth) } ?: 0
 
         return calculateHeight(
             textFieldHeight = textFieldHeight,
@@ -788,11 +812,7 @@
     placeholderWidth: Int,
     constraints: Constraints
 ): Int {
-    val middleSection = maxOf(
-        textFieldWidth,
-        labelWidth,
-        placeholderWidth
-    )
+    val middleSection = maxOf(textFieldWidth, labelWidth, placeholderWidth)
     val wrappedWidth = leadingWidth + middleSection + trailingWidth
     return max(wrappedWidth, constraints.minWidth)
 }
@@ -813,11 +833,12 @@
     val bottomPaddingValue = paddingValues.calculateBottomPadding().value * density
 
     val inputFieldHeight = max(textFieldHeight, placeholderHeight)
-    val middleSectionHeight = if (hasLabel) {
-        labelBaseline + paddingToLabel + inputFieldHeight + bottomPaddingValue
-    } else {
-        topPaddingValue + inputFieldHeight + bottomPaddingValue
-    }
+    val middleSectionHeight =
+        if (hasLabel) {
+            labelBaseline + paddingToLabel + inputFieldHeight + bottomPaddingValue
+        } else {
+            topPaddingValue + inputFieldHeight + bottomPaddingValue
+        }
     return maxOf(
         middleSectionHeight.roundToInt(),
         max(leadingHeight, trailingHeight),
@@ -855,13 +876,16 @@
         // if it's a single line, the label's start position is in the center of the
         // container. When it's a multiline text field, the label's start position is at the
         // top with padding
-        val startPosition = if (singleLine) {
-            Alignment.CenterVertically.align(it.height, height)
-        } else {
-            // even though the padding is defined by developer, it only affects text field when animation progress == 1,
-            // which is when text field is focused or non-empty input text. The start position of the label is always 16.dp.
-            (TextFieldPadding.value * density).roundToInt()
-        }
+        val startPosition =
+            if (singleLine) {
+                Alignment.CenterVertically.align(it.height, height)
+            } else {
+                // even though the padding is defined by developer, it only affects text field when
+                // animation progress == 1,
+                // which is when text field is focused or non-empty input text. The start position
+                // of the label is always 16.dp.
+                (TextFieldPadding.value * density).roundToInt()
+            }
         val distance = startPosition - labelEndPosition
         val positionY = startPosition - (distance * animationProgress).roundToInt()
         it.placeRelative(widthOrZero(leadingPlaceable), positionY)
@@ -871,8 +895,8 @@
 }
 
 /**
- * Places the provided text field and placeholder in [TextField] when there is no label. When
- * there is a label, [placeWithLabel] is used
+ * Places the provided text field and placeholder in [TextField] when there is no label. When there
+ * is a label, [placeWithLabel] is used
  */
 private fun Placeable.PlacementScope.placeWithoutLabel(
     width: Int,
@@ -898,33 +922,27 @@
 
     // Single line text field without label places its input center vertically. Multiline text
     // field without label places its input at the top with padding
-    val textVerticalPosition = if (singleLine) {
-        Alignment.CenterVertically.align(textPlaceable.height, height)
-    } else {
-        topPadding
-    }
-    textPlaceable.placeRelative(
-        widthOrZero(leadingPlaceable),
-        textVerticalPosition
-    )
-
-    // placeholder is placed similar to the text input above
-    placeholderPlaceable?.let {
-        val placeholderVerticalPosition = if (singleLine) {
-            Alignment.CenterVertically.align(placeholderPlaceable.height, height)
+    val textVerticalPosition =
+        if (singleLine) {
+            Alignment.CenterVertically.align(textPlaceable.height, height)
         } else {
             topPadding
         }
-        it.placeRelative(
-            widthOrZero(leadingPlaceable),
-            placeholderVerticalPosition
-        )
+    textPlaceable.placeRelative(widthOrZero(leadingPlaceable), textVerticalPosition)
+
+    // placeholder is placed similar to the text input above
+    placeholderPlaceable?.let {
+        val placeholderVerticalPosition =
+            if (singleLine) {
+                Alignment.CenterVertically.align(placeholderPlaceable.height, height)
+            } else {
+                topPadding
+            }
+        it.placeRelative(widthOrZero(leadingPlaceable), placeholderVerticalPosition)
     }
 }
 
-/**
- * A draw modifier that draws a bottom indicator line in [TextField]
- */
+/** A draw modifier that draws a bottom indicator line in [TextField] */
 internal fun Modifier.drawIndicatorLine(indicatorBorder: BorderStroke): Modifier {
     val strokeWidthDp = indicatorBorder.width
     return drawWithContent {
@@ -932,12 +950,7 @@
         if (strokeWidthDp == Dp.Hairline) return@drawWithContent
         val strokeWidth = strokeWidthDp.value * density
         val y = size.height - strokeWidth / 2
-        drawLine(
-            indicatorBorder.brush,
-            Offset(0f, y),
-            Offset(size.width, y),
-            strokeWidth
-        )
+        drawLine(indicatorBorder.brush, Offset(0f, y), Offset(size.width, y), strokeWidth)
     }
 }
 
diff --git a/compose/material/material/src/commonMain/kotlin/androidx/compose/material/TextFieldDefaults.kt b/compose/material/material/src/commonMain/kotlin/androidx/compose/material/TextFieldDefaults.kt
index 8f09e82..82f8ab8 100644
--- a/compose/material/material/src/commonMain/kotlin/androidx/compose/material/TextFieldDefaults.kt
+++ b/compose/material/material/src/commonMain/kotlin/androidx/compose/material/TextFieldDefaults.kt
@@ -52,9 +52,8 @@
  * Represents the colors of the input text, background and content (including label, placeholder,
  * leading and trailing icons) used in a text field in different states.
  *
- * See [TextFieldDefaults.textFieldColors] for the default colors used in [TextField].
- * See [TextFieldDefaults.outlinedTextFieldColors] for the default colors used in
- * [OutlinedTextField].
+ * See [TextFieldDefaults.textFieldColors] for the default colors used in [TextField]. See
+ * [TextFieldDefaults.outlinedTextFieldColors] for the default colors used in [OutlinedTextField].
  */
 @Stable
 interface TextFieldColors {
@@ -63,34 +62,31 @@
      *
      * @param enabled whether the text field is enabled
      */
-    @Composable
-    fun textColor(enabled: Boolean): State<Color>
+    @Composable fun textColor(enabled: Boolean): State<Color>
 
     /**
      * Represents the background color for this text field.
      *
      * @param enabled whether the text field is enabled
      */
-    @Composable
-    fun backgroundColor(enabled: Boolean): State<Color>
+    @Composable fun backgroundColor(enabled: Boolean): State<Color>
 
     /**
      * Represents the color used for the placeholder of this text field.
      *
      * @param enabled whether the text field is enabled
      */
-    @Composable
-    fun placeholderColor(enabled: Boolean): State<Color>
+    @Composable fun placeholderColor(enabled: Boolean): State<Color>
 
     /**
      * Represents the color used for the label of this text field.
      *
      * @param enabled whether the text field is enabled
      * @param error whether the text field should show error color according to the Material
-     * specifications. If the label is being used as a placeholder, this will be false even if
-     * the input is invalid, as the placeholder should not use the error color
+     *   specifications. If the label is being used as a placeholder, this will be false even if the
+     *   input is invalid, as the placeholder should not use the error color
      * @param interactionSource the [InteractionSource] of this text field. Helps to determine if
-     * the text field is in focus or not
+     *   the text field is in focus or not
      */
     @Composable
     fun labelColor(
@@ -119,7 +115,7 @@
      * @param enabled whether the text field is enabled
      * @param isError whether the text field's current value is in error
      * @param interactionSource the [InteractionSource] of this text field. Helps to determine if
-     * the text field is in focus or not
+     *   the text field is in focus or not
      */
     @Composable
     fun leadingIconColor(
@@ -127,8 +123,7 @@
         isError: Boolean,
         interactionSource: InteractionSource
     ): State<Color> {
-        @Suppress("DEPRECATION")
-        return leadingIconColor(enabled, isError)
+        @Suppress("DEPRECATION") return leadingIconColor(enabled, isError)
     }
 
     /**
@@ -139,8 +134,7 @@
      */
     @Deprecated(
         message = "Use/implement overload with interactionSource parameter",
-        replaceWith = ReplaceWith(
-            "trailingIconColor(enabled, isError, interactionSource)"),
+        replaceWith = ReplaceWith("trailingIconColor(enabled, isError, interactionSource)"),
         level = DeprecationLevel.WARNING,
     )
     @Composable
@@ -152,7 +146,7 @@
      * @param enabled whether the text field is enabled
      * @param isError whether the text field's current value is in error
      * @param interactionSource the [InteractionSource] of this text field. Helps to determine if
-     * the text field is in focus or not
+     *   the text field is in focus or not
      */
     @Composable
     fun trailingIconColor(
@@ -160,8 +154,7 @@
         isError: Boolean,
         interactionSource: InteractionSource
     ): State<Color> {
-        @Suppress("DEPRECATION")
-        return trailingIconColor(enabled, isError)
+        @Suppress("DEPRECATION") return trailingIconColor(enabled, isError)
     }
 
     /**
@@ -170,7 +163,7 @@
      * @param enabled whether the text field is enabled
      * @param isError whether the text field's current value is in error
      * @param interactionSource the [InteractionSource] of this text field. Helps to determine if
-     * the text field is in focus or not
+     *   the text field is in focus or not
      */
     @Composable
     fun indicatorColor(
@@ -184,63 +177,55 @@
      *
      * @param isError whether the text field's current value is in error
      */
-    @Composable
-    fun cursorColor(isError: Boolean): State<Color>
+    @Composable fun cursorColor(isError: Boolean): State<Color>
 }
 
 /**
- * Temporary experimental interface, to expose interactionSource to
- * leadingIconColor and trailingIconColor.
+ * Temporary experimental interface, to expose interactionSource to leadingIconColor and
+ * trailingIconColor.
  */
 @Deprecated(
     message = "Empty interface; use parent TextFieldColors instead",
-    replaceWith = ReplaceWith(
-        "TextFieldColors",
-        imports = ["androidx.compose.material.TextFieldColors"]
-    )
+    replaceWith =
+        ReplaceWith("TextFieldColors", imports = ["androidx.compose.material.TextFieldColors"])
 )
 @ExperimentalMaterialApi
 interface TextFieldColorsWithIcons : TextFieldColors
 
-/**
- * Contains the default values used by [TextField] and [OutlinedTextField].
- */
+/** Contains the default values used by [TextField] and [OutlinedTextField]. */
 @Immutable
 object TextFieldDefaults {
     /**
-     * The default min height applied to a [TextField] and [OutlinedTextField].
-     * Note that you can override it by applying Modifier.heightIn directly on a text field.
+     * The default min height applied to a [TextField] and [OutlinedTextField]. Note that you can
+     * override it by applying Modifier.heightIn directly on a text field.
      */
     val MinHeight = 56.dp
 
     /**
-     * The default min width applied to a [TextField] and [OutlinedTextField].
-     * Note that you can override it by applying Modifier.widthIn directly on a text field.
+     * The default min width applied to a [TextField] and [OutlinedTextField]. Note that you can
+     * override it by applying Modifier.widthIn directly on a text field.
      */
     val MinWidth = 280.dp
 
     /**
-     * The default opacity used for a [TextField]'s and [OutlinedTextField]'s leading and
-     * trailing icons color.
+     * The default opacity used for a [TextField]'s and [OutlinedTextField]'s leading and trailing
+     * icons color.
      */
     const val IconOpacity = 0.54f
 
-    /**
-     * The default shape used for a [TextField]'s background
-     */
+    /** The default shape used for a [TextField]'s background */
     val TextFieldShape: Shape
         @Composable
         @ReadOnlyComposable
-        get() = MaterialTheme.shapes.small
-            .copy(bottomEnd = ZeroCornerSize, bottomStart = ZeroCornerSize)
+        get() =
+            MaterialTheme.shapes.small.copy(
+                bottomEnd = ZeroCornerSize,
+                bottomStart = ZeroCornerSize
+            )
 
-    /**
-     * The default shape used for a [OutlinedTextField]'s background and border
-     */
+    /** The default shape used for a [OutlinedTextField]'s background and border */
     val OutlinedTextFieldShape: Shape
-        @Composable
-        @ReadOnlyComposable
-        get() = MaterialTheme.shapes.small
+        @Composable @ReadOnlyComposable get() = MaterialTheme.shapes.small
 
     /**
      * The default thickness of the border in [OutlinedTextField] or indicator line in [TextField]
@@ -254,15 +239,14 @@
      */
     val FocusedBorderThickness = 2.dp
 
-    /**
-     * The default opacity used for a [TextField]'s background color.
-     */
+    /** The default opacity used for a [TextField]'s background color. */
     const val BackgroundOpacity = 0.12f
 
-    // Filled text field uses 42% opacity to meet the contrast requirements for accessibility reasons
+    // Filled text field uses 42% opacity to meet the contrast requirements for accessibility
+    // reasons
     /**
-     * The default opacity used for a [TextField]'s indicator line color when text field is
-     * not focused.
+     * The default opacity used for a [TextField]'s indicator line color when text field is not
+     * focused.
      */
     const val UnfocusedIndicatorLineOpacity = 0.42f
 
@@ -274,11 +258,12 @@
      * @param enabled whether the text field is enabled
      * @param isError whether the text field's current value is in error
      * @param interactionSource the [InteractionSource] of this text field. Helps to determine if
-     * the text field is in focus or not
+     *   the text field is in focus or not
      * @param colors [TextFieldColors] used to resolve colors of the text field
-     * @param focusedIndicatorLineThickness thickness of the indicator line when text field is focused
-     * @param unfocusedIndicatorLineThickness thickness of the indicator line when text field is
-     * not focused
+     * @param focusedIndicatorLineThickness thickness of the indicator line when text field is
+     *   focused
+     * @param unfocusedIndicatorLineThickness thickness of the indicator line when text field is not
+     *   focused
      */
     @ExperimentalMaterialApi
     fun Modifier.indicatorLine(
@@ -288,40 +273,45 @@
         colors: TextFieldColors,
         focusedIndicatorLineThickness: Dp = FocusedBorderThickness,
         unfocusedIndicatorLineThickness: Dp = UnfocusedBorderThickness
-    ) = composed(inspectorInfo = debugInspectorInfo {
-        name = "indicatorLine"
-        properties["enabled"] = enabled
-        properties["isError"] = isError
-        properties["interactionSource"] = interactionSource
-        properties["colors"] = colors
-        properties["focusedIndicatorLineThickness"] = focusedIndicatorLineThickness
-        properties["unfocusedIndicatorLineThickness"] = unfocusedIndicatorLineThickness
-    }) {
-        val stroke = animateBorderStrokeAsState(
-            enabled,
-            isError,
-            interactionSource,
-            colors,
-            focusedIndicatorLineThickness,
-            unfocusedIndicatorLineThickness
-        )
-        Modifier.drawIndicatorLine(stroke.value)
-    }
+    ) =
+        composed(
+            inspectorInfo =
+                debugInspectorInfo {
+                    name = "indicatorLine"
+                    properties["enabled"] = enabled
+                    properties["isError"] = isError
+                    properties["interactionSource"] = interactionSource
+                    properties["colors"] = colors
+                    properties["focusedIndicatorLineThickness"] = focusedIndicatorLineThickness
+                    properties["unfocusedIndicatorLineThickness"] = unfocusedIndicatorLineThickness
+                }
+        ) {
+            val stroke =
+                animateBorderStrokeAsState(
+                    enabled,
+                    isError,
+                    interactionSource,
+                    colors,
+                    focusedIndicatorLineThickness,
+                    unfocusedIndicatorLineThickness
+                )
+            Modifier.drawIndicatorLine(stroke.value)
+        }
 
     /**
-     * Composable that draws a default border stroke in [OutlinedTextField]. You can use it to
-     * draw a border stroke in your custom text field based on [OutlinedTextFieldDecorationBox].
-     * The [OutlinedTextField] applies it automatically.
+     * Composable that draws a default border stroke in [OutlinedTextField]. You can use it to draw
+     * a border stroke in your custom text field based on [OutlinedTextFieldDecorationBox]. The
+     * [OutlinedTextField] applies it automatically.
      *
      * @param enabled whether the text field is enabled
      * @param isError whether the text field's current value is in error
      * @param interactionSource the [InteractionSource] of this text field. Helps to determine if
-     * the text field is in focus or not
+     *   the text field is in focus or not
      * @param colors [TextFieldColors] used to resolve colors of the text field
      * @param focusedBorderThickness thickness of the [OutlinedTextField]'s border when it is in
-     * focused state
+     *   focused state
      * @param unfocusedBorderThickness thickness of the [OutlinedTextField]'s border when it is not
-     * in focused state
+     *   in focused state
      */
     @ExperimentalMaterialApi
     @Composable
@@ -334,14 +324,15 @@
         focusedBorderThickness: Dp = FocusedBorderThickness,
         unfocusedBorderThickness: Dp = UnfocusedBorderThickness
     ) {
-        val borderStroke = animateBorderStrokeAsState(
-            enabled,
-            isError,
-            interactionSource,
-            colors,
-            focusedBorderThickness,
-            unfocusedBorderThickness
-        )
+        val borderStroke =
+            animateBorderStrokeAsState(
+                enabled,
+                isError,
+                interactionSource,
+                colors,
+                focusedBorderThickness,
+                unfocusedBorderThickness
+            )
         Box(Modifier.border(borderStroke.value, shape))
     }
 
@@ -350,8 +341,8 @@
      *
      * Note that when label is present, the "top" padding (unlike rest of the paddings) is a
      * distance between the label's last baseline and the top edge of the [TextField]. If the "top"
-     * value is smaller than the last baseline of the label, then there will be no space between
-     * the label and top edge of the [TextField].
+     * value is smaller than the last baseline of the label, then there will be no space between the
+     * label and top edge of the [TextField].
      *
      * See [PaddingValues]
      */
@@ -364,8 +355,8 @@
     ): PaddingValues = PaddingValues(start, top, end, bottom)
 
     /**
-     * Default content padding applied to [TextField] when the label is null.
-     * See [PaddingValues] for more details.
+     * Default content padding applied to [TextField] when the label is null. See [PaddingValues]
+     * for more details.
      */
     @ExperimentalMaterialApi
     fun textFieldWithoutLabelPadding(
@@ -376,8 +367,7 @@
     ): PaddingValues = PaddingValues(start, top, end, bottom)
 
     /**
-     * Default content padding applied to [OutlinedTextField].
-     * See [PaddingValues] for more details.
+     * Default content padding applied to [OutlinedTextField]. See [PaddingValues] for more details.
      */
     @ExperimentalMaterialApi
     fun outlinedTextFieldPadding(
@@ -398,22 +388,18 @@
         backgroundColor: Color = MaterialTheme.colors.onSurface.copy(alpha = BackgroundOpacity),
         cursorColor: Color = MaterialTheme.colors.primary,
         errorCursorColor: Color = MaterialTheme.colors.error,
-        focusedIndicatorColor: Color =
-            MaterialTheme.colors.primary.copy(alpha = ContentAlpha.high),
+        focusedIndicatorColor: Color = MaterialTheme.colors.primary.copy(alpha = ContentAlpha.high),
         unfocusedIndicatorColor: Color =
             MaterialTheme.colors.onSurface.copy(alpha = UnfocusedIndicatorLineOpacity),
         disabledIndicatorColor: Color = unfocusedIndicatorColor.copy(alpha = ContentAlpha.disabled),
         errorIndicatorColor: Color = MaterialTheme.colors.error,
-        leadingIconColor: Color =
-            MaterialTheme.colors.onSurface.copy(alpha = IconOpacity),
+        leadingIconColor: Color = MaterialTheme.colors.onSurface.copy(alpha = IconOpacity),
         disabledLeadingIconColor: Color = leadingIconColor.copy(alpha = ContentAlpha.disabled),
         errorLeadingIconColor: Color = leadingIconColor,
-        trailingIconColor: Color =
-            MaterialTheme.colors.onSurface.copy(alpha = IconOpacity),
+        trailingIconColor: Color = MaterialTheme.colors.onSurface.copy(alpha = IconOpacity),
         disabledTrailingIconColor: Color = trailingIconColor.copy(alpha = ContentAlpha.disabled),
         errorTrailingIconColor: Color = MaterialTheme.colors.error,
-        focusedLabelColor: Color =
-            MaterialTheme.colors.primary.copy(alpha = ContentAlpha.high),
+        focusedLabelColor: Color = MaterialTheme.colors.primary.copy(alpha = ContentAlpha.high),
         unfocusedLabelColor: Color = MaterialTheme.colors.onSurface.copy(ContentAlpha.medium),
         disabledLabelColor: Color = unfocusedLabelColor.copy(ContentAlpha.disabled),
         errorLabelColor: Color = MaterialTheme.colors.error,
@@ -456,22 +442,18 @@
         backgroundColor: Color = Color.Transparent,
         cursorColor: Color = MaterialTheme.colors.primary,
         errorCursorColor: Color = MaterialTheme.colors.error,
-        focusedBorderColor: Color =
-            MaterialTheme.colors.primary.copy(alpha = ContentAlpha.high),
+        focusedBorderColor: Color = MaterialTheme.colors.primary.copy(alpha = ContentAlpha.high),
         unfocusedBorderColor: Color =
             MaterialTheme.colors.onSurface.copy(alpha = ContentAlpha.disabled),
         disabledBorderColor: Color = unfocusedBorderColor.copy(alpha = ContentAlpha.disabled),
         errorBorderColor: Color = MaterialTheme.colors.error,
-        leadingIconColor: Color =
-            MaterialTheme.colors.onSurface.copy(alpha = IconOpacity),
+        leadingIconColor: Color = MaterialTheme.colors.onSurface.copy(alpha = IconOpacity),
         disabledLeadingIconColor: Color = leadingIconColor.copy(alpha = ContentAlpha.disabled),
         errorLeadingIconColor: Color = leadingIconColor,
-        trailingIconColor: Color =
-            MaterialTheme.colors.onSurface.copy(alpha = IconOpacity),
+        trailingIconColor: Color = MaterialTheme.colors.onSurface.copy(alpha = IconOpacity),
         disabledTrailingIconColor: Color = trailingIconColor.copy(alpha = ContentAlpha.disabled),
         errorTrailingIconColor: Color = MaterialTheme.colors.error,
-        focusedLabelColor: Color =
-            MaterialTheme.colors.primary.copy(alpha = ContentAlpha.high),
+        focusedLabelColor: Color = MaterialTheme.colors.primary.copy(alpha = ContentAlpha.high),
         unfocusedLabelColor: Color = MaterialTheme.colors.onSurface.copy(ContentAlpha.medium),
         disabledLabelColor: Color = unfocusedLabelColor.copy(ContentAlpha.disabled),
         errorLabelColor: Color = MaterialTheme.colors.error,
@@ -503,59 +485,63 @@
         )
 
     /**
-     * A decoration box which helps creating custom text fields based on
-     * <a href="https://material.io/components/text-fields#filled-text-field" class="external" target="_blank">Material Design filled text field</a>.
+     * A decoration box which helps creating custom text fields based on <a
+     * href="https://material.io/components/text-fields#filled-text-field" class="external"
+     * target="_blank">Material Design filled text field</a>.
      *
-     * If your text field requires customising elements that aren't exposed by [TextField],
-     * consider using this decoration box to achieve the desired design.
+     * If your text field requires customising elements that aren't exposed by [TextField], consider
+     * using this decoration box to achieve the desired design.
      *
      * For example, if you need to create a dense text field, use [contentPadding] parameter to
      * decrease the paddings around the input field. If you need to customise the bottom indicator,
      * apply [indicatorLine] modifier to achieve that.
      *
      * See example of using [TextFieldDecorationBox] to build your own custom text field
+     *
      * @sample androidx.compose.material.samples.CustomTextFieldBasedOnDecorationBox
-     *C
+     * C
+     *
      * @param value the input [String] shown by the text field
      * @param innerTextField input text field that this decoration box wraps. You will pass here a
-     * framework-controlled composable parameter "innerTextField" from the decorationBox lambda of
-     * the [BasicTextField]
-     * @param enabled controls the enabled state of the [TextField]. When `false`, visually
-     * text field will appear in the disabled UI state. You must also pass the same value to the
-     * [BasicTextField] for it to adjust the behavior accordingly making the text field non-editable,
-     * non-focusable and non-selectable
+     *   framework-controlled composable parameter "innerTextField" from the decorationBox lambda of
+     *   the [BasicTextField]
+     * @param enabled controls the enabled state of the [TextField]. When `false`, visually text
+     *   field will appear in the disabled UI state. You must also pass the same value to the
+     *   [BasicTextField] for it to adjust the behavior accordingly making the text field
+     *   non-editable, non-focusable and non-selectable
      * @param singleLine indicates if this is a single line or multi line text field. You must pass
-     * the same value as to [BasicTextField]
-     * @param visualTransformation transforms the visual representation of the input [value]. You must
-     * pass the same value as to [BasicTextField]
+     *   the same value as to [BasicTextField]
+     * @param visualTransformation transforms the visual representation of the input [value]. You
+     *   must pass the same value as to [BasicTextField]
      * @param interactionSource this is a read-only [InteractionSource] representing the stream of
-     * [Interaction]s for this text field. You first create and pass in your own remembered
-     * [MutableInteractionSource] to the [BasicTextField] for it to dispatch events. And then pass the
-     * same instance to this decoration box for it to observe [Interaction]s and customize the
-     * appearance / behavior in different [Interaction]s
-     * @param isError indicates if the text field's current value is in error state. If set to
-     * true, the label, bottom indicator and trailing icon by default will be displayed in error color
+     *   [Interaction]s for this text field. You first create and pass in your own remembered
+     *   [MutableInteractionSource] to the [BasicTextField] for it to dispatch events. And then pass
+     *   the same instance to this decoration box for it to observe [Interaction]s and customize the
+     *   appearance / behavior in different [Interaction]s
+     * @param isError indicates if the text field's current value is in error state. If set to true,
+     *   the label, bottom indicator and trailing icon by default will be displayed in error color
      * @param label the optional label to be displayed inside the text field container. The default
-     * text style for internal [Text] is [Typography.caption] when the text field is in focus and
-     * [Typography.subtitle1] when the text field is not in focus
-     * @param placeholder the optional placeholder to be displayed when the text field is in focus and
-     * the input text is empty. The default text style for internal [Text] is [Typography.subtitle1]
-     * @param leadingIcon the optional leading icon to be displayed at the beginning of the text field
-     * container
+     *   text style for internal [Text] is [Typography.caption] when the text field is in focus and
+     *   [Typography.subtitle1] when the text field is not in focus
+     * @param placeholder the optional placeholder to be displayed when the text field is in focus
+     *   and the input text is empty. The default text style for internal [Text] is
+     *   [Typography.subtitle1]
+     * @param leadingIcon the optional leading icon to be displayed at the beginning of the text
+     *   field container
      * @param trailingIcon the optional trailing icon to be displayed at the end of the text field
-     * container
+     *   container
      * @param shape the shape of the text field's container
      * @param colors [TextFieldColors] that will be used to resolve color of the text and content
-     * (including label, placeholder, leading and trailing icons, bottom indicator) for this text field in
-     * different states. See [TextFieldDefaults.textFieldColors]
-     * @param contentPadding the spacing values to apply internally between the internals of text field
-     * and the decoration box container. You can use it to implement dense text fields or simply to
-     * control horizontal padding. See [TextFieldDefaults.textFieldWithLabelPadding] and
-     * [TextFieldDefaults.textFieldWithoutLabelPadding]
-     * Note that if there's a label in the text field, the [top][PaddingValues.calculateTopPadding]
-     * padding will mean the distance from label's [last baseline][LastBaseline] to the top edge of the
-     * container. All other paddings mean the distance from the corresponding edge of the container to
-     * the corresponding edge of the closest to it element
+     *   (including label, placeholder, leading and trailing icons, bottom indicator) for this text
+     *   field in different states. See [TextFieldDefaults.textFieldColors]
+     * @param contentPadding the spacing values to apply internally between the internals of text
+     *   field and the decoration box container. You can use it to implement dense text fields or
+     *   simply to control horizontal padding. See [TextFieldDefaults.textFieldWithLabelPadding] and
+     *   [TextFieldDefaults.textFieldWithoutLabelPadding] Note that if there's a label in the text
+     *   field, the [top][PaddingValues.calculateTopPadding] padding will mean the distance from
+     *   label's [last baseline][LastBaseline] to the top edge of the container. All other paddings
+     *   mean the distance from the corresponding edge of the container to the corresponding edge of
+     *   the closest to it element
      */
     @Composable
     @ExperimentalMaterialApi
@@ -601,57 +587,60 @@
     }
 
     /**
-     * A decoration box which helps creating custom text fields based on
-     * <a href="https://material.io/components/text-fields#outlined-text-field" class="external" target="_blank">Material Design outlined text field</a>.
+     * A decoration box which helps creating custom text fields based on <a
+     * href="https://material.io/components/text-fields#outlined-text-field" class="external"
+     * target="_blank">Material Design outlined text field</a>.
      *
      * If your text field requires customising elements that aren't exposed by [OutlinedTextField],
      * consider using this decoration box to achieve the desired design.
      *
-     * For example, if you need to create a dense outlined text field, use [contentPadding] parameter to
-     * decrease the paddings around the input field. If you need to change the thickness of the border,
-     * use [border] parameter to achieve that.
+     * For example, if you need to create a dense outlined text field, use [contentPadding]
+     * parameter to decrease the paddings around the input field. If you need to change the
+     * thickness of the border, use [border] parameter to achieve that.
      *
      * Example of custom text field based on [OutlinedTextFieldDecorationBox]:
+     *
      * @sample androidx.compose.material.samples.CustomOutlinedTextFieldBasedOnDecorationBox
      *
      * @param value the input [String] shown by the text field
      * @param innerTextField input text field that this decoration box wraps. You will pass here a
-     * framework-controlled composable parameter "innerTextField" from the decorationBox lambda of the
-     * [BasicTextField]
+     *   framework-controlled composable parameter "innerTextField" from the decorationBox lambda of
+     *   the [BasicTextField]
      * @param enabled controls the enabled state of the [OutlinedTextField]. When `false`, visually
-     * text field will appear in the disabled UI state. You must also pass the same value to the
-     * [BasicTextField] for it to adjust the behavior accordingly making the text field non-editable,
-     * non-focusable and non-selectable
+     *   text field will appear in the disabled UI state. You must also pass the same value to the
+     *   [BasicTextField] for it to adjust the behavior accordingly making the text field
+     *   non-editable, non-focusable and non-selectable
      * @param singleLine indicates if this is a single line or multi line text field. You must pass
-     * the same value as to [BasicTextField]
-     * @param visualTransformation transforms the visual representation of the input [value]. You must
-     * pass the same value as to [BasicTextField]
+     *   the same value as to [BasicTextField]
+     * @param visualTransformation transforms the visual representation of the input [value]. You
+     *   must pass the same value as to [BasicTextField]
      * @param interactionSource this is a read-only [InteractionSource] representing the stream of
-     * [Interaction]s for this text field. You first create and pass in your own remembered
-     * [MutableInteractionSource] to the [BasicTextField] for it to dispatch events. And then pass the
-     * same instance to this decoration box for it to observe [Interaction]s and customize the
-     * appearance / behavior in different [Interaction]s.
-     * @param isError indicates if the text field's current value is in error state. If set to
-     * true, the label, bottom indicator and trailing icon by default will be displayed in error color
+     *   [Interaction]s for this text field. You first create and pass in your own remembered
+     *   [MutableInteractionSource] to the [BasicTextField] for it to dispatch events. And then pass
+     *   the same instance to this decoration box for it to observe [Interaction]s and customize the
+     *   appearance / behavior in different [Interaction]s.
+     * @param isError indicates if the text field's current value is in error state. If set to true,
+     *   the label, bottom indicator and trailing icon by default will be displayed in error color
      * @param label the optional label to be displayed inside the text field container. The default
-     * text style for internal [Text] is [Typography.caption] when the text field is in focus and
-     * [Typography.subtitle1] when the text field is not in focus
-     * @param placeholder the optional placeholder to be displayed when the text field is in focus and
-     * the input text is empty. The default text style for internal [Text] is [Typography.subtitle1]
-     * @param leadingIcon the optional leading icon to be displayed at the beginning of the text field
-     * container
+     *   text style for internal [Text] is [Typography.caption] when the text field is in focus and
+     *   [Typography.subtitle1] when the text field is not in focus
+     * @param placeholder the optional placeholder to be displayed when the text field is in focus
+     *   and the input text is empty. The default text style for internal [Text] is
+     *   [Typography.subtitle1]
+     * @param leadingIcon the optional leading icon to be displayed at the beginning of the text
+     *   field container
      * @param trailingIcon the optional trailing icon to be displayed at the end of the text field
-     * container
+     *   container
      * @param shape the shape of the text field's container and border
      * @param colors [TextFieldColors] that will be used to resolve color of the text and content
-     * (including label, placeholder, leading and trailing icons, border) for this text field in
-     * different states. See [TextFieldDefaults.outlinedTextFieldColors]
-     * @param border the border to be drawn around the text field. The cutout to fit the [label] will
-     * be automatically added by the framework. Note that by default the color of the border comes from
-     * the [colors].
-     * @param contentPadding the spacing values to apply internally between the internals of text field
-     * and the decoration box container. You can use it to implement dense text fields or simply to
-     * control horizontal padding. See [TextFieldDefaults.outlinedTextFieldPadding]
+     *   (including label, placeholder, leading and trailing icons, border) for this text field in
+     *   different states. See [TextFieldDefaults.outlinedTextFieldColors]
+     * @param border the border to be drawn around the text field. The cutout to fit the [label]
+     *   will be automatically added by the framework. Note that by default the color of the border
+     *   comes from the [colors].
+     * @param contentPadding the spacing values to apply internally between the internals of text
+     *   field and the decoration box container. You can use it to implement dense text fields or
+     *   simply to control horizontal padding. See [TextFieldDefaults.outlinedTextFieldPadding]
      */
     @Composable
     @ExperimentalMaterialApi
@@ -719,22 +708,23 @@
             } else {
                 textFieldWithLabelPadding()
             }
-    ) = TextFieldDecorationBox(
-        value = value,
-        innerTextField = innerTextField,
-        enabled = enabled,
-        singleLine = singleLine,
-        visualTransformation = visualTransformation,
-        interactionSource = interactionSource,
-        isError = isError,
-        label = label,
-        placeholder = placeholder,
-        leadingIcon = leadingIcon,
-        trailingIcon = trailingIcon,
-        shape = TextFieldShape,
-        colors = colors,
-        contentPadding = contentPadding,
-    )
+    ) =
+        TextFieldDecorationBox(
+            value = value,
+            innerTextField = innerTextField,
+            enabled = enabled,
+            singleLine = singleLine,
+            visualTransformation = visualTransformation,
+            interactionSource = interactionSource,
+            isError = isError,
+            label = label,
+            placeholder = placeholder,
+            leadingIcon = leadingIcon,
+            trailingIcon = trailingIcon,
+            shape = TextFieldShape,
+            colors = colors,
+            contentPadding = contentPadding,
+        )
 
     @Deprecated(
         level = DeprecationLevel.HIDDEN,
@@ -756,26 +746,25 @@
         trailingIcon: @Composable (() -> Unit)? = null,
         colors: TextFieldColors = outlinedTextFieldColors(),
         contentPadding: PaddingValues = outlinedTextFieldPadding(),
-        border: @Composable () -> Unit = {
-            BorderBox(enabled, isError, interactionSource, colors)
-        }
-    ) = OutlinedTextFieldDecorationBox(
-        value = value,
-        innerTextField = innerTextField,
-        enabled = enabled,
-        singleLine = singleLine,
-        visualTransformation = visualTransformation,
-        interactionSource = interactionSource,
-        isError = isError,
-        label = label,
-        placeholder = placeholder,
-        leadingIcon = leadingIcon,
-        trailingIcon = trailingIcon,
-        shape = OutlinedTextFieldShape,
-        colors = colors,
-        contentPadding = contentPadding,
-        border = border,
-    )
+        border: @Composable () -> Unit = { BorderBox(enabled, isError, interactionSource, colors) }
+    ) =
+        OutlinedTextFieldDecorationBox(
+            value = value,
+            innerTextField = innerTextField,
+            enabled = enabled,
+            singleLine = singleLine,
+            visualTransformation = visualTransformation,
+            interactionSource = interactionSource,
+            isError = isError,
+            label = label,
+            placeholder = placeholder,
+            leadingIcon = leadingIcon,
+            trailingIcon = trailingIcon,
+            shape = OutlinedTextFieldShape,
+            colors = colors,
+            contentPadding = contentPadding,
+            border = border,
+        )
 }
 
 @Immutable
@@ -865,12 +854,13 @@
     ): State<Color> {
         val focused by interactionSource.collectIsFocusedAsState()
 
-        val targetValue = when {
-            !enabled -> disabledIndicatorColor
-            isError -> errorIndicatorColor
-            focused -> focusedIndicatorColor
-            else -> unfocusedIndicatorColor
-        }
+        val targetValue =
+            when {
+                !enabled -> disabledIndicatorColor
+                isError -> errorIndicatorColor
+                focused -> focusedIndicatorColor
+                else -> unfocusedIndicatorColor
+            }
         return if (enabled) {
             animateColorAsState(targetValue, tween(durationMillis = AnimationDuration))
         } else {
@@ -896,12 +886,13 @@
     ): State<Color> {
         val focused by interactionSource.collectIsFocusedAsState()
 
-        val targetValue = when {
-            !enabled -> disabledLabelColor
-            error -> errorLabelColor
-            focused -> focusedLabelColor
-            else -> unfocusedLabelColor
-        }
+        val targetValue =
+            when {
+                !enabled -> disabledLabelColor
+                error -> errorLabelColor
+                focused -> focusedLabelColor
+                else -> unfocusedLabelColor
+            }
         return rememberUpdatedState(targetValue)
     }
 
@@ -984,11 +975,12 @@
     val focused by interactionSource.collectIsFocusedAsState()
     val indicatorColor = colors.indicatorColor(enabled, isError, interactionSource)
     val targetThickness = if (focused) focusedBorderThickness else unfocusedBorderThickness
-    val animatedThickness = if (enabled) {
-        animateDpAsState(targetThickness, tween(durationMillis = AnimationDuration))
-    } else {
-        rememberUpdatedState(unfocusedBorderThickness)
-    }
+    val animatedThickness =
+        if (enabled) {
+            animateDpAsState(targetThickness, tween(durationMillis = AnimationDuration))
+        } else {
+            rememberUpdatedState(unfocusedBorderThickness)
+        }
     return rememberUpdatedState(
         BorderStroke(animatedThickness.value, SolidColor(indicatorColor.value))
     )
diff --git a/compose/material/material/src/commonMain/kotlin/androidx/compose/material/TextFieldImpl.kt b/compose/material/material/src/commonMain/kotlin/androidx/compose/material/TextFieldImpl.kt
index 85a7722..e1e0d84 100644
--- a/compose/material/material/src/commonMain/kotlin/androidx/compose/material/TextFieldImpl.kt
+++ b/compose/material/material/src/commonMain/kotlin/androidx/compose/material/TextFieldImpl.kt
@@ -54,12 +54,11 @@
 import androidx.compose.ui.unit.dp
 
 internal enum class TextFieldType {
-    Filled, Outlined
+    Filled,
+    Outlined
 }
 
-/**
- * Implementation of the [TextField] and [OutlinedTextField]
- */
+/** Implementation of the [TextField] and [OutlinedTextField] */
 @OptIn(ExperimentalMaterialApi::class)
 @Composable
 internal fun CommonDecorationBox(
@@ -80,25 +79,31 @@
     colors: TextFieldColors,
     border: @Composable (() -> Unit)?,
 ) {
-    val transformedText = remember(value, visualTransformation) {
-        visualTransformation.filter(AnnotatedString(value))
-    }.text.text
+    val transformedText =
+        remember(value, visualTransformation) {
+                visualTransformation.filter(AnnotatedString(value))
+            }
+            .text
+            .text
 
     val isFocused = interactionSource.collectIsFocusedAsState().value
-    val inputState = when {
-        isFocused -> InputPhase.Focused
-        transformedText.isEmpty() -> InputPhase.UnfocusedEmpty
-        else -> InputPhase.UnfocusedNotEmpty
-    }
+    val inputState =
+        when {
+            isFocused -> InputPhase.Focused
+            transformedText.isEmpty() -> InputPhase.UnfocusedEmpty
+            else -> InputPhase.UnfocusedNotEmpty
+        }
 
     val labelColor: @Composable (InputPhase) -> Color = {
-        colors.labelColor(
-            enabled,
-            // if label is used as a placeholder (aka not as a small header
-            // at the top), we don't use an error color
-            if (it == InputPhase.UnfocusedEmpty) false else isError,
-            interactionSource
-        ).value
+        colors
+            .labelColor(
+                enabled,
+                // if label is used as a placeholder (aka not as a small header
+                // at the top), we don't use an error color
+                if (it == InputPhase.UnfocusedEmpty) false else isError,
+                interactionSource
+            )
+            .value
     }
 
     val typography = MaterialTheme.typography
@@ -110,28 +115,36 @@
 
     TextFieldTransitionScope.Transition(
         inputState = inputState,
-        focusedTextStyleColor = with(MaterialTheme.typography.caption.color) {
-            if (shouldOverrideTextStyleColor) this.takeOrElse { labelColor(inputState) } else this
-        },
-        unfocusedTextStyleColor = with(MaterialTheme.typography.subtitle1.color) {
-            if (shouldOverrideTextStyleColor) this.takeOrElse { labelColor(inputState) } else this
-        },
+        focusedTextStyleColor =
+            with(MaterialTheme.typography.caption.color) {
+                if (shouldOverrideTextStyleColor) this.takeOrElse { labelColor(inputState) }
+                else this
+            },
+        unfocusedTextStyleColor =
+            with(MaterialTheme.typography.subtitle1.color) {
+                if (shouldOverrideTextStyleColor) this.takeOrElse { labelColor(inputState) }
+                else this
+            },
         contentColor = labelColor,
         showLabel = label != null
     ) { labelProgress, labelTextStyleColor, labelContentColor, placeholderAlphaProgress ->
-
-        val decoratedLabel: @Composable (() -> Unit)? = label?.let {
-            @Composable {
-                val labelTextStyle = lerp(
-                    MaterialTheme.typography.subtitle1,
-                    MaterialTheme.typography.caption,
-                    labelProgress
-                ).let {
-                    if (shouldOverrideTextStyleColor) it.copy(color = labelTextStyleColor) else it
+        val decoratedLabel: @Composable (() -> Unit)? =
+            label?.let {
+                @Composable {
+                    val labelTextStyle =
+                        lerp(
+                                MaterialTheme.typography.subtitle1,
+                                MaterialTheme.typography.caption,
+                                labelProgress
+                            )
+                            .let {
+                                if (shouldOverrideTextStyleColor)
+                                    it.copy(color = labelTextStyleColor)
+                                else it
+                            }
+                    Decoration(labelContentColor, labelTextStyle, null, it)
                 }
-                Decoration(labelContentColor, labelTextStyle, null, it)
             }
-        }
 
         // Transparent components interfere with Talkback (b/261061240), so if the placeholder has
         // alpha == 0, we set the component to null instead.
@@ -149,21 +162,18 @@
             } else null
 
         val leadingIconColor = colors.leadingIconColor(enabled, isError, interactionSource).value
-        val decoratedLeading: @Composable (() -> Unit)? = leadingIcon?.let {
-            @Composable {
-                Decoration(contentColor = leadingIconColor, content = it)
+        val decoratedLeading: @Composable (() -> Unit)? =
+            leadingIcon?.let {
+                @Composable { Decoration(contentColor = leadingIconColor, content = it) }
             }
-        }
 
         val trailingIconColor = colors.trailingIconColor(enabled, isError, interactionSource).value
-        val decoratedTrailing: @Composable (() -> Unit)? = trailingIcon?.let {
-            @Composable {
-                Decoration(contentColor = trailingIconColor, content = it)
+        val decoratedTrailing: @Composable (() -> Unit)? =
+            trailingIcon?.let {
+                @Composable { Decoration(contentColor = trailingIconColor, content = it) }
             }
-        }
 
-        val backgroundModifier =
-            Modifier.background(colors.backgroundColor(enabled).value, shape)
+        val backgroundModifier = Modifier.background(colors.backgroundColor(enabled).value, shape)
 
         when (type) {
             TextFieldType.Filled -> {
@@ -202,8 +212,9 @@
                     onLabelMeasured = {
                         val labelWidth = it.width * labelProgress
                         val labelHeight = it.height * labelProgress
-                        if (labelSize.value.width != labelWidth ||
-                            labelSize.value.height != labelHeight
+                        if (
+                            labelSize.value.width != labelWidth ||
+                                labelSize.value.height != labelHeight
                         ) {
                             labelSize.value = Size(labelWidth, labelHeight)
                         }
@@ -217,9 +228,7 @@
     }
 }
 
-/**
- * Set content color, typography and emphasis for [content] composable
- */
+/** Set content color, typography and emphasis for [content] composable */
 @Composable
 @ComposableOpenTarget(index = 0)
 internal fun Decoration(
@@ -228,21 +237,22 @@
     contentAlpha: Float? = null,
     content: @Composable @ComposableOpenTarget(index = 0) () -> Unit
 ) {
-    val colorAndEmphasis: @Composable () -> Unit = @Composable {
-        CompositionLocalProvider(LocalContentColor provides contentColor) {
-            if (contentAlpha != null) {
-                CompositionLocalProvider(
-                    LocalContentAlpha provides contentAlpha,
-                    content = content
-                )
-            } else {
-                CompositionLocalProvider(
-                    LocalContentAlpha provides contentColor.alpha,
-                    content = content
-                )
+    val colorAndEmphasis: @Composable () -> Unit =
+        @Composable {
+            CompositionLocalProvider(LocalContentColor provides contentColor) {
+                if (contentAlpha != null) {
+                    CompositionLocalProvider(
+                        LocalContentAlpha provides contentAlpha,
+                        content = content
+                    )
+                } else {
+                    CompositionLocalProvider(
+                        LocalContentAlpha provides contentColor.alpha,
+                        content = content
+                    )
+                }
             }
         }
-    }
     if (typography != null) ProvideTextStyle(typography, colorAndEmphasis) else colorAndEmphasis()
 }
 
@@ -254,6 +264,7 @@
 ): Modifier = if (isError) semantics { error(defaultErrorMessage) } else this
 
 internal fun widthOrZero(placeable: Placeable?) = placeable?.width ?: 0
+
 internal fun heightOrZero(placeable: Placeable?) = placeable?.height ?: 0
 
 private object TextFieldTransitionScope {
@@ -264,85 +275,85 @@
         unfocusedTextStyleColor: Color,
         contentColor: @Composable (InputPhase) -> Color,
         showLabel: Boolean,
-        content: @Composable (
-            labelProgress: Float,
-            labelTextStyleColor: Color,
-            labelContentColor: Color,
-            placeholderOpacity: Float
-        ) -> Unit
+        content:
+            @Composable
+            (
+                labelProgress: Float,
+                labelTextStyleColor: Color,
+                labelContentColor: Color,
+                placeholderOpacity: Float
+            ) -> Unit
     ) {
         // Transitions from/to InputPhase.Focused are the most critical in the transition below.
         // UnfocusedEmpty <-> UnfocusedNotEmpty are needed when a single state is used to control
         // multiple text fields.
         val transition = updateTransition(inputState, label = "TextFieldInputState")
 
-        val labelProgress by transition.animateFloat(
-            label = "LabelProgress",
-            transitionSpec = { tween(durationMillis = AnimationDuration) }
-        ) {
-            when (it) {
-                InputPhase.Focused -> 1f
-                InputPhase.UnfocusedEmpty -> 0f
-                InputPhase.UnfocusedNotEmpty -> 1f
-            }
-        }
-
-        val placeholderOpacity by transition.animateFloat(
-            label = "PlaceholderOpacity",
-            transitionSpec = {
-                if (InputPhase.Focused isTransitioningTo InputPhase.UnfocusedEmpty) {
-                    tween(
-                        durationMillis = PlaceholderAnimationDelayOrDuration,
-                        easing = LinearEasing
-                    )
-                } else if (InputPhase.UnfocusedEmpty isTransitioningTo InputPhase.Focused ||
-                    InputPhase.UnfocusedNotEmpty isTransitioningTo InputPhase.UnfocusedEmpty
-                ) {
-                    tween(
-                        durationMillis = PlaceholderAnimationDuration,
-                        delayMillis = PlaceholderAnimationDelayOrDuration,
-                        easing = LinearEasing
-                    )
-                } else {
-                    spring()
+        val labelProgress by
+            transition.animateFloat(
+                label = "LabelProgress",
+                transitionSpec = { tween(durationMillis = AnimationDuration) }
+            ) {
+                when (it) {
+                    InputPhase.Focused -> 1f
+                    InputPhase.UnfocusedEmpty -> 0f
+                    InputPhase.UnfocusedNotEmpty -> 1f
                 }
             }
-        ) {
-            when (it) {
-                InputPhase.Focused -> 1f
-                InputPhase.UnfocusedEmpty -> if (showLabel) 0f else 1f
-                InputPhase.UnfocusedNotEmpty -> 0f
+
+        val placeholderOpacity by
+            transition.animateFloat(
+                label = "PlaceholderOpacity",
+                transitionSpec = {
+                    if (InputPhase.Focused isTransitioningTo InputPhase.UnfocusedEmpty) {
+                        tween(
+                            durationMillis = PlaceholderAnimationDelayOrDuration,
+                            easing = LinearEasing
+                        )
+                    } else if (
+                        InputPhase.UnfocusedEmpty isTransitioningTo InputPhase.Focused ||
+                            InputPhase.UnfocusedNotEmpty isTransitioningTo InputPhase.UnfocusedEmpty
+                    ) {
+                        tween(
+                            durationMillis = PlaceholderAnimationDuration,
+                            delayMillis = PlaceholderAnimationDelayOrDuration,
+                            easing = LinearEasing
+                        )
+                    } else {
+                        spring()
+                    }
+                }
+            ) {
+                when (it) {
+                    InputPhase.Focused -> 1f
+                    InputPhase.UnfocusedEmpty -> if (showLabel) 0f else 1f
+                    InputPhase.UnfocusedNotEmpty -> 0f
+                }
             }
-        }
 
-        val labelTextStyleColor by transition.animateColor(
-            transitionSpec = { tween(durationMillis = AnimationDuration) },
-            label = "LabelTextStyleColor"
-        ) {
-            when (it) {
-                InputPhase.Focused -> focusedTextStyleColor
-                else -> unfocusedTextStyleColor
+        val labelTextStyleColor by
+            transition.animateColor(
+                transitionSpec = { tween(durationMillis = AnimationDuration) },
+                label = "LabelTextStyleColor"
+            ) {
+                when (it) {
+                    InputPhase.Focused -> focusedTextStyleColor
+                    else -> unfocusedTextStyleColor
+                }
             }
-        }
 
-        val labelContentColor by transition.animateColor(
-            transitionSpec = { tween(durationMillis = AnimationDuration) },
-            label = "LabelContentColor",
-            targetValueByState = contentColor
-        )
+        val labelContentColor by
+            transition.animateColor(
+                transitionSpec = { tween(durationMillis = AnimationDuration) },
+                label = "LabelContentColor",
+                targetValueByState = contentColor
+            )
 
-        content(
-            labelProgress,
-            labelTextStyleColor,
-            labelContentColor,
-            placeholderOpacity
-        )
+        content(labelProgress, labelTextStyleColor, labelContentColor, placeholderOpacity)
     }
 }
 
-/**
- * An internal state used to animate a label and an indicator.
- */
+/** An internal state used to animate a label and an indicator. */
 private enum class InputPhase {
     // Text field is focused
     Focused,
diff --git a/compose/material/material/src/commonMain/kotlin/androidx/compose/material/Typography.kt b/compose/material/material/src/commonMain/kotlin/androidx/compose/material/Typography.kt
index a20d149..addf97a 100644
--- a/compose/material/material/src/commonMain/kotlin/androidx/compose/material/Typography.kt
+++ b/compose/material/material/src/commonMain/kotlin/androidx/compose/material/Typography.kt
@@ -26,7 +26,8 @@
 import androidx.compose.ui.unit.sp
 
 /**
- * <a href="https://material.io/design/typography/the-type-system.html#type-scale" class="external" target="_blank">Material Design type scale</a>.
+ * <a href="https://material.io/design/typography/the-type-system.html#type-scale" class="external"
+ * target="_blank">Material Design type scale</a>.
  *
  * The Material Design type scale includes a range of contrasting styles that support the needs of
  * your product and its content.
@@ -34,48 +35,50 @@
  * The type scale is a combination of thirteen styles that are supported by the type system. It
  * contains reusable categories of text, each with an intended application and meaning.
  *
- * ![Typography image](https://developer.android.com/images/reference/androidx/compose/material/typography.png)
+ * ![Typography
+ * image](https://developer.android.com/images/reference/androidx/compose/material/typography.png)
  *
- * @property h1 h1 is the largest headline, reserved for short, important text or numerals.
- * For headlines, you can choose an expressive font, such as a display, handwritten, or script
- * style. These unconventional font designs have details and intricacy that help attract the eye.
+ * @property h1 h1 is the largest headline, reserved for short, important text or numerals. For
+ *   headlines, you can choose an expressive font, such as a display, handwritten, or script style.
+ *   These unconventional font designs have details and intricacy that help attract the eye.
  * @property h2 h2 is the second largest headline, reserved for short, important text or numerals.
- * For headlines, you can choose an expressive font, such as a display, handwritten, or script
- * style. These unconventional font designs have details and intricacy that help attract the eye.
+ *   For headlines, you can choose an expressive font, such as a display, handwritten, or script
+ *   style. These unconventional font designs have details and intricacy that help attract the eye.
  * @property h3 h3 is the third largest headline, reserved for short, important text or numerals.
- * For headlines, you can choose an expressive font, such as a display, handwritten, or script
- * style. These unconventional font designs have details and intricacy that help attract the eye.
+ *   For headlines, you can choose an expressive font, such as a display, handwritten, or script
+ *   style. These unconventional font designs have details and intricacy that help attract the eye.
  * @property h4 h4 is the fourth largest headline, reserved for short, important text or numerals.
- * For headlines, you can choose an expressive font, such as a display, handwritten, or script
- * style. These unconventional font designs have details and intricacy that help attract the eye.
+ *   For headlines, you can choose an expressive font, such as a display, handwritten, or script
+ *   style. These unconventional font designs have details and intricacy that help attract the eye.
  * @property h5 h5 is the fifth largest headline, reserved for short, important text or numerals.
- * For headlines, you can choose an expressive font, such as a display, handwritten, or script
- * style. These unconventional font designs have details and intricacy that help attract the eye.
+ *   For headlines, you can choose an expressive font, such as a display, handwritten, or script
+ *   style. These unconventional font designs have details and intricacy that help attract the eye.
  * @property h6 h6 is the sixth largest headline, reserved for short, important text or numerals.
- * For headlines, you can choose an expressive font, such as a display, handwritten, or script
- * style. These unconventional font designs have details and intricacy that help attract the eye.
+ *   For headlines, you can choose an expressive font, such as a display, handwritten, or script
+ *   style. These unconventional font designs have details and intricacy that help attract the eye.
  * @property subtitle1 subtitle1 is the largest subtitle, and is typically reserved for
- * medium-emphasis text that is shorter in length. Serif or sans serif typefaces work well for
- * subtitles.
+ *   medium-emphasis text that is shorter in length. Serif or sans serif typefaces work well for
+ *   subtitles.
  * @property subtitle2 subtitle2 is the smallest subtitle, and is typically reserved for
- * medium-emphasis text that is shorter in length. Serif or sans serif typefaces work well for
- * subtitles.
+ *   medium-emphasis text that is shorter in length. Serif or sans serif typefaces work well for
+ *   subtitles.
  * @property body1 body1 is the largest body, and is typically used for long-form writing as it
- * works well for small text sizes. For longer sections of text, a serif or sans serif typeface
- * is recommended.
+ *   works well for small text sizes. For longer sections of text, a serif or sans serif typeface is
+ *   recommended.
  * @property body2 body2 is the smallest body, and is typically used for long-form writing as it
- * works well for small text sizes. For longer sections of text, a serif or sans serif typeface
- * is recommended.
+ *   works well for small text sizes. For longer sections of text, a serif or sans serif typeface is
+ *   recommended.
  * @property button button text is a call to action used in different types of buttons (such as
- * text, outlined and contained buttons) and in tabs, dialogs, and cards. Button text is
- * typically sans serif, using all caps text.
- * @property caption caption is one of the smallest font sizes. It is used sparingly to
- * annotate imagery or to introduce a headline.
- * @property overline overline is one of the smallest font sizes. It is used sparingly to
- * annotate imagery or to introduce a headline.
+ *   text, outlined and contained buttons) and in tabs, dialogs, and cards. Button text is typically
+ *   sans serif, using all caps text.
+ * @property caption caption is one of the smallest font sizes. It is used sparingly to annotate
+ *   imagery or to introduce a headline.
+ * @property overline overline is one of the smallest font sizes. It is used sparingly to annotate
+ *   imagery or to introduce a headline.
  */
 @Immutable
-class Typography internal constructor(
+class Typography
+internal constructor(
     val h1: TextStyle,
     val h2: TextStyle,
     val h3: TextStyle,
@@ -91,11 +94,12 @@
     val overline: TextStyle
 ) {
     /**
-     * Constructor to create a [Typography]. For information on the types of style defined in
-     * this constructor, see the property documentation for [Typography].
+     * Constructor to create a [Typography]. For information on the types of style defined in this
+     * constructor, see the property documentation for [Typography].
      *
      * @param defaultFontFamily the default [FontFamily] to be used for [TextStyle]s provided in
-     * this constructor. This default will be used if the [FontFamily] on the [TextStyle] is `null`.
+     *   this constructor. This default will be used if the [FontFamily] on the [TextStyle] is
+     *   `null`.
      * @param h1 h1 is the largest headline, reserved for short, important text or numerals.
      * @param h2 h2 is the second largest headline, reserved for short, important text or numerals.
      * @param h3 h3 is the third largest headline, reserved for short, important text or numerals.
@@ -103,100 +107,113 @@
      * @param h5 h5 is the fifth largest headline, reserved for short, important text or numerals.
      * @param h6 h6 is the sixth largest headline, reserved for short, important text or numerals.
      * @param subtitle1 subtitle1 is the largest subtitle, and is typically reserved for
-     * medium-emphasis text that is shorter in length.
+     *   medium-emphasis text that is shorter in length.
      * @param subtitle2 subtitle2 is the smallest subtitle, and is typically reserved for
-     * medium-emphasis text that is shorter in length.
+     *   medium-emphasis text that is shorter in length.
      * @param body1 body1 is the largest body, and is typically used for long-form writing as it
-     * works well for small text sizes.
+     *   works well for small text sizes.
      * @param body2 body2 is the smallest body, and is typically used for long-form writing as it
-     * works well for small text sizes.
+     *   works well for small text sizes.
      * @param button button text is a call to action used in different types of buttons (such as
-     * text, outlined and contained buttons) and in tabs, dialogs, and cards.
+     *   text, outlined and contained buttons) and in tabs, dialogs, and cards.
      * @param caption caption is one of the smallest font sizes. It is used sparingly to annotate
-     * imagery or to introduce a headline.
+     *   imagery or to introduce a headline.
      * @param overline overline is one of the smallest font sizes. It is used sparingly to annotate
-     * imagery or to introduce a headline.
+     *   imagery or to introduce a headline.
      */
     constructor(
         defaultFontFamily: FontFamily = FontFamily.Default,
-        h1: TextStyle = DefaultTextStyle.copy(
-            fontWeight = FontWeight.Light,
-            fontSize = 96.sp,
-            lineHeight = 112.sp,
-            letterSpacing = (-1.5).sp
-        ),
-        h2: TextStyle = DefaultTextStyle.copy(
-            fontWeight = FontWeight.Light,
-            fontSize = 60.sp,
-            lineHeight = 72.sp,
-            letterSpacing = (-0.5).sp
-        ),
-        h3: TextStyle = DefaultTextStyle.copy(
-            fontWeight = FontWeight.Normal,
-            fontSize = 48.sp,
-            lineHeight = 56.sp,
-            letterSpacing = 0.sp
-        ),
-        h4: TextStyle = DefaultTextStyle.copy(
-            fontWeight = FontWeight.Normal,
-            fontSize = 34.sp,
-            lineHeight = 36.sp,
-            letterSpacing = 0.25.sp
-        ),
-        h5: TextStyle = DefaultTextStyle.copy(
-            fontWeight = FontWeight.Normal,
-            fontSize = 24.sp,
-            lineHeight = 24.sp,
-            letterSpacing = 0.sp
-        ),
-        h6: TextStyle = DefaultTextStyle.copy(
-            fontWeight = FontWeight.Medium,
-            fontSize = 20.sp,
-            lineHeight = 24.sp,
-            letterSpacing = 0.15.sp
-        ),
-        subtitle1: TextStyle = DefaultTextStyle.copy(
-            fontWeight = FontWeight.Normal,
-            fontSize = 16.sp,
-            lineHeight = 24.sp,
-            letterSpacing = 0.15.sp
-        ),
-        subtitle2: TextStyle = DefaultTextStyle.copy(
-            fontWeight = FontWeight.Medium,
-            fontSize = 14.sp,
-            lineHeight = 24.sp,
-            letterSpacing = 0.1.sp
-        ),
-        body1: TextStyle = DefaultTextStyle.copy(
-            fontWeight = FontWeight.Normal,
-            fontSize = 16.sp,
-            lineHeight = 24.sp,
-            letterSpacing = 0.5.sp
-        ),
-        body2: TextStyle = DefaultTextStyle.copy(
-            fontWeight = FontWeight.Normal,
-            fontSize = 14.sp,
-            lineHeight = 20.sp,
-            letterSpacing = 0.25.sp
-        ),
-        button: TextStyle = DefaultTextStyle.copy(
-            fontWeight = FontWeight.Medium,
-            fontSize = 14.sp,
-            lineHeight = 16.sp,
-            letterSpacing = 1.25.sp
-        ),
-        caption: TextStyle = DefaultTextStyle.copy(
-            fontWeight = FontWeight.Normal,
-            fontSize = 12.sp,
-            lineHeight = 16.sp,
-            letterSpacing = 0.4.sp
-        ),
-        overline: TextStyle = DefaultTextStyle.copy(
-            fontWeight = FontWeight.Normal,
-            fontSize = 10.sp,
-            lineHeight = 16.sp,
-            letterSpacing = 1.5.sp
-        )
+        h1: TextStyle =
+            DefaultTextStyle.copy(
+                fontWeight = FontWeight.Light,
+                fontSize = 96.sp,
+                lineHeight = 112.sp,
+                letterSpacing = (-1.5).sp
+            ),
+        h2: TextStyle =
+            DefaultTextStyle.copy(
+                fontWeight = FontWeight.Light,
+                fontSize = 60.sp,
+                lineHeight = 72.sp,
+                letterSpacing = (-0.5).sp
+            ),
+        h3: TextStyle =
+            DefaultTextStyle.copy(
+                fontWeight = FontWeight.Normal,
+                fontSize = 48.sp,
+                lineHeight = 56.sp,
+                letterSpacing = 0.sp
+            ),
+        h4: TextStyle =
+            DefaultTextStyle.copy(
+                fontWeight = FontWeight.Normal,
+                fontSize = 34.sp,
+                lineHeight = 36.sp,
+                letterSpacing = 0.25.sp
+            ),
+        h5: TextStyle =
+            DefaultTextStyle.copy(
+                fontWeight = FontWeight.Normal,
+                fontSize = 24.sp,
+                lineHeight = 24.sp,
+                letterSpacing = 0.sp
+            ),
+        h6: TextStyle =
+            DefaultTextStyle.copy(
+                fontWeight = FontWeight.Medium,
+                fontSize = 20.sp,
+                lineHeight = 24.sp,
+                letterSpacing = 0.15.sp
+            ),
+        subtitle1: TextStyle =
+            DefaultTextStyle.copy(
+                fontWeight = FontWeight.Normal,
+                fontSize = 16.sp,
+                lineHeight = 24.sp,
+                letterSpacing = 0.15.sp
+            ),
+        subtitle2: TextStyle =
+            DefaultTextStyle.copy(
+                fontWeight = FontWeight.Medium,
+                fontSize = 14.sp,
+                lineHeight = 24.sp,
+                letterSpacing = 0.1.sp
+            ),
+        body1: TextStyle =
+            DefaultTextStyle.copy(
+                fontWeight = FontWeight.Normal,
+                fontSize = 16.sp,
+                lineHeight = 24.sp,
+                letterSpacing = 0.5.sp
+            ),
+        body2: TextStyle =
+            DefaultTextStyle.copy(
+                fontWeight = FontWeight.Normal,
+                fontSize = 14.sp,
+                lineHeight = 20.sp,
+                letterSpacing = 0.25.sp
+            ),
+        button: TextStyle =
+            DefaultTextStyle.copy(
+                fontWeight = FontWeight.Medium,
+                fontSize = 14.sp,
+                lineHeight = 16.sp,
+                letterSpacing = 1.25.sp
+            ),
+        caption: TextStyle =
+            DefaultTextStyle.copy(
+                fontWeight = FontWeight.Normal,
+                fontSize = 12.sp,
+                lineHeight = 16.sp,
+                letterSpacing = 0.4.sp
+            ),
+        overline: TextStyle =
+            DefaultTextStyle.copy(
+                fontWeight = FontWeight.Normal,
+                fontSize = 10.sp,
+                lineHeight = 16.sp,
+                letterSpacing = 1.5.sp
+            )
     ) : this(
         h1 = h1.withDefaultFontFamily(defaultFontFamily),
         h2 = h2.withDefaultFontFamily(defaultFontFamily),
@@ -213,9 +230,7 @@
         overline = overline.withDefaultFontFamily(defaultFontFamily)
     )
 
-    /**
-     * Returns a copy of this Typography, optionally overriding some of the values.
-     */
+    /** Returns a copy of this Typography, optionally overriding some of the values. */
     fun copy(
         h1: TextStyle = this.h1,
         h2: TextStyle = this.h2,
@@ -230,21 +245,22 @@
         button: TextStyle = this.button,
         caption: TextStyle = this.caption,
         overline: TextStyle = this.overline
-    ): Typography = Typography(
-        h1 = h1,
-        h2 = h2,
-        h3 = h3,
-        h4 = h4,
-        h5 = h5,
-        h6 = h6,
-        subtitle1 = subtitle1,
-        subtitle2 = subtitle2,
-        body1 = body1,
-        body2 = body2,
-        button = button,
-        caption = caption,
-        overline = overline
-    )
+    ): Typography =
+        Typography(
+            h1 = h1,
+            h2 = h2,
+            h3 = h3,
+            h4 = h4,
+            h5 = h5,
+            h6 = h6,
+            subtitle1 = subtitle1,
+            subtitle2 = subtitle2,
+            body1 = body1,
+            body2 = body2,
+            button = button,
+            caption = caption,
+            overline = overline
+        )
 
     override fun equals(other: Any?): Boolean {
         if (this === other) return true
@@ -292,33 +308,33 @@
 }
 
 /**
- * @return [this] if there is a [FontFamily] defined, otherwise copies [this] with [default] as
- * the [FontFamily].
+ * @return [this] if there is a [FontFamily] defined, otherwise copies [this] with [default] as the
+ *   [FontFamily].
  */
 private fun TextStyle.withDefaultFontFamily(default: FontFamily): TextStyle {
     return if (fontFamily != null) this else copy(fontFamily = default)
 }
 
-internal val DefaultLineHeightStyle = LineHeightStyle(
-    alignment = LineHeightStyle.Alignment.Center,
-    trim = LineHeightStyle.Trim.None,
-)
+internal val DefaultLineHeightStyle =
+    LineHeightStyle(
+        alignment = LineHeightStyle.Alignment.Center,
+        trim = LineHeightStyle.Trim.None,
+    )
 
-internal val DefaultTextStyle = TextStyle.Default.copy(
-    platformStyle = defaultPlatformTextStyle(),
-    lineHeightStyle = DefaultLineHeightStyle,
-)
+internal val DefaultTextStyle =
+    TextStyle.Default.copy(
+        platformStyle = defaultPlatformTextStyle(),
+        lineHeightStyle = DefaultLineHeightStyle,
+    )
 
-/**
- * Returns Default [PlatformTextStyle].
- */
+/** Returns Default [PlatformTextStyle]. */
 internal expect fun defaultPlatformTextStyle(): PlatformTextStyle?
 
 /**
  * This CompositionLocal holds on to the current definition of typography for this application as
  * described by the Material spec. You can read the values in it when creating custom components
- * that want to use Material types, as well as override the values when you want to re-style a
- * part of your hierarchy. Material components related to text such as [Button] will use this
+ * that want to use Material types, as well as override the values when you want to re-style a part
+ * of your hierarchy. Material components related to text such as [Button] will use this
  * CompositionLocal to set values with which to style children text components.
  *
  * To access values within this CompositionLocal, use [MaterialTheme.typography].
diff --git a/compose/material/material/src/commonMain/kotlin/androidx/compose/material/pullrefresh/PullRefresh.kt b/compose/material/material/src/commonMain/kotlin/androidx/compose/material/pullrefresh/PullRefresh.kt
index baab13f..49e02e7 100644
--- a/compose/material/material/src/commonMain/kotlin/androidx/compose/material/pullrefresh/PullRefresh.kt
+++ b/compose/material/material/src/commonMain/kotlin/androidx/compose/material/pullrefresh/PullRefresh.kt
@@ -32,16 +32,14 @@
  *
  * @sample androidx.compose.material.samples.PullRefreshSample
  *
- * @param state The [PullRefreshState] associated with this pull-to-refresh component.
- * The state will be updated by this modifier.
+ * @param state The [PullRefreshState] associated with this pull-to-refresh component. The state
+ *   will be updated by this modifier.
  * @param enabled If not enabled, all scroll delta and fling velocity will be ignored.
  */
 // TODO(b/244423199): Move pullRefresh into its own material library similar to material-ripple.
 @ExperimentalMaterialApi
-fun Modifier.pullRefresh(
-    state: PullRefreshState,
-    enabled: Boolean = true
-) = pullRefresh(state::onPull, state::onRelease, enabled)
+fun Modifier.pullRefresh(state: PullRefreshState, enabled: Boolean = true) =
+    pullRefresh(state::onPull, state::onRelease, enabled)
 
 /**
  * A nested scroll modifier that provides [onPull] and [onRelease] callbacks to aid building custom
@@ -53,17 +51,17 @@
  * @sample androidx.compose.material.samples.CustomPullRefreshSample
  *
  * @param onPull Callback for dispatching vertical scroll delta, takes float pullDelta as argument.
- * Positive delta (pulling down) is dispatched only if the child does not consume it (i.e. pulling
- * down despite being at the top of a scrollable component), whereas negative delta (swiping up) is
- * dispatched first (in case it is needed to push the indicator back up), and then the unconsumed
- * delta is passed on to the child. The callback returns how much delta was consumed.
- * @param onRelease Callback for when drag is released, takes float flingVelocity as argument.
- * The callback returns how much velocity was consumed - in most cases this should only consume
- * velocity if pull refresh has been dragged already and the velocity is positive (the fling is
- * downwards), as an upwards fling should typically still scroll a scrollable component beneath the
- * pullRefresh. This is invoked before any remaining velocity is passed to the child.
+ *   Positive delta (pulling down) is dispatched only if the child does not consume it (i.e. pulling
+ *   down despite being at the top of a scrollable component), whereas negative delta (swiping up)
+ *   is dispatched first (in case it is needed to push the indicator back up), and then the
+ *   unconsumed delta is passed on to the child. The callback returns how much delta was consumed.
+ * @param onRelease Callback for when drag is released, takes float flingVelocity as argument. The
+ *   callback returns how much velocity was consumed - in most cases this should only consume
+ *   velocity if pull refresh has been dragged already and the velocity is positive (the fling is
+ *   downwards), as an upwards fling should typically still scroll a scrollable component beneath
+ *   the pullRefresh. This is invoked before any remaining velocity is passed to the child.
  * @param enabled If not enabled, all scroll delta and fling velocity will be ignored and neither
- * [onPull] nor [onRelease] will be invoked.
+ *   [onPull] nor [onRelease] will be invoked.
  */
 @ExperimentalMaterialApi
 fun Modifier.pullRefresh(
@@ -78,30 +76,25 @@
     private val enabled: Boolean
 ) : NestedScrollConnection {
 
-    override fun onPreScroll(
-        available: Offset,
-        source: NestedScrollSource
-    ): Offset = when {
-        !enabled -> Offset.Zero
-        source == NestedScrollSource.UserInput && available.y < 0 -> Offset(
-            0f,
-            onPull(available.y)
-        ) // Swiping up
-        else -> Offset.Zero
-    }
+    override fun onPreScroll(available: Offset, source: NestedScrollSource): Offset =
+        when {
+            !enabled -> Offset.Zero
+            source == NestedScrollSource.UserInput && available.y < 0 ->
+                Offset(0f, onPull(available.y)) // Swiping up
+            else -> Offset.Zero
+        }
 
     override fun onPostScroll(
         consumed: Offset,
         available: Offset,
         source: NestedScrollSource
-    ): Offset = when {
-        !enabled -> Offset.Zero
-        source == NestedScrollSource.UserInput && available.y > 0 -> Offset(
-            0f,
-            onPull(available.y)
-        ) // Pulling down
-        else -> Offset.Zero
-    }
+    ): Offset =
+        when {
+            !enabled -> Offset.Zero
+            source == NestedScrollSource.UserInput && available.y > 0 ->
+                Offset(0f, onPull(available.y)) // Pulling down
+            else -> Offset.Zero
+        }
 
     override suspend fun onPreFling(available: Velocity): Velocity {
         return Velocity(0f, onRelease(available.y))
diff --git a/compose/material/material/src/commonMain/kotlin/androidx/compose/material/pullrefresh/PullRefreshIndicator.kt b/compose/material/material/src/commonMain/kotlin/androidx/compose/material/pullrefresh/PullRefreshIndicator.kt
index 414cbd9..8f48a2c 100644
--- a/compose/material/material/src/commonMain/kotlin/androidx/compose/material/pullrefresh/PullRefreshIndicator.kt
+++ b/compose/material/material/src/commonMain/kotlin/androidx/compose/material/pullrefresh/PullRefreshIndicator.kt
@@ -81,32 +81,29 @@
     contentColor: Color = contentColorFor(backgroundColor),
     scale: Boolean = false
 ) {
-    val showElevation by remember(refreshing, state) {
-        derivedStateOf { refreshing || state.position > 0.5f }
-    }
+    val showElevation by
+        remember(refreshing, state) { derivedStateOf { refreshing || state.position > 0.5f } }
 
     // Apply an elevation overlay if needed. Note that we aren't using Surface here, as we do not
     // want its input-blocking behaviour, since the indicator is typically displayed above other
     // (possibly) interactive content.
     val elevationOverlay = LocalElevationOverlay.current
-    val color = elevationOverlay?.apply(color = backgroundColor, elevation = Elevation)
-        ?: backgroundColor
+    val color =
+        elevationOverlay?.apply(color = backgroundColor, elevation = Elevation) ?: backgroundColor
 
     Box(
-        modifier = modifier
-            .size(IndicatorSize)
-            .pullRefreshIndicatorTransform(state, scale)
-            .shadow(if (showElevation) Elevation else 0.dp, SpinnerShape, clip = true)
-            .background(color = color, shape = SpinnerShape)
+        modifier =
+            modifier
+                .size(IndicatorSize)
+                .pullRefreshIndicatorTransform(state, scale)
+                .shadow(if (showElevation) Elevation else 0.dp, SpinnerShape, clip = true)
+                .background(color = color, shape = SpinnerShape)
     ) {
         Crossfade(
             targetState = refreshing,
             animationSpec = tween(durationMillis = CrossfadeDurationMs)
         ) { refreshing ->
-            Box(
-                modifier = Modifier.fillMaxSize(),
-                contentAlignment = Alignment.Center
-            ) {
+            Box(modifier = Modifier.fillMaxSize(), contentAlignment = Alignment.Center) {
                 val spinnerSize = (ArcRadius + StrokeWidth).times(2)
 
                 if (refreshing) {
@@ -123,9 +120,7 @@
     }
 }
 
-/**
- * Modifier.size MUST be specified.
- */
+/** Modifier.size MUST be specified. */
 @Composable
 @ExperimentalMaterialApi
 private fun CircularArrowIndicator(
@@ -135,11 +130,8 @@
 ) {
     val path = remember { Path().apply { fillType = PathFillType.EvenOdd } }
 
-    val targetAlpha by remember(state) {
-        derivedStateOf {
-            if (state.progress >= 1f) MaxAlpha else MinAlpha
-        }
-    }
+    val targetAlpha by
+        remember(state) { derivedStateOf { if (state.progress >= 1f) MaxAlpha else MinAlpha } }
 
     val alphaState = animateFloatAsState(targetValue = targetAlpha, animationSpec = AlphaTween)
 
@@ -150,12 +142,13 @@
 
         rotate(degrees = values.rotation) {
             val arcRadius = ArcRadius.toPx() + StrokeWidth.toPx() / 2f
-            val arcBounds = Rect(
-                size.center.x - arcRadius,
-                size.center.y - arcRadius,
-                size.center.x + arcRadius,
-                size.center.y + arcRadius
-            )
+            val arcBounds =
+                Rect(
+                    size.center.x - arcRadius,
+                    size.center.y - arcRadius,
+                    size.center.x + arcRadius,
+                    size.center.y + arcRadius
+                )
             drawArc(
                 color = color,
                 alpha = alpha,
@@ -164,10 +157,7 @@
                 useCenter = false,
                 topLeft = arcBounds.topLeft,
                 size = arcBounds.size,
-                style = Stroke(
-                    width = StrokeWidth.toPx(),
-                    cap = StrokeCap.Square
-                )
+                style = Stroke(width = StrokeWidth.toPx(), cap = StrokeCap.Square)
             )
             drawArrow(path, arcBounds, color, alpha, values)
         }
@@ -214,23 +204,15 @@
     arrow.lineTo(x = ArrowWidth.toPx() * values.scale, y = 0f) // Line to right corner
 
     // Line to tip of arrow
-    arrow.lineTo(
-        x = ArrowWidth.toPx() * values.scale / 2,
-        y = ArrowHeight.toPx() * values.scale
-    )
+    arrow.lineTo(x = ArrowWidth.toPx() * values.scale / 2, y = ArrowHeight.toPx() * values.scale)
 
     val radius = min(bounds.width, bounds.height) / 2f
     val inset = ArrowWidth.toPx() * values.scale / 2f
     arrow.translate(
-        Offset(
-            x = radius + bounds.center.x - inset,
-            y = bounds.center.y + StrokeWidth.toPx() / 2f
-        )
+        Offset(x = radius + bounds.center.x - inset, y = bounds.center.y + StrokeWidth.toPx() / 2f)
     )
     arrow.close()
-    rotate(degrees = values.endAngle) {
-        drawPath(path = arrow, color = color, alpha = alpha)
-    }
+    rotate(degrees = values.endAngle) { drawPath(path = arrow, color = color, alpha = alpha) }
 }
 
 private const val CrossfadeDurationMs = 100
diff --git a/compose/material/material/src/commonMain/kotlin/androidx/compose/material/pullrefresh/PullRefreshIndicatorTransform.kt b/compose/material/material/src/commonMain/kotlin/androidx/compose/material/pullrefresh/PullRefreshIndicatorTransform.kt
index 2e3f000..a2f5502 100644
--- a/compose/material/material/src/commonMain/kotlin/androidx/compose/material/pullrefresh/PullRefreshIndicatorTransform.kt
+++ b/compose/material/material/src/commonMain/kotlin/androidx/compose/material/pullrefresh/PullRefreshIndicatorTransform.kt
@@ -25,8 +25,8 @@
 import androidx.compose.ui.util.fastCoerceIn
 
 /**
- * A modifier for translating the position and scaling the size of a pull-to-refresh indicator
- * based on the given [PullRefreshState].
+ * A modifier for translating the position and scaling the size of a pull-to-refresh indicator based
+ * on the given [PullRefreshState].
  *
  * @sample androidx.compose.material.samples.PullRefreshIndicatorTransformSample
  *
@@ -46,23 +46,23 @@
     // for the other dimensions to allow for more room for elevation / arbitrary indicators - we
     // only ever really want to clip at the top edge.
     drawWithContent {
-        clipRect(
-            top = 0f,
-            left = -Float.MAX_VALUE,
-            right = Float.MAX_VALUE,
-            bottom = Float.MAX_VALUE
-        ) {
-            this@drawWithContent.drawContent()
+            clipRect(
+                top = 0f,
+                left = -Float.MAX_VALUE,
+                right = Float.MAX_VALUE,
+                bottom = Float.MAX_VALUE
+            ) {
+                this@drawWithContent.drawContent()
+            }
         }
-    }
-    .graphicsLayer {
-        translationY = state.position - size.height
+        .graphicsLayer {
+            translationY = state.position - size.height
 
-        if (scale && !state.refreshing) {
-            val scaleFraction = LinearOutSlowInEasing
-                .transform(state.position / state.threshold)
-                .fastCoerceIn(0f, 1f)
-            scaleX = scaleFraction
-            scaleY = scaleFraction
+            if (scale && !state.refreshing) {
+                val scaleFraction =
+                    LinearOutSlowInEasing.transform(state.position / state.threshold)
+                        .fastCoerceIn(0f, 1f)
+                scaleX = scaleFraction
+                scaleY = scaleFraction
+            }
         }
-    }
diff --git a/compose/material/material/src/commonMain/kotlin/androidx/compose/material/pullrefresh/PullRefreshState.kt b/compose/material/material/src/commonMain/kotlin/androidx/compose/material/pullrefresh/PullRefreshState.kt
index 5cc559f..0e1c03e 100644
--- a/compose/material/material/src/commonMain/kotlin/androidx/compose/material/pullrefresh/PullRefreshState.kt
+++ b/compose/material/material/src/commonMain/kotlin/androidx/compose/material/pullrefresh/PullRefreshState.kt
@@ -48,10 +48,10 @@
  *
  * @param refreshing A boolean representing whether a refresh is currently occurring.
  * @param onRefresh The function to be called to trigger a refresh.
- * @param refreshThreshold The threshold below which, if a release
- * occurs, [onRefresh] will be called.
+ * @param refreshThreshold The threshold below which, if a release occurs, [onRefresh] will be
+ *   called.
  * @param refreshingOffset The offset at which the indicator will be drawn while refreshing. This
- * offset corresponds to the position of the bottom of the indicator.
+ *   offset corresponds to the position of the bottom of the indicator.
  */
 @Composable
 @ExperimentalMaterialApi
@@ -73,9 +73,8 @@
         refreshingOffsetPx = refreshingOffset.toPx()
     }
 
-    val state = remember(scope) {
-        PullRefreshState(scope, onRefreshState, refreshingOffsetPx, thresholdPx)
-    }
+    val state =
+        remember(scope) { PullRefreshState(scope, onRefreshState, refreshingOffsetPx, thresholdPx) }
 
     SideEffect {
         state.setRefreshing(refreshing)
@@ -100,7 +99,8 @@
  * Should be created using [rememberPullRefreshState].
  */
 @ExperimentalMaterialApi
-class PullRefreshState internal constructor(
+class PullRefreshState
+internal constructor(
     private val animationScope: CoroutineScope,
     private val onRefreshState: State<() -> Unit>,
     refreshingOffset: Float,
@@ -114,11 +114,17 @@
      * gone beyond the refreshThreshold - e.g. a value of 2f indicates that the user has pulled to
      * two times the refreshThreshold.
      */
-    val progress get() = adjustedDistancePulled / threshold
+    val progress
+        get() = adjustedDistancePulled / threshold
 
-    internal val refreshing get() = _refreshing
-    internal val position get() = _position
-    internal val threshold get() = _threshold
+    internal val refreshing
+        get() = _refreshing
+
+    internal val position
+        get() = _position
+
+    internal val threshold
+        get() = _threshold
 
     private val adjustedDistancePulled by derivedStateOf { distancePulled * DragMultiplier }
 
@@ -145,16 +151,19 @@
             onRefreshState.value()
         }
         animateIndicatorTo(0f)
-        val consumed = when {
-            // We are flinging without having dragged the pull refresh (for example a fling inside
-            // a list) - don't consume
-            distancePulled == 0f -> 0f
-            // If the velocity is negative, the fling is upwards, and we don't want to prevent the
-            // the list from scrolling
-            velocity < 0f -> 0f
-            // We are showing the indicator, and the fling is downwards - consume everything
-            else -> velocity
-        }
+        val consumed =
+            when {
+                // We are flinging without having dragged the pull refresh (for example a fling
+                // inside
+                // a list) - don't consume
+                distancePulled == 0f -> 0f
+                // If the velocity is negative, the fling is upwards, and we don't want to prevent
+                // the
+                // the list from scrolling
+                velocity < 0f -> 0f
+                // We are showing the indicator, and the fling is downwards - consume everything
+                else -> velocity
+            }
         distancePulled = 0f
         return consumed
     }
@@ -183,52 +192,50 @@
     // overhead of running through the animation pipeline instead of directly mutating the state.
     private val mutatorMutex = MutatorMutex()
 
-    private fun animateIndicatorTo(offset: Float) = animationScope.launch {
-        mutatorMutex.mutate {
-            animate(initialValue = _position, targetValue = offset) { value, _ ->
-                _position = value
+    private fun animateIndicatorTo(offset: Float) =
+        animationScope.launch {
+            mutatorMutex.mutate {
+                animate(initialValue = _position, targetValue = offset) { value, _ ->
+                    _position = value
+                }
             }
         }
-    }
 
-    private fun calculateIndicatorPosition(): Float = when {
-        // If drag hasn't gone past the threshold, the position is the adjustedDistancePulled.
-        adjustedDistancePulled <= threshold -> adjustedDistancePulled
-        else -> {
-            // How far beyond the threshold pull has gone, as a percentage of the threshold.
-            val overshootPercent = abs(progress) - 1.0f
-            // Limit the overshoot to 200%. Linear between 0 and 200.
-            val linearTension = overshootPercent.fastCoerceIn(0f, 2f)
-            // Non-linear tension. Increases with linearTension, but at a decreasing rate.
-            val tensionPercent = linearTension - linearTension.pow(2) / 4
-            // The additional offset beyond the threshold.
-            val extraOffset = threshold * tensionPercent
-            threshold + extraOffset
+    private fun calculateIndicatorPosition(): Float =
+        when {
+            // If drag hasn't gone past the threshold, the position is the adjustedDistancePulled.
+            adjustedDistancePulled <= threshold -> adjustedDistancePulled
+            else -> {
+                // How far beyond the threshold pull has gone, as a percentage of the threshold.
+                val overshootPercent = abs(progress) - 1.0f
+                // Limit the overshoot to 200%. Linear between 0 and 200.
+                val linearTension = overshootPercent.fastCoerceIn(0f, 2f)
+                // Non-linear tension. Increases with linearTension, but at a decreasing rate.
+                val tensionPercent = linearTension - linearTension.pow(2) / 4
+                // The additional offset beyond the threshold.
+                val extraOffset = threshold * tensionPercent
+                threshold + extraOffset
+            }
         }
-    }
 }
 
-/**
- * Default parameter values for [rememberPullRefreshState].
- */
+/** Default parameter values for [rememberPullRefreshState]. */
 @ExperimentalMaterialApi
 object PullRefreshDefaults {
     /**
-     * If the indicator is below this threshold offset when it is released, a refresh
-     * will be triggered.
+     * If the indicator is below this threshold offset when it is released, a refresh will be
+     * triggered.
      */
     val RefreshThreshold = 80.dp
 
-    /**
-     * The offset at which the indicator should be rendered whilst a refresh is occurring.
-     */
+    /** The offset at which the indicator should be rendered whilst a refresh is occurring. */
     val RefreshingOffset = 56.dp
 }
 
 /**
- * The distance pulled is multiplied by this value to give us the adjusted distance pulled, which
- * is used in calculating the indicator position (when the adjusted distance pulled is less than
- * the refresh threshold, it is the indicator position, otherwise the indicator position is
- * derived from the progress).
+ * The distance pulled is multiplied by this value to give us the adjusted distance pulled, which is
+ * used in calculating the indicator position (when the adjusted distance pulled is less than the
+ * refresh threshold, it is the indicator position, otherwise the indicator position is derived from
+ * the progress).
  */
 private const val DragMultiplier = 0.5f
diff --git a/compose/material/material/src/desktopMain/kotlin/androidx/compose/material/DesktopMenu.desktop.kt b/compose/material/material/src/desktopMain/kotlin/androidx/compose/material/DesktopMenu.desktop.kt
index 04ce956..b21e279 100644
--- a/compose/material/material/src/desktopMain/kotlin/androidx/compose/material/DesktopMenu.desktop.kt
+++ b/compose/material/material/src/desktopMain/kotlin/androidx/compose/material/DesktopMenu.desktop.kt
@@ -56,27 +56,28 @@
  * space in a layout, as the menu is displayed in a separate window, on top of other content.
  *
  * The [content] of a [DropdownMenu] will typically be [DropdownMenuItem]s, as well as custom
- * content. Using [DropdownMenuItem]s will result in a menu that matches the Material
- * specification for menus. Also note that the [content] is placed inside a scrollable [Column],
- * so using a [LazyColumn] as the root layout inside [content] is unsupported.
+ * content. Using [DropdownMenuItem]s will result in a menu that matches the Material specification
+ * for menus. Also note that the [content] is placed inside a scrollable [Column], so using a
+ * [LazyColumn] as the root layout inside [content] is unsupported.
  *
- * [onDismissRequest] will be called when the menu should close - for example when there is a
- * tap outside the menu, or when the back key is pressed.
+ * [onDismissRequest] will be called when the menu should close - for example when there is a tap
+ * outside the menu, or when the back key is pressed.
  *
  * [DropdownMenu] changes its positioning depending on the available space, always trying to be
  * fully visible. It will try to expand horizontally, depending on layout direction, to the end of
- * its parent, then to the start of its parent, and then screen end-aligned. Vertically, it will
- * try to expand to the bottom of its parent, then from the top of its parent, and then screen
- * top-aligned. An [offset] can be provided to adjust the positioning of the menu for cases when
- * the layout bounds of its parent do not coincide with its visual bounds. Note the offset will
- * be applied in the direction in which the menu will decide to expand.
+ * its parent, then to the start of its parent, and then screen end-aligned. Vertically, it will try
+ * to expand to the bottom of its parent, then from the top of its parent, and then screen
+ * top-aligned. An [offset] can be provided to adjust the positioning of the menu for cases when the
+ * layout bounds of its parent do not coincide with its visual bounds. Note the offset will be
+ * applied in the direction in which the menu will decide to expand.
  *
  * Example usage:
+ *
  * @sample androidx.compose.material.samples.MenuSample
  *
  * @param expanded Whether the menu is currently open and visible to the user
- * @param onDismissRequest Called when the user requests to dismiss the menu, such as by
- * tapping outside the menu's bounds
+ * @param onDismissRequest Called when the user requests to dismiss the menu, such as by tapping
+ *   outside the menu's bounds
  * @param focusable Whether the dropdown can capture focus
  * @param modifier Modifier for the menu
  * @param offset [DpOffset] to be added to the position of the menu
@@ -84,11 +85,13 @@
  */
 @Deprecated(
     level = DeprecationLevel.HIDDEN,
-    replaceWith = ReplaceWith(
-        expression = "DropdownMenu(expanded,onDismissRequest, focusable, modifier, offset, " +
-            "rememberScrollState(), content)",
-        "androidx.compose.foundation.rememberScrollState"
-    ),
+    replaceWith =
+        ReplaceWith(
+            expression =
+                "DropdownMenu(expanded,onDismissRequest, focusable, modifier, offset, " +
+                    "rememberScrollState(), content)",
+            "androidx.compose.foundation.rememberScrollState"
+        ),
     message = "Replaced by a DropdownMenu function with a ScrollState parameter"
 )
 @Composable
@@ -99,15 +102,16 @@
     modifier: Modifier = Modifier,
     offset: DpOffset = DpOffset(0.dp, 0.dp),
     content: @Composable ColumnScope.() -> Unit
-) = DropdownMenu(
-    expanded = expanded,
-    onDismissRequest = onDismissRequest,
-    modifier = modifier,
-    offset = offset,
-    scrollState = rememberScrollState(),
-    properties = PopupProperties(focusable = focusable),
-    content = content
-)
+) =
+    DropdownMenu(
+        expanded = expanded,
+        onDismissRequest = onDismissRequest,
+        modifier = modifier,
+        offset = offset,
+        scrollState = rememberScrollState(),
+        properties = PopupProperties(focusable = focusable),
+        content = content
+    )
 
 /**
  * A Material Design [dropdown menu](https://material.io/components/menus#dropdown-menu).
@@ -118,30 +122,32 @@
  * space in a layout, as the menu is displayed in a separate window, on top of other content.
  *
  * The [content] of a [DropdownMenu] will typically be [DropdownMenuItem]s, as well as custom
- * content. Using [DropdownMenuItem]s will result in a menu that matches the Material
- * specification for menus. Also note that the [content] is placed inside a scrollable [Column],
- * so using a [LazyColumn] as the root layout inside [content] is unsupported.
+ * content. Using [DropdownMenuItem]s will result in a menu that matches the Material specification
+ * for menus. Also note that the [content] is placed inside a scrollable [Column], so using a
+ * [LazyColumn] as the root layout inside [content] is unsupported.
  *
- * [onDismissRequest] will be called when the menu should close - for example when there is a
- * tap outside the menu, or when the back key is pressed.
+ * [onDismissRequest] will be called when the menu should close - for example when there is a tap
+ * outside the menu, or when the back key is pressed.
  *
  * [DropdownMenu] changes its positioning depending on the available space, always trying to be
  * fully visible. It will try to expand horizontally, depending on layout direction, to the end of
- * its parent, then to the start of its parent, and then screen end-aligned. Vertically, it will
- * try to expand to the bottom of its parent, then from the top of its parent, and then screen
- * top-aligned. An [offset] can be provided to adjust the positioning of the menu for cases when
- * the layout bounds of its parent do not coincide with its visual bounds. Note the offset will
- * be applied in the direction in which the menu will decide to expand.
+ * its parent, then to the start of its parent, and then screen end-aligned. Vertically, it will try
+ * to expand to the bottom of its parent, then from the top of its parent, and then screen
+ * top-aligned. An [offset] can be provided to adjust the positioning of the menu for cases when the
+ * layout bounds of its parent do not coincide with its visual bounds. Note the offset will be
+ * applied in the direction in which the menu will decide to expand.
  *
  * Example usage:
+ *
  * @sample androidx.compose.material.samples.MenuSample
  *
  * Example usage with a [ScrollState] to control the menu items scroll position:
+ *
  * @sample androidx.compose.material.samples.MenuWithScrollStateSample
  *
  * @param expanded Whether the menu is currently open and visible to the user
- * @param onDismissRequest Called when the user requests to dismiss the menu, such as by
- * tapping outside the menu's bounds
+ * @param onDismissRequest Called when the user requests to dismiss the menu, such as by tapping
+ *   outside the menu's bounds
  * @param focusable Whether the dropdown can capture focus
  * @param modifier [Modifier] to be applied to the menu's content
  * @param offset [DpOffset] to be added to the position of the menu
@@ -150,9 +156,11 @@
  */
 @Deprecated(
     "Replaced by DropdownMenu with properties parameter",
-    ReplaceWith("DropdownMenu(expanded, onDismissRequest, modifier, offset, scrollState," +
-        "androidx.compose.ui.window.PopupProperties(focusable = focusable), " +
-        "content)"),
+    ReplaceWith(
+        "DropdownMenu(expanded, onDismissRequest, modifier, offset, scrollState," +
+            "androidx.compose.ui.window.PopupProperties(focusable = focusable), " +
+            "content)"
+    ),
     level = DeprecationLevel.HIDDEN
 )
 @Composable
@@ -164,15 +172,16 @@
     offset: DpOffset = DpOffset(0.dp, 0.dp),
     scrollState: ScrollState = rememberScrollState(),
     content: @Composable ColumnScope.() -> Unit
-): Unit = DropdownMenu(
-    expanded = expanded,
-    onDismissRequest = onDismissRequest,
-    modifier = modifier,
-    offset = offset,
-    scrollState = scrollState,
-    properties = PopupProperties(focusable = focusable),
-    content = content
-)
+): Unit =
+    DropdownMenu(
+        expanded = expanded,
+        onDismissRequest = onDismissRequest,
+        modifier = modifier,
+        offset = offset,
+        scrollState = scrollState,
+        properties = PopupProperties(focusable = focusable),
+        content = content
+    )
 
 // Workaround for `Overload resolution ambiguity` between old and new overload.
 @Deprecated("Maintained for binary compatibility", level = DeprecationLevel.HIDDEN)
@@ -184,15 +193,16 @@
     offset: DpOffset = DpOffset(0.dp, 0.dp),
     scrollState: ScrollState = rememberScrollState(),
     content: @Composable ColumnScope.() -> Unit
-): Unit = DropdownMenu(
-    expanded = expanded,
-    onDismissRequest = onDismissRequest,
-    modifier = modifier,
-    offset = offset,
-    scrollState = scrollState,
-    properties = PopupProperties(focusable = true),
-    content = content
-)
+): Unit =
+    DropdownMenu(
+        expanded = expanded,
+        onDismissRequest = onDismissRequest,
+        modifier = modifier,
+        offset = offset,
+        scrollState = scrollState,
+        properties = PopupProperties(focusable = true),
+        content = content
+    )
 
 /**
  * A variant of a dropdown menu that accepts a [DropdownMenuState] to allow precise positioning.
@@ -200,17 +210,18 @@
  * Typically, it should be combined with [Modifier.contextMenuOpenDetector] via state-hoisting.
  *
  * @param state The open/closed state of the menu.
- * @param onDismissRequest Called when the user requests to dismiss the menu, such as by
- * tapping outside the menu's bounds
- *
+ * @param onDismissRequest Called when the user requests to dismiss the menu, such as by tapping
+ *   outside the menu's bounds
  */
 @Deprecated(
     level = DeprecationLevel.HIDDEN,
-    replaceWith = ReplaceWith(
-        expression = "DropdownMenu(state, onDismissRequest, focusable, modifier, offset, " +
-            "rememberScrollState(), content)",
-        "androidx.compose.foundation.rememberScrollState"
-    ),
+    replaceWith =
+        ReplaceWith(
+            expression =
+                "DropdownMenu(state, onDismissRequest, focusable, modifier, offset, " +
+                    "rememberScrollState(), content)",
+            "androidx.compose.foundation.rememberScrollState"
+        ),
     message = "Replaced by a DropdownMenu function with a ScrollState parameter"
 )
 @Composable
@@ -221,14 +232,7 @@
     modifier: Modifier = Modifier,
     content: @Composable ColumnScope.() -> Unit
 ) {
-    DropdownMenu(
-        state,
-        onDismissRequest,
-        focusable,
-        modifier,
-        rememberScrollState(),
-        content
-    )
+    DropdownMenu(state, onDismissRequest, focusable, modifier, rememberScrollState(), content)
 }
 
 /**
@@ -237,11 +241,12 @@
  * Typically, it should be combined with [Modifier.contextMenuOpenDetector] via state-hoisting.
  *
  * Example usage with a [ScrollState] to control the menu items scroll position:
+ *
  * @sample androidx.compose.material.samples.MenuWithScrollStateSample
  *
  * @param state The open/closed state of the menu
- * @param onDismissRequest Called when the user requests to dismiss the menu, such as by
- * tapping outside the menu's bounds
+ * @param onDismissRequest Called when the user requests to dismiss the menu, such as by tapping
+ *   outside the menu's bounds
  * @param focusable Whether the dropdown can capture focus
  * @param modifier [Modifier] to be applied to the menu's content
  * @param scrollState a [ScrollState] to used by the menu's content for items vertical scrolling
@@ -280,15 +285,14 @@
     }
 }
 
-/**
- * The implementation of a [DropdownMenu] in its open state.
- */
+/** The implementation of a [DropdownMenu] in its open state. */
 @Composable
 private fun OpenDropdownMenu(
     expandedStates: MutableTransitionState<Boolean>,
     popupPositionProvider: PopupPositionProvider,
-    transformOriginState: MutableState<TransformOrigin> =
-        remember { mutableStateOf(TransformOrigin.Center) },
+    transformOriginState: MutableState<TransformOrigin> = remember {
+        mutableStateOf(TransformOrigin.Center)
+    },
     scrollState: ScrollState,
     onDismissRequest: () -> Unit,
     focusable: Boolean = true,
@@ -301,9 +305,7 @@
         onDismissRequest = onDismissRequest,
         popupPositionProvider = popupPositionProvider,
         properties = PopupProperties(focusable = focusable),
-        onKeyEvent = {
-            handlePopupOnKeyEvent(it, focusManager!!, inputModeManager!!)
-        },
+        onKeyEvent = { handlePopupOnKeyEvent(it, focusManager!!, inputModeManager!!) },
     ) {
         focusManager = LocalFocusManager.current
         inputModeManager = LocalInputModeManager.current
@@ -326,38 +328,40 @@
     contentPadding: PaddingValues,
     interactionSource: MutableInteractionSource?,
     content: @Composable RowScope.() -> Unit
-): Unit = DropdownMenuItemContent(
-    onClick,
-    modifier,
-    enabled,
-    contentPadding,
-    interactionSource,
-    content = content
-)
+): Unit =
+    DropdownMenuItemContent(
+        onClick,
+        modifier,
+        enabled,
+        contentPadding,
+        interactionSource,
+        content = content
+    )
 
 /**
- *
- * A [CursorDropdownMenu] behaves similarly to [Popup] and will use the current position of the mouse
- * cursor to position itself on screen.
+ * A [CursorDropdownMenu] behaves similarly to [Popup] and will use the current position of the
+ * mouse cursor to position itself on screen.
  *
  * The [content] of a [CursorDropdownMenu] will typically be [DropdownMenuItem]s, as well as custom
- * content. Using [DropdownMenuItem]s will result in a menu that matches the Material
- * specification for menus.
+ * content. Using [DropdownMenuItem]s will result in a menu that matches the Material specification
+ * for menus.
  *
  * @param expanded Whether the menu is currently open and visible to the user
- * @param onDismissRequest Called when the user requests to dismiss the menu, such as by
- * tapping outside the menu's bounds
+ * @param onDismissRequest Called when the user requests to dismiss the menu, such as by tapping
+ *   outside the menu's bounds
  * @param focusable Sets the ability for the menu to capture focus
  * @param modifier The modifier for this layout.
  * @param content The content lambda.
  */
 @Deprecated(
     level = DeprecationLevel.HIDDEN,
-    replaceWith = ReplaceWith(
-        expression = "CursorDropdownMenu(expanded, onDismissRequest, focusable, modifier, " +
-            "rememberScrollState(), content)",
-        "androidx.compose.foundation.rememberScrollState"
-    ),
+    replaceWith =
+        ReplaceWith(
+            expression =
+                "CursorDropdownMenu(expanded, onDismissRequest, focusable, modifier, " +
+                    "rememberScrollState(), content)",
+            "androidx.compose.foundation.rememberScrollState"
+        ),
     message = "Replaced by a CursorDropdownMenu function with a ScrollState parameter"
 )
 @Composable
@@ -367,27 +371,27 @@
     focusable: Boolean = true,
     modifier: Modifier = Modifier,
     content: @Composable ColumnScope.() -> Unit
-) = CursorDropdownMenu(
-    expanded = expanded,
-    onDismissRequest = onDismissRequest,
-    focusable = focusable,
-    modifier = modifier,
-    scrollState = rememberScrollState(),
-    content = content
-)
+) =
+    CursorDropdownMenu(
+        expanded = expanded,
+        onDismissRequest = onDismissRequest,
+        focusable = focusable,
+        modifier = modifier,
+        scrollState = rememberScrollState(),
+        content = content
+    )
 
 /**
- *
- * A [CursorDropdownMenu] behaves similarly to [Popup] and will use the current position of the mouse
- * cursor to position itself on screen.
+ * A [CursorDropdownMenu] behaves similarly to [Popup] and will use the current position of the
+ * mouse cursor to position itself on screen.
  *
  * The [content] of a [CursorDropdownMenu] will typically be [DropdownMenuItem]s, as well as custom
- * content. Using [DropdownMenuItem]s will result in a menu that matches the Material
- * specification for menus.
+ * content. Using [DropdownMenuItem]s will result in a menu that matches the Material specification
+ * for menus.
  *
  * @param expanded Whether the menu is currently open and visible to the user
- * @param onDismissRequest Called when the user requests to dismiss the menu, such as by
- * tapping outside the menu's bounds
+ * @param onDismissRequest Called when the user requests to dismiss the menu, such as by tapping
+ *   outside the menu's bounds
  * @param focusable Whether the dropdown can capture focus
  * @param modifier [Modifier] to be applied to the menu's content
  * @param scrollState a [ScrollState] to used by the menu's content for items vertical scrolling
@@ -418,15 +422,11 @@
     }
 }
 
-/**
- * Represents the open/closed state of a dropdown menu.
- */
+/** Represents the open/closed state of a dropdown menu. */
 @Stable
 class DropdownMenuState(initialStatus: Status = Status.Closed) {
 
-    /**
-     * The current status of the menu.
-     */
+    /** The current status of the menu. */
     var status: Status by mutableStateOf(initialStatus)
 
     @Immutable
@@ -435,14 +435,11 @@
         class Open(val position: Offset) : Status() {
 
             override fun equals(other: Any?): Boolean {
-                if (this === other)
-                    return true
+                if (this === other) return true
 
-                if (other !is Open)
-                    return false
+                if (other !is Open) return false
 
-                if (position != other.position)
-                    return false
+                if (position != other.position) return false
 
                 return true
             }
diff --git a/compose/material/material/src/desktopMain/kotlin/androidx/compose/material/MaterialTheme.desktop.kt b/compose/material/material/src/desktopMain/kotlin/androidx/compose/material/MaterialTheme.desktop.kt
index 33b86ee..b4d36c6 100644
--- a/compose/material/material/src/desktopMain/kotlin/androidx/compose/material/MaterialTheme.desktop.kt
+++ b/compose/material/material/src/desktopMain/kotlin/androidx/compose/material/MaterialTheme.desktop.kt
@@ -24,11 +24,13 @@
 @Composable
 internal actual fun PlatformMaterialTheme(content: @Composable () -> Unit) {
     CompositionLocalProvider(
-        LocalScrollbarStyle provides defaultScrollbarStyle().copy(
-            shape = MaterialTheme.shapes.small,
-            unhoverColor = MaterialTheme.colors.onSurface.copy(alpha = 0.12f),
-            hoverColor = MaterialTheme.colors.onSurface.copy(alpha = 0.50f)
-        ),
+        LocalScrollbarStyle provides
+            defaultScrollbarStyle()
+                .copy(
+                    shape = MaterialTheme.shapes.small,
+                    unhoverColor = MaterialTheme.colors.onSurface.copy(alpha = 0.12f),
+                    hoverColor = MaterialTheme.colors.onSurface.copy(alpha = 0.50f)
+                ),
         content = content
     )
 }
diff --git a/compose/material/material/src/desktopMain/kotlin/androidx/compose/material/SystemBarsDefaultInsets.desktop.kt b/compose/material/material/src/desktopMain/kotlin/androidx/compose/material/SystemBarsDefaultInsets.desktop.kt
index 0d5c025..3ca24d7 100644
--- a/compose/material/material/src/desktopMain/kotlin/androidx/compose/material/SystemBarsDefaultInsets.desktop.kt
+++ b/compose/material/material/src/desktopMain/kotlin/androidx/compose/material/SystemBarsDefaultInsets.desktop.kt
@@ -21,5 +21,4 @@
 import androidx.compose.ui.unit.dp
 
 internal actual val WindowInsets.Companion.systemBarsForVisualComponents: WindowInsets
-    @Composable
-    get() = WindowInsets(0.dp, 0.dp, 0.dp, 0.dp)
+    @Composable get() = WindowInsets(0.dp, 0.dp, 0.dp, 0.dp)
diff --git a/compose/material/material/src/desktopTest/kotlin/androidx/compose/material/DesktopAlertDialogTest.kt b/compose/material/material/src/desktopTest/kotlin/androidx/compose/material/DesktopAlertDialogTest.kt
index 2b3ac58..4a7d166 100644
--- a/compose/material/material/src/desktopTest/kotlin/androidx/compose/material/DesktopAlertDialogTest.kt
+++ b/compose/material/material/src/desktopTest/kotlin/androidx/compose/material/DesktopAlertDialogTest.kt
@@ -36,8 +36,7 @@
 @RunWith(JUnit4::class)
 class DesktopAlertDialogTest {
 
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
     @Test
     fun alignedToCenter_inPureWindow() {
@@ -52,13 +51,14 @@
                     title = { Text("AlerDialog") },
                     text = { Text("Apply?") },
                     confirmButton = { Button(onClick = {}) { Text("Apply") } },
-                    modifier = Modifier.size(dialogSize.width.dp, dialogSize.height.dp)
-                        .onGloballyPositioned { location = it.positionInRoot() }
+                    modifier =
+                        Modifier.size(dialogSize.width.dp, dialogSize.height.dp)
+                            .onGloballyPositioned { location = it.positionInRoot() }
                 )
             }
         }
         rule.runOnIdle {
-           assertThat(location).isEqualTo(calculateCenterPosition(rootSize, dialogSize))
+            assertThat(location).isEqualTo(calculateCenterPosition(rootSize, dialogSize))
         }
     }
 
diff --git a/compose/material/material/src/desktopTest/kotlin/androidx/compose/material/DesktopMenuTest.kt b/compose/material/material/src/desktopTest/kotlin/androidx/compose/material/DesktopMenuTest.kt
index 14c9902..0dcc06a 100644
--- a/compose/material/material/src/desktopTest/kotlin/androidx/compose/material/DesktopMenuTest.kt
+++ b/compose/material/material/src/desktopTest/kotlin/androidx/compose/material/DesktopMenuTest.kt
@@ -34,21 +34,12 @@
     // Standard case: enough room to position below the anchor and align left
     @Test
     fun menu_positioning_alignLeft_belowAnchor() {
-        val anchorBounds = IntRect(
-            offset = IntOffset(10, 50),
-            size = IntSize(50, 20)
-        )
+        val anchorBounds = IntRect(offset = IntOffset(10, 50), size = IntSize(50, 20))
         val popupSize = IntSize(70, 70)
 
-        val position = DropdownMenuPositionProvider(
-            DpOffset.Zero,
-            Density(1f)
-        ).calculatePosition(
-            anchorBounds,
-            windowSize,
-            LayoutDirection.Ltr,
-            popupSize
-        )
+        val position =
+            DropdownMenuPositionProvider(DpOffset.Zero, Density(1f))
+                .calculatePosition(anchorBounds, windowSize, LayoutDirection.Ltr, popupSize)
 
         assertThat(position).isEqualTo(anchorBounds.bottomLeft)
     }
@@ -56,75 +47,45 @@
     // Standard RTL case: enough room to position below the anchor and align right
     @Test
     fun menu_positioning_rtl_alignRight_belowAnchor() {
-        val anchorBounds = IntRect(
-            offset = IntOffset(30, 50),
-            size = IntSize(50, 20)
-        )
+        val anchorBounds = IntRect(offset = IntOffset(30, 50), size = IntSize(50, 20))
         val popupSize = IntSize(70, 70)
 
-        val position = DropdownMenuPositionProvider(
-            DpOffset.Zero,
-            Density(1f)
-        ).calculatePosition(
-            anchorBounds,
-            windowSize,
-            LayoutDirection.Rtl,
-            popupSize
-        )
+        val position =
+            DropdownMenuPositionProvider(DpOffset.Zero, Density(1f))
+                .calculatePosition(anchorBounds, windowSize, LayoutDirection.Rtl, popupSize)
 
-        assertThat(position).isEqualTo(
-            IntOffset(
-                x = anchorBounds.right - popupSize.width,
-                y = anchorBounds.bottom
-            )
-        )
+        assertThat(position)
+            .isEqualTo(IntOffset(x = anchorBounds.right - popupSize.width, y = anchorBounds.bottom))
     }
 
     // Not enough room to position the popup below the anchor, but enough room above
     @Test
     fun menu_positioning_alignLeft_aboveAnchor() {
-        val anchorBounds = IntRect(
-            offset = IntOffset(10, 150),
-            size = IntSize(50, 30)
-        )
+        val anchorBounds = IntRect(offset = IntOffset(10, 150), size = IntSize(50, 30))
         val popupSize = IntSize(70, 30)
 
-        val position = DropdownMenuPositionProvider(
-            DpOffset.Zero,
-            Density(1f)
-        ).calculatePosition(
-            anchorBounds,
-            windowSize,
-            LayoutDirection.Ltr,
-            popupSize
-        )
+        val position =
+            DropdownMenuPositionProvider(DpOffset.Zero, Density(1f))
+                .calculatePosition(anchorBounds, windowSize, LayoutDirection.Ltr, popupSize)
 
-        assertThat(position).isEqualTo(
-            IntOffset(
-                x = anchorBounds.left,
-                y = anchorBounds.top - popupSize.height
-            )
-        )
+        assertThat(position)
+            .isEqualTo(IntOffset(x = anchorBounds.left, y = anchorBounds.top - popupSize.height))
     }
 
     // Anchor left is at negative coordinates, so align popup to the left of the window
     @Test
     fun menu_positioning_windowLeft_belowAnchor() {
-        val anchorBounds = IntRect(
-            offset = IntOffset(-10, 50),
-            size = IntSize(50, 20)
-        )
+        val anchorBounds = IntRect(offset = IntOffset(-10, 50), size = IntSize(50, 20))
         val popupSize = IntSize(70, 50)
 
-        val position = DropdownMenuPositionProvider(
-            DpOffset.Zero,
-            Density(1f)
-        ).calculatePosition(
-            anchorBounds = anchorBounds,
-            windowSize,
-            LayoutDirection.Ltr,
-            popupSize
-        )
+        val position =
+            DropdownMenuPositionProvider(DpOffset.Zero, Density(1f))
+                .calculatePosition(
+                    anchorBounds = anchorBounds,
+                    windowSize,
+                    LayoutDirection.Ltr,
+                    popupSize
+                )
 
         assertThat(position).isEqualTo(IntOffset(0, anchorBounds.bottom))
     }
diff --git a/compose/material/material/src/skikoMain/kotlin/androidx/compose/material/AlertDialog.skiko.kt b/compose/material/material/src/skikoMain/kotlin/androidx/compose/material/AlertDialog.skiko.kt
index 0654b8e..d5533bc 100644
--- a/compose/material/material/src/skikoMain/kotlin/androidx/compose/material/AlertDialog.skiko.kt
+++ b/compose/material/material/src/skikoMain/kotlin/androidx/compose/material/AlertDialog.skiko.kt
@@ -38,18 +38,19 @@
     backgroundColor: Color,
     contentColor: Color,
     properties: DialogProperties
-): Unit = AlertDialogImpl(
-    onDismissRequest = onDismissRequest,
-    confirmButton = confirmButton,
-    modifier = modifier,
-    dismissButton = dismissButton,
-    title = title,
-    text = text,
-    shape = shape,
-    backgroundColor = backgroundColor,
-    contentColor = contentColor,
-    properties = properties
-)
+): Unit =
+    AlertDialogImpl(
+        onDismissRequest = onDismissRequest,
+        confirmButton = confirmButton,
+        modifier = modifier,
+        dismissButton = dismissButton,
+        title = title,
+        text = text,
+        shape = shape,
+        backgroundColor = backgroundColor,
+        contentColor = contentColor,
+        properties = properties
+    )
 
 @Composable
 actual fun AlertDialog(
@@ -62,14 +63,15 @@
     backgroundColor: Color,
     contentColor: Color,
     properties: DialogProperties
-): Unit = AlertDialogImpl(
-    onDismissRequest = onDismissRequest,
-    buttons = buttons,
-    modifier = modifier,
-    title = title,
-    text = text,
-    shape = shape,
-    backgroundColor = backgroundColor,
-    contentColor = contentColor,
-    properties = properties
-)
+): Unit =
+    AlertDialogImpl(
+        onDismissRequest = onDismissRequest,
+        buttons = buttons,
+        modifier = modifier,
+        title = title,
+        text = text,
+        shape = shape,
+        backgroundColor = backgroundColor,
+        contentColor = contentColor,
+        properties = properties
+    )
diff --git a/compose/material/material/src/skikoMain/kotlin/androidx/compose/material/Menu.skiko.kt b/compose/material/material/src/skikoMain/kotlin/androidx/compose/material/Menu.skiko.kt
index c3972b2..32f2275 100644
--- a/compose/material/material/src/skikoMain/kotlin/androidx/compose/material/Menu.skiko.kt
+++ b/compose/material/material/src/skikoMain/kotlin/androidx/compose/material/Menu.skiko.kt
@@ -59,12 +59,10 @@
     if (expandedStates.currentState || expandedStates.targetState) {
         val transformOriginState = remember { mutableStateOf(TransformOrigin.Center) }
         val density = LocalDensity.current
-        val popupPositionProvider = DropdownMenuPositionProvider(
-            offset,
-            density
-        ) { parentBounds, menuBounds ->
-            transformOriginState.value = calculateTransformOrigin(parentBounds, menuBounds)
-        }
+        val popupPositionProvider =
+            DropdownMenuPositionProvider(offset, density) { parentBounds, menuBounds ->
+                transformOriginState.value = calculateTransformOrigin(parentBounds, menuBounds)
+            }
 
         var focusManager: FocusManager? by mutableStateOf(null)
         var inputModeManager: InputModeManager? by mutableStateOf(null)
@@ -72,9 +70,7 @@
             onDismissRequest = onDismissRequest,
             popupPositionProvider = popupPositionProvider,
             properties = properties,
-            onKeyEvent = {
-                handlePopupOnKeyEvent(it, focusManager, inputModeManager)
-            },
+            onKeyEvent = { handlePopupOnKeyEvent(it, focusManager, inputModeManager) },
         ) {
             focusManager = LocalFocusManager.current
             inputModeManager = LocalInputModeManager.current
@@ -100,20 +96,21 @@
     keyEvent: KeyEvent,
     focusManager: FocusManager?,
     inputModeManager: InputModeManager?
-): Boolean = if (keyEvent.type == KeyEventType.KeyDown) {
-    when (keyEvent.key) {
-        Key.DirectionDown -> {
-            inputModeManager?.requestInputMode(InputMode.Keyboard)
-            focusManager?.moveFocus(FocusDirection.Next)
-            true
+): Boolean =
+    if (keyEvent.type == KeyEventType.KeyDown) {
+        when (keyEvent.key) {
+            Key.DirectionDown -> {
+                inputModeManager?.requestInputMode(InputMode.Keyboard)
+                focusManager?.moveFocus(FocusDirection.Next)
+                true
+            }
+            Key.DirectionUp -> {
+                inputModeManager?.requestInputMode(InputMode.Keyboard)
+                focusManager?.moveFocus(FocusDirection.Previous)
+                true
+            }
+            else -> false
         }
-        Key.DirectionUp -> {
-            inputModeManager?.requestInputMode(InputMode.Keyboard)
-            focusManager?.moveFocus(FocusDirection.Previous)
-            true
-        }
-        else -> false
+    } else {
+        false
     }
-} else {
-    false
-}
diff --git a/compose/material3/adaptive/adaptive-layout/src/androidInstrumentedTest/kotlin/androidx/compose/material3/adaptive/layout/LargeScreenTestUtils.kt b/compose/material3/adaptive/adaptive-layout/src/androidInstrumentedTest/kotlin/androidx/compose/material3/adaptive/layout/LargeScreenTestUtils.kt
index 37edf98c..fbc519f 100644
--- a/compose/material3/adaptive/adaptive-layout/src/androidInstrumentedTest/kotlin/androidx/compose/material3/adaptive/layout/LargeScreenTestUtils.kt
+++ b/compose/material3/adaptive/adaptive-layout/src/androidInstrumentedTest/kotlin/androidx/compose/material3/adaptive/layout/LargeScreenTestUtils.kt
@@ -36,12 +36,9 @@
 ) {
     setContent {
         val currentDensity = LocalDensity.current
-        val windowSize = with(currentDensity) {
-            currentWindowSize().toSize().toDpSize();
-        }
-        val simulatedDensity = Density(
-            currentDensity.density * (windowSize.width / simulatedWidth)
-        )
+        val windowSize = with(currentDensity) { currentWindowSize().toSize().toDpSize() }
+
+        val simulatedDensity = Density(currentDensity.density * (windowSize.width / simulatedWidth))
         CompositionLocalProvider(LocalDensity provides simulatedDensity) {
             Box(
                 Modifier.fillMaxWidth().height(simulatedHeight),
diff --git a/compose/material3/adaptive/adaptive-layout/src/androidInstrumentedTest/kotlin/androidx/compose/material3/adaptive/layout/ThreePaneScaffoldScreenshotTest.kt b/compose/material3/adaptive/adaptive-layout/src/androidInstrumentedTest/kotlin/androidx/compose/material3/adaptive/layout/ThreePaneScaffoldScreenshotTest.kt
index c32aa76a..d8bfa84 100644
--- a/compose/material3/adaptive/adaptive-layout/src/androidInstrumentedTest/kotlin/androidx/compose/material3/adaptive/layout/ThreePaneScaffoldScreenshotTest.kt
+++ b/compose/material3/adaptive/adaptive-layout/src/androidInstrumentedTest/kotlin/androidx/compose/material3/adaptive/layout/ThreePaneScaffoldScreenshotTest.kt
@@ -40,104 +40,89 @@
 @SdkSuppress(minSdkVersion = Build.VERSION_CODES.O)
 @OptIn(ExperimentalMaterial3AdaptiveApi::class)
 class ThreePaneScaffoldScreenshotTest {
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
-    @get:Rule
-    val screenshotRule = AndroidXScreenshotTestRule(GOLDEN_MATERIAL3_ADAPTIVE)
+    @get:Rule val screenshotRule = AndroidXScreenshotTestRule(GOLDEN_MATERIAL3_ADAPTIVE)
 
     @Test
     fun threePaneScaffold_listDetailPaneOrder_standard() {
-        rule.setContent {
-            SampleThreePaneScaffoldStandardMode()
-        }
+        rule.setContent { SampleThreePaneScaffoldStandardMode() }
 
-        rule.onNodeWithTag(ThreePaneScaffoldTestTag)
+        rule
+            .onNodeWithTag(ThreePaneScaffoldTestTag)
             .captureToImage()
             .assertAgainstGolden(screenshotRule, "threePaneScaffold_listDetail_standard")
     }
 
     @Test
     fun threePaneScaffold_listDetailPaneOrder_dense() {
-        rule.setContent {
-            SampleThreePaneScaffoldDenseMode()
-        }
+        rule.setContent { SampleThreePaneScaffoldDenseMode() }
 
-        rule.onNodeWithTag(ThreePaneScaffoldTestTag)
+        rule
+            .onNodeWithTag(ThreePaneScaffoldTestTag)
             .captureToImage()
             .assertAgainstGolden(screenshotRule, "threePaneScaffold_listDetail_dense")
     }
 
     @Test
     fun threePaneScaffold_listDetailPaneOrder_standard_medium_size_window() {
-        rule.setContentWithSimulatedSize(
-            simulatedWidth = 700.dp,
-            simulatedHeight = 500.dp
-        ) {
+        rule.setContentWithSimulatedSize(simulatedWidth = 700.dp, simulatedHeight = 500.dp) {
             SampleThreePaneScaffoldStandardMode()
         }
 
-        rule.onNodeWithTag(ThreePaneScaffoldTestTag)
+        rule
+            .onNodeWithTag(ThreePaneScaffoldTestTag)
             .captureToImage()
             .assertAgainstGolden(screenshotRule, "threePaneScaffold_listDetail_standard_medium")
     }
 
     @Test
     fun threePaneScaffold_listDetailPaneOrder_dense_medium_size_window() {
-        rule.setContentWithSimulatedSize(
-            simulatedWidth = 700.dp,
-            simulatedHeight = 500.dp
-        ) {
+        rule.setContentWithSimulatedSize(simulatedWidth = 700.dp, simulatedHeight = 500.dp) {
             SampleThreePaneScaffoldDenseMode()
         }
 
-        rule.onNodeWithTag(ThreePaneScaffoldTestTag)
+        rule
+            .onNodeWithTag(ThreePaneScaffoldTestTag)
             .captureToImage()
             .assertAgainstGolden(screenshotRule, "threePaneScaffold_listDetail_dense_medium")
     }
 
     @Test
     fun threePaneScaffold_listDetailPaneOrder_standard_expanded_size_window() {
-        rule.setContentWithSimulatedSize(
-            simulatedWidth = 1024.dp,
-            simulatedHeight = 800.dp
-        ) {
+        rule.setContentWithSimulatedSize(simulatedWidth = 1024.dp, simulatedHeight = 800.dp) {
             SampleThreePaneScaffoldStandardMode()
         }
 
-        rule.onNodeWithTag(ThreePaneScaffoldTestTag)
+        rule
+            .onNodeWithTag(ThreePaneScaffoldTestTag)
             .captureToImage()
             .assertAgainstGolden(screenshotRule, "threePaneScaffold_listDetail_standard_expanded")
     }
 
     @Test
     fun threePaneScaffold_listDetailPaneOrder_dense_expanded_size_window() {
-        rule.setContentWithSimulatedSize(
-            simulatedWidth = 1024.dp,
-            simulatedHeight = 800.dp
-        ) {
+        rule.setContentWithSimulatedSize(simulatedWidth = 1024.dp, simulatedHeight = 800.dp) {
             SampleThreePaneScaffoldDenseMode()
         }
 
-        rule.onNodeWithTag(ThreePaneScaffoldTestTag)
+        rule
+            .onNodeWithTag(ThreePaneScaffoldTestTag)
             .captureToImage()
             .assertAgainstGolden(screenshotRule, "threePaneScaffold_listDetail_dense_expanded")
     }
 
     @Test
     fun threePaneScaffold_paneExpansion_fixedFirstPaneWidth() {
-        rule.setContentWithSimulatedSize(
-            simulatedWidth = 1024.dp,
-            simulatedHeight = 800.dp
-        ) {
+        rule.setContentWithSimulatedSize(simulatedWidth = 1024.dp, simulatedHeight = 800.dp) {
             val mockPaneExpansionState = PaneExpansionState()
-            mockPaneExpansionState.firstPaneWidth = with(LocalDensity.current) {
-                412.dp.roundToPx()
-            }
+            mockPaneExpansionState.firstPaneWidth =
+                with(LocalDensity.current) { 412.dp.roundToPx() }
             SampleThreePaneScaffoldWithPaneExpansion(mockPaneExpansionState)
         }
 
-        rule.onNodeWithTag(ThreePaneScaffoldTestTag)
+        rule
+            .onNodeWithTag(ThreePaneScaffoldTestTag)
             .captureToImage()
             .assertAgainstGolden(
                 screenshotRule,
@@ -147,16 +132,14 @@
 
     @Test
     fun threePaneScaffold_paneExpansion_zeroFirstPaneWidth() {
-        rule.setContentWithSimulatedSize(
-            simulatedWidth = 1024.dp,
-            simulatedHeight = 800.dp
-        ) {
+        rule.setContentWithSimulatedSize(simulatedWidth = 1024.dp, simulatedHeight = 800.dp) {
             val mockPaneExpansionState = PaneExpansionState()
             mockPaneExpansionState.firstPaneWidth = 0
             SampleThreePaneScaffoldWithPaneExpansion(mockPaneExpansionState)
         }
 
-        rule.onNodeWithTag(ThreePaneScaffoldTestTag)
+        rule
+            .onNodeWithTag(ThreePaneScaffoldTestTag)
             .captureToImage()
             .assertAgainstGolden(
                 screenshotRule,
@@ -166,18 +149,15 @@
 
     @Test
     fun threePaneScaffold_paneExpansion_overflowFirstPaneWidth() {
-        rule.setContentWithSimulatedSize(
-            simulatedWidth = 1024.dp,
-            simulatedHeight = 800.dp
-        ) {
+        rule.setContentWithSimulatedSize(simulatedWidth = 1024.dp, simulatedHeight = 800.dp) {
             val mockPaneExpansionState = PaneExpansionState()
-            mockPaneExpansionState.firstPaneWidth = with(LocalDensity.current) {
-                1024.dp.roundToPx()
-            }
+            mockPaneExpansionState.firstPaneWidth =
+                with(LocalDensity.current) { 1024.dp.roundToPx() }
             SampleThreePaneScaffoldWithPaneExpansion(mockPaneExpansionState)
         }
 
-        rule.onNodeWithTag(ThreePaneScaffoldTestTag)
+        rule
+            .onNodeWithTag(ThreePaneScaffoldTestTag)
             .captureToImage()
             .assertAgainstGolden(
                 screenshotRule,
@@ -187,16 +167,14 @@
 
     @Test
     fun threePaneScaffold_paneExpansion_fixedFirstPanePercentage() {
-        rule.setContentWithSimulatedSize(
-            simulatedWidth = 1024.dp,
-            simulatedHeight = 800.dp
-        ) {
+        rule.setContentWithSimulatedSize(simulatedWidth = 1024.dp, simulatedHeight = 800.dp) {
             val mockPaneExpansionState = PaneExpansionState()
             mockPaneExpansionState.firstPanePercentage = 0.5f
             SampleThreePaneScaffoldWithPaneExpansion(mockPaneExpansionState)
         }
 
-        rule.onNodeWithTag(ThreePaneScaffoldTestTag)
+        rule
+            .onNodeWithTag(ThreePaneScaffoldTestTag)
             .captureToImage()
             .assertAgainstGolden(
                 screenshotRule,
@@ -206,16 +184,14 @@
 
     @Test
     fun threePaneScaffold_paneExpansion_zeroFirstPanePercentage() {
-        rule.setContentWithSimulatedSize(
-            simulatedWidth = 1024.dp,
-            simulatedHeight = 800.dp
-        ) {
+        rule.setContentWithSimulatedSize(simulatedWidth = 1024.dp, simulatedHeight = 800.dp) {
             val mockPaneExpansionState = PaneExpansionState()
             mockPaneExpansionState.firstPanePercentage = 0f
             SampleThreePaneScaffoldWithPaneExpansion(mockPaneExpansionState)
         }
 
-        rule.onNodeWithTag(ThreePaneScaffoldTestTag)
+        rule
+            .onNodeWithTag(ThreePaneScaffoldTestTag)
             .captureToImage()
             .assertAgainstGolden(
                 screenshotRule,
@@ -225,16 +201,14 @@
 
     @Test
     fun threePaneScaffold_paneExpansion_smallFirstPanePercentage() {
-        rule.setContentWithSimulatedSize(
-            simulatedWidth = 1024.dp,
-            simulatedHeight = 800.dp
-        ) {
+        rule.setContentWithSimulatedSize(simulatedWidth = 1024.dp, simulatedHeight = 800.dp) {
             val mockPaneExpansionState = PaneExpansionState()
             mockPaneExpansionState.firstPanePercentage = 0.05f
             SampleThreePaneScaffoldWithPaneExpansion(mockPaneExpansionState)
         }
 
-        rule.onNodeWithTag(ThreePaneScaffoldTestTag)
+        rule
+            .onNodeWithTag(ThreePaneScaffoldTestTag)
             .captureToImage()
             .assertAgainstGolden(
                 screenshotRule,
@@ -244,16 +218,14 @@
 
     @Test
     fun threePaneScaffold_paneExpansion_largeFirstPanePercentage() {
-        rule.setContentWithSimulatedSize(
-            simulatedWidth = 1024.dp,
-            simulatedHeight = 800.dp
-        ) {
+        rule.setContentWithSimulatedSize(simulatedWidth = 1024.dp, simulatedHeight = 800.dp) {
             val mockPaneExpansionState = PaneExpansionState()
             mockPaneExpansionState.firstPanePercentage = 0.95f
             SampleThreePaneScaffoldWithPaneExpansion(mockPaneExpansionState)
         }
 
-        rule.onNodeWithTag(ThreePaneScaffoldTestTag)
+        rule
+            .onNodeWithTag(ThreePaneScaffoldTestTag)
             .captureToImage()
             .assertAgainstGolden(
                 screenshotRule,
@@ -263,16 +235,14 @@
 
     @Test
     fun threePaneScaffold_paneExpansion_fullFirstPanePercentage() {
-        rule.setContentWithSimulatedSize(
-            simulatedWidth = 1024.dp,
-            simulatedHeight = 800.dp
-        ) {
+        rule.setContentWithSimulatedSize(simulatedWidth = 1024.dp, simulatedHeight = 800.dp) {
             val mockPaneExpansionState = PaneExpansionState()
             mockPaneExpansionState.firstPanePercentage = 1.0f
             SampleThreePaneScaffoldWithPaneExpansion(mockPaneExpansionState)
         }
 
-        rule.onNodeWithTag(ThreePaneScaffoldTestTag)
+        rule
+            .onNodeWithTag(ThreePaneScaffoldTestTag)
             .captureToImage()
             .assertAgainstGolden(
                 screenshotRule,
@@ -282,20 +252,15 @@
 
     @Test
     fun threePaneScaffold_paneExpansionWithDragHandle_fixedFirstPaneWidth() {
-        rule.setContentWithSimulatedSize(
-            simulatedWidth = 1024.dp,
-            simulatedHeight = 800.dp
-        ) {
+        rule.setContentWithSimulatedSize(simulatedWidth = 1024.dp, simulatedHeight = 800.dp) {
             val mockPaneExpansionState = PaneExpansionState()
-            mockPaneExpansionState.firstPaneWidth = with(LocalDensity.current) {
-                412.dp.roundToPx()
-            }
-            SampleThreePaneScaffoldWithPaneExpansion(mockPaneExpansionState) {
-                MockDragHandle(it)
-            }
+            mockPaneExpansionState.firstPaneWidth =
+                with(LocalDensity.current) { 412.dp.roundToPx() }
+            SampleThreePaneScaffoldWithPaneExpansion(mockPaneExpansionState) { MockDragHandle(it) }
         }
 
-        rule.onNodeWithTag(ThreePaneScaffoldTestTag)
+        rule
+            .onNodeWithTag(ThreePaneScaffoldTestTag)
             .captureToImage()
             .assertAgainstGolden(
                 screenshotRule,
@@ -305,18 +270,14 @@
 
     @Test
     fun threePaneScaffold_paneExpansionWithDragHandle_zeroFirstPaneWidth() {
-        rule.setContentWithSimulatedSize(
-            simulatedWidth = 1024.dp,
-            simulatedHeight = 800.dp
-        ) {
+        rule.setContentWithSimulatedSize(simulatedWidth = 1024.dp, simulatedHeight = 800.dp) {
             val mockPaneExpansionState = PaneExpansionState()
             mockPaneExpansionState.firstPaneWidth = 0
-            SampleThreePaneScaffoldWithPaneExpansion(mockPaneExpansionState) {
-                MockDragHandle(it)
-            }
+            SampleThreePaneScaffoldWithPaneExpansion(mockPaneExpansionState) { MockDragHandle(it) }
         }
 
-        rule.onNodeWithTag(ThreePaneScaffoldTestTag)
+        rule
+            .onNodeWithTag(ThreePaneScaffoldTestTag)
             .captureToImage()
             .assertAgainstGolden(
                 screenshotRule,
@@ -326,20 +287,15 @@
 
     @Test
     fun threePaneScaffold_paneExpansionWithDragHandle_overflowFirstPaneWidth() {
-        rule.setContentWithSimulatedSize(
-            simulatedWidth = 1024.dp,
-            simulatedHeight = 800.dp
-        ) {
+        rule.setContentWithSimulatedSize(simulatedWidth = 1024.dp, simulatedHeight = 800.dp) {
             val mockPaneExpansionState = PaneExpansionState()
-            mockPaneExpansionState.firstPaneWidth = with(LocalDensity.current) {
-                1024.dp.roundToPx()
-            }
-            SampleThreePaneScaffoldWithPaneExpansion(mockPaneExpansionState) {
-                MockDragHandle(it)
-            }
+            mockPaneExpansionState.firstPaneWidth =
+                with(LocalDensity.current) { 1024.dp.roundToPx() }
+            SampleThreePaneScaffoldWithPaneExpansion(mockPaneExpansionState) { MockDragHandle(it) }
         }
 
-        rule.onNodeWithTag(ThreePaneScaffoldTestTag)
+        rule
+            .onNodeWithTag(ThreePaneScaffoldTestTag)
             .captureToImage()
             .assertAgainstGolden(
                 screenshotRule,
@@ -349,16 +305,12 @@
 
     @Test
     fun threePaneScaffold_paneExpansionDragHandle_unspecifiedExpansionState() {
-        rule.setContentWithSimulatedSize(
-            simulatedWidth = 1024.dp,
-            simulatedHeight = 800.dp
-        ) {
-            SampleThreePaneScaffoldWithPaneExpansion(PaneExpansionState()) {
-                MockDragHandle(it)
-            }
+        rule.setContentWithSimulatedSize(simulatedWidth = 1024.dp, simulatedHeight = 800.dp) {
+            SampleThreePaneScaffoldWithPaneExpansion(PaneExpansionState()) { MockDragHandle(it) }
         }
 
-        rule.onNodeWithTag(ThreePaneScaffoldTestTag)
+        rule
+            .onNodeWithTag(ThreePaneScaffoldTestTag)
             .captureToImage()
             .assertAgainstGolden(
                 screenshotRule,
@@ -371,21 +323,15 @@
         val mockPaneExpansionState = PaneExpansionState()
         var mockDraggingDp = 0f
 
-        rule.setContentWithSimulatedSize(
-            simulatedWidth = 1024.dp,
-            simulatedHeight = 800.dp
-        ) {
+        rule.setContentWithSimulatedSize(simulatedWidth = 1024.dp, simulatedHeight = 800.dp) {
             mockDraggingDp = with(LocalDensity.current) { 200.dp.toPx() }
-            SampleThreePaneScaffoldWithPaneExpansion(mockPaneExpansionState) {
-                MockDragHandle(it)
-            }
+            SampleThreePaneScaffoldWithPaneExpansion(mockPaneExpansionState) { MockDragHandle(it) }
         }
 
-        rule.runOnIdle {
-            mockPaneExpansionState.dispatchRawDelta(mockDraggingDp)
-        }
+        rule.runOnIdle { mockPaneExpansionState.dispatchRawDelta(mockDraggingDp) }
 
-        rule.onNodeWithTag(ThreePaneScaffoldTestTag)
+        rule
+            .onNodeWithTag(ThreePaneScaffoldTestTag)
             .captureToImage()
             .assertAgainstGolden(
                 screenshotRule,
@@ -398,21 +344,15 @@
         val mockPaneExpansionState = PaneExpansionState()
         var mockDraggingDp = 0f
 
-        rule.setContentWithSimulatedSize(
-            simulatedWidth = 1024.dp,
-            simulatedHeight = 800.dp
-        ) {
+        rule.setContentWithSimulatedSize(simulatedWidth = 1024.dp, simulatedHeight = 800.dp) {
             mockDraggingDp = with(LocalDensity.current) { -360.dp.toPx() }
-            SampleThreePaneScaffoldWithPaneExpansion(mockPaneExpansionState) {
-                MockDragHandle(it)
-            }
+            SampleThreePaneScaffoldWithPaneExpansion(mockPaneExpansionState) { MockDragHandle(it) }
         }
 
-        rule.runOnIdle {
-            mockPaneExpansionState.dispatchRawDelta(mockDraggingDp)
-        }
+        rule.runOnIdle { mockPaneExpansionState.dispatchRawDelta(mockDraggingDp) }
 
-        rule.onNodeWithTag(ThreePaneScaffoldTestTag)
+        rule
+            .onNodeWithTag(ThreePaneScaffoldTestTag)
             .captureToImage()
             .assertAgainstGolden(
                 screenshotRule,
@@ -425,21 +365,15 @@
         val mockPaneExpansionState = PaneExpansionState()
         var mockDraggingDp = 0f
 
-        rule.setContentWithSimulatedSize(
-            simulatedWidth = 1024.dp,
-            simulatedHeight = 800.dp
-        ) {
+        rule.setContentWithSimulatedSize(simulatedWidth = 1024.dp, simulatedHeight = 800.dp) {
             mockDraggingDp = with(LocalDensity.current) { 640.dp.toPx() }
-            SampleThreePaneScaffoldWithPaneExpansion(mockPaneExpansionState) {
-                MockDragHandle(it)
-            }
+            SampleThreePaneScaffoldWithPaneExpansion(mockPaneExpansionState) { MockDragHandle(it) }
         }
 
-        rule.runOnIdle {
-            mockPaneExpansionState.dispatchRawDelta(mockDraggingDp)
-        }
+        rule.runOnIdle { mockPaneExpansionState.dispatchRawDelta(mockDraggingDp) }
 
-        rule.onNodeWithTag(ThreePaneScaffoldTestTag)
+        rule
+            .onNodeWithTag(ThreePaneScaffoldTestTag)
             .captureToImage()
             .assertAgainstGolden(
                 screenshotRule,
@@ -451,14 +385,13 @@
 @OptIn(ExperimentalMaterial3AdaptiveApi::class)
 @Composable
 private fun SampleThreePaneScaffoldStandardMode() {
-    val scaffoldDirective = calculatePaneScaffoldDirective(
-        currentWindowAdaptiveInfo()
-    )
-    val scaffoldValue = calculateThreePaneScaffoldValue(
-        scaffoldDirective.maxHorizontalPartitions,
-        ThreePaneScaffoldDefaults.adaptStrategies(),
-        null
-    )
+    val scaffoldDirective = calculatePaneScaffoldDirective(currentWindowAdaptiveInfo())
+    val scaffoldValue =
+        calculateThreePaneScaffoldValue(
+            scaffoldDirective.maxHorizontalPartitions,
+            ThreePaneScaffoldDefaults.adaptStrategies(),
+            null
+        )
     SampleThreePaneScaffold(
         scaffoldDirective,
         scaffoldValue,
@@ -469,14 +402,14 @@
 @OptIn(ExperimentalMaterial3AdaptiveApi::class)
 @Composable
 private fun SampleThreePaneScaffoldDenseMode() {
-    val scaffoldDirective = calculatePaneScaffoldDirectiveWithTwoPanesOnMediumWidth(
-        currentWindowAdaptiveInfo()
-    )
-    val scaffoldValue = calculateThreePaneScaffoldValue(
-        scaffoldDirective.maxHorizontalPartitions,
-        ThreePaneScaffoldDefaults.adaptStrategies(),
-        null
-    )
+    val scaffoldDirective =
+        calculatePaneScaffoldDirectiveWithTwoPanesOnMediumWidth(currentWindowAdaptiveInfo())
+    val scaffoldValue =
+        calculateThreePaneScaffoldValue(
+            scaffoldDirective.maxHorizontalPartitions,
+            ThreePaneScaffoldDefaults.adaptStrategies(),
+            null
+        )
     SampleThreePaneScaffold(
         scaffoldDirective,
         scaffoldValue,
@@ -490,14 +423,13 @@
     paneExpansionState: PaneExpansionState,
     paneExpansionDragHandle: (@Composable (PaneExpansionState) -> Unit)? = null,
 ) {
-    val scaffoldDirective = calculatePaneScaffoldDirective(
-        currentWindowAdaptiveInfo()
-    )
-    val scaffoldValue = calculateThreePaneScaffoldValue(
-        scaffoldDirective.maxHorizontalPartitions,
-        ThreePaneScaffoldDefaults.adaptStrategies(),
-        null
-    )
+    val scaffoldDirective = calculatePaneScaffoldDirective(currentWindowAdaptiveInfo())
+    val scaffoldValue =
+        calculateThreePaneScaffoldValue(
+            scaffoldDirective.maxHorizontalPartitions,
+            ThreePaneScaffoldDefaults.adaptStrategies(),
+            null
+        )
     SampleThreePaneScaffold(
         scaffoldDirective = scaffoldDirective,
         scaffoldValue = scaffoldValue,
diff --git a/compose/material3/adaptive/adaptive-layout/src/androidInstrumentedTest/kotlin/androidx/compose/material3/adaptive/layout/ThreePaneScaffoldTest.kt b/compose/material3/adaptive/adaptive-layout/src/androidInstrumentedTest/kotlin/androidx/compose/material3/adaptive/layout/ThreePaneScaffoldTest.kt
index ab2a989..860b4dc 100644
--- a/compose/material3/adaptive/adaptive-layout/src/androidInstrumentedTest/kotlin/androidx/compose/material3/adaptive/layout/ThreePaneScaffoldTest.kt
+++ b/compose/material3/adaptive/adaptive-layout/src/androidInstrumentedTest/kotlin/androidx/compose/material3/adaptive/layout/ThreePaneScaffoldTest.kt
@@ -44,35 +44,32 @@
 @MediumTest
 @RunWith(AndroidJUnit4::class)
 class ThreePaneScaffoldTest {
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
     @Test
     fun threePaneScaffold_allPanesHidden_noVisiblePanes() {
-         val testScaffoldValue = ThreePaneScaffoldValue(
-             PaneAdaptedValue.Hidden,
-             PaneAdaptedValue.Hidden,
-             PaneAdaptedValue.Hidden
-         )
-         rule.setContent {
-             SampleThreePaneScaffold(scaffoldValue = testScaffoldValue)
-         }
+        val testScaffoldValue =
+            ThreePaneScaffoldValue(
+                PaneAdaptedValue.Hidden,
+                PaneAdaptedValue.Hidden,
+                PaneAdaptedValue.Hidden
+            )
+        rule.setContent { SampleThreePaneScaffold(scaffoldValue = testScaffoldValue) }
 
-         rule.onNodeWithTag("PrimaryPane").assertDoesNotExist()
-         rule.onNodeWithTag("SecondaryPane").assertDoesNotExist()
-         rule.onNodeWithTag("TertiaryPane").assertDoesNotExist()
+        rule.onNodeWithTag("PrimaryPane").assertDoesNotExist()
+        rule.onNodeWithTag("SecondaryPane").assertDoesNotExist()
+        rule.onNodeWithTag("TertiaryPane").assertDoesNotExist()
     }
 
     @Test
     fun threePaneScaffold_oneExpandedPane_onlyExpandedPanesAreVisible() {
-        val testScaffoldValue = ThreePaneScaffoldValue(
-            PaneAdaptedValue.Expanded,
-            PaneAdaptedValue.Hidden,
-            PaneAdaptedValue.Hidden
-        )
-        rule.setContent {
-            SampleThreePaneScaffold(scaffoldValue = testScaffoldValue)
-        }
+        val testScaffoldValue =
+            ThreePaneScaffoldValue(
+                PaneAdaptedValue.Expanded,
+                PaneAdaptedValue.Hidden,
+                PaneAdaptedValue.Hidden
+            )
+        rule.setContent { SampleThreePaneScaffold(scaffoldValue = testScaffoldValue) }
 
         rule.onNodeWithTag("PrimaryPane").assertExists()
         rule.onNodeWithTag("SecondaryPane").assertDoesNotExist()
@@ -81,14 +78,13 @@
 
     @Test
     fun threePaneScaffold_twoExpandedPanes_onlyExpandedPanesAreVisible() {
-        val testScaffoldValue = ThreePaneScaffoldValue(
-            PaneAdaptedValue.Hidden,
-            PaneAdaptedValue.Expanded,
-            PaneAdaptedValue.Expanded
-        )
-        rule.setContent {
-            SampleThreePaneScaffold(scaffoldValue = testScaffoldValue)
-        }
+        val testScaffoldValue =
+            ThreePaneScaffoldValue(
+                PaneAdaptedValue.Hidden,
+                PaneAdaptedValue.Expanded,
+                PaneAdaptedValue.Expanded
+            )
+        rule.setContent { SampleThreePaneScaffold(scaffoldValue = testScaffoldValue) }
 
         rule.onNodeWithTag("PrimaryPane").assertDoesNotExist()
         rule.onNodeWithTag("SecondaryPane").assertExists()
@@ -97,14 +93,13 @@
 
     @Test
     fun threePaneScaffold_threeExpandedPanes_onlyExpandedPanesAreVisible() {
-        val testScaffoldValue = ThreePaneScaffoldValue(
-            PaneAdaptedValue.Expanded,
-            PaneAdaptedValue.Expanded,
-            PaneAdaptedValue.Expanded
-        )
-        rule.setContent {
-            SampleThreePaneScaffold(scaffoldValue = testScaffoldValue)
-        }
+        val testScaffoldValue =
+            ThreePaneScaffoldValue(
+                PaneAdaptedValue.Expanded,
+                PaneAdaptedValue.Expanded,
+                PaneAdaptedValue.Expanded
+            )
+        rule.setContent { SampleThreePaneScaffold(scaffoldValue = testScaffoldValue) }
 
         rule.onNodeWithTag("PrimaryPane").assertExists()
         rule.onNodeWithTag("SecondaryPane").assertExists()
@@ -113,26 +108,26 @@
 
     @Test
     fun threePaneScaffold_scaffoldValueChangeWithSinglePane_expandedPanesAreChanged() {
-        var testScaffoldValue by mutableStateOf(
-            ThreePaneScaffoldValue(
-                PaneAdaptedValue.Expanded,
-                PaneAdaptedValue.Hidden,
-                PaneAdaptedValue.Hidden
+        var testScaffoldValue by
+            mutableStateOf(
+                ThreePaneScaffoldValue(
+                    PaneAdaptedValue.Expanded,
+                    PaneAdaptedValue.Hidden,
+                    PaneAdaptedValue.Hidden
+                )
             )
-        )
-        rule.setContent {
-            SampleThreePaneScaffold(scaffoldValue = testScaffoldValue)
-        }
+        rule.setContent { SampleThreePaneScaffold(scaffoldValue = testScaffoldValue) }
 
         rule.onNodeWithTag("PrimaryPane").assertExists()
         rule.onNodeWithTag("SecondaryPane").assertDoesNotExist()
         rule.onNodeWithTag("TertiaryPane").assertDoesNotExist()
 
-        testScaffoldValue = ThreePaneScaffoldValue(
-            PaneAdaptedValue.Hidden,
-            PaneAdaptedValue.Expanded,
-            PaneAdaptedValue.Hidden
-        )
+        testScaffoldValue =
+            ThreePaneScaffoldValue(
+                PaneAdaptedValue.Hidden,
+                PaneAdaptedValue.Expanded,
+                PaneAdaptedValue.Hidden
+            )
 
         rule.waitForIdle()
 
@@ -143,26 +138,26 @@
 
     @Test
     fun threePaneScaffold_scaffoldValueChangeWithDualPane_expandedPanesAreChanged() {
-        var testScaffoldValue by mutableStateOf(
-            ThreePaneScaffoldValue(
-                PaneAdaptedValue.Expanded,
-                PaneAdaptedValue.Hidden,
-                PaneAdaptedValue.Expanded
+        var testScaffoldValue by
+            mutableStateOf(
+                ThreePaneScaffoldValue(
+                    PaneAdaptedValue.Expanded,
+                    PaneAdaptedValue.Hidden,
+                    PaneAdaptedValue.Expanded
+                )
             )
-        )
-        rule.setContent {
-            SampleThreePaneScaffold(scaffoldValue = testScaffoldValue)
-        }
+        rule.setContent { SampleThreePaneScaffold(scaffoldValue = testScaffoldValue) }
 
         rule.onNodeWithTag("PrimaryPane").assertExists()
         rule.onNodeWithTag("SecondaryPane").assertDoesNotExist()
         rule.onNodeWithTag("TertiaryPane").assertExists()
 
-        testScaffoldValue = ThreePaneScaffoldValue(
-            PaneAdaptedValue.Expanded,
-            PaneAdaptedValue.Expanded,
-            PaneAdaptedValue.Hidden
-        )
+        testScaffoldValue =
+            ThreePaneScaffoldValue(
+                PaneAdaptedValue.Expanded,
+                PaneAdaptedValue.Expanded,
+                PaneAdaptedValue.Hidden
+            )
 
         rule.waitForIdle()
 
@@ -178,31 +173,22 @@
         var expectedSettledOffsetPx = 0
         lateinit var scope: CoroutineScope
 
-        rule.setContentWithSimulatedSize(
-            simulatedWidth = 1024.dp,
-            simulatedHeight = 800.dp
-        ) {
+        rule.setContentWithSimulatedSize(simulatedWidth = 1024.dp, simulatedHeight = 800.dp) {
             scope = rememberCoroutineScope()
             mockDraggingPx = with(LocalDensity.current) { 200.dp.toPx() }
-            expectedSettledOffsetPx = with(LocalDensity.current) {
-                MockPaneExpansionMiddleAnchor.toPx().toInt()
-            }
-            SampleThreePaneScaffoldWithPaneExpansion(mockPaneExpansionState) {
-                MockDragHandle(it)
-            }
+            expectedSettledOffsetPx =
+                with(LocalDensity.current) { MockPaneExpansionMiddleAnchor.toPx().toInt() }
+            SampleThreePaneScaffoldWithPaneExpansion(mockPaneExpansionState) { MockDragHandle(it) }
         }
 
         rule.runOnIdle {
             mockPaneExpansionState.dispatchRawDelta(mockDraggingPx)
-            scope.launch {
-                mockPaneExpansionState.settleToAnchorIfNeeded(0F)
-            }
+            scope.launch { mockPaneExpansionState.settleToAnchorIfNeeded(0F) }
         }
 
         rule.runOnIdle {
-            assertThat(mockPaneExpansionState.currentMeasuredDraggingOffset).isEqualTo(
-                expectedSettledOffsetPx
-            )
+            assertThat(mockPaneExpansionState.currentMeasuredDraggingOffset)
+                .isEqualTo(expectedSettledOffsetPx)
         }
     }
 
@@ -212,28 +198,20 @@
         var mockDraggingPx = 0f
         lateinit var scope: CoroutineScope
 
-        rule.setContentWithSimulatedSize(
-            simulatedWidth = 1024.dp,
-            simulatedHeight = 800.dp
-        ) {
+        rule.setContentWithSimulatedSize(simulatedWidth = 1024.dp, simulatedHeight = 800.dp) {
             scope = rememberCoroutineScope()
             mockDraggingPx = with(LocalDensity.current) { 200.dp.toPx() }
-            SampleThreePaneScaffoldWithPaneExpansion(mockPaneExpansionState) {
-                MockDragHandle(it)
-            }
+            SampleThreePaneScaffoldWithPaneExpansion(mockPaneExpansionState) { MockDragHandle(it) }
         }
 
         rule.runOnIdle {
             mockPaneExpansionState.dispatchRawDelta(mockDraggingPx)
-            scope.launch {
-                mockPaneExpansionState.settleToAnchorIfNeeded(400F)
-            }
+            scope.launch { mockPaneExpansionState.settleToAnchorIfNeeded(400F) }
         }
 
         rule.runOnIdle {
-            assertThat(mockPaneExpansionState.currentMeasuredDraggingOffset).isEqualTo(
-                mockPaneExpansionState.maxExpansionWidth
-            )
+            assertThat(mockPaneExpansionState.currentMeasuredDraggingOffset)
+                .isEqualTo(mockPaneExpansionState.maxExpansionWidth)
         }
     }
 
@@ -243,22 +221,15 @@
         var mockDraggingDp = 0f
         lateinit var scope: CoroutineScope
 
-        rule.setContentWithSimulatedSize(
-            simulatedWidth = 1024.dp,
-            simulatedHeight = 800.dp
-        ) {
+        rule.setContentWithSimulatedSize(simulatedWidth = 1024.dp, simulatedHeight = 800.dp) {
             scope = rememberCoroutineScope()
             mockDraggingDp = with(LocalDensity.current) { -360.dp.toPx() }
-            SampleThreePaneScaffoldWithPaneExpansion(mockPaneExpansionState) {
-                MockDragHandle(it)
-            }
+            SampleThreePaneScaffoldWithPaneExpansion(mockPaneExpansionState) { MockDragHandle(it) }
         }
 
         rule.runOnIdle {
             mockPaneExpansionState.dispatchRawDelta(mockDraggingDp)
-            scope.launch {
-                mockPaneExpansionState.settleToAnchorIfNeeded(-200F)
-            }
+            scope.launch { mockPaneExpansionState.settleToAnchorIfNeeded(-200F) }
         }
 
         rule.runOnIdle {
@@ -272,28 +243,20 @@
         var mockDraggingDp = 0f
         lateinit var scope: CoroutineScope
 
-        rule.setContentWithSimulatedSize(
-            simulatedWidth = 1024.dp,
-            simulatedHeight = 800.dp
-        ) {
+        rule.setContentWithSimulatedSize(simulatedWidth = 1024.dp, simulatedHeight = 800.dp) {
             scope = rememberCoroutineScope()
             mockDraggingDp = with(LocalDensity.current) { 640.dp.toPx() }
-            SampleThreePaneScaffoldWithPaneExpansion(mockPaneExpansionState) {
-                MockDragHandle(it)
-            }
+            SampleThreePaneScaffoldWithPaneExpansion(mockPaneExpansionState) { MockDragHandle(it) }
         }
 
         rule.runOnIdle {
             mockPaneExpansionState.dispatchRawDelta(mockDraggingDp)
-            scope.launch {
-                mockPaneExpansionState.settleToAnchorIfNeeded(200F)
-            }
+            scope.launch { mockPaneExpansionState.settleToAnchorIfNeeded(200F) }
         }
 
         rule.runOnIdle {
-            assertThat(mockPaneExpansionState.currentMeasuredDraggingOffset).isEqualTo(
-                mockPaneExpansionState.maxExpansionWidth
-            )
+            assertThat(mockPaneExpansionState.currentMeasuredDraggingOffset)
+                .isEqualTo(mockPaneExpansionState.maxExpansionWidth)
         }
     }
 }
@@ -305,11 +268,12 @@
 private val MockPaneExpansionMiddleAnchor = 400.dp
 
 @OptIn(ExperimentalMaterial3AdaptiveApi::class)
-private val MockPaneExpansionAnchors = listOf(
-    PaneExpansionAnchor(percentage = 0),
-    PaneExpansionAnchor(startOffset = MockPaneExpansionMiddleAnchor),
-    PaneExpansionAnchor(percentage = 100),
-)
+private val MockPaneExpansionAnchors =
+    listOf(
+        PaneExpansionAnchor(percentage = 0),
+        PaneExpansionAnchor(startOffset = MockPaneExpansionMiddleAnchor),
+        PaneExpansionAnchor(percentage = 100),
+    )
 
 @OptIn(ExperimentalMaterial3AdaptiveApi::class)
 @Composable
@@ -338,9 +302,7 @@
         paneExpansionState = paneExpansionState,
         paneExpansionDragHandle = paneExpansionDragHandle,
         secondaryPane = {
-            AnimatedPane(
-                modifier = Modifier.testTag(tag = "SecondaryPane")
-            ) {
+            AnimatedPane(modifier = Modifier.testTag(tag = "SecondaryPane")) {
                 Surface(
                     modifier = Modifier.fillMaxSize(),
                     color = MaterialTheme.colorScheme.secondary
@@ -348,9 +310,7 @@
             }
         },
         tertiaryPane = {
-            AnimatedPane(
-                modifier = Modifier.testTag(tag = "TertiaryPane")
-            ) {
+            AnimatedPane(modifier = Modifier.testTag(tag = "TertiaryPane")) {
                 Surface(
                     modifier = Modifier.fillMaxSize(),
                     color = MaterialTheme.colorScheme.tertiary
@@ -358,13 +318,8 @@
             }
         }
     ) {
-        AnimatedPane(
-            modifier = Modifier.testTag(tag = "PrimaryPane")
-        ) {
-            Surface(
-                modifier = Modifier.fillMaxSize(),
-                color = MaterialTheme.colorScheme.primary
-            ) {}
+        AnimatedPane(modifier = Modifier.testTag(tag = "PrimaryPane")) {
+            Surface(modifier = Modifier.fillMaxSize(), color = MaterialTheme.colorScheme.primary) {}
         }
     }
 }
diff --git a/compose/material3/adaptive/adaptive-layout/src/androidUnitTest/kotlin/androidx/compose/material3/adaptive/layout/PaneScaffoldDirectiveTest.kt b/compose/material3/adaptive/adaptive-layout/src/androidUnitTest/kotlin/androidx/compose/material3/adaptive/layout/PaneScaffoldDirectiveTest.kt
index f7b506b..ea19285 100644
--- a/compose/material3/adaptive/adaptive-layout/src/androidUnitTest/kotlin/androidx/compose/material3/adaptive/layout/PaneScaffoldDirectiveTest.kt
+++ b/compose/material3/adaptive/adaptive-layout/src/androidUnitTest/kotlin/androidx/compose/material3/adaptive/layout/PaneScaffoldDirectiveTest.kt
@@ -33,12 +33,10 @@
 class PaneScaffoldDirectiveTest {
     @Test
     fun test_calculateStandardPaneScaffoldDirective_compactWidth() {
-        val scaffoldDirective = calculatePaneScaffoldDirective(
-            WindowAdaptiveInfo(
-                WindowSizeClass.compute(400f, 800f),
-                Posture()
+        val scaffoldDirective =
+            calculatePaneScaffoldDirective(
+                WindowAdaptiveInfo(WindowSizeClass.compute(400f, 800f), Posture())
             )
-        )
 
         assertThat(scaffoldDirective.maxHorizontalPartitions).isEqualTo(1)
         assertThat(scaffoldDirective.maxVerticalPartitions).isEqualTo(1)
@@ -49,12 +47,10 @@
 
     @Test
     fun test_calculateStandardPaneScaffoldDirective_mediumWidth() {
-        val scaffoldDirective = calculatePaneScaffoldDirective(
-            WindowAdaptiveInfo(
-                WindowSizeClass.compute(750f, 900f),
-                Posture()
+        val scaffoldDirective =
+            calculatePaneScaffoldDirective(
+                WindowAdaptiveInfo(WindowSizeClass.compute(750f, 900f), Posture())
             )
-        )
 
         assertThat(scaffoldDirective.maxHorizontalPartitions).isEqualTo(1)
         assertThat(scaffoldDirective.maxVerticalPartitions).isEqualTo(1)
@@ -65,12 +61,10 @@
 
     @Test
     fun test_calculateStandardPaneScaffoldDirective_expandedWidth() {
-        val scaffoldDirective = calculatePaneScaffoldDirective(
-            WindowAdaptiveInfo(
-                WindowSizeClass.compute(1200f, 800f),
-                Posture()
+        val scaffoldDirective =
+            calculatePaneScaffoldDirective(
+                WindowAdaptiveInfo(WindowSizeClass.compute(1200f, 800f), Posture())
             )
-        )
 
         assertThat(scaffoldDirective.maxHorizontalPartitions).isEqualTo(2)
         assertThat(scaffoldDirective.maxVerticalPartitions).isEqualTo(1)
@@ -81,12 +75,10 @@
 
     @Test
     fun test_calculateStandardPaneScaffoldDirective_tabletop() {
-        val scaffoldDirective = calculatePaneScaffoldDirective(
-            WindowAdaptiveInfo(
-                WindowSizeClass.compute(700f, 800f),
-                Posture(isTabletop = true)
+        val scaffoldDirective =
+            calculatePaneScaffoldDirective(
+                WindowAdaptiveInfo(WindowSizeClass.compute(700f, 800f), Posture(isTabletop = true))
             )
-        )
 
         assertThat(scaffoldDirective.maxHorizontalPartitions).isEqualTo(1)
         assertThat(scaffoldDirective.maxVerticalPartitions).isEqualTo(2)
@@ -97,12 +89,10 @@
 
     @Test
     fun test_calculateDensePaneScaffoldDirective_compactWidth() {
-        val scaffoldDirective = calculatePaneScaffoldDirectiveWithTwoPanesOnMediumWidth(
-            WindowAdaptiveInfo(
-                WindowSizeClass.compute(400f, 800f),
-                Posture()
+        val scaffoldDirective =
+            calculatePaneScaffoldDirectiveWithTwoPanesOnMediumWidth(
+                WindowAdaptiveInfo(WindowSizeClass.compute(400f, 800f), Posture())
             )
-        )
 
         assertThat(scaffoldDirective.maxHorizontalPartitions).isEqualTo(1)
         assertThat(scaffoldDirective.maxVerticalPartitions).isEqualTo(1)
@@ -113,12 +103,10 @@
 
     @Test
     fun test_calculateDensePaneScaffoldDirective_mediumWidth() {
-        val scaffoldDirective = calculatePaneScaffoldDirectiveWithTwoPanesOnMediumWidth(
-            WindowAdaptiveInfo(
-                WindowSizeClass.compute(750f, 900f),
-                Posture()
+        val scaffoldDirective =
+            calculatePaneScaffoldDirectiveWithTwoPanesOnMediumWidth(
+                WindowAdaptiveInfo(WindowSizeClass.compute(750f, 900f), Posture())
             )
-        )
 
         assertThat(scaffoldDirective.maxHorizontalPartitions).isEqualTo(2)
         assertThat(scaffoldDirective.maxVerticalPartitions).isEqualTo(1)
@@ -129,12 +117,10 @@
 
     @Test
     fun test_calculateDensePaneScaffoldDirective_expandedWidth() {
-        val scaffoldDirective = calculatePaneScaffoldDirectiveWithTwoPanesOnMediumWidth(
-            WindowAdaptiveInfo(
-                WindowSizeClass.compute(1200f, 800f),
-                Posture()
+        val scaffoldDirective =
+            calculatePaneScaffoldDirectiveWithTwoPanesOnMediumWidth(
+                WindowAdaptiveInfo(WindowSizeClass.compute(1200f, 800f), Posture())
             )
-        )
 
         assertThat(scaffoldDirective.maxHorizontalPartitions).isEqualTo(2)
         assertThat(scaffoldDirective.maxVerticalPartitions).isEqualTo(1)
@@ -145,12 +131,10 @@
 
     @Test
     fun test_calculateDensePaneScaffoldDirective_tabletop() {
-        val scaffoldDirective = calculatePaneScaffoldDirectiveWithTwoPanesOnMediumWidth(
-            WindowAdaptiveInfo(
-                WindowSizeClass.compute(700f, 800f),
-                Posture(isTabletop = true)
+        val scaffoldDirective =
+            calculatePaneScaffoldDirectiveWithTwoPanesOnMediumWidth(
+                WindowAdaptiveInfo(WindowSizeClass.compute(700f, 800f), Posture(isTabletop = true))
             )
-        )
 
         assertThat(scaffoldDirective.maxHorizontalPartitions).isEqualTo(2)
         assertThat(scaffoldDirective.maxVerticalPartitions).isEqualTo(2)
@@ -161,133 +145,142 @@
 
     @Test
     fun test_calculateStandardPaneScaffoldDirective_alwaysAvoidHinge() {
-        val scaffoldDirective = calculatePaneScaffoldDirective(
-            WindowAdaptiveInfo(
-                WindowSizeClass.compute(700f, 800f),
-                Posture(hingeList = hingeList)
-            ),
-            HingePolicy.AlwaysAvoid
-        )
+        val scaffoldDirective =
+            calculatePaneScaffoldDirective(
+                WindowAdaptiveInfo(
+                    WindowSizeClass.compute(700f, 800f),
+                    Posture(hingeList = hingeList)
+                ),
+                HingePolicy.AlwaysAvoid
+            )
 
         assertThat(scaffoldDirective.excludedBounds).isEqualTo(hingeList.getBounds())
     }
 
     @Test
     fun test_calculateStandardPaneScaffoldDirective_avoidOccludingHinge() {
-        val scaffoldDirective = calculatePaneScaffoldDirective(
-            WindowAdaptiveInfo(
-                WindowSizeClass.compute(700f, 800f),
-                Posture(hingeList = hingeList)
-            ),
-            HingePolicy.AvoidOccluding
-        )
+        val scaffoldDirective =
+            calculatePaneScaffoldDirective(
+                WindowAdaptiveInfo(
+                    WindowSizeClass.compute(700f, 800f),
+                    Posture(hingeList = hingeList)
+                ),
+                HingePolicy.AvoidOccluding
+            )
 
         assertThat(scaffoldDirective.excludedBounds).isEqualTo(hingeList.subList(0, 2).getBounds())
     }
 
     @Test
     fun test_calculateStandardPaneScaffoldDirective_avoidSeparatingHinge() {
-        val scaffoldDirective = calculatePaneScaffoldDirective(
-            WindowAdaptiveInfo(
-                WindowSizeClass.compute(700f, 800f),
-                Posture(hingeList = hingeList)
-            ),
-            HingePolicy.AvoidSeparating
-        )
+        val scaffoldDirective =
+            calculatePaneScaffoldDirective(
+                WindowAdaptiveInfo(
+                    WindowSizeClass.compute(700f, 800f),
+                    Posture(hingeList = hingeList)
+                ),
+                HingePolicy.AvoidSeparating
+            )
 
         assertThat(scaffoldDirective.excludedBounds).isEqualTo(hingeList.subList(2, 3).getBounds())
     }
 
     @Test
     fun test_calculateStandardPaneScaffoldDirective_neverAvoidHinge() {
-        val scaffoldDirective = calculatePaneScaffoldDirective(
-            WindowAdaptiveInfo(
-                WindowSizeClass.compute(700f, 800f),
-                Posture(hingeList = hingeList)
-            ),
-            HingePolicy.NeverAvoid
-        )
+        val scaffoldDirective =
+            calculatePaneScaffoldDirective(
+                WindowAdaptiveInfo(
+                    WindowSizeClass.compute(700f, 800f),
+                    Posture(hingeList = hingeList)
+                ),
+                HingePolicy.NeverAvoid
+            )
 
         assertThat(scaffoldDirective.excludedBounds).isEmpty()
     }
 
     @Test
     fun test_calculateDensePaneScaffoldDirective_alwaysAvoidHinge() {
-        val scaffoldDirective = calculatePaneScaffoldDirectiveWithTwoPanesOnMediumWidth(
-            WindowAdaptiveInfo(
-                WindowSizeClass.compute(700f, 800f),
-                Posture(hingeList = hingeList)
-            ),
-            HingePolicy.AlwaysAvoid
-        )
+        val scaffoldDirective =
+            calculatePaneScaffoldDirectiveWithTwoPanesOnMediumWidth(
+                WindowAdaptiveInfo(
+                    WindowSizeClass.compute(700f, 800f),
+                    Posture(hingeList = hingeList)
+                ),
+                HingePolicy.AlwaysAvoid
+            )
 
         assertThat(scaffoldDirective.excludedBounds).isEqualTo(hingeList.getBounds())
     }
 
     @Test
     fun test_calculateDensePaneScaffoldDirective_avoidOccludingHinge() {
-        val scaffoldDirective = calculatePaneScaffoldDirectiveWithTwoPanesOnMediumWidth(
-            WindowAdaptiveInfo(
-                WindowSizeClass.compute(700f, 800f),
-                Posture(hingeList = hingeList)
-            ),
-            HingePolicy.AvoidOccluding
-        )
+        val scaffoldDirective =
+            calculatePaneScaffoldDirectiveWithTwoPanesOnMediumWidth(
+                WindowAdaptiveInfo(
+                    WindowSizeClass.compute(700f, 800f),
+                    Posture(hingeList = hingeList)
+                ),
+                HingePolicy.AvoidOccluding
+            )
 
         assertThat(scaffoldDirective.excludedBounds).isEqualTo(hingeList.subList(0, 2).getBounds())
     }
 
     @Test
     fun test_calculateDensePaneScaffoldDirective_avoidSeparatingHinge() {
-        val scaffoldDirective = calculatePaneScaffoldDirectiveWithTwoPanesOnMediumWidth(
-            WindowAdaptiveInfo(
-                WindowSizeClass.compute(700f, 800f),
-                Posture(hingeList = hingeList)
-            ),
-            HingePolicy.AvoidSeparating
-        )
+        val scaffoldDirective =
+            calculatePaneScaffoldDirectiveWithTwoPanesOnMediumWidth(
+                WindowAdaptiveInfo(
+                    WindowSizeClass.compute(700f, 800f),
+                    Posture(hingeList = hingeList)
+                ),
+                HingePolicy.AvoidSeparating
+            )
 
         assertThat(scaffoldDirective.excludedBounds).isEqualTo(hingeList.subList(2, 3).getBounds())
     }
 
     @Test
     fun test_calculateDensePaneScaffoldDirective_neverAvoidHinge() {
-        val scaffoldDirective = calculatePaneScaffoldDirectiveWithTwoPanesOnMediumWidth(
-            WindowAdaptiveInfo(
-                WindowSizeClass.compute(700f, 800f),
-                Posture(hingeList = hingeList)
-            ),
-            HingePolicy.NeverAvoid
-        )
+        val scaffoldDirective =
+            calculatePaneScaffoldDirectiveWithTwoPanesOnMediumWidth(
+                WindowAdaptiveInfo(
+                    WindowSizeClass.compute(700f, 800f),
+                    Posture(hingeList = hingeList)
+                ),
+                HingePolicy.NeverAvoid
+            )
 
         assertThat(scaffoldDirective.excludedBounds).isEmpty()
     }
 }
 
 @OptIn(ExperimentalMaterial3AdaptiveApi::class)
-private val hingeList = listOf(
-    HingeInfo(
-        bounds = Rect(0F, 0F, 1F, 1F),
-        isFlat = true,
-        isVertical = true,
-        isSeparating = false,
-        isOccluding = true
-    ),
-    HingeInfo(
-        bounds = Rect(1F, 1F, 2F, 2F),
-        isFlat = false,
-        isVertical = true,
-        isSeparating = false,
-        isOccluding = true
-    ),
-    HingeInfo(
-        bounds = Rect(2F, 2F, 3F, 3F),
-        isFlat = true,
-        isVertical = true,
-        isSeparating = true,
-        isOccluding = false
-    ),
-)
+private val hingeList =
+    listOf(
+        HingeInfo(
+            bounds = Rect(0F, 0F, 1F, 1F),
+            isFlat = true,
+            isVertical = true,
+            isSeparating = false,
+            isOccluding = true
+        ),
+        HingeInfo(
+            bounds = Rect(1F, 1F, 2F, 2F),
+            isFlat = false,
+            isVertical = true,
+            isSeparating = false,
+            isOccluding = true
+        ),
+        HingeInfo(
+            bounds = Rect(2F, 2F, 3F, 3F),
+            isFlat = true,
+            isVertical = true,
+            isSeparating = true,
+            isOccluding = false
+        ),
+    )
 
 @OptIn(ExperimentalMaterial3AdaptiveApi::class)
 private fun List<HingeInfo>.getBounds(): List<Rect> {
diff --git a/compose/material3/adaptive/adaptive-layout/src/androidUnitTest/kotlin/androidx/compose/material3/adaptive/layout/ThreePaneMotionTest.kt b/compose/material3/adaptive/adaptive-layout/src/androidUnitTest/kotlin/androidx/compose/material3/adaptive/layout/ThreePaneMotionTest.kt
index 4b6ec8b..39bfd7d 100644
--- a/compose/material3/adaptive/adaptive-layout/src/androidUnitTest/kotlin/androidx/compose/material3/adaptive/layout/ThreePaneMotionTest.kt
+++ b/compose/material3/adaptive/adaptive-layout/src/androidUnitTest/kotlin/androidx/compose/material3/adaptive/layout/ThreePaneMotionTest.kt
@@ -31,268 +31,282 @@
 class ThreePaneMotionTest {
     @Test
     fun noPane_noMotion() {
-        val motions = calculateThreePaneMotion(
-            ThreePaneScaffoldValue(
-                PaneAdaptedValue.Hidden,
-                PaneAdaptedValue.Hidden,
-                PaneAdaptedValue.Hidden
-            ),
-            ThreePaneScaffoldValue(
-                PaneAdaptedValue.Hidden,
-                PaneAdaptedValue.Hidden,
-                PaneAdaptedValue.Hidden
-            ),
-            PaneOrder,
-            SpacerSize
-        )
+        val motions =
+            calculateThreePaneMotion(
+                ThreePaneScaffoldValue(
+                    PaneAdaptedValue.Hidden,
+                    PaneAdaptedValue.Hidden,
+                    PaneAdaptedValue.Hidden
+                ),
+                ThreePaneScaffoldValue(
+                    PaneAdaptedValue.Hidden,
+                    PaneAdaptedValue.Hidden,
+                    PaneAdaptedValue.Hidden
+                ),
+                PaneOrder,
+                SpacerSize
+            )
         assertThat(motions).isEqualTo(ThreePaneMotion.NoMotion)
     }
 
     @Test
     fun singlePane_firstToSecond_movesLeft() {
-        val motions = calculateThreePaneMotion(
-            ThreePaneScaffoldValue(
-                PaneAdaptedValue.Expanded,
-                PaneAdaptedValue.Hidden,
-                PaneAdaptedValue.Hidden
-            ),
-            ThreePaneScaffoldValue(
-                PaneAdaptedValue.Hidden,
-                PaneAdaptedValue.Expanded,
-                PaneAdaptedValue.Hidden
-            ),
-            PaneOrder,
-            SpacerSize
-        )
+        val motions =
+            calculateThreePaneMotion(
+                ThreePaneScaffoldValue(
+                    PaneAdaptedValue.Expanded,
+                    PaneAdaptedValue.Hidden,
+                    PaneAdaptedValue.Hidden
+                ),
+                ThreePaneScaffoldValue(
+                    PaneAdaptedValue.Hidden,
+                    PaneAdaptedValue.Expanded,
+                    PaneAdaptedValue.Hidden
+                ),
+                PaneOrder,
+                SpacerSize
+            )
         assertThat(motions).isEqualTo(MovePanesToLeftMotion(SpacerSize))
     }
 
     @Test
     fun singlePane_firstToThird_movesLeft() {
-        val motions = calculateThreePaneMotion(
-            ThreePaneScaffoldValue(
-                PaneAdaptedValue.Expanded,
-                PaneAdaptedValue.Hidden,
-                PaneAdaptedValue.Hidden
-            ),
-            ThreePaneScaffoldValue(
-                PaneAdaptedValue.Hidden,
-                PaneAdaptedValue.Hidden,
-                PaneAdaptedValue.Expanded
-            ),
-            PaneOrder,
-            SpacerSize
-        )
+        val motions =
+            calculateThreePaneMotion(
+                ThreePaneScaffoldValue(
+                    PaneAdaptedValue.Expanded,
+                    PaneAdaptedValue.Hidden,
+                    PaneAdaptedValue.Hidden
+                ),
+                ThreePaneScaffoldValue(
+                    PaneAdaptedValue.Hidden,
+                    PaneAdaptedValue.Hidden,
+                    PaneAdaptedValue.Expanded
+                ),
+                PaneOrder,
+                SpacerSize
+            )
         assertThat(motions).isEqualTo(MovePanesToLeftMotion(SpacerSize))
     }
 
     @Test
     fun singlePane_secondToThird_movesLeft() {
-        val motions = calculateThreePaneMotion(
-            ThreePaneScaffoldValue(
-                PaneAdaptedValue.Hidden,
-                PaneAdaptedValue.Expanded,
-                PaneAdaptedValue.Hidden
-            ),
-            ThreePaneScaffoldValue(
-                PaneAdaptedValue.Hidden,
-                PaneAdaptedValue.Hidden,
-                PaneAdaptedValue.Expanded
-            ),
-            PaneOrder,
-            SpacerSize
-        )
+        val motions =
+            calculateThreePaneMotion(
+                ThreePaneScaffoldValue(
+                    PaneAdaptedValue.Hidden,
+                    PaneAdaptedValue.Expanded,
+                    PaneAdaptedValue.Hidden
+                ),
+                ThreePaneScaffoldValue(
+                    PaneAdaptedValue.Hidden,
+                    PaneAdaptedValue.Hidden,
+                    PaneAdaptedValue.Expanded
+                ),
+                PaneOrder,
+                SpacerSize
+            )
         assertThat(motions).isEqualTo(MovePanesToLeftMotion(SpacerSize))
     }
 
     @Test
     fun singlePane_secondToFirst_movesRight() {
-        val motions = calculateThreePaneMotion(
-            ThreePaneScaffoldValue(
-                PaneAdaptedValue.Hidden,
-                PaneAdaptedValue.Expanded,
-                PaneAdaptedValue.Hidden
-            ),
-            ThreePaneScaffoldValue(
-                PaneAdaptedValue.Expanded,
-                PaneAdaptedValue.Hidden,
-                PaneAdaptedValue.Hidden
-            ),
-            PaneOrder,
-            SpacerSize
-        )
+        val motions =
+            calculateThreePaneMotion(
+                ThreePaneScaffoldValue(
+                    PaneAdaptedValue.Hidden,
+                    PaneAdaptedValue.Expanded,
+                    PaneAdaptedValue.Hidden
+                ),
+                ThreePaneScaffoldValue(
+                    PaneAdaptedValue.Expanded,
+                    PaneAdaptedValue.Hidden,
+                    PaneAdaptedValue.Hidden
+                ),
+                PaneOrder,
+                SpacerSize
+            )
         assertThat(motions).isEqualTo(MovePanesToRightMotion(SpacerSize))
     }
 
     @Test
     fun singlePane_thirdToFirst_movesRight() {
-        val motions = calculateThreePaneMotion(
-            ThreePaneScaffoldValue(
-                PaneAdaptedValue.Hidden,
-                PaneAdaptedValue.Hidden,
-                PaneAdaptedValue.Expanded
-            ),
-            ThreePaneScaffoldValue(
-                PaneAdaptedValue.Expanded,
-                PaneAdaptedValue.Hidden,
-                PaneAdaptedValue.Hidden
-            ),
-            PaneOrder,
-            SpacerSize
-        )
+        val motions =
+            calculateThreePaneMotion(
+                ThreePaneScaffoldValue(
+                    PaneAdaptedValue.Hidden,
+                    PaneAdaptedValue.Hidden,
+                    PaneAdaptedValue.Expanded
+                ),
+                ThreePaneScaffoldValue(
+                    PaneAdaptedValue.Expanded,
+                    PaneAdaptedValue.Hidden,
+                    PaneAdaptedValue.Hidden
+                ),
+                PaneOrder,
+                SpacerSize
+            )
         assertThat(motions).isEqualTo(MovePanesToRightMotion(SpacerSize))
     }
 
     @Test
     fun singlePane_thirdToSecond_movesRight() {
-        val motions = calculateThreePaneMotion(
-            ThreePaneScaffoldValue(
-                PaneAdaptedValue.Hidden,
-                PaneAdaptedValue.Hidden,
-                PaneAdaptedValue.Expanded
-            ),
-            ThreePaneScaffoldValue(
-                PaneAdaptedValue.Hidden,
-                PaneAdaptedValue.Expanded,
-                PaneAdaptedValue.Hidden
-            ),
-            PaneOrder,
-            SpacerSize
-        )
+        val motions =
+            calculateThreePaneMotion(
+                ThreePaneScaffoldValue(
+                    PaneAdaptedValue.Hidden,
+                    PaneAdaptedValue.Hidden,
+                    PaneAdaptedValue.Expanded
+                ),
+                ThreePaneScaffoldValue(
+                    PaneAdaptedValue.Hidden,
+                    PaneAdaptedValue.Expanded,
+                    PaneAdaptedValue.Hidden
+                ),
+                PaneOrder,
+                SpacerSize
+            )
         assertThat(motions).isEqualTo(MovePanesToRightMotion(SpacerSize))
     }
 
     @Test
     fun dualPane_hidesFirstShowsThird_movesLeft() {
-        val motions = calculateThreePaneMotion(
-            ThreePaneScaffoldValue(
-                PaneAdaptedValue.Expanded,
-                PaneAdaptedValue.Expanded,
-                PaneAdaptedValue.Hidden
-            ),
-            ThreePaneScaffoldValue(
-                PaneAdaptedValue.Hidden,
-                PaneAdaptedValue.Expanded,
-                PaneAdaptedValue.Expanded
-            ),
-            PaneOrder,
-            SpacerSize
-        )
+        val motions =
+            calculateThreePaneMotion(
+                ThreePaneScaffoldValue(
+                    PaneAdaptedValue.Expanded,
+                    PaneAdaptedValue.Expanded,
+                    PaneAdaptedValue.Hidden
+                ),
+                ThreePaneScaffoldValue(
+                    PaneAdaptedValue.Hidden,
+                    PaneAdaptedValue.Expanded,
+                    PaneAdaptedValue.Expanded
+                ),
+                PaneOrder,
+                SpacerSize
+            )
         assertThat(motions).isEqualTo(MovePanesToLeftMotion(SpacerSize))
     }
 
     @Test
     fun dualPane_hidesThirdShowsFirst_movesRight() {
-        val motions = calculateThreePaneMotion(
-            ThreePaneScaffoldValue(
-                PaneAdaptedValue.Hidden,
-                PaneAdaptedValue.Expanded,
-                PaneAdaptedValue.Expanded
-            ),
-            ThreePaneScaffoldValue(
-                PaneAdaptedValue.Expanded,
-                PaneAdaptedValue.Expanded,
-                PaneAdaptedValue.Hidden
-            ),
-            PaneOrder,
-            SpacerSize
-        )
+        val motions =
+            calculateThreePaneMotion(
+                ThreePaneScaffoldValue(
+                    PaneAdaptedValue.Hidden,
+                    PaneAdaptedValue.Expanded,
+                    PaneAdaptedValue.Expanded
+                ),
+                ThreePaneScaffoldValue(
+                    PaneAdaptedValue.Expanded,
+                    PaneAdaptedValue.Expanded,
+                    PaneAdaptedValue.Hidden
+                ),
+                PaneOrder,
+                SpacerSize
+            )
         assertThat(motions).isEqualTo(MovePanesToRightMotion(SpacerSize))
     }
 
     @Test
     fun dualPane_hidesSecondShowsThird_switchRightTwoPanes() {
-        val motions = calculateThreePaneMotion(
-            ThreePaneScaffoldValue(
-                PaneAdaptedValue.Expanded,
-                PaneAdaptedValue.Expanded,
-                PaneAdaptedValue.Hidden
-            ),
-            ThreePaneScaffoldValue(
-                PaneAdaptedValue.Expanded,
-                PaneAdaptedValue.Hidden,
-                PaneAdaptedValue.Expanded
-            ),
-            PaneOrder,
-            SpacerSize
-        )
+        val motions =
+            calculateThreePaneMotion(
+                ThreePaneScaffoldValue(
+                    PaneAdaptedValue.Expanded,
+                    PaneAdaptedValue.Expanded,
+                    PaneAdaptedValue.Hidden
+                ),
+                ThreePaneScaffoldValue(
+                    PaneAdaptedValue.Expanded,
+                    PaneAdaptedValue.Hidden,
+                    PaneAdaptedValue.Expanded
+                ),
+                PaneOrder,
+                SpacerSize
+            )
         assertThat(motions).isEqualTo(SwitchRightTwoPanesMotion(SpacerSize))
     }
 
     @Test
     fun dualPane_hidesThirdShowsSecond_switchRightTwoPanes() {
-        val motions = calculateThreePaneMotion(
-            ThreePaneScaffoldValue(
-                PaneAdaptedValue.Expanded,
-                PaneAdaptedValue.Hidden,
-                PaneAdaptedValue.Expanded
-            ),
-            ThreePaneScaffoldValue(
-                PaneAdaptedValue.Expanded,
-                PaneAdaptedValue.Expanded,
-                PaneAdaptedValue.Hidden
-            ),
-            PaneOrder,
-            SpacerSize
-        )
+        val motions =
+            calculateThreePaneMotion(
+                ThreePaneScaffoldValue(
+                    PaneAdaptedValue.Expanded,
+                    PaneAdaptedValue.Hidden,
+                    PaneAdaptedValue.Expanded
+                ),
+                ThreePaneScaffoldValue(
+                    PaneAdaptedValue.Expanded,
+                    PaneAdaptedValue.Expanded,
+                    PaneAdaptedValue.Hidden
+                ),
+                PaneOrder,
+                SpacerSize
+            )
         assertThat(motions).isEqualTo(SwitchRightTwoPanesMotion(SpacerSize))
     }
 
     @Test
     fun dualPane_hidesFirstShowsSecond_switchLeftTwoPanes() {
-        val motions = calculateThreePaneMotion(
-            ThreePaneScaffoldValue(
-                PaneAdaptedValue.Expanded,
-                PaneAdaptedValue.Hidden,
-                PaneAdaptedValue.Expanded
-            ),
-            ThreePaneScaffoldValue(
-                PaneAdaptedValue.Hidden,
-                PaneAdaptedValue.Expanded,
-                PaneAdaptedValue.Expanded
-            ),
-            PaneOrder,
-            SpacerSize
-        )
+        val motions =
+            calculateThreePaneMotion(
+                ThreePaneScaffoldValue(
+                    PaneAdaptedValue.Expanded,
+                    PaneAdaptedValue.Hidden,
+                    PaneAdaptedValue.Expanded
+                ),
+                ThreePaneScaffoldValue(
+                    PaneAdaptedValue.Hidden,
+                    PaneAdaptedValue.Expanded,
+                    PaneAdaptedValue.Expanded
+                ),
+                PaneOrder,
+                SpacerSize
+            )
         assertThat(motions).isEqualTo(SwitchLeftTwoPanesMotion(SpacerSize))
     }
 
     @Test
     fun dualPane_hidesSecondShowsFirst_switchLeftTwoPanes() {
-        val motions = calculateThreePaneMotion(
-            ThreePaneScaffoldValue(
-                PaneAdaptedValue.Hidden,
-                PaneAdaptedValue.Expanded,
-                PaneAdaptedValue.Expanded
-            ),
-            ThreePaneScaffoldValue(
-                PaneAdaptedValue.Expanded,
-                PaneAdaptedValue.Hidden,
-                PaneAdaptedValue.Expanded
-            ),
-            PaneOrder,
-            SpacerSize
-        )
+        val motions =
+            calculateThreePaneMotion(
+                ThreePaneScaffoldValue(
+                    PaneAdaptedValue.Hidden,
+                    PaneAdaptedValue.Expanded,
+                    PaneAdaptedValue.Expanded
+                ),
+                ThreePaneScaffoldValue(
+                    PaneAdaptedValue.Expanded,
+                    PaneAdaptedValue.Hidden,
+                    PaneAdaptedValue.Expanded
+                ),
+                PaneOrder,
+                SpacerSize
+            )
         assertThat(motions).isEqualTo(SwitchLeftTwoPanesMotion(SpacerSize))
     }
 
     @Test
     fun changeNumberOfPanes_noMotion() {
         // TODO(conradchen): Update this when we support motions in this case
-        val motions = calculateThreePaneMotion(
-            ThreePaneScaffoldValue(
-                PaneAdaptedValue.Hidden,
-                PaneAdaptedValue.Expanded,
-                PaneAdaptedValue.Expanded
-            ),
-            ThreePaneScaffoldValue(
-                PaneAdaptedValue.Expanded,
-                PaneAdaptedValue.Hidden,
-                PaneAdaptedValue.Hidden
-            ),
-            PaneOrder,
-            SpacerSize
-        )
+        val motions =
+            calculateThreePaneMotion(
+                ThreePaneScaffoldValue(
+                    PaneAdaptedValue.Hidden,
+                    PaneAdaptedValue.Expanded,
+                    PaneAdaptedValue.Expanded
+                ),
+                ThreePaneScaffoldValue(
+                    PaneAdaptedValue.Expanded,
+                    PaneAdaptedValue.Hidden,
+                    PaneAdaptedValue.Hidden
+                ),
+                PaneOrder,
+                SpacerSize
+            )
         assertThat(motions).isEqualTo(ThreePaneMotion.NoMotion)
     }
 
@@ -301,19 +315,17 @@
         val delayedRatio = 0.5f
 
         val originalSpec =
-            spring(
-                dampingRatio = 0.7f,
-                stiffness = 500f,
-                visibilityThreshold = 0.1f
-            ).vectorize(Float.VectorConverter)
+            spring(dampingRatio = 0.7f, stiffness = 500f, visibilityThreshold = 0.1f)
+                .vectorize(Float.VectorConverter)
 
         val delayedSpec =
             DelayedSpringSpec(
-                dampingRatio = 0.7f,
-                stiffness = 500f,
-                visibilityThreshold = 0.1f,
-                delayedRatio = delayedRatio,
-            ).vectorize(Float.VectorConverter)
+                    dampingRatio = 0.7f,
+                    stiffness = 500f,
+                    visibilityThreshold = 0.1f,
+                    delayedRatio = delayedRatio,
+                )
+                .vectorize(Float.VectorConverter)
 
         val originalDurationNanos = originalSpec.getDurationNanos()
         val delayedNanos = (originalDurationNanos * delayedRatio).toLong()
diff --git a/compose/material3/adaptive/adaptive-layout/src/androidUnitTest/kotlin/androidx/compose/material3/adaptive/layout/ThreePaneScaffoldValueTest.kt b/compose/material3/adaptive/adaptive-layout/src/androidUnitTest/kotlin/androidx/compose/material3/adaptive/layout/ThreePaneScaffoldValueTest.kt
index 48dbd86..b24879e 100644
--- a/compose/material3/adaptive/adaptive-layout/src/androidUnitTest/kotlin/androidx/compose/material3/adaptive/layout/ThreePaneScaffoldValueTest.kt
+++ b/compose/material3/adaptive/adaptive-layout/src/androidUnitTest/kotlin/androidx/compose/material3/adaptive/layout/ThreePaneScaffoldValueTest.kt
@@ -27,11 +27,12 @@
 class ThreePaneScaffoldValueTest {
     @Test
     fun calculateWithoutHistory_onePaneLayout_noDestination() {
-        val scaffoldState = calculateThreePaneScaffoldValue(
-            maxHorizontalPartitions = 1,
-            adaptStrategies = MockAdaptStrategies,
-            currentDestination = null
-        )
+        val scaffoldState =
+            calculateThreePaneScaffoldValue(
+                maxHorizontalPartitions = 1,
+                adaptStrategies = MockAdaptStrategies,
+                currentDestination = null
+            )
         scaffoldState.assertState(ThreePaneScaffoldRole.Primary, PaneAdaptedValue.Expanded)
         scaffoldState.assertState(ThreePaneScaffoldRole.Secondary, SecondaryPaneAdaptedState)
         scaffoldState.assertState(ThreePaneScaffoldRole.Tertiary, TertiaryPaneAdaptedState)
@@ -39,11 +40,12 @@
 
     @Test
     fun calculateWithHistory_onePaneLayout_noDestination() {
-        val scaffoldState = calculateThreePaneScaffoldValue(
-            maxHorizontalPartitions = 1,
-            adaptStrategies = MockAdaptStrategies,
-            destinationHistory = emptyList()
-        )
+        val scaffoldState =
+            calculateThreePaneScaffoldValue(
+                maxHorizontalPartitions = 1,
+                adaptStrategies = MockAdaptStrategies,
+                destinationHistory = emptyList()
+            )
         scaffoldState.assertState(ThreePaneScaffoldRole.Primary, PaneAdaptedValue.Expanded)
         scaffoldState.assertState(ThreePaneScaffoldRole.Secondary, SecondaryPaneAdaptedState)
         scaffoldState.assertState(ThreePaneScaffoldRole.Tertiary, TertiaryPaneAdaptedState)
@@ -51,12 +53,13 @@
 
     @Test
     fun calculateWithoutHistory_onePaneLayout() {
-        val scaffoldState = calculateThreePaneScaffoldValue(
-            maxHorizontalPartitions = 1,
-            adaptStrategies = MockAdaptStrategies,
-            currentDestination =
-                ThreePaneScaffoldDestinationItem(ThreePaneScaffoldRole.Secondary, null)
-        )
+        val scaffoldState =
+            calculateThreePaneScaffoldValue(
+                maxHorizontalPartitions = 1,
+                adaptStrategies = MockAdaptStrategies,
+                currentDestination =
+                    ThreePaneScaffoldDestinationItem(ThreePaneScaffoldRole.Secondary, null)
+            )
         scaffoldState.assertState(ThreePaneScaffoldRole.Primary, PrimaryPaneAdaptedState)
         scaffoldState.assertState(ThreePaneScaffoldRole.Secondary, PaneAdaptedValue.Expanded)
         scaffoldState.assertState(ThreePaneScaffoldRole.Tertiary, TertiaryPaneAdaptedState)
@@ -64,14 +67,16 @@
 
     @Test
     fun calculateWithHistory_onePaneLayout() {
-        val scaffoldState = calculateThreePaneScaffoldValue(
-            maxHorizontalPartitions = 1,
-            adaptStrategies = MockAdaptStrategies,
-            destinationHistory = listOf(
-                ThreePaneScaffoldDestinationItem(ThreePaneScaffoldRole.Tertiary, null),
-                ThreePaneScaffoldDestinationItem(ThreePaneScaffoldRole.Secondary, null)
+        val scaffoldState =
+            calculateThreePaneScaffoldValue(
+                maxHorizontalPartitions = 1,
+                adaptStrategies = MockAdaptStrategies,
+                destinationHistory =
+                    listOf(
+                        ThreePaneScaffoldDestinationItem(ThreePaneScaffoldRole.Tertiary, null),
+                        ThreePaneScaffoldDestinationItem(ThreePaneScaffoldRole.Secondary, null)
+                    )
             )
-        )
         scaffoldState.assertState(ThreePaneScaffoldRole.Primary, PrimaryPaneAdaptedState)
         scaffoldState.assertState(ThreePaneScaffoldRole.Secondary, PaneAdaptedValue.Expanded)
         scaffoldState.assertState(ThreePaneScaffoldRole.Tertiary, TertiaryPaneAdaptedState)
@@ -79,11 +84,12 @@
 
     @Test
     fun calculateWithoutHistory_twoPaneLayout_noDestination() {
-        val scaffoldState = calculateThreePaneScaffoldValue(
-            maxHorizontalPartitions = 2,
-            adaptStrategies = MockAdaptStrategies,
-            currentDestination = null
-        )
+        val scaffoldState =
+            calculateThreePaneScaffoldValue(
+                maxHorizontalPartitions = 2,
+                adaptStrategies = MockAdaptStrategies,
+                currentDestination = null
+            )
         scaffoldState.assertState(ThreePaneScaffoldRole.Primary, PaneAdaptedValue.Expanded)
         scaffoldState.assertState(ThreePaneScaffoldRole.Secondary, PaneAdaptedValue.Expanded)
         scaffoldState.assertState(ThreePaneScaffoldRole.Tertiary, TertiaryPaneAdaptedState)
@@ -91,11 +97,12 @@
 
     @Test
     fun calculateWithHistory_twoPaneLayout_noDestination() {
-        val scaffoldState = calculateThreePaneScaffoldValue(
-            maxHorizontalPartitions = 2,
-            adaptStrategies = MockAdaptStrategies,
-            destinationHistory = emptyList()
-        )
+        val scaffoldState =
+            calculateThreePaneScaffoldValue(
+                maxHorizontalPartitions = 2,
+                adaptStrategies = MockAdaptStrategies,
+                destinationHistory = emptyList()
+            )
         scaffoldState.assertState(ThreePaneScaffoldRole.Primary, PaneAdaptedValue.Expanded)
         scaffoldState.assertState(ThreePaneScaffoldRole.Secondary, PaneAdaptedValue.Expanded)
         scaffoldState.assertState(ThreePaneScaffoldRole.Tertiary, TertiaryPaneAdaptedState)
@@ -103,12 +110,13 @@
 
     @Test
     fun calculateWithoutHistory_twoPaneLayout() {
-        val scaffoldState = calculateThreePaneScaffoldValue(
-            maxHorizontalPartitions = 2,
-            adaptStrategies = MockAdaptStrategies,
-            currentDestination =
-                ThreePaneScaffoldDestinationItem(ThreePaneScaffoldRole.Tertiary, null)
-        )
+        val scaffoldState =
+            calculateThreePaneScaffoldValue(
+                maxHorizontalPartitions = 2,
+                adaptStrategies = MockAdaptStrategies,
+                currentDestination =
+                    ThreePaneScaffoldDestinationItem(ThreePaneScaffoldRole.Tertiary, null)
+            )
         scaffoldState.assertState(ThreePaneScaffoldRole.Primary, PaneAdaptedValue.Expanded)
         scaffoldState.assertState(ThreePaneScaffoldRole.Secondary, SecondaryPaneAdaptedState)
         scaffoldState.assertState(ThreePaneScaffoldRole.Tertiary, PaneAdaptedValue.Expanded)
@@ -116,14 +124,16 @@
 
     @Test
     fun calculateWithHistory_twoPaneLayout() {
-        val scaffoldState = calculateThreePaneScaffoldValue(
-            maxHorizontalPartitions = 2,
-            adaptStrategies = MockAdaptStrategies,
-            destinationHistory = listOf(
-                ThreePaneScaffoldDestinationItem(ThreePaneScaffoldRole.Tertiary, null),
-                ThreePaneScaffoldDestinationItem(ThreePaneScaffoldRole.Secondary, null)
+        val scaffoldState =
+            calculateThreePaneScaffoldValue(
+                maxHorizontalPartitions = 2,
+                adaptStrategies = MockAdaptStrategies,
+                destinationHistory =
+                    listOf(
+                        ThreePaneScaffoldDestinationItem(ThreePaneScaffoldRole.Tertiary, null),
+                        ThreePaneScaffoldDestinationItem(ThreePaneScaffoldRole.Secondary, null)
+                    )
             )
-        )
         scaffoldState.assertState(ThreePaneScaffoldRole.Primary, PrimaryPaneAdaptedState)
         scaffoldState.assertState(ThreePaneScaffoldRole.Secondary, PaneAdaptedValue.Expanded)
         scaffoldState.assertState(ThreePaneScaffoldRole.Tertiary, PaneAdaptedValue.Expanded)
@@ -131,17 +141,19 @@
 
     @Test
     fun calculateWithHistory_twoPaneLayout_longHistory() {
-        val scaffoldState = calculateThreePaneScaffoldValue(
-            maxHorizontalPartitions = 2,
-            adaptStrategies = MockAdaptStrategies,
-            destinationHistory = listOf(
-                ThreePaneScaffoldDestinationItem(ThreePaneScaffoldRole.Primary, null),
-                ThreePaneScaffoldDestinationItem(ThreePaneScaffoldRole.Tertiary, null),
-                ThreePaneScaffoldDestinationItem(ThreePaneScaffoldRole.Secondary, null),
-                ThreePaneScaffoldDestinationItem(ThreePaneScaffoldRole.Primary, null),
-                ThreePaneScaffoldDestinationItem(ThreePaneScaffoldRole.Tertiary, null)
+        val scaffoldState =
+            calculateThreePaneScaffoldValue(
+                maxHorizontalPartitions = 2,
+                adaptStrategies = MockAdaptStrategies,
+                destinationHistory =
+                    listOf(
+                        ThreePaneScaffoldDestinationItem(ThreePaneScaffoldRole.Primary, null),
+                        ThreePaneScaffoldDestinationItem(ThreePaneScaffoldRole.Tertiary, null),
+                        ThreePaneScaffoldDestinationItem(ThreePaneScaffoldRole.Secondary, null),
+                        ThreePaneScaffoldDestinationItem(ThreePaneScaffoldRole.Primary, null),
+                        ThreePaneScaffoldDestinationItem(ThreePaneScaffoldRole.Tertiary, null)
+                    )
             )
-        )
         scaffoldState.assertState(ThreePaneScaffoldRole.Primary, PaneAdaptedValue.Expanded)
         scaffoldState.assertState(ThreePaneScaffoldRole.Secondary, SecondaryPaneAdaptedState)
         scaffoldState.assertState(ThreePaneScaffoldRole.Tertiary, PaneAdaptedValue.Expanded)
@@ -161,10 +173,11 @@
         private val PrimaryPaneAdaptedState = PaneAdaptedValue.Hidden
         private val SecondaryPaneAdaptedState = PaneAdaptedValue.Hidden
         private val TertiaryPaneAdaptedState = PaneAdaptedValue.Hidden
-        private val MockAdaptStrategies = ThreePaneScaffoldAdaptStrategies(
-            PrimaryPaneAdaptStrategy,
-            SecondaryPaneAdaptStrategy,
-            TertiaryPaneAdaptStrategy
-        )
+        private val MockAdaptStrategies =
+            ThreePaneScaffoldAdaptStrategies(
+                PrimaryPaneAdaptStrategy,
+                SecondaryPaneAdaptStrategy,
+                TertiaryPaneAdaptStrategy
+            )
     }
 }
diff --git a/compose/material3/adaptive/adaptive-layout/src/commonMain/kotlin/androidx/compose/material3/adaptive/layout/AdaptStrategy.kt b/compose/material3/adaptive/adaptive-layout/src/commonMain/kotlin/androidx/compose/material3/adaptive/layout/AdaptStrategy.kt
index 5ae0da6..04efa55 100644
--- a/compose/material3/adaptive/adaptive-layout/src/commonMain/kotlin/androidx/compose/material3/adaptive/layout/AdaptStrategy.kt
+++ b/compose/material3/adaptive/adaptive-layout/src/commonMain/kotlin/androidx/compose/material3/adaptive/layout/AdaptStrategy.kt
@@ -27,9 +27,7 @@
 @ExperimentalMaterial3AdaptiveApi
 @Stable
 sealed interface AdaptStrategy {
-    /**
-     * Override this function to provide the resulted adapted state.
-     */
+    /** Override this function to provide the resulted adapted state. */
     fun adapt(): PaneAdaptedValue
 
     @Immutable
@@ -58,8 +56,8 @@
 
     companion object {
         /**
-         * The default [AdaptStrategy] that suggests the layout to hide the associated pane when
-         * it has to be adapted, i.e., cannot be displayed in its [PaneAdaptedValue.Expanded] state.
+         * The default [AdaptStrategy] that suggests the layout to hide the associated pane when it
+         * has to be adapted, i.e., cannot be displayed in its [PaneAdaptedValue.Expanded] state.
          */
         val Hide: AdaptStrategy = SimpleAdaptStrategy("Hide", PaneAdaptedValue.Hidden)
     }
diff --git a/compose/material3/adaptive/adaptive-layout/src/commonMain/kotlin/androidx/compose/material3/adaptive/layout/AnimateBoundsModifier.kt b/compose/material3/adaptive/adaptive-layout/src/commonMain/kotlin/androidx/compose/material3/adaptive/layout/AnimateBoundsModifier.kt
index b3234de..2b3fc57 100644
--- a/compose/material3/adaptive/adaptive-layout/src/commonMain/kotlin/androidx/compose/material3/adaptive/layout/AnimateBoundsModifier.kt
+++ b/compose/material3/adaptive/adaptive-layout/src/commonMain/kotlin/androidx/compose/material3/adaptive/layout/AnimateBoundsModifier.kt
@@ -43,18 +43,19 @@
     positionAnimationSpec: FiniteAnimationSpec<IntOffset>,
     lookaheadScope: LookaheadScope,
     enabled: Boolean
-) = if (enabled) {
-    this.then(
-        AnimateBoundsElement(
-            animateFraction,
-            sizeAnimationSpec,
-            positionAnimationSpec,
-            lookaheadScope
+) =
+    if (enabled) {
+        this.then(
+            AnimateBoundsElement(
+                animateFraction,
+                sizeAnimationSpec,
+                positionAnimationSpec,
+                lookaheadScope
+            )
         )
-    )
-} else {
-    this
-}
+    } else {
+        this
+    }
 
 private data class AnimateBoundsElement(
     private val animateFraction: () -> Float,
@@ -163,18 +164,15 @@
         }
         // TODO(conradchen): Handle the interruption better when the target size changes during
         //                   the animation
-        originalSize = if (currentSize != InvalidIntSize) {
-            currentSize
-        } else {
-            newSize
-        }
+        originalSize =
+            if (currentSize != InvalidIntSize) {
+                currentSize
+            } else {
+                newSize
+            }
         targetSize = newSize
-        animation = TargetBasedAnimation(
-            animationSpec,
-            IntSize.VectorConverter,
-            originalSize,
-            targetSize
-        )
+        animation =
+            TargetBasedAnimation(animationSpec, IntSize.VectorConverter, originalSize, targetSize)
     }
 
     fun updateAndGetCurrentSize(fraction: Float): IntSize {
@@ -195,18 +193,20 @@
         }
         // TODO(conradchen): Handle the interruption better when the target position changes during
         //                   the animation
-        originalOffset = if (currentOffset != null) {
-            currentOffset
-        } else {
-            newOffset
-        }
+        originalOffset =
+            if (currentOffset != null) {
+                currentOffset
+            } else {
+                newOffset
+            }
         targetOffset = newOffset
-        animation = TargetBasedAnimation(
-            animationSpec,
-            IntOffset.VectorConverter,
-            originalOffset!!,
-            targetOffset!!
-        )
+        animation =
+            TargetBasedAnimation(
+                animationSpec,
+                IntOffset.VectorConverter,
+                originalOffset!!,
+                targetOffset!!
+            )
     }
 
     fun updateAndGetCurrentOffset(fraction: Float): IntOffset {
diff --git a/compose/material3/adaptive/adaptive-layout/src/commonMain/kotlin/androidx/compose/material3/adaptive/layout/ListDetailPaneScaffold.kt b/compose/material3/adaptive/adaptive-layout/src/commonMain/kotlin/androidx/compose/material3/adaptive/layout/ListDetailPaneScaffold.kt
index 6c3906d..3f8be83 100644
--- a/compose/material3/adaptive/adaptive-layout/src/commonMain/kotlin/androidx/compose/material3/adaptive/layout/ListDetailPaneScaffold.kt
+++ b/compose/material3/adaptive/adaptive-layout/src/commonMain/kotlin/androidx/compose/material3/adaptive/layout/ListDetailPaneScaffold.kt
@@ -26,23 +26,26 @@
  * panes in a canonical list-detail layout.
  *
  * See usage samples at:
+ *
  * @sample androidx.compose.material3.adaptive.samples.ListDetailPaneScaffoldSample
+ *
  * @sample androidx.compose.material3.adaptive.samples.ListDetailPaneScaffoldSampleWithExtraPane
+ *
  * @sample androidx.compose.material3.adaptive.samples.ListDetailPaneScaffoldWithNavigationSample
  *
  * @param directive The top-level directives about how the scaffold should arrange its panes.
- * @param value The current adapted value of the scaffold, which indicates how each pane of
- *        the scaffold is adapted.
+ * @param value The current adapted value of the scaffold, which indicates how each pane of the
+ *   scaffold is adapted.
  * @param listPane the list pane of the scaffold, which is supposed to hold a list of item summaries
- *        that can be selected from, for example, the inbox mail list of a mail app. See
- *        [ListDetailPaneScaffoldRole.List].
- * @param detailPane the detail pane of the scaffold, which is supposed to hold the detailed info
- *        of a selected item, for example, the mail content currently being viewed. See
- *        [ListDetailPaneScaffoldRole.Detail].
+ *   that can be selected from, for example, the inbox mail list of a mail app. See
+ *   [ListDetailPaneScaffoldRole.List].
+ * @param detailPane the detail pane of the scaffold, which is supposed to hold the detailed info of
+ *   a selected item, for example, the mail content currently being viewed. See
+ *   [ListDetailPaneScaffoldRole.Detail].
  * @param modifier [Modifier] of the scaffold layout.
  * @param extraPane the extra pane of the scaffold, which is supposed to hold any supplementary info
- *        besides the list and the detail panes, for example, a task list or a mini-calendar view of
- *        a mail app. See [ListDetailPaneScaffoldRole.Extra].
+ *   besides the list and the detail panes, for example, a task list or a mini-calendar view of a
+ *   mail app. See [ListDetailPaneScaffoldRole.Extra].
  */
 @ExperimentalMaterial3AdaptiveApi
 @Composable
@@ -65,9 +68,7 @@
     )
 }
 
-/**
- * Provides default values of [ListDetailPaneScaffold].
- */
+/** Provides default values of [ListDetailPaneScaffold]. */
 @ExperimentalMaterial3AdaptiveApi
 object ListDetailPaneScaffoldDefaults {
     /**
@@ -93,17 +94,18 @@
      * horizontally, which allocates panes in the order of secondary, primary, and tertiary from
      * start to end.
      */
-    internal val PaneOrder = ThreePaneScaffoldHorizontalOrder(
-        ThreePaneScaffoldRole.Secondary,
-        ThreePaneScaffoldRole.Primary,
-        ThreePaneScaffoldRole.Tertiary
-    )
+    internal val PaneOrder =
+        ThreePaneScaffoldHorizontalOrder(
+            ThreePaneScaffoldRole.Secondary,
+            ThreePaneScaffoldRole.Primary,
+            ThreePaneScaffoldRole.Tertiary
+        )
 }
 
 /**
  * The set of the available pane roles of [ListDetailPaneScaffold]. Those roles map to their
- * corresponding [ThreePaneScaffoldRole], which is a generic role definition across all types
- * of three pane scaffolds. We suggest you to use the values defined here instead of the raw
+ * corresponding [ThreePaneScaffoldRole], which is a generic role definition across all types of
+ * three pane scaffolds. We suggest you to use the values defined here instead of the raw
  * [ThreePaneScaffoldRole] under the context of [ListDetailPaneScaffold] for better code clarity.
  */
 object ListDetailPaneScaffoldRole {
@@ -115,16 +117,16 @@
     val List = ThreePaneScaffoldRole.Secondary
 
     /**
-     * The detail pane of [ListDetailPaneScaffold], which is supposed to hold the detailed info
-     * of a selected item, for example, the mail content currently being viewed. It maps to
+     * The detail pane of [ListDetailPaneScaffold], which is supposed to hold the detailed info of a
+     * selected item, for example, the mail content currently being viewed. It maps to
      * [ThreePaneScaffoldRole.Primary].
      */
     val Detail = ThreePaneScaffoldRole.Primary
 
     /**
      * The extra pane of [ListDetailPaneScaffold], which is supposed to hold any supplementary info
-     * besides the list and the detail panes, for example, a task list or a mini-calendar view of
-     * a mail app. It maps to [ThreePaneScaffoldRole.Tertiary].
+     * besides the list and the detail panes, for example, a task list or a mini-calendar view of a
+     * mail app. It maps to [ThreePaneScaffoldRole.Tertiary].
      */
     val Extra = ThreePaneScaffoldRole.Tertiary
 }
diff --git a/compose/material3/adaptive/adaptive-layout/src/commonMain/kotlin/androidx/compose/material3/adaptive/layout/Pane.kt b/compose/material3/adaptive/adaptive-layout/src/commonMain/kotlin/androidx/compose/material3/adaptive/layout/Pane.kt
index 9a5aa23..8b16638 100644
--- a/compose/material3/adaptive/adaptive-layout/src/commonMain/kotlin/androidx/compose/material3/adaptive/layout/Pane.kt
+++ b/compose/material3/adaptive/adaptive-layout/src/commonMain/kotlin/androidx/compose/material3/adaptive/layout/Pane.kt
@@ -26,14 +26,16 @@
 /**
  * The root composable of pane contents in a [ThreePaneScaffold] that supports default motions
  * during pane switching. It's recommended to use this composable to wrap your own contents when
- * passing them into pane parameters of the scaffold functions, therefore your panes can have a
- * nice default animation for free.
+ * passing them into pane parameters of the scaffold functions, therefore your panes can have a nice
+ * default animation for free.
  *
  * @param modifier The modifier applied to the [AnimatedPane].
  * @param content The content of the [AnimatedPane]. Also see [AnimatedPaneScope].
  *
  * See usage samples at:
+ *
  * @sample androidx.compose.material3.adaptive.samples.ListDetailPaneScaffoldSample
+ *
  * @sample androidx.compose.material3.adaptive.samples.ListDetailPaneScaffoldSampleWithExtraPane
  */
 @ExperimentalMaterial3AdaptiveApi
@@ -42,21 +44,23 @@
     modifier: Modifier = Modifier,
     content: (@Composable AnimatedPaneScope.() -> Unit),
 ) {
-    val keepShowing = scaffoldStateTransition.currentState[role] != PaneAdaptedValue.Hidden &&
-        scaffoldStateTransition.targetState[role] != PaneAdaptedValue.Hidden
+    val keepShowing =
+        scaffoldStateTransition.currentState[role] != PaneAdaptedValue.Hidden &&
+            scaffoldStateTransition.targetState[role] != PaneAdaptedValue.Hidden
     val animateFraction = { scaffoldStateTransitionFraction }
     scaffoldStateTransition.AnimatedVisibility(
         visible = { value: ThreePaneScaffoldValue -> value[role] != PaneAdaptedValue.Hidden },
-        modifier = modifier
-            .animatedPane()
-            .animateBounds(
-                animateFraction = animateFraction,
-                positionAnimationSpec = positionAnimationSpec,
-                sizeAnimationSpec = sizeAnimationSpec,
-                lookaheadScope = this,
-                enabled = keepShowing
-            )
-            .then(if (keepShowing) Modifier else Modifier.clipToBounds()),
+        modifier =
+            modifier
+                .animatedPane()
+                .animateBounds(
+                    animateFraction = animateFraction,
+                    positionAnimationSpec = positionAnimationSpec,
+                    sizeAnimationSpec = sizeAnimationSpec,
+                    lookaheadScope = this,
+                    enabled = keepShowing
+                )
+                .then(if (keepShowing) Modifier else Modifier.clipToBounds()),
         enter = enterTransition,
         exit = exitTransition
     ) {
@@ -70,6 +74,5 @@
  */
 sealed interface AnimatedPaneScope : AnimatedVisibilityScope
 
-private class AnimatedPaneScopeImpl(
-    animatedVisibilityScope: AnimatedVisibilityScope
-) : AnimatedPaneScope, AnimatedVisibilityScope by animatedVisibilityScope
+private class AnimatedPaneScopeImpl(animatedVisibilityScope: AnimatedVisibilityScope) :
+    AnimatedPaneScope, AnimatedVisibilityScope by animatedVisibilityScope
diff --git a/compose/material3/adaptive/adaptive-layout/src/commonMain/kotlin/androidx/compose/material3/adaptive/layout/PaneAdaptedValue.kt b/compose/material3/adaptive/adaptive-layout/src/commonMain/kotlin/androidx/compose/material3/adaptive/layout/PaneAdaptedValue.kt
index 54501b1..00deed0 100644
--- a/compose/material3/adaptive/adaptive-layout/src/commonMain/kotlin/androidx/compose/material3/adaptive/layout/PaneAdaptedValue.kt
+++ b/compose/material3/adaptive/adaptive-layout/src/commonMain/kotlin/androidx/compose/material3/adaptive/layout/PaneAdaptedValue.kt
@@ -26,13 +26,9 @@
 @JvmInline
 value class PaneAdaptedValue private constructor(private val description: String) {
     companion object {
-        /**
-         * Denotes that the associated pane should be displayed in its full width and height.
-         */
+        /** Denotes that the associated pane should be displayed in its full width and height. */
         val Expanded = PaneAdaptedValue("Expanded")
-        /**
-         * Denotes that the associated pane should be hidden.
-         */
+        /** Denotes that the associated pane should be hidden. */
         val Hidden = PaneAdaptedValue("Hidden")
     }
 }
diff --git a/compose/material3/adaptive/adaptive-layout/src/commonMain/kotlin/androidx/compose/material3/adaptive/layout/PaneExpansionDragHandle.kt b/compose/material3/adaptive/adaptive-layout/src/commonMain/kotlin/androidx/compose/material3/adaptive/layout/PaneExpansionDragHandle.kt
index 8382ba4..0a83188 100644
--- a/compose/material3/adaptive/adaptive-layout/src/commonMain/kotlin/androidx/compose/material3/adaptive/layout/PaneExpansionDragHandle.kt
+++ b/compose/material3/adaptive/adaptive-layout/src/commonMain/kotlin/androidx/compose/material3/adaptive/layout/PaneExpansionDragHandle.kt
@@ -38,19 +38,15 @@
     color: Color,
     modifier: Modifier = Modifier,
 ) {
-    Box(modifier = modifier
-        .paneExpansionDragHandle(state)
-        .size(24.dp, 48.dp),
+    Box(
+        modifier = modifier.paneExpansionDragHandle(state).size(24.dp, 48.dp),
         contentAlignment = Alignment.Center
     ) {
         Box(
-            modifier = Modifier
-                .size(4.dp, 48.dp)
-                .graphicsLayer(
-                    shape = CircleShape,
-                    clip = true
-                )
-                .background(color)
+            modifier =
+                Modifier.size(4.dp, 48.dp)
+                    .graphicsLayer(shape = CircleShape, clip = true)
+                    .background(color)
         )
     }
 }
@@ -58,9 +54,10 @@
 @ExperimentalMaterial3AdaptiveApi
 internal fun Modifier.paneExpansionDragHandle(state: PaneExpansionState): Modifier =
     this.draggable(
-        state = state,
-        orientation = Orientation.Horizontal,
-        onDragStopped = { velocity -> state.settleToAnchorIfNeeded(velocity) }
-    ).systemGestureExclusion()
+            state = state,
+            orientation = Orientation.Horizontal,
+            onDragStopped = { velocity -> state.settleToAnchorIfNeeded(velocity) }
+        )
+        .systemGestureExclusion()
 
 internal expect fun Modifier.systemGestureExclusion(): Modifier
diff --git a/compose/material3/adaptive/adaptive-layout/src/commonMain/kotlin/androidx/compose/material3/adaptive/layout/PaneExpansionState.kt b/compose/material3/adaptive/adaptive-layout/src/commonMain/kotlin/androidx/compose/material3/adaptive/layout/PaneExpansionState.kt
index 10b24e4..e219448 100644
--- a/compose/material3/adaptive/adaptive-layout/src/commonMain/kotlin/androidx/compose/material3/adaptive/layout/PaneExpansionState.kt
+++ b/compose/material3/adaptive/adaptive-layout/src/commonMain/kotlin/androidx/compose/material3/adaptive/layout/PaneExpansionState.kt
@@ -42,9 +42,8 @@
 
 @ExperimentalMaterial3AdaptiveApi
 @Stable
-internal class PaneExpansionState(
-    internal val anchors: List<PaneExpansionAnchor> = emptyList()
-) : DraggableState {
+internal class PaneExpansionState(internal val anchors: List<PaneExpansionAnchor> = emptyList()) :
+    DraggableState {
     private var firstPaneWidthState by mutableIntStateOf(UnspecifiedWidth)
     private var firstPanePercentageState by mutableFloatStateOf(Float.NaN)
     private var currentDraggingOffsetState by mutableIntStateOf(UnspecifiedWidth)
@@ -83,7 +82,8 @@
     internal var isSettling by mutableStateOf(false)
         private set
 
-    internal val isDraggingOrSettling get() = isDragging || isSettling
+    internal val isDraggingOrSettling
+        get() = isDragging || isSettling
 
     @VisibleForTesting
     internal var maxExpansionWidth = 0
@@ -97,9 +97,10 @@
 
     private var anchorPositions: IntList = emptyIntList()
 
-    private val dragScope: DragScope = object : DragScope {
-        override fun dragBy(pixels: Float): Unit = dispatchRawDelta(pixels)
-    }
+    private val dragScope: DragScope =
+        object : DragScope {
+            override fun dragBy(pixels: Float): Unit = dispatchRawDelta(pixels)
+        }
 
     private val dragMutex = MutatorMutex()
 
@@ -115,14 +116,12 @@
         currentDraggingOffset = (currentMeasuredDraggingOffset + delta).toInt()
     }
 
-    override suspend fun drag(
-        dragPriority: MutatePriority,
-        block: suspend DragScope.() -> Unit
-    ) = coroutineScope {
-        isDragging = true
-        dragMutex.mutateWith(dragScope, dragPriority, block)
-        isDragging = false
-    }
+    override suspend fun drag(dragPriority: MutatePriority, block: suspend DragScope.() -> Unit) =
+        coroutineScope {
+            isDragging = true
+            dragMutex.mutateWith(dragScope, dragPriority, block)
+            isDragging = false
+        }
 
     internal fun onMeasured(measuredWidth: Int, density: Density) {
         if (measuredWidth == maxExpansionWidth) {
@@ -149,10 +148,9 @@
             // TODO(conradchen): Use the right animation spec here.
             animate(
                 currentMeasuredDraggingOffset.toFloat(),
-                currentAnchorPositions.getPositionOfTheClosestAnchor(
-                    currentMeasuredDraggingOffset,
-                    velocity
-                ).toFloat(),
+                currentAnchorPositions
+                    .getPositionOfTheClosestAnchor(currentMeasuredDraggingOffset, velocity)
+                    .toFloat(),
                 velocity,
             ) { value, _ ->
                 currentDraggingOffset = value.toInt()
@@ -161,30 +159,26 @@
         }
     }
 
-    private fun IntList.getPositionOfTheClosestAnchor(
-        currentPosition: Int,
-        velocity: Float
-    ): Int = minBy(
-        when {
-            velocity >= AnchoringVelocityThreshold -> {
-                { anchorPosition: Int ->
-                    val delta = anchorPosition - currentPosition
-                    if (delta < 0) Int.MAX_VALUE else delta
+    private fun IntList.getPositionOfTheClosestAnchor(currentPosition: Int, velocity: Float): Int =
+        minBy(
+            when {
+                velocity >= AnchoringVelocityThreshold -> {
+                    { anchorPosition: Int ->
+                        val delta = anchorPosition - currentPosition
+                        if (delta < 0) Int.MAX_VALUE else delta
+                    }
+                }
+                velocity <= -AnchoringVelocityThreshold -> {
+                    { anchorPosition: Int ->
+                        val delta = currentPosition - anchorPosition
+                        if (delta < 0) Int.MAX_VALUE else delta
+                    }
+                }
+                else -> {
+                    { anchorPosition: Int -> abs(currentPosition - anchorPosition) }
                 }
             }
-            velocity <= -AnchoringVelocityThreshold -> {
-                { anchorPosition: Int ->
-                    val delta = currentPosition - anchorPosition
-                    if (delta < 0) Int.MAX_VALUE else delta
-                }
-            }
-            else -> {
-                { anchorPosition: Int ->
-                    abs(currentPosition - anchorPosition)
-                }
-            }
-        }
-    )
+        )
 
     companion object {
         const val UnspecifiedWidth = -1
@@ -194,7 +188,8 @@
 
 @ExperimentalMaterial3AdaptiveApi
 @Immutable
-internal class PaneExpansionAnchor private constructor(
+internal class PaneExpansionAnchor
+private constructor(
     val percentage: Int,
     val startOffset: Dp // TODO(conradchen): confirm RTL support
 ) {
@@ -212,9 +207,10 @@
     @Suppress("ListIterator") // Not necessarily a random-accessible list
     forEach { anchor ->
         if (anchor.startOffset.isSpecified) {
-            val position = with(density) { anchor.startOffset.toPx() }.toInt().let {
-                if (it < 0) maxExpansionWidth + it else it
-            }
+            val position =
+                with(density) { anchor.startOffset.toPx() }
+                    .toInt()
+                    .let { if (it < 0) maxExpansionWidth + it else it }
             if (position in 0..maxExpansionWidth) {
                 anchors.add(position)
             }
diff --git a/compose/material3/adaptive/adaptive-layout/src/commonMain/kotlin/androidx/compose/material3/adaptive/layout/PaneScaffold.kt b/compose/material3/adaptive/adaptive-layout/src/commonMain/kotlin/androidx/compose/material3/adaptive/layout/PaneScaffold.kt
index b840410..04b653e 100644
--- a/compose/material3/adaptive/adaptive-layout/src/commonMain/kotlin/androidx/compose/material3/adaptive/layout/PaneScaffold.kt
+++ b/compose/material3/adaptive/adaptive-layout/src/commonMain/kotlin/androidx/compose/material3/adaptive/layout/PaneScaffold.kt
@@ -25,9 +25,7 @@
 import androidx.compose.ui.unit.Dp
 import androidx.compose.ui.unit.dp
 
-/**
- * Scope for the panes of pane scaffolds.
- */
+/** Scope for the panes of pane scaffolds. */
 sealed interface PaneScaffoldScope {
     /**
      * This modifier specifies the preferred width for a pane, and the pane scaffold implementation
@@ -100,8 +98,7 @@
         return AnimatedPaneNode()
     }
 
-    override fun update(node: AnimatedPaneNode) {
-    }
+    override fun update(node: AnimatedPaneNode) {}
 
     override fun InspectorInfo.inspectableProperties() {
         inspectorInfo()
diff --git a/compose/material3/adaptive/adaptive-layout/src/commonMain/kotlin/androidx/compose/material3/adaptive/layout/PaneScaffoldDirective.kt b/compose/material3/adaptive/adaptive-layout/src/commonMain/kotlin/androidx/compose/material3/adaptive/layout/PaneScaffoldDirective.kt
index 8072c34..b9cc5bf 100644
--- a/compose/material3/adaptive/adaptive-layout/src/commonMain/kotlin/androidx/compose/material3/adaptive/layout/PaneScaffoldDirective.kt
+++ b/compose/material3/adaptive/adaptive-layout/src/commonMain/kotlin/androidx/compose/material3/adaptive/layout/PaneScaffoldDirective.kt
@@ -31,16 +31,16 @@
 
 /**
  * Calculates the recommended [PaneScaffoldDirective] from a given [WindowAdaptiveInfo]. Use this
- * method with [currentWindowAdaptiveInfo] to acquire Material-recommended adaptive layout
- * settings of the current activity window.
+ * method with [currentWindowAdaptiveInfo] to acquire Material-recommended adaptive layout settings
+ * of the current activity window.
  *
  * See more details on the [Material design guideline site]
  * (https://m3.material.io/foundations/layout/applying-layout/window-size-classes).
  *
- * @param windowAdaptiveInfo [WindowAdaptiveInfo] that collects useful information in making
- *        layout adaptation decisions like [WindowSizeClass].
+ * @param windowAdaptiveInfo [WindowAdaptiveInfo] that collects useful information in making layout
+ *   adaptation decisions like [WindowSizeClass].
  * @param verticalHingePolicy [HingePolicy] that decides how layouts are supposed to address
- *        vertical hinges.
+ *   vertical hinges.
  * @return an [PaneScaffoldDirective] to be used to decide adaptive layout states.
  */
 @ExperimentalMaterial3AdaptiveApi
@@ -95,16 +95,16 @@
  * layout settings of the current activity window. Note that this function results in a dual-pane
  * layout when the [WindowWidthSizeClass] is [WindowWidthSizeClass.MEDIUM], while
  * [calculatePaneScaffoldDirective] results in a single-pane layout instead. We recommend to use
- * [calculatePaneScaffoldDirective], unless you have a strong use case to show two panes on
- * a medium-width window, which can make your layout look too packed.
+ * [calculatePaneScaffoldDirective], unless you have a strong use case to show two panes on a
+ * medium-width window, which can make your layout look too packed.
  *
  * See more details on the [Material design guideline site]
  * (https://m3.material.io/foundations/layout/applying-layout/window-size-classes).
  *
- * @param windowAdaptiveInfo [WindowAdaptiveInfo] that collects useful information in making
- *        layout adaptation decisions like [WindowSizeClass].
+ * @param windowAdaptiveInfo [WindowAdaptiveInfo] that collects useful information in making layout
+ *   adaptation decisions like [WindowSizeClass].
  * @param verticalHingePolicy [HingePolicy] that decides how layouts are supposed to address
- *        vertical hinges.
+ *   vertical hinges.
  * @return an [PaneScaffoldDirective] to be used to decide adaptive layout states.
  */
 @ExperimentalMaterial3AdaptiveApi
@@ -117,11 +117,12 @@
     return with(calculatePaneScaffoldDirective(windowAdaptiveInfo, verticalHingePolicy)) {
         copy(
             maxHorizontalPartitions = if (isMediumWidth) 2 else maxHorizontalPartitions,
-            horizontalPartitionSpacerSize = if (isMediumWidth) {
-                24.dp
-            } else {
-                horizontalPartitionSpacerSize
-            }
+            horizontalPartitionSpacerSize =
+                if (isMediumWidth) {
+                    24.dp
+                } else {
+                    horizontalPartitionSpacerSize
+                }
         )
     }
 }
@@ -139,20 +140,19 @@
  * Top-level directives about how a pane scaffold should be arranged and spaced, like how many
  * partitions the layout can be split into and what should be the gutter size.
  *
- * @property maxHorizontalPartitions the max number of partitions along the horizontal axis
- *           the layout can be split into.
- * @property horizontalPartitionSpacerSize Size of the spacers between horizontal partitions.
- *           It's equivalent to the left/right margins the horizontal partitions.
+ * @property maxHorizontalPartitions the max number of partitions along the horizontal axis the
+ *   layout can be split into.
+ * @property horizontalPartitionSpacerSize Size of the spacers between horizontal partitions. It's
+ *   equivalent to the left/right margins the horizontal partitions.
  * @property maxVerticalPartitions the max number of partitions along the vertical axis the layout
- *           can be split into.
- * @property verticalPartitionSpacerSize Size of the spacers between vertical partitions.
- *           It's equivalent to the top/bottom margins of the vertical partitions.
- * @property defaultPanePreferredWidth Default preferred width of panes that will be used by
- *           the scaffold if there's no [Modifier.preferredWidth] provided with a pane. See
- *           [Modifier.preferredWidth] for more info about how and when preferred width will be
- *           used.
+ *   can be split into.
+ * @property verticalPartitionSpacerSize Size of the spacers between vertical partitions. It's
+ *   equivalent to the top/bottom margins of the vertical partitions.
+ * @property defaultPanePreferredWidth Default preferred width of panes that will be used by the
+ *   scaffold if there's no [Modifier.preferredWidth] provided with a pane. See
+ *   [Modifier.preferredWidth] for more info about how and when preferred width will be used.
  * @property excludedBounds the bounds of all areas in the window that the layout needs to avoid
- *           displaying anything upon it. Usually these bounds represent where physical hinges are.
+ *   displaying anything upon it. Usually these bounds represent where physical hinges are.
  */
 @Immutable
 class PaneScaffoldDirective(
@@ -164,22 +164,22 @@
     val excludedBounds: List<Rect>
 ) {
     /**
-     * Returns a new copy of [PaneScaffoldDirective] with specified fields overwritten. Use
-     * this method to create a custom [PaneScaffoldDirective] from the default instance or
-     * the result of [calculatePaneScaffoldDirective].
+     * Returns a new copy of [PaneScaffoldDirective] with specified fields overwritten. Use this
+     * method to create a custom [PaneScaffoldDirective] from the default instance or the result of
+     * [calculatePaneScaffoldDirective].
      *
-     * @param maxHorizontalPartitions the max number of partitions along the horizontal axis
-     *        the layout can be split into.
-     * @param horizontalPartitionSpacerSize Size of the spacers between horizontal partitions.
-     *        It's equivalent to the left/right margins the horizontal partitions.
+     * @param maxHorizontalPartitions the max number of partitions along the horizontal axis the
+     *   layout can be split into.
+     * @param horizontalPartitionSpacerSize Size of the spacers between horizontal partitions. It's
+     *   equivalent to the left/right margins the horizontal partitions.
      * @param maxVerticalPartitions the max number of partitions along the vertical axis the layout
-     *        can be split into.
-     * @param verticalPartitionSpacerSize Size of the spacers between vertical partitions.
-     *        It's equivalent to the top/bottom margins of the vertical partitions.
-     * @param defaultPanePreferredWidth Default preferred width of panes that will be used by
-     *        the scaffold if there's no [Modifier.preferredWidth] provided with a pane.
+     *   can be split into.
+     * @param verticalPartitionSpacerSize Size of the spacers between vertical partitions. It's
+     *   equivalent to the top/bottom margins of the vertical partitions.
+     * @param defaultPanePreferredWidth Default preferred width of panes that will be used by the
+     *   scaffold if there's no [Modifier.preferredWidth] provided with a pane.
      * @param excludedBounds the bounds of all areas in the window that the layout needs to avoid
-     *        displaying anything upon it. Usually these bounds represent where physical hinges are.
+     *   displaying anything upon it. Usually these bounds represent where physical hinges are.
      */
     fun copy(
         maxHorizontalPartitions: Int = this.maxHorizontalPartitions,
@@ -188,14 +188,15 @@
         verticalPartitionSpacerSize: Dp = this.verticalPartitionSpacerSize,
         defaultPanePreferredWidth: Dp = this.defaultPanePreferredWidth,
         excludedBounds: List<Rect> = this.excludedBounds
-    ): PaneScaffoldDirective = PaneScaffoldDirective(
-        maxHorizontalPartitions,
-        horizontalPartitionSpacerSize,
-        maxVerticalPartitions,
-        verticalPartitionSpacerSize,
-        defaultPanePreferredWidth,
-        excludedBounds
-    )
+    ): PaneScaffoldDirective =
+        PaneScaffoldDirective(
+            maxHorizontalPartitions,
+            horizontalPartitionSpacerSize,
+            maxVerticalPartitions,
+            verticalPartitionSpacerSize,
+            defaultPanePreferredWidth,
+            excludedBounds
+        )
 
     override fun equals(other: Any?): Boolean {
         if (this === other) return true
@@ -232,14 +233,15 @@
          * occupies the full window. To create a customized [PaneScaffoldDirective], you can use
          * [PaneScaffoldDirective.copy] on the default instance to create a copy with custom values.
          */
-        val Default = PaneScaffoldDirective(
-            maxHorizontalPartitions = 1,
-            horizontalPartitionSpacerSize = 0.dp,
-            maxVerticalPartitions = 1,
-            verticalPartitionSpacerSize = 0.dp,
-            defaultPanePreferredWidth = 360.dp,
-            excludedBounds = emptyList()
-        )
+        val Default =
+            PaneScaffoldDirective(
+                maxHorizontalPartitions = 1,
+                horizontalPartitionSpacerSize = 0.dp,
+                maxVerticalPartitions = 1,
+                verticalPartitionSpacerSize = 0.dp,
+                defaultPanePreferredWidth = 360.dp,
+                excludedBounds = emptyList()
+            )
     }
 }
 
@@ -248,13 +250,14 @@
 @kotlin.jvm.JvmInline
 value class HingePolicy private constructor(private val value: Int) {
     override fun toString(): String {
-        return "HingePolicy." + when (this) {
-            AlwaysAvoid -> "AlwaysAvoid"
-            AvoidSeparating -> "AvoidOccludingAndSeparating"
-            AvoidOccluding -> "AvoidOccludingOnly"
-            NeverAvoid -> "NeverAvoid"
-            else -> ""
-        }
+        return "HingePolicy." +
+            when (this) {
+                AlwaysAvoid -> "AlwaysAvoid"
+                AvoidSeparating -> "AvoidOccludingAndSeparating"
+                AvoidOccluding -> "AvoidOccludingOnly"
+                NeverAvoid -> "NeverAvoid"
+                else -> ""
+            }
     }
 
     companion object {
diff --git a/compose/material3/adaptive/adaptive-layout/src/commonMain/kotlin/androidx/compose/material3/adaptive/layout/SupportingPaneScaffold.kt b/compose/material3/adaptive/adaptive-layout/src/commonMain/kotlin/androidx/compose/material3/adaptive/layout/SupportingPaneScaffold.kt
index 6e76baf..2c5acfa 100644
--- a/compose/material3/adaptive/adaptive-layout/src/commonMain/kotlin/androidx/compose/material3/adaptive/layout/SupportingPaneScaffold.kt
+++ b/compose/material3/adaptive/adaptive-layout/src/commonMain/kotlin/androidx/compose/material3/adaptive/layout/SupportingPaneScaffold.kt
@@ -26,17 +26,17 @@
  * panes in a canonical supporting-pane layout.
  *
  * @param directive The top-level directives about how the scaffold should arrange its panes.
- * @param value The current adapted value of the scaffold, which indicates how each pane of
- *        the scaffold is adapted.
+ * @param value The current adapted value of the scaffold, which indicates how each pane of the
+ *   scaffold is adapted.
  * @param mainPane the main pane of the scaffold, which is supposed to hold the major content of an
- *        app, for example, the editing screen of a doc app. See [SupportingPaneScaffoldRole.Main].
+ *   app, for example, the editing screen of a doc app. See [SupportingPaneScaffoldRole.Main].
  * @param supportingPane the supporting pane of the scaffold, which is supposed to hold the support
- *        content of an app, for example, the comment list of a doc app. See
- *        [SupportingPaneScaffoldRole.Supporting].
+ *   content of an app, for example, the comment list of a doc app. See
+ *   [SupportingPaneScaffoldRole.Supporting].
  * @param modifier [Modifier] of the scaffold layout.
  * @param extraPane the extra pane of the scaffold, which is supposed to hold any additional content
- *        besides the main and the supporting panes, for example, a styling panel in a doc app.
- *        See [SupportingPaneScaffoldRole.Extra].
+ *   besides the main and the supporting panes, for example, a styling panel in a doc app. See
+ *   [SupportingPaneScaffoldRole.Extra].
  */
 @ExperimentalMaterial3AdaptiveApi
 @Composable
@@ -59,9 +59,7 @@
     )
 }
 
-/**
- * Provides default values of [SupportingPaneScaffold].
- */
+/** Provides default values of [SupportingPaneScaffold]. */
 @ExperimentalMaterial3AdaptiveApi
 object SupportingPaneScaffoldDefaults {
     /**
@@ -87,17 +85,18 @@
      * horizontally, which allocates panes in the order of primary, secondary, and tertiary from
      * start to end.
      */
-    internal val PaneOrder = ThreePaneScaffoldHorizontalOrder(
-        ThreePaneScaffoldRole.Primary,
-        ThreePaneScaffoldRole.Secondary,
-        ThreePaneScaffoldRole.Tertiary
-    )
+    internal val PaneOrder =
+        ThreePaneScaffoldHorizontalOrder(
+            ThreePaneScaffoldRole.Primary,
+            ThreePaneScaffoldRole.Secondary,
+            ThreePaneScaffoldRole.Tertiary
+        )
 }
 
 /**
  * The set of the available pane roles of [SupportingPaneScaffold]. Those roles map to their
- * corresponding [ThreePaneScaffoldRole], which is a generic role definition across all types
- * of three pane scaffolds. We suggest you to use the values defined here instead of the raw
+ * corresponding [ThreePaneScaffoldRole], which is a generic role definition across all types of
+ * three pane scaffolds. We suggest you to use the values defined here instead of the raw
  * [ThreePaneScaffoldRole] under the context of [SupportingPaneScaffold] for better code clarity.
  */
 @ExperimentalMaterial3AdaptiveApi
diff --git a/compose/material3/adaptive/adaptive-layout/src/commonMain/kotlin/androidx/compose/material3/adaptive/layout/ThreePaneMotion.kt b/compose/material3/adaptive/adaptive-layout/src/commonMain/kotlin/androidx/compose/material3/adaptive/layout/ThreePaneMotion.kt
index b465bbb..28ecdc3 100644
--- a/compose/material3/adaptive/adaptive-layout/src/commonMain/kotlin/androidx/compose/material3/adaptive/layout/ThreePaneMotion.kt
+++ b/compose/material3/adaptive/adaptive-layout/src/commonMain/kotlin/androidx/compose/material3/adaptive/layout/ThreePaneMotion.kt
@@ -34,12 +34,11 @@
 import androidx.compose.ui.unit.IntOffset
 import androidx.compose.ui.unit.IntSize
 
-/**
- * Holds the transitions that can be applied to the different panes.
- */
+/** Holds the transitions that can be applied to the different panes. */
 @ExperimentalMaterial3AdaptiveApi
 @Immutable
-internal open class ThreePaneMotion internal constructor(
+internal open class ThreePaneMotion
+internal constructor(
     internal val positionAnimationSpec: FiniteAnimationSpec<IntOffset> = snap(),
     internal val sizeAnimationSpec: FiniteAnimationSpec<IntSize> = snap(),
     private val firstPaneEnterTransition: EnterTransition = EnterTransition.None,
@@ -51,8 +50,8 @@
 ) {
 
     /**
-     * Resolves and returns the [EnterTransition] for the given [ThreePaneScaffoldRole]
-     * at the given [ThreePaneScaffoldHorizontalOrder].
+     * Resolves and returns the [EnterTransition] for the given [ThreePaneScaffoldRole] at the given
+     * [ThreePaneScaffoldHorizontalOrder].
      */
     fun enterTransition(
         role: ThreePaneScaffoldRole,
@@ -69,8 +68,8 @@
     }
 
     /**
-     * Resolves and returns the [ExitTransition] for the given [ThreePaneScaffoldRole]
-     * at the given [ThreePaneScaffoldHorizontalOrder].
+     * Resolves and returns the [ExitTransition] for the given [ThreePaneScaffoldRole] at the given
+     * [ThreePaneScaffoldHorizontalOrder].
      */
     fun exitTransition(
         role: ThreePaneScaffoldRole,
@@ -159,18 +158,17 @@
 
 @ExperimentalMaterial3AdaptiveApi
 @Immutable
-internal class MovePanesToLeftMotion(
-    private val spacerSize: Int
-) : ThreePaneMotion(
-    ThreePaneMotionDefaults.PanePositionAnimationSpec,
-    ThreePaneMotionDefaults.PaneSizeAnimationSpec,
-    slideInFromRight(spacerSize),
-    slideOutToLeft(spacerSize),
-    slideInFromRight(spacerSize),
-    slideOutToLeft(spacerSize),
-    slideInFromRight(spacerSize),
-    slideOutToLeft(spacerSize)
-) {
+internal class MovePanesToLeftMotion(private val spacerSize: Int) :
+    ThreePaneMotion(
+        ThreePaneMotionDefaults.PanePositionAnimationSpec,
+        ThreePaneMotionDefaults.PaneSizeAnimationSpec,
+        slideInFromRight(spacerSize),
+        slideOutToLeft(spacerSize),
+        slideInFromRight(spacerSize),
+        slideOutToLeft(spacerSize),
+        slideInFromRight(spacerSize),
+        slideOutToLeft(spacerSize)
+    ) {
     override fun equals(other: Any?): Boolean {
         if (this === other) return true
         if (other !is MovePanesToLeftMotion) return false
@@ -185,18 +183,17 @@
 
 @ExperimentalMaterial3AdaptiveApi
 @Immutable
-internal class MovePanesToRightMotion(
-    private val spacerSize: Int
-) : ThreePaneMotion(
-    ThreePaneMotionDefaults.PanePositionAnimationSpec,
-    ThreePaneMotionDefaults.PaneSizeAnimationSpec,
-    slideInFromLeft(spacerSize),
-    slideOutToRight(spacerSize),
-    slideInFromLeft(spacerSize),
-    slideOutToRight(spacerSize),
-    slideInFromLeft(spacerSize),
-    slideOutToRight(spacerSize)
-) {
+internal class MovePanesToRightMotion(private val spacerSize: Int) :
+    ThreePaneMotion(
+        ThreePaneMotionDefaults.PanePositionAnimationSpec,
+        ThreePaneMotionDefaults.PaneSizeAnimationSpec,
+        slideInFromLeft(spacerSize),
+        slideOutToRight(spacerSize),
+        slideInFromLeft(spacerSize),
+        slideOutToRight(spacerSize),
+        slideInFromLeft(spacerSize),
+        slideOutToRight(spacerSize)
+    ) {
     override fun equals(other: Any?): Boolean {
         if (this === other) return true
         if (other !is MovePanesToRightMotion) return false
@@ -211,18 +208,17 @@
 
 @ExperimentalMaterial3AdaptiveApi
 @Immutable
-internal class SwitchLeftTwoPanesMotion(
-    private val spacerSize: Int
-) : ThreePaneMotion(
-    ThreePaneMotionDefaults.PanePositionAnimationSpec,
-    ThreePaneMotionDefaults.PaneSizeAnimationSpec,
-    slideInFromLeftDelayed(spacerSize),
-    slideOutToLeft(spacerSize),
-    slideInFromLeftDelayed(spacerSize),
-    slideOutToLeft(spacerSize),
-    EnterTransition.None,
-    ExitTransition.None
-) {
+internal class SwitchLeftTwoPanesMotion(private val spacerSize: Int) :
+    ThreePaneMotion(
+        ThreePaneMotionDefaults.PanePositionAnimationSpec,
+        ThreePaneMotionDefaults.PaneSizeAnimationSpec,
+        slideInFromLeftDelayed(spacerSize),
+        slideOutToLeft(spacerSize),
+        slideInFromLeftDelayed(spacerSize),
+        slideOutToLeft(spacerSize),
+        EnterTransition.None,
+        ExitTransition.None
+    ) {
     override fun equals(other: Any?): Boolean {
         if (this === other) return true
         if (other !is SwitchLeftTwoPanesMotion) return false
@@ -237,18 +233,17 @@
 
 @ExperimentalMaterial3AdaptiveApi
 @Immutable
-internal class SwitchRightTwoPanesMotion(
-    private val spacerSize: Int
-) : ThreePaneMotion(
-    ThreePaneMotionDefaults.PanePositionAnimationSpec,
-    ThreePaneMotionDefaults.PaneSizeAnimationSpec,
-    EnterTransition.None,
-    ExitTransition.None,
-    slideInFromRightDelayed(spacerSize),
-    slideOutToRight(spacerSize),
-    slideInFromRightDelayed(spacerSize),
-    slideOutToRight(spacerSize)
-) {
+internal class SwitchRightTwoPanesMotion(private val spacerSize: Int) :
+    ThreePaneMotion(
+        ThreePaneMotionDefaults.PanePositionAnimationSpec,
+        ThreePaneMotionDefaults.PaneSizeAnimationSpec,
+        EnterTransition.None,
+        ExitTransition.None,
+        slideInFromRightDelayed(spacerSize),
+        slideOutToRight(spacerSize),
+        slideInFromRightDelayed(spacerSize),
+        slideOutToRight(spacerSize)
+    ) {
     override fun equals(other: Any?): Boolean {
         if (this === other) return true
         if (other !is SwitchRightTwoPanesMotion) return false
@@ -278,49 +273,44 @@
         return ThreePaneMotion.NoMotion
     }
     return when (previousExpandedCount) {
-        1 -> when (PaneAdaptedValue.Expanded) {
-            previousScaffoldValue[paneOrder.firstPane] -> {
-                MovePanesToLeftMotion(spacerSize)
+        1 ->
+            when (PaneAdaptedValue.Expanded) {
+                previousScaffoldValue[paneOrder.firstPane] -> {
+                    MovePanesToLeftMotion(spacerSize)
+                }
+                previousScaffoldValue[paneOrder.thirdPane] -> {
+                    MovePanesToRightMotion(spacerSize)
+                }
+                currentScaffoldValue[paneOrder.thirdPane] -> {
+                    MovePanesToLeftMotion(spacerSize)
+                }
+                else -> {
+                    MovePanesToRightMotion(spacerSize)
+                }
             }
+        2 ->
+            when {
+                previousScaffoldValue[paneOrder.firstPane] == PaneAdaptedValue.Expanded &&
+                    currentScaffoldValue[paneOrder.firstPane] == PaneAdaptedValue.Expanded -> {
+                    // The first pane stays, the right two panes switch
+                    SwitchRightTwoPanesMotion(spacerSize)
+                }
+                previousScaffoldValue[paneOrder.thirdPane] == PaneAdaptedValue.Expanded &&
+                    currentScaffoldValue[paneOrder.thirdPane] == PaneAdaptedValue.Expanded -> {
+                    // The third pane stays, the left two panes switch
+                    SwitchLeftTwoPanesMotion(spacerSize)
+                }
 
-            previousScaffoldValue[paneOrder.thirdPane] -> {
-                MovePanesToRightMotion(spacerSize)
-            }
-
-            currentScaffoldValue[paneOrder.thirdPane] -> {
-                MovePanesToLeftMotion(spacerSize)
-            }
-
-            else -> {
-                MovePanesToRightMotion(spacerSize)
-            }
-        }
-
-        2 -> when {
-            previousScaffoldValue[paneOrder.firstPane] == PaneAdaptedValue.Expanded &&
-                currentScaffoldValue[paneOrder.firstPane] == PaneAdaptedValue.Expanded -> {
-                // The first pane stays, the right two panes switch
-                SwitchRightTwoPanesMotion(spacerSize)
-            }
-
-            previousScaffoldValue[paneOrder.thirdPane] == PaneAdaptedValue.Expanded &&
+                // Implies the second pane stays hereafter
                 currentScaffoldValue[paneOrder.thirdPane] == PaneAdaptedValue.Expanded -> {
-                // The third pane stays, the left two panes switch
-                SwitchLeftTwoPanesMotion(spacerSize)
+                    // The third pane shows, all panes move left
+                    MovePanesToLeftMotion(spacerSize)
+                }
+                else -> {
+                    // The first pane shows, all panes move right
+                    MovePanesToRightMotion(spacerSize)
+                }
             }
-
-            // Implies the second pane stays hereafter
-            currentScaffoldValue[paneOrder.thirdPane] == PaneAdaptedValue.Expanded -> {
-                // The third pane shows, all panes move left
-                MovePanesToLeftMotion(spacerSize)
-            }
-
-            else -> {
-                // The first pane shows, all panes move right
-                MovePanesToRightMotion(spacerSize)
-            }
-        }
-
         else -> {
             // Should not happen
             ThreePaneMotion.NoMotion
@@ -335,6 +325,7 @@
     visibilityThreshold: T? = null
 ) : FiniteAnimationSpec<T> {
     private val originalSpringSpec = spring(dampingRatio, stiffness, visibilityThreshold)
+
     override fun <V : AnimationVector> vectorize(
         converter: TwoWayConverter<T, V>
     ): VectorizedFiniteAnimationSpec<V> =
@@ -399,14 +390,17 @@
         targetValue: V,
         initialVelocity: V
     ) {
-        if (initialValue != cachedInitialValue ||
-            targetValue != cachedTargetValue ||
-            initialVelocity != cachedInitialVelocity) {
-            cachedOriginalDurationNanos = originalVectorizedSpringSpec.getDurationNanos(
-                initialValue,
-                targetValue,
-                initialVelocity
-            )
+        if (
+            initialValue != cachedInitialValue ||
+                targetValue != cachedTargetValue ||
+                initialVelocity != cachedInitialVelocity
+        ) {
+            cachedOriginalDurationNanos =
+                originalVectorizedSpringSpec.getDurationNanos(
+                    initialValue,
+                    targetValue,
+                    initialVelocity
+                )
             delayedTimeNanos = (cachedOriginalDurationNanos * delayedRatio).toLong()
         }
     }
diff --git a/compose/material3/adaptive/adaptive-layout/src/commonMain/kotlin/androidx/compose/material3/adaptive/layout/ThreePaneScaffold.kt b/compose/material3/adaptive/adaptive-layout/src/commonMain/kotlin/androidx/compose/material3/adaptive/layout/ThreePaneScaffold.kt
index ce9080d..3a88901 100644
--- a/compose/material3/adaptive/adaptive-layout/src/commonMain/kotlin/androidx/compose/material3/adaptive/layout/ThreePaneScaffold.kt
+++ b/compose/material3/adaptive/adaptive-layout/src/commonMain/kotlin/androidx/compose/material3/adaptive/layout/ThreePaneScaffold.kt
@@ -61,19 +61,20 @@
  * specifies, and allocate margins and spacers according to [PaneScaffoldDirective].
  *
  * [ThreePaneScaffold] is the base composable functions of adaptive programming. Developers can
- * freely pipeline the relevant adaptive signals and use them as input of the scaffold function
- * to render the final adaptive layout.
+ * freely pipeline the relevant adaptive signals and use them as input of the scaffold function to
+ * render the final adaptive layout.
  *
  * It's recommended to use [ThreePaneScaffold] with [calculatePaneScaffoldDirective],
  * [calculateThreePaneScaffoldValue] to follow the Material design guidelines on adaptive
  * programming.
  *
  * @param modifier The modifier to be applied to the layout.
- * @param scaffoldDirective The top-level directives about how the scaffold should arrange its panes.
+ * @param scaffoldDirective The top-level directives about how the scaffold should arrange its
+ *   panes.
  * @param scaffoldValue The current adapted value of the scaffold.
  * @param paneOrder The horizontal order of the panes from start to end in the scaffold.
  * @param secondaryPane The content of the secondary pane that has a priority lower then the primary
- *                      pane but higher than the tertiary pane.
+ *   pane but higher than the tertiary pane.
  * @param tertiaryPane The content of the tertiary pane that has the lowest priority.
  * @param primaryPane The content of the primary pane that has the highest priority.
  */
@@ -91,12 +92,8 @@
     paneExpansionDragHandle: (@Composable (PaneExpansionState) -> Unit)? = null,
     primaryPane: @Composable ThreePaneScaffoldScope.() -> Unit,
 ) {
-    val scaffoldState = remember {
-        SeekableTransitionState(scaffoldValue)
-    }
-    LaunchedEffect(key1 = scaffoldValue) {
-        scaffoldState.animateTo(scaffoldValue)
-    }
+    val scaffoldState = remember { SeekableTransitionState(scaffoldValue) }
+    LaunchedEffect(key1 = scaffoldValue) { scaffoldState.animateTo(scaffoldValue) }
     ThreePaneScaffold(
         modifier = modifier,
         scaffoldDirective = scaffoldDirective,
@@ -125,120 +122,130 @@
     primaryPane: @Composable ThreePaneScaffoldScope.() -> Unit,
 ) {
     val layoutDirection = LocalLayoutDirection.current
-    val ltrPaneOrder = remember(paneOrder, layoutDirection) {
-        paneOrder.toLtrOrder(layoutDirection)
-    }
+    val ltrPaneOrder =
+        remember(paneOrder, layoutDirection) { paneOrder.toLtrOrder(layoutDirection) }
     val previousScaffoldValue = remember { ThreePaneScaffoldValueHolder(scaffoldState.targetState) }
-    val spacerSize = with(LocalDensity.current) {
-        scaffoldDirective.horizontalPartitionSpacerSize.roundToPx()
-    }
-    val paneMotion = remember(scaffoldState.targetState, ltrPaneOrder, spacerSize) {
-        val previousValue = previousScaffoldValue.value
-        previousScaffoldValue.value = scaffoldState.targetState
-        calculateThreePaneMotion(
-            previousScaffoldValue = previousValue,
-            currentScaffoldValue = scaffoldState.targetState,
-            paneOrder = ltrPaneOrder,
-            spacerSize = spacerSize
-        )
-    }
+    val spacerSize =
+        with(LocalDensity.current) { scaffoldDirective.horizontalPartitionSpacerSize.roundToPx() }
+    val paneMotion =
+        remember(scaffoldState.targetState, ltrPaneOrder, spacerSize) {
+            val previousValue = previousScaffoldValue.value
+            previousScaffoldValue.value = scaffoldState.targetState
+            calculateThreePaneMotion(
+                previousScaffoldValue = previousValue,
+                currentScaffoldValue = scaffoldState.targetState,
+                paneOrder = ltrPaneOrder,
+                spacerSize = spacerSize
+            )
+        }
 
     val currentTransition = rememberTransition(scaffoldState)
 
     LookaheadScope {
         // Create PaneWrappers for each of the panes and map the transitions according to each pane
         // role and order.
-        val contents = listOf<@Composable () -> Unit>(
-            {
-                remember(currentTransition, this@LookaheadScope) {
-                    ThreePaneScaffoldScopeImpl(
-                        ThreePaneScaffoldRole.Primary,
-                        currentTransition,
-                        scaffoldState,
-                        this@LookaheadScope
-                    )
-                }.apply {
-                    positionAnimationSpec = paneMotion.positionAnimationSpec
-                    sizeAnimationSpec = paneMotion.sizeAnimationSpec
-                    enterTransition = paneMotion.enterTransition(
-                        ThreePaneScaffoldRole.Primary,
-                        ltrPaneOrder
-                    )
-                    exitTransition = paneMotion.exitTransition(
-                        ThreePaneScaffoldRole.Primary,
-                        ltrPaneOrder
-                    )
-                }.primaryPane()
-            },
-            {
-                remember(currentTransition, this@LookaheadScope) {
-                    ThreePaneScaffoldScopeImpl(
-                        ThreePaneScaffoldRole.Secondary,
-                        currentTransition,
-                        scaffoldState,
-                        this@LookaheadScope
-                    )
-                }.apply {
-                    positionAnimationSpec = paneMotion.positionAnimationSpec
-                    sizeAnimationSpec = paneMotion.sizeAnimationSpec
-                    enterTransition = paneMotion.enterTransition(
-                        ThreePaneScaffoldRole.Secondary,
-                        ltrPaneOrder
-                    )
-                    exitTransition = paneMotion.exitTransition(
-                        ThreePaneScaffoldRole.Secondary,
-                        ltrPaneOrder
-                    )
-                }.secondaryPane()
-            },
-            {
-                if (tertiaryPane != null) {
+        val contents =
+            listOf<@Composable () -> Unit>(
+                {
                     remember(currentTransition, this@LookaheadScope) {
-                        ThreePaneScaffoldScopeImpl(
-                            ThreePaneScaffoldRole.Tertiary,
-                            currentTransition,
-                            scaffoldState,
-                            this@LookaheadScope
-                        )
-                    }.apply {
-                        positionAnimationSpec = paneMotion.positionAnimationSpec
-                        sizeAnimationSpec = paneMotion.sizeAnimationSpec
-                        enterTransition = paneMotion.enterTransition(
-                            ThreePaneScaffoldRole.Tertiary,
-                            ltrPaneOrder
-                        )
-                        exitTransition = paneMotion.exitTransition(
-                            ThreePaneScaffoldRole.Tertiary,
-                            ltrPaneOrder
-                        )
-                    }.tertiaryPane()
+                            ThreePaneScaffoldScopeImpl(
+                                ThreePaneScaffoldRole.Primary,
+                                currentTransition,
+                                scaffoldState,
+                                this@LookaheadScope
+                            )
+                        }
+                        .apply {
+                            positionAnimationSpec = paneMotion.positionAnimationSpec
+                            sizeAnimationSpec = paneMotion.sizeAnimationSpec
+                            enterTransition =
+                                paneMotion.enterTransition(
+                                    ThreePaneScaffoldRole.Primary,
+                                    ltrPaneOrder
+                                )
+                            exitTransition =
+                                paneMotion.exitTransition(
+                                    ThreePaneScaffoldRole.Primary,
+                                    ltrPaneOrder
+                                )
+                        }
+                        .primaryPane()
+                },
+                {
+                    remember(currentTransition, this@LookaheadScope) {
+                            ThreePaneScaffoldScopeImpl(
+                                ThreePaneScaffoldRole.Secondary,
+                                currentTransition,
+                                scaffoldState,
+                                this@LookaheadScope
+                            )
+                        }
+                        .apply {
+                            positionAnimationSpec = paneMotion.positionAnimationSpec
+                            sizeAnimationSpec = paneMotion.sizeAnimationSpec
+                            enterTransition =
+                                paneMotion.enterTransition(
+                                    ThreePaneScaffoldRole.Secondary,
+                                    ltrPaneOrder
+                                )
+                            exitTransition =
+                                paneMotion.exitTransition(
+                                    ThreePaneScaffoldRole.Secondary,
+                                    ltrPaneOrder
+                                )
+                        }
+                        .secondaryPane()
+                },
+                {
+                    if (tertiaryPane != null) {
+                        remember(currentTransition, this@LookaheadScope) {
+                                ThreePaneScaffoldScopeImpl(
+                                    ThreePaneScaffoldRole.Tertiary,
+                                    currentTransition,
+                                    scaffoldState,
+                                    this@LookaheadScope
+                                )
+                            }
+                            .apply {
+                                positionAnimationSpec = paneMotion.positionAnimationSpec
+                                sizeAnimationSpec = paneMotion.sizeAnimationSpec
+                                enterTransition =
+                                    paneMotion.enterTransition(
+                                        ThreePaneScaffoldRole.Tertiary,
+                                        ltrPaneOrder
+                                    )
+                                exitTransition =
+                                    paneMotion.exitTransition(
+                                        ThreePaneScaffoldRole.Tertiary,
+                                        ltrPaneOrder
+                                    )
+                            }
+                            .tertiaryPane()
+                    }
+                },
+                {
+                    if (paneExpansionDragHandle != null) {
+                        paneExpansionDragHandle(paneExpansionState)
+                    }
                 }
-            },
-            {
-                if (paneExpansionDragHandle != null) {
-                    paneExpansionDragHandle(paneExpansionState)
-                }
-            }
-        )
-
-        val measurePolicy = remember(paneExpansionState) {
-            ThreePaneContentMeasurePolicy(
-                scaffoldDirective,
-                scaffoldState.targetState,
-                paneExpansionState,
-                ltrPaneOrder,
             )
-        }.apply {
-            this.scaffoldDirective = scaffoldDirective
-            this.scaffoldValue = scaffoldState.targetState
-            this.paneOrder = ltrPaneOrder
-        }
 
-        Layout(
-            contents = contents,
-            modifier = modifier,
-            measurePolicy = measurePolicy
-        )
+        val measurePolicy =
+            remember(paneExpansionState) {
+                    ThreePaneContentMeasurePolicy(
+                        scaffoldDirective,
+                        scaffoldState.targetState,
+                        paneExpansionState,
+                        ltrPaneOrder,
+                    )
+                }
+                .apply {
+                    this.scaffoldDirective = scaffoldDirective
+                    this.scaffoldValue = scaffoldState.targetState
+                    this.paneOrder = ltrPaneOrder
+                }
+
+        Layout(contents = contents, modifier = modifier, measurePolicy = measurePolicy)
     }
 }
 
@@ -262,11 +269,12 @@
      */
     data class PanePlacement(var positionX: Int = 0, var measuredWidth: Int = 0)
 
-    private val placementsCache = mapOf(
-        ThreePaneScaffoldRole.Primary to PanePlacement(),
-        ThreePaneScaffoldRole.Secondary to PanePlacement(),
-        ThreePaneScaffoldRole.Tertiary to PanePlacement()
-    )
+    private val placementsCache =
+        mapOf(
+            ThreePaneScaffoldRole.Primary to PanePlacement(),
+            ThreePaneScaffoldRole.Secondary to PanePlacement(),
+            ThreePaneScaffoldRole.Tertiary to PanePlacement()
+        )
 
     override fun MeasureScope.measure(
         measurables: List<List<Measurable>>,
@@ -280,72 +288,68 @@
             if (coordinates == null) {
                 return@layout
             }
-            val visiblePanes = getPanesMeasurables(
-                paneOrder = paneOrder,
-                primaryMeasurables = primaryMeasurables,
-                scaffoldValue = scaffoldValue,
-                secondaryMeasurables = secondaryMeasurables,
-                tertiaryMeasurables = tertiaryMeasurables
-            ) {
-                it != PaneAdaptedValue.Hidden
-            }
+            val visiblePanes =
+                getPanesMeasurables(
+                    paneOrder = paneOrder,
+                    primaryMeasurables = primaryMeasurables,
+                    scaffoldValue = scaffoldValue,
+                    secondaryMeasurables = secondaryMeasurables,
+                    tertiaryMeasurables = tertiaryMeasurables
+                ) {
+                    it != PaneAdaptedValue.Hidden
+                }
 
-            val hiddenPanes = getPanesMeasurables(
-                paneOrder = paneOrder,
-                primaryMeasurables = primaryMeasurables,
-                scaffoldValue = scaffoldValue,
-                secondaryMeasurables = secondaryMeasurables,
-                tertiaryMeasurables = tertiaryMeasurables
-            ) {
-                it == PaneAdaptedValue.Hidden
-            }
+            val hiddenPanes =
+                getPanesMeasurables(
+                    paneOrder = paneOrder,
+                    primaryMeasurables = primaryMeasurables,
+                    scaffoldValue = scaffoldValue,
+                    secondaryMeasurables = secondaryMeasurables,
+                    tertiaryMeasurables = tertiaryMeasurables
+                ) {
+                    it == PaneAdaptedValue.Hidden
+                }
 
             val verticalSpacerSize = scaffoldDirective.horizontalPartitionSpacerSize.roundToPx()
-            val outerBounds = IntRect(
-                0,
-                0,
-                constraints.maxWidth,
-                constraints.maxHeight
-            )
+            val outerBounds = IntRect(0, 0, constraints.maxWidth, constraints.maxHeight)
             if (!isLookingAhead) {
                 paneExpansionState.onMeasured(outerBounds.width, this@measure)
             }
 
             if (!paneExpansionState.isUnspecified() && visiblePanes.size == 2) {
                 // Pane expansion should override everything
-                if (paneExpansionState.currentDraggingOffset
-                    != PaneExpansionState.UnspecifiedWidth) {
+                if (
+                    paneExpansionState.currentDraggingOffset != PaneExpansionState.UnspecifiedWidth
+                ) {
                     // Respect the user dragging result if there's any
                     val halfSpacerSize = verticalSpacerSize / 2
                     if (paneExpansionState.currentDraggingOffset <= halfSpacerSize) {
-                        val bounds = if (paneExpansionState.isDraggingOrSettling) {
-                            outerBounds.copy(
-                                left = paneExpansionState.currentDraggingOffset * 2 +
-                                    outerBounds.left
-                            )
-                        } else {
-                            outerBounds
-                        }
-                        measureAndPlacePaneWithLocalBounds(
-                            bounds,
-                            visiblePanes[1],
-                            isLookingAhead
-                        )
-                    } else if (paneExpansionState.currentDraggingOffset >=
-                        outerBounds.width - halfSpacerSize) {
-                        val bounds = if (paneExpansionState.isDraggingOrSettling) {
-                            outerBounds.copy(
-                                right = paneExpansionState.currentDraggingOffset * 2 -
-                                    outerBounds.right
-                            )
-                        } else {
-                            outerBounds
-                        }
-                        measureAndPlacePaneWithLocalBounds(
-                            bounds,
-                            visiblePanes[0],
-                            isLookingAhead
-                        )
+                        val bounds =
+                            if (paneExpansionState.isDraggingOrSettling) {
+                                outerBounds.copy(
+                                    left =
+                                        paneExpansionState.currentDraggingOffset * 2 +
+                                            outerBounds.left
+                                )
+                            } else {
+                                outerBounds
+                            }
+                        measureAndPlacePaneWithLocalBounds(bounds, visiblePanes[1], isLookingAhead)
+                    } else if (
+                        paneExpansionState.currentDraggingOffset >=
+                            outerBounds.width - halfSpacerSize
+                    ) {
+                        val bounds =
+                            if (paneExpansionState.isDraggingOrSettling) {
+                                outerBounds.copy(
+                                    right =
+                                        paneExpansionState.currentDraggingOffset * 2 -
+                                            outerBounds.right
+                                )
+                            } else {
+                                outerBounds
+                            }
+                        measureAndPlacePaneWithLocalBounds(bounds, visiblePanes[0], isLookingAhead)
                     } else {
                         measureAndPlacePaneWithLocalBounds(
                             outerBounds.copy(
@@ -364,8 +368,10 @@
                     }
                 } else { // Pane expansion settings from non-dragging results
                     val availableWidth = constraints.maxWidth
-                    if (paneExpansionState.firstPaneWidth == 0 ||
-                        paneExpansionState.firstPanePercentage == 0f) {
+                    if (
+                        paneExpansionState.firstPaneWidth == 0 ||
+                            paneExpansionState.firstPanePercentage == 0f
+                    ) {
                         measureAndPlacePaneWithLocalBounds(
                             outerBounds,
                             visiblePanes[1],
@@ -373,7 +379,8 @@
                         )
                     } else if (
                         paneExpansionState.firstPaneWidth >= availableWidth - verticalSpacerSize ||
-                        paneExpansionState.firstPanePercentage >= 1f) {
+                            paneExpansionState.firstPanePercentage >= 1f
+                    ) {
                         measureAndPlacePaneWithLocalBounds(
                             outerBounds,
                             visiblePanes[0],
@@ -381,12 +388,15 @@
                         )
                     } else {
                         val firstPaneWidth =
-                            if (paneExpansionState.firstPaneWidth !=
-                                PaneExpansionState.UnspecifiedWidth) {
+                            if (
+                                paneExpansionState.firstPaneWidth !=
+                                    PaneExpansionState.UnspecifiedWidth
+                            ) {
                                 paneExpansionState.firstPaneWidth
                             } else {
                                 (paneExpansionState.firstPanePercentage *
-                                    (availableWidth - verticalSpacerSize)).toInt()
+                                        (availableWidth - verticalSpacerSize))
+                                    .toInt()
                             }
                         val firstPaneRight = outerBounds.left + firstPaneWidth
                         measureAndPlacePaneWithLocalBounds(
@@ -428,8 +438,7 @@
                         layoutPhysicalPartitions.add(
                             Rect(actualLeft, actualTop, hingeBound.left, actualBottom)
                         )
-                        actualLeft +=
-                            max(hingeBound.right, hingeBound.left + verticalSpacerSize)
+                        actualLeft += max(hingeBound.right, hingeBound.left + verticalSpacerSize)
                     }
                 }
                 if (actualLeft < actualRight) {
@@ -497,13 +506,13 @@
 
             if (visiblePanes.size == 2 && dragHandleMeasurables.isNotEmpty()) {
                 val handleOffsetX =
-                    if (!paneExpansionState.isDraggingOrSettling ||
-                        paneExpansionState.currentDraggingOffset ==
-                        PaneExpansionState.UnspecifiedWidth) {
-                        val spacerMiddleOffset = getSpacerMiddleOffsetX(
-                            visiblePanes[0],
-                            visiblePanes[1]
-                        )
+                    if (
+                        !paneExpansionState.isDraggingOrSettling ||
+                            paneExpansionState.currentDraggingOffset ==
+                                PaneExpansionState.UnspecifiedWidth
+                    ) {
+                        val spacerMiddleOffset =
+                            getSpacerMiddleOffsetX(visiblePanes[0], visiblePanes[1])
                         if (!isLookingAhead) {
                             paneExpansionState.onExpansionOffsetMeasured(spacerMiddleOffset)
                         }
@@ -526,11 +535,7 @@
             // otherwise the pane will be gone immediately when it's hidden.
             // The placement is done using the outerBounds, as the placementsCache holds
             // absolute position values.
-            placeHiddenPanes(
-                outerBounds.top,
-                outerBounds.height,
-                hiddenPanes
-            )
+            placeHiddenPanes(outerBounds.top, outerBounds.height, hiddenPanes)
         }
     }
 
@@ -555,7 +560,6 @@
                                 scaffoldDirective.defaultPanePreferredWidth.roundToPx()
                             )
                         }
-
                         ThreePaneScaffoldRole.Secondary -> {
                             createPaneMeasurableIfNeeded(
                                 secondaryMeasurables,
@@ -564,7 +568,6 @@
                                 scaffoldDirective.defaultPanePreferredWidth.roundToPx()
                             )
                         }
-
                         ThreePaneScaffoldRole.Tertiary -> {
                             createPaneMeasurableIfNeeded(
                                 tertiaryMeasurables,
@@ -594,11 +597,12 @@
         partitionBounds: Rect,
         measurable: PaneMeasurable,
         isLookingAhead: Boolean
-    ) = measureAndPlacePaneWithLocalBounds(
-        getLocalBounds(partitionBounds),
-        measurable,
-        isLookingAhead
-    )
+    ) =
+        measureAndPlacePaneWithLocalBounds(
+            getLocalBounds(partitionBounds),
+            measurable,
+            isLookingAhead
+        )
 
     private fun Placeable.PlacementScope.measureAndPlacePaneWithLocalBounds(
         localBounds: IntRect,
@@ -643,15 +647,12 @@
         val totalPreferredWidth = measurables.sumOf { it.measuringWidth }
         if (allocatableWidth > totalPreferredWidth) {
             // Allocate the remaining space to the pane with the highest priority.
-            measurables.maxBy {
-                it.priority
-            }.measuringWidth += allocatableWidth - totalPreferredWidth
+            measurables.maxBy { it.priority }.measuringWidth +=
+                allocatableWidth - totalPreferredWidth
         } else if (allocatableWidth < totalPreferredWidth) {
             // Scale down all panes to fit in the available space.
             val scale = allocatableWidth.toFloat() / totalPreferredWidth
-            measurables.fastForEach {
-                it.measuringWidth = (it.measuringWidth * scale).toInt()
-            }
+            measurables.fastForEach { it.measuringWidth = (it.measuringWidth * scale).toInt() }
         }
         var positionX = partitionBounds.left
         measurables.fastForEach {
@@ -709,27 +710,15 @@
         if (offsetX == PaneExpansionState.UnspecifiedWidth) {
             return
         }
-        val placeables = measurables.fastMap {
-            it.measure(
-                Constraints(
-                    maxWidth = maxHandleWidth,
-                    maxHeight = contentBounds.height
-                )
-            )
-        }
-        val halfMaxWidth = placeables.fastMaxOfOrNull {
-            it.width
-        }!! / 2
+        val placeables =
+            measurables.fastMap {
+                it.measure(Constraints(maxWidth = maxHandleWidth, maxHeight = contentBounds.height))
+            }
+        val halfMaxWidth = placeables.fastMaxOfOrNull { it.width }!! / 2
         val clampedOffsetX =
-            offsetX.coerceIn(
-                contentBounds.left + halfMaxWidth,
-                contentBounds.right - halfMaxWidth
-            )
+            offsetX.coerceIn(contentBounds.left + halfMaxWidth, contentBounds.right - halfMaxWidth)
         placeables.fastForEach {
-            it.place(
-                clampedOffsetX - it.width / 2,
-                (constraints.maxHeight - it.height) / 2
-            )
+            it.place(clampedOffsetX - it.width / 2, (constraints.maxHeight - it.height) / 2)
         }
     }
 
@@ -753,11 +742,12 @@
     private val data =
         ((measurable.parentData as? PaneScaffoldParentData) ?: PaneScaffoldParentData())
 
-    var measuringWidth = if (data.preferredWidth == null || data.preferredWidth!!.isNaN()) {
-        defaultPreferredWidth
-    } else {
-        data.preferredWidth!!.toInt()
-    }
+    var measuringWidth =
+        if (data.preferredWidth == null || data.preferredWidth!!.isNaN()) {
+            defaultPreferredWidth
+        } else {
+            data.preferredWidth!!.toInt()
+        }
 
     val isAnimatedPane = data.isAnimatedPane
 
@@ -801,24 +791,16 @@
     }
 }
 
-/**
- * Scope for the panes of [ThreePaneScaffold].
- */
+/** Scope for the panes of [ThreePaneScaffold]. */
 @ExperimentalMaterial3AdaptiveApi
 sealed interface ThreePaneScaffoldScope : PaneScaffoldScope, LookaheadScope {
-    /**
-     * The [ThreePaneScaffoldRole] of the current pane in the scope.
-     */
+    /** The [ThreePaneScaffoldRole] of the current pane in the scope. */
     val role: ThreePaneScaffoldRole
 
-    /**
-     * The current scaffold state transition between [ThreePaneScaffoldValue]s.
-     */
+    /** The current scaffold state transition between [ThreePaneScaffoldValue]s. */
     val scaffoldStateTransition: Transition<ThreePaneScaffoldValue>
 
-    /**
-     * The current fraction of the scaffold state transition.
-     */
+    /** The current fraction of the scaffold state transition. */
     val scaffoldStateTransitionFraction: Float
 
     /**
@@ -854,11 +836,13 @@
     lookaheadScope: LookaheadScope
 ) : ThreePaneScaffoldScope, LookaheadScope by lookaheadScope, PaneScaffoldScopeImpl() {
     override val scaffoldStateTransitionFraction: Float
-        get() = if (transitionState.currentState == transitionState.targetState) {
-            1f
-        } else {
-            transitionState.fraction
-        }
+        get() =
+            if (transitionState.currentState == transitionState.targetState) {
+                1f
+            } else {
+                transitionState.fraction
+            }
+
     override var positionAnimationSpec: FiniteAnimationSpec<IntOffset> by mutableStateOf(snap())
     override var sizeAnimationSpec: FiniteAnimationSpec<IntSize> by mutableStateOf(snap())
     override var enterTransition by mutableStateOf(EnterTransition.None)
diff --git a/compose/material3/adaptive/adaptive-layout/src/commonMain/kotlin/androidx/compose/material3/adaptive/layout/ThreePaneScaffoldAdaptStrategies.kt b/compose/material3/adaptive/adaptive-layout/src/commonMain/kotlin/androidx/compose/material3/adaptive/layout/ThreePaneScaffoldAdaptStrategies.kt
index 62fd21c..8a5c5cf47 100644
--- a/compose/material3/adaptive/adaptive-layout/src/commonMain/kotlin/androidx/compose/material3/adaptive/layout/ThreePaneScaffoldAdaptStrategies.kt
+++ b/compose/material3/adaptive/adaptive-layout/src/commonMain/kotlin/androidx/compose/material3/adaptive/layout/ThreePaneScaffoldAdaptStrategies.kt
@@ -23,10 +23,10 @@
  * [ThreePaneScaffold] should be adapted. It should be used as an input parameter of
  * [calculateThreePaneScaffoldValue] to decide the [ThreePaneScaffoldValue].
  *
- * @constructor create an instance of [ThreePaneScaffoldAdaptStrategies]
  * @param primaryPaneAdaptStrategy [AdaptStrategy] of the primary pane of [ThreePaneScaffold]
  * @param secondaryPaneAdaptStrategy [AdaptStrategy] of the secondary pane of [ThreePaneScaffold]
  * @param tertiaryPaneAdaptStrategy [AdaptStrategy] of the tertiary pane of [ThreePaneScaffold]
+ * @constructor create an instance of [ThreePaneScaffoldAdaptStrategies]
  */
 @ExperimentalMaterial3AdaptiveApi
 class ThreePaneScaffoldAdaptStrategies(
diff --git a/compose/material3/adaptive/adaptive-layout/src/commonMain/kotlin/androidx/compose/material3/adaptive/layout/ThreePaneScaffoldDestinationItem.kt b/compose/material3/adaptive/adaptive-layout/src/commonMain/kotlin/androidx/compose/material3/adaptive/layout/ThreePaneScaffoldDestinationItem.kt
index 797a08f..3c0b995 100644
--- a/compose/material3/adaptive/adaptive-layout/src/commonMain/kotlin/androidx/compose/material3/adaptive/layout/ThreePaneScaffoldDestinationItem.kt
+++ b/compose/material3/adaptive/adaptive-layout/src/commonMain/kotlin/androidx/compose/material3/adaptive/layout/ThreePaneScaffoldDestinationItem.kt
@@ -22,8 +22,8 @@
  * An item representing a navigation destination in a [ThreePaneScaffold].
  *
  * @param pane the pane destination of the navigation.
- * @param content the optional content, or an id representing the content of the destination.
- * The type [T] must be storable in a Bundle.
+ * @param content the optional content, or an id representing the content of the destination. The
+ *   type [T] must be storable in a Bundle.
  */
 @ExperimentalMaterial3AdaptiveApi
 class ThreePaneScaffoldDestinationItem<out T>(
diff --git a/compose/material3/adaptive/adaptive-layout/src/commonMain/kotlin/androidx/compose/material3/adaptive/layout/ThreePaneScaffoldHorizontalOrder.kt b/compose/material3/adaptive/adaptive-layout/src/commonMain/kotlin/androidx/compose/material3/adaptive/layout/ThreePaneScaffoldHorizontalOrder.kt
index a672945..fb1bff4 100644
--- a/compose/material3/adaptive/adaptive-layout/src/commonMain/kotlin/androidx/compose/material3/adaptive/layout/ThreePaneScaffoldHorizontalOrder.kt
+++ b/compose/material3/adaptive/adaptive-layout/src/commonMain/kotlin/androidx/compose/material3/adaptive/layout/ThreePaneScaffoldHorizontalOrder.kt
@@ -25,10 +25,10 @@
  * the values of [firstPane], [secondPane] and [thirdPane] have to be different, otherwise
  * [IllegalArgumentException] will be thrown.
  *
- * @constructor create an instance of [ThreePaneScaffoldHorizontalOrder]
  * @param firstPane The first pane from the start of the [ThreePaneScaffold]
  * @param secondPane The second pane from the start of the [ThreePaneScaffold]
  * @param thirdPane The third pane from the start of the [ThreePaneScaffold]
+ * @constructor create an instance of [ThreePaneScaffoldHorizontalOrder]
  */
 @ExperimentalMaterial3AdaptiveApi
 @Immutable
@@ -61,19 +61,13 @@
     }
 }
 
-/**
- * Converts a bidirectional order to a left-to-right order.
- */
+/** Converts a bidirectional order to a left-to-right order. */
 @ExperimentalMaterial3AdaptiveApi
 internal fun ThreePaneScaffoldHorizontalOrder.toLtrOrder(
     layoutDirection: LayoutDirection
 ): ThreePaneScaffoldHorizontalOrder {
     return if (layoutDirection == LayoutDirection.Rtl) {
-        ThreePaneScaffoldHorizontalOrder(
-            thirdPane,
-            secondPane,
-            firstPane
-        )
+        ThreePaneScaffoldHorizontalOrder(thirdPane, secondPane, firstPane)
     } else {
         this
     }
@@ -108,9 +102,7 @@
     return 0
 }
 
-/**
- * The set of the available pane roles of [ThreePaneScaffold].
- */
+/** The set of the available pane roles of [ThreePaneScaffold]. */
 enum class ThreePaneScaffoldRole {
     /**
      * The primary pane of [ThreePaneScaffold]. It is supposed to have the highest priority during
diff --git a/compose/material3/adaptive/adaptive-layout/src/commonMain/kotlin/androidx/compose/material3/adaptive/layout/ThreePaneScaffoldValue.kt b/compose/material3/adaptive/adaptive-layout/src/commonMain/kotlin/androidx/compose/material3/adaptive/layout/ThreePaneScaffoldValue.kt
index 5440514..167d325 100644
--- a/compose/material3/adaptive/adaptive-layout/src/commonMain/kotlin/androidx/compose/material3/adaptive/layout/ThreePaneScaffoldValue.kt
+++ b/compose/material3/adaptive/adaptive-layout/src/commonMain/kotlin/androidx/compose/material3/adaptive/layout/ThreePaneScaffoldValue.kt
@@ -38,17 +38,16 @@
  *
  * The function will treat the current destination as the highest priority and then adapt the rest
  * panes according to the order of [ThreePaneScaffoldRole.Primary],
- * [ThreePaneScaffoldRole.Secondary] and [ThreePaneScaffoldRole.Tertiary]. If there
- * are still remaining partitions to put the pane, the pane will be set as
- * [PaneAdaptedValue.Expanded], otherwise it will be adapted according to its associated
- * [AdaptStrategy].
+ * [ThreePaneScaffoldRole.Secondary] and [ThreePaneScaffoldRole.Tertiary]. If there are still
+ * remaining partitions to put the pane, the pane will be set as [PaneAdaptedValue.Expanded],
+ * otherwise it will be adapted according to its associated [AdaptStrategy].
  *
  * @param maxHorizontalPartitions The maximum allowed partitions along the horizontal axis, i.e.,
- *        how many expanded panes can be shown at the same time.
+ *   how many expanded panes can be shown at the same time.
  * @param adaptStrategies The adapt strategies of each pane role that [ThreePaneScaffold] supports,
- *        the default value will be [ThreePaneScaffoldDefaults.threePaneScaffoldAdaptStrategies].
- * @param currentDestination The current destination item, which will be treated as having
- *        the highest priority, can be `null`.
+ *   the default value will be [ThreePaneScaffoldDefaults.threePaneScaffoldAdaptStrategies].
+ * @param currentDestination The current destination item, which will be treated as having the
+ *   highest priority, can be `null`.
  */
 @ExperimentalMaterial3AdaptiveApi
 fun calculateThreePaneScaffoldValue(
@@ -64,7 +63,6 @@
                 expandedCount++
                 PaneAdaptedValue.Expanded
             }
-
             else -> adaptStrategies[role].adapt()
         }
     }
@@ -75,20 +73,20 @@
  * [maxHorizontalPartitions], [adaptStrategies] and [destinationHistory]. The returned value can be
  * used as a unique representation of the current layout structure.
  *
- * The function will treat the current focus as the highest priority and then adapt the rest
- * panes according to the order of [ThreePaneScaffoldRole.Primary],
- * [ThreePaneScaffoldRole.Secondary] and [ThreePaneScaffoldRole.Tertiary]. If there are still
- * remaining partitions to put the pane, the pane will be set as [PaneAdaptedValue.Expanded],
- * otherwise it will be adapted according to its associated [AdaptStrategy].
+ * The function will treat the current focus as the highest priority and then adapt the rest panes
+ * according to the order of [ThreePaneScaffoldRole.Primary], [ThreePaneScaffoldRole.Secondary] and
+ * [ThreePaneScaffoldRole.Tertiary]. If there are still remaining partitions to put the pane, the
+ * pane will be set as [PaneAdaptedValue.Expanded], otherwise it will be adapted according to its
+ * associated [AdaptStrategy].
  *
  * @param maxHorizontalPartitions The maximum allowed partitions along the horizontal axis, i.e.,
- *        how many expanded panes can be shown at the same time.
+ *   how many expanded panes can be shown at the same time.
  * @param adaptStrategies The adapt strategies of each pane role that [ThreePaneScaffold] supports,
- *        the default value will be [ThreePaneScaffoldDefaults.threePaneScaffoldAdaptStrategies].
+ *   the default value will be [ThreePaneScaffoldDefaults.threePaneScaffoldAdaptStrategies].
  * @param destinationHistory The history of past destination items. The last destination will have
- *        the highest priority, and the second last destination will have the second highest
- *        priority, and so forth until all panes have a priority assigned. Note that the last
- *        destination is supposed to be the last item of the provided list.
+ *   the highest priority, and the second last destination will have the second highest priority,
+ *   and so forth until all panes have a priority assigned. Note that the last destination is
+ *   supposed to be the last item of the provided list.
  */
 @ExperimentalMaterial3AdaptiveApi
 fun calculateThreePaneScaffoldValue(
@@ -126,42 +124,47 @@
         }
     }
     return ThreePaneScaffoldValue(
-        primary = primaryPaneAdaptedValue ?: if (expandedCount < maxHorizontalPartitions) {
-            expandedCount++
-            PaneAdaptedValue.Expanded
-        } else {
-            adaptStrategies[ThreePaneScaffoldRole.Primary].adapt()
-        },
-        secondary = secondaryPaneAdaptedValue ?: if (expandedCount < maxHorizontalPartitions) {
-            expandedCount++
-            PaneAdaptedValue.Expanded
-        } else {
-            adaptStrategies[ThreePaneScaffoldRole.Secondary].adapt()
-        },
-        tertiary = tertiaryPaneAdaptedValue ?: if (expandedCount < maxHorizontalPartitions) {
-            expandedCount++
-            PaneAdaptedValue.Expanded
-        } else {
-            adaptStrategies[ThreePaneScaffoldRole.Tertiary].adapt()
-        }
+        primary =
+            primaryPaneAdaptedValue
+                ?: if (expandedCount < maxHorizontalPartitions) {
+                    expandedCount++
+                    PaneAdaptedValue.Expanded
+                } else {
+                    adaptStrategies[ThreePaneScaffoldRole.Primary].adapt()
+                },
+        secondary =
+            secondaryPaneAdaptedValue
+                ?: if (expandedCount < maxHorizontalPartitions) {
+                    expandedCount++
+                    PaneAdaptedValue.Expanded
+                } else {
+                    adaptStrategies[ThreePaneScaffoldRole.Secondary].adapt()
+                },
+        tertiary =
+            tertiaryPaneAdaptedValue
+                ?: if (expandedCount < maxHorizontalPartitions) {
+                    expandedCount++
+                    PaneAdaptedValue.Expanded
+                } else {
+                    adaptStrategies[ThreePaneScaffoldRole.Tertiary].adapt()
+                }
     )
 }
 
 /**
  * The adapted value of [ThreePaneScaffold]. It contains each pane's adapted value.
- * [ThreePaneScaffold] will use the adapted values to decide which panes should be displayed
- * and how they should be displayed. With other input parameters of [ThreePaneScaffold] fixed,
- * each possible instance of this class should represent a unique state of [ThreePaneScaffold]
- * and developers can compare two [ThreePaneScaffoldValue] to decide if there is a layout structure
- * change.
+ * [ThreePaneScaffold] will use the adapted values to decide which panes should be displayed and how
+ * they should be displayed. With other input parameters of [ThreePaneScaffold] fixed, each possible
+ * instance of this class should represent a unique state of [ThreePaneScaffold] and developers can
+ * compare two [ThreePaneScaffoldValue] to decide if there is a layout structure change.
  *
  * For a Material-opinionated layout, it's suggested to use [calculateThreePaneScaffoldValue] to
  * calculate the current scaffold value.
  *
- * @constructor create an instance of [ThreePaneScaffoldValue]
  * @param primary [PaneAdaptedValue] of the primary pane of [ThreePaneScaffold]
  * @param secondary [PaneAdaptedValue] of the secondary pane of [ThreePaneScaffold]
  * @param tertiary [PaneAdaptedValue] of the tertiary pane of [ThreePaneScaffold]
+ * @constructor create an instance of [ThreePaneScaffoldValue]
  */
 @ExperimentalMaterial3AdaptiveApi
 @Immutable
@@ -201,16 +204,17 @@
 }
 
 @OptIn(ExperimentalMaterial3AdaptiveApi::class)
-internal val ThreePaneScaffoldValue.expandedCount: Int get() {
-    var count = 0
-    if (primary == PaneAdaptedValue.Expanded) {
-        count++
+internal val ThreePaneScaffoldValue.expandedCount: Int
+    get() {
+        var count = 0
+        if (primary == PaneAdaptedValue.Expanded) {
+            count++
+        }
+        if (secondary == PaneAdaptedValue.Expanded) {
+            count++
+        }
+        if (tertiary == PaneAdaptedValue.Expanded) {
+            count++
+        }
+        return count
     }
-    if (secondary == PaneAdaptedValue.Expanded) {
-        count++
-    }
-    if (tertiary == PaneAdaptedValue.Expanded) {
-        count++
-    }
-    return count
-}
diff --git a/compose/material3/adaptive/adaptive-navigation/src/androidInstrumentedTest/kotlin/androidx/compose/material3/adaptive/navigation/ListDetailPaneScaffoldNavigatorTest.kt b/compose/material3/adaptive/adaptive-navigation/src/androidInstrumentedTest/kotlin/androidx/compose/material3/adaptive/navigation/ListDetailPaneScaffoldNavigatorTest.kt
index 6307eda..aa86c48 100644
--- a/compose/material3/adaptive/adaptive-navigation/src/androidInstrumentedTest/kotlin/androidx/compose/material3/adaptive/navigation/ListDetailPaneScaffoldNavigatorTest.kt
+++ b/compose/material3/adaptive/adaptive-navigation/src/androidInstrumentedTest/kotlin/androidx/compose/material3/adaptive/navigation/ListDetailPaneScaffoldNavigatorTest.kt
@@ -37,8 +37,7 @@
 @SmallTest
 @RunWith(AndroidJUnit4::class)
 class ListDetailPaneScaffoldNavigatorTest {
-    @get:Rule
-    val composeRule = createComposeRule()
+    @get:Rule val composeRule = createComposeRule()
 
     @Test
     fun singlePaneLayout_navigateTo_makeDestinationPaneExpanded() {
@@ -46,26 +45,24 @@
         var canNavigateBack by Delegates.notNull<Boolean>()
 
         composeRule.setContent {
-            scaffoldNavigator = rememberListDetailPaneScaffoldNavigator<Int>(
-                scaffoldDirective = MockSinglePaneScaffoldDirective
-            )
+            scaffoldNavigator =
+                rememberListDetailPaneScaffoldNavigator<Int>(
+                    scaffoldDirective = MockSinglePaneScaffoldDirective
+                )
             canNavigateBack = scaffoldNavigator.canNavigateBack()
         }
 
         composeRule.runOnIdle {
-            assertThat(
-                scaffoldNavigator.scaffoldValue[ListDetailPaneScaffoldRole.Detail]
-            ).isEqualTo(PaneAdaptedValue.Hidden)
+            assertThat(scaffoldNavigator.scaffoldValue[ListDetailPaneScaffoldRole.Detail])
+                .isEqualTo(PaneAdaptedValue.Hidden)
             scaffoldNavigator.navigateTo(ListDetailPaneScaffoldRole.Detail, 0)
         }
 
         composeRule.runOnIdle {
-            assertThat(
-                scaffoldNavigator.scaffoldValue[ListDetailPaneScaffoldRole.Detail]
-            ).isEqualTo(PaneAdaptedValue.Expanded)
-            assertThat(
-                scaffoldNavigator.currentDestination?.pane
-            ).isEqualTo(ListDetailPaneScaffoldRole.Detail)
+            assertThat(scaffoldNavigator.scaffoldValue[ListDetailPaneScaffoldRole.Detail])
+                .isEqualTo(PaneAdaptedValue.Expanded)
+            assertThat(scaffoldNavigator.currentDestination?.pane)
+                .isEqualTo(ListDetailPaneScaffoldRole.Detail)
             assertThat(scaffoldNavigator.currentDestination?.content).isEqualTo(0)
             assertThat(canNavigateBack).isTrue()
         }
@@ -77,26 +74,24 @@
         var canNavigateBack by Delegates.notNull<Boolean>()
 
         composeRule.setContent {
-            scaffoldNavigator = rememberListDetailPaneScaffoldNavigator<Int>(
-                scaffoldDirective = MockDualPaneScaffoldDirective
-            )
+            scaffoldNavigator =
+                rememberListDetailPaneScaffoldNavigator<Int>(
+                    scaffoldDirective = MockDualPaneScaffoldDirective
+                )
             canNavigateBack = scaffoldNavigator.canNavigateBack()
         }
 
         composeRule.runOnIdle {
-            assertThat(
-                scaffoldNavigator.scaffoldValue[ListDetailPaneScaffoldRole.Detail]
-            ).isEqualTo(PaneAdaptedValue.Expanded)
+            assertThat(scaffoldNavigator.scaffoldValue[ListDetailPaneScaffoldRole.Detail])
+                .isEqualTo(PaneAdaptedValue.Expanded)
             scaffoldNavigator.navigateTo(ListDetailPaneScaffoldRole.Detail, 0)
         }
 
         composeRule.runOnIdle {
-            assertThat(
-                scaffoldNavigator.scaffoldValue[ListDetailPaneScaffoldRole.Detail]
-            ).isEqualTo(PaneAdaptedValue.Expanded)
-            assertThat(
-                scaffoldNavigator.currentDestination?.pane
-            ).isEqualTo(ListDetailPaneScaffoldRole.Detail)
+            assertThat(scaffoldNavigator.scaffoldValue[ListDetailPaneScaffoldRole.Detail])
+                .isEqualTo(PaneAdaptedValue.Expanded)
+            assertThat(scaffoldNavigator.currentDestination?.pane)
+                .isEqualTo(ListDetailPaneScaffoldRole.Detail)
             assertThat(scaffoldNavigator.currentDestination?.content).isEqualTo(0)
             assertThat(canNavigateBack).isFalse()
         }
@@ -108,27 +103,25 @@
         var canNavigateBack by Delegates.notNull<Boolean>()
 
         composeRule.setContent {
-            scaffoldNavigator = rememberListDetailPaneScaffoldNavigator<Int>(
-                scaffoldDirective = MockDualPaneScaffoldDirective,
-                isDestinationHistoryAware = false
-            )
+            scaffoldNavigator =
+                rememberListDetailPaneScaffoldNavigator<Int>(
+                    scaffoldDirective = MockDualPaneScaffoldDirective,
+                    isDestinationHistoryAware = false
+                )
             canNavigateBack = scaffoldNavigator.canNavigateBack()
         }
 
         composeRule.runOnIdle {
-            assertThat(
-                scaffoldNavigator.scaffoldValue[ListDetailPaneScaffoldRole.List]
-            ).isEqualTo(PaneAdaptedValue.Expanded)
+            assertThat(scaffoldNavigator.scaffoldValue[ListDetailPaneScaffoldRole.List])
+                .isEqualTo(PaneAdaptedValue.Expanded)
             scaffoldNavigator.navigateTo(ListDetailPaneScaffoldRole.Extra, 0)
         }
 
         composeRule.runOnIdle {
-            assertThat(
-                scaffoldNavigator.scaffoldValue[ListDetailPaneScaffoldRole.List]
-            ).isEqualTo(PaneAdaptedValue.Hidden)
-            assertThat(
-                scaffoldNavigator.currentDestination?.pane
-            ).isEqualTo(ListDetailPaneScaffoldRole.Extra)
+            assertThat(scaffoldNavigator.scaffoldValue[ListDetailPaneScaffoldRole.List])
+                .isEqualTo(PaneAdaptedValue.Hidden)
+            assertThat(scaffoldNavigator.currentDestination?.pane)
+                .isEqualTo(ListDetailPaneScaffoldRole.Extra)
             assertThat(scaffoldNavigator.currentDestination?.content).isEqualTo(0)
             assertThat(canNavigateBack).isTrue()
         }
@@ -140,27 +133,25 @@
         var canNavigateBack by Delegates.notNull<Boolean>()
 
         composeRule.setContent {
-            scaffoldNavigator = rememberListDetailPaneScaffoldNavigator<Int>(
-                scaffoldDirective = MockDualPaneScaffoldDirective,
-                isDestinationHistoryAware = true
-            )
+            scaffoldNavigator =
+                rememberListDetailPaneScaffoldNavigator<Int>(
+                    scaffoldDirective = MockDualPaneScaffoldDirective,
+                    isDestinationHistoryAware = true
+                )
             canNavigateBack = scaffoldNavigator.canNavigateBack()
         }
 
         composeRule.runOnIdle {
-            assertThat(
-                scaffoldNavigator.scaffoldValue[ListDetailPaneScaffoldRole.List]
-            ).isEqualTo(PaneAdaptedValue.Expanded)
+            assertThat(scaffoldNavigator.scaffoldValue[ListDetailPaneScaffoldRole.List])
+                .isEqualTo(PaneAdaptedValue.Expanded)
             scaffoldNavigator.navigateTo(ListDetailPaneScaffoldRole.Extra, 0)
         }
 
         composeRule.runOnIdle {
-            assertThat(
-                scaffoldNavigator.scaffoldValue[ListDetailPaneScaffoldRole.List]
-            ).isEqualTo(PaneAdaptedValue.Expanded)
-            assertThat(
-                scaffoldNavigator.currentDestination?.pane
-            ).isEqualTo(ListDetailPaneScaffoldRole.Extra)
+            assertThat(scaffoldNavigator.scaffoldValue[ListDetailPaneScaffoldRole.List])
+                .isEqualTo(PaneAdaptedValue.Expanded)
+            assertThat(scaffoldNavigator.currentDestination?.pane)
+                .isEqualTo(ListDetailPaneScaffoldRole.Extra)
             assertThat(scaffoldNavigator.currentDestination?.content).isEqualTo(0)
             assertThat(canNavigateBack).isTrue()
         }
@@ -172,35 +163,30 @@
         var canNavigateBack by Delegates.notNull<Boolean>()
 
         composeRule.setContent {
-            scaffoldNavigator = rememberListDetailPaneScaffoldNavigator<Int>(
-                scaffoldDirective = MockSinglePaneScaffoldDirective
-            )
+            scaffoldNavigator =
+                rememberListDetailPaneScaffoldNavigator<Int>(
+                    scaffoldDirective = MockSinglePaneScaffoldDirective
+                )
             canNavigateBack = scaffoldNavigator.canNavigateBack()
         }
 
-        composeRule.runOnIdle {
-            scaffoldNavigator.navigateTo(ListDetailPaneScaffoldRole.Detail, 0)
-        }
+        composeRule.runOnIdle { scaffoldNavigator.navigateTo(ListDetailPaneScaffoldRole.Detail, 0) }
 
         composeRule.runOnIdle {
-            assertThat(
-                scaffoldNavigator.scaffoldValue[ListDetailPaneScaffoldRole.Detail]
-            ).isEqualTo(PaneAdaptedValue.Expanded)
-            assertThat(
-                scaffoldNavigator.currentDestination?.pane
-            ).isEqualTo(ListDetailPaneScaffoldRole.Detail)
+            assertThat(scaffoldNavigator.scaffoldValue[ListDetailPaneScaffoldRole.Detail])
+                .isEqualTo(PaneAdaptedValue.Expanded)
+            assertThat(scaffoldNavigator.currentDestination?.pane)
+                .isEqualTo(ListDetailPaneScaffoldRole.Detail)
             assertThat(scaffoldNavigator.currentDestination?.content).isEqualTo(0)
             assertThat(canNavigateBack).isTrue()
             scaffoldNavigator.navigateBack()
         }
 
         composeRule.runOnIdle {
-            assertThat(
-                scaffoldNavigator.scaffoldValue[ListDetailPaneScaffoldRole.Detail]
-            ).isEqualTo(PaneAdaptedValue.Hidden)
-            assertThat(
-                scaffoldNavigator.currentDestination?.pane
-            ).isEqualTo(ListDetailPaneScaffoldRole.List)
+            assertThat(scaffoldNavigator.scaffoldValue[ListDetailPaneScaffoldRole.Detail])
+                .isEqualTo(PaneAdaptedValue.Hidden)
+            assertThat(scaffoldNavigator.currentDestination?.pane)
+                .isEqualTo(ListDetailPaneScaffoldRole.List)
             assertThat(scaffoldNavigator.currentDestination?.content).isNull()
             assertThat(canNavigateBack).isFalse()
         }
@@ -211,19 +197,20 @@
         lateinit var scaffoldNavigator: ThreePaneScaffoldNavigator<Int>
 
         composeRule.setContent {
-            scaffoldNavigator = rememberListDetailPaneScaffoldNavigator(
-                scaffoldDirective = MockDualPaneScaffoldDirective,
-                initialDestinationHistory = listOf(
-                    ThreePaneScaffoldDestinationItem(ListDetailPaneScaffoldRole.List),
-                    ThreePaneScaffoldDestinationItem(ListDetailPaneScaffoldRole.Detail, 0),
+            scaffoldNavigator =
+                rememberListDetailPaneScaffoldNavigator(
+                    scaffoldDirective = MockDualPaneScaffoldDirective,
+                    initialDestinationHistory =
+                        listOf(
+                            ThreePaneScaffoldDestinationItem(ListDetailPaneScaffoldRole.List),
+                            ThreePaneScaffoldDestinationItem(ListDetailPaneScaffoldRole.Detail, 0),
+                        )
                 )
-            )
         }
 
         composeRule.runOnIdle {
-            assertThat(
-                scaffoldNavigator.currentDestination?.pane
-            ).isEqualTo(ListDetailPaneScaffoldRole.Detail)
+            assertThat(scaffoldNavigator.currentDestination?.pane)
+                .isEqualTo(ListDetailPaneScaffoldRole.Detail)
             assertThat(scaffoldNavigator.currentDestination?.content).isEqualTo(0)
             assertThat(scaffoldNavigator.canNavigateBack()).isFalse()
         }
@@ -234,34 +221,32 @@
         lateinit var scaffoldNavigator: ThreePaneScaffoldNavigator<Int>
 
         composeRule.setContent {
-            scaffoldNavigator = rememberListDetailPaneScaffoldNavigator(
-                scaffoldDirective = MockDualPaneScaffoldDirective,
-                initialDestinationHistory = listOf(
-                    ThreePaneScaffoldDestinationItem(ListDetailPaneScaffoldRole.List),
-                    ThreePaneScaffoldDestinationItem(ListDetailPaneScaffoldRole.Detail, 0),
+            scaffoldNavigator =
+                rememberListDetailPaneScaffoldNavigator(
+                    scaffoldDirective = MockDualPaneScaffoldDirective,
+                    initialDestinationHistory =
+                        listOf(
+                            ThreePaneScaffoldDestinationItem(ListDetailPaneScaffoldRole.List),
+                            ThreePaneScaffoldDestinationItem(ListDetailPaneScaffoldRole.Detail, 0),
+                        )
                 )
-            )
         }
 
         composeRule.runOnIdle {
-            assertThat(
-                scaffoldNavigator.scaffoldValue[ListDetailPaneScaffoldRole.Detail]
-            ).isEqualTo(PaneAdaptedValue.Expanded)
-            assertThat(
-                scaffoldNavigator.currentDestination?.pane
-            ).isEqualTo(ListDetailPaneScaffoldRole.Detail)
+            assertThat(scaffoldNavigator.scaffoldValue[ListDetailPaneScaffoldRole.Detail])
+                .isEqualTo(PaneAdaptedValue.Expanded)
+            assertThat(scaffoldNavigator.currentDestination?.pane)
+                .isEqualTo(ListDetailPaneScaffoldRole.Detail)
             assertThat(scaffoldNavigator.currentDestination?.content).isEqualTo(0)
             assertThat(scaffoldNavigator.canNavigateBack(BackNavigationBehavior.PopLatest)).isTrue()
             scaffoldNavigator.navigateBack(BackNavigationBehavior.PopLatest)
         }
 
         composeRule.runOnIdle {
-            assertThat(
-                scaffoldNavigator.scaffoldValue[ListDetailPaneScaffoldRole.Detail]
-            ).isEqualTo(PaneAdaptedValue.Expanded)
-            assertThat(
-                scaffoldNavigator.currentDestination?.pane
-            ).isEqualTo(ListDetailPaneScaffoldRole.List)
+            assertThat(scaffoldNavigator.scaffoldValue[ListDetailPaneScaffoldRole.Detail])
+                .isEqualTo(PaneAdaptedValue.Expanded)
+            assertThat(scaffoldNavigator.currentDestination?.pane)
+                .isEqualTo(ListDetailPaneScaffoldRole.List)
             assertThat(scaffoldNavigator.currentDestination?.content).isNull()
         }
     }
@@ -271,33 +256,34 @@
         lateinit var scaffoldNavigator: ThreePaneScaffoldNavigator<Int>
 
         composeRule.setContent {
-            scaffoldNavigator = rememberListDetailPaneScaffoldNavigator(
-                scaffoldDirective = MockDualPaneScaffoldDirective,
-                initialDestinationHistory = listOf(
-                    ThreePaneScaffoldDestinationItem(ListDetailPaneScaffoldRole.List, null),
-                    ThreePaneScaffoldDestinationItem(ListDetailPaneScaffoldRole.Detail, 0),
-                    ThreePaneScaffoldDestinationItem(ListDetailPaneScaffoldRole.Detail, 1),
+            scaffoldNavigator =
+                rememberListDetailPaneScaffoldNavigator(
+                    scaffoldDirective = MockDualPaneScaffoldDirective,
+                    initialDestinationHistory =
+                        listOf(
+                            ThreePaneScaffoldDestinationItem(ListDetailPaneScaffoldRole.List, null),
+                            ThreePaneScaffoldDestinationItem(ListDetailPaneScaffoldRole.Detail, 0),
+                            ThreePaneScaffoldDestinationItem(ListDetailPaneScaffoldRole.Detail, 1),
+                        )
                 )
-            )
         }
 
         composeRule.runOnIdle {
-            assertThat(
-                scaffoldNavigator.currentDestination?.pane
-            ).isEqualTo(ListDetailPaneScaffoldRole.Detail)
+            assertThat(scaffoldNavigator.currentDestination?.pane)
+                .isEqualTo(ListDetailPaneScaffoldRole.Detail)
             assertThat(scaffoldNavigator.currentDestination?.content).isEqualTo(1)
             assertThat(
-                scaffoldNavigator.canNavigateBack(
-                    BackNavigationBehavior.PopUntilCurrentDestinationChange
+                    scaffoldNavigator.canNavigateBack(
+                        BackNavigationBehavior.PopUntilCurrentDestinationChange
+                    )
                 )
-            ).isTrue()
+                .isTrue()
             scaffoldNavigator.navigateBack(BackNavigationBehavior.PopUntilCurrentDestinationChange)
         }
 
         composeRule.runOnIdle {
-            assertThat(
-                scaffoldNavigator.currentDestination?.pane
-            ).isEqualTo(ListDetailPaneScaffoldRole.List)
+            assertThat(scaffoldNavigator.currentDestination?.pane)
+                .isEqualTo(ListDetailPaneScaffoldRole.List)
             assertThat(scaffoldNavigator.currentDestination?.content).isNull()
         }
     }
@@ -307,25 +293,27 @@
         lateinit var scaffoldNavigator: ThreePaneScaffoldNavigator<Int>
 
         composeRule.setContent {
-            scaffoldNavigator = rememberListDetailPaneScaffoldNavigator(
-                scaffoldDirective = MockDualPaneScaffoldDirective,
-                initialDestinationHistory = listOf(
-                    ThreePaneScaffoldDestinationItem(ListDetailPaneScaffoldRole.Detail, 0),
-                    ThreePaneScaffoldDestinationItem(ListDetailPaneScaffoldRole.Detail, 1),
+            scaffoldNavigator =
+                rememberListDetailPaneScaffoldNavigator(
+                    scaffoldDirective = MockDualPaneScaffoldDirective,
+                    initialDestinationHistory =
+                        listOf(
+                            ThreePaneScaffoldDestinationItem(ListDetailPaneScaffoldRole.Detail, 0),
+                            ThreePaneScaffoldDestinationItem(ListDetailPaneScaffoldRole.Detail, 1),
+                        )
                 )
-            )
         }
 
         composeRule.runOnIdle {
-            assertThat(
-                scaffoldNavigator.currentDestination?.pane
-            ).isEqualTo(ListDetailPaneScaffoldRole.Detail)
+            assertThat(scaffoldNavigator.currentDestination?.pane)
+                .isEqualTo(ListDetailPaneScaffoldRole.Detail)
             assertThat(scaffoldNavigator.currentDestination?.content).isEqualTo(1)
             assertThat(
-                scaffoldNavigator.canNavigateBack(
-                    BackNavigationBehavior.PopUntilCurrentDestinationChange
+                    scaffoldNavigator.canNavigateBack(
+                        BackNavigationBehavior.PopUntilCurrentDestinationChange
+                    )
                 )
-            ).isFalse()
+                .isFalse()
         }
     }
 
@@ -334,31 +322,32 @@
         lateinit var scaffoldNavigator: ThreePaneScaffoldNavigator<Int>
 
         composeRule.setContent {
-            scaffoldNavigator = rememberListDetailPaneScaffoldNavigator(
-                scaffoldDirective = MockDualPaneScaffoldDirective,
-                initialDestinationHistory = listOf(
-                    ThreePaneScaffoldDestinationItem(ListDetailPaneScaffoldRole.List, null),
-                    ThreePaneScaffoldDestinationItem(ListDetailPaneScaffoldRole.Detail, 0),
-                    ThreePaneScaffoldDestinationItem(ListDetailPaneScaffoldRole.Detail, 1),
+            scaffoldNavigator =
+                rememberListDetailPaneScaffoldNavigator(
+                    scaffoldDirective = MockDualPaneScaffoldDirective,
+                    initialDestinationHistory =
+                        listOf(
+                            ThreePaneScaffoldDestinationItem(ListDetailPaneScaffoldRole.List, null),
+                            ThreePaneScaffoldDestinationItem(ListDetailPaneScaffoldRole.Detail, 0),
+                            ThreePaneScaffoldDestinationItem(ListDetailPaneScaffoldRole.Detail, 1),
+                        )
                 )
-            )
         }
 
         composeRule.runOnIdle {
-            assertThat(
-                scaffoldNavigator.currentDestination?.pane
-            ).isEqualTo(ListDetailPaneScaffoldRole.Detail)
+            assertThat(scaffoldNavigator.currentDestination?.pane)
+                .isEqualTo(ListDetailPaneScaffoldRole.Detail)
             assertThat(scaffoldNavigator.currentDestination?.content).isEqualTo(1)
             assertThat(
-                scaffoldNavigator.canNavigateBack(BackNavigationBehavior.PopUntilContentChange)
-            ).isTrue()
+                    scaffoldNavigator.canNavigateBack(BackNavigationBehavior.PopUntilContentChange)
+                )
+                .isTrue()
             scaffoldNavigator.navigateBack(BackNavigationBehavior.PopUntilContentChange)
         }
 
         composeRule.runOnIdle {
-            assertThat(
-                scaffoldNavigator.currentDestination?.pane
-            ).isEqualTo(ListDetailPaneScaffoldRole.Detail)
+            assertThat(scaffoldNavigator.currentDestination?.pane)
+                .isEqualTo(ListDetailPaneScaffoldRole.Detail)
             assertThat(scaffoldNavigator.currentDestination?.content).isEqualTo(0)
         }
     }
@@ -368,31 +357,32 @@
         lateinit var scaffoldNavigator: ThreePaneScaffoldNavigator<Int>
 
         composeRule.setContent {
-            scaffoldNavigator = rememberListDetailPaneScaffoldNavigator(
-                scaffoldDirective = MockDualPaneScaffoldDirective,
-                initialDestinationHistory = listOf(
-                    ThreePaneScaffoldDestinationItem(ListDetailPaneScaffoldRole.List, 0),
-                    ThreePaneScaffoldDestinationItem(ListDetailPaneScaffoldRole.Detail, 0),
-                    ThreePaneScaffoldDestinationItem(ListDetailPaneScaffoldRole.Extra, 0),
+            scaffoldNavigator =
+                rememberListDetailPaneScaffoldNavigator(
+                    scaffoldDirective = MockDualPaneScaffoldDirective,
+                    initialDestinationHistory =
+                        listOf(
+                            ThreePaneScaffoldDestinationItem(ListDetailPaneScaffoldRole.List, 0),
+                            ThreePaneScaffoldDestinationItem(ListDetailPaneScaffoldRole.Detail, 0),
+                            ThreePaneScaffoldDestinationItem(ListDetailPaneScaffoldRole.Extra, 0),
+                        )
                 )
-            )
         }
 
         composeRule.runOnIdle {
-            assertThat(
-                scaffoldNavigator.currentDestination?.pane
-            ).isEqualTo(ListDetailPaneScaffoldRole.Extra)
+            assertThat(scaffoldNavigator.currentDestination?.pane)
+                .isEqualTo(ListDetailPaneScaffoldRole.Extra)
             assertThat(scaffoldNavigator.currentDestination?.content).isEqualTo(0)
             assertThat(
-                scaffoldNavigator.canNavigateBack(BackNavigationBehavior.PopUntilContentChange)
-            ).isTrue()
+                    scaffoldNavigator.canNavigateBack(BackNavigationBehavior.PopUntilContentChange)
+                )
+                .isTrue()
             scaffoldNavigator.navigateBack(BackNavigationBehavior.PopUntilContentChange)
         }
 
         composeRule.runOnIdle {
-            assertThat(
-                scaffoldNavigator.currentDestination?.pane
-            ).isEqualTo(ListDetailPaneScaffoldRole.Detail)
+            assertThat(scaffoldNavigator.currentDestination?.pane)
+                .isEqualTo(ListDetailPaneScaffoldRole.Detail)
             assertThat(scaffoldNavigator.currentDestination?.content).isEqualTo(0)
         }
     }
@@ -402,23 +392,25 @@
         lateinit var scaffoldNavigator: ThreePaneScaffoldNavigator<Int>
 
         composeRule.setContent {
-            scaffoldNavigator = rememberListDetailPaneScaffoldNavigator(
-                scaffoldDirective = MockDualPaneScaffoldDirective,
-                initialDestinationHistory = listOf(
-                    ThreePaneScaffoldDestinationItem(ListDetailPaneScaffoldRole.List, 0),
-                    ThreePaneScaffoldDestinationItem(ListDetailPaneScaffoldRole.Detail, 0),
+            scaffoldNavigator =
+                rememberListDetailPaneScaffoldNavigator(
+                    scaffoldDirective = MockDualPaneScaffoldDirective,
+                    initialDestinationHistory =
+                        listOf(
+                            ThreePaneScaffoldDestinationItem(ListDetailPaneScaffoldRole.List, 0),
+                            ThreePaneScaffoldDestinationItem(ListDetailPaneScaffoldRole.Detail, 0),
+                        )
                 )
-            )
         }
 
         composeRule.runOnIdle {
-            assertThat(
-                scaffoldNavigator.currentDestination?.pane
-            ).isEqualTo(ListDetailPaneScaffoldRole.Detail)
+            assertThat(scaffoldNavigator.currentDestination?.pane)
+                .isEqualTo(ListDetailPaneScaffoldRole.Detail)
             assertThat(scaffoldNavigator.currentDestination?.content).isEqualTo(0)
             assertThat(
-                scaffoldNavigator.canNavigateBack(BackNavigationBehavior.PopUntilContentChange)
-            ).isFalse()
+                    scaffoldNavigator.canNavigateBack(BackNavigationBehavior.PopUntilContentChange)
+                )
+                .isFalse()
         }
     }
 
@@ -427,14 +419,16 @@
         lateinit var scaffoldNavigator: ThreePaneScaffoldNavigator<Int>
 
         composeRule.setContent {
-            scaffoldNavigator = rememberListDetailPaneScaffoldNavigator(
-                scaffoldDirective = MockDualPaneScaffoldDirective,
-                initialDestinationHistory = listOf(
-                    ThreePaneScaffoldDestinationItem(ListDetailPaneScaffoldRole.Extra, 0),
-                    ThreePaneScaffoldDestinationItem(ListDetailPaneScaffoldRole.List),
-                ),
-                isDestinationHistoryAware = true
-            )
+            scaffoldNavigator =
+                rememberListDetailPaneScaffoldNavigator(
+                    scaffoldDirective = MockDualPaneScaffoldDirective,
+                    initialDestinationHistory =
+                        listOf(
+                            ThreePaneScaffoldDestinationItem(ListDetailPaneScaffoldRole.Extra, 0),
+                            ThreePaneScaffoldDestinationItem(ListDetailPaneScaffoldRole.List),
+                        ),
+                    isDestinationHistoryAware = true
+                )
         }
 
         composeRule.runOnIdle {
@@ -443,9 +437,8 @@
                 PaneAdaptedValue.Expanded,
                 PaneAdaptedValue.Expanded
             )
-            assertThat(
-                scaffoldNavigator.currentDestination?.pane
-            ).isEqualTo(ListDetailPaneScaffoldRole.List)
+            assertThat(scaffoldNavigator.currentDestination?.pane)
+                .isEqualTo(ListDetailPaneScaffoldRole.List)
             assertThat(scaffoldNavigator.currentDestination?.content).isNull()
             scaffoldNavigator.navigateTo(ListDetailPaneScaffoldRole.Detail, 0)
         }
@@ -456,9 +449,8 @@
                 PaneAdaptedValue.Expanded,
                 PaneAdaptedValue.Hidden
             )
-            assertThat(
-                scaffoldNavigator.currentDestination?.pane
-            ).isEqualTo(ListDetailPaneScaffoldRole.Detail)
+            assertThat(scaffoldNavigator.currentDestination?.pane)
+                .isEqualTo(ListDetailPaneScaffoldRole.Detail)
             assertThat(scaffoldNavigator.currentDestination?.content).isEqualTo(0)
             scaffoldNavigator.navigateBack()
         }
@@ -469,9 +461,8 @@
                 PaneAdaptedValue.Expanded,
                 PaneAdaptedValue.Expanded
             )
-            assertThat(
-                scaffoldNavigator.currentDestination?.pane
-            ).isEqualTo(ListDetailPaneScaffoldRole.List)
+            assertThat(scaffoldNavigator.currentDestination?.pane)
+                .isEqualTo(ListDetailPaneScaffoldRole.List)
             assertThat(scaffoldNavigator.currentDestination?.content).isNull()
         }
     }
@@ -481,14 +472,16 @@
         lateinit var scaffoldNavigator: ThreePaneScaffoldNavigator<Int>
 
         composeRule.setContent {
-            scaffoldNavigator = rememberListDetailPaneScaffoldNavigator(
-                scaffoldDirective = MockDualPaneScaffoldDirective,
-                initialDestinationHistory = listOf(
-                    ThreePaneScaffoldDestinationItem(ListDetailPaneScaffoldRole.Extra, 0),
-                    ThreePaneScaffoldDestinationItem(ListDetailPaneScaffoldRole.List),
-                ),
-                isDestinationHistoryAware = false
-            )
+            scaffoldNavigator =
+                rememberListDetailPaneScaffoldNavigator(
+                    scaffoldDirective = MockDualPaneScaffoldDirective,
+                    initialDestinationHistory =
+                        listOf(
+                            ThreePaneScaffoldDestinationItem(ListDetailPaneScaffoldRole.Extra, 0),
+                            ThreePaneScaffoldDestinationItem(ListDetailPaneScaffoldRole.List),
+                        ),
+                    isDestinationHistoryAware = false
+                )
         }
 
         composeRule.runOnIdle {
@@ -497,9 +490,8 @@
                 PaneAdaptedValue.Expanded,
                 PaneAdaptedValue.Hidden
             )
-            assertThat(
-                scaffoldNavigator.currentDestination?.pane
-            ).isEqualTo(ListDetailPaneScaffoldRole.List)
+            assertThat(scaffoldNavigator.currentDestination?.pane)
+                .isEqualTo(ListDetailPaneScaffoldRole.List)
             assertThat(scaffoldNavigator.currentDestination?.content).isNull()
             scaffoldNavigator.navigateTo(ListDetailPaneScaffoldRole.Detail, 0)
         }
@@ -510,9 +502,8 @@
                 PaneAdaptedValue.Expanded,
                 PaneAdaptedValue.Hidden
             )
-            assertThat(
-                scaffoldNavigator.currentDestination?.pane
-            ).isEqualTo(ListDetailPaneScaffoldRole.Detail)
+            assertThat(scaffoldNavigator.currentDestination?.pane)
+                .isEqualTo(ListDetailPaneScaffoldRole.Detail)
             assertThat(scaffoldNavigator.currentDestination?.content).isEqualTo(0)
             scaffoldNavigator.navigateBack()
         }
@@ -523,9 +514,8 @@
                 PaneAdaptedValue.Hidden,
                 PaneAdaptedValue.Expanded
             )
-            assertThat(
-                scaffoldNavigator.currentDestination?.pane
-            ).isEqualTo(ListDetailPaneScaffoldRole.Extra)
+            assertThat(scaffoldNavigator.currentDestination?.pane)
+                .isEqualTo(ListDetailPaneScaffoldRole.Extra)
             assertThat(scaffoldNavigator.currentDestination?.content).isEqualTo(0)
         }
     }
@@ -536,21 +526,21 @@
         val mockCurrentScaffoldDirective = mutableStateOf(MockSinglePaneScaffoldDirective)
 
         composeRule.setContent {
-            scaffoldNavigator = rememberListDetailPaneScaffoldNavigator(
-                scaffoldDirective = mockCurrentScaffoldDirective.value,
-                initialDestinationHistory = listOf(
-                    ThreePaneScaffoldDestinationItem(ListDetailPaneScaffoldRole.List),
-                    ThreePaneScaffoldDestinationItem(ListDetailPaneScaffoldRole.Detail, 0),
+            scaffoldNavigator =
+                rememberListDetailPaneScaffoldNavigator(
+                    scaffoldDirective = mockCurrentScaffoldDirective.value,
+                    initialDestinationHistory =
+                        listOf(
+                            ThreePaneScaffoldDestinationItem(ListDetailPaneScaffoldRole.List),
+                            ThreePaneScaffoldDestinationItem(ListDetailPaneScaffoldRole.Detail, 0),
+                        )
                 )
-            )
         }
         composeRule.runOnIdle {
-            assertThat(
-                scaffoldNavigator.scaffoldValue[ListDetailPaneScaffoldRole.Detail]
-            ).isEqualTo(PaneAdaptedValue.Expanded)
-            assertThat(
-                scaffoldNavigator.currentDestination?.pane
-            ).isEqualTo(ListDetailPaneScaffoldRole.Detail)
+            assertThat(scaffoldNavigator.scaffoldValue[ListDetailPaneScaffoldRole.Detail])
+                .isEqualTo(PaneAdaptedValue.Expanded)
+            assertThat(scaffoldNavigator.currentDestination?.pane)
+                .isEqualTo(ListDetailPaneScaffoldRole.Detail)
             assertThat(scaffoldNavigator.currentDestination?.content).isEqualTo(0)
             // Switches to dual pane
             mockCurrentScaffoldDirective.value = MockDualPaneScaffoldDirective
@@ -558,9 +548,8 @@
 
         composeRule.runOnIdle {
             assertThat(scaffoldNavigator.canNavigateBack()).isFalse()
-            assertThat(
-                scaffoldNavigator.currentDestination?.pane
-            ).isEqualTo(ListDetailPaneScaffoldRole.Detail)
+            assertThat(scaffoldNavigator.currentDestination?.pane)
+                .isEqualTo(ListDetailPaneScaffoldRole.Detail)
             assertThat(scaffoldNavigator.currentDestination?.content).isEqualTo(0)
         }
     }
@@ -568,10 +557,11 @@
 
 private val MockSinglePaneScaffoldDirective = PaneScaffoldDirective.Default
 
-private val MockDualPaneScaffoldDirective = PaneScaffoldDirective.Default.copy(
-    maxHorizontalPartitions = 2,
-    horizontalPartitionSpacerSize = 16.dp,
-)
+private val MockDualPaneScaffoldDirective =
+    PaneScaffoldDirective.Default.copy(
+        maxHorizontalPartitions = 2,
+        horizontalPartitionSpacerSize = 16.dp,
+    )
 
 @OptIn(ExperimentalMaterial3AdaptiveApi::class)
 private fun ThreePaneScaffoldValue.assert(
diff --git a/compose/material3/adaptive/adaptive-navigation/src/androidInstrumentedTest/kotlin/androidx/compose/material3/adaptive/navigation/SupportingPaneScaffoldNavigatorTest.kt b/compose/material3/adaptive/adaptive-navigation/src/androidInstrumentedTest/kotlin/androidx/compose/material3/adaptive/navigation/SupportingPaneScaffoldNavigatorTest.kt
index baa76ed..c485993 100644
--- a/compose/material3/adaptive/adaptive-navigation/src/androidInstrumentedTest/kotlin/androidx/compose/material3/adaptive/navigation/SupportingPaneScaffoldNavigatorTest.kt
+++ b/compose/material3/adaptive/adaptive-navigation/src/androidInstrumentedTest/kotlin/androidx/compose/material3/adaptive/navigation/SupportingPaneScaffoldNavigatorTest.kt
@@ -37,8 +37,7 @@
 @SmallTest
 @RunWith(AndroidJUnit4::class)
 class SupportingPaneScaffoldNavigatorTest {
-    @get:Rule
-    val composeRule = createComposeRule()
+    @get:Rule val composeRule = createComposeRule()
 
     @Test
     fun singlePaneLayout_navigateTo_makeDestinationPaneExpanded() {
@@ -46,26 +45,24 @@
         var canNavigateBack by Delegates.notNull<Boolean>()
 
         composeRule.setContent {
-            scaffoldNavigator = rememberSupportingPaneScaffoldNavigator<Int>(
-                scaffoldDirective = MockSinglePaneScaffoldDirective
-            )
+            scaffoldNavigator =
+                rememberSupportingPaneScaffoldNavigator<Int>(
+                    scaffoldDirective = MockSinglePaneScaffoldDirective
+                )
             canNavigateBack = scaffoldNavigator.canNavigateBack()
         }
 
         composeRule.runOnIdle {
-            assertThat(
-                scaffoldNavigator.scaffoldValue[SupportingPaneScaffoldRole.Supporting]
-            ).isEqualTo(PaneAdaptedValue.Hidden)
+            assertThat(scaffoldNavigator.scaffoldValue[SupportingPaneScaffoldRole.Supporting])
+                .isEqualTo(PaneAdaptedValue.Hidden)
             scaffoldNavigator.navigateTo(SupportingPaneScaffoldRole.Supporting, 0)
         }
 
         composeRule.runOnIdle {
-            assertThat(
-                scaffoldNavigator.scaffoldValue[SupportingPaneScaffoldRole.Supporting]
-            ).isEqualTo(PaneAdaptedValue.Expanded)
-            assertThat(
-                scaffoldNavigator.currentDestination?.pane
-            ).isEqualTo(SupportingPaneScaffoldRole.Supporting)
+            assertThat(scaffoldNavigator.scaffoldValue[SupportingPaneScaffoldRole.Supporting])
+                .isEqualTo(PaneAdaptedValue.Expanded)
+            assertThat(scaffoldNavigator.currentDestination?.pane)
+                .isEqualTo(SupportingPaneScaffoldRole.Supporting)
             assertThat(scaffoldNavigator.currentDestination?.content).isEqualTo(0)
             assertThat(canNavigateBack).isTrue()
         }
@@ -77,26 +74,24 @@
         var canNavigateBack by Delegates.notNull<Boolean>()
 
         composeRule.setContent {
-            scaffoldNavigator = rememberSupportingPaneScaffoldNavigator<Int>(
-                scaffoldDirective = MockDualPaneScaffoldDirective
-            )
+            scaffoldNavigator =
+                rememberSupportingPaneScaffoldNavigator<Int>(
+                    scaffoldDirective = MockDualPaneScaffoldDirective
+                )
             canNavigateBack = scaffoldNavigator.canNavigateBack()
         }
 
         composeRule.runOnIdle {
-            assertThat(
-                scaffoldNavigator.scaffoldValue[SupportingPaneScaffoldRole.Main]
-            ).isEqualTo(PaneAdaptedValue.Expanded)
+            assertThat(scaffoldNavigator.scaffoldValue[SupportingPaneScaffoldRole.Main])
+                .isEqualTo(PaneAdaptedValue.Expanded)
             scaffoldNavigator.navigateTo(SupportingPaneScaffoldRole.Main)
         }
 
         composeRule.runOnIdle {
-            assertThat(
-                scaffoldNavigator.scaffoldValue[SupportingPaneScaffoldRole.Main]
-            ).isEqualTo(PaneAdaptedValue.Expanded)
-            assertThat(
-                scaffoldNavigator.currentDestination?.pane
-            ).isEqualTo(SupportingPaneScaffoldRole.Main)
+            assertThat(scaffoldNavigator.scaffoldValue[SupportingPaneScaffoldRole.Main])
+                .isEqualTo(PaneAdaptedValue.Expanded)
+            assertThat(scaffoldNavigator.currentDestination?.pane)
+                .isEqualTo(SupportingPaneScaffoldRole.Main)
             assertThat(scaffoldNavigator.currentDestination?.content).isNull()
             assertThat(canNavigateBack).isFalse()
         }
@@ -108,34 +103,35 @@
         var canNavigateBack by Delegates.notNull<Boolean>()
 
         composeRule.setContent {
-            scaffoldNavigator = rememberSupportingPaneScaffoldNavigator(
-                initialDestinationHistory = listOf(
-                    ThreePaneScaffoldDestinationItem(SupportingPaneScaffoldRole.Supporting, 0)
-                ),
-                scaffoldDirective = MockDualPaneScaffoldDirective,
-                isDestinationHistoryAware = false
-            )
+            scaffoldNavigator =
+                rememberSupportingPaneScaffoldNavigator(
+                    initialDestinationHistory =
+                        listOf(
+                            ThreePaneScaffoldDestinationItem(
+                                SupportingPaneScaffoldRole.Supporting,
+                                0
+                            )
+                        ),
+                    scaffoldDirective = MockDualPaneScaffoldDirective,
+                    isDestinationHistoryAware = false
+                )
             canNavigateBack = scaffoldNavigator.canNavigateBack()
         }
 
         composeRule.runOnIdle {
-            assertThat(
-                scaffoldNavigator.scaffoldValue[SupportingPaneScaffoldRole.Supporting]
-            ).isEqualTo(PaneAdaptedValue.Expanded)
-            assertThat(
-                scaffoldNavigator.currentDestination?.pane
-            ).isEqualTo(SupportingPaneScaffoldRole.Supporting)
+            assertThat(scaffoldNavigator.scaffoldValue[SupportingPaneScaffoldRole.Supporting])
+                .isEqualTo(PaneAdaptedValue.Expanded)
+            assertThat(scaffoldNavigator.currentDestination?.pane)
+                .isEqualTo(SupportingPaneScaffoldRole.Supporting)
             assertThat(scaffoldNavigator.currentDestination?.content).isEqualTo(0)
             scaffoldNavigator.navigateTo(SupportingPaneScaffoldRole.Extra, 1)
         }
 
         composeRule.runOnIdle {
-            assertThat(
-                scaffoldNavigator.scaffoldValue[SupportingPaneScaffoldRole.Supporting]
-            ).isEqualTo(PaneAdaptedValue.Hidden)
-            assertThat(
-                scaffoldNavigator.currentDestination?.pane
-            ).isEqualTo(SupportingPaneScaffoldRole.Extra)
+            assertThat(scaffoldNavigator.scaffoldValue[SupportingPaneScaffoldRole.Supporting])
+                .isEqualTo(PaneAdaptedValue.Hidden)
+            assertThat(scaffoldNavigator.currentDestination?.pane)
+                .isEqualTo(SupportingPaneScaffoldRole.Extra)
             assertThat(scaffoldNavigator.currentDestination?.content).isEqualTo(1)
             assertThat(canNavigateBack).isTrue()
         }
@@ -147,34 +143,35 @@
         var canNavigateBack by Delegates.notNull<Boolean>()
 
         composeRule.setContent {
-            scaffoldNavigator = rememberSupportingPaneScaffoldNavigator(
-                initialDestinationHistory = listOf(
-                    ThreePaneScaffoldDestinationItem(SupportingPaneScaffoldRole.Supporting, 0)
-                ),
-                scaffoldDirective = MockDualPaneScaffoldDirective,
-                isDestinationHistoryAware = true
-            )
+            scaffoldNavigator =
+                rememberSupportingPaneScaffoldNavigator(
+                    initialDestinationHistory =
+                        listOf(
+                            ThreePaneScaffoldDestinationItem(
+                                SupportingPaneScaffoldRole.Supporting,
+                                0
+                            )
+                        ),
+                    scaffoldDirective = MockDualPaneScaffoldDirective,
+                    isDestinationHistoryAware = true
+                )
             canNavigateBack = scaffoldNavigator.canNavigateBack()
         }
 
         composeRule.runOnIdle {
-            assertThat(
-                scaffoldNavigator.scaffoldValue[SupportingPaneScaffoldRole.Supporting]
-            ).isEqualTo(PaneAdaptedValue.Expanded)
-            assertThat(
-                scaffoldNavigator.currentDestination?.pane
-            ).isEqualTo(SupportingPaneScaffoldRole.Supporting)
+            assertThat(scaffoldNavigator.scaffoldValue[SupportingPaneScaffoldRole.Supporting])
+                .isEqualTo(PaneAdaptedValue.Expanded)
+            assertThat(scaffoldNavigator.currentDestination?.pane)
+                .isEqualTo(SupportingPaneScaffoldRole.Supporting)
             assertThat(scaffoldNavigator.currentDestination?.content).isEqualTo(0)
             scaffoldNavigator.navigateTo(SupportingPaneScaffoldRole.Extra, 1)
         }
 
         composeRule.runOnIdle {
-            assertThat(
-                scaffoldNavigator.scaffoldValue[SupportingPaneScaffoldRole.Supporting]
-            ).isEqualTo(PaneAdaptedValue.Expanded)
-            assertThat(
-                scaffoldNavigator.currentDestination?.pane
-            ).isEqualTo(SupportingPaneScaffoldRole.Extra)
+            assertThat(scaffoldNavigator.scaffoldValue[SupportingPaneScaffoldRole.Supporting])
+                .isEqualTo(PaneAdaptedValue.Expanded)
+            assertThat(scaffoldNavigator.currentDestination?.pane)
+                .isEqualTo(SupportingPaneScaffoldRole.Extra)
             assertThat(scaffoldNavigator.currentDestination?.content).isEqualTo(1)
             assertThat(canNavigateBack).isTrue()
         }
@@ -186,9 +183,10 @@
         var canNavigateBack by Delegates.notNull<Boolean>()
 
         composeRule.setContent {
-            scaffoldNavigator = rememberSupportingPaneScaffoldNavigator<Int>(
-                scaffoldDirective = MockSinglePaneScaffoldDirective
-            )
+            scaffoldNavigator =
+                rememberSupportingPaneScaffoldNavigator<Int>(
+                    scaffoldDirective = MockSinglePaneScaffoldDirective
+                )
             canNavigateBack = scaffoldNavigator.canNavigateBack()
         }
 
@@ -197,24 +195,20 @@
         }
 
         composeRule.runOnIdle {
-            assertThat(
-                scaffoldNavigator.scaffoldValue[SupportingPaneScaffoldRole.Supporting]
-            ).isEqualTo(PaneAdaptedValue.Expanded)
-            assertThat(
-                scaffoldNavigator.currentDestination?.pane
-            ).isEqualTo(SupportingPaneScaffoldRole.Supporting)
+            assertThat(scaffoldNavigator.scaffoldValue[SupportingPaneScaffoldRole.Supporting])
+                .isEqualTo(PaneAdaptedValue.Expanded)
+            assertThat(scaffoldNavigator.currentDestination?.pane)
+                .isEqualTo(SupportingPaneScaffoldRole.Supporting)
             assertThat(scaffoldNavigator.currentDestination?.content).isEqualTo(0)
             assertThat(canNavigateBack).isTrue()
             scaffoldNavigator.navigateBack()
         }
 
         composeRule.runOnIdle {
-            assertThat(
-                scaffoldNavigator.scaffoldValue[SupportingPaneScaffoldRole.Supporting]
-            ).isEqualTo(PaneAdaptedValue.Hidden)
-            assertThat(
-                scaffoldNavigator.currentDestination?.pane
-            ).isEqualTo(SupportingPaneScaffoldRole.Main)
+            assertThat(scaffoldNavigator.scaffoldValue[SupportingPaneScaffoldRole.Supporting])
+                .isEqualTo(PaneAdaptedValue.Hidden)
+            assertThat(scaffoldNavigator.currentDestination?.pane)
+                .isEqualTo(SupportingPaneScaffoldRole.Main)
             assertThat(scaffoldNavigator.currentDestination?.content).isNull()
             assertThat(canNavigateBack).isFalse()
         }
@@ -225,19 +219,23 @@
         lateinit var scaffoldNavigator: ThreePaneScaffoldNavigator<Int>
 
         composeRule.setContent {
-            scaffoldNavigator = rememberSupportingPaneScaffoldNavigator(
-                scaffoldDirective = MockDualPaneScaffoldDirective,
-                initialDestinationHistory = listOf(
-                    ThreePaneScaffoldDestinationItem(SupportingPaneScaffoldRole.Supporting, 0),
-                    ThreePaneScaffoldDestinationItem(SupportingPaneScaffoldRole.Main),
+            scaffoldNavigator =
+                rememberSupportingPaneScaffoldNavigator(
+                    scaffoldDirective = MockDualPaneScaffoldDirective,
+                    initialDestinationHistory =
+                        listOf(
+                            ThreePaneScaffoldDestinationItem(
+                                SupportingPaneScaffoldRole.Supporting,
+                                0
+                            ),
+                            ThreePaneScaffoldDestinationItem(SupportingPaneScaffoldRole.Main),
+                        )
                 )
-            )
         }
 
         composeRule.runOnIdle {
-            assertThat(
-                scaffoldNavigator.currentDestination?.pane
-            ).isEqualTo(SupportingPaneScaffoldRole.Main)
+            assertThat(scaffoldNavigator.currentDestination?.pane)
+                .isEqualTo(SupportingPaneScaffoldRole.Main)
             assertThat(scaffoldNavigator.currentDestination?.content).isNull()
             assertThat(scaffoldNavigator.canNavigateBack()).isFalse()
         }
@@ -248,34 +246,35 @@
         lateinit var scaffoldNavigator: ThreePaneScaffoldNavigator<Int>
 
         composeRule.setContent {
-            scaffoldNavigator = rememberSupportingPaneScaffoldNavigator(
-                scaffoldDirective = MockDualPaneScaffoldDirective,
-                initialDestinationHistory = listOf(
-                    ThreePaneScaffoldDestinationItem(SupportingPaneScaffoldRole.Supporting, 0),
-                    ThreePaneScaffoldDestinationItem(SupportingPaneScaffoldRole.Main),
+            scaffoldNavigator =
+                rememberSupportingPaneScaffoldNavigator(
+                    scaffoldDirective = MockDualPaneScaffoldDirective,
+                    initialDestinationHistory =
+                        listOf(
+                            ThreePaneScaffoldDestinationItem(
+                                SupportingPaneScaffoldRole.Supporting,
+                                0
+                            ),
+                            ThreePaneScaffoldDestinationItem(SupportingPaneScaffoldRole.Main),
+                        )
                 )
-            )
         }
 
         composeRule.runOnIdle {
-            assertThat(
-                scaffoldNavigator.scaffoldValue[SupportingPaneScaffoldRole.Main]
-            ).isEqualTo(PaneAdaptedValue.Expanded)
-            assertThat(
-                scaffoldNavigator.currentDestination?.pane
-            ).isEqualTo(SupportingPaneScaffoldRole.Main)
+            assertThat(scaffoldNavigator.scaffoldValue[SupportingPaneScaffoldRole.Main])
+                .isEqualTo(PaneAdaptedValue.Expanded)
+            assertThat(scaffoldNavigator.currentDestination?.pane)
+                .isEqualTo(SupportingPaneScaffoldRole.Main)
             assertThat(scaffoldNavigator.currentDestination?.content).isNull()
             assertThat(scaffoldNavigator.canNavigateBack(BackNavigationBehavior.PopLatest)).isTrue()
             scaffoldNavigator.navigateBack(BackNavigationBehavior.PopLatest)
         }
 
         composeRule.runOnIdle {
-            assertThat(
-                scaffoldNavigator.scaffoldValue[SupportingPaneScaffoldRole.Main]
-            ).isEqualTo(PaneAdaptedValue.Expanded)
-            assertThat(
-                scaffoldNavigator.currentDestination?.pane
-            ).isEqualTo(SupportingPaneScaffoldRole.Supporting)
+            assertThat(scaffoldNavigator.scaffoldValue[SupportingPaneScaffoldRole.Main])
+                .isEqualTo(PaneAdaptedValue.Expanded)
+            assertThat(scaffoldNavigator.currentDestination?.pane)
+                .isEqualTo(SupportingPaneScaffoldRole.Supporting)
             assertThat(scaffoldNavigator.currentDestination?.content).isEqualTo(0)
         }
     }
@@ -285,33 +284,40 @@
         lateinit var scaffoldNavigator: ThreePaneScaffoldNavigator<Int>
 
         composeRule.setContent {
-            scaffoldNavigator = rememberSupportingPaneScaffoldNavigator(
-                scaffoldDirective = MockDualPaneScaffoldDirective,
-                initialDestinationHistory = listOf(
-                    ThreePaneScaffoldDestinationItem(SupportingPaneScaffoldRole.Main, null),
-                    ThreePaneScaffoldDestinationItem(SupportingPaneScaffoldRole.Supporting, 0),
-                    ThreePaneScaffoldDestinationItem(SupportingPaneScaffoldRole.Supporting, 1),
+            scaffoldNavigator =
+                rememberSupportingPaneScaffoldNavigator(
+                    scaffoldDirective = MockDualPaneScaffoldDirective,
+                    initialDestinationHistory =
+                        listOf(
+                            ThreePaneScaffoldDestinationItem(SupportingPaneScaffoldRole.Main, null),
+                            ThreePaneScaffoldDestinationItem(
+                                SupportingPaneScaffoldRole.Supporting,
+                                0
+                            ),
+                            ThreePaneScaffoldDestinationItem(
+                                SupportingPaneScaffoldRole.Supporting,
+                                1
+                            ),
+                        )
                 )
-            )
         }
 
         composeRule.runOnIdle {
-            assertThat(
-                scaffoldNavigator.currentDestination?.pane
-            ).isEqualTo(SupportingPaneScaffoldRole.Supporting)
+            assertThat(scaffoldNavigator.currentDestination?.pane)
+                .isEqualTo(SupportingPaneScaffoldRole.Supporting)
             assertThat(scaffoldNavigator.currentDestination?.content).isEqualTo(1)
             assertThat(
-                scaffoldNavigator.canNavigateBack(
-                    BackNavigationBehavior.PopUntilCurrentDestinationChange
+                    scaffoldNavigator.canNavigateBack(
+                        BackNavigationBehavior.PopUntilCurrentDestinationChange
+                    )
                 )
-            ).isTrue()
+                .isTrue()
             scaffoldNavigator.navigateBack(BackNavigationBehavior.PopUntilCurrentDestinationChange)
         }
 
         composeRule.runOnIdle {
-            assertThat(
-                scaffoldNavigator.currentDestination?.pane
-            ).isEqualTo(SupportingPaneScaffoldRole.Main)
+            assertThat(scaffoldNavigator.currentDestination?.pane)
+                .isEqualTo(SupportingPaneScaffoldRole.Main)
             assertThat(scaffoldNavigator.currentDestination?.content).isNull()
         }
     }
@@ -321,25 +327,27 @@
         lateinit var scaffoldNavigator: ThreePaneScaffoldNavigator<Int>
 
         composeRule.setContent {
-            scaffoldNavigator = rememberSupportingPaneScaffoldNavigator(
-                scaffoldDirective = MockDualPaneScaffoldDirective,
-                initialDestinationHistory = listOf(
-                    ThreePaneScaffoldDestinationItem(SupportingPaneScaffoldRole.Main, 0),
-                    ThreePaneScaffoldDestinationItem(SupportingPaneScaffoldRole.Main, 1),
+            scaffoldNavigator =
+                rememberSupportingPaneScaffoldNavigator(
+                    scaffoldDirective = MockDualPaneScaffoldDirective,
+                    initialDestinationHistory =
+                        listOf(
+                            ThreePaneScaffoldDestinationItem(SupportingPaneScaffoldRole.Main, 0),
+                            ThreePaneScaffoldDestinationItem(SupportingPaneScaffoldRole.Main, 1),
+                        )
                 )
-            )
         }
 
         composeRule.runOnIdle {
-            assertThat(
-                scaffoldNavigator.currentDestination?.pane
-            ).isEqualTo(SupportingPaneScaffoldRole.Main)
+            assertThat(scaffoldNavigator.currentDestination?.pane)
+                .isEqualTo(SupportingPaneScaffoldRole.Main)
             assertThat(scaffoldNavigator.currentDestination?.content).isEqualTo(1)
             assertThat(
-                scaffoldNavigator.canNavigateBack(
-                    BackNavigationBehavior.PopUntilCurrentDestinationChange
+                    scaffoldNavigator.canNavigateBack(
+                        BackNavigationBehavior.PopUntilCurrentDestinationChange
+                    )
                 )
-            ).isFalse()
+                .isFalse()
         }
     }
 
@@ -348,31 +356,38 @@
         lateinit var scaffoldNavigator: ThreePaneScaffoldNavigator<Int>
 
         composeRule.setContent {
-            scaffoldNavigator = rememberSupportingPaneScaffoldNavigator(
-                scaffoldDirective = MockDualPaneScaffoldDirective,
-                initialDestinationHistory = listOf(
-                    ThreePaneScaffoldDestinationItem(SupportingPaneScaffoldRole.Main, null),
-                    ThreePaneScaffoldDestinationItem(SupportingPaneScaffoldRole.Supporting, 0),
-                    ThreePaneScaffoldDestinationItem(SupportingPaneScaffoldRole.Supporting, 1),
+            scaffoldNavigator =
+                rememberSupportingPaneScaffoldNavigator(
+                    scaffoldDirective = MockDualPaneScaffoldDirective,
+                    initialDestinationHistory =
+                        listOf(
+                            ThreePaneScaffoldDestinationItem(SupportingPaneScaffoldRole.Main, null),
+                            ThreePaneScaffoldDestinationItem(
+                                SupportingPaneScaffoldRole.Supporting,
+                                0
+                            ),
+                            ThreePaneScaffoldDestinationItem(
+                                SupportingPaneScaffoldRole.Supporting,
+                                1
+                            ),
+                        )
                 )
-            )
         }
 
         composeRule.runOnIdle {
-            assertThat(
-                scaffoldNavigator.currentDestination?.pane
-            ).isEqualTo(SupportingPaneScaffoldRole.Supporting)
+            assertThat(scaffoldNavigator.currentDestination?.pane)
+                .isEqualTo(SupportingPaneScaffoldRole.Supporting)
             assertThat(scaffoldNavigator.currentDestination?.content).isEqualTo(1)
             assertThat(
-                scaffoldNavigator.canNavigateBack(BackNavigationBehavior.PopUntilContentChange)
-            ).isTrue()
+                    scaffoldNavigator.canNavigateBack(BackNavigationBehavior.PopUntilContentChange)
+                )
+                .isTrue()
             scaffoldNavigator.navigateBack(BackNavigationBehavior.PopUntilContentChange)
         }
 
         composeRule.runOnIdle {
-            assertThat(
-                scaffoldNavigator.currentDestination?.pane
-            ).isEqualTo(SupportingPaneScaffoldRole.Supporting)
+            assertThat(scaffoldNavigator.currentDestination?.pane)
+                .isEqualTo(SupportingPaneScaffoldRole.Supporting)
             assertThat(scaffoldNavigator.currentDestination?.content).isEqualTo(0)
         }
     }
@@ -382,31 +397,35 @@
         lateinit var scaffoldNavigator: ThreePaneScaffoldNavigator<Int>
 
         composeRule.setContent {
-            scaffoldNavigator = rememberSupportingPaneScaffoldNavigator(
-                scaffoldDirective = MockDualPaneScaffoldDirective,
-                initialDestinationHistory = listOf(
-                    ThreePaneScaffoldDestinationItem(SupportingPaneScaffoldRole.Main, 0),
-                    ThreePaneScaffoldDestinationItem(SupportingPaneScaffoldRole.Supporting, 0),
-                    ThreePaneScaffoldDestinationItem(SupportingPaneScaffoldRole.Extra, 0),
+            scaffoldNavigator =
+                rememberSupportingPaneScaffoldNavigator(
+                    scaffoldDirective = MockDualPaneScaffoldDirective,
+                    initialDestinationHistory =
+                        listOf(
+                            ThreePaneScaffoldDestinationItem(SupportingPaneScaffoldRole.Main, 0),
+                            ThreePaneScaffoldDestinationItem(
+                                SupportingPaneScaffoldRole.Supporting,
+                                0
+                            ),
+                            ThreePaneScaffoldDestinationItem(SupportingPaneScaffoldRole.Extra, 0),
+                        )
                 )
-            )
         }
 
         composeRule.runOnIdle {
-            assertThat(
-                scaffoldNavigator.currentDestination?.pane
-            ).isEqualTo(SupportingPaneScaffoldRole.Extra)
+            assertThat(scaffoldNavigator.currentDestination?.pane)
+                .isEqualTo(SupportingPaneScaffoldRole.Extra)
             assertThat(scaffoldNavigator.currentDestination?.content).isEqualTo(0)
             assertThat(
-                scaffoldNavigator.canNavigateBack(BackNavigationBehavior.PopUntilContentChange)
-            ).isTrue()
+                    scaffoldNavigator.canNavigateBack(BackNavigationBehavior.PopUntilContentChange)
+                )
+                .isTrue()
             scaffoldNavigator.navigateBack(BackNavigationBehavior.PopUntilContentChange)
         }
 
         composeRule.runOnIdle {
-            assertThat(
-                scaffoldNavigator.currentDestination?.pane
-            ).isEqualTo(SupportingPaneScaffoldRole.Supporting)
+            assertThat(scaffoldNavigator.currentDestination?.pane)
+                .isEqualTo(SupportingPaneScaffoldRole.Supporting)
             assertThat(scaffoldNavigator.currentDestination?.content).isEqualTo(0)
         }
     }
@@ -416,23 +435,28 @@
         lateinit var scaffoldNavigator: ThreePaneScaffoldNavigator<Int>
 
         composeRule.setContent {
-            scaffoldNavigator = rememberSupportingPaneScaffoldNavigator(
-                scaffoldDirective = MockDualPaneScaffoldDirective,
-                initialDestinationHistory = listOf(
-                    ThreePaneScaffoldDestinationItem(SupportingPaneScaffoldRole.Main, 0),
-                    ThreePaneScaffoldDestinationItem(SupportingPaneScaffoldRole.Supporting, 0),
+            scaffoldNavigator =
+                rememberSupportingPaneScaffoldNavigator(
+                    scaffoldDirective = MockDualPaneScaffoldDirective,
+                    initialDestinationHistory =
+                        listOf(
+                            ThreePaneScaffoldDestinationItem(SupportingPaneScaffoldRole.Main, 0),
+                            ThreePaneScaffoldDestinationItem(
+                                SupportingPaneScaffoldRole.Supporting,
+                                0
+                            ),
+                        )
                 )
-            )
         }
 
         composeRule.runOnIdle {
-            assertThat(
-                scaffoldNavigator.currentDestination?.pane
-            ).isEqualTo(SupportingPaneScaffoldRole.Supporting)
+            assertThat(scaffoldNavigator.currentDestination?.pane)
+                .isEqualTo(SupportingPaneScaffoldRole.Supporting)
             assertThat(scaffoldNavigator.currentDestination?.content).isEqualTo(0)
             assertThat(
-                scaffoldNavigator.canNavigateBack(BackNavigationBehavior.PopUntilContentChange)
-            ).isFalse()
+                    scaffoldNavigator.canNavigateBack(BackNavigationBehavior.PopUntilContentChange)
+                )
+                .isFalse()
         }
     }
 
@@ -441,14 +465,19 @@
         lateinit var scaffoldNavigator: ThreePaneScaffoldNavigator<Int>
 
         composeRule.setContent {
-            scaffoldNavigator = rememberSupportingPaneScaffoldNavigator(
-                scaffoldDirective = MockDualPaneScaffoldDirective,
-                initialDestinationHistory = listOf(
-                    ThreePaneScaffoldDestinationItem(SupportingPaneScaffoldRole.Extra, 1),
-                    ThreePaneScaffoldDestinationItem(SupportingPaneScaffoldRole.Supporting, 0),
-                ),
-                isDestinationHistoryAware = true
-            )
+            scaffoldNavigator =
+                rememberSupportingPaneScaffoldNavigator(
+                    scaffoldDirective = MockDualPaneScaffoldDirective,
+                    initialDestinationHistory =
+                        listOf(
+                            ThreePaneScaffoldDestinationItem(SupportingPaneScaffoldRole.Extra, 1),
+                            ThreePaneScaffoldDestinationItem(
+                                SupportingPaneScaffoldRole.Supporting,
+                                0
+                            ),
+                        ),
+                    isDestinationHistoryAware = true
+                )
         }
 
         composeRule.runOnIdle {
@@ -457,9 +486,8 @@
                 PaneAdaptedValue.Expanded,
                 PaneAdaptedValue.Expanded
             )
-            assertThat(
-                scaffoldNavigator.currentDestination?.pane
-            ).isEqualTo(SupportingPaneScaffoldRole.Supporting)
+            assertThat(scaffoldNavigator.currentDestination?.pane)
+                .isEqualTo(SupportingPaneScaffoldRole.Supporting)
             assertThat(scaffoldNavigator.currentDestination?.content).isEqualTo(0)
             scaffoldNavigator.navigateTo(SupportingPaneScaffoldRole.Main)
         }
@@ -470,9 +498,8 @@
                 PaneAdaptedValue.Expanded,
                 PaneAdaptedValue.Hidden
             )
-            assertThat(
-                scaffoldNavigator.currentDestination?.pane
-            ).isEqualTo(SupportingPaneScaffoldRole.Main)
+            assertThat(scaffoldNavigator.currentDestination?.pane)
+                .isEqualTo(SupportingPaneScaffoldRole.Main)
             assertThat(scaffoldNavigator.currentDestination?.content).isNull()
             scaffoldNavigator.navigateBack()
         }
@@ -483,9 +510,8 @@
                 PaneAdaptedValue.Expanded,
                 PaneAdaptedValue.Expanded
             )
-            assertThat(
-                scaffoldNavigator.currentDestination?.pane
-            ).isEqualTo(SupportingPaneScaffoldRole.Supporting)
+            assertThat(scaffoldNavigator.currentDestination?.pane)
+                .isEqualTo(SupportingPaneScaffoldRole.Supporting)
             assertThat(scaffoldNavigator.currentDestination?.content).isEqualTo(0)
         }
     }
@@ -495,14 +521,19 @@
         lateinit var scaffoldNavigator: ThreePaneScaffoldNavigator<Int>
 
         composeRule.setContent {
-            scaffoldNavigator = rememberSupportingPaneScaffoldNavigator(
-                scaffoldDirective = MockDualPaneScaffoldDirective,
-                initialDestinationHistory = listOf(
-                    ThreePaneScaffoldDestinationItem(SupportingPaneScaffoldRole.Extra, 1),
-                    ThreePaneScaffoldDestinationItem(SupportingPaneScaffoldRole.Supporting, 0),
-                ),
-                isDestinationHistoryAware = false
-            )
+            scaffoldNavigator =
+                rememberSupportingPaneScaffoldNavigator(
+                    scaffoldDirective = MockDualPaneScaffoldDirective,
+                    initialDestinationHistory =
+                        listOf(
+                            ThreePaneScaffoldDestinationItem(SupportingPaneScaffoldRole.Extra, 1),
+                            ThreePaneScaffoldDestinationItem(
+                                SupportingPaneScaffoldRole.Supporting,
+                                0
+                            ),
+                        ),
+                    isDestinationHistoryAware = false
+                )
         }
 
         composeRule.runOnIdle {
@@ -511,9 +542,8 @@
                 PaneAdaptedValue.Expanded,
                 PaneAdaptedValue.Hidden
             )
-            assertThat(
-                scaffoldNavigator.currentDestination?.pane
-            ).isEqualTo(SupportingPaneScaffoldRole.Supporting)
+            assertThat(scaffoldNavigator.currentDestination?.pane)
+                .isEqualTo(SupportingPaneScaffoldRole.Supporting)
             assertThat(scaffoldNavigator.currentDestination?.content).isEqualTo(0)
             scaffoldNavigator.navigateTo(SupportingPaneScaffoldRole.Main)
         }
@@ -524,9 +554,8 @@
                 PaneAdaptedValue.Expanded,
                 PaneAdaptedValue.Hidden
             )
-            assertThat(
-                scaffoldNavigator.currentDestination?.pane
-            ).isEqualTo(SupportingPaneScaffoldRole.Main)
+            assertThat(scaffoldNavigator.currentDestination?.pane)
+                .isEqualTo(SupportingPaneScaffoldRole.Main)
             assertThat(scaffoldNavigator.currentDestination?.content).isNull()
             scaffoldNavigator.navigateBack()
         }
@@ -537,9 +566,8 @@
                 PaneAdaptedValue.Hidden,
                 PaneAdaptedValue.Expanded
             )
-            assertThat(
-                scaffoldNavigator.currentDestination?.pane
-            ).isEqualTo(SupportingPaneScaffoldRole.Extra)
+            assertThat(scaffoldNavigator.currentDestination?.pane)
+                .isEqualTo(SupportingPaneScaffoldRole.Extra)
             assertThat(scaffoldNavigator.currentDestination?.content).isEqualTo(1)
         }
     }
@@ -550,21 +578,24 @@
         val mockCurrentScaffoldDirective = mutableStateOf(MockSinglePaneScaffoldDirective)
 
         composeRule.setContent {
-            scaffoldNavigator = rememberSupportingPaneScaffoldNavigator(
-                scaffoldDirective = mockCurrentScaffoldDirective.value,
-                initialDestinationHistory = listOf(
-                    ThreePaneScaffoldDestinationItem(SupportingPaneScaffoldRole.Supporting, 0),
-                    ThreePaneScaffoldDestinationItem(SupportingPaneScaffoldRole.Main),
+            scaffoldNavigator =
+                rememberSupportingPaneScaffoldNavigator(
+                    scaffoldDirective = mockCurrentScaffoldDirective.value,
+                    initialDestinationHistory =
+                        listOf(
+                            ThreePaneScaffoldDestinationItem(
+                                SupportingPaneScaffoldRole.Supporting,
+                                0
+                            ),
+                            ThreePaneScaffoldDestinationItem(SupportingPaneScaffoldRole.Main),
+                        )
                 )
-            )
         }
         composeRule.runOnIdle {
-            assertThat(
-                scaffoldNavigator.scaffoldValue[SupportingPaneScaffoldRole.Main]
-            ).isEqualTo(PaneAdaptedValue.Expanded)
-            assertThat(
-                scaffoldNavigator.currentDestination?.pane
-            ).isEqualTo(SupportingPaneScaffoldRole.Main)
+            assertThat(scaffoldNavigator.scaffoldValue[SupportingPaneScaffoldRole.Main])
+                .isEqualTo(PaneAdaptedValue.Expanded)
+            assertThat(scaffoldNavigator.currentDestination?.pane)
+                .isEqualTo(SupportingPaneScaffoldRole.Main)
             assertThat(scaffoldNavigator.currentDestination?.content).isNull()
             // Switches to dual pane
             mockCurrentScaffoldDirective.value = MockDualPaneScaffoldDirective
@@ -572,9 +603,8 @@
 
         composeRule.runOnIdle {
             assertThat(scaffoldNavigator.canNavigateBack()).isFalse()
-            assertThat(
-                scaffoldNavigator.currentDestination?.pane
-            ).isEqualTo(SupportingPaneScaffoldRole.Main)
+            assertThat(scaffoldNavigator.currentDestination?.pane)
+                .isEqualTo(SupportingPaneScaffoldRole.Main)
             assertThat(scaffoldNavigator.currentDestination?.content).isNull()
         }
     }
@@ -582,10 +612,11 @@
 
 private val MockSinglePaneScaffoldDirective = PaneScaffoldDirective.Default
 
-private val MockDualPaneScaffoldDirective = PaneScaffoldDirective.Default.copy(
-    maxHorizontalPartitions = 2,
-    horizontalPartitionSpacerSize = 16.dp,
-)
+private val MockDualPaneScaffoldDirective =
+    PaneScaffoldDirective.Default.copy(
+        maxHorizontalPartitions = 2,
+        horizontalPartitionSpacerSize = 16.dp,
+    )
 
 @OptIn(ExperimentalMaterial3AdaptiveApi::class)
 private fun ThreePaneScaffoldValue.assert(
@@ -594,8 +625,7 @@
     expectedExtraPaneAdaptedValue: PaneAdaptedValue
 ) {
     assertThat(this[SupportingPaneScaffoldRole.Main]).isEqualTo(expectedMainPaneAdaptedValue)
-    assertThat(this[SupportingPaneScaffoldRole.Supporting]).isEqualTo(
-        expectedSupportingPaneAdaptedValue
-    )
+    assertThat(this[SupportingPaneScaffoldRole.Supporting])
+        .isEqualTo(expectedSupportingPaneAdaptedValue)
     assertThat(this[SupportingPaneScaffoldRole.Extra]).isEqualTo(expectedExtraPaneAdaptedValue)
 }
diff --git a/compose/material3/adaptive/adaptive-navigation/src/androidMain/kotlin/androidx/compose/material3/adaptive/navigation/AndroidThreePaneScaffold.android.kt b/compose/material3/adaptive/adaptive-navigation/src/androidMain/kotlin/androidx/compose/material3/adaptive/navigation/AndroidThreePaneScaffold.android.kt
index c0d3a36..1efa9f4 100644
--- a/compose/material3/adaptive/adaptive-navigation/src/androidMain/kotlin/androidx/compose/material3/adaptive/navigation/AndroidThreePaneScaffold.android.kt
+++ b/compose/material3/adaptive/adaptive-navigation/src/androidMain/kotlin/androidx/compose/material3/adaptive/navigation/AndroidThreePaneScaffold.android.kt
@@ -30,17 +30,17 @@
  *
  * @param navigator The navigator instance to navigate through the scaffold.
  * @param listPane the list pane of the scaffold, which is supposed to hold a list of item summaries
- *        that can be selected from, for example, the inbox mail list of a mail app. See
- *        [ListDetailPaneScaffoldRole.List].
- * @param detailPane the detail pane of the scaffold, which is supposed to hold the detailed info
- *        of a selected item, for example, the mail content currently being viewed. See
- *        [ListDetailPaneScaffoldRole.Detail].
+ *   that can be selected from, for example, the inbox mail list of a mail app. See
+ *   [ListDetailPaneScaffoldRole.List].
+ * @param detailPane the detail pane of the scaffold, which is supposed to hold the detailed info of
+ *   a selected item, for example, the mail content currently being viewed. See
+ *   [ListDetailPaneScaffoldRole.Detail].
  * @param modifier [Modifier] of the scaffold layout.
  * @param extraPane the extra pane of the scaffold, which is supposed to hold any supplementary info
- *        besides the list and the detail panes, for example, a task list or a mini-calendar view of
- *        a mail app. See [ListDetailPaneScaffoldRole.Extra].
+ *   besides the list and the detail panes, for example, a task list or a mini-calendar view of a
+ *   mail app. See [ListDetailPaneScaffoldRole.Extra].
  * @param defaultBackBehavior the default back navigation behavior when the system back event
- *        happens. See [BackNavigationBehavior] for the use cases of each behavior.
+ *   happens. See [BackNavigationBehavior] for the use cases of each behavior.
  */
 @ExperimentalMaterial3AdaptiveApi
 @Composable
@@ -72,16 +72,16 @@
  *
  * @param navigator The navigator instance to navigate through the scaffold.
  * @param mainPane the main pane of the scaffold, which is supposed to hold the major content of an
- *        app, for example, the editing screen of a doc app. See [SupportingPaneScaffoldRole.Main].
+ *   app, for example, the editing screen of a doc app. See [SupportingPaneScaffoldRole.Main].
  * @param supportingPane the supporting pane of the scaffold, which is supposed to hold the support
- *        content of an app, for example, the comment list of a doc app. See
- *        [SupportingPaneScaffoldRole.Supporting].
+ *   content of an app, for example, the comment list of a doc app. See
+ *   [SupportingPaneScaffoldRole.Supporting].
  * @param modifier [Modifier] of the scaffold layout.
  * @param extraPane the extra pane of the scaffold, which is supposed to hold any additional content
- *        besides the main and the supporting panes, for example, a styling panel in a doc app.
- *        See [SupportingPaneScaffoldRole.Extra].
+ *   besides the main and the supporting panes, for example, a styling panel in a doc app. See
+ *   [SupportingPaneScaffoldRole.Extra].
  * @param defaultBackBehavior the default back navigation behavior when the system back event
- *        happens. See [BackNavigationBehavior] for the use cases of each behavior.
+ *   happens. See [BackNavigationBehavior] for the use cases of each behavior.
  */
 @ExperimentalMaterial3AdaptiveApi
 @Composable
diff --git a/compose/material3/adaptive/adaptive-navigation/src/commonMain/kotlin/androidx/compose/material3/adaptive/navigation/BackNavigationBehavior.kt b/compose/material3/adaptive/adaptive-navigation/src/commonMain/kotlin/androidx/compose/material3/adaptive/navigation/BackNavigationBehavior.kt
index 6d0a096..e3ba0c4 100644
--- a/compose/material3/adaptive/adaptive-navigation/src/commonMain/kotlin/androidx/compose/material3/adaptive/navigation/BackNavigationBehavior.kt
+++ b/compose/material3/adaptive/adaptive-navigation/src/commonMain/kotlin/androidx/compose/material3/adaptive/navigation/BackNavigationBehavior.kt
@@ -21,9 +21,7 @@
 import androidx.compose.material3.adaptive.layout.ThreePaneScaffoldDestinationItem
 import androidx.compose.material3.adaptive.layout.ThreePaneScaffoldRole
 
-/**
- * A class to control how back navigation should behave in a [ThreePaneScaffoldNavigator].
- */
+/** A class to control how back navigation should behave in a [ThreePaneScaffoldNavigator]. */
 @ExperimentalMaterial3AdaptiveApi
 @JvmInline
 value class BackNavigationBehavior private constructor(private val description: String) {
@@ -48,8 +46,8 @@
          *
          * In a single-pane layout, this should behave similarly to [PopUntilScaffoldValueChange].
          * In a multi-pane layout, it is possible for both the current destination and previous
-         * destination to be showing at the same time, so this may not result in a visual change
-         * in the scaffold.
+         * destination to be showing at the same time, so this may not result in a visual change in
+         * the scaffold.
          */
         val PopUntilCurrentDestinationChange =
             BackNavigationBehavior("PopUntilCurrentDestinationChange")
diff --git a/compose/material3/adaptive/adaptive-navigation/src/commonMain/kotlin/androidx/compose/material3/adaptive/navigation/ThreePaneScaffoldNavigator.kt b/compose/material3/adaptive/adaptive-navigation/src/commonMain/kotlin/androidx/compose/material3/adaptive/navigation/ThreePaneScaffoldNavigator.kt
index 7d0d22a..10a5006 100644
--- a/compose/material3/adaptive/adaptive-navigation/src/commonMain/kotlin/androidx/compose/material3/adaptive/navigation/ThreePaneScaffoldNavigator.kt
+++ b/compose/material3/adaptive/adaptive-navigation/src/commonMain/kotlin/androidx/compose/material3/adaptive/navigation/ThreePaneScaffoldNavigator.kt
@@ -87,16 +87,16 @@
 
     /**
      * Indicates if the navigator should be aware of pane destination history when deciding the
-     * result [ThreePaneScaffoldValue] by a navigation operation. If the value is `false`, only
-     * the current destination will be considered in the scaffold value calculation.
+     * result [ThreePaneScaffoldValue] by a navigation operation. If the value is `false`, only the
+     * current destination will be considered in the scaffold value calculation.
      *
      * @see calculateThreePaneScaffoldValue for more detailed explanation about history awareness.
      */
     var isDestinationHistoryAware: Boolean
 
     /**
-     * Navigates to a new destination. The new destination is supposed to have the highest
-     * priority when calculating the new [scaffoldValue].
+     * Navigates to a new destination. The new destination is supposed to have the highest priority
+     * when calculating the new [scaffoldValue].
      *
      * Implementors of this interface should ensure the new destination pane will be expanded or
      * adapted in a reasonable way so it provides users the sense that the new destination is the
@@ -104,7 +104,7 @@
      *
      * @param pane the new destination pane.
      * @param content the optional content, or an id representing the content of the new
-     * destination.
+     *   destination.
      */
     fun navigateTo(pane: ThreePaneScaffoldRole, content: T? = null)
 
@@ -115,7 +115,7 @@
      * [navigateBack].
      *
      * @param backNavigationBehavior the behavior describing which backstack entries may be skipped
-     * during the back navigation. See [BackNavigationBehavior].
+     *   during the back navigation. See [BackNavigationBehavior].
      */
     fun canNavigateBack(
         backNavigationBehavior: BackNavigationBehavior =
@@ -130,7 +130,7 @@
      * [canNavigateBack].
      *
      * @param backNavigationBehavior the behavior describing which backstack entries may be skipped
-     * during the back navigation. See [BackNavigationBehavior].
+     *   during the back navigation. See [BackNavigationBehavior].
      */
     fun navigateBack(
         backNavigationBehavior: BackNavigationBehavior =
@@ -140,17 +140,17 @@
 
 /**
  * Returns a remembered default implementation of [ThreePaneScaffoldNavigator] for
- * [ListDetailPaneScaffold], which will be updated automatically when the input values change.
- * The default navigator is supposed to be used independently from any navigation frameworks and
- * handles the navigation purely inside the [ListDetailPaneScaffold].
+ * [ListDetailPaneScaffold], which will be updated automatically when the input values change. The
+ * default navigator is supposed to be used independently from any navigation frameworks and handles
+ * the navigation purely inside the [ListDetailPaneScaffold].
  *
  * @param T the type representing the content, or id of the content, for a navigation destination.
  *   This type must be storable in a Bundle. Used to customize navigation behavior (for example,
  *   [BackNavigationBehavior]). If this customization is unneeded, you can pass [Nothing].
  * @param scaffoldDirective the current layout directives to follow. The default value will be
  *   calculated with [calculatePaneScaffoldDirective] using
- *   [WindowAdaptiveInfo][androidx.compose.material3.adaptive.WindowAdaptiveInfo] retrieved from
- *   the current context.
+ *   [WindowAdaptiveInfo][androidx.compose.material3.adaptive.WindowAdaptiveInfo] retrieved from the
+ *   current context.
  * @param adaptStrategies adaptation strategies of each pane.
  * @param isDestinationHistoryAware `true` if the scaffold value calculation should be aware of the
  *   full destination history, instead of just the current destination. See
@@ -178,14 +178,14 @@
 
 /**
  * Returns a remembered default implementation of [ThreePaneScaffoldNavigator] for
- * [ListDetailPaneScaffold], which will be updated automatically when the input values change.
- * The default navigator is supposed to be used independently from any navigation frameworks and
- * handles the navigation purely inside the [ListDetailPaneScaffold].
+ * [ListDetailPaneScaffold], which will be updated automatically when the input values change. The
+ * default navigator is supposed to be used independently from any navigation frameworks and handles
+ * the navigation purely inside the [ListDetailPaneScaffold].
  *
  * @param scaffoldDirective the current layout directives to follow. The default value will be
  *   calculated with [calculatePaneScaffoldDirective] using
- *   [WindowAdaptiveInfo][androidx.compose.material3.adaptive.WindowAdaptiveInfo] retrieved from
- *   the current context.
+ *   [WindowAdaptiveInfo][androidx.compose.material3.adaptive.WindowAdaptiveInfo] retrieved from the
+ *   current context.
  * @param adaptStrategies adaptation strategies of each pane.
  * @param isDestinationHistoryAware `true` if the scaffold value calculation should be aware of the
  *   full destination history, instead of just the current destination. See
@@ -208,17 +208,17 @@
 
 /**
  * Returns a remembered default implementation of [ThreePaneScaffoldNavigator] for
- * [SupportingPaneScaffold], which will be updated automatically when the input values change.
- * The default navigator is supposed to be used independently from any navigation frameworks and
- * handles the navigation purely inside the [SupportingPaneScaffold].
+ * [SupportingPaneScaffold], which will be updated automatically when the input values change. The
+ * default navigator is supposed to be used independently from any navigation frameworks and handles
+ * the navigation purely inside the [SupportingPaneScaffold].
  *
  * @param T the type representing the content, or id of the content, for a navigation destination.
  *   This type must be storable in a Bundle. Used to customize navigation behavior (for example,
  *   [BackNavigationBehavior]). If this customization is unneeded, you can pass [Nothing].
  * @param scaffoldDirective the current layout directives to follow. The default value will be
  *   calculated with [calculatePaneScaffoldDirective] using
- *   [WindowAdaptiveInfo][androidx.compose.material3.adaptive.WindowAdaptiveInfo] retrieved from
- *   the current context.
+ *   [WindowAdaptiveInfo][androidx.compose.material3.adaptive.WindowAdaptiveInfo] retrieved from the
+ *   current context.
  * @param adaptStrategies adaptation strategies of each pane.
  * @param isDestinationHistoryAware `true` if the scaffold value calculation should be aware of the
  *   full destination history, instead of just the current destination. See
@@ -246,14 +246,14 @@
 
 /**
  * Returns a remembered default implementation of [ThreePaneScaffoldNavigator] for
- * [SupportingPaneScaffold], which will be updated automatically when the input values change.
- * The default navigator is supposed to be used independently from any navigation frameworks and
- * handles the navigation purely inside the [SupportingPaneScaffold].
+ * [SupportingPaneScaffold], which will be updated automatically when the input values change. The
+ * default navigator is supposed to be used independently from any navigation frameworks and handles
+ * the navigation purely inside the [SupportingPaneScaffold].
  *
  * @param scaffoldDirective the current layout directives to follow. The default value will be
  *   calculated with [calculatePaneScaffoldDirective] using
- *   [WindowAdaptiveInfo][androidx.compose.material3.adaptive.WindowAdaptiveInfo] retrieved from
- *   the current context.
+ *   [WindowAdaptiveInfo][androidx.compose.material3.adaptive.WindowAdaptiveInfo] retrieved from the
+ *   current context.
  * @param adaptStrategies adaptation strategies of each pane.
  * @param isDestinationHistoryAware `true` if the scaffold value calculation should be aware of the
  *   full destination history, instead of just the current destination. See
@@ -283,23 +283,25 @@
     initialDestinationHistory: List<ThreePaneScaffoldDestinationItem<T>>
 ): ThreePaneScaffoldNavigator<T> =
     rememberSaveable(
-        saver = DefaultThreePaneScaffoldNavigator.saver(
-            scaffoldDirective,
-            adaptStrategies,
-            isDestinationHistoryAware
-        )
-    ) {
-        DefaultThreePaneScaffoldNavigator(
-            initialDestinationHistory = initialDestinationHistory,
-            initialScaffoldDirective = scaffoldDirective,
-            initialAdaptStrategies = adaptStrategies,
-            initialIsDestinationHistoryAware = isDestinationHistoryAware
-        )
-    }.apply {
-        this.scaffoldDirective = scaffoldDirective
-        this.adaptStrategies = adaptStrategies
-        this.isDestinationHistoryAware = isDestinationHistoryAware
-    }
+            saver =
+                DefaultThreePaneScaffoldNavigator.saver(
+                    scaffoldDirective,
+                    adaptStrategies,
+                    isDestinationHistoryAware
+                )
+        ) {
+            DefaultThreePaneScaffoldNavigator(
+                initialDestinationHistory = initialDestinationHistory,
+                initialScaffoldDirective = scaffoldDirective,
+                initialAdaptStrategies = adaptStrategies,
+                initialIsDestinationHistoryAware = isDestinationHistoryAware
+            )
+        }
+        .apply {
+            this.scaffoldDirective = scaffoldDirective
+            this.adaptStrategies = adaptStrategies
+            this.isDestinationHistoryAware = isDestinationHistoryAware
+        }
 
 @OptIn(ExperimentalMaterial3AdaptiveApi::class)
 internal class DefaultThreePaneScaffoldNavigator<T>(
@@ -320,7 +322,8 @@
 
     var adaptStrategies by mutableStateOf(initialAdaptStrategies)
 
-    override val currentDestination get() = destinationHistory.lastOrNull()
+    override val currentDestination
+        get() = destinationHistory.lastOrNull()
 
     override val scaffoldValue by derivedStateOf {
         calculateScaffoldValue(destinationHistory.lastIndex)
@@ -353,7 +356,6 @@
         }
         when (backNavBehavior) {
             BackNavigationBehavior.PopLatest -> return destinationHistory.lastIndex - 1
-
             BackNavigationBehavior.PopUntilScaffoldValueChange ->
                 for (previousDestinationIndex in destinationHistory.lastIndex - 1 downTo 0) {
                     val previousValue = calculateScaffoldValue(previousDestinationIndex)
@@ -361,7 +363,6 @@
                         return previousDestinationIndex
                     }
                 }
-
             BackNavigationBehavior.PopUntilCurrentDestinationChange ->
                 for (previousDestinationIndex in destinationHistory.lastIndex - 1 downTo 0) {
                     val destination = destinationHistory[previousDestinationIndex].pane
@@ -369,7 +370,6 @@
                         return previousDestinationIndex
                     }
                 }
-
             BackNavigationBehavior.PopUntilContentChange ->
                 for (previousDestinationIndex in destinationHistory.lastIndex - 1 downTo 0) {
                     val content = destinationHistory[previousDestinationIndex].content
@@ -409,9 +409,7 @@
         }
 
     companion object {
-        /**
-         * To keep destination history saved
-         */
+        /** To keep destination history saved */
         fun <T> saver(
             initialScaffoldDirective: PaneScaffoldDirective,
             initialAdaptStrategies: ThreePaneScaffoldAdaptStrategies,
@@ -426,9 +424,10 @@
                 },
                 restore = {
                     DefaultThreePaneScaffoldNavigator(
-                        initialDestinationHistory = it.fastMap { savedDestination ->
-                            destinationItemSaver.restore(savedDestination!!)!!
-                        },
+                        initialDestinationHistory =
+                            it.fastMap { savedDestination ->
+                                destinationItemSaver.restore(savedDestination!!)!!
+                            },
                         initialScaffoldDirective = initialScaffoldDirective,
                         initialAdaptStrategies = initialAdaptStrategies,
                         initialIsDestinationHistoryAware = initialDestinationHistoryAware
@@ -438,6 +437,7 @@
         }
     }
 }
+
 @OptIn(ExperimentalMaterial3AdaptiveApi::class)
 internal fun <T> destinationItemSaver(): Saver<ThreePaneScaffoldDestinationItem<T>, Any> =
     listSaver(
diff --git a/compose/material3/adaptive/adaptive/src/androidInstrumentedTest/kotlin/androidx/compose/material3/adaptive/CalculatePostureTest.kt b/compose/material3/adaptive/adaptive/src/androidInstrumentedTest/kotlin/androidx/compose/material3/adaptive/CalculatePostureTest.kt
index 2a7c7d3..6e3e679 100644
--- a/compose/material3/adaptive/adaptive/src/androidInstrumentedTest/kotlin/androidx/compose/material3/adaptive/CalculatePostureTest.kt
+++ b/compose/material3/adaptive/adaptive/src/androidInstrumentedTest/kotlin/androidx/compose/material3/adaptive/CalculatePostureTest.kt
@@ -29,60 +29,64 @@
 class CalculatePostureTest {
     @Test
     fun test_calculatePosture_isTableTop_noSeparating() {
-        val posture = calculatePosture(
-            listOf(
-                MockFoldingFeature(
-                    isSeparating = false,
-                    orientation = FoldingFeature.Orientation.HORIZONTAL,
-                    state = FoldingFeature.State.HALF_OPENED
-                ),
+        val posture =
+            calculatePosture(
+                listOf(
+                    MockFoldingFeature(
+                        isSeparating = false,
+                        orientation = FoldingFeature.Orientation.HORIZONTAL,
+                        state = FoldingFeature.State.HALF_OPENED
+                    ),
+                )
             )
-        )
 
         assertThat(posture.isTabletop).isTrue()
     }
 
     @Test
     fun test_calculatePosture_isTableTop_separating() {
-        val posture = calculatePosture(
-            listOf(
-                MockFoldingFeature(
-                    isSeparating = true,
-                    orientation = FoldingFeature.Orientation.HORIZONTAL,
-                    state = FoldingFeature.State.HALF_OPENED
-                ),
+        val posture =
+            calculatePosture(
+                listOf(
+                    MockFoldingFeature(
+                        isSeparating = true,
+                        orientation = FoldingFeature.Orientation.HORIZONTAL,
+                        state = FoldingFeature.State.HALF_OPENED
+                    ),
+                )
             )
-        )
 
         assertThat(posture.isTabletop).isTrue()
     }
 
     @Test
     fun test_calculatePosture_isNotTableTop_verticalHinge() {
-        val posture = calculatePosture(
-            listOf(
-                MockFoldingFeature(
-                    isSeparating = false,
-                    orientation = FoldingFeature.Orientation.VERTICAL,
-                    state = FoldingFeature.State.HALF_OPENED
-                ),
+        val posture =
+            calculatePosture(
+                listOf(
+                    MockFoldingFeature(
+                        isSeparating = false,
+                        orientation = FoldingFeature.Orientation.VERTICAL,
+                        state = FoldingFeature.State.HALF_OPENED
+                    ),
+                )
             )
-        )
 
         assertThat(posture.isTabletop).isFalse()
     }
 
     @Test
     fun test_calculatePosture_isNotTableTop_flat() {
-        val posture = calculatePosture(
-            listOf(
-                MockFoldingFeature(
-                    isSeparating = false,
-                    orientation = FoldingFeature.Orientation.HORIZONTAL,
-                    state = FoldingFeature.State.FLAT
-                ),
+        val posture =
+            calculatePosture(
+                listOf(
+                    MockFoldingFeature(
+                        isSeparating = false,
+                        orientation = FoldingFeature.Orientation.HORIZONTAL,
+                        state = FoldingFeature.State.FLAT
+                    ),
+                )
             )
-        )
 
         assertThat(posture.isTabletop).isFalse()
     }
@@ -92,12 +96,10 @@
         val posture = calculatePosture(allHinges)
 
         assertThat(posture.separatingVerticalHingeBounds.size).isEqualTo(2)
-        assertThat(
-            posture.separatingVerticalHingeBounds[0]
-        ).isEqualTo(mockHingeBounds2.toComposeRect())
-        assertThat(
-            posture.separatingVerticalHingeBounds[1]
-        ).isEqualTo(mockHingeBounds3.toComposeRect())
+        assertThat(posture.separatingVerticalHingeBounds[0])
+            .isEqualTo(mockHingeBounds2.toComposeRect())
+        assertThat(posture.separatingVerticalHingeBounds[1])
+            .isEqualTo(mockHingeBounds3.toComposeRect())
     }
 
     @Test
@@ -105,12 +107,10 @@
         val posture = calculatePosture(allHinges)
 
         assertThat(posture.separatingHorizontalHingeBounds.size).isEqualTo(2)
-        assertThat(
-            posture.separatingHorizontalHingeBounds[0]
-        ).isEqualTo(mockHingeBounds5.toComposeRect())
-        assertThat(
-            posture.separatingHorizontalHingeBounds[1]
-        ).isEqualTo(mockHingeBounds6.toComposeRect())
+        assertThat(posture.separatingHorizontalHingeBounds[0])
+            .isEqualTo(mockHingeBounds5.toComposeRect())
+        assertThat(posture.separatingHorizontalHingeBounds[1])
+            .isEqualTo(mockHingeBounds6.toComposeRect())
     }
 
     @Test
@@ -118,12 +118,10 @@
         val posture = calculatePosture(allHinges)
 
         assertThat(posture.occludingVerticalHingeBounds.size).isEqualTo(2)
-        assertThat(
-            posture.occludingVerticalHingeBounds[0]
-        ).isEqualTo(mockHingeBounds1.toComposeRect())
-        assertThat(
-            posture.occludingVerticalHingeBounds[1]
-        ).isEqualTo(mockHingeBounds2.toComposeRect())
+        assertThat(posture.occludingVerticalHingeBounds[0])
+            .isEqualTo(mockHingeBounds1.toComposeRect())
+        assertThat(posture.occludingVerticalHingeBounds[1])
+            .isEqualTo(mockHingeBounds2.toComposeRect())
     }
 
     @Test
@@ -131,12 +129,10 @@
         val posture = calculatePosture(allHinges)
 
         assertThat(posture.occludingHorizontalHingeBounds.size).isEqualTo(2)
-        assertThat(
-            posture.occludingHorizontalHingeBounds[0]
-        ).isEqualTo(mockHingeBounds4.toComposeRect())
-        assertThat(
-            posture.occludingHorizontalHingeBounds[1]
-        ).isEqualTo(mockHingeBounds5.toComposeRect())
+        assertThat(posture.occludingHorizontalHingeBounds[0])
+            .isEqualTo(mockHingeBounds4.toComposeRect())
+        assertThat(posture.occludingHorizontalHingeBounds[1])
+            .isEqualTo(mockHingeBounds5.toComposeRect())
     }
 
     @Test
@@ -166,41 +162,42 @@
         private val mockHingeBounds4 = Rect(4, 4, 5, 5)
         private val mockHingeBounds5 = Rect(5, 5, 6, 6)
         private val mockHingeBounds6 = Rect(6, 6, 7, 7)
-        private val allHinges = listOf(
-            MockFoldingFeature(
-                isSeparating = false,
-                occlusionType = FoldingFeature.OcclusionType.FULL,
-                bounds = mockHingeBounds1
-            ),
-            MockFoldingFeature(
-                isSeparating = true,
-                occlusionType = FoldingFeature.OcclusionType.FULL,
-                bounds = mockHingeBounds2
-            ),
-            MockFoldingFeature(
-                isSeparating = true,
-                occlusionType = FoldingFeature.OcclusionType.NONE,
-                bounds = mockHingeBounds3
-            ),
-            MockFoldingFeature(
-                isSeparating = false,
-                occlusionType = FoldingFeature.OcclusionType.FULL,
-                orientation = FoldingFeature.Orientation.HORIZONTAL,
-                bounds = mockHingeBounds4
-            ),
-            MockFoldingFeature(
-                isSeparating = true,
-                occlusionType = FoldingFeature.OcclusionType.FULL,
-                orientation = FoldingFeature.Orientation.HORIZONTAL,
-                bounds = mockHingeBounds5
-            ),
-            MockFoldingFeature(
-                isSeparating = true,
-                occlusionType = FoldingFeature.OcclusionType.NONE,
-                orientation = FoldingFeature.Orientation.HORIZONTAL,
-                bounds = mockHingeBounds6
-            ),
-        )
+        private val allHinges =
+            listOf(
+                MockFoldingFeature(
+                    isSeparating = false,
+                    occlusionType = FoldingFeature.OcclusionType.FULL,
+                    bounds = mockHingeBounds1
+                ),
+                MockFoldingFeature(
+                    isSeparating = true,
+                    occlusionType = FoldingFeature.OcclusionType.FULL,
+                    bounds = mockHingeBounds2
+                ),
+                MockFoldingFeature(
+                    isSeparating = true,
+                    occlusionType = FoldingFeature.OcclusionType.NONE,
+                    bounds = mockHingeBounds3
+                ),
+                MockFoldingFeature(
+                    isSeparating = false,
+                    occlusionType = FoldingFeature.OcclusionType.FULL,
+                    orientation = FoldingFeature.Orientation.HORIZONTAL,
+                    bounds = mockHingeBounds4
+                ),
+                MockFoldingFeature(
+                    isSeparating = true,
+                    occlusionType = FoldingFeature.OcclusionType.FULL,
+                    orientation = FoldingFeature.Orientation.HORIZONTAL,
+                    bounds = mockHingeBounds5
+                ),
+                MockFoldingFeature(
+                    isSeparating = true,
+                    occlusionType = FoldingFeature.OcclusionType.NONE,
+                    orientation = FoldingFeature.Orientation.HORIZONTAL,
+                    bounds = mockHingeBounds6
+                ),
+            )
     }
 }
 
diff --git a/compose/material3/adaptive/adaptive/src/androidInstrumentedTest/kotlin/androidx/compose/material3/adaptive/CollectFoldingFeaturesAsStateTest.kt b/compose/material3/adaptive/adaptive/src/androidInstrumentedTest/kotlin/androidx/compose/material3/adaptive/CollectFoldingFeaturesAsStateTest.kt
index 26a5113..65219b0 100644
--- a/compose/material3/adaptive/adaptive/src/androidInstrumentedTest/kotlin/androidx/compose/material3/adaptive/CollectFoldingFeaturesAsStateTest.kt
+++ b/compose/material3/adaptive/adaptive/src/androidInstrumentedTest/kotlin/androidx/compose/material3/adaptive/CollectFoldingFeaturesAsStateTest.kt
@@ -39,8 +39,8 @@
     private val composeRule = createComposeRule()
     private val publisherRule = WindowLayoutInfoPublisherRule()
 
-    @get:Rule
-    val testRule: TestRule
+    @get:Rule val testRule: TestRule
+
     init {
         testRule = RuleChain.outerRule(publisherRule).around(composeRule)
     }
@@ -49,27 +49,19 @@
     fun test_collectFoldingFeatureAsState_returnEmptyListInitially() {
         lateinit var actualFoldingFeatures: State<List<FoldingFeature>>
 
-        composeRule.setContent {
-            actualFoldingFeatures = collectFoldingFeaturesAsState()
-        }
+        composeRule.setContent { actualFoldingFeatures = collectFoldingFeaturesAsState() }
 
-        composeRule.runOnIdle {
-            assertThat(actualFoldingFeatures.value).isEmpty()
-        }
+        composeRule.runOnIdle { assertThat(actualFoldingFeatures.value).isEmpty() }
     }
 
     @Test
     fun test_collectFoldingFeatureAsState_returnCurrentFoldingFeatures() {
         lateinit var actualFoldingFeatures: State<List<FoldingFeature>>
 
-        composeRule.setContent {
-            actualFoldingFeatures = collectFoldingFeaturesAsState()
-        }
+        composeRule.setContent { actualFoldingFeatures = collectFoldingFeaturesAsState() }
 
         publisherRule.overrideWindowLayoutInfo(
-            WindowLayoutInfo(
-                listOf(MockFoldingFeature1, MockFoldingFeature2, MockDisplayFeature)
-            )
+            WindowLayoutInfo(listOf(MockFoldingFeature1, MockFoldingFeature2, MockDisplayFeature))
         )
 
         composeRule.runOnIdle {
@@ -80,16 +72,11 @@
     }
 
     companion object {
-        val MockFoldingFeature1 = FoldingFeature(
-            windowBounds = Rect(0, 0, 1024, 800),
-            size = 1
-        )
-        val MockFoldingFeature2 = FoldingFeature(
-            windowBounds = Rect(0, 0, 1024, 800),
-            size = 0
-        )
-        val MockDisplayFeature = object : DisplayFeature {
-            override val bounds = Rect(10, 10, 12, 12)
-        }
+        val MockFoldingFeature1 = FoldingFeature(windowBounds = Rect(0, 0, 1024, 800), size = 1)
+        val MockFoldingFeature2 = FoldingFeature(windowBounds = Rect(0, 0, 1024, 800), size = 0)
+        val MockDisplayFeature =
+            object : DisplayFeature {
+                override val bounds = Rect(10, 10, 12, 12)
+            }
     }
 }
diff --git a/compose/material3/adaptive/adaptive/src/androidInstrumentedTest/kotlin/androidx/compose/material3/adaptive/CollectWindowSizeAsStateTest.kt b/compose/material3/adaptive/adaptive/src/androidInstrumentedTest/kotlin/androidx/compose/material3/adaptive/CollectWindowSizeAsStateTest.kt
index 4a62e9d..18b0996 100644
--- a/compose/material3/adaptive/adaptive/src/androidInstrumentedTest/kotlin/androidx/compose/material3/adaptive/CollectWindowSizeAsStateTest.kt
+++ b/compose/material3/adaptive/adaptive/src/androidInstrumentedTest/kotlin/androidx/compose/material3/adaptive/CollectWindowSizeAsStateTest.kt
@@ -40,8 +40,7 @@
 @SmallTest
 @RunWith(AndroidJUnit4::class)
 class CollectWindowSizeAsStateTest {
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
     @Test
     fun test_collectWindowSizeAsState() {
@@ -61,15 +60,11 @@
             }
         }
 
-        rule.runOnIdle {
-            assertThat(actualWindowSize).isEqualTo(MockWindowSize1)
-        }
+        rule.runOnIdle { assertThat(actualWindowSize).isEqualTo(MockWindowSize1) }
 
         mockWindowSize.value = MockWindowSize2
 
-        rule.runOnIdle {
-            assertThat(actualWindowSize).isEqualTo(MockWindowSize2)
-        }
+        rule.runOnIdle { assertThat(actualWindowSize).isEqualTo(MockWindowSize2) }
     }
 
     companion object {
@@ -78,21 +73,17 @@
     }
 }
 
-internal class MockWindowMetricsCalculatorDecorator(
-    private val mockWindowSize: State<IntSize>
-) : WindowMetricsCalculatorDecorator {
+internal class MockWindowMetricsCalculatorDecorator(private val mockWindowSize: State<IntSize>) :
+    WindowMetricsCalculatorDecorator {
     override fun decorate(calculator: WindowMetricsCalculator): WindowMetricsCalculator {
         return MockWindowMetricsCalculator(mockWindowSize)
     }
 }
 
-internal class MockWindowMetricsCalculator(
-    private val mockWindowSize: State<IntSize>
-) : WindowMetricsCalculator {
+internal class MockWindowMetricsCalculator(private val mockWindowSize: State<IntSize>) :
+    WindowMetricsCalculator {
     override fun computeCurrentWindowMetrics(activity: Activity): WindowMetrics {
-        return WindowMetrics(
-            Rect(0, 0, mockWindowSize.value.width, mockWindowSize.value.height)
-        )
+        return WindowMetrics(Rect(0, 0, mockWindowSize.value.width, mockWindowSize.value.height))
     }
 
     override fun computeMaximumWindowMetrics(activity: Activity): WindowMetrics {
@@ -100,8 +91,6 @@
     }
 
     override fun computeCurrentWindowMetrics(@UiContext context: Context): WindowMetrics {
-        return WindowMetrics(
-            Rect(0, 0, mockWindowSize.value.width, mockWindowSize.value.height)
-        )
+        return WindowMetrics(Rect(0, 0, mockWindowSize.value.width, mockWindowSize.value.height))
     }
 }
diff --git a/compose/material3/adaptive/adaptive/src/androidInstrumentedTest/kotlin/androidx/compose/material3/adaptive/CurrentWindowAdaptiveInfoTest.kt b/compose/material3/adaptive/adaptive/src/androidInstrumentedTest/kotlin/androidx/compose/material3/adaptive/CurrentWindowAdaptiveInfoTest.kt
index ba9816d..8ef9012 100644
--- a/compose/material3/adaptive/adaptive/src/androidInstrumentedTest/kotlin/androidx/compose/material3/adaptive/CurrentWindowAdaptiveInfoTest.kt
+++ b/compose/material3/adaptive/adaptive/src/androidInstrumentedTest/kotlin/androidx/compose/material3/adaptive/CurrentWindowAdaptiveInfoTest.kt
@@ -46,8 +46,8 @@
     private val composeRule = createComposeRule()
     private val layoutInfoRule = WindowLayoutInfoPublisherRule()
 
-    @get:Rule
-    val testRule: TestRule
+    @get:Rule val testRule: TestRule
+
     init {
         testRule = RuleChain.outerRule(layoutInfoRule).around(composeRule)
     }
@@ -72,50 +72,44 @@
             }
         }
 
-        layoutInfoRule.overrideWindowLayoutInfo(
-            WindowLayoutInfo(MockFoldingFeatures1)
-        )
+        layoutInfoRule.overrideWindowLayoutInfo(WindowLayoutInfo(MockFoldingFeatures1))
 
         composeRule.runOnIdle {
             val mockSize = with(MockDensity) { MockWindowSize1.toSize().toDpSize() }
-            assertThat(actualAdaptiveInfo.windowSizeClass).isEqualTo(
-                WindowSizeClass.compute(mockSize.width.value, mockSize.height.value)
-            )
-            assertThat(actualAdaptiveInfo.windowPosture).isEqualTo(
-                calculatePosture(MockFoldingFeatures1)
-            )
+            assertThat(actualAdaptiveInfo.windowSizeClass)
+                .isEqualTo(WindowSizeClass.compute(mockSize.width.value, mockSize.height.value))
+            assertThat(actualAdaptiveInfo.windowPosture)
+                .isEqualTo(calculatePosture(MockFoldingFeatures1))
         }
 
-        layoutInfoRule.overrideWindowLayoutInfo(
-            WindowLayoutInfo(MockFoldingFeatures2)
-        )
+        layoutInfoRule.overrideWindowLayoutInfo(WindowLayoutInfo(MockFoldingFeatures2))
         mockWindowSize.value = MockWindowSize2
 
         composeRule.runOnIdle {
             val mockSize = with(MockDensity) { MockWindowSize2.toSize().toDpSize() }
-            assertThat(actualAdaptiveInfo.windowSizeClass).isEqualTo(
-                WindowSizeClass.compute(mockSize.width.value, mockSize.height.value)
-            )
-            assertThat(actualAdaptiveInfo.windowPosture).isEqualTo(
-                calculatePosture(MockFoldingFeatures2)
-            )
+            assertThat(actualAdaptiveInfo.windowSizeClass)
+                .isEqualTo(WindowSizeClass.compute(mockSize.width.value, mockSize.height.value))
+            assertThat(actualAdaptiveInfo.windowPosture)
+                .isEqualTo(calculatePosture(MockFoldingFeatures2))
         }
     }
 
     companion object {
-        private val MockFoldingFeatures1 = listOf(
-            MockFoldingFeature(orientation = FoldingFeature.Orientation.HORIZONTAL),
-            MockFoldingFeature(orientation = FoldingFeature.Orientation.VERTICAL),
-            MockFoldingFeature(orientation = FoldingFeature.Orientation.HORIZONTAL)
-        )
+        private val MockFoldingFeatures1 =
+            listOf(
+                MockFoldingFeature(orientation = FoldingFeature.Orientation.HORIZONTAL),
+                MockFoldingFeature(orientation = FoldingFeature.Orientation.VERTICAL),
+                MockFoldingFeature(orientation = FoldingFeature.Orientation.HORIZONTAL)
+            )
 
-        private val MockFoldingFeatures2 = listOf(
-            MockFoldingFeature(
-                isSeparating = false,
-                orientation = FoldingFeature.Orientation.HORIZONTAL,
-                state = FoldingFeature.State.FLAT
-            ),
-        )
+        private val MockFoldingFeatures2 =
+            listOf(
+                MockFoldingFeature(
+                    isSeparating = false,
+                    orientation = FoldingFeature.Orientation.HORIZONTAL,
+                    state = FoldingFeature.State.FLAT
+                ),
+            )
 
         private val MockWindowSize1 = IntSize(400, 800)
         private val MockWindowSize2 = IntSize(800, 400)
diff --git a/compose/material3/adaptive/adaptive/src/androidMain/kotlin/androidx/compose/material3/adaptive/AndroidPosture.android.kt b/compose/material3/adaptive/adaptive/src/androidMain/kotlin/androidx/compose/material3/adaptive/AndroidPosture.android.kt
index 7907e41..60b16e60 100644
--- a/compose/material3/adaptive/adaptive/src/androidMain/kotlin/androidx/compose/material3/adaptive/AndroidPosture.android.kt
+++ b/compose/material3/adaptive/adaptive/src/androidMain/kotlin/androidx/compose/material3/adaptive/AndroidPosture.android.kt
@@ -29,17 +29,21 @@
     val hingeList = mutableListOf<HingeInfo>()
     @Suppress("ListIterator")
     foldingFeatures.forEach {
-        if (it.orientation == FoldingFeature.Orientation.HORIZONTAL &&
-            it.state == FoldingFeature.State.HALF_OPENED) {
+        if (
+            it.orientation == FoldingFeature.Orientation.HORIZONTAL &&
+                it.state == FoldingFeature.State.HALF_OPENED
+        ) {
             isTableTop = true
         }
-        hingeList.add(HingeInfo(
-            bounds = it.bounds.toComposeRect(),
-            isFlat = it.state == FoldingFeature.State.FLAT,
-            isVertical = it.orientation == FoldingFeature.Orientation.VERTICAL,
-            isSeparating = it.isSeparating,
-            isOccluding = it.occlusionType == FoldingFeature.OcclusionType.FULL
-        ))
+        hingeList.add(
+            HingeInfo(
+                bounds = it.bounds.toComposeRect(),
+                isFlat = it.state == FoldingFeature.State.FLAT,
+                isVertical = it.orientation == FoldingFeature.Orientation.VERTICAL,
+                isSeparating = it.isSeparating,
+                isOccluding = it.occlusionType == FoldingFeature.OcclusionType.FULL
+            )
+        )
     }
     return Posture(isTableTop, hingeList)
 }
diff --git a/compose/material3/adaptive/adaptive/src/androidMain/kotlin/androidx/compose/material3/adaptive/AndroidWindowAdaptiveInfo.android.kt b/compose/material3/adaptive/adaptive/src/androidMain/kotlin/androidx/compose/material3/adaptive/AndroidWindowAdaptiveInfo.android.kt
index 0a1ef44..9781752 100644
--- a/compose/material3/adaptive/adaptive/src/androidMain/kotlin/androidx/compose/material3/adaptive/AndroidWindowAdaptiveInfo.android.kt
+++ b/compose/material3/adaptive/adaptive/src/androidMain/kotlin/androidx/compose/material3/adaptive/AndroidWindowAdaptiveInfo.android.kt
@@ -34,9 +34,7 @@
 @OptIn(ExperimentalMaterial3AdaptiveApi::class)
 @Composable
 actual fun currentWindowAdaptiveInfo(): WindowAdaptiveInfo {
-    val windowSize = with(LocalDensity.current) {
-        currentWindowSize().toSize().toDpSize()
-    }
+    val windowSize = with(LocalDensity.current) { currentWindowSize().toSize().toDpSize() }
     return WindowAdaptiveInfo(
         WindowSizeClass.compute(windowSize.width.value, windowSize.height.value),
         calculatePosture(collectFoldingFeaturesAsState().value)
@@ -56,11 +54,10 @@
     // ComposeView's configuration changes.
     LocalConfiguration.current
     val windowBounds =
-        WindowMetricsCalculator
-            .getOrCreate()
+        WindowMetricsCalculator.getOrCreate()
             .computeCurrentWindowMetrics(LocalContext.current)
             .bounds
-   return IntSize(windowBounds.width(), windowBounds.height())
+    return IntSize(windowBounds.width(), windowBounds.height())
 }
 
 /**
@@ -72,9 +69,9 @@
 fun collectFoldingFeaturesAsState(): State<List<FoldingFeature>> {
     val context = LocalContext.current
     return remember(context) {
-        WindowInfoTracker
-            .getOrCreate(context)
-            .windowLayoutInfo(context)
-            .map { it.displayFeatures.filterIsInstance<FoldingFeature>() }
-    }.collectAsState(emptyList())
+            WindowInfoTracker.getOrCreate(context).windowLayoutInfo(context).map {
+                it.displayFeatures.filterIsInstance<FoldingFeature>()
+            }
+        }
+        .collectAsState(emptyList())
 }
diff --git a/compose/material3/adaptive/adaptive/src/commonMain/kotlin/androidx/compose/material3/adaptive/Posture.kt b/compose/material3/adaptive/adaptive/src/commonMain/kotlin/androidx/compose/material3/adaptive/Posture.kt
index 349405b..578ec05 100644
--- a/compose/material3/adaptive/adaptive/src/commonMain/kotlin/androidx/compose/material3/adaptive/Posture.kt
+++ b/compose/material3/adaptive/adaptive/src/commonMain/kotlin/androidx/compose/material3/adaptive/Posture.kt
@@ -31,17 +31,14 @@
  *
  * @constructor create an instance of [Posture]
  * @property isTabletop `true` if the current window is considered as in the table top mode, i.e.
- *           there is one half-opened horizontal hinge in the middle of the current window. When
- *           this is `true` it usually means it's hard for users to interact with the window area
- *           around the hinge and developers may consider separating the layout along the hinge and
- *           show software keyboard or other controls in the bottom half of the window.
+ *   there is one half-opened horizontal hinge in the middle of the current window. When this is
+ *   `true` it usually means it's hard for users to interact with the window area around the hinge
+ *   and developers may consider separating the layout along the hinge and show software keyboard or
+ *   other controls in the bottom half of the window.
  * @property hingeList a list of all hinges that are relevant to the posture.
  */
 @Immutable
-class Posture(
-    val isTabletop: Boolean = false,
-    val hingeList: List<HingeInfo> = emptyList()
-) {
+class Posture(val isTabletop: Boolean = false, val hingeList: List<HingeInfo> = emptyList()) {
     override fun equals(other: Any?): Boolean {
         if (this === other) return true
         if (other !is Posture) return false
@@ -58,41 +55,31 @@
 
     override fun toString(): String {
         @Suppress("ListIterator")
-        return "Posture(isTabletop=$isTabletop, " +
-            "hinges=[${hingeList.joinToString(", ")}])"
+        return "Posture(isTabletop=$isTabletop, " + "hinges=[${hingeList.joinToString(", ")}])"
     }
 }
 
-/**
- * Returns the list of vertical hinge bounds that are separating.
- */
-val Posture.separatingVerticalHingeBounds get() = hingeList.getBounds { isVertical && isSeparating }
+/** Returns the list of vertical hinge bounds that are separating. */
+val Posture.separatingVerticalHingeBounds
+    get() = hingeList.getBounds { isVertical && isSeparating }
 
-/**
- *  Returns the list of vertical hinge bounds that are occluding.
- */
-val Posture.occludingVerticalHingeBounds get() = hingeList.getBounds { isVertical && isOccluding }
+/** Returns the list of vertical hinge bounds that are occluding. */
+val Posture.occludingVerticalHingeBounds
+    get() = hingeList.getBounds { isVertical && isOccluding }
 
-/**
- *  Returns the list of all vertical hinge bounds.
- */
-val Posture.allVerticalHingeBounds get() = hingeList.getBounds { isVertical }
+/** Returns the list of all vertical hinge bounds. */
+val Posture.allVerticalHingeBounds
+    get() = hingeList.getBounds { isVertical }
 
-/**
- * Returns the list of horizontal hinge bounds that are separating.
- */
+/** Returns the list of horizontal hinge bounds that are separating. */
 val Posture.separatingHorizontalHingeBounds
     get() = hingeList.getBounds { !isVertical && isSeparating }
 
-/**
- * Returns the list of horizontal hinge bounds that are occluding.
- */
+/** Returns the list of horizontal hinge bounds that are occluding. */
 val Posture.occludingHorizontalHingeBounds
     get() = hingeList.getBounds { !isVertical && isOccluding }
 
-/**
- *  Returns the list of all horizontal hinge bounds.
- */
+/** Returns the list of all horizontal hinge bounds. */
 val Posture.allHorizontalHingeBounds
     get() = hingeList.getBounds { !isVertical }
 
@@ -101,10 +88,10 @@
  *
  * @param bounds the bounds of the hinge in the relevant viewport.
  * @param isFlat `true` if the hinge is fully open and the relevant window space presented to the
- *        user is flat.
+ *   user is flat.
  * @param isVertical `true` if the hinge is a vertical one, i.e., it separates the viewport into
- *        left and right; `false` if the hinge is horizontal, i.e., it separates the viewport
- *        into top and bottom.
+ *   left and right; `false` if the hinge is horizontal, i.e., it separates the viewport into top
+ *   and bottom.
  * @param isSeparating `true` if the hinge creates two logical display areas.
  * @param isOccluding `true` if the hinge conceals part of the display.
  */
@@ -146,5 +133,4 @@
 }
 
 private inline fun List<HingeInfo>.getBounds(predicate: HingeInfo.() -> Boolean): List<Rect> =
-    @Suppress("ListIterator")
-    mapNotNull { if (it.predicate()) it.bounds else null }
+    @Suppress("ListIterator") mapNotNull { if (it.predicate()) it.bounds else null }
diff --git a/compose/material3/adaptive/adaptive/src/commonMain/kotlin/androidx/compose/material3/adaptive/WindowAdaptiveInfo.kt b/compose/material3/adaptive/adaptive/src/commonMain/kotlin/androidx/compose/material3/adaptive/WindowAdaptiveInfo.kt
index 348d9ea..d999fbc 100644
--- a/compose/material3/adaptive/adaptive/src/commonMain/kotlin/androidx/compose/material3/adaptive/WindowAdaptiveInfo.kt
+++ b/compose/material3/adaptive/adaptive/src/commonMain/kotlin/androidx/compose/material3/adaptive/WindowAdaptiveInfo.kt
@@ -27,22 +27,18 @@
  *
  * @return [WindowAdaptiveInfo] of the provided context
  */
-@Composable
-expect fun currentWindowAdaptiveInfo(): WindowAdaptiveInfo
+@Composable expect fun currentWindowAdaptiveInfo(): WindowAdaptiveInfo
 
 /**
  * This class collects window info that affects adaptation decisions. An adaptive layout is supposed
  * to use the info from this class to decide how the layout is supposed to be adapted.
  *
- * @constructor create an instance of [WindowAdaptiveInfo]
  * @param windowSizeClass [WindowSizeClass] of the current window.
  * @param windowPosture [Posture] of the current window.
+ * @constructor create an instance of [WindowAdaptiveInfo]
  */
 @Immutable
-class WindowAdaptiveInfo(
-    val windowSizeClass: WindowSizeClass,
-    val windowPosture: Posture
-) {
+class WindowAdaptiveInfo(val windowSizeClass: WindowSizeClass, val windowPosture: Posture) {
     override fun equals(other: Any?): Boolean {
         if (this === other) return true
         if (other !is WindowAdaptiveInfo) return false
diff --git a/compose/material3/adaptive/benchmark/src/androidTest/java/androidx/compose/material3/adaptive/benchmark/ListDetailPaneScaffoldBenchmark.kt b/compose/material3/adaptive/benchmark/src/androidTest/java/androidx/compose/material3/adaptive/benchmark/ListDetailPaneScaffoldBenchmark.kt
index 3bbf956..90d11ef 100644
--- a/compose/material3/adaptive/benchmark/src/androidTest/java/androidx/compose/material3/adaptive/benchmark/ListDetailPaneScaffoldBenchmark.kt
+++ b/compose/material3/adaptive/benchmark/src/androidTest/java/androidx/compose/material3/adaptive/benchmark/ListDetailPaneScaffoldBenchmark.kt
@@ -36,8 +36,7 @@
 
 @OptIn(ExperimentalMaterial3AdaptiveApi::class)
 class ListDetailPaneScaffoldBenchmark {
-    @get:Rule
-    val benchmarkRule = ComposeBenchmarkRule()
+    @get:Rule val benchmarkRule = ComposeBenchmarkRule()
 
     @Test
     fun singlePane_firstPixel() {
@@ -51,9 +50,7 @@
     @Test
     fun dualPane_firstPixel() {
         benchmarkRule.benchmarkToFirstPixel {
-            ListDetailPaneScaffoldTestCase().apply {
-                currentScaffoldDirective = dualPaneDirective
-            }
+            ListDetailPaneScaffoldTestCase().apply { currentScaffoldDirective = dualPaneDirective }
         }
     }
 
@@ -69,9 +66,7 @@
     @Test
     fun dualPane_firstCompose() {
         benchmarkRule.benchmarkFirstCompose {
-            ListDetailPaneScaffoldTestCase().apply {
-                currentScaffoldDirective = dualPaneDirective
-            }
+            ListDetailPaneScaffoldTestCase().apply { currentScaffoldDirective = dualPaneDirective }
         }
     }
 
@@ -80,18 +75,17 @@
         benchmarkRule.toggleStateBenchmarkComposeMeasureLayout(
             {
                 object : ListDetailPaneScaffoldTestCase() {
-                    override fun toggleState() {
-                        val newPane =
-                            if (currentDestination.pane == ListDetailPaneScaffoldRole.List) {
-                                ListDetailPaneScaffoldRole.Detail
-                            } else {
-                                ListDetailPaneScaffoldRole.List
-                            }
-                        currentDestination = ThreePaneScaffoldDestinationItem(newPane, 0)
+                        override fun toggleState() {
+                            val newPane =
+                                if (currentDestination.pane == ListDetailPaneScaffoldRole.List) {
+                                    ListDetailPaneScaffoldRole.Detail
+                                } else {
+                                    ListDetailPaneScaffoldRole.List
+                                }
+                            currentDestination = ThreePaneScaffoldDestinationItem(newPane, 0)
+                        }
                     }
-                }.apply {
-                    currentScaffoldDirective = singlePaneDirective
-                }
+                    .apply { currentScaffoldDirective = singlePaneDirective }
             },
             // For skipping state transitions
             assertOneRecomposition = false
@@ -103,18 +97,17 @@
         benchmarkRule.toggleStateBenchmarkComposeMeasureLayout(
             {
                 object : ListDetailPaneScaffoldTestCase() {
-                    override fun toggleState() {
-                        val newPane =
-                            if (currentDestination.pane == ListDetailPaneScaffoldRole.List) {
-                                ListDetailPaneScaffoldRole.Extra
-                            } else {
-                                ListDetailPaneScaffoldRole.List
-                            }
-                        currentDestination = ThreePaneScaffoldDestinationItem(newPane, 0)
+                        override fun toggleState() {
+                            val newPane =
+                                if (currentDestination.pane == ListDetailPaneScaffoldRole.List) {
+                                    ListDetailPaneScaffoldRole.Extra
+                                } else {
+                                    ListDetailPaneScaffoldRole.List
+                                }
+                            currentDestination = ThreePaneScaffoldDestinationItem(newPane, 0)
+                        }
                     }
-                }.apply {
-                    currentScaffoldDirective = dualPaneDirective
-                }
+                    .apply { currentScaffoldDirective = dualPaneDirective }
             },
             // For skipping state transitions
             assertOneRecomposition = false
@@ -126,18 +119,17 @@
         benchmarkRule.toggleStateBenchmarkComposeMeasureLayout(
             {
                 object : ListDetailPaneScaffoldTestCase(animated = true) {
-                    override fun toggleState() {
-                        val newPane =
-                            if (currentDestination.pane == ListDetailPaneScaffoldRole.List) {
-                                ListDetailPaneScaffoldRole.Detail
-                            } else {
-                                ListDetailPaneScaffoldRole.List
-                            }
-                        currentDestination = ThreePaneScaffoldDestinationItem(newPane, 0)
+                        override fun toggleState() {
+                            val newPane =
+                                if (currentDestination.pane == ListDetailPaneScaffoldRole.List) {
+                                    ListDetailPaneScaffoldRole.Detail
+                                } else {
+                                    ListDetailPaneScaffoldRole.List
+                                }
+                            currentDestination = ThreePaneScaffoldDestinationItem(newPane, 0)
+                        }
                     }
-                }.apply {
-                    currentScaffoldDirective = singlePaneDirective
-                }
+                    .apply { currentScaffoldDirective = singlePaneDirective }
             },
             // For skipping animations
             assertOneRecomposition = false
@@ -149,18 +141,17 @@
         benchmarkRule.toggleStateBenchmarkComposeMeasureLayout(
             {
                 object : ListDetailPaneScaffoldTestCase(animated = true) {
-                    override fun toggleState() {
-                        val newPane =
-                            if (currentDestination.pane == ListDetailPaneScaffoldRole.List) {
-                                ListDetailPaneScaffoldRole.Extra
-                            } else {
-                                ListDetailPaneScaffoldRole.List
-                            }
-                        currentDestination = ThreePaneScaffoldDestinationItem(newPane, 0)
+                        override fun toggleState() {
+                            val newPane =
+                                if (currentDestination.pane == ListDetailPaneScaffoldRole.List) {
+                                    ListDetailPaneScaffoldRole.Extra
+                                } else {
+                                    ListDetailPaneScaffoldRole.List
+                                }
+                            currentDestination = ThreePaneScaffoldDestinationItem(newPane, 0)
+                        }
                     }
-                }.apply {
-                    currentScaffoldDirective = dualPaneDirective
-                }
+                    .apply { currentScaffoldDirective = dualPaneDirective }
             },
             // For skipping animations
             assertOneRecomposition = false
@@ -169,22 +160,21 @@
 }
 
 @OptIn(ExperimentalMaterial3AdaptiveApi::class)
-internal open class ListDetailPaneScaffoldTestCase(
-    animated: Boolean = false
-) : ThreePaneScaffoldTestCase(animated) {
-    override var currentDestination by mutableStateOf(
-        ThreePaneScaffoldDestinationItem(ListDetailPaneScaffoldRole.List, 0)
-    )
+internal open class ListDetailPaneScaffoldTestCase(animated: Boolean = false) :
+    ThreePaneScaffoldTestCase(animated) {
+    override var currentDestination by
+        mutableStateOf(ThreePaneScaffoldDestinationItem(ListDetailPaneScaffoldRole.List, 0))
 
     @Composable
     override fun MeasuredContent() {
         ListDetailPaneScaffold(
             directive = currentScaffoldDirective,
-            value = calculateThreePaneScaffoldValue(
-                maxHorizontalPartitions = currentScaffoldDirective.maxHorizontalPartitions,
-                adaptStrategies = ListDetailPaneScaffoldDefaults.adaptStrategies(),
-                currentDestination = currentDestination
-            ),
+            value =
+                calculateThreePaneScaffoldValue(
+                    maxHorizontalPartitions = currentScaffoldDirective.maxHorizontalPartitions,
+                    adaptStrategies = ListDetailPaneScaffoldDefaults.adaptStrategies(),
+                    currentDestination = currentDestination
+                ),
             listPane = { TestPane(Color.Red) },
             detailPane = { TestPane(Color.Yellow) },
             extraPane = { TestPane(Color.Blue) }
diff --git a/compose/material3/adaptive/benchmark/src/androidTest/java/androidx/compose/material3/adaptive/benchmark/SupportingPaneScaffoldBenchmark.kt b/compose/material3/adaptive/benchmark/src/androidTest/java/androidx/compose/material3/adaptive/benchmark/SupportingPaneScaffoldBenchmark.kt
index b482b55..da2190a 100644
--- a/compose/material3/adaptive/benchmark/src/androidTest/java/androidx/compose/material3/adaptive/benchmark/SupportingPaneScaffoldBenchmark.kt
+++ b/compose/material3/adaptive/benchmark/src/androidTest/java/androidx/compose/material3/adaptive/benchmark/SupportingPaneScaffoldBenchmark.kt
@@ -36,8 +36,7 @@
 
 @OptIn(ExperimentalMaterial3AdaptiveApi::class)
 class SupportingPaneScaffoldBenchmark {
-    @get:Rule
-    val benchmarkRule = ComposeBenchmarkRule()
+    @get:Rule val benchmarkRule = ComposeBenchmarkRule()
 
     @Test
     fun singlePane_firstPixel() {
@@ -51,9 +50,7 @@
     @Test
     fun dualPane_firstPixel() {
         benchmarkRule.benchmarkToFirstPixel {
-            SupportingPaneScaffoldTestCase().apply {
-                currentScaffoldDirective = dualPaneDirective
-            }
+            SupportingPaneScaffoldTestCase().apply { currentScaffoldDirective = dualPaneDirective }
         }
     }
 
@@ -69,9 +66,7 @@
     @Test
     fun dualPane_firstCompose() {
         benchmarkRule.benchmarkFirstCompose {
-            SupportingPaneScaffoldTestCase().apply {
-                currentScaffoldDirective = dualPaneDirective
-            }
+            SupportingPaneScaffoldTestCase().apply { currentScaffoldDirective = dualPaneDirective }
         }
     }
 
@@ -80,18 +75,17 @@
         benchmarkRule.toggleStateBenchmarkComposeMeasureLayout(
             {
                 object : SupportingPaneScaffoldTestCase() {
-                    override fun toggleState() {
-                        val newPane =
-                            if (currentDestination.pane == SupportingPaneScaffoldRole.Main) {
-                                SupportingPaneScaffoldRole.Supporting
-                            } else {
-                                SupportingPaneScaffoldRole.Main
-                            }
-                        currentDestination = ThreePaneScaffoldDestinationItem(newPane, 0)
+                        override fun toggleState() {
+                            val newPane =
+                                if (currentDestination.pane == SupportingPaneScaffoldRole.Main) {
+                                    SupportingPaneScaffoldRole.Supporting
+                                } else {
+                                    SupportingPaneScaffoldRole.Main
+                                }
+                            currentDestination = ThreePaneScaffoldDestinationItem(newPane, 0)
+                        }
                     }
-                }.apply {
-                    currentScaffoldDirective = singlePaneDirective
-                }
+                    .apply { currentScaffoldDirective = singlePaneDirective }
             },
             // For skipping state transitions
             assertOneRecomposition = false
@@ -103,18 +97,17 @@
         benchmarkRule.toggleStateBenchmarkComposeMeasureLayout(
             {
                 object : SupportingPaneScaffoldTestCase() {
-                    override fun toggleState() {
-                        val newPane =
-                            if (currentDestination.pane == SupportingPaneScaffoldRole.Main) {
-                                SupportingPaneScaffoldRole.Extra
-                            } else {
-                                SupportingPaneScaffoldRole.Main
-                            }
-                        currentDestination = ThreePaneScaffoldDestinationItem(newPane, 0)
+                        override fun toggleState() {
+                            val newPane =
+                                if (currentDestination.pane == SupportingPaneScaffoldRole.Main) {
+                                    SupportingPaneScaffoldRole.Extra
+                                } else {
+                                    SupportingPaneScaffoldRole.Main
+                                }
+                            currentDestination = ThreePaneScaffoldDestinationItem(newPane, 0)
+                        }
                     }
-                }.apply {
-                    currentScaffoldDirective = dualPaneDirective
-                }
+                    .apply { currentScaffoldDirective = dualPaneDirective }
             },
             // For skipping state transitions
             assertOneRecomposition = false
@@ -126,18 +119,17 @@
         benchmarkRule.toggleStateBenchmarkComposeMeasureLayout(
             {
                 object : SupportingPaneScaffoldTestCase(animated = true) {
-                    override fun toggleState() {
-                        val newPane =
-                            if (currentDestination.pane == SupportingPaneScaffoldRole.Main) {
-                                SupportingPaneScaffoldRole.Supporting
-                            } else {
-                                SupportingPaneScaffoldRole.Main
-                            }
-                        currentDestination = ThreePaneScaffoldDestinationItem(newPane, 0)
+                        override fun toggleState() {
+                            val newPane =
+                                if (currentDestination.pane == SupportingPaneScaffoldRole.Main) {
+                                    SupportingPaneScaffoldRole.Supporting
+                                } else {
+                                    SupportingPaneScaffoldRole.Main
+                                }
+                            currentDestination = ThreePaneScaffoldDestinationItem(newPane, 0)
+                        }
                     }
-                }.apply {
-                    currentScaffoldDirective = singlePaneDirective
-                }
+                    .apply { currentScaffoldDirective = singlePaneDirective }
             },
             // For skipping animations
             assertOneRecomposition = false
@@ -149,18 +141,17 @@
         benchmarkRule.toggleStateBenchmarkComposeMeasureLayout(
             {
                 object : SupportingPaneScaffoldTestCase(animated = true) {
-                    override fun toggleState() {
-                        val newPane =
-                            if (currentDestination.pane == SupportingPaneScaffoldRole.Main) {
-                                SupportingPaneScaffoldRole.Extra
-                            } else {
-                                SupportingPaneScaffoldRole.Main
-                            }
-                        currentDestination = ThreePaneScaffoldDestinationItem(newPane, 0)
+                        override fun toggleState() {
+                            val newPane =
+                                if (currentDestination.pane == SupportingPaneScaffoldRole.Main) {
+                                    SupportingPaneScaffoldRole.Extra
+                                } else {
+                                    SupportingPaneScaffoldRole.Main
+                                }
+                            currentDestination = ThreePaneScaffoldDestinationItem(newPane, 0)
+                        }
                     }
-                }.apply {
-                    currentScaffoldDirective = dualPaneDirective
-                }
+                    .apply { currentScaffoldDirective = dualPaneDirective }
             },
             // For skipping animations
             assertOneRecomposition = false
@@ -169,22 +160,21 @@
 }
 
 @OptIn(ExperimentalMaterial3AdaptiveApi::class)
-internal open class SupportingPaneScaffoldTestCase(
-    animated: Boolean = false
-) : ThreePaneScaffoldTestCase(animated) {
-    override var currentDestination by mutableStateOf(
-        ThreePaneScaffoldDestinationItem(SupportingPaneScaffoldRole.Main, 0)
-    )
+internal open class SupportingPaneScaffoldTestCase(animated: Boolean = false) :
+    ThreePaneScaffoldTestCase(animated) {
+    override var currentDestination by
+        mutableStateOf(ThreePaneScaffoldDestinationItem(SupportingPaneScaffoldRole.Main, 0))
 
     @Composable
     override fun MeasuredContent() {
         SupportingPaneScaffold(
             directive = currentScaffoldDirective,
-            value = calculateThreePaneScaffoldValue(
-                maxHorizontalPartitions = currentScaffoldDirective.maxHorizontalPartitions,
-                adaptStrategies = ListDetailPaneScaffoldDefaults.adaptStrategies(),
-                currentDestination = currentDestination
-            ),
+            value =
+                calculateThreePaneScaffoldValue(
+                    maxHorizontalPartitions = currentScaffoldDirective.maxHorizontalPartitions,
+                    adaptStrategies = ListDetailPaneScaffoldDefaults.adaptStrategies(),
+                    currentDestination = currentDestination
+                ),
             mainPane = { TestPane(Color.Yellow) },
             supportingPane = { TestPane(Color.Red) },
             extraPane = { TestPane(Color.Blue) }
diff --git a/compose/material3/adaptive/benchmark/src/androidTest/java/androidx/compose/material3/adaptive/benchmark/TestUtils.kt b/compose/material3/adaptive/benchmark/src/androidTest/java/androidx/compose/material3/adaptive/benchmark/TestUtils.kt
index 217aa37..246ccc2 100644
--- a/compose/material3/adaptive/benchmark/src/androidTest/java/androidx/compose/material3/adaptive/benchmark/TestUtils.kt
+++ b/compose/material3/adaptive/benchmark/src/androidTest/java/androidx/compose/material3/adaptive/benchmark/TestUtils.kt
@@ -36,15 +36,15 @@
 
 val singlePaneDirective = PaneScaffoldDirective.Default
 
-val dualPaneDirective = PaneScaffoldDirective.Default.copy(
-    maxHorizontalPartitions = 2,
-    horizontalPartitionSpacerSize = 24.dp,
-)
+val dualPaneDirective =
+    PaneScaffoldDirective.Default.copy(
+        maxHorizontalPartitions = 2,
+        horizontalPartitionSpacerSize = 24.dp,
+    )
 
 @OptIn(ExperimentalMaterial3AdaptiveApi::class)
-internal abstract class ThreePaneScaffoldTestCase(
-    private val animated: Boolean
-) : LayeredComposeTestCase(), ToggleableTestCase {
+internal abstract class ThreePaneScaffoldTestCase(private val animated: Boolean) :
+    LayeredComposeTestCase(), ToggleableTestCase {
     var currentScaffoldDirective by mutableStateOf(singlePaneDirective)
     abstract var currentDestination: ThreePaneScaffoldDestinationItem<Int>
 
@@ -52,13 +52,9 @@
 
     @Composable
     fun ThreePaneScaffoldScope.TestPane(color: Color) {
-        val content = @Composable {
-            Box(modifier = Modifier.fillMaxSize().background(color))
-        }
+        val content = @Composable { Box(modifier = Modifier.fillMaxSize().background(color)) }
         if (animated) {
-            AnimatedPane(Modifier) {
-                content()
-            }
+            AnimatedPane(Modifier) { content() }
         } else {
             content()
         }
diff --git a/compose/material3/adaptive/samples/src/main/java/androidx/compose/material3/adaptive/samples/ThreePaneScaffoldSample.kt b/compose/material3/adaptive/samples/src/main/java/androidx/compose/material3/adaptive/samples/ThreePaneScaffoldSample.kt
index 9db35f3..3a44336 100644
--- a/compose/material3/adaptive/samples/src/main/java/androidx/compose/material3/adaptive/samples/ThreePaneScaffoldSample.kt
+++ b/compose/material3/adaptive/samples/src/main/java/androidx/compose/material3/adaptive/samples/ThreePaneScaffoldSample.kt
@@ -81,9 +81,7 @@
             ) {
                 Surface(
                     color = MaterialTheme.colorScheme.secondary,
-                    onClick = {
-                        scaffoldNavigator.navigateTo(ListDetailPaneScaffoldRole.Detail)
-                    }
+                    onClick = { scaffoldNavigator.navigateTo(ListDetailPaneScaffoldRole.Detail) }
                 ) {
                     Text("List")
                 }
@@ -93,9 +91,7 @@
             AnimatedPane(modifier = Modifier) {
                 Surface(
                     color = MaterialTheme.colorScheme.primary,
-                    onClick = {
-                        scaffoldNavigator.navigateBack()
-                    }
+                    onClick = { scaffoldNavigator.navigateBack() }
                 ) {
                     Text("Details")
                 }
@@ -119,36 +115,26 @@
             ) {
                 Surface(
                     color = MaterialTheme.colorScheme.secondary,
-                    onClick = {
-                        scaffoldNavigator.navigateTo(ListDetailPaneScaffoldRole.Detail)
-                    }
+                    onClick = { scaffoldNavigator.navigateTo(ListDetailPaneScaffoldRole.Detail) }
                 ) {
                     Text("List")
                 }
             }
         },
         detailPane = {
-            AnimatedPane(
-                modifier = Modifier
-            ) {
+            AnimatedPane(modifier = Modifier) {
                 Surface(
                     color = MaterialTheme.colorScheme.primary,
                 ) {
                     Column(verticalArrangement = Arrangement.spacedBy(16.dp)) {
                         Text("Detail")
                         Row(
-                            modifier = Modifier
-                                .fillMaxWidth()
-                                .padding(horizontal = 4.dp),
+                            modifier = Modifier.fillMaxWidth().padding(horizontal = 4.dp),
                             horizontalArrangement = Arrangement.spacedBy(8.dp)
                         ) {
                             Surface(
-                                onClick = {
-                                    scaffoldNavigator.navigateBack()
-                                },
-                                modifier = Modifier
-                                    .weight(0.5f)
-                                    .fillMaxHeight(),
+                                onClick = { scaffoldNavigator.navigateBack() },
+                                modifier = Modifier.weight(0.5f).fillMaxHeight(),
                                 color = MaterialTheme.colorScheme.primary.copy(alpha = 0.8f)
                             ) {
                                 Box(
@@ -163,9 +149,7 @@
                                 onClick = {
                                     scaffoldNavigator.navigateTo(ListDetailPaneScaffoldRole.Extra)
                                 },
-                                modifier = Modifier
-                                    .weight(0.5f)
-                                    .fillMaxHeight(),
+                                modifier = Modifier.weight(0.5f).fillMaxHeight(),
                                 color = MaterialTheme.colorScheme.primary.copy(alpha = 0.6f)
                             ) {
                                 Box(
@@ -181,15 +165,11 @@
             }
         },
         extraPane = {
-            AnimatedPane(
-                modifier = Modifier.fillMaxSize()
-            ) {
+            AnimatedPane(modifier = Modifier.fillMaxSize()) {
                 Surface(
                     modifier = Modifier.fillMaxSize(),
                     color = MaterialTheme.colorScheme.tertiary,
-                    onClick = {
-                        scaffoldNavigator.navigateBack()
-                    }
+                    onClick = { scaffoldNavigator.navigateBack() }
                 ) {
                     Text("Extra")
                 }
@@ -210,10 +190,11 @@
     val welcomeRoute = "welcome"
     val listDetailRoute = "listdetail"
     val items = List(15) { "Item $it" }
-    val loremIpsum = "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod " +
-        "tempor incididunt ut labore et dolore magna aliqua. Dui nunc mattis enim ut tellus " +
-        "elementum sagittis. Nunc sed augue lacus viverra vitae. Sit amet dictum sit amet justo " +
-        "donec. Fringilla urna porttitor rhoncus dolor purus non enim praesent elementum."
+    val loremIpsum =
+        "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod " +
+            "tempor incididunt ut labore et dolore magna aliqua. Dui nunc mattis enim ut tellus " +
+            "elementum sagittis. Nunc sed augue lacus viverra vitae. Sit amet dictum sit amet justo " +
+            "donec. Fringilla urna porttitor rhoncus dolor purus non enim praesent elementum."
 
     @Composable
     fun ListCard(
@@ -222,13 +203,14 @@
         modifier: Modifier = Modifier,
     ) {
         OutlinedCard(
-            colors = CardDefaults.outlinedCardColors(when {
-                highlight -> MaterialTheme.colorScheme.surfaceVariant
-                else -> MaterialTheme.colorScheme.surface
-            }),
-            modifier = modifier
-                .heightIn(min = 72.dp)
-                .fillMaxWidth(),
+            colors =
+                CardDefaults.outlinedCardColors(
+                    when {
+                        highlight -> MaterialTheme.colorScheme.surfaceVariant
+                        else -> MaterialTheme.colorScheme.surface
+                    }
+                ),
+            modifier = modifier.heightIn(min = 72.dp).fillMaxWidth(),
         ) {
             Text(
                 text = title,
@@ -251,9 +233,7 @@
         ) { paddingValues ->
             Card(
                 colors = CardDefaults.cardColors(MaterialTheme.colorScheme.surfaceVariant),
-                modifier = Modifier
-                    .padding(paddingValues)
-                    .fillMaxSize(),
+                modifier = Modifier.padding(paddingValues).fillMaxSize(),
             ) {
                 Text(
                     text = details,
@@ -282,15 +262,10 @@
     ) {
         composable(welcomeRoute) {
             Scaffold(Modifier.fillMaxSize()) { paddingValues ->
-                Box(
-                    Modifier
-                        .padding(paddingValues)
-                        .fillMaxSize()) {
+                Box(Modifier.padding(paddingValues).fillMaxSize()) {
                     Text(
                         text = "Welcome Screen",
-                        modifier = Modifier
-                            .align(Alignment.TopCenter)
-                            .padding(top = 24.dp),
+                        modifier = Modifier.align(Alignment.TopCenter).padding(top = 24.dp),
                         style = MaterialTheme.typography.displayMedium,
                     )
                     Button(
@@ -334,16 +309,18 @@
                                 items.forEach { item ->
                                     ListCard(
                                         title = item,
-                                        highlight = item == selectedItem &&
-                                            scaffoldNavigator.isDetailExpanded(),
-                                        modifier = Modifier.clickable {
-                                            if (item != selectedItem) {
-                                                scaffoldNavigator.navigateTo(
-                                                    pane = ListDetailPaneScaffoldRole.Detail,
-                                                    content = item,
-                                                )
+                                        highlight =
+                                            item == selectedItem &&
+                                                scaffoldNavigator.isDetailExpanded(),
+                                        modifier =
+                                            Modifier.clickable {
+                                                if (item != selectedItem) {
+                                                    scaffoldNavigator.navigateTo(
+                                                        pane = ListDetailPaneScaffoldRole.Detail,
+                                                        content = item,
+                                                    )
+                                                }
                                             }
-                                        }
                                     )
                                 }
                             }
diff --git a/compose/material3/benchmark/src/androidTest/java/androidx/compose/material3/benchmark/BadgeBenchmark.kt b/compose/material3/benchmark/src/androidTest/java/androidx/compose/material3/benchmark/BadgeBenchmark.kt
index 5999245..361c933 100644
--- a/compose/material3/benchmark/src/androidTest/java/androidx/compose/material3/benchmark/BadgeBenchmark.kt
+++ b/compose/material3/benchmark/src/androidTest/java/androidx/compose/material3/benchmark/BadgeBenchmark.kt
@@ -31,40 +31,39 @@
 import org.junit.Test
 
 class BadgeBenchmark {
-    @get:Rule
-    val benchmarkRule = ComposeBenchmarkRule()
+    @get:Rule val benchmarkRule = ComposeBenchmarkRule()
 
     @Test
-    fun BadgeFirstPixel() { benchmarkRule.benchmarkToFirstPixel { BadgeTestCase() } }
+    fun BadgeFirstPixel() {
+        benchmarkRule.benchmarkToFirstPixel { BadgeTestCase() }
+    }
 
     @Test
-    fun BadgedBoxFirstPixel() { benchmarkRule.benchmarkToFirstPixel { BadgedBoxTestCase() } }
+    fun BadgedBoxFirstPixel() {
+        benchmarkRule.benchmarkToFirstPixel { BadgedBoxTestCase() }
+    }
 }
 
 private class BadgedBoxTestCase : LayeredComposeTestCase() {
     @Composable
     override fun MeasuredContent() {
-        BadgedBox(
-            badge = { Spacer(Modifier.size(10.dp)) }
-        ) { Spacer(Modifier.size(24.dp)) }
+        BadgedBox(badge = { Spacer(Modifier.size(10.dp)) }) { Spacer(Modifier.size(24.dp)) }
     }
 
     @Composable
     override fun ContentWrappers(content: @Composable () -> Unit) {
-        MaterialTheme {
-            content()
-        }
+        MaterialTheme { content() }
     }
 }
 
 private class BadgeTestCase : LayeredComposeTestCase() {
     @Composable
-    override fun MeasuredContent() { Badge() }
+    override fun MeasuredContent() {
+        Badge()
+    }
 
     @Composable
     override fun ContentWrappers(content: @Composable () -> Unit) {
-        MaterialTheme {
-            content()
-        }
+        MaterialTheme { content() }
     }
 }
diff --git a/compose/material3/benchmark/src/androidTest/java/androidx/compose/material3/benchmark/BottomSheetBenchmark.kt b/compose/material3/benchmark/src/androidTest/java/androidx/compose/material3/benchmark/BottomSheetBenchmark.kt
index db2b21c..c7c3956 100644
--- a/compose/material3/benchmark/src/androidTest/java/androidx/compose/material3/benchmark/BottomSheetBenchmark.kt
+++ b/compose/material3/benchmark/src/androidTest/java/androidx/compose/material3/benchmark/BottomSheetBenchmark.kt
@@ -49,8 +49,7 @@
 @LargeTest
 @RunWith(AndroidJUnit4::class)
 class BottomSheetBenchmark {
-    @get:Rule
-    val benchmarkRule = ComposeBenchmarkRule()
+    @get:Rule val benchmarkRule = ComposeBenchmarkRule()
 
     private val bottomSheetScaffoldTestCaseFactory = { BottomSheetScaffoldTestCase() }
     private val modalBottomSheetTestCaseFactory = { ModalBottomSheetTestCase() }
@@ -136,21 +135,17 @@
 
     @Composable
     override fun MeasuredContent() {
-        state = rememberBottomSheetScaffoldState(
-            bottomSheetState = rememberStandardBottomSheetState(skipHiddenState = false)
-        )
+        state =
+            rememberBottomSheetScaffoldState(
+                bottomSheetState = rememberStandardBottomSheetState(skipHiddenState = false)
+            )
         scope = rememberCoroutineScope()
-        BottomSheetScaffold(
-            sheetContent = {},
-            scaffoldState = state
-        ) {}
+        BottomSheetScaffold(sheetContent = {}, scaffoldState = state) {}
     }
 
     @Composable
     override fun ContentWrappers(content: @Composable () -> Unit) {
-        MaterialTheme {
-            content()
-        }
+        MaterialTheme { content() }
     }
 
     override fun toggleState() {
@@ -181,9 +176,7 @@
 
     @Composable
     override fun ContentWrappers(content: @Composable () -> Unit) {
-        MaterialTheme {
-            content()
-        }
+        MaterialTheme { content() }
     }
 
     override fun toggleState() {
diff --git a/compose/material3/benchmark/src/androidTest/java/androidx/compose/material3/benchmark/ButtonBenchmark.kt b/compose/material3/benchmark/src/androidTest/java/androidx/compose/material3/benchmark/ButtonBenchmark.kt
index fbb6c0c..712ddb56 100644
--- a/compose/material3/benchmark/src/androidTest/java/androidx/compose/material3/benchmark/ButtonBenchmark.kt
+++ b/compose/material3/benchmark/src/androidTest/java/androidx/compose/material3/benchmark/ButtonBenchmark.kt
@@ -43,13 +43,10 @@
 class ButtonBenchmark(private val type: ButtonType) {
 
     companion object {
-        @Parameterized.Parameters(name = "{0}")
-        @JvmStatic
-        fun parameters() = ButtonType.values()
+        @Parameterized.Parameters(name = "{0}") @JvmStatic fun parameters() = ButtonType.values()
     }
 
-    @get:Rule
-    val benchmarkRule = ComposeBenchmarkRule()
+    @get:Rule val benchmarkRule = ComposeBenchmarkRule()
 
     private val buttonTestCaseFactory = { ButtonTestCase(type) }
 
@@ -83,27 +80,18 @@
     }
 }
 
-internal class ButtonTestCase(
-    private val type: ButtonType
-) : LayeredComposeTestCase() {
+internal class ButtonTestCase(private val type: ButtonType) : LayeredComposeTestCase() {
 
     @Composable
     override fun MeasuredContent() {
         when (type) {
-            ButtonType.FilledButton ->
-                Button(onClick = { /* Do something! */ }) { Text("Button") }
-
+            ButtonType.FilledButton -> Button(onClick = { /* Do something! */ }) { Text("Button") }
             ButtonType.ElevatedButton ->
                 ElevatedButton(onClick = { /* Do something! */ }) { Text("Elevated Button") }
-
             ButtonType.FilledTonalButton ->
-                FilledTonalButton(onClick = { /* Do something! */ }) {
-                    Text("Filled Tonal Button")
-                }
-
+                FilledTonalButton(onClick = { /* Do something! */ }) { Text("Filled Tonal Button") }
             ButtonType.OutlinedButton ->
                 OutlinedButton(onClick = { /* Do something! */ }) { Text("Outlined Button") }
-
             ButtonType.TextButton ->
                 TextButton(onClick = { /* Do something! */ }) { Text("Text Button") }
         }
@@ -111,12 +99,14 @@
 
     @Composable
     override fun ContentWrappers(content: @Composable () -> Unit) {
-        MaterialTheme {
-            content()
-        }
+        MaterialTheme { content() }
     }
 }
 
 enum class ButtonType {
-    FilledButton, ElevatedButton, FilledTonalButton, OutlinedButton, TextButton
+    FilledButton,
+    ElevatedButton,
+    FilledTonalButton,
+    OutlinedButton,
+    TextButton
 }
diff --git a/compose/material3/benchmark/src/androidTest/java/androidx/compose/material3/benchmark/CardBenchmark.kt b/compose/material3/benchmark/src/androidTest/java/androidx/compose/material3/benchmark/CardBenchmark.kt
index 81c1d8a..d13c5a5 100644
--- a/compose/material3/benchmark/src/androidTest/java/androidx/compose/material3/benchmark/CardBenchmark.kt
+++ b/compose/material3/benchmark/src/androidTest/java/androidx/compose/material3/benchmark/CardBenchmark.kt
@@ -40,8 +40,7 @@
 @RunWith(AndroidJUnit4::class)
 class CardBenchmark {
 
-    @get:Rule
-    val benchmarkRule = ComposeBenchmarkRule()
+    @get:Rule val benchmarkRule = ComposeBenchmarkRule()
 
     private val cardTestCaseFactory = { CardTestCase() }
     private val clickableCardTestCaseFactory = { ClickableCardTestCase() }
@@ -85,14 +84,12 @@
 
     @Composable
     override fun MeasuredContent() {
-        Card(modifier = Modifier.size(200.dp)) { }
+        Card(modifier = Modifier.size(200.dp)) {}
     }
 
     @Composable
     override fun ContentWrappers(content: @Composable () -> Unit) {
-        MaterialTheme {
-            content()
-        }
+        MaterialTheme { content() }
     }
 }
 
@@ -100,13 +97,11 @@
 
     @Composable
     override fun MeasuredContent() {
-        Card(onClick = {}, modifier = Modifier.size(200.dp)) { }
+        Card(onClick = {}, modifier = Modifier.size(200.dp)) {}
     }
 
     @Composable
     override fun ContentWrappers(content: @Composable () -> Unit) {
-        MaterialTheme {
-            content()
-        }
+        MaterialTheme { content() }
     }
 }
diff --git a/compose/material3/benchmark/src/androidTest/java/androidx/compose/material3/benchmark/CheckboxBenchmark.kt b/compose/material3/benchmark/src/androidTest/java/androidx/compose/material3/benchmark/CheckboxBenchmark.kt
index 0610c98..90f154f 100644
--- a/compose/material3/benchmark/src/androidTest/java/androidx/compose/material3/benchmark/CheckboxBenchmark.kt
+++ b/compose/material3/benchmark/src/androidTest/java/androidx/compose/material3/benchmark/CheckboxBenchmark.kt
@@ -42,8 +42,7 @@
 @RunWith(AndroidJUnit4::class)
 class CheckboxBenchmark {
 
-    @get:Rule
-    val benchmarkRule = ComposeBenchmarkRule()
+    @get:Rule val benchmarkRule = ComposeBenchmarkRule()
 
     private val checkboxTestCaseFactory = { CheckboxTestCase() }
 
@@ -100,8 +99,6 @@
 
     @Composable
     override fun ContentWrappers(content: @Composable () -> Unit) {
-        MaterialTheme {
-            content()
-        }
+        MaterialTheme { content() }
     }
 }
diff --git a/compose/material3/benchmark/src/androidTest/java/androidx/compose/material3/benchmark/ChipBenchmark.kt b/compose/material3/benchmark/src/androidTest/java/androidx/compose/material3/benchmark/ChipBenchmark.kt
index ea8c653..dbc3e27 100644
--- a/compose/material3/benchmark/src/androidTest/java/androidx/compose/material3/benchmark/ChipBenchmark.kt
+++ b/compose/material3/benchmark/src/androidTest/java/androidx/compose/material3/benchmark/ChipBenchmark.kt
@@ -55,13 +55,10 @@
 class ChipBenchmark(private val type: ChipType) {
 
     companion object {
-        @Parameterized.Parameters(name = "{0}")
-        @JvmStatic
-        fun parameters() = ChipType.values()
+        @Parameterized.Parameters(name = "{0}") @JvmStatic fun parameters() = ChipType.values()
     }
 
-    @get:Rule
-    val benchmarkRule = ComposeBenchmarkRule()
+    @get:Rule val benchmarkRule = ComposeBenchmarkRule()
 
     private val chipTestCaseFactory = { ChipTestCase(type) }
 
@@ -95,11 +92,10 @@
     }
 }
 
-internal class ChipTestCase(
-    private val type: ChipType
-) : LayeredComposeTestCase() {
+internal class ChipTestCase(private val type: ChipType) : LayeredComposeTestCase() {
 
     private var selected by mutableStateOf(false)
+
     @OptIn(ExperimentalMaterial3Api::class)
     @Composable
     override fun MeasuredContent() {
@@ -116,7 +112,6 @@
                         )
                     }
                 )
-
             ChipType.ElevatedAssist ->
                 ElevatedAssistChip(
                     onClick = { /* Do something! */ },
@@ -129,32 +124,30 @@
                         )
                     }
                 )
-
             ChipType.Filter ->
-            FilterChip(
-                selected = selected,
-                onClick = { selected = !selected },
-                label = { Text("Filter chip") },
-                leadingIcon = if (selected) {
-                    {
-                        Icon(
-                            imageVector = Icons.Filled.Done,
-                            contentDescription = "Localized Description",
-                            modifier = Modifier.size(FilterChipDefaults.IconSize)
-                        )
-                    }
-                } else {
-                    null
-                }
-            )
-
+                FilterChip(
+                    selected = selected,
+                    onClick = { selected = !selected },
+                    label = { Text("Filter chip") },
+                    leadingIcon =
+                        if (selected) {
+                            {
+                                Icon(
+                                    imageVector = Icons.Filled.Done,
+                                    contentDescription = "Localized Description",
+                                    modifier = Modifier.size(FilterChipDefaults.IconSize)
+                                )
+                            }
+                        } else {
+                            null
+                        }
+                )
             ChipType.Input ->
                 InputChip(
                     selected = selected,
                     onClick = { selected = !selected },
                     label = { Text("Input Chip") },
                 )
-
             ChipType.Suggestion ->
                 SuggestionChip(
                     onClick = { /* Do something! */ },
@@ -172,12 +165,14 @@
 
     @Composable
     override fun ContentWrappers(content: @Composable () -> Unit) {
-        MaterialTheme {
-            content()
-        }
+        MaterialTheme { content() }
     }
 }
 
 enum class ChipType {
-    Assist, ElevatedAssist, Filter, Input, Suggestion,
+    Assist,
+    ElevatedAssist,
+    Filter,
+    Input,
+    Suggestion,
 }
diff --git a/compose/material3/benchmark/src/androidTest/java/androidx/compose/material3/benchmark/ColorSchemeBenchmark.kt b/compose/material3/benchmark/src/androidTest/java/androidx/compose/material3/benchmark/ColorSchemeBenchmark.kt
index 20e04e7..aaa638f 100644
--- a/compose/material3/benchmark/src/androidTest/java/androidx/compose/material3/benchmark/ColorSchemeBenchmark.kt
+++ b/compose/material3/benchmark/src/androidTest/java/androidx/compose/material3/benchmark/ColorSchemeBenchmark.kt
@@ -37,8 +37,7 @@
 @MediumTest
 @RunWith(AndroidJUnit4::class)
 class ColorSchemeBenchmark {
-    @get:Rule
-    val benchmarkRule = ComposeBenchmarkRule()
+    @get:Rule val benchmarkRule = ComposeBenchmarkRule()
 
     private val colorSchemeTestCaseFactory = { ColorSchemeTestCase() }
 
@@ -54,40 +53,73 @@
     override fun MeasuredContent() {
         Column {
             Box(modifier = Modifier.size(1.dp).background(MaterialTheme.colorScheme.surface))
-            Box(modifier = Modifier.size(1.dp).background(
-                MaterialTheme.colorScheme.contentColorFor(MaterialTheme.colorScheme.surface))
+            Box(
+                modifier =
+                    Modifier.size(1.dp)
+                        .background(
+                            MaterialTheme.colorScheme.contentColorFor(
+                                MaterialTheme.colorScheme.surface
+                            )
+                        )
             )
             Box(modifier = Modifier.size(1.dp).background(MaterialTheme.colorScheme.primary))
-            Box(modifier = Modifier.size(1.dp).background(
-                MaterialTheme.colorScheme.contentColorFor(MaterialTheme.colorScheme.primary))
+            Box(
+                modifier =
+                    Modifier.size(1.dp)
+                        .background(
+                            MaterialTheme.colorScheme.contentColorFor(
+                                MaterialTheme.colorScheme.primary
+                            )
+                        )
             )
             Box(modifier = Modifier.size(1.dp).background(MaterialTheme.colorScheme.secondary))
-            Box(modifier = Modifier.size(1.dp).background(
-                MaterialTheme.colorScheme.contentColorFor(MaterialTheme.colorScheme.secondary))
+            Box(
+                modifier =
+                    Modifier.size(1.dp)
+                        .background(
+                            MaterialTheme.colorScheme.contentColorFor(
+                                MaterialTheme.colorScheme.secondary
+                            )
+                        )
             )
             Box(modifier = Modifier.size(1.dp).background(MaterialTheme.colorScheme.tertiary))
-            Box(modifier = Modifier.size(1.dp).background(
-                MaterialTheme.colorScheme.contentColorFor(MaterialTheme.colorScheme.tertiary))
+            Box(
+                modifier =
+                    Modifier.size(1.dp)
+                        .background(
+                            MaterialTheme.colorScheme.contentColorFor(
+                                MaterialTheme.colorScheme.tertiary
+                            )
+                        )
             )
             Box(modifier = Modifier.size(1.dp).background(MaterialTheme.colorScheme.error))
-            Box(modifier = Modifier.size(1.dp).background(
-                MaterialTheme.colorScheme.contentColorFor(MaterialTheme.colorScheme.error))
+            Box(
+                modifier =
+                    Modifier.size(1.dp)
+                        .background(
+                            MaterialTheme.colorScheme.contentColorFor(
+                                MaterialTheme.colorScheme.error
+                            )
+                        )
             )
-            Box(modifier = Modifier.size(1.dp).background(
-                MaterialTheme.colorScheme.surfaceContainerLowest)
+            Box(
+                modifier =
+                    Modifier.size(1.dp).background(MaterialTheme.colorScheme.surfaceContainerLowest)
             )
-            Box(modifier = Modifier.size(1.dp).background(
-                MaterialTheme.colorScheme.contentColorFor(
-                    MaterialTheme.colorScheme.surfaceContainerLowest)
-                )
+            Box(
+                modifier =
+                    Modifier.size(1.dp)
+                        .background(
+                            MaterialTheme.colorScheme.contentColorFor(
+                                MaterialTheme.colorScheme.surfaceContainerLowest
+                            )
+                        )
             )
         }
     }
 
     @Composable
     override fun ContentWrappers(content: @Composable () -> Unit) {
-        MaterialTheme {
-            content()
-        }
+        MaterialTheme { content() }
     }
 }
diff --git a/compose/material3/benchmark/src/androidTest/java/androidx/compose/material3/benchmark/DatePickerBenchmark.kt b/compose/material3/benchmark/src/androidTest/java/androidx/compose/material3/benchmark/DatePickerBenchmark.kt
index e5ba192..b4e9c7a 100644
--- a/compose/material3/benchmark/src/androidTest/java/androidx/compose/material3/benchmark/DatePickerBenchmark.kt
+++ b/compose/material3/benchmark/src/androidTest/java/androidx/compose/material3/benchmark/DatePickerBenchmark.kt
@@ -36,8 +36,7 @@
 @RunWith(AndroidJUnit4::class)
 class DatePickerBenchmark {
 
-    @get:Rule
-    val benchmarkRule = ComposeBenchmarkRule()
+    @get:Rule val benchmarkRule = ComposeBenchmarkRule()
 
     private val datePickerTestCaseFactory = { DatePickerTestCase() }
     private val dateInputTestCaseFactory = { DateInputTestCase() }
@@ -101,9 +100,7 @@
     }
 }
 
-/**
- * A [DatePicker] test case when initiated in its default picker mode.
- */
+/** A [DatePicker] test case when initiated in its default picker mode. */
 internal class DatePickerTestCase : LayeredComposeTestCase() {
 
     @OptIn(ExperimentalMaterial3Api::class)
@@ -114,15 +111,11 @@
 
     @Composable
     override fun ContentWrappers(content: @Composable () -> Unit) {
-        MaterialTheme {
-            content()
-        }
+        MaterialTheme { content() }
     }
 }
 
-/**
- * A [DatePicker] test case when initiated in an input mode.
- */
+/** A [DatePicker] test case when initiated in an input mode. */
 internal class DateInputTestCase : LayeredComposeTestCase() {
 
     @OptIn(ExperimentalMaterial3Api::class)
@@ -133,8 +126,6 @@
 
     @Composable
     override fun ContentWrappers(content: @Composable () -> Unit) {
-        MaterialTheme {
-            content()
-        }
+        MaterialTheme { content() }
     }
 }
diff --git a/compose/material3/benchmark/src/androidTest/java/androidx/compose/material3/benchmark/DateRangePickerBenchmark.kt b/compose/material3/benchmark/src/androidTest/java/androidx/compose/material3/benchmark/DateRangePickerBenchmark.kt
index 61aec86..659458f 100644
--- a/compose/material3/benchmark/src/androidTest/java/androidx/compose/material3/benchmark/DateRangePickerBenchmark.kt
+++ b/compose/material3/benchmark/src/androidTest/java/androidx/compose/material3/benchmark/DateRangePickerBenchmark.kt
@@ -40,8 +40,7 @@
 @RunWith(AndroidJUnit4::class)
 class DateRangePickerBenchmark {
 
-    @get:Rule
-    val benchmarkRule = ComposeBenchmarkRule()
+    @get:Rule val benchmarkRule = ComposeBenchmarkRule()
 
     private val dateRangePickerTestCaseFactory = { DateRangePickerTestCase() }
     private val dateRangeInputTestCaseFactory = { DateRangeInputTestCase() }
@@ -105,9 +104,7 @@
     }
 }
 
-/**
- * A [DateRangePicker] test case when initiated in its default picker mode.
- */
+/** A [DateRangePicker] test case when initiated in its default picker mode. */
 internal class DateRangePickerTestCase : LayeredComposeTestCase() {
 
     @OptIn(ExperimentalMaterial3Api::class)
@@ -118,15 +115,11 @@
 
     @Composable
     override fun ContentWrappers(content: @Composable () -> Unit) {
-        MaterialTheme {
-            content()
-        }
+        MaterialTheme { content() }
     }
 }
 
-/**
- * A [DateRangePicker] test case when initiated in an input mode.
- */
+/** A [DateRangePicker] test case when initiated in an input mode. */
 internal class DateRangeInputTestCase : LayeredComposeTestCase() {
 
     @OptIn(ExperimentalMaterial3Api::class)
@@ -139,8 +132,6 @@
 
     @Composable
     override fun ContentWrappers(content: @Composable () -> Unit) {
-        MaterialTheme {
-            content()
-        }
+        MaterialTheme { content() }
     }
 }
diff --git a/compose/material3/benchmark/src/androidTest/java/androidx/compose/material3/benchmark/DividerBenchmark.kt b/compose/material3/benchmark/src/androidTest/java/androidx/compose/material3/benchmark/DividerBenchmark.kt
index adea672..c6c3549 100644
--- a/compose/material3/benchmark/src/androidTest/java/androidx/compose/material3/benchmark/DividerBenchmark.kt
+++ b/compose/material3/benchmark/src/androidTest/java/androidx/compose/material3/benchmark/DividerBenchmark.kt
@@ -38,8 +38,7 @@
 @RunWith(AndroidJUnit4::class)
 class DividerBenchmark {
 
-    @get:Rule
-    val benchmarkRule = ComposeBenchmarkRule()
+    @get:Rule val benchmarkRule = ComposeBenchmarkRule()
 
     private val horizontalDividerTestCaseFactory = { HorizontalDividerTestCase() }
     private val verticalDividerTestCaseFactory = { VerticalDividerTestCase() }
@@ -112,9 +111,7 @@
 
     @Composable
     override fun ContentWrappers(content: @Composable () -> Unit) {
-        MaterialTheme {
-            content()
-        }
+        MaterialTheme { content() }
     }
 }
 
@@ -127,8 +124,6 @@
 
     @Composable
     override fun ContentWrappers(content: @Composable () -> Unit) {
-        MaterialTheme {
-            content()
-        }
+        MaterialTheme { content() }
     }
 }
diff --git a/compose/material3/benchmark/src/androidTest/java/androidx/compose/material3/benchmark/ExposedDropdownMenuBenchmark.kt b/compose/material3/benchmark/src/androidTest/java/androidx/compose/material3/benchmark/ExposedDropdownMenuBenchmark.kt
index bc9071d..e90106d 100644
--- a/compose/material3/benchmark/src/androidTest/java/androidx/compose/material3/benchmark/ExposedDropdownMenuBenchmark.kt
+++ b/compose/material3/benchmark/src/androidTest/java/androidx/compose/material3/benchmark/ExposedDropdownMenuBenchmark.kt
@@ -51,8 +51,7 @@
 @LargeTest
 @RunWith(Parameterized::class)
 class ExposedDropdownMenuBenchmark(private val expanded: Boolean) {
-    @get:Rule
-    val benchmarkRule = ComposeBenchmarkRule()
+    @get:Rule val benchmarkRule = ComposeBenchmarkRule()
 
     @Test
     fun edm_firstPixel() {
@@ -97,9 +96,8 @@
     }
 }
 
-internal class ExposedDropdownMenuTestCase(
-    private val expanded: Boolean
-) : LayeredComposeTestCase(), ToggleableTestCase {
+internal class ExposedDropdownMenuTestCase(private val expanded: Boolean) :
+    LayeredComposeTestCase(), ToggleableTestCase {
     private lateinit var state: MutableState<Dp>
 
     @OptIn(ExperimentalMaterial3Api::class)
@@ -123,9 +121,7 @@
 
     @Composable
     override fun ContentWrappers(content: @Composable () -> Unit) {
-        MaterialTheme {
-            content()
-        }
+        MaterialTheme { content() }
     }
 
     override fun toggleState() {
diff --git a/compose/material3/benchmark/src/androidTest/java/androidx/compose/material3/benchmark/FloatingActionButtonBenchmark.kt b/compose/material3/benchmark/src/androidTest/java/androidx/compose/material3/benchmark/FloatingActionButtonBenchmark.kt
index 40b4a89..2585509 100644
--- a/compose/material3/benchmark/src/androidTest/java/androidx/compose/material3/benchmark/FloatingActionButtonBenchmark.kt
+++ b/compose/material3/benchmark/src/androidTest/java/androidx/compose/material3/benchmark/FloatingActionButtonBenchmark.kt
@@ -43,8 +43,7 @@
 @RunWith(AndroidJUnit4::class)
 class FloatingActionButtonBenchmark {
 
-    @get:Rule
-    val benchmarkRule = ComposeBenchmarkRule()
+    @get:Rule val benchmarkRule = ComposeBenchmarkRule()
 
     private val fabTestCaseFactory = { FloatingActionButtonTestCase() }
     private val extendedFabTestCaseFactory = { ExtendedFloatingActionButtonTestCase() }
@@ -112,16 +111,12 @@
 
     @Composable
     override fun MeasuredContent() {
-        FloatingActionButton(onClick = { /*TODO*/ }) {
-            Box(modifier = Modifier.size(24.dp))
-        }
+        FloatingActionButton(onClick = { /*TODO*/ }) { Box(modifier = Modifier.size(24.dp)) }
     }
 
     @Composable
     override fun ContentWrappers(content: @Composable () -> Unit) {
-        MaterialTheme {
-            content()
-        }
+        MaterialTheme { content() }
     }
 }
 
@@ -131,16 +126,13 @@
     override fun MeasuredContent() {
         ExtendedFloatingActionButton(
             text = { Text(text = "Extended FAB") },
-            icon = {
-                Box(modifier = Modifier.size(24.dp))
-            },
-            onClick = { /*TODO*/ })
+            icon = { Box(modifier = Modifier.size(24.dp)) },
+            onClick = { /*TODO*/ }
+        )
     }
 
     @Composable
     override fun ContentWrappers(content: @Composable () -> Unit) {
-        MaterialTheme {
-            content()
-        }
+        MaterialTheme { content() }
     }
 }
diff --git a/compose/material3/benchmark/src/androidTest/java/androidx/compose/material3/benchmark/IconBenchmark.kt b/compose/material3/benchmark/src/androidTest/java/androidx/compose/material3/benchmark/IconBenchmark.kt
index bcf219c..af7e719 100644
--- a/compose/material3/benchmark/src/androidTest/java/androidx/compose/material3/benchmark/IconBenchmark.kt
+++ b/compose/material3/benchmark/src/androidTest/java/androidx/compose/material3/benchmark/IconBenchmark.kt
@@ -37,13 +37,10 @@
 @RunWith(Parameterized::class)
 class IconBenchmark(private val type: IconType) {
     companion object {
-        @Parameterized.Parameters(name = "{0}")
-        @JvmStatic
-        fun parameters() = IconType.values()
+        @Parameterized.Parameters(name = "{0}") @JvmStatic fun parameters() = IconType.values()
     }
 
-    @get:Rule
-    val benchmarkRule = ComposeBenchmarkRule()
+    @get:Rule val benchmarkRule = ComposeBenchmarkRule()
 
     private val iconTestCaseFactory = { IconTestCase(type) }
 
@@ -53,32 +50,28 @@
     }
 }
 
-private class IconTestCase(
-    private val type: IconType
-) : LayeredComposeTestCase() {
+private class IconTestCase(private val type: IconType) : LayeredComposeTestCase() {
     @OptIn(ExperimentalMaterial3Api::class)
     @Composable
     override fun MeasuredContent() {
         when (type) {
-            IconType.FilledIcon ->
-                Icon(Icons.Filled.Lock, contentDescription = null)
-
+            IconType.FilledIcon -> Icon(Icons.Filled.Lock, contentDescription = null)
             IconType.FilledTintedIcon ->
                 Icon(
                     rememberVectorPainter(image = Icons.Filled.Lock),
                     contentDescription = null,
-                    tint = { Color.Blue })
+                    tint = { Color.Blue }
+                )
         }
     }
 
     @Composable
     override fun ContentWrappers(content: @Composable () -> Unit) {
-        MaterialTheme {
-            content()
-        }
+        MaterialTheme { content() }
     }
 }
 
 enum class IconType {
-    FilledIcon, FilledTintedIcon
+    FilledIcon,
+    FilledTintedIcon
 }
diff --git a/compose/material3/benchmark/src/androidTest/java/androidx/compose/material3/benchmark/IconButtonBenchmark.kt b/compose/material3/benchmark/src/androidTest/java/androidx/compose/material3/benchmark/IconButtonBenchmark.kt
index e74a366..58b6ba7 100644
--- a/compose/material3/benchmark/src/androidTest/java/androidx/compose/material3/benchmark/IconButtonBenchmark.kt
+++ b/compose/material3/benchmark/src/androidTest/java/androidx/compose/material3/benchmark/IconButtonBenchmark.kt
@@ -49,8 +49,7 @@
         fun parameters() = IconButtonType.values()
     }
 
-    @get:Rule
-    val benchmarkRule = ComposeBenchmarkRule()
+    @get:Rule val benchmarkRule = ComposeBenchmarkRule()
 
     private val iconButtonTestCaseFactory = { IconButtonTestCase(type) }
 
@@ -84,55 +83,39 @@
     }
 }
 
-internal class IconButtonTestCase(
-    private val type: IconButtonType
-) : LayeredComposeTestCase() {
+internal class IconButtonTestCase(private val type: IconButtonType) : LayeredComposeTestCase() {
 
     @Composable
     override fun MeasuredContent() {
         when (type) {
             IconButtonType.IconButton ->
                 IconButton(onClick = { /* Do something! */ }) {
-                    Icon(
-                        Icons.Outlined.Lock,
-                        contentDescription = "Localized description"
-                    )
+                    Icon(Icons.Outlined.Lock, contentDescription = "Localized description")
                 }
-
             IconButtonType.FilledIconButton ->
                 FilledIconButton(onClick = { /* Do something! */ }) {
-                    Icon(
-                        Icons.Outlined.Lock,
-                        contentDescription = "Localized description"
-                    )
+                    Icon(Icons.Outlined.Lock, contentDescription = "Localized description")
                 }
-
             IconButtonType.FilledTonalIconButton ->
                 FilledTonalIconButton(onClick = { /* Do something! */ }) {
-                    Icon(
-                        Icons.Outlined.Lock,
-                        contentDescription = "Localized description"
-                    )
+                    Icon(Icons.Outlined.Lock, contentDescription = "Localized description")
                 }
-
             IconButtonType.OutlinedIconButton ->
                 OutlinedIconButton(onClick = { /* Do something! */ }) {
-                    Icon(
-                        Icons.Outlined.Lock,
-                        contentDescription = "Localized description"
-                    )
+                    Icon(Icons.Outlined.Lock, contentDescription = "Localized description")
                 }
         }
     }
 
     @Composable
     override fun ContentWrappers(content: @Composable () -> Unit) {
-        MaterialTheme {
-            content()
-        }
+        MaterialTheme { content() }
     }
 }
 
 enum class IconButtonType {
-    IconButton, FilledIconButton, FilledTonalIconButton, OutlinedIconButton,
+    IconButton,
+    FilledIconButton,
+    FilledTonalIconButton,
+    OutlinedIconButton,
 }
diff --git a/compose/material3/benchmark/src/androidTest/java/androidx/compose/material3/benchmark/IconToggleButtonBenchmark.kt b/compose/material3/benchmark/src/androidTest/java/androidx/compose/material3/benchmark/IconToggleButtonBenchmark.kt
index 7e00d9e..f59f5af 100644
--- a/compose/material3/benchmark/src/androidTest/java/androidx/compose/material3/benchmark/IconToggleButtonBenchmark.kt
+++ b/compose/material3/benchmark/src/androidTest/java/androidx/compose/material3/benchmark/IconToggleButtonBenchmark.kt
@@ -53,8 +53,7 @@
         fun parameters() = IconToggleButtonType.values()
     }
 
-    @get:Rule
-    val benchmarkRule = ComposeBenchmarkRule()
+    @get:Rule val benchmarkRule = ComposeBenchmarkRule()
 
     private val iconToggleButtonTestCaseFactory = { IconToggleButtonTestCase(type) }
 
@@ -88,9 +87,8 @@
     }
 }
 
-internal class IconToggleButtonTestCase(
-    private val type: IconToggleButtonType
-) : LayeredComposeTestCase(), ToggleableTestCase {
+internal class IconToggleButtonTestCase(private val type: IconToggleButtonType) :
+    LayeredComposeTestCase(), ToggleableTestCase {
 
     private var state by mutableStateOf(false)
 
@@ -99,40 +97,25 @@
         when (type) {
             IconToggleButtonType.IconToggleButton ->
                 IconToggleButton(checked = state, onCheckedChange = { /* Do something! */ }) {
-                    Icon(
-                        Icons.Outlined.Lock,
-                        contentDescription = "Localized description"
-                    )
+                    Icon(Icons.Outlined.Lock, contentDescription = "Localized description")
                 }
-
             IconToggleButtonType.FilledIconToggleButton ->
-                FilledIconToggleButton(
-                    checked = state,
-                    onCheckedChange = { /* Do something! */ }) {
-                    Icon(
-                        Icons.Outlined.Lock,
-                        contentDescription = "Localized description"
-                    )
+                FilledIconToggleButton(checked = state, onCheckedChange = { /* Do something! */ }) {
+                    Icon(Icons.Outlined.Lock, contentDescription = "Localized description")
                 }
-
             IconToggleButtonType.FilledTonalIconToggleButton ->
                 FilledTonalIconToggleButton(
                     checked = state,
-                    onCheckedChange = { /* Do something! */ }) {
-                    Icon(
-                        Icons.Outlined.Lock,
-                        contentDescription = "Localized description"
-                    )
+                    onCheckedChange = { /* Do something! */ }
+                ) {
+                    Icon(Icons.Outlined.Lock, contentDescription = "Localized description")
                 }
-
             IconToggleButtonType.OutlinedIconToggleButton ->
                 OutlinedIconToggleButton(
                     checked = state,
-                    onCheckedChange = { /* Do something! */ }) {
-                    Icon(
-                        Icons.Outlined.Lock,
-                        contentDescription = "Localized description"
-                    )
+                    onCheckedChange = { /* Do something! */ }
+                ) {
+                    Icon(Icons.Outlined.Lock, contentDescription = "Localized description")
                 }
         }
     }
@@ -143,12 +126,13 @@
 
     @Composable
     override fun ContentWrappers(content: @Composable () -> Unit) {
-        MaterialTheme {
-            content()
-        }
+        MaterialTheme { content() }
     }
 }
 
 enum class IconToggleButtonType {
-    IconToggleButton, FilledIconToggleButton, FilledTonalIconToggleButton, OutlinedIconToggleButton
+    IconToggleButton,
+    FilledIconToggleButton,
+    FilledTonalIconToggleButton,
+    OutlinedIconToggleButton
 }
diff --git a/compose/material3/benchmark/src/androidTest/java/androidx/compose/material3/benchmark/ListItemBenchmark.kt b/compose/material3/benchmark/src/androidTest/java/androidx/compose/material3/benchmark/ListItemBenchmark.kt
index 7bc00ae..375e733 100644
--- a/compose/material3/benchmark/src/androidTest/java/androidx/compose/material3/benchmark/ListItemBenchmark.kt
+++ b/compose/material3/benchmark/src/androidTest/java/androidx/compose/material3/benchmark/ListItemBenchmark.kt
@@ -42,8 +42,7 @@
 @RunWith(AndroidJUnit4::class)
 class ListItemBenchmark {
 
-    @get:Rule
-    val benchmarkRule = ComposeBenchmarkRule()
+    @get:Rule val benchmarkRule = ComposeBenchmarkRule()
 
     private val listItemTestCaseFactory = { ListItemTestCase() }
 
@@ -85,19 +84,13 @@
             headlineContent = { Text(text = "List Item") },
             overlineContent = { Text(text = "Overline Content") },
             supportingContent = { Text(text = "Supporting Content") },
-            leadingContent = {
-                Box(modifier = Modifier.size(24.dp))
-            },
-            trailingContent = {
-                Box(modifier = Modifier.size(24.dp))
-            }
+            leadingContent = { Box(modifier = Modifier.size(24.dp)) },
+            trailingContent = { Box(modifier = Modifier.size(24.dp)) }
         )
     }
 
     @Composable
     override fun ContentWrappers(content: @Composable () -> Unit) {
-        MaterialTheme {
-            content()
-        }
+        MaterialTheme { content() }
     }
 }
diff --git a/compose/material3/benchmark/src/androidTest/java/androidx/compose/material3/benchmark/MaterialBenchmarkExtensions.kt b/compose/material3/benchmark/src/androidTest/java/androidx/compose/material3/benchmark/MaterialBenchmarkExtensions.kt
index 471e20d..70a5288 100644
--- a/compose/material3/benchmark/src/androidTest/java/androidx/compose/material3/benchmark/MaterialBenchmarkExtensions.kt
+++ b/compose/material3/benchmark/src/androidTest/java/androidx/compose/material3/benchmark/MaterialBenchmarkExtensions.kt
@@ -53,9 +53,7 @@
 
                 draw()
 
-                runWithTimingDisabled {
-                    drawFinish()
-                }
+                runWithTimingDisabled { drawFinish() }
             }
 
             if (loopCount == 1) {
@@ -176,9 +174,7 @@
                 drawPrepare()
                 draw()
 
-                runWithTimingDisabled {
-                    drawFinish()
-                }
+                runWithTimingDisabled { drawFinish() }
             }
 
             if (loopCount == 1) {
diff --git a/compose/material3/benchmark/src/androidTest/java/androidx/compose/material3/benchmark/NavigationBarBenchmark.kt b/compose/material3/benchmark/src/androidTest/java/androidx/compose/material3/benchmark/NavigationBarBenchmark.kt
index 60607a0..e5428ed 100644
--- a/compose/material3/benchmark/src/androidTest/java/androidx/compose/material3/benchmark/NavigationBarBenchmark.kt
+++ b/compose/material3/benchmark/src/androidTest/java/androidx/compose/material3/benchmark/NavigationBarBenchmark.kt
@@ -40,8 +40,7 @@
 @MediumTest
 @RunWith(AndroidJUnit4::class)
 class NavigationBarBenchmark {
-    @get:Rule
-    val benchmarkRule = ComposeBenchmarkRule()
+    @get:Rule val benchmarkRule = ComposeBenchmarkRule()
 
     private val testCaseFactory = { NavigationBarTestCase() }
 
@@ -82,9 +81,7 @@
 
     @Composable
     override fun ContentWrappers(content: @Composable () -> Unit) {
-        MaterialTheme {
-            content()
-        }
+        MaterialTheme { content() }
     }
 
     override fun toggleState() {
diff --git a/compose/material3/benchmark/src/androidTest/java/androidx/compose/material3/benchmark/NavigationRailBenchmark.kt b/compose/material3/benchmark/src/androidTest/java/androidx/compose/material3/benchmark/NavigationRailBenchmark.kt
index 9e0b6b1..955274f 100644
--- a/compose/material3/benchmark/src/androidTest/java/androidx/compose/material3/benchmark/NavigationRailBenchmark.kt
+++ b/compose/material3/benchmark/src/androidTest/java/androidx/compose/material3/benchmark/NavigationRailBenchmark.kt
@@ -41,8 +41,7 @@
 @MediumTest
 @RunWith(AndroidJUnit4::class)
 class NavigationRailBenchmark {
-    @get:Rule
-    val benchmarkRule = ComposeBenchmarkRule()
+    @get:Rule val benchmarkRule = ComposeBenchmarkRule()
 
     private val testCaseFactory = { NavigationRailTestCase() }
 
@@ -83,9 +82,7 @@
 
     @Composable
     override fun ContentWrappers(content: @Composable () -> Unit) {
-        MaterialTheme {
-            content()
-        }
+        MaterialTheme { content() }
     }
 
     override fun toggleState() {
diff --git a/compose/material3/benchmark/src/androidTest/java/androidx/compose/material3/benchmark/NavigationSuiteScaffoldBenchmarkTest.kt b/compose/material3/benchmark/src/androidTest/java/androidx/compose/material3/benchmark/NavigationSuiteScaffoldBenchmarkTest.kt
index 16a22cc..ee9ba3e 100644
--- a/compose/material3/benchmark/src/androidTest/java/androidx/compose/material3/benchmark/NavigationSuiteScaffoldBenchmarkTest.kt
+++ b/compose/material3/benchmark/src/androidTest/java/androidx/compose/material3/benchmark/NavigationSuiteScaffoldBenchmarkTest.kt
@@ -35,10 +35,10 @@
 import org.junit.Test
 
 class NavigationSuiteScaffoldBenchmarkTest {
-    @get:Rule
-    val benchmarkRule = ComposeBenchmarkRule()
+    @get:Rule val benchmarkRule = ComposeBenchmarkRule()
 
     private val testCaseFactory = { NavigationSuiteScaffoldTestCase() }
+
     @Test
     fun firstPixel() {
         benchmarkRule.benchmarkFirstRenderUntilStable(testCaseFactory)
@@ -83,9 +83,7 @@
 
     @Composable
     override fun ContentWrappers(content: @Composable () -> Unit) {
-        MaterialTheme {
-            content()
-        }
+        MaterialTheme { content() }
     }
 
     override fun toggleState() {
diff --git a/compose/material3/benchmark/src/androidTest/java/androidx/compose/material3/benchmark/ProgressIndicatorBenchmark.kt b/compose/material3/benchmark/src/androidTest/java/androidx/compose/material3/benchmark/ProgressIndicatorBenchmark.kt
index 54b9128..d340d10 100644
--- a/compose/material3/benchmark/src/androidTest/java/androidx/compose/material3/benchmark/ProgressIndicatorBenchmark.kt
+++ b/compose/material3/benchmark/src/androidTest/java/androidx/compose/material3/benchmark/ProgressIndicatorBenchmark.kt
@@ -43,8 +43,7 @@
         fun parameters() = ProgressIndicatorType.values()
     }
 
-    @get:Rule
-    val benchmarkRule = ComposeBenchmarkRule()
+    @get:Rule val benchmarkRule = ComposeBenchmarkRule()
 
     private val testCaseFactory = { ProgressIndicatorTestCase(type) }
 
@@ -61,9 +60,9 @@
         )
     }
 }
-internal class ProgressIndicatorTestCase(
-    private val type: ProgressIndicatorType
-) : LayeredComposeTestCase(), ToggleableTestCase {
+
+internal class ProgressIndicatorTestCase(private val type: ProgressIndicatorType) :
+    LayeredComposeTestCase(), ToggleableTestCase {
     private lateinit var state: MutableFloatState
 
     @Composable
@@ -71,18 +70,14 @@
         state = remember { mutableFloatStateOf(0f) }
 
         when (type) {
-            ProgressIndicatorType.Linear ->
-                LinearProgressIndicator(progress = { state.value })
-            ProgressIndicatorType.Circular ->
-                CircularProgressIndicator(progress = { state.value })
+            ProgressIndicatorType.Linear -> LinearProgressIndicator(progress = { state.value })
+            ProgressIndicatorType.Circular -> CircularProgressIndicator(progress = { state.value })
         }
     }
 
     @Composable
     override fun ContentWrappers(content: @Composable () -> Unit) {
-        MaterialTheme {
-            content()
-        }
+        MaterialTheme { content() }
     }
 
     override fun toggleState() {
@@ -91,5 +86,6 @@
 }
 
 enum class ProgressIndicatorType {
-    Linear, Circular
+    Linear,
+    Circular
 }
diff --git a/compose/material3/benchmark/src/androidTest/java/androidx/compose/material3/benchmark/RangeSliderBenchmark.kt b/compose/material3/benchmark/src/androidTest/java/androidx/compose/material3/benchmark/RangeSliderBenchmark.kt
index ae7504d..faa5683 100644
--- a/compose/material3/benchmark/src/androidTest/java/androidx/compose/material3/benchmark/RangeSliderBenchmark.kt
+++ b/compose/material3/benchmark/src/androidTest/java/androidx/compose/material3/benchmark/RangeSliderBenchmark.kt
@@ -39,8 +39,7 @@
 import org.junit.Test
 
 class RangeSliderBenchmark {
-    @get:Rule
-    val benchmarkRule = ComposeBenchmarkRule()
+    @get:Rule val benchmarkRule = ComposeBenchmarkRule()
 
     private val sliderTestCaseFactory = { RangeSliderTestCase() }
 
@@ -51,9 +50,7 @@
 
     @Test
     fun moveThumb() {
-        benchmarkRule.toggleStateBenchmarkComposeMeasureLayout(
-            caseFactory = sliderTestCaseFactory
-        )
+        benchmarkRule.toggleStateBenchmarkComposeMeasureLayout(caseFactory = sliderTestCaseFactory)
     }
 }
 
@@ -70,20 +67,18 @@
             state = state,
             startThumb = {
                 Spacer(
-                    Modifier
-                        .size(48.dp)
+                    Modifier.size(48.dp)
                         .background(color = MaterialTheme.colorScheme.primary)
                         .clip(CircleShape)
                         .shadow(10.dp, CircleShape)
                 )
-            })
+            }
+        )
     }
 
     @Composable
     override fun ContentWrappers(content: @Composable () -> Unit) {
-        MaterialTheme {
-            content()
-        }
+        MaterialTheme { content() }
     }
 
     override fun toggleState() {
diff --git a/compose/material3/benchmark/src/androidTest/java/androidx/compose/material3/benchmark/SearchBarBenchmark.kt b/compose/material3/benchmark/src/androidTest/java/androidx/compose/material3/benchmark/SearchBarBenchmark.kt
index dc4c13f..d7c9c9d 100644
--- a/compose/material3/benchmark/src/androidTest/java/androidx/compose/material3/benchmark/SearchBarBenchmark.kt
+++ b/compose/material3/benchmark/src/androidTest/java/androidx/compose/material3/benchmark/SearchBarBenchmark.kt
@@ -39,13 +39,10 @@
 @RunWith(Parameterized::class)
 class SearchBarBenchmark(private val type: SearchBarType) {
     companion object {
-        @Parameterized.Parameters(name = "{0}")
-        @JvmStatic
-        fun parameters() = SearchBarType.values()
+        @Parameterized.Parameters(name = "{0}") @JvmStatic fun parameters() = SearchBarType.values()
     }
 
-    @get:Rule
-    val benchmarkRule = ComposeBenchmarkRule()
+    @get:Rule val benchmarkRule = ComposeBenchmarkRule()
 
     private val testCaseFactory = { SearchBarTestCase(type) }
 
@@ -64,9 +61,8 @@
 }
 
 @OptIn(ExperimentalMaterial3Api::class)
-internal class SearchBarTestCase(
-    private val type: SearchBarType
-) : LayeredComposeTestCase(), ToggleableTestCase {
+internal class SearchBarTestCase(private val type: SearchBarType) :
+    LayeredComposeTestCase(), ToggleableTestCase {
     private lateinit var state: MutableState<Boolean>
 
     @Composable
@@ -102,9 +98,7 @@
 
     @Composable
     override fun ContentWrappers(content: @Composable () -> Unit) {
-        MaterialTheme {
-            content()
-        }
+        MaterialTheme { content() }
     }
 
     override fun toggleState() {
@@ -113,5 +107,6 @@
 }
 
 enum class SearchBarType {
-    FullScreen, Docked
+    FullScreen,
+    Docked
 }
diff --git a/compose/material3/benchmark/src/androidTest/java/androidx/compose/material3/benchmark/SliderBenchmark.kt b/compose/material3/benchmark/src/androidTest/java/androidx/compose/material3/benchmark/SliderBenchmark.kt
index bc46d15..65d744f 100644
--- a/compose/material3/benchmark/src/androidTest/java/androidx/compose/material3/benchmark/SliderBenchmark.kt
+++ b/compose/material3/benchmark/src/androidTest/java/androidx/compose/material3/benchmark/SliderBenchmark.kt
@@ -33,8 +33,7 @@
 import org.junit.Test
 
 class SliderBenchmark {
-    @get:Rule
-    val benchmarkRule = ComposeBenchmarkRule()
+    @get:Rule val benchmarkRule = ComposeBenchmarkRule()
 
     private val sliderTestCaseFactory = { SliderTestCase() }
 
@@ -45,9 +44,7 @@
 
     @Test
     fun moveThumb() {
-        benchmarkRule.toggleStateBenchmarkComposeMeasureLayout(
-            caseFactory = sliderTestCaseFactory
-        )
+        benchmarkRule.toggleStateBenchmarkComposeMeasureLayout(caseFactory = sliderTestCaseFactory)
     }
 }
 
@@ -65,9 +62,7 @@
 
     @Composable
     override fun ContentWrappers(content: @Composable () -> Unit) {
-        MaterialTheme {
-            content()
-        }
+        MaterialTheme { content() }
     }
 
     override fun toggleState() {
diff --git a/compose/material3/benchmark/src/androidTest/java/androidx/compose/material3/benchmark/SurfaceBenchmark.kt b/compose/material3/benchmark/src/androidTest/java/androidx/compose/material3/benchmark/SurfaceBenchmark.kt
index 2487cb7..4fddd18 100644
--- a/compose/material3/benchmark/src/androidTest/java/androidx/compose/material3/benchmark/SurfaceBenchmark.kt
+++ b/compose/material3/benchmark/src/androidTest/java/androidx/compose/material3/benchmark/SurfaceBenchmark.kt
@@ -36,8 +36,7 @@
 @RunWith(AndroidJUnit4::class)
 class SurfaceBenchmark {
 
-    @get:Rule
-    val benchmarkRule = ComposeBenchmarkRule()
+    @get:Rule val benchmarkRule = ComposeBenchmarkRule()
 
     private val surfaceTestCaseFactory = { SurfaceTestCase() }
 
@@ -57,8 +56,6 @@
 
     @Composable
     override fun ContentWrappers(content: @Composable () -> Unit) {
-        MaterialTheme {
-            content()
-        }
+        MaterialTheme { content() }
     }
 }
diff --git a/compose/material3/benchmark/src/androidTest/java/androidx/compose/material3/benchmark/SwitchBenchmark.kt b/compose/material3/benchmark/src/androidTest/java/androidx/compose/material3/benchmark/SwitchBenchmark.kt
index 6a164ba..331dd7c 100644
--- a/compose/material3/benchmark/src/androidTest/java/androidx/compose/material3/benchmark/SwitchBenchmark.kt
+++ b/compose/material3/benchmark/src/androidTest/java/androidx/compose/material3/benchmark/SwitchBenchmark.kt
@@ -42,8 +42,7 @@
 @RunWith(AndroidJUnit4::class)
 class SwitchBenchmark {
 
-    @get:Rule
-    val benchmarkRule = ComposeBenchmarkRule()
+    @get:Rule val benchmarkRule = ComposeBenchmarkRule()
 
     private val SwitchTestCaseFactory = { SwitchTestCase() }
 
@@ -91,7 +90,7 @@
 
     @Composable
     override fun MeasuredContent() {
-        Switch(checked = state, onCheckedChange = { })
+        Switch(checked = state, onCheckedChange = {})
     }
 
     override fun toggleState() {
@@ -100,8 +99,6 @@
 
     @Composable
     override fun ContentWrappers(content: @Composable () -> Unit) {
-        MaterialTheme {
-            content()
-        }
+        MaterialTheme { content() }
     }
 }
diff --git a/compose/material3/benchmark/src/androidTest/java/androidx/compose/material3/benchmark/TabRowBenchmark.kt b/compose/material3/benchmark/src/androidTest/java/androidx/compose/material3/benchmark/TabRowBenchmark.kt
index 8de4344..661651b 100644
--- a/compose/material3/benchmark/src/androidTest/java/androidx/compose/material3/benchmark/TabRowBenchmark.kt
+++ b/compose/material3/benchmark/src/androidTest/java/androidx/compose/material3/benchmark/TabRowBenchmark.kt
@@ -35,8 +35,7 @@
 import org.junit.Test
 
 class TabRowBenchmark {
-    @get:Rule
-    val benchmarkRule = ComposeBenchmarkRule()
+    @get:Rule val benchmarkRule = ComposeBenchmarkRule()
 
     private val tabRowTestCaseFactory = { TabRowTestCase() }
 
@@ -64,29 +63,19 @@
         val titles = listOf("TAB 1", "TAB 2", "TAB 3")
         PrimaryTabRow(selectedTabIndex = state) {
             titles.forEachIndexed { index, title ->
-                Tab(
-                    text = { Text(title) },
-                    selected = state == index,
-                    onClick = { state = index }
-                )
+                Tab(text = { Text(title) }, selected = state == index, onClick = { state = index })
             }
         }
         PrimaryScrollableTabRow(selectedTabIndex = state) {
             titles.forEachIndexed { index, title ->
-                Tab(
-                    text = { Text(title) },
-                    selected = state == index,
-                    onClick = { state = index }
-                )
+                Tab(text = { Text(title) }, selected = state == index, onClick = { state = index })
             }
         }
     }
 
     @Composable
     override fun ContentWrappers(content: @Composable () -> Unit) {
-        MaterialTheme {
-            content()
-        }
+        MaterialTheme { content() }
     }
 
     override fun toggleState() {
diff --git a/compose/material3/benchmark/src/androidTest/java/androidx/compose/material3/benchmark/TextBenchmark.kt b/compose/material3/benchmark/src/androidTest/java/androidx/compose/material3/benchmark/TextBenchmark.kt
index 34eac1c..cd09bcb 100644
--- a/compose/material3/benchmark/src/androidTest/java/androidx/compose/material3/benchmark/TextBenchmark.kt
+++ b/compose/material3/benchmark/src/androidTest/java/androidx/compose/material3/benchmark/TextBenchmark.kt
@@ -37,8 +37,7 @@
 @RunWith(AndroidJUnit4::class)
 class TextBenchmark {
 
-    @get:Rule
-    val benchmarkRule = ComposeBenchmarkRule()
+    @get:Rule val benchmarkRule = ComposeBenchmarkRule()
 
     private val textTestCaseFactory = { TextTestCase() }
 
@@ -81,8 +80,6 @@
 
     @Composable
     override fun ContentWrappers(content: @Composable () -> Unit) {
-        MaterialTheme {
-            content()
-        }
+        MaterialTheme { content() }
     }
 }
diff --git a/compose/material3/benchmark/src/androidTest/java/androidx/compose/material3/benchmark/TextFieldBenchmark.kt b/compose/material3/benchmark/src/androidTest/java/androidx/compose/material3/benchmark/TextFieldBenchmark.kt
index d09b748..5879180 100644
--- a/compose/material3/benchmark/src/androidTest/java/androidx/compose/material3/benchmark/TextFieldBenchmark.kt
+++ b/compose/material3/benchmark/src/androidTest/java/androidx/compose/material3/benchmark/TextFieldBenchmark.kt
@@ -38,13 +38,10 @@
 @RunWith(Parameterized::class)
 class TextFieldBenchmark(private val type: TextFieldType) {
     companion object {
-        @Parameterized.Parameters(name = "{0}")
-        @JvmStatic
-        fun parameters() = TextFieldType.values()
+        @Parameterized.Parameters(name = "{0}") @JvmStatic fun parameters() = TextFieldType.values()
     }
 
-    @get:Rule
-    val benchmarkRule = ComposeBenchmarkRule()
+    @get:Rule val benchmarkRule = ComposeBenchmarkRule()
 
     private val textFieldTestCaseFactory = { TextFieldTestCase(type) }
 
@@ -62,9 +59,8 @@
     }
 }
 
-internal class TextFieldTestCase(
-    private val type: TextFieldType
-) : LayeredComposeTestCase(), ToggleableTestCase {
+internal class TextFieldTestCase(private val type: TextFieldType) :
+    LayeredComposeTestCase(), ToggleableTestCase {
     private lateinit var state: MutableState<String>
 
     @Composable
@@ -87,9 +83,7 @@
 
     @Composable
     override fun ContentWrappers(content: @Composable () -> Unit) {
-        MaterialTheme {
-            content()
-        }
+        MaterialTheme { content() }
     }
 
     override fun toggleState() {
@@ -98,5 +92,6 @@
 }
 
 enum class TextFieldType {
-    Filled, Outlined
+    Filled,
+    Outlined
 }
diff --git a/compose/material3/benchmark/src/androidTest/java/androidx/compose/material3/benchmark/TimePickerBenchmark.kt b/compose/material3/benchmark/src/androidTest/java/androidx/compose/material3/benchmark/TimePickerBenchmark.kt
index 37a7204..a535780 100644
--- a/compose/material3/benchmark/src/androidTest/java/androidx/compose/material3/benchmark/TimePickerBenchmark.kt
+++ b/compose/material3/benchmark/src/androidTest/java/androidx/compose/material3/benchmark/TimePickerBenchmark.kt
@@ -37,8 +37,7 @@
 @RunWith(AndroidJUnit4::class)
 class TimePickerBenchmark {
 
-    @get:Rule
-    val benchmarkRule = ComposeBenchmarkRule()
+    @get:Rule val benchmarkRule = ComposeBenchmarkRule()
 
     private val timePickerTestCaseFactory = { TimePickerTestCase() }
 
@@ -73,8 +72,6 @@
 
     @Composable
     override fun ContentWrappers(content: @Composable () -> Unit) {
-        MaterialTheme {
-            content()
-        }
+        MaterialTheme { content() }
     }
 }
diff --git a/compose/material3/benchmark/src/androidTest/java/androidx/compose/material3/benchmark/TooltipBenchmark.kt b/compose/material3/benchmark/src/androidTest/java/androidx/compose/material3/benchmark/TooltipBenchmark.kt
index 95591d9..f33e079 100644
--- a/compose/material3/benchmark/src/androidTest/java/androidx/compose/material3/benchmark/TooltipBenchmark.kt
+++ b/compose/material3/benchmark/src/androidTest/java/androidx/compose/material3/benchmark/TooltipBenchmark.kt
@@ -41,8 +41,7 @@
 import org.junit.Test
 
 class TooltipBenchmark {
-    @get:Rule
-    val benchmarkRule = ComposeBenchmarkRule()
+    @get:Rule val benchmarkRule = ComposeBenchmarkRule()
 
     private val plainTooltipTestCaseFactory = { TooltipTestCase(TooltipType.Plain) }
     private val richTooltipTestCaseFactory = { TooltipTestCase(TooltipType.Rich) }
@@ -75,9 +74,8 @@
 }
 
 @OptIn(ExperimentalMaterial3Api::class)
-private class TooltipTestCase(
-    val tooltipType: TooltipType
-) : LayeredComposeTestCase(), ToggleableTestCase {
+private class TooltipTestCase(val tooltipType: TooltipType) :
+    LayeredComposeTestCase(), ToggleableTestCase {
     private lateinit var state: TooltipState
     private lateinit var scope: CoroutineScope
 
@@ -99,18 +97,12 @@
             }
         }
 
-        TooltipBox(
-            positionProvider = positionProvider,
-            tooltip = tooltip,
-            state = state
-        ) {}
+        TooltipBox(positionProvider = positionProvider, tooltip = tooltip, state = state) {}
     }
 
     @Composable
     override fun ContentWrappers(content: @Composable () -> Unit) {
-        MaterialTheme {
-            content()
-        }
+        MaterialTheme { content() }
     }
 
     override fun toggleState() {
@@ -130,15 +122,14 @@
     private fun TooltipScope.RichTooltipTest() {
         RichTooltip(
             title = { Text("Subhead") },
-            action = {
-                TextButton(onClick = {}) {
-                    Text(text = "Action")
-                }
-            }
-        ) { Text(text = "Text") }
+            action = { TextButton(onClick = {}) { Text(text = "Action") } }
+        ) {
+            Text(text = "Text")
+        }
     }
 }
 
 private enum class TooltipType {
-    Plain, Rich
+    Plain,
+    Rich
 }
diff --git a/compose/material3/benchmark/src/androidTest/java/androidx/compose/material3/benchmark/TopAppBarBenchmark.kt b/compose/material3/benchmark/src/androidTest/java/androidx/compose/material3/benchmark/TopAppBarBenchmark.kt
index 4b66d90c..f0d0248 100644
--- a/compose/material3/benchmark/src/androidTest/java/androidx/compose/material3/benchmark/TopAppBarBenchmark.kt
+++ b/compose/material3/benchmark/src/androidTest/java/androidx/compose/material3/benchmark/TopAppBarBenchmark.kt
@@ -37,8 +37,7 @@
 
 class TopAppBarBenchmark {
 
-    @get:Rule
-    val benchmarkRule = ComposeBenchmarkRule()
+    @get:Rule val benchmarkRule = ComposeBenchmarkRule()
 
     private val topAppBarTestCaseFactory = { TopAppBarTestCase() }
 
@@ -91,9 +90,7 @@
 
     @Composable
     override fun ContentWrappers(content: @Composable () -> Unit) {
-        MaterialTheme {
-            content()
-        }
+        MaterialTheme { content() }
     }
 }
 
@@ -108,8 +105,6 @@
 
     @Composable
     override fun ContentWrappers(content: @Composable () -> Unit) {
-        MaterialTheme {
-            content()
-        }
+        MaterialTheme { content() }
     }
 }
diff --git a/compose/material3/integration-tests/macrobenchmark-target/src/main/java/androidx/compose/material3/integration/macrobenchmark/target/TooltipActivity.kt b/compose/material3/integration-tests/macrobenchmark-target/src/main/java/androidx/compose/material3/integration/macrobenchmark/target/TooltipActivity.kt
index 2237644..bf222cbc 100644
--- a/compose/material3/integration-tests/macrobenchmark-target/src/main/java/androidx/compose/material3/integration/macrobenchmark/target/TooltipActivity.kt
+++ b/compose/material3/integration-tests/macrobenchmark-target/src/main/java/androidx/compose/material3/integration/macrobenchmark/target/TooltipActivity.kt
@@ -39,21 +39,14 @@
             TooltipBox(
                 positionProvider = TooltipDefaults.rememberPlainTooltipPositionProvider(),
                 tooltip = {
-                    PlainTooltip(
-                        caretSize = TooltipDefaults.caretSize
-                    ) {
+                    PlainTooltip(caretSize = TooltipDefaults.caretSize) {
                         Text("Tooltip Description")
                     }
                 },
                 state = rememberTooltipState()
             ) {
-                IconButton(
-                    onClick = { /* Icon button's click event */ }
-                ) {
-                    Icon(
-                        imageVector = Icons.Filled.Favorite,
-                        contentDescription = "tooltipAnchor"
-                    )
+                IconButton(onClick = { /* Icon button's click event */ }) {
+                    Icon(imageVector = Icons.Filled.Favorite, contentDescription = "tooltipAnchor")
                 }
             }
         }
diff --git a/compose/material3/integration-tests/macrobenchmark/src/main/java/androidx/compose/material3/integration/macrobenchmark/TooltipBenchmark.kt b/compose/material3/integration-tests/macrobenchmark/src/main/java/androidx/compose/material3/integration/macrobenchmark/TooltipBenchmark.kt
index 35de7f2..d5b14ba 100644
--- a/compose/material3/integration-tests/macrobenchmark/src/main/java/androidx/compose/material3/integration/macrobenchmark/TooltipBenchmark.kt
+++ b/compose/material3/integration-tests/macrobenchmark/src/main/java/androidx/compose/material3/integration/macrobenchmark/TooltipBenchmark.kt
@@ -35,8 +35,7 @@
 @RunWith(AndroidJUnit4::class)
 class TooltipBenchmark {
 
-    @get:Rule
-    val benchmarkRule = MacrobenchmarkRule()
+    @get:Rule val benchmarkRule = MacrobenchmarkRule()
 
     @Test
     fun animationTest() {
@@ -54,12 +53,7 @@
         ) {
             val anchorIconButton = device.findObject(By.desc("tooltipAnchor"))
             anchorIconButton.longClick()
-            device.wait(
-                Until.findObject(
-                    By.desc("tooltipAnchor").longClickable(true)
-                ),
-                1500
-            )
+            device.wait(Until.findObject(By.desc("tooltipAnchor").longClickable(true)), 1500)
         }
     }
 
diff --git a/compose/material3/material3-adaptive-navigation-suite/samples/src/main/java/androidx/compose/material3/adaptive/navigationsuite/samples/NavigationSuiteScaffoldSamples.kt b/compose/material3/material3-adaptive-navigation-suite/samples/src/main/java/androidx/compose/material3/adaptive/navigationsuite/samples/NavigationSuiteScaffoldSamples.kt
index 8326319..df28658 100644
--- a/compose/material3/material3-adaptive-navigation-suite/samples/src/main/java/androidx/compose/material3/adaptive/navigationsuite/samples/NavigationSuiteScaffoldSamples.kt
+++ b/compose/material3/material3-adaptive-navigation-suite/samples/src/main/java/androidx/compose/material3/adaptive/navigationsuite/samples/NavigationSuiteScaffoldSamples.kt
@@ -81,13 +81,14 @@
     val navItems = listOf("Songs", "Artists", "Playlists")
     val adaptiveInfo = currentWindowAdaptiveInfo()
     // Custom configuration that shows a navigation drawer in large screens.
-    val customNavSuiteType = with(adaptiveInfo) {
-        if (windowSizeClass.windowWidthSizeClass == WindowWidthSizeClass.EXPANDED) {
-            NavigationSuiteType.NavigationDrawer
-        } else {
-            NavigationSuiteScaffoldDefaults.calculateFromAdaptiveInfo(adaptiveInfo)
+    val customNavSuiteType =
+        with(adaptiveInfo) {
+            if (windowSizeClass.windowWidthSizeClass == WindowWidthSizeClass.EXPANDED) {
+                NavigationSuiteType.NavigationDrawer
+            } else {
+                NavigationSuiteScaffoldDefaults.calculateFromAdaptiveInfo(adaptiveInfo)
+            }
         }
-    }
 
     NavigationSuiteScaffold(
         layoutType = customNavSuiteType,
diff --git a/compose/material3/material3-adaptive-navigation-suite/src/androidInstrumentedTest/kotlin/androidx/compose/material3/adaptive/navigationsuite/NavigationSuiteScaffoldTest.kt b/compose/material3/material3-adaptive-navigation-suite/src/androidInstrumentedTest/kotlin/androidx/compose/material3/adaptive/navigationsuite/NavigationSuiteScaffoldTest.kt
index 11dfa5f..b34dd9f 100644
--- a/compose/material3/material3-adaptive-navigation-suite/src/androidInstrumentedTest/kotlin/androidx/compose/material3/adaptive/navigationsuite/NavigationSuiteScaffoldTest.kt
+++ b/compose/material3/material3-adaptive-navigation-suite/src/androidInstrumentedTest/kotlin/androidx/compose/material3/adaptive/navigationsuite/NavigationSuiteScaffoldTest.kt
@@ -36,8 +36,7 @@
 
 @RunWith(JUnit4::class)
 class NavigationSuiteScaffoldTest {
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
     @Test
     fun navigationSuiteScaffoldTest_fillMaxSize_withNavBar_succeeds() {
@@ -49,11 +48,17 @@
 
         // Assert that Modifier.fillMaxSize didn't propagate to the nav bar (its height should not
         // fill the screen).
-        rule.onNodeWithTag(NavigationSuiteTag).getUnclippedBoundsInRoot()
-            .height.assertIsNotEqualTo(rule.onRoot().getUnclippedBoundsInRoot().height)
+        rule
+            .onNodeWithTag(NavigationSuiteTag)
+            .getUnclippedBoundsInRoot()
+            .height
+            .assertIsNotEqualTo(rule.onRoot().getUnclippedBoundsInRoot().height)
         // Nav bar width is always the same as screen width.
-        rule.onNodeWithTag(NavigationSuiteTag).getUnclippedBoundsInRoot()
-            .width.assertIsEqualTo(rule.onRoot().getUnclippedBoundsInRoot().width)
+        rule
+            .onNodeWithTag(NavigationSuiteTag)
+            .getUnclippedBoundsInRoot()
+            .width
+            .assertIsEqualTo(rule.onRoot().getUnclippedBoundsInRoot().width)
     }
 
     @Test
@@ -65,12 +70,18 @@
         }
 
         // Nav rail height is always the same as screen height.
-        rule.onNodeWithTag(NavigationSuiteTag).getUnclippedBoundsInRoot()
-            .height.assertIsEqualTo(rule.onRoot().getUnclippedBoundsInRoot().height)
+        rule
+            .onNodeWithTag(NavigationSuiteTag)
+            .getUnclippedBoundsInRoot()
+            .height
+            .assertIsEqualTo(rule.onRoot().getUnclippedBoundsInRoot().height)
         // Assert that Modifier.fillMaxSize didn't propagate to the nav rail (its width should not
         // fill the screen).
-        rule.onNodeWithTag(NavigationSuiteTag).getUnclippedBoundsInRoot()
-            .width.assertIsNotEqualTo(rule.onRoot().getUnclippedBoundsInRoot().width)
+        rule
+            .onNodeWithTag(NavigationSuiteTag)
+            .getUnclippedBoundsInRoot()
+            .width
+            .assertIsNotEqualTo(rule.onRoot().getUnclippedBoundsInRoot().width)
     }
 
     @Test
@@ -82,25 +93,29 @@
         }
 
         // Nav drawer height is always the same as screen height.
-        rule.onNodeWithTag(NavigationSuiteTag).getUnclippedBoundsInRoot()
-            .height.assertIsEqualTo(rule.onRoot().getUnclippedBoundsInRoot().height)
+        rule
+            .onNodeWithTag(NavigationSuiteTag)
+            .getUnclippedBoundsInRoot()
+            .height
+            .assertIsEqualTo(rule.onRoot().getUnclippedBoundsInRoot().height)
         // Assert that Modifier.fillMaxSize didn't propagate to the nav drawer (its width should not
         // fill the screen).
-        rule.onNodeWithTag(NavigationSuiteTag).getUnclippedBoundsInRoot()
-            .width.assertIsNotEqualTo(rule.onRoot().getUnclippedBoundsInRoot().width)
+        rule
+            .onNodeWithTag(NavigationSuiteTag)
+            .getUnclippedBoundsInRoot()
+            .width
+            .assertIsNotEqualTo(rule.onRoot().getUnclippedBoundsInRoot().width)
     }
 }
 
 @Composable
-private fun SampleNavigationSuiteScaffoldLayout(
-    layoutType: NavigationSuiteType
-) {
+private fun SampleNavigationSuiteScaffoldLayout(layoutType: NavigationSuiteType) {
     NavigationSuiteScaffoldLayout(
         navigationSuite = {
             NavigationSuite(
                 modifier = Modifier.testTag(NavigationSuiteTag),
                 layoutType = layoutType
-            ) { }
+            ) {}
         }
     )
 }
diff --git a/compose/material3/material3-adaptive-navigation-suite/src/androidInstrumentedTest/kotlin/androidx/compose/material3/adaptive/navigationsuite/NavigationSuiteTest.kt b/compose/material3/material3-adaptive-navigation-suite/src/androidInstrumentedTest/kotlin/androidx/compose/material3/adaptive/navigationsuite/NavigationSuiteTest.kt
index ea3718c..efd45cf 100644
--- a/compose/material3/material3-adaptive-navigation-suite/src/androidInstrumentedTest/kotlin/androidx/compose/material3/adaptive/navigationsuite/NavigationSuiteTest.kt
+++ b/compose/material3/material3-adaptive-navigation-suite/src/androidInstrumentedTest/kotlin/androidx/compose/material3/adaptive/navigationsuite/NavigationSuiteTest.kt
@@ -31,27 +31,19 @@
 @SmallTest
 @RunWith(AndroidJUnit4::class)
 class NavigationSuiteTest {
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
     @Test
     fun navigationLayoutTypeTest_None() {
         val layoutType = NavigationSuiteType.None
 
-        rule.setContent {
-            SampleNavigationSuite(layoutType = layoutType)
-        }
+        rule.setContent { SampleNavigationSuite(layoutType = layoutType) }
 
         rule.onNodeWithTag("NavigationSuite").assertIsNotDisplayed()
     }
 }
 
 @Composable
-private fun SampleNavigationSuite(
-    layoutType: NavigationSuiteType
-) {
-    NavigationSuite(
-        modifier = Modifier.testTag("NavigationSuite"),
-        layoutType = layoutType
-    ) {}
+private fun SampleNavigationSuite(layoutType: NavigationSuiteType) {
+    NavigationSuite(modifier = Modifier.testTag("NavigationSuite"), layoutType = layoutType) {}
 }
diff --git a/compose/material3/material3-adaptive-navigation-suite/src/androidUnitTest/kotlin/androidx/compose/material3/adaptive/navigationsuite/NavigationSuiteScaffoldTest.kt b/compose/material3/material3-adaptive-navigation-suite/src/androidUnitTest/kotlin/androidx/compose/material3/adaptive/navigationsuite/NavigationSuiteScaffoldTest.kt
index 12ec173..1eb9fa1 100644
--- a/compose/material3/material3-adaptive-navigation-suite/src/androidUnitTest/kotlin/androidx/compose/material3/adaptive/navigationsuite/NavigationSuiteScaffoldTest.kt
+++ b/compose/material3/material3-adaptive-navigation-suite/src/androidUnitTest/kotlin/androidx/compose/material3/adaptive/navigationsuite/NavigationSuiteScaffoldTest.kt
@@ -32,9 +32,7 @@
     @Test
     fun navigationLayoutTypeTest_compactWidth_compactHeight() {
         val mockAdaptiveInfo =
-            createMockAdaptiveInfo(
-                windowSizeClass = WindowSizeClass.compute(400f, 400f)
-            )
+            createMockAdaptiveInfo(windowSizeClass = WindowSizeClass.compute(400f, 400f))
 
         assertThat(NavigationSuiteScaffoldDefaults.calculateFromAdaptiveInfo(mockAdaptiveInfo))
             .isEqualTo(NavigationSuiteType.NavigationBar)
@@ -43,9 +41,7 @@
     @Test
     fun navigationLayoutTypeTest_compactWidth_mediumHeight() {
         val mockAdaptiveInfo =
-            createMockAdaptiveInfo(
-                windowSizeClass = WindowSizeClass.compute(400f, 800f)
-            )
+            createMockAdaptiveInfo(windowSizeClass = WindowSizeClass.compute(400f, 800f))
 
         assertThat(NavigationSuiteScaffoldDefaults.calculateFromAdaptiveInfo(mockAdaptiveInfo))
             .isEqualTo(NavigationSuiteType.NavigationBar)
@@ -54,9 +50,7 @@
     @Test
     fun navigationLayoutTypeTest_compactWidth_expandedHeight() {
         val mockAdaptiveInfo =
-            createMockAdaptiveInfo(
-                windowSizeClass = WindowSizeClass.compute(400f, 1000f)
-            )
+            createMockAdaptiveInfo(windowSizeClass = WindowSizeClass.compute(400f, 1000f))
 
         assertThat(NavigationSuiteScaffoldDefaults.calculateFromAdaptiveInfo(mockAdaptiveInfo))
             .isEqualTo(NavigationSuiteType.NavigationBar)
@@ -65,9 +59,7 @@
     @Test
     fun navigationLayoutTypeTest_mediumWidth_compactHeight() {
         val mockAdaptiveInfo =
-            createMockAdaptiveInfo(
-                windowSizeClass = WindowSizeClass.compute(800f, 400f)
-            )
+            createMockAdaptiveInfo(windowSizeClass = WindowSizeClass.compute(800f, 400f))
 
         assertThat(NavigationSuiteScaffoldDefaults.calculateFromAdaptiveInfo(mockAdaptiveInfo))
             .isEqualTo(NavigationSuiteType.NavigationBar)
@@ -76,9 +68,7 @@
     @Test
     fun navigationLayoutTypeTest_mediumWidth_mediumHeight() {
         val mockAdaptiveInfo =
-            createMockAdaptiveInfo(
-                windowSizeClass = WindowSizeClass.compute(800f, 800f)
-            )
+            createMockAdaptiveInfo(windowSizeClass = WindowSizeClass.compute(800f, 800f))
 
         assertThat(NavigationSuiteScaffoldDefaults.calculateFromAdaptiveInfo(mockAdaptiveInfo))
             .isEqualTo(NavigationSuiteType.NavigationRail)
@@ -87,9 +77,7 @@
     @Test
     fun navigationLayoutTypeTest_mediumWidth_expandedHeight() {
         val mockAdaptiveInfo =
-            createMockAdaptiveInfo(
-                windowSizeClass = WindowSizeClass.compute(800f, 1000f)
-            )
+            createMockAdaptiveInfo(windowSizeClass = WindowSizeClass.compute(800f, 1000f))
 
         assertThat(NavigationSuiteScaffoldDefaults.calculateFromAdaptiveInfo(mockAdaptiveInfo))
             .isEqualTo(NavigationSuiteType.NavigationRail)
@@ -98,9 +86,7 @@
     @Test
     fun navigationLayoutTypeTest_expandedWidth_compactHeight() {
         val mockAdaptiveInfo =
-            createMockAdaptiveInfo(
-                windowSizeClass = WindowSizeClass.compute(1000f, 400f)
-            )
+            createMockAdaptiveInfo(windowSizeClass = WindowSizeClass.compute(1000f, 400f))
 
         assertThat(NavigationSuiteScaffoldDefaults.calculateFromAdaptiveInfo(mockAdaptiveInfo))
             .isEqualTo(NavigationSuiteType.NavigationBar)
@@ -109,9 +95,7 @@
     @Test
     fun navigationLayoutTypeTest_expandedWidth_mediumHeight() {
         val mockAdaptiveInfo =
-            createMockAdaptiveInfo(
-                windowSizeClass = WindowSizeClass.compute(1000f, 800f)
-            )
+            createMockAdaptiveInfo(windowSizeClass = WindowSizeClass.compute(1000f, 800f))
 
         assertThat(NavigationSuiteScaffoldDefaults.calculateFromAdaptiveInfo(mockAdaptiveInfo))
             .isEqualTo(NavigationSuiteType.NavigationRail)
@@ -120,9 +104,7 @@
     @Test
     fun navigationLayoutTypeTest_expandedWidth_expandedHeight() {
         val mockAdaptiveInfo =
-            createMockAdaptiveInfo(
-                windowSizeClass = WindowSizeClass.compute(1000f, 1000f)
-            )
+            createMockAdaptiveInfo(windowSizeClass = WindowSizeClass.compute(1000f, 1000f))
 
         assertThat(NavigationSuiteScaffoldDefaults.calculateFromAdaptiveInfo(mockAdaptiveInfo))
             .isEqualTo(NavigationSuiteType.NavigationRail)
@@ -156,9 +138,6 @@
         windowSizeClass: WindowSizeClass,
         isTableTop: Boolean = false
     ): WindowAdaptiveInfo {
-        return WindowAdaptiveInfo(
-            windowSizeClass,
-            Posture(isTabletop = isTableTop)
-        )
+        return WindowAdaptiveInfo(windowSizeClass, Posture(isTabletop = isTableTop))
     }
 }
diff --git a/compose/material3/material3-adaptive-navigation-suite/src/commonMain/kotlin/androidx/compose/material3/adaptive/navigationsuite/NavigationSuiteScaffold.kt b/compose/material3/material3-adaptive-navigation-suite/src/commonMain/kotlin/androidx/compose/material3/adaptive/navigationsuite/NavigationSuiteScaffold.kt
index d812def..5693ecb 100644
--- a/compose/material3/material3-adaptive-navigation-suite/src/commonMain/kotlin/androidx/compose/material3/adaptive/navigationsuite/NavigationSuiteScaffold.kt
+++ b/compose/material3/material3-adaptive-navigation-suite/src/commonMain/kotlin/androidx/compose/material3/adaptive/navigationsuite/NavigationSuiteScaffold.kt
@@ -68,21 +68,23 @@
  * navigation component on the screen according to the current [NavigationSuiteType].
  *
  * Example default usage:
+ *
  * @sample androidx.compose.material3.adaptive.navigationsuite.samples.NavigationSuiteScaffoldSample
  * Example custom configuration usage:
+ *
  * @sample androidx.compose.material3.adaptive.navigationsuite.samples.NavigationSuiteScaffoldCustomConfigSample
  *
  * @param navigationSuiteItems the navigation items to be displayed
  * @param modifier the [Modifier] to be applied to the navigation suite scaffold
  * @param layoutType the current [NavigationSuiteType]. Defaults to
- * [NavigationSuiteScaffoldDefaults.calculateFromAdaptiveInfo]
+ *   [NavigationSuiteScaffoldDefaults.calculateFromAdaptiveInfo]
  * @param navigationSuiteColors [NavigationSuiteColors] that will be used to determine the container
- * (background) color of the navigation component and the preferred color for content inside the
- * navigation component
+ *   (background) color of the navigation component and the preferred color for content inside the
+ *   navigation component
  * @param containerColor the color used for the background of the navigation suite scaffold,
- * including the passed [content] composable. Use [Color.Transparent] to have no color
+ *   including the passed [content] composable. Use [Color.Transparent] to have no color
  * @param contentColor the preferred color to be used for typography and iconography within the
- * passed in [content] lambda inside the navigation suite scaffold.
+ *   passed in [content] lambda inside the navigation suite scaffold.
  * @param content the content of your screen
  */
 @Composable
@@ -132,13 +134,13 @@
  * the [navigationSuite] component according to the given [layoutType].
  *
  * The usage of this function is recommended when you need some customization that is not viable via
- * the use of [NavigationSuiteScaffold].
- * Example usage:
+ * the use of [NavigationSuiteScaffold]. Example usage:
+ *
  * @sample androidx.compose.material3.adaptive.navigationsuite.samples.NavigationSuiteScaffoldCustomNavigationRail
  *
  * @param navigationSuite the navigation component to be displayed, typically [NavigationSuite]
  * @param layoutType the current [NavigationSuiteType]. Defaults to
- * [NavigationSuiteScaffoldDefaults.calculateFromAdaptiveInfo]
+ *   [NavigationSuiteScaffoldDefaults.calculateFromAdaptiveInfo]
  * @param content the content of your screen
  */
 @Composable
@@ -151,47 +153,42 @@
     Layout({
         // Wrap the navigation suite and content composables each in a Box to not propagate the
         // parent's (Surface) min constraints to its children (see b/312664933).
-        Box(Modifier.layoutId(NavigationSuiteLayoutIdTag)) {
-            navigationSuite()
-        }
-        Box(Modifier.layoutId(ContentLayoutIdTag)) {
-            content()
-        }
-    }
-    ) { measurables, constraints ->
+        Box(Modifier.layoutId(NavigationSuiteLayoutIdTag)) { navigationSuite() }
+        Box(Modifier.layoutId(ContentLayoutIdTag)) { content() }
+    }) { measurables, constraints ->
         val looseConstraints = constraints.copy(minWidth = 0, minHeight = 0)
         // Find the navigation suite composable through it's layoutId tag
         val navigationPlaceable =
-            measurables.fastFirst { it.layoutId == NavigationSuiteLayoutIdTag }
+            measurables
+                .fastFirst { it.layoutId == NavigationSuiteLayoutIdTag }
                 .measure(looseConstraints)
         val isNavigationBar = layoutType == NavigationSuiteType.NavigationBar
         val layoutHeight = constraints.maxHeight
         val layoutWidth = constraints.maxWidth
         // Find the content composable through it's layoutId tag
         val contentPlaceable =
-            measurables.fastFirst { it.layoutId == ContentLayoutIdTag }.measure(
-                if (isNavigationBar) {
-                    constraints.copy(
-                        minHeight = layoutHeight - navigationPlaceable.height,
-                        maxHeight = layoutHeight - navigationPlaceable.height
-                    )
-                } else {
-                    constraints.copy(
-                        minWidth = layoutWidth - navigationPlaceable.width,
-                        maxWidth = layoutWidth - navigationPlaceable.width
-                    )
-                }
-            )
+            measurables
+                .fastFirst { it.layoutId == ContentLayoutIdTag }
+                .measure(
+                    if (isNavigationBar) {
+                        constraints.copy(
+                            minHeight = layoutHeight - navigationPlaceable.height,
+                            maxHeight = layoutHeight - navigationPlaceable.height
+                        )
+                    } else {
+                        constraints.copy(
+                            minWidth = layoutWidth - navigationPlaceable.width,
+                            maxWidth = layoutWidth - navigationPlaceable.width
+                        )
+                    }
+                )
 
         layout(layoutWidth, layoutHeight) {
             if (isNavigationBar) {
                 // Place content above the navigation component.
                 contentPlaceable.placeRelative(0, 0)
                 // Place the navigation component at the bottom of the screen.
-                navigationPlaceable.placeRelative(
-                    0,
-                    layoutHeight - (navigationPlaceable.height)
-                )
+                navigationPlaceable.placeRelative(0, layoutHeight - (navigationPlaceable.height))
             } else {
                 // Place the navigation component at the start of the screen.
                 navigationPlaceable.placeRelative(0, 0)
@@ -211,12 +208,12 @@
  *
  * @param modifier the [Modifier] to be applied to the navigation component
  * @param layoutType the current [NavigationSuiteType] of the [NavigationSuiteScaffold]. Defaults to
- * [NavigationSuiteScaffoldDefaults.calculateFromAdaptiveInfo]
+ *   [NavigationSuiteScaffoldDefaults.calculateFromAdaptiveInfo]
  * @param colors [NavigationSuiteColors] that will be used to determine the container (background)
- * color of the navigation component and the preferred color for content inside the navigation
- * component
+ *   color of the navigation component and the preferred color for content inside the navigation
+ *   component
  * @param content the content inside the current navigation component, typically
- * [NavigationSuiteScope.item]s
+ *   [NavigationSuiteScope.item]s
  */
 @Composable
 fun NavigationSuite(
@@ -247,14 +244,14 @@
                         enabled = it.enabled,
                         label = it.label,
                         alwaysShowLabel = it.alwaysShowLabel,
-                        colors = it.colors?.navigationBarItemColors
-                            ?: defaultItemColors.navigationBarItemColors,
+                        colors =
+                            it.colors?.navigationBarItemColors
+                                ?: defaultItemColors.navigationBarItemColors,
                         interactionSource = it.interactionSource
                     )
                 }
             }
         }
-
         NavigationSuiteType.NavigationRail -> {
             NavigationRail(
                 modifier = modifier,
@@ -270,14 +267,14 @@
                         enabled = it.enabled,
                         label = it.label,
                         alwaysShowLabel = it.alwaysShowLabel,
-                        colors = it.colors?.navigationRailItemColors
-                            ?: defaultItemColors.navigationRailItemColors,
+                        colors =
+                            it.colors?.navigationRailItemColors
+                                ?: defaultItemColors.navigationRailItemColors,
                         interactionSource = it.interactionSource
                     )
                 }
             }
         }
-
         NavigationSuiteType.NavigationDrawer -> {
             PermanentDrawerSheet(
                 modifier = modifier,
@@ -292,15 +289,17 @@
                         icon = it.icon,
                         badge = it.badge,
                         label = { it.label?.invoke() ?: Text("") },
-                        colors = it.colors?.navigationDrawerItemColors
-                            ?: defaultItemColors.navigationDrawerItemColors,
+                        colors =
+                            it.colors?.navigationDrawerItemColors
+                                ?: defaultItemColors.navigationDrawerItemColors,
                         interactionSource = it.interactionSource
                     )
                 }
             }
         }
-
-        NavigationSuiteType.None -> { /* Do nothing. */ }
+        NavigationSuiteType.None -> {
+            /* Do nothing. */
+        }
     }
 }
 
@@ -309,8 +308,8 @@
 
     /**
      * This function sets the parameters of the default Material navigation item to be used with the
-     * Navigation Suite Scaffold. The item is called in [NavigationSuite], according to the
-     * current [NavigationSuiteType].
+     * Navigation Suite Scaffold. The item is called in [NavigationSuite], according to the current
+     * [NavigationSuiteType].
      *
      * For specifics about each item component, see [NavigationBarItem], [NavigationRailItem], and
      * [NavigationDrawerItem].
@@ -320,19 +319,19 @@
      * @param icon icon for this item, typically an [Icon]
      * @param modifier the [Modifier] to be applied to this item
      * @param enabled controls the enabled state of this item. When `false`, this component will not
-     * respond to user input, and it will appear visually disabled and disabled to accessibility
-     * services. Note: as of now, for [NavigationDrawerItem], this is always `true`.
+     *   respond to user input, and it will appear visually disabled and disabled to accessibility
+     *   services. Note: as of now, for [NavigationDrawerItem], this is always `true`.
      * @param label the text label for this item
      * @param alwaysShowLabel whether to always show the label for this item. If `false`, the label
-     * will only be shown when this item is selected. Note: for [NavigationDrawerItem] this is
-     * always `true`
+     *   will only be shown when this item is selected. Note: for [NavigationDrawerItem] this is
+     *   always `true`
      * @param badge optional badge to show on this item
      * @param colors [NavigationSuiteItemColors] that will be used to resolve the colors used for
-     * this item in different states. If null, [NavigationSuiteDefaults.itemColors] will be used.
+     *   this item in different states. If null, [NavigationSuiteDefaults.itemColors] will be used.
      * @param interactionSource an optional hoisted [MutableInteractionSource] for observing and
-     * emitting [Interaction]s for this item. You can use this to change the item's appearance
-     * or preview the item in different states. Note that if `null` is provided, interactions will
-     * still happen internally.
+     *   emitting [Interaction]s for this item. You can use this to change the item's appearance or
+     *   preview the item in different states. Note that if `null` is provided, interactions will
+     *   still happen internally.
      */
     fun item(
         selected: Boolean,
@@ -403,12 +402,14 @@
      */
     fun calculateFromAdaptiveInfo(adaptiveInfo: WindowAdaptiveInfo): NavigationSuiteType {
         return with(adaptiveInfo) {
-            if (windowPosture.isTabletop ||
-                windowSizeClass.windowHeightSizeClass == WindowHeightSizeClass.COMPACT
+            if (
+                windowPosture.isTabletop ||
+                    windowSizeClass.windowHeightSizeClass == WindowHeightSizeClass.COMPACT
             ) {
                 NavigationSuiteType.NavigationBar
-            } else if (windowSizeClass.windowWidthSizeClass == WindowWidthSizeClass.EXPANDED ||
-                windowSizeClass.windowWidthSizeClass == WindowWidthSizeClass.MEDIUM
+            } else if (
+                windowSizeClass.windowWidthSizeClass == WindowWidthSizeClass.EXPANDED ||
+                    windowSizeClass.windowWidthSizeClass == WindowWidthSizeClass.MEDIUM
             ) {
                 NavigationSuiteType.NavigationRail
             } else {
@@ -418,10 +419,12 @@
     }
 
     /** Default container color for a navigation suite scaffold. */
-    val containerColor: Color @Composable get() = MaterialTheme.colorScheme.background
+    val containerColor: Color
+        @Composable get() = MaterialTheme.colorScheme.background
 
     /** Default content color for a navigation suite scaffold. */
-    val contentColor: Color @Composable get() = MaterialTheme.colorScheme.onBackground
+    val contentColor: Color
+        @Composable get() = MaterialTheme.colorScheme.onBackground
 }
 
 /** Contains the default values used by the [NavigationSuite]. */
@@ -440,7 +443,7 @@
      * @param navigationRailContainerColor the default container color for the [NavigationRail]
      * @param navigationRailContentColor the default content color for the [NavigationRail]
      * @param navigationDrawerContainerColor the default container color for the
-     * [PermanentDrawerSheet]
+     *   [PermanentDrawerSheet]
      * @param navigationDrawerContentColor the default content color for the [PermanentDrawerSheet]
      */
     @Composable
@@ -470,11 +473,11 @@
      * [NavigationRailItemColors], and [NavigationDrawerItemColors].
      *
      * @param navigationBarItemColors the [NavigationBarItemColors] associated with the
-     * [NavigationBarItem] of the [NavigationSuiteScope.item]
+     *   [NavigationBarItem] of the [NavigationSuiteScope.item]
      * @param navigationRailItemColors the [NavigationRailItemColors] associated with the
-     * [NavigationRailItem] of the [NavigationSuiteScope.item]
+     *   [NavigationRailItem] of the [NavigationSuiteScope.item]
      * @param navigationDrawerItemColors the [NavigationDrawerItemColors] associated with the
-     * [NavigationDrawerItem] of the [NavigationSuiteScope.item]
+     *   [NavigationDrawerItem] of the [NavigationSuiteScope.item]
      */
     @Composable
     fun itemColors(
@@ -497,17 +500,17 @@
  * [NavigationRailDefaults], and [DrawerDefaults].
  *
  * @param navigationBarContainerColor the container color for the [NavigationBar] of the
- * [NavigationSuite]
+ *   [NavigationSuite]
  * @param navigationBarContentColor the content color for the [NavigationBar] of the
- * [NavigationSuite]
+ *   [NavigationSuite]
  * @param navigationRailContainerColor the container color for the [NavigationRail] of the
- * [NavigationSuite]
+ *   [NavigationSuite]
  * @param navigationRailContentColor the content color for the [NavigationRail] of the
- * [NavigationSuite]
+ *   [NavigationSuite]
  * @param navigationDrawerContainerColor the container color for the [PermanentDrawerSheet] of the
- * [NavigationSuite]
+ *   [NavigationSuite]
  * @param navigationDrawerContentColor the content color for the [PermanentDrawerSheet] of the
- * [NavigationSuite]
+ *   [NavigationSuite]
  */
 class NavigationSuiteColors
 internal constructor(
@@ -526,11 +529,11 @@
  * [NavigationRailItemColors], and [NavigationDrawerItemColors].
  *
  * @param navigationBarItemColors the [NavigationBarItemColors] associated with the
- * [NavigationBarItem] of the [NavigationSuiteScope.item]
+ *   [NavigationBarItem] of the [NavigationSuiteScope.item]
  * @param navigationRailItemColors the [NavigationRailItemColors] associated with the
- * [NavigationRailItem] of the [NavigationSuiteScope.item]
+ *   [NavigationRailItem] of the [NavigationSuiteScope.item]
  * @param navigationDrawerItemColors the [NavigationDrawerItemColors] associated with the
- * [NavigationDrawerItem] of the [NavigationSuiteScope.item]
+ *   [NavigationDrawerItem] of the [NavigationSuiteScope.item]
  */
 class NavigationSuiteItemColors(
     val navigationBarItemColors: NavigationBarItemColors,
@@ -539,8 +542,7 @@
 )
 
 internal val WindowAdaptiveInfoDefault
-    @Composable
-    get() = currentWindowAdaptiveInfo()
+    @Composable get() = currentWindowAdaptiveInfo()
 
 private interface NavigationSuiteItemProvider {
     val itemsCount: Int
@@ -560,8 +562,7 @@
     val interactionSource: MutableInteractionSource?
 )
 
-private class NavigationSuiteScopeImpl : NavigationSuiteScope,
-    NavigationSuiteItemProvider {
+private class NavigationSuiteScopeImpl : NavigationSuiteScope, NavigationSuiteItemProvider {
 
     override fun item(
         selected: Boolean,
@@ -602,9 +603,7 @@
     content: NavigationSuiteScope.() -> Unit
 ): State<NavigationSuiteItemProvider> {
     val latestContent = rememberUpdatedState(content)
-    return remember {
-        derivedStateOf { NavigationSuiteScopeImpl().apply(latestContent.value) }
-    }
+    return remember { derivedStateOf { NavigationSuiteScopeImpl().apply(latestContent.value) } }
 }
 
 @Composable
@@ -613,9 +612,7 @@
     badge: (@Composable () -> Unit)? = null,
 ) {
     if (badge != null) {
-        BadgedBox(badge = { badge.invoke() }) {
-            icon()
-        }
+        BadgedBox(badge = { badge.invoke() }) { icon() }
     } else {
         icon()
     }
diff --git a/compose/material3/material3-common/src/androidInstrumentedTest/kotlin/androidx/compose/material3/IconTest.kt b/compose/material3/material3-common/src/androidInstrumentedTest/kotlin/androidx/compose/material3/IconTest.kt
index 1fb7895..facbea1 100644
--- a/compose/material3/material3-common/src/androidInstrumentedTest/kotlin/androidx/compose/material3/IconTest.kt
+++ b/compose/material3/material3-common/src/androidInstrumentedTest/kotlin/androidx/compose/material3/IconTest.kt
@@ -56,8 +56,7 @@
 @LargeTest
 @RunWith(AndroidJUnit4::class)
 class IconTest {
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
     @Test
     fun vector_materialIconSize_dimensions() {
@@ -65,9 +64,7 @@
         val height = 24.dp
         val vector = Icons.Filled.Menu
         rule
-            .setMaterialContentForSizeAssertions {
-                Icon(vector, null)
-            }
+            .setMaterialContentForSizeAssertions { Icon(vector, null) }
             .assertWidthIsEqualTo(width)
             .assertHeightIsEqualTo(height)
     }
@@ -76,14 +73,16 @@
     fun vector_customIconSize_dimensions() {
         val width = 35.dp
         val height = 83.dp
-        val vector = ImageVector.Builder(
-            defaultWidth = width, defaultHeight = height,
-            viewportWidth = width.value, viewportHeight = height.value
-        ).build()
+        val vector =
+            ImageVector.Builder(
+                    defaultWidth = width,
+                    defaultHeight = height,
+                    viewportWidth = width.value,
+                    viewportHeight = height.value
+                )
+                .build()
         rule
-            .setMaterialContentForSizeAssertions {
-                Icon(vector, null)
-            }
+            .setMaterialContentForSizeAssertions { Icon(vector, null) }
             .assertWidthIsEqualTo(width)
             .assertHeightIsEqualTo(height)
     }
@@ -94,9 +93,10 @@
         val height = 24.dp
         rule
             .setMaterialContentForSizeAssertions {
-                val image = with(LocalDensity.current) {
-                    ImageBitmap(width.roundToPx(), height.roundToPx())
-                }
+                val image =
+                    with(LocalDensity.current) {
+                        ImageBitmap(width.roundToPx(), height.roundToPx())
+                    }
 
                 Icon(image, null)
             }
@@ -111,9 +111,10 @@
 
         rule
             .setMaterialContentForSizeAssertions {
-                val image = with(LocalDensity.current) {
-                    ImageBitmap(width.roundToPx(), height.roundToPx())
-                }
+                val image =
+                    with(LocalDensity.current) {
+                        ImageBitmap(width.roundToPx(), height.roundToPx())
+                    }
 
                 Icon(image, null)
             }
@@ -127,9 +128,7 @@
         val height = 24.dp
         val painter = ColorPainter(Color.Red)
         rule
-            .setMaterialContentForSizeAssertions {
-                Icon(painter, contentDescription = null)
-            }
+            .setMaterialContentForSizeAssertions { Icon(painter, contentDescription = null) }
             .assertWidthIsEqualTo(width)
             .assertHeightIsEqualTo(height)
     }
@@ -141,9 +140,10 @@
 
         rule
             .setMaterialContentForSizeAssertions {
-                val image = with(LocalDensity.current) {
-                    ImageBitmap(width.roundToPx(), height.roundToPx())
-                }
+                val image =
+                    with(LocalDensity.current) {
+                        ImageBitmap(width.roundToPx(), height.roundToPx())
+                    }
 
                 val bitmapPainter = BitmapPainter(image)
                 Icon(bitmapPainter, tint = { Color.Red }, null)
@@ -158,9 +158,7 @@
         val height = 24.dp
         val painter = ColorPainter(Color.Red)
         rule
-            .setMaterialContentForSizeAssertions {
-                Icon(painter, tint = { Color.Red }, null)
-            }
+            .setMaterialContentForSizeAssertions { Icon(painter, tint = { Color.Red }, null) }
             .assertWidthIsEqualTo(width)
             .assertHeightIsEqualTo(height)
     }
@@ -172,9 +170,10 @@
 
         rule
             .setMaterialContentForSizeAssertions {
-                val image = with(LocalDensity.current) {
-                    ImageBitmap(width.roundToPx(), height.roundToPx())
-                }
+                val image =
+                    with(LocalDensity.current) {
+                        ImageBitmap(width.roundToPx(), height.roundToPx())
+                    }
 
                 val bitmapPainter = BitmapPainter(image)
                 Icon(bitmapPainter, null)
@@ -194,12 +193,8 @@
         rule.setMaterialContent(lightColorScheme()) {
             val image: ImageBitmap
             with(LocalDensity.current) {
-                image = createBitmapWithColor(
-                    this,
-                    width.roundToPx(),
-                    height.roundToPx(),
-                    Color.Red
-                )
+                image =
+                    createBitmapWithColor(this, width.roundToPx(), height.roundToPx(), Color.Red)
             }
             Icon(
                 image,
@@ -214,12 +209,11 @@
             }
         }
 
-        rule.onNodeWithTag(testTag)
+        rule
+            .onNodeWithTag(testTag)
             .captureToImage()
             // The icon should be 50x50 and fill the whole size with red pixels
-            .assertPixels(expectedSize = expectedIntSize!!) {
-                Color.Red
-            }
+            .assertPixels(expectedSize = expectedIntSize!!) { Color.Red }
     }
 
     @SdkSuppress(minSdkVersion = Build.VERSION_CODES.O)
@@ -231,12 +225,8 @@
         rule.setMaterialContent(lightColorScheme()) {
             val image: ImageBitmap
             with(LocalDensity.current) {
-                image = createBitmapWithColor(
-                    this,
-                    width.roundToPx(),
-                    height.roundToPx(),
-                    Color.Red
-                )
+                image =
+                    createBitmapWithColor(this, width.roundToPx(), height.roundToPx(), Color.Red)
             }
             Icon(image, null, modifier = Modifier.testTag(testTag), tint = Color.Unspecified)
         }
@@ -254,12 +244,8 @@
         rule.setMaterialContent(lightColorScheme()) {
             val image: ImageBitmap
             with(LocalDensity.current) {
-                image = createBitmapWithColor(
-                    this,
-                    width.roundToPx(),
-                    height.roundToPx(),
-                    Color.Red
-                )
+                image =
+                    createBitmapWithColor(this, width.roundToPx(), height.roundToPx(), Color.Red)
             }
             Icon(image, null, modifier = Modifier.testTag(testTag), tint = Color.Blue)
         }
@@ -279,7 +265,8 @@
             )
         }
 
-        rule.onNodeWithTag(testTag)
+        rule
+            .onNodeWithTag(testTag)
             .assertContentDescriptionEquals("qwerty")
             .assert(SemanticsMatcher.expectValue(SemanticsProperties.Role, Role.Image))
     }
@@ -292,12 +279,7 @@
     ): ImageBitmap {
         val size = Size(width.toFloat(), height.toFloat())
         val image = ImageBitmap(width, height)
-        CanvasDrawScope().draw(
-            density,
-            LayoutDirection.Ltr,
-            Canvas(image),
-            size
-        ) {
+        CanvasDrawScope().draw(density, LayoutDirection.Ltr, Canvas(image), size) {
             drawRect(color)
         }
         return image
diff --git a/compose/material3/material3-common/src/androidInstrumentedTest/kotlin/androidx/compose/material3/MaterialTest.kt b/compose/material3/material3-common/src/androidInstrumentedTest/kotlin/androidx/compose/material3/MaterialTest.kt
index 48e13fd..3bf41f0 100644
--- a/compose/material3/material3-common/src/androidInstrumentedTest/kotlin/androidx/compose/material3/MaterialTest.kt
+++ b/compose/material3/material3-common/src/androidInstrumentedTest/kotlin/androidx/compose/material3/MaterialTest.kt
@@ -37,7 +37,7 @@
  * Wraps Compose content in a [MaterialTheme] and a [Surface].
  *
  * @param colorScheme a [ColorScheme] to provide to the theme. Usually a [lightColorScheme],
- * [darkColorScheme], or a dynamic one
+ *   [darkColorScheme], or a dynamic one
  * @param modifier a [Modifier] to be applied at the [Surface] wrapper
  */
 fun ComposeContentTestRule.setMaterialContent(
@@ -54,13 +54,12 @@
     }
 }
 
-private val WindowInfoFocused = object : WindowInfo {
-    override val isWindowFocused = true
-}
+private val WindowInfoFocused =
+    object : WindowInfo {
+        override val isWindowFocused = true
+    }
 
-/**
- * Constant to emulate very big but finite constraints
- */
+/** Constant to emulate very big but finite constraints */
 val BigTestMaxWidth = 5000.dp
 val BigTestMaxHeight = 5000.dp
 
@@ -75,10 +74,8 @@
             Surface {
                 Box {
                     Box(
-                        Modifier.sizeIn(
-                            maxWidth = parentMaxWidth,
-                            maxHeight = parentMaxHeight
-                        ).testTag("containerForSizeAssertion")
+                        Modifier.sizeIn(maxWidth = parentMaxWidth, maxHeight = parentMaxHeight)
+                            .testTag("containerForSizeAssertion")
                     ) {
                         content()
                     }
diff --git a/compose/material3/material3-common/src/commonMain/kotlin/androidx/compose/material3/common/Icon.kt b/compose/material3/material3-common/src/commonMain/kotlin/androidx/compose/material3/common/Icon.kt
index f219c21..6cdaa93 100644
--- a/compose/material3/material3-common/src/commonMain/kotlin/androidx/compose/material3/common/Icon.kt
+++ b/compose/material3/material3-common/src/commonMain/kotlin/androidx/compose/material3/common/Icon.kt
@@ -43,23 +43,24 @@
 
 /**
  * A Material Design icon component that draws [imageVector] using [tint], with an optional tint
- * color. If [imageVector] has no intrinsic size, this component will use the
- * recommended default size. Icon is an opinionated component designed to be used with single-color
- * icons so that they can be tinted correctly for the component they are placed in. For multicolored
- * icons and icons that should not be tinted, use null for [tint]. For generic images
- * that should not be tinted, and do not follow the recommended icon size, use the generic
- * [androidx.compose.foundation.Image] instead. For a clickable icon, see [IconButton].
+ * color. If [imageVector] has no intrinsic size, this component will use the recommended default
+ * size. Icon is an opinionated component designed to be used with single-color icons so that they
+ * can be tinted correctly for the component they are placed in. For multicolored icons and icons
+ * that should not be tinted, use null for [tint]. For generic images that should not be tinted, and
+ * do not follow the recommended icon size, use the generic [androidx.compose.foundation.Image]
+ * instead. For a clickable icon, see [IconButton].
  *
- * To learn more about icons, see [Material Design icons](https://m3.material.io/styles/icons/overview)
+ * To learn more about icons, see
+ * [Material Design icons](https://m3.material.io/styles/icons/overview)
  *
  * @param imageVector [ImageVector] to draw inside this icon
  * @param contentDescription text used by accessibility services to describe what this icon
- * represents. This should always be provided unless this icon is used for decorative purposes, and
- * does not represent a meaningful action that a user can take. This text should be localized, such
- * as by using [androidx.compose.ui.res.stringResource] or similar
+ *   represents. This should always be provided unless this icon is used for decorative purposes,
+ *   and does not represent a meaningful action that a user can take. This text should be localized,
+ *   such as by using [androidx.compose.ui.res.stringResource] or similar
  * @param modifier the [Modifier] to be applied to this icon
  * @param tint tint to be applied to [imageVector]. If [Color.Unspecified] is provided, then no tint
- * is applied.
+ *   is applied.
  *
  * @sample androidx.compose.material3.common.samples.IconSample
  */
@@ -79,24 +80,25 @@
 }
 
 /**
- * A Material Design icon component that draws [bitmap] using [tint], with an optional tint
- * color. If [bitmap] has no intrinsic size, this component will use the recommended default size.
- * Icon is an opinionated component designed to be used with single-color icons so that they can be
- * tinted correctly for the component they are placed in. For multicolored icons and icons that
- * should not be tinted, use [Color.Unspecified] for [tint]. For generic images that should not be
- * tinted, and do not follow the recommended icon size, use the generic
- * [androidx.compose.foundation.Image] instead. For a clickable icon, see [IconButton].
+ * A Material Design icon component that draws [bitmap] using [tint], with an optional tint color.
+ * If [bitmap] has no intrinsic size, this component will use the recommended default size. Icon is
+ * an opinionated component designed to be used with single-color icons so that they can be tinted
+ * correctly for the component they are placed in. For multicolored icons and icons that should not
+ * be tinted, use [Color.Unspecified] for [tint]. For generic images that should not be tinted, and
+ * do not follow the recommended icon size, use the generic [androidx.compose.foundation.Image]
+ * instead. For a clickable icon, see [IconButton].
  *
- * To learn more about icons, see [Material Design icons](https://m3.material.io/styles/icons/overview)
+ * To learn more about icons, see
+ * [Material Design icons](https://m3.material.io/styles/icons/overview)
  *
  * @param bitmap [ImageBitmap] to draw inside this icon
  * @param contentDescription text used by accessibility services to describe what this icon
- * represents. This should always be provided unless this icon is used for decorative purposes, and
- * does not represent a meaningful action that a user can take. This text should be localized, such
- * as by using [androidx.compose.ui.res.stringResource] or similar
+ *   represents. This should always be provided unless this icon is used for decorative purposes,
+ *   and does not represent a meaningful action that a user can take. This text should be localized,
+ *   such as by using [androidx.compose.ui.res.stringResource] or similar
  * @param modifier the [Modifier] to be applied to this icon
  * @param tint tint to be applied to [bitmap]. If [Color.Unspecified] is provided, then no tint is
- * applied.
+ *   applied.
  */
 @Composable
 fun Icon(
@@ -115,24 +117,25 @@
 }
 
 /**
- * A Material Design icon component that draws [painter] using [tint], with an optional tint
- * color. If [painter] has no intrinsic size, this component will use the recommended default size.
- * Icon is an opinionated component designed to be used with single-color icons so that they can be
- * tinted correctly for the component they are placed in. For multicolored icons and icons that
- * should not be tinted, use [Color.Unspecified] for [tint]. For generic images that should not be
- * tinted, and do not follow the recommended icon size, use the generic
- * [androidx.compose.foundation.Image] instead. For a clickable icon, see [IconButton].
+ * A Material Design icon component that draws [painter] using [tint], with an optional tint color.
+ * If [painter] has no intrinsic size, this component will use the recommended default size. Icon is
+ * an opinionated component designed to be used with single-color icons so that they can be tinted
+ * correctly for the component they are placed in. For multicolored icons and icons that should not
+ * be tinted, use [Color.Unspecified] for [tint]. For generic images that should not be tinted, and
+ * do not follow the recommended icon size, use the generic [androidx.compose.foundation.Image]
+ * instead. For a clickable icon, see [IconButton].
  *
- * To learn more about icons, see [Material Design icons](https://m3.material.io/styles/icons/overview)
+ * To learn more about icons, see
+ * [Material Design icons](https://m3.material.io/styles/icons/overview)
  *
  * @param painter [Painter] to draw inside this icon
  * @param contentDescription text used by accessibility services to describe what this icon
- * represents. This should always be provided unless this icon is used for decorative purposes, and
- * does not represent a meaningful action that a user can take. This text should be localized, such
- * as by using [androidx.compose.ui.res.stringResource] or similar
+ *   represents. This should always be provided unless this icon is used for decorative purposes,
+ *   and does not represent a meaningful action that a user can take. This text should be localized,
+ *   such as by using [androidx.compose.ui.res.stringResource] or similar
  * @param modifier the [Modifier] to be applied to this icon
  * @param tint tint to be applied to [painter]. If [Color.Unspecified] is provided, then no tint is
- * applied.
+ *   applied.
  */
 @Composable
 fun Icon(
@@ -141,9 +144,8 @@
     modifier: Modifier = Modifier,
     tint: Color = Color.Unspecified,
 ) {
-    val colorFilter = remember(tint) {
-        if (tint == Color.Unspecified) null else ColorFilter.tint(tint)
-    }
+    val colorFilter =
+        remember(tint) { if (tint == Color.Unspecified) null else ColorFilter.tint(tint) }
     val semantics =
         if (contentDescription != null) {
             Modifier.semantics {
@@ -163,21 +165,22 @@
 }
 
 /**
- * A Material Design icon component that draws [painter] using [tint], with an optional tint
- * color. If [painter] has no intrinsic size, this component will use the recommended default size.
- * Icon is an opinionated component designed to be used with single-color icons so that they can be
- * tinted correctly for the component they are placed in. For multicolored icons and icons that
- * should not be tinted, use [Color.Unspecified] for [tint]. For generic images that should not be
- * tinted, and do not follow the recommended icon size, use the generic
- * [androidx.compose.foundation.Image] instead. For a clickable icon, see [IconButton].
+ * A Material Design icon component that draws [painter] using [tint], with an optional tint color.
+ * If [painter] has no intrinsic size, this component will use the recommended default size. Icon is
+ * an opinionated component designed to be used with single-color icons so that they can be tinted
+ * correctly for the component they are placed in. For multicolored icons and icons that should not
+ * be tinted, use [Color.Unspecified] for [tint]. For generic images that should not be tinted, and
+ * do not follow the recommended icon size, use the generic [androidx.compose.foundation.Image]
+ * instead. For a clickable icon, see [IconButton].
  *
- * To learn more about icons, see [Material Design icons](https://m3.material.io/styles/icons/overview)
+ * To learn more about icons, see
+ * [Material Design icons](https://m3.material.io/styles/icons/overview)
  *
  * @param painter [Painter] to draw inside this icon
  * @param contentDescription text used by accessibility services to describe what this icon
- * represents. This should always be provided unless this icon is used for decorative purposes, and
- * does not represent a meaningful action that a user can take. This text should be localized, such
- * as by using [androidx.compose.ui.res.stringResource] or similar
+ *   represents. This should always be provided unless this icon is used for decorative purposes,
+ *   and does not represent a meaningful action that a user can take. This text should be localized,
+ *   such as by using [androidx.compose.ui.res.stringResource] or similar
  * @param modifier the [Modifier] to be applied to this icon
  * @param tint tint to be applied to [painter]. If null, then no tint is applied.
  */
@@ -205,9 +208,7 @@
                 val tintColorVal = tint?.invoke() ?: Color.Unspecified
                 val colorFilter =
                     if (tintColorVal == Color.Unspecified) null else ColorFilter.tint(tintColorVal)
-                with(painter) {
-                    draw(size = size, colorFilter = colorFilter)
-                }
+                with(painter) { draw(size = size, colorFilter = colorFilter) }
             }
             .then(semantics)
     )
@@ -226,9 +227,7 @@
             Modifier.layout { measurable, _ ->
                 val placeable =
                     measurable.measure(Constraints.fixed(srcWidth.toInt(), srcHeight.toInt()))
-                layout(placeable.width, placeable.height) {
-                    placeable.place(0, 0)
-                }
+                layout(placeable.width, placeable.height) { placeable.place(0, 0) }
             }
         }
     )
diff --git a/compose/material3/material3-common/src/commonMain/kotlin/androidx/compose/material3/common/InteractiveComponentSize.kt b/compose/material3/material3-common/src/commonMain/kotlin/androidx/compose/material3/common/InteractiveComponentSize.kt
index 363de05..89e7dfb5 100644
--- a/compose/material3/material3-common/src/commonMain/kotlin/androidx/compose/material3/common/InteractiveComponentSize.kt
+++ b/compose/material3/material3-common/src/commonMain/kotlin/androidx/compose/material3/common/InteractiveComponentSize.kt
@@ -52,8 +52,7 @@
 @Stable
 fun Modifier.minimumInteractiveComponentSize(): Modifier = this then MinimumInteractiveModifier
 
-internal object MinimumInteractiveModifier :
-    ModifierNodeElement<MinimumInteractiveModifierNode>() {
+internal object MinimumInteractiveModifier : ModifierNodeElement<MinimumInteractiveModifierNode>() {
 
     override fun create(): MinimumInteractiveModifierNode = MinimumInteractiveModifierNode()
 
@@ -63,18 +62,18 @@
         name = "minimumInteractiveComponentSize"
         // TODO: b/214589635 - surface this information through the layout inspector in a better way
         //  - for now just add some information to help developers debug what this size represents.
-        properties["README"] = "Reserves at least 48.dp in size to disambiguate touch " +
-            "interactions if the element would measure smaller"
+        properties["README"] =
+            "Reserves at least 48.dp in size to disambiguate touch " +
+                "interactions if the element would measure smaller"
     }
 
     override fun hashCode(): Int = System.identityHashCode(this)
+
     override fun equals(other: Any?) = (other === this)
 }
 
 internal class MinimumInteractiveModifierNode :
-    Modifier.Node(),
-    CompositionLocalConsumerModifierNode,
-    LayoutModifierNode {
+    Modifier.Node(), CompositionLocalConsumerModifierNode, LayoutModifierNode {
     override fun MeasureScope.measure(
         measurable: Measurable,
         constraints: Constraints
@@ -85,16 +84,18 @@
 
         val sizePx = if (size.isSpecified) size.roundToPx() else 0
         // Be at least as big as the minimum dimension in both dimensions
-        val width = if (enforcement) {
-            maxOf(placeable.width, sizePx)
-        } else {
-            placeable.width
-        }
-        val height = if (enforcement) {
-            maxOf(placeable.height, sizePx)
-        } else {
-            placeable.height
-        }
+        val width =
+            if (enforcement) {
+                maxOf(placeable.width, sizePx)
+            } else {
+                placeable.width
+            }
+        val height =
+            if (enforcement) {
+                maxOf(placeable.height, sizePx)
+            } else {
+                placeable.height
+            }
 
         return layout(width, height) {
             val centerX = ((width - placeable.width) / 2f).roundToInt()
@@ -105,12 +106,14 @@
 }
 
 /**
- * CompositionLocal that configures the minimum touch target size for Material components
- * (such as [Button]) to ensure they are accessible. If a component has a visual size
- * that is lower than the minimum touch target size, extra space outside the component will be
- * included. If set to [Dp.Unspecified] there will be no extra space, and so it is possible that if the
- * component is placed near the edge of a layout / near to another component without any padding,
- * there will not be enough space for an accessible touch target.
+ * CompositionLocal that configures the minimum touch target size for Material components (such as
+ * [Button]) to ensure they are accessible. If a component has a visual size that is lower than the
+ * minimum touch target size, extra space outside the component will be included. If set to
+ * [Dp.Unspecified] there will be no extra space, and so it is possible that if the component is
+ * placed near the edge of a layout / near to another component without any padding, there will not
+ * be enough space for an accessible touch target.
  */
 val LocalMinimumInteractiveComponentSize: ProvidableCompositionLocal<Dp> =
-    staticCompositionLocalOf { 48.dp }
+    staticCompositionLocalOf {
+        48.dp
+    }
diff --git a/compose/material3/material3-common/src/commonMain/kotlin/androidx/compose/material3/common/TonalPalette.kt b/compose/material3/material3-common/src/commonMain/kotlin/androidx/compose/material3/common/TonalPalette.kt
index 4326a8d..b25913c 100644
--- a/compose/material3/material3-common/src/commonMain/kotlin/androidx/compose/material3/common/TonalPalette.kt
+++ b/compose/material3/material3-common/src/commonMain/kotlin/androidx/compose/material3/common/TonalPalette.kt
@@ -23,8 +23,8 @@
 /**
  * Tonal Palette structure in Material.
  *
- * A tonal palette is comprised of 5 tonal ranges. Each tonal range includes the 13 stops, or
- * tonal swatches.
+ * A tonal palette is comprised of 5 tonal ranges. Each tonal range includes the 13 stops, or tonal
+ * swatches.
  *
  * Tonal range names are:
  * - Neutral (N)
@@ -139,9 +139,7 @@
 )
 
 object TonalPaletteDefaults {
-    /**
-     * Baseline colors in Material.
-     */
+    /** Baseline colors in Material. */
     @Stable
     val BaselineTonalPalette =
         TonalPalette(
diff --git a/compose/material3/material3-lint/src/main/java/androidx/compose/material3/lint/Material3IssueRegistry.kt b/compose/material3/material3-lint/src/main/java/androidx/compose/material3/lint/Material3IssueRegistry.kt
index cb3ad66..7891f7a 100644
--- a/compose/material3/material3-lint/src/main/java/androidx/compose/material3/lint/Material3IssueRegistry.kt
+++ b/compose/material3/material3-lint/src/main/java/androidx/compose/material3/lint/Material3IssueRegistry.kt
@@ -20,20 +20,22 @@
 import com.android.tools.lint.client.api.Vendor
 import com.android.tools.lint.detector.api.CURRENT_API
 
-/**
- * [IssueRegistry] containing Material3 specific lint issues.
- */
+/** [IssueRegistry] containing Material3 specific lint issues. */
 class Material3IssueRegistry : IssueRegistry() {
     // Tests are run with this version. We ensure that with ApiLintVersionsTest
     override val api = 14
     override val minApi = CURRENT_API
-    override val issues get() = listOf(
-        MaterialImportDetector.UsingMaterialAndMaterial3Libraries,
-        ScaffoldPaddingDetector.UnusedMaterial3ScaffoldPaddingParameter
-    )
-    override val vendor = Vendor(
-        vendorName = "Jetpack Compose",
-        identifier = "androidx.compose.material3",
-        feedbackUrl = "https://issuetracker.google.com/issues/new?component=612128"
-    )
+    override val issues
+        get() =
+            listOf(
+                MaterialImportDetector.UsingMaterialAndMaterial3Libraries,
+                ScaffoldPaddingDetector.UnusedMaterial3ScaffoldPaddingParameter
+            )
+
+    override val vendor =
+        Vendor(
+            vendorName = "Jetpack Compose",
+            identifier = "androidx.compose.material3",
+            feedbackUrl = "https://issuetracker.google.com/issues/new?component=612128"
+        )
 }
diff --git a/compose/material3/material3-lint/src/main/java/androidx/compose/material3/lint/Material3Names.kt b/compose/material3/material3-lint/src/main/java/androidx/compose/material3/lint/Material3Names.kt
index 733fd2e..3ec8e1f 100644
--- a/compose/material3/material3-lint/src/main/java/androidx/compose/material3/lint/Material3Names.kt
+++ b/compose/material3/material3-lint/src/main/java/androidx/compose/material3/lint/Material3Names.kt
@@ -18,9 +18,7 @@
 
 import androidx.compose.lint.Package
 
-/**
- * Contains common names used for Material3 lint checks.
- */
+/** Contains common names used for Material3 lint checks. */
 object Material3Names {
     object Material3 {
         val PackageName = Package("androidx.compose.material3")
diff --git a/compose/material3/material3-lint/src/main/java/androidx/compose/material3/lint/MaterialImportDetector.kt b/compose/material3/material3-lint/src/main/java/androidx/compose/material3/lint/MaterialImportDetector.kt
index b7ee362..64b124e 100644
--- a/compose/material3/material3-lint/src/main/java/androidx/compose/material3/lint/MaterialImportDetector.kt
+++ b/compose/material3/material3-lint/src/main/java/androidx/compose/material3/lint/MaterialImportDetector.kt
@@ -37,66 +37,72 @@
 class MaterialImportDetector : Detector(), SourceCodeScanner {
     override fun getApplicableUastTypes() = listOf(UImportStatement::class.java)
 
-    override fun createUastHandler(context: JavaContext) = object : UElementHandler() {
-        // Currently we only check for imports, not FQN references - if a developer is
-        // explicitly doing androidx.compose.material.Button() in their code it's probably
-        // intentional.
-        override fun visitImportStatement(node: UImportStatement) {
-            val reference = node.importReference ?: return
-            val importString = reference.asSourceString()
+    override fun createUastHandler(context: JavaContext) =
+        object : UElementHandler() {
+            // Currently we only check for imports, not FQN references - if a developer is
+            // explicitly doing androidx.compose.material.Button() in their code it's probably
+            // intentional.
+            override fun visitImportStatement(node: UImportStatement) {
+                val reference = node.importReference ?: return
+                val importString = reference.asSourceString()
 
-            if (
-                // Wildcard reference - so the import string is exactly androidx.compose.material
-                importString == MaterialPackage ||
-                // The prefix is androidx.compose.material - ignore material3* and other prefixes
-                importString.contains("$MaterialPackage.")
-            ) {
-                // Ignore explicitly allowed imports
-                if (AllowlistedSubpackages.any { importString.contains(it) }) return
-                if (AllowlistedImports.any { importString == it }) return
+                if (
+                    // Wildcard reference - so the import string is exactly
+                    // androidx.compose.material
+                    importString == MaterialPackage ||
+                        // The prefix is androidx.compose.material - ignore material3* and other
+                        // prefixes
+                        importString.contains("$MaterialPackage.")
+                ) {
+                    // Ignore explicitly allowed imports
+                    if (AllowlistedSubpackages.any { importString.contains(it) }) return
+                    if (AllowlistedImports.any { importString == it }) return
 
-                context.report(
-                    UsingMaterialAndMaterial3Libraries,
-                    reference,
-                    context.getLocation(reference),
-                    "Using a material import while also using the material3 library"
-                )
+                    context.report(
+                        UsingMaterialAndMaterial3Libraries,
+                        reference,
+                        context.getLocation(reference),
+                        "Using a material import while also using the material3 library"
+                    )
+                }
             }
         }
-    }
 
     companion object {
-        val UsingMaterialAndMaterial3Libraries = Issue.create(
-            "UsingMaterialAndMaterial3Libraries",
-            "material and material3 are separate, incompatible design system libraries",
-            "material and material3 are separate design system libraries that are " +
-                "incompatible with each other, as they have their own distinct theming systems. " +
-                "Using components from both libraries concurrently can cause issues: for example " +
-                "material components will not pick up the correct content color from a material3 " +
-                "container, and vice versa.",
-            Category.CORRECTNESS, 3, Severity.WARNING,
-            Implementation(
-                MaterialImportDetector::class.java,
-                EnumSet.of(Scope.JAVA_FILE, Scope.TEST_SOURCES)
+        val UsingMaterialAndMaterial3Libraries =
+            Issue.create(
+                "UsingMaterialAndMaterial3Libraries",
+                "material and material3 are separate, incompatible design system libraries",
+                "material and material3 are separate design system libraries that are " +
+                    "incompatible with each other, as they have their own distinct theming systems. " +
+                    "Using components from both libraries concurrently can cause issues: for example " +
+                    "material components will not pick up the correct content color from a material3 " +
+                    "container, and vice versa.",
+                Category.CORRECTNESS,
+                3,
+                Severity.WARNING,
+                Implementation(
+                    MaterialImportDetector::class.java,
+                    EnumSet.of(Scope.JAVA_FILE, Scope.TEST_SOURCES)
+                )
             )
-        )
     }
 }
 
 private const val MaterialPackage = "androidx.compose.material"
 
-private val AllowlistedSubpackages = listOf(
-    // material-icons is a separate library that is compatible with both
-    "$MaterialPackage.icons",
-    // material-ripple is a separate library that is compatible with both
-    "$MaterialPackage.ripple",
-    // TODO: b/261760718 - remove this when pullrefresh is added to m3
-    // pullrefresh currently only exists in m2, so there is no alternative for m3, so temporarily
-    // ignore
-    "$MaterialPackage.pullrefresh"
-)
+private val AllowlistedSubpackages =
+    listOf(
+        // material-icons is a separate library that is compatible with both
+        "$MaterialPackage.icons",
+        // material-ripple is a separate library that is compatible with both
+        "$MaterialPackage.ripple",
+        // TODO: b/261760718 - remove this when pullrefresh is added to m3
+        // pullrefresh currently only exists in m2, so there is no alternative for m3, so
+        // temporarily
+        // ignore
+        "$MaterialPackage.pullrefresh"
+    )
 
 // TODO: b/261760718 - remove this when pullrefresh is added to m3
-private val AllowlistedImports = listOf(
-    "$MaterialPackage.ExperimentalMaterialApi"
-)
+private val AllowlistedImports = listOf("$MaterialPackage.ExperimentalMaterialApi")
diff --git a/compose/material3/material3-lint/src/main/java/androidx/compose/material3/lint/ScaffoldPaddingDetector.kt b/compose/material3/material3-lint/src/main/java/androidx/compose/material3/lint/ScaffoldPaddingDetector.kt
index 6071065..d3a508c 100644
--- a/compose/material3/material3-lint/src/main/java/androidx/compose/material3/lint/ScaffoldPaddingDetector.kt
+++ b/compose/material3/material3-lint/src/main/java/androidx/compose/material3/lint/ScaffoldPaddingDetector.kt
@@ -37,27 +37,26 @@
 /**
  * [Detector] that checks `Scaffold` usages for correctness.
  *
- * Scaffold provides an padding parameter to the `content` lambda. If this value is unused,
- * then the content may be obscured by app bars defined by the scaffold.
+ * Scaffold provides an padding parameter to the `content` lambda. If this value is unused, then the
+ * content may be obscured by app bars defined by the scaffold.
  */
 class ScaffoldPaddingDetector : Detector(), SourceCodeScanner {
     override fun getApplicableMethodNames(): List<String> = listOf(Scaffold.shortName)
 
     override fun visitMethodCall(context: JavaContext, node: UCallExpression, method: PsiMethod) {
         if (method.isInPackageName(Material3.PackageName)) {
-            val contentArgument = computeKotlinArgumentMapping(node, method)
-                .orEmpty()
-                .filter { (_, parameter) ->
-                    parameter.name == "content"
-                }
-                .keys
-                .filterIsInstance<ULambdaExpression>()
-                .firstOrNull() ?: return
+            val contentArgument =
+                computeKotlinArgumentMapping(node, method)
+                    .orEmpty()
+                    .filter { (_, parameter) -> parameter.name == "content" }
+                    .keys
+                    .filterIsInstance<ULambdaExpression>()
+                    .firstOrNull() ?: return
 
             contentArgument.findUnreferencedParameters().forEach { unreferencedParameter ->
-                val location = unreferencedParameter.parameter
-                    ?.let { context.getLocation(it) }
-                    ?: context.getLocation(contentArgument)
+                val location =
+                    unreferencedParameter.parameter?.let { context.getLocation(it) }
+                        ?: context.getLocation(contentArgument)
                 val name = unreferencedParameter.name
                 context.report(
                     UnusedMaterial3ScaffoldPaddingParameter,
@@ -70,19 +69,22 @@
     }
 
     companion object {
-        val UnusedMaterial3ScaffoldPaddingParameter = Issue.create(
-            "UnusedMaterial3ScaffoldPaddingParameter",
-            "Scaffold content should use the padding provided as a lambda parameter",
-            "The `content` lambda in Scaffold has a padding parameter " +
-                "which will include any inner padding for the content due to app bars. If this " +
-                "parameter is ignored, then content may be obscured by the app bars resulting in " +
-                "visual issues or elements that can't be interacted with.",
-            Category.CORRECTNESS, 3, Severity.ERROR,
-            Implementation(
-                ScaffoldPaddingDetector::class.java,
-                EnumSet.of(Scope.JAVA_FILE, Scope.TEST_SOURCES)
+        val UnusedMaterial3ScaffoldPaddingParameter =
+            Issue.create(
+                "UnusedMaterial3ScaffoldPaddingParameter",
+                "Scaffold content should use the padding provided as a lambda parameter",
+                "The `content` lambda in Scaffold has a padding parameter " +
+                    "which will include any inner padding for the content due to app bars. If this " +
+                    "parameter is ignored, then content may be obscured by the app bars resulting in " +
+                    "visual issues or elements that can't be interacted with.",
+                Category.CORRECTNESS,
+                3,
+                Severity.ERROR,
+                Implementation(
+                    ScaffoldPaddingDetector::class.java,
+                    EnumSet.of(Scope.JAVA_FILE, Scope.TEST_SOURCES)
+                )
             )
-        )
     }
 }
 
diff --git a/compose/material3/material3-lint/src/test/java/androidx/compose/material3/lint/MaterialImportDetectorTest.kt b/compose/material3/material3-lint/src/test/java/androidx/compose/material3/lint/MaterialImportDetectorTest.kt
index 32e0cb6..7b6a865 100644
--- a/compose/material3/material3-lint/src/test/java/androidx/compose/material3/lint/MaterialImportDetectorTest.kt
+++ b/compose/material3/material3-lint/src/test/java/androidx/compose/material3/lint/MaterialImportDetectorTest.kt
@@ -29,32 +29,31 @@
 /* ktlint-disable max-line-length */
 @RunWith(JUnit4::class)
 
-/**
- * Test for [MaterialImportDetector].
- */
+/** Test for [MaterialImportDetector]. */
 class MaterialImportDetectorTest : LintDetectorTest() {
     override fun getDetector(): Detector = MaterialImportDetector()
 
     override fun getIssues(): MutableList<Issue> =
         mutableListOf(MaterialImportDetector.UsingMaterialAndMaterial3Libraries)
 
-    private val MaterialButtonStub = bytecodeStub(
-        filename = "Button.kt",
-        filepath = "androidx/compose/material",
-        checksum = 0x3ab9ae7,
-        """
+    private val MaterialButtonStub =
+        bytecodeStub(
+            filename = "Button.kt",
+            filepath = "androidx/compose/material",
+            checksum = 0x3ab9ae7,
+            """
             package androidx.compose.material
 
             fun Button() {}
         """,
-"""
+            """
         META-INF/main.kotlin_module:
         H4sIAAAAAAAA/2NgYGBmYGBgBGJOBijgUuWSTMxLKcrPTKnQS87PLcgvTtXL
         TSxJLcpMzBHicCotKcnP8y7hMuNSxalMr6A0J6coNa0otThDiDcAyAmCcID6
         dLgUcOsryiwoyEkV4ggC00DValxSOFUbI7mGl4s5LT9fiC0ktbjEu0SJQYsB
         AAY211PcAAAA
         """,
-        """
+            """
         androidx/compose/material/ButtonKt.class:
         H4sIAAAAAAAA/yVOu07DQBCcPScOMY84hJdTUkGDE0RHBUhIFgEkQGlSXeIT
         usS+Q/Y5SplfoqVAqfkoxB3eYnZ2Zla7P79f3wCuEBFOuUoLLdNVPNP5hy5F
@@ -64,13 +63,14 @@
         1r1RShtupFYlhmBooH4nQhO+7Yd2ilAXff5bRxadBRtmOHZf4wAntg+t2rKL
         WxN4CdoJggTb2Emwi70EHYQTUIku9idgJZolen+absHWdwEAAA==
         """
-    )
+        )
 
-    private val ExperimentalMaterialApiStub = bytecodeStub(
-        filename = "ExperimentalMaterialApi.kt",
-        filepath = "androidx/compose/material",
-        checksum = 0x4808c29,
-        """
+    private val ExperimentalMaterialApiStub =
+        bytecodeStub(
+            filename = "ExperimentalMaterialApi.kt",
+            filepath = "androidx/compose/material",
+            checksum = 0x4808c29,
+            """
             package androidx.compose.material
 
             @RequiresOptIn(
@@ -80,14 +80,14 @@
             @Retention(AnnotationRetention.BINARY)
             annotation class ExperimentalMaterialApi
         """,
-"""
+            """
         META-INF/main.kotlin_module:
         H4sIAAAAAAAA/2NgYGBmYGBgBGJOBijgUuWSTMxLKcrPTKnQS87PLcgvTtXL
         TSxJLcpMzBHicCotKcnP8y7hMuNSxalMr6A0J6coNa0otThDiDcAyAmCcID6
         dLgUcOsryiwoyEkV4ggC00DValxSOFUbI7mGl4s5LT9fiC0ktbjEu0SJQYsB
         AAY211PcAAAA
         """,
-        """
+            """
         androidx/compose/material/ExperimentalMaterialApi.class:
         H4sIAAAAAAAA/5VSTW8TMRB93pAmTflIC5SkodRwaG/dtnDjtEWAVkpplSCk
         KicnGRo3u+uw9kbpLTf+EwcUceRHIWZFQyJRhLiM38x79ryx/f3Hl68AXuCZ
@@ -101,25 +101,26 @@
         4Qkkr285rzC3RriNO7j7C95DFesoYqODQoj7IR6EeIhNhngUooZ6B8JiC40O
         PIvHFtt4yoet8W7+0ihbrP4EIBEHSxkDAAA=
         """
-    )
+        )
 
-    private val Material3ButtonStub = bytecodeStub(
-        filename = "Button.kt",
-        filepath = "androidx/compose/material3",
-        checksum = 0x314468f6,
-        """
+    private val Material3ButtonStub =
+        bytecodeStub(
+            filename = "Button.kt",
+            filepath = "androidx/compose/material3",
+            checksum = 0x314468f6,
+            """
             package androidx.compose.material3
 
             fun Button() {}
         """,
-"""
+            """
         META-INF/main.kotlin_module:
         H4sIAAAAAAAA/2NgYGBmYGBgBGJOBijgUuWSTMxLKcrPTKnQS87PLcgvTtXL
         TSxJLcpMzBHicCotKcnP8y7hMuNSxalMr6A0J6coNa0otThDiDcAyAmCcID6
         dLgUcOsryiwoyEkV4ggC00DValxSOFUbI7mGl4s5LT9fiC0ktbjEu0SJQYsB
         AAY211PcAAAA
         """,
-        """
+            """
         androidx/compose/material3/ButtonKt.class:
         H4sIAAAAAAAA/yVOu07DQBCcPScOMY84hJfT0kCDE6CjAiQkiwASoDSpLvEJ
         HbHvkH2OUuaXaClQaj4KcYe3mJ2dmdXuz+/XN4BLRIRjrtJCy3QZz3T+oUsR
@@ -129,25 +130,26 @@
         lNa9VkobbqRWJYZgaKB+J0ITvu37dopQF33+WwcWnQUbZjh0X2MPR7YPrdqy
         ixsTeAnaCYIEm9hKsI2dBB2EE1CJLnYnYCWaJXp/zsaw43gBAAA=
         """
-    )
+        )
 
-    private val RippleStub = bytecodeStub(
-        filename = "Ripple.kt",
-        filepath = "androidx/compose/material/ripple",
-        checksum = 0x691c7742,
-        """
+    private val RippleStub =
+        bytecodeStub(
+            filename = "Ripple.kt",
+            filepath = "androidx/compose/material/ripple",
+            checksum = 0x691c7742,
+            """
             package androidx.compose.material.ripple
 
             fun rememberRipple() {}
         """,
-"""
+            """
         META-INF/main.kotlin_module:
         H4sIAAAAAAAA/2NgYGBmYGBgBGJOBijgUuWSTMxLKcrPTKnQS87PLcgvTtXL
         TSxJLcpMzBHicCotKcnP8y7hMuNSxalMr6A0J6coNa0otThDiDcAyAmCcID6
         dLgUcOsryiwoyEkV4ggC00DValxSOFUbI7mGl4s5LT9fiC0ktbjEu0SJQYsB
         AAY211PcAAAA
         """,
-        """
+            """
         androidx/compose/material/ripple/RippleKt.class:
         H4sIAAAAAAAA/yVOTU/CQBB9s+VDqkIRv8ovkIsF4s2TMTFpRE3QcOG00I1Z
         aHdJuxCO/CWvHgxnf5Rxl87hvZl5M3nv9+/7B8AdQkKPqyTXMtlGc52tdCGi
@@ -159,23 +161,24 @@
         """
         )
 
-    private val IconsStub = bytecodeStub(
-        filename = "Icons.kt",
-        filepath = "androidx/compose/material/icons",
-        checksum = 0xe246828f,
-        """
+    private val IconsStub =
+        bytecodeStub(
+            filename = "Icons.kt",
+            filepath = "androidx/compose/material/icons",
+            checksum = 0xe246828f,
+            """
             package androidx.compose.material.icons
 
             object Icons
         """,
-"""
+            """
         META-INF/main.kotlin_module:
         H4sIAAAAAAAA/2NgYGBmYGBgBGJOBijgUuWSTMxLKcrPTKnQS87PLcgvTtXL
         TSxJLcpMzBHicCotKcnP8y7hMuNSxalMr6A0J6coNa0otThDiDcAyAmCcID6
         dLgUcOsryiwoyEkV4ggC00DValxSOFUbI7mGl4s5LT9fiC0ktbjEu0SJQYsB
         AAY211PcAAAA
         """,
-        """
+            """
         androidx/compose/material/icons/Icons.class:
         H4sIAAAAAAAA/42Sz27TQBDGv90kjuMGmhZoEwq00CL+HHBbcaNCKhVIloyR
         aBWp6mljr9pNbC+yN1GPOfEgvEHFoRKVUAQ3HgoxayI4cGEtzcw3O/vbnZF/
@@ -191,23 +194,24 @@
         """
         )
 
-    private val PullRefreshStub = bytecodeStub(
-        filename = "PullRefresh.kt",
-        filepath = "androidx/compose/material/pullrefresh",
-        checksum = 0xfa59248b,
-        """
+    private val PullRefreshStub =
+        bytecodeStub(
+            filename = "PullRefresh.kt",
+            filepath = "androidx/compose/material/pullrefresh",
+            checksum = 0xfa59248b,
+            """
             package androidx.compose.material.pullrefresh
 
             fun pullRefresh() {}
         """,
-"""
+            """
         META-INF/main.kotlin_module:
         H4sIAAAAAAAA/2NgYGBmYGBgBGJOBijgUuWSTMxLKcrPTKnQS87PLcgvTtXL
         TSxJLcpMzBHicCotKcnP8y7hMuNSxalMr6A0J6coNa0otThDiDcAyAmCcID6
         dLgUcOsryiwoyEkV4ggC00DValxSOFUbI7mGl4s5LT9fiC0ktbjEu0SJQYsB
         AAY211PcAAAA
         """,
-        """
+            """
         androidx/compose/material/pullrefresh/PullRefreshKt.class:
         H4sIAAAAAAAA/01OTU/CQBSct+VDikIRv8ov0IsF9ebJmJg04kfQcOG00FUX
         2i5pt4Qjf8mrB8PZH2XclYO+w7x5M/OS+fr++ARwAZ9wztMoUzJaBhOVzFUu
@@ -222,9 +226,10 @@
 
     @Test
     fun material_imports() {
-        lint().files(
-            kotlin(
-                """
+        lint()
+            .files(
+                kotlin(
+                    """
                 package foo
 
                 import androidx.compose.material.Button
@@ -236,14 +241,14 @@
 
                 fun test() {}
             """
-            ),
-            MaterialButtonStub,
-            ExperimentalMaterialApiStub,
-            Material3ButtonStub,
-            RippleStub,
-            IconsStub,
-            PullRefreshStub
-        )
+                ),
+                MaterialButtonStub,
+                ExperimentalMaterialApiStub,
+                Material3ButtonStub,
+                RippleStub,
+                IconsStub,
+                PullRefreshStub
+            )
             .run()
             .expect(
                 """
@@ -257,9 +262,10 @@
 
     @Test
     fun material_wildcardImports() {
-        lint().files(
-            kotlin(
-                """
+        lint()
+            .files(
+                kotlin(
+                    """
                 package foo
 
                 import androidx.compose.material.*
@@ -270,14 +276,14 @@
 
                 fun test() {}
             """
-            ),
-            MaterialButtonStub,
-            ExperimentalMaterialApiStub,
-            Material3ButtonStub,
-            RippleStub,
-            IconsStub,
-            PullRefreshStub
-        )
+                ),
+                MaterialButtonStub,
+                ExperimentalMaterialApiStub,
+                Material3ButtonStub,
+                RippleStub,
+                IconsStub,
+                PullRefreshStub
+            )
             .run()
             .expect(
                 """
diff --git a/compose/material3/material3-lint/src/test/java/androidx/compose/material3/lint/ScaffoldPaddingDetectorTest.kt b/compose/material3/material3-lint/src/test/java/androidx/compose/material3/lint/ScaffoldPaddingDetectorTest.kt
index 303273a..e356389 100644
--- a/compose/material3/material3-lint/src/test/java/androidx/compose/material3/lint/ScaffoldPaddingDetectorTest.kt
+++ b/compose/material3/material3-lint/src/test/java/androidx/compose/material3/lint/ScaffoldPaddingDetectorTest.kt
@@ -30,9 +30,7 @@
 /* ktlint-disable max-line-length */
 @RunWith(JUnit4::class)
 
-/**
- * Test for [ScaffoldPaddingDetector].
- */
+/** Test for [ScaffoldPaddingDetector]. */
 class ScaffoldPaddingDetectorTest : LintDetectorTest() {
     override fun getDetector(): Detector = ScaffoldPaddingDetector()
 
@@ -40,11 +38,12 @@
         mutableListOf(ScaffoldPaddingDetector.UnusedMaterial3ScaffoldPaddingParameter)
 
     // Simplified Scaffold.kt stubs
-    private val ScaffoldStub = bytecodeStub(
-        filename = "Scaffold.kt",
-        filepath = "androidx/compose/material3",
-        checksum = 0xc74cb7f7,
-        """
+    private val ScaffoldStub =
+        bytecodeStub(
+            filename = "Scaffold.kt",
+            filepath = "androidx/compose/material3",
+            checksum = 0xc74cb7f7,
+            """
             package androidx.compose.material3
 
             import androidx.compose.foundation.layout.PaddingValues
@@ -60,13 +59,13 @@
             ) {}
 
         """,
-"""
+            """
         META-INF/main.kotlin_module:
         H4sIAAAAAAAA/2NgYGBmYGBgBGJOBijg0uCSSsxLKcrPTKnQS87PLcgvTtXL
         TSxJLcpMzDEW4gpOTkxLy89J8S7h4uViTsvPF2ILSS0u8S5RYtBiAABi9Cyd
         UQAAAA==
         """,
-        """
+            """
         androidx/compose/material3/ScaffoldKt＄Scaffold＄1.class:
         H4sIAAAAAAAA/6VU604TQRT+Zlt62RZbEOUi3kFbULYt3ktICIG4oWBisYnh
         17S7haG7s6a7bfAfD+ET+ASiiSSaGOJPH8p4ZmkNhogaN9mzJ+d835lzm/32
@@ -85,7 +84,7 @@
         Y3gQ1nmX6n8YHhLBo/BbxOPw70QXn1hXtxAxcc3EdRM3cNOkZkybuIXbW2A+
         csiT38eMj1kfmR/t8cYr2gQAAA==
         """,
-        """
+            """
         androidx/compose/material3/ScaffoldKt＄Scaffold＄2.class:
         H4sIAAAAAAAA/6VUbU/TUBR+bjf2xnADUV7Ed9ANlI7h+wgJIRAbBiYOlxg+
         3bUdXNbemrVd8Bs/wl/gLxBNNNHEED/6o4znlk0xRNTYpKcn5zzPueft9uu3
@@ -104,7 +103,7 @@
         uBfVeZvqvx8dEsOD6DuHh9HfiS4+sS5vIWbgioGrBq7hukHNmDJwAze3wHwU
         UCS/j2kfMz5y3wHSFKv42gQAAA==
         """,
-        """
+            """
         androidx/compose/material3/ScaffoldKt.class:
         H4sIAAAAAAAA/8VUy3IbVRA9V695WEoU2XJsJTghlhPHj4ykhKdMwBExGSwp
         KZR449XVaCTGHt1xzcMVNpQpfoENW/4AVikWlIolf8GPUOkZScaxUnYgVLGY
@@ -130,13 +129,14 @@
         PR3v6XgfH+j4EB/p+BjVXTAPG/hkF1Mekh7ue1A9zHnIefjUg+xhxsOsh888
         bL4EoWeehRwJAAA=
         """
-    )
+        )
 
     @Test
     fun unreferencedParameters() {
-        lint().files(
-            kotlin(
-                """
+        lint()
+            .files(
+                kotlin(
+                    """
                 package foo
 
                 import androidx.compose.material3.*
@@ -153,12 +153,12 @@
                     Scaffold(Modifier, topBar = {}, bottomBar = {}) { innerPadding -> /**/ }
                 }
             """
-            ),
-            ScaffoldStub,
-            Stubs.Modifier,
-            Stubs.PaddingValues,
-            Stubs.Composable
-        )
+                ),
+                ScaffoldStub,
+                Stubs.Modifier,
+                Stubs.PaddingValues,
+                Stubs.Composable
+            )
             .run()
             .expect(
                 """
@@ -187,9 +187,10 @@
 
     @Test
     fun unreferencedParameter_shadowedNames() {
-        lint().files(
-            kotlin(
-                """
+        lint()
+            .files(
+                kotlin(
+                    """
                 package foo
 
                 import androidx.compose.material3.*
@@ -220,12 +221,12 @@
                     }
                 }
             """
-            ),
-            ScaffoldStub,
-            Stubs.Modifier,
-            Stubs.PaddingValues,
-            Stubs.Composable
-        )
+                ),
+                ScaffoldStub,
+                Stubs.Modifier,
+                Stubs.PaddingValues,
+                Stubs.Composable
+            )
             .run()
             .expect(
                 """
@@ -242,9 +243,10 @@
 
     @Test
     fun noErrors() {
-        lint().files(
-            kotlin(
-                """
+        lint()
+            .files(
+                kotlin(
+                    """
                 package foo
 
                 import androidx.compose.material3.*
@@ -261,12 +263,12 @@
                     }
                 }
         """
-            ),
-            ScaffoldStub,
-            Stubs.Modifier,
-            Stubs.PaddingValues,
-            Stubs.Composable
-        )
+                ),
+                ScaffoldStub,
+                Stubs.Modifier,
+                Stubs.PaddingValues,
+                Stubs.Composable
+            )
             .run()
             .expectClean()
     }
diff --git a/compose/material3/material3-window-size-class/samples/src/main/java/androidx/compose/material3/windowsizeclass/samples/WindowSizeClassSamples.kt b/compose/material3/material3-window-size-class/samples/src/main/java/androidx/compose/material3/windowsizeclass/samples/WindowSizeClassSamples.kt
index 7bf9334..df6083c 100644
--- a/compose/material3/material3-window-size-class/samples/src/main/java/androidx/compose/material3/windowsizeclass/samples/WindowSizeClassSamples.kt
+++ b/compose/material3/material3-window-size-class/samples/src/main/java/androidx/compose/material3/windowsizeclass/samples/WindowSizeClassSamples.kt
@@ -47,6 +47,4 @@
     }
 }
 
-@Suppress("UNUSED_PARAMETER")
-@Composable
-private fun MyScreen(useNavRail: Boolean) {}
+@Suppress("UNUSED_PARAMETER") @Composable private fun MyScreen(useNavRail: Boolean) {}
diff --git a/compose/material3/material3-window-size-class/src/androidInstrumentedTest/kotlin/androidx/compose/material3/windowsizeclass/AndroidWindowSizeClassTest.kt b/compose/material3/material3-window-size-class/src/androidInstrumentedTest/kotlin/androidx/compose/material3/windowsizeclass/AndroidWindowSizeClassTest.kt
index ac4d1f3..99d0206 100644
--- a/compose/material3/material3-window-size-class/src/androidInstrumentedTest/kotlin/androidx/compose/material3/windowsizeclass/AndroidWindowSizeClassTest.kt
+++ b/compose/material3/material3-window-size-class/src/androidInstrumentedTest/kotlin/androidx/compose/material3/windowsizeclass/AndroidWindowSizeClassTest.kt
@@ -36,8 +36,7 @@
 @OptIn(ExperimentalMaterial3WindowSizeClassApi::class)
 class AndroidWindowSizeClassTest {
 
-    @get:Rule
-    val rule = createAndroidComposeRule<ComponentActivity>()
+    @get:Rule val rule = createAndroidComposeRule<ComponentActivity>()
 
     @Test
     fun widthSizeClass_correctCalculation() {
@@ -50,12 +49,13 @@
             assertThat(actualWindowWidthSizeClass).isNotNull()
 
             val width = getWindowBounds().width()
-            val expectedWindowWidthSizeClass = with(rule.density) {
-                WindowWidthSizeClass.fromWidth(
-                    width.toDp(),
-                    WindowWidthSizeClass.DefaultSizeClasses
-                )
-            }
+            val expectedWindowWidthSizeClass =
+                with(rule.density) {
+                    WindowWidthSizeClass.fromWidth(
+                        width.toDp(),
+                        WindowWidthSizeClass.DefaultSizeClasses
+                    )
+                }
             assertThat(expectedWindowWidthSizeClass).isEqualTo(actualWindowWidthSizeClass)
         }
     }
@@ -71,12 +71,13 @@
             assertThat(actualWindowHeightSizeClass).isNotNull()
 
             val height = getWindowBounds().height()
-            val expectedWindowHeightSizeClass = with(rule.density) {
-                WindowHeightSizeClass.fromHeight(
-                    height.toDp(),
-                    WindowHeightSizeClass.DefaultSizeClasses
-                )
-            }
+            val expectedWindowHeightSizeClass =
+                with(rule.density) {
+                    WindowHeightSizeClass.fromHeight(
+                        height.toDp(),
+                        WindowHeightSizeClass.DefaultSizeClasses
+                    )
+                }
             assertThat(expectedWindowHeightSizeClass).isEqualTo(actualWindowHeightSizeClass)
         }
     }
@@ -94,10 +95,11 @@
         }
 
         rule.runOnIdle {
-            val expectedWindowSizeClass = with(density.value) {
-                firstSize = getWindowDpSize()
-                WindowSizeClass.calculateFromSize(firstSize!!)
-            }
+            val expectedWindowSizeClass =
+                with(density.value) {
+                    firstSize = getWindowDpSize()
+                    WindowSizeClass.calculateFromSize(firstSize!!)
+                }
             assertThat(actualWindowSizeClass).isEqualTo(expectedWindowSizeClass)
         }
 
@@ -105,19 +107,21 @@
         density.value = Density(10f)
 
         rule.runOnIdle {
-            val expectedWindowSizeClass = with(density.value) {
-                secondSize = getWindowDpSize()
-                WindowSizeClass.calculateFromSize(secondSize)
-            }
+            val expectedWindowSizeClass =
+                with(density.value) {
+                    secondSize = getWindowDpSize()
+                    WindowSizeClass.calculateFromSize(secondSize)
+                }
             assertThat(actualWindowSizeClass).isEqualTo(expectedWindowSizeClass)
 
             assertThat(firstSize!! / 10f).isEqualTo(secondSize)
         }
     }
 
-    private fun getWindowBounds() = with(rule.activity) {
-        WindowMetricsCalculator.getOrCreate().computeCurrentWindowMetrics(this).bounds
-    }
+    private fun getWindowBounds() =
+        with(rule.activity) {
+            WindowMetricsCalculator.getOrCreate().computeCurrentWindowMetrics(this).bounds
+        }
 
     private fun Density.getWindowDpSize(): DpSize {
         val bounds = getWindowBounds()
diff --git a/compose/material3/material3-window-size-class/src/androidMain/kotlin/androidx/compose/material3/windowsizeclass/AndroidWindowSizeClass.android.kt b/compose/material3/material3-window-size-class/src/androidMain/kotlin/androidx/compose/material3/windowsizeclass/AndroidWindowSizeClass.android.kt
index 4624e3c..02a95d4 100644
--- a/compose/material3/material3-window-size-class/src/androidMain/kotlin/androidx/compose/material3/windowsizeclass/AndroidWindowSizeClass.android.kt
+++ b/compose/material3/material3-window-size-class/src/androidMain/kotlin/androidx/compose/material3/windowsizeclass/AndroidWindowSizeClass.android.kt
@@ -27,8 +27,8 @@
  * Calculates the window's [WindowSizeClass] for the provided [activity].
  *
  * A new [WindowSizeClass] will be returned whenever a configuration change causes the width or
- * height of the window to cross a breakpoint, such as when the device is rotated or the window
- * is resized.
+ * height of the window to cross a breakpoint, such as when the device is rotated or the window is
+ * resized.
  *
  * @sample androidx.compose.material3.windowsizeclass.samples.AndroidWindowSizeClassSample
  */
diff --git a/compose/material3/material3-window-size-class/src/androidUnitTest/kotlin/androidx/compose/material3/windowsizeclass/WindowSizeClassTest.kt b/compose/material3/material3-window-size-class/src/androidUnitTest/kotlin/androidx/compose/material3/windowsizeclass/WindowSizeClassTest.kt
index e12af6e..cb4b72f 100644
--- a/compose/material3/material3-window-size-class/src/androidUnitTest/kotlin/androidx/compose/material3/windowsizeclass/WindowSizeClassTest.kt
+++ b/compose/material3/material3-window-size-class/src/androidUnitTest/kotlin/androidx/compose/material3/windowsizeclass/WindowSizeClassTest.kt
@@ -83,17 +83,14 @@
         assertWidthClass(
             WindowWidthSizeClass.Compact,
             700.dp,
-            supportedSizeClasses = setOf(
-                WindowWidthSizeClass.Compact, WindowWidthSizeClass.Expanded
-            )
+            supportedSizeClasses =
+                setOf(WindowWidthSizeClass.Compact, WindowWidthSizeClass.Expanded)
         )
 
         assertWidthClass(
             WindowWidthSizeClass.Medium,
             1000.dp,
-            supportedSizeClasses = setOf(
-                WindowWidthSizeClass.Compact, WindowWidthSizeClass.Medium
-            )
+            supportedSizeClasses = setOf(WindowWidthSizeClass.Compact, WindowWidthSizeClass.Medium)
         )
     }
 
@@ -102,17 +99,15 @@
         assertHeightClass(
             WindowHeightSizeClass.Compact,
             700.dp,
-            supportedSizeClasses = setOf(
-                WindowHeightSizeClass.Compact, WindowHeightSizeClass.Expanded
-            )
+            supportedSizeClasses =
+                setOf(WindowHeightSizeClass.Compact, WindowHeightSizeClass.Expanded)
         )
 
         assertHeightClass(
             WindowHeightSizeClass.Medium,
             1000.dp,
-            supportedSizeClasses = setOf(
-                WindowHeightSizeClass.Compact, WindowHeightSizeClass.Medium
-            )
+            supportedSizeClasses =
+                setOf(WindowHeightSizeClass.Compact, WindowHeightSizeClass.Medium)
         )
     }
 
@@ -121,9 +116,7 @@
         assertWidthClass(
             WindowWidthSizeClass.Medium,
             200.dp,
-            supportedSizeClasses = setOf(
-                WindowWidthSizeClass.Medium, WindowWidthSizeClass.Expanded
-            )
+            supportedSizeClasses = setOf(WindowWidthSizeClass.Medium, WindowWidthSizeClass.Expanded)
         )
     }
 
@@ -132,9 +125,8 @@
         assertHeightClass(
             WindowHeightSizeClass.Medium,
             200.dp,
-            supportedSizeClasses = setOf(
-                WindowHeightSizeClass.Medium, WindowHeightSizeClass.Expanded
-            )
+            supportedSizeClasses =
+                setOf(WindowHeightSizeClass.Medium, WindowHeightSizeClass.Expanded)
         )
     }
 
@@ -142,8 +134,7 @@
     fun widthSizeClassToString() {
         assertThat(WindowWidthSizeClass.Compact.toString())
             .isEqualTo("WindowWidthSizeClass.Compact")
-        assertThat(WindowWidthSizeClass.Medium.toString())
-            .isEqualTo("WindowWidthSizeClass.Medium")
+        assertThat(WindowWidthSizeClass.Medium.toString()).isEqualTo("WindowWidthSizeClass.Medium")
         assertThat(WindowWidthSizeClass.Expanded.toString())
             .isEqualTo("WindowWidthSizeClass.Expanded")
     }
@@ -269,9 +260,8 @@
         width: Dp,
         supportedSizeClasses: Set<WindowWidthSizeClass> = WindowWidthSizeClass.DefaultSizeClasses
     ) {
-        assertThat(
-            WindowWidthSizeClass.fromWidth(width, supportedSizeClasses)
-        ).isEqualTo(expectedSizeClass)
+        assertThat(WindowWidthSizeClass.fromWidth(width, supportedSizeClasses))
+            .isEqualTo(expectedSizeClass)
     }
 
     private fun assertHeightClass(
@@ -279,8 +269,7 @@
         height: Dp,
         supportedSizeClasses: Set<WindowHeightSizeClass> = WindowHeightSizeClass.DefaultSizeClasses
     ) {
-        assertThat(
-            WindowHeightSizeClass.fromHeight(height, supportedSizeClasses)
-        ).isEqualTo(expectedSizeClass)
+        assertThat(WindowHeightSizeClass.fromHeight(height, supportedSizeClasses))
+            .isEqualTo(expectedSizeClass)
     }
 }
diff --git a/compose/material3/material3-window-size-class/src/commonMain/kotlin/androidx/compose/material3/windowsizeclass/TestOnly.kt b/compose/material3/material3-window-size-class/src/commonMain/kotlin/androidx/compose/material3/windowsizeclass/TestOnly.kt
index 9fb1865..e81be97 100644
--- a/compose/material3/material3-window-size-class/src/commonMain/kotlin/androidx/compose/material3/windowsizeclass/TestOnly.kt
+++ b/compose/material3/material3-window-size-class/src/commonMain/kotlin/androidx/compose/material3/windowsizeclass/TestOnly.kt
@@ -16,5 +16,4 @@
 
 package androidx.compose.material3.windowsizeclass
 
-@MustBeDocumented
-expect annotation class TestOnly()
+@MustBeDocumented expect annotation class TestOnly()
diff --git a/compose/material3/material3-window-size-class/src/commonMain/kotlin/androidx/compose/material3/windowsizeclass/WindowSizeClass.kt b/compose/material3/material3-window-size-class/src/commonMain/kotlin/androidx/compose/material3/windowsizeclass/WindowSizeClass.kt
index 24568c8..8ad557c 100644
--- a/compose/material3/material3-window-size-class/src/commonMain/kotlin/androidx/compose/material3/windowsizeclass/WindowSizeClass.kt
+++ b/compose/material3/material3-window-size-class/src/commonMain/kotlin/androidx/compose/material3/windowsizeclass/WindowSizeClass.kt
@@ -25,8 +25,9 @@
 
 /**
  * Window size classes are a set of opinionated viewport breakpoints to design, develop, and test
- * responsive application layouts against.
- * For more details check <a href="https://developer.android.com/guide/topics/large-screens/support-different-screen-sizes" class="external" target="_blank">Support different screen sizes</a> documentation.
+ * responsive application layouts against. For more details check <a
+ * href="https://developer.android.com/guide/topics/large-screens/support-different-screen-sizes"
+ * class="external" target="_blank">Support different screen sizes</a> documentation.
  *
  * WindowSizeClass contains a [WindowWidthSizeClass] and [WindowHeightSizeClass], representing the
  * window size classes for this window's width and height respectively.
@@ -37,14 +38,15 @@
  * @property heightSizeClass height-based window size class ([WindowHeightSizeClass])
  */
 @Immutable
-class WindowSizeClass private constructor(
+class WindowSizeClass
+private constructor(
     val widthSizeClass: WindowWidthSizeClass,
     val heightSizeClass: WindowHeightSizeClass
 ) {
     companion object {
         /**
-         * Calculates the best matched [WindowSizeClass] for a given [size] according to
-         * the provided [supportedWidthSizeClasses] and [supportedHeightSizeClasses].
+         * Calculates the best matched [WindowSizeClass] for a given [size] according to the
+         * provided [supportedWidthSizeClasses] and [supportedHeightSizeClasses].
          *
          * @param size of the window
          * @param supportedWidthSizeClasses the set of width size classes that are supported
@@ -59,14 +61,10 @@
             supportedHeightSizeClasses: Set<WindowHeightSizeClass> =
                 WindowHeightSizeClass.DefaultSizeClasses
         ): WindowSizeClass {
-            val windowWidthSizeClass = WindowWidthSizeClass.fromWidth(
-                size.width,
-                supportedWidthSizeClasses
-            )
-            val windowHeightSizeClass = WindowHeightSizeClass.fromHeight(
-                size.height,
-                supportedHeightSizeClasses
-            )
+            val windowWidthSizeClass =
+                WindowWidthSizeClass.fromWidth(size.width, supportedWidthSizeClasses)
+            val windowHeightSizeClass =
+                WindowHeightSizeClass.fromHeight(size.height, supportedHeightSizeClasses)
             return WindowSizeClass(windowWidthSizeClass, windowHeightSizeClass)
         }
     }
@@ -99,7 +97,9 @@
  * window size class breakpoint represents a majority case for typical device scenarios so your
  * layouts will work well on most devices and configurations.
  *
- * For more details see <a href="https://developer.android.com/guide/topics/large-screens/support-different-screen-sizes#window_size_classes" class="external" target="_blank">Window size classes documentation</a>.
+ * For more details see <a
+ * href="https://developer.android.com/guide/topics/large-screens/support-different-screen-sizes#window_size_classes"
+ * class="external" target="_blank">Window size classes documentation</a>.
  */
 @Immutable
 @kotlin.jvm.JvmInline
@@ -110,12 +110,13 @@
         breakpoint().compareTo(other.breakpoint())
 
     override fun toString(): String {
-        return "WindowWidthSizeClass." + when (this) {
-            Compact -> "Compact"
-            Medium -> "Medium"
-            Expanded -> "Expanded"
-            else -> ""
-        }
+        return "WindowWidthSizeClass." +
+            when (this) {
+                Compact -> "Compact"
+                Medium -> "Medium"
+                Expanded -> "Expanded"
+                else -> ""
+            }
     }
 
     companion object {
@@ -138,8 +139,7 @@
          * The default set of size classes that includes [Compact], [Medium], and [Expanded] size
          * classes. Should never expand to ensure behavioral consistency.
          */
-        @Suppress("PrimitiveInCollection")
-        val DefaultSizeClasses = setOf(Compact, Medium, Expanded)
+        @Suppress("PrimitiveInCollection") val DefaultSizeClasses = setOf(Compact, Medium, Expanded)
 
         @Suppress("PrimitiveInCollection")
         private val AllSizeClassList = listOf(Expanded, Medium, Compact)
@@ -170,8 +170,8 @@
         }
 
         /**
-         * Calculates the best matched [WindowWidthSizeClass] for a given [width] in Pixels and
-         * a given [Density] from [supportedSizeClasses].
+         * Calculates the best matched [WindowWidthSizeClass] for a given [width] in Pixels and a
+         * given [Density] from [supportedSizeClasses].
          */
         internal fun fromWidth(
             width: Dp,
@@ -202,7 +202,9 @@
  * window size class breakpoint represents a majority case for typical device scenarios so your
  * layouts will work well on most devices and configurations.
  *
- * For more details see <a href="https://developer.android.com/guide/topics/large-screens/support-different-screen-sizes#window_size_classes" class="external" target="_blank">Window size classes documentation</a>.
+ * For more details see <a
+ * href="https://developer.android.com/guide/topics/large-screens/support-different-screen-sizes#window_size_classes"
+ * class="external" target="_blank">Window size classes documentation</a>.
  */
 @Immutable
 @kotlin.jvm.JvmInline
@@ -213,12 +215,13 @@
         breakpoint().compareTo(other.breakpoint())
 
     override fun toString(): String {
-        return "WindowHeightSizeClass." + when (this) {
-            Compact -> "Compact"
-            Medium -> "Medium"
-            Expanded -> "Expanded"
-            else -> ""
-        }
+        return "WindowHeightSizeClass." +
+            when (this) {
+                Compact -> "Compact"
+                Medium -> "Medium"
+                Expanded -> "Expanded"
+                else -> ""
+            }
     }
 
     companion object {
@@ -235,8 +238,7 @@
          * The default set of size classes that includes [Compact], [Medium], and [Expanded] size
          * classes. Should never expand to ensure behavioral consistency.
          */
-        @Suppress("PrimitiveInCollection")
-        val DefaultSizeClasses = setOf(Compact, Medium, Expanded)
+        @Suppress("PrimitiveInCollection") val DefaultSizeClasses = setOf(Compact, Medium, Expanded)
 
         @Suppress("PrimitiveInCollection")
         private val AllSizeClassList = listOf(Expanded, Medium, Compact)
@@ -267,8 +269,8 @@
         }
 
         /**
-         * Calculates the best matched [WindowHeightSizeClass] for a given [height] in Pixels and
-         * a given [Density] from [supportedSizeClasses].
+         * Calculates the best matched [WindowHeightSizeClass] for a given [height] in Pixels and a
+         * given [Density] from [supportedSizeClasses].
          */
         internal fun fromHeight(
             height: Dp,
diff --git a/compose/material3/material3/integration-tests/material3-catalog/src/main/java/androidx/compose/material3/catalog/library/NavGraph.kt b/compose/material3/material3/integration-tests/material3-catalog/src/main/java/androidx/compose/material3/catalog/library/NavGraph.kt
index 1be6c04..c93c847 100644
--- a/compose/material3/material3/integration-tests/material3-catalog/src/main/java/androidx/compose/material3/catalog/library/NavGraph.kt
+++ b/compose/material3/material3/integration-tests/material3-catalog/src/main/java/androidx/compose/material3/catalog/library/NavGraph.kt
@@ -41,20 +41,13 @@
 import kotlinx.coroutines.launch
 
 @Composable
-fun NavGraph(
-    initialFavoriteRoute: String?,
-    theme: Theme,
-    onThemeChange: (theme: Theme) -> Unit
-) {
+fun NavGraph(initialFavoriteRoute: String?, theme: Theme, onThemeChange: (theme: Theme) -> Unit) {
     val context = LocalContext.current
     val navController = rememberNavController()
     val coroutineScope = rememberCoroutineScope()
     val userPreferencesRepository = remember { UserPreferencesRepository(context) }
     var favoriteRoute by rememberSaveable { mutableStateOf(initialFavoriteRoute) }
-    NavHost(
-        navController = navController,
-        startDestination = HomeRoute
-    ) {
+    NavHost(navController = navController, startDestination = HomeRoute) {
         composable(HomeRoute) {
             Home(
                 components = Components,
@@ -71,11 +64,8 @@
             )
         }
         composable(
-            route = "$ComponentRoute/" +
-                "{$ComponentIdArgName}",
-            arguments = listOf(
-                navArgument(ComponentIdArgName) { type = NavType.IntType }
-            )
+            route = "$ComponentRoute/" + "{$ComponentIdArgName}",
+            arguments = listOf(navArgument(ComponentIdArgName) { type = NavType.IntType })
         ) { navBackStackEntry ->
             val arguments = requireNotNull(navBackStackEntry.arguments) { "No arguments" }
             val componentId = arguments.getInt(ComponentIdArgName)
@@ -97,13 +87,12 @@
             )
         }
         composable(
-            route = "$ExampleRoute/" +
-                "{$ComponentIdArgName}/" +
-                "{$ExampleIndexArgName}",
-            arguments = listOf(
-                navArgument(ComponentIdArgName) { type = NavType.IntType },
-                navArgument(ExampleIndexArgName) { type = NavType.IntType }
-            )
+            route = "$ExampleRoute/" + "{$ComponentIdArgName}/" + "{$ExampleIndexArgName}",
+            arguments =
+                listOf(
+                    navArgument(ComponentIdArgName) { type = NavType.IntType },
+                    navArgument(ExampleIndexArgName) { type = NavType.IntType }
+                )
         ) { navBackStackEntry ->
             val arguments = requireNotNull(navBackStackEntry.arguments) { "No arguments" }
             val componentId = arguments.getInt(ComponentIdArgName)
@@ -143,8 +132,7 @@
     }
     if (route.startsWith(ExampleRoute)) {
         // Navigate to the Component screen first so it's in the back stack as expected.
-        val componentRoute =
-            route.replace(ExampleRoute, ComponentRoute).substringBeforeLast("/")
+        val componentRoute = route.replace(ExampleRoute, ComponentRoute).substringBeforeLast("/")
         navController.navigate(componentRoute)
     }
     navController.navigate(route)
diff --git a/compose/material3/material3/integration-tests/material3-catalog/src/main/java/androidx/compose/material3/catalog/library/data/UserPreferencesRepository.kt b/compose/material3/material3/integration-tests/material3-catalog/src/main/java/androidx/compose/material3/catalog/library/data/UserPreferencesRepository.kt
index 33f091e..1116280 100644
--- a/compose/material3/material3/integration-tests/material3-catalog/src/main/java/androidx/compose/material3/catalog/library/data/UserPreferencesRepository.kt
+++ b/compose/material3/material3/integration-tests/material3-catalog/src/main/java/androidx/compose/material3/catalog/library/data/UserPreferencesRepository.kt
@@ -45,9 +45,8 @@
         }
     }
 
-    suspend fun getFavoriteRoute(): String? = context.dataStore.data
-        .map { preferences -> preferences[FAVORITE_ROUTE] }
-        .first()
+    suspend fun getFavoriteRoute(): String? =
+        context.dataStore.data.map { preferences -> preferences[FAVORITE_ROUTE] }.first()
 
     suspend fun saveTheme(theme: Theme?) {
         context.dataStore.edit { preferences ->
@@ -65,10 +64,12 @@
         if (themeString == null) {
             return null
         }
-        val themeMap = themeString.substring(1, themeString.length - 1)
-            .split(", ")
-            .map { it.split("=") }
-            .associate { it.first() to it.last().toFloat() }
+        val themeMap =
+            themeString
+                .substring(1, themeString.length - 1)
+                .split(", ")
+                .map { it.split("=") }
+                .associate { it.first() to it.last().toFloat() }
         return try {
             Theme(themeMap)
         } catch (e: Exception) {
diff --git a/compose/material3/material3/integration-tests/material3-catalog/src/main/java/androidx/compose/material3/catalog/library/model/Components.kt b/compose/material3/material3/integration-tests/material3-catalog/src/main/java/androidx/compose/material3/catalog/library/model/Components.kt
index af81870..c8c59f1e 100644
--- a/compose/material3/material3/integration-tests/material3-catalog/src/main/java/androidx/compose/material3/catalog/library/model/Components.kt
+++ b/compose/material3/material3/integration-tests/material3-catalog/src/main/java/androidx/compose/material3/catalog/library/model/Components.kt
@@ -31,8 +31,7 @@
     val id: Int,
     val name: String,
     val description: String,
-    @DrawableRes
-    val icon: Int = R.drawable.ic_component,
+    @DrawableRes val icon: Int = R.drawable.ic_component,
     val tintIcon: Boolean = true,
     val guidelinesUrl: String,
     val docsUrl: String,
@@ -41,6 +40,7 @@
 )
 
 private var nextId: Int = 1
+
 private fun nextId(): Int = nextId.also { nextId += 1 }
 
 // Components are ordered alphabetically by name.
@@ -50,9 +50,9 @@
         id = nextId(),
         name = "Adaptive",
         description =
-        "Adaptive scaffolds provides automatic layout adjustment on different window size " +
-            "classes and postures.\n\n" +
-            "Note: this sample is better experienced in a resizable emulator or foldable device.",
+            "Adaptive scaffolds provides automatic layout adjustment on different window size " +
+                "classes and postures.\n\n" +
+                "Note: this sample is better experienced in a resizable emulator or foldable device.",
         // No adaptive icon
         guidelinesUrl = "$AdaptiveGuidelinesUrl/understanding-layout/overview",
         docsUrl = "$DocsUrl/adaptive",
@@ -65,9 +65,9 @@
         id = nextId(),
         name = "Badge",
         description =
-        "A badge can contain dynamic information, such as the presence of a new " +
-            "notification or a number of pending requests. Badges can be icon only or contain " +
-            "a short text.",
+            "A badge can contain dynamic information, such as the presence of a new " +
+                "notification or a number of pending requests. Badges can be icon only or contain " +
+                "a short text.",
         // No badge icon
         guidelinesUrl = "$ComponentGuidelinesUrl/badge",
         docsUrl = "$DocsUrl#badge",
@@ -75,400 +75,451 @@
         examples = BadgeExamples
     )
 
-private val BottomAppBars = Component(
-    id = nextId(),
-    name = "Bottom App Bar",
-    description = "A bottom app bar displays navigation and key actions at the bottom of mobile " +
-        "screens.",
-    // No bottom app bar icon
-    guidelinesUrl = "$ComponentGuidelinesUrl/bottom-app-bars",
-    docsUrl = "$DocsUrl#bottomappbar",
-    sourceUrl = "$Material3SourceUrl/AppBar.kt",
-    examples = BottomAppBarsExamples
-)
+private val BottomAppBars =
+    Component(
+        id = nextId(),
+        name = "Bottom App Bar",
+        description =
+            "A bottom app bar displays navigation and key actions at the bottom of mobile " +
+                "screens.",
+        // No bottom app bar icon
+        guidelinesUrl = "$ComponentGuidelinesUrl/bottom-app-bars",
+        docsUrl = "$DocsUrl#bottomappbar",
+        sourceUrl = "$Material3SourceUrl/AppBar.kt",
+        examples = BottomAppBarsExamples
+    )
 
-private val BottomSheets = Component(
-    id = nextId(),
-    name = "Bottom Sheet",
-    description = "Bottom sheets are surfaces containing supplementary content, anchored to the " +
-        "bottom of the screen.",
-    // No bottom sheet icon
-    guidelinesUrl = "$ComponentGuidelinesUrl/bottom-sheets",
-    docsUrl = "$DocsUrl#bottomsheet",
-    sourceUrl = "$Material3SourceUrl/ModalBottomSheet.android.kt",
-    examples = BottomSheetExamples
-)
+private val BottomSheets =
+    Component(
+        id = nextId(),
+        name = "Bottom Sheet",
+        description =
+            "Bottom sheets are surfaces containing supplementary content, anchored to the " +
+                "bottom of the screen.",
+        // No bottom sheet icon
+        guidelinesUrl = "$ComponentGuidelinesUrl/bottom-sheets",
+        docsUrl = "$DocsUrl#bottomsheet",
+        sourceUrl = "$Material3SourceUrl/ModalBottomSheet.android.kt",
+        examples = BottomSheetExamples
+    )
 
-private val Buttons = Component(
-    id = nextId(),
-    name = "Buttons",
-    description = "Buttons help people initiate actions, from sending an email, to sharing a " +
-        "document, to liking a post.",
-    // No buttons icon
-    guidelinesUrl = "$ComponentGuidelinesUrl/buttons",
-    docsUrl = "$PackageSummaryUrl#button",
-    sourceUrl = "$Material3SourceUrl/Button.kt",
-    examples = ButtonsExamples,
-)
+private val Buttons =
+    Component(
+        id = nextId(),
+        name = "Buttons",
+        description =
+            "Buttons help people initiate actions, from sending an email, to sharing a " +
+                "document, to liking a post.",
+        // No buttons icon
+        guidelinesUrl = "$ComponentGuidelinesUrl/buttons",
+        docsUrl = "$PackageSummaryUrl#button",
+        sourceUrl = "$Material3SourceUrl/Button.kt",
+        examples = ButtonsExamples,
+    )
 
-private val Card = Component(
-    id = nextId(),
-    name = "Card",
-    description = "Cards contain content and actions that relate information about a subject.",
-    // No card icon
-    guidelinesUrl = "$StyleGuidelinesUrl/cards",
-    docsUrl = "$PackageSummaryUrl#card",
-    sourceUrl = "$Material3SourceUrl/Card.kt",
-    examples = CardExamples
-)
+private val Card =
+    Component(
+        id = nextId(),
+        name = "Card",
+        description = "Cards contain content and actions that relate information about a subject.",
+        // No card icon
+        guidelinesUrl = "$StyleGuidelinesUrl/cards",
+        docsUrl = "$PackageSummaryUrl#card",
+        sourceUrl = "$Material3SourceUrl/Card.kt",
+        examples = CardExamples
+    )
 
-private val Carousel = Component(
-    id = nextId(),
-    name = "Carousel",
-    description = "Carousels are stylized versions of lists that provide a unique viewing and " +
-        "behavior that suit large imagery and other visually rich content.",
-    // No carousel icon
-    guidelinesUrl = "$StyleGuidelinesUrl/carousel",
-    docsUrl = "$PackageSummaryUrl#carousel",
-    sourceUrl = "$Material3SourceUrl/Carousel.kt",
-    examples = CarouselExamples
-)
+private val Carousel =
+    Component(
+        id = nextId(),
+        name = "Carousel",
+        description =
+            "Carousels are stylized versions of lists that provide a unique viewing and " +
+                "behavior that suit large imagery and other visually rich content.",
+        // No carousel icon
+        guidelinesUrl = "$StyleGuidelinesUrl/carousel",
+        docsUrl = "$PackageSummaryUrl#carousel",
+        sourceUrl = "$Material3SourceUrl/Carousel.kt",
+        examples = CarouselExamples
+    )
 
-private val Checkboxes = Component(
-    id = nextId(),
-    name = "Checkboxes",
-    description = "Checkboxes allow the user to select one or more items from a set or turn an " +
-        "option on or off.",
-    // No checkbox icon
-    guidelinesUrl = "$ComponentGuidelinesUrl/checkboxes",
-    docsUrl = "$DocsUrl#checkbox",
-    sourceUrl = "$Material3SourceUrl/Checkbox.kt",
-    examples = CheckboxesExamples
-)
+private val Checkboxes =
+    Component(
+        id = nextId(),
+        name = "Checkboxes",
+        description =
+            "Checkboxes allow the user to select one or more items from a set or turn an " +
+                "option on or off.",
+        // No checkbox icon
+        guidelinesUrl = "$ComponentGuidelinesUrl/checkboxes",
+        docsUrl = "$DocsUrl#checkbox",
+        sourceUrl = "$Material3SourceUrl/Checkbox.kt",
+        examples = CheckboxesExamples
+    )
 
-private val Chips = Component(
-    id = nextId(),
-    name = "Chips",
-    description = "Chips allow users to enter information, make selections, filter content, or" +
-        " trigger actions.",
-    // No chip icon
-    guidelinesUrl = "$ComponentGuidelinesUrl/chips",
-    docsUrl = "$DocsUrl#chips",
-    sourceUrl = "$Material3SourceUrl/Chip.kt",
-    examples = ChipsExamples
-)
+private val Chips =
+    Component(
+        id = nextId(),
+        name = "Chips",
+        description =
+            "Chips allow users to enter information, make selections, filter content, or" +
+                " trigger actions.",
+        // No chip icon
+        guidelinesUrl = "$ComponentGuidelinesUrl/chips",
+        docsUrl = "$DocsUrl#chips",
+        sourceUrl = "$Material3SourceUrl/Chip.kt",
+        examples = ChipsExamples
+    )
 
-private val DatePickers = Component(
-    id = nextId(),
-    name = "Date pickers",
-    description = "Date pickers let users select a date or range of dates.",
-    // No date picker icon
-    guidelinesUrl = "$ComponentGuidelinesUrl/datepicker",
-    docsUrl = "$PackageSummaryUrl#datepicker",
-    sourceUrl = "$Material3SourceUrl/DatePicker.kt",
-    examples = DatePickerExamples
-)
+private val DatePickers =
+    Component(
+        id = nextId(),
+        name = "Date pickers",
+        description = "Date pickers let users select a date or range of dates.",
+        // No date picker icon
+        guidelinesUrl = "$ComponentGuidelinesUrl/datepicker",
+        docsUrl = "$PackageSummaryUrl#datepicker",
+        sourceUrl = "$Material3SourceUrl/DatePicker.kt",
+        examples = DatePickerExamples
+    )
 
-private val Dialogs = Component(
-    id = nextId(),
-    name = "Dialogs",
-    description = "Dialogs provide important prompts in a user flow. They can require an action, " +
-        "communicate information, or help users accomplish a task.",
-    // No dialogs icon
-    guidelinesUrl = "$ComponentGuidelinesUrl/dialogs",
-    docsUrl = "$PackageSummaryUrl#alertdialog",
-    sourceUrl = "$Material3SourceUrl/AlertDialog.kt",
-    examples = DialogExamples
-)
+private val Dialogs =
+    Component(
+        id = nextId(),
+        name = "Dialogs",
+        description =
+            "Dialogs provide important prompts in a user flow. They can require an action, " +
+                "communicate information, or help users accomplish a task.",
+        // No dialogs icon
+        guidelinesUrl = "$ComponentGuidelinesUrl/dialogs",
+        docsUrl = "$PackageSummaryUrl#alertdialog",
+        sourceUrl = "$Material3SourceUrl/AlertDialog.kt",
+        examples = DialogExamples
+    )
 
-private val ExtendedFloatingActionButton = Component(
-    id = nextId(),
-    name = "Extended FAB",
-    description = "Extended FABs help people take primary actions. They're wider than FABs to " +
-        "accommodate a text label and larger target area.",
-    // No extended FAB icon
-    guidelinesUrl = "$ComponentGuidelinesUrl/extended-fab",
-    docsUrl = "$PackageSummaryUrl#extendedfloatingactionbutton",
-    sourceUrl = "$Material3SourceUrl/FloatingActionButton.kt",
-    examples = ExtendedFABExamples,
-)
+private val ExtendedFloatingActionButton =
+    Component(
+        id = nextId(),
+        name = "Extended FAB",
+        description =
+            "Extended FABs help people take primary actions. They're wider than FABs to " +
+                "accommodate a text label and larger target area.",
+        // No extended FAB icon
+        guidelinesUrl = "$ComponentGuidelinesUrl/extended-fab",
+        docsUrl = "$PackageSummaryUrl#extendedfloatingactionbutton",
+        sourceUrl = "$Material3SourceUrl/FloatingActionButton.kt",
+        examples = ExtendedFABExamples,
+    )
 
-private val FloatingActionButtons = Component(
-    id = nextId(),
-    name = "Floating action buttons",
-    description = "The FAB represents the most important action on a screen. It puts key actions " +
-        "within reach.",
-    // No FABs icon
-    guidelinesUrl = "$ComponentGuidelinesUrl/floating-action-button",
-    docsUrl = "$PackageSummaryUrl#floatingactionbutton",
-    sourceUrl = "$Material3SourceUrl/FloatingActionButton.kt",
-    examples = FloatingActionButtonsExamples,
-)
+private val FloatingActionButtons =
+    Component(
+        id = nextId(),
+        name = "Floating action buttons",
+        description =
+            "The FAB represents the most important action on a screen. It puts key actions " +
+                "within reach.",
+        // No FABs icon
+        guidelinesUrl = "$ComponentGuidelinesUrl/floating-action-button",
+        docsUrl = "$PackageSummaryUrl#floatingactionbutton",
+        sourceUrl = "$Material3SourceUrl/FloatingActionButton.kt",
+        examples = FloatingActionButtonsExamples,
+    )
 
-private val IconButtons = Component(
-    id = nextId(),
-    name = "Icon buttons",
-    description = "Icon buttons allow users to take actions and make choices with a single tap.",
-    // No icon-button icon
-    guidelinesUrl = "$ComponentGuidelinesUrl/icon-button",
-    docsUrl = "$PackageSummaryUrl#iconbutton",
-    sourceUrl = "$Material3SourceUrl/IconButton.kt",
-    examples = IconButtonExamples,
-)
+private val IconButtons =
+    Component(
+        id = nextId(),
+        name = "Icon buttons",
+        description =
+            "Icon buttons allow users to take actions and make choices with a single tap.",
+        // No icon-button icon
+        guidelinesUrl = "$ComponentGuidelinesUrl/icon-button",
+        docsUrl = "$PackageSummaryUrl#iconbutton",
+        sourceUrl = "$Material3SourceUrl/IconButton.kt",
+        examples = IconButtonExamples,
+    )
 
-private val Lists = Component(
-    id = nextId(),
-    name = "Lists",
-    description = "Lists are continuous, vertical indexes of text or images.",
-    // No ListItem icon
-    tintIcon = true,
-    guidelinesUrl = "$ComponentGuidelinesUrl/list-item",
-    docsUrl = "$PackageSummaryUrl#listitem",
-    sourceUrl = "$Material3SourceUrl/ListItem.kt",
-    examples = ListsExamples,
-)
-private val Menus = Component(
-    id = nextId(),
-    name = "Menus",
-    description = "Menus display a list of choices on temporary surfaces.",
-    // No menu icon
-    guidelinesUrl = "$ComponentGuidelinesUrl/menus",
-    docsUrl = "$PackageSummaryUrl#dropdownmenu",
-    sourceUrl = "$Material3SourceUrl/Menu.kt",
-    examples = MenusExamples
-)
+private val Lists =
+    Component(
+        id = nextId(),
+        name = "Lists",
+        description = "Lists are continuous, vertical indexes of text or images.",
+        // No ListItem icon
+        tintIcon = true,
+        guidelinesUrl = "$ComponentGuidelinesUrl/list-item",
+        docsUrl = "$PackageSummaryUrl#listitem",
+        sourceUrl = "$Material3SourceUrl/ListItem.kt",
+        examples = ListsExamples,
+    )
+private val Menus =
+    Component(
+        id = nextId(),
+        name = "Menus",
+        description = "Menus display a list of choices on temporary surfaces.",
+        // No menu icon
+        guidelinesUrl = "$ComponentGuidelinesUrl/menus",
+        docsUrl = "$PackageSummaryUrl#dropdownmenu",
+        sourceUrl = "$Material3SourceUrl/Menu.kt",
+        examples = MenusExamples
+    )
 
-private val NavigationBar = Component(
-    id = nextId(),
-    name = "Navigation bar",
-    description = "Navigation bars offer a persistent and convenient way to switch between " +
-        "primary destinations in an app.",
-    // No navigation bar icon
-    guidelinesUrl = "$ComponentGuidelinesUrl/navigation-bar",
-    docsUrl = "$PackageSummaryUrl#navigationbar",
-    sourceUrl = "$Material3SourceUrl/NavigationBar.kt",
-    examples = NavigationBarExamples
-)
+private val NavigationBar =
+    Component(
+        id = nextId(),
+        name = "Navigation bar",
+        description =
+            "Navigation bars offer a persistent and convenient way to switch between " +
+                "primary destinations in an app.",
+        // No navigation bar icon
+        guidelinesUrl = "$ComponentGuidelinesUrl/navigation-bar",
+        docsUrl = "$PackageSummaryUrl#navigationbar",
+        sourceUrl = "$Material3SourceUrl/NavigationBar.kt",
+        examples = NavigationBarExamples
+    )
 
-private val NavigationDrawer = Component(
-    id = nextId(),
-    name = "Navigation drawer",
-    description = "Navigation drawers provide ergonomic access to destinations in an app.",
-    // No navigation drawer icon
-    guidelinesUrl = "$ComponentGuidelinesUrl/navigation-drawer",
-    docsUrl = "$PackageSummaryUrl#navigationdrawer",
-    sourceUrl = "$Material3SourceUrl/NavigationDrawer.kt",
-    examples = NavigationDrawerExamples
-)
+private val NavigationDrawer =
+    Component(
+        id = nextId(),
+        name = "Navigation drawer",
+        description = "Navigation drawers provide ergonomic access to destinations in an app.",
+        // No navigation drawer icon
+        guidelinesUrl = "$ComponentGuidelinesUrl/navigation-drawer",
+        docsUrl = "$PackageSummaryUrl#navigationdrawer",
+        sourceUrl = "$Material3SourceUrl/NavigationDrawer.kt",
+        examples = NavigationDrawerExamples
+    )
 
-private val NavigationRail = Component(
-    id = nextId(),
-    name = "Navigation rail",
-    description = "Navigation rails provide access to primary destinations in apps when using " +
-        "tablet and desktop screens.",
-    // No navigation rail icon
-    guidelinesUrl = "$ComponentGuidelinesUrl/navigation-rail",
-    docsUrl = "$PackageSummaryUrl#navigationrail",
-    sourceUrl = "$Material3SourceUrl/NavigationRail.kt",
-    examples = NavigationRailExamples
-)
+private val NavigationRail =
+    Component(
+        id = nextId(),
+        name = "Navigation rail",
+        description =
+            "Navigation rails provide access to primary destinations in apps when using " +
+                "tablet and desktop screens.",
+        // No navigation rail icon
+        guidelinesUrl = "$ComponentGuidelinesUrl/navigation-rail",
+        docsUrl = "$PackageSummaryUrl#navigationrail",
+        sourceUrl = "$Material3SourceUrl/NavigationRail.kt",
+        examples = NavigationRailExamples
+    )
 
-private val NavigationSuiteScaffold = Component(
-    id = nextId(),
-    name = "Navigation Suite Scaffold",
-    description = "The Navigation Suite Scaffold wraps the provided content and places the " +
-        "adequate provided navigation component on the screen according to the current " +
-        "NavigationSuiteType. \n\n" +
-        "Note: this sample is better experienced in a resizable emulator or foldable device.",
-    // No navigation suite scaffold icon
-    guidelinesUrl = "", // TODO: Add guidelines url when available
-    docsUrl = "", // TODO: Add docs url when available
-    sourceUrl = "$AdaptiveNavigationSuiteMaterial3SourceUrl/NavigationSuiteScaffold.kt",
-    examples = NavigationSuiteScaffoldExamples
-)
+private val NavigationSuiteScaffold =
+    Component(
+        id = nextId(),
+        name = "Navigation Suite Scaffold",
+        description =
+            "The Navigation Suite Scaffold wraps the provided content and places the " +
+                "adequate provided navigation component on the screen according to the current " +
+                "NavigationSuiteType. \n\n" +
+                "Note: this sample is better experienced in a resizable emulator or foldable device.",
+        // No navigation suite scaffold icon
+        guidelinesUrl = "", // TODO: Add guidelines url when available
+        docsUrl = "", // TODO: Add docs url when available
+        sourceUrl = "$AdaptiveNavigationSuiteMaterial3SourceUrl/NavigationSuiteScaffold.kt",
+        examples = NavigationSuiteScaffoldExamples
+    )
 
-private val ProgressIndicators = Component(
-    id = nextId(),
-    name = "Progress indicators",
-    description = "Progress indicators express an unspecified wait time or display the length of " +
-        "a process.",
-    // No progress indicator icon
-    guidelinesUrl = "$ComponentGuidelinesUrl/progress-indicators",
-    docsUrl = "$DocsUrl#circularprogressindicator",
-    sourceUrl = "$Material3SourceUrl/ProgressIndicator.kt",
-    examples = ProgressIndicatorsExamples
-)
+private val ProgressIndicators =
+    Component(
+        id = nextId(),
+        name = "Progress indicators",
+        description =
+            "Progress indicators express an unspecified wait time or display the length of " +
+                "a process.",
+        // No progress indicator icon
+        guidelinesUrl = "$ComponentGuidelinesUrl/progress-indicators",
+        docsUrl = "$DocsUrl#circularprogressindicator",
+        sourceUrl = "$Material3SourceUrl/ProgressIndicator.kt",
+        examples = ProgressIndicatorsExamples
+    )
 
-private val PullToRefreshIndicators = Component(
-    id = nextId(),
-    name = "Pull-to-Refresh Indicator",
-    description = "Pull to refresh is a swipe gesture available at the beginning of lists, grid " +
-        "lists, and card collections where the most recent content appears ",
-    // No pull-to-refresh icon
-    // TODO: Request component guidelines documentation from design.
-    guidelinesUrl = "",
-    docsUrl = "$DocsUrl#pulltorefreshcontainer",
-    sourceUrl = "$Material3SourceUrl/PullToRefresh.kt",
-    examples = PullToRefreshExamples
-)
+private val PullToRefreshIndicators =
+    Component(
+        id = nextId(),
+        name = "Pull-to-Refresh Indicator",
+        description =
+            "Pull to refresh is a swipe gesture available at the beginning of lists, grid " +
+                "lists, and card collections where the most recent content appears ",
+        // No pull-to-refresh icon
+        // TODO: Request component guidelines documentation from design.
+        guidelinesUrl = "",
+        docsUrl = "$DocsUrl#pulltorefreshcontainer",
+        sourceUrl = "$Material3SourceUrl/PullToRefresh.kt",
+        examples = PullToRefreshExamples
+    )
 
-private val RadioButtons = Component(
-    id = nextId(),
-    name = "Radio buttons",
-    description = "Radio buttons allow the user to select one option from a set.",
-    // No radio-button icon
-    guidelinesUrl = "$ComponentGuidelinesUrl/radio-buttons",
-    docsUrl = "$DocsUrl#radiobutton",
-    sourceUrl = "$Material3SourceUrl/RadioButton.kt",
-    examples = RadioButtonsExamples
-)
+private val RadioButtons =
+    Component(
+        id = nextId(),
+        name = "Radio buttons",
+        description = "Radio buttons allow the user to select one option from a set.",
+        // No radio-button icon
+        guidelinesUrl = "$ComponentGuidelinesUrl/radio-buttons",
+        docsUrl = "$DocsUrl#radiobutton",
+        sourceUrl = "$Material3SourceUrl/RadioButton.kt",
+        examples = RadioButtonsExamples
+    )
 
-private val SearchBars = Component(
-    id = nextId(),
-    name = "Search bars",
-    description = "Search bars allow users to enter a keyword or phrase and get relevant " +
-        "information.",
-    // No search bar icon
-    guidelinesUrl = "", // No guidelines yet
-    docsUrl = "", // No docs yet
-    sourceUrl = "$Material3SourceUrl/SearchBar.kt",
-    examples = SearchBarExamples
-)
+private val SearchBars =
+    Component(
+        id = nextId(),
+        name = "Search bars",
+        description =
+            "Search bars allow users to enter a keyword or phrase and get relevant " +
+                "information.",
+        // No search bar icon
+        guidelinesUrl = "", // No guidelines yet
+        docsUrl = "", // No docs yet
+        sourceUrl = "$Material3SourceUrl/SearchBar.kt",
+        examples = SearchBarExamples
+    )
 
-private val SegmentedButtons = Component(
-    id = nextId(),
-    name = "Segmented Button",
-    description = "Segmented buttons help people select options, switch views, or sort elements.",
-    guidelinesUrl = "", // No guidelines yet
-    docsUrl = "", // No docs yet
-    sourceUrl = "$Material3SourceUrl/SegmentedButton.kt",
-    examples = SegmentedButtonExamples
-)
+private val SegmentedButtons =
+    Component(
+        id = nextId(),
+        name = "Segmented Button",
+        description =
+            "Segmented buttons help people select options, switch views, or sort elements.",
+        guidelinesUrl = "", // No guidelines yet
+        docsUrl = "", // No docs yet
+        sourceUrl = "$Material3SourceUrl/SegmentedButton.kt",
+        examples = SegmentedButtonExamples
+    )
 
-private val Sliders = Component(
-    id = nextId(),
-    name = "Sliders",
-    description = "Sliders allow users to make selections from a range of values.",
-    // No slider icon
-    guidelinesUrl = "", // No guidelines yet
-    docsUrl = "", // No docs yet
-    sourceUrl = "$Material3SourceUrl/Slider.kt",
-    examples = SlidersExamples
-)
+private val Sliders =
+    Component(
+        id = nextId(),
+        name = "Sliders",
+        description = "Sliders allow users to make selections from a range of values.",
+        // No slider icon
+        guidelinesUrl = "", // No guidelines yet
+        docsUrl = "", // No docs yet
+        sourceUrl = "$Material3SourceUrl/Slider.kt",
+        examples = SlidersExamples
+    )
 
-private val Snackbars = Component(
-    id = nextId(),
-    name = "Snackbars",
-    description = "Snackbars provide brief messages about app processes at the bottom of the " +
-        "screen.",
-    // No snackbar icon
-    guidelinesUrl = "$ComponentGuidelinesUrl/snackbars",
-    docsUrl = "$DocsUrl#snackbar",
-    sourceUrl = "$Material3SourceUrl/Snackbar.kt",
-    examples = SnackbarsExamples
-)
+private val Snackbars =
+    Component(
+        id = nextId(),
+        name = "Snackbars",
+        description =
+            "Snackbars provide brief messages about app processes at the bottom of the " +
+                "screen.",
+        // No snackbar icon
+        guidelinesUrl = "$ComponentGuidelinesUrl/snackbars",
+        docsUrl = "$DocsUrl#snackbar",
+        sourceUrl = "$Material3SourceUrl/Snackbar.kt",
+        examples = SnackbarsExamples
+    )
 
-private val Switches = Component(
-    id = nextId(),
-    name = "Switches",
-    description = "Switches toggle the state of a single setting on or off.",
-    // No switch icon
-    // No guidelines yet
-    guidelinesUrl = "",
-    docsUrl = "",
-    sourceUrl = "$Material3SourceUrl/Switch.kt",
-    examples = SwitchExamples
-)
+private val Switches =
+    Component(
+        id = nextId(),
+        name = "Switches",
+        description = "Switches toggle the state of a single setting on or off.",
+        // No switch icon
+        // No guidelines yet
+        guidelinesUrl = "",
+        docsUrl = "",
+        sourceUrl = "$Material3SourceUrl/Switch.kt",
+        examples = SwitchExamples
+    )
 
-private val Tabs = Component(
-    id = nextId(),
-    name = "Tabs",
-    description = "Tabs organize content across different screens, data sets, and other " +
-        "interactions.",
-    // No tabs icon
-    guidelinesUrl = "$ComponentGuidelinesUrl/tabs",
-    docsUrl = "$DocsUrl#tab",
-    sourceUrl = "$Material3SourceUrl/Tab.kt",
-    examples = TabsExamples
-)
+private val Tabs =
+    Component(
+        id = nextId(),
+        name = "Tabs",
+        description =
+            "Tabs organize content across different screens, data sets, and other " +
+                "interactions.",
+        // No tabs icon
+        guidelinesUrl = "$ComponentGuidelinesUrl/tabs",
+        docsUrl = "$DocsUrl#tab",
+        sourceUrl = "$Material3SourceUrl/Tab.kt",
+        examples = TabsExamples
+    )
 
-private val TextFields = Component(
-    id = nextId(),
-    name = "Text fields",
-    description = "Text fields let users enter and edit text.",
-    // No text fields icon
-    guidelinesUrl = "$ComponentGuidelinesUrl/text-fields",
-    docsUrl = "$DocsUrl#textfield",
-    sourceUrl = "$Material3SourceUrl/TextField.kt",
-    examples = TextFieldsExamples
-)
+private val TextFields =
+    Component(
+        id = nextId(),
+        name = "Text fields",
+        description = "Text fields let users enter and edit text.",
+        // No text fields icon
+        guidelinesUrl = "$ComponentGuidelinesUrl/text-fields",
+        docsUrl = "$DocsUrl#textfield",
+        sourceUrl = "$Material3SourceUrl/TextField.kt",
+        examples = TextFieldsExamples
+    )
 
-private val Tooltips = Component(
-    id = nextId(),
-    name = "Tooltips",
-    description = "Tooltips call user attention to an anchor component.",
-    // no tooltips icon
-    guidelinesUrl = "$ComponentGuidelinesUrl/tooltips",
-    docsUrl = "$PackageSummaryUrl#tooltip",
-    sourceUrl = "$Material3SourceUrl/Tooltip.kt",
-    examples = TooltipsExamples
-)
+private val Tooltips =
+    Component(
+        id = nextId(),
+        name = "Tooltips",
+        description = "Tooltips call user attention to an anchor component.",
+        // no tooltips icon
+        guidelinesUrl = "$ComponentGuidelinesUrl/tooltips",
+        docsUrl = "$PackageSummaryUrl#tooltip",
+        sourceUrl = "$Material3SourceUrl/Tooltip.kt",
+        examples = TooltipsExamples
+    )
 
-private val TimePickers = Component(
-    id = nextId(),
-    name = "Time Picker",
-    description = "Time picker allows the user to choose time of day.",
-    // No time picker icon
-    guidelinesUrl = "$ComponentGuidelinesUrl/time-picker",
-    docsUrl = "$DocsUrl#time-pickers",
-    sourceUrl = "$Material3SourceUrl/TimePicker.kt",
-    examples = TimePickerExamples
-)
+private val TimePickers =
+    Component(
+        id = nextId(),
+        name = "Time Picker",
+        description = "Time picker allows the user to choose time of day.",
+        // No time picker icon
+        guidelinesUrl = "$ComponentGuidelinesUrl/time-picker",
+        docsUrl = "$DocsUrl#time-pickers",
+        sourceUrl = "$Material3SourceUrl/TimePicker.kt",
+        examples = TimePickerExamples
+    )
 
-private val TopAppBar = Component(
-    id = nextId(),
-    name = "Top app bar",
-    description = "Top app bars display information and actions at the top of a screen.",
-    // No top app bar icon
-    guidelinesUrl = "$ComponentGuidelinesUrl/top-app-bar",
-    docsUrl = "$PackageSummaryUrl#smalltopappbar",
-    sourceUrl = "$Material3SourceUrl/AppBar.kt",
-    examples = TopAppBarExamples
-)
+private val TopAppBar =
+    Component(
+        id = nextId(),
+        name = "Top app bar",
+        description = "Top app bars display information and actions at the top of a screen.",
+        // No top app bar icon
+        guidelinesUrl = "$ComponentGuidelinesUrl/top-app-bar",
+        docsUrl = "$PackageSummaryUrl#smalltopappbar",
+        sourceUrl = "$Material3SourceUrl/AppBar.kt",
+        examples = TopAppBarExamples
+    )
 
 /** Components for the catalog, ordered alphabetically by name. */
-val Components = listOf(
-    Adaptive,
-    Badge,
-    BottomAppBars,
-    BottomSheets,
-    Buttons,
-    Card,
-    Carousel,
-    Checkboxes,
-    Chips,
-    DatePickers,
-    Dialogs,
-    ExtendedFloatingActionButton,
-    FloatingActionButtons,
-    IconButtons,
-    Lists,
-    Menus,
-    NavigationBar,
-    NavigationDrawer,
-    NavigationRail,
-    NavigationSuiteScaffold,
-    ProgressIndicators,
-    PullToRefreshIndicators,
-    RadioButtons,
-    SearchBars,
-    SegmentedButtons,
-    Sliders,
-    Snackbars,
-    Switches,
-    Tabs,
-    TextFields,
-    TimePickers,
-    Tooltips,
-    TopAppBar
-)
+val Components =
+    listOf(
+        Adaptive,
+        Badge,
+        BottomAppBars,
+        BottomSheets,
+        Buttons,
+        Card,
+        Carousel,
+        Checkboxes,
+        Chips,
+        DatePickers,
+        Dialogs,
+        ExtendedFloatingActionButton,
+        FloatingActionButtons,
+        IconButtons,
+        Lists,
+        Menus,
+        NavigationBar,
+        NavigationDrawer,
+        NavigationRail,
+        NavigationSuiteScaffold,
+        ProgressIndicators,
+        PullToRefreshIndicators,
+        RadioButtons,
+        SearchBars,
+        SegmentedButtons,
+        Sliders,
+        Snackbars,
+        Switches,
+        Tabs,
+        TextFields,
+        TimePickers,
+        Tooltips,
+        TopAppBar
+    )
diff --git a/compose/material3/material3/integration-tests/material3-catalog/src/main/java/androidx/compose/material3/catalog/library/model/Examples.kt b/compose/material3/material3/integration-tests/material3-catalog/src/main/java/androidx/compose/material3/catalog/library/model/Examples.kt
index b91866d..f598f7a 100644
--- a/compose/material3/material3/integration-tests/material3-catalog/src/main/java/androidx/compose/material3/catalog/library/model/Examples.kt
+++ b/compose/material3/material3/integration-tests/material3-catalog/src/main/java/androidx/compose/material3/catalog/library/model/Examples.kt
@@ -193,17 +193,23 @@
             name = ::ListDetailPaneScaffoldSample.name,
             description = AdaptiveExampleDescription,
             sourceUrl = AdaptiveExampleSourceUrl
-        ) { ListDetailPaneScaffoldSample() },
+        ) {
+            ListDetailPaneScaffoldSample()
+        },
         Example(
             name = ::ListDetailPaneScaffoldSampleWithExtraPane.name,
             description = AdaptiveExampleDescription,
             sourceUrl = AdaptiveExampleSourceUrl
-        ) { ListDetailPaneScaffoldSampleWithExtraPane() },
+        ) {
+            ListDetailPaneScaffoldSampleWithExtraPane()
+        },
         Example(
             name = ::ListDetailPaneScaffoldWithNavigationSample.name,
             description = AdaptiveExampleDescription,
             sourceUrl = AdaptiveExampleSourceUrl
-        ) { ListDetailPaneScaffoldWithNavigationSample() }
+        ) {
+            ListDetailPaneScaffoldWithNavigationSample()
+        }
     )
 
 private const val BadgeExampleDescription = "Badge examples"
@@ -214,7 +220,9 @@
             name = ::NavigationBarItemWithBadge.name,
             description = BadgeExampleDescription,
             sourceUrl = BadgeExampleSourceUrl
-        ) { NavigationBarItemWithBadge() }
+        ) {
+            NavigationBarItemWithBadge()
+        }
     )
 
 private const val BottomSheetExampleDescription = "Bottom Sheet examples"
@@ -225,17 +233,23 @@
             name = ::ModalBottomSheetSample.name,
             description = BottomSheetExampleDescription,
             sourceUrl = BottomSheetExampleSourceUrl
-        ) { ModalBottomSheetSample() },
+        ) {
+            ModalBottomSheetSample()
+        },
         Example(
             name = ::SimpleBottomSheetScaffoldSample.name,
             description = BottomSheetExampleDescription,
             sourceUrl = BottomSheetExampleSourceUrl
-        ) { SimpleBottomSheetScaffoldSample() },
+        ) {
+            SimpleBottomSheetScaffoldSample()
+        },
         Example(
             name = ::BottomSheetScaffoldNestedScrollSample.name,
             description = BottomSheetExampleDescription,
             sourceUrl = BottomSheetExampleSourceUrl
-        ) { BottomSheetScaffoldNestedScrollSample() }
+        ) {
+            BottomSheetScaffoldNestedScrollSample()
+        }
     )
 
 private const val ButtonsExampleDescription = "Button examples"
@@ -246,254 +260,271 @@
             name = ::ButtonSample.name,
             description = ButtonsExampleDescription,
             sourceUrl = ButtonsExampleSourceUrl,
-        ) { ButtonSample() },
+        ) {
+            ButtonSample()
+        },
         Example(
             name = ::ElevatedButtonSample.name,
             description = ButtonsExampleDescription,
             sourceUrl = ButtonsExampleSourceUrl,
-        ) { ElevatedButtonSample() },
+        ) {
+            ElevatedButtonSample()
+        },
         Example(
             name = ::FilledTonalButtonSample.name,
             description = ButtonsExampleDescription,
             sourceUrl = ButtonsExampleSourceUrl,
-        ) { FilledTonalButtonSample() },
+        ) {
+            FilledTonalButtonSample()
+        },
         Example(
             name = ::OutlinedButtonSample.name,
             description = ButtonsExampleDescription,
             sourceUrl = ButtonsExampleSourceUrl,
-        ) { OutlinedButtonSample() },
+        ) {
+            OutlinedButtonSample()
+        },
         Example(
             name = ::TextButtonSample.name,
             description = ButtonsExampleDescription,
             sourceUrl = ButtonsExampleSourceUrl,
-        ) { TextButtonSample() },
+        ) {
+            TextButtonSample()
+        },
         Example(
             name = ::ButtonWithIconSample.name,
             description = ButtonsExampleDescription,
             sourceUrl = ButtonsExampleSourceUrl,
-        ) { ButtonWithIconSample() }
+        ) {
+            ButtonWithIconSample()
+        }
     )
 
 private const val CardsExampleDescription = "Cards examples"
 private const val CardsExampleSourceUrl = "$SampleSourceUrl/CardSamples.kt"
-val CardExamples = listOf(
-    Example(
-        name = ::CardSample.name,
-        description = CardsExampleDescription,
-        sourceUrl = CardsExampleSourceUrl
-    ) {
-        CardSample()
-    },
-    Example(
-        name = ::ClickableCardSample.name,
-        description = CardsExampleDescription,
-        sourceUrl = CardsExampleSourceUrl
-    ) {
-        ClickableCardSample()
-    },
-    Example(
-        name = ::ElevatedCardSample.name,
-        description = CardsExampleDescription,
-        sourceUrl = CardsExampleSourceUrl
-    ) {
-        ElevatedCardSample()
-    },
-    Example(
-        name = ::ClickableElevatedCardSample.name,
-        description = CardsExampleDescription,
-        sourceUrl = CardsExampleSourceUrl
-    ) {
-        ClickableElevatedCardSample()
-    },
-    Example(
-        name = ::OutlinedCardSample.name,
-        description = CardsExampleDescription,
-        sourceUrl = CardsExampleSourceUrl
-    ) {
-        OutlinedCardSample()
-    },
-    Example(
-        name = ::ClickableOutlinedCardSample.name,
-        description = CardsExampleDescription,
-        sourceUrl = CardsExampleSourceUrl
-    ) {
-        ClickableOutlinedCardSample()
-    }
-)
+val CardExamples =
+    listOf(
+        Example(
+            name = ::CardSample.name,
+            description = CardsExampleDescription,
+            sourceUrl = CardsExampleSourceUrl
+        ) {
+            CardSample()
+        },
+        Example(
+            name = ::ClickableCardSample.name,
+            description = CardsExampleDescription,
+            sourceUrl = CardsExampleSourceUrl
+        ) {
+            ClickableCardSample()
+        },
+        Example(
+            name = ::ElevatedCardSample.name,
+            description = CardsExampleDescription,
+            sourceUrl = CardsExampleSourceUrl
+        ) {
+            ElevatedCardSample()
+        },
+        Example(
+            name = ::ClickableElevatedCardSample.name,
+            description = CardsExampleDescription,
+            sourceUrl = CardsExampleSourceUrl
+        ) {
+            ClickableElevatedCardSample()
+        },
+        Example(
+            name = ::OutlinedCardSample.name,
+            description = CardsExampleDescription,
+            sourceUrl = CardsExampleSourceUrl
+        ) {
+            OutlinedCardSample()
+        },
+        Example(
+            name = ::ClickableOutlinedCardSample.name,
+            description = CardsExampleDescription,
+            sourceUrl = CardsExampleSourceUrl
+        ) {
+            ClickableOutlinedCardSample()
+        }
+    )
 
 private const val CarouselExampleDescription = "Carousel examples"
 private const val CarouselExampleSourceUrl = "$SampleSourceUrl/CarouselSamples.kt"
-val CarouselExamples = listOf(
-    Example(
-        name = ::HorizontalMultiBrowseCarouselSample.name,
-        description = CarouselExampleDescription,
-        sourceUrl = CarouselExampleSourceUrl
-    ) {
-        HorizontalMultiBrowseCarouselSample()
-    },
-    Example(
-        name = ::HorizontalUncontainedCarouselSample.name,
-        description = CarouselExampleDescription,
-        sourceUrl = CarouselExampleSourceUrl
-    ) {
-        HorizontalUncontainedCarouselSample()
-    },
-    Example(
-        name = ::FadingHorizontalMultiBrowseCarouselSample.name,
-        description = CarouselExampleDescription,
-        sourceUrl = CarouselExampleSourceUrl
-    ) {
-        FadingHorizontalMultiBrowseCarouselSample()
-    }
-)
+val CarouselExamples =
+    listOf(
+        Example(
+            name = ::HorizontalMultiBrowseCarouselSample.name,
+            description = CarouselExampleDescription,
+            sourceUrl = CarouselExampleSourceUrl
+        ) {
+            HorizontalMultiBrowseCarouselSample()
+        },
+        Example(
+            name = ::HorizontalUncontainedCarouselSample.name,
+            description = CarouselExampleDescription,
+            sourceUrl = CarouselExampleSourceUrl
+        ) {
+            HorizontalUncontainedCarouselSample()
+        },
+        Example(
+            name = ::FadingHorizontalMultiBrowseCarouselSample.name,
+            description = CarouselExampleDescription,
+            sourceUrl = CarouselExampleSourceUrl
+        ) {
+            FadingHorizontalMultiBrowseCarouselSample()
+        }
+    )
 
 private const val CheckboxesExampleDescription = "Checkboxes examples"
 private const val CheckboxesExampleSourceUrl = "$SampleSourceUrl/CheckboxSamples.kt"
-val CheckboxesExamples = listOf(
-    Example(
-        name = ::CheckboxSample.name,
-        description = CheckboxesExampleDescription,
-        sourceUrl = CheckboxesExampleSourceUrl
-    ) {
-        CheckboxSample()
-    },
-    Example(
-        name = ::CheckboxWithTextSample.name,
-        description = CheckboxesExampleDescription,
-        sourceUrl = CheckboxesExampleSourceUrl
-    ) {
-        CheckboxWithTextSample()
-    },
-    Example(
-        name = ::TriStateCheckboxSample.name,
-        description = CheckboxesExampleDescription,
-        sourceUrl = CheckboxesExampleSourceUrl
-    ) {
-        TriStateCheckboxSample()
-    }
-)
+val CheckboxesExamples =
+    listOf(
+        Example(
+            name = ::CheckboxSample.name,
+            description = CheckboxesExampleDescription,
+            sourceUrl = CheckboxesExampleSourceUrl
+        ) {
+            CheckboxSample()
+        },
+        Example(
+            name = ::CheckboxWithTextSample.name,
+            description = CheckboxesExampleDescription,
+            sourceUrl = CheckboxesExampleSourceUrl
+        ) {
+            CheckboxWithTextSample()
+        },
+        Example(
+            name = ::TriStateCheckboxSample.name,
+            description = CheckboxesExampleDescription,
+            sourceUrl = CheckboxesExampleSourceUrl
+        ) {
+            TriStateCheckboxSample()
+        }
+    )
 
 private const val ChipsExampleDescription = "Chips examples"
 private const val ChipsExampleSourceUrl = "$SampleSourceUrl/ChipSamples.kt"
-val ChipsExamples = listOf(
-    Example(
-        name = ::AssistChipSample.name,
-        description = ChipsExampleDescription,
-        sourceUrl = ChipsExampleSourceUrl
-    ) {
-        AssistChipSample()
-    },
-    Example(
-        name = ::ElevatedAssistChipSample.name,
-        description = ChipsExampleDescription,
-        sourceUrl = ChipsExampleSourceUrl
-    ) {
-        ElevatedAssistChipSample()
-    },
-    Example(
-        name = ::FilterChipSample.name,
-        description = ChipsExampleDescription,
-        sourceUrl = ChipsExampleSourceUrl
-    ) {
-        FilterChipSample()
-    },
-    Example(
-        name = ::ElevatedFilterChipSample.name,
-        description = ChipsExampleDescription,
-        sourceUrl = ChipsExampleSourceUrl
-    ) {
-        ElevatedFilterChipSample()
-    },
-    Example(
-        name = ::FilterChipWithLeadingIconSample.name,
-        description = ChipsExampleDescription,
-        sourceUrl = ChipsExampleSourceUrl
-    ) {
-        FilterChipWithLeadingIconSample()
-    },
-    Example(
-        name = ::InputChipSample.name,
-        description = ChipsExampleDescription,
-        sourceUrl = ChipsExampleSourceUrl
-    ) {
-        InputChipSample()
-    },
-    Example(
-        name = ::InputChipWithAvatarSample.name,
-        description = ChipsExampleDescription,
-        sourceUrl = ChipsExampleSourceUrl
-    ) {
-        InputChipWithAvatarSample()
-    },
-    Example(
-        name = ::SuggestionChipSample.name,
-        description = ChipsExampleDescription,
-        sourceUrl = ChipsExampleSourceUrl
-    ) {
-        SuggestionChipSample()
-    },
-    Example(
-        name = ::ElevatedSuggestionChipSample.name,
-        description = ChipsExampleDescription,
-        sourceUrl = ChipsExampleSourceUrl
-    ) {
-        ElevatedSuggestionChipSample()
-    },
-    Example(
-        name = ::ChipGroupSingleLineSample.name,
-        description = ChipsExampleDescription,
-        sourceUrl = ChipsExampleSourceUrl
-    ) {
-        ChipGroupSingleLineSample()
-    },
-    Example(
-        name = ::ChipGroupReflowSample.name,
-        description = ChipsExampleDescription,
-        sourceUrl = ChipsExampleSourceUrl
-    ) {
-        ChipGroupReflowSample()
-    }
-)
+val ChipsExamples =
+    listOf(
+        Example(
+            name = ::AssistChipSample.name,
+            description = ChipsExampleDescription,
+            sourceUrl = ChipsExampleSourceUrl
+        ) {
+            AssistChipSample()
+        },
+        Example(
+            name = ::ElevatedAssistChipSample.name,
+            description = ChipsExampleDescription,
+            sourceUrl = ChipsExampleSourceUrl
+        ) {
+            ElevatedAssistChipSample()
+        },
+        Example(
+            name = ::FilterChipSample.name,
+            description = ChipsExampleDescription,
+            sourceUrl = ChipsExampleSourceUrl
+        ) {
+            FilterChipSample()
+        },
+        Example(
+            name = ::ElevatedFilterChipSample.name,
+            description = ChipsExampleDescription,
+            sourceUrl = ChipsExampleSourceUrl
+        ) {
+            ElevatedFilterChipSample()
+        },
+        Example(
+            name = ::FilterChipWithLeadingIconSample.name,
+            description = ChipsExampleDescription,
+            sourceUrl = ChipsExampleSourceUrl
+        ) {
+            FilterChipWithLeadingIconSample()
+        },
+        Example(
+            name = ::InputChipSample.name,
+            description = ChipsExampleDescription,
+            sourceUrl = ChipsExampleSourceUrl
+        ) {
+            InputChipSample()
+        },
+        Example(
+            name = ::InputChipWithAvatarSample.name,
+            description = ChipsExampleDescription,
+            sourceUrl = ChipsExampleSourceUrl
+        ) {
+            InputChipWithAvatarSample()
+        },
+        Example(
+            name = ::SuggestionChipSample.name,
+            description = ChipsExampleDescription,
+            sourceUrl = ChipsExampleSourceUrl
+        ) {
+            SuggestionChipSample()
+        },
+        Example(
+            name = ::ElevatedSuggestionChipSample.name,
+            description = ChipsExampleDescription,
+            sourceUrl = ChipsExampleSourceUrl
+        ) {
+            ElevatedSuggestionChipSample()
+        },
+        Example(
+            name = ::ChipGroupSingleLineSample.name,
+            description = ChipsExampleDescription,
+            sourceUrl = ChipsExampleSourceUrl
+        ) {
+            ChipGroupSingleLineSample()
+        },
+        Example(
+            name = ::ChipGroupReflowSample.name,
+            description = ChipsExampleDescription,
+            sourceUrl = ChipsExampleSourceUrl
+        ) {
+            ChipGroupReflowSample()
+        }
+    )
 
 private const val DatePickerExampleDescription = "Date picker examples"
 private const val DatePickerExampleSourceUrl = "$SampleSourceUrl/DatePickerSamples.kt"
-val DatePickerExamples = listOf(
-    Example(
-        name = ::DatePickerSample.name,
-        description = DatePickerExampleDescription,
-        sourceUrl = DatePickerExampleSourceUrl
-    ) {
-        DatePickerSample()
-    },
-    Example(
-        name = ::DatePickerDialogSample.name,
-        description = DatePickerExampleDescription,
-        sourceUrl = DatePickerExampleSourceUrl
-    ) {
-        DatePickerDialogSample()
-    },
-    Example(
-        name = ::DatePickerWithDateSelectableDatesSample.name,
-        description = DatePickerExampleDescription,
-        sourceUrl = DatePickerExampleSourceUrl
-    ) {
-        DatePickerWithDateSelectableDatesSample()
-    },
-    Example(
-        name = ::DateInputSample.name,
-        description = DatePickerExampleDescription,
-        sourceUrl = DatePickerExampleSourceUrl
-    ) {
-        DateInputSample()
-    },
-    Example(
-        name = ::DateRangePickerSample.name,
-        description = DatePickerExampleDescription,
-        sourceUrl = DatePickerExampleSourceUrl
-    ) {
-        DateRangePickerSample()
-    },
-)
+val DatePickerExamples =
+    listOf(
+        Example(
+            name = ::DatePickerSample.name,
+            description = DatePickerExampleDescription,
+            sourceUrl = DatePickerExampleSourceUrl
+        ) {
+            DatePickerSample()
+        },
+        Example(
+            name = ::DatePickerDialogSample.name,
+            description = DatePickerExampleDescription,
+            sourceUrl = DatePickerExampleSourceUrl
+        ) {
+            DatePickerDialogSample()
+        },
+        Example(
+            name = ::DatePickerWithDateSelectableDatesSample.name,
+            description = DatePickerExampleDescription,
+            sourceUrl = DatePickerExampleSourceUrl
+        ) {
+            DatePickerWithDateSelectableDatesSample()
+        },
+        Example(
+            name = ::DateInputSample.name,
+            description = DatePickerExampleDescription,
+            sourceUrl = DatePickerExampleSourceUrl
+        ) {
+            DateInputSample()
+        },
+        Example(
+            name = ::DateRangePickerSample.name,
+            description = DatePickerExampleDescription,
+            sourceUrl = DatePickerExampleSourceUrl
+        ) {
+            DateRangePickerSample()
+        },
+    )
 
 private const val DialogExampleDescription = "Dialog examples"
 private const val DialogExampleSourceUrl = "$SampleSourceUrl/AlertDialogSamples.kt"
@@ -503,38 +534,51 @@
             name = ::AlertDialogSample.name,
             description = DialogExampleDescription,
             sourceUrl = DialogExampleSourceUrl,
-        ) { AlertDialogSample() },
+        ) {
+            AlertDialogSample()
+        },
         Example(
             name = ::AlertDialogWithIconSample.name,
             description = DialogExampleDescription,
             sourceUrl = DialogExampleSourceUrl,
-        ) { AlertDialogWithIconSample() },
+        ) {
+            AlertDialogWithIconSample()
+        },
         Example(
             name = ::BasicAlertDialogSample.name,
             description = DialogExampleDescription,
             sourceUrl = DialogExampleSourceUrl,
-        ) { BasicAlertDialogSample() },
+        ) {
+            BasicAlertDialogSample()
+        },
     )
 
 private const val BottomAppBarsExampleDescription = "Bottom app bar examples"
 private const val BottomAppBarsExampleSourceUrl = "$SampleSourceUrl/AppBarSamples.kt"
-val BottomAppBarsExamples = listOf(
-    Example(
-        name = ::SimpleBottomAppBar.name,
-        description = BottomAppBarsExampleDescription,
-        sourceUrl = BottomAppBarsExampleSourceUrl,
-    ) { SimpleBottomAppBar() },
-    Example(
-        name = ::BottomAppBarWithFAB.name,
-        description = BottomAppBarsExampleDescription,
-        sourceUrl = BottomAppBarsExampleSourceUrl,
-    ) { BottomAppBarWithFAB() },
-    Example(
-        name = ::ExitAlwaysBottomAppBar.name,
-        description = BottomAppBarsExampleDescription,
-        sourceUrl = BottomAppBarsExampleSourceUrl,
-    ) { ExitAlwaysBottomAppBar() }
-)
+val BottomAppBarsExamples =
+    listOf(
+        Example(
+            name = ::SimpleBottomAppBar.name,
+            description = BottomAppBarsExampleDescription,
+            sourceUrl = BottomAppBarsExampleSourceUrl,
+        ) {
+            SimpleBottomAppBar()
+        },
+        Example(
+            name = ::BottomAppBarWithFAB.name,
+            description = BottomAppBarsExampleDescription,
+            sourceUrl = BottomAppBarsExampleSourceUrl,
+        ) {
+            BottomAppBarWithFAB()
+        },
+        Example(
+            name = ::ExitAlwaysBottomAppBar.name,
+            description = BottomAppBarsExampleDescription,
+            sourceUrl = BottomAppBarsExampleSourceUrl,
+        ) {
+            ExitAlwaysBottomAppBar()
+        }
+    )
 
 private const val TopAppBarExampleDescription = "Top app bar examples"
 private const val TopAppBarExampleSourceUrl = "$SampleSourceUrl/AppBarSamples.kt"
@@ -544,32 +588,44 @@
             name = ::SimpleTopAppBar.name,
             description = TopAppBarExampleDescription,
             sourceUrl = TopAppBarExampleSourceUrl,
-        ) { SimpleTopAppBar() },
+        ) {
+            SimpleTopAppBar()
+        },
         Example(
             name = ::SimpleCenterAlignedTopAppBar.name,
             description = TopAppBarExampleDescription,
             sourceUrl = TopAppBarExampleSourceUrl,
-        ) { SimpleCenterAlignedTopAppBar() },
+        ) {
+            SimpleCenterAlignedTopAppBar()
+        },
         Example(
             name = ::PinnedTopAppBar.name,
             description = TopAppBarExampleDescription,
             sourceUrl = TopAppBarExampleSourceUrl,
-        ) { PinnedTopAppBar() },
+        ) {
+            PinnedTopAppBar()
+        },
         Example(
             name = ::EnterAlwaysTopAppBar.name,
             description = TopAppBarExampleDescription,
             sourceUrl = TopAppBarExampleSourceUrl,
-        ) { EnterAlwaysTopAppBar() },
+        ) {
+            EnterAlwaysTopAppBar()
+        },
         Example(
             name = ::ExitUntilCollapsedMediumTopAppBar.name,
             description = TopAppBarExampleDescription,
             sourceUrl = TopAppBarExampleSourceUrl,
-        ) { ExitUntilCollapsedMediumTopAppBar() },
+        ) {
+            ExitUntilCollapsedMediumTopAppBar()
+        },
         Example(
             name = ::ExitUntilCollapsedLargeTopAppBar.name,
             description = TopAppBarExampleDescription,
             sourceUrl = TopAppBarExampleSourceUrl,
-        ) { ExitUntilCollapsedLargeTopAppBar() },
+        ) {
+            ExitUntilCollapsedLargeTopAppBar()
+        },
     )
 
 private const val ExtendedFABExampleDescription = "Extended FAB examples"
@@ -580,17 +636,23 @@
             name = ::ExtendedFloatingActionButtonSample.name,
             description = ExtendedFABExampleDescription,
             sourceUrl = ExtendedFABExampleSourceUrl,
-        ) { ExtendedFloatingActionButtonSample() },
+        ) {
+            ExtendedFloatingActionButtonSample()
+        },
         Example(
             name = ::ExtendedFloatingActionButtonTextSample.name,
             description = ExtendedFABExampleDescription,
             sourceUrl = ExtendedFABExampleSourceUrl,
-        ) { ExtendedFloatingActionButtonTextSample() },
+        ) {
+            ExtendedFloatingActionButtonTextSample()
+        },
         Example(
             name = ::AnimatedExtendedFloatingActionButtonSample.name,
             description = ExtendedFABExampleDescription,
             sourceUrl = ExtendedFABExampleSourceUrl,
-        ) { AnimatedExtendedFloatingActionButtonSample() },
+        ) {
+            AnimatedExtendedFloatingActionButtonSample()
+        },
     )
 
 private const val FloatingActionButtonsExampleDescription = "Floating action button examples"
@@ -602,51 +664,58 @@
             name = ::FloatingActionButtonSample.name,
             description = FloatingActionButtonsExampleDescription,
             sourceUrl = FloatingActionButtonsExampleSourceUrl,
-        ) { FloatingActionButtonSample() },
+        ) {
+            FloatingActionButtonSample()
+        },
         Example(
             name = ::LargeFloatingActionButtonSample.name,
             description = FloatingActionButtonsExampleDescription,
             sourceUrl = FloatingActionButtonsExampleSourceUrl,
-        ) { LargeFloatingActionButtonSample() },
+        ) {
+            LargeFloatingActionButtonSample()
+        },
         Example(
             name = ::SmallFloatingActionButtonSample.name,
             description = FloatingActionButtonsExampleDescription,
             sourceUrl = FloatingActionButtonsExampleSourceUrl,
-        ) { SmallFloatingActionButtonSample() }
+        ) {
+            SmallFloatingActionButtonSample()
+        }
     )
 
 private const val ListsExampleDescription = "List examples"
 private const val ListsExampleSourceUrl = "$SampleSourceUrl/ListSamples.kt"
-val ListsExamples = listOf(
-    Example(
-        name = ::OneLineListItem.name,
-        description = ListsExampleDescription,
-        sourceUrl = ListsExampleSourceUrl
-    ) {
-        OneLineListItem()
-    },
-    Example(
-        name = ::TwoLineListItem.name,
-        description = ListsExampleDescription,
-        sourceUrl = ListsExampleSourceUrl
-    ) {
-        TwoLineListItem()
-    },
-    Example(
-        name = ::ThreeLineListItemWithOverlineAndSupporting.name,
-        description = ListsExampleDescription,
-        sourceUrl = ListsExampleSourceUrl
-    ) {
-        ThreeLineListItemWithOverlineAndSupporting()
-    },
-    Example(
-        name = ::ThreeLineListItemWithExtendedSupporting.name,
-        description = ListsExampleDescription,
-        sourceUrl = ListsExampleSourceUrl
-    ) {
-        ThreeLineListItemWithExtendedSupporting()
-    },
-)
+val ListsExamples =
+    listOf(
+        Example(
+            name = ::OneLineListItem.name,
+            description = ListsExampleDescription,
+            sourceUrl = ListsExampleSourceUrl
+        ) {
+            OneLineListItem()
+        },
+        Example(
+            name = ::TwoLineListItem.name,
+            description = ListsExampleDescription,
+            sourceUrl = ListsExampleSourceUrl
+        ) {
+            TwoLineListItem()
+        },
+        Example(
+            name = ::ThreeLineListItemWithOverlineAndSupporting.name,
+            description = ListsExampleDescription,
+            sourceUrl = ListsExampleSourceUrl
+        ) {
+            ThreeLineListItemWithOverlineAndSupporting()
+        },
+        Example(
+            name = ::ThreeLineListItemWithExtendedSupporting.name,
+            description = ListsExampleDescription,
+            sourceUrl = ListsExampleSourceUrl
+        ) {
+            ThreeLineListItemWithExtendedSupporting()
+        },
+    )
 
 private const val IconButtonExampleDescription = "Icon button examples"
 private const val IconButtonExampleSourceUrl = "$SampleSourceUrl/IconButtonSamples.kt"
@@ -656,81 +725,100 @@
             name = ::IconButtonSample.name,
             description = IconButtonExampleDescription,
             sourceUrl = IconButtonExampleSourceUrl,
-        ) { IconButtonSample() },
+        ) {
+            IconButtonSample()
+        },
         Example(
             name = ::TintedIconButtonSample.name,
             description = IconButtonExampleDescription,
             sourceUrl = IconButtonExampleSourceUrl,
-        ) { TintedIconButtonSample() },
+        ) {
+            TintedIconButtonSample()
+        },
         Example(
             name = ::IconToggleButtonSample.name,
             description = IconButtonExampleDescription,
             sourceUrl = IconButtonExampleSourceUrl,
-        ) { IconToggleButtonSample() },
+        ) {
+            IconToggleButtonSample()
+        },
         Example(
             name = ::FilledIconButtonSample.name,
             description = IconButtonExampleDescription,
             sourceUrl = IconButtonExampleSourceUrl,
-        ) { FilledIconButtonSample() },
+        ) {
+            FilledIconButtonSample()
+        },
         Example(
             name = ::FilledIconToggleButtonSample.name,
             description = IconButtonExampleDescription,
             sourceUrl = IconButtonExampleSourceUrl,
-        ) { FilledIconToggleButtonSample() },
+        ) {
+            FilledIconToggleButtonSample()
+        },
         Example(
             name = ::FilledTonalIconButtonSample.name,
             description = IconButtonExampleDescription,
             sourceUrl = IconButtonExampleSourceUrl,
-        ) { FilledTonalIconButtonSample() },
+        ) {
+            FilledTonalIconButtonSample()
+        },
         Example(
             name = ::FilledTonalIconToggleButtonSample.name,
             description = IconButtonExampleDescription,
             sourceUrl = IconButtonExampleSourceUrl,
-        ) { FilledTonalIconToggleButtonSample() },
+        ) {
+            FilledTonalIconToggleButtonSample()
+        },
         Example(
             name = ::OutlinedIconButtonSample.name,
             description = IconButtonExampleDescription,
             sourceUrl = IconButtonExampleSourceUrl,
-        ) { OutlinedIconButtonSample() },
+        ) {
+            OutlinedIconButtonSample()
+        },
         Example(
             name = ::OutlinedIconToggleButtonSample.name,
             description = IconButtonExampleDescription,
             sourceUrl = IconButtonExampleSourceUrl,
-        ) { OutlinedIconToggleButtonSample() }
+        ) {
+            OutlinedIconToggleButtonSample()
+        }
     )
 
 private const val MenusExampleDescription = "Menus examples"
 private const val MenusExampleSourceUrl = "$SampleSourceUrl/MenuSamples.kt"
-val MenusExamples = listOf(
-    Example(
-        name = ::MenuSample.name,
-        description = MenusExampleDescription,
-        sourceUrl = MenusExampleSourceUrl
-    ) {
-        MenuSample()
-    },
-    Example(
-        name = ::MenuWithScrollStateSample.name,
-        description = MenusExampleDescription,
-        sourceUrl = MenusExampleSourceUrl
-    ) {
-        MenuWithScrollStateSample()
-    },
-    Example(
-        name = ::ExposedDropdownMenuSample.name,
-        description = MenusExampleDescription,
-        sourceUrl = MenusExampleSourceUrl
-    ) {
-        ExposedDropdownMenuSample()
-    },
-    Example(
-        name = ::EditableExposedDropdownMenuSample.name,
-        description = MenusExampleDescription,
-        sourceUrl = MenusExampleSourceUrl
-    ) {
-        EditableExposedDropdownMenuSample()
-    },
-)
+val MenusExamples =
+    listOf(
+        Example(
+            name = ::MenuSample.name,
+            description = MenusExampleDescription,
+            sourceUrl = MenusExampleSourceUrl
+        ) {
+            MenuSample()
+        },
+        Example(
+            name = ::MenuWithScrollStateSample.name,
+            description = MenusExampleDescription,
+            sourceUrl = MenusExampleSourceUrl
+        ) {
+            MenuWithScrollStateSample()
+        },
+        Example(
+            name = ::ExposedDropdownMenuSample.name,
+            description = MenusExampleDescription,
+            sourceUrl = MenusExampleSourceUrl
+        ) {
+            ExposedDropdownMenuSample()
+        },
+        Example(
+            name = ::EditableExposedDropdownMenuSample.name,
+            description = MenusExampleDescription,
+            sourceUrl = MenusExampleSourceUrl
+        ) {
+            EditableExposedDropdownMenuSample()
+        },
+    )
 
 private const val NavigationBarExampleDescription = "Navigation bar examples"
 private const val NavigationBarExampleSourceUrl = "$SampleSourceUrl/NavigationBarSamples.kt"
@@ -740,12 +828,16 @@
             name = ::NavigationBarSample.name,
             description = NavigationBarExampleDescription,
             sourceUrl = NavigationBarExampleSourceUrl,
-        ) { NavigationBarSample() },
+        ) {
+            NavigationBarSample()
+        },
         Example(
             name = ::NavigationBarWithOnlySelectedLabelsSample.name,
             description = NavigationBarExampleDescription,
             sourceUrl = NavigationBarExampleSourceUrl,
-        ) { NavigationBarWithOnlySelectedLabelsSample() },
+        ) {
+            NavigationBarWithOnlySelectedLabelsSample()
+        },
     )
 
 private const val NavigationRailExampleDescription = "Navigation rail examples"
@@ -756,44 +848,51 @@
             name = ::NavigationRailSample.name,
             description = NavigationRailExampleDescription,
             sourceUrl = NavigationRailExampleSourceUrl,
-        ) { NavigationRailSample() },
+        ) {
+            NavigationRailSample()
+        },
         Example(
             name = ::NavigationRailWithOnlySelectedLabelsSample.name,
             description = NavigationRailExampleDescription,
             sourceUrl = NavigationRailExampleSourceUrl,
-        ) { NavigationRailWithOnlySelectedLabelsSample() },
+        ) {
+            NavigationRailWithOnlySelectedLabelsSample()
+        },
         Example(
             name = ::NavigationRailBottomAlignSample.name,
             description = NavigationRailExampleDescription,
             sourceUrl = NavigationRailExampleSourceUrl,
-        ) { NavigationRailBottomAlignSample() },
+        ) {
+            NavigationRailBottomAlignSample()
+        },
     )
 
 private const val NavigationDrawerExampleDescription = "Navigation drawer examples"
 private const val NavigationDrawerExampleSourceUrl = "$SampleSourceUrl/DrawerSamples.kt"
-val NavigationDrawerExamples = listOf(
-    Example(
-        name = ::ModalNavigationDrawerSample.name,
-        description = NavigationDrawerExampleDescription,
-        sourceUrl = NavigationDrawerExampleSourceUrl
-    ) {
-        ModalNavigationDrawerSample()
-    },
-    Example(
-        name = ::PermanentNavigationDrawerSample.name,
-        description = NavigationDrawerExampleDescription,
-        sourceUrl = NavigationDrawerExampleSourceUrl
-    ) {
-        PermanentNavigationDrawerSample()
-    },
-    Example(
-        name = ::DismissibleNavigationDrawerSample.name,
-        description = NavigationDrawerExampleDescription,
-        sourceUrl = NavigationDrawerExampleSourceUrl
-    ) {
-        DismissibleNavigationDrawerSample()
-    }
-)
+val NavigationDrawerExamples =
+    listOf(
+        Example(
+            name = ::ModalNavigationDrawerSample.name,
+            description = NavigationDrawerExampleDescription,
+            sourceUrl = NavigationDrawerExampleSourceUrl
+        ) {
+            ModalNavigationDrawerSample()
+        },
+        Example(
+            name = ::PermanentNavigationDrawerSample.name,
+            description = NavigationDrawerExampleDescription,
+            sourceUrl = NavigationDrawerExampleSourceUrl
+        ) {
+            PermanentNavigationDrawerSample()
+        },
+        Example(
+            name = ::DismissibleNavigationDrawerSample.name,
+            description = NavigationDrawerExampleDescription,
+            sourceUrl = NavigationDrawerExampleSourceUrl
+        ) {
+            DismissibleNavigationDrawerSample()
+        }
+    )
 
 private const val NavigationSuiteScaffoldExampleDescription = "Navigation suite scaffold examples"
 private const val NavigationSuiteScaffoldExampleSourceUrl =
@@ -804,529 +903,543 @@
             name = ::NavigationSuiteScaffoldSample.name,
             description = NavigationSuiteScaffoldExampleDescription,
             sourceUrl = NavigationSuiteScaffoldExampleSourceUrl,
-        ) { NavigationSuiteScaffoldSample() },
+        ) {
+            NavigationSuiteScaffoldSample()
+        },
         Example(
             name = ::NavigationSuiteScaffoldCustomConfigSample.name,
             description = NavigationSuiteScaffoldExampleDescription,
             sourceUrl = NavigationSuiteScaffoldExampleSourceUrl,
-        ) { NavigationSuiteScaffoldCustomConfigSample() },
+        ) {
+            NavigationSuiteScaffoldCustomConfigSample()
+        },
         Example(
             name = ::NavigationSuiteScaffoldCustomNavigationRail.name,
             description = NavigationSuiteScaffoldExampleDescription,
             sourceUrl = NavigationSuiteScaffoldExampleSourceUrl,
-        ) { NavigationSuiteScaffoldCustomNavigationRail() },
+        ) {
+            NavigationSuiteScaffoldCustomNavigationRail()
+        },
     )
 
 private const val ProgressIndicatorsExampleDescription = "Progress indicators examples"
-private const val ProgressIndicatorsExampleSourceUrl = "$SampleSourceUrl/" +
-    "ProgressIndicatorSamples.kt"
-val ProgressIndicatorsExamples = listOf(
-    Example(
-        name = ::LinearProgressIndicatorSample.name,
-        description = ProgressIndicatorsExampleDescription,
-        sourceUrl = ProgressIndicatorsExampleSourceUrl
-    ) {
-        LinearProgressIndicatorSample()
-    },
-    Example(
-        name = ::IndeterminateLinearProgressIndicatorSample.name,
-        description = ProgressIndicatorsExampleDescription,
-        sourceUrl = ProgressIndicatorsExampleSourceUrl
-    ) {
-        IndeterminateLinearProgressIndicatorSample()
-    },
-    Example(
-        name = ::CircularProgressIndicatorSample.name,
-        description = ProgressIndicatorsExampleDescription,
-        sourceUrl = ProgressIndicatorsExampleSourceUrl
-    ) {
-        CircularProgressIndicatorSample()
-    },
-    Example(
-        name = ::IndeterminateCircularProgressIndicatorSample.name,
-        description = ProgressIndicatorsExampleDescription,
-        sourceUrl = ProgressIndicatorsExampleSourceUrl
-    ) {
-        IndeterminateCircularProgressIndicatorSample()
-    }
-)
+private const val ProgressIndicatorsExampleSourceUrl =
+    "$SampleSourceUrl/" + "ProgressIndicatorSamples.kt"
+val ProgressIndicatorsExamples =
+    listOf(
+        Example(
+            name = ::LinearProgressIndicatorSample.name,
+            description = ProgressIndicatorsExampleDescription,
+            sourceUrl = ProgressIndicatorsExampleSourceUrl
+        ) {
+            LinearProgressIndicatorSample()
+        },
+        Example(
+            name = ::IndeterminateLinearProgressIndicatorSample.name,
+            description = ProgressIndicatorsExampleDescription,
+            sourceUrl = ProgressIndicatorsExampleSourceUrl
+        ) {
+            IndeterminateLinearProgressIndicatorSample()
+        },
+        Example(
+            name = ::CircularProgressIndicatorSample.name,
+            description = ProgressIndicatorsExampleDescription,
+            sourceUrl = ProgressIndicatorsExampleSourceUrl
+        ) {
+            CircularProgressIndicatorSample()
+        },
+        Example(
+            name = ::IndeterminateCircularProgressIndicatorSample.name,
+            description = ProgressIndicatorsExampleDescription,
+            sourceUrl = ProgressIndicatorsExampleSourceUrl
+        ) {
+            IndeterminateCircularProgressIndicatorSample()
+        }
+    )
 
 private const val PullToRefreshExampleDescription = "Pull-to-refresh examples"
 private const val PullToRefreshExampleSourceUrl = "$SampleSourceUrl/PullToRefreshSamples.kt"
-val PullToRefreshExamples = listOf(
-    Example(
-        name = ::PullToRefreshSample.name,
-        description = PullToRefreshExampleDescription,
-        sourceUrl = PullToRefreshExampleSourceUrl
-    ) {
-        PullToRefreshSample()
-    },
-    Example(
-        name = ::PullToRefreshScalingSample.name,
-        description = PullToRefreshExampleDescription,
-        sourceUrl = PullToRefreshExampleSourceUrl
-    ) {
-        PullToRefreshScalingSample()
-    },
-    Example(
-        name = ::PullToRefreshSampleCustomState.name,
-        description = PullToRefreshExampleDescription,
-        sourceUrl = PullToRefreshExampleSourceUrl
-    ) {
-        PullToRefreshSampleCustomState()
-    },
-    Example(
-        name = ::PullToRefreshViewModelSample.name,
-        description = PullToRefreshExampleDescription,
-        sourceUrl = PullToRefreshExampleSourceUrl
-    ) {
-        PullToRefreshViewModelSample()
-    },
-)
+val PullToRefreshExamples =
+    listOf(
+        Example(
+            name = ::PullToRefreshSample.name,
+            description = PullToRefreshExampleDescription,
+            sourceUrl = PullToRefreshExampleSourceUrl
+        ) {
+            PullToRefreshSample()
+        },
+        Example(
+            name = ::PullToRefreshScalingSample.name,
+            description = PullToRefreshExampleDescription,
+            sourceUrl = PullToRefreshExampleSourceUrl
+        ) {
+            PullToRefreshScalingSample()
+        },
+        Example(
+            name = ::PullToRefreshSampleCustomState.name,
+            description = PullToRefreshExampleDescription,
+            sourceUrl = PullToRefreshExampleSourceUrl
+        ) {
+            PullToRefreshSampleCustomState()
+        },
+        Example(
+            name = ::PullToRefreshViewModelSample.name,
+            description = PullToRefreshExampleDescription,
+            sourceUrl = PullToRefreshExampleSourceUrl
+        ) {
+            PullToRefreshViewModelSample()
+        },
+    )
 
 private const val RadioButtonsExampleDescription = "Radio buttons examples"
 private const val RadioButtonsExampleSourceUrl = "$SampleSourceUrl/RadioButtonSamples.kt"
-val RadioButtonsExamples = listOf(
-    Example(
-        name = ::RadioButtonSample.name,
-        description = RadioButtonsExampleDescription,
-        sourceUrl = RadioButtonsExampleSourceUrl
-    ) {
-        RadioButtonSample()
-    },
-    Example(
-        name = ::RadioGroupSample.name,
-        description = RadioButtonsExampleDescription,
-        sourceUrl = RadioButtonsExampleSourceUrl
-    ) {
-        RadioGroupSample()
-    },
-)
+val RadioButtonsExamples =
+    listOf(
+        Example(
+            name = ::RadioButtonSample.name,
+            description = RadioButtonsExampleDescription,
+            sourceUrl = RadioButtonsExampleSourceUrl
+        ) {
+            RadioButtonSample()
+        },
+        Example(
+            name = ::RadioGroupSample.name,
+            description = RadioButtonsExampleDescription,
+            sourceUrl = RadioButtonsExampleSourceUrl
+        ) {
+            RadioGroupSample()
+        },
+    )
 
 private const val SearchBarExampleDescription = "Search bar examples"
 private const val SearchBarExampleSourceUrl = "$SampleSourceUrl/SearchBarSamples.kt"
-val SearchBarExamples = listOf(
-    Example(
-        name = ::SearchBarSample.name,
-        description = SearchBarExampleDescription,
-        sourceUrl = SearchBarExampleSourceUrl
-    ) {
-        SearchBarSample()
-    },
-    Example(
-        name = ::DockedSearchBarSample.name,
-        description = SearchBarExampleDescription,
-        sourceUrl = SearchBarExampleSourceUrl
-    ) {
-        DockedSearchBarSample()
-    }
-)
+val SearchBarExamples =
+    listOf(
+        Example(
+            name = ::SearchBarSample.name,
+            description = SearchBarExampleDescription,
+            sourceUrl = SearchBarExampleSourceUrl
+        ) {
+            SearchBarSample()
+        },
+        Example(
+            name = ::DockedSearchBarSample.name,
+            description = SearchBarExampleDescription,
+            sourceUrl = SearchBarExampleSourceUrl
+        ) {
+            DockedSearchBarSample()
+        }
+    )
 
 private const val SegmentedButtonExampleDescription = "Segmented Button examples"
 private const val SegmentedButtonSourceUrl = "$SampleSourceUrl/SegmentedButtonSamples.kt"
-val SegmentedButtonExamples = listOf(
-    Example(
-        name = ::SegmentedButtonSingleSelectSample.name,
-        description = SegmentedButtonExampleDescription,
-        sourceUrl = SegmentedButtonSourceUrl
-    ) {
-        SegmentedButtonSingleSelectSample()
-    },
-    Example(
-        name = ::SegmentedButtonMultiSelectSample.name,
-        description = SegmentedButtonExampleDescription,
-        sourceUrl = SegmentedButtonSourceUrl
-    ) {
-        SegmentedButtonMultiSelectSample()
-    },
-)
+val SegmentedButtonExamples =
+    listOf(
+        Example(
+            name = ::SegmentedButtonSingleSelectSample.name,
+            description = SegmentedButtonExampleDescription,
+            sourceUrl = SegmentedButtonSourceUrl
+        ) {
+            SegmentedButtonSingleSelectSample()
+        },
+        Example(
+            name = ::SegmentedButtonMultiSelectSample.name,
+            description = SegmentedButtonExampleDescription,
+            sourceUrl = SegmentedButtonSourceUrl
+        ) {
+            SegmentedButtonMultiSelectSample()
+        },
+    )
 
 private const val SlidersExampleDescription = "Sliders examples"
 private const val SlidersExampleSourceUrl = "$SampleSourceUrl/SliderSamples.kt"
-val SlidersExamples = listOf(
-    Example(
-        name = ::SliderSample.name,
-        description = SlidersExampleDescription,
-        sourceUrl = SlidersExampleSourceUrl
-    ) {
-        SliderSample()
-    },
-    Example(
-        name = ::StepsSliderSample.name,
-        description = SlidersExampleDescription,
-        sourceUrl = SlidersExampleSourceUrl
-    ) {
-        StepsSliderSample()
-    },
-    Example(
-        name = ::SliderWithCustomThumbSample.name,
-        description = SlidersExampleDescription,
-        sourceUrl = SlidersExampleSourceUrl
-    ) {
-        SliderWithCustomThumbSample()
-    },
-    Example(
-        name = ::SliderWithCustomTrackAndThumb.name,
-        description = SlidersExampleDescription,
-        sourceUrl = SlidersExampleSourceUrl
-    ) {
-        SliderWithCustomTrackAndThumb()
-    },
-    Example(
-        name = ::RangeSliderSample.name,
-        description = SlidersExampleDescription,
-        sourceUrl = SlidersExampleSourceUrl
-    ) {
-        RangeSliderSample()
-    },
-    Example(
-        name = ::StepRangeSliderSample.name,
-        description = SlidersExampleDescription,
-        sourceUrl = SlidersExampleSourceUrl
-    ) {
-        StepRangeSliderSample()
-    },
-    Example(
-        name = ::RangeSliderWithCustomComponents.name,
-        description = SlidersExampleDescription,
-        sourceUrl = SlidersExampleSourceUrl
-    ) {
-        RangeSliderWithCustomComponents()
-    }
-)
+val SlidersExamples =
+    listOf(
+        Example(
+            name = ::SliderSample.name,
+            description = SlidersExampleDescription,
+            sourceUrl = SlidersExampleSourceUrl
+        ) {
+            SliderSample()
+        },
+        Example(
+            name = ::StepsSliderSample.name,
+            description = SlidersExampleDescription,
+            sourceUrl = SlidersExampleSourceUrl
+        ) {
+            StepsSliderSample()
+        },
+        Example(
+            name = ::SliderWithCustomThumbSample.name,
+            description = SlidersExampleDescription,
+            sourceUrl = SlidersExampleSourceUrl
+        ) {
+            SliderWithCustomThumbSample()
+        },
+        Example(
+            name = ::SliderWithCustomTrackAndThumb.name,
+            description = SlidersExampleDescription,
+            sourceUrl = SlidersExampleSourceUrl
+        ) {
+            SliderWithCustomTrackAndThumb()
+        },
+        Example(
+            name = ::RangeSliderSample.name,
+            description = SlidersExampleDescription,
+            sourceUrl = SlidersExampleSourceUrl
+        ) {
+            RangeSliderSample()
+        },
+        Example(
+            name = ::StepRangeSliderSample.name,
+            description = SlidersExampleDescription,
+            sourceUrl = SlidersExampleSourceUrl
+        ) {
+            StepRangeSliderSample()
+        },
+        Example(
+            name = ::RangeSliderWithCustomComponents.name,
+            description = SlidersExampleDescription,
+            sourceUrl = SlidersExampleSourceUrl
+        ) {
+            RangeSliderWithCustomComponents()
+        }
+    )
 
 private const val SnackbarsExampleDescription = "Snackbars examples"
 private const val SnackbarsExampleSourceUrl = "$SampleSourceUrl/ScaffoldSamples.kt"
-val SnackbarsExamples = listOf(
-    Example(
-        name = ::ScaffoldWithSimpleSnackbar.name,
-        description = SnackbarsExampleDescription,
-        sourceUrl = SnackbarsExampleSourceUrl
-    ) {
-        ScaffoldWithSimpleSnackbar()
-    },
-    Example(
-        name = ::ScaffoldWithIndefiniteSnackbar.name,
-        description = SnackbarsExampleDescription,
-        sourceUrl = SnackbarsExampleSourceUrl
-    ) {
-        ScaffoldWithIndefiniteSnackbar()
-    },
-    Example(
-        name = ::ScaffoldWithCustomSnackbar.name,
-        description = SnackbarsExampleDescription,
-        sourceUrl = SnackbarsExampleSourceUrl
-    ) {
-        ScaffoldWithCustomSnackbar()
-    },
-    Example(
-        name = ::ScaffoldWithCoroutinesSnackbar.name,
-        description = SnackbarsExampleDescription,
-        sourceUrl = SnackbarsExampleSourceUrl
-    ) {
-        ScaffoldWithCoroutinesSnackbar()
-    },
-    Example(
-        name = ::ScaffoldWithMultilineSnackbar.name,
-        description = SnackbarsExampleDescription,
-        sourceUrl = SnackbarsExampleSourceUrl
-    ) {
-        ScaffoldWithMultilineSnackbar()
-    }
-)
+val SnackbarsExamples =
+    listOf(
+        Example(
+            name = ::ScaffoldWithSimpleSnackbar.name,
+            description = SnackbarsExampleDescription,
+            sourceUrl = SnackbarsExampleSourceUrl
+        ) {
+            ScaffoldWithSimpleSnackbar()
+        },
+        Example(
+            name = ::ScaffoldWithIndefiniteSnackbar.name,
+            description = SnackbarsExampleDescription,
+            sourceUrl = SnackbarsExampleSourceUrl
+        ) {
+            ScaffoldWithIndefiniteSnackbar()
+        },
+        Example(
+            name = ::ScaffoldWithCustomSnackbar.name,
+            description = SnackbarsExampleDescription,
+            sourceUrl = SnackbarsExampleSourceUrl
+        ) {
+            ScaffoldWithCustomSnackbar()
+        },
+        Example(
+            name = ::ScaffoldWithCoroutinesSnackbar.name,
+            description = SnackbarsExampleDescription,
+            sourceUrl = SnackbarsExampleSourceUrl
+        ) {
+            ScaffoldWithCoroutinesSnackbar()
+        },
+        Example(
+            name = ::ScaffoldWithMultilineSnackbar.name,
+            description = SnackbarsExampleDescription,
+            sourceUrl = SnackbarsExampleSourceUrl
+        ) {
+            ScaffoldWithMultilineSnackbar()
+        }
+    )
 
 private const val SwitchExampleDescription = "Switch examples"
 private const val SwitchExampleSourceUrl = "$SampleSourceUrl/SwitchSamples.kt"
-val SwitchExamples = listOf(
-    Example(
-        name = ::SwitchSample.name,
-        description = SwitchExampleDescription,
-        sourceUrl = SwitchExampleSourceUrl
-    ) {
-        SwitchSample()
-    },
-
-    Example(
-        name = ::SwitchWithThumbIconSample.name,
-        description = SwitchExampleDescription,
-        sourceUrl = SwitchExampleSourceUrl
-    ) {
-        SwitchWithThumbIconSample()
-    },
-)
+val SwitchExamples =
+    listOf(
+        Example(
+            name = ::SwitchSample.name,
+            description = SwitchExampleDescription,
+            sourceUrl = SwitchExampleSourceUrl
+        ) {
+            SwitchSample()
+        },
+        Example(
+            name = ::SwitchWithThumbIconSample.name,
+            description = SwitchExampleDescription,
+            sourceUrl = SwitchExampleSourceUrl
+        ) {
+            SwitchWithThumbIconSample()
+        },
+    )
 
 private const val TabsExampleDescription = "Tabs examples"
 private const val TabsExampleSourceUrl = "$SampleSourceUrl/TabSamples.kt"
-val TabsExamples = listOf(
-    Example(
-        name = ::PrimaryTextTabs.name,
-        description = TabsExampleDescription,
-        sourceUrl = TabsExampleSourceUrl
-    ) {
-        PrimaryTextTabs()
-    },
-    Example(
-        name = ::PrimaryIconTabs.name,
-        description = TabsExampleDescription,
-        sourceUrl = TabsExampleSourceUrl
-    ) {
-        PrimaryIconTabs()
-    },
-    Example(
-        name = ::SecondaryTextTabs.name,
-        description = TabsExampleDescription,
-        sourceUrl = TabsExampleSourceUrl
-    ) {
-        SecondaryTextTabs()
-    },
-    Example(
-        name = ::SecondaryIconTabs.name,
-        description = TabsExampleDescription,
-        sourceUrl = TabsExampleSourceUrl
-    ) {
-        SecondaryIconTabs()
-    },
-    Example(
-        name = ::TextAndIconTabs.name,
-        description = TabsExampleDescription,
-        sourceUrl = TabsExampleSourceUrl
-    ) {
-        TextAndIconTabs()
-    },
-    Example(
-        name = ::LeadingIconTabs.name,
-        description = TabsExampleDescription,
-        sourceUrl = TabsExampleSourceUrl
-    ) {
-        LeadingIconTabs()
-    },
-    Example(
-        name = ::ScrollingPrimaryTextTabs.name,
-        description = TabsExampleDescription,
-        sourceUrl = TabsExampleSourceUrl
-    ) {
-        ScrollingPrimaryTextTabs()
-    },
-    Example(
-        name = ::ScrollingSecondaryTextTabs.name,
-        description = TabsExampleDescription,
-        sourceUrl = TabsExampleSourceUrl
-    ) {
-        ScrollingSecondaryTextTabs()
-    },
-    Example(
-        name = ::FancyTabs.name,
-        description = TabsExampleDescription,
-        sourceUrl = TabsExampleSourceUrl
-    ) {
-        FancyTabs()
-    },
-    Example(
-        name = ::FancyIndicatorTabs.name,
-        description = TabsExampleDescription,
-        sourceUrl = TabsExampleSourceUrl
-    ) {
-        FancyIndicatorTabs()
-    },
-    Example(
-        name = ::FancyIndicatorContainerTabs.name,
-        description = TabsExampleDescription,
-        sourceUrl = TabsExampleSourceUrl
-    ) {
-        FancyIndicatorContainerTabs()
-    },
-    Example(
-        name = ::ScrollingFancyIndicatorContainerTabs.name,
-        description = TabsExampleDescription,
-        sourceUrl = TabsExampleSourceUrl
-    ) {
-        ScrollingFancyIndicatorContainerTabs()
-    }
-)
+val TabsExamples =
+    listOf(
+        Example(
+            name = ::PrimaryTextTabs.name,
+            description = TabsExampleDescription,
+            sourceUrl = TabsExampleSourceUrl
+        ) {
+            PrimaryTextTabs()
+        },
+        Example(
+            name = ::PrimaryIconTabs.name,
+            description = TabsExampleDescription,
+            sourceUrl = TabsExampleSourceUrl
+        ) {
+            PrimaryIconTabs()
+        },
+        Example(
+            name = ::SecondaryTextTabs.name,
+            description = TabsExampleDescription,
+            sourceUrl = TabsExampleSourceUrl
+        ) {
+            SecondaryTextTabs()
+        },
+        Example(
+            name = ::SecondaryIconTabs.name,
+            description = TabsExampleDescription,
+            sourceUrl = TabsExampleSourceUrl
+        ) {
+            SecondaryIconTabs()
+        },
+        Example(
+            name = ::TextAndIconTabs.name,
+            description = TabsExampleDescription,
+            sourceUrl = TabsExampleSourceUrl
+        ) {
+            TextAndIconTabs()
+        },
+        Example(
+            name = ::LeadingIconTabs.name,
+            description = TabsExampleDescription,
+            sourceUrl = TabsExampleSourceUrl
+        ) {
+            LeadingIconTabs()
+        },
+        Example(
+            name = ::ScrollingPrimaryTextTabs.name,
+            description = TabsExampleDescription,
+            sourceUrl = TabsExampleSourceUrl
+        ) {
+            ScrollingPrimaryTextTabs()
+        },
+        Example(
+            name = ::ScrollingSecondaryTextTabs.name,
+            description = TabsExampleDescription,
+            sourceUrl = TabsExampleSourceUrl
+        ) {
+            ScrollingSecondaryTextTabs()
+        },
+        Example(
+            name = ::FancyTabs.name,
+            description = TabsExampleDescription,
+            sourceUrl = TabsExampleSourceUrl
+        ) {
+            FancyTabs()
+        },
+        Example(
+            name = ::FancyIndicatorTabs.name,
+            description = TabsExampleDescription,
+            sourceUrl = TabsExampleSourceUrl
+        ) {
+            FancyIndicatorTabs()
+        },
+        Example(
+            name = ::FancyIndicatorContainerTabs.name,
+            description = TabsExampleDescription,
+            sourceUrl = TabsExampleSourceUrl
+        ) {
+            FancyIndicatorContainerTabs()
+        },
+        Example(
+            name = ::ScrollingFancyIndicatorContainerTabs.name,
+            description = TabsExampleDescription,
+            sourceUrl = TabsExampleSourceUrl
+        ) {
+            ScrollingFancyIndicatorContainerTabs()
+        }
+    )
 
 private const val TimePickerDescription = "Time Picker examples"
 private const val TimePickerSourceUrl = "$SampleSourceUrl/TimePicker.kt"
-val TimePickerExamples = listOf(
-    Example(
-        name = ::TimePickerSample.name,
-        description = TimePickerDescription,
-        sourceUrl = TimePickerSourceUrl
-    ) {
-        TimePickerSample()
-    },
-    Example(
-        name = ::TimeInputSample.name,
-        description = TimePickerDescription,
-        sourceUrl = TimePickerSourceUrl
-    ) {
-        TimeInputSample()
-    },
-    Example(
-        name = ::TimePickerSwitchableSample.name,
-        description = TimePickerDescription,
-        sourceUrl = TimePickerSourceUrl
-    ) {
-        TimePickerSwitchableSample()
-    },
-)
+val TimePickerExamples =
+    listOf(
+        Example(
+            name = ::TimePickerSample.name,
+            description = TimePickerDescription,
+            sourceUrl = TimePickerSourceUrl
+        ) {
+            TimePickerSample()
+        },
+        Example(
+            name = ::TimeInputSample.name,
+            description = TimePickerDescription,
+            sourceUrl = TimePickerSourceUrl
+        ) {
+            TimeInputSample()
+        },
+        Example(
+            name = ::TimePickerSwitchableSample.name,
+            description = TimePickerDescription,
+            sourceUrl = TimePickerSourceUrl
+        ) {
+            TimePickerSwitchableSample()
+        },
+    )
 
 private const val TextFieldsExampleDescription = "Text fields examples"
 private const val TextFieldsExampleSourceUrl = "$SampleSourceUrl/TextFieldSamples.kt"
-val TextFieldsExamples = listOf(
-    Example(
-        name = ::SimpleTextFieldSample.name,
-        description = TextFieldsExampleDescription,
-        sourceUrl = TextFieldsExampleSourceUrl
-    ) {
-        SimpleTextFieldSample()
-    },
-    Example(
-        name = ::TextFieldSample.name,
-        description = TextFieldsExampleDescription,
-        sourceUrl = TextFieldsExampleSourceUrl
-    ) {
-        TextFieldSample()
-    },
-    Example(
-        name = ::SimpleOutlinedTextFieldSample.name,
-        description = TextFieldsExampleDescription,
-        sourceUrl = TextFieldsExampleSourceUrl
-    ) {
-        SimpleOutlinedTextFieldSample()
-    },
-    Example(
-        name = ::OutlinedTextFieldSample.name,
-        description = TextFieldsExampleDescription,
-        sourceUrl = TextFieldsExampleSourceUrl
-    ) {
-        OutlinedTextFieldSample()
-    },
-    Example(
-        name = ::TextFieldWithIcons.name,
-        description = TextFieldsExampleDescription,
-        sourceUrl = TextFieldsExampleSourceUrl
-    ) {
-        TextFieldWithIcons()
-    },
-    Example(
-        name = ::TextFieldWithPlaceholder.name,
-        description = TextFieldsExampleDescription,
-        sourceUrl = TextFieldsExampleSourceUrl
-    ) {
-        TextFieldWithPlaceholder()
-    },
-    Example(
-        name = ::TextFieldWithPrefixAndSuffix.name,
-        description = TextFieldsExampleDescription,
-        sourceUrl = TextFieldsExampleSourceUrl
-    ) {
-        TextFieldWithPrefixAndSuffix()
-    },
-    Example(
-        name = ::TextFieldWithErrorState.name,
-        description = TextFieldsExampleDescription,
-        sourceUrl = TextFieldsExampleSourceUrl
-    ) {
-        TextFieldWithErrorState()
-    },
-    Example(
-        name = ::TextFieldWithSupportingText.name,
-        description = TextFieldsExampleDescription,
-        sourceUrl = TextFieldsExampleSourceUrl
-    ) {
-        TextFieldWithSupportingText()
-    },
-    Example(
-        name = ::PasswordTextField.name,
-        description = TextFieldsExampleDescription,
-        sourceUrl = TextFieldsExampleSourceUrl
-    ) {
-        PasswordTextField()
-    },
-    Example(
-        name = ::TextFieldWithHideKeyboardOnImeAction.name,
-        description = TextFieldsExampleDescription,
-        sourceUrl = TextFieldsExampleSourceUrl
-    ) {
-        TextFieldWithHideKeyboardOnImeAction()
-    },
-    Example(
-        name = ::TextArea.name,
-        description = TextFieldsExampleDescription,
-        sourceUrl = TextFieldsExampleSourceUrl
-    ) {
-        TextArea()
-    }
-).map {
-    // By default text field samples are minimal and don't have a `width` modifier to restrict the
-    // width. As a result, they grow horizontally if enough text is typed. To prevent this behavior
-    // in Catalog app the code below restricts the width of every text field sample
-    it.copy(content = {
-        Box(
-            Modifier
-                .wrapContentWidth()
-                .width(280.dp)
-        ) { it.content() }
-    })
-}
+val TextFieldsExamples =
+    listOf(
+            Example(
+                name = ::SimpleTextFieldSample.name,
+                description = TextFieldsExampleDescription,
+                sourceUrl = TextFieldsExampleSourceUrl
+            ) {
+                SimpleTextFieldSample()
+            },
+            Example(
+                name = ::TextFieldSample.name,
+                description = TextFieldsExampleDescription,
+                sourceUrl = TextFieldsExampleSourceUrl
+            ) {
+                TextFieldSample()
+            },
+            Example(
+                name = ::SimpleOutlinedTextFieldSample.name,
+                description = TextFieldsExampleDescription,
+                sourceUrl = TextFieldsExampleSourceUrl
+            ) {
+                SimpleOutlinedTextFieldSample()
+            },
+            Example(
+                name = ::OutlinedTextFieldSample.name,
+                description = TextFieldsExampleDescription,
+                sourceUrl = TextFieldsExampleSourceUrl
+            ) {
+                OutlinedTextFieldSample()
+            },
+            Example(
+                name = ::TextFieldWithIcons.name,
+                description = TextFieldsExampleDescription,
+                sourceUrl = TextFieldsExampleSourceUrl
+            ) {
+                TextFieldWithIcons()
+            },
+            Example(
+                name = ::TextFieldWithPlaceholder.name,
+                description = TextFieldsExampleDescription,
+                sourceUrl = TextFieldsExampleSourceUrl
+            ) {
+                TextFieldWithPlaceholder()
+            },
+            Example(
+                name = ::TextFieldWithPrefixAndSuffix.name,
+                description = TextFieldsExampleDescription,
+                sourceUrl = TextFieldsExampleSourceUrl
+            ) {
+                TextFieldWithPrefixAndSuffix()
+            },
+            Example(
+                name = ::TextFieldWithErrorState.name,
+                description = TextFieldsExampleDescription,
+                sourceUrl = TextFieldsExampleSourceUrl
+            ) {
+                TextFieldWithErrorState()
+            },
+            Example(
+                name = ::TextFieldWithSupportingText.name,
+                description = TextFieldsExampleDescription,
+                sourceUrl = TextFieldsExampleSourceUrl
+            ) {
+                TextFieldWithSupportingText()
+            },
+            Example(
+                name = ::PasswordTextField.name,
+                description = TextFieldsExampleDescription,
+                sourceUrl = TextFieldsExampleSourceUrl
+            ) {
+                PasswordTextField()
+            },
+            Example(
+                name = ::TextFieldWithHideKeyboardOnImeAction.name,
+                description = TextFieldsExampleDescription,
+                sourceUrl = TextFieldsExampleSourceUrl
+            ) {
+                TextFieldWithHideKeyboardOnImeAction()
+            },
+            Example(
+                name = ::TextArea.name,
+                description = TextFieldsExampleDescription,
+                sourceUrl = TextFieldsExampleSourceUrl
+            ) {
+                TextArea()
+            }
+        )
+        .map {
+            // By default text field samples are minimal and don't have a `width` modifier to
+            // restrict the
+            // width. As a result, they grow horizontally if enough text is typed. To prevent this
+            // behavior
+            // in Catalog app the code below restricts the width of every text field sample
+            it.copy(content = { Box(Modifier.wrapContentWidth().width(280.dp)) { it.content() } })
+        }
 
 private const val TooltipsExampleDescription = "Tooltips examples"
 private const val TooltipsExampleSourceUrl = "$SampleSourceUrl/TooltipSamples.kt"
-val TooltipsExamples = listOf(
-    Example(
-        name = ::PlainTooltipSample.name,
-        description = TooltipsExampleDescription,
-        sourceUrl = TooltipsExampleSourceUrl
-    ) {
-        PlainTooltipSample()
-    },
-    Example(
-        name = ::PlainTooltipWithManualInvocationSample.name,
-        description = TooltipsExampleDescription,
-        sourceUrl = TooltipsExampleSourceUrl
-    ) {
-        PlainTooltipWithManualInvocationSample()
-    },
-    Example(
-        name = ::PlainTooltipWithCaret.name,
-        description = TooltipsExampleDescription,
-        sourceUrl = TooltipsExampleSourceUrl
-    ) {
-        PlainTooltipWithCaret()
-    },
-    Example(
-        name = ::PlainTooltipWithCustomCaret.name,
-        description = TooltipsExampleDescription,
-        sourceUrl = TooltipsExampleSourceUrl
-    ) {
-        PlainTooltipWithCustomCaret()
-    },
-    Example(
-        name = ::RichTooltipSample.name,
-        description = TooltipsExampleDescription,
-        sourceUrl = TooltipsExampleSourceUrl
-    ) {
-        RichTooltipSample()
-    },
-    Example(
-        name = ::RichTooltipWithManualInvocationSample.name,
-        description = TooltipsExampleDescription,
-        sourceUrl = TooltipsExampleSourceUrl
-    ) {
-        RichTooltipWithManualInvocationSample()
-    },
-    Example(
-        name = ::RichTooltipWithCaretSample.name,
-        description = TooltipsExampleDescription,
-        sourceUrl = TooltipsExampleSourceUrl
-    ) {
-        RichTooltipWithCaretSample()
-    },
-    Example(
-        name = ::RichTooltipWithCustomCaretSample.name,
-        description = TooltipsExampleDescription,
-        sourceUrl = TooltipsExampleSourceUrl
-    ) {
-        RichTooltipWithCustomCaretSample()
-    }
-)
+val TooltipsExamples =
+    listOf(
+        Example(
+            name = ::PlainTooltipSample.name,
+            description = TooltipsExampleDescription,
+            sourceUrl = TooltipsExampleSourceUrl
+        ) {
+            PlainTooltipSample()
+        },
+        Example(
+            name = ::PlainTooltipWithManualInvocationSample.name,
+            description = TooltipsExampleDescription,
+            sourceUrl = TooltipsExampleSourceUrl
+        ) {
+            PlainTooltipWithManualInvocationSample()
+        },
+        Example(
+            name = ::PlainTooltipWithCaret.name,
+            description = TooltipsExampleDescription,
+            sourceUrl = TooltipsExampleSourceUrl
+        ) {
+            PlainTooltipWithCaret()
+        },
+        Example(
+            name = ::PlainTooltipWithCustomCaret.name,
+            description = TooltipsExampleDescription,
+            sourceUrl = TooltipsExampleSourceUrl
+        ) {
+            PlainTooltipWithCustomCaret()
+        },
+        Example(
+            name = ::RichTooltipSample.name,
+            description = TooltipsExampleDescription,
+            sourceUrl = TooltipsExampleSourceUrl
+        ) {
+            RichTooltipSample()
+        },
+        Example(
+            name = ::RichTooltipWithManualInvocationSample.name,
+            description = TooltipsExampleDescription,
+            sourceUrl = TooltipsExampleSourceUrl
+        ) {
+            RichTooltipWithManualInvocationSample()
+        },
+        Example(
+            name = ::RichTooltipWithCaretSample.name,
+            description = TooltipsExampleDescription,
+            sourceUrl = TooltipsExampleSourceUrl
+        ) {
+            RichTooltipWithCaretSample()
+        },
+        Example(
+            name = ::RichTooltipWithCustomCaretSample.name,
+            description = TooltipsExampleDescription,
+            sourceUrl = TooltipsExampleSourceUrl
+        ) {
+            RichTooltipWithCustomCaretSample()
+        }
+    )
diff --git a/compose/material3/material3/integration-tests/material3-catalog/src/main/java/androidx/compose/material3/catalog/library/model/Themes.kt b/compose/material3/material3/integration-tests/material3-catalog/src/main/java/androidx/compose/material3/catalog/library/model/Themes.kt
index dd924b5..d497651 100644
--- a/compose/material3/material3/integration-tests/material3-catalog/src/main/java/androidx/compose/material3/catalog/library/model/Themes.kt
+++ b/compose/material3/material3/integration-tests/material3-catalog/src/main/java/androidx/compose/material3/catalog/library/model/Themes.kt
@@ -23,7 +23,9 @@
     val fontScaleMode: FontScaleMode = FontScaleMode.System,
     val textDirection: TextDirection = TextDirection.System,
 ) {
-    constructor(map: Map<String, Float>) : this(
+    constructor(
+        map: Map<String, Float>
+    ) : this(
         themeMode = ThemeMode.values()[map.getValue(ThemeModeKey).toInt()],
         colorMode = ColorMode.values()[map.getValue(ColorModeKey).toInt()],
         fontScale = map.getValue(FontScaleKey).toFloat(),
@@ -31,13 +33,14 @@
         textDirection = TextDirection.values()[map.getValue(TextDirectionKey).toInt()],
     )
 
-    fun toMap() = mapOf(
-        ThemeModeKey to themeMode.ordinal.toFloat(),
-        ColorModeKey to colorMode.ordinal.toFloat(),
-        FontScaleKey to fontScale,
-        FontScaleModeKey to fontScaleMode.ordinal.toFloat(),
-        TextDirectionKey to textDirection.ordinal.toFloat(),
-    )
+    fun toMap() =
+        mapOf(
+            ThemeModeKey to themeMode.ordinal.toFloat(),
+            ColorModeKey to colorMode.ordinal.toFloat(),
+            FontScaleKey to fontScale,
+            FontScaleModeKey to fontScaleMode.ordinal.toFloat(),
+            TextDirectionKey to textDirection.ordinal.toFloat(),
+        )
 }
 
 /**
@@ -68,8 +71,8 @@
      */
     Baseline("Baseline"),
     /**
-     * Build a color scheme from a pre-selected color palette that behaves the same as a dynamic color
-     * palette.
+     * Build a color scheme from a pre-selected color palette that behaves the same as a dynamic
+     * color palette.
      *
      * Useful for testing dynamic color schemes on devices that don't support dynamic colors.
      */
@@ -77,7 +80,8 @@
     /**
      * Build a color scheme from the dynamic colors taken from the Android System.
      *
-     * If the dynamic colors are not available, the baseline color scheme will be used as a fallback.
+     * If the dynamic colors are not available, the baseline color scheme will be used as a
+     * fallback.
      */
     Dynamic("Dynamic (Android 12+)");
 
diff --git a/compose/material3/material3/integration-tests/material3-catalog/src/main/java/androidx/compose/material3/catalog/library/ui/common/CatalogTopAppBar.kt b/compose/material3/material3/integration-tests/material3-catalog/src/main/java/androidx/compose/material3/catalog/library/ui/common/CatalogTopAppBar.kt
index aa7c923..6c5ff118 100644
--- a/compose/material3/material3/integration-tests/material3-catalog/src/main/java/androidx/compose/material3/catalog/library/ui/common/CatalogTopAppBar.kt
+++ b/compose/material3/material3/integration-tests/material3-catalog/src/main/java/androidx/compose/material3/catalog/library/ui/common/CatalogTopAppBar.kt
@@ -78,10 +78,9 @@
                         Icon(
                             imageVector =
                                 if (favorite) Icons.Filled.PushPin else Icons.Outlined.PushPin,
-                            tint = if (favorite)
-                                MaterialTheme.colorScheme.primary
-                            else
-                                LocalContentColor.current,
+                            tint =
+                                if (favorite) MaterialTheme.colorScheme.primary
+                                else LocalContentColor.current,
                             contentDescription = stringResource(id = R.string.favorite_button)
                         )
                     }
@@ -158,10 +157,7 @@
     onPrivacyClick: () -> Unit,
     onLicensesClick: () -> Unit,
 ) {
-    DropdownMenu(
-        expanded = expanded,
-        onDismissRequest = onDismissRequest
-    ) {
+    DropdownMenu(expanded = expanded, onDismissRequest = onDismissRequest) {
         DropdownMenuItem(
             text = { Text(stringResource(id = R.string.view_design_guidelines)) },
             onClick = onGuidelinesClick
diff --git a/compose/material3/material3/integration-tests/material3-catalog/src/main/java/androidx/compose/material3/catalog/library/ui/component/Component.kt b/compose/material3/material3/integration-tests/material3-catalog/src/main/java/androidx/compose/material3/catalog/library/ui/component/Component.kt
index 5ab354f..3eccf17 100644
--- a/compose/material3/material3/integration-tests/material3-catalog/src/main/java/androidx/compose/material3/catalog/library/ui/component/Component.kt
+++ b/compose/material3/material3/integration-tests/material3-catalog/src/main/java/androidx/compose/material3/catalog/library/ui/component/Component.kt
@@ -72,30 +72,29 @@
     ) { paddingValues ->
         LazyColumn(
             modifier = Modifier.consumeWindowInsets(paddingValues),
-            contentPadding = PaddingValues(
-                start = paddingValues.calculateStartPadding(ltr) + ComponentPadding,
-                top = paddingValues.calculateTopPadding() + ComponentPadding,
-                end = paddingValues.calculateEndPadding(ltr) + ComponentPadding,
-                bottom = paddingValues.calculateBottomPadding() + ComponentPadding
-            )
+            contentPadding =
+                PaddingValues(
+                    start = paddingValues.calculateStartPadding(ltr) + ComponentPadding,
+                    top = paddingValues.calculateTopPadding() + ComponentPadding,
+                    end = paddingValues.calculateEndPadding(ltr) + ComponentPadding,
+                    bottom = paddingValues.calculateBottomPadding() + ComponentPadding
+                )
         ) {
             item {
                 Box(
-                    modifier = Modifier
-                        .fillMaxWidth()
-                        .padding(vertical = ComponentIconVerticalPadding)
+                    modifier =
+                        Modifier.fillMaxWidth().padding(vertical = ComponentIconVerticalPadding)
                 ) {
                     Image(
                         painter = painterResource(id = component.icon),
                         contentDescription = null,
-                        modifier = Modifier
-                            .size(ComponentIconSize)
-                            .align(Alignment.Center),
-                        colorFilter = if (component.tintIcon) {
-                            ColorFilter.tint(LocalContentColor.current)
-                        } else {
-                            null
-                        }
+                        modifier = Modifier.size(ComponentIconSize).align(Alignment.Center),
+                        colorFilter =
+                            if (component.tintIcon) {
+                                ColorFilter.tint(LocalContentColor.current)
+                            } else {
+                                null
+                            }
                     )
                 }
             }
@@ -105,10 +104,7 @@
                     style = MaterialTheme.typography.bodyLarge
                 )
                 Spacer(modifier = Modifier.height(ComponentPadding))
-                Text(
-                    text = component.description,
-                    style = MaterialTheme.typography.bodyMedium
-                )
+                Text(text = component.description, style = MaterialTheme.typography.bodyMedium)
                 Spacer(modifier = Modifier.height(ComponentDescriptionPadding))
             }
             item {
@@ -120,10 +116,7 @@
             }
             if (component.examples.isNotEmpty()) {
                 items(component.examples) { example ->
-                    ExampleItem(
-                        example = example,
-                        onClick = onExampleClick
-                    )
+                    ExampleItem(example = example, onClick = onExampleClick)
                     Spacer(modifier = Modifier.height(ExampleItemPadding))
                 }
             } else {
diff --git a/compose/material3/material3/integration-tests/material3-catalog/src/main/java/androidx/compose/material3/catalog/library/ui/component/ComponentItem.kt b/compose/material3/material3/integration-tests/material3-catalog/src/main/java/androidx/compose/material3/catalog/library/ui/component/ComponentItem.kt
index 48f72a0..3c7c676 100644
--- a/compose/material3/material3/integration-tests/material3-catalog/src/main/java/androidx/compose/material3/catalog/library/ui/component/ComponentItem.kt
+++ b/compose/material3/material3/integration-tests/material3-catalog/src/main/java/androidx/compose/material3/catalog/library/ui/component/ComponentItem.kt
@@ -36,28 +36,22 @@
 import androidx.compose.ui.unit.dp
 
 @Composable
-fun ComponentItem(
-    component: Component,
-    onClick: (component: Component) -> Unit
-) {
+fun ComponentItem(component: Component, onClick: (component: Component) -> Unit) {
     OutlinedCard(
         onClick = { onClick(component) },
-        modifier = Modifier
-            .height(ComponentItemHeight)
-            .padding(ComponentItemOuterPadding)
+        modifier = Modifier.height(ComponentItemHeight).padding(ComponentItemOuterPadding)
     ) {
         Box(modifier = Modifier.fillMaxSize().padding(ComponentItemInnerPadding)) {
             Image(
                 painter = painterResource(id = component.icon),
                 contentDescription = null,
-                modifier = Modifier
-                    .size(ComponentItemIconSize)
-                    .align(Alignment.Center),
-                colorFilter = if (component.tintIcon) {
-                    ColorFilter.tint(LocalContentColor.current)
-                } else {
-                    null
-                },
+                modifier = Modifier.size(ComponentItemIconSize).align(Alignment.Center),
+                colorFilter =
+                    if (component.tintIcon) {
+                        ColorFilter.tint(LocalContentColor.current)
+                    } else {
+                        null
+                    },
                 contentScale = ContentScale.Inside
             )
             Text(
diff --git a/compose/material3/material3/integration-tests/material3-catalog/src/main/java/androidx/compose/material3/catalog/library/ui/example/Example.kt b/compose/material3/material3/integration-tests/material3-catalog/src/main/java/androidx/compose/material3/catalog/library/ui/example/Example.kt
index 9994ff5..7fe9404 100644
--- a/compose/material3/material3/integration-tests/material3-catalog/src/main/java/androidx/compose/material3/catalog/library/ui/example/Example.kt
+++ b/compose/material3/material3/integration-tests/material3-catalog/src/main/java/androidx/compose/material3/catalog/library/ui/example/Example.kt
@@ -55,10 +55,10 @@
         onFavoriteClick = onFavoriteClick
     ) { paddingValues ->
         Box(
-            modifier = Modifier
-                .fillMaxSize()
-                .consumeWindowInsets(WindowInsets.safeDrawing)
-                .padding(paddingValues),
+            modifier =
+                Modifier.fillMaxSize()
+                    .consumeWindowInsets(WindowInsets.safeDrawing)
+                    .padding(paddingValues),
             contentAlignment = Alignment.Center
         ) {
             example.content()
diff --git a/compose/material3/material3/integration-tests/material3-catalog/src/main/java/androidx/compose/material3/catalog/library/ui/example/ExampleItem.kt b/compose/material3/material3/integration-tests/material3-catalog/src/main/java/androidx/compose/material3/catalog/library/ui/example/ExampleItem.kt
index 00c1f42..1985665 100644
--- a/compose/material3/material3/integration-tests/material3-catalog/src/main/java/androidx/compose/material3/catalog/library/ui/example/ExampleItem.kt
+++ b/compose/material3/material3/integration-tests/material3-catalog/src/main/java/androidx/compose/material3/catalog/library/ui/example/ExampleItem.kt
@@ -36,20 +36,11 @@
 import androidx.compose.ui.unit.dp
 
 @Composable
-fun ExampleItem(
-    example: Example,
-    onClick: (example: Example) -> Unit
-) {
-    OutlinedCard(
-        onClick = { onClick(example) },
-        modifier = Modifier.fillMaxWidth()
-    ) {
+fun ExampleItem(example: Example, onClick: (example: Example) -> Unit) {
+    OutlinedCard(onClick = { onClick(example) }, modifier = Modifier.fillMaxWidth()) {
         Row(modifier = Modifier.padding(ExampleItemPadding)) {
             Column(modifier = Modifier.weight(1f, fill = true)) {
-                Text(
-                    text = example.name,
-                    style = MaterialTheme.typography.titleSmall
-                )
+                Text(text = example.name, style = MaterialTheme.typography.titleSmall)
                 Spacer(modifier = Modifier.height(ExampleItemTextPadding))
                 Text(
                     text = example.description,
diff --git a/compose/material3/material3/integration-tests/material3-catalog/src/main/java/androidx/compose/material3/catalog/library/ui/home/Home.kt b/compose/material3/material3/integration-tests/material3-catalog/src/main/java/androidx/compose/material3/catalog/library/ui/home/Home.kt
index ce9e6f7..03f8bd7 100644
--- a/compose/material3/material3/integration-tests/material3-catalog/src/main/java/androidx/compose/material3/catalog/library/ui/home/Home.kt
+++ b/compose/material3/material3/integration-tests/material3-catalog/src/main/java/androidx/compose/material3/catalog/library/ui/home/Home.kt
@@ -56,18 +56,16 @@
             columns = GridCells.Adaptive(HomeCellMinSize),
             content = {
                 items(components) { component ->
-                    ComponentItem(
-                        component = component,
-                        onClick = onComponentClick
-                    )
+                    ComponentItem(component = component, onClick = onComponentClick)
                 }
             },
-            contentPadding = PaddingValues(
-                start = paddingValues.calculateStartPadding(ltr) + HomePadding,
-                top = paddingValues.calculateTopPadding() + HomePadding,
-                end = paddingValues.calculateEndPadding(ltr) + HomePadding,
-                bottom = paddingValues.calculateBottomPadding() + HomePadding
-            )
+            contentPadding =
+                PaddingValues(
+                    start = paddingValues.calculateStartPadding(ltr) + HomePadding,
+                    top = paddingValues.calculateTopPadding() + HomePadding,
+                    end = paddingValues.calculateEndPadding(ltr) + HomePadding,
+                    bottom = paddingValues.calculateBottomPadding() + HomePadding
+                )
         )
     }
 }
diff --git a/compose/material3/material3/integration-tests/material3-catalog/src/main/java/androidx/compose/material3/catalog/library/ui/theme/Theme.kt b/compose/material3/material3/integration-tests/material3-catalog/src/main/java/androidx/compose/material3/catalog/library/ui/theme/Theme.kt
index a7f35ae..4aec483 100644
--- a/compose/material3/material3/integration-tests/material3-catalog/src/main/java/androidx/compose/material3/catalog/library/ui/theme/Theme.kt
+++ b/compose/material3/material3/integration-tests/material3-catalog/src/main/java/androidx/compose/material3/catalog/library/ui/theme/Theme.kt
@@ -46,32 +46,33 @@
 
 @SuppressLint("NewApi")
 @Composable
-fun CatalogTheme(
-    theme: Theme,
-    content: @Composable () -> Unit
-) {
+fun CatalogTheme(theme: Theme, content: @Composable () -> Unit) {
     val context = LocalContext.current
-    val lightColorScheme = when (theme.colorMode) {
-        ColorMode.Dynamic -> dynamicLightColorScheme(context)
-        ColorMode.Custom -> LightCustomColorScheme
-        ColorMode.Baseline -> lightColorScheme()
-    }
-    val darkColorScheme = when (theme.colorMode) {
-        ColorMode.Dynamic -> dynamicDarkColorScheme(context)
-        ColorMode.Custom -> DarkCustomColorScheme
-        ColorMode.Baseline -> darkColorScheme()
-    }
-    val colorScheme = colorSchemeFromThemeMode(
-        themeMode = theme.themeMode,
-        lightColorScheme = lightColorScheme,
-        darkColorScheme = darkColorScheme
-    )
+    val lightColorScheme =
+        when (theme.colorMode) {
+            ColorMode.Dynamic -> dynamicLightColorScheme(context)
+            ColorMode.Custom -> LightCustomColorScheme
+            ColorMode.Baseline -> lightColorScheme()
+        }
+    val darkColorScheme =
+        when (theme.colorMode) {
+            ColorMode.Dynamic -> dynamicDarkColorScheme(context)
+            ColorMode.Custom -> DarkCustomColorScheme
+            ColorMode.Baseline -> darkColorScheme()
+        }
+    val colorScheme =
+        colorSchemeFromThemeMode(
+            themeMode = theme.themeMode,
+            lightColorScheme = lightColorScheme,
+            darkColorScheme = darkColorScheme
+        )
 
-    val layoutDirection = when (theme.textDirection) {
-        TextDirection.LTR -> LayoutDirection.Ltr
-        TextDirection.RTL -> LayoutDirection.Rtl
-        TextDirection.System -> LocalLayoutDirection.current
-    }
+    val layoutDirection =
+        when (theme.textDirection) {
+            TextDirection.LTR -> LayoutDirection.Ltr
+            TextDirection.RTL -> LayoutDirection.Rtl
+            TextDirection.System -> LocalLayoutDirection.current
+        }
 
     val view = LocalView.current
     val darkTheme = isSystemInDarkTheme()
@@ -85,11 +86,12 @@
         LocalDensity provides
             Density(
                 density = LocalDensity.current.density,
-                fontScale = if (theme.fontScaleMode == FontScaleMode.System) {
-                    LocalDensity.current.fontScale
-                } else {
-                    theme.fontScale
-                }
+                fontScale =
+                    if (theme.fontScaleMode == FontScaleMode.System) {
+                        LocalDensity.current.fontScale
+                    } else {
+                        theme.fontScale
+                    }
             )
     ) {
         MaterialTheme(
@@ -108,91 +110,94 @@
     return when (themeMode) {
         ThemeMode.Light -> lightColorScheme
         ThemeMode.Dark -> darkColorScheme
-        ThemeMode.System -> if (!isSystemInDarkTheme()) {
-            lightColorScheme
-        } else {
-            darkColorScheme
-        }
+        ThemeMode.System ->
+            if (!isSystemInDarkTheme()) {
+                lightColorScheme
+            } else {
+                darkColorScheme
+            }
     }
 }
 
-private val LightCustomColorScheme = lightColorScheme(
-    primary = Color(0xFF006E2C),
-    onPrimary = Color(0xFFFFFFFF),
-    primaryContainer = Color(0xFF43B55F),
-    onPrimaryContainer = Color(0xFF004117),
-    inversePrimary = Color(0xFF6DDD81),
-    secondary = Color(0xFF3F6743),
-    onSecondary = Color(0xFFFFFFFF),
-    secondaryContainer = Color(0xFFC2F0C2),
-    onSecondaryContainer = Color(0xFF466F4A),
-    tertiary = Color(0xFF005EB3),
-    onTertiary = Color(0xFFFFFFFF),
-    tertiaryContainer = Color(0xFF5EA1FF),
-    onTertiaryContainer = Color(0xFF00376C),
-    background = Color(0xFFF5FBF0),
-    onBackground = Color(0xFF171D17),
-    surface = Color(0xFFF5FBF0),
-    onSurface = Color(0xFF171D17),
-    surfaceVariant = Color(0xFFD9E6D6),
-    onSurfaceVariant = Color(0xFF3E4A3E),
-    inverseSurface = Color(0xFF2C322B),
-    inverseOnSurface = Color(0xFFECF3E8),
-    error = Color(0xFFBA1A1A),
-    onError = Color(0xFFFFFFFF),
-    errorContainer = Color(0xFFFFDAD6),
-    onErrorContainer = Color(0xFF410002),
-    outline = Color(0xFF6C786A),
-    outlineVariant = Color(0xFFBDCABA),
-    scrim = Color(0xFF000000),
-    surfaceTint = Color(0xFF006E2C),
-    surfaceContainerHighest = Color(0xFFDEE4DA),
-    surfaceContainerHigh = Color(0xFFE4EADF),
-    surfaceContainer = Color(0xFFE9F0E5),
-    surfaceContainerLow = Color(0xFFEFF6EB),
-    surfaceContainerLowest = Color(0xFFFFFFFF),
-    surfaceBright = Color(0xFFF5FBF0),
-    surfaceDim = Color(0xFFD5DCD1)
-)
+private val LightCustomColorScheme =
+    lightColorScheme(
+        primary = Color(0xFF006E2C),
+        onPrimary = Color(0xFFFFFFFF),
+        primaryContainer = Color(0xFF43B55F),
+        onPrimaryContainer = Color(0xFF004117),
+        inversePrimary = Color(0xFF6DDD81),
+        secondary = Color(0xFF3F6743),
+        onSecondary = Color(0xFFFFFFFF),
+        secondaryContainer = Color(0xFFC2F0C2),
+        onSecondaryContainer = Color(0xFF466F4A),
+        tertiary = Color(0xFF005EB3),
+        onTertiary = Color(0xFFFFFFFF),
+        tertiaryContainer = Color(0xFF5EA1FF),
+        onTertiaryContainer = Color(0xFF00376C),
+        background = Color(0xFFF5FBF0),
+        onBackground = Color(0xFF171D17),
+        surface = Color(0xFFF5FBF0),
+        onSurface = Color(0xFF171D17),
+        surfaceVariant = Color(0xFFD9E6D6),
+        onSurfaceVariant = Color(0xFF3E4A3E),
+        inverseSurface = Color(0xFF2C322B),
+        inverseOnSurface = Color(0xFFECF3E8),
+        error = Color(0xFFBA1A1A),
+        onError = Color(0xFFFFFFFF),
+        errorContainer = Color(0xFFFFDAD6),
+        onErrorContainer = Color(0xFF410002),
+        outline = Color(0xFF6C786A),
+        outlineVariant = Color(0xFFBDCABA),
+        scrim = Color(0xFF000000),
+        surfaceTint = Color(0xFF006E2C),
+        surfaceContainerHighest = Color(0xFFDEE4DA),
+        surfaceContainerHigh = Color(0xFFE4EADF),
+        surfaceContainer = Color(0xFFE9F0E5),
+        surfaceContainerLow = Color(0xFFEFF6EB),
+        surfaceContainerLowest = Color(0xFFFFFFFF),
+        surfaceBright = Color(0xFFF5FBF0),
+        surfaceDim = Color(0xFFD5DCD1)
+    )
 
-private val DarkCustomColorScheme = darkColorScheme(
-    primary = Color(0xFF6DDD81),
-    onPrimary = Color(0xFF003914),
-    primaryContainer = Color(0xFF008738),
-    onPrimaryContainer = Color(0xFFF7FFF2),
-    inversePrimary = Color(0xFF006E2C),
-    secondary = Color(0xFFA5D2A6),
-    onSecondary = Color(0xFF0F3819),
-    secondaryContainer = Color(0xFF1D4524),
-    onSecondaryContainer = Color(0xFF87B389),
-    tertiary = Color(0xFFA7C8FF),
-    onTertiary = Color(0xFF003061),
-    tertiaryContainer = Color(0xFF0774D9),
-    onTertiaryContainer = Color(0xFFFDFCFF),
-    background = Color(0xFF0F150F),
-    onBackground = Color(0xFFDEE4DA),
-    surface = Color(0xFF0F150F),
-    onSurface = Color(0xFFDEE4DA),
-    surfaceVariant = Color(0xFF3E4A3E),
-    onSurfaceVariant = Color(0xFFBDCABA),
-    inverseSurface = Color(0xFFDEE4DA),
-    inverseOnSurface = Color(0xFF2C322B),
-    error = Color(0xFFFFB4A9),
-    onError = Color(0xFF680003),
-    errorContainer = Color(0xFF930006),
-    onErrorContainer = Color(0xFFFFDAD4),
-    outline = Color(0xFF6C786A),
-    outlineVariant = Color(0xFF3E4A3E),
-    scrim = Color(0xFF000000),
-    surfaceTint = Color(0xFF6DDD81),
-    surfaceContainerHighest = Color(0xFF30362F),
-    surfaceContainerHigh = Color(0xFF252C25),
-    surfaceContainer = Color(0xFF1B211B),
-    surfaceContainerLow = Color(0xFF171D17),
-    surfaceContainerLowest = Color(0xFF0A100A),
-    surfaceBright = Color(0xFF343B34),
-    surfaceDim = Color(0xFF0F150F)
-)
+private val DarkCustomColorScheme =
+    darkColorScheme(
+        primary = Color(0xFF6DDD81),
+        onPrimary = Color(0xFF003914),
+        primaryContainer = Color(0xFF008738),
+        onPrimaryContainer = Color(0xFFF7FFF2),
+        inversePrimary = Color(0xFF006E2C),
+        secondary = Color(0xFFA5D2A6),
+        onSecondary = Color(0xFF0F3819),
+        secondaryContainer = Color(0xFF1D4524),
+        onSecondaryContainer = Color(0xFF87B389),
+        tertiary = Color(0xFFA7C8FF),
+        onTertiary = Color(0xFF003061),
+        tertiaryContainer = Color(0xFF0774D9),
+        onTertiaryContainer = Color(0xFFFDFCFF),
+        background = Color(0xFF0F150F),
+        onBackground = Color(0xFFDEE4DA),
+        surface = Color(0xFF0F150F),
+        onSurface = Color(0xFFDEE4DA),
+        surfaceVariant = Color(0xFF3E4A3E),
+        onSurfaceVariant = Color(0xFFBDCABA),
+        inverseSurface = Color(0xFFDEE4DA),
+        inverseOnSurface = Color(0xFF2C322B),
+        error = Color(0xFFFFB4A9),
+        onError = Color(0xFF680003),
+        errorContainer = Color(0xFF930006),
+        onErrorContainer = Color(0xFFFFDAD4),
+        outline = Color(0xFF6C786A),
+        outlineVariant = Color(0xFF3E4A3E),
+        scrim = Color(0xFF000000),
+        surfaceTint = Color(0xFF6DDD81),
+        surfaceContainerHighest = Color(0xFF30362F),
+        surfaceContainerHigh = Color(0xFF252C25),
+        surfaceContainer = Color(0xFF1B211B),
+        surfaceContainerLow = Color(0xFF171D17),
+        surfaceContainerLowest = Color(0xFF0A100A),
+        surfaceBright = Color(0xFF343B34),
+        surfaceDim = Color(0xFF0F150F)
+    )
 
 private tailrec fun Context.findActivity(): Activity =
     when (this) {
diff --git a/compose/material3/material3/integration-tests/material3-catalog/src/main/java/androidx/compose/material3/catalog/library/ui/theme/ThemePicker.kt b/compose/material3/material3/integration-tests/material3-catalog/src/main/java/androidx/compose/material3/catalog/library/ui/theme/ThemePicker.kt
index 636426b..cb21b3d 100644
--- a/compose/material3/material3/integration-tests/material3-catalog/src/main/java/androidx/compose/material3/catalog/library/ui/theme/ThemePicker.kt
+++ b/compose/material3/material3/integration-tests/material3-catalog/src/main/java/androidx/compose/material3/catalog/library/ui/theme/ThemePicker.kt
@@ -57,20 +57,13 @@
 import androidx.compose.ui.unit.dp
 
 @Composable
-fun ThemePicker(
-    theme: Theme,
-    onThemeChange: (theme: Theme) -> Unit
-) {
+fun ThemePicker(theme: Theme, onThemeChange: (theme: Theme) -> Unit) {
     LazyColumn(
-        contentPadding = WindowInsets.safeDrawing
-            .only(WindowInsetsSides.Horizontal + WindowInsetsSides.Bottom)
-            .add(
-                WindowInsets(
-                    top = ThemePickerPadding,
-                    bottom = ThemePickerPadding
-                )
-            )
-            .asPaddingValues(),
+        contentPadding =
+            WindowInsets.safeDrawing
+                .only(WindowInsetsSides.Horizontal + WindowInsetsSides.Bottom)
+                .add(WindowInsets(top = ThemePickerPadding, bottom = ThemePickerPadding))
+                .asPaddingValues(),
         verticalArrangement = Arrangement.spacedBy(ThemePickerPadding)
     ) {
         item {
@@ -194,16 +187,12 @@
                 RadioButtonOption(
                     option = FontScaleMode.System,
                     selected = theme.fontScaleMode == FontScaleMode.System,
-                    onClick = {
-                        onThemeChange(theme.copy(fontScaleMode = FontScaleMode.System))
-                    }
+                    onClick = { onThemeChange(theme.copy(fontScaleMode = FontScaleMode.System)) }
                 )
                 RadioButtonOption(
                     option = FontScaleMode.Custom,
                     selected = theme.fontScaleMode == FontScaleMode.Custom,
-                    onClick = {
-                        onThemeChange(theme.copy(fontScaleMode = FontScaleMode.Custom))
-                    }
+                    onClick = { onThemeChange(theme.copy(fontScaleMode = FontScaleMode.Custom)) }
                 )
 
                 var fontScale by remember(theme.fontScale) { mutableFloatStateOf(theme.fontScale) }
@@ -221,9 +210,7 @@
                 modifier = Modifier.fillMaxWidth(),
                 horizontalAlignment = Alignment.CenterHorizontally
             ) {
-                Button(
-                    onClick = { onThemeChange(Theme()) }
-                ) {
+                Button(onClick = { onThemeChange(Theme()) }) {
                     Text(text = stringResource(id = R.string.reset_all))
                 }
             }
@@ -240,14 +227,15 @@
     enabled: Boolean = true,
 ) {
     Row(
-        modifier = modifier
-            .selectable(
-                selected = selected,
-                enabled = enabled,
-                onClick = { onClick(option) },
-                role = Role.RadioButton,
-            )
-            .minimumInteractiveComponentSize(),
+        modifier =
+            modifier
+                .selectable(
+                    selected = selected,
+                    enabled = enabled,
+                    onClick = { onClick(option) },
+                    role = Role.RadioButton,
+                )
+                .minimumInteractiveComponentSize(),
         verticalAlignment = Alignment.CenterVertically,
         horizontalArrangement = Arrangement.spacedBy(ThemePickerPadding)
     ) {
@@ -256,10 +244,7 @@
             enabled = enabled,
             onClick = null,
         )
-        Text(
-            text = option.toString(),
-            style = MaterialTheme.typography.bodyMedium
-        )
+        Text(text = option.toString(), style = MaterialTheme.typography.bodyMedium)
     }
 }
 
diff --git a/compose/material3/material3/integration-tests/material3-catalog/src/main/java/androidx/compose/material3/catalog/library/util/Url.kt b/compose/material3/material3/integration-tests/material3-catalog/src/main/java/androidx/compose/material3/catalog/library/util/Url.kt
index 63ffc4f..82ee4cb 100644
--- a/compose/material3/material3/integration-tests/material3-catalog/src/main/java/androidx/compose/material3/catalog/library/util/Url.kt
+++ b/compose/material3/material3/integration-tests/material3-catalog/src/main/java/androidx/compose/material3/catalog/library/util/Url.kt
@@ -31,30 +31,37 @@
 const val StyleGuidelinesUrl = "https://m3.material.io/styles"
 const val ReleasesUrl = "https://developer.android.com/jetpack/androidx/releases/compose-material3"
 const val DocsUrl = "https://developer.android.com/reference/kotlin/androidx/compose/material3"
-const val PackageSummaryUrl = "https://developer.android.com/reference/kotlin/androidx/compose/" +
-    "material3/package-summary"
-const val SourceUrl = "https://cs.android.com/androidx/platform/frameworks/support/+/" +
-    "androidx-main:compose/material3"
-const val Material3SourceUrl = "https://cs.android.com/androidx/platform/frameworks/support/+/" +
-    "androidx-main:compose/material3/" +
-    "material3/src/commonMain/kotlin/androidx/compose/material3"
-const val SampleSourceUrl = "https://cs.android.com/androidx/platform/frameworks/support/+/" +
-    "androidx-main:compose/material3/" +
-    "material3/samples/src/main/java/androidx/compose/material3/samples"
-const val AdaptiveSourceUrl = "https://cs.android.com/androidx/platform/" +
-    "frameworks/support/+/androidx-main:compose/material3/material3-adaptive/" +
-    "src/commonMain/kotlin/androidx/compose/material3/adaptive"
-const val AdaptiveSampleSourceUrl = "https://cs.android.com/androidx/platform/frameworks/" +
-    "support/+/androidx-main:compose/material3/material3-adaptive/" +
-    "samples/src/main/java/androidx/compose/material3/samples"
-const val AdaptiveNavigationSuiteMaterial3SourceUrl = "https://cs.android.com/androidx/platform/" +
-    "frameworks/support/+/androidx-main:compose/material3/material3-adaptive-navigation-suite/" +
-    "src/commonMain/kotlin/androidx/compose/material3/adaptive/navigation-suite"
-const val AdaptiveNavigationSuiteSampleSourceUrl = "https://cs.android.com/androidx/platform/" +
-    "frameworks/support/+/androidx-main:compose/material3/material3-adaptive-navigation-suite" +
-    "samples/src/main/java/androidx/compose/material3-adaptive-navigation-suite/samples"
+const val PackageSummaryUrl =
+    "https://developer.android.com/reference/kotlin/androidx/compose/" + "material3/package-summary"
+const val SourceUrl =
+    "https://cs.android.com/androidx/platform/frameworks/support/+/" +
+        "androidx-main:compose/material3"
+const val Material3SourceUrl =
+    "https://cs.android.com/androidx/platform/frameworks/support/+/" +
+        "androidx-main:compose/material3/" +
+        "material3/src/commonMain/kotlin/androidx/compose/material3"
+const val SampleSourceUrl =
+    "https://cs.android.com/androidx/platform/frameworks/support/+/" +
+        "androidx-main:compose/material3/" +
+        "material3/samples/src/main/java/androidx/compose/material3/samples"
+const val AdaptiveSourceUrl =
+    "https://cs.android.com/androidx/platform/" +
+        "frameworks/support/+/androidx-main:compose/material3/material3-adaptive/" +
+        "src/commonMain/kotlin/androidx/compose/material3/adaptive"
+const val AdaptiveSampleSourceUrl =
+    "https://cs.android.com/androidx/platform/frameworks/" +
+        "support/+/androidx-main:compose/material3/material3-adaptive/" +
+        "samples/src/main/java/androidx/compose/material3/samples"
+const val AdaptiveNavigationSuiteMaterial3SourceUrl =
+    "https://cs.android.com/androidx/platform/" +
+        "frameworks/support/+/androidx-main:compose/material3/material3-adaptive-navigation-suite/" +
+        "src/commonMain/kotlin/androidx/compose/material3/adaptive/navigation-suite"
+const val AdaptiveNavigationSuiteSampleSourceUrl =
+    "https://cs.android.com/androidx/platform/" +
+        "frameworks/support/+/androidx-main:compose/material3/material3-adaptive-navigation-suite" +
+        "samples/src/main/java/androidx/compose/material3-adaptive-navigation-suite/samples"
 const val IssueUrl = "https://issuetracker.google.com/issues/new?component=742043"
 const val TermsUrl = "https://policies.google.com/terms"
 const val PrivacyUrl = "https://policies.google.com/privacy"
-const val LicensesUrl = "https://cs.android.com/androidx/platform/frameworks/support/+/" +
-    "androidx-main:LICENSE.txt"
+const val LicensesUrl =
+    "https://cs.android.com/androidx/platform/frameworks/support/+/" + "androidx-main:LICENSE.txt"
diff --git a/compose/material3/material3/integration-tests/material3-demos/src/main/java/androidx/compose/material3/demos/ColorSchemeDemo.kt b/compose/material3/material3/integration-tests/material3-demos/src/main/java/androidx/compose/material3/demos/ColorSchemeDemo.kt
index 04b2af4..8d7144b 100644
--- a/compose/material3/material3/integration-tests/material3-demos/src/main/java/androidx/compose/material3/demos/ColorSchemeDemo.kt
+++ b/compose/material3/material3/integration-tests/material3-demos/src/main/java/androidx/compose/material3/demos/ColorSchemeDemo.kt
@@ -44,10 +44,7 @@
     Row(
         modifier = Modifier.padding(8.dp),
     ) {
-        Column(
-            Modifier
-                .weight(1f)
-                .verticalScroll(rememberScrollState())) {
+        Column(Modifier.weight(1f).verticalScroll(rememberScrollState())) {
             Text("Surfaces", style = MaterialTheme.typography.bodyLarge)
             Spacer(modifier = Modifier.height(16.dp))
             SurfaceColorSwatch(
@@ -138,10 +135,7 @@
             Spacer(modifier = Modifier.height(16.dp))
         }
         Spacer(modifier = Modifier.width(24.dp))
-        Column(
-            Modifier
-                .weight(1f)
-                .verticalScroll(rememberScrollState())) {
+        Column(Modifier.weight(1f).verticalScroll(rememberScrollState())) {
             Text("Content", style = MaterialTheme.typography.bodyLarge)
             ContentColorSwatch(
                 color = colorScheme.primary,
@@ -151,7 +145,8 @@
                 colorContainer = colorScheme.primaryContainer,
                 colorContainerText = "Primary Container",
                 onColorContainer = colorScheme.onPrimaryContainer,
-                onColorContainerText = "On Primary Container")
+                onColorContainerText = "On Primary Container"
+            )
             Spacer(modifier = Modifier.height(16.dp))
             ContentColorSwatch(
                 color = colorScheme.secondary,
@@ -161,7 +156,8 @@
                 colorContainer = colorScheme.secondaryContainer,
                 colorContainerText = "Secondary Container",
                 onColorContainer = colorScheme.onSecondaryContainer,
-                onColorContainerText = "On Secondary Container")
+                onColorContainerText = "On Secondary Container"
+            )
             Spacer(modifier = Modifier.height(16.dp))
             ContentColorSwatch(
                 color = colorScheme.tertiary,
@@ -171,7 +167,8 @@
                 colorContainer = colorScheme.tertiaryContainer,
                 colorContainerText = "Tertiary Container",
                 onColorContainer = colorScheme.onTertiaryContainer,
-                onColorContainerText = "On Tertiary Container")
+                onColorContainerText = "On Tertiary Container"
+            )
             Spacer(modifier = Modifier.height(16.dp))
             ContentColorSwatch(
                 color = colorScheme.error,
@@ -181,7 +178,8 @@
                 colorContainer = colorScheme.errorContainer,
                 colorContainerText = "Error Container",
                 onColorContainer = colorScheme.onErrorContainer,
-                onColorContainerText = "On Error Container")
+                onColorContainerText = "On Error Container"
+            )
             Spacer(modifier = Modifier.height(16.dp))
             Text("Utility", style = MaterialTheme.typography.bodyLarge)
             DoubleTile(
@@ -231,12 +229,7 @@
     onColorContainerText: String,
 ) {
     DoubleTile(
-        leftTile = {
-            ColorTile(
-                text = colorText,
-                color = color
-            )
-        },
+        leftTile = { ColorTile(text = colorText, color = color) },
         rightTile = {
             ColorTile(
                 text = onColorText,
@@ -278,9 +271,7 @@
     } else if (color == Color.White) borderColor = Color.Black
 
     Surface(
-        modifier = Modifier
-            .height(48.dp)
-            .fillMaxWidth(),
+        modifier = Modifier.height(48.dp).fillMaxWidth(),
         color = color,
         border = BorderStroke(1.dp, borderColor),
     ) {
@@ -288,9 +279,9 @@
             text,
             Modifier.padding(4.dp),
             style =
-            MaterialTheme.typography.bodyMedium.copy(
-                if (color.luminance() < .25) Color.White else Color.Black
-            )
+                MaterialTheme.typography.bodyMedium.copy(
+                    if (color.luminance() < .25) Color.White else Color.Black
+                )
         )
     }
 }
diff --git a/compose/material3/material3/integration-tests/material3-demos/src/main/java/androidx/compose/material3/demos/Material3Demos.kt b/compose/material3/material3/integration-tests/material3-demos/src/main/java/androidx/compose/material3/demos/Material3Demos.kt
index 1fdbf6a..c2953f7 100644
--- a/compose/material3/material3/integration-tests/material3-demos/src/main/java/androidx/compose/material3/demos/Material3Demos.kt
+++ b/compose/material3/material3/integration-tests/material3-demos/src/main/java/androidx/compose/material3/demos/Material3Demos.kt
@@ -19,14 +19,15 @@
 import androidx.compose.integration.demos.common.ComposableDemo
 import androidx.compose.integration.demos.common.DemoCategory
 
-val Material3Demos = DemoCategory(
-    "Material 3",
-    listOf(
-        ComposableDemo("Color Scheme") { ColorSchemeDemo() },
-        ComposableDemo("Pull To Refresh") { PullToRefreshDemo() },
-        ComposableDemo("Shape") { ShapeDemo() },
-        ComposableDemo("Swipe To Dismiss") { SwipeToDismissDemo() },
-        ComposableDemo("Tooltip") { TooltipDemo() },
-        ComposableDemo("Text fields") { MaterialTextFieldDemo() },
-    ),
-)
+val Material3Demos =
+    DemoCategory(
+        "Material 3",
+        listOf(
+            ComposableDemo("Color Scheme") { ColorSchemeDemo() },
+            ComposableDemo("Pull To Refresh") { PullToRefreshDemo() },
+            ComposableDemo("Shape") { ShapeDemo() },
+            ComposableDemo("Swipe To Dismiss") { SwipeToDismissDemo() },
+            ComposableDemo("Tooltip") { TooltipDemo() },
+            ComposableDemo("Text fields") { MaterialTextFieldDemo() },
+        ),
+    )
diff --git a/compose/material3/material3/integration-tests/material3-demos/src/main/java/androidx/compose/material3/demos/PullToRefreshDemo.kt b/compose/material3/material3/integration-tests/material3-demos/src/main/java/androidx/compose/material3/demos/PullToRefreshDemo.kt
index 8beebce..0e3b463 100644
--- a/compose/material3/material3/integration-tests/material3-demos/src/main/java/androidx/compose/material3/demos/PullToRefreshDemo.kt
+++ b/compose/material3/material3/integration-tests/material3-demos/src/main/java/androidx/compose/material3/demos/PullToRefreshDemo.kt
@@ -79,9 +79,7 @@
         ) {
             LazyColumn(Modifier.fillMaxSize()) {
                 if (!isRefreshing) {
-                    items(itemCount) {
-                        ListItem({ Text(text = "Item ${itemCount - it}") })
-                    }
+                    items(itemCount) { ListItem({ Text(text = "Item ${itemCount - it}") }) }
                 }
             }
         }
diff --git a/compose/material3/material3/integration-tests/material3-demos/src/main/java/androidx/compose/material3/demos/SwipeToDismissDemo.kt b/compose/material3/material3/integration-tests/material3-demos/src/main/java/androidx/compose/material3/demos/SwipeToDismissDemo.kt
index 93625ef..b79d6b8 100644
--- a/compose/material3/material3/integration-tests/material3-demos/src/main/java/androidx/compose/material3/demos/SwipeToDismissDemo.kt
+++ b/compose/material3/material3/integration-tests/material3-demos/src/main/java/androidx/compose/material3/demos/SwipeToDismissDemo.kt
@@ -51,22 +51,23 @@
 import androidx.compose.ui.unit.dp
 import kotlinx.coroutines.launch
 
-private val items = listOf(
-    "Cupcake",
-    "Donut",
-    "Eclair",
-    "Froyo",
-    "Gingerbread",
-    "Honeycomb",
-    "Ice cream sandwich",
-    "Jelly bean",
-    "KitKat",
-    "Lollipop",
-    "Marshmallow",
-    "Nougat",
-    "Oreo",
-    "Pie"
-)
+private val items =
+    listOf(
+        "Cupcake",
+        "Donut",
+        "Eclair",
+        "Froyo",
+        "Gingerbread",
+        "Honeycomb",
+        "Ice cream sandwich",
+        "Jelly bean",
+        "KitKat",
+        "Lollipop",
+        "Marshmallow",
+        "Nougat",
+        "Oreo",
+        "Pie"
+    )
 
 @Composable
 fun SwipeToDismissDemo() {
@@ -81,44 +82,46 @@
             var unread by remember { mutableStateOf(false) }
             val scope = rememberCoroutineScope()
 
-            val dismissState = rememberSwipeToDismissBoxState(
-                confirmValueChange = {
-                    if (it == SwipeToDismissBoxValue.StartToEnd) unread = !unread
-                    it != SwipeToDismissBoxValue.StartToEnd
-                },
-                positionalThreshold = { distance -> distance * .25f }
-            )
+            val dismissState =
+                rememberSwipeToDismissBoxState(
+                    confirmValueChange = {
+                        if (it == SwipeToDismissBoxValue.StartToEnd) unread = !unread
+                        it != SwipeToDismissBoxValue.StartToEnd
+                    },
+                    positionalThreshold = { distance -> distance * .25f }
+                )
             SwipeToDismissBox(
                 state = dismissState,
                 modifier = Modifier.padding(vertical = 4.dp),
                 backgroundContent = {
                     val direction = dismissState.dismissDirection
-                    val color by animateColorAsState(
-                        when (dismissState.targetValue) {
-                            SwipeToDismissBoxValue.Settled -> Color.LightGray
-                            SwipeToDismissBoxValue.StartToEnd -> Color.Green
-                            SwipeToDismissBoxValue.EndToStart -> Color.Red
+                    val color by
+                        animateColorAsState(
+                            when (dismissState.targetValue) {
+                                SwipeToDismissBoxValue.Settled -> Color.LightGray
+                                SwipeToDismissBoxValue.StartToEnd -> Color.Green
+                                SwipeToDismissBoxValue.EndToStart -> Color.Red
+                            }
+                        )
+                    val alignment =
+                        when (direction) {
+                            SwipeToDismissBoxValue.StartToEnd,
+                            SwipeToDismissBoxValue.Settled -> Alignment.CenterStart
+                            SwipeToDismissBoxValue.EndToStart -> Alignment.CenterEnd
                         }
-                    )
-                    val alignment = when (direction) {
-                        SwipeToDismissBoxValue.StartToEnd,
-                        SwipeToDismissBoxValue.Settled -> Alignment.CenterStart
-                        SwipeToDismissBoxValue.EndToStart -> Alignment.CenterEnd
-                    }
-                    val icon = when (direction) {
-                        SwipeToDismissBoxValue.StartToEnd,
-                        SwipeToDismissBoxValue.Settled -> Icons.Default.Done
-                        SwipeToDismissBoxValue.EndToStart -> Icons.Default.Delete
-                    }
-                    val scale by animateFloatAsState(
-                        if (dismissState.targetValue == SwipeToDismissBoxValue.Settled)
-                            0.75f else 1f
-                    )
+                    val icon =
+                        when (direction) {
+                            SwipeToDismissBoxValue.StartToEnd,
+                            SwipeToDismissBoxValue.Settled -> Icons.Default.Done
+                            SwipeToDismissBoxValue.EndToStart -> Icons.Default.Delete
+                        }
+                    val scale by
+                        animateFloatAsState(
+                            if (dismissState.targetValue == SwipeToDismissBoxValue.Settled) 0.75f
+                            else 1f
+                        )
                     Box(
-                        Modifier
-                            .fillMaxSize()
-                            .background(color)
-                            .padding(horizontal = 20.dp),
+                        Modifier.fillMaxSize().background(color).padding(horizontal = 20.dp),
                         contentAlignment = alignment
                     ) {
                         Icon(
@@ -134,19 +137,26 @@
                         headlineContent = {
                             Text(item, fontWeight = if (unread) FontWeight.Bold else null)
                         },
-                        modifier = Modifier.semantics {
-                            // Provide accessible alternatives to swipe actions.
-                            val label = if (unread) "Mark Read" else "Mark Unread"
-                            customActions = listOf(
-                                CustomAccessibilityAction(label) { unread = !unread; true },
-                                CustomAccessibilityAction("Delete") {
-                                    scope.launch {
-                                        dismissState.dismiss(SwipeToDismissBoxValue.EndToStart)
-                                    }
-                                    true
-                                }
-                            )
-                        },
+                        modifier =
+                            Modifier.semantics {
+                                // Provide accessible alternatives to swipe actions.
+                                val label = if (unread) "Mark Read" else "Mark Unread"
+                                customActions =
+                                    listOf(
+                                        CustomAccessibilityAction(label) {
+                                            unread = !unread
+                                            true
+                                        },
+                                        CustomAccessibilityAction("Delete") {
+                                            scope.launch {
+                                                dismissState.dismiss(
+                                                    SwipeToDismissBoxValue.EndToStart
+                                                )
+                                            }
+                                            true
+                                        }
+                                    )
+                            },
                         supportingContent = { Text("Swipe me left or right!") },
                     )
                 }
diff --git a/compose/material3/material3/integration-tests/material3-demos/src/main/java/androidx/compose/material3/demos/TextFieldDemos.kt b/compose/material3/material3/integration-tests/material3-demos/src/main/java/androidx/compose/material3/demos/TextFieldDemos.kt
index 2cf9db4..a88d803 100644
--- a/compose/material3/material3/integration-tests/material3-demos/src/main/java/androidx/compose/material3/demos/TextFieldDemos.kt
+++ b/compose/material3/material3/integration-tests/material3-demos/src/main/java/androidx/compose/material3/demos/TextFieldDemos.kt
@@ -53,10 +53,7 @@
 
 @Composable
 fun MaterialTextFieldDemo() {
-    Column(
-        Modifier
-            .verticalScroll(rememberScrollState())
-            .padding(PaddingValues(10.dp))) {
+    Column(Modifier.verticalScroll(rememberScrollState()).padding(PaddingValues(10.dp))) {
         var text by rememberSaveable { mutableStateOf("") }
         var leadingChecked by rememberSaveable { mutableStateOf(false) }
         var trailingChecked by rememberSaveable { mutableStateOf(false) }
@@ -67,66 +64,67 @@
         var disabled by rememberSaveable { mutableStateOf(false) }
         var readOnly by rememberSaveable { mutableStateOf(false) }
 
-        val textField: @Composable () -> Unit = @Composable {
-            when (selectedTextField) {
-                TextFieldType.Filled ->
-                    TextField(
-                        value = text,
-                        onValueChange = { text = it },
-                        enabled = !disabled,
-                        readOnly = readOnly,
-                        singleLine = singleLineChecked,
-                        label = {
-                            val label =
-                                "Label" + if (selectedOption == Option.Error) "*" else ""
-                            Text(text = label)
-                        },
-                        leadingIcon = if (leadingChecked) {
-                            @Composable { Icon(Icons.Filled.Favorite, "Favorite") }
-                        } else {
-                            null
-                        },
-                        trailingIcon = if (trailingChecked) {
-                            @Composable { Icon(Icons.Filled.Info, "Info") }
-                        } else {
-                            null
-                        },
-                        isError = selectedOption == Option.Error,
-                        modifier = Modifier.requiredWidth(300.dp)
-                    )
-
-                TextFieldType.Outlined ->
-                    OutlinedTextField(
-                        value = text,
-                        onValueChange = { text = it },
-                        enabled = !disabled,
-                        readOnly = readOnly,
-                        singleLine = singleLineChecked,
-                        label = {
-                            val label =
-                                "Label" + if (selectedOption == Option.Error) "*" else ""
-                            Text(text = label)
-                        },
-                        leadingIcon = if (leadingChecked) {
-                            @Composable { Icon(Icons.Filled.Favorite, "Favorite") }
-                        } else {
-                            null
-                        },
-                        trailingIcon = if (trailingChecked) {
-                            @Composable { Icon(Icons.Filled.Info, "Info") }
-                        } else {
-                            null
-                        },
-                        isError = selectedOption == Option.Error,
-                        modifier = Modifier.requiredWidth(300.dp)
-                    )
+        val textField: @Composable () -> Unit =
+            @Composable {
+                when (selectedTextField) {
+                    TextFieldType.Filled ->
+                        TextField(
+                            value = text,
+                            onValueChange = { text = it },
+                            enabled = !disabled,
+                            readOnly = readOnly,
+                            singleLine = singleLineChecked,
+                            label = {
+                                val label =
+                                    "Label" + if (selectedOption == Option.Error) "*" else ""
+                                Text(text = label)
+                            },
+                            leadingIcon =
+                                if (leadingChecked) {
+                                    @Composable { Icon(Icons.Filled.Favorite, "Favorite") }
+                                } else {
+                                    null
+                                },
+                            trailingIcon =
+                                if (trailingChecked) {
+                                    @Composable { Icon(Icons.Filled.Info, "Info") }
+                                } else {
+                                    null
+                                },
+                            isError = selectedOption == Option.Error,
+                            modifier = Modifier.requiredWidth(300.dp)
+                        )
+                    TextFieldType.Outlined ->
+                        OutlinedTextField(
+                            value = text,
+                            onValueChange = { text = it },
+                            enabled = !disabled,
+                            readOnly = readOnly,
+                            singleLine = singleLineChecked,
+                            label = {
+                                val label =
+                                    "Label" + if (selectedOption == Option.Error) "*" else ""
+                                Text(text = label)
+                            },
+                            leadingIcon =
+                                if (leadingChecked) {
+                                    @Composable { Icon(Icons.Filled.Favorite, "Favorite") }
+                                } else {
+                                    null
+                                },
+                            trailingIcon =
+                                if (trailingChecked) {
+                                    @Composable { Icon(Icons.Filled.Info, "Info") }
+                                } else {
+                                    null
+                                },
+                            isError = selectedOption == Option.Error,
+                            modifier = Modifier.requiredWidth(300.dp)
+                        )
+                }
             }
-        }
 
-        Box(
-            Modifier
-                .height(150.dp)
-                .align(Alignment.CenterHorizontally)) {
+        Box(Modifier.height(150.dp).align(Alignment.CenterHorizontally)) {
             if (selectedOption == Option.None) {
                 textField()
             } else {
@@ -136,29 +134,25 @@
 
         Column {
             Title("Text field type")
-            TextFieldType.values().map { it.name }.forEach { textType ->
-                Row(
-                    Modifier
-                        .fillMaxWidth()
-                        .selectable(
-                            selected = (textType == selectedTextField.name),
-                            onClick = {
-                                selectedTextField = TextFieldType.valueOf(textType)
-                            }
+            TextFieldType.values()
+                .map { it.name }
+                .forEach { textType ->
+                    Row(
+                        Modifier.fillMaxWidth()
+                            .selectable(
+                                selected = (textType == selectedTextField.name),
+                                onClick = { selectedTextField = TextFieldType.valueOf(textType) }
+                            )
+                            .padding(horizontal = 16.dp)
+                    ) {
+                        RadioButton(selected = (textType == selectedTextField.name), onClick = null)
+                        Text(
+                            text = textType,
+                            style = MaterialTheme.typography.bodyLarge.merge(),
+                            modifier = Modifier.padding(start = 16.dp)
                         )
-                        .padding(horizontal = 16.dp)
-                ) {
-                    RadioButton(
-                        selected = (textType == selectedTextField.name),
-                        onClick = null
-                    )
-                    Text(
-                        text = textType,
-                        style = MaterialTheme.typography.bodyLarge.merge(),
-                        modifier = Modifier.padding(start = 16.dp)
-                    )
+                    }
                 }
-            }
 
             Title("Options")
             OptionRow(
@@ -186,61 +180,46 @@
             Spacer(Modifier.height(20.dp))
 
             Title("Assistive text")
-            Option.values().map { it.name }.forEach { text ->
-                Row(
-                    Modifier
-                        .fillMaxWidth()
-                        .selectable(
-                            selected = (text == selectedOption.name),
-                            onClick = { selectedOption = Option.valueOf(text) }
+            Option.values()
+                .map { it.name }
+                .forEach { text ->
+                    Row(
+                        Modifier.fillMaxWidth()
+                            .selectable(
+                                selected = (text == selectedOption.name),
+                                onClick = { selectedOption = Option.valueOf(text) }
+                            )
+                            .padding(horizontal = 16.dp)
+                    ) {
+                        RadioButton(selected = (text == selectedOption.name), onClick = null)
+                        Text(
+                            text = text,
+                            style = MaterialTheme.typography.bodyLarge.merge(),
+                            modifier = Modifier.padding(start = 16.dp)
                         )
-                        .padding(horizontal = 16.dp)
-                ) {
-                    RadioButton(
-                        selected = (text == selectedOption.name),
-                        onClick = null
-                    )
-                    Text(
-                        text = text,
-                        style = MaterialTheme.typography.bodyLarge.merge(),
-                        modifier = Modifier.padding(start = 16.dp)
-                    )
+                    }
                 }
-            }
 
             Title("Other settings")
-            OptionRow(
-                title = "Read-only",
-                checked = readOnly,
-                onCheckedChange = { readOnly = it }
-            )
-            OptionRow(
-                title = "Disabled",
-                checked = disabled,
-                onCheckedChange = { disabled = it }
-            )
+            OptionRow(title = "Read-only", checked = readOnly, onCheckedChange = { readOnly = it })
+            OptionRow(title = "Disabled", checked = disabled, onCheckedChange = { disabled = it })
         }
     }
 }
 
-/**
- * Text field with helper or error message below.
- */
+/** Text field with helper or error message below. */
 @Composable
-private fun TextFieldWithMessage(
-    helperMessageOption: Option,
-    content: @Composable () -> Unit
-) {
+private fun TextFieldWithMessage(helperMessageOption: Option, content: @Composable () -> Unit) {
     val typography = MaterialTheme.typography.labelMedium
-    val color = when (helperMessageOption) {
-        Option.Helper -> {
-            MaterialTheme.colorScheme.onSurface
+    val color =
+        when (helperMessageOption) {
+            Option.Helper -> {
+                MaterialTheme.colorScheme.onSurface
+            }
+            Option.Error -> MaterialTheme.colorScheme.error
+            else -> Color.Unspecified
         }
 
-        Option.Error -> MaterialTheme.colorScheme.error
-        else -> Color.Unspecified
-    }
-
     Column {
         Box(modifier = Modifier.weight(1f, fill = false)) { content() }
         Text(
@@ -270,12 +249,9 @@
     enabled: Boolean = true
 ) {
     Row(
-        Modifier
-            .padding(start = 10.dp, top = 10.dp)
+        Modifier.padding(start = 10.dp, top = 10.dp)
             .fillMaxWidth()
-            .toggleable(
-                value = checked, onValueChange = onCheckedChange, enabled = enabled
-            )
+            .toggleable(value = checked, onValueChange = onCheckedChange, enabled = enabled)
     ) {
         Checkbox(checked = checked, onCheckedChange = null, enabled = enabled)
         Spacer(Modifier.width(20.dp))
@@ -283,9 +259,14 @@
     }
 }
 
-/**
- * Helper message option
- */
-private enum class Option { None, Helper, Error }
+/** Helper message option */
+private enum class Option {
+    None,
+    Helper,
+    Error
+}
 
-private enum class TextFieldType { Filled, Outlined }
+private enum class TextFieldType {
+    Filled,
+    Outlined
+}
diff --git a/compose/material3/material3/integration-tests/material3-demos/src/main/java/androidx/compose/material3/demos/TooltipDemo.kt b/compose/material3/material3/integration-tests/material3-demos/src/main/java/androidx/compose/material3/demos/TooltipDemo.kt
index be8dbb0..ec5eede 100644
--- a/compose/material3/material3/integration-tests/material3-demos/src/main/java/androidx/compose/material3/demos/TooltipDemo.kt
+++ b/compose/material3/material3/integration-tests/material3-demos/src/main/java/androidx/compose/material3/demos/TooltipDemo.kt
@@ -59,28 +59,20 @@
         verticalArrangement = Arrangement.spacedBy(4.dp)
     ) {
         Text("Add items to the list")
-        Row(
-            horizontalArrangement = Arrangement.spacedBy(8.dp)
-        ) {
+        Row(horizontalArrangement = Arrangement.spacedBy(8.dp)) {
             var textFieldValue by remember { mutableStateOf("") }
             var textFieldTooltipText by remember { mutableStateOf("") }
             val textFieldTooltipState = rememberTooltipState()
             val scope = rememberCoroutineScope()
             TooltipBox(
                 positionProvider = TooltipDefaults.rememberPlainTooltipPositionProvider(),
-                tooltip = {
-                    PlainTooltip {
-                        Text(textFieldTooltipText)
-                    }
-                },
+                tooltip = { PlainTooltip { Text(textFieldTooltipText) } },
                 state = textFieldTooltipState
             ) {
                 OutlinedTextField(
                     value = textFieldValue,
                     placeholder = { Text("Item Name") },
-                    onValueChange = { newVal ->
-                        textFieldValue = newVal
-                    }
+                    onValueChange = { newVal -> textFieldValue = newVal }
                 )
             }
 
@@ -88,16 +80,12 @@
                 onClick = {
                     if (textFieldValue.isBlank()) {
                         textFieldTooltipText = "Please give the item a name!"
-                        scope.launch {
-                            textFieldTooltipState.show()
-                        }
+                        scope.launch { textFieldTooltipState.show() }
                     } else {
                         val listItem = ItemInfo(textFieldValue, TooltipState())
                         listData.add(listItem)
                         textFieldValue = ""
-                        scope.launch {
-                            listItem.addedTooltipState.show()
-                        }
+                        scope.launch { listItem.addedTooltipState.show() }
                     }
                 }
             ) {
@@ -105,23 +93,14 @@
             }
         }
 
-        LazyColumn(
-            verticalArrangement = Arrangement.spacedBy(4.dp)
-        ) {
+        LazyColumn(verticalArrangement = Arrangement.spacedBy(4.dp)) {
             items(listData) { item ->
                 TooltipBox(
                     positionProvider = TooltipDefaults.rememberPlainTooltipPositionProvider(),
-                    tooltip = {
-                        PlainTooltip {
-                            Text("${item.itemName} added to list")
-                        }
-                    },
+                    tooltip = { PlainTooltip { Text("${item.itemName} added to list") } },
                     state = item.addedTooltipState
                 ) {
-                    ListItemCard(
-                        itemName = item.itemName,
-                        onDelete = { listData.remove(item) }
-                    )
+                    ListItemCard(itemName = item.itemName, onDelete = { listData.remove(item) })
                 }
             }
         }
@@ -130,29 +109,18 @@
 
 @OptIn(ExperimentalMaterial3Api::class)
 @Composable
-fun ListItemCard(
-    itemName: String,
-    onDelete: () -> Unit
-) {
-    OutlinedCard(
-        modifier = Modifier.fillMaxSize()
-    ) {
+fun ListItemCard(itemName: String, onDelete: () -> Unit) {
+    OutlinedCard(modifier = Modifier.fillMaxSize()) {
         ListItem(
             headlineContent = { Text(itemName) },
             trailingContent = {
                 TooltipBox(
                     positionProvider = TooltipDefaults.rememberPlainTooltipPositionProvider(),
-                    tooltip = {
-                        PlainTooltip {
-                            Text("Delete $itemName")
-                        }
-                    },
+                    tooltip = { PlainTooltip { Text("Delete $itemName") } },
                     state = rememberTooltipState(),
                     enableUserInput = true
                 ) {
-                    IconButton(
-                        onClick = onDelete
-                    ) {
+                    IconButton(onClick = onDelete) {
                         Icon(
                             imageVector = Icons.Filled.Delete,
                             contentDescription = "Delete $itemName from list."
@@ -165,7 +133,4 @@
 }
 
 @OptIn(ExperimentalMaterial3Api::class)
-class ItemInfo(
-    val itemName: String,
-    val addedTooltipState: TooltipState
-)
+class ItemInfo(val itemName: String, val addedTooltipState: TooltipState)
diff --git a/compose/material3/material3/samples/src/main/java/androidx/compose/material3/samples/AlertDialogSamples.kt b/compose/material3/material3/samples/src/main/java/androidx/compose/material3/samples/AlertDialogSamples.kt
index 831d9bc..89be632 100644
--- a/compose/material3/material3/samples/src/main/java/androidx/compose/material3/samples/AlertDialogSamples.kt
+++ b/compose/material3/material3/samples/src/main/java/androidx/compose/material3/samples/AlertDialogSamples.kt
@@ -56,29 +56,13 @@
                 // onDismissRequest.
                 openDialog.value = false
             },
-            title = {
-                Text(text = "Title")
-            },
-            text = {
-                Text(text = "Turned on by default")
-            },
+            title = { Text(text = "Title") },
+            text = { Text(text = "Turned on by default") },
             confirmButton = {
-                TextButton(
-                    onClick = {
-                        openDialog.value = false
-                    }
-                ) {
-                    Text("Confirm")
-                }
+                TextButton(onClick = { openDialog.value = false }) { Text("Confirm") }
             },
             dismissButton = {
-                TextButton(
-                    onClick = {
-                        openDialog.value = false
-                    }
-                ) {
-                    Text("Dismiss")
-                }
+                TextButton(onClick = { openDialog.value = false }) { Text("Dismiss") }
             }
         )
     }
@@ -99,9 +83,7 @@
                 openDialog.value = false
             },
             icon = { Icon(Icons.Filled.Favorite, contentDescription = null) },
-            title = {
-                Text(text = "Title")
-            },
+            title = { Text(text = "Title") },
             text = {
                 Text(
                     "This area typically contains the supportive text " +
@@ -109,22 +91,10 @@
                 )
             },
             confirmButton = {
-                TextButton(
-                    onClick = {
-                        openDialog.value = false
-                    }
-                ) {
-                    Text("Confirm")
-                }
+                TextButton(onClick = { openDialog.value = false }) { Text("Confirm") }
             },
             dismissButton = {
-                TextButton(
-                    onClick = {
-                        openDialog.value = false
-                    }
-                ) {
-                    Text("Dismiss")
-                }
+                TextButton(onClick = { openDialog.value = false }) { Text("Dismiss") }
             }
         )
     }
@@ -147,22 +117,19 @@
             }
         ) {
             Surface(
-                modifier = Modifier
-                    .wrapContentWidth()
-                    .wrapContentHeight(),
+                modifier = Modifier.wrapContentWidth().wrapContentHeight(),
                 shape = MaterialTheme.shapes.large,
                 tonalElevation = AlertDialogDefaults.TonalElevation
             ) {
                 Column(modifier = Modifier.padding(16.dp)) {
                     Text(
-                        text = "This area typically contains the supportive text " +
-                            "which presents the details regarding the Dialog's purpose.",
+                        text =
+                            "This area typically contains the supportive text " +
+                                "which presents the details regarding the Dialog's purpose.",
                     )
                     Spacer(modifier = Modifier.height(24.dp))
                     TextButton(
-                        onClick = {
-                            openDialog.value = false
-                        },
+                        onClick = { openDialog.value = false },
                         modifier = Modifier.align(Alignment.End)
                     ) {
                         Text("Confirm")
diff --git a/compose/material3/material3/samples/src/main/java/androidx/compose/material3/samples/AppBarSamples.kt b/compose/material3/material3/samples/src/main/java/androidx/compose/material3/samples/AppBarSamples.kt
index a6538f0..04fbae7 100644
--- a/compose/material3/material3/samples/src/main/java/androidx/compose/material3/samples/AppBarSamples.kt
+++ b/compose/material3/material3/samples/src/main/java/androidx/compose/material3/samples/AppBarSamples.kt
@@ -65,11 +65,7 @@
         topBar = {
             TopAppBar(
                 title = {
-                    Text(
-                        "Simple TopAppBar",
-                        maxLines = 1,
-                        overflow = TextOverflow.Ellipsis
-                    )
+                    Text("Simple TopAppBar", maxLines = 1, overflow = TextOverflow.Ellipsis)
                 },
                 navigationIcon = {
                     IconButton(onClick = { /* doSomething() */ }) {
@@ -99,9 +95,7 @@
                     Text(
                         text = list[it],
                         style = MaterialTheme.typography.bodyLarge,
-                        modifier = Modifier
-                            .fillMaxWidth()
-                            .padding(horizontal = 16.dp)
+                        modifier = Modifier.fillMaxWidth().padding(horizontal = 16.dp)
                     )
                 }
             }
@@ -123,11 +117,7 @@
         topBar = {
             CenterAlignedTopAppBar(
                 title = {
-                    Text(
-                        "Centered TopAppBar",
-                        maxLines = 1,
-                        overflow = TextOverflow.Ellipsis
-                    )
+                    Text("Centered TopAppBar", maxLines = 1, overflow = TextOverflow.Ellipsis)
                 },
                 navigationIcon = {
                     IconButton(onClick = { /* doSomething() */ }) {
@@ -157,9 +147,7 @@
                     Text(
                         text = list[it],
                         style = MaterialTheme.typography.bodyLarge,
-                        modifier = Modifier
-                            .fillMaxWidth()
-                            .padding(horizontal = 16.dp)
+                        modifier = Modifier.fillMaxWidth().padding(horizontal = 16.dp)
                     )
                 }
             }
@@ -183,13 +171,7 @@
         modifier = Modifier.nestedScroll(scrollBehavior.nestedScrollConnection),
         topBar = {
             TopAppBar(
-                title = {
-                    Text(
-                        "TopAppBar",
-                        maxLines = 1,
-                        overflow = TextOverflow.Ellipsis
-                    )
-                },
+                title = { Text("TopAppBar", maxLines = 1, overflow = TextOverflow.Ellipsis) },
                 navigationIcon = {
                     IconButton(onClick = { /* doSomething() */ }) {
                         Icon(
@@ -226,9 +208,7 @@
                     Text(
                         text = list[it],
                         style = MaterialTheme.typography.bodyLarge,
-                        modifier = Modifier
-                            .fillMaxWidth()
-                            .padding(horizontal = 16.dp)
+                        modifier = Modifier.fillMaxWidth().padding(horizontal = 16.dp)
                     )
                 }
             }
@@ -237,8 +217,8 @@
 }
 
 /**
- * A sample for a small [TopAppBar] that collapses when the content is scrolled up, and
- * appears when the content scrolled down.
+ * A sample for a small [TopAppBar] that collapses when the content is scrolled up, and appears when
+ * the content scrolled down.
  */
 @OptIn(ExperimentalMaterial3Api::class)
 @Preview
@@ -250,13 +230,7 @@
         modifier = Modifier.nestedScroll(scrollBehavior.nestedScrollConnection),
         topBar = {
             TopAppBar(
-                title = {
-                    Text(
-                        "TopAppBar",
-                        maxLines = 1,
-                        overflow = TextOverflow.Ellipsis
-                    )
-                },
+                title = { Text("TopAppBar", maxLines = 1, overflow = TextOverflow.Ellipsis) },
                 navigationIcon = {
                     IconButton(onClick = { /* doSomething() */ }) {
                         Icon(
@@ -286,9 +260,7 @@
                     Text(
                         text = list[it],
                         style = MaterialTheme.typography.bodyLarge,
-                        modifier = Modifier
-                            .fillMaxWidth()
-                            .padding(horizontal = 16.dp)
+                        modifier = Modifier.fillMaxWidth().padding(horizontal = 16.dp)
                     )
                 }
             }
@@ -297,8 +269,8 @@
 }
 
 /**
- * A sample for a [MediumTopAppBar] that collapses when the content is scrolled up, and
- * appears when the content is completely scrolled back down.
+ * A sample for a [MediumTopAppBar] that collapses when the content is scrolled up, and appears when
+ * the content is completely scrolled back down.
  */
 @OptIn(ExperimentalMaterial3Api::class)
 @Preview
@@ -311,11 +283,7 @@
         topBar = {
             MediumTopAppBar(
                 title = {
-                    Text(
-                        "Medium TopAppBar",
-                        maxLines = 1,
-                        overflow = TextOverflow.Ellipsis
-                    )
+                    Text("Medium TopAppBar", maxLines = 1, overflow = TextOverflow.Ellipsis)
                 },
                 navigationIcon = {
                     IconButton(onClick = { /* doSomething() */ }) {
@@ -346,9 +314,7 @@
                     Text(
                         text = list[it],
                         style = MaterialTheme.typography.bodyLarge,
-                        modifier = Modifier
-                            .fillMaxWidth()
-                            .padding(horizontal = 16.dp)
+                        modifier = Modifier.fillMaxWidth().padding(horizontal = 16.dp)
                     )
                 }
             }
@@ -357,8 +323,8 @@
 }
 
 /**
- * A sample for a [LargeTopAppBar] that collapses when the content is scrolled up, and
- * appears when the content is completely scrolled back down.
+ * A sample for a [LargeTopAppBar] that collapses when the content is scrolled up, and appears when
+ * the content is completely scrolled back down.
  */
 @OptIn(ExperimentalMaterial3Api::class)
 @Preview
@@ -370,13 +336,7 @@
         modifier = Modifier.nestedScroll(scrollBehavior.nestedScrollConnection),
         topBar = {
             LargeTopAppBar(
-                title = {
-                    Text(
-                        "Large TopAppBar",
-                        maxLines = 1,
-                        overflow = TextOverflow.Ellipsis
-                    )
-                },
+                title = { Text("Large TopAppBar", maxLines = 1, overflow = TextOverflow.Ellipsis) },
                 navigationIcon = {
                     IconButton(onClick = { /* doSomething() */ }) {
                         Icon(
@@ -406,9 +366,7 @@
                     Text(
                         text = list[it],
                         style = MaterialTheme.typography.bodyLarge,
-                        modifier = Modifier
-                            .fillMaxWidth()
-                            .padding(horizontal = 16.dp)
+                        modifier = Modifier.fillMaxWidth().padding(horizontal = 16.dp)
                     )
                 }
             }
@@ -458,8 +416,8 @@
 }
 
 /**
- * A sample for a [BottomAppBar] that collapses when the content is scrolled up, and
- * appears when the content scrolled down.
+ * A sample for a [BottomAppBar] that collapses when the content is scrolled up, and appears when
+ * the content scrolled down.
  */
 @OptIn(ExperimentalMaterial3Api::class)
 @Preview
@@ -503,9 +461,7 @@
                     Text(
                         text = list[it],
                         style = MaterialTheme.typography.bodyLarge,
-                        modifier = Modifier
-                            .fillMaxWidth()
-                            .padding(horizontal = 16.dp)
+                        modifier = Modifier.fillMaxWidth().padding(horizontal = 16.dp)
                     )
                 }
             }
diff --git a/compose/material3/material3/samples/src/main/java/androidx/compose/material3/samples/BadgeSamples.kt b/compose/material3/material3/samples/src/main/java/androidx/compose/material3/samples/BadgeSamples.kt
index ba92bf5..55f93b1 100644
--- a/compose/material3/material3/samples/src/main/java/androidx/compose/material3/samples/BadgeSamples.kt
+++ b/compose/material3/material3/samples/src/main/java/androidx/compose/material3/samples/BadgeSamples.kt
@@ -44,16 +44,15 @@
                             val badgeNumber = "8"
                             Text(
                                 badgeNumber,
-                                modifier = Modifier.semantics {
-                                    contentDescription = "$badgeNumber new notifications"
-                                }
+                                modifier =
+                                    Modifier.semantics {
+                                        contentDescription = "$badgeNumber new notifications"
+                                    }
                             )
                         }
-                    }) {
-                    Icon(
-                        Icons.Filled.Star,
-                        contentDescription = "Favorite"
-                    )
+                    }
+                ) {
+                    Icon(Icons.Filled.Star, contentDescription = "Favorite")
                 }
             },
             selected = false,
diff --git a/compose/material3/material3/samples/src/main/java/androidx/compose/material3/samples/BottomSheetSamples.kt b/compose/material3/material3/samples/src/main/java/androidx/compose/material3/samples/BottomSheetSamples.kt
index b720202..368eedf 100644
--- a/compose/material3/material3/samples/src/main/java/androidx/compose/material3/samples/BottomSheetSamples.kt
+++ b/compose/material3/material3/samples/src/main/java/androidx/compose/material3/samples/BottomSheetSamples.kt
@@ -73,9 +73,8 @@
     var openBottomSheet by rememberSaveable { mutableStateOf(false) }
     var skipPartiallyExpanded by rememberSaveable { mutableStateOf(false) }
     val scope = rememberCoroutineScope()
-    val bottomSheetState = rememberModalBottomSheetState(
-        skipPartiallyExpanded = skipPartiallyExpanded
-    )
+    val bottomSheetState =
+        rememberModalBottomSheetState(skipPartiallyExpanded = skipPartiallyExpanded)
 
     // App content
     Column(
@@ -113,11 +112,13 @@
                     // Note: If you provide logic outside of onDismissRequest to remove the sheet,
                     // you must additionally handle intended state cleanup, if any.
                     onClick = {
-                        scope.launch { bottomSheetState.hide() }.invokeOnCompletion {
-                            if (!bottomSheetState.isVisible) {
-                                openBottomSheet = false
+                        scope
+                            .launch { bottomSheetState.hide() }
+                            .invokeOnCompletion {
+                                if (!bottomSheetState.isVisible) {
+                                    openBottomSheet = false
+                                }
                             }
-                        }
                     }
                 ) {
                     Text("Hide Bottom Sheet")
@@ -140,9 +141,10 @@
                                 contentDescription = "Localized description"
                             )
                         },
-                        colors = ListItemDefaults.colors(
-                            containerColor = MaterialTheme.colorScheme.surfaceContainerLow
-                        ),
+                        colors =
+                            ListItemDefaults.colors(
+                                containerColor = MaterialTheme.colorScheme.surfaceContainerLow
+                            ),
                     )
                 }
             }
@@ -162,33 +164,22 @@
         scaffoldState = scaffoldState,
         sheetPeekHeight = 128.dp,
         sheetContent = {
-            Column(
-                Modifier.fillMaxWidth(),
-                horizontalAlignment = Alignment.CenterHorizontally
-            ) {
-                Box(
-                    Modifier
-                        .fillMaxWidth()
-                        .height(128.dp),
-                    contentAlignment = Alignment.Center
-                ) {
+            Column(Modifier.fillMaxWidth(), horizontalAlignment = Alignment.CenterHorizontally) {
+                Box(Modifier.fillMaxWidth().height(128.dp), contentAlignment = Alignment.Center) {
                     Text("Swipe up to expand sheet")
                 }
                 Text("Sheet content")
                 Button(
                     modifier = Modifier.padding(bottom = 64.dp),
-                    onClick = {
-                        scope.launch { scaffoldState.bottomSheetState.partialExpand() }
-                    }
+                    onClick = { scope.launch { scaffoldState.bottomSheetState.partialExpand() } }
                 ) {
                     Text("Click to collapse sheet")
                 }
             }
-        }) { innerPadding ->
+        }
+    ) { innerPadding ->
         Box(
-            modifier = Modifier
-                .fillMaxSize()
-                .padding(innerPadding),
+            modifier = Modifier.fillMaxSize().padding(innerPadding),
             contentAlignment = Alignment.Center
         ) {
             Text("Scaffold Content")
@@ -200,13 +191,14 @@
 @OptIn(ExperimentalMaterial3Api::class)
 @Composable
 fun BottomSheetScaffoldNestedScrollSample() {
-    val colors = listOf(
-        Color(0xFFffd7d7.toInt()),
-        Color(0xFFffe9d6.toInt()),
-        Color(0xFFfffbd0.toInt()),
-        Color(0xFFe3ffd9.toInt()),
-        Color(0xFFd0fff8.toInt())
-    )
+    val colors =
+        listOf(
+            Color(0xFFffd7d7.toInt()),
+            Color(0xFFffe9d6.toInt()),
+            Color(0xFFfffbd0.toInt()),
+            Color(0xFFe3ffd9.toInt()),
+            Color(0xFFd0fff8.toInt())
+        )
 
     val scaffoldState = rememberBottomSheetScaffoldState()
     val scrollBehavior = TopAppBarDefaults.pinnedScrollBehavior()
@@ -224,9 +216,10 @@
                                 contentDescription = "Localized description"
                             )
                         },
-                        colors = ListItemDefaults.colors(
-                            containerColor = MaterialTheme.colorScheme.surfaceContainerLow
-                        ),
+                        colors =
+                            ListItemDefaults.colors(
+                                containerColor = MaterialTheme.colorScheme.surfaceContainerLow
+                            ),
                     )
                 }
             }
@@ -247,12 +240,7 @@
     ) { innerPadding ->
         LazyColumn(contentPadding = innerPadding) {
             items(100) {
-                Box(
-                    Modifier
-                        .fillMaxWidth()
-                        .height(50.dp)
-                        .background(colors[it % colors.size])
-                )
+                Box(Modifier.fillMaxWidth().height(50.dp).background(colors[it % colors.size]))
             }
         }
     }
diff --git a/compose/material3/material3/samples/src/main/java/androidx/compose/material3/samples/CardSamples.kt b/compose/material3/material3/samples/src/main/java/androidx/compose/material3/samples/CardSamples.kt
index d228c2b..c47ced7 100644
--- a/compose/material3/material3/samples/src/main/java/androidx/compose/material3/samples/CardSamples.kt
+++ b/compose/material3/material3/samples/src/main/java/androidx/compose/material3/samples/CardSamples.kt
@@ -35,9 +35,7 @@
 @Composable
 fun CardSample() {
     Card(Modifier.size(width = 180.dp, height = 100.dp)) {
-        Box(Modifier.fillMaxSize()) {
-            Text("Card content", Modifier.align(Alignment.Center))
-        }
+        Box(Modifier.fillMaxSize()) { Text("Card content", Modifier.align(Alignment.Center)) }
     }
 }
 
@@ -49,9 +47,7 @@
         onClick = { /* Do something */ },
         modifier = Modifier.size(width = 180.dp, height = 100.dp)
     ) {
-        Box(Modifier.fillMaxSize()) {
-            Text("Clickable", Modifier.align(Alignment.Center))
-        }
+        Box(Modifier.fillMaxSize()) { Text("Clickable", Modifier.align(Alignment.Center)) }
     }
 }
 
@@ -60,9 +56,7 @@
 @Composable
 fun ElevatedCardSample() {
     ElevatedCard(Modifier.size(width = 180.dp, height = 100.dp)) {
-        Box(Modifier.fillMaxSize()) {
-            Text("Card content", Modifier.align(Alignment.Center))
-        }
+        Box(Modifier.fillMaxSize()) { Text("Card content", Modifier.align(Alignment.Center)) }
     }
 }
 
@@ -74,9 +68,7 @@
         onClick = { /* Do something */ },
         modifier = Modifier.size(width = 180.dp, height = 100.dp)
     ) {
-        Box(Modifier.fillMaxSize()) {
-            Text("Clickable", Modifier.align(Alignment.Center))
-        }
+        Box(Modifier.fillMaxSize()) { Text("Clickable", Modifier.align(Alignment.Center)) }
     }
 }
 
@@ -85,9 +77,7 @@
 @Composable
 fun OutlinedCardSample() {
     OutlinedCard(Modifier.size(width = 180.dp, height = 100.dp)) {
-        Box(Modifier.fillMaxSize()) {
-            Text("Card content", Modifier.align(Alignment.Center))
-        }
+        Box(Modifier.fillMaxSize()) { Text("Card content", Modifier.align(Alignment.Center)) }
     }
 }
 
@@ -99,8 +89,6 @@
         onClick = { /* Do something */ },
         modifier = Modifier.size(width = 180.dp, height = 100.dp)
     ) {
-        Box(Modifier.fillMaxSize()) {
-            Text("Clickable", Modifier.align(Alignment.Center))
-        }
+        Box(Modifier.fillMaxSize()) { Text("Clickable", Modifier.align(Alignment.Center)) }
     }
 }
diff --git a/compose/material3/material3/samples/src/main/java/androidx/compose/material3/samples/CarouselSamples.kt b/compose/material3/material3/samples/src/main/java/androidx/compose/material3/samples/CarouselSamples.kt
index f142563..a387987 100644
--- a/compose/material3/material3/samples/src/main/java/androidx/compose/material3/samples/CarouselSamples.kt
+++ b/compose/material3/material3/samples/src/main/java/androidx/compose/material3/samples/CarouselSamples.kt
@@ -76,19 +76,18 @@
         @StringRes val contentDescriptionResId: Int
     )
 
-    val items = listOf(
-        CarouselItem(0, R.drawable.carousel_image_1, R.string.carousel_image_1_description),
-        CarouselItem(1, R.drawable.carousel_image_2, R.string.carousel_image_2_description),
-        CarouselItem(2, R.drawable.carousel_image_3, R.string.carousel_image_3_description),
-        CarouselItem(3, R.drawable.carousel_image_4, R.string.carousel_image_4_description),
-        CarouselItem(4, R.drawable.carousel_image_5, R.string.carousel_image_5_description),
-    )
+    val items =
+        listOf(
+            CarouselItem(0, R.drawable.carousel_image_1, R.string.carousel_image_1_description),
+            CarouselItem(1, R.drawable.carousel_image_2, R.string.carousel_image_2_description),
+            CarouselItem(2, R.drawable.carousel_image_3, R.string.carousel_image_3_description),
+            CarouselItem(3, R.drawable.carousel_image_4, R.string.carousel_image_4_description),
+            CarouselItem(4, R.drawable.carousel_image_5, R.string.carousel_image_5_description),
+        )
 
     HorizontalMultiBrowseCarousel(
         state = rememberCarouselState { items.count() },
-        modifier = Modifier
-            .width(412.dp)
-            .height(221.dp),
+        modifier = Modifier.width(412.dp).height(221.dp),
         preferredItemWidth = 186.dp,
         itemSpacing = 8.dp,
         contentPadding = PaddingValues(horizontal = 16.dp)
@@ -115,18 +114,17 @@
         @StringRes val contentDescriptionResId: Int
     )
 
-    val items = listOf(
-        CarouselItem(0, R.drawable.carousel_image_1, R.string.carousel_image_1_description),
-        CarouselItem(1, R.drawable.carousel_image_2, R.string.carousel_image_2_description),
-        CarouselItem(2, R.drawable.carousel_image_3, R.string.carousel_image_3_description),
-        CarouselItem(3, R.drawable.carousel_image_4, R.string.carousel_image_4_description),
-        CarouselItem(4, R.drawable.carousel_image_5, R.string.carousel_image_5_description),
-    )
+    val items =
+        listOf(
+            CarouselItem(0, R.drawable.carousel_image_1, R.string.carousel_image_1_description),
+            CarouselItem(1, R.drawable.carousel_image_2, R.string.carousel_image_2_description),
+            CarouselItem(2, R.drawable.carousel_image_3, R.string.carousel_image_3_description),
+            CarouselItem(3, R.drawable.carousel_image_4, R.string.carousel_image_4_description),
+            CarouselItem(4, R.drawable.carousel_image_5, R.string.carousel_image_5_description),
+        )
     HorizontalUncontainedCarousel(
         state = rememberCarouselState { items.count() },
-        modifier = Modifier
-            .width(412.dp)
-            .height(221.dp),
+        modifier = Modifier.width(412.dp).height(221.dp),
         itemWidth = 186.dp,
         itemSpacing = 8.dp,
         contentPadding = PaddingValues(horizontal = 16.dp)
@@ -153,19 +151,18 @@
         @StringRes val contentDescriptionResId: Int
     )
 
-    val items = listOf(
-        CarouselItem(0, R.drawable.carousel_image_1, R.string.carousel_image_1_description),
-        CarouselItem(1, R.drawable.carousel_image_2, R.string.carousel_image_2_description),
-        CarouselItem(2, R.drawable.carousel_image_3, R.string.carousel_image_3_description),
-        CarouselItem(3, R.drawable.carousel_image_4, R.string.carousel_image_4_description),
-        CarouselItem(4, R.drawable.carousel_image_5, R.string.carousel_image_5_description),
-    )
+    val items =
+        listOf(
+            CarouselItem(0, R.drawable.carousel_image_1, R.string.carousel_image_1_description),
+            CarouselItem(1, R.drawable.carousel_image_2, R.string.carousel_image_2_description),
+            CarouselItem(2, R.drawable.carousel_image_3, R.string.carousel_image_3_description),
+            CarouselItem(3, R.drawable.carousel_image_4, R.string.carousel_image_4_description),
+            CarouselItem(4, R.drawable.carousel_image_5, R.string.carousel_image_5_description),
+        )
     val state = rememberCarouselState { items.count() }
     HorizontalMultiBrowseCarousel(
         state = state,
-        modifier = Modifier
-            .width(412.dp)
-            .height(221.dp),
+        modifier = Modifier.width(412.dp).height(221.dp),
         preferredItemWidth = 186.dp,
         itemSpacing = 8.dp,
         contentPadding = PaddingValues(horizontal = 16.dp)
@@ -179,26 +176,23 @@
                 verticalArrangement = Arrangement.spacedBy(8.dp)
             ) {
                 Image(
-                    modifier = Modifier
-                        .fillMaxWidth()
-                        .fillMaxHeight(.5f)
-                        .maskClip(MaterialTheme.shapes.extraLarge)
-                        .maskBorder(
-                            BorderStroke(3.dp, Color.Magenta),
-                            MaterialTheme.shapes.extraLarge
-                        ),
+                    modifier =
+                        Modifier.fillMaxWidth()
+                            .fillMaxHeight(.5f)
+                            .maskClip(MaterialTheme.shapes.extraLarge)
+                            .maskBorder(
+                                BorderStroke(3.dp, Color.Magenta),
+                                MaterialTheme.shapes.extraLarge
+                            ),
                     painter = painterResource(id = item.imageResId),
                     contentDescription = stringResource(item.contentDescriptionResId),
                     contentScale = ContentScale.Crop
                 )
                 Image(
-                    modifier = Modifier
-                        .fillMaxSize()
-                        .maskClip(RoundedCornerShape(8.dp))
-                        .maskBorder(
-                            BorderStroke(5.dp, Color.Green),
-                            RoundedCornerShape(8.dp)
-                        ),
+                    modifier =
+                        Modifier.fillMaxSize()
+                            .maskClip(RoundedCornerShape(8.dp))
+                            .maskBorder(BorderStroke(5.dp, Color.Green), RoundedCornerShape(8.dp)),
                     painter = painterResource(id = item.imageResId),
                     contentDescription = stringResource(item.contentDescriptionResId),
                     contentScale = ContentScale.Crop
@@ -215,18 +209,16 @@
                     ): Outline {
                         val roundRect =
                             RoundRect(0f, 0f, size.width, size.height, CornerRadius(30f))
-                        val shapePath = Path().apply {
-                            addRoundRect(roundRect)
-                        }
+                        val shapePath = Path().apply { addRoundRect(roundRect) }
                         return Outline.Generic(shapePath)
                     }
                 }
             }
             Box(
-                modifier = Modifier
-                    .height(205.dp)
-                    .maskClip(pathShape)
-                    .maskBorder(BorderStroke(5.dp, Color.Red), pathShape),
+                modifier =
+                    Modifier.height(205.dp)
+                        .maskClip(pathShape)
+                        .maskBorder(BorderStroke(5.dp, Color.Red), pathShape),
             ) {
                 Image(
                     painter = painterResource(id = item.imageResId),
@@ -237,20 +229,23 @@
                 ElevatedAssistChip(
                     onClick = { /* Do something! */ },
                     label = { Text("Image $i") },
-                    modifier = Modifier.graphicsLayer {
-                        // Fade the chip in once the carousel item's size is large enough to
-                        // display the entire chip
-                        alpha = lerp(
-                            0f,
-                            1f,
-                            max(
-                                size.width - (carouselItemInfo.maxSize) + carouselItemInfo.size,
-                                0f
-                            ) / size.width
-                        )
-                        // Translate the chip to be pinned to the left side of the item's mask
-                        translationX = carouselItemInfo.maskRect.left + 8.dp.toPx()
-                    },
+                    modifier =
+                        Modifier.graphicsLayer {
+                            // Fade the chip in once the carousel item's size is large enough to
+                            // display the entire chip
+                            alpha =
+                                lerp(
+                                    0f,
+                                    1f,
+                                    max(
+                                        size.width - (carouselItemInfo.maxSize) +
+                                            carouselItemInfo.size,
+                                        0f
+                                    ) / size.width
+                                )
+                            // Translate the chip to be pinned to the left side of the item's mask
+                            translationX = carouselItemInfo.maskRect.left + 8.dp.toPx()
+                        },
                     leadingIcon = {
                         Icon(
                             Icons.Filled.Image,
diff --git a/compose/material3/material3/samples/src/main/java/androidx/compose/material3/samples/CheckboxSamples.kt b/compose/material3/material3/samples/src/main/java/androidx/compose/material3/samples/CheckboxSamples.kt
index 2240362..c15860d 100644
--- a/compose/material3/material3/samples/src/main/java/androidx/compose/material3/samples/CheckboxSamples.kt
+++ b/compose/material3/material3/samples/src/main/java/androidx/compose/material3/samples/CheckboxSamples.kt
@@ -45,10 +45,7 @@
 @Composable
 fun CheckboxSample() {
     val checkedState = remember { mutableStateOf(true) }
-    Checkbox(
-        checked = checkedState.value,
-        onCheckedChange = { checkedState.value = it }
-    )
+    Checkbox(checked = checkedState.value, onCheckedChange = { checkedState.value = it })
 }
 
 @Preview
@@ -57,8 +54,7 @@
 fun CheckboxWithTextSample() {
     val (checkedState, onStateChange) = remember { mutableStateOf(true) }
     Row(
-        Modifier
-            .fillMaxWidth()
+        Modifier.fillMaxWidth()
             .height(56.dp)
             .toggleable(
                 value = checkedState,
@@ -90,11 +86,11 @@
         val (state2, onStateChange2) = remember { mutableStateOf(true) }
 
         // TriStateCheckbox state reflects state of dependent checkboxes
-        val parentState = remember(state, state2) {
-            if (state && state2) ToggleableState.On
-            else if (!state && !state2) ToggleableState.Off
-            else ToggleableState.Indeterminate
-        }
+        val parentState =
+            remember(state, state2) {
+                if (state && state2) ToggleableState.On
+                else if (!state && !state2) ToggleableState.Off else ToggleableState.Indeterminate
+            }
         // click on TriStateCheckbox can set state for dependent checkboxes
         val onParentClick = {
             val s = parentState != ToggleableState.On
@@ -107,11 +103,12 @@
         // accessible.
         Row(
             verticalAlignment = Alignment.CenterVertically,
-            modifier = Modifier.triStateToggleable(
-                state = parentState,
-                onClick = onParentClick,
-                role = Role.Checkbox
-            )
+            modifier =
+                Modifier.triStateToggleable(
+                    state = parentState,
+                    onClick = onParentClick,
+                    role = Role.Checkbox
+                )
         ) {
             TriStateCheckbox(
                 state = parentState,
@@ -123,11 +120,12 @@
         Column(Modifier.padding(24.dp, 0.dp, 0.dp, 0.dp)) {
             Row(
                 verticalAlignment = Alignment.CenterVertically,
-                modifier = Modifier.toggleable(
-                    value = state,
-                    onValueChange = onStateChange,
-                    role = Role.Checkbox
-                )
+                modifier =
+                    Modifier.toggleable(
+                        value = state,
+                        onValueChange = onStateChange,
+                        role = Role.Checkbox
+                    )
             ) {
                 Checkbox(state, null)
                 Text("Daily")
@@ -135,11 +133,12 @@
             Spacer(Modifier.size(25.dp))
             Row(
                 verticalAlignment = Alignment.CenterVertically,
-                modifier = Modifier.toggleable(
-                    value = state2,
-                    onValueChange = onStateChange2,
-                    role = Role.Checkbox
-                )
+                modifier =
+                    Modifier.toggleable(
+                        value = state2,
+                        onValueChange = onStateChange2,
+                        role = Role.Checkbox
+                    )
             ) {
                 Checkbox(state2, null)
                 Text("Weekly")
diff --git a/compose/material3/material3/samples/src/main/java/androidx/compose/material3/samples/ChipSamples.kt b/compose/material3/material3/samples/src/main/java/androidx/compose/material3/samples/ChipSamples.kt
index b26c472..869c6ae 100644
--- a/compose/material3/material3/samples/src/main/java/androidx/compose/material3/samples/ChipSamples.kt
+++ b/compose/material3/material3/samples/src/main/java/androidx/compose/material3/samples/ChipSamples.kt
@@ -99,17 +99,18 @@
         selected = selected,
         onClick = { selected = !selected },
         label = { Text("Filter chip") },
-        leadingIcon = if (selected) {
-            {
-                Icon(
-                    imageVector = Icons.Filled.Done,
-                    contentDescription = "Localized Description",
-                    modifier = Modifier.size(FilterChipDefaults.IconSize)
-                )
+        leadingIcon =
+            if (selected) {
+                {
+                    Icon(
+                        imageVector = Icons.Filled.Done,
+                        contentDescription = "Localized Description",
+                        modifier = Modifier.size(FilterChipDefaults.IconSize)
+                    )
+                }
+            } else {
+                null
             }
-        } else {
-            null
-        }
     )
 }
 
@@ -122,17 +123,18 @@
         selected = selected,
         onClick = { selected = !selected },
         label = { Text("Filter chip") },
-        leadingIcon = if (selected) {
-            {
-                Icon(
-                    imageVector = Icons.Filled.Done,
-                    contentDescription = "Localized Description",
-                    modifier = Modifier.size(FilterChipDefaults.IconSize)
-                )
+        leadingIcon =
+            if (selected) {
+                {
+                    Icon(
+                        imageVector = Icons.Filled.Done,
+                        contentDescription = "Localized Description",
+                        modifier = Modifier.size(FilterChipDefaults.IconSize)
+                    )
+                }
+            } else {
+                null
             }
-        } else {
-            null
-        }
     )
 }
 
@@ -145,23 +147,24 @@
         selected = selected,
         onClick = { selected = !selected },
         label = { Text("Filter chip") },
-        leadingIcon = if (selected) {
-            {
-                Icon(
-                    imageVector = Icons.Filled.Done,
-                    contentDescription = "Localized Description",
-                    modifier = Modifier.size(FilterChipDefaults.IconSize)
-                )
+        leadingIcon =
+            if (selected) {
+                {
+                    Icon(
+                        imageVector = Icons.Filled.Done,
+                        contentDescription = "Localized Description",
+                        modifier = Modifier.size(FilterChipDefaults.IconSize)
+                    )
+                }
+            } else {
+                {
+                    Icon(
+                        imageVector = Icons.Filled.Home,
+                        contentDescription = "Localized description",
+                        modifier = Modifier.size(FilterChipDefaults.IconSize)
+                    )
+                }
             }
-        } else {
-            {
-                Icon(
-                    imageVector = Icons.Filled.Home,
-                    contentDescription = "Localized description",
-                    modifier = Modifier.size(FilterChipDefaults.IconSize)
-                )
-            }
-        }
     )
 }
 
@@ -200,20 +203,14 @@
 @Sampled
 @Composable
 fun SuggestionChipSample() {
-    SuggestionChip(
-        onClick = { /* Do something! */ },
-        label = { Text("Suggestion Chip") }
-    )
+    SuggestionChip(onClick = { /* Do something! */ }, label = { Text("Suggestion Chip") })
 }
 
 @Preview
 @Sampled
 @Composable
 fun ElevatedSuggestionChipSample() {
-    ElevatedSuggestionChip(
-        onClick = { /* Do something! */ },
-        label = { Text("Suggestion Chip") }
-    )
+    ElevatedSuggestionChip(onClick = { /* Do something! */ }, label = { Text("Suggestion Chip") })
 }
 
 @Preview
@@ -238,22 +235,29 @@
 @Sampled
 @Composable
 fun ChipGroupReflowSample() {
-    val colorNames = listOf(
-        "Blue", "Yellow", "Red", "Orange", "Black", "Green",
-        "White", "Magenta", "Gray", "Transparent"
-    )
+    val colorNames =
+        listOf(
+            "Blue",
+            "Yellow",
+            "Red",
+            "Orange",
+            "Black",
+            "Green",
+            "White",
+            "Magenta",
+            "Gray",
+            "Transparent"
+        )
     Column {
         FlowRow(
-            Modifier
-                .fillMaxWidth(1f)
-                .wrapContentHeight(align = Alignment.Top),
+            Modifier.fillMaxWidth(1f).wrapContentHeight(align = Alignment.Top),
             horizontalArrangement = Arrangement.Start,
         ) {
             colorNames.fastForEachIndexed { index, element ->
                 AssistChip(
-                    modifier = Modifier
-                        .padding(horizontal = 4.dp)
-                        .align(alignment = Alignment.CenterVertically),
+                    modifier =
+                        Modifier.padding(horizontal = 4.dp)
+                            .align(alignment = Alignment.CenterVertically),
                     onClick = { /* do something*/ },
                     label = { Text("$element $index") }
                 )
diff --git a/compose/material3/material3/samples/src/main/java/androidx/compose/material3/samples/ColorSchemeSamples.kt b/compose/material3/material3/samples/src/main/java/androidx/compose/material3/samples/ColorSchemeSamples.kt
index 74d5a88..a8edad8 100644
--- a/compose/material3/material3/samples/src/main/java/androidx/compose/material3/samples/ColorSchemeSamples.kt
+++ b/compose/material3/material3/samples/src/main/java/androidx/compose/material3/samples/ColorSchemeSamples.kt
@@ -42,17 +42,18 @@
     )
     val material3LightColors = lightColorScheme()
     val material3DarkColors = darkColorScheme()
-    fun getFixedAccentColors() = FixedAccentColors(
-        primaryFixed = material3LightColors.primaryContainer,
-        onPrimaryFixed = material3LightColors.onPrimaryContainer,
-        secondaryFixed = material3LightColors.secondaryContainer,
-        onSecondaryFixed = material3LightColors.onSecondaryContainer,
-        tertiaryFixed = material3LightColors.tertiaryContainer,
-        onTertiaryFixed = material3LightColors.onTertiaryContainer,
-        primaryFixedDim = material3DarkColors.primary,
-        secondaryFixedDim = material3DarkColors.secondary,
-        tertiaryFixedDim = material3DarkColors.tertiary
-    )
+    fun getFixedAccentColors() =
+        FixedAccentColors(
+            primaryFixed = material3LightColors.primaryContainer,
+            onPrimaryFixed = material3LightColors.onPrimaryContainer,
+            secondaryFixed = material3LightColors.secondaryContainer,
+            onSecondaryFixed = material3LightColors.onSecondaryContainer,
+            tertiaryFixed = material3LightColors.tertiaryContainer,
+            onTertiaryFixed = material3LightColors.onTertiaryContainer,
+            primaryFixedDim = material3DarkColors.primary,
+            secondaryFixedDim = material3DarkColors.secondary,
+            tertiaryFixedDim = material3DarkColors.tertiary
+        )
     val LocalFixedAccentColors = compositionLocalOf { getFixedAccentColors() }
 
     @Composable
diff --git a/compose/material3/material3/samples/src/main/java/androidx/compose/material3/samples/DatePickerSamples.kt b/compose/material3/material3/samples/src/main/java/androidx/compose/material3/samples/DatePickerSamples.kt
index 05c71ce..6873a7b 100644
--- a/compose/material3/material3/samples/src/main/java/androidx/compose/material3/samples/DatePickerSamples.kt
+++ b/compose/material3/material3/samples/src/main/java/androidx/compose/material3/samples/DatePickerSamples.kt
@@ -114,13 +114,7 @@
                 }
             },
             dismissButton = {
-                TextButton(
-                    onClick = {
-                        openDialog.value = false
-                    }
-                ) {
-                    Text("Cancel")
-                }
+                TextButton(onClick = { openDialog.value = false }) { Text("Cancel") }
             }
         ) {
             DatePicker(state = datePickerState)
@@ -134,28 +128,33 @@
 @Sampled
 @Composable
 fun DatePickerWithDateSelectableDatesSample() {
-    val datePickerState = rememberDatePickerState(
-        selectableDates = object : SelectableDates {
-            // Blocks Sunday and Saturday from being selected.
-            override fun isSelectableDate(utcTimeMillis: Long): Boolean {
-                return if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
-                    val dayOfWeek = Instant.ofEpochMilli(utcTimeMillis).atZone(ZoneId.of("UTC"))
-                        .toLocalDate().dayOfWeek
-                    dayOfWeek != DayOfWeek.SUNDAY && dayOfWeek != DayOfWeek.SATURDAY
-                } else {
-                    val calendar = Calendar.getInstance(TimeZone.getTimeZone("UTC"))
-                    calendar.timeInMillis = utcTimeMillis
-                    calendar[Calendar.DAY_OF_WEEK] != Calendar.SUNDAY &&
-                        calendar[Calendar.DAY_OF_WEEK] != Calendar.SATURDAY
-                }
-            }
+    val datePickerState =
+        rememberDatePickerState(
+            selectableDates =
+                object : SelectableDates {
+                    // Blocks Sunday and Saturday from being selected.
+                    override fun isSelectableDate(utcTimeMillis: Long): Boolean {
+                        return if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
+                            val dayOfWeek =
+                                Instant.ofEpochMilli(utcTimeMillis)
+                                    .atZone(ZoneId.of("UTC"))
+                                    .toLocalDate()
+                                    .dayOfWeek
+                            dayOfWeek != DayOfWeek.SUNDAY && dayOfWeek != DayOfWeek.SATURDAY
+                        } else {
+                            val calendar = Calendar.getInstance(TimeZone.getTimeZone("UTC"))
+                            calendar.timeInMillis = utcTimeMillis
+                            calendar[Calendar.DAY_OF_WEEK] != Calendar.SUNDAY &&
+                                calendar[Calendar.DAY_OF_WEEK] != Calendar.SATURDAY
+                        }
+                    }
 
-            // Allow selecting dates from year 2023 forward.
-            override fun isSelectableYear(year: Int): Boolean {
-                return year > 2022
-            }
-        }
-    )
+                    // Allow selecting dates from year 2023 forward.
+                    override fun isSelectableYear(year: Int): Boolean {
+                        return year > 2022
+                    }
+                }
+        )
 
     Column(verticalArrangement = Arrangement.spacedBy(8.dp)) {
         DatePicker(state = datePickerState)
@@ -196,10 +195,10 @@
     Column(modifier = Modifier.fillMaxSize(), verticalArrangement = Arrangement.Top) {
         // Add a row with "Save" and dismiss actions.
         Row(
-            modifier = Modifier
-                .fillMaxWidth()
-                .background(DatePickerDefaults.colors().containerColor)
-                .padding(start = 12.dp, end = 12.dp),
+            modifier =
+                Modifier.fillMaxWidth()
+                    .background(DatePickerDefaults.colors().containerColor)
+                    .padding(start = 12.dp, end = 12.dp),
             verticalAlignment = Alignment.CenterVertically,
             horizontalArrangement = Arrangement.SpaceBetween
         ) {
@@ -209,8 +208,7 @@
             TextButton(
                 onClick = {
                     snackScope.launch {
-                        val range =
-                            state.selectedStartDateMillis!!..state.selectedEndDateMillis!!
+                        val range = state.selectedStartDateMillis!!..state.selectedEndDateMillis!!
                         snackState.showSnackbar("Saved range (timestamps): $range")
                     }
                 },
diff --git a/compose/material3/material3/samples/src/main/java/androidx/compose/material3/samples/DrawerSamples.kt b/compose/material3/material3/samples/src/main/java/androidx/compose/material3/samples/DrawerSamples.kt
index 8d8df43..72e9173 100644
--- a/compose/material3/material3/samples/src/main/java/androidx/compose/material3/samples/DrawerSamples.kt
+++ b/compose/material3/material3/samples/src/main/java/androidx/compose/material3/samples/DrawerSamples.kt
@@ -74,26 +74,27 @@
     val drawerState = rememberDrawerState(DrawerValue.Closed)
     val scope = rememberCoroutineScope()
     // icons to mimic drawer destinations
-    val items = listOf(
-        Icons.Default.AccountCircle,
-        Icons.Default.Bookmarks,
-        Icons.Default.CalendarMonth,
-        Icons.Default.Dashboard,
-        Icons.Default.Email,
-        Icons.Default.Favorite,
-        Icons.Default.Group,
-        Icons.Default.Headphones,
-        Icons.Default.Image,
-        Icons.Default.JoinFull,
-        Icons.Default.Keyboard,
-        Icons.Default.Laptop,
-        Icons.Default.Map,
-        Icons.Default.Navigation,
-        Icons.Default.Outbox,
-        Icons.Default.PushPin,
-        Icons.Default.QrCode,
-        Icons.Default.Radio,
-    )
+    val items =
+        listOf(
+            Icons.Default.AccountCircle,
+            Icons.Default.Bookmarks,
+            Icons.Default.CalendarMonth,
+            Icons.Default.Dashboard,
+            Icons.Default.Email,
+            Icons.Default.Favorite,
+            Icons.Default.Group,
+            Icons.Default.Headphones,
+            Icons.Default.Image,
+            Icons.Default.JoinFull,
+            Icons.Default.Keyboard,
+            Icons.Default.Laptop,
+            Icons.Default.Map,
+            Icons.Default.Navigation,
+            Icons.Default.Outbox,
+            Icons.Default.PushPin,
+            Icons.Default.QrCode,
+            Icons.Default.Radio,
+        )
     val selectedItem = remember { mutableStateOf(items[0]) }
     ModalNavigationDrawer(
         drawerState = drawerState,
@@ -118,16 +119,12 @@
         },
         content = {
             Column(
-                modifier = Modifier
-                    .fillMaxSize()
-                    .padding(16.dp),
+                modifier = Modifier.fillMaxSize().padding(16.dp),
                 horizontalAlignment = Alignment.CenterHorizontally
             ) {
                 Text(text = if (drawerState.isClosed) ">>> Swipe >>>" else "<<< Swipe <<<")
                 Spacer(Modifier.height(20.dp))
-                Button(onClick = { scope.launch { drawerState.open() } }) {
-                    Text("Click to open")
-                }
+                Button(onClick = { scope.launch { drawerState.open() } }) { Text("Click to open") }
             }
         }
     )
@@ -138,26 +135,27 @@
 @Composable
 fun PermanentNavigationDrawerSample() {
     // icons to mimic drawer destinations
-    val items = listOf(
-        Icons.Default.AccountCircle,
-        Icons.Default.Bookmarks,
-        Icons.Default.CalendarMonth,
-        Icons.Default.Dashboard,
-        Icons.Default.Email,
-        Icons.Default.Favorite,
-        Icons.Default.Group,
-        Icons.Default.Headphones,
-        Icons.Default.Image,
-        Icons.Default.JoinFull,
-        Icons.Default.Keyboard,
-        Icons.Default.Laptop,
-        Icons.Default.Map,
-        Icons.Default.Navigation,
-        Icons.Default.Outbox,
-        Icons.Default.PushPin,
-        Icons.Default.QrCode,
-        Icons.Default.Radio,
-    )
+    val items =
+        listOf(
+            Icons.Default.AccountCircle,
+            Icons.Default.Bookmarks,
+            Icons.Default.CalendarMonth,
+            Icons.Default.Dashboard,
+            Icons.Default.Email,
+            Icons.Default.Favorite,
+            Icons.Default.Group,
+            Icons.Default.Headphones,
+            Icons.Default.Image,
+            Icons.Default.JoinFull,
+            Icons.Default.Keyboard,
+            Icons.Default.Laptop,
+            Icons.Default.Map,
+            Icons.Default.Navigation,
+            Icons.Default.Outbox,
+            Icons.Default.PushPin,
+            Icons.Default.QrCode,
+            Icons.Default.Radio,
+        )
     val selectedItem = remember { mutableStateOf(items[0]) }
     PermanentNavigationDrawer(
         drawerContent = {
@@ -169,9 +167,7 @@
                             icon = { Icon(item, contentDescription = null) },
                             label = { Text(item.name.substringAfterLast(".")) },
                             selected = item == selectedItem.value,
-                            onClick = {
-                                selectedItem.value = item
-                            },
+                            onClick = { selectedItem.value = item },
                             modifier = Modifier.padding(horizontal = 12.dp)
                         )
                     }
@@ -180,9 +176,7 @@
         },
         content = {
             Column(
-                modifier = Modifier
-                    .fillMaxSize()
-                    .padding(16.dp),
+                modifier = Modifier.fillMaxSize().padding(16.dp),
                 horizontalAlignment = Alignment.CenterHorizontally
             ) {
                 Text(text = "Application content")
@@ -198,26 +192,27 @@
     val drawerState = rememberDrawerState(DrawerValue.Closed)
     val scope = rememberCoroutineScope()
     // icons to mimic drawer destinations
-    val items = listOf(
-        Icons.Default.AccountCircle,
-        Icons.Default.Bookmarks,
-        Icons.Default.CalendarMonth,
-        Icons.Default.Dashboard,
-        Icons.Default.Email,
-        Icons.Default.Favorite,
-        Icons.Default.Group,
-        Icons.Default.Headphones,
-        Icons.Default.Image,
-        Icons.Default.JoinFull,
-        Icons.Default.Keyboard,
-        Icons.Default.Laptop,
-        Icons.Default.Map,
-        Icons.Default.Navigation,
-        Icons.Default.Outbox,
-        Icons.Default.PushPin,
-        Icons.Default.QrCode,
-        Icons.Default.Radio,
-    )
+    val items =
+        listOf(
+            Icons.Default.AccountCircle,
+            Icons.Default.Bookmarks,
+            Icons.Default.CalendarMonth,
+            Icons.Default.Dashboard,
+            Icons.Default.Email,
+            Icons.Default.Favorite,
+            Icons.Default.Group,
+            Icons.Default.Headphones,
+            Icons.Default.Image,
+            Icons.Default.JoinFull,
+            Icons.Default.Keyboard,
+            Icons.Default.Laptop,
+            Icons.Default.Map,
+            Icons.Default.Navigation,
+            Icons.Default.Outbox,
+            Icons.Default.PushPin,
+            Icons.Default.QrCode,
+            Icons.Default.Radio,
+        )
     val selectedItem = remember { mutableStateOf(items[0]) }
 
     DismissibleNavigationDrawer(
@@ -243,16 +238,12 @@
         },
         content = {
             Column(
-                modifier = Modifier
-                    .fillMaxSize()
-                    .padding(16.dp),
+                modifier = Modifier.fillMaxSize().padding(16.dp),
                 horizontalAlignment = Alignment.CenterHorizontally
             ) {
                 Text(text = if (drawerState.isClosed) ">>> Swipe >>>" else "<<< Swipe <<<")
                 Spacer(Modifier.height(20.dp))
-                Button(onClick = { scope.launch { drawerState.open() } }) {
-                    Text("Click to open")
-                }
+                Button(onClick = { scope.launch { drawerState.open() } }) { Text("Click to open") }
             }
         }
     )
diff --git a/compose/material3/material3/samples/src/main/java/androidx/compose/material3/samples/ExposedDropdownMenuSamples.kt b/compose/material3/material3/samples/src/main/java/androidx/compose/material3/samples/ExposedDropdownMenuSamples.kt
index eeff249..ce0814a08 100644
--- a/compose/material3/material3/samples/src/main/java/androidx/compose/material3/samples/ExposedDropdownMenuSamples.kt
+++ b/compose/material3/material3/samples/src/main/java/androidx/compose/material3/samples/ExposedDropdownMenuSamples.kt
@@ -132,10 +132,11 @@
                 DropdownMenuItem(
                     text = { Text(option, style = MaterialTheme.typography.bodyLarge) },
                     onClick = {
-                        text = TextFieldValue(
-                            text = option.text,
-                            selection = TextRange(option.text.length),
-                        )
+                        text =
+                            TextFieldValue(
+                                text = option.text,
+                                selection = TextRange(option.text.length),
+                            )
                         setExpanded(false)
                     },
                     contentPadding = ExposedDropdownMenuDefaults.ItemContentPadding,
@@ -146,8 +147,8 @@
 }
 
 /**
- * Returns the element of [this] list that contain [text] as a subsequence,
- * with the subsequence underlined as an [AnnotatedString].
+ * Returns the element of [this] list that contain [text] as a subsequence, with the subsequence
+ * underlined as an [AnnotatedString].
  */
 private fun List<String>.filteredBy(text: String): List<AnnotatedString> {
     fun underlineSubsequence(needle: String, haystack: String): AnnotatedString? {
@@ -156,8 +157,7 @@
             for (char in needle) {
                 val start = i
                 haystack.indexOf(char, startIndex = i, ignoreCase = true).let {
-                    if (it < 0) return null
-                    else i = it
+                    if (it < 0) return null else i = it
                 }
                 append(haystack.substring(start, i))
                 withStyle(SpanStyle(textDecoration = TextDecoration.Underline)) {
diff --git a/compose/material3/material3/samples/src/main/java/androidx/compose/material3/samples/FloatingActionButtonSamples.kt b/compose/material3/material3/samples/src/main/java/androidx/compose/material3/samples/FloatingActionButtonSamples.kt
index efa61b3..0c75f2f 100644
--- a/compose/material3/material3/samples/src/main/java/androidx/compose/material3/samples/FloatingActionButtonSamples.kt
+++ b/compose/material3/material3/samples/src/main/java/androidx/compose/material3/samples/FloatingActionButtonSamples.kt
@@ -82,9 +82,7 @@
 @Sampled
 @Composable
 fun ExtendedFloatingActionButtonTextSample() {
-    ExtendedFloatingActionButton(onClick = { /* do something */ }) {
-        Text(text = "Extended FAB")
-    }
+    ExtendedFloatingActionButton(onClick = { /* do something */ }) { Text(text = "Extended FAB") }
 }
 
 @Preview
@@ -105,11 +103,7 @@
     val listState = rememberLazyListState()
     // The FAB is initially expanded. Once the first visible item is past the first item we
     // collapse the FAB. We use a remembered derived state to minimize unnecessary compositions.
-    val expandedFab by remember {
-        derivedStateOf {
-            listState.firstVisibleItemIndex == 0
-        }
-    }
+    val expandedFab by remember { derivedStateOf { listState.firstVisibleItemIndex == 0 } }
     Scaffold(
         floatingActionButton = {
             ExtendedFloatingActionButton(
@@ -124,12 +118,7 @@
     ) {
         LazyColumn(state = listState, modifier = Modifier.fillMaxSize()) {
             for (index in 0 until 100) {
-                item {
-                    Text(
-                        text = "List item - $index",
-                        modifier = Modifier.padding(24.dp)
-                    )
-                }
+                item { Text(text = "List item - $index", modifier = Modifier.padding(24.dp)) }
             }
         }
     }
diff --git a/compose/material3/material3/samples/src/main/java/androidx/compose/material3/samples/IconButtonSamples.kt b/compose/material3/material3/samples/src/main/java/androidx/compose/material3/samples/IconButtonSamples.kt
index be0ef90..fe4772d 100644
--- a/compose/material3/material3/samples/src/main/java/androidx/compose/material3/samples/IconButtonSamples.kt
+++ b/compose/material3/material3/samples/src/main/java/androidx/compose/material3/samples/IconButtonSamples.kt
@@ -57,7 +57,8 @@
         Icon(
             rememberVectorPainter(image = Icons.Outlined.Lock),
             contentDescription = "Localized description",
-            tint = { Color.Red })
+            tint = { Color.Red }
+        )
     }
 }
 
diff --git a/compose/material3/material3/samples/src/main/java/androidx/compose/material3/samples/MenuSamples.kt b/compose/material3/material3/samples/src/main/java/androidx/compose/material3/samples/MenuSamples.kt
index b0492ad..5fff840 100644
--- a/compose/material3/material3/samples/src/main/java/androidx/compose/material3/samples/MenuSamples.kt
+++ b/compose/material3/material3/samples/src/main/java/androidx/compose/material3/samples/MenuSamples.kt
@@ -49,47 +49,28 @@
 fun MenuSample() {
     var expanded by remember { mutableStateOf(false) }
 
-    Box(
-        modifier = Modifier
-            .fillMaxSize()
-            .wrapContentSize(Alignment.TopStart)
-    ) {
+    Box(modifier = Modifier.fillMaxSize().wrapContentSize(Alignment.TopStart)) {
         IconButton(onClick = { expanded = true }) {
             Icon(Icons.Default.MoreVert, contentDescription = "Localized description")
         }
-        DropdownMenu(
-            expanded = expanded,
-            onDismissRequest = { expanded = false }
-        ) {
+        DropdownMenu(expanded = expanded, onDismissRequest = { expanded = false }) {
             DropdownMenuItem(
                 text = { Text("Edit") },
                 onClick = { /* Handle edit! */ },
-                leadingIcon = {
-                    Icon(
-                        Icons.Outlined.Edit,
-                        contentDescription = null
-                    )
-                })
+                leadingIcon = { Icon(Icons.Outlined.Edit, contentDescription = null) }
+            )
             DropdownMenuItem(
                 text = { Text("Settings") },
                 onClick = { /* Handle settings! */ },
-                leadingIcon = {
-                    Icon(
-                        Icons.Outlined.Settings,
-                        contentDescription = null
-                    )
-                })
+                leadingIcon = { Icon(Icons.Outlined.Settings, contentDescription = null) }
+            )
             HorizontalDivider()
             DropdownMenuItem(
                 text = { Text("Send Feedback") },
                 onClick = { /* Handle send feedback! */ },
-                leadingIcon = {
-                    Icon(
-                        Icons.Outlined.Email,
-                        contentDescription = null
-                    )
-                },
-                trailingIcon = { Text("F11", textAlign = TextAlign.Center) })
+                leadingIcon = { Icon(Icons.Outlined.Email, contentDescription = null) },
+                trailingIcon = { Text("F11", textAlign = TextAlign.Center) }
+            )
         }
     }
 }
@@ -100,11 +81,7 @@
 fun MenuWithScrollStateSample() {
     var expanded by remember { mutableStateOf(false) }
     val scrollState = rememberScrollState()
-    Box(
-        modifier = Modifier
-            .fillMaxSize()
-            .wrapContentSize(Alignment.TopStart)
-    ) {
+    Box(modifier = Modifier.fillMaxSize().wrapContentSize(Alignment.TopStart)) {
         IconButton(onClick = { expanded = true }) {
             Icon(Icons.Default.MoreVert, contentDescription = "Localized description")
         }
@@ -117,12 +94,8 @@
                 DropdownMenuItem(
                     text = { Text("Item ${it + 1}") },
                     onClick = { /* TODO */ },
-                    leadingIcon = {
-                        Icon(
-                            Icons.Outlined.Edit,
-                            contentDescription = null
-                        )
-                    })
+                    leadingIcon = { Icon(Icons.Outlined.Edit, contentDescription = null) }
+                )
             }
         }
         LaunchedEffect(expanded) {
diff --git a/compose/material3/material3/samples/src/main/java/androidx/compose/material3/samples/ProgressIndicatorSamples.kt b/compose/material3/material3/samples/src/main/java/androidx/compose/material3/samples/ProgressIndicatorSamples.kt
index 8e2c00b..346cb64 100644
--- a/compose/material3/material3/samples/src/main/java/androidx/compose/material3/samples/ProgressIndicatorSamples.kt
+++ b/compose/material3/material3/samples/src/main/java/androidx/compose/material3/samples/ProgressIndicatorSamples.kt
@@ -45,10 +45,11 @@
 @Composable
 fun LinearProgressIndicatorSample() {
     var progress by remember { mutableStateOf(0.1f) }
-    val animatedProgress by animateFloatAsState(
-        targetValue = progress,
-        animationSpec = ProgressIndicatorDefaults.ProgressAnimationSpec
-    )
+    val animatedProgress by
+        animateFloatAsState(
+            targetValue = progress,
+            animationSpec = ProgressIndicatorDefaults.ProgressAnimationSpec
+        )
 
     Column(horizontalAlignment = Alignment.CenterHorizontally) {
         LinearProgressIndicator(
@@ -69,10 +70,11 @@
 @Composable
 fun LegacyLinearProgressIndicatorSample() {
     var progress by remember { mutableStateOf(0.1f) }
-    val animatedProgress by animateFloatAsState(
-        targetValue = progress,
-        animationSpec = ProgressIndicatorDefaults.ProgressAnimationSpec
-    )
+    val animatedProgress by
+        animateFloatAsState(
+            targetValue = progress,
+            animationSpec = ProgressIndicatorDefaults.ProgressAnimationSpec
+        )
 
     Column(horizontalAlignment = Alignment.CenterHorizontally) {
         LinearProgressIndicator(
@@ -97,9 +99,7 @@
 @Sampled
 @Composable
 fun IndeterminateLinearProgressIndicatorSample() {
-    Column(horizontalAlignment = Alignment.CenterHorizontally) {
-        LinearProgressIndicator()
-    }
+    Column(horizontalAlignment = Alignment.CenterHorizontally) { LinearProgressIndicator() }
 }
 
 @Preview
@@ -119,10 +119,11 @@
 @Composable
 fun CircularProgressIndicatorSample() {
     var progress by remember { mutableStateOf(0.1f) }
-    val animatedProgress by animateFloatAsState(
-        targetValue = progress,
-        animationSpec = ProgressIndicatorDefaults.ProgressAnimationSpec
-    )
+    val animatedProgress by
+        animateFloatAsState(
+            targetValue = progress,
+            animationSpec = ProgressIndicatorDefaults.ProgressAnimationSpec
+        )
 
     Column(horizontalAlignment = Alignment.CenterHorizontally) {
         CircularProgressIndicator(progress = { animatedProgress })
@@ -141,10 +142,11 @@
 @Composable
 fun LegacyCircularProgressIndicatorSample() {
     var progress by remember { mutableStateOf(0.1f) }
-    val animatedProgress by animateFloatAsState(
-        targetValue = progress,
-        animationSpec = ProgressIndicatorDefaults.ProgressAnimationSpec
-    )
+    val animatedProgress by
+        animateFloatAsState(
+            targetValue = progress,
+            animationSpec = ProgressIndicatorDefaults.ProgressAnimationSpec
+        )
 
     Column(horizontalAlignment = Alignment.CenterHorizontally) {
         CircularProgressIndicator(
@@ -168,17 +170,13 @@
 @Sampled
 @Composable
 fun IndeterminateCircularProgressIndicatorSample() {
-    Column(horizontalAlignment = Alignment.CenterHorizontally) {
-        CircularProgressIndicator()
-    }
+    Column(horizontalAlignment = Alignment.CenterHorizontally) { CircularProgressIndicator() }
 }
 
 @Preview
 @Composable
 fun LegacyIndeterminateCircularProgressIndicatorSample() {
     Column(horizontalAlignment = Alignment.CenterHorizontally) {
-        CircularProgressIndicator(
-            strokeCap = StrokeCap.Butt
-        )
+        CircularProgressIndicator(strokeCap = StrokeCap.Butt)
     }
 }
diff --git a/compose/material3/material3/samples/src/main/java/androidx/compose/material3/samples/PullToRefreshSamples.kt b/compose/material3/material3/samples/src/main/java/androidx/compose/material3/samples/PullToRefreshSamples.kt
index 12d8f9a..7e7f9dc 100644
--- a/compose/material3/material3/samples/src/main/java/androidx/compose/material3/samples/PullToRefreshSamples.kt
+++ b/compose/material3/material3/samples/src/main/java/androidx/compose/material3/samples/PullToRefreshSamples.kt
@@ -97,9 +97,7 @@
             onRefresh = onRefresh,
         ) {
             LazyColumn(Modifier.fillMaxSize()) {
-                items(itemCount) {
-                    ListItem({ Text(text = "Item ${itemCount - it}") })
-                }
+                items(itemCount) { ListItem({ Text(text = "Item ${itemCount - it}") }) }
             }
         }
     }
@@ -147,7 +145,8 @@
                 actions = {
                     IconButton(
                         enabled = !viewModel.isRefreshing,
-                        onClick = { viewModel.refresh() }) {
+                        onClick = { viewModel.refresh() }
+                    ) {
                         Icon(Icons.Filled.Refresh, "Trigger Refresh")
                     }
                 }
@@ -190,16 +189,17 @@
     }
 
     val scaleFraction = {
-        if (isRefreshing) 1f else
-            LinearOutSlowInEasing.transform(state.distanceFraction).coerceIn(0f, 1f)
+        if (isRefreshing) 1f
+        else LinearOutSlowInEasing.transform(state.distanceFraction).coerceIn(0f, 1f)
     }
 
     Scaffold(
-        modifier = Modifier.pullToRefresh(
-            state = state,
-            isRefreshing = isRefreshing,
-            onRefresh = onRefresh
-        ),
+        modifier =
+            Modifier.pullToRefresh(
+                state = state,
+                isRefreshing = isRefreshing,
+                onRefresh = onRefresh
+            ),
         topBar = {
             TopAppBar(
                 title = { Text("TopAppBar") },
@@ -215,18 +215,14 @@
         Box(Modifier.padding(it)) {
             LazyColumn(Modifier.fillMaxSize()) {
                 if (!isRefreshing) {
-                    items(itemCount) {
-                        ListItem({ Text(text = "Item ${itemCount - it}") })
-                    }
+                    items(itemCount) { ListItem({ Text(text = "Item ${itemCount - it}") }) }
                 }
             }
             Box(
-                Modifier
-                    .align(Alignment.TopCenter)
-                    .graphicsLayer {
-                        scaleX = scaleFraction()
-                        scaleY = scaleFraction()
-                    }
+                Modifier.align(Alignment.TopCenter).graphicsLayer {
+                    scaleX = scaleFraction()
+                    scaleY = scaleFraction()
+                }
             ) {
                 PullToRefreshDefaults.Indicator(state = state, isRefreshing = isRefreshing)
             }
@@ -254,11 +250,12 @@
     }
 
     Scaffold(
-        modifier = Modifier.pullToRefresh(
-            state = state,
-            isRefreshing = isRefreshing,
-            onRefresh = onRefresh
-        ),
+        modifier =
+            Modifier.pullToRefresh(
+                state = state,
+                isRefreshing = isRefreshing,
+                onRefresh = onRefresh
+            ),
         topBar = {
             TopAppBar(
                 title = { Text("TopAppBar") },
@@ -274,9 +271,7 @@
         Box(Modifier.padding(it)) {
             LazyColumn(Modifier.fillMaxSize()) {
                 if (!isRefreshing) {
-                    items(itemCount) {
-                        ListItem({ Text(text = "Item ${itemCount - it}") })
-                    }
+                    items(itemCount) { ListItem({ Text(text = "Item ${itemCount - it}") }) }
                 }
             }
             if (isRefreshing) {
@@ -351,9 +346,7 @@
         ) {
             LazyColumn(Modifier.fillMaxSize()) {
                 if (!isRefreshing) {
-                    items(itemCount) {
-                        ListItem({ Text(text = "Item ${itemCount - it}") })
-                    }
+                    items(itemCount) { ListItem({ Text(text = "Item ${itemCount - it}") }) }
                 }
             }
         }
diff --git a/compose/material3/material3/samples/src/main/java/androidx/compose/material3/samples/RadioButtonSamples.kt b/compose/material3/material3/samples/src/main/java/androidx/compose/material3/samples/RadioButtonSamples.kt
index 3bfd446..554fd0d 100644
--- a/compose/material3/material3/samples/src/main/java/androidx/compose/material3/samples/RadioButtonSamples.kt
+++ b/compose/material3/material3/samples/src/main/java/androidx/compose/material3/samples/RadioButtonSamples.kt
@@ -74,8 +74,7 @@
     Column(Modifier.selectableGroup()) {
         radioOptions.forEach { text ->
             Row(
-                Modifier
-                    .fillMaxWidth()
+                Modifier.fillMaxWidth()
                     .height(56.dp)
                     .selectable(
                         selected = (text == selectedOption),
diff --git a/compose/material3/material3/samples/src/main/java/androidx/compose/material3/samples/ScaffoldSamples.kt b/compose/material3/material3/samples/src/main/java/androidx/compose/material3/samples/ScaffoldSamples.kt
index b5602ae..ed1fe28 100644
--- a/compose/material3/material3/samples/src/main/java/androidx/compose/material3/samples/ScaffoldSamples.kt
+++ b/compose/material3/material3/samples/src/main/java/androidx/compose/material3/samples/ScaffoldSamples.kt
@@ -67,22 +67,21 @@
 @Sampled
 @Composable
 fun SimpleScaffoldWithTopBar() {
-    val colors = listOf(
-        Color(0xFFffd7d7.toInt()),
-        Color(0xFFffe9d6.toInt()),
-        Color(0xFFfffbd0.toInt()),
-        Color(0xFFe3ffd9.toInt()),
-        Color(0xFFd0fff8.toInt())
-    )
+    val colors =
+        listOf(
+            Color(0xFFffd7d7.toInt()),
+            Color(0xFFffe9d6.toInt()),
+            Color(0xFFfffbd0.toInt()),
+            Color(0xFFe3ffd9.toInt()),
+            Color(0xFFd0fff8.toInt())
+        )
 
     Scaffold(
         topBar = {
             TopAppBar(
                 title = { Text("Simple Scaffold Screen") },
                 navigationIcon = {
-                    IconButton(
-                        onClick = { /* "Open nav drawer" */ }
-                    ) {
+                    IconButton(onClick = { /* "Open nav drawer" */ }) {
                         Icon(Icons.Filled.Menu, contentDescription = "Localized description")
                     }
                 }
@@ -90,11 +89,7 @@
         },
         floatingActionButtonPosition = FabPosition.End,
         floatingActionButton = {
-            ExtendedFloatingActionButton(
-                onClick = { /* fab click handler */ }
-            ) {
-                Text("Inc")
-            }
+            ExtendedFloatingActionButton(onClick = { /* fab click handler */ }) { Text("Inc") }
         },
         content = { innerPadding ->
             LazyColumn(
@@ -103,12 +98,7 @@
                 contentPadding = innerPadding
             ) {
                 items(count = 100) {
-                    Box(
-                        Modifier
-                            .fillMaxWidth()
-                            .height(50.dp)
-                            .background(colors[it % colors.size])
-                    )
+                    Box(Modifier.fillMaxWidth().height(50.dp).background(colors[it % colors.size]))
                 }
             }
         }
@@ -128,21 +118,16 @@
             ExtendedFloatingActionButton(
                 onClick = {
                     // show snackbar as a suspend function
-                    scope.launch {
-                        snackbarHostState.showSnackbar(
-                            "Snackbar # ${++clickCount}"
-                        )
-                    }
+                    scope.launch { snackbarHostState.showSnackbar("Snackbar # ${++clickCount}") }
                 }
-            ) { Text("Show snackbar") }
+            ) {
+                Text("Show snackbar")
+            }
         },
         content = { innerPadding ->
             Text(
                 text = "Body content",
-                modifier = Modifier
-                    .padding(innerPadding)
-                    .fillMaxSize()
-                    .wrapContentSize()
+                modifier = Modifier.padding(innerPadding).fillMaxSize().wrapContentSize()
             )
         }
     )
@@ -170,15 +155,14 @@
                         )
                     }
                 }
-            ) { Text("Show snackbar") }
+            ) {
+                Text("Show snackbar")
+            }
         },
         content = { innerPadding ->
             Text(
                 text = "Body content",
-                modifier = Modifier
-                    .padding(innerPadding)
-                    .fillMaxSize()
-                    .wrapContentSize()
+                modifier = Modifier.padding(innerPadding).fillMaxSize().wrapContentSize()
             )
         }
     )
@@ -188,14 +172,14 @@
 @Sampled
 @Composable
 fun ScaffoldWithCustomSnackbar() {
-    class SnackbarVisualsWithError(
-        override val message: String,
-        val isError: Boolean
-    ) : SnackbarVisuals {
+    class SnackbarVisualsWithError(override val message: String, val isError: Boolean) :
+        SnackbarVisuals {
         override val actionLabel: String
             get() = if (isError) "Error" else "OK"
+
         override val withDismissAction: Boolean
             get() = false
+
         override val duration: SnackbarDuration
             get() = SnackbarDuration.Indefinite
     }
@@ -208,26 +192,28 @@
             SnackbarHost(snackbarHostState) { data ->
                 // custom snackbar with the custom action button color and border
                 val isError = (data.visuals as? SnackbarVisualsWithError)?.isError ?: false
-                val buttonColor = if (isError) {
-                    ButtonDefaults.textButtonColors(
-                        containerColor = MaterialTheme.colorScheme.errorContainer,
-                        contentColor = MaterialTheme.colorScheme.error
-                    )
-                } else {
-                    ButtonDefaults.textButtonColors(
-                        contentColor = MaterialTheme.colorScheme.inversePrimary
-                    )
-                }
+                val buttonColor =
+                    if (isError) {
+                        ButtonDefaults.textButtonColors(
+                            containerColor = MaterialTheme.colorScheme.errorContainer,
+                            contentColor = MaterialTheme.colorScheme.error
+                        )
+                    } else {
+                        ButtonDefaults.textButtonColors(
+                            contentColor = MaterialTheme.colorScheme.inversePrimary
+                        )
+                    }
 
                 Snackbar(
-                    modifier = Modifier
-                        .border(2.dp, MaterialTheme.colorScheme.secondary)
-                        .padding(12.dp),
+                    modifier =
+                        Modifier.border(2.dp, MaterialTheme.colorScheme.secondary).padding(12.dp),
                     action = {
                         TextButton(
                             onClick = { if (isError) data.dismiss() else data.performAction() },
                             colors = buttonColor
-                        ) { Text(data.visuals.actionLabel ?: "") }
+                        ) {
+                            Text(data.visuals.actionLabel ?: "")
+                        }
                     }
                 ) {
                     Text(data.visuals.message)
@@ -247,15 +233,14 @@
                         )
                     }
                 }
-            ) { Text("Show snackbar") }
+            ) {
+                Text("Show snackbar")
+            }
         },
         content = { innerPadding ->
             Text(
                 text = "Custom Snackbar Demo",
-                modifier = Modifier
-                    .padding(innerPadding)
-                    .fillMaxSize()
-                    .wrapContentSize()
+                modifier = Modifier.padding(innerPadding).fillMaxSize().wrapContentSize()
             )
         }
     )
@@ -272,10 +257,11 @@
     val channel = remember { Channel<Int>(Channel.CONFLATED) }
     LaunchedEffect(channel) {
         channel.receiveAsFlow().collect { index ->
-            val result = snackbarHostState.showSnackbar(
-                message = "Snackbar # $index",
-                actionLabel = "Action on $index"
-            )
+            val result =
+                snackbarHostState.showSnackbar(
+                    message = "Snackbar # $index",
+                    actionLabel = "Action on $index"
+                )
             when (result) {
                 SnackbarResult.ActionPerformed -> {
                     /* action has been performed */
@@ -295,15 +281,14 @@
                     // offset snackbar data to the business logic
                     channel.trySend(++clickCount)
                 }
-            ) { Text("Show snackbar") }
+            ) {
+                Text("Show snackbar")
+            }
         },
         content = { innerPadding ->
             Text(
                 "Snackbar demo",
-                modifier = Modifier
-                    .padding(innerPadding)
-                    .fillMaxSize()
-                    .wrapContentSize()
+                modifier = Modifier.padding(innerPadding).fillMaxSize().wrapContentSize()
             )
         }
     )
@@ -335,15 +320,14 @@
                         snackbarHostState.showSnackbar(longMessage)
                     }
                 }
-            ) { Text("Show snackbar") }
+            ) {
+                Text("Show snackbar")
+            }
         },
         content = { innerPadding ->
             Text(
                 text = "Multiline Snackbar Demo",
-                modifier = Modifier
-                    .padding(innerPadding)
-                    .fillMaxSize()
-                    .wrapContentSize()
+                modifier = Modifier.padding(innerPadding).fillMaxSize().wrapContentSize()
             )
         }
     )
diff --git a/compose/material3/material3/samples/src/main/java/androidx/compose/material3/samples/SearchBarSamples.kt b/compose/material3/material3/samples/src/main/java/androidx/compose/material3/samples/SearchBarSamples.kt
index b0cf216..364b54d 100644
--- a/compose/material3/material3/samples/src/main/java/androidx/compose/material3/samples/SearchBarSamples.kt
+++ b/compose/material3/material3/samples/src/main/java/androidx/compose/material3/samples/SearchBarSamples.kt
@@ -62,15 +62,9 @@
     var text by rememberSaveable { mutableStateOf("") }
     var expanded by rememberSaveable { mutableStateOf(false) }
 
-    Box(
-        Modifier
-            .fillMaxSize()
-            .semantics { isTraversalGroup = true }
-    ) {
+    Box(Modifier.fillMaxSize().semantics { isTraversalGroup = true }) {
         SearchBar(
-            modifier = Modifier
-                .align(Alignment.TopCenter)
-                .semantics { traversalIndex = 0f },
+            modifier = Modifier.align(Alignment.TopCenter).semantics { traversalIndex = 0f },
             inputField = {
                 SearchBarDefaults.InputField(
                     query = text,
@@ -94,13 +88,13 @@
                         supportingContent = { Text("Additional info") },
                         leadingContent = { Icon(Icons.Filled.Star, contentDescription = null) },
                         colors = ListItemDefaults.colors(containerColor = Color.Transparent),
-                        modifier = Modifier
-                            .clickable {
-                                text = resultText
-                                expanded = false
-                            }
-                            .fillMaxWidth()
-                            .padding(horizontal = 16.dp, vertical = 4.dp)
+                        modifier =
+                            Modifier.clickable {
+                                    text = resultText
+                                    expanded = false
+                                }
+                                .fillMaxWidth()
+                                .padding(horizontal = 16.dp, vertical = 4.dp)
                     )
                 }
             }
@@ -115,9 +109,7 @@
             items(count = list.size) {
                 Text(
                     text = list[it],
-                    modifier = Modifier
-                        .fillMaxWidth()
-                        .padding(horizontal = 16.dp),
+                    modifier = Modifier.fillMaxWidth().padding(horizontal = 16.dp),
                 )
             }
         }
@@ -132,16 +124,12 @@
     var text by rememberSaveable { mutableStateOf("") }
     var expanded by rememberSaveable { mutableStateOf(false) }
 
-    Box(
-        Modifier
-            .fillMaxSize()
-            .semantics { isTraversalGroup = true }
-    ) {
+    Box(Modifier.fillMaxSize().semantics { isTraversalGroup = true }) {
         DockedSearchBar(
-            modifier = Modifier
-                .align(Alignment.TopCenter)
-                .padding(top = 8.dp)
-                .semantics { traversalIndex = 0f },
+            modifier =
+                Modifier.align(Alignment.TopCenter).padding(top = 8.dp).semantics {
+                    traversalIndex = 0f
+                },
             inputField = {
                 SearchBarDefaults.InputField(
                     query = text,
@@ -165,13 +153,13 @@
                         supportingContent = { Text("Additional info") },
                         leadingContent = { Icon(Icons.Filled.Star, contentDescription = null) },
                         colors = ListItemDefaults.colors(containerColor = Color.Transparent),
-                        modifier = Modifier
-                            .clickable {
-                                text = resultText
-                                expanded = false
-                            }
-                            .fillMaxWidth()
-                            .padding(horizontal = 16.dp, vertical = 4.dp)
+                        modifier =
+                            Modifier.clickable {
+                                    text = resultText
+                                    expanded = false
+                                }
+                                .fillMaxWidth()
+                                .padding(horizontal = 16.dp, vertical = 4.dp)
                     )
                 }
             }
@@ -186,9 +174,7 @@
             items(count = list.size) {
                 Text(
                     text = list[it],
-                    modifier = Modifier
-                        .fillMaxWidth()
-                        .padding(horizontal = 16.dp),
+                    modifier = Modifier.fillMaxWidth().padding(horizontal = 16.dp),
                 )
             }
         }
diff --git a/compose/material3/material3/samples/src/main/java/androidx/compose/material3/samples/SegmentedButtonSamples.kt b/compose/material3/material3/samples/src/main/java/androidx/compose/material3/samples/SegmentedButtonSamples.kt
index 2de7fe8..f46d70c 100644
--- a/compose/material3/material3/samples/src/main/java/androidx/compose/material3/samples/SegmentedButtonSamples.kt
+++ b/compose/material3/material3/samples/src/main/java/androidx/compose/material3/samples/SegmentedButtonSamples.kt
@@ -1,18 +1,18 @@
 /*
-* Copyright 2023 The Android Open Source Project
-*
-* Licensed under the Apache License, Version 2.0 (the "License");
-* you may not use this file except in compliance with the License.
-* You may obtain a copy of the License at
-*
-*      http://www.apache.org/licenses/LICENSE-2.0
-*
-* Unless required by applicable law or agreed to in writing, software
-* distributed under the License is distributed on an "AS IS" BASIS,
-* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-* See the License for the specific language governing permissions and
-* limitations under the License.
-*/
+ * Copyright 2023 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
 
 package androidx.compose.material3.samples
 
@@ -62,11 +62,12 @@
 fun SegmentedButtonMultiSelectSample() {
     val checkedList = remember { mutableStateListOf<Int>() }
     val options = listOf("Favorites", "Trending", "Saved")
-    val icons = listOf(
-        Icons.Filled.StarBorder,
-        Icons.AutoMirrored.Filled.TrendingUp,
-        Icons.Filled.BookmarkBorder
-    )
+    val icons =
+        listOf(
+            Icons.Filled.StarBorder,
+            Icons.AutoMirrored.Filled.TrendingUp,
+            Icons.Filled.BookmarkBorder
+        )
     MultiChoiceSegmentedButtonRow {
         options.forEachIndexed { index, label ->
             SegmentedButton(
diff --git a/compose/material3/material3/samples/src/main/java/androidx/compose/material3/samples/SliderSamples.kt b/compose/material3/material3/samples/src/main/java/androidx/compose/material3/samples/SliderSamples.kt
index 02a3802..c042c02 100644
--- a/compose/material3/material3/samples/src/main/java/androidx/compose/material3/samples/SliderSamples.kt
+++ b/compose/material3/material3/samples/src/main/java/androidx/compose/material3/samples/SliderSamples.kt
@@ -67,7 +67,8 @@
         Slider(
             modifier = Modifier.semantics { contentDescription = "Localized Description" },
             value = sliderPosition,
-            onValueChange = { sliderPosition = it })
+            onValueChange = { sliderPosition = it }
+        )
     }
 }
 
@@ -83,33 +84,23 @@
         Text(text = "%.2f".format(sliderPosition))
         Slider(
             interactionSource = interactionSource,
-            modifier = Modifier
-                .semantics { contentDescription = "Localized Description" }
-                .requiredSizeIn(
-                    minWidth = thumbSize.width,
-                    minHeight = trackHeight
-                ),
+            modifier =
+                Modifier.semantics { contentDescription = "Localized Description" }
+                    .requiredSizeIn(minWidth = thumbSize.width, minHeight = trackHeight),
             value = sliderPosition,
             onValueChange = { sliderPosition = it },
             thumb = {
-                val modifier = Modifier
-                    .size(thumbSize)
-                    .shadow(1.dp, CircleShape, clip = false)
-                    .indication(
-                        interactionSource = interactionSource,
-                        indication = ripple(
-                            bounded = false,
-                            radius = 20.dp
+                val modifier =
+                    Modifier.size(thumbSize)
+                        .shadow(1.dp, CircleShape, clip = false)
+                        .indication(
+                            interactionSource = interactionSource,
+                            indication = ripple(bounded = false, radius = 20.dp)
                         )
-                    )
-                SliderDefaults.Thumb(
-                    interactionSource = interactionSource,
-                    modifier = modifier
-                )
+                SliderDefaults.Thumb(interactionSource = interactionSource, modifier = modifier)
             },
             track = {
-                val modifier = Modifier
-                    .height(trackHeight)
+                val modifier = Modifier.height(trackHeight)
                 SliderDefaults.Track(
                     sliderState = it,
                     modifier = modifier,
@@ -166,11 +157,7 @@
             thumb = {
                 Label(
                     label = {
-                        PlainTooltip(
-                            modifier = Modifier
-                                .sizeIn(45.dp, 25.dp)
-                                .wrapContentWidth()
-                        ) {
+                        PlainTooltip(modifier = Modifier.sizeIn(45.dp, 25.dp).wrapContentWidth()) {
                             Text("%.2f".format(sliderPosition))
                         }
                     },
@@ -211,17 +198,9 @@
             modifier = Modifier.semantics { contentDescription = "Localized Description" },
             interactionSource = interactionSource,
             thumb = {
-                SliderDefaults.Thumb(
-                    interactionSource = interactionSource,
-                    colors = colors
-                )
+                SliderDefaults.Thumb(interactionSource = interactionSource, colors = colors)
             },
-            track = {
-                SliderDefaults.Track(
-                    colors = colors,
-                    sliderState = sliderState
-                )
-            }
+            track = { SliderDefaults.Track(colors = colors, sliderState = sliderState) }
         )
     }
 }
@@ -280,47 +259,34 @@
             state = rangeSliderState,
             startInteractionSource = startInteractionSource,
             endInteractionSource = endInteractionSource,
-            modifier = Modifier
-                .semantics { contentDescription = "Localized Description" }
-                .requiredSizeIn(
-                    minWidth = thumbSize.width,
-                    minHeight = trackHeight
-                ),
+            modifier =
+                Modifier.semantics { contentDescription = "Localized Description" }
+                    .requiredSizeIn(minWidth = thumbSize.width, minHeight = trackHeight),
             startThumb = {
-                val modifier = Modifier
-                    .size(thumbSize)
-                    .shadow(1.dp, CircleShape, clip = false)
-                    .indication(
-                        interactionSource = startInteractionSource,
-                        indication = ripple(
-                            bounded = false,
-                            radius = 20.dp
+                val modifier =
+                    Modifier.size(thumbSize)
+                        .shadow(1.dp, CircleShape, clip = false)
+                        .indication(
+                            interactionSource = startInteractionSource,
+                            indication = ripple(bounded = false, radius = 20.dp)
                         )
-                    )
                 SliderDefaults.Thumb(
                     interactionSource = startInteractionSource,
                     modifier = modifier
                 )
             },
             endThumb = {
-                val modifier = Modifier
-                    .size(thumbSize)
-                    .shadow(1.dp, CircleShape, clip = false)
-                    .indication(
-                        interactionSource = endInteractionSource,
-                        indication = ripple(
-                            bounded = false,
-                            radius = 20.dp
+                val modifier =
+                    Modifier.size(thumbSize)
+                        .shadow(1.dp, CircleShape, clip = false)
+                        .indication(
+                            interactionSource = endInteractionSource,
+                            indication = ripple(bounded = false, radius = 20.dp)
                         )
-                    )
-                SliderDefaults.Thumb(
-                    interactionSource = endInteractionSource,
-                    modifier = modifier
-                )
+                SliderDefaults.Thumb(interactionSource = endInteractionSource, modifier = modifier)
             },
             track = {
-                val modifier = Modifier
-                    .height(trackHeight)
+                val modifier = Modifier.height(trackHeight)
                 SliderDefaults.Track(
                     rangeSliderState = it,
                     modifier = modifier,
@@ -381,10 +347,8 @@
     }
     val startInteractionSource = remember { MutableInteractionSource() }
     val endInteractionSource = remember { MutableInteractionSource() }
-    val startThumbAndTrackColors = SliderDefaults.colors(
-        thumbColor = Color.Blue,
-        activeTrackColor = Color.Red
-    )
+    val startThumbAndTrackColors =
+        SliderDefaults.colors(thumbColor = Color.Blue, activeTrackColor = Color.Red)
     val endThumbColors = SliderDefaults.colors(thumbColor = Color.Green)
     Column(modifier = Modifier.padding(horizontal = 16.dp)) {
         RangeSlider(
@@ -395,11 +359,7 @@
             startThumb = {
                 Label(
                     label = {
-                        PlainTooltip(
-                            modifier = Modifier
-                                .sizeIn(45.dp, 25.dp)
-                                .wrapContentWidth()
-                        ) {
+                        PlainTooltip(modifier = Modifier.sizeIn(45.dp, 25.dp).wrapContentWidth()) {
                             Text("%.2f".format(rangeSliderState.activeRangeStart))
                         }
                     },
@@ -415,9 +375,7 @@
                 Label(
                     label = {
                         PlainTooltip(
-                            modifier = Modifier
-                                .requiredSize(45.dp, 25.dp)
-                                .wrapContentWidth()
+                            modifier = Modifier.requiredSize(45.dp, 25.dp).wrapContentWidth()
                         ) {
                             Text("%.2f".format(rangeSliderState.activeRangeEnd))
                         }
diff --git a/compose/material3/material3/samples/src/main/java/androidx/compose/material3/samples/SurfaceSamples.kt b/compose/material3/material3/samples/src/main/java/androidx/compose/material3/samples/SurfaceSamples.kt
index 937ec35..8603b29 100644
--- a/compose/material3/material3/samples/src/main/java/androidx/compose/material3/samples/SurfaceSamples.kt
+++ b/compose/material3/material3/samples/src/main/java/androidx/compose/material3/samples/SurfaceSamples.kt
@@ -32,9 +32,7 @@
 @Sampled
 @Composable
 fun SurfaceSample() {
-    Surface {
-        Text("Text on Surface")
-    }
+    Surface { Text("Text on Surface") }
 }
 
 @Preview
@@ -58,10 +56,7 @@
         selected = selected,
         onClick = { selected = !selected },
     ) {
-        Text(
-            text = if (selected) "Selected" else "Not Selected",
-            textAlign = TextAlign.Center
-        )
+        Text(text = if (selected) "Selected" else "Not Selected", textAlign = TextAlign.Center)
     }
 }
 
@@ -73,15 +68,13 @@
     Surface(
         checked = checked,
         onCheckedChange = { checked = !checked },
-        color = if (checked) {
-            MaterialTheme.colorScheme.surfaceVariant
-        } else {
-            MaterialTheme.colorScheme.surface
-        }
+        color =
+            if (checked) {
+                MaterialTheme.colorScheme.surfaceVariant
+            } else {
+                MaterialTheme.colorScheme.surface
+            }
     ) {
-        Text(
-            text = if (checked) "ON" else "OFF",
-            textAlign = TextAlign.Center
-        )
+        Text(text = if (checked) "ON" else "OFF", textAlign = TextAlign.Center)
     }
 }
diff --git a/compose/material3/material3/samples/src/main/java/androidx/compose/material3/samples/SwipeToDismissSamples.kt b/compose/material3/material3/samples/src/main/java/androidx/compose/material3/samples/SwipeToDismissSamples.kt
index 7235969..058f52d 100644
--- a/compose/material3/material3/samples/src/main/java/androidx/compose/material3/samples/SwipeToDismissSamples.kt
+++ b/compose/material3/material3/samples/src/main/java/androidx/compose/material3/samples/SwipeToDismissSamples.kt
@@ -42,25 +42,20 @@
     SwipeToDismissBox(
         state = dismissState,
         backgroundContent = {
-            val color by animateColorAsState(
-                when (dismissState.targetValue) {
-                    SwipeToDismissBoxValue.Settled -> Color.LightGray
-                    SwipeToDismissBoxValue.StartToEnd -> Color.Green
-                    SwipeToDismissBoxValue.EndToStart -> Color.Red
-                }
-            )
-            Box(
-                Modifier
-                    .fillMaxSize()
-                    .background(color)
-            )
+            val color by
+                animateColorAsState(
+                    when (dismissState.targetValue) {
+                        SwipeToDismissBoxValue.Settled -> Color.LightGray
+                        SwipeToDismissBoxValue.StartToEnd -> Color.Green
+                        SwipeToDismissBoxValue.EndToStart -> Color.Red
+                    }
+                )
+            Box(Modifier.fillMaxSize().background(color))
         }
     ) {
         OutlinedCard(shape = RectangleShape) {
             ListItem(
-                headlineContent = {
-                    Text("Cupcake")
-                },
+                headlineContent = { Text("Cupcake") },
                 supportingContent = { Text("Swipe me left or right!") }
             )
         }
diff --git a/compose/material3/material3/samples/src/main/java/androidx/compose/material3/samples/SwitchSamples.kt b/compose/material3/material3/samples/src/main/java/androidx/compose/material3/samples/SwitchSamples.kt
index a427429..6f4e3d1 100644
--- a/compose/material3/material3/samples/src/main/java/androidx/compose/material3/samples/SwitchSamples.kt
+++ b/compose/material3/material3/samples/src/main/java/androidx/compose/material3/samples/SwitchSamples.kt
@@ -41,7 +41,8 @@
     Switch(
         modifier = Modifier.semantics { contentDescription = "Demo" },
         checked = checked,
-        onCheckedChange = { checked = it })
+        onCheckedChange = { checked = it }
+    )
 }
 
 @Preview
diff --git a/compose/material3/material3/samples/src/main/java/androidx/compose/material3/samples/TabSamples.kt b/compose/material3/material3/samples/src/main/java/androidx/compose/material3/samples/TabSamples.kt
index 900e2a8..6c4c7fd 100644
--- a/compose/material3/material3/samples/src/main/java/androidx/compose/material3/samples/TabSamples.kt
+++ b/compose/material3/material3/samples/src/main/java/androidx/compose/material3/samples/TabSamples.kt
@@ -191,11 +191,12 @@
 @OptIn(ExperimentalMaterial3Api::class)
 fun TextAndIconTabs() {
     var state by remember { mutableStateOf(0) }
-    val titlesAndIcons = listOf(
-        "Tab 1" to Icons.Filled.Favorite,
-        "Tab 2" to Icons.Filled.Favorite,
-        "Tab 3 with lots of text" to Icons.Filled.Favorite
-    )
+    val titlesAndIcons =
+        listOf(
+            "Tab 1" to Icons.Filled.Favorite,
+            "Tab 2" to Icons.Filled.Favorite,
+            "Tab 3 with lots of text" to Icons.Filled.Favorite
+        )
     Column {
         PrimaryTabRow(selectedTabIndex = state) {
             titlesAndIcons.forEachIndexed { index, (title, icon) ->
@@ -220,11 +221,12 @@
 @OptIn(ExperimentalMaterial3Api::class)
 fun LeadingIconTabs() {
     var state by remember { mutableStateOf(0) }
-    val titlesAndIcons = listOf(
-        "Tab" to Icons.Filled.Favorite,
-        "Tab & icon" to Icons.Filled.Favorite,
-        "Tab 3 with lots of text" to Icons.Filled.Favorite
-    )
+    val titlesAndIcons =
+        listOf(
+            "Tab" to Icons.Filled.Favorite,
+            "Tab & icon" to Icons.Filled.Favorite,
+            "Tab 3 with lots of text" to Icons.Filled.Favorite
+        )
     Column {
         PrimaryScrollableTabRow(selectedTabIndex = state) {
             titlesAndIcons.forEachIndexed { index, (title, icon) ->
@@ -249,26 +251,23 @@
 @OptIn(ExperimentalMaterial3Api::class)
 fun ScrollingPrimaryTextTabs() {
     var state by remember { mutableStateOf(0) }
-    val titles = listOf(
-        "Tab 1",
-        "Tab 2",
-        "Tab 3 with lots of text",
-        "Tab 4",
-        "Tab 5",
-        "Tab 6 with lots of text",
-        "Tab 7",
-        "Tab 8",
-        "Tab 9 with lots of text",
-        "Tab 10"
-    )
+    val titles =
+        listOf(
+            "Tab 1",
+            "Tab 2",
+            "Tab 3 with lots of text",
+            "Tab 4",
+            "Tab 5",
+            "Tab 6 with lots of text",
+            "Tab 7",
+            "Tab 8",
+            "Tab 9 with lots of text",
+            "Tab 10"
+        )
     Column {
         PrimaryScrollableTabRow(selectedTabIndex = state) {
             titles.forEachIndexed { index, title ->
-                Tab(
-                    selected = state == index,
-                    onClick = { state = index },
-                    text = { Text(title) }
-                )
+                Tab(selected = state == index, onClick = { state = index }, text = { Text(title) })
             }
         }
         Text(
@@ -284,26 +283,23 @@
 @OptIn(ExperimentalMaterial3Api::class)
 fun ScrollingSecondaryTextTabs() {
     var state by remember { mutableStateOf(0) }
-    val titles = listOf(
-        "Tab 1",
-        "Tab 2",
-        "Tab 3 with lots of text",
-        "Tab 4",
-        "Tab 5",
-        "Tab 6 with lots of text",
-        "Tab 7",
-        "Tab 8",
-        "Tab 9 with lots of text",
-        "Tab 10"
-    )
+    val titles =
+        listOf(
+            "Tab 1",
+            "Tab 2",
+            "Tab 3 with lots of text",
+            "Tab 4",
+            "Tab 5",
+            "Tab 6 with lots of text",
+            "Tab 7",
+            "Tab 8",
+            "Tab 9 with lots of text",
+            "Tab 10"
+        )
     Column {
         SecondaryScrollableTabRow(selectedTabIndex = state) {
             titles.forEachIndexed { index, title ->
-                Tab(
-                    selected = state == index,
-                    onClick = { state = index },
-                    text = { Text(title) }
-                )
+                Tab(selected = state == index, onClick = { state = index }, text = { Text(title) })
             }
         }
         Text(
@@ -319,26 +315,23 @@
 @OptIn(ExperimentalMaterial3Api::class)
 fun ScrollingTextTabs() {
     var state by remember { mutableStateOf(0) }
-    val titles = listOf(
-        "Tab 1",
-        "Tab 2",
-        "Tab 3 with lots of text",
-        "Tab 4",
-        "Tab 5",
-        "Tab 6 with lots of text",
-        "Tab 7",
-        "Tab 8",
-        "Tab 9 with lots of text",
-        "Tab 10"
-    )
+    val titles =
+        listOf(
+            "Tab 1",
+            "Tab 2",
+            "Tab 3 with lots of text",
+            "Tab 4",
+            "Tab 5",
+            "Tab 6 with lots of text",
+            "Tab 7",
+            "Tab 8",
+            "Tab 9 with lots of text",
+            "Tab 10"
+        )
     Column {
         PrimaryScrollableTabRow(selectedTabIndex = state) {
             titles.forEachIndexed { index, title ->
-                Tab(
-                    selected = state == index,
-                    onClick = { state = index },
-                    text = { Text(title) }
-                )
+                Tab(selected = state == index, onClick = { state = index }, text = { Text(title) })
             }
         }
         Text(
@@ -359,11 +352,7 @@
     Column {
         SecondaryTabRow(selectedTabIndex = state) {
             titles.forEachIndexed { index, title ->
-                FancyTab(
-                    title = title,
-                    onClick = { state = index },
-                    selected = (index == state)
-                )
+                FancyTab(title = title, onClick = { state = index }, selected = (index == state))
             }
         }
         Text(
@@ -393,11 +382,7 @@
             }
         ) {
             titles.forEachIndexed { index, title ->
-                Tab(
-                    selected = state == index,
-                    onClick = { state = index },
-                    text = { Text(title) }
-                )
+                Tab(selected = state == index, onClick = { state = index }, text = { Text(title) })
             }
         }
         Text(
@@ -422,11 +407,7 @@
             indicator = { FancyAnimatedIndicatorWithModifier(state) }
         ) {
             titles.forEachIndexed { index, title ->
-                Tab(
-                    selected = state == index,
-                    onClick = { state = index },
-                    text = { Text(title) }
-                )
+                Tab(selected = state == index, onClick = { state = index }, text = { Text(title) })
             }
         }
         Text(
@@ -454,39 +435,42 @@
 @Sampled
 @Composable
 fun TabIndicatorScope.FancyAnimatedIndicatorWithModifier(index: Int) {
-    val colors = listOf(
-        MaterialTheme.colorScheme.primary,
-        MaterialTheme.colorScheme.secondary,
-        MaterialTheme.colorScheme.tertiary,
-    )
+    val colors =
+        listOf(
+            MaterialTheme.colorScheme.primary,
+            MaterialTheme.colorScheme.secondary,
+            MaterialTheme.colorScheme.tertiary,
+        )
     var startAnimatable by remember { mutableStateOf<Animatable<Dp, AnimationVector1D>?>(null) }
     var endAnimatable by remember { mutableStateOf<Animatable<Dp, AnimationVector1D>?>(null) }
     val coroutineScope = rememberCoroutineScope()
     val indicatorColor: Color by animateColorAsState(colors[index % colors.size], label = "")
 
     Box(
-        Modifier
-            .tabIndicatorLayout { measurable: Measurable, constraints: Constraints,
+        Modifier.tabIndicatorLayout {
+                measurable: Measurable,
+                constraints: Constraints,
                 tabPositions: List<TabPosition> ->
                 val newStart = tabPositions[index].left
                 val newEnd = tabPositions[index].right
-                val startAnim = startAnimatable ?: Animatable(newStart, Dp.VectorConverter)
-                    .also { startAnimatable = it }
+                val startAnim =
+                    startAnimatable
+                        ?: Animatable(newStart, Dp.VectorConverter).also { startAnimatable = it }
 
-                val endAnim = endAnimatable ?: Animatable(newEnd, Dp.VectorConverter)
-                    .also { endAnimatable = it }
+                val endAnim =
+                    endAnimatable
+                        ?: Animatable(newEnd, Dp.VectorConverter).also { endAnimatable = it }
 
                 if (endAnim.targetValue != newEnd) {
                     coroutineScope.launch {
                         endAnim.animateTo(
                             newEnd,
                             animationSpec =
-                            if (endAnim.targetValue < newEnd) {
-                                spring(dampingRatio = 1f, stiffness = 1000f)
-                            } else {
-                                spring(dampingRatio = 1f, stiffness = 50f)
-                            }
-
+                                if (endAnim.targetValue < newEnd) {
+                                    spring(dampingRatio = 1f, stiffness = 1000f)
+                                } else {
+                                    spring(dampingRatio = 1f, stiffness = 50f)
+                                }
                         )
                     }
                 }
@@ -496,15 +480,14 @@
                         startAnim.animateTo(
                             newStart,
                             animationSpec =
-                            // Handle directionality here, if we are moving to the right, we
-                            // want the right side of the indicator to move faster, if we are
-                            // moving to the left, we want the left side to move faster.
-                            if (startAnim.targetValue < newStart) {
-                                spring(dampingRatio = 1f, stiffness = 50f)
-                            } else {
-                                spring(dampingRatio = 1f, stiffness = 1000f)
-                            }
-
+                                // Handle directionality here, if we are moving to the right, we
+                                // want the right side of the indicator to move faster, if we are
+                                // moving to the left, we want the left side to move faster.
+                                if (startAnim.targetValue < newStart) {
+                                    spring(dampingRatio = 1f, stiffness = 50f)
+                                } else {
+                                    spring(dampingRatio = 1f, stiffness = 1000f)
+                                }
                         )
                     }
                 }
@@ -513,12 +496,13 @@
                 val indicatorStart = startAnim.value.roundToPx()
 
                 // Apply an offset from the start to correctly position the indicator around the tab
-                val placeable = measurable.measure(
-                    constraints.copy(
-                        maxWidth = indicatorEnd - indicatorStart,
-                        minWidth = indicatorEnd - indicatorStart,
+                val placeable =
+                    measurable.measure(
+                        constraints.copy(
+                            maxWidth = indicatorEnd - indicatorStart,
+                            minWidth = indicatorEnd - indicatorStart,
+                        )
                     )
-                )
                 layout(constraints.maxWidth, constraints.maxHeight) {
                     placeable.place(indicatorStart, 0)
                 }
@@ -540,18 +524,19 @@
 @OptIn(ExperimentalMaterial3Api::class)
 fun ScrollingFancyIndicatorContainerTabs() {
     var state by remember { mutableStateOf(0) }
-    val titles = listOf(
-        "Tab 1",
-        "Tab 2",
-        "Tab 3 with lots of text",
-        "Tab 4",
-        "Tab 5",
-        "Tab 6 with lots of text",
-        "Tab 7",
-        "Tab 8",
-        "Tab 9 with lots of text",
-        "Tab 10"
-    )
+    val titles =
+        listOf(
+            "Tab 1",
+            "Tab 2",
+            "Tab 3 with lots of text",
+            "Tab 4",
+            "Tab 5",
+            "Tab 6 with lots of text",
+            "Tab 7",
+            "Tab 8",
+            "Tab 9 with lots of text",
+            "Tab 10"
+        )
 
     Column {
         SecondaryScrollableTabRow(
@@ -559,11 +544,7 @@
             indicator = { FancyAnimatedIndicatorWithModifier(state) }
         ) {
             titles.forEachIndexed { index, title ->
-                Tab(
-                    selected = state == index,
-                    onClick = { state = index },
-                    text = { Text(title) }
-                )
+                Tab(selected = state == index, onClick = { state = index }, text = { Text(title) })
             }
         }
         Text(
@@ -579,19 +560,16 @@
 fun FancyTab(title: String, onClick: () -> Unit, selected: Boolean) {
     Tab(selected, onClick) {
         Column(
-            Modifier
-                .padding(10.dp)
-                .height(50.dp)
-                .fillMaxWidth(),
+            Modifier.padding(10.dp).height(50.dp).fillMaxWidth(),
             verticalArrangement = Arrangement.SpaceBetween
         ) {
             Box(
-                Modifier
-                    .size(10.dp)
+                Modifier.size(10.dp)
                     .align(Alignment.CenterHorizontally)
                     .background(
-                        color = if (selected) MaterialTheme.colorScheme.primary
-                        else MaterialTheme.colorScheme.background
+                        color =
+                            if (selected) MaterialTheme.colorScheme.primary
+                            else MaterialTheme.colorScheme.background
                     )
             )
             Text(
diff --git a/compose/material3/material3/samples/src/main/java/androidx/compose/material3/samples/TextFieldSamples.kt b/compose/material3/material3/samples/src/main/java/androidx/compose/material3/samples/TextFieldSamples.kt
index 01d866e..4206ca6 100644
--- a/compose/material3/material3/samples/src/main/java/androidx/compose/material3/samples/TextFieldSamples.kt
+++ b/compose/material3/material3/samples/src/main/java/androidx/compose/material3/samples/TextFieldSamples.kt
@@ -83,11 +83,7 @@
 fun SimpleOutlinedTextFieldSample() {
     var text by rememberSaveable { mutableStateOf("") }
 
-    OutlinedTextField(
-        value = text,
-        onValueChange = { text = it },
-        label = { Text("Label") }
-    )
+    OutlinedTextField(value = text, onValueChange = { text = it }, label = { Text("Label") })
 }
 
 @Preview
@@ -166,10 +162,11 @@
         },
         isError = isError,
         keyboardActions = KeyboardActions { validate(text) },
-        modifier = Modifier.semantics {
-            // Provide localized description of the error
-            if (isError) error(errorMessage)
-        }
+        modifier =
+            Modifier.semantics {
+                // Provide localized description of the error
+                if (isError) error(errorMessage)
+            }
     )
 }
 
@@ -201,7 +198,7 @@
         singleLine = true,
         label = { Text("Enter password") },
         visualTransformation =
-        if (passwordHidden) PasswordVisualTransformation() else VisualTransformation.None,
+            if (passwordHidden) PasswordVisualTransformation() else VisualTransformation.None,
         keyboardOptions = KeyboardOptions(keyboardType = KeyboardType.Password),
         trailingIcon = {
             IconButton(onClick = { passwordHidden = !passwordHidden }) {
@@ -215,37 +212,39 @@
     )
 }
 
-/** We copy the implementation of Visibility and VisibilityOff icons to showcase them in the
- * password text field sample but to avoid adding material-icons-extended library as a dependency
- * to the samples not to increase the build time
+/**
+ * We copy the implementation of Visibility and VisibilityOff icons to showcase them in the password
+ * text field sample but to avoid adding material-icons-extended library as a dependency to the
+ * samples not to increase the build time
  */
 private val Icons.Filled.Visibility: ImageVector
     get() {
         if (_visibility != null) {
             return _visibility!!
         }
-        _visibility = materialIcon(name = "Filled.Visibility") {
-            materialPath {
-                moveTo(12.0f, 4.5f)
-                curveTo(7.0f, 4.5f, 2.73f, 7.61f, 1.0f, 12.0f)
-                curveToRelative(1.73f, 4.39f, 6.0f, 7.5f, 11.0f, 7.5f)
-                reflectiveCurveToRelative(9.27f, -3.11f, 11.0f, -7.5f)
-                curveToRelative(-1.73f, -4.39f, -6.0f, -7.5f, -11.0f, -7.5f)
-                close()
-                moveTo(12.0f, 17.0f)
-                curveToRelative(-2.76f, 0.0f, -5.0f, -2.24f, -5.0f, -5.0f)
-                reflectiveCurveToRelative(2.24f, -5.0f, 5.0f, -5.0f)
-                reflectiveCurveToRelative(5.0f, 2.24f, 5.0f, 5.0f)
-                reflectiveCurveToRelative(-2.24f, 5.0f, -5.0f, 5.0f)
-                close()
-                moveTo(12.0f, 9.0f)
-                curveToRelative(-1.66f, 0.0f, -3.0f, 1.34f, -3.0f, 3.0f)
-                reflectiveCurveToRelative(1.34f, 3.0f, 3.0f, 3.0f)
-                reflectiveCurveToRelative(3.0f, -1.34f, 3.0f, -3.0f)
-                reflectiveCurveToRelative(-1.34f, -3.0f, -3.0f, -3.0f)
-                close()
+        _visibility =
+            materialIcon(name = "Filled.Visibility") {
+                materialPath {
+                    moveTo(12.0f, 4.5f)
+                    curveTo(7.0f, 4.5f, 2.73f, 7.61f, 1.0f, 12.0f)
+                    curveToRelative(1.73f, 4.39f, 6.0f, 7.5f, 11.0f, 7.5f)
+                    reflectiveCurveToRelative(9.27f, -3.11f, 11.0f, -7.5f)
+                    curveToRelative(-1.73f, -4.39f, -6.0f, -7.5f, -11.0f, -7.5f)
+                    close()
+                    moveTo(12.0f, 17.0f)
+                    curveToRelative(-2.76f, 0.0f, -5.0f, -2.24f, -5.0f, -5.0f)
+                    reflectiveCurveToRelative(2.24f, -5.0f, 5.0f, -5.0f)
+                    reflectiveCurveToRelative(5.0f, 2.24f, 5.0f, 5.0f)
+                    reflectiveCurveToRelative(-2.24f, 5.0f, -5.0f, 5.0f)
+                    close()
+                    moveTo(12.0f, 9.0f)
+                    curveToRelative(-1.66f, 0.0f, -3.0f, 1.34f, -3.0f, 3.0f)
+                    reflectiveCurveToRelative(1.34f, 3.0f, 3.0f, 3.0f)
+                    reflectiveCurveToRelative(3.0f, -1.34f, 3.0f, -3.0f)
+                    reflectiveCurveToRelative(-1.34f, -3.0f, -3.0f, -3.0f)
+                    close()
+                }
             }
-        }
         return _visibility!!
     }
 private var _visibility: ImageVector? = null
@@ -255,48 +254,49 @@
         if (_visibilityOff != null) {
             return _visibilityOff!!
         }
-        _visibilityOff = materialIcon(name = "Filled.VisibilityOff") {
-            materialPath {
-                moveTo(12.0f, 7.0f)
-                curveToRelative(2.76f, 0.0f, 5.0f, 2.24f, 5.0f, 5.0f)
-                curveToRelative(0.0f, 0.65f, -0.13f, 1.26f, -0.36f, 1.83f)
-                lineToRelative(2.92f, 2.92f)
-                curveToRelative(1.51f, -1.26f, 2.7f, -2.89f, 3.43f, -4.75f)
-                curveToRelative(-1.73f, -4.39f, -6.0f, -7.5f, -11.0f, -7.5f)
-                curveToRelative(-1.4f, 0.0f, -2.74f, 0.25f, -3.98f, 0.7f)
-                lineToRelative(2.16f, 2.16f)
-                curveTo(10.74f, 7.13f, 11.35f, 7.0f, 12.0f, 7.0f)
-                close()
-                moveTo(2.0f, 4.27f)
-                lineToRelative(2.28f, 2.28f)
-                lineToRelative(0.46f, 0.46f)
-                curveTo(3.08f, 8.3f, 1.78f, 10.02f, 1.0f, 12.0f)
-                curveToRelative(1.73f, 4.39f, 6.0f, 7.5f, 11.0f, 7.5f)
-                curveToRelative(1.55f, 0.0f, 3.03f, -0.3f, 4.38f, -0.84f)
-                lineToRelative(0.42f, 0.42f)
-                lineTo(19.73f, 22.0f)
-                lineTo(21.0f, 20.73f)
-                lineTo(3.27f, 3.0f)
-                lineTo(2.0f, 4.27f)
-                close()
-                moveTo(7.53f, 9.8f)
-                lineToRelative(1.55f, 1.55f)
-                curveToRelative(-0.05f, 0.21f, -0.08f, 0.43f, -0.08f, 0.65f)
-                curveToRelative(0.0f, 1.66f, 1.34f, 3.0f, 3.0f, 3.0f)
-                curveToRelative(0.22f, 0.0f, 0.44f, -0.03f, 0.65f, -0.08f)
-                lineToRelative(1.55f, 1.55f)
-                curveToRelative(-0.67f, 0.33f, -1.41f, 0.53f, -2.2f, 0.53f)
-                curveToRelative(-2.76f, 0.0f, -5.0f, -2.24f, -5.0f, -5.0f)
-                curveToRelative(0.0f, -0.79f, 0.2f, -1.53f, 0.53f, -2.2f)
-                close()
-                moveTo(11.84f, 9.02f)
-                lineToRelative(3.15f, 3.15f)
-                lineToRelative(0.02f, -0.16f)
-                curveToRelative(0.0f, -1.66f, -1.34f, -3.0f, -3.0f, -3.0f)
-                lineToRelative(-0.17f, 0.01f)
-                close()
+        _visibilityOff =
+            materialIcon(name = "Filled.VisibilityOff") {
+                materialPath {
+                    moveTo(12.0f, 7.0f)
+                    curveToRelative(2.76f, 0.0f, 5.0f, 2.24f, 5.0f, 5.0f)
+                    curveToRelative(0.0f, 0.65f, -0.13f, 1.26f, -0.36f, 1.83f)
+                    lineToRelative(2.92f, 2.92f)
+                    curveToRelative(1.51f, -1.26f, 2.7f, -2.89f, 3.43f, -4.75f)
+                    curveToRelative(-1.73f, -4.39f, -6.0f, -7.5f, -11.0f, -7.5f)
+                    curveToRelative(-1.4f, 0.0f, -2.74f, 0.25f, -3.98f, 0.7f)
+                    lineToRelative(2.16f, 2.16f)
+                    curveTo(10.74f, 7.13f, 11.35f, 7.0f, 12.0f, 7.0f)
+                    close()
+                    moveTo(2.0f, 4.27f)
+                    lineToRelative(2.28f, 2.28f)
+                    lineToRelative(0.46f, 0.46f)
+                    curveTo(3.08f, 8.3f, 1.78f, 10.02f, 1.0f, 12.0f)
+                    curveToRelative(1.73f, 4.39f, 6.0f, 7.5f, 11.0f, 7.5f)
+                    curveToRelative(1.55f, 0.0f, 3.03f, -0.3f, 4.38f, -0.84f)
+                    lineToRelative(0.42f, 0.42f)
+                    lineTo(19.73f, 22.0f)
+                    lineTo(21.0f, 20.73f)
+                    lineTo(3.27f, 3.0f)
+                    lineTo(2.0f, 4.27f)
+                    close()
+                    moveTo(7.53f, 9.8f)
+                    lineToRelative(1.55f, 1.55f)
+                    curveToRelative(-0.05f, 0.21f, -0.08f, 0.43f, -0.08f, 0.65f)
+                    curveToRelative(0.0f, 1.66f, 1.34f, 3.0f, 3.0f, 3.0f)
+                    curveToRelative(0.22f, 0.0f, 0.44f, -0.03f, 0.65f, -0.08f)
+                    lineToRelative(1.55f, 1.55f)
+                    curveToRelative(-0.67f, 0.33f, -1.41f, 0.53f, -2.2f, 0.53f)
+                    curveToRelative(-2.76f, 0.0f, -5.0f, -2.24f, -5.0f, -5.0f)
+                    curveToRelative(0.0f, -0.79f, 0.2f, -1.53f, 0.53f, -2.2f)
+                    close()
+                    moveTo(11.84f, 9.02f)
+                    lineToRelative(3.15f, 3.15f)
+                    lineToRelative(0.02f, -0.16f)
+                    curveToRelative(0.0f, -1.66f, -1.34f, -3.0f, -3.0f, -3.0f)
+                    lineToRelative(-0.17f, 0.01f)
+                    close()
+                }
             }
-        }
         return _visibilityOff!!
     }
 private var _visibilityOff: ImageVector? = null
@@ -305,30 +305,24 @@
 @Sampled
 @Composable
 fun TextFieldSample() {
-    var text by rememberSaveable(stateSaver = TextFieldValue.Saver) {
-        mutableStateOf(TextFieldValue("example", TextRange(0, 7)))
-    }
+    var text by
+        rememberSaveable(stateSaver = TextFieldValue.Saver) {
+            mutableStateOf(TextFieldValue("example", TextRange(0, 7)))
+        }
 
-    TextField(
-        value = text,
-        onValueChange = { text = it },
-        label = { Text("Label") }
-    )
+    TextField(value = text, onValueChange = { text = it }, label = { Text("Label") })
 }
 
 @Preview
 @Sampled
 @Composable
 fun OutlinedTextFieldSample() {
-    var text by rememberSaveable(stateSaver = TextFieldValue.Saver) {
-        mutableStateOf(TextFieldValue("example", TextRange(0, 7)))
-    }
+    var text by
+        rememberSaveable(stateSaver = TextFieldValue.Saver) {
+            mutableStateOf(TextFieldValue("example", TextRange(0, 7)))
+        }
 
-    OutlinedTextField(
-        value = text,
-        onValueChange = { text = it },
-        label = { Text("Label") }
-    )
+    OutlinedTextField(value = text, onValueChange = { text = it }, label = { Text("Label") })
 }
 
 @OptIn(ExperimentalComposeUiApi::class)
@@ -343,12 +337,13 @@
         onValueChange = { text = it },
         label = { Text("Label") },
         keyboardOptions = KeyboardOptions(imeAction = ImeAction.Done),
-        keyboardActions = KeyboardActions(
-            onDone = {
-                keyboardController?.hide()
-                // do something here
-            }
-        )
+        keyboardActions =
+            KeyboardActions(
+                onDone = {
+                    keyboardController?.hide()
+                    // do something here
+                }
+            )
     )
 }
 
@@ -356,8 +351,7 @@
 fun TextArea() {
     var text by rememberSaveable {
         mutableStateOf(
-            "This is a very long input that extends beyond " +
-                "the height of the text area."
+            "This is a very long input that extends beyond " + "the height of the text area."
         )
     }
     TextField(
@@ -407,9 +401,8 @@
                 interactionSource = interactionSource,
                 supportingText = { Text("Supporting text") },
                 // keep horizontal paddings but change the vertical
-                contentPadding = TextFieldDefaults.contentPaddingWithoutLabel(
-                    top = 8.dp, bottom = 8.dp
-                ),
+                contentPadding =
+                    TextFieldDefaults.contentPaddingWithoutLabel(top = 8.dp, bottom = 8.dp),
             )
         }
     }
@@ -432,10 +425,11 @@
         val enabled = true
         val singleLine = true
 
-        val colors = OutlinedTextFieldDefaults.colors(
-            unfocusedBorderColor = Color.LightGray,
-            focusedBorderColor = Color.DarkGray
-        )
+        val colors =
+            OutlinedTextFieldDefaults.colors(
+                unfocusedBorderColor = Color.LightGray,
+                focusedBorderColor = Color.DarkGray
+            )
         BasicTextField(
             value = value,
             onValueChange = onValueChange,
@@ -456,9 +450,8 @@
                 interactionSource = interactionSource,
                 supportingText = { Text("Supporting text") },
                 // keep horizontal paddings but change the vertical
-                contentPadding = OutlinedTextFieldDefaults.contentPadding(
-                    top = 8.dp, bottom = 8.dp
-                ),
+                contentPadding =
+                    OutlinedTextFieldDefaults.contentPadding(top = 8.dp, bottom = 8.dp),
                 // update border colors
                 colors = colors,
                 // update border thickness and shape
diff --git a/compose/material3/material3/samples/src/main/java/androidx/compose/material3/samples/TextSamples.kt b/compose/material3/material3/samples/src/main/java/androidx/compose/material3/samples/TextSamples.kt
index 39f454ee..392bb12e 100644
--- a/compose/material3/material3/samples/src/main/java/androidx/compose/material3/samples/TextSamples.kt
+++ b/compose/material3/material3/samples/src/main/java/androidx/compose/material3/samples/TextSamples.kt
@@ -39,9 +39,7 @@
 
     val annotatedString = buildAnnotatedString {
         append("Build better apps faster with ")
-        withLink(
-            LinkAnnotation.Url(url = url, styles = TextLinkStyles(style = linkStyle))
-        ) {
+        withLink(LinkAnnotation.Url(url = url, styles = TextLinkStyles(style = linkStyle))) {
             append("Jetpack Compose")
         }
     }
diff --git a/compose/material3/material3/samples/src/main/java/androidx/compose/material3/samples/ThemeSamples.kt b/compose/material3/material3/samples/src/main/java/androidx/compose/material3/samples/ThemeSamples.kt
index 52ef2df..395a89b 100644
--- a/compose/material3/material3/samples/src/main/java/androidx/compose/material3/samples/ThemeSamples.kt
+++ b/compose/material3/material3/samples/src/main/java/androidx/compose/material3/samples/ThemeSamples.kt
@@ -55,40 +55,29 @@
     val isDarkTheme = isSystemInDarkTheme()
     val supportsDynamicColor = Build.VERSION.SDK_INT >= Build.VERSION_CODES.S
 
-    val lightColorScheme = lightColorScheme(
-        primary = Color(0xFF1EB980)
-    )
+    val lightColorScheme = lightColorScheme(primary = Color(0xFF1EB980))
 
-    val darkColorScheme = darkColorScheme(
-        primary = Color(0xFF66ffc7)
-    )
+    val darkColorScheme = darkColorScheme(primary = Color(0xFF66ffc7))
 
-    val colorScheme = when {
-        supportsDynamicColor && isDarkTheme -> {
-            dynamicDarkColorScheme(LocalContext.current)
+    val colorScheme =
+        when {
+            supportsDynamicColor && isDarkTheme -> {
+                dynamicDarkColorScheme(LocalContext.current)
+            }
+            supportsDynamicColor && !isDarkTheme -> {
+                dynamicLightColorScheme(LocalContext.current)
+            }
+            isDarkTheme -> darkColorScheme
+            else -> lightColorScheme
         }
-        supportsDynamicColor && !isDarkTheme -> {
-            dynamicLightColorScheme(LocalContext.current)
-        }
-        isDarkTheme -> darkColorScheme
-        else -> lightColorScheme
-    }
 
-    val typography = Typography(
-        displaySmall = TextStyle(
-            fontWeight = FontWeight.W100,
-            fontSize = 96.sp
-        ),
-        labelLarge = TextStyle(
-            fontWeight = FontWeight.W600,
-            fontSize = 14.sp
+    val typography =
+        Typography(
+            displaySmall = TextStyle(fontWeight = FontWeight.W100, fontSize = 96.sp),
+            labelLarge = TextStyle(fontWeight = FontWeight.W600, fontSize = 14.sp)
         )
-    )
 
-    val shapes = Shapes(
-        extraSmall = RoundedCornerShape(3.0.dp),
-        small = RoundedCornerShape(6.0.dp)
-    )
+    val shapes = Shapes(extraSmall = RoundedCornerShape(3.0.dp), small = RoundedCornerShape(6.0.dp))
 
     MaterialTheme(colorScheme = colorScheme, typography = typography, shapes = shapes) {
         val currentTheme = if (!isSystemInDarkTheme()) "light" else "dark"
@@ -105,11 +94,7 @@
 @Composable
 fun ThemeColorSample() {
     val colorScheme = MaterialTheme.colorScheme
-    Box(
-        Modifier
-            .aspectRatio(1f)
-            .fillMaxSize()
-            .background(color = colorScheme.primary))
+    Box(Modifier.aspectRatio(1f).fillMaxSize().background(color = colorScheme.primary))
 }
 
 @Preview
@@ -125,10 +110,5 @@
 @Composable
 fun ThemeShapeSample() {
     val shape = MaterialTheme.shapes
-    Button(
-        shape = shape.small,
-        onClick = {}
-    ) {
-        Text("FAB with ${shape.small} shape")
-    }
+    Button(shape = shape.small, onClick = {}) { Text("FAB with ${shape.small} shape") }
 }
diff --git a/compose/material3/material3/samples/src/main/java/androidx/compose/material3/samples/TimePickerSamples.kt b/compose/material3/material3/samples/src/main/java/androidx/compose/material3/samples/TimePickerSamples.kt
index 5ee9ff0f..98b620c 100644
--- a/compose/material3/material3/samples/src/main/java/androidx/compose/material3/samples/TimePickerSamples.kt
+++ b/compose/material3/material3/samples/src/main/java/androidx/compose/material3/samples/TimePickerSamples.kt
@@ -73,10 +73,7 @@
     val snackScope = rememberCoroutineScope()
 
     Box(propagateMinConstraints = false) {
-        Button(
-            modifier = Modifier.align(Alignment.Center),
-            onClick = { showTimePicker = true }
-        ) {
+        Button(modifier = Modifier.align(Alignment.Center), onClick = { showTimePicker = true }) {
             Text("Set Time")
         }
         SnackbarHost(hostState = snackState)
@@ -113,10 +110,7 @@
     val snackScope = rememberCoroutineScope()
 
     Box(propagateMinConstraints = false) {
-        Button(
-            modifier = Modifier.align(Alignment.Center),
-            onClick = { showTimePicker = true }
-        ) {
+        Button(modifier = Modifier.align(Alignment.Center), onClick = { showTimePicker = true }) {
             Text("Set Time")
         }
         SnackbarHost(hostState = snackState)
@@ -155,10 +149,7 @@
     val configuration = LocalConfiguration.current
 
     Box(propagateMinConstraints = false) {
-        Button(
-            modifier = Modifier.align(Alignment.Center),
-            onClick = { showTimePicker = true }
-        ) {
+        Button(modifier = Modifier.align(Alignment.Center), onClick = { showTimePicker = true }) {
             Text("Set Time")
         }
         SnackbarHost(hostState = snackState)
@@ -166,11 +157,12 @@
 
     if (showTimePicker) {
         TimePickerDialog(
-            title = if (showingPicker.value) {
-                "Select Time "
-            } else {
-                "Enter Time"
-            },
+            title =
+                if (showingPicker.value) {
+                    "Select Time "
+                } else {
+                    "Enter Time"
+                },
             onCancel = { showTimePicker = false },
             onConfirm = {
                 val cal = Calendar.getInstance()
@@ -185,18 +177,20 @@
             toggle = {
                 if (configuration.screenHeightDp > 400) {
                     IconButton(onClick = { showingPicker.value = !showingPicker.value }) {
-                        val icon = if (showingPicker.value) {
-                            Icons.Outlined.Keyboard
-                        } else {
-                            Icons.Outlined.Schedule
-                        }
+                        val icon =
+                            if (showingPicker.value) {
+                                Icons.Outlined.Keyboard
+                            } else {
+                                Icons.Outlined.Schedule
+                            }
                         Icon(
                             icon,
-                            contentDescription = if (showingPicker.value) {
-                                "Switch to Text Input"
-                            } else {
-                                "Switch to Touch Input"
-                            }
+                            contentDescription =
+                                if (showingPicker.value) {
+                                    "Switch to Text Input"
+                                } else {
+                                    "Switch to Touch Input"
+                                }
                         )
                     }
                 }
@@ -226,38 +220,29 @@
         Surface(
             shape = MaterialTheme.shapes.extraLarge,
             tonalElevation = 6.dp,
-            modifier = Modifier
-                .width(IntrinsicSize.Min)
-                .height(IntrinsicSize.Min)
-                .background(
-                    shape = MaterialTheme.shapes.extraLarge,
-                    color = MaterialTheme.colorScheme.surface
-                ),
+            modifier =
+                Modifier.width(IntrinsicSize.Min)
+                    .height(IntrinsicSize.Min)
+                    .background(
+                        shape = MaterialTheme.shapes.extraLarge,
+                        color = MaterialTheme.colorScheme.surface
+                    ),
         ) {
             Column(
                 modifier = Modifier.padding(24.dp),
                 horizontalAlignment = Alignment.CenterHorizontally
             ) {
                 Text(
-                    modifier = Modifier
-                        .fillMaxWidth()
-                        .padding(bottom = 20.dp),
+                    modifier = Modifier.fillMaxWidth().padding(bottom = 20.dp),
                     text = title,
                     style = MaterialTheme.typography.labelMedium
                 )
                 content()
-                Row(modifier = Modifier
-                    .height(40.dp)
-                    .fillMaxWidth()
-                ) {
+                Row(modifier = Modifier.height(40.dp).fillMaxWidth()) {
                     toggle()
                     Spacer(modifier = Modifier.weight(1f))
-                    TextButton(onClick = onCancel) {
-                        Text("Cancel")
-                    }
-                    TextButton(onClick = onConfirm) {
-                        Text("OK")
-                    }
+                    TextButton(onClick = onCancel) { Text("Cancel") }
+                    TextButton(onClick = onConfirm) { Text("OK") }
                 }
             }
         }
diff --git a/compose/material3/material3/samples/src/main/java/androidx/compose/material3/samples/TooltipSamples.kt b/compose/material3/material3/samples/src/main/java/androidx/compose/material3/samples/TooltipSamples.kt
index 51b1518..bd37b75 100644
--- a/compose/material3/material3/samples/src/main/java/androidx/compose/material3/samples/TooltipSamples.kt
+++ b/compose/material3/material3/samples/src/main/java/androidx/compose/material3/samples/TooltipSamples.kt
@@ -51,20 +51,11 @@
 fun PlainTooltipSample() {
     TooltipBox(
         positionProvider = TooltipDefaults.rememberPlainTooltipPositionProvider(),
-        tooltip = {
-            PlainTooltip {
-                Text("Add to favorites")
-            }
-        },
+        tooltip = { PlainTooltip { Text("Add to favorites") } },
         state = rememberTooltipState()
     ) {
-        IconButton(
-            onClick = { /* Icon button's click event */ }
-        ) {
-            Icon(
-                imageVector = Icons.Filled.Favorite,
-                contentDescription = "Localized Description"
-            )
+        IconButton(onClick = { /* Icon button's click event */ }) {
+            Icon(imageVector = Icons.Filled.Favorite, contentDescription = "Localized Description")
         }
     }
 }
@@ -76,27 +67,16 @@
 fun PlainTooltipWithManualInvocationSample() {
     val tooltipState = rememberTooltipState()
     val scope = rememberCoroutineScope()
-    Column(
-        horizontalAlignment = Alignment.CenterHorizontally
-    ) {
+    Column(horizontalAlignment = Alignment.CenterHorizontally) {
         TooltipBox(
             positionProvider = TooltipDefaults.rememberPlainTooltipPositionProvider(),
-            tooltip = {
-                PlainTooltip {
-                    Text("Add to list")
-                }
-            },
+            tooltip = { PlainTooltip { Text("Add to list") } },
             state = tooltipState
         ) {
-            Icon(
-                imageVector = Icons.Filled.AddCircle,
-                contentDescription = "Localized Description"
-            )
+            Icon(imageVector = Icons.Filled.AddCircle, contentDescription = "Localized Description")
         }
         Spacer(Modifier.requiredHeight(30.dp))
-        OutlinedButton(
-            onClick = { scope.launch { tooltipState.show() } }
-        ) {
+        OutlinedButton(onClick = { scope.launch { tooltipState.show() } }) {
             Text("Display tooltip")
         }
     }
@@ -109,21 +89,12 @@
     TooltipBox(
         positionProvider = TooltipDefaults.rememberPlainTooltipPositionProvider(),
         tooltip = {
-            PlainTooltip(
-                caretSize = TooltipDefaults.caretSize
-            ) {
-                Text("Add to favorites")
-            }
+            PlainTooltip(caretSize = TooltipDefaults.caretSize) { Text("Add to favorites") }
         },
         state = rememberTooltipState()
     ) {
-        IconButton(
-            onClick = { /* Icon button's click event */ }
-        ) {
-            Icon(
-                imageVector = Icons.Filled.Favorite,
-                contentDescription = "Localized Description"
-            )
+        IconButton(onClick = { /* Icon button's click event */ }) {
+            Icon(imageVector = Icons.Filled.Favorite, contentDescription = "Localized Description")
         }
     }
 }
@@ -134,22 +105,11 @@
 fun PlainTooltipWithCustomCaret() {
     TooltipBox(
         positionProvider = TooltipDefaults.rememberPlainTooltipPositionProvider(),
-        tooltip = {
-            PlainTooltip(
-                caretSize = DpSize(24.dp, 12.dp)
-            ) {
-                Text("Add to favorites")
-            }
-        },
+        tooltip = { PlainTooltip(caretSize = DpSize(24.dp, 12.dp)) { Text("Add to favorites") } },
         state = rememberTooltipState()
     ) {
-        IconButton(
-            onClick = { /* Icon button's click event */ }
-        ) {
-            Icon(
-                imageVector = Icons.Filled.Favorite,
-                contentDescription = "Localized Description"
-            )
+        IconButton(onClick = { /* Icon button's click event */ }) {
+            Icon(imageVector = Icons.Filled.Favorite, contentDescription = "Localized Description")
         }
     }
 }
@@ -166,9 +126,9 @@
             RichTooltip(
                 title = { Text(richTooltipSubheadText) },
                 action = {
-                    TextButton(
-                        onClick = { scope.launch { tooltipState.dismiss() } }
-                    ) { Text(richTooltipActionText) }
+                    TextButton(onClick = { scope.launch { tooltipState.dismiss() } }) {
+                        Text(richTooltipActionText)
+                    }
                 }
             ) {
                 Text(richTooltipText)
@@ -176,13 +136,8 @@
         },
         state = tooltipState
     ) {
-        IconButton(
-            onClick = { /* Icon button's click event */ }
-        ) {
-            Icon(
-                imageVector = Icons.Filled.Info,
-                contentDescription = "Localized Description"
-            )
+        IconButton(onClick = { /* Icon button's click event */ }) {
+            Icon(imageVector = Icons.Filled.Info, contentDescription = "Localized Description")
         }
     }
 }
@@ -193,36 +148,27 @@
 fun RichTooltipWithManualInvocationSample() {
     val tooltipState = rememberTooltipState(isPersistent = true)
     val scope = rememberCoroutineScope()
-    Column(
-        horizontalAlignment = Alignment.CenterHorizontally
-    ) {
+    Column(horizontalAlignment = Alignment.CenterHorizontally) {
         TooltipBox(
             positionProvider = TooltipDefaults.rememberRichTooltipPositionProvider(),
             tooltip = {
                 RichTooltip(
                     title = { Text(richTooltipSubheadText) },
                     action = {
-                        TextButton(
-                            onClick = {
-                                scope.launch {
-                                    tooltipState.dismiss()
-                                }
-                            }
-                        ) { Text(richTooltipActionText) }
+                        TextButton(onClick = { scope.launch { tooltipState.dismiss() } }) {
+                            Text(richTooltipActionText)
+                        }
                     }
-                ) { Text(richTooltipText) }
+                ) {
+                    Text(richTooltipText)
+                }
             },
             state = tooltipState
         ) {
-            Icon(
-                imageVector = Icons.Filled.Info,
-                contentDescription = "Localized Description"
-            )
+            Icon(imageVector = Icons.Filled.Info, contentDescription = "Localized Description")
         }
         Spacer(Modifier.requiredHeight(30.dp))
-        OutlinedButton(
-            onClick = { scope.launch { tooltipState.show() } }
-        ) {
+        OutlinedButton(onClick = { scope.launch { tooltipState.show() } }) {
             Text("Display tooltip")
         }
     }
@@ -240,9 +186,9 @@
             RichTooltip(
                 title = { Text(richTooltipSubheadText) },
                 action = {
-                    TextButton(
-                        onClick = { scope.launch { tooltipState.dismiss() } }
-                    ) { Text(richTooltipActionText) }
+                    TextButton(onClick = { scope.launch { tooltipState.dismiss() } }) {
+                        Text(richTooltipActionText)
+                    }
                 },
                 caretSize = TooltipDefaults.caretSize
             ) {
@@ -251,13 +197,8 @@
         },
         state = tooltipState
     ) {
-        IconButton(
-            onClick = { /* Icon button's click event */ }
-        ) {
-            Icon(
-                imageVector = Icons.Filled.Info,
-                contentDescription = "Localized Description"
-            )
+        IconButton(onClick = { /* Icon button's click event */ }) {
+            Icon(imageVector = Icons.Filled.Info, contentDescription = "Localized Description")
         }
     }
 }
@@ -274,9 +215,9 @@
             RichTooltip(
                 title = { Text(richTooltipSubheadText) },
                 action = {
-                    TextButton(
-                        onClick = { scope.launch { tooltipState.dismiss() } }
-                    ) { Text(richTooltipActionText) }
+                    TextButton(onClick = { scope.launch { tooltipState.dismiss() } }) {
+                        Text(richTooltipActionText)
+                    }
                 },
                 caretSize = DpSize(32.dp, 16.dp)
             ) {
@@ -285,13 +226,8 @@
         },
         state = tooltipState
     ) {
-        IconButton(
-            onClick = { /* Icon button's click event */ }
-        ) {
-            Icon(
-                imageVector = Icons.Filled.Info,
-                contentDescription = "Localized Description"
-            )
+        IconButton(onClick = { /* Icon button's click event */ }) {
+            Icon(imageVector = Icons.Filled.Info, contentDescription = "Localized Description")
         }
     }
 }
diff --git a/compose/material3/material3/src/androidInstrumentedTest/kotlin/androidx/compose/material3/AlertDialogScreenshotTest.kt b/compose/material3/material3/src/androidInstrumentedTest/kotlin/androidx/compose/material3/AlertDialogScreenshotTest.kt
index ec36cd9..a7987a3 100644
--- a/compose/material3/material3/src/androidInstrumentedTest/kotlin/androidx/compose/material3/AlertDialogScreenshotTest.kt
+++ b/compose/material3/material3/src/androidInstrumentedTest/kotlin/androidx/compose/material3/AlertDialogScreenshotTest.kt
@@ -39,20 +39,16 @@
 @SdkSuppress(minSdkVersion = Build.VERSION_CODES.O)
 class AlertDialogScreenshotTest {
 
-    @get:Rule
-    val composeTestRule = createComposeRule()
+    @get:Rule val composeTestRule = createComposeRule()
 
-    @get:Rule
-    val screenshotRule = AndroidXScreenshotTestRule(GOLDEN_MATERIAL3)
+    @get:Rule val screenshotRule = AndroidXScreenshotTestRule(GOLDEN_MATERIAL3)
 
     @Test
     fun alertDialog_lightTheme() {
         composeTestRule.setMaterialContent(lightColorScheme()) {
             AlertDialog(
                 onDismissRequest = {},
-                title = {
-                    Text(text = "Title")
-                },
+                title = { Text(text = "Title") },
                 text = {
                     Text(
                         "This area typically contains the supportive text " +
@@ -60,14 +56,10 @@
                     )
                 },
                 confirmButton = {
-                    TextButton(onClick = { /* doSomething() */ }) {
-                        Text("Confirm")
-                    }
+                    TextButton(onClick = { /* doSomething() */ }) { Text("Confirm") }
                 },
                 dismissButton = {
-                    TextButton(onClick = { /* doSomething() */ }) {
-                        Text("Dismiss")
-                    }
+                    TextButton(onClick = { /* doSomething() */ }) { Text("Dismiss") }
                 }
             )
         }
@@ -80,9 +72,7 @@
         composeTestRule.setMaterialContent(darkColorScheme()) {
             AlertDialog(
                 onDismissRequest = {},
-                title = {
-                    Text(text = "Title")
-                },
+                title = { Text(text = "Title") },
                 text = {
                     Text(
                         "This area typically contains the supportive text " +
@@ -90,14 +80,10 @@
                     )
                 },
                 confirmButton = {
-                    TextButton(onClick = { /* doSomething() */ }) {
-                        Text("Confirm")
-                    }
+                    TextButton(onClick = { /* doSomething() */ }) { Text("Confirm") }
                 },
                 dismissButton = {
-                    TextButton(onClick = { /* doSomething() */ }) {
-                        Text("Dismiss")
-                    }
+                    TextButton(onClick = { /* doSomething() */ }) { Text("Dismiss") }
                 }
             )
         }
@@ -111,9 +97,7 @@
             AlertDialog(
                 onDismissRequest = {},
                 icon = { Icon(Icons.Filled.Favorite, contentDescription = null) },
-                title = {
-                    Text(text = "Title")
-                },
+                title = { Text(text = "Title") },
                 text = {
                     Text(
                         "This area typically contains the supportive text " +
@@ -121,14 +105,10 @@
                     )
                 },
                 confirmButton = {
-                    TextButton(onClick = { /* doSomething() */ }) {
-                        Text("Confirm")
-                    }
+                    TextButton(onClick = { /* doSomething() */ }) { Text("Confirm") }
                 },
                 dismissButton = {
-                    TextButton(onClick = { /* doSomething() */ }) {
-                        Text("Dismiss")
-                    }
+                    TextButton(onClick = { /* doSomething() */ }) { Text("Dismiss") }
                 }
             )
         }
@@ -142,9 +122,7 @@
             AlertDialog(
                 onDismissRequest = {},
                 icon = { Icon(Icons.Filled.Favorite, contentDescription = null) },
-                title = {
-                    Text(text = "Title")
-                },
+                title = { Text(text = "Title") },
                 text = {
                     Text(
                         "This area typically contains the supportive text " +
@@ -152,14 +130,10 @@
                     )
                 },
                 confirmButton = {
-                    TextButton(onClick = { /* doSomething() */ }) {
-                        Text("Confirm")
-                    }
+                    TextButton(onClick = { /* doSomething() */ }) { Text("Confirm") }
                 },
                 dismissButton = {
-                    TextButton(onClick = { /* doSomething() */ }) {
-                        Text("Dismiss")
-                    }
+                    TextButton(onClick = { /* doSomething() */ }) { Text("Dismiss") }
                 }
             )
         }
@@ -173,9 +147,7 @@
             CompositionLocalProvider(LocalLayoutDirection provides LayoutDirection.Rtl) {
                 AlertDialog(
                     onDismissRequest = {},
-                    title = {
-                        Text(text = "Title")
-                    },
+                    title = { Text(text = "Title") },
                     text = {
                         Text(
                             "This area typically contains the supportive text " +
@@ -183,14 +155,10 @@
                         )
                     },
                     confirmButton = {
-                        TextButton(onClick = { /* doSomething() */ }) {
-                            Text("Confirm")
-                        }
+                        TextButton(onClick = { /* doSomething() */ }) { Text("Confirm") }
                     },
                     dismissButton = {
-                        TextButton(onClick = { /* doSomething() */ }) {
-                            Text("Dismiss")
-                        }
+                        TextButton(onClick = { /* doSomething() */ }) { Text("Dismiss") }
                     }
                 )
             }
@@ -199,7 +167,8 @@
     }
 
     private fun assertAlertDialogAgainstGolden(goldenIdentifier: String) {
-        composeTestRule.onNode(isDialog())
+        composeTestRule
+            .onNode(isDialog())
             .captureToImage()
             .assertAgainstGolden(screenshotRule, goldenIdentifier)
     }
diff --git a/compose/material3/material3/src/androidInstrumentedTest/kotlin/androidx/compose/material3/AlertDialogTest.kt b/compose/material3/material3/src/androidInstrumentedTest/kotlin/androidx/compose/material3/AlertDialogTest.kt
index 543179a..b671777 100644
--- a/compose/material3/material3/src/androidInstrumentedTest/kotlin/androidx/compose/material3/AlertDialogTest.kt
+++ b/compose/material3/material3/src/androidInstrumentedTest/kotlin/androidx/compose/material3/AlertDialogTest.kt
@@ -62,8 +62,7 @@
 @SdkSuppress(minSdkVersion = Build.VERSION_CODES.P)
 class AlertDialogTest {
 
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
     @Test
     fun customStyleProperties_shouldApply() {
@@ -104,7 +103,8 @@
         }
 
         // Assert background
-        rule.onNode(isDialog())
+        rule
+            .onNode(isDialog())
             .captureToImage()
             .assertContainsColor(Color.Yellow) // Background
             .assertContainsColor(Color.Blue) // Modifier border
@@ -118,9 +118,7 @@
         }
     }
 
-    /**
-     * Ensure that Dialogs don't press up against the edges of the screen.
-     */
+    /** Ensure that Dialogs don't press up against the edges of the screen. */
     @Test
     fun alertDialog_doesNotConsumeFullScreenWidth() {
         val dialogWidthCh = Channel<Int>(Channel.CONFLATED)
@@ -136,9 +134,8 @@
             }
 
             AlertDialog(
-                modifier = Modifier
-                    .onSizeChanged { dialogWidthCh.trySend(it.width) }
-                    .fillMaxWidth(),
+                modifier =
+                    Modifier.onSizeChanged { dialogWidthCh.trySend(it.width) }.fillMaxWidth(),
                 onDismissRequest = {},
                 title = { Text(text = "Title") },
                 text = {
@@ -148,14 +145,10 @@
                     )
                 },
                 confirmButton = {
-                    TextButton(onClick = { /* doSomething() */ }) {
-                        Text("Confirm")
-                    }
+                    TextButton(onClick = { /* doSomething() */ }) { Text("Confirm") }
                 },
                 dismissButton = {
-                    TextButton(onClick = { /* doSomething() */ }) {
-                        Text("Dismiss")
-                    }
+                    TextButton(onClick = { /* doSomething() */ }) { Text("Dismiss") }
                 },
             )
         }
@@ -167,9 +160,7 @@
         }
     }
 
-    /**
-     * Ensure that a dialog with custom content don't press up against the edges of the screen.
-     */
+    /** Ensure that a dialog with custom content don't press up against the edges of the screen. */
     @OptIn(ExperimentalMaterial3Api::class)
     @Test
     fun basicAlertDialog_customContentDoesNotConsumeFullScreenWidth() {
@@ -187,14 +178,15 @@
 
             BasicAlertDialog(onDismissRequest = {}) {
                 Surface(
-                    modifier = Modifier
-                        .onSizeChanged { dialogWidthCh.trySend(it.width) }
-                        .wrapContentHeight()
-                        .fillMaxWidth()
+                    modifier =
+                        Modifier.onSizeChanged { dialogWidthCh.trySend(it.width) }
+                            .wrapContentHeight()
+                            .fillMaxWidth()
                 ) {
                     Text(
-                        text = "This area typically contains the supportive text " +
-                            "which presents the details regarding the Dialog's purpose.",
+                        text =
+                            "This area typically contains the supportive text " +
+                                "which presents the details regarding the Dialog's purpose.",
                     )
                 }
             }
@@ -219,9 +211,7 @@
                 title = { Text(text = "Title") },
                 text = { Text("Short") },
                 confirmButton = {
-                    TextButton(onClick = { /* doSomething() */ }) {
-                        Text("Confirm")
-                    }
+                    TextButton(onClick = { /* doSomething() */ }) { Text("Confirm") }
                 }
             )
         }
@@ -241,10 +231,7 @@
         rule.setContent {
             with(LocalDensity.current) { minDialogWidth = DialogMinWidth.roundToPx() }
             BasicAlertDialog(onDismissRequest = {}) {
-                Surface(
-                    modifier = Modifier
-                        .onSizeChanged { dialogWidthCh.trySend(it.width) }
-                ) {
+                Surface(modifier = Modifier.onSizeChanged { dialogWidthCh.trySend(it.width) }) {
                     Text("Short")
                 }
             }
@@ -264,14 +251,8 @@
         var customMinDialogWidth = 0
         rule.setContent {
             with(LocalDensity.current) { customMinDialogWidth = 150.dp.roundToPx() }
-            BasicAlertDialog(
-                onDismissRequest = {},
-                Modifier.width(width = 150.dp)
-            ) {
-                Surface(
-                    modifier = Modifier
-                        .onSizeChanged { dialogWidthCh.trySend(it.width) }
-                ) {
+            BasicAlertDialog(onDismissRequest = {}, Modifier.width(width = 150.dp)) {
+                Surface(modifier = Modifier.onSizeChanged { dialogWidthCh.trySend(it.width) }) {
                     Text("Short")
                 }
             }
@@ -300,9 +281,7 @@
                 confirmButton = {
                     TextButton(
                         onClick = { /* doSomething() */ },
-                        Modifier
-                            .testTag(ConfirmButtonTestTag)
-                            .semantics(mergeDescendants = true) {}
+                        Modifier.testTag(ConfirmButtonTestTag).semantics(mergeDescendants = true) {}
                     ) {
                         Text("Confirm")
                     }
@@ -310,9 +289,7 @@
                 dismissButton = {
                     TextButton(
                         onClick = { /* doSomething() */ },
-                        Modifier
-                            .testTag(DismissButtonTestTag)
-                            .semantics(mergeDescendants = true) {}
+                        Modifier.testTag(DismissButtonTestTag).semantics(mergeDescendants = true) {}
                     ) {
                         Text("Dismiss")
                     }
@@ -327,25 +304,29 @@
         val confirmBtBounds = rule.onNodeWithTag(ConfirmButtonTestTag).getUnclippedBoundsInRoot()
         val dismissBtBounds = rule.onNodeWithTag(DismissButtonTestTag).getUnclippedBoundsInRoot()
 
-        rule.onNodeWithTag(IconTestTag)
+        rule
+            .onNodeWithTag(IconTestTag)
             // Dialog's icon should be centered (icon size is 24dp)
             .assertLeftPositionInRootIsEqualTo((dialogBounds.width - 24.dp) / 2)
             // Dialog's icon should be 24dp from the top
             .assertTopPositionInRootIsEqualTo(24.dp)
 
-        rule.onNodeWithTag(TitleTestTag)
+        rule
+            .onNodeWithTag(TitleTestTag)
             // Title should be centered (default alignment when an icon presence)
             .assertLeftPositionInRootIsEqualTo((dialogBounds.width - titleBounds.width) / 2)
             // Title should be 16dp below the icon.
             .assertTopPositionInRootIsEqualTo(iconBounds.bottom + 16.dp)
 
-        rule.onNodeWithTag(TextTestTag)
+        rule
+            .onNodeWithTag(TextTestTag)
             // Text should be 24dp from the start.
             .assertLeftPositionInRootIsEqualTo(24.dp)
             // Text should be 16dp below the title.
             .assertTopPositionInRootIsEqualTo(titleBounds.bottom + 16.dp)
 
-        rule.onNodeWithTag(ConfirmButtonTestTag)
+        rule
+            .onNodeWithTag(ConfirmButtonTestTag)
             // Confirm button should be 24dp from the right.
             .assertLeftPositionInRootIsEqualTo(dialogBounds.right - 24.dp - confirmBtBounds.width)
             // Buttons should be 24dp from the bottom (test button default height is 48dp).
@@ -378,9 +359,7 @@
                 dismissButton = {
                     TextButton(
                         onClick = { /* doSomething() */ },
-                        Modifier
-                            .testTag(DismissButtonTestTag)
-                            .semantics(mergeDescendants = true) {}
+                        Modifier.testTag(DismissButtonTestTag).semantics(mergeDescendants = true) {}
                     ) {
                         Text("Dismiss")
                     }
@@ -393,19 +372,22 @@
         val textBounds = rule.onNodeWithTag(TextTestTag).getUnclippedBoundsInRoot()
         val dismissBtBounds = rule.onNodeWithTag(DismissButtonTestTag).getUnclippedBoundsInRoot()
 
-        rule.onNodeWithTag(TitleTestTag)
+        rule
+            .onNodeWithTag(TitleTestTag)
             // Title should 24dp from the left.
             .assertLeftPositionInRootIsEqualTo(24.dp)
             // Title should be 24dp from the top.
             .assertTopPositionInRootIsEqualTo(24.dp)
 
-        rule.onNodeWithTag(TextTestTag)
+        rule
+            .onNodeWithTag(TextTestTag)
             // Text should be 24dp from the start.
             .assertLeftPositionInRootIsEqualTo(24.dp)
             // Text should be 16dp below the title.
             .assertTopPositionInRootIsEqualTo(titleBounds.bottom + 16.dp)
 
-        rule.onNodeWithTag(DismissButtonTestTag)
+        rule
+            .onNodeWithTag(DismissButtonTestTag)
             // Dismiss button should be 24dp from the right.
             .assertLeftPositionInRootIsEqualTo(dialogBounds.right - 24.dp - dismissBtBounds.width)
             // Buttons should be 24dp from the bottom (test button default height is 48dp).
@@ -427,9 +409,7 @@
                 confirmButton = {
                     TextButton(
                         onClick = { /* doSomething() */ },
-                        Modifier
-                            .testTag(ConfirmButtonTestTag)
-                            .semantics(mergeDescendants = true) {}
+                        Modifier.testTag(ConfirmButtonTestTag).semantics(mergeDescendants = true) {}
                     ) {
                         Text("Confirm with a long text")
                     }
@@ -437,9 +417,7 @@
                 dismissButton = {
                     TextButton(
                         onClick = { /* doSomething() */ },
-                        Modifier
-                            .testTag(DismissButtonTestTag)
-                            .semantics(mergeDescendants = true) {}
+                        Modifier.testTag(DismissButtonTestTag).semantics(mergeDescendants = true) {}
                     ) {
                         Text("Dismiss with a long text")
                     }
@@ -463,20 +441,14 @@
                 title = { Text(text = "Title", modifier = Modifier.testTag(TitleTestTag)) },
                 text = {
                     LazyColumn(modifier = Modifier.testTag(TextTestTag)) {
-                        items(100) {
-                            Text(
-                                text = "Message!"
-                            )
-                        }
+                        items(100) { Text(text = "Message!") }
                     }
                 },
                 confirmButton = {},
                 dismissButton = {
                     TextButton(
                         onClick = { /* doSomething() */ },
-                        Modifier
-                            .testTag(DismissButtonTestTag)
-                            .semantics(mergeDescendants = true) {}
+                        Modifier.testTag(DismissButtonTestTag).semantics(mergeDescendants = true) {}
                     ) {
                         Text("Dismiss")
                     }
@@ -489,19 +461,22 @@
         val textBounds = rule.onNodeWithTag(TextTestTag).getUnclippedBoundsInRoot()
         val dismissBtBounds = rule.onNodeWithTag(DismissButtonTestTag).getUnclippedBoundsInRoot()
 
-        rule.onNodeWithTag(TitleTestTag)
+        rule
+            .onNodeWithTag(TitleTestTag)
             // Title should 24dp from the left.
             .assertLeftPositionInRootIsEqualTo(24.dp)
             // Title should be 24dp from the top.
             .assertTopPositionInRootIsEqualTo(24.dp)
 
-        rule.onNodeWithTag(TextTestTag)
+        rule
+            .onNodeWithTag(TextTestTag)
             // Text should be 24dp from the start.
             .assertLeftPositionInRootIsEqualTo(24.dp)
             // Text should be 16dp below the title.
             .assertTopPositionInRootIsEqualTo(titleBounds.bottom + 16.dp)
 
-        rule.onNodeWithTag(DismissButtonTestTag)
+        rule
+            .onNodeWithTag(DismissButtonTestTag)
             // Dismiss button should be 24dp from the right.
             .assertLeftPositionInRootIsEqualTo(dialogBounds.right - 24.dp - dismissBtBounds.width)
             // Buttons should be 24dp from the bottom (test button default height is 48dp).
diff --git a/compose/material3/material3/src/androidInstrumentedTest/kotlin/androidx/compose/material3/AppBarScreenshotTest.kt b/compose/material3/material3/src/androidInstrumentedTest/kotlin/androidx/compose/material3/AppBarScreenshotTest.kt
index 7b8d1a5..de222ab 100644
--- a/compose/material3/material3/src/androidInstrumentedTest/kotlin/androidx/compose/material3/AppBarScreenshotTest.kt
+++ b/compose/material3/material3/src/androidInstrumentedTest/kotlin/androidx/compose/material3/AppBarScreenshotTest.kt
@@ -50,11 +50,9 @@
 @OptIn(ExperimentalMaterial3Api::class)
 class AppBarScreenshotTest {
 
-    @get:Rule
-    val composeTestRule = createComposeRule()
+    @get:Rule val composeTestRule = createComposeRule()
 
-    @get:Rule
-    val screenshotRule = AndroidXScreenshotTestRule(GOLDEN_MATERIAL3)
+    @get:Rule val screenshotRule = AndroidXScreenshotTestRule(GOLDEN_MATERIAL3)
 
     @Test
     fun smallAppBar_lightTheme() {
@@ -69,15 +67,10 @@
                             )
                         }
                     },
-                    title = {
-                        Text("Title")
-                    },
+                    title = { Text("Title") },
                     actions = {
                         IconButton(onClick = { /* doSomething() */ }) {
-                            Icon(
-                                imageVector = Icons.Filled.Favorite,
-                                contentDescription = "Like"
-                            )
+                            Icon(imageVector = Icons.Filled.Favorite, contentDescription = "Like")
                         }
                     }
                 )
@@ -103,15 +96,10 @@
                     },
                     scrollBehavior = behavior,
                     windowInsets = WindowInsets(top = 30.dp),
-                    title = {
-                        Text("Title")
-                    },
+                    title = { Text("Title") },
                     actions = {
                         IconButton(onClick = { /* doSomething() */ }) {
-                            Icon(
-                                imageVector = Icons.Filled.Favorite,
-                                contentDescription = "Like"
-                            )
+                            Icon(imageVector = Icons.Filled.Favorite, contentDescription = "Like")
                         }
                     }
                 )
@@ -142,15 +130,10 @@
                             )
                         }
                     },
-                    title = {
-                        Text("Title")
-                    },
+                    title = { Text("Title") },
                     actions = {
                         IconButton(onClick = { /* doSomething() */ }) {
-                            Icon(
-                                imageVector = Icons.Filled.Favorite,
-                                contentDescription = "Like"
-                            )
+                            Icon(imageVector = Icons.Filled.Favorite, contentDescription = "Like")
                         }
                     }
                 )
@@ -173,15 +156,10 @@
                             )
                         }
                     },
-                    title = {
-                        Text("Title")
-                    },
+                    title = { Text("Title") },
                     actions = {
                         IconButton(onClick = { /* doSomething() */ }) {
-                            Icon(
-                                imageVector = Icons.Filled.Favorite,
-                                contentDescription = "Like"
-                            )
+                            Icon(imageVector = Icons.Filled.Favorite, contentDescription = "Like")
                         }
                     }
                 )
@@ -204,15 +182,10 @@
                             )
                         }
                     },
-                    title = {
-                        Text("Title")
-                    },
+                    title = { Text("Title") },
                     actions = {
                         IconButton(onClick = { /* doSomething() */ }) {
-                            Icon(
-                                imageVector = Icons.Filled.Favorite,
-                                contentDescription = "Like"
-                            )
+                            Icon(imageVector = Icons.Filled.Favorite, contentDescription = "Like")
                         }
                     }
                 )
@@ -235,15 +208,10 @@
                             )
                         }
                     },
-                    title = {
-                        Text("Title")
-                    },
+                    title = { Text("Title") },
                     actions = {
                         IconButton(onClick = { /* doSomething() */ }) {
-                            Icon(
-                                imageVector = Icons.Filled.Favorite,
-                                contentDescription = "Like"
-                            )
+                            Icon(imageVector = Icons.Filled.Favorite, contentDescription = "Like")
                         }
                     }
                 )
@@ -266,15 +234,10 @@
                             )
                         }
                     },
-                    title = {
-                        Text("Title")
-                    },
+                    title = { Text("Title") },
                     actions = {
                         IconButton(onClick = { /* doSomething() */ }) {
-                            Icon(
-                                imageVector = Icons.Filled.Favorite,
-                                contentDescription = "Like"
-                            )
+                            Icon(imageVector = Icons.Filled.Favorite, contentDescription = "Like")
                         }
                     }
                 )
@@ -297,15 +260,10 @@
                             )
                         }
                     },
-                    title = {
-                        Text("Title")
-                    },
+                    title = { Text("Title") },
                     actions = {
                         IconButton(onClick = { /* doSomething() */ }) {
-                            Icon(
-                                imageVector = Icons.Filled.Favorite,
-                                contentDescription = "Like"
-                            )
+                            Icon(imageVector = Icons.Filled.Favorite, contentDescription = "Like")
                         }
                     }
                 )
@@ -328,15 +286,10 @@
                             )
                         }
                     },
-                    title = {
-                        Text("Title")
-                    },
+                    title = { Text("Title") },
                     actions = {
                         IconButton(onClick = { /* doSomething() */ }) {
-                            Icon(
-                                imageVector = Icons.Filled.Favorite,
-                                contentDescription = "Like"
-                            )
+                            Icon(imageVector = Icons.Filled.Favorite, contentDescription = "Like")
                         }
                     }
                 )
@@ -353,10 +306,7 @@
                 BottomAppBar(
                     actions = {
                         IconButton(onClick = { /* doSomething() */ }) {
-                            Icon(
-                                imageVector = Icons.Filled.Menu,
-                                contentDescription = "Menu"
-                            )
+                            Icon(imageVector = Icons.Filled.Menu, contentDescription = "Menu")
                         }
                     },
                     floatingActionButton = {
@@ -385,10 +335,7 @@
                 BottomAppBar(
                     actions = {
                         IconButton(onClick = { /* doSomething() */ }) {
-                            Icon(
-                                imageVector = Icons.Filled.Menu,
-                                contentDescription = "Menu"
-                            )
+                            Icon(imageVector = Icons.Filled.Menu, contentDescription = "Menu")
                         }
                     },
                     floatingActionButton = {
@@ -414,7 +361,8 @@
         goldenIdentifier: String,
         testTag: String = TopAppBarTestTag
     ) {
-        composeTestRule.onNodeWithTag(testTag)
+        composeTestRule
+            .onNodeWithTag(testTag)
             .captureToImage()
             .assertAgainstGolden(screenshotRule, goldenIdentifier)
     }
diff --git a/compose/material3/material3/src/androidInstrumentedTest/kotlin/androidx/compose/material3/AppBarTest.kt b/compose/material3/material3/src/androidInstrumentedTest/kotlin/androidx/compose/material3/AppBarTest.kt
index 75c43a4..410f4d9 100644
--- a/compose/material3/material3/src/androidInstrumentedTest/kotlin/androidx/compose/material3/AppBarTest.kt
+++ b/compose/material3/material3/src/androidInstrumentedTest/kotlin/androidx/compose/material3/AppBarTest.kt
@@ -90,15 +90,12 @@
 @RunWith(AndroidJUnit4::class)
 class AppBarTest {
 
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
     @Test
     fun smallTopAppBar_expandsToScreen() {
         rule
-            .setMaterialContentForSizeAssertions {
-                TopAppBar(title = { Text("Title") })
-            }
+            .setMaterialContentForSizeAssertions { TopAppBar(title = { Text("Title") }) }
             .assertHeightIsEqualTo(TopAppBarSmallTokens.ContainerHeight)
             .assertWidthIsEqualTo(rule.rootWidth())
     }
@@ -107,9 +104,7 @@
     fun smallTopAppBar_withTitle() {
         val title = "Title"
         rule.setMaterialContent(lightColorScheme()) {
-            Box(Modifier.testTag(TopAppBarTestTag)) {
-                TopAppBar(title = { Text(title) })
-            }
+            Box(Modifier.testTag(TopAppBarTestTag)) { TopAppBar(title = { Text(title) }) }
         }
         rule.onNodeWithText(title).assertIsDisplayed()
     }
@@ -119,15 +114,9 @@
         rule.setMaterialContent(lightColorScheme()) {
             Box(Modifier.testTag(TopAppBarTestTag)) {
                 TopAppBar(
-                    navigationIcon = {
-                        FakeIcon(Modifier.testTag(NavigationIconTestTag))
-                    },
-                    title = {
-                        Text("Title", Modifier.testTag(TitleTestTag))
-                    },
-                    actions = {
-                        FakeIcon(Modifier.testTag(ActionsTestTag))
-                    }
+                    navigationIcon = { FakeIcon(Modifier.testTag(NavigationIconTestTag)) },
+                    title = { Text("Title", Modifier.testTag(TitleTestTag)) },
+                    actions = { FakeIcon(Modifier.testTag(ActionsTestTag)) }
                 )
             }
         }
@@ -139,12 +128,8 @@
         rule.setMaterialContent(lightColorScheme()) {
             Box(Modifier.testTag(TopAppBarTestTag)) {
                 TopAppBar(
-                    title = {
-                        Text("Title", Modifier.testTag(TitleTestTag))
-                    },
-                    actions = {
-                        FakeIcon(Modifier.testTag(ActionsTestTag))
-                    }
+                    title = { Text("Title", Modifier.testTag(TitleTestTag)) },
+                    actions = { FakeIcon(Modifier.testTag(ActionsTestTag)) }
                 )
             }
         }
@@ -156,12 +141,12 @@
         var textStyle: TextStyle? = null
         var expectedTextStyle: TextStyle? = null
         rule.setMaterialContent(lightColorScheme()) {
-            TopAppBar(title = {
-                Text("Title")
-                textStyle = LocalTextStyle.current
-                expectedTextStyle =
-                    TopAppBarSmallTokens.HeadlineFont.value
-            }
+            TopAppBar(
+                title = {
+                    Text("Title")
+                    textStyle = LocalTextStyle.current
+                    expectedTextStyle = TopAppBarSmallTokens.HeadlineFont.value
+                }
             )
         }
         assertThat(textStyle).isNotNull()
@@ -188,21 +173,20 @@
                     expectedNavigationIconColor =
                         TopAppBarDefaults.topAppBarColors().navigationIconContentColor
                     // fraction = 0f to indicate no scroll.
-                    expectedContainerColor = TopAppBarDefaults
-                        .topAppBarColors()
-                        .containerColor(colorTransitionFraction = 0f)
+                    expectedContainerColor =
+                        TopAppBarDefaults.topAppBarColors()
+                            .containerColor(colorTransitionFraction = 0f)
                 },
                 title = {
                     Text("Title", Modifier.testTag(TitleTestTag))
                     titleColor = LocalContentColor.current
-                    expectedTitleColor = TopAppBarDefaults
-                        .topAppBarColors().titleContentColor
+                    expectedTitleColor = TopAppBarDefaults.topAppBarColors().titleContentColor
                 },
                 actions = {
                     FakeIcon(Modifier.testTag(ActionsTestTag))
                     actionsColor = LocalContentColor.current
-                    expectedActionsColor = TopAppBarDefaults
-                        .topAppBarColors().actionIconContentColor
+                    expectedActionsColor =
+                        TopAppBarDefaults.topAppBarColors().actionIconContentColor
                 }
             )
         }
@@ -213,7 +197,9 @@
         assertThat(titleColor).isEqualTo(expectedTitleColor)
         assertThat(actionsColor).isEqualTo(expectedActionsColor)
 
-        rule.onNodeWithTag(TopAppBarTestTag).captureToImage()
+        rule
+            .onNodeWithTag(TopAppBarTestTag)
+            .captureToImage()
             .assertContainsColor(expectedContainerColor)
     }
 
@@ -239,11 +225,11 @@
         }
 
         // Simulate scrolled content.
-        rule.runOnIdle {
-            scrollBehavior.state.contentOffset = -100f
-        }
+        rule.runOnIdle { scrollBehavior.state.contentOffset = -100f }
         rule.waitForIdle()
-        rule.onNodeWithTag(TopAppBarTestTag).captureToImage()
+        rule
+            .onNodeWithTag(TopAppBarTestTag)
+            .captureToImage()
             .assertContainsColor(expectedScrolledContainerColor)
     }
 
@@ -270,7 +256,8 @@
             scrollBehavior.state.contentOffset = -scrollHeightOffsetPx
         }
         rule.waitForIdle()
-        rule.onNodeWithTag(TopAppBarTestTag)
+        rule
+            .onNodeWithTag(TopAppBarTestTag)
             .assertHeightIsEqualTo(TopAppBarSmallTokens.ContainerHeight - scrollHeightOffsetDp)
     }
 
@@ -303,31 +290,31 @@
         val expectedColorBehindTopAppBar: Color = Color.Red
         rule.setMaterialContent(lightColorScheme()) {
             Box(
-                modifier = Modifier
-                    .wrapContentHeight()
-                    .fillMaxWidth()
-                    .background(color = expectedColorBehindTopAppBar)
+                modifier =
+                    Modifier.wrapContentHeight()
+                        .fillMaxWidth()
+                        .background(color = expectedColorBehindTopAppBar)
             ) {
                 TopAppBar(
                     modifier = Modifier.testTag(TopAppBarTestTag),
-                    title = {
-                        Text("Title", Modifier.testTag(TitleTestTag))
-                    },
-                    colors =
-                    TopAppBarDefaults.topAppBarColors(containerColor = Color.Transparent),
+                    title = { Text("Title", Modifier.testTag(TitleTestTag)) },
+                    colors = TopAppBarDefaults.topAppBarColors(containerColor = Color.Transparent),
                     scrollBehavior = TopAppBarDefaults.pinnedScrollBehavior(),
                 )
             }
         }
-        rule.onNodeWithTag(TopAppBarTestTag).captureToImage()
+        rule
+            .onNodeWithTag(TopAppBarTestTag)
+            .captureToImage()
             .assertContainsColor(expectedColorBehindTopAppBar)
     }
 
     @Test
     fun centerAlignedTopAppBar_expandsToScreen() {
-        rule.setMaterialContentForSizeAssertions {
-            CenterAlignedTopAppBar(title = { Text("Title") })
-        }
+        rule
+            .setMaterialContentForSizeAssertions {
+                CenterAlignedTopAppBar(title = { Text("Title") })
+            }
             .assertHeightIsEqualTo(TopAppBarSmallCenteredTokens.ContainerHeight)
             .assertWidthIsEqualTo(rule.rootWidth())
     }
@@ -348,15 +335,9 @@
         rule.setMaterialContent(lightColorScheme()) {
             Box(Modifier.testTag(TopAppBarTestTag)) {
                 CenterAlignedTopAppBar(
-                    navigationIcon = {
-                        FakeIcon(Modifier.testTag(NavigationIconTestTag))
-                    },
-                    title = {
-                        Text("Title", Modifier.testTag(TitleTestTag))
-                    },
-                    actions = {
-                        FakeIcon(Modifier.testTag(ActionsTestTag))
-                    }
+                    navigationIcon = { FakeIcon(Modifier.testTag(NavigationIconTestTag)) },
+                    title = { Text("Title", Modifier.testTag(TitleTestTag)) },
+                    actions = { FakeIcon(Modifier.testTag(ActionsTestTag)) }
                 )
             }
         }
@@ -369,15 +350,9 @@
         rule.setMaterialContent(lightColorScheme()) {
             Box(Modifier.testTag(TopAppBarTestTag)) {
                 CenterAlignedTopAppBar(
-                    navigationIcon = {
-                        FakeIcon(Modifier.testTag(NavigationIconTestTag))
-                    },
-                    title = {
-                        Text("Title", Modifier.testTag(TitleTestTag))
-                    },
-                    actions = {
-                        FakeIcon(Modifier.testTag(ActionsTestTag))
-                    },
+                    navigationIcon = { FakeIcon(Modifier.testTag(NavigationIconTestTag)) },
+                    title = { Text("Title", Modifier.testTag(TitleTestTag)) },
+                    actions = { FakeIcon(Modifier.testTag(ActionsTestTag)) },
                     windowInsets = WindowInsets(padding, padding, padding, padding)
                 )
             }
@@ -385,7 +360,8 @@
         val appBarBounds = rule.onNodeWithTag(TopAppBarTestTag).getUnclippedBoundsInRoot()
         val appBarBottomEdgeY = appBarBounds.top + appBarBounds.height
 
-        rule.onNodeWithTag(NavigationIconTestTag)
+        rule
+            .onNodeWithTag(NavigationIconTestTag)
             // Navigation icon should be 4.dp from the start
             .assertLeftPositionInRootIsEqualTo(AppBarStartAndEndPadding + padding)
             // Navigation icon should be centered within the height of the app bar.
@@ -399,12 +375,8 @@
         rule.setMaterialContent(lightColorScheme()) {
             Box(Modifier.testTag(TopAppBarTestTag)) {
                 CenterAlignedTopAppBar(
-                    title = {
-                        Text("Title", Modifier.testTag(TitleTestTag))
-                    },
-                    actions = {
-                        FakeIcon(Modifier.testTag(ActionsTestTag))
-                    }
+                    title = { Text("Title", Modifier.testTag(TitleTestTag)) },
+                    actions = { FakeIcon(Modifier.testTag(ActionsTestTag)) }
                 )
             }
         }
@@ -424,9 +396,7 @@
                             maxLines = 1
                         )
                     },
-                    actions = {
-                        FakeIcon(Modifier.testTag(ActionsTestTag))
-                    }
+                    actions = { FakeIcon(Modifier.testTag(ActionsTestTag)) }
                 )
             }
         }
@@ -442,9 +412,7 @@
         rule.setMaterialContent(lightColorScheme()) {
             Box(Modifier.testTag(TopAppBarTestTag)) {
                 CenterAlignedTopAppBar(
-                    navigationIcon = {
-                        FakeIcon(Modifier.testTag(NavigationIconTestTag))
-                    },
+                    navigationIcon = { FakeIcon(Modifier.testTag(NavigationIconTestTag)) },
                     title = {
                         Text(
                             text = "This is a very very very very long title",
@@ -453,7 +421,6 @@
                             maxLines = 1
                         )
                     }
-
                 )
             }
         }
@@ -474,8 +441,7 @@
                 title = {
                     Text("Title")
                     textStyle = LocalTextStyle.current
-                    expectedTextStyle =
-                            TopAppBarSmallCenteredTokens.HeadlineFont.value
+                    expectedTextStyle = TopAppBarSmallCenteredTokens.HeadlineFont.value
                 }
             )
         }
@@ -488,18 +454,14 @@
         var appBarSize = IntSize.Zero
         rule.setMaterialContent(lightColorScheme()) {
             CenterAlignedTopAppBar(
-                modifier = Modifier.layout { measurable, constraints ->
-                    val placeable = measurable.measure(
-                        constraints.copy(minWidth = constraints.maxWidth)
-                    )
-                    appBarSize = IntSize(placeable.width, placeable.height)
-                    layout(placeable.width, placeable.height) {
-                        placeable.place(0, 0)
-                    }
-                },
-                title = {
-                    Text("Title")
-                }
+                modifier =
+                    Modifier.layout { measurable, constraints ->
+                        val placeable =
+                            measurable.measure(constraints.copy(minWidth = constraints.maxWidth))
+                        appBarSize = IntSize(placeable.width, placeable.height)
+                        layout(placeable.width, placeable.height) { placeable.place(0, 0) }
+                    },
+                title = { Text("Title") }
             )
         }
 
@@ -524,8 +486,7 @@
                     FakeIcon(Modifier.testTag(NavigationIconTestTag))
                     navigationIconColor = LocalContentColor.current
                     expectedNavigationIconColor =
-                        TopAppBarDefaults.centerAlignedTopAppBarColors()
-                            .navigationIconContentColor
+                        TopAppBarDefaults.centerAlignedTopAppBarColors().navigationIconContentColor
                     // fraction = 0f to indicate no scroll.
                     expectedContainerColor =
                         TopAppBarDefaults.centerAlignedTopAppBarColors()
@@ -535,15 +496,13 @@
                     Text("Title", Modifier.testTag(TitleTestTag))
                     titleColor = LocalContentColor.current
                     expectedTitleColor =
-                        TopAppBarDefaults.centerAlignedTopAppBarColors()
-                            .titleContentColor
+                        TopAppBarDefaults.centerAlignedTopAppBarColors().titleContentColor
                 },
                 actions = {
                     FakeIcon(Modifier.testTag(ActionsTestTag))
                     actionsColor = LocalContentColor.current
                     expectedActionsColor =
-                        TopAppBarDefaults.centerAlignedTopAppBarColors()
-                            .actionIconContentColor
+                        TopAppBarDefaults.centerAlignedTopAppBarColors().actionIconContentColor
                 }
             )
         }
@@ -554,7 +513,9 @@
         assertThat(titleColor).isEqualTo(expectedTitleColor)
         assertThat(actionsColor).isEqualTo(expectedActionsColor)
 
-        rule.onNodeWithTag(TopAppBarTestTag).captureToImage()
+        rule
+            .onNodeWithTag(TopAppBarTestTag)
+            .captureToImage()
             .assertContainsColor(expectedContainerColor)
     }
 
@@ -581,19 +542,20 @@
         }
 
         // Simulate scrolled content.
-        rule.runOnIdle {
-            scrollBehavior.state.contentOffset = -100f
-        }
+        rule.runOnIdle { scrollBehavior.state.contentOffset = -100f }
         rule.waitForIdle()
-        rule.onNodeWithTag(TopAppBarTestTag).captureToImage()
+        rule
+            .onNodeWithTag(TopAppBarTestTag)
+            .captureToImage()
             .assertContainsColor(expectedScrolledContainerColor)
     }
 
     @Test
     fun mediumTopAppBar_expandsToScreen() {
-        rule.setMaterialContentForSizeAssertions {
-            MediumTopAppBar(title = { Text("Medium Title") })
-        }
+        rule
+            .setMaterialContentForSizeAssertions {
+                MediumTopAppBar(title = { Text("Medium Title") })
+            }
             .assertHeightIsEqualTo(TopAppBarMediumTokens.ContainerHeight)
             .assertWidthIsEqualTo(rule.rootWidth())
     }
@@ -603,15 +565,9 @@
         rule.setMaterialContent(lightColorScheme()) {
             Box(Modifier.testTag(TopAppBarTestTag)) {
                 MediumTopAppBar(
-                    navigationIcon = {
-                        FakeIcon(Modifier.testTag(NavigationIconTestTag))
-                    },
-                    title = {
-                        Text("Title", Modifier.testTag(TitleTestTag))
-                    },
-                    actions = {
-                        FakeIcon(Modifier.testTag(ActionsTestTag))
-                    }
+                    navigationIcon = { FakeIcon(Modifier.testTag(NavigationIconTestTag)) },
+                    title = { Text("Title", Modifier.testTag(TitleTestTag)) },
+                    actions = { FakeIcon(Modifier.testTag(ActionsTestTag)) }
                 )
             }
         }
@@ -631,15 +587,9 @@
         rule.setMaterialContent(lightColorScheme()) {
             Box(Modifier.testTag(TopAppBarTestTag)) {
                 MediumTopAppBar(
-                    navigationIcon = {
-                        FakeIcon(Modifier.testTag(NavigationIconTestTag))
-                    },
-                    title = {
-                        Text("Title", Modifier.testTag(TitleTestTag))
-                    },
-                    actions = {
-                        FakeIcon(Modifier.testTag(ActionsTestTag))
-                    },
+                    navigationIcon = { FakeIcon(Modifier.testTag(NavigationIconTestTag)) },
+                    title = { Text("Title", Modifier.testTag(TitleTestTag)) },
+                    actions = { FakeIcon(Modifier.testTag(ActionsTestTag)) },
                     collapsedHeight = collapsedHeightDp,
                     expandedHeight = expandedHeightDp
                 )
@@ -657,23 +607,18 @@
     @Test
     fun mediumTopAppBar_scrolled_positioning() {
         val windowInsets = WindowInsets(13.dp, 13.dp, 13.dp, 13.dp)
-        val content = @Composable { scrollBehavior: TopAppBarScrollBehavior? ->
-            Box(Modifier.testTag(TopAppBarTestTag)) {
-                MediumTopAppBar(
-                    navigationIcon = {
-                        FakeIcon(Modifier.testTag(NavigationIconTestTag))
-                    },
-                    title = {
-                        Text("Title", Modifier.testTag(TitleTestTag))
-                    },
-                    actions = {
-                        FakeIcon(Modifier.testTag(ActionsTestTag))
-                    },
-                    scrollBehavior = scrollBehavior,
-                    windowInsets = windowInsets
-                )
+        val content =
+            @Composable { scrollBehavior: TopAppBarScrollBehavior? ->
+                Box(Modifier.testTag(TopAppBarTestTag)) {
+                    MediumTopAppBar(
+                        navigationIcon = { FakeIcon(Modifier.testTag(NavigationIconTestTag)) },
+                        title = { Text("Title", Modifier.testTag(TitleTestTag)) },
+                        actions = { FakeIcon(Modifier.testTag(ActionsTestTag)) },
+                        scrollBehavior = scrollBehavior,
+                        windowInsets = windowInsets
+                    )
+                }
             }
-        }
         assertMediumOrLargeScrolledHeight(
             TopAppBarMediumTokens.ContainerHeight,
             TopAppBarSmallTokens.ContainerHeight,
@@ -687,25 +632,20 @@
         val collapsedHeightDp = 40.dp
         val expandedHeightDp = 120.dp
         val windowInsets = WindowInsets(13.dp, 13.dp, 13.dp, 13.dp)
-        val content = @Composable { scrollBehavior: TopAppBarScrollBehavior? ->
-            Box(Modifier.testTag(TopAppBarTestTag)) {
-                MediumTopAppBar(
-                    navigationIcon = {
-                        FakeIcon(Modifier.testTag(NavigationIconTestTag))
-                    },
-                    title = {
-                        Text("Title", Modifier.testTag(TitleTestTag))
-                    },
-                    actions = {
-                        FakeIcon(Modifier.testTag(ActionsTestTag))
-                    },
-                    collapsedHeight = collapsedHeightDp,
-                    expandedHeight = expandedHeightDp,
-                    windowInsets = windowInsets,
-                    scrollBehavior = scrollBehavior,
-                )
+        val content =
+            @Composable { scrollBehavior: TopAppBarScrollBehavior? ->
+                Box(Modifier.testTag(TopAppBarTestTag)) {
+                    MediumTopAppBar(
+                        navigationIcon = { FakeIcon(Modifier.testTag(NavigationIconTestTag)) },
+                        title = { Text("Title", Modifier.testTag(TitleTestTag)) },
+                        actions = { FakeIcon(Modifier.testTag(ActionsTestTag)) },
+                        collapsedHeight = collapsedHeightDp,
+                        expandedHeight = expandedHeightDp,
+                        windowInsets = windowInsets,
+                        scrollBehavior = scrollBehavior,
+                    )
+                }
             }
-        }
         assertMediumOrLargeScrolledHeight(
             appBarMaxHeight = expandedHeightDp,
             appBarMinHeight = collapsedHeightDp,
@@ -717,15 +657,14 @@
     @SdkSuppress(minSdkVersion = Build.VERSION_CODES.O)
     @Test
     fun mediumTopAppBar_scrolledContainerColor() {
-        val content = @Composable { scrollBehavior: TopAppBarScrollBehavior? ->
-            MediumTopAppBar(
-                modifier = Modifier.testTag(TopAppBarTestTag),
-                title = {
-                    Text("Title", Modifier.testTag(TitleTestTag))
-                },
-                scrollBehavior = scrollBehavior
-            )
-        }
+        val content =
+            @Composable { scrollBehavior: TopAppBarScrollBehavior? ->
+                MediumTopAppBar(
+                    modifier = Modifier.testTag(TopAppBarTestTag),
+                    title = { Text("Title", Modifier.testTag(TitleTestTag)) },
+                    scrollBehavior = scrollBehavior
+                )
+            }
 
         assertMediumOrLargeScrolledColors(
             appBarMaxHeight = TopAppBarMediumTokens.ContainerHeight,
@@ -738,18 +677,16 @@
     @SdkSuppress(minSdkVersion = Build.VERSION_CODES.O)
     @Test
     fun mediumTopAppBar_scrolledColorsWithCustomTitleTextColor() {
-        val content = @Composable { scrollBehavior: TopAppBarScrollBehavior? ->
-            MediumTopAppBar(
-                modifier = Modifier.testTag(TopAppBarTestTag),
-                title = {
-                    Text(
-                        text = "Title", Modifier.testTag(TitleTestTag),
-                        color = Color.Green
-                    )
-                },
-                scrollBehavior = scrollBehavior
-            )
-        }
+        val content =
+            @Composable { scrollBehavior: TopAppBarScrollBehavior? ->
+                MediumTopAppBar(
+                    modifier = Modifier.testTag(TopAppBarTestTag),
+                    title = {
+                        Text(text = "Title", Modifier.testTag(TitleTestTag), color = Color.Green)
+                    },
+                    scrollBehavior = scrollBehavior
+                )
+            }
         assertMediumOrLargeScrolledColors(
             appBarMaxHeight = TopAppBarMediumTokens.ContainerHeight,
             appBarMinHeight = TopAppBarSmallTokens.ContainerHeight,
@@ -774,15 +711,14 @@
     @SdkSuppress(minSdkVersion = Build.VERSION_CODES.O)
     @Test
     fun mediumTopAppBar_semantics() {
-        val content = @Composable { scrollBehavior: TopAppBarScrollBehavior? ->
-            MediumTopAppBar(
-                modifier = Modifier.testTag(TopAppBarTestTag),
-                title = {
-                    Text("Title", Modifier.testTag(TitleTestTag))
-                },
-                scrollBehavior = scrollBehavior
-            )
-        }
+        val content =
+            @Composable { scrollBehavior: TopAppBarScrollBehavior? ->
+                MediumTopAppBar(
+                    modifier = Modifier.testTag(TopAppBarTestTag),
+                    title = { Text("Title", Modifier.testTag(TitleTestTag)) },
+                    scrollBehavior = scrollBehavior
+                )
+            }
 
         assertMediumOrLargeScrolledSemantics(
             TopAppBarMediumTokens.ContainerHeight,
@@ -794,15 +730,14 @@
     @SdkSuppress(minSdkVersion = Build.VERSION_CODES.O)
     @Test
     fun largeTopAppBar_semantics() {
-        val content = @Composable { scrollBehavior: TopAppBarScrollBehavior? ->
-            LargeTopAppBar(
-                modifier = Modifier.testTag(TopAppBarTestTag),
-                title = {
-                    Text("Title", Modifier.testTag(TitleTestTag))
-                },
-                scrollBehavior = scrollBehavior
-            )
-        }
+        val content =
+            @Composable { scrollBehavior: TopAppBarScrollBehavior? ->
+                LargeTopAppBar(
+                    modifier = Modifier.testTag(TopAppBarTestTag),
+                    title = { Text("Title", Modifier.testTag(TitleTestTag)) },
+                    scrollBehavior = scrollBehavior
+                )
+            }
         assertMediumOrLargeScrolledSemantics(
             TopAppBarLargeTokens.ContainerHeight,
             TopAppBarSmallTokens.ContainerHeight,
@@ -812,9 +747,8 @@
 
     @Test
     fun largeTopAppBar_expandsToScreen() {
-        rule.setMaterialContentForSizeAssertions {
-            LargeTopAppBar(title = { Text("Large Title") })
-        }
+        rule
+            .setMaterialContentForSizeAssertions { LargeTopAppBar(title = { Text("Large Title") }) }
             .assertHeightIsEqualTo(TopAppBarLargeTokens.ContainerHeight)
             .assertWidthIsEqualTo(rule.rootWidth())
     }
@@ -824,15 +758,9 @@
         rule.setMaterialContent(lightColorScheme()) {
             Box(Modifier.testTag(TopAppBarTestTag)) {
                 LargeTopAppBar(
-                    navigationIcon = {
-                        FakeIcon(Modifier.testTag(NavigationIconTestTag))
-                    },
-                    title = {
-                        Text("Title", Modifier.testTag(TitleTestTag))
-                    },
-                    actions = {
-                        FakeIcon(Modifier.testTag(ActionsTestTag))
-                    }
+                    navigationIcon = { FakeIcon(Modifier.testTag(NavigationIconTestTag)) },
+                    title = { Text("Title", Modifier.testTag(TitleTestTag)) },
+                    actions = { FakeIcon(Modifier.testTag(ActionsTestTag)) }
                 )
             }
         }
@@ -852,15 +780,9 @@
         rule.setMaterialContent(lightColorScheme()) {
             Box(Modifier.testTag(TopAppBarTestTag)) {
                 LargeTopAppBar(
-                    navigationIcon = {
-                        FakeIcon(Modifier.testTag(NavigationIconTestTag))
-                    },
-                    title = {
-                        Text("Title", Modifier.testTag(TitleTestTag))
-                    },
-                    actions = {
-                        FakeIcon(Modifier.testTag(ActionsTestTag))
-                    },
+                    navigationIcon = { FakeIcon(Modifier.testTag(NavigationIconTestTag)) },
+                    title = { Text("Title", Modifier.testTag(TitleTestTag)) },
+                    actions = { FakeIcon(Modifier.testTag(ActionsTestTag)) },
                     collapsedHeight = collapsedHeightDp,
                     expandedHeight = expandedHeightDp
                 )
@@ -878,23 +800,18 @@
     @Test
     fun largeTopAppBar_scrolled_positioning() {
         val windowInsets = WindowInsets(4.dp, 4.dp, 4.dp, 4.dp)
-        val content = @Composable { scrollBehavior: TopAppBarScrollBehavior? ->
-            Box(Modifier.testTag(TopAppBarTestTag)) {
-                LargeTopAppBar(
-                    navigationIcon = {
-                        FakeIcon(Modifier.testTag(NavigationIconTestTag))
-                    },
-                    title = {
-                        Text("Title", Modifier.testTag(TitleTestTag))
-                    },
-                    actions = {
-                        FakeIcon(Modifier.testTag(ActionsTestTag))
-                    },
-                    scrollBehavior = scrollBehavior,
-                    windowInsets = windowInsets
-                )
+        val content =
+            @Composable { scrollBehavior: TopAppBarScrollBehavior? ->
+                Box(Modifier.testTag(TopAppBarTestTag)) {
+                    LargeTopAppBar(
+                        navigationIcon = { FakeIcon(Modifier.testTag(NavigationIconTestTag)) },
+                        title = { Text("Title", Modifier.testTag(TitleTestTag)) },
+                        actions = { FakeIcon(Modifier.testTag(ActionsTestTag)) },
+                        scrollBehavior = scrollBehavior,
+                        windowInsets = windowInsets
+                    )
+                }
             }
-        }
         assertMediumOrLargeScrolledHeight(
             TopAppBarLargeTokens.ContainerHeight,
             TopAppBarSmallTokens.ContainerHeight,
@@ -908,25 +825,20 @@
         val collapsedHeightDp = 30.dp
         val expandedHeightDp = 130.dp
         val windowInsets = WindowInsets(4.dp, 4.dp, 4.dp, 4.dp)
-        val content = @Composable { scrollBehavior: TopAppBarScrollBehavior? ->
-            Box(Modifier.testTag(TopAppBarTestTag)) {
-                LargeTopAppBar(
-                    navigationIcon = {
-                        FakeIcon(Modifier.testTag(NavigationIconTestTag))
-                    },
-                    title = {
-                        Text("Title", Modifier.testTag(TitleTestTag))
-                    },
-                    actions = {
-                        FakeIcon(Modifier.testTag(ActionsTestTag))
-                    },
-                    collapsedHeight = collapsedHeightDp,
-                    expandedHeight = expandedHeightDp,
-                    windowInsets = windowInsets,
-                    scrollBehavior = scrollBehavior
-                )
+        val content =
+            @Composable { scrollBehavior: TopAppBarScrollBehavior? ->
+                Box(Modifier.testTag(TopAppBarTestTag)) {
+                    LargeTopAppBar(
+                        navigationIcon = { FakeIcon(Modifier.testTag(NavigationIconTestTag)) },
+                        title = { Text("Title", Modifier.testTag(TitleTestTag)) },
+                        actions = { FakeIcon(Modifier.testTag(ActionsTestTag)) },
+                        collapsedHeight = collapsedHeightDp,
+                        expandedHeight = expandedHeightDp,
+                        windowInsets = windowInsets,
+                        scrollBehavior = scrollBehavior
+                    )
+                }
             }
-        }
         assertMediumOrLargeScrolledHeight(
             appBarMaxHeight = expandedHeightDp,
             appBarMinHeight = collapsedHeightDp,
@@ -938,15 +850,14 @@
     @SdkSuppress(minSdkVersion = Build.VERSION_CODES.O)
     @Test
     fun largeTopAppBar_scrolledContainerColor() {
-        val content = @Composable { scrollBehavior: TopAppBarScrollBehavior? ->
-            LargeTopAppBar(
-                modifier = Modifier.testTag(TopAppBarTestTag),
-                title = {
-                    Text("Title", Modifier.testTag(TitleTestTag))
-                },
-                scrollBehavior = scrollBehavior,
-            )
-        }
+        val content =
+            @Composable { scrollBehavior: TopAppBarScrollBehavior? ->
+                LargeTopAppBar(
+                    modifier = Modifier.testTag(TopAppBarTestTag),
+                    title = { Text("Title", Modifier.testTag(TitleTestTag)) },
+                    scrollBehavior = scrollBehavior,
+                )
+            }
         assertMediumOrLargeScrolledColors(
             appBarMaxHeight = TopAppBarLargeTokens.ContainerHeight,
             appBarMinHeight = TopAppBarSmallTokens.ContainerHeight,
@@ -958,18 +869,16 @@
     @SdkSuppress(minSdkVersion = Build.VERSION_CODES.O)
     @Test
     fun largeTopAppBar_scrolledColorsWithCustomTitleTextColor() {
-        val content = @Composable { scrollBehavior: TopAppBarScrollBehavior? ->
-            LargeTopAppBar(
-                modifier = Modifier.testTag(TopAppBarTestTag),
-                title = {
-                    Text(
-                        text = "Title", Modifier.testTag(TitleTestTag),
-                        color = Color.Red
-                    )
-                },
-                scrollBehavior = scrollBehavior,
-            )
-        }
+        val content =
+            @Composable { scrollBehavior: TopAppBarScrollBehavior? ->
+                LargeTopAppBar(
+                    modifier = Modifier.testTag(TopAppBarTestTag),
+                    title = {
+                        Text(text = "Title", Modifier.testTag(TitleTestTag), color = Color.Red)
+                    },
+                    scrollBehavior = scrollBehavior,
+                )
+            }
         assertMediumOrLargeScrolledColors(
             appBarMaxHeight = TopAppBarLargeTokens.ContainerHeight,
             appBarMinHeight = TopAppBarSmallTokens.ContainerHeight,
@@ -988,14 +897,10 @@
         }
 
         rule.onNodeWithTag(LazyListTag).performTouchInput { swipeLeft() }
-        rule.runOnIdle {
-            assertThat(state.firstVisibleItemIndex).isEqualTo(1)
-        }
+        rule.runOnIdle { assertThat(state.firstVisibleItemIndex).isEqualTo(1) }
 
         rule.onNodeWithTag(LazyListTag).performTouchInput { swipeRight() }
-        rule.runOnIdle {
-            assertThat(state.firstVisibleItemIndex).isEqualTo(0)
-        }
+        rule.runOnIdle { assertThat(state.firstVisibleItemIndex).isEqualTo(0) }
     }
 
     @OptIn(ExperimentalMaterial3Api::class)
@@ -1008,14 +913,10 @@
         }
 
         rule.onNodeWithTag(LazyListTag).performTouchInput { swipeLeft() }
-        rule.runOnIdle {
-            assertThat(state.firstVisibleItemIndex).isEqualTo(1)
-        }
+        rule.runOnIdle { assertThat(state.firstVisibleItemIndex).isEqualTo(1) }
 
         rule.onNodeWithTag(LazyListTag).performTouchInput { swipeRight() }
-        rule.runOnIdle {
-            assertThat(state.firstVisibleItemIndex).isEqualTo(0)
-        }
+        rule.runOnIdle { assertThat(state.firstVisibleItemIndex).isEqualTo(0) }
     }
 
     @OptIn(ExperimentalMaterial3Api::class)
@@ -1024,36 +925,28 @@
         lateinit var state: LazyListState
         rule.setMaterialContent(lightColorScheme()) {
             state = rememberLazyListState()
-            MultiPageContent(
-                TopAppBarDefaults.pinnedScrollBehavior(),
-                state
-            )
+            MultiPageContent(TopAppBarDefaults.pinnedScrollBehavior(), state)
         }
 
         rule.onNodeWithTag(LazyListTag).performTouchInput { swipeLeft() }
-        rule.runOnIdle {
-            assertThat(state.firstVisibleItemIndex).isEqualTo(1)
-        }
+        rule.runOnIdle { assertThat(state.firstVisibleItemIndex).isEqualTo(1) }
 
         rule.onNodeWithTag(LazyListTag).performTouchInput { swipeRight() }
-        rule.runOnIdle {
-            assertThat(state.firstVisibleItemIndex).isEqualTo(0)
-        }
+        rule.runOnIdle { assertThat(state.firstVisibleItemIndex).isEqualTo(0) }
     }
 
     @Test
     fun topAppBar_smallPinnedDraggedAppBar() {
         rule.setMaterialContentForSizeAssertions {
             TopAppBar(
-                title = {
-                    Text("Title")
-                },
+                title = { Text("Title") },
                 modifier = Modifier.testTag(TopAppBarTestTag),
                 scrollBehavior = TopAppBarDefaults.pinnedScrollBehavior()
             )
         }
 
-        rule.onNodeWithTag(TopAppBarTestTag)
+        rule
+            .onNodeWithTag(TopAppBarTestTag)
             .assertHeightIsEqualTo(TopAppBarSmallTokens.ContainerHeight)
 
         // Drag the app bar up half its height.
@@ -1063,7 +956,8 @@
         }
         rule.waitForIdle()
         // Check that the app bar did not collapse.
-        rule.onNodeWithTag(TopAppBarTestTag)
+        rule
+            .onNodeWithTag(TopAppBarTestTag)
             .assertHeightIsEqualTo(TopAppBarSmallTokens.ContainerHeight)
     }
 
@@ -1072,14 +966,13 @@
         rule.setMaterialContentForSizeAssertions {
             MediumTopAppBar(
                 modifier = Modifier.testTag(TopAppBarTestTag),
-                title = {
-                    Text("Title")
-                },
+                title = { Text("Title") },
                 scrollBehavior = TopAppBarDefaults.exitUntilCollapsedScrollBehavior()
             )
         }
 
-        rule.onNodeWithTag(TopAppBarTestTag)
+        rule
+            .onNodeWithTag(TopAppBarTestTag)
             .assertHeightIsEqualTo(TopAppBarMediumTokens.ContainerHeight)
 
         // Drag up the app bar.
@@ -1090,7 +983,8 @@
         rule.waitForIdle()
         // Check that the app bar collapsed to its small size constraints (i.e.
         // TopAppBarSmallTokens.ContainerHeight).
-        rule.onNodeWithTag(TopAppBarTestTag)
+        rule
+            .onNodeWithTag(TopAppBarTestTag)
             .assertHeightIsEqualTo(TopAppBarSmallTokens.ContainerHeight)
     }
 
@@ -1099,14 +993,13 @@
         rule.setMaterialContentForSizeAssertions {
             LargeTopAppBar(
                 modifier = Modifier.testTag(TopAppBarTestTag),
-                title = {
-                    Text("Title")
-                },
+                title = { Text("Title") },
                 scrollBehavior = TopAppBarDefaults.exitUntilCollapsedScrollBehavior()
             )
         }
 
-        rule.onNodeWithTag(TopAppBarTestTag)
+        rule
+            .onNodeWithTag(TopAppBarTestTag)
             .assertHeightIsEqualTo(TopAppBarLargeTokens.ContainerHeight)
 
         // Slightly drag up the app bar.
@@ -1118,7 +1011,8 @@
         rule.waitForIdle()
 
         // Check that the app bar returned to its expanded size (i.e. fully expanded).
-        rule.onNodeWithTag(TopAppBarTestTag)
+        rule
+            .onNodeWithTag(TopAppBarTestTag)
             .assertHeightIsEqualTo(TopAppBarLargeTokens.ContainerHeight)
 
         // Drag up the app bar to the point it should continue to collapse after.
@@ -1131,7 +1025,8 @@
 
         // Check that the app bar collapsed to its small size constraints (i.e.
         // TopAppBarSmallTokens.ContainerHeight).
-        rule.onNodeWithTag(TopAppBarTestTag)
+        rule
+            .onNodeWithTag(TopAppBarTestTag)
             .assertHeightIsEqualTo(TopAppBarSmallTokens.ContainerHeight)
     }
 
@@ -1140,12 +1035,9 @@
         rule.setMaterialContentForSizeAssertions {
             LargeTopAppBar(
                 modifier = Modifier.testTag(TopAppBarTestTag),
-                title = {
-                    Text("Title")
-                },
-                scrollBehavior = TopAppBarDefaults.exitUntilCollapsedScrollBehavior(
-                    snapAnimationSpec = null
-                )
+                title = { Text("Title") },
+                scrollBehavior =
+                    TopAppBarDefaults.exitUntilCollapsedScrollBehavior(snapAnimationSpec = null)
             )
         }
 
@@ -1174,9 +1066,7 @@
     fun state_restoresTopAppBarState() {
         val restorationTester = StateRestorationTester(rule)
         var topAppBarState: TopAppBarState? = null
-        restorationTester.setContent {
-            topAppBarState = rememberTopAppBarState()
-        }
+        restorationTester.setContent { topAppBarState = rememberTopAppBarState() }
 
         rule.runOnIdle {
             topAppBarState!!.heightOffsetLimit = -350f
@@ -1209,7 +1099,8 @@
                         ) {
                             Icon(Icons.Filled.Add, "Localized description")
                         }
-                    })
+                    }
+                )
             }
             .assertHeightIsEqualTo(BottomAppBarTokens.ContainerHeight)
             .assertWidthIsEqualTo(rule.rootWidth())
@@ -1230,7 +1121,8 @@
                         ) {
                             Icon(Icons.Filled.Add, "Localized description")
                         }
-                    })
+                    }
+                )
             }
             .assertHeightIsEqualTo(BottomAppBarTokens.ContainerHeight + 20.dp)
             .assertWidthIsEqualTo(rule.rootWidth())
@@ -1240,11 +1132,7 @@
     fun bottomAppBar_FABshown_whenActionsOverflowRow() {
         rule.setMaterialContent(lightColorScheme()) {
             BottomAppBar(
-                actions = {
-                    repeat(20) {
-                        FakeIcon(Modifier)
-                    }
-                },
+                actions = { repeat(20) { FakeIcon(Modifier) } },
                 floatingActionButton = {
                     FloatingActionButton(
                         onClick = { /* do something */ },
@@ -1254,7 +1142,8 @@
                     ) {
                         Icon(Icons.Filled.Add, "Localized description")
                     }
-                })
+                }
+            )
         }
         rule.onNodeWithTag("FAB").assertIsDisplayed()
     }
@@ -1262,9 +1151,7 @@
     @Test
     fun bottomAppBar_widthExpandsToScreen() {
         rule
-            .setMaterialContentForSizeAssertions {
-                BottomAppBar {}
-            }
+            .setMaterialContentForSizeAssertions { BottomAppBar {} }
             .assertHeightIsEqualTo(BottomAppBarTokens.ContainerHeight)
             .assertWidthIsEqualTo(rule.rootWidth())
     }
@@ -1272,16 +1159,15 @@
     @Test
     fun bottomAppBar_default_positioning() {
         rule.setMaterialContent(lightColorScheme()) {
-            BottomAppBar(Modifier.testTag("bar")) {
-                FakeIcon(Modifier.testTag("icon"))
-            }
+            BottomAppBar(Modifier.testTag("bar")) { FakeIcon(Modifier.testTag("icon")) }
         }
 
         val appBarBounds = rule.onNodeWithTag("bar").getUnclippedBoundsInRoot()
         val appBarBottomEdgeY = appBarBounds.top + appBarBounds.height
 
         val defaultPadding = BottomAppBarDefaults.ContentPadding
-        rule.onNodeWithTag("icon")
+        rule
+            .onNodeWithTag("icon")
             // Child icon should be 4.dp from the start
             .assertLeftPositionInRootIsEqualTo(AppBarStartAndEndPadding)
             // Child icon should be 10.dp from the top
@@ -1306,7 +1192,8 @@
         val appBarBounds = rule.onNodeWithTag("bar").getUnclippedBoundsInRoot()
         val appBarBottomEdgeY = appBarBounds.top + appBarBounds.height
 
-        rule.onNodeWithTag("icon")
+        rule
+            .onNodeWithTag("icon")
             // Child icon should be 4.dp from the start
             .assertLeftPositionInRootIsEqualTo(3.dp)
             // Child icon should be 10.dp from the top
@@ -1330,14 +1217,16 @@
                     ) {
                         Icon(Icons.Filled.Add, "Localized description")
                     }
-                })
+                }
+            )
         }
 
         val appBarBounds = rule.onNodeWithTag("bar").getUnclippedBoundsInRoot()
 
         val fabBounds = rule.onNodeWithTag("FAB").getUnclippedBoundsInRoot()
 
-        rule.onNodeWithTag("FAB")
+        rule
+            .onNodeWithTag("FAB")
             // FAB should be 16.dp from the end
             .assertLeftPositionInRootIsEqualTo(appBarBounds.width - 16.dp - fabBounds.width)
             // FAB should be 12.dp from the top
@@ -1358,9 +1247,7 @@
                 },
                 floatingActionButton = {
                     FloatingActionButton(
-                        modifier = Modifier
-                            .testTag("FAB")
-                            .offset(y = 4.dp),
+                        modifier = Modifier.testTag("FAB").offset(y = 4.dp),
                         onClick = { /* do something */ },
                     ) {}
                 },
@@ -1370,7 +1257,8 @@
 
         val appBarBounds = rule.onNodeWithTag(BottomAppBarTestTag).getUnclippedBoundsInRoot()
         val fabBounds = rule.onNodeWithTag("FAB").getUnclippedBoundsInRoot()
-        rule.onNodeWithTag("FAB")
+        rule
+            .onNodeWithTag("FAB")
             // FAB should be 16.dp from the end
             .assertLeftPositionInRootIsEqualTo(appBarBounds.width - 16.dp - fabBounds.width)
             // FAB should be 12.dp from the bottom
@@ -1396,9 +1284,7 @@
                 },
                 floatingActionButton = {
                     FloatingActionButton(
-                        modifier = Modifier
-                            .testTag("FAB")
-                            .offset(y = 4.dp),
+                        modifier = Modifier.testTag("FAB").offset(y = 4.dp),
                         onClick = { /* do something */ },
                     ) {}
                 },
@@ -1412,12 +1298,14 @@
             scrollBehavior.state.contentOffset = -scrollHeightOffsetPx
         }
         rule.waitForIdle()
-        rule.onNodeWithTag(BottomAppBarTestTag)
+        rule
+            .onNodeWithTag(BottomAppBarTestTag)
             .assertHeightIsEqualTo(BottomAppBarTokens.ContainerHeight - scrollHeightOffsetDp)
 
         val appBarBounds = rule.onNodeWithTag(BottomAppBarTestTag).getUnclippedBoundsInRoot()
         val fabBounds = rule.onNodeWithTag("FAB").getUnclippedBoundsInRoot()
-        rule.onNodeWithTag("FAB")
+        rule
+            .onNodeWithTag("FAB")
             // FAB should be 16.dp from the end
             .assertLeftPositionInRootIsEqualTo(appBarBounds.width - 16.dp - fabBounds.width)
             // FAB should be 12.dp from the bottom
@@ -1433,14 +1321,10 @@
         }
 
         rule.onNodeWithTag(LazyListTag).performTouchInput { swipeLeft() }
-        rule.runOnIdle {
-            assertThat(state.firstVisibleItemIndex).isEqualTo(1)
-        }
+        rule.runOnIdle { assertThat(state.firstVisibleItemIndex).isEqualTo(1) }
 
         rule.onNodeWithTag(LazyListTag).performTouchInput { swipeRight() }
-        rule.runOnIdle {
-            assertThat(state.firstVisibleItemIndex).isEqualTo(0)
-        }
+        rule.runOnIdle { assertThat(state.firstVisibleItemIndex).isEqualTo(0) }
     }
 
     @OptIn(ExperimentalMaterial3Api::class)
@@ -1456,11 +1340,7 @@
                 )
             }
         ) { contentPadding ->
-            LazyRow(
-                Modifier
-                    .fillMaxSize()
-                    .testTag(LazyListTag), state
-            ) {
+            LazyRow(Modifier.fillMaxSize().testTag(LazyListTag), state) {
                 items(2) { page ->
                     LazyColumn(
                         modifier = Modifier.fillParentMaxSize(),
@@ -1489,11 +1369,7 @@
                 ) {}
             }
         ) { contentPadding ->
-            LazyRow(
-                Modifier
-                    .fillMaxSize()
-                    .testTag(LazyListTag), state
-            ) {
+            LazyRow(Modifier.fillMaxSize().testTag(LazyListTag), state) {
                 items(2) { page ->
                     LazyColumn(
                         modifier = Modifier.fillParentMaxSize(),
@@ -1534,7 +1410,8 @@
             titleNode.assertLeftPositionInRootIsEqualTo(4.dp + 12.dp)
         }
 
-        rule.onNodeWithTag(ActionsTestTag)
+        rule
+            .onNodeWithTag(ActionsTestTag)
             // Action should still be placed at the end
             .assertLeftPositionInRootIsEqualTo(expectedActionPosition(appBarBounds.width))
     }
@@ -1548,7 +1425,8 @@
         val titleBounds = rule.onNodeWithTag(TitleTestTag).getUnclippedBoundsInRoot()
         val appBarBottomEdgeY = appBarBounds.top + appBarBounds.height
 
-        rule.onNodeWithTag(NavigationIconTestTag)
+        rule
+            .onNodeWithTag(NavigationIconTestTag)
             // Navigation icon should be 4.dp from the start
             .assertLeftPositionInRootIsEqualTo(AppBarStartAndEndPadding)
             // Navigation icon should be centered within the height of the app bar.
@@ -1570,7 +1448,8 @@
             titleNode.assertLeftPositionInRootIsEqualTo(4.dp + FakeIconSize + 4.dp)
         }
 
-        rule.onNodeWithTag(ActionsTestTag)
+        rule
+            .onNodeWithTag(ActionsTestTag)
             // Action should be placed at the end
             .assertLeftPositionInRootIsEqualTo(expectedActionPosition(appBarBounds.width))
             // Action should be 8.dp from the top
@@ -1604,7 +1483,8 @@
         val bottomAppBarBottomEdgeY = appBarBounds.top + appBarBounds.height
 
         val topAndBottomPadding = (appBarCollapsedHeight - FakeIconSize) / 2
-        rule.onNodeWithTag(NavigationIconTestTag)
+        rule
+            .onNodeWithTag(NavigationIconTestTag)
             // Navigation icon should be 4.dp from the start
             .assertLeftPositionInRootIsEqualTo(AppBarStartAndEndPadding)
             // Navigation icon should be centered within the height of the top part of the app bar.
@@ -1612,7 +1492,8 @@
                 topAppBarBottomEdgeY - topAndBottomPadding - FakeIconSize
             )
 
-        rule.onNodeWithTag(ActionsTestTag)
+        rule
+            .onNodeWithTag(ActionsTestTag)
             // Action should be placed at the end
             .assertLeftPositionInRootIsEqualTo(expectedActionPosition(appBarBounds.width))
             // Action should be 8.dp from the top
@@ -1658,9 +1539,10 @@
         windowInsets: WindowInsets,
         content: @Composable (TopAppBarScrollBehavior?) -> Unit
     ) {
-        val (topInset, bottomInset) = with(rule.density) {
-            windowInsets.getTop(this).toDp() to windowInsets.getBottom(this).toDp()
-        }
+        val (topInset, bottomInset) =
+            with(rule.density) {
+                windowInsets.getTop(this).toDp() to windowInsets.getBottom(this).toDp()
+            }
         val fullyCollapsedOffsetDp = appBarMaxHeight - appBarMinHeight
         val partiallyCollapsedOffsetDp = fullyCollapsedOffsetDp / 3
         var partiallyCollapsedHeightOffsetPx = 0f
@@ -1682,7 +1564,8 @@
             scrollBehavior.state.contentOffset = -partiallyCollapsedHeightOffsetPx
         }
         rule.waitForIdle()
-        rule.onNodeWithTag(TopAppBarTestTag)
+        rule
+            .onNodeWithTag(TopAppBarTestTag)
             .assertHeightIsEqualTo(
                 appBarMaxHeight - partiallyCollapsedOffsetDp + topInset + bottomInset
             )
@@ -1696,9 +1579,9 @@
         }
         rule.waitForIdle()
         // Check that the app bar collapsed to its min height.
-        rule.onNodeWithTag(TopAppBarTestTag).assertHeightIsEqualTo(
-            appBarMinHeight + topInset + bottomInset
-        )
+        rule
+            .onNodeWithTag(TopAppBarTestTag)
+            .assertHeightIsEqualTo(appBarMinHeight + topInset + bottomInset)
     }
 
     /**
@@ -1738,8 +1621,7 @@
             // Resolve the title's content color. The default implementation returns the same color
             // regardless of the fraction, and the color is applied later with alpha.
             if (titleColor == Color.Unspecified) {
-                titleColor =
-                    TopAppBarDefaults.mediumTopAppBarColors().titleContentColor
+                titleColor = TopAppBarDefaults.mediumTopAppBarColors().titleContentColor
             }
 
             with(LocalDensity.current) {
@@ -1756,19 +1638,22 @@
         val topTitleNode = allTitleNodes.onFirst()
         val bottomTitleNode = allTitleNodes.onLast()
 
-        rule.onNodeWithTag(TopAppBarTestTag).captureToImage()
+        rule
+            .onNodeWithTag(TopAppBarTestTag)
+            .captureToImage()
             .assertContainsColor(expandedAppBarBackgroundColor)
 
         // Assert the content color at the top and bottom parts of the expanded app bar.
-        topTitleNode.captureToImage()
+        topTitleNode
+            .captureToImage()
             .assertContainsColor(
-                titleColor.copy(alpha = TopTitleAlphaEasing.transform(0f))
+                titleColor
+                    .copy(alpha = TopTitleAlphaEasing.transform(0f))
                     .compositeOver(expandedAppBarBackgroundColor)
             )
-        bottomTitleNode.captureToImage()
-            .assertContainsColor(
-                titleColor.compositeOver(expandedAppBarBackgroundColor)
-            )
+        bottomTitleNode
+            .captureToImage()
+            .assertContainsColor(titleColor.compositeOver(expandedAppBarBackgroundColor))
 
         // Simulate fully collapsed content.
         rule.runOnIdle {
@@ -1776,11 +1661,15 @@
             scrollBehavior.state.contentOffset = -fullyCollapsedHeightOffsetPx
         }
         rule.waitForIdle()
-        rule.onNodeWithTag(TopAppBarTestTag).captureToImage()
+        rule
+            .onNodeWithTag(TopAppBarTestTag)
+            .captureToImage()
             .assertContainsColor(fullyCollapsedContainerColor)
-        topTitleNode.captureToImage()
+        topTitleNode
+            .captureToImage()
             .assertContainsColor(
-                titleColor.copy(alpha = TopTitleAlphaEasing.transform(1f))
+                titleColor
+                    .copy(alpha = TopTitleAlphaEasing.transform(1f))
                     .compositeOver(fullyCollapsedContainerColor)
             )
         // Only the top title should be visible in the collapsed form.
@@ -1844,9 +1733,7 @@
         assertSingleTitleSemanticNode()
     }
 
-    /**
-     * Asserts that only one semantic node exists at app bar title when the tree is merged.
-     */
+    /** Asserts that only one semantic node exists at app bar title when the tree is merged. */
     private fun assertSingleTitleSemanticNode() {
         val unmergedTitleNodes = rule.onAllNodesWithTag(TitleTestTag, useUnmergedTree = true)
         unmergedTitleNodes.assertCountEquals(2)
@@ -1860,14 +1747,15 @@
      *
      * An [IconButton] is defaulted to be 48X48dp, while its child [Icon] is defaulted to 24x24dp.
      */
-    private val FakeIcon = @Composable { modifier: Modifier ->
-        IconButton(
-            onClick = { /* doSomething() */ },
-            modifier = modifier.semantics(mergeDescendants = true) {}
-        ) {
-            Icon(ColorPainter(Color.Red), null)
+    private val FakeIcon =
+        @Composable { modifier: Modifier ->
+            IconButton(
+                onClick = { /* doSomething() */ },
+                modifier = modifier.semantics(mergeDescendants = true) {}
+            ) {
+                Icon(ColorPainter(Color.Red), null)
+            }
         }
-    }
 
     private fun expectedActionPosition(appBarWidth: Dp): Dp =
         appBarWidth - AppBarStartAndEndPadding - FakeIconSize
diff --git a/compose/material3/material3/src/androidInstrumentedTest/kotlin/androidx/compose/material3/BadgeScreenshotTest.kt b/compose/material3/material3/src/androidInstrumentedTest/kotlin/androidx/compose/material3/BadgeScreenshotTest.kt
index da9daa7..2400c06 100644
--- a/compose/material3/material3/src/androidInstrumentedTest/kotlin/androidx/compose/material3/BadgeScreenshotTest.kt
+++ b/compose/material3/material3/src/androidInstrumentedTest/kotlin/androidx/compose/material3/BadgeScreenshotTest.kt
@@ -43,11 +43,9 @@
 @SdkSuppress(minSdkVersion = Build.VERSION_CODES.O)
 class BadgeScreenshotTest {
 
-    @get:Rule
-    val composeTestRule = createComposeRule()
+    @get:Rule val composeTestRule = createComposeRule()
 
-    @get:Rule
-    val screenshotRule = AndroidXScreenshotTestRule(GOLDEN_MATERIAL3)
+    @get:Rule val screenshotRule = AndroidXScreenshotTestRule(GOLDEN_MATERIAL3)
 
     @Test
     fun lightTheme_noContent() {
@@ -56,15 +54,11 @@
                 Modifier.size(56.dp).semantics(mergeDescendants = true) {}.testTag(TestTag),
                 contentAlignment = Alignment.Center
             ) {
-                BadgedBox(badge = { Badge() }) {
-                    Icon(Icons.Filled.Favorite, null)
-                }
+                BadgedBox(badge = { Badge() }) { Icon(Icons.Filled.Favorite, null) }
             }
         }
 
-        assertBadgeAgainstGolden(
-            goldenIdentifier = "badge_lightTheme_noContent"
-        )
+        assertBadgeAgainstGolden(goldenIdentifier = "badge_lightTheme_noContent")
     }
 
     @Test
@@ -74,15 +68,11 @@
                 Modifier.size(56.dp).semantics(mergeDescendants = true) {}.testTag(TestTag),
                 contentAlignment = Alignment.Center
             ) {
-                BadgedBox(badge = { Badge() }) {
-                    Icon(Icons.Filled.Favorite, null)
-                }
+                BadgedBox(badge = { Badge() }) { Icon(Icons.Filled.Favorite, null) }
             }
         }
 
-        assertBadgeAgainstGolden(
-            goldenIdentifier = "badge_darkTheme_noContent"
-        )
+        assertBadgeAgainstGolden(goldenIdentifier = "badge_darkTheme_noContent")
     }
 
     @Test
@@ -92,15 +82,11 @@
                 Modifier.size(56.dp).semantics(mergeDescendants = true) {}.testTag(TestTag),
                 contentAlignment = Alignment.Center
             ) {
-                BadgedBox(badge = { Badge { Text("8") } }) {
-                    Icon(Icons.Filled.Favorite, null)
-                }
+                BadgedBox(badge = { Badge { Text("8") } }) { Icon(Icons.Filled.Favorite, null) }
             }
         }
 
-        assertBadgeAgainstGolden(
-            goldenIdentifier = "badge_lightTheme_withContent"
-        )
+        assertBadgeAgainstGolden(goldenIdentifier = "badge_lightTheme_withContent")
     }
 
     @Test
@@ -110,19 +96,16 @@
                 Modifier.size(56.dp).semantics(mergeDescendants = true) {}.testTag(TestTag),
                 contentAlignment = Alignment.Center
             ) {
-                BadgedBox(badge = { Badge { Text("8") } }) {
-                    Icon(Icons.Filled.Favorite, null)
-                }
+                BadgedBox(badge = { Badge { Text("8") } }) { Icon(Icons.Filled.Favorite, null) }
             }
         }
 
-        assertBadgeAgainstGolden(
-            goldenIdentifier = "badge_darkTheme_withContent"
-        )
+        assertBadgeAgainstGolden(goldenIdentifier = "badge_darkTheme_withContent")
     }
 
     private fun assertBadgeAgainstGolden(goldenIdentifier: String) {
-        composeTestRule.onNodeWithTag(TestTag)
+        composeTestRule
+            .onNodeWithTag(TestTag)
             .captureToImage()
             .assertAgainstGolden(screenshotRule, goldenIdentifier)
     }
diff --git a/compose/material3/material3/src/androidInstrumentedTest/kotlin/androidx/compose/material3/BadgeTest.kt b/compose/material3/material3/src/androidInstrumentedTest/kotlin/androidx/compose/material3/BadgeTest.kt
index f5179b3..dedc1fa 100644
--- a/compose/material3/material3/src/androidInstrumentedTest/kotlin/androidx/compose/material3/BadgeTest.kt
+++ b/compose/material3/material3/src/androidInstrumentedTest/kotlin/androidx/compose/material3/BadgeTest.kt
@@ -55,15 +55,12 @@
 
     private val icon = Icons.Filled.Favorite
 
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
     @Test
     fun badge_noContent_size() {
         rule
-            .setMaterialContentForSizeAssertions {
-                Badge()
-            }
+            .setMaterialContentForSizeAssertions { Badge() }
             .assertHeightIsEqualTo(BadgeTokens.Size)
             .assertWidthIsEqualTo(BadgeTokens.Size)
     }
@@ -71,9 +68,7 @@
     @Test
     fun badge_shortContent_size() {
         rule
-            .setMaterialContentForSizeAssertions {
-                Badge { Text("1") }
-            }
+            .setMaterialContentForSizeAssertions { Badge { Text("1") } }
             .assertHeightIsEqualTo(BadgeTokens.LargeSize)
             .assertWidthIsEqualTo(BadgeTokens.LargeSize)
     }
@@ -81,9 +76,7 @@
     @Test
     fun badge_longContent_size() {
         rule
-            .setMaterialContentForSizeAssertions {
-                Badge { Text("999+") }
-            }
+            .setMaterialContentForSizeAssertions { Badge { Text("999+") } }
             .assertHeightIsEqualTo(BadgeTokens.LargeSize)
             .assertWidthIsAtLeast(BadgeTokens.LargeSize)
     }
@@ -94,9 +87,7 @@
         val customHeight = 6.dp
         rule
             .setMaterialContentForSizeAssertions {
-                Badge(modifier = Modifier.size(customWidth, customHeight)) {
-                    Text("1")
-                }
+                Badge(modifier = Modifier.size(customWidth, customHeight)) { Text("1") }
             }
             .assertHeightIsEqualTo(customHeight)
             .assertWidthIsEqualTo(customWidth)
@@ -113,7 +104,8 @@
             Badge(modifier = Modifier.testTag(TestBadgeTag))
         }
 
-        rule.onNodeWithTag(TestBadgeTag)
+        rule
+            .onNodeWithTag(TestBadgeTag)
             .captureToImage()
             .assertShape(
                 density = rule.density,
@@ -126,16 +118,11 @@
 
     @Test
     fun badgeBox_noContent_position() {
-        rule
-            .setMaterialContent(lightColorScheme()) {
-                BadgedBox(badge = { Badge(Modifier.testTag(TestBadgeTag)) }) {
-                    Icon(
-                        icon,
-                        null,
-                        modifier = Modifier.testTag(TestAnchorTag)
-                    )
-                }
+        rule.setMaterialContent(lightColorScheme()) {
+            BadgedBox(badge = { Badge(Modifier.testTag(TestBadgeTag)) }) {
+                Icon(icon, null, modifier = Modifier.testTag(TestAnchorTag))
             }
+        }
         val badge = rule.onNodeWithTag(TestBadgeTag)
         val anchorBounds = rule.onNodeWithTag(TestAnchorTag).getUnclippedBoundsInRoot()
         badge.assertPositionInRootIsEqualTo(
@@ -146,22 +133,17 @@
 
     @Test
     fun badgeBox_shortContent_position() {
-        rule
-            .setMaterialContent(lightColorScheme()) {
-                BadgedBox(badge = { Badge { Text("8") } }) {
-                    Icon(
-                        icon,
-                        null,
-                        modifier = Modifier.testTag(TestAnchorTag)
-                    )
-                }
+        rule.setMaterialContent(lightColorScheme()) {
+            BadgedBox(badge = { Badge { Text("8") } }) {
+                Icon(icon, null, modifier = Modifier.testTag(TestAnchorTag))
             }
+        }
         val badge = rule.onNodeWithTag(TestAnchorTag).onSibling()
         val anchorBounds = rule.onNodeWithTag(TestAnchorTag).getUnclippedBoundsInRoot()
         val badgeBounds = badge.getUnclippedBoundsInRoot()
 
-        val totalBadgeHorizontalOffset = -BadgeWithContentHorizontalOffset +
-            BadgeWithContentHorizontalPadding
+        val totalBadgeHorizontalOffset =
+            -BadgeWithContentHorizontalOffset + BadgeWithContentHorizontalPadding
         badge.assertPositionInRootIsEqualTo(
             expectedLeft = anchorBounds.right + totalBadgeHorizontalOffset,
             expectedTop = -badgeBounds.height + BadgeWithContentVerticalOffset
@@ -170,22 +152,17 @@
 
     @Test
     fun badgeBox_longContent_position() {
-        rule
-            .setMaterialContent(lightColorScheme()) {
-                BadgedBox(badge = { Badge { Text("999+") } }) {
-                    Icon(
-                        icon,
-                        null,
-                        modifier = Modifier.testTag(TestAnchorTag)
-                    )
-                }
+        rule.setMaterialContent(lightColorScheme()) {
+            BadgedBox(badge = { Badge { Text("999+") } }) {
+                Icon(icon, null, modifier = Modifier.testTag(TestAnchorTag))
             }
+        }
         val badge = rule.onNodeWithTag(TestAnchorTag).onSibling()
         val anchorBounds = rule.onNodeWithTag(TestAnchorTag).getUnclippedBoundsInRoot()
         val badgeBounds = badge.getUnclippedBoundsInRoot()
 
-        val totalBadgeHorizontalOffset = -BadgeWithContentHorizontalOffset +
-            BadgeWithContentHorizontalPadding
+        val totalBadgeHorizontalOffset =
+            -BadgeWithContentHorizontalOffset + BadgeWithContentHorizontalPadding
         badge.assertPositionInRootIsEqualTo(
             expectedLeft = anchorBounds.right + totalBadgeHorizontalOffset,
             expectedTop = -badgeBounds.height + BadgeWithContentVerticalOffset
@@ -196,18 +173,15 @@
     fun badge_notMergingDescendants_withOwnContentDescription() {
         rule.setMaterialContent(lightColorScheme()) {
             BadgedBox(
-                badge = {
-                    Badge { Text("99+") }
-                },
-                modifier = Modifier.testTag(TestBadgeTag).semantics {
-                    this.contentDescription = "more than 99 new email"
-                }
+                badge = { Badge { Text("99+") } },
+                modifier =
+                    Modifier.testTag(TestBadgeTag).semantics {
+                        this.contentDescription = "more than 99 new email"
+                    }
             ) {
                 Text(
                     "inbox",
-                    Modifier.semantics {
-                        this.contentDescription = "inbox"
-                    }.testTag(TestAnchorTag)
+                    Modifier.semantics { this.contentDescription = "inbox" }.testTag(TestAnchorTag)
                 )
             }
         }
@@ -218,11 +192,10 @@
 
     @Test
     fun badgeBox_size() {
-        rule.setMaterialContentForSizeAssertions {
-            BadgedBox(badge = { Badge { Text("999+") } }) {
-                Icon(icon, null)
+        rule
+            .setMaterialContentForSizeAssertions {
+                BadgedBox(badge = { Badge { Text("999+") } }) { Icon(icon, null) }
             }
-        }
             .assertWidthIsEqualTo(icon.defaultWidth)
             .assertHeightIsEqualTo(icon.defaultHeight)
     }
@@ -233,23 +206,12 @@
         val badgeTag = "badgeTag"
 
         rule.setMaterialContent(lightColorScheme()) {
-            Box(
-                modifier = Modifier.size(50.dp)
-                    .testTag(greatGrandParentTag)
-            ) {
+            Box(modifier = Modifier.size(50.dp).testTag(greatGrandParentTag)) {
                 Box {
                     BadgedBox(
-                        badge = {
-                            Badge(modifier = Modifier
-                                .testTag(badgeTag)
-                            ) { Text("999+") }
-                        }
+                        badge = { Badge(modifier = Modifier.testTag(badgeTag)) { Text("999+") } }
                     ) {
-                        Icon(
-                            icon,
-                            null,
-                            modifier = Modifier.size(40.dp)
-                        )
+                        Icon(icon, null, modifier = Modifier.size(40.dp))
                     }
                 }
             }
diff --git a/compose/material3/material3/src/androidInstrumentedTest/kotlin/androidx/compose/material3/BottomSheetScaffoldTest.kt b/compose/material3/material3/src/androidInstrumentedTest/kotlin/androidx/compose/material3/BottomSheetScaffoldTest.kt
index 4c04927..624415c 100644
--- a/compose/material3/material3/src/androidInstrumentedTest/kotlin/androidx/compose/material3/BottomSheetScaffoldTest.kt
+++ b/compose/material3/material3/src/androidInstrumentedTest/kotlin/androidx/compose/material3/BottomSheetScaffoldTest.kt
@@ -109,8 +109,7 @@
 @OptIn(ExperimentalMaterial3Api::class)
 class BottomSheetScaffoldTest {
 
-    @get:Rule
-    val rule = createAndroidComposeRule<ComponentActivity>()
+    @get:Rule val rule = createAndroidComposeRule<ComponentActivity>()
     private val restorationTester = StateRestorationTester(rule)
 
     private val sheetHeight = 256.dp
@@ -125,9 +124,10 @@
         val initialValue = SheetValue.Expanded
         lateinit var state: BottomSheetScaffoldState
         restorationTester.setContent {
-            state = rememberBottomSheetScaffoldState(
-                bottomSheetState = rememberStandardBottomSheetState(initialValue),
-            )
+            state =
+                rememberBottomSheetScaffoldState(
+                    bottomSheetState = rememberStandardBottomSheetState(initialValue),
+                )
         }
         assertThat(state.bottomSheetState.currentValue).isEqualTo(initialValue)
         restorationTester.emulateSavedInstanceStateRestore()
@@ -138,12 +138,7 @@
     fun bottomSheetScaffold_testOffset_whenCollapsed() {
         rule.setContent {
             BottomSheetScaffold(
-                sheetContent = {
-                    Box(
-                        Modifier
-                            .fillMaxSize()
-                            .testTag(sheetTag))
-                },
+                sheetContent = { Box(Modifier.fillMaxSize().testTag(sheetTag)) },
                 sheetPeekHeight = peekHeight,
                 sheetDragHandle = null
             ) {
@@ -151,7 +146,8 @@
             }
         }
 
-        rule.onNodeWithTag(sheetTag)
+        rule
+            .onNodeWithTag(sheetTag)
             .assertTopPositionInRootIsEqualTo(rule.rootHeight() - peekHeight)
     }
 
@@ -159,22 +155,14 @@
     fun bottomSheetScaffold_testOffset_whenExpanded() {
         rule.setContent {
             BottomSheetScaffold(
-                scaffoldState = rememberBottomSheetScaffoldState(
-                    bottomSheetState = rememberStandardBottomSheetState(
-                        initialValue = SheetValue.Expanded)
-                ),
-                sheetContent = {
-                    Box(
-                        Modifier
-                            .fillMaxWidth()
-                            .requiredHeight(sheetHeight))
-                },
+                scaffoldState =
+                    rememberBottomSheetScaffoldState(
+                        bottomSheetState =
+                            rememberStandardBottomSheetState(initialValue = SheetValue.Expanded)
+                    ),
+                sheetContent = { Box(Modifier.fillMaxWidth().requiredHeight(sheetHeight)) },
                 sheetDragHandle = {
-                    Box(
-                        Modifier
-                            .fillMaxWidth()
-                            .requiredHeight(dragHandleSize)
-                            .testTag(sheetTag))
+                    Box(Modifier.fillMaxWidth().requiredHeight(dragHandleSize).testTag(sheetTag))
                 },
                 sheetPeekHeight = peekHeight
             ) {
@@ -182,7 +170,8 @@
             }
         }
 
-        rule.onNodeWithTag(sheetTag, useUnmergedTree = true)
+        rule
+            .onNodeWithTag(sheetTag, useUnmergedTree = true)
             .assertTopPositionInRootIsEqualTo(rule.rootHeight() - (sheetHeight + dragHandleSize))
     }
 
@@ -191,23 +180,18 @@
         rule.setContent {
             BottomSheetScaffold(
                 sheetContent = {
-                    Box(
-                        Modifier
-                            .fillMaxWidth()
-                            .requiredHeight(sheetHeight)
-                            .testTag(sheetTag))
+                    Box(Modifier.fillMaxWidth().requiredHeight(sheetHeight).testTag(sheetTag))
                 },
-                sheetDragHandle = { Box(
-                    Modifier
-                        .testTag(dragHandleTag)
-                        .size(dragHandleSize)) },
+                sheetDragHandle = { Box(Modifier.testTag(dragHandleTag).size(dragHandleSize)) },
                 sheetPeekHeight = peekHeight
             ) {
                 Text("Content")
             }
         }
 
-        rule.onNodeWithTag(dragHandleTag, useUnmergedTree = true).onParent()
+        rule
+            .onNodeWithTag(dragHandleTag, useUnmergedTree = true)
+            .onParent()
             .assert(SemanticsMatcher.keyNotDefined(SemanticsActions.Collapse))
             .assert(SemanticsMatcher.keyIsDefined(SemanticsActions.Expand))
             .performSemanticsAction(SemanticsActions.Expand)
@@ -215,7 +199,8 @@
         rule.waitForIdle()
         val expectedSheetHeight = sheetHeight + dragHandleSize
 
-        rule.onNodeWithTag(dragHandleTag, useUnmergedTree = true)
+        rule
+            .onNodeWithTag(dragHandleTag, useUnmergedTree = true)
             .assertTopPositionInRootIsEqualTo(rule.rootHeight() - expectedSheetHeight)
     }
 
@@ -224,28 +209,22 @@
         rule.setContent {
             BottomSheetScaffold(
                 sheetContent = {
-                    Box(
-                        Modifier
-                            .fillMaxWidth()
-                            .requiredHeight(sheetHeight)
-                            .testTag(sheetTag))
+                    Box(Modifier.fillMaxWidth().requiredHeight(sheetHeight).testTag(sheetTag))
                 },
-                sheetDragHandle = { Box(
-                    Modifier
-                        .testTag(dragHandleTag)
-                        .size(dragHandleSize)) },
+                sheetDragHandle = { Box(Modifier.testTag(dragHandleTag).size(dragHandleSize)) },
                 sheetPeekHeight = peekHeight,
-                scaffoldState = rememberBottomSheetScaffoldState(
-                    bottomSheetState = rememberStandardBottomSheetState(
-                        skipHiddenState = false
+                scaffoldState =
+                    rememberBottomSheetScaffoldState(
+                        bottomSheetState = rememberStandardBottomSheetState(skipHiddenState = false)
                     )
-                )
             ) {
                 Text("Content")
             }
         }
 
-        rule.onNodeWithTag(dragHandleTag, useUnmergedTree = true).onParent()
+        rule
+            .onNodeWithTag(dragHandleTag, useUnmergedTree = true)
+            .onParent()
             .assert(SemanticsMatcher.keyNotDefined(SemanticsActions.Collapse))
             .assert(SemanticsMatcher.keyIsDefined(SemanticsActions.Dismiss))
             .assert(SemanticsMatcher.keyIsDefined(SemanticsActions.Expand))
@@ -253,28 +232,27 @@
 
         rule.waitForIdle()
 
-        rule.onNodeWithTag(dragHandleTag, useUnmergedTree = true)
+        rule
+            .onNodeWithTag(dragHandleTag, useUnmergedTree = true)
             .assertTopPositionInRootIsEqualTo(rule.rootHeight())
     }
 
     @Test
     fun bottomSheetScaffold_testHideReturnsIllegalStateException() {
         lateinit var scope: CoroutineScope
-        val bottomSheetState = SheetState(
-            skipPartiallyExpanded = false,
-            skipHiddenState = true,
-            initialValue = SheetValue.PartiallyExpanded,
-            density = rule.density
-        )
+        val bottomSheetState =
+            SheetState(
+                skipPartiallyExpanded = false,
+                skipHiddenState = true,
+                initialValue = SheetValue.PartiallyExpanded,
+                density = rule.density
+            )
         rule.setContent {
             scope = rememberCoroutineScope()
             BottomSheetScaffold(
-                sheetContent = {
-                    Box(Modifier.fillMaxWidth().requiredHeight(sheetHeight))
-                },
-                scaffoldState = rememberBottomSheetScaffoldState(
-                    bottomSheetState = bottomSheetState
-                )
+                sheetContent = { Box(Modifier.fillMaxWidth().requiredHeight(sheetHeight)) },
+                scaffoldState =
+                    rememberBottomSheetScaffoldState(bottomSheetState = bottomSheetState)
             ) {
                 Text("Content")
             }
@@ -283,10 +261,12 @@
             val exception = kotlin.runCatching { bottomSheetState.hide() }.exceptionOrNull()
             assertThat(exception).isNotNull()
             assertThat(exception).isInstanceOf(IllegalStateException::class.java)
-            assertThat(exception).hasMessageThat().containsMatch(
-                "Attempted to animate to hidden when skipHiddenState was enabled. Set " +
-                    "skipHiddenState to false to use this function."
-            )
+            assertThat(exception)
+                .hasMessageThat()
+                .containsMatch(
+                    "Attempted to animate to hidden when skipHiddenState was enabled. Set " +
+                        "skipHiddenState to false to use this function."
+                )
         }
     }
 
@@ -294,35 +274,32 @@
     fun bottomSheetScaffold_testCollapseAction_whenExpanded() {
         rule.setContent {
             BottomSheetScaffold(
-                scaffoldState = rememberBottomSheetScaffoldState(
-                    bottomSheetState = rememberStandardBottomSheetState(
-                        initialValue = SheetValue.Expanded)
-                ),
+                scaffoldState =
+                    rememberBottomSheetScaffoldState(
+                        bottomSheetState =
+                            rememberStandardBottomSheetState(initialValue = SheetValue.Expanded)
+                    ),
                 sheetContent = {
-                    Box(
-                        Modifier
-                            .fillMaxWidth()
-                            .requiredHeight(sheetHeight)
-                            .testTag(sheetTag))
+                    Box(Modifier.fillMaxWidth().requiredHeight(sheetHeight).testTag(sheetTag))
                 },
-                sheetDragHandle = { Box(
-                    Modifier
-                        .testTag(dragHandleTag)
-                        .size(dragHandleSize)) },
+                sheetDragHandle = { Box(Modifier.testTag(dragHandleTag).size(dragHandleSize)) },
                 sheetPeekHeight = peekHeight
             ) {
                 Text("Content")
             }
         }
 
-        rule.onNodeWithTag(dragHandleTag, useUnmergedTree = true).onParent()
+        rule
+            .onNodeWithTag(dragHandleTag, useUnmergedTree = true)
+            .onParent()
             .assert(SemanticsMatcher.keyNotDefined(SemanticsActions.Expand))
             .assert(SemanticsMatcher.keyIsDefined(SemanticsActions.Collapse))
             .performSemanticsAction(SemanticsActions.Collapse)
 
         rule.waitForIdle()
 
-        rule.onNodeWithTag(dragHandleTag, useUnmergedTree = true)
+        rule
+            .onNodeWithTag(dragHandleTag, useUnmergedTree = true)
             .assertTopPositionInRootIsEqualTo(rule.rootHeight() - peekHeight)
     }
 
@@ -332,12 +309,7 @@
             CompositionLocalProvider(LocalDensity provides Density(1f, 1f)) {
                 BottomSheetScaffold(
                     sheetContent = {
-                        Box(
-                            Modifier
-                                .fillMaxWidth()
-                                .requiredHeight(peekHeight)
-                                .testTag(sheetTag)
-                        )
+                        Box(Modifier.fillMaxWidth().requiredHeight(peekHeight).testTag(sheetTag))
                     },
                     sheetDragHandle = null,
                     sheetPeekHeight = peekHeight
@@ -347,72 +319,65 @@
             }
         }
 
-        rule.onNodeWithTag(sheetTag).onParent()
+        rule
+            .onNodeWithTag(sheetTag)
+            .onParent()
             .assert(SemanticsMatcher.keyNotDefined(SemanticsActions.Expand))
             .assert(SemanticsMatcher.keyNotDefined(SemanticsActions.Collapse))
     }
 
     @Test
-    fun bottomSheetScaffold_revealAndConceal_manually(): Unit = runBlocking(AutoTestFrameClock()) {
-        lateinit var bottomSheetState: SheetState
-        rule.setContent {
-            bottomSheetState = rememberStandardBottomSheetState(
-                initialValue = SheetValue.PartiallyExpanded)
-            BottomSheetScaffold(
-                scaffoldState = rememberBottomSheetScaffoldState(
-                    bottomSheetState = bottomSheetState
-                ),
-                sheetContent = {
-                    Box(
-                        Modifier
-                            .fillMaxWidth()
-                            .requiredHeight(sheetHeight))
-                },
-                sheetDragHandle = {
-                    Box(
-                        Modifier
-                            .fillMaxWidth()
-                            .requiredHeight(dragHandleSize)
-                            .testTag(sheetTag))
-                },
-                sheetPeekHeight = peekHeight,
-                content = { Text("Content") }
-            )
+    fun bottomSheetScaffold_revealAndConceal_manually(): Unit =
+        runBlocking(AutoTestFrameClock()) {
+            lateinit var bottomSheetState: SheetState
+            rule.setContent {
+                bottomSheetState =
+                    rememberStandardBottomSheetState(initialValue = SheetValue.PartiallyExpanded)
+                BottomSheetScaffold(
+                    scaffoldState =
+                        rememberBottomSheetScaffoldState(bottomSheetState = bottomSheetState),
+                    sheetContent = { Box(Modifier.fillMaxWidth().requiredHeight(sheetHeight)) },
+                    sheetDragHandle = {
+                        Box(
+                            Modifier.fillMaxWidth().requiredHeight(dragHandleSize).testTag(sheetTag)
+                        )
+                    },
+                    sheetPeekHeight = peekHeight,
+                    content = { Text("Content") }
+                )
+            }
+            val expectedHeight = sheetHeight + dragHandleSize
+
+            rule
+                .onNodeWithTag(sheetTag, useUnmergedTree = true)
+                .assertTopPositionInRootIsEqualTo(rule.rootHeight() - peekHeight)
+
+            bottomSheetState.expand()
+            rule.waitForIdle()
+
+            rule
+                .onNodeWithTag(sheetTag, useUnmergedTree = true)
+                .assertTopPositionInRootIsEqualTo(rule.rootHeight() - expectedHeight)
+
+            bottomSheetState.partialExpand()
+            rule.waitForIdle()
+
+            rule
+                .onNodeWithTag(sheetTag, useUnmergedTree = true)
+                .assertTopPositionInRootIsEqualTo(rule.rootHeight() - peekHeight)
         }
-        val expectedHeight = sheetHeight + dragHandleSize
-
-        rule.onNodeWithTag(sheetTag, useUnmergedTree = true)
-            .assertTopPositionInRootIsEqualTo(rule.rootHeight() - peekHeight)
-
-        bottomSheetState.expand()
-        rule.waitForIdle()
-
-        rule.onNodeWithTag(sheetTag, useUnmergedTree = true)
-            .assertTopPositionInRootIsEqualTo(rule.rootHeight() - expectedHeight)
-
-        bottomSheetState.partialExpand()
-        rule.waitForIdle()
-
-        rule.onNodeWithTag(sheetTag, useUnmergedTree = true)
-            .assertTopPositionInRootIsEqualTo(rule.rootHeight() - peekHeight)
-    }
 
     @Test
     fun bottomSheetScaffold_revealBySwiping() {
         lateinit var bottomSheetState: SheetState
         rule.setContent {
-            bottomSheetState = rememberStandardBottomSheetState(
-                initialValue = SheetValue.PartiallyExpanded)
+            bottomSheetState =
+                rememberStandardBottomSheetState(initialValue = SheetValue.PartiallyExpanded)
             BottomSheetScaffold(
-                scaffoldState = rememberBottomSheetScaffoldState(
-                    bottomSheetState = bottomSheetState
-                ),
+                scaffoldState =
+                    rememberBottomSheetScaffoldState(bottomSheetState = bottomSheetState),
                 sheetContent = {
-                    Box(
-                        Modifier
-                            .fillMaxWidth()
-                            .requiredHeight(sheetHeight)
-                            .testTag(sheetTag))
+                    Box(Modifier.fillMaxWidth().requiredHeight(sheetHeight).testTag(sheetTag))
                 },
                 sheetDragHandle = null,
                 sheetPeekHeight = peekHeight,
@@ -424,16 +389,12 @@
             assertThat(bottomSheetState.currentValue).isEqualTo(SheetValue.PartiallyExpanded)
         }
 
-        rule.onNodeWithTag(sheetTag)
-            .performTouchInput { swipeUp() }
+        rule.onNodeWithTag(sheetTag).performTouchInput { swipeUp() }
         rule.waitForIdle()
 
-        rule.runOnIdle {
-            assertThat(bottomSheetState.currentValue).isEqualTo(SheetValue.Expanded)
-        }
+        rule.runOnIdle { assertThat(bottomSheetState.currentValue).isEqualTo(SheetValue.Expanded) }
 
-        rule.onNodeWithTag(sheetTag)
-            .performTouchInput { swipeDown() }
+        rule.onNodeWithTag(sheetTag).performTouchInput { swipeDown() }
         rule.waitForIdle()
 
         rule.runOnIdle {
@@ -445,22 +406,18 @@
     fun bottomSheetScaffold_respectsConfirmStateChange() {
         lateinit var bottomSheetState: SheetState
         rule.setContent {
-            bottomSheetState = rememberStandardBottomSheetState(
-                initialValue = SheetValue.PartiallyExpanded,
-                confirmValueChange = {
-                    it != SheetValue.Expanded
-                }
-            )
+            bottomSheetState =
+                rememberStandardBottomSheetState(
+                    initialValue = SheetValue.PartiallyExpanded,
+                    confirmValueChange = { it != SheetValue.Expanded }
+                )
             BottomSheetScaffold(
-                scaffoldState = rememberBottomSheetScaffoldState(
-                    bottomSheetState = bottomSheetState,
-                ),
+                scaffoldState =
+                    rememberBottomSheetScaffoldState(
+                        bottomSheetState = bottomSheetState,
+                    ),
                 sheetContent = {
-                    Box(
-                        Modifier
-                            .fillMaxWidth()
-                            .requiredHeight(sheetHeight)
-                            .testTag(sheetTag))
+                    Box(Modifier.fillMaxWidth().requiredHeight(sheetHeight).testTag(sheetTag))
                 },
                 sheetPeekHeight = peekHeight,
                 content = { Text("Content") }
@@ -471,15 +428,16 @@
             assertThat(bottomSheetState.currentValue).isEqualTo(SheetValue.PartiallyExpanded)
         }
 
-        rule.onNodeWithTag(sheetTag)
-            .performTouchInput { swipeUp() }
+        rule.onNodeWithTag(sheetTag).performTouchInput { swipeUp() }
         rule.waitForIdle()
 
         rule.runOnIdle {
             assertThat(bottomSheetState.currentValue).isEqualTo(SheetValue.PartiallyExpanded)
         }
 
-        rule.onNodeWithTag(sheetTag).onParent()
+        rule
+            .onNodeWithTag(sheetTag)
+            .onParent()
             .assert(SemanticsMatcher.keyNotDefined(SemanticsActions.Collapse))
             .assert(SemanticsMatcher.keyNotDefined(SemanticsActions.Expand))
     }
@@ -488,18 +446,13 @@
     fun bottomSheetScaffold_revealBySwiping_gesturesDisabled() {
         lateinit var bottomSheetState: SheetState
         rule.setContent {
-            bottomSheetState = rememberStandardBottomSheetState(
-                initialValue = SheetValue.PartiallyExpanded)
+            bottomSheetState =
+                rememberStandardBottomSheetState(initialValue = SheetValue.PartiallyExpanded)
             BottomSheetScaffold(
-                scaffoldState = rememberBottomSheetScaffoldState(
-                    bottomSheetState = bottomSheetState
-                ),
+                scaffoldState =
+                    rememberBottomSheetScaffoldState(bottomSheetState = bottomSheetState),
                 sheetContent = {
-                    Box(
-                        Modifier
-                            .fillMaxWidth()
-                            .requiredHeight(300.dp)
-                            .testTag(sheetTag))
+                    Box(Modifier.fillMaxWidth().requiredHeight(300.dp).testTag(sheetTag))
                 },
                 sheetSwipeEnabled = false,
                 sheetPeekHeight = peekHeight,
@@ -511,8 +464,7 @@
             assertThat(bottomSheetState.currentValue).isEqualTo(SheetValue.PartiallyExpanded)
         }
 
-        rule.onNodeWithTag(sheetTag)
-            .performTouchInput { swipeUp() }
+        rule.onNodeWithTag(sheetTag).performTouchInput { swipeUp() }
 
         rule.runOnIdle {
             assertThat(bottomSheetState.currentValue).isEqualTo(SheetValue.PartiallyExpanded)
@@ -528,8 +480,7 @@
             BottomSheetScaffold(
                 topBar = {
                     Box(
-                        Modifier
-                            .fillMaxWidth()
+                        Modifier.fillMaxWidth()
                             .height(50.dp)
                             .background(color = Color.Red)
                             .onGloballyPositioned { positioned: LayoutCoordinates ->
@@ -538,13 +489,12 @@
                             }
                     )
                 },
-                sheetContent = {
-                    Box(Modifier.requiredSize(10.dp))
-                }
+                sheetContent = { Box(Modifier.requiredSize(10.dp)) }
             ) {
                 Box(
-                    Modifier
-                        .onGloballyPositioned { contentPosition = it.localToWindow(Offset.Zero) }
+                    Modifier.onGloballyPositioned {
+                            contentPosition = it.localToWindow(Offset.Zero)
+                        }
                         .fillMaxWidth()
                         .height(50.dp)
                         .background(Color.Blue)
@@ -559,42 +509,33 @@
     fun bottomSheetScaffold_topAppBarIsDrawnOnTopOfContent() {
         rule.setContent {
             Box(
-                Modifier
-                    .requiredSize(10.dp, 20.dp)
+                Modifier.requiredSize(10.dp, 20.dp)
                     .semantics(mergeDescendants = true) {}
                     .testTag("Scaffold")
             ) {
                 BottomSheetScaffold(
                     topBar = {
                         Box(
-                            Modifier
-                                .requiredSize(10.dp)
+                            Modifier.requiredSize(10.dp)
                                 .shadow(4.dp)
                                 .zIndex(4f)
                                 .background(color = Color.White)
                         )
                     },
-                    sheetContent = {
-                        Box(Modifier.requiredSize(0.dp))
-                    }
+                    sheetContent = { Box(Modifier.requiredSize(0.dp)) }
                 ) {
-                    Box(
-                        Modifier
-                            .requiredSize(10.dp)
-                            .background(color = Color.White)
-                    )
+                    Box(Modifier.requiredSize(10.dp).background(color = Color.White))
                 }
             }
         }
 
-        rule.onNodeWithTag("Scaffold")
-            .captureToImage().asAndroidBitmap().apply {
-                // asserts the appbar(top half part) has the shadow
-                val yPos = height / 2 + 2
-                assertThat(Color(getPixel(0, yPos))).isNotEqualTo(Color.White)
-                assertThat(Color(getPixel(width / 2, yPos))).isNotEqualTo(Color.White)
-                assertThat(Color(getPixel(width - 1, yPos))).isNotEqualTo(Color.White)
-            }
+        rule.onNodeWithTag("Scaffold").captureToImage().asAndroidBitmap().apply {
+            // asserts the appbar(top half part) has the shadow
+            val yPos = height / 2 + 2
+            assertThat(Color(getPixel(0, yPos))).isNotEqualTo(Color.White)
+            assertThat(Color(getPixel(width / 2, yPos))).isNotEqualTo(Color.White)
+            assertThat(Color(getPixel(width - 1, yPos))).isNotEqualTo(Color.White)
+        }
     }
 
     @Test
@@ -603,21 +544,14 @@
 
         rule.setContent {
             BottomSheetScaffold(
-                sheetContent = {
-                    Box(
-                        Modifier
-                            .fillMaxWidth()
-                            .requiredHeight(100.dp))
-                },
+                sheetContent = { Box(Modifier.fillMaxWidth().requiredHeight(100.dp)) },
                 sheetPeekHeight = peekHeight
             ) {
                 innerPadding = it
                 Text("body")
             }
         }
-        rule.runOnIdle {
-            assertThat(innerPadding.calculateBottomPadding()).isEqualTo(peekHeight)
-        }
+        rule.runOnIdle { assertThat(innerPadding.calculateBottomPadding()).isEqualTo(peekHeight) }
     }
 
     // TODO(330937081): Update test logic to instead change virtual screen size.
@@ -627,30 +561,28 @@
         rule.activity.requestedOrientation = ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE
         val latch = CountDownLatch(1)
 
-        rule.activity.application.registerComponentCallbacks(object : ComponentCallbacks2 {
-            override fun onConfigurationChanged(p0: Configuration) {
-                latch.countDown()
-            }
+        rule.activity.application.registerComponentCallbacks(
+            object : ComponentCallbacks2 {
+                override fun onConfigurationChanged(p0: Configuration) {
+                    latch.countDown()
+                }
 
-            override fun onLowMemory() {
-                // NO-OP
-            }
+                override fun onLowMemory() {
+                    // NO-OP
+                }
 
-            override fun onTrimMemory(p0: Int) {
-                // NO-OP
+                override fun onTrimMemory(p0: Int) {
+                    // NO-OP
+                }
             }
-        })
+        )
 
         try {
             latch.await(1500, TimeUnit.MILLISECONDS)
             rule.setContent {
-                BottomSheetScaffold(sheetContent = {
-                    Box(
-                        Modifier
-                            .testTag(sheetTag)
-                            .fillMaxHeight(0.4f)
-                    )
-                }) {
+                BottomSheetScaffold(
+                    sheetContent = { Box(Modifier.testTag(sheetTag).fillMaxHeight(0.4f)) }
+                ) {
                     Text("body")
                 }
             }
@@ -658,17 +590,17 @@
             val maxSheetWidth = 640.dp
             val expectedSheetWidth = maxSheetWidth.coerceAtMost(rootWidth)
             // Our sheet should be max 640 dp but fill the width if the container is less wide
-            val expectedSheetLeft = if (rootWidth <= expectedSheetWidth) {
-                0.dp
-            } else {
-                (rootWidth - expectedSheetWidth) / 2
-            }
+            val expectedSheetLeft =
+                if (rootWidth <= expectedSheetWidth) {
+                    0.dp
+                } else {
+                    (rootWidth - expectedSheetWidth) / 2
+                }
 
-            rule.onNodeWithTag(sheetTag)
+            rule
+                .onNodeWithTag(sheetTag)
                 .onParent()
-                .assertLeftPositionInRootIsEqualTo(
-                    expectedLeft = expectedSheetLeft
-                )
+                .assertLeftPositionInRootIsEqualTo(expectedLeft = expectedSheetLeft)
                 .assertWidthIsEqualTo(expectedSheetWidth)
         } catch (e: InterruptedException) {
             TestCase.fail("Unable to verify sheet width in landscape orientation")
@@ -684,19 +616,21 @@
         rule.activity.requestedOrientation = ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE
         val latch = CountDownLatch(1)
 
-        rule.activity.application.registerComponentCallbacks(object : ComponentCallbacks2 {
-            override fun onConfigurationChanged(p0: Configuration) {
-                latch.countDown()
-            }
+        rule.activity.application.registerComponentCallbacks(
+            object : ComponentCallbacks2 {
+                override fun onConfigurationChanged(p0: Configuration) {
+                    latch.countDown()
+                }
 
-            override fun onLowMemory() {
-                // NO-OP
-            }
+                override fun onLowMemory() {
+                    // NO-OP
+                }
 
-            override fun onTrimMemory(p0: Int) {
-                // NO-OP
+                override fun onTrimMemory(p0: Int) {
+                    // NO-OP
+                }
             }
-        })
+        )
 
         try {
             latch.await(1500, TimeUnit.MILLISECONDS)
@@ -706,13 +640,7 @@
                 screenWidthPx = context.resources.displayMetrics.widthPixels
                 BottomSheetScaffold(
                     sheetMaxWidth = Dp.Unspecified,
-                    sheetContent = {
-                        Box(
-                            Modifier
-                                .testTag(sheetTag)
-                                .fillMaxHeight(0.4f)
-                        )
-                    }
+                    sheetContent = { Box(Modifier.testTag(sheetTag).fillMaxHeight(0.4f)) }
                 ) {
                     Text("body")
                 }
@@ -746,14 +674,8 @@
                 scaffoldState = rememberBottomSheetScaffoldState(bottomSheetState = sheetState),
                 sheetContent = {
                     sheetScrollState = rememberScrollState()
-                    Column(
-                        Modifier
-                            .verticalScroll(sheetScrollState)
-                            .testTag(sheetTag)
-                    ) {
-                        repeat(100) {
-                            Text(it.toString(), Modifier.requiredHeight(50.dp))
-                        }
+                    Column(Modifier.verticalScroll(sheetScrollState).testTag(sheetTag)) {
+                        repeat(100) { Text(it.toString(), Modifier.requiredHeight(50.dp)) }
                     }
                 },
                 sheetPeekHeight = peekHeight,
@@ -767,20 +689,16 @@
                                 TopAppBarDefaults.topAppBarColors()
                                     .containerColor(colorTransitionFraction = 1f)
                         },
-                    modifier = Modifier.testTag("AppBar"),
-                    scrollBehavior = topAppBarScrollBehavior
-                )
-            }
+                        modifier = Modifier.testTag("AppBar"),
+                        scrollBehavior = topAppBarScrollBehavior
+                    )
+                }
             ) {
                 scaffoldContentScrollState = rememberScrollState()
                 Column(
-                    Modifier
-                        .verticalScroll(scaffoldContentScrollState)
-                        .testTag(scaffoldContentTag)
+                    Modifier.verticalScroll(scaffoldContentScrollState).testTag(scaffoldContentTag)
                 ) {
-                    repeat(100) {
-                        Text(it.toString(), Modifier.requiredHeight(50.dp))
-                    }
+                    repeat(100) { Text(it.toString(), Modifier.requiredHeight(50.dp)) }
                 }
             }
         }
@@ -790,34 +708,33 @@
         assertThat(sheetState.currentValue).isEqualTo(SheetValue.PartiallyExpanded)
 
         // At a partial scroll, sheet expands but sheetScrollStateValue is at 0.
-        rule.onNodeWithTag(sheetTag)
-            .performTouchInput {
-                swipeUp(startY = bottom, endY = bottom / 2)
-            }
+        rule.onNodeWithTag(sheetTag).performTouchInput {
+            swipeUp(startY = bottom, endY = bottom / 2)
+        }
         rule.waitForIdle()
         assertThat(sheetScrollState.value).isEqualTo(0)
         assertThat(sheetState.currentValue).isEqualTo(SheetValue.Expanded)
         // Color of TopAppBar has not changed.
-        rule.onNodeWithTag("AppBar").captureToImage()
+        rule
+            .onNodeWithTag("AppBar")
+            .captureToImage()
             .assertContainsColor(expectedPreScrollContentColor)
 
-        rule.onNodeWithTag(sheetTag)
-            .performTouchInput {
-                swipeDown(startY = top, endY = bottom)
-            }
+        rule.onNodeWithTag(sheetTag).performTouchInput { swipeDown(startY = top, endY = bottom) }
         rule.waitForIdle()
         assertThat(sheetScrollState.value).isEqualTo(0)
         assertThat(sheetState.currentValue).isEqualTo(SheetValue.PartiallyExpanded)
 
         // On content scroll, TopAppBar color updates while sheet state remains PartiallyExpanded
-        rule.onNodeWithTag(scaffoldContentTag)
-            .performTouchInput {
-                swipeUp(startY = bottom / 2, endY = top)
-            }
+        rule.onNodeWithTag(scaffoldContentTag).performTouchInput {
+            swipeUp(startY = bottom / 2, endY = top)
+        }
         assertThat(sheetScrollState.value).isEqualTo(0)
         assertThat(sheetState.currentValue).isEqualTo(SheetValue.PartiallyExpanded)
         assertThat(scaffoldContentScrollState.value).isGreaterThan(0)
-        rule.onNodeWithTag("AppBar").captureToImage()
+        rule
+            .onNodeWithTag("AppBar")
+            .captureToImage()
             .assertContainsColor(expectedPostScrolledContainerColor)
     }
 
@@ -835,21 +752,13 @@
                 sheetSwipeEnabled = false,
                 sheetContent = {
                     sheetContentScrollState = rememberScrollState()
-                    Column(
-                        Modifier
-                            .verticalScroll(sheetContentScrollState)
-                            .testTag(sheetTag)
-                    ) {
-                        repeat(100) {
-                            Text(it.toString(), Modifier.requiredHeight(50.dp))
-                        }
+                    Column(Modifier.verticalScroll(sheetContentScrollState).testTag(sheetTag)) {
+                        repeat(100) { Text(it.toString(), Modifier.requiredHeight(50.dp)) }
                     }
                 },
                 sheetPeekHeight = peekHeight,
             ) {
-                Box(Modifier.fillMaxSize()) {
-                    Text("Content")
-                }
+                Box(Modifier.fillMaxSize()) { Text("Content") }
             }
         }
 
@@ -859,10 +768,7 @@
 
         // Scrolling up within the sheet causes content to scroll without changing sheet state
         // because swipe gestures are disabled.
-        rule.onNodeWithTag(sheetTag)
-            .performTouchInput {
-                swipeUp()
-            }
+        rule.onNodeWithTag(sheetTag).performTouchInput { swipeUp() }
         rule.waitForIdle()
         assertThat(sheetContentScrollState.value).isGreaterThan(0)
         assertThat(sheetState.currentValue).isEqualTo(SheetValue.PartiallyExpanded)
@@ -879,10 +785,7 @@
 
         // Scrolling down within the sheet causes content to scroll without changing sheet state
         // because swipe gestures are disabled.
-        rule.onNodeWithTag(sheetTag)
-            .performTouchInput {
-                swipeDown()
-            }
+        rule.onNodeWithTag(sheetTag).performTouchInput { swipeDown() }
         rule.waitForIdle()
         assertThat(sheetContentScrollState.value).isEqualTo(0)
         assertThat(sheetState.currentValue).isEqualTo(SheetValue.Expanded)
@@ -898,12 +801,7 @@
             val density = LocalDensity.current
             screenWidth = with(density) { context.resources.displayMetrics.widthPixels.toDp() }
             BottomSheetScaffold(
-                sheetContent = {
-                    Box(
-                        Modifier
-                            .fillMaxSize()
-                            .testTag(sheetTag))
-                },
+                sheetContent = { Box(Modifier.fillMaxSize().testTag(sheetTag)) },
                 sheetPeekHeight = peekHeight,
                 sheetMaxWidth = sheetMaxWidth.value,
                 sheetDragHandle = null
@@ -941,13 +839,8 @@
             density = LocalDensity.current
             BottomSheetScaffold(
                 sheetContent = {
-                    Box(
-                        Modifier
-                            .height(sheetHeight)
-                            .fillMaxWidth()
-                            .testTag(sheetTag)
-                        )
-                    },
+                    Box(Modifier.height(sheetHeight).fillMaxWidth().testTag(sheetTag))
+                },
                 sheetPeekHeight = peekHeight,
                 sheetDragHandle = {
                     BottomSheetDefaults.DragHandle(
@@ -955,17 +848,13 @@
                     )
                 },
                 topBar = {
-                    Box(modifier = Modifier
-                        .height(topBarHeight)
-                        .fillMaxWidth()
-                        .testTag("TopBar")
-                    )
+                    Box(modifier = Modifier.height(topBarHeight).fillMaxWidth().testTag("TopBar"))
                 },
                 snackbarHost = {
                     SnackbarHost(
                         hostState = hostState,
-                        modifier = Modifier
-                            .onGloballyPositioned {
+                        modifier =
+                            Modifier.onGloballyPositioned {
                                 snackbarSize = it.size
                                 snackbarPosition = it.positionInRoot()
                             },
@@ -991,10 +880,13 @@
             )
         // Assert sheet content is positioned at the sheet peek height + drag handle height + 22.dp
         // top and bottom padding.
-        rule.onNodeWithTag(sheetTag).assertTopPositionInRootIsEqualTo(
-            rule.rootHeight() - peekHeight +
-                (expectedDragHandleVerticalPadding * 2) + SheetBottomTokens.DockedDragHandleHeight
-        )
+        rule
+            .onNodeWithTag(sheetTag)
+            .assertTopPositionInRootIsEqualTo(
+                rule.rootHeight() - peekHeight +
+                    (expectedDragHandleVerticalPadding * 2) +
+                    SheetBottomTokens.DockedDragHandleHeight
+            )
         // Assert TopBar is placed at the top of the app.
         rule.onNodeWithTag("TopBar").assertTopPositionInRootIsEqualTo(0.dp)
         // Assert TopBar is sized appropriately.
diff --git a/compose/material3/material3/src/androidInstrumentedTest/kotlin/androidx/compose/material3/ButtonScreenshotTest.kt b/compose/material3/material3/src/androidInstrumentedTest/kotlin/androidx/compose/material3/ButtonScreenshotTest.kt
index a04d59f..c192fc5 100644
--- a/compose/material3/material3/src/androidInstrumentedTest/kotlin/androidx/compose/material3/ButtonScreenshotTest.kt
+++ b/compose/material3/material3/src/androidInstrumentedTest/kotlin/androidx/compose/material3/ButtonScreenshotTest.kt
@@ -45,34 +45,26 @@
 @SdkSuppress(minSdkVersion = Build.VERSION_CODES.O)
 class ButtonScreenshotTest {
 
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
-    @get:Rule
-    val screenshotRule = AndroidXScreenshotTestRule(GOLDEN_MATERIAL3)
+    @get:Rule val screenshotRule = AndroidXScreenshotTestRule(GOLDEN_MATERIAL3)
 
     @Test
     fun default_button_light_theme() {
-        rule.setMaterialContent(lightColorScheme()) {
-            Button(onClick = { }) {
-                Text("Button")
-            }
-        }
+        rule.setMaterialContent(lightColorScheme()) { Button(onClick = {}) { Text("Button") } }
 
-        rule.onNode(hasClickAction())
+        rule
+            .onNode(hasClickAction())
             .captureToImage()
             .assertAgainstGolden(screenshotRule, "button_light_theme")
     }
 
     @Test
     fun default_button_dark_theme() {
-        rule.setMaterialContent(darkColorScheme()) {
-            Button(onClick = { }) {
-                Text("Button")
-            }
-        }
+        rule.setMaterialContent(darkColorScheme()) { Button(onClick = {}) { Text("Button") } }
 
-        rule.onNode(hasClickAction())
+        rule
+            .onNode(hasClickAction())
             .captureToImage()
             .assertAgainstGolden(screenshotRule, "button_dark_theme")
     }
@@ -80,12 +72,11 @@
     @Test
     fun disabled_button_light_theme() {
         rule.setMaterialContent(lightColorScheme()) {
-            Button(onClick = { }, enabled = false) {
-                Text("Button")
-            }
+            Button(onClick = {}, enabled = false) { Text("Button") }
         }
 
-        rule.onNodeWithText("Button")
+        rule
+            .onNodeWithText("Button")
             .captureToImage()
             .assertAgainstGolden(screenshotRule, "button_disabled_light_theme")
     }
@@ -93,12 +84,11 @@
     @Test
     fun disabled_button_dark_theme() {
         rule.setMaterialContent(darkColorScheme()) {
-            Button(onClick = { }, enabled = false) {
-                Text("Button")
-            }
+            Button(onClick = {}, enabled = false) { Text("Button") }
         }
 
-        rule.onNodeWithText("Button")
+        rule
+            .onNodeWithText("Button")
             .captureToImage()
             .assertAgainstGolden(screenshotRule, "button_disabled_dark_theme")
     }
@@ -113,7 +103,8 @@
             }
         }
 
-        rule.onNodeWithTag("elevated button")
+        rule
+            .onNodeWithTag("elevated button")
             .captureToImage()
             .assertAgainstGolden(screenshotRule, "elevated_button_light_theme")
     }
@@ -140,7 +131,8 @@
             FilledTonalButton(onClick = {}) { Text("Filled tonal Button") }
         }
 
-        rule.onNode(hasClickAction())
+        rule
+            .onNode(hasClickAction())
             .captureToImage()
             .assertAgainstGolden(screenshotRule, "filled_tonal_button_light_theme")
     }
@@ -157,7 +149,8 @@
             }
         }
 
-        rule.onNodeWithTag("button")
+        rule
+            .onNodeWithTag("button")
             .captureToImage()
             .assertAgainstGolden(screenshotRule, "filled_tonal_button_disabled_light_theme")
     }
@@ -168,7 +161,8 @@
             OutlinedButton(onClick = {}) { Text("Outlined Button") }
         }
 
-        rule.onNode(hasClickAction())
+        rule
+            .onNode(hasClickAction())
             .captureToImage()
             .assertAgainstGolden(screenshotRule, "outlined_button_light_theme")
     }
@@ -181,7 +175,8 @@
             }
         }
 
-        rule.onNodeWithTag("button")
+        rule
+            .onNodeWithTag("button")
             .captureToImage()
             .assertAgainstGolden(screenshotRule, "outlined_button_disabled_light_theme")
     }
@@ -189,12 +184,11 @@
     @Test
     fun text_button_lightTheme() {
         rule.setMaterialContent(lightColorScheme()) {
-            TextButton(onClick = {}) {
-                Text("Text Button")
-            }
+            TextButton(onClick = {}) { Text("Text Button") }
         }
 
-        rule.onNode(hasClickAction())
+        rule
+            .onNode(hasClickAction())
             .captureToImage()
             .assertAgainstGolden(screenshotRule, "text_button_light_theme")
     }
@@ -207,7 +201,8 @@
             }
         }
 
-        rule.onNodeWithTag("button")
+        rule
+            .onNodeWithTag("button")
             .captureToImage()
             .assertAgainstGolden(screenshotRule, "text_button_disabled_light_theme")
     }
@@ -229,7 +224,8 @@
             }
         }
 
-        rule.onNode(hasClickAction())
+        rule
+            .onNode(hasClickAction())
             .captureToImage()
             .assertAgainstGolden(screenshotRule, "button_withIcon_lightTheme")
     }
@@ -253,7 +249,8 @@
             }
         }
 
-        rule.onNodeWithTag("button")
+        rule
+            .onNodeWithTag("button")
             .captureToImage()
             .assertAgainstGolden(screenshotRule, "button_withIcon_disabled_lightTheme")
     }
@@ -275,7 +272,8 @@
             }
         }
 
-        rule.onNode(hasClickAction())
+        rule
+            .onNode(hasClickAction())
             .captureToImage()
             .assertAgainstGolden(screenshotRule, "button_withIcon_darkTheme")
     }
@@ -299,7 +297,8 @@
             }
         }
 
-        rule.onNodeWithTag("button")
+        rule
+            .onNodeWithTag("button")
             .captureToImage()
             .assertAgainstGolden(screenshotRule, "button_withIcon_disabled_darkTheme")
     }
diff --git a/compose/material3/material3/src/androidInstrumentedTest/kotlin/androidx/compose/material3/ButtonTest.kt b/compose/material3/material3/src/androidInstrumentedTest/kotlin/androidx/compose/material3/ButtonTest.kt
index 427c034..5975a32 100644
--- a/compose/material3/material3/src/androidInstrumentedTest/kotlin/androidx/compose/material3/ButtonTest.kt
+++ b/compose/material3/material3/src/androidInstrumentedTest/kotlin/androidx/compose/material3/ButtonTest.kt
@@ -58,8 +58,7 @@
 @RunWith(AndroidJUnit4::class)
 class ButtonTest {
 
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
     @Test
     fun defaultSemantics() {
@@ -71,7 +70,8 @@
             }
         }
 
-        rule.onNodeWithTag(ButtonTestTag)
+        rule
+            .onNodeWithTag(ButtonTestTag)
             .assert(SemanticsMatcher.expectValue(SemanticsProperties.Role, Role.Button))
             .assertIsEnabled()
     }
@@ -86,7 +86,8 @@
             }
         }
 
-        rule.onNodeWithTag(ButtonTestTag)
+        rule
+            .onNodeWithTag(ButtonTestTag)
             .assert(SemanticsMatcher.expectValue(SemanticsProperties.Role, Role.Button))
             .assertIsNotEnabled()
     }
@@ -99,22 +100,19 @@
 
         rule.setMaterialContent(lightColorScheme()) {
             Box {
-                Button(onClick = onClick, modifier = Modifier.testTag(ButtonTestTag)) {
-                    Text(text)
-                }
+                Button(onClick = onClick, modifier = Modifier.testTag(ButtonTestTag)) { Text(text) }
             }
         }
 
         // TODO(b/129400818): this actually finds the text, not the button as
         // merge semantics aren't implemented yet
-        rule.onNodeWithTag(ButtonTestTag)
+        rule
+            .onNodeWithTag(ButtonTestTag)
             // remove this and the todo
             //    rule.onNodeWithText(text)
             .performClick()
 
-        rule.runOnIdle {
-            assertThat(counter).isEqualTo(1)
-        }
+        rule.runOnIdle { assertThat(counter).isEqualTo(1) }
     }
 
     @Test
@@ -132,7 +130,8 @@
                 }
             }
         }
-        rule.onNodeWithTag(ButtonTestTag)
+        rule
+            .onNodeWithTag(ButtonTestTag)
             // Confirm the button starts off enabled, with a click action
             .assertHasClickAction()
             .assertIsEnabled()
@@ -165,16 +164,14 @@
             }
         }
 
-        rule.onNodeWithTag(button1Tag)
-            .performClick()
+        rule.onNodeWithTag(button1Tag).performClick()
 
         rule.runOnIdle {
             assertThat(button1Counter).isEqualTo(1)
             assertThat(button2Counter).isEqualTo(0)
         }
 
-        rule.onNodeWithTag(button2Tag)
-            .performClick()
+        rule.onNodeWithTag(button2Tag).performClick()
 
         rule.runOnIdle {
             assertThat(button1Counter).isEqualTo(1)
@@ -185,15 +182,10 @@
     @Test
     fun button_positioning() {
         rule.setMaterialContent(lightColorScheme()) {
-            Button(
-                onClick = { /* Do something! */ },
-                modifier = Modifier.testTag(ButtonTestTag)
-            ) {
+            Button(onClick = { /* Do something! */ }, modifier = Modifier.testTag(ButtonTestTag)) {
                 Text(
                     "Button",
-                    modifier = Modifier
-                        .testTag(TextTestTag)
-                        .semantics(mergeDescendants = true) {}
+                    modifier = Modifier.testTag(TextTestTag).semantics(mergeDescendants = true) {}
                 )
             }
         }
@@ -223,17 +215,15 @@
                 Icon(
                     Icons.Filled.Favorite,
                     contentDescription = "Localized description",
-                    modifier = Modifier
-                        .size(ButtonDefaults.IconSize)
-                        .testTag(IconTestTag)
-                        .semantics(mergeDescendants = true) {}
+                    modifier =
+                        Modifier.size(ButtonDefaults.IconSize).testTag(IconTestTag).semantics(
+                            mergeDescendants = true
+                        ) {}
                 )
                 Spacer(Modifier.size(ButtonDefaults.IconSpacing))
                 Text(
                     "Like",
-                    modifier = Modifier
-                        .testTag(TextTestTag)
-                        .semantics(mergeDescendants = true) {}
+                    modifier = Modifier.testTag(TextTestTag).semantics(mergeDescendants = true) {}
                 )
             }
         }
@@ -269,17 +259,15 @@
                 Icon(
                     Icons.Filled.Favorite,
                     contentDescription = "Localized description",
-                    modifier = Modifier
-                        .size(ButtonDefaults.IconSize)
-                        .testTag(IconTestTag)
-                        .semantics(mergeDescendants = true) {}
+                    modifier =
+                        Modifier.size(ButtonDefaults.IconSize).testTag(IconTestTag).semantics(
+                            mergeDescendants = true
+                        ) {}
                 )
                 Spacer(Modifier.size(ButtonDefaults.IconSpacing))
                 Text(
                     "Like",
-                    modifier = Modifier
-                        .testTag(TextTestTag)
-                        .semantics(mergeDescendants = true) {}
+                    modifier = Modifier.testTag(TextTestTag).semantics(mergeDescendants = true) {}
                 )
             }
         }
@@ -308,22 +296,27 @@
     fun button_defaultColors() {
         rule.setMaterialContent(lightColorScheme()) {
             assertThat(
-                ButtonDefaults.buttonColors(
-                    containerColor = Color.Unspecified,
-                    contentColor = Color.Unspecified,
-                    disabledContainerColor = Color.Unspecified,
-                    disabledContentColor = Color.Unspecified,
+                    ButtonDefaults.buttonColors(
+                        containerColor = Color.Unspecified,
+                        contentColor = Color.Unspecified,
+                        disabledContainerColor = Color.Unspecified,
+                        disabledContentColor = Color.Unspecified,
+                    )
                 )
-            ).isEqualTo(
-                ButtonColors(
-                    containerColor = FilledButtonTokens.ContainerColor.value,
-                    contentColor = FilledButtonTokens.LabelTextColor.value,
-                    disabledContainerColor = FilledButtonTokens.DisabledContainerColor.value
-                        .copy(FilledButtonTokens.DisabledContainerOpacity),
-                    disabledContentColor = FilledButtonTokens.DisabledLabelTextColor.value
-                        .copy(alpha = FilledButtonTokens.DisabledLabelTextOpacity),
+                .isEqualTo(
+                    ButtonColors(
+                        containerColor = FilledButtonTokens.ContainerColor.value,
+                        contentColor = FilledButtonTokens.LabelTextColor.value,
+                        disabledContainerColor =
+                            FilledButtonTokens.DisabledContainerColor.value.copy(
+                                FilledButtonTokens.DisabledContainerOpacity
+                            ),
+                        disabledContentColor =
+                            FilledButtonTokens.DisabledLabelTextColor.value.copy(
+                                alpha = FilledButtonTokens.DisabledLabelTextOpacity
+                            ),
+                    )
                 )
-            )
         }
     }
 
@@ -331,22 +324,27 @@
     fun filledTonalButton_defaultColors() {
         rule.setMaterialContent(lightColorScheme()) {
             assertThat(
-                ButtonDefaults.filledTonalButtonColors(
-                    containerColor = Color.Unspecified,
-                    contentColor = Color.Unspecified,
-                    disabledContainerColor = Color.Unspecified,
-                    disabledContentColor = Color.Unspecified,
+                    ButtonDefaults.filledTonalButtonColors(
+                        containerColor = Color.Unspecified,
+                        contentColor = Color.Unspecified,
+                        disabledContainerColor = Color.Unspecified,
+                        disabledContentColor = Color.Unspecified,
+                    )
                 )
-            ).isEqualTo(
-                ButtonColors(
-                    containerColor = FilledTonalButtonTokens.ContainerColor.value,
-                    contentColor = FilledTonalButtonTokens.LabelTextColor.value,
-                    disabledContainerColor = FilledTonalButtonTokens.DisabledContainerColor.value
-                        .copy(alpha = FilledTonalButtonTokens.DisabledContainerOpacity),
-                    disabledContentColor = FilledTonalButtonTokens.DisabledLabelTextColor.value
-                        .copy(alpha = FilledTonalButtonTokens.DisabledLabelTextOpacity),
+                .isEqualTo(
+                    ButtonColors(
+                        containerColor = FilledTonalButtonTokens.ContainerColor.value,
+                        contentColor = FilledTonalButtonTokens.LabelTextColor.value,
+                        disabledContainerColor =
+                            FilledTonalButtonTokens.DisabledContainerColor.value.copy(
+                                alpha = FilledTonalButtonTokens.DisabledContainerOpacity
+                            ),
+                        disabledContentColor =
+                            FilledTonalButtonTokens.DisabledLabelTextColor.value.copy(
+                                alpha = FilledTonalButtonTokens.DisabledLabelTextOpacity
+                            ),
+                    )
                 )
-            )
         }
     }
 
@@ -354,22 +352,27 @@
     fun elevatedButton_defaultColors() {
         rule.setMaterialContent(lightColorScheme()) {
             assertThat(
-                ButtonDefaults.elevatedButtonColors(
-                    containerColor = Color.Unspecified,
-                    contentColor = Color.Unspecified,
-                    disabledContainerColor = Color.Unspecified,
-                    disabledContentColor = Color.Unspecified,
+                    ButtonDefaults.elevatedButtonColors(
+                        containerColor = Color.Unspecified,
+                        contentColor = Color.Unspecified,
+                        disabledContainerColor = Color.Unspecified,
+                        disabledContentColor = Color.Unspecified,
+                    )
                 )
-            ).isEqualTo(
-                ButtonColors(
-                    containerColor = ElevatedButtonTokens.ContainerColor.value,
-                    contentColor = ElevatedButtonTokens.LabelTextColor.value,
-                    disabledContainerColor = ElevatedButtonTokens.DisabledContainerColor.value
-                        .copy(alpha = ElevatedButtonTokens.DisabledContainerOpacity),
-                    disabledContentColor = ElevatedButtonTokens.DisabledLabelTextColor.value
-                        .copy(alpha = ElevatedButtonTokens.DisabledLabelTextOpacity),
+                .isEqualTo(
+                    ButtonColors(
+                        containerColor = ElevatedButtonTokens.ContainerColor.value,
+                        contentColor = ElevatedButtonTokens.LabelTextColor.value,
+                        disabledContainerColor =
+                            ElevatedButtonTokens.DisabledContainerColor.value.copy(
+                                alpha = ElevatedButtonTokens.DisabledContainerOpacity
+                            ),
+                        disabledContentColor =
+                            ElevatedButtonTokens.DisabledLabelTextColor.value.copy(
+                                alpha = ElevatedButtonTokens.DisabledLabelTextOpacity
+                            ),
+                    )
                 )
-            )
         }
     }
 
@@ -377,21 +380,24 @@
     fun outlinedButton_defaultColors() {
         rule.setMaterialContent(lightColorScheme()) {
             assertThat(
-                ButtonDefaults.outlinedButtonColors(
-                    containerColor = Color.Unspecified,
-                    contentColor = Color.Unspecified,
-                    disabledContainerColor = Color.Unspecified,
-                    disabledContentColor = Color.Unspecified,
+                    ButtonDefaults.outlinedButtonColors(
+                        containerColor = Color.Unspecified,
+                        contentColor = Color.Unspecified,
+                        disabledContainerColor = Color.Unspecified,
+                        disabledContentColor = Color.Unspecified,
+                    )
                 )
-            ).isEqualTo(
-                ButtonColors(
-                    containerColor = Color.Transparent,
-                    contentColor = OutlinedButtonTokens.LabelTextColor.value,
-                    disabledContainerColor = Color.Transparent,
-                    disabledContentColor = OutlinedButtonTokens.DisabledLabelTextColor.value
-                        .copy(alpha = OutlinedButtonTokens.DisabledLabelTextOpacity),
+                .isEqualTo(
+                    ButtonColors(
+                        containerColor = Color.Transparent,
+                        contentColor = OutlinedButtonTokens.LabelTextColor.value,
+                        disabledContainerColor = Color.Transparent,
+                        disabledContentColor =
+                            OutlinedButtonTokens.DisabledLabelTextColor.value.copy(
+                                alpha = OutlinedButtonTokens.DisabledLabelTextOpacity
+                            ),
+                    )
                 )
-            )
         }
     }
 
@@ -399,21 +405,24 @@
     fun textButton_defaultColors() {
         rule.setMaterialContent(lightColorScheme()) {
             assertThat(
-                ButtonDefaults.textButtonColors(
-                    containerColor = Color.Unspecified,
-                    contentColor = Color.Unspecified,
-                    disabledContainerColor = Color.Unspecified,
-                    disabledContentColor = Color.Unspecified,
+                    ButtonDefaults.textButtonColors(
+                        containerColor = Color.Unspecified,
+                        contentColor = Color.Unspecified,
+                        disabledContainerColor = Color.Unspecified,
+                        disabledContentColor = Color.Unspecified,
+                    )
                 )
-            ).isEqualTo(
-                ButtonColors(
-                    containerColor = Color.Transparent,
-                    contentColor = TextButtonTokens.LabelTextColor.value,
-                    disabledContainerColor = Color.Transparent,
-                    disabledContentColor = TextButtonTokens.DisabledLabelTextColor.value
-                        .copy(alpha = TextButtonTokens.DisabledLabelTextOpacity),
+                .isEqualTo(
+                    ButtonColors(
+                        containerColor = Color.Transparent,
+                        contentColor = TextButtonTokens.LabelTextColor.value,
+                        disabledContainerColor = Color.Transparent,
+                        disabledContentColor =
+                            TextButtonTokens.DisabledLabelTextColor.value.copy(
+                                alpha = TextButtonTokens.DisabledLabelTextOpacity
+                            ),
+                    )
                 )
-            )
         }
     }
 }
diff --git a/compose/material3/material3/src/androidInstrumentedTest/kotlin/androidx/compose/material3/CalendarModelTest.kt b/compose/material3/material3/src/androidInstrumentedTest/kotlin/androidx/compose/material3/CalendarModelTest.kt
index c54d1cb..7dccd6f 100644
--- a/compose/material3/material3/src/androidInstrumentedTest/kotlin/androidx/compose/material3/CalendarModelTest.kt
+++ b/compose/material3/material3/src/androidInstrumentedTest/kotlin/androidx/compose/material3/CalendarModelTest.kt
@@ -138,28 +138,29 @@
         assertThat(model.formatWithSkeleton(month, "yMMMM")).isEqualTo("March 2022")
         assertThat(model.formatWithSkeleton(month, "MMMMy")).isEqualTo("March 2022")
         // Check that the direct formatting is equal to the one the model does.
-        assertThat(model.formatWithSkeleton(month, "yMMMM"))
-            .isEqualTo(month.format(model, "yMMMM"))
+        assertThat(model.formatWithSkeleton(month, "yMMMM")).isEqualTo(month.format(model, "yMMMM"))
     }
 
     @Test
     fun formatWithSkeleton() {
         // Format twice to check that the formatter is outputting the right values, and that it's
         // not failing due to cache issues.
-        var formatted = formatWithSkeleton(
-            January2022Millis,
-            DatePickerDefaults.YearMonthWeekdayDaySkeleton,
-            Locale.US,
-            cache = mutableMapOf()
-        )
+        var formatted =
+            formatWithSkeleton(
+                January2022Millis,
+                DatePickerDefaults.YearMonthWeekdayDaySkeleton,
+                Locale.US,
+                cache = mutableMapOf()
+            )
         assertThat(formatted).isEqualTo("Saturday, January 1, 2022")
 
-        formatted = formatWithSkeleton(
-            January2022Millis - 1000000000,
-            DatePickerDefaults.YearMonthWeekdayDaySkeleton,
-            Locale.US,
-            cache = mutableMapOf()
-        )
+        formatted =
+            formatWithSkeleton(
+                January2022Millis - 1000000000,
+                DatePickerDefaults.YearMonthWeekdayDaySkeleton,
+                Locale.US,
+                cache = mutableMapOf()
+            )
         assertThat(formatted).isEqualTo("Monday, December 20, 2021")
     }
 
@@ -168,20 +169,22 @@
     fun formatWithSkeletonProducingEqualPattern() {
         // Format twice to check that the formatter is outputting the right values, and that it's
         // not failing due to cache issues.
-        var formatted = formatWithSkeleton(
-            January2022Millis,
-            skeleton = "YY",
-            Locale.US,
-            cache = mutableMapOf()
-        )
+        var formatted =
+            formatWithSkeleton(
+                January2022Millis,
+                skeleton = "YY",
+                Locale.US,
+                cache = mutableMapOf()
+            )
         assertThat(formatted).isEqualTo("22")
 
-        formatted = formatWithSkeleton(
-            January2022Millis - 1000000000,
-            "YY",
-            Locale.US,
-            cache = mutableMapOf()
-        )
+        formatted =
+            formatWithSkeleton(
+                January2022Millis - 1000000000,
+                "YY",
+                Locale.US,
+                cache = mutableMapOf()
+            )
         assertThat(formatted).isEqualTo("21")
     }
 
@@ -194,9 +197,8 @@
         // Check that the first day is always "Monday", per ISO-8601 standard.
         assertThat(weekDays.first().first).ignoringCase().contains("Monday")
         weekDays.forEach {
-            assertThat(it.second.first().lowercaseChar()).isEqualTo(
-                it.first.first().lowercaseChar()
-            )
+            assertThat(it.second.first().lowercaseChar())
+                .isEqualTo(it.first.first().lowercaseChar())
         }
     }
 
@@ -272,18 +274,10 @@
         assertThat(newModel.plusMonths(month, 3)).isEqualTo(legacyModel.plusMonths(month, 3))
         assertThat(date).isEqualTo(legacyDate)
         assertThat(newModel.getDayOfWeek(date)).isEqualTo(legacyModel.getDayOfWeek(date))
-        assertThat(newModel.formatWithSkeleton(date, "dMMMy")).isEqualTo(
-            legacyModel.formatWithSkeleton(
-                date,
-                "dMMMy"
-            )
-        )
-        assertThat(newModel.formatWithSkeleton(month, "MMMy")).isEqualTo(
-            legacyModel.formatWithSkeleton(
-                month,
-                "MMMy"
-            )
-        )
+        assertThat(newModel.formatWithSkeleton(date, "dMMMy"))
+            .isEqualTo(legacyModel.formatWithSkeleton(date, "dMMMy"))
+        assertThat(newModel.formatWithSkeleton(month, "MMMy"))
+            .isEqualTo(legacyModel.formatWithSkeleton(month, "MMMy"))
     }
 
     internal companion object {
diff --git a/compose/material3/material3/src/androidInstrumentedTest/kotlin/androidx/compose/material3/CardScreenshotTest.kt b/compose/material3/material3/src/androidInstrumentedTest/kotlin/androidx/compose/material3/CardScreenshotTest.kt
index c415549..c2609fd 100644
--- a/compose/material3/material3/src/androidInstrumentedTest/kotlin/androidx/compose/material3/CardScreenshotTest.kt
+++ b/compose/material3/material3/src/androidInstrumentedTest/kotlin/androidx/compose/material3/CardScreenshotTest.kt
@@ -54,17 +54,16 @@
 @SdkSuppress(minSdkVersion = Build.VERSION_CODES.O)
 class CardScreenshotTest {
 
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
-    @get:Rule
-    val screenshotRule = AndroidXScreenshotTestRule(GOLDEN_MATERIAL3)
+    @get:Rule val screenshotRule = AndroidXScreenshotTestRule(GOLDEN_MATERIAL3)
 
     // TODO(b/267253920): Add a compose test API to set/reset InputMode.
     @After
-    fun resetTouchMode() = with(InstrumentationRegistry.getInstrumentation()) {
-        if (SDK_INT < 33) setInTouchMode(true) else resetInTouchMode()
-    }
+    fun resetTouchMode() =
+        with(InstrumentationRegistry.getInstrumentation()) {
+            if (SDK_INT < 33) setInTouchMode(true) else resetInTouchMode()
+        }
 
     private val wrap = Modifier.size(width = 200.dp, height = 120.dp)
     private val wrapperTestTag = "cardWrapper"
@@ -75,10 +74,7 @@
             Box(wrap.testTag(wrapperTestTag), contentAlignment = Alignment.Center) {
                 Card(Modifier.size(width = 180.dp, height = 100.dp)) {
                     Box(Modifier.fillMaxSize()) {
-                        Text(
-                            "Filled Card",
-                            Modifier.align(Alignment.Center)
-                        )
+                        Text("Filled Card", Modifier.align(Alignment.Center))
                     }
                 }
             }
@@ -92,10 +88,7 @@
             Box(wrap.testTag(wrapperTestTag), contentAlignment = Alignment.Center) {
                 Card(Modifier.size(width = 180.dp, height = 100.dp)) {
                     Box(Modifier.fillMaxSize()) {
-                        Text(
-                            "Filled Card",
-                            Modifier.align(Alignment.Center)
-                        )
+                        Text("Filled Card", Modifier.align(Alignment.Center))
                     }
                 }
             }
@@ -113,10 +106,7 @@
                     enabled = false
                 ) {
                     Box(Modifier.fillMaxSize()) {
-                        Text(
-                            "Filled Card",
-                            Modifier.align(Alignment.Center)
-                        )
+                        Text("Filled Card", Modifier.align(Alignment.Center))
                     }
                 }
             }
@@ -134,10 +124,7 @@
                     enabled = false
                 ) {
                     Box(Modifier.fillMaxSize()) {
-                        Text(
-                            "Filled Card",
-                            Modifier.align(Alignment.Center)
-                        )
+                        Text("Filled Card", Modifier.align(Alignment.Center))
                     }
                 }
             }
@@ -151,10 +138,7 @@
             Box(wrap.testTag(wrapperTestTag), contentAlignment = Alignment.Center) {
                 ElevatedCard(Modifier.size(width = 180.dp, height = 100.dp)) {
                     Box(Modifier.fillMaxSize()) {
-                        Text(
-                            "Elevated Card",
-                            Modifier.align(Alignment.Center)
-                        )
+                        Text("Elevated Card", Modifier.align(Alignment.Center))
                     }
                 }
             }
@@ -168,10 +152,7 @@
             Box(wrap.testTag(wrapperTestTag), contentAlignment = Alignment.Center) {
                 ElevatedCard(Modifier.size(width = 180.dp, height = 100.dp)) {
                     Box(Modifier.fillMaxSize()) {
-                        Text(
-                            "Elevated Card",
-                            Modifier.align(Alignment.Center)
-                        )
+                        Text("Elevated Card", Modifier.align(Alignment.Center))
                     }
                 }
             }
@@ -189,10 +170,7 @@
                     enabled = false
                 ) {
                     Box(Modifier.fillMaxSize()) {
-                        Text(
-                            "Elevated Card",
-                            Modifier.align(Alignment.Center)
-                        )
+                        Text("Elevated Card", Modifier.align(Alignment.Center))
                     }
                 }
             }
@@ -210,10 +188,7 @@
                     enabled = false
                 ) {
                     Box(Modifier.fillMaxSize()) {
-                        Text(
-                            "Elevated Card",
-                            Modifier.align(Alignment.Center)
-                        )
+                        Text("Elevated Card", Modifier.align(Alignment.Center))
                     }
                 }
             }
@@ -227,10 +202,7 @@
             Box(wrap.testTag(wrapperTestTag), contentAlignment = Alignment.Center) {
                 OutlinedCard(Modifier.size(width = 180.dp, height = 100.dp)) {
                     Box(Modifier.fillMaxSize()) {
-                        Text(
-                            "Outlined Card",
-                            Modifier.align(Alignment.Center)
-                        )
+                        Text("Outlined Card", Modifier.align(Alignment.Center))
                     }
                 }
             }
@@ -244,10 +216,7 @@
             Box(wrap.testTag(wrapperTestTag), contentAlignment = Alignment.Center) {
                 OutlinedCard(Modifier.size(width = 180.dp, height = 100.dp)) {
                     Box(Modifier.fillMaxSize()) {
-                        Text(
-                            "Outlined Card",
-                            Modifier.align(Alignment.Center)
-                        )
+                        Text("Outlined Card", Modifier.align(Alignment.Center))
                     }
                 }
             }
@@ -265,10 +234,7 @@
                     enabled = false
                 ) {
                     Box(Modifier.fillMaxSize()) {
-                        Text(
-                            "Outlined Card",
-                            Modifier.align(Alignment.Center)
-                        )
+                        Text("Outlined Card", Modifier.align(Alignment.Center))
                     }
                 }
             }
@@ -286,10 +252,7 @@
                     enabled = false
                 ) {
                     Box(Modifier.fillMaxSize()) {
-                        Text(
-                            "Outlined Card",
-                            Modifier.align(Alignment.Center)
-                        )
+                        Text("Outlined Card", Modifier.align(Alignment.Center))
                     }
                 }
             }
@@ -301,15 +264,9 @@
     fun filledCard_pressed() {
         rule.setMaterialContent(lightColorScheme()) {
             Box(wrap.testTag(wrapperTestTag), contentAlignment = Alignment.Center) {
-                Card(
-                    onClick = {},
-                    Modifier.size(width = 180.dp, height = 100.dp)
-                ) {
+                Card(onClick = {}, Modifier.size(width = 180.dp, height = 100.dp)) {
                     Box(Modifier.fillMaxSize()) {
-                        Text(
-                            "Filled Card",
-                            Modifier.align(Alignment.Center)
-                        )
+                        Text("Filled Card", Modifier.align(Alignment.Center))
                     }
                 }
             }
@@ -322,15 +279,9 @@
     fun elevatedCard_pressed() {
         rule.setMaterialContent(lightColorScheme()) {
             Box(wrap.testTag(wrapperTestTag), contentAlignment = Alignment.Center) {
-                ElevatedCard(
-                    onClick = {},
-                    Modifier.size(width = 180.dp, height = 100.dp)
-                ) {
+                ElevatedCard(onClick = {}, Modifier.size(width = 180.dp, height = 100.dp)) {
                     Box(Modifier.fillMaxSize()) {
-                        Text(
-                            "Elevated Card",
-                            Modifier.align(Alignment.Center)
-                        )
+                        Text("Elevated Card", Modifier.align(Alignment.Center))
                     }
                 }
             }
@@ -343,15 +294,9 @@
     fun outlinedCard_pressed() {
         rule.setMaterialContent(lightColorScheme()) {
             Box(wrap.testTag(wrapperTestTag), contentAlignment = Alignment.Center) {
-                OutlinedCard(
-                    onClick = {},
-                    Modifier.size(width = 180.dp, height = 100.dp)
-                ) {
+                OutlinedCard(onClick = {}, Modifier.size(width = 180.dp, height = 100.dp)) {
                     Box(Modifier.fillMaxSize()) {
-                        Text(
-                            "Outlined Card",
-                            Modifier.align(Alignment.Center)
-                        )
+                        Text("Outlined Card", Modifier.align(Alignment.Center))
                     }
                 }
             }
@@ -365,15 +310,9 @@
     fun filledCard_hover() {
         rule.setMaterialContent(lightColorScheme()) {
             Box(wrap.testTag(wrapperTestTag), contentAlignment = Alignment.Center) {
-                Card(
-                    onClick = {},
-                    Modifier.size(width = 180.dp, height = 100.dp)
-                ) {
+                Card(onClick = {}, Modifier.size(width = 180.dp, height = 100.dp)) {
                     Box(Modifier.fillMaxSize()) {
-                        Text(
-                            "Filled Card",
-                            Modifier.align(Alignment.Center)
-                        )
+                        Text("Filled Card", Modifier.align(Alignment.Center))
                     }
                 }
             }
@@ -390,15 +329,9 @@
     fun elevatedCard_hover() {
         rule.setMaterialContent(lightColorScheme()) {
             Box(wrap.testTag(wrapperTestTag), contentAlignment = Alignment.Center) {
-                ElevatedCard(
-                    onClick = {},
-                    Modifier.size(width = 180.dp, height = 100.dp)
-                ) {
+                ElevatedCard(onClick = {}, Modifier.size(width = 180.dp, height = 100.dp)) {
                     Box(Modifier.fillMaxSize()) {
-                        Text(
-                            "Elevated Card",
-                            Modifier.align(Alignment.Center)
-                        )
+                        Text("Elevated Card", Modifier.align(Alignment.Center))
                     }
                 }
             }
@@ -415,15 +348,9 @@
     fun outlinedCard_hover() {
         rule.setMaterialContent(lightColorScheme()) {
             Box(wrap.testTag(wrapperTestTag), contentAlignment = Alignment.Center) {
-                OutlinedCard(
-                    onClick = {},
-                    Modifier.size(width = 180.dp, height = 100.dp)
-                ) {
+                OutlinedCard(onClick = {}, Modifier.size(width = 180.dp, height = 100.dp)) {
                     Box(Modifier.fillMaxSize()) {
-                        Text(
-                            "Outlined Card",
-                            Modifier.align(Alignment.Center)
-                        )
+                        Text("Outlined Card", Modifier.align(Alignment.Center))
                     }
                 }
             }
@@ -444,14 +371,10 @@
             Box(wrap.testTag(wrapperTestTag), contentAlignment = Alignment.Center) {
                 Card(
                     onClick = {},
-                    Modifier.size(width = 180.dp, height = 100.dp)
-                        .focusRequester(focusRequester)
+                    Modifier.size(width = 180.dp, height = 100.dp).focusRequester(focusRequester)
                 ) {
                     Box(Modifier.fillMaxSize()) {
-                        Text(
-                            "Filled Card",
-                            Modifier.align(Alignment.Center)
-                        )
+                        Text("Filled Card", Modifier.align(Alignment.Center))
                     }
                 }
             }
@@ -476,14 +399,10 @@
             Box(wrap.testTag(wrapperTestTag), contentAlignment = Alignment.Center) {
                 ElevatedCard(
                     onClick = {},
-                    Modifier.size(width = 180.dp, height = 100.dp)
-                        .focusRequester(focusRequester)
+                    Modifier.size(width = 180.dp, height = 100.dp).focusRequester(focusRequester)
                 ) {
                     Box(Modifier.fillMaxSize()) {
-                        Text(
-                            "Elevated Card",
-                            Modifier.align(Alignment.Center)
-                        )
+                        Text("Elevated Card", Modifier.align(Alignment.Center))
                     }
                 }
             }
@@ -508,14 +427,10 @@
             Box(wrap.testTag(wrapperTestTag), contentAlignment = Alignment.Center) {
                 OutlinedCard(
                     onClick = {},
-                    Modifier.size(width = 180.dp, height = 100.dp)
-                        .focusRequester(focusRequester)
+                    Modifier.size(width = 180.dp, height = 100.dp).focusRequester(focusRequester)
                 ) {
                     Box(Modifier.fillMaxSize()) {
-                        Text(
-                            "Outlined Card",
-                            Modifier.align(Alignment.Center)
-                        )
+                        Text("Outlined Card", Modifier.align(Alignment.Center))
                     }
                 }
             }
@@ -547,7 +462,8 @@
     }
 
     private fun assertAgainstGolden(goldenName: String) {
-        rule.onNodeWithTag(wrapperTestTag)
+        rule
+            .onNodeWithTag(wrapperTestTag)
             .captureToImage()
             .assertAgainstGolden(screenshotRule, goldenName)
     }
diff --git a/compose/material3/material3/src/androidInstrumentedTest/kotlin/androidx/compose/material3/CardTest.kt b/compose/material3/material3/src/androidInstrumentedTest/kotlin/androidx/compose/material3/CardTest.kt
index 331ebf4..137aadd 100644
--- a/compose/material3/material3/src/androidInstrumentedTest/kotlin/androidx/compose/material3/CardTest.kt
+++ b/compose/material3/material3/src/androidInstrumentedTest/kotlin/androidx/compose/material3/CardTest.kt
@@ -60,8 +60,7 @@
 @RunWith(AndroidJUnit4::class)
 class CardTest {
 
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
     @SdkSuppress(minSdkVersion = Build.VERSION_CODES.O)
     @Test
@@ -76,7 +75,9 @@
                         modifier = Modifier.semantics(mergeDescendants = true) {}.testTag("card"),
                         shape = shape,
                         colors = CardDefaults.cardColors(containerColor = cardColor)
-                    ) { Box(Modifier.size(50.dp, 50.dp)) }
+                    ) {
+                        Box(Modifier.size(50.dp, 50.dp))
+                    }
                 }
             }
         }
@@ -96,22 +97,19 @@
     @Test
     fun cardColors_customValues() {
         rule.setContent() {
-            var colorScheme = MaterialTheme.colorScheme.copy(
-                surface = Color.Green,
-                onSurface = Color.Blue,
-                error = Color.Red,
-                onError = Color.Yellow
-            )
-            MaterialTheme(colorScheme = colorScheme) {
-                var colors = CardDefaults.cardColors(
-                    containerColor = colorScheme.surface
+            var colorScheme =
+                MaterialTheme.colorScheme.copy(
+                    surface = Color.Green,
+                    onSurface = Color.Blue,
+                    error = Color.Red,
+                    onError = Color.Yellow
                 )
+            MaterialTheme(colorScheme = colorScheme) {
+                var colors = CardDefaults.cardColors(containerColor = colorScheme.surface)
                 assert(colors.contentColor == colorScheme.onSurface)
                 assert(colors.disabledContentColor == colors.contentColor.copy(DisabledAlpha))
 
-                colors = CardDefaults.cardColors(
-                    containerColor = colorScheme.error
-                )
+                colors = CardDefaults.cardColors(containerColor = colorScheme.error)
                 assert(colors.contentColor == colorScheme.onError)
                 assert(colors.disabledContentColor == colors.contentColor.copy(DisabledAlpha))
             }
@@ -121,22 +119,19 @@
     @Test
     fun elevatedCardColors_customValues() {
         rule.setContent() {
-            var colorScheme = MaterialTheme.colorScheme.copy(
-                surface = Color.Green,
-                onSurface = Color.Blue,
-                error = Color.Red,
-                onError = Color.Yellow
-            )
-            MaterialTheme(colorScheme = colorScheme) {
-                var colors = CardDefaults.elevatedCardColors(
-                    containerColor = colorScheme.surface
+            var colorScheme =
+                MaterialTheme.colorScheme.copy(
+                    surface = Color.Green,
+                    onSurface = Color.Blue,
+                    error = Color.Red,
+                    onError = Color.Yellow
                 )
+            MaterialTheme(colorScheme = colorScheme) {
+                var colors = CardDefaults.elevatedCardColors(containerColor = colorScheme.surface)
                 assert(colors.contentColor == colorScheme.onSurface)
                 assert(colors.disabledContentColor == colors.contentColor.copy(DisabledAlpha))
 
-                colors = CardDefaults.elevatedCardColors(
-                    containerColor = colorScheme.error
-                )
+                colors = CardDefaults.elevatedCardColors(containerColor = colorScheme.error)
                 assert(colors.contentColor == colorScheme.onError)
                 assert(colors.disabledContentColor == colors.contentColor.copy(DisabledAlpha))
             }
@@ -146,27 +141,25 @@
     @Test
     fun outlinedCardColors_customValues() {
         rule.setContent() {
-            var colorScheme = MaterialTheme.colorScheme.copy(
-                surface = Color.Green,
-                onSurface = Color.Blue,
-                error = Color.Red,
-                onError = Color.Yellow
-            )
-            MaterialTheme(colorScheme = colorScheme) {
-                var colors = CardDefaults.outlinedCardColors(
-                    containerColor = colorScheme.surface
+            var colorScheme =
+                MaterialTheme.colorScheme.copy(
+                    surface = Color.Green,
+                    onSurface = Color.Blue,
+                    error = Color.Red,
+                    onError = Color.Yellow
                 )
+            MaterialTheme(colorScheme = colorScheme) {
+                var colors = CardDefaults.outlinedCardColors(containerColor = colorScheme.surface)
                 assert(colors.contentColor == colorScheme.onSurface)
                 assert(colors.disabledContentColor == colors.contentColor.copy(DisabledAlpha))
 
-                colors = CardDefaults.outlinedCardColors(
-                    containerColor = colorScheme.error
-                )
+                colors = CardDefaults.outlinedCardColors(containerColor = colorScheme.error)
                 assert(colors.contentColor == colorScheme.onError)
                 assert(colors.disabledContentColor == colors.contentColor.copy(DisabledAlpha))
             }
         }
     }
+
     @Test
     fun clickableOverload_semantics() {
         val count = mutableStateOf(0)
@@ -209,9 +202,11 @@
         rule.setMaterialContent(lightColorScheme()) {
             Card(
                 modifier =
-                Modifier.testTag("card")
-                    .clickable(enabled = enabled.value, onClick = { count.value += 1 }),
-            ) { Spacer(Modifier.size(30.dp)) }
+                    Modifier.testTag("card")
+                        .clickable(enabled = enabled.value, onClick = { count.value += 1 }),
+            ) {
+                Spacer(Modifier.size(30.dp))
+            }
         }
         rule.onNodeWithTag("card").assertIsEnabled().performClick()
 
@@ -234,7 +229,9 @@
                 onClick = {},
                 modifier = Modifier.testTag("card"),
                 interactionSource = interactionSource
-            ) { Spacer(Modifier.size(30.dp)) }
+            ) {
+                Spacer(Modifier.size(30.dp))
+            }
         }
 
         val interactions = mutableListOf<Interaction>()
@@ -269,7 +266,9 @@
                 Button(
                     modifier = Modifier.fillMaxSize().testTag("clickable"),
                     onClick = { state.value += 1 }
-                ) { Text("button fullscreen") }
+                ) {
+                    Text("button fullscreen")
+                }
                 Card(Modifier.fillMaxSize()) {}
             }
         }
diff --git a/compose/material3/material3/src/androidInstrumentedTest/kotlin/androidx/compose/material3/CheckboxScreenshotTest.kt b/compose/material3/material3/src/androidInstrumentedTest/kotlin/androidx/compose/material3/CheckboxScreenshotTest.kt
index 889bb2f..91e541d 100644
--- a/compose/material3/material3/src/androidInstrumentedTest/kotlin/androidx/compose/material3/CheckboxScreenshotTest.kt
+++ b/compose/material3/material3/src/androidInstrumentedTest/kotlin/androidx/compose/material3/CheckboxScreenshotTest.kt
@@ -59,17 +59,16 @@
 @OptIn(ExperimentalTestApi::class)
 class CheckboxScreenshotTest(private val scheme: ColorSchemeWrapper) {
 
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
-    @get:Rule
-    val screenshotRule = AndroidXScreenshotTestRule(GOLDEN_MATERIAL3)
+    @get:Rule val screenshotRule = AndroidXScreenshotTestRule(GOLDEN_MATERIAL3)
 
     // TODO(b/267253920): Add a compose test API to set/reset InputMode.
     @After
-    fun resetTouchMode() = with(InstrumentationRegistry.getInstrumentation()) {
-        if (SDK_INT < 33) setInTouchMode(true) else resetInTouchMode()
-    }
+    fun resetTouchMode() =
+        with(InstrumentationRegistry.getInstrumentation()) {
+            if (SDK_INT < 33) setInTouchMode(true) else resetInTouchMode()
+        }
 
     val wrap = Modifier.wrapContentSize(Alignment.TopStart)
 
@@ -80,9 +79,7 @@
     @Test
     fun checkBox_checked() {
         rule.setMaterialContent(scheme.colorScheme) {
-            Box(wrap.testTag(wrapperTestTag)) {
-                Checkbox(checked = true, onCheckedChange = { })
-            }
+            Box(wrap.testTag(wrapperTestTag)) { Checkbox(checked = true, onCheckedChange = {}) }
         }
         assertToggeableAgainstGolden("checkBox_${scheme.name}_checked")
     }
@@ -91,7 +88,7 @@
     fun checkBox_unchecked() {
         rule.setMaterialContent(scheme.colorScheme) {
             Box(wrap.testTag(wrapperTestTag)) {
-                Checkbox(modifier = wrap, checked = false, onCheckedChange = { })
+                Checkbox(modifier = wrap, checked = false, onCheckedChange = {})
             }
         }
         assertToggeableAgainstGolden("checkBox_${scheme.name}_unchecked")
@@ -101,13 +98,12 @@
     fun checkBox_pressed() {
         rule.setMaterialContent(scheme.colorScheme) {
             Box(wrap.testTag(wrapperTestTag)) {
-                Checkbox(modifier = wrap, checked = false, onCheckedChange = { })
+                Checkbox(modifier = wrap, checked = false, onCheckedChange = {})
             }
         }
 
         rule.mainClock.autoAdvance = false
-        rule.onNode(isToggleable())
-            .performTouchInput { down(center) }
+        rule.onNode(isToggleable()).performTouchInput { down(center) }
 
         rule.mainClock.advanceTimeByFrame()
         rule.waitForIdle() // Wait for measure
@@ -138,11 +134,7 @@
     fun checkBox_disabled_checked() {
         rule.setMaterialContent(scheme.colorScheme) {
             Box(wrap.testTag(wrapperTestTag)) {
-                Checkbox(
-                    modifier = wrap,
-                    checked = true,
-                    enabled = false,
-                    onCheckedChange = { })
+                Checkbox(modifier = wrap, checked = true, enabled = false, onCheckedChange = {})
             }
         }
         assertToggeableAgainstGolden("checkBox_${scheme.name}_disabled_checked")
@@ -152,11 +144,7 @@
     fun checkBox_disabled_unchecked() {
         rule.setMaterialContent(scheme.colorScheme) {
             Box(wrap.testTag(wrapperTestTag)) {
-                Checkbox(
-                    modifier = wrap,
-                    checked = false,
-                    enabled = false,
-                    onCheckedChange = { })
+                Checkbox(modifier = wrap, checked = false, enabled = false, onCheckedChange = {})
             }
         }
         assertToggeableAgainstGolden("checkBox_${scheme.name}_disabled_unchecked")
@@ -195,9 +183,7 @@
         // Because Ripples are drawn on the RenderThread, it is hard to synchronize them with
         // Compose animations, so instead just manually change the value instead of triggering
         // and trying to screenshot a ripple
-        rule.runOnIdle {
-            isChecked.value = true
-        }
+        rule.runOnIdle { isChecked.value = true }
 
         rule.mainClock.advanceTimeByFrame()
         rule.waitForIdle() // Wait for measure
@@ -224,9 +210,7 @@
         // Because Ripples are drawn on the RenderThread, it is hard to synchronize them with
         // Compose animations, so instead just manually change the value instead of triggering
         // and trying to screenshot a ripple
-        rule.runOnIdle {
-            isChecked.value = false
-        }
+        rule.runOnIdle { isChecked.value = false }
 
         rule.mainClock.advanceTimeByFrame()
         rule.waitForIdle() // Wait for measure
@@ -239,16 +223,11 @@
     fun checkBox_hover() {
         rule.setMaterialContent(scheme.colorScheme) {
             Box(wrap.testTag(wrapperTestTag)) {
-                Checkbox(
-                    modifier = wrap,
-                    checked = true,
-                    onCheckedChange = { }
-                )
+                Checkbox(modifier = wrap, checked = true, onCheckedChange = {})
             }
         }
 
-        rule.onNode(isToggleable())
-            .performMouseInput { enter(center) }
+        rule.onNode(isToggleable()).performMouseInput { enter(center) }
 
         rule.waitForIdle()
 
@@ -264,10 +243,9 @@
             localInputModeManager = LocalInputModeManager.current
             Box(wrap.testTag(wrapperTestTag)) {
                 Checkbox(
-                    modifier = wrap
-                        .focusRequester(focusRequester),
+                    modifier = wrap.focusRequester(focusRequester),
                     checked = true,
-                    onCheckedChange = { }
+                    onCheckedChange = {}
                 )
             }
         }
@@ -287,14 +265,15 @@
     fun checkBox_customColors() {
         rule.setMaterialContent(scheme.colorScheme) {
             Column(wrap.testTag(wrapperTestTag), verticalArrangement = Arrangement.spacedBy(2.dp)) {
-                val colors = CheckboxDefaults.colors(
-                    checkedColor = Color.Red,
-                    uncheckedColor = Color.Gray,
-                    checkmarkColor = Color.Green,
-                    disabledCheckedColor = Color.Red.copy(alpha = 0.38f),
-                    disabledUncheckedColor = Color.Gray.copy(alpha = 0.38f),
-                    disabledIndeterminateColor = Color.Magenta.copy(alpha = 0.38f)
-                )
+                val colors =
+                    CheckboxDefaults.colors(
+                        checkedColor = Color.Red,
+                        uncheckedColor = Color.Gray,
+                        checkmarkColor = Color.Green,
+                        disabledCheckedColor = Color.Red.copy(alpha = 0.38f),
+                        disabledUncheckedColor = Color.Gray.copy(alpha = 0.38f),
+                        disabledIndeterminateColor = Color.Magenta.copy(alpha = 0.38f)
+                    )
                 Checkboxes(colors = colors)
             }
         }
@@ -308,22 +287,23 @@
     fun checkBox_customCheckboxColorsConstruct() {
         rule.setMaterialContent(scheme.colorScheme) {
             Column(wrap.testTag(wrapperTestTag), verticalArrangement = Arrangement.spacedBy(2.dp)) {
-                val colors = CheckboxColors(
-                    checkedCheckmarkColor = Color.Black,
-                    // Irrelevant for the test, as this color only appears when the check mark
-                    // transitions from checked to unchecked.
-                    uncheckedCheckmarkColor = Color.Transparent,
-                    checkedBoxColor = Color.Green,
-                    uncheckedBoxColor = Color.Yellow,
-                    disabledCheckedBoxColor = Color.Green.copy(alpha = 0.38f),
-                    disabledUncheckedBoxColor = Color.Yellow.copy(alpha = 0.38f),
-                    disabledIndeterminateBoxColor = Color.Magenta.copy(alpha = 0.38f),
-                    checkedBorderColor = Color.Red,
-                    uncheckedBorderColor = Color.Black,
-                    disabledBorderColor = Color.Red.copy(alpha = 0.38f),
-                    disabledUncheckedBorderColor = Color.Blue,
-                    disabledIndeterminateBorderColor = Color.LightGray
-                )
+                val colors =
+                    CheckboxColors(
+                        checkedCheckmarkColor = Color.Black,
+                        // Irrelevant for the test, as this color only appears when the check mark
+                        // transitions from checked to unchecked.
+                        uncheckedCheckmarkColor = Color.Transparent,
+                        checkedBoxColor = Color.Green,
+                        uncheckedBoxColor = Color.Yellow,
+                        disabledCheckedBoxColor = Color.Green.copy(alpha = 0.38f),
+                        disabledUncheckedBoxColor = Color.Yellow.copy(alpha = 0.38f),
+                        disabledIndeterminateBoxColor = Color.Magenta.copy(alpha = 0.38f),
+                        checkedBorderColor = Color.Red,
+                        uncheckedBorderColor = Color.Black,
+                        disabledBorderColor = Color.Red.copy(alpha = 0.38f),
+                        disabledUncheckedBorderColor = Color.Blue,
+                        disabledIndeterminateBorderColor = Color.LightGray
+                    )
                 Checkboxes(colors = colors)
             }
         }
@@ -335,58 +315,32 @@
 
     @Composable
     private fun Checkboxes(colors: CheckboxColors) {
-        TriStateCheckbox(state = ToggleableState.Off, onClick = { }, colors = colors)
+        TriStateCheckbox(state = ToggleableState.Off, onClick = {}, colors = colors)
         TriStateCheckbox(
             state = ToggleableState.Off,
-            onClick = { },
+            onClick = {},
             enabled = false,
             colors = colors
         )
-        TriStateCheckbox(state = ToggleableState.On, onClick = { }, colors = colors)
-        TriStateCheckbox(
-            state = ToggleableState.On,
-            onClick = { },
-            enabled = false,
-            colors = colors
-        )
+        TriStateCheckbox(state = ToggleableState.On, onClick = {}, colors = colors)
+        TriStateCheckbox(state = ToggleableState.On, onClick = {}, enabled = false, colors = colors)
+        TriStateCheckbox(state = ToggleableState.Indeterminate, onClick = {}, colors = colors)
         TriStateCheckbox(
             state = ToggleableState.Indeterminate,
-            onClick = { },
-            colors = colors
-        )
-        TriStateCheckbox(
-            state = ToggleableState.Indeterminate,
-            onClick = { },
+            onClick = {},
             enabled = false,
             colors = colors
         )
-        Checkbox(
-            checked = false,
-            onCheckedChange = { },
-            colors = colors
-        )
-        Checkbox(
-            checked = false,
-            onCheckedChange = { },
-            enabled = false,
-            colors = colors
-        )
-        Checkbox(
-            checked = true,
-            onCheckedChange = { },
-            colors = colors
-        )
-        Checkbox(
-            checked = true,
-            onCheckedChange = { },
-            enabled = false,
-            colors = colors
-        )
+        Checkbox(checked = false, onCheckedChange = {}, colors = colors)
+        Checkbox(checked = false, onCheckedChange = {}, enabled = false, colors = colors)
+        Checkbox(checked = true, onCheckedChange = {}, colors = colors)
+        Checkbox(checked = true, onCheckedChange = {}, enabled = false, colors = colors)
     }
 
     private fun assertToggeableAgainstGolden(goldenName: String) {
         // TODO: replace with find(isToggeable()) after b/157687898 is fixed
-        rule.onNodeWithTag(wrapperTestTag)
+        rule
+            .onNodeWithTag(wrapperTestTag)
             .captureToImage()
             .assertAgainstGolden(screenshotRule, goldenName)
     }
@@ -397,10 +351,11 @@
     companion object {
         @Parameterized.Parameters(name = "{0}")
         @JvmStatic
-        fun parameters() = arrayOf(
-            ColorSchemeWrapper("lightTheme", lightColorScheme()),
-            ColorSchemeWrapper("darkTheme", darkColorScheme()),
-        )
+        fun parameters() =
+            arrayOf(
+                ColorSchemeWrapper("lightTheme", lightColorScheme()),
+                ColorSchemeWrapper("darkTheme", darkColorScheme()),
+            )
     }
 
     class ColorSchemeWrapper(val name: String, val colorScheme: ColorScheme) {
diff --git a/compose/material3/material3/src/androidInstrumentedTest/kotlin/androidx/compose/material3/CheckboxTest.kt b/compose/material3/material3/src/androidInstrumentedTest/kotlin/androidx/compose/material3/CheckboxTest.kt
index 5c6a6bf..f3331bf 100644
--- a/compose/material3/material3/src/androidInstrumentedTest/kotlin/androidx/compose/material3/CheckboxTest.kt
+++ b/compose/material3/material3/src/androidInstrumentedTest/kotlin/androidx/compose/material3/CheckboxTest.kt
@@ -66,8 +66,7 @@
 @RunWith(AndroidJUnit4::class)
 class CheckboxTest {
 
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
     private val defaultTag = "myCheckbox"
 
@@ -80,12 +79,14 @@
             }
         }
 
-        rule.onNodeWithTag("checkboxUnchecked")
+        rule
+            .onNodeWithTag("checkboxUnchecked")
             .assert(SemanticsMatcher.expectValue(SemanticsProperties.Role, Role.Checkbox))
             .assertIsEnabled()
             .assertIsOff()
 
-        rule.onNodeWithTag("checkboxChecked")
+        rule
+            .onNodeWithTag("checkboxChecked")
             .assert(SemanticsMatcher.expectValue(SemanticsProperties.Role, Role.Checkbox))
             .assertIsEnabled()
             .assertIsOn()
@@ -98,10 +99,7 @@
             Checkbox(checked, onCheckedChange, modifier = Modifier.testTag(defaultTag))
         }
 
-        rule.onNodeWithTag(defaultTag)
-            .assertIsOff()
-            .performClick()
-            .assertIsOn()
+        rule.onNodeWithTag(defaultTag).assertIsOff().performClick().assertIsOn()
     }
 
     @Test
@@ -111,7 +109,8 @@
             Checkbox(checked, onCheckedChange, modifier = Modifier.testTag(defaultTag))
         }
 
-        rule.onNodeWithTag(defaultTag)
+        rule
+            .onNodeWithTag(defaultTag)
             .assertIsOff()
             .performClick()
             .assertIsOn()
@@ -125,84 +124,55 @@
 
         rule.setMaterialContent(lightColorScheme()) {
             val (checked, _) = remember { mutableStateOf(false) }
-            Box(
-                Modifier
-                    .semantics(mergeDescendants = true) {}
-                    .testTag(parentTag)) {
+            Box(Modifier.semantics(mergeDescendants = true) {}.testTag(parentTag)) {
                 Checkbox(
                     checked,
                     {},
                     enabled = false,
-                    modifier = Modifier
-                        .testTag(defaultTag)
-                        .semantics { focused = true }
+                    modifier = Modifier.testTag(defaultTag).semantics { focused = true }
                 )
             }
         }
 
-        rule.onNodeWithTag(defaultTag)
-            .assertHasClickAction()
+        rule.onNodeWithTag(defaultTag).assertHasClickAction()
 
         // Check not merged into parent
-        rule.onNodeWithTag(parentTag)
-            .assert(isNotFocusable())
+        rule.onNodeWithTag(parentTag).assert(isNotFocusable())
     }
 
     @Test
     fun checkBoxTest_untoggleableAndMergeable_whenNullLambda() {
         rule.setMaterialContent(lightColorScheme()) {
             val (checked, _) = remember { mutableStateOf(false) }
-            Box(
-                Modifier
-                    .semantics(mergeDescendants = true) {}
-                    .testTag(defaultTag)) {
-                Checkbox(
-                    checked,
-                    null,
-                    modifier = Modifier.semantics { focused = true }
-                )
+            Box(Modifier.semantics(mergeDescendants = true) {}.testTag(defaultTag)) {
+                Checkbox(checked, null, modifier = Modifier.semantics { focused = true })
             }
         }
 
-        rule.onNodeWithTag(defaultTag)
+        rule
+            .onNodeWithTag(defaultTag)
             .assertHasNoClickAction()
             .assert(isFocusable()) // Check merged into parent
     }
 
     @Test
     fun checkBoxTest_MaterialSize_WhenChecked_minimumTouchTarget() {
-        materialSizeTestForValue(
-            checkboxValue = On,
-            clickable = true,
-            minimumTouchTarget = true
-        )
+        materialSizeTestForValue(checkboxValue = On, clickable = true, minimumTouchTarget = true)
     }
 
     @Test
     fun checkBoxTest_MaterialSize_WhenChecked_withoutMinimumTouchTarget() {
-        materialSizeTestForValue(
-            checkboxValue = On,
-            clickable = true,
-            minimumTouchTarget = false
-        )
+        materialSizeTestForValue(checkboxValue = On, clickable = true, minimumTouchTarget = false)
     }
 
     @Test
     fun checkBoxTest_MaterialSize_WhenUnchecked_minimumTouchTarget() {
-        materialSizeTestForValue(
-            checkboxValue = Off,
-            clickable = true,
-            minimumTouchTarget = true
-        )
+        materialSizeTestForValue(checkboxValue = Off, clickable = true, minimumTouchTarget = true)
     }
 
     @Test
     fun checkBoxTest_MaterialSize_WhenUnchecked_withoutMinimumTouchTarget() {
-        materialSizeTestForValue(
-            checkboxValue = Off,
-            clickable = true,
-            minimumTouchTarget = false
-        )
+        materialSizeTestForValue(checkboxValue = Off, clickable = true, minimumTouchTarget = false)
     }
 
     @Test
@@ -225,38 +195,22 @@
 
     @Test
     fun checkBoxTest_MaterialSize_WhenChecked_notClickable_minimumTouchTarget() {
-        materialSizeTestForValue(
-            checkboxValue = On,
-            clickable = false,
-            minimumTouchTarget = true
-        )
+        materialSizeTestForValue(checkboxValue = On, clickable = false, minimumTouchTarget = true)
     }
 
     @Test
     fun checkBoxTest_MaterialSize_WhenChecked_notClickable_withoutMinimumTouchTarget() {
-        materialSizeTestForValue(
-            checkboxValue = On,
-            clickable = false,
-            minimumTouchTarget = false
-        )
+        materialSizeTestForValue(checkboxValue = On, clickable = false, minimumTouchTarget = false)
     }
 
     @Test
     fun checkBoxTest_MaterialSize_WhenUnchecked_notClickable_minimumTouchTarget() {
-        materialSizeTestForValue(
-            checkboxValue = Off,
-            clickable = false,
-            minimumTouchTarget = true
-        )
+        materialSizeTestForValue(checkboxValue = Off, clickable = false, minimumTouchTarget = true)
     }
 
     @Test
     fun checkBoxTest_MaterialSize_WhenUnchecked_notClickable_withoutMinimumTouchTarget() {
-        materialSizeTestForValue(
-            checkboxValue = Off,
-            clickable = false,
-            minimumTouchTarget = false
-        )
+        materialSizeTestForValue(checkboxValue = Off, clickable = false, minimumTouchTarget = false)
     }
 
     @Test
@@ -291,9 +245,10 @@
                 ) {
                     TriStateCheckbox(
                         state = checkboxValue,
-                        onClick = if (clickable) {
-                            {}
-                        } else null,
+                        onClick =
+                            if (clickable) {
+                                {}
+                            } else null,
                         enabled = false
                     )
                 }
@@ -308,30 +263,28 @@
     }
 
     @Test
-    fun checkBoxTest_clickInMinimumTouchTarget(): Unit = with(rule.density) {
-        val tag = "switch"
-        var state by mutableStateOf(Off)
-        rule.setMaterialContent(lightColorScheme()) {
-            // Box is needed because otherwise the control will be expanded to fill its parent
-            Box(Modifier.fillMaxSize()) {
-                TriStateCheckbox(
-                    state = state,
-                    onClick = { state = On },
-                    modifier = Modifier
-                        .align(Alignment.Center)
-                        .requiredSize(2.dp)
-                        .testTag(tag)
-                )
+    fun checkBoxTest_clickInMinimumTouchTarget(): Unit =
+        with(rule.density) {
+            val tag = "switch"
+            var state by mutableStateOf(Off)
+            rule.setMaterialContent(lightColorScheme()) {
+                // Box is needed because otherwise the control will be expanded to fill its parent
+                Box(Modifier.fillMaxSize()) {
+                    TriStateCheckbox(
+                        state = state,
+                        onClick = { state = On },
+                        modifier = Modifier.align(Alignment.Center).requiredSize(2.dp).testTag(tag)
+                    )
+                }
             }
+            rule
+                .onNodeWithTag(tag)
+                .assertIsOff()
+                .assertWidthIsEqualTo(2.dp)
+                .assertHeightIsEqualTo(2.dp)
+                .assertTouchWidthIsEqualTo(48.dp)
+                .assertTouchHeightIsEqualTo(48.dp)
+                .performTouchInput { click(position = Offset(-1f, -1f)) }
+                .assertIsOn()
         }
-        rule.onNodeWithTag(tag)
-            .assertIsOff()
-            .assertWidthIsEqualTo(2.dp)
-            .assertHeightIsEqualTo(2.dp)
-            .assertTouchWidthIsEqualTo(48.dp)
-            .assertTouchHeightIsEqualTo(48.dp)
-            .performTouchInput {
-                click(position = Offset(-1f, -1f))
-            }.assertIsOn()
-    }
 }
diff --git a/compose/material3/material3/src/androidInstrumentedTest/kotlin/androidx/compose/material3/ChipScreenshotTest.kt b/compose/material3/material3/src/androidInstrumentedTest/kotlin/androidx/compose/material3/ChipScreenshotTest.kt
index 490353b..96f066e 100644
--- a/compose/material3/material3/src/androidInstrumentedTest/kotlin/androidx/compose/material3/ChipScreenshotTest.kt
+++ b/compose/material3/material3/src/androidInstrumentedTest/kotlin/androidx/compose/material3/ChipScreenshotTest.kt
@@ -41,11 +41,9 @@
 @SdkSuppress(minSdkVersion = Build.VERSION_CODES.O)
 class ChipScreenshotTest {
 
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
-    @get:Rule
-    val screenshotRule = AndroidXScreenshotTestRule(GOLDEN_MATERIAL3)
+    @get:Rule val screenshotRule = AndroidXScreenshotTestRule(GOLDEN_MATERIAL3)
 
     @Test
     fun assistChip_flat_lightTheme() {
@@ -485,7 +483,8 @@
     }
 
     private fun assertChipAgainstGolden(goldenIdentifier: String) {
-        rule.onNodeWithTag(TestTag)
+        rule
+            .onNodeWithTag(TestTag)
             .captureToImage()
             .assertAgainstGolden(screenshotRule, goldenIdentifier)
     }
diff --git a/compose/material3/material3/src/androidInstrumentedTest/kotlin/androidx/compose/material3/ChipTest.kt b/compose/material3/material3/src/androidInstrumentedTest/kotlin/androidx/compose/material3/ChipTest.kt
index 23b5620..dac4a3f 100644
--- a/compose/material3/material3/src/androidInstrumentedTest/kotlin/androidx/compose/material3/ChipTest.kt
+++ b/compose/material3/material3/src/androidInstrumentedTest/kotlin/androidx/compose/material3/ChipTest.kt
@@ -93,8 +93,7 @@
 @MediumTest
 @RunWith(AndroidJUnit4::class)
 class ChipTest {
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
     @Test
     fun defaultSemantics_assistChip() {
@@ -103,11 +102,13 @@
                 AssistChip(
                     onClick = {},
                     modifier = Modifier.testTag(TestChipTag),
-                    label = { Text(TestChipTag) })
+                    label = { Text(TestChipTag) }
+                )
             }
         }
 
-        rule.onNodeWithTag(TestChipTag)
+        rule
+            .onNodeWithTag(TestChipTag)
             .assert(SemanticsMatcher.expectValue(SemanticsProperties.Role, Role.Button))
             .assertIsEnabled()
             .assertHasClickAction()
@@ -126,7 +127,8 @@
             }
         }
 
-        rule.onNodeWithTag(TestChipTag)
+        rule
+            .onNodeWithTag(TestChipTag)
             .assert(SemanticsMatcher.expectValue(SemanticsProperties.Role, Role.Button))
             .assertIsNotEnabled()
             .assertHasClickAction()
@@ -142,16 +144,14 @@
                 AssistChip(
                     onClick = onClick,
                     modifier = Modifier.testTag(TestChipTag),
-                    label = { Text("Test chip") })
+                    label = { Text("Test chip") }
+                )
             }
         }
 
-        rule.onNodeWithTag(TestChipTag)
-            .performClick()
+        rule.onNodeWithTag(TestChipTag).performClick()
 
-        rule.runOnIdle {
-            assertThat(counter).isEqualTo(1)
-        }
+        rule.runOnIdle { assertThat(counter).isEqualTo(1) }
     }
 
     @Test
@@ -163,8 +163,7 @@
             AssistChip(onClick = {}, label = { Text("Test chip") })
         }
 
-        rule.onNode(hasClickAction())
-            .assertHeightIsEqualTo(AssistChipDefaults.Height)
+        rule.onNode(hasClickAction()).assertHeightIsEqualTo(AssistChipDefaults.Height)
     }
 
     @Test
@@ -174,22 +173,17 @@
             AssistChip(
                 onClick = {},
                 modifier = Modifier.onGloballyPositioned { chipCoordinates = it },
-                label = {
-                    Text(
-                        "Assist chip",
-                        Modifier.testTag(TestChipTag)
-                    )
-                })
+                label = { Text("Assist chip", Modifier.testTag(TestChipTag)) }
+            )
         }
 
         var chipWidth = 0.dp
         rule.runOnIdle {
-            chipWidth = with(rule.density) {
-                chipCoordinates!!.boundsInWindow().width.toDp()
-            }
+            chipWidth = with(rule.density) { chipCoordinates!!.boundsInWindow().width.toDp() }
         }
 
-        rule.onNodeWithTag(TestChipTag, useUnmergedTree = true)
+        rule
+            .onNodeWithTag(TestChipTag, useUnmergedTree = true)
             .assertLeftPositionInRootIsEqualTo(16.dp)
             .assertWidthIsEqualTo(chipWidth - 16.dp - 16.dp)
     }
@@ -201,29 +195,24 @@
             AssistChip(
                 onClick = {},
                 modifier = Modifier.onGloballyPositioned { chipCoordinates = it },
-                label = {
-                    Text(
-                        "Assist chip",
-                        Modifier.testTag(TestChipTag)
-                    )
-                },
+                label = { Text("Assist chip", Modifier.testTag(TestChipTag)) },
                 leadingIcon = {
                     Icon(
                         imageVector = Icons.Filled.Done,
                         contentDescription = "Localized Description",
                         modifier = Modifier.size(AssistChipDefaults.IconSize)
                     )
-                })
+                }
+            )
         }
 
         var chipWidth = 0.dp
         rule.runOnIdle {
-            chipWidth = with(rule.density) {
-                chipCoordinates!!.boundsInWindow().width.toDp()
-            }
+            chipWidth = with(rule.density) { chipCoordinates!!.boundsInWindow().width.toDp() }
         }
 
-        rule.onNodeWithTag(TestChipTag, useUnmergedTree = true)
+        rule
+            .onNodeWithTag(TestChipTag, useUnmergedTree = true)
             .assertLeftPositionInRootIsEqualTo(8.dp + AssistChipDefaults.IconSize + 8.dp)
             .assertWidthIsEqualTo(chipWidth - 16.dp - AssistChipDefaults.IconSize - 16.dp)
     }
@@ -241,30 +230,29 @@
                     Icon(
                         Icons.Filled.Settings,
                         contentDescription = "Localized description",
-                        modifier = Modifier
-                            .testTag("Leading")
-                            .size(AssistChipDefaults.IconSize)
+                        modifier = Modifier.testTag("Leading").size(AssistChipDefaults.IconSize)
                     )
                 },
                 trailingIcon = {
                     Icon(
                         Icons.Filled.Settings,
                         contentDescription = "Localized description",
-                        modifier = Modifier
-                            .testTag("Trailing")
-                            .size(AssistChipDefaults.IconSize)
+                        modifier = Modifier.testTag("Trailing").size(AssistChipDefaults.IconSize)
                     )
                 },
             )
         }
 
-        rule.onNodeWithTag("Leading", useUnmergedTree = true)
+        rule
+            .onNodeWithTag("Leading", useUnmergedTree = true)
             .assertLeftPositionInRootIsEqualTo(horizontalPadding)
-        rule.onNodeWithText("Test chip", useUnmergedTree = true)
+        rule
+            .onNodeWithText("Test chip", useUnmergedTree = true)
             .assertLeftPositionInRootIsEqualTo(
                 horizontalPadding + AssistChipDefaults.IconSize + horizontalPadding
             )
-        rule.onNodeWithTag("Trailing", useUnmergedTree = true)
+        rule
+            .onNodeWithTag("Trailing", useUnmergedTree = true)
             .assertLeftPositionInRootIsEqualTo(
                 chipWidth - horizontalPadding - AssistChipDefaults.IconSize
             )
@@ -276,14 +264,10 @@
         var contentColor = Color.Unspecified
         rule.setMaterialContent(lightColorScheme()) {
             expectedLabelColor = AssistChipTokens.LabelTextColor.value
-            AssistChip(onClick = {}, label = {
-                contentColor = LocalContentColor.current
-            })
+            AssistChip(onClick = {}, label = { contentColor = LocalContentColor.current })
         }
 
-        rule.runOnIdle {
-            assertThat(contentColor).isEqualTo(expectedLabelColor)
-        }
+        rule.runOnIdle { assertThat(contentColor).isEqualTo(expectedLabelColor) }
     }
 
     @SdkSuppress(minSdkVersion = Build.VERSION_CODES.O)
@@ -292,9 +276,10 @@
     fun elevatedDisabled_assistChip() {
         var containerColor = Color.Unspecified
         rule.setMaterialContent(lightColorScheme()) {
-            containerColor = AssistChipTokens.ElevatedDisabledContainerColor.value
-                .copy(alpha = AssistChipTokens.ElevatedDisabledContainerOpacity)
-                .compositeOver(MaterialTheme.colorScheme.surface)
+            containerColor =
+                AssistChipTokens.ElevatedDisabledContainerColor.value
+                    .copy(alpha = AssistChipTokens.ElevatedDisabledContainerOpacity)
+                    .compositeOver(MaterialTheme.colorScheme.surface)
             ElevatedAssistChip(
                 modifier = Modifier.testTag(TestChipTag),
                 onClick = {},
@@ -304,7 +289,8 @@
             )
         }
 
-        rule.onNodeWithTag(TestChipTag)
+        rule
+            .onNodeWithTag(TestChipTag)
             .captureToImage()
             .assertShape(
                 density = rule.density,
@@ -323,11 +309,13 @@
                     selected = false,
                     onClick = {},
                     modifier = Modifier.testTag(TestChipTag),
-                    label = { Text(TestChipTag) })
+                    label = { Text(TestChipTag) }
+                )
             }
         }
 
-        rule.onNodeWithTag(TestChipTag)
+        rule
+            .onNodeWithTag(TestChipTag)
             .assert(SemanticsMatcher.expectValue(SemanticsProperties.Role, Role.Checkbox))
             .assertIsEnabled()
             .assertHasClickAction()
@@ -342,11 +330,13 @@
                     selected = true,
                     onClick = {},
                     modifier = Modifier.testTag(TestChipTag),
-                    label = { Text(TestChipTag) })
+                    label = { Text(TestChipTag) }
+                )
             }
         }
 
-        rule.onNodeWithTag(TestChipTag)
+        rule
+            .onNodeWithTag(TestChipTag)
             .assert(SemanticsMatcher.expectValue(SemanticsProperties.Role, Role.Checkbox))
             .assertIsEnabled()
             .assertHasClickAction()
@@ -367,7 +357,8 @@
             }
         }
 
-        rule.onNodeWithTag(TestChipTag)
+        rule
+            .onNodeWithTag(TestChipTag)
             .assert(SemanticsMatcher.expectValue(SemanticsProperties.Role, Role.Checkbox))
             .assertIsNotEnabled()
             .assertHasClickAction()
@@ -383,11 +374,13 @@
                     selected = selected.value,
                     onClick = { selected.value = !selected.value },
                     modifier = Modifier.testTag(TestChipTag),
-                    label = { Text("Test chip") })
+                    label = { Text("Test chip") }
+                )
             }
         }
 
-        rule.onNodeWithTag(TestChipTag)
+        rule
+            .onNodeWithTag(TestChipTag)
             .assertIsNotSelected()
             .performClick()
             .assertIsSelected()
@@ -403,21 +396,16 @@
                 selected = false,
                 onClick = {},
                 modifier = Modifier.onGloballyPositioned { chipCoordinates = it },
-                label = {
-                    Text(
-                        "Filter chip",
-                        Modifier.testTag(TestChipTag)
-                    )
-                })
+                label = { Text("Filter chip", Modifier.testTag(TestChipTag)) }
+            )
         }
 
         var chipWidth = 0.dp
         rule.runOnIdle {
-            chipWidth = with(rule.density) {
-                chipCoordinates!!.boundsInWindow().width.toDp()
-            }
+            chipWidth = with(rule.density) { chipCoordinates!!.boundsInWindow().width.toDp() }
         }
-        rule.onNodeWithTag(TestChipTag, useUnmergedTree = true)
+        rule
+            .onNodeWithTag(TestChipTag, useUnmergedTree = true)
             .assertLeftPositionInRootIsEqualTo(16.dp)
             .assertWidthIsEqualTo(chipWidth - 16.dp - 16.dp)
     }
@@ -430,28 +418,23 @@
                 selected = true,
                 onClick = {},
                 modifier = Modifier.onGloballyPositioned { chipCoordinates = it },
-                label = {
-                    Text(
-                        "Filter chip",
-                        Modifier.testTag(TestChipTag)
-                    )
-                },
+                label = { Text("Filter chip", Modifier.testTag(TestChipTag)) },
                 leadingIcon = {
                     Icon(
                         imageVector = Icons.Filled.Done,
                         contentDescription = "Localized Description",
                         modifier = Modifier.size(FilterChipDefaults.IconSize)
                     )
-                })
+                }
+            )
         }
 
         var chipWidth = 0.dp
         rule.runOnIdle {
-            chipWidth = with(rule.density) {
-                chipCoordinates!!.boundsInWindow().width.toDp()
-            }
+            chipWidth = with(rule.density) { chipCoordinates!!.boundsInWindow().width.toDp() }
         }
-        rule.onNodeWithTag(TestChipTag, useUnmergedTree = true)
+        rule
+            .onNodeWithTag(TestChipTag, useUnmergedTree = true)
             .assertLeftPositionInRootIsEqualTo(8.dp + FilterChipDefaults.IconSize + 8.dp)
             .assertWidthIsEqualTo(chipWidth - 16.dp - FilterChipDefaults.IconSize - 16.dp)
     }
@@ -464,12 +447,7 @@
                 selected = false,
                 onClick = {},
                 modifier = Modifier.onGloballyPositioned { chipCoordinates = it },
-                label = {
-                    Text(
-                        "Filter chip",
-                        Modifier.testTag(TestChipTag)
-                    )
-                },
+                label = { Text("Filter chip", Modifier.testTag(TestChipTag)) },
                 leadingIcon = {
                     Icon(
                         imageVector = Icons.Filled.Person,
@@ -483,20 +461,23 @@
                         contentDescription = "Localized Description",
                         modifier = Modifier.size(FilterChipDefaults.IconSize)
                     )
-                })
+                }
+            )
         }
 
         var chipWidth = 0.dp
         rule.runOnIdle {
-            chipWidth = with(rule.density) {
-                chipCoordinates!!.boundsInWindow().width.toDp()
-            }
+            chipWidth = with(rule.density) { chipCoordinates!!.boundsInWindow().width.toDp() }
         }
-        rule.onNodeWithTag(TestChipTag, useUnmergedTree = true)
+        rule
+            .onNodeWithTag(TestChipTag, useUnmergedTree = true)
             .assertLeftPositionInRootIsEqualTo(8.dp + FilterChipDefaults.IconSize + 8.dp)
             .assertWidthIsEqualTo(
-                chipWidth - 16.dp - FilterChipDefaults.IconSize -
-                    FilterChipDefaults.IconSize - 16.dp
+                chipWidth -
+                    16.dp -
+                    FilterChipDefaults.IconSize -
+                    FilterChipDefaults.IconSize -
+                    16.dp
             )
     }
 
@@ -509,8 +490,7 @@
             FilterChip(selected = false, onClick = {}, label = { Text("Test chip") })
         }
 
-        rule.onNode(hasClickAction())
-            .assertHeightIsEqualTo(FilterChipDefaults.Height)
+        rule.onNode(hasClickAction()).assertHeightIsEqualTo(FilterChipDefaults.Height)
     }
 
     @Test
@@ -527,7 +507,8 @@
             }
         }
 
-        rule.onNode(hasClickAction())
+        rule
+            .onNode(hasClickAction())
             .assertHeightIsEqualTo(FilterChipDefaults.Height)
             .assertWidthIsEqualTo(labelWidth + horizontalPadding * 2)
     }
@@ -538,8 +519,12 @@
             FilterChip(
                 selected = false,
                 onClick = {},
-                label = { Text("Long long long long long long long long long long long long" +
-                    "long long long long long long long long long long long long long long long") },
+                label = {
+                    Text(
+                        "Long long long long long long long long long long long long" +
+                            "long long long long long long long long long long long long long long long"
+                    )
+                },
                 leadingIcon = {
                     Icon(
                         imageVector = Icons.Filled.Settings,
@@ -551,9 +536,7 @@
                     Icon(
                         imageVector = Icons.Filled.Settings,
                         contentDescription = "Localized Description",
-                        modifier = Modifier
-                            .testTag("Trailing")
-                            .size(FilterChipDefaults.IconSize)
+                        modifier = Modifier.testTag("Trailing").size(FilterChipDefaults.IconSize)
                     )
                 }
             )
@@ -568,14 +551,14 @@
         var contentColor = Color.Unspecified
         rule.setMaterialContent(lightColorScheme()) {
             expectedLabelColor = FilterChipTokens.UnselectedLabelTextColor.value
-            FilterChip(selected = false, onClick = {}, label = {
-                contentColor = LocalContentColor.current
-            })
+            FilterChip(
+                selected = false,
+                onClick = {},
+                label = { contentColor = LocalContentColor.current }
+            )
         }
 
-        rule.runOnIdle {
-            assertThat(contentColor).isEqualTo(expectedLabelColor)
-        }
+        rule.runOnIdle { assertThat(contentColor).isEqualTo(expectedLabelColor) }
     }
 
     @Test
@@ -584,40 +567,50 @@
         var contentColor = Color.Unspecified
         rule.setMaterialContent(lightColorScheme()) {
             expectedLabelColor = FilterChipTokens.SelectedLabelTextColor.value
-            FilterChip(selected = true, onClick = {}, label = {
-                contentColor = LocalContentColor.current
-            })
+            FilterChip(
+                selected = true,
+                onClick = {},
+                label = { contentColor = LocalContentColor.current }
+            )
         }
 
-        rule.runOnIdle {
-            assertThat(contentColor).isEqualTo(expectedLabelColor)
-        }
+        rule.runOnIdle { assertThat(contentColor).isEqualTo(expectedLabelColor) }
     }
 
     @Test
     fun defaultColors_elevatedFilterChip() {
         rule.setMaterialContent(lightColorScheme()) {
-            val expectedColors = SelectableChipColors(
-                containerColor = FilterChipTokens.ElevatedUnselectedContainerColor.value,
-                labelColor = FilterChipTokens.UnselectedLabelTextColor.value,
-                leadingIconColor = FilterChipTokens.UnselectedLeadingIconColor.value,
-                trailingIconColor = FilterChipTokens.UnselectedLeadingIconColor.value,
-                disabledContainerColor = FilterChipTokens.ElevatedDisabledContainerColor.value
-                    .copy(alpha = FilterChipTokens.ElevatedDisabledContainerOpacity),
-                disabledLabelColor = FilterChipTokens.DisabledLabelTextColor.value
-                    .copy(alpha = FilterChipTokens.DisabledLabelTextOpacity),
-                disabledLeadingIconColor = FilterChipTokens.DisabledLeadingIconColor.value
-                    .copy(alpha = FilterChipTokens.DisabledLeadingIconOpacity),
-                disabledTrailingIconColor = FilterChipTokens.DisabledLeadingIconColor.value
-                    .copy(alpha = FilterChipTokens.DisabledLeadingIconOpacity),
-                selectedContainerColor = FilterChipTokens.ElevatedSelectedContainerColor.value,
-                disabledSelectedContainerColor =
-                FilterChipTokens.ElevatedDisabledContainerColor.value
-                    .copy(alpha = FilterChipTokens.ElevatedDisabledContainerOpacity),
-                selectedLabelColor = FilterChipTokens.SelectedLabelTextColor.value,
-                selectedLeadingIconColor = FilterChipTokens.SelectedLeadingIconColor.value,
-                selectedTrailingIconColor = FilterChipTokens.SelectedLeadingIconColor.value
-            )
+            val expectedColors =
+                SelectableChipColors(
+                    containerColor = FilterChipTokens.ElevatedUnselectedContainerColor.value,
+                    labelColor = FilterChipTokens.UnselectedLabelTextColor.value,
+                    leadingIconColor = FilterChipTokens.UnselectedLeadingIconColor.value,
+                    trailingIconColor = FilterChipTokens.UnselectedLeadingIconColor.value,
+                    disabledContainerColor =
+                        FilterChipTokens.ElevatedDisabledContainerColor.value.copy(
+                            alpha = FilterChipTokens.ElevatedDisabledContainerOpacity
+                        ),
+                    disabledLabelColor =
+                        FilterChipTokens.DisabledLabelTextColor.value.copy(
+                            alpha = FilterChipTokens.DisabledLabelTextOpacity
+                        ),
+                    disabledLeadingIconColor =
+                        FilterChipTokens.DisabledLeadingIconColor.value.copy(
+                            alpha = FilterChipTokens.DisabledLeadingIconOpacity
+                        ),
+                    disabledTrailingIconColor =
+                        FilterChipTokens.DisabledLeadingIconColor.value.copy(
+                            alpha = FilterChipTokens.DisabledLeadingIconOpacity
+                        ),
+                    selectedContainerColor = FilterChipTokens.ElevatedSelectedContainerColor.value,
+                    disabledSelectedContainerColor =
+                        FilterChipTokens.ElevatedDisabledContainerColor.value.copy(
+                            alpha = FilterChipTokens.ElevatedDisabledContainerOpacity
+                        ),
+                    selectedLabelColor = FilterChipTokens.SelectedLabelTextColor.value,
+                    selectedLeadingIconColor = FilterChipTokens.SelectedLeadingIconColor.value,
+                    selectedTrailingIconColor = FilterChipTokens.SelectedLeadingIconColor.value
+                )
             val colors = FilterChipDefaults.elevatedFilterChipColors()
             assertThat(colors).isEqualTo(expectedColors)
         }
@@ -631,11 +624,13 @@
                     selected = false,
                     onClick = {},
                     modifier = Modifier.testTag(TestChipTag),
-                    label = { Text(TestChipTag) })
+                    label = { Text(TestChipTag) }
+                )
             }
         }
 
-        rule.onNodeWithTag(TestChipTag)
+        rule
+            .onNodeWithTag(TestChipTag)
             .assert(SemanticsMatcher.expectValue(SemanticsProperties.Role, Role.Checkbox))
             .assertIsEnabled()
             .assertHasClickAction()
@@ -649,11 +644,13 @@
                     selected = false,
                     onClick = {},
                     modifier = Modifier.testTag(TestChipTag),
-                    label = { Text(TestChipTag) })
+                    label = { Text(TestChipTag) }
+                )
             }
         }
 
-        rule.onNodeWithTag(TestChipTag)
+        rule
+            .onNodeWithTag(TestChipTag)
             .assert(SemanticsMatcher.expectValue(SemanticsProperties.Role, Role.Checkbox))
             .assertIsEnabled()
             .assertHasClickAction()
@@ -668,11 +665,13 @@
                     selected = true,
                     onClick = {},
                     modifier = Modifier.testTag(TestChipTag),
-                    label = { Text(TestChipTag) })
+                    label = { Text(TestChipTag) }
+                )
             }
         }
 
-        rule.onNodeWithTag(TestChipTag)
+        rule
+            .onNodeWithTag(TestChipTag)
             .assert(SemanticsMatcher.expectValue(SemanticsProperties.Role, Role.Checkbox))
             .assertIsEnabled()
             .assertHasClickAction()
@@ -693,7 +692,8 @@
             }
         }
 
-        rule.onNodeWithTag(TestChipTag)
+        rule
+            .onNodeWithTag(TestChipTag)
             .assert(SemanticsMatcher.expectValue(SemanticsProperties.Role, Role.Checkbox))
             .assertIsNotEnabled()
             .assertHasClickAction()
@@ -709,11 +709,13 @@
                     selected = selected.value,
                     onClick = { selected.value = !selected.value },
                     modifier = Modifier.testTag(TestChipTag),
-                    label = { Text("Test chip") })
+                    label = { Text("Test chip") }
+                )
             }
         }
 
-        rule.onNodeWithTag(TestChipTag)
+        rule
+            .onNodeWithTag(TestChipTag)
             .assertIsNotSelected()
             .performClick()
             .assertIsSelected()
@@ -730,8 +732,7 @@
             InputChip(selected = false, onClick = {}, label = { Text("Test chip") })
         }
 
-        rule.onNode(hasClickAction())
-            .assertHeightIsEqualTo(InputChipDefaults.Height)
+        rule.onNode(hasClickAction()).assertHeightIsEqualTo(InputChipDefaults.Height)
     }
 
     @Test
@@ -742,22 +743,17 @@
                 selected = false,
                 onClick = {},
                 modifier = Modifier.onGloballyPositioned { chipCoordinates = it },
-                label = {
-                    Text(
-                        "Input chip",
-                        Modifier.testTag(TestChipTag)
-                    )
-                })
+                label = { Text("Input chip", Modifier.testTag(TestChipTag)) }
+            )
         }
 
         var chipWidth = 0.dp
         rule.runOnIdle {
-            chipWidth = with(rule.density) {
-                chipCoordinates!!.boundsInWindow().width.toDp()
-            }
+            chipWidth = with(rule.density) { chipCoordinates!!.boundsInWindow().width.toDp() }
         }
 
-        rule.onNodeWithTag(TestChipTag, useUnmergedTree = true)
+        rule
+            .onNodeWithTag(TestChipTag, useUnmergedTree = true)
             .assertLeftPositionInRootIsEqualTo(12.dp)
             .assertWidthIsEqualTo(chipWidth - 12.dp - 12.dp)
     }
@@ -770,30 +766,25 @@
                 selected = false,
                 onClick = {},
                 modifier = Modifier.onGloballyPositioned { chipCoordinates = it },
-                label = {
-                    Text(
-                        "Input chip",
-                        Modifier.testTag(TestChipTag)
-                    )
-                },
+                label = { Text("Input chip", Modifier.testTag(TestChipTag)) },
                 leadingIcon = {
                     Icon(
                         imageVector = Icons.Filled.Done,
                         contentDescription = "Localized Description",
                         modifier = Modifier.size(InputChipDefaults.IconSize)
                     )
-                })
+                }
+            )
         }
 
         var chipWidth = 0.dp
         rule.runOnIdle {
-            chipWidth = with(rule.density) {
-                chipCoordinates!!.boundsInWindow().width.toDp()
-            }
+            chipWidth = with(rule.density) { chipCoordinates!!.boundsInWindow().width.toDp() }
         }
 
         // Note that InputChip has slightly different padding than the other Chips.
-        rule.onNodeWithTag(TestChipTag, useUnmergedTree = true)
+        rule
+            .onNodeWithTag(TestChipTag, useUnmergedTree = true)
             .assertLeftPositionInRootIsEqualTo(8.dp + InputChipDefaults.IconSize + 8.dp)
             .assertWidthIsEqualTo(chipWidth - 16.dp - InputChipDefaults.IconSize - 12.dp)
     }
@@ -806,30 +797,25 @@
                 selected = false,
                 onClick = {},
                 modifier = Modifier.onGloballyPositioned { chipCoordinates = it },
-                label = {
-                    Text(
-                        "Input chip",
-                        Modifier.testTag(TestChipTag)
-                    )
-                },
+                label = { Text("Input chip", Modifier.testTag(TestChipTag)) },
                 avatar = {
                     Icon(
                         imageVector = Icons.Filled.Done,
                         contentDescription = "Localized Description",
                         modifier = Modifier.size(InputChipDefaults.AvatarSize)
                     )
-                })
+                }
+            )
         }
 
         var chipWidth = 0.dp
         rule.runOnIdle {
-            chipWidth = with(rule.density) {
-                chipCoordinates!!.boundsInWindow().width.toDp()
-            }
+            chipWidth = with(rule.density) { chipCoordinates!!.boundsInWindow().width.toDp() }
         }
 
         // Note that InputChip has slightly different padding than the other Chips.
-        rule.onNodeWithTag(TestChipTag, useUnmergedTree = true)
+        rule
+            .onNodeWithTag(TestChipTag, useUnmergedTree = true)
             .assertLeftPositionInRootIsEqualTo(4.dp + InputChipDefaults.AvatarSize + 8.dp)
             .assertWidthIsEqualTo(chipWidth - 12.dp - InputChipDefaults.AvatarSize - 12.dp)
     }
@@ -846,22 +832,16 @@
             InputChip(
                 selected = selected.value,
                 onClick = { selected.value = !selected.value },
-                label = {
-                    contentColor = LocalContentColor.current
-                },
+                label = { contentColor = LocalContentColor.current },
                 modifier = Modifier.testTag(TestChipTag)
             )
         }
 
-        rule.runOnIdle {
-            assertThat(contentColor).isEqualTo(unselectedLabelColor)
-        }
+        rule.runOnIdle { assertThat(contentColor).isEqualTo(unselectedLabelColor) }
 
         rule.onNodeWithTag(TestChipTag).performClick()
 
-        rule.runOnIdle {
-            assertThat(contentColor).isEqualTo(selectedLabelColor)
-        }
+        rule.runOnIdle { assertThat(contentColor).isEqualTo(selectedLabelColor) }
     }
 
     @Test
@@ -871,11 +851,13 @@
                 SuggestionChip(
                     onClick = {},
                     modifier = Modifier.testTag(TestChipTag),
-                    label = { Text(TestChipTag) })
+                    label = { Text(TestChipTag) }
+                )
             }
         }
 
-        rule.onNodeWithTag(TestChipTag)
+        rule
+            .onNodeWithTag(TestChipTag)
             .assert(SemanticsMatcher.expectValue(SemanticsProperties.Role, Role.Button))
             .assertIsEnabled()
             .assertHasClickAction()
@@ -894,7 +876,8 @@
             }
         }
 
-        rule.onNodeWithTag(TestChipTag)
+        rule
+            .onNodeWithTag(TestChipTag)
             .assert(SemanticsMatcher.expectValue(SemanticsProperties.Role, Role.Button))
             .assertIsNotEnabled()
             .assertHasClickAction()
@@ -910,16 +893,14 @@
                 SuggestionChip(
                     onClick = onClick,
                     modifier = Modifier.testTag(TestChipTag),
-                    label = { Text("Test chip") })
+                    label = { Text("Test chip") }
+                )
             }
         }
 
-        rule.onNodeWithTag(TestChipTag)
-            .performClick()
+        rule.onNodeWithTag(TestChipTag).performClick()
 
-        rule.runOnIdle {
-            assertThat(counter).isEqualTo(1)
-        }
+        rule.runOnIdle { assertThat(counter).isEqualTo(1) }
     }
 
     @Test
@@ -931,8 +912,7 @@
             SuggestionChip(onClick = {}, label = { Text("Test chip") })
         }
 
-        rule.onNode(hasClickAction())
-            .assertHeightIsEqualTo(SuggestionChipDefaults.Height)
+        rule.onNode(hasClickAction()).assertHeightIsEqualTo(SuggestionChipDefaults.Height)
     }
 
     @Test
@@ -942,22 +922,17 @@
             SuggestionChip(
                 onClick = {},
                 modifier = Modifier.onGloballyPositioned { chipCoordinates = it },
-                label = {
-                    Text(
-                        "Suggestion chip",
-                        Modifier.testTag(TestChipTag)
-                    )
-                })
+                label = { Text("Suggestion chip", Modifier.testTag(TestChipTag)) }
+            )
         }
 
         var chipWidth = 0.dp
         rule.runOnIdle {
-            chipWidth = with(rule.density) {
-                chipCoordinates!!.boundsInWindow().width.toDp()
-            }
+            chipWidth = with(rule.density) { chipCoordinates!!.boundsInWindow().width.toDp() }
         }
 
-        rule.onNodeWithTag(TestChipTag, useUnmergedTree = true)
+        rule
+            .onNodeWithTag(TestChipTag, useUnmergedTree = true)
             .assertLeftPositionInRootIsEqualTo(16.dp)
             .assertWidthIsEqualTo(chipWidth - 16.dp - 16.dp)
     }
@@ -969,29 +944,24 @@
             SuggestionChip(
                 onClick = {},
                 modifier = Modifier.onGloballyPositioned { chipCoordinates = it },
-                label = {
-                    Text(
-                        "Suggestion chip",
-                        Modifier.testTag(TestChipTag)
-                    )
-                },
+                label = { Text("Suggestion chip", Modifier.testTag(TestChipTag)) },
                 icon = {
                     Icon(
                         imageVector = Icons.Filled.Done,
                         contentDescription = "Localized Description",
                         modifier = Modifier.size(SuggestionChipDefaults.IconSize)
                     )
-                })
+                }
+            )
         }
 
         var chipWidth = 0.dp
         rule.runOnIdle {
-            chipWidth = with(rule.density) {
-                chipCoordinates!!.boundsInWindow().width.toDp()
-            }
+            chipWidth = with(rule.density) { chipCoordinates!!.boundsInWindow().width.toDp() }
         }
 
-        rule.onNodeWithTag(TestChipTag, useUnmergedTree = true)
+        rule
+            .onNodeWithTag(TestChipTag, useUnmergedTree = true)
             .assertLeftPositionInRootIsEqualTo(8.dp + SuggestionChipDefaults.IconSize + 8.dp)
             .assertWidthIsEqualTo(chipWidth - 16.dp - SuggestionChipDefaults.IconSize - 16.dp)
     }
@@ -1002,14 +972,10 @@
         var contentColor = Color.Unspecified
         rule.setMaterialContent(lightColorScheme()) {
             expectedLabelColor = SuggestionChipTokens.LabelTextColor.value
-            SuggestionChip(onClick = {}, label = {
-                contentColor = LocalContentColor.current
-            })
+            SuggestionChip(onClick = {}, label = { contentColor = LocalContentColor.current })
         }
 
-        rule.runOnIdle {
-            assertThat(contentColor).isEqualTo(expectedLabelColor)
-        }
+        rule.runOnIdle { assertThat(contentColor).isEqualTo(expectedLabelColor) }
     }
 
     @SdkSuppress(minSdkVersion = Build.VERSION_CODES.O)
@@ -1018,9 +984,10 @@
     fun elevatedDisabled_suggestionChip() {
         var containerColor = Color.Unspecified
         rule.setMaterialContent(lightColorScheme()) {
-            containerColor = SuggestionChipTokens.ElevatedDisabledContainerColor.value
-                .copy(alpha = SuggestionChipTokens.ElevatedDisabledContainerOpacity)
-                .compositeOver(MaterialTheme.colorScheme.surface)
+            containerColor =
+                SuggestionChipTokens.ElevatedDisabledContainerColor.value
+                    .copy(alpha = SuggestionChipTokens.ElevatedDisabledContainerOpacity)
+                    .compositeOver(MaterialTheme.colorScheme.surface)
             ElevatedSuggestionChip(
                 modifier = Modifier.testTag(TestChipTag),
                 onClick = {},
@@ -1030,7 +997,8 @@
             )
         }
 
-        rule.onNodeWithTag(TestChipTag)
+        rule
+            .onNodeWithTag(TestChipTag)
             .captureToImage()
             .assertShape(
                 density = rule.density,
@@ -1055,7 +1023,8 @@
                 )
             }
         }
-        rule.onNodeWithTag(TestChipTag)
+        rule
+            .onNodeWithTag(TestChipTag)
             // Confirm the chip starts off enabled, with a click action
             .assertHasClickAction()
             .assertIsEnabled()
@@ -1068,16 +1037,10 @@
     @Test
     fun withLargeFontSizeIsLargerThenHeight() {
         rule.setMaterialContent(lightColorScheme()) {
-            SuggestionChip(onClick = {}, label = {
-                Text(
-                    text = "Test chip",
-                    fontSize = 50.sp
-                )
-            })
+            SuggestionChip(onClick = {}, label = { Text(text = "Test chip", fontSize = 50.sp) })
         }
 
-        rule.onNode(hasClickAction())
-            .assertHeightIsAtLeast(SuggestionChipDefaults.Height + 1.dp)
+        rule.onNode(hasClickAction()).assertHeightIsAtLeast(SuggestionChipDefaults.Height + 1.dp)
     }
 
     @Test
@@ -1085,11 +1048,13 @@
         var textStyle: TextStyle? = null
         var body2TextStyle: TextStyle? = null
         rule.setMaterialContent(lightColorScheme()) {
-            SuggestionChip(onClick = {}, label = {
-                textStyle = LocalTextStyle.current
-                body2TextStyle =
-                    SuggestionChipTokens.LabelTextFont.value
-            })
+            SuggestionChip(
+                onClick = {},
+                label = {
+                    textStyle = LocalTextStyle.current
+                    body2TextStyle = SuggestionChipTokens.LabelTextFont.value
+                }
+            )
         }
 
         rule.runOnIdle { assertThat(textStyle).isEqualTo(body2TextStyle) }
@@ -1103,24 +1068,17 @@
         rule.setMaterialContent(lightColorScheme()) {
             SuggestionChip(
                 onClick = {},
-                modifier = Modifier.onGloballyPositioned {
-                    chipBounds = it.boundsInRoot()
-                },
+                modifier = Modifier.onGloballyPositioned { chipBounds = it.boundsInRoot() },
                 label = {
                     Spacer(
-                        Modifier
-                            .requiredSize(10.dp)
-                            .onGloballyPositioned {
-                                item1Bounds = it.boundsInRoot()
-                            }
+                        Modifier.requiredSize(10.dp).onGloballyPositioned {
+                            item1Bounds = it.boundsInRoot()
+                        }
                     )
                     Spacer(
-                        Modifier
-                            .requiredWidth(10.dp)
-                            .requiredHeight(5.dp)
-                            .onGloballyPositioned {
-                                item2Bounds = it.boundsInRoot()
-                            }
+                        Modifier.requiredWidth(10.dp).requiredHeight(5.dp).onGloballyPositioned {
+                            item2Bounds = it.boundsInRoot()
+                        }
                     )
                 }
             )
@@ -1138,24 +1096,21 @@
         rule.setMaterialContent(lightColorScheme()) {
             Box(Modifier.fillMaxSize()) {
                 SuggestionChip(
-                    modifier = Modifier
-                        .align(Alignment.Center)
-                        .testTag(TestChipTag)
-                        .requiredSize(10.dp),
+                    modifier =
+                        Modifier.align(Alignment.Center).testTag(TestChipTag).requiredSize(10.dp),
                     onClick = { clicked = !clicked },
                     label = { Box(Modifier.size(10.dp)) }
                 )
             }
         }
 
-        rule.onNodeWithTag(TestChipTag)
+        rule
+            .onNodeWithTag(TestChipTag)
             .assertWidthIsEqualTo(10.dp)
             .assertHeightIsEqualTo(10.dp)
             .assertTouchWidthIsEqualTo(48.dp)
             .assertTouchHeightIsEqualTo(48.dp)
-            .performTouchInput {
-                click(Offset(-1f, -1f))
-            }
+            .performTouchInput { click(Offset(-1f, -1f)) }
 
         assertThat(clicked).isTrue()
     }
diff --git a/compose/material3/material3/src/androidInstrumentedTest/kotlin/androidx/compose/material3/ColorSchemeScreenshotTest.kt b/compose/material3/material3/src/androidInstrumentedTest/kotlin/androidx/compose/material3/ColorSchemeScreenshotTest.kt
index 50fe46d..b7771f7 100644
--- a/compose/material3/material3/src/androidInstrumentedTest/kotlin/androidx/compose/material3/ColorSchemeScreenshotTest.kt
+++ b/compose/material3/material3/src/androidInstrumentedTest/kotlin/androidx/compose/material3/ColorSchemeScreenshotTest.kt
@@ -53,118 +53,115 @@
 @SdkSuppress(minSdkVersion = Build.VERSION_CODES.O)
 class ColorSchemeScreenshotTest(private val scheme: ColorSchemeWrapper) {
 
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
-    @get:Rule
-    val screenshotRule = AndroidXScreenshotTestRule(GOLDEN_MATERIAL3)
+    @get:Rule val screenshotRule = AndroidXScreenshotTestRule(GOLDEN_MATERIAL3)
 
     @Test
     fun colorScheme() {
         rule.setMaterialContent(scheme.colorScheme) {
-            Box(Modifier.semantics(mergeDescendants = true) {}.testTag(Tag)) {
-                ColorSchemeDemo()
-            }
+            Box(Modifier.semantics(mergeDescendants = true) {}.testTag(Tag)) { ColorSchemeDemo() }
         }
         assertToggeableAgainstGolden("color_scheme_${scheme.name}")
     }
 
     private fun assertToggeableAgainstGolden(goldenName: String) {
-        rule.onNodeWithTag(Tag)
-            .captureToImage()
-            .assertAgainstGolden(screenshotRule, goldenName)
+        rule.onNodeWithTag(Tag).captureToImage().assertAgainstGolden(screenshotRule, goldenName)
     }
 
     // Provide the ColorScheme and their name parameter in a ColorSchemeWrapper.
     // This makes sure that the default method name and the initial Scuba image generated
     // name is as expected.
     companion object {
-        private val LightCustomColorScheme = lightColorScheme(
-            primary = Color(0xFF006E2C),
-            onPrimary = Color(0xFFFFFFFF),
-            primaryContainer = Color(0xFF43B55F),
-            onPrimaryContainer = Color(0xFF004117),
-            inversePrimary = Color(0xFF6DDD81),
-            secondary = Color(0xFF3F6743),
-            onSecondary = Color(0xFFFFFFFF),
-            secondaryContainer = Color(0xFFC2F0C2),
-            onSecondaryContainer = Color(0xFF466F4A),
-            tertiary = Color(0xFF005EB3),
-            onTertiary = Color(0xFFFFFFFF),
-            tertiaryContainer = Color(0xFF5EA1FF),
-            onTertiaryContainer = Color(0xFF00376C),
-            background = Color(0xFFF5FBF0),
-            onBackground = Color(0xFF171D17),
-            surface = Color(0xFFF5FBF0),
-            onSurface = Color(0xFF171D17),
-            surfaceVariant = Color(0xFFD9E6D6),
-            onSurfaceVariant = Color(0xFF3E4A3E),
-            inverseSurface = Color(0xFF2C322B),
-            inverseOnSurface = Color(0xFFECF3E8),
-            error = Color(0xFFBA1A1A),
-            onError = Color(0xFFFFFFFF),
-            errorContainer = Color(0xFFFFDAD6),
-            onErrorContainer = Color(0xFF410002),
-            outline = Color(0xFF6C786A),
-            outlineVariant = Color(0xFFBDCABA),
-            scrim = Color(0xFF000000),
-            surfaceTint = Color(0xFF006E2C),
-            surfaceContainerHighest = Color(0xFFDEE4DA),
-            surfaceContainerHigh = Color(0xFFE4EADF),
-            surfaceContainer = Color(0xFFE9F0E5),
-            surfaceContainerLow = Color(0xFFEFF6EB),
-            surfaceContainerLowest = Color(0xFFFFFFFF),
-            surfaceBright = Color(0xFFF5FBF0),
-            surfaceDim = Color(0xFFD5DCD1)
-        )
+        private val LightCustomColorScheme =
+            lightColorScheme(
+                primary = Color(0xFF006E2C),
+                onPrimary = Color(0xFFFFFFFF),
+                primaryContainer = Color(0xFF43B55F),
+                onPrimaryContainer = Color(0xFF004117),
+                inversePrimary = Color(0xFF6DDD81),
+                secondary = Color(0xFF3F6743),
+                onSecondary = Color(0xFFFFFFFF),
+                secondaryContainer = Color(0xFFC2F0C2),
+                onSecondaryContainer = Color(0xFF466F4A),
+                tertiary = Color(0xFF005EB3),
+                onTertiary = Color(0xFFFFFFFF),
+                tertiaryContainer = Color(0xFF5EA1FF),
+                onTertiaryContainer = Color(0xFF00376C),
+                background = Color(0xFFF5FBF0),
+                onBackground = Color(0xFF171D17),
+                surface = Color(0xFFF5FBF0),
+                onSurface = Color(0xFF171D17),
+                surfaceVariant = Color(0xFFD9E6D6),
+                onSurfaceVariant = Color(0xFF3E4A3E),
+                inverseSurface = Color(0xFF2C322B),
+                inverseOnSurface = Color(0xFFECF3E8),
+                error = Color(0xFFBA1A1A),
+                onError = Color(0xFFFFFFFF),
+                errorContainer = Color(0xFFFFDAD6),
+                onErrorContainer = Color(0xFF410002),
+                outline = Color(0xFF6C786A),
+                outlineVariant = Color(0xFFBDCABA),
+                scrim = Color(0xFF000000),
+                surfaceTint = Color(0xFF006E2C),
+                surfaceContainerHighest = Color(0xFFDEE4DA),
+                surfaceContainerHigh = Color(0xFFE4EADF),
+                surfaceContainer = Color(0xFFE9F0E5),
+                surfaceContainerLow = Color(0xFFEFF6EB),
+                surfaceContainerLowest = Color(0xFFFFFFFF),
+                surfaceBright = Color(0xFFF5FBF0),
+                surfaceDim = Color(0xFFD5DCD1)
+            )
 
-        private val DarkCustomColorScheme = darkColorScheme(
-            primary = Color(0xFF6DDD81),
-            onPrimary = Color(0xFF003914),
-            primaryContainer = Color(0xFF008738),
-            onPrimaryContainer = Color(0xFFF7FFF2),
-            inversePrimary = Color(0xFF006E2C),
-            secondary = Color(0xFFA5D2A6),
-            onSecondary = Color(0xFF0F3819),
-            secondaryContainer = Color(0xFF1D4524),
-            onSecondaryContainer = Color(0xFF87B389),
-            tertiary = Color(0xFFA7C8FF),
-            onTertiary = Color(0xFF003061),
-            tertiaryContainer = Color(0xFF0774D9),
-            onTertiaryContainer = Color(0xFFFDFCFF),
-            background = Color(0xFF0F150F),
-            onBackground = Color(0xFFDEE4DA),
-            surface = Color(0xFF0F150F),
-            onSurface = Color(0xFFDEE4DA),
-            surfaceVariant = Color(0xFF3E4A3E),
-            onSurfaceVariant = Color(0xFFBDCABA),
-            inverseSurface = Color(0xFFDEE4DA),
-            inverseOnSurface = Color(0xFF2C322B),
-            error = Color(0xFFFFB4A9),
-            onError = Color(0xFF680003),
-            errorContainer = Color(0xFF930006),
-            onErrorContainer = Color(0xFFFFDAD4),
-            outline = Color(0xFF6C786A),
-            outlineVariant = Color(0xFF3E4A3E),
-            scrim = Color(0xFF000000),
-            surfaceTint = Color(0xFF6DDD81),
-            surfaceContainerHighest = Color(0xFF30362F),
-            surfaceContainerHigh = Color(0xFF252C25),
-            surfaceContainer = Color(0xFF1B211B),
-            surfaceContainerLow = Color(0xFF171D17),
-            surfaceContainerLowest = Color(0xFF0A100A),
-            surfaceBright = Color(0xFF343B34),
-            surfaceDim = Color(0xFF0F150F)
-        )
+        private val DarkCustomColorScheme =
+            darkColorScheme(
+                primary = Color(0xFF6DDD81),
+                onPrimary = Color(0xFF003914),
+                primaryContainer = Color(0xFF008738),
+                onPrimaryContainer = Color(0xFFF7FFF2),
+                inversePrimary = Color(0xFF006E2C),
+                secondary = Color(0xFFA5D2A6),
+                onSecondary = Color(0xFF0F3819),
+                secondaryContainer = Color(0xFF1D4524),
+                onSecondaryContainer = Color(0xFF87B389),
+                tertiary = Color(0xFFA7C8FF),
+                onTertiary = Color(0xFF003061),
+                tertiaryContainer = Color(0xFF0774D9),
+                onTertiaryContainer = Color(0xFFFDFCFF),
+                background = Color(0xFF0F150F),
+                onBackground = Color(0xFFDEE4DA),
+                surface = Color(0xFF0F150F),
+                onSurface = Color(0xFFDEE4DA),
+                surfaceVariant = Color(0xFF3E4A3E),
+                onSurfaceVariant = Color(0xFFBDCABA),
+                inverseSurface = Color(0xFFDEE4DA),
+                inverseOnSurface = Color(0xFF2C322B),
+                error = Color(0xFFFFB4A9),
+                onError = Color(0xFF680003),
+                errorContainer = Color(0xFF930006),
+                onErrorContainer = Color(0xFFFFDAD4),
+                outline = Color(0xFF6C786A),
+                outlineVariant = Color(0xFF3E4A3E),
+                scrim = Color(0xFF000000),
+                surfaceTint = Color(0xFF6DDD81),
+                surfaceContainerHighest = Color(0xFF30362F),
+                surfaceContainerHigh = Color(0xFF252C25),
+                surfaceContainer = Color(0xFF1B211B),
+                surfaceContainerLow = Color(0xFF171D17),
+                surfaceContainerLowest = Color(0xFF0A100A),
+                surfaceBright = Color(0xFF343B34),
+                surfaceDim = Color(0xFF0F150F)
+            )
 
         @Parameterized.Parameters(name = "{0}")
         @JvmStatic
-        fun parameters() = arrayOf(
-            ColorSchemeWrapper("light", lightColorScheme()),
-            ColorSchemeWrapper("light_dynamic", LightCustomColorScheme),
-            ColorSchemeWrapper("dark", darkColorScheme()),
-            ColorSchemeWrapper("dark_dynamic", DarkCustomColorScheme),
-        )
+        fun parameters() =
+            arrayOf(
+                ColorSchemeWrapper("light", lightColorScheme()),
+                ColorSchemeWrapper("light_dynamic", LightCustomColorScheme),
+                ColorSchemeWrapper("dark", darkColorScheme()),
+                ColorSchemeWrapper("dark_dynamic", DarkCustomColorScheme),
+            )
     }
 
     class ColorSchemeWrapper(val name: String, val colorScheme: ColorScheme) {
@@ -182,10 +179,7 @@
     Row(
         modifier = Modifier.padding(8.dp),
     ) {
-        Column(
-            Modifier
-                .weight(1f)
-                .verticalScroll(rememberScrollState())) {
+        Column(Modifier.weight(1f).verticalScroll(rememberScrollState())) {
             Text("Surfaces", style = MaterialTheme.typography.bodyLarge)
             Spacer(modifier = Modifier.height(16.dp))
             SurfaceColorSwatch(
@@ -292,10 +286,7 @@
             Spacer(modifier = Modifier.height(16.dp))
         }
         Spacer(modifier = Modifier.width(24.dp))
-        Column(
-            Modifier
-                .weight(1f)
-                .verticalScroll(rememberScrollState())) {
+        Column(Modifier.weight(1f).verticalScroll(rememberScrollState())) {
             Text("Content", style = MaterialTheme.typography.bodyLarge)
             ContentColorSwatch(
                 color = colorScheme.primary,
@@ -305,7 +296,8 @@
                 colorContainer = colorScheme.primaryContainer,
                 colorContainerText = "Primary Container",
                 onColorContainer = colorScheme.onPrimaryContainer,
-                onColorContainerText = "On Primary Container")
+                onColorContainerText = "On Primary Container"
+            )
             Spacer(modifier = Modifier.height(16.dp))
             ContentColorSwatch(
                 color = colorScheme.secondary,
@@ -315,7 +307,8 @@
                 colorContainer = colorScheme.secondaryContainer,
                 colorContainerText = "Secondary Container",
                 onColorContainer = colorScheme.onSecondaryContainer,
-                onColorContainerText = "On Secondary Container")
+                onColorContainerText = "On Secondary Container"
+            )
             Spacer(modifier = Modifier.height(16.dp))
             ContentColorSwatch(
                 color = colorScheme.tertiary,
@@ -325,7 +318,8 @@
                 colorContainer = colorScheme.tertiaryContainer,
                 colorContainerText = "Tertiary Container",
                 onColorContainer = colorScheme.onTertiaryContainer,
-                onColorContainerText = "On Tertiary Container")
+                onColorContainerText = "On Tertiary Container"
+            )
             Spacer(modifier = Modifier.height(16.dp))
             ContentColorSwatch(
                 color = colorScheme.error,
@@ -335,7 +329,8 @@
                 colorContainer = colorScheme.errorContainer,
                 colorContainerText = "Error Container",
                 onColorContainer = colorScheme.onErrorContainer,
-                onColorContainerText = "On Error Container")
+                onColorContainerText = "On Error Container"
+            )
             Spacer(modifier = Modifier.height(16.dp))
             Text("Utility", style = MaterialTheme.typography.bodyLarge)
             DoubleTile(
@@ -385,12 +380,7 @@
     onColorContainerText: String,
 ) {
     DoubleTile(
-        leftTile = {
-            ColorTile(
-                text = colorText,
-                color = color
-            )
-        },
+        leftTile = { ColorTile(text = colorText, color = color) },
         rightTile = {
             ColorTile(
                 text = onColorText,
@@ -432,9 +422,7 @@
     } else if (color == Color.White) borderColor = Color.Black
 
     Surface(
-        modifier = Modifier
-            .height(48.dp)
-            .fillMaxWidth(),
+        modifier = Modifier.height(48.dp).fillMaxWidth(),
         color = color,
         border = BorderStroke(1.dp, borderColor),
     ) {
@@ -442,9 +430,9 @@
             text,
             Modifier.padding(4.dp),
             style =
-            MaterialTheme.typography.bodyMedium.copy(
-                if (color.luminance() < .25) Color.White else Color.Black
-            )
+                MaterialTheme.typography.bodyMedium.copy(
+                    if (color.luminance() < .25) Color.White else Color.Black
+                )
         )
     }
 }
diff --git a/compose/material3/material3/src/androidInstrumentedTest/kotlin/androidx/compose/material3/ColorSchemeTest.kt b/compose/material3/material3/src/androidInstrumentedTest/kotlin/androidx/compose/material3/ColorSchemeTest.kt
index b372bc0..bea890f 100644
--- a/compose/material3/material3/src/androidInstrumentedTest/kotlin/androidx/compose/material3/ColorSchemeTest.kt
+++ b/compose/material3/material3/src/androidInstrumentedTest/kotlin/androidx/compose/material3/ColorSchemeTest.kt
@@ -30,8 +30,7 @@
 @RunWith(AndroidJUnit4::class)
 class ColorSchemeTest {
 
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
     /**
      * Test for switching between provided [ColorScheme]s, ensuring that the existing colors objects
@@ -86,8 +85,8 @@
 }
 
 /**
- * [ColorScheme] is @Stable, so by contract it doesn't have equals implemented. And since it creates a
- * new Colors object to mutate internally, we can't compare references. Instead we compare the
+ * [ColorScheme] is @Stable, so by contract it doesn't have equals implemented. And since it creates
+ * a new Colors object to mutate internally, we can't compare references. Instead we compare the
  * properties to make sure that the properties are equal.
  *
  * @return true if all the properties inside [this] are equal to those in [other], false otherwise.
diff --git a/compose/material3/material3/src/androidInstrumentedTest/kotlin/androidx/compose/material3/DateInputScreenshotTest.kt b/compose/material3/material3/src/androidInstrumentedTest/kotlin/androidx/compose/material3/DateInputScreenshotTest.kt
index 7eccc03..51504a6 100644
--- a/compose/material3/material3/src/androidInstrumentedTest/kotlin/androidx/compose/material3/DateInputScreenshotTest.kt
+++ b/compose/material3/material3/src/androidInstrumentedTest/kotlin/androidx/compose/material3/DateInputScreenshotTest.kt
@@ -44,11 +44,9 @@
 @OptIn(ExperimentalMaterial3Api::class)
 class DateInputScreenshotTest(private val scheme: ColorSchemeWrapper) {
 
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
-    @get:Rule
-    val screenshotRule = AndroidXScreenshotTestRule(GOLDEN_MATERIAL3)
+    @get:Rule val screenshotRule = AndroidXScreenshotTestRule(GOLDEN_MATERIAL3)
 
     private val wrap = Modifier.wrapContentSize(Alignment.Center)
     private val wrapperTestTag = "dateInputWrapper"
@@ -70,9 +68,7 @@
     fun dateInput_withModeToggle() {
         rule.setMaterialContent(scheme.colorScheme) {
             Box(wrap.testTag(wrapperTestTag)) {
-                DatePicker(
-                    state = rememberDatePickerState(initialDisplayMode = DisplayMode.Input)
-                )
+                DatePicker(state = rememberDatePickerState(initialDisplayMode = DisplayMode.Input))
             }
         }
         assertAgainstGolden("dateInput_withModeToggle_${scheme.name}")
@@ -84,10 +80,11 @@
             Box(wrap.testTag(wrapperTestTag)) {
                 val dayMillis = dayInUtcMilliseconds(year = 2021, month = 3, dayOfMonth = 6)
                 DatePicker(
-                    state = rememberDatePickerState(
-                        initialSelectedDateMillis = dayMillis,
-                        initialDisplayMode = DisplayMode.Input
-                    ),
+                    state =
+                        rememberDatePickerState(
+                            initialSelectedDateMillis = dayMillis,
+                            initialDisplayMode = DisplayMode.Input
+                        ),
                     showModeToggle = false
                 )
             }
@@ -101,14 +98,17 @@
             Box(wrap.testTag(wrapperTestTag)) {
                 val monthInUtcMillis = dayInUtcMilliseconds(year = 2000, month = 6, dayOfMonth = 1)
                 DatePicker(
-                    state = rememberDatePickerState(
-                        initialDisplayedMonthMillis = monthInUtcMillis,
-                        initialDisplayMode = DisplayMode.Input,
-                        selectableDates = object : SelectableDates {
-                            // All dates are invalid for the sake of this test.
-                            override fun isSelectableDate(utcTimeMillis: Long): Boolean = false
-                        }
-                    ),
+                    state =
+                        rememberDatePickerState(
+                            initialDisplayedMonthMillis = monthInUtcMillis,
+                            initialDisplayMode = DisplayMode.Input,
+                            selectableDates =
+                                object : SelectableDates {
+                                    // All dates are invalid for the sake of this test.
+                                    override fun isSelectableDate(utcTimeMillis: Long): Boolean =
+                                        false
+                                }
+                        ),
                     showModeToggle = false
                 )
             }
@@ -121,20 +121,22 @@
         rule.setMaterialContent(scheme.colorScheme) {
             val selectedDayMillis = dayInUtcMilliseconds(year = 2021, month = 3, dayOfMonth = 6)
             DatePickerDialog(
-                onDismissRequest = { },
+                onDismissRequest = {},
                 confirmButton = { TextButton(onClick = {}) { Text("OK") } },
                 dismissButton = { TextButton(onClick = {}) { Text("Cancel") } }
             ) {
                 DatePicker(
-                    state = rememberDatePickerState(
-                        initialSelectedDateMillis = selectedDayMillis,
-                        initialDisplayMode = DisplayMode.Input
-                    ),
+                    state =
+                        rememberDatePickerState(
+                            initialSelectedDateMillis = selectedDayMillis,
+                            initialDisplayMode = DisplayMode.Input
+                        ),
                     showModeToggle = false
                 )
             }
         }
-        rule.onNode(isDialog())
+        rule
+            .onNode(isDialog())
             .captureToImage()
             .assertAgainstGolden(
                 rule = screenshotRule,
@@ -152,7 +154,8 @@
             .toEpochMilli()
 
     private fun assertAgainstGolden(goldenName: String) {
-        rule.onNodeWithTag(wrapperTestTag)
+        rule
+            .onNodeWithTag(wrapperTestTag)
             .captureToImage()
             .assertAgainstGolden(screenshotRule, goldenName)
     }
@@ -163,10 +166,11 @@
     companion object {
         @Parameterized.Parameters(name = "{0}")
         @JvmStatic
-        fun parameters() = arrayOf(
-            ColorSchemeWrapper("lightTheme", lightColorScheme()),
-            ColorSchemeWrapper("darkTheme", darkColorScheme()),
-        )
+        fun parameters() =
+            arrayOf(
+                ColorSchemeWrapper("lightTheme", lightColorScheme()),
+                ColorSchemeWrapper("darkTheme", darkColorScheme()),
+            )
     }
 
     class ColorSchemeWrapper(val name: String, val colorScheme: ColorScheme) {
diff --git a/compose/material3/material3/src/androidInstrumentedTest/kotlin/androidx/compose/material3/DateInputTest.kt b/compose/material3/material3/src/androidInstrumentedTest/kotlin/androidx/compose/material3/DateInputTest.kt
index 423bb04..684621e 100644
--- a/compose/material3/material3/src/androidInstrumentedTest/kotlin/androidx/compose/material3/DateInputTest.kt
+++ b/compose/material3/material3/src/androidInstrumentedTest/kotlin/androidx/compose/material3/DateInputTest.kt
@@ -45,8 +45,7 @@
 @OptIn(ExperimentalMaterial3Api::class)
 class DateInputTest {
 
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
     @Test
     fun dateInput() {
@@ -57,10 +56,11 @@
             defaultHeadline = getString(string = Strings.DateInputHeadline)
             dateInputLabel = getString(string = Strings.DateInputLabel)
             val monthInUtcMillis = dayInUtcMilliseconds(year = 2019, month = 1, dayOfMonth = 1)
-            state = rememberDatePickerState(
-                initialDisplayedMonthMillis = monthInUtcMillis,
-                initialDisplayMode = DisplayMode.Input
-            )
+            state =
+                rememberDatePickerState(
+                    initialDisplayedMonthMillis = monthInUtcMillis,
+                    initialDisplayMode = DisplayMode.Input
+                )
             DatePicker(state = state)
         }
 
@@ -70,13 +70,8 @@
         rule.onNodeWithText(dateInputLabel).performClick().performTextInput("01272019")
 
         rule.runOnIdle {
-            assertThat(state.selectedDateMillis).isEqualTo(
-                dayInUtcMilliseconds(
-                    year = 2019,
-                    month = 1,
-                    dayOfMonth = 27
-                )
-            )
+            assertThat(state.selectedDateMillis)
+                .isEqualTo(dayInUtcMilliseconds(year = 2019, month = 1, dayOfMonth = 27))
         }
 
         rule.onNodeWithText(defaultHeadline).assertDoesNotExist()
@@ -88,10 +83,11 @@
         lateinit var state: DatePickerState
         rule.setMaterialContent(lightColorScheme()) {
             val initialDateMillis = dayInUtcMilliseconds(year = 2010, month = 5, dayOfMonth = 11)
-            state = rememberDatePickerState(
-                initialSelectedDateMillis = initialDateMillis,
-                initialDisplayMode = DisplayMode.Input
-            )
+            state =
+                rememberDatePickerState(
+                    initialSelectedDateMillis = initialDateMillis,
+                    initialDisplayMode = DisplayMode.Input
+                )
             DatePicker(state = state)
         }
 
@@ -107,28 +103,25 @@
         rule.setMaterialContent(lightColorScheme()) {
             dateInputLabel = getString(string = Strings.DateInputLabel)
             errorMessage = getString(string = Strings.DateInputInvalidNotAllowed)
-            state = rememberDatePickerState(
-                initialDisplayMode = DisplayMode.Input,
-                selectableDates = object : SelectableDates {
-                    // All dates are invalid for the sake of this test.
-                    override fun isSelectableDate(utcTimeMillis: Long): Boolean = false
-                })
+            state =
+                rememberDatePickerState(
+                    initialDisplayMode = DisplayMode.Input,
+                    selectableDates =
+                        object : SelectableDates {
+                            // All dates are invalid for the sake of this test.
+                            override fun isSelectableDate(utcTimeMillis: Long): Boolean = false
+                        }
+                )
             DatePicker(state = state)
         }
 
         rule.onNodeWithText(dateInputLabel).performClick().performTextInput("02272020")
 
-        rule.runOnIdle {
-            assertThat(state.selectedDateMillis).isNull()
-        }
-        rule.onNodeWithText("02/27/2020")
+        rule.runOnIdle { assertThat(state.selectedDateMillis).isNull() }
+        rule
+            .onNodeWithText("02/27/2020")
             .assert(keyIsDefined(SemanticsProperties.Error))
-            .assert(
-                expectValue(
-                    SemanticsProperties.Error,
-                    errorMessage.format("Feb 27, 2020")
-                )
-            )
+            .assert(expectValue(SemanticsProperties.Error, errorMessage.format("Feb 27, 2020")))
     }
 
     @Test
@@ -139,28 +132,25 @@
         rule.setMaterialContent(lightColorScheme()) {
             dateInputLabel = getString(string = Strings.DateInputLabel)
             errorMessage = getString(string = Strings.DateInputInvalidYearRange)
-            state = rememberDatePickerState(
-                // Limit the years selection to 2018-2023
-                yearRange = IntRange(2018, 2023),
-                initialDisplayMode = DisplayMode.Input
-            )
+            state =
+                rememberDatePickerState(
+                    // Limit the years selection to 2018-2023
+                    yearRange = IntRange(2018, 2023),
+                    initialDisplayMode = DisplayMode.Input
+                )
             DatePicker(state = state)
         }
 
         rule.onNodeWithText(dateInputLabel).performClick().performTextInput("02272030")
 
-        rule.runOnIdle {
-            assertThat(state.selectedDateMillis).isNull()
-        }
-        rule.onNodeWithText("02/27/2030")
+        rule.runOnIdle { assertThat(state.selectedDateMillis).isNull() }
+        rule
+            .onNodeWithText("02/27/2030")
             .assert(keyIsDefined(SemanticsProperties.Error))
             .assert(
                 expectValue(
                     SemanticsProperties.Error,
-                    errorMessage.format(
-                        state.yearRange.first,
-                        state.yearRange.last
-                    )
+                    errorMessage.format(state.yearRange.first, state.yearRange.last)
                 )
             )
     }
@@ -180,10 +170,9 @@
 
         rule.onNodeWithText(dateInputLabel).performClick().performTextInput("99272030")
 
-        rule.runOnIdle {
-            assertThat(state.selectedDateMillis).isNull()
-        }
-        rule.onNodeWithText("99/27/2030")
+        rule.runOnIdle { assertThat(state.selectedDateMillis).isNull() }
+        rule
+            .onNodeWithText("99/27/2030")
             .assert(keyIsDefined(SemanticsProperties.Error))
             .assert(expectValue(SemanticsProperties.Error, errorMessage))
     }
@@ -202,9 +191,11 @@
         rule.onNodeWithContentDescription(label = switchToPickerDescription).performClick()
 
         rule.waitForIdle()
-        rule.onNodeWithContentDescription(label = "next", substring = true, ignoreCase = true)
+        rule
+            .onNodeWithContentDescription(label = "next", substring = true, ignoreCase = true)
             .assertIsDisplayed()
-        rule.onNodeWithContentDescription(label = "previous", substring = true, ignoreCase = true)
+        rule
+            .onNodeWithContentDescription(label = "previous", substring = true, ignoreCase = true)
             .assertIsDisplayed()
         rule.onNodeWithText(dateInputLabel).assertDoesNotExist()
     }
@@ -217,21 +208,24 @@
             // e.g. "Entered date: %1$s"
             expectedHeadlineStringFormat = getString(Strings.DateInputHeadlineDescription)
             DatePicker(
-                state = rememberDatePickerState(
-                    initialSelectedDateMillis = selectedDateInUtcMillis,
-                    initialDisplayMode = DisplayMode.Input
-                )
+                state =
+                    rememberDatePickerState(
+                        initialSelectedDateMillis = selectedDateInUtcMillis,
+                        initialDisplayMode = DisplayMode.Input
+                    )
             )
         }
 
-        val fullDateDescription = formatWithSkeleton(
-            selectedDateInUtcMillis,
-            DatePickerDefaults.YearMonthWeekdayDaySkeleton,
-            Locale.US,
-            cache = mutableMapOf()
-        )
+        val fullDateDescription =
+            formatWithSkeleton(
+                selectedDateInUtcMillis,
+                DatePickerDefaults.YearMonthWeekdayDaySkeleton,
+                Locale.US,
+                cache = mutableMapOf()
+            )
 
-        rule.onNodeWithText("May 11, 2010")
+        rule
+            .onNodeWithText("May 11, 2010")
             .assertContentDescriptionEquals(
                 expectedHeadlineStringFormat.format(fullDateDescription)
             )
diff --git a/compose/material3/material3/src/androidInstrumentedTest/kotlin/androidx/compose/material3/DatePickerScreenshotTest.kt b/compose/material3/material3/src/androidInstrumentedTest/kotlin/androidx/compose/material3/DatePickerScreenshotTest.kt
index 59a1cff..c0565c4 100644
--- a/compose/material3/material3/src/androidInstrumentedTest/kotlin/androidx/compose/material3/DatePickerScreenshotTest.kt
+++ b/compose/material3/material3/src/androidInstrumentedTest/kotlin/androidx/compose/material3/DatePickerScreenshotTest.kt
@@ -46,11 +46,9 @@
 @OptIn(ExperimentalMaterial3Api::class)
 class DatePickerScreenshotTest(private val scheme: ColorSchemeWrapper) {
 
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
-    @get:Rule
-    val screenshotRule = AndroidXScreenshotTestRule(GOLDEN_MATERIAL3)
+    @get:Rule val screenshotRule = AndroidXScreenshotTestRule(GOLDEN_MATERIAL3)
 
     private val wrap = Modifier.wrapContentSize(Alignment.Center)
     private val wrapperTestTag = "datePickerWrapper"
@@ -61,9 +59,7 @@
             Box(wrap.testTag(wrapperTestTag)) {
                 val monthInUtcMillis = dayInUtcMilliseconds(year = 2021, month = 1, dayOfMonth = 1)
                 DatePicker(
-                    state = rememberDatePickerState(
-                        initialDisplayedMonthMillis = monthInUtcMillis
-                    ),
+                    state = rememberDatePickerState(initialDisplayedMonthMillis = monthInUtcMillis),
                     showModeToggle = false
                 )
             }
@@ -77,9 +73,7 @@
             Box(wrap.testTag(wrapperTestTag)) {
                 val monthInUtcMillis = dayInUtcMilliseconds(year = 2021, month = 1, dayOfMonth = 1)
                 DatePicker(
-                    state = rememberDatePickerState(
-                        initialDisplayedMonthMillis = monthInUtcMillis
-                    )
+                    state = rememberDatePickerState(initialDisplayedMonthMillis = monthInUtcMillis)
                 )
             }
         }
@@ -93,10 +87,11 @@
                 val monthInUtcMillis = dayInUtcMilliseconds(year = 2021, month = 3, dayOfMonth = 1)
                 val selectedDayMillis = dayInUtcMilliseconds(year = 2021, month = 3, dayOfMonth = 6)
                 DatePicker(
-                    state = rememberDatePickerState(
-                        initialDisplayedMonthMillis = monthInUtcMillis,
-                        initialSelectedDateMillis = selectedDayMillis
-                    ),
+                    state =
+                        rememberDatePickerState(
+                            initialDisplayedMonthMillis = monthInUtcMillis,
+                            initialSelectedDateMillis = selectedDayMillis
+                        ),
                     showModeToggle = false
                 )
             }
@@ -110,13 +105,16 @@
             Box(wrap.testTag(wrapperTestTag)) {
                 val monthInUtcMillis = dayInUtcMilliseconds(year = 2000, month = 6, dayOfMonth = 1)
                 DatePicker(
-                    state = rememberDatePickerState(
-                        initialDisplayedMonthMillis = monthInUtcMillis,
-                        selectableDates = object : SelectableDates {
-                            // All dates are invalid for the sake of this test.
-                            override fun isSelectableDate(utcTimeMillis: Long): Boolean = false
-                        }
-                    ),
+                    state =
+                        rememberDatePickerState(
+                            initialDisplayedMonthMillis = monthInUtcMillis,
+                            selectableDates =
+                                object : SelectableDates {
+                                    // All dates are invalid for the sake of this test.
+                                    override fun isSelectableDate(utcTimeMillis: Long): Boolean =
+                                        false
+                                }
+                        ),
                     showModeToggle = false
                 )
             }
@@ -130,9 +128,7 @@
             Box(wrap.testTag(wrapperTestTag)) {
                 val monthInUtcMillis = dayInUtcMilliseconds(year = 2000, month = 5, dayOfMonth = 1)
                 DatePicker(
-                    state = rememberDatePickerState(
-                        initialDisplayedMonthMillis = monthInUtcMillis
-                    ),
+                    state = rememberDatePickerState(initialDisplayedMonthMillis = monthInUtcMillis),
                     showModeToggle = false
                 )
             }
@@ -148,20 +144,22 @@
             val monthInUtcMillis = dayInUtcMilliseconds(year = 2021, month = 3, dayOfMonth = 1)
             val selectedDayMillis = dayInUtcMilliseconds(year = 2021, month = 3, dayOfMonth = 6)
             DatePickerDialog(
-                onDismissRequest = { },
+                onDismissRequest = {},
                 confirmButton = { TextButton(onClick = {}) { Text("OK") } },
                 dismissButton = { TextButton(onClick = {}) { Text("Cancel") } }
             ) {
                 DatePicker(
-                    state = rememberDatePickerState(
-                        initialDisplayedMonthMillis = monthInUtcMillis,
-                        initialSelectedDateMillis = selectedDayMillis
-                    ),
+                    state =
+                        rememberDatePickerState(
+                            initialDisplayedMonthMillis = monthInUtcMillis,
+                            initialSelectedDateMillis = selectedDayMillis
+                        ),
                     showModeToggle = false
                 )
             }
         }
-        rule.onNode(isDialog())
+        rule
+            .onNode(isDialog())
             .captureToImage()
             .assertAgainstGolden(
                 rule = screenshotRule,
@@ -180,7 +178,8 @@
 
     private fun assertAgainstGolden(goldenName: String) {
         // TODO: replace with find(isToggeable()) after b/157687898 is fixed
-        rule.onNodeWithTag(wrapperTestTag)
+        rule
+            .onNodeWithTag(wrapperTestTag)
             .captureToImage()
             .assertAgainstGolden(screenshotRule, goldenName)
     }
@@ -191,10 +190,11 @@
     companion object {
         @Parameterized.Parameters(name = "{0}")
         @JvmStatic
-        fun parameters() = arrayOf(
-            ColorSchemeWrapper("lightTheme", lightColorScheme()),
-            ColorSchemeWrapper("darkTheme", darkColorScheme()),
-        )
+        fun parameters() =
+            arrayOf(
+                ColorSchemeWrapper("lightTheme", lightColorScheme()),
+                ColorSchemeWrapper("darkTheme", darkColorScheme()),
+            )
     }
 
     class ColorSchemeWrapper(val name: String, val colorScheme: ColorScheme) {
diff --git a/compose/material3/material3/src/androidInstrumentedTest/kotlin/androidx/compose/material3/DatePickerTest.kt b/compose/material3/material3/src/androidInstrumentedTest/kotlin/androidx/compose/material3/DatePickerTest.kt
index 3c5334a..cc11913 100644
--- a/compose/material3/material3/src/androidInstrumentedTest/kotlin/androidx/compose/material3/DatePickerTest.kt
+++ b/compose/material3/material3/src/androidInstrumentedTest/kotlin/androidx/compose/material3/DatePickerTest.kt
@@ -59,8 +59,7 @@
 @OptIn(ExperimentalMaterial3Api::class)
 class DatePickerTest {
 
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
     @Test
     fun dateSelectionWithInitialDate() {
@@ -68,10 +67,11 @@
         rule.setMaterialContent(lightColorScheme()) {
             val initialDateMillis = dayInUtcMilliseconds(year = 2010, month = 5, dayOfMonth = 11)
             val monthInUtcMillis = dayInUtcMilliseconds(year = 2010, month = 5, dayOfMonth = 1)
-            datePickerState = rememberDatePickerState(
-                initialSelectedDateMillis = initialDateMillis,
-                initialDisplayedMonthMillis = monthInUtcMillis
-            )
+            datePickerState =
+                rememberDatePickerState(
+                    initialSelectedDateMillis = initialDateMillis,
+                    initialDisplayedMonthMillis = monthInUtcMillis
+                )
             DatePicker(state = datePickerState)
         }
 
@@ -87,9 +87,8 @@
         rule.setMaterialContent(lightColorScheme()) {
             defaultHeadline = getString(string = Strings.DatePickerHeadline)
             val monthInUtcMillis = dayInUtcMilliseconds(year = 2019, month = 1, dayOfMonth = 1)
-            datePickerState = rememberDatePickerState(
-                initialDisplayedMonthMillis = monthInUtcMillis
-            )
+            datePickerState =
+                rememberDatePickerState(initialDisplayedMonthMillis = monthInUtcMillis)
             DatePicker(state = datePickerState)
         }
 
@@ -100,19 +99,13 @@
         rule.onNode(hasText("27", substring = true) and hasClickAction()).performClick()
 
         rule.runOnIdle {
-            assertThat(datePickerState.selectedDateMillis).isEqualTo(
-                dayInUtcMilliseconds(
-                    year = 2019,
-                    month = 1,
-                    dayOfMonth = 27
-                )
-            )
+            assertThat(datePickerState.selectedDateMillis)
+                .isEqualTo(dayInUtcMilliseconds(year = 2019, month = 1, dayOfMonth = 27))
         }
 
         rule.onNodeWithText(defaultHeadline).assertDoesNotExist()
         rule.onNodeWithText("Jan 27, 2019").assertExists()
-        rule.onNode(hasText("27", substring = true) and hasClickAction())
-            .assertIsSelected()
+        rule.onNode(hasText("27", substring = true) and hasClickAction()).assertIsSelected()
     }
 
     @Test
@@ -122,13 +115,15 @@
         rule.setMaterialContent(lightColorScheme()) {
             defaultHeadline = getString(string = Strings.DatePickerHeadline)
             val monthInUtcMillis = dayInUtcMilliseconds(year = 2019, month = 1, dayOfMonth = 1)
-            datePickerState = rememberDatePickerState(
-                initialDisplayedMonthMillis = monthInUtcMillis,
-                selectableDates = object : SelectableDates {
-                    // All dates are invalid for the sake of this test.
-                    override fun isSelectableDate(utcTimeMillis: Long): Boolean = false
-                }
-            )
+            datePickerState =
+                rememberDatePickerState(
+                    initialDisplayedMonthMillis = monthInUtcMillis,
+                    selectableDates =
+                        object : SelectableDates {
+                            // All dates are invalid for the sake of this test.
+                            override fun isSelectableDate(utcTimeMillis: Long): Boolean = false
+                        }
+                )
             DatePicker(state = datePickerState)
         }
 
@@ -137,9 +132,7 @@
         // Select the 27th day of the displayed month.
         rule.onNode(hasText("27", substring = true) and hasClickAction()).performClick()
 
-        rule.runOnIdle {
-            assertThat(datePickerState.selectedDateMillis).isNull()
-        }
+        rule.runOnIdle { assertThat(datePickerState.selectedDateMillis).isNull() }
 
         rule.onNodeWithText(defaultHeadline).assertExists()
     }
@@ -151,13 +144,15 @@
         rule.setMaterialContent(lightColorScheme()) {
             yearDescriptionFormat = getString(string = Strings.DatePickerNavigateToYearDescription)
             val monthInUtcMillis = dayInUtcMilliseconds(year = 2019, month = 1, dayOfMonth = 1)
-            datePickerState = rememberDatePickerState(
-                initialDisplayedMonthMillis = monthInUtcMillis,
-                selectableDates = object : SelectableDates {
-                    // All years are invalid for the sake of this test.
-                    override fun isSelectableYear(year: Int): Boolean = false
-                }
-            )
+            datePickerState =
+                rememberDatePickerState(
+                    initialDisplayedMonthMillis = monthInUtcMillis,
+                    selectableDates =
+                        object : SelectableDates {
+                            // All years are invalid for the sake of this test.
+                            override fun isSelectableYear(year: Int): Boolean = false
+                        }
+                )
             DatePicker(state = datePickerState)
         }
 
@@ -175,9 +170,8 @@
         lateinit var navigateToYearFormat: String
         rule.setMaterialContent(lightColorScheme()) {
             val monthInUtcMillis = dayInUtcMilliseconds(year = 2019, month = 1, dayOfMonth = 1)
-            datePickerState = rememberDatePickerState(
-                initialDisplayedMonthMillis = monthInUtcMillis
-            )
+            datePickerState =
+                rememberDatePickerState(initialDisplayedMonthMillis = monthInUtcMillis)
             navigateToYearFormat = getString(string = Strings.DatePickerNavigateToYearDescription)
             DatePicker(state = datePickerState)
         }
@@ -186,18 +180,14 @@
         rule.onNodeWithText(navigateToYearFormat.format(2019)).assertIsSelected()
         rule.onNodeWithText(navigateToYearFormat.format(2020)).performClick()
         // Select the 15th day of the displayed month in 2020.
-        rule.onAllNodes(hasText("15", substring = true) and hasClickAction())
+        rule
+            .onAllNodes(hasText("15", substring = true) and hasClickAction())
             .onFirst()
             .performClick()
 
         rule.runOnIdle {
-            assertThat(datePickerState.selectedDateMillis).isEqualTo(
-                dayInUtcMilliseconds(
-                    year = 2020,
-                    month = 1,
-                    dayOfMonth = 15
-                )
-            )
+            assertThat(datePickerState.selectedDateMillis)
+                .isEqualTo(dayInUtcMilliseconds(year = 2020, month = 1, dayOfMonth = 15))
         }
 
         // Check that if the years are opened again, the last selected year is still marked as such
@@ -213,11 +203,12 @@
             val monthInUtcMillis = dayInUtcMilliseconds(year = 2019, month = 1, dayOfMonth = 1)
             navigateToYearFormat = getString(string = Strings.DatePickerNavigateToYearDescription)
             DatePicker(
-                state = rememberDatePickerState(
-                    initialDisplayedMonthMillis = monthInUtcMillis,
-                    // Limit the years selection to 2018-2023
-                    yearRange = IntRange(2018, 2023)
-                )
+                state =
+                    rememberDatePickerState(
+                        initialDisplayedMonthMillis = monthInUtcMillis,
+                        // Limit the years selection to 2018-2023
+                        yearRange = IntRange(2018, 2023)
+                    )
             )
         }
 
@@ -234,15 +225,14 @@
         rule.setMaterialContent(lightColorScheme()) {
             val monthInUtcMillis = dayInUtcMilliseconds(year = 2018, month = 1, dayOfMonth = 1)
             DatePicker(
-                state = rememberDatePickerState(
-                    initialDisplayedMonthMillis = monthInUtcMillis
-                )
+                state = rememberDatePickerState(initialDisplayedMonthMillis = monthInUtcMillis)
             )
         }
 
         rule.onNodeWithText("January 2018").assertExists()
         // Click the next month arrow button
-        rule.onNodeWithContentDescription(label = "next", substring = true, ignoreCase = true)
+        rule
+            .onNodeWithContentDescription(label = "next", substring = true, ignoreCase = true)
             .performClick()
         rule.waitForIdle()
 
@@ -251,7 +241,8 @@
         rule.onNodeWithText("January 2018").assertDoesNotExist()
 
         // Click the previous month arrow button
-        rule.onNodeWithContentDescription(label = "previous", substring = true, ignoreCase = true)
+        rule
+            .onNodeWithContentDescription(label = "previous", substring = true, ignoreCase = true)
             .performClick()
         rule.waitForIdle()
 
@@ -265,11 +256,12 @@
         rule.setMaterialContent(lightColorScheme()) {
             val monthInUtcMillis = dayInUtcMilliseconds(year = 2018, month = 1, dayOfMonth = 1)
             DatePicker(
-                state = rememberDatePickerState(
-                    initialDisplayedMonthMillis = monthInUtcMillis,
-                    // Limit the years to just 2018
-                    yearRange = IntRange(2018, 2018)
-                )
+                state =
+                    rememberDatePickerState(
+                        initialDisplayedMonthMillis = monthInUtcMillis,
+                        // Limit the years to just 2018
+                        yearRange = IntRange(2018, 2018)
+                    )
             )
         }
 
@@ -277,11 +269,12 @@
         val nextMonthButton =
             rule.onNodeWithContentDescription(label = "next", substring = true, ignoreCase = true)
         nextMonthButton.assertIsEnabled()
-        val previousMonthButton = rule.onNodeWithContentDescription(
-            label = "previous",
-            substring = true,
-            ignoreCase = true
-        )
+        val previousMonthButton =
+            rule.onNodeWithContentDescription(
+                label = "previous",
+                substring = true,
+                ignoreCase = true
+            )
         previousMonthButton.assertIsNotEnabled()
 
         // Click 11 times next and assert that we can only click previous.
@@ -307,9 +300,11 @@
 
         rule.waitForIdle()
         rule.onNodeWithText(dateInputLabel).assertIsDisplayed()
-        rule.onNodeWithContentDescription(label = "next", substring = true, ignoreCase = true)
+        rule
+            .onNodeWithContentDescription(label = "next", substring = true, ignoreCase = true)
             .assertDoesNotExist()
-        rule.onNodeWithContentDescription(label = "previous", substring = true, ignoreCase = true)
+        rule
+            .onNodeWithContentDescription(label = "previous", substring = true, ignoreCase = true)
             .assertDoesNotExist()
     }
 
@@ -320,39 +315,37 @@
         rule.setMaterialContent(lightColorScheme()) {
             DatePicker(
                 modifier = Modifier.testTag("datePicker"),
-                state = rememberDatePickerState(
-                    initialSelectedDateMillis = day,
-                    yearRange = IntRange(2016, 2019)
-                )
+                state =
+                    rememberDatePickerState(
+                        initialSelectedDateMillis = day,
+                        yearRange = IntRange(2016, 2019)
+                    )
             )
         }
 
         rule.onAllNodes(hasText("Feb", substring = true)).assertCountEquals(0)
 
-        rule.onNodeWithTag("datePicker").performTouchInput {
-            swipeLeft(center.x, centerLeft.x)
-        }
+        rule.onNodeWithTag("datePicker").performTouchInput { swipeLeft(center.x, centerLeft.x) }
 
-        rule.onAllNodes(hasText("Feb", substring = true))
-            .onFirst()
-            .assertIsDisplayed()
+        rule.onAllNodes(hasText("Feb", substring = true)).onFirst().assertIsDisplayed()
     }
 
     @Test
     fun state_initWithoutRemember() {
-        val datePickerState = DatePickerState(
-            locale = Locale.getDefault(),
-            initialSelectedDateMillis = 1649721600000L // 04/12/2022
-        )
+        val datePickerState =
+            DatePickerState(
+                locale = Locale.getDefault(),
+                initialSelectedDateMillis = 1649721600000L // 04/12/2022
+            )
         with(datePickerState) {
             assertThat(selectedDateMillis).isEqualTo(1649721600000L)
             // Using the JVM Locale.getDefault() for testing purposes only.
-            assertThat(displayedMonthMillis).isEqualTo(
-                createCalendarModel(Locale.getDefault()).getMonth(
-                    year = 2022,
-                    month = 4
-                ).startUtcTimeMillis
-            )
+            assertThat(displayedMonthMillis)
+                .isEqualTo(
+                    createCalendarModel(Locale.getDefault())
+                        .getMonth(year = 2022, month = 4)
+                        .startUtcTimeMillis
+                )
         }
     }
 
@@ -366,12 +359,12 @@
         with(datePickerState) {
             assertThat(selectedDateMillis).isEqualTo(1649721600000L)
             // Using the JVM Locale.getDefault() for testing purposes only.
-            assertThat(displayedMonthMillis).isEqualTo(
-                createCalendarModel(Locale.getDefault()).getMonth(
-                    year = 2022,
-                    month = 4
-                ).startUtcTimeMillis
-            )
+            assertThat(displayedMonthMillis)
+                .isEqualTo(
+                    createCalendarModel(Locale.getDefault())
+                        .getMonth(year = 2022, month = 4)
+                        .startUtcTimeMillis
+                )
         }
     }
 
@@ -387,12 +380,12 @@
             // Assert that the actual selectedDateMillis was rounded down to the start of day
             // timestamp
             assertThat(selectedDateMillis).isEqualTo(1649721600000L)
-            assertThat(displayedMonthMillis).isEqualTo(
-                createCalendarModel(Locale.getDefault()).getMonth(
-                    year = 2022,
-                    month = 4
-                ).startUtcTimeMillis
-            )
+            assertThat(displayedMonthMillis)
+                .isEqualTo(
+                    createCalendarModel(Locale.getDefault())
+                        .getMonth(year = 2022, month = 4)
+                        .startUtcTimeMillis
+                )
         }
     }
 
@@ -401,10 +394,11 @@
         lateinit var datePickerState: DatePickerState
         rule.setMaterialContent(lightColorScheme()) {
             // 04/12/2022
-            datePickerState = rememberDatePickerState(
-                initialSelectedDateMillis = 1649721600000L,
-                initialDisplayedMonthMillis = null
-            )
+            datePickerState =
+                rememberDatePickerState(
+                    initialSelectedDateMillis = 1649721600000L,
+                    initialDisplayedMonthMillis = null
+                )
         }
 
         with(datePickerState) {
@@ -412,9 +406,10 @@
             // Assert that the displayed month is the current month as of today.
             // Using the JVM Locale.getDefault() for testing purposes only.
             val calendarModel = createCalendarModel(Locale.getDefault())
-            assertThat(displayedMonthMillis).isEqualTo(
-                calendarModel.getMonth(calendarModel.today.utcTimeMillis).startUtcTimeMillis
-            )
+            assertThat(displayedMonthMillis)
+                .isEqualTo(
+                    calendarModel.getMonth(calendarModel.today.utcTimeMillis).startUtcTimeMillis
+                )
         }
     }
 
@@ -423,19 +418,21 @@
         lateinit var datePickerState: DatePickerState
         rule.setMaterialContent(lightColorScheme()) {
             // 04/12/2022
-            datePickerState = rememberDatePickerState(
-                initialSelectedDateMillis = null,
-                initialDisplayedMonthMillis = null
-            )
+            datePickerState =
+                rememberDatePickerState(
+                    initialSelectedDateMillis = null,
+                    initialDisplayedMonthMillis = null
+                )
         }
 
         with(datePickerState) {
             assertThat(selectedDateMillis).isNull()
             // Assert that the displayed month is the current month as of today.
             val calendarModel = createCalendarModel(Locale.getDefault())
-            assertThat(displayedMonthMillis).isEqualTo(
-                calendarModel.getMonth(calendarModel.today.utcTimeMillis).startUtcTimeMillis
-            )
+            assertThat(displayedMonthMillis)
+                .isEqualTo(
+                    calendarModel.getMonth(calendarModel.today.utcTimeMillis).startUtcTimeMillis
+                )
         }
     }
 
@@ -452,12 +449,12 @@
         rule.onNodeWithText("Apr 12, 2022").assertExists()
         with(datePickerState) {
             assertThat(selectedDateMillis).isEqualTo(1649721600000L)
-            assertThat(displayedMonthMillis).isEqualTo(
-                createCalendarModel(Locale.getDefault()).getMonth(
-                    year = 2022,
-                    month = 4
-                ).startUtcTimeMillis
-            )
+            assertThat(displayedMonthMillis)
+                .isEqualTo(
+                    createCalendarModel(Locale.getDefault())
+                        .getMonth(year = 2022, month = 4)
+                        .startUtcTimeMillis
+                )
             // Reset the selection
             datePickerState.selectedDateMillis = null
             assertThat(selectedDateMillis).isNull()
@@ -470,9 +467,7 @@
     fun state_restoresDatePickerState() {
         val restorationTester = StateRestorationTester(rule)
         var datePickerState: DatePickerState? = null
-        restorationTester.setContent {
-            datePickerState = rememberDatePickerState()
-        }
+        restorationTester.setContent { datePickerState = rememberDatePickerState() }
 
         // Using the JVM Locale.getDefault() for testing purposes only.
         val calendarModel = createCalendarModel(Locale.getDefault())
@@ -504,11 +499,8 @@
         }
 
         // Setting the selection to a year that is out of range.
-        datePickerState.selectedDateMillis = dayInUtcMilliseconds(
-            year = 1999,
-            month = 5,
-            dayOfMonth = 11
-        )
+        datePickerState.selectedDateMillis =
+            dayInUtcMilliseconds(year = 1999, month = 5, dayOfMonth = 11)
     }
 
     @Test(expected = IllegalArgumentException::class)
@@ -527,10 +519,11 @@
         lateinit var datePickerState: DatePickerState
         rule.setMaterialContent(lightColorScheme()) {
             val monthInUtcMillis = dayInUtcMilliseconds(year = 1999, month = 1, dayOfMonth = 1)
-            datePickerState = rememberDatePickerState(
-                initialDisplayedMonthMillis = monthInUtcMillis,
-                yearRange = IntRange(2000, 2050)
-            )
+            datePickerState =
+                rememberDatePickerState(
+                    initialDisplayedMonthMillis = monthInUtcMillis,
+                    yearRange = IntRange(2000, 2050)
+                )
             DatePicker(state = datePickerState)
         }
     }
@@ -544,29 +537,34 @@
             // e.g. "Current selection: %1$s"
             expectedHeadlineStringFormat = getString(Strings.DatePickerHeadlineDescription)
             DatePicker(
-                state = rememberDatePickerState(
-                    initialSelectedDateMillis = selectedDateInUtcMillis,
-                    initialDisplayedMonthMillis = monthInUtcMillis
-                )
+                state =
+                    rememberDatePickerState(
+                        initialSelectedDateMillis = selectedDateInUtcMillis,
+                        initialDisplayedMonthMillis = monthInUtcMillis
+                    )
             )
         }
 
-        val fullDateDescription = formatWithSkeleton(
-            selectedDateInUtcMillis,
-            DatePickerDefaults.YearMonthWeekdayDaySkeleton,
-            Locale.US,
-            cache = mutableMapOf()
-        )
+        val fullDateDescription =
+            formatWithSkeleton(
+                selectedDateInUtcMillis,
+                DatePickerDefaults.YearMonthWeekdayDaySkeleton,
+                Locale.US,
+                cache = mutableMapOf()
+            )
 
-        rule.onNodeWithContentDescription(label = "next", substring = true, ignoreCase = true)
+        rule
+            .onNodeWithContentDescription(label = "next", substring = true, ignoreCase = true)
             .assert(expectValue(SemanticsProperties.Role, Role.Button))
-        rule.onNodeWithContentDescription(label = "previous", substring = true, ignoreCase = true)
+        rule
+            .onNodeWithContentDescription(label = "previous", substring = true, ignoreCase = true)
             .assert(expectValue(SemanticsProperties.Role, Role.Button))
-        rule.onNodeWithText("May 2010")
+        rule.onNodeWithText("May 2010").assert(expectValue(SemanticsProperties.Role, Role.Button))
+        rule
+            .onNode(hasText(fullDateDescription) and hasClickAction())
             .assert(expectValue(SemanticsProperties.Role, Role.Button))
-        rule.onNode(hasText(fullDateDescription) and hasClickAction())
-            .assert(expectValue(SemanticsProperties.Role, Role.Button))
-        rule.onNodeWithText("May 11, 2010")
+        rule
+            .onNodeWithText("May 11, 2010")
             .assertContentDescriptionEquals(
                 expectedHeadlineStringFormat.format(fullDateDescription)
             )
diff --git a/compose/material3/material3/src/androidInstrumentedTest/kotlin/androidx/compose/material3/DateRangeInputScreenshotTest.kt b/compose/material3/material3/src/androidInstrumentedTest/kotlin/androidx/compose/material3/DateRangeInputScreenshotTest.kt
index fc637de..3dabd83 100644
--- a/compose/material3/material3/src/androidInstrumentedTest/kotlin/androidx/compose/material3/DateRangeInputScreenshotTest.kt
+++ b/compose/material3/material3/src/androidInstrumentedTest/kotlin/androidx/compose/material3/DateRangeInputScreenshotTest.kt
@@ -43,11 +43,9 @@
 @OptIn(ExperimentalMaterial3Api::class)
 class DateRangeInputScreenshotTest(private val scheme: ColorSchemeWrapper) {
 
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
-    @get:Rule
-    val screenshotRule = AndroidXScreenshotTestRule(GOLDEN_MATERIAL3)
+    @get:Rule val screenshotRule = AndroidXScreenshotTestRule(GOLDEN_MATERIAL3)
 
     private val wrap = Modifier.wrapContentSize(Alignment.Center)
     private val wrapperTestTag = "dateRangeInputWrapper"
@@ -84,11 +82,12 @@
                 val startDayMillis = dayInUtcMilliseconds(year = 2021, month = 3, dayOfMonth = 6)
                 val endDayMillis = dayInUtcMilliseconds(year = 2022, month = 1, dayOfMonth = 10)
                 DateRangePicker(
-                    state = rememberDateRangePickerState(
-                        initialSelectedStartDateMillis = startDayMillis,
-                        initialSelectedEndDateMillis = endDayMillis,
-                        initialDisplayMode = DisplayMode.Input
-                    ),
+                    state =
+                        rememberDateRangePickerState(
+                            initialSelectedStartDateMillis = startDayMillis,
+                            initialSelectedEndDateMillis = endDayMillis,
+                            initialDisplayMode = DisplayMode.Input
+                        ),
                     showModeToggle = false
                 )
             }
@@ -106,7 +105,8 @@
             .toEpochMilli()
 
     private fun assertAgainstGolden(goldenName: String) {
-        rule.onNodeWithTag(wrapperTestTag)
+        rule
+            .onNodeWithTag(wrapperTestTag)
             .captureToImage()
             .assertAgainstGolden(screenshotRule, goldenName)
     }
@@ -117,10 +117,11 @@
     companion object {
         @Parameterized.Parameters(name = "{0}")
         @JvmStatic
-        fun parameters() = arrayOf(
-            ColorSchemeWrapper("lightTheme", lightColorScheme()),
-            ColorSchemeWrapper("darkTheme", darkColorScheme()),
-        )
+        fun parameters() =
+            arrayOf(
+                ColorSchemeWrapper("lightTheme", lightColorScheme()),
+                ColorSchemeWrapper("darkTheme", darkColorScheme()),
+            )
     }
 
     class ColorSchemeWrapper(val name: String, val colorScheme: ColorScheme) {
diff --git a/compose/material3/material3/src/androidInstrumentedTest/kotlin/androidx/compose/material3/DateRangeInputTest.kt b/compose/material3/material3/src/androidInstrumentedTest/kotlin/androidx/compose/material3/DateRangeInputTest.kt
index 0a9338d..d6c8f6e 100644
--- a/compose/material3/material3/src/androidInstrumentedTest/kotlin/androidx/compose/material3/DateRangeInputTest.kt
+++ b/compose/material3/material3/src/androidInstrumentedTest/kotlin/androidx/compose/material3/DateRangeInputTest.kt
@@ -46,8 +46,7 @@
 @OptIn(ExperimentalMaterial3Api::class)
 class DateRangeInputTest {
 
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
     @Test
     fun dateRangeInput() {
@@ -58,45 +57,36 @@
             pickerStartDateHeadline = getString(string = Strings.DateRangePickerStartHeadline)
             pickerEndDateHeadline = getString(string = Strings.DateRangePickerEndHeadline)
             val monthInUtcMillis = dayInUtcMilliseconds(year = 2019, month = 1, dayOfMonth = 1)
-            state = rememberDateRangePickerState(
-                initialDisplayedMonthMillis = monthInUtcMillis,
-                initialDisplayMode = DisplayMode.Input
-            )
+            state =
+                rememberDateRangePickerState(
+                    initialDisplayedMonthMillis = monthInUtcMillis,
+                    initialDisplayMode = DisplayMode.Input
+                )
             DateRangePicker(state = state)
         }
 
         // Expecting 2 nodes with the text "Start date", and 2 with "End date".
-        rule.onAllNodesWithText(pickerStartDateHeadline, useUnmergedTree = true)
+        rule
+            .onAllNodesWithText(pickerStartDateHeadline, useUnmergedTree = true)
             .assertCountEquals(2)
-        rule.onAllNodesWithText(pickerEndDateHeadline, useUnmergedTree = true)
-            .assertCountEquals(2)
+        rule.onAllNodesWithText(pickerEndDateHeadline, useUnmergedTree = true).assertCountEquals(2)
 
         // Enter dates.
         rule.onNodeWithText(pickerStartDateHeadline).performClick().performTextInput("01272019")
         rule.onNodeWithText(pickerEndDateHeadline).performClick().performTextInput("05102020")
 
         rule.runOnIdle {
-            assertThat(state.selectedStartDateMillis).isEqualTo(
-                dayInUtcMilliseconds(
-                    year = 2019,
-                    month = 1,
-                    dayOfMonth = 27
-                )
-            )
-            assertThat(state.selectedEndDateMillis).isEqualTo(
-                dayInUtcMilliseconds(
-                    year = 2020,
-                    month = 5,
-                    dayOfMonth = 10
-                )
-            )
+            assertThat(state.selectedStartDateMillis)
+                .isEqualTo(dayInUtcMilliseconds(year = 2019, month = 1, dayOfMonth = 27))
+            assertThat(state.selectedEndDateMillis)
+                .isEqualTo(dayInUtcMilliseconds(year = 2020, month = 5, dayOfMonth = 10))
         }
 
         // Now expecting only one node with "Start date", and one with "End date".
-        rule.onAllNodesWithText(pickerStartDateHeadline, useUnmergedTree = true)
+        rule
+            .onAllNodesWithText(pickerStartDateHeadline, useUnmergedTree = true)
             .assertCountEquals(1)
-        rule.onAllNodesWithText(pickerEndDateHeadline, useUnmergedTree = true)
-            .assertCountEquals(1)
+        rule.onAllNodesWithText(pickerEndDateHeadline, useUnmergedTree = true).assertCountEquals(1)
         rule.onNodeWithText("Jan 27, 2019", useUnmergedTree = true).assertExists()
         rule.onNodeWithText("May 10, 2020", useUnmergedTree = true).assertExists()
     }
@@ -109,11 +99,12 @@
                 dayInUtcMilliseconds(year = 2010, month = 5, dayOfMonth = 11)
             val initialEndDateMillis =
                 dayInUtcMilliseconds(year = 2020, month = 10, dayOfMonth = 20)
-            state = rememberDateRangePickerState(
-                initialSelectedStartDateMillis = initialStartDateMillis,
-                initialSelectedEndDateMillis = initialEndDateMillis,
-                initialDisplayMode = DisplayMode.Input
-            )
+            state =
+                rememberDateRangePickerState(
+                    initialSelectedStartDateMillis = initialStartDateMillis,
+                    initialSelectedEndDateMillis = initialEndDateMillis,
+                    initialDisplayMode = DisplayMode.Input
+                )
             DateRangePicker(state = state)
         }
 
@@ -133,12 +124,15 @@
             startDateRangeInputLabel = getString(string = Strings.DateRangePickerStartHeadline)
             endDateRangeInputLabel = getString(string = Strings.DateRangePickerEndHeadline)
             errorMessage = getString(string = Strings.DateInputInvalidNotAllowed)
-            state = rememberDateRangePickerState(
-                initialDisplayMode = DisplayMode.Input,
-                selectableDates = object : SelectableDates {
-                    // All dates are invalid for the sake of this test.
-                    override fun isSelectableDate(utcTimeMillis: Long): Boolean = false
-                })
+            state =
+                rememberDateRangePickerState(
+                    initialDisplayMode = DisplayMode.Input,
+                    selectableDates =
+                        object : SelectableDates {
+                            // All dates are invalid for the sake of this test.
+                            override fun isSelectableDate(utcTimeMillis: Long): Boolean = false
+                        }
+                )
             DateRangePicker(state = state)
         }
 
@@ -150,22 +144,14 @@
             assertThat(state.selectedStartDateMillis).isNull()
             assertThat(state.selectedEndDateMillis).isNull()
         }
-        rule.onNodeWithText("01/27/2019")
+        rule
+            .onNodeWithText("01/27/2019")
             .assert(keyIsDefined(SemanticsProperties.Error))
-            .assert(
-                expectValue(
-                    SemanticsProperties.Error,
-                    errorMessage.format("Jan 27, 2019")
-                )
-            )
-        rule.onNodeWithText("05/10/2020")
+            .assert(expectValue(SemanticsProperties.Error, errorMessage.format("Jan 27, 2019")))
+        rule
+            .onNodeWithText("05/10/2020")
             .assert(keyIsDefined(SemanticsProperties.Error))
-            .assert(
-                expectValue(
-                    SemanticsProperties.Error,
-                    errorMessage.format("May 10, 2020")
-                )
-            )
+            .assert(expectValue(SemanticsProperties.Error, errorMessage.format("May 10, 2020")))
     }
 
     @Test
@@ -178,11 +164,12 @@
             startDateRangeInputLabel = getString(string = Strings.DateRangePickerStartHeadline)
             endDateRangeInputLabel = getString(string = Strings.DateRangePickerEndHeadline)
             errorMessage = getString(string = Strings.DateRangeInputInvalidRangeInput)
-            state = rememberDateRangePickerState(
-                // Limit the years selection to 2018-2023
-                yearRange = IntRange(2018, 2023),
-                initialDisplayMode = DisplayMode.Input
-            )
+            state =
+                rememberDateRangePickerState(
+                    // Limit the years selection to 2018-2023
+                    yearRange = IntRange(2018, 2023),
+                    initialDisplayMode = DisplayMode.Input
+                )
             DateRangePicker(state = state)
         }
 
@@ -195,7 +182,8 @@
             assertThat(state.selectedStartDateMillis).isNotNull()
             assertThat(state.selectedEndDateMillis).isNull()
         }
-        rule.onNodeWithText("05/10/2019", useUnmergedTree = true)
+        rule
+            .onNodeWithText("05/10/2019", useUnmergedTree = true)
             .assert(keyIsDefined(SemanticsProperties.Error))
             .assert(expectValue(SemanticsProperties.Error, errorMessage))
     }
@@ -238,30 +226,34 @@
             pickerStartDateHeadline = getString(string = Strings.DateRangePickerStartHeadline)
             pickerEndDateHeadline = getString(string = Strings.DateRangePickerEndHeadline)
             DateRangePicker(
-                state = rememberDateRangePickerState(
-                    initialSelectedStartDateMillis = startDateMillis,
-                    initialSelectedEndDateMillis = endDateMillis,
-                    initialDisplayMode = DisplayMode.Input
-                )
+                state =
+                    rememberDateRangePickerState(
+                        initialSelectedStartDateMillis = startDateMillis,
+                        initialSelectedEndDateMillis = endDateMillis,
+                        initialDisplayMode = DisplayMode.Input
+                    )
             )
         }
         val cache = mutableMapOf<String, Any>()
-        val fullStartDateDescription = formatWithSkeleton(
-            startDateMillis,
-            DatePickerDefaults.YearMonthWeekdayDaySkeleton,
-            Locale.US,
-            cache
-        )
-        val fullEndDateDescription = formatWithSkeleton(
-            endDateMillis,
-            DatePickerDefaults.YearMonthWeekdayDaySkeleton,
-            Locale.US,
-            cache
-        )
+        val fullStartDateDescription =
+            formatWithSkeleton(
+                startDateMillis,
+                DatePickerDefaults.YearMonthWeekdayDaySkeleton,
+                Locale.US,
+                cache
+            )
+        val fullEndDateDescription =
+            formatWithSkeleton(
+                endDateMillis,
+                DatePickerDefaults.YearMonthWeekdayDaySkeleton,
+                Locale.US,
+                cache
+            )
 
         val startHeadlineDescription = "$pickerStartDateHeadline: $fullStartDateDescription"
         val endHeadlineDescription = "$pickerEndDateHeadline: $fullEndDateDescription"
-        rule.onNodeWithContentDescription("$startHeadlineDescription, $endHeadlineDescription")
+        rule
+            .onNodeWithContentDescription("$startHeadlineDescription, $endHeadlineDescription")
             .assertExists()
     }
 
diff --git a/compose/material3/material3/src/androidInstrumentedTest/kotlin/androidx/compose/material3/DateRangePickerScreenshotTest.kt b/compose/material3/material3/src/androidInstrumentedTest/kotlin/androidx/compose/material3/DateRangePickerScreenshotTest.kt
index b9c7249..45c5115 100644
--- a/compose/material3/material3/src/androidInstrumentedTest/kotlin/androidx/compose/material3/DateRangePickerScreenshotTest.kt
+++ b/compose/material3/material3/src/androidInstrumentedTest/kotlin/androidx/compose/material3/DateRangePickerScreenshotTest.kt
@@ -48,11 +48,9 @@
 @OptIn(ExperimentalMaterial3Api::class)
 class DateRangePickerScreenshotTest(private val scheme: ColorSchemeWrapper) {
 
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
-    @get:Rule
-    val screenshotRule = AndroidXScreenshotTestRule(GOLDEN_MATERIAL3)
+    @get:Rule val screenshotRule = AndroidXScreenshotTestRule(GOLDEN_MATERIAL3)
 
     private val wrap = Modifier.wrapContentSize(Alignment.Center)
     private val wrapperTestTag = "dateRangePickerWrapper"
@@ -63,9 +61,10 @@
             Box(wrap.testTag(wrapperTestTag)) {
                 val monthInUtcMillis = dayInUtcMilliseconds(year = 2021, month = 1, dayOfMonth = 1)
                 DateRangePicker(
-                    state = rememberDateRangePickerState(
-                        initialDisplayedMonthMillis = monthInUtcMillis
-                    ),
+                    state =
+                        rememberDateRangePickerState(
+                            initialDisplayedMonthMillis = monthInUtcMillis
+                        ),
                     showModeToggle = false
                 )
             }
@@ -83,11 +82,12 @@
                 val endSelectionMillis =
                     dayInUtcMilliseconds(year = 2021, month = 3, dayOfMonth = 10)
                 DateRangePicker(
-                    state = rememberDateRangePickerState(
-                        initialDisplayedMonthMillis = monthInUtcMillis,
-                        initialSelectedStartDateMillis = startSelectionMillis,
-                        initialSelectedEndDateMillis = endSelectionMillis
-                    ),
+                    state =
+                        rememberDateRangePickerState(
+                            initialDisplayedMonthMillis = monthInUtcMillis,
+                            initialSelectedStartDateMillis = startSelectionMillis,
+                            initialSelectedEndDateMillis = endSelectionMillis
+                        ),
                     showModeToggle = false
                 )
             }
@@ -105,11 +105,12 @@
                 val endSelectionMillis =
                     dayInUtcMilliseconds(year = 2021, month = 4, dayOfMonth = 5)
                 DateRangePicker(
-                    state = rememberDateRangePickerState(
-                        initialDisplayedMonthMillis = monthInUtcMillis,
-                        initialSelectedStartDateMillis = startSelectionMillis,
-                        initialSelectedEndDateMillis = endSelectionMillis
-                    ),
+                    state =
+                        rememberDateRangePickerState(
+                            initialDisplayedMonthMillis = monthInUtcMillis,
+                            initialSelectedStartDateMillis = startSelectionMillis,
+                            initialSelectedEndDateMillis = endSelectionMillis
+                        ),
                     showModeToggle = false
                 )
             }
@@ -129,11 +130,12 @@
                     val endSelectionMillis =
                         dayInUtcMilliseconds(year = 2021, month = 4, dayOfMonth = 5)
                     DateRangePicker(
-                        state = rememberDateRangePickerState(
-                            initialDisplayedMonthMillis = monthInUtcMillis,
-                            initialSelectedStartDateMillis = startSelectionMillis,
-                            initialSelectedEndDateMillis = endSelectionMillis
-                        ),
+                        state =
+                            rememberDateRangePickerState(
+                                initialDisplayedMonthMillis = monthInUtcMillis,
+                                initialSelectedStartDateMillis = startSelectionMillis,
+                                initialSelectedEndDateMillis = endSelectionMillis
+                            ),
                         showModeToggle = false
                     )
                 }
@@ -148,18 +150,21 @@
             Box(wrap.testTag(wrapperTestTag)) {
                 val monthInUtcMillis = dayInUtcMilliseconds(year = 2000, month = 6, dayOfMonth = 1)
                 DateRangePicker(
-                    state = rememberDateRangePickerState(
-                        initialDisplayedMonthMillis = monthInUtcMillis,
-                        selectableDates = object : SelectableDates {
-                            override fun isSelectableDate(utcTimeMillis: Long): Boolean {
-                                val localDate =
-                                    Instant.ofEpochMilli(utcTimeMillis).atZone(ZoneId.of("UTC"))
-                                        .toLocalDate()
-                                val dayOfWeek = localDate.dayOfWeek
-                                return dayOfWeek != DayOfWeek.SUNDAY
-                            }
-                        }
-                    ),
+                    state =
+                        rememberDateRangePickerState(
+                            initialDisplayedMonthMillis = monthInUtcMillis,
+                            selectableDates =
+                                object : SelectableDates {
+                                    override fun isSelectableDate(utcTimeMillis: Long): Boolean {
+                                        val localDate =
+                                            Instant.ofEpochMilli(utcTimeMillis)
+                                                .atZone(ZoneId.of("UTC"))
+                                                .toLocalDate()
+                                        val dayOfWeek = localDate.dayOfWeek
+                                        return dayOfWeek != DayOfWeek.SUNDAY
+                                    }
+                                }
+                        ),
                     showModeToggle = false
                 )
             }
@@ -173,9 +178,8 @@
             Box(wrap.testTag(wrapperTestTag)) {
                 val monthInUtcMillis = dayInUtcMilliseconds(year = 2021, month = 1, dayOfMonth = 1)
                 DateRangePicker(
-                    state = rememberDateRangePickerState(
-                        initialDisplayedMonthMillis = monthInUtcMillis
-                    )
+                    state =
+                        rememberDateRangePickerState(initialDisplayedMonthMillis = monthInUtcMillis)
                 )
             }
         }
@@ -192,7 +196,8 @@
             .toEpochMilli()
 
     private fun assertAgainstGolden(goldenName: String) {
-        rule.onNodeWithTag(wrapperTestTag)
+        rule
+            .onNodeWithTag(wrapperTestTag)
             .captureToImage()
             .assertAgainstGolden(screenshotRule, goldenName)
     }
@@ -203,10 +208,11 @@
     companion object {
         @Parameterized.Parameters(name = "{0}")
         @JvmStatic
-        fun parameters() = arrayOf(
-            ColorSchemeWrapper("lightTheme", lightColorScheme()),
-            ColorSchemeWrapper("darkTheme", darkColorScheme()),
-        )
+        fun parameters() =
+            arrayOf(
+                ColorSchemeWrapper("lightTheme", lightColorScheme()),
+                ColorSchemeWrapper("darkTheme", darkColorScheme()),
+            )
     }
 
     class ColorSchemeWrapper(val name: String, val colorScheme: ColorScheme) {
diff --git a/compose/material3/material3/src/androidInstrumentedTest/kotlin/androidx/compose/material3/DateRangePickerTest.kt b/compose/material3/material3/src/androidInstrumentedTest/kotlin/androidx/compose/material3/DateRangePickerTest.kt
index 9a112da..997c769 100644
--- a/compose/material3/material3/src/androidInstrumentedTest/kotlin/androidx/compose/material3/DateRangePickerTest.kt
+++ b/compose/material3/material3/src/androidInstrumentedTest/kotlin/androidx/compose/material3/DateRangePickerTest.kt
@@ -44,26 +44,26 @@
 @OptIn(ExperimentalMaterial3Api::class)
 class DateRangePickerTest {
 
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
     @Test
     fun state_initWithoutRemember() {
-        val dateRangePickerState = DateRangePickerState(
-            locale = Locale.getDefault(),
-            initialSelectedStartDateMillis = 1649721600000L, // 04/12/2022
-            initialSelectedEndDateMillis = 1649721600000L + MillisecondsIn24Hours // 04/13/2022
-        )
+        val dateRangePickerState =
+            DateRangePickerState(
+                locale = Locale.getDefault(),
+                initialSelectedStartDateMillis = 1649721600000L, // 04/12/2022
+                initialSelectedEndDateMillis = 1649721600000L + MillisecondsIn24Hours // 04/13/2022
+            )
         with(dateRangePickerState) {
             assertThat(selectedStartDateMillis).isEqualTo(1649721600000L)
             assertThat(selectedEndDateMillis).isEqualTo(1649721600000L + MillisecondsIn24Hours)
-            assertThat(displayedMonthMillis).isEqualTo(
-                // Using the JVM Locale.getDefault() for testing purposes only.
-                createCalendarModel(Locale.getDefault()).getMonth(
-                    year = 2022,
-                    month = 4
-                ).startUtcTimeMillis
-            )
+            assertThat(displayedMonthMillis)
+                .isEqualTo(
+                    // Using the JVM Locale.getDefault() for testing purposes only.
+                    createCalendarModel(Locale.getDefault())
+                        .getMonth(year = 2022, month = 4)
+                        .startUtcTimeMillis
+                )
         }
     }
 
@@ -72,23 +72,24 @@
         lateinit var dateRangePickerState: DateRangePickerState
         rule.setMaterialContent(lightColorScheme()) {
             // 04/12/2022
-            dateRangePickerState = rememberDateRangePickerState(
-                // 04/12/2022
-                initialSelectedStartDateMillis = 1649721600000L,
-                // 04/13/2022
-                initialSelectedEndDateMillis = 1649721600000L + MillisecondsIn24Hours
-            )
+            dateRangePickerState =
+                rememberDateRangePickerState(
+                    // 04/12/2022
+                    initialSelectedStartDateMillis = 1649721600000L,
+                    // 04/13/2022
+                    initialSelectedEndDateMillis = 1649721600000L + MillisecondsIn24Hours
+                )
         }
         with(dateRangePickerState) {
             assertThat(selectedStartDateMillis).isEqualTo(1649721600000L)
             assertThat(selectedEndDateMillis).isEqualTo(1649721600000L + MillisecondsIn24Hours)
-            assertThat(displayedMonthMillis).isEqualTo(
-                // Using the JVM Locale.getDefault() for testing purposes only.
-                createCalendarModel(Locale.getDefault()).getMonth(
-                    year = 2022,
-                    month = 4
-                ).startUtcTimeMillis
-            )
+            assertThat(displayedMonthMillis)
+                .isEqualTo(
+                    // Using the JVM Locale.getDefault() for testing purposes only.
+                    createCalendarModel(Locale.getDefault())
+                        .getMonth(year = 2022, month = 4)
+                        .startUtcTimeMillis
+                )
         }
     }
 
@@ -109,12 +110,12 @@
             // timestamp
             assertThat(selectedStartDateMillis).isEqualTo(1649721600000L)
             assertThat(selectedEndDateMillis).isEqualTo(1649721600000L + MillisecondsIn24Hours)
-            assertThat(displayedMonthMillis).isEqualTo(
-                createCalendarModel(Locale.getDefault()).getMonth(
-                    year = 2022,
-                    month = 4
-                ).startUtcTimeMillis
-            )
+            assertThat(displayedMonthMillis)
+                .isEqualTo(
+                    createCalendarModel(Locale.getDefault())
+                        .getMonth(year = 2022, month = 4)
+                        .startUtcTimeMillis
+                )
         }
     }
 
@@ -145,13 +146,14 @@
     fun state_initWithEqualStartAndEndDates() {
         lateinit var dateRangePickerState: DateRangePickerState
         rule.setMaterialContent(lightColorScheme()) {
-            dateRangePickerState = rememberDateRangePickerState(
-                // 04/12/2022
-                initialSelectedStartDateMillis = 1649721600000L,
-                // 04/12/2022 + a few added milliseconds to ensure that the state is initialized
-                // with a canonical date.
-                initialSelectedEndDateMillis = 1649721600000L + 1000
-            )
+            dateRangePickerState =
+                rememberDateRangePickerState(
+                    // 04/12/2022
+                    initialSelectedStartDateMillis = 1649721600000L,
+                    // 04/12/2022 + a few added milliseconds to ensure that the state is initialized
+                    // with a canonical date.
+                    initialSelectedEndDateMillis = 1649721600000L + 1000
+                )
         }
         with(dateRangePickerState) {
             // Start and end are expected to be equal.
@@ -197,63 +199,56 @@
             defaultStartSelectionHeadline = getString(Strings.DateRangePickerStartHeadline)
             defaultEndSelectionHeadline = getString(Strings.DateRangePickerEndHeadline)
             val monthInUtcMillis = dayInUtcMilliseconds(year = 2019, month = 1, dayOfMonth = 1)
-            dateRangePickerState = rememberDateRangePickerState(
-                initialDisplayedMonthMillis = monthInUtcMillis
-            )
+            dateRangePickerState =
+                rememberDateRangePickerState(initialDisplayedMonthMillis = monthInUtcMillis)
             DateRangePicker(state = dateRangePickerState)
         }
 
-        rule.onNodeWithText(defaultStartSelectionHeadline, useUnmergedTree = true)
-            .assertExists()
-        rule.onNodeWithText(defaultEndSelectionHeadline, useUnmergedTree = true)
-            .assertExists()
+        rule.onNodeWithText(defaultStartSelectionHeadline, useUnmergedTree = true).assertExists()
+        rule.onNodeWithText(defaultEndSelectionHeadline, useUnmergedTree = true).assertExists()
 
         // First date selection: Select the 10th day of the displayed month.
-        rule.onAllNodes(hasText("10", substring = true) and hasClickAction())
+        rule
+            .onAllNodes(hasText("10", substring = true) and hasClickAction())
             .onFirst()
             .assertIsNotSelected()
-        rule.onAllNodes(hasText("10", substring = true) and hasClickAction())
+        rule
+            .onAllNodes(hasText("10", substring = true) and hasClickAction())
             .onFirst()
             .performClick()
 
         // Assert the state holds a valid start date.
         rule.runOnIdle {
-            assertThat(dateRangePickerState.selectedStartDateMillis).isEqualTo(
-                dayInUtcMilliseconds(
-                    year = 2019,
-                    month = 1,
-                    dayOfMonth = 10
-                )
-            )
+            assertThat(dateRangePickerState.selectedStartDateMillis)
+                .isEqualTo(dayInUtcMilliseconds(year = 2019, month = 1, dayOfMonth = 10))
             assertThat(dateRangePickerState.selectedEndDateMillis).isNull()
         }
         // Check that the title holds the start of the selection as a date, and ends with a suffix
         // string.
-        rule.onNodeWithText(defaultStartSelectionHeadline, useUnmergedTree = true)
+        rule
+            .onNodeWithText(defaultStartSelectionHeadline, useUnmergedTree = true)
             .assertDoesNotExist()
         rule.onNodeWithText("Jan 10, 2019", useUnmergedTree = true).assertExists()
         rule.onNodeWithText(defaultEndSelectionHeadline, useUnmergedTree = true).assertExists()
-        rule.onAllNodes(hasText("10", substring = true) and hasClickAction())
+        rule
+            .onAllNodes(hasText("10", substring = true) and hasClickAction())
             .onFirst()
             .assertIsSelected()
 
         // Second date selection: Select the 14th day of the displayed month.
-        rule.onAllNodes(hasText("14", substring = true) and hasClickAction())
+        rule
+            .onAllNodes(hasText("14", substring = true) and hasClickAction())
             .onFirst()
             .assertIsNotSelected()
-        rule.onAllNodes(hasText("14", substring = true) and hasClickAction())
+        rule
+            .onAllNodes(hasText("14", substring = true) and hasClickAction())
             .onFirst()
             .performClick()
 
         // Assert the state holds a valid end date.
         rule.runOnIdle {
-            assertThat(dateRangePickerState.selectedEndDateMillis).isEqualTo(
-                dayInUtcMilliseconds(
-                    year = 2019,
-                    month = 1,
-                    dayOfMonth = 14
-                )
-            )
+            assertThat(dateRangePickerState.selectedEndDateMillis)
+                .isEqualTo(dayInUtcMilliseconds(year = 2019, month = 1, dayOfMonth = 14))
         }
         rule.onNodeWithText(defaultEndSelectionHeadline).assertDoesNotExist()
         rule.onNodeWithText("Jan 10, 2019", useUnmergedTree = true).assertExists()
@@ -269,59 +264,49 @@
         lateinit var dateRangePickerState: DateRangePickerState
         rule.setMaterialContent(lightColorScheme()) {
             val monthInUtcMillis = dayInUtcMilliseconds(year = 2019, month = 3, dayOfMonth = 1)
-            dateRangePickerState = rememberDateRangePickerState(
-                initialDisplayedMonthMillis = monthInUtcMillis
-            )
+            dateRangePickerState =
+                rememberDateRangePickerState(initialDisplayedMonthMillis = monthInUtcMillis)
             DateRangePicker(state = dateRangePickerState)
         }
 
         // First date selection: Select the 15th day of the first displayed month in the list.
-        rule.onAllNodes(hasText("15", substring = true) and hasClickAction())
+        rule
+            .onAllNodes(hasText("15", substring = true) and hasClickAction())
             .onFirst()
             .performClick()
 
         // Assert the state holds a valid start date.
         rule.runOnIdle {
-            assertThat(dateRangePickerState.selectedStartDateMillis).isEqualTo(
-                dayInUtcMilliseconds(
-                    year = 2019,
-                    month = 3,
-                    dayOfMonth = 15
-                )
-            )
+            assertThat(dateRangePickerState.selectedStartDateMillis)
+                .isEqualTo(dayInUtcMilliseconds(year = 2019, month = 3, dayOfMonth = 15))
             assertThat(dateRangePickerState.selectedEndDateMillis).isNull()
         }
 
         // Select a second date that is earlier than the first date.
-        rule.onAllNodes(hasText("12", substring = true) and hasClickAction())
+        rule
+            .onAllNodes(hasText("12", substring = true) and hasClickAction())
             .onFirst()
             .performClick()
 
         // Assert the state now holds the second selection as the start date.
         rule.runOnIdle {
-            assertThat(dateRangePickerState.selectedStartDateMillis).isEqualTo(
-                dayInUtcMilliseconds(
-                    year = 2019,
-                    month = 3,
-                    dayOfMonth = 12
-                )
-            )
+            assertThat(dateRangePickerState.selectedStartDateMillis)
+                .isEqualTo(dayInUtcMilliseconds(year = 2019, month = 3, dayOfMonth = 12))
             assertThat(dateRangePickerState.selectedEndDateMillis).isNull()
         }
     }
 
     /**
-     * Tests that clicking the same date twice creates a single-day range, and that clicking it
-     * a third time resets the end date.
+     * Tests that clicking the same date twice creates a single-day range, and that clicking it a
+     * third time resets the end date.
      */
     @Test
     fun dateSelection_sameDateForStartAndEnd() {
         lateinit var dateRangePickerState: DateRangePickerState
         rule.setMaterialContent(lightColorScheme()) {
             val monthInUtcMillis = dayInUtcMilliseconds(year = 2019, month = 3, dayOfMonth = 1)
-            dateRangePickerState = rememberDateRangePickerState(
-                initialDisplayedMonthMillis = monthInUtcMillis
-            )
+            dateRangePickerState =
+                rememberDateRangePickerState(initialDisplayedMonthMillis = monthInUtcMillis)
             DateRangePicker(state = dateRangePickerState)
         }
 
@@ -333,20 +318,10 @@
 
         // Assert the state holds a valid start and end dates for the same date.
         rule.runOnIdle {
-            assertThat(dateRangePickerState.selectedStartDateMillis).isEqualTo(
-                dayInUtcMilliseconds(
-                    year = 2019,
-                    month = 3,
-                    dayOfMonth = 15
-                )
-            )
-            assertThat(dateRangePickerState.selectedEndDateMillis).isEqualTo(
-                dayInUtcMilliseconds(
-                    year = 2019,
-                    month = 3,
-                    dayOfMonth = 15
-                )
-            )
+            assertThat(dateRangePickerState.selectedStartDateMillis)
+                .isEqualTo(dayInUtcMilliseconds(year = 2019, month = 3, dayOfMonth = 15))
+            assertThat(dateRangePickerState.selectedEndDateMillis)
+                .isEqualTo(dayInUtcMilliseconds(year = 2019, month = 3, dayOfMonth = 15))
         }
 
         // Click the node again to reset the end date.
@@ -354,13 +329,8 @@
 
         // Assert the state now holds just a start date.
         rule.runOnIdle {
-            assertThat(dateRangePickerState.selectedStartDateMillis).isEqualTo(
-                dayInUtcMilliseconds(
-                    year = 2019,
-                    month = 3,
-                    dayOfMonth = 15
-                )
-            )
+            assertThat(dateRangePickerState.selectedStartDateMillis)
+                .isEqualTo(dayInUtcMilliseconds(year = 2019, month = 3, dayOfMonth = 15))
             assertThat(dateRangePickerState.selectedEndDateMillis).isNull()
         }
     }
@@ -374,12 +344,13 @@
             defaultStartSelectionHeadline = getString(Strings.DateRangePickerStartHeadline)
             defaultEndSelectionHeadline = getString(Strings.DateRangePickerEndHeadline)
             // 04/12/2022
-            dateRangePickerState = rememberDateRangePickerState(
-                // 04/12/2022
-                initialSelectedStartDateMillis = 1649721600000L + 10000L,
-                // 04/13/2022
-                initialSelectedEndDateMillis = 1649721600000L + MillisecondsIn24Hours
-            )
+            dateRangePickerState =
+                rememberDateRangePickerState(
+                    // 04/12/2022
+                    initialSelectedStartDateMillis = 1649721600000L + 10000L,
+                    // 04/13/2022
+                    initialSelectedEndDateMillis = 1649721600000L + MillisecondsIn24Hours
+                )
             DateRangePicker(state = dateRangePickerState)
         }
         rule.onNodeWithText("Apr 12, 2022", useUnmergedTree = true).assertExists()
@@ -394,7 +365,8 @@
             assertThat(selectedEndDateMillis).isNull()
             rule.onNodeWithText("Apr 12, 2022", useUnmergedTree = true).assertDoesNotExist()
             rule.onNodeWithText("Apr 13, 2022", useUnmergedTree = true).assertDoesNotExist()
-            rule.onNodeWithText(defaultStartSelectionHeadline, useUnmergedTree = true)
+            rule
+                .onNodeWithText(defaultStartSelectionHeadline, useUnmergedTree = true)
                 .assertExists()
             rule.onNodeWithText(defaultEndSelectionHeadline, useUnmergedTree = true).assertExists()
         }
@@ -409,11 +381,8 @@
 
         // Setting the selection to a year that is out of range.
         dateRangePickerState.setSelection(
-            dayInUtcMilliseconds(
-                year = 1999,
-                month = 5,
-                dayOfMonth = 11
-            ), null
+            dayInUtcMilliseconds(year = 1999, month = 5, dayOfMonth = 11),
+            null
         )
     }
 
@@ -426,16 +395,8 @@
 
         // Expecting an exception since the start date is after the end date.
         dateRangePickerState.setSelection(
-            startDateMillis = dayInUtcMilliseconds(
-                year = 2000,
-                month = 10,
-                dayOfMonth = 10
-            ),
-            endDateMillis = dayInUtcMilliseconds(
-                year = 1998,
-                month = 10,
-                dayOfMonth = 10
-            )
+            startDateMillis = dayInUtcMilliseconds(year = 2000, month = 10, dayOfMonth = 10),
+            endDateMillis = dayInUtcMilliseconds(year = 1998, month = 10, dayOfMonth = 10)
         )
     }
 
@@ -443,18 +404,14 @@
     fun state_restoresDatePickerState() {
         val restorationTester = StateRestorationTester(rule)
         var dateRangePickerState: DateRangePickerState? = null
-        restorationTester.setContent {
-            dateRangePickerState = rememberDateRangePickerState()
-        }
+        restorationTester.setContent { dateRangePickerState = rememberDateRangePickerState() }
         // Using the JVM Locale.getDefault() for testing purposes only.
         val calendarModel = createCalendarModel(Locale.getDefault())
         with(dateRangePickerState!!) {
             // 04/12/2022
-            val startDate =
-                calendarModel.getCanonicalDate(1649721600000L)
+            val startDate = calendarModel.getCanonicalDate(1649721600000L)
             // 04/13/2022
-            val endDate =
-                calendarModel.getCanonicalDate(1649721600000L + MillisecondsIn24Hours)
+            val endDate = calendarModel.getCanonicalDate(1649721600000L + MillisecondsIn24Hours)
             val displayedMonth = calendarModel.getMonth(startDate)
             rule.runOnIdle {
                 setSelection(startDate.utcTimeMillis, endDate.utcTimeMillis)
@@ -469,8 +426,7 @@
                 assertThat(selectedStartDateMillis).isEqualTo(startDate.utcTimeMillis)
                 assertThat(selectedEndDateMillis).isEqualTo(endDate.utcTimeMillis)
                 assertThat(displayedMonthMillis).isEqualTo(displayedMonth.startUtcTimeMillis)
-                assertThat(dateRangePickerState!!.selectedStartDateMillis)
-                    .isEqualTo(1649721600000L)
+                assertThat(dateRangePickerState!!.selectedStartDateMillis).isEqualTo(1649721600000L)
                 assertThat(dateRangePickerState!!.selectedEndDateMillis)
                     .isEqualTo(1649721600000L + MillisecondsIn24Hours)
             }
diff --git a/compose/material3/material3/src/androidInstrumentedTest/kotlin/androidx/compose/material3/DismissibleNavigationDrawerTest.kt b/compose/material3/material3/src/androidInstrumentedTest/kotlin/androidx/compose/material3/DismissibleNavigationDrawerTest.kt
index 571508f..e97c9b8 100644
--- a/compose/material3/material3/src/androidInstrumentedTest/kotlin/androidx/compose/material3/DismissibleNavigationDrawerTest.kt
+++ b/compose/material3/material3/src/androidInstrumentedTest/kotlin/androidx/compose/material3/DismissibleNavigationDrawerTest.kt
@@ -68,8 +68,7 @@
 @RunWith(AndroidJUnit4::class)
 class DismissibleNavigationDrawerTest {
 
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
     private val NavigationDrawerWidth = NavigationDrawerTokens.ContainerWidth
 
@@ -80,20 +79,13 @@
             DismissibleNavigationDrawer(
                 drawerState = drawerState,
                 drawerContent = {
-                    DismissibleDrawerSheet {
-                        Box(
-                            Modifier
-                                .fillMaxSize()
-                                .testTag("content")
-                        )
-                    }
+                    DismissibleDrawerSheet { Box(Modifier.fillMaxSize().testTag("content")) }
                 },
                 content = {}
             )
         }
 
-        rule.onNodeWithTag("content")
-            .assertLeftPositionInRootIsEqualTo(0.dp)
+        rule.onNodeWithTag("content").assertLeftPositionInRootIsEqualTo(0.dp)
     }
 
     @Test
@@ -104,18 +96,15 @@
                 drawerState = drawerState,
                 drawerContent = {
                     DismissibleDrawerSheet(windowInsets = WindowInsets(7.dp, 7.dp, 7.dp, 7.dp)) {
-                        Box(
-                            Modifier
-                                .fillMaxSize()
-                                .testTag("content")
-                        )
+                        Box(Modifier.fillMaxSize().testTag("content"))
                     }
                 },
                 content = {}
             )
         }
 
-        rule.onNodeWithTag("content")
+        rule
+            .onNodeWithTag("content")
             .assertLeftPositionInRootIsEqualTo(7.dp)
             .assertTopPositionInRootIsEqualTo(7.dp)
     }
@@ -127,20 +116,13 @@
             DismissibleNavigationDrawer(
                 drawerState = drawerState,
                 drawerContent = {
-                    DismissibleDrawerSheet {
-                        Box(
-                            Modifier
-                                .fillMaxSize()
-                                .testTag("content")
-                        )
-                    }
+                    DismissibleDrawerSheet { Box(Modifier.fillMaxSize().testTag("content")) }
                 },
                 content = {}
             )
         }
 
-        rule.onNodeWithTag("content")
-            .assertLeftPositionInRootIsEqualTo(-NavigationDrawerWidth)
+        rule.onNodeWithTag("content").assertLeftPositionInRootIsEqualTo(-NavigationDrawerWidth)
     }
 
     @Test
@@ -152,19 +134,14 @@
                 drawerState = drawerState,
                 drawerContent = {
                     DismissibleDrawerSheet(Modifier.width(customWidth)) {
-                        Box(
-                            Modifier
-                                .fillMaxSize()
-                                .testTag("content")
-                        )
+                        Box(Modifier.fillMaxSize().testTag("content"))
                     }
                 },
                 content = {}
             )
         }
 
-        rule.onNodeWithTag("content")
-            .assertLeftPositionInRootIsEqualTo(0.dp)
+        rule.onNodeWithTag("content").assertLeftPositionInRootIsEqualTo(0.dp)
     }
 
     @Test
@@ -176,19 +153,14 @@
                 drawerState = drawerState,
                 drawerContent = {
                     DismissibleDrawerSheet(Modifier.width(customWidth)) {
-                        Box(
-                            Modifier
-                                .fillMaxSize()
-                                .testTag("content")
-                        )
+                        Box(Modifier.fillMaxSize().testTag("content"))
                     }
                 },
                 content = {}
             )
         }
 
-        rule.onNodeWithTag("content")
-            .assertLeftPositionInRootIsEqualTo(-customWidth)
+        rule.onNodeWithTag("content").assertLeftPositionInRootIsEqualTo(-customWidth)
     }
 
     @Test
@@ -204,13 +176,7 @@
                     drawerState = drawerState,
                     drawerContent = {
                         DismissibleDrawerSheet(Modifier.width(customWidth)) {
-                            Box(
-                                Modifier
-                                    .fillMaxSize()
-                                    .onGloballyPositioned {
-                                        coords = it
-                                    }
-                            )
+                            Box(Modifier.fillMaxSize().onGloballyPositioned { coords = it })
                         }
                     },
                     content = {}
@@ -218,9 +184,7 @@
             }
         }
 
-        rule.runOnIdle {
-            assertThat(coords.positionOnScreen().x).isEqualTo(0f)
-        }
+        rule.runOnIdle { assertThat(coords.positionOnScreen().x).isEqualTo(0f) }
     }
 
     @Test
@@ -236,13 +200,7 @@
                     drawerState = drawerState,
                     drawerContent = {
                         DismissibleDrawerSheet(Modifier.width(customWidth)) {
-                            Box(
-                                Modifier
-                                    .fillMaxSize()
-                                    .onGloballyPositioned {
-                                        coords = it
-                                    }
-                            )
+                            Box(Modifier.fillMaxSize().onGloballyPositioned { coords = it })
                         }
                     },
                     content = {}
@@ -264,20 +222,13 @@
             DismissibleNavigationDrawer(
                 drawerState = drawerState,
                 drawerContent = {
-                    DismissibleDrawerSheet {
-                        Box(
-                            Modifier
-                                .fillMaxSize()
-                                .testTag("content")
-                        )
-                    }
+                    DismissibleDrawerSheet { Box(Modifier.fillMaxSize().testTag("content")) }
                 },
                 content = {}
             )
         }
 
-        rule.onNodeWithTag("content")
-            .assertWidthIsEqualTo(NavigationDrawerWidth)
+        rule.onNodeWithTag("content").assertWidthIsEqualTo(NavigationDrawerWidth)
     }
 
     @Test
@@ -289,10 +240,7 @@
                 drawerState = rememberDrawerState(DrawerValue.Open),
                 drawerContent = {
                     DismissibleDrawerSheet(Modifier.testTag("navigationDrawerTag")) {
-                        Box(
-                            Modifier
-                                .fillMaxSize()
-                        )
+                        Box(Modifier.fillMaxSize())
                     }
                 },
                 content = {}
@@ -300,163 +248,158 @@
             navigationMenu = getString(Strings.NavigationMenu)
         }
 
-        rule.onNodeWithTag("navigationDrawerTag", useUnmergedTree = true)
+        rule
+            .onNodeWithTag("navigationDrawerTag", useUnmergedTree = true)
             .onParent()
             .assert(SemanticsMatcher.expectValue(SemanticsProperties.PaneTitle, navigationMenu))
     }
 
     @Test
     @LargeTest
-    fun dismissibleNavigationDrawer_openAndClose(): Unit = runBlocking(AutoTestFrameClock()) {
-        lateinit var drawerState: DrawerState
-        rule.setMaterialContent(lightColorScheme()) {
-            drawerState = rememberDrawerState(DrawerValue.Closed)
-            DismissibleNavigationDrawer(
-                drawerState = drawerState,
-                drawerContent = {
-                    DismissibleDrawerSheet {
-                        Box(
-                            Modifier
-                                .fillMaxSize()
-                                .testTag(DrawerTestTag)
-                        )
-                    }
-                },
-                content = {}
-            )
+    fun dismissibleNavigationDrawer_openAndClose(): Unit =
+        runBlocking(AutoTestFrameClock()) {
+            lateinit var drawerState: DrawerState
+            rule.setMaterialContent(lightColorScheme()) {
+                drawerState = rememberDrawerState(DrawerValue.Closed)
+                DismissibleNavigationDrawer(
+                    drawerState = drawerState,
+                    drawerContent = {
+                        DismissibleDrawerSheet {
+                            Box(Modifier.fillMaxSize().testTag(DrawerTestTag))
+                        }
+                    },
+                    content = {}
+                )
+            }
+
+            // Drawer should start in closed state
+            rule
+                .onNodeWithTag(DrawerTestTag)
+                .assertLeftPositionInRootIsEqualTo(-NavigationDrawerWidth)
+
+            // When the drawer state is set to Opened
+            drawerState.open()
+            // Then the drawer should be opened
+            rule.onNodeWithTag(DrawerTestTag).assertLeftPositionInRootIsEqualTo(0.dp)
+
+            // When the drawer state is set to Closed
+            drawerState.close()
+            // Then the drawer should be closed
+            rule
+                .onNodeWithTag(DrawerTestTag)
+                .assertLeftPositionInRootIsEqualTo(-NavigationDrawerWidth)
         }
 
-        // Drawer should start in closed state
-        rule.onNodeWithTag(DrawerTestTag).assertLeftPositionInRootIsEqualTo(-NavigationDrawerWidth)
-
-        // When the drawer state is set to Opened
-        drawerState.open()
-        // Then the drawer should be opened
-        rule.onNodeWithTag(DrawerTestTag).assertLeftPositionInRootIsEqualTo(0.dp)
-
-        // When the drawer state is set to Closed
-        drawerState.close()
-        // Then the drawer should be closed
-        rule.onNodeWithTag(DrawerTestTag).assertLeftPositionInRootIsEqualTo(-NavigationDrawerWidth)
-    }
-
     @Test
     @LargeTest
-    fun dismissibleNavigationDrawer_animateTo(): Unit = runBlocking(AutoTestFrameClock()) {
-        lateinit var drawerState: DrawerState
-        rule.setMaterialContent(lightColorScheme()) {
-            drawerState = rememberDrawerState(DrawerValue.Closed)
-            DismissibleNavigationDrawer(
-                drawerState = drawerState,
-                drawerContent = {
-                    DismissibleDrawerSheet {
-                        Box(
-                            Modifier
-                                .fillMaxSize()
-                                .testTag(DrawerTestTag)
-                        )
-                    }
-                },
-                content = {}
-            )
+    fun dismissibleNavigationDrawer_animateTo(): Unit =
+        runBlocking(AutoTestFrameClock()) {
+            lateinit var drawerState: DrawerState
+            rule.setMaterialContent(lightColorScheme()) {
+                drawerState = rememberDrawerState(DrawerValue.Closed)
+                DismissibleNavigationDrawer(
+                    drawerState = drawerState,
+                    drawerContent = {
+                        DismissibleDrawerSheet {
+                            Box(Modifier.fillMaxSize().testTag(DrawerTestTag))
+                        }
+                    },
+                    content = {}
+                )
+            }
+
+            // Drawer should start in closed state
+            rule
+                .onNodeWithTag(DrawerTestTag)
+                .assertLeftPositionInRootIsEqualTo(-NavigationDrawerWidth)
+
+            // When the drawer state is set to Opened
+            @Suppress("DEPRECATION") // animateTo is deprecated, but we are testing it
+            drawerState.animateTo(DrawerValue.Open, TweenSpec())
+            // Then the drawer should be opened
+            rule.onNodeWithTag(DrawerTestTag).assertLeftPositionInRootIsEqualTo(0.dp)
+
+            // When the drawer state is set to Closed
+            @Suppress("DEPRECATION") // animateTo is deprecated, but we are testing it
+            drawerState.animateTo(DrawerValue.Closed, TweenSpec())
+            // Then the drawer should be closed
+            rule
+                .onNodeWithTag(DrawerTestTag)
+                .assertLeftPositionInRootIsEqualTo(-NavigationDrawerWidth)
         }
 
-        // Drawer should start in closed state
-        rule.onNodeWithTag(DrawerTestTag).assertLeftPositionInRootIsEqualTo(-NavigationDrawerWidth)
-
-        // When the drawer state is set to Opened
-        @Suppress("DEPRECATION") // animateTo is deprecated, but we are testing it
-        drawerState.animateTo(DrawerValue.Open, TweenSpec())
-        // Then the drawer should be opened
-        rule.onNodeWithTag(DrawerTestTag).assertLeftPositionInRootIsEqualTo(0.dp)
-
-        // When the drawer state is set to Closed
-        @Suppress("DEPRECATION") // animateTo is deprecated, but we are testing it
-        drawerState.animateTo(DrawerValue.Closed, TweenSpec())
-        // Then the drawer should be closed
-        rule.onNodeWithTag(DrawerTestTag).assertLeftPositionInRootIsEqualTo(-NavigationDrawerWidth)
-    }
-
     @Test
     @LargeTest
-    fun dismissibleNavigationDrawer_snapTo(): Unit = runBlocking(AutoTestFrameClock()) {
-        lateinit var drawerState: DrawerState
-        rule.setMaterialContent(lightColorScheme()) {
-            drawerState = rememberDrawerState(DrawerValue.Closed)
-            DismissibleNavigationDrawer(
-                drawerState = drawerState,
-                drawerContent = {
-                    DismissibleDrawerSheet {
-                        Box(
-                            Modifier
-                                .fillMaxSize()
-                                .testTag(DrawerTestTag)
-                        )
-                    }
-                },
-                content = {}
-            )
+    fun dismissibleNavigationDrawer_snapTo(): Unit =
+        runBlocking(AutoTestFrameClock()) {
+            lateinit var drawerState: DrawerState
+            rule.setMaterialContent(lightColorScheme()) {
+                drawerState = rememberDrawerState(DrawerValue.Closed)
+                DismissibleNavigationDrawer(
+                    drawerState = drawerState,
+                    drawerContent = {
+                        DismissibleDrawerSheet {
+                            Box(Modifier.fillMaxSize().testTag(DrawerTestTag))
+                        }
+                    },
+                    content = {}
+                )
+            }
+
+            // Drawer should start in closed state
+            rule
+                .onNodeWithTag(DrawerTestTag)
+                .assertLeftPositionInRootIsEqualTo(-NavigationDrawerWidth)
+
+            // When the drawer state is set to Opened
+            drawerState.snapTo(DrawerValue.Open)
+            // Then the drawer should be opened
+            rule.onNodeWithTag(DrawerTestTag).assertLeftPositionInRootIsEqualTo(0.dp)
+
+            // When the drawer state is set to Closed
+            drawerState.snapTo(DrawerValue.Closed)
+            // Then the drawer should be closed
+            rule
+                .onNodeWithTag(DrawerTestTag)
+                .assertLeftPositionInRootIsEqualTo(-NavigationDrawerWidth)
         }
 
-        // Drawer should start in closed state
-        rule.onNodeWithTag(DrawerTestTag).assertLeftPositionInRootIsEqualTo(-NavigationDrawerWidth)
-
-        // When the drawer state is set to Opened
-        drawerState.snapTo(DrawerValue.Open)
-        // Then the drawer should be opened
-        rule.onNodeWithTag(DrawerTestTag).assertLeftPositionInRootIsEqualTo(0.dp)
-
-        // When the drawer state is set to Closed
-        drawerState.snapTo(DrawerValue.Closed)
-        // Then the drawer should be closed
-        rule.onNodeWithTag(DrawerTestTag).assertLeftPositionInRootIsEqualTo(-NavigationDrawerWidth)
-    }
-
     @Test
     @LargeTest
-    fun dismissibleNavigationDrawer_currentValue(): Unit = runBlocking(AutoTestFrameClock()) {
-        lateinit var drawerState: DrawerState
-        rule.setMaterialContent(lightColorScheme()) {
-            drawerState = rememberDrawerState(DrawerValue.Closed)
-            DismissibleNavigationDrawer(
-                drawerState = drawerState,
-                drawerContent = {
-                    DismissibleDrawerSheet {
-                        Box(
-                            Modifier
-                                .fillMaxSize()
-                                .testTag(DrawerTestTag)
-                        )
-                    }
-                },
-                content = {}
-            )
-        }
+    fun dismissibleNavigationDrawer_currentValue(): Unit =
+        runBlocking(AutoTestFrameClock()) {
+            lateinit var drawerState: DrawerState
+            rule.setMaterialContent(lightColorScheme()) {
+                drawerState = rememberDrawerState(DrawerValue.Closed)
+                DismissibleNavigationDrawer(
+                    drawerState = drawerState,
+                    drawerContent = {
+                        DismissibleDrawerSheet {
+                            Box(Modifier.fillMaxSize().testTag(DrawerTestTag))
+                        }
+                    },
+                    content = {}
+                )
+            }
 
-        // Drawer should start in closed state
-        assertThat(drawerState.currentValue).isEqualTo(DrawerValue.Closed)
-
-        // When the drawer state is set to Opened
-        drawerState.snapTo(DrawerValue.Open)
-        // Then the drawer should be opened
-        rule.runOnIdle {
-            assertThat(drawerState.currentValue).isEqualTo(DrawerValue.Open)
-        }
-
-        // When the drawer state is set to Closed
-        drawerState.snapTo(DrawerValue.Closed)
-        // Then the drawer should be closed
-        rule.runOnIdle {
+            // Drawer should start in closed state
             assertThat(drawerState.currentValue).isEqualTo(DrawerValue.Closed)
+
+            // When the drawer state is set to Opened
+            drawerState.snapTo(DrawerValue.Open)
+            // Then the drawer should be opened
+            rule.runOnIdle { assertThat(drawerState.currentValue).isEqualTo(DrawerValue.Open) }
+
+            // When the drawer state is set to Closed
+            drawerState.snapTo(DrawerValue.Closed)
+            // Then the drawer should be closed
+            rule.runOnIdle { assertThat(drawerState.currentValue).isEqualTo(DrawerValue.Closed) }
         }
-    }
 
     @Test
     @LargeTest
     fun dismissibleNavigationDrawer_drawerContent_doesntPropagateClicksWhenOpen(): Unit =
-        runBlocking(
-            AutoTestFrameClock()
-        ) {
+        runBlocking(AutoTestFrameClock()) {
             var bodyClicks = 0
             lateinit var drawerState: DrawerState
             rule.setMaterialContent(lightColorScheme()) {
@@ -465,38 +408,23 @@
                     drawerState = drawerState,
                     drawerContent = {
                         DismissibleDrawerSheet {
-                            Box(
-                                Modifier
-                                    .fillMaxSize()
-                                    .testTag(DrawerTestTag)
-                            )
+                            Box(Modifier.fillMaxSize().testTag(DrawerTestTag))
                         }
                     },
-                    content = {
-                        Box(
-                            Modifier
-                                .fillMaxSize()
-                                .clickable { bodyClicks += 1 })
-                    }
+                    content = { Box(Modifier.fillMaxSize().clickable { bodyClicks += 1 }) }
                 )
             }
 
             // Click in the middle of the drawer
             rule.onNodeWithTag(DrawerTestTag).performClick()
 
-            rule.runOnIdle {
-                assertThat(bodyClicks).isEqualTo(1)
-            }
+            rule.runOnIdle { assertThat(bodyClicks).isEqualTo(1) }
             drawerState.open()
 
             // Click on the left-center pixel of the drawer
-            rule.onNodeWithTag(DrawerTestTag).performTouchInput {
-                click(centerLeft)
-            }
+            rule.onNodeWithTag(DrawerTestTag).performTouchInput { click(centerLeft) }
 
-            rule.runOnIdle {
-                assertThat(bodyClicks).isEqualTo(1)
-            }
+            rule.runOnIdle { assertThat(bodyClicks).isEqualTo(1) }
         }
 
     @Test
@@ -510,37 +438,21 @@
                     drawerState = drawerState,
                     drawerContent = {
                         DismissibleDrawerSheet {
-                            Box(
-                                Modifier
-                                    .fillMaxSize()
-                                    .background(color = Color.Magenta)
-                            )
+                            Box(Modifier.fillMaxSize().background(color = Color.Magenta))
                         }
                     },
-                    content = {
-                        Box(
-                            Modifier
-                                .fillMaxSize()
-                                .background(color = Color.Red)
-                        )
-                    }
+                    content = { Box(Modifier.fillMaxSize().background(color = Color.Red)) }
                 )
             }
         }
 
-        rule.onNodeWithTag(DrawerTestTag)
-            .performTouchInput { swipeRight() }
+        rule.onNodeWithTag(DrawerTestTag).performTouchInput { swipeRight() }
 
-        rule.runOnIdle {
-            assertThat(drawerState.currentValue).isEqualTo(DrawerValue.Open)
-        }
+        rule.runOnIdle { assertThat(drawerState.currentValue).isEqualTo(DrawerValue.Open) }
 
-        rule.onNodeWithTag(DrawerTestTag)
-            .performTouchInput { swipeLeft() }
+        rule.onNodeWithTag(DrawerTestTag).performTouchInput { swipeLeft() }
 
-        rule.runOnIdle {
-            assertThat(drawerState.currentValue).isEqualTo(DrawerValue.Closed)
-        }
+        rule.runOnIdle { assertThat(drawerState.currentValue).isEqualTo(DrawerValue.Closed) }
     }
 
     @Test
@@ -548,50 +460,35 @@
     fun dismissibleNavigationDrawer_confirmStateChangeRespect() {
         lateinit var drawerState: DrawerState
         rule.setMaterialContent(lightColorScheme()) {
-            drawerState = rememberDrawerState(
-                DrawerValue.Open,
-                confirmStateChange = {
-                    it != DrawerValue.Closed
-                }
-            )
+            drawerState =
+                rememberDrawerState(
+                    DrawerValue.Open,
+                    confirmStateChange = { it != DrawerValue.Closed }
+                )
             Box(Modifier.testTag(DrawerTestTag)) {
                 DismissibleNavigationDrawer(
                     drawerState = drawerState,
                     drawerContent = {
                         DismissibleDrawerSheet(Modifier.testTag("content")) {
-                            Box(
-                                Modifier
-                                    .fillMaxSize()
-                                    .background(color = Color.Magenta)
-                            )
+                            Box(Modifier.fillMaxSize().background(color = Color.Magenta))
                         }
                     },
-                    content = {
-                        Box(
-                            Modifier
-                                .fillMaxSize()
-                                .background(color = Color.Red)
-                        )
-                    }
+                    content = { Box(Modifier.fillMaxSize().background(color = Color.Red)) }
                 )
             }
         }
 
-        rule.onNodeWithTag(DrawerTestTag)
-            .performTouchInput { swipeLeft() }
+        rule.onNodeWithTag(DrawerTestTag).performTouchInput { swipeLeft() }
 
         // still open
-        rule.runOnIdle {
-            assertThat(drawerState.currentValue).isEqualTo(DrawerValue.Open)
-        }
+        rule.runOnIdle { assertThat(drawerState.currentValue).isEqualTo(DrawerValue.Open) }
 
-        rule.onNodeWithTag("content", useUnmergedTree = true)
+        rule
+            .onNodeWithTag("content", useUnmergedTree = true)
             .onParent()
             .performSemanticsAction(SemanticsActions.Dismiss)
 
-        rule.runOnIdle {
-            assertThat(drawerState.currentValue).isEqualTo(DrawerValue.Open)
-        }
+        rule.runOnIdle { assertThat(drawerState.currentValue).isEqualTo(DrawerValue.Open) }
     }
 
     @Test
@@ -607,46 +504,28 @@
                         drawerState = drawerState,
                         drawerContent = {
                             DismissibleDrawerSheet {
-                                Box(
-                                    Modifier
-                                        .fillMaxSize()
-                                        .background(color = Color.Magenta)
-                                )
+                                Box(Modifier.fillMaxSize().background(color = Color.Magenta))
                             }
                         },
-                        content = {
-                            Box(
-                                Modifier
-                                    .fillMaxSize()
-                                    .background(color = Color.Red)
-                            )
-                        }
+                        content = { Box(Modifier.fillMaxSize().background(color = Color.Red)) }
                     )
                 }
             }
         }
 
-        rule.onNodeWithTag(DrawerTestTag)
-            .performTouchInput { swipeLeft() }
+        rule.onNodeWithTag(DrawerTestTag).performTouchInput { swipeLeft() }
 
-        rule.runOnIdle {
-            assertThat(drawerState.currentValue).isEqualTo(DrawerValue.Open)
-        }
+        rule.runOnIdle { assertThat(drawerState.currentValue).isEqualTo(DrawerValue.Open) }
 
-        rule.onNodeWithTag(DrawerTestTag)
-            .performTouchInput { swipeRight() }
+        rule.onNodeWithTag(DrawerTestTag).performTouchInput { swipeRight() }
 
-        rule.runOnIdle {
-            assertThat(drawerState.currentValue).isEqualTo(DrawerValue.Closed)
-        }
+        rule.runOnIdle { assertThat(drawerState.currentValue).isEqualTo(DrawerValue.Closed) }
     }
 
     @Test
     @LargeTest
     fun dismissibleNavigationDrawer_noDismissActionWhenClosed_hasDismissActionWhenOpen(): Unit =
-        runBlocking(
-            AutoTestFrameClock()
-        ) {
+        runBlocking(AutoTestFrameClock()) {
             lateinit var drawerState: DrawerState
             rule.setMaterialContent(lightColorScheme()) {
                 drawerState = rememberDrawerState(DrawerValue.Closed)
@@ -654,10 +533,7 @@
                     drawerState = drawerState,
                     drawerContent = {
                         DismissibleDrawerSheet(Modifier.testTag(DrawerTestTag)) {
-                            Box(
-                                Modifier
-                                    .fillMaxSize()
-                            )
+                            Box(Modifier.fillMaxSize())
                         }
                     },
                     content = {}
@@ -665,23 +541,27 @@
             }
 
             // Drawer should start in closed state and have no dismiss action
-            rule.onNodeWithTag(DrawerTestTag, useUnmergedTree = true)
+            rule
+                .onNodeWithTag(DrawerTestTag, useUnmergedTree = true)
                 .onParent()
                 .assert(SemanticsMatcher.keyNotDefined(SemanticsActions.Dismiss))
 
             // When the drawer state is set to Opened
             drawerState.open()
             // Then the drawer should be opened and have dismiss action
-            rule.onNodeWithTag(DrawerTestTag, useUnmergedTree = true)
+            rule
+                .onNodeWithTag(DrawerTestTag, useUnmergedTree = true)
                 .onParent()
                 .assert(SemanticsMatcher.keyIsDefined(SemanticsActions.Dismiss))
 
             // When the drawer state is set to Closed using dismiss action
-            rule.onNodeWithTag(DrawerTestTag, useUnmergedTree = true)
+            rule
+                .onNodeWithTag(DrawerTestTag, useUnmergedTree = true)
                 .onParent()
                 .performSemanticsAction(SemanticsActions.Dismiss)
             // Then the drawer should be closed and have no dismiss action
-            rule.onNodeWithTag(DrawerTestTag, useUnmergedTree = true)
+            rule
+                .onNodeWithTag(DrawerTestTag, useUnmergedTree = true)
                 .onParent()
                 .assert(SemanticsMatcher.keyNotDefined(SemanticsActions.Dismiss))
         }
diff --git a/compose/material3/material3/src/androidInstrumentedTest/kotlin/androidx/compose/material3/DividerScreenshotTest.kt b/compose/material3/material3/src/androidInstrumentedTest/kotlin/androidx/compose/material3/DividerScreenshotTest.kt
index 4f1b8d0..88ad50d 100644
--- a/compose/material3/material3/src/androidInstrumentedTest/kotlin/androidx/compose/material3/DividerScreenshotTest.kt
+++ b/compose/material3/material3/src/androidInstrumentedTest/kotlin/androidx/compose/material3/DividerScreenshotTest.kt
@@ -45,11 +45,9 @@
 @SdkSuppress(minSdkVersion = Build.VERSION_CODES.O)
 class DividerScreenshotTest {
 
-    @get:Rule
-    val composeTestRule = createComposeRule()
+    @get:Rule val composeTestRule = createComposeRule()
 
-    @get:Rule
-    val screenshotRule = AndroidXScreenshotTestRule(GOLDEN_MATERIAL3)
+    @get:Rule val screenshotRule = AndroidXScreenshotTestRule(GOLDEN_MATERIAL3)
 
     private val Tag = "Divider"
 
@@ -62,7 +60,8 @@
                 Spacer(Modifier.size(10.dp))
             }
         }
-        composeTestRule.onNodeWithTag(Tag)
+        composeTestRule
+            .onNodeWithTag(Tag)
             .captureToImage()
             .assertAgainstGolden(screenshotRule, "divider_lightTheme")
     }
@@ -79,7 +78,8 @@
                 Spacer(Modifier.size(10.dp))
             }
         }
-        composeTestRule.onNodeWithTag(Tag)
+        composeTestRule
+            .onNodeWithTag(Tag)
             .captureToImage()
             .assertAgainstGolden(screenshotRule, "divider_darkTheme")
     }
@@ -93,7 +93,8 @@
                 Spacer(Modifier.size(10.dp))
             }
         }
-        composeTestRule.onNodeWithTag(Tag)
+        composeTestRule
+            .onNodeWithTag(Tag)
             .captureToImage()
             .assertAgainstGolden(screenshotRule, "divider_vertical_lightTheme")
     }
@@ -107,7 +108,8 @@
                 Spacer(Modifier.size(10.dp))
             }
         }
-        composeTestRule.onNodeWithTag(Tag)
+        composeTestRule
+            .onNodeWithTag(Tag)
             .captureToImage()
             .assertAgainstGolden(screenshotRule, "divider_hairlineThickness")
     }
diff --git a/compose/material3/material3/src/androidInstrumentedTest/kotlin/androidx/compose/material3/DividerTest.kt b/compose/material3/material3/src/androidInstrumentedTest/kotlin/androidx/compose/material3/DividerTest.kt
index e010f7c..6803bf9 100644
--- a/compose/material3/material3/src/androidInstrumentedTest/kotlin/androidx/compose/material3/DividerTest.kt
+++ b/compose/material3/material3/src/androidInstrumentedTest/kotlin/androidx/compose/material3/DividerTest.kt
@@ -35,17 +35,14 @@
 @RunWith(AndroidJUnit4::class)
 class DividerTest {
 
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
     private val defaultThickness = 1.dp
 
     @Test
     fun horizontalDivider_defaultSize() {
         rule
-            .setMaterialContentForSizeAssertions {
-                HorizontalDivider()
-            }
+            .setMaterialContentForSizeAssertions { HorizontalDivider() }
             .assertHeightIsEqualTo(defaultThickness)
             .assertWidthIsEqualTo(rule.rootWidth())
     }
@@ -54,9 +51,7 @@
     fun horizontalDivider_customSize() {
         val thickness = 20.dp
         rule
-            .setMaterialContentForSizeAssertions {
-                HorizontalDivider(thickness = thickness)
-            }
+            .setMaterialContentForSizeAssertions { HorizontalDivider(thickness = thickness) }
             .assertWidthIsEqualTo(rule.rootWidth())
             .assertHeightIsEqualTo(thickness)
     }
@@ -64,9 +59,7 @@
     @Test
     fun verticalDivider_defaultSize() {
         rule
-            .setMaterialContentForSizeAssertions {
-                VerticalDivider()
-            }
+            .setMaterialContentForSizeAssertions { VerticalDivider() }
             .assertHeightIsEqualTo(rule.rootHeight())
             .assertWidthIsEqualTo(defaultThickness)
     }
@@ -75,9 +68,7 @@
     fun verticalDivider_customSize() {
         val thickness = 20.dp
         rule
-            .setMaterialContentForSizeAssertions {
-                VerticalDivider(thickness = thickness)
-            }
+            .setMaterialContentForSizeAssertions { VerticalDivider(thickness = thickness) }
             .assertWidthIsEqualTo(thickness)
             .assertHeightIsEqualTo(rule.rootHeight())
     }
diff --git a/compose/material3/material3/src/androidInstrumentedTest/kotlin/androidx/compose/material3/ExposedDropdownMenuTest.kt b/compose/material3/material3/src/androidInstrumentedTest/kotlin/androidx/compose/material3/ExposedDropdownMenuTest.kt
index ef18ca2..34b5307 100644
--- a/compose/material3/material3/src/androidInstrumentedTest/kotlin/androidx/compose/material3/ExposedDropdownMenuTest.kt
+++ b/compose/material3/material3/src/androidInstrumentedTest/kotlin/androidx/compose/material3/ExposedDropdownMenuTest.kt
@@ -89,8 +89,7 @@
 @RunWith(AndroidJUnit4::class)
 class ExposedDropdownMenuTest {
 
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
     private val TFTag = "TextFieldTag"
     private val TrailingIconTag = "TrailingIconTag"
@@ -106,9 +105,8 @@
             ExposedDropdownMenuForTest(
                 expanded = expanded,
                 onExpandChange = { expanded = it },
-                textFieldModifier = Modifier.onGloballyPositioned {
-                    textFieldBounds = it.boundsInRoot()
-                }
+                textFieldModifier =
+                    Modifier.onGloballyPositioned { textFieldBounds = it.boundsInRoot() }
             )
         }
 
@@ -121,10 +119,11 @@
         rule.onNodeWithTag(MenuItemTag).assertIsDisplayed()
 
         // Click outside EDM
-        UiDevice.getInstance(InstrumentationRegistry.getInstrumentation()).click(
-            (textFieldBounds.right + 1).toInt(),
-            (textFieldBounds.bottom + 1).toInt(),
-        )
+        UiDevice.getInstance(InstrumentationRegistry.getInstrumentation())
+            .click(
+                (textFieldBounds.right + 1).toInt(),
+                (textFieldBounds.bottom + 1).toInt(),
+            )
 
         rule.onNodeWithTag(MenuItemTag).assertDoesNotExist()
     }
@@ -133,10 +132,7 @@
     fun edm_collapsesOnTextFieldClick() {
         rule.setMaterialContent(lightColorScheme()) {
             var expanded by remember { mutableStateOf(true) }
-            ExposedDropdownMenuForTest(
-                expanded = expanded,
-                onExpandChange = { expanded = it }
-            )
+            ExposedDropdownMenuForTest(expanded = expanded, onExpandChange = { expanded = it })
         }
 
         rule.onNodeWithTag(TFTag).assertIsDisplayed()
@@ -269,9 +265,7 @@
         }
 
         val matcher = hasText("zzz")
-        rule.waitUntil {
-            matcher.matches(rule.onNodeWithTag(TFTag).fetchSemanticsNode())
-        }
+        rule.waitUntil { matcher.matches(rule.onNodeWithTag(TFTag).fetchSemanticsNode()) }
         rule.onNodeWithTag(MenuItemTag).assertIsDisplayed()
     }
 
@@ -303,9 +297,8 @@
             ExposedDropdownMenuForTest(
                 expanded = expanded,
                 onExpandChange = { expanded = it },
-                textFieldModifier = Modifier.onGloballyPositioned {
-                    textFieldBounds = it.boundsInRoot()
-                }
+                textFieldModifier =
+                    Modifier.onGloballyPositioned { textFieldBounds = it.boundsInRoot() }
             )
         }
 
@@ -352,17 +345,17 @@
                         modifier = Modifier.padding(8.dp),
                     ) {
                         TextField(
-                            modifier = Modifier
-                                .menuAnchor(MenuAnchorType.PrimaryEditable)
-                                .then(
-                                    if (index == testIndex) Modifier
-                                        .testTag(TFTag)
-                                        .onSizeChanged {
-                                            textFieldSize = it
-                                        } else {
-                                        Modifier
-                                    }
-                                ),
+                            modifier =
+                                Modifier.menuAnchor(MenuAnchorType.PrimaryEditable)
+                                    .then(
+                                        if (index == testIndex)
+                                            Modifier.testTag(TFTag).onSizeChanged {
+                                                textFieldSize = it
+                                            }
+                                        else {
+                                            Modifier
+                                        }
+                                    ),
                             value = selectedOptionText,
                             onValueChange = { selectedOptionText = it },
                             label = { Text("Label") },
@@ -370,9 +363,12 @@
                             colors = ExposedDropdownMenuDefaults.textFieldColors()
                         )
                         ExposedDropdownMenu(
-                            modifier = if (index == testIndex) {
-                                Modifier.testTag(EDMTag)
-                            } else { Modifier },
+                            modifier =
+                                if (index == testIndex) {
+                                    Modifier.testTag(EDMTag)
+                                } else {
+                                    Modifier
+                                },
                             expanded = expanded,
                             onDismissRequest = { expanded = false }
                         ) {
@@ -382,9 +378,12 @@
                                     selectedOptionText = OptionName
                                     expanded = false
                                 },
-                                modifier = if (index == testIndex) {
-                                    Modifier.testTag(MenuItemTag)
-                                } else { Modifier },
+                                modifier =
+                                    if (index == testIndex) {
+                                        Modifier.testTag(MenuItemTag)
+                                    } else {
+                                        Modifier
+                                    },
                             )
                         }
                     }
@@ -445,9 +444,7 @@
                         onDismissRequest = {},
                         content = {},
                     )
-                    SideEffect {
-                        compositionCount++
-                    }
+                    SideEffect { compositionCount++ }
                 }
 
                 Spacer(Modifier.height(300.dp))
@@ -456,11 +453,7 @@
 
         assertThat(compositionCount).isEqualTo(1)
 
-        rule.runOnIdle {
-            scope.launch {
-                scrollState.animateScrollBy(500f)
-            }
-        }
+        rule.runOnIdle { scope.launch { scrollState.animateScrollBy(500f) } }
         rule.waitForIdle()
 
         assertThat(compositionCount).isEqualTo(1)
@@ -475,35 +468,27 @@
             ExposedDropdownMenuForTest(
                 expanded = expanded,
                 onExpandChange = { expanded = it },
-                textFieldModifier = Modifier
-                    // Make text field nearly full screen width to test that
-                    // menu is not limited by the default system popup width
-                    .fillMaxWidth(fraction = 0.98f)
-                    .onGloballyPositioned {
-                        textFieldBounds = it.boundsInRoot()
-                    },
-                menuModifier = Modifier.onGloballyPositioned {
-                    menuBounds = it.boundsInRoot()
-                }
+                textFieldModifier =
+                    Modifier
+                        // Make text field nearly full screen width to test that
+                        // menu is not limited by the default system popup width
+                        .fillMaxWidth(fraction = 0.98f)
+                        .onGloballyPositioned { textFieldBounds = it.boundsInRoot() },
+                menuModifier = Modifier.onGloballyPositioned { menuBounds = it.boundsInRoot() }
             )
         }
 
         rule.onNodeWithTag(TFTag).assertIsDisplayed()
         rule.onNodeWithTag(MenuItemTag).assertIsDisplayed()
 
-        rule.runOnIdle {
-            assertThat(menuBounds.width).isEqualTo(textFieldBounds.width)
-        }
+        rule.runOnIdle { assertThat(menuBounds.width).isEqualTo(textFieldBounds.width) }
     }
 
     @Test
     fun edm_collapsesWithSelection_whenMenuItemClicked() {
         rule.setMaterialContent(lightColorScheme()) {
             var expanded by remember { mutableStateOf(true) }
-            ExposedDropdownMenuForTest(
-                expanded = expanded,
-                onExpandChange = { expanded = it }
-            )
+            ExposedDropdownMenuForTest(expanded = expanded, onExpandChange = { expanded = it })
         }
 
         rule.onNodeWithTag(TFTag).assertIsDisplayed()
@@ -530,35 +515,27 @@
                 // Push the EDM down so opening the keyboard causes a pan/scroll
                 Spacer(Modifier.weight(1f))
 
-                ExposedDropdownMenuBox(
-                    expanded = true,
-                    onExpandedChange = { }
-                ) {
+                ExposedDropdownMenuBox(expanded = true, onExpandedChange = {}) {
                     TextField(
                         modifier = Modifier.menuAnchor(MenuAnchorType.PrimaryEditable),
                         value = "",
-                        onValueChange = { },
+                        onValueChange = {},
                         label = { Text("Label") },
                     )
                     ExposedDropdownMenu(
                         expanded = true,
-                        onDismissRequest = { },
-                        modifier = Modifier.onGloballyPositioned {
-                            actualMenuSize = it.size
-                        }
+                        onDismissRequest = {},
+                        modifier = Modifier.onGloballyPositioned { actualMenuSize = it.size }
                     ) {
-                        repeat(itemCount) {
-                            Box(Modifier.size(itemSize))
-                        }
+                        repeat(itemCount) { Box(Modifier.size(itemSize)) }
                     }
                 }
             }
         }
 
         // This would fit on screen if the keyboard wasn't displayed.
-        val menuPreferredHeight = with(density!!) {
-            (itemSize * itemCount + DropdownMenuVerticalPadding * 2).roundToPx()
-        }
+        val menuPreferredHeight =
+            with(density!!) { (itemSize * itemCount + DropdownMenuVerticalPadding * 2).roundToPx() }
         // But the keyboard *is* displayed, forcing the actual size to be smaller.
         assertThat(actualMenuSize!!.height).isLessThan(menuPreferredHeight)
     }
@@ -569,36 +546,43 @@
         rule.setMaterialContent(lightColorScheme()) {
             AndroidView(
                 factory = { context ->
-                    FrameLayout(context).apply {
-                        addView(ComposeView(context).apply {
-                            setContent {
-                                ExposedDropdownMenuBox(expanded = true, onExpandedChange = {}) {
-                                    TextField(
-                                        value = "Text",
-                                        onValueChange = {},
-                                        modifier =
-                                            Modifier.menuAnchor(MenuAnchorType.PrimaryEditable),
-                                    )
-                                    ExposedDropdownMenu(
-                                        expanded = true,
-                                        onDismissRequest = {},
-                                    ) {
-                                        DropdownMenuItem(
-                                            text = { Text(OptionName) },
-                                            onClick = {},
-                                        )
+                    FrameLayout(context)
+                        .apply {
+                            addView(
+                                ComposeView(context).apply {
+                                    setContent {
+                                        ExposedDropdownMenuBox(
+                                            expanded = true,
+                                            onExpandedChange = {}
+                                        ) {
+                                            TextField(
+                                                value = "Text",
+                                                onValueChange = {},
+                                                modifier =
+                                                    Modifier.menuAnchor(
+                                                        MenuAnchorType.PrimaryEditable
+                                                    ),
+                                            )
+                                            ExposedDropdownMenu(
+                                                expanded = true,
+                                                onDismissRequest = {},
+                                            ) {
+                                                DropdownMenuItem(
+                                                    text = { Text(OptionName) },
+                                                    onClick = {},
+                                                )
+                                            }
+                                        }
                                     }
                                 }
-                            }
-                        })
-                    }.also { parent = it }
+                            )
+                        }
+                        .also { parent = it }
                 }
             )
         }
 
-        rule.runOnIdle {
-            parent!!.removeAllViews()
-        }
+        rule.runOnIdle { parent!!.removeAllViews() }
 
         rule.waitForIdle()
 
@@ -614,18 +598,18 @@
                 ExposedDropdownMenuBox(
                     modifier = Modifier.align(Alignment.Center),
                     expanded = true,
-                    onExpandedChange = { }
+                    onExpandedChange = {}
                 ) {
                     scrollState = rememberScrollState()
                     TextField(
                         modifier = Modifier.menuAnchor(MenuAnchorType.PrimaryEditable),
                         value = "",
-                        onValueChange = { },
+                        onValueChange = {},
                         label = { Text("Label") },
                     )
                     ExposedDropdownMenu(
                         expanded = true,
-                        onDismissRequest = { },
+                        onDismissRequest = {},
                         scrollState = scrollState
                     ) {
                         repeat(100) {
@@ -639,11 +623,7 @@
             }
         }
 
-        rule.runOnIdle {
-            runBlocking {
-                scrollState.scrollTo(scrollState.maxValue)
-            }
-        }
+        rule.runOnIdle { runBlocking { scrollState.scrollTo(scrollState.maxValue) } }
 
         rule.waitForIdle()
 
@@ -656,11 +636,12 @@
         rule.setMaterialContent(lightColorScheme()) {
             ExposedDropdownMenuForTest(
                 expanded = false,
-                onExpandChange = { },
+                onExpandChange = {},
             )
         }
 
-        rule.onNodeWithTag(TFTag)
+        rule
+            .onNodeWithTag(TFTag)
             .assert(SemanticsMatcher.expectValue(SemanticsProperties.Role, Role.DropdownList))
     }
 
@@ -674,66 +655,78 @@
         val verticalMargin = with(density) { MenuVerticalMargin.roundToPx() }
         val layoutDirection = LayoutDirection.Ltr
 
-        val edmPositionProvider = ExposedDropdownMenuPositionProvider(
-            density = density,
-            topWindowInsets = topWindowInsets,
-        )
+        val edmPositionProvider =
+            ExposedDropdownMenuPositionProvider(
+                density = density,
+                topWindowInsets = topWindowInsets,
+            )
 
         // typical case
         assertThat(
-            edmPositionProvider.calculatePosition(
-                anchorBounds = IntRect(
-                    size = anchorSize,
-                    offset = IntOffset(0, 0),
-                ),
-                windowSize = windowSize,
-                popupContentSize = popupSize,
-                layoutDirection = layoutDirection,
+                edmPositionProvider.calculatePosition(
+                    anchorBounds =
+                        IntRect(
+                            size = anchorSize,
+                            offset = IntOffset(0, 0),
+                        ),
+                    windowSize = windowSize,
+                    popupContentSize = popupSize,
+                    layoutDirection = layoutDirection,
+                )
             )
-        ).isEqualTo(IntOffset(0, anchorSize.height))
+            .isEqualTo(IntOffset(0, anchorSize.height))
 
         // off-screen (above)
         assertThat(
-            edmPositionProvider.calculatePosition(
-                anchorBounds = IntRect(
-                    size = anchorSize,
-                    offset = IntOffset(0, -150),
-                ),
-                windowSize = windowSize,
-                popupContentSize = popupSize,
-                layoutDirection = layoutDirection,
+                edmPositionProvider.calculatePosition(
+                    anchorBounds =
+                        IntRect(
+                            size = anchorSize,
+                            offset = IntOffset(0, -150),
+                        ),
+                    windowSize = windowSize,
+                    popupContentSize = popupSize,
+                    layoutDirection = layoutDirection,
+                )
             )
-        ).isEqualTo(IntOffset(0, verticalMargin))
+            .isEqualTo(IntOffset(0, verticalMargin))
 
         // interacting with window insets
         assertThat(
-            edmPositionProvider.calculatePosition(
-                anchorBounds = IntRect(
-                    size = anchorSize,
-                    // If it weren't for topWindowInsets allowance,
-                    // the menu would be considered "off-screen"
-                    offset = IntOffset(0, 100),
-                ),
-                windowSize = windowSize,
-                popupContentSize = popupSize,
-                layoutDirection = layoutDirection,
+                edmPositionProvider.calculatePosition(
+                    anchorBounds =
+                        IntRect(
+                            size = anchorSize,
+                            // If it weren't for topWindowInsets allowance,
+                            // the menu would be considered "off-screen"
+                            offset = IntOffset(0, 100),
+                        ),
+                    windowSize = windowSize,
+                    popupContentSize = popupSize,
+                    layoutDirection = layoutDirection,
+                )
             )
-        ).isEqualTo(IntOffset(0, 100 + anchorSize.height))
+            .isEqualTo(IntOffset(0, 100 + anchorSize.height))
 
         // off-screen (below)
         assertThat(
-            edmPositionProvider.calculatePosition(
-                anchorBounds = IntRect(
-                    size = anchorSize,
-                    offset = IntOffset(0, windowSize.height + 100),
-                ),
-                windowSize = windowSize,
-                popupContentSize = popupSize,
-                layoutDirection = layoutDirection,
+                edmPositionProvider.calculatePosition(
+                    anchorBounds =
+                        IntRect(
+                            size = anchorSize,
+                            offset = IntOffset(0, windowSize.height + 100),
+                        ),
+                    windowSize = windowSize,
+                    popupContentSize = popupSize,
+                    layoutDirection = layoutDirection,
+                )
             )
-        ).isEqualTo(
-            IntOffset(0, windowSize.height + topWindowInsets - verticalMargin - popupSize.height)
-        )
+            .isEqualTo(
+                IntOffset(
+                    0,
+                    windowSize.height + topWindowInsets - verticalMargin - popupSize.height
+                )
+            )
     }
 
     @Composable
@@ -753,16 +746,18 @@
                 onExpandedChange = onExpandChange,
             ) {
                 TextField(
-                    modifier = textFieldModifier
-                        .menuAnchor(
-                            type = if (editable) {
-                                MenuAnchorType.PrimaryEditable
-                            } else {
-                                MenuAnchorType.PrimaryNotEditable
-                            },
-                            enabled = enabled,
-                        )
-                        .testTag(TFTag),
+                    modifier =
+                        textFieldModifier
+                            .menuAnchor(
+                                type =
+                                    if (editable) {
+                                        MenuAnchorType.PrimaryEditable
+                                    } else {
+                                        MenuAnchorType.PrimaryNotEditable
+                                    },
+                                enabled = enabled,
+                            )
+                            .testTag(TFTag),
                     value = selectedOptionText,
                     onValueChange = { selectedOptionText = it },
                     readOnly = !editable,
diff --git a/compose/material3/material3/src/androidInstrumentedTest/kotlin/androidx/compose/material3/ExpressiveNavigationBarScreenshotTest.kt b/compose/material3/material3/src/androidInstrumentedTest/kotlin/androidx/compose/material3/ExpressiveNavigationBarScreenshotTest.kt
index 49d1033..fd46cf6 100644
--- a/compose/material3/material3/src/androidInstrumentedTest/kotlin/androidx/compose/material3/ExpressiveNavigationBarScreenshotTest.kt
+++ b/compose/material3/material3/src/androidInstrumentedTest/kotlin/androidx/compose/material3/ExpressiveNavigationBarScreenshotTest.kt
@@ -59,11 +59,9 @@
 @SdkSuppress(minSdkVersion = Build.VERSION_CODES.O)
 class ExpressiveNavigationBarScreenshotTest {
 
-    @get:Rule
-    val composeTestRule = createComposeRule()
+    @get:Rule val composeTestRule = createComposeRule()
 
-    @get:Rule
-    val screenshotRule = AndroidXScreenshotTestRule(GOLDEN_MATERIAL3)
+    @get:Rule val screenshotRule = AndroidXScreenshotTestRule(GOLDEN_MATERIAL3)
 
     @Test
     fun equalWeightArrangement_lightTheme() {
@@ -395,7 +393,7 @@
      *
      * @param scope [CoroutineScope] used to interact with [MutableInteractionSource]
      * @param interactionSource the [MutableInteractionSource] used for the first
-     * [ExpressiveNavigationBarItem]
+     *   [ExpressiveNavigationBarItem]
      * @param interaction the [Interaction] to assert for, or `null` if no [Interaction].
      * @param goldenIdentifier the identifier for the corresponding screenshot
      */
@@ -408,9 +406,7 @@
         if (interaction != null) {
             composeTestRule.runOnIdle {
                 // Start ripple
-                scope.launch {
-                    interactionSource.emit(interaction)
-                }
+                scope.launch { interactionSource.emit(interaction) }
             }
 
             composeTestRule.waitForIdle()
@@ -422,7 +418,8 @@
         }
 
         // Capture and compare screenshots
-        composeTestRule.onNodeWithTag(Tag)
+        composeTestRule
+            .onNodeWithTag(Tag)
             .captureToImage()
             .assertAgainstGolden(screenshotRule, goldenIdentifier)
     }
@@ -433,7 +430,7 @@
  * item is selected, and the rest are not.
  *
  * @param interactionSource the [MutableInteractionSource] for the first
- * [ExpressiveNavigationBarItem], to control its visual state.
+ *   [ExpressiveNavigationBarItem], to control its visual state.
  * @param modifier the [Modifier] applied to the navigation bar
  * @param setUnselectedItemsAsDisabled when true, marks unselected items as disabled
  */
@@ -486,16 +483,15 @@
     setContent {
         val currentDensity = LocalDensity.current
         val currentConfiguration = LocalConfiguration.current
-        val simulatedDensity = Density(
-            currentDensity.density * (currentConfiguration.screenWidthDp.dp / simulatedWidth)
-        )
+        val simulatedDensity =
+            Density(
+                currentDensity.density * (currentConfiguration.screenWidthDp.dp / simulatedWidth)
+            )
         MaterialTheme(colorScheme = colorScheme) {
             Surface(modifier = modifier) {
                 CompositionLocalProvider(LocalDensity provides simulatedDensity) {
                     Box(
-                        Modifier
-                            .fillMaxWidth()
-                            .height(simulatedHeight),
+                        Modifier.fillMaxWidth().height(simulatedHeight),
                     ) {
                         composable()
                     }
diff --git a/compose/material3/material3/src/androidInstrumentedTest/kotlin/androidx/compose/material3/ExpressiveNavigationBarTest.kt b/compose/material3/material3/src/androidInstrumentedTest/kotlin/androidx/compose/material3/ExpressiveNavigationBarTest.kt
index 4520878c..f82a261 100644
--- a/compose/material3/material3/src/androidInstrumentedTest/kotlin/androidx/compose/material3/ExpressiveNavigationBarTest.kt
+++ b/compose/material3/material3/src/androidInstrumentedTest/kotlin/androidx/compose/material3/ExpressiveNavigationBarTest.kt
@@ -70,8 +70,7 @@
 @LargeTest
 @RunWith(AndroidJUnit4::class)
 class ExpressiveNavigationBarTest {
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
     @Test
     fun bar_selectableGroupSemantics() {
@@ -87,25 +86,28 @@
             }
         }
 
-        rule.onNodeWithTag("item")
+        rule
+            .onNodeWithTag("item")
             .onParent()
             .assert(SemanticsMatcher.keyIsDefined(SemanticsProperties.SelectableGroup))
     }
+
     @Test
     fun bar_size() {
         val height = 64.dp // TODO: Replace with token.
-        rule.setMaterialContentForSizeAssertions {
-            ExpressiveNavigationBar {
-                repeat(3) { index ->
-                    ExpressiveNavigationBarItem(
-                        icon = { Icon(Icons.Filled.Favorite, null) },
-                        label = { Text("Item $index") },
-                        selected = index == 0,
-                        onClick = {}
-                    )
+        rule
+            .setMaterialContentForSizeAssertions {
+                ExpressiveNavigationBar {
+                    repeat(3) { index ->
+                        ExpressiveNavigationBarItem(
+                            icon = { Icon(Icons.Filled.Favorite, null) },
+                            label = { Text("Item $index") },
+                            selected = index == 0,
+                            onClick = {}
+                        )
+                    }
                 }
             }
-        }
             .assertWidthIsEqualTo(rule.rootWidth())
             .assertHeightIsEqualTo(height)
     }
@@ -114,13 +116,11 @@
     fun bar_respectContentPadding() {
         rule.setMaterialContentForSizeAssertions {
             ExpressiveNavigationBar(windowInsets = WindowInsets(17.dp, 17.dp, 17.dp, 17.dp)) {
-                Box(
-                    Modifier
-                        .fillMaxSize()
-                        .testTag("content"))
+                Box(Modifier.fillMaxSize().testTag("content"))
             }
         }
-        rule.onNodeWithTag("content")
+        rule
+            .onNodeWithTag("content")
             .assertLeftPositionInRootIsEqualTo(17.dp)
             .assertTopPositionInRootIsEqualTo(17.dp)
     }
@@ -131,9 +131,7 @@
         val itemCoords = mutableMapOf<Int, LayoutCoordinates>()
         rule.setMaterialContent(
             lightColorScheme(),
-            Modifier.onGloballyPositioned { coords: LayoutCoordinates ->
-                parentCoords = coords
-            }
+            Modifier.onGloballyPositioned { coords: LayoutCoordinates -> parentCoords = coords }
         ) {
             Box {
                 ExpressiveNavigationBar {
@@ -143,9 +141,10 @@
                             label = { Text("Item $index") },
                             selected = index == 0,
                             onClick = {},
-                            modifier = Modifier.onGloballyPositioned { coords ->
-                                itemCoords[index] = coords
-                            }
+                            modifier =
+                                Modifier.onGloballyPositioned { coords ->
+                                    itemCoords[index] = coords
+                                }
                         )
                     }
                 }
@@ -161,7 +160,8 @@
             itemCoords.forEach { (index, coord) ->
                 Truth.assertThat(coord.size.width.toFloat()).isWithin(1f).of(expectedItemWidth)
                 Truth.assertThat(coord.size.height.toFloat()).isWithin(1f).of(expectedItemHeight)
-                Truth.assertThat(coord.positionInWindow().x).isWithin(1f)
+                Truth.assertThat(coord.positionInWindow().x)
+                    .isWithin(1f)
                     .of(expectedItemWidth * index)
             }
         }
@@ -207,9 +207,10 @@
                             label = { Text("Item $index") },
                             selected = index == 0,
                             onClick = {},
-                            modifier = Modifier.onGloballyPositioned { coords ->
-                                itemCoords[index] = coords
-                            }
+                            modifier =
+                                Modifier.onGloballyPositioned { coords ->
+                                    itemCoords[index] = coords
+                                }
                         )
                     }
                 }
@@ -246,9 +247,10 @@
                             label = { Text("Item $index") },
                             selected = index == 0,
                             onClick = {},
-                            modifier = Modifier.onGloballyPositioned { coords ->
-                                itemCoords[index] = coords
-                            }
+                            modifier =
+                                Modifier.onGloballyPositioned { coords ->
+                                    itemCoords[index] = coords
+                                }
                         )
                     }
                 }
@@ -285,9 +287,10 @@
                             label = { Text("Item $index") },
                             selected = index == 0,
                             onClick = {},
-                            modifier = Modifier.onGloballyPositioned { coords ->
-                                itemCoords[index] = coords
-                            }
+                            modifier =
+                                Modifier.onGloballyPositioned { coords ->
+                                    itemCoords[index] = coords
+                                }
                         )
                     }
                 }
@@ -324,9 +327,10 @@
                             label = { Text("Item $index") },
                             selected = index == 0,
                             onClick = {},
-                            modifier = Modifier.onGloballyPositioned { coords ->
-                                itemCoords[index] = coords
-                            }
+                            modifier =
+                                Modifier.onGloballyPositioned { coords ->
+                                    itemCoords[index] = coords
+                                }
                         )
                     }
                 }
@@ -372,14 +376,16 @@
     @Test
     fun bar_itemsWithCustomColors() {
         rule.setMaterialContent(lightColorScheme()) {
-            val customItemColors = ExpressiveNavigationBarItemDefaults.colors().copy(
-                selectedIconColor = Color.Red,
-                selectedTextColor = Color.Blue,
-                unselectedIconColor = Color.Green,
-                unselectedTextColor = Color.White,
-                disabledIconColor = Color.Gray,
-                disabledTextColor = Color.Black,
-            )
+            val customItemColors =
+                ExpressiveNavigationBarItemDefaults.colors()
+                    .copy(
+                        selectedIconColor = Color.Red,
+                        selectedTextColor = Color.Blue,
+                        unselectedIconColor = Color.Green,
+                        unselectedTextColor = Color.White,
+                        disabledIconColor = Color.Gray,
+                        disabledTextColor = Color.Black,
+                    )
 
             ExpressiveNavigationBar {
                 ExpressiveNavigationBarItem(
@@ -420,7 +426,8 @@
             )
         }
 
-        rule.onNodeWithTag("item")
+        rule
+            .onNodeWithTag("item")
             .assert(SemanticsMatcher.expectValue(SemanticsProperties.Role, Role.Tab))
             .assertIsSelected()
             .assertIsEnabled()
@@ -440,7 +447,8 @@
             )
         }
 
-        rule.onNodeWithTag("item")
+        rule
+            .onNodeWithTag("item")
             .assert(SemanticsMatcher.expectValue(SemanticsProperties.Role, Role.Tab))
             .assertIsSelected()
             .assertIsNotEnabled()
@@ -461,12 +469,9 @@
             )
         }
 
-        rule.onNodeWithTag("item")
-            .performClick()
+        rule.onNodeWithTag("item").performClick()
 
-        rule.runOnIdle {
-            Truth.assertThat(clicks).isEqualTo(0)
-        }
+        rule.runOnIdle { Truth.assertThat(clicks).isEqualTo(0) }
     }
 
     @Test
@@ -508,9 +513,7 @@
         rule.setMaterialContent(lightColorScheme()) {
             ExpressiveNavigationBarItem(
                 modifier = Modifier.testTag("item"),
-                icon = {
-                    Icon(Icons.Filled.Favorite, null, Modifier.testTag("icon"))
-                },
+                icon = { Icon(Icons.Filled.Favorite, null, Modifier.testTag("icon")) },
                 label = { Text("ItemText") },
                 selected = true,
                 onClick = {}
@@ -518,14 +521,15 @@
         }
 
         val itemBounds = rule.onNodeWithTag("item").getUnclippedBoundsInRoot()
-        val iconBounds = rule.onNodeWithTag("icon", useUnmergedTree = true)
-            .getUnclippedBoundsInRoot()
+        val iconBounds =
+            rule.onNodeWithTag("icon", useUnmergedTree = true).getUnclippedBoundsInRoot()
 
         // Assert the item has its minimal width and height values.
         Truth.assertThat(itemBounds.width).isAtLeast(NavigationItemMinWidth)
         Truth.assertThat(itemBounds.height).isAtLeast(NavigationItemMinHeight)
 
-        rule.onNodeWithTag("icon", useUnmergedTree = true)
+        rule
+            .onNodeWithTag("icon", useUnmergedTree = true)
             // The icon should be horizontally centered in the item.
             .assertLeftPositionInRootIsEqualTo((itemBounds.width - iconBounds.width) / 2)
             // The top of the icon is `TopIconIndicatorVerticalPadding + TopIconItemVerticalPadding`
@@ -537,7 +541,8 @@
         val iconBottom = iconBounds.top + iconBounds.height
         // Text should be `TopIconIndicatorVerticalPadding + TopIconIndicatorToLabelPadding` from
         // the bottom of the icon.
-        rule.onNodeWithText("ItemText", useUnmergedTree = true)
+        rule
+            .onNodeWithText("ItemText", useUnmergedTree = true)
             .getUnclippedBoundsInRoot()
             .top
             .assertIsEqualTo(
@@ -550,9 +555,7 @@
         rule.setMaterialContent(lightColorScheme()) {
             ExpressiveNavigationBarItem(
                 modifier = Modifier.testTag("item"),
-                icon = {
-                    Icon(Icons.Filled.Favorite, null, Modifier.testTag("icon"))
-                },
+                icon = { Icon(Icons.Filled.Favorite, null, Modifier.testTag("icon")) },
                 iconPosition = NavigationItemIconPosition.Start,
                 label = { Text("ItemText", Modifier.testTag("label")) },
                 selected = true,
@@ -561,25 +564,29 @@
         }
 
         val itemBounds = rule.onNodeWithTag("item").getUnclippedBoundsInRoot()
-        val iconBounds = rule.onNodeWithTag("icon", useUnmergedTree = true)
-            .getUnclippedBoundsInRoot()
-        val labelBounds = rule.onNodeWithTag("label", useUnmergedTree = true)
-            .getUnclippedBoundsInRoot()
+        val iconBounds =
+            rule.onNodeWithTag("icon", useUnmergedTree = true).getUnclippedBoundsInRoot()
+        val labelBounds =
+            rule.onNodeWithTag("label", useUnmergedTree = true).getUnclippedBoundsInRoot()
 
         // Assert the item has its minimal width and height values.
         Truth.assertThat(itemBounds.width).isAtLeast(NavigationItemMinWidth)
         Truth.assertThat(itemBounds.height).isAtLeast(NavigationItemMinHeight)
 
         // Assert width.
-        val expectedWidth = StartIconIndicatorHorizontalPadding + iconBounds.width +
-            StartIconToLabelPadding + labelBounds.width +
-            StartIconIndicatorHorizontalPadding
+        val expectedWidth =
+            StartIconIndicatorHorizontalPadding +
+                iconBounds.width +
+                StartIconToLabelPadding +
+                labelBounds.width +
+                StartIconIndicatorHorizontalPadding
         Truth.assertThat(itemBounds.width.value).isWithin(1f).of(expectedWidth.value)
         // Assert height. Note: The item's content height is less than its minimum touch target
         // height, so its actual height is the same as NavigationItemMinHeight.
         Truth.assertThat(itemBounds.height).isEqualTo(NavigationItemMinHeight)
 
-        rule.onNodeWithTag("icon", useUnmergedTree = true)
+        rule
+            .onNodeWithTag("icon", useUnmergedTree = true)
             // The left of the icon is `StartIconIndicatorHorizontalPadding` from the left of the
             // item.
             .assertLeftPositionInRootIsEqualTo(
@@ -588,10 +595,13 @@
             // The icon should be vertically centered in the item.
             .assertTopPositionInRootIsEqualTo((itemBounds.height - iconBounds.height) / 2)
 
-        rule.onNodeWithTag("label", useUnmergedTree = true)
+        rule
+            .onNodeWithTag("label", useUnmergedTree = true)
             // The left of the label is `StartIconToLabelPadding` from the right of the icon.
             .assertLeftPositionInRootIsEqualTo(
-                itemBounds.left + StartIconIndicatorHorizontalPadding + iconBounds.width +
+                itemBounds.left +
+                    StartIconIndicatorHorizontalPadding +
+                    iconBounds.width +
                     StartIconToLabelPadding
             )
             // The label should be vertically centered in the item.
@@ -603,9 +613,7 @@
         rule.setMaterialContent(lightColorScheme()) {
             ExpressiveNavigationBarItem(
                 modifier = Modifier.testTag("item"),
-                icon = {
-                    Icon(Icons.Filled.Favorite, null, Modifier.testTag("icon"))
-                },
+                icon = { Icon(Icons.Filled.Favorite, null, Modifier.testTag("icon")) },
                 label = null,
                 selected = false,
                 onClick = {}
@@ -613,11 +621,12 @@
         }
 
         val itemBounds = rule.onNodeWithTag("item").getUnclippedBoundsInRoot()
-        val iconBounds = rule.onNodeWithTag("icon", useUnmergedTree = true)
-            .getUnclippedBoundsInRoot()
+        val iconBounds =
+            rule.onNodeWithTag("icon", useUnmergedTree = true).getUnclippedBoundsInRoot()
 
         // The icon should be centered in the item, as there is no text placeable provided
-        rule.onNodeWithTag("icon", useUnmergedTree = true)
+        rule
+            .onNodeWithTag("icon", useUnmergedTree = true)
             .assertLeftPositionInRootIsEqualTo((itemBounds.width - iconBounds.width) / 2)
             .assertTopPositionInRootIsEqualTo((itemBounds.height - iconBounds.height) / 2)
     }
@@ -636,9 +645,9 @@
 
     Truth.assertThat(itemCoords.size).isEqualTo(numberOfItems)
     itemCoords.forEach { (index, coord) ->
-        Truth.assertThat(coord.size.width.toFloat()).isWithin(1f)
-            .of(expectedItemWidth.toFloat())
-        Truth.assertThat(coord.positionInWindow().x).isWithin(1f)
+        Truth.assertThat(coord.size.width.toFloat()).isWithin(1f).of(expectedItemWidth.toFloat())
+        Truth.assertThat(coord.positionInWindow().x)
+            .isWithin(1f)
             .of((expectedItemWidth * index) + padding)
     }
 }
@@ -653,16 +662,15 @@
     setContent {
         val currentDensity = LocalDensity.current
         val currentConfiguration = LocalConfiguration.current
-        val simulatedDensity = Density(
-            currentDensity.density * (currentConfiguration.screenWidthDp.dp / simulatedWidth)
-        )
+        val simulatedDensity =
+            Density(
+                currentDensity.density * (currentConfiguration.screenWidthDp.dp / simulatedWidth)
+            )
         MaterialTheme(colorScheme = colorScheme) {
             Surface(modifier = modifier) {
                 CompositionLocalProvider(LocalDensity provides simulatedDensity) {
                     Box(
-                        Modifier
-                            .fillMaxWidth()
-                            .height(simulatedHeight),
+                        Modifier.fillMaxWidth().height(simulatedHeight),
                     ) {
                         composable()
                     }
diff --git a/compose/material3/material3/src/androidInstrumentedTest/kotlin/androidx/compose/material3/FloatingActionButtonScreenshotTest.kt b/compose/material3/material3/src/androidInstrumentedTest/kotlin/androidx/compose/material3/FloatingActionButtonScreenshotTest.kt
index 74bac25..d67165f 100644
--- a/compose/material3/material3/src/androidInstrumentedTest/kotlin/androidx/compose/material3/FloatingActionButtonScreenshotTest.kt
+++ b/compose/material3/material3/src/androidInstrumentedTest/kotlin/androidx/compose/material3/FloatingActionButtonScreenshotTest.kt
@@ -57,22 +57,21 @@
 @OptIn(ExperimentalTestApi::class)
 class FloatingActionButtonScreenshotTest {
 
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
-    @get:Rule
-    val screenshotRule = AndroidXScreenshotTestRule(GOLDEN_MATERIAL3)
+    @get:Rule val screenshotRule = AndroidXScreenshotTestRule(GOLDEN_MATERIAL3)
 
     // TODO(b/267253920): Add a compose test API to set/reset InputMode.
     @After
-    fun resetTouchMode() = with(InstrumentationRegistry.getInstrumentation()) {
-        if (SDK_INT < 33) setInTouchMode(true) else resetInTouchMode()
-    }
+    fun resetTouchMode() =
+        with(InstrumentationRegistry.getInstrumentation()) {
+            if (SDK_INT < 33) setInTouchMode(true) else resetInTouchMode()
+        }
 
     @Test
     fun icon_primary_light_color_scheme() {
         rule.setMaterialContent(lightColorScheme()) {
-            FloatingActionButton(onClick = { }) {
+            FloatingActionButton(onClick = {}) {
                 Icon(Icons.Filled.Favorite, contentDescription = null)
             }
         }
@@ -84,7 +83,7 @@
     fun lower_elevation_icon_primary_light_color_scheme() {
         rule.setMaterialContent(lightColorScheme()) {
             FloatingActionButton(
-                onClick = { },
+                onClick = {},
                 elevation = FloatingActionButtonDefaults.loweredElevation(),
             ) {
                 Icon(Icons.Filled.Favorite, contentDescription = null)
@@ -97,7 +96,7 @@
     @Test
     fun icon_primary_dark_color_scheme() {
         rule.setMaterialContent(darkColorScheme()) {
-            FloatingActionButton(onClick = { }) {
+            FloatingActionButton(onClick = {}) {
                 Icon(Icons.Filled.Favorite, contentDescription = null)
             }
         }
@@ -109,7 +108,7 @@
     fun lower_elevation_icon_primary_dark_color_scheme() {
         rule.setMaterialContent(darkColorScheme()) {
             FloatingActionButton(
-                onClick = { },
+                onClick = {},
                 elevation = FloatingActionButtonDefaults.loweredElevation(),
             ) {
                 Icon(Icons.Filled.Favorite, contentDescription = null)
@@ -118,11 +117,12 @@
 
         assertClickableAgainstGolden("fab_primary_lower_elevation_dark_color_scheme")
     }
+
     @Test
     fun icon_secondary_light_color_scheme() {
         rule.setMaterialContent(lightColorScheme()) {
             FloatingActionButton(
-                onClick = { },
+                onClick = {},
                 containerColor = MaterialTheme.colorScheme.secondaryContainer,
             ) {
                 Icon(Icons.Filled.Favorite, contentDescription = null)
@@ -136,7 +136,7 @@
     fun icon_secondary_dark_color_scheme() {
         rule.setMaterialContent(darkColorScheme()) {
             FloatingActionButton(
-                onClick = { },
+                onClick = {},
                 containerColor = MaterialTheme.colorScheme.secondaryContainer,
             ) {
                 Icon(Icons.Filled.Favorite, contentDescription = null)
@@ -150,7 +150,7 @@
     fun icon_tertiary_light_color_scheme() {
         rule.setMaterialContent(lightColorScheme()) {
             FloatingActionButton(
-                onClick = { },
+                onClick = {},
                 containerColor = MaterialTheme.colorScheme.tertiaryContainer,
             ) {
                 Icon(Icons.Filled.Favorite, contentDescription = null)
@@ -164,7 +164,7 @@
     fun icon_tertiary_dark_color_scheme() {
         rule.setMaterialContent(darkColorScheme()) {
             FloatingActionButton(
-                onClick = { },
+                onClick = {},
                 containerColor = MaterialTheme.colorScheme.tertiaryContainer,
             ) {
                 Icon(Icons.Filled.Favorite, contentDescription = null)
@@ -178,7 +178,7 @@
     fun icon_surface_light_color_scheme() {
         rule.setMaterialContent(lightColorScheme()) {
             FloatingActionButton(
-                onClick = { },
+                onClick = {},
                 containerColor = MaterialTheme.colorScheme.surface,
                 contentColor = MaterialTheme.colorScheme.primary,
             ) {
@@ -193,7 +193,7 @@
     fun icon_surface_dark_color_scheme() {
         rule.setMaterialContent(darkColorScheme()) {
             FloatingActionButton(
-                onClick = { },
+                onClick = {},
                 containerColor = MaterialTheme.colorScheme.surface,
                 contentColor = MaterialTheme.colorScheme.primary,
             ) {
@@ -207,7 +207,7 @@
     @Test
     fun smallIcon() {
         rule.setMaterialContent(lightColorScheme()) {
-            FloatingActionButton(onClick = { }) {
+            FloatingActionButton(onClick = {}) {
                 Icon(Icons.Filled.Favorite, contentDescription = null)
             }
         }
@@ -218,7 +218,7 @@
     @Test
     fun largeIcon() {
         rule.setMaterialContent(lightColorScheme()) {
-            FloatingActionButton(onClick = { }) {
+            FloatingActionButton(onClick = {}) {
                 Icon(Icons.Filled.Favorite, contentDescription = null)
             }
         }
@@ -255,15 +255,14 @@
     fun ripple() {
         rule.setMaterialContent(lightColorScheme()) {
             Box(Modifier.requiredSize(100.dp, 100.dp).wrapContentSize()) {
-                FloatingActionButton(onClick = { }) {
+                FloatingActionButton(onClick = {}) {
                     Icon(Icons.Filled.Favorite, contentDescription = null)
                 }
             }
         }
 
         // Start ripple
-        rule.onNode(hasClickAction())
-            .performTouchInput { down(center) }
+        rule.onNode(hasClickAction()).performTouchInput { down(center) }
 
         rule.waitForIdle()
         // Ripples are drawn on the RenderThread, not the main (UI) thread, so we can't
@@ -278,14 +277,13 @@
     fun hover() {
         rule.setMaterialContent(lightColorScheme()) {
             Box(Modifier.requiredSize(100.dp, 100.dp).wrapContentSize()) {
-                FloatingActionButton(onClick = { }) {
+                FloatingActionButton(onClick = {}) {
                     Icon(Icons.Filled.Favorite, contentDescription = null)
                 }
             }
         }
 
-        rule.onNode(hasClickAction())
-            .performMouseInput { enter(center) }
+        rule.onNode(hasClickAction()).performMouseInput { enter(center) }
 
         rule.waitForIdle()
 
@@ -301,9 +299,8 @@
             localInputModeManager = LocalInputModeManager.current
             Box(Modifier.requiredSize(100.dp, 100.dp).wrapContentSize()) {
                 FloatingActionButton(
-                    onClick = { },
-                    modifier = Modifier
-                        .focusRequester(focusRequester)
+                    onClick = {},
+                    modifier = Modifier.focusRequester(focusRequester)
                 ) {
                     Icon(Icons.Filled.Favorite, contentDescription = null)
                 }
@@ -345,13 +342,15 @@
     }
 
     private fun assertClickableAgainstGolden(goldenName: String) {
-        rule.onNode(hasClickAction())
+        rule
+            .onNode(hasClickAction())
             .captureToImage()
             .assertAgainstGolden(screenshotRule, goldenName)
     }
 
     private fun assertRootAgainstGolden(goldenName: String) {
-        rule.onNode(hasClickAction())
+        rule
+            .onNode(hasClickAction())
             .captureToImage()
             .assertAgainstGolden(screenshotRule, goldenName)
     }
diff --git a/compose/material3/material3/src/androidInstrumentedTest/kotlin/androidx/compose/material3/FloatingActionButtonTest.kt b/compose/material3/material3/src/androidInstrumentedTest/kotlin/androidx/compose/material3/FloatingActionButtonTest.kt
index b486c1a..fbcef79 100644
--- a/compose/material3/material3/src/androidInstrumentedTest/kotlin/androidx/compose/material3/FloatingActionButtonTest.kt
+++ b/compose/material3/material3/src/androidInstrumentedTest/kotlin/androidx/compose/material3/FloatingActionButtonTest.kt
@@ -74,8 +74,7 @@
 @RunWith(AndroidJUnit4::class)
 class FloatingActionButtonTest {
 
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
     @Test
     fun fabDefaultSemantics() {
@@ -87,7 +86,8 @@
             }
         }
 
-        rule.onNodeWithTag("myButton")
+        rule
+            .onNodeWithTag("myButton")
             .assertIsEnabled()
             .assert(SemanticsMatcher.expectValue(SemanticsProperties.Role, Role.Button))
     }
@@ -99,17 +99,12 @@
         val text = "myButton"
 
         rule.setMaterialContent(lightColorScheme()) {
-            Box {
-                ExtendedFloatingActionButton(onClick = onClick, content = { Text(text) })
-            }
+            Box { ExtendedFloatingActionButton(onClick = onClick, content = { Text(text) }) }
         }
 
-        rule.onNodeWithText(text)
-            .performClick()
+        rule.onNodeWithText(text).performClick()
 
-        rule.runOnIdle {
-            assertThat(counter).isEqualTo(1)
-        }
+        rule.runOnIdle { assertThat(counter).isEqualTo(1) }
     }
 
     @Test
@@ -117,10 +112,7 @@
         rule
             .setMaterialContentForSizeAssertions {
                 FloatingActionButton(onClick = {}) {
-                    Icon(
-                        Icons.Filled.Favorite,
-                        null,
-                        modifier = Modifier.testTag("icon"))
+                    Icon(Icons.Filled.Favorite, null, modifier = Modifier.testTag("icon"))
                 }
             }
             .assertIsSquareWithSize(FabPrimaryTokens.ContainerHeight)
@@ -140,11 +132,7 @@
                     LocalMinimumInteractiveComponentSize provides Dp.Unspecified
                 ) {
                     SmallFloatingActionButton(onClick = {}) {
-                        Icon(
-                            Icons.Filled.Favorite,
-                            null,
-                            modifier = Modifier.testTag("icon")
-                        )
+                        Icon(Icons.Filled.Favorite, null, modifier = Modifier.testTag("icon"))
                     }
                 }
             }
@@ -162,9 +150,7 @@
     fun smallFabHasMinTouchTarget() {
         rule
             .setMaterialContentForSizeAssertions {
-                SmallFloatingActionButton(onClick = {}) {
-                    Icon(Icons.Filled.Favorite, null)
-                }
+                SmallFloatingActionButton(onClick = {}) { Icon(Icons.Filled.Favorite, null) }
             }
             // Expecting the size to be equal to the minimum touch target.
             .assertTouchWidthIsEqualTo(48.dp)
@@ -181,9 +167,9 @@
                     Icon(
                         Icons.Filled.Favorite,
                         null,
-                        modifier = Modifier
-                            .size(FloatingActionButtonDefaults.LargeIconSize)
-                            .testTag("icon")
+                        modifier =
+                            Modifier.size(FloatingActionButtonDefaults.LargeIconSize)
+                                .testTag("icon")
                     )
                 }
             }
@@ -206,7 +192,8 @@
             )
         }
 
-        rule.onNodeWithTag("FAB")
+        rule
+            .onNodeWithTag("FAB")
             .assertHeightIsEqualTo(ExtendedFabPrimaryTokens.ContainerHeight)
             .assertWidthIsAtLeast(FabPrimaryTokens.ContainerHeight)
     }
@@ -221,7 +208,8 @@
             )
         }
 
-        rule.onNodeWithTag("FAB")
+        rule
+            .onNodeWithTag("FAB")
             .assertHeightIsEqualTo(ExtendedFabPrimaryTokens.ContainerHeight)
             .assertWidthIsEqualTo(80.dp)
     }
@@ -282,8 +270,7 @@
                     }
                 )
             }
-            expectedTextStyle =
-                ExtendedFabPrimaryTokens.LabelTextFont.value
+            expectedTextStyle = ExtendedFabPrimaryTokens.LabelTextFont.value
         }
         rule.runOnIdle {
             assertThat(fontFamily).isEqualTo(expectedTextStyle!!.fontFamily)
@@ -301,29 +288,22 @@
         rule.setMaterialContent(lightColorScheme()) {
             Column {
                 Spacer(
-                    Modifier
-                        .requiredSize(10.dp)
-                        .weight(1f)
-                        .onGloballyPositioned {
-                            item1Bounds = it.boundsInRoot()
-                        }
+                    Modifier.requiredSize(10.dp).weight(1f).onGloballyPositioned {
+                        item1Bounds = it.boundsInRoot()
+                    }
                 )
 
                 FloatingActionButton(
                     onClick = {},
-                    modifier = Modifier
-                        .weight(1f)
-                        .onGloballyPositioned {
+                    modifier =
+                        Modifier.weight(1f).onGloballyPositioned {
                             buttonBounds = it.boundsInRoot()
                         }
                 ) {
                     Text("Button")
                 }
 
-                Spacer(
-                    Modifier
-                        .requiredSize(10.dp)
-                        .weight(1f))
+                Spacer(Modifier.requiredSize(10.dp).weight(1f))
             }
         }
 
@@ -337,17 +317,8 @@
         var contentCoordinates: LayoutCoordinates? = null
         rule.setMaterialContent(lightColorScheme()) {
             Box {
-                FloatingActionButton(
-                    {},
-                    Modifier.onGloballyPositioned {
-                        buttonCoordinates = it
-                    }
-                ) {
-                    Box(
-                        Modifier
-                            .size(2.dp)
-                            .onGloballyPositioned { contentCoordinates = it }
-                    )
+                FloatingActionButton({}, Modifier.onGloballyPositioned { buttonCoordinates = it }) {
+                    Box(Modifier.size(2.dp).onGloballyPositioned { contentCoordinates = it })
                 }
             }
         }
@@ -375,11 +346,7 @@
                     onClick = {},
                     modifier = Modifier.onGloballyPositioned { buttonCoordinates = it },
                 ) {
-                    Box(
-                        Modifier
-                            .size(2.dp)
-                            .onGloballyPositioned { contentCoordinates = it }
-                    )
+                    Box(Modifier.size(2.dp).onGloballyPositioned { contentCoordinates = it })
                 }
             }
         }
@@ -406,18 +373,10 @@
             Box {
                 ExtendedFloatingActionButton(
                     text = {
-                        Box(
-                            Modifier
-                                .size(2.dp)
-                                .onGloballyPositioned { textCoordinates = it }
-                        )
+                        Box(Modifier.size(2.dp).onGloballyPositioned { textCoordinates = it })
                     },
                     icon = {
-                        Box(
-                            Modifier
-                                .size(10.dp)
-                                .onGloballyPositioned { iconCoordinates = it }
-                        )
+                        Box(Modifier.size(10.dp).onGloballyPositioned { iconCoordinates = it })
                     },
                     onClick = {},
                     modifier = Modifier.onGloballyPositioned { buttonCoordinates = it }
@@ -459,7 +418,7 @@
         rule.setMaterialContent(lightColorScheme()) {
             ExtendedFloatingActionButton(
                 expanded = true,
-                onClick = { },
+                onClick = {},
                 icon = {
                     Icon(
                         Icons.Filled.Favorite,
@@ -477,7 +436,8 @@
             .assertHeightIsEqualTo(ExtendedFabPrimaryTokens.IconSize)
             .assertWidthIsEqualTo(ExtendedFabPrimaryTokens.IconSize)
 
-        rule.onNodeWithTag("FAB")
+        rule
+            .onNodeWithTag("FAB")
             .assertHeightIsEqualTo(ExtendedFabPrimaryTokens.ContainerHeight)
             .assertWidthIsAtLeast(80.dp)
 
@@ -490,21 +450,14 @@
         rule.setMaterialContent(lightColorScheme()) {
             ExtendedFloatingActionButton(
                 expanded = false,
-                onClick = { },
-                icon = {
-                    Icon(
-                        Icons.Filled.Favorite,
-                        "Add",
-                        modifier = Modifier.testTag("icon")
-                    )
-                },
+                onClick = {},
+                icon = { Icon(Icons.Filled.Favorite, "Add", modifier = Modifier.testTag("icon")) },
                 text = { Text(text = "FAB", modifier = Modifier.testTag("text")) },
                 modifier = Modifier.testTag("FAB"),
             )
         }
 
-        rule.onNodeWithTag("FAB")
-            .assertIsSquareWithSize(FabPrimaryTokens.ContainerHeight)
+        rule.onNodeWithTag("FAB").assertIsSquareWithSize(FabPrimaryTokens.ContainerHeight)
 
         rule
             .onNodeWithTag("icon", useUnmergedTree = true)
@@ -524,26 +477,22 @@
             ExtendedFloatingActionButton(
                 expanded = expanded,
                 onClick = {},
-                icon = {
-                    Icon(
-                        Icons.Filled.Favorite,
-                        "Add",
-                        modifier = Modifier.testTag("icon")
-                    )
-                },
+                icon = { Icon(Icons.Filled.Favorite, "Add", modifier = Modifier.testTag("icon")) },
                 text = { Text(text = "FAB", modifier = Modifier.testTag("text")) },
                 modifier = Modifier.testTag("FAB"),
             )
         }
 
-        rule.onNodeWithTag("FAB")
+        rule
+            .onNodeWithTag("FAB")
             .assertHeightIsEqualTo(ExtendedFabPrimaryTokens.ContainerHeight)
             .assertWidthIsAtLeast(80.dp)
 
         rule.runOnIdle { expanded = false }
         rule.mainClock.advanceTimeBy(200)
 
-        rule.onNodeWithTag("FAB")
+        rule
+            .onNodeWithTag("FAB")
             .assertIsSquareWithSize(FabPrimaryTokens.ContainerHeight)
             .assertHeightIsEqualTo(FabPrimaryTokens.ContainerHeight)
             .assertWidthIsEqualTo(FabPrimaryTokens.ContainerWidth)
@@ -560,12 +509,13 @@
         lateinit var shadowElevation: State<Dp>
 
         rule.setMaterialContent(lightColorScheme()) {
-            val fabElevation = FloatingActionButtonDefaults.elevation(
-                defaultElevation = defaultElevation,
-                pressedElevation = pressedElevation,
-                hoveredElevation = hoveredElevation,
-                focusedElevation = focusedElevation
-            )
+            val fabElevation =
+                FloatingActionButtonDefaults.elevation(
+                    defaultElevation = defaultElevation,
+                    pressedElevation = pressedElevation,
+                    hoveredElevation = hoveredElevation,
+                    focusedElevation = focusedElevation
+                )
 
             tonalElevation = fabElevation.tonalElevation()
             shadowElevation = fabElevation.shadowElevation(interactionSource)
@@ -576,9 +526,7 @@
             assertThat(shadowElevation.value).isEqualTo(defaultElevation)
         }
 
-        rule.runOnIdle {
-            interactionSource.tryEmit(PressInteraction.Press(Offset.Zero))
-        }
+        rule.runOnIdle { interactionSource.tryEmit(PressInteraction.Press(Offset.Zero)) }
 
         rule.runOnIdle {
             assertThat(tonalElevation).isEqualTo(defaultElevation)
@@ -597,12 +545,13 @@
         lateinit var shadowElevation: State<Dp>
 
         rule.setMaterialContent(lightColorScheme()) {
-            val fabElevation = FloatingActionButtonDefaults.elevation(
-                defaultElevation = defaultElevation,
-                pressedElevation = pressedElevation,
-                hoveredElevation = hoveredElevation,
-                focusedElevation = focusedElevation
-            )
+            val fabElevation =
+                FloatingActionButtonDefaults.elevation(
+                    defaultElevation = defaultElevation,
+                    pressedElevation = pressedElevation,
+                    hoveredElevation = hoveredElevation,
+                    focusedElevation = focusedElevation
+                )
 
             tonalElevation = fabElevation.tonalElevation()
             shadowElevation = fabElevation.shadowElevation(interactionSource)
@@ -613,9 +562,7 @@
             assertThat(shadowElevation.value).isEqualTo(defaultElevation)
         }
 
-        rule.runOnIdle {
-            defaultElevation = 5.dp
-        }
+        rule.runOnIdle { defaultElevation = 5.dp }
 
         rule.runOnIdle {
             assertThat(tonalElevation).isEqualTo(5.dp)
@@ -634,12 +581,13 @@
         lateinit var shadowElevation: State<Dp>
 
         rule.setMaterialContent(lightColorScheme()) {
-            val fabElevation = FloatingActionButtonDefaults.elevation(
-                defaultElevation = defaultElevation,
-                pressedElevation = pressedElevation,
-                hoveredElevation = hoveredElevation,
-                focusedElevation = focusedElevation
-            )
+            val fabElevation =
+                FloatingActionButtonDefaults.elevation(
+                    defaultElevation = defaultElevation,
+                    pressedElevation = pressedElevation,
+                    hoveredElevation = hoveredElevation,
+                    focusedElevation = focusedElevation
+                )
 
             tonalElevation = fabElevation.tonalElevation()
             shadowElevation = fabElevation.shadowElevation(interactionSource)
@@ -650,18 +598,14 @@
             assertThat(shadowElevation.value).isEqualTo(defaultElevation)
         }
 
-        rule.runOnIdle {
-            interactionSource.tryEmit(PressInteraction.Press(Offset.Zero))
-        }
+        rule.runOnIdle { interactionSource.tryEmit(PressInteraction.Press(Offset.Zero)) }
 
         rule.runOnIdle {
             assertThat(tonalElevation).isEqualTo(defaultElevation)
             assertThat(shadowElevation.value).isEqualTo(pressedElevation)
         }
 
-        rule.runOnIdle {
-            pressedElevation = 5.dp
-        }
+        rule.runOnIdle { pressedElevation = 5.dp }
 
         // We are still pressed, so we should now show the updated value for the pressed state
         rule.runOnIdle {
diff --git a/compose/material3/material3/src/androidInstrumentedTest/kotlin/androidx/compose/material3/GoldenCommon.kt b/compose/material3/material3/src/androidInstrumentedTest/kotlin/androidx/compose/material3/GoldenCommon.kt
index 7843a13..a305aab 100644
--- a/compose/material3/material3/src/androidInstrumentedTest/kotlin/androidx/compose/material3/GoldenCommon.kt
+++ b/compose/material3/material3/src/androidInstrumentedTest/kotlin/androidx/compose/material3/GoldenCommon.kt
@@ -1,18 +1,18 @@
 /*
-* Copyright 2021 The Android Open Source Project
-*
-* Licensed under the Apache License, Version 2.0 (the "License");
-* you may not use this file except in compliance with the License.
-* You may obtain a copy of the License at
-*
-*      http://www.apache.org/licenses/LICENSE-2.0
-*
-* Unless required by applicable law or agreed to in writing, software
-* distributed under the License is distributed on an "AS IS" BASIS,
-* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-* See the License for the specific language governing permissions and
-* limitations under the License.
-*/
+ * Copyright 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
 
 package androidx.compose.material3
 
diff --git a/compose/material3/material3/src/androidInstrumentedTest/kotlin/androidx/compose/material3/IconButtonScreenshotTest.kt b/compose/material3/material3/src/androidInstrumentedTest/kotlin/androidx/compose/material3/IconButtonScreenshotTest.kt
index 5d0b5fc..1865817 100644
--- a/compose/material3/material3/src/androidInstrumentedTest/kotlin/androidx/compose/material3/IconButtonScreenshotTest.kt
+++ b/compose/material3/material3/src/androidInstrumentedTest/kotlin/androidx/compose/material3/IconButtonScreenshotTest.kt
@@ -60,17 +60,16 @@
 @OptIn(ExperimentalTestApi::class, ExperimentalMaterial3Api::class)
 class IconButtonScreenshotTest {
 
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
-    @get:Rule
-    val screenshotRule = AndroidXScreenshotTestRule(GOLDEN_MATERIAL3)
+    @get:Rule val screenshotRule = AndroidXScreenshotTestRule(GOLDEN_MATERIAL3)
 
     // TODO(b/267253920): Add a compose test API to set/reset InputMode.
     @After
-    fun resetTouchMode() = with(InstrumentationRegistry.getInstrumentation()) {
-        if (SDK_INT < 33) setInTouchMode(true) else resetInTouchMode()
-    }
+    fun resetTouchMode() =
+        with(InstrumentationRegistry.getInstrumentation()) {
+            if (SDK_INT < 33) setInTouchMode(true) else resetInTouchMode()
+        }
 
     private val wrap = Modifier.wrapContentSize(Alignment.TopStart)
     private val wrapperTestTag = "iconButtonWrapper"
@@ -92,10 +91,7 @@
         rule.setMaterialContent(darkColorScheme()) {
             Box(wrap.testTag(wrapperTestTag)) {
                 IconButton(onClick = { /* doSomething() */ }) {
-                    Icon(
-                        Icons.Filled.Favorite,
-                        contentDescription = "Localized description"
-                    )
+                    Icon(Icons.Filled.Favorite, contentDescription = "Localized description")
                 }
             }
         }
@@ -125,8 +121,7 @@
         }
 
         rule.mainClock.autoAdvance = false
-        rule.onNode(hasClickAction())
-            .performTouchInput { down(center) }
+        rule.onNode(hasClickAction()).performTouchInput { down(center) }
 
         rule.mainClock.advanceTimeByFrame()
         rule.waitForIdle() // Wait for measure
@@ -148,9 +143,7 @@
                 }
             }
         }
-        rule.onNodeWithTag(wrapperTestTag).performMouseInput {
-            enter(center)
-        }
+        rule.onNodeWithTag(wrapperTestTag).performMouseInput { enter(center) }
 
         assertAgainstGolden("iconButton_lightTheme_hovered")
     }
@@ -165,8 +158,7 @@
             Box(wrap.testTag(wrapperTestTag)) {
                 IconButton(
                     onClick = { /* doSomething() */ },
-                    modifier = Modifier
-                        .focusRequester(focusRequester)
+                    modifier = Modifier.focusRequester(focusRequester)
                 ) {
                     Icon(Icons.Filled.Favorite, contentDescription = "Localized description")
                 }
@@ -187,10 +179,7 @@
         rule.setMaterialContent(lightColorScheme()) {
             Box(wrap.testTag(wrapperTestTag)) {
                 IconButton(onClick = { /* doSomething() */ }) {
-                    Box(
-                        Modifier
-                            .size(100.dp)
-                            .background(Color.Blue))
+                    Box(Modifier.size(100.dp).background(Color.Blue))
                 }
             }
         }
@@ -250,10 +239,7 @@
         rule.setMaterialContent(lightColorScheme()) {
             Box(wrap.testTag(wrapperTestTag)) {
                 IconToggleButton(checked = true, onCheckedChange = { /* doSomething() */ }) {
-                    Box(
-                        Modifier
-                            .size(100.dp)
-                            .background(Color.Blue))
+                    Box(Modifier.size(100.dp).background(Color.Blue))
                 }
             }
         }
@@ -277,10 +263,7 @@
         rule.setMaterialContent(darkColorScheme()) {
             Box(wrap.testTag(wrapperTestTag)) {
                 FilledIconButton(onClick = { /* doSomething() */ }) {
-                    Icon(
-                        Icons.Filled.Favorite,
-                        contentDescription = "Localized description"
-                    )
+                    Icon(Icons.Filled.Favorite, contentDescription = "Localized description")
                 }
             }
         }
@@ -367,10 +350,7 @@
     fun filledTonalIconButton_lightTheme_disabled() {
         rule.setMaterialContent(lightColorScheme()) {
             Box(wrap.testTag(wrapperTestTag)) {
-                FilledTonalIconButton(
-                    onClick = { /* doSomething() */ },
-                    enabled = false
-                ) {
+                FilledTonalIconButton(onClick = { /* doSomething() */ }, enabled = false) {
                     Icon(Icons.Filled.Favorite, contentDescription = "Localized description")
                 }
             }
@@ -383,10 +363,7 @@
         rule.setMaterialContent(darkColorScheme()) {
             Box(wrap.testTag(wrapperTestTag)) {
                 FilledTonalIconButton(onClick = { /* doSomething() */ }) {
-                    Icon(
-                        Icons.Filled.Favorite,
-                        contentDescription = "Localized description"
-                    )
+                    Icon(Icons.Filled.Favorite, contentDescription = "Localized description")
                 }
             }
         }
@@ -504,7 +481,8 @@
             Box(wrap.testTag(wrapperTestTag)) {
                 OutlinedIconToggleButton(
                     checked = false,
-                    onCheckedChange = { /* doSomething() */ }) {
+                    onCheckedChange = { /* doSomething() */ }
+                ) {
                     Icon(
                         Icons.Outlined.FavoriteBorder,
                         contentDescription = "Localized description"
@@ -521,7 +499,8 @@
             Box(wrap.testTag(wrapperTestTag)) {
                 OutlinedIconToggleButton(
                     checked = false,
-                    onCheckedChange = { /* doSomething() */ }) {
+                    onCheckedChange = { /* doSomething() */ }
+                ) {
                     Icon(
                         Icons.Outlined.FavoriteBorder,
                         contentDescription = "Localized description"
@@ -538,7 +517,8 @@
             Box(wrap.testTag(wrapperTestTag)) {
                 OutlinedIconToggleButton(
                     checked = true,
-                    onCheckedChange = { /* doSomething() */ }) {
+                    onCheckedChange = { /* doSomething() */ }
+                ) {
                     Icon(Icons.Filled.Favorite, contentDescription = "Localized description")
                 }
             }
@@ -552,7 +532,8 @@
             Box(wrap.testTag(wrapperTestTag)) {
                 OutlinedIconToggleButton(
                     checked = true,
-                    onCheckedChange = { /* doSomething() */ }) {
+                    onCheckedChange = { /* doSomething() */ }
+                ) {
                     Icon(Icons.Filled.Favorite, contentDescription = "Localized description")
                 }
             }
@@ -561,7 +542,8 @@
     }
 
     private fun assertAgainstGolden(goldenName: String) {
-        rule.onNodeWithTag(wrapperTestTag)
+        rule
+            .onNodeWithTag(wrapperTestTag)
             .captureToImage()
             .assertAgainstGolden(screenshotRule, goldenName)
     }
diff --git a/compose/material3/material3/src/androidInstrumentedTest/kotlin/androidx/compose/material3/IconButtonTest.kt b/compose/material3/material3/src/androidInstrumentedTest/kotlin/androidx/compose/material3/IconButtonTest.kt
index 4bf3aab..7d0caf9 100644
--- a/compose/material3/material3/src/androidInstrumentedTest/kotlin/androidx/compose/material3/IconButtonTest.kt
+++ b/compose/material3/material3/src/androidInstrumentedTest/kotlin/androidx/compose/material3/IconButtonTest.kt
@@ -69,12 +69,9 @@
 @OptIn(ExperimentalMaterial3Api::class)
 @LargeTest
 @RunWith(AndroidJUnit4::class)
-/**
- * Tests for icon buttons.
- */
+/** Tests for icon buttons. */
 class IconButtonTest {
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
     @Test
     fun iconButton_size() {
@@ -130,6 +127,7 @@
             .assertTouchWidthIsEqualTo(customTouchTargetSize)
             .assertTouchHeightIsEqualTo(customTouchTargetSize)
     }
+
     @Test
     fun iconButton_defaultSemantics() {
         rule.setMaterialContent(lightColorScheme()) {
@@ -145,9 +143,7 @@
 
     @Test
     fun iconButton_disabledSemantics() {
-        rule.setMaterialContent(lightColorScheme()) {
-            IconButton(onClick = {}, enabled = false) {}
-        }
+        rule.setMaterialContent(lightColorScheme()) { IconButton(onClick = {}, enabled = false) {} }
         rule.onNode(hasClickAction()).apply {
             assert(SemanticsMatcher.expectValue(SemanticsProperties.Role, Role.Button))
             assertIsNotEnabled()
@@ -157,19 +153,12 @@
     @Test
     fun iconButton_materialIconSize_iconPositioning() {
         rule.setMaterialContent(lightColorScheme()) {
-            Box {
-                IconButton(onClick = {}) {
-                    Box(
-                        Modifier
-                            .size(IconSize)
-                            .testTag(IconTestTag)
-                    )
-                }
-            }
+            Box { IconButton(onClick = {}) { Box(Modifier.size(IconSize).testTag(IconTestTag)) } }
         }
 
         // Icon should be centered inside the IconButton
-        rule.onNodeWithTag(IconTestTag, useUnmergedTree = true)
+        rule
+            .onNodeWithTag(IconTestTag, useUnmergedTree = true)
             .assertLeftPositionInRootIsEqualTo((IconButtonAccessibilitySize - IconSize) / 2)
             .assertTopPositionInRootIsEqualTo((IconButtonAccessibilitySize - IconSize) / 2)
     }
@@ -180,18 +169,13 @@
         val height = 14.dp
         rule.setMaterialContent(lightColorScheme()) {
             Box {
-                IconButton(onClick = {}) {
-                    Box(
-                        Modifier
-                            .size(width, height)
-                            .testTag(IconTestTag)
-                    )
-                }
+                IconButton(onClick = {}) { Box(Modifier.size(width, height).testTag(IconTestTag)) }
             }
         }
 
         // Icon should be centered inside the IconButton
-        rule.onNodeWithTag(IconTestTag, useUnmergedTree = true)
+        rule
+            .onNodeWithTag(IconTestTag, useUnmergedTree = true)
             .assertLeftPositionInRootIsEqualTo((IconButtonAccessibilitySize - width) / 2)
             .assertTopPositionInRootIsEqualTo((IconButtonAccessibilitySize - height) / 2)
     }
@@ -200,17 +184,16 @@
     fun iconButton_defaultColors() {
         rule.setMaterialContent(lightColorScheme()) {
             CompositionLocalProvider(LocalContentColor provides Color.Blue) {
-                Truth.assertThat(
-                    IconButtonDefaults.iconButtonColors()
-                ).isEqualTo(
-                    IconButtonColors(
-                        containerColor = Color.Transparent,
-                        contentColor = LocalContentColor.current,
-                        disabledContainerColor = Color.Transparent,
-                        disabledContentColor =
-                        Color.Blue.copy(alpha = IconButtonTokens.DisabledIconOpacity)
+                Truth.assertThat(IconButtonDefaults.iconButtonColors())
+                    .isEqualTo(
+                        IconButtonColors(
+                            containerColor = Color.Transparent,
+                            contentColor = LocalContentColor.current,
+                            disabledContainerColor = Color.Transparent,
+                            disabledContentColor =
+                                Color.Blue.copy(alpha = IconButtonTokens.DisabledIconOpacity)
+                        )
                     )
-                )
             }
         }
     }
@@ -224,9 +207,7 @@
             }
 
             CompositionLocalProvider(LocalContentColor provides Color.Red) {
-                val colors = IconButtonDefaults.iconButtonColors(
-                    containerColor = Color.Green
-                )
+                val colors = IconButtonDefaults.iconButtonColors(containerColor = Color.Green)
                 assert(colors.containerColor == Color.Green)
                 assert(colors.contentColor == Color.Red)
             }
@@ -240,21 +221,22 @@
                 val colors = IconButtonDefaults.iconButtonColors()
                 assert(colors.contentColor == Color.Blue)
                 assert(
-                    colors.disabledContentColor
-                        == Color.Blue.copy(IconButtonTokens.DisabledIconOpacity)
+                    colors.disabledContentColor ==
+                        Color.Blue.copy(IconButtonTokens.DisabledIconOpacity)
                 )
             }
 
             CompositionLocalProvider(LocalContentColor provides Color.Red) {
-                val colors = IconButtonDefaults.iconButtonColors(
-                    containerColor = Color.Blue,
-                    contentColor = Color.Green
-                )
+                val colors =
+                    IconButtonDefaults.iconButtonColors(
+                        containerColor = Color.Blue,
+                        contentColor = Color.Green
+                    )
                 assert(colors.containerColor == Color.Blue)
                 assert(colors.contentColor == Color.Green)
                 assert(
-                    colors.disabledContentColor
-                        == Color.Green.copy(IconButtonTokens.DisabledIconOpacity)
+                    colors.disabledContentColor ==
+                        Color.Green.copy(IconButtonTokens.DisabledIconOpacity)
                 )
             }
         }
@@ -334,17 +316,14 @@
         rule.setMaterialContent(lightColorScheme()) {
             Box {
                 IconToggleButton(checked = false, onCheckedChange = {}) {
-                    Box(
-                        Modifier
-                            .size(IconSize)
-                            .testTag(IconTestTag)
-                    )
+                    Box(Modifier.size(IconSize).testTag(IconTestTag))
                 }
             }
         }
 
         // Icon should be centered inside the IconToggleButton
-        rule.onNodeWithTag(IconTestTag, useUnmergedTree = true)
+        rule
+            .onNodeWithTag(IconTestTag, useUnmergedTree = true)
             .assertLeftPositionInRootIsEqualTo((IconButtonAccessibilitySize - IconSize) / 2)
             .assertTopPositionInRootIsEqualTo((IconButtonAccessibilitySize - IconSize) / 2)
     }
@@ -356,68 +335,62 @@
         rule.setMaterialContent(lightColorScheme()) {
             Box {
                 IconToggleButton(checked = false, onCheckedChange = {}) {
-                    Box(
-                        Modifier
-                            .size(width, height)
-                            .testTag(IconTestTag)
-                    )
+                    Box(Modifier.size(width, height).testTag(IconTestTag))
                 }
             }
         }
 
         // Icon should be centered inside the IconToggleButton
-        rule.onNodeWithTag(IconTestTag, useUnmergedTree = true)
+        rule
+            .onNodeWithTag(IconTestTag, useUnmergedTree = true)
             .assertLeftPositionInRootIsEqualTo((IconButtonAccessibilitySize - width) / 2)
             .assertTopPositionInRootIsEqualTo((IconButtonAccessibilitySize - height) / 2)
     }
 
     @Test
-    fun iconToggleButton_clickInMinimumTouchTarget(): Unit = with(rule.density) {
-        val tag = "iconToggleButton"
-        var checked by mutableStateOf(false)
-        rule.setMaterialContent(lightColorScheme()) {
-            // Box is needed because otherwise the control will be expanded to fill its parent
-            Box(Modifier.fillMaxSize()) {
-                IconToggleButton(
-                    checked = checked,
-                    onCheckedChange = { checked = it },
-                    modifier = Modifier
-                        .align(Alignment.Center)
-                        .requiredSize(2.dp)
-                        .testTag(tag)
-                ) {
-                    Box(Modifier.size(2.dp))
+    fun iconToggleButton_clickInMinimumTouchTarget(): Unit =
+        with(rule.density) {
+            val tag = "iconToggleButton"
+            var checked by mutableStateOf(false)
+            rule.setMaterialContent(lightColorScheme()) {
+                // Box is needed because otherwise the control will be expanded to fill its parent
+                Box(Modifier.fillMaxSize()) {
+                    IconToggleButton(
+                        checked = checked,
+                        onCheckedChange = { checked = it },
+                        modifier = Modifier.align(Alignment.Center).requiredSize(2.dp).testTag(tag)
+                    ) {
+                        Box(Modifier.size(2.dp))
+                    }
                 }
             }
+            rule
+                .onNodeWithTag(tag)
+                .assertIsOff()
+                .assertWidthIsEqualTo(2.dp)
+                .assertHeightIsEqualTo(2.dp)
+                .assertTouchWidthIsEqualTo(48.dp)
+                .assertTouchHeightIsEqualTo(48.dp)
+                .performTouchInput { click(position = Offset(-1f, -1f)) }
+                .assertIsOn()
         }
-        rule.onNodeWithTag(tag)
-            .assertIsOff()
-            .assertWidthIsEqualTo(2.dp)
-            .assertHeightIsEqualTo(2.dp)
-            .assertTouchWidthIsEqualTo(48.dp)
-            .assertTouchHeightIsEqualTo(48.dp)
-            .performTouchInput {
-                click(position = Offset(-1f, -1f))
-            }.assertIsOn()
-    }
 
     @Test
     fun iconToggleButton_defaultColors() {
         rule.setMaterialContent(lightColorScheme()) {
             val localContentColor = LocalContentColor.current
-            Truth.assertThat(
-                IconButtonDefaults.iconToggleButtonColors()
-            ).isEqualTo(
-                IconToggleButtonColors(
-                    containerColor = Color.Transparent,
-                    contentColor = localContentColor,
-                    disabledContainerColor = Color.Transparent,
-                    disabledContentColor =
-                    localContentColor.copy(alpha = IconButtonTokens.DisabledIconOpacity),
-                    checkedContainerColor = Color.Transparent,
-                    checkedContentColor = IconButtonTokens.SelectedIconColor.value
+            Truth.assertThat(IconButtonDefaults.iconToggleButtonColors())
+                .isEqualTo(
+                    IconToggleButtonColors(
+                        containerColor = Color.Transparent,
+                        contentColor = localContentColor,
+                        disabledContainerColor = Color.Transparent,
+                        disabledContentColor =
+                            localContentColor.copy(alpha = IconButtonTokens.DisabledIconOpacity),
+                        checkedContainerColor = Color.Transparent,
+                        checkedContentColor = IconButtonTokens.SelectedIconColor.value
+                    )
                 )
-            )
         }
     }
 
@@ -481,18 +454,13 @@
     fun filledIconButton_materialIconSize_iconPositioning() {
         rule.setMaterialContent(lightColorScheme()) {
             Box {
-                FilledIconButton(onClick = {}) {
-                    Box(
-                        Modifier
-                            .size(IconSize)
-                            .testTag(IconTestTag)
-                    )
-                }
+                FilledIconButton(onClick = {}) { Box(Modifier.size(IconSize).testTag(IconTestTag)) }
             }
         }
 
         // Icon should be centered inside the IconButton
-        rule.onNodeWithTag(IconTestTag, useUnmergedTree = true)
+        rule
+            .onNodeWithTag(IconTestTag, useUnmergedTree = true)
             .assertLeftPositionInRootIsEqualTo((IconButtonAccessibilitySize - IconSize) / 2)
             .assertTopPositionInRootIsEqualTo((IconButtonAccessibilitySize - IconSize) / 2)
     }
@@ -504,17 +472,14 @@
         rule.setMaterialContent(lightColorScheme()) {
             Box {
                 FilledIconButton(onClick = {}) {
-                    Box(
-                        Modifier
-                            .size(width, height)
-                            .testTag(IconTestTag)
-                    )
+                    Box(Modifier.size(width, height).testTag(IconTestTag))
                 }
             }
         }
 
         // Icon should be centered inside the FilledIconButton
-        rule.onNodeWithTag(IconTestTag, useUnmergedTree = true)
+        rule
+            .onNodeWithTag(IconTestTag, useUnmergedTree = true)
             .assertLeftPositionInRootIsEqualTo((IconButtonAccessibilitySize - width) / 2)
             .assertTopPositionInRootIsEqualTo((IconButtonAccessibilitySize - height) / 2)
     }
@@ -522,18 +487,21 @@
     @Test
     fun filledIconButton_defaultColors() {
         rule.setMaterialContent(lightColorScheme()) {
-            Truth.assertThat(
-                IconButtonDefaults.filledIconButtonColors()
-            ).isEqualTo(
-                IconButtonColors(
-                    containerColor = FilledIconButtonTokens.ContainerColor.value,
-                    contentColor = contentColorFor(FilledIconButtonTokens.ContainerColor.value),
-                    disabledContainerColor = FilledIconButtonTokens.DisabledContainerColor.value
-                        .copy(alpha = FilledIconButtonTokens.DisabledContainerOpacity),
-                    disabledContentColor = FilledIconButtonTokens.DisabledColor.value
-                        .copy(alpha = FilledIconButtonTokens.DisabledOpacity)
+            Truth.assertThat(IconButtonDefaults.filledIconButtonColors())
+                .isEqualTo(
+                    IconButtonColors(
+                        containerColor = FilledIconButtonTokens.ContainerColor.value,
+                        contentColor = contentColorFor(FilledIconButtonTokens.ContainerColor.value),
+                        disabledContainerColor =
+                            FilledIconButtonTokens.DisabledContainerColor.value.copy(
+                                alpha = FilledIconButtonTokens.DisabledContainerOpacity
+                            ),
+                        disabledContentColor =
+                            FilledIconButtonTokens.DisabledColor.value.copy(
+                                alpha = FilledIconButtonTokens.DisabledOpacity
+                            )
+                    )
                 )
-            )
         }
     }
 
@@ -566,20 +534,22 @@
     @Test
     fun filledTonalIconButton_defaultColors() {
         rule.setMaterialContent(lightColorScheme()) {
-            Truth.assertThat(
-                IconButtonDefaults.filledTonalIconButtonColors()
-            ).isEqualTo(
-                IconButtonColors(
-                    containerColor = FilledTonalIconButtonTokens.ContainerColor.value,
-                    contentColor =
-                    contentColorFor(FilledTonalIconButtonTokens.ContainerColor.value),
-                    disabledContainerColor =
-                    FilledTonalIconButtonTokens.DisabledContainerColor.value
-                        .copy(alpha = FilledTonalIconButtonTokens.DisabledContainerOpacity),
-                    disabledContentColor = FilledTonalIconButtonTokens.DisabledColor.value
-                        .copy(alpha = FilledTonalIconButtonTokens.DisabledOpacity)
+            Truth.assertThat(IconButtonDefaults.filledTonalIconButtonColors())
+                .isEqualTo(
+                    IconButtonColors(
+                        containerColor = FilledTonalIconButtonTokens.ContainerColor.value,
+                        contentColor =
+                            contentColorFor(FilledTonalIconButtonTokens.ContainerColor.value),
+                        disabledContainerColor =
+                            FilledTonalIconButtonTokens.DisabledContainerColor.value.copy(
+                                alpha = FilledTonalIconButtonTokens.DisabledContainerOpacity
+                            ),
+                        disabledContentColor =
+                            FilledTonalIconButtonTokens.DisabledColor.value.copy(
+                                alpha = FilledTonalIconButtonTokens.DisabledOpacity
+                            )
+                    )
                 )
-            )
         }
     }
 
@@ -606,7 +576,8 @@
                 ) {
                     FilledIconToggleButton(
                         checked = true,
-                        onCheckedChange = { /* doSomething() */ }) {
+                        onCheckedChange = { /* doSomething() */ }
+                    ) {
                         Icon(Icons.Filled.Favorite, contentDescription = "Localized description")
                     }
                 }
@@ -651,17 +622,14 @@
         rule.setMaterialContent(lightColorScheme()) {
             Box {
                 FilledIconToggleButton(checked = false, onCheckedChange = {}) {
-                    Box(
-                        Modifier
-                            .size(IconSize)
-                            .testTag(IconTestTag)
-                    )
+                    Box(Modifier.size(IconSize).testTag(IconTestTag))
                 }
             }
         }
 
         // Icon should be centered inside the FilledIconToggleButton
-        rule.onNodeWithTag(IconTestTag, useUnmergedTree = true)
+        rule
+            .onNodeWithTag(IconTestTag, useUnmergedTree = true)
             .assertLeftPositionInRootIsEqualTo((IconButtonAccessibilitySize - IconSize) / 2)
             .assertTopPositionInRootIsEqualTo((IconButtonAccessibilitySize - IconSize) / 2)
     }
@@ -673,17 +641,14 @@
         rule.setMaterialContent(lightColorScheme()) {
             Box {
                 FilledIconToggleButton(checked = false, onCheckedChange = {}) {
-                    Box(
-                        Modifier
-                            .size(width, height)
-                            .testTag(IconTestTag)
-                    )
+                    Box(Modifier.size(width, height).testTag(IconTestTag))
                 }
             }
         }
 
         // Icon should be centered inside the FilledIconToggleButton
-        rule.onNodeWithTag(IconTestTag, useUnmergedTree = true)
+        rule
+            .onNodeWithTag(IconTestTag, useUnmergedTree = true)
             .assertLeftPositionInRootIsEqualTo((IconButtonAccessibilitySize - width) / 2)
             .assertTopPositionInRootIsEqualTo((IconButtonAccessibilitySize - height) / 2)
     }
@@ -691,48 +656,54 @@
     @Test
     fun filledIconToggleButton_defaultColors() {
         rule.setMaterialContent(lightColorScheme()) {
-            Truth.assertThat(
-                IconButtonDefaults.filledIconToggleButtonColors()
-            ).isEqualTo(
-                IconToggleButtonColors(
-                    containerColor = FilledIconButtonTokens.UnselectedContainerColor.value,
-                    // TODO(b/228455081): Using contentColorFor here will return OnSurfaceVariant,
-                    //  while the token value is Primary.
-                    contentColor = FilledIconButtonTokens.ToggleUnselectedColor.value,
-                    disabledContainerColor = FilledIconButtonTokens.DisabledContainerColor.value
-                        .copy(alpha = FilledIconButtonTokens.DisabledContainerOpacity),
-                    disabledContentColor = FilledIconButtonTokens.DisabledColor.value
-                        .copy(alpha = FilledIconButtonTokens.DisabledOpacity),
-                    checkedContainerColor = FilledIconButtonTokens.SelectedContainerColor.value,
-                    checkedContentColor =
-                    contentColorFor(FilledIconButtonTokens.SelectedContainerColor.value)
+            Truth.assertThat(IconButtonDefaults.filledIconToggleButtonColors())
+                .isEqualTo(
+                    IconToggleButtonColors(
+                        containerColor = FilledIconButtonTokens.UnselectedContainerColor.value,
+                        // TODO(b/228455081): Using contentColorFor here will return
+                        // OnSurfaceVariant,
+                        //  while the token value is Primary.
+                        contentColor = FilledIconButtonTokens.ToggleUnselectedColor.value,
+                        disabledContainerColor =
+                            FilledIconButtonTokens.DisabledContainerColor.value.copy(
+                                alpha = FilledIconButtonTokens.DisabledContainerOpacity
+                            ),
+                        disabledContentColor =
+                            FilledIconButtonTokens.DisabledColor.value.copy(
+                                alpha = FilledIconButtonTokens.DisabledOpacity
+                            ),
+                        checkedContainerColor = FilledIconButtonTokens.SelectedContainerColor.value,
+                        checkedContentColor =
+                            contentColorFor(FilledIconButtonTokens.SelectedContainerColor.value)
+                    )
                 )
-            )
         }
     }
 
     @Test
     fun filledTonalIconToggleButton_defaultColors() {
         rule.setMaterialContent(lightColorScheme()) {
-            Truth.assertThat(
-                IconButtonDefaults.filledTonalIconToggleButtonColors()
-            ).isEqualTo(
-                IconToggleButtonColors(
-                    containerColor = FilledTonalIconButtonTokens.UnselectedContainerColor.value,
-                    contentColor =
-                    contentColorFor(
-                        FilledTonalIconButtonTokens.UnselectedContainerColor.value
-                    ),
-                    disabledContainerColor =
-                    FilledTonalIconButtonTokens.DisabledContainerColor.value
-                        .copy(alpha = FilledTonalIconButtonTokens.DisabledContainerOpacity),
-                    disabledContentColor = FilledTonalIconButtonTokens.DisabledColor.value
-                        .copy(alpha = FilledTonalIconButtonTokens.DisabledOpacity),
-                    checkedContainerColor =
-                    FilledTonalIconButtonTokens.SelectedContainerColor.value,
-                    checkedContentColor = FilledTonalIconButtonTokens.ToggleSelectedColor.value
+            Truth.assertThat(IconButtonDefaults.filledTonalIconToggleButtonColors())
+                .isEqualTo(
+                    IconToggleButtonColors(
+                        containerColor = FilledTonalIconButtonTokens.UnselectedContainerColor.value,
+                        contentColor =
+                            contentColorFor(
+                                FilledTonalIconButtonTokens.UnselectedContainerColor.value
+                            ),
+                        disabledContainerColor =
+                            FilledTonalIconButtonTokens.DisabledContainerColor.value.copy(
+                                alpha = FilledTonalIconButtonTokens.DisabledContainerOpacity
+                            ),
+                        disabledContentColor =
+                            FilledTonalIconButtonTokens.DisabledColor.value.copy(
+                                alpha = FilledTonalIconButtonTokens.DisabledOpacity
+                            ),
+                        checkedContainerColor =
+                            FilledTonalIconButtonTokens.SelectedContainerColor.value,
+                        checkedContentColor = FilledTonalIconButtonTokens.ToggleSelectedColor.value
+                    )
                 )
-            )
         }
     }
 
@@ -803,17 +774,14 @@
         rule.setMaterialContent(lightColorScheme()) {
             Box {
                 OutlinedIconButton(onClick = {}) {
-                    Box(
-                        Modifier
-                            .size(IconSize)
-                            .testTag(IconTestTag)
-                    )
+                    Box(Modifier.size(IconSize).testTag(IconTestTag))
                 }
             }
         }
 
         // Icon should be centered inside the IconButton
-        rule.onNodeWithTag(IconTestTag, useUnmergedTree = true)
+        rule
+            .onNodeWithTag(IconTestTag, useUnmergedTree = true)
             .assertLeftPositionInRootIsEqualTo((IconButtonAccessibilitySize - IconSize) / 2)
             .assertTopPositionInRootIsEqualTo((IconButtonAccessibilitySize - IconSize) / 2)
     }
@@ -825,17 +793,14 @@
         rule.setMaterialContent(lightColorScheme()) {
             Box {
                 OutlinedIconButton(onClick = {}) {
-                    Box(
-                        Modifier
-                            .size(width, height)
-                            .testTag(IconTestTag)
-                    )
+                    Box(Modifier.size(width, height).testTag(IconTestTag))
                 }
             }
         }
 
         // Icon should be centered inside the OutlinedIconButton
-        rule.onNodeWithTag(IconTestTag, useUnmergedTree = true)
+        rule
+            .onNodeWithTag(IconTestTag, useUnmergedTree = true)
             .assertLeftPositionInRootIsEqualTo((IconButtonAccessibilitySize - width) / 2)
             .assertTopPositionInRootIsEqualTo((IconButtonAccessibilitySize - height) / 2)
     }
@@ -844,17 +809,16 @@
     fun outlinedIconButton_defaultColors() {
         rule.setMaterialContent(lightColorScheme()) {
             val localContentColor = LocalContentColor.current
-            Truth.assertThat(
-                IconButtonDefaults.outlinedIconButtonColors()
-            ).isEqualTo(
-                IconButtonColors(
-                    containerColor = Color.Transparent,
-                    contentColor = localContentColor,
-                    disabledContainerColor = Color.Transparent,
-                    disabledContentColor =
-                    localContentColor.copy(alpha = OutlinedIconButtonTokens.DisabledOpacity)
+            Truth.assertThat(IconButtonDefaults.outlinedIconButtonColors())
+                .isEqualTo(
+                    IconButtonColors(
+                        containerColor = Color.Transparent,
+                        contentColor = localContentColor,
+                        disabledContainerColor = Color.Transparent,
+                        disabledContentColor =
+                            localContentColor.copy(alpha = OutlinedIconButtonTokens.DisabledOpacity)
+                    )
                 )
-            )
         }
     }
 
@@ -864,7 +828,8 @@
             .setMaterialContentForSizeAssertions {
                 OutlinedIconToggleButton(
                     checked = true,
-                    onCheckedChange = { /* doSomething() */ }) {
+                    onCheckedChange = { /* doSomething() */ }
+                ) {
                     Icon(
                         Icons.Outlined.FavoriteBorder,
                         contentDescription = "Localized description"
@@ -886,7 +851,8 @@
                 ) {
                     OutlinedIconToggleButton(
                         checked = true,
-                        onCheckedChange = { /* doSomething() */ }) {
+                        onCheckedChange = { /* doSomething() */ }
+                    ) {
                         Icon(
                             Icons.Outlined.FavoriteBorder,
                             contentDescription = "Localized description"
@@ -934,17 +900,14 @@
         rule.setMaterialContent(lightColorScheme()) {
             Box {
                 OutlinedIconToggleButton(checked = false, onCheckedChange = {}) {
-                    Box(
-                        Modifier
-                            .size(IconSize)
-                            .testTag(IconTestTag)
-                    )
+                    Box(Modifier.size(IconSize).testTag(IconTestTag))
                 }
             }
         }
 
         // Icon should be centered inside the OutlinedIconToggleButton
-        rule.onNodeWithTag(IconTestTag, useUnmergedTree = true)
+        rule
+            .onNodeWithTag(IconTestTag, useUnmergedTree = true)
             .assertLeftPositionInRootIsEqualTo((IconButtonAccessibilitySize - IconSize) / 2)
             .assertTopPositionInRootIsEqualTo((IconButtonAccessibilitySize - IconSize) / 2)
     }
@@ -956,17 +919,14 @@
         rule.setMaterialContent(lightColorScheme()) {
             Box {
                 OutlinedIconToggleButton(checked = false, onCheckedChange = {}) {
-                    Box(
-                        Modifier
-                            .size(width, height)
-                            .testTag(IconTestTag)
-                    )
+                    Box(Modifier.size(width, height).testTag(IconTestTag))
                 }
             }
         }
 
         // Icon should be centered inside the OutlinedIconToggleButton
-        rule.onNodeWithTag(IconTestTag, useUnmergedTree = true)
+        rule
+            .onNodeWithTag(IconTestTag, useUnmergedTree = true)
             .assertLeftPositionInRootIsEqualTo((IconButtonAccessibilitySize - width) / 2)
             .assertTopPositionInRootIsEqualTo((IconButtonAccessibilitySize - height) / 2)
     }
@@ -975,21 +935,22 @@
     fun outlinedIconToggleButton_defaualtColors() {
         rule.setMaterialContent(lightColorScheme()) {
             val localContentColor = LocalContentColor.current
-            Truth.assertThat(
-                IconButtonDefaults.outlinedIconToggleButtonColors()
-            ).isEqualTo(
-                IconToggleButtonColors(
-                    containerColor = Color.Transparent,
-                    contentColor = localContentColor,
-                    disabledContainerColor = Color.Transparent,
-                    disabledContentColor =
-                    localContentColor.copy(alpha = OutlinedIconButtonTokens.DisabledOpacity),
-                    checkedContainerColor =
-                    OutlinedIconButtonTokens.SelectedContainerColor.value,
-                    checkedContentColor =
-                    contentColorFor(OutlinedIconButtonTokens.SelectedContainerColor.value)
+            Truth.assertThat(IconButtonDefaults.outlinedIconToggleButtonColors())
+                .isEqualTo(
+                    IconToggleButtonColors(
+                        containerColor = Color.Transparent,
+                        contentColor = localContentColor,
+                        disabledContainerColor = Color.Transparent,
+                        disabledContentColor =
+                            localContentColor.copy(
+                                alpha = OutlinedIconButtonTokens.DisabledOpacity
+                            ),
+                        checkedContainerColor =
+                            OutlinedIconButtonTokens.SelectedContainerColor.value,
+                        checkedContentColor =
+                            contentColorFor(OutlinedIconButtonTokens.SelectedContainerColor.value)
+                    )
                 )
-            )
         }
     }
 
diff --git a/compose/material3/material3/src/androidInstrumentedTest/kotlin/androidx/compose/material3/IconTest.kt b/compose/material3/material3/src/androidInstrumentedTest/kotlin/androidx/compose/material3/IconTest.kt
index 7d7ddf3..ce98cae 100644
--- a/compose/material3/material3/src/androidInstrumentedTest/kotlin/androidx/compose/material3/IconTest.kt
+++ b/compose/material3/material3/src/androidInstrumentedTest/kotlin/androidx/compose/material3/IconTest.kt
@@ -55,8 +55,7 @@
 @LargeTest
 @RunWith(AndroidJUnit4::class)
 class IconTest {
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
     @Test
     fun vector_materialIconSize_dimensions() {
@@ -64,9 +63,7 @@
         val height = 24.dp
         val vector = Icons.Filled.Menu
         rule
-            .setMaterialContentForSizeAssertions {
-                Icon(vector, null)
-            }
+            .setMaterialContentForSizeAssertions { Icon(vector, null) }
             .assertWidthIsEqualTo(width)
             .assertHeightIsEqualTo(height)
     }
@@ -75,14 +72,16 @@
     fun vector_customIconSize_dimensions() {
         val width = 35.dp
         val height = 83.dp
-        val vector = ImageVector.Builder(
-            defaultWidth = width, defaultHeight = height,
-            viewportWidth = width.value, viewportHeight = height.value
-        ).build()
+        val vector =
+            ImageVector.Builder(
+                    defaultWidth = width,
+                    defaultHeight = height,
+                    viewportWidth = width.value,
+                    viewportHeight = height.value
+                )
+                .build()
         rule
-            .setMaterialContentForSizeAssertions {
-                Icon(vector, null)
-            }
+            .setMaterialContentForSizeAssertions { Icon(vector, null) }
             .assertWidthIsEqualTo(width)
             .assertHeightIsEqualTo(height)
     }
@@ -93,9 +92,10 @@
         val height = 24.dp
         rule
             .setMaterialContentForSizeAssertions {
-                val image = with(LocalDensity.current) {
-                    ImageBitmap(width.roundToPx(), height.roundToPx())
-                }
+                val image =
+                    with(LocalDensity.current) {
+                        ImageBitmap(width.roundToPx(), height.roundToPx())
+                    }
 
                 Icon(image, null)
             }
@@ -110,9 +110,10 @@
 
         rule
             .setMaterialContentForSizeAssertions {
-                val image = with(LocalDensity.current) {
-                    ImageBitmap(width.roundToPx(), height.roundToPx())
-                }
+                val image =
+                    with(LocalDensity.current) {
+                        ImageBitmap(width.roundToPx(), height.roundToPx())
+                    }
 
                 Icon(image, null)
             }
@@ -126,9 +127,7 @@
         val height = 24.dp
         val painter = ColorPainter(Color.Red)
         rule
-            .setMaterialContentForSizeAssertions {
-                Icon(painter, null)
-            }
+            .setMaterialContentForSizeAssertions { Icon(painter, null) }
             .assertWidthIsEqualTo(width)
             .assertHeightIsEqualTo(height)
     }
@@ -140,9 +139,10 @@
 
         rule
             .setMaterialContentForSizeAssertions {
-                val image = with(LocalDensity.current) {
-                    ImageBitmap(width.roundToPx(), height.roundToPx())
-                }
+                val image =
+                    with(LocalDensity.current) {
+                        ImageBitmap(width.roundToPx(), height.roundToPx())
+                    }
 
                 val bitmapPainter = BitmapPainter(image)
                 Icon(bitmapPainter, null)
@@ -162,12 +162,8 @@
         rule.setMaterialContent(lightColorScheme()) {
             val image: ImageBitmap
             with(LocalDensity.current) {
-                image = createBitmapWithColor(
-                    this,
-                    width.roundToPx(),
-                    height.roundToPx(),
-                    Color.Red
-                )
+                image =
+                    createBitmapWithColor(this, width.roundToPx(), height.roundToPx(), Color.Red)
             }
             Icon(
                 image,
@@ -182,12 +178,11 @@
             }
         }
 
-        rule.onNodeWithTag(testTag)
+        rule
+            .onNodeWithTag(testTag)
             .captureToImage()
             // The icon should be 50x50 and fill the whole size with red pixels
-            .assertPixels(expectedSize = expectedIntSize!!) {
-                Color.Red
-            }
+            .assertPixels(expectedSize = expectedIntSize!!) { Color.Red }
     }
 
     @SdkSuppress(minSdkVersion = Build.VERSION_CODES.O)
@@ -199,12 +194,8 @@
         rule.setMaterialContent(lightColorScheme()) {
             val image: ImageBitmap
             with(LocalDensity.current) {
-                image = createBitmapWithColor(
-                    this,
-                    width.roundToPx(),
-                    height.roundToPx(),
-                    Color.Red
-                )
+                image =
+                    createBitmapWithColor(this, width.roundToPx(), height.roundToPx(), Color.Red)
             }
             Icon(image, null, modifier = Modifier.testTag(testTag), tint = Color.Unspecified)
         }
@@ -222,12 +213,8 @@
         rule.setMaterialContent(lightColorScheme()) {
             val image: ImageBitmap
             with(LocalDensity.current) {
-                image = createBitmapWithColor(
-                    this,
-                    width.roundToPx(),
-                    height.roundToPx(),
-                    Color.Red
-                )
+                image =
+                    createBitmapWithColor(this, width.roundToPx(), height.roundToPx(), Color.Red)
             }
             Icon(image, null, modifier = Modifier.testTag(testTag), tint = Color.Blue)
         }
@@ -247,7 +234,8 @@
             )
         }
 
-        rule.onNodeWithTag(testTag)
+        rule
+            .onNodeWithTag(testTag)
             .assertContentDescriptionEquals("qwerty")
             .assert(SemanticsMatcher.expectValue(SemanticsProperties.Role, Role.Image))
     }
@@ -260,12 +248,7 @@
     ): ImageBitmap {
         val size = Size(width.toFloat(), height.toFloat())
         val image = ImageBitmap(width, height)
-        CanvasDrawScope().draw(
-            density,
-            LayoutDirection.Ltr,
-            Canvas(image),
-            size
-        ) {
+        CanvasDrawScope().draw(density, LayoutDirection.Ltr, Canvas(image), size) {
             drawRect(color)
         }
         return image
diff --git a/compose/material3/material3/src/androidInstrumentedTest/kotlin/androidx/compose/material3/ListItemScreenshotTest.kt b/compose/material3/material3/src/androidInstrumentedTest/kotlin/androidx/compose/material3/ListItemScreenshotTest.kt
index 2e2a507..6e9a373 100644
--- a/compose/material3/material3/src/androidInstrumentedTest/kotlin/androidx/compose/material3/ListItemScreenshotTest.kt
+++ b/compose/material3/material3/src/androidInstrumentedTest/kotlin/androidx/compose/material3/ListItemScreenshotTest.kt
@@ -41,11 +41,9 @@
 @OptIn(ExperimentalMaterial3Api::class)
 class ListItemScreenshotTest {
 
-    @get:Rule
-    val composeTestRule = createComposeRule()
+    @get:Rule val composeTestRule = createComposeRule()
 
-    @get:Rule
-    val screenshotRule = AndroidXScreenshotTestRule(GOLDEN_MATERIAL3)
+    @get:Rule val screenshotRule = AndroidXScreenshotTestRule(GOLDEN_MATERIAL3)
 
     @Test
     fun listItem_customColor() {
@@ -53,18 +51,14 @@
             Column(Modifier.testTag(Tag)) {
                 ListItem(
                     headlineContent = { Text("One line list item with 24x24 icon") },
-                    leadingContent = {
-                        Icon(
-                            Icons.Filled.Favorite,
-                            contentDescription = null
-                        )
-                    },
+                    leadingContent = { Icon(Icons.Filled.Favorite, contentDescription = null) },
                     colors = ListItemDefaults.colors(containerColor = Color.Red)
                 )
                 HorizontalDivider()
             }
         }
-        composeTestRule.onNodeWithTag(Tag)
+        composeTestRule
+            .onNodeWithTag(Tag)
             .captureToImage()
             .assertAgainstGolden(screenshotRule, "list_oneLine_customColor")
     }
@@ -77,17 +71,13 @@
                 HorizontalDivider()
                 ListItem(
                     headlineContent = { Text("One line list item with 24x24 icon") },
-                    leadingContent = {
-                        Icon(
-                            Icons.Filled.Favorite,
-                            contentDescription = null
-                        )
-                    }
+                    leadingContent = { Icon(Icons.Filled.Favorite, contentDescription = null) }
                 )
                 HorizontalDivider()
             }
         }
-        composeTestRule.onNodeWithTag(Tag)
+        composeTestRule
+            .onNodeWithTag(Tag)
             .captureToImage()
             .assertAgainstGolden(screenshotRule, "list_oneLine_lightTheme")
     }
@@ -100,17 +90,13 @@
                 HorizontalDivider()
                 ListItem(
                     headlineContent = { Text("One line list item with 24x24 icon") },
-                    leadingContent = {
-                        Icon(
-                            Icons.Filled.Favorite,
-                            contentDescription = null
-                        )
-                    }
+                    leadingContent = { Icon(Icons.Filled.Favorite, contentDescription = null) }
                 )
                 HorizontalDivider()
             }
         }
-        composeTestRule.onNodeWithTag(Tag)
+        composeTestRule
+            .onNodeWithTag(Tag)
             .captureToImage()
             .assertAgainstGolden(screenshotRule, "list_oneLine_darkTheme")
     }
@@ -132,17 +118,13 @@
                 ListItem(
                     headlineContent = { Text("Two line list item with 24x24 icon") },
                     supportingContent = { Text("Secondary text") },
-                    leadingContent = {
-                        Icon(
-                            Icons.Filled.Favorite,
-                            contentDescription = null
-                        )
-                    }
+                    leadingContent = { Icon(Icons.Filled.Favorite, contentDescription = null) }
                 )
                 HorizontalDivider()
             }
         }
-        composeTestRule.onNodeWithTag(Tag)
+        composeTestRule
+            .onNodeWithTag(Tag)
             .captureToImage()
             .assertAgainstGolden(screenshotRule, "list_twoLine_lightTheme")
     }
@@ -164,17 +146,13 @@
                 ListItem(
                     headlineContent = { Text("Two line list item with 24x24 icon") },
                     supportingContent = { Text("Secondary text") },
-                    leadingContent = {
-                        Icon(
-                            Icons.Filled.Favorite,
-                            contentDescription = null
-                        )
-                    }
+                    leadingContent = { Icon(Icons.Filled.Favorite, contentDescription = null) }
                 )
                 HorizontalDivider()
             }
         }
-        composeTestRule.onNodeWithTag(Tag)
+        composeTestRule
+            .onNodeWithTag(Tag)
             .captureToImage()
             .assertAgainstGolden(screenshotRule, "list_twoLine_darkTheme")
     }
@@ -200,17 +178,13 @@
                     headlineContent = { Text("Three line list item") },
                     overlineContent = { Text("OVERLINE") },
                     supportingContent = { Text("Secondary text") },
-                    leadingContent = {
-                        Icon(
-                            Icons.Filled.Favorite,
-                            contentDescription = null
-                        )
-                    }
+                    leadingContent = { Icon(Icons.Filled.Favorite, contentDescription = null) }
                 )
                 HorizontalDivider()
             }
         }
-        composeTestRule.onNodeWithTag(Tag)
+        composeTestRule
+            .onNodeWithTag(Tag)
             .captureToImage()
             .assertAgainstGolden(screenshotRule, "list_threeLine_lightTheme")
     }
@@ -236,17 +210,13 @@
                     headlineContent = { Text("Three line list item") },
                     overlineContent = { Text("OVERLINE") },
                     supportingContent = { Text("Secondary text") },
-                    leadingContent = {
-                        Icon(
-                            Icons.Filled.Favorite,
-                            contentDescription = null
-                        )
-                    }
+                    leadingContent = { Icon(Icons.Filled.Favorite, contentDescription = null) }
                 )
                 HorizontalDivider()
             }
         }
-        composeTestRule.onNodeWithTag(Tag)
+        composeTestRule
+            .onNodeWithTag(Tag)
             .captureToImage()
             .assertAgainstGolden(screenshotRule, "list_threeLine_darkTheme")
     }
diff --git a/compose/material3/material3/src/androidInstrumentedTest/kotlin/androidx/compose/material3/ListItemTest.kt b/compose/material3/material3/src/androidInstrumentedTest/kotlin/androidx/compose/material3/ListItemTest.kt
index 5bcec8f..30f6430 100644
--- a/compose/material3/material3/src/androidInstrumentedTest/kotlin/androidx/compose/material3/ListItemTest.kt
+++ b/compose/material3/material3/src/androidInstrumentedTest/kotlin/androidx/compose/material3/ListItemTest.kt
@@ -55,8 +55,7 @@
 @RunWith(AndroidJUnit4::class)
 class ListItemTest {
 
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
     val icon24x24 by lazy { ImageBitmap(width = 24.dp.toIntPx(), height = 24.dp.toIntPx()) }
     val icon40x40 by lazy { ImageBitmap(width = 40.dp.toIntPx(), height = 40.dp.toIntPx()) }
@@ -67,9 +66,7 @@
     @Test
     fun listItem_withEmptyHeadline_doesNotCrash() {
         rule
-            .setMaterialContentForSizeAssertions {
-                ListItem(headlineContent = {})
-            }
+            .setMaterialContentForSizeAssertions { ListItem(headlineContent = {}) }
             .assertHeightIsEqualTo(ListTokens.ListItemOneLineContainerHeight)
             .assertWidthIsEqualTo(rule.rootWidth())
     }
@@ -228,11 +225,12 @@
     ) {
         rule.setMaterialContent(lightColorScheme(), composable = content)
 
-        rule.onNodeWithTag(ListTag, useUnmergedTree = true)
-            .assertHeightIsEqualTo(expectedHeight)
-        rule.onNodeWithTag(LeadingTag, useUnmergedTree = true)
+        rule.onNodeWithTag(ListTag, useUnmergedTree = true).assertHeightIsEqualTo(expectedHeight)
+        rule
+            .onNodeWithTag(LeadingTag, useUnmergedTree = true)
             .assertHeightIsEqualTo(expectedHeight - verticalPadding * 2)
-        rule.onNodeWithTag(TrailingTag, useUnmergedTree = true)
+        rule
+            .onNodeWithTag(TrailingTag, useUnmergedTree = true)
             .assertHeightIsEqualTo(expectedHeight - verticalPadding * 2)
     }
 
@@ -254,10 +252,7 @@
                         Text("Primary text", Modifier.saveLayout(textPosition, textSize))
                     },
                     trailingContent = {
-                        Image(
-                            icon24x24,
-                            null,
-                            Modifier.saveLayout(trailingPosition, trailingSize))
+                        Image(icon24x24, null, Modifier.saveLayout(trailingPosition, trailingSize))
                     }
                 )
             }
@@ -265,19 +260,17 @@
 
         val ds = rule.onRoot().getUnclippedBoundsInRoot()
         rule.runOnIdleWithDensity {
-            assertThat(textPosition.value!!.x).isWithin(1f).of(
-                expectedStartPadding.toPx()
-            )
-            assertThat(textPosition.value!!.y).isWithin(1f).of(
-                (listItemHeight.toPx() - textSize.value!!.height) / 2f
-            )
+            assertThat(textPosition.value!!.x).isWithin(1f).of(expectedStartPadding.toPx())
+            assertThat(textPosition.value!!.y)
+                .isWithin(1f)
+                .of((listItemHeight.toPx() - textSize.value!!.height) / 2f)
 
-            assertThat(trailingPosition.value!!.x).isWithin(1f).of(
-                ds.width.toPx() - trailingSize.value!!.width - expectedEndPadding.toPx()
-            )
-            assertThat(trailingPosition.value!!.y).isWithin(1f).of(
-                (listItemHeight.toPx() - trailingSize.value!!.height) / 2f
-            )
+            assertThat(trailingPosition.value!!.x)
+                .isWithin(1f)
+                .of(ds.width.toPx() - trailingSize.value!!.width - expectedEndPadding.toPx())
+            assertThat(trailingPosition.value!!.y)
+                .isWithin(1f)
+                .of((listItemHeight.toPx() - trailingSize.value!!.height) / 2f)
         }
     }
 
@@ -298,30 +291,27 @@
                         Text("Primary text", Modifier.saveLayout(textPosition, textSize))
                     },
                     leadingContent = {
-                        Image(
-                            icon24x24,
-                            null,
-                            Modifier.saveLayout(iconPosition, iconSize))
+                        Image(icon24x24, null, Modifier.saveLayout(iconPosition, iconSize))
                     }
                 )
             }
         }
         rule.runOnIdleWithDensity {
-            assertThat(iconPosition.value!!.x).isWithin(1f).of(
-                expectedStartPadding.toPx()
-            )
-            assertThat(iconPosition.value!!.y).isWithin(1f).of(
-                (listItemHeight.toPx() - iconSize.value!!.height) / 2f
-            )
+            assertThat(iconPosition.value!!.x).isWithin(1f).of(expectedStartPadding.toPx())
+            assertThat(iconPosition.value!!.y)
+                .isWithin(1f)
+                .of((listItemHeight.toPx() - iconSize.value!!.height) / 2f)
 
-            assertThat(textPosition.value!!.x).isWithin(1f).of(
-                expectedStartPadding.toPx() +
-                    iconSize.value!!.width +
-                    expectedTextStartPadding.toPx()
-            )
-            assertThat(textPosition.value!!.y).isWithin(1f).of(
-                (listItemHeight.toPx() - textSize.value!!.height) / 2f
-            )
+            assertThat(textPosition.value!!.x)
+                .isWithin(1f)
+                .of(
+                    expectedStartPadding.toPx() +
+                        iconSize.value!!.width +
+                        expectedTextStartPadding.toPx()
+                )
+            assertThat(textPosition.value!!.y)
+                .isWithin(1f)
+                .of((listItemHeight.toPx() - textSize.value!!.height) / 2f)
         }
     }
 
@@ -349,40 +339,37 @@
                     Image(
                         icon24x24,
                         null,
-                        Modifier.saveLayout(leadingIconPosition, leadingIconSize))
+                        Modifier.saveLayout(leadingIconPosition, leadingIconSize)
+                    )
                 },
                 trailingContent = {
-                    Text(
-                        "meta",
-                        Modifier.saveLayout(trailingPosition, trailingSize)
-                    )
+                    Text("meta", Modifier.saveLayout(trailingPosition, trailingSize))
                 }
             )
         }
         rule.runOnIdleWithDensity {
-            assertThat(leadingIconPosition.value!!.x).isWithin(1f).of(
-                expectedStartPadding.toPx()
-            )
-            assertThat(leadingIconPosition.value!!.y).isWithin(1f).of(
-                (listItemHeight.toPx() - leadingIconSize.value!!.height) / 2f
-            )
+            assertThat(leadingIconPosition.value!!.x).isWithin(1f).of(expectedStartPadding.toPx())
+            assertThat(leadingIconPosition.value!!.y)
+                .isWithin(1f)
+                .of((listItemHeight.toPx() - leadingIconSize.value!!.height) / 2f)
 
-            assertThat(textPosition.value!!.x).isWithin(1f).of(
-                expectedStartPadding.toPx() +
-                    leadingIconSize.value!!.width +
-                    expectedTextStartPadding.toPx()
-            )
-            assertThat(textPosition.value!!.y).isWithin(1f).of(
-                (listItemHeight.toPx() - textSize.value!!.height) / 2f
-            )
+            assertThat(textPosition.value!!.x)
+                .isWithin(1f)
+                .of(
+                    expectedStartPadding.toPx() +
+                        leadingIconSize.value!!.width +
+                        expectedTextStartPadding.toPx()
+                )
+            assertThat(textPosition.value!!.y)
+                .isWithin(1f)
+                .of((listItemHeight.toPx() - textSize.value!!.height) / 2f)
 
-            assertThat(trailingPosition.value!!.x).isWithin(1f).of(
-                listItemWidth.toPx() - trailingSize.value!!.width -
-                    expectedEndPadding.toPx()
-            )
-            assertThat(trailingPosition.value!!.y).isWithin(1f).of(
-                (listItemHeight.toPx() - trailingSize.value!!.height) / 2f
-            )
+            assertThat(trailingPosition.value!!.x)
+                .isWithin(1f)
+                .of(listItemWidth.toPx() - trailingSize.value!!.width - expectedEndPadding.toPx())
+            assertThat(trailingPosition.value!!.y)
+                .isWithin(1f)
+                .of((listItemHeight.toPx() - trailingSize.value!!.height) / 2f)
         }
     }
 
@@ -402,10 +389,7 @@
             Box {
                 ListItem(
                     headlineContent = {
-                        Text(
-                            "Primary text",
-                            Modifier.saveLayout(textPosition, textSize)
-                        )
+                        Text("Primary text", Modifier.saveLayout(textPosition, textSize))
                     },
                     supportingContent = {
                         Text(
@@ -414,10 +398,7 @@
                         )
                     },
                     trailingContent = {
-                        Text(
-                            "meta",
-                            Modifier.saveLayout(trailingPosition, trailingSize)
-                        )
+                        Text("meta", Modifier.saveLayout(trailingPosition, trailingSize))
                     }
                 )
             }
@@ -426,27 +407,22 @@
         rule.runOnIdleWithDensity {
             val totalTextHeight = textSize.value!!.height + secondaryTextSize.value!!.height
 
-            assertThat(textPosition.value!!.x).isWithin(1f).of(
-                expectedStartPadding.toPx()
-            )
-            assertThat(textPosition.value!!.y).isWithin(1f).of(
-                (listItemHeight.toPx() - totalTextHeight) / 2f
-            )
+            assertThat(textPosition.value!!.x).isWithin(1f).of(expectedStartPadding.toPx())
+            assertThat(textPosition.value!!.y)
+                .isWithin(1f)
+                .of((listItemHeight.toPx() - totalTextHeight) / 2f)
 
-            assertThat(secondaryTextPosition.value!!.x).isWithin(1f).of(
-                expectedStartPadding.toPx()
-            )
-            assertThat(secondaryTextPosition.value!!.y).isWithin(1f).of(
-                (listItemHeight.toPx() - totalTextHeight) / 2f + textSize.value!!.height
-            )
+            assertThat(secondaryTextPosition.value!!.x).isWithin(1f).of(expectedStartPadding.toPx())
+            assertThat(secondaryTextPosition.value!!.y)
+                .isWithin(1f)
+                .of((listItemHeight.toPx() - totalTextHeight) / 2f + textSize.value!!.height)
 
-            assertThat(trailingPosition.value!!.x).isWithin(1f).of(
-                ds.width.toPx() - trailingSize.value!!.width -
-                    expectedEndPadding.toPx()
-            )
-            assertThat(trailingPosition.value!!.y).isWithin(1f).of(
-                (listItemHeight.toPx() - trailingSize.value!!.height) / 2f
-            )
+            assertThat(trailingPosition.value!!.x)
+                .isWithin(1f)
+                .of(ds.width.toPx() - trailingSize.value!!.width - expectedEndPadding.toPx())
+            assertThat(trailingPosition.value!!.y)
+                .isWithin(1f)
+                .of((listItemHeight.toPx() - trailingSize.value!!.height) / 2f)
         }
     }
 
@@ -466,10 +442,7 @@
             Box {
                 ListItem(
                     headlineContent = {
-                        Text(
-                            "Primary text",
-                            Modifier.saveLayout(textPosition, textSize)
-                        )
+                        Text("Primary text", Modifier.saveLayout(textPosition, textSize))
                     },
                     supportingContent = {
                         Text(
@@ -486,28 +459,32 @@
         rule.runOnIdleWithDensity {
             val totalTextHeight = textSize.value!!.height + secondaryTextSize.value!!.height
 
-            assertThat(textPosition.value!!.x).isWithin(1f).of(
-                expectedStartPadding.toPx() + iconSize.value!!.width +
-                    expectedContentStartPadding.toPx()
-            )
-            assertThat(textPosition.value!!.y).isWithin(1f).of(
-                (listItemHeight.toPx() - totalTextHeight) / 2f
-            )
+            assertThat(textPosition.value!!.x)
+                .isWithin(1f)
+                .of(
+                    expectedStartPadding.toPx() +
+                        iconSize.value!!.width +
+                        expectedContentStartPadding.toPx()
+                )
+            assertThat(textPosition.value!!.y)
+                .isWithin(1f)
+                .of((listItemHeight.toPx() - totalTextHeight) / 2f)
 
-            assertThat(secondaryTextPosition.value!!.x).isWithin(1f).of(
-                expectedStartPadding.toPx() + iconSize.value!!.width +
-                    expectedContentStartPadding.toPx()
-            )
-            assertThat(secondaryTextPosition.value!!.y).isWithin(1f).of(
-                (listItemHeight.toPx() - totalTextHeight) / 2f + textSize.value!!.height
-            )
+            assertThat(secondaryTextPosition.value!!.x)
+                .isWithin(1f)
+                .of(
+                    expectedStartPadding.toPx() +
+                        iconSize.value!!.width +
+                        expectedContentStartPadding.toPx()
+                )
+            assertThat(secondaryTextPosition.value!!.y)
+                .isWithin(1f)
+                .of((listItemHeight.toPx() - totalTextHeight) / 2f + textSize.value!!.height)
 
-            assertThat(iconPosition.value!!.x).isWithin(1f).of(
-                expectedStartPadding.toPx()
-            )
-            assertThat(iconPosition.value!!.y).isWithin(1f).of(
-                (listItemHeight.toPx() - iconSize.value!!.height) / 2f
-            )
+            assertThat(iconPosition.value!!.x).isWithin(1f).of(expectedStartPadding.toPx())
+            assertThat(iconPosition.value!!.y)
+                .isWithin(1f)
+                .of((listItemHeight.toPx() - iconSize.value!!.height) / 2f)
         }
     }
 
@@ -543,51 +520,50 @@
                     Image(
                         icon24x24,
                         null,
-                        Modifier.saveLayout(leadingIconPosition, leadingIconSize))
+                        Modifier.saveLayout(leadingIconPosition, leadingIconSize)
+                    )
                 },
                 trailingContent = {
-                    Text(
-                        "meta",
-                        Modifier.saveLayout(trailingPosition, trailingSize)
-                    )
+                    Text("meta", Modifier.saveLayout(trailingPosition, trailingSize))
                 }
             )
         }
         rule.runOnIdleWithDensity {
             val totalTextHeight = textSize.value!!.height + secondaryTextSize.value!!.height
 
-            assertThat(leadingIconPosition.value!!.x).isWithin(1f).of(
-                expectedStartPadding.toPx()
-            )
-            assertThat(leadingIconPosition.value!!.y).isWithin(1f).of(
-                (listItemHeight.toPx() - leadingIconSize.value!!.height) / 2f
-            )
+            assertThat(leadingIconPosition.value!!.x).isWithin(1f).of(expectedStartPadding.toPx())
+            assertThat(leadingIconPosition.value!!.y)
+                .isWithin(1f)
+                .of((listItemHeight.toPx() - leadingIconSize.value!!.height) / 2f)
 
-            assertThat(textPosition.value!!.x).isWithin(1f).of(
-                expectedStartPadding.toPx() +
-                    leadingIconSize.value!!.width +
-                    expectedTextStartPadding.toPx()
-            )
-            assertThat(textPosition.value!!.y).isWithin(1f).of(
-                (listItemHeight.toPx() - totalTextHeight) / 2f
-            )
+            assertThat(textPosition.value!!.x)
+                .isWithin(1f)
+                .of(
+                    expectedStartPadding.toPx() +
+                        leadingIconSize.value!!.width +
+                        expectedTextStartPadding.toPx()
+                )
+            assertThat(textPosition.value!!.y)
+                .isWithin(1f)
+                .of((listItemHeight.toPx() - totalTextHeight) / 2f)
 
-            assertThat(secondaryTextPosition.value!!.x).isWithin(1f).of(
-                expectedStartPadding.toPx() +
-                    leadingIconSize.value!!.width +
-                    expectedTextStartPadding.toPx()
-            )
-            assertThat(secondaryTextPosition.value!!.y).isWithin(1f).of(
-                (listItemHeight.toPx() - totalTextHeight) / 2f + textSize.value!!.height
-            )
+            assertThat(secondaryTextPosition.value!!.x)
+                .isWithin(1f)
+                .of(
+                    expectedStartPadding.toPx() +
+                        leadingIconSize.value!!.width +
+                        expectedTextStartPadding.toPx()
+                )
+            assertThat(secondaryTextPosition.value!!.y)
+                .isWithin(1f)
+                .of((listItemHeight.toPx() - totalTextHeight) / 2f + textSize.value!!.height)
 
-            assertThat(trailingPosition.value!!.x).isWithin(1f).of(
-                listItemWidth.toPx() - trailingSize.value!!.width -
-                    expectedEndPadding.toPx()
-            )
-            assertThat(trailingPosition.value!!.y).isWithin(1f).of(
-                (listItemHeight.toPx() - trailingSize.value!!.height) / 2f
-            )
+            assertThat(trailingPosition.value!!.x)
+                .isWithin(1f)
+                .of(listItemWidth.toPx() - trailingSize.value!!.width - expectedEndPadding.toPx())
+            assertThat(trailingPosition.value!!.y)
+                .isWithin(1f)
+                .of((listItemHeight.toPx() - trailingSize.value!!.height) / 2f)
         }
     }
 
@@ -610,10 +586,7 @@
             Box {
                 ListItem(
                     headlineContent = {
-                        Text(
-                            "Primary text",
-                            Modifier.saveLayout(textPosition, textSize)
-                        )
+                        Text("Primary text", Modifier.saveLayout(textPosition, textSize))
                     },
                     supportingContent = {
                         Text(
@@ -633,36 +606,33 @@
         }
         val ds = rule.onRoot().getUnclippedBoundsInRoot()
         rule.runOnIdleWithDensity {
-            assertThat(textPosition.value!!.x).isWithin(1f).of(
-                expectedStartPadding.toPx() + iconSize.value!!.width +
-                    expectedContentStartPadding.toPx()
-            )
-            assertThat(textPosition.value!!.y).isWithin(1f).of(
-                expectedTopPadding.toPx()
-            )
+            assertThat(textPosition.value!!.x)
+                .isWithin(1f)
+                .of(
+                    expectedStartPadding.toPx() +
+                        iconSize.value!!.width +
+                        expectedContentStartPadding.toPx()
+                )
+            assertThat(textPosition.value!!.y).isWithin(1f).of(expectedTopPadding.toPx())
 
-            assertThat(secondaryTextPosition.value!!.x).isWithin(1f).of(
-                expectedStartPadding.toPx() + iconSize.value!!.width +
-                    expectedContentStartPadding.toPx()
-            )
-            assertThat(secondaryTextPosition.value!!.y).isWithin(1f).of(
-                expectedTopPadding.toPx() + textSize.value!!.height
-            )
+            assertThat(secondaryTextPosition.value!!.x)
+                .isWithin(1f)
+                .of(
+                    expectedStartPadding.toPx() +
+                        iconSize.value!!.width +
+                        expectedContentStartPadding.toPx()
+                )
+            assertThat(secondaryTextPosition.value!!.y)
+                .isWithin(1f)
+                .of(expectedTopPadding.toPx() + textSize.value!!.height)
 
-            assertThat(iconPosition.value!!.x).isWithin(1f).of(
-                expectedStartPadding.toPx()
-            )
-            assertThat(iconPosition.value!!.y).isWithin(1f).of(
-                expectedTopPadding.toPx()
-            )
+            assertThat(iconPosition.value!!.x).isWithin(1f).of(expectedStartPadding.toPx())
+            assertThat(iconPosition.value!!.y).isWithin(1f).of(expectedTopPadding.toPx())
 
-            assertThat(trailingPosition.value!!.x).isWithin(1f).of(
-                ds.width.toPx() - trailingSize.value!!.width -
-                    expectedEndPadding.toPx()
-            )
-            assertThat(trailingPosition.value!!.y).isWithin(1f).of(
-                expectedTopPadding.toPx()
-            )
+            assertThat(trailingPosition.value!!.x)
+                .isWithin(1f)
+                .of(ds.width.toPx() - trailingSize.value!!.width - expectedEndPadding.toPx())
+            assertThat(trailingPosition.value!!.y).isWithin(1f).of(expectedTopPadding.toPx())
         }
     }
 
@@ -693,10 +663,7 @@
                         )
                     },
                     headlineContent = {
-                        Text(
-                            "Primary text",
-                            Modifier.saveLayout(textPosition, textSize)
-                        )
+                        Text("Primary text", Modifier.saveLayout(textPosition, textSize))
                     },
                     supportingContent = {
                         Text(
@@ -705,17 +672,10 @@
                         )
                     },
                     leadingContent = {
-                        Image(
-                            icon40x40,
-                            null,
-                            Modifier.saveLayout(iconPosition, iconSize)
-                        )
+                        Image(icon40x40, null, Modifier.saveLayout(iconPosition, iconSize))
                     },
                     trailingContent = {
-                        Text(
-                            "meta",
-                            Modifier.saveLayout(trailingPosition, trailingSize)
-                        )
+                        Text("meta", Modifier.saveLayout(trailingPosition, trailingSize))
                     }
                 )
             }
@@ -723,45 +683,48 @@
 
         val ds = rule.onRoot().getUnclippedBoundsInRoot()
         rule.runOnIdleWithDensity {
-            assertThat(textPosition.value!!.x).isWithin(1f).of(
-                expectedStartPadding.toPx() + iconSize.value!!.width +
-                    expectedContentStartPadding.toPx()
-            )
-            assertThat(textPosition.value!!.y).isWithin(1f).of(
-                expectedTopPadding.toPx() + overlineTextSize.value!!.height
-            )
+            assertThat(textPosition.value!!.x)
+                .isWithin(1f)
+                .of(
+                    expectedStartPadding.toPx() +
+                        iconSize.value!!.width +
+                        expectedContentStartPadding.toPx()
+                )
+            assertThat(textPosition.value!!.y)
+                .isWithin(1f)
+                .of(expectedTopPadding.toPx() + overlineTextSize.value!!.height)
 
-            assertThat(secondaryTextPosition.value!!.x).isWithin(1f).of(
-                expectedStartPadding.toPx() + iconSize.value!!.width +
-                    expectedContentStartPadding.toPx()
-            )
-            assertThat(secondaryTextPosition.value!!.y).isWithin(1f).of(
-                expectedTopPadding.toPx() + overlineTextSize.value!!.height +
-                textSize.value!!.height
-            )
+            assertThat(secondaryTextPosition.value!!.x)
+                .isWithin(1f)
+                .of(
+                    expectedStartPadding.toPx() +
+                        iconSize.value!!.width +
+                        expectedContentStartPadding.toPx()
+                )
+            assertThat(secondaryTextPosition.value!!.y)
+                .isWithin(1f)
+                .of(
+                    expectedTopPadding.toPx() +
+                        overlineTextSize.value!!.height +
+                        textSize.value!!.height
+                )
 
-            assertThat(iconPosition.value!!.x).isWithin(1f).of(
-                expectedStartPadding.toPx()
-            )
-            assertThat(iconPosition.value!!.y).isWithin(1f).of(
-                expectedTopPadding.toPx()
-            )
+            assertThat(iconPosition.value!!.x).isWithin(1f).of(expectedStartPadding.toPx())
+            assertThat(iconPosition.value!!.y).isWithin(1f).of(expectedTopPadding.toPx())
 
-            assertThat(trailingPosition.value!!.x).isWithin(1f).of(
-                ds.width.toPx() - trailingSize.value!!.width -
-                    expectedEndPadding.toPx()
-            )
-            assertThat(trailingPosition.value!!.y).isWithin(1f).of(
-                expectedTopPadding.toPx()
-            )
+            assertThat(trailingPosition.value!!.x)
+                .isWithin(1f)
+                .of(ds.width.toPx() - trailingSize.value!!.width - expectedEndPadding.toPx())
+            assertThat(trailingPosition.value!!.y).isWithin(1f).of(expectedTopPadding.toPx())
 
-            assertThat(overlineTextPosition.value!!.x).isWithin(1f).of(
-                expectedStartPadding.toPx() + iconSize.value!!.width +
-                    expectedContentStartPadding.toPx()
-            )
-            assertThat(overlineTextPosition.value!!.y).isWithin(1f).of(
-                expectedTopPadding.toPx()
-            )
+            assertThat(overlineTextPosition.value!!.x)
+                .isWithin(1f)
+                .of(
+                    expectedStartPadding.toPx() +
+                        iconSize.value!!.width +
+                        expectedContentStartPadding.toPx()
+                )
+            assertThat(overlineTextPosition.value!!.y).isWithin(1f).of(expectedTopPadding.toPx())
         }
     }
 
@@ -788,10 +751,7 @@
             ListItem(
                 modifier = Modifier.size(width = listItemWidth, height = listItemHeight),
                 overlineContent = {
-                    Text(
-                        "OVERLINE",
-                        Modifier.saveLayout(overlineTextPosition, overlineTextSize)
-                    )
+                    Text("OVERLINE", Modifier.saveLayout(overlineTextPosition, overlineTextSize))
                 },
                 headlineContent = {
                     Text("Primary text", Modifier.saveLayout(textPosition, textSize))
@@ -806,59 +766,57 @@
                     Image(
                         icon24x24,
                         null,
-                        Modifier.saveLayout(leadingIconPosition, leadingIconSize))
+                        Modifier.saveLayout(leadingIconPosition, leadingIconSize)
+                    )
                 },
                 trailingContent = {
-                    Text(
-                        "meta",
-                        Modifier.saveLayout(trailingPosition, trailingSize)
-                    )
+                    Text("meta", Modifier.saveLayout(trailingPosition, trailingSize))
                 }
             )
         }
         rule.runOnIdleWithDensity {
-            assertThat(leadingIconPosition.value!!.x).isWithin(1f).of(
-                expectedStartPadding.toPx()
-            )
-            assertThat(leadingIconPosition.value!!.y).isWithin(1f).of(
-                expectedTopPadding.toPx()
-            )
+            assertThat(leadingIconPosition.value!!.x).isWithin(1f).of(expectedStartPadding.toPx())
+            assertThat(leadingIconPosition.value!!.y).isWithin(1f).of(expectedTopPadding.toPx())
 
-            assertThat(overlineTextPosition.value!!.x).isWithin(1f).of(
-                expectedStartPadding.toPx() +
-                    leadingIconSize.value!!.width +
-                    expectedTextStartPadding.toPx()
-            )
-            assertThat(overlineTextPosition.value!!.y).isWithin(1f).of(
-                expectedTopPadding.toPx()
-            )
+            assertThat(overlineTextPosition.value!!.x)
+                .isWithin(1f)
+                .of(
+                    expectedStartPadding.toPx() +
+                        leadingIconSize.value!!.width +
+                        expectedTextStartPadding.toPx()
+                )
+            assertThat(overlineTextPosition.value!!.y).isWithin(1f).of(expectedTopPadding.toPx())
 
-            assertThat(textPosition.value!!.x).isWithin(1f).of(
-                expectedStartPadding.toPx() +
-                    leadingIconSize.value!!.width +
-                    expectedTextStartPadding.toPx()
-            )
-            assertThat(textPosition.value!!.y).isWithin(1f).of(
-                expectedTopPadding.toPx() + overlineTextSize.value!!.height
-            )
+            assertThat(textPosition.value!!.x)
+                .isWithin(1f)
+                .of(
+                    expectedStartPadding.toPx() +
+                        leadingIconSize.value!!.width +
+                        expectedTextStartPadding.toPx()
+                )
+            assertThat(textPosition.value!!.y)
+                .isWithin(1f)
+                .of(expectedTopPadding.toPx() + overlineTextSize.value!!.height)
 
-            assertThat(secondaryTextPosition.value!!.x).isWithin(1f).of(
-                expectedStartPadding.toPx() +
-                    leadingIconSize.value!!.width +
-                    expectedTextStartPadding.toPx()
-            )
-            assertThat(secondaryTextPosition.value!!.y).isWithin(1f).of(
-                expectedTopPadding.toPx() + overlineTextSize.value!!.height +
-                textSize.value!!.height
-            )
+            assertThat(secondaryTextPosition.value!!.x)
+                .isWithin(1f)
+                .of(
+                    expectedStartPadding.toPx() +
+                        leadingIconSize.value!!.width +
+                        expectedTextStartPadding.toPx()
+                )
+            assertThat(secondaryTextPosition.value!!.y)
+                .isWithin(1f)
+                .of(
+                    expectedTopPadding.toPx() +
+                        overlineTextSize.value!!.height +
+                        textSize.value!!.height
+                )
 
-            assertThat(trailingPosition.value!!.x).isWithin(1f).of(
-                listItemWidth.toPx() - trailingSize.value!!.width -
-                    expectedEndPadding.toPx()
-            )
-            assertThat(trailingPosition.value!!.y).isWithin(1f).of(
-                expectedTopPadding.toPx()
-            )
+            assertThat(trailingPosition.value!!.x)
+                .isWithin(1f)
+                .of(listItemWidth.toPx() - trailingSize.value!!.width - expectedEndPadding.toPx())
+            assertThat(trailingPosition.value!!.y).isWithin(1f).of(expectedTopPadding.toPx())
         }
     }
 
diff --git a/compose/material3/material3/src/androidInstrumentedTest/kotlin/androidx/compose/material3/MaterialComponentsInsetSupportTest.kt b/compose/material3/material3/src/androidInstrumentedTest/kotlin/androidx/compose/material3/MaterialComponentsInsetSupportTest.kt
index 2959fc6..3ff91fa 100644
--- a/compose/material3/material3/src/androidInstrumentedTest/kotlin/androidx/compose/material3/MaterialComponentsInsetSupportTest.kt
+++ b/compose/material3/material3/src/androidInstrumentedTest/kotlin/androidx/compose/material3/MaterialComponentsInsetSupportTest.kt
@@ -38,8 +38,7 @@
 @MediumTest
 @RunWith(AndroidJUnit4::class)
 class MaterialComponentsInsetSupportTest {
-    @get:Rule
-    val rule = createAndroidComposeRule<MaterialWindowInsetsActivity>()
+    @get:Rule val rule = createAndroidComposeRule<MaterialWindowInsetsActivity>()
 
     @Before
     fun setup() {
@@ -51,14 +50,12 @@
         var contentPadding: WindowInsets? = null
         var expected: WindowInsets? = null
         rule.setContent {
-            expected = WindowInsets.systemBars
-                .only(WindowInsetsSides.Horizontal + WindowInsetsSides.Top)
+            expected =
+                WindowInsets.systemBars.only(WindowInsetsSides.Horizontal + WindowInsetsSides.Top)
             contentPadding = TopAppBarDefaults.windowInsets
         }
 
-        rule.runOnIdle {
-            assertThat(contentPadding).isEqualTo(expected)
-        }
+        rule.runOnIdle { assertThat(contentPadding).isEqualTo(expected) }
     }
 
     @Test
@@ -66,8 +63,10 @@
         var contentPadding: WindowInsets? = null
         var expected: WindowInsets? = null
         rule.setContent {
-            expected = WindowInsets.systemBars
-                .only(WindowInsetsSides.Horizontal + WindowInsetsSides.Bottom)
+            expected =
+                WindowInsets.systemBars.only(
+                    WindowInsetsSides.Horizontal + WindowInsetsSides.Bottom
+                )
             contentPadding = BottomAppBarDefaults.windowInsets
         }
 
@@ -82,14 +81,12 @@
         var contentPadding: WindowInsets? = null
         var expected: WindowInsets? = null
         rule.setContent {
-            expected = WindowInsets.systemBars
-                .only(WindowInsetsSides.Start + WindowInsetsSides.Vertical)
+            expected =
+                WindowInsets.systemBars.only(WindowInsetsSides.Start + WindowInsetsSides.Vertical)
             contentPadding = DrawerDefaults.windowInsets
         }
 
-        rule.runOnIdle {
-            assertThat(contentPadding).isEqualTo(expected)
-        }
+        rule.runOnIdle { assertThat(contentPadding).isEqualTo(expected) }
     }
 
     @Test
@@ -97,14 +94,14 @@
         var contentPadding: WindowInsets? = null
         var expected: WindowInsets? = null
         rule.setContent {
-            expected = WindowInsets.systemBars
-                .only(WindowInsetsSides.Bottom + WindowInsetsSides.Horizontal)
+            expected =
+                WindowInsets.systemBars.only(
+                    WindowInsetsSides.Bottom + WindowInsetsSides.Horizontal
+                )
             contentPadding = NavigationBarDefaults.windowInsets
         }
 
-        rule.runOnIdle {
-            assertThat(contentPadding).isEqualTo(expected)
-        }
+        rule.runOnIdle { assertThat(contentPadding).isEqualTo(expected) }
     }
 
     @Test
@@ -112,14 +109,12 @@
         var contentPadding: WindowInsets? = null
         var expected: WindowInsets? = null
         rule.setContent {
-            expected = WindowInsets.systemBars
-                .only(WindowInsetsSides.Start + WindowInsetsSides.Vertical)
+            expected =
+                WindowInsets.systemBars.only(WindowInsetsSides.Start + WindowInsetsSides.Vertical)
             contentPadding = NavigationRailDefaults.windowInsets
         }
 
-        rule.runOnIdle {
-            assertThat(contentPadding).isEqualTo(expected)
-        }
+        rule.runOnIdle { assertThat(contentPadding).isEqualTo(expected) }
     }
 
     @Test
@@ -129,11 +124,8 @@
         var layoutDirection: LayoutDirection? = null
         rule.setContent {
             layoutDirection = LocalLayoutDirection.current
-            expected = WindowInsets.systemBars
-                .asPaddingValues(LocalDensity.current)
-            Scaffold { paddingValues ->
-                contentPadding = paddingValues
-            }
+            expected = WindowInsets.systemBars.asPaddingValues(LocalDensity.current)
+            Scaffold { paddingValues -> contentPadding = paddingValues }
         }
 
         rule.runOnIdle {
diff --git a/compose/material3/material3/src/androidInstrumentedTest/kotlin/androidx/compose/material3/MaterialTest.kt b/compose/material3/material3/src/androidInstrumentedTest/kotlin/androidx/compose/material3/MaterialTest.kt
index ad342d5..e3954ae 100644
--- a/compose/material3/material3/src/androidInstrumentedTest/kotlin/androidx/compose/material3/MaterialTest.kt
+++ b/compose/material3/material3/src/androidInstrumentedTest/kotlin/androidx/compose/material3/MaterialTest.kt
@@ -45,7 +45,7 @@
  * Wraps Compose content in a [MaterialTheme] and a [Surface].
  *
  * @param colorScheme a [ColorScheme] to provide to the theme. Usually a [lightColorScheme],
- * [darkColorScheme], or a dynamic one
+ *   [darkColorScheme], or a dynamic one
  * @param modifier a [Modifier] to be applied at the [Surface] wrapper
  */
 fun ComposeContentTestRule.setMaterialContent(
@@ -62,14 +62,13 @@
     }
 }
 
-private val WindowInfoFocused = object : WindowInfo {
-    override val isWindowFocused = true
-}
+private val WindowInfoFocused =
+    object : WindowInfo {
+        override val isWindowFocused = true
+    }
 
 fun <T> ComposeTestRule.runOnIdleWithDensity(action: Density.() -> T): T {
-    return runOnIdle {
-        density.action()
-    }
+    return runOnIdle { density.action() }
 }
 
 fun SemanticsNodeInteraction.getFirstBaselinePosition() = getAlignmentLinePosition(FirstBaseline)
@@ -83,9 +82,7 @@
 
 fun ComposeTestRule.rootHeight(): Dp = onRoot().getUnclippedBoundsInRoot().height
 
-/**
- * Constant to emulate very big but finite constraints
- */
+/** Constant to emulate very big but finite constraints */
 val BigTestMaxWidth = 5000.dp
 val BigTestMaxHeight = 5000.dp
 
@@ -100,10 +97,8 @@
             Surface {
                 Box {
                     Box(
-                        Modifier.sizeIn(
-                            maxWidth = parentMaxWidth,
-                            maxHeight = parentMaxHeight
-                        ).testTag("containerForSizeAssertion")
+                        Modifier.sizeIn(maxWidth = parentMaxWidth, maxHeight = parentMaxHeight)
+                            .testTag("containerForSizeAssertion")
                     ) {
                         content()
                     }
diff --git a/compose/material3/material3/src/androidInstrumentedTest/kotlin/androidx/compose/material3/MenuPositionTest.kt b/compose/material3/material3/src/androidInstrumentedTest/kotlin/androidx/compose/material3/MenuPositionTest.kt
index 4b5ffcc..2f8ebc1 100644
--- a/compose/material3/material3/src/androidInstrumentedTest/kotlin/androidx/compose/material3/MenuPositionTest.kt
+++ b/compose/material3/material3/src/androidInstrumentedTest/kotlin/androidx/compose/material3/MenuPositionTest.kt
@@ -44,152 +44,180 @@
     @Test
     fun menuPosition_horizontal_anchorAlignment_ltr() {
         assertThat(
-            MenuPosition.startToAnchorStart().position(
-                anchorBounds,
-                windowSize,
-                menuSize.width,
-                LayoutDirection.Ltr,
+                MenuPosition.startToAnchorStart()
+                    .position(
+                        anchorBounds,
+                        windowSize,
+                        menuSize.width,
+                        LayoutDirection.Ltr,
+                    )
             )
-        ).isEqualTo(anchorBounds.left)
+            .isEqualTo(anchorBounds.left)
 
         assertThat(
-            MenuPosition.endToAnchorEnd().position(
-                anchorBounds,
-                windowSize,
-                menuSize.width,
-                LayoutDirection.Ltr,
+                MenuPosition.endToAnchorEnd()
+                    .position(
+                        anchorBounds,
+                        windowSize,
+                        menuSize.width,
+                        LayoutDirection.Ltr,
+                    )
             )
-        ).isEqualTo(anchorBounds.right - menuSize.width)
+            .isEqualTo(anchorBounds.right - menuSize.width)
 
         assertThat(
-            AnchorAlignmentOffsetPosition.Horizontal(
-                menuAlignment = Alignment.Start,
-                anchorAlignment = Alignment.CenterHorizontally,
-                offset = 0,
-            ).position(
-                anchorBounds,
-                windowSize,
-                menuSize.width,
-                LayoutDirection.Ltr,
+                AnchorAlignmentOffsetPosition.Horizontal(
+                        menuAlignment = Alignment.Start,
+                        anchorAlignment = Alignment.CenterHorizontally,
+                        offset = 0,
+                    )
+                    .position(
+                        anchorBounds,
+                        windowSize,
+                        menuSize.width,
+                        LayoutDirection.Ltr,
+                    )
             )
-        ).isEqualTo(anchorBounds.center.x)
+            .isEqualTo(anchorBounds.center.x)
     }
 
     @Test
     fun menuPosition_horizontal_anchorAlignment_rtl() {
         assertThat(
-            MenuPosition.startToAnchorStart().position(
-                anchorBounds,
-                windowSize,
-                menuSize.width,
-                LayoutDirection.Rtl,
+                MenuPosition.startToAnchorStart()
+                    .position(
+                        anchorBounds,
+                        windowSize,
+                        menuSize.width,
+                        LayoutDirection.Rtl,
+                    )
             )
-        ).isEqualTo(anchorBounds.right - menuSize.width)
+            .isEqualTo(anchorBounds.right - menuSize.width)
 
         assertThat(
-            MenuPosition.endToAnchorEnd().position(
-                anchorBounds,
-                windowSize,
-                menuSize.width,
-                LayoutDirection.Rtl,
+                MenuPosition.endToAnchorEnd()
+                    .position(
+                        anchorBounds,
+                        windowSize,
+                        menuSize.width,
+                        LayoutDirection.Rtl,
+                    )
             )
-        ).isEqualTo(anchorBounds.left)
+            .isEqualTo(anchorBounds.left)
 
         assertThat(
-            AnchorAlignmentOffsetPosition.Horizontal(
-                menuAlignment = Alignment.Start,
-                anchorAlignment = Alignment.CenterHorizontally,
-                offset = 0,
-            ).position(
-                anchorBounds,
-                windowSize,
-                menuSize.width,
-                LayoutDirection.Rtl,
+                AnchorAlignmentOffsetPosition.Horizontal(
+                        menuAlignment = Alignment.Start,
+                        anchorAlignment = Alignment.CenterHorizontally,
+                        offset = 0,
+                    )
+                    .position(
+                        anchorBounds,
+                        windowSize,
+                        menuSize.width,
+                        LayoutDirection.Rtl,
+                    )
             )
-        ).isEqualTo(anchorBounds.center.x - menuSize.width)
+            .isEqualTo(anchorBounds.center.x - menuSize.width)
     }
 
     @Test
     fun menuPosition_horizontal_anchorAlignment_withOffset() {
         val offset = 10
         assertThat(
-            MenuPosition.startToAnchorStart(offset).position(
-                anchorBounds,
-                windowSize,
-                menuSize.width,
-                LayoutDirection.Ltr,
+                MenuPosition.startToAnchorStart(offset)
+                    .position(
+                        anchorBounds,
+                        windowSize,
+                        menuSize.width,
+                        LayoutDirection.Ltr,
+                    )
             )
-        ).isEqualTo(anchorBounds.left + offset)
+            .isEqualTo(anchorBounds.left + offset)
 
         assertThat(
-            MenuPosition.startToAnchorStart(offset).position(
-                anchorBounds,
-                windowSize,
-                menuSize.width,
-                LayoutDirection.Rtl,
+                MenuPosition.startToAnchorStart(offset)
+                    .position(
+                        anchorBounds,
+                        windowSize,
+                        menuSize.width,
+                        LayoutDirection.Rtl,
+                    )
             )
-        ).isEqualTo(anchorBounds.right - menuSize.width - offset)
+            .isEqualTo(anchorBounds.right - menuSize.width - offset)
     }
 
     @Test
     fun menuPosition_horizontal_windowAlignment() {
         assertThat(
-            MenuPosition.leftToWindowLeft().position(
-                anchorBounds,
-                windowSize,
-                menuSize.width,
-                LayoutDirection.Ltr,
+                MenuPosition.leftToWindowLeft()
+                    .position(
+                        anchorBounds,
+                        windowSize,
+                        menuSize.width,
+                        LayoutDirection.Ltr,
+                    )
             )
-        ).isEqualTo(0)
+            .isEqualTo(0)
 
         assertThat(
-            MenuPosition.rightToWindowRight().position(
-                anchorBounds,
-                windowSize,
-                menuSize.width,
-                LayoutDirection.Ltr,
+                MenuPosition.rightToWindowRight()
+                    .position(
+                        anchorBounds,
+                        windowSize,
+                        menuSize.width,
+                        LayoutDirection.Ltr,
+                    )
             )
-        ).isEqualTo(windowSize.width - menuSize.width)
+            .isEqualTo(windowSize.width - menuSize.width)
 
         assertThat(
-            MenuPosition.leftToWindowLeft().position(
-                anchorBounds,
-                windowSize,
-                menuSize.width,
-                LayoutDirection.Rtl,
+                MenuPosition.leftToWindowLeft()
+                    .position(
+                        anchorBounds,
+                        windowSize,
+                        menuSize.width,
+                        LayoutDirection.Rtl,
+                    )
             )
-        ).isEqualTo(0)
+            .isEqualTo(0)
 
         assertThat(
-            MenuPosition.rightToWindowRight().position(
-                anchorBounds,
-                windowSize,
-                menuSize.width,
-                LayoutDirection.Rtl,
+                MenuPosition.rightToWindowRight()
+                    .position(
+                        anchorBounds,
+                        windowSize,
+                        menuSize.width,
+                        LayoutDirection.Rtl,
+                    )
             )
-        ).isEqualTo(windowSize.width - menuSize.width)
+            .isEqualTo(windowSize.width - menuSize.width)
     }
 
     @Test
     fun menuPosition_horizontal_windowAlignment_withMargin() {
         val margin = 150
         assertThat(
-            MenuPosition.leftToWindowLeft(margin).position(
-                anchorBounds,
-                windowSize,
-                menuSize.width,
-                LayoutDirection.Ltr,
+                MenuPosition.leftToWindowLeft(margin)
+                    .position(
+                        anchorBounds,
+                        windowSize,
+                        menuSize.width,
+                        LayoutDirection.Ltr,
+                    )
             )
-        ).isEqualTo(margin)
+            .isEqualTo(margin)
 
         assertThat(
-            MenuPosition.rightToWindowRight(margin).position(
-                anchorBounds,
-                windowSize,
-                menuSize.width,
-                LayoutDirection.Ltr,
+                MenuPosition.rightToWindowRight(margin)
+                    .position(
+                        anchorBounds,
+                        windowSize,
+                        menuSize.width,
+                        LayoutDirection.Ltr,
+                    )
             )
-        ).isEqualTo(windowSize.width - menuSize.width - margin)
+            .isEqualTo(windowSize.width - menuSize.width - margin)
     }
 
     @Test
@@ -198,138 +226,166 @@
         assertThat(margin * 2 + menuSize.width).isGreaterThan(windowSize.width)
 
         assertThat(
-            MenuPosition.leftToWindowLeft(margin).position(
-                anchorBounds,
-                windowSize,
-                menuSize.width,
-                LayoutDirection.Ltr,
+                MenuPosition.leftToWindowLeft(margin)
+                    .position(
+                        anchorBounds,
+                        windowSize,
+                        menuSize.width,
+                        LayoutDirection.Ltr,
+                    )
             )
-        ).isEqualTo((windowSize.width - menuSize.width) / 2)
+            .isEqualTo((windowSize.width - menuSize.width) / 2)
 
         assertThat(
-            MenuPosition.rightToWindowRight(margin).position(
-                anchorBounds,
-                windowSize,
-                menuSize.width,
-                LayoutDirection.Ltr,
+                MenuPosition.rightToWindowRight(margin)
+                    .position(
+                        anchorBounds,
+                        windowSize,
+                        menuSize.width,
+                        LayoutDirection.Ltr,
+                    )
             )
-        ).isEqualTo((windowSize.width - menuSize.width) / 2)
+            .isEqualTo((windowSize.width - menuSize.width) / 2)
     }
 
     @Test
     fun menuPosition_vertical_anchorAlignment() {
         assertThat(
-            MenuPosition.topToAnchorBottom().position(
-                anchorBounds,
-                windowSize,
-                menuSize.height,
+                MenuPosition.topToAnchorBottom()
+                    .position(
+                        anchorBounds,
+                        windowSize,
+                        menuSize.height,
+                    )
             )
-        ).isEqualTo(anchorBounds.bottom)
+            .isEqualTo(anchorBounds.bottom)
 
         assertThat(
-            MenuPosition.bottomToAnchorTop().position(
-                anchorBounds,
-                windowSize,
-                menuSize.height,
+                MenuPosition.bottomToAnchorTop()
+                    .position(
+                        anchorBounds,
+                        windowSize,
+                        menuSize.height,
+                    )
             )
-        ).isEqualTo(anchorBounds.top - menuSize.height)
+            .isEqualTo(anchorBounds.top - menuSize.height)
 
         assertThat(
-            MenuPosition.centerToAnchorTop().position(
-                anchorBounds,
-                windowSize,
-                menuSize.height,
+                MenuPosition.centerToAnchorTop()
+                    .position(
+                        anchorBounds,
+                        windowSize,
+                        menuSize.height,
+                    )
             )
-        ).isEqualTo(anchorBounds.top - menuSize.height / 2)
+            .isEqualTo(anchorBounds.top - menuSize.height / 2)
     }
 
     @Test
     fun menuPosition_vertical_anchorAlignment_withOffset() {
         val offset = 10
         assertThat(
-            MenuPosition.topToAnchorBottom(offset).position(
-                anchorBounds,
-                windowSize,
-                menuSize.height,
+                MenuPosition.topToAnchorBottom(offset)
+                    .position(
+                        anchorBounds,
+                        windowSize,
+                        menuSize.height,
+                    )
             )
-        ).isEqualTo(anchorBounds.bottom + offset)
+            .isEqualTo(anchorBounds.bottom + offset)
 
         assertThat(
-            MenuPosition.bottomToAnchorTop(offset).position(
-                anchorBounds,
-                windowSize,
-                menuSize.height,
+                MenuPosition.bottomToAnchorTop(offset)
+                    .position(
+                        anchorBounds,
+                        windowSize,
+                        menuSize.height,
+                    )
             )
-        ).isEqualTo(anchorBounds.top - menuSize.height + offset)
+            .isEqualTo(anchorBounds.top - menuSize.height + offset)
 
         assertThat(
-            MenuPosition.centerToAnchorTop(offset).position(
-                anchorBounds,
-                windowSize,
-                menuSize.height,
+                MenuPosition.centerToAnchorTop(offset)
+                    .position(
+                        anchorBounds,
+                        windowSize,
+                        menuSize.height,
+                    )
             )
-        ).isEqualTo(anchorBounds.top - menuSize.height / 2 + offset)
+            .isEqualTo(anchorBounds.top - menuSize.height / 2 + offset)
     }
 
     @Test
     fun menuPosition_vertical_windowAlignment() {
         assertThat(
-            MenuPosition.topToWindowTop().position(
-                anchorBounds,
-                windowSize,
-                menuSize.height,
+                MenuPosition.topToWindowTop()
+                    .position(
+                        anchorBounds,
+                        windowSize,
+                        menuSize.height,
+                    )
             )
-        ).isEqualTo(0)
+            .isEqualTo(0)
 
         assertThat(
-            MenuPosition.bottomToWindowBottom().position(
-                anchorBounds,
-                windowSize,
-                menuSize.height,
+                MenuPosition.bottomToWindowBottom()
+                    .position(
+                        anchorBounds,
+                        windowSize,
+                        menuSize.height,
+                    )
             )
-        ).isEqualTo(windowSize.height - menuSize.height)
+            .isEqualTo(windowSize.height - menuSize.height)
 
         assertThat(
-            WindowAlignmentMarginPosition.Vertical(
-                alignment = Alignment.CenterVertically,
-                margin = 0,
-            ).position(
-                anchorBounds,
-                windowSize,
-                menuSize.height,
+                WindowAlignmentMarginPosition.Vertical(
+                        alignment = Alignment.CenterVertically,
+                        margin = 0,
+                    )
+                    .position(
+                        anchorBounds,
+                        windowSize,
+                        menuSize.height,
+                    )
             )
-        ).isEqualTo((windowSize.height - menuSize.height) / 2)
+            .isEqualTo((windowSize.height - menuSize.height) / 2)
     }
 
     @Test
     fun menuPosition_vertical_windowAlignment_withMargin() {
         val margin = 150
         assertThat(
-            MenuPosition.topToWindowTop(margin).position(
-                anchorBounds,
-                windowSize,
-                menuSize.height,
+                MenuPosition.topToWindowTop(margin)
+                    .position(
+                        anchorBounds,
+                        windowSize,
+                        menuSize.height,
+                    )
             )
-        ).isEqualTo(margin)
+            .isEqualTo(margin)
 
         assertThat(
-            MenuPosition.bottomToWindowBottom(margin).position(
-                anchorBounds,
-                windowSize,
-                menuSize.height,
+                MenuPosition.bottomToWindowBottom(margin)
+                    .position(
+                        anchorBounds,
+                        windowSize,
+                        menuSize.height,
+                    )
             )
-        ).isEqualTo(windowSize.height - menuSize.height - margin)
+            .isEqualTo(windowSize.height - menuSize.height - margin)
 
         assertThat(
-            WindowAlignmentMarginPosition.Vertical(
-                alignment = Alignment.CenterVertically,
-                margin = margin,
-            ).position(
-                anchorBounds,
-                windowSize,
-                menuSize.height,
+                WindowAlignmentMarginPosition.Vertical(
+                        alignment = Alignment.CenterVertically,
+                        margin = margin,
+                    )
+                    .position(
+                        anchorBounds,
+                        windowSize,
+                        menuSize.height,
+                    )
             )
-        ).isEqualTo((windowSize.height - menuSize.height) / 2)
+            .isEqualTo((windowSize.height - menuSize.height) / 2)
     }
 
     @Test
@@ -338,31 +394,37 @@
         assertThat(margin * 2 + menuSize.height).isGreaterThan(windowSize.height)
 
         assertThat(
-            MenuPosition.topToWindowTop(margin).position(
-                anchorBounds,
-                windowSize,
-                menuSize.height,
+                MenuPosition.topToWindowTop(margin)
+                    .position(
+                        anchorBounds,
+                        windowSize,
+                        menuSize.height,
+                    )
             )
-        ).isEqualTo((windowSize.height - menuSize.height) / 2)
+            .isEqualTo((windowSize.height - menuSize.height) / 2)
 
         assertThat(
-            MenuPosition.bottomToWindowBottom(margin).position(
-                anchorBounds,
-                windowSize,
-                menuSize.height,
+                MenuPosition.bottomToWindowBottom(margin)
+                    .position(
+                        anchorBounds,
+                        windowSize,
+                        menuSize.height,
+                    )
             )
-        ).isEqualTo((windowSize.height - menuSize.height) / 2)
+            .isEqualTo((windowSize.height - menuSize.height) / 2)
 
         assertThat(
-            WindowAlignmentMarginPosition.Vertical(
-                alignment = Alignment.CenterVertically,
-                margin = margin,
-            ).position(
-                anchorBounds,
-                windowSize,
-                menuSize.height,
+                WindowAlignmentMarginPosition.Vertical(
+                        alignment = Alignment.CenterVertically,
+                        margin = margin,
+                    )
+                    .position(
+                        anchorBounds,
+                        windowSize,
+                        menuSize.height,
+                    )
             )
-        ).isEqualTo((windowSize.height - menuSize.height) / 2)
+            .isEqualTo((windowSize.height - menuSize.height) / 2)
     }
 
     @Test
@@ -377,39 +439,30 @@
         val offsetY = 40
         val popupSize = IntSize(50, 80)
 
-        val ltrPosition = DropdownMenuPositionProvider(
-            DpOffset(offsetX.dp, offsetY.dp),
-            density
-        ).calculatePosition(
-            IntRect(anchorPosition, anchorSize),
-            windowSize,
-            LayoutDirection.Ltr,
-            popupSize
-        )
+        val ltrPosition =
+            DropdownMenuPositionProvider(DpOffset(offsetX.dp, offsetY.dp), density)
+                .calculatePosition(
+                    IntRect(anchorPosition, anchorSize),
+                    windowSize,
+                    LayoutDirection.Ltr,
+                    popupSize
+                )
 
-        assertThat(ltrPosition.x).isEqualTo(
-            anchorPosition.x + offsetX
-        )
-        assertThat(ltrPosition.y).isEqualTo(
-            anchorPosition.y + anchorSize.height + offsetY
-        )
+        assertThat(ltrPosition.x).isEqualTo(anchorPosition.x + offsetX)
+        assertThat(ltrPosition.y).isEqualTo(anchorPosition.y + anchorSize.height + offsetY)
 
-        val rtlPosition = DropdownMenuPositionProvider(
-            DpOffset(offsetX.dp, offsetY.dp),
-            density
-        ).calculatePosition(
-            IntRect(anchorPosition, anchorSize),
-            windowSize,
-            LayoutDirection.Rtl,
-            popupSize
-        )
+        val rtlPosition =
+            DropdownMenuPositionProvider(DpOffset(offsetX.dp, offsetY.dp), density)
+                .calculatePosition(
+                    IntRect(anchorPosition, anchorSize),
+                    windowSize,
+                    LayoutDirection.Rtl,
+                    popupSize
+                )
 
-        assertThat(rtlPosition.x).isEqualTo(
-            anchorPosition.x + anchorSize.width - popupSize.width - offsetX
-        )
-        assertThat(rtlPosition.y).isEqualTo(
-            anchorPosition.y + anchorSize.height + offsetY
-        )
+        assertThat(rtlPosition.x)
+            .isEqualTo(anchorPosition.x + anchorSize.width - popupSize.width - offsetX)
+        assertThat(rtlPosition.y).isEqualTo(anchorPosition.y + anchorSize.height + offsetY)
     }
 
     @Test
@@ -425,39 +478,30 @@
         val offsetY = -40
         val popupSize = IntSize(150, 80)
 
-        val ltrPosition = DropdownMenuPositionProvider(
-            DpOffset(offsetX.dp, offsetY.dp),
-            density
-        ).calculatePosition(
-            IntRect(anchorPosition, anchorSize),
-            windowSize,
-            LayoutDirection.Ltr,
-            popupSize
-        )
+        val ltrPosition =
+            DropdownMenuPositionProvider(DpOffset(offsetX.dp, offsetY.dp), density)
+                .calculatePosition(
+                    IntRect(anchorPosition, anchorSize),
+                    windowSize,
+                    LayoutDirection.Ltr,
+                    popupSize
+                )
 
-        assertThat(ltrPosition.x).isEqualTo(
-            anchorPosition.x + anchorSize.width - popupSize.width + offsetX
-        )
-        assertThat(ltrPosition.y).isEqualTo(
-            anchorPosition.y - popupSize.height + offsetY
-        )
+        assertThat(ltrPosition.x)
+            .isEqualTo(anchorPosition.x + anchorSize.width - popupSize.width + offsetX)
+        assertThat(ltrPosition.y).isEqualTo(anchorPosition.y - popupSize.height + offsetY)
 
-        val rtlPosition = DropdownMenuPositionProvider(
-            DpOffset(offsetX.dp, offsetY.dp),
-            density
-        ).calculatePosition(
-            IntRect(anchorPositionRtl, anchorSize),
-            windowSize,
-            LayoutDirection.Rtl,
-            popupSize
-        )
+        val rtlPosition =
+            DropdownMenuPositionProvider(DpOffset(offsetX.dp, offsetY.dp), density)
+                .calculatePosition(
+                    IntRect(anchorPositionRtl, anchorSize),
+                    windowSize,
+                    LayoutDirection.Rtl,
+                    popupSize
+                )
 
-        assertThat(rtlPosition.x).isEqualTo(
-            anchorPositionRtl.x - offsetX
-        )
-        assertThat(rtlPosition.y).isEqualTo(
-            anchorPositionRtl.y - popupSize.height + offsetY
-        )
+        assertThat(rtlPosition.x).isEqualTo(anchorPositionRtl.x - offsetX)
+        assertThat(rtlPosition.y).isEqualTo(anchorPositionRtl.y - popupSize.height + offsetY)
     }
 
     @Test
@@ -473,19 +517,16 @@
         // The min margin above and below the menu, relative to the screen.
         val verticalMargin = with(density) { MenuVerticalMargin.roundToPx() }
 
-        val position = DropdownMenuPositionProvider(
-            DpOffset.Zero,
-            density
-        ).calculatePosition(
-            IntRect(anchorPosition, anchorSize),
-            windowSize,
-            LayoutDirection.Ltr,
-            popupSize
-        )
+        val position =
+            DropdownMenuPositionProvider(DpOffset.Zero, density)
+                .calculatePosition(
+                    IntRect(anchorPosition, anchorSize),
+                    windowSize,
+                    LayoutDirection.Ltr,
+                    popupSize
+                )
 
-        assertThat(position.y).isEqualTo(
-            verticalMargin
-        )
+        assertThat(position.y).isEqualTo(verticalMargin)
     }
 
     @Test
@@ -502,39 +543,29 @@
         // The min margin above and below the menu, relative to the screen.
         val verticalMargin = with(density) { MenuVerticalMargin.roundToPx() }
 
-        val position = DropdownMenuPositionProvider(
-            DpOffset.Zero,
-            density
-        ).calculatePosition(
-            IntRect(anchorPosition, anchorSize),
-            windowSize,
-            LayoutDirection.Ltr,
-            popupSize
-        )
+        val position =
+            DropdownMenuPositionProvider(DpOffset.Zero, density)
+                .calculatePosition(
+                    IntRect(anchorPosition, anchorSize),
+                    windowSize,
+                    LayoutDirection.Ltr,
+                    popupSize
+                )
 
-        assertThat(position.x).isEqualTo(
-            0
-        )
-        assertThat(position.y).isEqualTo(
-            verticalMargin
-        )
+        assertThat(position.x).isEqualTo(0)
+        assertThat(position.y).isEqualTo(verticalMargin)
 
-        val rtlPosition = DropdownMenuPositionProvider(
-            DpOffset.Zero,
-            density
-        ).calculatePosition(
-            IntRect(anchorPositionRtl, anchorSize),
-            windowSize,
-            LayoutDirection.Rtl,
-            popupSize
-        )
+        val rtlPosition =
+            DropdownMenuPositionProvider(DpOffset.Zero, density)
+                .calculatePosition(
+                    IntRect(anchorPositionRtl, anchorSize),
+                    windowSize,
+                    LayoutDirection.Rtl,
+                    popupSize
+                )
 
-        assertThat(rtlPosition.x).isEqualTo(
-            screenWidth - popupSize.width
-        )
-        assertThat(rtlPosition.y).isEqualTo(
-            verticalMargin
-        )
+        assertThat(rtlPosition.x).isEqualTo(screenWidth - popupSize.width)
+        assertThat(rtlPosition.y).isEqualTo(verticalMargin)
     }
 
     @Test
@@ -551,28 +582,30 @@
 
         var obtainedAnchorBounds = IntRect.Zero
         var obtainedMenuBounds = IntRect.Zero
-        DropdownMenuPositionProvider(
-            DpOffset(offsetX.dp, offsetY.dp),
-            density
-        ) { anchorBounds, menuBounds ->
-            obtainedAnchorBounds = anchorBounds
-            obtainedMenuBounds = menuBounds
-        }.calculatePosition(
-            IntRect(anchorPosition, anchorSize),
-            windowSize,
-            LayoutDirection.Ltr,
-            popupSize
-        )
+        DropdownMenuPositionProvider(DpOffset(offsetX.dp, offsetY.dp), density) {
+                anchorBounds,
+                menuBounds ->
+                obtainedAnchorBounds = anchorBounds
+                obtainedMenuBounds = menuBounds
+            }
+            .calculatePosition(
+                IntRect(anchorPosition, anchorSize),
+                windowSize,
+                LayoutDirection.Ltr,
+                popupSize
+            )
 
         assertThat(obtainedAnchorBounds).isEqualTo(IntRect(anchorPosition, anchorSize))
-        assertThat(obtainedMenuBounds).isEqualTo(
-            IntRect(
-                offset = IntOffset(
-                    x = anchorPosition.x + offsetX,
-                    y = anchorPosition.y + anchorSize.height + offsetY
-                ),
-                size = popupSize,
+        assertThat(obtainedMenuBounds)
+            .isEqualTo(
+                IntRect(
+                    offset =
+                        IntOffset(
+                            x = anchorPosition.x + offsetX,
+                            y = anchorPosition.y + anchorSize.height + offsetY
+                        ),
+                    size = popupSize,
+                )
             )
-        )
     }
 }
diff --git a/compose/material3/material3/src/androidInstrumentedTest/kotlin/androidx/compose/material3/MenuScreenshotTest.kt b/compose/material3/material3/src/androidInstrumentedTest/kotlin/androidx/compose/material3/MenuScreenshotTest.kt
index 6b92ad6..3eeece1 100644
--- a/compose/material3/material3/src/androidInstrumentedTest/kotlin/androidx/compose/material3/MenuScreenshotTest.kt
+++ b/compose/material3/material3/src/androidInstrumentedTest/kotlin/androidx/compose/material3/MenuScreenshotTest.kt
@@ -64,43 +64,33 @@
 @SdkSuppress(minSdkVersion = Build.VERSION_CODES.O)
 class MenuScreenshotTest {
 
-    @get:Rule
-    val composeTestRule = createComposeRule()
+    @get:Rule val composeTestRule = createComposeRule()
 
-    @get:Rule
-    val screenshotRule = AndroidXScreenshotTestRule(GOLDEN_MATERIAL3)
+    @get:Rule val screenshotRule = AndroidXScreenshotTestRule(GOLDEN_MATERIAL3)
 
     private val testTag = "dropdown_menu"
 
     @Test
     fun dropdownMenu_lightTheme() {
-        composeTestRule.setMaterialContent(lightColorScheme()) {
-            TestMenu(enabledItems = true)
-        }
+        composeTestRule.setMaterialContent(lightColorScheme()) { TestMenu(enabledItems = true) }
         assertAgainstGolden(goldenIdentifier = "dropdownMenu_lightTheme")
     }
 
     @Test
     fun dropdownMenu_darkTheme() {
-        composeTestRule.setMaterialContent(darkColorScheme()) {
-            TestMenu(enabledItems = true)
-        }
+        composeTestRule.setMaterialContent(darkColorScheme()) { TestMenu(enabledItems = true) }
         assertAgainstGolden(goldenIdentifier = "dropdownMenu_darkTheme")
     }
 
     @Test
     fun dropdownMenu_disabled_lightTheme() {
-        composeTestRule.setMaterialContent(lightColorScheme()) {
-            TestMenu(enabledItems = false)
-        }
+        composeTestRule.setMaterialContent(lightColorScheme()) { TestMenu(enabledItems = false) }
         assertAgainstGolden(goldenIdentifier = "dropdownMenu_disabled_lightTheme")
     }
 
     @Test
     fun dropdownMenu_disabled_darkTheme() {
-        composeTestRule.setMaterialContent(darkColorScheme()) {
-            TestMenu(enabledItems = false)
-        }
+        composeTestRule.setMaterialContent(darkColorScheme()) { TestMenu(enabledItems = false) }
         assertAgainstGolden(goldenIdentifier = "dropdownMenu_disabled_darkTheme")
     }
 
@@ -128,10 +118,7 @@
         shadowElevation: Dp = MenuDefaults.ShadowElevation,
         border: BorderStroke? = null,
     ) {
-        Box(
-            Modifier
-                .testTag(testTag)
-                .padding(20.dp), contentAlignment = Alignment.Center) {
+        Box(Modifier.testTag(testTag).padding(20.dp), contentAlignment = Alignment.Center) {
             DropdownMenuContent(
                 modifier = Modifier,
                 expandedState = MutableTransitionState(initialState = true),
@@ -145,48 +132,32 @@
             ) {
                 DropdownMenuItem(
                     text = { Text("Edit") },
-                    onClick = { },
+                    onClick = {},
                     enabled = enabledItems,
-                    leadingIcon = {
-                        Icon(
-                            Icons.Outlined.Edit,
-                            contentDescription = null
-                        )
-                    })
+                    leadingIcon = { Icon(Icons.Outlined.Edit, contentDescription = null) }
+                )
                 DropdownMenuItem(
                     text = { Text("Settings") },
-                    onClick = { },
+                    onClick = {},
                     enabled = enabledItems,
-                    leadingIcon = {
-                        Icon(
-                            Icons.Outlined.Settings,
-                            contentDescription = null
-                        )
-                    },
-                    trailingIcon = { Text("F11", textAlign = TextAlign.Center) })
+                    leadingIcon = { Icon(Icons.Outlined.Settings, contentDescription = null) },
+                    trailingIcon = { Text("F11", textAlign = TextAlign.Center) }
+                )
                 HorizontalDivider()
                 DropdownMenuItem(
                     text = { Text("Send Feedback") },
-                    onClick = { },
+                    onClick = {},
                     enabled = enabledItems,
-                    leadingIcon = {
-                        Icon(
-                            Icons.Outlined.Email,
-                            contentDescription = null
-                        )
-                    },
-                    trailingIcon = {
-                        Icon(
-                            Icons.Outlined.Lock,
-                            contentDescription = null
-                        )
-                    })
+                    leadingIcon = { Icon(Icons.Outlined.Email, contentDescription = null) },
+                    trailingIcon = { Icon(Icons.Outlined.Lock, contentDescription = null) }
+                )
             }
         }
     }
 
     private fun assertAgainstGolden(goldenIdentifier: String) {
-        composeTestRule.onNodeWithTag(testTag)
+        composeTestRule
+            .onNodeWithTag(testTag)
             .captureToImage()
             .assertAgainstGolden(screenshotRule, goldenIdentifier)
     }
diff --git a/compose/material3/material3/src/androidInstrumentedTest/kotlin/androidx/compose/material3/MenuTest.kt b/compose/material3/material3/src/androidInstrumentedTest/kotlin/androidx/compose/material3/MenuTest.kt
index 773ce26..536e9fe 100644
--- a/compose/material3/material3/src/androidInstrumentedTest/kotlin/androidx/compose/material3/MenuTest.kt
+++ b/compose/material3/material3/src/androidInstrumentedTest/kotlin/androidx/compose/material3/MenuTest.kt
@@ -49,27 +49,20 @@
 @MediumTest
 @RunWith(AndroidJUnit4::class)
 class MenuTest {
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
     @Test
     fun menu_canBeTriggered() {
         var expanded by mutableStateOf(false)
 
         rule.setContent {
-            Box(
-                Modifier
-                    .requiredSize(20.dp)
-                    .background(color = Color.Blue)
-            ) {
-                DropdownMenu(
-                    expanded = expanded,
-                    onDismissRequest = {}
-                ) {
+            Box(Modifier.requiredSize(20.dp).background(color = Color.Blue)) {
+                DropdownMenu(expanded = expanded, onDismissRequest = {}) {
                     DropdownMenuItem(
                         text = { Text("Option 1") },
                         modifier = Modifier.testTag("MenuContent"),
-                        onClick = {})
+                        onClick = {}
+                    )
                 }
             }
         }
@@ -103,25 +96,10 @@
     fun menu_hasExpectedSize() {
         rule.setContent {
             with(LocalDensity.current) {
-                Box(
-                    Modifier
-                        .requiredSize(20.toDp())
-                        .background(color = Color.Blue)
-                ) {
-                    DropdownMenu(
-                        expanded = true,
-                        onDismissRequest = {}
-                    ) {
-                        Box(
-                            Modifier
-                                .testTag("MenuContent1")
-                                .size(70.toDp())
-                        )
-                        Box(
-                            Modifier
-                                .testTag("MenuContent2")
-                                .size(130.toDp())
-                        )
+                Box(Modifier.requiredSize(20.toDp()).background(color = Color.Blue)) {
+                    DropdownMenu(expanded = true, onDismissRequest = {}) {
+                        Box(Modifier.testTag("MenuContent1").size(70.toDp()))
+                        Box(Modifier.testTag("MenuContent2").size(130.toDp()))
                     }
                 }
             }
@@ -129,10 +107,15 @@
 
         rule.onNodeWithTag("MenuContent1").assertExists()
         rule.onNodeWithTag("MenuContent2").assertExists()
-        val node = rule.onNode(
-            isPopup() and hasAnyDescendant(hasTestTag("MenuContent1")) and
-                hasAnyDescendant(hasTestTag("MenuContent2"))
-        ).assertExists().fetchSemanticsNode()
+        val node =
+            rule
+                .onNode(
+                    isPopup() and
+                        hasAnyDescendant(hasTestTag("MenuContent1")) and
+                        hasAnyDescendant(hasTestTag("MenuContent2"))
+                )
+                .assertExists()
+                .fetchSemanticsNode()
         with(rule.density) {
             assertThat(node.size.width).isEqualTo(130)
             assertThat(node.size.height)
@@ -144,11 +127,7 @@
     fun menu_scrolledContent() {
         rule.setContent {
             with(LocalDensity.current) {
-                Box(
-                    Modifier
-                        .requiredSize(20.toDp())
-                        .background(color = Color.Blue)
-                ) {
+                Box(Modifier.requiredSize(20.toDp()).background(color = Color.Blue)) {
                     val scrollState = rememberScrollState()
                     DropdownMenu(
                         expanded = true,
@@ -156,16 +135,10 @@
                         scrollState = scrollState
                     ) {
                         repeat(100) {
-                            Box(
-                                Modifier
-                                    .testTag("MenuContent ${it + 1}")
-                                    .size(70.toDp())
-                            )
+                            Box(Modifier.testTag("MenuContent ${it + 1}").size(70.toDp()))
                         }
                     }
-                    LaunchedEffect(Unit) {
-                        scrollState.scrollTo(scrollState.maxValue)
-                    }
+                    LaunchedEffect(Unit) { scrollState.scrollTo(scrollState.maxValue) }
                 }
             }
         }
@@ -185,16 +158,12 @@
             DropdownMenuItem(
                 text = { Box(Modifier.requiredSize(40.dp)) },
                 onClick,
-                modifier = Modifier
-                    .testTag("MenuItem")
-                    .clickable(onClick = onClick),
+                modifier = Modifier.testTag("MenuItem").clickable(onClick = onClick),
             )
         }
 
         rule.onNodeWithTag("MenuItem").performClick()
 
-        rule.runOnIdle {
-            assertThat(clicked).isTrue()
-        }
+        rule.runOnIdle { assertThat(clicked).isTrue() }
     }
 }
diff --git a/compose/material3/material3/src/androidInstrumentedTest/kotlin/androidx/compose/material3/ModalBottomSheetScreenshotTest.kt b/compose/material3/material3/src/androidInstrumentedTest/kotlin/androidx/compose/material3/ModalBottomSheetScreenshotTest.kt
index d63d2d6..6a7cc43 100644
--- a/compose/material3/material3/src/androidInstrumentedTest/kotlin/androidx/compose/material3/ModalBottomSheetScreenshotTest.kt
+++ b/compose/material3/material3/src/androidInstrumentedTest/kotlin/androidx/compose/material3/ModalBottomSheetScreenshotTest.kt
@@ -45,11 +45,9 @@
 @SdkSuppress(minSdkVersion = Build.VERSION_CODES.O)
 class ModalBottomSheetScreenshotTest {
 
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
-    @get:Rule
-    val screenshotRule = AndroidXScreenshotTestRule(GOLDEN_MATERIAL3)
+    @get:Rule val screenshotRule = AndroidXScreenshotTestRule(GOLDEN_MATERIAL3)
 
     private val testTag = "ModalBottomSheet"
 
@@ -94,9 +92,7 @@
     }
 
     private fun assertAgainstGolden(goldenName: String) {
-        rule.onNodeWithTag(testTag)
-            .captureToImage()
-            .assertAgainstGolden(screenshotRule, goldenName)
+        rule.onNodeWithTag(testTag).captureToImage().assertAgainstGolden(screenshotRule, goldenName)
     }
 
     @Composable
diff --git a/compose/material3/material3/src/androidInstrumentedTest/kotlin/androidx/compose/material3/ModalBottomSheetTest.kt b/compose/material3/material3/src/androidInstrumentedTest/kotlin/androidx/compose/material3/ModalBottomSheetTest.kt
index 6bdf964..5a06bfd 100644
--- a/compose/material3/material3/src/androidInstrumentedTest/kotlin/androidx/compose/material3/ModalBottomSheetTest.kt
+++ b/compose/material3/material3/src/androidInstrumentedTest/kotlin/androidx/compose/material3/ModalBottomSheetTest.kt
@@ -104,8 +104,7 @@
 @OptIn(ExperimentalMaterial3Api::class)
 class ModalBottomSheetTest {
 
-    @get:Rule
-    val rule = createAndroidComposeRule<ComponentActivity>()
+    @get:Rule val rule = createAndroidComposeRule<ComponentActivity>()
 
     private val sheetHeight = 256.dp
     private val dragHandleSize = 44.dp
@@ -125,11 +124,7 @@
                     sheetState = sheetState,
                     onDismissRequest = { showBottomSheet = false },
                 ) {
-                    Box(
-                        Modifier
-                            .size(sheetHeight)
-                            .testTag(sheetTag)
-                    )
+                    Box(Modifier.size(sheetHeight).testTag(sheetTag))
                 }
             }
         }
@@ -137,9 +132,15 @@
         assertThat(sheetState.isVisible).isTrue()
 
         // Tap Scrim
-        val outsideY = with(rule.density) {
-            rule.onAllNodes(isDialog()).onFirst().getUnclippedBoundsInRoot().height.roundToPx() / 4
-        }
+        val outsideY =
+            with(rule.density) {
+                rule
+                    .onAllNodes(isDialog())
+                    .onFirst()
+                    .getUnclippedBoundsInRoot()
+                    .height
+                    .roundToPx() / 4
+            }
         UiDevice.getInstance(InstrumentationRegistry.getInstrumentation()).click(0, outsideY)
         rule.waitForIdle()
 
@@ -158,11 +159,7 @@
                     sheetState = sheetState,
                     onDismissRequest = { showBottomSheet = false },
                 ) {
-                    Box(
-                        Modifier
-                            .size(sheetHeight)
-                            .testTag(sheetTag)
-                    )
+                    Box(Modifier.size(sheetHeight).testTag(sheetTag))
                 }
             }
         }
@@ -170,9 +167,7 @@
         assertThat(sheetState.isVisible).isTrue()
 
         // Swipe Down
-        rule.onNodeWithTag(sheetTag).performTouchInput {
-            swipeDown()
-        }
+        rule.onNodeWithTag(sheetTag).performTouchInput { swipeDown() }
         rule.waitForIdle()
 
         // Bottom sheet should not exist
@@ -192,15 +187,15 @@
                 onDismissRequest = {},
             ) {
                 Box(
-                    Modifier
-                        .fillMaxWidth()
-                        .height(sheetHeight)
-                        .onSizeChanged { boxWidth = it.width }
+                    Modifier.fillMaxWidth().height(sheetHeight).onSizeChanged {
+                        boxWidth = it.width
+                    }
                 )
             }
         }
         assertThat(boxWidth).isEqualTo(screenWidth)
     }
+
     // TODO(330937081): Update test logic to instead change virtual screen size.
     @Test
     @Ignore
@@ -208,19 +203,21 @@
         rule.activity.requestedOrientation = ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE
         val latch = CountDownLatch(1)
 
-        rule.activity.application.registerComponentCallbacks(object : ComponentCallbacks2 {
-            override fun onConfigurationChanged(p0: Configuration) {
-                latch.countDown()
-            }
+        rule.activity.application.registerComponentCallbacks(
+            object : ComponentCallbacks2 {
+                override fun onConfigurationChanged(p0: Configuration) {
+                    latch.countDown()
+                }
 
-            override fun onLowMemory() {
-                // NO-OP
-            }
+                override fun onLowMemory() {
+                    // NO-OP
+                }
 
-            override fun onTrimMemory(p0: Int) {
-                // NO-OP
+                override fun onTrimMemory(p0: Int) {
+                    // NO-OP
+                }
             }
-        })
+        )
 
         try {
             latch.await(1500, TimeUnit.MILLISECONDS)
@@ -228,11 +225,7 @@
                 ModalBottomSheet(
                     onDismissRequest = {},
                 ) {
-                    Box(
-                        Modifier
-                            .testTag(sheetTag)
-                            .fillMaxHeight(0.4f)
-                    )
+                    Box(Modifier.testTag(sheetTag).fillMaxHeight(0.4f))
                 }
             }
             rule.waitForIdle()
@@ -240,17 +233,17 @@
             val maxSheetWidth = 640.dp
             val expectedSheetWidth = maxSheetWidth.coerceAtMost(simulatedRootWidth)
             // Our sheet should be max 640 dp but fill the width if the container is less wide
-            val expectedSheetLeft = if (simulatedRootWidth <= expectedSheetWidth) {
-                0.dp
-            } else {
-                (simulatedRootWidth - expectedSheetWidth) / 2
-            }
+            val expectedSheetLeft =
+                if (simulatedRootWidth <= expectedSheetWidth) {
+                    0.dp
+                } else {
+                    (simulatedRootWidth - expectedSheetWidth) / 2
+                }
 
-            rule.onNodeWithTag(sheetTag)
+            rule
+                .onNodeWithTag(sheetTag)
                 .onParent()
-                .assertLeftPositionInRootIsEqualTo(
-                    expectedLeft = expectedSheetLeft
-                )
+                .assertLeftPositionInRootIsEqualTo(expectedLeft = expectedSheetLeft)
                 .assertWidthIsEqualTo(expectedSheetWidth)
         } catch (e: InterruptedException) {
             fail("Unable to verify sheet width in landscape orientation")
@@ -266,19 +259,21 @@
         rule.activity.requestedOrientation = ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE
         val latch = CountDownLatch(1)
 
-        rule.activity.application.registerComponentCallbacks(object : ComponentCallbacks2 {
-            override fun onConfigurationChanged(p0: Configuration) {
-                latch.countDown()
-            }
+        rule.activity.application.registerComponentCallbacks(
+            object : ComponentCallbacks2 {
+                override fun onConfigurationChanged(p0: Configuration) {
+                    latch.countDown()
+                }
 
-            override fun onLowMemory() {
-                // NO-OP
-            }
+                override fun onLowMemory() {
+                    // NO-OP
+                }
 
-            override fun onTrimMemory(p0: Int) {
-                // NO-OP
+                override fun onTrimMemory(p0: Int) {
+                    // NO-OP
+                }
             }
-        })
+        )
 
         try {
             latch.await(3000, TimeUnit.MILLISECONDS)
@@ -290,11 +285,7 @@
                     onDismissRequest = {},
                     sheetMaxWidth = Dp.Unspecified,
                 ) {
-                    Box(
-                        Modifier
-                            .testTag(sheetTag)
-                            .fillMaxHeight(0.4f)
-                    )
+                    Box(Modifier.testTag(sheetTag).fillMaxHeight(0.4f))
                 }
             }
             rule.waitForIdle()
@@ -322,12 +313,7 @@
                 dragHandle = null,
                 contentWindowInsets = { WindowInsets(0) }
             ) {
-                Box(
-                    Modifier
-                        .fillMaxWidth()
-                        .testTag(sheetTag)
-                        .height(sheetHeight)
-                )
+                Box(Modifier.fillMaxWidth().testTag(sheetTag).height(sheetHeight))
             }
         }
 
@@ -356,13 +342,10 @@
             }
         }
         rule.waitForIdle()
-        screenHeightPx = with(rule.density) {
-            rule.onNode(isDialog()).getUnclippedBoundsInRoot().height.toPx()
-        }
+        screenHeightPx =
+            with(rule.density) { rule.onNode(isDialog()).getUnclippedBoundsInRoot().height.toPx() }
         assertThat(sheetState.targetValue).isEqualTo(SheetValue.PartiallyExpanded)
-        assertThat(sheetState.requireOffset())
-            .isWithin(1f)
-            .of(screenHeightPx / 2f)
+        assertThat(sheetState.requireOffset()).isWithin(1f).of(screenHeightPx / 2f)
     }
 
     @Test
@@ -377,11 +360,7 @@
                     sheetState = sheetState,
                     onDismissRequest = { showBottomSheet = false },
                 ) {
-                    Box(
-                        Modifier
-                            .fillMaxHeight(0.4f)
-                            .testTag(sheetTag)
-                    ) {
+                    Box(Modifier.fillMaxHeight(0.4f).testTag(sheetTag)) {
                         Button(
                             onClick = { dispatcher.onBackPressed() },
                             modifier = Modifier.testTag(BackTestTag),
@@ -414,11 +393,7 @@
                     sheetState = sheetState,
                     onDismissRequest = { showBottomSheet = false },
                 ) {
-                    Box(
-                        Modifier
-                            .fillMaxHeight(0.6f)
-                            .testTag(sheetTag)
-                    ) {
+                    Box(Modifier.fillMaxHeight(0.6f).testTag(sheetTag)) {
                         Button(
                             onClick = { dispatcher.onBackPressed() },
                             modifier = Modifier.testTag(BackTestTag),
@@ -443,9 +418,7 @@
         var size by mutableStateOf(56.dp)
         var screenHeight by mutableStateOf(0.dp)
         val expectedExpandedAnchor by derivedStateOf {
-            with(rule.density) {
-                (screenHeight - size).toPx()
-            }
+            with(rule.density) { (screenHeight - size).toPx() }
         }
 
         rule.setContent {
@@ -458,11 +431,7 @@
                 dragHandle = null,
                 contentWindowInsets = { WindowInsets(0) }
             ) {
-                Box(
-                    Modifier
-                        .height(size)
-                        .fillMaxWidth()
-                )
+                Box(Modifier.height(size).fillMaxWidth())
             }
         }
         screenHeight = rule.onNode(isDialog()).getUnclippedBoundsInRoot().height
@@ -490,11 +459,7 @@
                 onDismissRequest = {},
                 sheetMaxWidth = sheetMaxWidth.value,
             ) {
-                Box(
-                    Modifier
-                        .fillMaxWidth()
-                        .testTag(sheetTag)
-                )
+                Box(Modifier.fillMaxWidth().testTag(sheetTag))
             }
         }
 
@@ -546,11 +511,7 @@
                 contentWindowInsets = { WindowInsets(0) }
             ) {
                 scope = rememberCoroutineScope()
-                LazyColumn {
-                    items(amountOfItems) {
-                        ListItem(headlineContent = { Text("$it") })
-                    }
-                }
+                LazyColumn { items(amountOfItems) { ListItem(headlineContent = { Text("$it") }) } }
             }
         }
 
@@ -558,9 +519,7 @@
 
         amountOfItems = 50
         rule.waitForIdle()
-        scope.launch {
-            state.show()
-        }
+        scope.launch { state.show() }
         // The anchors should now be {Hidden, PartiallyExpanded, Expanded}
 
         rule.waitForIdle()
@@ -594,14 +553,8 @@
                 sheetState = sheetState,
             ) {
                 scrollState = rememberScrollState()
-                Column(
-                    Modifier
-                        .verticalScroll(scrollState)
-                        .testTag(sheetTag)
-                ) {
-                    repeat(100) {
-                        Text(it.toString(), Modifier.requiredHeight(50.dp))
-                    }
+                Column(Modifier.verticalScroll(scrollState).testTag(sheetTag)) {
+                    repeat(100) { Text(it.toString(), Modifier.requiredHeight(50.dp)) }
                 }
             }
         }
@@ -611,42 +564,33 @@
         assertThat(scrollState.value).isEqualTo(0)
         assertThat(sheetState.currentValue).isEqualTo(SheetValue.PartiallyExpanded)
 
-        rule.onNodeWithTag(sheetTag)
-            .performTouchInput {
-                swipeUp(startY = bottom, endY = bottom / 2)
-            }
+        rule.onNodeWithTag(sheetTag).performTouchInput {
+            swipeUp(startY = bottom, endY = bottom / 2)
+        }
         rule.waitForIdle()
         assertThat(scrollState.value).isEqualTo(0)
         assertThat(sheetState.currentValue).isEqualTo(SheetValue.Expanded)
 
-        rule.onNodeWithTag(sheetTag)
-            .performTouchInput {
-                swipeUp(startY = bottom, endY = top)
-            }
+        rule.onNodeWithTag(sheetTag).performTouchInput { swipeUp(startY = bottom, endY = top) }
         rule.waitForIdle()
         assertThat(scrollState.value).isGreaterThan(0)
         assertThat(sheetState.currentValue).isEqualTo(SheetValue.Expanded)
 
-        rule.onNodeWithTag(sheetTag)
-            .performTouchInput {
-                swipeDown(startY = top, endY = bottom)
-            }
+        rule.onNodeWithTag(sheetTag).performTouchInput { swipeDown(startY = top, endY = bottom) }
         rule.waitForIdle()
         assertThat(scrollState.value).isEqualTo(0)
         assertThat(sheetState.currentValue).isEqualTo(SheetValue.Expanded)
 
-        rule.onNodeWithTag(sheetTag)
-            .performTouchInput {
-                swipeDown(startY = top, endY = bottom / 2)
-            }
+        rule.onNodeWithTag(sheetTag).performTouchInput {
+            swipeDown(startY = top, endY = bottom / 2)
+        }
         rule.waitForIdle()
         assertThat(scrollState.value).isEqualTo(0)
         assertThat(sheetState.currentValue).isEqualTo(SheetValue.PartiallyExpanded)
 
-        rule.onNodeWithTag(sheetTag)
-            .performTouchInput {
-                swipeDown(startY = bottom / 2, endY = bottom)
-            }
+        rule.onNodeWithTag(sheetTag).performTouchInput {
+            swipeDown(startY = bottom / 2, endY = bottom)
+        }
         rule.waitForIdle()
         assertThat(scrollState.value).isEqualTo(0)
         assertThat(sheetState.currentValue).isEqualTo(SheetValue.Hidden)
@@ -667,17 +611,9 @@
                 sheetState = sheetState,
             ) {
                 if (showShortContent) {
-                    Box(
-                        Modifier
-                            .fillMaxWidth()
-                            .height(100.dp)
-                    )
+                    Box(Modifier.fillMaxWidth().height(100.dp))
                 } else {
-                    Box(
-                        Modifier
-                            .fillMaxSize()
-                            .testTag(sheetTag)
-                    )
+                    Box(Modifier.fillMaxSize().testTag(sheetTag))
                 }
             }
         }
@@ -687,17 +623,13 @@
             swipeDown()
         }
 
-        rule.runOnIdle {
-            assertThat(sheetState.currentValue).isEqualTo(SheetValue.Hidden)
-        }
+        rule.runOnIdle { assertThat(sheetState.currentValue).isEqualTo(SheetValue.Hidden) }
 
         showShortContent = true
         scope.launch { sheetState.show() } // We can't use LaunchedEffect with Swipeable in tests
         // yet, so we're invoking this outside of composition. See b/254115946.
 
-        rule.runOnIdle {
-            assertThat(sheetState.currentValue).isEqualTo(SheetValue.Expanded)
-        }
+        rule.runOnIdle { assertThat(sheetState.currentValue).isEqualTo(SheetValue.Expanded) }
     }
 
     @Test
@@ -709,11 +641,7 @@
                 onDismissRequest = {},
                 sheetState = sheetState,
             ) {
-                Box(
-                    Modifier
-                        .fillMaxSize()
-                        .testTag(sheetTag)
-                )
+                Box(Modifier.fillMaxSize().testTag(sheetTag))
             }
         }
 
@@ -721,40 +649,26 @@
             assertThat(sheetState.currentValue).isEqualTo(SheetValue.PartiallyExpanded)
         }
 
-        rule.onNodeWithTag(sheetTag)
-            .performTouchInput { swipeUp() }
+        rule.onNodeWithTag(sheetTag).performTouchInput { swipeUp() }
 
-        rule.runOnIdle {
-            assertThat(sheetState.currentValue).isEqualTo(SheetValue.Expanded)
-        }
+        rule.runOnIdle { assertThat(sheetState.currentValue).isEqualTo(SheetValue.Expanded) }
     }
 
     @Test
     fun modalBottomSheet_respectsConfirmValueChange() {
         lateinit var sheetState: SheetState
         rule.setContent {
-            sheetState = rememberModalBottomSheetState(
-                confirmValueChange = { newState ->
-                    newState != SheetValue.Hidden
-                }
-            )
+            sheetState =
+                rememberModalBottomSheetState(
+                    confirmValueChange = { newState -> newState != SheetValue.Hidden }
+                )
 
             ModalBottomSheet(
                 onDismissRequest = {},
                 sheetState = sheetState,
-                dragHandle = {
-                    Box(
-                        Modifier
-                            .testTag(dragHandleTag)
-                            .size(dragHandleSize)
-                    )
-                },
+                dragHandle = { Box(Modifier.testTag(dragHandleTag).size(dragHandleSize)) },
             ) {
-                Box(
-                    Modifier
-                        .fillMaxSize()
-                        .testTag(sheetTag)
-                )
+                Box(Modifier.fillMaxSize().testTag(sheetTag))
             }
         }
 
@@ -762,14 +676,15 @@
             assertThat(sheetState.currentValue).isEqualTo(SheetValue.PartiallyExpanded)
         }
 
-        rule.onNodeWithTag(sheetTag)
-            .performTouchInput { swipeDown() }
+        rule.onNodeWithTag(sheetTag).performTouchInput { swipeDown() }
 
         rule.runOnIdle {
             assertThat(sheetState.currentValue).isEqualTo(SheetValue.PartiallyExpanded)
         }
 
-        rule.onNodeWithTag(dragHandleTag, useUnmergedTree = true).onParent()
+        rule
+            .onNodeWithTag(dragHandleTag, useUnmergedTree = true)
+            .onParent()
             .performSemanticsAction(SemanticsActions.Dismiss)
 
         rule.runOnIdle {
@@ -777,9 +692,15 @@
         }
 
         // Tap Scrim
-        val outsideY = with(rule.density) {
-            rule.onAllNodes(isDialog()).onFirst().getUnclippedBoundsInRoot().height.roundToPx() / 4
-        }
+        val outsideY =
+            with(rule.density) {
+                rule
+                    .onAllNodes(isDialog())
+                    .onFirst()
+                    .getUnclippedBoundsInRoot()
+                    .height
+                    .roundToPx() / 4
+            }
         UiDevice.getInstance(InstrumentationRegistry.getInstrumentation()).click(0, outsideY)
         rule.waitForIdle()
         rule.runOnIdle {
@@ -798,11 +719,7 @@
                 onDismissRequest = {},
                 sheetState = sheetState,
             ) {
-                Box(
-                    Modifier
-                        .fillMaxSize()
-                        .testTag(sheetTag)
-                )
+                Box(Modifier.fillMaxSize().testTag(sheetTag))
             }
         }
 
@@ -811,16 +728,11 @@
         }
 
         scope.launch { sheetState.expand() }
-        rule.runOnIdle {
-            assertThat(sheetState.currentValue).isEqualTo(SheetValue.Expanded)
-        }
+        rule.runOnIdle { assertThat(sheetState.currentValue).isEqualTo(SheetValue.Expanded) }
 
-        rule.onNodeWithTag(sheetTag)
-            .performTouchInput { swipeDown() }
+        rule.onNodeWithTag(sheetTag).performTouchInput { swipeDown() }
 
-        rule.runOnIdle {
-            assertThat(sheetState.currentValue).isEqualTo(SheetValue.Hidden)
-        }
+        rule.runOnIdle { assertThat(sheetState.currentValue).isEqualTo(SheetValue.Hidden) }
     }
 
     @Test
@@ -833,70 +745,48 @@
                 onDismissRequest = {},
                 sheetState = sheetState,
             ) {
-                Box(
-                    Modifier
-                        .fillMaxWidth()
-                        .height(sheetHeight)
-                        .testTag(sheetTag)
-                )
+                Box(Modifier.fillMaxWidth().height(sheetHeight).testTag(sheetTag))
             }
         }
 
-        rule.runOnIdle {
-            assertThat(sheetState.currentValue).isEqualTo(SheetValue.Expanded)
-        }
+        rule.runOnIdle { assertThat(sheetState.currentValue).isEqualTo(SheetValue.Expanded) }
 
-        rule.onNodeWithTag(sheetTag)
-            .performTouchInput { swipeDown() }
+        rule.onNodeWithTag(sheetTag).performTouchInput { swipeDown() }
 
-        rule.runOnIdle {
-            assertThat(sheetState.currentValue).isEqualTo(SheetValue.Hidden)
-        }
+        rule.runOnIdle { assertThat(sheetState.currentValue).isEqualTo(SheetValue.Hidden) }
     }
 
     @Test
-    fun modalBottomSheet_hideManually_skipPartiallyExpanded(): Unit = runBlocking(
-        AutoTestFrameClock()
-    ) {
-        lateinit var sheetState: SheetState
-        rule.setContent {
-            sheetState = rememberModalBottomSheetState(skipPartiallyExpanded = true)
-            ModalBottomSheet(
-                onDismissRequest = {},
-                sheetState = sheetState,
-            ) {
-                Box(
-                    Modifier
-                        .fillMaxSize()
-                        .testTag(sheetTag)
-                )
+    fun modalBottomSheet_hideManually_skipPartiallyExpanded(): Unit =
+        runBlocking(AutoTestFrameClock()) {
+            lateinit var sheetState: SheetState
+            rule.setContent {
+                sheetState = rememberModalBottomSheetState(skipPartiallyExpanded = true)
+                ModalBottomSheet(
+                    onDismissRequest = {},
+                    sheetState = sheetState,
+                ) {
+                    Box(Modifier.fillMaxSize().testTag(sheetTag))
+                }
             }
+            assertThat(sheetState.currentValue == SheetValue.Expanded)
+
+            sheetState.hide()
+
+            assertThat(sheetState.currentValue == SheetValue.Hidden)
         }
-        assertThat(sheetState.currentValue == SheetValue.Expanded)
-
-        sheetState.hide()
-
-        assertThat(sheetState.currentValue == SheetValue.Hidden)
-    }
 
     @Test
     fun modalBottomSheet_testParialExpandReturnsIllegalStateException_whenSkipPartialExpanded() {
         lateinit var scope: CoroutineScope
-        val bottomSheetState = SheetState(
-            skipPartiallyExpanded = true,
-            density = rule.density
-        )
+        val bottomSheetState = SheetState(skipPartiallyExpanded = true, density = rule.density)
         rule.setContent {
             scope = rememberCoroutineScope()
             ModalBottomSheet(
                 onDismissRequest = {},
                 sheetState = bottomSheetState,
             ) {
-                Box(
-                    Modifier
-                        .fillMaxSize()
-                        .testTag(sheetTag)
-                )
+                Box(Modifier.fillMaxSize().testTag(sheetTag))
             }
         }
         scope.launch {
@@ -904,10 +794,12 @@
                 kotlin.runCatching { bottomSheetState.partialExpand() }.exceptionOrNull()
             assertThat(exception).isNotNull()
             assertThat(exception).isInstanceOf(IllegalStateException::class.java)
-            assertThat(exception).hasMessageThat().containsMatch(
-                "Attempted to animate to partial expanded when skipPartiallyExpanded was " +
-                    "enabled. Set skipPartiallyExpanded to false to use this function."
-            )
+            assertThat(exception)
+                .hasMessageThat()
+                .containsMatch(
+                    "Attempted to animate to partial expanded when skipPartiallyExpanded was " +
+                        "enabled. Set skipPartiallyExpanded to false to use this function."
+                )
         }
     }
 
@@ -916,23 +808,15 @@
         rule.setContent {
             ModalBottomSheet(
                 onDismissRequest = {},
-                dragHandle = {
-                    Box(
-                        Modifier
-                            .testTag(dragHandleTag)
-                            .size(dragHandleSize)
-                    )
-                },
+                dragHandle = { Box(Modifier.testTag(dragHandleTag).size(dragHandleSize)) },
             ) {
-                Box(
-                    Modifier
-                        .fillMaxSize()
-                        .testTag(sheetTag)
-                )
+                Box(Modifier.fillMaxSize().testTag(sheetTag))
             }
         }
 
-        rule.onNodeWithTag(dragHandleTag, useUnmergedTree = true).onParent()
+        rule
+            .onNodeWithTag(dragHandleTag, useUnmergedTree = true)
+            .onParent()
             .assert(SemanticsMatcher.keyNotDefined(SemanticsActions.Collapse))
             .assert(SemanticsMatcher.keyIsDefined(SemanticsActions.Expand))
             .assert(SemanticsMatcher.keyIsDefined(SemanticsActions.Dismiss))
@@ -947,31 +831,21 @@
             ModalBottomSheet(
                 onDismissRequest = {},
                 sheetState = sheetState,
-                dragHandle = {
-                    Box(
-                        Modifier
-                            .testTag(dragHandleTag)
-                            .size(dragHandleSize)
-                    )
-                },
+                dragHandle = { Box(Modifier.testTag(dragHandleTag).size(dragHandleSize)) },
             ) {
-                Box(
-                    Modifier
-                        .fillMaxSize()
-                        .testTag(sheetTag)
-                )
+                Box(Modifier.fillMaxSize().testTag(sheetTag))
             }
         }
 
-        rule.onNodeWithTag(dragHandleTag, useUnmergedTree = true).onParent()
+        rule
+            .onNodeWithTag(dragHandleTag, useUnmergedTree = true)
+            .onParent()
             .assert(SemanticsMatcher.keyNotDefined(SemanticsActions.Collapse))
             .assert(SemanticsMatcher.keyIsDefined(SemanticsActions.Expand))
             .assert(SemanticsMatcher.keyIsDefined(SemanticsActions.Dismiss))
             .performSemanticsAction(SemanticsActions.Expand)
 
-        rule.runOnIdle {
-            assertThat(sheetState.requireOffset()).isEqualTo(0f)
-        }
+        rule.runOnIdle { assertThat(sheetState.requireOffset()).isEqualTo(0f) }
     }
 
     @Test
@@ -987,38 +861,25 @@
             ModalBottomSheet(
                 onDismissRequest = {},
                 sheetState = sheetState,
-                dragHandle = {
-                    Box(
-                        Modifier
-                            .testTag(dragHandleTag)
-                            .size(dragHandleSize)
-                    )
-                },
+                dragHandle = { Box(Modifier.testTag(dragHandleTag).size(dragHandleSize)) },
             ) {
-                Box(
-                    Modifier
-                        .fillMaxSize()
-                        .testTag(sheetTag)
-                )
+                Box(Modifier.fillMaxSize().testTag(sheetTag))
             }
         }
-        screenHeightPx = with(rule.density) {
-            rule.onNode(isDialog()).getUnclippedBoundsInRoot().height.toPx()
-        }
-        scope.launch {
-            sheetState.expand()
-        }
+        screenHeightPx =
+            with(rule.density) { rule.onNode(isDialog()).getUnclippedBoundsInRoot().height.toPx() }
+        scope.launch { sheetState.expand() }
         rule.waitForIdle()
 
-        rule.onNodeWithTag(dragHandleTag, useUnmergedTree = true).onParent()
+        rule
+            .onNodeWithTag(dragHandleTag, useUnmergedTree = true)
+            .onParent()
             .assert(SemanticsMatcher.keyNotDefined(SemanticsActions.Expand))
             .assert(SemanticsMatcher.keyIsDefined(SemanticsActions.Collapse))
             .assert(SemanticsMatcher.keyIsDefined(SemanticsActions.Dismiss))
             .performSemanticsAction(SemanticsActions.Dismiss)
 
-        rule.runOnIdle {
-            assertThat(sheetState.requireOffset()).isWithin(1f).of(screenHeightPx)
-        }
+        rule.runOnIdle { assertThat(sheetState.requireOffset()).isWithin(1f).of(screenHeightPx) }
     }
 
     @Test
@@ -1034,30 +895,19 @@
             ModalBottomSheet(
                 onDismissRequest = {},
                 sheetState = sheetState,
-                dragHandle = {
-                    Box(
-                        Modifier
-                            .testTag(dragHandleTag)
-                            .size(dragHandleSize)
-                    )
-                },
+                dragHandle = { Box(Modifier.testTag(dragHandleTag).size(dragHandleSize)) },
             ) {
-                Box(
-                    Modifier
-                        .fillMaxSize()
-                        .testTag(sheetTag)
-                )
+                Box(Modifier.fillMaxSize().testTag(sheetTag))
             }
         }
-        screenHeightPx = with(rule.density) {
-            rule.onNode(isDialog()).getUnclippedBoundsInRoot().height.toPx()
-        }
-        scope.launch {
-            sheetState.expand()
-        }
+        screenHeightPx =
+            with(rule.density) { rule.onNode(isDialog()).getUnclippedBoundsInRoot().height.toPx() }
+        scope.launch { sheetState.expand() }
         rule.waitForIdle()
 
-        rule.onNodeWithTag(dragHandleTag, useUnmergedTree = true).onParent()
+        rule
+            .onNodeWithTag(dragHandleTag, useUnmergedTree = true)
+            .onParent()
             .assert(SemanticsMatcher.keyNotDefined(SemanticsActions.Expand))
             .assert(SemanticsMatcher.keyIsDefined(SemanticsActions.Collapse))
             .assert(SemanticsMatcher.keyIsDefined(SemanticsActions.Dismiss))
@@ -1148,9 +998,10 @@
         val sheetState = SheetState(skipPartiallyExpanded = true, density = rule.density)
 
         val nestedScrollDispatcher = NestedScrollDispatcher()
-        val nestedScrollConnection = object : NestedScrollConnection {
-            // No-Op
-        }
+        val nestedScrollConnection =
+            object : NestedScrollConnection {
+                // No-Op
+            }
         lateinit var scope: CoroutineScope
 
         rule.setContent {
@@ -1160,13 +1011,10 @@
                 sheetState = sheetState,
             ) {
                 Column(
-                    Modifier
-                        .testTag(sheetTag)
+                    Modifier.testTag(sheetTag)
                         .nestedScroll(nestedScrollConnection, nestedScrollDispatcher)
                 ) {
-                    (0..50).forEach {
-                        Text(text = "$it")
-                    }
+                    (0..50).forEach { Text(text = "$it") }
                 }
             }
         }
@@ -1195,7 +1043,8 @@
     @Test
     fun modalBottomSheet_imePadding() {
         // TODO: Include APIs < 30  when a solution is found for b/290893168.
-        // TODO: 33 > API > 29 does not use imePadding because of b/285746907, include when a better solution is found.
+        // TODO: 33 > API > 29 does not use imePadding because of b/285746907, include when a better
+        // solution is found.
         Assume.assumeTrue(SDK_INT >= 33)
 
         val imeAnimationDuration = 1000000L
@@ -1249,9 +1098,7 @@
                 }
             }
         }
-        rule.runOnIdle {
-            assertThat(value).isEqualTo(LayoutDirection.Rtl)
-        }
+        rule.runOnIdle { assertThat(value).isEqualTo(LayoutDirection.Rtl) }
     }
 
     @Test
@@ -1261,7 +1108,7 @@
                 onDismissRequest = { /*TODO*/ },
                 dragHandle = {},
                 contentWindowInsets = { WindowInsets(bottom = sheetHeight) },
-                ) {
+            ) {
                 Box(Modifier.testTag(sheetTag))
             }
         }
diff --git a/compose/material3/material3/src/androidInstrumentedTest/kotlin/androidx/compose/material3/ModalNavigationDrawerScreenshotTest.kt b/compose/material3/material3/src/androidInstrumentedTest/kotlin/androidx/compose/material3/ModalNavigationDrawerScreenshotTest.kt
index 3abf32b..a3f2782 100644
--- a/compose/material3/material3/src/androidInstrumentedTest/kotlin/androidx/compose/material3/ModalNavigationDrawerScreenshotTest.kt
+++ b/compose/material3/material3/src/androidInstrumentedTest/kotlin/androidx/compose/material3/ModalNavigationDrawerScreenshotTest.kt
@@ -67,12 +67,9 @@
 @SdkSuppress(minSdkVersion = Build.VERSION_CODES.O)
 class ModalNavigationDrawerScreenshotTest {
 
-    @Suppress("DEPRECATION")
-    @get:Rule
-    val rule = createComposeRule()
+    @Suppress("DEPRECATION") @get:Rule val rule = createComposeRule()
 
-    @get:Rule
-    val screenshotRule = AndroidXScreenshotTestRule(GOLDEN_MATERIAL3)
+    @get:Rule val screenshotRule = AndroidXScreenshotTestRule(GOLDEN_MATERIAL3)
 
     private fun ComposeContentTestRule.setnavigationDrawer(drawerValue: DrawerValue) {
         setMaterialContent(lightColorScheme()) {
@@ -80,14 +77,10 @@
                 ModalNavigationDrawer(
                     drawerState = rememberDrawerState(drawerValue),
                     drawerContent = {
-                        ModalDrawerSheet {
-                          Spacer(modifier = Modifier.fillMaxSize())
-                        }
+                        ModalDrawerSheet { Spacer(modifier = Modifier.fillMaxSize()) }
                     },
                     content = {
-                        Box(
-                            Modifier.fillMaxSize().background(MaterialTheme.colorScheme.background)
-                        )
+                        Box(Modifier.fillMaxSize().background(MaterialTheme.colorScheme.background))
                     }
                 )
             }
@@ -101,9 +94,7 @@
                     ModalNavigationDrawer(
                         drawerState = rememberDrawerState(drawerValue),
                         drawerContent = {
-                            ModalDrawerSheet {
-                              Spacer(modifier = Modifier.fillMaxSize())
-                            }
+                            ModalDrawerSheet { Spacer(modifier = Modifier.fillMaxSize()) }
                         },
                         content = {
                             Box(
@@ -136,7 +127,8 @@
     }
 
     private fun assertScreenshotAgainstGolden(goldenName: String) {
-        rule.onNodeWithTag("container")
+        rule
+            .onNodeWithTag("container")
             .captureToImage()
             .assertAgainstGolden(screenshotRule, goldenName)
     }
@@ -226,23 +218,24 @@
 
 private val ContainerTestTag = "container"
 
-private val items = listOf(
-    Icons.Default.AccountCircle,
-    Icons.Default.Build,
-    Icons.Default.Check,
-    Icons.Default.DateRange,
-    Icons.Default.Email,
-    Icons.Default.Favorite,
-    Icons.Default.Home,
-    Icons.Default.Info,
-    Icons.Default.Lock,
-    Icons.Default.Notifications,
-    Icons.Default.Place,
-    Icons.Default.Refresh,
-    Icons.Default.ShoppingCart,
-    Icons.Default.ThumbUp,
-    Icons.Default.Warning,
-)
+private val items =
+    listOf(
+        Icons.Default.AccountCircle,
+        Icons.Default.Build,
+        Icons.Default.Check,
+        Icons.Default.DateRange,
+        Icons.Default.Email,
+        Icons.Default.Favorite,
+        Icons.Default.Home,
+        Icons.Default.Info,
+        Icons.Default.Lock,
+        Icons.Default.Notifications,
+        Icons.Default.Place,
+        Icons.Default.Refresh,
+        Icons.Default.ShoppingCart,
+        Icons.Default.ThumbUp,
+        Icons.Default.Warning,
+    )
 
 @Composable
 private fun ModalNavigationDrawerPredictiveBack(progress: Float, swipeEdgeLeft: Boolean) {
@@ -255,16 +248,17 @@
         maxScaleYDistance = PredictiveBackDrawerMaxScaleYDistance.toPx()
     }
 
-    val drawerPredictiveBackState = DrawerPredictiveBackState().apply {
-        update(
-            progress = progress,
-            swipeEdgeLeft = swipeEdgeLeft,
-            isRtl = false,
-            maxScaleXDistanceGrow = maxScaleXDistanceGrow,
-            maxScaleXDistanceShrink = maxScaleXDistanceShrink,
-            maxScaleYDistance = maxScaleYDistance
-        )
-    }
+    val drawerPredictiveBackState =
+        DrawerPredictiveBackState().apply {
+            update(
+                progress = progress,
+                swipeEdgeLeft = swipeEdgeLeft,
+                isRtl = false,
+                maxScaleXDistanceGrow = maxScaleXDistanceGrow,
+                maxScaleXDistanceShrink = maxScaleXDistanceShrink,
+                maxScaleYDistance = maxScaleYDistance
+            )
+        }
 
     ModalNavigationDrawer(
         modifier = Modifier.testTag(ContainerTestTag),
@@ -295,12 +289,6 @@
                 }
             }
         },
-        content = {
-            Box(
-                Modifier
-                    .fillMaxSize()
-                    .background(MaterialTheme.colorScheme.background)
-            )
-        }
+        content = { Box(Modifier.fillMaxSize().background(MaterialTheme.colorScheme.background)) }
     )
 }
diff --git a/compose/material3/material3/src/androidInstrumentedTest/kotlin/androidx/compose/material3/ModalNavigationDrawerTest.kt b/compose/material3/material3/src/androidInstrumentedTest/kotlin/androidx/compose/material3/ModalNavigationDrawerTest.kt
index d0c31e1..ea8505dc 100644
--- a/compose/material3/material3/src/androidInstrumentedTest/kotlin/androidx/compose/material3/ModalNavigationDrawerTest.kt
+++ b/compose/material3/material3/src/androidInstrumentedTest/kotlin/androidx/compose/material3/ModalNavigationDrawerTest.kt
@@ -74,8 +74,7 @@
 @RunWith(AndroidJUnit4::class)
 class ModalNavigationDrawerTest {
 
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
     private val NavigationDrawerWidth = NavigationDrawerTokens.ContainerWidth
 
@@ -86,20 +85,13 @@
             ModalNavigationDrawer(
                 drawerState = drawerState,
                 drawerContent = {
-                    ModalDrawerSheet {
-                        Box(
-                            Modifier
-                                .fillMaxSize()
-                                .testTag("content")
-                        )
-                    }
+                    ModalDrawerSheet { Box(Modifier.fillMaxSize().testTag("content")) }
                 },
                 content = {}
             )
         }
 
-        rule.onNodeWithTag("content")
-            .assertLeftPositionInRootIsEqualTo(0.dp)
+        rule.onNodeWithTag("content").assertLeftPositionInRootIsEqualTo(0.dp)
     }
 
     @Test
@@ -109,20 +101,13 @@
             ModalNavigationDrawer(
                 drawerState = drawerState,
                 drawerContent = {
-                    ModalDrawerSheet {
-                        Box(
-                            Modifier
-                                .fillMaxSize()
-                                .testTag("content")
-                        )
-                    }
+                    ModalDrawerSheet { Box(Modifier.fillMaxSize().testTag("content")) }
                 },
                 content = {}
             )
         }
 
-        rule.onNodeWithTag("content")
-            .assertLeftPositionInRootIsEqualTo(-NavigationDrawerWidth)
+        rule.onNodeWithTag("content").assertLeftPositionInRootIsEqualTo(-NavigationDrawerWidth)
     }
 
     @Test
@@ -134,19 +119,14 @@
                 drawerState = drawerState,
                 drawerContent = {
                     ModalDrawerSheet(Modifier.width(customWidth)) {
-                        Box(
-                            Modifier
-                                .fillMaxSize()
-                                .testTag("content")
-                        )
+                        Box(Modifier.fillMaxSize().testTag("content"))
                     }
                 },
                 content = {}
             )
         }
 
-        rule.onNodeWithTag("content")
-            .assertLeftPositionInRootIsEqualTo(0.dp)
+        rule.onNodeWithTag("content").assertLeftPositionInRootIsEqualTo(0.dp)
     }
 
     @Test
@@ -158,19 +138,14 @@
                 drawerState = drawerState,
                 drawerContent = {
                     ModalDrawerSheet(Modifier.width(customWidth)) {
-                        Box(
-                            Modifier
-                                .fillMaxSize()
-                                .testTag("content")
-                        )
+                        Box(Modifier.fillMaxSize().testTag("content"))
                     }
                 },
                 content = {}
             )
         }
 
-        rule.onNodeWithTag("content")
-            .assertLeftPositionInRootIsEqualTo(-customWidth)
+        rule.onNodeWithTag("content").assertLeftPositionInRootIsEqualTo(-customWidth)
     }
 
     @Test
@@ -186,13 +161,7 @@
                     drawerState = drawerState,
                     drawerContent = {
                         ModalDrawerSheet(Modifier.width(customWidth)) {
-                            Box(
-                                Modifier
-                                    .fillMaxSize()
-                                    .onGloballyPositioned {
-                                        coords = it
-                                    }
-                            )
+                            Box(Modifier.fillMaxSize().onGloballyPositioned { coords = it })
                         }
                     },
                     content = {}
@@ -200,9 +169,7 @@
             }
         }
 
-        rule.runOnIdle {
-            assertThat(coords.positionOnScreen().x).isEqualTo(0f)
-        }
+        rule.runOnIdle { assertThat(coords.positionOnScreen().x).isEqualTo(0f) }
     }
 
     @Test
@@ -218,13 +185,7 @@
                     drawerState = drawerState,
                     drawerContent = {
                         ModalDrawerSheet(Modifier.width(customWidth)) {
-                            Box(
-                                Modifier
-                                    .fillMaxSize()
-                                    .onGloballyPositioned {
-                                        coords = it
-                                    }
-                            )
+                            Box(Modifier.fillMaxSize().onGloballyPositioned { coords = it })
                         }
                     },
                     content = {}
@@ -246,20 +207,13 @@
             ModalNavigationDrawer(
                 drawerState = drawerState,
                 drawerContent = {
-                    ModalDrawerSheet {
-                        Box(
-                            Modifier
-                                .fillMaxSize()
-                                .testTag("content")
-                        )
-                    }
+                    ModalDrawerSheet { Box(Modifier.fillMaxSize().testTag("content")) }
                 },
                 content = {}
             )
         }
 
-        rule.onNodeWithTag("content")
-            .assertWidthIsEqualTo(NavigationDrawerTokens.ContainerWidth)
+        rule.onNodeWithTag("content").assertWidthIsEqualTo(NavigationDrawerTokens.ContainerWidth)
     }
 
     @Test
@@ -270,18 +224,15 @@
                 drawerState = drawerState,
                 drawerContent = {
                     ModalDrawerSheet(windowInsets = WindowInsets(10.dp, 10.dp, 10.dp, 10.dp)) {
-                        Box(
-                            Modifier
-                                .fillMaxSize()
-                                .testTag("content")
-                        )
+                        Box(Modifier.fillMaxSize().testTag("content"))
                     }
                 },
                 content = {}
             )
         }
 
-        rule.onNodeWithTag("content")
+        rule
+            .onNodeWithTag("content")
             .assertTopPositionInRootIsEqualTo(10.dp)
             .assertLeftPositionInRootIsEqualTo(10.dp)
     }
@@ -295,10 +246,7 @@
                 drawerState = rememberDrawerState(DrawerValue.Open),
                 drawerContent = {
                     ModalDrawerSheet(Modifier.testTag("navigationDrawerTag")) {
-                        Box(
-                            Modifier
-                                .fillMaxSize()
-                        )
+                        Box(Modifier.fillMaxSize())
                     }
                 },
                 content = {}
@@ -306,252 +254,219 @@
             navigationMenu = getString(Strings.NavigationMenu)
         }
 
-        rule.onNodeWithTag("navigationDrawerTag", useUnmergedTree = true)
+        rule
+            .onNodeWithTag("navigationDrawerTag", useUnmergedTree = true)
             .onParent()
             .assert(SemanticsMatcher.expectValue(SemanticsProperties.PaneTitle, navigationMenu))
     }
 
     @Test
     @LargeTest
-    fun navigationDrawer_openAndClose(): Unit = runBlocking(AutoTestFrameClock()) {
-        lateinit var drawerState: DrawerState
-        rule.setMaterialContent(lightColorScheme()) {
-            drawerState = rememberDrawerState(DrawerValue.Closed)
-            ModalNavigationDrawer(
-                drawerState = drawerState,
-                drawerContent = {
-                    ModalDrawerSheet {
-                        Box(
-                            Modifier
-                                .fillMaxSize()
-                                .testTag(DrawerTestTag)
-                        )
-                    }
-                },
-                content = {}
-            )
+    fun navigationDrawer_openAndClose(): Unit =
+        runBlocking(AutoTestFrameClock()) {
+            lateinit var drawerState: DrawerState
+            rule.setMaterialContent(lightColorScheme()) {
+                drawerState = rememberDrawerState(DrawerValue.Closed)
+                ModalNavigationDrawer(
+                    drawerState = drawerState,
+                    drawerContent = {
+                        ModalDrawerSheet { Box(Modifier.fillMaxSize().testTag(DrawerTestTag)) }
+                    },
+                    content = {}
+                )
+            }
+
+            // Drawer should start in closed state
+            rule
+                .onNodeWithTag(DrawerTestTag)
+                .assertLeftPositionInRootIsEqualTo(-NavigationDrawerWidth)
+
+            // When the drawer state is set to Opened
+            drawerState.open()
+            // Then the drawer should be opened
+            rule.onNodeWithTag(DrawerTestTag).assertLeftPositionInRootIsEqualTo(0.dp)
+
+            // When the drawer state is set to Closed
+            drawerState.close()
+            // Then the drawer should be closed
+            rule
+                .onNodeWithTag(DrawerTestTag)
+                .assertLeftPositionInRootIsEqualTo(-NavigationDrawerWidth)
         }
 
-        // Drawer should start in closed state
-        rule.onNodeWithTag(DrawerTestTag).assertLeftPositionInRootIsEqualTo(-NavigationDrawerWidth)
-
-        // When the drawer state is set to Opened
-        drawerState.open()
-        // Then the drawer should be opened
-        rule.onNodeWithTag(DrawerTestTag).assertLeftPositionInRootIsEqualTo(0.dp)
-
-        // When the drawer state is set to Closed
-        drawerState.close()
-        // Then the drawer should be closed
-        rule.onNodeWithTag(DrawerTestTag).assertLeftPositionInRootIsEqualTo(-NavigationDrawerWidth)
-    }
-
     @Test
     @LargeTest
-    fun navigationDrawer_animateTo(): Unit = runBlocking(AutoTestFrameClock()) {
-        lateinit var drawerState: DrawerState
-        rule.setMaterialContent(lightColorScheme()) {
-            drawerState = rememberDrawerState(DrawerValue.Closed)
-            ModalNavigationDrawer(
-                drawerState = drawerState,
-                drawerContent = {
-                    ModalDrawerSheet {
-                        Box(
-                            Modifier
-                                .fillMaxSize()
-                                .testTag(DrawerTestTag)
-                        )
-                    }
-                },
-                content = {}
-            )
+    fun navigationDrawer_animateTo(): Unit =
+        runBlocking(AutoTestFrameClock()) {
+            lateinit var drawerState: DrawerState
+            rule.setMaterialContent(lightColorScheme()) {
+                drawerState = rememberDrawerState(DrawerValue.Closed)
+                ModalNavigationDrawer(
+                    drawerState = drawerState,
+                    drawerContent = {
+                        ModalDrawerSheet { Box(Modifier.fillMaxSize().testTag(DrawerTestTag)) }
+                    },
+                    content = {}
+                )
+            }
+
+            // Drawer should start in closed state
+            rule
+                .onNodeWithTag(DrawerTestTag)
+                .assertLeftPositionInRootIsEqualTo(-NavigationDrawerWidth)
+
+            // When the drawer state is set to Opened
+            @Suppress("DEPRECATION") // animateTo is deprecated, but we are testing it
+            drawerState.animateTo(DrawerValue.Open, TweenSpec())
+            // Then the drawer should be opened
+            rule.onNodeWithTag(DrawerTestTag).assertLeftPositionInRootIsEqualTo(0.dp)
+
+            // When the drawer state is set to Closed
+            @Suppress("DEPRECATION") // animateTo is deprecated, but we are testing it
+            drawerState.animateTo(DrawerValue.Closed, TweenSpec())
+            // Then the drawer should be closed
+            rule
+                .onNodeWithTag(DrawerTestTag)
+                .assertLeftPositionInRootIsEqualTo(-NavigationDrawerWidth)
         }
 
-        // Drawer should start in closed state
-        rule.onNodeWithTag(DrawerTestTag).assertLeftPositionInRootIsEqualTo(-NavigationDrawerWidth)
-
-        // When the drawer state is set to Opened
-        @Suppress("DEPRECATION") // animateTo is deprecated, but we are testing it
-        drawerState.animateTo(DrawerValue.Open, TweenSpec())
-        // Then the drawer should be opened
-        rule.onNodeWithTag(DrawerTestTag).assertLeftPositionInRootIsEqualTo(0.dp)
-
-        // When the drawer state is set to Closed
-        @Suppress("DEPRECATION") // animateTo is deprecated, but we are testing it
-        drawerState.animateTo(DrawerValue.Closed, TweenSpec())
-        // Then the drawer should be closed
-        rule.onNodeWithTag(DrawerTestTag).assertLeftPositionInRootIsEqualTo(-NavigationDrawerWidth)
-    }
-
     @Test
     @LargeTest
-    fun navigationDrawer_snapTo(): Unit = runBlocking(AutoTestFrameClock()) {
-        lateinit var drawerState: DrawerState
-        rule.setMaterialContent(lightColorScheme()) {
-            drawerState = rememberDrawerState(DrawerValue.Closed)
-            ModalNavigationDrawer(
-                drawerState = drawerState,
-                drawerContent = {
-                    ModalDrawerSheet {
-                        Box(
-                            Modifier
-                                .fillMaxSize()
-                                .testTag(DrawerTestTag)
-                        )
-                    }
-                },
-                content = {}
-            )
+    fun navigationDrawer_snapTo(): Unit =
+        runBlocking(AutoTestFrameClock()) {
+            lateinit var drawerState: DrawerState
+            rule.setMaterialContent(lightColorScheme()) {
+                drawerState = rememberDrawerState(DrawerValue.Closed)
+                ModalNavigationDrawer(
+                    drawerState = drawerState,
+                    drawerContent = {
+                        ModalDrawerSheet { Box(Modifier.fillMaxSize().testTag(DrawerTestTag)) }
+                    },
+                    content = {}
+                )
+            }
+
+            // Drawer should start in closed state
+            rule
+                .onNodeWithTag(DrawerTestTag)
+                .assertLeftPositionInRootIsEqualTo(-NavigationDrawerWidth)
+
+            // When the drawer state is set to Opened
+            drawerState.snapTo(DrawerValue.Open)
+            // Then the drawer should be opened
+            rule.onNodeWithTag(DrawerTestTag).assertLeftPositionInRootIsEqualTo(0.dp)
+
+            // When the drawer state is set to Closed
+            drawerState.snapTo(DrawerValue.Closed)
+            // Then the drawer should be closed
+            rule
+                .onNodeWithTag(DrawerTestTag)
+                .assertLeftPositionInRootIsEqualTo(-NavigationDrawerWidth)
         }
 
-        // Drawer should start in closed state
-        rule.onNodeWithTag(DrawerTestTag).assertLeftPositionInRootIsEqualTo(-NavigationDrawerWidth)
-
-        // When the drawer state is set to Opened
-        drawerState.snapTo(DrawerValue.Open)
-        // Then the drawer should be opened
-        rule.onNodeWithTag(DrawerTestTag).assertLeftPositionInRootIsEqualTo(0.dp)
-
-        // When the drawer state is set to Closed
-        drawerState.snapTo(DrawerValue.Closed)
-        // Then the drawer should be closed
-        rule.onNodeWithTag(DrawerTestTag).assertLeftPositionInRootIsEqualTo(-NavigationDrawerWidth)
-    }
-
     @Test
     @LargeTest
-    fun navigationDrawer_currentValue(): Unit = runBlocking(AutoTestFrameClock()) {
-        lateinit var drawerState: DrawerState
-        rule.setMaterialContent(lightColorScheme()) {
-            drawerState = rememberDrawerState(DrawerValue.Closed)
-            ModalNavigationDrawer(
-                drawerState = drawerState,
-                drawerContent = {
-                    ModalDrawerSheet {
-                        Box(
-                            Modifier
-                                .fillMaxSize()
-                                .testTag(DrawerTestTag)
-                        )
-                    }
-                },
-                content = {}
-            )
-        }
+    fun navigationDrawer_currentValue(): Unit =
+        runBlocking(AutoTestFrameClock()) {
+            lateinit var drawerState: DrawerState
+            rule.setMaterialContent(lightColorScheme()) {
+                drawerState = rememberDrawerState(DrawerValue.Closed)
+                ModalNavigationDrawer(
+                    drawerState = drawerState,
+                    drawerContent = {
+                        ModalDrawerSheet { Box(Modifier.fillMaxSize().testTag(DrawerTestTag)) }
+                    },
+                    content = {}
+                )
+            }
 
-        // Drawer should start in closed state
-        assertThat(drawerState.currentValue).isEqualTo(DrawerValue.Closed)
-
-        // When the drawer state is set to Opened
-        drawerState.snapTo(DrawerValue.Open)
-        // Then the drawer should be opened
-        rule.runOnIdle {
-            assertThat(drawerState.currentValue).isEqualTo(DrawerValue.Open)
-        }
-
-        // When the drawer state is set to Closed
-        drawerState.snapTo(DrawerValue.Closed)
-        // Then the drawer should be closed
-        rule.runOnIdle {
+            // Drawer should start in closed state
             assertThat(drawerState.currentValue).isEqualTo(DrawerValue.Closed)
+
+            // When the drawer state is set to Opened
+            drawerState.snapTo(DrawerValue.Open)
+            // Then the drawer should be opened
+            rule.runOnIdle { assertThat(drawerState.currentValue).isEqualTo(DrawerValue.Open) }
+
+            // When the drawer state is set to Closed
+            drawerState.snapTo(DrawerValue.Closed)
+            // Then the drawer should be closed
+            rule.runOnIdle { assertThat(drawerState.currentValue).isEqualTo(DrawerValue.Closed) }
         }
-    }
 
     @Test
     @LargeTest
-    fun navigationDrawer_bodyContent_clickable(): Unit = runBlocking(AutoTestFrameClock()) {
-        var drawerClicks = 0
-        var bodyClicks = 0
-        lateinit var drawerState: DrawerState
-        rule.setMaterialContent(lightColorScheme()) {
-            drawerState = rememberDrawerState(DrawerValue.Closed)
-            // emulate click on the screen
-            ModalNavigationDrawer(
-                drawerState = drawerState,
-                drawerContent = {
-                    ModalDrawerSheet {
+    fun navigationDrawer_bodyContent_clickable(): Unit =
+        runBlocking(AutoTestFrameClock()) {
+            var drawerClicks = 0
+            var bodyClicks = 0
+            lateinit var drawerState: DrawerState
+            rule.setMaterialContent(lightColorScheme()) {
+                drawerState = rememberDrawerState(DrawerValue.Closed)
+                // emulate click on the screen
+                ModalNavigationDrawer(
+                    drawerState = drawerState,
+                    drawerContent = {
+                        ModalDrawerSheet {
+                            Box(Modifier.fillMaxSize().clickable { drawerClicks += 1 })
+                        }
+                    },
+                    content = {
                         Box(
-                            Modifier
-                                .fillMaxSize()
-                                .clickable { drawerClicks += 1 })
-                    }
-                },
-                content = {
-                    Box(
-                        Modifier
-                            .testTag(DrawerTestTag)
-                            .fillMaxSize()
-                            .clickable { bodyClicks += 1 })
-                }
-            )
-        }
-
-        // Click in the middle of the drawer (which is the middle of the body)
-        rule.onNodeWithTag(DrawerTestTag).performTouchInput { click() }
-
-        rule.runOnIdle {
-            assertThat(drawerClicks).isEqualTo(0)
-            assertThat(bodyClicks).isEqualTo(1)
-        }
-        drawerState.open()
-
-        // Click on the left-center pixel of the drawer
-        rule.onNodeWithTag(DrawerTestTag).performTouchInput {
-            click(centerLeft)
-        }
-
-        rule.runOnIdle {
-            assertThat(drawerClicks).isEqualTo(1)
-            assertThat(bodyClicks).isEqualTo(1)
-        }
-    }
-
-    @Test
-    @LargeTest
-    fun navigationDrawer_drawerContent_doesntPropagateClicksWhenOpen(): Unit = runBlocking(
-        AutoTestFrameClock()
-    ) {
-        var bodyClicks = 0
-        lateinit var drawerState: DrawerState
-        rule.setMaterialContent(lightColorScheme()) {
-            drawerState = rememberDrawerState(DrawerValue.Closed)
-            ModalNavigationDrawer(
-                drawerState = drawerState,
-                drawerContent = {
-                    ModalDrawerSheet {
-                        Box(
-                            Modifier
-                                .fillMaxSize()
-                                .testTag(DrawerTestTag)
+                            Modifier.testTag(DrawerTestTag).fillMaxSize().clickable {
+                                bodyClicks += 1
+                            }
                         )
                     }
-                },
-                content = {
-                    Box(
-                        Modifier
-                            .fillMaxSize()
-                            .clickable { bodyClicks += 1 })
-                }
-            )
+                )
+            }
+
+            // Click in the middle of the drawer (which is the middle of the body)
+            rule.onNodeWithTag(DrawerTestTag).performTouchInput { click() }
+
+            rule.runOnIdle {
+                assertThat(drawerClicks).isEqualTo(0)
+                assertThat(bodyClicks).isEqualTo(1)
+            }
+            drawerState.open()
+
+            // Click on the left-center pixel of the drawer
+            rule.onNodeWithTag(DrawerTestTag).performTouchInput { click(centerLeft) }
+
+            rule.runOnIdle {
+                assertThat(drawerClicks).isEqualTo(1)
+                assertThat(bodyClicks).isEqualTo(1)
+            }
         }
 
-        // Click in the middle of the drawer
-        rule.onNodeWithTag(DrawerTestTag).performClick()
+    @Test
+    @LargeTest
+    fun navigationDrawer_drawerContent_doesntPropagateClicksWhenOpen(): Unit =
+        runBlocking(AutoTestFrameClock()) {
+            var bodyClicks = 0
+            lateinit var drawerState: DrawerState
+            rule.setMaterialContent(lightColorScheme()) {
+                drawerState = rememberDrawerState(DrawerValue.Closed)
+                ModalNavigationDrawer(
+                    drawerState = drawerState,
+                    drawerContent = {
+                        ModalDrawerSheet { Box(Modifier.fillMaxSize().testTag(DrawerTestTag)) }
+                    },
+                    content = { Box(Modifier.fillMaxSize().clickable { bodyClicks += 1 }) }
+                )
+            }
 
-        rule.runOnIdle {
-            assertThat(bodyClicks).isEqualTo(1)
-        }
-        drawerState.open()
+            // Click in the middle of the drawer
+            rule.onNodeWithTag(DrawerTestTag).performClick()
 
-        // Click on the left-center pixel of the drawer
-        rule.onNodeWithTag(DrawerTestTag).performTouchInput {
-            click(centerLeft)
-        }
+            rule.runOnIdle { assertThat(bodyClicks).isEqualTo(1) }
+            drawerState.open()
 
-        rule.runOnIdle {
-            assertThat(bodyClicks).isEqualTo(1)
+            // Click on the left-center pixel of the drawer
+            rule.onNodeWithTag(DrawerTestTag).performTouchInput { click(centerLeft) }
+
+            rule.runOnIdle { assertThat(bodyClicks).isEqualTo(1) }
         }
-    }
 
     @Test
     @LargeTest
@@ -564,37 +479,21 @@
                     drawerState = drawerState,
                     drawerContent = {
                         ModalDrawerSheet {
-                            Box(
-                                Modifier
-                                    .fillMaxSize()
-                                    .background(color = Color.Magenta)
-                            )
+                            Box(Modifier.fillMaxSize().background(color = Color.Magenta))
                         }
                     },
-                    content = {
-                        Box(
-                            Modifier
-                                .fillMaxSize()
-                                .background(color = Color.Red)
-                        )
-                    }
+                    content = { Box(Modifier.fillMaxSize().background(color = Color.Red)) }
                 )
             }
         }
 
-        rule.onNodeWithTag(DrawerTestTag)
-            .performTouchInput { swipeRight() }
+        rule.onNodeWithTag(DrawerTestTag).performTouchInput { swipeRight() }
 
-        rule.runOnIdle {
-            assertThat(drawerState.currentValue).isEqualTo(DrawerValue.Open)
-        }
+        rule.runOnIdle { assertThat(drawerState.currentValue).isEqualTo(DrawerValue.Open) }
 
-        rule.onNodeWithTag(DrawerTestTag)
-            .performTouchInput { swipeLeft() }
+        rule.onNodeWithTag(DrawerTestTag).performTouchInput { swipeLeft() }
 
-        rule.runOnIdle {
-            assertThat(drawerState.currentValue).isEqualTo(DrawerValue.Closed)
-        }
+        rule.runOnIdle { assertThat(drawerState.currentValue).isEqualTo(DrawerValue.Closed) }
     }
 
     @Test
@@ -602,50 +501,35 @@
     fun navigationDrawer_confirmStateChangeRespect() {
         lateinit var drawerState: DrawerState
         rule.setMaterialContent(lightColorScheme()) {
-            drawerState = rememberDrawerState(
-                DrawerValue.Open,
-                confirmStateChange = {
-                    it != DrawerValue.Closed
-                }
-            )
+            drawerState =
+                rememberDrawerState(
+                    DrawerValue.Open,
+                    confirmStateChange = { it != DrawerValue.Closed }
+                )
             Box(Modifier.testTag(DrawerTestTag)) {
                 ModalNavigationDrawer(
                     drawerState = drawerState,
                     drawerContent = {
                         ModalDrawerSheet(Modifier.testTag("content")) {
-                            Box(
-                                Modifier
-                                    .fillMaxSize()
-                                    .background(color = Color.Magenta)
-                            )
+                            Box(Modifier.fillMaxSize().background(color = Color.Magenta))
                         }
                     },
-                    content = {
-                        Box(
-                            Modifier
-                                .fillMaxSize()
-                                .background(color = Color.Red)
-                        )
-                    }
+                    content = { Box(Modifier.fillMaxSize().background(color = Color.Red)) }
                 )
             }
         }
 
-        rule.onNodeWithTag(DrawerTestTag)
-            .performTouchInput { swipeLeft() }
+        rule.onNodeWithTag(DrawerTestTag).performTouchInput { swipeLeft() }
 
         // still open
-        rule.runOnIdle {
-            assertThat(drawerState.currentValue).isEqualTo(DrawerValue.Open)
-        }
+        rule.runOnIdle { assertThat(drawerState.currentValue).isEqualTo(DrawerValue.Open) }
 
-        rule.onNodeWithTag("content", useUnmergedTree = true)
+        rule
+            .onNodeWithTag("content", useUnmergedTree = true)
             .onParent()
             .performSemanticsAction(SemanticsActions.Dismiss)
 
-        rule.runOnIdle {
-            assertThat(drawerState.currentValue).isEqualTo(DrawerValue.Open)
-        }
+        rule.runOnIdle { assertThat(drawerState.currentValue).isEqualTo(DrawerValue.Open) }
     }
 
     @Test
@@ -661,84 +545,68 @@
                         drawerState = drawerState,
                         drawerContent = {
                             ModalDrawerSheet {
-                                Box(
-                                    Modifier
-                                        .fillMaxSize()
-                                        .background(color = Color.Magenta)
-                                )
+                                Box(Modifier.fillMaxSize().background(color = Color.Magenta))
                             }
                         },
-                        content = {
-                            Box(
-                                Modifier
-                                    .fillMaxSize()
-                                    .background(color = Color.Red)
-                            )
-                        }
+                        content = { Box(Modifier.fillMaxSize().background(color = Color.Red)) }
                     )
                 }
             }
         }
 
-        rule.onNodeWithTag(DrawerTestTag)
-            .performTouchInput { swipeLeft() }
+        rule.onNodeWithTag(DrawerTestTag).performTouchInput { swipeLeft() }
 
-        rule.runOnIdle {
-            assertThat(drawerState.currentValue).isEqualTo(DrawerValue.Open)
-        }
+        rule.runOnIdle { assertThat(drawerState.currentValue).isEqualTo(DrawerValue.Open) }
 
-        rule.onNodeWithTag(DrawerTestTag)
-            .performTouchInput { swipeRight() }
+        rule.onNodeWithTag(DrawerTestTag).performTouchInput { swipeRight() }
 
-        rule.runOnIdle {
-            assertThat(drawerState.currentValue).isEqualTo(DrawerValue.Closed)
-        }
+        rule.runOnIdle { assertThat(drawerState.currentValue).isEqualTo(DrawerValue.Closed) }
     }
 
     @Test
     @LargeTest
-    fun navigationDrawer_noDismissActionWhenClosed_hasDismissActionWhenOpen(): Unit = runBlocking(
-        AutoTestFrameClock()
-    ) {
-        lateinit var drawerState: DrawerState
-        rule.setMaterialContent(lightColorScheme()) {
-            drawerState = rememberDrawerState(DrawerValue.Closed)
-            ModalNavigationDrawer(
-                drawerState = drawerState,
-                drawerContent = {
-                    ModalDrawerSheet(Modifier.testTag(DrawerTestTag)) {
-                        Box(
-                            Modifier
-                                .fillMaxSize()
-                        )
-                    }
-                },
-                content = {}
-            )
+    fun navigationDrawer_noDismissActionWhenClosed_hasDismissActionWhenOpen(): Unit =
+        runBlocking(AutoTestFrameClock()) {
+            lateinit var drawerState: DrawerState
+            rule.setMaterialContent(lightColorScheme()) {
+                drawerState = rememberDrawerState(DrawerValue.Closed)
+                ModalNavigationDrawer(
+                    drawerState = drawerState,
+                    drawerContent = {
+                        ModalDrawerSheet(Modifier.testTag(DrawerTestTag)) {
+                            Box(Modifier.fillMaxSize())
+                        }
+                    },
+                    content = {}
+                )
+            }
+
+            // Drawer should start in closed state and have no dismiss action
+            rule
+                .onNodeWithTag(DrawerTestTag, useUnmergedTree = true)
+                .onParent()
+                .assert(SemanticsMatcher.keyNotDefined(SemanticsActions.Dismiss))
+
+            // When the drawer state is set to Opened
+            drawerState.open()
+            // Then the drawer should be opened and have dismiss action
+            rule
+                .onNodeWithTag(DrawerTestTag, useUnmergedTree = true)
+                .onParent()
+                .assert(SemanticsMatcher.keyIsDefined(SemanticsActions.Dismiss))
+
+            // When the drawer state is set to Closed using dismiss action
+            rule
+                .onNodeWithTag(DrawerTestTag, useUnmergedTree = true)
+                .onParent()
+                .performSemanticsAction(SemanticsActions.Dismiss)
+            // Then the drawer should be closed and have no dismiss action
+            rule
+                .onNodeWithTag(DrawerTestTag, useUnmergedTree = true)
+                .onParent()
+                .assert(SemanticsMatcher.keyNotDefined(SemanticsActions.Dismiss))
         }
 
-        // Drawer should start in closed state and have no dismiss action
-        rule.onNodeWithTag(DrawerTestTag, useUnmergedTree = true)
-            .onParent()
-            .assert(SemanticsMatcher.keyNotDefined(SemanticsActions.Dismiss))
-
-        // When the drawer state is set to Opened
-        drawerState.open()
-        // Then the drawer should be opened and have dismiss action
-        rule.onNodeWithTag(DrawerTestTag, useUnmergedTree = true)
-            .onParent()
-            .assert(SemanticsMatcher.keyIsDefined(SemanticsActions.Dismiss))
-
-        // When the drawer state is set to Closed using dismiss action
-        rule.onNodeWithTag(DrawerTestTag, useUnmergedTree = true)
-            .onParent()
-            .performSemanticsAction(SemanticsActions.Dismiss)
-        // Then the drawer should be closed and have no dismiss action
-        rule.onNodeWithTag(DrawerTestTag, useUnmergedTree = true)
-            .onParent()
-            .assert(SemanticsMatcher.keyNotDefined(SemanticsActions.Dismiss))
-    }
-
     @Test
     fun navigationDrawer_scrimNode_reportToSemanticsWhenOpen_notReportToSemanticsWhenClosed() {
         val topTag = "navigationDrawer"
@@ -748,21 +616,9 @@
                 modifier = Modifier.testTag(topTag),
                 drawerState = rememberDrawerState(DrawerValue.Open),
                 drawerContent = {
-                    ModalDrawerSheet {
-                        Box(
-                            Modifier
-                                .fillMaxSize()
-                                .testTag(DrawerTestTag)
-                        )
-                    }
+                    ModalDrawerSheet { Box(Modifier.fillMaxSize().testTag(DrawerTestTag)) }
                 },
-                content = {
-                    Box(
-                        Modifier
-                            .fillMaxSize()
-                            .testTag("body")
-                    )
-                }
+                content = { Box(Modifier.fillMaxSize().testTag("body")) }
             )
             closeDrawer = getString(Strings.CloseDrawer)
         }
@@ -772,7 +628,8 @@
 
         var topNode = rule.onNodeWithTag(topTag).fetchSemanticsNode()
         assertEquals(3, topNode.children.size)
-        rule.onNodeWithContentDescription(closeDrawer)
+        rule
+            .onNodeWithContentDescription(closeDrawer)
             .assertHasClickAction()
             .performSemanticsAction(SemanticsActions.OnClick)
 
@@ -790,23 +647,21 @@
             navDrawerPaneTitle = getString(Strings.NavigationMenu)
             ModalNavigationDrawer(
                 drawerState = rememberDrawerState(DrawerValue.Closed),
-                drawerContent = {
-                    ModalDrawerSheet {
-                        Box(Modifier.fillMaxSize())
-                    }
-                },
-                content = {
-                    Box(Modifier.fillMaxSize())
-                }
+                drawerContent = { ModalDrawerSheet { Box(Modifier.fillMaxSize()) } },
+                content = { Box(Modifier.fillMaxSize()) }
             )
         }
 
         // This matcher returns the container of `ModalDrawerSheet`, not `ModalDrawerSheet` itself
-        rule.onNode(
-            SemanticsMatcher("drawer pane") {
-                it.config.getOrNull(SemanticsProperties.PaneTitle) == navDrawerPaneTitle
-            }
-        ).getUnclippedBoundsInRoot().left.assertIsEqualTo(-NavigationDrawerWidth)
+        rule
+            .onNode(
+                SemanticsMatcher("drawer pane") {
+                    it.config.getOrNull(SemanticsProperties.PaneTitle) == navDrawerPaneTitle
+                }
+            )
+            .getUnclippedBoundsInRoot()
+            .left
+            .assertIsEqualTo(-NavigationDrawerWidth)
     }
 }
 
diff --git a/compose/material3/material3/src/androidInstrumentedTest/kotlin/androidx/compose/material3/NavigationBarScreenshotTest.kt b/compose/material3/material3/src/androidInstrumentedTest/kotlin/androidx/compose/material3/NavigationBarScreenshotTest.kt
index ed2b818..13db85c 100644
--- a/compose/material3/material3/src/androidInstrumentedTest/kotlin/androidx/compose/material3/NavigationBarScreenshotTest.kt
+++ b/compose/material3/material3/src/androidInstrumentedTest/kotlin/androidx/compose/material3/NavigationBarScreenshotTest.kt
@@ -52,11 +52,9 @@
 @SdkSuppress(minSdkVersion = Build.VERSION_CODES.O)
 class NavigationBarScreenshotTest {
 
-    @get:Rule
-    val composeTestRule = createComposeRule()
+    @get:Rule val composeTestRule = createComposeRule()
 
-    @get:Rule
-    val screenshotRule = AndroidXScreenshotTestRule(GOLDEN_MATERIAL3)
+    @get:Rule val screenshotRule = AndroidXScreenshotTestRule(GOLDEN_MATERIAL3)
 
     @Test
     fun lightTheme_defaultColors() {
@@ -204,9 +202,8 @@
                         selected = true,
                         onClick = {},
                         icon = { Icon(Icons.Filled.Home, contentDescription = null) },
-                        colors = NavigationBarItemDefaults.colors(
-                            indicatorColor = Color.Transparent
-                        )
+                        colors =
+                            NavigationBarItemDefaults.colors(indicatorColor = Color.Transparent)
                     )
                 }
             }
@@ -225,7 +222,7 @@
      *
      * @param scope [CoroutineScope] used to interact with [MutableInteractionSource]
      * @param interactionSource the [MutableInteractionSource] used for the first
-     * [NavigationBarItem]
+     *   [NavigationBarItem]
      * @param interaction the [Interaction] to assert for, or `null` if no [Interaction].
      * @param goldenIdentifier the identifier for the corresponding screenshot
      */
@@ -238,9 +235,7 @@
         if (interaction != null) {
             composeTestRule.runOnIdle {
                 // Start ripple
-                scope.launch {
-                    interactionSource.emit(interaction)
-                }
+                scope.launch { interactionSource.emit(interaction) }
             }
 
             composeTestRule.waitForIdle()
@@ -251,18 +246,19 @@
         }
 
         // Capture and compare screenshots
-        composeTestRule.onNodeWithTag(Tag)
+        composeTestRule
+            .onNodeWithTag(Tag)
             .captureToImage()
             .assertAgainstGolden(screenshotRule, goldenIdentifier)
     }
 }
 
 /**
- * Default colored [NavigationBar] with three [NavigationBarItem]s. The first
- * [NavigationBarItem] is selected, and the rest are not.
+ * Default colored [NavigationBar] with three [NavigationBarItem]s. The first [NavigationBarItem] is
+ * selected, and the rest are not.
  *
  * @param interactionSource the [MutableInteractionSource] for the first [NavigationBarItem], to
- * control its visual state.
+ *   control its visual state.
  * @param modifier the [Modifier] applied to the navigation bar
  * @param setUnselectedItemsAsDisabled when true, marks unselected items as disabled
  */
diff --git a/compose/material3/material3/src/androidInstrumentedTest/kotlin/androidx/compose/material3/NavigationBarTest.kt b/compose/material3/material3/src/androidInstrumentedTest/kotlin/androidx/compose/material3/NavigationBarTest.kt
index 0eb695c..de88ed2 100644
--- a/compose/material3/material3/src/androidInstrumentedTest/kotlin/androidx/compose/material3/NavigationBarTest.kt
+++ b/compose/material3/material3/src/androidInstrumentedTest/kotlin/androidx/compose/material3/NavigationBarTest.kt
@@ -70,12 +70,9 @@
 
 @LargeTest
 @RunWith(AndroidJUnit4::class)
-/**
- * Test for [NavigationBar] and [NavigationBarItem].
- */
+/** Test for [NavigationBar] and [NavigationBarItem]. */
 class NavigationBarTest {
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
     @Test
     fun defaultSemantics() {
@@ -83,25 +80,23 @@
             NavigationBar {
                 NavigationBarItem(
                     modifier = Modifier.testTag("item"),
-                    icon = {
-                        Icon(Icons.Filled.Favorite, null)
-                    },
-                    label = {
-                        Text("ItemText")
-                    },
+                    icon = { Icon(Icons.Filled.Favorite, null) },
+                    label = { Text("ItemText") },
                     selected = true,
                     onClick = {}
                 )
             }
         }
 
-        rule.onNodeWithTag("item")
+        rule
+            .onNodeWithTag("item")
             .assert(SemanticsMatcher.expectValue(SemanticsProperties.Role, Role.Tab))
             .assertIsSelected()
             .assertIsEnabled()
             .assertHasClickAction()
 
-        rule.onNodeWithTag("item")
+        rule
+            .onNodeWithTag("item")
             .onParent()
             .assert(SemanticsMatcher.keyIsDefined(SemanticsProperties.SelectableGroup))
     }
@@ -113,19 +108,16 @@
                 NavigationBarItem(
                     enabled = false,
                     modifier = Modifier.testTag("item"),
-                    icon = {
-                        Icon(Icons.Filled.Favorite, null)
-                    },
-                    label = {
-                        Text("ItemText")
-                    },
+                    icon = { Icon(Icons.Filled.Favorite, null) },
+                    label = { Text("ItemText") },
                     selected = true,
                     onClick = {}
                 )
             }
         }
 
-        rule.onNodeWithTag("item")
+        rule
+            .onNodeWithTag("item")
             .assert(SemanticsMatcher.expectValue(SemanticsProperties.Role, Role.Tab))
             .assertIsSelected()
             .assertIsNotEnabled()
@@ -138,33 +130,23 @@
             NavigationBar {
                 NavigationBarItem(
                     modifier = Modifier.testTag("item1"),
-                    icon = {
-                        Icon(Icons.Filled.Favorite, "Favorite")
-                    },
-                    label = {
-                        Text("Favorite")
-                    },
+                    icon = { Icon(Icons.Filled.Favorite, "Favorite") },
+                    label = { Text("Favorite") },
                     selected = true,
                     alwaysShowLabel = false,
                     onClick = {}
                 )
                 NavigationBarItem(
                     modifier = Modifier.testTag("item2"),
-                    icon = {
-                        Icon(Icons.Filled.Favorite, "Favorite")
-                    },
-                    label = {
-                        Text("Favorite")
-                    },
+                    icon = { Icon(Icons.Filled.Favorite, "Favorite") },
+                    label = { Text("Favorite") },
                     selected = false,
                     alwaysShowLabel = false,
                     onClick = {}
                 )
                 NavigationBarItem(
                     modifier = Modifier.testTag("item3"),
-                    icon = {
-                        Icon(Icons.Filled.Favorite, "Favorite")
-                    },
+                    icon = { Icon(Icons.Filled.Favorite, "Favorite") },
                     selected = false,
                     onClick = {}
                 )
@@ -185,19 +167,20 @@
     @Test
     fun navigationBar_size() {
         val height = NavigationBarTokens.ContainerHeight
-        rule.setMaterialContentForSizeAssertions {
-            val items = listOf("Songs", "Artists", "Playlists")
-            NavigationBar {
-                items.forEachIndexed { index, item ->
-                    NavigationBarItem(
-                        icon = { Icon(Icons.Filled.Favorite, contentDescription = null) },
-                        label = { Text(item) },
-                        selected = index == 0,
-                        onClick = { /* do something */ }
-                    )
+        rule
+            .setMaterialContentForSizeAssertions {
+                val items = listOf("Songs", "Artists", "Playlists")
+                NavigationBar {
+                    items.forEachIndexed { index, item ->
+                        NavigationBarItem(
+                            icon = { Icon(Icons.Filled.Favorite, contentDescription = null) },
+                            label = { Text(item) },
+                            selected = index == 0,
+                            onClick = { /* do something */ }
+                        )
+                    }
                 }
             }
-        }
             .assertWidthIsEqualTo(rule.rootWidth())
             .assertHeightIsEqualTo(height)
     }
@@ -206,14 +189,11 @@
     fun navigationBar_respectContentPadding() {
         rule.setMaterialContentForSizeAssertions {
             NavigationBar(windowInsets = WindowInsets(17.dp, 17.dp, 17.dp, 17.dp)) {
-                Box(
-                    Modifier
-                        .fillMaxSize()
-                        .testTag("content")
-                )
+                Box(Modifier.fillMaxSize().testTag("content"))
             }
         }
-        rule.onNodeWithTag("content")
+        rule
+            .onNodeWithTag("content")
             .assertLeftPositionInRootIsEqualTo(17.dp)
             .assertTopPositionInRootIsEqualTo(17.dp)
     }
@@ -224,9 +204,7 @@
         val itemCoords = mutableMapOf<Int, LayoutCoordinates>()
         rule.setMaterialContent(
             lightColorScheme(),
-            Modifier.onGloballyPositioned { coords: LayoutCoordinates ->
-                parentCoords = coords
-            }
+            Modifier.onGloballyPositioned { coords: LayoutCoordinates -> parentCoords = coords }
         ) {
             Box {
                 NavigationBar {
@@ -236,9 +214,10 @@
                             label = { Text("Item $index") },
                             selected = index == 0,
                             onClick = {},
-                            modifier = Modifier.onGloballyPositioned { coords ->
-                                itemCoords[index] = coords
-                            }
+                            modifier =
+                                Modifier.onGloballyPositioned { coords ->
+                                    itemCoords[index] = coords
+                                }
                         )
                     }
                 }
@@ -259,7 +238,8 @@
                 // Rounding differences for width can occur on smaller screens
                 assertThat(coord.size.width.toFloat()).isWithin(1f).of(expectedItemWidth)
                 assertThat(coord.size.height.toFloat()).isWithin(1f).of(expectedItemHeight)
-                assertThat(coord.positionInWindow().x).isWithin(1f)
+                assertThat(coord.positionInWindow().x)
+                    .isWithin(1f)
                     .of((expectedItemWidth + NavigationBarItemHorizontalPadding.toPx()) * index)
             }
         }
@@ -300,18 +280,16 @@
     @Test
     fun navigationBarItem_customColors() {
         rule.setMaterialContent(lightColorScheme()) {
-            val customNavigationBarItemColors = NavigationBarItemDefaults.colors(
-                selectedIconColor = Color.Red,
-                unselectedTextColor = Color.Green,
-            )
+            val customNavigationBarItemColors =
+                NavigationBarItemDefaults.colors(
+                    selectedIconColor = Color.Red,
+                    unselectedTextColor = Color.Green,
+                )
 
             NavigationBar {
                 NavigationBarItem(
                     colors = customNavigationBarItemColors,
-                    icon = {
-                        assertThat(LocalContentColor.current)
-                            .isEqualTo(Color.Red)
-                    },
+                    icon = { assertThat(LocalContentColor.current).isEqualTo(Color.Red) },
                     label = {
                         assertThat(LocalContentColor.current)
                             .isEqualTo(NavigationBarTokens.ActiveLabelTextColor.value)
@@ -325,10 +303,7 @@
                         assertThat(LocalContentColor.current)
                             .isEqualTo(NavigationBarTokens.InactiveIconColor.value)
                     },
-                    label = {
-                        assertThat(LocalContentColor.current)
-                            .isEqualTo(Color.Green)
-                    },
+                    label = { assertThat(LocalContentColor.current).isEqualTo(Color.Green) },
                     selected = false,
                     onClick = {}
                 )
@@ -363,12 +338,8 @@
             NavigationBar {
                 NavigationBarItem(
                     modifier = Modifier.testTag("item"),
-                    icon = {
-                        Icon(Icons.Filled.Favorite, null, Modifier.testTag("icon"))
-                    },
-                    label = {
-                        Text("ItemText")
-                    },
+                    icon = { Icon(Icons.Filled.Favorite, null, Modifier.testTag("icon")) },
+                    label = { Text("ItemText") },
                     selected = true,
                     onClick = {}
                 )
@@ -376,13 +347,14 @@
         }
 
         val itemBounds = rule.onNodeWithTag("item").getUnclippedBoundsInRoot()
-        val iconBounds = rule.onNodeWithTag("icon", useUnmergedTree = true)
-            .getUnclippedBoundsInRoot()
+        val iconBounds =
+            rule.onNodeWithTag("icon", useUnmergedTree = true).getUnclippedBoundsInRoot()
 
         // Distance from the top of the item to the top of the icon for the default height
         val verticalPadding = 16.dp
 
-        rule.onNodeWithTag("icon", useUnmergedTree = true)
+        rule
+            .onNodeWithTag("icon", useUnmergedTree = true)
             // The icon should be horizontally centered in the item
             .assertLeftPositionInRootIsEqualTo((itemBounds.width - iconBounds.width) / 2)
             // The top of the icon is `verticalPadding` below the top of the item
@@ -391,7 +363,8 @@
         val iconBottom = iconBounds.top + iconBounds.height
         // Text should be `IndicatorVerticalPadding + NavigationBarIndicatorToLabelPadding` from the
         // bottom of the icon
-        rule.onNodeWithText("ItemText", useUnmergedTree = true)
+        rule
+            .onNodeWithText("ItemText", useUnmergedTree = true)
             .getUnclippedBoundsInRoot()
             .top
             .assertIsEqualTo(
@@ -406,12 +379,8 @@
                 NavigationBar {
                     NavigationBarItem(
                         modifier = Modifier.testTag("item"),
-                        icon = {
-                            Icon(Icons.Filled.Favorite, null, Modifier.testTag("icon"))
-                        },
-                        label = {
-                            Text("ItemText")
-                        },
+                        icon = { Icon(Icons.Filled.Favorite, null, Modifier.testTag("icon")) },
+                        label = { Text("ItemText") },
                         selected = false,
                         onClick = {},
                         alwaysShowLabel = false
@@ -425,10 +394,11 @@
         rule.onNodeWithText("ItemText", useUnmergedTree = true).assertIsNotDisplayed()
 
         val itemBounds = rule.onNodeWithTag("item").getUnclippedBoundsInRoot()
-        val iconBounds = rule.onNodeWithTag("icon", useUnmergedTree = true)
-            .getUnclippedBoundsInRoot()
+        val iconBounds =
+            rule.onNodeWithTag("icon", useUnmergedTree = true).getUnclippedBoundsInRoot()
 
-        rule.onNodeWithTag("icon", useUnmergedTree = true)
+        rule
+            .onNodeWithTag("icon", useUnmergedTree = true)
             .assertLeftPositionInRootIsEqualTo((itemBounds.width - iconBounds.width) / 2)
             .assertTopPositionInRootIsEqualTo((itemBounds.height - iconBounds.height) / 2)
     }
@@ -440,9 +410,7 @@
                 NavigationBar {
                     NavigationBarItem(
                         modifier = Modifier.testTag("item"),
-                        icon = {
-                            Icon(Icons.Filled.Favorite, null, Modifier.testTag("icon"))
-                        },
+                        icon = { Icon(Icons.Filled.Favorite, null, Modifier.testTag("icon")) },
                         label = null,
                         selected = false,
                         onClick = {}
@@ -452,11 +420,12 @@
         }
 
         val itemBounds = rule.onNodeWithTag("item").getUnclippedBoundsInRoot()
-        val iconBounds = rule.onNodeWithTag("icon", useUnmergedTree = true)
-            .getUnclippedBoundsInRoot()
+        val iconBounds =
+            rule.onNodeWithTag("icon", useUnmergedTree = true).getUnclippedBoundsInRoot()
 
         // The icon should be centered in the item, as there is no text placeable provided
-        rule.onNodeWithTag("icon", useUnmergedTree = true)
+        rule
+            .onNodeWithTag("icon", useUnmergedTree = true)
             .assertLeftPositionInRootIsEqualTo((itemBounds.width - iconBounds.width) / 2)
             .assertTopPositionInRootIsEqualTo((itemBounds.height - iconBounds.height) / 2)
     }
@@ -470,9 +439,7 @@
             NavigationBar(Modifier.height(customHeight)) {
                 NavigationBarItem(
                     modifier = Modifier.testTag("item"),
-                    icon = {
-                        Icon(Icons.Filled.Favorite, null, Modifier.testTag("icon"))
-                    },
+                    icon = { Icon(Icons.Filled.Favorite, null, Modifier.testTag("icon")) },
                     label = { Text("Label") },
                     selected = true,
                     onClick = {}
@@ -484,10 +451,11 @@
         val verticalPadding = 16.dp - (defaultHeight - customHeight) / 2
 
         val itemBounds = rule.onNodeWithTag("item").getUnclippedBoundsInRoot()
-        val iconBounds = rule.onNodeWithTag("icon", useUnmergedTree = true)
-            .getUnclippedBoundsInRoot()
+        val iconBounds =
+            rule.onNodeWithTag("icon", useUnmergedTree = true).getUnclippedBoundsInRoot()
 
-        rule.onNodeWithTag("icon", useUnmergedTree = true)
+        rule
+            .onNodeWithTag("icon", useUnmergedTree = true)
             // The icon should be horizontally centered in the item
             .assertLeftPositionInRootIsEqualTo((itemBounds.width - iconBounds.width) / 2)
             // The top of the icon is `verticalPadding` below the top of the item
@@ -496,7 +464,8 @@
         val iconBottom = iconBounds.top + iconBounds.height
         // Text should be `IndicatorVerticalPadding + NavigationBarIndicatorToLabelPadding` from the
         // bottom of the item
-        rule.onNodeWithText("Label", useUnmergedTree = true)
+        rule
+            .onNodeWithText("Label", useUnmergedTree = true)
             .getUnclippedBoundsInRoot()
             .top
             .assertIsEqualTo(
@@ -523,7 +492,8 @@
         }
 
         // Find all items and ensure there are 3
-        rule.onAllNodes(isSelectable())
+        rule
+            .onAllNodes(isSelectable())
             .assertCountEquals(3)
             // Ensure semantics match for selected state of the items
             .apply {
@@ -532,9 +502,7 @@
                 get(2).assertIsNotSelected()
             }
             // Click the last item
-            .apply {
-                get(2).performClick()
-            }
+            .apply { get(2).performClick() }
             .apply {
                 get(0).assertIsNotSelected()
                 get(1).assertIsNotSelected()
@@ -550,23 +518,16 @@
                 NavigationBarItem(
                     enabled = false,
                     modifier = Modifier.testTag("item"),
-                    icon = {
-                        Icon(Icons.Filled.Favorite, null)
-                    },
-                    label = {
-                        Text("ItemText")
-                    },
+                    icon = { Icon(Icons.Filled.Favorite, null) },
+                    label = { Text("ItemText") },
                     selected = true,
                     onClick = { clicks++ }
                 )
             }
         }
 
-        rule.onNodeWithTag("item")
-            .performClick()
+        rule.onNodeWithTag("item").performClick()
 
-        rule.runOnIdle {
-            Truth.assertThat(clicks).isEqualTo(0)
-        }
+        rule.runOnIdle { Truth.assertThat(clicks).isEqualTo(0) }
     }
 }
diff --git a/compose/material3/material3/src/androidInstrumentedTest/kotlin/androidx/compose/material3/NavigationDrawerItemScreenshotTest.kt b/compose/material3/material3/src/androidInstrumentedTest/kotlin/androidx/compose/material3/NavigationDrawerItemScreenshotTest.kt
index 97ceec8..81c7be8 100644
--- a/compose/material3/material3/src/androidInstrumentedTest/kotlin/androidx/compose/material3/NavigationDrawerItemScreenshotTest.kt
+++ b/compose/material3/material3/src/androidInstrumentedTest/kotlin/androidx/compose/material3/NavigationDrawerItemScreenshotTest.kt
@@ -49,11 +49,9 @@
 @SdkSuppress(minSdkVersion = Build.VERSION_CODES.O)
 @OptIn(ExperimentalMaterial3Api::class)
 class NavigationDrawerItemScreenshotTest {
-    @get:Rule
-    val composeTestRule = createComposeRule()
+    @get:Rule val composeTestRule = createComposeRule()
 
-    @get:Rule
-    val screenshotRule = AndroidXScreenshotTestRule(GOLDEN_MATERIAL3)
+    @get:Rule val screenshotRule = AndroidXScreenshotTestRule(GOLDEN_MATERIAL3)
 
     @Test
     fun lightTheme_defaultColors() {
@@ -137,7 +135,7 @@
      *
      * @param scope [CoroutineScope] used to interact with [MutableInteractionSource]
      * @param interactionSource the [MutableInteractionSource] used for the first
-     * [NavigationDrawerItem]
+     *   [NavigationDrawerItem]
      * @param interaction the [Interaction] to assert for, or `null` if no [Interaction].
      * @param goldenIdentifier the identifier for the corresponding screenshot
      */
@@ -150,9 +148,7 @@
         if (interaction != null) {
             composeTestRule.runOnIdle {
                 // Start ripple
-                scope.launch {
-                    interactionSource.emit(interaction)
-                }
+                scope.launch { interactionSource.emit(interaction) }
             }
 
             composeTestRule.waitForIdle()
@@ -163,7 +159,8 @@
         }
 
         // Capture and compare screenshots
-        composeTestRule.onNodeWithTag(Tag)
+        composeTestRule
+            .onNodeWithTag(Tag)
             .captureToImage()
             .assertAgainstGolden(screenshotRule, goldenIdentifier)
     }
diff --git a/compose/material3/material3/src/androidInstrumentedTest/kotlin/androidx/compose/material3/NavigationDrawerItemTest.kt b/compose/material3/material3/src/androidInstrumentedTest/kotlin/androidx/compose/material3/NavigationDrawerItemTest.kt
index af1eb3a..51a4d10 100644
--- a/compose/material3/material3/src/androidInstrumentedTest/kotlin/androidx/compose/material3/NavigationDrawerItemTest.kt
+++ b/compose/material3/material3/src/androidInstrumentedTest/kotlin/androidx/compose/material3/NavigationDrawerItemTest.kt
@@ -54,8 +54,7 @@
 @RunWith(AndroidJUnit4::class)
 class NavigationDrawerItemTest {
 
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
     val DrawerItemTag = "drawer_item_tag"
 
@@ -73,7 +72,8 @@
             }
         }
 
-        rule.onNodeWithTag(DrawerItemTag)
+        rule
+            .onNodeWithTag(DrawerItemTag)
             .assertWidthIsEqualTo(264.dp)
             .assertHeightIsEqualTo(NavigationDrawerTokens.ActiveIndicatorHeight)
     }
@@ -110,12 +110,8 @@
                             modifier = Modifier.testTag("icon")
                         )
                     },
-                    label = {
-                        Text("Label")
-                    },
-                    badge = {
-                        Text("Badge")
-                    },
+                    label = { Text("Label") },
+                    badge = { Text("Badge") },
                     selected = true,
                     onClick = {},
                     modifier = Modifier.testTag(DrawerItemTag)
@@ -123,7 +119,8 @@
             }
         }
 
-        rule.onNodeWithTag("icon", useUnmergedTree = true)
+        rule
+            .onNodeWithTag("icon", useUnmergedTree = true)
             // should be 16dp padding from the start
             .assertLeftPositionInRootIsEqualTo(16.dp)
 
@@ -137,9 +134,7 @@
             rule.onRoot().getBoundsInRoot().right -
                 rule.onNodeWithText("Badge", useUnmergedTree = true).getBoundsInRoot().right
         // 24 at the end
-        badgePadding.assertIsEqualTo(
-            expected = 24.dp,
-            subject = "badge padding ")
+        badgePadding.assertIsEqualTo(expected = 24.dp, subject = "badge padding ")
     }
 
     @Test
@@ -147,9 +142,7 @@
         rule.setMaterialContent(lightColorScheme()) {
             Column(Modifier.width(264.dp)) {
                 NavigationDrawerItem(
-                    label = {
-                        Text("Label")
-                    },
+                    label = { Text("Label") },
                     selected = true,
                     onClick = {},
                     modifier = Modifier.testTag(DrawerItemTag)
@@ -157,7 +150,8 @@
             }
         }
 
-        rule.onNodeWithText("Label", useUnmergedTree = true)
+        rule
+            .onNodeWithText("Label", useUnmergedTree = true)
             // should be 16dp padding from the start
             .assertLeftPositionInRootIsEqualTo(16.dp)
     }
@@ -169,36 +163,29 @@
                 drawerContent = {
                     NavigationDrawerItem(
                         modifier = Modifier.testTag("selected_item"),
-                        icon = {
-                            Icon(Icons.Filled.Favorite, null)
-                        },
-                        label = {
-                            Text("ItemText")
-                        },
+                        icon = { Icon(Icons.Filled.Favorite, null) },
+                        label = { Text("ItemText") },
                         selected = true,
                         onClick = {}
                     )
                     NavigationDrawerItem(
                         modifier = Modifier.testTag("unselected_item"),
-                        icon = {
-                            Icon(Icons.Filled.Favorite, null)
-                        },
-                        label = {
-                            Text("ItemText")
-                        },
+                        icon = { Icon(Icons.Filled.Favorite, null) },
+                        label = { Text("ItemText") },
                         selected = false,
                         onClick = {}
                     )
                 }
-            ) {
-            }
+            ) {}
         }
 
-        rule.onNodeWithTag("selected_item")
+        rule
+            .onNodeWithTag("selected_item")
             .assert(SemanticsMatcher.expectValue(SemanticsProperties.Role, Role.Tab))
             .assertIsSelected()
             .assertHasClickAction()
-        rule.onNodeWithTag("unselected_item")
+        rule
+            .onNodeWithTag("unselected_item")
             .assert(SemanticsMatcher.expectValue(SemanticsProperties.Role, Role.Tab))
             .assertIsNotSelected()
             .assertHasClickAction()
diff --git a/compose/material3/material3/src/androidInstrumentedTest/kotlin/androidx/compose/material3/NavigationRailScreenshotTest.kt b/compose/material3/material3/src/androidInstrumentedTest/kotlin/androidx/compose/material3/NavigationRailScreenshotTest.kt
index a6c38ea..64abfde 100644
--- a/compose/material3/material3/src/androidInstrumentedTest/kotlin/androidx/compose/material3/NavigationRailScreenshotTest.kt
+++ b/compose/material3/material3/src/androidInstrumentedTest/kotlin/androidx/compose/material3/NavigationRailScreenshotTest.kt
@@ -51,11 +51,9 @@
 @RunWith(AndroidJUnit4::class)
 @SdkSuppress(minSdkVersion = Build.VERSION_CODES.O)
 class NavigationRailScreenshotTest {
-    @get:Rule
-    val composeTestRule = createComposeRule()
+    @get:Rule val composeTestRule = createComposeRule()
 
-    @get:Rule
-    val screenshotRule = AndroidXScreenshotTestRule(GOLDEN_MATERIAL3)
+    @get:Rule val screenshotRule = AndroidXScreenshotTestRule(GOLDEN_MATERIAL3)
 
     @Test
     fun lightTheme_defaultColors() {
@@ -222,9 +220,8 @@
                         selected = true,
                         onClick = {},
                         icon = { Icon(Icons.Filled.Home, contentDescription = null) },
-                        colors = NavigationRailItemDefaults.colors(
-                            indicatorColor = Color.Transparent
-                        )
+                        colors =
+                            NavigationRailItemDefaults.colors(indicatorColor = Color.Transparent)
                     )
                 }
             }
@@ -242,8 +239,7 @@
      * Asserts that the NavigationRail matches the screenshot with identifier [goldenIdentifier].
      *
      * @param scope [CoroutineScope] used to interact with [MutableInteractionSource]
-     * @param interactionSource the [MutableInteractionSource] used for the first
-     * NavigationRailItem
+     * @param interactionSource the [MutableInteractionSource] used for the first NavigationRailItem
      * @param interaction the [Interaction] to assert for, or `null` if no [Interaction].
      * @param goldenIdentifier the identifier for the corresponding screenshot
      */
@@ -256,9 +252,7 @@
         if (interaction != null) {
             composeTestRule.runOnIdle {
                 // Start ripple
-                scope.launch {
-                    interactionSource.emit(interaction)
-                }
+                scope.launch { interactionSource.emit(interaction) }
             }
 
             composeTestRule.waitForIdle()
@@ -269,7 +263,8 @@
         }
 
         // Capture and compare screenshots
-        composeTestRule.onNodeWithTag(Tag)
+        composeTestRule
+            .onNodeWithTag(Tag)
             .captureToImage()
             .assertAgainstGolden(screenshotRule, goldenIdentifier)
     }
@@ -280,7 +275,7 @@
  * [NavigationRailItem] is selected, and the rest are not.
  *
  * @param interactionSource the [MutableInteractionSource] for the first [NavigationRailItem], to
- * control its visual state.
+ *   control its visual state.
  * @param withHeaderFab when true, shows a [FloatingActionButton] as the [NavigationRail] header.
  * @param setUnselectedItemsAsDisabled when true, marks unselected items as disabled
  */
@@ -293,11 +288,12 @@
 ) {
     Box(Modifier.semantics(mergeDescendants = true) {}.testTag(Tag)) {
         NavigationRail(
-            header = if (withHeaderFab) {
-                { HeaderFab() }
-            } else {
-                null
-            }
+            header =
+                if (withHeaderFab) {
+                    { HeaderFab() }
+                } else {
+                    null
+                }
         ) {
             NavigationRailItem(
                 icon = { Icon(Icons.Filled.Favorite, null) },
@@ -331,7 +327,7 @@
 @Composable
 private fun HeaderFab() {
     FloatingActionButton(
-        onClick = { },
+        onClick = {},
     ) {
         Icon(Icons.Filled.Edit, contentDescription = "Edit")
     }
diff --git a/compose/material3/material3/src/androidInstrumentedTest/kotlin/androidx/compose/material3/NavigationRailTest.kt b/compose/material3/material3/src/androidInstrumentedTest/kotlin/androidx/compose/material3/NavigationRailTest.kt
index 56c8d14..c1c67a5 100644
--- a/compose/material3/material3/src/androidInstrumentedTest/kotlin/androidx/compose/material3/NavigationRailTest.kt
+++ b/compose/material3/material3/src/androidInstrumentedTest/kotlin/androidx/compose/material3/NavigationRailTest.kt
@@ -68,12 +68,9 @@
 
 @LargeTest
 @RunWith(AndroidJUnit4::class)
-/**
- * Test for [NavigationRail] and [NavigationRailItem].
- */
+/** Test for [NavigationRail] and [NavigationRailItem]. */
 class NavigationRailTest {
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
     @Test
     fun defaultSemantics() {
@@ -81,25 +78,23 @@
             NavigationRail {
                 NavigationRailItem(
                     modifier = Modifier.testTag("item"),
-                    icon = {
-                        Icon(Icons.Filled.Favorite, null)
-                    },
-                    label = {
-                        Text("ItemText")
-                    },
+                    icon = { Icon(Icons.Filled.Favorite, null) },
+                    label = { Text("ItemText") },
                     selected = true,
                     onClick = {}
                 )
             }
         }
 
-        rule.onNodeWithTag("item")
+        rule
+            .onNodeWithTag("item")
             .assert(SemanticsMatcher.expectValue(SemanticsProperties.Role, Role.Tab))
             .assertIsSelected()
             .assertIsEnabled()
             .assertHasClickAction()
 
-        rule.onNodeWithTag("item")
+        rule
+            .onNodeWithTag("item")
             .onParent()
             .assert(SemanticsMatcher.keyIsDefined(SemanticsProperties.SelectableGroup))
     }
@@ -111,19 +106,16 @@
                 NavigationRailItem(
                     enabled = false,
                     modifier = Modifier.testTag("item"),
-                    icon = {
-                        Icon(Icons.Filled.Favorite, null)
-                    },
-                    label = {
-                        Text("ItemText")
-                    },
+                    icon = { Icon(Icons.Filled.Favorite, null) },
+                    label = { Text("ItemText") },
                     selected = true,
                     onClick = {}
                 )
             }
         }
 
-        rule.onNodeWithTag("item")
+        rule
+            .onNodeWithTag("item")
             .assert(SemanticsMatcher.expectValue(SemanticsProperties.Role, Role.Tab))
             .assertIsSelected()
             .assertIsNotEnabled()
@@ -136,33 +128,23 @@
             NavigationRail {
                 NavigationRailItem(
                     modifier = Modifier.testTag("item1"),
-                    icon = {
-                        Icon(Icons.Filled.Favorite, "Favorite")
-                    },
-                    label = {
-                        Text("Favorite")
-                    },
+                    icon = { Icon(Icons.Filled.Favorite, "Favorite") },
+                    label = { Text("Favorite") },
                     selected = true,
                     alwaysShowLabel = false,
                     onClick = {}
                 )
                 NavigationRailItem(
                     modifier = Modifier.testTag("item2"),
-                    icon = {
-                        Icon(Icons.Filled.Favorite, "Favorite")
-                    },
-                    label = {
-                        Text("Favorite")
-                    },
+                    icon = { Icon(Icons.Filled.Favorite, "Favorite") },
+                    label = { Text("Favorite") },
                     selected = false,
                     alwaysShowLabel = false,
                     onClick = {}
                 )
                 NavigationRailItem(
                     modifier = Modifier.testTag("item3"),
-                    icon = {
-                        Icon(Icons.Filled.Favorite, "Favorite")
-                    },
+                    icon = { Icon(Icons.Filled.Favorite, "Favorite") },
                     selected = false,
                     onClick = {}
                 )
@@ -183,33 +165,33 @@
     @Test
     fun navigationRail_width() {
         val defaultWidth = NavigationRailItemWidth
-        rule.setMaterialContentForSizeAssertions {
-            val items = listOf("Home", "Search", "Settings")
-            val icons = listOf(Icons.Filled.Home, Icons.Filled.Search, Icons.Filled.Settings)
-            NavigationRail {
-                items.forEachIndexed { index, item ->
-                    NavigationRailItem(
-                        icon = { Icon(icons[index], contentDescription = item) },
-                        label = { Text(item) },
-                        selected = index == 0,
-                        onClick = { /* do something */ }
-                    )
+        rule
+            .setMaterialContentForSizeAssertions {
+                val items = listOf("Home", "Search", "Settings")
+                val icons = listOf(Icons.Filled.Home, Icons.Filled.Search, Icons.Filled.Settings)
+                NavigationRail {
+                    items.forEachIndexed { index, item ->
+                        NavigationRailItem(
+                            icon = { Icon(icons[index], contentDescription = item) },
+                            label = { Text(item) },
+                            selected = index == 0,
+                            onClick = { /* do something */ }
+                        )
+                    }
                 }
             }
-        }.assertWidthIsEqualTo(defaultWidth)
+            .assertWidthIsEqualTo(defaultWidth)
     }
 
     @Test
     fun navigationRail_respectsContentPadding() {
         rule.setMaterialContentForSizeAssertions {
             NavigationRail(windowInsets = WindowInsets(13.dp, 13.dp, 13.dp, 13.dp)) {
-                Box(
-                    Modifier
-                        .fillMaxSize()
-                        .testTag("content"))
+                Box(Modifier.fillMaxSize().testTag("content"))
             }
         }
-        rule.onNodeWithTag("content")
+        rule
+            .onNodeWithTag("content")
             .assertTopPositionInRootIsEqualTo(13.dp + NavigationRailVerticalPadding)
             .assertLeftPositionInRootIsEqualTo(13.dp)
     }
@@ -226,9 +208,10 @@
                             label = { Text("Item $index") },
                             selected = index == 0,
                             onClick = {},
-                            modifier = Modifier.onGloballyPositioned { coords ->
-                                itemCoords[index] = coords
-                            }
+                            modifier =
+                                Modifier.onGloballyPositioned { coords ->
+                                    itemCoords[index] = coords
+                                }
                         )
                     }
                 }
@@ -267,10 +250,9 @@
         }
 
         Truth.assertThat(
-            rule.onNodeWithTag("TAG", useUnmergedTree = true)
-                .getUnclippedBoundsInRoot()
-                .height
-        ).isGreaterThan(defaultHeight)
+                rule.onNodeWithTag("TAG", useUnmergedTree = true).getUnclippedBoundsInRoot().height
+            )
+            .isGreaterThan(defaultHeight)
     }
 
     @Test
@@ -280,12 +262,8 @@
                 NavigationRail {
                     NavigationRailItem(
                         modifier = Modifier.testTag("item"),
-                        icon = {
-                            Icon(Icons.Filled.Favorite, null, Modifier.testTag("icon"))
-                        },
-                        label = {
-                            Text("ItemText", Modifier.testTag("label"))
-                        },
+                        icon = { Icon(Icons.Filled.Favorite, null, Modifier.testTag("icon")) },
+                        label = { Text("ItemText", Modifier.testTag("label")) },
                         selected = true,
                         onClick = {}
                     )
@@ -294,10 +272,10 @@
         }
 
         val itemBounds = rule.onNodeWithTag("item").getUnclippedBoundsInRoot()
-        val iconBounds = rule.onNodeWithTag("icon", useUnmergedTree = true)
-            .getUnclippedBoundsInRoot()
-        val textBounds = rule.onNodeWithTag("label", useUnmergedTree = true)
-            .getUnclippedBoundsInRoot()
+        val iconBounds =
+            rule.onNodeWithTag("icon", useUnmergedTree = true).getUnclippedBoundsInRoot()
+        val textBounds =
+            rule.onNodeWithTag("label", useUnmergedTree = true).getUnclippedBoundsInRoot()
 
         // Distance from the container bottom to the text bottom, and from the top of the icon to
         // the top of the item
@@ -309,7 +287,8 @@
         // Text bottom should be `verticalPadding` from the bottom of the item
         textBottom.assertIsEqualTo(itemBottom - verticalPadding)
 
-        rule.onNodeWithTag("icon", useUnmergedTree = true)
+        rule
+            .onNodeWithTag("icon", useUnmergedTree = true)
             // The icon should be centered in the item
             .assertLeftPositionInRootIsEqualTo((itemBounds.width - iconBounds.width) / 2)
             // The top of the icon is `verticalPadding` below the top of the item
@@ -323,12 +302,8 @@
                 NavigationRail {
                     NavigationRailItem(
                         modifier = Modifier.testTag("item"),
-                        icon = {
-                            Icon(Icons.Filled.Favorite, null, Modifier.testTag("icon"))
-                        },
-                        label = {
-                            Text("ItemText")
-                        },
+                        icon = { Icon(Icons.Filled.Favorite, null, Modifier.testTag("icon")) },
+                        label = { Text("ItemText") },
                         selected = false,
                         onClick = {},
                         alwaysShowLabel = false
@@ -342,10 +317,11 @@
         rule.onNodeWithText("ItemText", useUnmergedTree = true).assertIsNotDisplayed()
 
         val itemBounds = rule.onNodeWithTag("item").getUnclippedBoundsInRoot()
-        val iconBounds = rule.onNodeWithTag("icon", useUnmergedTree = true)
-            .getUnclippedBoundsInRoot()
+        val iconBounds =
+            rule.onNodeWithTag("icon", useUnmergedTree = true).getUnclippedBoundsInRoot()
 
-        rule.onNodeWithTag("icon", useUnmergedTree = true)
+        rule
+            .onNodeWithTag("icon", useUnmergedTree = true)
             .assertLeftPositionInRootIsEqualTo((itemBounds.width - iconBounds.width) / 2)
             // The item's container has a `NavigationRailItemVerticalPadding` top-padding
             .assertTopPositionInRootIsEqualTo(
@@ -360,9 +336,7 @@
                 NavigationRail {
                     NavigationRailItem(
                         modifier = Modifier.testTag("item"),
-                        icon = {
-                            Icon(Icons.Filled.Favorite, null, Modifier.testTag("icon"))
-                        },
+                        icon = { Icon(Icons.Filled.Favorite, null, Modifier.testTag("icon")) },
                         label = null,
                         selected = false,
                         onClick = {}
@@ -372,11 +346,12 @@
         }
 
         val itemBounds = rule.onNodeWithTag("item").getUnclippedBoundsInRoot()
-        val iconBounds = rule.onNodeWithTag("icon", useUnmergedTree = true)
-            .getUnclippedBoundsInRoot()
+        val iconBounds =
+            rule.onNodeWithTag("icon", useUnmergedTree = true).getUnclippedBoundsInRoot()
 
         // The icon should be centered in the item, as there is no text placeable provided
-        rule.onNodeWithTag("icon", useUnmergedTree = true)
+        rule
+            .onNodeWithTag("icon", useUnmergedTree = true)
             .assertLeftPositionInRootIsEqualTo((itemBounds.width - iconBounds.width) / 2)
             // The item's container has a `NavigationRailItemVerticalPadding` top-padding
             .assertTopPositionInRootIsEqualTo(
@@ -403,7 +378,8 @@
         }
 
         // Find all items and ensure there are 3
-        rule.onAllNodes(isSelectable())
+        rule
+            .onAllNodes(isSelectable())
             .assertCountEquals(3)
             // Ensure semantics match for selected state of the items
             .apply {
@@ -412,9 +388,7 @@
                 get(2).assertIsNotSelected()
             }
             // Click the last item
-            .apply {
-                get(2).performClick()
-            }
+            .apply { get(2).performClick() }
             .apply {
                 get(0).assertIsNotSelected()
                 get(1).assertIsNotSelected()
@@ -430,23 +404,16 @@
                 NavigationRailItem(
                     enabled = false,
                     modifier = Modifier.testTag("item"),
-                    icon = {
-                        Icon(Icons.Filled.Favorite, null)
-                    },
-                    label = {
-                        Text("ItemText")
-                    },
+                    icon = { Icon(Icons.Filled.Favorite, null) },
+                    label = { Text("ItemText") },
                     selected = true,
                     onClick = { clicks++ }
                 )
             }
         }
 
-        rule.onNodeWithTag("item")
-            .performClick()
+        rule.onNodeWithTag("item").performClick()
 
-        rule.runOnIdle {
-            Truth.assertThat(clicks).isEqualTo(0)
-        }
+        rule.runOnIdle { Truth.assertThat(clicks).isEqualTo(0) }
     }
 }
diff --git a/compose/material3/material3/src/androidInstrumentedTest/kotlin/androidx/compose/material3/OutlinedTextFieldScreenshotTest.kt b/compose/material3/material3/src/androidInstrumentedTest/kotlin/androidx/compose/material3/OutlinedTextFieldScreenshotTest.kt
index cd677de..734f398 100644
--- a/compose/material3/material3/src/androidInstrumentedTest/kotlin/androidx/compose/material3/OutlinedTextFieldScreenshotTest.kt
+++ b/compose/material3/material3/src/androidInstrumentedTest/kotlin/androidx/compose/material3/OutlinedTextFieldScreenshotTest.kt
@@ -63,21 +63,20 @@
 class OutlinedTextFieldScreenshotTest {
     private val TextFieldTag = "OutlinedTextField"
 
-    private val longText = TextFieldValue(
-        "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do " +
-            "eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam," +
-            " quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. " +
-            "Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu " +
-            "fugiat nulla pariatur."
-    )
+    private val longText =
+        TextFieldValue(
+            "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do " +
+                "eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam," +
+                " quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. " +
+                "Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu " +
+                "fugiat nulla pariatur."
+        )
 
     private val platformTextStyle = defaultPlatformTextStyle()
 
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
-    @get:Rule
-    val screenshotRule = AndroidXScreenshotTestRule(GOLDEN_MATERIAL3)
+    @get:Rule val screenshotRule = AndroidXScreenshotTestRule(GOLDEN_MATERIAL3)
 
     @Test
     fun outlinedTextField_withInput() {
@@ -183,8 +182,7 @@
                 value = TextFieldValue(text = text, selection = TextRange(text.length)),
                 onValueChange = {},
                 modifier = Modifier.testTag(TextFieldTag).requiredWidth(280.dp),
-                colors =
-                    OutlinedTextFieldDefaults.colors(unfocusedTextColor = Color.Magenta),
+                colors = OutlinedTextFieldDefaults.colors(unfocusedTextColor = Color.Magenta),
             )
         }
 
@@ -199,14 +197,16 @@
                 value = TextFieldValue(text = text, selection = TextRange(0, text.length)),
                 onValueChange = {},
                 modifier = Modifier.requiredWidth(280.dp).testTag(TextFieldTag),
-                colors = OutlinedTextFieldDefaults.colors(
-                    // We can only test the background color because popups, which includes the
-                    // selection handles, do not appear in screenshots
-                    selectionColors = TextSelectionColors(
-                        handleColor = Color.Black,
-                        backgroundColor = Color.Green,
+                colors =
+                    OutlinedTextFieldDefaults.colors(
+                        // We can only test the background color because popups, which includes the
+                        // selection handles, do not appear in screenshots
+                        selectionColors =
+                            TextSelectionColors(
+                                handleColor = Color.Black,
+                                backgroundColor = Color.Green,
+                            )
                     )
-                )
             )
         }
 
@@ -221,9 +221,8 @@
                 value = TextFieldValue(text = text, selection = TextRange(text.length)),
                 onValueChange = {},
                 label = { Text("Label") },
-                modifier = Modifier.requiredHeight(300.dp)
-                    .requiredWidth(280.dp)
-                    .testTag(TextFieldTag)
+                modifier =
+                    Modifier.requiredHeight(300.dp).requiredWidth(280.dp).testTag(TextFieldTag)
             )
         }
 
@@ -237,9 +236,8 @@
             OutlinedTextField(
                 value = TextFieldValue(text = text, selection = TextRange(text.length)),
                 onValueChange = {},
-                modifier = Modifier.requiredHeight(300.dp)
-                    .requiredWidth(280.dp)
-                    .testTag(TextFieldTag)
+                modifier =
+                    Modifier.requiredHeight(300.dp).requiredWidth(280.dp).testTag(TextFieldTag)
             )
         }
 
@@ -254,9 +252,8 @@
                 onValueChange = {},
                 label = { Text("Label") },
                 placeholder = { Text("placeholder") },
-                modifier = Modifier.requiredHeight(300.dp)
-                    .requiredWidth(280.dp)
-                    .testTag(TextFieldTag)
+                modifier =
+                    Modifier.requiredHeight(300.dp).requiredWidth(280.dp).testTag(TextFieldTag)
             )
         }
 
@@ -272,9 +269,8 @@
                 value = "",
                 onValueChange = {},
                 placeholder = { Text("placeholder") },
-                modifier = Modifier.requiredHeight(300.dp)
-                    .requiredWidth(280.dp)
-                    .testTag(TextFieldTag)
+                modifier =
+                    Modifier.requiredHeight(300.dp).requiredWidth(280.dp).testTag(TextFieldTag)
             )
         }
 
@@ -290,9 +286,8 @@
                 value = "",
                 onValueChange = {},
                 label = { Text("Label") },
-                modifier = Modifier.requiredHeight(300.dp)
-                    .requiredWidth(280.dp)
-                    .testTag(TextFieldTag)
+                modifier =
+                    Modifier.requiredHeight(300.dp).requiredWidth(280.dp).testTag(TextFieldTag)
             )
         }
 
@@ -418,7 +413,7 @@
         rule.setMaterialContent(lightColorScheme()) {
             OutlinedTextField(
                 value = longText,
-                onValueChange = { },
+                onValueChange = {},
                 singleLine = true,
                 modifier = Modifier.testTag(TextFieldTag).requiredWidth(300.dp),
                 enabled = false
@@ -473,7 +468,7 @@
         rule.setMaterialContent(lightColorScheme()) {
             OutlinedTextField(
                 value = longText,
-                onValueChange = { },
+                onValueChange = {},
                 modifier = Modifier.testTag(TextFieldTag).requiredWidth(300.dp),
                 singleLine = true,
                 enabled = true,
@@ -500,10 +495,8 @@
                 value = TextFieldValue(text = text, selection = TextRange(text.length)),
                 onValueChange = {},
                 modifier = Modifier.width(300.dp).testTag(TextFieldTag),
-                textStyle = TextStyle(
-                    textAlign = TextAlign.Center,
-                    platformStyle = platformTextStyle
-                ),
+                textStyle =
+                    TextStyle(textAlign = TextAlign.Center, platformStyle = platformTextStyle),
                 singleLine = true
             )
         }
@@ -583,11 +576,12 @@
                 value = "Text",
                 onValueChange = {},
                 modifier = Modifier.width(300.dp).testTag(TextFieldTag),
-                label = if (makeLabelNull.value) {
-                    null
-                } else {
-                    { Text("Label") }
-                },
+                label =
+                    if (makeLabelNull.value) {
+                        null
+                    } else {
+                        { Text("Label") }
+                    },
             )
         }
 
@@ -796,11 +790,16 @@
 
     private fun SemanticsNodeInteraction.focus() {
         // split click into (down) and (move, up) to enforce a composition in between
-        this.performTouchInput { down(center) }.performTouchInput { move(); up() }
+        this.performTouchInput { down(center) }
+            .performTouchInput {
+                move()
+                up()
+            }
     }
 
     private fun assertAgainstGolden(goldenIdentifier: String) {
-        rule.onNodeWithTag(TextFieldTag)
+        rule
+            .onNodeWithTag(TextFieldTag)
             .captureToImage()
             .assertAgainstGolden(screenshotRule, goldenIdentifier)
     }
diff --git a/compose/material3/material3/src/androidInstrumentedTest/kotlin/androidx/compose/material3/OutlinedTextFieldTest.kt b/compose/material3/material3/src/androidInstrumentedTest/kotlin/androidx/compose/material3/OutlinedTextFieldTest.kt
index 770f86d..8d66554 100644
--- a/compose/material3/material3/src/androidInstrumentedTest/kotlin/androidx/compose/material3/OutlinedTextFieldTest.kt
+++ b/compose/material3/material3/src/androidInstrumentedTest/kotlin/androidx/compose/material3/OutlinedTextFieldTest.kt
@@ -111,29 +111,27 @@
     private val IconPadding = HorizontalIconPadding
     private val TextFieldTag = "textField"
 
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
     @Test
     fun testOutlinedTextField_setSmallWidth() {
-        rule.setMaterialContentForSizeAssertions {
-            OutlinedTextField(
-                value = "input",
-                onValueChange = {},
-                modifier = Modifier.requiredWidth(40.dp)
-            )
-        }
+        rule
+            .setMaterialContentForSizeAssertions {
+                OutlinedTextField(
+                    value = "input",
+                    onValueChange = {},
+                    modifier = Modifier.requiredWidth(40.dp)
+                )
+            }
             .assertWidthIsEqualTo(40.dp)
     }
 
     @Test
     fun testOutlinedTextField_defaultWidth() {
-        rule.setMaterialContentForSizeAssertions {
-            OutlinedTextField(
-                value = "input",
-                onValueChange = {}
-            )
-        }
+        rule
+            .setMaterialContentForSizeAssertions {
+                OutlinedTextField(value = "input", onValueChange = {})
+            }
             .assertWidthIsEqualTo(ExpectedDefaultTextFieldWidth)
     }
 
@@ -148,16 +146,18 @@
         rule.setMaterialContent(lightColorScheme()) {
             Column {
                 OutlinedTextField(
-                    modifier = Modifier
-                        .testTag(textField1Tag)
-                        .onFocusChanged { textField1Focused = it.isFocused },
+                    modifier =
+                        Modifier.testTag(textField1Tag).onFocusChanged {
+                            textField1Focused = it.isFocused
+                        },
                     value = "input1",
                     onValueChange = {}
                 )
                 OutlinedTextField(
-                    modifier = Modifier
-                        .testTag(textField2Tag)
-                        .onFocusChanged { textField2Focused = it.isFocused },
+                    modifier =
+                        Modifier.testTag(textField2Tag).onFocusChanged {
+                            textField2Focused = it.isFocused
+                        },
                     value = "input2",
                     onValueChange = {}
                 )
@@ -185,9 +185,8 @@
         rule.setMaterialContent(lightColorScheme()) {
             Box {
                 OutlinedTextField(
-                    modifier = Modifier
-                        .testTag(TextFieldTag)
-                        .onFocusChanged { focused = it.isFocused },
+                    modifier =
+                        Modifier.testTag(TextFieldTag).onFocusChanged { focused = it.isFocused },
                     value = "input",
                     onValueChange = {}
                 )
@@ -195,13 +194,9 @@
         }
 
         // Click on (2, 2) which is a background area and outside input area
-        rule.onNodeWithTag(TextFieldTag).performTouchInput {
-            click(Offset(2f, 2f))
-        }
+        rule.onNodeWithTag(TextFieldTag).performTouchInput { click(Offset(2f, 2f)) }
 
-        rule.runOnIdleWithDensity {
-            assertThat(focused).isTrue()
-        }
+        rule.runOnIdleWithDensity { assertThat(focused).isTrue() }
     }
 
     @Test
@@ -210,31 +205,32 @@
         val density = Density(4f)
         rule.setMaterialContent(lightColorScheme()) {
             CompositionLocalProvider(LocalDensity provides density) {
-                Box(
-                    Modifier
-                        .testTag("box")
-                        .background(Color.Red)) {
+                Box(Modifier.testTag("box").background(Color.Red)) {
                     OutlinedTextField(
                         value = "",
                         onValueChange = {},
-                        colors = OutlinedTextFieldDefaults.colors(
-                            unfocusedTextColor = Color.White,
-                            unfocusedBorderColor = Color.White
-                        ),
+                        colors =
+                            OutlinedTextFieldDefaults.colors(
+                                unfocusedTextColor = Color.White,
+                                unfocusedBorderColor = Color.White
+                            ),
                         shape = RectangleShape
                     )
                 }
             }
         }
 
-        rule.onNodeWithTag("box").captureToImage().assertShape(
-            density = density,
-            horizontalPadding = 1.dp, // OutlinedTextField border thickness
-            verticalPadding = 1.dp, // OutlinedTextField border thickness
-            backgroundColor = Color.White, // OutlinedTextField border color
-            shapeColor = Color.Red, // Color of background as OutlinedTextField is transparent
-            shape = RectangleShape
-        )
+        rule
+            .onNodeWithTag("box")
+            .captureToImage()
+            .assertShape(
+                density = density,
+                horizontalPadding = 1.dp, // OutlinedTextField border thickness
+                verticalPadding = 1.dp, // OutlinedTextField border thickness
+                backgroundColor = Color.White, // OutlinedTextField border color
+                shapeColor = Color.Red, // Color of background as OutlinedTextField is transparent
+                shape = RectangleShape
+            )
     }
 
     @Test
@@ -247,11 +243,9 @@
                 singleLine = true,
                 label = {
                     Box(
-                        Modifier
-                            .size(MinTextLineHeight)
-                            .onGloballyPositioned {
-                                labelPosition.value = it.positionInRoot()
-                            }
+                        Modifier.size(MinTextLineHeight).onGloballyPositioned {
+                            labelPosition.value = it.positionInRoot()
+                        }
                     )
                 }
             )
@@ -261,10 +255,13 @@
             // x position is start + padding
             assertThat(labelPosition.value?.x).isWithin(1f).of(ExpectedPadding.toPx())
             // y position is centered, plus additional padding allowance on top
-            assertThat(labelPosition.value?.y).isWithin(1f).of(
-                ((ExpectedMinimumTextFieldHeight - MinTextLineHeight) / 2 +
-                    OutlinedTextFieldTopPadding.toDp()).toPx()
-            )
+            assertThat(labelPosition.value?.y)
+                .isWithin(1f)
+                .of(
+                    ((ExpectedMinimumTextFieldHeight - MinTextLineHeight) / 2 +
+                            OutlinedTextFieldTopPadding.toDp())
+                        .toPx()
+                )
         }
     }
 
@@ -277,11 +274,9 @@
                 onValueChange = {},
                 label = {
                     Box(
-                        Modifier
-                            .size(MinTextLineHeight)
-                            .onGloballyPositioned {
-                                labelPosition.value = it.positionInRoot()
-                            }
+                        Modifier.size(MinTextLineHeight).onGloballyPositioned {
+                            labelPosition.value = it.positionInRoot()
+                        }
                     )
                 }
             )
@@ -291,9 +286,9 @@
             // x position is start + padding
             assertThat(labelPosition.value?.x).isWithin(1f).of(ExpectedPadding.toPx())
             // y position is top + default padding + label padding allowance
-            assertThat(labelPosition.value?.y).isWithin(1f).of(
-                (ExpectedPadding + OutlinedTextFieldTopPadding.toDp()).toPx()
-            )
+            assertThat(labelPosition.value?.y)
+                .isWithin(1f)
+                .of((ExpectedPadding + OutlinedTextFieldTopPadding.toDp()).toPx())
         }
     }
 
@@ -310,10 +305,11 @@
                 label = {
                     Text(
                         text = "long long long long long long long long long long long long",
-                        modifier = Modifier.onGloballyPositioned {
-                            labelSize.value = it.size
-                            labelPosition.value = it.positionInRoot()
-                        }
+                        modifier =
+                            Modifier.onGloballyPositioned {
+                                labelSize.value = it.size
+                                labelPosition.value = it.positionInRoot()
+                            }
                     )
                 }
             )
@@ -329,9 +325,9 @@
             // x position is start + padding
             assertThat(labelPosition.value?.x).isWithin(1f).of(ExpectedPadding.toPx())
             // y position is top + default padding + label padding allowance
-            assertThat(labelPosition.value?.y).isWithin(1f).of(
-                (ExpectedPadding + OutlinedTextFieldTopPadding.toDp()).toPx()
-            )
+            assertThat(labelPosition.value?.y)
+                .isWithin(1f)
+                .of((ExpectedPadding + OutlinedTextFieldTopPadding.toDp()).toPx())
         }
     }
 
@@ -347,11 +343,9 @@
                 onValueChange = {},
                 label = {
                     Box(
-                        Modifier
-                            .size(MinFocusedLabelLineHeight)
-                            .onGloballyPositioned {
-                                labelPosition.value = it.positionInRoot()
-                            }
+                        Modifier.size(MinFocusedLabelLineHeight).onGloballyPositioned {
+                            labelPosition.value = it.positionInRoot()
+                        }
                     )
                 }
             )
@@ -362,9 +356,9 @@
 
         rule.runOnIdleWithDensity {
             assertThat(labelPosition.value?.x).isWithin(1f).of(ExpectedPadding.toPx())
-            assertThat(labelPosition.value?.y).isWithin(1f).of(
-                getLabelPosition(labelSize.roundToPx()).toFloat()
-            )
+            assertThat(labelPosition.value?.y)
+                .isWithin(1f)
+                .of(getLabelPosition(labelSize.roundToPx()).toFloat())
         }
     }
 
@@ -377,16 +371,15 @@
             OutlinedTextField(
                 value = "",
                 onValueChange = {},
-                modifier = Modifier
-                    .testTag(TextFieldTag)
-                    .requiredWidth(textFieldWidth),
+                modifier = Modifier.testTag(TextFieldTag).requiredWidth(textFieldWidth),
                 label = {
                     Text(
                         text = "long long long long long long long long long long long long",
-                        modifier = Modifier.onGloballyPositioned {
-                            labelSize.value = it.size
-                            labelPosition.value = it.positionInRoot()
-                        }
+                        modifier =
+                            Modifier.onGloballyPositioned {
+                                labelSize.value = it.size
+                                labelPosition.value = it.positionInRoot()
+                            }
                     )
                 }
             )
@@ -399,15 +392,15 @@
             // label size
             assertThat(labelSize.value).isNotNull()
             assertThat(labelSize.value?.height).isGreaterThan(0)
-            assertThat(labelSize.value?.width!!.toFloat()).isWithin(1f).of(
-                (textFieldWidth - ExpectedPadding * 2).toPx()
-            )
+            assertThat(labelSize.value?.width!!.toFloat())
+                .isWithin(1f)
+                .of((textFieldWidth - ExpectedPadding * 2).toPx())
 
             // label position
             assertThat(labelPosition.value?.x).isWithin(1f).of(ExpectedPadding.toPx())
-            assertThat(labelPosition.value?.y).isWithin(1f).of(
-                getLabelPosition(labelSize.value!!.height).toFloat()
-            )
+            assertThat(labelPosition.value?.y)
+                .isWithin(1f)
+                .of(getLabelPosition(labelSize.value!!.height).toFloat())
         }
     }
 
@@ -419,14 +412,9 @@
             OutlinedTextField(
                 value = "",
                 onValueChange = {},
-                modifier = Modifier
-                    .testTag(TextFieldTag)
-                    .onGloballyPositioned {
-                        tfSize.value = it.size
-                    },
-                label = {
-                    Box(Modifier.size(width = 50.dp, height = labelHeight))
-                },
+                modifier =
+                    Modifier.testTag(TextFieldTag).onGloballyPositioned { tfSize.value = it.size },
+                label = { Box(Modifier.size(width = 50.dp, height = labelHeight)) },
             )
         }
 
@@ -445,15 +433,12 @@
             OutlinedTextField(
                 value = "",
                 onValueChange = {},
-                modifier = Modifier
-                    .testTag(TextFieldTag)
-                    .requiredWidth(textFieldWidth),
+                modifier = Modifier.testTag(TextFieldTag).requiredWidth(textFieldWidth),
                 label = {
                     Text(
                         text = "Label",
-                        modifier = Modifier
-                            .width(labelRequestedWidth)
-                            .onGloballyPositioned {
+                        modifier =
+                            Modifier.width(labelRequestedWidth).onGloballyPositioned {
                                 labelSize.value = it.size
                             }
                     )
@@ -462,9 +447,7 @@
                     Icon(
                         Icons.Default.Favorite,
                         null,
-                        modifier = Modifier.onGloballyPositioned {
-                            trailingSize.value = it.size
-                        },
+                        modifier = Modifier.onGloballyPositioned { trailingSize.value = it.size },
                     )
                 },
             )
@@ -498,11 +481,9 @@
                 onValueChange = {},
                 label = {
                     Box(
-                        Modifier
-                            .size(labelSize)
-                            .onGloballyPositioned {
-                                labelPosition.value = it.positionInRoot()
-                            }
+                        Modifier.size(labelSize).onGloballyPositioned {
+                            labelPosition.value = it.positionInRoot()
+                        }
                     )
                 }
             )
@@ -511,9 +492,9 @@
         rule.runOnIdleWithDensity {
             // label position
             assertThat(labelPosition.value?.x).isWithin(1f).of(ExpectedPadding.toPx())
-            assertThat(labelPosition.value?.y).isWithin(1f).of(
-                getLabelPosition(labelSize.roundToPx()).toFloat()
-            )
+            assertThat(labelPosition.value?.y)
+                .isWithin(1f)
+                .of(getLabelPosition(labelSize.roundToPx()).toFloat())
         }
     }
 
@@ -528,12 +509,8 @@
                 placeholder = {
                     Text(text = "Placeholder", modifier = Modifier.testTag("Placeholder"))
                 },
-                prefix = {
-                    Text(text = "Prefix", modifier = Modifier.testTag("Prefix"))
-                },
-                suffix = {
-                    Text(text = "Suffix", modifier = Modifier.testTag("Suffix"))
-                }
+                prefix = { Text(text = "Prefix", modifier = Modifier.testTag("Prefix")) },
+                suffix = { Text(text = "Suffix", modifier = Modifier.testTag("Suffix")) }
             )
         }
 
@@ -555,11 +532,9 @@
                     label = { Box(Modifier.size(MinFocusedLabelLineHeight)) },
                     placeholder = {
                         Box(
-                            Modifier
-                                .size(placeholderSize)
-                                .onGloballyPositioned {
-                                    placeholderPosition.value = it.positionInRoot()
-                                }
+                            Modifier.size(placeholderSize).onGloballyPositioned {
+                                placeholderPosition.value = it.positionInRoot()
+                            }
                         )
                     }
                 )
@@ -570,9 +545,9 @@
 
         rule.runOnIdleWithDensity {
             assertThat(placeholderPosition.value?.x).isWithin(1f).of(ExpectedPadding.toPx())
-            assertThat(placeholderPosition.value?.y).isWithin(1f).of(
-                (ExpectedPadding + OutlinedTextFieldTopPadding.toDp()).toPx()
-            )
+            assertThat(placeholderPosition.value?.y)
+                .isWithin(1f)
+                .of((ExpectedPadding + OutlinedTextFieldTopPadding.toDp()).toPx())
         }
     }
 
@@ -587,11 +562,9 @@
                 onValueChange = {},
                 placeholder = {
                     Box(
-                        Modifier
-                            .size(placeholderSize)
-                            .onGloballyPositioned {
-                                placeholderPosition.value = it.positionInRoot()
-                            }
+                        Modifier.size(placeholderSize).onGloballyPositioned {
+                            placeholderPosition.value = it.positionInRoot()
+                        }
                     )
                 }
             )
@@ -617,10 +590,11 @@
                 placeholder = {
                     Text(
                         text = "placeholder",
-                        modifier = Modifier.onGloballyPositioned {
-                            placeholderPosition.value = it.positionInRoot()
-                            placeholderSize.value = it.size
-                        }
+                        modifier =
+                            Modifier.onGloballyPositioned {
+                                placeholderPosition.value = it.positionInRoot()
+                                placeholderSize.value = it.size
+                            }
                     )
                 }
             )
@@ -644,8 +618,7 @@
                 onValueChange = {},
                 placeholder = {
                     Text("placeholder")
-                    assertThat(LocalTextStyle.current)
-                        .isEqualTo(MaterialTheme.typography.bodyLarge)
+                    assertThat(LocalTextStyle.current).isEqualTo(MaterialTheme.typography.bodyLarge)
                 }
             )
         }
@@ -663,10 +636,11 @@
                 modifier = Modifier.testTag(TextFieldTag),
                 value = text.value,
                 onValueChange = { text.value = it },
-                colors = OutlinedTextFieldDefaults.colors(
-                    focusedPlaceholderColor = Color.Red,
-                    unfocusedPlaceholderColor = Color.Green,
-                ),
+                colors =
+                    OutlinedTextFieldDefaults.colors(
+                        focusedPlaceholderColor = Color.Red,
+                        unfocusedPlaceholderColor = Color.Green,
+                    ),
                 placeholder = {
                     Text("Placeholder")
                     assertThat(LocalContentColor.current)
@@ -701,20 +675,16 @@
                 onValueChange = {},
                 label = {
                     Box(
-                        Modifier
-                            .size(labelSize)
-                            .onGloballyPositioned {
-                                labelPosition.value = it.positionInRoot()
-                            }
+                        Modifier.size(labelSize).onGloballyPositioned {
+                            labelPosition.value = it.positionInRoot()
+                        }
                     )
                 },
                 placeholder = {
                     Box(
-                        Modifier
-                            .size(placeholderSize)
-                            .onGloballyPositioned {
-                                placeholderPosition.value = it.positionInRoot()
-                            }
+                        Modifier.size(placeholderSize).onGloballyPositioned {
+                            placeholderPosition.value = it.positionInRoot()
+                        }
                     )
                 }
             )
@@ -730,18 +700,22 @@
 
             // label position
             assertThat(labelPosition.value?.x).isWithin(1f).of(ExpectedPadding.toPx())
-            assertThat(labelPosition.value?.y).isWithin(1f).of(
-                getLabelPosition(labelSize.roundToPx()).toFloat()
-            )
+            assertThat(labelPosition.value?.y)
+                .isWithin(1f)
+                .of(getLabelPosition(labelSize.roundToPx()).toFloat())
 
             // placeholder position
             assertThat(placeholderPosition.value?.x).isWithin(1f).of(ExpectedPadding.toPx())
             // placeholder y position is top + default padding + label padding allowance, then
             // centered within allocated space
-            assertThat(placeholderPosition.value?.y).isWithin(1f).of(
-                (ExpectedPadding + OutlinedTextFieldTopPadding.toDp() +
-                    (MinTextLineHeight - placeholderSize) / 2).toPx()
-            )
+            assertThat(placeholderPosition.value?.y)
+                .isWithin(1f)
+                .of(
+                    (ExpectedPadding +
+                            OutlinedTextFieldTopPadding.toDp() +
+                            (MinTextLineHeight - placeholderSize) / 2)
+                        .toPx()
+                )
         }
     }
 
@@ -791,27 +765,26 @@
                 // leading
                 assertThat(leadingSize.value).isEqualTo(IntSize(size.roundToPx(), size.roundToPx()))
                 assertThat(leadingPosition.value?.x).isEqualTo(IconPadding.roundToPx().toFloat())
-                assertThat(leadingPosition.value?.y).isEqualTo(
-                    ((minimumHeight - leadingSize.value!!.height) / 2f).roundToInt() +
-                        8.dp.roundToPx()
-                )
-                // trailing
-                assertThat(trailingSize.value).isEqualTo(
-                    IntSize(
-                        size.roundToPx(),
-                        size.roundToPx()
+                assertThat(leadingPosition.value?.y)
+                    .isEqualTo(
+                        ((minimumHeight - leadingSize.value!!.height) / 2f).roundToInt() +
+                            8.dp.roundToPx()
                     )
-                )
-                assertThat(trailingPosition.value?.x).isEqualTo(
-                    (
-                        textFieldWidth.roundToPx() - IconPadding.roundToPx() -
-                            trailingSize.value!!.width
-                        ).toFloat()
-                )
-                assertThat(trailingPosition.value?.y).isEqualTo(
-                    ((minimumHeight - trailingSize.value!!.height) / 2f).roundToInt() +
-                        8.dp.roundToPx()
-                )
+                // trailing
+                assertThat(trailingSize.value)
+                    .isEqualTo(IntSize(size.roundToPx(), size.roundToPx()))
+                assertThat(trailingPosition.value?.x)
+                    .isEqualTo(
+                        (textFieldWidth.roundToPx() -
+                                IconPadding.roundToPx() -
+                                trailingSize.value!!.width)
+                            .toFloat()
+                    )
+                assertThat(trailingPosition.value?.y)
+                    .isEqualTo(
+                        ((minimumHeight - trailingSize.value!!.height) / 2f).roundToInt() +
+                            8.dp.roundToPx()
+                    )
             }
         }
     }
@@ -832,26 +805,30 @@
                 OutlinedTextField(
                     value = "text",
                     onValueChange = {},
-                    modifier = Modifier
-                        .width(textFieldWidth)
-                        .height(textFieldHeight),
+                    modifier = Modifier.width(textFieldWidth).height(textFieldHeight),
                     leadingIcon = {
                         IconButton(
                             onClick = {},
-                            modifier = Modifier.onGloballyPositioned {
-                                leadingPosition = it.positionInRoot()
-                                leadingSize = it.size
-                            }
-                        ) { Icon(Icons.Default.Favorite, null) }
+                            modifier =
+                                Modifier.onGloballyPositioned {
+                                    leadingPosition = it.positionInRoot()
+                                    leadingSize = it.size
+                                }
+                        ) {
+                            Icon(Icons.Default.Favorite, null)
+                        }
                     },
                     trailingIcon = {
                         IconButton(
                             onClick = {},
-                            modifier = Modifier.onGloballyPositioned {
-                                trailingPosition = it.positionInRoot()
-                                trailingSize = it.size
-                            }
-                        ) { Icon(Icons.Default.Favorite, null) }
+                            modifier =
+                                Modifier.onGloballyPositioned {
+                                    trailingPosition = it.positionInRoot()
+                                    trailingSize = it.size
+                                }
+                        ) {
+                            Icon(Icons.Default.Favorite, null)
+                        }
                     }
                 )
             }
@@ -864,17 +841,18 @@
                 // leading
                 assertThat(leadingSize).isEqualTo(IntSize(size.roundToPx(), size.roundToPx()))
                 assertThat(leadingPosition?.x).isEqualTo(0f)
-                assertThat(leadingPosition?.y).isEqualTo(
-                    ((textFieldHeight.roundToPx() - leadingSize!!.height) / 2f).roundToInt()
-                )
+                assertThat(leadingPosition?.y)
+                    .isEqualTo(
+                        ((textFieldHeight.roundToPx() - leadingSize!!.height) / 2f).roundToInt()
+                    )
                 // trailing
                 assertThat(trailingSize).isEqualTo(IntSize(size.roundToPx(), size.roundToPx()))
-                assertThat(trailingPosition?.x).isEqualTo(
-                    (textFieldWidth.roundToPx() - trailingSize!!.width).toFloat()
-                )
-                assertThat(trailingPosition?.y).isEqualTo(
-                    ((textFieldHeight.roundToPx() - trailingSize!!.height) / 2f).roundToInt()
-                )
+                assertThat(trailingPosition?.x)
+                    .isEqualTo((textFieldWidth.roundToPx() - trailingSize!!.width).toFloat())
+                assertThat(trailingPosition?.y)
+                    .isEqualTo(
+                        ((textFieldHeight.roundToPx() - trailingSize!!.height) / 2f).roundToInt()
+                    )
             }
         }
     }
@@ -896,27 +874,21 @@
                 OutlinedTextField(
                     value = "text",
                     onValueChange = {},
-                    modifier = Modifier
-                        .width(textFieldWidth)
-                        .height(textFieldHeight),
+                    modifier = Modifier.width(textFieldWidth).height(textFieldHeight),
                     leadingIcon = {
                         Box(
-                            Modifier
-                                .size(size)
-                                .onGloballyPositioned {
-                                    leadingPosition = it.positionInRoot()
-                                    leadingSize = it.size
-                                }
+                            Modifier.size(size).onGloballyPositioned {
+                                leadingPosition = it.positionInRoot()
+                                leadingSize = it.size
+                            }
                         )
                     },
                     trailingIcon = {
                         Box(
-                            Modifier
-                                .size(size)
-                                .onGloballyPositioned {
-                                    trailingPosition = it.positionInRoot()
-                                    trailingSize = it.size
-                                }
+                            Modifier.size(size).onGloballyPositioned {
+                                trailingPosition = it.positionInRoot()
+                                trailingSize = it.size
+                            }
                         )
                     },
                 )
@@ -928,22 +900,18 @@
                 // leading
                 assertThat(leadingSize).isEqualTo(IntSize(size.roundToPx(), size.roundToPx()))
                 assertThat(leadingPosition?.x).isEqualTo(0f)
-                assertThat(leadingPosition?.y).isEqualTo(
-                    ((textFieldHeight.roundToPx() - leadingSize!!.height) / 2f).roundToInt()
-                )
-                // trailing
-                assertThat(trailingSize).isEqualTo(
-                    IntSize(
-                        size.roundToPx(),
-                        size.roundToPx()
+                assertThat(leadingPosition?.y)
+                    .isEqualTo(
+                        ((textFieldHeight.roundToPx() - leadingSize!!.height) / 2f).roundToInt()
                     )
-                )
-                assertThat(trailingPosition?.x).isEqualTo(
-                    (textFieldWidth.roundToPx() - trailingSize!!.width).toFloat()
-                )
-                assertThat(trailingPosition?.y).isEqualTo(
-                    ((textFieldHeight.roundToPx() - trailingSize!!.height) / 2f).roundToInt()
-                )
+                // trailing
+                assertThat(trailingSize).isEqualTo(IntSize(size.roundToPx(), size.roundToPx()))
+                assertThat(trailingPosition?.x)
+                    .isEqualTo((textFieldWidth.roundToPx() - trailingSize!!.width).toFloat())
+                assertThat(trailingPosition?.y)
+                    .isEqualTo(
+                        ((textFieldHeight.roundToPx() - trailingSize!!.height) / 2f).roundToInt()
+                    )
             }
         }
     }
@@ -966,20 +934,16 @@
                     label = { Box(Modifier.size(MinFocusedLabelLineHeight)) },
                     prefix = {
                         Box(
-                            Modifier
-                                .size(prefixSize)
-                                .onGloballyPositioned {
-                                    prefixPosition.value = it.positionInRoot()
-                                }
+                            Modifier.size(prefixSize).onGloballyPositioned {
+                                prefixPosition.value = it.positionInRoot()
+                            }
                         )
                     },
                     suffix = {
                         Box(
-                            Modifier
-                                .size(suffixSize)
-                                .onGloballyPositioned {
-                                    suffixPosition.value = it.positionInRoot()
-                                }
+                            Modifier.size(suffixSize).onGloballyPositioned {
+                                suffixPosition.value = it.positionInRoot()
+                            }
                         )
                     }
                 )
@@ -990,17 +954,17 @@
             with(density) {
                 // prefix
                 assertThat(prefixPosition.value?.x).isWithin(1f).of(ExpectedPadding.toPx())
-                assertThat(prefixPosition.value?.y).isWithin(1f).of(
-                    (ExpectedPadding + OutlinedTextFieldTopPadding.toDp()).toPx()
-                )
+                assertThat(prefixPosition.value?.y)
+                    .isWithin(1f)
+                    .of((ExpectedPadding + OutlinedTextFieldTopPadding.toDp()).toPx())
 
                 // suffix
-                assertThat(suffixPosition.value?.x).isWithin(1f).of(
-                    (textFieldWidth - ExpectedPadding - suffixSize).toPx()
-                )
-                assertThat(suffixPosition.value?.y).isWithin(1f).of(
-                    (ExpectedPadding + OutlinedTextFieldTopPadding.toDp()).toPx()
-                )
+                assertThat(suffixPosition.value?.x)
+                    .isWithin(1f)
+                    .of((textFieldWidth - ExpectedPadding - suffixSize).toPx())
+                assertThat(suffixPosition.value?.y)
+                    .isWithin(1f)
+                    .of((ExpectedPadding + OutlinedTextFieldTopPadding.toDp()).toPx())
             }
         }
     }
@@ -1022,20 +986,16 @@
                     modifier = Modifier.width(textFieldWidth),
                     prefix = {
                         Box(
-                            Modifier
-                                .size(prefixSize)
-                                .onGloballyPositioned {
-                                    prefixPosition.value = it.positionInRoot()
-                                }
+                            Modifier.size(prefixSize).onGloballyPositioned {
+                                prefixPosition.value = it.positionInRoot()
+                            }
                         )
                     },
                     suffix = {
                         Box(
-                            Modifier
-                                .size(suffixSize)
-                                .onGloballyPositioned {
-                                    suffixPosition.value = it.positionInRoot()
-                                }
+                            Modifier.size(suffixSize).onGloballyPositioned {
+                                suffixPosition.value = it.positionInRoot()
+                            }
                         )
                     }
                 )
@@ -1049,9 +1009,9 @@
                 assertThat(prefixPosition.value?.y).isWithin(1f).of(ExpectedPadding.toPx())
 
                 // suffix
-                assertThat(suffixPosition.value?.x).isWithin(1f).of(
-                    (textFieldWidth - ExpectedPadding - suffixSize).toPx()
-                )
+                assertThat(suffixPosition.value?.x)
+                    .isWithin(1f)
+                    .of((textFieldWidth - ExpectedPadding - suffixSize).toPx())
                 assertThat(suffixPosition.value?.y).isWithin(1f).of(ExpectedPadding.toPx())
             }
         }
@@ -1074,20 +1034,16 @@
                     modifier = Modifier.width(textFieldWidth),
                     prefix = {
                         Box(
-                            Modifier
-                                .size(prefixSize)
-                                .onGloballyPositioned {
-                                    prefixPosition.value = it.positionInRoot()
-                                }
+                            Modifier.size(prefixSize).onGloballyPositioned {
+                                prefixPosition.value = it.positionInRoot()
+                            }
                         )
                     },
                     suffix = {
                         Box(
-                            Modifier
-                                .size(suffixSize)
-                                .onGloballyPositioned {
-                                    suffixPosition.value = it.positionInRoot()
-                                }
+                            Modifier.size(suffixSize).onGloballyPositioned {
+                                suffixPosition.value = it.positionInRoot()
+                            }
                         )
                     },
                     leadingIcon = { Icon(Icons.Default.Favorite, null) },
@@ -1101,15 +1057,18 @@
                 val iconSize = 24.dp // default icon size
 
                 // prefix
-                assertThat(prefixPosition.value?.x).isWithin(1f).of(
-                    (ExpectedPadding + IconPadding + iconSize).toPx()
-                )
+                assertThat(prefixPosition.value?.x)
+                    .isWithin(1f)
+                    .of((ExpectedPadding + IconPadding + iconSize).toPx())
                 assertThat(prefixPosition.value?.y).isWithin(1f).of(ExpectedPadding.toPx())
 
                 // suffix
-                assertThat(suffixPosition.value?.x).isWithin(1f).of(
-                    (textFieldWidth - IconPadding - iconSize - ExpectedPadding - suffixSize).toPx()
-                )
+                assertThat(suffixPosition.value?.x)
+                    .isWithin(1f)
+                    .of(
+                        (textFieldWidth - IconPadding - iconSize - ExpectedPadding - suffixSize)
+                            .toPx()
+                    )
                 assertThat(suffixPosition.value?.y).isWithin(1f).of(ExpectedPadding.toPx())
             }
         }
@@ -1125,9 +1084,10 @@
                 label = {
                     Text(
                         text = "label",
-                        modifier = Modifier.onGloballyPositioned {
-                            labelPosition.value = it.positionInRoot()
-                        }
+                        modifier =
+                            Modifier.onGloballyPositioned {
+                                labelPosition.value = it.positionInRoot()
+                            }
                     )
                 },
                 trailingIcon = { Icon(Icons.Default.Favorite, null) },
@@ -1137,9 +1097,9 @@
 
         rule.runOnIdleWithDensity {
             val iconSize = 24.dp // default icon size
-            assertThat(labelPosition.value?.x).isWithin(1f).of(
-                (ExpectedPadding + IconPadding + iconSize).toPx()
-            )
+            assertThat(labelPosition.value?.x)
+                .isWithin(1f)
+                .of((ExpectedPadding + IconPadding + iconSize).toPx())
         }
     }
 
@@ -1153,9 +1113,10 @@
                 label = {
                     Text(
                         text = "label",
-                        modifier = Modifier.onGloballyPositioned {
-                            labelPosition.value = it.positionInRoot()
-                        }
+                        modifier =
+                            Modifier.onGloballyPositioned {
+                                labelPosition.value = it.positionInRoot()
+                            }
                     )
                 },
                 trailingIcon = null,
@@ -1215,11 +1176,9 @@
                 textStyle = TextStyle(fontSize = 1.sp), // ensure text size is minimum
                 supportingText = {
                     Box(
-                        Modifier
-                            .size(MinSupportingTextLineHeight)
-                            .onGloballyPositioned {
-                                supportingPosition.value = it.positionInRoot()
-                            }
+                        Modifier.size(MinSupportingTextLineHeight).onGloballyPositioned {
+                            supportingPosition.value = it.positionInRoot()
+                        }
                     )
                 }
             )
@@ -1227,9 +1186,9 @@
 
         rule.runOnIdleWithDensity {
             assertThat(supportingPosition.value?.x).isWithin(1f).of(ExpectedPadding.toPx())
-            assertThat(supportingPosition.value?.y).isWithin(1f).of(
-                (ExpectedMinimumTextFieldHeight + SupportingTopPadding).toPx()
-            )
+            assertThat(supportingPosition.value?.y)
+                .isWithin(1f)
+                .of((ExpectedMinimumTextFieldHeight + SupportingTopPadding).toPx())
         }
     }
 
@@ -1241,16 +1200,13 @@
             OutlinedTextField(
                 value = "",
                 onValueChange = {},
-                modifier = Modifier.onGloballyPositioned {
-                    tfSize.value = it.size
-                },
+                modifier = Modifier.onGloballyPositioned { tfSize.value = it.size },
                 supportingText = {
                     Text(
-                        text = "Long long long long long long long long long long long long " +
-                            "long long long long long long long long long long long long",
-                        modifier = Modifier.onGloballyPositioned {
-                            supportingSize.value = it.size
-                        }
+                        text =
+                            "Long long long long long long long long long long long long " +
+                                "long long long long long long long long long long long long",
+                        modifier = Modifier.onGloballyPositioned { supportingSize.value = it.size }
                     )
                 }
             )
@@ -1268,17 +1224,14 @@
             OutlinedTextField(
                 value = "",
                 onValueChange = {},
-                modifier = Modifier.onGloballyPositioned {
-                    tfSize.value = it.size
-                },
+                modifier = Modifier.onGloballyPositioned { tfSize.value = it.size },
                 supportingText = { Text("Supporting") }
             )
         }
 
         rule.runOnIdleWithDensity {
-            assertThat(tfSize.value!!.height).isGreaterThan(
-                ExpectedMinimumTextFieldHeight.roundToPx()
-            )
+            assertThat(tfSize.value!!.height)
+                .isGreaterThan(ExpectedMinimumTextFieldHeight.roundToPx())
         }
     }
 
@@ -1286,11 +1239,7 @@
     fun testOutlinedTextField_supportingText_remainsVisibleWithTallInput() {
         rule.setMaterialContent(lightColorScheme()) {
             OutlinedTextField(
-                value = buildString {
-                    repeat(200) {
-                        append("line $it\n")
-                    }
-                },
+                value = buildString { repeat(200) { append("line $it\n") } },
                 onValueChange = {},
                 modifier = Modifier.size(width = ExpectedDefaultTextFieldWidth, height = 150.dp),
                 supportingText = { Text("Supporting", modifier = Modifier.testTag("Supporting")) }
@@ -1313,9 +1262,7 @@
         }
 
         rule.onNodeWithText("Supporting").performClick()
-        rule.runOnIdle {
-            assertThat(focused).isTrue()
-        }
+        rule.runOnIdle { assertThat(focused).isTrue() }
     }
 
     @Test
@@ -1325,8 +1272,7 @@
                 value = "",
                 onValueChange = {},
                 supportingText = {
-                    assertThat(LocalTextStyle.current)
-                        .isEqualTo(MaterialTheme.typography.bodySmall)
+                    assertThat(LocalTextStyle.current).isEqualTo(MaterialTheme.typography.bodySmall)
                     assertThat(LocalContentColor.current)
                         .isEqualTo(MaterialTheme.colorScheme.onSurfaceVariant)
                 }
@@ -1342,10 +1288,8 @@
                 onValueChange = {},
                 isError = true,
                 supportingText = {
-                    assertThat(LocalTextStyle.current)
-                        .isEqualTo(MaterialTheme.typography.bodySmall)
-                    assertThat(LocalContentColor.current)
-                        .isEqualTo(MaterialTheme.colorScheme.error)
+                    assertThat(LocalTextStyle.current).isEqualTo(MaterialTheme.typography.bodySmall)
+                    assertThat(LocalContentColor.current).isEqualTo(MaterialTheme.colorScheme.error)
                 }
             )
         }
@@ -1370,10 +1314,8 @@
                     modifier = Modifier.testTag(TextFieldTag),
                     value = text.value,
                     onValueChange = { text.value = it },
-                    keyboardOptions = KeyboardOptions(
-                        imeAction = ImeAction.Go,
-                        keyboardType = KeyboardType.Email
-                    )
+                    keyboardOptions =
+                        KeyboardOptions(imeAction = ImeAction.Go, keyboardType = KeyboardType.Email)
                 )
             }
         }
@@ -1405,7 +1347,8 @@
             }
         }
 
-        rule.onNodeWithTag(TextFieldTag)
+        rule
+            .onNodeWithTag(TextFieldTag)
             .captureToImage()
             .assertShape(
                 density = rule.density,
@@ -1421,19 +1364,14 @@
     fun testOutlinedTextField_errorSemantics_defaultMessage() {
         lateinit var errorMessage: String
         rule.setMaterialContent(lightColorScheme()) {
-            OutlinedTextField(
-                value = "test",
-                onValueChange = {},
-                isError = true
-            )
+            OutlinedTextField(value = "test", onValueChange = {}, isError = true)
             errorMessage = getString(Strings.DefaultErrorMessage)
         }
 
-        rule.onNodeWithText("test")
+        rule
+            .onNodeWithText("test")
             .assert(SemanticsMatcher.keyIsDefined(SemanticsProperties.Error))
-            .assert(
-                SemanticsMatcher.expectValue(SemanticsProperties.Error, errorMessage)
-            )
+            .assert(SemanticsMatcher.expectValue(SemanticsProperties.Error, errorMessage))
     }
 
     @Test
@@ -1445,20 +1383,23 @@
             OutlinedTextField(
                 value = "test",
                 onValueChange = {},
-                modifier = Modifier
-                    .testTag(TextFieldTag)
-                    .semantics { if (isError.value) error(errorMessage) },
+                modifier =
+                    Modifier.testTag(TextFieldTag).semantics {
+                        if (isError.value) error(errorMessage)
+                    },
                 isError = isError.value
             )
             defaultErrorMessage = getString(Strings.DefaultErrorMessage)
         }
 
-        rule.onNodeWithTag(TextFieldTag)
+        rule
+            .onNodeWithTag(TextFieldTag)
             .assert(SemanticsMatcher.keyIsDefined(SemanticsProperties.Error))
             .assert(SemanticsMatcher.expectValue(SemanticsProperties.Error, errorMessage))
 
         // Check that default error message is overwritten and not lingering in a child node
-        rule.onNodeWithTag(TextFieldTag, useUnmergedTree = true)
+        rule
+            .onNodeWithTag(TextFieldTag, useUnmergedTree = true)
             .onChildren()
             .fetchSemanticsNodes()
             .forEach { node ->
@@ -1503,17 +1444,16 @@
                 value = "",
                 onValueChange = {},
                 modifier = Modifier.testTag(TextFieldTag),
-                colors = OutlinedTextFieldDefaults.colors(
-                    unfocusedContainerColor = Color.Red,
-                    unfocusedBorderColor = Color.Red
-                ),
+                colors =
+                    OutlinedTextFieldDefaults.colors(
+                        unfocusedContainerColor = Color.Red,
+                        unfocusedBorderColor = Color.Red
+                    ),
                 shape = RectangleShape
             )
         }
 
-        rule.onNodeWithTag(TextFieldTag).captureToImage().assertPixels {
-            Color.Red
-        }
+        rule.onNodeWithTag(TextFieldTag).captureToImage().assertPixels { Color.Red }
     }
 
     @Test
@@ -1563,10 +1503,11 @@
                     contentColor = LocalContentColor.current
                 },
                 modifier = Modifier.focusRequester(focusRequester),
-                colors = OutlinedTextFieldDefaults.colors(
-                    unfocusedLabelColor = unfocusedLabelColor,
-                    focusedLabelColor = focusedLabelColor
-                )
+                colors =
+                    OutlinedTextFieldDefaults.colors(
+                        unfocusedLabelColor = unfocusedLabelColor,
+                        focusedLabelColor = focusedLabelColor
+                    )
             )
         }
 
@@ -1575,9 +1516,7 @@
             assertThat(textStyle.color).isEqualTo(Color.Unspecified)
         }
 
-        rule.runOnUiThread {
-            focusRequester.requestFocus()
-        }
+        rule.runOnUiThread { focusRequester.requestFocus() }
 
         rule.runOnIdle {
             assertThat(contentColor).isEqualTo(focusedLabelColor)
@@ -1606,10 +1545,11 @@
                         contentColor = LocalContentColor.current
                     },
                     modifier = Modifier.focusRequester(focusRequester),
-                    colors = OutlinedTextFieldDefaults.colors(
-                        unfocusedLabelColor = unfocusedLabelColor,
-                        focusedLabelColor = focusedLabelColor
-                    )
+                    colors =
+                        OutlinedTextFieldDefaults.colors(
+                            unfocusedLabelColor = unfocusedLabelColor,
+                            focusedLabelColor = focusedLabelColor
+                        )
                 )
             }
         }
@@ -1619,9 +1559,7 @@
             assertThat(contentColor).isEqualTo(unfocusedLabelColor)
         }
 
-        rule.runOnUiThread {
-            focusRequester.requestFocus()
-        }
+        rule.runOnUiThread { focusRequester.requestFocus() }
 
         rule.runOnIdle {
             assertThat(textStyle.color).isEqualTo(bodySmallColor)
@@ -1649,17 +1587,16 @@
                         contentColor = LocalContentColor.current
                     },
                     modifier = Modifier.focusRequester(focusRequester),
-                    colors = OutlinedTextFieldDefaults.colors(
-                        unfocusedLabelColor = expectedLabelColor,
-                        focusedLabelColor = focusedLabelColor
-                    )
+                    colors =
+                        OutlinedTextFieldDefaults.colors(
+                            unfocusedLabelColor = expectedLabelColor,
+                            focusedLabelColor = focusedLabelColor
+                        )
                 )
             }
         }
 
-        rule.runOnUiThread {
-            focusRequester.requestFocus()
-        }
+        rule.runOnUiThread { focusRequester.requestFocus() }
 
         // advance to middle of animation
         rule.mainClock.advanceTimeBy(TextFieldAnimationDuration.toLong() / 2)
@@ -1695,10 +1632,11 @@
                         contentColor = LocalContentColor.current
                     },
                     modifier = Modifier.focusRequester(focusRequester),
-                    colors = OutlinedTextFieldDefaults.colors(
-                        unfocusedLabelColor = unfocusedLabelColor,
-                        focusedLabelColor = focusedLabelColor
-                    )
+                    colors =
+                        OutlinedTextFieldDefaults.colors(
+                            unfocusedLabelColor = unfocusedLabelColor,
+                            focusedLabelColor = focusedLabelColor
+                        )
                 )
             }
         }
@@ -1708,9 +1646,7 @@
             assertThat(contentColor).isEqualTo(unfocusedLabelColor)
         }
 
-        rule.runOnUiThread {
-            focusRequester.requestFocus()
-        }
+        rule.runOnUiThread { focusRequester.requestFocus() }
 
         rule.runOnIdle {
             assertThat(textStyle.color).isEqualTo(bodySmallColor)
@@ -1732,10 +1668,7 @@
             }
         }
 
-        rule.onNodeWithText("Label")
-            .assertExists()
-            .assertIsDisplayed()
-            .performTextInput("text")
+        rule.onNodeWithText("Label").assertExists().assertIsDisplayed().performTextInput("text")
 
         rule.onNodeWithText("text").assertExists()
     }
@@ -1745,9 +1678,7 @@
         var height = 0
         rule.setMaterialContent(lightColorScheme()) {
             val text = remember { mutableStateOf("") }
-            Box(Modifier.onGloballyPositioned {
-                height = it.size.height
-            }) {
+            Box(Modifier.onGloballyPositioned { height = it.size.height }) {
                 Row(Modifier.height(IntrinsicSize.Min)) {
                     OutlinedTextField(
                         value = text.value,
@@ -1768,9 +1699,7 @@
         var height = 0
         rule.setMaterialContent(lightColorScheme()) {
             val text = remember { mutableStateOf("") }
-            Box(Modifier.onGloballyPositioned {
-                height = it.size.height
-            }) {
+            Box(Modifier.onGloballyPositioned { height = it.size.height }) {
                 Row(Modifier.height(IntrinsicSize.Min)) {
                     OutlinedTextField(
                         value = text.value,
@@ -1797,16 +1726,12 @@
         val text = "Long text input. ".repeat(20)
         rule.setMaterialContent(lightColorScheme()) {
             Row {
-                Box(
-                    Modifier
-                        .width(150.dp)
-                        .height(IntrinsicSize.Min)) {
+                Box(Modifier.width(150.dp).height(IntrinsicSize.Min)) {
                     OutlinedTextField(
                         value = text,
                         onValueChange = {},
-                        modifier = Modifier.onGloballyPositioned {
-                            tfHeightIntrinsic = it.size.height
-                        },
+                        modifier =
+                            Modifier.onGloballyPositioned { tfHeightIntrinsic = it.size.height },
                         leadingIcon = { Icon(Icons.Default.Favorite, null) },
                         trailingIcon = { Icon(Icons.Default.Favorite, null) },
                         prefix = { Text("P") },
@@ -1818,9 +1743,8 @@
                     OutlinedTextField(
                         value = text,
                         onValueChange = {},
-                        modifier = Modifier.onGloballyPositioned {
-                            tfHeightNoIntrinsic = it.size.height
-                        },
+                        modifier =
+                            Modifier.onGloballyPositioned { tfHeightNoIntrinsic = it.size.height },
                         leadingIcon = { Icon(Icons.Default.Favorite, null) },
                         trailingIcon = { Icon(Icons.Default.Favorite, null) },
                         prefix = { Text("P") },
@@ -1857,32 +1781,23 @@
             )
         }
 
-        rule.onNodeWithTag(TextFieldTag)
-            .performClick()
+        rule.onNodeWithTag(TextFieldTag).performClick()
         rule.waitForIdle()
 
-        rule.onNodeWithTag(TextFieldTag)
-            .performTextClearance()
+        rule.onNodeWithTag(TextFieldTag).performTextClearance()
 
-        rule.runOnIdle {
-            assertThat(callbackCounter).isEqualTo(1)
-        }
+        rule.runOnIdle { assertThat(callbackCounter).isEqualTo(1) }
     }
 
     @Test
     fun testTextFields_noCrashConstraintsInfinity() {
 
         rule.setMaterialContent(lightColorScheme()) {
-            Column(modifier = Modifier
-                .height(IntrinsicSize.Min)
-                .horizontalScroll(
-                    rememberScrollState()
-                )) {
-                OutlinedTextField(
-                    value = "Cat",
-                    onValueChange = {},
-                    leadingIcon = { Text("Icon") }
-                )
+            Column(
+                modifier =
+                    Modifier.height(IntrinsicSize.Min).horizontalScroll(rememberScrollState())
+            ) {
+                OutlinedTextField(value = "Cat", onValueChange = {}, leadingIcon = { Text("Icon") })
             }
         }
     }
diff --git a/compose/material3/material3/src/androidInstrumentedTest/kotlin/androidx/compose/material3/PermanentNavigationDrawerTest.kt b/compose/material3/material3/src/androidInstrumentedTest/kotlin/androidx/compose/material3/PermanentNavigationDrawerTest.kt
index 79536b3..9fec075 100644
--- a/compose/material3/material3/src/androidInstrumentedTest/kotlin/androidx/compose/material3/PermanentNavigationDrawerTest.kt
+++ b/compose/material3/material3/src/androidInstrumentedTest/kotlin/androidx/compose/material3/PermanentNavigationDrawerTest.kt
@@ -50,28 +50,20 @@
 @OptIn(ExperimentalMaterial3Api::class)
 class PermanentNavigationDrawerTest {
 
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
     @Test
     fun permanentNavigationDrawer_testOffset() {
         rule.setMaterialContent(lightColorScheme()) {
             PermanentNavigationDrawer(
                 drawerContent = {
-                    PermanentDrawerSheet {
-                        Box(
-                            Modifier
-                                .fillMaxSize()
-                                .testTag("content")
-                        )
-                    }
+                    PermanentDrawerSheet { Box(Modifier.fillMaxSize().testTag("content")) }
                 },
                 content = {}
             )
         }
 
-        rule.onNodeWithTag("content")
-            .assertLeftPositionInRootIsEqualTo(0.dp)
+        rule.onNodeWithTag("content").assertLeftPositionInRootIsEqualTo(0.dp)
     }
 
     @Test
@@ -80,18 +72,15 @@
             PermanentNavigationDrawer(
                 drawerContent = {
                     PermanentDrawerSheet(windowInsets = WindowInsets(13.dp, 13.dp, 13.dp, 13.dp)) {
-                        Box(
-                            Modifier
-                                .fillMaxSize()
-                                .testTag("content")
-                        )
+                        Box(Modifier.fillMaxSize().testTag("content"))
                     }
                 },
                 content = {}
             )
         }
 
-        rule.onNodeWithTag("content")
+        rule
+            .onNodeWithTag("content")
             .assertLeftPositionInRootIsEqualTo(13.dp)
             .assertTopPositionInRootIsEqualTo(13.dp)
     }
@@ -102,20 +91,15 @@
             CompositionLocalProvider(LocalLayoutDirection provides LayoutDirection.Rtl) {
                 PermanentNavigationDrawer(
                     drawerContent = {
-                        PermanentDrawerSheet {
-                            Box(
-                                Modifier
-                                    .fillMaxSize()
-                                    .testTag("content")
-                            )
-                        }
+                        PermanentDrawerSheet { Box(Modifier.fillMaxSize().testTag("content")) }
                     },
                     content = {}
                 )
             }
         }
 
-        rule.onNodeWithTag("content")
+        rule
+            .onNodeWithTag("content")
             .assertLeftPositionInRootIsEqualTo(
                 rule.rootWidth() - NavigationDrawerTokens.ContainerWidth
             )
@@ -126,20 +110,13 @@
         rule.setMaterialContent(lightColorScheme()) {
             PermanentNavigationDrawer(
                 drawerContent = {
-                    PermanentDrawerSheet {
-                        Box(
-                            Modifier
-                                .fillMaxSize()
-                                .testTag("content")
-                        )
-                    }
+                    PermanentDrawerSheet { Box(Modifier.fillMaxSize().testTag("content")) }
                 },
                 content = {}
             )
         }
 
-        rule.onNodeWithTag("content")
-            .assertWidthIsEqualTo(NavigationDrawerTokens.ContainerWidth)
+        rule.onNodeWithTag("content").assertWidthIsEqualTo(NavigationDrawerTokens.ContainerWidth)
     }
 
     @Test
@@ -148,19 +125,14 @@
             PermanentNavigationDrawer(
                 drawerContent = {
                     PermanentDrawerSheet(modifier = Modifier.width(260.dp)) {
-                        Box(
-                            Modifier
-                                .fillMaxSize()
-                                .testTag("content")
-                        )
+                        Box(Modifier.fillMaxSize().testTag("content"))
                     }
                 },
                 content = {}
             )
         }
 
-        rule.onNodeWithTag("content")
-            .assertWidthIsEqualTo(260.dp)
+        rule.onNodeWithTag("content").assertWidthIsEqualTo(260.dp)
     }
 
     @Test
@@ -171,11 +143,7 @@
             PermanentNavigationDrawer(
                 drawerContent = {
                     PermanentDrawerSheet {
-                        Box(
-                            Modifier
-                                .fillMaxSize()
-                                .testTag("navigationDrawerTag")
-                        )
+                        Box(Modifier.fillMaxSize().testTag("navigationDrawerTag"))
                     }
                 },
                 content = {}
@@ -183,7 +151,8 @@
             navigationMenu = getString(Strings.NavigationMenu)
         }
 
-        rule.onNodeWithTag("navigationDrawerTag", useUnmergedTree = true)
+        rule
+            .onNodeWithTag("navigationDrawerTag", useUnmergedTree = true)
             .onParent()
             .assert(SemanticsMatcher.expectValue(SemanticsProperties.PaneTitle, navigationMenu))
     }
diff --git a/compose/material3/material3/src/androidInstrumentedTest/kotlin/androidx/compose/material3/ProgressIndicatorScreenshotTest.kt b/compose/material3/material3/src/androidInstrumentedTest/kotlin/androidx/compose/material3/ProgressIndicatorScreenshotTest.kt
index 9bb7c63..f62ae18 100644
--- a/compose/material3/material3/src/androidInstrumentedTest/kotlin/androidx/compose/material3/ProgressIndicatorScreenshotTest.kt
+++ b/compose/material3/material3/src/androidInstrumentedTest/kotlin/androidx/compose/material3/ProgressIndicatorScreenshotTest.kt
@@ -42,11 +42,9 @@
 @RunWith(AndroidJUnit4::class)
 @SdkSuppress(minSdkVersion = Build.VERSION_CODES.O)
 class ProgressIndicatorScreenshotTest {
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
-    @get:Rule
-    val screenshotRule = AndroidXScreenshotTestRule(GOLDEN_MATERIAL3)
+    @get:Rule val screenshotRule = AndroidXScreenshotTestRule(GOLDEN_MATERIAL3)
 
     private val wrap = Modifier.wrapContentSize(Alignment.TopStart)
     private val wrapperTestTag = "progressIndicatorWrapper"
@@ -54,9 +52,7 @@
     @Test
     fun linearProgressIndicator_lightTheme_determinate() {
         rule.setMaterialContent(lightColorScheme()) {
-            Box(wrap.testTag(wrapperTestTag)) {
-                LinearProgressIndicator(progress = { 0.5f })
-            }
+            Box(wrap.testTag(wrapperTestTag)) { LinearProgressIndicator(progress = { 0.5f }) }
         }
         assertIndicatorAgainstGolden("linearProgressIndicator_lightTheme_determinate")
     }
@@ -65,10 +61,7 @@
     fun linearProgressIndicator_lightTheme_determinate_no_gap() {
         rule.setMaterialContent(lightColorScheme()) {
             Box(wrap.testTag(wrapperTestTag)) {
-                LinearProgressIndicator(
-                    progress = { 0.5f },
-                    gapSize = 0.dp
-                )
+                LinearProgressIndicator(progress = { 0.5f }, gapSize = 0.dp)
             }
         }
         assertIndicatorAgainstGolden("linearProgressIndicator_lightTheme_determinate_no_gap")
@@ -78,10 +71,7 @@
     fun linearProgressIndicator_lightTheme_determinate_no_stop() {
         rule.setMaterialContent(lightColorScheme()) {
             Box(wrap.testTag(wrapperTestTag)) {
-                LinearProgressIndicator(
-                    progress = { 0.5f },
-                    drawStopIndicator = {}
-                )
+                LinearProgressIndicator(progress = { 0.5f }, drawStopIndicator = {})
             }
         }
         assertIndicatorAgainstGolden("linearProgressIndicator_lightTheme_determinate_no_stop")
@@ -104,9 +94,7 @@
     fun linearProgressIndicator_lightTheme_indeterminate() {
         rule.mainClock.autoAdvance = false
         rule.setMaterialContent(lightColorScheme()) {
-            Box(wrap.testTag(wrapperTestTag)) {
-                LinearProgressIndicator()
-            }
+            Box(wrap.testTag(wrapperTestTag)) { LinearProgressIndicator() }
         }
         rule.mainClock.advanceTimeBy(500)
         assertIndicatorAgainstGolden("linearProgressIndicator_lightTheme_indeterminate")
@@ -116,9 +104,7 @@
     fun linearProgressIndicator_lightTheme_indeterminate_start() {
         rule.mainClock.autoAdvance = false
         rule.setMaterialContent(lightColorScheme()) {
-            Box(wrap.testTag(wrapperTestTag)) {
-                LinearProgressIndicator()
-            }
+            Box(wrap.testTag(wrapperTestTag)) { LinearProgressIndicator() }
         }
         rule.mainClock.advanceTimeBy(0)
         assertIndicatorAgainstGolden("linearProgressIndicator_lightTheme_indeterminate_start")
@@ -128,11 +114,7 @@
     fun linearProgressIndicator_lightTheme_indeterminate_no_gap() {
         rule.mainClock.autoAdvance = false
         rule.setMaterialContent(lightColorScheme()) {
-            Box(wrap.testTag(wrapperTestTag)) {
-                LinearProgressIndicator(
-                    gapSize = 0.dp
-                )
-            }
+            Box(wrap.testTag(wrapperTestTag)) { LinearProgressIndicator(gapSize = 0.dp) }
         }
         rule.mainClock.advanceTimeBy(500)
         assertIndicatorAgainstGolden("linearProgressIndicator_lightTheme_indeterminate_no_gap")
@@ -141,9 +123,7 @@
     @Test
     fun linearProgressIndicator_darkTheme_determinate() {
         rule.setMaterialContent(darkColorScheme()) {
-            Box(wrap.testTag(wrapperTestTag)) {
-                LinearProgressIndicator(progress = { 0.5f })
-            }
+            Box(wrap.testTag(wrapperTestTag)) { LinearProgressIndicator(progress = { 0.5f }) }
         }
         assertIndicatorAgainstGolden("linearProgressIndicator_darkTheme_determinate")
     }
@@ -161,9 +141,7 @@
     @Test
     fun circularProgressIndicator_lightTheme_determinate() {
         rule.setMaterialContent(lightColorScheme()) {
-            Box(wrap.testTag(wrapperTestTag)) {
-                CircularProgressIndicator(progress = { 0.5f })
-            }
+            Box(wrap.testTag(wrapperTestTag)) { CircularProgressIndicator(progress = { 0.5f }) }
         }
         assertIndicatorAgainstGolden("circularProgressIndicator_lightTheme_determinate")
     }
@@ -172,10 +150,7 @@
     fun circularProgressIndicator_lightTheme_determinate_no_gap() {
         rule.setMaterialContent(lightColorScheme()) {
             Box(wrap.testTag(wrapperTestTag)) {
-                CircularProgressIndicator(
-                    progress = { 0.5f },
-                    gapSize = 0.dp
-                )
+                CircularProgressIndicator(progress = { 0.5f }, gapSize = 0.dp)
             }
         }
         assertIndicatorAgainstGolden("circularProgressIndicator_lightTheme_determinate_no_gap")
@@ -185,10 +160,7 @@
     fun circularProgressIndicator_lightTheme_determinate_size() {
         rule.setMaterialContent(lightColorScheme()) {
             Box(wrap.testTag(wrapperTestTag)) {
-                CircularProgressIndicator(
-                    modifier = Modifier.size(88.dp),
-                    progress = { 0.5f }
-                )
+                CircularProgressIndicator(modifier = Modifier.size(88.dp), progress = { 0.5f })
             }
         }
         assertIndicatorAgainstGolden("circularProgressIndicator_lightTheme_determinate_size")
@@ -198,9 +170,7 @@
     fun circularProgressIndicator_lightTheme_indeterminate() {
         rule.mainClock.autoAdvance = false
         rule.setMaterialContent(lightColorScheme()) {
-            Box(wrap.testTag(wrapperTestTag)) {
-                CircularProgressIndicator()
-            }
+            Box(wrap.testTag(wrapperTestTag)) { CircularProgressIndicator() }
         }
         rule.mainClock.advanceTimeBy(500)
         assertIndicatorAgainstGolden("circularProgressIndicator_lightTheme_indeterminate")
@@ -210,9 +180,7 @@
     fun circularProgressIndicator_lightTheme_indeterminate_start() {
         rule.mainClock.autoAdvance = false
         rule.setMaterialContent(lightColorScheme()) {
-            Box(wrap.testTag(wrapperTestTag)) {
-                CircularProgressIndicator()
-            }
+            Box(wrap.testTag(wrapperTestTag)) { CircularProgressIndicator() }
         }
         rule.mainClock.advanceTimeBy(0)
         assertIndicatorAgainstGolden("circularProgressIndicator_lightTheme_indeterminate_start")
@@ -221,9 +189,7 @@
     @Test
     fun circularProgressIndicator_darkTheme_determinate() {
         rule.setMaterialContent(darkColorScheme()) {
-            Box(wrap.testTag(wrapperTestTag)) {
-                CircularProgressIndicator(progress = { 0.5f })
-            }
+            Box(wrap.testTag(wrapperTestTag)) { CircularProgressIndicator(progress = { 0.5f }) }
         }
         assertIndicatorAgainstGolden("circularProgressIndicator_darkTheme_determinate")
     }
@@ -245,7 +211,8 @@
     }
 
     private fun assertIndicatorAgainstGolden(goldenName: String) {
-        rule.onNodeWithTag(wrapperTestTag)
+        rule
+            .onNodeWithTag(wrapperTestTag)
             .captureToImage()
             .assertAgainstGolden(screenshotRule, goldenName)
     }
diff --git a/compose/material3/material3/src/androidInstrumentedTest/kotlin/androidx/compose/material3/ProgressIndicatorTest.kt b/compose/material3/material3/src/androidInstrumentedTest/kotlin/androidx/compose/material3/ProgressIndicatorTest.kt
index 622ffed..c2cbc74c 100644
--- a/compose/material3/material3/src/androidInstrumentedTest/kotlin/androidx/compose/material3/ProgressIndicatorTest.kt
+++ b/compose/material3/material3/src/androidInstrumentedTest/kotlin/androidx/compose/material3/ProgressIndicatorTest.kt
@@ -48,8 +48,7 @@
 @LargeTest
 @RunWith(AndroidJUnit4::class)
 class ProgressIndicatorTest {
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
     @Test
     fun nonMaterialSetContent() {
@@ -75,15 +74,15 @@
             LinearProgressIndicator(modifier = Modifier.testTag(tag), progress = { progress.value })
         }
 
-        rule.onNodeWithTag(tag)
+        rule
+            .onNodeWithTag(tag)
             .assertIsDisplayed()
             .assertRangeInfoEquals(ProgressBarRangeInfo(0f, 0f..1f))
 
-        rule.runOnUiThread {
-            progress.value = 0.5f
-        }
+        rule.runOnUiThread { progress.value = 0.5f }
 
-        rule.onNodeWithTag(tag)
+        rule
+            .onNodeWithTag(tag)
             .assertIsDisplayed()
             .assertRangeInfoEquals(ProgressBarRangeInfo(0.5f, 0f..1f))
     }
@@ -97,15 +96,15 @@
             LinearProgressIndicator(modifier = Modifier.testTag(tag), progress = { progress.value })
         }
 
-        rule.onNodeWithTag(tag)
+        rule
+            .onNodeWithTag(tag)
             .assertIsDisplayed()
             .assertRangeInfoEquals(ProgressBarRangeInfo(0f, 0f..1f))
 
-        rule.runOnUiThread {
-            progress.value = 1.5f
-        }
+        rule.runOnUiThread { progress.value = 1.5f }
 
-        rule.onNodeWithTag(tag)
+        rule
+            .onNodeWithTag(tag)
             .assertIsDisplayed()
             .assertRangeInfoEquals(ProgressBarRangeInfo(1f, 0f..1f))
     }
@@ -113,9 +112,7 @@
     @Test
     fun determinateLinearProgressIndicator_Size() {
         rule
-            .setMaterialContentForSizeAssertions {
-                LinearProgressIndicator(progress = { 0f })
-            }
+            .setMaterialContentForSizeAssertions { LinearProgressIndicator(progress = { 0f }) }
             .assertWidthIsEqualTo(LinearIndicatorWidth)
             .assertHeightIsEqualTo(LinearIndicatorHeight)
     }
@@ -131,17 +128,13 @@
 
         rule.mainClock.advanceTimeByFrame() // Kick off the animation
 
-        rule.onNodeWithTag(tag)
-            .assertRangeInfoEquals(ProgressBarRangeInfo.Indeterminate)
+        rule.onNodeWithTag(tag).assertRangeInfoEquals(ProgressBarRangeInfo.Indeterminate)
     }
 
     @Test
     fun indeterminateLinearProgressIndicator_Size() {
         rule.mainClock.autoAdvance = false
-        val contentToTest = rule
-            .setMaterialContentForSizeAssertions {
-                LinearProgressIndicator()
-            }
+        val contentToTest = rule.setMaterialContentForSizeAssertions { LinearProgressIndicator() }
 
         rule.mainClock.advanceTimeByFrame() // Kick off the animation
 
@@ -162,15 +155,15 @@
             )
         }
 
-        rule.onNodeWithTag(tag)
+        rule
+            .onNodeWithTag(tag)
             .assertIsDisplayed()
             .assertRangeInfoEquals(ProgressBarRangeInfo(0f, 0f..1f))
 
-        rule.runOnUiThread {
-            progress.value = 0.5f
-        }
+        rule.runOnUiThread { progress.value = 0.5f }
 
-        rule.onNodeWithTag(tag)
+        rule
+            .onNodeWithTag(tag)
             .assertIsDisplayed()
             .assertRangeInfoEquals(ProgressBarRangeInfo(0.5f, 0f..1f))
     }
@@ -187,15 +180,15 @@
             )
         }
 
-        rule.onNodeWithTag(tag)
+        rule
+            .onNodeWithTag(tag)
             .assertIsDisplayed()
             .assertRangeInfoEquals(ProgressBarRangeInfo(0f, 0f..1f))
 
-        rule.runOnUiThread {
-            progress.value = 1.5f
-        }
+        rule.runOnUiThread { progress.value = 1.5f }
 
-        rule.onNodeWithTag(tag)
+        rule
+            .onNodeWithTag(tag)
             .assertIsDisplayed()
             .assertRangeInfoEquals(ProgressBarRangeInfo(1f, 0f..1f))
     }
@@ -203,9 +196,7 @@
     @Test
     fun determinateCircularProgressIndicator_Size() {
         rule
-            .setMaterialContentForSizeAssertions {
-                CircularProgressIndicator(progress = { 0f })
-            }
+            .setMaterialContentForSizeAssertions { CircularProgressIndicator(progress = { 0f }) }
             .assertIsSquareWithSize(CircularIndicatorDiameter)
     }
 
@@ -220,22 +211,17 @@
 
         rule.mainClock.advanceTimeByFrame() // Kick off the animation
 
-        rule.onNodeWithTag(tag)
-            .assertRangeInfoEquals(ProgressBarRangeInfo.Indeterminate)
+        rule.onNodeWithTag(tag).assertRangeInfoEquals(ProgressBarRangeInfo.Indeterminate)
     }
 
     @Test
     fun indeterminateCircularProgressIndicator_Size() {
         rule.mainClock.autoAdvance = false
-        val contentToTest = rule
-            .setMaterialContentForSizeAssertions {
-                CircularProgressIndicator()
-            }
+        val contentToTest = rule.setMaterialContentForSizeAssertions { CircularProgressIndicator() }
 
         rule.mainClock.advanceTimeByFrame() // Kick off the animation
 
-        contentToTest
-            .assertIsSquareWithSize(CircularIndicatorDiameter)
+        contentToTest.assertIsSquareWithSize(CircularIndicatorDiameter)
     }
 
     @SdkSuppress(minSdkVersion = Build.VERSION_CODES.O)
@@ -243,9 +229,8 @@
     fun determinateLinearProgressIndicator_sizeModifier() {
         val expectedWidth = 100.dp
         val expectedHeight = 10.dp
-        val expectedSize = with(rule.density) {
-            IntSize(expectedWidth.roundToPx(), expectedHeight.roundToPx())
-        }
+        val expectedSize =
+            with(rule.density) { IntSize(expectedWidth.roundToPx(), expectedHeight.roundToPx()) }
         val tag = "progress_indicator"
         rule.setContent {
             Box(Modifier.testTag(tag)) {
@@ -256,13 +241,10 @@
             }
         }
 
-        rule.onNodeWithTag(tag)
-            .captureToImage()
-            .toPixelMap()
-            .let {
-                assertEquals(expectedSize.width, it.width)
-                assertEquals(expectedSize.height, it.height)
-            }
+        rule.onNodeWithTag(tag).captureToImage().toPixelMap().let {
+            assertEquals(expectedSize.width, it.width)
+            assertEquals(expectedSize.height, it.height)
+        }
     }
 
     @SdkSuppress(minSdkVersion = Build.VERSION_CODES.O)
@@ -270,9 +252,8 @@
     fun indeterminateLinearProgressIndicator_sizeModifier() {
         val expectedWidth = 100.dp
         val expectedHeight = 10.dp
-        val expectedSize = with(rule.density) {
-            IntSize(expectedWidth.roundToPx(), expectedHeight.roundToPx())
-        }
+        val expectedSize =
+            with(rule.density) { IntSize(expectedWidth.roundToPx(), expectedHeight.roundToPx()) }
         rule.mainClock.autoAdvance = false
         val tag = "progress_indicator"
         rule.setContent {
@@ -285,13 +266,10 @@
 
         rule.mainClock.advanceTimeBy(100)
 
-        rule.onNodeWithTag(tag)
-            .captureToImage()
-            .toPixelMap()
-            .let {
-                assertEquals(expectedSize.width, it.width)
-                assertEquals(expectedSize.height, it.height)
-            }
+        rule.onNodeWithTag(tag).captureToImage().toPixelMap().let {
+            assertEquals(expectedSize.width, it.width)
+            assertEquals(expectedSize.height, it.height)
+        }
     }
 
     @Test
@@ -299,23 +277,17 @@
         val padding = 10.dp
         val paddingPx = with(rule.density) { padding.roundToPx() }
 
-        val expectedWidth = with(rule.density) {
-            LinearIndicatorWidth.roundToPx()
-        }
-        val expectedHeight = with(rule.density) {
-            LinearIndicatorHeight.roundToPx() + paddingPx * 2
-        }
+        val expectedWidth = with(rule.density) { LinearIndicatorWidth.roundToPx() }
+        val expectedHeight =
+            with(rule.density) { LinearIndicatorHeight.roundToPx() + paddingPx * 2 }
         val expectedSize = IntSize(expectedWidth, expectedHeight)
 
         // Adding a testTag on the progress bar itself captures the progress bar as well as its
         // padding.
         val tag = "progress_indicator"
-        rule.setContent {
-            LinearProgressIndicator(Modifier.testTag(tag))
-        }
+        rule.setContent { LinearProgressIndicator(Modifier.testTag(tag)) }
 
-        val node = rule.onNodeWithTag(tag)
-            .fetchSemanticsNode("couldn't find node with tag $tag")
+        val node = rule.onNodeWithTag(tag).fetchSemanticsNode("couldn't find node with tag $tag")
         val nodeBounds = node.boundsInRoot
 
         // Check that the SemanticsNode bounds of a LinearProgressIndicator include the padding.
@@ -334,14 +306,9 @@
         // The bounds of a testTag on a box that contains the progress indicator are not affected
         // by the padding added on the layout of the progress bar.
         val tag = "progress_indicator"
-        rule.setContent {
-            Box(Modifier.testTag(tag)) {
-                LinearProgressIndicator()
-            }
-        }
+        rule.setContent { Box(Modifier.testTag(tag)) { LinearProgressIndicator() } }
 
-        val node = rule.onNodeWithTag(tag)
-            .fetchSemanticsNode("couldn't find node with tag $tag")
+        val node = rule.onNodeWithTag(tag).fetchSemanticsNode("couldn't find node with tag $tag")
         val nodeBounds = node.boundsInRoot
 
         // Check that the visual bounds of a LinearProgressIndicator are the expected visual size.
@@ -354,12 +321,9 @@
         val padding = 10.dp
         val paddingPx = with(rule.density) { padding.roundToPx() }
 
-        val expectedWidth = with(rule.density) {
-            LinearIndicatorWidth.roundToPx()
-        }
-        val expectedHeight = with(rule.density) {
-            LinearIndicatorHeight.roundToPx() + paddingPx * 2
-        }
+        val expectedWidth = with(rule.density) { LinearIndicatorWidth.roundToPx() }
+        val expectedHeight =
+            with(rule.density) { LinearIndicatorHeight.roundToPx() + paddingPx * 2 }
         val expectedSize = IntSize(expectedWidth, expectedHeight)
 
         // Adding a testTag on the progress bar itself captures the progress bar as well as its
@@ -369,8 +333,7 @@
             LinearProgressIndicator(modifier = Modifier.testTag(tag), progress = { 1f })
         }
 
-        val node = rule.onNodeWithTag(tag)
-            .fetchSemanticsNode("couldn't find node with tag $tag")
+        val node = rule.onNodeWithTag(tag).fetchSemanticsNode("couldn't find node with tag $tag")
         val nodeBounds = node.boundsInRoot
 
         // Check that the SemanticsNode bounds of a LinearProgressIndicator include the padding.
@@ -390,13 +353,10 @@
         // by the padding added on the layout of the progress bar.
         val tag = "progress_indicator"
         rule.setContent {
-            Box(Modifier.testTag(tag)) {
-                LinearProgressIndicator(progress = { 1f })
-            }
+            Box(Modifier.testTag(tag)) { LinearProgressIndicator(progress = { 1f }) }
         }
 
-        val node = rule.onNodeWithTag(tag)
-            .fetchSemanticsNode("couldn't find node with tag $tag")
+        val node = rule.onNodeWithTag(tag).fetchSemanticsNode("couldn't find node with tag $tag")
         val nodeBounds = node.boundsInRoot
 
         // Check that the visual bounds of a LinearProgressIndicator are the expected visual size.
@@ -419,14 +379,9 @@
         val withPaddingTag = "with_padding"
         val visualTag = "visual_tag"
         rule.setContent {
-            Column(
-                modifier = Modifier
-                    .verticalScroll(rememberScrollState())
-            ) {
+            Column(modifier = Modifier.verticalScroll(rememberScrollState())) {
                 // Add some content to the scrollable column
-                repeat(20) {
-                    Text("Item $it")
-                }
+                repeat(20) { Text("Item $it") }
                 // The visual tag will measure the visual bounds of the indicator, while
                 // the withPadding tag will measure with padding.
                 Box(Modifier.testTag(visualTag)) {
@@ -435,21 +390,23 @@
                         progress = { 1f },
                     )
                 }
-                repeat(20) {
-                    Text("Item $it")
-                }
+                repeat(20) { Text("Item $it") }
             }
         }
 
-        val indicatorNode = rule.onNodeWithTag(visualTag)
-            .fetchSemanticsNode("couldn't find node with tag $visualTag")
+        val indicatorNode =
+            rule
+                .onNodeWithTag(visualTag)
+                .fetchSemanticsNode("couldn't find node with tag $visualTag")
         val indicatorBounds = indicatorNode.boundsInRoot
         // Check that the visual bounds of a LinearProgressIndicator are the expected visual size.
         assertEquals(expectedSize.width.toFloat(), indicatorBounds.width)
         assertEquals(expectedSize.height.toFloat(), indicatorBounds.height)
 
-        val semanticsNode = rule.onNodeWithTag(withPaddingTag)
-            .fetchSemanticsNode("couldn't find node with tag $withPaddingTag")
+        val semanticsNode =
+            rule
+                .onNodeWithTag(withPaddingTag)
+                .fetchSemanticsNode("couldn't find node with tag $withPaddingTag")
         // Make sure to get the bounds with no clipping applied by
         // using Rect(positionInRoot, size.toSize()).
         val semanticsBound = Rect(semanticsNode.positionInRoot, semanticsNode.size.toSize())
diff --git a/compose/material3/material3/src/androidInstrumentedTest/kotlin/androidx/compose/material3/RadioButtonScreenshotTest.kt b/compose/material3/material3/src/androidInstrumentedTest/kotlin/androidx/compose/material3/RadioButtonScreenshotTest.kt
index ead7ac3..e2fd3ce 100644
--- a/compose/material3/material3/src/androidInstrumentedTest/kotlin/androidx/compose/material3/RadioButtonScreenshotTest.kt
+++ b/compose/material3/material3/src/androidInstrumentedTest/kotlin/androidx/compose/material3/RadioButtonScreenshotTest.kt
@@ -55,17 +55,16 @@
 @OptIn(ExperimentalTestApi::class)
 class RadioButtonScreenshotTest {
 
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
-    @get:Rule
-    val screenshotRule = AndroidXScreenshotTestRule(GOLDEN_MATERIAL3)
+    @get:Rule val screenshotRule = AndroidXScreenshotTestRule(GOLDEN_MATERIAL3)
 
     // TODO(b/267253920): Add a compose test API to set/reset InputMode.
     @After
-    fun resetTouchMode() = with(InstrumentationRegistry.getInstrumentation()) {
-        if (SDK_INT < 33) setInTouchMode(true) else resetInTouchMode()
-    }
+    fun resetTouchMode() =
+        with(InstrumentationRegistry.getInstrumentation()) {
+            if (SDK_INT < 33) setInTouchMode(true) else resetInTouchMode()
+        }
 
     private val wrap = Modifier.wrapContentSize(Alignment.TopStart)
     private val wrapperTestTag = "radioButtonWrapper"
@@ -73,9 +72,7 @@
     @Test
     fun radioButton_lightTheme_selected() {
         rule.setMaterialContent(lightColorScheme()) {
-            Box(wrap.testTag(wrapperTestTag)) {
-                RadioButton(selected = true, onClick = {})
-            }
+            Box(wrap.testTag(wrapperTestTag)) { RadioButton(selected = true, onClick = {}) }
         }
         assertSelectableAgainstGolden("radioButton_lightTheme_selected")
     }
@@ -83,9 +80,7 @@
     @Test
     fun radioButton_darkTheme_selected() {
         rule.setMaterialContent(darkColorScheme()) {
-            Box(wrap.testTag(wrapperTestTag)) {
-                RadioButton(selected = true, onClick = {})
-            }
+            Box(wrap.testTag(wrapperTestTag)) { RadioButton(selected = true, onClick = {}) }
         }
         assertSelectableAgainstGolden("radioButton_darkTheme_selected")
     }
@@ -93,9 +88,7 @@
     @Test
     fun radioButton_lightTheme_notSelected() {
         rule.setMaterialContent(lightColorScheme()) {
-            Box(wrap.testTag(wrapperTestTag)) {
-                RadioButton(selected = false, onClick = {})
-            }
+            Box(wrap.testTag(wrapperTestTag)) { RadioButton(selected = false, onClick = {}) }
         }
         assertSelectableAgainstGolden("radioButton_lightTheme_notSelected")
     }
@@ -103,9 +96,7 @@
     @Test
     fun radioButton_darkTheme_notSelected() {
         rule.setMaterialContent(darkColorScheme()) {
-            Box(wrap.testTag(wrapperTestTag)) {
-                RadioButton(selected = false, onClick = {})
-            }
+            Box(wrap.testTag(wrapperTestTag)) { RadioButton(selected = false, onClick = {}) }
         }
         assertSelectableAgainstGolden("radioButton_darkTheme_notSelected")
     }
@@ -113,14 +104,11 @@
     @Test
     fun radioButton_lightTheme_pressed() {
         rule.setMaterialContent(lightColorScheme()) {
-            Box(wrap.testTag(wrapperTestTag)) {
-                RadioButton(selected = false, onClick = {})
-            }
+            Box(wrap.testTag(wrapperTestTag)) { RadioButton(selected = false, onClick = {}) }
         }
 
         rule.mainClock.autoAdvance = false
-        rule.onNode(isSelectable())
-            .performTouchInput { down(center) }
+        rule.onNode(isSelectable()).performTouchInput { down(center) }
 
         rule.mainClock.advanceTimeByFrame()
         rule.waitForIdle() // Wait for measure
@@ -136,14 +124,11 @@
     @Test
     fun radioButton_darkTheme_pressed() {
         rule.setMaterialContent(darkColorScheme()) {
-            Box(wrap.testTag(wrapperTestTag)) {
-                RadioButton(selected = false, onClick = {})
-            }
+            Box(wrap.testTag(wrapperTestTag)) { RadioButton(selected = false, onClick = {}) }
         }
 
         rule.mainClock.autoAdvance = false
-        rule.onNode(isSelectable())
-            .performTouchInput { down(center) }
+        rule.onNode(isSelectable()).performTouchInput { down(center) }
 
         rule.mainClock.advanceTimeByFrame()
         rule.waitForIdle() // Wait for measure
@@ -159,13 +144,9 @@
     @Test
     fun radioButton_lightTheme_hovered() {
         rule.setMaterialContent(lightColorScheme()) {
-            Box(wrap.testTag(wrapperTestTag)) {
-                RadioButton(selected = false, onClick = {})
-            }
+            Box(wrap.testTag(wrapperTestTag)) { RadioButton(selected = false, onClick = {}) }
         }
-        rule.onNodeWithTag(wrapperTestTag).performMouseInput {
-            enter(center)
-        }
+        rule.onNodeWithTag(wrapperTestTag).performMouseInput { enter(center) }
 
         assertSelectableAgainstGolden("radioButton_lightTheme_hovered")
     }
@@ -173,13 +154,9 @@
     @Test
     fun radioButton_darkTheme_hovered() {
         rule.setMaterialContent(darkColorScheme()) {
-            Box(wrap.testTag(wrapperTestTag)) {
-                RadioButton(selected = false, onClick = {})
-            }
+            Box(wrap.testTag(wrapperTestTag)) { RadioButton(selected = false, onClick = {}) }
         }
-        rule.onNodeWithTag(wrapperTestTag).performMouseInput {
-            enter(center)
-        }
+        rule.onNodeWithTag(wrapperTestTag).performMouseInput { enter(center) }
 
         assertSelectableAgainstGolden("radioButton_darkTheme_hovered")
     }
@@ -195,8 +172,7 @@
                 RadioButton(
                     selected = false,
                     onClick = {},
-                    modifier = Modifier
-                        .focusRequester(focusRequester)
+                    modifier = Modifier.focusRequester(focusRequester)
                 )
             }
         }
@@ -221,8 +197,7 @@
                 RadioButton(
                     selected = false,
                     onClick = {},
-                    modifier = Modifier
-                        .focusRequester(focusRequester)
+                    modifier = Modifier.focusRequester(focusRequester)
                 )
             }
         }
@@ -290,10 +265,14 @@
 
         rule.mainClock.autoAdvance = false
 
-        rule.onNode(isSelectable())
+        rule
+            .onNode(isSelectable())
             // split click into (down) and (move, up) to enforce a composition in between
             .performTouchInput { down(center) }
-            .performTouchInput { move(); up() }
+            .performTouchInput {
+                move()
+                up()
+            }
 
         rule.mainClock.advanceTimeByFrame()
         rule.waitForIdle() // Wait for measure
@@ -320,10 +299,14 @@
 
         rule.mainClock.autoAdvance = false
 
-        rule.onNode(isSelectable())
+        rule
+            .onNode(isSelectable())
             // split click into (down) and (move, up) to enforce a composition in between
             .performTouchInput { down(center) }
-            .performTouchInput { move(); up() }
+            .performTouchInput {
+                move()
+                up()
+            }
 
         rule.mainClock.advanceTimeByFrame()
         rule.waitForIdle() // Wait for measure
@@ -350,10 +333,14 @@
 
         rule.mainClock.autoAdvance = false
 
-        rule.onNode(isSelectable())
+        rule
+            .onNode(isSelectable())
             // split click into (down) and (move, up) to enforce a composition in between
             .performTouchInput { down(center) }
-            .performTouchInput { move(); up() }
+            .performTouchInput {
+                move()
+                up()
+            }
 
         rule.mainClock.advanceTimeByFrame()
         rule.waitForIdle() // Wait for measure
@@ -380,10 +367,14 @@
 
         rule.mainClock.autoAdvance = false
 
-        rule.onNode(isSelectable())
+        rule
+            .onNode(isSelectable())
             // split click into (down) and (move, up) to enforce a composition in between
             .performTouchInput { down(center) }
-            .performTouchInput { move(); up() }
+            .performTouchInput {
+                move()
+                up()
+            }
 
         rule.mainClock.advanceTimeByFrame()
         rule.waitForIdle() // Wait for measure
@@ -397,7 +388,8 @@
     }
 
     private fun assertSelectableAgainstGolden(goldenName: String) {
-        rule.onNodeWithTag(wrapperTestTag)
+        rule
+            .onNodeWithTag(wrapperTestTag)
             .captureToImage()
             .assertAgainstGolden(screenshotRule, goldenName)
     }
diff --git a/compose/material3/material3/src/androidInstrumentedTest/kotlin/androidx/compose/material3/RadioButtonTest.kt b/compose/material3/material3/src/androidInstrumentedTest/kotlin/androidx/compose/material3/RadioButtonTest.kt
index 1b8b1bf..4b6723d 100644
--- a/compose/material3/material3/src/androidInstrumentedTest/kotlin/androidx/compose/material3/RadioButtonTest.kt
+++ b/compose/material3/material3/src/androidInstrumentedTest/kotlin/androidx/compose/material3/RadioButtonTest.kt
@@ -48,8 +48,7 @@
 @RunWith(AndroidJUnit4::class)
 class RadioButtonTest {
 
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
     private val itemOne = "Bar"
     private val itemTwo = "Foo"
@@ -79,20 +78,17 @@
             }
         }
 
-        rule.onNodeWithTag(itemOne)
-            .assert(
-                SemanticsMatcher.expectValue(SemanticsProperties.Role, Role.RadioButton)
-            )
+        rule
+            .onNodeWithTag(itemOne)
+            .assert(SemanticsMatcher.expectValue(SemanticsProperties.Role, Role.RadioButton))
             .assertHasSelectedSemantics()
-        rule.onNodeWithTag(itemTwo)
+        rule
+            .onNodeWithTag(itemTwo)
             .assertHasUnSelectedSemantics()
-            .assert(
-                SemanticsMatcher.expectValue(SemanticsProperties.Role, Role.RadioButton)
-            )
-        rule.onNodeWithTag(itemThree)
-            .assert(
-                SemanticsMatcher.expectValue(SemanticsProperties.Role, Role.RadioButton)
-            )
+            .assert(SemanticsMatcher.expectValue(SemanticsProperties.Role, Role.RadioButton))
+        rule
+            .onNodeWithTag(itemThree)
+            .assert(SemanticsMatcher.expectValue(SemanticsProperties.Role, Role.RadioButton))
             .assertHasUnSelectedSemantics()
     }
 
@@ -112,16 +108,15 @@
             }
         }
 
-        rule.onNodeWithTag(itemOne)
+        rule
+            .onNodeWithTag(itemOne)
             .assertHasSelectedSemantics()
             .performClick()
             .assertHasSelectedSemantics()
 
-        rule.onNodeWithTag(itemTwo)
-            .assertHasUnSelectedSemantics()
+        rule.onNodeWithTag(itemTwo).assertHasUnSelectedSemantics()
 
-        rule.onNodeWithTag(itemThree)
-            .assertHasUnSelectedSemantics()
+        rule.onNodeWithTag(itemThree).assertHasUnSelectedSemantics()
     }
 
     @Test
@@ -138,16 +133,15 @@
                 }
             }
         }
-        rule.onNodeWithTag(itemTwo)
+        rule
+            .onNodeWithTag(itemTwo)
             .assertHasUnSelectedSemantics()
             .performClick()
             .assertHasSelectedSemantics()
 
-        rule.onNodeWithTag(itemOne)
-            .assertHasUnSelectedSemantics()
+        rule.onNodeWithTag(itemOne).assertHasUnSelectedSemantics()
 
-        rule.onNodeWithTag(itemThree)
-            .assertHasUnSelectedSemantics()
+        rule.onNodeWithTag(itemThree).assertHasUnSelectedSemantics()
     }
 
     @Test
@@ -163,7 +157,8 @@
             }
         }
 
-        rule.onNodeWithTag(parentTag)
+        rule
+            .onNodeWithTag(parentTag)
             .assertHasNoClickAction()
             .assert(isFocusable()) // Check merged into parent
     }
@@ -185,96 +180,63 @@
             }
         }
 
-        rule.onNodeWithTag(itemTwo)
+        rule
+            .onNodeWithTag(itemTwo)
             .assertHasUnSelectedSemantics()
             .performClick()
             .assertHasSelectedSemantics()
 
-        rule.onNodeWithTag(itemOne)
-            .assertHasUnSelectedSemantics()
+        rule.onNodeWithTag(itemOne).assertHasUnSelectedSemantics()
 
-        rule.onNodeWithTag(itemThree)
+        rule
+            .onNodeWithTag(itemThree)
             .assertHasUnSelectedSemantics()
             .performClick()
             .assertHasSelectedSemantics()
 
-        rule.onNodeWithTag(itemOne)
-            .assertHasUnSelectedSemantics()
+        rule.onNodeWithTag(itemOne).assertHasUnSelectedSemantics()
 
-        rule.onNodeWithTag(itemTwo)
-            .assertHasUnSelectedSemantics()
+        rule.onNodeWithTag(itemTwo).assertHasUnSelectedSemantics()
     }
 
     @Test
     fun radioButton_materialSizes_whenSelected_minimumTouchTarget() {
-        materialSizesTestForValue(
-            selected = true,
-            clickable = true,
-            minimumTouchTarget = true
-        )
+        materialSizesTestForValue(selected = true, clickable = true, minimumTouchTarget = true)
     }
 
     @Test
     fun radioButton_materialSizes_whenSelected_withoutMinimumTouchTarget() {
-        materialSizesTestForValue(
-            selected = true,
-            clickable = true,
-            minimumTouchTarget = false
-        )
+        materialSizesTestForValue(selected = true, clickable = true, minimumTouchTarget = false)
     }
 
     @Test
     fun radioButton_materialSizes_whenNotSelected_minimumTouchTarget() {
-        materialSizesTestForValue(
-            selected = false,
-            clickable = true,
-            minimumTouchTarget = true
-        )
+        materialSizesTestForValue(selected = false, clickable = true, minimumTouchTarget = true)
     }
 
     @Test
     fun radioButton_materialSizes_whenNotSelected_withoutMinimumTouchTarget() {
-        materialSizesTestForValue(
-            selected = false,
-            clickable = true,
-            minimumTouchTarget = false
-        )
+        materialSizesTestForValue(selected = false, clickable = true, minimumTouchTarget = false)
     }
 
     @Test
     fun radioButton_materialSizes_whenSelected_notClickable_minimumTouchTarget() {
-        materialSizesTestForValue(
-            selected = true,
-            clickable = false,
-            minimumTouchTarget = true
-        )
+        materialSizesTestForValue(selected = true, clickable = false, minimumTouchTarget = true)
     }
 
     @Test
     fun radioButton_materialSizes_whenSelected_notClickable_withoutMinimumTouchTarget() {
-        materialSizesTestForValue(
-            selected = true,
-            clickable = false,
-            minimumTouchTarget = false
-        )
+        materialSizesTestForValue(selected = true, clickable = false, minimumTouchTarget = false)
     }
 
     @Test
     fun radioButton_materialSizes_whenNotSelected_notClickable_minimumTouchTarget() {
-        materialSizesTestForValue(
-            selected = false,
-            clickable = false,
-            minimumTouchTarget = true
-        )
+        materialSizesTestForValue(selected = false, clickable = false, minimumTouchTarget = true)
     }
 
     @Test
     fun radioButton_materialSizes_whenNotSelected_notClickable_withoutMinimumTouchTarget() {
-        materialSizesTestForValue(
-            selected = false,
-            clickable = false,
-            minimumTouchTarget = false
-        )
+        materialSizesTestForValue(selected = false, clickable = false, minimumTouchTarget = false)
     }
 
     @OptIn(ExperimentalMaterial3Api::class)
@@ -290,9 +252,12 @@
                         if (minimumTouchTarget) 48.dp else Dp.Unspecified
                 ) {
                     RadioButton(
-                        selected = selected, onClick = if (clickable) {
-                            {}
-                        } else null)
+                        selected = selected,
+                        onClick =
+                            if (clickable) {
+                                {}
+                            } else null
+                    )
                 }
             }
             .run {
diff --git a/compose/material3/material3/src/androidInstrumentedTest/kotlin/androidx/compose/material3/RippleTest.kt b/compose/material3/material3/src/androidInstrumentedTest/kotlin/androidx/compose/material3/RippleTest.kt
index 80cc29d..add61ae 100644
--- a/compose/material3/material3/src/androidInstrumentedTest/kotlin/androidx/compose/material3/RippleTest.kt
+++ b/compose/material3/material3/src/androidInstrumentedTest/kotlin/androidx/compose/material3/RippleTest.kt
@@ -65,9 +65,7 @@
 import org.junit.Test
 import org.junit.runner.RunWith
 
-/**
- * Test for [ripple], to verify colors and opacity in different configurations.
- */
+/** Test for [ripple], to verify colors and opacity in different configurations. */
 @LargeTest
 @RunWith(AndroidJUnit4::class)
 @SdkSuppress(
@@ -83,8 +81,7 @@
 )
 class RippleTest {
 
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
     @Test
     fun bounded_lightTheme_pressed() {
@@ -92,12 +89,13 @@
 
         val contentColor = Color.White
 
-        val scope = rule.setRippleContent(
-            interactionSource = interactionSource,
-            bounded = true,
-            lightTheme = true,
-            contentColor = contentColor
-        )
+        val scope =
+            rule.setRippleContent(
+                interactionSource = interactionSource,
+                bounded = true,
+                lightTheme = true,
+                contentColor = contentColor
+            )
 
         assertRippleMatches(
             scope,
@@ -113,12 +111,13 @@
 
         val contentColor = Color.White
 
-        val scope = rule.setRippleContent(
-            interactionSource = interactionSource,
-            bounded = true,
-            lightTheme = true,
-            contentColor = contentColor
-        )
+        val scope =
+            rule.setRippleContent(
+                interactionSource = interactionSource,
+                bounded = true,
+                lightTheme = true,
+                contentColor = contentColor
+            )
 
         assertRippleMatches(
             scope,
@@ -134,12 +133,13 @@
 
         val contentColor = Color.White
 
-        val scope = rule.setRippleContent(
-            interactionSource = interactionSource,
-            bounded = true,
-            lightTheme = true,
-            contentColor = contentColor
-        )
+        val scope =
+            rule.setRippleContent(
+                interactionSource = interactionSource,
+                bounded = true,
+                lightTheme = true,
+                contentColor = contentColor
+            )
 
         assertRippleMatches(
             scope,
@@ -155,12 +155,13 @@
 
         val contentColor = Color.White
 
-        val scope = rule.setRippleContent(
-            interactionSource = interactionSource,
-            bounded = true,
-            lightTheme = true,
-            contentColor = contentColor
-        )
+        val scope =
+            rule.setRippleContent(
+                interactionSource = interactionSource,
+                bounded = true,
+                lightTheme = true,
+                contentColor = contentColor
+            )
 
         assertRippleMatches(
             scope,
@@ -176,12 +177,13 @@
 
         val contentColor = Color.White
 
-        val scope = rule.setRippleContent(
-            interactionSource = interactionSource,
-            bounded = false,
-            lightTheme = true,
-            contentColor = contentColor
-        )
+        val scope =
+            rule.setRippleContent(
+                interactionSource = interactionSource,
+                bounded = false,
+                lightTheme = true,
+                contentColor = contentColor
+            )
 
         assertRippleMatches(
             scope,
@@ -197,12 +199,13 @@
 
         val contentColor = Color.White
 
-        val scope = rule.setRippleContent(
-            interactionSource = interactionSource,
-            bounded = false,
-            lightTheme = true,
-            contentColor = contentColor
-        )
+        val scope =
+            rule.setRippleContent(
+                interactionSource = interactionSource,
+                bounded = false,
+                lightTheme = true,
+                contentColor = contentColor
+            )
 
         assertRippleMatches(
             scope,
@@ -218,12 +221,13 @@
 
         val contentColor = Color.White
 
-        val scope = rule.setRippleContent(
-            interactionSource = interactionSource,
-            bounded = false,
-            lightTheme = true,
-            contentColor = contentColor
-        )
+        val scope =
+            rule.setRippleContent(
+                interactionSource = interactionSource,
+                bounded = false,
+                lightTheme = true,
+                contentColor = contentColor
+            )
 
         assertRippleMatches(
             scope,
@@ -239,12 +243,13 @@
 
         val contentColor = Color.White
 
-        val scope = rule.setRippleContent(
-            interactionSource = interactionSource,
-            bounded = false,
-            lightTheme = true,
-            contentColor = contentColor
-        )
+        val scope =
+            rule.setRippleContent(
+                interactionSource = interactionSource,
+                bounded = false,
+                lightTheme = true,
+                contentColor = contentColor
+            )
 
         assertRippleMatches(
             scope,
@@ -258,8 +263,8 @@
      * Test case for changing content color during an existing ripple effect
      *
      * Note: no corresponding test for pressed ripples since RippleForeground does not update the
-     * color of currently active ripples unless they are being drawn on the UI thread
-     * (which should only happen if the target radius also changes).
+     * color of currently active ripples unless they are being drawn on the UI thread (which should
+     * only happen if the target radius also changes).
      */
     @Test
     fun contentColorChangeDuringRipple_dragged() {
@@ -275,55 +280,33 @@
             MaterialTheme {
                 Surface(contentColor = contentColor) {
                     Box(Modifier.fillMaxSize(), contentAlignment = Alignment.Center) {
-                        RippleBoxWithBackground(
-                            interactionSource,
-                            ripple(),
-                            bounded = true
-                        )
+                        RippleBoxWithBackground(interactionSource, ripple(), bounded = true)
                     }
                 }
             }
         }
 
-        rule.runOnIdle {
-            scope!!.launch {
-                interactionSource.emit(DragInteraction.Start())
-            }
-        }
+        rule.runOnIdle { scope!!.launch { interactionSource.emit(DragInteraction.Start()) } }
         rule.waitForIdle()
 
         with(rule.onNodeWithTag(Tag)) {
-            val centerPixel = captureToImage().asAndroidBitmap()
-                .run {
-                    getPixel(width / 2, height / 2)
-                }
+            val centerPixel =
+                captureToImage().asAndroidBitmap().run { getPixel(width / 2, height / 2) }
 
-            val expectedColor =
-                calculateResultingRippleColor(
-                    initialColor,
-                    rippleOpacity = 0.16f
-                )
+            val expectedColor = calculateResultingRippleColor(initialColor, rippleOpacity = 0.16f)
 
             Truth.assertThat(Color(centerPixel)).isEqualTo(expectedColor)
         }
 
         val newColor = Color.Green
 
-        rule.runOnUiThread {
-            contentColor = newColor
-        }
+        rule.runOnUiThread { contentColor = newColor }
 
         with(rule.onNodeWithTag(Tag)) {
-            val centerPixel = captureToImage().asAndroidBitmap()
-                .run {
-                    getPixel(width / 2, height / 2)
-                }
+            val centerPixel =
+                captureToImage().asAndroidBitmap().run { getPixel(width / 2, height / 2) }
 
-            val expectedColor =
-                calculateResultingRippleColor(
-                    newColor,
-                    rippleOpacity = 0.16f
-                )
+            val expectedColor = calculateResultingRippleColor(newColor, rippleOpacity = 0.16f)
 
             Truth.assertThat(Color(centerPixel)).isEqualTo(expectedColor)
         }
@@ -334,9 +317,7 @@
     fun rippleConfiguration_color_dragged() {
         val interactionSource = MutableInteractionSource()
 
-        val rippleConfiguration = RippleConfiguration(
-            color = Color.Red
-        )
+        val rippleConfiguration = RippleConfiguration(color = Color.Red)
 
         var scope: CoroutineScope? = null
 
@@ -348,29 +329,19 @@
                         LocalRippleConfiguration provides rippleConfiguration
                     ) {
                         Box(Modifier.fillMaxSize(), contentAlignment = Alignment.Center) {
-                            RippleBoxWithBackground(
-                                interactionSource,
-                                ripple(),
-                                bounded = true
-                            )
+                            RippleBoxWithBackground(interactionSource, ripple(), bounded = true)
                         }
                     }
                 }
             }
         }
 
-        rule.runOnIdle {
-            scope!!.launch {
-                interactionSource.emit(DragInteraction.Start())
-            }
-        }
+        rule.runOnIdle { scope!!.launch { interactionSource.emit(DragInteraction.Start()) } }
         rule.waitForIdle()
 
         with(rule.onNodeWithTag(Tag)) {
-            val centerPixel = captureToImage().asAndroidBitmap()
-                .run {
-                    getPixel(width / 2, height / 2)
-                }
+            val centerPixel =
+                captureToImage().asAndroidBitmap().run { getPixel(width / 2, height / 2) }
 
             val expectedColor =
                 calculateResultingRippleColor(
@@ -389,9 +360,7 @@
     fun rippleConfiguration_color_explicitColorSet_dragged() {
         val interactionSource = MutableInteractionSource()
 
-        val rippleConfiguration = RippleConfiguration(
-            color = Color.Red
-        )
+        val rippleConfiguration = RippleConfiguration(color = Color.Red)
 
         val explicitColor = Color.Green
 
@@ -416,18 +385,12 @@
             }
         }
 
-        rule.runOnIdle {
-            scope!!.launch {
-                interactionSource.emit(DragInteraction.Start())
-            }
-        }
+        rule.runOnIdle { scope!!.launch { interactionSource.emit(DragInteraction.Start()) } }
         rule.waitForIdle()
 
         with(rule.onNodeWithTag(Tag)) {
-            val centerPixel = captureToImage().asAndroidBitmap()
-                .run {
-                    getPixel(width / 2, height / 2)
-                }
+            val centerPixel =
+                captureToImage().asAndroidBitmap().run { getPixel(width / 2, height / 2) }
 
             val expectedColor =
                 calculateResultingRippleColor(
@@ -448,9 +411,8 @@
 
         val contentColor = Color.Black
 
-        val rippleConfiguration = RippleConfiguration(
-            rippleAlpha = RippleAlpha(0.5f, 0.5f, 0.5f, 0.5f)
-        )
+        val rippleConfiguration =
+            RippleConfiguration(rippleAlpha = RippleAlpha(0.5f, 0.5f, 0.5f, 0.5f))
 
         var scope: CoroutineScope? = null
 
@@ -462,29 +424,19 @@
                         LocalRippleConfiguration provides rippleConfiguration
                     ) {
                         Box(Modifier.fillMaxSize(), contentAlignment = Alignment.Center) {
-                            RippleBoxWithBackground(
-                                interactionSource,
-                                ripple(),
-                                bounded = true
-                            )
+                            RippleBoxWithBackground(interactionSource, ripple(), bounded = true)
                         }
                     }
                 }
             }
         }
 
-        rule.runOnIdle {
-            scope!!.launch {
-                interactionSource.emit(DragInteraction.Start())
-            }
-        }
+        rule.runOnIdle { scope!!.launch { interactionSource.emit(DragInteraction.Start()) } }
         rule.waitForIdle()
 
         with(rule.onNodeWithTag(Tag)) {
-            val centerPixel = captureToImage().asAndroidBitmap()
-                .run {
-                    getPixel(width / 2, height / 2)
-                }
+            val centerPixel =
+                captureToImage().asAndroidBitmap().run { getPixel(width / 2, height / 2) }
 
             val expectedColor =
                 calculateResultingRippleColor(
@@ -509,33 +461,21 @@
             scope = rememberCoroutineScope()
             MaterialTheme {
                 Surface {
-                    CompositionLocalProvider(
-                        LocalRippleConfiguration provides null
-                    ) {
+                    CompositionLocalProvider(LocalRippleConfiguration provides null) {
                         Box(Modifier.fillMaxSize(), contentAlignment = Alignment.Center) {
-                            RippleBoxWithBackground(
-                                interactionSource,
-                                ripple(),
-                                bounded = true
-                            )
+                            RippleBoxWithBackground(interactionSource, ripple(), bounded = true)
                         }
                     }
                 }
             }
         }
 
-        rule.runOnIdle {
-            scope!!.launch {
-                interactionSource.emit(DragInteraction.Start())
-            }
-        }
+        rule.runOnIdle { scope!!.launch { interactionSource.emit(DragInteraction.Start()) } }
         rule.waitForIdle()
 
         with(rule.onNodeWithTag(Tag)) {
-            val centerPixel = captureToImage().asAndroidBitmap()
-                .run {
-                    getPixel(width / 2, height / 2)
-                }
+            val centerPixel =
+                captureToImage().asAndroidBitmap().run { getPixel(width / 2, height / 2) }
 
             // No ripple should be showing
             Truth.assertThat(Color(centerPixel)).isEqualTo(RippleBoxBackgroundColor)
@@ -546,8 +486,8 @@
      * Test case for changing RippleConfiguration during an existing ripple effect
      *
      * Note: no corresponding test for pressed ripples since RippleForeground does not update the
-     * color of currently active ripples unless they are being drawn on the UI thread
-     * (which should only happen if the target radius also changes).
+     * color of currently active ripples unless they are being drawn on the UI thread (which should
+     * only happen if the target radius also changes).
      */
     @OptIn(ExperimentalMaterial3Api::class)
     @Test
@@ -568,76 +508,52 @@
                         LocalRippleConfiguration provides rippleConfiguration
                     ) {
                         Box(Modifier.fillMaxSize(), contentAlignment = Alignment.Center) {
-                            RippleBoxWithBackground(
-                                interactionSource,
-                                ripple(),
-                                bounded = true
-                            )
+                            RippleBoxWithBackground(interactionSource, ripple(), bounded = true)
                         }
                     }
                 }
             }
         }
 
-        rule.runOnIdle {
-            scope!!.launch {
-                interactionSource.emit(DragInteraction.Start())
-            }
-        }
+        rule.runOnIdle { scope!!.launch { interactionSource.emit(DragInteraction.Start()) } }
         rule.waitForIdle()
 
         with(rule.onNodeWithTag(Tag)) {
-            val centerPixel = captureToImage().asAndroidBitmap()
-                .run {
-                    getPixel(width / 2, height / 2)
-                }
+            val centerPixel =
+                captureToImage().asAndroidBitmap().run { getPixel(width / 2, height / 2) }
 
             // Ripple should use default values
-            val expectedColor =
-                calculateResultingRippleColor(
-                    contentColor,
-                    rippleOpacity = 0.16f
-                )
+            val expectedColor = calculateResultingRippleColor(contentColor, rippleOpacity = 0.16f)
 
             Truth.assertThat(Color(centerPixel)).isEqualTo(expectedColor)
         }
 
-        val newConfiguration = RippleConfiguration(
-            color = Color.Red,
-            rippleAlpha = RippleAlpha(0.5f, 0.5f, 0.5f, 0.5f)
-        )
+        val newConfiguration =
+            RippleConfiguration(
+                color = Color.Red,
+                rippleAlpha = RippleAlpha(0.5f, 0.5f, 0.5f, 0.5f)
+            )
 
-        rule.runOnUiThread {
-            rippleConfiguration = newConfiguration
-        }
+        rule.runOnUiThread { rippleConfiguration = newConfiguration }
 
         with(rule.onNodeWithTag(Tag)) {
-            val centerPixel = captureToImage().asAndroidBitmap()
-                .run {
-                    getPixel(width / 2, height / 2)
-                }
+            val centerPixel =
+                captureToImage().asAndroidBitmap().run { getPixel(width / 2, height / 2) }
 
             // The ripple should now use the new configuration value for color. Ripple alpha
             // is not currently updated during an existing effect, so it should still use the old
             // value.
             val expectedColor =
-                calculateResultingRippleColor(
-                    newConfiguration.color,
-                    rippleOpacity = 0.16f
-                )
+                calculateResultingRippleColor(newConfiguration.color, rippleOpacity = 0.16f)
 
             Truth.assertThat(Color(centerPixel)).isEqualTo(expectedColor)
         }
 
-        rule.runOnUiThread {
-            rippleConfiguration = null
-        }
+        rule.runOnUiThread { rippleConfiguration = null }
 
         with(rule.onNodeWithTag(Tag)) {
-            val centerPixel = captureToImage().asAndroidBitmap()
-                .run {
-                    getPixel(width / 2, height / 2)
-                }
+            val centerPixel =
+                captureToImage().asAndroidBitmap().run { getPixel(width / 2, height / 2) }
 
             // The ripple should now be removed
             Truth.assertThat(Color(centerPixel)).isEqualTo(RippleBoxBackgroundColor)
@@ -656,15 +572,16 @@
         val expectedAlpha = 0.5f
         val rippleAlpha = RippleAlpha(expectedAlpha, expectedAlpha, expectedAlpha, expectedAlpha)
 
-        val rippleTheme = object : androidx.compose.material.ripple.RippleTheme {
-            @Deprecated("Super method is deprecated")
-            @Composable
-            override fun defaultColor() = rippleColor
+        val rippleTheme =
+            object : androidx.compose.material.ripple.RippleTheme {
+                @Deprecated("Super method is deprecated")
+                @Composable
+                override fun defaultColor() = rippleColor
 
-            @Deprecated("Super method is deprecated")
-            @Composable
-            override fun rippleAlpha() = rippleAlpha
-        }
+                @Deprecated("Super method is deprecated")
+                @Composable
+                override fun rippleAlpha() = rippleAlpha
+            }
 
         var scope: CoroutineScope? = null
 
@@ -688,10 +605,8 @@
             }
         }
 
-        val expectedColor = calculateResultingRippleColor(
-            rippleColor,
-            rippleOpacity = expectedAlpha
-        )
+        val expectedColor =
+            calculateResultingRippleColor(rippleColor, rippleOpacity = expectedAlpha)
 
         assertRippleMatches(
             scope!!,
@@ -707,7 +622,7 @@
      * @param interactionSource the [MutableInteractionSource] driving the ripple
      * @param interaction the [Interaction] to assert for
      * @param expectedCenterPixelColor the expected color for the pixel at the center of the
-     * [RippleBoxWithBackground]
+     *   [RippleBoxWithBackground]
      */
     private fun assertRippleMatches(
         scope: CoroutineScope,
@@ -721,11 +636,7 @@
         }
 
         // Start ripple
-        rule.runOnIdle {
-            scope.launch {
-                interactionSource.emit(interaction)
-            }
-        }
+        rule.runOnIdle { scope.launch { interactionSource.emit(interaction) } }
 
         // Advance to the end of the ripple / state layer animation
         rule.waitForIdle()
@@ -739,10 +650,8 @@
         }
 
         // Compare expected and actual pixel color
-        val centerPixel = rule.onNodeWithTag(Tag)
-            .captureToImage()
-            .asAndroidBitmap()
-            .run {
+        val centerPixel =
+            rule.onNodeWithTag(Tag).captureToImage().asAndroidBitmap().run {
                 getPixel(width / 2, height / 2)
             }
 
@@ -752,8 +661,8 @@
 
 /**
  * Generic Button like component with a border that allows injecting an [Indication], and has a
- * background with the same color around it - this makes the ripple contrast better and make it
- * more visible in screenshots.
+ * background with the same color around it - this makes the ripple contrast better and make it more
+ * visible in screenshots.
  *
  * @param interactionSource the [MutableInteractionSource] that is used to drive the ripple state
  * @param ripple ripple [Indication] placed inside the surface
@@ -766,23 +675,19 @@
     bounded: Boolean
 ) {
     Box(Modifier.semantics(mergeDescendants = true) {}.testTag(Tag)) {
-        Surface(
-            Modifier.padding(25.dp),
-            color = RippleBoxBackgroundColor
-        ) {
+        Surface(Modifier.padding(25.dp), color = RippleBoxBackgroundColor) {
             val shape = RoundedCornerShape(20)
             // If the ripple is bounded, we want to clip to the shape, otherwise don't clip as
             // the ripple should draw outside the bounds.
             val clip = if (bounded) Modifier.clip(shape) else Modifier
             Box(
-                Modifier.padding(25.dp).width(40.dp).height(40.dp)
+                Modifier.padding(25.dp)
+                    .width(40.dp)
+                    .height(40.dp)
                     .border(BorderStroke(2.dp, Color.Black), shape)
                     .background(color = RippleBoxBackgroundColor, shape = shape)
                     .then(clip)
-                    .indication(
-                        interactionSource = interactionSource,
-                        indication = ripple
-                    )
+                    .indication(interactionSource = interactionSource, indication = ripple)
             ) {}
         }
     }
@@ -792,7 +697,7 @@
  * Sets the content to a [RippleBoxWithBackground] with a [MaterialTheme] and surrounding [Surface]
  *
  * @param interactionSource [MutableInteractionSource] used to drive the ripple inside the
- * [RippleBoxWithBackground]
+ *   [RippleBoxWithBackground]
  * @param bounded whether the ripple inside the [RippleBoxWithBackground] is bounded
  * @param lightTheme whether the theme is light or dark
  * @param contentColor the contentColor that will be used for the ripple color
@@ -822,13 +727,11 @@
 }
 
 /**
- * Blends ([contentColor] with [rippleOpacity]) on top of [RippleBoxBackgroundColor] to provide
- * the resulting RGB color that can be used for pixel comparison.
+ * Blends ([contentColor] with [rippleOpacity]) on top of [RippleBoxBackgroundColor] to provide the
+ * resulting RGB color that can be used for pixel comparison.
  */
-private fun calculateResultingRippleColor(
-    contentColor: Color,
-    rippleOpacity: Float
-) = contentColor.copy(alpha = rippleOpacity).compositeOver(RippleBoxBackgroundColor)
+private fun calculateResultingRippleColor(contentColor: Color, rippleOpacity: Float) =
+    contentColor.copy(alpha = rippleOpacity).compositeOver(RippleBoxBackgroundColor)
 
 private val RippleBoxBackgroundColor = Color.Blue
 
diff --git a/compose/material3/material3/src/androidInstrumentedTest/kotlin/androidx/compose/material3/ScaffoldTest.kt b/compose/material3/material3/src/androidInstrumentedTest/kotlin/androidx/compose/material3/ScaffoldTest.kt
index 5ab689e..95d91c4 100644
--- a/compose/material3/material3/src/androidInstrumentedTest/kotlin/androidx/compose/material3/ScaffoldTest.kt
+++ b/compose/material3/material3/src/androidInstrumentedTest/kotlin/androidx/compose/material3/ScaffoldTest.kt
@@ -67,8 +67,7 @@
 @RunWith(AndroidJUnit4::class)
 class ScaffoldTest {
 
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
     private val scaffoldTag = "Scaffold"
     private val roundingError = 0.5.dp
@@ -76,14 +75,13 @@
 
     @Test
     fun scaffold_onlyContent_takesWholeScreen() {
-        rule.setMaterialContentForSizeAssertions(
-            parentMaxWidth = 100.dp,
-            parentMaxHeight = 100.dp
-        ) {
-            Scaffold {
-                Text("Scaffold body")
+        rule
+            .setMaterialContentForSizeAssertions(
+                parentMaxWidth = 100.dp,
+                parentMaxHeight = 100.dp
+            ) {
+                Scaffold { Text("Scaffold body") }
             }
-        }
             .assertWidthIsEqualTo(100.dp)
             .assertHeightIsEqualTo(100.dp)
     }
@@ -94,14 +92,8 @@
         var child2: Offset = Offset.Zero
         rule.setMaterialContent(lightColorScheme()) {
             Scaffold {
-                Text(
-                    "One",
-                    Modifier.onGloballyPositioned { child1 = it.positionInParent() }
-                )
-                Text(
-                    "Two",
-                    Modifier.onGloballyPositioned { child2 = it.positionInParent() }
-                )
+                Text("One", Modifier.onGloballyPositioned { child1 = it.positionInParent() })
+                Text("Two", Modifier.onGloballyPositioned { child2 = it.positionInParent() })
             }
         }
         assertThat(child1.y).isEqualTo(child2.y)
@@ -118,8 +110,7 @@
             Scaffold(
                 topBar = {
                     Box(
-                        Modifier
-                            .fillMaxWidth()
+                        Modifier.fillMaxWidth()
                             .height(50.dp)
                             .background(color = Color.Red)
                             .onGloballyPositioned { positioned: LayoutCoordinates ->
@@ -127,19 +118,17 @@
                             }
                     )
                 },
-                modifier = Modifier
-                    .onGloballyPositioned { positioned: LayoutCoordinates ->
+                modifier =
+                    Modifier.onGloballyPositioned { positioned: LayoutCoordinates ->
                         scaffoldSize = positioned.size
                     }
             ) {
                 Box(
-                    Modifier
-                        .fillMaxSize()
-                        .background(Color.Blue)
-                        .onGloballyPositioned { positioned: LayoutCoordinates ->
-                            contentPosition = positioned.positionInParent()
-                            contentSize = positioned.size
-                        }
+                    Modifier.fillMaxSize().background(Color.Blue).onGloballyPositioned {
+                        positioned: LayoutCoordinates ->
+                        contentPosition = positioned.positionInParent()
+                        contentSize = positioned.size
+                    }
                 )
             }
         }
@@ -158,8 +147,7 @@
             Scaffold(
                 bottomBar = {
                     Box(
-                        Modifier
-                            .fillMaxWidth()
+                        Modifier.fillMaxWidth()
                             .height(50.dp)
                             .background(color = Color.Red)
                             .onGloballyPositioned { positioned: LayoutCoordinates ->
@@ -168,19 +156,17 @@
                             }
                     )
                 },
-                modifier = Modifier
-                    .onGloballyPositioned { positioned: LayoutCoordinates ->
+                modifier =
+                    Modifier.onGloballyPositioned { positioned: LayoutCoordinates ->
                         scaffoldSize = positioned.size
                     }
             ) {
                 Box(
-                    Modifier
-                        .fillMaxSize()
-                        .background(color = Color.Blue)
-                        .onGloballyPositioned { positioned: LayoutCoordinates ->
-                            contentPosition = positioned.positionInParent()
-                            contentSize = positioned.size
-                        }
+                    Modifier.fillMaxSize().background(color = Color.Blue).onGloballyPositioned {
+                        positioned: LayoutCoordinates ->
+                        contentPosition = positioned.positionInParent()
+                        contentSize = positioned.size
+                    }
                 )
             }
         }
@@ -200,8 +186,7 @@
             Scaffold(
                 topBar = {
                     Box(
-                        Modifier
-                            .fillMaxWidth()
+                        Modifier.fillMaxWidth()
                             .height(50.dp)
                             .background(color = Color.Red)
                             .onGloballyPositioned { positioned: LayoutCoordinates ->
@@ -211,8 +196,7 @@
                 },
                 bottomBar = {
                     Box(
-                        Modifier
-                            .fillMaxWidth()
+                        Modifier.fillMaxWidth()
                             .height(100.dp)
                             .background(color = Color.Red)
                             .onGloballyPositioned { positioned: LayoutCoordinates ->
@@ -240,39 +224,32 @@
     fun scaffold_topAppBarIsDrawnOnTopOfContent() {
         rule.setContent {
             Box(
-                Modifier
-                    .requiredSize(10.dp, 20.dp)
+                Modifier.requiredSize(10.dp, 20.dp)
                     .semantics(mergeDescendants = true) {}
                     .testTag(scaffoldTag)
             ) {
                 Scaffold(
                     topBar = {
                         Box(
-                            Modifier
-                                .requiredSize(10.dp)
+                            Modifier.requiredSize(10.dp)
                                 .shadow(4.dp)
                                 .zIndex(4f)
                                 .background(color = Color.White)
                         )
                     }
                 ) {
-                    Box(
-                        Modifier
-                            .requiredSize(10.dp)
-                            .background(color = Color.White)
-                    )
+                    Box(Modifier.requiredSize(10.dp).background(color = Color.White))
                 }
             }
         }
 
-        rule.onNodeWithTag(scaffoldTag)
-            .captureToImage().asAndroidBitmap().apply {
-                // asserts the appbar(top half part) has the shadow
-                val yPos = height / 2 + 2
-                assertThat(Color(getPixel(0, yPos))).isNotEqualTo(Color.White)
-                assertThat(Color(getPixel(width / 2, yPos))).isNotEqualTo(Color.White)
-                assertThat(Color(getPixel(width - 1, yPos))).isNotEqualTo(Color.White)
-            }
+        rule.onNodeWithTag(scaffoldTag).captureToImage().asAndroidBitmap().apply {
+            // asserts the appbar(top half part) has the shadow
+            val yPos = height / 2 + 2
+            assertThat(Color(getPixel(0, yPos))).isNotEqualTo(Color.White)
+            assertThat(Color(getPixel(width / 2, yPos))).isNotEqualTo(Color.White)
+            assertThat(Color(getPixel(width - 1, yPos))).isNotEqualTo(Color.White)
+        }
     }
 
     @SdkSuppress(minSdkVersion = Build.VERSION_CODES.O)
@@ -282,9 +259,7 @@
             Box(Modifier.requiredSize(10.dp, 40.dp)) {
                 Scaffold(
                     contentWindowInsets = WindowInsets(top = 5.dp, bottom = 3.dp),
-                    topBar = {
-                        Box(Modifier.requiredSize(10.dp))
-                    }
+                    topBar = { Box(Modifier.requiredSize(10.dp)) }
                 ) { paddingValues ->
                     // top is like top app bar + rounding error
                     assertDpIsWithinThreshold(
@@ -298,11 +273,7 @@
                         expected = 3.dp,
                         threshold = roundingError
                     )
-                    Box(
-                        Modifier
-                            .requiredSize(10.dp)
-                            .background(color = Color.White)
-                    )
+                    Box(Modifier.requiredSize(10.dp).background(color = Color.White))
                 }
             }
         }
@@ -328,11 +299,7 @@
                         expected = 10.dp,
                         threshold = roundingError
                     )
-                    Box(
-                        Modifier
-                            .requiredSize(10.dp)
-                            .background(color = Color.White)
-                    )
+                    Box(Modifier.requiredSize(10.dp).background(color = Color.White))
                 }
             }
         }
@@ -343,13 +310,11 @@
     fun scaffold_respectsConsumedWindowInsets() {
         rule.setContent {
             Box(
-                Modifier
-                    .requiredSize(10.dp, 40.dp)
+                Modifier.requiredSize(10.dp, 40.dp)
                     .windowInsetsPadding(WindowInsets(top = 10.dp, bottom = 10.dp))
             ) {
-                Scaffold(
-                    contentWindowInsets = WindowInsets(top = 15.dp, bottom = 15.dp)
-                ) { paddingValues ->
+                Scaffold(contentWindowInsets = WindowInsets(top = 15.dp, bottom = 15.dp)) {
+                    paddingValues ->
                     // Consumed windowInsetsPadding is omitted. This replicates behavior from
                     // Modifier.windowInsetsPadding. (15.dp contentPadding - 10.dp consumedPadding)
                     assertDpIsWithinThreshold(
@@ -362,11 +327,7 @@
                         expected = 5.dp,
                         threshold = roundingError
                     )
-                    Box(
-                        Modifier
-                            .requiredSize(10.dp)
-                            .background(color = Color.White)
-                    )
+                    Box(Modifier.requiredSize(10.dp).background(color = Color.White))
                 }
             }
         }
@@ -379,9 +340,7 @@
             Box(Modifier.requiredSize(10.dp, 40.dp)) {
                 Scaffold(
                     contentWindowInsets = WindowInsets(top = 5.dp, bottom = 3.dp),
-                    topBar = {
-                        Box(Modifier.requiredSize(0.dp))
-                    }
+                    topBar = { Box(Modifier.requiredSize(0.dp)) }
                 ) { paddingValues ->
                     // top is like the collapsed top app bar (i.e. 0dp) + rounding error
                     assertDpIsWithinThreshold(
@@ -395,11 +354,7 @@
                         expected = 3.dp,
                         threshold = roundingError
                     )
-                    Box(
-                        Modifier
-                            .requiredSize(10.dp)
-                            .background(color = Color.White)
-                    )
+                    Box(Modifier.requiredSize(10.dp).background(color = Color.White))
                 }
             }
         }
@@ -412,9 +367,7 @@
             Box(Modifier.requiredSize(10.dp, 40.dp)) {
                 Scaffold(
                     contentWindowInsets = WindowInsets(top = 5.dp, bottom = 3.dp),
-                    bottomBar = {
-                        Box(Modifier.requiredSize(10.dp))
-                    }
+                    bottomBar = { Box(Modifier.requiredSize(10.dp)) }
                 ) { paddingValues ->
                     // bottom is like bottom app bar + rounding error
                     assertDpIsWithinThreshold(
@@ -428,11 +381,7 @@
                         expected = 5.dp,
                         threshold = roundingError
                     )
-                    Box(
-                        Modifier
-                            .requiredSize(10.dp)
-                            .background(color = Color.White)
-                    )
+                    Box(Modifier.requiredSize(10.dp).background(color = Color.White))
                 }
             }
         }
@@ -451,19 +400,17 @@
                 Scaffold(
                     contentWindowInsets = WindowInsets(top = 5.dp, bottom = 3.dp),
                     snackbarHost = {
-                        SnackbarHost(hostState = hostState,
-                            modifier = Modifier
-                                .onGloballyPositioned {
+                        SnackbarHost(
+                            hostState = hostState,
+                            modifier =
+                                Modifier.onGloballyPositioned {
                                     snackbarSize = it.size
                                     snackbarPosition = it.positionInRoot()
-                                })
+                                }
+                        )
                     }
                 ) {
-                    Box(
-                        Modifier
-                            .requiredSize(10.dp)
-                            .background(color = Color.White)
-                    )
+                    Box(Modifier.requiredSize(10.dp).background(color = Color.White))
                 }
             }
         }
@@ -484,21 +431,19 @@
                 Scaffold(
                     contentWindowInsets = WindowInsets(top = 5.dp, bottom = 3.dp),
                     floatingActionButton = {
-                        FloatingActionButton(onClick = {},
-                            modifier = Modifier
-                                .onGloballyPositioned {
+                        FloatingActionButton(
+                            onClick = {},
+                            modifier =
+                                Modifier.onGloballyPositioned {
                                     fabSize = it.size
                                     fabPosition = it.positionInRoot()
-                                }) {
+                                }
+                        ) {
                             Text("Fab")
                         }
                     },
                 ) {
-                    Box(
-                        Modifier
-                            .requiredSize(10.dp)
-                            .background(color = Color.White)
-                    )
+                    Box(Modifier.requiredSize(10.dp).background(color = Color.White))
                 }
             }
         }
@@ -517,29 +462,26 @@
                     floatingActionButton = {
                         FloatingActionButton(
                             onClick = {},
-                            modifier = Modifier
-                                .onGloballyPositioned {
+                            modifier =
+                                Modifier.onGloballyPositioned {
                                     fabSize = it.size
                                     fabPosition = it.positionInRoot()
-                                }) {
+                                }
+                        ) {
                             Text("Fab")
                         }
                     },
                     floatingActionButtonPosition = FabPosition.Start,
                 ) {
-                    Box(
-                        Modifier
-                            .requiredSize(10.dp)
-                            .background(color = Color.White)
-                    )
+                    Box(Modifier.requiredSize(10.dp).background(color = Color.White))
                 }
             }
         }
         with(rule.density) {
             assertThat(fabPosition!!.x).isWithin(1f).of(fabSpacing.toPx())
-            assertThat(fabPosition!!.y).isWithin(1f).of(
-                200.dp.toPx() - fabSize!!.height - fabSpacing.toPx()
-            )
+            assertThat(fabPosition!!.y)
+                .isWithin(1f)
+                .of(200.dp.toPx() - fabSize!!.height - fabSpacing.toPx())
         }
     }
 
@@ -553,31 +495,26 @@
                     floatingActionButton = {
                         FloatingActionButton(
                             onClick = {},
-                            modifier = Modifier
-                                .onGloballyPositioned {
+                            modifier =
+                                Modifier.onGloballyPositioned {
                                     fabSize = it.size
                                     fabPosition = it.positionInRoot()
-                                }) {
+                                }
+                        ) {
                             Text("Fab")
                         }
                     },
                     floatingActionButtonPosition = FabPosition.Center,
                 ) {
-                    Box(
-                        Modifier
-                            .requiredSize(10.dp)
-                            .background(color = Color.White)
-                    )
+                    Box(Modifier.requiredSize(10.dp).background(color = Color.White))
                 }
             }
         }
         with(rule.density) {
-            assertThat(fabPosition!!.x).isWithin(1f).of(
-                (200.dp.toPx() - fabSize!!.width) / 2f
-            )
-            assertThat(fabPosition!!.y).isWithin(1f).of(
-                200.dp.toPx() - fabSize!!.height - fabSpacing.toPx()
-            )
+            assertThat(fabPosition!!.x).isWithin(1f).of((200.dp.toPx() - fabSize!!.width) / 2f)
+            assertThat(fabPosition!!.y)
+                .isWithin(1f)
+                .of(200.dp.toPx() - fabSize!!.height - fabSpacing.toPx())
         }
     }
 
@@ -591,31 +528,28 @@
                     floatingActionButton = {
                         FloatingActionButton(
                             onClick = {},
-                            modifier = Modifier
-                                .onGloballyPositioned {
+                            modifier =
+                                Modifier.onGloballyPositioned {
                                     fabSize = it.size
                                     fabPosition = it.positionInRoot()
-                                }) {
+                                }
+                        ) {
                             Text("Fab")
                         }
                     },
                     floatingActionButtonPosition = FabPosition.End,
                 ) {
-                    Box(
-                        Modifier
-                            .requiredSize(10.dp)
-                            .background(color = Color.White)
-                    )
+                    Box(Modifier.requiredSize(10.dp).background(color = Color.White))
                 }
             }
         }
         with(rule.density) {
-            assertThat(fabPosition!!.x).isWithin(1f).of(
-                200.dp.toPx() - fabSize!!.width - fabSpacing.toPx()
-            )
-            assertThat(fabPosition!!.y).isWithin(1f).of(
-                200.dp.toPx() - fabSize!!.height - fabSpacing.toPx()
-            )
+            assertThat(fabPosition!!.x)
+                .isWithin(1f)
+                .of(200.dp.toPx() - fabSize!!.width - fabSpacing.toPx())
+            assertThat(fabPosition!!.y)
+                .isWithin(1f)
+                .of(200.dp.toPx() - fabSize!!.height - fabSpacing.toPx())
         }
     }
 
@@ -630,22 +564,22 @@
             LookaheadScope {
                 Scaffold {
                     SubcomposeLayout { constraints ->
-                        val measurables = subcompose("second") {
-                            Box(
-                                Modifier
-                                    .size(45.dp)
-                                    .onSizeChanged {
+                        val measurables =
+                            subcompose("second") {
+                                Box(
+                                    Modifier.size(45.dp).onSizeChanged {
                                         onSizeChangedCount++
                                         size = it
                                     }
-                            )
-                        }
+                                )
+                            }
                         val placeables = measurables.map { it.measure(constraints) }
 
                         layout(constraints.maxWidth, constraints.maxHeight) {
                             onPlaceCount++
                             assertWithMessage("Expected onSizeChangedCount to be >= 1")
-                                .that(onSizeChangedCount).isAtLeast(1)
+                                .that(onSizeChangedCount)
+                                .isAtLeast(1)
                             assertThat(size).isNotNull()
                             placeables.forEach { it.place(0, 0) }
                         }
diff --git a/compose/material3/material3/src/androidInstrumentedTest/kotlin/androidx/compose/material3/SearchBarScreenshotTest.kt b/compose/material3/material3/src/androidInstrumentedTest/kotlin/androidx/compose/material3/SearchBarScreenshotTest.kt
index d93530b..cff64b4 100644
--- a/compose/material3/material3/src/androidInstrumentedTest/kotlin/androidx/compose/material3/SearchBarScreenshotTest.kt
+++ b/compose/material3/material3/src/androidInstrumentedTest/kotlin/androidx/compose/material3/SearchBarScreenshotTest.kt
@@ -48,11 +48,9 @@
 @RunWith(Parameterized::class)
 @SdkSuppress(minSdkVersion = Build.VERSION_CODES.O)
 class SearchBarScreenshotTest(private val scheme: ColorSchemeWrapper) {
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
-    @get:Rule
-    val screenshotRule = AndroidXScreenshotTestRule(GOLDEN_MATERIAL3)
+    @get:Rule val screenshotRule = AndroidXScreenshotTestRule(GOLDEN_MATERIAL3)
 
     private val testTag = "SearchBar"
 
@@ -175,10 +173,11 @@
                 },
                 expanded = expanded,
                 onExpandedChange = onExpandedChange,
-                colors = SearchBarDefaults.colors(
-                    containerColor = Color.Yellow,
-                    dividerColor = Color.Green,
-                ),
+                colors =
+                    SearchBarDefaults.colors(
+                        containerColor = Color.Yellow,
+                        dividerColor = Color.Green,
+                    ),
                 content = { Text("Content") },
             )
         }
@@ -239,41 +238,31 @@
 
     @Test
     fun searchBar_predictiveBack_progress0() {
-        rule.setMaterialContent(lightColorScheme()) {
-            SearchBarPredictiveBack(progress = 0f)
-        }
+        rule.setMaterialContent(lightColorScheme()) { SearchBarPredictiveBack(progress = 0f) }
         assertAgainstGolden("searchBar_predictiveBack_progress0")
     }
 
     @Test
     fun searchBar_predictiveBack_progress25() {
-        rule.setMaterialContent(lightColorScheme()) {
-            SearchBarPredictiveBack(progress = 0.25f)
-        }
+        rule.setMaterialContent(lightColorScheme()) { SearchBarPredictiveBack(progress = 0.25f) }
         assertAgainstGolden("searchBar_predictiveBack_progress25")
     }
 
     @Test
     fun searchBar_predictiveBack_progress50() {
-        rule.setMaterialContent(lightColorScheme()) {
-            SearchBarPredictiveBack(progress = 0.50f)
-        }
+        rule.setMaterialContent(lightColorScheme()) { SearchBarPredictiveBack(progress = 0.50f) }
         assertAgainstGolden("searchBar_predictiveBack_progress50")
     }
 
     @Test
     fun searchBar_predictiveBack_progress75() {
-        rule.setMaterialContent(lightColorScheme()) {
-            SearchBarPredictiveBack(progress = 0.75f)
-        }
+        rule.setMaterialContent(lightColorScheme()) { SearchBarPredictiveBack(progress = 0.75f) }
         assertAgainstGolden("searchBar_predictiveBack_progress75")
     }
 
     @Test
     fun searchBar_predictiveBack_progress100() {
-        rule.setMaterialContent(lightColorScheme()) {
-            SearchBarPredictiveBack(progress = 1f)
-        }
+        rule.setMaterialContent(lightColorScheme()) { SearchBarPredictiveBack(progress = 1f) }
         assertAgainstGolden("searchBar_predictiveBack_progress100")
     }
 
@@ -409,10 +398,11 @@
                 },
                 expanded = true,
                 onExpandedChange = {},
-                colors = SearchBarDefaults.colors(
-                    containerColor = Color.Yellow,
-                    dividerColor = Color.Green,
-                ),
+                colors =
+                    SearchBarDefaults.colors(
+                        containerColor = Color.Yellow,
+                        dividerColor = Color.Green,
+                    ),
                 content = { Text("Content") },
             )
         }
@@ -467,18 +457,17 @@
     }
 
     private fun assertAgainstGolden(goldenName: String) {
-        rule.onNodeWithTag(testTag)
-            .captureToImage()
-            .assertAgainstGolden(screenshotRule, goldenName)
+        rule.onNodeWithTag(testTag).captureToImage().assertAgainstGolden(screenshotRule, goldenName)
     }
 
     companion object {
         @Parameterized.Parameters(name = "{0}")
         @JvmStatic
-        fun parameters() = arrayOf(
-            ColorSchemeWrapper("lightTheme", lightColorScheme()),
-            ColorSchemeWrapper("darkTheme", darkColorScheme()),
-        )
+        fun parameters() =
+            arrayOf(
+                ColorSchemeWrapper("lightTheme", lightColorScheme()),
+                ColorSchemeWrapper("darkTheme", darkColorScheme()),
+            )
     }
 
     class ColorSchemeWrapper(val name: String, val colorScheme: ColorScheme) {
diff --git a/compose/material3/material3/src/androidInstrumentedTest/kotlin/androidx/compose/material3/SearchBarTest.kt b/compose/material3/material3/src/androidInstrumentedTest/kotlin/androidx/compose/material3/SearchBarTest.kt
index 1e5e20c..2a6275b 100644
--- a/compose/material3/material3/src/androidInstrumentedTest/kotlin/androidx/compose/material3/SearchBarTest.kt
+++ b/compose/material3/material3/src/androidInstrumentedTest/kotlin/androidx/compose/material3/SearchBarTest.kt
@@ -65,8 +65,7 @@
 @MediumTest
 @RunWith(AndroidJUnit4::class)
 class SearchBarTest {
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
     private val SearchBarTestTag = "SearchBar"
     private val IconTestTag = "Icon"
@@ -80,10 +79,7 @@
                 var expanded by remember { mutableStateOf(false) }
 
                 // Extra item for initial focus.
-                Box(
-                    Modifier
-                        .size(10.dp)
-                        .focusable())
+                Box(Modifier.size(10.dp).focusable())
 
                 SearchBar(
                     modifier = Modifier.testTag(SearchBarTestTag),
@@ -144,16 +140,12 @@
                 TextField(
                     value = "",
                     onValueChange = {},
-                    modifier = Modifier
-                        .testTag("SIBLING")
-                        .focusRequester(focusRequester)
+                    modifier = Modifier.testTag("SIBLING").focusRequester(focusRequester)
                 )
             }
         }
 
-        rule.runOnIdle {
-            focusRequester.requestFocus()
-        }
+        rule.runOnIdle { focusRequester.requestFocus() }
 
         rule.onNodeWithTag("SIBLING").assertIsFocused()
 
@@ -192,23 +184,24 @@
 
     @Test
     fun searchBar_notExpandedSize() {
-        rule.setMaterialContentForSizeAssertions {
-            SearchBar(
-                inputField = {
-                    SearchBarDefaults.InputField(
-                        query = "",
-                        onQueryChange = {},
-                        onSearch = {},
-                        expanded = false,
-                        onExpandedChange = {},
-                        placeholder = { Text("Hint") },
-                    )
-                },
-                expanded = false,
-                onExpandedChange = {},
-                content = {},
-            )
-        }
+        rule
+            .setMaterialContentForSizeAssertions {
+                SearchBar(
+                    inputField = {
+                        SearchBarDefaults.InputField(
+                            query = "",
+                            onQueryChange = {},
+                            onSearch = {},
+                            expanded = false,
+                            onExpandedChange = {},
+                            placeholder = { Text("Hint") },
+                        )
+                    },
+                    expanded = false,
+                    onExpandedChange = {},
+                    content = {},
+                )
+            }
             .assertWidthIsEqualTo(SearchBarMinWidth)
             .assertHeightIsEqualTo(SearchBarDefaults.InputFieldHeight + SearchBarVerticalPadding)
     }
@@ -222,9 +215,7 @@
         rule.setMaterialContent(lightColorScheme()) {
             Box(Modifier.size(width = totalWidth, height = totalHeight)) {
                 SearchBar(
-                    modifier = Modifier.onGloballyPositioned {
-                        searchBarSize.value = it.size
-                    },
+                    modifier = Modifier.onGloballyPositioned { searchBarSize.value = it.size },
                     inputField = {
                         SearchBarDefaults.InputField(
                             query = "",
@@ -261,9 +252,8 @@
             density = LocalDensity.current
             Box(Modifier.windowInsetsPadding(WindowInsets(top = parentTopInset))) {
                 SearchBar(
-                    modifier = Modifier.onGloballyPositioned {
-                        position.value = it.positionInRoot()
-                    },
+                    modifier =
+                        Modifier.onGloballyPositioned { position.value = it.positionInRoot() },
                     windowInsets = WindowInsets(top = searchBarTopInset),
                     inputField = {
                         SearchBarDefaults.InputField(
@@ -342,10 +332,7 @@
                 var expanded by remember { mutableStateOf(false) }
 
                 // Extra item for initial focus.
-                Box(
-                    Modifier
-                        .size(10.dp)
-                        .focusable())
+                Box(Modifier.size(10.dp).focusable())
 
                 DockedSearchBar(
                     modifier = Modifier.testTag(SearchBarTestTag),
@@ -406,16 +393,12 @@
                 TextField(
                     value = "",
                     onValueChange = {},
-                    modifier = Modifier
-                        .testTag("SIBLING")
-                        .focusRequester(focusRequester)
+                    modifier = Modifier.testTag("SIBLING").focusRequester(focusRequester)
                 )
             }
         }
 
-        rule.runOnIdle {
-            focusRequester.requestFocus()
-        }
+        rule.runOnIdle { focusRequester.requestFocus() }
 
         rule.onNodeWithTag("SIBLING").assertIsFocused()
 
@@ -454,49 +437,52 @@
 
     @Test
     fun dockedSearchBar_notExpandedSize() {
-        rule.setMaterialContentForSizeAssertions {
-            DockedSearchBar(
-                inputField = {
-                    SearchBarDefaults.InputField(
-                        query = "",
-                        onQueryChange = {},
-                        onSearch = {},
-                        expanded = false,
-                        onExpandedChange = {},
-                        placeholder = { Text("Hint") },
-                    )
-                },
-                expanded = false,
-                onExpandedChange = {},
-                content = {},
-            )
-        }
+        rule
+            .setMaterialContentForSizeAssertions {
+                DockedSearchBar(
+                    inputField = {
+                        SearchBarDefaults.InputField(
+                            query = "",
+                            onQueryChange = {},
+                            onSearch = {},
+                            expanded = false,
+                            onExpandedChange = {},
+                            placeholder = { Text("Hint") },
+                        )
+                    },
+                    expanded = false,
+                    onExpandedChange = {},
+                    content = {},
+                )
+            }
             .assertWidthIsEqualTo(SearchBarMinWidth)
             .assertHeightIsEqualTo(SearchBarDefaults.InputFieldHeight)
     }
 
     @Test
     fun dockedSearchBar_expandedSize() {
-        rule.setMaterialContentForSizeAssertions {
-            DockedSearchBar(
-                inputField = {
-                    SearchBarDefaults.InputField(
-                        query = "",
-                        onQueryChange = {},
-                        onSearch = {},
-                        expanded = true,
-                        onExpandedChange = {},
-                        placeholder = { Text("Hint") },
-                    )
-                },
-                expanded = true,
-                onExpandedChange = {},
-                content = { Text("Content") },
-            )
-        }
+        rule
+            .setMaterialContentForSizeAssertions {
+                DockedSearchBar(
+                    inputField = {
+                        SearchBarDefaults.InputField(
+                            query = "",
+                            onQueryChange = {},
+                            onSearch = {},
+                            expanded = true,
+                            onExpandedChange = {},
+                            placeholder = { Text("Hint") },
+                        )
+                    },
+                    expanded = true,
+                    onExpandedChange = {},
+                    content = { Text("Content") },
+                )
+            }
             .assertWidthIsEqualTo(SearchBarMinWidth)
             .assertHeightIsEqualTo(
-                SearchBarDefaults.InputFieldHeight + DockedExpandedTableMinHeight)
+                SearchBarDefaults.InputFieldHeight + DockedExpandedTableMinHeight
+            )
     }
 
     @Test
diff --git a/compose/material3/material3/src/androidInstrumentedTest/kotlin/androidx/compose/material3/SegmentedButtonScreenshotTest.kt b/compose/material3/material3/src/androidInstrumentedTest/kotlin/androidx/compose/material3/SegmentedButtonScreenshotTest.kt
index e079c56..b250463 100644
--- a/compose/material3/material3/src/androidInstrumentedTest/kotlin/androidx/compose/material3/SegmentedButtonScreenshotTest.kt
+++ b/compose/material3/material3/src/androidInstrumentedTest/kotlin/androidx/compose/material3/SegmentedButtonScreenshotTest.kt
@@ -40,14 +40,11 @@
 @RunWith(AndroidJUnit4::class)
 @SdkSuppress(minSdkVersion = Build.VERSION_CODES.O)
 @OptIn(ExperimentalMaterial3Api::class)
-
 class SegmentedButtonScreenshotTest {
 
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
-    @get:Rule
-    val screenshotRule = AndroidXScreenshotTestRule(GOLDEN_MATERIAL3)
+    @get:Rule val screenshotRule = AndroidXScreenshotTestRule(GOLDEN_MATERIAL3)
 
     @Test
     fun all_unselected() {
@@ -110,17 +107,18 @@
                     SegmentedButton(
                         checked = index == 1,
                         onCheckedChange = {},
-                        icon = if (index == 1) {
-                            { SegmentedButtonDefaults.ActiveIcon() }
-                        } else {
-                            {
-                                Icon(
-                                    imageVector = Icons.Outlined.Favorite,
-                                    contentDescription = null,
-                                    modifier = Modifier.size(SegmentedButtonDefaults.IconSize)
-                                )
-                            }
-                        },
+                        icon =
+                            if (index == 1) {
+                                { SegmentedButtonDefaults.ActiveIcon() }
+                            } else {
+                                {
+                                    Icon(
+                                        imageVector = Icons.Outlined.Favorite,
+                                        contentDescription = null,
+                                        modifier = Modifier.size(SegmentedButtonDefaults.IconSize)
+                                    )
+                                }
+                            },
                         shape = RectangleShape,
                     ) {
                         Text(item)
@@ -135,10 +133,11 @@
     @Test
     fun stroke_zIndex() {
         rule.setMaterialContent(lightColorScheme()) {
-            val colors = SegmentedButtonDefaults.colors(
-                activeBorderColor = Color.Blue,
-                inactiveBorderColor = Color.Yellow
-            )
+            val colors =
+                SegmentedButtonDefaults.colors(
+                    activeBorderColor = Color.Blue,
+                    inactiveBorderColor = Color.Yellow
+                )
             MultiChoiceSegmentedButtonRow(modifier = Modifier.testTag(testTag)) {
                 values.forEachIndexed { index, item ->
                     SegmentedButton(
@@ -159,10 +158,11 @@
     @Test
     fun button_shape() {
         rule.setMaterialContent(lightColorScheme()) {
-            val colors = SegmentedButtonDefaults.colors(
-                activeBorderColor = Color.Blue,
-                inactiveBorderColor = Color.Yellow
-            )
+            val colors =
+                SegmentedButtonDefaults.colors(
+                    activeBorderColor = Color.Blue,
+                    inactiveBorderColor = Color.Yellow
+                )
             MultiChoiceSegmentedButtonRow(modifier = Modifier.testTag(testTag)) {
                 values.forEachIndexed { index, item ->
                     val shape = SegmentedButtonDefaults.itemShape(index, values.size)
@@ -217,9 +217,7 @@
     }
 
     private fun assertButtonAgainstGolden(goldenName: String) {
-        rule.onNodeWithTag(testTag)
-            .captureToImage()
-            .assertAgainstGolden(screenshotRule, goldenName)
+        rule.onNodeWithTag(testTag).captureToImage().assertAgainstGolden(screenshotRule, goldenName)
     }
 
     private val values = listOf("Day", "Month", "Week")
diff --git a/compose/material3/material3/src/androidInstrumentedTest/kotlin/androidx/compose/material3/SegmentedButtonTest.kt b/compose/material3/material3/src/androidInstrumentedTest/kotlin/androidx/compose/material3/SegmentedButtonTest.kt
index 10301b9..9e8e3be 100644
--- a/compose/material3/material3/src/androidInstrumentedTest/kotlin/androidx/compose/material3/SegmentedButtonTest.kt
+++ b/compose/material3/material3/src/androidInstrumentedTest/kotlin/androidx/compose/material3/SegmentedButtonTest.kt
@@ -52,8 +52,7 @@
 @RunWith(AndroidJUnit4::class)
 class SegmentedButtonTest {
 
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
     @Test
     fun toggleableSegmentedButton_itemsDisplay() {
@@ -62,11 +61,7 @@
         rule.setMaterialContent(lightColorScheme()) {
             MultiChoiceSegmentedButtonRow {
                 values.forEach {
-                    SegmentedButton(
-                        shape = RectangleShape,
-                        checked = false,
-                        onCheckedChange = {}
-                    ) {
+                    SegmentedButton(shape = RectangleShape, checked = false, onCheckedChange = {}) {
                         Text(it)
                     }
                 }
@@ -83,11 +78,7 @@
         rule.setMaterialContent(lightColorScheme()) {
             SingleChoiceSegmentedButtonRow {
                 values.forEach {
-                    SegmentedButton(
-                        shape = RectangleShape,
-                        selected = false,
-                        onClick = {}
-                    ) {
+                    SegmentedButton(shape = RectangleShape, selected = false, onClick = {}) {
                         Text(it)
                     }
                 }
@@ -122,9 +113,7 @@
         rule.onNodeWithText("Day").assertIsOn()
         rule.onNodeWithText("Month").assertIsOff()
 
-        rule.runOnIdle {
-            checked = false
-        }
+        rule.runOnIdle { checked = false }
 
         rule.onNodeWithText("Day").assertIsOff()
         rule.onNodeWithText("Month").assertIsOn()
@@ -185,34 +174,10 @@
     fun segmentedButton_Sizing() {
         val itemSize = 60.dp
 
-        rule.setMaterialContentForSizeAssertions(
-            parentMaxWidth = 300.dp, parentMaxHeight = 100.dp
-        ) {
-            MultiChoiceSegmentedButtonRow {
-                SegmentedButton(checked = false, onCheckedChange = {}, shape = RectangleShape) {
-                    Text(modifier = Modifier.width(60.dp), text = "Day")
-                }
-                SegmentedButton(checked = false, onCheckedChange = {}, shape = RectangleShape) {
-                    Text(modifier = Modifier.width(30.dp), text = "Month")
-                }
-            }
-        }
-            .assertWidthIsAtLeast((itemSize + 12.dp * 2) * 2)
-            .assertHeightIsEqualTo(48.dp)
-    }
-
-    @Test
-    fun segmentedButton_fontScale_correctSizing() {
-        val itemSize = 60.dp
-
-        rule.setMaterialContentForSizeAssertions(
-            parentMaxWidth = 300.dp, parentMaxHeight = 100.dp
-        ) {
-            CompositionLocalProvider(
-                LocalDensity provides Density(
-                    density = LocalDensity.current.density,
-                    fontScale = 2f
-                )
+        rule
+            .setMaterialContentForSizeAssertions(
+                parentMaxWidth = 300.dp,
+                parentMaxHeight = 100.dp
             ) {
                 MultiChoiceSegmentedButtonRow {
                     SegmentedButton(checked = false, onCheckedChange = {}, shape = RectangleShape) {
@@ -223,7 +188,41 @@
                     }
                 }
             }
-        }
+            .assertWidthIsAtLeast((itemSize + 12.dp * 2) * 2)
+            .assertHeightIsEqualTo(48.dp)
+    }
+
+    @Test
+    fun segmentedButton_fontScale_correctSizing() {
+        val itemSize = 60.dp
+
+        rule
+            .setMaterialContentForSizeAssertions(
+                parentMaxWidth = 300.dp,
+                parentMaxHeight = 100.dp
+            ) {
+                CompositionLocalProvider(
+                    LocalDensity provides
+                        Density(density = LocalDensity.current.density, fontScale = 2f)
+                ) {
+                    MultiChoiceSegmentedButtonRow {
+                        SegmentedButton(
+                            checked = false,
+                            onCheckedChange = {},
+                            shape = RectangleShape
+                        ) {
+                            Text(modifier = Modifier.width(60.dp), text = "Day")
+                        }
+                        SegmentedButton(
+                            checked = false,
+                            onCheckedChange = {},
+                            shape = RectangleShape
+                        ) {
+                            Text(modifier = Modifier.width(30.dp), text = "Month")
+                        }
+                    }
+                }
+            }
             .assertWidthIsAtLeast((itemSize + 12.dp * 2) * 2)
             .assertHeightIsEqualTo(53.dp)
     }
@@ -234,9 +233,10 @@
         var specColor: Color = Color.Unspecified
         rule.setMaterialContent(lightColorScheme()) {
             specColor = OutlinedSegmentedButtonTokens.OutlineColor.value
-            border = SegmentedButtonDefaults.borderStroke(
-                color = SegmentedButtonDefaults.colors().borderColor(true, true)
-            )
+            border =
+                SegmentedButtonDefaults.borderStroke(
+                    color = SegmentedButtonDefaults.colors().borderColor(true, true)
+                )
         }
 
         assertThat((border.brush as SolidColor).value).isEqualTo(specColor)
@@ -247,12 +247,13 @@
     fun segmentedButtonBorderColor_customColors_resolvesCorrectly() {
         lateinit var colors: SegmentedButtonColors
         rule.setMaterialContent(lightColorScheme()) {
-            colors = SegmentedButtonDefaults.colors(
-                activeBorderColor = Color.Magenta,
-                inactiveBorderColor = Color.Cyan,
-                disabledActiveBorderColor = Color.Yellow,
-                disabledInactiveBorderColor = Color.Green,
-            )
+            colors =
+                SegmentedButtonDefaults.colors(
+                    activeBorderColor = Color.Magenta,
+                    inactiveBorderColor = Color.Cyan,
+                    disabledActiveBorderColor = Color.Yellow,
+                    disabledInactiveBorderColor = Color.Green,
+                )
         }
 
         assertThat(colors.borderColor(active = true, enabled = true)).isEqualTo(Color.Magenta)
diff --git a/compose/material3/material3/src/androidInstrumentedTest/kotlin/androidx/compose/material3/ShapesScreenshotTest.kt b/compose/material3/material3/src/androidInstrumentedTest/kotlin/androidx/compose/material3/ShapesScreenshotTest.kt
index 4b53ee8..5000da1 100644
--- a/compose/material3/material3/src/androidInstrumentedTest/kotlin/androidx/compose/material3/ShapesScreenshotTest.kt
+++ b/compose/material3/material3/src/androidInstrumentedTest/kotlin/androidx/compose/material3/ShapesScreenshotTest.kt
@@ -46,19 +46,14 @@
 @SdkSuppress(minSdkVersion = Build.VERSION_CODES.O)
 class ShapesScreenshotTest {
 
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
-    @get:Rule
-    val screenshotRule = AndroidXScreenshotTestRule(GOLDEN_MATERIAL3)
+    @get:Rule val screenshotRule = AndroidXScreenshotTestRule(GOLDEN_MATERIAL3)
 
     @Test
     fun shapes() {
         rule.setMaterialContent(lightColorScheme()) {
-            Box(
-                Modifier
-                    .semantics(mergeDescendants = true) {}
-                    .testTag(Tag)) {
+            Box(Modifier.semantics(mergeDescendants = true) {}.testTag(Tag)) {
                 val shapes = MaterialTheme.shapes
                 Column(
                     horizontalAlignment = Alignment.CenterHorizontally,
@@ -84,9 +79,7 @@
     }
 
     private fun assertAgainstGolden(goldenName: String) {
-        rule.onNodeWithTag(Tag)
-            .captureToImage()
-            .assertAgainstGolden(screenshotRule, goldenName)
+        rule.onNodeWithTag(Tag).captureToImage().assertAgainstGolden(screenshotRule, goldenName)
     }
 
     private val Tag = "Shapes"
diff --git a/compose/material3/material3/src/androidInstrumentedTest/kotlin/androidx/compose/material3/SliderScreenshotTest.kt b/compose/material3/material3/src/androidInstrumentedTest/kotlin/androidx/compose/material3/SliderScreenshotTest.kt
index 68334b0..d4935d9 100644
--- a/compose/material3/material3/src/androidInstrumentedTest/kotlin/androidx/compose/material3/SliderScreenshotTest.kt
+++ b/compose/material3/material3/src/androidInstrumentedTest/kotlin/androidx/compose/material3/SliderScreenshotTest.kt
@@ -45,15 +45,11 @@
 @RunWith(AndroidJUnit4::class)
 @SdkSuppress(minSdkVersion = Build.VERSION_CODES.O)
 class SliderScreenshotTest {
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
-    @get:Rule
-    val screenshotRule = AndroidXScreenshotTestRule(GOLDEN_MATERIAL3)
+    @get:Rule val screenshotRule = AndroidXScreenshotTestRule(GOLDEN_MATERIAL3)
 
-    val wrap = Modifier
-        .requiredWidth(200.dp)
-        .wrapContentSize(Alignment.TopStart)
+    val wrap = Modifier.requiredWidth(200.dp).wrapContentSize(Alignment.TopStart)
 
     private val wrapperTestTag = "sliderWrapper"
 
@@ -61,11 +57,7 @@
     @Test
     fun sliderTest_origin() {
         rule.setMaterialContent(lightColorScheme()) {
-            Box(wrap.testTag(wrapperTestTag)) {
-                Slider(
-                    remember { SliderState(0f) }
-                )
-            }
+            Box(wrap.testTag(wrapperTestTag)) { Slider(remember { SliderState(0f) }) }
         }
         assertSliderAgainstGolden("slider_origin")
     }
@@ -75,11 +67,7 @@
     fun sliderTest_origin_rtl() {
         rule.setMaterialContent(lightColorScheme()) {
             CompositionLocalProvider(LocalLayoutDirection provides LayoutDirection.Rtl) {
-                Box(wrap.testTag(wrapperTestTag)) {
-                    Slider(
-                        remember { SliderState(0f) }
-                    )
-                }
+                Box(wrap.testTag(wrapperTestTag)) { Slider(remember { SliderState(0f) }) }
             }
         }
         assertSliderAgainstGolden("slider_origin_rtl")
@@ -90,10 +78,7 @@
     fun sliderTest_origin_disabled() {
         rule.setMaterialContent(lightColorScheme()) {
             Box(wrap.testTag(wrapperTestTag)) {
-                Slider(
-                    remember { SliderState(0f) },
-                    enabled = false
-                )
+                Slider(remember { SliderState(0f) }, enabled = false)
             }
         }
         assertSliderAgainstGolden("slider_origin_disabled")
@@ -103,11 +88,7 @@
     @Test
     fun sliderTest_middle() {
         rule.setMaterialContent(lightColorScheme()) {
-            Box(wrap.testTag(wrapperTestTag)) {
-                Slider(
-                    remember { SliderState(0.5f) }
-                )
-            }
+            Box(wrap.testTag(wrapperTestTag)) { Slider(remember { SliderState(0.5f) }) }
         }
         assertSliderAgainstGolden("slider_middle")
     }
@@ -119,12 +100,7 @@
             Box(wrap.testTag(wrapperTestTag)) {
                 Slider(
                     state = remember { SliderState(0.5f) },
-                    track = {
-                        SliderDefaults.Track(
-                            sliderState = it,
-                            thumbTrackGapSize = 0.dp
-                        )
-                    }
+                    track = { SliderDefaults.Track(sliderState = it, thumbTrackGapSize = 0.dp) }
                 )
             }
         }
@@ -138,12 +114,7 @@
             Box(wrap.testTag(wrapperTestTag)) {
                 Slider(
                     state = remember { SliderState(0.5f) },
-                    track = {
-                        SliderDefaults.Track(
-                            sliderState = it,
-                            trackInsideCornerSize = 0.dp
-                        )
-                    }
+                    track = { SliderDefaults.Track(sliderState = it, trackInsideCornerSize = 0.dp) }
                 )
             }
         }
@@ -157,12 +128,7 @@
             Box(wrap.testTag(wrapperTestTag)) {
                 Slider(
                     state = remember { SliderState(0.5f) },
-                    track = {
-                        SliderDefaults.Track(
-                            sliderState = it,
-                            drawStopIndicator = null
-                        )
-                    }
+                    track = { SliderDefaults.Track(sliderState = it, drawStopIndicator = null) }
                 )
             }
         }
@@ -173,11 +139,7 @@
     @Test
     fun sliderTest_middle_dark() {
         rule.setMaterialContent(darkColorScheme()) {
-            Box(wrap.testTag(wrapperTestTag)) {
-                Slider(
-                    remember { SliderState(0.5f) }
-                )
-            }
+            Box(wrap.testTag(wrapperTestTag)) { Slider(remember { SliderState(0.5f) }) }
         }
         assertSliderAgainstGolden("slider_middle_dark")
     }
@@ -187,10 +149,7 @@
     fun sliderTest_middle_dark_disabled() {
         rule.setMaterialContent(darkColorScheme()) {
             Box(wrap.testTag(wrapperTestTag)) {
-                Slider(
-                    remember { SliderState(0.5f) },
-                    enabled = false
-                )
+                Slider(remember { SliderState(0.5f) }, enabled = false)
             }
         }
         assertSliderAgainstGolden("slider_middle_dark_disabled")
@@ -200,11 +159,7 @@
     @Test
     fun sliderTest_end() {
         rule.setMaterialContent(lightColorScheme()) {
-            Box(wrap.testTag(wrapperTestTag)) {
-                Slider(
-                    remember { SliderState(1f) }
-                )
-            }
+            Box(wrap.testTag(wrapperTestTag)) { Slider(remember { SliderState(1f) }) }
         }
         assertSliderAgainstGolden("slider_end")
     }
@@ -214,11 +169,7 @@
     fun sliderTest_end_rtl() {
         rule.setMaterialContent(lightColorScheme()) {
             CompositionLocalProvider(LocalLayoutDirection provides LayoutDirection.Rtl) {
-                Box(wrap.testTag(wrapperTestTag)) {
-                    Slider(
-                        remember { SliderState(1f) }
-                    )
-                }
+                Box(wrap.testTag(wrapperTestTag)) { Slider(remember { SliderState(1f) }) }
             }
         }
         assertSliderAgainstGolden("slider_end_rtl")
@@ -228,11 +179,7 @@
     @Test
     fun sliderTest_middle_steps() {
         rule.setMaterialContent(lightColorScheme()) {
-            Box(wrap.testTag(wrapperTestTag)) {
-                Slider(
-                    remember { SliderState(0.5f, steps = 5) }
-                )
-            }
+            Box(wrap.testTag(wrapperTestTag)) { Slider(remember { SliderState(0.5f, steps = 5) }) }
         }
         assertSliderAgainstGolden("slider_middle_steps")
     }
@@ -241,11 +188,7 @@
     @Test
     fun sliderTest_middle_steps_dark() {
         rule.setMaterialContent(darkColorScheme()) {
-            Box(wrap.testTag(wrapperTestTag)) {
-                Slider(
-                    remember { SliderState(0.5f, steps = 5) }
-                )
-            }
+            Box(wrap.testTag(wrapperTestTag)) { Slider(remember { SliderState(0.5f, steps = 5) }) }
         }
         assertSliderAgainstGolden("slider_middle_steps_dark")
     }
@@ -255,10 +198,7 @@
     fun sliderTest_middle_steps_disabled() {
         rule.setMaterialContent(lightColorScheme()) {
             Box(wrap.testTag(wrapperTestTag)) {
-                Slider(
-                    remember { SliderState(0.5f, steps = 5) },
-                    enabled = false
-                )
+                Slider(remember { SliderState(0.5f, steps = 5) }, enabled = false)
             }
         }
         assertSliderAgainstGolden("slider_middle_steps_disabled")
@@ -296,12 +236,13 @@
             Box(wrap.testTag(wrapperTestTag)) {
                 Slider(
                     remember { SliderState(0.5f, steps = 5) },
-                    colors = SliderDefaults.colors(
-                        thumbColor = Color.Red,
-                        activeTrackColor = Color.Blue,
-                        activeTickColor = Color.Yellow,
-                        inactiveTickColor = Color.Magenta
-                    )
+                    colors =
+                        SliderDefaults.colors(
+                            thumbColor = Color.Red,
+                            activeTrackColor = Color.Blue,
+                            activeTickColor = Color.Yellow,
+                            inactiveTickColor = Color.Magenta
+                        )
                 )
             }
         }
@@ -318,13 +259,14 @@
                     enabled = false,
                     // this is intentionally made to appear as enabled in disabled state for a
                     // brighter test
-                    colors = SliderDefaults.colors(
-                        disabledThumbColor = Color.Blue,
-                        disabledActiveTrackColor = Color.Red,
-                        disabledInactiveTrackColor = Color.Yellow,
-                        disabledActiveTickColor = Color.Magenta,
-                        disabledInactiveTickColor = Color.Cyan
-                    )
+                    colors =
+                        SliderDefaults.colors(
+                            disabledThumbColor = Color.Blue,
+                            disabledActiveTrackColor = Color.Red,
+                            disabledInactiveTrackColor = Color.Yellow,
+                            disabledActiveTickColor = Color.Magenta,
+                            disabledInactiveTickColor = Color.Cyan
+                        )
                 )
             }
         }
@@ -335,11 +277,7 @@
     @Test
     fun sliderTest_min_corner() {
         rule.setMaterialContent(lightColorScheme()) {
-            Box(wrap.testTag(wrapperTestTag)) {
-                Slider(
-                    remember { SliderState(0.91f) }
-                )
-            }
+            Box(wrap.testTag(wrapperTestTag)) { Slider(remember { SliderState(0.91f) }) }
         }
         assertSliderAgainstGolden("slider_min_corner")
     }
@@ -350,17 +288,9 @@
         rule.setMaterialContent(lightColorScheme()) {
             Box(wrap.testTag(wrapperTestTag)) {
                 RangeSlider(
-                    state = remember {
-                        RangeSliderState(
-                            0.5f,
-                            1f
-                        )
-                    },
+                    state = remember { RangeSliderState(0.5f, 1f) },
                     track = {
-                        SliderDefaults.Track(
-                            rangeSliderState = it,
-                            thumbTrackGapSize = 0.dp
-                        )
+                        SliderDefaults.Track(rangeSliderState = it, thumbTrackGapSize = 0.dp)
                     }
                 )
             }
@@ -374,17 +304,9 @@
         rule.setMaterialContent(lightColorScheme()) {
             Box(wrap.testTag(wrapperTestTag)) {
                 RangeSlider(
-                    state = remember {
-                        RangeSliderState(
-                            0.5f,
-                            1f
-                        )
-                    },
+                    state = remember { RangeSliderState(0.5f, 1f) },
                     track = {
-                        SliderDefaults.Track(
-                            rangeSliderState = it,
-                            trackInsideCornerSize = 0.dp
-                        )
+                        SliderDefaults.Track(rangeSliderState = it, trackInsideCornerSize = 0.dp)
                     }
                 )
             }
@@ -398,17 +320,9 @@
         rule.setMaterialContent(lightColorScheme()) {
             Box(wrap.testTag(wrapperTestTag)) {
                 RangeSlider(
-                    state = remember {
-                        RangeSliderState(
-                            0.5f,
-                            1f
-                        )
-                    },
+                    state = remember { RangeSliderState(0.5f, 1f) },
                     track = {
-                        SliderDefaults.Track(
-                            rangeSliderState = it,
-                            drawStopIndicator = null
-                        )
+                        SliderDefaults.Track(rangeSliderState = it, drawStopIndicator = null)
                     }
                 )
             }
@@ -423,17 +337,9 @@
             CompositionLocalProvider(LocalLayoutDirection provides LayoutDirection.Rtl) {
                 Box(wrap.testTag(wrapperTestTag)) {
                     RangeSlider(
-                        state = remember {
-                            RangeSliderState(
-                                0.5f,
-                                1f
-                            )
-                        },
+                        state = remember { RangeSliderState(0.5f, 1f) },
                         track = {
-                            SliderDefaults.Track(
-                                rangeSliderState = it,
-                                drawStopIndicator = null
-                            )
+                            SliderDefaults.Track(rangeSliderState = it, drawStopIndicator = null)
                         }
                     )
                 }
@@ -447,12 +353,7 @@
     fun rangeSliderTest_middle_steps_disabled() {
         rule.setMaterialContent(lightColorScheme()) {
             Box(wrap.testTag(wrapperTestTag)) {
-                RangeSlider(
-                    remember {
-                        RangeSliderState(0.5f, 1f, steps = 5)
-                    },
-                    enabled = false
-                )
+                RangeSlider(remember { RangeSliderState(0.5f, 1f, steps = 5) }, enabled = false)
             }
         }
         assertSliderAgainstGolden("rangeSlider_middle_steps_disabled")
@@ -463,15 +364,7 @@
     fun rangeSliderTest_middle_steps_enabled() {
         rule.setMaterialContent(lightColorScheme()) {
             Box(wrap.testTag(wrapperTestTag)) {
-                RangeSlider(
-                    remember {
-                        RangeSliderState(
-                            0.5f,
-                            1f,
-                            steps = 5
-                        )
-                    }
-                )
+                RangeSlider(remember { RangeSliderState(0.5f, 1f, steps = 5) })
             }
         }
         assertSliderAgainstGolden("rangeSlider_middle_steps_enabled")
@@ -482,15 +375,7 @@
     fun rangeSliderTest_middle_steps_dark_enabled() {
         rule.setMaterialContent(darkColorScheme()) {
             Box(wrap.testTag(wrapperTestTag)) {
-                RangeSlider(
-                    remember {
-                        RangeSliderState(
-                            0.5f,
-                            1f,
-                            steps = 5
-                        )
-                    }
-                )
+                RangeSlider(remember { RangeSliderState(0.5f, 1f, steps = 5) })
             }
         }
         assertSliderAgainstGolden("rangeSlider_middle_steps_dark_enabled")
@@ -501,12 +386,7 @@
     fun rangeSliderTest_middle_steps_dark_disabled() {
         rule.setMaterialContent(darkColorScheme()) {
             Box(wrap.testTag(wrapperTestTag)) {
-                RangeSlider(
-                    remember {
-                        RangeSliderState(0.5f, 1f, steps = 5)
-                    },
-                    enabled = false
-                )
+                RangeSlider(remember { RangeSliderState(0.5f, 1f, steps = 5) }, enabled = false)
             }
         }
         assertSliderAgainstGolden("rangeSlider_middle_steps_dark_disabled")
@@ -518,13 +398,7 @@
         rule.setMaterialContent(lightColorScheme()) {
             Box(wrap.testTag(wrapperTestTag)) {
                 RangeSlider(
-                    state = remember {
-                        RangeSliderState(
-                            0.5f,
-                            1f,
-                            steps = 5
-                        )
-                    },
+                    state = remember { RangeSliderState(0.5f, 1f, steps = 5) },
                     track = {
                         SliderDefaults.Track(
                             rangeSliderState = it,
@@ -548,11 +422,7 @@
     fun rangeSliderTest_overlappingThumbs() {
         rule.setMaterialContent(lightColorScheme()) {
             Box(wrap.testTag(wrapperTestTag)) {
-                RangeSlider(
-                    remember {
-                        RangeSliderState(0.5f, 0.51f)
-                    }
-                )
+                RangeSlider(remember { RangeSliderState(0.5f, 0.51f) })
             }
         }
         assertSliderAgainstGolden("rangeSlider_overlappingThumbs")
@@ -562,13 +432,7 @@
     @Test
     fun rangeSliderTest_fullRange() {
         rule.setMaterialContent(lightColorScheme()) {
-            Box(wrap.testTag(wrapperTestTag)) {
-                RangeSlider(
-                    remember {
-                        RangeSliderState(0f, 1f)
-                    }
-                )
-            }
+            Box(wrap.testTag(wrapperTestTag)) { RangeSlider(remember { RangeSliderState(0f, 1f) }) }
         }
         assertSliderAgainstGolden("rangeSlider_fullRange")
     }
@@ -578,11 +442,7 @@
     fun rangeSliderTest_asymmetric_startEnd() {
         rule.setMaterialContent(lightColorScheme()) {
             Box(wrap.testTag(wrapperTestTag)) {
-                RangeSlider(
-                    remember {
-                        RangeSliderState(0.25f, 0.6f)
-                    }
-                )
+                RangeSlider(remember { RangeSliderState(0.25f, 0.6f) })
             }
         }
         assertSliderAgainstGolden("rangeSliderTest_asymmetric_startEnd")
@@ -594,11 +454,7 @@
         rule.setMaterialContent(lightColorScheme()) {
             CompositionLocalProvider(LocalLayoutDirection provides LayoutDirection.Rtl) {
                 Box(wrap.testTag(wrapperTestTag)) {
-                    RangeSlider(
-                        remember {
-                            RangeSliderState(0.25f, 0.6f)
-                        }
-                    )
+                    RangeSlider(remember { RangeSliderState(0.25f, 0.6f) })
                 }
             }
         }
@@ -611,22 +467,18 @@
         rule.setMaterialContent(lightColorScheme()) {
             Box(wrap.testTag(wrapperTestTag)) {
                 val state = remember {
-                    RangeSliderState(
-                        30f,
-                        70f,
-                        steps = 9,
-                        valueRange = 0f..100f
-                    )
+                    RangeSliderState(30f, 70f, steps = 9, valueRange = 0f..100f)
                 }
                 RangeSlider(
                     state = state,
-                    colors = SliderDefaults.colors(
-                        thumbColor = Color.Blue,
-                        activeTrackColor = Color.Red,
-                        inactiveTrackColor = Color.Yellow,
-                        activeTickColor = Color.Magenta,
-                        inactiveTickColor = Color.Cyan
-                    )
+                    colors =
+                        SliderDefaults.colors(
+                            thumbColor = Color.Blue,
+                            activeTrackColor = Color.Red,
+                            inactiveTrackColor = Color.Yellow,
+                            activeTickColor = Color.Magenta,
+                            inactiveTickColor = Color.Cyan
+                        )
                 )
             }
         }
@@ -634,7 +486,8 @@
     }
 
     private fun assertSliderAgainstGolden(goldenName: String) {
-        rule.onNodeWithTag(wrapperTestTag)
+        rule
+            .onNodeWithTag(wrapperTestTag)
             .captureToImage()
             .assertAgainstGolden(screenshotRule, goldenName)
     }
diff --git a/compose/material3/material3/src/androidInstrumentedTest/kotlin/androidx/compose/material3/SliderTest.kt b/compose/material3/material3/src/androidInstrumentedTest/kotlin/androidx/compose/material3/SliderTest.kt
index 6f6ce5d..db9331f 100644
--- a/compose/material3/material3/src/androidInstrumentedTest/kotlin/androidx/compose/material3/SliderTest.kt
+++ b/compose/material3/material3/src/androidInstrumentedTest/kotlin/androidx/compose/material3/SliderTest.kt
@@ -80,35 +80,23 @@
     private val tag = "slider"
     private val SliderTolerance = 0.003f
 
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
     @OptIn(ExperimentalMaterial3Api::class)
     @Test
     fun sliderPosition_valueCoercion() {
         val state = SliderState(0f)
-        rule.setContent {
-            Slider(
-                state = state,
-                modifier = Modifier.testTag(tag)
-            )
-        }
-        rule.runOnIdle {
-            state.value = 2f
-        }
+        rule.setContent { Slider(state = state, modifier = Modifier.testTag(tag)) }
+        rule.runOnIdle { state.value = 2f }
         rule.onNodeWithTag(tag).assertRangeInfoEquals(ProgressBarRangeInfo(1f, 0f..1f, 0))
-        rule.runOnIdle {
-            state.value = -123145f
-        }
+        rule.runOnIdle { state.value = -123145f }
         rule.onNodeWithTag(tag).assertRangeInfoEquals(ProgressBarRangeInfo(0f, 0f..1f, 0))
     }
 
     @OptIn(ExperimentalMaterial3Api::class)
     @Test(expected = IllegalArgumentException::class)
     fun sliderPosition_stepsThrowWhenLessThanZero() {
-        rule.setContent {
-            Slider(SliderState(value = 0f, steps = -1))
-        }
+        rule.setContent { Slider(SliderState(value = 0f, steps = -1)) }
     }
 
     @OptIn(ExperimentalMaterial3Api::class)
@@ -117,24 +105,19 @@
         val state = SliderState(0f)
 
         rule.setMaterialContent(lightColorScheme()) {
-            Slider(
-                state = state,
-                modifier = Modifier.testTag(tag)
-            )
+            Slider(state = state, modifier = Modifier.testTag(tag))
         }
 
-        rule.onNodeWithTag(tag)
+        rule
+            .onNodeWithTag(tag)
             .assertRangeInfoEquals(ProgressBarRangeInfo(0f, 0f..1f, 0))
             .assert(SemanticsMatcher.keyIsDefined(SemanticsActions.SetProgress))
 
-        rule.runOnUiThread {
-            state.value = 0.5f
-        }
+        rule.runOnUiThread { state.value = 0.5f }
 
         rule.onNodeWithTag(tag).assertRangeInfoEquals(ProgressBarRangeInfo(0.5f, 0f..1f, 0))
 
-        rule.onNodeWithTag(tag)
-            .performSemanticsAction(SemanticsActions.SetProgress) { it(0.7f) }
+        rule.onNodeWithTag(tag).performSemanticsAction(SemanticsActions.SetProgress) { it(0.7f) }
 
         rule.onNodeWithTag(tag).assertRangeInfoEquals(ProgressBarRangeInfo(0.7f, 0f..1f, 0))
     }
@@ -145,24 +128,19 @@
         val state = SliderState(0f, steps = 4)
 
         rule.setMaterialContent(lightColorScheme()) {
-            Slider(
-                state = state,
-                modifier = Modifier.testTag(tag)
-            )
+            Slider(state = state, modifier = Modifier.testTag(tag))
         }
 
-        rule.onNodeWithTag(tag)
+        rule
+            .onNodeWithTag(tag)
             .assertRangeInfoEquals(ProgressBarRangeInfo(0f, 0f..1f, 4))
             .assert(SemanticsMatcher.keyIsDefined(SemanticsActions.SetProgress))
 
-        rule.runOnUiThread {
-            state.value = 0.6f
-        }
+        rule.runOnUiThread { state.value = 0.6f }
 
         rule.onNodeWithTag(tag).assertRangeInfoEquals(ProgressBarRangeInfo(0.6f, 0f..1f, 4))
 
-        rule.onNodeWithTag(tag)
-            .performSemanticsAction(SemanticsActions.SetProgress) { it(0.75f) }
+        rule.onNodeWithTag(tag).performSemanticsAction(SemanticsActions.SetProgress) { it(0.75f) }
 
         rule.onNodeWithTag(tag).assertRangeInfoEquals(ProgressBarRangeInfo(0.8f, 0f..1f, 4))
     }
@@ -171,29 +149,20 @@
     @Test
     fun slider_semantics_focusable() {
         rule.setMaterialContent(lightColorScheme()) {
-            Slider(
-                SliderState(0f),
-                modifier = Modifier.testTag(tag)
-            )
+            Slider(SliderState(0f), modifier = Modifier.testTag(tag))
         }
 
-        rule.onNodeWithTag(tag)
-            .assert(SemanticsMatcher.keyIsDefined(SemanticsProperties.Focused))
+        rule.onNodeWithTag(tag).assert(SemanticsMatcher.keyIsDefined(SemanticsProperties.Focused))
     }
 
     @OptIn(ExperimentalMaterial3Api::class)
     @Test
     fun slider_semantics_disabled() {
         rule.setMaterialContent(lightColorScheme()) {
-            Slider(
-                state = SliderState(0f),
-                modifier = Modifier.testTag(tag),
-                enabled = false
-            )
+            Slider(state = SliderState(0f), modifier = Modifier.testTag(tag), enabled = false)
         }
 
-        rule.onNodeWithTag(tag)
-            .assert(SemanticsMatcher.keyIsDefined(SemanticsProperties.Disabled))
+        rule.onNodeWithTag(tag).assert(SemanticsMatcher.keyIsDefined(SemanticsProperties.Disabled))
     }
 
     @OptIn(ExperimentalMaterial3Api::class)
@@ -204,28 +173,20 @@
 
         rule.setMaterialContent(lightColorScheme()) {
             slop = LocalViewConfiguration.current.touchSlop
-            Slider(
-                state = state,
-                modifier = Modifier.testTag(tag)
-            )
+            Slider(state = state, modifier = Modifier.testTag(tag))
         }
 
-        rule.runOnUiThread {
-            Truth.assertThat(state.value).isEqualTo(0f)
-        }
+        rule.runOnUiThread { Truth.assertThat(state.value).isEqualTo(0f) }
 
         var expected = 0f
 
-        rule.onNodeWithTag(tag)
-            .performTouchInput {
-                down(center)
-                moveBy(Offset(100f, 0f))
-                up()
-                expected = calculateFraction(left, right, centerX + 100 - slop)
-            }
-        rule.runOnIdle {
-            Truth.assertThat(state.value).isWithin(SliderTolerance).of(expected)
+        rule.onNodeWithTag(tag).performTouchInput {
+            down(center)
+            moveBy(Offset(100f, 0f))
+            up()
+            expected = calculateFraction(left, right, centerX + 100 - slop)
         }
+        rule.runOnIdle { Truth.assertThat(state.value).isWithin(SliderTolerance).of(expected) }
     }
 
     @OptIn(ExperimentalMaterial3Api::class)
@@ -236,31 +197,23 @@
 
         rule.setMaterialContent(lightColorScheme()) {
             slop = LocalViewConfiguration.current.touchSlop
-            Slider(
-                state = state,
-                modifier = Modifier.testTag(tag)
-            )
+            Slider(state = state, modifier = Modifier.testTag(tag))
         }
 
-        rule.runOnUiThread {
-            Truth.assertThat(state.value).isEqualTo(0f)
-        }
+        rule.runOnUiThread { Truth.assertThat(state.value).isEqualTo(0f) }
 
         var expected = 0f
 
-        rule.onNodeWithTag(tag)
-            .performTouchInput {
-                down(center)
-                moveBy(Offset(width.toFloat(), 0f))
-                moveBy(Offset(-width.toFloat(), 0f))
-                moveBy(Offset(-width.toFloat(), 0f))
-                moveBy(Offset(width.toFloat() + 100f, 0f))
-                up()
-                expected = calculateFraction(left, right, centerX + 100 - slop)
-            }
-        rule.runOnIdle {
-            Truth.assertThat(state.value).isWithin(SliderTolerance).of(expected)
+        rule.onNodeWithTag(tag).performTouchInput {
+            down(center)
+            moveBy(Offset(width.toFloat(), 0f))
+            moveBy(Offset(-width.toFloat(), 0f))
+            moveBy(Offset(-width.toFloat(), 0f))
+            moveBy(Offset(width.toFloat() + 100f, 0f))
+            up()
+            expected = calculateFraction(left, right, centerX + 100 - slop)
         }
+        rule.runOnIdle { Truth.assertThat(state.value).isWithin(SliderTolerance).of(expected) }
     }
 
     @OptIn(ExperimentalMaterial3Api::class)
@@ -269,32 +222,22 @@
         val state = SliderState(0f)
 
         rule.setMaterialContent(lightColorScheme()) {
-            Slider(
-                state = state,
-                modifier = Modifier.testTag(tag)
-            )
+            Slider(state = state, modifier = Modifier.testTag(tag))
         }
 
-        rule.runOnUiThread {
-            Truth.assertThat(state.value).isEqualTo(0f)
-        }
+        rule.runOnUiThread { Truth.assertThat(state.value).isEqualTo(0f) }
 
         var expected = 0f
 
-        rule.onNodeWithTag(tag)
-            .performTouchInput {
-                down(Offset(centerX + 50, centerY))
-                up()
-                expected = calculateFraction(left, right, centerX + 50)
-            }
-        rule.runOnIdle {
-            Truth.assertThat(state.value).isWithin(SliderTolerance).of(expected)
+        rule.onNodeWithTag(tag).performTouchInput {
+            down(Offset(centerX + 50, centerY))
+            up()
+            expected = calculateFraction(left, right, centerX + 50)
         }
+        rule.runOnIdle { Truth.assertThat(state.value).isWithin(SliderTolerance).of(expected) }
     }
 
-    /**
-     * Guarantee slider doesn't move as we scroll, tapping still works
-     */
+    /** Guarantee slider doesn't move as we scroll, tapping still works */
     @OptIn(ExperimentalMaterial3Api::class)
     @Test
     fun slider_scrollableContainer() {
@@ -303,33 +246,29 @@
 
         rule.setContent {
             Column(
-                modifier = Modifier
-                    .height(2000.dp)
-                    .scrollable(
-                        orientation = Orientation.Vertical,
-                        state = rememberScrollableState { delta ->
-                            offset.value += delta
-                            delta
-                        })
+                modifier =
+                    Modifier.height(2000.dp)
+                        .scrollable(
+                            orientation = Orientation.Vertical,
+                            state =
+                                rememberScrollableState { delta ->
+                                    offset.value += delta
+                                    delta
+                                }
+                        )
             ) {
-                Slider(
-                    state = state,
-                    modifier = Modifier.testTag(tag)
-                )
+                Slider(state = state, modifier = Modifier.testTag(tag))
             }
         }
 
-        rule.runOnIdle {
-            Truth.assertThat(offset.value).isEqualTo(0f)
-        }
+        rule.runOnIdle { Truth.assertThat(offset.value).isEqualTo(0f) }
 
         // Just scroll
-        rule.onNodeWithTag(tag, useUnmergedTree = true)
-            .performTouchInput {
-                down(Offset(centerX, centerY))
-                moveBy(Offset(0f, 500f))
-                up()
-            }
+        rule.onNodeWithTag(tag, useUnmergedTree = true).performTouchInput {
+            down(Offset(centerX, centerY))
+            moveBy(Offset(0f, 500f))
+            up()
+        }
 
         rule.runOnIdle {
             Truth.assertThat(offset.value).isGreaterThan(0f)
@@ -338,15 +277,12 @@
 
         // Tap
         var expected = 0f
-        rule.onNodeWithTag(tag, useUnmergedTree = true)
-            .performTouchInput {
-                click(Offset(centerX, centerY))
-                expected = calculateFraction(left, right, centerX)
-            }
-
-        rule.runOnIdle {
-            Truth.assertThat(state.value).isWithin(SliderTolerance).of(expected)
+        rule.onNodeWithTag(tag, useUnmergedTree = true).performTouchInput {
+            click(Offset(centerX, centerY))
+            expected = calculateFraction(left, right, centerX)
         }
+
+        rule.runOnIdle { Truth.assertThat(state.value).isWithin(SliderTolerance).of(expected) }
     }
 
     @OptIn(ExperimentalMaterial3Api::class)
@@ -356,31 +292,21 @@
         lateinit var state: SliderState
 
         rule.setMaterialContent(lightColorScheme()) {
-            state = remember(rangeEnd.value) {
-                SliderState(0f, valueRange = 0f..rangeEnd.value)
-            }
-            Slider(
-                state = state,
-                modifier = Modifier.testTag(tag)
-            )
+            state = remember(rangeEnd.value) { SliderState(0f, valueRange = 0f..rangeEnd.value) }
+            Slider(state = state, modifier = Modifier.testTag(tag))
         }
 
         // change to 1 since [calculateFraction] coerces between 0..1
-        rule.runOnUiThread {
-            rangeEnd.value = 1f
-        }
+        rule.runOnUiThread { rangeEnd.value = 1f }
 
         var expected = 0f
 
-        rule.onNodeWithTag(tag)
-            .performTouchInput {
-                click(Offset(centerX + 50, centerY))
-                expected = calculateFraction(left, right, centerX + 50)
-            }
-
-        rule.runOnIdle {
-            Truth.assertThat(state.value).isWithin(SliderTolerance).of(expected)
+        rule.onNodeWithTag(tag).performTouchInput {
+            click(Offset(centerX + 50, centerY))
+            expected = calculateFraction(left, right, centerX + 50)
         }
+
+        rule.runOnIdle { Truth.assertThat(state.value).isWithin(SliderTolerance).of(expected) }
     }
 
     @OptIn(ExperimentalMaterial3Api::class)
@@ -392,30 +318,22 @@
         rule.setMaterialContent(lightColorScheme()) {
             CompositionLocalProvider(LocalLayoutDirection provides LayoutDirection.Rtl) {
                 slop = LocalViewConfiguration.current.touchSlop
-                Slider(
-                    state = state,
-                    modifier = Modifier.testTag(tag)
-                )
+                Slider(state = state, modifier = Modifier.testTag(tag))
             }
         }
 
-        rule.runOnUiThread {
-            Truth.assertThat(state.value).isEqualTo(0f)
-        }
+        rule.runOnUiThread { Truth.assertThat(state.value).isEqualTo(0f) }
 
         var expected = 0f
 
-        rule.onNodeWithTag(tag)
-            .performTouchInput {
-                down(center)
-                moveBy(Offset(100f, 0f))
-                up()
-                // subtract here as we're in rtl and going in the opposite direction
-                expected = calculateFraction(left, right, centerX - 100 + slop)
-            }
-        rule.runOnIdle {
-            Truth.assertThat(state.value).isWithin(SliderTolerance).of(expected)
+        rule.onNodeWithTag(tag).performTouchInput {
+            down(center)
+            moveBy(Offset(100f, 0f))
+            up()
+            // subtract here as we're in rtl and going in the opposite direction
+            expected = calculateFraction(left, right, centerX - 100 + slop)
         }
+        rule.runOnIdle { Truth.assertThat(state.value).isWithin(SliderTolerance).of(expected) }
     }
 
     @OptIn(ExperimentalMaterial3Api::class)
@@ -425,36 +343,29 @@
 
         rule.setMaterialContent(lightColorScheme()) {
             CompositionLocalProvider(LocalLayoutDirection provides LayoutDirection.Rtl) {
-                Slider(
-                    state = state,
-                    modifier = Modifier.testTag(tag)
-                )
+                Slider(state = state, modifier = Modifier.testTag(tag))
             }
         }
 
-        rule.runOnUiThread {
-            Truth.assertThat(state.value).isEqualTo(0f)
-        }
+        rule.runOnUiThread { Truth.assertThat(state.value).isEqualTo(0f) }
 
         var expected = 0f
 
-        rule.onNodeWithTag(tag)
-            .performTouchInput {
-                down(Offset(centerX + 50, centerY))
-                up()
-                expected = calculateFraction(left, right, centerX - 50)
-            }
-        rule.runOnIdle {
-            Truth.assertThat(state.value).isWithin(SliderTolerance).of(expected)
+        rule.onNodeWithTag(tag).performTouchInput {
+            down(Offset(centerX + 50, centerY))
+            up()
+            expected = calculateFraction(left, right, centerX - 50)
         }
+        rule.runOnIdle { Truth.assertThat(state.value).isWithin(SliderTolerance).of(expected) }
     }
 
-    private fun calculateFraction(left: Float, right: Float, pos: Float) = with(rule.density) {
-        val offset = (ThumbWidth / 2).toPx()
-        val start = left + offset
-        val end = right - offset
-        ((pos - start) / (end - start)).coerceIn(0f, 1f)
-    }
+    private fun calculateFraction(left: Float, right: Float, pos: Float) =
+        with(rule.density) {
+            val offset = (ThumbWidth / 2).toPx()
+            val start = left + offset
+            val end = right - offset
+            ((pos - start) / (end - start)).coerceIn(0f, 1f)
+        }
 
     @OptIn(ExperimentalMaterial3Api::class)
     @Test
@@ -464,7 +375,9 @@
             .setMaterialContentForSizeAssertions(
                 parentMaxWidth = 100.dp,
                 parentMaxHeight = 100.dp
-            ) { Slider(state) }
+            ) {
+                Slider(state)
+            }
             .assertHeightIsEqualTo(48.dp)
             .assertWidthIsEqualTo(100.dp)
     }
@@ -478,17 +391,13 @@
         rule.setMaterialContent(lightColorScheme()) {
             Row(modifier = Modifier.requiredWidth(rowWidth)) {
                 Spacer(Modifier.width(spacerWidth))
-                Slider(
-                    state = SliderState(0f),
-                    modifier = Modifier
-                        .testTag(tag)
-                        .weight(1f)
-                )
+                Slider(state = SliderState(0f), modifier = Modifier.testTag(tag).weight(1f))
                 Spacer(Modifier.width(spacerWidth))
             }
         }
 
-        rule.onNodeWithTag(tag)
+        rule
+            .onNodeWithTag(tag)
             .assertWidthIsEqualTo(rowWidth - spacerWidth.times(2))
             .assertHeightIsEqualTo(SliderTokens.HandleHeight)
     }
@@ -498,14 +407,12 @@
     fun slider_min_size() {
         rule.setMaterialContent(lightColorScheme()) {
             Box(Modifier.requiredSize(0.dp)) {
-                Slider(
-                    state = SliderState(0f),
-                    modifier = Modifier.testTag(tag)
-                )
+                Slider(state = SliderState(0f), modifier = Modifier.testTag(tag))
             }
         }
 
-        rule.onNodeWithTag(tag)
+        rule
+            .onNodeWithTag(tag)
             .assertWidthIsEqualTo(SliderTokens.HandleWidth)
             .assertHeightIsEqualTo(SliderTokens.InactiveTrackHeight)
     }
@@ -524,9 +431,7 @@
             )
         }
 
-        rule.runOnIdle {
-            Truth.assertThat(callCount.value).isEqualTo(0f)
-        }
+        rule.runOnIdle { Truth.assertThat(callCount.value).isEqualTo(0f) }
     }
 
     @OptIn(ExperimentalMaterial3Api::class)
@@ -536,15 +441,10 @@
         val state = SliderState(0f, onValueChangeFinished = { callCount.value += 1 })
 
         rule.setMaterialContent(lightColorScheme()) {
-            Slider(
-                state = state,
-                modifier = Modifier.testTag(tag)
-            )
+            Slider(state = state, modifier = Modifier.testTag(tag))
         }
 
-        rule.runOnIdle {
-            Truth.assertThat(callCount.value).isEqualTo(0)
-        }
+        rule.runOnIdle { Truth.assertThat(callCount.value).isEqualTo(0) }
 
         rule.onNodeWithTag(tag).performTouchInput {
             down(center)
@@ -552,9 +452,7 @@
             up()
         }
 
-        rule.runOnIdle {
-            Truth.assertThat(callCount.value).isEqualTo(1)
-        }
+        rule.runOnIdle { Truth.assertThat(callCount.value).isEqualTo(1) }
     }
 
     @OptIn(ExperimentalMaterial3Api::class)
@@ -564,22 +462,14 @@
         val state = SliderState(0f, onValueChangeFinished = { callCount.value += 1 })
 
         rule.setMaterialContent(lightColorScheme()) {
-            Slider(
-                state = state,
-                modifier = Modifier.testTag(tag)
-            )
+            Slider(state = state, modifier = Modifier.testTag(tag))
         }
 
-        rule.runOnIdle {
-            Truth.assertThat(callCount.value).isEqualTo(0)
-        }
+        rule.runOnIdle { Truth.assertThat(callCount.value).isEqualTo(0) }
 
-        rule.onNodeWithTag(tag)
-            .performSemanticsAction(SemanticsActions.SetProgress) { it(0.8f) }
+        rule.onNodeWithTag(tag).performSemanticsAction(SemanticsActions.SetProgress) { it(0.8f) }
 
-        rule.runOnIdle {
-            Truth.assertThat(callCount.value).isEqualTo(1)
-        }
+        rule.runOnIdle { Truth.assertThat(callCount.value).isEqualTo(1) }
     }
 
     @OptIn(ExperimentalMaterial3Api::class)
@@ -605,19 +495,14 @@
 
         val interactions = mutableListOf<Interaction>()
 
-        scope!!.launch {
-            interactionSource.interactions.collect { interactions.add(it) }
-        }
+        scope!!.launch { interactionSource.interactions.collect { interactions.add(it) } }
 
-        rule.runOnIdle {
-            Truth.assertThat(interactions).isEmpty()
-        }
+        rule.runOnIdle { Truth.assertThat(interactions).isEmpty() }
 
-        rule.onNodeWithTag(tag)
-            .performTouchInput {
-                down(center)
-                moveBy(Offset(100f, 0f))
-            }
+        rule.onNodeWithTag(tag).performTouchInput {
+            down(center)
+            moveBy(Offset(100f, 0f))
+        }
 
         rule.runOnIdle {
             Truth.assertThat(interactions).hasSize(1)
@@ -625,9 +510,7 @@
         }
 
         // Dispose
-        rule.runOnIdle {
-            emitSlider = false
-        }
+        rule.runOnIdle { emitSlider = false }
 
         rule.runOnIdle {
             Truth.assertThat(interactions).hasSize(2)
@@ -649,23 +532,18 @@
             )
         }
 
-        rule.onNodeWithTag(tag)
-            .performTouchInput {
-                click(center)
-            }
+        rule.onNodeWithTag(tag).performTouchInput { click(center) }
 
-        rule.runOnIdle {
-            Truth.assertThat(changedFlag).isTrue()
-        }
+        rule.runOnIdle { Truth.assertThat(changedFlag).isTrue() }
     }
 
     @OptIn(ExperimentalMaterial3Api::class)
     @Test
     fun slider_zero_width() {
-        rule.setMaterialContentForSizeAssertions(
-            parentMaxHeight = 0.dp,
-            parentMaxWidth = 0.dp
-        ) { Slider(SliderState(1f)) }
+        rule
+            .setMaterialContentForSizeAssertions(parentMaxHeight = 0.dp, parentMaxWidth = 0.dp) {
+                Slider(SliderState(1f))
+            }
             .assertHeightIsEqualTo(0.dp)
             .assertWidthIsEqualTo(0.dp)
     }
@@ -684,13 +562,12 @@
             )
         }
 
-        rule.onNodeWithTag(tag)
-            .performTouchInput {
-                down(center)
-                moveBy(Offset(100f, 0f))
-                moveBy(Offset(-100f, 0f))
-                moveBy(Offset(100f, 0f))
-            }
+        rule.onNodeWithTag(tag).performTouchInput {
+            down(center)
+            moveBy(Offset(100f, 0f))
+            moveBy(Offset(-100f, 0f))
+            moveBy(Offset(100f, 0f))
+        }
         rule.runOnIdle {
             Truth.assertThat(recompositionCounter.outerRecomposition).isEqualTo(1)
             Truth.assertThat(recompositionCounter.innerRecomposition).isEqualTo(4)
@@ -711,13 +588,12 @@
             )
         }
 
-        rule.onNodeWithTag(tag)
-            .performTouchInput {
-                down(center)
-                moveBy(Offset(100f, 0f))
-                moveBy(Offset(-100f, 0f))
-                moveBy(Offset(100f, 0f))
-            }
+        rule.onNodeWithTag(tag).performTouchInput {
+            down(center)
+            moveBy(Offset(100f, 0f))
+            moveBy(Offset(-100f, 0f))
+            moveBy(Offset(100f, 0f))
+        }
         rule.runOnIdle {
             Truth.assertThat(recompositionCounter.outerRecomposition).isEqualTo(1)
             Truth.assertThat(recompositionCounter.innerRecomposition).isEqualTo(4)
@@ -728,11 +604,11 @@
     @Test
     fun slider_parentWithInfiniteWidth_minWidth() {
         val state = SliderState(0f)
-        rule.setMaterialContentForSizeAssertions {
-            Box(modifier = Modifier.requiredWidth(Int.MAX_VALUE.dp)) {
-                Slider(state)
+        rule
+            .setMaterialContentForSizeAssertions {
+                Box(modifier = Modifier.requiredWidth(Int.MAX_VALUE.dp)) { Slider(state) }
             }
-        }.assertWidthIsEqualTo(48.dp)
+            .assertWidthIsEqualTo(48.dp)
     }
 
     @OptIn(ExperimentalMaterial3Api::class)
@@ -740,10 +616,7 @@
     fun slider_rowWithInfiniteWidth() {
         rule.setContent {
             Row(modifier = Modifier.requiredWidth(Int.MAX_VALUE.dp)) {
-                Slider(
-                    state = SliderState(0f),
-                    modifier = Modifier.weight(1f)
-                )
+                Slider(state = SliderState(0f), modifier = Modifier.weight(1f))
             }
         }
     }
@@ -771,30 +644,22 @@
                         )
                     }
                     slop = LocalViewConfiguration.current.touchSlop
-                    Slider(
-                        state = state,
-                        modifier = Modifier.testTag(tag)
-                    )
+                    Slider(state = state, modifier = Modifier.testTag(tag))
                 }
             )
         }
 
-        rule.runOnUiThread {
-            Truth.assertThat(state.value).isEqualTo(0f)
-        }
+        rule.runOnUiThread { Truth.assertThat(state.value).isEqualTo(0f) }
 
         var expected = 0f
 
-        rule.onNodeWithTag(tag)
-            .performTouchInput {
-                down(center)
-                moveBy(Offset(100f, 0f))
-                up()
-                expected = calculateFraction(left, right, centerX + 100 - slop)
-            }
-        rule.runOnIdle {
-            Truth.assertThat(state.value).isWithin(SliderTolerance).of(expected)
+        rule.onNodeWithTag(tag).performTouchInput {
+            down(center)
+            moveBy(Offset(100f, 0f))
+            up()
+            expected = calculateFraction(left, right, centerX + 100 - slop)
         }
+        rule.runOnIdle { Truth.assertThat(state.value).isWithin(SliderTolerance).of(expected) }
     }
 
     @OptIn(ExperimentalMaterial3Api::class)
@@ -805,10 +670,7 @@
 
         rule.setMaterialContent(lightColorScheme()) {
             slop = LocalViewConfiguration.current.touchSlop
-            RangeSlider(
-                state = state,
-                modifier = Modifier.testTag(tag)
-            )
+            RangeSlider(state = state, modifier = Modifier.testTag(tag))
         }
 
         rule.runOnUiThread {
@@ -818,13 +680,12 @@
 
         var expected = 0f
 
-        rule.onNodeWithTag(tag)
-            .performTouchInput {
-                down(center)
-                moveBy(Offset(slop, 0f))
-                moveBy(Offset(100f, 0f))
-                expected = calculateFraction(left, right, centerX + 100)
-            }
+        rule.onNodeWithTag(tag).performTouchInput {
+            down(center)
+            moveBy(Offset(slop, 0f))
+            moveBy(Offset(100f, 0f))
+            expected = calculateFraction(left, right, centerX + 100)
+        }
         rule.runOnIdle {
             Truth.assertThat(state.activeRangeStart).isEqualTo(0f)
             Truth.assertThat(state.activeRangeEnd).isWithin(SliderTolerance).of(expected)
@@ -852,17 +713,16 @@
 
         var expected = 0f
 
-        rule.onNodeWithTag(tag)
-            .performTouchInput {
-                down(center)
-                moveBy(Offset(slop, 0f))
-                moveBy(Offset(width.toFloat(), 0f))
-                moveBy(Offset(-width.toFloat(), 0f))
-                moveBy(Offset(-width.toFloat(), 0f))
-                moveBy(Offset(width.toFloat() + 100f, 0f))
-                up()
-                expected = calculateFraction(left, right, centerX + 100)
-            }
+        rule.onNodeWithTag(tag).performTouchInput {
+            down(center)
+            moveBy(Offset(slop, 0f))
+            moveBy(Offset(width.toFloat(), 0f))
+            moveBy(Offset(-width.toFloat(), 0f))
+            moveBy(Offset(-width.toFloat(), 0f))
+            moveBy(Offset(width.toFloat() + 100f, 0f))
+            up()
+            expected = calculateFraction(left, right, centerX + 100)
+        }
         rule.runOnIdle {
             Truth.assertThat(state.activeRangeStart).isEqualTo(0f)
             Truth.assertThat(state.activeRangeEnd).isWithin(SliderTolerance).of(expected)
@@ -885,25 +745,23 @@
             )
         }
 
-        rule.onNodeWithTag(tag)
-            .performTouchInput {
-                down(centerRight)
-                moveBy(Offset(-slop, 0f))
-                moveBy(Offset(-width.toFloat(), 0f))
-                up()
-            }
+        rule.onNodeWithTag(tag).performTouchInput {
+            down(centerRight)
+            moveBy(Offset(-slop, 0f))
+            moveBy(Offset(-width.toFloat(), 0f))
+            up()
+        }
         rule.runOnIdle {
             Truth.assertThat(state.activeRangeStart).isEqualTo(0.5f)
             Truth.assertThat(state.activeRangeEnd).isEqualTo(0.5f)
         }
 
-        rule.onNodeWithTag(tag)
-            .performTouchInput {
-                down(center)
-                moveBy(Offset(-slop, 0f))
-                moveBy(Offset(-width.toFloat(), 0f))
-                up()
-            }
+        rule.onNodeWithTag(tag).performTouchInput {
+            down(center)
+            moveBy(Offset(-slop, 0f))
+            moveBy(Offset(-width.toFloat(), 0f))
+            up()
+        }
         rule.runOnIdle {
             Truth.assertThat(state.activeRangeStart).isEqualTo(0f)
             Truth.assertThat(state.activeRangeEnd).isEqualTo(0.5f)
@@ -916,10 +774,7 @@
         val state = RangeSliderState(0f, 1f)
 
         rule.setMaterialContent(lightColorScheme()) {
-            RangeSlider(
-                state = state,
-                modifier = Modifier.testTag(tag)
-            )
+            RangeSlider(state = state, modifier = Modifier.testTag(tag))
         }
 
         rule.runOnUiThread {
@@ -929,12 +784,11 @@
 
         var expected = 0f
 
-        rule.onNodeWithTag(tag)
-            .performTouchInput {
-                down(Offset(centerX + 50, centerY))
-                up()
-                expected = calculateFraction(left, right, centerX + 50)
-            }
+        rule.onNodeWithTag(tag).performTouchInput {
+            down(Offset(centerX + 50, centerY))
+            up()
+            expected = calculateFraction(left, right, centerX + 50)
+        }
         rule.runOnIdle {
             Truth.assertThat(state.activeRangeEnd).isWithin(SliderTolerance).of(expected)
             Truth.assertThat(state.activeRangeStart).isEqualTo(0f)
@@ -948,31 +802,22 @@
         lateinit var state: RangeSliderState
 
         rule.setMaterialContent(lightColorScheme()) {
-            state = remember(rangeEnd.value) {
-                RangeSliderState(
-                    0f,
-                    25f,
-                    valueRange = 0f..rangeEnd.value
-                )
-            }
-            RangeSlider(
-                state = state,
-                modifier = Modifier.testTag(tag)
-            )
+            state =
+                remember(rangeEnd.value) {
+                    RangeSliderState(0f, 25f, valueRange = 0f..rangeEnd.value)
+                }
+            RangeSlider(state = state, modifier = Modifier.testTag(tag))
         }
         // change to 1 since [calculateFraction] coerces between 0..1
-        rule.runOnUiThread {
-            rangeEnd.value = 1f
-        }
+        rule.runOnUiThread { rangeEnd.value = 1f }
 
         var expected = 0f
 
-        rule.onNodeWithTag(tag)
-            .performTouchInput {
-                down(Offset(centerX + 50, centerY))
-                up()
-                expected = calculateFraction(left, right, centerX + 50)
-            }
+        rule.onNodeWithTag(tag).performTouchInput {
+            down(Offset(centerX + 50, centerY))
+            up()
+            expected = calculateFraction(left, right, centerX + 50)
+        }
 
         rule.runOnIdle {
             Truth.assertThat(state.activeRangeEnd).isWithin(SliderTolerance).of(expected)
@@ -988,10 +833,7 @@
         rule.setMaterialContent(lightColorScheme()) {
             CompositionLocalProvider(LocalLayoutDirection provides LayoutDirection.Rtl) {
                 slop = LocalViewConfiguration.current.touchSlop
-                RangeSlider(
-                    state = state,
-                    modifier = Modifier.testTag(tag)
-                )
+                RangeSlider(state = state, modifier = Modifier.testTag(tag))
             }
         }
 
@@ -1002,15 +844,14 @@
 
         var expected = 0f
 
-        rule.onNodeWithTag(tag)
-            .performTouchInput {
-                down(center)
-                moveBy(Offset(slop, 0f))
-                moveBy(Offset(100f, 0f))
-                up()
-                // subtract here as we're in rtl and going in the opposite direction
-                expected = calculateFraction(left, right, centerX - 100)
-            }
+        rule.onNodeWithTag(tag).performTouchInput {
+            down(center)
+            moveBy(Offset(slop, 0f))
+            moveBy(Offset(100f, 0f))
+            up()
+            // subtract here as we're in rtl and going in the opposite direction
+            expected = calculateFraction(left, right, centerX - 100)
+        }
         rule.runOnIdle {
             Truth.assertThat(state.activeRangeStart).isEqualTo(0f)
             Truth.assertThat(state.activeRangeEnd).isWithin(SliderTolerance).of(expected)
@@ -1026,10 +867,7 @@
         rule.setMaterialContent(lightColorScheme()) {
             CompositionLocalProvider(LocalLayoutDirection provides LayoutDirection.Rtl) {
                 slop = LocalViewConfiguration.current.touchSlop
-                RangeSlider(
-                    state = state,
-                    modifier = Modifier.testTag(tag)
-                )
+                RangeSlider(state = state, modifier = Modifier.testTag(tag))
             }
         }
 
@@ -1040,18 +878,17 @@
 
         var expected = 0f
 
-        rule.onNodeWithTag(tag)
-            .performTouchInput {
-                down(center)
-                moveBy(Offset(slop, 0f))
-                moveBy(Offset(width.toFloat(), 0f))
-                moveBy(Offset(-width.toFloat(), 0f))
-                moveBy(Offset(-width.toFloat(), 0f))
-                moveBy(Offset(width.toFloat() + 100f, 0f))
-                up()
-                // subtract here as we're in rtl and going in the opposite direction
-                expected = calculateFraction(left, right, centerX - 100)
-            }
+        rule.onNodeWithTag(tag).performTouchInput {
+            down(center)
+            moveBy(Offset(slop, 0f))
+            moveBy(Offset(width.toFloat(), 0f))
+            moveBy(Offset(-width.toFloat(), 0f))
+            moveBy(Offset(-width.toFloat(), 0f))
+            moveBy(Offset(width.toFloat() + 100f, 0f))
+            up()
+            // subtract here as we're in rtl and going in the opposite direction
+            expected = calculateFraction(left, right, centerX - 100)
+        }
         rule.runOnIdle {
             Truth.assertThat(state.activeRangeStart).isEqualTo(0f)
             Truth.assertThat(state.activeRangeEnd).isWithin(SliderTolerance).of(expected)
@@ -1066,29 +903,24 @@
 
         rule.setMaterialContent(lightColorScheme()) {
             slop = LocalViewConfiguration.current.touchSlop
-            RangeSlider(
-                state = state,
-                modifier = Modifier.testTag(tag)
-            )
+            RangeSlider(state = state, modifier = Modifier.testTag(tag))
         }
 
         rule.runOnUiThread {
-
             Truth.assertThat(state.activeRangeStart).isEqualTo(0.5f)
             Truth.assertThat(state.activeRangeEnd).isEqualTo(0.5f)
         }
 
         var expected = 0f
 
-        rule.onNodeWithTag(tag)
-            .performTouchInput {
-                down(center)
-                moveBy(Offset(slop, 0f))
-                moveBy(Offset(100f, 0f))
-                up()
-                // subtract here as we're in rtl and going in the opposite direction
-                expected = calculateFraction(left, right, centerX + 100)
-            }
+        rule.onNodeWithTag(tag).performTouchInput {
+            down(center)
+            moveBy(Offset(slop, 0f))
+            moveBy(Offset(100f, 0f))
+            up()
+            // subtract here as we're in rtl and going in the opposite direction
+            expected = calculateFraction(left, right, centerX + 100)
+        }
         rule.runOnIdle {
             Truth.assertThat(state.activeRangeStart).isEqualTo(0.5f)
             Truth.assertThat(state.activeRangeEnd).isWithin(SliderTolerance).of(expected)
@@ -1103,10 +935,7 @@
 
         rule.setMaterialContent(lightColorScheme()) {
             slop = LocalViewConfiguration.current.touchSlop
-            RangeSlider(
-                state = state,
-                modifier = Modifier.testTag(tag)
-            )
+            RangeSlider(state = state, modifier = Modifier.testTag(tag))
         }
 
         rule.runOnUiThread {
@@ -1116,15 +945,14 @@
 
         var expected = 0f
 
-        rule.onNodeWithTag(tag)
-            .performTouchInput {
-                down(center)
-                moveBy(Offset(-slop - 1, 0f))
-                moveBy(Offset(-100f, 0f))
-                up()
-                // subtract here as we're in rtl and going in the opposite direction
-                expected = calculateFraction(left, right, centerX - 100)
-            }
+        rule.onNodeWithTag(tag).performTouchInput {
+            down(center)
+            moveBy(Offset(-slop - 1, 0f))
+            moveBy(Offset(-100f, 0f))
+            up()
+            // subtract here as we're in rtl and going in the opposite direction
+            expected = calculateFraction(left, right, centerX - 100)
+        }
         rule.runOnIdle {
             Truth.assertThat(state.activeRangeStart).isWithin(SliderTolerance).of(expected)
             Truth.assertThat(state.activeRangeEnd).isEqualTo(0.5f)
@@ -1145,10 +973,8 @@
                     Spacer(Modifier.requiredSize(100.toDp()))
                     RangeSlider(
                         state = state,
-                        modifier = Modifier
-                            .testTag(tag)
-                            .weight(1f)
-                            .onGloballyPositioned {
+                        modifier =
+                            Modifier.testTag(tag).weight(1f).onGloballyPositioned {
                                 sliderBounds = it.boundsInParent()
                             }
                     )
@@ -1169,17 +995,16 @@
         val state = RangeSliderState(0f, 1f)
 
         rule.setMaterialContent(lightColorScheme()) {
-            RangeSlider(
-                state = state,
-                modifier = Modifier.testTag(tag)
-            )
+            RangeSlider(state = state, modifier = Modifier.testTag(tag))
         }
 
-        rule.onAllNodes(isFocusable(), true)[0]
+        rule
+            .onAllNodes(isFocusable(), true)[0]
             .assertRangeInfoEquals(ProgressBarRangeInfo(0f, 0f..1f, 0))
             .assert(SemanticsMatcher.keyIsDefined(SemanticsActions.SetProgress))
 
-        rule.onAllNodes(isFocusable(), true)[1]
+        rule
+            .onAllNodes(isFocusable(), true)[1]
             .assertRangeInfoEquals(ProgressBarRangeInfo(1f, 0f..1f, 0))
             .assert(SemanticsMatcher.keyIsDefined(SemanticsActions.SetProgress))
 
@@ -1188,50 +1013,42 @@
             state.activeRangeEnd = 0.75f
         }
 
-        rule.onAllNodes(isFocusable(), true)[0].assertRangeInfoEquals(
-            ProgressBarRangeInfo(
-                0.5f,
-                0f..0.75f,
-                0
-            )
-        )
+        rule
+            .onAllNodes(isFocusable(), true)[0]
+            .assertRangeInfoEquals(ProgressBarRangeInfo(0.5f, 0f..0.75f, 0))
 
-        rule.onAllNodes(isFocusable(), true)[1].assertRangeInfoEquals(
-            ProgressBarRangeInfo(
-                0.75f,
-                0.5f..1f,
-                0
-            )
-        )
+        rule
+            .onAllNodes(isFocusable(), true)[1]
+            .assertRangeInfoEquals(ProgressBarRangeInfo(0.75f, 0.5f..1f, 0))
 
-        rule.onAllNodes(isFocusable(), true)[0]
-            .performSemanticsAction(SemanticsActions.SetProgress) { it(0.6f) }
+        rule.onAllNodes(isFocusable(), true)[0].performSemanticsAction(
+            SemanticsActions.SetProgress
+        ) {
+            it(0.6f)
+        }
 
-        rule.onAllNodes(isFocusable(), true)[1]
-            .performSemanticsAction(SemanticsActions.SetProgress) { it(0.8f) }
+        rule.onAllNodes(isFocusable(), true)[1].performSemanticsAction(
+            SemanticsActions.SetProgress
+        ) {
+            it(0.8f)
+        }
 
-        rule.onAllNodes(isFocusable(), true)[0]
+        rule
+            .onAllNodes(isFocusable(), true)[0]
             .assertRangeInfoEquals(ProgressBarRangeInfo(0.6f, 0f..0.8f, 0))
 
-        rule.onAllNodes(isFocusable(), true)[1]
+        rule
+            .onAllNodes(isFocusable(), true)[1]
             .assertRangeInfoEquals(ProgressBarRangeInfo(0.8f, 0.6f..1f, 0))
     }
 
     @OptIn(ExperimentalMaterial3Api::class)
     @Test
     fun rangeSlider_semantics_stepped() {
-        val state = RangeSliderState(
-            0f,
-            20f,
-            steps = 3,
-            valueRange = 0f..20f
-        )
+        val state = RangeSliderState(0f, 20f, steps = 3, valueRange = 0f..20f)
         // Slider with [0,5,10,15,20] possible values
         rule.setMaterialContent(lightColorScheme()) {
-            RangeSlider(
-                state = state,
-                modifier = Modifier.testTag(tag)
-            )
+            RangeSlider(state = state, modifier = Modifier.testTag(tag))
         }
 
         rule.runOnUiThread {
@@ -1239,32 +1056,38 @@
             state.activeRangeEnd = 10f
         }
 
-        rule.onAllNodes(isFocusable(), true)[0].assertRangeInfoEquals(
-            ProgressBarRangeInfo(
-                5f,
-                0f..10f,
-                1
+        rule
+            .onAllNodes(isFocusable(), true)[0]
+            .assertRangeInfoEquals(ProgressBarRangeInfo(5f, 0f..10f, 1))
+
+        rule
+            .onAllNodes(isFocusable(), true)[1]
+            .assertRangeInfoEquals(
+                ProgressBarRangeInfo(
+                    10f,
+                    5f..20f,
+                    2,
+                )
             )
-        )
 
-        rule.onAllNodes(isFocusable(), true)[1].assertRangeInfoEquals(
-            ProgressBarRangeInfo(
-                10f,
-                5f..20f,
-                2,
-            )
-        )
+        rule.onAllNodes(isFocusable(), true)[0].performSemanticsAction(
+            SemanticsActions.SetProgress
+        ) {
+            it(10f)
+        }
 
-        rule.onAllNodes(isFocusable(), true)[0]
-            .performSemanticsAction(SemanticsActions.SetProgress) { it(10f) }
+        rule.onAllNodes(isFocusable(), true)[1].performSemanticsAction(
+            SemanticsActions.SetProgress
+        ) {
+            it(15f)
+        }
 
-        rule.onAllNodes(isFocusable(), true)[1]
-            .performSemanticsAction(SemanticsActions.SetProgress) { it(15f) }
-
-        rule.onAllNodes(isFocusable(), true)[0]
+        rule
+            .onAllNodes(isFocusable(), true)[0]
             .assertRangeInfoEquals(ProgressBarRangeInfo(10f, 0f..15f, 2))
 
-        rule.onAllNodes(isFocusable(), true)[1]
+        rule
+            .onAllNodes(isFocusable(), true)[1]
             .assertRangeInfoEquals(ProgressBarRangeInfo(15f, 10f..20f, 1))
     }
 
@@ -1276,41 +1099,29 @@
 
         rule.setMaterialContent(lightColorScheme()) {
             slop = LocalViewConfiguration.current.touchSlop
-            Slider(
-                state = state,
-                modifier = Modifier.testTag(tag)
-            )
+            Slider(state = state, modifier = Modifier.testTag(tag))
         }
 
-        rule.runOnUiThread {
-            Truth.assertThat(state.value).isEqualTo(.5f)
-        }
+        rule.runOnUiThread { Truth.assertThat(state.value).isEqualTo(.5f) }
 
         var expected = 0f
 
-        rule.onNodeWithTag(tag)
-            .performTouchInput {
-                down(center)
-                // move down outside the slider area
-                moveBy(Offset(0f, 500f))
-                moveBy(Offset(100f, 0f))
-                up()
-                expected = calculateFraction(left, right, centerX + 100 - slop)
-            }
-
-        rule.runOnIdle {
-            Truth.assertThat(state.value).isWithin(SliderTolerance).of(expected)
+        rule.onNodeWithTag(tag).performTouchInput {
+            down(center)
+            // move down outside the slider area
+            moveBy(Offset(0f, 500f))
+            moveBy(Offset(100f, 0f))
+            up()
+            expected = calculateFraction(left, right, centerX + 100 - slop)
         }
+
+        rule.runOnIdle { Truth.assertThat(state.value).isWithin(SliderTolerance).of(expected) }
     }
 
     @OptIn(ExperimentalMaterial3Api::class)
     @Test
     fun rangeSlider_thumb_recomposition() {
-        val state = RangeSliderState(
-            0f,
-            100f,
-            valueRange = 0f..100f
-        )
+        val state = RangeSliderState(0f, 100f, valueRange = 0f..100f)
         val startRecompositionCounter = RangeSliderRecompositionCounter()
         val endRecompositionCounter = RangeSliderRecompositionCounter()
 
@@ -1327,13 +1138,12 @@
             )
         }
 
-        rule.onNodeWithTag(tag)
-            .performTouchInput {
-                down(center)
-                moveBy(Offset(100f, 0f))
-                moveBy(Offset(-100f, 0f))
-                moveBy(Offset(100f, 0f))
-            }
+        rule.onNodeWithTag(tag).performTouchInput {
+            down(center)
+            moveBy(Offset(100f, 0f))
+            moveBy(Offset(-100f, 0f))
+            moveBy(Offset(100f, 0f))
+        }
 
         rule.runOnIdle {
             Truth.assertThat(startRecompositionCounter.outerRecomposition).isEqualTo(1)
@@ -1346,30 +1156,23 @@
     @OptIn(ExperimentalMaterial3Api::class)
     @Test
     fun rangeSlider_track_recomposition() {
-        val state = RangeSliderState(
-            0f,
-            100f,
-            valueRange = 0f..100f
-        )
+        val state = RangeSliderState(0f, 100f, valueRange = 0f..100f)
         val recompositionCounter = RangeSliderRecompositionCounter()
 
         rule.setContent {
             RangeSlider(
                 state = state,
                 modifier = Modifier.testTag(tag),
-                track = { rangeSliderState ->
-                    recompositionCounter.OuterContent(rangeSliderState)
-                }
+                track = { rangeSliderState -> recompositionCounter.OuterContent(rangeSliderState) }
             )
         }
 
-        rule.onNodeWithTag(tag)
-            .performTouchInput {
-                down(center)
-                moveBy(Offset(100f, 0f))
-                moveBy(Offset(-100f, 0f))
-                moveBy(Offset(100f, 0f))
-            }
+        rule.onNodeWithTag(tag).performTouchInput {
+            down(center)
+            moveBy(Offset(100f, 0f))
+            moveBy(Offset(-100f, 0f))
+            moveBy(Offset(100f, 0f))
+        }
 
         rule.runOnIdle {
             Truth.assertThat(recompositionCounter.outerRecomposition).isEqualTo(1)
@@ -1381,11 +1184,11 @@
     @Test
     fun rangeSlider_parentWithInfiniteWidth_minWidth() {
         val state = RangeSliderState(0f, 1f)
-        rule.setMaterialContentForSizeAssertions {
-            Box(modifier = Modifier.requiredWidth(Int.MAX_VALUE.dp)) {
-                RangeSlider(state)
+        rule
+            .setMaterialContentForSizeAssertions {
+                Box(modifier = Modifier.requiredWidth(Int.MAX_VALUE.dp)) { RangeSlider(state) }
             }
-        }.assertWidthIsEqualTo(48.dp)
+            .assertWidthIsEqualTo(48.dp)
     }
 
     @OptIn(ExperimentalMaterial3Api::class)
@@ -1394,10 +1197,7 @@
         val state = RangeSliderState(0f, 1f)
         rule.setContent {
             Row(modifier = Modifier.requiredWidth(Int.MAX_VALUE.dp)) {
-                RangeSlider(
-                    state = state,
-                    modifier = Modifier.weight(1f)
-                )
+                RangeSlider(state = state, modifier = Modifier.weight(1f))
             }
         }
     }
@@ -1426,10 +1226,7 @@
                         )
                     }
                     slop = LocalViewConfiguration.current.touchSlop
-                    RangeSlider(
-                        state = state,
-                        modifier = Modifier.testTag(tag)
-                    )
+                    RangeSlider(state = state, modifier = Modifier.testTag(tag))
                 }
             )
         }
@@ -1441,14 +1238,13 @@
 
         var expected = 0f
 
-        rule.onNodeWithTag(tag)
-            .performTouchInput {
-                down(center)
-                moveBy(Offset(slop, 0f))
-                moveBy(Offset(100f, 0f))
-                up()
-                expected = calculateFraction(left, right, centerX + 100)
-            }
+        rule.onNodeWithTag(tag).performTouchInput {
+            down(center)
+            moveBy(Offset(slop, 0f))
+            moveBy(Offset(100f, 0f))
+            up()
+            expected = calculateFraction(left, right, centerX + 100)
+        }
         rule.runOnIdle {
             Truth.assertThat(state.activeRangeStart).isEqualTo(0f)
             Truth.assertThat(state.activeRangeEnd).isWithin(SliderTolerance).of(expected)
@@ -1486,9 +1282,7 @@
 
     @Composable
     fun OuterContent(state: RangeSliderState) {
-        SideEffect {
-            ++outerRecomposition
-        }
+        SideEffect { ++outerRecomposition }
         Column {
             Text("OuterContent")
             InnerContent(state)
diff --git a/compose/material3/material3/src/androidInstrumentedTest/kotlin/androidx/compose/material3/SnackbarHostTest.kt b/compose/material3/material3/src/androidInstrumentedTest/kotlin/androidx/compose/material3/SnackbarHostTest.kt
index 1a7af1d..4ad80d5 100644
--- a/compose/material3/material3/src/androidInstrumentedTest/kotlin/androidx/compose/material3/SnackbarHostTest.kt
+++ b/compose/material3/material3/src/androidInstrumentedTest/kotlin/androidx/compose/material3/SnackbarHostTest.kt
@@ -55,8 +55,7 @@
 @LargeTest
 class SnackbarHostTest {
 
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
     @Test
     fun snackbarHost_observePushedData() {
@@ -72,14 +71,15 @@
                 }
             }
         }
-        val job = scope.launch {
-            hostState.showSnackbar("1")
-            Truth.assertThat(resultedInvocation).isEqualTo("1")
-            hostState.showSnackbar("2")
-            Truth.assertThat(resultedInvocation).isEqualTo("12")
-            hostState.showSnackbar("3")
-            Truth.assertThat(resultedInvocation).isEqualTo("123")
-        }
+        val job =
+            scope.launch {
+                hostState.showSnackbar("1")
+                Truth.assertThat(resultedInvocation).isEqualTo("1")
+                hostState.showSnackbar("2")
+                Truth.assertThat(resultedInvocation).isEqualTo("12")
+                hostState.showSnackbar("3")
+                Truth.assertThat(resultedInvocation).isEqualTo("123")
+            }
 
         rule.waitUntil { job.isCompleted }
     }
@@ -120,26 +120,22 @@
         lateinit var scope: CoroutineScope
         rule.setContent {
             scope = rememberCoroutineScope()
-            SnackbarHost(hostState) { data ->
-                Snackbar(data)
+            SnackbarHost(hostState) { data -> Snackbar(data) }
+        }
+        val job1 =
+            scope.launch {
+                val result = hostState.showSnackbar("1", actionLabel = "press")
+                Truth.assertThat(result).isEqualTo(SnackbarResult.ActionPerformed)
             }
-        }
-        val job1 = scope.launch {
-            val result = hostState.showSnackbar("1", actionLabel = "press")
-            Truth.assertThat(result).isEqualTo(SnackbarResult.ActionPerformed)
-        }
-        rule.onNodeWithText("press")
-            .performClick()
+        rule.onNodeWithText("press").performClick()
 
         rule.waitUntil { job1.isCompleted }
 
-        val job2 = scope.launch {
-            val result = hostState.showSnackbar(
-                message = "1",
-                actionLabel = null
-            )
-            Truth.assertThat(result).isEqualTo(SnackbarResult.Dismissed)
-        }
+        val job2 =
+            scope.launch {
+                val result = hostState.showSnackbar(message = "1", actionLabel = null)
+                Truth.assertThat(result).isEqualTo(SnackbarResult.Dismissed)
+            }
 
         rule.mainClock.advanceTimeBy(5_000)
         rule.waitUntil { job2.isCompleted }
@@ -154,18 +150,18 @@
             if (switchState.value) {
                 scope = rememberCoroutineScope()
             }
-            SnackbarHost(hostState) { data ->
-                Snackbar(data)
+            SnackbarHost(hostState) { data -> Snackbar(data) }
+        }
+        val job1 =
+            scope.launch {
+                hostState.showSnackbar("1")
+                Truth.assertWithMessage("Result shouldn't happen due to cancellation").fail()
             }
-        }
-        val job1 = scope.launch {
-            hostState.showSnackbar("1")
-            Truth.assertWithMessage("Result shouldn't happen due to cancellation").fail()
-        }
-        val job2 = scope.launch {
-            delay(10)
-            switchState.value = false
-        }
+        val job2 =
+            scope.launch {
+                delay(10)
+                switchState.value = false
+            }
 
         rule.waitUntil { job1.isCompleted && job2.isCompleted }
     }
@@ -176,15 +172,17 @@
         lateinit var scope: CoroutineScope
         rule.setContent {
             scope = rememberCoroutineScope()
-            SnackbarHost(hostState) { data ->
-                Snackbar(data)
+            SnackbarHost(hostState) { data -> Snackbar(data) }
+        }
+        val job1 =
+            scope.launch {
+                val result = hostState.showSnackbar("1", actionLabel = "press")
+                Truth.assertThat(result).isEqualTo(SnackbarResult.Dismissed)
             }
-        }
-        val job1 = scope.launch {
-            val result = hostState.showSnackbar("1", actionLabel = "press")
-            Truth.assertThat(result).isEqualTo(SnackbarResult.Dismissed)
-        }
-        rule.onNodeWithText("1").onParent().onParent()
+        rule
+            .onNodeWithText("1")
+            .onParent()
+            .onParent()
             .assert(
                 SemanticsMatcher.expectValue(SemanticsProperties.LiveRegion, LiveRegionMode.Polite)
             )
@@ -238,29 +236,11 @@
 
     @Test
     fun snackbarDuration_toMillis_nullAccessibilityManager() {
-        assertEquals(
-            Long.MAX_VALUE,
-            SnackbarDuration.Indefinite.toMillis(true, null)
-        )
-        assertEquals(
-            Long.MAX_VALUE,
-            SnackbarDuration.Indefinite.toMillis(false, null)
-        )
-        assertEquals(
-            10000L,
-            SnackbarDuration.Long.toMillis(true, null)
-        )
-        assertEquals(
-            10000L,
-            SnackbarDuration.Long.toMillis(false, null)
-        )
-        assertEquals(
-            4000L,
-            SnackbarDuration.Short.toMillis(true, null)
-        )
-        assertEquals(
-            4000L,
-            SnackbarDuration.Short.toMillis(false, null)
-        )
+        assertEquals(Long.MAX_VALUE, SnackbarDuration.Indefinite.toMillis(true, null))
+        assertEquals(Long.MAX_VALUE, SnackbarDuration.Indefinite.toMillis(false, null))
+        assertEquals(10000L, SnackbarDuration.Long.toMillis(true, null))
+        assertEquals(10000L, SnackbarDuration.Long.toMillis(false, null))
+        assertEquals(4000L, SnackbarDuration.Short.toMillis(true, null))
+        assertEquals(4000L, SnackbarDuration.Short.toMillis(false, null))
     }
 }
diff --git a/compose/material3/material3/src/androidInstrumentedTest/kotlin/androidx/compose/material3/SnackbarScreenshotTest.kt b/compose/material3/material3/src/androidInstrumentedTest/kotlin/androidx/compose/material3/SnackbarScreenshotTest.kt
index 6cf6d36..717e5c9 100644
--- a/compose/material3/material3/src/androidInstrumentedTest/kotlin/androidx/compose/material3/SnackbarScreenshotTest.kt
+++ b/compose/material3/material3/src/androidInstrumentedTest/kotlin/androidx/compose/material3/SnackbarScreenshotTest.kt
@@ -37,27 +37,21 @@
 @SdkSuppress(minSdkVersion = Build.VERSION_CODES.O)
 class SnackbarScreenshotTest {
 
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
-    @get:Rule
-    val screenshotRule = AndroidXScreenshotTestRule(GOLDEN_MATERIAL3)
+    @get:Rule val screenshotRule = AndroidXScreenshotTestRule(GOLDEN_MATERIAL3)
 
     private val snackbarTestTag = "snackbarTestTag"
 
     @Test
     fun snackbar_lightTheme() {
-        rule.setMaterialContent(lightColorScheme()) {
-            TestSnackbar()
-        }
+        rule.setMaterialContent(lightColorScheme()) { TestSnackbar() }
         assertAgainstGolden("snackbar_lightTheme")
     }
 
     @Test
     fun snackbar_withAction_lightTheme() {
-        rule.setMaterialContent(lightColorScheme()) {
-            TestSnackbar(showAction = true)
-        }
+        rule.setMaterialContent(lightColorScheme()) { TestSnackbar(showAction = true) }
         assertAgainstGolden("snackbar_withAction_lightTheme")
     }
 
@@ -71,17 +65,13 @@
 
     @Test
     fun snackbar_darkTheme() {
-        rule.setMaterialContent(darkColorScheme()) {
-            TestSnackbar()
-        }
+        rule.setMaterialContent(darkColorScheme()) { TestSnackbar() }
         assertAgainstGolden("snackbar_darkTheme")
     }
 
     @Test
     fun snackbar_withAction_darkTheme() {
-        rule.setMaterialContent(darkColorScheme()) {
-            TestSnackbar(showAction = true)
-        }
+        rule.setMaterialContent(darkColorScheme()) { TestSnackbar(showAction = true) }
         assertAgainstGolden("snackbar_withAction_darkTheme")
     }
 
@@ -99,29 +89,32 @@
         duration: SnackbarDuration = SnackbarDuration.Long
     ) {
         Snackbar(
-            snackbarData = object : SnackbarData {
-                override val visuals: SnackbarVisuals = object : SnackbarVisuals {
-                    override val message: String = "Snackbar message"
-                    override val actionLabel: String? = if (showAction) "Undo" else null
-                    override val withDismissAction: Boolean =
-                        duration == SnackbarDuration.Indefinite
-                    override val duration: SnackbarDuration = duration
-                }
+            snackbarData =
+                object : SnackbarData {
+                    override val visuals: SnackbarVisuals =
+                        object : SnackbarVisuals {
+                            override val message: String = "Snackbar message"
+                            override val actionLabel: String? = if (showAction) "Undo" else null
+                            override val withDismissAction: Boolean =
+                                duration == SnackbarDuration.Indefinite
+                            override val duration: SnackbarDuration = duration
+                        }
 
-                override fun performAction() {
-                    // no-op
-                }
+                    override fun performAction() {
+                        // no-op
+                    }
 
-                override fun dismiss() {
-                    // no-op
-                }
-            },
+                    override fun dismiss() {
+                        // no-op
+                    }
+                },
             modifier = Modifier.testTag(snackbarTestTag),
         )
     }
 
     private fun assertAgainstGolden(goldenName: String) {
-        rule.onNodeWithTag(snackbarTestTag)
+        rule
+            .onNodeWithTag(snackbarTestTag)
             .captureToImage()
             .assertAgainstGolden(screenshotRule, goldenName)
     }
diff --git a/compose/material3/material3/src/androidInstrumentedTest/kotlin/androidx/compose/material3/SnackbarTest.kt b/compose/material3/material3/src/androidInstrumentedTest/kotlin/androidx/compose/material3/SnackbarTest.kt
index 38861c1..45757c4e 100644
--- a/compose/material3/material3/src/androidInstrumentedTest/kotlin/androidx/compose/material3/SnackbarTest.kt
+++ b/compose/material3/material3/src/androidInstrumentedTest/kotlin/androidx/compose/material3/SnackbarTest.kt
@@ -55,11 +55,11 @@
 @RunWith(AndroidJUnit4::class)
 class SnackbarTest {
 
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
-    private val longText = "Message is very long and long and long and long and long " +
-        "and long and long and long and long and long and long"
+    private val longText =
+        "Message is very long and long and long and long and long " +
+            "and long and long and long and long and long and long"
 
     @Test
     fun defaultSnackbar_semantics() {
@@ -68,22 +68,16 @@
             Box {
                 Snackbar(
                     content = { Text("Message") },
-                    action = {
-                        TextButton(onClick = { clicked = true }) {
-                            Text("UNDO")
-                        }
-                    }
+                    action = { TextButton(onClick = { clicked = true }) { Text("UNDO") } }
                 )
             }
         }
 
-        rule.onNodeWithText("Message")
-            .assertExists()
+        rule.onNodeWithText("Message").assertExists()
 
         assertThat(clicked).isFalse()
 
-        rule.onNodeWithText("UNDO")
-            .performClick()
+        rule.onNodeWithText("UNDO").performClick()
 
         assertThat(clicked).isTrue()
     }
@@ -107,7 +101,8 @@
                 Box(Modifier.testTag("content").size(contentSize))
             }
         }
-        rule.onNodeWithTag("content")
+        rule
+            .onNodeWithTag("content")
             .assertTopPositionInRootIsEqualTo((snackbarHeight - contentSize) / 2)
     }
 
@@ -124,7 +119,9 @@
         val snackbarData =
             object : SnackbarData {
                 override val visuals: SnackbarVisuals = snackbarVisuals
+
                 override fun performAction() {}
+
                 override fun dismiss() {
                     clicked = true
                 }
@@ -142,17 +139,13 @@
 
     @Test
     fun snackbar_shortTextOnly_defaultSizes() {
-        val snackbar = rule.setMaterialContentForSizeAssertions(
-            parentMaxWidth = 300.dp
-        ) {
-            Snackbar(
-                content = {
-                    Text("Message")
+        val snackbar =
+            rule
+                .setMaterialContentForSizeAssertions(parentMaxWidth = 300.dp) {
+                    Snackbar(content = { Text("Message") })
                 }
-            )
-        }
-            .assertWidthIsEqualTo(300.dp)
-            .assertHeightIsEqualTo(48.dp)
+                .assertWidthIsEqualTo(300.dp)
+                .assertHeightIsEqualTo(48.dp)
 
         val firstBaseLine = rule.onNodeWithText("Message").getAlignmentLinePosition(FirstBaseline)
         val lastBaseLine = rule.onNodeWithText("Message").getAlignmentLinePosition(LastBaseline)
@@ -170,16 +163,12 @@
 
     @Test
     fun snackbar_shortTextOnly_bigFont_centered() {
-        val snackbar = rule.setMaterialContentForSizeAssertions(
-            parentMaxWidth = 300.dp
-        ) {
-            Snackbar(
-                content = {
-                    Text("Message", fontSize = 30.sp)
+        val snackbar =
+            rule
+                .setMaterialContentForSizeAssertions(parentMaxWidth = 300.dp) {
+                    Snackbar(content = { Text("Message", fontSize = 30.sp) })
                 }
-            )
-        }
-            .assertWidthIsEqualTo(300.dp)
+                .assertWidthIsEqualTo(300.dp)
 
         val firstBaseLine = rule.onNodeWithText("Message").getAlignmentLinePosition(FirstBaseline)
         val lastBaseLine = rule.onNodeWithText("Message").getAlignmentLinePosition(LastBaseline)
@@ -197,25 +186,23 @@
 
     @Test
     fun snackbar_shortTextAndButton_alignment() {
-        val snackbar = rule.setMaterialContentForSizeAssertions(
-            parentMaxWidth = 300.dp
-        ) {
-            Snackbar(
-                content = {
-                    Text("Message")
-                },
-                action = {
-                    TextButton(
-                        onClick = {},
-                        modifier = Modifier.clipToBounds().testTag("button")
-                    ) {
-                        Text("Undo")
-                    }
+        val snackbar =
+            rule
+                .setMaterialContentForSizeAssertions(parentMaxWidth = 300.dp) {
+                    Snackbar(
+                        content = { Text("Message") },
+                        action = {
+                            TextButton(
+                                onClick = {},
+                                modifier = Modifier.clipToBounds().testTag("button")
+                            ) {
+                                Text("Undo")
+                            }
+                        }
+                    )
                 }
-            )
-        }
-            .assertWidthIsEqualTo(300.dp)
-            .assertHeightIsEqualTo(48.dp)
+                .assertWidthIsEqualTo(300.dp)
+                .assertHeightIsEqualTo(48.dp)
 
         val textBaseLine = rule.onNodeWithText("Message").getAlignmentLinePosition(FirstBaseline)
         val buttonBaseLine = rule.onNodeWithTag("button").getAlignmentLinePosition(FirstBaseline)
@@ -236,24 +223,18 @@
 
     @Test
     fun snackbar_shortTextAndButton_bigFont_alignment() {
-        val snackbar = rule.setMaterialContentForSizeAssertions(
-            parentMaxWidth = 400.dp
-        ) {
-            val fontSize = 30.sp
-            Snackbar(
-                content = {
-                    Text("Message", fontSize = fontSize)
-                },
-                action = {
-                    TextButton(
-                        onClick = {},
-                        modifier = Modifier.testTag("button")
-                    ) {
-                        Text("Undo", fontSize = fontSize)
+        val snackbar =
+            rule.setMaterialContentForSizeAssertions(parentMaxWidth = 400.dp) {
+                val fontSize = 30.sp
+                Snackbar(
+                    content = { Text("Message", fontSize = fontSize) },
+                    action = {
+                        TextButton(onClick = {}, modifier = Modifier.testTag("button")) {
+                            Text("Undo", fontSize = fontSize)
+                        }
                     }
-                }
-            )
-        }
+                )
+            }
 
         val textBaseLine = rule.onNodeWithText("Message").getAlignmentLinePosition(FirstBaseline)
         val buttonBaseLine = rule.onNodeWithTag("button").getAlignmentLinePosition(FirstBaseline)
@@ -274,17 +255,13 @@
 
     @Test
     fun snackbar_longText_sizes() {
-        val snackbar = rule.setMaterialContentForSizeAssertions(
-            parentMaxWidth = 300.dp
-        ) {
-            Snackbar(
-                content = {
-                    Text(longText, Modifier.testTag("text"), maxLines = 2)
+        val snackbar =
+            rule
+                .setMaterialContentForSizeAssertions(parentMaxWidth = 300.dp) {
+                    Snackbar(content = { Text(longText, Modifier.testTag("text"), maxLines = 2) })
                 }
-            )
-        }
-            .assertWidthIsEqualTo(300.dp)
-            .assertHeightIsEqualTo(68.dp)
+                .assertWidthIsEqualTo(300.dp)
+                .assertHeightIsEqualTo(68.dp)
 
         val firstBaseline = rule.onNodeWithTag("text").getFirstBaselinePosition()
         val lastBaseline = rule.onNodeWithTag("text").getLastBaselinePosition()
@@ -304,25 +281,20 @@
 
     @Test
     fun snackbar_longTextAndButton_alignment() {
-        val snackbar = rule.setMaterialContentForSizeAssertions(
-            parentMaxWidth = 300.dp
-        ) {
-            Snackbar(
-                content = {
-                    Text(longText, Modifier.testTag("text"), maxLines = 2)
-                },
-                action = {
-                    TextButton(
-                        modifier = Modifier.testTag("button"),
-                        onClick = {}
-                    ) {
-                        Text("Undo")
-                    }
+        val snackbar =
+            rule
+                .setMaterialContentForSizeAssertions(parentMaxWidth = 300.dp) {
+                    Snackbar(
+                        content = { Text(longText, Modifier.testTag("text"), maxLines = 2) },
+                        action = {
+                            TextButton(modifier = Modifier.testTag("button"), onClick = {}) {
+                                Text("Undo")
+                            }
+                        }
+                    )
                 }
-            )
-        }
-            .assertWidthIsEqualTo(300.dp)
-            .assertHeightIsEqualTo(68.dp)
+                .assertWidthIsEqualTo(300.dp)
+                .assertHeightIsEqualTo(68.dp)
 
         val textFirstBaseLine = rule.onNodeWithTag("text").getFirstBaselinePosition()
         val textLastBaseLine = rule.onNodeWithTag("text").getLastBaselinePosition()
@@ -331,8 +303,7 @@
         textLastBaseLine.assertIsNotEqualTo(0.dp, "last baseline")
         textFirstBaseLine.assertIsNotEqualTo(textLastBaseLine, "first baseline")
 
-        rule.onNodeWithTag("text")
-            .assertTopPositionInRootIsEqualTo(30.dp - textFirstBaseLine)
+        rule.onNodeWithTag("text").assertTopPositionInRootIsEqualTo(30.dp - textFirstBaseLine)
 
         val buttonBounds = rule.onNodeWithTag("button").getUnclippedBoundsInRoot()
         val snackBounds = snackbar.getUnclippedBoundsInRoot()
@@ -343,38 +314,35 @@
 
     @Test
     fun snackbar_textAndButtonOnSeparateLine_alignment() {
-        val snackbar = rule.setMaterialContentForSizeAssertions(
-            parentMaxWidth = 300.dp
-        ) {
-            Snackbar(
-                content = {
-                    Text("Message", Modifier.sizeIn(minWidth = 48.dp, minHeight = 48.dp))
-                },
-                action = {
-                    TextButton(
-                        onClick = {},
-                        modifier = Modifier.testTag("button")
-                    ) {
-                        Text("Undo", Modifier.sizeIn(minWidth = 48.dp, minHeight = 48.dp))
-                    }
-                },
-                actionOnNewLine = true
-            )
-        }
+        val snackbar =
+            rule.setMaterialContentForSizeAssertions(parentMaxWidth = 300.dp) {
+                Snackbar(
+                    content = {
+                        Text("Message", Modifier.sizeIn(minWidth = 48.dp, minHeight = 48.dp))
+                    },
+                    action = {
+                        TextButton(onClick = {}, modifier = Modifier.testTag("button")) {
+                            Text("Undo", Modifier.sizeIn(minWidth = 48.dp, minHeight = 48.dp))
+                        }
+                    },
+                    actionOnNewLine = true
+                )
+            }
 
         val textFirstBaseLine = rule.onNodeWithText("Message").getFirstBaselinePosition()
         val textLastBaseLine = rule.onNodeWithText("Message").getLastBaselinePosition()
         val textBounds = rule.onNodeWithText("Message").getUnclippedBoundsInRoot()
         val buttonBounds = rule.onNodeWithTag("button").getUnclippedBoundsInRoot()
 
-        rule.onNodeWithText("Message")
-            .assertTopPositionInRootIsEqualTo(30.dp - textFirstBaseLine)
+        rule.onNodeWithText("Message").assertTopPositionInRootIsEqualTo(30.dp - textFirstBaseLine)
 
         val lastBaselineToBottom = max(18.dp, 48.dp - textLastBaseLine)
 
-        rule.onNodeWithTag("button").assertTopPositionInRootIsEqualTo(
-            lastBaselineToBottom + textBounds.top + textLastBaseLine
-        )
+        rule
+            .onNodeWithTag("button")
+            .assertTopPositionInRootIsEqualTo(
+                lastBaselineToBottom + textBounds.top + textLastBaseLine
+            )
 
         snackbar
             .assertHeightIsEqualTo(2.dp + buttonBounds.top + buttonBounds.height)
@@ -384,34 +352,32 @@
     @Test
     fun defaultSnackbar_dataVersion_proxiesParameters() {
         var clicked = false
-        val snackbarVisuals = object : SnackbarVisuals {
-            override val message: String = "Data message"
-            override val actionLabel: String = "UNDO"
-            override val withDismissAction: Boolean = false
-            override val duration: SnackbarDuration = SnackbarDuration.Short
-        }
-        val snackbarData = object : SnackbarData {
-            override val visuals: SnackbarVisuals = snackbarVisuals
-
-            override fun performAction() {
-                clicked = true
+        val snackbarVisuals =
+            object : SnackbarVisuals {
+                override val message: String = "Data message"
+                override val actionLabel: String = "UNDO"
+                override val withDismissAction: Boolean = false
+                override val duration: SnackbarDuration = SnackbarDuration.Short
             }
+        val snackbarData =
+            object : SnackbarData {
+                override val visuals: SnackbarVisuals = snackbarVisuals
 
-            override fun dismiss() {}
-        }
+                override fun performAction() {
+                    clicked = true
+                }
+
+                override fun dismiss() {}
+            }
         rule.setMaterialContent(lightColorScheme()) {
-            Box {
-                Snackbar(snackbarData = snackbarData)
-            }
+            Box { Snackbar(snackbarData = snackbarData) }
         }
 
-        rule.onNodeWithText("Data message")
-            .assertExists()
+        rule.onNodeWithText("Data message").assertExists()
 
         assertThat(clicked).isFalse()
 
-        rule.onNodeWithText("UNDO")
-            .performClick()
+        rule.onNodeWithText("UNDO").performClick()
 
         assertThat(clicked).isTrue()
     }
diff --git a/compose/material3/material3/src/androidInstrumentedTest/kotlin/androidx/compose/material3/SurfaceContentColorTest.kt b/compose/material3/material3/src/androidInstrumentedTest/kotlin/androidx/compose/material3/SurfaceContentColorTest.kt
index 9080c10..43c27e9 100644
--- a/compose/material3/material3/src/androidInstrumentedTest/kotlin/androidx/compose/material3/SurfaceContentColorTest.kt
+++ b/compose/material3/material3/src/androidInstrumentedTest/kotlin/androidx/compose/material3/SurfaceContentColorTest.kt
@@ -29,8 +29,7 @@
 @RunWith(AndroidJUnit4::class)
 class SurfaceContentColorTest {
 
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
     @Test
     fun surfaceSetsCorrectContentColors_primary() {
diff --git a/compose/material3/material3/src/androidInstrumentedTest/kotlin/androidx/compose/material3/SurfaceTest.kt b/compose/material3/material3/src/androidInstrumentedTest/kotlin/androidx/compose/material3/SurfaceTest.kt
index a57c7a1..1215573 100644
--- a/compose/material3/material3/src/androidInstrumentedTest/kotlin/androidx/compose/material3/SurfaceTest.kt
+++ b/compose/material3/material3/src/androidInstrumentedTest/kotlin/androidx/compose/material3/SurfaceTest.kt
@@ -75,8 +75,7 @@
 @RunWith(AndroidJUnit4::class)
 class SurfaceTest {
 
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
     @SdkSuppress(minSdkVersion = Build.VERSION_CODES.O)
     @Test
@@ -85,12 +84,7 @@
         var surfaceColor: Color = Color.Unspecified
         rule.setMaterialContent(lightColorScheme()) {
             surfaceColor = MaterialTheme.colorScheme.surface
-            Box(
-                Modifier
-                    .size(10.dp, 10.dp)
-                    .semantics(mergeDescendants = true) {}
-                    .testTag("box")
-            ) {
+            Box(Modifier.size(10.dp, 10.dp).semantics(mergeDescendants = true) {}.testTag("box")) {
                 Surface(color = surfaceColor, tonalElevation = 0.dp) {
                     absoluteTonalElevation = LocalAbsoluteTonalElevation.current
                     Box(Modifier.fillMaxSize())
@@ -98,11 +92,10 @@
             }
         }
 
-        rule.runOnIdle {
-            Truth.assertThat(absoluteTonalElevation).isEqualTo(0.dp)
-        }
+        rule.runOnIdle { Truth.assertThat(absoluteTonalElevation).isEqualTo(0.dp) }
 
-        rule.onNodeWithTag("box")
+        rule
+            .onNodeWithTag("box")
             .captureToImage()
             .assertShape(
                 density = rule.density,
@@ -120,12 +113,7 @@
         var surfaceColor: Color
         rule.setMaterialContent(lightColorScheme()) {
             surfaceColor = MaterialTheme.colorScheme.surface
-            Box(
-                Modifier
-                    .size(10.dp, 10.dp)
-                    .semantics(mergeDescendants = true) {}
-                    .testTag("box")
-            ) {
+            Box(Modifier.size(10.dp, 10.dp).semantics(mergeDescendants = true) {}.testTag("box")) {
                 Surface(color = surfaceColor, tonalElevation = 2.dp) {
                     absoluteTonalElevation = LocalAbsoluteTonalElevation.current
                     Box(Modifier.fillMaxSize())
@@ -138,11 +126,10 @@
             }
         }
 
-        rule.runOnIdle {
-            Truth.assertThat(absoluteTonalElevation).isEqualTo(2.dp)
-        }
+        rule.runOnIdle { Truth.assertThat(absoluteTonalElevation).isEqualTo(2.dp) }
 
-        rule.onNodeWithTag("box")
+        rule
+            .onNodeWithTag("box")
             .captureToImage()
             .assertShape(
                 density = rule.density,
@@ -162,10 +149,7 @@
             CompositionLocalProvider(LocalTonalElevationEnabled provides false) {
                 surfaceColor = MaterialTheme.colorScheme.surface
                 Box(
-                    Modifier
-                        .size(10.dp, 10.dp)
-                        .semantics(mergeDescendants = true) {}
-                        .testTag("box")
+                    Modifier.size(10.dp, 10.dp).semantics(mergeDescendants = true) {}.testTag("box")
                 ) {
                     Surface(color = surfaceColor, tonalElevation = 2.dp) {
                         absoluteTonalElevation = LocalAbsoluteTonalElevation.current
@@ -185,7 +169,8 @@
             Truth.assertThat(surfaceColor).isEqualTo(surfaceTonalColor)
         }
 
-        rule.onNodeWithTag("box")
+        rule
+            .onNodeWithTag("box")
             .captureToImage()
             .assertShape(
                 density = rule.density,
@@ -200,12 +185,7 @@
     fun tonalElevationColorIsNotSetOnNonSurfaceColor() {
         var absoluteTonalElevation: Dp = 0.dp
         rule.setMaterialContent(lightColorScheme()) {
-            Box(
-                Modifier
-                    .size(10.dp, 10.dp)
-                    .semantics(mergeDescendants = true) {}
-                    .testTag("box")
-            ) {
+            Box(Modifier.size(10.dp, 10.dp).semantics(mergeDescendants = true) {}.testTag("box")) {
                 Surface(color = Color.Green, tonalElevation = 2.dp) {
                     Box(Modifier.fillMaxSize())
                     absoluteTonalElevation = LocalAbsoluteTonalElevation.current
@@ -213,11 +193,10 @@
             }
         }
 
-        rule.runOnIdle {
-            Truth.assertThat(absoluteTonalElevation).isEqualTo(2.dp)
-        }
+        rule.runOnIdle { Truth.assertThat(absoluteTonalElevation).isEqualTo(2.dp) }
 
-        rule.onNodeWithTag("box")
+        rule
+            .onNodeWithTag("box")
             .captureToImage()
             .assertShape(
                 density = rule.density,
@@ -252,16 +231,13 @@
         rule.setMaterialContent(lightColorScheme()) {
             Column {
                 Box(
-                    Modifier
-                        .padding(10.dp)
+                    Modifier.padding(10.dp)
                         .size(10.dp, 10.dp)
                         .semantics(mergeDescendants = true) {}
                         .testTag("top level")
                 ) {
                     Surface(
-                        Modifier
-                            .fillMaxSize()
-                            .padding(0.dp),
+                        Modifier.fillMaxSize().padding(0.dp),
                         tonalElevation = 2.dp,
                         shadowElevation = 2.dp,
                         color = Color.Blue,
@@ -270,20 +246,15 @@
                 }
 
                 // Set LocalAbsoluteTonalElevation to increase the absolute elevation
-                CompositionLocalProvider(
-                    LocalAbsoluteTonalElevation provides 2.dp
-                ) {
+                CompositionLocalProvider(LocalAbsoluteTonalElevation provides 2.dp) {
                     Box(
-                        Modifier
-                            .padding(10.dp)
+                        Modifier.padding(10.dp)
                             .size(10.dp, 10.dp)
                             .semantics(mergeDescendants = true) {}
                             .testTag("nested")
                     ) {
                         Surface(
-                            Modifier
-                                .fillMaxSize()
-                                .padding(0.dp),
+                            Modifier.fillMaxSize().padding(0.dp),
                             tonalElevation = 0.dp,
                             shadowElevation = 2.dp,
                             color = Color.Blue,
@@ -295,12 +266,9 @@
         }
 
         val topLevelSurfaceBitmap = rule.onNodeWithTag("top level").captureToImage()
-        val nestedSurfaceBitmap = rule.onNodeWithTag("nested").captureToImage()
-            .asAndroidBitmap()
+        val nestedSurfaceBitmap = rule.onNodeWithTag("nested").captureToImage().asAndroidBitmap()
 
-        topLevelSurfaceBitmap.assertPixels {
-            Color(nestedSurfaceBitmap.getPixel(it.x, it.y))
-        }
+        topLevelSurfaceBitmap.assertPixels { Color(nestedSurfaceBitmap.getPixel(it.x, it.y)) }
     }
 
     /**
@@ -325,9 +293,7 @@
             }
         }
 
-        rule.runOnIdle {
-            Truth.assertThat(contentColor).isEqualTo(expectedColor)
-        }
+        rule.runOnIdle { Truth.assertThat(contentColor).isEqualTo(expectedColor) }
     }
 
     @Test
@@ -342,7 +308,8 @@
                 Spacer(Modifier.size(30.dp))
             }
         }
-        rule.onNodeWithTag("surface")
+        rule
+            .onNodeWithTag("surface")
             .assertHasClickAction()
             .assert(SemanticsMatcher.keyNotDefined(SemanticsProperties.Role))
             .assertIsEnabled()
@@ -358,15 +325,14 @@
         rule.setMaterialContent(lightColorScheme()) {
             Surface(
                 onClick = { count.value += 1 },
-                modifier = Modifier
-                    .semantics { role = Role.Checkbox }
-                    .testTag("surface"),
+                modifier = Modifier.semantics { role = Role.Checkbox }.testTag("surface"),
             ) {
                 Text("${count.value}")
                 Spacer(Modifier.size(30.dp))
             }
         }
-        rule.onNodeWithTag("surface")
+        rule
+            .onNodeWithTag("surface")
             .assertHasClickAction()
             .assert(SemanticsMatcher.expectValue(SemanticsProperties.Role, Role.Checkbox))
             .assertIsEnabled()
@@ -380,10 +346,9 @@
     fun clickable_clickAction() {
         val count = mutableStateOf(0f)
         rule.setMaterialContent(lightColorScheme()) {
-            Surface(
-                onClick = { count.value += 1 },
-                modifier = Modifier.testTag("surface")
-            ) { Spacer(Modifier.size(30.dp)) }
+            Surface(onClick = { count.value += 1 }, modifier = Modifier.testTag("surface")) {
+                Spacer(Modifier.size(30.dp))
+            }
         }
         rule.onNodeWithTag("surface").performClick()
         Truth.assertThat(count.value).isEqualTo(1)
@@ -400,7 +365,9 @@
                 onClick = { count.value += 1 },
                 modifier = Modifier.testTag("surface"),
                 shape = CircleShape
-            ) { Spacer(Modifier.size(100.dp)) }
+            ) {
+                Spacer(Modifier.size(100.dp))
+            }
         }
         // Click inside the circular shape bounds. Expecting an increase in count.
         rule.onNodeWithTag("surface").performClick()
@@ -419,7 +386,9 @@
                 onClick = { count.value += 1 },
                 modifier = Modifier.testTag("surface"),
                 shape = CircleShape
-            ) { Spacer(Modifier.size(40.dp)) }
+            ) {
+                Spacer(Modifier.size(40.dp))
+            }
         }
         // Click inside the circular shape bounds. Expecting an increase in count.
         rule.onNodeWithTag("surface").performClick()
@@ -438,29 +407,24 @@
         val interactionSource = MutableInteractionSource()
         rule.setMaterialContent(lightColorScheme()) {
             Surface(
-                modifier = Modifier
-                    .testTag("surface")
-                    .clickable(
-                        interactionSource = interactionSource,
-                        indication = null,
-                        enabled = enabled.value,
-                        onClick = { count.value += 1 },
-                    )
-            ) { Spacer(Modifier.size(30.dp)) }
+                modifier =
+                    Modifier.testTag("surface")
+                        .clickable(
+                            interactionSource = interactionSource,
+                            indication = null,
+                            enabled = enabled.value,
+                            onClick = { count.value += 1 },
+                        )
+            ) {
+                Spacer(Modifier.size(30.dp))
+            }
         }
-        rule.onNodeWithTag("surface")
-            .assertIsEnabled()
-            .performClick()
+        rule.onNodeWithTag("surface").assertIsEnabled().performClick()
 
         Truth.assertThat(count.value).isEqualTo(1)
-        rule.runOnIdle {
-            enabled.value = false
-        }
+        rule.runOnIdle { enabled.value = false }
 
-        rule.onNodeWithTag("surface")
-            .assertIsNotEnabled()
-            .performClick()
-            .performClick()
+        rule.onNodeWithTag("surface").assertIsNotEnabled().performClick().performClick()
         Truth.assertThat(count.value).isEqualTo(1)
     }
 
@@ -476,8 +440,7 @@
             scope = rememberCoroutineScope()
             Surface(
                 onClick = {},
-                modifier =
-                Modifier.testTag("surface"),
+                modifier = Modifier.testTag("surface"),
                 interactionSource = interactionSource,
             ) {
                 Spacer(Modifier.size(30.dp))
@@ -486,16 +449,11 @@
 
         val interactions = mutableListOf<Interaction>()
 
-        scope!!.launch {
-            interactionSource.interactions.collect { interactions.add(it) }
-        }
+        scope!!.launch { interactionSource.interactions.collect { interactions.add(it) } }
 
-        rule.runOnIdle {
-            Truth.assertThat(interactions).isEmpty()
-        }
+        rule.runOnIdle { Truth.assertThat(interactions).isEmpty() }
 
-        rule.onNodeWithTag("surface")
-            .performTouchInput { down(center) }
+        rule.onNodeWithTag("surface").performTouchInput { down(center) }
 
         // Advance past the tap timeout
         rule.mainClock.advanceTimeBy(100)
@@ -505,8 +463,7 @@
             Truth.assertThat(interactions.first()).isInstanceOf(PressInteraction.Press::class.java)
         }
 
-        rule.onNodeWithTag("surface")
-            .performTouchInput { up() }
+        rule.onNodeWithTag("surface").performTouchInput { up() }
 
         rule.runOnIdle {
             Truth.assertThat(interactions).hasSize(2)
@@ -523,15 +480,13 @@
         rule.setContent {
             Box(Modifier.fillMaxSize()) {
                 Button(
-                    modifier = Modifier
-                        .fillMaxSize()
-                        .testTag("clickable"),
+                    modifier = Modifier.fillMaxSize().testTag("clickable"),
                     onClick = { state.value += 1 }
-                ) { Text("button fullscreen") }
+                ) {
+                    Text("button fullscreen")
+                }
                 Surface(
-                    Modifier
-                        .fillMaxSize()
-                        .testTag("surface"),
+                    Modifier.fillMaxSize().testTag("surface"),
                 ) {}
             }
         }
@@ -553,7 +508,8 @@
                 Spacer(Modifier.size(30.dp))
             }
         }
-        rule.onNodeWithTag("surface")
+        rule
+            .onNodeWithTag("surface")
             .assertHasClickAction()
             .assert(SemanticsMatcher.keyNotDefined(SemanticsProperties.Role))
             .assertIsEnabled()
@@ -570,15 +526,14 @@
             Surface(
                 selected = selected.value,
                 onClick = { selected.value = !selected.value },
-                modifier = Modifier
-                    .semantics { role = Role.Switch }
-                    .testTag("surface"),
+                modifier = Modifier.semantics { role = Role.Switch }.testTag("surface"),
             ) {
                 Text("${selected.value}")
                 Spacer(Modifier.size(30.dp))
             }
         }
-        rule.onNodeWithTag("surface")
+        rule
+            .onNodeWithTag("surface")
             .assertHasClickAction()
             .assert(SemanticsMatcher.expectValue(SemanticsProperties.Role, Role.Switch))
             .assertIsEnabled()
@@ -596,7 +551,9 @@
                 selected = selected.value,
                 onClick = { selected.value = !selected.value },
                 modifier = Modifier.testTag("surface")
-            ) { Spacer(Modifier.size(30.dp)) }
+            ) {
+                Spacer(Modifier.size(30.dp))
+            }
         }
         rule.onNodeWithTag("surface").performClick()
         Truth.assertThat(selected.value).isTrue()
@@ -614,7 +571,9 @@
                 onClick = { selected.value = !selected.value },
                 modifier = Modifier.testTag("surface"),
                 shape = CircleShape
-            ) { Spacer(Modifier.size(100.dp)) }
+            ) {
+                Spacer(Modifier.size(100.dp))
+            }
         }
         // Click inside the circular shape bounds. Expecting a selection change.
         rule.onNodeWithTag("surface").performClick()
@@ -634,7 +593,9 @@
                 onClick = { selected.value = !selected.value },
                 modifier = Modifier.testTag("surface"),
                 shape = CircleShape
-            ) { Spacer(Modifier.size(40.dp)) }
+            ) {
+                Spacer(Modifier.size(40.dp))
+            }
         }
         // Click inside the circular shape bounds. Expecting a selection change.
         rule.onNodeWithTag("surface").performClick()
@@ -659,7 +620,8 @@
                 Spacer(Modifier.size(30.dp))
             }
         }
-        rule.onNodeWithTag("surface")
+        rule
+            .onNodeWithTag("surface")
             .assertHasClickAction()
             .assert(SemanticsMatcher.keyNotDefined(SemanticsProperties.Role))
             .assertIsEnabled()
@@ -676,15 +638,14 @@
             Surface(
                 checked = toggled.value,
                 onCheckedChange = { toggled.value = !toggled.value },
-                modifier = Modifier
-                    .semantics { role = Role.Tab }
-                    .testTag("surface"),
+                modifier = Modifier.semantics { role = Role.Tab }.testTag("surface"),
             ) {
                 Text("${toggled.value}")
                 Spacer(Modifier.size(30.dp))
             }
         }
-        rule.onNodeWithTag("surface")
+        rule
+            .onNodeWithTag("surface")
             .assertHasClickAction()
             .assert(SemanticsMatcher.expectValue(SemanticsProperties.Role, Role.Tab))
             .assertIsEnabled()
@@ -702,7 +663,9 @@
                 checked = toggled.value,
                 onCheckedChange = { toggled.value = !toggled.value },
                 modifier = Modifier.testTag("surface")
-            ) { Spacer(Modifier.size(30.dp)) }
+            ) {
+                Spacer(Modifier.size(30.dp))
+            }
         }
         rule.onNodeWithTag("surface").performClick()
         Truth.assertThat(toggled.value).isTrue()
@@ -720,7 +683,9 @@
                 onCheckedChange = { checked.value = !checked.value },
                 modifier = Modifier.testTag("surface"),
                 shape = CircleShape
-            ) { Spacer(Modifier.size(100.dp)) }
+            ) {
+                Spacer(Modifier.size(100.dp))
+            }
         }
         // Click inside the circular shape bounds. Expecting a checked state change.
         rule.onNodeWithTag("surface").performClick()
@@ -740,7 +705,9 @@
                 onCheckedChange = { checked.value = !checked.value },
                 modifier = Modifier.testTag("surface"),
                 shape = CircleShape
-            ) { Spacer(Modifier.size(40.dp)) }
+            ) {
+                Spacer(Modifier.size(40.dp))
+            }
         }
         // Click inside the circular shape bounds. Expecting a checked state change.
         rule.onNodeWithTag("surface").performClick()
@@ -759,32 +726,24 @@
         rule.setContent {
             Box(Modifier.fillMaxSize()) {
                 Surface(
-                    Modifier
-                        .fillMaxSize()
-                        .testTag("surface"),
+                    Modifier.fillMaxSize().testTag("surface"),
                 ) {
                     Box(
-                        Modifier
-                            .fillMaxSize()
-                            .testTag("clickable")
-                            .pointerInput(Unit) {
-                                awaitEachGesture {
-                                    hitTested.value = true
-                                    val event = awaitPointerEvent(PointerEventPass.Final)
-                                    Truth
-                                        .assertThat(event.changes[0].isConsumed)
-                                        .isFalse()
-                                }
+                        Modifier.fillMaxSize().testTag("clickable").pointerInput(Unit) {
+                            awaitEachGesture {
+                                hitTested.value = true
+                                val event = awaitPointerEvent(PointerEventPass.Final)
+                                Truth.assertThat(event.changes[0].isConsumed).isFalse()
                             }
+                        }
                     )
                 }
             }
         }
-        rule.onNodeWithTag("clickable")
-            .performTouchInput {
-                down(center)
-                up()
-            }
+        rule.onNodeWithTag("clickable").performTouchInput {
+            down(center)
+            up()
+        }
         Truth.assertThat(hitTested.value).isTrue()
     }
 }
diff --git a/compose/material3/material3/src/androidInstrumentedTest/kotlin/androidx/compose/material3/SwipeToDismissTest.kt b/compose/material3/material3/src/androidInstrumentedTest/kotlin/androidx/compose/material3/SwipeToDismissTest.kt
index f879b0c..f5fed47 100644
--- a/compose/material3/material3/src/androidInstrumentedTest/kotlin/androidx/compose/material3/SwipeToDismissTest.kt
+++ b/compose/material3/material3/src/androidInstrumentedTest/kotlin/androidx/compose/material3/SwipeToDismissTest.kt
@@ -52,8 +52,7 @@
 @MediumTest
 @RunWith(AndroidJUnit4::class)
 class SwipeToDismissTest {
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
     private val backgroundTag = "background"
     private val dismissContentTag = "dismissContent"
@@ -68,17 +67,13 @@
         rule.setContent {
             SwipeToDismissBox(
                 state = rememberSwipeToDismissBoxState(SwipeToDismissBoxValue.Settled),
-                backgroundContent = { }
+                backgroundContent = {}
             ) {
-                    Box(
-                        Modifier
-                            .fillMaxSize()
-                            .testTag(dismissContentTag)
-                    ) }
+                Box(Modifier.fillMaxSize().testTag(dismissContentTag))
+            }
         }
 
-        rule.onNodeWithTag(dismissContentTag)
-            .assertLeftPositionInRootIsEqualTo(0.dp)
+        rule.onNodeWithTag(dismissContentTag).assertLeftPositionInRootIsEqualTo(0.dp)
     }
 
     @Test
@@ -86,19 +81,14 @@
         rule.setContent {
             SwipeToDismissBox(
                 state = rememberSwipeToDismissBoxState(SwipeToDismissBoxValue.StartToEnd),
-                backgroundContent = { }
+                backgroundContent = {}
             ) {
-                Box(
-                    Modifier
-                        .fillMaxSize()
-                        .testTag(dismissContentTag)
-                )
+                Box(Modifier.fillMaxSize().testTag(dismissContentTag))
             }
         }
 
         val width = rule.rootWidth()
-        rule.onNodeWithTag(dismissContentTag)
-            .assertLeftPositionInRootIsEqualTo(width)
+        rule.onNodeWithTag(dismissContentTag).assertLeftPositionInRootIsEqualTo(width)
     }
 
     @Test
@@ -107,20 +97,15 @@
             CompositionLocalProvider(LocalLayoutDirection provides LayoutDirection.Rtl) {
                 SwipeToDismissBox(
                     state = rememberSwipeToDismissBoxState(SwipeToDismissBoxValue.StartToEnd),
-                    backgroundContent = { }
+                    backgroundContent = {}
                 ) {
-                    Box(
-                        Modifier
-                            .fillMaxSize()
-                            .testTag(dismissContentTag)
-                    )
+                    Box(Modifier.fillMaxSize().testTag(dismissContentTag))
                 }
             }
         }
 
         val width = rule.rootWidth()
-        rule.onNodeWithTag(dismissContentTag)
-            .assertLeftPositionInRootIsEqualTo(-width)
+        rule.onNodeWithTag(dismissContentTag).assertLeftPositionInRootIsEqualTo(-width)
     }
 
     @Test
@@ -128,19 +113,14 @@
         rule.setContent {
             SwipeToDismissBox(
                 state = rememberSwipeToDismissBoxState(SwipeToDismissBoxValue.EndToStart),
-                backgroundContent = { },
+                backgroundContent = {},
             ) {
-                Box(
-                    Modifier
-                        .fillMaxSize()
-                        .testTag(dismissContentTag)
-                )
+                Box(Modifier.fillMaxSize().testTag(dismissContentTag))
             }
         }
 
         val width = rule.rootWidth()
-        rule.onNodeWithTag(dismissContentTag)
-            .assertLeftPositionInRootIsEqualTo(-width)
+        rule.onNodeWithTag(dismissContentTag).assertLeftPositionInRootIsEqualTo(-width)
     }
 
     @Test
@@ -149,20 +129,15 @@
             CompositionLocalProvider(LocalLayoutDirection provides LayoutDirection.Rtl) {
                 SwipeToDismissBox(
                     state = rememberSwipeToDismissBoxState(SwipeToDismissBoxValue.EndToStart),
-                    backgroundContent = { },
+                    backgroundContent = {},
                 ) {
-                    Box(
-                        Modifier
-                            .fillMaxSize()
-                            .testTag(dismissContentTag)
-                    )
+                    Box(Modifier.fillMaxSize().testTag(dismissContentTag))
                 }
             }
         }
 
         val width = rule.rootWidth()
-        rule.onNodeWithTag(dismissContentTag)
-            .assertLeftPositionInRootIsEqualTo(width)
+        rule.onNodeWithTag(dismissContentTag).assertLeftPositionInRootIsEqualTo(width)
     }
 
     @Test
@@ -170,18 +145,13 @@
         rule.setContent {
             SwipeToDismissBox(
                 state = rememberSwipeToDismissBoxState(SwipeToDismissBoxValue.Settled),
-                backgroundContent = {
-                    Box(
-                        Modifier
-                            .fillMaxSize()
-                            .testTag(backgroundTag)
-                    )
-                }
-            ) { Box(Modifier.size(100.dp)) }
+                backgroundContent = { Box(Modifier.fillMaxSize().testTag(backgroundTag)) }
+            ) {
+                Box(Modifier.size(100.dp))
+            }
         }
 
-        rule.onNodeWithTag(backgroundTag)
-            .assertIsSquareWithSize(100.dp)
+        rule.onNodeWithTag(backgroundTag).assertIsSquareWithSize(100.dp)
     }
 
     @Test
@@ -194,8 +164,10 @@
                 modifier = Modifier.testTag(swipeDismissTag),
                 enableDismissFromStartToEnd = true,
                 enableDismissFromEndToStart = false,
-                backgroundContent = { }
-            ) { Box(Modifier.fillMaxSize()) }
+                backgroundContent = {}
+            ) {
+                Box(Modifier.fillMaxSize())
+            }
         }
 
         rule.onNodeWithTag(swipeDismissTag).performTouchInput { swipeRight() }
@@ -218,8 +190,10 @@
                 modifier = Modifier.testTag(swipeDismissTag),
                 enableDismissFromStartToEnd = false,
                 enableDismissFromEndToStart = true,
-                backgroundContent = { },
-            ) { Box(Modifier.fillMaxSize()) }
+                backgroundContent = {},
+            ) {
+                Box(Modifier.fillMaxSize())
+            }
         }
 
         rule.onNodeWithTag(swipeDismissTag).performTouchInput { swipeLeft() }
@@ -243,8 +217,10 @@
                     modifier = Modifier.testTag(swipeDismissTag),
                     enableDismissFromStartToEnd = true,
                     enableDismissFromEndToStart = false,
-                    backgroundContent = { },
-                ) { Box(Modifier.fillMaxSize()) }
+                    backgroundContent = {},
+                ) {
+                    Box(Modifier.fillMaxSize())
+                }
             }
         }
 
@@ -269,8 +245,10 @@
                     modifier = Modifier.testTag(swipeDismissTag),
                     enableDismissFromStartToEnd = false,
                     enableDismissFromEndToStart = true,
-                    backgroundContent = { },
-                ) { Box(Modifier.fillMaxSize()) }
+                    backgroundContent = {},
+                ) {
+                    Box(Modifier.fillMaxSize())
+                }
             }
         }
 
@@ -294,8 +272,10 @@
                 modifier = Modifier.testTag(swipeDismissTag),
                 enableDismissFromStartToEnd = false,
                 enableDismissFromEndToStart = false,
-                backgroundContent = { },
-            ) { Box(Modifier.fillMaxSize()) }
+                backgroundContent = {},
+            ) {
+                Box(Modifier.fillMaxSize())
+            }
         }
 
         rule.onNodeWithTag(swipeDismissTag).performTouchInput { swipeRight() }
@@ -341,12 +321,10 @@
                             composedItems[index]!!.currentValue == SwipeToDismissBoxValue.EndToStart
                         AnimatedVisibility(visible = !isDismissed) {
                             SwipeToDismissBox(
-                                modifier = Modifier
-                                    .height(48.dp)
-                                    .fillMaxWidth(),
+                                modifier = Modifier.height(48.dp).fillMaxWidth(),
                                 state = composedItems[index]!!,
-                                backgroundContent = { },
-                                content = { }
+                                backgroundContent = {},
+                                content = {}
                             )
                         }
                     }
@@ -358,18 +336,17 @@
         // be composed and measured/placed
         val initiallyVisibleItems = lazyState.layoutInfo.visibleItemsInfo.size
         assertWithMessage(
-            "Expected visible items to be less than total items so that there are " +
-                "items left to compose later."
-        )
+                "Expected visible items to be less than total items so that there are " +
+                    "items left to compose later."
+            )
             .that(initiallyVisibleItems)
             .isLessThan(amountOfItems)
         assertWithMessage("Expected composed items to match amount of visible items")
             .that(composedItems)
             .hasSize(initiallyVisibleItems)
         assertWithMessage(
-            "Expected that item at index $initiallyVisibleItems was not " +
-                "composed yet"
-        )
+                "Expected that item at index $initiallyVisibleItems was not " + "composed yet"
+            )
             .that(composedItems)
             .doesNotContainKey(initiallyVisibleItems)
 
@@ -381,9 +358,9 @@
 
         // Assert a new item has been
         assertWithMessage(
-            "Expected a new item to have been composed at index " +
-                "${initiallyVisibleItems + 1}"
-        )
+                "Expected a new item to have been composed at index " +
+                    "${initiallyVisibleItems + 1}"
+            )
             .that(lazyState.layoutInfo.visibleItemsInfo)
             .hasSize(initiallyVisibleItems + 1)
         val newItemIndex = lazyState.layoutInfo.visibleItemsInfo.size - 1
@@ -403,8 +380,10 @@
                 state = swipeToDismissBoxState,
                 modifier = Modifier.testTag(swipeDismissTag),
                 gesturesEnabled = false,
-                backgroundContent = { }
-            ) { Box(Modifier.fillMaxSize()) }
+                backgroundContent = {}
+            ) {
+                Box(Modifier.fillMaxSize())
+            }
         }
 
         rule.onNodeWithTag(swipeDismissTag).performTouchInput { swipeRight() }
diff --git a/compose/material3/material3/src/androidInstrumentedTest/kotlin/androidx/compose/material3/SwitchScreenshotTest.kt b/compose/material3/material3/src/androidInstrumentedTest/kotlin/androidx/compose/material3/SwitchScreenshotTest.kt
index 2171704..a67b6cf 100644
--- a/compose/material3/material3/src/androidInstrumentedTest/kotlin/androidx/compose/material3/SwitchScreenshotTest.kt
+++ b/compose/material3/material3/src/androidInstrumentedTest/kotlin/androidx/compose/material3/SwitchScreenshotTest.kt
@@ -64,32 +64,28 @@
 @OptIn(ExperimentalTestApi::class)
 class SwitchScreenshotTest {
 
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
-    @get:Rule
-    val screenshotRule = AndroidXScreenshotTestRule(GOLDEN_MATERIAL3)
+    @get:Rule val screenshotRule = AndroidXScreenshotTestRule(GOLDEN_MATERIAL3)
 
     // TODO(b/267253920): Add a compose test API to set/reset InputMode.
     @After
-    fun resetTouchMode() = with(InstrumentationRegistry.getInstrumentation()) {
-        if (SDK_INT < 33) setInTouchMode(true) else resetInTouchMode()
-    }
+    fun resetTouchMode() =
+        with(InstrumentationRegistry.getInstrumentation()) {
+            if (SDK_INT < 33) setInTouchMode(true) else resetInTouchMode()
+        }
 
     // TODO: this test tag as well as Boxes inside testa are temporarty, remove then b/157687898
     //  is fixed
     private val wrapperTestTag = "switchWrapper"
 
-    private val wrapperModifier = Modifier
-        .wrapContentSize(Alignment.TopStart)
-        .testTag(wrapperTestTag)
+    private val wrapperModifier =
+        Modifier.wrapContentSize(Alignment.TopStart).testTag(wrapperTestTag)
 
     @Test
     fun switchTest_checked() {
         rule.setMaterialContent(lightColorScheme()) {
-            Box(wrapperModifier) {
-                Switch(checked = true, onCheckedChange = { })
-            }
+            Box(wrapperModifier) { Switch(checked = true, onCheckedChange = {}) }
         }
         assertToggeableAgainstGolden("switch_checked")
     }
@@ -99,7 +95,7 @@
         rule.setMaterialContent(lightColorScheme()) {
             Box(wrapperModifier) {
                 CompositionLocalProvider(LocalLayoutDirection provides LayoutDirection.Rtl) {
-                    Switch(checked = true, onCheckedChange = { })
+                    Switch(checked = true, onCheckedChange = {})
                 }
             }
         }
@@ -112,7 +108,7 @@
             Box(wrapperModifier) {
                 Switch(
                     checked = true,
-                    onCheckedChange = { },
+                    onCheckedChange = {},
                     colors = SwitchDefaults.colors(checkedThumbColor = Color.Red)
                 )
             }
@@ -123,9 +119,7 @@
     @Test
     fun switchTest_unchecked() {
         rule.setMaterialContent(lightColorScheme()) {
-            Box(wrapperModifier) {
-                Switch(checked = false, onCheckedChange = { })
-            }
+            Box(wrapperModifier) { Switch(checked = false, onCheckedChange = {}) }
         }
         assertToggeableAgainstGolden("switch_unchecked")
     }
@@ -135,7 +129,7 @@
         rule.setMaterialContent(lightColorScheme()) {
             Box(wrapperModifier) {
                 CompositionLocalProvider(LocalLayoutDirection provides LayoutDirection.Rtl) {
-                    Switch(checked = false, onCheckedChange = { })
+                    Switch(checked = false, onCheckedChange = {})
                 }
             }
         }
@@ -145,14 +139,10 @@
     @Test
     fun switchTest_pressed() {
         rule.setMaterialContent(lightColorScheme()) {
-            Box(wrapperModifier) {
-                Switch(checked = false, enabled = true, onCheckedChange = { })
-            }
+            Box(wrapperModifier) { Switch(checked = false, enabled = true, onCheckedChange = {}) }
         }
 
-        rule.onNode(isToggleable()).performTouchInput {
-            down(center)
-        }
+        rule.onNode(isToggleable()).performTouchInput { down(center) }
 
         // Ripples are drawn on the RenderThread, not the main (UI) thread, so we can't wait for
         // synchronization. Instead just wait until after the ripples are finished animating.
@@ -164,9 +154,7 @@
     @Test
     fun switchTest_disabled_checked() {
         rule.setMaterialContent(lightColorScheme()) {
-            Box(wrapperModifier) {
-                Switch(checked = true, enabled = false, onCheckedChange = { })
-            }
+            Box(wrapperModifier) { Switch(checked = true, enabled = false, onCheckedChange = {}) }
         }
         assertToggeableAgainstGolden("switch_disabled_checked")
     }
@@ -174,9 +162,7 @@
     @Test
     fun switchTest_disabled_unchecked() {
         rule.setMaterialContent(lightColorScheme()) {
-            Box(wrapperModifier) {
-                Switch(checked = false, enabled = false, onCheckedChange = { })
-            }
+            Box(wrapperModifier) { Switch(checked = false, enabled = false, onCheckedChange = {}) }
         }
         assertToggeableAgainstGolden("switch_disabled_unchecked")
     }
@@ -186,19 +172,20 @@
         rule.setMaterialContent(lightColorScheme()) {
             val isChecked = remember { mutableStateOf(false) }
             Box(wrapperModifier) {
-                Switch(
-                    checked = isChecked.value,
-                    onCheckedChange = { isChecked.value = it }
-                )
+                Switch(checked = isChecked.value, onCheckedChange = { isChecked.value = it })
             }
         }
 
         rule.mainClock.autoAdvance = false
 
-        rule.onNode(isToggleable())
+        rule
+            .onNode(isToggleable())
             // split click into (down) and (move, up) to enforce a composition in between
             .performTouchInput { down(center) }
-            .performTouchInput { move(); up() }
+            .performTouchInput {
+                move()
+                up()
+            }
 
         rule.waitForIdle()
         rule.mainClock.advanceTimeBy(milliseconds = 100)
@@ -215,19 +202,20 @@
         rule.setMaterialContent(lightColorScheme()) {
             val isChecked = remember { mutableStateOf(true) }
             Box(wrapperModifier) {
-                Switch(
-                    checked = isChecked.value,
-                    onCheckedChange = { isChecked.value = it }
-                )
+                Switch(checked = isChecked.value, onCheckedChange = { isChecked.value = it })
             }
         }
 
         rule.mainClock.autoAdvance = false
 
-        rule.onNode(isToggleable())
+        rule
+            .onNode(isToggleable())
             // split click into (down) and (move, up) to enforce a composition in between
             .performTouchInput { down(center) }
-            .performTouchInput { move(); up() }
+            .performTouchInput {
+                move()
+                up()
+            }
 
         rule.waitForIdle()
         rule.mainClock.advanceTimeBy(milliseconds = 100)
@@ -242,16 +230,10 @@
     @Test
     fun switchTest_hover() {
         rule.setMaterialContent(lightColorScheme()) {
-            Box(wrapperModifier) {
-                Switch(
-                    checked = true,
-                    onCheckedChange = { }
-                )
-            }
+            Box(wrapperModifier) { Switch(checked = true, onCheckedChange = {}) }
         }
 
-        rule.onNode(isToggleable())
-            .performMouseInput { enter(center) }
+        rule.onNode(isToggleable()).performMouseInput { enter(center) }
 
         rule.waitForIdle()
 
@@ -268,9 +250,8 @@
             Box(wrapperModifier) {
                 Switch(
                     checked = true,
-                    onCheckedChange = { },
-                    modifier = Modifier
-                        .focusRequester(focusRequester)
+                    onCheckedChange = {},
+                    modifier = Modifier.focusRequester(focusRequester)
                 )
             }
         }
@@ -297,11 +278,7 @@
                 )
             }
             Box(wrapperModifier) {
-                Switch(
-                    checked = true,
-                    onCheckedChange = { },
-                    thumbContent = icon
-                )
+                Switch(checked = true, onCheckedChange = {}, thumbContent = icon)
             }
         }
 
@@ -319,11 +296,7 @@
                 )
             }
             Box(wrapperModifier) {
-                Switch(
-                    checked = false,
-                    onCheckedChange = { },
-                    thumbContent = icon
-                )
+                Switch(checked = false, onCheckedChange = {}, thumbContent = icon)
             }
         }
 
@@ -331,7 +304,8 @@
     }
 
     private fun assertToggeableAgainstGolden(goldenName: String) {
-        rule.onNodeWithTag(wrapperTestTag)
+        rule
+            .onNodeWithTag(wrapperTestTag)
             .captureToImage()
             .assertAgainstGolden(screenshotRule, goldenName)
     }
diff --git a/compose/material3/material3/src/androidInstrumentedTest/kotlin/androidx/compose/material3/SwitchTest.kt b/compose/material3/material3/src/androidInstrumentedTest/kotlin/androidx/compose/material3/SwitchTest.kt
index d3d74bd..cd70824 100644
--- a/compose/material3/material3/src/androidInstrumentedTest/kotlin/androidx/compose/material3/SwitchTest.kt
+++ b/compose/material3/material3/src/androidInstrumentedTest/kotlin/androidx/compose/material3/SwitchTest.kt
@@ -72,8 +72,7 @@
 @RunWith(AndroidJUnit4::class)
 class SwitchTest {
 
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
     private val defaultSwitchTag = "switch"
 
@@ -90,11 +89,13 @@
             }
         }
 
-        rule.onNodeWithTag("checked")
+        rule
+            .onNodeWithTag("checked")
             .assert(SemanticsMatcher.expectValue(SemanticsProperties.Role, Role.Switch))
             .assertIsEnabled()
             .assertIsOn()
-        rule.onNodeWithTag("unchecked")
+        rule
+            .onNodeWithTag("unchecked")
             .assert(SemanticsMatcher.expectValue(SemanticsProperties.Role, Role.Switch))
             .assertIsEnabled()
             .assertIsOff()
@@ -114,10 +115,7 @@
                 )
             }
         }
-        rule.onNodeWithTag(defaultSwitchTag)
-            .assertIsOff()
-            .performClick()
-            .assertIsOn()
+        rule.onNodeWithTag(defaultSwitchTag).assertIsOff().performClick().assertIsOn()
     }
 
     @Test
@@ -134,7 +132,8 @@
                 )
             }
         }
-        rule.onNodeWithTag(defaultSwitchTag)
+        rule
+            .onNodeWithTag(defaultSwitchTag)
             .assertIsOff()
             .performClick()
             .assertIsOn()
@@ -153,8 +152,7 @@
                 enabled = false
             )
         }
-        rule.onNodeWithTag(defaultSwitchTag)
-            .assertHasClickAction()
+        rule.onNodeWithTag(defaultSwitchTag).assertHasClickAction()
     }
 
     @Test
@@ -172,12 +170,10 @@
             }
         }
 
-        rule.onNodeWithTag(defaultSwitchTag)
-            .assertHasClickAction()
+        rule.onNodeWithTag(defaultSwitchTag).assertHasClickAction()
 
         // Check not merged into parent
-        rule.onNodeWithTag(parentTag)
-            .assert(isNotFocusable())
+        rule.onNodeWithTag(parentTag).assert(isNotFocusable())
     }
 
     @Test
@@ -185,89 +181,54 @@
         rule.setMaterialContent(lightColorScheme()) {
             val (checked, _) = remember { mutableStateOf(false) }
             Box(Modifier.semantics(mergeDescendants = true) {}.testTag(defaultSwitchTag)) {
-                Switch(
-                    checked,
-                    null,
-                    modifier = Modifier.semantics { focused = true }
-                )
+                Switch(checked, null, modifier = Modifier.semantics { focused = true })
             }
         }
 
-        rule.onNodeWithTag(defaultSwitchTag)
+        rule
+            .onNodeWithTag(defaultSwitchTag)
             .assertHasNoClickAction()
             .assert(isFocusable()) // Check merged into parent
     }
 
     @Test
     fun switch_materialSizes_whenChecked_minimumTouchTarget() {
-        materialSizesTestForValue(
-            checked = true,
-            clickable = true,
-            minimumTouchTarget = true
-        )
+        materialSizesTestForValue(checked = true, clickable = true, minimumTouchTarget = true)
     }
 
     @Test
     fun switch_materialSizes_whenChecked_withoutMinimumTouchTarget() {
-        materialSizesTestForValue(
-            checked = true,
-            clickable = true,
-            minimumTouchTarget = false
-        )
+        materialSizesTestForValue(checked = true, clickable = true, minimumTouchTarget = false)
     }
 
     @Test
     fun switch_materialSizes_whenUnchecked_minimumTouchTarget() {
-        materialSizesTestForValue(
-            checked = false,
-            clickable = true,
-            minimumTouchTarget = true
-        )
+        materialSizesTestForValue(checked = false, clickable = true, minimumTouchTarget = true)
     }
 
     @Test
     fun switch_materialSizes_whenUnchecked_withoutMinimumTouchTarget() {
-        materialSizesTestForValue(
-            checked = false,
-            clickable = true,
-            minimumTouchTarget = false
-        )
+        materialSizesTestForValue(checked = false, clickable = true, minimumTouchTarget = false)
     }
 
     @Test
     fun switch_materialSizes_whenChecked_notClickable_minimumTouchTarget() {
-        materialSizesTestForValue(
-            checked = true,
-            clickable = false,
-            minimumTouchTarget = true
-        )
+        materialSizesTestForValue(checked = true, clickable = false, minimumTouchTarget = true)
     }
 
     @Test
     fun switch_materialSizes_whenChecked_notClickable_withoutMinimumTouchTarget() {
-        materialSizesTestForValue(
-            checked = true,
-            clickable = false,
-            minimumTouchTarget = false
-        )
+        materialSizesTestForValue(checked = true, clickable = false, minimumTouchTarget = false)
     }
 
     @Test
     fun switch_materialSizes_whenUnchecked_notClickable_minimumTouchTarget() {
-        materialSizesTestForValue(
-            checked = false,
-            clickable = false,
-            minimumTouchTarget = true
-        )
+        materialSizesTestForValue(checked = false, clickable = false, minimumTouchTarget = true)
     }
 
     @Test
     fun switch_materialSizes_whenUnchecked_notClickable_withoutMinimumTouchTarget() {
-        materialSizesTestForValue(
-            checked = false,
-            clickable = false,
-            minimumTouchTarget = false
-        )
+        materialSizesTestForValue(checked = false, clickable = false, minimumTouchTarget = false)
     }
 
     @Test
@@ -283,18 +244,17 @@
             )
         }
 
-        rule.onNodeWithTag("spacer", useUnmergedTree = true)
-            .assertLeftPositionInRootIsEqualTo(8.dp)
+        rule.onNodeWithTag("spacer", useUnmergedTree = true).assertLeftPositionInRootIsEqualTo(8.dp)
 
         rule.runOnIdle { checked = true }
 
-        rule.onNodeWithTag("spacer", useUnmergedTree = true)
+        rule
+            .onNodeWithTag("spacer", useUnmergedTree = true)
             .assertLeftPositionInRootIsEqualTo(28.dp)
 
         rule.runOnIdle { checked = false }
 
-        rule.onNodeWithTag("spacer", useUnmergedTree = true)
-            .assertLeftPositionInRootIsEqualTo(8.dp)
+        rule.onNodeWithTag("spacer", useUnmergedTree = true).assertLeftPositionInRootIsEqualTo(8.dp)
     }
 
     @Test
@@ -309,13 +269,9 @@
             )
         }
 
-        rule.onNodeWithTag(defaultSwitchTag)
-            .performTouchInput {
-                click(center)
-            }
+        rule.onNodeWithTag(defaultSwitchTag).performTouchInput { click(center) }
 
-        rule.onNodeWithTag("spacer", useUnmergedTree = true)
-            .assertLeftPositionInRootIsEqualTo(8.dp)
+        rule.onNodeWithTag("spacer", useUnmergedTree = true).assertLeftPositionInRootIsEqualTo(8.dp)
     }
 
     // regression test for b/191375128
@@ -325,9 +281,7 @@
         var items by mutableStateOf(listOf(1 to false, 2 to true))
         rule.setContent {
             Column {
-                Button(onClick = { screenTwo.value = !screenTwo.value }) {
-                    Text("switch screen")
-                }
+                Button(onClick = { screenTwo.value = !screenTwo.value }) { Text("switch screen") }
                 val holder = rememberSaveableStateHolder()
                 holder.SaveableStateProvider(screenTwo.value) {
                     if (screenTwo.value) {
@@ -343,9 +297,10 @@
                                         modifier = Modifier.testTag(item.first.toString()),
                                         checked = item.second,
                                         onCheckedChange = {
-                                            items = items.toMutableList().also {
-                                                it[index] = item.first to !item.second
-                                            }
+                                            items =
+                                                items.toMutableList().also {
+                                                    it[index] = item.first to !item.second
+                                                }
                                         }
                                     )
                                 }
@@ -357,18 +312,15 @@
         }
         rule.onNodeWithTag("1").assertIsOff()
         rule.onNodeWithTag("2").assertIsOn()
+        rule.runOnIdle { screenTwo.value = true }
         rule.runOnIdle {
-            screenTwo.value = true
+            items =
+                items.toMutableList().also {
+                    it[0] = items[0].first to !items[0].second
+                    it[1] = items[1].first to !items[1].second
+                }
         }
-        rule.runOnIdle {
-            items = items.toMutableList().also {
-                it[0] = items[0].first to !items[0].second
-                it[1] = items[1].first to !items[1].second
-            }
-        }
-        rule.runOnIdle {
-            screenTwo.value = false
-        }
+        rule.runOnIdle { screenTwo.value = false }
         rule.onNodeWithTag("1").assertIsOn()
         rule.onNodeWithTag("2").assertIsOff()
     }
@@ -378,56 +330,66 @@
         checked: Boolean,
         clickable: Boolean,
         minimumTouchTarget: Boolean
-    ) = with(rule.density) {
-        rule.setMaterialContentForSizeAssertions {
-            CompositionLocalProvider(
-                LocalMinimumInteractiveComponentSize provides
-                    if (minimumTouchTarget) 48.dp else Dp.Unspecified
-            ) {
-                Switch(
-                    checked = checked,
-                    onCheckedChange = if (clickable) { {} } else { null },
-                    enabled = false
-                )
-            }
-        }.run {
-            if (clickable && minimumTouchTarget) {
-                assertWidthIsAtLeast(48.dp)
-                assertHeightIsAtLeast(48.dp)
-            } else {
-                assertWidthIsEqualTo(SwitchTokens.TrackWidth)
-                assertHeightIsEqualTo(SwitchTokens.TrackHeight)
-            }
+    ) =
+        with(rule.density) {
+            rule
+                .setMaterialContentForSizeAssertions {
+                    CompositionLocalProvider(
+                        LocalMinimumInteractiveComponentSize provides
+                            if (minimumTouchTarget) 48.dp else Dp.Unspecified
+                    ) {
+                        Switch(
+                            checked = checked,
+                            onCheckedChange =
+                                if (clickable) {
+                                    {}
+                                } else {
+                                    null
+                                },
+                            enabled = false
+                        )
+                    }
+                }
+                .run {
+                    if (clickable && minimumTouchTarget) {
+                        assertWidthIsAtLeast(48.dp)
+                        assertHeightIsAtLeast(48.dp)
+                    } else {
+                        assertWidthIsEqualTo(SwitchTokens.TrackWidth)
+                        assertHeightIsEqualTo(SwitchTokens.TrackHeight)
+                    }
+                }
         }
-    }
 
     /**
-     * A switch should have a minimum touch target of 48 DP x 48 DP and the reported size
-     * should match that, despite the fact that we force the size to be smaller.
+     * A switch should have a minimum touch target of 48 DP x 48 DP and the reported size should
+     * match that, despite the fact that we force the size to be smaller.
      */
     @Test
-    fun switch_minTouchTargetArea(): Unit = with(rule.density) {
-        var checked by mutableStateOf(false)
-        rule.setMaterialContent(lightColorScheme()) {
-            // Box is needed because otherwise the control will be expanded to fill its parent
-            Box(Modifier.fillMaxSize()) {
-                Switch(
-                    modifier = Modifier.align(Alignment.Center)
-                        .testTag(defaultSwitchTag)
-                        .requiredSize(2.dp),
-                    checked = checked,
-                    onCheckedChange = { checked = it }
-                )
+    fun switch_minTouchTargetArea(): Unit =
+        with(rule.density) {
+            var checked by mutableStateOf(false)
+            rule.setMaterialContent(lightColorScheme()) {
+                // Box is needed because otherwise the control will be expanded to fill its parent
+                Box(Modifier.fillMaxSize()) {
+                    Switch(
+                        modifier =
+                            Modifier.align(Alignment.Center)
+                                .testTag(defaultSwitchTag)
+                                .requiredSize(2.dp),
+                        checked = checked,
+                        onCheckedChange = { checked = it }
+                    )
+                }
             }
+            rule
+                .onNodeWithTag(defaultSwitchTag)
+                .assertIsOff()
+                .assertWidthIsEqualTo(2.dp)
+                .assertHeightIsEqualTo(2.dp)
+                .assertTouchWidthIsEqualTo(48.dp)
+                .assertTouchHeightIsEqualTo(48.dp)
+                .performTouchInput { click(position = Offset(-1f, -1f)) }
+                .assertIsOn()
         }
-        rule.onNodeWithTag(defaultSwitchTag)
-            .assertIsOff()
-            .assertWidthIsEqualTo(2.dp)
-            .assertHeightIsEqualTo(2.dp)
-            .assertTouchWidthIsEqualTo(48.dp)
-            .assertTouchHeightIsEqualTo(48.dp)
-            .performTouchInput {
-                click(position = Offset(-1f, -1f))
-            }.assertIsOn()
-    }
 }
diff --git a/compose/material3/material3/src/androidInstrumentedTest/kotlin/androidx/compose/material3/TabScreenshotTest.kt b/compose/material3/material3/src/androidInstrumentedTest/kotlin/androidx/compose/material3/TabScreenshotTest.kt
index 2741aec..fa58ee1 100644
--- a/compose/material3/material3/src/androidInstrumentedTest/kotlin/androidx/compose/material3/TabScreenshotTest.kt
+++ b/compose/material3/material3/src/androidInstrumentedTest/kotlin/androidx/compose/material3/TabScreenshotTest.kt
@@ -49,11 +49,9 @@
 @SdkSuppress(minSdkVersion = Build.VERSION_CODES.O)
 class TabScreenshotTest {
 
-    @get:Rule
-    val composeTestRule = createComposeRule()
+    @get:Rule val composeTestRule = createComposeRule()
 
-    @get:Rule
-    val screenshotRule = AndroidXScreenshotTestRule(GOLDEN_MATERIAL3)
+    @get:Rule val screenshotRule = AndroidXScreenshotTestRule(GOLDEN_MATERIAL3)
 
     @Test
     fun lightTheme_primary() {
@@ -63,9 +61,7 @@
 
         composeTestRule.setContent {
             scope = rememberCoroutineScope()
-            MaterialTheme(lightColorScheme()) {
-                DefaultPrimaryTabs(interactionSource)
-            }
+            MaterialTheme(lightColorScheme()) { DefaultPrimaryTabs(interactionSource) }
         }
 
         assertTabsMatch(
@@ -84,9 +80,7 @@
 
         composeTestRule.setContent {
             scope = rememberCoroutineScope()
-            MaterialTheme(lightColorScheme()) {
-                DefaultSecondaryTabs(interactionSource)
-            }
+            MaterialTheme(lightColorScheme()) { DefaultSecondaryTabs(interactionSource) }
         }
 
         assertTabsMatch(
@@ -105,9 +99,7 @@
 
         composeTestRule.setContent {
             scope = rememberCoroutineScope()
-            MaterialTheme(lightColorScheme()) {
-                DefaultPrimaryTabs(interactionSource)
-            }
+            MaterialTheme(lightColorScheme()) { DefaultPrimaryTabs(interactionSource) }
         }
 
         assertTabsMatch(
@@ -126,9 +118,7 @@
 
         composeTestRule.setContent {
             scope = rememberCoroutineScope()
-            MaterialTheme(lightColorScheme()) {
-                DefaultSecondaryTabs(interactionSource)
-            }
+            MaterialTheme(lightColorScheme()) { DefaultSecondaryTabs(interactionSource) }
         }
 
         assertTabsMatch(
@@ -147,9 +137,7 @@
 
         composeTestRule.setContent {
             scope = rememberCoroutineScope()
-            MaterialTheme(darkColorScheme()) {
-                DefaultPrimaryTabs(interactionSource)
-            }
+            MaterialTheme(darkColorScheme()) { DefaultPrimaryTabs(interactionSource) }
         }
 
         assertTabsMatch(
@@ -168,9 +156,7 @@
 
         composeTestRule.setContent {
             scope = rememberCoroutineScope()
-            MaterialTheme(darkColorScheme()) {
-                DefaultSecondaryTabs(interactionSource)
-            }
+            MaterialTheme(darkColorScheme()) { DefaultSecondaryTabs(interactionSource) }
         }
 
         assertTabsMatch(
@@ -189,9 +175,7 @@
 
         composeTestRule.setContent {
             scope = rememberCoroutineScope()
-            MaterialTheme(darkColorScheme()) {
-                DefaultPrimaryTabs(interactionSource)
-            }
+            MaterialTheme(darkColorScheme()) { DefaultPrimaryTabs(interactionSource) }
         }
 
         assertTabsMatch(
@@ -210,9 +194,7 @@
 
         composeTestRule.setContent {
             scope = rememberCoroutineScope()
-            MaterialTheme(darkColorScheme()) {
-                DefaultSecondaryTabs(interactionSource)
-            }
+            MaterialTheme(darkColorScheme()) { DefaultSecondaryTabs(interactionSource) }
         }
 
         assertTabsMatch(
@@ -335,9 +317,7 @@
 
         composeTestRule.setContent {
             scope = rememberCoroutineScope()
-            MaterialTheme(lightColorScheme()) {
-                DefaultPrimaryLeadingIconTabs(interactionSource)
-            }
+            MaterialTheme(lightColorScheme()) { DefaultPrimaryLeadingIconTabs(interactionSource) }
         }
 
         assertTabsMatch(
@@ -356,9 +336,7 @@
 
         composeTestRule.setContent {
             scope = rememberCoroutineScope()
-            MaterialTheme(lightColorScheme()) {
-                DefaultSecondaryLeadingIconTabs(interactionSource)
-            }
+            MaterialTheme(lightColorScheme()) { DefaultSecondaryLeadingIconTabs(interactionSource) }
         }
 
         assertTabsMatch(
@@ -377,9 +355,7 @@
 
         composeTestRule.setContent {
             scope = rememberCoroutineScope()
-            MaterialTheme(darkColorScheme()) {
-                DefaultPrimaryLeadingIconTabs(interactionSource)
-            }
+            MaterialTheme(darkColorScheme()) { DefaultPrimaryLeadingIconTabs(interactionSource) }
         }
 
         assertTabsMatch(
@@ -398,9 +374,7 @@
 
         composeTestRule.setContent {
             scope = rememberCoroutineScope()
-            MaterialTheme(darkColorScheme()) {
-                DefaultSecondaryLeadingIconTabs(interactionSource)
-            }
+            MaterialTheme(darkColorScheme()) { DefaultSecondaryLeadingIconTabs(interactionSource) }
         }
 
         assertTabsMatch(
@@ -419,9 +393,7 @@
 
         composeTestRule.setContent {
             scope = rememberCoroutineScope()
-            MaterialTheme(lightColorScheme()) {
-                DefaultPrimaryScrollableTabs(interactionSource)
-            }
+            MaterialTheme(lightColorScheme()) { DefaultPrimaryScrollableTabs(interactionSource) }
         }
 
         assertTabsMatch(
@@ -440,9 +412,7 @@
 
         composeTestRule.setContent {
             scope = rememberCoroutineScope()
-            MaterialTheme(lightColorScheme()) {
-                DefaultSecondaryScrollableTabs(interactionSource)
-            }
+            MaterialTheme(lightColorScheme()) { DefaultSecondaryScrollableTabs(interactionSource) }
         }
 
         assertTabsMatch(
@@ -461,9 +431,7 @@
 
         composeTestRule.setContent {
             scope = rememberCoroutineScope()
-            MaterialTheme(darkColorScheme()) {
-                DefaultPrimaryScrollableTabs(interactionSource)
-            }
+            MaterialTheme(darkColorScheme()) { DefaultPrimaryScrollableTabs(interactionSource) }
         }
 
         assertTabsMatch(
@@ -482,9 +450,7 @@
 
         composeTestRule.setContent {
             scope = rememberCoroutineScope()
-            MaterialTheme(darkColorScheme()) {
-                DefaultSecondaryScrollableTabs(interactionSource)
-            }
+            MaterialTheme(darkColorScheme()) { DefaultSecondaryScrollableTabs(interactionSource) }
         }
 
         assertTabsMatch(
@@ -511,9 +477,7 @@
         if (interaction != null) {
             composeTestRule.runOnIdle {
                 // Start ripple
-                scope.launch {
-                    interactionSource.emit(interaction)
-                }
+                scope.launch { interactionSource.emit(interaction) }
             }
 
             composeTestRule.waitForIdle()
@@ -524,27 +488,24 @@
         }
 
         // Capture and compare screenshots
-        composeTestRule.onNodeWithTag(TAG)
+        composeTestRule
+            .onNodeWithTag(TAG)
             .captureToImage()
             .assertAgainstGolden(screenshotRule, goldenIdentifier)
     }
 }
 
 /**
- * Default primary colored [TabRow] with three [Tab]s. The first [Tab] is selected, and the rest are not.
+ * Default primary colored [TabRow] with three [Tab]s. The first [Tab] is selected, and the rest are
+ * not.
  *
  * @param interactionSource the [MutableInteractionSource] for the first [Tab], to control its
- * visual state.
+ *   visual state.
  */
 @Composable
 @OptIn(ExperimentalMaterial3Api::class)
-private fun DefaultPrimaryTabs(
-    interactionSource: MutableInteractionSource
-) {
-    Box(
-        Modifier
-            .semantics(mergeDescendants = true) {}
-            .testTag(TAG)) {
+private fun DefaultPrimaryTabs(interactionSource: MutableInteractionSource) {
+    Box(Modifier.semantics(mergeDescendants = true) {}.testTag(TAG)) {
         PrimaryTabRow(selectedTabIndex = 0) {
             Tab(
                 selected = true,
@@ -552,35 +513,23 @@
                 text = { Text("TAB") },
                 interactionSource = interactionSource
             )
-            Tab(
-                selected = false,
-                onClick = {},
-                text = { Text("TAB") }
-            )
-            Tab(
-                selected = false,
-                onClick = {},
-                text = { Text("TAB") }
-            )
+            Tab(selected = false, onClick = {}, text = { Text("TAB") })
+            Tab(selected = false, onClick = {}, text = { Text("TAB") })
         }
     }
 }
 
 /**
- * Default secondary colored [TabRow] with three [Tab]s. The first [Tab] is selected, and the rest are not.
+ * Default secondary colored [TabRow] with three [Tab]s. The first [Tab] is selected, and the rest
+ * are not.
  *
  * @param interactionSource the [MutableInteractionSource] for the first [Tab], to control its
- * visual state.
+ *   visual state.
  */
 @Composable
 @OptIn(ExperimentalMaterial3Api::class)
-private fun DefaultSecondaryTabs(
-    interactionSource: MutableInteractionSource
-) {
-    Box(
-        Modifier
-            .semantics(mergeDescendants = true) {}
-            .testTag(TAG)) {
+private fun DefaultSecondaryTabs(interactionSource: MutableInteractionSource) {
+    Box(Modifier.semantics(mergeDescendants = true) {}.testTag(TAG)) {
         SecondaryTabRow(selectedTabIndex = 0) {
             Tab(
                 selected = true,
@@ -588,25 +537,18 @@
                 text = { Text("TAB") },
                 interactionSource = interactionSource
             )
-            Tab(
-                selected = false,
-                onClick = {},
-                text = { Text("TAB") }
-            )
-            Tab(
-                selected = false,
-                onClick = {},
-                text = { Text("TAB") }
-            )
+            Tab(selected = false, onClick = {}, text = { Text("TAB") })
+            Tab(selected = false, onClick = {}, text = { Text("TAB") })
         }
     }
 }
 
 /**
- * Custom primary colored [TabRow] with three [Tab]s. The first [Tab] is selected, and the rest are not.
+ * Custom primary colored [TabRow] with three [Tab]s. The first [Tab] is selected, and the rest are
+ * not.
  *
  * @param interactionSource the [MutableInteractionSource] for the first [Tab], to control its
- * visual state.
+ *   visual state.
  * @param containerColor the containerColor of the [TabRow]
  * @param selectedContentColor the content color for a selected [Tab] (first tab)
  * @param unselectedContentColor the content color for an unselected [Tab] (second and third tabs)
@@ -619,14 +561,8 @@
     selectedContentColor: Color,
     unselectedContentColor: Color
 ) {
-    Box(
-        Modifier
-            .semantics(mergeDescendants = true) {}
-            .testTag(TAG)) {
-        PrimaryTabRow(
-            selectedTabIndex = 0,
-            containerColor = containerColor
-        ) {
+    Box(Modifier.semantics(mergeDescendants = true) {}.testTag(TAG)) {
+        PrimaryTabRow(selectedTabIndex = 0, containerColor = containerColor) {
             Tab(
                 selected = true,
                 onClick = {},
@@ -654,10 +590,11 @@
 }
 
 /**
- * Custom secondary colored [TabRow] with three [Tab]s. The first [Tab] is selected, and the rest are not.
+ * Custom secondary colored [TabRow] with three [Tab]s. The first [Tab] is selected, and the rest
+ * are not.
  *
  * @param interactionSource the [MutableInteractionSource] for the first [Tab], to control its
- * visual state.
+ *   visual state.
  * @param containerColor the containerColor of the [TabRow]
  * @param selectedContentColor the content color for a selected [Tab] (first tab)
  * @param unselectedContentColor the content color for an unselected [Tab] (second and third tabs)
@@ -670,10 +607,7 @@
     selectedContentColor: Color,
     unselectedContentColor: Color
 ) {
-    Box(
-        Modifier
-            .semantics(mergeDescendants = true) {}
-            .testTag(TAG)) {
+    Box(Modifier.semantics(mergeDescendants = true) {}.testTag(TAG)) {
         SecondaryTabRow(
             selectedTabIndex = 0,
             containerColor = containerColor,
@@ -711,21 +645,16 @@
 }
 
 /**
- * Default primary colored [TabRow] with three [LeadingIconTab]s. The first [LeadingIconTab] is selected,
- * and the rest are not.
+ * Default primary colored [TabRow] with three [LeadingIconTab]s. The first [LeadingIconTab] is
+ * selected, and the rest are not.
  *
- * @param interactionSource the [MutableInteractionSource] for the first [LeadingIconTab], to control its
- * visual state.
+ * @param interactionSource the [MutableInteractionSource] for the first [LeadingIconTab], to
+ *   control its visual state.
  */
 @Composable
 @OptIn(ExperimentalMaterial3Api::class)
-private fun DefaultPrimaryLeadingIconTabs(
-    interactionSource: MutableInteractionSource
-) {
-    Box(
-        Modifier
-            .semantics(mergeDescendants = true) {}
-            .testTag(TAG)) {
+private fun DefaultPrimaryLeadingIconTabs(interactionSource: MutableInteractionSource) {
+    Box(Modifier.semantics(mergeDescendants = true) {}.testTag(TAG)) {
         PrimaryTabRow(selectedTabIndex = 0) {
             LeadingIconTab(
                 selected = true,
@@ -751,21 +680,16 @@
 }
 
 /**
- * Default secondary colored [TabRow] with three [LeadingIconTab]s. The first [LeadingIconTab] is selected,
- * and the rest are not.
+ * Default secondary colored [TabRow] with three [LeadingIconTab]s. The first [LeadingIconTab] is
+ * selected, and the rest are not.
  *
- * @param interactionSource the [MutableInteractionSource] for the first [LeadingIconTab], to control its
- * visual state.
+ * @param interactionSource the [MutableInteractionSource] for the first [LeadingIconTab], to
+ *   control its visual state.
  */
 @Composable
 @OptIn(ExperimentalMaterial3Api::class)
-private fun DefaultSecondaryLeadingIconTabs(
-    interactionSource: MutableInteractionSource
-) {
-    Box(
-        Modifier
-            .semantics(mergeDescendants = true) {}
-            .testTag(TAG)) {
+private fun DefaultSecondaryLeadingIconTabs(interactionSource: MutableInteractionSource) {
+    Box(Modifier.semantics(mergeDescendants = true) {}.testTag(TAG)) {
         SecondaryTabRow(selectedTabIndex = 0) {
             LeadingIconTab(
                 selected = true,
@@ -791,20 +715,16 @@
 }
 
 /**
- * Default primary colored [ScrollableTabRow] with three [Tab]s. The first [Tab] is selected, and the rest are not.
+ * Default primary colored [ScrollableTabRow] with three [Tab]s. The first [Tab] is selected, and
+ * the rest are not.
  *
  * @param interactionSource the [MutableInteractionSource] for the first [Tab], to control its
- * visual state.
+ *   visual state.
  */
 @Composable
 @OptIn(ExperimentalMaterial3Api::class)
-private fun DefaultPrimaryScrollableTabs(
-    interactionSource: MutableInteractionSource
-) {
-    Box(
-        Modifier
-            .semantics(mergeDescendants = true) {}
-            .testTag(TAG)) {
+private fun DefaultPrimaryScrollableTabs(interactionSource: MutableInteractionSource) {
+    Box(Modifier.semantics(mergeDescendants = true) {}.testTag(TAG)) {
         PrimaryScrollableTabRow(
             selectedTabIndex = 0,
             indicator = {
@@ -819,35 +739,23 @@
                 text = { Text("TAB") },
                 interactionSource = interactionSource
             )
-            Tab(
-                selected = false,
-                onClick = {},
-                text = { Text("TAB") }
-            )
-            Tab(
-                selected = false,
-                onClick = {},
-                text = { Text("TAB") }
-            )
+            Tab(selected = false, onClick = {}, text = { Text("TAB") })
+            Tab(selected = false, onClick = {}, text = { Text("TAB") })
         }
     }
 }
 
 /**
- * Default secondary colored [ScrollableTabRow] with three [Tab]s. The first [Tab] is selected, and the rest are not.
+ * Default secondary colored [ScrollableTabRow] with three [Tab]s. The first [Tab] is selected, and
+ * the rest are not.
  *
  * @param interactionSource the [MutableInteractionSource] for the first [Tab], to control its
- * visual state.
+ *   visual state.
  */
 @Composable
 @OptIn(ExperimentalMaterial3Api::class)
-private fun DefaultSecondaryScrollableTabs(
-    interactionSource: MutableInteractionSource
-) {
-    Box(
-        Modifier
-            .semantics(mergeDescendants = true) {}
-            .testTag(TAG)) {
+private fun DefaultSecondaryScrollableTabs(interactionSource: MutableInteractionSource) {
+    Box(Modifier.semantics(mergeDescendants = true) {}.testTag(TAG)) {
         SecondaryScrollableTabRow(selectedTabIndex = 0) {
             Tab(
                 selected = true,
@@ -855,16 +763,8 @@
                 text = { Text("TAB") },
                 interactionSource = interactionSource
             )
-            Tab(
-                selected = false,
-                onClick = {},
-                text = { Text("TAB") }
-            )
-            Tab(
-                selected = false,
-                onClick = {},
-                text = { Text("TAB") }
-            )
+            Tab(selected = false, onClick = {}, text = { Text("TAB") })
+            Tab(selected = false, onClick = {}, text = { Text("TAB") })
         }
     }
 }
diff --git a/compose/material3/material3/src/androidInstrumentedTest/kotlin/androidx/compose/material3/TabTest.kt b/compose/material3/material3/src/androidInstrumentedTest/kotlin/androidx/compose/material3/TabTest.kt
index 559ce7c..57d4a35 100644
--- a/compose/material3/material3/src/androidInstrumentedTest/kotlin/androidx/compose/material3/TabTest.kt
+++ b/compose/material3/material3/src/androidInstrumentedTest/kotlin/androidx/compose/material3/TabTest.kt
@@ -87,8 +87,7 @@
 
     private val icon = Icons.Filled.Favorite
 
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
     @Before
     fun before() {
@@ -113,13 +112,15 @@
             }
         }
 
-        rule.onNodeWithTag("tab")
+        rule
+            .onNodeWithTag("tab")
             .assert(SemanticsMatcher.expectValue(SemanticsProperties.Role, Role.Tab))
             .assertIsSelected()
             .assertIsEnabled()
             .assertHasClickAction()
 
-        rule.onNodeWithTag("tab")
+        rule
+            .onNodeWithTag("tab")
             .onParent()
             .assert(SemanticsMatcher.keyIsDefined(SemanticsProperties.SelectableGroup))
     }
@@ -138,7 +139,8 @@
             }
         }
 
-        rule.onNodeWithTag("tab")
+        rule
+            .onNodeWithTag("tab")
             .assert(SemanticsMatcher.expectValue(SemanticsProperties.Role, Role.Tab))
             .assertIsSelected()
             .assertIsNotEnabled()
@@ -159,13 +161,15 @@
             }
         }
 
-        rule.onNodeWithTag("leadingIconTab")
+        rule
+            .onNodeWithTag("leadingIconTab")
             .assert(SemanticsMatcher.expectValue(SemanticsProperties.Role, Role.Tab))
             .assertIsSelected()
             .assertIsEnabled()
             .assertHasClickAction()
 
-        rule.onNodeWithTag("leadingIconTab")
+        rule
+            .onNodeWithTag("leadingIconTab")
             .onParent()
             .assert(SemanticsMatcher.keyIsDefined(SemanticsProperties.SelectableGroup))
     }
@@ -185,7 +189,8 @@
             }
         }
 
-        rule.onNodeWithTag("leadingIconTab")
+        rule
+            .onNodeWithTag("leadingIconTab")
             .assert(SemanticsMatcher.expectValue(SemanticsProperties.Role, Role.Tab))
             .assertIsSelected()
             .assertIsNotEnabled()
@@ -255,8 +260,7 @@
                     selectedTabIndex = state,
                     indicator = {
                         Box(
-                            Modifier
-                                .tabIndicatorOffset(state)
+                            Modifier.tabIndicatorOffset(state)
                                 .fillMaxWidth()
                                 .height(indicatorHeight)
                                 .background(color = Color.Red)
@@ -277,7 +281,8 @@
 
         val tabRowBounds = rule.onNodeWithTag("tabRow").getUnclippedBoundsInRoot()
 
-        rule.onNodeWithTag("indicator", true)
+        rule
+            .onNodeWithTag("indicator", true)
             .assertPositionInRootIsEqualTo(
                 expectedLeft = 0.dp,
                 expectedTop = tabRowBounds.height - indicatorHeight
@@ -288,7 +293,8 @@
 
         // Indicator should now be placed in the bottom left of the second tab, so its x coordinate
         // should be in the middle of the TabRow
-        rule.onNodeWithTag("indicator", true)
+        rule
+            .onNodeWithTag("indicator", true)
             .assertPositionInRootIsEqualTo(
                 expectedLeft = (tabRowBounds.width / 2),
                 expectedTop = tabRowBounds.height - indicatorHeight
@@ -300,18 +306,12 @@
         val indicatorHeight = 1.dp
         val titles = listOf("TAB 1", "TAB 2")
         rule.setMaterialContent(lightColorScheme()) {
-            Box(
-                Modifier
-                    .testTag("tabRow")
-                    .fillMaxSize(),
-                propagateMinConstraints = true
-            ) {
+            Box(Modifier.testTag("tabRow").fillMaxSize(), propagateMinConstraints = true) {
                 PrimaryTabRow(
                     selectedTabIndex = 1,
                     indicator = {
                         Box(
-                            Modifier
-                                .tabIndicatorOffset(1)
+                            Modifier.tabIndicatorOffset(1)
                                 .fillMaxWidth()
                                 .height(indicatorHeight)
                                 .background(color = Color.Red)
@@ -320,18 +320,13 @@
                     }
                 ) {
                     titles.forEachIndexed { index, title ->
-                        Tab(
-                            selected = index == 1,
-                            onClick = { },
-                            text = { Text(title) }
-                        )
+                        Tab(selected = index == 1, onClick = {}, text = { Text(title) })
                     }
                 }
             }
         }
 
-        rule.onNodeWithTag("indicator", true)
-            .assertHeightIsEqualTo(indicatorHeight)
+        rule.onNodeWithTag("indicator", true).assertHeightIsEqualTo(indicatorHeight)
     }
 
     @Test
@@ -362,7 +357,8 @@
 
         val tabRowBounds = rule.onNodeWithTag("tabRow").getBoundsInRoot()
 
-        rule.onNodeWithTag("divider", true)
+        rule
+            .onNodeWithTag("divider", true)
             .assertPositionInRootIsEqualTo(
                 expectedLeft = 0.dp,
                 expectedTop = tabRowBounds.height - DividerTokens.Thickness
@@ -377,17 +373,12 @@
             val titles = listOf("TAB")
 
             Box {
-                SecondaryTabRow(
-                    modifier = Modifier.testTag("tabRow"),
-                    selectedTabIndex = state
-                ) {
+                SecondaryTabRow(modifier = Modifier.testTag("tabRow"), selectedTabIndex = state) {
                     titles.forEachIndexed { index, title ->
                         Tab(
                             selected = state == index,
                             onClick = { state = index },
-                            text = {
-                                Text(title, Modifier.testTag("text"))
-                            }
+                            text = { Text(title, Modifier.testTag("text")) }
                         )
                     }
                 }
@@ -408,17 +399,12 @@
             val titles = listOf("TAB")
 
             Box {
-                SecondaryTabRow(
-                    modifier = Modifier.testTag("tabRow"),
-                    selectedTabIndex = state
-                ) {
+                SecondaryTabRow(modifier = Modifier.testTag("tabRow"), selectedTabIndex = state) {
                     titles.forEachIndexed { index, title ->
                         Tab(
                             selected = state == index,
                             onClick = { state = index },
-                            text = {
-                                Text(title, Modifier.testTag("text"))
-                            },
+                            text = { Text(title, Modifier.testTag("text")) },
                             icon = { Icon(Icons.Filled.Favorite, null) }
                         )
                     }
@@ -448,17 +434,12 @@
             val titles = listOf("Two line \n text")
 
             Box {
-                SecondaryTabRow(
-                    modifier = Modifier.testTag("tabRow"),
-                    selectedTabIndex = state
-                ) {
+                SecondaryTabRow(modifier = Modifier.testTag("tabRow"), selectedTabIndex = state) {
                     titles.forEachIndexed { index, title ->
                         Tab(
                             selected = state == index,
                             onClick = { state = index },
-                            text = {
-                                Text(title, Modifier.testTag("text"), maxLines = 2)
-                            }
+                            text = { Text(title, Modifier.testTag("text"), maxLines = 2) }
                         )
                     }
                 }
@@ -477,16 +458,11 @@
     fun leadingIconTab_textAndIconPosition() {
         rule.setMaterialContent(lightColorScheme()) {
             Box {
-                SecondaryTabRow(
-                    modifier = Modifier.testTag("tabRow"),
-                    selectedTabIndex = 0
-                ) {
+                SecondaryTabRow(modifier = Modifier.testTag("tabRow"), selectedTabIndex = 0) {
                     LeadingIconTab(
                         selected = true,
                         onClick = {},
-                        text = {
-                            Text("TAB", Modifier.testTag("text"))
-                        },
+                        text = { Text("TAB", Modifier.testTag("text")) },
                         icon = { Icon(Icons.Filled.Favorite, null, Modifier.testTag("icon")) }
                     )
                 }
@@ -524,8 +500,7 @@
 
             val indicator: @Composable TabIndicatorScope.(index: Int) -> Unit = { index ->
                 Box(
-                    Modifier
-                        .tabIndicatorOffset(index)
+                    Modifier.tabIndicatorOffset(index)
                         .fillMaxWidth()
                         .height(indicatorHeight)
                         .background(color = Color.Red)
@@ -553,7 +528,8 @@
         val tabRowBounds = rule.onNodeWithTag("tabRow").getUnclippedBoundsInRoot()
         val tabRowPadding = 52.dp
         // Indicator should be placed in the bottom left of the first tab
-        rule.onNodeWithTag("indicator", true)
+        rule
+            .onNodeWithTag("indicator", true)
             .assertPositionInRootIsEqualTo(
                 // Tabs in a scrollable tab row are offset 52.dp from each end
                 expectedLeft = tabRowPadding,
@@ -565,7 +541,8 @@
 
         // Indicator should now be placed in the bottom left of the second tab, so its x coordinate
         // should be in the middle of the TabRow
-        rule.onNodeWithTag("indicator", true)
+        rule
+            .onNodeWithTag("indicator", true)
             .assertPositionInRootIsEqualTo(
                 expectedLeft = tabRowPadding + minimumTabWidth,
                 expectedTop = tabRowBounds.height - indicatorHeight
@@ -600,7 +577,8 @@
 
         val tabRowBounds = rule.onNodeWithTag("tabRow").getBoundsInRoot()
 
-        rule.onNodeWithTag("divider", true)
+        rule
+            .onNodeWithTag("divider", true)
             .assertPositionInRootIsEqualTo(
                 expectedLeft = 0.dp,
                 expectedTop = tabRowBounds.height - DividerTokens.Thickness,
@@ -610,173 +588,126 @@
 
     @Test
     fun fixedTabRow_initialTabSelected() {
-        rule
-            .setMaterialContent(lightColorScheme()) {
-                TextTabs()
-            }
+        rule.setMaterialContent(lightColorScheme()) { TextTabs() }
 
         // Only the first tab should be selected
-        rule.onAllNodes(isSelectable())
-            .assertCountEquals(3)
-            .apply {
-                get(0).assertIsSelected()
-                get(1).assertIsNotSelected()
-                get(2).assertIsNotSelected()
-            }
+        rule.onAllNodes(isSelectable()).assertCountEquals(3).apply {
+            get(0).assertIsSelected()
+            get(1).assertIsNotSelected()
+            get(2).assertIsNotSelected()
+        }
     }
 
     @Test
     fun fixedTabRow_selectNewTab() {
-        rule
-            .setMaterialContent(lightColorScheme()) {
-                TextTabs()
-            }
+        rule.setMaterialContent(lightColorScheme()) { TextTabs() }
 
         val nodes = rule.onAllNodes(isSelectable())
 
         // Only the first tab should be selected
-        nodes
-            .assertCountEquals(3)
-            .apply {
-                get(0).assertIsSelected()
-                get(1).assertIsNotSelected()
-                get(2).assertIsNotSelected()
-            }
+        nodes.assertCountEquals(3).apply {
+            get(0).assertIsSelected()
+            get(1).assertIsNotSelected()
+            get(2).assertIsNotSelected()
+        }
 
         // Click the last tab
         nodes[2].performClick()
 
         // Now only the last tab should be selected
-        nodes
-            .assertCountEquals(3)
-            .apply {
-                get(0).assertIsNotSelected()
-                get(1).assertIsNotSelected()
-                get(2).assertIsSelected()
-            }
+        nodes.assertCountEquals(3).apply {
+            get(0).assertIsNotSelected()
+            get(1).assertIsNotSelected()
+            get(2).assertIsSelected()
+        }
     }
 
     @Test
     fun fixedLeadingIconTabRow_initialTabSelected() {
-        rule
-            .setMaterialContent(lightColorScheme()) {
-                LeadingIconTabs()
-            }
+        rule.setMaterialContent(lightColorScheme()) { LeadingIconTabs() }
 
         // Only the first tab should be selected
-        rule.onAllNodes(isSelectable())
-            .assertCountEquals(3)
-            .apply {
-                get(0).assertIsSelected()
-                get(1).assertIsNotSelected()
-                get(2).assertIsNotSelected()
-            }
+        rule.onAllNodes(isSelectable()).assertCountEquals(3).apply {
+            get(0).assertIsSelected()
+            get(1).assertIsNotSelected()
+            get(2).assertIsNotSelected()
+        }
     }
 
     @Test
     fun leadingIconTabRow_selectNewTab() {
-        rule
-            .setMaterialContent(lightColorScheme()) {
-                LeadingIconTabs()
-            }
+        rule.setMaterialContent(lightColorScheme()) { LeadingIconTabs() }
 
         // Only the first tab should be selected
-        rule.onAllNodes(isSelectable())
-            .assertCountEquals(3)
-            .apply {
-                get(0).assertIsSelected()
-                get(1).assertIsNotSelected()
-                get(2).assertIsNotSelected()
-            }
+        rule.onAllNodes(isSelectable()).assertCountEquals(3).apply {
+            get(0).assertIsSelected()
+            get(1).assertIsNotSelected()
+            get(2).assertIsNotSelected()
+        }
 
         // Click the last tab
         rule.onAllNodes(isSelectable())[2].performClick()
 
         // Now only the last tab should be selected
-        rule.onAllNodes(isSelectable())
-            .assertCountEquals(3)
-            .apply {
-                get(0).assertIsNotSelected()
-                get(1).assertIsNotSelected()
-                get(2).assertIsSelected()
-            }
+        rule.onAllNodes(isSelectable()).assertCountEquals(3).apply {
+            get(0).assertIsNotSelected()
+            get(1).assertIsNotSelected()
+            get(2).assertIsSelected()
+        }
     }
 
     @Test
     fun scrollableTabRow_initialTabSelected() {
-        rule
-            .setMaterialContent(lightColorScheme()) {
-                ScrollingTextTabs()
-            }
+        rule.setMaterialContent(lightColorScheme()) { ScrollingTextTabs() }
 
         // Only the first tab should be selected
-        rule.onAllNodes(isSelectable())
-            .assertCountEquals(10)
-            .apply {
-                get(0).assertIsSelected()
-                (1..9).forEach {
-                    get(it).assertIsNotSelected()
-                }
-            }
+        rule.onAllNodes(isSelectable()).assertCountEquals(10).apply {
+            get(0).assertIsSelected()
+            (1..9).forEach { get(it).assertIsNotSelected() }
+        }
     }
 
     @Test
     fun scrollableTabRow_offScreenTabInitiallySelected() {
-        rule
-            .setMaterialContent(lightColorScheme()) {
-                var state by remember { mutableStateOf(9) }
-                val titles = List(10) { "Tab ${it + 1}" }
-                SecondaryScrollableTabRow(selectedTabIndex = state) {
-                    titles.forEachIndexed { index, title ->
-                        Tab(
-                            selected = state == index,
-                            onClick = { state = index },
-                            text = { Text(title) }
-                        )
-                    }
+        rule.setMaterialContent(lightColorScheme()) {
+            var state by remember { mutableStateOf(9) }
+            val titles = List(10) { "Tab ${it + 1}" }
+            SecondaryScrollableTabRow(selectedTabIndex = state) {
+                titles.forEachIndexed { index, title ->
+                    Tab(
+                        selected = state == index,
+                        onClick = { state = index },
+                        text = { Text(title) }
+                    )
                 }
             }
+        }
 
-        rule.onAllNodes(isSelectable())
-            .assertCountEquals(10)
-            .apply {
-                // The last tab should be selected and displayed (scrolled to)
-                get(9)
-                    .assertIsSelected()
-                    .assertIsDisplayed()
-            }
+        rule.onAllNodes(isSelectable()).assertCountEquals(10).apply {
+            // The last tab should be selected and displayed (scrolled to)
+            get(9).assertIsSelected().assertIsDisplayed()
+        }
     }
 
     @Test
     fun scrollableTabRow_selectNewTab() {
-        rule
-            .setMaterialContent(lightColorScheme()) {
-                ScrollingTextTabs()
-            }
+        rule.setMaterialContent(lightColorScheme()) { ScrollingTextTabs() }
 
         // Only the first tab should be selected
-        rule.onAllNodes(isSelectable())
-            .assertCountEquals(10)
-            .apply {
-                get(0).assertIsSelected()
-                (1..9).forEach {
-                    get(it).assertIsNotSelected()
-                }
-            }
+        rule.onAllNodes(isSelectable()).assertCountEquals(10).apply {
+            get(0).assertIsSelected()
+            (1..9).forEach { get(it).assertIsNotSelected() }
+        }
 
         // Click the second tab
         rule.onAllNodes(isSelectable())[1].performClick()
 
         // Now only the second tab should be selected
-        rule.onAllNodes(isSelectable())
-            .assertCountEquals(10)
-            .apply {
-                get(0).assertIsNotSelected()
-                get(1).assertIsSelected()
-                (2..9).forEach {
-                    get(it).assertIsNotSelected()
-                }
-            }
+        rule.onAllNodes(isSelectable()).assertCountEquals(10).apply {
+            get(0).assertIsNotSelected()
+            get(1).assertIsSelected()
+            (2..9).forEach { get(it).assertIsNotSelected() }
+        }
     }
 
     @Test
@@ -789,8 +720,7 @@
 
             val indicator: @Composable TabIndicatorScope.(index: Int) -> Unit = { index ->
                 TabRowDefaults.SecondaryIndicator(
-                    Modifier
-                        .tabIndicatorOffset(index, matchContentSize = false)
+                    Modifier.tabIndicatorOffset(index, matchContentSize = false)
                         .testTag("indicator")
                 )
             }
@@ -856,12 +786,9 @@
             }
         }
 
-        rule.onNodeWithTag("tab")
-            .performClick()
+        rule.onNodeWithTag("tab").performClick()
 
-        rule.runOnIdle {
-            assertThat(clicks).isEqualTo(0)
-        }
+        rule.runOnIdle { assertThat(clicks).isEqualTo(0) }
     }
 
     @Test
@@ -880,12 +807,9 @@
             }
         }
 
-        rule.onNodeWithTag("tab")
-            .performClick()
+        rule.onNodeWithTag("tab").performClick()
 
-        rule.runOnIdle {
-            assertThat(clicks).isEqualTo(0)
-        }
+        rule.runOnIdle { assertThat(clicks).isEqualTo(0) }
     }
 
     @Test
@@ -911,26 +835,21 @@
     @Test
     fun tabRow_layoutHeightRespected() {
         var height by mutableStateOf(0.dp)
-        rule
-            .setMaterialContent(lightColorScheme()) {
-                var state by remember { mutableStateOf(0) }
-                val titles = listOf("Tab 1", "Tab 2", "Tab 3")
-                Column(
-                    Modifier
-                        .heightIn(max = height)
-                        .testTag("Tabs")
-                ) {
-                    SecondaryTabRow(selectedTabIndex = state) {
-                        titles.forEachIndexed { index, title ->
-                            Tab(
-                                selected = state == index,
-                                onClick = { state = index },
-                                text = { Text(text = title) }
-                            )
-                        }
+        rule.setMaterialContent(lightColorScheme()) {
+            var state by remember { mutableStateOf(0) }
+            val titles = listOf("Tab 1", "Tab 2", "Tab 3")
+            Column(Modifier.heightIn(max = height).testTag("Tabs")) {
+                SecondaryTabRow(selectedTabIndex = state) {
+                    titles.forEachIndexed { index, title ->
+                        Tab(
+                            selected = state == index,
+                            onClick = { state = index },
+                            text = { Text(text = title) }
+                        )
                     }
                 }
             }
+        }
 
         rule.onNodeWithTag("Tabs").assertHeightIsEqualTo(height)
 
@@ -943,26 +862,21 @@
     @Test
     fun scrollableTabRow_layoutHeightRespected() {
         var height by mutableStateOf(0.dp)
-        rule
-            .setMaterialContent(lightColorScheme()) {
-                var state by remember { mutableStateOf(0) }
-                val titles = listOf("Tab 1", "Tab 2", "Tab 3")
-                Column(
-                    Modifier
-                        .heightIn(max = height)
-                        .testTag("Tabs")
-                ) {
-                    SecondaryScrollableTabRow(selectedTabIndex = state) {
-                        titles.forEachIndexed { index, title ->
-                            Tab(
-                                selected = state == index,
-                                onClick = { state = index },
-                                text = { Text(text = title) }
-                            )
-                        }
+        rule.setMaterialContent(lightColorScheme()) {
+            var state by remember { mutableStateOf(0) }
+            val titles = listOf("Tab 1", "Tab 2", "Tab 3")
+            Column(Modifier.heightIn(max = height).testTag("Tabs")) {
+                SecondaryScrollableTabRow(selectedTabIndex = state) {
+                    titles.forEachIndexed { index, title ->
+                        Tab(
+                            selected = state == index,
+                            onClick = { state = index },
+                            text = { Text(text = title) }
+                        )
                     }
                 }
             }
+        }
 
         rule.onNodeWithTag("Tabs").assertHeightIsEqualTo(height)
 
@@ -975,10 +889,7 @@
     @Test
     fun tabRow_noTabsHasHeightZero() {
         rule.setMaterialContent(lightColorScheme()) {
-            SecondaryTabRow(
-                modifier = Modifier.testTag("tabRow"),
-                selectedTabIndex = 0
-            ) {}
+            SecondaryTabRow(modifier = Modifier.testTag("tabRow"), selectedTabIndex = 0) {}
         }
 
         val tabRowBounds = rule.onNodeWithTag("tabRow").getUnclippedBoundsInRoot()
diff --git a/compose/material3/material3/src/androidInstrumentedTest/kotlin/androidx/compose/material3/TextFieldDecorationBoxTest.kt b/compose/material3/material3/src/androidInstrumentedTest/kotlin/androidx/compose/material3/TextFieldDecorationBoxTest.kt
index 176aa44..a130983 100644
--- a/compose/material3/material3/src/androidInstrumentedTest/kotlin/androidx/compose/material3/TextFieldDecorationBoxTest.kt
+++ b/compose/material3/material3/src/androidInstrumentedTest/kotlin/androidx/compose/material3/TextFieldDecorationBoxTest.kt
@@ -67,8 +67,7 @@
 @RunWith(AndroidJUnit4::class)
 @OptIn(ExperimentalMaterial3Api::class)
 class TextFieldDecorationBoxTest {
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
     private val Density = Density(1f)
     private val LabelHeight = 40.dp
@@ -172,8 +171,8 @@
             padding = TextFieldDefaults.contentPaddingWithLabel(top = 40.dp),
             singleLine = true,
             hasLabel = true,
-            expectedHeight = 40.dp + LabelHeight + InnerTextFieldHeight +
-                TextFieldWithLabelVerticalPadding,
+            expectedHeight =
+                40.dp + LabelHeight + InnerTextFieldHeight + TextFieldWithLabelVerticalPadding,
             expectedPosition = 40.dp + LabelHeight
         )
     }
@@ -195,8 +194,8 @@
             padding = TextFieldDefaults.contentPaddingWithLabel(bottom = 40.dp),
             singleLine = true,
             hasLabel = true,
-            expectedHeight = TextFieldWithLabelVerticalPadding + LabelHeight +
-                InnerTextFieldHeight + 40.dp,
+            expectedHeight =
+                TextFieldWithLabelVerticalPadding + LabelHeight + InnerTextFieldHeight + 40.dp,
             expectedPosition = TextFieldWithLabelVerticalPadding + LabelHeight
         )
     }
@@ -218,8 +217,8 @@
             padding = TextFieldDefaults.contentPaddingWithLabel(top = 40.dp),
             singleLine = false,
             hasLabel = true,
-            expectedHeight = 40.dp + LabelHeight + InnerTextFieldHeight +
-                TextFieldWithLabelVerticalPadding,
+            expectedHeight =
+                40.dp + LabelHeight + InnerTextFieldHeight + TextFieldWithLabelVerticalPadding,
             expectedPosition = 40.dp + LabelHeight
         )
     }
@@ -241,8 +240,8 @@
             padding = TextFieldDefaults.contentPaddingWithLabel(bottom = 40.dp),
             singleLine = false,
             hasLabel = true,
-            expectedHeight = TextFieldWithLabelVerticalPadding + LabelHeight +
-                InnerTextFieldHeight + 40.dp,
+            expectedHeight =
+                TextFieldWithLabelVerticalPadding + LabelHeight + InnerTextFieldHeight + 40.dp,
             expectedPosition = TextFieldWithLabelVerticalPadding + LabelHeight
         )
     }
@@ -347,16 +346,15 @@
             CompositionLocalProvider(LocalDensity provides Density) {
                 val interactionSource = remember { MutableInteractionSource() }
                 val singleLine = true
-                val colors = OutlinedTextFieldDefaults.colors(
-                    unfocusedBorderColor = Color.Red
-                )
+                val colors = OutlinedTextFieldDefaults.colors(unfocusedBorderColor = Color.Red)
                 BasicTextField(
                     value = value,
                     onValueChange = {},
-                    modifier = Modifier.size(
-                        with(Density) { textFieldWidth.toDp() },
-                        with(Density) { textFieldHeight.toDp() }
-                    ),
+                    modifier =
+                        Modifier.size(
+                            with(Density) { textFieldWidth.toDp() },
+                            with(Density) { textFieldHeight.toDp() }
+                        ),
                     singleLine = singleLine,
                     interactionSource = interactionSource
                 ) {
@@ -384,16 +382,16 @@
             }
         }
 
-        rule.onNodeWithText(value)
-            .captureToImage()
-            .assertPixels(IntSize(textFieldWidth, textFieldHeight)) {
-                // to account for edge pixels
-                if (it.x in 2..(textFieldWidth - 2) && it.y in 2..(borderWidth - 2)) {
-                    Color.Red
-                } else {
-                    null
-                }
+        rule.onNodeWithText(value).captureToImage().assertPixels(
+            IntSize(textFieldWidth, textFieldHeight)
+        ) {
+            // to account for edge pixels
+            if (it.x in 2..(textFieldWidth - 2) && it.y in 2..(borderWidth - 2)) {
+                Color.Red
+            } else {
+                null
             }
+        }
     }
 
     @SdkSuppress(minSdkVersion = Build.VERSION_CODES.O)
@@ -408,20 +406,23 @@
             CompositionLocalProvider(LocalDensity provides Density) {
                 val interactionSource = remember { MutableInteractionSource() }
                 val singleLine = true
-                val colors = TextFieldDefaults.colors(
-                    unfocusedIndicatorColor = Color.Red
-                )
+                val colors = TextFieldDefaults.colors(unfocusedIndicatorColor = Color.Red)
                 BasicTextField(
                     value = value,
                     onValueChange = {},
-                    modifier = Modifier
-                        .indicatorLine(enabled = true,
-                            isError = false,
-                            colors = colors,
-                            interactionSource = interactionSource,
-                            unfocusedIndicatorLineThickness = with(Density) { borderWidth.toDp() })
-                        .size(with(Density) { textFieldWidth.toDp() },
-                            with(Density) { textFieldHeight.toDp() }),
+                    modifier =
+                        Modifier.indicatorLine(
+                                enabled = true,
+                                isError = false,
+                                colors = colors,
+                                interactionSource = interactionSource,
+                                unfocusedIndicatorLineThickness =
+                                    with(Density) { borderWidth.toDp() }
+                            )
+                            .size(
+                                with(Density) { textFieldWidth.toDp() },
+                                with(Density) { textFieldHeight.toDp() }
+                            ),
                     singleLine = singleLine,
                     interactionSource = interactionSource
                 ) {
@@ -439,18 +440,19 @@
             }
         }
 
-        rule.onNodeWithText(value)
-            .captureToImage()
-            .assertPixels(IntSize(textFieldWidth, textFieldHeight)) {
-                // to account for edge pixels
-                if (it.x in 2..(textFieldWidth - 2) &&
+        rule.onNodeWithText(value).captureToImage().assertPixels(
+            IntSize(textFieldWidth, textFieldHeight)
+        ) {
+            // to account for edge pixels
+            if (
+                it.x in 2..(textFieldWidth - 2) &&
                     it.y in (textFieldHeight - borderWidth + 2)..(textFieldHeight - 2)
-                ) {
-                    Color.Red
-                } else {
-                    null
-                }
+            ) {
+                Color.Red
+            } else {
+                null
             }
+        }
     }
 
     @Test
@@ -488,8 +490,8 @@
         rule.runOnIdle {
             with(Density) {
                 assertThat(size).isNotNull()
-                assertThat(size!!.height).isEqualTo(
-                    (placeholderDimension + verticalPadding * 2).roundToPx())
+                assertThat(size!!.height)
+                    .isEqualTo((placeholderDimension + verticalPadding * 2).roundToPx())
             }
         }
     }
@@ -573,9 +575,12 @@
             expectedPosition = expectedPosition,
             isVertical = true,
             isOutlined = false,
-            label = if (hasLabel) {
-                { Text("Label", modifier = Modifier.height(LabelHeight)) }
-            } else { null },
+            label =
+                if (hasLabel) {
+                    { Text("Label", modifier = Modifier.height(LabelHeight)) }
+                } else {
+                    null
+                },
         )
     }
 
@@ -594,9 +599,12 @@
             isVertical = false,
             isOutlined = false,
             layoutDirection = if (rtl) LayoutDirection.Rtl else LayoutDirection.Ltr,
-            label = if (hasLabel) {
-                { Text("Label", modifier = Modifier.height(LabelHeight)) }
-            } else { null },
+            label =
+                if (hasLabel) {
+                    { Text("Label", modifier = Modifier.height(LabelHeight)) }
+                } else {
+                    null
+                },
         )
     }
 
@@ -630,12 +638,11 @@
                     ) {
                         val innerTextField: @Composable () -> Unit = {
                             Box(
-                                Modifier
-                                    .size(InnerTextFieldWidth, InnerTextFieldHeight)
-                                    .onGloballyPositioned {
-                                        position = it.positionInRoot()
-                                    }
-                            ) { it() }
+                                Modifier.size(InnerTextFieldWidth, InnerTextFieldHeight)
+                                    .onGloballyPositioned { position = it.positionInRoot() }
+                            ) {
+                                it()
+                            }
                         }
                         if (isOutlined) {
                             OutlinedTextFieldDefaults.DecorationBox(
@@ -665,9 +672,7 @@
             }
         }
 
-        rule.runOnUiThread {
-            focusRequester.requestFocus()
-        }
+        rule.runOnUiThread { focusRequester.requestFocus() }
 
         rule.runOnIdle {
             with(Density) {
@@ -686,13 +691,15 @@
             }
         }
     }
+
     @Test
     fun testTextFields_TextDecoration_noCrashConstraintsInfinity() {
 
         rule.setMaterialContent(lightColorScheme()) {
-            Column(modifier = Modifier.height(IntrinsicSize.Min).horizontalScroll(
-                rememberScrollState()
-            )) {
+            Column(
+                modifier =
+                    Modifier.height(IntrinsicSize.Min).horizontalScroll(rememberScrollState())
+            ) {
                 TextFieldDefaults.DecorationBox(
                     value = "Hats",
                     innerTextField = { Text("Cats") },
@@ -706,6 +713,6 @@
             }
         }
 
-        rule.runOnIdle { }
+        rule.runOnIdle {}
     }
 }
diff --git a/compose/material3/material3/src/androidInstrumentedTest/kotlin/androidx/compose/material3/TextFieldScreenshotTest.kt b/compose/material3/material3/src/androidInstrumentedTest/kotlin/androidx/compose/material3/TextFieldScreenshotTest.kt
index 2a5ce43..50beab3 100644
--- a/compose/material3/material3/src/androidInstrumentedTest/kotlin/androidx/compose/material3/TextFieldScreenshotTest.kt
+++ b/compose/material3/material3/src/androidInstrumentedTest/kotlin/androidx/compose/material3/TextFieldScreenshotTest.kt
@@ -60,21 +60,20 @@
 @SdkSuppress(minSdkVersion = Build.VERSION_CODES.O)
 class TextFieldScreenshotTest {
     private val TextFieldTag = "TextField"
-    private val longText = TextFieldValue(
-        "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do " +
-            "eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam," +
-            " quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. " +
-            "Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu " +
-            "fugiat nulla pariatur."
-    )
+    private val longText =
+        TextFieldValue(
+            "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do " +
+                "eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam," +
+                " quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. " +
+                "Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu " +
+                "fugiat nulla pariatur."
+        )
 
     private val platformTextStyle = defaultPlatformTextStyle()
 
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
-    @get:Rule
-    val screenshotRule = AndroidXScreenshotTestRule(GOLDEN_MATERIAL3)
+    @get:Rule val screenshotRule = AndroidXScreenshotTestRule(GOLDEN_MATERIAL3)
 
     @Test
     fun textField_withInput() {
@@ -203,14 +202,16 @@
                 value = TextFieldValue(text = text, selection = TextRange(0, text.length)),
                 onValueChange = {},
                 modifier = Modifier.requiredWidth(280.dp).testTag(TextFieldTag),
-                colors = TextFieldDefaults.colors(
-                    // We can only test the background color because popups, which includes the
-                    // selection handles, do not appear in screenshots
-                    selectionColors = TextSelectionColors(
-                        handleColor = Color.Black,
-                        backgroundColor = Color.Green,
+                colors =
+                    TextFieldDefaults.colors(
+                        // We can only test the background color because popups, which includes the
+                        // selection handles, do not appear in screenshots
+                        selectionColors =
+                            TextSelectionColors(
+                                handleColor = Color.Black,
+                                backgroundColor = Color.Green,
+                            )
                     )
-                )
             )
         }
 
@@ -225,9 +226,8 @@
                 value = TextFieldValue(text = text, selection = TextRange(text.length)),
                 onValueChange = {},
                 label = { Text("Label") },
-                modifier = Modifier.requiredHeight(300.dp)
-                    .requiredWidth(280.dp)
-                    .testTag(TextFieldTag)
+                modifier =
+                    Modifier.requiredHeight(300.dp).requiredWidth(280.dp).testTag(TextFieldTag)
             )
         }
 
@@ -241,9 +241,8 @@
             TextField(
                 value = TextFieldValue(text = text, selection = TextRange(text.length)),
                 onValueChange = {},
-                modifier = Modifier.requiredHeight(300.dp)
-                    .requiredWidth(280.dp)
-                    .testTag(TextFieldTag)
+                modifier =
+                    Modifier.requiredHeight(300.dp).requiredWidth(280.dp).testTag(TextFieldTag)
             )
         }
 
@@ -258,9 +257,8 @@
                 onValueChange = {},
                 label = { Text("Label") },
                 placeholder = { Text("placeholder") },
-                modifier = Modifier.requiredHeight(300.dp)
-                    .requiredWidth(280.dp)
-                    .testTag(TextFieldTag)
+                modifier =
+                    Modifier.requiredHeight(300.dp).requiredWidth(280.dp).testTag(TextFieldTag)
             )
         }
 
@@ -276,9 +274,8 @@
                 value = "",
                 onValueChange = {},
                 placeholder = { Text("placeholder") },
-                modifier = Modifier.requiredHeight(300.dp)
-                    .requiredWidth(280.dp)
-                    .testTag(TextFieldTag)
+                modifier =
+                    Modifier.requiredHeight(300.dp).requiredWidth(280.dp).testTag(TextFieldTag)
             )
         }
 
@@ -294,9 +291,8 @@
                 value = "",
                 onValueChange = {},
                 label = { Text("Label") },
-                modifier = Modifier.requiredHeight(300.dp)
-                    .requiredWidth(280.dp)
-                    .testTag(TextFieldTag)
+                modifier =
+                    Modifier.requiredHeight(300.dp).requiredWidth(280.dp).testTag(TextFieldTag)
             )
         }
 
@@ -422,7 +418,7 @@
         rule.setMaterialContent(lightColorScheme()) {
             TextField(
                 value = longText,
-                onValueChange = { },
+                onValueChange = {},
                 singleLine = true,
                 modifier = Modifier.testTag(TextFieldTag).requiredWidth(300.dp),
                 enabled = false
@@ -477,7 +473,7 @@
         rule.setMaterialContent(lightColorScheme()) {
             TextField(
                 value = longText,
-                onValueChange = { },
+                onValueChange = {},
                 modifier = Modifier.testTag(TextFieldTag).requiredWidth(300.dp),
                 singleLine = true,
                 enabled = true,
@@ -503,10 +499,8 @@
                 value = TextFieldValue(text = text, selection = TextRange(text.length)),
                 onValueChange = {},
                 modifier = Modifier.width(300.dp).testTag(TextFieldTag),
-                textStyle = TextStyle(
-                    textAlign = TextAlign.Center,
-                    platformStyle = platformTextStyle
-                ),
+                textStyle =
+                    TextStyle(textAlign = TextAlign.Center, platformStyle = platformTextStyle),
                 singleLine = true
             )
         }
@@ -761,13 +755,19 @@
 
         assertAgainstGolden("textField_leadingTrailingIcons_dark")
     }
+
     private fun SemanticsNodeInteraction.focus() {
         // split click into (down) and (move, up) to enforce a composition in between
-        this.performTouchInput { down(center) }.performTouchInput { move(); up() }
+        this.performTouchInput { down(center) }
+            .performTouchInput {
+                move()
+                up()
+            }
     }
 
     private fun assertAgainstGolden(goldenIdentifier: String) {
-        rule.onNodeWithTag(TextFieldTag)
+        rule
+            .onNodeWithTag(TextFieldTag)
             .captureToImage()
             .assertAgainstGolden(screenshotRule, goldenIdentifier)
     }
diff --git a/compose/material3/material3/src/androidInstrumentedTest/kotlin/androidx/compose/material3/TextFieldTest.kt b/compose/material3/material3/src/androidInstrumentedTest/kotlin/androidx/compose/material3/TextFieldTest.kt
index aa7bf96..e2cb589 100644
--- a/compose/material3/material3/src/androidInstrumentedTest/kotlin/androidx/compose/material3/TextFieldTest.kt
+++ b/compose/material3/material3/src/androidInstrumentedTest/kotlin/androidx/compose/material3/TextFieldTest.kt
@@ -130,53 +130,47 @@
     private val TextFieldWidth = 300.dp
     private val TextFieldTag = "textField"
 
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
     @Test
     fun testTextField_setSmallHeight() {
-        rule.setMaterialContentForSizeAssertions {
-            TextField(
-                value = "input",
-                onValueChange = {},
-                modifier = Modifier.height(20.dp)
-            )
-        }
+        rule
+            .setMaterialContentForSizeAssertions {
+                TextField(value = "input", onValueChange = {}, modifier = Modifier.height(20.dp))
+            }
             .assertHeightIsEqualTo(20.dp)
     }
 
     @Test
     fun testTextField_setSmallWidth() {
-        rule.setMaterialContentForSizeAssertions {
-            TextField(
-                value = "input",
-                onValueChange = {},
-                modifier = Modifier.requiredWidth(40.dp)
-            )
-        }
+        rule
+            .setMaterialContentForSizeAssertions {
+                TextField(
+                    value = "input",
+                    onValueChange = {},
+                    modifier = Modifier.requiredWidth(40.dp)
+                )
+            }
             .assertWidthIsEqualTo(40.dp)
     }
 
     @Test
     fun testTextField_defaultHeight() {
-        rule.setMaterialContentForSizeAssertions {
-            TextField(
-                value = "",
-                onValueChange = {},
-                textStyle = TextStyle(fontSize = 1.sp), // ensure text size is minimum
-            )
-        }
+        rule
+            .setMaterialContentForSizeAssertions {
+                TextField(
+                    value = "",
+                    onValueChange = {},
+                    textStyle = TextStyle(fontSize = 1.sp), // ensure text size is minimum
+                )
+            }
             .assertHeightIsEqualTo(ExpectedDefaultTextFieldHeight)
     }
 
     @Test
     fun testTextField_defaultWidth() {
-        rule.setMaterialContentForSizeAssertions {
-            TextField(
-                value = "input",
-                onValueChange = {}
-            )
-        }
+        rule
+            .setMaterialContentForSizeAssertions { TextField(value = "input", onValueChange = {}) }
             .assertWidthIsEqualTo(ExpectedDefaultTextFieldWidth)
     }
 
@@ -210,12 +204,8 @@
         val interactions1 = mutableListOf<Interaction>()
         val interactions2 = mutableListOf<Interaction>()
 
-        scope!!.launch {
-            interactionSource1.interactions.collect { interactions1.add(it) }
-        }
-        scope!!.launch {
-            interactionSource2.interactions.collect { interactions2.add(it) }
-        }
+        scope!!.launch { interactionSource1.interactions.collect { interactions1.add(it) } }
+        scope!!.launch { interactionSource2.interactions.collect { interactions2.add(it) } }
 
         rule.runOnIdle {
             assertThat(interactions1).isEmpty()
@@ -258,18 +248,12 @@
 
         val interactions = mutableListOf<Interaction>()
 
-        scope!!.launch {
-            interactionSource.interactions.collect { interactions.add(it) }
-        }
+        scope!!.launch { interactionSource.interactions.collect { interactions.add(it) } }
 
-        rule.runOnIdle {
-            assertThat(interactions).isEmpty()
-        }
+        rule.runOnIdle { assertThat(interactions).isEmpty() }
 
         // Click on (2, 2) which is Surface area and outside input area
-        rule.onNodeWithTag(TextFieldTag).performTouchInput {
-            click(Offset(2f, 2f))
-        }
+        rule.onNodeWithTag(TextFieldTag).performTouchInput { click(Offset(2f, 2f)) }
 
         rule.runOnIdle {
             // Not asserting total size as we have other interactions here too
@@ -285,11 +269,11 @@
             hostView = LocalView.current
             Box {
                 TextField(
-                    modifier = Modifier
-                        .focusRequester(parentFocusRequester)
-                        .focusTarget()
-                        .focusRequester(focusRequester)
-                        .testTag(TextFieldTag),
+                    modifier =
+                        Modifier.focusRequester(parentFocusRequester)
+                            .focusTarget()
+                            .focusRequester(focusRequester)
+                            .testTag(TextFieldTag),
                     value = "input",
                     onValueChange = {}
                 )
@@ -316,11 +300,11 @@
             softwareKeyboardController = LocalSoftwareKeyboardController.current
             Box {
                 TextField(
-                    modifier = Modifier
-                        .focusRequester(parentFocusRequester)
-                        .focusTarget()
-                        .focusRequester(focusRequester)
-                        .testTag(TextFieldTag),
+                    modifier =
+                        Modifier.focusRequester(parentFocusRequester)
+                            .focusTarget()
+                            .focusRequester(focusRequester)
+                            .testTag(TextFieldTag),
                     value = "input",
                     onValueChange = {}
                 )
@@ -349,11 +333,9 @@
                 singleLine = true,
                 label = {
                     Box(
-                        Modifier
-                            .size(MinTextLineHeight)
-                            .onGloballyPositioned {
-                                labelPosition.value = it.positionInRoot()
-                            }
+                        Modifier.size(MinTextLineHeight).onGloballyPositioned {
+                            labelPosition.value = it.positionInRoot()
+                        }
                     )
                 }
             )
@@ -363,9 +345,9 @@
             // x position is start + padding
             assertThat(labelPosition.value?.x).isWithin(1f).of(ExpectedPadding.toPx())
             // y position is centered
-            assertThat(labelPosition.value?.y).isWithin(1f).of(
-                (ExpectedDefaultTextFieldHeight - MinTextLineHeight).toPx() / 2f
-            )
+            assertThat(labelPosition.value?.y)
+                .isWithin(1f)
+                .of((ExpectedDefaultTextFieldHeight - MinTextLineHeight).toPx() / 2f)
         }
     }
 
@@ -378,11 +360,9 @@
                 onValueChange = {},
                 label = {
                     Box(
-                        Modifier
-                            .size(MinTextLineHeight)
-                            .onGloballyPositioned {
-                                labelPosition.value = it.positionInRoot()
-                            }
+                        Modifier.size(MinTextLineHeight).onGloballyPositioned {
+                            labelPosition.value = it.positionInRoot()
+                        }
                     )
                 }
             )
@@ -407,11 +387,9 @@
                 modifier = Modifier.height(height),
                 label = {
                     Box(
-                        Modifier
-                            .size(MinTextLineHeight)
-                            .onGloballyPositioned {
-                                labelPosition.value = it.positionInRoot()
-                            }
+                        Modifier.size(MinTextLineHeight).onGloballyPositioned {
+                            labelPosition.value = it.positionInRoot()
+                        }
                     )
                 }
             )
@@ -435,11 +413,9 @@
                 onValueChange = {},
                 label = {
                     Box(
-                        Modifier
-                            .size(MinFocusedLabelLineHeight)
-                            .onGloballyPositioned {
-                                labelPosition.value = it.positionInRoot()
-                            }
+                        Modifier.size(MinFocusedLabelLineHeight).onGloballyPositioned {
+                            labelPosition.value = it.positionInRoot()
+                        }
                     )
                 }
             )
@@ -452,9 +428,9 @@
             // x position is start + padding
             assertThat(labelPosition.value?.x).isWithin(1f).of(ExpectedPadding.toPx())
             // y position is top + (different) padding
-            assertThat(labelPosition.value?.y).isWithin(1f).of(
-                TextFieldWithLabelVerticalPadding.toPx()
-            )
+            assertThat(labelPosition.value?.y)
+                .isWithin(1f)
+                .of(TextFieldWithLabelVerticalPadding.toPx())
         }
     }
 
@@ -467,11 +443,9 @@
                 onValueChange = {},
                 label = {
                     Box(
-                        Modifier
-                            .size(MinFocusedLabelLineHeight)
-                            .onGloballyPositioned {
-                                labelPosition.value = it.positionInRoot()
-                            }
+                        Modifier.size(MinFocusedLabelLineHeight).onGloballyPositioned {
+                            labelPosition.value = it.positionInRoot()
+                        }
                     )
                 }
             )
@@ -481,9 +455,9 @@
             // x position is start + padding
             assertThat(labelPosition.value?.x).isWithin(1f).of(ExpectedPadding.toPx())
             // y position is top + (different) padding
-            assertThat(labelPosition.value?.y).isWithin(1f).of(
-                TextFieldWithLabelVerticalPadding.toPx()
-            )
+            assertThat(labelPosition.value?.y)
+                .isWithin(1f)
+                .of(TextFieldWithLabelVerticalPadding.toPx())
         }
     }
 
@@ -498,11 +472,9 @@
                 label = { Box(Modifier.size(MinFocusedLabelLineHeight)) },
                 placeholder = {
                     Box(
-                        Modifier
-                            .size(MinTextLineHeight)
-                            .onGloballyPositioned {
-                                placeholderPosition.value = it.positionInRoot()
-                            }
+                        Modifier.size(MinTextLineHeight).onGloballyPositioned {
+                            placeholderPosition.value = it.positionInRoot()
+                        }
                     )
                 }
             )
@@ -515,9 +487,9 @@
             // x position is start + padding
             assertThat(placeholderPosition.value?.x).isWithin(1f).of(ExpectedPadding.toPx())
             // y position is top + padding + label height
-            assertThat(placeholderPosition.value?.y).isWithin(1f).of(
-                (TextFieldWithLabelVerticalPadding + MinFocusedLabelLineHeight).toPx()
-            )
+            assertThat(placeholderPosition.value?.y)
+                .isWithin(1f)
+                .of((TextFieldWithLabelVerticalPadding + MinFocusedLabelLineHeight).toPx())
         }
     }
 
@@ -531,11 +503,9 @@
                 onValueChange = {},
                 placeholder = {
                     Box(
-                        Modifier
-                            .size(MinTextLineHeight)
-                            .onGloballyPositioned {
-                                placeholderPosition.value = it.positionInRoot()
-                            }
+                        Modifier.size(MinTextLineHeight).onGloballyPositioned {
+                            placeholderPosition.value = it.positionInRoot()
+                        }
                     )
                 }
             )
@@ -564,10 +534,11 @@
                 placeholder = {
                     Text(
                         text = "placeholder",
-                        modifier = Modifier.onGloballyPositioned {
-                            placeholderPosition.value = it.positionInRoot()
-                            placeholderSize.value = it.size
-                        }
+                        modifier =
+                            Modifier.onGloballyPositioned {
+                                placeholderPosition.value = it.positionInRoot()
+                                placeholderSize.value = it.size
+                            }
                     )
                 }
             )
@@ -591,8 +562,7 @@
                 onValueChange = {},
                 placeholder = {
                     Text("placeholder")
-                    assertThat(LocalTextStyle.current)
-                        .isEqualTo(MaterialTheme.typography.bodyLarge)
+                    assertThat(LocalTextStyle.current).isEqualTo(MaterialTheme.typography.bodyLarge)
                 }
             )
         }
@@ -610,10 +580,11 @@
                 modifier = Modifier.testTag(TextFieldTag),
                 value = text.value,
                 onValueChange = { text.value = it },
-                colors = TextFieldDefaults.colors(
-                    focusedPlaceholderColor = Color.Red,
-                    unfocusedPlaceholderColor = Color.Green,
-                ),
+                colors =
+                    TextFieldDefaults.colors(
+                        focusedPlaceholderColor = Color.Red,
+                        unfocusedPlaceholderColor = Color.Green,
+                    ),
                 placeholder = {
                     Text("Placeholder")
                     assertThat(LocalContentColor.current)
@@ -648,20 +619,16 @@
                 onValueChange = {},
                 label = {
                     Box(
-                        Modifier
-                            .size(labelSize)
-                            .onGloballyPositioned {
-                                labelPosition.value = it.positionInRoot()
-                            }
+                        Modifier.size(labelSize).onGloballyPositioned {
+                            labelPosition.value = it.positionInRoot()
+                        }
                     )
                 },
                 placeholder = {
                     Box(
-                        Modifier
-                            .size(placeholderSize)
-                            .onGloballyPositioned {
-                                placeholderPosition.value = it.positionInRoot()
-                            }
+                        Modifier.size(placeholderSize).onGloballyPositioned {
+                            placeholderPosition.value = it.positionInRoot()
+                        }
                     )
                 }
             )
@@ -678,19 +645,26 @@
             // label x position is start + padding
             assertThat(labelPosition.value?.x).isWithin(1f).of(ExpectedPadding.toPx())
             // label y position is top + padding, then centered within allocated space
-            assertThat(labelPosition.value?.y).isWithin(1f).of(
-                (TextFieldWithLabelVerticalPadding + (MinFocusedLabelLineHeight - labelSize) / 2)
-                    .toPx()
-            )
+            assertThat(labelPosition.value?.y)
+                .isWithin(1f)
+                .of(
+                    (TextFieldWithLabelVerticalPadding +
+                            (MinFocusedLabelLineHeight - labelSize) / 2)
+                        .toPx()
+                )
 
             // placeholder x position is start + padding
             assertThat(placeholderPosition.value?.x).isWithin(1f).of(ExpectedPadding.toPx())
             // placeholder y position is top + padding + label height, then centered within
             // allocated space
-            assertThat(placeholderPosition.value?.y).isWithin(1f).of(
-                (TextFieldWithLabelVerticalPadding + MinFocusedLabelLineHeight +
-                    (MinTextLineHeight - placeholderSize) / 2).toPx()
-            )
+            assertThat(placeholderPosition.value?.y)
+                .isWithin(1f)
+                .of(
+                    (TextFieldWithLabelVerticalPadding +
+                            MinFocusedLabelLineHeight +
+                            (MinTextLineHeight - placeholderSize) / 2)
+                        .toPx()
+                )
         }
     }
 
@@ -739,27 +713,27 @@
                 // leading
                 assertThat(leadingSize.value).isEqualTo(IntSize(size.roundToPx(), size.roundToPx()))
                 assertThat(leadingPosition.value?.x).isEqualTo(IconPadding.roundToPx().toFloat())
-                assertThat(leadingPosition.value?.y).isEqualTo(
-                    ((textFieldHeight.roundToPx() - leadingSize.value!!.height) / 2f).roundToInt()
-                        .toFloat()
-                )
-                // trailing
-                assertThat(trailingSize.value).isEqualTo(
-                    IntSize(
-                        size.roundToPx(),
-                        size.roundToPx()
+                assertThat(leadingPosition.value?.y)
+                    .isEqualTo(
+                        ((textFieldHeight.roundToPx() - leadingSize.value!!.height) / 2f)
+                            .roundToInt()
+                            .toFloat()
                     )
-                )
-                assertThat(trailingPosition.value?.x).isEqualTo(
-                    (
-                        TextFieldWidth.roundToPx() - IconPadding.roundToPx() -
-                            trailingSize.value!!.width
-                        ).toFloat()
-                )
+                // trailing
+                assertThat(trailingSize.value)
+                    .isEqualTo(IntSize(size.roundToPx(), size.roundToPx()))
+                assertThat(trailingPosition.value?.x)
+                    .isEqualTo(
+                        (TextFieldWidth.roundToPx() -
+                                IconPadding.roundToPx() -
+                                trailingSize.value!!.width)
+                            .toFloat()
+                    )
                 assertThat(trailingPosition.value?.y)
                     .isEqualTo(
                         ((textFieldHeight.roundToPx() - trailingSize.value!!.height) / 2f)
-                            .roundToInt().toFloat()
+                            .roundToInt()
+                            .toFloat()
                     )
             }
         }
@@ -784,10 +758,11 @@
                     leadingIcon = {
                         IconButton(
                             onClick = {},
-                            modifier = Modifier.onGloballyPositioned {
-                                leadingPosition = it.positionInRoot()
-                                leadingSize = it.size
-                            }
+                            modifier =
+                                Modifier.onGloballyPositioned {
+                                    leadingPosition = it.positionInRoot()
+                                    leadingSize = it.size
+                                }
                         ) {
                             Icon(Icons.Default.Favorite, null)
                         }
@@ -795,10 +770,11 @@
                     trailingIcon = {
                         IconButton(
                             onClick = {},
-                            modifier = Modifier.onGloballyPositioned {
-                                trailingPosition = it.positionInRoot()
-                                trailingSize = it.size
-                            }
+                            modifier =
+                                Modifier.onGloballyPositioned {
+                                    trailingPosition = it.positionInRoot()
+                                    trailingSize = it.size
+                                }
                         ) {
                             Icon(Icons.Default.Favorite, null)
                         }
@@ -814,21 +790,21 @@
                 // leading
                 assertThat(leadingSize).isEqualTo(IntSize(size.roundToPx(), size.roundToPx()))
                 assertThat(leadingPosition?.x).isEqualTo(0f)
-                assertThat(leadingPosition?.y).isEqualTo(
-                    ((textFieldHeight.roundToPx() - leadingSize!!.height) / 2f).roundToInt()
-                        .toFloat()
-                )
+                assertThat(leadingPosition?.y)
+                    .isEqualTo(
+                        ((textFieldHeight.roundToPx() - leadingSize!!.height) / 2f)
+                            .roundToInt()
+                            .toFloat()
+                    )
                 // trailing
-                assertThat(trailingSize).isEqualTo(
-                    IntSize(size.roundToPx(), size.roundToPx())
-                )
-                assertThat(trailingPosition?.x).isEqualTo(
-                    (TextFieldWidth.roundToPx() - trailingSize!!.width).toFloat()
-                )
+                assertThat(trailingSize).isEqualTo(IntSize(size.roundToPx(), size.roundToPx()))
+                assertThat(trailingPosition?.x)
+                    .isEqualTo((TextFieldWidth.roundToPx() - trailingSize!!.width).toFloat())
                 assertThat(trailingPosition?.y)
                     .isEqualTo(
                         ((textFieldHeight.roundToPx() - trailingSize!!.height) / 2f)
-                            .roundToInt().toFloat()
+                            .roundToInt()
+                            .toFloat()
                     )
             }
         }
@@ -853,22 +829,18 @@
                     modifier = Modifier.size(TextFieldWidth, textFieldHeight),
                     leadingIcon = {
                         Box(
-                            Modifier
-                                .size(size)
-                                .onGloballyPositioned {
-                                    leadingPosition = it.positionInRoot()
-                                    leadingSize = it.size
-                                }
+                            Modifier.size(size).onGloballyPositioned {
+                                leadingPosition = it.positionInRoot()
+                                leadingSize = it.size
+                            }
                         )
                     },
                     trailingIcon = {
                         Box(
-                            Modifier
-                                .size(size)
-                                .onGloballyPositioned {
-                                    trailingPosition = it.positionInRoot()
-                                    trailingSize = it.size
-                                }
+                            Modifier.size(size).onGloballyPositioned {
+                                trailingPosition = it.positionInRoot()
+                                trailingSize = it.size
+                            }
                         )
                     }
                 )
@@ -880,21 +852,21 @@
                 // leading
                 assertThat(leadingSize).isEqualTo(IntSize(size.roundToPx(), size.roundToPx()))
                 assertThat(leadingPosition?.x).isEqualTo(0f)
-                assertThat(leadingPosition?.y).isEqualTo(
-                    ((textFieldHeight.roundToPx() - leadingSize!!.height) / 2f).roundToInt()
-                        .toFloat()
-                )
+                assertThat(leadingPosition?.y)
+                    .isEqualTo(
+                        ((textFieldHeight.roundToPx() - leadingSize!!.height) / 2f)
+                            .roundToInt()
+                            .toFloat()
+                    )
                 // trailing
-                assertThat(trailingSize).isEqualTo(
-                    IntSize(size.roundToPx(), size.roundToPx())
-                )
-                assertThat(trailingPosition?.x).isEqualTo(
-                    (TextFieldWidth.roundToPx() - trailingSize!!.width).toFloat()
-                )
+                assertThat(trailingSize).isEqualTo(IntSize(size.roundToPx(), size.roundToPx()))
+                assertThat(trailingPosition?.x)
+                    .isEqualTo((TextFieldWidth.roundToPx() - trailingSize!!.width).toFloat())
                 assertThat(trailingPosition?.y)
                     .isEqualTo(
                         ((textFieldHeight.roundToPx() - trailingSize!!.height) / 2f)
-                            .roundToInt().toFloat()
+                            .roundToInt()
+                            .toFloat()
                     )
             }
         }
@@ -917,20 +889,16 @@
                     label = { Box(Modifier.size(MinFocusedLabelLineHeight)) },
                     prefix = {
                         Box(
-                            Modifier
-                                .size(prefixSize)
-                                .onGloballyPositioned {
-                                    prefixPosition.value = it.positionInRoot()
-                                }
+                            Modifier.size(prefixSize).onGloballyPositioned {
+                                prefixPosition.value = it.positionInRoot()
+                            }
                         )
                     },
                     suffix = {
                         Box(
-                            Modifier
-                                .size(suffixSize)
-                                .onGloballyPositioned {
-                                    suffixPosition.value = it.positionInRoot()
-                                }
+                            Modifier.size(suffixSize).onGloballyPositioned {
+                                suffixPosition.value = it.positionInRoot()
+                            }
                         )
                     }
                 )
@@ -941,17 +909,17 @@
             with(density) {
                 // prefix
                 assertThat(prefixPosition.value?.x).isWithin(1f).of(ExpectedPadding.toPx())
-                assertThat(prefixPosition.value?.y).isWithin(1f).of(
-                    (TextFieldWithLabelVerticalPadding + MinFocusedLabelLineHeight).toPx()
-                )
+                assertThat(prefixPosition.value?.y)
+                    .isWithin(1f)
+                    .of((TextFieldWithLabelVerticalPadding + MinFocusedLabelLineHeight).toPx())
 
                 // suffix
-                assertThat(suffixPosition.value?.x).isWithin(1f).of(
-                    (TextFieldWidth - ExpectedPadding - suffixSize).toPx()
-                )
-                assertThat(suffixPosition.value?.y).isWithin(1f).of(
-                    (TextFieldWithLabelVerticalPadding + MinFocusedLabelLineHeight).toPx()
-                )
+                assertThat(suffixPosition.value?.x)
+                    .isWithin(1f)
+                    .of((TextFieldWidth - ExpectedPadding - suffixSize).toPx())
+                assertThat(suffixPosition.value?.y)
+                    .isWithin(1f)
+                    .of((TextFieldWithLabelVerticalPadding + MinFocusedLabelLineHeight).toPx())
             }
         }
     }
@@ -972,20 +940,16 @@
                     modifier = Modifier.width(TextFieldWidth),
                     prefix = {
                         Box(
-                            Modifier
-                                .size(prefixSize)
-                                .onGloballyPositioned {
-                                    prefixPosition.value = it.positionInRoot()
-                                }
+                            Modifier.size(prefixSize).onGloballyPositioned {
+                                prefixPosition.value = it.positionInRoot()
+                            }
                         )
                     },
                     suffix = {
                         Box(
-                            Modifier
-                                .size(suffixSize)
-                                .onGloballyPositioned {
-                                    suffixPosition.value = it.positionInRoot()
-                                }
+                            Modifier.size(suffixSize).onGloballyPositioned {
+                                suffixPosition.value = it.positionInRoot()
+                            }
                         )
                     }
                 )
@@ -999,9 +963,9 @@
                 assertThat(prefixPosition.value?.y).isWithin(1f).of(ExpectedPadding.toPx())
 
                 // suffix
-                assertThat(suffixPosition.value?.x).isWithin(1f).of(
-                    (TextFieldWidth - ExpectedPadding - suffixSize).toPx()
-                )
+                assertThat(suffixPosition.value?.x)
+                    .isWithin(1f)
+                    .of((TextFieldWidth - ExpectedPadding - suffixSize).toPx())
                 assertThat(suffixPosition.value?.y).isWithin(1f).of(ExpectedPadding.toPx())
             }
         }
@@ -1023,20 +987,16 @@
                     modifier = Modifier.width(TextFieldWidth),
                     prefix = {
                         Box(
-                            Modifier
-                                .size(prefixSize)
-                                .onGloballyPositioned {
-                                    prefixPosition.value = it.positionInRoot()
-                                }
+                            Modifier.size(prefixSize).onGloballyPositioned {
+                                prefixPosition.value = it.positionInRoot()
+                            }
                         )
                     },
                     suffix = {
                         Box(
-                            Modifier
-                                .size(suffixSize)
-                                .onGloballyPositioned {
-                                    suffixPosition.value = it.positionInRoot()
-                                }
+                            Modifier.size(suffixSize).onGloballyPositioned {
+                                suffixPosition.value = it.positionInRoot()
+                            }
                         )
                     },
                     leadingIcon = { Icon(Icons.Default.Favorite, null) },
@@ -1050,15 +1010,18 @@
                 val iconSize = 24.dp // default icon size
 
                 // prefix
-                assertThat(prefixPosition.value?.x).isWithin(1f).of(
-                    (ExpectedPadding + IconPadding + iconSize).toPx()
-                )
+                assertThat(prefixPosition.value?.x)
+                    .isWithin(1f)
+                    .of((ExpectedPadding + IconPadding + iconSize).toPx())
                 assertThat(prefixPosition.value?.y).isWithin(1f).of(ExpectedPadding.toPx())
 
                 // suffix
-                assertThat(suffixPosition.value?.x).isWithin(1f).of(
-                    (TextFieldWidth - IconPadding - iconSize - ExpectedPadding - suffixSize).toPx()
-                )
+                assertThat(suffixPosition.value?.x)
+                    .isWithin(1f)
+                    .of(
+                        (TextFieldWidth - IconPadding - iconSize - ExpectedPadding - suffixSize)
+                            .toPx()
+                    )
                 assertThat(suffixPosition.value?.y).isWithin(1f).of(ExpectedPadding.toPx())
             }
         }
@@ -1074,9 +1037,10 @@
                 label = {
                     Text(
                         text = "label",
-                        modifier = Modifier.onGloballyPositioned {
-                            labelPosition.value = it.positionInRoot()
-                        }
+                        modifier =
+                            Modifier.onGloballyPositioned {
+                                labelPosition.value = it.positionInRoot()
+                            }
                     )
                 },
                 trailingIcon = { Icon(Icons.Default.Favorite, null) },
@@ -1086,9 +1050,9 @@
 
         rule.runOnIdleWithDensity {
             val iconSize = 24.dp // default icon size
-            assertThat(labelPosition.value?.x).isWithin(1f).of(
-                (ExpectedPadding + IconPadding + iconSize).toPx()
-            )
+            assertThat(labelPosition.value?.x)
+                .isWithin(1f)
+                .of((ExpectedPadding + IconPadding + iconSize).toPx())
         }
     }
 
@@ -1102,9 +1066,10 @@
                 label = {
                     Text(
                         text = "label",
-                        modifier = Modifier.onGloballyPositioned {
-                            labelPosition.value = it.positionInRoot()
-                        }
+                        modifier =
+                            Modifier.onGloballyPositioned {
+                                labelPosition.value = it.positionInRoot()
+                            }
                     )
                 },
                 trailingIcon = null,
@@ -1164,11 +1129,9 @@
                 textStyle = TextStyle(fontSize = 1.sp), // ensure text size is minimum
                 supportingText = {
                     Box(
-                        Modifier
-                            .size(MinSupportingTextLineHeight)
-                            .onGloballyPositioned {
-                                supportingPosition.value = it.positionInRoot()
-                            }
+                        Modifier.size(MinSupportingTextLineHeight).onGloballyPositioned {
+                            supportingPosition.value = it.positionInRoot()
+                        }
                     )
                 }
             )
@@ -1176,9 +1139,9 @@
 
         rule.runOnIdleWithDensity {
             assertThat(supportingPosition.value?.x).isWithin(1f).of(ExpectedPadding.toPx())
-            assertThat(supportingPosition.value?.y).isWithin(1f).of(
-                (ExpectedDefaultTextFieldHeight + SupportingTopPadding).toPx()
-            )
+            assertThat(supportingPosition.value?.y)
+                .isWithin(1f)
+                .of((ExpectedDefaultTextFieldHeight + SupportingTopPadding).toPx())
         }
     }
 
@@ -1190,16 +1153,13 @@
             TextField(
                 value = "",
                 onValueChange = {},
-                modifier = Modifier.onGloballyPositioned {
-                    tfSize.value = it.size
-                },
+                modifier = Modifier.onGloballyPositioned { tfSize.value = it.size },
                 supportingText = {
                     Text(
-                        text = "Long long long long long long long long long long long long " +
-                            "long long long long long long long long long long long long",
-                        modifier = Modifier.onGloballyPositioned {
-                            supportingSize.value = it.size
-                        }
+                        text =
+                            "Long long long long long long long long long long long long " +
+                                "long long long long long long long long long long long long",
+                        modifier = Modifier.onGloballyPositioned { supportingSize.value = it.size }
                     )
                 }
             )
@@ -1217,17 +1177,14 @@
             TextField(
                 value = "",
                 onValueChange = {},
-                modifier = Modifier.onGloballyPositioned {
-                    tfSize.value = it.size
-                },
+                modifier = Modifier.onGloballyPositioned { tfSize.value = it.size },
                 supportingText = { Text("Supporting") }
             )
         }
 
         rule.runOnIdleWithDensity {
-            assertThat(tfSize.value!!.height).isGreaterThan(
-                ExpectedDefaultTextFieldHeight.roundToPx()
-            )
+            assertThat(tfSize.value!!.height)
+                .isGreaterThan(ExpectedDefaultTextFieldHeight.roundToPx())
         }
     }
 
@@ -1235,11 +1192,7 @@
     fun testTextField_supportingText_remainsVisibleWithTallInput() {
         rule.setMaterialContent(lightColorScheme()) {
             TextField(
-                value = buildString {
-                    repeat(200) {
-                        append("line $it\n")
-                    }
-                },
+                value = buildString { repeat(200) { append("line $it\n") } },
                 onValueChange = {},
                 modifier = Modifier.size(width = ExpectedDefaultTextFieldWidth, height = 150.dp),
                 supportingText = { Text("Supporting", modifier = Modifier.testTag("Supporting")) }
@@ -1262,9 +1215,7 @@
         }
 
         rule.onNodeWithText("Supporting").performClick()
-        rule.runOnIdle {
-            assertThat(focused).isTrue()
-        }
+        rule.runOnIdle { assertThat(focused).isTrue() }
     }
 
     @Test
@@ -1274,8 +1225,7 @@
                 value = "",
                 onValueChange = {},
                 supportingText = {
-                    assertThat(LocalTextStyle.current)
-                        .isEqualTo(MaterialTheme.typography.bodySmall)
+                    assertThat(LocalTextStyle.current).isEqualTo(MaterialTheme.typography.bodySmall)
                     assertThat(LocalContentColor.current)
                         .isEqualTo(MaterialTheme.colorScheme.onSurfaceVariant)
                 }
@@ -1291,10 +1241,8 @@
                 onValueChange = {},
                 isError = true,
                 supportingText = {
-                    assertThat(LocalTextStyle.current)
-                        .isEqualTo(MaterialTheme.typography.bodySmall)
-                    assertThat(LocalContentColor.current)
-                        .isEqualTo(MaterialTheme.colorScheme.error)
+                    assertThat(LocalTextStyle.current).isEqualTo(MaterialTheme.typography.bodySmall)
+                    assertThat(LocalContentColor.current).isEqualTo(MaterialTheme.colorScheme.error)
                 }
             )
         }
@@ -1319,10 +1267,8 @@
                     modifier = Modifier.testTag(TextFieldTag),
                     value = text.value,
                     onValueChange = { text.value = it },
-                    keyboardOptions = KeyboardOptions(
-                        imeAction = ImeAction.Go,
-                        keyboardType = KeyboardType.Email
-                    )
+                    keyboardOptions =
+                        KeyboardOptions(imeAction = ImeAction.Go, keyboardType = KeyboardType.Email)
                 )
             }
         }
@@ -1333,8 +1279,8 @@
             @Suppress("NAME_SHADOWING")
             val editorInfo = editorInfo ?: throw AssertionError("Input session never started")
             val expectedOptions = EditorInfo.IME_ACTION_GO
-            val expectedInputType = EditorInfo.TYPE_CLASS_TEXT or
-                EditorInfo.TYPE_TEXT_VARIATION_EMAIL_ADDRESS
+            val expectedInputType =
+                EditorInfo.TYPE_CLASS_TEXT or EditorInfo.TYPE_TEXT_VARIATION_EMAIL_ADDRESS
             assertThat(editorInfo.imeOptions and expectedOptions).isEqualTo(expectedOptions)
             assertThat(editorInfo.inputType and expectedInputType).isEqualTo(expectedInputType)
         }
@@ -1355,7 +1301,8 @@
             )
         }
 
-        rule.onNodeWithTag(TextFieldTag)
+        rule
+            .onNodeWithTag(TextFieldTag)
             .captureToImage()
             .assertShape(
                 density = rule.density,
@@ -1380,28 +1327,26 @@
                     onValueChange = {},
                     label = { Text("label") },
                     shape = RectangleShape,
-                    leadingIcon = {
-                        Icon(Icons.Default.Favorite, null, tint = Color.Transparent)
-                    },
-                    trailingIcon = {
-                        Icon(Icons.Default.Favorite, null, tint = Color.Transparent)
-                    },
-                    colors = TextFieldDefaults.colors(
-                        focusedContainerColor = Color.Blue,
-                        unfocusedContainerColor = Color.Blue,
-                        focusedIndicatorColor = Color.Transparent,
-                        unfocusedIndicatorColor = Color.Transparent,
-                        focusedTextColor = Color.Transparent,
-                        unfocusedTextColor = Color.Transparent,
-                        cursorColor = Color.Transparent,
-                        focusedLabelColor = Color.Transparent,
-                        unfocusedLabelColor = Color.Transparent
-                    )
+                    leadingIcon = { Icon(Icons.Default.Favorite, null, tint = Color.Transparent) },
+                    trailingIcon = { Icon(Icons.Default.Favorite, null, tint = Color.Transparent) },
+                    colors =
+                        TextFieldDefaults.colors(
+                            focusedContainerColor = Color.Blue,
+                            unfocusedContainerColor = Color.Blue,
+                            focusedIndicatorColor = Color.Transparent,
+                            unfocusedIndicatorColor = Color.Transparent,
+                            focusedTextColor = Color.Transparent,
+                            unfocusedTextColor = Color.Transparent,
+                            cursorColor = Color.Transparent,
+                            focusedLabelColor = Color.Transparent,
+                            unfocusedLabelColor = Color.Transparent
+                        )
                 )
             }
         }
 
-        rule.onNodeWithTag(TextFieldTag)
+        rule
+            .onNodeWithTag(TextFieldTag)
             .captureToImage()
             .assertShape(
                 density = rule.density,
@@ -1414,7 +1359,8 @@
 
         rule.onNodeWithTag(TextFieldTag).performClick()
 
-        rule.onNodeWithTag(TextFieldTag)
+        rule
+            .onNodeWithTag(TextFieldTag)
             .captureToImage()
             .assertShape(
                 density = rule.density,
@@ -1438,11 +1384,13 @@
                 append(prefix)
                 append(text)
             }
-            val mapping = object : OffsetMapping {
-                override fun originalToTransformed(offset: Int) = offset + prefix.length
-                override fun transformedToOriginal(offset: Int) =
-                    (offset - prefix.length).coerceAtLeast(0)
-            }
+            val mapping =
+                object : OffsetMapping {
+                    override fun originalToTransformed(offset: Int) = offset + prefix.length
+
+                    override fun transformedToOriginal(offset: Int) =
+                        (offset - prefix.length).coerceAtLeast(0)
+                }
             TransformedText(transformed, mapping)
         }
         rule.setMaterialContent(lightColorScheme()) {
@@ -1457,7 +1405,8 @@
                 colors = TextFieldDefaults.colors(unfocusedContainerColor = Color.White)
             )
         }
-        rule.onNode(SemanticsMatcher.keyIsDefined(SemanticsProperties.Text), true)
+        rule
+            .onNode(SemanticsMatcher.keyIsDefined(SemanticsProperties.Text), true)
             .captureToImage()
             .assertPixels { Color.Red }
     }
@@ -1474,11 +1423,13 @@
                 append(prefix)
                 append(text)
             }
-            val mapping = object : OffsetMapping {
-                override fun originalToTransformed(offset: Int) = offset + prefix.length
-                override fun transformedToOriginal(offset: Int) =
-                    (offset - prefix.length).coerceAtLeast(0)
-            }
+            val mapping =
+                object : OffsetMapping {
+                    override fun originalToTransformed(offset: Int) = offset + prefix.length
+
+                    override fun transformedToOriginal(offset: Int) =
+                        (offset - prefix.length).coerceAtLeast(0)
+                }
             TransformedText(transformed, mapping)
         }
         // While surface is not used in TextField, setMaterialContent wraps content in a Surface
@@ -1497,32 +1448,26 @@
                     )
                 },
                 textStyle = TextStyle(color = Color.White),
-                colors = TextFieldDefaults.colors(
-                    unfocusedContainerColor = Color.White,
-                    unfocusedIndicatorColor = Color.Transparent
-                )
+                colors =
+                    TextFieldDefaults.colors(
+                        unfocusedContainerColor = Color.White,
+                        unfocusedIndicatorColor = Color.Transparent
+                    )
             )
         }
-        rule.onNodeWithTag(TextFieldTag)
-            .captureToImage()
-            .assertPixels {
-                Color.White
-            }
+        rule.onNodeWithTag(TextFieldTag).captureToImage().assertPixels { Color.White }
     }
 
     @Test
     fun testTextField_errorSemantics_defaultMessage() {
         lateinit var errorMessage: String
         rule.setMaterialContent(lightColorScheme()) {
-            TextField(
-                value = "test",
-                onValueChange = {},
-                isError = true
-            )
+            TextField(value = "test", onValueChange = {}, isError = true)
             errorMessage = getString(DefaultErrorMessage)
         }
 
-        rule.onNodeWithText("test")
+        rule
+            .onNodeWithText("test")
             .assert(SemanticsMatcher.keyIsDefined(SemanticsProperties.Error))
             .assert(SemanticsMatcher.expectValue(SemanticsProperties.Error, errorMessage))
     }
@@ -1536,20 +1481,23 @@
             TextField(
                 value = "test",
                 onValueChange = {},
-                modifier = Modifier
-                    .testTag(TextFieldTag)
-                    .semantics { if (isError.value) error(errorMessage) },
+                modifier =
+                    Modifier.testTag(TextFieldTag).semantics {
+                        if (isError.value) error(errorMessage)
+                    },
                 isError = isError.value
             )
             defaultErrorMessage = getString(DefaultErrorMessage)
         }
 
-        rule.onNodeWithTag(TextFieldTag)
+        rule
+            .onNodeWithTag(TextFieldTag)
             .assert(SemanticsMatcher.keyIsDefined(SemanticsProperties.Error))
             .assert(SemanticsMatcher.expectValue(SemanticsProperties.Error, errorMessage))
 
         // Check that default error message is overwritten and not lingering in a child node
-        rule.onNodeWithTag(TextFieldTag, useUnmergedTree = true)
+        rule
+            .onNodeWithTag(TextFieldTag, useUnmergedTree = true)
             .onChildren()
             .fetchSemanticsNodes()
             .forEach { node ->
@@ -1569,11 +1517,7 @@
                         thickness = 10.dp,
                         modifier = Modifier.onGloballyPositioned { dividerSize = it.size }
                     )
-                    TextField(
-                        value = "",
-                        label = { Text(text = "Label") },
-                        onValueChange = {}
-                    )
+                    TextField(value = "", label = { Text(text = "Label") }, onValueChange = {})
                 }
             }
         }
@@ -1632,9 +1576,11 @@
                     contentColor = LocalContentColor.current
                 },
                 modifier = Modifier.focusRequester(focusRequester),
-                colors = TextFieldDefaults.colors(
-                    unfocusedLabelColor = unfocusedLabelColor, focusedLabelColor = focusedLabelColor
-                )
+                colors =
+                    TextFieldDefaults.colors(
+                        unfocusedLabelColor = unfocusedLabelColor,
+                        focusedLabelColor = focusedLabelColor
+                    )
             )
         }
 
@@ -1643,9 +1589,7 @@
             assertThat(textStyle.color).isEqualTo(Color.Unspecified)
         }
 
-        rule.runOnUiThread {
-            focusRequester.requestFocus()
-        }
+        rule.runOnUiThread { focusRequester.requestFocus() }
 
         rule.runOnIdle {
             assertThat(contentColor).isEqualTo(focusedLabelColor)
@@ -1674,10 +1618,11 @@
                         contentColor = LocalContentColor.current
                     },
                     modifier = Modifier.focusRequester(focusRequester),
-                    colors = TextFieldDefaults.colors(
-                        unfocusedLabelColor = unfocusedLabelColor,
-                        focusedLabelColor = focusedLabelColor
-                    )
+                    colors =
+                        TextFieldDefaults.colors(
+                            unfocusedLabelColor = unfocusedLabelColor,
+                            focusedLabelColor = focusedLabelColor
+                        )
                 )
             }
         }
@@ -1687,9 +1632,7 @@
             assertThat(contentColor).isEqualTo(unfocusedLabelColor)
         }
 
-        rule.runOnUiThread {
-            focusRequester.requestFocus()
-        }
+        rule.runOnUiThread { focusRequester.requestFocus() }
 
         rule.runOnIdle {
             assertThat(textStyle.color).isEqualTo(bodySmallColor)
@@ -1717,17 +1660,16 @@
                         contentColor = LocalContentColor.current
                     },
                     modifier = Modifier.focusRequester(focusRequester),
-                    colors = TextFieldDefaults.colors(
-                        unfocusedLabelColor = expectedLabelColor,
-                        focusedLabelColor = focusedLabelColor
-                    )
+                    colors =
+                        TextFieldDefaults.colors(
+                            unfocusedLabelColor = expectedLabelColor,
+                            focusedLabelColor = focusedLabelColor
+                        )
                 )
             }
         }
 
-        rule.runOnUiThread {
-            focusRequester.requestFocus()
-        }
+        rule.runOnUiThread { focusRequester.requestFocus() }
 
         // advance to middle of animation
         rule.mainClock.advanceTimeBy(TextFieldAnimationDuration.toLong() / 2)
@@ -1763,10 +1705,11 @@
                         contentColor = LocalContentColor.current
                     },
                     modifier = Modifier.focusRequester(focusRequester),
-                    colors = TextFieldDefaults.colors(
-                        unfocusedLabelColor = unfocusedLabelColor,
-                        focusedLabelColor = focusedLabelColor
-                    )
+                    colors =
+                        TextFieldDefaults.colors(
+                            unfocusedLabelColor = unfocusedLabelColor,
+                            focusedLabelColor = focusedLabelColor
+                        )
                 )
             }
         }
@@ -1776,9 +1719,7 @@
             assertThat(contentColor).isEqualTo(unfocusedLabelColor)
         }
 
-        rule.runOnUiThread {
-            focusRequester.requestFocus()
-        }
+        rule.runOnUiThread { focusRequester.requestFocus() }
 
         rule.runOnIdle {
             assertThat(textStyle.color).isEqualTo(bodySmallColor)
@@ -1791,9 +1732,7 @@
         var height = 0
         rule.setMaterialContent(lightColorScheme()) {
             val text = remember { mutableStateOf("") }
-            Box(Modifier.onGloballyPositioned {
-                height = it.size.height
-            }) {
+            Box(Modifier.onGloballyPositioned { height = it.size.height }) {
                 Row(Modifier.height(IntrinsicSize.Min)) {
                     TextField(
                         value = text.value,
@@ -1814,9 +1753,7 @@
         var height = 0
         rule.setMaterialContent(lightColorScheme()) {
             val text = remember { mutableStateOf("") }
-            Box(Modifier.onGloballyPositioned {
-                height = it.size.height
-            }) {
+            Box(Modifier.onGloballyPositioned { height = it.size.height }) {
                 Row(Modifier.height(IntrinsicSize.Min)) {
                     TextField(
                         value = text.value,
@@ -1843,17 +1780,12 @@
         val text = "Long text input. ".repeat(20)
         rule.setMaterialContent(lightColorScheme()) {
             Row {
-                Box(
-                    Modifier
-                        .width(150.dp)
-                        .height(IntrinsicSize.Min)
-                ) {
+                Box(Modifier.width(150.dp).height(IntrinsicSize.Min)) {
                     TextField(
                         value = text,
                         onValueChange = {},
-                        modifier = Modifier.onGloballyPositioned {
-                            tfHeightIntrinsic = it.size.height
-                        },
+                        modifier =
+                            Modifier.onGloballyPositioned { tfHeightIntrinsic = it.size.height },
                         leadingIcon = { Icon(Icons.Default.Favorite, null) },
                         trailingIcon = { Icon(Icons.Default.Favorite, null) },
                         prefix = { Text("P") },
@@ -1865,9 +1797,8 @@
                     TextField(
                         value = text,
                         onValueChange = {},
-                        modifier = Modifier.onGloballyPositioned {
-                            tfHeightNoIntrinsic = it.size.height
-                        },
+                        modifier =
+                            Modifier.onGloballyPositioned { tfHeightNoIntrinsic = it.size.height },
                         leadingIcon = { Icon(Icons.Default.Favorite, null) },
                         trailingIcon = { Icon(Icons.Default.Favorite, null) },
                         prefix = { Text("P") },
@@ -1904,33 +1835,23 @@
             )
         }
 
-        rule.onNodeWithTag(TextFieldTag)
-            .performClick()
+        rule.onNodeWithTag(TextFieldTag).performClick()
         rule.waitForIdle()
 
-        rule.onNodeWithTag(TextFieldTag)
-            .performTextClearance()
+        rule.onNodeWithTag(TextFieldTag).performTextClearance()
 
-        rule.runOnIdle {
-            assertThat(callbackCounter).isEqualTo(1)
-        }
+        rule.runOnIdle { assertThat(callbackCounter).isEqualTo(1) }
     }
+
     @Test
     fun testTextFields_noCrashConstraintsInfinity() {
 
         rule.setMaterialContent(lightColorScheme()) {
             Column(
-                modifier = Modifier
-                    .height(IntrinsicSize.Min)
-                    .horizontalScroll(
-                        rememberScrollState()
-                    )
+                modifier =
+                    Modifier.height(IntrinsicSize.Min).horizontalScroll(rememberScrollState())
             ) {
-                TextField(
-                    value = "Cat",
-                    onValueChange = {},
-                    leadingIcon = { Text("Icon") }
-                )
+                TextField(value = "Cat", onValueChange = {}, leadingIcon = { Text("Icon") })
             }
         }
     }
diff --git a/compose/material3/material3/src/androidInstrumentedTest/kotlin/androidx/compose/material3/TextSelectionColorsScreenshotTest.kt b/compose/material3/material3/src/androidInstrumentedTest/kotlin/androidx/compose/material3/TextSelectionColorsScreenshotTest.kt
index 94a4d31..fc78f01 100644
--- a/compose/material3/material3/src/androidInstrumentedTest/kotlin/androidx/compose/material3/TextSelectionColorsScreenshotTest.kt
+++ b/compose/material3/material3/src/androidInstrumentedTest/kotlin/androidx/compose/material3/TextSelectionColorsScreenshotTest.kt
@@ -48,19 +48,17 @@
  * Screenshot test for the SelectionColors provided by [MaterialTheme] and used by the selection
  * handle / background.
  *
- * Note: because we cannot screenshot popups, we cannot see the selection handles in the popup,
- * so we can only test the background color here.
+ * Note: because we cannot screenshot popups, we cannot see the selection handles in the popup, so
+ * we can only test the background color here.
  */
 @LargeTest
 @RunWith(AndroidJUnit4::class)
 @SdkSuppress(minSdkVersion = Build.VERSION_CODES.O)
 class TextSelectionColorsScreenshotTest {
 
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
-    @get:Rule
-    val screenshotRule = AndroidXScreenshotTestRule(GOLDEN_MATERIAL3)
+    @get:Rule val screenshotRule = AndroidXScreenshotTestRule(GOLDEN_MATERIAL3)
 
     @Test
     fun rememberTextSelectionColors() {
@@ -87,116 +85,100 @@
 
     @Test
     fun text_lightThemeSelectionColors() {
-        rule.setContent {
-            TextTestContent(lightColorScheme())
-        }
+        rule.setContent { TextTestContent(lightColorScheme()) }
 
-        rule.onNodeWithText(Text)
-            .performTouchInput {
-                longClick()
-            }
+        rule.onNodeWithText(Text).performTouchInput { longClick() }
 
         rule.waitForIdle()
 
-        rule.onNodeWithTag(Tag)
+        rule
+            .onNodeWithTag(Tag)
             .captureToImage()
             .assertAgainstGolden(screenshotRule, "text_lightThemeSelectionColors")
     }
 
     @Test
     fun text_darkThemeSelectionColors() {
-        rule.setContent {
-            TextTestContent(darkColorScheme())
-        }
+        rule.setContent { TextTestContent(darkColorScheme()) }
 
-        rule.onNodeWithText(Text)
-            .performTouchInput {
-                longClick()
-            }
+        rule.onNodeWithText(Text).performTouchInput { longClick() }
 
         rule.waitForIdle()
 
-        rule.onNodeWithTag(Tag)
+        rule
+            .onNodeWithTag(Tag)
             .captureToImage()
             .assertAgainstGolden(screenshotRule, "text_darkThemeSelectionColors")
     }
 
     @Test
     fun filledTextField_lightThemeSelectionColors() {
-        rule.setContent {
-            FilledTextFieldTestContent(lightColorScheme())
-        }
+        rule.setContent { FilledTextFieldTestContent(lightColorScheme()) }
 
         // Click once to focus text field
-        rule.onNodeWithText(Text)
-            .performTouchInput {
-                click()
-                longClick()
-            }
+        rule.onNodeWithText(Text).performTouchInput {
+            click()
+            longClick()
+        }
 
         rule.waitForIdle()
 
-        rule.onNodeWithTag(Tag)
+        rule
+            .onNodeWithTag(Tag)
             .captureToImage()
             .assertAgainstGolden(screenshotRule, "filledTextField_lightThemeSelectionColors")
     }
 
     @Test
     fun filledTextField_darkThemeSelectionColors() {
-        rule.setContent {
-            FilledTextFieldTestContent(darkColorScheme())
-        }
+        rule.setContent { FilledTextFieldTestContent(darkColorScheme()) }
 
         // Click once to focus text field
-        rule.onNodeWithText(Text)
-            .performTouchInput {
-                click()
-                longClick()
-            }
+        rule.onNodeWithText(Text).performTouchInput {
+            click()
+            longClick()
+        }
 
         rule.waitForIdle()
 
-        rule.onNodeWithTag(Tag)
+        rule
+            .onNodeWithTag(Tag)
             .captureToImage()
             .assertAgainstGolden(screenshotRule, "filledTextField_darkThemeSelectionColors")
     }
 
     @Test
     fun outlinedTextField_lightThemeSelectionColors() {
-        rule.setContent {
-            OutlinedTextFieldTestContent(lightColorScheme())
-        }
+        rule.setContent { OutlinedTextFieldTestContent(lightColorScheme()) }
 
         // Click once to focus text field
-        rule.onNodeWithText(Text)
-            .performTouchInput {
-                click()
-                longClick()
-            }
+        rule.onNodeWithText(Text).performTouchInput {
+            click()
+            longClick()
+        }
 
         rule.waitForIdle()
 
-        rule.onNodeWithTag(Tag)
+        rule
+            .onNodeWithTag(Tag)
             .captureToImage()
             .assertAgainstGolden(screenshotRule, "outlinedTextField_lightThemeSelectionColors")
     }
 
     @Test
     fun outlinedTextField_darkThemeSelectionColors() {
-        rule.setContent {
-            OutlinedTextFieldTestContent(darkColorScheme())
-        }
+        rule.setContent { OutlinedTextFieldTestContent(darkColorScheme()) }
 
         // Click once to focus text field
-        rule.onNodeWithText(Text)
-            .performTouchInput {
-                click()
-                longClick()
-            }
+        rule.onNodeWithText(Text).performTouchInput {
+            click()
+            longClick()
+        }
 
         rule.waitForIdle()
 
-        rule.onNodeWithTag(Tag)
+        rule
+            .onNodeWithTag(Tag)
             .captureToImage()
             .assertAgainstGolden(screenshotRule, "outlinedTextField_darkThemeSelectionColors")
     }
@@ -205,11 +187,7 @@
 @Composable
 private fun TextTestContent(colorScheme: ColorScheme) {
     MaterialTheme(colorScheme) {
-        Surface(Modifier.testTag(Tag)) {
-            SelectionContainer {
-                Text(Text)
-            }
-        }
+        Surface(Modifier.testTag(Tag)) { SelectionContainer { Text(Text) } }
     }
 }
 
@@ -242,9 +220,10 @@
 }
 
 private const val Text = "Selected text"
-private val TextFieldText = TextFieldValue(
-    text = "Selected text",
-    selection = TextRange(0, 8),
-    composition = TextRange(0, 8)
-)
+private val TextFieldText =
+    TextFieldValue(
+        text = "Selected text",
+        selection = TextRange(0, 8),
+        composition = TextRange(0, 8)
+    )
 private const val Tag = "TestTag"
diff --git a/compose/material3/material3/src/androidInstrumentedTest/kotlin/androidx/compose/material3/TextTest.kt b/compose/material3/material3/src/androidInstrumentedTest/kotlin/androidx/compose/material3/TextTest.kt
index 3a68ff9..1458909 100644
--- a/compose/material3/material3/src/androidInstrumentedTest/kotlin/androidx/compose/material3/TextTest.kt
+++ b/compose/material3/material3/src/androidInstrumentedTest/kotlin/androidx/compose/material3/TextTest.kt
@@ -51,16 +51,16 @@
 @RunWith(AndroidJUnit4::class)
 class TextTest {
 
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
-    private val ExpectedTextStyle = TextStyle(
-        color = Color.Blue,
-        textAlign = TextAlign.End,
-        fontSize = 32.sp,
-        fontStyle = FontStyle.Italic,
-        letterSpacing = 0.3.em
-    )
+    private val ExpectedTextStyle =
+        TextStyle(
+            color = Color.Blue,
+            textAlign = TextAlign.End,
+            fontSize = 32.sp,
+            fontStyle = FontStyle.Italic,
+            letterSpacing = 0.3.em
+        )
 
     private val TestText = "TestText"
 
@@ -75,13 +75,11 @@
             }
         }
 
-        assertThat(
-            localTextStyle?.platformStyle?.paragraphStyle?.includeFontPadding
-        ).isEqualTo(false)
+        assertThat(localTextStyle?.platformStyle?.paragraphStyle?.includeFontPadding)
+            .isEqualTo(false)
 
-        assertThat(
-            displayMediumTextStyle?.platformStyle?.paragraphStyle?.includeFontPadding
-        ).isEqualTo(false)
+        assertThat(displayMediumTextStyle?.platformStyle?.paragraphStyle?.includeFontPadding)
+            .isEqualTo(false)
     }
 
     @Test
@@ -124,13 +122,14 @@
         var fontSize: TextUnit? = null
         var fontStyle: FontStyle? = null
         var letterSpacing: TextUnit? = null
-        val testStyle = TextStyle(
-            color = Color.Green,
-            textAlign = TextAlign.Center,
-            fontSize = 16.sp,
-            fontStyle = FontStyle.Normal,
-            letterSpacing = 0.6.em
-        )
+        val testStyle =
+            TextStyle(
+                color = Color.Green,
+                textAlign = TextAlign.Center,
+                fontSize = 16.sp,
+                fontStyle = FontStyle.Normal,
+                letterSpacing = 0.6.em
+            )
         rule.setContent {
             ProvideTextStyle(ExpectedTextStyle) {
                 Box(Modifier.background(Color.White)) {
@@ -255,10 +254,7 @@
         rule.setContent {
             ProvideTextStyle(ExpectedTextStyle) {
                 Box(Modifier.background(Color.White)) {
-                    Text(
-                        TestText,
-                        modifier = Modifier.testTag("text")
-                    )
+                    Text(TestText, modifier = Modifier.testTag("text"))
                 }
             }
         }
@@ -272,17 +268,13 @@
         var switchColor by mutableStateOf(false)
         rule.setContent {
             MaterialTheme {
-                val color = if (switchColor) {
-                    MaterialTheme.colorScheme.surface
-                } else {
-                    MaterialTheme.colorScheme.secondary
-                }
-                Surface(color = color) {
-                    Text(
-                        TestText,
-                        modifier = Modifier.testTag("text")
-                    )
-                }
+                val color =
+                    if (switchColor) {
+                        MaterialTheme.colorScheme.surface
+                    } else {
+                        MaterialTheme.colorScheme.secondary
+                    }
+                Surface(color = color) { Text(TestText, modifier = Modifier.testTag("text")) }
             }
         }
 
@@ -301,16 +293,14 @@
         var switchColor by mutableStateOf(false)
         rule.setContent {
             MaterialTheme {
-                val color = if (switchColor) {
-                    MaterialTheme.colorScheme.surface
-                } else {
-                    MaterialTheme.colorScheme.secondary
-                }
+                val color =
+                    if (switchColor) {
+                        MaterialTheme.colorScheme.surface
+                    } else {
+                        MaterialTheme.colorScheme.secondary
+                    }
                 Surface(color = color) {
-                    Text(
-                        AnnotatedString(TestText),
-                        modifier = Modifier.testTag("text")
-                    )
+                    Text(AnnotatedString(TestText), modifier = Modifier.testTag("text"))
                 }
             }
         }
@@ -327,28 +317,29 @@
 
     private fun getTextLayoutResults(tag: String): TextLayoutResult? {
         val textLayoutResults = mutableListOf<TextLayoutResult>()
-        rule.onNodeWithTag(tag)
-            .performSemanticsAction(SemanticsActions.GetTextLayoutResult) { it(textLayoutResults) }
+        rule.onNodeWithTag(tag).performSemanticsAction(SemanticsActions.GetTextLayoutResult) {
+            it(textLayoutResults)
+        }
         return textLayoutResults.firstOrNull()
     }
 
     @Test
     fun semantics_hasColor_providedByParameter() {
         val expectedColor = Color(0.7f, 0.13f, 1.0f, 0.323f)
-        rule.setContent {
-            Text(
-                "Test",
-                color = expectedColor
-            )
-        }
+        rule.setContent { Text("Test", color = expectedColor) }
 
-        rule.onNodeWithText("Test").assert(SemanticsMatcher("") {
-            val textLayoutResult = ArrayList<TextLayoutResult>()
-            it.config.getOrNull(SemanticsActions.GetTextLayoutResult)?.action?.invoke(
-                textLayoutResult
+        rule
+            .onNodeWithText("Test")
+            .assert(
+                SemanticsMatcher("") {
+                    val textLayoutResult = ArrayList<TextLayoutResult>()
+                    it.config
+                        .getOrNull(SemanticsActions.GetTextLayoutResult)
+                        ?.action
+                        ?.invoke(textLayoutResult)
+                    val color = textLayoutResult.first().layoutInput.style.color
+                    color == expectedColor
+                }
             )
-            val color = textLayoutResult.first().layoutInput.style.color
-            color == expectedColor
-        })
     }
 }
diff --git a/compose/material3/material3/src/androidInstrumentedTest/kotlin/androidx/compose/material3/TimeInputScreenshotTest.kt b/compose/material3/material3/src/androidInstrumentedTest/kotlin/androidx/compose/material3/TimeInputScreenshotTest.kt
index 61e4dcd..831aa97 100644
--- a/compose/material3/material3/src/androidInstrumentedTest/kotlin/androidx/compose/material3/TimeInputScreenshotTest.kt
+++ b/compose/material3/material3/src/androidInstrumentedTest/kotlin/androidx/compose/material3/TimeInputScreenshotTest.kt
@@ -42,22 +42,21 @@
 @OptIn(ExperimentalMaterial3Api::class)
 class TimeInputScreenshotTest(private val scheme: ColorSchemeWrapper) {
 
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
-    @get:Rule
-    val screenshotRule = AndroidXScreenshotTestRule(GOLDEN_MATERIAL3)
+    @get:Rule val screenshotRule = AndroidXScreenshotTestRule(GOLDEN_MATERIAL3)
 
     @Test
     fun timeInput_12h_hourFocused() {
         rule.setMaterialContent(scheme.colorScheme) {
             Box(Modifier.testTag(TestTag)) {
                 TimeInput(
-                    state = rememberTimePickerState(
-                        initialHour = 10,
-                        initialMinute = 23,
-                        is24Hour = false,
-                    )
+                    state =
+                        rememberTimePickerState(
+                            initialHour = 10,
+                            initialMinute = 23,
+                            is24Hour = false,
+                        )
                 )
             }
         }
@@ -71,11 +70,12 @@
             Box(Modifier.testTag(TestTag)) {
                 CompositionLocalProvider(LocalLayoutDirection provides LayoutDirection.Rtl) {
                     TimeInput(
-                        state = rememberTimePickerState(
-                            initialHour = 10,
-                            initialMinute = 23,
-                            is24Hour = false,
-                        )
+                        state =
+                            rememberTimePickerState(
+                                initialHour = 10,
+                                initialMinute = 23,
+                                is24Hour = false,
+                            )
                     )
                 }
             }
@@ -89,11 +89,12 @@
         rule.setMaterialContent(scheme.colorScheme) {
             Box(Modifier.testTag(TestTag)) {
                 TimeInput(
-                    state = rememberTimePickerState(
-                        initialHour = 22,
-                        initialMinute = 23,
-                        is24Hour = true,
-                    )
+                    state =
+                        rememberTimePickerState(
+                            initialHour = 22,
+                            initialMinute = 23,
+                            is24Hour = true,
+                        )
                 )
             }
         }
@@ -107,11 +108,12 @@
             Box(Modifier.testTag(TestTag)) {
                 CompositionLocalProvider(LocalLayoutDirection provides LayoutDirection.Rtl) {
                     TimeInput(
-                        state = rememberTimePickerState(
-                            initialHour = 22,
-                            initialMinute = 23,
-                            is24Hour = true,
-                        )
+                        state =
+                            rememberTimePickerState(
+                                initialHour = 22,
+                                initialMinute = 23,
+                                is24Hour = true,
+                            )
                     )
                 }
             }
@@ -121,9 +123,7 @@
     }
 
     private fun ComposeContentTestRule.assertAgainstGolden(goldenName: String) {
-        this.onNodeWithTag(TestTag)
-            .captureToImage()
-            .assertAgainstGolden(screenshotRule, goldenName)
+        this.onNodeWithTag(TestTag).captureToImage().assertAgainstGolden(screenshotRule, goldenName)
     }
 
     companion object {
@@ -131,10 +131,11 @@
 
         @Parameterized.Parameters(name = "{0}")
         @JvmStatic
-        fun parameters() = arrayOf(
-            ColorSchemeWrapper("lightTheme", lightColorScheme()),
-            ColorSchemeWrapper("darkTheme", darkColorScheme()),
-        )
+        fun parameters() =
+            arrayOf(
+                ColorSchemeWrapper("lightTheme", lightColorScheme()),
+                ColorSchemeWrapper("darkTheme", darkColorScheme()),
+            )
     }
 
     class ColorSchemeWrapper(val name: String, val colorScheme: ColorScheme) {
diff --git a/compose/material3/material3/src/androidInstrumentedTest/kotlin/androidx/compose/material3/TimePickerScreenshotTest.kt b/compose/material3/material3/src/androidInstrumentedTest/kotlin/androidx/compose/material3/TimePickerScreenshotTest.kt
index 2f75e8a..e273437 100644
--- a/compose/material3/material3/src/androidInstrumentedTest/kotlin/androidx/compose/material3/TimePickerScreenshotTest.kt
+++ b/compose/material3/material3/src/androidInstrumentedTest/kotlin/androidx/compose/material3/TimePickerScreenshotTest.kt
@@ -42,22 +42,21 @@
 @OptIn(ExperimentalMaterial3Api::class)
 class TimePickerScreenshotTest(private val scheme: ColorSchemeWrapper) {
 
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
-    @get:Rule
-    val screenshotRule = AndroidXScreenshotTestRule(GOLDEN_MATERIAL3)
+    @get:Rule val screenshotRule = AndroidXScreenshotTestRule(GOLDEN_MATERIAL3)
 
     @Test
     fun timePicker_12h() {
         rule.setMaterialContent(scheme.colorScheme) {
             Box(Modifier.testTag(TestTag)) {
                 TimePicker(
-                    state = rememberTimePickerState(
-                        initialHour = 10,
-                        initialMinute = 23,
-                        is24Hour = false,
-                    )
+                    state =
+                        rememberTimePickerState(
+                            initialHour = 10,
+                            initialMinute = 23,
+                            is24Hour = false,
+                        )
                 )
             }
         }
@@ -71,11 +70,12 @@
             Box(Modifier.testTag(TestTag)) {
                 CompositionLocalProvider(LocalLayoutDirection provides LayoutDirection.Rtl) {
                     TimePicker(
-                        state = rememberTimePickerState(
-                            initialHour = 10,
-                            initialMinute = 23,
-                            is24Hour = false,
-                        )
+                        state =
+                            rememberTimePickerState(
+                                initialHour = 10,
+                                initialMinute = 23,
+                                is24Hour = false,
+                            )
                     )
                 }
             }
@@ -89,11 +89,12 @@
         rule.setMaterialContent(scheme.colorScheme) {
             Box(Modifier.testTag(TestTag)) {
                 TimePicker(
-                    state = rememberTimePickerState(
-                        initialHour = 22,
-                        initialMinute = 23,
-                        is24Hour = true,
-                    )
+                    state =
+                        rememberTimePickerState(
+                            initialHour = 22,
+                            initialMinute = 23,
+                            is24Hour = true,
+                        )
                 )
             }
         }
@@ -107,11 +108,12 @@
             Box(Modifier.testTag(TestTag)) {
                 CompositionLocalProvider(LocalLayoutDirection provides LayoutDirection.Rtl) {
                     TimePicker(
-                        state = rememberTimePickerState(
-                            initialHour = 22,
-                            initialMinute = 23,
-                            is24Hour = true,
-                        )
+                        state =
+                            rememberTimePickerState(
+                                initialHour = 22,
+                                initialMinute = 23,
+                                is24Hour = true,
+                            )
                     )
                 }
             }
@@ -121,9 +123,7 @@
     }
 
     private fun ComposeContentTestRule.assertAgainstGolden(goldenName: String) {
-        this.onNodeWithTag(TestTag)
-            .captureToImage()
-            .assertAgainstGolden(screenshotRule, goldenName)
+        this.onNodeWithTag(TestTag).captureToImage().assertAgainstGolden(screenshotRule, goldenName)
     }
 
     companion object {
@@ -131,10 +131,11 @@
 
         @Parameterized.Parameters(name = "{0}")
         @JvmStatic
-        fun parameters() = arrayOf(
-            ColorSchemeWrapper("lightTheme", lightColorScheme()),
-            ColorSchemeWrapper("darkTheme", darkColorScheme()),
-        )
+        fun parameters() =
+            arrayOf(
+                ColorSchemeWrapper("lightTheme", lightColorScheme()),
+                ColorSchemeWrapper("darkTheme", darkColorScheme()),
+            )
     }
 
     class ColorSchemeWrapper(val name: String, val colorScheme: ColorScheme) {
diff --git a/compose/material3/material3/src/androidInstrumentedTest/kotlin/androidx/compose/material3/TimePickerTest.kt b/compose/material3/material3/src/androidInstrumentedTest/kotlin/androidx/compose/material3/TimePickerTest.kt
index cf5d99a..7ee9fb4 100644
--- a/compose/material3/material3/src/androidInstrumentedTest/kotlin/androidx/compose/material3/TimePickerTest.kt
+++ b/compose/material3/material3/src/androidInstrumentedTest/kotlin/androidx/compose/material3/TimePickerTest.kt
@@ -86,8 +86,7 @@
 @RunWith(AndroidJUnit4::class)
 class TimePickerTest {
 
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
     @Test
     fun timePicker_vertical_layout() {
@@ -116,19 +115,21 @@
     @Test
     fun timePicker_initialState() {
         val state = TimePickerState(initialHour = 14, initialMinute = 23, is24Hour = false)
-        rule.setMaterialContent(lightColorScheme()) {
-            TimePicker(state)
-        }
+        rule.setMaterialContent(lightColorScheme()) { TimePicker(state) }
 
-        rule.onNodeWithTimeValue(
-            number = 2,
-            selection = TimePickerSelectionMode.Hour,
-        ).assertIsSelected()
+        rule
+            .onNodeWithTimeValue(
+                number = 2,
+                selection = TimePickerSelectionMode.Hour,
+            )
+            .assertIsSelected()
 
-        rule.onNodeWithTimeValue(
-            number = 23,
-            selection = TimePickerSelectionMode.Minute,
-        ).assertExists()
+        rule
+            .onNodeWithTimeValue(
+                number = 23,
+                selection = TimePickerSelectionMode.Minute,
+            )
+            .assertExists()
 
         rule.onNodeWithText("AM").assertExists()
 
@@ -138,29 +139,26 @@
     @Test
     fun timePicker_switchToMinutes() {
         val state = TimePickerState(initialHour = 14, initialMinute = 23, is24Hour = false)
-        rule.setMaterialContent(lightColorScheme()) {
-            TimePicker(state)
-        }
+        rule.setMaterialContent(lightColorScheme()) { TimePicker(state) }
 
-        rule.onNodeWithTimeValue(
-            number = 23,
-            selection = TimePickerSelectionMode.Minute,
-        ).performClick()
+        rule
+            .onNodeWithTimeValue(
+                number = 23,
+                selection = TimePickerSelectionMode.Minute,
+            )
+            .performClick()
 
-        rule.runOnIdle {
-            assertThat(state.selection).isEqualTo(TimePickerSelectionMode.Minute)
-        }
+        rule.runOnIdle { assertThat(state.selection).isEqualTo(TimePickerSelectionMode.Minute) }
     }
 
     @Test
     fun timePicker_selectHour() {
         rule.mainClock.autoAdvance = false
         val state = TimePickerState(initialHour = 14, initialMinute = 23, is24Hour = false)
-        rule.setMaterialContent(lightColorScheme()) {
-            TimePicker(state)
-        }
+        rule.setMaterialContent(lightColorScheme()) { TimePicker(state) }
 
-        rule.onNodeWithTimeValue(number = 6, selection = TimePickerSelectionMode.Hour)
+        rule
+            .onNodeWithTimeValue(number = 6, selection = TimePickerSelectionMode.Hour)
             .performClick()
 
         rule.mainClock.advanceTimeBy(1000)
@@ -177,9 +175,7 @@
     @Test
     fun timePicker_switchToAM() {
         val state = TimePickerState(initialHour = 14, initialMinute = 23, is24Hour = false)
-        rule.setMaterialContent(lightColorScheme()) {
-            TimePicker(state)
-        }
+        rule.setMaterialContent(lightColorScheme()) { TimePicker(state) }
 
         assertThat(state.hour).isEqualTo(14)
 
@@ -191,11 +187,10 @@
     @Test
     fun timePicker_dragging() {
         val state = TimePickerState(initialHour = 0, initialMinute = 23, is24Hour = false)
-        rule.setMaterialContent(lightColorScheme()) {
-            TimePicker(state)
-        }
+        rule.setMaterialContent(lightColorScheme()) { TimePicker(state) }
 
-        rule.onAllNodes(keyIsDefined(SelectableGroup), useUnmergedTree = true)
+        rule
+            .onAllNodes(keyIsDefined(SelectableGroup), useUnmergedTree = true)
             .onLast()
             .performTouchInput {
                 down(topCenter)
@@ -204,9 +199,7 @@
                 up()
             }
 
-        rule.runOnIdle {
-            assertThat(state.hour).isEqualTo(3)
-        }
+        rule.runOnIdle { assertThat(state.hour).isEqualTo(3) }
     }
 
     @Test
@@ -214,18 +207,22 @@
     fun timePickerState_format_12h() {
         lateinit var context: Context
         lateinit var state: TimePickerState
-        val session = mockitoSession()
-            .spyStatic(DateFormat::class.java)
-            .strictness(Strictness.LENIENT)
-            .startMocking()
+        val session =
+            mockitoSession()
+                .spyStatic(DateFormat::class.java)
+                .strictness(Strictness.LENIENT)
+                .startMocking()
         try {
             rule.setMaterialContent(lightColorScheme()) {
                 context = LocalContext.current
-                doReturn(false).`when`(object : MockedMethod<Boolean> {
-                    override fun get(): Boolean {
-                        return DateFormat.is24HourFormat(context)
-                    }
-                })
+                doReturn(false)
+                    .`when`(
+                        object : MockedMethod<Boolean> {
+                            override fun get(): Boolean {
+                                return DateFormat.is24HourFormat(context)
+                            }
+                        }
+                    )
 
                 state = rememberTimePickerState()
             }
@@ -241,18 +238,22 @@
     fun timePickerState_format_24h() {
         lateinit var context: Context
         lateinit var state: TimePickerState
-        val session = mockitoSession()
-            .spyStatic(DateFormat::class.java)
-            .strictness(Strictness.LENIENT)
-            .startMocking()
+        val session =
+            mockitoSession()
+                .spyStatic(DateFormat::class.java)
+                .strictness(Strictness.LENIENT)
+                .startMocking()
         try {
             rule.setMaterialContent(lightColorScheme()) {
                 context = LocalContext.current
-                doReturn(true).`when`(object : MockedMethod<Boolean> {
-                    override fun get(): Boolean {
-                        return DateFormat.is24HourFormat(context)
-                    }
-                })
+                doReturn(true)
+                    .`when`(
+                        object : MockedMethod<Boolean> {
+                            override fun get(): Boolean {
+                                return DateFormat.is24HourFormat(context)
+                            }
+                        }
+                    )
 
                 state = rememberTimePickerState()
             }
@@ -272,9 +273,7 @@
             TimePicker(state)
         }
 
-        rule.onNodeWithContentDescription(contentDescription)
-            .onChildren()
-            .assertAll(isSelectable())
+        rule.onNodeWithContentDescription(contentDescription).onChildren().assertAll(isSelectable())
     }
 
     @Test
@@ -288,13 +287,15 @@
             TimePicker(state)
         }
 
-        rule.onNodeWithContentDescription(minuteDescription)
+        rule
+            .onNodeWithContentDescription(minuteDescription)
             .assertIsSelectable()
             .assertIsNotSelected()
             .assert(expectValue(SemanticsProperties.Role, Role.RadioButton))
             .assertHasClickAction()
 
-        rule.onNodeWithContentDescription(hourDescription)
+        rule
+            .onNodeWithContentDescription(hourDescription)
             .assertIsSelectable()
             .assertIsSelected()
             .assert(expectValue(SemanticsProperties.Role, Role.RadioButton))
@@ -311,17 +312,14 @@
             TimePicker(state)
         }
 
-        rule.onAllNodesWithContentDescription(hourDescription)
+        rule
+            .onAllNodesWithContentDescription(hourDescription)
             .onLast()
             .onSiblings()
             .filter(isFocusable())
             .assertCountEquals(11)
             .assertAll(
-                hasContentDescription(
-                    value = "o'clock",
-                    substring = true,
-                    ignoreCase = true
-                )
+                hasContentDescription(value = "o'clock", substring = true, ignoreCase = true)
             )
     }
 
@@ -329,13 +327,9 @@
     fun timePicker_clockFace_selected_semantics() {
         val state = TimePickerState(initialHour = 14, initialMinute = 23, is24Hour = true)
 
-        rule.setMaterialContent(lightColorScheme()) {
-            TimePicker(state)
-        }
+        rule.setMaterialContent(lightColorScheme()) { TimePicker(state) }
 
-        rule.onAllNodesWithText("14")
-            .filter(isFocusable())
-            .assertAll(isSelected())
+        rule.onAllNodesWithText("14").filter(isFocusable()).assertAll(isSelected())
     }
 
     @Test
@@ -353,16 +347,13 @@
 
         rule.waitForIdle()
 
-        rule.onNodeWithContentDescription(minuteDescription)
+        rule
+            .onNodeWithContentDescription(minuteDescription)
             .assertExists()
             .onSiblings()
             .assertCountEquals(11)
             .assertAll(
-                hasContentDescription(
-                    value = "minutes",
-                    substring = true,
-                    ignoreCase = true
-                )
+                hasContentDescription(value = "minutes", substring = true, ignoreCase = true)
             )
     }
 
@@ -370,23 +361,22 @@
     fun timeInput_semantics() {
         val state = TimePickerState(initialHour = 14, initialMinute = 23, is24Hour = true)
 
-        rule.setMaterialContent(lightColorScheme()) {
-            TimeInput(state)
-        }
+        rule.setMaterialContent(lightColorScheme()) { TimeInput(state) }
 
-        rule.onNodeWithText("14")
+        rule
+            .onNodeWithText("14")
             .assert(isFocusable())
             .assertContentDescriptionContains("for hour")
             .assert(hasImeAction(ImeAction.Next))
             .assert(isFocused())
 
-        rule.onAllNodesWithText("23")
+        rule
+            .onAllNodesWithText("23")
             .filterToOne(isSelectable())
             .assert(isNotSelected())
             .performClick()
 
-        rule.onNodeWithText("23")
-            .assertContentDescriptionContains("for minutes")
+        rule.onNodeWithText("23").assertContentDescriptionContains("for minutes")
     }
 
     @OptIn(ExperimentalTestApi::class)
@@ -394,24 +384,20 @@
     fun timeInput_keyboardInput_valid() {
         val state = TimePickerState(initialHour = 10, initialMinute = 23, is24Hour = false)
 
-        rule.setMaterialContent(lightColorScheme()) {
-            TimeInput(state)
-        }
+        rule.setMaterialContent(lightColorScheme()) { TimeInput(state) }
 
-        rule.onNodeWithText("10")
-            .performKeyInput {
-                pressKey(Key.Zero)
-                pressKey(Key.Four)
-            }
+        rule.onNodeWithText("10").performKeyInput {
+            pressKey(Key.Zero)
+            pressKey(Key.Four)
+        }
 
         rule.waitForIdle()
 
         // Switched to minutes text field
-        rule.onNodeWithText("23")
-            .performKeyInput {
-                pressKey(Key.Five)
-                pressKey(Key.Two)
-            }
+        rule.onNodeWithText("23").performKeyInput {
+            pressKey(Key.Five)
+            pressKey(Key.Two)
+        }
 
         assertThat(state.minute).isEqualTo(52)
         assertThat(state.hour).isEqualTo(4)
@@ -422,15 +408,12 @@
     fun timeInput_keyboardInput_outOfRange() {
         val state = TimePickerState(initialHour = 10, initialMinute = 23, is24Hour = false)
 
-        rule.setMaterialContent(lightColorScheme()) {
-            TimeInput(state)
-        }
+        rule.setMaterialContent(lightColorScheme()) { TimeInput(state) }
 
-        rule.onNodeWithText("10")
-            .performKeyInput {
-                pressKey(Key.Four)
-                pressKey(Key.Four)
-            }
+        rule.onNodeWithText("10").performKeyInput {
+            pressKey(Key.Four)
+            pressKey(Key.Four)
+        }
 
         // only the first 4 is accepted
         assertThat(state.hour).isEqualTo(4)
@@ -441,19 +424,16 @@
     fun timeInput_keyboardInput_Nan() {
         val state = TimePickerState(initialHour = 10, initialMinute = 23, is24Hour = false)
 
-        rule.setMaterialContent(lightColorScheme()) {
-            TimeInput(state)
-        }
+        rule.setMaterialContent(lightColorScheme()) { TimeInput(state) }
 
-        rule.onNodeWithText("10")
-            .performKeyInput {
-                pressKey(Key.A)
-                pressKey(Key.B)
-                pressKey(Key.C)
-                pressKey(Key.NumPadDot)
-                pressKey(Key.Comma)
-                pressKey(Key.NumPadComma)
-            }
+        rule.onNodeWithText("10").performKeyInput {
+            pressKey(Key.A)
+            pressKey(Key.B)
+            pressKey(Key.C)
+            pressKey(Key.NumPadDot)
+            pressKey(Key.Comma)
+            pressKey(Key.NumPadComma)
+        }
 
         // Value didn't change
         assertThat(state.hour).isEqualTo(10)
@@ -463,12 +443,9 @@
     fun timeInput_keyboardInput_switchAmPm() {
         val state = TimePickerState(initialHour = 10, initialMinute = 23, is24Hour = false)
 
-        rule.setMaterialContent(lightColorScheme()) {
-            TimeInput(state)
-        }
+        rule.setMaterialContent(lightColorScheme()) { TimeInput(state) }
 
-        rule.onNodeWithText("PM")
-            .performClick()
+        rule.onNodeWithText("PM").performClick()
 
         // Value didn't change
         assertThat(state.hour).isEqualTo(22)
@@ -478,9 +455,7 @@
     fun timeInput_24Hour_noAmPm_Toggle() {
         val state = TimePickerState(initialHour = 22, initialMinute = 23, is24Hour = true)
 
-        rule.setMaterialContent(lightColorScheme()) {
-            TimeInput(state)
-        }
+        rule.setMaterialContent(lightColorScheme()) { TimeInput(state) }
 
         rule.onNodeWithText("PM").assertDoesNotExist()
 
@@ -492,15 +467,12 @@
     fun timeInput_24Hour_writeAfternoonHour() {
         val state = TimePickerState(initialHour = 10, initialMinute = 23, is24Hour = true)
 
-        rule.setMaterialContent(lightColorScheme()) {
-            TimeInput(state)
-        }
+        rule.setMaterialContent(lightColorScheme()) { TimeInput(state) }
 
-        rule.onNodeWithText("10")
-            .performKeyInput {
-                pressKey(Key.Two)
-                pressKey(Key.Two)
-            }
+        rule.onNodeWithText("10").performKeyInput {
+            pressKey(Key.Two)
+            pressKey(Key.Two)
+        }
 
         assertThat(state.hour).isEqualTo(22)
     }
@@ -510,15 +482,12 @@
     fun timeInput_24Hour_writeNoon() {
         val state = TimePickerState(initialHour = 10, initialMinute = 23, is24Hour = true)
 
-        rule.setMaterialContent(lightColorScheme()) {
-            TimeInput(state)
-        }
+        rule.setMaterialContent(lightColorScheme()) { TimeInput(state) }
 
-        rule.onNodeWithText("10")
-            .performKeyInput {
-                pressKey(Key.One)
-                pressKey(Key.Two)
-            }
+        rule.onNodeWithText("10").performKeyInput {
+            pressKey(Key.One)
+            pressKey(Key.Two)
+        }
 
         assertThat(state.hour).isEqualTo(12)
     }
@@ -526,29 +495,24 @@
     @Test
     @OptIn(ExperimentalTestApi::class)
     fun timeInput_writeMinute_updatesCurrentAngle() {
-        val state = AnalogTimePickerState(
-            TimePickerState(initialHour = 10, initialMinute = 0, is24Hour = true)
-        )
+        val state =
+            AnalogTimePickerState(
+                TimePickerState(initialHour = 10, initialMinute = 0, is24Hour = true)
+            )
 
-        rule.setMaterialContent(lightColorScheme()) {
-            TimeInput(state)
+        rule.setMaterialContent(lightColorScheme()) { TimeInput(state) }
+
+        rule.onNodeWithText("10").performKeyInput {
+            pressKey(Key.One)
+            pressKey(Key.Two)
         }
 
-        rule.onNodeWithText("10")
-            .performKeyInput {
-                pressKey(Key.One)
-                pressKey(Key.Two)
-            }
+        rule.onNodeWithText("00").performKeyInput {
+            pressKey(Key.Four)
+            pressKey(Key.Five)
+        }
 
-        rule.onNodeWithText("00")
-            .performKeyInput {
-                pressKey(Key.Four)
-                pressKey(Key.Five)
-            }
-
-        assertThat(state.currentAngle)
-            .isWithin(0.0001f)
-            .of(PI.toFloat())
+        assertThat(state.currentAngle).isWithin(0.0001f).of(PI.toFloat())
     }
 
     @Test
@@ -556,15 +520,12 @@
     fun timeInput_24Hour_writeMidnight() {
         val state = TimePickerState(initialHour = 10, initialMinute = 23, is24Hour = true)
 
-        rule.setMaterialContent(lightColorScheme()) {
-            TimeInput(state)
-        }
+        rule.setMaterialContent(lightColorScheme()) { TimeInput(state) }
 
-        rule.onNodeWithText("10")
-            .performKeyInput {
-                pressKey(Key.Zero)
-                pressKey(Key.Zero)
-            }
+        rule.onNodeWithText("10").performKeyInput {
+            pressKey(Key.Zero)
+            pressKey(Key.Zero)
+        }
 
         assertThat(state.hour).isEqualTo(0)
     }
@@ -598,9 +559,10 @@
 
     @Test
     fun analogState_setHour_updatesIsAfternoon() {
-        val state = AnalogTimePickerState(
-            TimePickerState(initialHour = 8, initialMinute = 0, is24Hour = false)
-        )
+        val state =
+            AnalogTimePickerState(
+                TimePickerState(initialHour = 8, initialMinute = 0, is24Hour = false)
+            )
         state.hour = 20
 
         assertThat(state.isAfternoon).isTrue()
@@ -626,16 +588,18 @@
 
     @Test
     fun clockFace_24Hour_everyValue() {
-        val state = AnalogTimePickerState(
-            TimePickerState(initialHour = 10, initialMinute = 23, is24Hour = true)
-        )
+        val state =
+            AnalogTimePickerState(
+                TimePickerState(initialHour = 10, initialMinute = 23, is24Hour = true)
+            )
 
         rule.setMaterialContent(lightColorScheme()) {
             ClockFace(state, TimePickerDefaults.colors(), autoSwitchToMinute = true)
         }
 
         repeat(24) { number ->
-            rule.onNodeWithTimeValue(number, TimePickerSelectionMode.Hour, is24Hour = true)
+            rule
+                .onNodeWithTimeValue(number, TimePickerSelectionMode.Hour, is24Hour = true)
                 .performClick()
             rule.runOnIdle {
                 state.selection = TimePickerSelectionMode.Hour
@@ -646,9 +610,10 @@
 
     @Test
     fun clockFace_12Hour_everyValue() {
-        val state = AnalogTimePickerState(
-            TimePickerState(initialHour = 0, initialMinute = 0, is24Hour = false)
-        )
+        val state =
+            AnalogTimePickerState(
+                TimePickerState(initialHour = 0, initialMinute = 0, is24Hour = false)
+            )
 
         rule.setMaterialContent(lightColorScheme()) {
             ClockFace(state, TimePickerDefaults.colors(), autoSwitchToMinute = true)
@@ -659,11 +624,12 @@
                 state.isAfternoon = true
             }
 
-            val hour = when {
-                number == 0 -> 12
-                number > 12 -> number - 12
-                else -> number
-            }
+            val hour =
+                when {
+                    number == 0 -> 12
+                    number > 12 -> number - 12
+                    else -> number
+                }
 
             rule.onNodeWithTimeValue(hour, TimePickerSelectionMode.Hour).performClick()
             rule.runOnIdle {
@@ -684,31 +650,29 @@
 
     @Test
     fun clockFace_24HourMinutes_everyValue() {
-        val state = AnalogTimePickerState(
-            TimePickerState(initialHour = 10, initialMinute = 23, is24Hour = true)
-        )
+        val state =
+            AnalogTimePickerState(
+                TimePickerState(initialHour = 10, initialMinute = 23, is24Hour = true)
+            )
         state.selection = TimePickerSelectionMode.Minute
         rule.setMaterialContent(lightColorScheme()) {
             ClockFace(state, TimePickerDefaults.colors(), autoSwitchToMinute = true)
         }
 
         repeat(11) { number ->
-            rule.onNodeWithTimeValue(
-                number * 5,
-                TimePickerSelectionMode.Minute,
-                is24Hour = true
-            ).performClick()
-            rule.runOnIdle {
-                assertThat(state.minute).isEqualTo(number * 5)
-            }
+            rule
+                .onNodeWithTimeValue(number * 5, TimePickerSelectionMode.Minute, is24Hour = true)
+                .performClick()
+            rule.runOnIdle { assertThat(state.minute).isEqualTo(number * 5) }
         }
     }
 
     @Test
     fun clockFace_12HourMinutes_everyValue() {
-        val state = AnalogTimePickerState(
-            TimePickerState(initialHour = 10, initialMinute = 23, is24Hour = false)
-        )
+        val state =
+            AnalogTimePickerState(
+                TimePickerState(initialHour = 10, initialMinute = 23, is24Hour = false)
+            )
         state.selection = TimePickerSelectionMode.Minute
         rule.setMaterialContent(lightColorScheme()) {
             ClockFace(state, TimePickerDefaults.colors(), autoSwitchToMinute = true)
@@ -716,9 +680,7 @@
 
         repeat(11) { number ->
             rule.onNodeWithTimeValue(number * 5, TimePickerSelectionMode.Minute).performClick()
-            rule.runOnIdle {
-                assertThat(state.minute).isEqualTo(number * 5)
-            }
+            rule.runOnIdle { assertThat(state.minute).isEqualTo(number * 5) }
         }
     }
 
@@ -729,13 +691,14 @@
         number: Int
     ): String {
 
-        val id = if (selection == TimePickerSelectionMode.Minute) {
-            R.string.m3c_time_picker_minute_suffix
-        } else if (is24Hour) {
-            R.string.m3c_time_picker_hour_24h_suffix
-        } else {
-            R.string.m3c_time_picker_hour_suffix
-        }
+        val id =
+            if (selection == TimePickerSelectionMode.Minute) {
+                R.string.m3c_time_picker_minute_suffix
+            } else if (is24Hour) {
+                R.string.m3c_time_picker_hour_24h_suffix
+            } else {
+                R.string.m3c_time_picker_hour_suffix
+            }
 
         return resources.getString(id, number)
     }
@@ -744,12 +707,14 @@
         number: Int,
         selection: TimePickerSelectionMode,
         is24Hour: Boolean = false,
-    ): SemanticsNodeInteraction = onAllNodesWithContentDescription(
-        contentDescriptionForValue(
-            InstrumentationRegistry.getInstrumentation().context.resources,
-            selection,
-            is24Hour,
-            number
-        )
-    ).onFirst()
+    ): SemanticsNodeInteraction =
+        onAllNodesWithContentDescription(
+                contentDescriptionForValue(
+                    InstrumentationRegistry.getInstrumentation().context.resources,
+                    selection,
+                    is24Hour,
+                    number
+                )
+            )
+            .onFirst()
 }
diff --git a/compose/material3/material3/src/androidInstrumentedTest/kotlin/androidx/compose/material3/TooltipScreenshotTest.kt b/compose/material3/material3/src/androidInstrumentedTest/kotlin/androidx/compose/material3/TooltipScreenshotTest.kt
index 4abf86f9..531128f 100644
--- a/compose/material3/material3/src/androidInstrumentedTest/kotlin/androidx/compose/material3/TooltipScreenshotTest.kt
+++ b/compose/material3/material3/src/androidInstrumentedTest/kotlin/androidx/compose/material3/TooltipScreenshotTest.kt
@@ -41,11 +41,9 @@
 @SdkSuppress(minSdkVersion = Build.VERSION_CODES.O)
 @OptIn(ExperimentalMaterial3Api::class)
 class TooltipScreenshotTest {
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
-    @get:Rule
-    val screenshotRule = AndroidXScreenshotTestRule(GOLDEN_MATERIAL3)
+    @get:Rule val screenshotRule = AndroidXScreenshotTestRule(GOLDEN_MATERIAL3)
 
     @Test
     fun plainTooltip_lightTheme() {
@@ -54,8 +52,7 @@
         // Stop auto advance for test consistency
         rule.mainClock.autoAdvance = false
 
-        rule.onNodeWithTag(AnchorTestTag)
-            .performTouchInput { longClick() }
+        rule.onNodeWithTag(AnchorTestTag).performTouchInput { longClick() }
 
         // Advance by the fade in time
         rule.mainClock.advanceTimeBy(TooltipFadeInDuration.toLong())
@@ -71,8 +68,7 @@
         // Stop auto advance for test consistency
         rule.mainClock.autoAdvance = false
 
-        rule.onNodeWithTag(AnchorTestTag)
-            .performTouchInput { longClick() }
+        rule.onNodeWithTag(AnchorTestTag).performTouchInput { longClick() }
 
         // Advance by the fade in time
         rule.mainClock.advanceTimeBy(TooltipFadeInDuration.toLong())
@@ -88,8 +84,7 @@
         // Stop auto advance for test consistency
         rule.mainClock.autoAdvance = false
 
-        rule.onNodeWithTag(AnchorTestTag)
-            .performTouchInput { longClick() }
+        rule.onNodeWithTag(AnchorTestTag).performTouchInput { longClick() }
 
         // Advance by the fade in time
         rule.mainClock.advanceTimeBy(TooltipFadeInDuration.toLong())
@@ -105,8 +100,7 @@
         // Stop auto advance for test consistency
         rule.mainClock.autoAdvance = false
 
-        rule.onNodeWithTag(AnchorTestTag)
-            .performTouchInput { longClick() }
+        rule.onNodeWithTag(AnchorTestTag).performTouchInput { longClick() }
 
         // Advance by the fade in time
         rule.mainClock.advanceTimeBy(TooltipFadeInDuration.toLong())
@@ -116,7 +110,8 @@
     }
 
     private fun assertAgainstGolden(goldenName: String) {
-        rule.onNodeWithTag(TooltipTestTag)
+        rule
+            .onNodeWithTag(TooltipTestTag)
             .captureToImage()
             .assertAgainstGolden(screenshotRule, goldenName)
     }
@@ -127,19 +122,14 @@
         TooltipBox(
             positionProvider = TooltipDefaults.rememberPlainTooltipPositionProvider(),
             tooltip = {
-                PlainTooltip(
-                    modifier = Modifier.testTag(TooltipTestTag)
-                ) {
+                PlainTooltip(modifier = Modifier.testTag(TooltipTestTag)) {
                     Text("Tooltip Description")
                 }
             },
             modifier = Modifier.testTag(AnchorTestTag),
             state = tooltipState
         ) {
-            Icon(
-                Icons.Filled.Favorite,
-                contentDescription = null
-            )
+            Icon(Icons.Filled.Favorite, contentDescription = null)
         }
     }
 
@@ -163,10 +153,7 @@
             state = tooltipState,
             modifier = Modifier.testTag(AnchorTestTag)
         ) {
-            Icon(
-                Icons.Filled.Favorite,
-                contentDescription = null
-            )
+            Icon(Icons.Filled.Favorite, contentDescription = null)
         }
     }
 }
diff --git a/compose/material3/material3/src/androidInstrumentedTest/kotlin/androidx/compose/material3/TooltipTest.kt b/compose/material3/material3/src/androidInstrumentedTest/kotlin/androidx/compose/material3/TooltipTest.kt
index 32d6c65..8c7df70e 100644
--- a/compose/material3/material3/src/androidInstrumentedTest/kotlin/androidx/compose/material3/TooltipTest.kt
+++ b/compose/material3/material3/src/androidInstrumentedTest/kotlin/androidx/compose/material3/TooltipTest.kt
@@ -61,8 +61,7 @@
 @OptIn(ExperimentalMaterial3Api::class)
 class TooltipTest {
 
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
     @Test
     fun plainTooltip_noContent_size() {
@@ -78,15 +77,14 @@
         rule.mainClock.autoAdvance = false
 
         // Trigger tooltip
-        scope.launch {
-            state.show()
-        }
+        scope.launch { state.show() }
 
         // Advance by the fade in time
         rule.mainClock.advanceTimeBy(TooltipFadeInDuration.toLong())
 
         rule.waitForIdle()
-        rule.onNodeWithTag(ContainerTestTag)
+        rule
+            .onNodeWithTag(ContainerTestTag)
             .assertHeightIsEqualTo(TooltipMinHeight)
             .assertWidthIsEqualTo(TooltipMinWidth)
     }
@@ -105,15 +103,14 @@
         rule.mainClock.autoAdvance = false
 
         // Trigger tooltip
-        scope.launch {
-            state.show()
-        }
+        scope.launch { state.show() }
 
         // Advance by the fade in time
         rule.mainClock.advanceTimeBy(TooltipFadeInDuration.toLong())
 
         rule.waitForIdle()
-        rule.onNodeWithTag(ContainerTestTag)
+        rule
+            .onNodeWithTag(ContainerTestTag)
             .assertHeightIsEqualTo(TooltipMinHeight)
             .assertWidthIsEqualTo(TooltipMinWidth)
     }
@@ -137,15 +134,14 @@
         rule.mainClock.autoAdvance = false
 
         // Trigger tooltip
-        scope.launch {
-            state.show()
-        }
+        scope.launch { state.show() }
 
         // Advance by the fade in time
         rule.mainClock.advanceTimeBy(TooltipFadeInDuration.toLong())
 
         rule.waitForIdle()
-        rule.onNodeWithTag(ContainerTestTag)
+        rule
+            .onNodeWithTag(ContainerTestTag)
             .assertHeightIsEqualTo(customHeight)
             .assertWidthIsEqualTo(customWidth)
     }
@@ -169,15 +165,14 @@
         rule.mainClock.autoAdvance = false
 
         // Trigger tooltip
-        scope.launch {
-            state.show()
-        }
+        scope.launch { state.show() }
 
         // Advance by the fade in time
         rule.mainClock.advanceTimeBy(TooltipFadeInDuration.toLong())
 
         rule.waitForIdle()
-        rule.onNodeWithTag(ContainerTestTag)
+        rule
+            .onNodeWithTag(ContainerTestTag)
             .assertHeightIsEqualTo(customHeight)
             .assertWidthIsEqualTo(customWidth)
     }
@@ -190,12 +185,7 @@
             state = rememberTooltipState()
             scope = rememberCoroutineScope()
             PlainTooltipTest(
-                tooltipContent = {
-                    Text(
-                        text = "Test",
-                        modifier = Modifier.testTag(TextTestTag)
-                    )
-                },
+                tooltipContent = { Text(text = "Test", modifier = Modifier.testTag(TextTestTag)) },
                 tooltipState = state
             )
         }
@@ -204,15 +194,14 @@
         rule.mainClock.autoAdvance = false
 
         // Trigger tooltip
-        scope.launch {
-            state.show()
-        }
+        scope.launch { state.show() }
 
         // Advance by the fade in time
         rule.mainClock.advanceTimeBy(TooltipFadeInDuration.toLong())
 
         rule.waitForIdle()
-        rule.onNodeWithTag(TextTestTag)
+        rule
+            .onNodeWithTag(TextTestTag)
             .assertLeftPositionInRootIsEqualTo(8.dp)
             .assertTopPositionInRootIsEqualTo(4.dp)
     }
@@ -236,9 +225,7 @@
         rule.mainClock.autoAdvance = false
 
         // Trigger tooltip
-        scope.launch {
-            state.show()
-        }
+        scope.launch { state.show() }
 
         // Advance by the fade in time
         rule.mainClock.advanceTimeBy(TooltipFadeInDuration.toLong())
@@ -253,15 +240,18 @@
         val subheadBound = subhead.getUnclippedBoundsInRoot()
         val textBound = text.getUnclippedBoundsInRoot()
 
-        rule.onNodeWithTag(SubheadTestTag)
+        rule
+            .onNodeWithTag(SubheadTestTag)
             .assertLeftPositionInRootIsEqualTo(RichTooltipHorizontalPadding)
             .assertTopPositionInRootIsEqualTo(28.dp - subheadBaseline)
 
-        rule.onNodeWithTag(TextTestTag)
+        rule
+            .onNodeWithTag(TextTestTag)
             .assertLeftPositionInRootIsEqualTo(RichTooltipHorizontalPadding)
             .assertTopPositionInRootIsEqualTo(subheadBound.bottom + 24.dp - textBaseLine)
 
-        rule.onNodeWithTag(ActionTestTag)
+        rule
+            .onNodeWithTag(ActionTestTag)
             .assertLeftPositionInRootIsEqualTo(RichTooltipHorizontalPadding)
             .assertTopPositionInRootIsEqualTo(textBound.bottom + 16.dp)
     }
@@ -286,9 +276,7 @@
         assertThat(state.isVisible).isFalse()
 
         // Trigger tooltip
-        scope.launch {
-            state.show()
-        }
+        scope.launch { state.show() }
 
         // Advance by the fade in time
         rule.mainClock.advanceTimeBy(TooltipFadeInDuration.toLong())
@@ -324,9 +312,7 @@
         assertThat(state.isVisible).isFalse()
 
         // Trigger tooltip
-        scope.launch {
-            state.show()
-        }
+        scope.launch { state.show() }
 
         // Advance by the fade in time
         rule.mainClock.advanceTimeBy(TooltipFadeInDuration.toLong())
@@ -355,7 +341,9 @@
                     TextButton(
                         onClick = { scope.launch { state.dismiss() } },
                         modifier = Modifier.testTag(ActionTestTag)
-                    ) { Text(text = "Action") }
+                    ) {
+                        Text(text = "Action")
+                    }
                 },
                 tooltipState = state
             )
@@ -368,9 +356,7 @@
         assertThat(state.isVisible).isFalse()
 
         // Trigger tooltip
-        scope.launch {
-            state.show()
-        }
+        scope.launch { state.show() }
 
         // Advance by the fade in time
         rule.mainClock.advanceTimeBy(TooltipFadeInDuration.toLong())
@@ -379,14 +365,14 @@
         rule.waitForIdle()
         assertThat(state.isVisible).isTrue()
 
-        // Tooltip should still be visible after the normal TooltipDuration, since we have an action.
+        // Tooltip should still be visible after the normal TooltipDuration, since we have an
+        // action.
         rule.mainClock.advanceTimeBy(milliseconds = BasicTooltipDefaults.TooltipDuration)
         rule.waitForIdle()
         assertThat(state.isVisible).isTrue()
 
         // Click the action and check that it closed the tooltip
-        rule.onNodeWithTag(ActionTestTag)
-            .performTouchInput { click() }
+        rule.onNodeWithTag(ActionTestTag).performTouchInput { click() }
 
         // Advance by the fade out duration
         // plus some additional time to make sure that the tooltip is full faded out.
@@ -403,26 +389,26 @@
         rule.setMaterialContent(lightColorScheme()) {
             state = rememberTooltipState()
             LaunchedEffect(true) {
-                snapshotFlow { state.isVisible }.collectLatest {
-                    if (it) { changedToVisible = true }
-                }
+                snapshotFlow { state.isVisible }
+                    .collectLatest {
+                        if (it) {
+                            changedToVisible = true
+                        }
+                    }
             }
             Box(Modifier.testTag("tooltip")) {
-                PlainTooltipTest(
-                    tooltipContent = { Text(text = "Test") },
-                    tooltipState = state
-                )
+                PlainTooltipTest(tooltipContent = { Text(text = "Test") }, tooltipState = state)
             }
         }
 
         assertThat(changedToVisible).isFalse()
 
-        rule.onNodeWithTag("tooltip").performTouchInput {
-            longClick()
-        }
+        rule.onNodeWithTag("tooltip").performTouchInput { longClick() }
 
         rule.mainClock.advanceTimeBy(
-            TooltipFadeInDuration + TooltipFadeOutDuration + 500L +
+            TooltipFadeInDuration +
+                TooltipFadeOutDuration +
+                500L +
                 BasicTooltipDefaults.TooltipDuration
         )
 
@@ -438,23 +424,19 @@
         rule.setMaterialContent(lightColorScheme()) {
             state = rememberTooltipState()
             LaunchedEffect(true) {
-                snapshotFlow { state.isVisible }.collectLatest {
-                    if (!it) {
-                        visibleTime = rule.mainClock.currentTime - startTime
+                snapshotFlow { state.isVisible }
+                    .collectLatest {
+                        if (!it) {
+                            visibleTime = rule.mainClock.currentTime - startTime
+                        }
                     }
-                }
             }
             Box(Modifier.testTag("tooltip")) {
-                PlainTooltipTest(
-                    tooltipContent = { Text(text = "Test") },
-                    tooltipState = state
-                )
+                PlainTooltipTest(tooltipContent = { Text(text = "Test") }, tooltipState = state)
             }
         }
 
-        rule.onNodeWithTag("tooltip").performTouchInput {
-            longClick(durationMillis = 10_000)
-        }
+        rule.onNodeWithTag("tooltip").performTouchInput { longClick(durationMillis = 10_000) }
 
         rule.waitForIdle()
         assertThat(state.isVisible).isFalse()
@@ -483,12 +465,13 @@
             positionProvider = TooltipDefaults.rememberPlainTooltipPositionProvider()
         }
 
-        val tooltipPosition = positionProvider.calculatePosition(
-            anchorBounds = anchorBounds,
-            windowSize = windowSize,
-            layoutDirection = LayoutDirection.Ltr,
-            popupContentSize = popupSize
-        )
+        val tooltipPosition =
+            positionProvider.calculatePosition(
+                anchorBounds = anchorBounds,
+                windowSize = windowSize,
+                layoutDirection = LayoutDirection.Ltr,
+                popupContentSize = popupSize
+            )
 
         val tooltipBounds = IntRect(tooltipPosition, popupSize)
 
@@ -513,16 +496,15 @@
 
         // Rich tooltip positioning
         lateinit var positionProvider: PopupPositionProvider
-        rule.setContent {
-            positionProvider = TooltipDefaults.rememberRichTooltipPositionProvider()
-        }
+        rule.setContent { positionProvider = TooltipDefaults.rememberRichTooltipPositionProvider() }
 
-        val tooltipPosition = positionProvider.calculatePosition(
-            anchorBounds = anchorBounds,
-            windowSize = windowSize,
-            layoutDirection = LayoutDirection.Ltr,
-            popupContentSize = popupSize
-        )
+        val tooltipPosition =
+            positionProvider.calculatePosition(
+                anchorBounds = anchorBounds,
+                windowSize = windowSize,
+                layoutDirection = LayoutDirection.Ltr,
+                popupContentSize = popupSize
+            )
 
         val tooltipBounds = IntRect(tooltipPosition, popupSize)
 
@@ -539,10 +521,11 @@
                 state = rememberTooltipState(initialIsVisible = true, isPersistent = true),
                 tooltip = {
                     PlainTooltip(
-                        modifier = Modifier.drawCaret {
-                            it?.let { anchorBounds = it.boundsInWindow() }
-                            onDrawBehind {}
-                        }
+                        modifier =
+                            Modifier.drawCaret {
+                                it?.let { anchorBounds = it.boundsInWindow() }
+                                onDrawBehind {}
+                            }
                     ) {}
                 }
             ) {
@@ -557,14 +540,15 @@
         rule.waitForIdle()
         val expectedAnchorBoundsDp =
             rule.onNodeWithTag(AnchorTestTag, true).getUnclippedBoundsInRoot()
-        val expectedAnchorBounds = with(rule.density) {
-            Rect(
-                expectedAnchorBoundsDp.left.roundToPx().toFloat(),
-                expectedAnchorBoundsDp.top.roundToPx().toFloat(),
-                expectedAnchorBoundsDp.right.roundToPx().toFloat(),
-                expectedAnchorBoundsDp.bottom.roundToPx().toFloat()
-            )
-        }
+        val expectedAnchorBounds =
+            with(rule.density) {
+                Rect(
+                    expectedAnchorBoundsDp.left.roundToPx().toFloat(),
+                    expectedAnchorBoundsDp.top.roundToPx().toFloat(),
+                    expectedAnchorBoundsDp.right.roundToPx().toFloat(),
+                    expectedAnchorBoundsDp.bottom.roundToPx().toFloat()
+                )
+            }
 
         assertThat(anchorBounds.left).isWithin(0.001f).of(expectedAnchorBounds.left)
         assertThat(anchorBounds.top).isWithin(0.001f).of(expectedAnchorBounds.top)
@@ -581,10 +565,11 @@
                 state = rememberTooltipState(initialIsVisible = true, isPersistent = true),
                 tooltip = {
                     RichTooltip(
-                        modifier = Modifier.drawCaret {
-                            it?.let { anchorBounds = it.boundsInWindow() }
-                            onDrawBehind {}
-                        }
+                        modifier =
+                            Modifier.drawCaret {
+                                it?.let { anchorBounds = it.boundsInWindow() }
+                                onDrawBehind {}
+                            }
                     ) {}
                 }
             ) {
@@ -599,14 +584,15 @@
         rule.waitForIdle()
         val expectedAnchorBoundsDp =
             rule.onNodeWithTag(AnchorTestTag, true).getUnclippedBoundsInRoot()
-        val expectedAnchorBounds = with(rule.density) {
-            Rect(
-                expectedAnchorBoundsDp.left.roundToPx().toFloat(),
-                expectedAnchorBoundsDp.top.roundToPx().toFloat(),
-                expectedAnchorBoundsDp.right.roundToPx().toFloat(),
-                expectedAnchorBoundsDp.bottom.roundToPx().toFloat()
-            )
-        }
+        val expectedAnchorBounds =
+            with(rule.density) {
+                Rect(
+                    expectedAnchorBoundsDp.left.roundToPx().toFloat(),
+                    expectedAnchorBoundsDp.top.roundToPx().toFloat(),
+                    expectedAnchorBoundsDp.right.roundToPx().toFloat(),
+                    expectedAnchorBoundsDp.bottom.roundToPx().toFloat()
+                )
+            }
 
         assertThat(anchorBounds.left).isWithin(0.001f).of(expectedAnchorBounds.left)
         assertThat(anchorBounds.top).isWithin(0.001f).of(expectedAnchorBounds.top)
@@ -632,15 +618,13 @@
                             Text(text = "Subhead", modifier = Modifier.testTag(SubheadTestTag))
                         },
                         action = {
-                            TextButton(
-                                modifier = Modifier.testTag(ActionTestTag),
-                                onClick = {}
-                            ) {
+                            TextButton(modifier = Modifier.testTag(ActionTestTag), onClick = {}) {
                                 Text(text = "Action")
                             }
                         }
-
-                    ) { Text(text = "Text", modifier = Modifier.testTag(TextTestTag)) }
+                    ) {
+                        Text(text = "Text", modifier = Modifier.testTag(TextTestTag))
+                    }
                 },
                 state = topState,
                 modifier = Modifier.testTag(topTooltipTag)
@@ -655,15 +639,13 @@
                             Text(text = "Subhead", modifier = Modifier.testTag(SubheadTestTag))
                         },
                         action = {
-                            TextButton(
-                                modifier = Modifier.testTag(ActionTestTag),
-                                onClick = {}
-                            ) {
+                            TextButton(modifier = Modifier.testTag(ActionTestTag), onClick = {}) {
                                 Text(text = "Action")
                             }
                         }
-
-                    ) { Text(text = "Text", modifier = Modifier.testTag(TextTestTag)) }
+                    ) {
+                        Text(text = "Text", modifier = Modifier.testTag(TextTestTag))
+                    }
                 },
                 state = bottomState,
                 modifier = Modifier.testTag(bottomTooltipTag)
@@ -691,10 +673,7 @@
         lateinit var bottomState: TooltipState
         rule.setMaterialContent(lightColorScheme()) {
             val scope = rememberCoroutineScope()
-            topState = rememberTooltipState(
-                isPersistent = true,
-                mutatorMutex = MutatorMutex()
-            )
+            topState = rememberTooltipState(isPersistent = true, mutatorMutex = MutatorMutex())
             TooltipBox(
                 positionProvider = TooltipDefaults.rememberRichTooltipPositionProvider(),
                 tooltip = {
@@ -703,25 +682,20 @@
                             Text(text = "Subhead", modifier = Modifier.testTag(SubheadTestTag))
                         },
                         action = {
-                            TextButton(
-                                modifier = Modifier.testTag(ActionTestTag),
-                                onClick = {}
-                            ) {
+                            TextButton(modifier = Modifier.testTag(ActionTestTag), onClick = {}) {
                                 Text(text = "Action")
                             }
                         }
-
-                    ) { Text(text = "Text", modifier = Modifier.testTag(TextTestTag)) }
+                    ) {
+                        Text(text = "Text", modifier = Modifier.testTag(TextTestTag))
+                    }
                 },
                 state = topState,
                 modifier = Modifier.testTag(topTooltipTag)
             ) {}
             scope.launch { topState.show() }
 
-            bottomState = rememberTooltipState(
-                isPersistent = true,
-                mutatorMutex = MutatorMutex()
-            )
+            bottomState = rememberTooltipState(isPersistent = true, mutatorMutex = MutatorMutex())
             TooltipBox(
                 positionProvider = TooltipDefaults.rememberRichTooltipPositionProvider(),
                 tooltip = {
@@ -730,15 +704,13 @@
                             Text(text = "Subhead", modifier = Modifier.testTag(SubheadTestTag))
                         },
                         action = {
-                            TextButton(
-                                modifier = Modifier.testTag(ActionTestTag),
-                                onClick = {}
-                            ) {
+                            TextButton(modifier = Modifier.testTag(ActionTestTag), onClick = {}) {
                                 Text(text = "Action")
                             }
                         }
-
-                    ) { Text(text = "Text", modifier = Modifier.testTag(TextTestTag)) }
+                    ) {
+                        Text(text = "Text", modifier = Modifier.testTag(TextTestTag))
+                    }
                 },
                 state = bottomState,
                 modifier = Modifier.testTag(bottomTooltipTag)
@@ -774,10 +746,7 @@
             },
             state = tooltipState
         ) {
-            Icon(
-                Icons.Filled.Favorite,
-                contentDescription = null
-            )
+            Icon(Icons.Filled.Favorite, contentDescription = null)
         }
     }
 
@@ -801,10 +770,7 @@
             },
             state = tooltipState,
         ) {
-            Icon(
-                Icons.Filled.Favorite,
-                contentDescription = null
-            )
+            Icon(Icons.Filled.Favorite, contentDescription = null)
         }
     }
 }
diff --git a/compose/material3/material3/src/androidInstrumentedTest/kotlin/androidx/compose/material3/anchoredDraggable/AnchoredDraggableStateTest.kt b/compose/material3/material3/src/androidInstrumentedTest/kotlin/androidx/compose/material3/anchoredDraggable/AnchoredDraggableStateTest.kt
index e62a9f5..b16b455 100644
--- a/compose/material3/material3/src/androidInstrumentedTest/kotlin/androidx/compose/material3/anchoredDraggable/AnchoredDraggableStateTest.kt
+++ b/compose/material3/material3/src/androidInstrumentedTest/kotlin/androidx/compose/material3/anchoredDraggable/AnchoredDraggableStateTest.kt
@@ -87,30 +87,26 @@
 @OptIn(ExperimentalMaterial3Api::class)
 class AnchoredDraggableStateTest {
 
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
     private val AnchoredDraggableTestTag = "dragbox"
     private val AnchoredDraggableBoxSize = 200.dp
 
     @Test
     fun anchoredDraggable_state_canSkipStateByFling() {
-        val state = AnchoredDraggableState(
-            initialValue = A,
-            positionalThreshold = defaultPositionalThreshold,
-            velocityThreshold = defaultVelocityThreshold,
-            animationSpec = defaultAnimationSpec
-        )
+        val state =
+            AnchoredDraggableState(
+                initialValue = A,
+                positionalThreshold = defaultPositionalThreshold,
+                velocityThreshold = defaultVelocityThreshold,
+                animationSpec = defaultAnimationSpec
+            )
         rule.setContent {
             Box(Modifier.fillMaxSize()) {
                 Box(
-                    Modifier
-                        .requiredSize(AnchoredDraggableBoxSize)
+                    Modifier.requiredSize(AnchoredDraggableBoxSize)
                         .testTag(AnchoredDraggableTestTag)
-                        .anchoredDraggable(
-                            state = state,
-                            orientation = Orientation.Vertical
-                        )
+                        .anchoredDraggable(state = state, orientation = Orientation.Vertical)
                         .onSizeChanged { layoutSize ->
                             state.updateAnchors(
                                 DraggableAnchors {
@@ -120,20 +116,13 @@
                                 }
                             )
                         }
-                        .offset {
-                            IntOffset(
-                                state
-                                    .requireOffset()
-                                    .roundToInt(), 0
-                            )
-                        }
+                        .offset { IntOffset(state.requireOffset().roundToInt(), 0) }
                         .background(Color.Red)
                 )
             }
         }
 
-        rule.onNodeWithTag(AnchoredDraggableTestTag)
-            .performTouchInput { swipeDown() }
+        rule.onNodeWithTag(AnchoredDraggableTestTag).performTouchInput { swipeDown() }
 
         rule.waitForIdle()
 
@@ -142,22 +131,19 @@
 
     @Test
     fun anchoredDraggable_targetState_updatedOnSwipe() {
-        val state = AnchoredDraggableState(
-            initialValue = A,
-            positionalThreshold = defaultPositionalThreshold,
-            velocityThreshold = defaultVelocityThreshold,
-            animationSpec = defaultAnimationSpec
-        )
+        val state =
+            AnchoredDraggableState(
+                initialValue = A,
+                positionalThreshold = defaultPositionalThreshold,
+                velocityThreshold = defaultVelocityThreshold,
+                animationSpec = defaultAnimationSpec
+            )
         rule.setContent {
             Box(Modifier.fillMaxSize()) {
                 Box(
-                    Modifier
-                        .requiredSize(AnchoredDraggableBoxSize)
+                    Modifier.requiredSize(AnchoredDraggableBoxSize)
                         .testTag(AnchoredDraggableTestTag)
-                        .anchoredDraggable(
-                            state = state,
-                            orientation = Orientation.Vertical
-                        )
+                        .anchoredDraggable(state = state, orientation = Orientation.Vertical)
                         .onSizeChanged { layoutSize ->
                             state.updateAnchors(
                                 DraggableAnchors {
@@ -167,42 +153,41 @@
                                 }
                             )
                         }
-                        .offset {
-                            IntOffset(
-                                state
-                                    .requireOffset()
-                                    .roundToInt(), 0
-                            )
-                        }
+                        .offset { IntOffset(state.requireOffset().roundToInt(), 0) }
                         .background(Color.Red)
                 )
             }
         }
 
-        rule.onNodeWithTag(AnchoredDraggableTestTag)
-            .performTouchInput { swipeDown(endY = bottom * 0.45f) }
+        rule.onNodeWithTag(AnchoredDraggableTestTag).performTouchInput {
+            swipeDown(endY = bottom * 0.45f)
+        }
         rule.waitForIdle()
         assertThat(state.targetValue).isEqualTo(B)
 
         // Assert that swipe below threshold upward settles at current state
-        rule.onNodeWithTag(AnchoredDraggableTestTag)
-            .performTouchInput { swipeUp(endY = bottom * 0.95f, durationMillis = 1000) }
+        rule.onNodeWithTag(AnchoredDraggableTestTag).performTouchInput {
+            swipeUp(endY = bottom * 0.95f, durationMillis = 1000)
+        }
         rule.waitForIdle()
         assertThat(state.targetValue).isEqualTo(B)
 
         // Assert that swipe below threshold downward settles at current state
-        rule.onNodeWithTag(AnchoredDraggableTestTag)
-            .performTouchInput { swipeDown(endY = bottom * 0.05f) }
+        rule.onNodeWithTag(AnchoredDraggableTestTag).performTouchInput {
+            swipeDown(endY = bottom * 0.05f)
+        }
         rule.waitForIdle()
         assertThat(state.targetValue).isEqualTo(B)
 
-        rule.onNodeWithTag(AnchoredDraggableTestTag)
-            .performTouchInput { swipeDown(endY = bottom * 0.9f) }
+        rule.onNodeWithTag(AnchoredDraggableTestTag).performTouchInput {
+            swipeDown(endY = bottom * 0.9f)
+        }
         rule.waitForIdle()
         assertThat(state.targetValue).isEqualTo(C)
 
-        rule.onNodeWithTag(AnchoredDraggableTestTag)
-            .performTouchInput { swipeUp(endY = top * 1.1f) }
+        rule.onNodeWithTag(AnchoredDraggableTestTag).performTouchInput {
+            swipeUp(endY = top * 1.1f)
+        }
         rule.waitForIdle()
         assertThat(state.targetValue).isEqualTo(A)
     }
@@ -212,24 +197,21 @@
         rule.mainClock.autoAdvance = false
         val animationDuration = 300
         val frameLengthMillis = 16L
-        val state = AnchoredDraggableState(
-            initialValue = A,
-            animationSpec = tween(animationDuration, easing = LinearEasing),
-            positionalThreshold = { distance -> distance * 0.5f },
-            velocityThreshold = defaultVelocityThreshold
-        )
+        val state =
+            AnchoredDraggableState(
+                initialValue = A,
+                animationSpec = tween(animationDuration, easing = LinearEasing),
+                positionalThreshold = { distance -> distance * 0.5f },
+                velocityThreshold = defaultVelocityThreshold
+            )
         lateinit var scope: CoroutineScope
         rule.setContent {
             scope = rememberCoroutineScope()
             Box(Modifier.fillMaxSize()) {
                 Box(
-                    Modifier
-                        .requiredSize(AnchoredDraggableBoxSize)
+                    Modifier.requiredSize(AnchoredDraggableBoxSize)
                         .testTag(AnchoredDraggableTestTag)
-                        .anchoredDraggable(
-                            state = state,
-                            orientation = Orientation.Vertical
-                        )
+                        .anchoredDraggable(state = state, orientation = Orientation.Vertical)
                         .onSizeChanged { layoutSize ->
                             state.updateAnchors(
                                 DraggableAnchors {
@@ -239,60 +221,41 @@
                                 }
                             )
                         }
-                        .offset {
-                            IntOffset(
-                                state
-                                    .requireOffset()
-                                    .roundToInt(), 0
-                            )
-                        }
+                        .offset { IntOffset(state.requireOffset().roundToInt(), 0) }
                         .background(Color.Red)
                 )
             }
         }
 
-        scope.launch {
-            state.animateTo(targetValue = B)
-        }
+        scope.launch { state.animateTo(targetValue = B) }
         rule.mainClock.advanceTimeBy(1 * frameLengthMillis)
 
-        assertWithMessage("Current state")
-            .that(state.currentValue)
-            .isEqualTo(A)
-        assertWithMessage("Target state")
-            .that(state.targetValue)
-            .isEqualTo(B)
+        assertWithMessage("Current state").that(state.currentValue).isEqualTo(A)
+        assertWithMessage("Target state").that(state.targetValue).isEqualTo(B)
 
         rule.mainClock.autoAdvance = true
         rule.waitForIdle()
 
-        assertWithMessage("Current state")
-            .that(state.currentValue)
-            .isEqualTo(B)
-        assertWithMessage("Target state")
-            .that(state.targetValue)
-            .isEqualTo(B)
+        assertWithMessage("Current state").that(state.currentValue).isEqualTo(B)
+        assertWithMessage("Target state").that(state.targetValue).isEqualTo(B)
     }
 
     @Test
     fun anchoredDraggable_progress_matchesSwipePosition() {
-        val state = AnchoredDraggableState(
-            initialValue = A,
-            positionalThreshold = defaultPositionalThreshold,
-            velocityThreshold = defaultVelocityThreshold,
-            animationSpec = defaultAnimationSpec
-        )
+        val state =
+            AnchoredDraggableState(
+                initialValue = A,
+                positionalThreshold = defaultPositionalThreshold,
+                velocityThreshold = defaultVelocityThreshold,
+                animationSpec = defaultAnimationSpec
+            )
         rule.setContent {
             WithTouchSlop(touchSlop = 0f) {
                 Box(Modifier.fillMaxSize()) {
                     Box(
-                        Modifier
-                            .requiredSize(AnchoredDraggableBoxSize)
+                        Modifier.requiredSize(AnchoredDraggableBoxSize)
                             .testTag(AnchoredDraggableTestTag)
-                            .anchoredDraggable(
-                                state = state,
-                                orientation = Orientation.Vertical
-                            )
+                            .anchoredDraggable(state = state, orientation = Orientation.Vertical)
                             .onSizeChanged { layoutSize ->
                                 state.updateAnchors(
                                     DraggableAnchors {
@@ -302,13 +265,7 @@
                                     }
                                 )
                             }
-                            .offset {
-                                IntOffset(
-                                    state
-                                        .requireOffset()
-                                        .roundToInt(), 0
-                                )
-                            }
+                            .offset { IntOffset(state.requireOffset().roundToInt(), 0) }
                             .background(Color.Red)
                     )
                 }
@@ -320,8 +277,9 @@
         val almostAnchorB = anchorB * 0.9f
         var expectedProgress = almostAnchorB / (anchorB - anchorA)
 
-        rule.onNodeWithTag(AnchoredDraggableTestTag)
-            .performTouchInput { swipeDown(endY = almostAnchorB) }
+        rule.onNodeWithTag(AnchoredDraggableTestTag).performTouchInput {
+            swipeDown(endY = almostAnchorB)
+        }
 
         assertThat(state.targetValue).isEqualTo(B)
         assertThat(state.progress).isEqualTo(expectedProgress)
@@ -329,8 +287,9 @@
         val almostAnchorA = anchorA + ((anchorB - anchorA) * 0.1f)
         expectedProgress = 1 - (almostAnchorA / (anchorB - anchorA))
 
-        rule.onNodeWithTag(AnchoredDraggableTestTag)
-            .performTouchInput { swipeUp(startY = anchorB, endY = almostAnchorA) }
+        rule.onNodeWithTag(AnchoredDraggableTestTag).performTouchInput {
+            swipeUp(startY = anchorB, endY = almostAnchorA)
+        }
 
         assertThat(state.targetValue).isEqualTo(A)
         assertThat(state.progress).isEqualTo(expectedProgress)
@@ -338,22 +297,19 @@
 
     @Test
     fun anchoredDraggable_snapTo_updatesImmediately() = runBlocking {
-        val state = AnchoredDraggableState(
-            initialValue = A,
-            positionalThreshold = defaultPositionalThreshold,
-            velocityThreshold = defaultVelocityThreshold,
-            animationSpec = defaultAnimationSpec
-        )
+        val state =
+            AnchoredDraggableState(
+                initialValue = A,
+                positionalThreshold = defaultPositionalThreshold,
+                velocityThreshold = defaultVelocityThreshold,
+                animationSpec = defaultAnimationSpec
+            )
         rule.setContent {
             Box(Modifier.fillMaxSize()) {
                 Box(
-                    Modifier
-                        .requiredSize(AnchoredDraggableBoxSize)
+                    Modifier.requiredSize(AnchoredDraggableBoxSize)
                         .testTag(AnchoredDraggableTestTag)
-                        .anchoredDraggable(
-                            state = state,
-                            orientation = Orientation.Vertical
-                        )
+                        .anchoredDraggable(state = state, orientation = Orientation.Vertical)
                         .onSizeChanged { layoutSize ->
                             state.updateAnchors(
                                 DraggableAnchors {
@@ -363,21 +319,14 @@
                                 }
                             )
                         }
-                        .offset {
-                            IntOffset(
-                                state
-                                    .requireOffset()
-                                    .roundToInt(), 0
-                            )
-                        }
+                        .offset { IntOffset(state.requireOffset().roundToInt(), 0) }
                         .background(Color.Red)
                 )
             }
         }
 
         state.snapTo(C)
-        assertThat(state.currentValue)
-            .isEqualTo(C)
+        assertThat(state.currentValue).isEqualTo(C)
     }
 
     @Test
@@ -386,12 +335,13 @@
 
         val initialState = C
         val animationSpec = tween<Float>(durationMillis = 1000)
-        val state = AnchoredDraggableState(
-            initialValue = initialState,
-            positionalThreshold = defaultPositionalThreshold,
-            velocityThreshold = defaultVelocityThreshold,
-            animationSpec = animationSpec
-        )
+        val state =
+            AnchoredDraggableState(
+                initialValue = initialState,
+                positionalThreshold = defaultPositionalThreshold,
+                velocityThreshold = defaultVelocityThreshold,
+                animationSpec = animationSpec
+            )
         lateinit var scope: CoroutineScope
 
         restorationTester.setContent {
@@ -412,9 +362,7 @@
         assertThat(state.currentValue).isEqualTo(initialState)
         assertThat(state.animationSpec).isEqualTo(animationSpec)
 
-        scope.launch {
-            state.animateTo(B)
-        }
+        scope.launch { state.animateTo(B) }
         rule.waitForIdle()
         assertThat(state.currentValue).isEqualTo(B)
 
@@ -434,18 +382,12 @@
                     animationSpec = defaultAnimationSpec
                 )
             }
-            LaunchedEffect(state.targetValue) {
-                targetState = state.targetValue
-            }
+            LaunchedEffect(state.targetValue) { targetState = state.targetValue }
             Box(Modifier.fillMaxSize()) {
                 Box(
-                    Modifier
-                        .requiredSize(AnchoredDraggableBoxSize)
+                    Modifier.requiredSize(AnchoredDraggableBoxSize)
                         .testTag(AnchoredDraggableTestTag)
-                        .anchoredDraggable(
-                            state = state,
-                            orientation = Orientation.Horizontal
-                        )
+                        .anchoredDraggable(state = state, orientation = Orientation.Horizontal)
                         .onSizeChanged { layoutSize ->
                             state.updateAnchors(
                                 DraggableAnchors {
@@ -455,13 +397,7 @@
                                 }
                             )
                         }
-                        .offset {
-                            IntOffset(
-                                state
-                                    .requireOffset()
-                                    .roundToInt(), 0
-                            )
-                        }
+                        .offset { IntOffset(state.requireOffset().roundToInt(), 0) }
                         .background(Color.Red)
                 )
             }
@@ -482,18 +418,12 @@
                     animationSpec = defaultAnimationSpec
                 )
             }
-            LaunchedEffect(state.progress) {
-                progress = state.progress
-            }
+            LaunchedEffect(state.progress) { progress = state.progress }
             Box(Modifier.fillMaxSize()) {
                 Box(
-                    Modifier
-                        .requiredSize(AnchoredDraggableBoxSize)
+                    Modifier.requiredSize(AnchoredDraggableBoxSize)
                         .testTag(AnchoredDraggableTestTag)
-                        .anchoredDraggable(
-                            state = state,
-                            orientation = Orientation.Horizontal
-                        )
+                        .anchoredDraggable(state = state, orientation = Orientation.Horizontal)
                         .onSizeChanged { layoutSize ->
                             state.updateAnchors(
                                 DraggableAnchors {
@@ -503,13 +433,7 @@
                                 }
                             )
                         }
-                        .offset {
-                            IntOffset(
-                                state
-                                    .requireOffset()
-                                    .roundToInt(), 0
-                            )
-                        }
+                        .offset { IntOffset(state.requireOffset().roundToInt(), 0) }
                         .background(Color.Red)
                 )
             }
@@ -522,23 +446,20 @@
     @Ignore("Todo: Fix differences between tests and real code - this shouldn't work :)")
     fun anchoredDraggable_requireOffset_accessedInInitialComposition_throws() {
         var exception: Throwable? = null
-        val state = AnchoredDraggableState(
-            initialValue = B,
-            positionalThreshold = defaultPositionalThreshold,
-            velocityThreshold = defaultVelocityThreshold,
-            animationSpec = defaultAnimationSpec
-        )
+        val state =
+            AnchoredDraggableState(
+                initialValue = B,
+                positionalThreshold = defaultPositionalThreshold,
+                velocityThreshold = defaultVelocityThreshold,
+                animationSpec = defaultAnimationSpec
+            )
         var offset: Float? = null
         rule.setContent {
             Box(Modifier.fillMaxSize()) {
                 Box(
-                    Modifier
-                        .requiredSize(AnchoredDraggableBoxSize)
+                    Modifier.requiredSize(AnchoredDraggableBoxSize)
                         .testTag(AnchoredDraggableTestTag)
-                        .anchoredDraggable(
-                            state = state,
-                            orientation = Orientation.Horizontal
-                        )
+                        .anchoredDraggable(state = state, orientation = Orientation.Horizontal)
                         .onSizeChanged { layoutSize ->
                             state.updateAnchors(
                                 DraggableAnchors {
@@ -548,13 +469,7 @@
                                 }
                             )
                         }
-                        .offset {
-                            IntOffset(
-                                state
-                                    .requireOffset()
-                                    .roundToInt(), 0
-                            )
-                        }
+                        .offset { IntOffset(state.requireOffset().roundToInt(), 0) }
                         .background(Color.Red)
                 )
             }
@@ -600,49 +515,39 @@
         }
 
         val animationSpec = FloatSpringSpec(dampingRatio = Spring.DampingRatioHighBouncy)
-        val animationDuration = animationSpec.getDurationNanos(
-            initialValue = minBound,
-            targetValue = maxBound,
-            initialVelocity = 0f
-        ).let { TimeUnit.NANOSECONDS.toMillis(it) }
+        val animationDuration =
+            animationSpec
+                .getDurationNanos(
+                    initialValue = minBound,
+                    targetValue = maxBound,
+                    initialVelocity = 0f
+                )
+                .let { TimeUnit.NANOSECONDS.toMillis(it) }
 
-        val state = AnchoredDraggableState(
-            initialValue = A,
-            positionalThreshold = defaultPositionalThreshold,
-            velocityThreshold = defaultVelocityThreshold,
-            animationSpec = animationSpec
-        )
+        val state =
+            AnchoredDraggableState(
+                initialValue = A,
+                positionalThreshold = defaultPositionalThreshold,
+                velocityThreshold = defaultVelocityThreshold,
+                animationSpec = animationSpec
+            )
         lateinit var scope: CoroutineScope
 
         rule.setContent {
             scope = rememberCoroutineScope()
-            SideEffect {
-                state.updateAnchors(anchors)
-            }
+            SideEffect { state.updateAnchors(anchors) }
             Box(Modifier.fillMaxSize()) {
                 Box(
-                    Modifier
-                        .requiredSize(AnchoredDraggableBoxSize)
+                    Modifier.requiredSize(AnchoredDraggableBoxSize)
                         .testTag(AnchoredDraggableTestTag)
-                        .anchoredDraggable(
-                            state = state,
-                            orientation = Orientation.Vertical
-                        )
-                        .offset {
-                            IntOffset(
-                                state
-                                    .requireOffset()
-                                    .roundToInt(), 0
-                            )
-                        }
+                        .anchoredDraggable(state = state, orientation = Orientation.Vertical)
+                        .offset { IntOffset(state.requireOffset().roundToInt(), 0) }
                         .background(Color.Red)
                 )
             }
         }
 
-        scope.launch {
-            state.animateTo(C)
-        }
+        scope.launch { state.animateTo(C) }
         var highestOffset = 0f
         for (i in 0..animationDuration step 16) {
             highestOffset = state.requireOffset()
@@ -653,12 +558,13 @@
 
     @Test
     fun anchoredDraggable_targetNotInAnchors_animateTo_updatesCurrentValue() {
-        val state = AnchoredDraggableState(
-            initialValue = A,
-            positionalThreshold = defaultPositionalThreshold,
-            velocityThreshold = defaultVelocityThreshold,
-            animationSpec = defaultAnimationSpec
-        )
+        val state =
+            AnchoredDraggableState(
+                initialValue = A,
+                positionalThreshold = defaultPositionalThreshold,
+                velocityThreshold = defaultVelocityThreshold,
+                animationSpec = defaultAnimationSpec
+            )
         assertThat(state.anchors.size).isEqualTo(0)
         assertThat(state.currentValue).isEqualTo(A)
         runBlocking { state.animateTo(B) }
@@ -667,12 +573,13 @@
 
     @Test
     fun anchoredDraggable_targetNotInAnchors_snapTo_updatesCurrentValue() {
-        val state = AnchoredDraggableState(
-            initialValue = A,
-            positionalThreshold = defaultPositionalThreshold,
-            velocityThreshold = defaultVelocityThreshold,
-            animationSpec = defaultAnimationSpec
-        )
+        val state =
+            AnchoredDraggableState(
+                initialValue = A,
+                positionalThreshold = defaultPositionalThreshold,
+                velocityThreshold = defaultVelocityThreshold,
+                animationSpec = defaultAnimationSpec
+            )
         assertThat(state.anchors.size).isEqualTo(0)
         assertThat(state.currentValue).isEqualTo(A)
         runBlocking { state.snapTo(B) }
@@ -681,12 +588,13 @@
 
     @Test
     fun anchoredDraggable_updateAnchors_noOngoingDrag_shouldUpdateOffset() {
-        val anchoredDraggableState = AnchoredDraggableState(
-            initialValue = A,
-            positionalThreshold = defaultPositionalThreshold,
-            velocityThreshold = defaultVelocityThreshold,
-            animationSpec = defaultAnimationSpec
-        )
+        val anchoredDraggableState =
+            AnchoredDraggableState(
+                initialValue = A,
+                positionalThreshold = defaultPositionalThreshold,
+                velocityThreshold = defaultVelocityThreshold,
+                animationSpec = defaultAnimationSpec
+            )
 
         assertThat(anchoredDraggableState.currentValue).isEqualTo(A)
         assertThat(anchoredDraggableState.targetValue).isEqualTo(A)
@@ -694,10 +602,11 @@
 
         val offsetAtB = 100f
         anchoredDraggableState.updateAnchors(
-            newAnchors = DraggableAnchors {
-                A at 0f
-                B at offsetAtB
-            },
+            newAnchors =
+                DraggableAnchors {
+                    A at 0f
+                    B at offsetAtB
+                },
             newTarget = B
         )
         assertThat(anchoredDraggableState.currentValue).isEqualTo(B)
@@ -709,12 +618,13 @@
     @Test
     fun anchoredDraggable_updateAnchors_ongoingDrag_shouldRestartDrag() = runTest {
         // Given an anchored draggable state
-        val anchoredDraggableState = AnchoredDraggableState(
-            initialValue = 1,
-            defaultPositionalThreshold,
-            defaultVelocityThreshold,
-            animationSpec = defaultAnimationSpec
-        )
+        val anchoredDraggableState =
+            AnchoredDraggableState(
+                initialValue = 1,
+                defaultPositionalThreshold,
+                defaultVelocityThreshold,
+                animationSpec = defaultAnimationSpec
+            )
 
         val anchorUpdates = Channel<DraggableAnchors<Int>>()
         val dragJob = launch {
@@ -732,9 +642,7 @@
             1 at 100f
             2 at 200f
         }
-        Snapshot.withMutableSnapshot {
-            anchoredDraggableState.updateAnchors(newAnchors)
-        }
+        Snapshot.withMutableSnapshot { anchoredDraggableState.updateAnchors(newAnchors) }
 
         // Then the block should be invoked with the new anchors
         assertThat(dragJob.isActive).isTrue()
@@ -747,20 +655,22 @@
     @Test
     fun anchoredDraggable_updateAnchors_anchoredDrag_invokedWithLatestAnchors() = runTest {
         // Given an anchored draggable state
-        val anchoredDraggableState = AnchoredDraggableState(
-            initialValue = 1,
-            defaultPositionalThreshold,
-            defaultVelocityThreshold,
-            animationSpec = defaultAnimationSpec
-        )
+        val anchoredDraggableState =
+            AnchoredDraggableState(
+                initialValue = 1,
+                defaultPositionalThreshold,
+                defaultVelocityThreshold,
+                animationSpec = defaultAnimationSpec
+            )
 
         val anchorUpdates = Channel<DraggableAnchors<Int>>()
-        val dragJob = launch(Dispatchers.Unconfined) {
-            anchoredDraggableState.anchoredDrag { newAnchors ->
-                anchorUpdates.send(newAnchors)
-                suspendIndefinitely()
+        val dragJob =
+            launch(Dispatchers.Unconfined) {
+                anchoredDraggableState.anchoredDrag { newAnchors ->
+                    anchorUpdates.send(newAnchors)
+                    suspendIndefinitely()
+                }
             }
-        }
 
         val firstAnchors = anchorUpdates.receive()
         assertThat(firstAnchors.size).isEqualTo(0)
@@ -770,9 +680,7 @@
             1 at 100f
             2 at 200f
         }
-        Snapshot.withMutableSnapshot {
-            anchoredDraggableState.updateAnchors(newAnchors)
-        }
+        Snapshot.withMutableSnapshot { anchoredDraggableState.updateAnchors(newAnchors) }
 
         // Then the block should be invoked with the new anchors
         assertThat(dragJob.isActive).isTrue()
@@ -784,12 +692,13 @@
     @OptIn(ExperimentalCoroutinesApi::class)
     @Test
     fun anchoredDraggable_updateAnchors_anchoredDrag_invokedWithLatestTarget() = runTest {
-        val anchoredDraggableState = AnchoredDraggableState(
-            initialValue = A,
-            defaultPositionalThreshold,
-            defaultVelocityThreshold,
-            animationSpec = defaultAnimationSpec
-        )
+        val anchoredDraggableState =
+            AnchoredDraggableState(
+                initialValue = A,
+                defaultPositionalThreshold,
+                defaultVelocityThreshold,
+                animationSpec = defaultAnimationSpec
+            )
         anchoredDraggableState.updateAnchors(
             DraggableAnchors {
                 A at 0f
@@ -801,12 +710,13 @@
 
         val firstExpectedTarget = B
         val targetUpdates = Channel<AnchoredDraggableTestValue>()
-        val dragJob = launch(Dispatchers.Unconfined) {
-            anchoredDraggableState.anchoredDrag(firstExpectedTarget) { _, latestTarget ->
-                targetUpdates.send(latestTarget)
-                suspendIndefinitely()
+        val dragJob =
+            launch(Dispatchers.Unconfined) {
+                anchoredDraggableState.anchoredDrag(firstExpectedTarget) { _, latestTarget ->
+                    targetUpdates.send(latestTarget)
+                    suspendIndefinitely()
+                }
             }
-        }
 
         val firstTarget = targetUpdates.receive()
         assertThat(firstTarget).isEqualTo(firstExpectedTarget)
@@ -817,9 +727,7 @@
             A at 100f
             B at 200f
         }
-        Snapshot.withMutableSnapshot {
-            anchoredDraggableState.updateAnchors(newAnchors, newTarget)
-        }
+        Snapshot.withMutableSnapshot { anchoredDraggableState.updateAnchors(newAnchors, newTarget) }
 
         // Then the block should be invoked with the new anchors
         val secondTarget = targetUpdates.receive()
@@ -830,12 +738,13 @@
     @OptIn(ExperimentalCoroutinesApi::class)
     @Test
     fun anchoredDraggable_dragCompletesExceptionally_cleansUp() = runTest {
-        val anchoredDraggableState = AnchoredDraggableState(
-            initialValue = A,
-            defaultPositionalThreshold,
-            defaultVelocityThreshold,
-            animationSpec = defaultAnimationSpec
-        )
+        val anchoredDraggableState =
+            AnchoredDraggableState(
+                initialValue = A,
+                defaultPositionalThreshold,
+                defaultVelocityThreshold,
+                animationSpec = defaultAnimationSpec
+            )
         val cancellationSignal = CompletableDeferred(false)
         val anchoredDragUpdates = Channel<Unit>()
         val dragJob = launch {
@@ -855,12 +764,13 @@
 
     @Test
     fun anchoredDraggable_customDrag_updatesOffset() = runBlocking {
-        val state = AnchoredDraggableState(
-            initialValue = A,
-            positionalThreshold = defaultPositionalThreshold,
-            velocityThreshold = defaultVelocityThreshold,
-            animationSpec = defaultAnimationSpec
-        )
+        val state =
+            AnchoredDraggableState(
+                initialValue = A,
+                positionalThreshold = defaultPositionalThreshold,
+                velocityThreshold = defaultVelocityThreshold,
+                animationSpec = defaultAnimationSpec
+            )
         val anchors = DraggableAnchors {
             A at 0f
             B at 200f
@@ -868,26 +778,23 @@
         }
 
         state.updateAnchors(anchors)
-        state.anchoredDrag {
-            dragTo(150f)
-        }
+        state.anchoredDrag { dragTo(150f) }
 
         assertThat(state.requireOffset()).isEqualTo(150f)
 
-        state.anchoredDrag {
-            dragTo(250f)
-        }
+        state.anchoredDrag { dragTo(250f) }
         assertThat(state.requireOffset()).isEqualTo(250f)
     }
 
     @Test
     fun anchoredDraggable_customDrag_updatesVelocity() = runBlocking {
-        val state = AnchoredDraggableState(
-            initialValue = A,
-            positionalThreshold = defaultPositionalThreshold,
-            velocityThreshold = defaultVelocityThreshold,
-            animationSpec = defaultAnimationSpec
-        )
+        val state =
+            AnchoredDraggableState(
+                initialValue = A,
+                positionalThreshold = defaultPositionalThreshold,
+                velocityThreshold = defaultVelocityThreshold,
+                animationSpec = defaultAnimationSpec
+            )
         val anchors = DraggableAnchors {
             A at 0f
             B at 200f
@@ -895,9 +802,7 @@
         }
 
         state.updateAnchors(anchors)
-        state.anchoredDrag {
-            dragTo(150f, lastKnownVelocity = 454f)
-        }
+        state.anchoredDrag { dragTo(150f, lastKnownVelocity = 454f) }
         assertThat(state.lastVelocity).isEqualTo(454f)
     }
 
@@ -906,12 +811,13 @@
         val clock = HandPumpTestFrameClock()
         val dragScope = CoroutineScope(clock)
 
-        val state = AnchoredDraggableState(
-            initialValue = A,
-            positionalThreshold = defaultPositionalThreshold,
-            velocityThreshold = defaultVelocityThreshold,
-            animationSpec = defaultAnimationSpec
-        )
+        val state =
+            AnchoredDraggableState(
+                initialValue = A,
+                positionalThreshold = defaultPositionalThreshold,
+                velocityThreshold = defaultVelocityThreshold,
+                animationSpec = defaultAnimationSpec
+            )
         val anchors = DraggableAnchors {
             A at 0f
             B at 200f
@@ -922,9 +828,7 @@
         dragScope.launch(start = CoroutineStart.UNDISPATCHED) {
             state.anchoredDrag(targetValue = C) { _, _ ->
                 while (isActive) {
-                    withFrameNanos {
-                        dragTo(200f)
-                    }
+                    withFrameNanos { dragTo(200f) }
                 }
             }
         }
@@ -940,13 +844,14 @@
             A at initialValueOffset
             B at 200f
         }
-        val state = AnchoredDraggableState(
-            initialValue = A,
-            anchors = anchors,
-            positionalThreshold = defaultPositionalThreshold,
-            velocityThreshold = defaultVelocityThreshold,
-            animationSpec = defaultAnimationSpec
-        )
+        val state =
+            AnchoredDraggableState(
+                initialValue = A,
+                anchors = anchors,
+                positionalThreshold = defaultPositionalThreshold,
+                velocityThreshold = defaultVelocityThreshold,
+                animationSpec = defaultAnimationSpec
+            )
         assertThat(state.anchors).isEqualTo(anchors)
         assertThat(state.offset).isEqualTo(initialValueOffset)
     }
@@ -954,13 +859,14 @@
     @Test
     fun anchoredDraggable_constructorWithAnchors_initialValueNotInAnchors_updatesCurrentValue() {
         val anchors = DraggableAnchors { B at 200f }
-        val state = AnchoredDraggableState(
-            initialValue = A,
-            anchors = anchors,
-            positionalThreshold = defaultPositionalThreshold,
-            velocityThreshold = defaultVelocityThreshold,
-            animationSpec = defaultAnimationSpec
-        )
+        val state =
+            AnchoredDraggableState(
+                initialValue = A,
+                anchors = anchors,
+                positionalThreshold = defaultPositionalThreshold,
+                velocityThreshold = defaultVelocityThreshold,
+                animationSpec = defaultAnimationSpec
+            )
         assertThat(state.anchors).isEqualTo(anchors)
         assertThat(state.offset).isNaN()
     }
@@ -969,18 +875,17 @@
     fun anchoredDraggable_customDrag_settleOnInvalidState_shouldRespectConfirmValueChange() =
         runBlocking {
             var shouldBlockValueC = false
-            val state = AnchoredDraggableState(
-                initialValue = B,
-                positionalThreshold = defaultPositionalThreshold,
-                velocityThreshold = defaultVelocityThreshold,
-                animationSpec = defaultAnimationSpec,
-                confirmValueChange = {
-                    if (shouldBlockValueC)
-                        it != C // block state value C
-                    else
-                        true
-                }
-            )
+            val state =
+                AnchoredDraggableState(
+                    initialValue = B,
+                    positionalThreshold = defaultPositionalThreshold,
+                    velocityThreshold = defaultVelocityThreshold,
+                    animationSpec = defaultAnimationSpec,
+                    confirmValueChange = {
+                        if (shouldBlockValueC) it != C // block state value C
+                        else true
+                    }
+                )
             val anchors = DraggableAnchors {
                 A at 0f
                 B at 200f
@@ -988,25 +893,19 @@
             }
 
             state.updateAnchors(anchors)
-            state.anchoredDrag {
-                dragTo(300f)
-            }
+            state.anchoredDrag { dragTo(300f) }
 
             // confirm we can actually go to C
             assertThat(state.currentValue).isEqualTo(C)
 
             // go back to B
-            state.anchoredDrag {
-                dragTo(200f)
-            }
+            state.anchoredDrag { dragTo(200f) }
             assertThat(state.currentValue).isEqualTo(B)
 
             // disallow C
             shouldBlockValueC = true
 
-            state.anchoredDrag {
-                dragTo(300f)
-            }
+            state.anchoredDrag { dragTo(300f) }
             assertThat(state.currentValue).isNotEqualTo(C)
         }
 
@@ -1019,50 +918,59 @@
         )
 
         val innerLayoutExecutionOrder = mutableListOf<LayoutExecutionInfo>()
-        val state = AnchoredDraggableState(
-            initialValue = B,
-            positionalThreshold = defaultPositionalThreshold,
-            velocityThreshold = defaultVelocityThreshold,
-            animationSpec = defaultAnimationSpec
-        )
+        val state =
+            AnchoredDraggableState(
+                initialValue = B,
+                positionalThreshold = defaultPositionalThreshold,
+                velocityThreshold = defaultVelocityThreshold,
+                animationSpec = defaultAnimationSpec
+            )
         rule.setContent {
             LookaheadScope {
                 SubcomposeLayout { constraints ->
                     layout(0, 0) {
                         // Do all work in placement instead of measurement, so we run lookahead
                         // place before post-lookahead measure
-                        val placeables = subcompose("sheet") {
-                            Box(
-                                modifier = Modifier
-                                    .layout { measurable, innerConstraints ->
-                                        innerLayoutExecutionOrder
-                                            .add(LayoutExecutionInfo(0, isLookingAhead))
-                                        layout(
-                                            innerConstraints.maxWidth,
-                                            innerConstraints.maxHeight
-                                        ) {
-                                            val placeable = measurable.measure(innerConstraints)
-                                            innerLayoutExecutionOrder
-                                                .add(LayoutExecutionInfo(1, isLookingAhead))
-                                            placeable.place(0, 0)
-                                        }
-                                    }
-                                    // The offset should be initialized by draggableAnchors in
-                                    // lookahead measure. If lookahead place runs before
-                                    // post-lookahead measure and we were not initializing the
-                                    // offset in lookahead measure, this would crash as
-                                    // draggableAnchors uses requireOffset in placement.
-                                    .draggableAnchors(
-                                        state,
-                                        Orientation.Vertical
-                                    ) { size, constraints ->
-                                        DraggableAnchors {
-                                            A at 0f
-                                            C at constraints.maxHeight - size.height.toFloat()
-                                        } to A
-                                    }
-                            )
-                        }.map { it.measure(constraints) }
+                        val placeables =
+                            subcompose("sheet") {
+                                    Box(
+                                        modifier =
+                                            Modifier.layout { measurable, innerConstraints ->
+                                                    innerLayoutExecutionOrder.add(
+                                                        LayoutExecutionInfo(0, isLookingAhead)
+                                                    )
+                                                    layout(
+                                                        innerConstraints.maxWidth,
+                                                        innerConstraints.maxHeight
+                                                    ) {
+                                                        val placeable =
+                                                            measurable.measure(innerConstraints)
+                                                        innerLayoutExecutionOrder.add(
+                                                            LayoutExecutionInfo(1, isLookingAhead)
+                                                        )
+                                                        placeable.place(0, 0)
+                                                    }
+                                                }
+                                                // The offset should be initialized by
+                                                // draggableAnchors in
+                                                // lookahead measure. If lookahead place runs before
+                                                // post-lookahead measure and we were not
+                                                // initializing the
+                                                // offset in lookahead measure, this would crash as
+                                                // draggableAnchors uses requireOffset in placement.
+                                                .draggableAnchors(state, Orientation.Vertical) {
+                                                    size,
+                                                    constraints ->
+                                                    DraggableAnchors {
+                                                        A at 0f
+                                                        C at
+                                                            constraints.maxHeight -
+                                                                size.height.toFloat()
+                                                    } to A
+                                                }
+                                    )
+                                }
+                                .map { it.measure(constraints) }
                         placeables.map { it.place(0, 0) }
                     }
                 }
@@ -1077,7 +985,7 @@
             )
     }
 
-    private suspend fun suspendIndefinitely() = suspendCancellableCoroutine<Unit> { }
+    private suspend fun suspendIndefinitely() = suspendCancellableCoroutine<Unit> {}
 
     private class HandPumpTestFrameClock : MonotonicFrameClock {
         private val frameCh = Channel<Long>(1)
diff --git a/compose/material3/material3/src/androidInstrumentedTest/kotlin/androidx/compose/material3/anchoredDraggable/AnchoredDraggableTestValue.kt b/compose/material3/material3/src/androidInstrumentedTest/kotlin/androidx/compose/material3/anchoredDraggable/AnchoredDraggableTestValue.kt
index 3370f94..f2785473 100644
--- a/compose/material3/material3/src/androidInstrumentedTest/kotlin/androidx/compose/material3/anchoredDraggable/AnchoredDraggableTestValue.kt
+++ b/compose/material3/material3/src/androidInstrumentedTest/kotlin/androidx/compose/material3/anchoredDraggable/AnchoredDraggableTestValue.kt
@@ -15,4 +15,8 @@
  */
 package androidx.compose.material3.anchoredDraggable
 
-internal enum class AnchoredDraggableTestValue { A, B, C }
+internal enum class AnchoredDraggableTestValue {
+    A,
+    B,
+    C
+}
diff --git a/compose/material3/material3/src/androidInstrumentedTest/kotlin/androidx/compose/material3/carousel/CarouselItemScopeTest.kt b/compose/material3/material3/src/androidInstrumentedTest/kotlin/androidx/compose/material3/carousel/CarouselItemScopeTest.kt
index 26faa0f..88662a1 100644
--- a/compose/material3/material3/src/androidInstrumentedTest/kotlin/androidx/compose/material3/carousel/CarouselItemScopeTest.kt
+++ b/compose/material3/material3/src/androidInstrumentedTest/kotlin/androidx/compose/material3/carousel/CarouselItemScopeTest.kt
@@ -52,29 +52,29 @@
 @OptIn(ExperimentalMaterial3Api::class)
 class CarouselItemScopeTest {
 
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
-    @get:Rule
-    val screenshotRule = AndroidXScreenshotTestRule(GOLDEN_MATERIAL3)
+    @get:Rule val screenshotRule = AndroidXScreenshotTestRule(GOLDEN_MATERIAL3)
 
     val testTag = "ItemTag"
 
     @Test
     fun mask_fullyUnmaskedShouldMatchSize() {
         rule.setMaterialContent(lightColorScheme()) {
-            val scope = createCarouselItemScope(
-                size = 100.dp,
-                minSize = 10.dp,
-                maxSize = 100.dp,
-                maskRect = DpRect(0.dp, 0.dp, 100.dp, 100.dp)
-            )
+            val scope =
+                createCarouselItemScope(
+                    size = 100.dp,
+                    minSize = 10.dp,
+                    maxSize = 100.dp,
+                    maskRect = DpRect(0.dp, 0.dp, 100.dp, 100.dp)
+                )
             with(scope) {
-                Box(modifier = Modifier
-                    .testTag(testTag)
-                    .size(100.dp)
-                    .maskClip(shape = RoundedCornerShape(28.dp))
-                    .background(Color.Red)
+                Box(
+                    modifier =
+                        Modifier.testTag(testTag)
+                            .size(100.dp)
+                            .maskClip(shape = RoundedCornerShape(28.dp))
+                            .background(Color.Red)
                 )
             }
         }
@@ -85,18 +85,20 @@
     @Test
     fun mask_halfMaksedShouldIntersectSize() {
         rule.setMaterialContent(lightColorScheme()) {
-            val scope = createCarouselItemScope(
-                size = 50.dp,
-                minSize = 10.dp,
-                maxSize = 100.dp,
-                maskRect = DpRect(25.dp, 25.dp, 75.dp, 75.dp)
-            )
+            val scope =
+                createCarouselItemScope(
+                    size = 50.dp,
+                    minSize = 10.dp,
+                    maxSize = 100.dp,
+                    maskRect = DpRect(25.dp, 25.dp, 75.dp, 75.dp)
+                )
             with(scope) {
-                Box(modifier = Modifier
-                    .testTag(testTag)
-                    .size(100.dp)
-                    .maskClip(shape = RoundedCornerShape(10.dp))
-                    .background(Color.Red)
+                Box(
+                    modifier =
+                        Modifier.testTag(testTag)
+                            .size(100.dp)
+                            .maskClip(shape = RoundedCornerShape(10.dp))
+                            .background(Color.Red)
                 )
             }
         }
@@ -110,18 +112,20 @@
             addOval(Rect(0f, 0f, size.width, size.height))
         }
         rule.setMaterialContent(lightColorScheme()) {
-            val scope = createCarouselItemScope(
-                size = 50.dp,
-                minSize = 10.dp,
-                maxSize = 100.dp,
-                maskRect = DpRect(25.dp, 0.dp, 75.dp, 100.dp)
-            )
+            val scope =
+                createCarouselItemScope(
+                    size = 50.dp,
+                    minSize = 10.dp,
+                    maxSize = 100.dp,
+                    maskRect = DpRect(25.dp, 0.dp, 75.dp, 100.dp)
+                )
             with(scope) {
-                Box(modifier = Modifier
-                    .testTag(testTag)
-                    .size(100.dp)
-                    .maskClip(shape = ovalPathShape)
-                    .background(Color.Red)
+                Box(
+                    modifier =
+                        Modifier.testTag(testTag)
+                            .size(100.dp)
+                            .maskClip(shape = ovalPathShape)
+                            .background(Color.Red)
                 )
             }
         }
@@ -132,18 +136,20 @@
     @Test
     fun mask_squareMaskShouldIntersectSize() {
         rule.setMaterialContent(lightColorScheme()) {
-            val scope = createCarouselItemScope(
-                size = 50.dp,
-                minSize = 10.dp,
-                maxSize = 100.dp,
-                maskRect = DpRect(25.dp, 0.dp, 75.dp, 100.dp)
-            )
+            val scope =
+                createCarouselItemScope(
+                    size = 50.dp,
+                    minSize = 10.dp,
+                    maxSize = 100.dp,
+                    maskRect = DpRect(25.dp, 0.dp, 75.dp, 100.dp)
+                )
             with(scope) {
-                Box(modifier = Modifier
-                    .testTag(testTag)
-                    .size(100.dp)
-                    .maskClip(shape = RoundedCornerShape(0.dp))
-                    .background(Color.Red)
+                Box(
+                    modifier =
+                        Modifier.testTag(testTag)
+                            .size(100.dp)
+                            .maskClip(shape = RoundedCornerShape(0.dp))
+                            .background(Color.Red)
                 )
             }
         }
@@ -154,22 +160,24 @@
     @Test
     fun maskBorder_fullyUnmaskedShouldMatchSize() {
         rule.setMaterialContent(lightColorScheme()) {
-            val scope = createCarouselItemScope(
-                size = 100.dp,
-                minSize = 10.dp,
-                maxSize = 100.dp,
-                maskRect = DpRect(0.dp, 0.dp, 100.dp, 100.dp)
-            )
+            val scope =
+                createCarouselItemScope(
+                    size = 100.dp,
+                    minSize = 10.dp,
+                    maxSize = 100.dp,
+                    maskRect = DpRect(0.dp, 0.dp, 100.dp, 100.dp)
+                )
             with(scope) {
-                Box(modifier = Modifier
-                    .testTag(testTag)
-                    .size(100.dp)
-                    .maskClip(shape = RoundedCornerShape(10.dp))
-                    .maskBorder(
-                        border = BorderStroke(5.dp, Color.Blue),
-                        shape = RoundedCornerShape(10.dp)
-                    )
-                    .background(Color.Red)
+                Box(
+                    modifier =
+                        Modifier.testTag(testTag)
+                            .size(100.dp)
+                            .maskClip(shape = RoundedCornerShape(10.dp))
+                            .maskBorder(
+                                border = BorderStroke(5.dp, Color.Blue),
+                                shape = RoundedCornerShape(10.dp)
+                            )
+                            .background(Color.Red)
                 )
             }
         }
@@ -186,22 +194,21 @@
             close()
         }
         rule.setMaterialContent(lightColorScheme()) {
-            val scope = createCarouselItemScope(
-                size = 100.dp,
-                minSize = 10.dp,
-                maxSize = 100.dp,
-                maskRect = DpRect(25.dp, 25.dp, 75.dp, 75.dp)
-            )
+            val scope =
+                createCarouselItemScope(
+                    size = 100.dp,
+                    minSize = 10.dp,
+                    maxSize = 100.dp,
+                    maskRect = DpRect(25.dp, 25.dp, 75.dp, 75.dp)
+                )
             with(scope) {
-                Box(modifier = Modifier
-                    .testTag(testTag)
-                    .size(100.dp)
-                    .maskClip(shape = triangle)
-                    .maskBorder(
-                        border = BorderStroke(5.dp, Color.Blue),
-                        shape = triangle
-                    )
-                    .background(Color.Red)
+                Box(
+                    modifier =
+                        Modifier.testTag(testTag)
+                            .size(100.dp)
+                            .maskClip(shape = triangle)
+                            .maskBorder(border = BorderStroke(5.dp, Color.Blue), shape = triangle)
+                            .background(Color.Red)
                 )
             }
         }
@@ -215,24 +222,22 @@
         maxSize: Dp,
         maskRect: DpRect
     ): CarouselItemScope {
-        return CarouselItemScopeImpl(CarouselItemInfoImpl().apply {
-
-            with(rule.density) {
-                sizeState = size.toPx()
-                minSizeState = minSize.toPx()
-                maxSizeState = maxSize.toPx()
-                maskRectState = maskRect.toRect()
+        return CarouselItemScopeImpl(
+            CarouselItemInfoImpl().apply {
+                with(rule.density) {
+                    sizeState = size.toPx()
+                    minSizeState = minSize.toPx()
+                    maxSizeState = maxSize.toPx()
+                    maskRectState = maskRect.toRect()
+                }
             }
-        })
+        )
     }
 
     private fun assertCarouselAgainstGolden(goldenIdentifier: String) {
         rule
             .onNodeWithTag(testTag)
             .captureToImage()
-            .assertAgainstGolden(
-                screenshotRule,
-                "carousel_$goldenIdentifier"
-            )
+            .assertAgainstGolden(screenshotRule, "carousel_$goldenIdentifier")
     }
 }
diff --git a/compose/material3/material3/src/androidInstrumentedTest/kotlin/androidx/compose/material3/carousel/CarouselTest.kt b/compose/material3/material3/src/androidInstrumentedTest/kotlin/androidx/compose/material3/carousel/CarouselTest.kt
index 5d529fa..1afd01a 100644
--- a/compose/material3/material3/src/androidInstrumentedTest/kotlin/androidx/compose/material3/carousel/CarouselTest.kt
+++ b/compose/material3/material3/src/androidInstrumentedTest/kotlin/androidx/compose/material3/carousel/CarouselTest.kt
@@ -54,8 +54,7 @@
 
     private lateinit var carouselState: CarouselState
 
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
     @Test
     fun carousel_horizontalScrollUpdatesState() {
@@ -64,13 +63,12 @@
         assertThat(carouselState.pagerState.currentPage).isEqualTo(0)
 
         // Act
-        rule.onNodeWithTag(CarouselTestTag)
-            .performTouchInput { swipeWithVelocity(centerRight, centerLeft, 1000f) }
+        rule.onNodeWithTag(CarouselTestTag).performTouchInput {
+            swipeWithVelocity(centerRight, centerLeft, 1000f)
+        }
 
         // Assert
-        rule.runOnIdle {
-            assertThat(carouselState.pagerState.currentPage).isNotEqualTo(0)
-        }
+        rule.runOnIdle { assertThat(carouselState.pagerState.currentPage).isNotEqualTo(0) }
     }
 
     @Test
@@ -80,15 +78,12 @@
         assertThat(carouselState.pagerState.currentPage).isEqualTo(0)
 
         // Act
-        rule.onNodeWithTag(CarouselTestTag)
-            .performTouchInput {
-                swipeWithVelocity(bottomCenter, topCenter, 1000f)
-            }
+        rule.onNodeWithTag(CarouselTestTag).performTouchInput {
+            swipeWithVelocity(bottomCenter, topCenter, 1000f)
+        }
 
         // Assert
-        rule.runOnIdle {
-            assertThat(carouselState.pagerState.currentPage).isNotEqualTo(0)
-        }
+        rule.runOnIdle { assertThat(carouselState.pagerState.currentPage).isNotEqualTo(0) }
     }
 
     @Test
@@ -97,9 +92,7 @@
         createCarousel(initialItem = 5, orientation = Orientation.Horizontal)
 
         // Assert
-        rule.runOnIdle {
-            assertThat(carouselState.pagerState.currentPage).isEqualTo(5)
-        }
+        rule.runOnIdle { assertThat(carouselState.pagerState.currentPage).isEqualTo(5) }
     }
 
     @Test
@@ -108,8 +101,9 @@
         createCarousel()
 
         // Act
-        rule.onNodeWithTag(CarouselTestTag)
-            .performTouchInput { swipeWithVelocity(centerRight, centerLeft, 1000f) }
+        rule.onNodeWithTag(CarouselTestTag).performTouchInput {
+            swipeWithVelocity(centerRight, centerLeft, 1000f)
+        }
 
         // Assert
         rule.runOnIdle {
@@ -123,8 +117,9 @@
         createUncontainedCarousel()
 
         // Act
-        rule.onNodeWithTag(CarouselTestTag)
-            .performTouchInput { swipeWithVelocity(centerRight, centerLeft, 1000f) }
+        rule.onNodeWithTag(CarouselTestTag).performTouchInput {
+            swipeWithVelocity(centerRight, centerLeft, 1000f)
+        }
 
         // Assert
         rule.runOnIdle {
@@ -139,21 +134,16 @@
         assertThat(carouselState.pagerState.currentPage).isEqualTo(0)
 
         // Act
-        rule.onNodeWithTag(CarouselTestTag)
-            .performTouchInput {
-                swipeWithVelocity(
-                    centerRight,
-                    centerLeft,
-                    10000f
-                )
-            }
+        rule.onNodeWithTag(CarouselTestTag).performTouchInput {
+            swipeWithVelocity(centerRight, centerLeft, 10000f)
+        }
 
         // Assert
         rule.runOnIdle {
             // A swipe from the very right to very left should be capped at
             // the item right after the visible pages onscreen regardless of velocity
-            assertThat(carouselState.pagerState.currentPage).isLessThan(
-                carouselState.pagerState.layoutInfo.visiblePagesInfo.size + 1)
+            assertThat(carouselState.pagerState.currentPage)
+                .isLessThan(carouselState.pagerState.layoutInfo.visiblePagesInfo.size + 1)
         }
     }
 
@@ -161,61 +151,57 @@
     fun carouselMultibrowseFling_ScrollsToEnd() {
         // Arrange
         createCarousel(
-            flingBehavior =
-            { state: CarouselState -> CarouselDefaults.multiBrowseFlingBehavior(state) },
+            flingBehavior = { state: CarouselState ->
+                CarouselDefaults.multiBrowseFlingBehavior(state)
+            },
         )
         assertThat(carouselState.pagerState.currentPage).isEqualTo(0)
 
         // Act
-        rule.onNodeWithTag(CarouselTestTag)
-            .performTouchInput { swipeWithVelocity(centerRight, centerLeft, 10000f) }
+        rule.onNodeWithTag(CarouselTestTag).performTouchInput {
+            swipeWithVelocity(centerRight, centerLeft, 10000f)
+        }
 
         // Assert
         rule.runOnIdle {
             // A swipe from the very right to very left at a high velocity should go beyond
             // first item after the visible pages as it's not capped
-            assertThat(carouselState.pagerState.currentPage).isGreaterThan(
-                carouselState.pagerState.layoutInfo.visiblePagesInfo.size)
+            assertThat(carouselState.pagerState.currentPage)
+                .isGreaterThan(carouselState.pagerState.layoutInfo.visiblePagesInfo.size)
         }
     }
 
     @Test
     fun carousel_correctlyCalculatesMaxScrollOffsetWithItemSpacing() {
         rule.setMaterialContent(lightColorScheme()) {
-            val state = rememberCarouselState { 10 }.also {
-                carouselState = it
-            }
-            val strategy = Strategy(
-                defaultKeylines = keylineListOf(380f, 0f, CarouselAlignment.Start) {
-                        add(10f, isAnchor = true)
-                        add(186f)
-                        add(122f)
-                        add(56f)
-                        add(10f, isAnchor = true)
-                },
-                availableSpace = 380f,
-                itemSpacing = 8f,
-                beforeContentPadding = 0f,
-                afterContentPadding = 0f
-            )
+            val state = rememberCarouselState { 10 }.also { carouselState = it }
+            val strategy =
+                Strategy(
+                    defaultKeylines =
+                        keylineListOf(380f, 0f, CarouselAlignment.Start) {
+                            add(10f, isAnchor = true)
+                            add(186f)
+                            add(122f)
+                            add(56f)
+                            add(10f, isAnchor = true)
+                        },
+                    availableSpace = 380f,
+                    itemSpacing = 8f,
+                    beforeContentPadding = 0f,
+                    afterContentPadding = 0f
+                )
 
             // Max offset should only add item spacing between each item
             val expectedMaxScrollOffset = (186f * 10) + (8f * 9) - 380f
 
-            assertThat(calculateMaxScrollOffset(state, strategy)).isEqualTo(
-                expectedMaxScrollOffset
-            )
+            assertThat(calculateMaxScrollOffset(state, strategy)).isEqualTo(expectedMaxScrollOffset)
         }
     }
 
     @Composable
     internal fun Item(index: Int) {
         Box(
-            modifier = Modifier
-                .fillMaxSize()
-                .background(Color.Blue)
-                .testTag("$index")
-                .focusable(),
+            modifier = Modifier.fillMaxSize().background(Color.Blue).testTag("$index").focusable(),
             contentAlignment = Alignment.Center
         ) {
             BasicText(text = index.toString())
@@ -225,21 +211,18 @@
     private fun createCarousel(
         initialItem: Int = 0,
         itemCount: () -> Int = { DefaultItemCount },
-        modifier: Modifier = Modifier
-            .width(412.dp)
-            .height(221.dp),
+        modifier: Modifier = Modifier.width(412.dp).height(221.dp),
         orientation: Orientation = Orientation.Horizontal,
-        flingBehavior: @Composable (CarouselState) -> TargetedFlingBehavior = @Composable {
-            CarouselDefaults.singleAdvanceFlingBehavior(
-                state = it,
-            )
-        },
+        flingBehavior: @Composable (CarouselState) -> TargetedFlingBehavior =
+            @Composable {
+                CarouselDefaults.singleAdvanceFlingBehavior(
+                    state = it,
+                )
+            },
         content: @Composable CarouselItemScope.(item: Int) -> Unit = { Item(index = it) }
     ) {
         rule.setMaterialContent(lightColorScheme()) {
-            val state = rememberCarouselState(initialItem, itemCount).also {
-                carouselState = it
-            }
+            val state = rememberCarouselState(initialItem, itemCount).also { carouselState = it }
             val density = LocalDensity.current
             Carousel(
                 state = state,
@@ -266,15 +249,11 @@
     private fun createUncontainedCarousel(
         initialItem: Int = 0,
         itemCount: () -> Int = { DefaultItemCount },
-        modifier: Modifier = Modifier
-            .width(412.dp)
-            .height(221.dp),
+        modifier: Modifier = Modifier.width(412.dp).height(221.dp),
         content: @Composable CarouselItemScope.(item: Int) -> Unit = { Item(index = it) }
     ) {
         rule.setMaterialContent(lightColorScheme()) {
-            val state = rememberCarouselState(initialItem, itemCount).also {
-                carouselState = it
-            }
+            val state = rememberCarouselState(initialItem, itemCount).also { carouselState = it }
             HorizontalUncontainedCarousel(
                 state = state,
                 itemWidth = 150.dp,
diff --git a/compose/material3/material3/src/androidInstrumentedTest/kotlin/androidx/compose/material3/pulltorefresh/PullToRefreshIndicatorScreenshotTest.kt b/compose/material3/material3/src/androidInstrumentedTest/kotlin/androidx/compose/material3/pulltorefresh/PullToRefreshIndicatorScreenshotTest.kt
index 5063f0ef..619cc1a 100644
--- a/compose/material3/material3/src/androidInstrumentedTest/kotlin/androidx/compose/material3/pulltorefresh/PullToRefreshIndicatorScreenshotTest.kt
+++ b/compose/material3/material3/src/androidInstrumentedTest/kotlin/androidx/compose/material3/pulltorefresh/PullToRefreshIndicatorScreenshotTest.kt
@@ -46,11 +46,9 @@
 @RunWith(Parameterized::class)
 @SdkSuppress(minSdkVersion = Build.VERSION_CODES.O)
 class PullRefreshIndicatorScreenshotTest(private val scheme: ColorSchemeWrapper) {
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
-    @get:Rule
-    val screenshotRule = AndroidXScreenshotTestRule(GOLDEN_MATERIAL3)
+    @get:Rule val screenshotRule = AndroidXScreenshotTestRule(GOLDEN_MATERIAL3)
 
     private val testTag = "PullRefresh"
     private val wrap = Modifier.wrapContentSize(Alignment.TopStart)
@@ -86,19 +84,19 @@
 
         assertAgainstGolden("pullRefreshIndicator_${scheme.name}_progress")
     }
+
     private fun assertAgainstGolden(goldenName: String) {
-        rule.onNodeWithTag(testTag)
-            .captureToImage()
-            .assertAgainstGolden(screenshotRule, goldenName)
+        rule.onNodeWithTag(testTag).captureToImage().assertAgainstGolden(screenshotRule, goldenName)
     }
 
     companion object {
         @Parameterized.Parameters(name = "{0}")
         @JvmStatic
-        fun parameters() = arrayOf(
-            ColorSchemeWrapper("lightTheme", lightColorScheme()),
-            ColorSchemeWrapper("darkTheme", darkColorScheme()),
-        )
+        fun parameters() =
+            arrayOf(
+                ColorSchemeWrapper("lightTheme", lightColorScheme()),
+                ColorSchemeWrapper("darkTheme", darkColorScheme()),
+            )
     }
 
     class ColorSchemeWrapper(val name: String, val colorScheme: ColorScheme) {
@@ -107,17 +105,15 @@
         }
     }
 
-    private val mockState = object : PullToRefreshState {
-        override val distanceFraction: Float
-            get() = 1f
+    private val mockState =
+        object : PullToRefreshState {
+            override val distanceFraction: Float
+                get() = 1f
 
-        override suspend fun animateToThreshold() {
-        }
+            override suspend fun animateToThreshold() {}
 
-        override suspend fun animateToHidden() {
-        }
+            override suspend fun animateToHidden() {}
 
-        override suspend fun snapTo(targetValue: Float) {
+            override suspend fun snapTo(targetValue: Float) {}
         }
-    }
 }
diff --git a/compose/material3/material3/src/androidInstrumentedTest/kotlin/androidx/compose/material3/pulltorefresh/PullToRefreshIndicatorTest.kt b/compose/material3/material3/src/androidInstrumentedTest/kotlin/androidx/compose/material3/pulltorefresh/PullToRefreshIndicatorTest.kt
index f13f806..bca1d5f 100644
--- a/compose/material3/material3/src/androidInstrumentedTest/kotlin/androidx/compose/material3/pulltorefresh/PullToRefreshIndicatorTest.kt
+++ b/compose/material3/material3/src/androidInstrumentedTest/kotlin/androidx/compose/material3/pulltorefresh/PullToRefreshIndicatorTest.kt
@@ -47,8 +47,7 @@
 @OptIn(ExperimentalMaterial3Api::class)
 class PullToRefreshIndicatorTest {
 
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
     @Test
     fun indicatorDisplayed_refreshing() {
@@ -86,18 +85,13 @@
         rule.setContent {
             Box(Modifier.fillMaxSize()) {
                 PullToRefreshDefaults.Indicator(
-                    modifier = Modifier
-                        .size(containerSize)
-                        .testTag(INDICATOR_TAG),
+                    modifier = Modifier.size(containerSize).testTag(INDICATOR_TAG),
                     state = state,
                     isRefreshing = true,
                     threshold = verticalOffsetDp
-
                 )
             }
-            LaunchedEffect(true) {
-                state.animateToThreshold()
-            }
+            LaunchedEffect(true) { state.animateToThreshold() }
         }
 
         rule.waitForIdle()
@@ -107,9 +101,7 @@
             .onChild()
             .assertTopPositionInRootIsEqualTo(verticalOffsetDp - (containerSize + SpinnerSize) / 2)
 
-        runBlocking {
-            state.snapTo(0.5f)
-        }
+        runBlocking { state.snapTo(0.5f) }
         rule.waitForIdle()
 
         rule
@@ -126,13 +118,10 @@
         rule.setContent {
             Box {
                 Box(
-                    Modifier
-                        .fillMaxSize()
-                        .pointerInput(Unit) {
-                            awaitEachGesture {
-                                downEvent = awaitFirstDown()
-                            }
-                        })
+                    Modifier.fillMaxSize().pointerInput(Unit) {
+                        awaitEachGesture { downEvent = awaitFirstDown() }
+                    }
+                )
 
                 PullToRefreshDefaults.Indicator(
                     modifier = Modifier.testTag(INDICATOR_TAG),
diff --git a/compose/material3/material3/src/androidInstrumentedTest/kotlin/androidx/compose/material3/pulltorefresh/PullToRefreshStateImplTest.kt b/compose/material3/material3/src/androidInstrumentedTest/kotlin/androidx/compose/material3/pulltorefresh/PullToRefreshStateImplTest.kt
index 2d59111..08776e6 100644
--- a/compose/material3/material3/src/androidInstrumentedTest/kotlin/androidx/compose/material3/pulltorefresh/PullToRefreshStateImplTest.kt
+++ b/compose/material3/material3/src/androidInstrumentedTest/kotlin/androidx/compose/material3/pulltorefresh/PullToRefreshStateImplTest.kt
@@ -43,8 +43,7 @@
 @RunWith(AndroidJUnit4::class)
 @OptIn(ExperimentalMaterial3Api::class)
 class PullToRefreshStateImplTest {
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
     @Test
     fun refreshTrigger_onlyAfterThreshold() {
@@ -55,11 +54,11 @@
 
         rule.setContent {
             touchSlop = LocalViewConfiguration.current.touchSlop
-            positionalThreshold = with(LocalDensity.current) {
-                PullToRefreshDefaults.PositionalThreshold.toPx()
-            }
+            positionalThreshold =
+                with(LocalDensity.current) { PullToRefreshDefaults.PositionalThreshold.toPx() }
             var isRefreshing by mutableStateOf(false)
-            PullToRefreshBox(modifier = Modifier.testTag(PullRefreshTag),
+            PullToRefreshBox(
+                modifier = Modifier.testTag(PullRefreshTag),
                 isRefreshing = isRefreshing,
                 onRefresh = {
                     isRefreshing = true
@@ -67,12 +66,7 @@
                     isRefreshing = false
                 }
             ) {
-
-                LazyColumn {
-                    items(100) {
-                        Text("item $it")
-                    }
-                }
+                LazyColumn { items(100) { Text("item $it") } }
             }
         }
         // Account for DragModifier - pull down twice the threshold value.
@@ -83,9 +77,7 @@
         rule.waitForIdle()
 
         // Equal to threshold
-        pullRefreshNode.performTouchInput {
-            swipeDown(endY = 2 * positionalThreshold + touchSlop)
-        }
+        pullRefreshNode.performTouchInput { swipeDown(endY = 2 * positionalThreshold + touchSlop) }
 
         rule.runOnIdle {
             assertThat(refreshCount).isEqualTo(0)
@@ -105,46 +97,37 @@
         var refreshCount = 0
         var touchSlop = 0f
         var positionalThreshold = 0f
-        val state = object : PullToRefreshState {
+        val state =
+            object : PullToRefreshState {
 
-            var distanceFractionState by mutableStateOf(0f)
-            override val distanceFraction: Float
-                get() = distanceFractionState
+                var distanceFractionState by mutableStateOf(0f)
+                override val distanceFraction: Float
+                    get() = distanceFractionState
 
-            override suspend fun animateToThreshold() {
+                override suspend fun animateToThreshold() {}
+
+                override suspend fun animateToHidden() {}
+
+                override suspend fun snapTo(targetValue: Float) {
+                    distanceFractionState = targetValue
+                }
             }
 
-            override suspend fun animateToHidden() {
-            }
-
-            override suspend fun snapTo(targetValue: Float) {
-                distanceFractionState = targetValue
-            }
-        }
-
         rule.setContent {
             touchSlop = LocalViewConfiguration.current.touchSlop
-            positionalThreshold = with(LocalDensity.current) {
-                PullToRefreshDefaults.PositionalThreshold.toPx()
-            }
+            positionalThreshold =
+                with(LocalDensity.current) { PullToRefreshDefaults.PositionalThreshold.toPx() }
             PullToRefreshBox(
                 modifier = Modifier.testTag(PullRefreshTag),
                 isRefreshing = false,
                 onRefresh = { refreshCount++ },
                 state = state
             ) {
-
-                LazyColumn {
-                    items(100) {
-                        Text("item $it")
-                    }
-                }
+                LazyColumn { items(100) { Text("item $it") } }
             }
         }
 
-        pullRefreshNode.performTouchInput {
-            swipeDown(endY = positionalThreshold + touchSlop)
-        }
+        pullRefreshNode.performTouchInput { swipeDown(endY = positionalThreshold + touchSlop) }
 
         rule.runOnIdle {
             // Expected values given drag modifier of 0.5f
@@ -158,55 +141,44 @@
         var refreshCount = 0
         var touchSlop = 0f
         var positionalThreshold = 0f
-        val state = object : PullToRefreshState {
+        val state =
+            object : PullToRefreshState {
 
-            var distanceFractionState by mutableStateOf(0f)
-            override val distanceFraction: Float
-                get() = distanceFractionState
+                var distanceFractionState by mutableStateOf(0f)
+                override val distanceFraction: Float
+                    get() = distanceFractionState
 
-            override suspend fun animateToThreshold() {
+                override suspend fun animateToThreshold() {}
+
+                override suspend fun animateToHidden() {}
+
+                override suspend fun snapTo(targetValue: Float) {
+                    distanceFractionState = targetValue
+                }
             }
 
-            override suspend fun animateToHidden() {
-            }
-
-            override suspend fun snapTo(targetValue: Float) {
-                distanceFractionState = targetValue
-            }
-        }
-
         rule.setContent {
             touchSlop = LocalViewConfiguration.current.touchSlop
-            positionalThreshold = with(LocalDensity.current) {
-                PullToRefreshDefaults.PositionalThreshold.toPx()
-            }
+            positionalThreshold =
+                with(LocalDensity.current) { PullToRefreshDefaults.PositionalThreshold.toPx() }
             PullToRefreshBox(
                 modifier = Modifier.testTag(PullRefreshTag),
                 isRefreshing = false,
                 onRefresh = { refreshCount++ },
                 state = state
             ) {
-
-                LazyColumn {
-                    items(100) {
-                        Text("item $it")
-                    }
-                }
+                LazyColumn { items(100) { Text("item $it") } }
             }
         }
 
-        pullRefreshNode.performTouchInput {
-            swipeDown(endY = positionalThreshold * 2 + touchSlop)
-        }
+        pullRefreshNode.performTouchInput { swipeDown(endY = positionalThreshold * 2 + touchSlop) }
         rule.runOnIdle {
             assertThat(state.distanceFraction).isEqualTo(1f)
             // Account for PullMultiplier.
             assertThat(refreshCount).isEqualTo(0)
         }
 
-        pullRefreshNode.performTouchInput {
-            swipeDown(endY = 3 * positionalThreshold + touchSlop)
-        }
+        pullRefreshNode.performTouchInput { swipeDown(endY = 3 * positionalThreshold + touchSlop) }
 
         rule.runOnIdle {
             assertThat(state.distanceFraction).isWithin(0.1f).of(1.5f)
@@ -220,62 +192,47 @@
         var refreshCount = 0
         var touchSlop = 0f
         var positionalThreshold = 0f
-        val state = object : PullToRefreshState {
+        val state =
+            object : PullToRefreshState {
 
-            var distanceFractionState by mutableStateOf(0f)
-            override val distanceFraction: Float
-                get() = distanceFractionState
+                var distanceFractionState by mutableStateOf(0f)
+                override val distanceFraction: Float
+                    get() = distanceFractionState
 
-            override suspend fun animateToThreshold() {
+                override suspend fun animateToThreshold() {}
+
+                override suspend fun animateToHidden() {}
+
+                override suspend fun snapTo(targetValue: Float) {
+                    distanceFractionState = targetValue
+                }
             }
 
-            override suspend fun animateToHidden() {
-            }
-
-            override suspend fun snapTo(targetValue: Float) {
-                distanceFractionState = targetValue
-            }
-        }
-
         rule.setContent {
             touchSlop = LocalViewConfiguration.current.touchSlop
-            positionalThreshold = with(LocalDensity.current) {
-                PullToRefreshDefaults.PositionalThreshold.toPx()
-            }
+            positionalThreshold =
+                with(LocalDensity.current) { PullToRefreshDefaults.PositionalThreshold.toPx() }
             PullToRefreshBox(
                 modifier = Modifier.testTag(PullRefreshTag),
                 isRefreshing = false,
                 onRefresh = { refreshCount++ },
                 state = state
             ) {
-
-                LazyColumn {
-                    items(100) {
-                        Text("item $it")
-                    }
-                }
+                LazyColumn { items(100) { Text("item $it") } }
             }
         }
-        pullRefreshNode.performTouchInput {
-            swipeDown(endY = 10 * positionalThreshold + touchSlop)
-        }
+        pullRefreshNode.performTouchInput { swipeDown(endY = 10 * positionalThreshold + touchSlop) }
 
-        rule.runOnIdle {
-            assertThat(state.distanceFraction).isEqualTo(2f)
-        }
+        rule.runOnIdle { assertThat(state.distanceFraction).isEqualTo(2f) }
     }
 
     @Test
     fun state_restoresPullRefreshState() {
         val restorationTester = StateRestorationTester(rule)
         var state: PullToRefreshState? = null
-        restorationTester.setContent {
-            state = rememberPullToRefreshState()
-        }
+        restorationTester.setContent { state = rememberPullToRefreshState() }
 
-        runBlocking {
-            state!!.snapTo(0.5f)
-        }
+        runBlocking { state!!.snapTo(0.5f) }
         state = null
         restorationTester.emulateSavedInstanceStateRestore()
         assertThat(state!!.distanceFraction).isEqualTo(0.5f)
diff --git a/compose/material3/material3/src/androidMain/kotlin/androidx/compose/material3/AndroidAlertDialog.android.kt b/compose/material3/material3/src/androidMain/kotlin/androidx/compose/material3/AndroidAlertDialog.android.kt
index 060ab2b..dc2113d 100644
--- a/compose/material3/material3/src/androidMain/kotlin/androidx/compose/material3/AndroidAlertDialog.android.kt
+++ b/compose/material3/material3/src/androidMain/kotlin/androidx/compose/material3/AndroidAlertDialog.android.kt
@@ -43,19 +43,20 @@
     textContentColor: Color,
     tonalElevation: Dp,
     properties: DialogProperties
-): Unit = AlertDialogImpl(
-    onDismissRequest = onDismissRequest,
-    confirmButton = confirmButton,
-    modifier = modifier,
-    dismissButton = dismissButton,
-    icon = icon,
-    title = title,
-    text = text,
-    shape = shape,
-    containerColor = containerColor,
-    iconContentColor = iconContentColor,
-    titleContentColor = titleContentColor,
-    textContentColor = textContentColor,
-    tonalElevation = tonalElevation,
-    properties = properties
-)
+): Unit =
+    AlertDialogImpl(
+        onDismissRequest = onDismissRequest,
+        confirmButton = confirmButton,
+        modifier = modifier,
+        dismissButton = dismissButton,
+        icon = icon,
+        title = title,
+        text = text,
+        shape = shape,
+        containerColor = containerColor,
+        iconContentColor = iconContentColor,
+        titleContentColor = titleContentColor,
+        textContentColor = textContentColor,
+        tonalElevation = tonalElevation,
+        properties = properties
+    )
diff --git a/compose/material3/material3/src/androidMain/kotlin/androidx/compose/material3/AndroidMenu.android.kt b/compose/material3/material3/src/androidMain/kotlin/androidx/compose/material3/AndroidMenu.android.kt
index 3a3b8af..1871583 100644
--- a/compose/material3/material3/src/androidMain/kotlin/androidx/compose/material3/AndroidMenu.android.kt
+++ b/compose/material3/material3/src/androidMain/kotlin/androidx/compose/material3/AndroidMenu.android.kt
@@ -59,14 +59,12 @@
     if (expandedState.currentState || expandedState.targetState) {
         val transformOriginState = remember { mutableStateOf(TransformOrigin.Center) }
         val density = LocalDensity.current
-        val popupPositionProvider = remember(offset, density) {
-            DropdownMenuPositionProvider(
-                offset,
-                density
-            ) { parentBounds, menuBounds ->
-                transformOriginState.value = calculateTransformOrigin(parentBounds, menuBounds)
+        val popupPositionProvider =
+            remember(offset, density) {
+                DropdownMenuPositionProvider(offset, density) { parentBounds, menuBounds ->
+                    transformOriginState.value = calculateTransformOrigin(parentBounds, menuBounds)
+                }
             }
-        }
 
         Popup(
             onDismissRequest = onDismissRequest,
@@ -91,24 +89,27 @@
 
 @Deprecated(
     level = DeprecationLevel.HIDDEN,
-    replaceWith = ReplaceWith(
-        expression = "DropdownMenu(\n" +
-            "    expanded = expanded,\n" +
-            "    onDismissRequest = onDismissRequest,\n" +
-            "    modifier = modifier,\n" +
-            "    offset = offset,\n" +
-            "    scrollState = scrollState,\n" +
-            "    properties = properties,\n" +
-            "    shape = MenuDefaults.shape,\n" +
-            "    containerColor = MenuDefaults.containerColor,\n" +
-            "    tonalElevation = MenuDefaults.TonalElevation,\n" +
-            "    shadowElevation = MenuDefaults.ShadowElevation,\n" +
-            "    border = null,\n" +
-            "    content = content,\n" +
-            ")",
-    ),
-    message = "Maintained for binary compatibility. Use overload with parameters for shape, " +
-        "color, elevation, and border."
+    replaceWith =
+        ReplaceWith(
+            expression =
+                "DropdownMenu(\n" +
+                    "    expanded = expanded,\n" +
+                    "    onDismissRequest = onDismissRequest,\n" +
+                    "    modifier = modifier,\n" +
+                    "    offset = offset,\n" +
+                    "    scrollState = scrollState,\n" +
+                    "    properties = properties,\n" +
+                    "    shape = MenuDefaults.shape,\n" +
+                    "    containerColor = MenuDefaults.containerColor,\n" +
+                    "    tonalElevation = MenuDefaults.TonalElevation,\n" +
+                    "    shadowElevation = MenuDefaults.ShadowElevation,\n" +
+                    "    border = null,\n" +
+                    "    content = content,\n" +
+                    ")",
+        ),
+    message =
+        "Maintained for binary compatibility. Use overload with parameters for shape, " +
+            "color, elevation, and border."
 )
 @Composable
 fun DropdownMenu(
@@ -119,28 +120,31 @@
     scrollState: ScrollState = rememberScrollState(),
     properties: PopupProperties = PopupProperties(focusable = true),
     content: @Composable ColumnScope.() -> Unit
-) = DropdownMenu(
-    expanded = expanded,
-    onDismissRequest = onDismissRequest,
-    modifier = modifier,
-    offset = offset,
-    scrollState = scrollState,
-    properties = properties,
-    shape = MenuDefaults.shape,
-    containerColor = MenuDefaults.containerColor,
-    tonalElevation = MenuDefaults.TonalElevation,
-    shadowElevation = MenuDefaults.ShadowElevation,
-    border = null,
-    content = content,
-)
+) =
+    DropdownMenu(
+        expanded = expanded,
+        onDismissRequest = onDismissRequest,
+        modifier = modifier,
+        offset = offset,
+        scrollState = scrollState,
+        properties = properties,
+        shape = MenuDefaults.shape,
+        containerColor = MenuDefaults.containerColor,
+        tonalElevation = MenuDefaults.TonalElevation,
+        shadowElevation = MenuDefaults.ShadowElevation,
+        border = null,
+        content = content,
+    )
 
 @Deprecated(
     level = DeprecationLevel.HIDDEN,
-    replaceWith = ReplaceWith(
-        expression = "DropdownMenu(expanded,onDismissRequest, modifier, offset, " +
-            "rememberScrollState(), properties, content)",
-        "androidx.compose.foundation.rememberScrollState"
-    ),
+    replaceWith =
+        ReplaceWith(
+            expression =
+                "DropdownMenu(expanded,onDismissRequest, modifier, offset, " +
+                    "rememberScrollState(), properties, content)",
+            "androidx.compose.foundation.rememberScrollState"
+        ),
     message = "Replaced by a DropdownMenu function with a ScrollState parameter"
 )
 @Composable
@@ -151,15 +155,16 @@
     offset: DpOffset = DpOffset(0.dp, 0.dp),
     properties: PopupProperties = PopupProperties(focusable = true),
     content: @Composable ColumnScope.() -> Unit
-) = DropdownMenu(
-    expanded = expanded,
-    onDismissRequest = onDismissRequest,
-    modifier = modifier,
-    offset = offset,
-    scrollState = rememberScrollState(),
-    properties = properties,
-    content = content
-)
+) =
+    DropdownMenu(
+        expanded = expanded,
+        onDismissRequest = onDismissRequest,
+        modifier = modifier,
+        offset = offset,
+        scrollState = rememberScrollState(),
+        properties = properties,
+        content = content
+    )
 
 @Composable
 actual fun DropdownMenuItem(
@@ -186,5 +191,4 @@
     )
 }
 
-internal actual val DefaultMenuProperties =
-    PopupProperties(focusable = true)
+internal actual val DefaultMenuProperties = PopupProperties(focusable = true)
diff --git a/compose/material3/material3/src/androidMain/kotlin/androidx/compose/material3/CalendarLocale.android.kt b/compose/material3/material3/src/androidMain/kotlin/androidx/compose/material3/CalendarLocale.android.kt
index abea915..313aefc 100644
--- a/compose/material3/material3/src/androidMain/kotlin/androidx/compose/material3/CalendarLocale.android.kt
+++ b/compose/material3/material3/src/androidMain/kotlin/androidx/compose/material3/CalendarLocale.android.kt
@@ -24,9 +24,7 @@
 import androidx.core.os.ConfigurationCompat
 import java.util.Locale
 
-/**
- * Returns the default [CalendarLocale].
- */
+/** Returns the default [CalendarLocale]. */
 @Composable
 @ReadOnlyComposable
 @OptIn(ExperimentalMaterial3Api::class)
diff --git a/compose/material3/material3/src/androidMain/kotlin/androidx/compose/material3/DatePickerDialog.android.kt b/compose/material3/material3/src/androidMain/kotlin/androidx/compose/material3/DatePickerDialog.android.kt
index 5e40d8b..99ed50a 100644
--- a/compose/material3/material3/src/androidMain/kotlin/androidx/compose/material3/DatePickerDialog.android.kt
+++ b/compose/material3/material3/src/androidMain/kotlin/androidx/compose/material3/DatePickerDialog.android.kt
@@ -37,26 +37,28 @@
 import androidx.compose.ui.window.DialogProperties
 
 /**
- * <a href="https://m3.material.io/components/date-pickers/overview" class="external" target="_blank">Material Design date picker dialog</a>.
+ * <a href="https://m3.material.io/components/date-pickers/overview" class="external"
+ * target="_blank">Material Design date picker dialog</a>.
  *
  * A dialog for displaying a [DatePicker]. Date pickers let people select a date.
  *
  * A sample for displaying a [DatePicker] in a dialog:
+ *
  * @sample androidx.compose.material3.samples.DatePickerDialogSample
  *
- * @param onDismissRequest called when the user tries to dismiss the Dialog by clicking outside
- * or pressing the back button. This is not called when the dismiss button is clicked.
+ * @param onDismissRequest called when the user tries to dismiss the Dialog by clicking outside or
+ *   pressing the back button. This is not called when the dismiss button is clicked.
  * @param confirmButton button which is meant to confirm a proposed action, thus resolving what
- * triggered the dialog. The dialog does not set up any events for this button, nor does it control
- * its enablement, so those need to be set up by the caller.
+ *   triggered the dialog. The dialog does not set up any events for this button, nor does it
+ *   control its enablement, so those need to be set up by the caller.
  * @param modifier the [Modifier] to be applied to this dialog's content.
  * @param dismissButton button which is meant to dismiss the dialog. The dialog does not set up any
- * events for this button so they need to be set up by the caller.
+ *   events for this button so they need to be set up by the caller.
  * @param shape defines the dialog's surface shape as well its shadow
  * @param tonalElevation when [DatePickerColors.containerColor] is [ColorScheme.surface], a higher
- * the elevation will result in a darker color in light theme and lighter color in dark theme
+ *   the elevation will result in a darker color in light theme and lighter color in dark theme
  * @param colors [DatePickerColors] that will be used to resolve the colors used for this date
- * picker in different states. See [DatePickerDefaults.colors].
+ *   picker in different states. See [DatePickerDefaults.colors].
  * @param properties typically platform specific properties to further configure the dialog
  * @param content the content of the dialog (i.e. a [DatePicker], for example)
  */
@@ -79,9 +81,9 @@
         properties = properties
     ) {
         Surface(
-            modifier = Modifier
-                .requiredWidth(DatePickerModalTokens.ContainerWidth)
-                .heightIn(max = DatePickerModalTokens.ContainerHeight),
+            modifier =
+                Modifier.requiredWidth(DatePickerModalTokens.ContainerWidth)
+                    .heightIn(max = DatePickerModalTokens.ContainerHeight),
             shape = shape,
             color = colors.containerColor,
             tonalElevation = tonalElevation,
@@ -92,19 +94,12 @@
                 // or when nesting a DateRangePicker.
                 // Fill is false to support collapsing the dialog's height when switching to input
                 // mode.
-                Box(Modifier.weight(1f, fill = false)) {
-                    this@Column.content()
-                }
+                Box(Modifier.weight(1f, fill = false)) { this@Column.content() }
                 // Buttons
-                Box(
-                    modifier = Modifier
-                        .align(Alignment.End)
-                        .padding(DialogButtonsPadding)
-                ) {
+                Box(modifier = Modifier.align(Alignment.End).padding(DialogButtonsPadding)) {
                     ProvideContentColorTextStyle(
                         contentColor = DialogTokens.ActionLabelTextColor.value,
-                        textStyle =
-                        DialogTokens.ActionLabelTextFont.value
+                        textStyle = DialogTokens.ActionLabelTextFont.value
                     ) {
                         AlertDialogFlowRow(
                             mainAxisSpacing = DialogButtonsMainAxisSpacing,
diff --git a/compose/material3/material3/src/androidMain/kotlin/androidx/compose/material3/DynamicTonalPalette.android.kt b/compose/material3/material3/src/androidMain/kotlin/androidx/compose/material3/DynamicTonalPalette.android.kt
index 934be1d..8fb01df 100644
--- a/compose/material3/material3/src/androidMain/kotlin/androidx/compose/material3/DynamicTonalPalette.android.kt
+++ b/compose/material3/material3/src/androidMain/kotlin/androidx/compose/material3/DynamicTonalPalette.android.kt
@@ -32,134 +32,170 @@
 
 /** Dynamic colors in Material. */
 @RequiresApi(31)
-internal fun dynamicTonalPalette(context: Context): TonalPalette = TonalPalette(
-    // The neutral tonal range from the generated dynamic color palette.
-    neutral100 = ColorResourceHelper.getColor(context, android.R.color.system_neutral1_0),
-    neutral99 = ColorResourceHelper.getColor(context, android.R.color.system_neutral1_10),
-    neutral98 = ColorResourceHelper.getColor(context, android.R.color.system_neutral1_600)
-        .setLuminance(98f),
-    neutral96 = ColorResourceHelper.getColor(context, android.R.color.system_neutral1_600)
-        .setLuminance(96f),
-    neutral95 = ColorResourceHelper.getColor(context, android.R.color.system_neutral1_50),
-    neutral94 = ColorResourceHelper.getColor(context, android.R.color.system_neutral1_600)
-        .setLuminance(94f),
-    neutral92 = ColorResourceHelper.getColor(context, android.R.color.system_neutral1_600)
-        .setLuminance(92f),
-    neutral90 = ColorResourceHelper.getColor(context, android.R.color.system_neutral1_100),
-    neutral87 = ColorResourceHelper.getColor(context, android.R.color.system_neutral1_600)
-        .setLuminance(87f),
-    neutral80 = ColorResourceHelper.getColor(context, android.R.color.system_neutral1_200),
-    neutral70 = ColorResourceHelper.getColor(context, android.R.color.system_neutral1_300),
-    neutral60 = ColorResourceHelper.getColor(context, android.R.color.system_neutral1_400),
-    neutral50 = ColorResourceHelper.getColor(context, android.R.color.system_neutral1_500),
-    neutral40 = ColorResourceHelper.getColor(context, android.R.color.system_neutral1_600),
-    neutral30 = ColorResourceHelper.getColor(context, android.R.color.system_neutral1_700),
-    neutral24 = ColorResourceHelper.getColor(context, android.R.color.system_neutral1_600)
-        .setLuminance(24f),
-    neutral22 = ColorResourceHelper.getColor(context, android.R.color.system_neutral1_600)
-        .setLuminance(22f),
-    neutral20 = ColorResourceHelper.getColor(context, android.R.color.system_neutral1_800),
-    neutral17 = ColorResourceHelper.getColor(context, android.R.color.system_neutral1_600)
-        .setLuminance(17f),
-    neutral12 = ColorResourceHelper.getColor(context, android.R.color.system_neutral1_600)
-        .setLuminance(12f),
-    neutral10 = ColorResourceHelper.getColor(context, android.R.color.system_neutral1_900),
-    neutral6 = ColorResourceHelper.getColor(context, android.R.color.system_neutral1_600)
-        .setLuminance(6f),
-    neutral4 = ColorResourceHelper.getColor(context, android.R.color.system_neutral1_600)
-        .setLuminance(4f),
-    neutral0 = ColorResourceHelper.getColor(context, android.R.color.system_neutral1_1000),
+internal fun dynamicTonalPalette(context: Context): TonalPalette =
+    TonalPalette(
+        // The neutral tonal range from the generated dynamic color palette.
+        neutral100 = ColorResourceHelper.getColor(context, android.R.color.system_neutral1_0),
+        neutral99 = ColorResourceHelper.getColor(context, android.R.color.system_neutral1_10),
+        neutral98 =
+            ColorResourceHelper.getColor(context, android.R.color.system_neutral1_600)
+                .setLuminance(98f),
+        neutral96 =
+            ColorResourceHelper.getColor(context, android.R.color.system_neutral1_600)
+                .setLuminance(96f),
+        neutral95 = ColorResourceHelper.getColor(context, android.R.color.system_neutral1_50),
+        neutral94 =
+            ColorResourceHelper.getColor(context, android.R.color.system_neutral1_600)
+                .setLuminance(94f),
+        neutral92 =
+            ColorResourceHelper.getColor(context, android.R.color.system_neutral1_600)
+                .setLuminance(92f),
+        neutral90 = ColorResourceHelper.getColor(context, android.R.color.system_neutral1_100),
+        neutral87 =
+            ColorResourceHelper.getColor(context, android.R.color.system_neutral1_600)
+                .setLuminance(87f),
+        neutral80 = ColorResourceHelper.getColor(context, android.R.color.system_neutral1_200),
+        neutral70 = ColorResourceHelper.getColor(context, android.R.color.system_neutral1_300),
+        neutral60 = ColorResourceHelper.getColor(context, android.R.color.system_neutral1_400),
+        neutral50 = ColorResourceHelper.getColor(context, android.R.color.system_neutral1_500),
+        neutral40 = ColorResourceHelper.getColor(context, android.R.color.system_neutral1_600),
+        neutral30 = ColorResourceHelper.getColor(context, android.R.color.system_neutral1_700),
+        neutral24 =
+            ColorResourceHelper.getColor(context, android.R.color.system_neutral1_600)
+                .setLuminance(24f),
+        neutral22 =
+            ColorResourceHelper.getColor(context, android.R.color.system_neutral1_600)
+                .setLuminance(22f),
+        neutral20 = ColorResourceHelper.getColor(context, android.R.color.system_neutral1_800),
+        neutral17 =
+            ColorResourceHelper.getColor(context, android.R.color.system_neutral1_600)
+                .setLuminance(17f),
+        neutral12 =
+            ColorResourceHelper.getColor(context, android.R.color.system_neutral1_600)
+                .setLuminance(12f),
+        neutral10 = ColorResourceHelper.getColor(context, android.R.color.system_neutral1_900),
+        neutral6 =
+            ColorResourceHelper.getColor(context, android.R.color.system_neutral1_600)
+                .setLuminance(6f),
+        neutral4 =
+            ColorResourceHelper.getColor(context, android.R.color.system_neutral1_600)
+                .setLuminance(4f),
+        neutral0 = ColorResourceHelper.getColor(context, android.R.color.system_neutral1_1000),
 
-    // The neutral variant tonal range, sometimes called "neutral 2",  from the
-    // generated dynamic color palette.
-    neutralVariant100 = ColorResourceHelper.getColor(context, android.R.color.system_neutral2_0),
-    neutralVariant99 = ColorResourceHelper.getColor(context, android.R.color.system_neutral2_10),
-    neutralVariant98 = ColorResourceHelper.getColor(context, android.R.color.system_neutral2_600)
-        .setLuminance(98f),
-    neutralVariant96 = ColorResourceHelper.getColor(context, android.R.color.system_neutral2_600)
-        .setLuminance(96f),
-    neutralVariant95 = ColorResourceHelper.getColor(context, android.R.color.system_neutral2_50),
-    neutralVariant94 = ColorResourceHelper.getColor(context, android.R.color.system_neutral2_600)
-        .setLuminance(94f),
-    neutralVariant92 = ColorResourceHelper.getColor(context, android.R.color.system_neutral2_600)
-        .setLuminance(92f),
-    neutralVariant90 = ColorResourceHelper.getColor(context, android.R.color.system_neutral2_100),
-    neutralVariant87 = ColorResourceHelper.getColor(context, android.R.color.system_neutral2_600)
-        .setLuminance(87f),
-    neutralVariant80 = ColorResourceHelper.getColor(context, android.R.color.system_neutral2_200),
-    neutralVariant70 = ColorResourceHelper.getColor(context, android.R.color.system_neutral2_300),
-    neutralVariant60 = ColorResourceHelper.getColor(context, android.R.color.system_neutral2_400),
-    neutralVariant50 = ColorResourceHelper.getColor(context, android.R.color.system_neutral2_500),
-    neutralVariant40 = ColorResourceHelper.getColor(context, android.R.color.system_neutral2_600),
-    neutralVariant30 = ColorResourceHelper.getColor(context, android.R.color.system_neutral2_700),
-    neutralVariant24 = ColorResourceHelper.getColor(context, android.R.color.system_neutral2_600)
-        .setLuminance(24f),
-    neutralVariant22 = ColorResourceHelper.getColor(context, android.R.color.system_neutral2_600)
-        .setLuminance(22f),
-    neutralVariant20 = ColorResourceHelper.getColor(context, android.R.color.system_neutral2_800),
-    neutralVariant17 = ColorResourceHelper.getColor(context, android.R.color.system_neutral2_600)
-        .setLuminance(17f),
-    neutralVariant12 = ColorResourceHelper.getColor(context, android.R.color.system_neutral2_600)
-        .setLuminance(12f),
-    neutralVariant10 = ColorResourceHelper.getColor(context, android.R.color.system_neutral2_900),
-    neutralVariant6 = ColorResourceHelper.getColor(context, android.R.color.system_neutral2_600)
-        .setLuminance(6f),
-    neutralVariant4 = ColorResourceHelper.getColor(context, android.R.color.system_neutral2_600)
-        .setLuminance(4f),
-    neutralVariant0 = ColorResourceHelper.getColor(context, android.R.color.system_neutral2_1000),
+        // The neutral variant tonal range, sometimes called "neutral 2",  from the
+        // generated dynamic color palette.
+        neutralVariant100 =
+            ColorResourceHelper.getColor(context, android.R.color.system_neutral2_0),
+        neutralVariant99 =
+            ColorResourceHelper.getColor(context, android.R.color.system_neutral2_10),
+        neutralVariant98 =
+            ColorResourceHelper.getColor(context, android.R.color.system_neutral2_600)
+                .setLuminance(98f),
+        neutralVariant96 =
+            ColorResourceHelper.getColor(context, android.R.color.system_neutral2_600)
+                .setLuminance(96f),
+        neutralVariant95 =
+            ColorResourceHelper.getColor(context, android.R.color.system_neutral2_50),
+        neutralVariant94 =
+            ColorResourceHelper.getColor(context, android.R.color.system_neutral2_600)
+                .setLuminance(94f),
+        neutralVariant92 =
+            ColorResourceHelper.getColor(context, android.R.color.system_neutral2_600)
+                .setLuminance(92f),
+        neutralVariant90 =
+            ColorResourceHelper.getColor(context, android.R.color.system_neutral2_100),
+        neutralVariant87 =
+            ColorResourceHelper.getColor(context, android.R.color.system_neutral2_600)
+                .setLuminance(87f),
+        neutralVariant80 =
+            ColorResourceHelper.getColor(context, android.R.color.system_neutral2_200),
+        neutralVariant70 =
+            ColorResourceHelper.getColor(context, android.R.color.system_neutral2_300),
+        neutralVariant60 =
+            ColorResourceHelper.getColor(context, android.R.color.system_neutral2_400),
+        neutralVariant50 =
+            ColorResourceHelper.getColor(context, android.R.color.system_neutral2_500),
+        neutralVariant40 =
+            ColorResourceHelper.getColor(context, android.R.color.system_neutral2_600),
+        neutralVariant30 =
+            ColorResourceHelper.getColor(context, android.R.color.system_neutral2_700),
+        neutralVariant24 =
+            ColorResourceHelper.getColor(context, android.R.color.system_neutral2_600)
+                .setLuminance(24f),
+        neutralVariant22 =
+            ColorResourceHelper.getColor(context, android.R.color.system_neutral2_600)
+                .setLuminance(22f),
+        neutralVariant20 =
+            ColorResourceHelper.getColor(context, android.R.color.system_neutral2_800),
+        neutralVariant17 =
+            ColorResourceHelper.getColor(context, android.R.color.system_neutral2_600)
+                .setLuminance(17f),
+        neutralVariant12 =
+            ColorResourceHelper.getColor(context, android.R.color.system_neutral2_600)
+                .setLuminance(12f),
+        neutralVariant10 =
+            ColorResourceHelper.getColor(context, android.R.color.system_neutral2_900),
+        neutralVariant6 =
+            ColorResourceHelper.getColor(context, android.R.color.system_neutral2_600)
+                .setLuminance(6f),
+        neutralVariant4 =
+            ColorResourceHelper.getColor(context, android.R.color.system_neutral2_600)
+                .setLuminance(4f),
+        neutralVariant0 =
+            ColorResourceHelper.getColor(context, android.R.color.system_neutral2_1000),
 
-    // The primary tonal range from the generated dynamic color palette.
-    primary100 = ColorResourceHelper.getColor(context, android.R.color.system_accent1_0),
-    primary99 = ColorResourceHelper.getColor(context, android.R.color.system_accent1_10),
-    primary95 = ColorResourceHelper.getColor(context, android.R.color.system_accent1_50),
-    primary90 = ColorResourceHelper.getColor(context, android.R.color.system_accent1_100),
-    primary80 = ColorResourceHelper.getColor(context, android.R.color.system_accent1_200),
-    primary70 = ColorResourceHelper.getColor(context, android.R.color.system_accent1_300),
-    primary60 = ColorResourceHelper.getColor(context, android.R.color.system_accent1_400),
-    primary50 = ColorResourceHelper.getColor(context, android.R.color.system_accent1_500),
-    primary40 = ColorResourceHelper.getColor(context, android.R.color.system_accent1_600),
-    primary30 = ColorResourceHelper.getColor(context, android.R.color.system_accent1_700),
-    primary20 = ColorResourceHelper.getColor(context, android.R.color.system_accent1_800),
-    primary10 = ColorResourceHelper.getColor(context, android.R.color.system_accent1_900),
-    primary0 = ColorResourceHelper.getColor(context, android.R.color.system_accent1_1000),
+        // The primary tonal range from the generated dynamic color palette.
+        primary100 = ColorResourceHelper.getColor(context, android.R.color.system_accent1_0),
+        primary99 = ColorResourceHelper.getColor(context, android.R.color.system_accent1_10),
+        primary95 = ColorResourceHelper.getColor(context, android.R.color.system_accent1_50),
+        primary90 = ColorResourceHelper.getColor(context, android.R.color.system_accent1_100),
+        primary80 = ColorResourceHelper.getColor(context, android.R.color.system_accent1_200),
+        primary70 = ColorResourceHelper.getColor(context, android.R.color.system_accent1_300),
+        primary60 = ColorResourceHelper.getColor(context, android.R.color.system_accent1_400),
+        primary50 = ColorResourceHelper.getColor(context, android.R.color.system_accent1_500),
+        primary40 = ColorResourceHelper.getColor(context, android.R.color.system_accent1_600),
+        primary30 = ColorResourceHelper.getColor(context, android.R.color.system_accent1_700),
+        primary20 = ColorResourceHelper.getColor(context, android.R.color.system_accent1_800),
+        primary10 = ColorResourceHelper.getColor(context, android.R.color.system_accent1_900),
+        primary0 = ColorResourceHelper.getColor(context, android.R.color.system_accent1_1000),
 
-    // The secondary tonal range from the generated dynamic color palette.
-    secondary100 = ColorResourceHelper.getColor(context, android.R.color.system_accent2_0),
-    secondary99 = ColorResourceHelper.getColor(context, android.R.color.system_accent2_10),
-    secondary95 = ColorResourceHelper.getColor(context, android.R.color.system_accent2_50),
-    secondary90 = ColorResourceHelper.getColor(context, android.R.color.system_accent2_100),
-    secondary80 = ColorResourceHelper.getColor(context, android.R.color.system_accent2_200),
-    secondary70 = ColorResourceHelper.getColor(context, android.R.color.system_accent2_300),
-    secondary60 = ColorResourceHelper.getColor(context, android.R.color.system_accent2_400),
-    secondary50 = ColorResourceHelper.getColor(context, android.R.color.system_accent2_500),
-    secondary40 = ColorResourceHelper.getColor(context, android.R.color.system_accent2_600),
-    secondary30 = ColorResourceHelper.getColor(context, android.R.color.system_accent2_700),
-    secondary20 = ColorResourceHelper.getColor(context, android.R.color.system_accent2_800),
-    secondary10 = ColorResourceHelper.getColor(context, android.R.color.system_accent2_900),
-    secondary0 = ColorResourceHelper.getColor(context, android.R.color.system_accent2_1000),
+        // The secondary tonal range from the generated dynamic color palette.
+        secondary100 = ColorResourceHelper.getColor(context, android.R.color.system_accent2_0),
+        secondary99 = ColorResourceHelper.getColor(context, android.R.color.system_accent2_10),
+        secondary95 = ColorResourceHelper.getColor(context, android.R.color.system_accent2_50),
+        secondary90 = ColorResourceHelper.getColor(context, android.R.color.system_accent2_100),
+        secondary80 = ColorResourceHelper.getColor(context, android.R.color.system_accent2_200),
+        secondary70 = ColorResourceHelper.getColor(context, android.R.color.system_accent2_300),
+        secondary60 = ColorResourceHelper.getColor(context, android.R.color.system_accent2_400),
+        secondary50 = ColorResourceHelper.getColor(context, android.R.color.system_accent2_500),
+        secondary40 = ColorResourceHelper.getColor(context, android.R.color.system_accent2_600),
+        secondary30 = ColorResourceHelper.getColor(context, android.R.color.system_accent2_700),
+        secondary20 = ColorResourceHelper.getColor(context, android.R.color.system_accent2_800),
+        secondary10 = ColorResourceHelper.getColor(context, android.R.color.system_accent2_900),
+        secondary0 = ColorResourceHelper.getColor(context, android.R.color.system_accent2_1000),
 
-    // The tertiary tonal range from the generated dynamic color palette.
-    tertiary100 = ColorResourceHelper.getColor(context, android.R.color.system_accent3_0),
-    tertiary99 = ColorResourceHelper.getColor(context, android.R.color.system_accent3_10),
-    tertiary95 = ColorResourceHelper.getColor(context, android.R.color.system_accent3_50),
-    tertiary90 = ColorResourceHelper.getColor(context, android.R.color.system_accent3_100),
-    tertiary80 = ColorResourceHelper.getColor(context, android.R.color.system_accent3_200),
-    tertiary70 = ColorResourceHelper.getColor(context, android.R.color.system_accent3_300),
-    tertiary60 = ColorResourceHelper.getColor(context, android.R.color.system_accent3_400),
-    tertiary50 = ColorResourceHelper.getColor(context, android.R.color.system_accent3_500),
-    tertiary40 = ColorResourceHelper.getColor(context, android.R.color.system_accent3_600),
-    tertiary30 = ColorResourceHelper.getColor(context, android.R.color.system_accent3_700),
-    tertiary20 = ColorResourceHelper.getColor(context, android.R.color.system_accent3_800),
-    tertiary10 = ColorResourceHelper.getColor(context, android.R.color.system_accent3_900),
-    tertiary0 = ColorResourceHelper.getColor(context, android.R.color.system_accent3_1000),
-)
+        // The tertiary tonal range from the generated dynamic color palette.
+        tertiary100 = ColorResourceHelper.getColor(context, android.R.color.system_accent3_0),
+        tertiary99 = ColorResourceHelper.getColor(context, android.R.color.system_accent3_10),
+        tertiary95 = ColorResourceHelper.getColor(context, android.R.color.system_accent3_50),
+        tertiary90 = ColorResourceHelper.getColor(context, android.R.color.system_accent3_100),
+        tertiary80 = ColorResourceHelper.getColor(context, android.R.color.system_accent3_200),
+        tertiary70 = ColorResourceHelper.getColor(context, android.R.color.system_accent3_300),
+        tertiary60 = ColorResourceHelper.getColor(context, android.R.color.system_accent3_400),
+        tertiary50 = ColorResourceHelper.getColor(context, android.R.color.system_accent3_500),
+        tertiary40 = ColorResourceHelper.getColor(context, android.R.color.system_accent3_600),
+        tertiary30 = ColorResourceHelper.getColor(context, android.R.color.system_accent3_700),
+        tertiary20 = ColorResourceHelper.getColor(context, android.R.color.system_accent3_800),
+        tertiary10 = ColorResourceHelper.getColor(context, android.R.color.system_accent3_900),
+        tertiary0 = ColorResourceHelper.getColor(context, android.R.color.system_accent3_1000),
+    )
 
 /**
  * Creates a light dynamic color scheme.
  *
  * Use this function to create a color scheme based off the system wallpaper. If the developer
- * changes the wallpaper this color scheme will change accordingly. This dynamic scheme is a
- * light theme variant.
+ * changes the wallpaper this color scheme will change accordingly. This dynamic scheme is a light
+ * theme variant.
  *
  * @param context The context required to get system resource data.
  */
@@ -212,28 +248,26 @@
  *
  * @param newLuminance 0 <= newLuminance <= 100; invalid values are corrected.
  */
-internal fun Color.setLuminance(
-    @FloatRange(from = 0.0, to = 100.0)
-    newLuminance: Float
-): Color {
+internal fun Color.setLuminance(@FloatRange(from = 0.0, to = 100.0) newLuminance: Float): Color {
     if ((newLuminance < 0.0001) or (newLuminance > 99.9999)) {
         // aRGBFromLstar() from monet ColorUtil.java
         val y = 100 * labInvf((newLuminance + 16) / 116)
         val component = delinearized(y)
         return Color(
-            /* red = */component,
-            /* green = */component,
-            /* blue = */component,
+            /* red = */ component,
+            /* green = */ component,
+            /* blue = */ component,
         )
     }
 
     val sLAB = this.convert(ColorSpaces.CieLab)
     return Color(
-        /* luminance = */newLuminance,
-        /* a = */sLAB.component2(),
-        /* b = */sLAB.component3(),
-        colorSpace = ColorSpaces.CieLab
-    ).convert(ColorSpaces.Srgb)
+            /* luminance = */ newLuminance,
+            /* a = */ sLAB.component2(),
+            /* b = */ sLAB.component3(),
+            colorSpace = ColorSpaces.CieLab
+        )
+        .convert(ColorSpaces.Srgb)
 }
 
 /** Helper method from monet ColorUtils.java */
@@ -258,200 +292,238 @@
  */
 private fun delinearized(rgbComponent: Float): Int {
     val normalized = rgbComponent / 100
-    val delinearized = if (normalized <= 0.0031308) {
-        normalized * 12.92
-    } else {
-        1.055 * normalized.toDouble().pow(1.0 / 2.4) - 0.055
-    }
+    val delinearized =
+        if (normalized <= 0.0031308) {
+            normalized * 12.92
+        } else {
+            1.055 * normalized.toDouble().pow(1.0 / 2.4) - 0.055
+        }
     return MathUtils.clamp((delinearized * 255.0).roundToInt(), 0, 255)
 }
 
 @RequiresApi(31)
-internal fun dynamicLightColorScheme31(tonalPalette: TonalPalette) = lightColorScheme(
-    primary = tonalPalette.primary40,
-    onPrimary = tonalPalette.primary100,
-    primaryContainer = tonalPalette.primary90,
-    onPrimaryContainer = tonalPalette.primary10,
-    inversePrimary = tonalPalette.primary80,
-    secondary = tonalPalette.secondary40,
-    onSecondary = tonalPalette.secondary100,
-    secondaryContainer = tonalPalette.secondary90,
-    onSecondaryContainer = tonalPalette.secondary10,
-    tertiary = tonalPalette.tertiary40,
-    onTertiary = tonalPalette.tertiary100,
-    tertiaryContainer = tonalPalette.tertiary90,
-    onTertiaryContainer = tonalPalette.tertiary10,
-    background = tonalPalette.neutralVariant98,
-    onBackground = tonalPalette.neutralVariant10,
-    surface = tonalPalette.neutralVariant98,
-    onSurface = tonalPalette.neutralVariant10,
-    surfaceVariant = tonalPalette.neutralVariant90,
-    onSurfaceVariant = tonalPalette.neutralVariant30,
-    inverseSurface = tonalPalette.neutralVariant20,
-    inverseOnSurface = tonalPalette.neutralVariant95,
-    outline = tonalPalette.neutralVariant50,
-    outlineVariant = tonalPalette.neutralVariant80,
-    scrim = tonalPalette.neutralVariant0,
-    surfaceBright = tonalPalette.neutralVariant98,
-    surfaceDim = tonalPalette.neutralVariant87,
-    surfaceContainer = tonalPalette.neutralVariant94,
-    surfaceContainerHigh = tonalPalette.neutralVariant92,
-    surfaceContainerHighest = tonalPalette.neutralVariant90,
-    surfaceContainerLow = tonalPalette.neutralVariant96,
-    surfaceContainerLowest = tonalPalette.neutralVariant100,
-    surfaceTint = tonalPalette.primary40,
-)
+internal fun dynamicLightColorScheme31(tonalPalette: TonalPalette) =
+    lightColorScheme(
+        primary = tonalPalette.primary40,
+        onPrimary = tonalPalette.primary100,
+        primaryContainer = tonalPalette.primary90,
+        onPrimaryContainer = tonalPalette.primary10,
+        inversePrimary = tonalPalette.primary80,
+        secondary = tonalPalette.secondary40,
+        onSecondary = tonalPalette.secondary100,
+        secondaryContainer = tonalPalette.secondary90,
+        onSecondaryContainer = tonalPalette.secondary10,
+        tertiary = tonalPalette.tertiary40,
+        onTertiary = tonalPalette.tertiary100,
+        tertiaryContainer = tonalPalette.tertiary90,
+        onTertiaryContainer = tonalPalette.tertiary10,
+        background = tonalPalette.neutralVariant98,
+        onBackground = tonalPalette.neutralVariant10,
+        surface = tonalPalette.neutralVariant98,
+        onSurface = tonalPalette.neutralVariant10,
+        surfaceVariant = tonalPalette.neutralVariant90,
+        onSurfaceVariant = tonalPalette.neutralVariant30,
+        inverseSurface = tonalPalette.neutralVariant20,
+        inverseOnSurface = tonalPalette.neutralVariant95,
+        outline = tonalPalette.neutralVariant50,
+        outlineVariant = tonalPalette.neutralVariant80,
+        scrim = tonalPalette.neutralVariant0,
+        surfaceBright = tonalPalette.neutralVariant98,
+        surfaceDim = tonalPalette.neutralVariant87,
+        surfaceContainer = tonalPalette.neutralVariant94,
+        surfaceContainerHigh = tonalPalette.neutralVariant92,
+        surfaceContainerHighest = tonalPalette.neutralVariant90,
+        surfaceContainerLow = tonalPalette.neutralVariant96,
+        surfaceContainerLowest = tonalPalette.neutralVariant100,
+        surfaceTint = tonalPalette.primary40,
+    )
 
 @RequiresApi(34)
-internal fun dynamicLightColorScheme34(context: Context) = lightColorScheme(
-    primary = ColorResourceHelper.getColor(context, android.R.color.system_primary_light),
-    onPrimary = ColorResourceHelper.getColor(context, android.R.color.system_on_primary_light),
-    primaryContainer =
-        ColorResourceHelper.getColor(context, android.R.color.system_primary_container_light),
-    onPrimaryContainer =
-        ColorResourceHelper.getColor(context, android.R.color.system_on_primary_container_light),
-    inversePrimary = ColorResourceHelper.getColor(context, android.R.color.system_primary_dark),
-    secondary = ColorResourceHelper.getColor(context, android.R.color.system_secondary_light),
-    onSecondary = ColorResourceHelper.getColor(context, android.R.color.system_on_secondary_light),
-    secondaryContainer =
-        ColorResourceHelper.getColor(context, android.R.color.system_secondary_container_light),
-    onSecondaryContainer =
-        ColorResourceHelper.getColor(context, android.R.color.system_on_secondary_container_light),
-    tertiary = ColorResourceHelper.getColor(context, android.R.color.system_tertiary_light),
-    onTertiary = ColorResourceHelper.getColor(context, android.R.color.system_on_tertiary_light),
-    tertiaryContainer =
-        ColorResourceHelper.getColor(context, android.R.color.system_tertiary_container_light),
-    onTertiaryContainer =
-        ColorResourceHelper.getColor(context, android.R.color.system_on_tertiary_container_light),
-    background = ColorResourceHelper.getColor(context, android.R.color.system_background_light),
-    onBackground =
-        ColorResourceHelper.getColor(context, android.R.color.system_on_background_light),
-    surface = ColorResourceHelper.getColor(context, android.R.color.system_surface_light),
-    onSurface = ColorResourceHelper.getColor(context, android.R.color.system_on_surface_light),
-    surfaceVariant =
-        ColorResourceHelper.getColor(context, android.R.color.system_surface_variant_light),
-    onSurfaceVariant =
-        ColorResourceHelper.getColor(context, android.R.color.system_on_surface_variant_light),
-    inverseSurface = ColorResourceHelper.getColor(context, android.R.color.system_surface_dark),
-    inverseOnSurface =
-        ColorResourceHelper.getColor(context, android.R.color.system_on_surface_dark),
-    outline = ColorResourceHelper.getColor(context, android.R.color.system_outline_light),
-    outlineVariant =
-        ColorResourceHelper.getColor(context, android.R.color.system_outline_variant_light),
-    // scrim
-    surfaceBright =
-        ColorResourceHelper.getColor(context, android.R.color.system_surface_bright_light),
-    surfaceDim =
-        ColorResourceHelper.getColor(context, android.R.color.system_surface_dim_light),
-    surfaceContainer =
-        ColorResourceHelper.getColor(context, android.R.color.system_surface_container_light),
-    surfaceContainerHigh =
-        ColorResourceHelper.getColor(context, android.R.color.system_surface_container_high_light),
-    surfaceContainerHighest =
-        ColorResourceHelper.getColor(
-            context,
-            android.R.color.system_surface_container_highest_light
-        ),
-    surfaceContainerLow =
-        ColorResourceHelper.getColor(context, android.R.color.system_surface_container_low_light),
-    surfaceContainerLowest =
-        ColorResourceHelper.getColor(
-            context,
-            android.R.color.system_surface_container_lowest_light
-        ),
-    surfaceTint = ColorResourceHelper.getColor(context, android.R.color.system_primary_light),
-)
+internal fun dynamicLightColorScheme34(context: Context) =
+    lightColorScheme(
+        primary = ColorResourceHelper.getColor(context, android.R.color.system_primary_light),
+        onPrimary = ColorResourceHelper.getColor(context, android.R.color.system_on_primary_light),
+        primaryContainer =
+            ColorResourceHelper.getColor(context, android.R.color.system_primary_container_light),
+        onPrimaryContainer =
+            ColorResourceHelper.getColor(
+                context,
+                android.R.color.system_on_primary_container_light
+            ),
+        inversePrimary = ColorResourceHelper.getColor(context, android.R.color.system_primary_dark),
+        secondary = ColorResourceHelper.getColor(context, android.R.color.system_secondary_light),
+        onSecondary =
+            ColorResourceHelper.getColor(context, android.R.color.system_on_secondary_light),
+        secondaryContainer =
+            ColorResourceHelper.getColor(context, android.R.color.system_secondary_container_light),
+        onSecondaryContainer =
+            ColorResourceHelper.getColor(
+                context,
+                android.R.color.system_on_secondary_container_light
+            ),
+        tertiary = ColorResourceHelper.getColor(context, android.R.color.system_tertiary_light),
+        onTertiary =
+            ColorResourceHelper.getColor(context, android.R.color.system_on_tertiary_light),
+        tertiaryContainer =
+            ColorResourceHelper.getColor(context, android.R.color.system_tertiary_container_light),
+        onTertiaryContainer =
+            ColorResourceHelper.getColor(
+                context,
+                android.R.color.system_on_tertiary_container_light
+            ),
+        background = ColorResourceHelper.getColor(context, android.R.color.system_background_light),
+        onBackground =
+            ColorResourceHelper.getColor(context, android.R.color.system_on_background_light),
+        surface = ColorResourceHelper.getColor(context, android.R.color.system_surface_light),
+        onSurface = ColorResourceHelper.getColor(context, android.R.color.system_on_surface_light),
+        surfaceVariant =
+            ColorResourceHelper.getColor(context, android.R.color.system_surface_variant_light),
+        onSurfaceVariant =
+            ColorResourceHelper.getColor(context, android.R.color.system_on_surface_variant_light),
+        inverseSurface = ColorResourceHelper.getColor(context, android.R.color.system_surface_dark),
+        inverseOnSurface =
+            ColorResourceHelper.getColor(context, android.R.color.system_on_surface_dark),
+        outline = ColorResourceHelper.getColor(context, android.R.color.system_outline_light),
+        outlineVariant =
+            ColorResourceHelper.getColor(context, android.R.color.system_outline_variant_light),
+        // scrim
+        surfaceBright =
+            ColorResourceHelper.getColor(context, android.R.color.system_surface_bright_light),
+        surfaceDim =
+            ColorResourceHelper.getColor(context, android.R.color.system_surface_dim_light),
+        surfaceContainer =
+            ColorResourceHelper.getColor(context, android.R.color.system_surface_container_light),
+        surfaceContainerHigh =
+            ColorResourceHelper.getColor(
+                context,
+                android.R.color.system_surface_container_high_light
+            ),
+        surfaceContainerHighest =
+            ColorResourceHelper.getColor(
+                context,
+                android.R.color.system_surface_container_highest_light
+            ),
+        surfaceContainerLow =
+            ColorResourceHelper.getColor(
+                context,
+                android.R.color.system_surface_container_low_light
+            ),
+        surfaceContainerLowest =
+            ColorResourceHelper.getColor(
+                context,
+                android.R.color.system_surface_container_lowest_light
+            ),
+        surfaceTint = ColorResourceHelper.getColor(context, android.R.color.system_primary_light),
+    )
 
 @RequiresApi(31)
-internal fun dynamicDarkColorScheme31(tonalPalette: TonalPalette) = darkColorScheme(
-    primary = tonalPalette.primary80,
-    onPrimary = tonalPalette.primary20,
-    primaryContainer = tonalPalette.primary30,
-    onPrimaryContainer = tonalPalette.primary90,
-    inversePrimary = tonalPalette.primary40,
-    secondary = tonalPalette.secondary80,
-    onSecondary = tonalPalette.secondary20,
-    secondaryContainer = tonalPalette.secondary30,
-    onSecondaryContainer = tonalPalette.secondary90,
-    tertiary = tonalPalette.tertiary80,
-    onTertiary = tonalPalette.tertiary20,
-    tertiaryContainer = tonalPalette.tertiary30,
-    onTertiaryContainer = tonalPalette.tertiary90,
-    background = tonalPalette.neutralVariant6,
-    onBackground = tonalPalette.neutralVariant90,
-    surface = tonalPalette.neutralVariant6,
-    onSurface = tonalPalette.neutralVariant90,
-    surfaceVariant = tonalPalette.neutralVariant30,
-    onSurfaceVariant = tonalPalette.neutralVariant80,
-    inverseSurface = tonalPalette.neutralVariant90,
-    inverseOnSurface = tonalPalette.neutralVariant20,
-    outline = tonalPalette.neutralVariant60,
-    outlineVariant = tonalPalette.neutralVariant30,
-    scrim = tonalPalette.neutralVariant0,
-    surfaceBright = tonalPalette.neutralVariant24,
-    surfaceDim = tonalPalette.neutralVariant6,
-    surfaceContainer = tonalPalette.neutralVariant12,
-    surfaceContainerHigh = tonalPalette.neutralVariant17,
-    surfaceContainerHighest = tonalPalette.neutralVariant22,
-    surfaceContainerLow = tonalPalette.neutralVariant10,
-    surfaceContainerLowest = tonalPalette.neutralVariant4,
-    surfaceTint = tonalPalette.primary80,
-)
+internal fun dynamicDarkColorScheme31(tonalPalette: TonalPalette) =
+    darkColorScheme(
+        primary = tonalPalette.primary80,
+        onPrimary = tonalPalette.primary20,
+        primaryContainer = tonalPalette.primary30,
+        onPrimaryContainer = tonalPalette.primary90,
+        inversePrimary = tonalPalette.primary40,
+        secondary = tonalPalette.secondary80,
+        onSecondary = tonalPalette.secondary20,
+        secondaryContainer = tonalPalette.secondary30,
+        onSecondaryContainer = tonalPalette.secondary90,
+        tertiary = tonalPalette.tertiary80,
+        onTertiary = tonalPalette.tertiary20,
+        tertiaryContainer = tonalPalette.tertiary30,
+        onTertiaryContainer = tonalPalette.tertiary90,
+        background = tonalPalette.neutralVariant6,
+        onBackground = tonalPalette.neutralVariant90,
+        surface = tonalPalette.neutralVariant6,
+        onSurface = tonalPalette.neutralVariant90,
+        surfaceVariant = tonalPalette.neutralVariant30,
+        onSurfaceVariant = tonalPalette.neutralVariant80,
+        inverseSurface = tonalPalette.neutralVariant90,
+        inverseOnSurface = tonalPalette.neutralVariant20,
+        outline = tonalPalette.neutralVariant60,
+        outlineVariant = tonalPalette.neutralVariant30,
+        scrim = tonalPalette.neutralVariant0,
+        surfaceBright = tonalPalette.neutralVariant24,
+        surfaceDim = tonalPalette.neutralVariant6,
+        surfaceContainer = tonalPalette.neutralVariant12,
+        surfaceContainerHigh = tonalPalette.neutralVariant17,
+        surfaceContainerHighest = tonalPalette.neutralVariant22,
+        surfaceContainerLow = tonalPalette.neutralVariant10,
+        surfaceContainerLowest = tonalPalette.neutralVariant4,
+        surfaceTint = tonalPalette.primary80,
+    )
 
 @RequiresApi(34)
-internal fun dynamicDarkColorScheme34(context: Context) = darkColorScheme(
-    primary = ColorResourceHelper.getColor(context, android.R.color.system_primary_dark),
-    onPrimary = ColorResourceHelper.getColor(context, android.R.color.system_on_primary_dark),
-    primaryContainer =
-        ColorResourceHelper.getColor(context, android.R.color.system_primary_container_dark),
-    onPrimaryContainer =
-        ColorResourceHelper.getColor(context, android.R.color.system_on_primary_container_dark),
-    inversePrimary = ColorResourceHelper.getColor(context, android.R.color.system_primary_light),
-    secondary = ColorResourceHelper.getColor(context, android.R.color.system_secondary_dark),
-    onSecondary = ColorResourceHelper.getColor(context, android.R.color.system_on_secondary_dark),
-    secondaryContainer =
-        ColorResourceHelper.getColor(context, android.R.color.system_secondary_container_dark),
-    onSecondaryContainer =
-        ColorResourceHelper.getColor(context, android.R.color.system_on_secondary_container_dark),
-    tertiary = ColorResourceHelper.getColor(context, android.R.color.system_tertiary_dark),
-    onTertiary = ColorResourceHelper.getColor(context, android.R.color.system_on_tertiary_dark),
-    tertiaryContainer =
-        ColorResourceHelper.getColor(context, android.R.color.system_tertiary_container_dark),
-    onTertiaryContainer =
-        ColorResourceHelper.getColor(context, android.R.color.system_on_tertiary_container_dark),
-    background = ColorResourceHelper.getColor(context, android.R.color.system_background_dark),
-    onBackground = ColorResourceHelper.getColor(context, android.R.color.system_on_background_dark),
-    surface = ColorResourceHelper.getColor(context, android.R.color.system_surface_dark),
-    onSurface = ColorResourceHelper.getColor(context, android.R.color.system_on_surface_dark),
-    surfaceVariant =
-        ColorResourceHelper.getColor(context, android.R.color.system_surface_variant_dark),
-    onSurfaceVariant =
-        ColorResourceHelper.getColor(context, android.R.color.system_on_surface_variant_dark),
-    inverseSurface = ColorResourceHelper.getColor(context, android.R.color.system_surface_light),
-    inverseOnSurface =
-        ColorResourceHelper.getColor(context, android.R.color.system_on_surface_light),
-    outline = ColorResourceHelper.getColor(context, android.R.color.system_outline_dark),
-    outlineVariant =
-        ColorResourceHelper.getColor(context, android.R.color.system_outline_variant_dark),
-    // scrim
-    surfaceBright =
-        ColorResourceHelper.getColor(context, android.R.color.system_surface_bright_dark),
-    surfaceDim = ColorResourceHelper.getColor(context, android.R.color.system_surface_dim_dark),
-    surfaceContainer =
-        ColorResourceHelper.getColor(context, android.R.color.system_surface_container_dark),
-    surfaceContainerHigh =
-        ColorResourceHelper.getColor(context, android.R.color.system_surface_container_high_dark),
-    surfaceContainerHighest =
-        ColorResourceHelper.getColor(
-            context,
-            android.R.color.system_surface_container_highest_dark
-        ),
-    surfaceContainerLow =
-        ColorResourceHelper.getColor(context, android.R.color.system_surface_container_low_dark),
-    surfaceContainerLowest =
-        ColorResourceHelper.getColor(
-            context,
-            android.R.color.system_surface_container_lowest_dark
-        ),
-    surfaceTint = ColorResourceHelper.getColor(context, android.R.color.system_primary_dark),
-)
+internal fun dynamicDarkColorScheme34(context: Context) =
+    darkColorScheme(
+        primary = ColorResourceHelper.getColor(context, android.R.color.system_primary_dark),
+        onPrimary = ColorResourceHelper.getColor(context, android.R.color.system_on_primary_dark),
+        primaryContainer =
+            ColorResourceHelper.getColor(context, android.R.color.system_primary_container_dark),
+        onPrimaryContainer =
+            ColorResourceHelper.getColor(context, android.R.color.system_on_primary_container_dark),
+        inversePrimary =
+            ColorResourceHelper.getColor(context, android.R.color.system_primary_light),
+        secondary = ColorResourceHelper.getColor(context, android.R.color.system_secondary_dark),
+        onSecondary =
+            ColorResourceHelper.getColor(context, android.R.color.system_on_secondary_dark),
+        secondaryContainer =
+            ColorResourceHelper.getColor(context, android.R.color.system_secondary_container_dark),
+        onSecondaryContainer =
+            ColorResourceHelper.getColor(
+                context,
+                android.R.color.system_on_secondary_container_dark
+            ),
+        tertiary = ColorResourceHelper.getColor(context, android.R.color.system_tertiary_dark),
+        onTertiary = ColorResourceHelper.getColor(context, android.R.color.system_on_tertiary_dark),
+        tertiaryContainer =
+            ColorResourceHelper.getColor(context, android.R.color.system_tertiary_container_dark),
+        onTertiaryContainer =
+            ColorResourceHelper.getColor(
+                context,
+                android.R.color.system_on_tertiary_container_dark
+            ),
+        background = ColorResourceHelper.getColor(context, android.R.color.system_background_dark),
+        onBackground =
+            ColorResourceHelper.getColor(context, android.R.color.system_on_background_dark),
+        surface = ColorResourceHelper.getColor(context, android.R.color.system_surface_dark),
+        onSurface = ColorResourceHelper.getColor(context, android.R.color.system_on_surface_dark),
+        surfaceVariant =
+            ColorResourceHelper.getColor(context, android.R.color.system_surface_variant_dark),
+        onSurfaceVariant =
+            ColorResourceHelper.getColor(context, android.R.color.system_on_surface_variant_dark),
+        inverseSurface =
+            ColorResourceHelper.getColor(context, android.R.color.system_surface_light),
+        inverseOnSurface =
+            ColorResourceHelper.getColor(context, android.R.color.system_on_surface_light),
+        outline = ColorResourceHelper.getColor(context, android.R.color.system_outline_dark),
+        outlineVariant =
+            ColorResourceHelper.getColor(context, android.R.color.system_outline_variant_dark),
+        // scrim
+        surfaceBright =
+            ColorResourceHelper.getColor(context, android.R.color.system_surface_bright_dark),
+        surfaceDim = ColorResourceHelper.getColor(context, android.R.color.system_surface_dim_dark),
+        surfaceContainer =
+            ColorResourceHelper.getColor(context, android.R.color.system_surface_container_dark),
+        surfaceContainerHigh =
+            ColorResourceHelper.getColor(
+                context,
+                android.R.color.system_surface_container_high_dark
+            ),
+        surfaceContainerHighest =
+            ColorResourceHelper.getColor(
+                context,
+                android.R.color.system_surface_container_highest_dark
+            ),
+        surfaceContainerLow =
+            ColorResourceHelper.getColor(
+                context,
+                android.R.color.system_surface_container_low_dark
+            ),
+        surfaceContainerLowest =
+            ColorResourceHelper.getColor(
+                context,
+                android.R.color.system_surface_container_lowest_dark
+            ),
+        surfaceTint = ColorResourceHelper.getColor(context, android.R.color.system_primary_dark),
+    )
diff --git a/compose/material3/material3/src/androidMain/kotlin/androidx/compose/material3/ExposedDropdownMenu.android.kt b/compose/material3/material3/src/androidMain/kotlin/androidx/compose/material3/ExposedDropdownMenu.android.kt
index ef2ea31..43bd4d3 100644
--- a/compose/material3/material3/src/androidMain/kotlin/androidx/compose/material3/ExposedDropdownMenu.android.kt
+++ b/compose/material3/material3/src/androidMain/kotlin/androidx/compose/material3/ExposedDropdownMenu.android.kt
@@ -97,7 +97,8 @@
 import kotlin.math.roundToInt
 
 /**
- * <a href="https://m3.material.io/components/menus/overview" class="external" target="_blank">Material Design Exposed Dropdown Menu</a>.
+ * <a href="https://m3.material.io/components/menus/overview" class="external"
+ * target="_blank">Material Design Exposed Dropdown Menu</a>.
  *
  * Menus display a list of choices on a temporary surface. They appear when users interact with a
  * button, action, or other control.
@@ -107,24 +108,27 @@
  * display user input (whether or not it’s listed as a menu choice), in which case it may be used to
  * implement autocomplete.
  *
- * ![Exposed dropdown menu image](https://developer.android.com/images/reference/androidx/compose/material3/exposed-dropdown-menu.png)
+ * ![Exposed dropdown menu
+ * image](https://developer.android.com/images/reference/androidx/compose/material3/exposed-dropdown-menu.png)
  *
  * The [ExposedDropdownMenuBox] is expected to contain a [TextField] (or [OutlinedTextField]) and
  * [ExposedDropdownMenu][ExposedDropdownMenuBoxScope.ExposedDropdownMenu] as content. The
  * [menuAnchor][ExposedDropdownMenuBoxScope.menuAnchor] modifier should be passed to the text field.
  *
  * An example of a read-only Exposed Dropdown Menu:
+ *
  * @sample androidx.compose.material3.samples.ExposedDropdownMenuSample
  *
  * An example of an editable Exposed Dropdown Menu:
+ *
  * @sample androidx.compose.material3.samples.EditableExposedDropdownMenuSample
  *
  * @param expanded whether the menu is expanded or not
  * @param onExpandedChange called when the exposed dropdown menu is clicked and the expansion state
- * changes.
+ *   changes.
  * @param modifier the [Modifier] to be applied to this ExposedDropdownMenuBox
  * @param content the content of this ExposedDropdownMenuBox, typically a [TextField] and an
- * [ExposedDropdownMenu][ExposedDropdownMenuBoxScope.ExposedDropdownMenu].
+ *   [ExposedDropdownMenu][ExposedDropdownMenuBoxScope.ExposedDropdownMenu].
  */
 @ExperimentalMaterial3Api
 @Composable
@@ -151,54 +155,58 @@
     val toggleDescription = getString(Strings.ToggleDropdownMenu)
     val anchorTypeState = remember { mutableStateOf(MenuAnchorType.PrimaryNotEditable) }
 
-    val scope = remember(expanded, onExpandedChange, config, view, density) {
-        object : ExposedDropdownMenuBoxScopeImpl() {
-            override fun Modifier.menuAnchor(type: MenuAnchorType, enabled: Boolean): Modifier =
-                this.focusRequester(focusRequester)
-                    .then(
-                        if (!enabled) Modifier else Modifier
-                            .expandable(
-                                expanded = expanded,
-                                onExpandedChange = {
-                                    anchorTypeState.value = type
-                                    onExpandedChange(!expanded)
-                                },
-                                anchorType = type,
-                                expandedDescription = expandedDescription,
-                                collapsedDescription = collapsedDescription,
-                                toggleDescription = toggleDescription,
-                                keyboardController = keyboardController,
+    val scope =
+        remember(expanded, onExpandedChange, config, view, density) {
+            object : ExposedDropdownMenuBoxScopeImpl() {
+                override fun Modifier.menuAnchor(type: MenuAnchorType, enabled: Boolean): Modifier =
+                    this.focusRequester(focusRequester)
+                        .then(
+                            if (!enabled) Modifier
+                            else
+                                Modifier.expandable(
+                                    expanded = expanded,
+                                    onExpandedChange = {
+                                        anchorTypeState.value = type
+                                        onExpandedChange(!expanded)
+                                    },
+                                    anchorType = type,
+                                    expandedDescription = expandedDescription,
+                                    collapsedDescription = collapsedDescription,
+                                    toggleDescription = toggleDescription,
+                                    keyboardController = keyboardController,
+                                )
+                        )
+
+                override val anchorType: MenuAnchorType
+                    get() = anchorTypeState.value
+
+                override fun Modifier.exposedDropdownSize(matchTextFieldWidth: Boolean): Modifier =
+                    layout { measurable, constraints ->
+                        val menuWidth = constraints.constrainWidth(anchorWidth)
+                        val menuConstraints =
+                            constraints.copy(
+                                maxHeight = constraints.constrainHeight(menuMaxHeight),
+                                minWidth =
+                                    if (matchTextFieldWidth) menuWidth else constraints.minWidth,
+                                maxWidth =
+                                    if (matchTextFieldWidth) menuWidth else constraints.maxWidth,
                             )
-                    )
-
-            override val anchorType: MenuAnchorType
-                get() = anchorTypeState.value
-
-            override fun Modifier.exposedDropdownSize(matchTextFieldWidth: Boolean): Modifier =
-                layout { measurable, constraints ->
-                    val menuWidth = constraints.constrainWidth(anchorWidth)
-                    val menuConstraints = constraints.copy(
-                        maxHeight = constraints.constrainHeight(menuMaxHeight),
-                        minWidth = if (matchTextFieldWidth) menuWidth else constraints.minWidth,
-                        maxWidth = if (matchTextFieldWidth) menuWidth else constraints.maxWidth,
-                    )
-                    val placeable = measurable.measure(menuConstraints)
-                    layout(placeable.width, placeable.height) {
-                        placeable.place(0, 0)
+                        val placeable = measurable.measure(menuConstraints)
+                        layout(placeable.width, placeable.height) { placeable.place(0, 0) }
                     }
-                }
+            }
         }
-    }
 
     Box(
         modifier.onGloballyPositioned {
             anchorCoordinates = it
             anchorWidth = it.size.width
-            menuMaxHeight = calculateMaxHeight(
-                windowBounds = view.rootView.getWindowBounds(),
-                anchorBounds = anchorCoordinates.getAnchorBounds(),
-                verticalMargin = verticalMargin,
-            )
+            menuMaxHeight =
+                calculateMaxHeight(
+                    windowBounds = view.rootView.getWindowBounds(),
+                    anchorBounds = anchorCoordinates.getAnchorBounds(),
+                    verticalMargin = verticalMargin,
+                )
         }
     ) {
         scope.content()
@@ -206,23 +214,20 @@
 
     if (expanded) {
         SoftKeyboardListener(view, density) {
-            menuMaxHeight = calculateMaxHeight(
-                windowBounds = view.rootView.getWindowBounds(),
-                anchorBounds = anchorCoordinates.getAnchorBounds(),
-                verticalMargin = verticalMargin,
-            )
+            menuMaxHeight =
+                calculateMaxHeight(
+                    windowBounds = view.rootView.getWindowBounds(),
+                    anchorBounds = anchorCoordinates.getAnchorBounds(),
+                    verticalMargin = verticalMargin,
+                )
         }
     }
 
-    SideEffect {
-        if (expanded) focusRequester.requestFocus()
-    }
+    SideEffect { if (expanded) focusRequester.requestFocus() }
 
     // Back events are handled in the Popup layer if the menu is focusable.
     // If it's not focusable, we handle them here.
-    BackHandler(enabled = expanded) {
-        onExpandedChange(false)
-    }
+    BackHandler(enabled = expanded) { onExpandedChange(false) }
 }
 
 @Composable
@@ -237,23 +242,30 @@
         val listener =
             object : View.OnAttachStateChangeListener, ViewTreeObserver.OnGlobalLayoutListener {
                 private var isListeningToGlobalLayout = false
+
                 init {
                     view.addOnAttachStateChangeListener(this)
                     registerOnGlobalLayoutListener()
                 }
+
                 override fun onViewAttachedToWindow(p0: View) = registerOnGlobalLayoutListener()
+
                 override fun onViewDetachedFromWindow(p0: View) = unregisterOnGlobalLayoutListener()
+
                 override fun onGlobalLayout() = onKeyboardVisibilityChange()
+
                 private fun registerOnGlobalLayoutListener() {
                     if (isListeningToGlobalLayout || !view.isAttachedToWindow) return
                     view.viewTreeObserver.addOnGlobalLayoutListener(this)
                     isListeningToGlobalLayout = true
                 }
+
                 private fun unregisterOnGlobalLayoutListener() {
                     if (!isListeningToGlobalLayout) return
                     view.viewTreeObserver.removeOnGlobalLayoutListener(this)
                     isListeningToGlobalLayout = false
                 }
+
                 fun dispose() {
                     unregisterOnGlobalLayoutListener()
                     view.removeOnAttachStateChangeListener(this)
@@ -264,9 +276,7 @@
     }
 }
 
-/**
- * Scope for [ExposedDropdownMenuBox].
- */
+/** Scope for [ExposedDropdownMenuBox]. */
 @ExperimentalMaterial3Api
 sealed class ExposedDropdownMenuBoxScope {
     /**
@@ -276,27 +286,25 @@
      *
      * @param type the type of element that is anchoring the menu. See [MenuAnchorType].
      * @param enabled controls the enabled state. When `false`, the component will not expand or
-     * collapse the menu in response to user input, and menu semantics will be invisible to
-     * accessibility services. Note that this value only controls interactions with the menu.
-     * It does not affect the enabled state of other kinds of interactions, such as [TextField]'s
-     * `enabled` parameter.
+     *   collapse the menu in response to user input, and menu semantics will be invisible to
+     *   accessibility services. Note that this value only controls interactions with the menu. It
+     *   does not affect the enabled state of other kinds of interactions, such as [TextField]'s
+     *   `enabled` parameter.
      */
     abstract fun Modifier.menuAnchor(type: MenuAnchorType, enabled: Boolean = true): Modifier
 
     /**
      * Modifier which should be applied to a menu placed inside the [ExposedDropdownMenuBoxScope].
-     * It will set constraints on the width and height of the menu so it will not overlap the
-     * text field or software keyboard.
+     * It will set constraints on the width and height of the menu so it will not overlap the text
+     * field or software keyboard.
      *
-     * [ExposedDropdownMenu] applies this modifier automatically, so this is only needed when
-     * using custom menu components.
+     * [ExposedDropdownMenu] applies this modifier automatically, so this is only needed when using
+     * custom menu components.
      *
-     * @param matchTextFieldWidth whether the menu's width should be forcefully constrained to
-     * match the width of the text field to which it's attached.
+     * @param matchTextFieldWidth whether the menu's width should be forcefully constrained to match
+     *   the width of the text field to which it's attached.
      */
-    abstract fun Modifier.exposedDropdownSize(
-        matchTextFieldWidth: Boolean = true
-    ): Modifier
+    abstract fun Modifier.exposedDropdownSize(matchTextFieldWidth: Boolean = true): Modifier
 
     internal abstract val anchorType: MenuAnchorType
 
@@ -305,17 +313,18 @@
      * [ExposedDropdownMenuBox].
      *
      * @param expanded whether the menu is expanded
-     * @param onDismissRequest called when the user requests to dismiss the menu, such as by
-     * tapping outside the menu's bounds
+     * @param onDismissRequest called when the user requests to dismiss the menu, such as by tapping
+     *   outside the menu's bounds
      * @param modifier the [Modifier] to be applied to this menu
      * @param scrollState a [ScrollState] used by the menu's content for items vertical scrolling
-     * @param matchTextFieldWidth whether the menu's width should be forcefully constrained to
-     * match the width of the text field to which it's attached.
+     * @param matchTextFieldWidth whether the menu's width should be forcefully constrained to match
+     *   the width of the text field to which it's attached.
      * @param shape the shape of the menu
      * @param containerColor the container color of the menu
      * @param tonalElevation when [containerColor] is [ColorScheme.surface], a translucent primary
-     * color overlay is applied on top of the container. A higher tonal elevation value will result
-     * in a darker color in light theme and lighter color in dark theme. See also: [Surface].
+     *   color overlay is applied on top of the container. A higher tonal elevation value will
+     *   result in a darker color in light theme and lighter color in dark theme. See also:
+     *   [Surface].
      * @param shadowElevation the elevation for the shadow below the menu
      * @param border the border to draw around the container of the menu. Pass `null` for no border.
      * @param content the content of the menu
@@ -342,9 +351,7 @@
         val topWindowInsets = WindowInsets.statusBars.getTop(density)
 
         if (expanded) {
-            SoftKeyboardListener(view, density) {
-                keyboardSignalState.value = Unit
-            }
+            SoftKeyboardListener(view, density) { keyboardSignalState.value = Unit }
         }
 
         // TODO(b/326064777): use DropdownMenu when it supports custom PositionProvider
@@ -353,15 +360,17 @@
 
         if (expandedState.currentState || expandedState.targetState) {
             val transformOriginState = remember { mutableStateOf(TransformOrigin.Center) }
-            val popupPositionProvider = remember(density, topWindowInsets) {
-                ExposedDropdownMenuPositionProvider(
-                    density = density,
-                    topWindowInsets = topWindowInsets,
-                    keyboardSignalState = keyboardSignalState,
-                ) { anchorBounds, menuBounds ->
-                    transformOriginState.value = calculateTransformOrigin(anchorBounds, menuBounds)
+            val popupPositionProvider =
+                remember(density, topWindowInsets) {
+                    ExposedDropdownMenuPositionProvider(
+                        density = density,
+                        topWindowInsets = topWindowInsets,
+                        keyboardSignalState = keyboardSignalState,
+                    ) { anchorBounds, menuBounds ->
+                        transformOriginState.value =
+                            calculateTransformOrigin(anchorBounds, menuBounds)
+                    }
                 }
-            }
 
             Popup(
                 onDismissRequest = onDismissRequest,
@@ -393,8 +402,9 @@
 
     @Deprecated(
         level = DeprecationLevel.WARNING,
-        message = "The `focusable` parameter is unused. Pass the proper MenuAnchorType to " +
-            "Modifier.menuAnchor instead, which will handle focusability automatically.",
+        message =
+            "The `focusable` parameter is unused. Pass the proper MenuAnchorType to " +
+                "Modifier.menuAnchor instead, which will handle focusability automatically.",
     )
     @Suppress("DeprecatedCallableAddReplaceWith", "UNUSED_PARAMETER")
     @Composable
@@ -411,24 +421,26 @@
         shadowElevation: Dp = MenuDefaults.ShadowElevation,
         border: BorderStroke? = null,
         content: @Composable ColumnScope.() -> Unit,
-    ) = ExposedDropdownMenu(
-        expanded = expanded,
-        onDismissRequest = onDismissRequest,
-        modifier = modifier,
-        scrollState = scrollState,
-        matchTextFieldWidth = matchTextFieldWidth,
-        shape = shape,
-        containerColor = containerColor,
-        tonalElevation = tonalElevation,
-        shadowElevation = shadowElevation,
-        border = border,
-        content = content,
-    )
+    ) =
+        ExposedDropdownMenu(
+            expanded = expanded,
+            onDismissRequest = onDismissRequest,
+            modifier = modifier,
+            scrollState = scrollState,
+            matchTextFieldWidth = matchTextFieldWidth,
+            shape = shape,
+            containerColor = containerColor,
+            tonalElevation = tonalElevation,
+            shadowElevation = shadowElevation,
+            border = border,
+            content = content,
+        )
 
     @Deprecated(
         level = DeprecationLevel.HIDDEN,
-        message = "Maintained for binary compatibility. " +
-            "Use overload with customization options parameters."
+        message =
+            "Maintained for binary compatibility. " +
+                "Use overload with customization options parameters."
     )
     @Composable
     fun ExposedDropdownMenu(
@@ -437,19 +449,20 @@
         modifier: Modifier = Modifier,
         scrollState: ScrollState = rememberScrollState(),
         content: @Composable ColumnScope.() -> Unit,
-    ) = ExposedDropdownMenu(
-        expanded = expanded,
-        onDismissRequest = onDismissRequest,
-        modifier = modifier,
-        matchTextFieldWidth = true,
-        scrollState = scrollState,
-        shape = MenuDefaults.shape,
-        containerColor = MenuDefaults.containerColor,
-        tonalElevation = MenuDefaults.TonalElevation,
-        shadowElevation = MenuDefaults.ShadowElevation,
-        border = null,
-        content = content,
-    )
+    ) =
+        ExposedDropdownMenu(
+            expanded = expanded,
+            onDismissRequest = onDismissRequest,
+            modifier = modifier,
+            matchTextFieldWidth = true,
+            scrollState = scrollState,
+            shape = MenuDefaults.shape,
+            containerColor = MenuDefaults.containerColor,
+            tonalElevation = MenuDefaults.TonalElevation,
+            shadowElevation = MenuDefaults.ShadowElevation,
+            border = null,
+            content = content,
+        )
 }
 
 // Sealed classes don't allow dynamic anonymous subclasses.
@@ -468,21 +481,21 @@
         val PrimaryNotEditable = MenuAnchorType("PrimaryNotEditable")
 
         /**
-         * An editable primary anchor of the dropdown menu, such as a text field that allows
-         * user input.
+         * An editable primary anchor of the dropdown menu, such as a text field that allows user
+         * input.
          *
-         * An anchor of this type will open the menu without focus in order to preserve focus
-         * on the soft keyboard (IME).
+         * An anchor of this type will open the menu without focus in order to preserve focus on the
+         * soft keyboard (IME).
          */
         val PrimaryEditable = MenuAnchorType("PrimaryEditable")
 
         /**
-         * A secondary anchor of the dropdown menu that lives alongside an editable primary
-         * anchor, such as an icon within an editable text field.
+         * A secondary anchor of the dropdown menu that lives alongside an editable primary anchor,
+         * such as an icon within an editable text field.
          *
-         * If accessibility services are enabled, an anchor of this type will open the menu
-         * with focus. Otherwise, the menu is opened without focus in order to preserve focus
-         * on the soft keyboard (IME).
+         * If accessibility services are enabled, an anchor of this type will open the menu with
+         * focus. Otherwise, the menu is opened without focus in order to preserve focus on the soft
+         * keyboard (IME).
          */
         val SecondaryEditable = MenuAnchorType("SecondaryEditable")
     }
@@ -490,9 +503,7 @@
     override fun toString(): String = name
 }
 
-/**
- * Contains default values used by Exposed Dropdown Menu.
- */
+/** Contains default values used by Exposed Dropdown Menu. */
 @ExperimentalMaterial3Api
 object ExposedDropdownMenuDefaults {
     /**
@@ -507,11 +518,7 @@
         expanded: Boolean,
         modifier: Modifier = Modifier,
     ) {
-        Icon(
-            Icons.Filled.ArrowDropDown,
-            null,
-            modifier.rotate(if (expanded) 180f else 0f)
-        )
+        Icon(Icons.Filled.ArrowDropDown, null, modifier.rotate(if (expanded) 180f else 0f))
     }
 
     /**
@@ -521,10 +528,10 @@
      *
      * @param focusedTextColor the color used for the input text of this text field when focused
      * @param unfocusedTextColor the color used for the input text of this text field when not
-     * focused
+     *   focused
      * @param disabledTextColor the color used for the input text of this text field when disabled
      * @param errorTextColor the color used for the input text of this text field when in error
-     * state
+     *   state
      * @param focusedContainerColor the container color for this text field when focused
      * @param unfocusedContainerColor the container color for this text field when not focused
      * @param disabledContainerColor the container color for this text field when disabled
@@ -542,7 +549,7 @@
      * @param errorLeadingIconColor the leading icon color for this text field when in error state
      * @param focusedTrailingIconColor the trailing icon color for this text field when focused
      * @param unfocusedTrailingIconColor the trailing icon color for this text field when not
-     * focused
+     *   focused
      * @param disabledTrailingIconColor the trailing icon color for this text field when disabled
      * @param errorTrailingIconColor the trailing icon color for this text field when in error state
      * @param focusedLabelColor the label color for this text field when focused
@@ -566,8 +573,10 @@
     fun textFieldColors(
         focusedTextColor: Color = FilledAutocompleteTokens.FieldFocusInputTextColor.value,
         unfocusedTextColor: Color = FilledAutocompleteTokens.FieldInputTextColor.value,
-        disabledTextColor: Color = FilledAutocompleteTokens.FieldDisabledInputTextColor.value
-            .copy(alpha = FilledAutocompleteTokens.FieldDisabledInputTextOpacity),
+        disabledTextColor: Color =
+            FilledAutocompleteTokens.FieldDisabledInputTextColor.value.copy(
+                alpha = FilledAutocompleteTokens.FieldDisabledInputTextOpacity
+            ),
         errorTextColor: Color = FilledAutocompleteTokens.FieldErrorInputTextColor.value,
         focusedContainerColor: Color = FilledAutocompleteTokens.TextFieldContainerColor.value,
         unfocusedContainerColor: Color = FilledAutocompleteTokens.TextFieldContainerColor.value,
@@ -581,17 +590,18 @@
         unfocusedIndicatorColor: Color =
             FilledAutocompleteTokens.TextFieldActiveIndicatorColor.value,
         disabledIndicatorColor: Color =
-            FilledAutocompleteTokens.TextFieldDisabledActiveIndicatorColor.value
-                .copy(alpha = FilledAutocompleteTokens.TextFieldDisabledActiveIndicatorOpacity),
+            FilledAutocompleteTokens.TextFieldDisabledActiveIndicatorColor.value.copy(
+                alpha = FilledAutocompleteTokens.TextFieldDisabledActiveIndicatorOpacity
+            ),
         errorIndicatorColor: Color =
             FilledAutocompleteTokens.TextFieldErrorActiveIndicatorColor.value,
         focusedLeadingIconColor: Color =
             FilledAutocompleteTokens.TextFieldFocusLeadingIconColor.value,
-        unfocusedLeadingIconColor: Color =
-            FilledAutocompleteTokens.TextFieldLeadingIconColor.value,
+        unfocusedLeadingIconColor: Color = FilledAutocompleteTokens.TextFieldLeadingIconColor.value,
         disabledLeadingIconColor: Color =
-            FilledAutocompleteTokens.TextFieldDisabledLeadingIconColor.value
-                .copy(alpha = FilledAutocompleteTokens.TextFieldDisabledLeadingIconOpacity),
+            FilledAutocompleteTokens.TextFieldDisabledLeadingIconColor.value.copy(
+                alpha = FilledAutocompleteTokens.TextFieldDisabledLeadingIconOpacity
+            ),
         errorLeadingIconColor: Color =
             FilledAutocompleteTokens.TextFieldErrorLeadingIconColor.value,
         focusedTrailingIconColor: Color =
@@ -599,31 +609,35 @@
         unfocusedTrailingIconColor: Color =
             FilledAutocompleteTokens.TextFieldTrailingIconColor.value,
         disabledTrailingIconColor: Color =
-            FilledAutocompleteTokens.TextFieldDisabledTrailingIconColor.value
-                .copy(alpha = FilledAutocompleteTokens.TextFieldDisabledTrailingIconOpacity),
+            FilledAutocompleteTokens.TextFieldDisabledTrailingIconColor.value.copy(
+                alpha = FilledAutocompleteTokens.TextFieldDisabledTrailingIconOpacity
+            ),
         errorTrailingIconColor: Color =
             FilledAutocompleteTokens.TextFieldErrorTrailingIconColor.value,
         focusedLabelColor: Color = FilledAutocompleteTokens.FieldFocusLabelTextColor.value,
         unfocusedLabelColor: Color = FilledAutocompleteTokens.FieldLabelTextColor.value,
         disabledLabelColor: Color = FilledAutocompleteTokens.FieldDisabledLabelTextColor.value,
         errorLabelColor: Color = FilledAutocompleteTokens.FieldErrorLabelTextColor.value,
-        focusedPlaceholderColor: Color =
-            FilledAutocompleteTokens.FieldSupportingTextColor.value,
-        unfocusedPlaceholderColor: Color =
-            FilledAutocompleteTokens.FieldSupportingTextColor.value,
+        focusedPlaceholderColor: Color = FilledAutocompleteTokens.FieldSupportingTextColor.value,
+        unfocusedPlaceholderColor: Color = FilledAutocompleteTokens.FieldSupportingTextColor.value,
         disabledPlaceholderColor: Color =
-            FilledAutocompleteTokens.FieldDisabledSupportingTextColor.value
-                .copy(alpha = FilledAutocompleteTokens.FieldDisabledSupportingTextOpacity),
+            FilledAutocompleteTokens.FieldDisabledSupportingTextColor.value.copy(
+                alpha = FilledAutocompleteTokens.FieldDisabledSupportingTextOpacity
+            ),
         errorPlaceholderColor: Color = FilledAutocompleteTokens.FieldSupportingTextColor.value,
         focusedPrefixColor: Color = FilledAutocompleteTokens.FieldSupportingTextColor.value,
         unfocusedPrefixColor: Color = FilledAutocompleteTokens.FieldSupportingTextColor.value,
-        disabledPrefixColor: Color = FilledAutocompleteTokens.FieldDisabledSupportingTextColor
-            .value.copy(alpha = FilledAutocompleteTokens.FieldDisabledSupportingTextOpacity),
+        disabledPrefixColor: Color =
+            FilledAutocompleteTokens.FieldDisabledSupportingTextColor.value.copy(
+                alpha = FilledAutocompleteTokens.FieldDisabledSupportingTextOpacity
+            ),
         errorPrefixColor: Color = FilledAutocompleteTokens.FieldSupportingTextColor.value,
         focusedSuffixColor: Color = FilledAutocompleteTokens.FieldSupportingTextColor.value,
         unfocusedSuffixColor: Color = FilledAutocompleteTokens.FieldSupportingTextColor.value,
-        disabledSuffixColor: Color = FilledAutocompleteTokens.FieldDisabledSupportingTextColor
-            .value.copy(alpha = FilledAutocompleteTokens.FieldDisabledSupportingTextOpacity),
+        disabledSuffixColor: Color =
+            FilledAutocompleteTokens.FieldDisabledSupportingTextColor.value.copy(
+                alpha = FilledAutocompleteTokens.FieldDisabledSupportingTextOpacity
+            ),
         errorSuffixColor: Color = FilledAutocompleteTokens.FieldSupportingTextColor.value,
     ): TextFieldColors =
         TextFieldDefaults.colors(
@@ -675,10 +689,10 @@
      *
      * @param focusedTextColor the color used for the input text of this text field when focused
      * @param unfocusedTextColor the color used for the input text of this text field when not
-     * focused
+     *   focused
      * @param disabledTextColor the color used for the input text of this text field when disabled
      * @param errorTextColor the color used for the input text of this text field when in error
-     * state
+     *   state
      * @param focusedContainerColor the container color for this text field when focused
      * @param unfocusedContainerColor the container color for this text field when not focused
      * @param disabledContainerColor the container color for this text field when disabled
@@ -695,7 +709,8 @@
      * @param disabledLeadingIconColor the leading icon color for this text field when disabled
      * @param errorLeadingIconColor the leading icon color for this text field when in error state
      * @param focusedTrailingIconColor the trailing icon color for this text field when focused
-     * @param unfocusedTrailingIconColor the trailing icon color for this text field when not focused
+     * @param unfocusedTrailingIconColor the trailing icon color for this text field when not
+     *   focused
      * @param disabledTrailingIconColor the trailing icon color for this text field when disabled
      * @param errorTrailingIconColor the trailing icon color for this text field when in error state
      * @param focusedLabelColor the label color for this text field when focused
@@ -719,30 +734,33 @@
     fun outlinedTextFieldColors(
         focusedTextColor: Color = OutlinedAutocompleteTokens.FieldFocusInputTextColor.value,
         unfocusedTextColor: Color = OutlinedAutocompleteTokens.FieldInputTextColor.value,
-        disabledTextColor: Color = OutlinedAutocompleteTokens.FieldDisabledInputTextColor.value
-            .copy(alpha = OutlinedAutocompleteTokens.FieldDisabledInputTextOpacity),
+        disabledTextColor: Color =
+            OutlinedAutocompleteTokens.FieldDisabledInputTextColor.value.copy(
+                alpha = OutlinedAutocompleteTokens.FieldDisabledInputTextOpacity
+            ),
         errorTextColor: Color = OutlinedAutocompleteTokens.FieldErrorInputTextColor.value,
         focusedContainerColor: Color = Color.Transparent,
         unfocusedContainerColor: Color = Color.Transparent,
         disabledContainerColor: Color = Color.Transparent,
         errorContainerColor: Color = Color.Transparent,
         cursorColor: Color = OutlinedAutocompleteTokens.TextFieldCaretColor.value,
-        errorCursorColor: Color =
-            OutlinedAutocompleteTokens.TextFieldErrorFocusCaretColor.value,
+        errorCursorColor: Color = OutlinedAutocompleteTokens.TextFieldErrorFocusCaretColor.value,
         selectionColors: TextSelectionColors = LocalTextSelectionColors.current,
         focusedBorderColor: Color = OutlinedAutocompleteTokens.TextFieldFocusOutlineColor.value,
         unfocusedBorderColor: Color = OutlinedAutocompleteTokens.TextFieldOutlineColor.value,
         disabledBorderColor: Color =
-            OutlinedAutocompleteTokens.TextFieldDisabledOutlineColor.value
-                .copy(alpha = OutlinedAutocompleteTokens.TextFieldDisabledOutlineOpacity),
+            OutlinedAutocompleteTokens.TextFieldDisabledOutlineColor.value.copy(
+                alpha = OutlinedAutocompleteTokens.TextFieldDisabledOutlineOpacity
+            ),
         errorBorderColor: Color = OutlinedAutocompleteTokens.TextFieldErrorOutlineColor.value,
         focusedLeadingIconColor: Color =
             OutlinedAutocompleteTokens.TextFieldFocusLeadingIconColor.value,
         unfocusedLeadingIconColor: Color =
             OutlinedAutocompleteTokens.TextFieldLeadingIconColor.value,
         disabledLeadingIconColor: Color =
-            OutlinedAutocompleteTokens.TextFieldDisabledLeadingIconColor.value
-                .copy(alpha = OutlinedAutocompleteTokens.TextFieldDisabledLeadingIconOpacity),
+            OutlinedAutocompleteTokens.TextFieldDisabledLeadingIconColor.value.copy(
+                alpha = OutlinedAutocompleteTokens.TextFieldDisabledLeadingIconOpacity
+            ),
         errorLeadingIconColor: Color =
             OutlinedAutocompleteTokens.TextFieldErrorLeadingIconColor.value,
         focusedTrailingIconColor: Color =
@@ -750,33 +768,39 @@
         unfocusedTrailingIconColor: Color =
             OutlinedAutocompleteTokens.TextFieldTrailingIconColor.value,
         disabledTrailingIconColor: Color =
-            OutlinedAutocompleteTokens.TextFieldDisabledTrailingIconColor.value
-                .copy(alpha = OutlinedAutocompleteTokens.TextFieldDisabledTrailingIconOpacity),
+            OutlinedAutocompleteTokens.TextFieldDisabledTrailingIconColor.value.copy(
+                alpha = OutlinedAutocompleteTokens.TextFieldDisabledTrailingIconOpacity
+            ),
         errorTrailingIconColor: Color =
             OutlinedAutocompleteTokens.TextFieldErrorTrailingIconColor.value,
         focusedLabelColor: Color = OutlinedAutocompleteTokens.FieldFocusLabelTextColor.value,
         unfocusedLabelColor: Color = OutlinedAutocompleteTokens.FieldLabelTextColor.value,
-        disabledLabelColor: Color = OutlinedAutocompleteTokens.FieldDisabledLabelTextColor.value
-            .copy(alpha = OutlinedAutocompleteTokens.FieldDisabledLabelTextOpacity),
+        disabledLabelColor: Color =
+            OutlinedAutocompleteTokens.FieldDisabledLabelTextColor.value.copy(
+                alpha = OutlinedAutocompleteTokens.FieldDisabledLabelTextOpacity
+            ),
         errorLabelColor: Color = OutlinedAutocompleteTokens.FieldErrorLabelTextColor.value,
-        focusedPlaceholderColor: Color =
-            OutlinedAutocompleteTokens.FieldSupportingTextColor.value,
+        focusedPlaceholderColor: Color = OutlinedAutocompleteTokens.FieldSupportingTextColor.value,
         unfocusedPlaceholderColor: Color =
             OutlinedAutocompleteTokens.FieldSupportingTextColor.value,
         disabledPlaceholderColor: Color =
-            OutlinedAutocompleteTokens.FieldDisabledSupportingTextColor.value
-                .copy(alpha = OutlinedAutocompleteTokens.FieldDisabledSupportingTextOpacity),
-        errorPlaceholderColor: Color =
-            OutlinedAutocompleteTokens.FieldSupportingTextColor.value,
+            OutlinedAutocompleteTokens.FieldDisabledSupportingTextColor.value.copy(
+                alpha = OutlinedAutocompleteTokens.FieldDisabledSupportingTextOpacity
+            ),
+        errorPlaceholderColor: Color = OutlinedAutocompleteTokens.FieldSupportingTextColor.value,
         focusedPrefixColor: Color = OutlinedAutocompleteTokens.FieldSupportingTextColor.value,
         unfocusedPrefixColor: Color = OutlinedAutocompleteTokens.FieldSupportingTextColor.value,
-        disabledPrefixColor: Color = OutlinedAutocompleteTokens.FieldDisabledSupportingTextColor
-            .value.copy(alpha = OutlinedAutocompleteTokens.FieldDisabledSupportingTextOpacity),
+        disabledPrefixColor: Color =
+            OutlinedAutocompleteTokens.FieldDisabledSupportingTextColor.value.copy(
+                alpha = OutlinedAutocompleteTokens.FieldDisabledSupportingTextOpacity
+            ),
         errorPrefixColor: Color = OutlinedAutocompleteTokens.FieldSupportingTextColor.value,
         focusedSuffixColor: Color = OutlinedAutocompleteTokens.FieldSupportingTextColor.value,
         unfocusedSuffixColor: Color = OutlinedAutocompleteTokens.FieldSupportingTextColor.value,
-        disabledSuffixColor: Color = OutlinedAutocompleteTokens.FieldDisabledSupportingTextColor
-            .value.copy(alpha = OutlinedAutocompleteTokens.FieldDisabledSupportingTextOpacity),
+        disabledSuffixColor: Color =
+            OutlinedAutocompleteTokens.FieldDisabledSupportingTextColor.value.copy(
+                alpha = OutlinedAutocompleteTokens.FieldDisabledSupportingTextOpacity
+            ),
         errorSuffixColor: Color = OutlinedAutocompleteTokens.FieldSupportingTextColor.value,
     ): TextFieldColors =
         OutlinedTextFieldDefaults.colors(
@@ -825,10 +849,8 @@
      * Padding for [DropdownMenuItem]s within [ExposedDropdownMenuBoxScope.ExposedDropdownMenu] to
      * align them properly with [TextField] components.
      */
-    val ItemContentPadding: PaddingValues = PaddingValues(
-        horizontal = ExposedDropdownMenuItemHorizontalPadding,
-        vertical = 0.dp
-    )
+    val ItemContentPadding: PaddingValues =
+        PaddingValues(horizontal = ExposedDropdownMenuItemHorizontalPadding, vertical = 0.dp)
 
     /**
      * Creates a [PopupProperties] used for [ExposedDropdownMenuBoxScope.ExposedDropdownMenu].
@@ -838,8 +860,9 @@
     @Composable
     internal fun popupProperties(anchorType: MenuAnchorType): PopupProperties {
         val a11yServicesEnabled by rememberAccessibilityServiceState()
-        var flags = WindowManager.LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH or
-            WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM
+        var flags =
+            WindowManager.LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH or
+                WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM
 
         // In order for a11y focus to jump to the menu when opened, it needs to be
         // focusable and touch modal (NOT_FOCUSABLE and NOT_TOUCH_MODAL are *not* set).
@@ -848,8 +871,9 @@
         }
         // If typing on the IME is required, the menu should not be focusable
         // in order to prevent stealing focus from the input method.
-        val imeRequired = anchorType == MenuAnchorType.PrimaryEditable ||
-            (anchorType == MenuAnchorType.SecondaryEditable && !a11yServicesEnabled)
+        val imeRequired =
+            anchorType == MenuAnchorType.PrimaryEditable ||
+                (anchorType == MenuAnchorType.SecondaryEditable && !a11yServicesEnabled)
         if (imeRequired) {
             flags = flags or WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE
         }
@@ -867,8 +891,10 @@
     fun textFieldColors(
         focusedTextColor: Color = FilledAutocompleteTokens.FieldFocusInputTextColor.value,
         unfocusedTextColor: Color = FilledAutocompleteTokens.FieldInputTextColor.value,
-        disabledTextColor: Color = FilledAutocompleteTokens.FieldDisabledInputTextColor.value
-            .copy(alpha = FilledAutocompleteTokens.FieldDisabledInputTextOpacity),
+        disabledTextColor: Color =
+            FilledAutocompleteTokens.FieldDisabledInputTextColor.value.copy(
+                alpha = FilledAutocompleteTokens.FieldDisabledInputTextOpacity
+            ),
         errorTextColor: Color = FilledAutocompleteTokens.FieldErrorInputTextColor.value,
         containerColor: Color = FilledAutocompleteTokens.TextFieldContainerColor.value,
         errorContainerColor: Color = FilledAutocompleteTokens.TextFieldContainerColor.value,
@@ -880,17 +906,18 @@
         unfocusedIndicatorColor: Color =
             FilledAutocompleteTokens.TextFieldActiveIndicatorColor.value,
         disabledIndicatorColor: Color =
-            FilledAutocompleteTokens.TextFieldDisabledActiveIndicatorColor.value
-                .copy(alpha = FilledAutocompleteTokens.TextFieldDisabledActiveIndicatorOpacity),
+            FilledAutocompleteTokens.TextFieldDisabledActiveIndicatorColor.value.copy(
+                alpha = FilledAutocompleteTokens.TextFieldDisabledActiveIndicatorOpacity
+            ),
         errorIndicatorColor: Color =
             FilledAutocompleteTokens.TextFieldErrorActiveIndicatorColor.value,
         focusedLeadingIconColor: Color =
             FilledAutocompleteTokens.TextFieldFocusLeadingIconColor.value,
-        unfocusedLeadingIconColor: Color =
-            FilledAutocompleteTokens.TextFieldLeadingIconColor.value,
+        unfocusedLeadingIconColor: Color = FilledAutocompleteTokens.TextFieldLeadingIconColor.value,
         disabledLeadingIconColor: Color =
-            FilledAutocompleteTokens.TextFieldDisabledLeadingIconColor.value
-                .copy(alpha = FilledAutocompleteTokens.TextFieldDisabledLeadingIconOpacity),
+            FilledAutocompleteTokens.TextFieldDisabledLeadingIconColor.value.copy(
+                alpha = FilledAutocompleteTokens.TextFieldDisabledLeadingIconOpacity
+            ),
         errorLeadingIconColor: Color =
             FilledAutocompleteTokens.TextFieldErrorLeadingIconColor.value,
         focusedTrailingIconColor: Color =
@@ -898,31 +925,35 @@
         unfocusedTrailingIconColor: Color =
             FilledAutocompleteTokens.TextFieldTrailingIconColor.value,
         disabledTrailingIconColor: Color =
-            FilledAutocompleteTokens.TextFieldDisabledTrailingIconColor.value
-                .copy(alpha = FilledAutocompleteTokens.TextFieldDisabledTrailingIconOpacity),
+            FilledAutocompleteTokens.TextFieldDisabledTrailingIconColor.value.copy(
+                alpha = FilledAutocompleteTokens.TextFieldDisabledTrailingIconOpacity
+            ),
         errorTrailingIconColor: Color =
             FilledAutocompleteTokens.TextFieldErrorTrailingIconColor.value,
         focusedLabelColor: Color = FilledAutocompleteTokens.FieldFocusLabelTextColor.value,
         unfocusedLabelColor: Color = FilledAutocompleteTokens.FieldLabelTextColor.value,
         disabledLabelColor: Color = FilledAutocompleteTokens.FieldDisabledLabelTextColor.value,
         errorLabelColor: Color = FilledAutocompleteTokens.FieldErrorLabelTextColor.value,
-        focusedPlaceholderColor: Color =
-            FilledAutocompleteTokens.FieldSupportingTextColor.value,
-        unfocusedPlaceholderColor: Color =
-            FilledAutocompleteTokens.FieldSupportingTextColor.value,
+        focusedPlaceholderColor: Color = FilledAutocompleteTokens.FieldSupportingTextColor.value,
+        unfocusedPlaceholderColor: Color = FilledAutocompleteTokens.FieldSupportingTextColor.value,
         disabledPlaceholderColor: Color =
-            FilledAutocompleteTokens.FieldDisabledSupportingTextColor.value
-                .copy(alpha = FilledAutocompleteTokens.FieldDisabledSupportingTextOpacity),
+            FilledAutocompleteTokens.FieldDisabledSupportingTextColor.value.copy(
+                alpha = FilledAutocompleteTokens.FieldDisabledSupportingTextOpacity
+            ),
         errorPlaceholderColor: Color = FilledAutocompleteTokens.FieldSupportingTextColor.value,
         focusedPrefixColor: Color = FilledAutocompleteTokens.FieldSupportingTextColor.value,
         unfocusedPrefixColor: Color = FilledAutocompleteTokens.FieldSupportingTextColor.value,
-        disabledPrefixColor: Color = FilledAutocompleteTokens.FieldDisabledSupportingTextColor
-            .value.copy(alpha = FilledAutocompleteTokens.FieldDisabledSupportingTextOpacity),
+        disabledPrefixColor: Color =
+            FilledAutocompleteTokens.FieldDisabledSupportingTextColor.value.copy(
+                alpha = FilledAutocompleteTokens.FieldDisabledSupportingTextOpacity
+            ),
         errorPrefixColor: Color = FilledAutocompleteTokens.FieldSupportingTextColor.value,
         focusedSuffixColor: Color = FilledAutocompleteTokens.FieldSupportingTextColor.value,
         unfocusedSuffixColor: Color = FilledAutocompleteTokens.FieldSupportingTextColor.value,
-        disabledSuffixColor: Color = FilledAutocompleteTokens.FieldDisabledSupportingTextColor
-            .value.copy(alpha = FilledAutocompleteTokens.FieldDisabledSupportingTextOpacity),
+        disabledSuffixColor: Color =
+            FilledAutocompleteTokens.FieldDisabledSupportingTextColor.value.copy(
+                alpha = FilledAutocompleteTokens.FieldDisabledSupportingTextOpacity
+            ),
         errorSuffixColor: Color = FilledAutocompleteTokens.FieldSupportingTextColor.value,
     ): TextFieldColors =
         textFieldColors(
@@ -972,28 +1003,31 @@
     fun outlinedTextFieldColors(
         focusedTextColor: Color = OutlinedAutocompleteTokens.FieldFocusInputTextColor.value,
         unfocusedTextColor: Color = OutlinedAutocompleteTokens.FieldInputTextColor.value,
-        disabledTextColor: Color = OutlinedAutocompleteTokens.FieldDisabledInputTextColor.value
-            .copy(alpha = OutlinedAutocompleteTokens.FieldDisabledInputTextOpacity),
+        disabledTextColor: Color =
+            OutlinedAutocompleteTokens.FieldDisabledInputTextColor.value.copy(
+                alpha = OutlinedAutocompleteTokens.FieldDisabledInputTextOpacity
+            ),
         errorTextColor: Color = OutlinedAutocompleteTokens.FieldErrorInputTextColor.value,
         containerColor: Color = Color.Transparent,
         errorContainerColor: Color = Color.Transparent,
         cursorColor: Color = OutlinedAutocompleteTokens.TextFieldCaretColor.value,
-        errorCursorColor: Color =
-            OutlinedAutocompleteTokens.TextFieldErrorFocusCaretColor.value,
+        errorCursorColor: Color = OutlinedAutocompleteTokens.TextFieldErrorFocusCaretColor.value,
         selectionColors: TextSelectionColors = LocalTextSelectionColors.current,
         focusedBorderColor: Color = OutlinedAutocompleteTokens.TextFieldFocusOutlineColor.value,
         unfocusedBorderColor: Color = OutlinedAutocompleteTokens.TextFieldOutlineColor.value,
         disabledBorderColor: Color =
-            OutlinedAutocompleteTokens.TextFieldDisabledOutlineColor.value
-                .copy(alpha = OutlinedAutocompleteTokens.TextFieldDisabledOutlineOpacity),
+            OutlinedAutocompleteTokens.TextFieldDisabledOutlineColor.value.copy(
+                alpha = OutlinedAutocompleteTokens.TextFieldDisabledOutlineOpacity
+            ),
         errorBorderColor: Color = OutlinedAutocompleteTokens.TextFieldErrorOutlineColor.value,
         focusedLeadingIconColor: Color =
             OutlinedAutocompleteTokens.TextFieldFocusLeadingIconColor.value,
         unfocusedLeadingIconColor: Color =
             OutlinedAutocompleteTokens.TextFieldLeadingIconColor.value,
         disabledLeadingIconColor: Color =
-            OutlinedAutocompleteTokens.TextFieldDisabledLeadingIconColor.value
-                .copy(alpha = OutlinedAutocompleteTokens.TextFieldDisabledLeadingIconOpacity),
+            OutlinedAutocompleteTokens.TextFieldDisabledLeadingIconColor.value.copy(
+                alpha = OutlinedAutocompleteTokens.TextFieldDisabledLeadingIconOpacity
+            ),
         errorLeadingIconColor: Color =
             OutlinedAutocompleteTokens.TextFieldErrorLeadingIconColor.value,
         focusedTrailingIconColor: Color =
@@ -1001,33 +1035,39 @@
         unfocusedTrailingIconColor: Color =
             OutlinedAutocompleteTokens.TextFieldTrailingIconColor.value,
         disabledTrailingIconColor: Color =
-            OutlinedAutocompleteTokens.TextFieldDisabledTrailingIconColor.value
-                .copy(alpha = OutlinedAutocompleteTokens.TextFieldDisabledTrailingIconOpacity),
+            OutlinedAutocompleteTokens.TextFieldDisabledTrailingIconColor.value.copy(
+                alpha = OutlinedAutocompleteTokens.TextFieldDisabledTrailingIconOpacity
+            ),
         errorTrailingIconColor: Color =
             OutlinedAutocompleteTokens.TextFieldErrorTrailingIconColor.value,
         focusedLabelColor: Color = OutlinedAutocompleteTokens.FieldFocusLabelTextColor.value,
         unfocusedLabelColor: Color = OutlinedAutocompleteTokens.FieldLabelTextColor.value,
-        disabledLabelColor: Color = OutlinedAutocompleteTokens.FieldDisabledLabelTextColor.value
-            .copy(alpha = OutlinedAutocompleteTokens.FieldDisabledLabelTextOpacity),
+        disabledLabelColor: Color =
+            OutlinedAutocompleteTokens.FieldDisabledLabelTextColor.value.copy(
+                alpha = OutlinedAutocompleteTokens.FieldDisabledLabelTextOpacity
+            ),
         errorLabelColor: Color = OutlinedAutocompleteTokens.FieldErrorLabelTextColor.value,
-        focusedPlaceholderColor: Color =
-            OutlinedAutocompleteTokens.FieldSupportingTextColor.value,
+        focusedPlaceholderColor: Color = OutlinedAutocompleteTokens.FieldSupportingTextColor.value,
         unfocusedPlaceholderColor: Color =
             OutlinedAutocompleteTokens.FieldSupportingTextColor.value,
         disabledPlaceholderColor: Color =
-            OutlinedAutocompleteTokens.FieldDisabledSupportingTextColor.value
-                .copy(alpha = OutlinedAutocompleteTokens.FieldDisabledSupportingTextOpacity),
-        errorPlaceholderColor: Color =
-            OutlinedAutocompleteTokens.FieldSupportingTextColor.value,
+            OutlinedAutocompleteTokens.FieldDisabledSupportingTextColor.value.copy(
+                alpha = OutlinedAutocompleteTokens.FieldDisabledSupportingTextOpacity
+            ),
+        errorPlaceholderColor: Color = OutlinedAutocompleteTokens.FieldSupportingTextColor.value,
         focusedPrefixColor: Color = OutlinedAutocompleteTokens.FieldSupportingTextColor.value,
         unfocusedPrefixColor: Color = OutlinedAutocompleteTokens.FieldSupportingTextColor.value,
-        disabledPrefixColor: Color = OutlinedAutocompleteTokens.FieldDisabledSupportingTextColor
-            .value.copy(alpha = OutlinedAutocompleteTokens.FieldDisabledSupportingTextOpacity),
+        disabledPrefixColor: Color =
+            OutlinedAutocompleteTokens.FieldDisabledSupportingTextColor.value.copy(
+                alpha = OutlinedAutocompleteTokens.FieldDisabledSupportingTextOpacity
+            ),
         errorPrefixColor: Color = OutlinedAutocompleteTokens.FieldSupportingTextColor.value,
         focusedSuffixColor: Color = OutlinedAutocompleteTokens.FieldSupportingTextColor.value,
         unfocusedSuffixColor: Color = OutlinedAutocompleteTokens.FieldSupportingTextColor.value,
-        disabledSuffixColor: Color = OutlinedAutocompleteTokens.FieldDisabledSupportingTextColor
-            .value.copy(alpha = OutlinedAutocompleteTokens.FieldDisabledSupportingTextOpacity),
+        disabledSuffixColor: Color =
+            OutlinedAutocompleteTokens.FieldDisabledSupportingTextColor.value.copy(
+                alpha = OutlinedAutocompleteTokens.FieldDisabledSupportingTextOpacity
+            ),
         errorSuffixColor: Color = OutlinedAutocompleteTokens.FieldSupportingTextColor.value,
     ): TextFieldColors =
         outlinedTextFieldColors(
@@ -1076,8 +1116,10 @@
     @Composable
     fun textFieldColors(
         textColor: Color = FilledAutocompleteTokens.FieldInputTextColor.value,
-        disabledTextColor: Color = FilledAutocompleteTokens.FieldDisabledInputTextColor.value
-            .copy(alpha = FilledAutocompleteTokens.FieldDisabledInputTextOpacity),
+        disabledTextColor: Color =
+            FilledAutocompleteTokens.FieldDisabledInputTextColor.value.copy(
+                alpha = FilledAutocompleteTokens.FieldDisabledInputTextOpacity
+            ),
         containerColor: Color = FilledAutocompleteTokens.TextFieldContainerColor.value,
         cursorColor: Color = FilledAutocompleteTokens.TextFieldCaretColor.value,
         errorCursorColor: Color = FilledAutocompleteTokens.TextFieldErrorFocusCaretColor.value,
@@ -1087,17 +1129,18 @@
         unfocusedIndicatorColor: Color =
             FilledAutocompleteTokens.TextFieldActiveIndicatorColor.value,
         disabledIndicatorColor: Color =
-            FilledAutocompleteTokens.TextFieldDisabledActiveIndicatorColor.value
-                .copy(alpha = FilledAutocompleteTokens.TextFieldDisabledActiveIndicatorOpacity),
+            FilledAutocompleteTokens.TextFieldDisabledActiveIndicatorColor.value.copy(
+                alpha = FilledAutocompleteTokens.TextFieldDisabledActiveIndicatorOpacity
+            ),
         errorIndicatorColor: Color =
             FilledAutocompleteTokens.TextFieldErrorActiveIndicatorColor.value,
         focusedLeadingIconColor: Color =
             FilledAutocompleteTokens.TextFieldFocusLeadingIconColor.value,
-        unfocusedLeadingIconColor: Color =
-            FilledAutocompleteTokens.TextFieldLeadingIconColor.value,
+        unfocusedLeadingIconColor: Color = FilledAutocompleteTokens.TextFieldLeadingIconColor.value,
         disabledLeadingIconColor: Color =
-            FilledAutocompleteTokens.TextFieldDisabledLeadingIconColor.value
-                .copy(alpha = FilledAutocompleteTokens.TextFieldDisabledLeadingIconOpacity),
+            FilledAutocompleteTokens.TextFieldDisabledLeadingIconColor.value.copy(
+                alpha = FilledAutocompleteTokens.TextFieldDisabledLeadingIconOpacity
+            ),
         errorLeadingIconColor: Color =
             FilledAutocompleteTokens.TextFieldErrorLeadingIconColor.value,
         focusedTrailingIconColor: Color =
@@ -1105,8 +1148,9 @@
         unfocusedTrailingIconColor: Color =
             FilledAutocompleteTokens.TextFieldTrailingIconColor.value,
         disabledTrailingIconColor: Color =
-            FilledAutocompleteTokens.TextFieldDisabledTrailingIconColor.value
-                .copy(alpha = FilledAutocompleteTokens.TextFieldDisabledTrailingIconOpacity),
+            FilledAutocompleteTokens.TextFieldDisabledTrailingIconColor.value.copy(
+                alpha = FilledAutocompleteTokens.TextFieldDisabledTrailingIconOpacity
+            ),
         errorTrailingIconColor: Color =
             FilledAutocompleteTokens.TextFieldErrorTrailingIconColor.value,
         focusedLabelColor: Color = FilledAutocompleteTokens.FieldFocusLabelTextColor.value,
@@ -1115,76 +1159,85 @@
         errorLabelColor: Color = FilledAutocompleteTokens.FieldErrorLabelTextColor.value,
         placeholderColor: Color = FilledAutocompleteTokens.FieldSupportingTextColor.value,
         disabledPlaceholderColor: Color =
-            FilledAutocompleteTokens.FieldDisabledInputTextColor.value
-                .copy(alpha = FilledAutocompleteTokens.FieldDisabledInputTextOpacity)
-    ): TextFieldColors = textFieldColors(
-        focusedTextColor = textColor,
-        unfocusedTextColor = textColor,
-        disabledTextColor = disabledTextColor,
-        errorTextColor = textColor,
-        focusedContainerColor = containerColor,
-        unfocusedContainerColor = containerColor,
-        disabledContainerColor = containerColor,
-        errorContainerColor = containerColor,
-        cursorColor = cursorColor,
-        errorCursorColor = errorCursorColor,
-        selectionColors = selectionColors,
-        focusedIndicatorColor = focusedIndicatorColor,
-        unfocusedIndicatorColor = unfocusedIndicatorColor,
-        disabledIndicatorColor = disabledIndicatorColor,
-        errorIndicatorColor = errorIndicatorColor,
-        focusedLeadingIconColor = focusedLeadingIconColor,
-        unfocusedLeadingIconColor = unfocusedLeadingIconColor,
-        disabledLeadingIconColor = disabledLeadingIconColor,
-        errorLeadingIconColor = errorLeadingIconColor,
-        focusedTrailingIconColor = focusedTrailingIconColor,
-        unfocusedTrailingIconColor = unfocusedTrailingIconColor,
-        disabledTrailingIconColor = disabledTrailingIconColor,
-        errorTrailingIconColor = errorTrailingIconColor,
-        focusedLabelColor = focusedLabelColor,
-        unfocusedLabelColor = unfocusedLabelColor,
-        disabledLabelColor = disabledLabelColor,
-        errorLabelColor = errorLabelColor,
-        focusedPlaceholderColor = placeholderColor,
-        unfocusedPlaceholderColor = placeholderColor,
-        disabledPlaceholderColor = disabledPlaceholderColor,
-        errorPlaceholderColor = placeholderColor,
-        focusedPrefixColor = OutlinedAutocompleteTokens.FieldSupportingTextColor.value,
-        unfocusedPrefixColor = OutlinedAutocompleteTokens.FieldSupportingTextColor.value,
-        disabledPrefixColor = OutlinedAutocompleteTokens.FieldDisabledSupportingTextColor.value
-            .copy(alpha = OutlinedAutocompleteTokens.FieldDisabledSupportingTextOpacity),
-        errorPrefixColor = OutlinedAutocompleteTokens.FieldSupportingTextColor.value,
-        focusedSuffixColor = OutlinedAutocompleteTokens.FieldSupportingTextColor.value,
-        unfocusedSuffixColor = OutlinedAutocompleteTokens.FieldSupportingTextColor.value,
-        disabledSuffixColor = OutlinedAutocompleteTokens.FieldDisabledSupportingTextColor.value
-            .copy(alpha = OutlinedAutocompleteTokens.FieldDisabledSupportingTextOpacity),
-        errorSuffixColor = OutlinedAutocompleteTokens.FieldSupportingTextColor.value,
-    )
+            FilledAutocompleteTokens.FieldDisabledInputTextColor.value.copy(
+                alpha = FilledAutocompleteTokens.FieldDisabledInputTextOpacity
+            )
+    ): TextFieldColors =
+        textFieldColors(
+            focusedTextColor = textColor,
+            unfocusedTextColor = textColor,
+            disabledTextColor = disabledTextColor,
+            errorTextColor = textColor,
+            focusedContainerColor = containerColor,
+            unfocusedContainerColor = containerColor,
+            disabledContainerColor = containerColor,
+            errorContainerColor = containerColor,
+            cursorColor = cursorColor,
+            errorCursorColor = errorCursorColor,
+            selectionColors = selectionColors,
+            focusedIndicatorColor = focusedIndicatorColor,
+            unfocusedIndicatorColor = unfocusedIndicatorColor,
+            disabledIndicatorColor = disabledIndicatorColor,
+            errorIndicatorColor = errorIndicatorColor,
+            focusedLeadingIconColor = focusedLeadingIconColor,
+            unfocusedLeadingIconColor = unfocusedLeadingIconColor,
+            disabledLeadingIconColor = disabledLeadingIconColor,
+            errorLeadingIconColor = errorLeadingIconColor,
+            focusedTrailingIconColor = focusedTrailingIconColor,
+            unfocusedTrailingIconColor = unfocusedTrailingIconColor,
+            disabledTrailingIconColor = disabledTrailingIconColor,
+            errorTrailingIconColor = errorTrailingIconColor,
+            focusedLabelColor = focusedLabelColor,
+            unfocusedLabelColor = unfocusedLabelColor,
+            disabledLabelColor = disabledLabelColor,
+            errorLabelColor = errorLabelColor,
+            focusedPlaceholderColor = placeholderColor,
+            unfocusedPlaceholderColor = placeholderColor,
+            disabledPlaceholderColor = disabledPlaceholderColor,
+            errorPlaceholderColor = placeholderColor,
+            focusedPrefixColor = OutlinedAutocompleteTokens.FieldSupportingTextColor.value,
+            unfocusedPrefixColor = OutlinedAutocompleteTokens.FieldSupportingTextColor.value,
+            disabledPrefixColor =
+                OutlinedAutocompleteTokens.FieldDisabledSupportingTextColor.value.copy(
+                    alpha = OutlinedAutocompleteTokens.FieldDisabledSupportingTextOpacity
+                ),
+            errorPrefixColor = OutlinedAutocompleteTokens.FieldSupportingTextColor.value,
+            focusedSuffixColor = OutlinedAutocompleteTokens.FieldSupportingTextColor.value,
+            unfocusedSuffixColor = OutlinedAutocompleteTokens.FieldSupportingTextColor.value,
+            disabledSuffixColor =
+                OutlinedAutocompleteTokens.FieldDisabledSupportingTextColor.value.copy(
+                    alpha = OutlinedAutocompleteTokens.FieldDisabledSupportingTextOpacity
+                ),
+            errorSuffixColor = OutlinedAutocompleteTokens.FieldSupportingTextColor.value,
+        )
 
     @Deprecated("Maintained for binary compatibility", level = DeprecationLevel.HIDDEN)
     @Composable
     fun outlinedTextFieldColors(
         textColor: Color = OutlinedAutocompleteTokens.FieldInputTextColor.value,
-        disabledTextColor: Color = OutlinedAutocompleteTokens.FieldDisabledInputTextColor.value
-            .copy(alpha = OutlinedAutocompleteTokens.FieldDisabledInputTextOpacity),
+        disabledTextColor: Color =
+            OutlinedAutocompleteTokens.FieldDisabledInputTextColor.value.copy(
+                alpha = OutlinedAutocompleteTokens.FieldDisabledInputTextOpacity
+            ),
         containerColor: Color = Color.Transparent,
         cursorColor: Color = OutlinedAutocompleteTokens.TextFieldCaretColor.value,
-        errorCursorColor: Color =
-            OutlinedAutocompleteTokens.TextFieldErrorFocusCaretColor.value,
+        errorCursorColor: Color = OutlinedAutocompleteTokens.TextFieldErrorFocusCaretColor.value,
         selectionColors: TextSelectionColors = LocalTextSelectionColors.current,
         focusedBorderColor: Color = OutlinedAutocompleteTokens.TextFieldFocusOutlineColor.value,
         unfocusedBorderColor: Color = OutlinedAutocompleteTokens.TextFieldOutlineColor.value,
         disabledBorderColor: Color =
-            OutlinedAutocompleteTokens.TextFieldDisabledOutlineColor.value
-                .copy(alpha = OutlinedAutocompleteTokens.TextFieldDisabledOutlineOpacity),
+            OutlinedAutocompleteTokens.TextFieldDisabledOutlineColor.value.copy(
+                alpha = OutlinedAutocompleteTokens.TextFieldDisabledOutlineOpacity
+            ),
         errorBorderColor: Color = OutlinedAutocompleteTokens.TextFieldErrorOutlineColor.value,
         focusedLeadingIconColor: Color =
             OutlinedAutocompleteTokens.TextFieldFocusLeadingIconColor.value,
         unfocusedLeadingIconColor: Color =
             OutlinedAutocompleteTokens.TextFieldLeadingIconColor.value,
         disabledLeadingIconColor: Color =
-            OutlinedAutocompleteTokens.TextFieldDisabledLeadingIconColor.value
-                .copy(alpha = OutlinedAutocompleteTokens.TextFieldDisabledLeadingIconOpacity),
+            OutlinedAutocompleteTokens.TextFieldDisabledLeadingIconColor.value.copy(
+                alpha = OutlinedAutocompleteTokens.TextFieldDisabledLeadingIconOpacity
+            ),
         errorLeadingIconColor: Color =
             OutlinedAutocompleteTokens.TextFieldErrorLeadingIconColor.value,
         focusedTrailingIconColor: Color =
@@ -1192,62 +1245,71 @@
         unfocusedTrailingIconColor: Color =
             OutlinedAutocompleteTokens.TextFieldTrailingIconColor.value,
         disabledTrailingIconColor: Color =
-            OutlinedAutocompleteTokens.TextFieldDisabledTrailingIconColor.value
-                .copy(alpha = OutlinedAutocompleteTokens.TextFieldDisabledTrailingIconOpacity),
+            OutlinedAutocompleteTokens.TextFieldDisabledTrailingIconColor.value.copy(
+                alpha = OutlinedAutocompleteTokens.TextFieldDisabledTrailingIconOpacity
+            ),
         errorTrailingIconColor: Color =
             OutlinedAutocompleteTokens.TextFieldErrorTrailingIconColor.value,
         focusedLabelColor: Color = OutlinedAutocompleteTokens.FieldFocusLabelTextColor.value,
         unfocusedLabelColor: Color = OutlinedAutocompleteTokens.FieldLabelTextColor.value,
-        disabledLabelColor: Color = OutlinedAutocompleteTokens.FieldDisabledLabelTextColor.value
-            .copy(alpha = OutlinedAutocompleteTokens.FieldDisabledLabelTextOpacity),
+        disabledLabelColor: Color =
+            OutlinedAutocompleteTokens.FieldDisabledLabelTextColor.value.copy(
+                alpha = OutlinedAutocompleteTokens.FieldDisabledLabelTextOpacity
+            ),
         errorLabelColor: Color = OutlinedAutocompleteTokens.FieldErrorLabelTextColor.value,
         placeholderColor: Color = OutlinedAutocompleteTokens.FieldSupportingTextColor.value,
         disabledPlaceholderColor: Color =
-            OutlinedAutocompleteTokens.FieldDisabledInputTextColor.value
-                .copy(alpha = OutlinedAutocompleteTokens.FieldDisabledInputTextOpacity)
-    ): TextFieldColors = outlinedTextFieldColors(
-        focusedTextColor = textColor,
-        unfocusedTextColor = textColor,
-        disabledTextColor = disabledTextColor,
-        errorTextColor = textColor,
-        focusedContainerColor = containerColor,
-        unfocusedContainerColor = containerColor,
-        disabledContainerColor = containerColor,
-        errorContainerColor = containerColor,
-        cursorColor = cursorColor,
-        errorCursorColor = errorCursorColor,
-        selectionColors = selectionColors,
-        focusedBorderColor = focusedBorderColor,
-        unfocusedBorderColor = unfocusedBorderColor,
-        disabledBorderColor = disabledBorderColor,
-        errorBorderColor = errorBorderColor,
-        focusedLeadingIconColor = focusedLeadingIconColor,
-        unfocusedLeadingIconColor = unfocusedLeadingIconColor,
-        disabledLeadingIconColor = disabledLeadingIconColor,
-        errorLeadingIconColor = errorLeadingIconColor,
-        focusedTrailingIconColor = focusedTrailingIconColor,
-        unfocusedTrailingIconColor = unfocusedTrailingIconColor,
-        disabledTrailingIconColor = disabledTrailingIconColor,
-        errorTrailingIconColor = errorTrailingIconColor,
-        focusedLabelColor = focusedLabelColor,
-        unfocusedLabelColor = unfocusedLabelColor,
-        disabledLabelColor = disabledLabelColor,
-        errorLabelColor = errorLabelColor,
-        focusedPlaceholderColor = placeholderColor,
-        unfocusedPlaceholderColor = placeholderColor,
-        disabledPlaceholderColor = disabledPlaceholderColor,
-        errorPlaceholderColor = placeholderColor,
-        focusedPrefixColor = OutlinedAutocompleteTokens.FieldSupportingTextColor.value,
-        unfocusedPrefixColor = OutlinedAutocompleteTokens.FieldSupportingTextColor.value,
-        disabledPrefixColor = OutlinedAutocompleteTokens.FieldDisabledSupportingTextColor.value
-            .copy(alpha = OutlinedAutocompleteTokens.FieldDisabledSupportingTextOpacity),
-        errorPrefixColor = OutlinedAutocompleteTokens.FieldSupportingTextColor.value,
-        focusedSuffixColor = OutlinedAutocompleteTokens.FieldSupportingTextColor.value,
-        unfocusedSuffixColor = OutlinedAutocompleteTokens.FieldSupportingTextColor.value,
-        disabledSuffixColor = OutlinedAutocompleteTokens.FieldDisabledSupportingTextColor.value
-            .copy(alpha = OutlinedAutocompleteTokens.FieldDisabledSupportingTextOpacity),
-        errorSuffixColor = OutlinedAutocompleteTokens.FieldSupportingTextColor.value,
-    )
+            OutlinedAutocompleteTokens.FieldDisabledInputTextColor.value.copy(
+                alpha = OutlinedAutocompleteTokens.FieldDisabledInputTextOpacity
+            )
+    ): TextFieldColors =
+        outlinedTextFieldColors(
+            focusedTextColor = textColor,
+            unfocusedTextColor = textColor,
+            disabledTextColor = disabledTextColor,
+            errorTextColor = textColor,
+            focusedContainerColor = containerColor,
+            unfocusedContainerColor = containerColor,
+            disabledContainerColor = containerColor,
+            errorContainerColor = containerColor,
+            cursorColor = cursorColor,
+            errorCursorColor = errorCursorColor,
+            selectionColors = selectionColors,
+            focusedBorderColor = focusedBorderColor,
+            unfocusedBorderColor = unfocusedBorderColor,
+            disabledBorderColor = disabledBorderColor,
+            errorBorderColor = errorBorderColor,
+            focusedLeadingIconColor = focusedLeadingIconColor,
+            unfocusedLeadingIconColor = unfocusedLeadingIconColor,
+            disabledLeadingIconColor = disabledLeadingIconColor,
+            errorLeadingIconColor = errorLeadingIconColor,
+            focusedTrailingIconColor = focusedTrailingIconColor,
+            unfocusedTrailingIconColor = unfocusedTrailingIconColor,
+            disabledTrailingIconColor = disabledTrailingIconColor,
+            errorTrailingIconColor = errorTrailingIconColor,
+            focusedLabelColor = focusedLabelColor,
+            unfocusedLabelColor = unfocusedLabelColor,
+            disabledLabelColor = disabledLabelColor,
+            errorLabelColor = errorLabelColor,
+            focusedPlaceholderColor = placeholderColor,
+            unfocusedPlaceholderColor = placeholderColor,
+            disabledPlaceholderColor = disabledPlaceholderColor,
+            errorPlaceholderColor = placeholderColor,
+            focusedPrefixColor = OutlinedAutocompleteTokens.FieldSupportingTextColor.value,
+            unfocusedPrefixColor = OutlinedAutocompleteTokens.FieldSupportingTextColor.value,
+            disabledPrefixColor =
+                OutlinedAutocompleteTokens.FieldDisabledSupportingTextColor.value.copy(
+                    alpha = OutlinedAutocompleteTokens.FieldDisabledSupportingTextOpacity
+                ),
+            errorPrefixColor = OutlinedAutocompleteTokens.FieldSupportingTextColor.value,
+            focusedSuffixColor = OutlinedAutocompleteTokens.FieldSupportingTextColor.value,
+            unfocusedSuffixColor = OutlinedAutocompleteTokens.FieldSupportingTextColor.value,
+            disabledSuffixColor =
+                OutlinedAutocompleteTokens.FieldDisabledSupportingTextColor.value.copy(
+                    alpha = OutlinedAutocompleteTokens.FieldDisabledSupportingTextOpacity
+                ),
+            errorSuffixColor = OutlinedAutocompleteTokens.FieldSupportingTextColor.value,
+        )
 }
 
 @Stable
@@ -1287,48 +1349,56 @@
         @Suppress("NAME_SHADOWING")
         val windowSize = IntSize(windowSize.width, windowSize.height + topWindowInsets)
 
-        val xCandidates = listOf(
-            startToAnchorStart,
-            endToAnchorEnd,
-            if (anchorBounds.center.x < windowSize.width / 2) {
-                leftToWindowLeft
-            } else {
-                rightToWindowRight
-            }
-        )
+        val xCandidates =
+            listOf(
+                startToAnchorStart,
+                endToAnchorEnd,
+                if (anchorBounds.center.x < windowSize.width / 2) {
+                    leftToWindowLeft
+                } else {
+                    rightToWindowRight
+                }
+            )
         var x = 0
         for (index in xCandidates.indices) {
-            val xCandidate = xCandidates[index].position(
-                anchorBounds = anchorBounds,
-                windowSize = windowSize,
-                menuWidth = popupContentSize.width,
-                layoutDirection = layoutDirection
-            )
-            if (index == xCandidates.lastIndex ||
-                (xCandidate >= 0 && xCandidate + popupContentSize.width <= windowSize.width)) {
+            val xCandidate =
+                xCandidates[index].position(
+                    anchorBounds = anchorBounds,
+                    windowSize = windowSize,
+                    menuWidth = popupContentSize.width,
+                    layoutDirection = layoutDirection
+                )
+            if (
+                index == xCandidates.lastIndex ||
+                    (xCandidate >= 0 && xCandidate + popupContentSize.width <= windowSize.width)
+            ) {
                 x = xCandidate
                 break
             }
         }
 
-        val yCandidates = listOf(
-            topToAnchorBottom,
-            bottomToAnchorTop,
-            if (anchorBounds.center.y < windowSize.height / 2) {
-                topToWindowTop
-            } else {
-                bottomToWindowBottom
-            }
-        )
+        val yCandidates =
+            listOf(
+                topToAnchorBottom,
+                bottomToAnchorTop,
+                if (anchorBounds.center.y < windowSize.height / 2) {
+                    topToWindowTop
+                } else {
+                    bottomToWindowBottom
+                }
+            )
         var y = 0
         for (index in yCandidates.indices) {
-            val yCandidate = yCandidates[index].position(
-                anchorBounds = anchorBounds,
-                windowSize = windowSize,
-                menuHeight = popupContentSize.height
-            )
-            if (index == yCandidates.lastIndex ||
-                (yCandidate >= 0 && yCandidate + popupContentSize.height <= windowSize.height)) {
+            val yCandidate =
+                yCandidates[index].position(
+                    anchorBounds = anchorBounds,
+                    windowSize = windowSize,
+                    menuHeight = popupContentSize.height
+                )
+            if (
+                index == yCandidates.lastIndex ||
+                    (yCandidate >= 0 && yCandidate + popupContentSize.height <= windowSize.height)
+            ) {
                 y = yCandidate
                 break
             }
@@ -1336,8 +1406,8 @@
 
         val menuOffset = IntOffset(x, y)
         onPositionCalculated(
-            /* anchorBounds = */anchorBounds,
-            /* menuBounds = */IntRect(offset = menuOffset, size = popupContentSize)
+            /* anchorBounds = */ anchorBounds,
+            /* menuBounds = */ IntRect(offset = menuOffset, size = popupContentSize)
         )
         return menuOffset
     }
@@ -1351,36 +1421,38 @@
     collapsedDescription: String,
     toggleDescription: String,
     keyboardController: SoftwareKeyboardController?,
-) = pointerInput(onExpandedChange) {
-    awaitEachGesture {
-        // Modifier.clickable doesn't work for text fields, so we use Modifier.pointerInput
-        // in the Initial pass to observe events before the text field consumes them
-        // in the Main pass.
-        val downEvent = awaitFirstDown(pass = PointerEventPass.Initial)
-        if (anchorType == MenuAnchorType.SecondaryEditable) {
-            downEvent.consume()
+) =
+    pointerInput(onExpandedChange) {
+            awaitEachGesture {
+                // Modifier.clickable doesn't work for text fields, so we use Modifier.pointerInput
+                // in the Initial pass to observe events before the text field consumes them
+                // in the Main pass.
+                val downEvent = awaitFirstDown(pass = PointerEventPass.Initial)
+                if (anchorType == MenuAnchorType.SecondaryEditable) {
+                    downEvent.consume()
+                }
+                val upEvent = waitForUpOrCancellation(pass = PointerEventPass.Initial)
+                if (upEvent != null) {
+                    onExpandedChange()
+                }
+            }
         }
-        val upEvent = waitForUpOrCancellation(pass = PointerEventPass.Initial)
-        if (upEvent != null) {
-            onExpandedChange()
+        .semantics {
+            if (anchorType == MenuAnchorType.SecondaryEditable) {
+                role = Role.Button
+                stateDescription = if (expanded) expandedDescription else collapsedDescription
+                contentDescription = toggleDescription
+            } else {
+                role = Role.DropdownList
+            }
+            onClick {
+                onExpandedChange()
+                if (anchorType == MenuAnchorType.PrimaryEditable) {
+                    keyboardController?.show()
+                }
+                true
+            }
         }
-    }
-}.semantics {
-    if (anchorType == MenuAnchorType.SecondaryEditable) {
-        role = Role.Button
-        stateDescription = if (expanded) expandedDescription else collapsedDescription
-        contentDescription = toggleDescription
-    } else {
-        role = Role.DropdownList
-    }
-    onClick {
-        onExpandedChange()
-        if (anchorType == MenuAnchorType.PrimaryEditable) {
-            keyboardController?.show()
-        }
-        true
-    }
-}
 
 private fun calculateMaxHeight(
     windowBounds: Rect,
@@ -1403,10 +1475,11 @@
     return max(availableHeight, 0)
 }
 
-private fun View.getWindowBounds(): Rect = ViewRect().let {
-    this.getWindowVisibleDisplayFrame(it)
-    it.toComposeRect()
-}
+private fun View.getWindowBounds(): Rect =
+    ViewRect().let {
+        this.getWindowVisibleDisplayFrame(it)
+        it.toComposeRect()
+    }
 
 private fun LayoutCoordinates?.getAnchorBounds(): Rect {
     // Don't use `boundsInWindow()` because it can report 0 when the window is animating/resizing
diff --git a/compose/material3/material3/src/androidMain/kotlin/androidx/compose/material3/ModalBottomSheet.android.kt b/compose/material3/material3/src/androidMain/kotlin/androidx/compose/material3/ModalBottomSheet.android.kt
index c5d45f9..0699da5 100644
--- a/compose/material3/material3/src/androidMain/kotlin/androidx/compose/material3/ModalBottomSheet.android.kt
+++ b/compose/material3/material3/src/androidMain/kotlin/androidx/compose/material3/ModalBottomSheet.android.kt
@@ -89,9 +89,9 @@
  * Properties used to customize the behavior of a [ModalBottomSheet].
  *
  * @param securePolicy Policy for setting [WindowManager.LayoutParams.FLAG_SECURE] on the bottom
- * sheet's window.
- * @param shouldDismissOnBackPress Whether the modal bottom sheet can be dismissed by pressing
- * the back button. If true, pressing the back button will call onDismissRequest.
+ *   sheet's window.
+ * @param shouldDismissOnBackPress Whether the modal bottom sheet can be dismissed by pressing the
+ *   back button. If true, pressing the back button will call onDismissRequest.
  */
 @Immutable
 @ExperimentalMaterial3Api
@@ -109,9 +109,8 @@
     @Deprecated(
         message = "'isFocusable' param is no longer used. Use constructor without this parameter.",
         level = DeprecationLevel.WARNING,
-        replaceWith = ReplaceWith(
-            "ModalBottomSheetProperties(securePolicy, shouldDismissOnBackPress)"
-        )
+        replaceWith =
+            ReplaceWith("ModalBottomSheetProperties(securePolicy, shouldDismissOnBackPress)")
     )
     @Suppress("UNUSED_PARAMETER")
     constructor(
@@ -135,29 +134,25 @@
     }
 }
 
-/**
- * Default values for [ModalBottomSheet]
- */
+/** Default values for [ModalBottomSheet] */
 @Immutable
 @ExperimentalMaterial3Api
 actual object ModalBottomSheetDefaults {
 
-    /**
-     * Properties used to customize the behavior of a [ModalBottomSheet]. */
+    /** Properties used to customize the behavior of a [ModalBottomSheet]. */
     actual val properties = ModalBottomSheetProperties()
 
     /**
      * Properties used to customize the behavior of a [ModalBottomSheet].
      *
      * @param securePolicy Policy for setting [WindowManager.LayoutParams.FLAG_SECURE] on the bottom
-     * sheet's window.
-     * @param isFocusable Whether the modal bottom sheet is focusable. When true,
-     * the modal bottom sheet will receive IME events and key presses, such as when
-     * the back button is pressed.
+     *   sheet's window.
+     * @param isFocusable Whether the modal bottom sheet is focusable. When true, the modal bottom
+     *   sheet will receive IME events and key presses, such as when the back button is pressed.
      * @param shouldDismissOnBackPress Whether the modal bottom sheet can be dismissed by pressing
-     * the back button. If true, pressing the back button will call onDismissRequest.
-     * Note that [isFocusable] must be set to true in order to receive key events such as
-     * the back button - if the modal bottom sheet is not focusable then this property does nothing.
+     *   the back button. If true, pressing the back button will call onDismissRequest. Note that
+     *   [isFocusable] must be set to true in order to receive key events such as the back button -
+     *   if the modal bottom sheet is not focusable then this property does nothing.
      */
     @Deprecated(
         level = DeprecationLevel.WARNING,
@@ -173,7 +168,8 @@
 }
 
 /**
- * <a href="https://m3.material.io/components/bottom-sheets/overview" class="external" target="_blank">Material Design modal bottom sheet</a>.
+ * <a href="https://m3.material.io/components/bottom-sheets/overview" class="external"
+ * target="_blank">Material Design modal bottom sheet</a>.
  *
  * Modal bottom sheets are used as an alternative to inline menus or simple dialogs on mobile,
  * especially when offering a long list of action items, or when items require longer descriptions
@@ -181,32 +177,33 @@
  * app functionality when they appear, and remaining on screen until confirmed, dismissed, or a
  * required action has been taken.
  *
- * ![Bottom sheet image](https://developer.android.com/images/reference/androidx/compose/material3/bottom_sheet.png)
+ * ![Bottom sheet
+ * image](https://developer.android.com/images/reference/androidx/compose/material3/bottom_sheet.png)
  *
  * A simple example of a modal bottom sheet looks like this:
  *
  * @sample androidx.compose.material3.samples.ModalBottomSheetSample
  *
  * @param onDismissRequest Executes when the user clicks outside of the bottom sheet, after sheet
- * animates to [Hidden].
+ *   animates to [Hidden].
  * @param modifier Optional [Modifier] for the bottom sheet.
  * @param sheetState The state of the bottom sheet.
- * @param sheetMaxWidth [Dp] that defines what the maximum width the sheet will take.
- * Pass in [Dp.Unspecified] for a sheet that spans the entire screen width.
+ * @param sheetMaxWidth [Dp] that defines what the maximum width the sheet will take. Pass in
+ *   [Dp.Unspecified] for a sheet that spans the entire screen width.
  * @param shape The shape of the bottom sheet.
  * @param containerColor The color used for the background of this bottom sheet
  * @param contentColor The preferred color for content inside this bottom sheet. Defaults to either
- * the matching content color for [containerColor], or to the current [LocalContentColor] if
- * [containerColor] is not a color from the theme.
+ *   the matching content color for [containerColor], or to the current [LocalContentColor] if
+ *   [containerColor] is not a color from the theme.
  * @param tonalElevation when [containerColor] is [ColorScheme.surface], a translucent primary color
- * overlay is applied on top of the container. A higher tonal elevation value will result in a
- * darker color in light theme and lighter color in dark theme. See also: [Surface].
+ *   overlay is applied on top of the container. A higher tonal elevation value will result in a
+ *   darker color in light theme and lighter color in dark theme. See also: [Surface].
  * @param scrimColor Color of the scrim that obscures content when the bottom sheet is open.
  * @param dragHandle Optional visual marker to swipe the bottom sheet.
  * @param windowInsets window insets to be passed to the bottom sheet content via [PaddingValues]
- * params.
- * @param properties [ModalBottomSheetProperties] for further customization of this
- * modal bottom sheet's window behavior.
+ *   params.
+ * @param properties [ModalBottomSheetProperties] for further customization of this modal bottom
+ *   sheet's window behavior.
  * @param content The content to be displayed inside the bottom sheet.
  */
 @Composable
@@ -214,22 +211,24 @@
 @Deprecated(
     level = DeprecationLevel.HIDDEN,
     message = "Use constructor with contentWindowInsets parameter.",
-    replaceWith = ReplaceWith(
-        "ModalBottomSheet(" +
-            "onDismissRequest," +
-            "modifier," +
-            "sheetState," +
-            "sheetMaxWidth," +
-            "shape," +
-            "containerColor," +
-            "contentColor," +
-            "tonalElevation," +
-            "scrimColor," +
-            "dragHandle," +
-            "{ windowInsets }," +
-            "properties," +
-            "content," +
-            ")")
+    replaceWith =
+        ReplaceWith(
+            "ModalBottomSheet(" +
+                "onDismissRequest," +
+                "modifier," +
+                "sheetState," +
+                "sheetMaxWidth," +
+                "shape," +
+                "containerColor," +
+                "contentColor," +
+                "tonalElevation," +
+                "scrimColor," +
+                "dragHandle," +
+                "{ windowInsets }," +
+                "properties," +
+                "content," +
+                ")"
+        )
 )
 fun ModalBottomSheet(
     onDismissRequest: () -> Unit,
@@ -245,21 +244,22 @@
     windowInsets: WindowInsets = BottomSheetDefaults.windowInsets,
     properties: ModalBottomSheetProperties = ModalBottomSheetDefaults.properties,
     content: @Composable ColumnScope.() -> Unit,
-) = ModalBottomSheet(
-    onDismissRequest = onDismissRequest,
-    modifier = modifier,
-    sheetState = sheetState,
-    sheetMaxWidth = sheetMaxWidth,
-    shape = shape,
-    containerColor = containerColor,
-    contentColor = contentColor,
-    tonalElevation = tonalElevation,
-    scrimColor = scrimColor,
-    dragHandle = dragHandle,
-    contentWindowInsets = { windowInsets },
-    properties = properties,
-    content = content,
-)
+) =
+    ModalBottomSheet(
+        onDismissRequest = onDismissRequest,
+        modifier = modifier,
+        sheetState = sheetState,
+        sheetMaxWidth = sheetMaxWidth,
+        shape = shape,
+        containerColor = containerColor,
+        contentColor = contentColor,
+        tonalElevation = tonalElevation,
+        scrimColor = scrimColor,
+        dragHandle = dragHandle,
+        contentWindowInsets = { windowInsets },
+        properties = properties,
+        content = content,
+    )
 
 // Fork of androidx.compose.ui.window.AndroidDialog_androidKt.Dialog
 // Added predictiveBackProgress param to pass into BottomSheetDialogWrapper.
@@ -279,27 +279,29 @@
     val dialogId = rememberSaveable { UUID.randomUUID() }
     val scope = rememberCoroutineScope()
     val darkThemeEnabled = isSystemInDarkTheme()
-    val dialog = remember(view, density) {
-        ModalBottomSheetDialogWrapper(
-            onDismissRequest,
-            properties,
-            view,
-            layoutDirection,
-            density,
-            dialogId,
-            predictiveBackProgress,
-            scope,
-            darkThemeEnabled,
-        ).apply {
-            setContent(composition) {
-                Box(
-                    Modifier.semantics { dialog() },
-                ) {
-                    currentContent()
+    val dialog =
+        remember(view, density) {
+            ModalBottomSheetDialogWrapper(
+                    onDismissRequest,
+                    properties,
+                    view,
+                    layoutDirection,
+                    density,
+                    dialogId,
+                    predictiveBackProgress,
+                    scope,
+                    darkThemeEnabled,
+                )
+                .apply {
+                    setContent(composition) {
+                        Box(
+                            Modifier.semantics { dialog() },
+                        ) {
+                            currentContent()
+                        }
+                    }
                 }
-            }
         }
-    }
 
     DisposableEffect(dialog) {
         dialog.show()
@@ -370,11 +372,12 @@
             return
         }
         if (backCallback == null) {
-            backCallback = if (Build.VERSION.SDK_INT >= 34) {
-                Api34Impl.createBackCallback(onDismissRequest, predictiveBackProgress, scope)
-            } else {
-                Api33Impl.createBackCallback(onDismissRequest)
-            }
+            backCallback =
+                if (Build.VERSION.SDK_INT >= 34) {
+                    Api34Impl.createBackCallback(onDismissRequest, predictiveBackProgress, scope)
+                } else {
+                    Api33Impl.createBackCallback(onDismissRequest)
+                }
         }
         Api33Impl.maybeRegisterBackCallback(this, backCallback)
     }
@@ -429,10 +432,12 @@
         @DoNotInline
         fun maybeRegisterBackCallback(view: View, backCallback: Any?) {
             if (backCallback is OnBackInvokedCallback) {
-                view.findOnBackInvokedDispatcher()?.registerOnBackInvokedCallback(
-                    OnBackInvokedDispatcher.PRIORITY_OVERLAY,
-                    backCallback
-                )
+                view
+                    .findOnBackInvokedDispatcher()
+                    ?.registerOnBackInvokedCallback(
+                        OnBackInvokedDispatcher.PRIORITY_OVERLAY,
+                        backCallback
+                    )
             }
         }
 
@@ -460,12 +465,14 @@
     predictiveBackProgress: Animatable<Float, AnimationVector1D>,
     scope: CoroutineScope,
     darkThemeEnabled: Boolean,
-) : ComponentDialog(
-    ContextThemeWrapper(
-        composeView.context,
-        androidx.compose.material3.R.style.EdgeToEdgeFloatingDialogWindowTheme
-    )
-), ViewRootForInspector {
+) :
+    ComponentDialog(
+        ContextThemeWrapper(
+            composeView.context,
+            androidx.compose.material3.R.style.EdgeToEdgeFloatingDialogWindowTheme
+        )
+    ),
+    ViewRootForInspector {
 
     private val dialogLayout: ModalBottomSheetDialogLayout
 
@@ -473,42 +480,51 @@
     // elevation, so high values of maxSupportedElevation break accessibility services: b/232788477.
     private val maxSupportedElevation = 8.dp
 
-    override val subCompositionView: AbstractComposeView get() = dialogLayout
+    override val subCompositionView: AbstractComposeView
+        get() = dialogLayout
 
     init {
         val window = window ?: error("Dialog has no window")
         window.requestFeature(Window.FEATURE_NO_TITLE)
         window.setBackgroundDrawableResource(android.R.color.transparent)
         WindowCompat.setDecorFitsSystemWindows(window, false)
-        dialogLayout = ModalBottomSheetDialogLayout(
-            context,
-            window,
-            properties.shouldDismissOnBackPress,
-            onDismissRequest,
-            predictiveBackProgress,
-            scope,
-        ).apply {
-            // Set unique id for AbstractComposeView. This allows state restoration for the state
-            // defined inside the Dialog via rememberSaveable()
-            setTag(R.id.compose_view_saveable_id_tag, "Dialog:$dialogId")
-            // Enable children to draw their shadow by not clipping them
-            clipChildren = false
-            // Allocate space for elevation
-            with(density) { elevation = maxSupportedElevation.toPx() }
-            // Simple outline to force window manager to allocate space for shadow.
-            // Note that the outline affects clickable area for the dismiss listener. In case of
-            // shapes like circle the area for dismiss might be to small (rectangular outline
-            // consuming clicks outside of the circle).
-            outlineProvider = object : ViewOutlineProvider() {
-                override fun getOutline(view: View, result: Outline) {
-                    result.setRect(0, 0, view.width, view.height)
-                    // We set alpha to 0 to hide the view's shadow and let the composable to draw
-                    // its own shadow. This still enables us to get the extra space needed in the
-                    // surface.
-                    result.alpha = 0f
+        dialogLayout =
+            ModalBottomSheetDialogLayout(
+                    context,
+                    window,
+                    properties.shouldDismissOnBackPress,
+                    onDismissRequest,
+                    predictiveBackProgress,
+                    scope,
+                )
+                .apply {
+                    // Set unique id for AbstractComposeView. This allows state restoration for the
+                    // state
+                    // defined inside the Dialog via rememberSaveable()
+                    setTag(R.id.compose_view_saveable_id_tag, "Dialog:$dialogId")
+                    // Enable children to draw their shadow by not clipping them
+                    clipChildren = false
+                    // Allocate space for elevation
+                    with(density) { elevation = maxSupportedElevation.toPx() }
+                    // Simple outline to force window manager to allocate space for shadow.
+                    // Note that the outline affects clickable area for the dismiss listener. In
+                    // case of
+                    // shapes like circle the area for dismiss might be to small (rectangular
+                    // outline
+                    // consuming clicks outside of the circle).
+                    outlineProvider =
+                        object : ViewOutlineProvider() {
+                            override fun getOutline(view: View, result: Outline) {
+                                result.setRect(0, 0, view.width, view.height)
+                                // We set alpha to 0 to hide the view's shadow and let the
+                                // composable to draw
+                                // its own shadow. This still enables us to get the extra space
+                                // needed in the
+                                // surface.
+                                result.alpha = 0f
+                            }
+                        }
                 }
-            }
-        }
         // Clipping logic removed because we are spanning edge to edge.
 
         setContentView(dialogLayout)
@@ -538,10 +554,11 @@
     }
 
     private fun setLayoutDirection(layoutDirection: LayoutDirection) {
-        dialogLayout.layoutDirection = when (layoutDirection) {
-            LayoutDirection.Ltr -> android.util.LayoutDirection.LTR
-            LayoutDirection.Rtl -> android.util.LayoutDirection.RTL
-        }
+        dialogLayout.layoutDirection =
+            when (layoutDirection) {
+                LayoutDirection.Ltr -> android.util.LayoutDirection.LTR
+                LayoutDirection.Rtl -> android.util.LayoutDirection.RTL
+            }
     }
 
     fun setContent(parentComposition: CompositionContext, children: @Composable () -> Unit) {
@@ -580,8 +597,7 @@
             if (Build.VERSION.SDK_INT >= 30) {
                 WindowManager.LayoutParams.SOFT_INPUT_ADJUST_NOTHING
             } else {
-                @Suppress("DEPRECATION")
-                WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE
+                @Suppress("DEPRECATION") WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE
             },
         )
     }
diff --git a/compose/material3/material3/src/androidMain/kotlin/androidx/compose/material3/NavigationDrawer.android.kt b/compose/material3/material3/src/androidMain/kotlin/androidx/compose/material3/NavigationDrawer.android.kt
index 535c610..d214bbd 100644
--- a/compose/material3/material3/src/androidMain/kotlin/androidx/compose/material3/NavigationDrawer.android.kt
+++ b/compose/material3/material3/src/androidMain/kotlin/androidx/compose/material3/NavigationDrawer.android.kt
@@ -77,7 +77,9 @@
                     animate(
                         initialValue = drawerPredictiveBackState.scaleXDistance,
                         targetValue = 0f
-                    ) { value, _ -> drawerPredictiveBackState.scaleXDistance = value }
+                    ) { value, _ ->
+                        drawerPredictiveBackState.scaleXDistance = value
+                    }
                     drawerPredictiveBackState.clear()
                 }
             }
diff --git a/compose/material3/material3/src/androidMain/kotlin/androidx/compose/material3/SearchBar.android.kt b/compose/material3/material3/src/androidMain/kotlin/androidx/compose/material3/SearchBar.android.kt
index 41750ae..6ae99a5 100644
--- a/compose/material3/material3/src/androidMain/kotlin/androidx/compose/material3/SearchBar.android.kt
+++ b/compose/material3/material3/src/androidMain/kotlin/androidx/compose/material3/SearchBar.android.kt
@@ -119,7 +119,8 @@
 import kotlinx.coroutines.delay
 
 /**
- * <a href="https://m3.material.io/components/search/overview" class="external" target="_blank">Material Design search</a>.
+ * <a href="https://m3.material.io/components/search/overview" class="external"
+ * target="_blank">Material Design search</a>.
  *
  * A search bar represents a floating search field that allows users to enter a keyword or phrase
  * and get relevant information. It can be used as a way to navigate through an app via search
@@ -128,7 +129,8 @@
  * A search bar expands into a search "view" and can be used to display dynamic suggestions or
  * search results.
  *
- * ![Search bar image](https://developer.android.com/images/reference/androidx/compose/material3/search-bar.png)
+ * ![Search bar
+ * image](https://developer.android.com/images/reference/androidx/compose/material3/search-bar.png)
  *
  * A [SearchBar] tries to occupy the entirety of its allowed size in the expanded state. For
  * full-screen behavior as specified by Material guidelines, parent layouts of the [SearchBar] must
@@ -139,22 +141,23 @@
  * can be used instead.
  *
  * An example looks like:
+ *
  * @sample androidx.compose.material3.samples.SearchBarSample
  *
  * @param inputField the input field of this search bar that allows entering a query, typically a
- * [SearchBarDefaults.InputField].
+ *   [SearchBarDefaults.InputField].
  * @param expanded whether this search bar is expanded and showing search results.
  * @param onExpandedChange the callback to be invoked when this search bar's expanded state is
- * changed.
+ *   changed.
  * @param modifier the [Modifier] to be applied to this search bar.
  * @param shape the shape of this search bar when it is not [expanded]. When [expanded], the shape
- * will always be [SearchBarDefaults.fullScreenShape].
+ *   will always be [SearchBarDefaults.fullScreenShape].
  * @param colors [SearchBarColors] that will be used to resolve the colors used for this search bar
- * in different states. See [SearchBarDefaults.colors].
+ *   in different states. See [SearchBarDefaults.colors].
  * @param tonalElevation when [SearchBarColors.containerColor] is [ColorScheme.surface], a
- * translucent primary color overlay is applied on top of the container. A higher tonal elevation
- * value will result in a darker color in light theme and lighter color in dark theme. See also:
- * [Surface].
+ *   translucent primary color overlay is applied on top of the container. A higher tonal elevation
+ *   value will result in a darker color in light theme and lighter color in dark theme. See also:
+ *   [Surface].
  * @param shadowElevation the elevation for the shadow below this search bar
  * @param windowInsets the window insets that this search bar will respect
  * @param content the content of this search bar to display search results below the [inputField].
@@ -182,8 +185,7 @@
         val animationInProgress = animationProgress.value > 0 && animationProgress.value < 1
         val animationSpec =
             if (animationInProgress) AnimationPredictiveBackExitFloatSpec
-            else if (expanded) AnimationEnterFloatSpec
-            else AnimationExitFloatSpec
+            else if (expanded) AnimationEnterFloatSpec else AnimationExitFloatSpec
         val targetValue = if (expanded) 1f else 0f
         if (animationProgress.value != targetValue) {
             animationProgress.animateTo(targetValue, animationSpec)
@@ -239,7 +241,8 @@
 }
 
 /**
- * <a href="https://m3.material.io/components/search/overview" class="external" target="_blank">Material Design search</a>.
+ * <a href="https://m3.material.io/components/search/overview" class="external"
+ * target="_blank">Material Design search</a>.
  *
  * A search bar represents a floating search field that allows users to enter a keyword or phrase
  * and get relevant information. It can be used as a way to navigate through an app via search
@@ -248,28 +251,30 @@
  * An search bar expands into a search "view" and can be used to display dynamic suggestions or
  * search results.
  *
- * ![Search bar image](https://developer.android.com/images/reference/androidx/compose/material3/docked-search-bar.png)
+ * ![Search bar
+ * image](https://developer.android.com/images/reference/androidx/compose/material3/docked-search-bar.png)
  *
  * A [DockedSearchBar] displays search results in a bounded table below the input field. It is an
  * alternative to [SearchBar] when expanding to full-screen size is undesirable on large screens
  * such as tablets.
  *
  * An example looks like:
+ *
  * @sample androidx.compose.material3.samples.DockedSearchBarSample
  *
  * @param inputField the input field of this search bar that allows entering a query, typically a
- * [SearchBarDefaults.InputField].
+ *   [SearchBarDefaults.InputField].
  * @param expanded whether this search bar is expanded and showing search results.
  * @param onExpandedChange the callback to be invoked when this search bar's expanded state is
- * changed.
+ *   changed.
  * @param modifier the [Modifier] to be applied to this search bar.
  * @param shape the shape of this search bar.
  * @param colors [SearchBarColors] that will be used to resolve the colors used for this search bar
- * in different states. See [SearchBarDefaults.colors].
+ *   in different states. See [SearchBarDefaults.colors].
  * @param tonalElevation when [SearchBarColors.containerColor] is [ColorScheme.surface], a
- * translucent primary color overlay is applied on top of the container. A higher tonal elevation
- * value will result in a darker color in light theme and lighter color in dark theme. See also:
- * [Surface].
+ *   translucent primary color overlay is applied on top of the container. A higher tonal elevation
+ *   value will result in a darker color in light theme and lighter color in dark theme. See also:
+ *   [Surface].
  * @param shadowElevation the elevation for the shadow below the search bar.
  * @param content the content of this search bar to display search results below the [inputField].
  */
@@ -292,9 +297,7 @@
         contentColor = contentColorFor(colors.containerColor),
         tonalElevation = tonalElevation,
         shadowElevation = shadowElevation,
-        modifier = modifier
-            .zIndex(1f)
-            .width(SearchBarMinWidth)
+        modifier = modifier.zIndex(1f).width(SearchBarMinWidth)
     ) {
         Column {
             inputField()
@@ -305,12 +308,12 @@
                 exit = DockedExitTransition,
             ) {
                 val screenHeight = LocalConfiguration.current.screenHeightDp.dp
-                val maxHeight = remember(screenHeight) {
-                    screenHeight * DockedExpandedTableMaxHeightScreenRatio
-                }
-                val minHeight = remember(maxHeight) {
-                    DockedExpandedTableMinHeight.coerceAtMost(maxHeight)
-                }
+                val maxHeight =
+                    remember(screenHeight) {
+                        screenHeight * DockedExpandedTableMaxHeightScreenRatio
+                    }
+                val minHeight =
+                    remember(maxHeight) { DockedExpandedTableMinHeight.coerceAtMost(maxHeight) }
 
                 Column(Modifier.heightIn(min = minHeight, max = maxHeight)) {
                     HorizontalDivider(color = colors.dividerColor)
@@ -320,14 +323,10 @@
         }
     }
 
-    BackHandler(enabled = expanded) {
-        onExpandedChange(false)
-    }
+    BackHandler(enabled = expanded) { onExpandedChange(false) }
 }
 
-/**
- * Defaults used in [SearchBar] and [DockedSearchBar].
- */
+/** Defaults used in [SearchBar] and [DockedSearchBar]. */
 @ExperimentalMaterial3Api
 object SearchBarDefaults {
     /** Default tonal elevation for a search bar. */
@@ -347,21 +346,24 @@
     val InputFieldHeight: Dp = SearchBarTokens.ContainerHeight
 
     /** Default shape for a search bar's input field, or a search bar in the unexpanded state. */
-    val inputFieldShape: Shape @Composable get() = SearchBarTokens.ContainerShape.value
+    val inputFieldShape: Shape
+        @Composable get() = SearchBarTokens.ContainerShape.value
 
     /** Default shape for a [SearchBar] in the expanded state. */
     val fullScreenShape: Shape
         @Composable get() = SearchViewTokens.FullScreenContainerShape.value
 
     /** Default shape for a [DockedSearchBar]. */
-    val dockedShape: Shape @Composable get() = SearchViewTokens.DockedContainerShape.value
+    val dockedShape: Shape
+        @Composable get() = SearchViewTokens.DockedContainerShape.value
 
     /** Default window insets for a [SearchBar]. */
-    val windowInsets: WindowInsets @Composable get() = WindowInsets.statusBars
+    val windowInsets: WindowInsets
+        @Composable get() = WindowInsets.statusBars
 
     /**
-     * Creates a [SearchBarColors] that represents the different colors used in parts of the
-     * search bar in different states.
+     * Creates a [SearchBarColors] that represents the different colors used in parts of the search
+     * bar in different states.
      *
      * For colors used in the input field, see [SearchBarDefaults.inputFieldColors].
      *
@@ -373,22 +375,23 @@
     fun colors(
         containerColor: Color = SearchBarTokens.ContainerColor.value,
         dividerColor: Color = SearchViewTokens.DividerColor.value,
-    ): SearchBarColors = SearchBarColors(
-        containerColor = containerColor,
-        dividerColor = dividerColor,
-        inputFieldColors = inputFieldColors(),
-    )
+    ): SearchBarColors =
+        SearchBarColors(
+            containerColor = containerColor,
+            dividerColor = dividerColor,
+            inputFieldColors = inputFieldColors(),
+        )
 
     /**
-     * Creates a [TextFieldColors] that represents the different colors used in the search bar
-     * input field in different states.
+     * Creates a [TextFieldColors] that represents the different colors used in the search bar input
+     * field in different states.
      *
      * Only a subset of the full list of [TextFieldColors] parameters are used in the input field.
      * All other parameters have no effect.
      *
      * @param focusedTextColor the color used for the input text of this input field when focused
      * @param unfocusedTextColor the color used for the input text of this input field when not
-     * focused
+     *   focused
      * @param disabledTextColor the color used for the input text of this input field when disabled
      * @param cursorColor the cursor color for this input field
      * @param selectionColors the colors used when the input text of this input field is selected
@@ -397,7 +400,7 @@
      * @param disabledLeadingIconColor the leading icon color for this input field when disabled
      * @param focusedTrailingIconColor the trailing icon color for this input field when focused
      * @param unfocusedTrailingIconColor the trailing icon color for this input field when not
-     * focused
+     *   focused
      * @param disabledTrailingIconColor the trailing icon color for this input field when disabled
      * @param focusedPlaceholderColor the placeholder color for this input field when focused
      * @param unfocusedPlaceholderColor the placeholder color for this input field when not focused
@@ -407,22 +410,30 @@
     fun inputFieldColors(
         focusedTextColor: Color = SearchBarTokens.InputTextColor.value,
         unfocusedTextColor: Color = SearchBarTokens.InputTextColor.value,
-        disabledTextColor: Color = FilledTextFieldTokens.DisabledInputColor.value
-            .copy(alpha = FilledTextFieldTokens.DisabledInputOpacity),
+        disabledTextColor: Color =
+            FilledTextFieldTokens.DisabledInputColor.value.copy(
+                alpha = FilledTextFieldTokens.DisabledInputOpacity
+            ),
         cursorColor: Color = FilledTextFieldTokens.CaretColor.value,
         selectionColors: TextSelectionColors = LocalTextSelectionColors.current,
         focusedLeadingIconColor: Color = SearchBarTokens.LeadingIconColor.value,
         unfocusedLeadingIconColor: Color = SearchBarTokens.LeadingIconColor.value,
-        disabledLeadingIconColor: Color = FilledTextFieldTokens.DisabledLeadingIconColor
-            .value.copy(alpha = FilledTextFieldTokens.DisabledLeadingIconOpacity),
+        disabledLeadingIconColor: Color =
+            FilledTextFieldTokens.DisabledLeadingIconColor.value.copy(
+                alpha = FilledTextFieldTokens.DisabledLeadingIconOpacity
+            ),
         focusedTrailingIconColor: Color = SearchBarTokens.TrailingIconColor.value,
         unfocusedTrailingIconColor: Color = SearchBarTokens.TrailingIconColor.value,
-        disabledTrailingIconColor: Color = FilledTextFieldTokens.DisabledTrailingIconColor
-            .value.copy(alpha = FilledTextFieldTokens.DisabledTrailingIconOpacity),
+        disabledTrailingIconColor: Color =
+            FilledTextFieldTokens.DisabledTrailingIconColor.value.copy(
+                alpha = FilledTextFieldTokens.DisabledTrailingIconOpacity
+            ),
         focusedPlaceholderColor: Color = SearchBarTokens.SupportingTextColor.value,
         unfocusedPlaceholderColor: Color = SearchBarTokens.SupportingTextColor.value,
-        disabledPlaceholderColor: Color = FilledTextFieldTokens.DisabledInputColor.value
-            .copy(alpha = FilledTextFieldTokens.DisabledInputOpacity),
+        disabledPlaceholderColor: Color =
+            FilledTextFieldTokens.DisabledInputColor.value.copy(
+                alpha = FilledTextFieldTokens.DisabledInputOpacity
+            ),
     ): TextFieldColors =
         TextFieldDefaults.colors(
             focusedTextColor = focusedTextColor,
@@ -446,25 +457,25 @@
      *
      * @param query the query text to be shown in the input field.
      * @param onQueryChange the callback to be invoked when the input service updates the query. An
-     * updated text comes as a parameter of the callback.
+     *   updated text comes as a parameter of the callback.
      * @param onSearch the callback to be invoked when the input service triggers the
-     * [ImeAction.Search] action. The current [query] comes as a parameter of the callback.
+     *   [ImeAction.Search] action. The current [query] comes as a parameter of the callback.
      * @param expanded whether the search bar is expanded and showing search results.
      * @param onExpandedChange the callback to be invoked when the search bar's expanded state is
-     * changed.
+     *   changed.
      * @param modifier the [Modifier] to be applied to this input field.
-     * @param enabled the enabled state of this input field. When `false`, this component will
-     * not respond to user input, and it will appear visually disabled and disabled to accessibility
-     * services.
+     * @param enabled the enabled state of this input field. When `false`, this component will not
+     *   respond to user input, and it will appear visually disabled and disabled to accessibility
+     *   services.
      * @param placeholder the placeholder to be displayed when the [query] is empty.
      * @param leadingIcon the leading icon to be displayed at the start of the input field.
      * @param trailingIcon the trailing icon to be displayed at the end of the input field.
      * @param colors [TextFieldColors] that will be used to resolve the colors used for this input
-     * field in different states. See [SearchBarDefaults.inputFieldColors].
+     *   field in different states. See [SearchBarDefaults.inputFieldColors].
      * @param interactionSource an optional hoisted [MutableInteractionSource] for observing and
-     * emitting [Interaction]s for this input field. You can use this to change the search bar's
-     * appearance or preview the search bar in different states. Note that if `null` is provided,
-     * interactions will still happen internally.
+     *   emitting [Interaction]s for this input field. You can use this to change the search bar's
+     *   appearance or preview the search bar in different states. Note that if `null` is provided,
+     *   interactions will still happen internally.
      */
     @ExperimentalMaterial3Api
     @Composable
@@ -492,31 +503,33 @@
         val searchSemantics = getString(Strings.SearchBarSearch)
         val suggestionsAvailableSemantics = getString(Strings.SuggestionsAvailable)
 
-        val textColor = LocalTextStyle.current.color.takeOrElse {
-            colors.textColor(enabled, isError = false, focused = focused)
-        }
+        val textColor =
+            LocalTextStyle.current.color.takeOrElse {
+                colors.textColor(enabled, isError = false, focused = focused)
+            }
 
         BasicTextField(
             value = query,
             onValueChange = onQueryChange,
-            modifier = modifier
-                .sizeIn(
-                    minWidth = SearchBarMinWidth,
-                    maxWidth = SearchBarMaxWidth,
-                    minHeight = InputFieldHeight,
-                )
-                .focusRequester(focusRequester)
-                .onFocusChanged { if (it.isFocused) onExpandedChange(true) }
-                .semantics {
-                    contentDescription = searchSemantics
-                    if (expanded) {
-                        stateDescription = suggestionsAvailableSemantics
-                    }
-                    onClick {
-                        focusRequester.requestFocus()
-                        true
-                    }
-                },
+            modifier =
+                modifier
+                    .sizeIn(
+                        minWidth = SearchBarMinWidth,
+                        maxWidth = SearchBarMaxWidth,
+                        minHeight = InputFieldHeight,
+                    )
+                    .focusRequester(focusRequester)
+                    .onFocusChanged { if (it.isFocused) onExpandedChange(true) }
+                    .semantics {
+                        contentDescription = searchSemantics
+                        if (expanded) {
+                            stateDescription = suggestionsAvailableSemantics
+                        }
+                        onClick {
+                            focusRequester.requestFocus()
+                            true
+                        }
+                    },
             enabled = enabled,
             singleLine = true,
             textStyle = LocalTextStyle.current.merge(TextStyle(color = textColor)),
@@ -524,27 +537,30 @@
             keyboardOptions = KeyboardOptions(imeAction = ImeAction.Search),
             keyboardActions = KeyboardActions(onSearch = { onSearch(query) }),
             interactionSource = interactionSource,
-            decorationBox = @Composable { innerTextField ->
-                TextFieldDefaults.DecorationBox(
-                    value = query,
-                    innerTextField = innerTextField,
-                    enabled = enabled,
-                    singleLine = true,
-                    visualTransformation = VisualTransformation.None,
-                    interactionSource = interactionSource,
-                    placeholder = placeholder,
-                    leadingIcon = leadingIcon?.let { leading -> {
-                        Box(Modifier.offset(x = SearchBarIconOffsetX)) { leading() }
-                    } },
-                    trailingIcon = trailingIcon?.let { trailing -> {
-                        Box(Modifier.offset(x = -SearchBarIconOffsetX)) { trailing() }
-                    } },
-                    shape = SearchBarDefaults.inputFieldShape,
-                    colors = colors,
-                    contentPadding = TextFieldDefaults.contentPaddingWithoutLabel(),
-                    container = {},
-                )
-            }
+            decorationBox =
+                @Composable { innerTextField ->
+                    TextFieldDefaults.DecorationBox(
+                        value = query,
+                        innerTextField = innerTextField,
+                        enabled = enabled,
+                        singleLine = true,
+                        visualTransformation = VisualTransformation.None,
+                        interactionSource = interactionSource,
+                        placeholder = placeholder,
+                        leadingIcon =
+                            leadingIcon?.let { leading ->
+                                { Box(Modifier.offset(x = SearchBarIconOffsetX)) { leading() } }
+                            },
+                        trailingIcon =
+                            trailingIcon?.let { trailing ->
+                                { Box(Modifier.offset(x = -SearchBarIconOffsetX)) { trailing() } }
+                            },
+                        shape = SearchBarDefaults.inputFieldShape,
+                        colors = colors,
+                        contentPadding = TextFieldDefaults.contentPaddingWithoutLabel(),
+                        container = {},
+                    )
+                }
         )
 
         val shouldClearFocus = !expanded && focused
@@ -560,9 +576,10 @@
 
     @Suppress("DEPRECATION")
     @Deprecated(
-        message = "Search bars now take the input field as a parameter. `inputFieldColors` " +
-            "should be passed explicitly to the input field. This parameter will be removed in " +
-            "a future version of the library.",
+        message =
+            "Search bars now take the input field as a parameter. `inputFieldColors` " +
+                "should be passed explicitly to the input field. This parameter will be removed in " +
+                "a future version of the library.",
         replaceWith = ReplaceWith("colors(containerColor, dividerColor)"),
     )
     @Composable
@@ -570,47 +587,57 @@
         containerColor: Color = SearchBarTokens.ContainerColor.value,
         dividerColor: Color = SearchViewTokens.DividerColor.value,
         inputFieldColors: TextFieldColors = inputFieldColors(),
-    ): SearchBarColors = SearchBarColors(
-        containerColor = containerColor,
-        dividerColor = dividerColor,
-        inputFieldColors = inputFieldColors,
-    )
+    ): SearchBarColors =
+        SearchBarColors(
+            containerColor = containerColor,
+            dividerColor = dividerColor,
+            inputFieldColors = inputFieldColors,
+        )
 
     @Deprecated("Maintained for binary compatibility", level = DeprecationLevel.HIDDEN)
     @Composable
     fun inputFieldColors(
         textColor: Color = SearchBarTokens.InputTextColor.value,
-        disabledTextColor: Color = FilledTextFieldTokens.DisabledInputColor.value
-            .copy(alpha = FilledTextFieldTokens.DisabledInputOpacity),
+        disabledTextColor: Color =
+            FilledTextFieldTokens.DisabledInputColor.value.copy(
+                alpha = FilledTextFieldTokens.DisabledInputOpacity
+            ),
         cursorColor: Color = FilledTextFieldTokens.CaretColor.value,
         selectionColors: TextSelectionColors = LocalTextSelectionColors.current,
         focusedLeadingIconColor: Color = SearchBarTokens.LeadingIconColor.value,
         unfocusedLeadingIconColor: Color = SearchBarTokens.LeadingIconColor.value,
-        disabledLeadingIconColor: Color = FilledTextFieldTokens.DisabledLeadingIconColor
-            .value.copy(alpha = FilledTextFieldTokens.DisabledLeadingIconOpacity),
+        disabledLeadingIconColor: Color =
+            FilledTextFieldTokens.DisabledLeadingIconColor.value.copy(
+                alpha = FilledTextFieldTokens.DisabledLeadingIconOpacity
+            ),
         focusedTrailingIconColor: Color = SearchBarTokens.TrailingIconColor.value,
         unfocusedTrailingIconColor: Color = SearchBarTokens.TrailingIconColor.value,
-        disabledTrailingIconColor: Color = FilledTextFieldTokens.DisabledTrailingIconColor
-            .value.copy(alpha = FilledTextFieldTokens.DisabledTrailingIconOpacity),
+        disabledTrailingIconColor: Color =
+            FilledTextFieldTokens.DisabledTrailingIconColor.value.copy(
+                alpha = FilledTextFieldTokens.DisabledTrailingIconOpacity
+            ),
         placeholderColor: Color = SearchBarTokens.SupportingTextColor.value,
-        disabledPlaceholderColor: Color = FilledTextFieldTokens.DisabledInputColor.value
-            .copy(alpha = FilledTextFieldTokens.DisabledInputOpacity),
-    ) = inputFieldColors(
-        focusedTextColor = textColor,
-        unfocusedTextColor = textColor,
-        disabledTextColor = disabledTextColor,
-        cursorColor = cursorColor,
-        selectionColors = selectionColors,
-        focusedLeadingIconColor = focusedLeadingIconColor,
-        unfocusedLeadingIconColor = unfocusedLeadingIconColor,
-        disabledLeadingIconColor = disabledLeadingIconColor,
-        focusedTrailingIconColor = focusedTrailingIconColor,
-        unfocusedTrailingIconColor = unfocusedTrailingIconColor,
-        disabledTrailingIconColor = disabledTrailingIconColor,
-        focusedPlaceholderColor = placeholderColor,
-        unfocusedPlaceholderColor = placeholderColor,
-        disabledPlaceholderColor = disabledPlaceholderColor,
-    )
+        disabledPlaceholderColor: Color =
+            FilledTextFieldTokens.DisabledInputColor.value.copy(
+                alpha = FilledTextFieldTokens.DisabledInputOpacity
+            ),
+    ) =
+        inputFieldColors(
+            focusedTextColor = textColor,
+            unfocusedTextColor = textColor,
+            disabledTextColor = disabledTextColor,
+            cursorColor = cursorColor,
+            selectionColors = selectionColors,
+            focusedLeadingIconColor = focusedLeadingIconColor,
+            unfocusedLeadingIconColor = unfocusedLeadingIconColor,
+            disabledLeadingIconColor = disabledLeadingIconColor,
+            focusedTrailingIconColor = focusedTrailingIconColor,
+            unfocusedTrailingIconColor = unfocusedTrailingIconColor,
+            disabledTrailingIconColor = disabledTrailingIconColor,
+            focusedPlaceholderColor = placeholderColor,
+            unfocusedPlaceholderColor = placeholderColor,
+            disabledPlaceholderColor = disabledPlaceholderColor,
+        )
 }
 
 /**
@@ -623,15 +650,19 @@
 @ExperimentalMaterial3Api
 @Immutable
 class SearchBarColors
-@Deprecated("Search bars now take the input field as a parameter. TextFieldColors should be " +
-    "passed explicitly to the input field. The `inputFieldColors` parameter will be removed in " +
-    "a future version of the library.")
+@Deprecated(
+    "Search bars now take the input field as a parameter. TextFieldColors should be " +
+        "passed explicitly to the input field. The `inputFieldColors` parameter will be removed in " +
+        "a future version of the library."
+)
 constructor(
     val containerColor: Color,
     val dividerColor: Color,
-    @Deprecated("Search bars now take the input field as a parameter. TextFieldColors should be " +
-        "passed explicitly to the input field. The `inputFieldColors` property will be removed " +
-        "in a future version of the library.")
+    @Deprecated(
+        "Search bars now take the input field as a parameter. TextFieldColors should be " +
+            "passed explicitly to the input field. The `inputFieldColors` property will be removed " +
+            "in a future version of the library."
+    )
     val inputFieldColors: TextFieldColors,
 ) {
     constructor(
@@ -661,32 +692,35 @@
 @Suppress("DEPRECATION")
 @Deprecated(
     message = "Use overload which takes inputField as a parameter",
-    replaceWith = ReplaceWith("SearchBar(\n" +
-        "    inputField = {\n" +
-        "        SearchBarDefaults.InputField(\n" +
-        "            query = query,\n" +
-        "            onQueryChange = onQueryChange,\n" +
-        "            onSearch = onSearch,\n" +
-        "            expanded = active,\n" +
-        "            onExpandedChange = onActiveChange,\n" +
-        "            enabled = enabled,\n" +
-        "            placeholder = placeholder,\n" +
-        "            leadingIcon = leadingIcon,\n" +
-        "            trailingIcon = trailingIcon,\n" +
-        "            colors = colors.inputFieldColors,\n" +
-        "            interactionSource = interactionSource,\n" +
-        "        )\n" +
-        "    },\n" +
-        "    expanded = active,\n" +
-        "    onExpandedChange = onActiveChange,\n" +
-        "    modifier = modifier,\n" +
-        "    shape = shape,\n" +
-        "    colors = colors,\n" +
-        "    tonalElevation = tonalElevation,\n" +
-        "    shadowElevation = shadowElevation,\n" +
-        "    windowInsets = windowInsets,\n" +
-        "    content = content,\n" +
-        ")"),
+    replaceWith =
+        ReplaceWith(
+            "SearchBar(\n" +
+                "    inputField = {\n" +
+                "        SearchBarDefaults.InputField(\n" +
+                "            query = query,\n" +
+                "            onQueryChange = onQueryChange,\n" +
+                "            onSearch = onSearch,\n" +
+                "            expanded = active,\n" +
+                "            onExpandedChange = onActiveChange,\n" +
+                "            enabled = enabled,\n" +
+                "            placeholder = placeholder,\n" +
+                "            leadingIcon = leadingIcon,\n" +
+                "            trailingIcon = trailingIcon,\n" +
+                "            colors = colors.inputFieldColors,\n" +
+                "            interactionSource = interactionSource,\n" +
+                "        )\n" +
+                "    },\n" +
+                "    expanded = active,\n" +
+                "    onExpandedChange = onActiveChange,\n" +
+                "    modifier = modifier,\n" +
+                "    shape = shape,\n" +
+                "    colors = colors,\n" +
+                "    tonalElevation = tonalElevation,\n" +
+                "    shadowElevation = shadowElevation,\n" +
+                "    windowInsets = windowInsets,\n" +
+                "    content = content,\n" +
+                ")"
+        ),
 )
 @ExperimentalMaterial3Api
 @Composable
@@ -708,62 +742,66 @@
     windowInsets: WindowInsets = SearchBarDefaults.windowInsets,
     interactionSource: MutableInteractionSource? = null,
     content: @Composable ColumnScope.() -> Unit,
-) = SearchBar(
-    inputField = {
-        SearchBarDefaults.InputField(
-            modifier = Modifier.fillMaxWidth(),
-            query = query,
-            onQueryChange = onQueryChange,
-            onSearch = onSearch,
-            expanded = active,
-            onExpandedChange = onActiveChange,
-            enabled = enabled,
-            placeholder = placeholder,
-            leadingIcon = leadingIcon,
-            trailingIcon = trailingIcon,
-            colors = colors.inputFieldColors,
-            interactionSource = interactionSource,
-        )
-    },
-    expanded = active,
-    onExpandedChange = onActiveChange,
-    modifier = modifier,
-    shape = shape,
-    colors = colors,
-    tonalElevation = tonalElevation,
-    shadowElevation = shadowElevation,
-    windowInsets = windowInsets,
-    content = content,
-)
+) =
+    SearchBar(
+        inputField = {
+            SearchBarDefaults.InputField(
+                modifier = Modifier.fillMaxWidth(),
+                query = query,
+                onQueryChange = onQueryChange,
+                onSearch = onSearch,
+                expanded = active,
+                onExpandedChange = onActiveChange,
+                enabled = enabled,
+                placeholder = placeholder,
+                leadingIcon = leadingIcon,
+                trailingIcon = trailingIcon,
+                colors = colors.inputFieldColors,
+                interactionSource = interactionSource,
+            )
+        },
+        expanded = active,
+        onExpandedChange = onActiveChange,
+        modifier = modifier,
+        shape = shape,
+        colors = colors,
+        tonalElevation = tonalElevation,
+        shadowElevation = shadowElevation,
+        windowInsets = windowInsets,
+        content = content,
+    )
 
 @Suppress("DEPRECATION")
 @Deprecated(
     message = "Use overload which takes inputField as a parameter",
-    replaceWith = ReplaceWith("DockedSearchBar(\n" +
-        "    inputField = {\n" +
-        "        SearchBarDefaults.InputField(\n" +
-        "            query = query,\n" +
-        "            onQueryChange = onQueryChange,\n" +
-        "            onSearch = onSearch,\n" +
-        "            expanded = active,\n" +
-        "            onExpandedChange = onActiveChange,\n" +
-        "            enabled = enabled,\n" +
-        "            placeholder = placeholder,\n" +
-        "            leadingIcon = leadingIcon,\n" +
-        "            trailingIcon = trailingIcon,\n" +
-        "            colors = colors.inputFieldColors,\n" +
-        "            interactionSource = interactionSource,\n" +
-        "        )\n" +
-        "    },\n" +
-        "    expanded = active,\n" +
-        "    onExpandedChange = onActiveChange,\n" +
-        "    modifier = modifier,\n" +
-        "    shape = shape,\n" +
-        "    colors = colors,\n" +
-        "    tonalElevation = tonalElevation,\n" +
-        "    shadowElevation = shadowElevation,\n" +
-        "    content = content,\n" +
-        ")"),
+    replaceWith =
+        ReplaceWith(
+            "DockedSearchBar(\n" +
+                "    inputField = {\n" +
+                "        SearchBarDefaults.InputField(\n" +
+                "            query = query,\n" +
+                "            onQueryChange = onQueryChange,\n" +
+                "            onSearch = onSearch,\n" +
+                "            expanded = active,\n" +
+                "            onExpandedChange = onActiveChange,\n" +
+                "            enabled = enabled,\n" +
+                "            placeholder = placeholder,\n" +
+                "            leadingIcon = leadingIcon,\n" +
+                "            trailingIcon = trailingIcon,\n" +
+                "            colors = colors.inputFieldColors,\n" +
+                "            interactionSource = interactionSource,\n" +
+                "        )\n" +
+                "    },\n" +
+                "    expanded = active,\n" +
+                "    onExpandedChange = onActiveChange,\n" +
+                "    modifier = modifier,\n" +
+                "    shape = shape,\n" +
+                "    colors = colors,\n" +
+                "    tonalElevation = tonalElevation,\n" +
+                "    shadowElevation = shadowElevation,\n" +
+                "    content = content,\n" +
+                ")"
+        ),
 )
 @ExperimentalMaterial3Api
 @Composable
@@ -784,32 +822,33 @@
     shadowElevation: Dp = SearchBarDefaults.ShadowElevation,
     interactionSource: MutableInteractionSource? = null,
     content: @Composable ColumnScope.() -> Unit,
-) = DockedSearchBar(
-    inputField = {
-        SearchBarDefaults.InputField(
-            modifier = Modifier.fillMaxWidth(),
-            query = query,
-            onQueryChange = onQueryChange,
-            onSearch = onSearch,
-            expanded = active,
-            onExpandedChange = onActiveChange,
-            enabled = enabled,
-            placeholder = placeholder,
-            leadingIcon = leadingIcon,
-            trailingIcon = trailingIcon,
-            colors = colors.inputFieldColors,
-            interactionSource = interactionSource,
-        )
-    },
-    expanded = active,
-    onExpandedChange = onActiveChange,
-    modifier = modifier,
-    shape = shape,
-    colors = colors,
-    tonalElevation = tonalElevation,
-    shadowElevation = shadowElevation,
-    content = content,
-)
+) =
+    DockedSearchBar(
+        inputField = {
+            SearchBarDefaults.InputField(
+                modifier = Modifier.fillMaxWidth(),
+                query = query,
+                onQueryChange = onQueryChange,
+                onSearch = onSearch,
+                expanded = active,
+                onExpandedChange = onActiveChange,
+                enabled = enabled,
+                placeholder = placeholder,
+                leadingIcon = leadingIcon,
+                trailingIcon = trailingIcon,
+                colors = colors.inputFieldColors,
+                interactionSource = interactionSource,
+            )
+        },
+        expanded = active,
+        onExpandedChange = onActiveChange,
+        modifier = modifier,
+        shape = shape,
+        colors = colors,
+        tonalElevation = tonalElevation,
+        shadowElevation = shadowElevation,
+        content = content,
+    )
 
 @OptIn(ExperimentalMaterial3Api::class)
 @Composable
@@ -834,42 +873,46 @@
     val useFullScreenShape by remember {
         derivedStateOf(structuralEqualityPolicy()) { animationProgress.value == 1f }
     }
-    val animatedShape = remember(useFullScreenShape, shape) {
-        when {
-            shape == defaultInputFieldShape ->
-                // The shape can only be animated if it's the default spec value
-                GenericShape { size, _ ->
-                    val radius = with(density) {
-                        (SearchBarCornerRadius * (1 - animationProgress.value)).toPx()
+    val animatedShape =
+        remember(useFullScreenShape, shape) {
+            when {
+                shape == defaultInputFieldShape ->
+                    // The shape can only be animated if it's the default spec value
+                    GenericShape { size, _ ->
+                        val radius =
+                            with(density) {
+                                (SearchBarCornerRadius * (1 - animationProgress.value)).toPx()
+                            }
+                        addRoundRect(RoundRect(size.toRect(), CornerRadius(radius)))
                     }
-                    addRoundRect(RoundRect(size.toRect(), CornerRadius(radius)))
-                }
-            useFullScreenShape -> defaultFullScreenShape
-            else -> shape
+                useFullScreenShape -> defaultFullScreenShape
+                else -> shape
+            }
         }
-    }
-    val surface = @Composable {
-        Surface(
-            shape = animatedShape,
-            color = colors.containerColor,
-            contentColor = contentColorFor(colors.containerColor),
-            tonalElevation = tonalElevation,
-            shadowElevation = shadowElevation,
-            content = {},
-        )
-    }
+    val surface =
+        @Composable {
+            Surface(
+                shape = animatedShape,
+                color = colors.containerColor,
+                contentColor = contentColorFor(colors.containerColor),
+                tonalElevation = tonalElevation,
+                shadowElevation = shadowElevation,
+                content = {},
+            )
+        }
 
     val showContent by remember {
         derivedStateOf(structuralEqualityPolicy()) { animationProgress.value > 0 }
     }
-    val wrappedContent: (@Composable () -> Unit)? = if (showContent) {
-        {
-            Column(Modifier.graphicsLayer { alpha = animationProgress.value }) {
-                HorizontalDivider(color = colors.dividerColor)
-                content()
+    val wrappedContent: (@Composable () -> Unit)? =
+        if (showContent) {
+            {
+                Column(Modifier.graphicsLayer { alpha = animationProgress.value }) {
+                    HorizontalDivider(color = colors.dividerColor)
+                    content()
+                }
             }
-        }
-    } else null
+        } else null
 
     SearchBarLayout(
         animationProgress = animationProgress,
@@ -902,16 +945,15 @@
     // and the animation calculations are done manually.
     val unconsumedInsets = remember { MutableWindowInsets() }
     Layout(
-        modifier = modifier
-            .zIndex(1f)
-            .onConsumedWindowInsetsChanged { consumedInsets ->
-                unconsumedInsets.insets = windowInsets.exclude(consumedInsets)
-            }
-            .consumeWindowInsets(windowInsets),
+        modifier =
+            modifier
+                .zIndex(1f)
+                .onConsumedWindowInsetsChanged { consumedInsets ->
+                    unconsumedInsets.insets = windowInsets.exclude(consumedInsets)
+                }
+                .consumeWindowInsets(windowInsets),
         content = {
-            Box(Modifier.layoutId(LayoutIdSurface), propagateMinConstraints = true) {
-                surface()
-            }
+            Box(Modifier.layoutId(LayoutIdSurface), propagateMinConstraints = true) { surface() }
             Box(Modifier.layoutId(LayoutIdInputField), propagateMinConstraints = true) {
                 inputField()
             }
@@ -922,8 +964,7 @@
             }
         },
     ) { measurables, constraints ->
-        @Suppress("NAME_SHADOWING")
-        val animationProgress = animationProgress.value
+        @Suppress("NAME_SHADOWING") val animationProgress = animationProgress.value
 
         val inputFieldMeasurable = measurables.fastFirst { it.layoutId == LayoutIdInputField }
         val surfaceMeasurable = measurables.fastFirst { it.layoutId == LayoutIdSurface }
@@ -932,28 +973,33 @@
         val topPadding = unconsumedInsets.getTop(this) + SearchBarVerticalPadding.roundToPx()
         val bottomPadding = SearchBarVerticalPadding.roundToPx()
 
-        val defaultStartWidth = constraints
-            .constrainWidth(inputFieldMeasurable.maxIntrinsicWidth(constraints.maxHeight))
-        val defaultStartHeight = constraints
-            .constrainHeight(inputFieldMeasurable.minIntrinsicHeight(constraints.maxWidth))
+        val defaultStartWidth =
+            constraints.constrainWidth(
+                inputFieldMeasurable.maxIntrinsicWidth(constraints.maxHeight)
+            )
+        val defaultStartHeight =
+            constraints.constrainHeight(
+                inputFieldMeasurable.minIntrinsicHeight(constraints.maxWidth)
+            )
 
         val predictiveBackStartWidth =
             (constraints.maxWidth * SearchBarPredictiveBackMinScale).roundToInt()
         val predictiveBackStartHeight =
             (constraints.maxHeight * SearchBarPredictiveBackMinScale).roundToInt()
-        val predictiveBackMultiplier = calculatePredictiveBackMultiplier(
-            currentBackEvent.value,
-            animationProgress,
-            finalBackProgress.floatValue
-        )
+        val predictiveBackMultiplier =
+            calculatePredictiveBackMultiplier(
+                currentBackEvent.value,
+                animationProgress,
+                finalBackProgress.floatValue
+            )
 
-        val startWidth =
-            lerp(defaultStartWidth, predictiveBackStartWidth, predictiveBackMultiplier)
-        val startHeight = lerp(
-            topPadding + defaultStartHeight,
-            predictiveBackStartHeight,
-            predictiveBackMultiplier
-        )
+        val startWidth = lerp(defaultStartWidth, predictiveBackStartWidth, predictiveBackMultiplier)
+        val startHeight =
+            lerp(
+                topPadding + defaultStartHeight,
+                predictiveBackStartHeight,
+                predictiveBackMultiplier
+            )
 
         val maxWidth = constraints.maxWidth
         val maxHeight = constraints.maxHeight
@@ -965,53 +1011,59 @@
         val animatedTopPadding = lerp(topPadding, 0, animationProgress)
         val animatedBottomPadding = lerp(0, bottomPadding, animationProgress)
 
-        val inputFieldPlaceable = inputFieldMeasurable.measure(
-            Constraints(
-                minWidth = minWidth,
-                maxWidth = maxWidth,
-                minHeight = defaultStartHeight,
-                maxHeight = defaultStartHeight,
+        val inputFieldPlaceable =
+            inputFieldMeasurable.measure(
+                Constraints(
+                    minWidth = minWidth,
+                    maxWidth = maxWidth,
+                    minHeight = defaultStartHeight,
+                    maxHeight = defaultStartHeight,
+                )
             )
-        )
         val width = inputFieldPlaceable.width
 
         // As the animation proceeds, the surface loses its padding
         // and expands to cover the entire container.
-        val surfacePlaceable = surfaceMeasurable
-            .measure(Constraints.fixed(width, height - animatedTopPadding))
-        val contentPlaceable = contentMeasurable?.measure(
-            Constraints(
-                minWidth = width,
-                maxWidth = width,
-                minHeight = 0,
-                maxHeight = if (constraints.hasBoundedHeight) {
-                    (constraints.maxHeight - (topPadding + defaultStartHeight + bottomPadding))
-                        .coerceAtLeast(0)
-                } else {
-                    constraints.maxHeight
-                }
+        val surfacePlaceable =
+            surfaceMeasurable.measure(Constraints.fixed(width, height - animatedTopPadding))
+        val contentPlaceable =
+            contentMeasurable?.measure(
+                Constraints(
+                    minWidth = width,
+                    maxWidth = width,
+                    minHeight = 0,
+                    maxHeight =
+                        if (constraints.hasBoundedHeight) {
+                            (constraints.maxHeight -
+                                    (topPadding + defaultStartHeight + bottomPadding))
+                                .coerceAtLeast(0)
+                        } else {
+                            constraints.maxHeight
+                        }
+                )
             )
-        )
 
         layout(width, height) {
             val minOffsetMargin = SearchBarPredictiveBackMinMargin.roundToPx()
-            val predictiveBackOffsetX = calculatePredictiveBackOffsetX(
-                constraints = constraints,
-                minMargin = minOffsetMargin,
-                currentBackEvent = currentBackEvent.value,
-                layoutDirection = layoutDirection,
-                progress = animationProgress,
-                predictiveBackMultiplier = predictiveBackMultiplier,
-            )
-            val predictiveBackOffsetY = calculatePredictiveBackOffsetY(
-                constraints = constraints,
-                minMargin = minOffsetMargin,
-                currentBackEvent = currentBackEvent.value,
-                firstBackEvent = firstBackEvent.value,
-                height = height,
-                maxOffsetY = SearchBarPredictiveBackMaxOffsetY.roundToPx(),
-                predictiveBackMultiplier = predictiveBackMultiplier,
-            )
+            val predictiveBackOffsetX =
+                calculatePredictiveBackOffsetX(
+                    constraints = constraints,
+                    minMargin = minOffsetMargin,
+                    currentBackEvent = currentBackEvent.value,
+                    layoutDirection = layoutDirection,
+                    progress = animationProgress,
+                    predictiveBackMultiplier = predictiveBackMultiplier,
+                )
+            val predictiveBackOffsetY =
+                calculatePredictiveBackOffsetY(
+                    constraints = constraints,
+                    minMargin = minOffsetMargin,
+                    currentBackEvent = currentBackEvent.value,
+                    firstBackEvent = firstBackEvent.value,
+                    height = height,
+                    maxOffsetY = SearchBarPredictiveBackMaxOffsetY.roundToPx(),
+                    predictiveBackMultiplier = predictiveBackMultiplier,
+                )
 
             surfacePlaceable.placeRelative(
                 predictiveBackOffsetX,
@@ -1023,7 +1075,9 @@
             )
             contentPlaceable?.placeRelative(
                 predictiveBackOffsetX,
-                predictiveBackOffsetY + topPadding + inputFieldPlaceable.height +
+                predictiveBackOffsetY +
+                    topPadding +
+                    inputFieldPlaceable.height +
                     animatedBottomPadding,
             )
         }
@@ -1034,12 +1088,13 @@
     currentBackEvent: BackEventCompat?,
     progress: Float,
     finalBackProgress: Float
-) = when {
-    currentBackEvent == null -> 0f // Not in predictive back at all.
-    finalBackProgress.isNaN() -> 1f // User is currently swiping predictive back.
-    finalBackProgress <= 0 -> 0f // Safety check for divide by zero.
-    else -> progress / finalBackProgress // User has released predictive back swipe.
-}
+) =
+    when {
+        currentBackEvent == null -> 0f // Not in predictive back at all.
+        finalBackProgress.isNaN() -> 1f // User is currently swiping predictive back.
+        finalBackProgress <= 0 -> 0f // Safety check for divide by zero.
+        else -> progress / finalBackProgress // User has released predictive back swipe.
+    }
 
 private fun calculatePredictiveBackOffsetX(
     constraints: Constraints,
@@ -1054,8 +1109,7 @@
     }
     val directionMultiplier = if (currentBackEvent.swipeEdge == BackEventCompat.EDGE_LEFT) 1 else -1
     val rtlMultiplier = if (layoutDirection == LayoutDirection.Ltr) 1 else -1
-    val maxOffsetX =
-        (constraints.maxWidth * SearchBarPredictiveBackMaxOffsetXRatio) - minMargin
+    val maxOffsetX = (constraints.maxWidth * SearchBarPredictiveBackMaxOffsetXRatio) - minMargin
     val interpolatedOffsetX = maxOffsetX * (1 - progress)
     return (interpolatedOffsetX * predictiveBackMultiplier * directionMultiplier * rtlMultiplier)
         .roundToInt()
@@ -1082,59 +1136,59 @@
     return (interpolatedOffsetY * predictiveBackMultiplier * directionMultiplier).roundToInt()
 }
 
-private val UnspecifiedTextFieldColors: TextFieldColors = TextFieldColors(
-    focusedTextColor = Color.Unspecified,
-    unfocusedTextColor = Color.Unspecified,
-    disabledTextColor = Color.Unspecified,
-    errorTextColor = Color.Unspecified,
-    focusedContainerColor = Color.Unspecified,
-    unfocusedContainerColor = Color.Unspecified,
-    disabledContainerColor = Color.Unspecified,
-    errorContainerColor = Color.Unspecified,
-    cursorColor = Color.Unspecified,
-    errorCursorColor = Color.Unspecified,
-    textSelectionColors = TextSelectionColors(Color.Unspecified, Color.Unspecified),
-    focusedIndicatorColor = Color.Unspecified,
-    unfocusedIndicatorColor = Color.Unspecified,
-    disabledIndicatorColor = Color.Unspecified,
-    errorIndicatorColor = Color.Unspecified,
-    focusedLeadingIconColor = Color.Unspecified,
-    unfocusedLeadingIconColor = Color.Unspecified,
-    disabledLeadingIconColor = Color.Unspecified,
-    errorLeadingIconColor = Color.Unspecified,
-    focusedTrailingIconColor = Color.Unspecified,
-    unfocusedTrailingIconColor = Color.Unspecified,
-    disabledTrailingIconColor = Color.Unspecified,
-    errorTrailingIconColor = Color.Unspecified,
-    focusedLabelColor = Color.Unspecified,
-    unfocusedLabelColor = Color.Unspecified,
-    disabledLabelColor = Color.Unspecified,
-    errorLabelColor = Color.Unspecified,
-    focusedPlaceholderColor = Color.Unspecified,
-    unfocusedPlaceholderColor = Color.Unspecified,
-    disabledPlaceholderColor = Color.Unspecified,
-    errorPlaceholderColor = Color.Unspecified,
-    focusedSupportingTextColor = Color.Unspecified,
-    unfocusedSupportingTextColor = Color.Unspecified,
-    disabledSupportingTextColor = Color.Unspecified,
-    errorSupportingTextColor = Color.Unspecified,
-    focusedPrefixColor = Color.Unspecified,
-    unfocusedPrefixColor = Color.Unspecified,
-    disabledPrefixColor = Color.Unspecified,
-    errorPrefixColor = Color.Unspecified,
-    focusedSuffixColor = Color.Unspecified,
-    unfocusedSuffixColor = Color.Unspecified,
-    disabledSuffixColor = Color.Unspecified,
-    errorSuffixColor = Color.Unspecified,
-)
+private val UnspecifiedTextFieldColors: TextFieldColors =
+    TextFieldColors(
+        focusedTextColor = Color.Unspecified,
+        unfocusedTextColor = Color.Unspecified,
+        disabledTextColor = Color.Unspecified,
+        errorTextColor = Color.Unspecified,
+        focusedContainerColor = Color.Unspecified,
+        unfocusedContainerColor = Color.Unspecified,
+        disabledContainerColor = Color.Unspecified,
+        errorContainerColor = Color.Unspecified,
+        cursorColor = Color.Unspecified,
+        errorCursorColor = Color.Unspecified,
+        textSelectionColors = TextSelectionColors(Color.Unspecified, Color.Unspecified),
+        focusedIndicatorColor = Color.Unspecified,
+        unfocusedIndicatorColor = Color.Unspecified,
+        disabledIndicatorColor = Color.Unspecified,
+        errorIndicatorColor = Color.Unspecified,
+        focusedLeadingIconColor = Color.Unspecified,
+        unfocusedLeadingIconColor = Color.Unspecified,
+        disabledLeadingIconColor = Color.Unspecified,
+        errorLeadingIconColor = Color.Unspecified,
+        focusedTrailingIconColor = Color.Unspecified,
+        unfocusedTrailingIconColor = Color.Unspecified,
+        disabledTrailingIconColor = Color.Unspecified,
+        errorTrailingIconColor = Color.Unspecified,
+        focusedLabelColor = Color.Unspecified,
+        unfocusedLabelColor = Color.Unspecified,
+        disabledLabelColor = Color.Unspecified,
+        errorLabelColor = Color.Unspecified,
+        focusedPlaceholderColor = Color.Unspecified,
+        unfocusedPlaceholderColor = Color.Unspecified,
+        disabledPlaceholderColor = Color.Unspecified,
+        errorPlaceholderColor = Color.Unspecified,
+        focusedSupportingTextColor = Color.Unspecified,
+        unfocusedSupportingTextColor = Color.Unspecified,
+        disabledSupportingTextColor = Color.Unspecified,
+        errorSupportingTextColor = Color.Unspecified,
+        focusedPrefixColor = Color.Unspecified,
+        unfocusedPrefixColor = Color.Unspecified,
+        disabledPrefixColor = Color.Unspecified,
+        errorPrefixColor = Color.Unspecified,
+        focusedSuffixColor = Color.Unspecified,
+        unfocusedSuffixColor = Color.Unspecified,
+        disabledSuffixColor = Color.Unspecified,
+        errorSuffixColor = Color.Unspecified,
+    )
 
 private const val LayoutIdInputField = "InputField"
 private const val LayoutIdSurface = "Surface"
 private const val LayoutIdSearchContent = "Content"
 
 // Measurement specs
-@OptIn(ExperimentalMaterial3Api::class)
-private val SearchBarCornerRadius: Dp = InputFieldHeight / 2
+@OptIn(ExperimentalMaterial3Api::class) private val SearchBarCornerRadius: Dp = InputFieldHeight / 2
 internal val DockedExpandedTableMinHeight: Dp = 240.dp
 private const val DockedExpandedTableMaxHeightScreenRatio: Float = 2f / 3f
 internal val SearchBarMinWidth: Dp = 360.dp
@@ -1153,30 +1207,35 @@
 private const val AnimationDelayMillis: Int = MotionTokens.DurationShort2.toInt()
 private val AnimationEnterEasing = MotionTokens.EasingEmphasizedDecelerateCubicBezier
 private val AnimationExitEasing = CubicBezierEasing(0.0f, 1.0f, 0.0f, 1.0f)
-private val AnimationEnterFloatSpec: FiniteAnimationSpec<Float> = tween(
-    durationMillis = AnimationEnterDurationMillis,
-    delayMillis = AnimationDelayMillis,
-    easing = AnimationEnterEasing,
-)
-private val AnimationExitFloatSpec: FiniteAnimationSpec<Float> = tween(
-    durationMillis = AnimationExitDurationMillis,
-    delayMillis = AnimationDelayMillis,
-    easing = AnimationExitEasing,
-)
-private val AnimationPredictiveBackExitFloatSpec: FiniteAnimationSpec<Float> = tween(
-    durationMillis = AnimationExitDurationMillis,
-    easing = AnimationExitEasing,
-)
-private val AnimationEnterSizeSpec: FiniteAnimationSpec<IntSize> = tween(
-    durationMillis = AnimationEnterDurationMillis,
-    delayMillis = AnimationDelayMillis,
-    easing = AnimationEnterEasing,
-)
-private val AnimationExitSizeSpec: FiniteAnimationSpec<IntSize> = tween(
-    durationMillis = AnimationExitDurationMillis,
-    delayMillis = AnimationDelayMillis,
-    easing = AnimationExitEasing,
-)
+private val AnimationEnterFloatSpec: FiniteAnimationSpec<Float> =
+    tween(
+        durationMillis = AnimationEnterDurationMillis,
+        delayMillis = AnimationDelayMillis,
+        easing = AnimationEnterEasing,
+    )
+private val AnimationExitFloatSpec: FiniteAnimationSpec<Float> =
+    tween(
+        durationMillis = AnimationExitDurationMillis,
+        delayMillis = AnimationDelayMillis,
+        easing = AnimationExitEasing,
+    )
+private val AnimationPredictiveBackExitFloatSpec: FiniteAnimationSpec<Float> =
+    tween(
+        durationMillis = AnimationExitDurationMillis,
+        easing = AnimationExitEasing,
+    )
+private val AnimationEnterSizeSpec: FiniteAnimationSpec<IntSize> =
+    tween(
+        durationMillis = AnimationEnterDurationMillis,
+        delayMillis = AnimationDelayMillis,
+        easing = AnimationEnterEasing,
+    )
+private val AnimationExitSizeSpec: FiniteAnimationSpec<IntSize> =
+    tween(
+        durationMillis = AnimationExitDurationMillis,
+        delayMillis = AnimationDelayMillis,
+        easing = AnimationExitEasing,
+    )
 private val DockedEnterTransition: EnterTransition =
     fadeIn(AnimationEnterFloatSpec) + expandVertically(AnimationEnterSizeSpec)
 private val DockedExitTransition: ExitTransition =
diff --git a/compose/material3/material3/src/androidMain/kotlin/androidx/compose/material3/TimeFormat.android.kt b/compose/material3/material3/src/androidMain/kotlin/androidx/compose/material3/TimeFormat.android.kt
index ea45cd6..b33fac7 100644
--- a/compose/material3/material3/src/androidMain/kotlin/androidx/compose/material3/TimeFormat.android.kt
+++ b/compose/material3/material3/src/androidMain/kotlin/androidx/compose/material3/TimeFormat.android.kt
@@ -22,5 +22,4 @@
 import androidx.compose.ui.platform.LocalContext
 
 internal actual val is24HourFormat: Boolean
-    @Composable
-    @ReadOnlyComposable get() = is24HourFormat(LocalContext.current)
+    @Composable @ReadOnlyComposable get() = is24HourFormat(LocalContext.current)
diff --git a/compose/material3/material3/src/androidMain/kotlin/androidx/compose/material3/TimePicker.android.kt b/compose/material3/material3/src/androidMain/kotlin/androidx/compose/material3/TimePicker.android.kt
index 002e5a2..03abaec 100644
--- a/compose/material3/material3/src/androidMain/kotlin/androidx/compose/material3/TimePicker.android.kt
+++ b/compose/material3/material3/src/androidMain/kotlin/androidx/compose/material3/TimePicker.android.kt
@@ -23,10 +23,12 @@
 @OptIn(ExperimentalMaterial3Api::class)
 internal actual val defaultTimePickerLayoutType: TimePickerLayoutType
     @Composable
-    @ReadOnlyComposable get() = with(LocalConfiguration.current) {
-        if (screenHeightDp < screenWidthDp) {
-            TimePickerLayoutType.Horizontal
-        } else {
-            TimePickerLayoutType.Vertical
+    @ReadOnlyComposable
+    get() =
+        with(LocalConfiguration.current) {
+            if (screenHeightDp < screenWidthDp) {
+                TimePickerLayoutType.Horizontal
+            } else {
+                TimePickerLayoutType.Vertical
+            }
         }
-    }
diff --git a/compose/material3/material3/src/androidMain/kotlin/androidx/compose/material3/Tooltip.android.kt b/compose/material3/material3/src/androidMain/kotlin/androidx/compose/material3/Tooltip.android.kt
index 8777756..a95890a 100644
--- a/compose/material3/material3/src/androidMain/kotlin/androidx/compose/material3/Tooltip.android.kt
+++ b/compose/material3/material3/src/androidMain/kotlin/androidx/compose/material3/Tooltip.android.kt
@@ -50,9 +50,9 @@
  * Usually used with [TooltipBox].
  *
  * @param modifier the [Modifier] to be applied to the tooltip.
- * @param caretSize [DpSize] for the caret of the tooltip, if a default
- * caret is desired with a specific dimension. Please see [TooltipDefaults.caretSize] to
- * see the default dimensions. Pass in Dp.Unspecified for this parameter if no caret is desired.
+ * @param caretSize [DpSize] for the caret of the tooltip, if a default caret is desired with a
+ *   specific dimension. Please see [TooltipDefaults.caretSize] to see the default dimensions. Pass
+ *   in Dp.Unspecified for this parameter if no caret is desired.
  * @param shape the [Shape] that should be applied to the tooltip container.
  * @param contentColor [Color] that will be applied to the tooltip's content.
  * @param containerColor [Color] that will be applied to the tooltip's container.
@@ -77,15 +77,16 @@
             val density = LocalDensity.current
             val configuration = LocalConfiguration.current
             Modifier.drawCaret { anchorLayoutCoordinates ->
-                drawCaretWithPath(
-                    CaretType.Plain,
-                    density,
-                    configuration,
-                    containerColor,
-                    caretSize,
-                    anchorLayoutCoordinates
-                )
-            }.then(modifier)
+                    drawCaretWithPath(
+                        CaretType.Plain,
+                        density,
+                        configuration,
+                        containerColor,
+                        caretSize,
+                        anchorLayoutCoordinates
+                    )
+                }
+                .then(modifier)
         } else modifier
     Surface(
         modifier = drawCaretModifier,
@@ -94,16 +95,16 @@
         tonalElevation = tonalElevation,
         shadowElevation = shadowElevation
     ) {
-        Box(modifier = Modifier
-            .sizeIn(
-                minWidth = TooltipMinWidth,
-                maxWidth = PlainTooltipMaxWidth,
-                minHeight = TooltipMinHeight
-            )
-            .padding(PlainTooltipContentPadding)
+        Box(
+            modifier =
+                Modifier.sizeIn(
+                        minWidth = TooltipMinWidth,
+                        maxWidth = PlainTooltipMaxWidth,
+                        minHeight = TooltipMinHeight
+                    )
+                    .padding(PlainTooltipContentPadding)
         ) {
-            val textStyle =
-                PlainTooltipTokens.SupportingTextFont.value
+            val textStyle = PlainTooltipTokens.SupportingTextFont.value
 
             CompositionLocalProvider(
                 LocalContentColor provides contentColor,
@@ -115,17 +116,17 @@
 }
 
 /**
- * Rich text tooltip that allows the user to pass in a title, text, and action.
- * Tooltips are used to provide a descriptive message.
+ * Rich text tooltip that allows the user to pass in a title, text, and action. Tooltips are used to
+ * provide a descriptive message.
  *
  * Usually used with [TooltipBox]
  *
  * @param modifier the [Modifier] to be applied to the tooltip.
  * @param title An optional title for the tooltip.
  * @param action An optional action for the tooltip.
- * @param caretSize [DpSize] for the caret of the tooltip, if a default
- * caret is desired with a specific dimension. Please see [TooltipDefaults.caretSize] to
- * see the default dimensions. Pass in Dp.Unspecified for this parameter if no caret is desired.
+ * @param caretSize [DpSize] for the caret of the tooltip, if a default caret is desired with a
+ *   specific dimension. Please see [TooltipDefaults.caretSize] to see the default dimensions. Pass
+ *   in Dp.Unspecified for this parameter if no caret is desired.
  * @param shape the [Shape] that should be applied to the tooltip container.
  * @param colors [RichTooltipColors] that will be applied to the tooltip's container and content.
  * @param tonalElevation the tonal elevation of the tooltip.
@@ -147,28 +148,26 @@
 ) {
     val absoluteElevation = LocalAbsoluteTonalElevation.current + tonalElevation
     val elevatedColor =
-        MaterialTheme.colorScheme.applyTonalElevation(
-            colors.containerColor,
-            absoluteElevation
-        )
+        MaterialTheme.colorScheme.applyTonalElevation(colors.containerColor, absoluteElevation)
     val drawCaretModifier =
         if (caretSize.isSpecified) {
             val density = LocalDensity.current
             val configuration = LocalConfiguration.current
             Modifier.drawCaret { anchorLayoutCoordinates ->
-                drawCaretWithPath(
-                    CaretType.Rich,
-                    density,
-                    configuration,
-                    elevatedColor,
-                    caretSize,
-                    anchorLayoutCoordinates
-                )
-            }.then(modifier)
+                    drawCaretWithPath(
+                        CaretType.Rich,
+                        density,
+                        configuration,
+                        elevatedColor,
+                        caretSize,
+                        anchorLayoutCoordinates
+                    )
+                }
+                .then(modifier)
         } else modifier
     Surface(
-        modifier = drawCaretModifier
-            .sizeIn(
+        modifier =
+            drawCaretModifier.sizeIn(
                 minWidth = TooltipMinWidth,
                 maxWidth = RichTooltipMaxWidth,
                 minHeight = TooltipMinHeight
@@ -182,13 +181,9 @@
         val subheadTextStyle = RichTooltipTokens.SubheadFont.value
         val supportingTextStyle = RichTooltipTokens.SupportingTextFont.value
 
-        Column(
-            modifier = Modifier.padding(horizontal = RichTooltipHorizontalPadding)
-        ) {
+        Column(modifier = Modifier.padding(horizontal = RichTooltipHorizontalPadding)) {
             title?.let {
-                Box(
-                    modifier = Modifier.paddingFromBaseline(top = HeightToSubheadFirstLine)
-                ) {
+                Box(modifier = Modifier.paddingFromBaseline(top = HeightToSubheadFirstLine)) {
                     CompositionLocalProvider(
                         LocalContentColor provides colors.titleContentColor,
                         LocalTextStyle provides subheadTextStyle,
@@ -196,12 +191,7 @@
                     )
                 }
             }
-            Box(
-                modifier = Modifier.textVerticalPadding(
-                    title != null,
-                    action != null
-                )
-            ) {
+            Box(modifier = Modifier.textVerticalPadding(title != null, action != null)) {
                 CompositionLocalProvider(
                     LocalContentColor provides colors.contentColor,
                     LocalTextStyle provides supportingTextStyle,
@@ -210,9 +200,9 @@
             }
             action?.let {
                 Box(
-                    modifier = Modifier
-                        .requiredHeightIn(min = ActionLabelMinHeight)
-                        .padding(bottom = ActionLabelBottomPadding)
+                    modifier =
+                        Modifier.requiredHeightIn(min = ActionLabelMinHeight)
+                            .padding(bottom = ActionLabelBottomPadding)
                 ) {
                     CompositionLocalProvider(
                         LocalContentColor provides colors.actionContentColor,
@@ -256,21 +246,24 @@
         val tooltipWidth = this.size.width
         val tooltipHeight = this.size.height
         val isCaretTop = anchorTop - tooltipHeight - tooltipAnchorSpacing < 0
-        val caretY = if (isCaretTop) { 0f } else { tooltipHeight }
+        val caretY =
+            if (isCaretTop) {
+                0f
+            } else {
+                tooltipHeight
+            }
 
         val position: Offset
         if (caretType == CaretType.Plain) {
             position =
                 if (anchorMid + tooltipWidth / 2 > screenWidthPx) {
                     // Caret needs to be near the right
-                    val anchorMidFromRightScreenEdge =
-                        screenWidthPx - anchorMid
+                    val anchorMidFromRightScreenEdge = screenWidthPx - anchorMid
                     val caretX = tooltipWidth - anchorMidFromRightScreenEdge
                     Offset(caretX, caretY)
                 } else {
                     // Caret needs to be near the left
-                    val tooltipLeft =
-                        anchorLeft - (this.size.width / 2 - anchorWidth / 2)
+                    val tooltipLeft = anchorLeft - (this.size.width / 2 - anchorWidth / 2)
                     val caretX = anchorMid - maxOf(tooltipLeft, 0f)
                     Offset(caretX, caretY)
                 }
@@ -287,8 +280,7 @@
                     if (anchorLeft - tooltipWidth / 2 + anchorWidth / 2 <= 0) {
                         preferredPosition = Offset(anchorMid, caretY)
                     } else if (anchorRight + tooltipWidth / 2 - anchorWidth / 2 >= screenWidthPx) {
-                        val anchorMidFromRightScreenEdge =
-                            screenWidthPx - anchorMid
+                        val anchorMidFromRightScreenEdge = screenWidthPx - anchorMid
                         val caretX = tooltipWidth - anchorMidFromRightScreenEdge
                         preferredPosition = Offset(caretX, caretY)
                     } else {
@@ -321,15 +313,13 @@
     return onDrawWithContent {
         if (anchorLayoutCoordinates != null) {
             drawContent()
-            drawPath(
-                path = path,
-                color = containerColor
-            )
+            drawPath(path = path, color = containerColor)
         }
     }
 }
 
 @ExperimentalMaterial3Api
 private enum class CaretType {
-    Plain, Rich
+    Plain,
+    Rich
 }
diff --git a/compose/material3/material3/src/androidMain/kotlin/androidx/compose/material3/internal/AccessibilityServiceStateProvider.android.kt b/compose/material3/material3/src/androidMain/kotlin/androidx/compose/material3/internal/AccessibilityServiceStateProvider.android.kt
index ae356fb..bc98cbc 100644
--- a/compose/material3/material3/src/androidMain/kotlin/androidx/compose/material3/internal/AccessibilityServiceStateProvider.android.kt
+++ b/compose/material3/material3/src/androidMain/kotlin/androidx/compose/material3/internal/AccessibilityServiceStateProvider.android.kt
@@ -49,9 +49,10 @@
     val accessibilityManager =
         context.getSystemService(Context.ACCESSIBILITY_SERVICE) as AccessibilityManager
 
-    val listener = remember(listenToTouchExplorationState, listenToSwitchAccessState) {
-        Listener(listenToTouchExplorationState, listenToSwitchAccessState)
-    }
+    val listener =
+        remember(listenToTouchExplorationState, listenToSwitchAccessState) {
+            Listener(listenToTouchExplorationState, listenToSwitchAccessState)
+        }
 
     ObserveState(
         lifecycleOwner = LocalLifecycleOwner.current,
@@ -60,9 +61,7 @@
                 listener.register(accessibilityManager)
             }
         },
-        onDispose = {
-            listener.unregister(accessibilityManager)
-        }
+        onDispose = { listener.unregister(accessibilityManager) }
     )
 
     return listener
@@ -75,9 +74,7 @@
     onDispose: () -> Unit = {}
 ) {
     DisposableEffect(lifecycleOwner) {
-        val observer = LifecycleEventObserver { _, event ->
-            handleEvent(event)
-        }
+        val observer = LifecycleEventObserver { _, event -> handleEvent(event) }
         lifecycleOwner.lifecycle.addObserver(observer)
         onDispose {
             onDispose()
@@ -93,17 +90,18 @@
 ) : AccessibilityStateChangeListener, State<Boolean> {
     private var accessibilityEnabled by mutableStateOf(false)
 
-    private val touchExplorationListener = if (listenToTouchExplorationState) {
-        object : TouchExplorationStateChangeListener {
-            var enabled by mutableStateOf(false)
+    private val touchExplorationListener =
+        if (listenToTouchExplorationState) {
+            object : TouchExplorationStateChangeListener {
+                var enabled by mutableStateOf(false)
 
-            override fun onTouchExplorationStateChanged(enabled: Boolean) {
-                this.enabled = enabled
+                override fun onTouchExplorationStateChanged(enabled: Boolean) {
+                    this.enabled = enabled
+                }
             }
+        } else {
+            null
         }
-    } else {
-        null
-    }
 
     private val switchAccessListener =
         if (listenToSwitchAccessState && Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
@@ -119,13 +117,16 @@
         }
 
     private val AccessibilityManager.switchAccessEnabled
-        get() = getEnabledAccessibilityServiceList(AccessibilityServiceInfo.FEEDBACK_GENERIC)
-            .fastAny { it.settingsActivityName?.contains(SwitchAccessActivityName) == true }
+        get() =
+            getEnabledAccessibilityServiceList(AccessibilityServiceInfo.FEEDBACK_GENERIC).fastAny {
+                it.settingsActivityName?.contains(SwitchAccessActivityName) == true
+            }
 
     override val value: Boolean
-        get() = accessibilityEnabled &&
-            ((touchExplorationListener?.enabled ?: false) ||
-            (switchAccessListener?.enabled ?: false))
+        get() =
+            accessibilityEnabled &&
+                ((touchExplorationListener?.enabled ?: false) ||
+                    (switchAccessListener?.enabled ?: false))
 
     override fun onAccessibilityStateChanged(enabled: Boolean) {
         accessibilityEnabled = enabled
@@ -148,9 +149,7 @@
 
     fun unregister(am: AccessibilityManager) {
         am.removeAccessibilityStateChangeListener(this)
-        touchExplorationListener?.let {
-            am.removeTouchExplorationStateChangeListener(it)
-        }
+        touchExplorationListener?.let { am.removeTouchExplorationStateChangeListener(it) }
         if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
             switchAccessListener?.let {
                 Api33Impl.removeAccessibilityServicesStateChangeListener(am, it)
diff --git a/compose/material3/material3/src/androidMain/kotlin/androidx/compose/material3/internal/BasicTooltip.android.kt b/compose/material3/material3/src/androidMain/kotlin/androidx/compose/material3/internal/BasicTooltip.android.kt
index 36ed7bd..c853804 100644
--- a/compose/material3/material3/src/androidMain/kotlin/androidx/compose/material3/internal/BasicTooltip.android.kt
+++ b/compose/material3/material3/src/androidMain/kotlin/androidx/compose/material3/internal/BasicTooltip.android.kt
@@ -52,26 +52,25 @@
 import kotlinx.coroutines.launch
 
 /**
- * NOTICE:
- * Fork from androidx.compose.foundation.BasicTooltip box since those are experimental
+ * NOTICE: Fork from androidx.compose.foundation.BasicTooltip box since those are experimental
  *
  * BasicTooltipBox that wraps a composable with a tooltip.
  *
- * Tooltip that provides a descriptive message for an anchor.
- * It can be used to call the users attention to the anchor.
+ * Tooltip that provides a descriptive message for an anchor. It can be used to call the users
+ * attention to the anchor.
  *
- * @param positionProvider [PopupPositionProvider] that will be used to place the tooltip
- * relative to the anchor content.
+ * @param positionProvider [PopupPositionProvider] that will be used to place the tooltip relative
+ *   to the anchor content.
  * @param tooltip the composable that will be used to populate the tooltip's content.
  * @param state handles the state of the tooltip's visibility.
  * @param modifier the [Modifier] to be applied to this BasicTooltipBox.
- * @param focusable [Boolean] that determines if the tooltip is focusable. When true,
- * the tooltip will consume touch events while it's shown and will have accessibility
- * focus move to the first element of the component. When false, the tooltip
- * won't consume touch events while it's shown but assistive-tech users will need
- * to swipe or drag to get to the first element of the component.
- * @param enableUserInput [Boolean] which determines if this BasicTooltipBox will handle
- * long press and mouse hover to trigger the tooltip through the state provided.
+ * @param focusable [Boolean] that determines if the tooltip is focusable. When true, the tooltip
+ *   will consume touch events while it's shown and will have accessibility focus move to the first
+ *   element of the component. When false, the tooltip won't consume touch events while it's shown
+ *   but assistive-tech users will need to swipe or drag to get to the first element of the
+ *   component.
+ * @param enableUserInput [Boolean] which determines if this BasicTooltipBox will handle long press
+ *   and mouse hover to trigger the tooltip through the state provided.
  * @param content the composable that the tooltip will anchor to.
  */
 @Composable
@@ -105,9 +104,7 @@
         )
     }
 
-    DisposableEffect(state) {
-        onDispose { state.onDispose() }
-    }
+    DisposableEffect(state) { onDispose { state.onDispose() } }
 }
 
 @Composable
@@ -119,10 +116,14 @@
 ) {
     val scope = rememberCoroutineScope()
     val longPressLabel = stringResource(R.string.tooltip_label)
-    Box(modifier = modifier
-        .handleGestures(enableUserInput, state)
-        .anchorSemantics(longPressLabel, enableUserInput, state, scope)
-    ) { content() }
+    Box(
+        modifier =
+            modifier
+                .handleGestures(enableUserInput, state)
+                .anchorSemantics(longPressLabel, enableUserInput, state, scope)
+    ) {
+        content()
+    }
 }
 
 @Composable
@@ -144,84 +145,86 @@
         properties = PopupProperties(focusable = focusable)
     ) {
         Box(
-            modifier = Modifier.semantics {
-                liveRegion = LiveRegionMode.Assertive
-                paneTitle = tooltipDescription
-            }
-        ) { content() }
+            modifier =
+                Modifier.semantics {
+                    liveRegion = LiveRegionMode.Assertive
+                    paneTitle = tooltipDescription
+                }
+        ) {
+            content()
+        }
     }
 }
 
-private fun Modifier.handleGestures(
-    enabled: Boolean,
-    state: TooltipState
-): Modifier =
+private fun Modifier.handleGestures(enabled: Boolean, state: TooltipState): Modifier =
     if (enabled) {
         this.pointerInput(state) {
-            coroutineScope {
-                awaitEachGesture {
-                    // Long press will finish before or after show so keep track of it, in a
-                    // flow to handle both cases
-                    val isLongPressedFlow: MutableStateFlow<Boolean> = MutableStateFlow(false)
-                    val longPressTimeout = viewConfiguration.longPressTimeoutMillis
-                    val pass = PointerEventPass.Initial
+                coroutineScope {
+                    awaitEachGesture {
+                        // Long press will finish before or after show so keep track of it, in a
+                        // flow to handle both cases
+                        val isLongPressedFlow: MutableStateFlow<Boolean> = MutableStateFlow(false)
+                        val longPressTimeout = viewConfiguration.longPressTimeoutMillis
+                        val pass = PointerEventPass.Initial
 
-                    // wait for the first down press
-                    val inputType = awaitFirstDown(pass = pass).type
+                        // wait for the first down press
+                        val inputType = awaitFirstDown(pass = pass).type
 
-                    if (inputType == PointerType.Touch || inputType == PointerType.Stylus) {
-                        try {
-                            // listen to if there is up gesture
-                            // within the longPressTimeout limit
-                            withTimeout(longPressTimeout) {
-                                waitForUpOrCancellation(pass = pass)
+                        if (inputType == PointerType.Touch || inputType == PointerType.Stylus) {
+                            try {
+                                // listen to if there is up gesture
+                                // within the longPressTimeout limit
+                                withTimeout(longPressTimeout) {
+                                    waitForUpOrCancellation(pass = pass)
+                                }
+                            } catch (_: PointerEventTimeoutCancellationException) {
+                                // handle long press - Show the tooltip
+                                launch(start = CoroutineStart.UNDISPATCHED) {
+                                    try {
+                                        isLongPressedFlow.tryEmit(true)
+                                        state.show(MutatePriority.PreventUserInput)
+                                    } finally {
+                                        isLongPressedFlow.collectLatest { isLongPressed ->
+                                            if (!isLongPressed) {
+                                                state.dismiss()
+                                            }
+                                        }
+                                    }
+                                }
+
+                                // consume the children's click handling
+                                // Long press may still be in progress
+                                val upEvent = waitForUpOrCancellation(pass = pass)
+                                upEvent?.consume()
+                            } finally {
+                                isLongPressedFlow.tryEmit(false)
                             }
-                        } catch (_: PointerEventTimeoutCancellationException) {
-                            // handle long press - Show the tooltip
-                            launch(start = CoroutineStart.UNDISPATCHED) {
-                                try {
-                                    isLongPressedFlow.tryEmit(true)
-                                    state.show(MutatePriority.PreventUserInput)
-                                } finally {
-                                    isLongPressedFlow.collectLatest { isLongPressed ->
-                                        if (!isLongPressed) { state.dismiss() }
+                        }
+                    }
+                }
+            }
+            .pointerInput(state) {
+                coroutineScope {
+                    awaitPointerEventScope {
+                        val pass = PointerEventPass.Main
+
+                        while (true) {
+                            val event = awaitPointerEvent(pass)
+                            val inputType = event.changes[0].type
+                            if (inputType == PointerType.Mouse) {
+                                when (event.type) {
+                                    PointerEventType.Enter -> {
+                                        launch { state.show(MutatePriority.UserInput) }
+                                    }
+                                    PointerEventType.Exit -> {
+                                        state.dismiss()
                                     }
                                 }
                             }
-
-                            // consume the children's click handling
-                            // Long press may still be in progress
-                            val upEvent = waitForUpOrCancellation(pass = pass)
-                            upEvent?.consume()
-                        } finally {
-                            isLongPressedFlow.tryEmit(false)
                         }
                     }
                 }
             }
-        }.pointerInput(state) {
-            coroutineScope {
-                awaitPointerEventScope {
-                    val pass = PointerEventPass.Main
-
-                    while (true) {
-                        val event = awaitPointerEvent(pass)
-                        val inputType = event.changes[0].type
-                        if (inputType == PointerType.Mouse) {
-                            when (event.type) {
-                                PointerEventType.Enter -> {
-                                    launch { state.show(MutatePriority.UserInput) }
-                                }
-
-                                PointerEventType.Exit -> {
-                                    state.dismiss()
-                                }
-                            }
-                        }
-                    }
-                }
-            }
-        }
     } else this
 
 private fun Modifier.anchorSemantics(
diff --git a/compose/material3/material3/src/androidMain/kotlin/androidx/compose/material3/internal/CalendarModel.android.kt b/compose/material3/material3/src/androidMain/kotlin/androidx/compose/material3/internal/CalendarModel.android.kt
index 3b9c83e..dad7b59 100644
--- a/compose/material3/material3/src/androidMain/kotlin/androidx/compose/material3/internal/CalendarModel.android.kt
+++ b/compose/material3/material3/src/androidMain/kotlin/androidx/compose/material3/internal/CalendarModel.android.kt
@@ -20,9 +20,7 @@
 import android.text.format.DateFormat
 import androidx.compose.material3.CalendarLocale
 
-/**
- * Returns a [CalendarModel] to be used by the date picker.
- */
+/** Returns a [CalendarModel] to be used by the date picker. */
 internal actual fun createCalendarModel(locale: CalendarLocale): CalendarModel {
     return if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
         CalendarModelImpl(locale)
@@ -54,9 +52,12 @@
     // Prepend the skeleton and language tag with a "S" to avoid cache collisions when the
     // called already cached a string as value when the pattern equals to the skeleton it
     // was created from.
-    val pattern = cache.getOrPut(key = "S:$skeleton${locale.toLanguageTag()}") {
-        DateFormat.getBestDateTimePattern(locale, skeleton)
-    }.toString()
+    val pattern =
+        cache
+            .getOrPut(key = "S:$skeleton${locale.toLanguageTag()}") {
+                DateFormat.getBestDateTimePattern(locale, skeleton)
+            }
+            .toString()
     return if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
         CalendarModelImpl.formatWithPattern(utcTimeMillis, pattern, locale, cache)
     } else {
diff --git a/compose/material3/material3/src/androidMain/kotlin/androidx/compose/material3/internal/CalendarModelImpl.android.kt b/compose/material3/material3/src/androidMain/kotlin/androidx/compose/material3/internal/CalendarModelImpl.android.kt
index 1372ea6..63fafaa 100644
--- a/compose/material3/material3/src/androidMain/kotlin/androidx/compose/material3/internal/CalendarModelImpl.android.kt
+++ b/compose/material3/material3/src/androidMain/kotlin/androidx/compose/material3/internal/CalendarModelImpl.android.kt
@@ -51,8 +51,12 @@
                 year = systemLocalDate.year,
                 month = systemLocalDate.monthValue,
                 dayOfMonth = systemLocalDate.dayOfMonth,
-                utcTimeMillis = systemLocalDate.atTime(LocalTime.MIDNIGHT)
-                    .atZone(utcTimeZoneId).toInstant().toEpochMilli()
+                utcTimeMillis =
+                    systemLocalDate
+                        .atTime(LocalTime.MIDNIGHT)
+                        .atZone(utcTimeZoneId)
+                        .toInstant()
+                        .toEpochMilli()
             )
         }
 
@@ -62,13 +66,8 @@
         // This will start with Monday as the first day, according to ISO-8601.
         with(locale) {
             DayOfWeek.values().map {
-                it.getDisplayName(
-                    TextStyle.FULL,
-                    /* locale = */ this
-                ) to it.getDisplayName(
-                    TextStyle.NARROW,
-                    /* locale = */ this
-                )
+                it.getDisplayName(TextStyle.FULL, /* locale= */ this) to
+                    it.getDisplayName(TextStyle.NARROW, /* locale= */ this)
             }
         }
 
@@ -84,8 +83,7 @@
     }
 
     override fun getCanonicalDate(timeInMillis: Long): CalendarDate {
-        val localDate =
-            Instant.ofEpochMilli(timeInMillis).atZone(utcTimeZoneId).toLocalDate()
+        val localDate = Instant.ofEpochMilli(timeInMillis).atZone(utcTimeZoneId).toLocalDate()
         return CalendarDate(
             year = localDate.year,
             month = localDate.monthValue,
@@ -96,11 +94,7 @@
 
     override fun getMonth(timeInMillis: Long): CalendarMonth {
         return getMonth(
-            Instant
-                .ofEpochMilli(timeInMillis)
-                .atZone(utcTimeZoneId)
-                .withDayOfMonth(1)
-                .toLocalDate()
+            Instant.ofEpochMilli(timeInMillis).atZone(utcTimeZoneId).withDayOfMonth(1).toLocalDate()
         )
     }
 
@@ -147,8 +141,12 @@
                 year = localDate.year,
                 month = localDate.month.value,
                 dayOfMonth = localDate.dayOfMonth,
-                utcTimeMillis = localDate.atTime(LocalTime.MIDNIGHT)
-                    .atZone(utcTimeZoneId).toInstant().toEpochMilli()
+                utcTimeMillis =
+                    localDate
+                        .atTime(LocalTime.MIDNIGHT)
+                        .atZone(utcTimeZoneId)
+                        .toInstant()
+                        .toEpochMilli()
             )
         } catch (pe: DateTimeParseException) {
             null
@@ -176,16 +174,13 @@
             cache: MutableMap<String, Any>
         ): String {
             val formatter = getCachedDateTimeFormatter(pattern, locale, cache)
-            return Instant
-                .ofEpochMilli(utcTimeMillis)
+            return Instant.ofEpochMilli(utcTimeMillis)
                 .atZone(utcTimeZoneId)
                 .toLocalDate()
                 .format(formatter)
         }
 
-        /**
-         * Holds a UTC [ZoneId].
-         */
+        /** Holds a UTC [ZoneId]. */
         internal val utcTimeZoneId: ZoneId = ZoneId.of("UTC")
 
         private fun getCachedDateTimeFormatter(
@@ -205,13 +200,17 @@
 
     private fun getMonth(firstDayLocalDate: LocalDate): CalendarMonth {
         val difference = firstDayLocalDate.dayOfWeek.value - firstDayOfWeek
-        val daysFromStartOfWeekToFirstOfMonth = if (difference < 0) {
-            difference + DaysInWeek
-        } else {
-            difference
-        }
+        val daysFromStartOfWeekToFirstOfMonth =
+            if (difference < 0) {
+                difference + DaysInWeek
+            } else {
+                difference
+            }
         val firstDayEpochMillis =
-            firstDayLocalDate.atTime(LocalTime.MIDNIGHT).atZone(utcTimeZoneId).toInstant()
+            firstDayLocalDate
+                .atTime(LocalTime.MIDNIGHT)
+                .atZone(utcTimeZoneId)
+                .toInstant()
                 .toEpochMilli()
         return CalendarMonth(
             year = firstDayLocalDate.year,
@@ -227,10 +226,6 @@
     }
 
     private fun CalendarDate.toLocalDate(): LocalDate {
-        return LocalDate.of(
-            this.year,
-            this.month,
-            this.dayOfMonth
-        )
+        return LocalDate.of(this.year, this.month, this.dayOfMonth)
     }
 }
diff --git a/compose/material3/material3/src/androidMain/kotlin/androidx/compose/material3/internal/DefaultPlatformTextStyle.android.kt b/compose/material3/material3/src/androidMain/kotlin/androidx/compose/material3/internal/DefaultPlatformTextStyle.android.kt
index 6950b79..9691f0e 100644
--- a/compose/material3/material3/src/androidMain/kotlin/androidx/compose/material3/internal/DefaultPlatformTextStyle.android.kt
+++ b/compose/material3/material3/src/androidMain/kotlin/androidx/compose/material3/internal/DefaultPlatformTextStyle.android.kt
@@ -21,7 +21,7 @@
 private const val DefaultIncludeFontPadding = false
 
 @Suppress("DEPRECATION")
-private val DefaultPlatformTextStyle = PlatformTextStyle(
-    includeFontPadding = DefaultIncludeFontPadding
-)
+private val DefaultPlatformTextStyle =
+    PlatformTextStyle(includeFontPadding = DefaultIncludeFontPadding)
+
 internal actual fun defaultPlatformTextStyle(): PlatformTextStyle? = DefaultPlatformTextStyle
diff --git a/compose/material3/material3/src/androidMain/kotlin/androidx/compose/material3/internal/Strings.android.kt b/compose/material3/material3/src/androidMain/kotlin/androidx/compose/material3/internal/Strings.android.kt
index 05ead5e..b442670 100644
--- a/compose/material3/material3/src/androidMain/kotlin/androidx/compose/material3/internal/Strings.android.kt
+++ b/compose/material3/material3/src/androidMain/kotlin/androidx/compose/material3/internal/Strings.android.kt
@@ -47,122 +47,196 @@
 @Immutable
 internal actual value class Strings constructor(val value: Int) {
     actual companion object {
-        actual inline val DefaultErrorMessage get() = Strings(R.string.default_error_message)
-        actual inline val ExposedDropdownMenu get() = Strings(R.string.dropdown_menu)
-        actual inline val SliderRangeStart get() = Strings(R.string.range_start)
-        actual inline val SliderRangeEnd get() = Strings(R.string.range_end)
-        actual inline val Dialog get() = Strings(MaterialR.string.m3c_dialog)
+        actual inline val DefaultErrorMessage
+            get() = Strings(R.string.default_error_message)
+
+        actual inline val ExposedDropdownMenu
+            get() = Strings(R.string.dropdown_menu)
+
+        actual inline val SliderRangeStart
+            get() = Strings(R.string.range_start)
+
+        actual inline val SliderRangeEnd
+            get() = Strings(R.string.range_end)
+
+        actual inline val Dialog
+            get() = Strings(MaterialR.string.m3c_dialog)
+
         actual inline val MenuExpanded
             get() = Strings(MaterialR.string.m3c_dropdown_menu_expanded)
+
         actual inline val MenuCollapsed
             get() = Strings(MaterialR.string.m3c_dropdown_menu_collapsed)
+
         actual inline val ToggleDropdownMenu
             get() = Strings(MaterialR.string.m3c_dropdown_menu_toggle)
-        actual inline val SnackbarDismiss get() = Strings(MaterialR.string.m3c_snackbar_dismiss)
-        actual inline val SearchBarSearch get() = Strings(MaterialR.string.m3c_search_bar_search)
+
+        actual inline val SnackbarDismiss
+            get() = Strings(MaterialR.string.m3c_snackbar_dismiss)
+
+        actual inline val SearchBarSearch
+            get() = Strings(MaterialR.string.m3c_search_bar_search)
+
         actual inline val SuggestionsAvailable
             get() = Strings(MaterialR.string.m3c_suggestions_available)
-        actual inline val DatePickerTitle get() = Strings(MaterialR.string.m3c_date_picker_title)
+
+        actual inline val DatePickerTitle
+            get() = Strings(MaterialR.string.m3c_date_picker_title)
+
         actual inline val DatePickerHeadline
             get() = Strings(MaterialR.string.m3c_date_picker_headline)
+
         actual inline val DatePickerYearPickerPaneTitle
             get() = Strings(MaterialR.string.m3c_date_picker_year_picker_pane_title)
+
         actual inline val DatePickerSwitchToYearSelection
             get() = Strings(MaterialR.string.m3c_date_picker_switch_to_year_selection)
+
         actual inline val DatePickerSwitchToDaySelection
             get() = Strings(MaterialR.string.m3c_date_picker_switch_to_day_selection)
+
         actual inline val DatePickerSwitchToNextMonth
             get() = Strings(MaterialR.string.m3c_date_picker_switch_to_next_month)
+
         actual inline val DatePickerSwitchToPreviousMonth
             get() = Strings(MaterialR.string.m3c_date_picker_switch_to_previous_month)
+
         actual inline val DatePickerNavigateToYearDescription
             get() = Strings(MaterialR.string.m3c_date_picker_navigate_to_year_description)
+
         actual inline val DatePickerHeadlineDescription
             get() = Strings(MaterialR.string.m3c_date_picker_headline_description)
+
         actual inline val DatePickerNoSelectionDescription
             get() = Strings(MaterialR.string.m3c_date_picker_no_selection_description)
+
         actual inline val DatePickerTodayDescription
             get() = Strings(MaterialR.string.m3c_date_picker_today_description)
+
         actual inline val DatePickerScrollToShowLaterYears
             get() = Strings(MaterialR.string.m3c_date_picker_scroll_to_later_years)
+
         actual inline val DatePickerScrollToShowEarlierYears
             get() = Strings(MaterialR.string.m3c_date_picker_scroll_to_earlier_years)
+
         actual inline val DateInputTitle
             get() = Strings(MaterialR.string.m3c_date_input_title)
+
         actual inline val DateInputHeadline
             get() = Strings(MaterialR.string.m3c_date_input_headline)
+
         actual inline val DateInputLabel
             get() = Strings(MaterialR.string.m3c_date_input_label)
+
         actual inline val DateInputHeadlineDescription
             get() = Strings(MaterialR.string.m3c_date_input_headline_description)
+
         actual inline val DateInputNoInputDescription
             get() = Strings(MaterialR.string.m3c_date_input_no_input_description)
+
         actual inline val DateInputInvalidNotAllowed
             get() = Strings(MaterialR.string.m3c_date_input_invalid_not_allowed)
+
         actual inline val DateInputInvalidForPattern
             get() = Strings(MaterialR.string.m3c_date_input_invalid_for_pattern)
+
         actual inline val DateInputInvalidYearRange
             get() = Strings(MaterialR.string.m3c_date_input_invalid_year_range)
+
         actual inline val DatePickerSwitchToCalendarMode
             get() = Strings(MaterialR.string.m3c_date_picker_switch_to_calendar_mode)
+
         actual inline val DatePickerSwitchToInputMode
             get() = Strings(MaterialR.string.m3c_date_picker_switch_to_input_mode)
+
         actual inline val DateRangePickerTitle
             get() = Strings(MaterialR.string.m3c_date_range_picker_title)
+
         actual inline val DateRangePickerStartHeadline
             get() = Strings(MaterialR.string.m3c_date_range_picker_start_headline)
+
         actual inline val DateRangePickerEndHeadline
             get() = Strings(MaterialR.string.m3c_date_range_picker_end_headline)
+
         actual inline val DateRangePickerScrollToShowNextMonth
             get() = Strings(MaterialR.string.m3c_date_range_picker_scroll_to_next_month)
+
         actual inline val DateRangePickerScrollToShowPreviousMonth
             get() = Strings(MaterialR.string.m3c_date_range_picker_scroll_to_previous_month)
+
         actual inline val DateRangePickerDayInRange
             get() = Strings(MaterialR.string.m3c_date_range_picker_day_in_range)
+
         actual inline val DateRangeInputTitle
             get() = Strings(MaterialR.string.m3c_date_range_input_title)
+
         actual inline val DateRangeInputInvalidRangeInput
             get() = Strings(MaterialR.string.m3c_date_range_input_invalid_range_input)
+
         actual inline val BottomSheetPaneTitle
             get() = Strings(MaterialR.string.m3c_bottom_sheet_pane_title)
+
         actual inline val BottomSheetDragHandleDescription
             get() = Strings(MaterialR.string.m3c_bottom_sheet_drag_handle_description)
+
         actual inline val BottomSheetPartialExpandDescription
             get() = Strings(MaterialR.string.m3c_bottom_sheet_collapse_description)
+
         actual inline val BottomSheetDismissDescription
             get() = Strings(MaterialR.string.m3c_bottom_sheet_dismiss_description)
+
         actual inline val BottomSheetExpandDescription
             get() = Strings(MaterialR.string.m3c_bottom_sheet_expand_description)
+
         actual inline val TooltipLongPressLabel
             get() = Strings(MaterialR.string.m3c_tooltip_long_press_label)
+
         actual inline val TimePickerAM
             get() = Strings(MaterialR.string.m3c_time_picker_am)
+
         actual inline val TimePickerPM
             get() = Strings(MaterialR.string.m3c_time_picker_pm)
+
         actual inline val TimePickerPeriodToggle
             get() = Strings(MaterialR.string.m3c_time_picker_period_toggle_description)
+
         actual inline val TimePickerMinuteSelection
             get() = Strings(MaterialR.string.m3c_time_picker_minute_selection)
+
         actual inline val TimePickerHourSelection
             get() = Strings(MaterialR.string.m3c_time_picker_hour_selection)
+
         actual inline val TimePickerHourSuffix
             get() = Strings(MaterialR.string.m3c_time_picker_hour_suffix)
+
         actual inline val TimePickerMinuteSuffix
             get() = Strings(MaterialR.string.m3c_time_picker_minute_suffix)
+
         actual inline val TimePicker24HourSuffix
             get() = Strings(MaterialR.string.m3c_time_picker_hour_24h_suffix)
+
         actual inline val TimePickerHour
             get() = Strings(MaterialR.string.m3c_time_picker_hour)
+
         actual inline val TimePickerMinute
             get() = Strings(MaterialR.string.m3c_time_picker_minute)
+
         actual inline val TimePickerHourTextField
             get() = Strings(MaterialR.string.m3c_time_picker_hour_text_field)
+
         actual inline val TimePickerMinuteTextField
             get() = Strings(MaterialR.string.m3c_time_picker_minute_text_field)
+
         actual inline val TooltipPaneDescription
             get() = Strings(MaterialR.string.m3c_tooltip_pane_description)
-        actual inline val NavigationMenu get() = Strings(R.string.navigation_menu)
-        actual inline val CloseDrawer get() = Strings(R.string.close_drawer)
-        actual inline val CloseSheet get() = Strings(R.string.close_sheet)
+
+        actual inline val NavigationMenu
+            get() = Strings(R.string.navigation_menu)
+
+        actual inline val CloseDrawer
+            get() = Strings(R.string.close_drawer)
+
+        actual inline val CloseSheet
+            get() = Strings(R.string.close_sheet)
     }
 }
diff --git a/compose/material3/material3/src/androidMain/kotlin/androidx/compose/material3/internal/SystemBarsDefaultInsets.android.kt b/compose/material3/material3/src/androidMain/kotlin/androidx/compose/material3/internal/SystemBarsDefaultInsets.android.kt
index 4eb2a6b..fe4e4a7 100644
--- a/compose/material3/material3/src/androidMain/kotlin/androidx/compose/material3/internal/SystemBarsDefaultInsets.android.kt
+++ b/compose/material3/material3/src/androidMain/kotlin/androidx/compose/material3/internal/SystemBarsDefaultInsets.android.kt
@@ -21,5 +21,4 @@
 import androidx.compose.runtime.Composable
 
 internal actual val WindowInsets.Companion.systemBarsForVisualComponents: WindowInsets
-    @Composable
-    get() = systemBars
+    @Composable get() = systemBars
diff --git a/compose/material3/material3/src/androidUnitTest/kotlin/androidx/compose/material3/carousel/ArrangementTest.kt b/compose/material3/material3/src/androidUnitTest/kotlin/androidx/compose/material3/carousel/ArrangementTest.kt
index 832b6e5..e89263d 100644
--- a/compose/material3/material3/src/androidUnitTest/kotlin/androidx/compose/material3/carousel/ArrangementTest.kt
+++ b/compose/material3/material3/src/androidUnitTest/kotlin/androidx/compose/material3/carousel/ArrangementTest.kt
@@ -31,18 +31,19 @@
         val targetLargeSize = 56f * 3f
         val targetMediumSize = (targetLargeSize + targetSmallSize) / 2f
 
-        val arrangement = Arrangement.findLowestCostArrangement(
-            availableSpace = targetLargeSize + targetMediumSize + targetSmallSize,
-            itemSpacing = 0f,
-            targetSmallSize = targetSmallSize,
-            minSmallSize = 40f,
-            maxSmallSize = 56f,
-            smallCounts = intArrayOf(1),
-            targetMediumSize = targetMediumSize,
-            mediumCounts = intArrayOf(1),
-            targetLargeSize = targetLargeSize,
-            largeCounts = intArrayOf(1)
-        )
+        val arrangement =
+            Arrangement.findLowestCostArrangement(
+                availableSpace = targetLargeSize + targetMediumSize + targetSmallSize,
+                itemSpacing = 0f,
+                targetSmallSize = targetSmallSize,
+                minSmallSize = 40f,
+                maxSmallSize = 56f,
+                smallCounts = intArrayOf(1),
+                targetMediumSize = targetMediumSize,
+                mediumCounts = intArrayOf(1),
+                targetLargeSize = targetLargeSize,
+                largeCounts = intArrayOf(1)
+            )
         assertThat(arrangement?.largeSize).isEqualTo(targetLargeSize)
         assertThat(arrangement?.mediumSize).isEqualTo(targetMediumSize)
         assertThat(arrangement?.smallSize).isEqualTo(targetSmallSize)
@@ -53,18 +54,19 @@
         val targetSmallSize = 56f
         val targetLargeSize = 56f * 3f
         val targetMediumSize = (targetLargeSize + targetSmallSize) / 2f
-        val arrangement = Arrangement.findLowestCostArrangement(
-            availableSpace = targetLargeSize + targetMediumSize + targetSmallSize - 10f,
-            itemSpacing = 0f,
-            targetSmallSize = targetSmallSize,
-            minSmallSize = 40f,
-            maxSmallSize = 56f,
-            smallCounts = intArrayOf(1),
-            targetMediumSize = targetMediumSize,
-            mediumCounts = intArrayOf(1),
-            targetLargeSize = targetLargeSize,
-            largeCounts = intArrayOf(1)
-        )
+        val arrangement =
+            Arrangement.findLowestCostArrangement(
+                availableSpace = targetLargeSize + targetMediumSize + targetSmallSize - 10f,
+                itemSpacing = 0f,
+                targetSmallSize = targetSmallSize,
+                minSmallSize = 40f,
+                maxSmallSize = 56f,
+                smallCounts = intArrayOf(1),
+                targetMediumSize = targetMediumSize,
+                mediumCounts = intArrayOf(1),
+                targetLargeSize = targetLargeSize,
+                largeCounts = intArrayOf(1)
+            )
         assertThat(arrangement?.largeSize).isEqualTo(targetLargeSize)
         assertThat(arrangement?.mediumSize?.roundToInt()).isEqualTo(targetMediumSize.roundToInt())
         assertThat(arrangement?.smallSize).isEqualTo(targetSmallSize - 10f)
@@ -75,18 +77,19 @@
         val targetSmallSize = 40f
         val targetLargeSize = 40f * 3f
         val targetMediumSize = (targetLargeSize + targetSmallSize) / 2f
-        val arrangement = Arrangement.findLowestCostArrangement(
-            availableSpace = targetLargeSize + targetMediumSize + targetSmallSize + 10f,
-            itemSpacing = 0f,
-            targetSmallSize = targetSmallSize,
-            minSmallSize = 40f,
-            maxSmallSize = 56f,
-            smallCounts = intArrayOf(1),
-            targetMediumSize = targetMediumSize,
-            mediumCounts = intArrayOf(1),
-            targetLargeSize = targetLargeSize,
-            largeCounts = intArrayOf(1)
-        )
+        val arrangement =
+            Arrangement.findLowestCostArrangement(
+                availableSpace = targetLargeSize + targetMediumSize + targetSmallSize + 10f,
+                itemSpacing = 0f,
+                targetSmallSize = targetSmallSize,
+                minSmallSize = 40f,
+                maxSmallSize = 56f,
+                smallCounts = intArrayOf(1),
+                targetMediumSize = targetMediumSize,
+                mediumCounts = intArrayOf(1),
+                targetLargeSize = targetLargeSize,
+                largeCounts = intArrayOf(1)
+            )
         assertThat(arrangement?.largeSize).isEqualTo(targetLargeSize)
         assertThat(arrangement?.mediumSize?.roundToInt()).isEqualTo(targetMediumSize.roundToInt())
         assertThat(arrangement?.smallSize).isEqualTo(targetSmallSize + 10f)
@@ -98,20 +101,20 @@
         val targetLargeSize = 40f * 3f
         val targetMediumSize = (targetLargeSize + targetSmallSize) / 2f
         val mediumAdjustment = targetMediumSize * .05f
-        val arrangement = Arrangement.findLowestCostArrangement(
-            availableSpace = targetLargeSize +
-                targetMediumSize +
-                targetSmallSize - mediumAdjustment,
-            itemSpacing = 0f,
-            targetSmallSize = targetSmallSize,
-            minSmallSize = 40f,
-            maxSmallSize = 56f,
-            smallCounts = intArrayOf(1),
-            targetMediumSize = targetMediumSize,
-            mediumCounts = intArrayOf(1),
-            targetLargeSize = targetLargeSize,
-            largeCounts = intArrayOf(1)
-        )
+        val arrangement =
+            Arrangement.findLowestCostArrangement(
+                availableSpace =
+                    targetLargeSize + targetMediumSize + targetSmallSize - mediumAdjustment,
+                itemSpacing = 0f,
+                targetSmallSize = targetSmallSize,
+                minSmallSize = 40f,
+                maxSmallSize = 56f,
+                smallCounts = intArrayOf(1),
+                targetMediumSize = targetMediumSize,
+                mediumCounts = intArrayOf(1),
+                targetLargeSize = targetLargeSize,
+                largeCounts = intArrayOf(1)
+            )
         assertThat(arrangement?.largeSize).isEqualTo(targetLargeSize)
         assertThat(arrangement?.mediumSize?.roundToInt())
             .isEqualTo((targetMediumSize - mediumAdjustment).roundToInt())
@@ -124,20 +127,20 @@
         val targetLargeSize = 56f * 3f
         val targetMediumSize = (targetLargeSize + targetSmallSize) / 2f
         val mediumAdjustment = targetMediumSize * .05f
-        val arrangement = Arrangement.findLowestCostArrangement(
-            availableSpace = targetLargeSize +
-                targetMediumSize +
-                targetSmallSize + mediumAdjustment,
-            itemSpacing = 0f,
-            targetSmallSize = targetSmallSize,
-            minSmallSize = 40f,
-            maxSmallSize = 56f,
-            smallCounts = intArrayOf(1),
-            targetMediumSize = targetMediumSize,
-            mediumCounts = intArrayOf(1),
-            targetLargeSize = targetLargeSize,
-            largeCounts = intArrayOf(1)
-        )
+        val arrangement =
+            Arrangement.findLowestCostArrangement(
+                availableSpace =
+                    targetLargeSize + targetMediumSize + targetSmallSize + mediumAdjustment,
+                itemSpacing = 0f,
+                targetSmallSize = targetSmallSize,
+                minSmallSize = 40f,
+                maxSmallSize = 56f,
+                smallCounts = intArrayOf(1),
+                targetMediumSize = targetMediumSize,
+                mediumCounts = intArrayOf(1),
+                targetLargeSize = targetLargeSize,
+                largeCounts = intArrayOf(1)
+            )
         assertThat(arrangement?.largeSize).isEqualTo(targetLargeSize)
         assertThat(arrangement?.mediumSize?.roundToInt())
             .isEqualTo((targetMediumSize + mediumAdjustment).roundToInt())
@@ -150,21 +153,23 @@
         val targetLargeSize = 40f * 3f
         val targetMediumSize = (targetLargeSize + targetSmallSize) / 2f
         val smallAdjustment = 10f
-        val arrangement = Arrangement.findLowestCostArrangement(
-            availableSpace = targetLargeSize +
-                targetMediumSize +
-                (targetSmallSize * 2) +
-                (smallAdjustment * 2),
-            itemSpacing = 0f,
-            targetSmallSize = targetSmallSize,
-            minSmallSize = 40f,
-            maxSmallSize = 56f,
-            smallCounts = intArrayOf(2),
-            targetMediumSize = targetMediumSize,
-            mediumCounts = intArrayOf(1),
-            targetLargeSize = targetLargeSize,
-            largeCounts = intArrayOf(1)
-        )
+        val arrangement =
+            Arrangement.findLowestCostArrangement(
+                availableSpace =
+                    targetLargeSize +
+                        targetMediumSize +
+                        (targetSmallSize * 2) +
+                        (smallAdjustment * 2),
+                itemSpacing = 0f,
+                targetSmallSize = targetSmallSize,
+                minSmallSize = 40f,
+                maxSmallSize = 56f,
+                smallCounts = intArrayOf(2),
+                targetMediumSize = targetMediumSize,
+                mediumCounts = intArrayOf(1),
+                targetLargeSize = targetLargeSize,
+                largeCounts = intArrayOf(1)
+            )
         assertThat(arrangement?.largeSize).isEqualTo(targetLargeSize)
         assertThat(arrangement?.mediumSize?.roundToInt()).isEqualTo(targetMediumSize.roundToInt())
         assertThat(arrangement?.smallSize).isEqualTo(targetSmallSize + smallAdjustment)
@@ -177,20 +182,21 @@
         val targetMediumSize = (targetLargeSize + targetSmallSize) / 2f
         val smallAdjustment = 10f
 
-        val arrangement = Arrangement.findLowestCostArrangement(
-            availableSpace = targetLargeSize +
-                targetMediumSize +
-                (targetSmallSize * 2) - (smallAdjustment * 2),
-            itemSpacing = 0f,
-            targetSmallSize = targetSmallSize,
-            minSmallSize = 40f,
-            maxSmallSize = 56f,
-            smallCounts = intArrayOf(2),
-            targetMediumSize = targetMediumSize,
-            mediumCounts = intArrayOf(1),
-            targetLargeSize = targetLargeSize,
-            largeCounts = intArrayOf(1)
-        )
+        val arrangement =
+            Arrangement.findLowestCostArrangement(
+                availableSpace =
+                    targetLargeSize + targetMediumSize + (targetSmallSize * 2) -
+                        (smallAdjustment * 2),
+                itemSpacing = 0f,
+                targetSmallSize = targetSmallSize,
+                minSmallSize = 40f,
+                maxSmallSize = 56f,
+                smallCounts = intArrayOf(2),
+                targetMediumSize = targetMediumSize,
+                mediumCounts = intArrayOf(1),
+                targetLargeSize = targetLargeSize,
+                largeCounts = intArrayOf(1)
+            )
         assertThat(arrangement?.largeSize).isEqualTo(targetLargeSize)
         assertThat(arrangement?.mediumSize?.roundToInt()).isEqualTo(targetMediumSize.roundToInt())
         assertThat(arrangement?.smallSize).isEqualTo(targetSmallSize - smallAdjustment)
@@ -202,21 +208,23 @@
         val targetLargeSize = 56f * 3f
         val targetMediumSize = (targetLargeSize + targetSmallSize) / 2f
         val mediumAdjustment = targetMediumSize * .05f
-        val arrangement = Arrangement.findLowestCostArrangement(
-            availableSpace = (targetLargeSize * 2) +
-                (targetMediumSize * 2) +
-                (targetSmallSize * 2) +
-                (mediumAdjustment * 2),
-            itemSpacing = 0f,
-            targetSmallSize = targetSmallSize,
-            minSmallSize = 40f,
-            maxSmallSize = 56f,
-            smallCounts = intArrayOf(2),
-            targetMediumSize = targetMediumSize,
-            mediumCounts = intArrayOf(2),
-            targetLargeSize = targetLargeSize,
-            largeCounts = intArrayOf(2)
-        )
+        val arrangement =
+            Arrangement.findLowestCostArrangement(
+                availableSpace =
+                    (targetLargeSize * 2) +
+                        (targetMediumSize * 2) +
+                        (targetSmallSize * 2) +
+                        (mediumAdjustment * 2),
+                itemSpacing = 0f,
+                targetSmallSize = targetSmallSize,
+                minSmallSize = 40f,
+                maxSmallSize = 56f,
+                smallCounts = intArrayOf(2),
+                targetMediumSize = targetMediumSize,
+                mediumCounts = intArrayOf(2),
+                targetLargeSize = targetLargeSize,
+                largeCounts = intArrayOf(2)
+            )
         assertThat(arrangement?.largeSize).isEqualTo(targetLargeSize)
         assertThat(arrangement?.mediumSize?.roundToInt())
             .isEqualTo((targetMediumSize + mediumAdjustment).roundToInt())
@@ -229,20 +237,21 @@
         val targetLargeSize = 40f * 3f
         val targetMediumSize = (targetLargeSize + targetSmallSize) / 2f
         val mediumAdjustment = targetMediumSize * .05f
-        val arrangement = Arrangement.findLowestCostArrangement(
-            availableSpace = (targetLargeSize * 2) +
-                (targetMediumSize * 2) +
-                (targetSmallSize * 2) - (mediumAdjustment * 2),
-            itemSpacing = 0f,
-            targetSmallSize = targetSmallSize,
-            minSmallSize = 40f,
-            maxSmallSize = 56f,
-            smallCounts = intArrayOf(2),
-            targetMediumSize = targetMediumSize,
-            mediumCounts = intArrayOf(2),
-            targetLargeSize = targetLargeSize,
-            largeCounts = intArrayOf(2)
-        )
+        val arrangement =
+            Arrangement.findLowestCostArrangement(
+                availableSpace =
+                    (targetLargeSize * 2) + (targetMediumSize * 2) + (targetSmallSize * 2) -
+                        (mediumAdjustment * 2),
+                itemSpacing = 0f,
+                targetSmallSize = targetSmallSize,
+                minSmallSize = 40f,
+                maxSmallSize = 56f,
+                smallCounts = intArrayOf(2),
+                targetMediumSize = targetMediumSize,
+                mediumCounts = intArrayOf(2),
+                targetLargeSize = targetLargeSize,
+                largeCounts = intArrayOf(2)
+            )
         assertThat(arrangement?.largeSize).isEqualTo(targetLargeSize)
         assertThat(arrangement?.mediumSize?.roundToInt())
             .isEqualTo((targetMediumSize - mediumAdjustment).roundToInt())
diff --git a/compose/material3/material3/src/androidUnitTest/kotlin/androidx/compose/material3/carousel/KeylineSnapPositionTest.kt b/compose/material3/material3/src/androidUnitTest/kotlin/androidx/compose/material3/carousel/KeylineSnapPositionTest.kt
index 0410575..39314a5 100644
--- a/compose/material3/material3/src/androidUnitTest/kotlin/androidx/compose/material3/carousel/KeylineSnapPositionTest.kt
+++ b/compose/material3/material3/src/androidUnitTest/kotlin/androidx/compose/material3/carousel/KeylineSnapPositionTest.kt
@@ -73,8 +73,8 @@
     fun testSnapPosition_forStartAlignedStrategyWithLessItemsThanFocal() {
         val strategy = testStartAlignedStrategyWithMultipleFocal()
         // item count is the number of focal keylines minus one
-        val itemCount = strategy.defaultKeylines.lastFocalIndex -
-            strategy.defaultKeylines.firstFocalIndex
+        val itemCount =
+            strategy.defaultKeylines.lastFocalIndex - strategy.defaultKeylines.firstFocalIndex
         repeat(itemCount) { i ->
             assertThat(getSnapPositionOffset(strategy, i, itemCount)).isEqualTo(0)
         }
@@ -95,19 +95,20 @@
         val smallSize = 100f
         val mediumSize = 200f
         val largeSize = 400f
-        val keylineList = keylineListOf(
-            carouselMainAxisSize = 1000f,
-            itemSpacing = 0f,
-            carouselAlignment = CarouselAlignment.Center
-        ) {
-            add(xSmallSize, isAnchor = true)
-            add(smallSize)
-            add(mediumSize)
-            add(largeSize)
-            add(mediumSize)
-            add(smallSize)
-            add(xSmallSize, isAnchor = true)
-        }
+        val keylineList =
+            keylineListOf(
+                carouselMainAxisSize = 1000f,
+                itemSpacing = 0f,
+                carouselAlignment = CarouselAlignment.Center
+            ) {
+                add(xSmallSize, isAnchor = true)
+                add(smallSize)
+                add(mediumSize)
+                add(largeSize)
+                add(mediumSize)
+                add(smallSize)
+                add(xSmallSize, isAnchor = true)
+            }
 
         return Strategy(
             defaultKeylines = keylineList,
@@ -132,19 +133,20 @@
         val smallSize = 100f
         val mediumSize = 200f
         val largeSize = 400f
-        val keylineList = keylineListOf(
-            carouselMainAxisSize = 1000f,
-            itemSpacing = 0f,
-            carouselAlignment = CarouselAlignment.Start
-        ) {
-            add(xSmallSize, isAnchor = true)
-            add(largeSize)
-            add(mediumSize)
-            add(mediumSize)
-            add(smallSize)
-            add(smallSize)
-            add(xSmallSize, isAnchor = true)
-        }
+        val keylineList =
+            keylineListOf(
+                carouselMainAxisSize = 1000f,
+                itemSpacing = 0f,
+                carouselAlignment = CarouselAlignment.Start
+            ) {
+                add(xSmallSize, isAnchor = true)
+                add(largeSize)
+                add(mediumSize)
+                add(mediumSize)
+                add(smallSize)
+                add(smallSize)
+                add(xSmallSize, isAnchor = true)
+            }
         return Strategy(
             defaultKeylines = keylineList,
             availableSpace = 1000f,
@@ -166,14 +168,15 @@
         val smallSize = 75f
         val mediumSize = 125f
         val largeSize = 400f
-        val keylineList = keylineListOf(carouselMainAxisSize = 1000f, 0f, CarouselAlignment.Start) {
-            add(xSmallSize, isAnchor = true)
-            add(largeSize)
-            add(largeSize)
-            add(mediumSize)
-            add(smallSize)
-            add(xSmallSize, isAnchor = true)
-        }
+        val keylineList =
+            keylineListOf(carouselMainAxisSize = 1000f, 0f, CarouselAlignment.Start) {
+                add(xSmallSize, isAnchor = true)
+                add(largeSize)
+                add(largeSize)
+                add(mediumSize)
+                add(smallSize)
+                add(xSmallSize, isAnchor = true)
+            }
         return Strategy(
             defaultKeylines = keylineList,
             availableSpace = 1000f,
diff --git a/compose/material3/material3/src/androidUnitTest/kotlin/androidx/compose/material3/carousel/KeylineTest.kt b/compose/material3/material3/src/androidUnitTest/kotlin/androidx/compose/material3/carousel/KeylineTest.kt
index f47697e..f68838a 100644
--- a/compose/material3/material3/src/androidUnitTest/kotlin/androidx/compose/material3/carousel/KeylineTest.kt
+++ b/compose/material3/material3/src/androidUnitTest/kotlin/androidx/compose/material3/carousel/KeylineTest.kt
@@ -35,51 +35,49 @@
     @Test
     fun testKeylineList_pivotsWithCorrectCutoffsRight() {
         val carouselMainAxisSize = LargeSize + (MediumSize * .75f).roundToInt()
-        val keylineList = keylineListOf(
-            carouselMainAxisSize = carouselMainAxisSize,
-            itemSpacing = 0f,
-            carouselAlignment = CarouselAlignment.Start
-        ) {
-            add(SmallSize, isAnchor = true)
-            add(LargeSize)
-            add(MediumSize)
-            add(SmallSize, isAnchor = true)
-        }
+        val keylineList =
+            keylineListOf(
+                carouselMainAxisSize = carouselMainAxisSize,
+                itemSpacing = 0f,
+                carouselAlignment = CarouselAlignment.Start
+            ) {
+                add(SmallSize, isAnchor = true)
+                add(LargeSize)
+                add(MediumSize)
+                add(SmallSize, isAnchor = true)
+            }
 
-        assertThat(keylineList[2].cutoff)
-            .isEqualTo(MediumSize - (MediumSize * .75f).roundToInt())
+        assertThat(keylineList[2].cutoff).isEqualTo(MediumSize - (MediumSize * .75f).roundToInt())
     }
 
     @Test
     fun testKeylineList_pivotsWithCorrectCutoffsLeft() {
         val carouselMainAxisSize = (MediumSize * .75f).roundToInt() + LargeSize
-        val keylineList = keylineListOf(
-            carouselMainAxisSize = carouselMainAxisSize,
-            itemSpacing = 0f,
-            carouselAlignment = CarouselAlignment.End
-        ) {
-            add(SmallSize, isAnchor = true)
-            add(MediumSize)
-            add(LargeSize)
-            add(SmallSize, isAnchor = true)
-        }
+        val keylineList =
+            keylineListOf(
+                carouselMainAxisSize = carouselMainAxisSize,
+                itemSpacing = 0f,
+                carouselAlignment = CarouselAlignment.End
+            ) {
+                add(SmallSize, isAnchor = true)
+                add(MediumSize)
+                add(LargeSize)
+                add(SmallSize, isAnchor = true)
+            }
 
-        assertThat(keylineList[1].cutoff)
-            .isEqualTo(MediumSize * 0.25f)
+        assertThat(keylineList[1].cutoff).isEqualTo(MediumSize * 0.25f)
     }
 
     @Test
     fun testKeylineList_findsFirstIndexAfterFocalRangeWithSize() {
         val keylineList = createTestKeylineList()
-        assertThat(keylineList.firstIndexAfterFocalRangeWithSize(SmallSize))
-            .isEqualTo(7)
+        assertThat(keylineList.firstIndexAfterFocalRangeWithSize(SmallSize)).isEqualTo(7)
     }
 
     @Test
     fun testKeylineList_findsLastIndexBeforeFocalRangeWithSize() {
         val keylineList = createTestKeylineList()
-        assertThat(keylineList.lastIndexBeforeFocalRangeWithSize(SmallSize))
-            .isEqualTo(2)
+        assertThat(keylineList.lastIndexBeforeFocalRangeWithSize(SmallSize)).isEqualTo(2)
     }
 
     @Test
@@ -103,43 +101,46 @@
     @Test
     fun testKeylineListLerp() {
         val carouselMainAxisSize = StrategyTest.large + StrategyTest.medium + StrategyTest.small
-        val from = keylineListOf(
-            carouselMainAxisSize = carouselMainAxisSize,
-            itemSpacing = 0f,
-            pivotIndex = 1,
-            pivotOffset = StrategyTest.large / 2
-        ) {
-            add(StrategyTest.xSmall, isAnchor = true)
-            add(StrategyTest.large)
-            add(StrategyTest.medium)
-            add(StrategyTest.small)
-            add(StrategyTest.xSmall, isAnchor = true)
-        }
-        val to = keylineListOf(
-            carouselMainAxisSize = carouselMainAxisSize,
-            itemSpacing = 0f,
-            pivotIndex = 2,
-            pivotOffset = StrategyTest.small + (StrategyTest.large / 2)
-        ) {
-            add(StrategyTest.xSmall, isAnchor = true)
-            add(StrategyTest.small)
-            add(StrategyTest.large)
-            add(StrategyTest.medium)
-            add(StrategyTest.xSmall, isAnchor = true)
-        }
+        val from =
+            keylineListOf(
+                carouselMainAxisSize = carouselMainAxisSize,
+                itemSpacing = 0f,
+                pivotIndex = 1,
+                pivotOffset = StrategyTest.large / 2
+            ) {
+                add(StrategyTest.xSmall, isAnchor = true)
+                add(StrategyTest.large)
+                add(StrategyTest.medium)
+                add(StrategyTest.small)
+                add(StrategyTest.xSmall, isAnchor = true)
+            }
+        val to =
+            keylineListOf(
+                carouselMainAxisSize = carouselMainAxisSize,
+                itemSpacing = 0f,
+                pivotIndex = 2,
+                pivotOffset = StrategyTest.small + (StrategyTest.large / 2)
+            ) {
+                add(StrategyTest.xSmall, isAnchor = true)
+                add(StrategyTest.small)
+                add(StrategyTest.large)
+                add(StrategyTest.medium)
+                add(StrategyTest.xSmall, isAnchor = true)
+            }
 
         // Create the expected interpolated KeylineList by using the KeylineList class' constructor
         // directly. Otherwise, keylineListOf will set offsets and unadjusted offsets based on the
         // pivot offset and will differ than the directly interpolated output of lerp.
-        val half = KeylineList(
-            listOf(
-                Keyline(StrategyTest.xSmall, -2.5f, -90f, false, true, false, 0f),
-                Keyline(60f, 30f, 10f, false, false, false, 0f),
-                Keyline(80f, 100f, 110f, true, false, true, 0f),
-                Keyline(40f, 160f, 210f, false, false, false, 0f),
-                Keyline(StrategyTest.xSmall, 182.5f, 310f, false, true, false, 0f)
+        val half =
+            KeylineList(
+                listOf(
+                    Keyline(StrategyTest.xSmall, -2.5f, -90f, false, true, false, 0f),
+                    Keyline(60f, 30f, 10f, false, false, false, 0f),
+                    Keyline(80f, 100f, 110f, true, false, true, 0f),
+                    Keyline(40f, 160f, 210f, false, false, false, 0f),
+                    Keyline(StrategyTest.xSmall, 182.5f, 310f, false, true, false, 0f)
+                )
             )
-        )
 
         assertThat(lerp(from, to, 0f)).isEqualTo(from)
         assertThat(lerp(from, to, 1f)).isEqualTo(to)
@@ -148,26 +149,28 @@
 
     @Test
     fun test_keylineListsShouldBeEqual() {
-        val keylineList1 = keylineListOf(
-            carouselMainAxisSize = 120f,
-            itemSpacing = 0f,
-            carouselAlignment = CarouselAlignment.Start
-        ) {
-            add(10f, true)
-            add(100f)
-            add(20f)
-            add(10f, true)
-        }
-        val keylineList2 = keylineListOf(
-            carouselMainAxisSize = 120f,
-            itemSpacing = 0f,
-            carouselAlignment = CarouselAlignment.Start
-        ) {
-            add(10f, true)
-            add(100f)
-            add(20f)
-            add(10f, true)
-        }
+        val keylineList1 =
+            keylineListOf(
+                carouselMainAxisSize = 120f,
+                itemSpacing = 0f,
+                carouselAlignment = CarouselAlignment.Start
+            ) {
+                add(10f, true)
+                add(100f)
+                add(20f)
+                add(10f, true)
+            }
+        val keylineList2 =
+            keylineListOf(
+                carouselMainAxisSize = 120f,
+                itemSpacing = 0f,
+                carouselAlignment = CarouselAlignment.Start
+            ) {
+                add(10f, true)
+                add(100f)
+                add(20f)
+                add(10f, true)
+            }
 
         assertThat(keylineList1 == keylineList2).isTrue()
         assertThat(keylineList1.hashCode()).isEqualTo(keylineList2.hashCode())
@@ -175,26 +178,28 @@
 
     @Test
     fun testDifferentSizedItem_keylineListsShouldNotBeEqual() {
-        val keylineList1 = keylineListOf(
-            carouselMainAxisSize = 120f,
-            itemSpacing = 0f,
-            carouselAlignment = CarouselAlignment.Start
-        ) {
-            add(11f, true)
-            add(100f)
-            add(20f)
-            add(10f, true)
-        }
-        val keylineList2 = keylineListOf(
-            carouselMainAxisSize = 120f,
-            itemSpacing = 0f,
-            carouselAlignment = CarouselAlignment.Start
-        ) {
-            add(10f, true)
-            add(100f)
-            add(20f)
-            add(10f, true)
-        }
+        val keylineList1 =
+            keylineListOf(
+                carouselMainAxisSize = 120f,
+                itemSpacing = 0f,
+                carouselAlignment = CarouselAlignment.Start
+            ) {
+                add(11f, true)
+                add(100f)
+                add(20f)
+                add(10f, true)
+            }
+        val keylineList2 =
+            keylineListOf(
+                carouselMainAxisSize = 120f,
+                itemSpacing = 0f,
+                carouselAlignment = CarouselAlignment.Start
+            ) {
+                add(10f, true)
+                add(100f)
+                add(20f)
+                add(10f, true)
+            }
 
         assertThat(keylineList1 == keylineList2).isFalse()
         assertThat(keylineList1.hashCode()).isNotEqualTo(keylineList2.hashCode())
@@ -202,17 +207,18 @@
 
     @Test
     fun testStartKeylines_shouldAddSpacingBetweenItems() {
-        val keylines = keylineListOf(
-            carouselMainAxisSize = 380f,
-            itemSpacing = 8f,
-            carouselAlignment = CarouselAlignment.Start
-        ) {
-            add(10f, isAnchor = true)
-            add(186f)
-            add(122f)
-            add(56f)
-            add(10f, isAnchor = true)
-        }
+        val keylines =
+            keylineListOf(
+                carouselMainAxisSize = 380f,
+                itemSpacing = 8f,
+                carouselAlignment = CarouselAlignment.Start
+            ) {
+                add(10f, isAnchor = true)
+                add(186f)
+                add(122f)
+                add(56f)
+                add(10f, isAnchor = true)
+            }
 
         val actualOffsets = keylines.map { it.offset }.toFloatArray()
         val expectedOffsets = floatArrayOf(-13f, 93f, 255f, 352f, 393f)
@@ -225,45 +231,46 @@
 
     @Test
     fun testCenteredKeylines_shouldAddSpacingBetweenItems() {
-        val keylines = keylineListOf(
-            carouselMainAxisSize = 768f,
-            itemSpacing = 8f,
-            carouselAlignment = CarouselAlignment.Center
-        ) {
-            add(10f, isAnchor = true)
-            add(56f)
-            add(122f)
-            add(186f)
-            add(186f)
-            add(122f)
-            add(56f)
-            add(10f, isAnchor = true)
-        }
+        val keylines =
+            keylineListOf(
+                carouselMainAxisSize = 768f,
+                itemSpacing = 8f,
+                carouselAlignment = CarouselAlignment.Center
+            ) {
+                add(10f, isAnchor = true)
+                add(56f)
+                add(122f)
+                add(186f)
+                add(186f)
+                add(122f)
+                add(56f)
+                add(10f, isAnchor = true)
+            }
 
         val actualOffsets = keylines.map { it.offset }.toFloatArray()
         val expectedOffsets = floatArrayOf(-13f, 28f, 125f, 287f, 481f, 643f, 740f, 781f)
         assertThat(actualOffsets).isEqualTo(expectedOffsets)
 
         val actualUnadjustedOffsets = keylines.map { it.unadjustedOffset }.toFloatArray()
-        val expectedUnadjustedOffsets = floatArrayOf(
-            -295f, -101f, 93f, 287f, 481f, 675f, 869f, 1063f
-        )
+        val expectedUnadjustedOffsets =
+            floatArrayOf(-295f, -101f, 93f, 287f, 481f, 675f, 869f, 1063f)
         assertThat(actualUnadjustedOffsets).isEqualTo(expectedUnadjustedOffsets)
     }
 
     @Test
     fun testEndKeylines_shouldAddSpacingBetweenItems() {
-        val keylines = keylineListOf(
-            carouselMainAxisSize = 380f,
-            itemSpacing = 8f,
-            carouselAlignment = CarouselAlignment.End
-        ) {
-            add(10f, isAnchor = true)
-            add(56f)
-            add(122f)
-            add(186f)
-            add(10f, isAnchor = true)
-        }
+        val keylines =
+            keylineListOf(
+                carouselMainAxisSize = 380f,
+                itemSpacing = 8f,
+                carouselAlignment = CarouselAlignment.End
+            ) {
+                add(10f, isAnchor = true)
+                add(56f)
+                add(122f)
+                add(186f)
+                add(10f, isAnchor = true)
+            }
 
         val actualOffsets = keylines.map { it.offset }.toFloatArray()
         val expectedOffsets = floatArrayOf(-13f, 28f, 125f, 287f, 393f)
@@ -280,9 +287,7 @@
         private const val XSmallSize = 5f
         private const val MediumSize = (LargeSize + SmallSize) / 2f
 
-        /**
-         * Creates a list of keylines with the following arrangement: [xs-s-s-m-l-l-m-s-s-xs].
-         */
+        /** Creates a list of keylines with the following arrangement: [xs-s-s-m-l-l-m-s-s-xs]. */
         private fun createTestKeylineList(): KeylineList {
             // Arrangement:
             // [xs-s-s-m-l-l-m-s-s-xs]
diff --git a/compose/material3/material3/src/androidUnitTest/kotlin/androidx/compose/material3/carousel/MultiBrowseTest.kt b/compose/material3/material3/src/androidUnitTest/kotlin/androidx/compose/material3/carousel/MultiBrowseTest.kt
index 6f829c0..ecdd712 100644
--- a/compose/material3/material3/src/androidUnitTest/kotlin/androidx/compose/material3/carousel/MultiBrowseTest.kt
+++ b/compose/material3/material3/src/androidUnitTest/kotlin/androidx/compose/material3/carousel/MultiBrowseTest.kt
@@ -32,20 +32,22 @@
     @Test
     fun testMultiBrowse_doesNotResizeLargeWhenEnoughRoom() {
         val itemSize = 120f // minSmallItemSize = 40.dp * 3
-        val keylineList = multiBrowseKeylineList(
-            density = Density,
-            carouselMainAxisSize = 500f,
-            preferredItemSize = itemSize,
-            itemSpacing = 0f,
-            itemCount = 10,
-        )
-        val strategy = Strategy(
-            defaultKeylines = keylineList,
-            availableSpace = 500f,
-            itemSpacing = 0f,
-            beforeContentPadding = 0f,
-            afterContentPadding = 0f
-        )
+        val keylineList =
+            multiBrowseKeylineList(
+                density = Density,
+                carouselMainAxisSize = 500f,
+                preferredItemSize = itemSize,
+                itemSpacing = 0f,
+                itemCount = 10,
+            )
+        val strategy =
+            Strategy(
+                defaultKeylines = keylineList,
+                availableSpace = 500f,
+                itemSpacing = 0f,
+                beforeContentPadding = 0f,
+                afterContentPadding = 0f
+            )
 
         assertThat(strategy.itemMainAxisSize).isEqualTo(itemSize)
     }
@@ -53,20 +55,22 @@
     @Test
     fun testMultiBrowse_resizesItemLargerThanContainerToFit1Small() {
         val itemSize = 200f
-        val keylineList = multiBrowseKeylineList(
-            density = Density,
-            carouselMainAxisSize = 100f,
-            preferredItemSize = itemSize,
-            itemSpacing = 0f,
-            itemCount = 10,
+        val keylineList =
+            multiBrowseKeylineList(
+                density = Density,
+                carouselMainAxisSize = 100f,
+                preferredItemSize = itemSize,
+                itemSpacing = 0f,
+                itemCount = 10,
             )
-        val strategy = Strategy(
-            defaultKeylines = keylineList,
-            availableSpace = 100f,
-            itemSpacing = 0f,
-            beforeContentPadding = 0f,
-            afterContentPadding = 0f
-        )
+        val strategy =
+            Strategy(
+                defaultKeylines = keylineList,
+                availableSpace = 100f,
+                itemSpacing = 0f,
+                beforeContentPadding = 0f,
+                afterContentPadding = 0f
+            )
         val minSmallItemSize: Float = with(Density) { CarouselDefaults.MinSmallItemSize.toPx() }
         val keylines = strategy.defaultKeylines
 
@@ -83,20 +87,22 @@
     @Test
     fun testMultiBrowse_hasNoSmallItemsIfNotEnoughRoom() {
         val minSmallItemSize: Float = with(Density) { CarouselDefaults.MinSmallItemSize.toPx() }
-        val keylineList = multiBrowseKeylineList(
-            density = Density,
-            carouselMainAxisSize = minSmallItemSize,
-            preferredItemSize = 200f,
-            itemSpacing = 0f,
-            itemCount = 10,
+        val keylineList =
+            multiBrowseKeylineList(
+                density = Density,
+                carouselMainAxisSize = minSmallItemSize,
+                preferredItemSize = 200f,
+                itemSpacing = 0f,
+                itemCount = 10,
             )
-        val strategy = Strategy(
-            defaultKeylines = keylineList,
-            availableSpace = minSmallItemSize,
-            itemSpacing = 0f,
-            beforeContentPadding = 0f,
-            afterContentPadding = 0f
-        )
+        val strategy =
+            Strategy(
+                defaultKeylines = keylineList,
+                availableSpace = minSmallItemSize,
+                itemSpacing = 0f,
+                beforeContentPadding = 0f,
+                afterContentPadding = 0f
+            )
         val keylines = strategy.defaultKeylines
 
         assertThat(strategy.itemMainAxisSize).isEqualTo(minSmallItemSize)
@@ -106,12 +112,13 @@
 
     @Test
     fun testMultiBrowse_isNullIfAvailableSpaceIsZero() {
-        val keylineList = multiBrowseKeylineList(
-            density = Density,
-            carouselMainAxisSize = 0f,
-            preferredItemSize = 200f,
-            itemSpacing = 0f,
-            itemCount = 10,
+        val keylineList =
+            multiBrowseKeylineList(
+                density = Density,
+                carouselMainAxisSize = 0f,
+                preferredItemSize = 200f,
+                itemSpacing = 0f,
+                itemCount = 10,
             )
         assertThat(keylineList).isEmpty()
     }
@@ -121,20 +128,22 @@
         val maxSmallItemSize: Float = with(Density) { CarouselDefaults.MaxSmallItemSize.toPx() }
         val preferredItemSize = 200f
         val carouselSize = preferredItemSize * 2 + maxSmallItemSize * 2
-        val keylineList = multiBrowseKeylineList(
-            density = Density,
-            carouselMainAxisSize = carouselSize,
-            preferredItemSize = preferredItemSize,
-            itemSpacing = 0f,
-            itemCount = 10,
+        val keylineList =
+            multiBrowseKeylineList(
+                density = Density,
+                carouselMainAxisSize = carouselSize,
+                preferredItemSize = preferredItemSize,
+                itemSpacing = 0f,
+                itemCount = 10,
             )
-        val strategy = Strategy(
-            defaultKeylines = keylineList,
-            availableSpace = carouselSize,
-            itemSpacing = 0f,
-            beforeContentPadding = 0f,
-            afterContentPadding = 0f
-        )
+        val strategy =
+            Strategy(
+                defaultKeylines = keylineList,
+                availableSpace = carouselSize,
+                itemSpacing = 0f,
+                beforeContentPadding = 0f,
+                afterContentPadding = 0f
+            )
         val keylines = strategy.defaultKeylines
 
         // Assert that there's only one small item, and a medium item that has a size between
@@ -152,20 +161,22 @@
         val maxSmallItemSize: Float = with(Density) { CarouselDefaults.MaxSmallItemSize.toPx() }
         val preferredItemSize = 200f
         val carouselSize = preferredItemSize * 2 + maxSmallItemSize * 2
-        val keylineList = multiBrowseKeylineList(
-            density = Density,
-            carouselMainAxisSize = carouselSize,
-            preferredItemSize = preferredItemSize,
-            itemSpacing = 0f,
-            itemCount = 3,
-        )
-        val strategy = Strategy(
-            defaultKeylines = keylineList,
-            availableSpace = carouselSize,
-            itemSpacing = 0f,
-            beforeContentPadding = 0f,
-            afterContentPadding = 0f
-        )
+        val keylineList =
+            multiBrowseKeylineList(
+                density = Density,
+                carouselMainAxisSize = carouselSize,
+                preferredItemSize = preferredItemSize,
+                itemSpacing = 0f,
+                itemCount = 3,
+            )
+        val strategy =
+            Strategy(
+                defaultKeylines = keylineList,
+                availableSpace = carouselSize,
+                itemSpacing = 0f,
+                beforeContentPadding = 0f,
+                afterContentPadding = 0f
+            )
         val keylines = strategy.defaultKeylines
 
         // We originally expect a keyline list of [xSmall-Large-Large-Medium-Small-xSmall], but with
@@ -178,20 +189,22 @@
 
     @Test
     fun testMultiBrowse_adjustsForItemSpacing() {
-        val keylineList = multiBrowseKeylineList(
-            density = Density,
-            carouselMainAxisSize = 380f,
-            preferredItemSize = 186f,
-            itemSpacing = 8f,
-            itemCount = 10
-        )
-        val strategy = Strategy(
-            defaultKeylines = keylineList,
-            availableSpace = 380f,
-            itemSpacing = 8f,
-            beforeContentPadding = 0f,
-            afterContentPadding = 0f
-        )
+        val keylineList =
+            multiBrowseKeylineList(
+                density = Density,
+                carouselMainAxisSize = 380f,
+                preferredItemSize = 186f,
+                itemSpacing = 8f,
+                itemCount = 10
+            )
+        val strategy =
+            Strategy(
+                defaultKeylines = keylineList,
+                availableSpace = 380f,
+                itemSpacing = 8f,
+                beforeContentPadding = 0f,
+                afterContentPadding = 0f
+            )
 
         assertThat(keylineList.firstFocal.size).isEqualTo(186f)
         // Ensure the first visible item is large and aligned with the start of the container
@@ -206,10 +219,11 @@
         assertThat(lastVisible.offset).isEqualTo(380f - (56f / 2f))
 
         val maxScrollOffset = ((186f * 10) + (8f * 10)) - 380f
-        val defaultActualUnadjustedOffsets = strategy.getKeylineListForScrollOffset(
-            0f,
-            maxScrollOffset
-        ).map { it.unadjustedOffset }.toFloatArray()
+        val defaultActualUnadjustedOffsets =
+            strategy
+                .getKeylineListForScrollOffset(0f, maxScrollOffset)
+                .map { it.unadjustedOffset }
+                .toFloatArray()
         val defaultExpectedUnadjustedOffsets = floatArrayOf(-101f, 93f, 287f, 481f, 675f)
         assertThat(defaultActualUnadjustedOffsets).isEqualTo(defaultExpectedUnadjustedOffsets)
     }
diff --git a/compose/material3/material3/src/androidUnitTest/kotlin/androidx/compose/material3/carousel/StrategyTest.kt b/compose/material3/material3/src/androidUnitTest/kotlin/androidx/compose/material3/carousel/StrategyTest.kt
index 1606293..f0d10fc 100644
--- a/compose/material3/material3/src/androidUnitTest/kotlin/androidx/compose/material3/carousel/StrategyTest.kt
+++ b/compose/material3/material3/src/androidUnitTest/kotlin/androidx/compose/material3/carousel/StrategyTest.kt
@@ -34,32 +34,30 @@
         val maxScrollOffset = (itemCount * large) - carouselMainAxisSize
         val defaultKeylineList = createStartAlignedKeylineList()
 
-        val strategy = Strategy(
-            defaultKeylines = defaultKeylineList,
-            availableSpace = carouselMainAxisSize,
-            itemSpacing = 0f,
-            beforeContentPadding = 0f,
-            afterContentPadding = 0f
-        )
+        val strategy =
+            Strategy(
+                defaultKeylines = defaultKeylineList,
+                availableSpace = carouselMainAxisSize,
+                itemSpacing = 0f,
+                beforeContentPadding = 0f,
+                afterContentPadding = 0f
+            )
 
         assertThat(strategy.getKeylineListForScrollOffset(0f, maxScrollOffset))
             .isEqualTo(defaultKeylineList)
 
         val lastEndStepOffsets = arrayOf(-2.5f, 10f, 50f, 130f, 182.5f)
-        val lastEndStepUnadjustedOffsets = arrayOf(
-            130f - 300f,
-            130f - 200f,
-            130f - 100f,
-            130f,
-            130f + 100f
-        )
-        strategy.getKeylineListForScrollOffset(
-            maxScrollOffset,
-            maxScrollOffset,
-        ).forEachIndexed { i, k ->
-            assertThat(k.offset).isEqualTo(lastEndStepOffsets[i])
-            assertThat(k.unadjustedOffset).isEqualTo(lastEndStepUnadjustedOffsets[i])
-        }
+        val lastEndStepUnadjustedOffsets =
+            arrayOf(130f - 300f, 130f - 200f, 130f - 100f, 130f, 130f + 100f)
+        strategy
+            .getKeylineListForScrollOffset(
+                maxScrollOffset,
+                maxScrollOffset,
+            )
+            .forEachIndexed { i, k ->
+                assertThat(k.offset).isEqualTo(lastEndStepOffsets[i])
+                assertThat(k.unadjustedOffset).isEqualTo(lastEndStepUnadjustedOffsets[i])
+            }
     }
 
     @Test
@@ -68,23 +66,27 @@
         val cutoff = 50f
         val defaultKeylineList = createStartAlignedCutoffKeylineList(cutoff = cutoff)
 
-        val strategy = Strategy(
-            defaultKeylines = defaultKeylineList,
-            availableSpace = carouselMainAxisSize,
-            itemSpacing = 0f,
-            beforeContentPadding = 0f,
-            afterContentPadding = 0f
-        )
+        val strategy =
+            Strategy(
+                defaultKeylines = defaultKeylineList,
+                availableSpace = carouselMainAxisSize,
+                itemSpacing = 0f,
+                beforeContentPadding = 0f,
+                afterContentPadding = 0f
+            )
         val endKeylineList = strategy.endKeylineSteps.last()
 
         assertThat(defaultKeylineList.lastNonAnchor.cutoff).isEqualTo(cutoff)
-        assertThat(defaultKeylineList.firstNonAnchor.offset -
-            defaultKeylineList.firstNonAnchor.size / 2f).isEqualTo(0f)
+        assertThat(
+                defaultKeylineList.firstNonAnchor.offset -
+                    defaultKeylineList.firstNonAnchor.size / 2f
+            )
+            .isEqualTo(0f)
         assertThat(endKeylineList.firstNonAnchor.cutoff).isEqualTo(cutoff)
-        assertThat(endKeylineList.firstNonAnchor.offset -
-            endKeylineList.firstNonAnchor.size / 2f).isEqualTo(-cutoff)
-        assertThat(endKeylineList.lastNonAnchor.offset +
-            endKeylineList.lastNonAnchor.size / 2f).isEqualTo(carouselMainAxisSize)
+        assertThat(endKeylineList.firstNonAnchor.offset - endKeylineList.firstNonAnchor.size / 2f)
+            .isEqualTo(-cutoff)
+        assertThat(endKeylineList.lastNonAnchor.offset + endKeylineList.lastNonAnchor.size / 2f)
+            .isEqualTo(carouselMainAxisSize)
     }
 
     @Test
@@ -93,23 +95,28 @@
         val cutoff = 50f
         val defaultKeylineList = createEndAlignedCutoffKeylineList(cutoff = cutoff)
 
-        val strategy = Strategy(
-            defaultKeylines = defaultKeylineList,
-            availableSpace = carouselMainAxisSize,
-            itemSpacing = 0f,
-            beforeContentPadding = 0f,
-            afterContentPadding = 0f
-        )
+        val strategy =
+            Strategy(
+                defaultKeylines = defaultKeylineList,
+                availableSpace = carouselMainAxisSize,
+                itemSpacing = 0f,
+                beforeContentPadding = 0f,
+                afterContentPadding = 0f
+            )
         val startKeylineList = strategy.startKeylineSteps.last()
 
         assertThat(defaultKeylineList.firstNonAnchor.cutoff).isEqualTo(cutoff)
-        assertThat(defaultKeylineList.lastNonAnchor.offset +
-            defaultKeylineList.lastNonAnchor.size / 2f).isEqualTo(carouselMainAxisSize)
+        assertThat(
+                defaultKeylineList.lastNonAnchor.offset + defaultKeylineList.lastNonAnchor.size / 2f
+            )
+            .isEqualTo(carouselMainAxisSize)
         assertThat(startKeylineList.lastNonAnchor.cutoff).isEqualTo(cutoff)
-        assertThat(startKeylineList.firstNonAnchor.offset -
-            startKeylineList.firstNonAnchor.size / 2f).isEqualTo(0f)
-        assertThat(startKeylineList.lastNonAnchor.offset +
-            startKeylineList.lastNonAnchor.size / 2f).isEqualTo(carouselMainAxisSize + cutoff)
+        assertThat(
+                startKeylineList.firstNonAnchor.offset - startKeylineList.firstNonAnchor.size / 2f
+            )
+            .isEqualTo(0f)
+        assertThat(startKeylineList.lastNonAnchor.offset + startKeylineList.lastNonAnchor.size / 2f)
+            .isEqualTo(carouselMainAxisSize + cutoff)
     }
 
     @Test
@@ -119,96 +126,102 @@
         val maxScrollOffset = (itemCount * large) - carouselMainAxisSize
         val defaultKeylines = createCenterAlignedKeylineList()
 
-        val strategy = Strategy(
-            defaultKeylines = defaultKeylines,
-            availableSpace = carouselMainAxisSize,
-            itemSpacing = 0f,
-            beforeContentPadding = 0f,
-            afterContentPadding = 0f
-        )
+        val strategy =
+            Strategy(
+                defaultKeylines = defaultKeylines,
+                availableSpace = carouselMainAxisSize,
+                itemSpacing = 0f,
+                beforeContentPadding = 0f,
+                afterContentPadding = 0f
+            )
 
-        val startSteps = listOf(
-            // default step - [xs | s s m l l m s s | xs]
-            createCenterAlignedKeylineList(),
-            // step 1 - [xs | s m l l m s s s | xs]
-            keylineListOf(
-                carouselMainAxisSize = carouselMainAxisSize,
-                itemSpacing = 0f,
-                pivotIndex = 3,
-                pivotOffset = (small * 1 + medium + (large / 2))
-            ) {
-                add(xSmall, isAnchor = true)
-                add(small)
-                add(medium)
-                add(large)
-                add(large)
-                add(medium)
-                add(small)
-                add(small)
-                add(small)
-                add(xSmall, isAnchor = true)
-            },
-            // step 2 - [xs | m l l m s s s s | xs]
-            keylineListOf(
-                carouselMainAxisSize = carouselMainAxisSize,
-                itemSpacing = 0f,
-                pivotIndex = 2,
-                pivotOffset = medium + (large / 2)
-            ) {
-                add(xSmall, isAnchor = true)
-                add(medium)
-                add(large)
-                add(large)
-                add(medium)
-                add(small)
-                add(small)
-                add(small)
-                add(small)
-                add(xSmall, isAnchor = true)
-            },
-            // step 3 - [xs | l l m m s s s s | xs]
-            keylineListOf(
-                carouselMainAxisSize = carouselMainAxisSize,
-                itemSpacing = 0f,
-                pivotIndex = 1,
-                pivotOffset = large / 2
-            ) {
-                add(xSmall, isAnchor = true)
-                add(large)
-                add(large)
-                add(medium)
-                add(medium)
-                add(small)
-                add(small)
-                add(small)
-                add(small)
-                add(xSmall, isAnchor = true)
-            }
-        )
+        val startSteps =
+            listOf(
+                // default step - [xs | s s m l l m s s | xs]
+                createCenterAlignedKeylineList(),
+                // step 1 - [xs | s m l l m s s s | xs]
+                keylineListOf(
+                    carouselMainAxisSize = carouselMainAxisSize,
+                    itemSpacing = 0f,
+                    pivotIndex = 3,
+                    pivotOffset = (small * 1 + medium + (large / 2))
+                ) {
+                    add(xSmall, isAnchor = true)
+                    add(small)
+                    add(medium)
+                    add(large)
+                    add(large)
+                    add(medium)
+                    add(small)
+                    add(small)
+                    add(small)
+                    add(xSmall, isAnchor = true)
+                },
+                // step 2 - [xs | m l l m s s s s | xs]
+                keylineListOf(
+                    carouselMainAxisSize = carouselMainAxisSize,
+                    itemSpacing = 0f,
+                    pivotIndex = 2,
+                    pivotOffset = medium + (large / 2)
+                ) {
+                    add(xSmall, isAnchor = true)
+                    add(medium)
+                    add(large)
+                    add(large)
+                    add(medium)
+                    add(small)
+                    add(small)
+                    add(small)
+                    add(small)
+                    add(xSmall, isAnchor = true)
+                },
+                // step 3 - [xs | l l m m s s s s | xs]
+                keylineListOf(
+                    carouselMainAxisSize = carouselMainAxisSize,
+                    itemSpacing = 0f,
+                    pivotIndex = 1,
+                    pivotOffset = large / 2
+                ) {
+                    add(xSmall, isAnchor = true)
+                    add(large)
+                    add(large)
+                    add(medium)
+                    add(medium)
+                    add(small)
+                    add(small)
+                    add(small)
+                    add(small)
+                    add(xSmall, isAnchor = true)
+                }
+            )
 
-        val shiftedStart = strategy.getKeylineListForScrollOffset(
-            0f,
-            maxScrollOffset,
-        )
+        val shiftedStart =
+            strategy.getKeylineListForScrollOffset(
+                0f,
+                maxScrollOffset,
+            )
         assertThat(shiftedStart).isEqualTo(startSteps.last())
         // Make sure the last shift towards start places the first focal item against the start of
         // the carousel container.
-        assertThat(shiftedStart.firstFocal.offset - (shiftedStart.firstFocal.size / 2))
-            .isEqualTo(0)
+        assertThat(shiftedStart.firstFocal.offset - (shiftedStart.firstFocal.size / 2)).isEqualTo(0)
 
         // Test all shift steps start by manually calculating the scroll offset at each step and
         // making sure getKeylineForScrollOffset returns the correct keyline list
         val totalShiftStart =
             startSteps.last().first().unadjustedOffset - startSteps.first().first().unadjustedOffset
-        val startStepsScrollOffsets = listOf(
-            totalShiftStart, // default step
-            totalShiftStart - (startSteps[1].first().unadjustedOffset -
-                startSteps[0].first().unadjustedOffset),
-            totalShiftStart - (startSteps[2].first().unadjustedOffset -
-                startSteps[0].first().unadjustedOffset),
-            totalShiftStart - (startSteps[3].first().unadjustedOffset -
-                startSteps[0].first().unadjustedOffset), // all the way start
-        )
+        val startStepsScrollOffsets =
+            listOf(
+                totalShiftStart, // default step
+                totalShiftStart -
+                    (startSteps[1].first().unadjustedOffset -
+                        startSteps[0].first().unadjustedOffset),
+                totalShiftStart -
+                    (startSteps[2].first().unadjustedOffset -
+                        startSteps[0].first().unadjustedOffset),
+                totalShiftStart -
+                    (startSteps[3].first().unadjustedOffset -
+                        startSteps[0].first().unadjustedOffset), // all the way start
+            )
 
         startStepsScrollOffsets.forEachIndexed { i, scroll ->
             val keylineList =
@@ -229,78 +242,81 @@
         val maxScrollOffset = (itemCount * large) - carouselMainAxisSize
         val defaultKeylines = createCenterAlignedKeylineList()
 
-        val strategy = Strategy(
-            defaultKeylines = defaultKeylines,
-            availableSpace = carouselMainAxisSize,
-            itemSpacing = 0f,
-            beforeContentPadding = 0f,
-            afterContentPadding = 0f
-        )
-
-        val endSteps = listOf(
-            // default step
-            createCenterAlignedKeylineList(),
-            // step 1: Move a small item from after focal to beginning of focal
-            keylineListOf(
-                carouselMainAxisSize = carouselMainAxisSize,
+        val strategy =
+            Strategy(
+                defaultKeylines = defaultKeylines,
+                availableSpace = carouselMainAxisSize,
                 itemSpacing = 0f,
-                pivotIndex = 5,
-                pivotOffset = (small * 3) + medium + (large / 2)
-            ) {
-                add(xSmall, isAnchor = true)
-                add(small)
-                add(small)
-                add(small)
-                add(medium)
-                add(large)
-                add(large)
-                add(medium)
-                add(small)
-                add(xSmall, isAnchor = true)
-            },
-            // step 2: Move another small from after focal to beginning of focal
-            keylineListOf(
-                carouselMainAxisSize = carouselMainAxisSize,
-                itemSpacing = 0f,
-                pivotIndex = 6,
-                pivotOffset = (small * 4) + medium + (large / 2)
-            ) {
-                add(xSmall, isAnchor = true)
-                add(small)
-                add(small)
-                add(small)
-                add(small)
-                add(medium)
-                add(large)
-                add(large)
-                add(medium)
-                add(xSmall, isAnchor = true)
-            },
+                beforeContentPadding = 0f,
+                afterContentPadding = 0f
+            )
 
-            // step 3: Move medium from after focal to beginning of focal
-            keylineListOf(
-                carouselMainAxisSize = carouselMainAxisSize,
-                itemSpacing = 0f,
-                pivotIndex = 7,
-                pivotOffset = (small * 4) + (medium * 2) + (large / 2)
-            ) {
-                add(xSmall, isAnchor = true)
-                add(small)
-                add(small)
-                add(small)
-                add(small)
-                add(medium)
-                add(medium)
-                add(large)
-                add(large)
-                add(xSmall, isAnchor = true)
-            }
-        )
+        val endSteps =
+            listOf(
+                // default step
+                createCenterAlignedKeylineList(),
+                // step 1: Move a small item from after focal to beginning of focal
+                keylineListOf(
+                    carouselMainAxisSize = carouselMainAxisSize,
+                    itemSpacing = 0f,
+                    pivotIndex = 5,
+                    pivotOffset = (small * 3) + medium + (large / 2)
+                ) {
+                    add(xSmall, isAnchor = true)
+                    add(small)
+                    add(small)
+                    add(small)
+                    add(medium)
+                    add(large)
+                    add(large)
+                    add(medium)
+                    add(small)
+                    add(xSmall, isAnchor = true)
+                },
+                // step 2: Move another small from after focal to beginning of focal
+                keylineListOf(
+                    carouselMainAxisSize = carouselMainAxisSize,
+                    itemSpacing = 0f,
+                    pivotIndex = 6,
+                    pivotOffset = (small * 4) + medium + (large / 2)
+                ) {
+                    add(xSmall, isAnchor = true)
+                    add(small)
+                    add(small)
+                    add(small)
+                    add(small)
+                    add(medium)
+                    add(large)
+                    add(large)
+                    add(medium)
+                    add(xSmall, isAnchor = true)
+                },
 
-        val shiftedEnd = strategy.getKeylineListForScrollOffset(
-            maxScrollOffset,
-            maxScrollOffset,
-        )
+                // step 3: Move medium from after focal to beginning of focal
+                keylineListOf(
+                    carouselMainAxisSize = carouselMainAxisSize,
+                    itemSpacing = 0f,
+                    pivotIndex = 7,
+                    pivotOffset = (small * 4) + (medium * 2) + (large / 2)
+                ) {
+                    add(xSmall, isAnchor = true)
+                    add(small)
+                    add(small)
+                    add(small)
+                    add(small)
+                    add(medium)
+                    add(medium)
+                    add(large)
+                    add(large)
+                    add(xSmall, isAnchor = true)
+                }
+            )
+
+        val shiftedEnd =
+            strategy.getKeylineListForScrollOffset(
+                maxScrollOffset,
+                maxScrollOffset,
+            )
         assertThat(shiftedEnd).isEqualTo(endSteps.last())
         // Make sure the last shift towards end places the last focal item against the end of the
         // carousel container.
@@ -309,15 +325,20 @@
 
         val totalShiftEnd =
             endSteps.first().last().unadjustedOffset - endSteps.last().last().unadjustedOffset
-        val endStepsScrollOffsets = listOf(
-            maxScrollOffset - totalShiftEnd, // default step
-            maxScrollOffset - totalShiftEnd - (endSteps[1].last().unadjustedOffset -
-                endSteps[0].last().unadjustedOffset),
-            maxScrollOffset - totalShiftEnd - (endSteps[2].last().unadjustedOffset -
-                endSteps[0].last().unadjustedOffset),
-            maxScrollOffset - totalShiftEnd - (endSteps[3].last().unadjustedOffset -
-                endSteps[0].last().unadjustedOffset), // all the way end
-        )
+        val endStepsScrollOffsets =
+            listOf(
+                maxScrollOffset - totalShiftEnd, // default step
+                maxScrollOffset -
+                    totalShiftEnd -
+                    (endSteps[1].last().unadjustedOffset - endSteps[0].last().unadjustedOffset),
+                maxScrollOffset -
+                    totalShiftEnd -
+                    (endSteps[2].last().unadjustedOffset - endSteps[0].last().unadjustedOffset),
+                maxScrollOffset -
+                    totalShiftEnd -
+                    (endSteps[3].last().unadjustedOffset -
+                        endSteps[0].last().unadjustedOffset), // all the way end
+            )
 
         // Test exact scroll offset returns the correct step
         endStepsScrollOffsets.forEachIndexed { i, scroll ->
@@ -328,33 +349,36 @@
         }
 
         // Test non-exact scroll offset rounds to the correct step
-        val almostToStepOneOffset = endStepsScrollOffsets[0] +
-            ((endStepsScrollOffsets[1] - endStepsScrollOffsets[0]) * .75f)
+        val almostToStepOneOffset =
+            endStepsScrollOffsets[0] +
+                ((endStepsScrollOffsets[1] - endStepsScrollOffsets[0]) * .75f)
         assertThat(
-            strategy.getKeylineListForScrollOffset(
-                almostToStepOneOffset,
-                maxScrollOffset,
-                roundToNearestStep = true
+                strategy.getKeylineListForScrollOffset(
+                    almostToStepOneOffset,
+                    maxScrollOffset,
+                    roundToNearestStep = true
+                )
             )
-        )
             .isEqualTo(endSteps[1])
         val halfWayToStepTwo =
             endStepsScrollOffsets[1] + ((endStepsScrollOffsets[2] - endStepsScrollOffsets[1]) * .5f)
         assertThat(
-            strategy.getKeylineListForScrollOffset(
-                halfWayToStepTwo,
-                maxScrollOffset,
-                roundToNearestStep = true
+                strategy.getKeylineListForScrollOffset(
+                    halfWayToStepTwo,
+                    maxScrollOffset,
+                    roundToNearestStep = true
+                )
             )
-        )
             .isEqualTo(endSteps[2])
         val justPastStepTwo =
             endStepsScrollOffsets[2] + ((endStepsScrollOffsets[3] - endStepsScrollOffsets[2]) * .1f)
-        assertThat(strategy.getKeylineListForScrollOffset(
-            justPastStepTwo,
-            maxScrollOffset,
-            roundToNearestStep = true
-        ))
+        assertThat(
+                strategy.getKeylineListForScrollOffset(
+                    justPastStepTwo,
+                    maxScrollOffset,
+                    roundToNearestStep = true
+                )
+            )
             .isEqualTo(endSteps[2])
     }
 
@@ -364,22 +388,36 @@
         val itemCount = 10
         val availableSpace = 500f
         val itemSpacing = 0f
-        val strategy1 = Strategy(
-            defaultKeylines =
-                multiBrowseKeylineList(Density, availableSpace, itemSize, itemSpacing, itemCount),
-            availableSpace = availableSpace,
-            itemSpacing = itemSpacing,
-            beforeContentPadding = 0f,
-            afterContentPadding = 0f
-        )
-        val strategy2 = Strategy(
-            defaultKeylines =
-                multiBrowseKeylineList(Density, availableSpace, itemSize, itemSpacing, itemCount),
-            availableSpace = availableSpace,
-            itemSpacing = itemSpacing,
-            beforeContentPadding = 0f,
-            afterContentPadding = 0f
-        )
+        val strategy1 =
+            Strategy(
+                defaultKeylines =
+                    multiBrowseKeylineList(
+                        Density,
+                        availableSpace,
+                        itemSize,
+                        itemSpacing,
+                        itemCount
+                    ),
+                availableSpace = availableSpace,
+                itemSpacing = itemSpacing,
+                beforeContentPadding = 0f,
+                afterContentPadding = 0f
+            )
+        val strategy2 =
+            Strategy(
+                defaultKeylines =
+                    multiBrowseKeylineList(
+                        Density,
+                        availableSpace,
+                        itemSize,
+                        itemSpacing,
+                        itemCount
+                    ),
+                availableSpace = availableSpace,
+                itemSpacing = itemSpacing,
+                beforeContentPadding = 0f,
+                afterContentPadding = 0f
+            )
 
         assertThat(strategy1 == strategy2).isTrue()
         assertThat(strategy1.hashCode()).isEqualTo(strategy2.hashCode())
@@ -390,22 +428,24 @@
         val itemSize = large
         val itemSpacing = 0f
         val itemCount = 10
-        val strategy1 = Strategy(
-            defaultKeylines =
-                multiBrowseKeylineList(Density, 500f, itemSize, itemSpacing, itemCount),
-            availableSpace = 500f,
-            itemSpacing = itemSpacing,
-            beforeContentPadding = 0f,
-            afterContentPadding = 0f
-        )
-        val strategy2 = Strategy(
-            defaultKeylines =
-                multiBrowseKeylineList(Density, 501f, itemSize, itemSpacing, itemCount),
-            availableSpace = 501f,
-            itemSpacing = itemSpacing,
-            beforeContentPadding = 0f,
-            afterContentPadding = 0f
-        )
+        val strategy1 =
+            Strategy(
+                defaultKeylines =
+                    multiBrowseKeylineList(Density, 500f, itemSize, itemSpacing, itemCount),
+                availableSpace = 500f,
+                itemSpacing = itemSpacing,
+                beforeContentPadding = 0f,
+                afterContentPadding = 0f
+            )
+        val strategy2 =
+            Strategy(
+                defaultKeylines =
+                    multiBrowseKeylineList(Density, 501f, itemSize, itemSpacing, itemCount),
+                availableSpace = 501f,
+                itemSpacing = itemSpacing,
+                beforeContentPadding = 0f,
+                afterContentPadding = 0f
+            )
 
         assertThat(strategy1 == strategy2).isFalse()
         assertThat(strategy1.hashCode()).isNotEqualTo(strategy2.hashCode())
@@ -417,21 +457,29 @@
         val availableSpace = 500f
         val itemSpacing = 0f
         val itemCount = 10
-        val strategy1 = Strategy(
-            defaultKeylines =
-                multiBrowseKeylineList(Density, availableSpace, itemSize, itemSpacing, itemCount),
-            availableSpace = availableSpace,
-            itemSpacing = itemSpacing,
-            beforeContentPadding = 0f,
-            afterContentPadding = 0f
-        )
-        val strategy2 = Strategy(
-            defaultKeylines = emptyKeylineList(),
-            availableSpace = availableSpace,
-            itemSpacing = itemSpacing,
-            beforeContentPadding = 0f,
-            afterContentPadding = 0f
-        )
+        val strategy1 =
+            Strategy(
+                defaultKeylines =
+                    multiBrowseKeylineList(
+                        Density,
+                        availableSpace,
+                        itemSize,
+                        itemSpacing,
+                        itemCount
+                    ),
+                availableSpace = availableSpace,
+                itemSpacing = itemSpacing,
+                beforeContentPadding = 0f,
+                afterContentPadding = 0f
+            )
+        val strategy2 =
+            Strategy(
+                defaultKeylines = emptyKeylineList(),
+                availableSpace = availableSpace,
+                itemSpacing = itemSpacing,
+                beforeContentPadding = 0f,
+                afterContentPadding = 0f
+            )
 
         assertThat(strategy1 == strategy2).isFalse()
         assertThat(strategy1.hashCode()).isNotEqualTo(strategy2.hashCode())
@@ -444,13 +492,14 @@
         val maxScrollOffset = (itemCount * large) - carouselMainAxisSize
         val defaultKeylineList = createStartAlignedKeylineList()
 
-        val strategy = Strategy(
-            defaultKeylines = defaultKeylineList,
-            availableSpace = carouselMainAxisSize,
-            itemSpacing = 0f,
-            beforeContentPadding = 0f,
-            afterContentPadding = 0f
-        )
+        val strategy =
+            Strategy(
+                defaultKeylines = defaultKeylineList,
+                availableSpace = carouselMainAxisSize,
+                itemSpacing = 0f,
+                beforeContentPadding = 0f,
+                afterContentPadding = 0f
+            )
 
         assertThat(strategy.getKeylineListForScrollOffset(0f, maxScrollOffset))
             .isEqualTo(defaultKeylineList)
@@ -460,20 +509,21 @@
     fun testStartKeylineStrategy_endStepsShouldAccountForItemSpacing() {
         val availableSpace = 380f
         val itemSpacing = 8f
-        val strategy = Strategy(
-            defaultKeylines =
-                keylineListOf(availableSpace, itemSpacing, CarouselAlignment.Start) {
-                    add(10f, isAnchor = true)
-                    add(186f)
-                    add(122f)
-                    add(56f)
-                    add(10f, isAnchor = true)
-                },
-            availableSpace = availableSpace,
-            itemSpacing = itemSpacing,
-            beforeContentPadding = 0f,
-            afterContentPadding = 0f
-        )
+        val strategy =
+            Strategy(
+                defaultKeylines =
+                    keylineListOf(availableSpace, itemSpacing, CarouselAlignment.Start) {
+                        add(10f, isAnchor = true)
+                        add(186f)
+                        add(122f)
+                        add(56f)
+                        add(10f, isAnchor = true)
+                    },
+                availableSpace = availableSpace,
+                itemSpacing = itemSpacing,
+                beforeContentPadding = 0f,
+                afterContentPadding = 0f
+            )
 
         val middleStep = strategy.endKeylineSteps[1]
         val actualMiddleOffsets = middleStep.map { it.offset }.toFloatArray()
@@ -498,22 +548,24 @@
     fun testCenterKeylineStrategy_startAndEndStepsShouldAccountForItemSpacing() {
         val availableSpace = 768f
         val itemSpacing = 8f
-        val strategy = Strategy(
-            defaultKeylines = keylineListOf(availableSpace, itemSpacing, CarouselAlignment.Center) {
-                add(10f, isAnchor = true)
-                add(56f)
-                add(122f)
-                add(186f)
-                add(186f)
-                add(122f)
-                add(56f)
-                add(10f, isAnchor = true)
-            },
-            availableSpace = availableSpace,
-            itemSpacing = itemSpacing,
-            beforeContentPadding = 0f,
-            afterContentPadding = 0f
-        )
+        val strategy =
+            Strategy(
+                defaultKeylines =
+                    keylineListOf(availableSpace, itemSpacing, CarouselAlignment.Center) {
+                        add(10f, isAnchor = true)
+                        add(56f)
+                        add(122f)
+                        add(186f)
+                        add(186f)
+                        add(122f)
+                        add(56f)
+                        add(10f, isAnchor = true)
+                    },
+                availableSpace = availableSpace,
+                itemSpacing = itemSpacing,
+                beforeContentPadding = 0f,
+                afterContentPadding = 0f
+            )
 
         assertThat(strategy.startKeylineSteps).hasSize(3)
         assertThat(strategy.endKeylineSteps).hasSize(3)
@@ -525,9 +577,8 @@
         assertThat(s1ActualOffsets).isEqualTo(s1ExpectedOffsets)
 
         val s1ActualUnadjustedOffsets = s1.map { it.unadjustedOffset }.toFloatArray()
-        val s1ExpectedUnadjustedOffsets = floatArrayOf(
-            -165f, 29f, 223f, 417f, 611f, 805f, 999f, 1193f
-        )
+        val s1ExpectedUnadjustedOffsets =
+            floatArrayOf(-165f, 29f, 223f, 417f, 611f, 805f, 999f, 1193f)
         assertThat(s1ActualUnadjustedOffsets).isEqualTo(s1ExpectedUnadjustedOffsets)
 
         val s2 = strategy.startKeylineSteps[2]
@@ -537,9 +588,8 @@
         assertThat(s2ActualOffsets).isEqualTo(s2ExpectedOffsets)
 
         val s2ActualUnadjustedOffsets = s2.map { it.unadjustedOffset }.toFloatArray()
-        val s2ExpectedUnadjustedOffsets = floatArrayOf(
-            -101f, 93f, 287f, 481f, 675f, 869f, 1063f, 1257f
-        )
+        val s2ExpectedUnadjustedOffsets =
+            floatArrayOf(-101f, 93f, 287f, 481f, 675f, 869f, 1063f, 1257f)
         assertThat(s2ActualUnadjustedOffsets).isEqualTo(s2ExpectedUnadjustedOffsets)
 
         val e1 = strategy.endKeylineSteps[1]
@@ -549,9 +599,8 @@
         assertThat(e1ActualOffsets).isEqualTo(e1ExpectedOffsets)
 
         val e1ActualUnadjustedOffsets = e1.map { it.unadjustedOffset }.toFloatArray()
-        val e1ExpectedUnadjustedOffsets = floatArrayOf(
-            -425f, -231f, -37f, 157f, 351f, 545f, 739f, 933f
-        )
+        val e1ExpectedUnadjustedOffsets =
+            floatArrayOf(-425f, -231f, -37f, 157f, 351f, 545f, 739f, 933f)
         assertThat(e1ActualUnadjustedOffsets).isEqualTo(e1ExpectedUnadjustedOffsets)
 
         val e2 = strategy.endKeylineSteps[2]
@@ -561,9 +610,8 @@
         assertThat(e2ActualOffsets).isEqualTo(e2ExpectedOffsets)
 
         val e2ActualUnadjustedOffsets = e2.map { it.unadjustedOffset }.toFloatArray()
-        val e2ExpectedUnadjustedOffsets = floatArrayOf(
-            -489f, -295f, -101f, 93f, 287f, 481f, 675f, 869f
-        )
+        val e2ExpectedUnadjustedOffsets =
+            floatArrayOf(-489f, -295f, -101f, 93f, 287f, 481f, 675f, 869f)
         assertThat(e2ActualUnadjustedOffsets).isEqualTo(e2ExpectedUnadjustedOffsets)
     }
 
@@ -571,34 +619,33 @@
     fun testCenterStrategy_stepsShouldAccountForContentPadding() {
         val availableSpace = 500f
         val itemSpacing = 0f
-        val strategy = Strategy(
-            defaultKeylines =
-                keylineListOf(availableSpace, itemSpacing, CarouselAlignment.Center) {
-                    add(10f, isAnchor = true)
-                    add(50f)
-                    add(100f)
-                    add(200f)
-                    add(100f)
-                    add(50f)
-                    add(10f, isAnchor = true)
-                },
-            availableSpace = availableSpace,
-            itemSpacing = itemSpacing,
-            beforeContentPadding = 16f,
-            afterContentPadding = 24f
-        )
+        val strategy =
+            Strategy(
+                defaultKeylines =
+                    keylineListOf(availableSpace, itemSpacing, CarouselAlignment.Center) {
+                        add(10f, isAnchor = true)
+                        add(50f)
+                        add(100f)
+                        add(200f)
+                        add(100f)
+                        add(50f)
+                        add(10f, isAnchor = true)
+                    },
+                availableSpace = availableSpace,
+                itemSpacing = itemSpacing,
+                beforeContentPadding = 16f,
+                afterContentPadding = 24f
+            )
 
         val lastStartStep = strategy.startKeylineSteps.last()
 
-        val firstFocalLeft = lastStartStep.firstFocal.offset -
-            (lastStartStep.firstFocal.size / 2f)
-        val lastNonAnchorRight = lastStartStep.lastNonAnchor.offset +
-            (lastStartStep.lastNonAnchor.size / 2f)
+        val firstFocalLeft = lastStartStep.firstFocal.offset - (lastStartStep.firstFocal.size / 2f)
+        val lastNonAnchorRight =
+            lastStartStep.lastNonAnchor.offset + (lastStartStep.lastNonAnchor.size / 2f)
         val lastEndStep = strategy.endKeylineSteps.last()
-        val lastFocalRight = lastEndStep.lastFocal.offset +
-            (lastEndStep.lastFocal.size / 2f)
-        val firstNonAnchorLeft = lastEndStep.firstNonAnchor.offset -
-            (lastEndStep.firstNonAnchor.size / 2f)
+        val lastFocalRight = lastEndStep.lastFocal.offset + (lastEndStep.lastFocal.size / 2f)
+        val firstNonAnchorLeft =
+            lastEndStep.firstNonAnchor.offset - (lastEndStep.firstNonAnchor.size / 2f)
 
         assertThat(firstFocalLeft).isEqualTo(16f)
         assertThat(lastNonAnchorRight).isEqualTo(500f)
@@ -610,20 +657,21 @@
     fun testStartStrategy_twoLargeOneSmall_shouldAccountForPadding() {
         val availableSpace = 444f
         val itemSpacing = 8f
-        val strategy = Strategy(
-            defaultKeylines =
-                keylineListOf(availableSpace, itemSpacing, CarouselAlignment.Start) {
-                    add(10f, isAnchor = true)
-                    add(186f)
-                    add(186f)
-                    add(56f)
-                    add(10f, isAnchor = true)
-                },
-            availableSpace = availableSpace,
-            itemSpacing = itemSpacing,
-            beforeContentPadding = 16f,
-            afterContentPadding = 16f
-        )
+        val strategy =
+            Strategy(
+                defaultKeylines =
+                    keylineListOf(availableSpace, itemSpacing, CarouselAlignment.Start) {
+                        add(10f, isAnchor = true)
+                        add(186f)
+                        add(186f)
+                        add(56f)
+                        add(10f, isAnchor = true)
+                    },
+                availableSpace = availableSpace,
+                itemSpacing = itemSpacing,
+                beforeContentPadding = 16f,
+                afterContentPadding = 16f
+            )
 
         assertThat(strategy.itemMainAxisSize).isEqualTo(186f)
 
@@ -647,17 +695,13 @@
         actual: Keyline,
         expected: Keyline
     ) {
-        assertThat(actual.size)
-            .isWithin(tolerance).of(expected.size)
-        assertThat(actual.offset)
-            .isWithin(tolerance).of(expected.offset)
-        assertThat(actual.unadjustedOffset)
-            .isWithin(0.01f).of(expected.unadjustedOffset)
+        assertThat(actual.size).isWithin(tolerance).of(expected.size)
+        assertThat(actual.offset).isWithin(tolerance).of(expected.offset)
+        assertThat(actual.unadjustedOffset).isWithin(0.01f).of(expected.unadjustedOffset)
         assertThat(actual.isFocal).isEqualTo(expected.isFocal)
         assertThat(actual.isAnchor).isEqualTo(expected.isAnchor)
         assertThat(actual.isPivot).isEqualTo(expected.isPivot)
-        assertThat(actual.cutoff)
-            .isWithin(tolerance).of(expected.cutoff)
+        assertThat(actual.cutoff).isWithin(tolerance).of(expected.cutoff)
     }
 
     companion object {
diff --git a/compose/material3/material3/src/androidUnitTest/kotlin/androidx/compose/material3/carousel/UncontainedTest.kt b/compose/material3/material3/src/androidUnitTest/kotlin/androidx/compose/material3/carousel/UncontainedTest.kt
index 1a74bad..4840ea7 100644
--- a/compose/material3/material3/src/androidUnitTest/kotlin/androidx/compose/material3/carousel/UncontainedTest.kt
+++ b/compose/material3/material3/src/androidUnitTest/kotlin/androidx/compose/material3/carousel/UncontainedTest.kt
@@ -33,19 +33,21 @@
     fun testLargeItem_withFullCarouselWidth() {
         val itemSize = 500f
         val carouselSize = 500f
-        val keylineList = uncontainedKeylineList(
-            density = Density,
-            carouselMainAxisSize = carouselSize,
-            itemSize = itemSize,
-            itemSpacing = 0f
-        )
-        val strategy = Strategy(
-            defaultKeylines = keylineList,
-            availableSpace = carouselSize,
-            itemSpacing = 0f,
-            beforeContentPadding = 0f,
-            afterContentPadding = 0f
-        )
+        val keylineList =
+            uncontainedKeylineList(
+                density = Density,
+                carouselMainAxisSize = carouselSize,
+                itemSize = itemSize,
+                itemSpacing = 0f
+            )
+        val strategy =
+            Strategy(
+                defaultKeylines = keylineList,
+                availableSpace = carouselSize,
+                itemSpacing = 0f,
+                beforeContentPadding = 0f,
+                afterContentPadding = 0f
+            )
         val keylines = strategy.defaultKeylines
         val anchorSize = with(Density) { CarouselDefaults.AnchorSize.toPx() }
 
@@ -62,19 +64,21 @@
     fun testLargeItem_largerThanFullCarouselWidth() {
         val carouselSize = 400f
         val itemSize = 500f
-        val keylineList = uncontainedKeylineList(
-            density = Density,
-            carouselMainAxisSize = carouselSize,
-            itemSize = itemSize,
-            itemSpacing = 0f
-        )
-        val strategy = Strategy(
-            defaultKeylines = keylineList,
-            availableSpace = carouselSize,
-            itemSpacing = 0f,
-            beforeContentPadding = 0f,
-            afterContentPadding = 0f
-        )
+        val keylineList =
+            uncontainedKeylineList(
+                density = Density,
+                carouselMainAxisSize = carouselSize,
+                itemSize = itemSize,
+                itemSpacing = 0f
+            )
+        val strategy =
+            Strategy(
+                defaultKeylines = keylineList,
+                availableSpace = carouselSize,
+                itemSpacing = 0f,
+                beforeContentPadding = 0f,
+                afterContentPadding = 0f
+            )
         val keylines = strategy.defaultKeylines
         val anchorSize = with(Density) { CarouselDefaults.AnchorSize.toPx() }
 
@@ -94,19 +98,21 @@
         // which will be the size of the medium item since it can be a third cut off and it is less
         // than the threshold percentage * large item size.
         val itemSize = 125f
-        val keylineList = uncontainedKeylineList(
-            density = Density,
-            carouselMainAxisSize = carouselSize,
-            itemSize = itemSize,
-            itemSpacing = 0f
-        )
-        val strategy = Strategy(
-            defaultKeylines = keylineList,
-            availableSpace = carouselSize,
-            itemSpacing = 0f,
-            beforeContentPadding = 0f,
-            afterContentPadding = 0f
-        )
+        val keylineList =
+            uncontainedKeylineList(
+                density = Density,
+                carouselMainAxisSize = carouselSize,
+                itemSize = itemSize,
+                itemSpacing = 0f
+            )
+        val strategy =
+            Strategy(
+                defaultKeylines = keylineList,
+                availableSpace = carouselSize,
+                itemSpacing = 0f,
+                beforeContentPadding = 0f,
+                afterContentPadding = 0f
+            )
         val keylines = strategy.defaultKeylines
         val rightAnchorSize = with(Density) { CarouselDefaults.AnchorSize.toPx() }
 
@@ -135,19 +141,21 @@
         // whichever is larger between 85% of the large size, or 110% of the remainingSpace to make
         // it at most 10% cut off.
         val itemSize = 105f
-        val keylineList = uncontainedKeylineList(
-            density = Density,
-            carouselMainAxisSize = carouselSize,
-            itemSize = itemSize,
-            itemSpacing = 0f
-        )
-        val strategy = Strategy(
-            defaultKeylines = keylineList,
-            availableSpace = carouselSize,
-            itemSpacing = 0f,
-            beforeContentPadding = 0f,
-            afterContentPadding = 0f
-        )
+        val keylineList =
+            uncontainedKeylineList(
+                density = Density,
+                carouselMainAxisSize = carouselSize,
+                itemSize = itemSize,
+                itemSpacing = 0f
+            )
+        val strategy =
+            Strategy(
+                defaultKeylines = keylineList,
+                availableSpace = carouselSize,
+                itemSpacing = 0f,
+                beforeContentPadding = 0f,
+                afterContentPadding = 0f
+            )
         val keylines = strategy.defaultKeylines
         val rightAnchorSize = with(Density) { CarouselDefaults.AnchorSize.toPx() }
 
@@ -161,7 +169,6 @@
         assertThat(keylines[0].size).isEqualTo(85 * 1.2f * 0.5f)
         assertThat(keylines[5].size).isEqualTo(rightAnchorSize)
         assertThat(keylines[0].offset).isEqualTo(-(85 * 1.2f * 0.5f) / 2f)
-        assertThat(keylines[5].offset)
-            .isEqualTo(itemSize * 3 + 85 * 1.2f + rightAnchorSize / 2f)
+        assertThat(keylines[5].offset).isEqualTo(itemSize * 3 + 85 * 1.2f + rightAnchorSize / 2f)
     }
 }
diff --git a/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/AlertDialog.kt b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/AlertDialog.kt
index ee43c24..d727e44 100644
--- a/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/AlertDialog.kt
+++ b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/AlertDialog.kt
@@ -45,45 +45,49 @@
 import kotlin.math.max
 
 /**
- * <a href="https://m3.material.io/components/dialogs/overview" class="external" target="_blank">Material Design basic dialog</a>.
+ * <a href="https://m3.material.io/components/dialogs/overview" class="external"
+ * target="_blank">Material Design basic dialog</a>.
  *
  * Dialogs provide important prompts in a user flow. They can require an action, communicate
  * information, or help users accomplish a task.
  *
- * ![Basic dialog image](https://developer.android.com/images/reference/androidx/compose/material3/basic-dialog.png)
+ * ![Basic dialog
+ * image](https://developer.android.com/images/reference/androidx/compose/material3/basic-dialog.png)
  *
- * The dialog will position its buttons, typically [TextButton]s, based on the available space.
- * By default it will try to place them horizontally next to each other and fallback to horizontal
+ * The dialog will position its buttons, typically [TextButton]s, based on the available space. By
+ * default it will try to place them horizontally next to each other and fallback to horizontal
  * placement if not enough space is available.
  *
  * Simple usage:
+ *
  * @sample androidx.compose.material3.samples.AlertDialogSample
  *
  * Usage with a "Hero" icon:
+ *
  * @sample androidx.compose.material3.samples.AlertDialogWithIconSample
  *
- * @param onDismissRequest called when the user tries to dismiss the Dialog by clicking outside
- * or pressing the back button. This is not called when the dismiss button is clicked.
+ * @param onDismissRequest called when the user tries to dismiss the Dialog by clicking outside or
+ *   pressing the back button. This is not called when the dismiss button is clicked.
  * @param confirmButton button which is meant to confirm a proposed action, thus resolving what
- * triggered the dialog. The dialog does not set up any events for this button so they need to be
- * set up by the caller.
+ *   triggered the dialog. The dialog does not set up any events for this button so they need to be
+ *   set up by the caller.
  * @param modifier the [Modifier] to be applied to this dialog
  * @param dismissButton button which is meant to dismiss the dialog. The dialog does not set up any
- * events for this button so they need to be set up by the caller.
- * @param icon optional icon that will appear above the [title] or above the [text], in case a
- * title was not provided.
+ *   events for this button so they need to be set up by the caller.
+ * @param icon optional icon that will appear above the [title] or above the [text], in case a title
+ *   was not provided.
  * @param title title which should specify the purpose of the dialog. The title is not mandatory,
- * because there may be sufficient information inside the [text].
+ *   because there may be sufficient information inside the [text].
  * @param text text which presents the details regarding the dialog's purpose.
  * @param shape defines the shape of this dialog's container
  * @param containerColor the color used for the background of this dialog. Use [Color.Transparent]
- * to have no color.
+ *   to have no color.
  * @param iconContentColor the content color used for the icon.
  * @param titleContentColor the content color used for the title.
  * @param textContentColor the content color used for the text.
  * @param tonalElevation when [containerColor] is [ColorScheme.surface], a translucent primary color
- * overlay is applied on top of the container. A higher tonal elevation value will result in a
- * darker color in light theme and lighter color in dark theme. See also: [Surface].
+ *   overlay is applied on top of the container. A higher tonal elevation value will result in a
+ *   darker color in light theme and lighter color in dark theme. See also: [Surface].
  * @param properties typically platform specific properties to further configure the dialog.
  * @see BasicAlertDialog
  */
@@ -106,12 +110,14 @@
 )
 
 /**
- * <a href="https://m3.material.io/components/dialogs/overview" class="external" target="_blank">Basic alert dialog dialog</a>.
+ * <a href="https://m3.material.io/components/dialogs/overview" class="external"
+ * target="_blank">Basic alert dialog dialog</a>.
  *
  * Dialogs provide important prompts in a user flow. They can require an action, communicate
  * information, or help users accomplish a task.
  *
- * ![Basic dialog image](https://developer.android.com/images/reference/androidx/compose/material3/basic-dialog.png)
+ * ![Basic dialog
+ * image](https://developer.android.com/images/reference/androidx/compose/material3/basic-dialog.png)
  *
  * This basic alert dialog expects an arbitrary content that is defined by the caller. Note that
  * your content will need to define its own styling.
@@ -121,10 +127,11 @@
  * [Modifier]s.
  *
  * Basic alert dialog usage with custom content:
+ *
  * @sample androidx.compose.material3.samples.BasicAlertDialogSample
  *
- * @param onDismissRequest called when the user tries to dismiss the Dialog by clicking outside
- * or pressing the back button. This is not called when the dismiss button is clicked.
+ * @param onDismissRequest called when the user tries to dismiss the Dialog by clicking outside or
+ *   pressing the back button. This is not called when the dismiss button is clicked.
  * @param modifier the [Modifier] to be applied to this dialog's content.
  * @param properties typically platform specific properties to further configure the dialog.
  * @param content the content of the dialog
@@ -143,9 +150,10 @@
     ) {
         val dialogPaneDescription = getString(Strings.Dialog)
         Box(
-            modifier = modifier
-                .sizeIn(minWidth = DialogMinWidth, maxWidth = DialogMaxWidth)
-                .then(Modifier.semantics { paneTitle = dialogPaneDescription }),
+            modifier =
+                modifier
+                    .sizeIn(minWidth = DialogMinWidth, maxWidth = DialogMaxWidth)
+                    .then(Modifier.semantics { paneTitle = dialogPaneDescription }),
             propagateMinConstraints = true
         ) {
             content()
@@ -154,12 +162,14 @@
 }
 
 /**
- * <a href="https://m3.material.io/components/dialogs/overview" class="external" target="_blank">Basic alert dialog dialog</a>.
+ * <a href="https://m3.material.io/components/dialogs/overview" class="external"
+ * target="_blank">Basic alert dialog dialog</a>.
  *
  * Dialogs provide important prompts in a user flow. They can require an action, communicate
  * information, or help users accomplish a task.
  *
- * ![Basic dialog image](https://developer.android.com/images/reference/androidx/compose/material3/basic-dialog.png)
+ * ![Basic dialog
+ * image](https://developer.android.com/images/reference/androidx/compose/material3/basic-dialog.png)
  *
  * This basic alert dialog expects an arbitrary content that is defined by the caller. Note that
  * your content will need to define its own styling.
@@ -169,19 +179,18 @@
  * [Modifier]s.
  *
  * Basic alert dialog usage with custom content:
+ *
  * @sample androidx.compose.material3.samples.BasicAlertDialogSample
  *
- * @param onDismissRequest called when the user tries to dismiss the Dialog by clicking outside
- * or pressing the back button. This is not called when the dismiss button is clicked.
+ * @param onDismissRequest called when the user tries to dismiss the Dialog by clicking outside or
+ *   pressing the back button. This is not called when the dismiss button is clicked.
  * @param modifier the [Modifier] to be applied to this dialog's content.
  * @param properties typically platform specific properties to further configure the dialog.
  * @param content the content of the dialog
  */
 @Deprecated(
     "Use BasicAlertDialog instead",
-    replaceWith = ReplaceWith(
-        "BasicAlertDialog(onDismissRequest, modifier, properties, content)"
-    )
+    replaceWith = ReplaceWith("BasicAlertDialog(onDismissRequest, modifier, properties, content)")
 )
 @ExperimentalMaterial3Api
 @Composable
@@ -192,24 +201,27 @@
     content: @Composable () -> Unit
 ) = BasicAlertDialog(onDismissRequest, modifier, properties, content)
 
-/**
- * Contains default values used for [AlertDialog] and [BasicAlertDialog].
- */
+/** Contains default values used for [AlertDialog] and [BasicAlertDialog]. */
 object AlertDialogDefaults {
     /** The default shape for alert dialogs */
-    val shape: Shape @Composable get() = DialogTokens.ContainerShape.value
+    val shape: Shape
+        @Composable get() = DialogTokens.ContainerShape.value
 
     /** The default container color for alert dialogs */
-    val containerColor: Color @Composable get() = DialogTokens.ContainerColor.value
+    val containerColor: Color
+        @Composable get() = DialogTokens.ContainerColor.value
 
     /** The default icon color for alert dialogs */
-    val iconContentColor: Color @Composable get() = DialogTokens.IconColor.value
+    val iconContentColor: Color
+        @Composable get() = DialogTokens.IconColor.value
 
     /** The default title color for alert dialogs */
-    val titleContentColor: Color @Composable get() = DialogTokens.HeadlineColor.value
+    val titleContentColor: Color
+        @Composable get() = DialogTokens.HeadlineColor.value
 
     /** The default text color for alert dialogs */
-    val textContentColor: Color @Composable get() = DialogTokens.SupportingTextColor.value
+    val textContentColor: Color
+        @Composable get() = DialogTokens.SupportingTextColor.value
 
     /** The default tonal elevation for alert dialogs */
     val TonalElevation: Dp = 0.dp
@@ -232,37 +244,38 @@
     textContentColor: Color,
     tonalElevation: Dp,
     properties: DialogProperties
-): Unit = BasicAlertDialog(
-    onDismissRequest = onDismissRequest,
-    modifier = modifier,
-    properties = properties
-) {
-    AlertDialogContent(
-        buttons = {
-            AlertDialogFlowRow(
-                mainAxisSpacing = ButtonsMainAxisSpacing,
-                crossAxisSpacing = ButtonsCrossAxisSpacing
-            ) {
-                dismissButton?.invoke()
-                confirmButton()
-            }
-        },
-        icon = icon,
-        title = title,
-        text = text,
-        shape = shape,
-        containerColor = containerColor,
-        tonalElevation = tonalElevation,
-        // Note that a button content color is provided here from the dialog's token, but in
-        // most cases, TextButtons should be used for dismiss and confirm buttons.
-        // TextButtons will not consume this provided content color value, and will used their
-        // own defined or default colors.
-        buttonContentColor = DialogTokens.ActionLabelTextColor.value,
-        iconContentColor = iconContentColor,
-        titleContentColor = titleContentColor,
-        textContentColor = textContentColor,
-    )
-}
+): Unit =
+    BasicAlertDialog(
+        onDismissRequest = onDismissRequest,
+        modifier = modifier,
+        properties = properties
+    ) {
+        AlertDialogContent(
+            buttons = {
+                AlertDialogFlowRow(
+                    mainAxisSpacing = ButtonsMainAxisSpacing,
+                    crossAxisSpacing = ButtonsCrossAxisSpacing
+                ) {
+                    dismissButton?.invoke()
+                    confirmButton()
+                }
+            },
+            icon = icon,
+            title = title,
+            text = text,
+            shape = shape,
+            containerColor = containerColor,
+            tonalElevation = tonalElevation,
+            // Note that a button content color is provided here from the dialog's token, but in
+            // most cases, TextButtons should be used for dismiss and confirm buttons.
+            // TextButtons will not consume this provided content color value, and will used their
+            // own defined or default colors.
+            buttonContentColor = DialogTokens.ActionLabelTextColor.value,
+            iconContentColor = iconContentColor,
+            titleContentColor = titleContentColor,
+            textContentColor = textContentColor,
+        )
+    }
 
 @Composable
 internal fun AlertDialogContent(
@@ -285,16 +298,10 @@
         color = containerColor,
         tonalElevation = tonalElevation,
     ) {
-        Column(
-            modifier = Modifier.padding(DialogPadding)
-        ) {
+        Column(modifier = Modifier.padding(DialogPadding)) {
             icon?.let {
                 CompositionLocalProvider(LocalContentColor provides iconContentColor) {
-                    Box(
-                        Modifier
-                            .padding(IconPadding)
-                            .align(Alignment.CenterHorizontally)
-                    ) {
+                    Box(Modifier.padding(IconPadding).align(Alignment.CenterHorizontally)) {
                         icon()
                     }
                 }
@@ -302,11 +309,11 @@
             title?.let {
                 ProvideContentColorTextStyle(
                     contentColor = titleContentColor,
-                    textStyle = DialogTokens.HeadlineFont.value) {
+                    textStyle = DialogTokens.HeadlineFont.value
+                ) {
                     Box(
                         // Align the title to the center when an icon is present.
-                        Modifier
-                            .padding(TitlePadding)
+                        Modifier.padding(TitlePadding)
                             .align(
                                 if (icon == null) {
                                     Alignment.Start
@@ -323,10 +330,10 @@
                 val textStyle = DialogTokens.SupportingTextFont.value
                 ProvideContentColorTextStyle(
                     contentColor = textContentColor,
-                    textStyle = textStyle) {
+                    textStyle = textStyle
+                ) {
                     Box(
-                        Modifier
-                            .weight(weight = 1f, fill = false)
+                        Modifier.weight(weight = 1f, fill = false)
                             .padding(TextPadding)
                             .align(Alignment.Start)
                     ) {
@@ -335,12 +342,12 @@
                 }
             }
             Box(modifier = Modifier.align(Alignment.End)) {
-                val textStyle =
-                    DialogTokens.ActionLabelTextFont.value
+                val textStyle = DialogTokens.ActionLabelTextFont.value
                 ProvideContentColorTextStyle(
                     contentColor = buttonContentColor,
                     textStyle = textStyle,
-                    content = buttons)
+                    content = buttons
+                )
             }
         }
     }
@@ -370,8 +377,9 @@
 
         // Return whether the placeable can be added to the current sequence.
         fun canAddToCurrentSequence(placeable: Placeable) =
-            currentSequence.isEmpty() || currentMainAxisSize + mainAxisSpacing.roundToPx() +
-                placeable.width <= constraints.maxWidth
+            currentSequence.isEmpty() ||
+                currentMainAxisSize + mainAxisSpacing.roundToPx() + placeable.width <=
+                    constraints.maxWidth
 
         // Store current sequence information and start a new sequence.
         fun startNewSequence() {
@@ -379,8 +387,7 @@
                 crossAxisSpace += crossAxisSpacing.roundToPx()
             }
             // Ensures that confirming actions appear above dismissive actions.
-            @Suppress("ListIterator")
-            sequences.add(0, currentSequence.toList())
+            @Suppress("ListIterator") sequences.add(0, currentSequence.toList())
             crossAxisSizes += currentCrossAxisSize
             crossAxisPositions += crossAxisSpace
 
@@ -420,21 +427,23 @@
 
         layout(layoutWidth, layoutHeight) {
             sequences.fastForEachIndexed { i, placeables ->
-                val childrenMainAxisSizes = IntArray(placeables.size) { j ->
-                    placeables[j].width +
-                        if (j < placeables.lastIndex) mainAxisSpacing.roundToPx() else 0
-                }
+                val childrenMainAxisSizes =
+                    IntArray(placeables.size) { j ->
+                        placeables[j].width +
+                            if (j < placeables.lastIndex) mainAxisSpacing.roundToPx() else 0
+                    }
                 val arrangement = Arrangement.End
                 val mainAxisPositions = IntArray(childrenMainAxisSizes.size) { 0 }
                 with(arrangement) {
-                    arrange(mainAxisLayoutSize, childrenMainAxisSizes,
-                        layoutDirection, mainAxisPositions)
+                    arrange(
+                        mainAxisLayoutSize,
+                        childrenMainAxisSizes,
+                        layoutDirection,
+                        mainAxisPositions
+                    )
                 }
                 placeables.fastForEachIndexed { j, placeable ->
-                    placeable.place(
-                        x = mainAxisPositions[j],
-                        y = crossAxisPositions[i]
-                    )
+                    placeable.place(x = mainAxisPositions[j], y = crossAxisPositions[i])
                 }
             }
         }
diff --git a/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/AppBar.kt b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/AppBar.kt
index 35c4b9f..a18812e 100644
--- a/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/AppBar.kt
+++ b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/AppBar.kt
@@ -95,34 +95,39 @@
 import kotlin.math.roundToInt
 
 /**
- * <a href="https://m3.material.io/components/top-app-bar/overview" class="external" target="_blank">Material Design small top app bar</a>.
+ * <a href="https://m3.material.io/components/top-app-bar/overview" class="external"
+ * target="_blank">Material Design small top app bar</a>.
  *
  * Top app bars display information and actions at the top of a screen.
  *
  * This small TopAppBar has slots for a title, navigation icon, and actions.
  *
- * ![Small top app bar image](https://developer.android.com/images/reference/androidx/compose/material3/small-top-app-bar.png)
+ * ![Small top app bar
+ * image](https://developer.android.com/images/reference/androidx/compose/material3/small-top-app-bar.png)
  *
  * A simple top app bar looks like:
+ *
  * @sample androidx.compose.material3.samples.SimpleTopAppBar
  * A top app bar that uses a [scrollBehavior] to customize its nested scrolling behavior when
  * working in conjunction with a scrolling content looks like:
+ *
  * @sample androidx.compose.material3.samples.PinnedTopAppBar
+ *
  * @sample androidx.compose.material3.samples.EnterAlwaysTopAppBar
  *
  * @param title the title to be displayed in the top app bar
  * @param modifier the [Modifier] to be applied to this top app bar
  * @param navigationIcon the navigation icon displayed at the start of the top app bar. This should
- * typically be an [IconButton] or [IconToggleButton].
+ *   typically be an [IconButton] or [IconToggleButton].
  * @param actions the actions displayed at the end of the top app bar. This should typically be
- * [IconButton]s. The default layout here is a [Row], so icons inside will be placed horizontally.
+ *   [IconButton]s. The default layout here is a [Row], so icons inside will be placed horizontally.
  * @param windowInsets a window insets that app bar will respect.
- * @param colors [TopAppBarColors] that will be used to resolve the colors used for this top app
- * bar in different states. See [TopAppBarDefaults.topAppBarColors].
+ * @param colors [TopAppBarColors] that will be used to resolve the colors used for this top app bar
+ *   in different states. See [TopAppBarDefaults.topAppBarColors].
  * @param scrollBehavior a [TopAppBarScrollBehavior] which holds various offset values that will be
- * applied by this top app bar to set up its height and colors. A scroll behavior is designed to
- * work in conjunction with a scrolled content to change the top app bar appearance as the content
- * scrolls. See [TopAppBarScrollBehavior.nestedScrollConnection].
+ *   applied by this top app bar to set up its height and colors. A scroll behavior is designed to
+ *   work in conjunction with a scrolled content to change the top app bar appearance as the content
+ *   scrolls. See [TopAppBarScrollBehavior.nestedScrollConnection].
  */
 @Deprecated(
     message = "Deprecated in favor of TopAppBar with expandedHeight parameter",
@@ -138,50 +143,56 @@
     windowInsets: WindowInsets = TopAppBarDefaults.windowInsets,
     colors: TopAppBarColors = TopAppBarDefaults.topAppBarColors(),
     scrollBehavior: TopAppBarScrollBehavior? = null
-) = TopAppBar(
-    title = title,
-    modifier = modifier,
-    navigationIcon = navigationIcon,
-    actions = actions,
-    expandedHeight = TopAppBarDefaults.TopAppBarExpandedHeight,
-    windowInsets = windowInsets,
-    colors = colors,
-    scrollBehavior = scrollBehavior
-)
+) =
+    TopAppBar(
+        title = title,
+        modifier = modifier,
+        navigationIcon = navigationIcon,
+        actions = actions,
+        expandedHeight = TopAppBarDefaults.TopAppBarExpandedHeight,
+        windowInsets = windowInsets,
+        colors = colors,
+        scrollBehavior = scrollBehavior
+    )
 
 /**
- * <a href="https://m3.material.io/components/top-app-bar/overview" class="external" target="_blank">Material Design small top app bar</a>.
+ * <a href="https://m3.material.io/components/top-app-bar/overview" class="external"
+ * target="_blank">Material Design small top app bar</a>.
  *
  * Top app bars display information and actions at the top of a screen.
  *
  * This small TopAppBar has slots for a title, navigation icon, and actions.
  *
- * ![Small top app bar image](https://developer.android.com/images/reference/androidx/compose/material3/small-top-app-bar.png)
+ * ![Small top app bar
+ * image](https://developer.android.com/images/reference/androidx/compose/material3/small-top-app-bar.png)
  *
  * A simple top app bar looks like:
+ *
  * @sample androidx.compose.material3.samples.SimpleTopAppBar
  * A top app bar that uses a [scrollBehavior] to customize its nested scrolling behavior when
  * working in conjunction with a scrolling content looks like:
+ *
  * @sample androidx.compose.material3.samples.PinnedTopAppBar
+ *
  * @sample androidx.compose.material3.samples.EnterAlwaysTopAppBar
  *
  * @param title the title to be displayed in the top app bar
  * @param modifier the [Modifier] to be applied to this top app bar
  * @param navigationIcon the navigation icon displayed at the start of the top app bar. This should
- * typically be an [IconButton] or [IconToggleButton].
+ *   typically be an [IconButton] or [IconToggleButton].
  * @param actions the actions displayed at the end of the top app bar. This should typically be
- * [IconButton]s. The default layout here is a [Row], so icons inside will be placed horizontally.
+ *   [IconButton]s. The default layout here is a [Row], so icons inside will be placed horizontally.
  * @param expandedHeight this app bar's height. When a specified [scrollBehavior] causes the app bar
- * to collapse or expand, this value will represent the maximum height that the bar will be allowed
- * to expand. This value must be specified and finite, otherwise it will be ignored and replaced
- * with [TopAppBarDefaults.TopAppBarExpandedHeight].
+ *   to collapse or expand, this value will represent the maximum height that the bar will be
+ *   allowed to expand. This value must be specified and finite, otherwise it will be ignored and
+ *   replaced with [TopAppBarDefaults.TopAppBarExpandedHeight].
  * @param windowInsets a window insets that app bar will respect.
- * @param colors [TopAppBarColors] that will be used to resolve the colors used for this top app
- * bar in different states. See [TopAppBarDefaults.topAppBarColors].
+ * @param colors [TopAppBarColors] that will be used to resolve the colors used for this top app bar
+ *   in different states. See [TopAppBarDefaults.topAppBarColors].
  * @param scrollBehavior a [TopAppBarScrollBehavior] which holds various offset values that will be
- * applied by this top app bar to set up its height and colors. A scroll behavior is designed to
- * work in conjunction with a scrolled content to change the top app bar appearance as the content
- * scrolls. See [TopAppBarScrollBehavior.nestedScrollConnection].
+ *   applied by this top app bar to set up its height and colors. A scroll behavior is designed to
+ *   work in conjunction with a scrolled content to change the top app bar appearance as the content
+ *   scrolls. See [TopAppBarScrollBehavior.nestedScrollConnection].
  */
 @ExperimentalMaterial3Api
 @Composable
@@ -194,51 +205,56 @@
     windowInsets: WindowInsets = TopAppBarDefaults.windowInsets,
     colors: TopAppBarColors = TopAppBarDefaults.topAppBarColors(),
     scrollBehavior: TopAppBarScrollBehavior? = null
-) = SingleRowTopAppBar(
-    modifier = modifier,
-    title = title,
-    titleTextStyle = TopAppBarSmallTokens.HeadlineFont.value,
-    centeredTitle = false,
-    navigationIcon = navigationIcon,
-    actions = actions,
-    expandedHeight = if (expandedHeight == Dp.Unspecified || expandedHeight == Dp.Infinity) {
-        TopAppBarDefaults.TopAppBarExpandedHeight
-    } else {
-        expandedHeight
-    },
-    windowInsets = windowInsets,
-    colors = colors,
-    scrollBehavior = scrollBehavior
-)
+) =
+    SingleRowTopAppBar(
+        modifier = modifier,
+        title = title,
+        titleTextStyle = TopAppBarSmallTokens.HeadlineFont.value,
+        centeredTitle = false,
+        navigationIcon = navigationIcon,
+        actions = actions,
+        expandedHeight =
+            if (expandedHeight == Dp.Unspecified || expandedHeight == Dp.Infinity) {
+                TopAppBarDefaults.TopAppBarExpandedHeight
+            } else {
+                expandedHeight
+            },
+        windowInsets = windowInsets,
+        colors = colors,
+        scrollBehavior = scrollBehavior
+    )
 
 /**
- * <a href="https://m3.material.io/components/top-app-bar/overview" class="external" target="_blank">Material Design center-aligned small top app bar</a>.
+ * <a href="https://m3.material.io/components/top-app-bar/overview" class="external"
+ * target="_blank">Material Design center-aligned small top app bar</a>.
  *
  * Top app bars display information and actions at the top of a screen.
  *
  * This small top app bar has a header title that is horizontally aligned to the center.
  *
- * ![Center-aligned top app bar image](https://developer.android.com/images/reference/androidx/compose/material3/center-aligned-top-app-bar.png)
+ * ![Center-aligned top app bar
+ * image](https://developer.android.com/images/reference/androidx/compose/material3/center-aligned-top-app-bar.png)
  *
  * This CenterAlignedTopAppBar has slots for a title, navigation icon, and actions.
  *
  * A center aligned top app bar that uses a [scrollBehavior] to customize its nested scrolling
  * behavior when working in conjunction with a scrolling content looks like:
+ *
  * @sample androidx.compose.material3.samples.SimpleCenterAlignedTopAppBar
  *
  * @param title the title to be displayed in the top app bar
  * @param modifier the [Modifier] to be applied to this top app bar
  * @param navigationIcon the navigation icon displayed at the start of the top app bar. This should
- * typically be an [IconButton] or [IconToggleButton].
+ *   typically be an [IconButton] or [IconToggleButton].
  * @param actions the actions displayed at the end of the top app bar. This should typically be
- * [IconButton]s. The default layout here is a [Row], so icons inside will be placed horizontally.
+ *   [IconButton]s. The default layout here is a [Row], so icons inside will be placed horizontally.
  * @param windowInsets a window insets that app bar will respect.
- * @param colors [TopAppBarColors] that will be used to resolve the colors used for this top app
- * bar in different states. See [TopAppBarDefaults.centerAlignedTopAppBarColors].
+ * @param colors [TopAppBarColors] that will be used to resolve the colors used for this top app bar
+ *   in different states. See [TopAppBarDefaults.centerAlignedTopAppBarColors].
  * @param scrollBehavior a [TopAppBarScrollBehavior] which holds various offset values that will be
- * applied by this top app bar to set up its height and colors. A scroll behavior is designed to
- * work in conjunction with a scrolled content to change the top app bar appearance as the content
- * scrolls. See [TopAppBarScrollBehavior.nestedScrollConnection].
+ *   applied by this top app bar to set up its height and colors. A scroll behavior is designed to
+ *   work in conjunction with a scrolled content to change the top app bar appearance as the content
+ *   scrolls. See [TopAppBarScrollBehavior.nestedScrollConnection].
  */
 @Deprecated(
     message = "Deprecated in favor of CenterAlignedTopAppBar with expandedHeight parameter",
@@ -254,49 +270,53 @@
     windowInsets: WindowInsets = TopAppBarDefaults.windowInsets,
     colors: TopAppBarColors = TopAppBarDefaults.centerAlignedTopAppBarColors(),
     scrollBehavior: TopAppBarScrollBehavior? = null
-) = CenterAlignedTopAppBar(
-    title = title,
-    modifier = modifier,
-    navigationIcon = navigationIcon,
-    actions = actions,
-    expandedHeight = TopAppBarDefaults.TopAppBarExpandedHeight,
-    windowInsets = windowInsets,
-    colors = colors,
-    scrollBehavior = scrollBehavior
-)
+) =
+    CenterAlignedTopAppBar(
+        title = title,
+        modifier = modifier,
+        navigationIcon = navigationIcon,
+        actions = actions,
+        expandedHeight = TopAppBarDefaults.TopAppBarExpandedHeight,
+        windowInsets = windowInsets,
+        colors = colors,
+        scrollBehavior = scrollBehavior
+    )
 
 /**
- * <a href="https://m3.material.io/components/top-app-bar/overview" class="external" target="_blank">Material Design center-aligned small top app bar</a>.
+ * <a href="https://m3.material.io/components/top-app-bar/overview" class="external"
+ * target="_blank">Material Design center-aligned small top app bar</a>.
  *
  * Top app bars display information and actions at the top of a screen.
  *
  * This small top app bar has a header title that is horizontally aligned to the center.
  *
- * ![Center-aligned top app bar image](https://developer.android.com/images/reference/androidx/compose/material3/center-aligned-top-app-bar.png)
+ * ![Center-aligned top app bar
+ * image](https://developer.android.com/images/reference/androidx/compose/material3/center-aligned-top-app-bar.png)
  *
  * This CenterAlignedTopAppBar has slots for a title, navigation icon, and actions.
  *
  * A center aligned top app bar that uses a [scrollBehavior] to customize its nested scrolling
  * behavior when working in conjunction with a scrolling content looks like:
+ *
  * @sample androidx.compose.material3.samples.SimpleCenterAlignedTopAppBar
  *
  * @param title the title to be displayed in the top app bar
  * @param modifier the [Modifier] to be applied to this top app bar
  * @param navigationIcon the navigation icon displayed at the start of the top app bar. This should
- * typically be an [IconButton] or [IconToggleButton].
+ *   typically be an [IconButton] or [IconToggleButton].
  * @param actions the actions displayed at the end of the top app bar. This should typically be
- * [IconButton]s. The default layout here is a [Row], so icons inside will be placed horizontally.
+ *   [IconButton]s. The default layout here is a [Row], so icons inside will be placed horizontally.
  * @param expandedHeight this app bar's height. When a specified [scrollBehavior] causes the app bar
- * to collapse or expand, this value will represent the maximum height that the bar will be allowed
- * to expand. This value must be specified and finite, otherwise it will be ignored and replaced
- * with  [TopAppBarDefaults.TopAppBarExpandedHeight].
+ *   to collapse or expand, this value will represent the maximum height that the bar will be
+ *   allowed to expand. This value must be specified and finite, otherwise it will be ignored and
+ *   replaced with [TopAppBarDefaults.TopAppBarExpandedHeight].
  * @param windowInsets a window insets that app bar will respect.
- * @param colors [TopAppBarColors] that will be used to resolve the colors used for this top app
- * bar in different states. See [TopAppBarDefaults.centerAlignedTopAppBarColors].
+ * @param colors [TopAppBarColors] that will be used to resolve the colors used for this top app bar
+ *   in different states. See [TopAppBarDefaults.centerAlignedTopAppBarColors].
  * @param scrollBehavior a [TopAppBarScrollBehavior] which holds various offset values that will be
- * applied by this top app bar to set up its height and colors. A scroll behavior is designed to
- * work in conjunction with a scrolled content to change the top app bar appearance as the content
- * scrolls. See [TopAppBarScrollBehavior.nestedScrollConnection].
+ *   applied by this top app bar to set up its height and colors. A scroll behavior is designed to
+ *   work in conjunction with a scrolled content to change the top app bar appearance as the content
+ *   scrolls. See [TopAppBarScrollBehavior.nestedScrollConnection].
  */
 @ExperimentalMaterial3Api
 @Composable
@@ -309,56 +329,62 @@
     windowInsets: WindowInsets = TopAppBarDefaults.windowInsets,
     colors: TopAppBarColors = TopAppBarDefaults.centerAlignedTopAppBarColors(),
     scrollBehavior: TopAppBarScrollBehavior? = null
-) = SingleRowTopAppBar(
-    modifier = modifier,
-    title = title,
-    titleTextStyle = TopAppBarSmallTokens.HeadlineFont.value,
-    centeredTitle = true,
-    navigationIcon = navigationIcon,
-    actions = actions,
-    expandedHeight = if (expandedHeight == Dp.Unspecified || expandedHeight == Dp.Infinity) {
-        TopAppBarDefaults.TopAppBarExpandedHeight
-    } else {
-        expandedHeight
-    },
-    windowInsets = windowInsets,
-    colors = colors,
-    scrollBehavior = scrollBehavior
-)
+) =
+    SingleRowTopAppBar(
+        modifier = modifier,
+        title = title,
+        titleTextStyle = TopAppBarSmallTokens.HeadlineFont.value,
+        centeredTitle = true,
+        navigationIcon = navigationIcon,
+        actions = actions,
+        expandedHeight =
+            if (expandedHeight == Dp.Unspecified || expandedHeight == Dp.Infinity) {
+                TopAppBarDefaults.TopAppBarExpandedHeight
+            } else {
+                expandedHeight
+            },
+        windowInsets = windowInsets,
+        colors = colors,
+        scrollBehavior = scrollBehavior
+    )
 
 /**
- * <a href="https://m3.material.io/components/top-app-bar/overview" class="external" target="_blank">Material Design medium top app bar</a>.
+ * <a href="https://m3.material.io/components/top-app-bar/overview" class="external"
+ * target="_blank">Material Design medium top app bar</a>.
  *
  * Top app bars display information and actions at the top of a screen.
  *
- * ![Medium top app bar image](https://developer.android.com/images/reference/androidx/compose/material3/medium-top-app-bar.png)
+ * ![Medium top app bar
+ * image](https://developer.android.com/images/reference/androidx/compose/material3/medium-top-app-bar.png)
  *
  * This MediumTopAppBar has slots for a title, navigation icon, and actions. In its default expanded
  * state, the title is displayed in a second row under the navigation and actions.
  *
  * A medium top app bar that uses a [scrollBehavior] to customize its nested scrolling behavior when
  * working in conjunction with scrolling content looks like:
+ *
  * @sample androidx.compose.material3.samples.ExitUntilCollapsedMediumTopAppBar
  *
  * @param title the title to be displayed in the top app bar. This title will be used in the app
- * bar's expanded and collapsed states, although in its collapsed state it will be composed with a
- * smaller sized [TextStyle]
+ *   bar's expanded and collapsed states, although in its collapsed state it will be composed with a
+ *   smaller sized [TextStyle]
  * @param modifier the [Modifier] to be applied to this top app bar
  * @param navigationIcon the navigation icon displayed at the start of the top app bar. This should
- * typically be an [IconButton] or [IconToggleButton].
+ *   typically be an [IconButton] or [IconToggleButton].
  * @param actions the actions displayed at the end of the top app bar. This should typically be
- * [IconButton]s. The default layout here is a [Row], so icons inside will be placed horizontally.
+ *   [IconButton]s. The default layout here is a [Row], so icons inside will be placed horizontally.
  * @param windowInsets a window insets that app bar will respect.
- * @param colors [TopAppBarColors] that will be used to resolve the colors used for this top app
- * bar in different states. See [TopAppBarDefaults.mediumTopAppBarColors].
+ * @param colors [TopAppBarColors] that will be used to resolve the colors used for this top app bar
+ *   in different states. See [TopAppBarDefaults.mediumTopAppBarColors].
  * @param scrollBehavior a [TopAppBarScrollBehavior] which holds various offset values that will be
- * applied by this top app bar to set up its height and colors. A scroll behavior is designed to
- * work in conjunction with a scrolled content to change the top app bar appearance as the content
- * scrolls. See [TopAppBarScrollBehavior.nestedScrollConnection].
+ *   applied by this top app bar to set up its height and colors. A scroll behavior is designed to
+ *   work in conjunction with a scrolled content to change the top app bar appearance as the content
+ *   scrolls. See [TopAppBarScrollBehavior.nestedScrollConnection].
  */
 @Deprecated(
-    message = "Deprecated in favor of MediumTopAppBar with collapsedHeight and expandedHeight " +
-        "parameters",
+    message =
+        "Deprecated in favor of MediumTopAppBar with collapsedHeight and expandedHeight " +
+            "parameters",
     level = DeprecationLevel.HIDDEN
 )
 @ExperimentalMaterial3Api
@@ -371,58 +397,62 @@
     windowInsets: WindowInsets = TopAppBarDefaults.windowInsets,
     colors: TopAppBarColors = TopAppBarDefaults.mediumTopAppBarColors(),
     scrollBehavior: TopAppBarScrollBehavior? = null
-) = MediumTopAppBar(
-    title = title,
-    modifier = modifier,
-    navigationIcon = navigationIcon,
-    actions = actions,
-    collapsedHeight = TopAppBarDefaults.MediumAppBarCollapsedHeight,
-    expandedHeight = TopAppBarDefaults.MediumAppBarExpandedHeight,
-    windowInsets = windowInsets,
-    colors = colors,
-    scrollBehavior = scrollBehavior
-)
+) =
+    MediumTopAppBar(
+        title = title,
+        modifier = modifier,
+        navigationIcon = navigationIcon,
+        actions = actions,
+        collapsedHeight = TopAppBarDefaults.MediumAppBarCollapsedHeight,
+        expandedHeight = TopAppBarDefaults.MediumAppBarExpandedHeight,
+        windowInsets = windowInsets,
+        colors = colors,
+        scrollBehavior = scrollBehavior
+    )
 
 /**
- * <a href="https://m3.material.io/components/top-app-bar/overview" class="external" target="_blank">Material Design medium top app bar</a>.
+ * <a href="https://m3.material.io/components/top-app-bar/overview" class="external"
+ * target="_blank">Material Design medium top app bar</a>.
  *
  * Top app bars display information and actions at the top of a screen.
  *
- * ![Medium top app bar image](https://developer.android.com/images/reference/androidx/compose/material3/medium-top-app-bar.png)
+ * ![Medium top app bar
+ * image](https://developer.android.com/images/reference/androidx/compose/material3/medium-top-app-bar.png)
  *
  * This MediumTopAppBar has slots for a title, navigation icon, and actions. In its default expanded
  * state, the title is displayed in a second row under the navigation and actions.
  *
  * A medium top app bar that uses a [scrollBehavior] to customize its nested scrolling behavior when
  * working in conjunction with scrolling content looks like:
+ *
  * @sample androidx.compose.material3.samples.ExitUntilCollapsedMediumTopAppBar
  *
  * @param title the title to be displayed in the top app bar. This title will be used in the app
- * bar's expanded and collapsed states, although in its collapsed state it will be composed with a
- * smaller sized [TextStyle]
+ *   bar's expanded and collapsed states, although in its collapsed state it will be composed with a
+ *   smaller sized [TextStyle]
  * @param modifier the [Modifier] to be applied to this top app bar
  * @param navigationIcon the navigation icon displayed at the start of the top app bar. This should
- * typically be an [IconButton] or [IconToggleButton].
+ *   typically be an [IconButton] or [IconToggleButton].
  * @param actions the actions displayed at the end of the top app bar. This should typically be
- * [IconButton]s. The default layout here is a [Row], so icons inside will be placed horizontally.
+ *   [IconButton]s. The default layout here is a [Row], so icons inside will be placed horizontally.
  * @param collapsedHeight this app bar height when collapsed by a provided [scrollBehavior]. This
- * value must be specified and finite, otherwise it will be ignored and replaced with
- * [TopAppBarDefaults.MediumAppBarCollapsedHeight].
+ *   value must be specified and finite, otherwise it will be ignored and replaced with
+ *   [TopAppBarDefaults.MediumAppBarCollapsedHeight].
  * @param expandedHeight this app bar's maximum height. When a specified [scrollBehavior] causes the
- * app bar to collapse or expand, this value will represent the maximum height that the app-bar will
- * be allowed to expand. The expanded height is expected to be greater or equal to the
- * [collapsedHeight], and the function will throw an [IllegalArgumentException] otherwise. Also,
- * this value must be specified and finite, otherwise it will be ignored and replaced with
- * [TopAppBarDefaults.MediumAppBarExpandedHeight].
+ *   app bar to collapse or expand, this value will represent the maximum height that the app-bar
+ *   will be allowed to expand. The expanded height is expected to be greater or equal to the
+ *   [collapsedHeight], and the function will throw an [IllegalArgumentException] otherwise. Also,
+ *   this value must be specified and finite, otherwise it will be ignored and replaced with
+ *   [TopAppBarDefaults.MediumAppBarExpandedHeight].
  * @param windowInsets a window insets that app bar will respect.
- * @param colors [TopAppBarColors] that will be used to resolve the colors used for this top app
- * bar in different states. See [TopAppBarDefaults.mediumTopAppBarColors].
+ * @param colors [TopAppBarColors] that will be used to resolve the colors used for this top app bar
+ *   in different states. See [TopAppBarDefaults.mediumTopAppBarColors].
  * @param scrollBehavior a [TopAppBarScrollBehavior] which holds various offset values that will be
- * applied by this top app bar to set up its height and colors. A scroll behavior is designed to
- * work in conjunction with a scrolled content to change the top app bar appearance as the content
- * scrolls. See [TopAppBarScrollBehavior.nestedScrollConnection].
+ *   applied by this top app bar to set up its height and colors. A scroll behavior is designed to
+ *   work in conjunction with a scrolled content to change the top app bar appearance as the content
+ *   scrolls. See [TopAppBarScrollBehavior.nestedScrollConnection].
  * @throws IllegalArgumentException if the provided [expandedHeight] is smaller than the
- * [collapsedHeight]
+ *   [collapsedHeight]
  */
 @ExperimentalMaterial3Api
 @Composable
@@ -436,63 +466,70 @@
     windowInsets: WindowInsets = TopAppBarDefaults.windowInsets,
     colors: TopAppBarColors = TopAppBarDefaults.mediumTopAppBarColors(),
     scrollBehavior: TopAppBarScrollBehavior? = null
-) = TwoRowsTopAppBar(
-    modifier = modifier,
-    title = title,
-    titleTextStyle = TopAppBarMediumTokens.HeadlineFont.value,
-    smallTitleTextStyle = TopAppBarSmallTokens.HeadlineFont.value,
-    titleBottomPadding = MediumTitleBottomPadding,
-    smallTitle = title,
-    navigationIcon = navigationIcon,
-    actions = actions,
-    collapsedHeight = if (collapsedHeight == Dp.Unspecified || collapsedHeight == Dp.Infinity) {
-        TopAppBarDefaults.MediumAppBarCollapsedHeight
-    } else {
-        collapsedHeight
-    },
-    expandedHeight = if (expandedHeight == Dp.Unspecified || expandedHeight == Dp.Infinity) {
-        TopAppBarDefaults.MediumAppBarExpandedHeight
-    } else {
-        expandedHeight
-    },
-    windowInsets = windowInsets,
-    colors = colors,
-    scrollBehavior = scrollBehavior
-)
+) =
+    TwoRowsTopAppBar(
+        modifier = modifier,
+        title = title,
+        titleTextStyle = TopAppBarMediumTokens.HeadlineFont.value,
+        smallTitleTextStyle = TopAppBarSmallTokens.HeadlineFont.value,
+        titleBottomPadding = MediumTitleBottomPadding,
+        smallTitle = title,
+        navigationIcon = navigationIcon,
+        actions = actions,
+        collapsedHeight =
+            if (collapsedHeight == Dp.Unspecified || collapsedHeight == Dp.Infinity) {
+                TopAppBarDefaults.MediumAppBarCollapsedHeight
+            } else {
+                collapsedHeight
+            },
+        expandedHeight =
+            if (expandedHeight == Dp.Unspecified || expandedHeight == Dp.Infinity) {
+                TopAppBarDefaults.MediumAppBarExpandedHeight
+            } else {
+                expandedHeight
+            },
+        windowInsets = windowInsets,
+        colors = colors,
+        scrollBehavior = scrollBehavior
+    )
 
 /**
- * <a href="https://m3.material.io/components/top-app-bar/overview" class="external" target="_blank">Material Design large top app bar</a>.
+ * <a href="https://m3.material.io/components/top-app-bar/overview" class="external"
+ * target="_blank">Material Design large top app bar</a>.
  *
  * Top app bars display information and actions at the top of a screen.
  *
- * ![Large top app bar image](https://developer.android.com/images/reference/androidx/compose/material3/large-top-app-bar.png)
+ * ![Large top app bar
+ * image](https://developer.android.com/images/reference/androidx/compose/material3/large-top-app-bar.png)
  *
  * This LargeTopAppBar has slots for a title, navigation icon, and actions. In its default expanded
  * state, the title is displayed in a second row under the navigation and actions.
  *
  * A large top app bar that uses a [scrollBehavior] to customize its nested scrolling behavior when
  * working in conjunction with scrolling content looks like:
+ *
  * @sample androidx.compose.material3.samples.ExitUntilCollapsedLargeTopAppBar
  *
  * @param title the title to be displayed in the top app bar. This title will be used in the app
- * bar's expanded and collapsed states, although in its collapsed state it will be composed with a
- * smaller sized [TextStyle]
+ *   bar's expanded and collapsed states, although in its collapsed state it will be composed with a
+ *   smaller sized [TextStyle]
  * @param modifier the [Modifier] to be applied to this top app bar
  * @param navigationIcon the navigation icon displayed at the start of the top app bar. This should
- * typically be an [IconButton] or [IconToggleButton].
+ *   typically be an [IconButton] or [IconToggleButton].
  * @param actions the actions displayed at the end of the top app bar. This should typically be
- * [IconButton]s. The default layout here is a [Row], so icons inside will be placed horizontally.
+ *   [IconButton]s. The default layout here is a [Row], so icons inside will be placed horizontally.
  * @param windowInsets a window insets that app bar will respect.
- * @param colors [TopAppBarColors] that will be used to resolve the colors used for this top app
- * bar in different states. See [TopAppBarDefaults.largeTopAppBarColors].
+ * @param colors [TopAppBarColors] that will be used to resolve the colors used for this top app bar
+ *   in different states. See [TopAppBarDefaults.largeTopAppBarColors].
  * @param scrollBehavior a [TopAppBarScrollBehavior] which holds various offset values that will be
- * applied by this top app bar to set up its height and colors. A scroll behavior is designed to
- * work in conjunction with a scrolled content to change the top app bar appearance as the content
- * scrolls. See [TopAppBarScrollBehavior.nestedScrollConnection].
+ *   applied by this top app bar to set up its height and colors. A scroll behavior is designed to
+ *   work in conjunction with a scrolled content to change the top app bar appearance as the content
+ *   scrolls. See [TopAppBarScrollBehavior.nestedScrollConnection].
  */
 @Deprecated(
-    message = "Deprecated in favor of LargeTopAppBar with collapsedHeight and expandedHeight " +
-        "parameters",
+    message =
+        "Deprecated in favor of LargeTopAppBar with collapsedHeight and expandedHeight " +
+            "parameters",
     level = DeprecationLevel.HIDDEN
 )
 @ExperimentalMaterial3Api
@@ -505,58 +542,62 @@
     windowInsets: WindowInsets = TopAppBarDefaults.windowInsets,
     colors: TopAppBarColors = TopAppBarDefaults.largeTopAppBarColors(),
     scrollBehavior: TopAppBarScrollBehavior? = null
-) = LargeTopAppBar(
-    title = title,
-    modifier = modifier,
-    navigationIcon = navigationIcon,
-    actions = actions,
-    collapsedHeight = TopAppBarDefaults.LargeAppBarCollapsedHeight,
-    expandedHeight = TopAppBarDefaults.LargeAppBarExpandedHeight,
-    windowInsets = windowInsets,
-    colors = colors,
-    scrollBehavior = scrollBehavior
-)
+) =
+    LargeTopAppBar(
+        title = title,
+        modifier = modifier,
+        navigationIcon = navigationIcon,
+        actions = actions,
+        collapsedHeight = TopAppBarDefaults.LargeAppBarCollapsedHeight,
+        expandedHeight = TopAppBarDefaults.LargeAppBarExpandedHeight,
+        windowInsets = windowInsets,
+        colors = colors,
+        scrollBehavior = scrollBehavior
+    )
 
 /**
- * <a href="https://m3.material.io/components/top-app-bar/overview" class="external" target="_blank">Material Design large top app bar</a>.
+ * <a href="https://m3.material.io/components/top-app-bar/overview" class="external"
+ * target="_blank">Material Design large top app bar</a>.
  *
  * Top app bars display information and actions at the top of a screen.
  *
- * ![Large top app bar image](https://developer.android.com/images/reference/androidx/compose/material3/large-top-app-bar.png)
+ * ![Large top app bar
+ * image](https://developer.android.com/images/reference/androidx/compose/material3/large-top-app-bar.png)
  *
  * This LargeTopAppBar has slots for a title, navigation icon, and actions. In its default expanded
  * state, the title is displayed in a second row under the navigation and actions.
  *
  * A large top app bar that uses a [scrollBehavior] to customize its nested scrolling behavior when
  * working in conjunction with scrolling content looks like:
+ *
  * @sample androidx.compose.material3.samples.ExitUntilCollapsedLargeTopAppBar
  *
  * @param title the title to be displayed in the top app bar. This title will be used in the app
- * bar's expanded and collapsed states, although in its collapsed state it will be composed with a
- * smaller sized [TextStyle]
+ *   bar's expanded and collapsed states, although in its collapsed state it will be composed with a
+ *   smaller sized [TextStyle]
  * @param modifier the [Modifier] to be applied to this top app bar
  * @param navigationIcon the navigation icon displayed at the start of the top app bar. This should
- * typically be an [IconButton] or [IconToggleButton].
+ *   typically be an [IconButton] or [IconToggleButton].
  * @param actions the actions displayed at the end of the top app bar. This should typically be
- * [IconButton]s. The default layout here is a [Row], so icons inside will be placed horizontally.
+ *   [IconButton]s. The default layout here is a [Row], so icons inside will be placed horizontally.
  * @param collapsedHeight this app bar height when collapsed by a provided [scrollBehavior]. This
- * value must be specified and finite, otherwise it will be ignored and replaced with
- * [TopAppBarDefaults.LargeAppBarCollapsedHeight].
+ *   value must be specified and finite, otherwise it will be ignored and replaced with
+ *   [TopAppBarDefaults.LargeAppBarCollapsedHeight].
  * @param expandedHeight this app bar's maximum height. When a specified [scrollBehavior] causes the
- * app bar to collapse or expand, this value will represent the maximum height that the app-bar will
- * be allowed to expand. The expanded height is expected to be greater or equal to the
- * [collapsedHeight], and the function will throw an [IllegalArgumentException] otherwise. Also,
- * this value must be specified and finite, otherwise it will be ignored and replaced with
- * [TopAppBarDefaults.LargeAppBarExpandedHeight].
+ *   app bar to collapse or expand, this value will represent the maximum height that the app-bar
+ *   will be allowed to expand. The expanded height is expected to be greater or equal to the
+ *   [collapsedHeight], and the function will throw an [IllegalArgumentException] otherwise. Also,
+ *   this value must be specified and finite, otherwise it will be ignored and replaced with
+ *   [TopAppBarDefaults.LargeAppBarExpandedHeight].
  * @param windowInsets a window insets that app bar will respect.
- * @param colors [TopAppBarColors] that will be used to resolve the colors used for this top app
- * bar in different states. See [TopAppBarDefaults.largeTopAppBarColors].
+ * @param colors [TopAppBarColors] that will be used to resolve the colors used for this top app bar
+ *   in different states. See [TopAppBarDefaults.largeTopAppBarColors].
  * @param scrollBehavior a [TopAppBarScrollBehavior] which holds various offset values that will be
- * applied by this top app bar to set up its height and colors. A scroll behavior is designed to
- * work in conjunction with a scrolled content to change the top app bar appearance as the content
- * scrolls. See [TopAppBarScrollBehavior.nestedScrollConnection].
+ *   applied by this top app bar to set up its height and colors. A scroll behavior is designed to
+ *   work in conjunction with a scrolled content to change the top app bar appearance as the content
+ *   scrolls. See [TopAppBarScrollBehavior.nestedScrollConnection].
  * @throws IllegalArgumentException if the provided [expandedHeight] is smaller to the
- * [collapsedHeight]
+ *   [collapsedHeight]
  */
 @ExperimentalMaterial3Api
 @Composable
@@ -570,36 +611,41 @@
     windowInsets: WindowInsets = TopAppBarDefaults.windowInsets,
     colors: TopAppBarColors = TopAppBarDefaults.largeTopAppBarColors(),
     scrollBehavior: TopAppBarScrollBehavior? = null
-) = TwoRowsTopAppBar(
-    title = title,
-    titleTextStyle = TopAppBarLargeTokens.HeadlineFont.value,
-    smallTitleTextStyle = TopAppBarSmallTokens.HeadlineFont.value,
-    titleBottomPadding = LargeTitleBottomPadding,
-    smallTitle = title,
-    modifier = modifier,
-    navigationIcon = navigationIcon,
-    actions = actions,
-    collapsedHeight = if (collapsedHeight == Dp.Unspecified || collapsedHeight == Dp.Infinity) {
-        TopAppBarDefaults.LargeAppBarCollapsedHeight
-    } else {
-        collapsedHeight
-    },
-    expandedHeight = if (expandedHeight == Dp.Unspecified || expandedHeight == Dp.Infinity) {
-        TopAppBarDefaults.LargeAppBarExpandedHeight
-    } else {
-        expandedHeight
-    },
-    windowInsets = windowInsets,
-    colors = colors,
-    scrollBehavior = scrollBehavior
-)
+) =
+    TwoRowsTopAppBar(
+        title = title,
+        titleTextStyle = TopAppBarLargeTokens.HeadlineFont.value,
+        smallTitleTextStyle = TopAppBarSmallTokens.HeadlineFont.value,
+        titleBottomPadding = LargeTitleBottomPadding,
+        smallTitle = title,
+        modifier = modifier,
+        navigationIcon = navigationIcon,
+        actions = actions,
+        collapsedHeight =
+            if (collapsedHeight == Dp.Unspecified || collapsedHeight == Dp.Infinity) {
+                TopAppBarDefaults.LargeAppBarCollapsedHeight
+            } else {
+                collapsedHeight
+            },
+        expandedHeight =
+            if (expandedHeight == Dp.Unspecified || expandedHeight == Dp.Infinity) {
+                TopAppBarDefaults.LargeAppBarExpandedHeight
+            } else {
+                expandedHeight
+            },
+        windowInsets = windowInsets,
+        colors = colors,
+        scrollBehavior = scrollBehavior
+    )
 
 /**
- * <a href="https://m3.material.io/components/bottom-app-bar/overview" class="external" target="_blank">Material Design bottom app bar</a>.
+ * <a href="https://m3.material.io/components/bottom-app-bar/overview" class="external"
+ * target="_blank">Material Design bottom app bar</a>.
  *
  * A bottom app bar displays navigation and key actions at the bottom of mobile screens.
  *
- * ![Bottom app bar image](https://developer.android.com/images/reference/androidx/compose/material3/bottom-app-bar.png)
+ * ![Bottom app bar
+ * image](https://developer.android.com/images/reference/androidx/compose/material3/bottom-app-bar.png)
  *
  * @sample androidx.compose.material3.samples.SimpleBottomAppBar
  *
@@ -609,18 +655,18 @@
  *
  * Also see [NavigationBar].
  *
- * @param actions the icon content of this BottomAppBar. The default layout here is a [Row],
- * so content inside will be placed horizontally.
+ * @param actions the icon content of this BottomAppBar. The default layout here is a [Row], so
+ *   content inside will be placed horizontally.
  * @param modifier the [Modifier] to be applied to this BottomAppBar
  * @param floatingActionButton optional floating action button at the end of this BottomAppBar
  * @param containerColor the color used for the background of this BottomAppBar. Use
- * [Color.Transparent] to have no color.
+ *   [Color.Transparent] to have no color.
  * @param contentColor the preferred color for content inside this BottomAppBar. Defaults to either
- * the matching content color for [containerColor], or to the current [LocalContentColor] if
- * [containerColor] is not a color from the theme.
+ *   the matching content color for [containerColor], or to the current [LocalContentColor] if
+ *   [containerColor] is not a color from the theme.
  * @param tonalElevation when [containerColor] is [ColorScheme.surface], a translucent primary color
- * overlay is applied on top of the container. A higher tonal elevation value will result in a
- * darker color in light theme and lighter color in dark theme. See also: [Surface].
+ *   overlay is applied on top of the container. A higher tonal elevation value will result in a
+ *   darker color in light theme and lighter color in dark theme. See also: [Surface].
  * @param contentPadding the padding applied to the content of this BottomAppBar
  * @param windowInsets a window insets that app bar will respect.
  */
@@ -635,24 +681,27 @@
     tonalElevation: Dp = BottomAppBarDefaults.ContainerElevation,
     contentPadding: PaddingValues = BottomAppBarDefaults.ContentPadding,
     windowInsets: WindowInsets = BottomAppBarDefaults.windowInsets,
-) = BottomAppBar(
-    actions = actions,
-    modifier = modifier,
-    floatingActionButton = floatingActionButton,
-    containerColor = containerColor,
-    contentColor = contentColor,
-    tonalElevation = tonalElevation,
-    contentPadding = contentPadding,
-    windowInsets = windowInsets,
-    scrollBehavior = null
-)
+) =
+    BottomAppBar(
+        actions = actions,
+        modifier = modifier,
+        floatingActionButton = floatingActionButton,
+        containerColor = containerColor,
+        contentColor = contentColor,
+        tonalElevation = tonalElevation,
+        contentPadding = contentPadding,
+        windowInsets = windowInsets,
+        scrollBehavior = null
+    )
 
 /**
- * <a href="https://m3.material.io/components/bottom-app-bar/overview" class="external" target="_blank">Material Design bottom app bar</a>.
+ * <a href="https://m3.material.io/components/bottom-app-bar/overview" class="external"
+ * target="_blank">Material Design bottom app bar</a>.
  *
  * A bottom app bar displays navigation and key actions at the bottom of mobile screens.
  *
- * ![Bottom app bar image](https://developer.android.com/images/reference/androidx/compose/material3/bottom-app-bar.png)
+ * ![Bottom app bar
+ * image](https://developer.android.com/images/reference/androidx/compose/material3/bottom-app-bar.png)
  *
  * @sample androidx.compose.material3.samples.SimpleBottomAppBar
  *
@@ -667,24 +716,24 @@
  *
  * Also see [NavigationBar].
  *
- * @param actions the icon content of this BottomAppBar. The default layout here is a [Row],
- * so content inside will be placed horizontally.
+ * @param actions the icon content of this BottomAppBar. The default layout here is a [Row], so
+ *   content inside will be placed horizontally.
  * @param modifier the [Modifier] to be applied to this BottomAppBar
  * @param floatingActionButton optional floating action button at the end of this BottomAppBar
  * @param containerColor the color used for the background of this BottomAppBar. Use
- * [Color.Transparent] to have no color.
+ *   [Color.Transparent] to have no color.
  * @param contentColor the preferred color for content inside this BottomAppBar. Defaults to either
- * the matching content color for [containerColor], or to the current [LocalContentColor] if
- * [containerColor] is not a color from the theme.
+ *   the matching content color for [containerColor], or to the current [LocalContentColor] if
+ *   [containerColor] is not a color from the theme.
  * @param tonalElevation when [containerColor] is [ColorScheme.surface], a translucent primary color
- * overlay is applied on top of the container. A higher tonal elevation value will result in a
- * darker color in light theme and lighter color in dark theme. See also: [Surface].
+ *   overlay is applied on top of the container. A higher tonal elevation value will result in a
+ *   darker color in light theme and lighter color in dark theme. See also: [Surface].
  * @param contentPadding the padding applied to the content of this BottomAppBar
  * @param windowInsets a window insets that app bar will respect.
  * @param scrollBehavior a [BottomAppBarScrollBehavior] which holds various offset values that will
- * be applied by this bottom app bar to set up its height. A scroll behavior is designed to
- * work in conjunction with a scrolled content to change the bottom app bar appearance as the
- * content scrolls. See [BottomAppBarScrollBehavior.nestedScrollConnection].
+ *   be applied by this bottom app bar to set up its height. A scroll behavior is designed to work
+ *   in conjunction with a scrolled content to change the bottom app bar appearance as the content
+ *   scrolls. See [BottomAppBarScrollBehavior.nestedScrollConnection].
  */
 @ExperimentalMaterial3Api
 @Composable
@@ -698,42 +747,41 @@
     contentPadding: PaddingValues = BottomAppBarDefaults.ContentPadding,
     windowInsets: WindowInsets = BottomAppBarDefaults.windowInsets,
     scrollBehavior: BottomAppBarScrollBehavior? = null,
-) = BottomAppBar(
-    modifier = modifier,
-    containerColor = containerColor,
-    contentColor = contentColor,
-    tonalElevation = tonalElevation,
-    windowInsets = windowInsets,
-    contentPadding = contentPadding,
-    scrollBehavior = scrollBehavior
-) {
-    Row(
-        modifier = Modifier.weight(1f),
-        horizontalArrangement = Arrangement.Start,
-        verticalAlignment = Alignment.CenterVertically,
-        content = actions,
-    )
-    if (floatingActionButton != null) {
-        Box(
-            Modifier
-                .fillMaxHeight()
-                .padding(
-                    top = FABVerticalPadding,
-                    end = FABHorizontalPadding
-                ),
-            contentAlignment = Alignment.TopStart
-        ) {
-            floatingActionButton()
+) =
+    BottomAppBar(
+        modifier = modifier,
+        containerColor = containerColor,
+        contentColor = contentColor,
+        tonalElevation = tonalElevation,
+        windowInsets = windowInsets,
+        contentPadding = contentPadding,
+        scrollBehavior = scrollBehavior
+    ) {
+        Row(
+            modifier = Modifier.weight(1f),
+            horizontalArrangement = Arrangement.Start,
+            verticalAlignment = Alignment.CenterVertically,
+            content = actions,
+        )
+        if (floatingActionButton != null) {
+            Box(
+                Modifier.fillMaxHeight()
+                    .padding(top = FABVerticalPadding, end = FABHorizontalPadding),
+                contentAlignment = Alignment.TopStart
+            ) {
+                floatingActionButton()
+            }
         }
     }
-}
 
 /**
- * <a href="https://m3.material.io/components/bottom-app-bar/overview" class="external" target="_blank">Material Design bottom app bar</a>.
+ * <a href="https://m3.material.io/components/bottom-app-bar/overview" class="external"
+ * target="_blank">Material Design bottom app bar</a>.
  *
  * A bottom app bar displays navigation and key actions at the bottom of mobile screens.
  *
- * ![Bottom app bar image](https://developer.android.com/images/reference/androidx/compose/material3/bottom-app-bar.png)
+ * ![Bottom app bar
+ * image](https://developer.android.com/images/reference/androidx/compose/material3/bottom-app-bar.png)
  *
  * If you are interested in displaying a [FloatingActionButton], consider using another overload.
  *
@@ -741,17 +789,17 @@
  *
  * @param modifier the [Modifier] to be applied to this BottomAppBar
  * @param containerColor the color used for the background of this BottomAppBar. Use
- * [Color.Transparent] to have no color.
+ *   [Color.Transparent] to have no color.
  * @param contentColor the preferred color for content inside this BottomAppBar. Defaults to either
- * the matching content color for [containerColor], or to the current [LocalContentColor] if
- * [containerColor] is not a color from the theme.
+ *   the matching content color for [containerColor], or to the current [LocalContentColor] if
+ *   [containerColor] is not a color from the theme.
  * @param tonalElevation when [containerColor] is [ColorScheme.surface], a translucent primary color
- * overlay is applied on top of the container. A higher tonal elevation value will result in a
- * darker color in light theme and lighter color in dark theme. See also: [Surface].
+ *   overlay is applied on top of the container. A higher tonal elevation value will result in a
+ *   darker color in light theme and lighter color in dark theme. See also: [Surface].
  * @param contentPadding the padding applied to the content of this BottomAppBar
  * @param windowInsets a window insets that app bar will respect.
- * @param content the content of this BottomAppBar. The default layout here is a [Row],
- * so content inside will be placed horizontally.
+ * @param content the content of this BottomAppBar. The default layout here is a [Row], so content
+ *   inside will be placed horizontally.
  */
 @OptIn(ExperimentalMaterial3Api::class)
 @Composable
@@ -763,23 +811,26 @@
     contentPadding: PaddingValues = BottomAppBarDefaults.ContentPadding,
     windowInsets: WindowInsets = BottomAppBarDefaults.windowInsets,
     content: @Composable RowScope.() -> Unit
-) = BottomAppBar(
-    modifier = modifier,
-    containerColor = containerColor,
-    contentColor = contentColor,
-    tonalElevation = tonalElevation,
-    contentPadding = contentPadding,
-    windowInsets = windowInsets,
-    scrollBehavior = null,
-    content = content
-)
+) =
+    BottomAppBar(
+        modifier = modifier,
+        containerColor = containerColor,
+        contentColor = contentColor,
+        tonalElevation = tonalElevation,
+        contentPadding = contentPadding,
+        windowInsets = windowInsets,
+        scrollBehavior = null,
+        content = content
+    )
 
 /**
- * <a href="https://m3.material.io/components/bottom-app-bar/overview" class="external" target="_blank">Material Design bottom app bar</a>.
+ * <a href="https://m3.material.io/components/bottom-app-bar/overview" class="external"
+ * target="_blank">Material Design bottom app bar</a>.
  *
  * A bottom app bar displays navigation and key actions at the bottom of mobile screens.
  *
- * ![Bottom app bar image](https://developer.android.com/images/reference/androidx/compose/material3/bottom-app-bar.png)
+ * ![Bottom app bar
+ * image](https://developer.android.com/images/reference/androidx/compose/material3/bottom-app-bar.png)
  *
  * If you are interested in displaying a [FloatingActionButton], consider using another overload.
  *
@@ -787,21 +838,21 @@
  *
  * @param modifier the [Modifier] to be applied to this BottomAppBar
  * @param containerColor the color used for the background of this BottomAppBar. Use
- * [Color.Transparent] to have no color.
+ *   [Color.Transparent] to have no color.
  * @param contentColor the preferred color for content inside this BottomAppBar. Defaults to either
- * the matching content color for [containerColor], or to the current [LocalContentColor] if
- * [containerColor] is not a color from the theme.
+ *   the matching content color for [containerColor], or to the current [LocalContentColor] if
+ *   [containerColor] is not a color from the theme.
  * @param tonalElevation when [containerColor] is [ColorScheme.surface], a translucent primary color
- * overlay is applied on top of the container. A higher tonal elevation value will result in a
- * darker color in light theme and lighter color in dark theme. See also: [Surface].
+ *   overlay is applied on top of the container. A higher tonal elevation value will result in a
+ *   darker color in light theme and lighter color in dark theme. See also: [Surface].
  * @param contentPadding the padding applied to the content of this BottomAppBar
  * @param windowInsets a window insets that app bar will respect.
  * @param scrollBehavior a [BottomAppBarScrollBehavior] which holds various offset values that will
- * be applied by this bottom app bar to set up its height. A scroll behavior is designed to
- * work in conjunction with a scrolled content to change the bottom app bar appearance as the
- * content scrolls. See [BottomAppBarScrollBehavior.nestedScrollConnection].
- * @param content the content of this BottomAppBar. The default layout here is a [Row],
- * so content inside will be placed horizontally.
+ *   be applied by this bottom app bar to set up its height. A scroll behavior is designed to work
+ *   in conjunction with a scrolled content to change the bottom app bar appearance as the content
+ *   scrolls. See [BottomAppBarScrollBehavior.nestedScrollConnection].
+ * @param content the content of this BottomAppBar. The default layout here is a [Row], so content
+ *   inside will be placed horizontally.
  */
 @ExperimentalMaterial3Api
 @Composable
@@ -816,24 +867,24 @@
     content: @Composable RowScope.() -> Unit
 ) {
     // Set up support for resizing the bottom app bar when vertically dragging the bar itself.
-    val appBarDragModifier = if (scrollBehavior != null && !scrollBehavior.isPinned) {
-        Modifier.draggable(
-            orientation = Orientation.Vertical,
-            state = rememberDraggableState { delta ->
-                scrollBehavior.state.heightOffset -= delta
-            },
-            onDragStopped = { velocity ->
-                settleAppBarBottom(
-                    scrollBehavior.state,
-                    velocity,
-                    scrollBehavior.flingAnimationSpec,
-                    scrollBehavior.snapAnimationSpec
-                )
-            }
-        )
-    } else {
-        Modifier
-    }
+    val appBarDragModifier =
+        if (scrollBehavior != null && !scrollBehavior.isPinned) {
+            Modifier.draggable(
+                orientation = Orientation.Vertical,
+                state =
+                    rememberDraggableState { delta -> scrollBehavior.state.heightOffset -= delta },
+                onDragStopped = { velocity ->
+                    settleAppBarBottom(
+                        scrollBehavior.state,
+                        velocity,
+                        scrollBehavior.flingAnimationSpec,
+                        scrollBehavior.snapAnimationSpec
+                    )
+                }
+            )
+        } else {
+            Modifier
+        }
 
     // Compose a Surface with a Row content.
     // The height of the app bar is determined by subtracting the bar's height offset from the
@@ -844,24 +895,23 @@
         tonalElevation = tonalElevation,
         // TODO(b/209583788): Consider adding a shape parameter if updated design guidance allows
         shape = BottomAppBarTokens.ContainerShape.value,
-        modifier = modifier
-            .layout { measurable, constraints ->
-                // Sets the app bar's height offset to collapse the entire bar's height when content
-                // is scrolled.
-                scrollBehavior?.state?.heightOffsetLimit =
-                    -BottomAppBarTokens.ContainerHeight.toPx()
+        modifier =
+            modifier
+                .layout { measurable, constraints ->
+                    // Sets the app bar's height offset to collapse the entire bar's height when
+                    // content
+                    // is scrolled.
+                    scrollBehavior?.state?.heightOffsetLimit =
+                        -BottomAppBarTokens.ContainerHeight.toPx()
 
-                val placeable = measurable.measure(constraints)
-                val height = placeable.height + (scrollBehavior?.state?.heightOffset ?: 0f)
-                layout(placeable.width, height.roundToInt()) {
-                    placeable.place(0, 0)
+                    val placeable = measurable.measure(constraints)
+                    val height = placeable.height + (scrollBehavior?.state?.heightOffset ?: 0f)
+                    layout(placeable.width, height.roundToInt()) { placeable.place(0, 0) }
                 }
-            }
-            .then(appBarDragModifier)
+                .then(appBarDragModifier)
     ) {
         Row(
-            Modifier
-                .fillMaxWidth()
+            Modifier.fillMaxWidth()
                 .windowInsetsPadding(windowInsets)
                 .height(BottomAppBarTokens.ContainerHeight)
                 .padding(contentPadding),
@@ -925,9 +975,7 @@
      * Creates a [TopAppBarColors] for small [TopAppBar]. The default implementation animates
      * between the provided colors according to the Material Design specification.
      */
-
-    @Composable
-    fun topAppBarColors() = MaterialTheme.colorScheme.defaultTopAppBarColors
+    @Composable fun topAppBarColors() = MaterialTheme.colorScheme.defaultTopAppBarColors
 
     /**
      * Creates a [TopAppBarColors] for small [TopAppBar]. The default implementation animates
@@ -947,40 +995,42 @@
         navigationIconContentColor: Color = Color.Unspecified,
         titleContentColor: Color = Color.Unspecified,
         actionIconContentColor: Color = Color.Unspecified,
-    ): TopAppBarColors = MaterialTheme.colorScheme.defaultTopAppBarColors.copy(
-        containerColor,
-        scrolledContainerColor,
-        navigationIconContentColor,
-        titleContentColor,
-        actionIconContentColor
-    )
+    ): TopAppBarColors =
+        MaterialTheme.colorScheme.defaultTopAppBarColors.copy(
+            containerColor,
+            scrolledContainerColor,
+            navigationIconContentColor,
+            titleContentColor,
+            actionIconContentColor
+        )
 
     internal val ColorScheme.defaultTopAppBarColors: TopAppBarColors
         get() {
-            return defaultTopAppBarColorsCached ?: TopAppBarColors(
-                containerColor = fromToken(TopAppBarSmallTokens.ContainerColor),
-                scrolledContainerColor = fromToken(TopAppBarSmallTokens.OnScrollContainerColor),
-                navigationIconContentColor = fromToken(TopAppBarSmallTokens.LeadingIconColor),
-                titleContentColor = fromToken(TopAppBarSmallTokens.HeadlineColor),
-                actionIconContentColor = fromToken(TopAppBarSmallTokens.TrailingIconColor),
-            ).also {
-                defaultTopAppBarColorsCached = it
-            }
+            return defaultTopAppBarColorsCached
+                ?: TopAppBarColors(
+                        containerColor = fromToken(TopAppBarSmallTokens.ContainerColor),
+                        scrolledContainerColor =
+                            fromToken(TopAppBarSmallTokens.OnScrollContainerColor),
+                        navigationIconContentColor =
+                            fromToken(TopAppBarSmallTokens.LeadingIconColor),
+                        titleContentColor = fromToken(TopAppBarSmallTokens.HeadlineColor),
+                        actionIconContentColor = fromToken(TopAppBarSmallTokens.TrailingIconColor),
+                    )
+                    .also { defaultTopAppBarColorsCached = it }
         }
 
-    /**
-     * Default insets to be used and consumed by the top app bars
-     */
+    /** Default insets to be used and consumed by the top app bars */
     val windowInsets: WindowInsets
         @Composable
-        get() = WindowInsets.systemBarsForVisualComponents
-            .only(WindowInsetsSides.Horizontal + WindowInsetsSides.Top)
+        get() =
+            WindowInsets.systemBarsForVisualComponents.only(
+                WindowInsetsSides.Horizontal + WindowInsetsSides.Top
+            )
 
     /**
      * Creates a [TopAppBarColors] for [CenterAlignedTopAppBar]s. The default implementation
      * animates between the provided colors according to the Material Design specification.
      */
-
     @Composable
     fun centerAlignedTopAppBarColors() =
         MaterialTheme.colorScheme.defaultCenterAlignedTopAppBarColors
@@ -1003,29 +1053,29 @@
         navigationIconContentColor: Color = Color.Unspecified,
         titleContentColor: Color = Color.Unspecified,
         actionIconContentColor: Color = Color.Unspecified,
-    ): TopAppBarColors = MaterialTheme.colorScheme.defaultCenterAlignedTopAppBarColors.copy(
-        containerColor,
-        scrolledContainerColor,
-        navigationIconContentColor,
-        titleContentColor,
-        actionIconContentColor
-    )
+    ): TopAppBarColors =
+        MaterialTheme.colorScheme.defaultCenterAlignedTopAppBarColors.copy(
+            containerColor,
+            scrolledContainerColor,
+            navigationIconContentColor,
+            titleContentColor,
+            actionIconContentColor
+        )
 
     internal val ColorScheme.defaultCenterAlignedTopAppBarColors: TopAppBarColors
         get() {
-            return defaultCenterAlignedTopAppBarColorsCached ?: TopAppBarColors(
-                containerColor = fromToken(TopAppBarSmallCenteredTokens.ContainerColor),
-                scrolledContainerColor = fromToken(
-                    TopAppBarSmallCenteredTokens.OnScrollContainerColor
-                ),
-                navigationIconContentColor = fromToken(
-                    TopAppBarSmallCenteredTokens.LeadingIconColor
-                ),
-                titleContentColor = fromToken(TopAppBarSmallCenteredTokens.HeadlineColor),
-                actionIconContentColor = fromToken(TopAppBarSmallCenteredTokens.TrailingIconColor),
-            ).also {
-                defaultCenterAlignedTopAppBarColorsCached = it
-            }
+            return defaultCenterAlignedTopAppBarColorsCached
+                ?: TopAppBarColors(
+                        containerColor = fromToken(TopAppBarSmallCenteredTokens.ContainerColor),
+                        scrolledContainerColor =
+                            fromToken(TopAppBarSmallCenteredTokens.OnScrollContainerColor),
+                        navigationIconContentColor =
+                            fromToken(TopAppBarSmallCenteredTokens.LeadingIconColor),
+                        titleContentColor = fromToken(TopAppBarSmallCenteredTokens.HeadlineColor),
+                        actionIconContentColor =
+                            fromToken(TopAppBarSmallCenteredTokens.TrailingIconColor),
+                    )
+                    .also { defaultCenterAlignedTopAppBarColorsCached = it }
         }
 
     /**
@@ -1033,8 +1083,7 @@
      * between the provided colors as the top app bar scrolls according to the Material Design
      * specification.
      */
-    @Composable
-    fun mediumTopAppBarColors() = MaterialTheme.colorScheme.defaultMediumTopAppBarColors
+    @Composable fun mediumTopAppBarColors() = MaterialTheme.colorScheme.defaultMediumTopAppBarColors
 
     /**
      * Creates a [TopAppBarColors] for [MediumTopAppBar]s. The default implementation interpolates
@@ -1055,25 +1104,28 @@
         navigationIconContentColor: Color = Color.Unspecified,
         titleContentColor: Color = Color.Unspecified,
         actionIconContentColor: Color = Color.Unspecified,
-    ): TopAppBarColors = MaterialTheme.colorScheme.defaultMediumTopAppBarColors.copy(
-        containerColor,
-        scrolledContainerColor,
-        navigationIconContentColor,
-        titleContentColor,
-        actionIconContentColor
-    )
+    ): TopAppBarColors =
+        MaterialTheme.colorScheme.defaultMediumTopAppBarColors.copy(
+            containerColor,
+            scrolledContainerColor,
+            navigationIconContentColor,
+            titleContentColor,
+            actionIconContentColor
+        )
 
     internal val ColorScheme.defaultMediumTopAppBarColors: TopAppBarColors
         get() {
-            return defaultMediumTopAppBarColorsCached ?: TopAppBarColors(
-                containerColor = fromToken(TopAppBarMediumTokens.ContainerColor),
-                scrolledContainerColor = fromToken(TopAppBarSmallTokens.OnScrollContainerColor),
-                navigationIconContentColor = fromToken(TopAppBarMediumTokens.LeadingIconColor),
-                titleContentColor = fromToken(TopAppBarMediumTokens.HeadlineColor),
-                actionIconContentColor = fromToken(TopAppBarMediumTokens.TrailingIconColor),
-            ).also {
-                defaultMediumTopAppBarColorsCached = it
-            }
+            return defaultMediumTopAppBarColorsCached
+                ?: TopAppBarColors(
+                        containerColor = fromToken(TopAppBarMediumTokens.ContainerColor),
+                        scrolledContainerColor =
+                            fromToken(TopAppBarSmallTokens.OnScrollContainerColor),
+                        navigationIconContentColor =
+                            fromToken(TopAppBarMediumTokens.LeadingIconColor),
+                        titleContentColor = fromToken(TopAppBarMediumTokens.HeadlineColor),
+                        actionIconContentColor = fromToken(TopAppBarMediumTokens.TrailingIconColor),
+                    )
+                    .also { defaultMediumTopAppBarColorsCached = it }
         }
 
     /**
@@ -1081,8 +1133,7 @@
      * between the provided colors as the top app bar scrolls according to the Material Design
      * specification.
      */
-    @Composable
-    fun largeTopAppBarColors() = MaterialTheme.colorScheme.defaultLargeTopAppBarColors
+    @Composable fun largeTopAppBarColors() = MaterialTheme.colorScheme.defaultLargeTopAppBarColors
 
     /**
      * Creates a [TopAppBarColors] for [LargeTopAppBar]s. The default implementation interpolates
@@ -1103,35 +1154,38 @@
         navigationIconContentColor: Color = Color.Unspecified,
         titleContentColor: Color = Color.Unspecified,
         actionIconContentColor: Color = Color.Unspecified,
-    ): TopAppBarColors = MaterialTheme.colorScheme.defaultLargeTopAppBarColors.copy(
-        containerColor,
-        scrolledContainerColor,
-        navigationIconContentColor,
-        titleContentColor,
-        actionIconContentColor
-    )
+    ): TopAppBarColors =
+        MaterialTheme.colorScheme.defaultLargeTopAppBarColors.copy(
+            containerColor,
+            scrolledContainerColor,
+            navigationIconContentColor,
+            titleContentColor,
+            actionIconContentColor
+        )
 
     internal val ColorScheme.defaultLargeTopAppBarColors: TopAppBarColors
         get() {
-            return defaultLargeTopAppBarColorsCached ?: TopAppBarColors(
-                containerColor = fromToken(TopAppBarLargeTokens.ContainerColor),
-                scrolledContainerColor = fromToken(TopAppBarSmallTokens.OnScrollContainerColor),
-                navigationIconContentColor = fromToken(TopAppBarLargeTokens.LeadingIconColor),
-                titleContentColor = fromToken(TopAppBarLargeTokens.HeadlineColor),
-                actionIconContentColor = fromToken(TopAppBarLargeTokens.TrailingIconColor),
-            ).also {
-                defaultLargeTopAppBarColorsCached = it
-            }
+            return defaultLargeTopAppBarColorsCached
+                ?: TopAppBarColors(
+                        containerColor = fromToken(TopAppBarLargeTokens.ContainerColor),
+                        scrolledContainerColor =
+                            fromToken(TopAppBarSmallTokens.OnScrollContainerColor),
+                        navigationIconContentColor =
+                            fromToken(TopAppBarLargeTokens.LeadingIconColor),
+                        titleContentColor = fromToken(TopAppBarLargeTokens.HeadlineColor),
+                        actionIconContentColor = fromToken(TopAppBarLargeTokens.TrailingIconColor),
+                    )
+                    .also { defaultLargeTopAppBarColorsCached = it }
         }
 
     /**
-     * Returns a pinned [TopAppBarScrollBehavior] that tracks nested-scroll callbacks and
-     * updates its [TopAppBarState.contentOffset] accordingly.
+     * Returns a pinned [TopAppBarScrollBehavior] that tracks nested-scroll callbacks and updates
+     * its [TopAppBarState.contentOffset] accordingly.
      *
      * @param state the state object to be used to control or observe the top app bar's scroll
-     * state. See [rememberTopAppBarState] for a state that is remembered across compositions.
+     *   state. See [rememberTopAppBarState] for a state that is remembered across compositions.
      * @param canScroll a callback used to determine whether scroll events are to be handled by this
-     * pinned [TopAppBarScrollBehavior]
+     *   pinned [TopAppBarScrollBehavior]
      */
     @ExperimentalMaterial3Api
     @Composable
@@ -1146,14 +1200,14 @@
      * immediately appear when the content is pulled down.
      *
      * @param state the state object to be used to control or observe the top app bar's scroll
-     * state. See [rememberTopAppBarState] for a state that is remembered across compositions.
-     * @param canScroll a callback used to determine whether scroll events are to be
-     * handled by this [EnterAlwaysScrollBehavior]
+     *   state. See [rememberTopAppBarState] for a state that is remembered across compositions.
+     * @param canScroll a callback used to determine whether scroll events are to be handled by this
+     *   [EnterAlwaysScrollBehavior]
      * @param snapAnimationSpec an optional [AnimationSpec] that defines how the top app bar snaps
-     * to either fully collapsed or fully extended state when a fling or a drag scrolled it into an
-     * intermediate position
+     *   to either fully collapsed or fully extended state when a fling or a drag scrolled it into
+     *   an intermediate position
      * @param flingAnimationSpec an optional [DecayAnimationSpec] that defined how to fling the top
-     * app bar when the user flings the app bar itself, or the content below it
+     *   app bar when the user flings the app bar itself, or the content below it
      */
     @ExperimentalMaterial3Api
     @Composable
@@ -1176,17 +1230,17 @@
      *
      * A top app bar that is set up with this [TopAppBarScrollBehavior] will immediately collapse
      * when the nested content is pulled up, and will expand back the collapsed area when the
-     * content is  pulled all the way down.
+     * content is pulled all the way down.
      *
      * @param state the state object to be used to control or observe the top app bar's scroll
-     * state. See [rememberTopAppBarState] for a state that is remembered across compositions.
-     * @param canScroll a callback used to determine whether scroll events are to be
-     * handled by this [ExitUntilCollapsedScrollBehavior]
+     *   state. See [rememberTopAppBarState] for a state that is remembered across compositions.
+     * @param canScroll a callback used to determine whether scroll events are to be handled by this
+     *   [ExitUntilCollapsedScrollBehavior]
      * @param snapAnimationSpec an optional [AnimationSpec] that defines how the top app bar snaps
-     * to either fully collapsed or fully extended state when a fling or a drag scrolled it into an
-     * intermediate position
+     *   to either fully collapsed or fully extended state when a fling or a drag scrolled it into
+     *   an intermediate position
      * @param flingAnimationSpec an optional [DecayAnimationSpec] that defined how to fling the top
-     * app bar when the user flings the app bar itself, or the content below it
+     *   app bar when the user flings the app bar itself, or the content below it
      */
     @ExperimentalMaterial3Api
     @Composable
@@ -1203,40 +1257,30 @@
             canScroll = canScroll
         )
 
-    /**
-     * The default expanded height of a [TopAppBar] and the [CenterAlignedTopAppBar].
-     */
+    /** The default expanded height of a [TopAppBar] and the [CenterAlignedTopAppBar]. */
     val TopAppBarExpandedHeight: Dp = TopAppBarSmallTokens.ContainerHeight
 
-    /**
-     * The default height of a [MediumTopAppBar] when collapsed by a [TopAppBarScrollBehavior].
-     */
+    /** The default height of a [MediumTopAppBar] when collapsed by a [TopAppBarScrollBehavior]. */
     val MediumAppBarCollapsedHeight: Dp = TopAppBarSmallTokens.ContainerHeight
 
-    /**
-     * The default expanded height of a [MediumTopAppBar].
-     */
+    /** The default expanded height of a [MediumTopAppBar]. */
     val MediumAppBarExpandedHeight: Dp = TopAppBarMediumTokens.ContainerHeight
 
-    /**
-     * The default height of a [LargeTopAppBar] when collapsed by a [TopAppBarScrollBehavior].
-     */
+    /** The default height of a [LargeTopAppBar] when collapsed by a [TopAppBarScrollBehavior]. */
     val LargeAppBarCollapsedHeight: Dp = TopAppBarSmallTokens.ContainerHeight
 
-    /**
-     * The default expanded height of a [LargeTopAppBar].
-     */
+    /** The default expanded height of a [LargeTopAppBar]. */
     val LargeAppBarExpandedHeight: Dp = TopAppBarLargeTokens.ContainerHeight
 }
 
 /**
  * Creates a [TopAppBarState] that is remembered across compositions.
  *
- * @param initialHeightOffsetLimit the initial value for [TopAppBarState.heightOffsetLimit],
- * which represents the pixel limit that a top app bar is allowed to collapse when the scrollable
- * content is scrolled
+ * @param initialHeightOffsetLimit the initial value for [TopAppBarState.heightOffsetLimit], which
+ *   represents the pixel limit that a top app bar is allowed to collapse when the scrollable
+ *   content is scrolled
  * @param initialHeightOffset the initial value for [TopAppBarState.heightOffset]. The initial
- * offset height offset should be between zero and [initialHeightOffsetLimit].
+ *   offset height offset should be between zero and [initialHeightOffsetLimit].
  * @param initialContentOffset the initial value for [TopAppBarState.contentOffset]
  */
 @ExperimentalMaterial3Api
@@ -1247,11 +1291,7 @@
     initialContentOffset: Float = 0f
 ): TopAppBarState {
     return rememberSaveable(saver = TopAppBarState.Saver) {
-        TopAppBarState(
-            initialHeightOffsetLimit,
-            initialHeightOffset,
-            initialContentOffset
-        )
+        TopAppBarState(initialHeightOffsetLimit, initialHeightOffset, initialContentOffset)
     }
 }
 
@@ -1290,17 +1330,15 @@
     var heightOffset: Float
         get() = _heightOffset.floatValue
         set(newOffset) {
-            _heightOffset.floatValue = newOffset.coerceIn(
-                minimumValue = heightOffsetLimit,
-                maximumValue = 0f
-            )
+            _heightOffset.floatValue =
+                newOffset.coerceIn(minimumValue = heightOffsetLimit, maximumValue = 0f)
         }
 
     /**
      * The total offset of the content scrolled under the top app bar.
      *
-     * The content offset is used to compute the [overlappedFraction], which can later be read
-     * by an implementation.
+     * The content offset is used to compute the [overlappedFraction], which can later be read by an
+     * implementation.
      *
      * This value is updated by a [TopAppBarScrollBehavior] whenever a nested scroll connection
      * consumes scroll events. A common implementation would update the value to be the sum of all
@@ -1315,11 +1353,12 @@
      * as [heightOffset] / [heightOffsetLimit]).
      */
     val collapsedFraction: Float
-        get() = if (heightOffsetLimit != 0f) {
-            heightOffset / heightOffsetLimit
-        } else {
-            0f
-        }
+        get() =
+            if (heightOffsetLimit != 0f) {
+                heightOffset / heightOffsetLimit
+            } else {
+                0f
+            }
 
     /**
      * A value that represents the percentage of the app bar area that is overlapping with the
@@ -1329,51 +1368,53 @@
      * the entire visible app bar area overlaps the scrolled content.
      */
     val overlappedFraction: Float
-        get() = if (heightOffsetLimit != 0f) {
-            1 - ((heightOffsetLimit - contentOffset).coerceIn(
-                minimumValue = heightOffsetLimit,
-                maximumValue = 0f
-            ) / heightOffsetLimit)
-        } else {
-            0f
-        }
+        get() =
+            if (heightOffsetLimit != 0f) {
+                1 -
+                    ((heightOffsetLimit - contentOffset).coerceIn(
+                        minimumValue = heightOffsetLimit,
+                        maximumValue = 0f
+                    ) / heightOffsetLimit)
+            } else {
+                0f
+            }
 
     companion object {
-        /**
-         * The default [Saver] implementation for [TopAppBarState].
-         */
-        val Saver: Saver<TopAppBarState, *> = listSaver(
-            save = { listOf(it.heightOffsetLimit, it.heightOffset, it.contentOffset) },
-            restore = {
-                TopAppBarState(
-                    initialHeightOffsetLimit = it[0],
-                    initialHeightOffset = it[1],
-                    initialContentOffset = it[2]
-                )
-            }
-        )
+        /** The default [Saver] implementation for [TopAppBarState]. */
+        val Saver: Saver<TopAppBarState, *> =
+            listSaver(
+                save = { listOf(it.heightOffsetLimit, it.heightOffset, it.contentOffset) },
+                restore = {
+                    TopAppBarState(
+                        initialHeightOffsetLimit = it[0],
+                        initialHeightOffset = it[1],
+                        initialContentOffset = it[2]
+                    )
+                }
+            )
     }
 
     private var _heightOffset = mutableFloatStateOf(initialHeightOffset)
 }
 
 /**
- * Represents the colors used by a top app bar in different states.
- * This implementation animates the container color according to the top app bar scroll state. It
- * does not animate the leading, headline, or trailing colors.
+ * Represents the colors used by a top app bar in different states. This implementation animates the
+ * container color according to the top app bar scroll state. It does not animate the leading,
+ * headline, or trailing colors.
  *
- * @constructor create an instance with arbitrary colors, see [TopAppBarColors] for a
- * factory method using the default material3 spec
  * @param containerColor the color used for the background of this BottomAppBar. Use
- * [Color.Transparent] to have no color.
+ *   [Color.Transparent] to have no color.
  * @param scrolledContainerColor the container color when content is scrolled behind it
  * @param navigationIconContentColor the content color used for the navigation icon
  * @param titleContentColor the content color used for the title
  * @param actionIconContentColor the content color used for actions
+ * @constructor create an instance with arbitrary colors, see [TopAppBarColors] for a factory method
+ *   using the default material3 spec
  */
 @ExperimentalMaterial3Api
 @Stable
-class TopAppBarColors constructor(
+class TopAppBarColors
+constructor(
     val containerColor: Color,
     val scrolledContainerColor: Color,
     val navigationIconContentColor: Color,
@@ -1381,8 +1422,8 @@
     val actionIconContentColor: Color,
 ) {
     /**
-     * Returns a copy of this TopAppBarColors, optionally overriding some of the values.
-     * This uses the Color.Unspecified to mean “use the value from the source”
+     * Returns a copy of this TopAppBarColors, optionally overriding some of the values. This uses
+     * the Color.Unspecified to mean “use the value from the source”
      */
     fun copy(
         containerColor: Color = this.containerColor,
@@ -1390,23 +1431,24 @@
         navigationIconContentColor: Color = this.navigationIconContentColor,
         titleContentColor: Color = this.titleContentColor,
         actionIconContentColor: Color = this.actionIconContentColor,
-    ) = TopAppBarColors(
-        containerColor.takeOrElse { this.containerColor },
-        scrolledContainerColor.takeOrElse { this.scrolledContainerColor },
-        navigationIconContentColor.takeOrElse { this.navigationIconContentColor },
-        titleContentColor.takeOrElse { this.titleContentColor },
-        actionIconContentColor.takeOrElse { this.actionIconContentColor },
-    )
+    ) =
+        TopAppBarColors(
+            containerColor.takeOrElse { this.containerColor },
+            scrolledContainerColor.takeOrElse { this.scrolledContainerColor },
+            navigationIconContentColor.takeOrElse { this.navigationIconContentColor },
+            titleContentColor.takeOrElse { this.titleContentColor },
+            actionIconContentColor.takeOrElse { this.actionIconContentColor },
+        )
 
     /**
      * Represents the container color used for the top app bar.
      *
      * A [colorTransitionFraction] provides a percentage value that can be used to generate a color.
-     * Usually, an app bar implementation will pass in a [colorTransitionFraction] read from
-     * the [TopAppBarState.collapsedFraction] or the [TopAppBarState.overlappedFraction].
+     * Usually, an app bar implementation will pass in a [colorTransitionFraction] read from the
+     * [TopAppBarState.collapsedFraction] or the [TopAppBarState.overlappedFraction].
      *
      * @param colorTransitionFraction a `0.0` to `1.0` value that represents a color transition
-     * percentage
+     *   percentage
      */
     @Stable
     internal fun containerColor(colorTransitionFraction: Float): Color {
@@ -1442,8 +1484,8 @@
 }
 
 /**
- * A BottomAppBarScrollBehavior defines how a bottom app bar should behave when the content under
- * it is scrolled.
+ * A BottomAppBarScrollBehavior defines how a bottom app bar should behave when the content under it
+ * is scrolled.
  *
  * @see [BottomAppBarDefaults.exitAlwaysScrollBehavior]
  */
@@ -1489,7 +1531,8 @@
 object BottomAppBarDefaults {
 
     /** Default color used for [BottomAppBar] container */
-    val containerColor: Color @Composable get() = BottomAppBarTokens.ContainerColor.value
+    val containerColor: Color
+        @Composable get() = BottomAppBarTokens.ContainerColor.value
 
     /** Default elevation used for [BottomAppBar] */
     val ContainerElevation: Dp = 0.dp
@@ -1498,26 +1541,25 @@
      * Default padding used for [BottomAppBar] when content are default size (24dp) icons in
      * [IconButton] that meet the minimum touch target (48.dp).
      */
-    val ContentPadding = PaddingValues(
-        start = BottomAppBarHorizontalPadding,
-        top = BottomAppBarVerticalPadding,
-        end = BottomAppBarHorizontalPadding
-    )
+    val ContentPadding =
+        PaddingValues(
+            start = BottomAppBarHorizontalPadding,
+            top = BottomAppBarVerticalPadding,
+            end = BottomAppBarHorizontalPadding
+        )
 
-    /**
-     * Default insets that will be used and consumed by [BottomAppBar].
-     */
+    /** Default insets that will be used and consumed by [BottomAppBar]. */
     val windowInsets: WindowInsets
         @Composable
         get() {
-            return WindowInsets.systemBarsForVisualComponents
-                .only(WindowInsetsSides.Horizontal + WindowInsetsSides.Bottom)
+            return WindowInsets.systemBarsForVisualComponents.only(
+                WindowInsetsSides.Horizontal + WindowInsetsSides.Bottom
+            )
         }
 
     /** The color of a [BottomAppBar]'s [FloatingActionButton] */
     val bottomAppBarFabColor: Color
-        @Composable get() =
-            FabSecondaryTokens.ContainerColor.value
+        @Composable get() = FabSecondaryTokens.ContainerColor.value
 
     /**
      * Returns a [BottomAppBarScrollBehavior]. A bottom app bar that is set up with this
@@ -1525,14 +1567,14 @@
      * will immediately appear when the content is pulled down.
      *
      * @param state the state object to be used to control or observe the bottom app bar's scroll
-     * state. See [rememberBottomAppBarState] for a state that is remembered across compositions.
-     * @param canScroll a callback used to determine whether scroll events are to be
-     * handled by this [ExitAlwaysScrollBehavior]
+     *   state. See [rememberBottomAppBarState] for a state that is remembered across compositions.
+     * @param canScroll a callback used to determine whether scroll events are to be handled by this
+     *   [ExitAlwaysScrollBehavior]
      * @param snapAnimationSpec an optional [AnimationSpec] that defines how the bottom app bar
-     * snaps to either fully collapsed or fully extended state when a fling or a drag scrolled it
-     * into an intermediate position
+     *   snaps to either fully collapsed or fully extended state when a fling or a drag scrolled it
+     *   into an intermediate position
      * @param flingAnimationSpec an optional [DecayAnimationSpec] that defined how to fling the
-     * bottom app bar when the user flings the app bar itself, or the content below it
+     *   bottom app bar when the user flings the app bar itself, or the content below it
      */
     @ExperimentalMaterial3Api
     @Composable
@@ -1554,10 +1596,10 @@
  * Creates a [BottomAppBarState] that is remembered across compositions.
  *
  * @param initialHeightOffsetLimit the initial value for [BottomAppBarState.heightOffsetLimit],
- * which represents the pixel limit that a bottom app bar is allowed to collapse when the scrollable
- * content is scrolled
+ *   which represents the pixel limit that a bottom app bar is allowed to collapse when the
+ *   scrollable content is scrolled
  * @param initialHeightOffset the initial value for [BottomAppBarState.heightOffset]. The initial
- * offset height offset should be between zero and [initialHeightOffsetLimit].
+ *   offset height offset should be between zero and [initialHeightOffsetLimit].
  * @param initialContentOffset the initial value for [BottomAppBarState.contentOffset]
  */
 @ExperimentalMaterial3Api
@@ -1568,11 +1610,7 @@
     initialContentOffset: Float = 0f
 ): BottomAppBarState {
     return rememberSaveable(saver = BottomAppBarState.Saver) {
-        BottomAppBarState(
-            initialHeightOffsetLimit,
-            initialHeightOffset,
-            initialContentOffset
-        )
+        BottomAppBarState(initialHeightOffsetLimit, initialHeightOffset, initialContentOffset)
     }
 }
 
@@ -1619,19 +1657,18 @@
     val collapsedFraction: Float
 
     companion object {
-        /**
-         * The default [Saver] implementation for [BottomAppBarState].
-         */
-        val Saver: Saver<BottomAppBarState, *> = listSaver(
-            save = { listOf(it.heightOffsetLimit, it.heightOffset, it.contentOffset) },
-            restore = {
-                BottomAppBarState(
-                    initialHeightOffsetLimit = it[0],
-                    initialHeightOffset = it[1],
-                    initialContentOffset = it[2]
-                )
-            }
-        )
+        /** The default [Saver] implementation for [BottomAppBarState]. */
+        val Saver: Saver<BottomAppBarState, *> =
+            listSaver(
+                save = { listOf(it.heightOffsetLimit, it.heightOffset, it.contentOffset) },
+                restore = {
+                    BottomAppBarState(
+                        initialHeightOffsetLimit = it[0],
+                        initialHeightOffset = it[1],
+                        initialContentOffset = it[2]
+                    )
+                }
+            )
     }
 }
 
@@ -1639,10 +1676,10 @@
  * Creates a [BottomAppBarState].
  *
  * @param initialHeightOffsetLimit the initial value for [BottomAppBarState.heightOffsetLimit],
- * which represents the pixel limit that a bottom app bar is allowed to collapse when the scrollable
- * content is scrolled
+ *   which represents the pixel limit that a bottom app bar is allowed to collapse when the
+ *   scrollable content is scrolled
  * @param initialHeightOffset the initial value for [BottomAppBarState.heightOffset]. The initial
- * offset height offset should be between zero and [initialHeightOffsetLimit].
+ *   offset height offset should be between zero and [initialHeightOffsetLimit].
  * @param initialContentOffset the initial value for [BottomAppBarState.contentOffset]
  */
 @ExperimentalMaterial3Api
@@ -1650,11 +1687,8 @@
     initialHeightOffsetLimit: Float,
     initialHeightOffset: Float,
     initialContentOffset: Float
-): BottomAppBarState = BottomAppBarStateImpl(
-    initialHeightOffsetLimit,
-    initialHeightOffset,
-    initialContentOffset
-)
+): BottomAppBarState =
+    BottomAppBarStateImpl(initialHeightOffsetLimit, initialHeightOffset, initialContentOffset)
 
 @OptIn(ExperimentalMaterial3Api::class)
 @Stable
@@ -1669,20 +1703,19 @@
     override var heightOffset: Float
         get() = _heightOffset.floatValue
         set(newOffset) {
-            _heightOffset.floatValue = newOffset.coerceIn(
-                minimumValue = heightOffsetLimit,
-                maximumValue = 0f
-            )
+            _heightOffset.floatValue =
+                newOffset.coerceIn(minimumValue = heightOffsetLimit, maximumValue = 0f)
         }
 
     override var contentOffset by mutableFloatStateOf(initialContentOffset)
 
     override val collapsedFraction: Float
-        get() = if (heightOffsetLimit != 0f) {
-            heightOffset / heightOffsetLimit
-        } else {
-            0f
-        }
+        get() =
+            if (heightOffsetLimit != 0f) {
+                heightOffset / heightOffsetLimit
+            } else {
+                0f
+            }
 
     private var _heightOffset = mutableFloatStateOf(initialHeightOffset)
 }
@@ -1697,12 +1730,12 @@
  *
  * @param state a [BottomAppBarState]
  * @param snapAnimationSpec an optional [AnimationSpec] that defines how the bottom app bar snaps to
- * either fully collapsed or fully extended state when a fling or a drag scrolled it into an
- * intermediate position
+ *   either fully collapsed or fully extended state when a fling or a drag scrolled it into an
+ *   intermediate position
  * @param flingAnimationSpec an optional [DecayAnimationSpec] that defined how to fling the bottom
- * app bar when the user flings the app bar itself, or the content below it
- * @param canScroll a callback used to determine whether scroll events are to be
- * handled by this [ExitAlwaysScrollBehavior]
+ *   app bar when the user flings the app bar itself, or the content below it
+ * @param canScroll a callback used to determine whether scroll events are to be handled by this
+ *   [ExitAlwaysScrollBehavior]
  */
 @OptIn(ExperimentalMaterial3Api::class)
 private class ExitAlwaysScrollBehavior(
@@ -1734,12 +1767,8 @@
 
             override suspend fun onPostFling(consumed: Velocity, available: Velocity): Velocity {
                 val superConsumed = super.onPostFling(consumed, available)
-                return superConsumed + settleAppBarBottom(
-                    state,
-                    available.y,
-                    flingAnimationSpec,
-                    snapAnimationSpec
-                )
+                return superConsumed +
+                    settleAppBarBottom(state, available.y, flingAnimationSpec, snapAnimationSpec)
             }
         }
 }
@@ -1768,9 +1797,9 @@
     if (flingAnimationSpec != null && abs(velocity) > 1f) {
         var lastValue = 0f
         AnimationState(
-            initialValue = 0f,
-            initialVelocity = velocity,
-        )
+                initialValue = 0f,
+                initialVelocity = velocity,
+            )
             .animateDecay(flingAnimationSpec) {
                 val delta = value - lastValue
                 val initialHeightOffset = state.heightOffset
@@ -1784,9 +1813,7 @@
     }
     // Snap if animation specs were provided.
     if (snapAnimationSpec != null) {
-        if (state.heightOffset < 0 &&
-            state.heightOffset > state.heightOffsetLimit
-        ) {
+        if (state.heightOffset < 0 && state.heightOffset > state.heightOffsetLimit) {
             AnimationState(initialValue = state.heightOffset).animateTo(
                 if (state.collapsedFraction < 0.5f) {
                     0f
@@ -1794,7 +1821,9 @@
                     state.heightOffsetLimit
                 },
                 animationSpec = snapAnimationSpec
-            ) { state.heightOffset = value }
+            ) {
+                state.heightOffset = value
+            }
         }
     }
 
@@ -1834,9 +1863,7 @@
     require(expandedHeight.isSpecified && expandedHeight.isFinite) {
         "The expandedHeight is expected to be specified and finite"
     }
-    val expandedHeightPx = with(LocalDensity.current) {
-        expandedHeight.toPx().coerceAtLeast(0f)
-    }
+    val expandedHeightPx = with(LocalDensity.current) { expandedHeight.toPx().coerceAtLeast(0f) }
     SideEffect {
         // Sets the app bar's height offset to collapse the entire bar's height when content is
         // scrolled.
@@ -1849,46 +1876,49 @@
     // ensures that the colors will adjust whether the app bar behavior is pinned or scrolled.
     // This may potentially animate or interpolate a transition between the container-color and the
     // container's scrolled-color according to the app bar's scroll state.
-    val colorTransitionFraction by remember(scrollBehavior) {
-        // derivedStateOf to prevent redundant recompositions when the content scrolls.
-        derivedStateOf {
-            val overlappingFraction = scrollBehavior?.state?.overlappedFraction ?: 0f
-            if (overlappingFraction > 0.01f) 1f else 0f
+    val colorTransitionFraction by
+        remember(scrollBehavior) {
+            // derivedStateOf to prevent redundant recompositions when the content scrolls.
+            derivedStateOf {
+                val overlappingFraction = scrollBehavior?.state?.overlappedFraction ?: 0f
+                if (overlappingFraction > 0.01f) 1f else 0f
+            }
         }
-    }
-    val appBarContainerColor by animateColorAsState(
-        targetValue = colors.containerColor(colorTransitionFraction),
-        animationSpec = spring(stiffness = Spring.StiffnessMediumLow)
-    )
+    val appBarContainerColor by
+        animateColorAsState(
+            targetValue = colors.containerColor(colorTransitionFraction),
+            animationSpec = spring(stiffness = Spring.StiffnessMediumLow)
+        )
 
     // Wrap the given actions in a Row.
-    val actionsRow = @Composable {
-        Row(
-            horizontalArrangement = Arrangement.End,
-            verticalAlignment = Alignment.CenterVertically,
-            content = actions
-        )
-    }
+    val actionsRow =
+        @Composable {
+            Row(
+                horizontalArrangement = Arrangement.End,
+                verticalAlignment = Alignment.CenterVertically,
+                content = actions
+            )
+        }
 
     // Set up support for resizing the top app bar when vertically dragging the bar itself.
-    val appBarDragModifier = if (scrollBehavior != null && !scrollBehavior.isPinned) {
-        Modifier.draggable(
-            orientation = Orientation.Vertical,
-            state = rememberDraggableState { delta ->
-                scrollBehavior.state.heightOffset += delta
-            },
-            onDragStopped = { velocity ->
-                settleAppBar(
-                    scrollBehavior.state,
-                    velocity,
-                    scrollBehavior.flingAnimationSpec,
-                    scrollBehavior.snapAnimationSpec
-                )
-            }
-        )
-    } else {
-        Modifier
-    }
+    val appBarDragModifier =
+        if (scrollBehavior != null && !scrollBehavior.isPinned) {
+            Modifier.draggable(
+                orientation = Orientation.Vertical,
+                state =
+                    rememberDraggableState { delta -> scrollBehavior.state.heightOffset += delta },
+                onDragStopped = { velocity ->
+                    settleAppBar(
+                        scrollBehavior.state,
+                        velocity,
+                        scrollBehavior.flingAnimationSpec,
+                        scrollBehavior.snapAnimationSpec
+                    )
+                }
+            )
+        } else {
+            Modifier
+        }
 
     // Compose a Surface with a TopAppBarLayout content.
     // The surface's background color is animated as specified above.
@@ -1896,11 +1926,11 @@
     // app bar's defined constant height value (i.e. the ContainerHeight token).
     Surface(modifier = modifier.then(appBarDragModifier), color = appBarContainerColor) {
         TopAppBarLayout(
-            modifier = Modifier
-                .windowInsetsPadding(windowInsets)
-                // clip after padding so we don't show the title over the inset area
-                .clipToBounds()
-                .heightIn(max = expandedHeight),
+            modifier =
+                Modifier.windowInsetsPadding(windowInsets)
+                    // clip after padding so we don't show the title over the inset area
+                    .clipToBounds()
+                    .heightIn(max = expandedHeight),
             scrolledOffset = { scrollBehavior?.state?.heightOffset ?: 0f },
             navigationIconContentColor = colors.navigationIconContentColor,
             titleContentColor = colors.titleContentColor,
@@ -1910,7 +1940,7 @@
             titleAlpha = 1f,
             titleVerticalArrangement = Arrangement.Center,
             titleHorizontalArrangement =
-            if (centeredTitle) Arrangement.Center else Arrangement.Start,
+                if (centeredTitle) Arrangement.Center else Arrangement.Start,
             titleBottomPadding = 0,
             hideTitleSemantics = false,
             navigationIcon = navigationIcon,
@@ -1975,13 +2005,14 @@
     val appBarContainerColor = colors.containerColor(colorTransitionFraction)
 
     // Wrap the given actions in a Row.
-    val actionsRow = @Composable {
-        Row(
-            horizontalArrangement = Arrangement.End,
-            verticalAlignment = Alignment.CenterVertically,
-            content = actions
-        )
-    }
+    val actionsRow =
+        @Composable {
+            Row(
+                horizontalArrangement = Arrangement.End,
+                verticalAlignment = Alignment.CenterVertically,
+                content = actions
+            )
+        }
     val topTitleAlpha = TopTitleAlphaEasing.transform(colorTransitionFraction)
     val bottomTitleAlpha = 1f - colorTransitionFraction
     // Hide the top row title semantics when its alpha value goes below 0.5 threshold.
@@ -1990,33 +2021,33 @@
     val hideBottomRowSemantics = !hideTopRowSemantics
 
     // Set up support for resizing the top app bar when vertically dragging the bar itself.
-    val appBarDragModifier = if (scrollBehavior != null && !scrollBehavior.isPinned) {
-        Modifier.draggable(
-            orientation = Orientation.Vertical,
-            state = rememberDraggableState { delta ->
-                scrollBehavior.state.heightOffset += delta
-            },
-            onDragStopped = { velocity ->
-                settleAppBar(
-                    scrollBehavior.state,
-                    velocity,
-                    scrollBehavior.flingAnimationSpec,
-                    scrollBehavior.snapAnimationSpec
-                )
-            }
-        )
-    } else {
-        Modifier
-    }
+    val appBarDragModifier =
+        if (scrollBehavior != null && !scrollBehavior.isPinned) {
+            Modifier.draggable(
+                orientation = Orientation.Vertical,
+                state =
+                    rememberDraggableState { delta -> scrollBehavior.state.heightOffset += delta },
+                onDragStopped = { velocity ->
+                    settleAppBar(
+                        scrollBehavior.state,
+                        velocity,
+                        scrollBehavior.flingAnimationSpec,
+                        scrollBehavior.snapAnimationSpec
+                    )
+                }
+            )
+        } else {
+            Modifier
+        }
 
     Surface(modifier = modifier.then(appBarDragModifier), color = appBarContainerColor) {
         Column {
             TopAppBarLayout(
-                modifier = Modifier
-                    .windowInsetsPadding(windowInsets)
-                    // clip after padding so we don't show the title over the inset area
-                    .clipToBounds()
-                    .heightIn(max = collapsedHeight),
+                modifier =
+                    Modifier.windowInsetsPadding(windowInsets)
+                        // clip after padding so we don't show the title over the inset area
+                        .clipToBounds()
+                        .heightIn(max = collapsedHeight),
                 scrolledOffset = { 0f },
                 navigationIconContentColor = colors.navigationIconContentColor,
                 titleContentColor = colors.titleContentColor,
@@ -2032,12 +2063,14 @@
                 actions = actionsRow,
             )
             TopAppBarLayout(
-                modifier = Modifier
-                    // only apply the horizontal sides of the window insets padding, since the top
-                    // padding will always be applied by the layout above
-                    .windowInsetsPadding(windowInsets.only(WindowInsetsSides.Horizontal))
-                    .clipToBounds()
-                    .heightIn(max = expandedHeight - collapsedHeight),
+                modifier =
+                    Modifier
+                        // only apply the horizontal sides of the window insets padding, since the
+                        // top
+                        // padding will always be applied by the layout above
+                        .windowInsetsPadding(windowInsets.only(WindowInsetsSides.Horizontal))
+                        .clipToBounds()
+                        .heightIn(max = expandedHeight - collapsedHeight),
                 scrolledOffset = { scrollBehavior?.state?.heightOffset ?: 0f },
                 navigationIconContentColor = colors.navigationIconContentColor,
                 titleContentColor = colors.titleContentColor,
@@ -2063,23 +2096,23 @@
  *
  * @param modifier a [Modifier]
  * @param scrolledOffset a [ScrolledOffset] that provides the app bar offset in pixels (note that
- * when the app bar is scrolled, the lambda will output negative values)
+ *   when the app bar is scrolled, the lambda will output negative values)
  * @param navigationIconContentColor the content color that will be applied via a
- * [LocalContentColor] when composing the navigation icon
+ *   [LocalContentColor] when composing the navigation icon
  * @param titleContentColor the color that will be applied via a [LocalContentColor] when composing
- * the title
+ *   the title
  * @param actionIconContentColor the content color that will be applied via a [LocalContentColor]
- * when composing the action icons
+ *   when composing the action icons
  * @param title the top app bar title (header)
  * @param titleTextStyle the title's text style
  * @param titleAlpha the title's alpha
  * @param titleVerticalArrangement the title's vertical arrangement
  * @param titleHorizontalArrangement the title's horizontal arrangement
  * @param titleBottomPadding the title's bottom padding
- * @param hideTitleSemantics hides the title node from the semantic tree. Apply this
- * boolean when this layout is part of a [TwoRowsTopAppBar] to hide the title's semantics
- * from accessibility services. This is needed to avoid having multiple titles visible to
- * accessibility services at the same time, when animating between collapsed / expanded states.
+ * @param hideTitleSemantics hides the title node from the semantic tree. Apply this boolean when
+ *   this layout is part of a [TwoRowsTopAppBar] to hide the title's semantics from accessibility
+ *   services. This is needed to avoid having multiple titles visible to accessibility services at
+ *   the same time, when animating between collapsed / expanded states.
  * @param navigationIcon a navigation icon [Composable]
  * @param actions actions [Composable]
  */
@@ -2102,21 +2135,16 @@
 ) {
     Layout(
         {
-            Box(
-                Modifier
-                    .layoutId("navigationIcon")
-                    .padding(start = TopAppBarHorizontalPadding)
-            ) {
+            Box(Modifier.layoutId("navigationIcon").padding(start = TopAppBarHorizontalPadding)) {
                 CompositionLocalProvider(
                     LocalContentColor provides navigationIconContentColor,
                     content = navigationIcon
                 )
             }
             Box(
-                Modifier
-                    .layoutId("title")
+                Modifier.layoutId("title")
                     .padding(horizontal = TopAppBarHorizontalPadding)
-                    .then(if (hideTitleSemantics) Modifier.clearAndSetSemantics { } else Modifier)
+                    .then(if (hideTitleSemantics) Modifier.clearAndSetSemantics {} else Modifier)
                     .graphicsLayer(alpha = titleAlpha)
             ) {
                 ProvideContentColorTextStyle(
@@ -2125,11 +2153,7 @@
                     content = title
                 )
             }
-            Box(
-                Modifier
-                    .layoutId("actionIcons")
-                    .padding(end = TopAppBarHorizontalPadding)
-            ) {
+            Box(Modifier.layoutId("actionIcons").padding(end = TopAppBarHorizontalPadding)) {
                 CompositionLocalProvider(
                     LocalContentColor provides actionIconContentColor,
                     content = actions
@@ -2139,20 +2163,24 @@
         modifier = modifier
     ) { measurables, constraints ->
         val navigationIconPlaceable =
-            measurables.fastFirst { it.layoutId == "navigationIcon" }
+            measurables
+                .fastFirst { it.layoutId == "navigationIcon" }
                 .measure(constraints.copy(minWidth = 0))
         val actionIconsPlaceable =
-            measurables.fastFirst { it.layoutId == "actionIcons" }
+            measurables
+                .fastFirst { it.layoutId == "actionIcons" }
                 .measure(constraints.copy(minWidth = 0))
 
-        val maxTitleWidth = if (constraints.maxWidth == Constraints.Infinity) {
-            constraints.maxWidth
-        } else {
-            (constraints.maxWidth - navigationIconPlaceable.width - actionIconsPlaceable.width)
-                .coerceAtLeast(0)
-        }
+        val maxTitleWidth =
+            if (constraints.maxWidth == Constraints.Infinity) {
+                constraints.maxWidth
+            } else {
+                (constraints.maxWidth - navigationIconPlaceable.width - actionIconsPlaceable.width)
+                    .coerceAtLeast(0)
+            }
         val titlePlaceable =
-            measurables.fastFirst { it.layoutId == "title" }
+            measurables
+                .fastFirst { it.layoutId == "title" }
                 .measure(constraints.copy(minWidth = 0, maxWidth = maxTitleWidth))
 
         // Locate the title's baseline.
@@ -2168,11 +2196,12 @@
         val scrolledOffsetValue = scrolledOffset.offset()
         val heightOffset = if (scrolledOffsetValue.isNaN()) 0 else scrolledOffsetValue.roundToInt()
 
-        val layoutHeight = if (constraints.maxHeight == Constraints.Infinity) {
-            constraints.maxHeight
-        } else {
-            constraints.maxHeight + heightOffset
-        }
+        val layoutHeight =
+            if (constraints.maxHeight == Constraints.Infinity) {
+                constraints.maxHeight
+            } else {
+                constraints.maxHeight + heightOffset
+            }
 
         layout(constraints.maxWidth, layoutHeight) {
             // Navigation icon
@@ -2183,59 +2212,67 @@
 
             // Title
             titlePlaceable.placeRelative(
-                x = when (titleHorizontalArrangement) {
-                    Arrangement.Center -> {
-                        var baseX = (constraints.maxWidth - titlePlaceable.width) / 2
-                        if (baseX < navigationIconPlaceable.width) {
-                            // May happen if the navigation is wider than the actions and the
-                            // title is long. In this case, prioritize showing more of the title by
-                            // offsetting it to the right.
-                            baseX += (navigationIconPlaceable.width - baseX)
-                        } else if (baseX + titlePlaceable.width >
-                            constraints.maxWidth - actionIconsPlaceable.width
-                        ) {
-                            // May happen if the actions are wider than the navigation and the title
-                            // is long. In this case, offset to the left.
-                            baseX += ((constraints.maxWidth - actionIconsPlaceable.width) -
-                                (baseX + titlePlaceable.width))
+                x =
+                    when (titleHorizontalArrangement) {
+                        Arrangement.Center -> {
+                            var baseX = (constraints.maxWidth - titlePlaceable.width) / 2
+                            if (baseX < navigationIconPlaceable.width) {
+                                // May happen if the navigation is wider than the actions and the
+                                // title is long. In this case, prioritize showing more of the title
+                                // by
+                                // offsetting it to the right.
+                                baseX += (navigationIconPlaceable.width - baseX)
+                            } else if (
+                                baseX + titlePlaceable.width >
+                                    constraints.maxWidth - actionIconsPlaceable.width
+                            ) {
+                                // May happen if the actions are wider than the navigation and the
+                                // title
+                                // is long. In this case, offset to the left.
+                                baseX +=
+                                    ((constraints.maxWidth - actionIconsPlaceable.width) -
+                                        (baseX + titlePlaceable.width))
+                            }
+                            baseX
                         }
-                        baseX
+                        Arrangement.End ->
+                            constraints.maxWidth - titlePlaceable.width - actionIconsPlaceable.width
+                        // Arrangement.Start.
+                        // An TopAppBarTitleInset will make sure the title is offset in case the
+                        // navigation icon is missing.
+                        else -> max(TopAppBarTitleInset.roundToPx(), navigationIconPlaceable.width)
+                    },
+                y =
+                    when (titleVerticalArrangement) {
+                        Arrangement.Center -> (layoutHeight - titlePlaceable.height) / 2
+                        // Apply bottom padding from the title's baseline only when the Arrangement
+                        // is
+                        // "Bottom".
+                        Arrangement.Bottom ->
+                            if (titleBottomPadding == 0) {
+                                layoutHeight - titlePlaceable.height
+                            } else {
+                                // Calculate the actual padding from the bottom of the title, taking
+                                // into account its baseline.
+                                val paddingFromBottom =
+                                    titleBottomPadding - (titlePlaceable.height - titleBaseline)
+                                // Adjust the bottom padding to a smaller number if there is no room
+                                // to
+                                // fit the title.
+                                val heightWithPadding = paddingFromBottom + titlePlaceable.height
+                                val adjustedBottomPadding =
+                                    if (heightWithPadding > constraints.maxHeight) {
+                                        paddingFromBottom -
+                                            (heightWithPadding - constraints.maxHeight)
+                                    } else {
+                                        paddingFromBottom
+                                    }
+
+                                layoutHeight - titlePlaceable.height - max(0, adjustedBottomPadding)
+                            }
+                        // Arrangement.Top
+                        else -> 0
                     }
-
-                    Arrangement.End ->
-                        constraints.maxWidth - titlePlaceable.width - actionIconsPlaceable.width
-                    // Arrangement.Start.
-                    // An TopAppBarTitleInset will make sure the title is offset in case the
-                    // navigation icon is missing.
-                    else -> max(TopAppBarTitleInset.roundToPx(), navigationIconPlaceable.width)
-                },
-                y = when (titleVerticalArrangement) {
-                    Arrangement.Center -> (layoutHeight - titlePlaceable.height) / 2
-                    // Apply bottom padding from the title's baseline only when the Arrangement is
-                    // "Bottom".
-                    Arrangement.Bottom ->
-                        if (titleBottomPadding == 0) {
-                            layoutHeight - titlePlaceable.height
-                        } else {
-                            // Calculate the actual padding from the bottom of the title, taking
-                            // into account its baseline.
-                            val paddingFromBottom =
-                                titleBottomPadding - (titlePlaceable.height - titleBaseline)
-                            // Adjust the bottom padding to a smaller number if there is no room to
-                            // fit the title.
-                            val heightWithPadding = paddingFromBottom + titlePlaceable.height
-                            val adjustedBottomPadding =
-                                if (heightWithPadding > constraints.maxHeight) {
-                                    paddingFromBottom - (heightWithPadding - constraints.maxHeight)
-                                } else {
-                                    paddingFromBottom
-                                }
-
-                            layoutHeight - titlePlaceable.height - max(0, adjustedBottomPadding)
-                        }
-                    // Arrangement.Top
-                    else -> 0
-                }
             )
 
             // Action icons
@@ -2247,9 +2284,7 @@
     }
 }
 
-/**
- * A functional interface for providing an app-bar scroll offset.
- */
+/** A functional interface for providing an app-bar scroll offset. */
 private fun interface ScrolledOffset {
     fun offset(): Float
 }
@@ -2259,8 +2294,8 @@
  * properties that affect the height of a top app bar.
  *
  * @param state a [TopAppBarState]
- * @param canScroll a callback used to determine whether scroll events are to be
- * handled by this [PinnedScrollBehavior]
+ * @param canScroll a callback used to determine whether scroll events are to be handled by this
+ *   [PinnedScrollBehavior]
  */
 @OptIn(ExperimentalMaterial3Api::class)
 private class PinnedScrollBehavior(
@@ -2299,12 +2334,12 @@
  *
  * @param state a [TopAppBarState]
  * @param snapAnimationSpec an optional [AnimationSpec] that defines how the top app bar snaps to
- * either fully collapsed or fully extended state when a fling or a drag scrolled it into an
- * intermediate position
+ *   either fully collapsed or fully extended state when a fling or a drag scrolled it into an
+ *   intermediate position
  * @param flingAnimationSpec an optional [DecayAnimationSpec] that defined how to fling the top app
- * bar when the user flings the app bar itself, or the content below it
- * @param canScroll a callback used to determine whether scroll events are to be
- * handled by this [EnterAlwaysScrollBehavior]
+ *   bar when the user flings the app bar itself, or the content below it
+ * @param canScroll a callback used to determine whether scroll events are to be handled by this
+ *   [EnterAlwaysScrollBehavior]
  */
 @OptIn(ExperimentalMaterial3Api::class)
 private class EnterAlwaysScrollBehavior(
@@ -2349,12 +2384,8 @@
 
             override suspend fun onPostFling(consumed: Velocity, available: Velocity): Velocity {
                 val superConsumed = super.onPostFling(consumed, available)
-                return superConsumed + settleAppBar(
-                    state,
-                    available.y,
-                    flingAnimationSpec,
-                    snapAnimationSpec
-                )
+                return superConsumed +
+                    settleAppBar(state, available.y, flingAnimationSpec, snapAnimationSpec)
             }
         }
 }
@@ -2369,12 +2400,12 @@
  *
  * @param state a [TopAppBarState]
  * @param snapAnimationSpec an optional [AnimationSpec] that defines how the top app bar snaps to
- * either fully collapsed or fully extended state when a fling or a drag scrolled it into an
- * intermediate position
+ *   either fully collapsed or fully extended state when a fling or a drag scrolled it into an
+ *   intermediate position
  * @param flingAnimationSpec an optional [DecayAnimationSpec] that defined how to fling the top app
- * bar when the user flings the app bar itself, or the content below it
- * @param canScroll a callback used to determine whether scroll events are to be
- * handled by this [ExitUntilCollapsedScrollBehavior]
+ *   bar when the user flings the app bar itself, or the content below it
+ * @param canScroll a callback used to determine whether scroll events are to be handled by this
+ *   [ExitUntilCollapsedScrollBehavior]
  */
 @OptIn(ExperimentalMaterial3Api::class)
 private class ExitUntilCollapsedScrollBehavior(
@@ -2434,12 +2465,8 @@
 
             override suspend fun onPostFling(consumed: Velocity, available: Velocity): Velocity {
                 val superConsumed = super.onPostFling(consumed, available)
-                return superConsumed + settleAppBar(
-                    state,
-                    available.y,
-                    flingAnimationSpec,
-                    snapAnimationSpec
-                )
+                return superConsumed +
+                    settleAppBar(state, available.y, flingAnimationSpec, snapAnimationSpec)
             }
         }
 }
@@ -2468,9 +2495,9 @@
     if (flingAnimationSpec != null && abs(velocity) > 1f) {
         var lastValue = 0f
         AnimationState(
-            initialValue = 0f,
-            initialVelocity = velocity,
-        )
+                initialValue = 0f,
+                initialVelocity = velocity,
+            )
             .animateDecay(flingAnimationSpec) {
                 val delta = value - lastValue
                 val initialHeightOffset = state.heightOffset
@@ -2484,9 +2511,7 @@
     }
     // Snap if animation specs were provided.
     if (snapAnimationSpec != null) {
-        if (state.heightOffset < 0 &&
-            state.heightOffset > state.heightOffsetLimit
-        ) {
+        if (state.heightOffset < 0 && state.heightOffset > state.heightOffsetLimit) {
             AnimationState(initialValue = state.heightOffset).animateTo(
                 if (state.collapsedFraction < 0.5f) {
                     0f
@@ -2494,7 +2519,9 @@
                     state.heightOffsetLimit
                 },
                 animationSpec = snapAnimationSpec
-            ) { state.heightOffset = value }
+            ) {
+                state.heightOffset = value
+            }
         }
     }
 
diff --git a/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/Badge.kt b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/Badge.kt
index 0f7278f..89b45e8 100644
--- a/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/Badge.kt
+++ b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/Badge.kt
@@ -51,18 +51,19 @@
  *
  * Badges can be icon only or contain short text.
  *
- * ![Badge image](https://developer.android.com/images/reference/androidx/compose/material3/badge.png)
+ * ![Badge
+ * image](https://developer.android.com/images/reference/androidx/compose/material3/badge.png)
  *
- * A common use case is to display a badge with navigation bar items.
- * For more information, see [Navigation Bar](https://m3.material.io/components/navigation-bar/overview)
+ * A common use case is to display a badge with navigation bar items. For more information, see
+ * [Navigation Bar](https://m3.material.io/components/navigation-bar/overview)
  *
  * A simple icon with badge example looks like:
+ *
  * @sample androidx.compose.material3.samples.NavigationBarItemWithBadge
  *
  * @param badge the badge to be displayed - typically a [Badge]
  * @param modifier the [Modifier] to be applied to this BadgedBox
  * @param content the anchor to which this badge will be positioned
- *
  */
 @Composable
 fun BadgedBox(
@@ -84,13 +85,10 @@
                 contentAlignment = Alignment.Center,
                 content = content
             )
-            Box(
-                modifier = Modifier.layoutId("badge"),
-                content = badge
-            )
+            Box(modifier = Modifier.layoutId("badge"), content = badge)
         },
-        modifier = modifier
-            .onGloballyPositioned { coordinates ->
+        modifier =
+            modifier.onGloballyPositioned { coordinates ->
                 val windowBoundsRect = coordinates.boundsInWindow()
                 layoutAbsoluteLeft = windowBoundsRect.left
                 layoutAbsoluteTop = windowBoundsRect.top
@@ -103,12 +101,15 @@
                 }
             }
     ) { measurables, constraints ->
-
-        val badgePlaceable = measurables.fastFirst { it.layoutId == "badge" }.measure(
-            // Measure with loose constraints for height as we don't want the text to take up more
-            // space than it needs.
-            constraints.copy(minHeight = 0)
-        )
+        val badgePlaceable =
+            measurables
+                .fastFirst { it.layoutId == "badge" }
+                .measure(
+                    // Measure with loose constraints for height as we don't want the text to take
+                    // up more
+                    // space than it needs.
+                    constraints.copy(minHeight = 0)
+                )
 
         val anchorPlaceable = measurables.fastFirst { it.layoutId == "anchor" }.measure(constraints)
 
@@ -122,10 +123,7 @@
             totalHeight,
             // Provide custom baselines based only on the anchor content to avoid default baseline
             // calculations from including by any badge content.
-            mapOf(
-                FirstBaseline to firstBaseline,
-                LastBaseline to lastBaseline
-            )
+            mapOf(FirstBaseline to firstBaseline, LastBaseline to lastBaseline)
         ) {
             // Use the width of the badge to infer whether it has any content (based on radius used
             // in [Badge]) and determine its horizontal offset.
@@ -145,8 +143,7 @@
             val badgeAbsoluteRight = layoutAbsoluteLeft + badgeX + badgePlaceable.width.toFloat()
             val badgeGreatGrandParentHorizontalDiff =
                 greatGrandParentAbsoluteRight - badgeAbsoluteRight
-            val badgeGreatGrandParentVerticalDiff =
-                badgeAbsoluteTop - greatGrandParentAbsoluteTop
+            val badgeGreatGrandParentVerticalDiff = badgeAbsoluteTop - greatGrandParentAbsoluteTop
             // Adjust badgeX and badgeY if the desired placement would cause it to clip.
             if (badgeGreatGrandParentHorizontalDiff < 0) {
                 badgeX += badgeGreatGrandParentHorizontalDiff.roundToInt()
@@ -165,7 +162,8 @@
  *
  * Badges can be icon only or contain short text.
  *
- * ![Badge image](https://developer.android.com/images/reference/androidx/compose/material3/badge.png)
+ * ![Badge
+ * image](https://developer.android.com/images/reference/androidx/compose/material3/badge.png)
  *
  * See [BadgedBox] for a top level layout that will properly place the badge relative to content
  * such as text or an icon.
@@ -173,8 +171,8 @@
  * @param modifier the [Modifier] to be applied to this badge
  * @param containerColor the color used for the background of this badge
  * @param contentColor the preferred color for content inside this badge. Defaults to either the
- * matching content color for [containerColor], or to the current [LocalContentColor] if
- * [containerColor] is not a color from the theme.
+ *   matching content color for [containerColor], or to the current [LocalContentColor] if
+ *   [containerColor] is not a color from the theme.
  * @param content optional content to be rendered inside this badge
  */
 @Composable
@@ -185,24 +183,24 @@
     content: @Composable (RowScope.() -> Unit)? = null,
 ) {
     val size = if (content != null) BadgeTokens.LargeSize else BadgeTokens.Size
-    val shape = if (content != null) {
-        BadgeTokens.LargeShape.value
-    } else {
-        BadgeTokens.Shape.value
-    }
+    val shape =
+        if (content != null) {
+            BadgeTokens.LargeShape.value
+        } else {
+            BadgeTokens.Shape.value
+        }
 
     // Draw badge container.
     Row(
-        modifier = modifier
-            .defaultMinSize(minWidth = size, minHeight = size)
-            .background(
-                color = containerColor,
-                shape = shape
-            )
-            .then(
-                if (content != null)
-                    Modifier.padding(horizontal = BadgeWithContentHorizontalPadding) else Modifier
-            ),
+        modifier =
+            modifier
+                .defaultMinSize(minWidth = size, minHeight = size)
+                .background(color = containerColor, shape = shape)
+                .then(
+                    if (content != null)
+                        Modifier.padding(horizontal = BadgeWithContentHorizontalPadding)
+                    else Modifier
+                ),
         verticalAlignment = Alignment.CenterVertically,
         horizontalArrangement = Arrangement.Center
     ) {
@@ -221,7 +219,8 @@
 /** Default values used for [Badge] implementations. */
 object BadgeDefaults {
     /** Default container color for a badge. */
-    val containerColor: Color @Composable get() = BadgeTokens.Color.value
+    val containerColor: Color
+        @Composable get() = BadgeTokens.Color.value
 }
 
 /*@VisibleForTesting*/
diff --git a/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/BottomSheetScaffold.kt b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/BottomSheetScaffold.kt
index 39f902f..d393bef 100644
--- a/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/BottomSheetScaffold.kt
+++ b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/BottomSheetScaffold.kt
@@ -56,18 +56,19 @@
 import kotlinx.coroutines.launch
 
 /**
- * <a href="https://m3.material.io/components/bottom-sheets/overview" class="external" target="_blank">Material Design standard bottom sheet scaffold</a>.
+ * <a href="https://m3.material.io/components/bottom-sheets/overview" class="external"
+ * target="_blank">Material Design standard bottom sheet scaffold</a>.
  *
  * Standard bottom sheets co-exist with the screen’s main UI region and allow for simultaneously
- * viewing and interacting with both regions. They are commonly used to keep a feature or
- * secondary content visible on screen when content in main UI region is frequently scrolled or
- * panned.
+ * viewing and interacting with both regions. They are commonly used to keep a feature or secondary
+ * content visible on screen when content in main UI region is frequently scrolled or panned.
  *
- * ![Bottom sheet image](https://developer.android.com/images/reference/androidx/compose/material3/bottom_sheet.png)
+ * ![Bottom sheet
+ * image](https://developer.android.com/images/reference/androidx/compose/material3/bottom_sheet.png)
  *
- * This component provides API to put together several material components to construct your
- * screen, by ensuring proper layout strategy for them and collecting necessary data so these
- * components will work together correctly.
+ * This component provides API to put together several material components to construct your screen,
+ * by ensuring proper layout strategy for them and collecting necessary data so these components
+ * will work together correctly.
  *
  * A simple example of a standard bottom sheet looks like this:
  *
@@ -77,32 +78,32 @@
  * @param modifier the [Modifier] to be applied to this scaffold
  * @param scaffoldState the state of the bottom sheet scaffold
  * @param sheetPeekHeight the height of the bottom sheet when it is collapsed
- * @param sheetMaxWidth [Dp] that defines what the maximum width the sheet will take.
- * Pass in [Dp.Unspecified] for a sheet that spans the entire screen width.
+ * @param sheetMaxWidth [Dp] that defines what the maximum width the sheet will take. Pass in
+ *   [Dp.Unspecified] for a sheet that spans the entire screen width.
  * @param sheetShape the shape of the bottom sheet
  * @param sheetContainerColor the background color of the bottom sheet
  * @param sheetContentColor the preferred content color provided by the bottom sheet to its
- * children. Defaults to the matching content color for [sheetContainerColor], or if that is
- * not a color from the theme, this will keep the same content color set above the bottom sheet.
+ *   children. Defaults to the matching content color for [sheetContainerColor], or if that is not a
+ *   color from the theme, this will keep the same content color set above the bottom sheet.
  * @param sheetTonalElevation when [sheetContainerColor] is [ColorScheme.surface], a translucent
- * primary color overlay is applied on top of the container. A higher tonal elevation value will
- * result in a darker color in light theme and lighter color in dark theme. See also: [Surface].
+ *   primary color overlay is applied on top of the container. A higher tonal elevation value will
+ *   result in a darker color in light theme and lighter color in dark theme. See also: [Surface].
  * @param sheetShadowElevation the shadow elevation of the bottom sheet
  * @param sheetDragHandle optional visual marker to pull the scaffold's bottom sheet
  * @param sheetSwipeEnabled whether the sheet swiping is enabled and should react to the user's
- * input
+ *   input
  * @param topBar top app bar of the screen, typically a [SmallTopAppBar]
  * @param snackbarHost component to host [Snackbar]s that are pushed to be shown via
- * [SnackbarHostState.showSnackbar], typically a [SnackbarHost]
+ *   [SnackbarHostState.showSnackbar], typically a [SnackbarHost]
  * @param containerColor the color used for the background of this scaffold. Use [Color.Transparent]
- * to have no color.
+ *   to have no color.
  * @param contentColor the preferred color for content inside this scaffold. Defaults to either the
- * matching content color for [containerColor], or to the current [LocalContentColor] if
- * [containerColor] is not a color from the theme.
+ *   matching content color for [containerColor], or to the current [LocalContentColor] if
+ *   [containerColor] is not a color from the theme.
  * @param content content of the screen. The lambda receives a [PaddingValues] that should be
- * applied to the content root via [Modifier.padding] and [Modifier.consumeWindowInsets] to
- * properly offset top and bottom bars. If using [Modifier.verticalScroll], apply this modifier to
- * the child of the scroll, and not on the scroll itself.
+ *   applied to the content root via [Modifier.padding] and [Modifier.consumeWindowInsets] to
+ *   properly offset top and bottom bars. If using [Modifier.verticalScroll], apply this modifier to
+ *   the child of the scroll, and not on the scroll itself.
  */
 @Composable
 @ExperimentalMaterial3Api
@@ -129,9 +130,7 @@
         modifier = modifier,
         topBar = topBar,
         body = { content(PaddingValues(bottom = sheetPeekHeight)) },
-        snackbarHost = {
-            snackbarHost(scaffoldState.snackbarHostState)
-        },
+        snackbarHost = { snackbarHost(scaffoldState.snackbarHostState) },
         sheetOffset = { scaffoldState.bottomSheetState.requireOffset() },
         sheetState = scaffoldState.bottomSheetState,
         containerColor = containerColor,
@@ -171,7 +170,7 @@
  * Create and [remember] a [BottomSheetScaffoldState].
  *
  * @param bottomSheetState the state of the standard bottom sheet. See
- * [rememberStandardBottomSheetState]
+ *   [rememberStandardBottomSheetState]
  * @param snackbarHostState the [SnackbarHostState] used to show snackbars inside the scaffold
  */
 @Composable
@@ -192,7 +191,7 @@
  * Create and [remember] a [SheetState] for [BottomSheetScaffold].
  *
  * @param initialValue the initial value of the state. Should be either [PartiallyExpanded] or
- * [Expanded] if [skipHiddenState] is true
+ *   [Expanded] if [skipHiddenState] is true
  * @param confirmValueChange optional callback invoked to confirm or veto a pending state change
  * @param [skipHiddenState] whether Hidden state is skipped for [BottomSheetScaffold]
  */
@@ -202,11 +201,12 @@
     initialValue: SheetValue = PartiallyExpanded,
     confirmValueChange: (SheetValue) -> Boolean = { true },
     skipHiddenState: Boolean = true,
-) = rememberSheetState(
-    confirmValueChange = confirmValueChange,
-    initialValue = initialValue,
-    skipHiddenState = skipHiddenState,
-)
+) =
+    rememberSheetState(
+        confirmValueChange = confirmValueChange,
+        initialValue = initialValue,
+        skipHiddenState = skipHiddenState,
+    )
 
 @OptIn(ExperimentalMaterial3Api::class)
 @Composable
@@ -226,61 +226,67 @@
     val scope = rememberCoroutineScope()
     val orientation = Orientation.Vertical
     val peekHeightPx = with(LocalDensity.current) { peekHeight.toPx() }
-    val nestedScroll = if (sheetSwipeEnabled) {
-        Modifier.nestedScroll(
-            remember(state.anchoredDraggableState) {
-                ConsumeSwipeWithinBottomSheetBoundsNestedScrollConnection(
-                    sheetState = state,
-                    orientation = orientation,
-                    onFling = { scope.launch { state.settle(it) } }
-                )
-            }
-        )
-    } else {
-        Modifier
-    }
+    val nestedScroll =
+        if (sheetSwipeEnabled) {
+            Modifier.nestedScroll(
+                remember(state.anchoredDraggableState) {
+                    ConsumeSwipeWithinBottomSheetBoundsNestedScrollConnection(
+                        sheetState = state,
+                        orientation = orientation,
+                        onFling = { scope.launch { state.settle(it) } }
+                    )
+                }
+            )
+        } else {
+            Modifier
+        }
     Surface(
-        modifier = Modifier
-            .widthIn(max = sheetMaxWidth)
-            .fillMaxWidth()
-            .requiredHeightIn(min = peekHeight)
-            .then(nestedScroll)
-            .draggableAnchors(state.anchoredDraggableState, orientation) { sheetSize, constraints ->
-                val layoutHeight = constraints.maxHeight.toFloat()
-                val sheetHeight = sheetSize.height.toFloat()
-                val newAnchors = DraggableAnchors {
-                    if (!state.skipPartiallyExpanded) {
-                        PartiallyExpanded at (layoutHeight - peekHeightPx)
+        modifier =
+            Modifier.widthIn(max = sheetMaxWidth)
+                .fillMaxWidth()
+                .requiredHeightIn(min = peekHeight)
+                .then(nestedScroll)
+                .draggableAnchors(state.anchoredDraggableState, orientation) {
+                    sheetSize,
+                    constraints ->
+                    val layoutHeight = constraints.maxHeight.toFloat()
+                    val sheetHeight = sheetSize.height.toFloat()
+                    val newAnchors = DraggableAnchors {
+                        if (!state.skipPartiallyExpanded) {
+                            PartiallyExpanded at (layoutHeight - peekHeightPx)
+                        }
+                        if (sheetHeight != peekHeightPx) {
+                            Expanded at maxOf(layoutHeight - sheetHeight, 0f)
+                        }
+                        if (!state.skipHiddenState) {
+                            Hidden at layoutHeight
+                        }
                     }
-                    if (sheetHeight != peekHeightPx) {
-                        Expanded at maxOf(layoutHeight - sheetHeight, 0f)
-                    }
-                    if (!state.skipHiddenState) {
-                        Hidden at layoutHeight
-                    }
+                    val newTarget =
+                        when (val oldTarget = state.anchoredDraggableState.targetValue) {
+                            Hidden -> if (newAnchors.hasAnchorFor(Hidden)) Hidden else oldTarget
+                            PartiallyExpanded ->
+                                when {
+                                    newAnchors.hasAnchorFor(PartiallyExpanded) -> PartiallyExpanded
+                                    newAnchors.hasAnchorFor(Expanded) -> Expanded
+                                    newAnchors.hasAnchorFor(Hidden) -> Hidden
+                                    else -> oldTarget
+                                }
+                            Expanded ->
+                                when {
+                                    newAnchors.hasAnchorFor(Expanded) -> Expanded
+                                    newAnchors.hasAnchorFor(PartiallyExpanded) -> PartiallyExpanded
+                                    newAnchors.hasAnchorFor(Hidden) -> Hidden
+                                    else -> oldTarget
+                                }
+                        }
+                    return@draggableAnchors newAnchors to newTarget
                 }
-                val newTarget = when (val oldTarget = state.anchoredDraggableState.targetValue) {
-                    Hidden -> if (newAnchors.hasAnchorFor(Hidden)) Hidden else oldTarget
-                    PartiallyExpanded -> when {
-                        newAnchors.hasAnchorFor(PartiallyExpanded) -> PartiallyExpanded
-                        newAnchors.hasAnchorFor(Expanded) -> Expanded
-                        newAnchors.hasAnchorFor(Hidden) -> Hidden
-                        else -> oldTarget
-                    }
-                    Expanded -> when {
-                        newAnchors.hasAnchorFor(Expanded) -> Expanded
-                        newAnchors.hasAnchorFor(PartiallyExpanded) -> PartiallyExpanded
-                        newAnchors.hasAnchorFor(Hidden) -> Hidden
-                        else -> oldTarget
-                    }
-                }
-                return@draggableAnchors newAnchors to newTarget
-            }
-            .anchoredDraggable(
-                state = state.anchoredDraggableState,
-                orientation = orientation,
-                enabled = sheetSwipeEnabled
-            ),
+                .anchoredDraggable(
+                    state = state.anchoredDraggableState,
+                    orientation = orientation,
+                    enabled = sheetSwipeEnabled
+                ),
         shape = shape,
         color = containerColor,
         contentColor = contentColor,
@@ -294,38 +300,37 @@
                 val dismissActionLabel = getString(Strings.BottomSheetDismissDescription)
                 val expandActionLabel = getString(Strings.BottomSheetExpandDescription)
                 Box(
-                    Modifier
-                        .align(CenterHorizontally)
-                        .semantics(mergeDescendants = true) {
-                            with(state) {
-                                // Provides semantics to interact with the bottomsheet if there is more
-                                // than one anchor to swipe to and swiping is enabled.
-                                if (anchoredDraggableState.anchors.size > 1 && sheetSwipeEnabled) {
-                                    if (currentValue == PartiallyExpanded) {
-                                        if (anchoredDraggableState.confirmValueChange(Expanded)) {
-                                            expand(expandActionLabel) {
-                                                scope.launch { expand() }; true
-                                            }
-                                        }
-                                    } else {
-                                        if (anchoredDraggableState.confirmValueChange(
-                                                PartiallyExpanded
-                                            )
-                                        ) {
-                                            collapse(partialExpandActionLabel) {
-                                                scope.launch { partialExpand() }; true
-                                            }
+                    Modifier.align(CenterHorizontally).semantics(mergeDescendants = true) {
+                        with(state) {
+                            // Provides semantics to interact with the bottomsheet if there is more
+                            // than one anchor to swipe to and swiping is enabled.
+                            if (anchoredDraggableState.anchors.size > 1 && sheetSwipeEnabled) {
+                                if (currentValue == PartiallyExpanded) {
+                                    if (anchoredDraggableState.confirmValueChange(Expanded)) {
+                                        expand(expandActionLabel) {
+                                            scope.launch { expand() }
+                                            true
                                         }
                                     }
-                                    if (!state.skipHiddenState) {
-                                        dismiss(dismissActionLabel) {
-                                            scope.launch { hide() }
+                                } else {
+                                    if (
+                                        anchoredDraggableState.confirmValueChange(PartiallyExpanded)
+                                    ) {
+                                        collapse(partialExpandActionLabel) {
+                                            scope.launch { partialExpand() }
                                             true
                                         }
                                     }
                                 }
+                                if (!state.skipHiddenState) {
+                                    dismiss(dismissActionLabel) {
+                                        scope.launch { hide() }
+                                        true
+                                    }
+                                }
                             }
-                        },
+                        }
+                    },
                 ) {
                     dragHandle()
                 }
@@ -349,24 +354,23 @@
     contentColor: Color,
 ) {
     Layout(
-        contents = listOf<@Composable () -> Unit>(
-            topBar ?: { },
-            {
-                Surface(
-                    modifier = modifier,
-                    color = containerColor,
-                    contentColor = contentColor,
-                    content = body
-                )
-            },
-            bottomSheet,
-            snackbarHost
-        )
-    ) { (
-        topBarMeasurables,
-        bodyMeasurables,
-        bottomSheetMeasurables,
-        snackbarHostMeasurables), constraints ->
+        contents =
+            listOf<@Composable () -> Unit>(
+                topBar ?: {},
+                {
+                    Surface(
+                        modifier = modifier,
+                        color = containerColor,
+                        contentColor = contentColor,
+                        content = body
+                    )
+                },
+                bottomSheet,
+                snackbarHost
+            )
+    ) {
+        (topBarMeasurables, bodyMeasurables, bottomSheetMeasurables, snackbarHostMeasurables),
+        constraints ->
         val layoutWidth = constraints.maxWidth
         val layoutHeight = constraints.maxHeight
         val looseConstraints = constraints.copy(minWidth = 0, minHeight = 0)
@@ -388,10 +392,12 @@
             val snackbarWidth = snackbarPlaceables.fastMaxOfOrNull { it.width } ?: 0
             val snackbarHeight = snackbarPlaceables.fastMaxOfOrNull { it.height } ?: 0
             val snackbarOffsetX = (layoutWidth - snackbarWidth) / 2
-            val snackbarOffsetY = when (sheetState.currentValue) {
-                PartiallyExpanded -> sheetOffset().roundToInt() - snackbarHeight
-                Expanded, Hidden -> layoutHeight - snackbarHeight
-            }
+            val snackbarOffsetY =
+                when (sheetState.currentValue) {
+                    PartiallyExpanded -> sheetOffset().roundToInt() - snackbarHeight
+                    Expanded,
+                    Hidden -> layoutHeight - snackbarHeight
+                }
 
             // Placement order is important for elevation
             bodyPlaceables.fastForEach { it.placeRelative(0, topBarHeight) }
diff --git a/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/Button.kt b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/Button.kt
index 1d92252..be50be9 100644
--- a/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/Button.kt
+++ b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/Button.kt
@@ -58,23 +58,25 @@
 import androidx.compose.ui.unit.dp
 
 /**
- * <a href="https://m3.material.io/components/buttons/overview" class="external" target="_blank">Material Design button</a>.
+ * <a href="https://m3.material.io/components/buttons/overview" class="external"
+ * target="_blank">Material Design button</a>.
  *
  * Buttons help people initiate actions, from sending an email, to sharing a document, to liking a
  * post.
  *
- * ![Filled button image](https://developer.android.com/images/reference/androidx/compose/material3/filled-button.png)
+ * ![Filled button
+ * image](https://developer.android.com/images/reference/androidx/compose/material3/filled-button.png)
  *
  * Filled buttons are high-emphasis buttons. Filled buttons have the most visual impact after the
  * [FloatingActionButton], and should be used for important, final actions that complete a flow,
  * like "Save", "Join now", or "Confirm".
  *
  * @sample androidx.compose.material3.samples.ButtonSample
+ *
  * @sample androidx.compose.material3.samples.ButtonWithIconSample
  *
  * Choose the best button for an action based on the amount of emphasis it needs. The more important
  * an action is, the higher emphasis its button should be.
- *
  * - See [OutlinedButton] for a medium-emphasis button with a border.
  * - See [ElevatedButton] for an [OutlinedButton] with a shadow.
  * - See [TextButton] for a low-emphasis button with no border.
@@ -85,22 +87,22 @@
  * @param onClick called when this button is clicked
  * @param modifier the [Modifier] to be applied to this button
  * @param enabled controls the enabled state of this button. When `false`, this component will not
- * respond to user input, and it will appear visually disabled and disabled to accessibility
- * services.
+ *   respond to user input, and it will appear visually disabled and disabled to accessibility
+ *   services.
  * @param shape defines the shape of this button's container, border (when [border] is not null),
- * and shadow (when using [elevation])
+ *   and shadow (when using [elevation])
  * @param colors [ButtonColors] that will be used to resolve the colors for this button in different
- * states. See [ButtonDefaults.buttonColors].
+ *   states. See [ButtonDefaults.buttonColors].
  * @param elevation [ButtonElevation] used to resolve the elevation for this button in different
- * states. This controls the size of the shadow below the button. See
- * [ButtonElevation.shadowElevation].
+ *   states. This controls the size of the shadow below the button. See
+ *   [ButtonElevation.shadowElevation].
  * @param border the border to draw around the container of this button
  * @param contentPadding the spacing values to apply internally between the container and the
- * content
+ *   content
  * @param interactionSource an optional hoisted [MutableInteractionSource] for observing and
- * emitting [Interaction]s for this button. You can use this to change the button's appearance
- * or preview the button in different states. Note that if `null` is provided, interactions will
- * still happen internally.
+ *   emitting [Interaction]s for this button. You can use this to change the button's appearance or
+ *   preview the button in different states. Note that if `null` is provided, interactions will
+ *   still happen internally.
  */
 @Composable
 fun Button(
@@ -133,10 +135,10 @@
     ) {
         ProvideContentColorTextStyle(
             contentColor = contentColor,
-            textStyle = MaterialTheme.typography.labelLarge) {
+            textStyle = MaterialTheme.typography.labelLarge
+        ) {
             Row(
-                Modifier
-                    .defaultMinSize(
+                Modifier.defaultMinSize(
                         minWidth = ButtonDefaults.MinWidth,
                         minHeight = ButtonDefaults.MinHeight
                     )
@@ -150,12 +152,14 @@
 }
 
 /**
- * <a href="https://m3.material.io/components/buttons/overview" class="external" target="_blank">Material Design elevated button</a>.
+ * <a href="https://m3.material.io/components/buttons/overview" class="external"
+ * target="_blank">Material Design elevated button</a>.
  *
  * Buttons help people initiate actions, from sending an email, to sharing a document, to liking a
  * post.
  *
- * ![Elevated button image](https://developer.android.com/images/reference/androidx/compose/material3/elevated-button.png)
+ * ![Elevated button
+ * image](https://developer.android.com/images/reference/androidx/compose/material3/elevated-button.png)
  *
  * Elevated buttons are high-emphasis buttons that are essentially [FilledTonalButton]s with a
  * shadow. To prevent shadow creep, only use them when absolutely necessary, such as when the button
@@ -165,7 +169,6 @@
  *
  * Choose the best button for an action based on the amount of emphasis it needs. The more important
  * an action is, the higher emphasis its button should be.
- *
  * - See [Button] for a high-emphasis button without a shadow, also known as a filled button.
  * - See [FilledTonalButton] for a middle ground between [OutlinedButton] and [Button].
  * - See [OutlinedButton] for a medium-emphasis button with a border.
@@ -176,23 +179,23 @@
  * @param onClick called when this button is clicked
  * @param modifier the [Modifier] to be applied to this button
  * @param enabled controls the enabled state of this button. When `false`, this component will not
- * respond to user input, and it will appear visually disabled and disabled to accessibility
- * services.
+ *   respond to user input, and it will appear visually disabled and disabled to accessibility
+ *   services.
  * @param shape defines the shape of this button's container, border (when [border] is not null),
- * and shadow (when using [elevation])
+ *   and shadow (when using [elevation])
  * @param colors [ButtonColors] that will be used to resolve the colors for this button in different
- * states. See [ButtonDefaults.elevatedButtonColors].
+ *   states. See [ButtonDefaults.elevatedButtonColors].
  * @param elevation [ButtonElevation] used to resolve the elevation for this button in different
- * states. This controls the size of the shadow below the button. Additionally, when the container
- * color is [ColorScheme.surface], this controls the amount of primary color applied as an overlay.
- * See [ButtonDefaults.elevatedButtonElevation].
+ *   states. This controls the size of the shadow below the button. Additionally, when the container
+ *   color is [ColorScheme.surface], this controls the amount of primary color applied as an
+ *   overlay. See [ButtonDefaults.elevatedButtonElevation].
  * @param border the border to draw around the container of this button
  * @param contentPadding the spacing values to apply internally between the container and the
- * content
+ *   content
  * @param interactionSource an optional hoisted [MutableInteractionSource] for observing and
- * emitting [Interaction]s for this button. You can use this to change the button's appearance
- * or preview the button in different states. Note that if `null` is provided, interactions will
- * still happen internally.
+ *   emitting [Interaction]s for this button. You can use this to change the button's appearance or
+ *   preview the button in different states. Note that if `null` is provided, interactions will
+ *   still happen internally.
  */
 @Composable
 fun ElevatedButton(
@@ -221,12 +224,14 @@
     )
 
 /**
- * <a href="https://m3.material.io/components/buttons/overview" class="external" target="_blank">Material Design filled tonal button</a>.
+ * <a href="https://m3.material.io/components/buttons/overview" class="external"
+ * target="_blank">Material Design filled tonal button</a>.
  *
  * Buttons help people initiate actions, from sending an email, to sharing a document, to liking a
  * post.
  *
- * ![Filled tonal button image](https://developer.android.com/images/reference/androidx/compose/material3/filled-tonal-button.png)
+ * ![Filled tonal button
+ * image](https://developer.android.com/images/reference/androidx/compose/material3/filled-tonal-button.png)
  *
  * Filled tonal buttons are medium-emphasis buttons that is an alternative middle ground between
  * default [Button]s (filled) and [OutlinedButton]s. They can be used in contexts where
@@ -237,7 +242,6 @@
  *
  * Choose the best button for an action based on the amount of emphasis it needs. The more important
  * an action is, the higher emphasis its button should be.
- *
  * - See [Button] for a high-emphasis button without a shadow, also known as a filled button.
  * - See [ElevatedButton] for a [FilledTonalButton] with a shadow.
  * - See [OutlinedButton] for a medium-emphasis button with a border.
@@ -248,22 +252,23 @@
  * @param onClick called when this button is clicked
  * @param modifier the [Modifier] to be applied to this button
  * @param enabled controls the enabled state of this button. When `false`, this component will not
- * respond to user input, and it will appear visually disabled and disabled to accessibility
- * services.
+ *   respond to user input, and it will appear visually disabled and disabled to accessibility
+ *   services.
  * @param shape defines the shape of this button's container, border (when [border] is not null),
- * and shadow (when using [elevation])
+ *   and shadow (when using [elevation])
  * @param colors [ButtonColors] that will be used to resolve the colors for this button in different
- * states. See [ButtonDefaults.filledTonalButtonColors].
+ *   states. See [ButtonDefaults.filledTonalButtonColors].
  * @param elevation [ButtonElevation] used to resolve the elevation for this button in different
- * states. This controls the size of the shadow below the button. Additionally, when the container
- * color is [ColorScheme.surface], this controls the amount of primary color applied as an overlay.
+ *   states. This controls the size of the shadow below the button. Additionally, when the container
+ *   color is [ColorScheme.surface], this controls the amount of primary color applied as an
+ *   overlay.
  * @param border the border to draw around the container of this button
  * @param contentPadding the spacing values to apply internally between the container and the
- * content
+ *   content
  * @param interactionSource an optional hoisted [MutableInteractionSource] for observing and
- * emitting [Interaction]s for this button. You can use this to change the button's appearance
- * or preview the button in different states. Note that if `null` is provided, interactions will
- * still happen internally.
+ *   emitting [Interaction]s for this button. You can use this to change the button's appearance or
+ *   preview the button in different states. Note that if `null` is provided, interactions will
+ *   still happen internally.
  */
 @Composable
 fun FilledTonalButton(
@@ -292,12 +297,14 @@
     )
 
 /**
- * <a href="https://m3.material.io/components/buttons/overview" class="external" target="_blank">Material Design outlined button</a>.
+ * <a href="https://m3.material.io/components/buttons/overview" class="external"
+ * target="_blank">Material Design outlined button</a>.
  *
  * Buttons help people initiate actions, from sending an email, to sharing a document, to liking a
  * post.
  *
- * ![Outlined button image](https://developer.android.com/images/reference/androidx/compose/material3/outlined-button.png)
+ * ![Outlined button
+ * image](https://developer.android.com/images/reference/androidx/compose/material3/outlined-button.png)
  *
  * Outlined buttons are medium-emphasis buttons. They contain actions that are important, but are
  * not the primary action in an app. Outlined buttons pair well with [Button]s to indicate an
@@ -307,7 +314,6 @@
  *
  * Choose the best button for an action based on the amount of emphasis it needs. The more important
  * an action is, the higher emphasis its button should be.
- *
  * - See [Button] for a high-emphasis button without a shadow, also known as a filled button.
  * - See [FilledTonalButton] for a middle ground between [OutlinedButton] and [Button].
  * - See [OutlinedButton] for a medium-emphasis button with a border.
@@ -318,22 +324,23 @@
  * @param onClick called when this button is clicked
  * @param modifier the [Modifier] to be applied to this button
  * @param enabled controls the enabled state of this button. When `false`, this component will not
- * respond to user input, and it will appear visually disabled and disabled to accessibility
- * services.
+ *   respond to user input, and it will appear visually disabled and disabled to accessibility
+ *   services.
  * @param shape defines the shape of this button's container, border (when [border] is not null),
- * and shadow (when using [elevation]).
+ *   and shadow (when using [elevation]).
  * @param colors [ButtonColors] that will be used to resolve the colors for this button in different
- * states. See [ButtonDefaults.outlinedButtonColors].
+ *   states. See [ButtonDefaults.outlinedButtonColors].
  * @param elevation [ButtonElevation] used to resolve the elevation for this button in different
- * states. This controls the size of the shadow below the button. Additionally, when the container
- * color is [ColorScheme.surface], this controls the amount of primary color applied as an overlay.
+ *   states. This controls the size of the shadow below the button. Additionally, when the container
+ *   color is [ColorScheme.surface], this controls the amount of primary color applied as an
+ *   overlay.
  * @param border the border to draw around the container of this button. Pass `null` for no border.
  * @param contentPadding the spacing values to apply internally between the container and the
- * content
+ *   content
  * @param interactionSource an optional hoisted [MutableInteractionSource] for observing and
- * emitting [Interaction]s for this button. You can use this to change the button's appearance
- * or preview the button in different states. Note that if `null` is provided, interactions will
- * still happen internally.
+ *   emitting [Interaction]s for this button. You can use this to change the button's appearance or
+ *   preview the button in different states. Note that if `null` is provided, interactions will
+ *   still happen internally.
  */
 @Composable
 fun OutlinedButton(
@@ -362,12 +369,14 @@
     )
 
 /**
- * <a href="https://m3.material.io/components/buttons/overview" class="external" target="_blank">Material Design text button</a>.
+ * <a href="https://m3.material.io/components/buttons/overview" class="external"
+ * target="_blank">Material Design text button</a>.
  *
  * Buttons help people initiate actions, from sending an email, to sharing a document, to liking a
  * post.
  *
- * ![Text button image](https://developer.android.com/images/reference/androidx/compose/material3/text-button.png)
+ * ![Text button
+ * image](https://developer.android.com/images/reference/androidx/compose/material3/text-button.png)
  *
  * Text buttons are typically used for less-pronounced actions, including those located in dialogs
  * and cards. In cards, text buttons help maintain an emphasis on card content. Text buttons are
@@ -377,7 +386,6 @@
  *
  * Choose the best button for an action based on the amount of emphasis it needs. The more important
  * an action is, the higher emphasis its button should be.
- *
  * - See [Button] for a high-emphasis button without a shadow, also known as a filled button.
  * - See [ElevatedButton] for a [FilledTonalButton] with a shadow.
  * - See [FilledTonalButton] for a middle ground between [OutlinedButton] and [Button].
@@ -388,24 +396,24 @@
  * @param onClick called when this button is clicked
  * @param modifier the [Modifier] to be applied to this button
  * @param enabled controls the enabled state of this button. When `false`, this component will not
- * respond to user input, and it will appear visually disabled and disabled to accessibility
- * services.
+ *   respond to user input, and it will appear visually disabled and disabled to accessibility
+ *   services.
  * @param shape defines the shape of this button's container, border (when [border] is not null),
- * and shadow (when using [elevation])
+ *   and shadow (when using [elevation])
  * @param colors [ButtonColors] that will be used to resolve the colors for this button in different
- * states. See [ButtonDefaults.textButtonColors].
+ *   states. See [ButtonDefaults.textButtonColors].
  * @param elevation [ButtonElevation] used to resolve the elevation for this button in different
- * states. This controls the size of the shadow below the button. Additionally, when the container
- * color is [ColorScheme.surface], this controls the amount of primary color applied as an overlay.
- * A TextButton typically has no elevation, and the default value is `null`. See [ElevatedButton]
- * for a button with elevation.
+ *   states. This controls the size of the shadow below the button. Additionally, when the container
+ *   color is [ColorScheme.surface], this controls the amount of primary color applied as an
+ *   overlay. A TextButton typically has no elevation, and the default value is `null`. See
+ *   [ElevatedButton] for a button with elevation.
  * @param border the border to draw around the container of this button
  * @param contentPadding the spacing values to apply internally between the container and the
- * content
+ *   content
  * @param interactionSource an optional hoisted [MutableInteractionSource] for observing and
- * emitting [Interaction]s for this button. You can use this to change the button's appearance
- * or preview the button in different states. Note that if `null` is provided, interactions will
- * still happen internally.
+ *   emitting [Interaction]s for this button. You can use this to change the button's appearance or
+ *   preview the button in different states. Note that if `null` is provided, interactions will
+ *   still happen internally.
  */
 @Composable
 fun TextButton(
@@ -445,11 +453,12 @@
  * A default value that applies only to [Button], [ElevatedButton], [FilledTonalButton], and
  * [OutlinedButton] is [ContentPadding].
  *
- * Default values that apply only to [Button] are [buttonColors] and [buttonElevation].
- * Default values that apply only to [ElevatedButton] are [elevatedButtonColors] and [elevatedButtonElevation].
- * Default values that apply only to [FilledTonalButton] are [filledTonalButtonColors] and [filledTonalButtonElevation].
- * A default value that applies only to [OutlinedButton] is [outlinedButtonColors].
- * Default values that apply only to [TextButton] are [TextButtonContentPadding] and [textButtonColors].
+ * Default values that apply only to [Button] are [buttonColors] and [buttonElevation]. Default
+ * values that apply only to [ElevatedButton] are [elevatedButtonColors] and
+ * [elevatedButtonElevation]. Default values that apply only to [FilledTonalButton] are
+ * [filledTonalButtonColors] and [filledTonalButtonElevation]. A default value that applies only to
+ * [OutlinedButton] is [outlinedButtonColors]. Default values that apply only to [TextButton] are
+ * [TextButtonContentPadding] and [textButtonColors].
  */
 object ButtonDefaults {
 
@@ -459,11 +468,10 @@
     /**
      * The default content padding used by [Button], [ElevatedButton], [FilledTonalButton], and
      * [OutlinedButton] buttons.
-     *
      * - See [TextButtonContentPadding] or [TextButtonWithIconContentPadding] for content padding
-     *  used by [TextButton].
+     *   used by [TextButton].
      * - See [ButtonWithIconContentPadding] for content padding used by [Button] that contains
-     * [Icon].
+     *   [Icon].
      */
     val ContentPadding =
         PaddingValues(
@@ -486,10 +494,10 @@
 
     private val TextButtonHorizontalPadding = 12.dp
 
-    /** The default content padding used by [TextButton].
-     *
+    /**
+     * The default content padding used by [TextButton].
      * - See [TextButtonWithIconContentPadding] for content padding used by [TextButton] that
-     * contains [Icon].
+     *   contains [Icon].
      */
     val TextButtonContentPadding =
         PaddingValues(
@@ -531,26 +539,30 @@
     val IconSpacing = 8.dp
 
     /** Default shape for a button. */
-    val shape: Shape @Composable get() = FilledButtonTokens.ContainerShape.value
+    val shape: Shape
+        @Composable get() = FilledButtonTokens.ContainerShape.value
 
     /** Default shape for an elevated button. */
-    val elevatedShape: Shape @Composable get() = ElevatedButtonTokens.ContainerShape.value
+    val elevatedShape: Shape
+        @Composable get() = ElevatedButtonTokens.ContainerShape.value
 
     /** Default shape for a filled tonal button. */
-    val filledTonalShape: Shape @Composable get() = FilledTonalButtonTokens.ContainerShape.value
+    val filledTonalShape: Shape
+        @Composable get() = FilledTonalButtonTokens.ContainerShape.value
 
     /** Default shape for an outlined button. */
-    val outlinedShape: Shape @Composable get() = OutlinedButtonTokens.ContainerShape.value
+    val outlinedShape: Shape
+        @Composable get() = OutlinedButtonTokens.ContainerShape.value
 
     /** Default shape for a text button. */
-    val textShape: Shape @Composable get() = TextButtonTokens.ContainerShape.value
+    val textShape: Shape
+        @Composable get() = TextButtonTokens.ContainerShape.value
 
     /**
      * Creates a [ButtonColors] that represents the default container and content colors used in a
      * [Button].
      */
-    @Composable
-    fun buttonColors() = MaterialTheme.colorScheme.defaultButtonColors
+    @Composable fun buttonColors() = MaterialTheme.colorScheme.defaultButtonColors
 
     /**
      * Creates a [ButtonColors] that represents the default container and content colors used in a
@@ -567,35 +579,37 @@
         contentColor: Color = Color.Unspecified,
         disabledContainerColor: Color = Color.Unspecified,
         disabledContentColor: Color = Color.Unspecified,
-    ): ButtonColors = MaterialTheme.colorScheme.defaultButtonColors.copy(
-        containerColor = containerColor,
-        contentColor = contentColor,
-        disabledContainerColor = disabledContainerColor,
-        disabledContentColor = disabledContentColor
-    )
+    ): ButtonColors =
+        MaterialTheme.colorScheme.defaultButtonColors.copy(
+            containerColor = containerColor,
+            contentColor = contentColor,
+            disabledContainerColor = disabledContainerColor,
+            disabledContentColor = disabledContentColor
+        )
 
     internal val ColorScheme.defaultButtonColors: ButtonColors
         get() {
-            return defaultButtonColorsCached ?: ButtonColors(
-                containerColor = fromToken(FilledButtonTokens.ContainerColor),
-                contentColor = fromToken(FilledButtonTokens.LabelTextColor),
-                disabledContainerColor = fromToken(FilledButtonTokens.DisabledContainerColor)
-                    .copy(alpha = FilledButtonTokens.DisabledContainerOpacity),
-                disabledContentColor = fromToken(FilledButtonTokens.DisabledLabelTextColor)
-                    .copy(alpha = FilledButtonTokens.DisabledLabelTextOpacity)
-            ).also {
-                defaultButtonColorsCached = it
-            }
+            return defaultButtonColorsCached
+                ?: ButtonColors(
+                        containerColor = fromToken(FilledButtonTokens.ContainerColor),
+                        contentColor = fromToken(FilledButtonTokens.LabelTextColor),
+                        disabledContainerColor =
+                            fromToken(FilledButtonTokens.DisabledContainerColor)
+                                .copy(alpha = FilledButtonTokens.DisabledContainerOpacity),
+                        disabledContentColor =
+                            fromToken(FilledButtonTokens.DisabledLabelTextColor)
+                                .copy(alpha = FilledButtonTokens.DisabledLabelTextOpacity)
+                    )
+                    .also { defaultButtonColorsCached = it }
         }
 
     /**
      * Creates a [ButtonColors] that represents the default container and content colors used in an
      * [ElevatedButton].
      */
-    @Composable
-    fun elevatedButtonColors() = MaterialTheme.colorScheme.defaultElevatedButtonColors
+    @Composable fun elevatedButtonColors() = MaterialTheme.colorScheme.defaultElevatedButtonColors
 
-/**
+    /**
      * Creates a [ButtonColors] that represents the default container and content colors used in an
      * [ElevatedButton].
      *
@@ -610,25 +624,28 @@
         contentColor: Color = Color.Unspecified,
         disabledContainerColor: Color = Color.Unspecified,
         disabledContentColor: Color = Color.Unspecified,
-    ): ButtonColors = MaterialTheme.colorScheme.defaultElevatedButtonColors.copy(
-        containerColor = containerColor,
-        contentColor = contentColor,
-        disabledContainerColor = disabledContainerColor,
-        disabledContentColor = disabledContentColor
-    )
+    ): ButtonColors =
+        MaterialTheme.colorScheme.defaultElevatedButtonColors.copy(
+            containerColor = containerColor,
+            contentColor = contentColor,
+            disabledContainerColor = disabledContainerColor,
+            disabledContentColor = disabledContentColor
+        )
 
     internal val ColorScheme.defaultElevatedButtonColors: ButtonColors
         get() {
-            return defaultElevatedButtonColorsCached ?: ButtonColors(
-                containerColor = fromToken(ElevatedButtonTokens.ContainerColor),
-                contentColor = fromToken(ElevatedButtonTokens.LabelTextColor),
-                disabledContainerColor = fromToken(ElevatedButtonTokens.DisabledContainerColor)
-                    .copy(alpha = ElevatedButtonTokens.DisabledContainerOpacity),
-                disabledContentColor = fromToken(ElevatedButtonTokens.DisabledLabelTextColor)
-                    .copy(alpha = ElevatedButtonTokens.DisabledLabelTextOpacity)
-            ).also {
-                defaultElevatedButtonColorsCached = it
-            }
+            return defaultElevatedButtonColorsCached
+                ?: ButtonColors(
+                        containerColor = fromToken(ElevatedButtonTokens.ContainerColor),
+                        contentColor = fromToken(ElevatedButtonTokens.LabelTextColor),
+                        disabledContainerColor =
+                            fromToken(ElevatedButtonTokens.DisabledContainerColor)
+                                .copy(alpha = ElevatedButtonTokens.DisabledContainerOpacity),
+                        disabledContentColor =
+                            fromToken(ElevatedButtonTokens.DisabledLabelTextColor)
+                                .copy(alpha = ElevatedButtonTokens.DisabledLabelTextOpacity)
+                    )
+                    .also { defaultElevatedButtonColorsCached = it }
         }
 
     /**
@@ -644,7 +661,8 @@
      *
      * @param containerColor the container color of this [FilledTonalButton] when enabled
      * @param contentColor the content color of this [FilledTonalButton] when enabled
-     * @param disabledContainerColor the container color of this [FilledTonalButton] when not enabled
+     * @param disabledContainerColor the container color of this [FilledTonalButton] when not
+     *   enabled
      * @param disabledContentColor the content color of this [FilledTonalButton] when not enabled
      */
     @Composable
@@ -653,33 +671,35 @@
         contentColor: Color = Color.Unspecified,
         disabledContainerColor: Color = Color.Unspecified,
         disabledContentColor: Color = Color.Unspecified,
-    ): ButtonColors = MaterialTheme.colorScheme.defaultFilledTonalButtonColors.copy(
-        containerColor = containerColor,
-        contentColor = contentColor,
-        disabledContainerColor = disabledContainerColor,
-        disabledContentColor = disabledContentColor
-    )
+    ): ButtonColors =
+        MaterialTheme.colorScheme.defaultFilledTonalButtonColors.copy(
+            containerColor = containerColor,
+            contentColor = contentColor,
+            disabledContainerColor = disabledContainerColor,
+            disabledContentColor = disabledContentColor
+        )
 
     internal val ColorScheme.defaultFilledTonalButtonColors: ButtonColors
         get() {
-            return defaultFilledTonalButtonColorsCached ?: ButtonColors(
-                containerColor = fromToken(FilledTonalButtonTokens.ContainerColor),
-                contentColor = fromToken(FilledTonalButtonTokens.LabelTextColor),
-                disabledContainerColor = fromToken(FilledTonalButtonTokens.DisabledContainerColor)
-                    .copy(alpha = FilledTonalButtonTokens.DisabledContainerOpacity),
-                disabledContentColor = fromToken(FilledTonalButtonTokens.DisabledLabelTextColor)
-                    .copy(alpha = FilledTonalButtonTokens.DisabledLabelTextOpacity)
-            ).also {
-                defaultFilledTonalButtonColorsCached = it
-            }
+            return defaultFilledTonalButtonColorsCached
+                ?: ButtonColors(
+                        containerColor = fromToken(FilledTonalButtonTokens.ContainerColor),
+                        contentColor = fromToken(FilledTonalButtonTokens.LabelTextColor),
+                        disabledContainerColor =
+                            fromToken(FilledTonalButtonTokens.DisabledContainerColor)
+                                .copy(alpha = FilledTonalButtonTokens.DisabledContainerOpacity),
+                        disabledContentColor =
+                            fromToken(FilledTonalButtonTokens.DisabledLabelTextColor)
+                                .copy(alpha = FilledTonalButtonTokens.DisabledLabelTextOpacity)
+                    )
+                    .also { defaultFilledTonalButtonColorsCached = it }
         }
 
     /**
      * Creates a [ButtonColors] that represents the default container and content colors used in an
      * [OutlinedButton].
      */
-    @Composable
-    fun outlinedButtonColors() = MaterialTheme.colorScheme.defaultOutlinedButtonColors
+    @Composable fun outlinedButtonColors() = MaterialTheme.colorScheme.defaultOutlinedButtonColors
 
     /**
      * Creates a [ButtonColors] that represents the default container and content colors used in an
@@ -696,34 +716,35 @@
         contentColor: Color = Color.Unspecified,
         disabledContainerColor: Color = Color.Unspecified,
         disabledContentColor: Color = Color.Unspecified,
-    ): ButtonColors = MaterialTheme.colorScheme.defaultOutlinedButtonColors.copy(
-        containerColor = containerColor,
-        contentColor = contentColor,
-        disabledContainerColor = disabledContainerColor,
-        disabledContentColor = disabledContentColor
-    )
+    ): ButtonColors =
+        MaterialTheme.colorScheme.defaultOutlinedButtonColors.copy(
+            containerColor = containerColor,
+            contentColor = contentColor,
+            disabledContainerColor = disabledContainerColor,
+            disabledContentColor = disabledContentColor
+        )
 
     internal val ColorScheme.defaultOutlinedButtonColors: ButtonColors
         get() {
-            return defaultOutlinedButtonColorsCached ?: ButtonColors(
-                containerColor = Color.Transparent,
-                contentColor = fromToken(OutlinedButtonTokens.LabelTextColor),
-                disabledContainerColor = Color.Transparent,
-                disabledContentColor = fromToken(OutlinedButtonTokens.DisabledLabelTextColor)
-                    .copy(alpha = OutlinedButtonTokens.DisabledLabelTextOpacity)
-            ).also {
-                defaultOutlinedButtonColorsCached = it
-            }
+            return defaultOutlinedButtonColorsCached
+                ?: ButtonColors(
+                        containerColor = Color.Transparent,
+                        contentColor = fromToken(OutlinedButtonTokens.LabelTextColor),
+                        disabledContainerColor = Color.Transparent,
+                        disabledContentColor =
+                            fromToken(OutlinedButtonTokens.DisabledLabelTextColor)
+                                .copy(alpha = OutlinedButtonTokens.DisabledLabelTextOpacity)
+                    )
+                    .also { defaultOutlinedButtonColorsCached = it }
         }
 
     /**
      * Creates a [ButtonColors] that represents the default container and content colors used in a
      * [TextButton].
      */
-    @Composable
-    fun textButtonColors() = MaterialTheme.colorScheme.defaultTextButtonColors
+    @Composable fun textButtonColors() = MaterialTheme.colorScheme.defaultTextButtonColors
 
-/**
+    /**
      * Creates a [ButtonColors] that represents the default container and content colors used in a
      * [TextButton].
      *
@@ -738,24 +759,26 @@
         contentColor: Color = Color.Unspecified,
         disabledContainerColor: Color = Color.Unspecified,
         disabledContentColor: Color = Color.Unspecified,
-    ): ButtonColors = MaterialTheme.colorScheme.defaultTextButtonColors.copy(
-        containerColor = containerColor,
-        contentColor = contentColor,
-        disabledContainerColor = disabledContainerColor,
-        disabledContentColor = disabledContentColor
-    )
+    ): ButtonColors =
+        MaterialTheme.colorScheme.defaultTextButtonColors.copy(
+            containerColor = containerColor,
+            contentColor = contentColor,
+            disabledContainerColor = disabledContainerColor,
+            disabledContentColor = disabledContentColor
+        )
 
     internal val ColorScheme.defaultTextButtonColors: ButtonColors
         get() {
-            return defaultTextButtonColorsCached ?: ButtonColors(
-                containerColor = Color.Transparent,
-                contentColor = fromToken(TextButtonTokens.LabelTextColor),
-                disabledContainerColor = Color.Transparent,
-                disabledContentColor = fromToken(TextButtonTokens.DisabledLabelTextColor)
-                    .copy(alpha = TextButtonTokens.DisabledLabelTextOpacity)
-            ).also {
-                defaultTextButtonColorsCached = it
-            }
+            return defaultTextButtonColorsCached
+                ?: ButtonColors(
+                        containerColor = Color.Transparent,
+                        contentColor = fromToken(TextButtonTokens.LabelTextColor),
+                        disabledContainerColor = Color.Transparent,
+                        disabledContentColor =
+                            fromToken(TextButtonTokens.DisabledLabelTextColor)
+                                .copy(alpha = TextButtonTokens.DisabledLabelTextOpacity)
+                    )
+                    .also { defaultTextButtonColorsCached = it }
         }
 
     /**
@@ -763,7 +786,7 @@
      * Material specification for a [Button].
      *
      * @param defaultElevation the elevation used when the [Button] is enabled, and has no other
-     * [Interaction]s.
+     *   [Interaction]s.
      * @param pressedElevation the elevation used when this [Button] is enabled and pressed.
      * @param focusedElevation the elevation used when the [Button] is enabled and focused.
      * @param hoveredElevation the elevation used when the [Button] is enabled and hovered.
@@ -776,20 +799,21 @@
         focusedElevation: Dp = FilledButtonTokens.FocusContainerElevation,
         hoveredElevation: Dp = FilledButtonTokens.HoverContainerElevation,
         disabledElevation: Dp = FilledButtonTokens.DisabledContainerElevation,
-    ): ButtonElevation = ButtonElevation(
-        defaultElevation = defaultElevation,
-        pressedElevation = pressedElevation,
-        focusedElevation = focusedElevation,
-        hoveredElevation = hoveredElevation,
-        disabledElevation = disabledElevation,
-    )
+    ): ButtonElevation =
+        ButtonElevation(
+            defaultElevation = defaultElevation,
+            pressedElevation = pressedElevation,
+            focusedElevation = focusedElevation,
+            hoveredElevation = hoveredElevation,
+            disabledElevation = disabledElevation,
+        )
 
     /**
      * Creates a [ButtonElevation] that will animate between the provided values according to the
      * Material specification for a [ElevatedButton].
      *
      * @param defaultElevation the elevation used when the [ElevatedButton] is enabled, and has no
-     * other [Interaction]s.
+     *   other [Interaction]s.
      * @param pressedElevation the elevation used when this [ElevatedButton] is enabled and pressed.
      * @param focusedElevation the elevation used when the [ElevatedButton] is enabled and focused.
      * @param hoveredElevation the elevation used when the [ElevatedButton] is enabled and hovered.
@@ -802,24 +826,27 @@
         focusedElevation: Dp = ElevatedButtonTokens.FocusContainerElevation,
         hoveredElevation: Dp = ElevatedButtonTokens.HoverContainerElevation,
         disabledElevation: Dp = ElevatedButtonTokens.DisabledContainerElevation
-    ): ButtonElevation = ButtonElevation(
-        defaultElevation = defaultElevation,
-        pressedElevation = pressedElevation,
-        focusedElevation = focusedElevation,
-        hoveredElevation = hoveredElevation,
-        disabledElevation = disabledElevation
-    )
+    ): ButtonElevation =
+        ButtonElevation(
+            defaultElevation = defaultElevation,
+            pressedElevation = pressedElevation,
+            focusedElevation = focusedElevation,
+            hoveredElevation = hoveredElevation,
+            disabledElevation = disabledElevation
+        )
 
     /**
      * Creates a [ButtonElevation] that will animate between the provided values according to the
      * Material specification for a [FilledTonalButton].
      *
-     * @param defaultElevation the elevation used when the [FilledTonalButton] is enabled, and has no
-     * other [Interaction]s.
+     * @param defaultElevation the elevation used when the [FilledTonalButton] is enabled, and has
+     *   no other [Interaction]s.
      * @param pressedElevation the elevation used when this [FilledTonalButton] is enabled and
-     * pressed.
-     * @param focusedElevation the elevation used when the [FilledTonalButton] is enabled and focused.
-     * @param hoveredElevation the elevation used when the [FilledTonalButton] is enabled and hovered.
+     *   pressed.
+     * @param focusedElevation the elevation used when the [FilledTonalButton] is enabled and
+     *   focused.
+     * @param hoveredElevation the elevation used when the [FilledTonalButton] is enabled and
+     *   hovered.
      * @param disabledElevation the elevation used when the [FilledTonalButton] is not enabled.
      */
     @Composable
@@ -829,28 +856,32 @@
         focusedElevation: Dp = FilledTonalButtonTokens.FocusContainerElevation,
         hoveredElevation: Dp = FilledTonalButtonTokens.HoverContainerElevation,
         disabledElevation: Dp = 0.dp
-    ): ButtonElevation = ButtonElevation(
-        defaultElevation = defaultElevation,
-        pressedElevation = pressedElevation,
-        focusedElevation = focusedElevation,
-        hoveredElevation = hoveredElevation,
-        disabledElevation = disabledElevation
-    )
+    ): ButtonElevation =
+        ButtonElevation(
+            defaultElevation = defaultElevation,
+            pressedElevation = pressedElevation,
+            focusedElevation = focusedElevation,
+            hoveredElevation = hoveredElevation,
+            disabledElevation = disabledElevation
+        )
 
     /** The default [BorderStroke] used by [OutlinedButton]. */
     val outlinedButtonBorder: BorderStroke
         @Composable
         @Deprecated(
-            message = "Please use the version that takes an `enabled` param to get the " +
-                "`BorderStroke` with the correct opacity",
+            message =
+                "Please use the version that takes an `enabled` param to get the " +
+                    "`BorderStroke` with the correct opacity",
             replaceWith = ReplaceWith("outlinedButtonBorder(enabled)")
         )
-        get() = BorderStroke(
-            width = OutlinedButtonTokens.OutlineWidth,
-            color = OutlinedButtonTokens.OutlineColor.value,
-        )
+        get() =
+            BorderStroke(
+                width = OutlinedButtonTokens.OutlineWidth,
+                color = OutlinedButtonTokens.OutlineColor.value,
+            )
 
-    /** The default [BorderStroke] used by [OutlinedButton].
+    /**
+     * The default [BorderStroke] used by [OutlinedButton].
      *
      * @param enabled whether the button is enabled
      */
@@ -858,25 +889,26 @@
     fun outlinedButtonBorder(enabled: Boolean = true): BorderStroke =
         BorderStroke(
             width = OutlinedButtonTokens.OutlineWidth,
-            color = if (enabled) {
-                OutlinedButtonTokens.OutlineColor.value
-            } else {
-                OutlinedButtonTokens.OutlineColor.value.copy(
-                    alpha = OutlinedButtonTokens.DisabledOutlineOpacity
-                )
-            }
+            color =
+                if (enabled) {
+                    OutlinedButtonTokens.OutlineColor.value
+                } else {
+                    OutlinedButtonTokens.OutlineColor.value.copy(
+                        alpha = OutlinedButtonTokens.DisabledOutlineOpacity
+                    )
+                }
         )
 }
 
 /**
  * Represents the elevation for a button in different states.
- *
  * - See [ButtonDefaults.buttonElevation] for the default elevation used in a [Button].
  * - See [ButtonDefaults.elevatedButtonElevation] for the default elevation used in a
- * [ElevatedButton].
+ *   [ElevatedButton].
  */
 @Stable
-class ButtonElevation internal constructor(
+class ButtonElevation
+internal constructor(
     private val defaultElevation: Dp,
     private val pressedElevation: Dp,
     private val focusedElevation: Dp,
@@ -912,27 +944,21 @@
                     is HoverInteraction.Enter -> {
                         interactions.add(interaction)
                     }
-
                     is HoverInteraction.Exit -> {
                         interactions.remove(interaction.enter)
                     }
-
                     is FocusInteraction.Focus -> {
                         interactions.add(interaction)
                     }
-
                     is FocusInteraction.Unfocus -> {
                         interactions.remove(interaction.focus)
                     }
-
                     is PressInteraction.Press -> {
                         interactions.add(interaction)
                     }
-
                     is PressInteraction.Release -> {
                         interactions.remove(interaction.press)
                     }
-
                     is PressInteraction.Cancel -> {
                         interactions.remove(interaction.press)
                     }
@@ -962,12 +988,13 @@
                     // No transition when moving to a disabled state
                     animatable.snapTo(target)
                 } else {
-                    val lastInteraction = when (animatable.targetValue) {
-                        pressedElevation -> PressInteraction.Press(Offset.Zero)
-                        hoveredElevation -> HoverInteraction.Enter()
-                        focusedElevation -> FocusInteraction.Focus()
-                        else -> null
-                    }
+                    val lastInteraction =
+                        when (animatable.targetValue) {
+                            pressedElevation -> PressInteraction.Press(Offset.Zero)
+                            hoveredElevation -> HoverInteraction.Enter()
+                            focusedElevation -> FocusInteraction.Focus()
+                            else -> null
+                        }
                     animatable.animateElevation(
                         from = lastInteraction,
                         to = interaction,
@@ -1006,37 +1033,39 @@
 /**
  * Represents the container and content colors used in a button in different states.
  *
- *  @constructor create an instance with arbitrary colors.
- * - See [ButtonDefaults.buttonColors] for the default colors used in a [Button].
- * - See [ButtonDefaults.elevatedButtonColors] for the default colors used in a [ElevatedButton].
- * - See [ButtonDefaults.textButtonColors] for the default colors used in a [TextButton].
  * @param containerColor the container color of this [Button] when enabled.
  * @param contentColor the content color of this [Button] when enabled.
  * @param disabledContainerColor the container color of this [Button] when not enabled.
  * @param disabledContentColor the content color of this [Button] when not enabled.
+ *     @constructor create an instance with arbitrary colors.
+ * - See [ButtonDefaults.buttonColors] for the default colors used in a [Button].
+ * - See [ButtonDefaults.elevatedButtonColors] for the default colors used in a [ElevatedButton].
+ * - See [ButtonDefaults.textButtonColors] for the default colors used in a [TextButton].
  */
 @Immutable
-class ButtonColors constructor(
+class ButtonColors
+constructor(
     val containerColor: Color,
     val contentColor: Color,
     val disabledContainerColor: Color,
     val disabledContentColor: Color,
 ) {
     /**
-     * Returns a copy of this ButtonColors, optionally overriding some of the values.
-     * This uses the Color.Unspecified to mean “use the value from the source”
+     * Returns a copy of this ButtonColors, optionally overriding some of the values. This uses the
+     * Color.Unspecified to mean “use the value from the source”
      */
     fun copy(
         containerColor: Color = this.containerColor,
         contentColor: Color = this.contentColor,
         disabledContainerColor: Color = this.disabledContainerColor,
         disabledContentColor: Color = this.disabledContentColor
-    ) = ButtonColors(
-        containerColor.takeOrElse { this.containerColor },
-        contentColor.takeOrElse { this.contentColor },
-        disabledContainerColor.takeOrElse { this.disabledContainerColor },
-        disabledContentColor.takeOrElse { this.disabledContentColor },
-    )
+    ) =
+        ButtonColors(
+            containerColor.takeOrElse { this.containerColor },
+            contentColor.takeOrElse { this.contentColor },
+            disabledContainerColor.takeOrElse { this.disabledContainerColor },
+            disabledContentColor.takeOrElse { this.disabledContentColor },
+        )
 
     /**
      * Represents the container color for this button, depending on [enabled].
diff --git a/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/CalendarLocale.kt b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/CalendarLocale.kt
index 679e371..a2f657c 100644
--- a/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/CalendarLocale.kt
+++ b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/CalendarLocale.kt
@@ -25,8 +25,7 @@
  *
  * Note: For JVM based platforms, this would be equivalent to [java.util.Locale].
  */
-@ExperimentalMaterial3Api
-expect class CalendarLocale
+@ExperimentalMaterial3Api expect class CalendarLocale
 
 /**
  * Returns the default [CalendarLocale].
@@ -41,15 +40,15 @@
 /**
  * Returns a string representation of an integer for the current Locale.
  *
- * @param minDigits sets the minimum number of digits allowed in the integer portion of a number.
- * If the minDigits value is greater than the [maxDigits] value, then [maxDigits] will also be set
- * to this value.
- * @param maxDigits sets the maximum number of digits allowed in the integer portion of a number.
- * If this maxDigits value is less than the [minDigits] value, then [minDigits] will also be set to
- * this value.
+ * @param minDigits sets the minimum number of digits allowed in the integer portion of a number. If
+ *   the minDigits value is greater than the [maxDigits] value, then [maxDigits] will also be set to
+ *   this value.
+ * @param maxDigits sets the maximum number of digits allowed in the integer portion of a number. If
+ *   this maxDigits value is less than the [minDigits] value, then [minDigits] will also be set to
+ *   this value.
  * @param isGroupingUsed set whether or not grouping will be used when formatting into a local
- * string. By default, this value is false, which eliminates any use of delimiters when formatting
- * the integer.
+ *   string. By default, this value is false, which eliminates any use of delimiters when formatting
+ *   the integer.
  */
 internal expect fun Int.toLocalString(
     minDigits: Int = 1,
diff --git a/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/Card.kt b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/Card.kt
index f0859aa..10cdb88 100644
--- a/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/Card.kt
+++ b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/Card.kt
@@ -49,7 +49,8 @@
 import androidx.compose.ui.unit.Dp
 
 /**
- * <a href="https://m3.material.io/components/cards/overview" class="external" target="_blank">Material Design filled card</a>.
+ * <a href="https://m3.material.io/components/cards/overview" class="external"
+ * target="_blank">Material Design filled card</a>.
  *
  * Cards contain contain content and actions that relate information about a subject. Filled cards
  * provide subtle separation from the background. This has less emphasis than elevated or outlined
@@ -58,20 +59,22 @@
  * This Card does not handle input events - see the other Card overloads if you want a clickable or
  * selectable Card.
  *
- * ![Filled card image](https://developer.android.com/images/reference/androidx/compose/material3/filled-card.png)
+ * ![Filled card
+ * image](https://developer.android.com/images/reference/androidx/compose/material3/filled-card.png)
  *
  * Card sample:
+ *
  * @sample androidx.compose.material3.samples.CardSample
  *
  * @param modifier the [Modifier] to be applied to this card
  * @param shape defines the shape of this card's container, border (when [border] is not null), and
- * shadow (when using [elevation])
+ *   shadow (when using [elevation])
  * @param colors [CardColors] that will be used to resolve the colors used for this card in
- * different states. See [CardDefaults.cardColors].
+ *   different states. See [CardDefaults.cardColors].
  * @param elevation [CardElevation] used to resolve the elevation for this card in different states.
- * This controls the size of the shadow below the card. Additionally, when the container color is
- * [ColorScheme.surface], this controls the amount of primary color applied as an overlay. See also:
- * [Surface].
+ *   This controls the size of the shadow below the card. Additionally, when the container color is
+ *   [ColorScheme.surface], this controls the amount of primary color applied as an overlay. See
+ *   also: [Surface].
  * @param border the border to draw around the container of this card
  */
 @Composable
@@ -96,7 +99,8 @@
 }
 
 /**
- * <a href="https://m3.material.io/components/cards/overview" class="external" target="_blank">Material Design filled card</a>.
+ * <a href="https://m3.material.io/components/cards/overview" class="external"
+ * target="_blank">Material Design filled card</a>.
  *
  * Cards contain contain content and actions that relate information about a subject. Filled cards
  * provide subtle separation from the background. This has less emphasis than elevated or outlined
@@ -104,29 +108,31 @@
  *
  * This Card handles click events, calling its [onClick] lambda.
  *
- * ![Filled card image](https://developer.android.com/images/reference/androidx/compose/material3/filled-card.png)
+ * ![Filled card
+ * image](https://developer.android.com/images/reference/androidx/compose/material3/filled-card.png)
  *
  * Clickable card sample:
+ *
  * @sample androidx.compose.material3.samples.ClickableCardSample
  *
  * @param onClick called when this card is clicked
  * @param modifier the [Modifier] to be applied to this card
  * @param enabled controls the enabled state of this card. When `false`, this component will not
- * respond to user input, and it will appear visually disabled and disabled to accessibility
- * services.
+ *   respond to user input, and it will appear visually disabled and disabled to accessibility
+ *   services.
  * @param shape defines the shape of this card's container, border (when [border] is not null), and
- * shadow (when using [elevation])
+ *   shadow (when using [elevation])
  * @param colors [CardColors] that will be used to resolve the color(s) used for this card in
- * different states. See [CardDefaults.cardColors].
+ *   different states. See [CardDefaults.cardColors].
  * @param elevation [CardElevation] used to resolve the elevation for this card in different states.
- * This controls the size of the shadow below the card. Additionally, when the container color is
- * [ColorScheme.surface], this controls the amount of primary color applied as an overlay. See also:
- * [Surface].
+ *   This controls the size of the shadow below the card. Additionally, when the container color is
+ *   [ColorScheme.surface], this controls the amount of primary color applied as an overlay. See
+ *   also: [Surface].
  * @param border the border to draw around the container of this card
  * @param interactionSource an optional hoisted [MutableInteractionSource] for observing and
- * emitting [Interaction]s for this card. You can use this to change the card's appearance
- * or preview the card in different states. Note that if `null` is provided, interactions will
- * still happen internally.
+ *   emitting [Interaction]s for this card. You can use this to change the card's appearance or
+ *   preview the card in different states. Note that if `null` is provided, interactions will still
+ *   happen internally.
  */
 @Composable
 fun Card(
@@ -158,28 +164,31 @@
 }
 
 /**
- * <a href="https://m3.material.io/components/cards/overview" class="external" target="_blank">Material Design elevated card</a>.
+ * <a href="https://m3.material.io/components/cards/overview" class="external"
+ * target="_blank">Material Design elevated card</a>.
  *
  * Elevated cards contain content and actions that relate information about a subject. They have a
  * drop shadow, providing more separation from the background than filled cards, but less than
  * outlined cards.
  *
- * This ElevatedCard does not handle input events - see the other ElevatedCard overloads if you
- * want a clickable or selectable ElevatedCard.
+ * This ElevatedCard does not handle input events - see the other ElevatedCard overloads if you want
+ * a clickable or selectable ElevatedCard.
  *
- * ![Elevated card image](https://developer.android.com/images/reference/androidx/compose/material3/elevated-card.png)
+ * ![Elevated card
+ * image](https://developer.android.com/images/reference/androidx/compose/material3/elevated-card.png)
  *
  * Elevated card sample:
+ *
  * @sample androidx.compose.material3.samples.ElevatedCardSample
  *
  * @param modifier the [Modifier] to be applied to this card
  * @param shape defines the shape of this card's container and shadow (when using [elevation])
  * @param colors [CardColors] that will be used to resolve the color(s) used for this card in
- * different states. See [CardDefaults.elevatedCardElevation].
+ *   different states. See [CardDefaults.elevatedCardElevation].
  * @param elevation [CardElevation] used to resolve the elevation for this card in different states.
- * This controls the size of the shadow below the card. Additionally, when the container color is
- * [ColorScheme.surface], this controls the amount of primary color applied as an overlay. See also:
- * [Surface].
+ *   This controls the size of the shadow below the card. Additionally, when the container color is
+ *   [ColorScheme.surface], this controls the amount of primary color applied as an overlay. See
+ *   also: [Surface].
  */
 @Composable
 fun ElevatedCard(
@@ -188,17 +197,19 @@
     colors: CardColors = CardDefaults.elevatedCardColors(),
     elevation: CardElevation = CardDefaults.elevatedCardElevation(),
     content: @Composable ColumnScope.() -> Unit
-) = Card(
-    modifier = modifier,
-    shape = shape,
-    border = null,
-    elevation = elevation,
-    colors = colors,
-    content = content
-)
+) =
+    Card(
+        modifier = modifier,
+        shape = shape,
+        border = null,
+        elevation = elevation,
+        colors = colors,
+        content = content
+    )
 
 /**
- * <a href="https://m3.material.io/components/cards/overview" class="external" target="_blank">Material Design elevated card</a>.
+ * <a href="https://m3.material.io/components/cards/overview" class="external"
+ * target="_blank">Material Design elevated card</a>.
  *
  * Elevated cards contain content and actions that relate information about a subject. They have a
  * drop shadow, providing more separation from the background than filled cards, but less than
@@ -206,27 +217,29 @@
  *
  * This ElevatedCard handles click events, calling its [onClick] lambda.
  *
- * ![Elevated card image](https://developer.android.com/images/reference/androidx/compose/material3/elevated-card.png)
+ * ![Elevated card
+ * image](https://developer.android.com/images/reference/androidx/compose/material3/elevated-card.png)
  *
  * Clickable elevated card sample:
+ *
  * @sample androidx.compose.material3.samples.ClickableElevatedCardSample
  *
  * @param onClick called when this card is clicked
  * @param modifier the [Modifier] to be applied to this card
  * @param enabled controls the enabled state of this card. When `false`, this component will not
- * respond to user input, and it will appear visually disabled and disabled to accessibility
- * services.
+ *   respond to user input, and it will appear visually disabled and disabled to accessibility
+ *   services.
  * @param shape defines the shape of this card's container and shadow (when using [elevation])
  * @param colors [CardColors] that will be used to resolve the color(s) used for this card in
- * different states. See [CardDefaults.elevatedCardElevation].
+ *   different states. See [CardDefaults.elevatedCardElevation].
  * @param elevation [CardElevation] used to resolve the elevation for this card in different states.
- * This controls the size of the shadow below the card. Additionally, when the container color is
- * [ColorScheme.surface], this controls the amount of primary color applied as an overlay. See also:
- * [Surface].
+ *   This controls the size of the shadow below the card. Additionally, when the container color is
+ *   [ColorScheme.surface], this controls the amount of primary color applied as an overlay. See
+ *   also: [Surface].
  * @param interactionSource an optional hoisted [MutableInteractionSource] for observing and
- * emitting [Interaction]s for this card. You can use this to change the card's appearance
- * or preview the card in different states. Note that if `null` is provided, interactions will
- * still happen internally.
+ *   emitting [Interaction]s for this card. You can use this to change the card's appearance or
+ *   preview the card in different states. Note that if `null` is provided, interactions will still
+ *   happen internally.
  */
 @Composable
 fun ElevatedCard(
@@ -238,20 +251,22 @@
     elevation: CardElevation = CardDefaults.elevatedCardElevation(),
     interactionSource: MutableInteractionSource? = null,
     content: @Composable ColumnScope.() -> Unit
-) = Card(
-    onClick = onClick,
-    modifier = modifier,
-    enabled = enabled,
-    shape = shape,
-    colors = colors,
-    elevation = elevation,
-    border = null,
-    interactionSource = interactionSource,
-    content = content
-)
+) =
+    Card(
+        onClick = onClick,
+        modifier = modifier,
+        enabled = enabled,
+        shape = shape,
+        colors = colors,
+        elevation = elevation,
+        border = null,
+        interactionSource = interactionSource,
+        content = content
+    )
 
 /**
- * <a href="https://m3.material.io/components/cards/overview" class="external" target="_blank">Material Design outlined card</a>.
+ * <a href="https://m3.material.io/components/cards/overview" class="external"
+ * target="_blank">Material Design outlined card</a>.
  *
  * Outlined cards contain content and actions that relate information about a subject. They have a
  * visual boundary around the container. This can provide greater emphasis than the other types.
@@ -259,20 +274,22 @@
  * This OutlinedCard does not handle input events - see the other OutlinedCard overloads if you want
  * a clickable or selectable OutlinedCard.
  *
- * ![Outlined card image](https://developer.android.com/images/reference/androidx/compose/material3/outlined-card.png)
+ * ![Outlined card
+ * image](https://developer.android.com/images/reference/androidx/compose/material3/outlined-card.png)
  *
  * Outlined card sample:
+ *
  * @sample androidx.compose.material3.samples.OutlinedCardSample
  *
  * @param modifier the [Modifier] to be applied to this card
  * @param shape defines the shape of this card's container, border (when [border] is not null), and
- * shadow (when using [elevation])
+ *   shadow (when using [elevation])
  * @param colors [CardColors] that will be used to resolve the color(s) used for this card in
- * different states. See [CardDefaults.outlinedCardColors].
+ *   different states. See [CardDefaults.outlinedCardColors].
  * @param elevation [CardElevation] used to resolve the elevation for this card in different states.
- * This controls the size of the shadow below the card. Additionally, when the container color is
- * [ColorScheme.surface], this controls the amount of primary color applied as an overlay. See also:
- * [Surface].
+ *   This controls the size of the shadow below the card. Additionally, when the container color is
+ *   [ColorScheme.surface], this controls the amount of primary color applied as an overlay. See
+ *   also: [Surface].
  * @param border the border to draw around the container of this card
  */
 @Composable
@@ -283,46 +300,50 @@
     elevation: CardElevation = CardDefaults.outlinedCardElevation(),
     border: BorderStroke = CardDefaults.outlinedCardBorder(),
     content: @Composable ColumnScope.() -> Unit
-) = Card(
-    modifier = modifier,
-    shape = shape,
-    colors = colors,
-    elevation = elevation,
-    border = border,
-    content = content
-)
+) =
+    Card(
+        modifier = modifier,
+        shape = shape,
+        colors = colors,
+        elevation = elevation,
+        border = border,
+        content = content
+    )
 
 /**
- * <a href="https://m3.material.io/components/cards/overview" class="external" target="_blank">Material Design outlined card</a>.
+ * <a href="https://m3.material.io/components/cards/overview" class="external"
+ * target="_blank">Material Design outlined card</a>.
  *
  * Outlined cards contain content and actions that relate information about a subject. They have a
  * visual boundary around the container. This can provide greater emphasis than the other types.
  *
  * This OutlinedCard handles click events, calling its [onClick] lambda.
  *
- * ![Outlined card image](https://developer.android.com/images/reference/androidx/compose/material3/outlined-card.png)
+ * ![Outlined card
+ * image](https://developer.android.com/images/reference/androidx/compose/material3/outlined-card.png)
  *
  * Clickable outlined card sample:
+ *
  * @sample androidx.compose.material3.samples.ClickableOutlinedCardSample
  *
  * @param onClick called when this card is clicked
  * @param modifier the [Modifier] to be applied to this card
  * @param enabled controls the enabled state of this card. When `false`, this component will not
- * respond to user input, and it will appear visually disabled and disabled to accessibility
- * services.
+ *   respond to user input, and it will appear visually disabled and disabled to accessibility
+ *   services.
  * @param shape defines the shape of this card's container, border (when [border] is not null), and
- * shadow (when using [elevation])
+ *   shadow (when using [elevation])
  * @param colors [CardColors] that will be used to resolve the color(s) used for this card in
- * different states. See [CardDefaults.outlinedCardColors].
+ *   different states. See [CardDefaults.outlinedCardColors].
  * @param elevation [CardElevation] used to resolve the elevation for this card in different states.
- * This controls the size of the shadow below the card. Additionally, when the container color is
- * [ColorScheme.surface], this controls the amount of primary color applied as an overlay. See also:
- * [Surface].
+ *   This controls the size of the shadow below the card. Additionally, when the container color is
+ *   [ColorScheme.surface], this controls the amount of primary color applied as an overlay. See
+ *   also: [Surface].
  * @param border the border to draw around the container of this card
  * @param interactionSource an optional hoisted [MutableInteractionSource] for observing and
- * emitting [Interaction]s for this card. You can use this to change the card's appearance
- * or preview the card in different states. Note that if `null` is provided, interactions will
- * still happen internally.
+ *   emitting [Interaction]s for this card. You can use this to change the card's appearance or
+ *   preview the card in different states. Note that if `null` is provided, interactions will still
+ *   happen internally.
  */
 @Composable
 fun OutlinedCard(
@@ -335,31 +356,33 @@
     border: BorderStroke = CardDefaults.outlinedCardBorder(enabled),
     interactionSource: MutableInteractionSource? = null,
     content: @Composable ColumnScope.() -> Unit
-) = Card(
-    onClick = onClick,
-    modifier = modifier,
-    enabled = enabled,
-    shape = shape,
-    colors = colors,
-    elevation = elevation,
-    border = border,
-    interactionSource = interactionSource,
-    content = content
-)
+) =
+    Card(
+        onClick = onClick,
+        modifier = modifier,
+        enabled = enabled,
+        shape = shape,
+        colors = colors,
+        elevation = elevation,
+        border = border,
+        interactionSource = interactionSource,
+        content = content
+    )
 
-/**
- * Contains the default values used by all card types.
- */
+/** Contains the default values used by all card types. */
 object CardDefaults {
     // shape Defaults
     /** Default shape for a card. */
-    val shape: Shape @Composable get() = FilledCardTokens.ContainerShape.value
+    val shape: Shape
+        @Composable get() = FilledCardTokens.ContainerShape.value
 
     /** Default shape for an elevated card. */
-    val elevatedShape: Shape @Composable get() = ElevatedCardTokens.ContainerShape.value
+    val elevatedShape: Shape
+        @Composable get() = ElevatedCardTokens.ContainerShape.value
 
     /** Default shape for an outlined card. */
-    val outlinedShape: Shape @Composable get() = OutlinedCardTokens.ContainerShape.value
+    val outlinedShape: Shape
+        @Composable get() = OutlinedCardTokens.ContainerShape.value
 
     /**
      * Creates a [CardElevation] that will animate between the provided values according to the
@@ -379,21 +402,22 @@
         hoveredElevation: Dp = FilledCardTokens.HoverContainerElevation,
         draggedElevation: Dp = FilledCardTokens.DraggedContainerElevation,
         disabledElevation: Dp = FilledCardTokens.DisabledContainerElevation
-    ): CardElevation = CardElevation(
-        defaultElevation = defaultElevation,
-        pressedElevation = pressedElevation,
-        focusedElevation = focusedElevation,
-        hoveredElevation = hoveredElevation,
-        draggedElevation = draggedElevation,
-        disabledElevation = disabledElevation
-    )
+    ): CardElevation =
+        CardElevation(
+            defaultElevation = defaultElevation,
+            pressedElevation = pressedElevation,
+            focusedElevation = focusedElevation,
+            hoveredElevation = hoveredElevation,
+            draggedElevation = draggedElevation,
+            disabledElevation = disabledElevation
+        )
 
     /**
      * Creates a [CardElevation] that will animate between the provided values according to the
      * Material specification for an [ElevatedCard].
      *
      * @param defaultElevation the elevation used when the [ElevatedCard] is has no other
-     * [Interaction]s.
+     *   [Interaction]s.
      * @param pressedElevation the elevation used when the [ElevatedCard] is pressed.
      * @param focusedElevation the elevation used when the [ElevatedCard] is focused.
      * @param hoveredElevation the elevation used when the [ElevatedCard] is hovered.
@@ -407,21 +431,22 @@
         hoveredElevation: Dp = ElevatedCardTokens.HoverContainerElevation,
         draggedElevation: Dp = ElevatedCardTokens.DraggedContainerElevation,
         disabledElevation: Dp = ElevatedCardTokens.DisabledContainerElevation
-    ): CardElevation = CardElevation(
-        defaultElevation = defaultElevation,
-        pressedElevation = pressedElevation,
-        focusedElevation = focusedElevation,
-        hoveredElevation = hoveredElevation,
-        draggedElevation = draggedElevation,
-        disabledElevation = disabledElevation
-    )
+    ): CardElevation =
+        CardElevation(
+            defaultElevation = defaultElevation,
+            pressedElevation = pressedElevation,
+            focusedElevation = focusedElevation,
+            hoveredElevation = hoveredElevation,
+            draggedElevation = draggedElevation,
+            disabledElevation = disabledElevation
+        )
 
     /**
      * Creates a [CardElevation] that will animate between the provided values according to the
      * Material specification for an [OutlinedCard].
      *
      * @param defaultElevation the elevation used when the [OutlinedCard] is has no other
-     * [Interaction]s.
+     *   [Interaction]s.
      * @param pressedElevation the elevation used when the [OutlinedCard] is pressed.
      * @param focusedElevation the elevation used when the [OutlinedCard] is focused.
      * @param hoveredElevation the elevation used when the [OutlinedCard] is hovered.
@@ -435,21 +460,21 @@
         hoveredElevation: Dp = defaultElevation,
         draggedElevation: Dp = OutlinedCardTokens.DraggedContainerElevation,
         disabledElevation: Dp = OutlinedCardTokens.DisabledContainerElevation
-    ): CardElevation = CardElevation(
-        defaultElevation = defaultElevation,
-        pressedElevation = pressedElevation,
-        focusedElevation = focusedElevation,
-        hoveredElevation = hoveredElevation,
-        draggedElevation = draggedElevation,
-        disabledElevation = disabledElevation
-    )
+    ): CardElevation =
+        CardElevation(
+            defaultElevation = defaultElevation,
+            pressedElevation = pressedElevation,
+            focusedElevation = focusedElevation,
+            hoveredElevation = hoveredElevation,
+            draggedElevation = draggedElevation,
+            disabledElevation = disabledElevation
+        )
 
     /**
      * Creates a [CardColors] that represents the default container and content colors used in a
      * [Card].
      */
-    @Composable
-    fun cardColors() = MaterialTheme.colorScheme.defaultCardColors
+    @Composable fun cardColors() = MaterialTheme.colorScheme.defaultCardColors
 
     /**
      * Creates a [CardColors] that represents the default container and content colors used in a
@@ -466,34 +491,36 @@
         contentColor: Color = contentColorFor(containerColor),
         disabledContainerColor: Color = Color.Unspecified,
         disabledContentColor: Color = contentColor.copy(DisabledAlpha),
-    ): CardColors = MaterialTheme.colorScheme.defaultCardColors.copy(
-        containerColor = containerColor,
-        contentColor = contentColor,
-        disabledContainerColor = disabledContainerColor,
-        disabledContentColor = disabledContentColor
-    )
+    ): CardColors =
+        MaterialTheme.colorScheme.defaultCardColors.copy(
+            containerColor = containerColor,
+            contentColor = contentColor,
+            disabledContainerColor = disabledContainerColor,
+            disabledContentColor = disabledContentColor
+        )
 
     internal val ColorScheme.defaultCardColors: CardColors
         get() {
-            return defaultCardColorsCached ?: CardColors(
-                containerColor = fromToken(FilledCardTokens.ContainerColor),
-                contentColor = contentColorFor(fromToken(FilledCardTokens.ContainerColor)),
-                disabledContainerColor = fromToken(FilledCardTokens.DisabledContainerColor)
-                    .copy(alpha = FilledCardTokens.DisabledContainerOpacity)
-                    .compositeOver(fromToken(FilledCardTokens.ContainerColor)),
-                disabledContentColor =
-                contentColorFor(fromToken(FilledCardTokens.ContainerColor)).copy(DisabledAlpha),
-            ).also {
-                defaultCardColorsCached = it
-            }
+            return defaultCardColorsCached
+                ?: CardColors(
+                        containerColor = fromToken(FilledCardTokens.ContainerColor),
+                        contentColor = contentColorFor(fromToken(FilledCardTokens.ContainerColor)),
+                        disabledContainerColor =
+                            fromToken(FilledCardTokens.DisabledContainerColor)
+                                .copy(alpha = FilledCardTokens.DisabledContainerOpacity)
+                                .compositeOver(fromToken(FilledCardTokens.ContainerColor)),
+                        disabledContentColor =
+                            contentColorFor(fromToken(FilledCardTokens.ContainerColor))
+                                .copy(DisabledAlpha),
+                    )
+                    .also { defaultCardColorsCached = it }
         }
 
     /**
      * Creates a [CardColors] that represents the default container and content colors used in an
      * [ElevatedCard].
      */
-    @Composable
-    fun elevatedCardColors() = MaterialTheme.colorScheme.defaultElevatedCardColors
+    @Composable fun elevatedCardColors() = MaterialTheme.colorScheme.defaultElevatedCardColors
 
     /**
      * Creates a [CardColors] that represents the default container and content colors used in an
@@ -510,7 +537,8 @@
         contentColor: Color = contentColorFor(containerColor),
         disabledContainerColor: Color = Color.Unspecified,
         disabledContentColor: Color = contentColor.copy(DisabledAlpha),
-    ): CardColors = MaterialTheme.colorScheme.defaultElevatedCardColors.copy(
+    ): CardColors =
+        MaterialTheme.colorScheme.defaultElevatedCardColors.copy(
             containerColor = containerColor,
             contentColor = contentColor,
             disabledContainerColor = disabledContainerColor,
@@ -519,26 +547,29 @@
 
     internal val ColorScheme.defaultElevatedCardColors: CardColors
         get() {
-            return defaultElevatedCardColorsCached ?: CardColors(
-                containerColor = fromToken(ElevatedCardTokens.ContainerColor),
-                contentColor = contentColorFor(fromToken(ElevatedCardTokens.ContainerColor)),
-                disabledContainerColor =
-                fromToken(ElevatedCardTokens.DisabledContainerColor)
-                    .copy(alpha = ElevatedCardTokens.DisabledContainerOpacity)
-                    .compositeOver(fromToken(ElevatedCardTokens.DisabledContainerColor)),
-                disabledContentColor =
-                contentColorFor(fromToken(ElevatedCardTokens.ContainerColor)).copy(DisabledAlpha),
-            ).also {
-                defaultElevatedCardColorsCached = it
-            }
+            return defaultElevatedCardColorsCached
+                ?: CardColors(
+                        containerColor = fromToken(ElevatedCardTokens.ContainerColor),
+                        contentColor =
+                            contentColorFor(fromToken(ElevatedCardTokens.ContainerColor)),
+                        disabledContainerColor =
+                            fromToken(ElevatedCardTokens.DisabledContainerColor)
+                                .copy(alpha = ElevatedCardTokens.DisabledContainerOpacity)
+                                .compositeOver(
+                                    fromToken(ElevatedCardTokens.DisabledContainerColor)
+                                ),
+                        disabledContentColor =
+                            contentColorFor(fromToken(ElevatedCardTokens.ContainerColor))
+                                .copy(DisabledAlpha),
+                    )
+                    .also { defaultElevatedCardColorsCached = it }
         }
 
     /**
      * Creates a [CardColors] that represents the default container and content colors used in an
      * [OutlinedCard].
      */
-    @Composable
-    fun outlinedCardColors() = MaterialTheme.colorScheme.defaultOutlinedCardColors
+    @Composable fun outlinedCardColors() = MaterialTheme.colorScheme.defaultOutlinedCardColors
 
     /**
      * Creates a [CardColors] that represents the default container and content colors used in an
@@ -555,24 +586,27 @@
         contentColor: Color = contentColorFor(containerColor),
         disabledContainerColor: Color = Color.Unspecified,
         disabledContentColor: Color = contentColorFor(containerColor).copy(DisabledAlpha),
-    ): CardColors = MaterialTheme.colorScheme.defaultOutlinedCardColors.copy(
-        containerColor = containerColor,
-        contentColor = contentColor,
-        disabledContainerColor = disabledContainerColor,
-        disabledContentColor = disabledContentColor
-    )
+    ): CardColors =
+        MaterialTheme.colorScheme.defaultOutlinedCardColors.copy(
+            containerColor = containerColor,
+            contentColor = contentColor,
+            disabledContainerColor = disabledContainerColor,
+            disabledContentColor = disabledContentColor
+        )
 
     internal val ColorScheme.defaultOutlinedCardColors: CardColors
         get() {
-            return defaultOutlinedCardColorsCached ?: CardColors(
-                containerColor = fromToken(OutlinedCardTokens.ContainerColor),
-                contentColor = contentColorFor(fromToken(OutlinedCardTokens.ContainerColor)),
-                disabledContainerColor = fromToken(OutlinedCardTokens.ContainerColor),
-                disabledContentColor =
-                contentColorFor(fromToken(OutlinedCardTokens.ContainerColor)).copy(DisabledAlpha),
-            ).also {
-                defaultOutlinedCardColorsCached = it
-            }
+            return defaultOutlinedCardColorsCached
+                ?: CardColors(
+                        containerColor = fromToken(OutlinedCardTokens.ContainerColor),
+                        contentColor =
+                            contentColorFor(fromToken(OutlinedCardTokens.ContainerColor)),
+                        disabledContainerColor = fromToken(OutlinedCardTokens.ContainerColor),
+                        disabledContentColor =
+                            contentColorFor(fromToken(OutlinedCardTokens.ContainerColor))
+                                .copy(DisabledAlpha),
+                    )
+                    .also { defaultOutlinedCardColorsCached = it }
         }
 
     /**
@@ -582,26 +616,27 @@
      */
     @Composable
     fun outlinedCardBorder(enabled: Boolean = true): BorderStroke {
-        val color = if (enabled) {
-            OutlinedCardTokens.OutlineColor.value
-        } else {
-            OutlinedCardTokens.DisabledOutlineColor.value
-                .copy(alpha = OutlinedCardTokens.DisabledOutlineOpacity)
-                .compositeOver(ElevatedCardTokens.ContainerColor.value)
-        }
+        val color =
+            if (enabled) {
+                OutlinedCardTokens.OutlineColor.value
+            } else {
+                OutlinedCardTokens.DisabledOutlineColor.value
+                    .copy(alpha = OutlinedCardTokens.DisabledOutlineOpacity)
+                    .compositeOver(ElevatedCardTokens.ContainerColor.value)
+            }
         return remember(color) { BorderStroke(OutlinedCardTokens.OutlineWidth, color) }
     }
 }
 
 /**
  * Represents the elevation for a card in different states.
- *
  * - See [CardDefaults.cardElevation] for the default elevation used in a [Card].
  * - See [CardDefaults.elevatedCardElevation] for the default elevation used in an [ElevatedCard].
  * - See [CardDefaults.outlinedCardElevation] for the default elevation used in an [OutlinedCard].
  */
 @Immutable
-class CardElevation internal constructor(
+class CardElevation
+internal constructor(
     private val defaultElevation: Dp,
     private val pressedElevation: Dp,
     private val focusedElevation: Dp,
@@ -641,39 +676,30 @@
                     is HoverInteraction.Enter -> {
                         interactions.add(interaction)
                     }
-
                     is HoverInteraction.Exit -> {
                         interactions.remove(interaction.enter)
                     }
-
                     is FocusInteraction.Focus -> {
                         interactions.add(interaction)
                     }
-
                     is FocusInteraction.Unfocus -> {
                         interactions.remove(interaction.focus)
                     }
-
                     is PressInteraction.Press -> {
                         interactions.add(interaction)
                     }
-
                     is PressInteraction.Release -> {
                         interactions.remove(interaction.press)
                     }
-
                     is PressInteraction.Cancel -> {
                         interactions.remove(interaction.press)
                     }
-
                     is DragInteraction.Start -> {
                         interactions.add(interaction)
                     }
-
                     is DragInteraction.Stop -> {
                         interactions.remove(interaction.start)
                     }
-
                     is DragInteraction.Cancel -> {
                         interactions.remove(interaction.start)
                     }
@@ -704,13 +730,14 @@
                     // No transition when moving to a disabled state.
                     animatable.snapTo(target)
                 } else {
-                    val lastInteraction = when (animatable.targetValue) {
-                        pressedElevation -> PressInteraction.Press(Offset.Zero)
-                        hoveredElevation -> HoverInteraction.Enter()
-                        focusedElevation -> FocusInteraction.Focus()
-                        draggedElevation -> DragInteraction.Start()
-                        else -> null
-                    }
+                    val lastInteraction =
+                        when (animatable.targetValue) {
+                            pressedElevation -> PressInteraction.Press(Offset.Zero)
+                            hoveredElevation -> HoverInteraction.Enter()
+                            focusedElevation -> FocusInteraction.Focus()
+                            draggedElevation -> DragInteraction.Start()
+                            else -> null
+                        }
                     animatable.animateElevation(
                         from = lastInteraction,
                         to = interaction,
@@ -749,38 +776,39 @@
 /**
  * Represents the container and content colors used in a card in different states.
  *
- * @constructor create an instance with arbitrary colors.
- * - See [CardDefaults.cardColors] for the default colors used in a [Card].
- * - See [CardDefaults.elevatedCardColors] for the default colors used in a [ElevatedCard].
- * - See [CardDefaults.outlinedCardColors] for the default colors used in a [OutlinedCard].
- *
  * @param containerColor the container color of this [Card] when enabled.
  * @param contentColor the content color of this [Card] when enabled.
  * @param disabledContainerColor the container color of this [Card] when not enabled.
  * @param disabledContentColor the content color of this [Card] when not enabled.
+ * @constructor create an instance with arbitrary colors.
+ * - See [CardDefaults.cardColors] for the default colors used in a [Card].
+ * - See [CardDefaults.elevatedCardColors] for the default colors used in a [ElevatedCard].
+ * - See [CardDefaults.outlinedCardColors] for the default colors used in a [OutlinedCard].
  */
 @Immutable
-class CardColors constructor(
+class CardColors
+constructor(
     val containerColor: Color,
     val contentColor: Color,
     val disabledContainerColor: Color,
     val disabledContentColor: Color,
 ) {
     /**
-     * Returns a copy of this CardColors, optionally overriding some of the values.
-     * This uses the Color.Unspecified to mean “use the value from the source”
+     * Returns a copy of this CardColors, optionally overriding some of the values. This uses the
+     * Color.Unspecified to mean “use the value from the source”
      */
     fun copy(
         containerColor: Color = this.containerColor,
         contentColor: Color = this.contentColor,
         disabledContainerColor: Color = this.disabledContainerColor,
         disabledContentColor: Color = this.disabledContentColor
-    ) = CardColors(
-        containerColor.takeOrElse { this.containerColor },
-        contentColor.takeOrElse { this.contentColor },
-        disabledContainerColor.takeOrElse { this.disabledContainerColor },
-        disabledContentColor.takeOrElse { this.disabledContentColor },
-    )
+    ) =
+        CardColors(
+            containerColor.takeOrElse { this.containerColor },
+            contentColor.takeOrElse { this.contentColor },
+            disabledContainerColor.takeOrElse { this.disabledContainerColor },
+            disabledContentColor.takeOrElse { this.disabledContentColor },
+        )
 
     /**
      * Represents the container color for this card, depending on [enabled].
diff --git a/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/Checkbox.kt b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/Checkbox.kt
index 83508d6..ffbdf52 100644
--- a/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/Checkbox.kt
+++ b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/Checkbox.kt
@@ -56,34 +56,37 @@
 import kotlin.math.max
 
 /**
- * <a href="https://m3.material.io/components/checkbox/overview" class="external" target="_blank">Material Design checkbox</a>.
+ * <a href="https://m3.material.io/components/checkbox/overview" class="external"
+ * target="_blank">Material Design checkbox</a>.
  *
  * Checkboxes allow users to select one or more items from a set. Checkboxes can turn an option on
  * or off.
  *
- * ![Checkbox image](https://developer.android.com/images/reference/androidx/compose/material3/checkbox.png)
+ * ![Checkbox
+ * image](https://developer.android.com/images/reference/androidx/compose/material3/checkbox.png)
  *
  * Simple Checkbox sample:
+ *
  * @sample androidx.compose.material3.samples.CheckboxSample
  *
  * Combined Checkbox with Text sample:
- * @sample androidx.compose.material3.samples.CheckboxWithTextSample
  *
- * @see [TriStateCheckbox] if you require support for an indeterminate state.
+ * @sample androidx.compose.material3.samples.CheckboxWithTextSample
  *
  * @param checked whether this checkbox is checked or unchecked
  * @param onCheckedChange called when this checkbox is clicked. If `null`, then this checkbox will
- * not be interactable, unless something else handles its input events and updates its state.
+ *   not be interactable, unless something else handles its input events and updates its state.
  * @param modifier the [Modifier] to be applied to this checkbox
  * @param enabled controls the enabled state of this checkbox. When `false`, this component will not
- * respond to user input, and it will appear visually disabled and disabled to accessibility
- * services.
+ *   respond to user input, and it will appear visually disabled and disabled to accessibility
+ *   services.
  * @param colors [CheckboxColors] that will be used to resolve the colors used for this checkbox in
- * different states. See [CheckboxDefaults.colors].
+ *   different states. See [CheckboxDefaults.colors].
  * @param interactionSource an optional hoisted [MutableInteractionSource] for observing and
- * emitting [Interaction]s for this checkbox. You can use this to change the checkbox's appearance
- * or preview the checkbox in different states. Note that if `null` is provided, interactions will
- * still happen internally.
+ *   emitting [Interaction]s for this checkbox. You can use this to change the checkbox's appearance
+ *   or preview the checkbox in different states. Note that if `null` is provided, interactions will
+ *   still happen internally.
+ * @see [TriStateCheckbox] if you require support for an indeterminate state.
  */
 @Composable
 fun Checkbox(
@@ -96,11 +99,12 @@
 ) {
     TriStateCheckbox(
         state = ToggleableState(checked),
-        onClick = if (onCheckedChange != null) {
-            { onCheckedChange(!checked) }
-        } else {
-            null
-        },
+        onClick =
+            if (onCheckedChange != null) {
+                { onCheckedChange(!checked) }
+            } else {
+                null
+            },
         modifier = modifier,
         enabled = enabled,
         colors = colors,
@@ -109,32 +113,33 @@
 }
 
 /**
- * <a href="https://m3.material.io/components/checkbox/guidelines" class="external" target="_blank">Material Design checkbox</a> parent.
+ * <a href="https://m3.material.io/components/checkbox/guidelines" class="external"
+ * target="_blank">Material Design checkbox</a> parent.
  *
  * Checkboxes can have a parent-child relationship with other checkboxes. When the parent checkbox
  * is checked, all child checkboxes are checked. If a parent checkbox is unchecked, all child
  * checkboxes are unchecked. If some, but not all, child checkboxes are checked, the parent checkbox
  * becomes an indeterminate checkbox.
  *
- * ![Checkbox image](https://developer.android.com/images/reference/androidx/compose/material3/indeterminate-checkbox.png)
+ * ![Checkbox
+ * image](https://developer.android.com/images/reference/androidx/compose/material3/indeterminate-checkbox.png)
  *
  * @sample androidx.compose.material3.samples.TriStateCheckboxSample
  *
- * @see [Checkbox] if you want a simple component that represents Boolean state
- *
  * @param state whether this checkbox is checked, unchecked, or in an indeterminate state
  * @param onClick called when this checkbox is clicked. If `null`, then this checkbox will not be
- * interactable, unless something else handles its input events and updates its [state].
+ *   interactable, unless something else handles its input events and updates its [state].
  * @param modifier the [Modifier] to be applied to this checkbox
  * @param enabled controls the enabled state of this checkbox. When `false`, this component will not
- * respond to user input, and it will appear visually disabled and disabled to accessibility
- * services.
+ *   respond to user input, and it will appear visually disabled and disabled to accessibility
+ *   services.
  * @param colors [CheckboxColors] that will be used to resolve the colors used for this checkbox in
- * different states. See [CheckboxDefaults.colors].
+ *   different states. See [CheckboxDefaults.colors].
  * @param interactionSource an optional hoisted [MutableInteractionSource] for observing and
- * emitting [Interaction]s for this checkbox. You can use this to change the checkbox's appearance
- * or preview the checkbox in different states. Note that if `null` is provided, interactions will
- * still happen internally.
+ *   emitting [Interaction]s for this checkbox. You can use this to change the checkbox's appearance
+ *   or preview the checkbox in different states. Note that if `null` is provided, interactions will
+ *   still happen internally.
+ * @see [Checkbox] if you want a simple component that represents Boolean state
  */
 @Composable
 fun TriStateCheckbox(
@@ -153,10 +158,11 @@
                 enabled = enabled,
                 role = Role.Checkbox,
                 interactionSource = interactionSource,
-                indication = rippleOrFallbackImplementation(
-                    bounded = false,
-                    radius = CheckboxTokens.StateLayerSize / 2
-                )
+                indication =
+                    rippleOrFallbackImplementation(
+                        bounded = false,
+                        radius = CheckboxTokens.StateLayerSize / 2
+                    )
             )
         } else {
             Modifier
@@ -164,30 +170,28 @@
     CheckboxImpl(
         enabled = enabled,
         value = state,
-        modifier = modifier
-            .then(
-                if (onClick != null) {
-                    Modifier.minimumInteractiveComponentSize()
-                } else {
-                    Modifier
-                }
-            )
-            .then(toggleableModifier)
-            .padding(CheckboxDefaultPadding),
+        modifier =
+            modifier
+                .then(
+                    if (onClick != null) {
+                        Modifier.minimumInteractiveComponentSize()
+                    } else {
+                        Modifier
+                    }
+                )
+                .then(toggleableModifier)
+                .padding(CheckboxDefaultPadding),
         colors = colors
     )
 }
 
-/**
- * Defaults used in [Checkbox] and [TriStateCheckbox].
- */
+/** Defaults used in [Checkbox] and [TriStateCheckbox]. */
 object CheckboxDefaults {
     /**
      * Creates a [CheckboxColors] that will animate between the provided colors according to the
      * Material specification.
      */
-    @Composable
-    fun colors() = MaterialTheme.colorScheme.defaultCheckboxColors
+    @Composable fun colors() = MaterialTheme.colorScheme.defaultCheckboxColors
 
     /**
      * Creates a [CheckboxColors] that will animate between the provided colors according to the
@@ -195,14 +199,14 @@
      *
      * @param checkedColor the color that will be used for the border and box when checked
      * @param uncheckedColor color that will be used for the border when unchecked. By default, the
-     * inner box is transparent when unchecked.
+     *   inner box is transparent when unchecked.
      * @param checkmarkColor color that will be used for the checkmark when checked
      * @param disabledCheckedColor color that will be used for the box and border when disabled and
-     * checked
+     *   checked
      * @param disabledUncheckedColor color that will be used for the border when disabled and
-     * unchecked. By default, the inner box is transparent when unchecked.
-     * @param disabledIndeterminateColor color that will be used for the box and
-     * border in a [TriStateCheckbox] when disabled AND in an [ToggleableState.Indeterminate] state
+     *   unchecked. By default, the inner box is transparent when unchecked.
+     * @param disabledIndeterminateColor color that will be used for the box and border in a
+     *   [TriStateCheckbox] when disabled AND in an [ToggleableState.Indeterminate] state
      */
     @Composable
     fun colors(
@@ -212,47 +216,50 @@
         disabledCheckedColor: Color = Color.Unspecified,
         disabledUncheckedColor: Color = Color.Unspecified,
         disabledIndeterminateColor: Color = Color.Unspecified
-    ): CheckboxColors = MaterialTheme.colorScheme.defaultCheckboxColors.copy(
-        checkedCheckmarkColor = checkmarkColor,
-        uncheckedCheckmarkColor = Color.Transparent,
-        checkedBoxColor = checkedColor,
-        uncheckedBoxColor = Color.Transparent,
-        disabledCheckedBoxColor = disabledCheckedColor,
-        disabledUncheckedBoxColor = Color.Transparent,
-        disabledIndeterminateBoxColor = disabledIndeterminateColor,
-        checkedBorderColor = checkedColor,
-        uncheckedBorderColor = uncheckedColor,
-        disabledBorderColor = disabledCheckedColor,
-        disabledUncheckedBorderColor = disabledUncheckedColor,
-        disabledIndeterminateBorderColor = disabledIndeterminateColor
-    )
+    ): CheckboxColors =
+        MaterialTheme.colorScheme.defaultCheckboxColors.copy(
+            checkedCheckmarkColor = checkmarkColor,
+            uncheckedCheckmarkColor = Color.Transparent,
+            checkedBoxColor = checkedColor,
+            uncheckedBoxColor = Color.Transparent,
+            disabledCheckedBoxColor = disabledCheckedColor,
+            disabledUncheckedBoxColor = Color.Transparent,
+            disabledIndeterminateBoxColor = disabledIndeterminateColor,
+            checkedBorderColor = checkedColor,
+            uncheckedBorderColor = uncheckedColor,
+            disabledBorderColor = disabledCheckedColor,
+            disabledUncheckedBorderColor = disabledUncheckedColor,
+            disabledIndeterminateBorderColor = disabledIndeterminateColor
+        )
 
     internal val ColorScheme.defaultCheckboxColors: CheckboxColors
         get() {
-            return defaultCheckboxColorsCached ?: CheckboxColors(
-                checkedCheckmarkColor = fromToken(CheckboxTokens.SelectedIconColor),
-                uncheckedCheckmarkColor = Color.Transparent,
-                checkedBoxColor = fromToken(CheckboxTokens.SelectedContainerColor),
-                uncheckedBoxColor = Color.Transparent,
-                disabledCheckedBoxColor = fromToken(CheckboxTokens.SelectedDisabledContainerColor)
-                    .copy(alpha = CheckboxTokens.SelectedDisabledContainerOpacity),
-                disabledUncheckedBoxColor = Color.Transparent,
-                disabledIndeterminateBoxColor =
-                fromToken(CheckboxTokens.SelectedDisabledContainerColor)
-                    .copy(alpha = CheckboxTokens.SelectedDisabledContainerOpacity),
-                checkedBorderColor = fromToken(CheckboxTokens.SelectedContainerColor),
-                uncheckedBorderColor = fromToken(CheckboxTokens.UnselectedOutlineColor),
-                disabledBorderColor = fromToken(CheckboxTokens.SelectedDisabledContainerColor)
-                    .copy(alpha = CheckboxTokens.SelectedDisabledContainerOpacity),
-                disabledUncheckedBorderColor =
-                fromToken(CheckboxTokens.UnselectedDisabledOutlineColor)
-                    .copy(alpha = CheckboxTokens.UnselectedDisabledContainerOpacity),
-                disabledIndeterminateBorderColor =
-                fromToken(CheckboxTokens.SelectedDisabledContainerColor)
-                    .copy(alpha = CheckboxTokens.SelectedDisabledContainerOpacity)
-            ).also {
-                defaultCheckboxColorsCached = it
-            }
+            return defaultCheckboxColorsCached
+                ?: CheckboxColors(
+                        checkedCheckmarkColor = fromToken(CheckboxTokens.SelectedIconColor),
+                        uncheckedCheckmarkColor = Color.Transparent,
+                        checkedBoxColor = fromToken(CheckboxTokens.SelectedContainerColor),
+                        uncheckedBoxColor = Color.Transparent,
+                        disabledCheckedBoxColor =
+                            fromToken(CheckboxTokens.SelectedDisabledContainerColor)
+                                .copy(alpha = CheckboxTokens.SelectedDisabledContainerOpacity),
+                        disabledUncheckedBoxColor = Color.Transparent,
+                        disabledIndeterminateBoxColor =
+                            fromToken(CheckboxTokens.SelectedDisabledContainerColor)
+                                .copy(alpha = CheckboxTokens.SelectedDisabledContainerOpacity),
+                        checkedBorderColor = fromToken(CheckboxTokens.SelectedContainerColor),
+                        uncheckedBorderColor = fromToken(CheckboxTokens.UnselectedOutlineColor),
+                        disabledBorderColor =
+                            fromToken(CheckboxTokens.SelectedDisabledContainerColor)
+                                .copy(alpha = CheckboxTokens.SelectedDisabledContainerOpacity),
+                        disabledUncheckedBorderColor =
+                            fromToken(CheckboxTokens.UnselectedDisabledOutlineColor)
+                                .copy(alpha = CheckboxTokens.UnselectedDisabledContainerOpacity),
+                        disabledIndeterminateBorderColor =
+                            fromToken(CheckboxTokens.SelectedDisabledContainerColor)
+                                .copy(alpha = CheckboxTokens.SelectedDisabledContainerOpacity)
+                    )
+                    .also { defaultCheckboxColorsCached = it }
         }
 }
 
@@ -264,46 +271,44 @@
     colors: CheckboxColors
 ) {
     val transition = updateTransition(value)
-    val checkDrawFraction = transition.animateFloat(
-        transitionSpec = {
-            when {
-                initialState == ToggleableState.Off -> tween(CheckAnimationDuration)
-                targetState == ToggleableState.Off -> snap(BoxOutDuration)
-                else -> spring()
+    val checkDrawFraction =
+        transition.animateFloat(
+            transitionSpec = {
+                when {
+                    initialState == ToggleableState.Off -> tween(CheckAnimationDuration)
+                    targetState == ToggleableState.Off -> snap(BoxOutDuration)
+                    else -> spring()
+                }
+            }
+        ) {
+            when (it) {
+                ToggleableState.On -> 1f
+                ToggleableState.Off -> 0f
+                ToggleableState.Indeterminate -> 1f
             }
         }
-    ) {
-        when (it) {
-            ToggleableState.On -> 1f
-            ToggleableState.Off -> 0f
-            ToggleableState.Indeterminate -> 1f
-        }
-    }
 
-    val checkCenterGravitationShiftFraction = transition.animateFloat(
-        transitionSpec = {
-            when {
-                initialState == ToggleableState.Off -> snap()
-                targetState == ToggleableState.Off -> snap(BoxOutDuration)
-                else -> tween(durationMillis = CheckAnimationDuration)
+    val checkCenterGravitationShiftFraction =
+        transition.animateFloat(
+            transitionSpec = {
+                when {
+                    initialState == ToggleableState.Off -> snap()
+                    targetState == ToggleableState.Off -> snap(BoxOutDuration)
+                    else -> tween(durationMillis = CheckAnimationDuration)
+                }
+            }
+        ) {
+            when (it) {
+                ToggleableState.On -> 0f
+                ToggleableState.Off -> 0f
+                ToggleableState.Indeterminate -> 1f
             }
         }
-    ) {
-        when (it) {
-            ToggleableState.On -> 0f
-            ToggleableState.Off -> 0f
-            ToggleableState.Indeterminate -> 1f
-        }
-    }
     val checkCache = remember { CheckDrawingCache() }
     val checkColor = colors.checkmarkColor(value)
     val boxColor = colors.boxColor(enabled, value)
     val borderColor = colors.borderColor(enabled, value)
-    Canvas(
-        modifier
-            .wrapContentSize(Alignment.Center)
-            .requiredSize(CheckboxSize)
-    ) {
+    Canvas(modifier.wrapContentSize(Alignment.Center).requiredSize(CheckboxSize)) {
         val strokeWidthPx = floor(StrokeWidth.toPx())
         drawBox(
             boxColor = boxColor.value,
@@ -385,9 +390,7 @@
         // TODO: replace with proper declarative non-android alternative when ready (b/158188351)
         pathMeasure.setPath(checkPath, false)
         pathToDraw.reset()
-        pathMeasure.getSegment(
-            0f, pathMeasure.length * checkFraction, pathToDraw, true
-        )
+        pathMeasure.getSegment(0f, pathMeasure.length * checkFraction, pathToDraw, true)
     }
     drawPath(drawingCache.pathToDraw, checkColor, style = stroke)
 }
@@ -403,9 +406,6 @@
  * Represents the colors used by the three different sections (checkmark, box, and border) of a
  * [Checkbox] or [TriStateCheckbox] in different states.
  *
- * @constructor create an instance with arbitrary colors, see [CheckboxDefaults.colors] for the
- * default implementation that follows Material specifications.
- *
  * @param checkedCheckmarkColor color that will be used for the checkmark when checked
  * @param uncheckedCheckmarkColor color that will be used for the checkmark when unchecked
  * @param checkedBoxColor the color that will be used for the box when checked
@@ -413,17 +413,20 @@
  * @param disabledCheckedBoxColor color that will be used for the box when disabled and checked
  * @param disabledUncheckedBoxColor color that will be used for the box when disabled and unchecked
  * @param disabledIndeterminateBoxColor color that will be used for the box and border in a
- * [TriStateCheckbox] when disabled AND in an [ToggleableState.Indeterminate] state.
+ *   [TriStateCheckbox] when disabled AND in an [ToggleableState.Indeterminate] state.
  * @param checkedBorderColor color that will be used for the border when checked
  * @param uncheckedBorderColor color that will be used for the border when unchecked
  * @param disabledBorderColor color that will be used for the border when disabled and checked
  * @param disabledUncheckedBorderColor color that will be used for the border when disabled and
- * unchecked
+ *   unchecked
  * @param disabledIndeterminateBorderColor color that will be used for the border when disabled and
- * in an [ToggleableState.Indeterminate] state.
+ *   in an [ToggleableState.Indeterminate] state.
+ * @constructor create an instance with arbitrary colors, see [CheckboxDefaults.colors] for the
+ *   default implementation that follows Material specifications.
  */
 @Immutable
-class CheckboxColors constructor(
+class CheckboxColors
+constructor(
     val checkedCheckmarkColor: Color,
     val uncheckedCheckmarkColor: Color,
     val checkedBoxColor: Color,
@@ -438,8 +441,8 @@
     val disabledIndeterminateBorderColor: Color
 ) {
     /**
-     * Returns a copy of this CheckboxColors, optionally overriding some of the values.
-     * This uses the Color.Unspecified to mean “use the value from the source”
+     * Returns a copy of this CheckboxColors, optionally overriding some of the values. This uses
+     * the Color.Unspecified to mean “use the value from the source”
      */
     fun copy(
         checkedCheckmarkColor: Color = this.checkedCheckmarkColor,
@@ -454,20 +457,21 @@
         disabledBorderColor: Color = this.disabledBorderColor,
         disabledUncheckedBorderColor: Color = this.disabledUncheckedBorderColor,
         disabledIndeterminateBorderColor: Color = this.disabledIndeterminateBorderColor
-    ) = CheckboxColors(
-        checkedCheckmarkColor.takeOrElse { this.checkedCheckmarkColor },
-        uncheckedCheckmarkColor.takeOrElse { this.uncheckedCheckmarkColor },
-        checkedBoxColor.takeOrElse { this.checkedBoxColor },
-        uncheckedBoxColor.takeOrElse { this.uncheckedBoxColor },
-        disabledCheckedBoxColor.takeOrElse { this.disabledCheckedBoxColor },
-        disabledUncheckedBoxColor.takeOrElse { this.disabledUncheckedBoxColor },
-        disabledIndeterminateBoxColor.takeOrElse { this.disabledIndeterminateBoxColor },
-        checkedBorderColor.takeOrElse { this.checkedBorderColor },
-        uncheckedBorderColor.takeOrElse { this.uncheckedBorderColor },
-        disabledBorderColor.takeOrElse { this.disabledBorderColor },
-        disabledUncheckedBorderColor.takeOrElse { this.disabledUncheckedBorderColor },
-        disabledIndeterminateBorderColor.takeOrElse { this.disabledIndeterminateBorderColor },
-    )
+    ) =
+        CheckboxColors(
+            checkedCheckmarkColor.takeOrElse { this.checkedCheckmarkColor },
+            uncheckedCheckmarkColor.takeOrElse { this.uncheckedCheckmarkColor },
+            checkedBoxColor.takeOrElse { this.checkedBoxColor },
+            uncheckedBoxColor.takeOrElse { this.uncheckedBoxColor },
+            disabledCheckedBoxColor.takeOrElse { this.disabledCheckedBoxColor },
+            disabledUncheckedBoxColor.takeOrElse { this.disabledUncheckedBoxColor },
+            disabledIndeterminateBoxColor.takeOrElse { this.disabledIndeterminateBoxColor },
+            checkedBorderColor.takeOrElse { this.checkedBorderColor },
+            uncheckedBorderColor.takeOrElse { this.uncheckedBorderColor },
+            disabledBorderColor.takeOrElse { this.disabledBorderColor },
+            disabledUncheckedBorderColor.takeOrElse { this.disabledUncheckedBorderColor },
+            disabledIndeterminateBorderColor.takeOrElse { this.disabledIndeterminateBorderColor },
+        )
 
     /**
      * Represents the color used for the checkmark inside the checkbox, depending on [state].
@@ -476,11 +480,12 @@
      */
     @Composable
     internal fun checkmarkColor(state: ToggleableState): State<Color> {
-        val target = if (state == ToggleableState.Off) {
-            uncheckedCheckmarkColor
-        } else {
-            checkedCheckmarkColor
-        }
+        val target =
+            if (state == ToggleableState.Off) {
+                uncheckedCheckmarkColor
+            } else {
+                checkedCheckmarkColor
+            }
 
         val duration = if (state == ToggleableState.Off) BoxOutDuration else BoxInDuration
         return animateColorAsState(target, tween(durationMillis = duration))
@@ -495,18 +500,20 @@
      */
     @Composable
     internal fun boxColor(enabled: Boolean, state: ToggleableState): State<Color> {
-        val target = if (enabled) {
-            when (state) {
-                ToggleableState.On, ToggleableState.Indeterminate -> checkedBoxColor
-                ToggleableState.Off -> uncheckedBoxColor
+        val target =
+            if (enabled) {
+                when (state) {
+                    ToggleableState.On,
+                    ToggleableState.Indeterminate -> checkedBoxColor
+                    ToggleableState.Off -> uncheckedBoxColor
+                }
+            } else {
+                when (state) {
+                    ToggleableState.On -> disabledCheckedBoxColor
+                    ToggleableState.Indeterminate -> disabledIndeterminateBoxColor
+                    ToggleableState.Off -> disabledUncheckedBoxColor
+                }
             }
-        } else {
-            when (state) {
-                ToggleableState.On -> disabledCheckedBoxColor
-                ToggleableState.Indeterminate -> disabledIndeterminateBoxColor
-                ToggleableState.Off -> disabledUncheckedBoxColor
-            }
-        }
 
         // If not enabled 'snap' to the disabled state, as there should be no animations between
         // enabled / disabled.
@@ -526,18 +533,20 @@
      */
     @Composable
     internal fun borderColor(enabled: Boolean, state: ToggleableState): State<Color> {
-        val target = if (enabled) {
-            when (state) {
-                ToggleableState.On, ToggleableState.Indeterminate -> checkedBorderColor
-                ToggleableState.Off -> uncheckedBorderColor
+        val target =
+            if (enabled) {
+                when (state) {
+                    ToggleableState.On,
+                    ToggleableState.Indeterminate -> checkedBorderColor
+                    ToggleableState.Off -> uncheckedBorderColor
+                }
+            } else {
+                when (state) {
+                    ToggleableState.Indeterminate -> disabledIndeterminateBorderColor
+                    ToggleableState.On -> disabledBorderColor
+                    ToggleableState.Off -> disabledUncheckedBorderColor
+                }
             }
-        } else {
-            when (state) {
-                ToggleableState.Indeterminate -> disabledIndeterminateBorderColor
-                ToggleableState.On -> disabledBorderColor
-                ToggleableState.Off -> disabledUncheckedBorderColor
-            }
-        }
 
         // If not enabled 'snap' to the disabled state, as there should be no animations between
         // enabled / disabled.
diff --git a/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/Chip.kt b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/Chip.kt
index 6402dbf..7af3a46 100644
--- a/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/Chip.kt
+++ b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/Chip.kt
@@ -72,7 +72,8 @@
 import androidx.compose.ui.util.fastFirstOrNull
 
 /**
- * <a href="https://m3.material.io/components/chips/overview" class="external" target="_blank">Material Design assist chip</a>.
+ * <a href="https://m3.material.io/components/chips/overview" class="external"
+ * target="_blank">Material Design assist chip</a>.
  *
  * Chips help people enter information, make selections, filter content, or trigger actions. Chips
  * can show multiple interactive elements together in the same area, such as a list of selectable
@@ -82,36 +83,38 @@
  * calendar event from the home screen. Assist chips function as though the user asked an assistant
  * to complete the action. They should appear dynamically and contextually in a UI.
  *
- * ![Assist chip image](https://developer.android.com/images/reference/androidx/compose/material3/assist-chip.png)
+ * ![Assist chip
+ * image](https://developer.android.com/images/reference/androidx/compose/material3/assist-chip.png)
  *
  * This assist chip is applied with a flat style. If you want an elevated style, use the
  * [ElevatedAssistChip].
  *
  * Example of a flat AssistChip:
+ *
  * @sample androidx.compose.material3.samples.AssistChipSample
  *
  * @param onClick called when this chip is clicked
  * @param label text label for this chip
  * @param modifier the [Modifier] to be applied to this chip
  * @param enabled controls the enabled state of this chip. When `false`, this component will not
- * respond to user input, and it will appear visually disabled and disabled to accessibility
- * services.
+ *   respond to user input, and it will appear visually disabled and disabled to accessibility
+ *   services.
  * @param leadingIcon optional icon at the start of the chip, preceding the [label] text
  * @param trailingIcon optional icon at the end of the chip
  * @param shape defines the shape of this chip's container, border (when [border] is not null), and
- * shadow (when using [elevation])
+ *   shadow (when using [elevation])
  * @param colors [ChipColors] that will be used to resolve the colors used for this chip in
- * different states. See [AssistChipDefaults.assistChipColors].
+ *   different states. See [AssistChipDefaults.assistChipColors].
  * @param elevation [ChipElevation] used to resolve the elevation for this chip in different states.
- * This controls the size of the shadow below the chip. Additionally, when the container color is
- * [ColorScheme.surface], this controls the amount of primary color applied as an overlay. See
- * [AssistChipDefaults.assistChipElevation].
+ *   This controls the size of the shadow below the chip. Additionally, when the container color is
+ *   [ColorScheme.surface], this controls the amount of primary color applied as an overlay. See
+ *   [AssistChipDefaults.assistChipElevation].
  * @param border the border to draw around the container of this chip. Pass `null` for no border.
- * See [AssistChipDefaults.assistChipBorder].
+ *   See [AssistChipDefaults.assistChipBorder].
  * @param interactionSource an optional hoisted [MutableInteractionSource] for observing and
- * emitting [Interaction]s for this chip. You can use this to change the chip's appearance
- * or preview the chip in different states. Note that if `null` is provided, interactions will
- * still happen internally.
+ *   emitting [Interaction]s for this chip. You can use this to change the chip's appearance or
+ *   preview the chip in different states. Note that if `null` is provided, interactions will still
+ *   happen internally.
  */
 @Composable
 fun AssistChip(
@@ -126,26 +129,28 @@
     elevation: ChipElevation? = AssistChipDefaults.assistChipElevation(),
     border: BorderStroke? = AssistChipDefaults.assistChipBorder(enabled),
     interactionSource: MutableInteractionSource? = null,
-) = Chip(
-    modifier = modifier,
-    onClick = onClick,
-    enabled = enabled,
-    label = label,
-    labelTextStyle = AssistChipTokens.LabelTextFont.value,
-    labelColor = colors.labelColor(enabled),
-    leadingIcon = leadingIcon,
-    trailingIcon = trailingIcon,
-    shape = shape,
-    colors = colors,
-    elevation = elevation,
-    border = border,
-    minHeight = AssistChipDefaults.Height,
-    paddingValues = AssistChipPadding,
-    interactionSource = interactionSource
-)
+) =
+    Chip(
+        modifier = modifier,
+        onClick = onClick,
+        enabled = enabled,
+        label = label,
+        labelTextStyle = AssistChipTokens.LabelTextFont.value,
+        labelColor = colors.labelColor(enabled),
+        leadingIcon = leadingIcon,
+        trailingIcon = trailingIcon,
+        shape = shape,
+        colors = colors,
+        elevation = elevation,
+        border = border,
+        minHeight = AssistChipDefaults.Height,
+        paddingValues = AssistChipPadding,
+        interactionSource = interactionSource
+    )
 
 /**
- * <a href="https://m3.material.io/components/chips/overview" class="external" target="_blank">Material Design assist chip</a>.
+ * <a href="https://m3.material.io/components/chips/overview" class="external"
+ * target="_blank">Material Design assist chip</a>.
  *
  * Chips help people enter information, make selections, filter content, or trigger actions. Chips
  * can show multiple interactive elements together in the same area, such as a list of selectable
@@ -155,42 +160,47 @@
  * calendar event from the home screen. Assist chips function as though the user asked an assistant
  * to complete the action. They should appear dynamically and contextually in a UI.
  *
- * ![Assist chip image](https://developer.android.com/images/reference/androidx/compose/material3/assist-chip.png)
+ * ![Assist chip
+ * image](https://developer.android.com/images/reference/androidx/compose/material3/assist-chip.png)
  *
  * This assist chip is applied with a flat style. If you want an elevated style, use the
  * [ElevatedAssistChip].
  *
  * Example of a flat AssistChip:
+ *
  * @sample androidx.compose.material3.samples.AssistChipSample
  *
  * @param onClick called when this chip is clicked
  * @param label text label for this chip
  * @param modifier the [Modifier] to be applied to this chip
  * @param enabled controls the enabled state of this chip. When `false`, this component will not
- * respond to user input, and it will appear visually disabled and disabled to accessibility
- * services.
+ *   respond to user input, and it will appear visually disabled and disabled to accessibility
+ *   services.
  * @param leadingIcon optional icon at the start of the chip, preceding the [label] text
  * @param trailingIcon optional icon at the end of the chip
  * @param shape defines the shape of this chip's container, border (when [border] is not null), and
- * shadow (when using [elevation])
+ *   shadow (when using [elevation])
  * @param colors [ChipColors] that will be used to resolve the colors used for this chip in
- * different states. See [AssistChipDefaults.assistChipColors].
+ *   different states. See [AssistChipDefaults.assistChipColors].
  * @param elevation [ChipElevation] used to resolve the elevation for this chip in different states.
- * This controls the size of the shadow below the chip. Additionally, when the container color is
- * [ColorScheme.surface], this controls the amount of primary color applied as an overlay. See
- * [AssistChipDefaults.assistChipElevation].
+ *   This controls the size of the shadow below the chip. Additionally, when the container color is
+ *   [ColorScheme.surface], this controls the amount of primary color applied as an overlay. See
+ *   [AssistChipDefaults.assistChipElevation].
  * @param border the border to draw around the container of this chip. Pass `null` for no border.
- * See [AssistChipDefaults.assistChipBorder].
+ *   See [AssistChipDefaults.assistChipBorder].
  * @param interactionSource the [MutableInteractionSource] representing the stream of [Interaction]s
- * for this chip. You can create and pass in your own `remember`ed instance to observe
- * [Interaction]s and customize the appearance / behavior of this chip in different states.
+ *   for this chip. You can create and pass in your own `remember`ed instance to observe
+ *   [Interaction]s and customize the appearance / behavior of this chip in different states.
  */
 @Suppress("DEPRECATION")
 @Deprecated(
     "Maintained for binary compatibility. Use version with AssistChip that take a" +
         " BorderStroke instead",
-    replaceWith = ReplaceWith("AssistChip(onClick, label, modifier, enabled,leadingIcon," +
-        " trailingIcon, shape, colors, elevation, border, interactionSource"),
+    replaceWith =
+        ReplaceWith(
+            "AssistChip(onClick, label, modifier, enabled,leadingIcon," +
+                " trailingIcon, shape, colors, elevation, border, interactionSource"
+        ),
     level = DeprecationLevel.HIDDEN
 )
 @Composable
@@ -206,26 +216,28 @@
     elevation: ChipElevation? = AssistChipDefaults.assistChipElevation(),
     border: ChipBorder? = AssistChipDefaults.assistChipBorder(),
     interactionSource: MutableInteractionSource = remember { MutableInteractionSource() },
-) = Chip(
-    modifier = modifier,
-    onClick = onClick,
-    enabled = enabled,
-    label = label,
-    labelTextStyle = AssistChipTokens.LabelTextFont.value,
-    labelColor = colors.labelColor(enabled),
-    leadingIcon = leadingIcon,
-    trailingIcon = trailingIcon,
-    shape = shape,
-    colors = colors,
-    elevation = elevation,
-    border = border?.borderStroke(enabled)?.value,
-    minHeight = AssistChipDefaults.Height,
-    paddingValues = AssistChipPadding,
-    interactionSource = interactionSource
-)
+) =
+    Chip(
+        modifier = modifier,
+        onClick = onClick,
+        enabled = enabled,
+        label = label,
+        labelTextStyle = AssistChipTokens.LabelTextFont.value,
+        labelColor = colors.labelColor(enabled),
+        leadingIcon = leadingIcon,
+        trailingIcon = trailingIcon,
+        shape = shape,
+        colors = colors,
+        elevation = elevation,
+        border = border?.borderStroke(enabled)?.value,
+        minHeight = AssistChipDefaults.Height,
+        paddingValues = AssistChipPadding,
+        interactionSource = interactionSource
+    )
 
 /**
- * <a href="https://m3.material.io/components/chips/overview" class="external" target="_blank">Material Design elevated assist chip</a>.
+ * <a href="https://m3.material.io/components/chips/overview" class="external"
+ * target="_blank">Material Design elevated assist chip</a>.
  *
  * Chips help people enter information, make selections, filter content, or trigger actions. Chips
  * can show multiple interactive elements together in the same area, such as a list of selectable
@@ -235,35 +247,37 @@
  * calendar event from the home screen. Assist chips function as though the user asked an assistant
  * to complete the action. They should appear dynamically and contextually in a UI.
  *
- * ![Assist chip image](https://developer.android.com/images/reference/androidx/compose/material3/elevated-assist-chip.png)
+ * ![Assist chip
+ * image](https://developer.android.com/images/reference/androidx/compose/material3/elevated-assist-chip.png)
  *
  * This assist chip is applied with an elevated style. If you want a flat style, use the
  * [AssistChip].
  *
  * Example of an elevated AssistChip with a trailing icon:
+ *
  * @sample androidx.compose.material3.samples.ElevatedAssistChipSample
  *
  * @param onClick called when this chip is clicked
  * @param label text label for this chip
  * @param modifier the [Modifier] to be applied to this chip
  * @param enabled controls the enabled state of this chip. When `false`, this component will not
- * respond to user input, and it will appear visually disabled and disabled to accessibility
- * services.
+ *   respond to user input, and it will appear visually disabled and disabled to accessibility
+ *   services.
  * @param leadingIcon optional icon at the start of the chip, preceding the [label] text
  * @param trailingIcon optional icon at the end of the chip
  * @param shape defines the shape of this chip's container, border (when [border] is not null), and
- * shadow (when using [elevation])
+ *   shadow (when using [elevation])
  * @param colors [ChipColors] that will be used to resolve the colors used for this chip in
- * different states. See [AssistChipDefaults.elevatedAssistChipColors].
+ *   different states. See [AssistChipDefaults.elevatedAssistChipColors].
  * @param elevation [ChipElevation] used to resolve the elevation for this chip in different states.
- * This controls the size of the shadow below the chip. Additionally, when the container color is
- * [ColorScheme.surface], this controls the amount of primary color applied as an overlay. See
- * [AssistChipDefaults.elevatedAssistChipElevation].
+ *   This controls the size of the shadow below the chip. Additionally, when the container color is
+ *   [ColorScheme.surface], this controls the amount of primary color applied as an overlay. See
+ *   [AssistChipDefaults.elevatedAssistChipElevation].
  * @param border the border to draw around the container of this chip
  * @param interactionSource an optional hoisted [MutableInteractionSource] for observing and
- * emitting [Interaction]s for this chip. You can use this to change the chip's appearance
- * or preview the chip in different states. Note that if `null` is provided, interactions will
- * still happen internally.
+ *   emitting [Interaction]s for this chip. You can use this to change the chip's appearance or
+ *   preview the chip in different states. Note that if `null` is provided, interactions will still
+ *   happen internally.
  */
 @Composable
 fun ElevatedAssistChip(
@@ -278,26 +292,28 @@
     elevation: ChipElevation? = AssistChipDefaults.elevatedAssistChipElevation(),
     border: BorderStroke? = null,
     interactionSource: MutableInteractionSource? = null
-) = Chip(
-    modifier = modifier,
-    onClick = onClick,
-    enabled = enabled,
-    label = label,
-    labelTextStyle = AssistChipTokens.LabelTextFont.value,
-    labelColor = colors.labelColor(enabled),
-    leadingIcon = leadingIcon,
-    trailingIcon = trailingIcon,
-    elevation = elevation,
-    colors = colors,
-    minHeight = AssistChipDefaults.Height,
-    paddingValues = AssistChipPadding,
-    shape = shape,
-    border = border,
-    interactionSource = interactionSource
-)
+) =
+    Chip(
+        modifier = modifier,
+        onClick = onClick,
+        enabled = enabled,
+        label = label,
+        labelTextStyle = AssistChipTokens.LabelTextFont.value,
+        labelColor = colors.labelColor(enabled),
+        leadingIcon = leadingIcon,
+        trailingIcon = trailingIcon,
+        elevation = elevation,
+        colors = colors,
+        minHeight = AssistChipDefaults.Height,
+        paddingValues = AssistChipPadding,
+        shape = shape,
+        border = border,
+        interactionSource = interactionSource
+    )
 
 /**
- * <a href="https://m3.material.io/components/chips/overview" class="external" target="_blank">Material Design elevated assist chip</a>.
+ * <a href="https://m3.material.io/components/chips/overview" class="external"
+ * target="_blank">Material Design elevated assist chip</a>.
  *
  * Chips help people enter information, make selections, filter content, or trigger actions. Chips
  * can show multiple interactive elements together in the same area, such as a list of selectable
@@ -307,41 +323,46 @@
  * calendar event from the home screen. Assist chips function as though the user asked an assistant
  * to complete the action. They should appear dynamically and contextually in a UI.
  *
- * ![Assist chip image](https://developer.android.com/images/reference/androidx/compose/material3/elevated-assist-chip.png)
+ * ![Assist chip
+ * image](https://developer.android.com/images/reference/androidx/compose/material3/elevated-assist-chip.png)
  *
  * This assist chip is applied with an elevated style. If you want a flat style, use the
  * [AssistChip].
  *
  * Example of an elevated AssistChip with a trailing icon:
+ *
  * @sample androidx.compose.material3.samples.ElevatedAssistChipSample
  *
  * @param onClick called when this chip is clicked
  * @param label text label for this chip
  * @param modifier the [Modifier] to be applied to this chip
  * @param enabled controls the enabled state of this chip. When `false`, this component will not
- * respond to user input, and it will appear visually disabled and disabled to accessibility
- * services.
+ *   respond to user input, and it will appear visually disabled and disabled to accessibility
+ *   services.
  * @param leadingIcon optional icon at the start of the chip, preceding the [label] text
  * @param trailingIcon optional icon at the end of the chip
  * @param shape defines the shape of this chip's container, border (when [border] is not null), and
- * shadow (when using [elevation])
+ *   shadow (when using [elevation])
  * @param colors [ChipColors] that will be used to resolve the colors used for this chip in
- * different states. See [AssistChipDefaults.elevatedAssistChipColors].
+ *   different states. See [AssistChipDefaults.elevatedAssistChipColors].
  * @param elevation [ChipElevation] used to resolve the elevation for this chip in different states.
- * This controls the size of the shadow below the chip. Additionally, when the container color is
- * [ColorScheme.surface], this controls the amount of primary color applied as an overlay. See
- * [AssistChipDefaults.elevatedAssistChipElevation].
+ *   This controls the size of the shadow below the chip. Additionally, when the container color is
+ *   [ColorScheme.surface], this controls the amount of primary color applied as an overlay. See
+ *   [AssistChipDefaults.elevatedAssistChipElevation].
  * @param border the border to draw around the container of this chip
  * @param interactionSource the [MutableInteractionSource] representing the stream of [Interaction]s
- * for this chip. You can create and pass in your own `remember`ed instance to observe
- * [Interaction]s and customize the appearance / behavior of this chip in different states.
+ *   for this chip. You can create and pass in your own `remember`ed instance to observe
+ *   [Interaction]s and customize the appearance / behavior of this chip in different states.
  */
 @Suppress("DEPRECATION")
 @Deprecated(
     "Maintained for binary compatibility. Use version with ElevatedAssistChip that take a" +
         " BorderStroke instead",
-    replaceWith = ReplaceWith("ElevatedAssistChip(onClick, label, modifier, enabled," +
-        "leadingIcon, trailingIcon, shape, colors, elevation, border, interactionSource"),
+    replaceWith =
+        ReplaceWith(
+            "ElevatedAssistChip(onClick, label, modifier, enabled," +
+                "leadingIcon, trailingIcon, shape, colors, elevation, border, interactionSource"
+        ),
     level = DeprecationLevel.HIDDEN
 )
 @Composable
@@ -357,26 +378,28 @@
     elevation: ChipElevation? = AssistChipDefaults.elevatedAssistChipElevation(),
     border: ChipBorder? = null,
     interactionSource: MutableInteractionSource = remember { MutableInteractionSource() }
-) = Chip(
-    modifier = modifier,
-    onClick = onClick,
-    enabled = enabled,
-    label = label,
-    labelTextStyle = AssistChipTokens.LabelTextFont.value,
-    labelColor = colors.labelColor(enabled),
-    leadingIcon = leadingIcon,
-    trailingIcon = trailingIcon,
-    elevation = elevation,
-    colors = colors,
-    minHeight = AssistChipDefaults.Height,
-    paddingValues = AssistChipPadding,
-    shape = shape,
-    border = border?.borderStroke(enabled)?.value,
-    interactionSource = interactionSource
-)
+) =
+    Chip(
+        modifier = modifier,
+        onClick = onClick,
+        enabled = enabled,
+        label = label,
+        labelTextStyle = AssistChipTokens.LabelTextFont.value,
+        labelColor = colors.labelColor(enabled),
+        leadingIcon = leadingIcon,
+        trailingIcon = trailingIcon,
+        elevation = elevation,
+        colors = colors,
+        minHeight = AssistChipDefaults.Height,
+        paddingValues = AssistChipPadding,
+        shape = shape,
+        border = border?.borderStroke(enabled)?.value,
+        interactionSource = interactionSource
+    )
 
 /**
- * <a href="https://m3.material.io/components/chips/overview" class="external" target="_blank">Material Design filter chip</a>.
+ * <a href="https://m3.material.io/components/chips/overview" class="external"
+ * target="_blank">Material Design filter chip</a>.
  *
  * Chips help people enter information, make selections, filter content, or trigger actions. Chips
  * can show multiple interactive elements together in the same area, such as a list of selectable
@@ -385,7 +408,8 @@
  * Filter chips use tags or descriptive words to filter content. They can be a good alternative to
  * toggle buttons or checkboxes.
  *
- * ![Filter chip image](https://developer.android.com/images/reference/androidx/compose/material3/filter-chip.png)
+ * ![Filter chip
+ * image](https://developer.android.com/images/reference/androidx/compose/material3/filter-chip.png)
  *
  * This filter chip is applied with a flat style. If you want an elevated style, use the
  * [ElevatedFilterChip].
@@ -394,9 +418,11 @@
  * provided (e.g. a checkmark) to be appended at the starting edge of the chip's label.
  *
  * Example of a flat FilterChip with a trailing icon:
+ *
  * @sample androidx.compose.material3.samples.FilterChipSample
  *
  * Example of a FilterChip with both a leading icon and a selected icon:
+ *
  * @sample androidx.compose.material3.samples.FilterChipWithLeadingIconSample
  *
  * @param selected whether this chip is selected or not
@@ -404,26 +430,26 @@
  * @param label text label for this chip
  * @param modifier the [Modifier] to be applied to this chip
  * @param enabled controls the enabled state of this chip. When `false`, this component will not
- * respond to user input, and it will appear visually disabled and disabled to accessibility
- * services.
+ *   respond to user input, and it will appear visually disabled and disabled to accessibility
+ *   services.
  * @param leadingIcon optional icon at the start of the chip, preceding the [label] text. When
- * [selected] is true, this icon may visually indicate that the chip is selected (for example, via a
- * checkmark icon).
+ *   [selected] is true, this icon may visually indicate that the chip is selected (for example, via
+ *   a checkmark icon).
  * @param trailingIcon optional icon at the end of the chip
  * @param shape defines the shape of this chip's container, border (when [border] is not null), and
- * shadow (when using [elevation])
+ *   shadow (when using [elevation])
  * @param colors [SelectableChipColors] that will be used to resolve the colors used for this chip
- * in different states. See [FilterChipDefaults.filterChipColors].
+ *   in different states. See [FilterChipDefaults.filterChipColors].
  * @param elevation [SelectableChipElevation] used to resolve the elevation for this chip in
- * different states. This controls the size of the shadow below the chip. Additionally, when the
- * container color is [ColorScheme.surface], this controls the amount of primary color applied as an
- * overlay. See [FilterChipDefaults.filterChipElevation].
+ *   different states. This controls the size of the shadow below the chip. Additionally, when the
+ *   container color is [ColorScheme.surface], this controls the amount of primary color applied as
+ *   an overlay. See [FilterChipDefaults.filterChipElevation].
  * @param border the border to draw around the container of this chip. Pass `null` for no border.
- * See [FilterChipDefaults.filterChipBorder].
+ *   See [FilterChipDefaults.filterChipBorder].
  * @param interactionSource an optional hoisted [MutableInteractionSource] for observing and
- * emitting [Interaction]s for this chip. You can use this to change the chip's appearance
- * or preview the chip in different states. Note that if `null` is provided, interactions will
- * still happen internally.
+ *   emitting [Interaction]s for this chip. You can use this to change the chip's appearance or
+ *   preview the chip in different states. Note that if `null` is provided, interactions will still
+ *   happen internally.
  */
 @Composable
 fun FilterChip(
@@ -439,27 +465,29 @@
     elevation: SelectableChipElevation? = FilterChipDefaults.filterChipElevation(),
     border: BorderStroke? = FilterChipDefaults.filterChipBorder(enabled, selected),
     interactionSource: MutableInteractionSource? = null
-) = SelectableChip(
-    selected = selected,
-    modifier = modifier,
-    onClick = onClick,
-    enabled = enabled,
-    label = label,
-    labelTextStyle = FilterChipTokens.LabelTextFont.value,
-    leadingIcon = leadingIcon,
-    avatar = null,
-    trailingIcon = trailingIcon,
-    elevation = elevation,
-    colors = colors,
-    minHeight = FilterChipDefaults.Height,
-    paddingValues = FilterChipPadding,
-    shape = shape,
-    border = border,
-    interactionSource = interactionSource
-)
+) =
+    SelectableChip(
+        selected = selected,
+        modifier = modifier,
+        onClick = onClick,
+        enabled = enabled,
+        label = label,
+        labelTextStyle = FilterChipTokens.LabelTextFont.value,
+        leadingIcon = leadingIcon,
+        avatar = null,
+        trailingIcon = trailingIcon,
+        elevation = elevation,
+        colors = colors,
+        minHeight = FilterChipDefaults.Height,
+        paddingValues = FilterChipPadding,
+        shape = shape,
+        border = border,
+        interactionSource = interactionSource
+    )
 
 /**
- * <a href="https://m3.material.io/components/chips/overview" class="external" target="_blank">Material Design elevated filter chip</a>.
+ * <a href="https://m3.material.io/components/chips/overview" class="external"
+ * target="_blank">Material Design elevated filter chip</a>.
  *
  * Chips help people enter information, make selections, filter content, or trigger actions. Chips
  * can show multiple interactive elements together in the same area, such as a list of selectable
@@ -468,7 +496,8 @@
  * Filter chips use tags or descriptive words to filter content. They can be a good alternative to
  * toggle buttons or checkboxes.
  *
- * ![Filter chip image](https://developer.android.com/images/reference/androidx/compose/material3/elevated-filter-chip.png)
+ * ![Filter chip
+ * image](https://developer.android.com/images/reference/androidx/compose/material3/elevated-filter-chip.png)
  *
  * This filter chip is applied with an elevated style. If you want a flat style, use the
  * [FilterChip].
@@ -477,6 +506,7 @@
  * provided (e.g. a checkmark) to be appended at the starting edge of the chip's label.
  *
  * Example of an elevated FilterChip with a trailing icon:
+ *
  * @sample androidx.compose.material3.samples.ElevatedFilterChipSample
  *
  * @param selected whether this chip is selected or not
@@ -484,26 +514,26 @@
  * @param label text label for this chip
  * @param modifier the [Modifier] to be applied to this chip
  * @param enabled controls the enabled state of this chip. When `false`, this component will not
- * respond to user input, and it will appear visually disabled and disabled to accessibility
- * services.
+ *   respond to user input, and it will appear visually disabled and disabled to accessibility
+ *   services.
  * @param leadingIcon optional icon at the start of the chip, preceding the [label] text. When
- * [selected] is true, this icon may visually indicate that the chip is selected (for example, via a
- * checkmark icon).
+ *   [selected] is true, this icon may visually indicate that the chip is selected (for example, via
+ *   a checkmark icon).
  * @param trailingIcon optional icon at the end of the chip
  * @param shape defines the shape of this chip's container, border (when [border] is not null), and
- * shadow (when using [elevation])
+ *   shadow (when using [elevation])
  * @param colors [SelectableChipColors] that will be used to resolve the colors used for this chip
- * in different states. See [FilterChipDefaults.elevatedFilterChipColors].
+ *   in different states. See [FilterChipDefaults.elevatedFilterChipColors].
  * @param elevation [SelectableChipElevation] used to resolve the elevation for this chip in
- * different states. This controls the size of the shadow below the chip. Additionally, when the
- * container color is [ColorScheme.surface], this controls the amount of primary color applied as an
- * overlay. See [FilterChipDefaults.filterChipElevation].
+ *   different states. This controls the size of the shadow below the chip. Additionally, when the
+ *   container color is [ColorScheme.surface], this controls the amount of primary color applied as
+ *   an overlay. See [FilterChipDefaults.filterChipElevation].
  * @param border the border to draw around the container of this chip. Pass `null` for no border.
- * See [FilterChipDefaults.filterChipBorder].
+ *   See [FilterChipDefaults.filterChipBorder].
  * @param interactionSource an optional hoisted [MutableInteractionSource] for observing and
- * emitting [Interaction]s for this chip. You can use this to change the chip's appearance
- * or preview the chip in different states. Note that if `null` is provided, interactions will
- * still happen internally.
+ *   emitting [Interaction]s for this chip. You can use this to change the chip's appearance or
+ *   preview the chip in different states. Note that if `null` is provided, interactions will still
+ *   happen internally.
  */
 @Composable
 fun ElevatedFilterChip(
@@ -519,27 +549,29 @@
     elevation: SelectableChipElevation? = FilterChipDefaults.elevatedFilterChipElevation(),
     border: BorderStroke? = null,
     interactionSource: MutableInteractionSource? = null
-) = SelectableChip(
-    selected = selected,
-    modifier = modifier,
-    onClick = onClick,
-    enabled = enabled,
-    label = label,
-    labelTextStyle = FilterChipTokens.LabelTextFont.value,
-    leadingIcon = leadingIcon,
-    avatar = null,
-    trailingIcon = trailingIcon,
-    elevation = elevation,
-    colors = colors,
-    minHeight = FilterChipDefaults.Height,
-    paddingValues = FilterChipPadding,
-    shape = shape,
-    border = border,
-    interactionSource = interactionSource
-)
+) =
+    SelectableChip(
+        selected = selected,
+        modifier = modifier,
+        onClick = onClick,
+        enabled = enabled,
+        label = label,
+        labelTextStyle = FilterChipTokens.LabelTextFont.value,
+        leadingIcon = leadingIcon,
+        avatar = null,
+        trailingIcon = trailingIcon,
+        elevation = elevation,
+        colors = colors,
+        minHeight = FilterChipDefaults.Height,
+        paddingValues = FilterChipPadding,
+        shape = shape,
+        border = border,
+        interactionSource = interactionSource
+    )
 
 /**
- * <a href="https://m3.material.io/components/chips/overview" class="external" target="_blank">Material Design input chip</a>.
+ * <a href="https://m3.material.io/components/chips/overview" class="external"
+ * target="_blank">Material Design input chip</a>.
  *
  * Chips help people enter information, make selections, filter content, or trigger actions. Chips
  * can show multiple interactive elements together in the same area, such as a list of selectable
@@ -547,21 +579,26 @@
  *
  * Input chips represent discrete pieces of information entered by a user.
  *
- * ![Input chip image](https://developer.android.com/images/reference/androidx/compose/material3/input-chip.png)
+ * ![Input chip
+ * image](https://developer.android.com/images/reference/androidx/compose/material3/input-chip.png)
  *
  * An Input Chip can have a leading icon or an avatar at its start. In case both are provided, the
  * avatar will take precedence and will be displayed.
  *
  * Example of an InputChip with a trailing icon:
+ *
  * @sample androidx.compose.material3.samples.InputChipSample
  *
  * Example of an InputChip with an avatar and a trailing icon:
+ *
  * @sample androidx.compose.material3.samples.InputChipWithAvatarSample
  *
  * Input chips should appear in a set and can be horizontally scrollable:
+ *
  * @sample androidx.compose.material3.samples.ChipGroupSingleLineSample
  *
  * Alternatively, use [androidx.compose.foundation.layout.FlowRow] to wrap chips to a new line.
+ *
  * @sample androidx.compose.material3.samples.ChipGroupReflowSample
  *
  * @param selected whether this chip is selected or not
@@ -569,25 +606,25 @@
  * @param label text label for this chip
  * @param modifier the [Modifier] to be applied to this chip
  * @param enabled controls the enabled state of this chip. When `false`, this component will not
- * respond to user input, and it will appear visually disabled and disabled to accessibility
- * services.
+ *   respond to user input, and it will appear visually disabled and disabled to accessibility
+ *   services.
  * @param leadingIcon optional icon at the start of the chip, preceding the [label] text
  * @param avatar optional avatar at the start of the chip, preceding the [label] text
  * @param trailingIcon optional icon at the end of the chip
  * @param shape defines the shape of this chip's container, border (when [border] is not null), and
- * shadow (when using [elevation])
+ *   shadow (when using [elevation])
  * @param colors [ChipColors] that will be used to resolve the colors used for this chip in
- * different states. See [InputChipDefaults.inputChipColors].
+ *   different states. See [InputChipDefaults.inputChipColors].
  * @param elevation [ChipElevation] used to resolve the elevation for this chip in different states.
- * This controls the size of the shadow below the chip. Additionally, when the container color is
- * [ColorScheme.surface], this controls the amount of primary color applied as an overlay. See
- * [InputChipDefaults.inputChipElevation].
+ *   This controls the size of the shadow below the chip. Additionally, when the container color is
+ *   [ColorScheme.surface], this controls the amount of primary color applied as an overlay. See
+ *   [InputChipDefaults.inputChipElevation].
  * @param border the border to draw around the container of this chip. Pass `null` for no border.
- * See [InputChipDefaults.inputChipBorder].
+ *   See [InputChipDefaults.inputChipBorder].
  * @param interactionSource an optional hoisted [MutableInteractionSource] for observing and
- * emitting [Interaction]s for this chip. You can use this to change the chip's appearance
- * or preview the chip in different states. Note that if `null` is provided, interactions will
- * still happen internally.
+ *   emitting [Interaction]s for this chip. You can use this to change the chip's appearance or
+ *   preview the chip in different states. Note that if `null` is provided, interactions will still
+ *   happen internally.
  */
 @Composable
 fun InputChip(
@@ -611,18 +648,20 @@
     if (avatar != null) {
         val avatarOpacity = if (enabled) 1f else InputChipTokens.DisabledAvatarOpacity
         val avatarShape = InputChipTokens.AvatarShape.value
-        shapedAvatar = @Composable {
-            Box(
-                modifier = Modifier.graphicsLayer {
-                    this.alpha = avatarOpacity
-                    this.shape = avatarShape
-                    this.clip = true
-                },
-                contentAlignment = Alignment.Center
-            ) {
-                avatar()
+        shapedAvatar =
+            @Composable {
+                Box(
+                    modifier =
+                        Modifier.graphicsLayer {
+                            this.alpha = avatarOpacity
+                            this.shape = avatarShape
+                            this.clip = true
+                        },
+                    contentAlignment = Alignment.Center
+                ) {
+                    avatar()
+                }
             }
-        }
     }
     SelectableChip(
         selected = selected,
@@ -639,17 +678,19 @@
         elevation = elevation,
         border = border,
         minHeight = InputChipDefaults.Height,
-        paddingValues = inputChipPadding(
-            hasAvatar = shapedAvatar != null,
-            hasLeadingIcon = leadingIcon != null,
-            hasTrailingIcon = trailingIcon != null
-        ),
+        paddingValues =
+            inputChipPadding(
+                hasAvatar = shapedAvatar != null,
+                hasLeadingIcon = leadingIcon != null,
+                hasTrailingIcon = trailingIcon != null
+            ),
         interactionSource = interactionSource
     )
 }
 
 /**
- * <a href="https://m3.material.io/components/chips/overview" class="external" target="_blank">Material Design suggestion chip</a>.
+ * <a href="https://m3.material.io/components/chips/overview" class="external"
+ * target="_blank">Material Design suggestion chip</a>.
  *
  * Chips help people enter information, make selections, filter content, or trigger actions. Chips
  * can show multiple interactive elements together in the same area, such as a list of selectable
@@ -658,35 +699,37 @@
  * Suggestion chips help narrow a user's intent by presenting dynamically generated suggestions,
  * such as possible responses or search filters.
  *
- * ![Suggestion chip image](https://developer.android.com/images/reference/androidx/compose/material3/suggestion-chip.png)
+ * ![Suggestion chip
+ * image](https://developer.android.com/images/reference/androidx/compose/material3/suggestion-chip.png)
  *
  * This suggestion chip is applied with a flat style. If you want an elevated style, use the
  * [ElevatedSuggestionChip].
  *
  * Example of a flat SuggestionChip with a trailing icon:
+ *
  * @sample androidx.compose.material3.samples.SuggestionChipSample
  *
  * @param onClick called when this chip is clicked
  * @param label text label for this chip
  * @param modifier the [Modifier] to be applied to this chip
  * @param enabled controls the enabled state of this chip. When `false`, this component will not
- * respond to user input, and it will appear visually disabled and disabled to accessibility
- * services.
+ *   respond to user input, and it will appear visually disabled and disabled to accessibility
+ *   services.
  * @param icon optional icon at the start of the chip, preceding the [label] text
  * @param shape defines the shape of this chip's container, border (when [border] is not null), and
- * shadow (when using [elevation])
+ *   shadow (when using [elevation])
  * @param colors [ChipColors] that will be used to resolve the colors used for this chip in
- * different states. See [SuggestionChipDefaults.suggestionChipColors].
+ *   different states. See [SuggestionChipDefaults.suggestionChipColors].
  * @param elevation [ChipElevation] used to resolve the elevation for this chip in different states.
- * This controls the size of the shadow below the chip. Additionally, when the container color is
- * [ColorScheme.surface], this controls the amount of primary color applied as an overlay. See
- * [SuggestionChipDefaults.suggestionChipElevation].
+ *   This controls the size of the shadow below the chip. Additionally, when the container color is
+ *   [ColorScheme.surface], this controls the amount of primary color applied as an overlay. See
+ *   [SuggestionChipDefaults.suggestionChipElevation].
  * @param border the border to draw around the container of this chip. Pass `null` for no border.
- * See [SuggestionChipDefaults.suggestionChipBorder].
+ *   See [SuggestionChipDefaults.suggestionChipBorder].
  * @param interactionSource an optional hoisted [MutableInteractionSource] for observing and
- * emitting [Interaction]s for this chip. You can use this to change the chip's appearance
- * or preview the chip in different states. Note that if `null` is provided, interactions will
- * still happen internally.
+ *   emitting [Interaction]s for this chip. You can use this to change the chip's appearance or
+ *   preview the chip in different states. Note that if `null` is provided, interactions will still
+ *   happen internally.
  */
 @Composable
 fun SuggestionChip(
@@ -700,26 +743,28 @@
     elevation: ChipElevation? = SuggestionChipDefaults.suggestionChipElevation(),
     border: BorderStroke? = SuggestionChipDefaults.suggestionChipBorder(enabled),
     interactionSource: MutableInteractionSource? = null,
-) = Chip(
-    modifier = modifier,
-    onClick = onClick,
-    enabled = enabled,
-    label = label,
-    labelTextStyle = SuggestionChipTokens.LabelTextFont.value,
-    labelColor = colors.labelColor(enabled),
-    leadingIcon = icon,
-    trailingIcon = null,
-    shape = shape,
-    colors = colors,
-    elevation = elevation,
-    border = border,
-    minHeight = SuggestionChipDefaults.Height,
-    paddingValues = SuggestionChipPadding,
-    interactionSource = interactionSource
-)
+) =
+    Chip(
+        modifier = modifier,
+        onClick = onClick,
+        enabled = enabled,
+        label = label,
+        labelTextStyle = SuggestionChipTokens.LabelTextFont.value,
+        labelColor = colors.labelColor(enabled),
+        leadingIcon = icon,
+        trailingIcon = null,
+        shape = shape,
+        colors = colors,
+        elevation = elevation,
+        border = border,
+        minHeight = SuggestionChipDefaults.Height,
+        paddingValues = SuggestionChipPadding,
+        interactionSource = interactionSource
+    )
 
 /**
- * <a href="https://m3.material.io/components/chips/overview" class="external" target="_blank">Material Design suggestion chip</a>.
+ * <a href="https://m3.material.io/components/chips/overview" class="external"
+ * target="_blank">Material Design suggestion chip</a>.
  *
  * Chips help people enter information, make selections, filter content, or trigger actions. Chips
  * can show multiple interactive elements together in the same area, such as a list of selectable
@@ -728,41 +773,46 @@
  * Suggestion chips help narrow a user's intent by presenting dynamically generated suggestions,
  * such as possible responses or search filters.
  *
- * ![Suggestion chip image](https://developer.android.com/images/reference/androidx/compose/material3/suggestion-chip.png)
+ * ![Suggestion chip
+ * image](https://developer.android.com/images/reference/androidx/compose/material3/suggestion-chip.png)
  *
  * This suggestion chip is applied with a flat style. If you want an elevated style, use the
  * [ElevatedSuggestionChip].
  *
  * Example of a flat SuggestionChip with a trailing icon:
+ *
  * @sample androidx.compose.material3.samples.SuggestionChipSample
  *
  * @param onClick called when this chip is clicked
  * @param label text label for this chip
  * @param modifier the [Modifier] to be applied to this chip
  * @param enabled controls the enabled state of this chip. When `false`, this component will not
- * respond to user input, and it will appear visually disabled and disabled to accessibility
- * services.
+ *   respond to user input, and it will appear visually disabled and disabled to accessibility
+ *   services.
  * @param icon optional icon at the start of the chip, preceding the [label] text
  * @param shape defines the shape of this chip's container, border (when [border] is not null), and
- * shadow (when using [elevation])
+ *   shadow (when using [elevation])
  * @param colors [ChipColors] that will be used to resolve the colors used for this chip in
- * different states. See [SuggestionChipDefaults.suggestionChipColors].
+ *   different states. See [SuggestionChipDefaults.suggestionChipColors].
  * @param elevation [ChipElevation] used to resolve the elevation for this chip in different states.
- * This controls the size of the shadow below the chip. Additionally, when the container color is
- * [ColorScheme.surface], this controls the amount of primary color applied as an overlay. See
- * [SuggestionChipDefaults.suggestionChipElevation].
+ *   This controls the size of the shadow below the chip. Additionally, when the container color is
+ *   [ColorScheme.surface], this controls the amount of primary color applied as an overlay. See
+ *   [SuggestionChipDefaults.suggestionChipElevation].
  * @param border the border to draw around the container of this chip. Pass `null` for no border.
- * See [SuggestionChipDefaults.suggestionChipBorder].
+ *   See [SuggestionChipDefaults.suggestionChipBorder].
  * @param interactionSource the [MutableInteractionSource] representing the stream of [Interaction]s
- * for this chip. You can create and pass in your own `remember`ed instance to observe
- * [Interaction]s and customize the appearance / behavior of this chip in different states.
+ *   for this chip. You can create and pass in your own `remember`ed instance to observe
+ *   [Interaction]s and customize the appearance / behavior of this chip in different states.
  */
 @Suppress("DEPRECATION")
 @Deprecated(
     "Maintained for binary compatibility. Use version with SuggestionChip that take a" +
         " BorderStroke instead",
-    replaceWith = ReplaceWith("SuggestionChip(onClick, label, modifier, enabled, icon," +
-        " shape, colors, elevation, border, interactionSource"),
+    replaceWith =
+        ReplaceWith(
+            "SuggestionChip(onClick, label, modifier, enabled, icon," +
+                " shape, colors, elevation, border, interactionSource"
+        ),
     level = DeprecationLevel.HIDDEN
 )
 @Composable
@@ -777,26 +827,28 @@
     elevation: ChipElevation? = SuggestionChipDefaults.suggestionChipElevation(),
     border: ChipBorder? = SuggestionChipDefaults.suggestionChipBorder(),
     interactionSource: MutableInteractionSource = remember { MutableInteractionSource() },
-) = Chip(
-    modifier = modifier,
-    onClick = onClick,
-    enabled = enabled,
-    label = label,
-    labelTextStyle = SuggestionChipTokens.LabelTextFont.value,
-    labelColor = colors.labelColor(enabled),
-    leadingIcon = icon,
-    trailingIcon = null,
-    shape = shape,
-    colors = colors,
-    elevation = elevation,
-    border = border?.borderStroke(enabled)?.value,
-    minHeight = SuggestionChipDefaults.Height,
-    paddingValues = SuggestionChipPadding,
-    interactionSource = interactionSource
-)
+) =
+    Chip(
+        modifier = modifier,
+        onClick = onClick,
+        enabled = enabled,
+        label = label,
+        labelTextStyle = SuggestionChipTokens.LabelTextFont.value,
+        labelColor = colors.labelColor(enabled),
+        leadingIcon = icon,
+        trailingIcon = null,
+        shape = shape,
+        colors = colors,
+        elevation = elevation,
+        border = border?.borderStroke(enabled)?.value,
+        minHeight = SuggestionChipDefaults.Height,
+        paddingValues = SuggestionChipPadding,
+        interactionSource = interactionSource
+    )
 
 /**
- * <a href="https://m3.material.io/components/chips/overview" class="external" target="_blank">Material Design elevated suggestion chip</a>.
+ * <a href="https://m3.material.io/components/chips/overview" class="external"
+ * target="_blank">Material Design elevated suggestion chip</a>.
  *
  * Chips help people enter information, make selections, filter content, or trigger actions. Chips
  * can show multiple interactive elements together in the same area, such as a list of selectable
@@ -805,34 +857,36 @@
  * Suggestion chips help narrow a user's intent by presenting dynamically generated suggestions,
  * such as possible responses or search filters.
  *
- * ![Suggestion chip image](https://developer.android.com/images/reference/androidx/compose/material3/elevated-suggestion-chip.png)
+ * ![Suggestion chip
+ * image](https://developer.android.com/images/reference/androidx/compose/material3/elevated-suggestion-chip.png)
  *
  * This suggestion chip is applied with an elevated style. If you want a flat style, use the
  * [SuggestionChip].
  *
  * Example of an elevated SuggestionChip with a trailing icon:
+ *
  * @sample androidx.compose.material3.samples.ElevatedSuggestionChipSample
  *
  * @param onClick called when this chip is clicked
  * @param label text label for this chip
  * @param modifier the [Modifier] to be applied to this chip
  * @param enabled controls the enabled state of this chip. When `false`, this component will not
- * respond to user input, and it will appear visually disabled and disabled to accessibility
- * services.
+ *   respond to user input, and it will appear visually disabled and disabled to accessibility
+ *   services.
  * @param icon optional icon at the start of the chip, preceding the [label] text
  * @param shape defines the shape of this chip's container, border (when [border] is not null), and
- * shadow (when using [elevation])
+ *   shadow (when using [elevation])
  * @param colors [ChipColors] that will be used to resolve the colors used for this chip in
  * @param elevation [ChipElevation] used to resolve the elevation for this chip in different states.
- * This controls the size of the shadow below the chip. Additionally, when the container color is
- * [ColorScheme.surface], this controls the amount of primary color applied as an overlay. See
- * [Surface] and [SuggestionChipDefaults.elevatedSuggestionChipElevation].
- * @param border the border to draw around the container of this chip
- * different states. See [SuggestionChipDefaults.elevatedSuggestionChipColors].
+ *   This controls the size of the shadow below the chip. Additionally, when the container color is
+ *   [ColorScheme.surface], this controls the amount of primary color applied as an overlay. See
+ *   [Surface] and [SuggestionChipDefaults.elevatedSuggestionChipElevation].
+ * @param border the border to draw around the container of this chip different states. See
+ *   [SuggestionChipDefaults.elevatedSuggestionChipColors].
  * @param interactionSource an optional hoisted [MutableInteractionSource] for observing and
- * emitting [Interaction]s for this chip. You can use this to change the chip's appearance
- * or preview the chip in different states. Note that if `null` is provided, interactions will
- * still happen internally.
+ *   emitting [Interaction]s for this chip. You can use this to change the chip's appearance or
+ *   preview the chip in different states. Note that if `null` is provided, interactions will still
+ *   happen internally.
  */
 @Composable
 fun ElevatedSuggestionChip(
@@ -846,26 +900,28 @@
     elevation: ChipElevation? = SuggestionChipDefaults.elevatedSuggestionChipElevation(),
     border: BorderStroke? = null,
     interactionSource: MutableInteractionSource? = null,
-) = Chip(
-    modifier = modifier,
-    onClick = onClick,
-    enabled = enabled,
-    label = label,
-    labelTextStyle = SuggestionChipTokens.LabelTextFont.value,
-    labelColor = colors.labelColor(enabled),
-    leadingIcon = icon,
-    trailingIcon = null,
-    elevation = elevation,
-    colors = colors,
-    minHeight = SuggestionChipDefaults.Height,
-    paddingValues = SuggestionChipPadding,
-    shape = shape,
-    border = border,
-    interactionSource = interactionSource
-)
+) =
+    Chip(
+        modifier = modifier,
+        onClick = onClick,
+        enabled = enabled,
+        label = label,
+        labelTextStyle = SuggestionChipTokens.LabelTextFont.value,
+        labelColor = colors.labelColor(enabled),
+        leadingIcon = icon,
+        trailingIcon = null,
+        elevation = elevation,
+        colors = colors,
+        minHeight = SuggestionChipDefaults.Height,
+        paddingValues = SuggestionChipPadding,
+        shape = shape,
+        border = border,
+        interactionSource = interactionSource
+    )
 
 /**
- * <a href="https://m3.material.io/components/chips/overview" class="external" target="_blank">Material Design elevated suggestion chip</a>.
+ * <a href="https://m3.material.io/components/chips/overview" class="external"
+ * target="_blank">Material Design elevated suggestion chip</a>.
  *
  * Chips help people enter information, make selections, filter content, or trigger actions. Chips
  * can show multiple interactive elements together in the same area, such as a list of selectable
@@ -874,40 +930,45 @@
  * Suggestion chips help narrow a user's intent by presenting dynamically generated suggestions,
  * such as possible responses or search filters.
  *
- * ![Suggestion chip image](https://developer.android.com/images/reference/androidx/compose/material3/elevated-suggestion-chip.png)
+ * ![Suggestion chip
+ * image](https://developer.android.com/images/reference/androidx/compose/material3/elevated-suggestion-chip.png)
  *
  * This suggestion chip is applied with an elevated style. If you want a flat style, use the
  * [SuggestionChip].
  *
  * Example of an elevated SuggestionChip with a trailing icon:
+ *
  * @sample androidx.compose.material3.samples.ElevatedSuggestionChipSample
  *
  * @param onClick called when this chip is clicked
  * @param label text label for this chip
  * @param modifier the [Modifier] to be applied to this chip
  * @param enabled controls the enabled state of this chip. When `false`, this component will not
- * respond to user input, and it will appear visually disabled and disabled to accessibility
- * services.
+ *   respond to user input, and it will appear visually disabled and disabled to accessibility
+ *   services.
  * @param icon optional icon at the start of the chip, preceding the [label] text
  * @param shape defines the shape of this chip's container, border (when [border] is not null), and
- * shadow (when using [elevation])
+ *   shadow (when using [elevation])
  * @param colors [ChipColors] that will be used to resolve the colors used for this chip in
  * @param elevation [ChipElevation] used to resolve the elevation for this chip in different states.
- * This controls the size of the shadow below the chip. Additionally, when the container color is
- * [ColorScheme.surface], this controls the amount of primary color applied as an overlay. See
- * [Surface] and [SuggestionChipDefaults.elevatedSuggestionChipElevation].
- * @param border the border to draw around the container of this chip
- * different states. See [SuggestionChipDefaults.elevatedSuggestionChipColors].
+ *   This controls the size of the shadow below the chip. Additionally, when the container color is
+ *   [ColorScheme.surface], this controls the amount of primary color applied as an overlay. See
+ *   [Surface] and [SuggestionChipDefaults.elevatedSuggestionChipElevation].
+ * @param border the border to draw around the container of this chip different states. See
+ *   [SuggestionChipDefaults.elevatedSuggestionChipColors].
  * @param interactionSource the [MutableInteractionSource] representing the stream of [Interaction]s
- * for this chip. You can create and pass in your own `remember`ed instance to observe
- * [Interaction]s and customize the appearance / behavior of this chip in different states.
+ *   for this chip. You can create and pass in your own `remember`ed instance to observe
+ *   [Interaction]s and customize the appearance / behavior of this chip in different states.
  */
 @Suppress("DEPRECATION")
 @Deprecated(
     "Maintained for binary compatibility. Use version with ElevatedSuggestionChip that take" +
         " a BorderStroke instead",
-    replaceWith = ReplaceWith("ElevatedSuggestionChip(onClick, label, modifier, enabled," +
-        " icon, shape, colors, elevation, border, interactionSource"),
+    replaceWith =
+        ReplaceWith(
+            "ElevatedSuggestionChip(onClick, label, modifier, enabled," +
+                " icon, shape, colors, elevation, border, interactionSource"
+        ),
     level = DeprecationLevel.HIDDEN
 )
 @Composable
@@ -922,45 +983,41 @@
     elevation: ChipElevation? = SuggestionChipDefaults.elevatedSuggestionChipElevation(),
     border: ChipBorder? = null,
     interactionSource: MutableInteractionSource = remember { MutableInteractionSource() },
-) = Chip(
-    modifier = modifier,
-    onClick = onClick,
-    enabled = enabled,
-    label = label,
-    labelTextStyle = SuggestionChipTokens.LabelTextFont.value,
-    labelColor = colors.labelColor(enabled),
-    leadingIcon = icon,
-    trailingIcon = null,
-    elevation = elevation,
-    colors = colors,
-    minHeight = SuggestionChipDefaults.Height,
-    paddingValues = SuggestionChipPadding,
-    shape = shape,
-    border = border?.borderStroke(enabled)?.value,
-    interactionSource = interactionSource
-)
+) =
+    Chip(
+        modifier = modifier,
+        onClick = onClick,
+        enabled = enabled,
+        label = label,
+        labelTextStyle = SuggestionChipTokens.LabelTextFont.value,
+        labelColor = colors.labelColor(enabled),
+        leadingIcon = icon,
+        trailingIcon = null,
+        elevation = elevation,
+        colors = colors,
+        minHeight = SuggestionChipDefaults.Height,
+        paddingValues = SuggestionChipPadding,
+        shape = shape,
+        border = border?.borderStroke(enabled)?.value,
+        interactionSource = interactionSource
+    )
 
-/**
- * Contains the baseline values used by [AssistChip].
- */
+/** Contains the baseline values used by [AssistChip]. */
 object AssistChipDefaults {
     /**
-     * The height applied for an assist chip.
-     * Note that you can override it by applying Modifier.height directly on a chip.
+     * The height applied for an assist chip. Note that you can override it by applying
+     * Modifier.height directly on a chip.
      */
     val Height = AssistChipTokens.ContainerHeight
 
-    /**
-     * The size of an assist chip icon.
-     */
+    /** The size of an assist chip icon. */
     val IconSize = AssistChipTokens.IconSize
 
     /**
      * Creates a [ChipColors] that represents the default container , label, and icon colors used in
      * a flat [AssistChip].
      */
-    @Composable
-    fun assistChipColors() = MaterialTheme.colorScheme.defaultAssistChipColors
+    @Composable fun assistChipColors() = MaterialTheme.colorScheme.defaultAssistChipColors
 
     /**
      * Creates a [ChipColors] that represents the default container , label, and icon colors used in
@@ -985,44 +1042,45 @@
         disabledLabelColor: Color = Color.Unspecified,
         disabledLeadingIconContentColor: Color = Color.Unspecified,
         disabledTrailingIconContentColor: Color = Color.Unspecified,
-    ): ChipColors = MaterialTheme.colorScheme.defaultAssistChipColors.copy(
-        containerColor = containerColor,
-        labelColor = labelColor,
-        leadingIconContentColor = leadingIconContentColor,
-        trailingIconContentColor = trailingIconContentColor,
-        disabledContainerColor = disabledContainerColor,
-        disabledLabelColor = disabledLabelColor,
-        disabledLeadingIconContentColor = disabledLeadingIconContentColor,
-        disabledTrailingIconContentColor = disabledTrailingIconContentColor
-    )
+    ): ChipColors =
+        MaterialTheme.colorScheme.defaultAssistChipColors.copy(
+            containerColor = containerColor,
+            labelColor = labelColor,
+            leadingIconContentColor = leadingIconContentColor,
+            trailingIconContentColor = trailingIconContentColor,
+            disabledContainerColor = disabledContainerColor,
+            disabledLabelColor = disabledLabelColor,
+            disabledLeadingIconContentColor = disabledLeadingIconContentColor,
+            disabledTrailingIconContentColor = disabledTrailingIconContentColor
+        )
 
     internal val ColorScheme.defaultAssistChipColors: ChipColors
         get() {
-            return defaultAssistChipColorsCached ?: ChipColors(
-                containerColor = Color.Transparent,
-                labelColor = fromToken(AssistChipTokens.LabelTextColor),
-                leadingIconContentColor = fromToken(AssistChipTokens.IconColor),
-                trailingIconContentColor = fromToken(AssistChipTokens.IconColor),
-                disabledContainerColor = Color.Transparent,
-                disabledLabelColor = fromToken(AssistChipTokens.DisabledLabelTextColor)
-                    .copy(alpha = AssistChipTokens.DisabledLabelTextOpacity),
-                disabledLeadingIconContentColor =
-                fromToken(AssistChipTokens.DisabledIconColor)
-                    .copy(alpha = AssistChipTokens.DisabledIconOpacity),
-                disabledTrailingIconContentColor =
-                fromToken(AssistChipTokens.DisabledIconColor)
-                    .copy(alpha = AssistChipTokens.DisabledIconOpacity),
-                ).also {
-                defaultAssistChipColorsCached = it
-            }
+            return defaultAssistChipColorsCached
+                ?: ChipColors(
+                        containerColor = Color.Transparent,
+                        labelColor = fromToken(AssistChipTokens.LabelTextColor),
+                        leadingIconContentColor = fromToken(AssistChipTokens.IconColor),
+                        trailingIconContentColor = fromToken(AssistChipTokens.IconColor),
+                        disabledContainerColor = Color.Transparent,
+                        disabledLabelColor =
+                            fromToken(AssistChipTokens.DisabledLabelTextColor)
+                                .copy(alpha = AssistChipTokens.DisabledLabelTextOpacity),
+                        disabledLeadingIconContentColor =
+                            fromToken(AssistChipTokens.DisabledIconColor)
+                                .copy(alpha = AssistChipTokens.DisabledIconOpacity),
+                        disabledTrailingIconContentColor =
+                            fromToken(AssistChipTokens.DisabledIconColor)
+                                .copy(alpha = AssistChipTokens.DisabledIconOpacity),
+                    )
+                    .also { defaultAssistChipColorsCached = it }
         }
 
     /**
      * Creates a [ChipElevation] that will animate between the provided values according to the
      * Material specification for a flat [AssistChip].
      *
-     * @param elevation the elevation used when the [AssistChip] is has no other
-     * [Interaction]s
+     * @param elevation the elevation used when the [AssistChip] is has no other [Interaction]s
      * @param pressedElevation the elevation used when the chip is pressed.
      * @param focusedElevation the elevation used when the chip is focused
      * @param hoveredElevation the elevation used when the chip is hovered
@@ -1037,14 +1095,15 @@
         hoveredElevation: Dp = elevation,
         draggedElevation: Dp = AssistChipTokens.DraggedContainerElevation,
         disabledElevation: Dp = elevation
-    ): ChipElevation = ChipElevation(
-        elevation = elevation,
-        pressedElevation = pressedElevation,
-        focusedElevation = focusedElevation,
-        hoveredElevation = hoveredElevation,
-        draggedElevation = draggedElevation,
-        disabledElevation = disabledElevation
-    )
+    ): ChipElevation =
+        ChipElevation(
+            elevation = elevation,
+            pressedElevation = pressedElevation,
+            focusedElevation = focusedElevation,
+            hoveredElevation = hoveredElevation,
+            draggedElevation = draggedElevation,
+            disabledElevation = disabledElevation
+        )
 
     /**
      * Creates a [ChipBorder] that represents the default border used in a flat [AssistChip].
@@ -1058,8 +1117,10 @@
     fun assistChipBorder(
         enabled: Boolean,
         borderColor: Color = AssistChipTokens.FlatOutlineColor.value,
-        disabledBorderColor: Color = AssistChipTokens.FlatDisabledOutlineColor.value
-            .copy(alpha = AssistChipTokens.FlatDisabledOutlineOpacity),
+        disabledBorderColor: Color =
+            AssistChipTokens.FlatDisabledOutlineColor.value.copy(
+                alpha = AssistChipTokens.FlatDisabledOutlineOpacity
+            ),
         borderWidth: Dp = AssistChipTokens.FlatOutlineWidth,
     ): BorderStroke = BorderStroke(borderWidth, if (enabled) borderColor else disabledBorderColor)
 
@@ -1074,21 +1135,26 @@
     @Deprecated(
         "Maintained for binary compatibility. Use the assistChipBorder function that returns" +
             " BorderStroke instead",
-        replaceWith = ReplaceWith("assistChipBorder(enabled, borderColor," +
-            " disabledBorderColor, borderWidth)"),
+        replaceWith =
+            ReplaceWith(
+                "assistChipBorder(enabled, borderColor," + " disabledBorderColor, borderWidth)"
+            ),
         level = DeprecationLevel.WARNING
     )
     @Composable
     fun assistChipBorder(
         borderColor: Color = AssistChipTokens.FlatOutlineColor.value,
-        disabledBorderColor: Color = AssistChipTokens.FlatDisabledOutlineColor.value
-            .copy(alpha = AssistChipTokens.FlatDisabledOutlineOpacity),
+        disabledBorderColor: Color =
+            AssistChipTokens.FlatDisabledOutlineColor.value.copy(
+                alpha = AssistChipTokens.FlatDisabledOutlineOpacity
+            ),
         borderWidth: Dp = AssistChipTokens.FlatOutlineWidth,
-    ): ChipBorder = ChipBorder(
-        borderColor = borderColor,
-        disabledBorderColor = disabledBorderColor,
-        borderWidth = borderWidth
-    )
+    ): ChipBorder =
+        ChipBorder(
+            borderColor = borderColor,
+            disabledBorderColor = disabledBorderColor,
+            borderWidth = borderWidth
+        )
 
     /**
      * Creates a [ChipColors] that represents the default container, label, and icon colors used in
@@ -1097,7 +1163,7 @@
     @Composable
     fun elevatedAssistChipColors() = MaterialTheme.colorScheme.defaultElevatedAssistChipColors
 
-/**
+    /**
      * Creates a [ChipColors] that represents the default container, label, and icon colors used in
      * an elevated [AssistChip].
      *
@@ -1120,44 +1186,47 @@
         disabledLabelColor: Color = Color.Unspecified,
         disabledLeadingIconContentColor: Color = Color.Unspecified,
         disabledTrailingIconContentColor: Color = Color.Unspecified,
-    ): ChipColors = MaterialTheme.colorScheme.defaultElevatedSuggestionChipColors.copy(
-        containerColor = containerColor,
-        labelColor = labelColor,
-        leadingIconContentColor = leadingIconContentColor,
-        trailingIconContentColor = trailingIconContentColor,
-        disabledContainerColor = disabledContainerColor,
-        disabledLabelColor = disabledLabelColor,
-        disabledLeadingIconContentColor = disabledLeadingIconContentColor,
-        disabledTrailingIconContentColor = disabledTrailingIconContentColor
-    )
+    ): ChipColors =
+        MaterialTheme.colorScheme.defaultElevatedSuggestionChipColors.copy(
+            containerColor = containerColor,
+            labelColor = labelColor,
+            leadingIconContentColor = leadingIconContentColor,
+            trailingIconContentColor = trailingIconContentColor,
+            disabledContainerColor = disabledContainerColor,
+            disabledLabelColor = disabledLabelColor,
+            disabledLeadingIconContentColor = disabledLeadingIconContentColor,
+            disabledTrailingIconContentColor = disabledTrailingIconContentColor
+        )
 
     internal val ColorScheme.defaultElevatedAssistChipColors: ChipColors
         get() {
-            return defaultElevatedAssistChipColorsCached ?: ChipColors(
-                containerColor = fromToken(AssistChipTokens.ElevatedContainerColor),
-                labelColor = fromToken(AssistChipTokens.LabelTextColor),
-                leadingIconContentColor = fromToken(AssistChipTokens.IconColor),
-                trailingIconContentColor = fromToken(AssistChipTokens.IconColor),
-                disabledContainerColor = fromToken(AssistChipTokens.ElevatedDisabledContainerColor)
-                    .copy(alpha = AssistChipTokens.ElevatedDisabledContainerOpacity),
-                disabledLabelColor = fromToken(AssistChipTokens.DisabledLabelTextColor)
-                    .copy(alpha = AssistChipTokens.DisabledLabelTextOpacity),
-                disabledLeadingIconContentColor =
-                fromToken(AssistChipTokens.DisabledIconColor)
-                    .copy(alpha = AssistChipTokens.DisabledIconOpacity),
-                disabledTrailingIconContentColor = fromToken(AssistChipTokens.DisabledIconColor)
-                    .copy(alpha = AssistChipTokens.DisabledIconOpacity)
-            ).also {
-                defaultElevatedAssistChipColorsCached = it
-            }
+            return defaultElevatedAssistChipColorsCached
+                ?: ChipColors(
+                        containerColor = fromToken(AssistChipTokens.ElevatedContainerColor),
+                        labelColor = fromToken(AssistChipTokens.LabelTextColor),
+                        leadingIconContentColor = fromToken(AssistChipTokens.IconColor),
+                        trailingIconContentColor = fromToken(AssistChipTokens.IconColor),
+                        disabledContainerColor =
+                            fromToken(AssistChipTokens.ElevatedDisabledContainerColor)
+                                .copy(alpha = AssistChipTokens.ElevatedDisabledContainerOpacity),
+                        disabledLabelColor =
+                            fromToken(AssistChipTokens.DisabledLabelTextColor)
+                                .copy(alpha = AssistChipTokens.DisabledLabelTextOpacity),
+                        disabledLeadingIconContentColor =
+                            fromToken(AssistChipTokens.DisabledIconColor)
+                                .copy(alpha = AssistChipTokens.DisabledIconOpacity),
+                        disabledTrailingIconContentColor =
+                            fromToken(AssistChipTokens.DisabledIconColor)
+                                .copy(alpha = AssistChipTokens.DisabledIconOpacity)
+                    )
+                    .also { defaultElevatedAssistChipColorsCached = it }
         }
 
     /**
      * Creates a [ChipElevation] that will animate between the provided values according to the
      * Material specification for an elevated [AssistChip].
      *
-     * @param elevation the elevation used when the [AssistChip] is has no other
-     * [Interaction]s
+     * @param elevation the elevation used when the [AssistChip] is has no other [Interaction]s
      * @param pressedElevation the elevation used when the chip is pressed.
      * @param focusedElevation the elevation used when the chip is focused
      * @param hoveredElevation the elevation used when the chip is hovered
@@ -1172,40 +1241,37 @@
         hoveredElevation: Dp = AssistChipTokens.ElevatedHoverContainerElevation,
         draggedElevation: Dp = AssistChipTokens.DraggedContainerElevation,
         disabledElevation: Dp = AssistChipTokens.ElevatedDisabledContainerElevation
-    ): ChipElevation = ChipElevation(
-        elevation = elevation,
-        pressedElevation = pressedElevation,
-        focusedElevation = focusedElevation,
-        hoveredElevation = hoveredElevation,
-        draggedElevation = draggedElevation,
-        disabledElevation = disabledElevation
-    )
+    ): ChipElevation =
+        ChipElevation(
+            elevation = elevation,
+            pressedElevation = pressedElevation,
+            focusedElevation = focusedElevation,
+            hoveredElevation = hoveredElevation,
+            draggedElevation = draggedElevation,
+            disabledElevation = disabledElevation
+        )
 
     /** Default shape of an assist chip. */
-    val shape: Shape @Composable get() = AssistChipTokens.ContainerShape.value
+    val shape: Shape
+        @Composable get() = AssistChipTokens.ContainerShape.value
 }
 
-/**
- * Contains the baseline values used by [FilterChip].
- */
+/** Contains the baseline values used by [FilterChip]. */
 object FilterChipDefaults {
     /**
-     * The height applied for a filter chip.
-     * Note that you can override it by applying Modifier.height directly on a chip.
+     * The height applied for a filter chip. Note that you can override it by applying
+     * Modifier.height directly on a chip.
      */
     val Height = FilterChipTokens.ContainerHeight
 
-    /**
-     * The size of a filter chip leading icon.
-     */
+    /** The size of a filter chip leading icon. */
     val IconSize = FilterChipTokens.IconSize
 
     /**
      * Creates a [SelectableChipColors] that represents the default container and content colors
      * used in a flat [FilterChip].
      */
-    @Composable
-    fun filterChipColors() = MaterialTheme.colorScheme.defaultFilterChipColors
+    @Composable fun filterChipColors() = MaterialTheme.colorScheme.defaultFilterChipColors
 
     /**
      * Creates a [SelectableChipColors] that represents the default container and content colors
@@ -1220,7 +1286,7 @@
      * @param disabledTrailingIconColor the color of this chip's end icon when not enabled
      * @param selectedContainerColor the container color of this chip when selected
      * @param disabledSelectedContainerColor the container color of this chip when not enabled and
-     * selected
+     *   selected
      * @param selectedLabelColor the label color of this chip when selected
      * @param selectedLeadingIconColor the color of this chip's start icon when selected
      * @param selectedTrailingIconColor the color of this chip's end icon when selected
@@ -1239,55 +1305,62 @@
         selectedLabelColor: Color = Color.Unspecified,
         selectedLeadingIconColor: Color = Color.Unspecified,
         selectedTrailingIconColor: Color = Color.Unspecified
-    ): SelectableChipColors = MaterialTheme.colorScheme.defaultFilterChipColors.copy(
-        containerColor = containerColor,
-        labelColor = labelColor,
-        leadingIconColor = iconColor,
-        trailingIconColor = iconColor,
-        disabledContainerColor = disabledContainerColor,
-        disabledLabelColor = disabledLabelColor,
-        disabledLeadingIconColor = disabledLeadingIconColor,
-        disabledTrailingIconColor = disabledTrailingIconColor,
-        selectedContainerColor = selectedContainerColor,
-        disabledSelectedContainerColor = disabledSelectedContainerColor,
-        selectedLabelColor = selectedLabelColor,
-        selectedLeadingIconColor = selectedLeadingIconColor,
-        selectedTrailingIconColor = selectedTrailingIconColor
-    )
+    ): SelectableChipColors =
+        MaterialTheme.colorScheme.defaultFilterChipColors.copy(
+            containerColor = containerColor,
+            labelColor = labelColor,
+            leadingIconColor = iconColor,
+            trailingIconColor = iconColor,
+            disabledContainerColor = disabledContainerColor,
+            disabledLabelColor = disabledLabelColor,
+            disabledLeadingIconColor = disabledLeadingIconColor,
+            disabledTrailingIconColor = disabledTrailingIconColor,
+            selectedContainerColor = selectedContainerColor,
+            disabledSelectedContainerColor = disabledSelectedContainerColor,
+            selectedLabelColor = selectedLabelColor,
+            selectedLeadingIconColor = selectedLeadingIconColor,
+            selectedTrailingIconColor = selectedTrailingIconColor
+        )
 
     internal val ColorScheme.defaultFilterChipColors: SelectableChipColors
         get() {
-            return defaultFilterChipColorsCached ?: SelectableChipColors(
-                containerColor = Color.Transparent,
-                labelColor = fromToken(FilterChipTokens.UnselectedLabelTextColor),
-                leadingIconColor = fromToken(FilterChipTokens.UnselectedLeadingIconColor),
-                trailingIconColor = fromToken(FilterChipTokens.UnselectedLeadingIconColor),
-                disabledContainerColor = Color.Transparent,
-                disabledLabelColor = fromToken(FilterChipTokens.DisabledLabelTextColor)
-                    .copy(alpha = FilterChipTokens.DisabledLabelTextOpacity),
-                disabledLeadingIconColor = fromToken(FilterChipTokens.DisabledLeadingIconColor)
-                    .copy(alpha = FilterChipTokens.DisabledLeadingIconOpacity),
-                disabledTrailingIconColor = fromToken(FilterChipTokens.DisabledLeadingIconColor)
-                    .copy(alpha = FilterChipTokens.DisabledLeadingIconOpacity),
-                selectedContainerColor = fromToken(FilterChipTokens.FlatSelectedContainerColor),
-                disabledSelectedContainerColor = fromToken(
-                    FilterChipTokens.FlatDisabledSelectedContainerColor
-                )
-                    .copy(alpha = FilterChipTokens.FlatDisabledSelectedContainerOpacity),
-                selectedLabelColor = fromToken(FilterChipTokens.SelectedLabelTextColor),
-                selectedLeadingIconColor = fromToken(FilterChipTokens.SelectedLeadingIconColor),
-                selectedTrailingIconColor = fromToken(FilterChipTokens.SelectedLeadingIconColor)
-            ).also {
-                defaultFilterChipColorsCached = it
-            }
+            return defaultFilterChipColorsCached
+                ?: SelectableChipColors(
+                        containerColor = Color.Transparent,
+                        labelColor = fromToken(FilterChipTokens.UnselectedLabelTextColor),
+                        leadingIconColor = fromToken(FilterChipTokens.UnselectedLeadingIconColor),
+                        trailingIconColor = fromToken(FilterChipTokens.UnselectedLeadingIconColor),
+                        disabledContainerColor = Color.Transparent,
+                        disabledLabelColor =
+                            fromToken(FilterChipTokens.DisabledLabelTextColor)
+                                .copy(alpha = FilterChipTokens.DisabledLabelTextOpacity),
+                        disabledLeadingIconColor =
+                            fromToken(FilterChipTokens.DisabledLeadingIconColor)
+                                .copy(alpha = FilterChipTokens.DisabledLeadingIconOpacity),
+                        disabledTrailingIconColor =
+                            fromToken(FilterChipTokens.DisabledLeadingIconColor)
+                                .copy(alpha = FilterChipTokens.DisabledLeadingIconOpacity),
+                        selectedContainerColor =
+                            fromToken(FilterChipTokens.FlatSelectedContainerColor),
+                        disabledSelectedContainerColor =
+                            fromToken(FilterChipTokens.FlatDisabledSelectedContainerColor)
+                                .copy(
+                                    alpha = FilterChipTokens.FlatDisabledSelectedContainerOpacity
+                                ),
+                        selectedLabelColor = fromToken(FilterChipTokens.SelectedLabelTextColor),
+                        selectedLeadingIconColor =
+                            fromToken(FilterChipTokens.SelectedLeadingIconColor),
+                        selectedTrailingIconColor =
+                            fromToken(FilterChipTokens.SelectedLeadingIconColor)
+                    )
+                    .also { defaultFilterChipColorsCached = it }
         }
 
     /**
      * Creates a [SelectableChipElevation] that will animate between the provided values according
      * to the Material specification for a flat [FilterChip].
      *
-     * @param elevation the elevation used when the [FilterChip] is has no other
-     * [Interaction]s
+     * @param elevation the elevation used when the [FilterChip] is has no other [Interaction]s
      * @param pressedElevation the elevation used when the chip is pressed
      * @param focusedElevation the elevation used when the chip is focused
      * @param hoveredElevation the elevation used when the chip is hovered
@@ -1302,29 +1375,28 @@
         hoveredElevation: Dp = FilterChipTokens.FlatSelectedHoverContainerElevation,
         draggedElevation: Dp = FilterChipTokens.DraggedContainerElevation,
         disabledElevation: Dp = elevation
-    ): SelectableChipElevation = SelectableChipElevation(
-        elevation = elevation,
-        pressedElevation = pressedElevation,
-        focusedElevation = focusedElevation,
-        hoveredElevation = hoveredElevation,
-        draggedElevation = draggedElevation,
-        disabledElevation = disabledElevation
-    )
+    ): SelectableChipElevation =
+        SelectableChipElevation(
+            elevation = elevation,
+            pressedElevation = pressedElevation,
+            focusedElevation = focusedElevation,
+            hoveredElevation = hoveredElevation,
+            draggedElevation = draggedElevation,
+            disabledElevation = disabledElevation
+        )
 
     /**
-     * Creates a [BorderStroke] that represents the default border used in a flat
-     * [FilterChip].
+     * Creates a [BorderStroke] that represents the default border used in a flat [FilterChip].
      *
      * @param selected whether this chip is selected or not
      * @param enabled controls the enabled state of this chip. When `false`, this component will not
-     * respond to user input, and it will appear visually disabled and disabled to accessibility
-     * services.
+     *   respond to user input, and it will appear visually disabled and disabled to accessibility
+     *   services.
      * @param borderColor the border color of this chip when enabled and not selected
      * @param selectedBorderColor the border color of this chip when enabled and selected
-     * @param disabledBorderColor the border color of this chip when not enabled and not
-     * selected
-     * @param disabledSelectedBorderColor the border color of this chip when not enabled
-     * but selected
+     * @param disabledBorderColor the border color of this chip when not enabled and not selected
+     * @param disabledSelectedBorderColor the border color of this chip when not enabled but
+     *   selected
      * @param borderWidth the border stroke width of this chip when not selected
      * @param selectedBorderWidth the border stroke width of this chip when selected
      */
@@ -1334,17 +1406,20 @@
         selected: Boolean,
         borderColor: Color = FilterChipTokens.FlatUnselectedOutlineColor.value,
         selectedBorderColor: Color = Color.Transparent,
-        disabledBorderColor: Color = FilterChipTokens.FlatDisabledUnselectedOutlineColor.value
-            .copy(alpha = FilterChipTokens.FlatDisabledUnselectedOutlineOpacity),
+        disabledBorderColor: Color =
+            FilterChipTokens.FlatDisabledUnselectedOutlineColor.value.copy(
+                alpha = FilterChipTokens.FlatDisabledUnselectedOutlineOpacity
+            ),
         disabledSelectedBorderColor: Color = Color.Transparent,
         borderWidth: Dp = FilterChipTokens.FlatUnselectedOutlineWidth,
         selectedBorderWidth: Dp = FilterChipTokens.FlatSelectedOutlineWidth,
     ): BorderStroke {
-        val color = if (enabled) {
-            if (selected) selectedBorderColor else borderColor
-        } else {
-            if (selected) disabledSelectedBorderColor else disabledBorderColor
-        }
+        val color =
+            if (enabled) {
+                if (selected) selectedBorderColor else borderColor
+            } else {
+                if (selected) disabledSelectedBorderColor else disabledBorderColor
+            }
         return BorderStroke(if (selected) selectedBorderWidth else borderWidth, color)
     }
 
@@ -1368,7 +1443,7 @@
      * @param disabledTrailingIconColor the color of this chip's end icon when not enabled
      * @param selectedContainerColor the container color of this chip when selected
      * @param disabledSelectedContainerColor the container color of this chip when not enabled and
-     * selected
+     *   selected
      * @param selectedLabelColor the label color of this chip when selected
      * @param selectedLeadingIconColor the color of this chip's start icon when selected
      * @param selectedTrailingIconColor the color of this chip's end icon when selected
@@ -1387,55 +1462,63 @@
         selectedLabelColor: Color = Color.Unspecified,
         selectedLeadingIconColor: Color = Color.Unspecified,
         selectedTrailingIconColor: Color = Color.Unspecified
-    ): SelectableChipColors = MaterialTheme.colorScheme.defaultElevatedFilterChipColors.copy(
-        containerColor = containerColor,
-        labelColor = labelColor,
-        leadingIconColor = iconColor,
-        trailingIconColor = iconColor,
-        disabledContainerColor = disabledContainerColor,
-        disabledLabelColor = disabledLabelColor,
-        disabledLeadingIconColor = disabledLeadingIconColor,
-        disabledTrailingIconColor = disabledTrailingIconColor,
-        selectedContainerColor = selectedContainerColor,
-        disabledSelectedContainerColor = disabledSelectedContainerColor,
-        selectedLabelColor = selectedLabelColor,
-        selectedLeadingIconColor = selectedLeadingIconColor,
-        selectedTrailingIconColor = selectedTrailingIconColor
-    )
+    ): SelectableChipColors =
+        MaterialTheme.colorScheme.defaultElevatedFilterChipColors.copy(
+            containerColor = containerColor,
+            labelColor = labelColor,
+            leadingIconColor = iconColor,
+            trailingIconColor = iconColor,
+            disabledContainerColor = disabledContainerColor,
+            disabledLabelColor = disabledLabelColor,
+            disabledLeadingIconColor = disabledLeadingIconColor,
+            disabledTrailingIconColor = disabledTrailingIconColor,
+            selectedContainerColor = selectedContainerColor,
+            disabledSelectedContainerColor = disabledSelectedContainerColor,
+            selectedLabelColor = selectedLabelColor,
+            selectedLeadingIconColor = selectedLeadingIconColor,
+            selectedTrailingIconColor = selectedTrailingIconColor
+        )
 
     internal val ColorScheme.defaultElevatedFilterChipColors: SelectableChipColors
         get() {
-            return defaultElevatedFilterChipColorsCached ?: SelectableChipColors(
-                containerColor = fromToken(FilterChipTokens.ElevatedUnselectedContainerColor),
-                labelColor = fromToken(FilterChipTokens.UnselectedLabelTextColor),
-                leadingIconColor = fromToken(FilterChipTokens.UnselectedLeadingIconColor),
-                trailingIconColor = fromToken(FilterChipTokens.UnselectedLeadingIconColor),
-                disabledContainerColor = fromToken(FilterChipTokens.ElevatedDisabledContainerColor)
-                    .copy(alpha = FilterChipTokens.ElevatedDisabledContainerOpacity),
-                disabledLabelColor = fromToken(FilterChipTokens.DisabledLabelTextColor)
-                    .copy(alpha = FilterChipTokens.DisabledLabelTextOpacity),
-                disabledLeadingIconColor = fromToken(FilterChipTokens.DisabledLeadingIconColor)
-                    .copy(alpha = FilterChipTokens.DisabledLeadingIconOpacity),
-                disabledTrailingIconColor = fromToken(FilterChipTokens.DisabledLeadingIconColor)
-                    .copy(alpha = FilterChipTokens.DisabledLeadingIconOpacity),
-                selectedContainerColor = fromToken(FilterChipTokens.ElevatedSelectedContainerColor),
-                disabledSelectedContainerColor = fromToken(
-                    FilterChipTokens.ElevatedDisabledContainerColor)
-                    .copy(alpha = FilterChipTokens.ElevatedDisabledContainerOpacity),
-                selectedLabelColor = fromToken(FilterChipTokens.SelectedLabelTextColor),
-                selectedLeadingIconColor = fromToken(FilterChipTokens.SelectedLeadingIconColor),
-                selectedTrailingIconColor = fromToken(FilterChipTokens.SelectedLeadingIconColor)
-            ).also {
-                defaultElevatedFilterChipColorsCached = it
-            }
+            return defaultElevatedFilterChipColorsCached
+                ?: SelectableChipColors(
+                        containerColor =
+                            fromToken(FilterChipTokens.ElevatedUnselectedContainerColor),
+                        labelColor = fromToken(FilterChipTokens.UnselectedLabelTextColor),
+                        leadingIconColor = fromToken(FilterChipTokens.UnselectedLeadingIconColor),
+                        trailingIconColor = fromToken(FilterChipTokens.UnselectedLeadingIconColor),
+                        disabledContainerColor =
+                            fromToken(FilterChipTokens.ElevatedDisabledContainerColor)
+                                .copy(alpha = FilterChipTokens.ElevatedDisabledContainerOpacity),
+                        disabledLabelColor =
+                            fromToken(FilterChipTokens.DisabledLabelTextColor)
+                                .copy(alpha = FilterChipTokens.DisabledLabelTextOpacity),
+                        disabledLeadingIconColor =
+                            fromToken(FilterChipTokens.DisabledLeadingIconColor)
+                                .copy(alpha = FilterChipTokens.DisabledLeadingIconOpacity),
+                        disabledTrailingIconColor =
+                            fromToken(FilterChipTokens.DisabledLeadingIconColor)
+                                .copy(alpha = FilterChipTokens.DisabledLeadingIconOpacity),
+                        selectedContainerColor =
+                            fromToken(FilterChipTokens.ElevatedSelectedContainerColor),
+                        disabledSelectedContainerColor =
+                            fromToken(FilterChipTokens.ElevatedDisabledContainerColor)
+                                .copy(alpha = FilterChipTokens.ElevatedDisabledContainerOpacity),
+                        selectedLabelColor = fromToken(FilterChipTokens.SelectedLabelTextColor),
+                        selectedLeadingIconColor =
+                            fromToken(FilterChipTokens.SelectedLeadingIconColor),
+                        selectedTrailingIconColor =
+                            fromToken(FilterChipTokens.SelectedLeadingIconColor)
+                    )
+                    .also { defaultElevatedFilterChipColorsCached = it }
         }
 
     /**
      * Creates a [SelectableChipElevation] that will animate between the provided values according
      * to the Material specification for an elevated [FilterChip].
      *
-     * @param elevation the elevation used when the chip is has no other
-     * [Interaction]s
+     * @param elevation the elevation used when the chip is has no other [Interaction]s
      * @param pressedElevation the elevation used when the chip is pressed
      * @param focusedElevation the elevation used when the chip is focused
      * @param hoveredElevation the elevation used when the chip is hovered
@@ -1450,47 +1533,42 @@
         hoveredElevation: Dp = FilterChipTokens.ElevatedHoverContainerElevation,
         draggedElevation: Dp = FilterChipTokens.DraggedContainerElevation,
         disabledElevation: Dp = FilterChipTokens.ElevatedDisabledContainerElevation
-    ): SelectableChipElevation = SelectableChipElevation(
-        elevation = elevation,
-        pressedElevation = pressedElevation,
-        focusedElevation = focusedElevation,
-        hoveredElevation = hoveredElevation,
-        draggedElevation = draggedElevation,
-        disabledElevation = disabledElevation
-    )
+    ): SelectableChipElevation =
+        SelectableChipElevation(
+            elevation = elevation,
+            pressedElevation = pressedElevation,
+            focusedElevation = focusedElevation,
+            hoveredElevation = hoveredElevation,
+            draggedElevation = draggedElevation,
+            disabledElevation = disabledElevation
+        )
 
     /** Default shape of a filter chip. */
-    val shape: Shape @Composable get() = FilterChipTokens.ContainerShape.value
+    val shape: Shape
+        @Composable get() = FilterChipTokens.ContainerShape.value
 }
 
-/**
- * Contains the baseline values used by an [InputChip].
- */
+/** Contains the baseline values used by an [InputChip]. */
 object InputChipDefaults {
     /**
-     * The height applied for an input chip.
-     * Note that you can override it by applying Modifier.height directly on a chip.
+     * The height applied for an input chip. Note that you can override it by applying
+     * Modifier.height directly on a chip.
      */
     val Height = InputChipTokens.ContainerHeight
 
-    /**
-     * The size of an input chip icon.
-     */
+    /** The size of an input chip icon. */
     val IconSize = InputChipTokens.LeadingIconSize
 
-    /**
-     * The size of an input chip avatar.
-     */
+    /** The size of an input chip avatar. */
     val AvatarSize = InputChipTokens.AvatarSize
 
     /**
      * Creates a [SelectableChipColors] that represents the default container, label, and icon
      * colors used in an [InputChip].
      */
-    @Composable
-    fun inputChipColors() = MaterialTheme.colorScheme.defaultInputChipColors
+    @Composable fun inputChipColors() = MaterialTheme.colorScheme.defaultInputChipColors
 
-/**
+    /**
      * Creates a [SelectableChipColors] that represents the default container, label, and icon
      * colors used in an [InputChip].
      *
@@ -1504,7 +1582,7 @@
      * @param disabledTrailingIconColor the color of this chip's end icon when not enabled
      * @param selectedContainerColor the container color of this chip when selected
      * @param disabledSelectedContainerColor the container color of this chip when not enabled and
-     * selected
+     *   selected
      * @param selectedLabelColor the label color of this chip when selected
      * @param selectedLeadingIconColor the color of this chip's start icon when selected
      * @param selectedTrailingIconColor the color of this chip's end icon when selected
@@ -1524,56 +1602,59 @@
         selectedLabelColor: Color = Color.Unspecified,
         selectedLeadingIconColor: Color = Color.Unspecified,
         selectedTrailingIconColor: Color = Color.Unspecified
-    ): SelectableChipColors = MaterialTheme.colorScheme.defaultInputChipColors.copy(
-        containerColor = containerColor,
-        labelColor = labelColor,
-        leadingIconColor = leadingIconColor,
-        trailingIconColor = trailingIconColor,
-        disabledContainerColor = disabledContainerColor,
-        disabledLabelColor = disabledLabelColor,
-        disabledLeadingIconColor = disabledLeadingIconColor,
-        disabledTrailingIconColor = disabledTrailingIconColor,
-        selectedContainerColor = selectedContainerColor,
-        disabledSelectedContainerColor = disabledSelectedContainerColor,
-        selectedLabelColor = selectedLabelColor,
-        selectedLeadingIconColor = selectedLeadingIconColor,
-        selectedTrailingIconColor = selectedTrailingIconColor
-    )
+    ): SelectableChipColors =
+        MaterialTheme.colorScheme.defaultInputChipColors.copy(
+            containerColor = containerColor,
+            labelColor = labelColor,
+            leadingIconColor = leadingIconColor,
+            trailingIconColor = trailingIconColor,
+            disabledContainerColor = disabledContainerColor,
+            disabledLabelColor = disabledLabelColor,
+            disabledLeadingIconColor = disabledLeadingIconColor,
+            disabledTrailingIconColor = disabledTrailingIconColor,
+            selectedContainerColor = selectedContainerColor,
+            disabledSelectedContainerColor = disabledSelectedContainerColor,
+            selectedLabelColor = selectedLabelColor,
+            selectedLeadingIconColor = selectedLeadingIconColor,
+            selectedTrailingIconColor = selectedTrailingIconColor
+        )
 
     internal val ColorScheme.defaultInputChipColors: SelectableChipColors
         get() {
-            return defaultInputChipColorsCached ?: SelectableChipColors(
-                containerColor = Color.Transparent,
-                labelColor = fromToken(InputChipTokens.UnselectedLabelTextColor),
-                leadingIconColor = fromToken(InputChipTokens.UnselectedLeadingIconColor),
-                trailingIconColor = fromToken(InputChipTokens.UnselectedTrailingIconColor),
-                disabledContainerColor = Color.Transparent,
-                disabledLabelColor = fromToken(InputChipTokens.DisabledLabelTextColor)
-                    .copy(alpha = InputChipTokens.DisabledLabelTextOpacity),
-                disabledLeadingIconColor =
-                fromToken(InputChipTokens.DisabledLeadingIconColor)
-                    .copy(alpha = InputChipTokens.DisabledLeadingIconOpacity),
-                disabledTrailingIconColor =
-                fromToken(InputChipTokens.DisabledTrailingIconColor)
-                    .copy(alpha = InputChipTokens.DisabledTrailingIconOpacity),
-                selectedContainerColor = fromToken(InputChipTokens.SelectedContainerColor),
-                disabledSelectedContainerColor =
-                fromToken(InputChipTokens.DisabledSelectedContainerColor)
-                    .copy(alpha = InputChipTokens.DisabledSelectedContainerOpacity),
-                selectedLabelColor = fromToken(InputChipTokens.SelectedLabelTextColor),
-                selectedLeadingIconColor = fromToken(InputChipTokens.SelectedLeadingIconColor),
-                selectedTrailingIconColor = fromToken(InputChipTokens.SelectedTrailingIconColor),
-                ).also {
-                defaultInputChipColorsCached = it
-            }
+            return defaultInputChipColorsCached
+                ?: SelectableChipColors(
+                        containerColor = Color.Transparent,
+                        labelColor = fromToken(InputChipTokens.UnselectedLabelTextColor),
+                        leadingIconColor = fromToken(InputChipTokens.UnselectedLeadingIconColor),
+                        trailingIconColor = fromToken(InputChipTokens.UnselectedTrailingIconColor),
+                        disabledContainerColor = Color.Transparent,
+                        disabledLabelColor =
+                            fromToken(InputChipTokens.DisabledLabelTextColor)
+                                .copy(alpha = InputChipTokens.DisabledLabelTextOpacity),
+                        disabledLeadingIconColor =
+                            fromToken(InputChipTokens.DisabledLeadingIconColor)
+                                .copy(alpha = InputChipTokens.DisabledLeadingIconOpacity),
+                        disabledTrailingIconColor =
+                            fromToken(InputChipTokens.DisabledTrailingIconColor)
+                                .copy(alpha = InputChipTokens.DisabledTrailingIconOpacity),
+                        selectedContainerColor = fromToken(InputChipTokens.SelectedContainerColor),
+                        disabledSelectedContainerColor =
+                            fromToken(InputChipTokens.DisabledSelectedContainerColor)
+                                .copy(alpha = InputChipTokens.DisabledSelectedContainerOpacity),
+                        selectedLabelColor = fromToken(InputChipTokens.SelectedLabelTextColor),
+                        selectedLeadingIconColor =
+                            fromToken(InputChipTokens.SelectedLeadingIconColor),
+                        selectedTrailingIconColor =
+                            fromToken(InputChipTokens.SelectedTrailingIconColor),
+                    )
+                    .also { defaultInputChipColorsCached = it }
         }
 
     /**
      * Creates a [SelectableChipElevation] that will animate between the provided values according
      * to the Material specification for an [InputChip].
      *
-     * @param elevation the elevation used when the [FilterChip] is has no other
-     * [Interaction]s
+     * @param elevation the elevation used when the [FilterChip] is has no other [Interaction]s
      * @param pressedElevation the elevation used when the chip is pressed
      * @param focusedElevation the elevation used when the chip is focused
      * @param hoveredElevation the elevation used when the chip is hovered
@@ -1588,28 +1669,28 @@
         hoveredElevation: Dp = elevation,
         draggedElevation: Dp = InputChipTokens.DraggedContainerElevation,
         disabledElevation: Dp = elevation
-    ): SelectableChipElevation = SelectableChipElevation(
-        elevation = elevation,
-        pressedElevation = pressedElevation,
-        focusedElevation = focusedElevation,
-        hoveredElevation = hoveredElevation,
-        draggedElevation = draggedElevation,
-        disabledElevation = disabledElevation
-    )
+    ): SelectableChipElevation =
+        SelectableChipElevation(
+            elevation = elevation,
+            pressedElevation = pressedElevation,
+            focusedElevation = focusedElevation,
+            hoveredElevation = hoveredElevation,
+            draggedElevation = draggedElevation,
+            disabledElevation = disabledElevation
+        )
 
     /**
      * Creates a [BorderStroke] that represents the default border used in an [InputChip].
      *
      * @param selected whether this chip is selected or not
      * @param enabled controls the enabled state of this chip. When `false`, this component will not
-     * respond to user input, and it will appear visually disabled and disabled to accessibility
-     * services.
+     *   respond to user input, and it will appear visually disabled and disabled to accessibility
+     *   services.
      * @param borderColor the border color of this chip when enabled and not selected
      * @param selectedBorderColor the border color of this chip when enabled and selected
-     * @param disabledBorderColor the border color of this chip when not enabled and not
-     * selected
-     * @param disabledSelectedBorderColor the border color of this chip when not enabled
-     * but selected
+     * @param disabledBorderColor the border color of this chip when not enabled and not selected
+     * @param disabledSelectedBorderColor the border color of this chip when not enabled but
+     *   selected
      * @param borderWidth the border stroke width of this chip when not selected
      * @param selectedBorderWidth the border stroke width of this chip when selected
      */
@@ -1619,45 +1700,44 @@
         selected: Boolean,
         borderColor: Color = InputChipTokens.UnselectedOutlineColor.value,
         selectedBorderColor: Color = Color.Transparent,
-        disabledBorderColor: Color = InputChipTokens.DisabledUnselectedOutlineColor.value
-            .copy(alpha = InputChipTokens.DisabledUnselectedOutlineOpacity),
+        disabledBorderColor: Color =
+            InputChipTokens.DisabledUnselectedOutlineColor.value.copy(
+                alpha = InputChipTokens.DisabledUnselectedOutlineOpacity
+            ),
         disabledSelectedBorderColor: Color = Color.Transparent,
         borderWidth: Dp = InputChipTokens.UnselectedOutlineWidth,
         selectedBorderWidth: Dp = InputChipTokens.SelectedOutlineWidth,
     ): BorderStroke {
-        val color = if (enabled) {
-            if (selected) selectedBorderColor else borderColor
-        } else {
-            if (selected) disabledSelectedBorderColor else disabledBorderColor
-        }
+        val color =
+            if (enabled) {
+                if (selected) selectedBorderColor else borderColor
+            } else {
+                if (selected) disabledSelectedBorderColor else disabledBorderColor
+            }
         return BorderStroke(if (selected) selectedBorderWidth else borderWidth, color)
     }
 
     /** Default shape of an input chip. */
-    val shape: Shape @Composable get() = InputChipTokens.ContainerShape.value
+    val shape: Shape
+        @Composable get() = InputChipTokens.ContainerShape.value
 }
 
-/**
- * Contains the baseline values used by [SuggestionChip].
- */
+/** Contains the baseline values used by [SuggestionChip]. */
 object SuggestionChipDefaults {
     /**
-     * The height applied for a suggestion chip.
-     * Note that you can override it by applying Modifier.height directly on a chip.
+     * The height applied for a suggestion chip. Note that you can override it by applying
+     * Modifier.height directly on a chip.
      */
     val Height = SuggestionChipTokens.ContainerHeight
 
-    /**
-     * The size of a suggestion chip icon.
-     */
+    /** The size of a suggestion chip icon. */
     val IconSize = SuggestionChipTokens.LeadingIconSize
 
     /**
      * Creates a [ChipColors] that represents the default container, label, and icon colors used in
      * a flat [SuggestionChip].
      */
-    @Composable
-    fun suggestionChipColors() = MaterialTheme.colorScheme.defaultSuggestionChipColors
+    @Composable fun suggestionChipColors() = MaterialTheme.colorScheme.defaultSuggestionChipColors
 
     /**
      * Creates a [ChipColors] that represents the default container, label, and icon colors used in
@@ -1678,22 +1758,23 @@
         disabledContainerColor: Color = Color.Unspecified,
         disabledLabelColor: Color = Color.Unspecified,
         disabledIconContentColor: Color = Color.Unspecified
-    ): ChipColors = MaterialTheme.colorScheme.defaultSuggestionChipColors.copy(
-        containerColor = containerColor,
-        labelColor = labelColor,
-        leadingIconContentColor = iconContentColor,
-        trailingIconContentColor = Color.Unspecified,
-        disabledContainerColor = disabledContainerColor,
-        disabledLabelColor = disabledLabelColor,
-        disabledLeadingIconContentColor = disabledIconContentColor,
-        disabledTrailingIconContentColor = Color.Unspecified)
+    ): ChipColors =
+        MaterialTheme.colorScheme.defaultSuggestionChipColors.copy(
+            containerColor = containerColor,
+            labelColor = labelColor,
+            leadingIconContentColor = iconContentColor,
+            trailingIconContentColor = Color.Unspecified,
+            disabledContainerColor = disabledContainerColor,
+            disabledLabelColor = disabledLabelColor,
+            disabledLeadingIconContentColor = disabledIconContentColor,
+            disabledTrailingIconContentColor = Color.Unspecified
+        )
 
     /**
      * Creates a [ChipElevation] that will animate between the provided values according to the
      * Material specification for a flat [SuggestionChip].
      *
-     * @param elevation the elevation used when the chip is has no other
-     * [Interaction]s
+     * @param elevation the elevation used when the chip is has no other [Interaction]s
      * @param pressedElevation the elevation used when the chip is pressed
      * @param focusedElevation the elevation used when the chip is focused
      * @param hoveredElevation the elevation used when the chip is hovered
@@ -1708,14 +1789,15 @@
         hoveredElevation: Dp = elevation,
         draggedElevation: Dp = SuggestionChipTokens.DraggedContainerElevation,
         disabledElevation: Dp = elevation
-    ): ChipElevation = ChipElevation(
-        elevation = elevation,
-        pressedElevation = pressedElevation,
-        focusedElevation = focusedElevation,
-        hoveredElevation = hoveredElevation,
-        draggedElevation = draggedElevation,
-        disabledElevation = disabledElevation
-    )
+    ): ChipElevation =
+        ChipElevation(
+            elevation = elevation,
+            pressedElevation = pressedElevation,
+            focusedElevation = focusedElevation,
+            hoveredElevation = hoveredElevation,
+            draggedElevation = draggedElevation,
+            disabledElevation = disabledElevation
+        )
 
     /**
      * Creates a [BorderStroke] that represents the default border used in a flat [SuggestionChip].
@@ -1729,8 +1811,10 @@
     fun suggestionChipBorder(
         enabled: Boolean,
         borderColor: Color = SuggestionChipTokens.FlatOutlineColor.value,
-        disabledBorderColor: Color = SuggestionChipTokens.FlatDisabledOutlineColor.value
-            .copy(alpha = SuggestionChipTokens.FlatDisabledOutlineOpacity),
+        disabledBorderColor: Color =
+            SuggestionChipTokens.FlatDisabledOutlineColor.value.copy(
+                alpha = SuggestionChipTokens.FlatDisabledOutlineOpacity
+            ),
         borderWidth: Dp = SuggestionChipTokens.FlatOutlineWidth,
     ): BorderStroke = BorderStroke(borderWidth, if (enabled) borderColor else disabledBorderColor)
 
@@ -1744,21 +1828,26 @@
     @Suppress("DEPRECATION")
     @Deprecated(
         "Maintained for binary compatibility. Use the suggestChipBorder functions instead",
-        replaceWith = ReplaceWith("suggestionChipBorder(enabled, borderColor," +
-            " disabledBorderColor, borderWidth)"),
+        replaceWith =
+            ReplaceWith(
+                "suggestionChipBorder(enabled, borderColor," + " disabledBorderColor, borderWidth)"
+            ),
         level = DeprecationLevel.WARNING
     )
     @Composable
     fun suggestionChipBorder(
         borderColor: Color = SuggestionChipTokens.FlatOutlineColor.value,
-        disabledBorderColor: Color = SuggestionChipTokens.FlatDisabledOutlineColor.value
-            .copy(alpha = SuggestionChipTokens.FlatDisabledOutlineOpacity),
+        disabledBorderColor: Color =
+            SuggestionChipTokens.FlatDisabledOutlineColor.value.copy(
+                alpha = SuggestionChipTokens.FlatDisabledOutlineOpacity
+            ),
         borderWidth: Dp = SuggestionChipTokens.FlatOutlineWidth,
-    ): ChipBorder = ChipBorder(
-        borderColor = borderColor,
-        disabledBorderColor = disabledBorderColor,
-        borderWidth = borderWidth
-    )
+    ): ChipBorder =
+        ChipBorder(
+            borderColor = borderColor,
+            disabledBorderColor = disabledBorderColor,
+            borderWidth = borderWidth
+        )
 
     /**
      * Creates a [ChipColors] that represents the default container, label, and icon colors used in
@@ -1787,44 +1876,45 @@
         disabledContainerColor: Color = Color.Unspecified,
         disabledLabelColor: Color = Color.Unspecified,
         disabledIconContentColor: Color = Color.Unspecified
-    ): ChipColors = MaterialTheme.colorScheme.defaultElevatedSuggestionChipColors.copy(
-        containerColor = containerColor,
-        labelColor = labelColor,
-        leadingIconContentColor = iconContentColor,
-        trailingIconContentColor = Color.Unspecified,
-        disabledContainerColor = disabledContainerColor,
-        disabledLabelColor = disabledLabelColor,
-        disabledLeadingIconContentColor = disabledIconContentColor,
-        disabledTrailingIconContentColor = Color.Unspecified
-    )
+    ): ChipColors =
+        MaterialTheme.colorScheme.defaultElevatedSuggestionChipColors.copy(
+            containerColor = containerColor,
+            labelColor = labelColor,
+            leadingIconContentColor = iconContentColor,
+            trailingIconContentColor = Color.Unspecified,
+            disabledContainerColor = disabledContainerColor,
+            disabledLabelColor = disabledLabelColor,
+            disabledLeadingIconContentColor = disabledIconContentColor,
+            disabledTrailingIconContentColor = Color.Unspecified
+        )
 
     internal val ColorScheme.defaultElevatedSuggestionChipColors: ChipColors
         get() {
-            return defaultElevatedSuggestionChipColorsCached ?: ChipColors(
-                containerColor = fromToken(SuggestionChipTokens.ElevatedContainerColor),
-                labelColor = fromToken(SuggestionChipTokens.LabelTextColor),
-                leadingIconContentColor = fromToken(SuggestionChipTokens.LeadingIconColor),
-                trailingIconContentColor = Color.Unspecified,
-                disabledContainerColor =
-                fromToken(SuggestionChipTokens.ElevatedDisabledContainerColor)
-                    .copy(alpha = AssistChipTokens.ElevatedDisabledContainerOpacity),
-                disabledLabelColor = fromToken(SuggestionChipTokens.DisabledLabelTextColor)
-                    .copy(alpha = SuggestionChipTokens.DisabledLabelTextOpacity),
-                disabledLeadingIconContentColor =
-                fromToken(AssistChipTokens.DisabledIconColor)
-                    .copy(alpha = AssistChipTokens.DisabledIconOpacity),
-                disabledTrailingIconContentColor = Color.Unspecified
-            ).also {
-                defaultElevatedSuggestionChipColorsCached = it
-            }
+            return defaultElevatedSuggestionChipColorsCached
+                ?: ChipColors(
+                        containerColor = fromToken(SuggestionChipTokens.ElevatedContainerColor),
+                        labelColor = fromToken(SuggestionChipTokens.LabelTextColor),
+                        leadingIconContentColor = fromToken(SuggestionChipTokens.LeadingIconColor),
+                        trailingIconContentColor = Color.Unspecified,
+                        disabledContainerColor =
+                            fromToken(SuggestionChipTokens.ElevatedDisabledContainerColor)
+                                .copy(alpha = AssistChipTokens.ElevatedDisabledContainerOpacity),
+                        disabledLabelColor =
+                            fromToken(SuggestionChipTokens.DisabledLabelTextColor)
+                                .copy(alpha = SuggestionChipTokens.DisabledLabelTextOpacity),
+                        disabledLeadingIconContentColor =
+                            fromToken(AssistChipTokens.DisabledIconColor)
+                                .copy(alpha = AssistChipTokens.DisabledIconOpacity),
+                        disabledTrailingIconContentColor = Color.Unspecified
+                    )
+                    .also { defaultElevatedSuggestionChipColorsCached = it }
         }
 
     /**
      * Creates a [ChipElevation] that will animate between the provided values according to the
      * Material specification for an elevated [SuggestionChip].
      *
-     * @param elevation the elevation used when the chip is has no other
-     * [Interaction]s
+     * @param elevation the elevation used when the chip is has no other [Interaction]s
      * @param pressedElevation the elevation used when the chip is pressed
      * @param focusedElevation the elevation used when the chip is focused
      * @param hoveredElevation the elevation used when the chip is hovered
@@ -1839,17 +1929,19 @@
         hoveredElevation: Dp = SuggestionChipTokens.ElevatedHoverContainerElevation,
         draggedElevation: Dp = SuggestionChipTokens.DraggedContainerElevation,
         disabledElevation: Dp = SuggestionChipTokens.ElevatedDisabledContainerElevation
-    ): ChipElevation = ChipElevation(
-        elevation = elevation,
-        pressedElevation = pressedElevation,
-        focusedElevation = focusedElevation,
-        hoveredElevation = hoveredElevation,
-        draggedElevation = draggedElevation,
-        disabledElevation = disabledElevation
-    )
+    ): ChipElevation =
+        ChipElevation(
+            elevation = elevation,
+            pressedElevation = pressedElevation,
+            focusedElevation = focusedElevation,
+            hoveredElevation = hoveredElevation,
+            draggedElevation = draggedElevation,
+            disabledElevation = disabledElevation
+        )
 
     /** Default shape of a suggestion chip. */
-    val shape: Shape @Composable get() = SuggestionChipTokens.ContainerShape.value
+    val shape: Shape
+        @Composable get() = SuggestionChipTokens.ContainerShape.value
 }
 
 @Composable
@@ -1963,14 +2055,11 @@
         LocalTextStyle provides labelTextStyle
     ) {
         Layout(
-            modifier = Modifier
-                .defaultMinSize(minHeight = minHeight)
-                .padding(paddingValues),
+            modifier = Modifier.defaultMinSize(minHeight = minHeight).padding(paddingValues),
             content = {
                 if (avatar != null || leadingIcon != null) {
                     Box(
-                        modifier = Modifier
-                            .layoutId(LeadingIconLayoutId),
+                        modifier = Modifier.layoutId(LeadingIconLayoutId),
                         contentAlignment = Alignment.Center,
                         content = {
                             if (avatar != null) {
@@ -1985,17 +2074,15 @@
                     )
                 }
                 Row(
-                    modifier = Modifier
-                        .layoutId(LabelLayoutId)
-                        .padding(HorizontalElementsPadding, 0.dp),
+                    modifier =
+                        Modifier.layoutId(LabelLayoutId).padding(HorizontalElementsPadding, 0.dp),
                     horizontalArrangement = Arrangement.Start,
                     verticalAlignment = Alignment.CenterVertically,
                     content = { label() }
                 )
                 if (trailingIcon != null) {
                     Box(
-                        modifier = Modifier
-                            .layoutId(TrailingIconLayoutId),
+                        modifier = Modifier.layoutId(TrailingIconLayoutId),
                         contentAlignment = Alignment.Center,
                         content = {
                             CompositionLocalProvider(
@@ -2008,21 +2095,25 @@
             }
         ) { measurables, constraints ->
             val leadingIconPlaceable: Placeable? =
-                measurables.fastFirstOrNull { it.layoutId == LeadingIconLayoutId }
+                measurables
+                    .fastFirstOrNull { it.layoutId == LeadingIconLayoutId }
                     ?.measure(constraints.copy(minWidth = 0, minHeight = 0))
             val leadingIconWidth = widthOrZero(leadingIconPlaceable)
             val leadingIconHeight = heightOrZero(leadingIconPlaceable)
 
             val trailingIconPlaceable: Placeable? =
-                measurables.fastFirstOrNull { it.layoutId == TrailingIconLayoutId }
+                measurables
+                    .fastFirstOrNull { it.layoutId == TrailingIconLayoutId }
                     ?.measure(constraints.copy(minWidth = 0, minHeight = 0))
             val trailingIconWidth = widthOrZero(trailingIconPlaceable)
             val trailingIconHeight = heightOrZero(trailingIconPlaceable)
 
-            val labelPlaceable = measurables.fastFirst { it.layoutId == LabelLayoutId }
-                .measure(
-                    constraints.offset(horizontal = -(leadingIconWidth + trailingIconWidth))
-                )
+            val labelPlaceable =
+                measurables
+                    .fastFirst { it.layoutId == LabelLayoutId }
+                    .measure(
+                        constraints.offset(horizontal = -(leadingIconWidth + trailingIconWidth))
+                    )
 
             val width = leadingIconWidth + labelPlaceable.width + trailingIconWidth
             val height = maxOf(leadingIconHeight, labelPlaceable.height, trailingIconHeight)
@@ -2071,7 +2162,6 @@
      *
      * Shadow elevation is used to apply a shadow around the chip to give it higher emphasis.
      *
-     *
      * @param enabled whether the chip is enabled
      * @param interactionSource the [InteractionSource] for this chip
      */
@@ -2096,39 +2186,30 @@
                     is HoverInteraction.Enter -> {
                         interactions.add(interaction)
                     }
-
                     is HoverInteraction.Exit -> {
                         interactions.remove(interaction.enter)
                     }
-
                     is FocusInteraction.Focus -> {
                         interactions.add(interaction)
                     }
-
                     is FocusInteraction.Unfocus -> {
                         interactions.remove(interaction.focus)
                     }
-
                     is PressInteraction.Press -> {
                         interactions.add(interaction)
                     }
-
                     is PressInteraction.Release -> {
                         interactions.remove(interaction.press)
                     }
-
                     is PressInteraction.Cancel -> {
                         interactions.remove(interaction.press)
                     }
-
                     is DragInteraction.Start -> {
                         interactions.add(interaction)
                     }
-
                     is DragInteraction.Stop -> {
                         interactions.remove(interaction.start)
                     }
-
                     is DragInteraction.Cancel -> {
                         interactions.remove(interaction.start)
                     }
@@ -2138,17 +2219,18 @@
 
         val interaction = interactions.lastOrNull()
 
-        val target = if (!enabled) {
-            disabledElevation
-        } else {
-            when (interaction) {
-                is PressInteraction.Press -> pressedElevation
-                is HoverInteraction.Enter -> hoveredElevation
-                is FocusInteraction.Focus -> focusedElevation
-                is DragInteraction.Start -> draggedElevation
-                else -> elevation
+        val target =
+            if (!enabled) {
+                disabledElevation
+            } else {
+                when (interaction) {
+                    is PressInteraction.Press -> pressedElevation
+                    is HoverInteraction.Enter -> hoveredElevation
+                    is FocusInteraction.Focus -> focusedElevation
+                    is DragInteraction.Start -> draggedElevation
+                    else -> elevation
+                }
             }
-        }
 
         val animatable = remember { Animatable(target, Dp.VectorConverter) }
 
@@ -2159,7 +2241,9 @@
                     animatable.snapTo(target)
                 } else {
                     animatable.animateElevation(
-                        from = lastInteraction, to = interaction, target = target
+                        from = lastInteraction,
+                        to = interaction,
+                        target = target
                     )
                 }
                 lastInteraction = interaction
@@ -2241,39 +2325,30 @@
                     is HoverInteraction.Enter -> {
                         interactions.add(interaction)
                     }
-
                     is HoverInteraction.Exit -> {
                         interactions.remove(interaction.enter)
                     }
-
                     is FocusInteraction.Focus -> {
                         interactions.add(interaction)
                     }
-
                     is FocusInteraction.Unfocus -> {
                         interactions.remove(interaction.focus)
                     }
-
                     is PressInteraction.Press -> {
                         interactions.add(interaction)
                     }
-
                     is PressInteraction.Release -> {
                         interactions.remove(interaction.press)
                     }
-
                     is PressInteraction.Cancel -> {
                         interactions.remove(interaction.press)
                     }
-
                     is DragInteraction.Start -> {
                         interactions.add(interaction)
                     }
-
                     is DragInteraction.Stop -> {
                         interactions.remove(interaction.start)
                     }
-
                     is DragInteraction.Cancel -> {
                         interactions.remove(interaction.start)
                     }
@@ -2283,17 +2358,18 @@
 
         val interaction = interactions.lastOrNull()
 
-        val target = if (!enabled) {
-            disabledElevation
-        } else {
-            when (interaction) {
-                is PressInteraction.Press -> pressedElevation
-                is HoverInteraction.Enter -> hoveredElevation
-                is FocusInteraction.Focus -> focusedElevation
-                is DragInteraction.Start -> draggedElevation
-                else -> elevation
+        val target =
+            if (!enabled) {
+                disabledElevation
+            } else {
+                when (interaction) {
+                    is PressInteraction.Press -> pressedElevation
+                    is HoverInteraction.Enter -> hoveredElevation
+                    is FocusInteraction.Focus -> focusedElevation
+                    is DragInteraction.Start -> draggedElevation
+                    else -> elevation
+                }
             }
-        }
 
         val animatable = remember { Animatable(target, Dp.VectorConverter) }
 
@@ -2304,7 +2380,9 @@
                     animatable.snapTo(target)
                 } else {
                     animatable.animateElevation(
-                        from = lastInteraction, to = interaction, target = target
+                        from = lastInteraction,
+                        to = interaction,
+                        target = target
                     )
                 }
                 lastInteraction = interaction
@@ -2340,10 +2418,6 @@
 /**
  * Represents the container and content colors used in a clickable chip in different states.
  *
- * @constructor create an instance with arbitrary colors, see [AssistChipDefaults],
- * [InputChipDefaults], and [SuggestionChipDefaults] for the default colors used in the various Chip
- * configurations.
- *
  * @param containerColor the container color of this chip when enabled
  * @param labelColor the label color of this chip when enabled
  * @param leadingIconContentColor the color of this chip's start icon when enabled
@@ -2352,9 +2426,13 @@
  * @param disabledLabelColor the label color of this chip when not enabled
  * @param disabledLeadingIconContentColor the color of this chip's start icon when not enabled
  * @param disabledTrailingIconContentColor the color of this chip's end icon when not enabled
+ * @constructor create an instance with arbitrary colors, see [AssistChipDefaults],
+ *   [InputChipDefaults], and [SuggestionChipDefaults] for the default colors used in the various
+ *   Chip configurations.
  */
 @Immutable
-class ChipColors constructor(
+class ChipColors
+constructor(
     val containerColor: Color,
     val labelColor: Color,
     val leadingIconContentColor: Color,
@@ -2366,8 +2444,8 @@
     // TODO(b/113855296): Support other states: hover, focus, drag
 ) {
     /**
-     * Returns a copy of this ChipColors, optionally overriding some of the values.
-     * This uses the Color.Unspecified to mean “use the value from the source”
+     * Returns a copy of this ChipColors, optionally overriding some of the values. This uses the
+     * Color.Unspecified to mean “use the value from the source”
      */
     fun copy(
         containerColor: Color = this.containerColor,
@@ -2378,16 +2456,17 @@
         disabledLabelColor: Color = this.disabledLabelColor,
         disabledLeadingIconContentColor: Color = this.disabledLeadingIconContentColor,
         disabledTrailingIconContentColor: Color = this.disabledTrailingIconContentColor
-    ) = ChipColors(
-       containerColor.takeOrElse { this.containerColor },
-       labelColor.takeOrElse { this.labelColor },
-       leadingIconContentColor.takeOrElse { this.leadingIconContentColor },
-       trailingIconContentColor.takeOrElse { this.trailingIconContentColor },
-       disabledContainerColor.takeOrElse { this.disabledContainerColor },
-       disabledLabelColor.takeOrElse { this.disabledLabelColor },
-       disabledLeadingIconContentColor.takeOrElse { this.disabledLeadingIconContentColor },
-       disabledTrailingIconContentColor.takeOrElse { this.disabledTrailingIconContentColor }
-    )
+    ) =
+        ChipColors(
+            containerColor.takeOrElse { this.containerColor },
+            labelColor.takeOrElse { this.labelColor },
+            leadingIconContentColor.takeOrElse { this.leadingIconContentColor },
+            trailingIconContentColor.takeOrElse { this.trailingIconContentColor },
+            disabledContainerColor.takeOrElse { this.disabledContainerColor },
+            disabledLabelColor.takeOrElse { this.disabledLabelColor },
+            disabledLeadingIconContentColor.takeOrElse { this.disabledLeadingIconContentColor },
+            disabledTrailingIconContentColor.takeOrElse { this.disabledTrailingIconContentColor }
+        )
 
     /**
      * Represents the container color for this chip, depending on [enabled].
@@ -2457,22 +2536,22 @@
 
 internal val ColorScheme.defaultSuggestionChipColors: ChipColors
     get() {
-        return defaultSuggestionChipColorsCached ?: ChipColors(
-            containerColor = Color.Transparent,
-            labelColor = fromToken(SuggestionChipTokens.LabelTextColor),
-            leadingIconContentColor = fromToken(SuggestionChipTokens.LeadingIconColor),
-            trailingIconContentColor = Color.Unspecified,
-            disabledContainerColor = Color.Transparent,
-            disabledLabelColor = fromToken(SuggestionChipTokens.DisabledLabelTextColor)
-                .copy(alpha = SuggestionChipTokens.DisabledLabelTextOpacity),
-            disabledLeadingIconContentColor =
-            fromToken(SuggestionChipTokens.DisabledLeadingIconColor)
-                .copy(alpha = SuggestionChipTokens.DisabledLeadingIconOpacity),
-            disabledTrailingIconContentColor = Color.Unspecified
-
-        ).also {
-            defaultSuggestionChipColorsCached = it
-        }
+        return defaultSuggestionChipColorsCached
+            ?: ChipColors(
+                    containerColor = Color.Transparent,
+                    labelColor = fromToken(SuggestionChipTokens.LabelTextColor),
+                    leadingIconContentColor = fromToken(SuggestionChipTokens.LeadingIconColor),
+                    trailingIconContentColor = Color.Unspecified,
+                    disabledContainerColor = Color.Transparent,
+                    disabledLabelColor =
+                        fromToken(SuggestionChipTokens.DisabledLabelTextColor)
+                            .copy(alpha = SuggestionChipTokens.DisabledLabelTextOpacity),
+                    disabledLeadingIconContentColor =
+                        fromToken(SuggestionChipTokens.DisabledLeadingIconColor)
+                            .copy(alpha = SuggestionChipTokens.DisabledLeadingIconOpacity),
+                    disabledTrailingIconContentColor = Color.Unspecified
+                )
+                .also { defaultSuggestionChipColorsCached = it }
     }
 
 /**
@@ -2482,7 +2561,8 @@
  * the default colors used in [FilterChip].
  */
 @Immutable
-class SelectableChipColors constructor(
+class SelectableChipColors
+constructor(
     private val containerColor: Color,
     private val labelColor: Color,
     private val leadingIconColor: Color,
@@ -2499,8 +2579,8 @@
     // TODO(b/113855296): Support other states: hover, focus, drag
 ) {
     /**
-     * Returns a copy of this SelectableChipColors, optionally overriding some of the values.
-     * This uses the Color.Unspecified to mean “use the value from the source”
+     * Returns a copy of this SelectableChipColors, optionally overriding some of the values. This
+     * uses the Color.Unspecified to mean “use the value from the source”
      */
     fun copy(
         containerColor: Color = this.containerColor,
@@ -2516,21 +2596,22 @@
         selectedLabelColor: Color = this.selectedLabelColor,
         selectedLeadingIconColor: Color = this.selectedLeadingIconColor,
         selectedTrailingIconColor: Color = this.selectedTrailingIconColor
-    ) = SelectableChipColors(
-        containerColor.takeOrElse { this.containerColor },
-        labelColor.takeOrElse { this.labelColor },
-        leadingIconColor.takeOrElse { this.leadingIconColor },
-        trailingIconColor.takeOrElse { this.trailingIconColor },
-        disabledContainerColor.takeOrElse { this.disabledContainerColor },
-        disabledLabelColor.takeOrElse { this.disabledLabelColor },
-        disabledLeadingIconColor.takeOrElse { this.disabledLeadingIconColor },
-        disabledTrailingIconColor.takeOrElse { this.disabledTrailingIconColor },
-        selectedContainerColor.takeOrElse { this.selectedContainerColor },
-        disabledSelectedContainerColor.takeOrElse { this.disabledSelectedContainerColor },
-        selectedLabelColor.takeOrElse { this.selectedLabelColor },
-        selectedLeadingIconColor.takeOrElse { this.selectedLeadingIconColor },
-        selectedTrailingIconColor.takeOrElse { this.selectedTrailingIconColor }
-    )
+    ) =
+        SelectableChipColors(
+            containerColor.takeOrElse { this.containerColor },
+            labelColor.takeOrElse { this.labelColor },
+            leadingIconColor.takeOrElse { this.leadingIconColor },
+            trailingIconColor.takeOrElse { this.trailingIconColor },
+            disabledContainerColor.takeOrElse { this.disabledContainerColor },
+            disabledLabelColor.takeOrElse { this.disabledLabelColor },
+            disabledLeadingIconColor.takeOrElse { this.disabledLeadingIconColor },
+            disabledTrailingIconColor.takeOrElse { this.disabledTrailingIconColor },
+            selectedContainerColor.takeOrElse { this.selectedContainerColor },
+            disabledSelectedContainerColor.takeOrElse { this.disabledSelectedContainerColor },
+            selectedLabelColor.takeOrElse { this.selectedLabelColor },
+            selectedLeadingIconColor.takeOrElse { this.selectedLeadingIconColor },
+            selectedTrailingIconColor.takeOrElse { this.selectedTrailingIconColor }
+        )
 
     /**
      * Represents the container color for this chip, depending on [enabled] and [selected].
@@ -2632,16 +2713,14 @@
     }
 }
 
-/**
- * Represents the border stroke used in a chip in different states.
- */
-
+/** Represents the border stroke used in a chip in different states. */
 @Deprecated(
     "Maintained for binary compatibility. Use the chipBorder functions instead",
     level = DeprecationLevel.WARNING
 )
 @Immutable
-class ChipBorder internal constructor(
+class ChipBorder
+internal constructor(
     private val borderColor: Color,
     private val disabledBorderColor: Color,
     private val borderWidth: Dp,
@@ -2679,9 +2758,7 @@
     }
 }
 
-/**
- * Returns the [PaddingValues] for the input chip.
- */
+/** Returns the [PaddingValues] for the input chip. */
 private fun inputChipPadding(
     hasAvatar: Boolean = false,
     hasLeadingIcon: Boolean = false,
@@ -2692,24 +2769,16 @@
     return PaddingValues(start = start, end = end)
 }
 
-/**
- * The padding between the elements in the chip.
- */
+/** The padding between the elements in the chip. */
 private val HorizontalElementsPadding = 8.dp
 
-/**
- * Returns the [PaddingValues] for the assist chip.
- */
+/** Returns the [PaddingValues] for the assist chip. */
 private val AssistChipPadding = PaddingValues(horizontal = HorizontalElementsPadding)
 
-/**
- * [PaddingValues] for the filter chip.
- */
+/** [PaddingValues] for the filter chip. */
 private val FilterChipPadding = PaddingValues(horizontal = HorizontalElementsPadding)
 
-/**
- * Returns the [PaddingValues] for the suggestion chip.
- */
+/** Returns the [PaddingValues] for the suggestion chip. */
 private val SuggestionChipPadding = PaddingValues(horizontal = HorizontalElementsPadding)
 
 private const val LeadingIconLayoutId = "leadingIcon"
diff --git a/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/ColorScheme.kt b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/ColorScheme.kt
index 755c7f3..9031bd1 100644
--- a/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/ColorScheme.kt
+++ b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/ColorScheme.kt
@@ -35,83 +35,88 @@
 /**
  * A color scheme holds all the named color parameters for a [MaterialTheme].
  *
- * Color schemes are designed to be harmonious, ensure accessible text, and distinguish UI
- * elements and surfaces from one another. There are two built-in baseline schemes,
- * [lightColorScheme] and a [darkColorScheme], that can be used as-is or customized.
+ * Color schemes are designed to be harmonious, ensure accessible text, and distinguish UI elements
+ * and surfaces from one another. There are two built-in baseline schemes, [lightColorScheme] and a
+ * [darkColorScheme], that can be used as-is or customized.
  *
  * The Material color system and custom schemes provide default values for color as a starting point
  * for customization.
  *
  * Example of extending color scheme, including implementing Fixed Accent colors:
+ *
  * @sample androidx.compose.material3.samples.ColorSchemeFixedAccentColorSample
  *
- * To learn more about colors, see [Material Design colors](https://m3.material.io/styles/color/overview).
+ * To learn more about colors, see
+ * [Material Design colors](https://m3.material.io/styles/color/overview).
  *
  * @property primary The primary color is the color displayed most frequently across your app’s
- * screens and components.
+ *   screens and components.
  * @property onPrimary Color used for text and icons displayed on top of the primary color.
  * @property primaryContainer The preferred tonal color of containers.
  * @property onPrimaryContainer The color (and state variants) that should be used for content on
- * top of [primaryContainer].
+ *   top of [primaryContainer].
  * @property inversePrimary Color to be used as a "primary" color in places where the inverse color
- * scheme is needed, such as the button on a SnackBar.
+ *   scheme is needed, such as the button on a SnackBar.
  * @property secondary The secondary color provides more ways to accent and distinguish your
- * product. Secondary colors are best for:
+ *   product. Secondary colors are best for:
  * - Floating action buttons
  * - Selection controls, like checkboxes and radio buttons
  * - Highlighting selected text
  * - Links and headlines
+ *
  * @property onSecondary Color used for text and icons displayed on top of the secondary color.
  * @property secondaryContainer A tonal color to be used in containers.
  * @property onSecondaryContainer The color (and state variants) that should be used for content on
- * top of [secondaryContainer].
- * @property tertiary The tertiary color that can be used to balance primary and secondary
- * colors, or bring heightened attention to an element such as an input field.
+ *   top of [secondaryContainer].
+ * @property tertiary The tertiary color that can be used to balance primary and secondary colors,
+ *   or bring heightened attention to an element such as an input field.
  * @property onTertiary Color used for text and icons displayed on top of the tertiary color.
  * @property tertiaryContainer A tonal color to be used in containers.
  * @property onTertiaryContainer The color (and state variants) that should be used for content on
- * top of [tertiaryContainer].
+ *   top of [tertiaryContainer].
  * @property background The background color that appears behind scrollable content.
  * @property onBackground Color used for text and icons displayed on top of the background color.
  * @property surface The surface color that affect surfaces of components, such as cards, sheets,
- * and menus.
+ *   and menus.
  * @property onSurface Color used for text and icons displayed on top of the surface color.
  * @property surfaceVariant Another option for a color with similar uses of [surface].
  * @property onSurfaceVariant The color (and state variants) that can be used for content on top of
- * [surface].
+ *   [surface].
  * @property surfaceTint This color will be used by components that apply tonal elevation and is
- * applied on top of [surface]. The higher the elevation the more this color is used.
+ *   applied on top of [surface]. The higher the elevation the more this color is used.
  * @property inverseSurface A color that contrasts sharply with [surface]. Useful for surfaces that
- * sit on top of other surfaces with [surface] color.
+ *   sit on top of other surfaces with [surface] color.
  * @property inverseOnSurface A color that contrasts well with [inverseSurface]. Useful for content
- * that sits on top of containers that are [inverseSurface].
+ *   that sits on top of containers that are [inverseSurface].
  * @property error The error color is used to indicate errors in components, such as invalid text in
- * a text field.
+ *   a text field.
  * @property onError Color used for text and icons displayed on top of the error color.
  * @property errorContainer The preferred tonal color of error containers.
- * @property onErrorContainer The color (and state variants) that should be used for content on
- * top of [errorContainer].
+ * @property onErrorContainer The color (and state variants) that should be used for content on top
+ *   of [errorContainer].
  * @property outline Subtle color used for boundaries. Outline color role adds contrast for
- * accessibility purposes.
+ *   accessibility purposes.
  * @property outlineVariant Utility color used for boundaries for decorative elements when strong
- * contrast is not required.
+ *   contrast is not required.
  * @property scrim Color of a scrim that obscures content.
  * @property surfaceBright A [surface] variant that is always brighter than [surface], whether in
- * light or dark mode.
- * @property surfaceDim A [surface] variant that is always dimmer than [surface], whether in light or
- * dark mode.
+ *   light or dark mode.
+ * @property surfaceDim A [surface] variant that is always dimmer than [surface], whether in light
+ *   or dark mode.
  * @property surfaceContainer A [surface] variant that affects containers of components, such as
- * cards, sheets, and menus.
+ *   cards, sheets, and menus.
  * @property surfaceContainerHigh A [surface] variant for containers with higher emphasis than
- * [surfaceContainer]. Use this role for content which requires more emphasis than [surfaceContainer].
+ *   [surfaceContainer]. Use this role for content which requires more emphasis than
+ *   [surfaceContainer].
  * @property surfaceContainerHighest A [surface] variant for containers with higher emphasis than
- * [surfaceContainerHigh]. Use this role for content which requires more emphasis than
- * [surfaceContainerHigh].
+ *   [surfaceContainerHigh]. Use this role for content which requires more emphasis than
+ *   [surfaceContainerHigh].
  * @property surfaceContainerLow A [surface] variant for containers with lower emphasis than
- * [surfaceContainer]. Use this role for content which requires less emphasis than [surfaceContainer].
+ *   [surfaceContainer]. Use this role for content which requires less emphasis than
+ *   [surfaceContainer].
  * @property surfaceContainerLowest A [surface] variant for containers with lower emphasis than
- * [surfaceContainerLow]. Use this role for content which requires less emphasis than
- * [surfaceContainerLow].
+ *   [surfaceContainerLow]. Use this role for content which requires less emphasis than
+ *   [surfaceContainerLow].
  */
 @Immutable
 class ColorScheme(
@@ -155,42 +160,45 @@
     @Deprecated(
         level = DeprecationLevel.WARNING,
         message = "Use constructor with additional 'surfaceContainer' roles.",
-        replaceWith = ReplaceWith("ColorScheme(primary,\n" +
-            "onPrimary,\n" +
-            "primaryContainer,\n" +
-            "onPrimaryContainer,\n" +
-            "inversePrimary,\n" +
-            "secondary,\n" +
-            "onSecondary,\n" +
-            "secondaryContainer,\n" +
-            "onSecondaryContainer,\n" +
-            "tertiary,\n" +
-            "onTertiary,\n" +
-            "tertiaryContainer,\n" +
-            "onTertiaryContainer,\n" +
-            "background,\n" +
-            "onBackground,\n" +
-            "surface,\n" +
-            "onSurface,\n" +
-            "surfaceVariant,\n" +
-            "onSurfaceVariant,\n" +
-            "surfaceTint,\n" +
-            "inverseSurface,\n" +
-            "inverseOnSurface,\n" +
-            "error,\n" +
-            "onError,\n" +
-            "errorContainer,\n" +
-            "onErrorContainer,\n" +
-            "outline,\n" +
-            "outlineVariant,\n" +
-            "scrim,\n" +
-            "surfaceBright,\n" +
-            "surfaceDim,\n" +
-            "surfaceContainer,\n" +
-            "surfaceContainerHigh,\n" +
-            "surfaceContainerHighest,\n" +
-            "surfaceContainerLow,\n" +
-            "surfaceContainerLowest,)")
+        replaceWith =
+            ReplaceWith(
+                "ColorScheme(primary,\n" +
+                    "onPrimary,\n" +
+                    "primaryContainer,\n" +
+                    "onPrimaryContainer,\n" +
+                    "inversePrimary,\n" +
+                    "secondary,\n" +
+                    "onSecondary,\n" +
+                    "secondaryContainer,\n" +
+                    "onSecondaryContainer,\n" +
+                    "tertiary,\n" +
+                    "onTertiary,\n" +
+                    "tertiaryContainer,\n" +
+                    "onTertiaryContainer,\n" +
+                    "background,\n" +
+                    "onBackground,\n" +
+                    "surface,\n" +
+                    "onSurface,\n" +
+                    "surfaceVariant,\n" +
+                    "onSurfaceVariant,\n" +
+                    "surfaceTint,\n" +
+                    "inverseSurface,\n" +
+                    "inverseOnSurface,\n" +
+                    "error,\n" +
+                    "onError,\n" +
+                    "errorContainer,\n" +
+                    "onErrorContainer,\n" +
+                    "outline,\n" +
+                    "outlineVariant,\n" +
+                    "scrim,\n" +
+                    "surfaceBright,\n" +
+                    "surfaceDim,\n" +
+                    "surfaceContainer,\n" +
+                    "surfaceContainerHigh,\n" +
+                    "surfaceContainerHighest,\n" +
+                    "surfaceContainerLow,\n" +
+                    "surfaceContainerLowest,)"
+            )
     )
     constructor(
         primary: Color,
@@ -517,9 +525,7 @@
     internal var defaultRichTooltipColorsCached: RichTooltipColors? = null
 }
 
-/**
- * Returns a light Material color scheme.
- */
+/** Returns a light Material color scheme. */
 fun lightColorScheme(
     primary: Color = ColorLightTokens.Primary,
     onPrimary: Color = ColorLightTokens.OnPrimary,
@@ -665,9 +671,7 @@
         scrim = scrim,
     )
 
-/**
- * Returns a dark Material color scheme.
- */
+/** Returns a dark Material color scheme. */
 fun darkColorScheme(
     primary: Color = ColorDarkTokens.Primary,
     onPrimary: Color = ColorDarkTokens.OnPrimary,
@@ -826,8 +830,7 @@
  * [Color.Unspecified].
  *
  * @return the matching content color for [backgroundColor]. If [backgroundColor] is not present in
- * the theme's [ColorScheme], then returns [Color.Unspecified].
- *
+ *   the theme's [ColorScheme], then returns [Color.Unspecified].
  * @see contentColorFor
  */
 @Stable
@@ -867,8 +870,7 @@
  * value of [LocalContentColor] as a best-effort color.
  *
  * @return the matching content color for [backgroundColor]. If [backgroundColor] is not present in
- * the theme's [ColorScheme], then returns the current value of [LocalContentColor].
- *
+ *   the theme's [ColorScheme], then returns the current value of [LocalContentColor].
  * @see ColorScheme.contentColorFor
  */
 @Composable
@@ -885,10 +887,9 @@
  *
  * @param backgroundColor The background color to compare to [ColorScheme.surface]
  * @param elevation The elevation provided to [ColorScheme.surfaceColorAtElevation] if
- * [backgroundColor] matches surface.
- *
+ *   [backgroundColor] matches surface.
  * @return [ColorScheme.surfaceColorAtElevation] at [elevation] if [backgroundColor] ==
- * [ColorScheme.surface] and [LocalTonalElevationEnabled] is set to true. Else [backgroundColor]
+ *   [ColorScheme.surface] and [LocalTonalElevationEnabled] is set to true. Else [backgroundColor]
  */
 @Composable
 @ReadOnlyComposable
@@ -905,9 +906,8 @@
  * Computes the surface tonal color at different elevation levels e.g. surface1 through surface5.
  *
  * @param elevation Elevation value used to compute alpha of the color overlay layer.
- *
  * @return the [ColorScheme.surface] color with an alpha of the [ColorScheme.surfaceTint] color
- * overlaid on top of it.
+ *   overlaid on top of it.
  */
 @Stable
 fun ColorScheme.surfaceColorAtElevation(
@@ -925,17 +925,17 @@
  */
 // TODO: Mark as experimental if scope is changed to public
 // TODO: Add samples for MaterialExpressiveTheme toggling expressiveLightColorScheme and darkTheme.
-internal fun expressiveLightColorScheme() = lightColorScheme(
-    // TODO: Replace palette references with color token references when available.
-    onPrimaryContainer = PaletteTokens.Primary30,
-    onSecondaryContainer = PaletteTokens.Secondary30,
-    onTertiaryContainer = PaletteTokens.Secondary30,
-)
+internal fun expressiveLightColorScheme() =
+    lightColorScheme(
+        // TODO: Replace palette references with color token references when available.
+        onPrimaryContainer = PaletteTokens.Primary30,
+        onSecondaryContainer = PaletteTokens.Secondary30,
+        onTertiaryContainer = PaletteTokens.Secondary30,
+    )
 
 /**
  * Helper function for component color tokens. Here is an example on how to use component color
- * tokens:
- * ``MaterialTheme.colorScheme.fromToken(ExtendedFabBranded.BrandedContainerColor)``
+ * tokens: ``MaterialTheme.colorScheme.fromToken(ExtendedFabBranded.BrandedContainerColor)``
  */
 @Stable
 internal fun ColorScheme.fromToken(value: ColorSchemeKeyTokens): Color {
@@ -983,9 +983,8 @@
 /**
  * CompositionLocal used to pass [ColorScheme] down the tree.
  *
- * Setting the value here is typically done as part of [MaterialTheme].
- * To retrieve the current value of this CompositionLocal, use
- * [MaterialTheme.colorScheme].
+ * Setting the value here is typically done as part of [MaterialTheme]. To retrieve the current
+ * value of this CompositionLocal, use [MaterialTheme.colorScheme].
  */
 internal val LocalColorScheme = staticCompositionLocalOf { lightColorScheme() }
 
@@ -1004,10 +1003,8 @@
 internal const val DisabledAlpha = 0.38f
 
 /**
- * Converts a color token key to the local color scheme provided by the theme
- * The color is subscribed to [LocalColorScheme] changes.
+ * Converts a color token key to the local color scheme provided by the theme The color is
+ * subscribed to [LocalColorScheme] changes.
  */
 internal val ColorSchemeKeyTokens.value: Color
-    @ReadOnlyComposable
-    @Composable
-    get() = MaterialTheme.colorScheme.fromToken(this)
+    @ReadOnlyComposable @Composable get() = MaterialTheme.colorScheme.fromToken(this)
diff --git a/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/DateInput.kt b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/DateInput.kt
index ae523eb..d915eb2 100644
--- a/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/DateInput.kt
+++ b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/DateInput.kt
@@ -61,44 +61,44 @@
 ) {
     // Obtain the DateInputFormat for the default Locale.
     val defaultLocale = defaultLocale()
-    val dateInputFormat = remember(defaultLocale) {
-        calendarModel.getDateInputFormat(defaultLocale)
-    }
+    val dateInputFormat =
+        remember(defaultLocale) { calendarModel.getDateInputFormat(defaultLocale) }
     val errorDatePattern = getString(Strings.DateInputInvalidForPattern)
     val errorDateOutOfYearRange = getString(Strings.DateInputInvalidYearRange)
     val errorInvalidNotAllowed = getString(Strings.DateInputInvalidNotAllowed)
-    val dateInputValidator = remember(dateInputFormat, dateFormatter) {
-        DateInputValidator(
-            yearRange = yearRange,
-            selectableDates = selectableDates,
-            dateInputFormat = dateInputFormat,
-            dateFormatter = dateFormatter,
-            errorDatePattern = errorDatePattern,
-            errorDateOutOfYearRange = errorDateOutOfYearRange,
-            errorInvalidNotAllowed = errorInvalidNotAllowed,
-            errorInvalidRangeInput = "" // Not used for a single date input
-        )
-    }
+    val dateInputValidator =
+        remember(dateInputFormat, dateFormatter) {
+            DateInputValidator(
+                yearRange = yearRange,
+                selectableDates = selectableDates,
+                dateInputFormat = dateInputFormat,
+                dateFormatter = dateFormatter,
+                errorDatePattern = errorDatePattern,
+                errorDateOutOfYearRange = errorDateOutOfYearRange,
+                errorInvalidNotAllowed = errorInvalidNotAllowed,
+                errorInvalidRangeInput = "" // Not used for a single date input
+            )
+        }
     val pattern = dateInputFormat.patternWithDelimiters.uppercase()
     val labelText = getString(string = Strings.DateInputLabel)
     DateInputTextField(
-        modifier = Modifier
-            .fillMaxWidth()
-            .padding(InputTextFieldPadding),
+        modifier = Modifier.fillMaxWidth().padding(InputTextFieldPadding),
         calendarModel = calendarModel,
         label = {
             Text(
                 labelText,
-                modifier = Modifier.semantics { contentDescription = "$labelText, $pattern" })
+                modifier = Modifier.semantics { contentDescription = "$labelText, $pattern" }
+            )
         },
-        placeholder = { Text(pattern, modifier = Modifier.clearAndSetSemantics { }) },
+        placeholder = { Text(pattern, modifier = Modifier.clearAndSetSemantics {}) },
         initialDateMillis = selectedDateMillis,
         onDateSelectionChange = onDateSelectionChange,
         inputIdentifier = InputIdentifier.SingleDateInput,
-        dateInputValidator = dateInputValidator.apply {
-            // Only need to apply the start date, as this is for a single date input.
-            currentStartDateMillis = selectedDateMillis
-        },
+        dateInputValidator =
+            dateInputValidator.apply {
+                // Only need to apply the start date, as this is for a single date input.
+                currentStartDateMillis = selectedDateMillis
+            },
         dateInputFormat = dateInputFormat,
         locale = defaultLocale,
         colors = colors
@@ -121,44 +121,47 @@
     colors: DatePickerColors
 ) {
     val errorText = rememberSaveable { mutableStateOf("") }
-    var text by rememberSaveable(stateSaver = TextFieldValue.Saver) {
-        mutableStateOf(
-            TextFieldValue(
-                text = initialDateMillis?.let {
-                    calendarModel.formatWithPattern(
-                        it,
-                        dateInputFormat.patternWithoutDelimiters,
-                        locale
-                    )
-                } ?: "",
-                TextRange(0, 0)
+    var text by
+        rememberSaveable(stateSaver = TextFieldValue.Saver) {
+            mutableStateOf(
+                TextFieldValue(
+                    text =
+                        initialDateMillis?.let {
+                            calendarModel.formatWithPattern(
+                                it,
+                                dateInputFormat.patternWithoutDelimiters,
+                                locale
+                            )
+                        } ?: "",
+                    TextRange(0, 0)
+                )
             )
-        )
-    }
+        }
 
     OutlinedTextField(
         value = text,
         onValueChange = { input ->
-            if (input.text.length <= dateInputFormat.patternWithoutDelimiters.length &&
-                input.text.all { it.isDigit() }
+            if (
+                input.text.length <= dateInputFormat.patternWithoutDelimiters.length &&
+                    input.text.all { it.isDigit() }
             ) {
                 text = input
                 val trimmedText = input.text.trim()
-                if (trimmedText.isEmpty() ||
-                    trimmedText.length < dateInputFormat.patternWithoutDelimiters.length
+                if (
+                    trimmedText.isEmpty() ||
+                        trimmedText.length < dateInputFormat.patternWithoutDelimiters.length
                 ) {
                     errorText.value = ""
                     onDateSelectionChange(null)
                 } else {
-                    val parsedDate = calendarModel.parse(
-                        trimmedText,
-                        dateInputFormat.patternWithoutDelimiters
-                    )
-                    errorText.value = dateInputValidator.validate(
-                        dateToValidate = parsedDate,
-                        inputIdentifier = inputIdentifier,
-                        locale = locale
-                    )
+                    val parsedDate =
+                        calendarModel.parse(trimmedText, dateInputFormat.patternWithoutDelimiters)
+                    errorText.value =
+                        dateInputValidator.validate(
+                            dateToValidate = parsedDate,
+                            inputIdentifier = inputIdentifier,
+                            locale = locale
+                        )
                     // Set the parsed date only if the error validation returned an empty string.
                     // Otherwise, set it to null, as the validation failed.
                     onDateSelectionChange(
@@ -171,29 +174,30 @@
                 }
             }
         },
-        modifier = modifier
-            // Add bottom padding when there is no error. Otherwise, remove it as the error text
-            // will take additional height.
-            .padding(
-                bottom = if (errorText.value.isNotBlank()) {
-                    0.dp
-                } else {
-                    InputTextNonErroneousBottomPadding
-                }
-            )
-            .semantics {
-                if (errorText.value.isNotBlank()) error(errorText.value)
-            },
+        modifier =
+            modifier
+                // Add bottom padding when there is no error. Otherwise, remove it as the error text
+                // will take additional height.
+                .padding(
+                    bottom =
+                        if (errorText.value.isNotBlank()) {
+                            0.dp
+                        } else {
+                            InputTextNonErroneousBottomPadding
+                        }
+                )
+                .semantics { if (errorText.value.isNotBlank()) error(errorText.value) },
         label = label,
         placeholder = placeholder,
         supportingText = { if (errorText.value.isNotBlank()) Text(errorText.value) },
         isError = errorText.value.isNotBlank(),
         visualTransformation = DateVisualTransformation(dateInputFormat),
-        keyboardOptions = KeyboardOptions(
-            autoCorrectEnabled = false,
-            keyboardType = KeyboardType.Number,
-            imeAction = ImeAction.Done
-        ),
+        keyboardOptions =
+            KeyboardOptions(
+                autoCorrectEnabled = false,
+                keyboardType = KeyboardType.Number,
+                imeAction = ImeAction.Done
+            ),
         singleLine = true,
         colors = colors.dateTextFieldColors
     )
@@ -207,21 +211,21 @@
  * @param dateInputFormat a [DateInputFormat] that holds date patterns information
  * @param dateFormatter a [DatePickerFormatter]
  * @param errorDatePattern a string for displaying an error message when an input does not match the
- * expected date pattern. The string expects a date pattern string as an argument to be formatted
- * into it.
+ *   expected date pattern. The string expects a date pattern string as an argument to be formatted
+ *   into it.
  * @param errorDateOutOfYearRange a string for displaying an error message when an input date
- * exceeds the year-range defined at the DateInput's state. The string expects a start and end year
- * as arguments to be formatted into it.
+ *   exceeds the year-range defined at the DateInput's state. The string expects a start and end
+ *   year as arguments to be formatted into it.
  * @param errorInvalidNotAllowed a string for displaying an error message when an input date does
- * not pass the DateInput's validator check. The string expects a date argument to be formatted into
- * it.
+ *   not pass the DateInput's validator check. The string expects a date argument to be formatted
+ *   into it.
  * @param errorInvalidRangeInput a string for displaying an error message when in a range input mode
- * and one of the input dates is out of order (i.e. the user inputs a start date that is after the
- * end date, or an end date that is before the start date)
+ *   and one of the input dates is out of order (i.e. the user inputs a start date that is after the
+ *   end date, or an end date that is before the start date)
  * @param currentStartDateMillis the currently selected start date in milliseconds. Only checked
- * against when the [InputIdentifier] is [InputIdentifier.EndDateInput].
- * @param currentEndDateMillis the currently selected end date in milliseconds. Only checked
- * against when the [InputIdentifier] is [InputIdentifier.StartDateInput].
+ *   against when the [InputIdentifier] is [InputIdentifier.EndDateInput].
+ * @param currentEndDateMillis the currently selected end date in milliseconds. Only checked against
+ *   when the [InputIdentifier] is [InputIdentifier.StartDateInput].
  */
 @OptIn(ExperimentalMaterial3Api::class)
 @Stable
@@ -244,7 +248,7 @@
      *
      * @param dateToValidate a [CalendarDate] input to validate
      * @param inputIdentifier an [InputIdentifier] that provides information about the input field
-     * that is supposed to hold the date.
+     *   that is supposed to hold the date.
      * @param locale the current [CalendarLocale]
      */
     fun validate(
@@ -264,8 +268,9 @@
         }
         // Check that the provided SelectableDates allows this date to be selected.
         with(selectableDates) {
-            if (!isSelectableYear(dateToValidate.year) ||
-                !isSelectableDate(dateToValidate.utcTimeMillis)
+            if (
+                !isSelectableYear(dateToValidate.year) ||
+                    !isSelectableDate(dateToValidate.utcTimeMillis)
             ) {
                 return errorInvalidNotAllowed.format(
                     dateFormatter.formatDate(
@@ -277,10 +282,11 @@
         }
 
         // Additional validation when the InputIdentifier is for start of end dates in a range input
-        if ((inputIdentifier == InputIdentifier.StartDateInput &&
+        if (
+            (inputIdentifier == InputIdentifier.StartDateInput &&
                 dateToValidate.utcTimeMillis >= (currentEndDateMillis ?: Long.MAX_VALUE)) ||
-            (inputIdentifier == InputIdentifier.EndDateInput &&
-                dateToValidate.utcTimeMillis < (currentStartDateMillis ?: Long.MIN_VALUE))
+                (inputIdentifier == InputIdentifier.EndDateInput &&
+                    dateToValidate.utcTimeMillis < (currentStartDateMillis ?: Long.MIN_VALUE))
         ) {
             // The input start date is after the end date, or the end date is before the start date.
             return errorInvalidRangeInput
@@ -309,12 +315,13 @@
         val EndDateInput = InputIdentifier(2)
     }
 
-    override fun toString() = when (this) {
-        SingleDateInput -> "SingleDateInput"
-        StartDateInput -> "StartDateInput"
-        EndDateInput -> "EndDateInput"
-        else -> "Unknown"
-    }
+    override fun toString() =
+        when (this) {
+            SingleDateInput -> "SingleDateInput"
+            StartDateInput -> "StartDateInput"
+            EndDateInput -> "EndDateInput"
+            else -> "Unknown"
+        }
 }
 
 /**
@@ -331,27 +338,28 @@
         dateInputFormat.patternWithDelimiters.lastIndexOf(dateInputFormat.delimiter)
     private val dateFormatLength: Int = dateInputFormat.patternWithoutDelimiters.length
 
-    private val dateOffsetTranslator = object : OffsetMapping {
+    private val dateOffsetTranslator =
+        object : OffsetMapping {
 
-        override fun originalToTransformed(offset: Int): Int {
-            return when {
-                offset < firstDelimiterOffset -> offset
-                offset < secondDelimiterOffset -> offset + 1
-                offset <= dateFormatLength -> offset + 2
-                else -> dateFormatLength + 2 // 10
+            override fun originalToTransformed(offset: Int): Int {
+                return when {
+                    offset < firstDelimiterOffset -> offset
+                    offset < secondDelimiterOffset -> offset + 1
+                    offset <= dateFormatLength -> offset + 2
+                    else -> dateFormatLength + 2 // 10
+                }
+            }
+
+            override fun transformedToOriginal(offset: Int): Int {
+                return when {
+                    offset <= firstDelimiterOffset - 1 -> offset
+                    offset <= secondDelimiterOffset - 1 -> offset - 1
+                    offset <= dateFormatLength + 1 -> offset - 2
+                    else -> dateFormatLength // 8
+                }
             }
         }
 
-        override fun transformedToOriginal(offset: Int): Int {
-            return when {
-                offset <= firstDelimiterOffset - 1 -> offset
-                offset <= secondDelimiterOffset - 1 -> offset - 1
-                offset <= dateFormatLength + 1 -> offset - 2
-                else -> dateFormatLength // 8
-            }
-        }
-    }
-
     override fun filter(text: AnnotatedString): TransformedText {
         val trimmedText =
             if (text.text.length > dateFormatLength) {
@@ -370,11 +378,7 @@
     }
 }
 
-internal val InputTextFieldPadding = PaddingValues(
-    start = 24.dp,
-    end = 24.dp,
-    top = 10.dp
-)
+internal val InputTextFieldPadding = PaddingValues(start = 24.dp, end = 24.dp, top = 10.dp)
 
 // An optional padding that will only be added to the bottom of the date input text field when it's
 // not showing an error message.
diff --git a/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/DatePicker.kt b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/DatePicker.kt
index 8b569bd..a86add6 100644
--- a/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/DatePicker.kt
+++ b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/DatePicker.kt
@@ -129,24 +129,29 @@
 import kotlinx.coroutines.launch
 
 /**
- * <a href="https://m3.material.io/components/date-pickers/overview" class="external" target="_blank">Material Design date picker</a>.
+ * <a href="https://m3.material.io/components/date-pickers/overview" class="external"
+ * target="_blank">Material Design date picker</a>.
  *
- * Date pickers let people select a date and preferably should be embedded into Dialogs.
- * See [DatePickerDialog].
+ * Date pickers let people select a date and preferably should be embedded into Dialogs. See
+ * [DatePickerDialog].
  *
  * By default, a date picker lets you pick a date via a calendar UI. However, it also allows
  * switching into a date input mode for a manual entry of dates using the numbers on a keyboard.
  *
- * ![Date picker image](https://developer.android.com/images/reference/androidx/compose/material3/date-picker.png)
+ * ![Date picker
+ * image](https://developer.android.com/images/reference/androidx/compose/material3/date-picker.png)
  *
  * A simple DatePicker looks like:
+ *
  * @sample androidx.compose.material3.samples.DatePickerSample
  *
  * A DatePicker with an initial UI of a date input mode looks like:
+ *
  * @sample androidx.compose.material3.samples.DateInputSample
  *
  * A DatePicker with a provided [SelectableDates] that blocks certain days from being selected looks
  * like:
+ *
  * @sample androidx.compose.material3.samples.DatePickerWithDateSelectableDatesSample
  *
  * @param state state of the date picker. See [rememberDatePickerState].
@@ -155,9 +160,9 @@
  * @param title the title to be displayed in the date picker
  * @param headline the headline to be displayed in the date picker
  * @param showModeToggle indicates if this DatePicker should show a mode toggle action that
- * transforms it into a date input
+ *   transforms it into a date input
  * @param colors [DatePickerColors] that will be used to resolve the colors used for this date
- * picker in different states. See [DatePickerDefaults.colors].
+ *   picker in different states. See [DatePickerDefaults.colors].
  */
 @ExperimentalMaterial3Api
 @Composable
@@ -188,17 +193,18 @@
         modifier = modifier,
         title = title,
         headline = headline,
-        modeToggleButton = if (showModeToggle) {
-            {
-                DisplayModeToggleButton(
-                    modifier = Modifier.padding(DatePickerModeTogglePadding),
-                    displayMode = state.displayMode,
-                    onDisplayModeChange = { displayMode -> state.displayMode = displayMode },
-                )
-            }
-        } else {
-            null
-        },
+        modeToggleButton =
+            if (showModeToggle) {
+                {
+                    DisplayModeToggleButton(
+                        modifier = Modifier.padding(DatePickerModeTogglePadding),
+                        displayMode = state.displayMode,
+                        onDisplayModeChange = { displayMode -> state.displayMode = displayMode },
+                    )
+                }
+            } else {
+                null
+            },
         headlineTextStyle = DatePickerModalTokens.HeaderHeadlineFont.value,
         headerMinHeight = DatePickerModalTokens.HeaderContainerHeight,
         colors = colors,
@@ -229,32 +235,27 @@
 interface DatePickerState {
 
     /**
-     * A timestamp that represents the selected date _start_ of the day in _UTC_ milliseconds
-     * from the epoch.
+     * A timestamp that represents the selected date _start_ of the day in _UTC_ milliseconds from
+     * the epoch.
      *
      * @throws IllegalArgumentException in case the value is set with a timestamp that does not fall
-     * within the [yearRange].
+     *   within the [yearRange].
      */
-    @get:Suppress("AutoBoxing")
-    var selectedDateMillis: Long?
+    @get:Suppress("AutoBoxing") var selectedDateMillis: Long?
 
     /**
      * A timestamp that represents the currently displayed month _start_ date in _UTC_ milliseconds
      * from the epoch.
      *
      * @throws IllegalArgumentException in case the value is set with a timestamp that does not fall
-     * within the [yearRange].
+     *   within the [yearRange].
      */
     var displayedMonthMillis: Long
 
-    /**
-     * A [DisplayMode] that represents the current UI mode (i.e. picker or input).
-     */
+    /** A [DisplayMode] that represents the current UI mode (i.e. picker or input). */
     var displayMode: DisplayMode
 
-    /**
-     * An [IntRange] that holds the year range that the date picker will be limited to.
-     */
+    /** An [IntRange] that holds the year range that the date picker will be limited to. */
     val yearRange: IntRange
 
     /**
@@ -265,9 +266,7 @@
     val selectableDates: SelectableDates
 }
 
-/**
- * An interface that controls the selectable dates and years in the date pickers UI.
- */
+/** An interface that controls the selectable dates and years in the date pickers UI. */
 @ExperimentalMaterial3Api
 @Stable
 interface SelectableDates {
@@ -285,9 +284,7 @@
     fun isSelectableYear(year: Int) = true
 }
 
-/**
- * A date formatter interface used by [DatePicker].
- */
+/** A date formatter interface used by [DatePicker]. */
 @ExperimentalMaterial3Api
 interface DatePickerFormatter {
 
@@ -297,13 +294,9 @@
      *
      * @param monthMillis timestamp in _UTC_ milliseconds from the epoch that represents the month
      * @param locale a [CalendarLocale] to use when formatting the month and year
-     *
      * @see defaultLocale
      */
-    fun formatMonthYear(
-        @Suppress("AutoBoxing") monthMillis: Long?,
-        locale: CalendarLocale
-    ): String?
+    fun formatMonthYear(@Suppress("AutoBoxing") monthMillis: Long?, locale: CalendarLocale): String?
 
     /**
      * Format a given [dateMillis] to a string representation of the date (i.e. Mar 27, 2021).
@@ -311,9 +304,8 @@
      * @param dateMillis timestamp in _UTC_ milliseconds from the epoch that represents the date
      * @param locale a [CalendarLocale] to use when formatting the date
      * @param forContentDescription indicates that the requested formatting is for content
-     * description. In these cases, the output may include a more descriptive wording that will be
-     * passed to a screen readers.
-     *
+     *   description. In these cases, the output may include a more descriptive wording that will be
+     *   passed to a screen readers.
      * @see defaultLocale
      */
     fun formatDate(
@@ -323,9 +315,7 @@
     ): String?
 }
 
-/**
- * Represents the different modes that a date picker can be at.
- */
+/** Represents the different modes that a date picker can be at. */
 @Immutable
 @JvmInline
 @ExperimentalMaterial3Api
@@ -339,11 +329,12 @@
         val Input = DisplayMode(1)
     }
 
-    override fun toString() = when (this) {
-        Picker -> "Picker"
-        Input -> "Input"
-        else -> "Unknown"
-    }
+    override fun toString() =
+        when (this) {
+            Picker -> "Picker"
+            Input -> "Input"
+            else -> "Unknown"
+        }
 }
 
 /**
@@ -352,16 +343,16 @@
  * To create a date picker state outside composition, see the `DatePickerState` function.
  *
  * @param initialSelectedDateMillis timestamp in _UTC_ milliseconds from the epoch that represents
- * an initial selection of a date. Provide a `null` to indicate no selection.
+ *   an initial selection of a date. Provide a `null` to indicate no selection.
  * @param initialDisplayedMonthMillis timestamp in _UTC_ milliseconds from the epoch that represents
- * an initial selection of a month to be displayed to the user. By default, in case an
- * `initialSelectedDateMillis` is provided, the initial displayed month would be the month of the
- * selected date. Otherwise, in case `null` is provided, the displayed month would be the
- * current one.
+ *   an initial selection of a month to be displayed to the user. By default, in case an
+ *   `initialSelectedDateMillis` is provided, the initial displayed month would be the month of the
+ *   selected date. Otherwise, in case `null` is provided, the displayed month would be the current
+ *   one.
  * @param yearRange an [IntRange] that holds the year range that the date picker will be limited to
  * @param initialDisplayMode an initial [DisplayMode] that this state will hold
  * @param selectableDates a [SelectableDates] that is consulted to check if a date is allowed. In
- * case a date is not allowed to be selected, it will appear disabled in the UI.
+ *   case a date is not allowed to be selected, it will appear disabled in the UI.
  */
 @Composable
 @ExperimentalMaterial3Api
@@ -373,9 +364,7 @@
     selectableDates: SelectableDates = DatePickerDefaults.AllDates
 ): DatePickerState {
     val locale = defaultLocale()
-    return rememberSaveable(
-        saver = DatePickerStateImpl.Saver(selectableDates, locale)
-    ) {
+    return rememberSaveable(saver = DatePickerStateImpl.Saver(selectableDates, locale)) {
         DatePickerStateImpl(
             initialSelectedDateMillis = initialSelectedDateMillis,
             initialDisplayedMonthMillis = initialDisplayedMonthMillis,
@@ -394,23 +383,21 @@
  * composition.
  *
  * @param locale a [CalendarLocale] to be used when formatting dates, determining the input format,
- * and more
- * @param initialSelectedDateMillis timestamp in _UTC_ milliseconds from the epoch that
- * represents an initial selection of a date. Provide a `null` to indicate no selection. Note
- * that the state's
- * [DatePickerState.selectedDateMillis] will provide a timestamp that represents the _start_ of the
- * day, which may be different than the provided initialSelectedDateMillis.
- * @param initialDisplayedMonthMillis timestamp in _UTC_ milliseconds from the epoch that
- * represents an initial selection of a month to be displayed to the user. In case `null` is
- * provided, the displayed month would be the current one.
- * @param yearRange an [IntRange] that holds the year range that the date picker will be limited
- * to
+ *   and more
+ * @param initialSelectedDateMillis timestamp in _UTC_ milliseconds from the epoch that represents
+ *   an initial selection of a date. Provide a `null` to indicate no selection. Note that the
+ *   state's [DatePickerState.selectedDateMillis] will provide a timestamp that represents the
+ *   _start_ of the day, which may be different than the provided initialSelectedDateMillis.
+ * @param initialDisplayedMonthMillis timestamp in _UTC_ milliseconds from the epoch that represents
+ *   an initial selection of a month to be displayed to the user. In case `null` is provided, the
+ *   displayed month would be the current one.
+ * @param yearRange an [IntRange] that holds the year range that the date picker will be limited to
  * @param initialDisplayMode an initial [DisplayMode] that this state will hold
- * @param selectableDates a [SelectableDates] that is consulted to check if a date is allowed.
- * In case a date is not allowed to be selected, it will appear disabled in the UI.
+ * @param selectableDates a [SelectableDates] that is consulted to check if a date is allowed. In
+ *   case a date is not allowed to be selected, it will appear disabled in the UI.
+ * @throws [IllegalArgumentException] if the initial selected date or displayed month represent a
+ *   year that is out of the year range.
  * @see rememberDatePickerState
- * @throws [IllegalArgumentException] if the initial selected date or displayed month represent
- * a year that is out of the year range.
  */
 @ExperimentalMaterial3Api
 fun DatePickerState(
@@ -420,18 +407,17 @@
     yearRange: IntRange = DatePickerDefaults.YearRange,
     initialDisplayMode: DisplayMode = DisplayMode.Picker,
     selectableDates: SelectableDates = DatePickerDefaults.AllDates
-): DatePickerState = DatePickerStateImpl(
-    initialSelectedDateMillis = initialSelectedDateMillis,
-    initialDisplayedMonthMillis = initialDisplayedMonthMillis,
-    yearRange = yearRange,
-    initialDisplayMode = initialDisplayMode,
-    selectableDates = selectableDates,
-    locale = locale
-)
+): DatePickerState =
+    DatePickerStateImpl(
+        initialSelectedDateMillis = initialSelectedDateMillis,
+        initialDisplayedMonthMillis = initialDisplayedMonthMillis,
+        yearRange = yearRange,
+        initialDisplayMode = initialDisplayMode,
+        selectableDates = selectableDates,
+        locale = locale
+    )
 
-/**
- * Contains default values used by the [DatePicker].
- */
+/** Contains default values used by the [DatePicker]. */
 @ExperimentalMaterial3Api
 @Stable
 object DatePickerDefaults {
@@ -440,8 +426,7 @@
      * Creates a [DatePickerColors] that will potentially animate between the provided colors
      * according to the Material specification.
      */
-    @Composable
-    fun colors() = MaterialTheme.colorScheme.defaultDatePickerColors
+    @Composable fun colors() = MaterialTheme.colorScheme.defaultDatePickerColors
 
     /**
      * Creates a [DatePickerColors] that will potentially animate between the provided colors
@@ -452,19 +437,19 @@
      * @param headlineContentColor the color used for the date picker's headline
      * @param weekdayContentColor the color used for the weekday letters
      * @param subheadContentColor the color used for the month and year subhead labels that appear
-     * when months are displayed at a `DateRangePicker`.
+     *   when months are displayed at a `DateRangePicker`.
      * @param navigationContentColor the content color used for the year selection menu button and
-     * the months arrow navigation when displayed at a `DatePicker`.
+     *   the months arrow navigation when displayed at a `DatePicker`.
      * @param yearContentColor the color used for a year item content
      * @param disabledYearContentColor the color used for a disabled year item content
      * @param currentYearContentColor the color used for the current year content when selecting a
-     * year
+     *   year
      * @param selectedYearContentColor the color used for a selected year item content
      * @param disabledSelectedYearContentColor the color used for a disabled selected year item
-     * content
+     *   content
      * @param selectedYearContainerColor the color used for a selected year item container
      * @param disabledSelectedYearContainerColor the color used for a disabled selected year item
-     * container
+     *   container
      * @param dayContentColor the color used for days content
      * @param disabledDayContentColor the color used for disabled days content
      * @param selectedDayContentColor the color used for selected days content
@@ -473,14 +458,14 @@
      * @param disabledSelectedDayContainerColor the color used for a disabled selected day container
      * @param todayContentColor the color used for the day that marks the current date
      * @param todayDateBorderColor the color used for the border of the day that marks the current
-     * date
+     *   date
      * @param dayInSelectionRangeContentColor the content color used for days that are within a date
-     * range selection
+     *   range selection
      * @param dayInSelectionRangeContainerColor the container color used for days that are within a
-     * date range selection
+     *   date range selection
      * @param dividerColor the color used for the dividers used at the date pickers
      * @param dateTextFieldColors the [TextFieldColors] defaults for the date text field when in
-     * [DisplayMode.Input]. See [OutlinedTextFieldDefaults.colors].
+     *   [DisplayMode.Input]. See [OutlinedTextFieldDefaults.colors].
      */
     @Composable
     fun colors(
@@ -541,86 +526,95 @@
     internal val ColorScheme.defaultDatePickerColors: DatePickerColors
         @Composable
         get() {
-            return defaultDatePickerColorsCached ?: DatePickerColors(
-                containerColor = fromToken(DatePickerModalTokens.ContainerColor),
-                titleContentColor = fromToken(DatePickerModalTokens.HeaderSupportingTextColor),
-                headlineContentColor = fromToken(DatePickerModalTokens.HeaderHeadlineColor),
-                weekdayContentColor = fromToken(DatePickerModalTokens.WeekdaysLabelTextColor),
-                subheadContentColor =
-                fromToken(DatePickerModalTokens.RangeSelectionMonthSubheadColor),
-                // TODO(b/234060211): Apply this from the MenuButton tokens or defaults.
-                navigationContentColor = onSurfaceVariant,
-                yearContentColor =
-                fromToken(DatePickerModalTokens.SelectionYearUnselectedLabelTextColor),
-                // TODO: Using DisabledAlpha as there are no token values for the disabled states.
-                disabledYearContentColor =
-                fromToken(DatePickerModalTokens.SelectionYearUnselectedLabelTextColor)
-                    .copy(alpha = DisabledAlpha),
-                currentYearContentColor = fromToken(DatePickerModalTokens.DateTodayLabelTextColor),
-                selectedYearContentColor =
-                fromToken(DatePickerModalTokens.SelectionYearSelectedLabelTextColor),
-                disabledSelectedYearContentColor =
-                fromToken(DatePickerModalTokens.SelectionYearSelectedLabelTextColor)
-                    .copy(alpha = DisabledAlpha),
-                selectedYearContainerColor =
-                fromToken(DatePickerModalTokens.SelectionYearSelectedContainerColor),
-                disabledSelectedYearContainerColor =
-                fromToken(DatePickerModalTokens.SelectionYearSelectedContainerColor)
-                    .copy(alpha = DisabledAlpha),
-                dayContentColor = fromToken(DatePickerModalTokens.DateUnselectedLabelTextColor),
-                disabledDayContentColor =
-                fromToken(DatePickerModalTokens.DateUnselectedLabelTextColor)
-                    .copy(alpha = DisabledAlpha),
-                selectedDayContentColor =
-                fromToken(DatePickerModalTokens.DateSelectedLabelTextColor),
-                disabledSelectedDayContentColor =
-                fromToken(DatePickerModalTokens.DateSelectedLabelTextColor)
-                    .copy(alpha = DisabledAlpha),
-                selectedDayContainerColor =
-                fromToken(DatePickerModalTokens.DateSelectedContainerColor),
-                disabledSelectedDayContainerColor =
-                fromToken(DatePickerModalTokens.DateSelectedContainerColor)
-                    .copy(alpha = DisabledAlpha),
-                todayContentColor = fromToken(DatePickerModalTokens.DateTodayLabelTextColor),
-                todayDateBorderColor =
-                fromToken(DatePickerModalTokens.DateTodayContainerOutlineColor),
-                dayInSelectionRangeContentColor =
-                fromToken(DatePickerModalTokens.SelectionDateInRangeLabelTextColor),
-                dayInSelectionRangeContainerColor =
-                fromToken(DatePickerModalTokens.RangeSelectionActiveIndicatorContainerColor),
-                dividerColor = fromToken(DividerTokens.Color),
-                dateTextFieldColors = defaultOutlinedTextFieldColors
-            ).also {
-                defaultDatePickerColorsCached = it
-            }
+            return defaultDatePickerColorsCached
+                ?: DatePickerColors(
+                        containerColor = fromToken(DatePickerModalTokens.ContainerColor),
+                        titleContentColor =
+                            fromToken(DatePickerModalTokens.HeaderSupportingTextColor),
+                        headlineContentColor = fromToken(DatePickerModalTokens.HeaderHeadlineColor),
+                        weekdayContentColor =
+                            fromToken(DatePickerModalTokens.WeekdaysLabelTextColor),
+                        subheadContentColor =
+                            fromToken(DatePickerModalTokens.RangeSelectionMonthSubheadColor),
+                        // TODO(b/234060211): Apply this from the MenuButton tokens or defaults.
+                        navigationContentColor = onSurfaceVariant,
+                        yearContentColor =
+                            fromToken(DatePickerModalTokens.SelectionYearUnselectedLabelTextColor),
+                        // TODO: Using DisabledAlpha as there are no token values for the disabled
+                        // states.
+                        disabledYearContentColor =
+                            fromToken(DatePickerModalTokens.SelectionYearUnselectedLabelTextColor)
+                                .copy(alpha = DisabledAlpha),
+                        currentYearContentColor =
+                            fromToken(DatePickerModalTokens.DateTodayLabelTextColor),
+                        selectedYearContentColor =
+                            fromToken(DatePickerModalTokens.SelectionYearSelectedLabelTextColor),
+                        disabledSelectedYearContentColor =
+                            fromToken(DatePickerModalTokens.SelectionYearSelectedLabelTextColor)
+                                .copy(alpha = DisabledAlpha),
+                        selectedYearContainerColor =
+                            fromToken(DatePickerModalTokens.SelectionYearSelectedContainerColor),
+                        disabledSelectedYearContainerColor =
+                            fromToken(DatePickerModalTokens.SelectionYearSelectedContainerColor)
+                                .copy(alpha = DisabledAlpha),
+                        dayContentColor =
+                            fromToken(DatePickerModalTokens.DateUnselectedLabelTextColor),
+                        disabledDayContentColor =
+                            fromToken(DatePickerModalTokens.DateUnselectedLabelTextColor)
+                                .copy(alpha = DisabledAlpha),
+                        selectedDayContentColor =
+                            fromToken(DatePickerModalTokens.DateSelectedLabelTextColor),
+                        disabledSelectedDayContentColor =
+                            fromToken(DatePickerModalTokens.DateSelectedLabelTextColor)
+                                .copy(alpha = DisabledAlpha),
+                        selectedDayContainerColor =
+                            fromToken(DatePickerModalTokens.DateSelectedContainerColor),
+                        disabledSelectedDayContainerColor =
+                            fromToken(DatePickerModalTokens.DateSelectedContainerColor)
+                                .copy(alpha = DisabledAlpha),
+                        todayContentColor =
+                            fromToken(DatePickerModalTokens.DateTodayLabelTextColor),
+                        todayDateBorderColor =
+                            fromToken(DatePickerModalTokens.DateTodayContainerOutlineColor),
+                        dayInSelectionRangeContentColor =
+                            fromToken(DatePickerModalTokens.SelectionDateInRangeLabelTextColor),
+                        dayInSelectionRangeContainerColor =
+                            fromToken(
+                                DatePickerModalTokens.RangeSelectionActiveIndicatorContainerColor
+                            ),
+                        dividerColor = fromToken(DividerTokens.Color),
+                        dateTextFieldColors = defaultOutlinedTextFieldColors
+                    )
+                    .also { defaultDatePickerColorsCached = it }
         }
 
     /**
      * Returns a [DatePickerFormatter].
      *
-     * The date formatter will apply the best possible localized form of the given skeleton and Locale.
-     * A skeleton is similar to, and uses the same format characters as, a Unicode
-     * <a href="http://www.unicode.org/reports/tr35/#Date_Format_Patterns">UTS #35</a> pattern.
+     * The date formatter will apply the best possible localized form of the given skeleton and
+     * Locale. A skeleton is similar to, and uses the same format characters as, a Unicode <a
+     * href="http://www.unicode.org/reports/tr35/#Date_Format_Patterns">UTS #35</a> pattern.
      *
      * One difference is that order is irrelevant. For example, "MMMMd" will return "MMMM d" in the
      * `en_US` locale, but "d. MMMM" in the `de_CH` locale.
      *
      * @param yearSelectionSkeleton a date format skeleton used to format the date picker's year
-     * selection menu button (e.g. "March 2021").
-     * @param selectedDateSkeleton a date format skeleton used to format a selected date (e.g.
-     * "Mar 27, 2021")
-     * @param selectedDateDescriptionSkeleton a date format skeleton used to format a selected date to
-     * be used as content description for screen readers (e.g. "Saturday, March 27, 2021")
+     *   selection menu button (e.g. "March 2021").
+     * @param selectedDateSkeleton a date format skeleton used to format a selected date (e.g. "Mar
+     *   27, 2021")
+     * @param selectedDateDescriptionSkeleton a date format skeleton used to format a selected date
+     *   to be used as content description for screen readers (e.g. "Saturday, March 27, 2021")
      */
     fun dateFormatter(
         yearSelectionSkeleton: String = YearMonthSkeleton,
         selectedDateSkeleton: String = YearAbbrMonthDaySkeleton,
         selectedDateDescriptionSkeleton: String = YearMonthWeekdayDaySkeleton
-    ): DatePickerFormatter = DatePickerFormatterImpl(
-        yearSelectionSkeleton = yearSelectionSkeleton,
-        selectedDateSkeleton = selectedDateSkeleton,
-        selectedDateDescriptionSkeleton = selectedDateDescriptionSkeleton
-    )
+    ): DatePickerFormatter =
+        DatePickerFormatterImpl(
+            yearSelectionSkeleton = yearSelectionSkeleton,
+            selectedDateSkeleton = selectedDateSkeleton,
+            selectedDateDescriptionSkeleton = selectedDateDescriptionSkeleton
+        )
 
     /**
      * A default date picker title composable.
@@ -631,15 +625,10 @@
     @Composable
     fun DatePickerTitle(displayMode: DisplayMode, modifier: Modifier = Modifier) {
         when (displayMode) {
-            DisplayMode.Picker -> Text(
-                text = getString(string = Strings.DatePickerTitle),
-                modifier = modifier
-            )
-
-            DisplayMode.Input -> Text(
-                text = getString(string = Strings.DateInputTitle),
-                modifier = modifier
-            )
+            DisplayMode.Picker ->
+                Text(text = getString(string = Strings.DatePickerTitle), modifier = modifier)
+            DisplayMode.Input ->
+                Text(text = getString(string = Strings.DateInputTitle), modifier = modifier)
         }
     }
 
@@ -648,7 +637,7 @@
      * no date selection, and an actual date string when there is.
      *
      * @param selectedDateMillis a timestamp that represents the selected date _start_ of the day in
-     * _UTC_ milliseconds from the epoch
+     *   _UTC_ milliseconds from the epoch
      * @param displayMode the current [DisplayMode]
      * @param dateFormatter a [DatePickerFormatter]
      * @param modifier a [Modifier] to be applied for the headline
@@ -661,38 +650,42 @@
         modifier: Modifier = Modifier
     ) {
         val defaultLocale = defaultLocale()
-        val formattedDate = dateFormatter.formatDate(
-            dateMillis = selectedDateMillis,
-            locale = defaultLocale
-        )
-        val verboseDateDescription = dateFormatter.formatDate(
-            dateMillis = selectedDateMillis,
-            locale = defaultLocale,
-            forContentDescription = true
-        ) ?: when (displayMode) {
-            DisplayMode.Picker -> getString(Strings.DatePickerNoSelectionDescription)
-            DisplayMode.Input -> getString(Strings.DateInputNoInputDescription)
-            else -> ""
-        }
+        val formattedDate =
+            dateFormatter.formatDate(dateMillis = selectedDateMillis, locale = defaultLocale)
+        val verboseDateDescription =
+            dateFormatter.formatDate(
+                dateMillis = selectedDateMillis,
+                locale = defaultLocale,
+                forContentDescription = true
+            )
+                ?: when (displayMode) {
+                    DisplayMode.Picker -> getString(Strings.DatePickerNoSelectionDescription)
+                    DisplayMode.Input -> getString(Strings.DateInputNoInputDescription)
+                    else -> ""
+                }
 
-        val headlineText = formattedDate ?: when (displayMode) {
-            DisplayMode.Picker -> getString(Strings.DatePickerHeadline)
-            DisplayMode.Input -> getString(Strings.DateInputHeadline)
-            else -> ""
-        }
+        val headlineText =
+            formattedDate
+                ?: when (displayMode) {
+                    DisplayMode.Picker -> getString(Strings.DatePickerHeadline)
+                    DisplayMode.Input -> getString(Strings.DateInputHeadline)
+                    else -> ""
+                }
 
-        val headlineDescription = when (displayMode) {
-            DisplayMode.Picker -> getString(Strings.DatePickerHeadlineDescription)
-            DisplayMode.Input -> getString(Strings.DateInputHeadlineDescription)
-            else -> ""
-        }.format(verboseDateDescription)
+        val headlineDescription =
+            when (displayMode) {
+                DisplayMode.Picker -> getString(Strings.DatePickerHeadlineDescription)
+                DisplayMode.Input -> getString(Strings.DateInputHeadlineDescription)
+                else -> ""
+            }.format(verboseDateDescription)
 
         Text(
             text = headlineText,
-            modifier = modifier.semantics {
-                liveRegion = LiveRegionMode.Polite
-                contentDescription = headlineDescription
-            },
+            modifier =
+                modifier.semantics {
+                    liveRegion = LiveRegionMode.Polite
+                    contentDescription = headlineDescription
+                },
             maxLines = 1
         )
     }
@@ -711,12 +704,13 @@
     ): FlingBehavior {
         return remember(decayAnimationSpec, lazyListState) {
             val original = SnapLayoutInfoProvider(lazyListState)
-            val snapLayoutInfoProvider = object : SnapLayoutInfoProvider by original {
-                override fun calculateApproachOffset(
-                    velocity: Float,
-                    decayOffset: Float
-                ): Float = 0.0f
-            }
+            val snapLayoutInfoProvider =
+                object : SnapLayoutInfoProvider by original {
+                    override fun calculateApproachOffset(
+                        velocity: Float,
+                        decayOffset: Float
+                    ): Float = 0.0f
+                }
 
             snapFlingBehavior(
                 snapLayoutInfoProvider = snapLayoutInfoProvider,
@@ -733,11 +727,10 @@
     val TonalElevation: Dp = ElevationTokens.Level0
 
     /** The default shape for date picker dialogs. */
-    val shape: Shape @Composable get() = DatePickerModalTokens.ContainerShape.value
+    val shape: Shape
+        @Composable get() = DatePickerModalTokens.ContainerShape.value
 
-    /**
-     * A default [SelectableDates] that allows all dates to be selected.
-     */
+    /** A default [SelectableDates] that allows all dates to be selected. */
     val AllDates: SelectableDates = object : SelectableDates {}
 
     /**
@@ -746,9 +739,7 @@
      */
     const val YearMonthSkeleton: String = "yMMMM"
 
-    /**
-     * A date format skeleton used to format a selected date (e.g. "Mar 27, 2021")
-     */
+    /** A date format skeleton used to format a selected date (e.g. "Mar 27, 2021") */
     const val YearAbbrMonthDaySkeleton: String = "yMMMd"
 
     /**
@@ -761,27 +752,22 @@
 /**
  * Represents the colors used by the date picker.
  *
- * @constructor create an instance with arbitrary colors, see [DatePickerDefaults.colors] for the
- * default implementation that follows Material specifications.
- *
  * @param containerColor the color used for the date picker's background
  * @param titleContentColor the color used for the date picker's title
  * @param headlineContentColor the color used for the date picker's headline
  * @param weekdayContentColor the color used for the weekday letters
- * @param subheadContentColor the color used for the month and year subhead labels that appear
- * when months are displayed at a `DateRangePicker`.
- * @param navigationContentColor the content color used for the year selection menu button and
- * the months arrow navigation when displayed at a `DatePicker`.
+ * @param subheadContentColor the color used for the month and year subhead labels that appear when
+ *   months are displayed at a `DateRangePicker`.
+ * @param navigationContentColor the content color used for the year selection menu button and the
+ *   months arrow navigation when displayed at a `DatePicker`.
  * @param yearContentColor the color used for a year item content
  * @param disabledYearContentColor the color used for a disabled year item content
- * @param currentYearContentColor the color used for the current year content when selecting a
- * year
+ * @param currentYearContentColor the color used for the current year content when selecting a year
  * @param selectedYearContentColor the color used for a selected year item content
- * @param disabledSelectedYearContentColor the color used for a disabled selected year item
- * content
+ * @param disabledSelectedYearContentColor the color used for a disabled selected year item content
  * @param selectedYearContainerColor the color used for a selected year item container
  * @param disabledSelectedYearContainerColor the color used for a disabled selected year item
- * container
+ *   container
  * @param dayContentColor the color used for days content
  * @param disabledDayContentColor the color used for disabled days content
  * @param selectedDayContentColor the color used for selected days content
@@ -789,19 +775,21 @@
  * @param selectedDayContainerColor the color used for a selected day container
  * @param disabledSelectedDayContainerColor the color used for a disabled selected day container
  * @param todayContentColor the color used for the day that marks the current date
- * @param todayDateBorderColor the color used for the border of the day that marks the current
- * date
+ * @param todayDateBorderColor the color used for the border of the day that marks the current date
  * @param dayInSelectionRangeContentColor the content color used for days that are within a date
- * range selection
- * @param dayInSelectionRangeContainerColor the container color used for days that are within a
- * date range selection
+ *   range selection
+ * @param dayInSelectionRangeContainerColor the container color used for days that are within a date
+ *   range selection
  * @param dividerColor the color used for the dividers used at the date pickers
  * @param dateTextFieldColors the [TextFieldColors] defaults for the date text field when in
- * [DisplayMode.Input]. See [OutlinedTextFieldDefaults.colors].
+ *   [DisplayMode.Input]. See [OutlinedTextFieldDefaults.colors].
+ * @constructor create an instance with arbitrary colors, see [DatePickerDefaults.colors] for the
+ *   default implementation that follows Material specifications.
  */
 @ExperimentalMaterial3Api
 @Immutable
-class DatePickerColors constructor(
+class DatePickerColors
+constructor(
     val containerColor: Color,
     val titleContentColor: Color,
     val headlineContentColor: Color,
@@ -829,9 +817,9 @@
     val dateTextFieldColors: TextFieldColors
 ) {
     /**
-     * Returns a copy of this DatePickerColors, optionally overriding some of the values.
-     * This uses the Color.Unspecified to mean “use the value from the source”
-     * // For `dateTextFieldColors` use null to mean "use the value from source"
+     * Returns a copy of this DatePickerColors, optionally overriding some of the values. This uses
+     * the Color.Unspecified to mean “use the value from the source” // For `dateTextFieldColors`
+     * use null to mean "use the value from source"
      */
     fun copy(
         containerColor: Color = this.containerColor,
@@ -859,33 +847,36 @@
         dayInSelectionRangeContentColor: Color = this.dayInSelectionRangeContentColor,
         dividerColor: Color = this.dividerColor,
         dateTextFieldColors: TextFieldColors? = this.dateTextFieldColors
-    ) = DatePickerColors(
-        containerColor.takeOrElse { this.containerColor },
-        titleContentColor.takeOrElse { this.titleContentColor },
-        headlineContentColor.takeOrElse { this.headlineContentColor },
-        weekdayContentColor.takeOrElse { this.weekdayContentColor },
-        subheadContentColor.takeOrElse { this.subheadContentColor },
-        navigationContentColor.takeOrElse { this.navigationContentColor },
-        yearContentColor.takeOrElse { this.yearContentColor },
-        disabledYearContentColor.takeOrElse { this.disabledYearContentColor },
-        currentYearContentColor.takeOrElse { this.currentYearContentColor },
-        selectedYearContentColor.takeOrElse { this.selectedYearContentColor },
-        disabledSelectedYearContentColor.takeOrElse { this.disabledSelectedYearContentColor },
-        selectedYearContainerColor.takeOrElse { this.selectedYearContainerColor },
-        disabledSelectedYearContainerColor.takeOrElse { this.disabledSelectedYearContainerColor },
-        dayContentColor.takeOrElse { this.dayContentColor },
-        disabledDayContentColor.takeOrElse { this.disabledDayContentColor },
-        selectedDayContentColor.takeOrElse { this.selectedDayContentColor },
-        disabledSelectedDayContentColor.takeOrElse { this.disabledSelectedDayContentColor },
-        selectedDayContainerColor.takeOrElse { this.selectedDayContainerColor },
-        disabledSelectedDayContainerColor.takeOrElse { this.disabledSelectedDayContainerColor },
-        todayContentColor.takeOrElse { this.todayContentColor },
-        todayDateBorderColor.takeOrElse { this.todayDateBorderColor },
-        dayInSelectionRangeContainerColor.takeOrElse { this.dayInSelectionRangeContainerColor },
-        dayInSelectionRangeContentColor.takeOrElse { this.dayInSelectionRangeContentColor },
-        dividerColor.takeOrElse { this.dividerColor },
-        dateTextFieldColors.takeOrElse { this.dateTextFieldColors }
-    )
+    ) =
+        DatePickerColors(
+            containerColor.takeOrElse { this.containerColor },
+            titleContentColor.takeOrElse { this.titleContentColor },
+            headlineContentColor.takeOrElse { this.headlineContentColor },
+            weekdayContentColor.takeOrElse { this.weekdayContentColor },
+            subheadContentColor.takeOrElse { this.subheadContentColor },
+            navigationContentColor.takeOrElse { this.navigationContentColor },
+            yearContentColor.takeOrElse { this.yearContentColor },
+            disabledYearContentColor.takeOrElse { this.disabledYearContentColor },
+            currentYearContentColor.takeOrElse { this.currentYearContentColor },
+            selectedYearContentColor.takeOrElse { this.selectedYearContentColor },
+            disabledSelectedYearContentColor.takeOrElse { this.disabledSelectedYearContentColor },
+            selectedYearContainerColor.takeOrElse { this.selectedYearContainerColor },
+            disabledSelectedYearContainerColor.takeOrElse {
+                this.disabledSelectedYearContainerColor
+            },
+            dayContentColor.takeOrElse { this.dayContentColor },
+            disabledDayContentColor.takeOrElse { this.disabledDayContentColor },
+            selectedDayContentColor.takeOrElse { this.selectedDayContentColor },
+            disabledSelectedDayContentColor.takeOrElse { this.disabledSelectedDayContentColor },
+            selectedDayContainerColor.takeOrElse { this.selectedDayContainerColor },
+            disabledSelectedDayContainerColor.takeOrElse { this.disabledSelectedDayContainerColor },
+            todayContentColor.takeOrElse { this.todayContentColor },
+            todayDateBorderColor.takeOrElse { this.todayDateBorderColor },
+            dayInSelectionRangeContainerColor.takeOrElse { this.dayInSelectionRangeContainerColor },
+            dayInSelectionRangeContentColor.takeOrElse { this.dayInSelectionRangeContentColor },
+            dividerColor.takeOrElse { this.dividerColor },
+            dateTextFieldColors.takeOrElse { this.dateTextFieldColors }
+        )
 
     internal fun TextFieldColors?.takeOrElse(block: () -> TextFieldColors): TextFieldColors =
         this ?: block()
@@ -905,24 +896,22 @@
         inRange: Boolean,
         enabled: Boolean
     ): State<Color> {
-        val target = when {
-            selected && enabled -> selectedDayContentColor
-            selected && !enabled -> disabledSelectedDayContentColor
-            inRange && enabled -> dayInSelectionRangeContentColor
-            inRange && !enabled -> disabledDayContentColor
-            isToday -> todayContentColor
-            enabled -> dayContentColor
-            else -> disabledDayContentColor
-        }
+        val target =
+            when {
+                selected && enabled -> selectedDayContentColor
+                selected && !enabled -> disabledSelectedDayContentColor
+                inRange && enabled -> dayInSelectionRangeContentColor
+                inRange && !enabled -> disabledDayContentColor
+                isToday -> todayContentColor
+                enabled -> dayContentColor
+                else -> disabledDayContentColor
+            }
 
         return if (inRange) {
             rememberUpdatedState(target)
         } else {
             // Animate the content color only when the day is not in a range.
-            animateColorAsState(
-                target,
-                tween(durationMillis = MotionTokens.DurationShort2.toInt())
-            )
+            animateColorAsState(target, tween(durationMillis = MotionTokens.DurationShort2.toInt()))
         }
     }
 
@@ -939,16 +928,14 @@
         enabled: Boolean,
         animate: Boolean
     ): State<Color> {
-        val target = if (selected) {
-            if (enabled) selectedDayContainerColor else disabledSelectedDayContainerColor
-        } else {
-            Color.Transparent
-        }
+        val target =
+            if (selected) {
+                if (enabled) selectedDayContainerColor else disabledSelectedDayContainerColor
+            } else {
+                Color.Transparent
+            }
         return if (animate) {
-            animateColorAsState(
-                target,
-                tween(durationMillis = MotionTokens.DurationShort2.toInt())
-            )
+            animateColorAsState(target, tween(durationMillis = MotionTokens.DurationShort2.toInt()))
         } else {
             rememberUpdatedState(target)
         }
@@ -967,13 +954,14 @@
         selected: Boolean,
         enabled: Boolean
     ): State<Color> {
-        val target = when {
-            selected && enabled -> selectedYearContentColor
-            selected && !enabled -> disabledSelectedYearContentColor
-            currentYear -> currentYearContentColor
-            enabled -> yearContentColor
-            else -> disabledYearContentColor
-        }
+        val target =
+            when {
+                selected && enabled -> selectedYearContentColor
+                selected && !enabled -> disabledSelectedYearContentColor
+                currentYear -> currentYearContentColor
+                enabled -> yearContentColor
+                else -> disabledYearContentColor
+            }
 
         return animateColorAsState(
             target,
@@ -989,11 +977,12 @@
      */
     @Composable
     internal fun yearContainerColor(selected: Boolean, enabled: Boolean): State<Color> {
-        val target = if (selected) {
-            if (enabled) selectedYearContainerColor else disabledSelectedYearContainerColor
-        } else {
-            Color.Transparent
-        }
+        val target =
+            if (selected) {
+                if (enabled) selectedYearContainerColor else disabledSelectedYearContainerColor
+            } else {
+                Color.Transparent
+            }
         return animateColorAsState(
             target,
             tween(durationMillis = MotionTokens.DurationShort2.toInt())
@@ -1066,16 +1055,15 @@
  * This base class common state properties and provides a base implementation that is extended by
  * the different state classes.
  *
- * @param initialDisplayedMonthMillis timestamp in _UTC_ milliseconds from the epoch that
- * represents an initial selection of a month to be displayed to the user. In case `null` is
- * provided, the displayed month would be the current one.
- * @param yearRange an [IntRange] that holds the year range that the date picker will be limited
- * to
- * @param selectableDates a [SelectableDates] that is consulted to check if a date is allowed.
- * In case a date is not allowed to be selected, it will appear disabled in the UI.
+ * @param initialDisplayedMonthMillis timestamp in _UTC_ milliseconds from the epoch that represents
+ *   an initial selection of a month to be displayed to the user. In case `null` is provided, the
+ *   displayed month would be the current one.
+ * @param yearRange an [IntRange] that holds the year range that the date picker will be limited to
+ * @param selectableDates a [SelectableDates] that is consulted to check if a date is allowed. In
+ *   case a date is not allowed to be selected, it will appear disabled in the UI.
+ * @throws [IllegalArgumentException] if the initial selected date or displayed month represent a
+ *   year that is out of the year range.
  * @see rememberDatePickerState
- * @throws [IllegalArgumentException] if the initial selected date or displayed month represent
- * a year that is out of the year range.
  */
 @OptIn(ExperimentalMaterial3Api::class)
 @Stable
@@ -1089,17 +1077,19 @@
     val calendarModel = createCalendarModel(locale)
 
     private var _displayedMonth =
-        mutableStateOf(if (initialDisplayedMonthMillis != null) {
-            val month = calendarModel.getMonth(initialDisplayedMonthMillis)
-            require(yearRange.contains(month.year)) {
-                "The initial display month's year (${month.year}) is out of the years range of " +
-                    "$yearRange."
+        mutableStateOf(
+            if (initialDisplayedMonthMillis != null) {
+                val month = calendarModel.getMonth(initialDisplayedMonthMillis)
+                require(yearRange.contains(month.year)) {
+                    "The initial display month's year (${month.year}) is out of the years range of " +
+                        "$yearRange."
+                }
+                month
+            } else {
+                // Set the displayed month to the current one.
+                calendarModel.getMonth(calendarModel.today)
             }
-            month
-        } else {
-            // Set the displayed month to the current one.
-            calendarModel.getMonth(calendarModel.today)
-        })
+        )
 
     var displayedMonthMillis: Long
         get() = _displayedMonth.value.startUtcTimeMillis
@@ -1115,24 +1105,22 @@
 /**
  * A default implementation of the [DatePickerState]. See [rememberDatePickerState].
  *
- * @param initialSelectedDateMillis timestamp in _UTC_ milliseconds from the epoch that
- * represents an initial selection of a date. Provide a `null` to indicate no selection. Note
- * that the state's
- * [selectedDateMillis] will provide a timestamp that represents the _start_ of the day, which
- * may be different than the provided initialSelectedDateMillis.
- * @param initialDisplayedMonthMillis timestamp in _UTC_ milliseconds from the epoch that
- * represents an initial selection of a month to be displayed to the user. In case `null` is
- * provided, the displayed month would be the current one.
- * @param yearRange an [IntRange] that holds the year range that the date picker will be limited
- * to
+ * @param initialSelectedDateMillis timestamp in _UTC_ milliseconds from the epoch that represents
+ *   an initial selection of a date. Provide a `null` to indicate no selection. Note that the
+ *   state's [selectedDateMillis] will provide a timestamp that represents the _start_ of the day,
+ *   which may be different than the provided initialSelectedDateMillis.
+ * @param initialDisplayedMonthMillis timestamp in _UTC_ milliseconds from the epoch that represents
+ *   an initial selection of a month to be displayed to the user. In case `null` is provided, the
+ *   displayed month would be the current one.
+ * @param yearRange an [IntRange] that holds the year range that the date picker will be limited to
  * @param initialDisplayMode an initial [DisplayMode] that this state will hold
- * @param selectableDates a [SelectableDates] that is consulted to check if a date is allowed.
- * In case a date is not allowed to be selected, it will appear disabled in the UI
+ * @param selectableDates a [SelectableDates] that is consulted to check if a date is allowed. In
+ *   case a date is not allowed to be selected, it will appear disabled in the UI
  * @param locale a [CalendarLocale] to be used when formatting dates, determining the input format,
- * and more
+ *   and more
+ * @throws [IllegalArgumentException] if the initial selected date or displayed month represent a
+ *   year that is out of the year range.
  * @see rememberDatePickerState
- * @throws [IllegalArgumentException] if the initial selected date or displayed month represent
- * a year that is out of the year range.
  */
 @OptIn(ExperimentalMaterial3Api::class)
 @Stable
@@ -1143,27 +1131,24 @@
     initialDisplayMode: DisplayMode,
     selectableDates: SelectableDates,
     locale: CalendarLocale
-) : BaseDatePickerStateImpl(
-    initialDisplayedMonthMillis,
-    yearRange,
-    selectableDates,
-    locale
-), DatePickerState {
+) :
+    BaseDatePickerStateImpl(initialDisplayedMonthMillis, yearRange, selectableDates, locale),
+    DatePickerState {
 
-    /**
-     * A mutable state of [CalendarDate] that represents a selected date.
-     */
+    /** A mutable state of [CalendarDate] that represents a selected date. */
     private var _selectedDate =
-        mutableStateOf(if (initialSelectedDateMillis != null) {
-            val date = calendarModel.getCanonicalDate(initialSelectedDateMillis)
-            require(yearRange.contains(date.year)) {
-                "The provided initial date's year (${date.year}) is out of the years range " +
-                    "of $yearRange."
+        mutableStateOf(
+            if (initialSelectedDateMillis != null) {
+                val date = calendarModel.getCanonicalDate(initialSelectedDateMillis)
+                require(yearRange.contains(date.year)) {
+                    "The provided initial date's year (${date.year}) is out of the years range " +
+                        "of $yearRange."
+                }
+                date
+            } else {
+                null
             }
-            date
-        } else {
-            null
-        })
+        )
 
     override var selectedDateMillis: Long?
         @Suppress("AutoBoxing") get() = _selectedDate.value?.utcTimeMillis
@@ -1182,8 +1167,8 @@
         }
 
     /**
-     * A mutable state of [DisplayMode] that represents the current display mode of the UI
-     * (i.e. picker or input).
+     * A mutable state of [DisplayMode] that represents the current display mode of the UI (i.e.
+     * picker or input).
      */
     private var _displayMode = mutableStateOf(initialDisplayMode)
 
@@ -1201,32 +1186,33 @@
          * The default [Saver] implementation for [DatePickerStateImpl].
          *
          * @param selectableDates a [SelectableDates] instance that is consulted to check if a date
-         * is allowed
+         *   is allowed
          */
         fun Saver(
             selectableDates: SelectableDates,
             locale: CalendarLocale
-        ): Saver<DatePickerStateImpl, Any> = listSaver(
-            save = {
-                listOf(
-                    it.selectedDateMillis,
-                    it.displayedMonthMillis,
-                    it.yearRange.first,
-                    it.yearRange.last,
-                    it.displayMode.value
-                )
-            },
-            restore = { value ->
-                DatePickerStateImpl(
-                    initialSelectedDateMillis = value[0] as Long?,
-                    initialDisplayedMonthMillis = value[1] as Long?,
-                    yearRange = IntRange(value[2] as Int, value[3] as Int),
-                    initialDisplayMode = DisplayMode(value[4] as Int),
-                    selectableDates = selectableDates,
-                    locale = locale
-                )
-            }
-        )
+        ): Saver<DatePickerStateImpl, Any> =
+            listSaver(
+                save = {
+                    listOf(
+                        it.selectedDateMillis,
+                        it.displayedMonthMillis,
+                        it.yearRange.first,
+                        it.yearRange.last,
+                        it.displayMode.value
+                    )
+                },
+                restore = { value ->
+                    DatePickerStateImpl(
+                        initialSelectedDateMillis = value[0] as Long?,
+                        initialDisplayedMonthMillis = value[1] as Long?,
+                        yearRange = IntRange(value[2] as Int, value[3] as Int),
+                        initialDisplayMode = DisplayMode(value[4] as Int),
+                        selectableDates = selectableDates,
+                        locale = locale
+                    )
+                }
+            )
     }
 }
 
@@ -1234,18 +1220,18 @@
  * A date formatter used by [DatePicker].
  *
  * The date formatter will apply the best possible localized form of the given skeleton and Locale.
- * A skeleton is similar to, and uses the same format characters as, a Unicode
- * <a href="http://www.unicode.org/reports/tr35/#Date_Format_Patterns">UTS #35</a> pattern.
+ * A skeleton is similar to, and uses the same format characters as, a Unicode <a
+ * href="http://www.unicode.org/reports/tr35/#Date_Format_Patterns">UTS #35</a> pattern.
  *
  * One difference is that order is irrelevant. For example, "MMMMd" will return "MMMM d" in the
  * `en_US` locale, but "d. MMMM" in the `de_CH` locale.
  *
  * @param yearSelectionSkeleton a date format skeleton used to format the date picker's year
- * selection menu button (e.g. "March 2021").
- * @param selectedDateSkeleton a date format skeleton used to format a selected date (e.g.
- * "Mar 27, 2021")
+ *   selection menu button (e.g. "March 2021").
+ * @param selectedDateSkeleton a date format skeleton used to format a selected date (e.g. "Mar 27,
+ *   2021")
  * @param selectedDateDescriptionSkeleton a date format skeleton used to format a selected date to
- * be used as content description for screen readers (e.g. "Saturday, March 27, 2021")
+ *   be used as content description for screen readers (e.g. "Saturday, March 27, 2021")
  */
 @OptIn(ExperimentalMaterial3Api::class)
 @Immutable
@@ -1258,10 +1244,7 @@
     // A map for caching formatter related results for better performance
     private val formatterCache = mutableMapOf<String, Any>()
 
-    override fun formatMonthYear(
-        monthMillis: Long?,
-        locale: CalendarLocale
-    ): String? {
+    override fun formatMonthYear(monthMillis: Long?, locale: CalendarLocale): String? {
         if (monthMillis == null) return null
         return formatWithSkeleton(monthMillis, yearSelectionSkeleton, locale, formatterCache)
     }
@@ -1273,7 +1256,8 @@
     ): String? {
         if (dateMillis == null) return null
         return formatWithSkeleton(
-            dateMillis, if (forContentDescription) {
+            dateMillis,
+            if (forContentDescription) {
                 selectedDateDescriptionSkeleton
             } else {
                 selectedDateSkeleton
@@ -1318,13 +1302,14 @@
     content: @Composable () -> Unit
 ) {
     Column(
-        modifier = modifier
-            .sizeIn(minWidth = DatePickerModalTokens.ContainerWidth)
-            .semantics {
-                @Suppress("DEPRECATION")
-                isContainer = true
-            }
-            .background(colors.containerColor)
+        modifier =
+            modifier
+                .sizeIn(minWidth = DatePickerModalTokens.ContainerWidth)
+                .semantics {
+                    @Suppress("DEPRECATION")
+                    isContainer = true
+                }
+                .background(colors.containerColor)
     ) {
         DatePickerHeader(
             modifier = Modifier,
@@ -1334,11 +1319,12 @@
             minHeight = headerMinHeight
         ) {
             Column(modifier = Modifier.fillMaxWidth()) {
-                val horizontalArrangement = when {
-                    headline != null && modeToggleButton != null -> Arrangement.SpaceBetween
-                    headline != null -> Arrangement.Start
-                    else -> Arrangement.End
-                }
+                val horizontalArrangement =
+                    when {
+                        headline != null && modeToggleButton != null -> Arrangement.SpaceBetween
+                        headline != null -> Arrangement.Start
+                        else -> Arrangement.End
+                    }
                 Row(
                     modifier = Modifier.fillMaxWidth(),
                     horizontalArrangement = horizontalArrangement,
@@ -1346,9 +1332,7 @@
                 ) {
                     if (headline != null) {
                         ProvideTextStyle(value = headlineTextStyle) {
-                            Box(modifier = Modifier.weight(1f)) {
-                                headline()
-                            }
+                            Box(modifier = Modifier.weight(1f)) { headline() }
                         }
                     }
                     modeToggleButton?.invoke()
@@ -1410,72 +1394,79 @@
     val parallaxTarget = with(LocalDensity.current) { -48.dp.roundToPx() }
     AnimatedContent(
         targetState = displayMode,
-        modifier = Modifier.semantics {
-            @Suppress("DEPRECATION")
-            isContainer = true
-        },
+        modifier =
+            Modifier.semantics {
+                @Suppress("DEPRECATION")
+                isContainer = true
+            },
         transitionSpec = {
             // When animating the input mode, fade out the calendar picker and slide in the text
             // field from the bottom with a delay to show up after the picker is hidden.
             if (targetState == DisplayMode.Input) {
-                slideInVertically { height -> height } + fadeIn(
-                    animationSpec = tween(
-                        durationMillis = MotionTokens.DurationShort2.toInt(),
-                        delayMillis = MotionTokens.DurationShort2.toInt()
+                    slideInVertically { height -> height } +
+                        fadeIn(
+                            animationSpec =
+                                tween(
+                                    durationMillis = MotionTokens.DurationShort2.toInt(),
+                                    delayMillis = MotionTokens.DurationShort2.toInt()
+                                )
+                        ) togetherWith
+                        fadeOut(tween(durationMillis = MotionTokens.DurationShort2.toInt())) +
+                            slideOutVertically(targetOffsetY = { _ -> parallaxTarget })
+                } else {
+                    // When animating the picker mode, slide out text field and fade in calendar
+                    // picker with a delay to show up after the text field is hidden.
+                    slideInVertically(
+                        animationSpec = tween(delayMillis = MotionTokens.DurationShort1.toInt()),
+                        initialOffsetY = { _ -> parallaxTarget }
+                    ) +
+                        fadeIn(
+                            animationSpec =
+                                tween(
+                                    durationMillis = MotionTokens.DurationShort2.toInt(),
+                                    delayMillis = MotionTokens.DurationShort2.toInt()
+                                )
+                        ) togetherWith
+                        slideOutVertically(targetOffsetY = { fullHeight -> fullHeight }) +
+                            fadeOut(animationSpec = tween(MotionTokens.DurationShort2.toInt()))
+                }
+                .using(
+                    SizeTransform(
+                        clip = true,
+                        sizeAnimationSpec = { _, _ ->
+                            tween(
+                                MotionTokens.DurationLong2.toInt(),
+                                easing = MotionTokens.EasingEmphasizedDecelerateCubicBezier
+                            )
+                        }
                     )
-                ) togetherWith fadeOut(
-                    tween(durationMillis = MotionTokens.DurationShort2.toInt())
-                ) + slideOutVertically(targetOffsetY = { _ -> parallaxTarget })
-            } else {
-                // When animating the picker mode, slide out text field and fade in calendar
-                // picker with a delay to show up after the text field is hidden.
-                slideInVertically(
-                    animationSpec = tween(
-                        delayMillis = MotionTokens.DurationShort1.toInt()
-                    ),
-                    initialOffsetY = { _ -> parallaxTarget }
-                ) + fadeIn(
-                    animationSpec = tween(
-                        durationMillis = MotionTokens.DurationShort2.toInt(),
-                        delayMillis = MotionTokens.DurationShort2.toInt()
-                    )
-                ) togetherWith slideOutVertically(targetOffsetY = { fullHeight -> fullHeight }) +
-                    fadeOut(animationSpec = tween(MotionTokens.DurationShort2.toInt()))
-            }.using(
-                SizeTransform(
-                    clip = true,
-                    sizeAnimationSpec = { _, _ ->
-                        tween(
-                            MotionTokens.DurationLong2.toInt(),
-                            easing = MotionTokens.EasingEmphasizedDecelerateCubicBezier
-                        )
-                    })
-            )
+                )
         },
         label = "DatePickerDisplayModeAnimation"
     ) { mode ->
         when (mode) {
-            DisplayMode.Picker -> DatePickerContent(
-                selectedDateMillis = selectedDateMillis,
-                displayedMonthMillis = displayedMonthMillis,
-                onDateSelectionChange = onDateSelectionChange,
-                onDisplayedMonthChange = onDisplayedMonthChange,
-                calendarModel = calendarModel,
-                yearRange = yearRange,
-                dateFormatter = dateFormatter,
-                selectableDates = selectableDates,
-                colors = colors
-            )
-
-            DisplayMode.Input -> DateInputContent(
-                selectedDateMillis = selectedDateMillis,
-                onDateSelectionChange = onDateSelectionChange,
-                calendarModel = calendarModel,
-                yearRange = yearRange,
-                dateFormatter = dateFormatter,
-                selectableDates = selectableDates,
-                colors = colors
-            )
+            DisplayMode.Picker ->
+                DatePickerContent(
+                    selectedDateMillis = selectedDateMillis,
+                    displayedMonthMillis = displayedMonthMillis,
+                    onDateSelectionChange = onDateSelectionChange,
+                    onDisplayedMonthChange = onDisplayedMonthChange,
+                    calendarModel = calendarModel,
+                    yearRange = yearRange,
+                    dateFormatter = dateFormatter,
+                    selectableDates = selectableDates,
+                    colors = colors
+                )
+            DisplayMode.Input ->
+                DateInputContent(
+                    selectedDateMillis = selectedDateMillis,
+                    onDateSelectionChange = onDateSelectionChange,
+                    calendarModel = calendarModel,
+                    yearRange = yearRange,
+                    dateFormatter = dateFormatter,
+                    selectableDates = selectableDates,
+                    colors = colors
+                )
         }
     }
 }
@@ -1505,10 +1496,11 @@
             nextAvailable = monthsListState.canScrollForward,
             previousAvailable = monthsListState.canScrollBackward,
             yearPickerVisible = yearPickerVisible,
-            yearPickerText = dateFormatter.formatMonthYear(
-                monthMillis = displayedMonthMillis,
-                locale = defaultLocale
-            ) ?: "-",
+            yearPickerText =
+                dateFormatter.formatMonthYear(
+                    monthMillis = displayedMonthMillis,
+                    locale = defaultLocale
+                ) ?: "-",
             onNextClicked = {
                 coroutineScope.launch {
                     try {
@@ -1568,12 +1560,12 @@
                         // Keep the height the same as the monthly calendar + weekdays height, and
                         // take into account the thickness of the divider that will be composed
                         // below it.
-                        modifier = Modifier
-                            .requiredHeight(
-                                RecommendedSizeForAccessibility * (MaxCalendarRows + 1) -
-                                    DividerDefaults.Thickness
-                            )
-                            .padding(horizontal = DatePickerHorizontalPadding),
+                        modifier =
+                            Modifier.requiredHeight(
+                                    RecommendedSizeForAccessibility * (MaxCalendarRows + 1) -
+                                        DividerDefaults.Thickness
+                                )
+                                .padding(horizontal = DatePickerHorizontalPadding),
                         displayedMonthMillis = displayedMonthMillis,
                         onYearSelected = { year ->
                             // Switch back to the monthly calendar and scroll to the selected year.
@@ -1616,31 +1608,20 @@
             Modifier
         }
     Column(
-        modifier
-            .fillMaxWidth()
-            .then(heightModifier),
+        modifier.fillMaxWidth().then(heightModifier),
         verticalArrangement = Arrangement.SpaceBetween
     ) {
         if (title != null) {
             val textStyle = DatePickerModalTokens.HeaderSupportingTextFont.value
-            ProvideContentColorTextStyle(
-                contentColor = titleContentColor,
-                textStyle = textStyle
-            ) {
-                Box(contentAlignment = Alignment.BottomStart) {
-                    title()
-                }
+            ProvideContentColorTextStyle(contentColor = titleContentColor, textStyle = textStyle) {
+                Box(contentAlignment = Alignment.BottomStart) { title() }
             }
         }
-        CompositionLocalProvider(
-            LocalContentColor provides headlineContentColor, content = content
-        )
+        CompositionLocalProvider(LocalContentColor provides headlineContentColor, content = content)
     }
 }
 
-/**
- * Composes a horizontal pageable list of months.
- */
+/** Composes a horizontal pageable list of months. */
 @OptIn(ExperimentalMaterial3Api::class)
 @Composable
 private fun HorizontalMonthsList(
@@ -1655,31 +1636,28 @@
     colors: DatePickerColors
 ) {
     val today = calendarModel.today
-    val firstMonth = remember(yearRange) {
-        calendarModel.getMonth(
-            year = yearRange.first,
-            month = 1 // January
-        )
-    }
+    val firstMonth =
+        remember(yearRange) {
+            calendarModel.getMonth(
+                year = yearRange.first,
+                month = 1 // January
+            )
+        }
     ProvideTextStyle(DatePickerModalTokens.DateLabelTextFont.value) {
         LazyRow(
             // Apply this to prevent the screen reader from scrolling to the next or previous month,
             // and instead, traverse outside the Month composable when swiping from a focused first
             // or last day of the month.
-            modifier = Modifier.semantics {
-                horizontalScrollAxisRange = ScrollAxisRange(value = { 0f }, maxValue = { 0f })
-            },
+            modifier =
+                Modifier.semantics {
+                    horizontalScrollAxisRange = ScrollAxisRange(value = { 0f }, maxValue = { 0f })
+                },
             state = lazyListState,
             flingBehavior = DatePickerDefaults.rememberSnapFlingBehavior(lazyListState)
         ) {
             items(numberOfMonthsInRange(yearRange)) {
-                val month = calendarModel.plusMonths(
-                    from = firstMonth,
-                    addedMonthsCount = it
-                )
-                Box(
-                    modifier = Modifier.fillParentMaxWidth()
-                ) {
+                val month = calendarModel.plusMonths(from = firstMonth, addedMonthsCount = it)
+                Box(modifier = Modifier.fillParentMaxWidth()) {
                     Month(
                         month = month,
                         onDateSelectionChange = onDateSelectionChange,
@@ -1713,21 +1691,19 @@
     calendarModel: CalendarModel,
     yearRange: IntRange
 ) {
-    snapshotFlow { lazyListState.firstVisibleItemIndex }.collect {
-        val yearOffset = lazyListState.firstVisibleItemIndex / 12
-        val month = lazyListState.firstVisibleItemIndex % 12 + 1
-        onDisplayedMonthChange(
-            calendarModel.getMonth(
-                year = yearRange.first + yearOffset,
-                month = month
-            ).startUtcTimeMillis
-        )
-    }
+    snapshotFlow { lazyListState.firstVisibleItemIndex }
+        .collect {
+            val yearOffset = lazyListState.firstVisibleItemIndex / 12
+            val month = lazyListState.firstVisibleItemIndex % 12 + 1
+            onDisplayedMonthChange(
+                calendarModel
+                    .getMonth(year = yearRange.first + yearOffset, month = month)
+                    .startUtcTimeMillis
+            )
+        }
 }
 
-/**
- * Composes the weekdays letters.
- */
+/** Composes the weekdays letters. */
 @OptIn(ExperimentalMaterial3Api::class)
 @Composable
 internal fun WeekDays(colors: DatePickerColors, calendarModel: CalendarModel) {
@@ -1744,23 +1720,21 @@
     val textStyle = DatePickerModalTokens.WeekdaysLabelTextFont.value
 
     Row(
-        modifier = Modifier
-            .defaultMinSize(
-                minHeight = RecommendedSizeForAccessibility
-            )
-            .fillMaxWidth(),
+        modifier =
+            Modifier.defaultMinSize(minHeight = RecommendedSizeForAccessibility).fillMaxWidth(),
         horizontalArrangement = Arrangement.SpaceEvenly,
         verticalAlignment = Alignment.CenterVertically
     ) {
         dayNames.fastForEach {
             Box(
-                modifier = Modifier
-                    .clearAndSetSemantics { contentDescription = it.first }
-                    .size(
-                        width = RecommendedSizeForAccessibility,
-                        height = RecommendedSizeForAccessibility
-                    ),
-                contentAlignment = Alignment.Center) {
+                modifier =
+                    Modifier.clearAndSetSemantics { contentDescription = it.first }
+                        .size(
+                            width = RecommendedSizeForAccessibility,
+                            height = RecommendedSizeForAccessibility
+                        ),
+                contentAlignment = Alignment.Center
+            ) {
                 Text(
                     text = it.second,
                     modifier = Modifier.wrapContentSize(),
@@ -1773,9 +1747,7 @@
     }
 }
 
-/**
- * A composable that renders a calendar month and displays a date selection.
- */
+/** A composable that renders a calendar month and displays a date selection. */
 @OptIn(ExperimentalMaterial3Api::class)
 @Composable
 internal fun Month(
@@ -1789,21 +1761,22 @@
     selectableDates: SelectableDates,
     colors: DatePickerColors
 ) {
-    val rangeSelectionDrawModifier = if (rangeSelectionInfo != null) {
-        Modifier.drawWithContent {
-            drawRangeBackground(rangeSelectionInfo, colors.dayInSelectionRangeContainerColor)
-            drawContent()
+    val rangeSelectionDrawModifier =
+        if (rangeSelectionInfo != null) {
+            Modifier.drawWithContent {
+                drawRangeBackground(rangeSelectionInfo, colors.dayInSelectionRangeContainerColor)
+                drawContent()
+            }
+        } else {
+            Modifier
         }
-    } else {
-        Modifier
-    }
 
     val defaultLocale = defaultLocale()
     var cellIndex = 0
     Column(
-        modifier = Modifier
-            .requiredHeight(RecommendedSizeForAccessibility * MaxCalendarRows)
-            .then(rangeSelectionDrawModifier),
+        modifier =
+            Modifier.requiredHeight(RecommendedSizeForAccessibility * MaxCalendarRows)
+                .then(rangeSelectionDrawModifier),
         verticalArrangement = Arrangement.SpaceEvenly
     ) {
         for (weekIndex in 0 until MaxCalendarRows) {
@@ -1813,47 +1786,53 @@
                 verticalAlignment = Alignment.CenterVertically
             ) {
                 for (dayIndex in 0 until DaysInWeek) {
-                    if (cellIndex < month.daysFromStartOfWeekToFirstOfMonth ||
-                        cellIndex >=
-                        (month.daysFromStartOfWeekToFirstOfMonth + month.numberOfDays)
+                    if (
+                        cellIndex < month.daysFromStartOfWeekToFirstOfMonth ||
+                            cellIndex >=
+                                (month.daysFromStartOfWeekToFirstOfMonth + month.numberOfDays)
                     ) {
                         // Empty cell
                         Spacer(
-                            modifier = Modifier.requiredSize(
-                                width = RecommendedSizeForAccessibility,
-                                height = RecommendedSizeForAccessibility
-                            )
+                            modifier =
+                                Modifier.requiredSize(
+                                    width = RecommendedSizeForAccessibility,
+                                    height = RecommendedSizeForAccessibility
+                                )
                         )
                     } else {
                         val dayNumber = cellIndex - month.daysFromStartOfWeekToFirstOfMonth
-                        val dateInMillis = month.startUtcTimeMillis +
-                            (dayNumber * MillisecondsIn24Hours)
+                        val dateInMillis =
+                            month.startUtcTimeMillis + (dayNumber * MillisecondsIn24Hours)
                         val isToday = dateInMillis == todayMillis
                         val startDateSelected = dateInMillis == startDateMillis
                         val endDateSelected = dateInMillis == endDateMillis
-                        val inRange = if (rangeSelectionInfo != null) {
-                            remember(rangeSelectionInfo, dateInMillis) {
-                                mutableStateOf(
-                                    dateInMillis >= (startDateMillis
-                                        ?: Long.Companion.MAX_VALUE) &&
-                                        dateInMillis <= (endDateMillis ?: Long.MIN_VALUE)
-                                )
-                            }.value
-                        } else {
-                            false
-                        }
-                        val dayContentDescription = dayContentDescription(
-                            rangeSelectionEnabled = rangeSelectionInfo != null,
-                            isToday = isToday,
-                            isStartDate = startDateSelected,
-                            isEndDate = endDateSelected,
-                            isInRange = inRange
-                        )
-                        val formattedDateDescription = dateFormatter.formatDate(
-                            dateInMillis,
-                            defaultLocale,
-                            forContentDescription = true
-                        ) ?: ""
+                        val inRange =
+                            if (rangeSelectionInfo != null) {
+                                remember(rangeSelectionInfo, dateInMillis) {
+                                        mutableStateOf(
+                                            dateInMillis >=
+                                                (startDateMillis ?: Long.Companion.MAX_VALUE) &&
+                                                dateInMillis <= (endDateMillis ?: Long.MIN_VALUE)
+                                        )
+                                    }
+                                    .value
+                            } else {
+                                false
+                            }
+                        val dayContentDescription =
+                            dayContentDescription(
+                                rangeSelectionEnabled = rangeSelectionInfo != null,
+                                isToday = isToday,
+                                isStartDate = startDateSelected,
+                                isEndDate = endDateSelected,
+                                isInRange = inRange
+                            )
+                        val formattedDateDescription =
+                            dateFormatter.formatDate(
+                                dateInMillis,
+                                defaultLocale,
+                                forContentDescription = true
+                            ) ?: ""
                         Day(
                             modifier = Modifier,
                             selected = startDateSelected || endDateSelected,
@@ -1862,28 +1841,30 @@
                             // disable when drawing a range marker behind the days on an
                             // end-date selection.
                             animateChecked = startDateSelected,
-                            enabled = remember(dateInMillis) {
-                                // Disabled a day in case its year is not selectable, or the
-                                // date itself is specifically not allowed by the state's
-                                // SelectableDates.
-                                with(selectableDates) {
-                                    isSelectableYear(month.year) &&
-                                        isSelectableDate(dateInMillis)
-                                }
-                            },
+                            enabled =
+                                remember(dateInMillis) {
+                                    // Disabled a day in case its year is not selectable, or the
+                                    // date itself is specifically not allowed by the state's
+                                    // SelectableDates.
+                                    with(selectableDates) {
+                                        isSelectableYear(month.year) &&
+                                            isSelectableDate(dateInMillis)
+                                    }
+                                },
                             today = isToday,
                             inRange = inRange,
-                            description = if (dayContentDescription != null) {
-                                "$dayContentDescription, $formattedDateDescription"
-                            } else {
-                                formattedDateDescription
-                            },
+                            description =
+                                if (dayContentDescription != null) {
+                                    "$dayContentDescription, $formattedDateDescription"
+                                } else {
+                                    formattedDateDescription
+                                },
                             colors = colors
                         ) {
                             Text(
                                 text = (dayNumber + 1).toLocalString(),
                                 // The semantics are set at the Day level.
-                                modifier = Modifier.clearAndSetSemantics { },
+                                modifier = Modifier.clearAndSetSemantics {},
                                 textAlign = TextAlign.Center
                             )
                         }
@@ -1895,9 +1876,7 @@
     }
 }
 
-/**
- * Returns the number of months within the given year range.
- */
+/** Returns the number of months within the given year range. */
 internal fun numberOfMonthsInRange(yearRange: IntRange) =
     (yearRange.last - yearRange.first + 1) * 12
 
@@ -1912,17 +1891,12 @@
     val descriptionBuilder = StringBuilder()
     if (rangeSelectionEnabled) {
         when {
-            isStartDate -> descriptionBuilder.append(
-                getString(string = Strings.DateRangePickerStartHeadline)
-            )
-
-            isEndDate -> descriptionBuilder.append(
-                getString(string = Strings.DateRangePickerEndHeadline)
-            )
-
-            isInRange -> descriptionBuilder.append(
-                getString(string = Strings.DateRangePickerDayInRange)
-            )
+            isStartDate ->
+                descriptionBuilder.append(getString(string = Strings.DateRangePickerStartHeadline))
+            isEndDate ->
+                descriptionBuilder.append(getString(string = Strings.DateRangePickerEndHeadline))
+            isInRange ->
+                descriptionBuilder.append(getString(string = Strings.DateRangePickerDayInRange))
         }
     }
     if (isToday) {
@@ -1949,41 +1923,47 @@
     Surface(
         selected = selected,
         onClick = onClick,
-        modifier = modifier
-            // Apply and merge semantics here. This will ensure that when scrolling the list the
-            // entire Day surface is treated as one unit and holds the date semantics even when it's
-            // not completely visible atm.
-            .semantics(mergeDescendants = true) {
-                text = AnnotatedString(description)
-                role = Role.Button
-            },
+        modifier =
+            modifier
+                // Apply and merge semantics here. This will ensure that when scrolling the list the
+                // entire Day surface is treated as one unit and holds the date semantics even when
+                // it's
+                // not completely visible atm.
+                .semantics(mergeDescendants = true) {
+                    text = AnnotatedString(description)
+                    role = Role.Button
+                },
         enabled = enabled,
         shape = DatePickerModalTokens.DateContainerShape.value,
-        color = colors.dayContainerColor(
-            selected = selected,
-            enabled = enabled,
-            animate = animateChecked
-        ).value,
-        contentColor = colors.dayContentColor(
-            isToday = today,
-            selected = selected,
-            inRange = inRange,
-            enabled = enabled,
-        ).value,
-        border = if (today && !selected) {
-            BorderStroke(
-                DatePickerModalTokens.DateTodayContainerOutlineWidth,
-                colors.todayDateBorderColor
-            )
-        } else {
-            null
-        }
+        color =
+            colors
+                .dayContainerColor(selected = selected, enabled = enabled, animate = animateChecked)
+                .value,
+        contentColor =
+            colors
+                .dayContentColor(
+                    isToday = today,
+                    selected = selected,
+                    inRange = inRange,
+                    enabled = enabled,
+                )
+                .value,
+        border =
+            if (today && !selected) {
+                BorderStroke(
+                    DatePickerModalTokens.DateTodayContainerOutlineWidth,
+                    colors.todayDateBorderColor
+                )
+            } else {
+                null
+            }
     ) {
         Box(
-            modifier = Modifier.requiredSize(
-                DatePickerModalTokens.DateStateLayerWidth,
-                DatePickerModalTokens.DateStateLayerHeight
-            ),
+            modifier =
+                Modifier.requiredSize(
+                    DatePickerModalTokens.DateStateLayerWidth,
+                    DatePickerModalTokens.DateStateLayerHeight
+                ),
             contentAlignment = Alignment.Center
         ) {
             content()
@@ -2009,9 +1989,7 @@
             rememberLazyGridState(
                 // Set the initial index to a few years before the current year to allow quicker
                 // selection of previous years.
-                initialFirstVisibleItemIndex = max(
-                    0, displayedYear - yearRange.first - YearsInRow
-                )
+                initialFirstVisibleItemIndex = max(0, displayedYear - yearRange.first - YearsInRow)
             )
         // Match the years container color to any elevated surface color that is composed under it.
         val containerColor = colors.containerColor
@@ -2020,13 +1998,15 @@
         val scrollToLaterYearsLabel = getString(Strings.DatePickerScrollToShowLaterYears)
         LazyVerticalGrid(
             columns = GridCells.Fixed(YearsInRow),
-            modifier = modifier
-                .background(containerColor)
-                // Apply this to have the screen reader traverse outside the visible list of years
-                // and not scroll them by default.
-                .semantics {
-                    verticalScrollAxisRange = ScrollAxisRange(value = { 0f }, maxValue = { 0f })
-                },
+            modifier =
+                modifier
+                    .background(containerColor)
+                    // Apply this to have the screen reader traverse outside the visible list of
+                    // years
+                    // and not scroll them by default.
+                    .semantics {
+                        verticalScrollAxisRange = ScrollAxisRange(value = { 0f }, maxValue = { 0f })
+                    },
             state = lazyGridState,
             horizontalArrangement = Arrangement.SpaceEvenly,
             verticalArrangement = Arrangement.spacedBy(YearsVerticalPadding)
@@ -2035,34 +2015,41 @@
                 val selectedYear = it + yearRange.first
                 val localizedYear = selectedYear.toLocalString()
                 Year(
-                    modifier = Modifier
-                        .requiredSize(
-                            width = DatePickerModalTokens.SelectionYearContainerWidth,
-                            height = DatePickerModalTokens.SelectionYearContainerHeight
-                        )
-                        .semantics {
-                            // Apply a11y custom actions to the first and last items in the years
-                            // grid. The actions will suggest to scroll to earlier or later years in
-                            // the grid.
-                            customActions = if (lazyGridState.firstVisibleItemIndex == it ||
-                                lazyGridState.layoutInfo.visibleItemsInfo.lastOrNull()?.index == it
-                            ) {
-                                customScrollActions(
-                                    state = lazyGridState,
-                                    coroutineScope = coroutineScope,
-                                    scrollUpLabel = scrollToEarlierYearsLabel,
-                                    scrollDownLabel = scrollToLaterYearsLabel
-                                )
-                            } else {
-                                emptyList()
-                            }
-                        },
+                    modifier =
+                        Modifier.requiredSize(
+                                width = DatePickerModalTokens.SelectionYearContainerWidth,
+                                height = DatePickerModalTokens.SelectionYearContainerHeight
+                            )
+                            .semantics {
+                                // Apply a11y custom actions to the first and last items in the
+                                // years
+                                // grid. The actions will suggest to scroll to earlier or later
+                                // years in
+                                // the grid.
+                                customActions =
+                                    if (
+                                        lazyGridState.firstVisibleItemIndex == it ||
+                                            lazyGridState.layoutInfo.visibleItemsInfo
+                                                .lastOrNull()
+                                                ?.index == it
+                                    ) {
+                                        customScrollActions(
+                                            state = lazyGridState,
+                                            coroutineScope = coroutineScope,
+                                            scrollUpLabel = scrollToEarlierYearsLabel,
+                                            scrollDownLabel = scrollToLaterYearsLabel
+                                        )
+                                    } else {
+                                        emptyList()
+                                    }
+                            },
                     selected = selectedYear == displayedYear,
                     currentYear = selectedYear == currentYear,
                     onClick = { onYearSelected(selectedYear) },
                     enabled = selectableDates.isSelectableYear(selectedYear),
-                    description = getString(Strings.DatePickerNavigateToYearDescription)
-                        .format(localizedYear),
+                    description =
+                        getString(Strings.DatePickerNavigateToYearDescription)
+                            .format(localizedYear),
                     colors = colors
                 ) {
                     Text(
@@ -2089,40 +2076,39 @@
     colors: DatePickerColors,
     content: @Composable () -> Unit
 ) {
-    val border = remember(currentYear, selected) {
-        if (currentYear && !selected) {
-            // Use the day's spec to draw a border around the current year.
-            BorderStroke(
-                DatePickerModalTokens.DateTodayContainerOutlineWidth,
-                colors.todayDateBorderColor
-            )
-        } else {
-            null
+    val border =
+        remember(currentYear, selected) {
+            if (currentYear && !selected) {
+                // Use the day's spec to draw a border around the current year.
+                BorderStroke(
+                    DatePickerModalTokens.DateTodayContainerOutlineWidth,
+                    colors.todayDateBorderColor
+                )
+            } else {
+                null
+            }
         }
-    }
     Surface(
         selected = selected,
         onClick = onClick,
         // Apply and merge semantics here. This will ensure that when scrolling the list the entire
         // Year surface is treated as one unit and holds the date semantics even when it's not
         // completely visible atm.
-        modifier = modifier.semantics(mergeDescendants = true) {
-            text = AnnotatedString(description)
-            role = Role.Button
-        },
+        modifier =
+            modifier.semantics(mergeDescendants = true) {
+                text = AnnotatedString(description)
+                role = Role.Button
+            },
         enabled = enabled,
         shape = DatePickerModalTokens.SelectionYearStateLayerShape.value,
         color = colors.yearContainerColor(selected = selected, enabled = enabled).value,
-        contentColor = colors.yearContentColor(
-            currentYear = currentYear,
-            selected = selected,
-            enabled = enabled
-        ).value,
+        contentColor =
+            colors
+                .yearContentColor(currentYear = currentYear, selected = selected, enabled = enabled)
+                .value,
         border = border,
     ) {
-        Box(modifier = Modifier.fillMaxWidth(), contentAlignment = Alignment.Center) {
-            content()
-        }
+        Box(modifier = Modifier.fillMaxWidth(), contentAlignment = Alignment.Center) { content() }
     }
 }
 
@@ -2144,14 +2130,13 @@
     colors: DatePickerColors
 ) {
     Row(
-        modifier = modifier
-            .fillMaxWidth()
-            .requiredHeight(MonthYearHeight),
-        horizontalArrangement = if (yearPickerVisible) {
-            Arrangement.Start
-        } else {
-            Arrangement.SpaceBetween
-        },
+        modifier = modifier.fillMaxWidth().requiredHeight(MonthYearHeight),
+        horizontalArrangement =
+            if (yearPickerVisible) {
+                Arrangement.Start
+            } else {
+                Arrangement.SpaceBetween
+            },
         verticalAlignment = Alignment.CenterVertically
     ) {
         CompositionLocalProvider(LocalContentColor provides colors.navigationContentColor) {
@@ -2160,13 +2145,17 @@
                 onClick = onYearPickerButtonClicked,
                 expanded = yearPickerVisible
             ) {
-                Text(text = yearPickerText,
-                    modifier = Modifier.semantics {
-                        // Make the screen reader read out updates to the menu button text as the
-                        // user navigates the arrows or scrolls to change the displayed month.
-                        liveRegion = LiveRegionMode.Polite
-                        contentDescription = yearPickerText
-                    })
+                Text(
+                    text = yearPickerText,
+                    modifier =
+                        Modifier.semantics {
+                            // Make the screen reader read out updates to the menu button text as
+                            // the
+                            // user navigates the arrows or scrolls to change the displayed month.
+                            liveRegion = LiveRegionMode.Polite
+                            contentDescription = yearPickerText
+                        }
+                )
             }
             // Show arrows for traversing months (only visible when the year selection is off)
             if (!yearPickerVisible) {
@@ -2209,11 +2198,12 @@
         Spacer(Modifier.size(ButtonDefaults.IconSpacing))
         Icon(
             Icons.Filled.ArrowDropDown,
-            contentDescription = if (expanded) {
-                getString(Strings.DatePickerSwitchToDaySelection)
-            } else {
-                getString(Strings.DatePickerSwitchToYearSelection)
-            },
+            contentDescription =
+                if (expanded) {
+                    getString(Strings.DatePickerSwitchToDaySelection)
+                } else {
+                    getString(Strings.DatePickerSwitchToYearSelection)
+                },
             Modifier.rotate(if (expanded) 180f else 0f)
         )
     }
@@ -2229,9 +2219,7 @@
         if (!state.canScrollBackward) {
             false
         } else {
-            coroutineScope.launch {
-                state.scrollToItem(state.firstVisibleItemIndex - YearsInRow)
-            }
+            coroutineScope.launch { state.scrollToItem(state.firstVisibleItemIndex - YearsInRow) }
             true
         }
     }
@@ -2239,21 +2227,13 @@
         if (!state.canScrollForward) {
             false
         } else {
-            coroutineScope.launch {
-                state.scrollToItem(state.firstVisibleItemIndex + YearsInRow)
-            }
+            coroutineScope.launch { state.scrollToItem(state.firstVisibleItemIndex + YearsInRow) }
             true
         }
     }
     return listOf(
-        CustomAccessibilityAction(
-            label = scrollUpLabel,
-            action = scrollUpAction
-        ),
-        CustomAccessibilityAction(
-            label = scrollDownLabel,
-            action = scrollDownAction
-        )
+        CustomAccessibilityAction(label = scrollUpLabel, action = scrollUpAction),
+        CustomAccessibilityAction(label = scrollDownLabel, action = scrollDownAction)
     )
 }
 
@@ -2263,8 +2243,7 @@
 internal val DatePickerModeTogglePadding = PaddingValues(end = 12.dp, bottom = 12.dp)
 
 private val DatePickerTitlePadding = PaddingValues(start = 24.dp, end = 12.dp, top = 16.dp)
-private val DatePickerHeadlinePadding =
-    PaddingValues(start = 24.dp, end = 12.dp, bottom = 12.dp)
+private val DatePickerHeadlinePadding = PaddingValues(start = 24.dp, end = 12.dp, bottom = 12.dp)
 
 private val YearsVerticalPadding = 16.dp
 
diff --git a/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/DateRangeInput.kt b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/DateRangeInput.kt
index 799aa44..c123aa3 100644
--- a/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/DateRangeInput.kt
+++ b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/DateRangeInput.kt
@@ -44,25 +44,25 @@
 ) {
     // Obtain the DateInputFormat for the default Locale.
     val defaultLocale = defaultLocale()
-    val dateInputFormat = remember(defaultLocale) {
-        calendarModel.getDateInputFormat(defaultLocale)
-    }
+    val dateInputFormat =
+        remember(defaultLocale) { calendarModel.getDateInputFormat(defaultLocale) }
     val errorDatePattern = getString(Strings.DateInputInvalidForPattern)
     val errorDateOutOfYearRange = getString(Strings.DateInputInvalidYearRange)
     val errorInvalidNotAllowed = getString(Strings.DateInputInvalidNotAllowed)
     val errorInvalidRange = getString(Strings.DateRangeInputInvalidRangeInput)
-    val dateInputValidator = remember(dateInputFormat, dateFormatter) {
-        DateInputValidator(
-            yearRange = yearRange,
-            selectableDates = selectableDates,
-            dateInputFormat = dateInputFormat,
-            dateFormatter = dateFormatter,
-            errorDatePattern = errorDatePattern,
-            errorDateOutOfYearRange = errorDateOutOfYearRange,
-            errorInvalidNotAllowed = errorInvalidNotAllowed,
-            errorInvalidRangeInput = errorInvalidRange
-        )
-    }
+    val dateInputValidator =
+        remember(dateInputFormat, dateFormatter) {
+            DateInputValidator(
+                yearRange = yearRange,
+                selectableDates = selectableDates,
+                dateInputFormat = dateInputFormat,
+                dateFormatter = dateFormatter,
+                errorDatePattern = errorDatePattern,
+                errorDateOutOfYearRange = errorDateOutOfYearRange,
+                errorInvalidNotAllowed = errorInvalidNotAllowed,
+                errorInvalidRangeInput = errorInvalidRange
+            )
+        }
     // Apply both start and end dates for proper validation.
     dateInputValidator.apply {
         currentStartDateMillis = selectedStartDateMillis
@@ -78,12 +78,13 @@
             modifier = Modifier.weight(0.5f),
             calendarModel = calendarModel,
             label = {
-                Text(startRangeText,
-                    modifier = Modifier.semantics {
-                        contentDescription = "$startRangeText, $pattern"
-                    })
+                Text(
+                    startRangeText,
+                    modifier =
+                        Modifier.semantics { contentDescription = "$startRangeText, $pattern" }
+                )
             },
-            placeholder = { Text(pattern, modifier = Modifier.clearAndSetSemantics { }) },
+            placeholder = { Text(pattern, modifier = Modifier.clearAndSetSemantics {}) },
             initialDateMillis = selectedStartDateMillis,
             onDateSelectionChange = { startDateMillis ->
                 // Delegate to the onDatesSelectionChange and change just the start date.
@@ -100,12 +101,12 @@
             modifier = Modifier.weight(0.5f),
             calendarModel = calendarModel,
             label = {
-                Text(endRangeText,
-                    modifier = Modifier.semantics {
-                        contentDescription = "$endRangeText, $pattern"
-                    })
+                Text(
+                    endRangeText,
+                    modifier = Modifier.semantics { contentDescription = "$endRangeText, $pattern" }
+                )
             },
-            placeholder = { Text(pattern, modifier = Modifier.clearAndSetSemantics { }) },
+            placeholder = { Text(pattern, modifier = Modifier.clearAndSetSemantics {}) },
             initialDateMillis = selectedEndDateMillis,
             onDateSelectionChange = { endDateMillis ->
                 // Delegate to the onDatesSelectionChange and change just the end date.
diff --git a/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/DateRangePicker.kt b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/DateRangePicker.kt
index 0602a6f..8855357 100644
--- a/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/DateRangePicker.kt
+++ b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/DateRangePicker.kt
@@ -45,7 +45,6 @@
 import androidx.compose.runtime.saveable.rememberSaveable
 import androidx.compose.ui.Alignment
 import androidx.compose.ui.Modifier
-import androidx.compose.ui.draw.drawWithContent
 import androidx.compose.ui.geometry.Offset
 import androidx.compose.ui.geometry.Size
 import androidx.compose.ui.graphics.Color
@@ -67,13 +66,16 @@
 import kotlinx.coroutines.launch
 
 /**
- * <a href="https://m3.material.io/components/date-pickers/overview" class="external" target="_blank">Material Design date range picker</a>.
+ * <a href="https://m3.material.io/components/date-pickers/overview" class="external"
+ * target="_blank">Material Design date range picker</a>.
  *
  * Date range pickers let people select a range of dates and can be embedded into Dialogs.
  *
- * ![Date range picker image](https://developer.android.com/images/reference/androidx/compose/material3/range-picker.png)
+ * ![Date range picker
+ * image](https://developer.android.com/images/reference/androidx/compose/material3/range-picker.png)
  *
  * A simple DateRangePicker looks like:
+ *
  * @sample androidx.compose.material3.samples.DateRangePickerSample
  *
  * @param state state of the date range picker. See [rememberDateRangePickerState].
@@ -82,9 +84,9 @@
  * @param title the title to be displayed in the date range picker
  * @param headline the headline to be displayed in the date range picker
  * @param showModeToggle indicates if this DateRangePicker should show a mode toggle action that
- * transforms it into a date range input
- * @param colors [DatePickerColors] that will be used to resolve the colors used for this date
- * range picker in different states. See [DatePickerDefaults.colors].
+ *   transforms it into a date range input
+ * @param colors [DatePickerColors] that will be used to resolve the colors used for this date range
+ *   picker in different states. See [DatePickerDefaults.colors].
  */
 @ExperimentalMaterial3Api
 @Composable
@@ -116,20 +118,21 @@
         modifier = modifier,
         title = title,
         headline = headline,
-        modeToggleButton = if (showModeToggle) {
-            {
-                DisplayModeToggleButton(
-                    modifier = Modifier.padding(DatePickerModeTogglePadding),
-                    displayMode = state.displayMode,
-                    onDisplayModeChange = { displayMode -> state.displayMode = displayMode },
-                )
-            }
-        } else {
-            null
-        },
+        modeToggleButton =
+            if (showModeToggle) {
+                {
+                    DisplayModeToggleButton(
+                        modifier = Modifier.padding(DatePickerModeTogglePadding),
+                        displayMode = state.displayMode,
+                        onDisplayModeChange = { displayMode -> state.displayMode = displayMode },
+                    )
+                }
+            } else {
+                null
+            },
         headlineTextStyle = DatePickerModalTokens.RangeSelectionHeaderHeadlineFont.value,
-        headerMinHeight = DatePickerModalTokens.RangeSelectionHeaderContainerHeight -
-            HeaderHeightOffset,
+        headerMinHeight =
+            DatePickerModalTokens.RangeSelectionHeaderContainerHeight - HeaderHeightOffset,
         colors = colors,
     ) {
         SwitchableDateEntryContent(
@@ -174,8 +177,7 @@
      *
      * @see [setSelection] for setting this value along with the [selectedEndDateMillis].
      */
-    @get:Suppress("AutoBoxing")
-    val selectedStartDateMillis: Long?
+    @get:Suppress("AutoBoxing") val selectedStartDateMillis: Long?
 
     /**
      * A timestamp that represents the selected end date _start_ of the day in _UTC_ milliseconds
@@ -183,26 +185,21 @@
      *
      * @see [setSelection] for setting this value along with the [selectedStartDateMillis].
      */
-    @get:Suppress("AutoBoxing")
-    val selectedEndDateMillis: Long?
+    @get:Suppress("AutoBoxing") val selectedEndDateMillis: Long?
 
     /**
      * A timestamp that represents the currently displayed month _start_ date in _UTC_ milliseconds
      * from the epoch.
      *
      * @throws IllegalArgumentException in case the value is set with a timestamp that does not fall
-     * within the [yearRange].
+     *   within the [yearRange].
      */
     var displayedMonthMillis: Long
 
-    /**
-     * A [DisplayMode] that represents the current UI mode (i.e. picker or input).
-     */
+    /** A [DisplayMode] that represents the current UI mode (i.e. picker or input). */
     var displayMode: DisplayMode
 
-    /**
-     * An [IntRange] that holds the year range that the date picker will be limited to.
-     */
+    /** An [IntRange] that holds the year range that the date picker will be limited to. */
     val yearRange: IntRange
 
     /**
@@ -221,11 +218,11 @@
      * [IllegalArgumentException] is thrown.
      *
      * @param startDateMillis timestamp in _UTC_ milliseconds from the epoch that represents the
-     * start date selection. Provide a `null` to indicate no selection.
-     * @param endDateMillis timestamp in _UTC_ milliseconds from the epoch that represents the
-     * end date selection. Provide a `null` to indicate no selection.
+     *   start date selection. Provide a `null` to indicate no selection.
+     * @param endDateMillis timestamp in _UTC_ milliseconds from the epoch that represents the end
+     *   date selection. Provide a `null` to indicate no selection.
      * @throws IllegalArgumentException in case the given timestamps do not comply with the expected
-     * values specified above.
+     *   values specified above.
      */
     fun setSelection(
         @Suppress("AutoBoxing") startDateMillis: Long?,
@@ -239,35 +236,32 @@
  * To create a date range picker state outside composition, see the `DateRangePickerState` function.
  *
  * @param initialSelectedStartDateMillis timestamp in _UTC_ milliseconds from the epoch that
- * represents an initial selection of a start date. Provide a `null` to indicate no selection.
+ *   represents an initial selection of a start date. Provide a `null` to indicate no selection.
  * @param initialSelectedEndDateMillis timestamp in _UTC_ milliseconds from the epoch that
- * represents an initial selection of an end date. Provide a `null` to indicate no selection.
+ *   represents an initial selection of an end date. Provide a `null` to indicate no selection.
  * @param initialDisplayedMonthMillis timestamp in _UTC_ milliseconds from the epoch that represents
- * an initial selection of a month to be displayed to the user. By default, in case an
- * `initialSelectedStartDateMillis` is provided, the initial displayed month would be the month of
- * the selected date. Otherwise, in case `null` is provided, the displayed month would be the
- * current one.
+ *   an initial selection of a month to be displayed to the user. By default, in case an
+ *   `initialSelectedStartDateMillis` is provided, the initial displayed month would be the month of
+ *   the selected date. Otherwise, in case `null` is provided, the displayed month would be the
+ *   current one.
  * @param yearRange an [IntRange] that holds the year range that the date range picker will be
- * limited to
+ *   limited to
  * @param initialDisplayMode an initial [DisplayMode] that this state will hold
- * @param selectableDates a [SelectableDates] that is consulted to check if a date is allowed.
- * In case a date is not allowed to be selected, it will appear disabled in the UI.
+ * @param selectableDates a [SelectableDates] that is consulted to check if a date is allowed. In
+ *   case a date is not allowed to be selected, it will appear disabled in the UI.
  */
 @Composable
 @ExperimentalMaterial3Api
 fun rememberDateRangePickerState(
     @Suppress("AutoBoxing") initialSelectedStartDateMillis: Long? = null,
     @Suppress("AutoBoxing") initialSelectedEndDateMillis: Long? = null,
-    @Suppress("AutoBoxing") initialDisplayedMonthMillis: Long? =
-        initialSelectedStartDateMillis,
+    @Suppress("AutoBoxing") initialDisplayedMonthMillis: Long? = initialSelectedStartDateMillis,
     yearRange: IntRange = DatePickerDefaults.YearRange,
     initialDisplayMode: DisplayMode = DisplayMode.Picker,
     selectableDates: SelectableDates = DatePickerDefaults.AllDates
 ): DateRangePickerState {
     val locale = defaultLocale()
-    return rememberSaveable(
-        saver = DateRangePickerStateImpl.Saver(selectableDates, locale)
-    ) {
+    return rememberSaveable(saver = DateRangePickerStateImpl.Saver(selectableDates, locale)) {
         DateRangePickerStateImpl(
             initialSelectedStartDateMillis = initialSelectedStartDateMillis,
             initialSelectedEndDateMillis = initialSelectedEndDateMillis,
@@ -287,49 +281,46 @@
  * composition.
  *
  * @param locale a [CalendarLocale] to be used when formatting dates, determining the input format,
- * and more
+ *   and more
  * @param initialSelectedStartDateMillis timestamp in _UTC_ milliseconds from the epoch that
- * represents an initial selection of a start date. Provide a `null` to indicate no selection.
+ *   represents an initial selection of a start date. Provide a `null` to indicate no selection.
  * @param initialSelectedEndDateMillis timestamp in _UTC_ milliseconds from the epoch that
- * represents an initial selection of an end date. Provide a `null` to indicate no selection.
- * @param initialDisplayedMonthMillis timestamp in _UTC_ milliseconds from the epoch that
- * represents an initial selection of a month to be displayed to the user. By default, in case
- * an `initialSelectedStartDateMillis` is provided, the initial displayed month would be the
- * month of the selected date. Otherwise, in case `null` is provided, the displayed month would
- * be the current one.
- * @param yearRange an [IntRange] that holds the year range that the date picker will be limited
- * to
+ *   represents an initial selection of an end date. Provide a `null` to indicate no selection.
+ * @param initialDisplayedMonthMillis timestamp in _UTC_ milliseconds from the epoch that represents
+ *   an initial selection of a month to be displayed to the user. By default, in case an
+ *   `initialSelectedStartDateMillis` is provided, the initial displayed month would be the month of
+ *   the selected date. Otherwise, in case `null` is provided, the displayed month would be the
+ *   current one.
+ * @param yearRange an [IntRange] that holds the year range that the date picker will be limited to
  * @param initialDisplayMode an initial [DisplayMode] that this state will hold
- * @param selectableDates a [SelectableDates] that is consulted to check if a date is allowed.
- * In case a date is not allowed to be selected, it will appear disabled in the UI
+ * @param selectableDates a [SelectableDates] that is consulted to check if a date is allowed. In
+ *   case a date is not allowed to be selected, it will appear disabled in the UI
+ * @throws IllegalArgumentException if the initial timestamps do not fall within the year range this
+ *   state is created with, or the end date precedes the start date, or when an end date is provided
+ *   without a start date (e.g. the start date was null, while the end date was not).
  * @see rememberDateRangePickerState
- * @throws IllegalArgumentException if the initial timestamps do not fall within the year range
- * this state is created with, or the end date precedes the start date, or when an end date is
- * provided without a start date (e.g. the start date was null, while the end date was not).
  */
 @ExperimentalMaterial3Api
 fun DateRangePickerState(
     locale: CalendarLocale,
     @Suppress("AutoBoxing") initialSelectedStartDateMillis: Long? = null,
     @Suppress("AutoBoxing") initialSelectedEndDateMillis: Long? = null,
-    @Suppress("AutoBoxing") initialDisplayedMonthMillis: Long? =
-        initialSelectedStartDateMillis,
+    @Suppress("AutoBoxing") initialDisplayedMonthMillis: Long? = initialSelectedStartDateMillis,
     yearRange: IntRange = DatePickerDefaults.YearRange,
     initialDisplayMode: DisplayMode = DisplayMode.Picker,
     selectableDates: SelectableDates = DatePickerDefaults.AllDates
-): DateRangePickerState = DateRangePickerStateImpl(
-    initialSelectedStartDateMillis = initialSelectedStartDateMillis,
-    initialSelectedEndDateMillis = initialSelectedEndDateMillis,
-    initialDisplayedMonthMillis = initialDisplayedMonthMillis,
-    yearRange = yearRange,
-    initialDisplayMode = initialDisplayMode,
-    selectableDates = selectableDates,
-    locale = locale
-)
+): DateRangePickerState =
+    DateRangePickerStateImpl(
+        initialSelectedStartDateMillis = initialSelectedStartDateMillis,
+        initialSelectedEndDateMillis = initialSelectedEndDateMillis,
+        initialDisplayedMonthMillis = initialDisplayedMonthMillis,
+        yearRange = yearRange,
+        initialDisplayMode = initialDisplayMode,
+        selectableDates = selectableDates,
+        locale = locale
+    )
 
-/**
- * Contains default values used by the [DateRangePicker].
- */
+/** Contains default values used by the [DateRangePicker]. */
 @ExperimentalMaterial3Api
 @Stable
 object DateRangePickerDefaults {
@@ -343,15 +334,10 @@
     @Composable
     fun DateRangePickerTitle(displayMode: DisplayMode, modifier: Modifier = Modifier) {
         when (displayMode) {
-            DisplayMode.Picker -> Text(
-                getString(string = Strings.DateRangePickerTitle),
-                modifier = modifier
-            )
-
-            DisplayMode.Input -> Text(
-                getString(string = Strings.DateRangeInputTitle),
-                modifier = modifier
-            )
+            DisplayMode.Picker ->
+                Text(getString(string = Strings.DateRangePickerTitle), modifier = modifier)
+            DisplayMode.Input ->
+                Text(getString(string = Strings.DateRangeInputTitle), modifier = modifier)
         }
     }
 
@@ -359,10 +345,10 @@
      * A default date picker headline composable lambda that displays a default headline text when
      * there is no date selection, and an actual date string when there is.
      *
-     * @param selectedStartDateMillis a timestamp that represents the selected start date _start_
-     * of the day in _UTC_ milliseconds from the epoch
+     * @param selectedStartDateMillis a timestamp that represents the selected start date _start_ of
+     *   the day in _UTC_ milliseconds from the epoch
      * @param selectedEndDateMillis a timestamp that represents the selected end date _start_ of the
-     * day in _UTC_ milliseconds from the epoch
+     *   day in _UTC_ milliseconds from the epoch
      * @param displayMode the current [DisplayMode]
      * @param dateFormatter a [DatePickerFormatter]
      * @param modifier a [Modifier] to be applied for the headline
@@ -392,28 +378,28 @@
     }
 
     /**
-     * A date picker headline composable lambda that displays a default headline text when
-     * there is no date selection, and an actual date string when there is.
+     * A date picker headline composable lambda that displays a default headline text when there is
+     * no date selection, and an actual date string when there is.
      *
-     * @param selectedStartDateMillis a timestamp that represents the selected start date _start_
-     * of the day in _UTC_ milliseconds from the epoch
+     * @param selectedStartDateMillis a timestamp that represents the selected start date _start_ of
+     *   the day in _UTC_ milliseconds from the epoch
      * @param selectedEndDateMillis a timestamp that represents the selected end date _start_ of the
-     * day in _UTC_ milliseconds from the epoch
+     *   day in _UTC_ milliseconds from the epoch
      * @param displayMode the current [DisplayMode]
      * @param dateFormatter a [DatePickerFormatter]
      * @param modifier a [Modifier] to be applied for the headline
      * @param startDateText a string that, by default, be used as the text content for the
-     * [startDatePlaceholder], as well as a prefix for the content description for the selected
-     * start date
+     *   [startDatePlaceholder], as well as a prefix for the content description for the selected
+     *   start date
      * @param endDateText a string that, by default, be used as the text content for the
-     * [endDatePlaceholder], as well as a prefix for the content description for the selected
-     * end date
+     *   [endDatePlaceholder], as well as a prefix for the content description for the selected end
+     *   date
      * @param startDatePlaceholder a composable to be displayed as a headline placeholder for the
-     * start date (i.e. a [Text] with a "Start date" string)
+     *   start date (i.e. a [Text] with a "Start date" string)
      * @param endDatePlaceholder a composable to be displayed as a headline placeholder for the end
-     * date (i.e a [Text] with an "End date" string)
-     * @param datesDelimiter a composable to be displayed as a headline delimiter between the
-     * start and the end dates
+     *   date (i.e a [Text] with an "End date" string)
+     * @param datesDelimiter a composable to be displayed as a headline delimiter between the start
+     *   and the end dates
      */
     @Composable
     private fun DateRangePickerHeadline(
@@ -429,44 +415,45 @@
         datesDelimiter: @Composable () -> Unit,
     ) {
         val defaultLocale = defaultLocale()
-        val formatterStartDate = dateFormatter.formatDate(
-            dateMillis = selectedStartDateMillis,
-            locale = defaultLocale
-        )
+        val formatterStartDate =
+            dateFormatter.formatDate(dateMillis = selectedStartDateMillis, locale = defaultLocale)
 
-        val formatterEndDate = dateFormatter.formatDate(
-            dateMillis = selectedEndDateMillis,
-            locale = defaultLocale
-        )
+        val formatterEndDate =
+            dateFormatter.formatDate(dateMillis = selectedEndDateMillis, locale = defaultLocale)
 
-        val verboseStartDateDescription = dateFormatter.formatDate(
-            dateMillis = selectedStartDateMillis,
-            locale = defaultLocale,
-            forContentDescription = true
-        ) ?: when (displayMode) {
-            DisplayMode.Picker -> getString(Strings.DatePickerNoSelectionDescription)
-            DisplayMode.Input -> getString(Strings.DateInputNoInputDescription)
-            else -> ""
-        }
+        val verboseStartDateDescription =
+            dateFormatter.formatDate(
+                dateMillis = selectedStartDateMillis,
+                locale = defaultLocale,
+                forContentDescription = true
+            )
+                ?: when (displayMode) {
+                    DisplayMode.Picker -> getString(Strings.DatePickerNoSelectionDescription)
+                    DisplayMode.Input -> getString(Strings.DateInputNoInputDescription)
+                    else -> ""
+                }
 
-        val verboseEndDateDescription = dateFormatter.formatDate(
-            dateMillis = selectedEndDateMillis,
-            locale = defaultLocale,
-            forContentDescription = true
-        ) ?: when (displayMode) {
-            DisplayMode.Picker -> getString(Strings.DatePickerNoSelectionDescription)
-            DisplayMode.Input -> getString(Strings.DateInputNoInputDescription)
-            else -> ""
-        }
+        val verboseEndDateDescription =
+            dateFormatter.formatDate(
+                dateMillis = selectedEndDateMillis,
+                locale = defaultLocale,
+                forContentDescription = true
+            )
+                ?: when (displayMode) {
+                    DisplayMode.Picker -> getString(Strings.DatePickerNoSelectionDescription)
+                    DisplayMode.Input -> getString(Strings.DateInputNoInputDescription)
+                    else -> ""
+                }
 
         val startHeadlineDescription = "$startDateText: $verboseStartDateDescription"
         val endHeadlineDescription = "$endDateText: $verboseEndDateDescription"
 
         Row(
-            modifier = modifier.clearAndSetSemantics {
-                liveRegion = LiveRegionMode.Polite
-                contentDescription = "$startHeadlineDescription, $endHeadlineDescription"
-            },
+            modifier =
+                modifier.clearAndSetSemantics {
+                    liveRegion = LiveRegionMode.Polite
+                    contentDescription = "$startHeadlineDescription, $endHeadlineDescription"
+                },
             verticalAlignment = Alignment.CenterVertically,
             horizontalArrangement = Arrangement.spacedBy(4.dp),
         ) {
@@ -492,25 +479,24 @@
  * _beginning_ of the selected days (i.e. midnight in _UTC_ milliseconds from the epoch).
  *
  * @param initialSelectedStartDateMillis timestamp in _UTC_ milliseconds from the epoch that
- * represents an initial selection of a start date. Provide a `null` to indicate no selection.
+ *   represents an initial selection of a start date. Provide a `null` to indicate no selection.
  * @param initialSelectedEndDateMillis timestamp in _UTC_ milliseconds from the epoch that
- * represents an initial selection of an end date. Provide a `null` to indicate no selection.
- * @param initialDisplayedMonthMillis timestamp in _UTC_ milliseconds from the epoch that
- * represents an initial selection of a month to be displayed to the user. By default, in case
- * an `initialSelectedStartDateMillis` is provided, the initial displayed month would be the
- * month of the selected date. Otherwise, in case `null` is provided, the displayed month would
- * be the current one.
- * @param yearRange an [IntRange] that holds the year range that the date picker will be limited
- * to
+ *   represents an initial selection of an end date. Provide a `null` to indicate no selection.
+ * @param initialDisplayedMonthMillis timestamp in _UTC_ milliseconds from the epoch that represents
+ *   an initial selection of a month to be displayed to the user. By default, in case an
+ *   `initialSelectedStartDateMillis` is provided, the initial displayed month would be the month of
+ *   the selected date. Otherwise, in case `null` is provided, the displayed month would be the
+ *   current one.
+ * @param yearRange an [IntRange] that holds the year range that the date picker will be limited to
  * @param initialDisplayMode an initial [DisplayMode] that this state will hold
- * @param selectableDates a [SelectableDates] that is consulted to check if a date is allowed.
- * In case a date is not allowed to be selected, it will appear disabled in the UI
+ * @param selectableDates a [SelectableDates] that is consulted to check if a date is allowed. In
+ *   case a date is not allowed to be selected, it will appear disabled in the UI
  * @param locale a [CalendarLocale] to be used when formatting dates, determining the input format,
- * and more
+ *   and more
+ * @throws IllegalArgumentException if the initial timestamps do not fall within the year range this
+ *   state is created with, or the end date precedes the start date, or when an end date is provided
+ *   without a start date (e.g. the start date was null, while the end date was not).
  * @see rememberDateRangePickerState
- * @throws IllegalArgumentException if the initial timestamps do not fall within the year range
- * this state is created with, or the end date precedes the start date, or when an end date is
- * provided without a start date (e.g. the start date was null, while the end date was not).
  */
 @ExperimentalMaterial3Api
 @Stable
@@ -522,26 +508,17 @@
     initialDisplayMode: DisplayMode,
     selectableDates: SelectableDates,
     locale: CalendarLocale
-) : BaseDatePickerStateImpl(
-    initialDisplayedMonthMillis,
-    yearRange,
-    selectableDates,
-    locale
-), DateRangePickerState {
+) :
+    BaseDatePickerStateImpl(initialDisplayedMonthMillis, yearRange, selectableDates, locale),
+    DateRangePickerState {
 
-    /**
-     * A mutable state of [CalendarDate] that represents a selected start date.
-     */
+    /** A mutable state of [CalendarDate] that represents a selected start date. */
     private var _selectedStartDate = mutableStateOf<CalendarDate?>(null)
 
-    /**
-     * A mutable state of [CalendarDate] that represents a selected end date.
-     */
+    /** A mutable state of [CalendarDate] that represents a selected end date. */
     private var _selectedEndDate = mutableStateOf<CalendarDate?>(null)
 
-    /**
-     * Initialize the state with the provided initial selections.
-     */
+    /** Initialize the state with the provided initial selections. */
     init {
         setSelection(
             startDateMillis = initialSelectedStartDateMillis,
@@ -556,7 +533,7 @@
      * In case no date was selected or provided, the state will hold a `null` value.
      *
      * @throws IllegalArgumentException in case a set timestamp does not fall within the year range
-     * this state was created with.
+     *   this state was created with.
      */
     override val selectedStartDateMillis: Long?
         @Suppress("AutoBoxing") get() = _selectedStartDate.value?.utcTimeMillis
@@ -568,14 +545,14 @@
      * In case no date was selected or provided, the state will hold a `null` value.
      *
      * @throws IllegalArgumentException in case a set timestamp does not fall within the year range
-     * this state was created with.
+     *   this state was created with.
      */
     override val selectedEndDateMillis: Long?
         @Suppress("AutoBoxing") get() = _selectedEndDate.value?.utcTimeMillis
 
     /**
-     * A mutable state of [DisplayMode] that represents the current display mode of the UI
-     * (i.e. picker or input).
+     * A mutable state of [DisplayMode] that represents the current display mode of the UI (i.e.
+     * picker or input).
      */
     private var _displayMode = mutableStateOf(initialDisplayMode)
 
@@ -592,16 +569,18 @@
         @Suppress("AutoBoxing") startDateMillis: Long?,
         @Suppress("AutoBoxing") endDateMillis: Long?
     ) {
-        val startDate = if (startDateMillis != null) {
-            calendarModel.getCanonicalDate(startDateMillis)
-        } else {
-            null
-        }
-        val endDate = if (endDateMillis != null) {
-            calendarModel.getCanonicalDate(endDateMillis)
-        } else {
-            null
-        }
+        val startDate =
+            if (startDateMillis != null) {
+                calendarModel.getCanonicalDate(startDateMillis)
+            } else {
+                null
+            }
+        val endDate =
+            if (endDateMillis != null) {
+                calendarModel.getCanonicalDate(endDateMillis)
+            } else {
+                null
+            }
         // Validate that both dates are within the valid years range.
         startDate?.let {
             require(yearRange.contains(it.year)) {
@@ -615,9 +594,7 @@
         }
         // Validate that an end date cannot be set without a start date.
         if (endDate != null) {
-            requireNotNull(startDate) {
-                "An end date was provided without a start date."
-            }
+            requireNotNull(startDate) { "An end date was provided without a start date." }
             // Validate that the end date appears on or after the start date.
             require(startDate.utcTimeMillis <= endDate.utcTimeMillis) {
                 "The provided end date appears before the start date."
@@ -632,7 +609,7 @@
          * The default [Saver] implementation for [DateRangePickerStateImpl].
          *
          * @param selectableDates a [SelectableDates] instance that is consulted to check if a date
-         * is allowed
+         *   is allowed
          */
         fun Saver(
             selectableDates: SelectableDates,
@@ -688,34 +665,37 @@
     Crossfade(
         targetState = displayMode,
         animationSpec = spring(),
-        modifier = Modifier.semantics {
-            @Suppress("DEPRECATION")
-            isContainer = true
-        }) { mode ->
+        modifier =
+            Modifier.semantics {
+                @Suppress("DEPRECATION")
+                isContainer = true
+            }
+    ) { mode ->
         when (mode) {
-            DisplayMode.Picker -> DateRangePickerContent(
-                selectedStartDateMillis = selectedStartDateMillis,
-                selectedEndDateMillis = selectedEndDateMillis,
-                displayedMonthMillis = displayedMonthMillis,
-                onDatesSelectionChange = onDatesSelectionChange,
-                onDisplayedMonthChange = onDisplayedMonthChange,
-                calendarModel = calendarModel,
-                yearRange = yearRange,
-                dateFormatter = dateFormatter,
-                selectableDates = selectableDates,
-                colors = colors
-            )
-
-            DisplayMode.Input -> DateRangeInputContent(
-                selectedStartDateMillis = selectedStartDateMillis,
-                selectedEndDateMillis = selectedEndDateMillis,
-                onDatesSelectionChange = onDatesSelectionChange,
-                calendarModel = calendarModel,
-                yearRange = yearRange,
-                dateFormatter = dateFormatter,
-                selectableDates = selectableDates,
-                colors = colors
-            )
+            DisplayMode.Picker ->
+                DateRangePickerContent(
+                    selectedStartDateMillis = selectedStartDateMillis,
+                    selectedEndDateMillis = selectedEndDateMillis,
+                    displayedMonthMillis = displayedMonthMillis,
+                    onDatesSelectionChange = onDatesSelectionChange,
+                    onDisplayedMonthChange = onDisplayedMonthChange,
+                    calendarModel = calendarModel,
+                    yearRange = yearRange,
+                    dateFormatter = dateFormatter,
+                    selectableDates = selectableDates,
+                    colors = colors
+                )
+            DisplayMode.Input ->
+                DateRangeInputContent(
+                    selectedStartDateMillis = selectedStartDateMillis,
+                    selectedEndDateMillis = selectedEndDateMillis,
+                    onDatesSelectionChange = onDatesSelectionChange,
+                    calendarModel = calendarModel,
+                    yearRange = yearRange,
+                    dateFormatter = dateFormatter,
+                    selectableDates = selectableDates,
+                    colors = colors
+                )
         }
     }
 }
@@ -773,15 +753,14 @@
     colors: DatePickerColors
 ) {
     val today = calendarModel.today
-    val firstMonth = remember(yearRange) {
-        calendarModel.getMonth(
-            year = yearRange.first,
-            month = 1 // January
-        )
-    }
-    ProvideTextStyle(
-        DatePickerModalTokens.DateLabelTextFont.value
-    ) {
+    val firstMonth =
+        remember(yearRange) {
+            calendarModel.getMonth(
+                year = yearRange.first,
+                month = 1 // January
+            )
+        }
+    ProvideTextStyle(DatePickerModalTokens.DateLabelTextFont.value) {
         val coroutineScope = rememberCoroutineScope()
         val scrollToPreviousMonthLabel = getString(Strings.DateRangePickerScrollToShowPreviousMonth)
         val scrollToNextMonthLabel = getString(Strings.DateRangePickerScrollToShowNextMonth)
@@ -808,49 +787,36 @@
         LazyColumn(
             // Apply this to have the screen reader traverse outside the visible list of months
             // and not scroll them by default.
-            modifier = Modifier.semantics {
-                verticalScrollAxisRange = ScrollAxisRange(value = { 0f }, maxValue = { 0f })
-            },
+            modifier =
+                Modifier.semantics {
+                    verticalScrollAxisRange = ScrollAxisRange(value = { 0f }, maxValue = { 0f })
+                },
             state = lazyListState
         ) {
             items(numberOfMonthsInRange(yearRange)) {
-                val month =
-                    calendarModel.plusMonths(
-                        from = firstMonth,
-                        addedMonthsCount = it
-                    )
-                Column(
-                    modifier = Modifier.fillParentMaxWidth()
-                ) {
-                    ProvideTextStyle(
-                        DatePickerModalTokens.RangeSelectionMonthSubheadFont.value
-                    ) {
+                val month = calendarModel.plusMonths(from = firstMonth, addedMonthsCount = it)
+                Column(modifier = Modifier.fillParentMaxWidth()) {
+                    ProvideTextStyle(DatePickerModalTokens.RangeSelectionMonthSubheadFont.value) {
                         Text(
-                            text = dateFormatter.formatMonthYear(
-                                month.startUtcTimeMillis,
-                                defaultLocale()
-                            ) ?: "-",
-                            modifier = Modifier
-                                .padding(paddingValues = CalendarMonthSubheadPadding)
-                                .semantics {
-                                    customActions = customAccessibilityAction
-                                },
+                            text =
+                                dateFormatter.formatMonthYear(
+                                    month.startUtcTimeMillis,
+                                    defaultLocale()
+                                ) ?: "-",
+                            modifier =
+                                Modifier.padding(paddingValues = CalendarMonthSubheadPadding)
+                                    .semantics { customActions = customAccessibilityAction },
                             color = colors.subheadContentColor
                         )
                     }
                     val rangeSelectionInfo: SelectedRangeInfo? =
-                        if (selectedStartDateMillis != null &&
-                            selectedEndDateMillis != null
-                        ) {
+                        if (selectedStartDateMillis != null && selectedEndDateMillis != null) {
                             remember(selectedStartDateMillis, selectedEndDateMillis) {
                                 SelectedRangeInfo.calculateRangeInfo(
                                     month = month,
-                                    startDate = calendarModel.getCanonicalDate(
-                                        selectedStartDateMillis
-                                    ),
-                                    endDate = calendarModel.getCanonicalDate(
-                                        selectedEndDateMillis
-                                    )
+                                    startDate =
+                                        calendarModel.getCanonicalDate(selectedStartDateMillis),
+                                    endDate = calendarModel.getCanonicalDate(selectedEndDateMillis)
                                 )
                             }
                         } else {
@@ -887,8 +853,9 @@
     currentEndDateMillis: Long?,
     onDatesSelectionChange: (startDateMillis: Long?, endDateMillis: Long?) -> Unit
 ) {
-    if ((currentStartDateMillis == null && currentEndDateMillis == null) ||
-        (currentStartDateMillis != null && currentEndDateMillis != null)
+    if (
+        (currentStartDateMillis == null && currentEndDateMillis == null) ||
+            (currentStartDateMillis != null && currentEndDateMillis != null)
     ) {
         // Set the selection to "start" only.
         onDatesSelectionChange(dateInMillis, null)
@@ -901,11 +868,7 @@
     }
 }
 
-internal val CalendarMonthSubheadPadding = PaddingValues(
-    start = 24.dp,
-    top = 20.dp,
-    bottom = 8.dp
-)
+internal val CalendarMonthSubheadPadding = PaddingValues(start = 24.dp, top = 20.dp, bottom = 8.dp)
 
 /**
  * a helper class for drawing a range selection. The class holds information about the selected
@@ -933,33 +896,35 @@
             startDate: CalendarDate,
             endDate: CalendarDate
         ): SelectedRangeInfo? {
-            if (startDate.utcTimeMillis > month.endUtcTimeMillis ||
-                endDate.utcTimeMillis < month.startUtcTimeMillis
+            if (
+                startDate.utcTimeMillis > month.endUtcTimeMillis ||
+                    endDate.utcTimeMillis < month.startUtcTimeMillis
             ) {
                 return null
             }
             val firstIsSelectionStart = startDate.utcTimeMillis >= month.startUtcTimeMillis
             val lastIsSelectionEnd = endDate.utcTimeMillis <= month.endUtcTimeMillis
-            val startGridItemOffset = if (firstIsSelectionStart) {
-                month.daysFromStartOfWeekToFirstOfMonth + startDate.dayOfMonth - 1
-            } else {
-                month.daysFromStartOfWeekToFirstOfMonth
-            }
-            val endGridItemOffset = if (lastIsSelectionEnd) {
-                month.daysFromStartOfWeekToFirstOfMonth + endDate.dayOfMonth - 1
-            } else {
-                month.daysFromStartOfWeekToFirstOfMonth + month.numberOfDays - 1
-            }
+            val startGridItemOffset =
+                if (firstIsSelectionStart) {
+                    month.daysFromStartOfWeekToFirstOfMonth + startDate.dayOfMonth - 1
+                } else {
+                    month.daysFromStartOfWeekToFirstOfMonth
+                }
+            val endGridItemOffset =
+                if (lastIsSelectionEnd) {
+                    month.daysFromStartOfWeekToFirstOfMonth + endDate.dayOfMonth - 1
+                } else {
+                    month.daysFromStartOfWeekToFirstOfMonth + month.numberOfDays - 1
+                }
 
             // Calculate the selected coordinates within the cells grid.
-            val gridStartCoordinates = IntOffset(
-                x = startGridItemOffset % DaysInWeek,
-                y = startGridItemOffset / DaysInWeek
-            )
-            val gridEndCoordinates = IntOffset(
-                x = endGridItemOffset % DaysInWeek,
-                y = endGridItemOffset / DaysInWeek
-            )
+            val gridStartCoordinates =
+                IntOffset(
+                    x = startGridItemOffset % DaysInWeek,
+                    y = startGridItemOffset / DaysInWeek
+                )
+            val gridEndCoordinates =
+                IntOffset(x = endGridItemOffset % DaysInWeek, y = endGridItemOffset / DaysInWeek)
             return SelectedRangeInfo(
                 gridStartCoordinates,
                 gridEndCoordinates,
@@ -996,13 +961,16 @@
     val (x2, y2) = selectedRangeInfo.gridEndCoordinates
     // The endX and startX are offset to include only half the item's width when dealing with first
     // and last items in the selection in order to keep the selection edges rounded.
-    var startX = x1 * (itemContainerWidth + horizontalSpaceBetweenItems) +
-        (if (selectedRangeInfo.firstIsSelectionStart) itemContainerWidth / 2 else 0f) +
-        horizontalSpaceBetweenItems / 2
+    var startX =
+        x1 * (itemContainerWidth + horizontalSpaceBetweenItems) +
+            (if (selectedRangeInfo.firstIsSelectionStart) itemContainerWidth / 2 else 0f) +
+            horizontalSpaceBetweenItems / 2
     val startY = y1 * itemContainerHeight + stateLayerVerticalPadding
-    var endX = x2 * (itemContainerWidth + horizontalSpaceBetweenItems) +
-        (if (selectedRangeInfo.lastIsSelectionEnd) itemContainerWidth / 2 else itemContainerWidth) +
-        horizontalSpaceBetweenItems / 2
+    var endX =
+        x2 * (itemContainerWidth + horizontalSpaceBetweenItems) +
+            (if (selectedRangeInfo.lastIsSelectionEnd) itemContainerWidth / 2
+            else itemContainerWidth) +
+            horizontalSpaceBetweenItems / 2
     val endY = y2 * itemContainerHeight + stateLayerVerticalPadding
 
     val isRtl = layoutDirection == LayoutDirection.Rtl
@@ -1016,14 +984,16 @@
     drawRect(
         color = color,
         topLeft = Offset(startX, startY),
-        size = Size(
-            width = when {
-                y1 == y2 -> endX - startX
-                isRtl -> -startX
-                else -> this.size.width - startX
-            },
-            height = itemStateLayerHeight
-        )
+        size =
+            Size(
+                width =
+                    when {
+                        y1 == y2 -> endX - startX
+                        isRtl -> -startX
+                        else -> this.size.width - startX
+                    },
+                height = itemStateLayerHeight
+            )
     )
 
     if (y1 != y2) {
@@ -1032,10 +1002,7 @@
             drawRect(
                 color = color,
                 topLeft = Offset(0f, startY + (y * itemContainerHeight)),
-                size = Size(
-                    width = this.size.width,
-                    height = itemStateLayerHeight
-                )
+                size = Size(width = this.size.width, height = itemStateLayerHeight)
             )
         }
         // Draw the last row selection background
@@ -1043,10 +1010,11 @@
         drawRect(
             color = color,
             topLeft = Offset(topLeftX, endY),
-            size = Size(
-                width = if (isRtl) endX - this.size.width else endX,
-                height = itemStateLayerHeight
-            )
+            size =
+                Size(
+                    width = if (isRtl) endX - this.size.width else endX,
+                    height = itemStateLayerHeight
+                )
         )
     }
 }
@@ -1061,9 +1029,7 @@
         if (!state.canScrollBackward) {
             false
         } else {
-            coroutineScope.launch {
-                state.scrollToItem(state.firstVisibleItemIndex - 1)
-            }
+            coroutineScope.launch { state.scrollToItem(state.firstVisibleItemIndex - 1) }
             true
         }
     }
@@ -1071,21 +1037,13 @@
         if (!state.canScrollForward) {
             false
         } else {
-            coroutineScope.launch {
-                state.scrollToItem(state.firstVisibleItemIndex + 1)
-            }
+            coroutineScope.launch { state.scrollToItem(state.firstVisibleItemIndex + 1) }
             true
         }
     }
     return listOf(
-        CustomAccessibilityAction(
-            label = scrollUpLabel,
-            action = scrollUpAction
-        ),
-        CustomAccessibilityAction(
-            label = scrollDownLabel,
-            action = scrollDownAction
-        )
+        CustomAccessibilityAction(label = scrollUpLabel, action = scrollUpAction),
+        CustomAccessibilityAction(label = scrollDownLabel, action = scrollDownAction)
     )
 }
 
diff --git a/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/Divider.kt b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/Divider.kt
index b99a1291..8f2dfbd 100644
--- a/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/Divider.kt
+++ b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/Divider.kt
@@ -33,15 +33,17 @@
 import androidx.compose.ui.unit.dp
 
 /**
- * <a href="https://m3.material.io/components/divider/overview" class="external" target="_blank">Material Design divider</a>.
+ * <a href="https://m3.material.io/components/divider/overview" class="external"
+ * target="_blank">Material Design divider</a>.
  *
  * A divider is a thin line that groups content in lists and layouts.
  *
- * ![Divider image](https://developer.android.com/images/reference/androidx/compose/material3/divider.png)
+ * ![Divider
+ * image](https://developer.android.com/images/reference/androidx/compose/material3/divider.png)
  *
  * @param modifier the [Modifier] to be applied to this divider line.
  * @param thickness thickness of this divider line. Using [Dp.Hairline] will produce a single pixel
- * divider regardless of screen density.
+ *   divider regardless of screen density.
  * @param color color of this divider line.
  */
 @Composable
@@ -49,25 +51,28 @@
     modifier: Modifier = Modifier,
     thickness: Dp = DividerDefaults.Thickness,
     color: Color = DividerDefaults.color,
-) = Canvas(modifier.fillMaxWidth().height(thickness)) {
-    drawLine(
-        color = color,
-        strokeWidth = thickness.toPx(),
-        start = Offset(0f, thickness.toPx() / 2),
-        end = Offset(size.width, thickness.toPx() / 2),
-    )
-}
+) =
+    Canvas(modifier.fillMaxWidth().height(thickness)) {
+        drawLine(
+            color = color,
+            strokeWidth = thickness.toPx(),
+            start = Offset(0f, thickness.toPx() / 2),
+            end = Offset(size.width, thickness.toPx() / 2),
+        )
+    }
 
 /**
- * <a href="https://m3.material.io/components/divider/overview" class="external" target="_blank">Material Design divider</a>.
+ * <a href="https://m3.material.io/components/divider/overview" class="external"
+ * target="_blank">Material Design divider</a>.
  *
  * A divider is a thin line that groups content in lists and layouts.
  *
- * ![Divider image](https://developer.android.com/images/reference/androidx/compose/material3/divider.png)
+ * ![Divider
+ * image](https://developer.android.com/images/reference/androidx/compose/material3/divider.png)
  *
  * @param modifier the [Modifier] to be applied to this divider line.
  * @param thickness thickness of this divider line. Using [Dp.Hairline] will produce a single pixel
- * divider regardless of screen density.
+ *   divider regardless of screen density.
  * @param color color of this divider line.
  */
 @Composable
@@ -75,14 +80,15 @@
     modifier: Modifier = Modifier,
     thickness: Dp = DividerDefaults.Thickness,
     color: Color = DividerDefaults.color,
-) = Canvas(modifier.fillMaxHeight().width(thickness)) {
-    drawLine(
-        color = color,
-        strokeWidth = thickness.toPx(),
-        start = Offset(thickness.toPx() / 2, 0f),
-        end = Offset(thickness.toPx() / 2, size.height),
-    )
-}
+) =
+    Canvas(modifier.fillMaxHeight().width(thickness)) {
+        drawLine(
+            color = color,
+            strokeWidth = thickness.toPx(),
+            start = Offset(thickness.toPx() / 2, 0f),
+            end = Offset(thickness.toPx() / 2, size.height),
+        )
+    }
 
 @Deprecated(
     message = "Renamed to HorizontalDivider",
@@ -94,17 +100,13 @@
     thickness: Dp = DividerDefaults.Thickness,
     color: Color = DividerDefaults.color,
 ) {
-    val targetThickness = if (thickness == Dp.Hairline) {
-        (1f / LocalDensity.current.density).dp
-    } else {
-        thickness
-    }
-    Box(
-        modifier
-            .fillMaxWidth()
-            .height(targetThickness)
-            .background(color = color)
-    )
+    val targetThickness =
+        if (thickness == Dp.Hairline) {
+            (1f / LocalDensity.current.density).dp
+        } else {
+            thickness
+        }
+    Box(modifier.fillMaxWidth().height(targetThickness).background(color = color))
 }
 
 /** Default values for [Divider] */
@@ -113,5 +115,6 @@
     val Thickness: Dp = DividerTokens.Thickness
 
     /** Default color of a divider. */
-    val color: Color @Composable get() = DividerTokens.Color.value
+    val color: Color
+        @Composable get() = DividerTokens.Color.value
 }
diff --git a/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/ExperimentalMaterial3Api.kt b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/ExperimentalMaterial3Api.kt
index 60263cf..2c67ed5 100644
--- a/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/ExperimentalMaterial3Api.kt
+++ b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/ExperimentalMaterial3Api.kt
@@ -17,8 +17,7 @@
 package androidx.compose.material3
 
 @RequiresOptIn(
-    "This material API is experimental and is likely to change or to be removed in" +
-        " the future."
+    "This material API is experimental and is likely to change or to be removed in" + " the future."
 )
 @Retention(AnnotationRetention.BINARY)
 annotation class ExperimentalMaterial3Api
diff --git a/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/ExpressiveNavigationBar.kt b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/ExpressiveNavigationBar.kt
index d826596..2e0462f 100644
--- a/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/ExpressiveNavigationBar.kt
+++ b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/ExpressiveNavigationBar.kt
@@ -55,25 +55,25 @@
  * The recommended configuration of the [ExpressiveNavigationBar] depends on the width size of the
  * screen it's being displayed at:
  * - In small screens, the [ExpressiveNavigationBar] should contain three to five
- * [ExpressiveNavigationBarItem]s, each representing a singular destination, and its [arrangement]
- * should be [NavigationBarArrangement.EqualWeight], so that the navigation items are equally
- * distributed on the bar.
+ *   [ExpressiveNavigationBarItem]s, each representing a singular destination, and its [arrangement]
+ *   should be [NavigationBarArrangement.EqualWeight], so that the navigation items are equally
+ *   distributed on the bar.
  * - In medium screens, [ExpressiveNavigationBar] should contain three to six
- * [ExpressiveNavigationBarItem]s, each representing a singular destination, and its [arrangement]
- * should be [NavigationBarArrangement.Centered], so that the navigation items are distributed
- * grouped on the center of the bar.
+ *   [ExpressiveNavigationBarItem]s, each representing a singular destination, and its [arrangement]
+ *   should be [NavigationBarArrangement.Centered], so that the navigation items are distributed
+ *   grouped on the center of the bar.
  *
  * See [ExpressiveNavigationBarItem] for configuration specific to each item, and not the overall
  * [ExpressiveNavigationBar] component.
  *
  * @param modifier the [Modifier] to be applied to this expressive navigation bar
  * @param containerColor the color used for the background of this expressive navigation bar. Use
- * [Color.Transparent] to have no color
+ *   [Color.Transparent] to have no color
  * @param contentColor the color for content inside this expressive navigation bar.
  * @param windowInsets a window insets of the expressive navigation bar
  * @param arrangement the [NavigationBarArrangement] of this expressive navigation bar
  * @param content the content of this expressive navigation bar, typically
- * [ExpressiveNavigationBarItem]s
+ *   [ExpressiveNavigationBarItem]s
  *
  * TODO: Remove "internal".
  */
@@ -92,16 +92,24 @@
         contentColor = contentColor,
     ) {
         Layout(
-            modifier = modifier
-                .windowInsetsPadding(windowInsets)
-                .defaultMinSize(minHeight = NavigationBarHeight)
-                .selectableGroup(),
+            modifier =
+                modifier
+                    .windowInsetsPadding(windowInsets)
+                    .defaultMinSize(minHeight = NavigationBarHeight)
+                    .selectableGroup(),
             content = content,
-            measurePolicy = when (arrangement) {
-                NavigationBarArrangement.EqualWeight -> { EqualWeightContentMeasurePolicy() }
-                NavigationBarArrangement.Centered -> { CenteredContentMeasurePolicy() }
-                else -> { throw IllegalArgumentException("Invalid ItemsArrangement value.") }
-            }
+            measurePolicy =
+                when (arrangement) {
+                    NavigationBarArrangement.EqualWeight -> {
+                        EqualWeightContentMeasurePolicy()
+                    }
+                    NavigationBarArrangement.Centered -> {
+                        CenteredContentMeasurePolicy()
+                    }
+                    else -> {
+                        throw IllegalArgumentException("Invalid ItemsArrangement value.")
+                    }
+                }
         )
     }
 }
@@ -118,7 +126,7 @@
          * The items are equally distributed on the Expressive Navigation Bar.
          *
          * This configuration is recommended for small width screens.
-        */
+         */
         val EqualWeight = NavigationBarArrangement(0)
 
         /*
@@ -129,11 +137,12 @@
         val Centered = NavigationBarArrangement(1)
     }
 
-    override fun toString() = when (this) {
-        EqualWeight -> "EqualWeight"
-        Centered -> "Centered"
-        else -> "Unknown"
-    }
+    override fun toString() =
+        when (this) {
+            EqualWeight -> "EqualWeight"
+            Centered -> "Centered"
+            else -> "Unknown"
+        }
 }
 
 /**
@@ -148,28 +157,28 @@
  * The [ExpressiveNavigationBarItem] supports two different icon positions, top and start, which is
  * controlled by the [iconPosition] param:
  * - If the icon position is [NavigationItemIconPosition.Top] the icon will be displayed above the
- * label. This configuration is recommended for expressive navigation bars used in small width
- * screens, like a phone in portrait mode.
+ *   label. This configuration is recommended for expressive navigation bars used in small width
+ *   screens, like a phone in portrait mode.
  * - If the icon position is [NavigationItemIconPosition.Start] the icon will be displayed to the
- * start of the label. This configuration is recommended for expressive navigation bars used in
- * medium width screens, like a phone in landscape mode.
+ *   start of the label. This configuration is recommended for expressive navigation bars used in
+ *   medium width screens, like a phone in landscape mode.
  *
  * @param selected whether this item is selected
  * @param onClick called when this item is clicked
  * @param icon icon for this item, typically an [Icon]
  * @param modifier the [Modifier] to be applied to this item
  * @param enabled controls the enabled state of this item. When `false`, this component will not
- * respond to user input, and it will appear visually disabled and disabled to accessibility
- * services.
+ *   respond to user input, and it will appear visually disabled and disabled to accessibility
+ *   services.
  * @param label text label for this item
  * @param badge optional badge to show on this item, typically a [Badge]
  * @param iconPosition the [NavigationItemIconPosition] for the icon
- * @param colors [NavigationItemColors] that will be used to resolve the colors used for this
- * item in different states. See [ExpressiveNavigationBarItemDefaults.colors]
+ * @param colors [NavigationItemColors] that will be used to resolve the colors used for this item
+ *   in different states. See [ExpressiveNavigationBarItemDefaults.colors]
  * @param interactionSource an optional hoisted [MutableInteractionSource] for observing and
- * emitting [Interaction]s for this item. You can use this to change the item's appearance
- * or preview the item in different states. Note that if `null` is provided, interactions will
- * still happen internally.
+ *   emitting [Interaction]s for this item. You can use this to change the item's appearance or
+ *   preview the item in different states. Note that if `null` is provided, interactions will still
+ *   happen internally.
  *
  * TODO: Remove "internal".
  */
@@ -191,16 +200,18 @@
     val interactionSource = interactionSource ?: remember { MutableInteractionSource() }
 
     val isIconPositionTop = iconPosition == NavigationItemIconPosition.Top
-    val indicatorHorizontalPadding = if (isIconPositionTop) {
-        TopIconIndicatorHorizontalPadding
-    } else {
-        StartIconIndicatorHorizontalPadding
-    }
-    val indicatorVerticalPadding = if (isIconPositionTop) {
-        TopIconIndicatorVerticalPadding
-    } else {
-        StartIconIndicatorVerticalPadding
-    }
+    val indicatorHorizontalPadding =
+        if (isIconPositionTop) {
+            TopIconIndicatorHorizontalPadding
+        } else {
+            StartIconIndicatorHorizontalPadding
+        }
+    val indicatorVerticalPadding =
+        if (isIconPositionTop) {
+            TopIconIndicatorVerticalPadding
+        } else {
+            StartIconIndicatorVerticalPadding
+        }
 
     NavigationItem(
         selected = selected,
@@ -230,20 +241,25 @@
 internal object ExpressiveNavigationBarDefaults {
     /** Default container color for an expressive navigation bar. */
     // TODO: Replace with token.
-    val containerColor: Color @Composable get() = ColorSchemeKeyTokens.SurfaceContainer.value
+    val containerColor: Color
+        @Composable get() = ColorSchemeKeyTokens.SurfaceContainer.value
 
     /** Default content color for an expressive navigation bar. */
     // TODO: Replace with token.
-    val contentColor: Color @Composable get() = ColorSchemeKeyTokens.OnSurfaceVariant.value
+    val contentColor: Color
+        @Composable get() = ColorSchemeKeyTokens.OnSurfaceVariant.value
 
     /** Default arrangement for an expressive navigation bar. */
-    val arrangement: NavigationBarArrangement get() = NavigationBarArrangement.EqualWeight
+    val arrangement: NavigationBarArrangement
+        get() = NavigationBarArrangement.EqualWeight
 
     /** Default window insets to be used and consumed by the expressive navigation bar. */
     val windowInsets: WindowInsets
         @Composable
-        get() = WindowInsets.systemBarsForVisualComponents
-            .only(WindowInsetsSides.Horizontal + WindowInsetsSides.Bottom)
+        get() =
+            WindowInsets.systemBarsForVisualComponents.only(
+                WindowInsetsSides.Horizontal + WindowInsetsSides.Bottom
+            )
 }
 
 // TODO: Remove "internal".
@@ -254,22 +270,23 @@
      * Creates a [NavigationItemColors] with the provided colors according to the Material
      * specification.
      */
-    @Composable
-    fun colors() = MaterialTheme.colorScheme.defaultExpressiveNavigationBarItemColors
+    @Composable fun colors() = MaterialTheme.colorScheme.defaultExpressiveNavigationBarItemColors
 
     internal val ColorScheme.defaultExpressiveNavigationBarItemColors: NavigationItemColors
         get() {
-            return defaultExpressiveNavigationBarItemColorsCached ?: NavigationItemColors(
-                selectedIconColor = fromToken(ActiveIconColor),
-                selectedTextColor = fromToken(ActiveLabelTextColor),
-                selectedIndicatorColor = fromToken(ActiveIndicatorColor),
-                unselectedIconColor = fromToken(InactiveIconColor),
-                unselectedTextColor = fromToken(InactiveLabelTextColor),
-                disabledIconColor = fromToken(InactiveIconColor).copy(alpha = DisabledAlpha),
-                disabledTextColor = fromToken(InactiveLabelTextColor).copy(alpha = DisabledAlpha),
-            ).also {
-                defaultExpressiveNavigationBarItemColorsCached = it
-            }
+            return defaultExpressiveNavigationBarItemColorsCached
+                ?: NavigationItemColors(
+                        selectedIconColor = fromToken(ActiveIconColor),
+                        selectedTextColor = fromToken(ActiveLabelTextColor),
+                        selectedIndicatorColor = fromToken(ActiveIndicatorColor),
+                        unselectedIconColor = fromToken(InactiveIconColor),
+                        unselectedTextColor = fromToken(InactiveLabelTextColor),
+                        disabledIconColor =
+                            fromToken(InactiveIconColor).copy(alpha = DisabledAlpha),
+                        disabledTextColor =
+                            fromToken(InactiveLabelTextColor).copy(alpha = DisabledAlpha),
+                    )
+                    .also { defaultExpressiveNavigationBarItemColorsCached = it }
         }
 }
 
@@ -283,16 +300,17 @@
         val itemsCount = measurables.size
         // If there are no items, bar will be empty.
         if (itemsCount < 1) {
-            return layout(width, itemHeight) { }
+            return layout(width, itemHeight) {}
         }
 
         val itemsPlaceables: List<Placeable>
         if (!constraints.hasBoundedWidth) {
             // If width constraint is not bounded, let item containers widths be as big as they are.
             // This may lead to a different items arrangement than the expected.
-            itemsPlaceables = measurables.fastMap {
-                it.measure(constraints.constrain(Constraints.fixedHeight(height = itemHeight)))
-            }
+            itemsPlaceables =
+                measurables.fastMap {
+                    it.measure(constraints.constrain(Constraints.fixedHeight(height = itemHeight)))
+                }
         } else {
             val itemWidth = width / itemsCount
             measurables.fastForEach {
@@ -303,11 +321,14 @@
             }
 
             // Make sure the item containers have the same width and height.
-            itemsPlaceables = measurables.fastMap {
-                it.measure(
-                    constraints.constrain(Constraints.fixed(width = itemWidth, height = itemHeight))
-                )
-            }
+            itemsPlaceables =
+                measurables.fastMap {
+                    it.measure(
+                        constraints.constrain(
+                            Constraints.fixed(width = itemWidth, height = itemHeight)
+                        )
+                    )
+                }
         }
 
         return layout(width, itemHeight) {
@@ -331,7 +352,7 @@
         val itemsCount = measurables.size
         // If there are no items, bar will be empty.
         if (itemsCount < 1) {
-            return layout(width, itemHeight) { }
+            return layout(width, itemHeight) {}
         }
 
         var barHorizontalPadding = 0
@@ -339,9 +360,10 @@
         if (!constraints.hasBoundedWidth) {
             // If width constraint is not bounded, let item containers widths be as big as they are.
             // This may lead to a different items arrangement than the expected.
-            itemsPlaceables = measurables.fastMap {
-                it.measure(constraints.constrain(Constraints.fixedHeight(height = itemHeight)))
-            }
+            itemsPlaceables =
+                measurables.fastMap {
+                    it.measure(constraints.constrain(Constraints.fixedHeight(height = itemHeight)))
+                }
         } else {
             val itemMaxWidth = width / itemsCount
             barHorizontalPadding = calculateCenteredContentHorizontalPadding(itemsCount, width)
@@ -354,23 +376,24 @@
                     itemHeight = measurableHeight.coerceAtMost(constraints.maxHeight)
                 }
             }
-            itemsPlaceables = measurables.fastMap {
-                var currentItemWidth = itemMinWidth
-                val measurableWidth = it.maxIntrinsicWidth(constraints.minHeight)
-                if (currentItemWidth < measurableWidth) {
-                    // Let an item container be bigger in width if needed, but limit it to
-                    // itemMaxWidth.
-                    currentItemWidth = measurableWidth.coerceAtMost(itemMaxWidth)
-                    // Update horizontal padding so that items remain centered.
-                    barHorizontalPadding -= (currentItemWidth - itemMinWidth) / 2
-                }
+            itemsPlaceables =
+                measurables.fastMap {
+                    var currentItemWidth = itemMinWidth
+                    val measurableWidth = it.maxIntrinsicWidth(constraints.minHeight)
+                    if (currentItemWidth < measurableWidth) {
+                        // Let an item container be bigger in width if needed, but limit it to
+                        // itemMaxWidth.
+                        currentItemWidth = measurableWidth.coerceAtMost(itemMaxWidth)
+                        // Update horizontal padding so that items remain centered.
+                        barHorizontalPadding -= (currentItemWidth - itemMinWidth) / 2
+                    }
 
-                it.measure(
-                    constraints.constrain(
-                        Constraints.fixed(width = currentItemWidth, height = itemHeight)
+                    it.measure(
+                        constraints.constrain(
+                            Constraints.fixed(width = currentItemWidth, height = itemHeight)
+                        )
                     )
-                )
-            }
+                }
         }
 
         return layout(width, itemHeight) {
diff --git a/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/FloatingActionButton.kt b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/FloatingActionButton.kt
index 4f33c0b..5b9c780 100644
--- a/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/FloatingActionButton.kt
+++ b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/FloatingActionButton.kt
@@ -64,7 +64,8 @@
 import kotlinx.coroutines.launch
 
 /**
- * <a href="https://m3.material.io/components/floating-action-button/overview" class="external" target="_blank">Material Design floating action button</a>.
+ * <a href="https://m3.material.io/components/floating-action-button/overview" class="external"
+ * target="_blank">Material Design floating action button</a>.
  *
  * The FAB represents the most important action on a screen. It puts key actions within reach.
  *
@@ -79,18 +80,18 @@
  * @param modifier the [Modifier] to be applied to this FAB
  * @param shape defines the shape of this FAB's container and shadow (when using [elevation])
  * @param containerColor the color used for the background of this FAB. Use [Color.Transparent] to
- * have no color.
+ *   have no color.
  * @param contentColor the preferred color for content inside this FAB. Defaults to either the
- * matching content color for [containerColor], or to the current [LocalContentColor] if
- * [containerColor] is not a color from the theme.
+ *   matching content color for [containerColor], or to the current [LocalContentColor] if
+ *   [containerColor] is not a color from the theme.
  * @param elevation [FloatingActionButtonElevation] used to resolve the elevation for this FAB in
- * different states. This controls the size of the shadow below the FAB. Additionally, when the
- * container color is [ColorScheme.surface], this controls the amount of primary color applied as an
- * overlay. See also: [Surface].
+ *   different states. This controls the size of the shadow below the FAB. Additionally, when the
+ *   container color is [ColorScheme.surface], this controls the amount of primary color applied as
+ *   an overlay. See also: [Surface].
  * @param interactionSource an optional hoisted [MutableInteractionSource] for observing and
- * emitting [Interaction]s for this FAB. You can use this to change the FAB's appearance
- * or preview the FAB in different states. Note that if `null` is provided, interactions will
- * still happen internally.
+ *   emitting [Interaction]s for this FAB. You can use this to change the FAB's appearance or
+ *   preview the FAB in different states. Note that if `null` is provided, interactions will still
+ *   happen internally.
  * @param content the content of this FAB, typically an [Icon]
  */
 @Composable
@@ -121,23 +122,27 @@
             textStyle = ExtendedFabPrimaryTokens.LabelTextFont.value
         ) {
             Box(
-                modifier = Modifier
-                    .defaultMinSize(
+                modifier =
+                    Modifier.defaultMinSize(
                         minWidth = FabPrimaryTokens.ContainerWidth,
                         minHeight = FabPrimaryTokens.ContainerHeight,
                     ),
                 contentAlignment = Alignment.Center,
-            ) { content() }
+            ) {
+                content()
+            }
         }
     }
 }
 
 /**
- * <a href="https://m3.material.io/components/floating-action-button/overview" class="external" target="_blank">Material Design small floating action button</a>.
+ * <a href="https://m3.material.io/components/floating-action-button/overview" class="external"
+ * target="_blank">Material Design small floating action button</a>.
  *
  * The FAB represents the most important action on a screen. It puts key actions within reach.
  *
- * ![Small FAB image](https://developer.android.com/images/reference/androidx/compose/material3/small-fab.png)
+ * ![Small FAB
+ * image](https://developer.android.com/images/reference/androidx/compose/material3/small-fab.png)
  *
  * @sample androidx.compose.material3.samples.SmallFloatingActionButtonSample
  *
@@ -145,18 +150,18 @@
  * @param modifier the [Modifier] to be applied to this FAB
  * @param shape defines the shape of this FAB's container and shadow (when using [elevation])
  * @param containerColor the color used for the background of this FAB. Use [Color.Transparent] to
- * have no color.
+ *   have no color.
  * @param contentColor the preferred color for content inside this FAB. Defaults to either the
- * matching content color for [containerColor], or to the current [LocalContentColor] if
- * [containerColor] is not a color from the theme.
+ *   matching content color for [containerColor], or to the current [LocalContentColor] if
+ *   [containerColor] is not a color from the theme.
  * @param elevation [FloatingActionButtonElevation] used to resolve the elevation for this FAB in
- * different states. This controls the size of the shadow below the FAB. Additionally, when the
- * container color is [ColorScheme.surface], this controls the amount of primary color applied as an
- * overlay. See also: [Surface].
+ *   different states. This controls the size of the shadow below the FAB. Additionally, when the
+ *   container color is [ColorScheme.surface], this controls the amount of primary color applied as
+ *   an overlay. See also: [Surface].
  * @param interactionSource an optional hoisted [MutableInteractionSource] for observing and
- * emitting [Interaction]s for this FAB. You can use this to change the FAB's appearance
- * or preview the FAB in different states. Note that if `null` is provided, interactions will
- * still happen internally.
+ *   emitting [Interaction]s for this FAB. You can use this to change the FAB's appearance or
+ *   preview the FAB in different states. Note that if `null` is provided, interactions will still
+ *   happen internally.
  * @param content the content of this FAB, typically an [Icon]
  */
 @Composable
@@ -172,10 +177,11 @@
 ) {
     FloatingActionButton(
         onClick = onClick,
-        modifier = modifier.sizeIn(
-            minWidth = FabPrimarySmallTokens.ContainerWidth,
-            minHeight = FabPrimarySmallTokens.ContainerHeight,
-        ),
+        modifier =
+            modifier.sizeIn(
+                minWidth = FabPrimarySmallTokens.ContainerWidth,
+                minHeight = FabPrimarySmallTokens.ContainerHeight,
+            ),
         shape = shape,
         containerColor = containerColor,
         contentColor = contentColor,
@@ -186,11 +192,13 @@
 }
 
 /**
- * <a href="https://m3.material.io/components/floating-action-button/overview" class="external" target="_blank">Material Design large floating action button</a>.
+ * <a href="https://m3.material.io/components/floating-action-button/overview" class="external"
+ * target="_blank">Material Design large floating action button</a>.
  *
  * The FAB represents the most important action on a screen. It puts key actions within reach.
  *
- * ![Large FAB image](https://developer.android.com/images/reference/androidx/compose/material3/large-fab.png)
+ * ![Large FAB
+ * image](https://developer.android.com/images/reference/androidx/compose/material3/large-fab.png)
  *
  * @sample androidx.compose.material3.samples.LargeFloatingActionButtonSample
  *
@@ -198,18 +206,18 @@
  * @param modifier the [Modifier] to be applied to this FAB
  * @param shape defines the shape of this FAB's container and shadow (when using [elevation])
  * @param containerColor the color used for the background of this FAB. Use [Color.Transparent] to
- * have no color.
+ *   have no color.
  * @param contentColor the preferred color for content inside this FAB. Defaults to either the
- * matching content color for [containerColor], or to the current [LocalContentColor] if
- * [containerColor] is not a color from the theme.
+ *   matching content color for [containerColor], or to the current [LocalContentColor] if
+ *   [containerColor] is not a color from the theme.
  * @param elevation [FloatingActionButtonElevation] used to resolve the elevation for this FAB in
- * different states. This controls the size of the shadow below the FAB. Additionally, when the
- * container color is [ColorScheme.surface], this controls the amount of primary color applied as an
- * overlay. See also: [Surface].
+ *   different states. This controls the size of the shadow below the FAB. Additionally, when the
+ *   container color is [ColorScheme.surface], this controls the amount of primary color applied as
+ *   an overlay. See also: [Surface].
  * @param interactionSource an optional hoisted [MutableInteractionSource] for observing and
- * emitting [Interaction]s for this FAB. You can use this to change the FAB's appearance
- * or preview the FAB in different states. Note that if `null` is provided, interactions will
- * still happen internally.
+ *   emitting [Interaction]s for this FAB. You can use this to change the FAB's appearance or
+ *   preview the FAB in different states. Note that if `null` is provided, interactions will still
+ *   happen internally.
  * @param content the content of this FAB, typically an [Icon]
  */
 @Composable
@@ -225,10 +233,11 @@
 ) {
     FloatingActionButton(
         onClick = onClick,
-        modifier = modifier.sizeIn(
-            minWidth = FabPrimaryLargeTokens.ContainerWidth,
-            minHeight = FabPrimaryLargeTokens.ContainerHeight,
-        ),
+        modifier =
+            modifier.sizeIn(
+                minWidth = FabPrimaryLargeTokens.ContainerWidth,
+                minHeight = FabPrimaryLargeTokens.ContainerHeight,
+            ),
         shape = shape,
         containerColor = containerColor,
         contentColor = contentColor,
@@ -239,12 +248,14 @@
 }
 
 /**
- * <a href="https://m3.material.io/components/extended-fab/overview" class="external" target="_blank">Material Design extended floating action button</a>.
+ * <a href="https://m3.material.io/components/extended-fab/overview" class="external"
+ * target="_blank">Material Design extended floating action button</a>.
  *
  * Extended FABs help people take primary actions. They're wider than FABs to accommodate a text
  * label and larger target area.
  *
- * ![Extended FAB image](https://developer.android.com/images/reference/androidx/compose/material3/extended-fab.png)
+ * ![Extended FAB
+ * image](https://developer.android.com/images/reference/androidx/compose/material3/extended-fab.png)
  *
  * The other extended floating action button overload supports a text label and icon.
  *
@@ -254,18 +265,18 @@
  * @param modifier the [Modifier] to be applied to this FAB
  * @param shape defines the shape of this FAB's container and shadow (when using [elevation])
  * @param containerColor the color used for the background of this FAB. Use [Color.Transparent] to
- * have no color.
+ *   have no color.
  * @param contentColor the preferred color for content inside this FAB. Defaults to either the
- * matching content color for [containerColor], or to the current [LocalContentColor] if
- * [containerColor] is not a color from the theme.
+ *   matching content color for [containerColor], or to the current [LocalContentColor] if
+ *   [containerColor] is not a color from the theme.
  * @param elevation [FloatingActionButtonElevation] used to resolve the elevation for this FAB in
- * different states. This controls the size of the shadow below the FAB. Additionally, when the
- * container color is [ColorScheme.surface], this controls the amount of primary color applied as an
- * overlay. See also: [Surface].
+ *   different states. This controls the size of the shadow below the FAB. Additionally, when the
+ *   container color is [ColorScheme.surface], this controls the amount of primary color applied as
+ *   an overlay. See also: [Surface].
  * @param interactionSource an optional hoisted [MutableInteractionSource] for observing and
- * emitting [Interaction]s for this FAB. You can use this to change the FAB's appearance
- * or preview the FAB in different states. Note that if `null` is provided, interactions will
- * still happen internally.
+ *   emitting [Interaction]s for this FAB. You can use this to change the FAB's appearance or
+ *   preview the FAB in different states. Note that if `null` is provided, interactions will still
+ *   happen internally.
  * @param content the content of this FAB, typically a [Text] label
  */
 @Composable
@@ -289,9 +300,9 @@
         interactionSource = interactionSource,
     ) {
         Row(
-            modifier = Modifier
-                .sizeIn(minWidth = ExtendedFabMinimumWidth)
-                .padding(horizontal = ExtendedFabTextPadding),
+            modifier =
+                Modifier.sizeIn(minWidth = ExtendedFabMinimumWidth)
+                    .padding(horizontal = ExtendedFabTextPadding),
             horizontalArrangement = Arrangement.Center,
             verticalAlignment = Alignment.CenterVertically,
             content = content,
@@ -300,12 +311,14 @@
 }
 
 /**
- * <a href="https://m3.material.io/components/extended-fab/overview" class="external" target="_blank">Material Design extended floating action button</a>.
+ * <a href="https://m3.material.io/components/extended-fab/overview" class="external"
+ * target="_blank">Material Design extended floating action button</a>.
  *
  * Extended FABs help people take primary actions. They're wider than FABs to accommodate a text
  * label and larger target area.
  *
- * ![Extended FAB image](https://developer.android.com/images/reference/androidx/compose/material3/extended-fab.png)
+ * ![Extended FAB
+ * image](https://developer.android.com/images/reference/androidx/compose/material3/extended-fab.png)
  *
  * The other extended floating action button overload is for FABs without an icon.
  *
@@ -313,6 +326,7 @@
  * behavior, you can provide your own via [Modifier.semantics].
  *
  * @sample androidx.compose.material3.samples.ExtendedFloatingActionButtonSample
+ *
  * @sample androidx.compose.material3.samples.AnimatedExtendedFloatingActionButtonSample
  *
  * @param text label displayed inside this FAB
@@ -320,21 +334,21 @@
  * @param onClick called when this FAB is clicked
  * @param modifier the [Modifier] to be applied to this FAB
  * @param expanded controls the expansion state of this FAB. In an expanded state, the FAB will show
- * both the [icon] and [text]. In a collapsed state, the FAB will show only the [icon].
+ *   both the [icon] and [text]. In a collapsed state, the FAB will show only the [icon].
  * @param shape defines the shape of this FAB's container and shadow (when using [elevation])
  * @param containerColor the color used for the background of this FAB. Use [Color.Transparent] to
- * have no color.
+ *   have no color.
  * @param contentColor the preferred color for content inside this FAB. Defaults to either the
- * matching content color for [containerColor], or to the current [LocalContentColor] if
- * [containerColor] is not a color from the theme.
+ *   matching content color for [containerColor], or to the current [LocalContentColor] if
+ *   [containerColor] is not a color from the theme.
  * @param elevation [FloatingActionButtonElevation] used to resolve the elevation for this FAB in
- * different states. This controls the size of the shadow below the FAB. Additionally, when the
- * container color is [ColorScheme.surface], this controls the amount of primary color applied as an
- * overlay. See also: [Surface].
+ *   different states. This controls the size of the shadow below the FAB. Additionally, when the
+ *   container color is [ColorScheme.surface], this controls the amount of primary color applied as
+ *   an overlay. See also: [Surface].
  * @param interactionSource an optional hoisted [MutableInteractionSource] for observing and
- * emitting [Interaction]s for this FAB. You can use this to change the FAB's appearance
- * or preview the FAB in different states. Note that if `null` is provided, interactions will
- * still happen internally.
+ *   emitting [Interaction]s for this FAB. You can use this to change the FAB's appearance or
+ *   preview the FAB in different states. Note that if `null` is provided, interactions will still
+ *   happen internally.
  */
 @Composable
 fun ExtendedFloatingActionButton(
@@ -362,12 +376,13 @@
         val endPadding = if (expanded) ExtendedFabTextPadding else 0.dp
 
         Row(
-            modifier = Modifier
-                .sizeIn(
-                    minWidth = if (expanded) ExtendedFabMinimumWidth
-                    else FabPrimaryTokens.ContainerWidth
-                )
-                .padding(start = startPadding, end = endPadding),
+            modifier =
+                Modifier.sizeIn(
+                        minWidth =
+                            if (expanded) ExtendedFabMinimumWidth
+                            else FabPrimaryTokens.ContainerWidth
+                    )
+                    .padding(start = startPadding, end = endPadding),
             verticalAlignment = Alignment.CenterVertically,
             horizontalArrangement = if (expanded) Arrangement.Start else Arrangement.Center
         ) {
@@ -386,30 +401,30 @@
     }
 }
 
-/**
- * Contains the default values used by [FloatingActionButton]
- */
+/** Contains the default values used by [FloatingActionButton] */
 object FloatingActionButtonDefaults {
-    /**
-     * The recommended size of the icon inside a [LargeFloatingActionButton].
-     */
+    /** The recommended size of the icon inside a [LargeFloatingActionButton]. */
     val LargeIconSize = FabPrimaryLargeTokens.IconSize
 
     /** Default shape for a floating action button. */
-    val shape: Shape @Composable get() = FabPrimaryTokens.ContainerShape.value
+    val shape: Shape
+        @Composable get() = FabPrimaryTokens.ContainerShape.value
 
     /** Default shape for a small floating action button. */
-    val smallShape: Shape @Composable get() = FabPrimarySmallTokens.ContainerShape.value
+    val smallShape: Shape
+        @Composable get() = FabPrimarySmallTokens.ContainerShape.value
 
     /** Default shape for a large floating action button. */
-    val largeShape: Shape @Composable get() = FabPrimaryLargeTokens.ContainerShape.value
+    val largeShape: Shape
+        @Composable get() = FabPrimaryLargeTokens.ContainerShape.value
 
     /** Default shape for an extended floating action button. */
-    val extendedFabShape: Shape @Composable get() =
-        ExtendedFabPrimaryTokens.ContainerShape.value
+    val extendedFabShape: Shape
+        @Composable get() = ExtendedFabPrimaryTokens.ContainerShape.value
 
     /** Default container color for a floating action button. */
-    val containerColor: Color @Composable get() = FabPrimaryTokens.ContainerColor.value
+    val containerColor: Color
+        @Composable get() = FabPrimaryTokens.ContainerColor.value
 
     /**
      * Creates a [FloatingActionButtonElevation] that represents the elevation of a
@@ -417,7 +432,7 @@
      * [FloatingActionButton] is possible consider the [loweredElevation].
      *
      * @param defaultElevation the elevation used when the [FloatingActionButton] has no other
-     * [Interaction]s.
+     *   [Interaction]s.
      * @param pressedElevation the elevation used when the [FloatingActionButton] is pressed.
      * @param focusedElevation the elevation used when the [FloatingActionButton] is focused.
      * @param hoveredElevation the elevation used when the [FloatingActionButton] is hovered.
@@ -428,19 +443,20 @@
         pressedElevation: Dp = FabPrimaryTokens.PressedContainerElevation,
         focusedElevation: Dp = FabPrimaryTokens.FocusContainerElevation,
         hoveredElevation: Dp = FabPrimaryTokens.HoverContainerElevation,
-    ): FloatingActionButtonElevation = FloatingActionButtonElevation(
-        defaultElevation = defaultElevation,
-        pressedElevation = pressedElevation,
-        focusedElevation = focusedElevation,
-        hoveredElevation = hoveredElevation,
-    )
+    ): FloatingActionButtonElevation =
+        FloatingActionButtonElevation(
+            defaultElevation = defaultElevation,
+            pressedElevation = pressedElevation,
+            focusedElevation = focusedElevation,
+            hoveredElevation = hoveredElevation,
+        )
 
     /**
      * Use this to create a [FloatingActionButton] with a lowered elevation for less emphasis. Use
      * [elevation] to get a normal [FloatingActionButton].
      *
      * @param defaultElevation the elevation used when the [FloatingActionButton] has no other
-     * [Interaction]s.
+     *   [Interaction]s.
      * @param pressedElevation the elevation used when the [FloatingActionButton] is pressed.
      * @param focusedElevation the elevation used when the [FloatingActionButton] is focused.
      * @param hoveredElevation the elevation used when the [FloatingActionButton] is hovered.
@@ -451,19 +467,20 @@
         pressedElevation: Dp = FabPrimaryTokens.LoweredPressedContainerElevation,
         focusedElevation: Dp = FabPrimaryTokens.LoweredFocusContainerElevation,
         hoveredElevation: Dp = FabPrimaryTokens.LoweredHoverContainerElevation,
-    ): FloatingActionButtonElevation = FloatingActionButtonElevation(
-        defaultElevation = defaultElevation,
-        pressedElevation = pressedElevation,
-        focusedElevation = focusedElevation,
-        hoveredElevation = hoveredElevation,
-    )
+    ): FloatingActionButtonElevation =
+        FloatingActionButtonElevation(
+            defaultElevation = defaultElevation,
+            pressedElevation = pressedElevation,
+            focusedElevation = focusedElevation,
+            hoveredElevation = hoveredElevation,
+        )
 
     /**
      * Use this to create a [FloatingActionButton] that represents the default elevation of a
      * [FloatingActionButton] used for [BottomAppBar] in different states.
      *
      * @param defaultElevation the elevation used when the [FloatingActionButton] has no other
-     * [Interaction]s.
+     *   [Interaction]s.
      * @param pressedElevation the elevation used when the [FloatingActionButton] is pressed.
      * @param focusedElevation the elevation used when the [FloatingActionButton] is focused.
      * @param hoveredElevation the elevation used when the [FloatingActionButton] is hovered.
@@ -473,12 +490,13 @@
         pressedElevation: Dp = 0.dp,
         focusedElevation: Dp = 0.dp,
         hoveredElevation: Dp = 0.dp
-    ): FloatingActionButtonElevation = FloatingActionButtonElevation(
-        defaultElevation,
-        pressedElevation,
-        focusedElevation,
-        hoveredElevation
-    )
+    ): FloatingActionButtonElevation =
+        FloatingActionButtonElevation(
+            defaultElevation,
+            pressedElevation,
+            focusedElevation,
+            hoveredElevation
+        )
 }
 
 /**
@@ -488,7 +506,8 @@
  * [FloatingActionButton] and [ExtendedFloatingActionButton].
  */
 @Stable
- open class FloatingActionButtonElevation internal constructor(
+open class FloatingActionButtonElevation
+internal constructor(
     private val defaultElevation: Dp,
     private val pressedElevation: Dp,
     private val focusedElevation: Dp,
@@ -505,14 +524,15 @@
 
     @Composable
     private fun animateElevation(interactionSource: InteractionSource): State<Dp> {
-        val animatable = remember(interactionSource) {
-            FloatingActionButtonElevationAnimatable(
-                defaultElevation = defaultElevation,
-                pressedElevation = pressedElevation,
-                hoveredElevation = hoveredElevation,
-                focusedElevation = focusedElevation
-            )
-        }
+        val animatable =
+            remember(interactionSource) {
+                FloatingActionButtonElevationAnimatable(
+                    defaultElevation = defaultElevation,
+                    pressedElevation = pressedElevation,
+                    hoveredElevation = hoveredElevation,
+                    focusedElevation = focusedElevation
+                )
+            }
 
         LaunchedEffect(this) {
             animatable.updateElevation(
@@ -550,9 +570,7 @@
                     }
                 }
                 val targetInteraction = interactions.lastOrNull()
-                launch {
-                    animatable.animateElevation(to = targetInteraction)
-                }
+                launch { animatable.animateElevation(to = targetInteraction) }
             }
         }
 
@@ -629,11 +647,7 @@
         targetInteraction = to
         try {
             if (animatable.targetValue != target) {
-                animatable.animateElevation(
-                    target = target,
-                    from = lastTargetInteraction,
-                    to = to
-                )
+                animatable.animateElevation(target = target, from = lastTargetInteraction, to = to)
             }
         } finally {
             lastTargetInteraction = to
@@ -651,29 +665,37 @@
 
 private val ExtendedFabMinimumWidth = 80.dp
 
-private val ExtendedFabCollapseAnimation = fadeOut(
-    animationSpec = tween(
-        durationMillis = MotionTokens.DurationShort2.toInt(),
-        easing = MotionTokens.EasingLinearCubicBezier,
-    )
-) + shrinkHorizontally(
-    animationSpec = tween(
-        durationMillis = MotionTokens.DurationLong2.toInt(),
-        easing = MotionTokens.EasingEmphasizedCubicBezier,
-    ),
-    shrinkTowards = Alignment.Start,
-)
+private val ExtendedFabCollapseAnimation =
+    fadeOut(
+        animationSpec =
+            tween(
+                durationMillis = MotionTokens.DurationShort2.toInt(),
+                easing = MotionTokens.EasingLinearCubicBezier,
+            )
+    ) +
+        shrinkHorizontally(
+            animationSpec =
+                tween(
+                    durationMillis = MotionTokens.DurationLong2.toInt(),
+                    easing = MotionTokens.EasingEmphasizedCubicBezier,
+                ),
+            shrinkTowards = Alignment.Start,
+        )
 
-private val ExtendedFabExpandAnimation = fadeIn(
-    animationSpec = tween(
-        durationMillis = MotionTokens.DurationShort4.toInt(),
-        delayMillis = MotionTokens.DurationShort2.toInt(),
-        easing = MotionTokens.EasingLinearCubicBezier,
-    ),
-) + expandHorizontally(
-    animationSpec = tween(
-        durationMillis = MotionTokens.DurationLong2.toInt(),
-        easing = MotionTokens.EasingEmphasizedCubicBezier,
-    ),
-    expandFrom = Alignment.Start,
-)
+private val ExtendedFabExpandAnimation =
+    fadeIn(
+        animationSpec =
+            tween(
+                durationMillis = MotionTokens.DurationShort4.toInt(),
+                delayMillis = MotionTokens.DurationShort2.toInt(),
+                easing = MotionTokens.EasingLinearCubicBezier,
+            ),
+    ) +
+        expandHorizontally(
+            animationSpec =
+                tween(
+                    durationMillis = MotionTokens.DurationLong2.toInt(),
+                    easing = MotionTokens.EasingEmphasizedCubicBezier,
+                ),
+            expandFrom = Alignment.Start,
+        )
diff --git a/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/Icon.kt b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/Icon.kt
index 0d720d4..24abbbfa 100644
--- a/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/Icon.kt
+++ b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/Icon.kt
@@ -42,24 +42,25 @@
 import androidx.compose.ui.unit.Constraints
 
 /**
- * A Material Design icon component that draws [imageVector] using [tint], with a default value
- * of [LocalContentColor]. If [imageVector] has no intrinsic size, this component will use the
+ * A Material Design icon component that draws [imageVector] using [tint], with a default value of
+ * [LocalContentColor]. If [imageVector] has no intrinsic size, this component will use the
  * recommended default size. Icon is an opinionated component designed to be used with single-color
  * icons so that they can be tinted correctly for the component they are placed in. For multicolored
  * icons and icons that should not be tinted, use [Color.Unspecified] for [tint]. For generic images
  * that should not be tinted, and do not follow the recommended icon size, use the generic
  * [androidx.compose.foundation.Image] instead. For a clickable icon, see [IconButton].
  *
- * To learn more about icons, see [Material Design icons](https://m3.material.io/styles/icons/overview)
+ * To learn more about icons, see
+ * [Material Design icons](https://m3.material.io/styles/icons/overview)
  *
  * @param imageVector [ImageVector] to draw inside this icon
  * @param contentDescription text used by accessibility services to describe what this icon
- * represents. This should always be provided unless this icon is used for decorative purposes, and
- * does not represent a meaningful action that a user can take. This text should be localized, such
- * as by using [androidx.compose.ui.res.stringResource] or similar
+ *   represents. This should always be provided unless this icon is used for decorative purposes,
+ *   and does not represent a meaningful action that a user can take. This text should be localized,
+ *   such as by using [androidx.compose.ui.res.stringResource] or similar
  * @param modifier the [Modifier] to be applied to this icon
  * @param tint tint to be applied to [imageVector]. If [Color.Unspecified] is provided, then no tint
- * is applied.
+ *   is applied.
  */
 @Composable
 fun Icon(
@@ -77,24 +78,25 @@
 }
 
 /**
- * A Material Design icon component that draws [bitmap] using [tint], with a default value
- * of [LocalContentColor]. If [bitmap] has no intrinsic size, this component will use the
- * recommended default size. Icon is an opinionated component designed to be used with single-color
- * icons so that they can be tinted correctly for the component they are placed in. For multicolored
- * icons and icons that should not be tinted, use [Color.Unspecified] for [tint]. For generic images
- * that should not be tinted, and do not follow the recommended icon size, use the generic
+ * A Material Design icon component that draws [bitmap] using [tint], with a default value of
+ * [LocalContentColor]. If [bitmap] has no intrinsic size, this component will use the recommended
+ * default size. Icon is an opinionated component designed to be used with single-color icons so
+ * that they can be tinted correctly for the component they are placed in. For multicolored icons
+ * and icons that should not be tinted, use [Color.Unspecified] for [tint]. For generic images that
+ * should not be tinted, and do not follow the recommended icon size, use the generic
  * [androidx.compose.foundation.Image] instead. For a clickable icon, see [IconButton].
  *
- * To learn more about icons, see [Material Design icons](https://m3.material.io/styles/icons/overview)
+ * To learn more about icons, see
+ * [Material Design icons](https://m3.material.io/styles/icons/overview)
  *
  * @param bitmap [ImageBitmap] to draw inside this icon
  * @param contentDescription text used by accessibility services to describe what this icon
- * represents. This should always be provided unless this icon is used for decorative purposes, and
- * does not represent a meaningful action that a user can take. This text should be localized, such
- * as by using [androidx.compose.ui.res.stringResource] or similar
+ *   represents. This should always be provided unless this icon is used for decorative purposes,
+ *   and does not represent a meaningful action that a user can take. This text should be localized,
+ *   such as by using [androidx.compose.ui.res.stringResource] or similar
  * @param modifier the [Modifier] to be applied to this icon
  * @param tint tint to be applied to [bitmap]. If [Color.Unspecified] is provided, then no tint is
- * applied.
+ *   applied.
  */
 @Composable
 fun Icon(
@@ -113,24 +115,25 @@
 }
 
 /**
- * A Material Design icon component that draws [painter] using [tint], with a default value
- * of [LocalContentColor]. If [painter] has no intrinsic size, this component will use the
- * recommended default size. Icon is an opinionated component designed to be used with single-color
- * icons so that they can be tinted correctly for the component they are placed in. For multicolored
- * icons and icons that should not be tinted, use [Color.Unspecified] for [tint]. For generic images
- * that should not be tinted, and do not follow the recommended icon size, use the generic
+ * A Material Design icon component that draws [painter] using [tint], with a default value of
+ * [LocalContentColor]. If [painter] has no intrinsic size, this component will use the recommended
+ * default size. Icon is an opinionated component designed to be used with single-color icons so
+ * that they can be tinted correctly for the component they are placed in. For multicolored icons
+ * and icons that should not be tinted, use [Color.Unspecified] for [tint]. For generic images that
+ * should not be tinted, and do not follow the recommended icon size, use the generic
  * [androidx.compose.foundation.Image] instead. For a clickable icon, see [IconButton].
  *
- * To learn more about icons, see [Material Design icons](https://m3.material.io/styles/icons/overview)
+ * To learn more about icons, see
+ * [Material Design icons](https://m3.material.io/styles/icons/overview)
  *
  * @param painter [Painter] to draw inside this icon
  * @param contentDescription text used by accessibility services to describe what this icon
- * represents. This should always be provided unless this icon is used for decorative purposes, and
- * does not represent a meaningful action that a user can take. This text should be localized, such
- * as by using [androidx.compose.ui.res.stringResource] or similar
+ *   represents. This should always be provided unless this icon is used for decorative purposes,
+ *   and does not represent a meaningful action that a user can take. This text should be localized,
+ *   such as by using [androidx.compose.ui.res.stringResource] or similar
  * @param modifier the [Modifier] to be applied to this icon
  * @param tint tint to be applied to [painter]. If [Color.Unspecified] is provided, then no tint is
- * applied.
+ *   applied.
  */
 @Composable
 fun Icon(
@@ -139,9 +142,8 @@
     modifier: Modifier = Modifier,
     tint: Color = LocalContentColor.current
 ) {
-    val colorFilter = remember(tint) {
-        if (tint == Color.Unspecified) null else ColorFilter.tint(tint)
-    }
+    val colorFilter =
+        remember(tint) { if (tint == Color.Unspecified) null else ColorFilter.tint(tint) }
     val semantics =
         if (contentDescription != null) {
             Modifier.semantics {
@@ -161,22 +163,23 @@
 }
 
 /**
- * A Material Design icon component that draws [painter] using [tint].
- * If [painter] has no intrinsic size, this component will use the
- * recommended default size. Icon is an opinionated component designed to be used with single-color
- * icons so that they can be tinted correctly for the component they are placed in. For multicolored
- * icons and icons that should not be tinted, use null for [tint]. For generic images
- * that should not be tinted, and do not follow the recommended icon size, use the generic
- * [androidx.compose.foundation.Image] instead. For a clickable icon, see [IconButton].
+ * A Material Design icon component that draws [painter] using [tint]. If [painter] has no intrinsic
+ * size, this component will use the recommended default size. Icon is an opinionated component
+ * designed to be used with single-color icons so that they can be tinted correctly for the
+ * component they are placed in. For multicolored icons and icons that should not be tinted, use
+ * null for [tint]. For generic images that should not be tinted, and do not follow the recommended
+ * icon size, use the generic [androidx.compose.foundation.Image] instead. For a clickable icon, see
+ * [IconButton].
  *
- * To learn more about icons, see [Material Design icons](https://m3.material.io/styles/icons/overview)
+ * To learn more about icons, see
+ * [Material Design icons](https://m3.material.io/styles/icons/overview)
  *
  * @param painter [Painter] to draw inside this icon
  * @param tint tint to be applied to [painter]. If null, then no tint is applied.
  * @param contentDescription text used by accessibility services to describe what this icon
- * represents. This should always be provided unless this icon is used for decorative purposes, and
- * does not represent a meaningful action that a user can take. This text should be localized, such
- * as by using [androidx.compose.ui.res.stringResource] or similar
+ *   represents. This should always be provided unless this icon is used for decorative purposes,
+ *   and does not represent a meaningful action that a user can take. This text should be localized,
+ *   such as by using [androidx.compose.ui.res.stringResource] or similar
  * @param modifier the [Modifier] to be applied to this icon
  */
 @Composable
@@ -203,13 +206,7 @@
             .defaultSizeForColorProducer(painter)
             .drawBehind {
                 with(painter) {
-                    draw(
-                        size = size,
-                        colorFilter = tint
-                            ?.invoke()
-                            ?.let {
-                                ColorFilter.tint(it)
-                            })
+                    draw(size = size, colorFilter = tint?.invoke()?.let { ColorFilter.tint(it) })
                 }
             }
             .then(semantics)
@@ -229,9 +226,7 @@
             Modifier.layout { measurable, _ ->
                 val placeable =
                     measurable.measure(Constraints.fixed(srcWidth.toInt(), srcHeight.toInt()))
-                layout(placeable.width, placeable.height) {
-                    placeable.place(0, 0)
-                }
+                layout(placeable.width, placeable.height) { placeable.place(0, 0) }
             }
         }
     )
diff --git a/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/IconButton.kt b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/IconButton.kt
index 42cb6a9..e9969ad 100644
--- a/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/IconButton.kt
+++ b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/IconButton.kt
@@ -45,34 +45,37 @@
 import androidx.compose.ui.semantics.semantics
 
 /**
- * <a href="https://m3.material.io/components/icon-button/overview" class="external" target="_blank">Material Design standard icon button</a>.
+ * <a href="https://m3.material.io/components/icon-button/overview" class="external"
+ * target="_blank">Material Design standard icon button</a>.
  *
  * Icon buttons help people take supplementary actions with a single tap. They’re used when a
  * compact button is required, such as in a toolbar or image list.
  *
- * ![Standard icon button image](https://developer.android.com/images/reference/androidx/compose/material3/standard-icon-button.png)
+ * ![Standard icon button
+ * image](https://developer.android.com/images/reference/androidx/compose/material3/standard-icon-button.png)
  *
  * [content] should typically be an [Icon] (see [androidx.compose.material.icons.Icons]). If using a
- * custom icon, note that the typical size for the internal icon is 24 x 24 dp.
- * This icon button has an overall minimum touch target size of 48 x 48dp, to meet accessibility
- * guidelines.
+ * custom icon, note that the typical size for the internal icon is 24 x 24 dp. This icon button has
+ * an overall minimum touch target size of 48 x 48dp, to meet accessibility guidelines.
  *
  * Simple Usage
+ *
  * @sample androidx.compose.material3.samples.IconButtonSample
  * IconButton with a color tint
+ *
  * @sample androidx.compose.material3.samples.TintedIconButtonSample
  *
  * @param onClick called when this icon button is clicked
  * @param modifier the [Modifier] to be applied to this icon button
  * @param enabled controls the enabled state of this icon button. When `false`, this component will
- * not respond to user input, and it will appear visually disabled and disabled to accessibility
- * services.
+ *   not respond to user input, and it will appear visually disabled and disabled to accessibility
+ *   services.
  * @param colors [IconButtonColors] that will be used to resolve the colors used for this icon
- * button in different states. See [IconButtonDefaults.iconButtonColors].
+ *   button in different states. See [IconButtonDefaults.iconButtonColors].
  * @param interactionSource an optional hoisted [MutableInteractionSource] for observing and
- * emitting [Interaction]s for this icon button. You can use this to change the icon button's
- * appearance or preview the icon button in different states. Note that if `null` is provided,
- * interactions will still happen internally.
+ *   emitting [Interaction]s for this icon button. You can use this to change the icon button's
+ *   appearance or preview the icon button in different states. Note that if `null` is provided,
+ *   interactions will still happen internally.
  * @param content the content of this icon button, typically an [Icon]
  */
 @Composable
@@ -85,21 +88,23 @@
     content: @Composable () -> Unit
 ) {
     Box(
-        modifier = modifier
-            .minimumInteractiveComponentSize()
-            .size(IconButtonTokens.StateLayerSize)
-            .clip(IconButtonTokens.StateLayerShape.value)
-            .background(color = colors.containerColor(enabled))
-            .clickable(
-                onClick = onClick,
-                enabled = enabled,
-                role = Role.Button,
-                interactionSource = interactionSource,
-                indication = rippleOrFallbackImplementation(
-                    bounded = false,
-                    radius = IconButtonTokens.StateLayerSize / 2
-                )
-            ),
+        modifier =
+            modifier
+                .minimumInteractiveComponentSize()
+                .size(IconButtonTokens.StateLayerSize)
+                .clip(IconButtonTokens.StateLayerShape.value)
+                .background(color = colors.containerColor(enabled))
+                .clickable(
+                    onClick = onClick,
+                    enabled = enabled,
+                    role = Role.Button,
+                    interactionSource = interactionSource,
+                    indication =
+                        rippleOrFallbackImplementation(
+                            bounded = false,
+                            radius = IconButtonTokens.StateLayerSize / 2
+                        )
+                ),
         contentAlignment = Alignment.Center
     ) {
         val contentColor = colors.contentColor(enabled)
@@ -108,17 +113,18 @@
 }
 
 /**
- * <a href="https://m3.material.io/components/icon-button/overview" class="external" target="_blank">Material Design standard icon toggle button</a>.
+ * <a href="https://m3.material.io/components/icon-button/overview" class="external"
+ * target="_blank">Material Design standard icon toggle button</a>.
  *
  * Icon buttons help people take supplementary actions with a single tap. They’re used when a
  * compact button is required, such as in a toolbar or image list.
  *
- * ![Standard icon toggle button image](https://developer.android.com/images/reference/androidx/compose/material3/standard-icon-toggle-button.png)
+ * ![Standard icon toggle button
+ * image](https://developer.android.com/images/reference/androidx/compose/material3/standard-icon-toggle-button.png)
  *
  * [content] should typically be an [Icon] (see [androidx.compose.material.icons.Icons]). If using a
- * custom icon, note that the typical size for the internal icon is 24 x 24 dp.
- * This icon button has an overall minimum touch target size of 48 x 48dp, to meet accessibility
- * guidelines.
+ * custom icon, note that the typical size for the internal icon is 24 x 24 dp. This icon button has
+ * an overall minimum touch target size of 48 x 48dp, to meet accessibility guidelines.
  *
  * @sample androidx.compose.material3.samples.IconToggleButtonSample
  *
@@ -126,14 +132,14 @@
  * @param onCheckedChange called when this icon button is clicked
  * @param modifier the [Modifier] to be applied to this icon button
  * @param enabled controls the enabled state of this icon button. When `false`, this component will
- * not respond to user input, and it will appear visually disabled and disabled to accessibility
- * services.
+ *   not respond to user input, and it will appear visually disabled and disabled to accessibility
+ *   services.
  * @param colors [IconToggleButtonColors] that will be used to resolve the colors used for this icon
- * button in different states. See [IconButtonDefaults.iconToggleButtonColors].
+ *   button in different states. See [IconButtonDefaults.iconToggleButtonColors].
  * @param interactionSource an optional hoisted [MutableInteractionSource] for observing and
- * emitting [Interaction]s for this icon button. You can use this to change the icon button's
- * appearance or preview the icon button in different states. Note that if `null` is provided,
- * interactions will still happen internally.
+ *   emitting [Interaction]s for this icon button. You can use this to change the icon button's
+ *   appearance or preview the icon button in different states. Note that if `null` is provided,
+ *   interactions will still happen internally.
  * @param content the content of this icon button, typically an [Icon]
  */
 @Composable
@@ -147,22 +153,24 @@
     content: @Composable () -> Unit
 ) {
     Box(
-        modifier = modifier
-            .minimumInteractiveComponentSize()
-            .size(IconButtonTokens.StateLayerSize)
-            .clip(IconButtonTokens.StateLayerShape.value)
-            .background(color = colors.containerColor(enabled, checked).value)
-            .toggleable(
-                value = checked,
-                onValueChange = onCheckedChange,
-                enabled = enabled,
-                role = Role.Checkbox,
-                interactionSource = interactionSource,
-                indication = rippleOrFallbackImplementation(
-                    bounded = false,
-                    radius = IconButtonTokens.StateLayerSize / 2
-                )
-            ),
+        modifier =
+            modifier
+                .minimumInteractiveComponentSize()
+                .size(IconButtonTokens.StateLayerSize)
+                .clip(IconButtonTokens.StateLayerShape.value)
+                .background(color = colors.containerColor(enabled, checked).value)
+                .toggleable(
+                    value = checked,
+                    onValueChange = onCheckedChange,
+                    enabled = enabled,
+                    role = Role.Checkbox,
+                    interactionSource = interactionSource,
+                    indication =
+                        rippleOrFallbackImplementation(
+                            bounded = false,
+                            radius = IconButtonTokens.StateLayerSize / 2
+                        )
+                ),
         contentAlignment = Alignment.Center
     ) {
         val contentColor = colors.contentColor(enabled, checked).value
@@ -171,33 +179,35 @@
 }
 
 /**
- * <a href="https://m3.material.io/components/icon-button/overview" class="external" target="_blank">Material Design filled icon button</a>.
+ * <a href="https://m3.material.io/components/icon-button/overview" class="external"
+ * target="_blank">Material Design filled icon button</a>.
  *
  * Icon buttons help people take supplementary actions with a single tap. They’re used when a
  * compact button is required, such as in a toolbar or image list.
  *
- * ![Filled icon button image](https://developer.android.com/images/reference/androidx/compose/material3/filled-icon-button.png)
+ * ![Filled icon button
+ * image](https://developer.android.com/images/reference/androidx/compose/material3/filled-icon-button.png)
  *
  * [content] should typically be an [Icon] (see [androidx.compose.material.icons.Icons]). If using a
- * custom icon, note that the typical size for the internal icon is 24 x 24 dp.
- * This icon button has an overall minimum touch target size of 48 x 48dp, to meet accessibility
- * guidelines.
+ * custom icon, note that the typical size for the internal icon is 24 x 24 dp. This icon button has
+ * an overall minimum touch target size of 48 x 48dp, to meet accessibility guidelines.
  *
  * Filled icon button sample:
+ *
  * @sample androidx.compose.material3.samples.FilledIconButtonSample
  *
  * @param onClick called when this icon button is clicked
  * @param modifier the [Modifier] to be applied to this icon button
  * @param enabled controls the enabled state of this icon button. When `false`, this component will
- * not respond to user input, and it will appear visually disabled and disabled to accessibility
- * services.
+ *   not respond to user input, and it will appear visually disabled and disabled to accessibility
+ *   services.
  * @param shape defines the shape of this icon button's container
  * @param colors [IconButtonColors] that will be used to resolve the colors used for this icon
- * button in different states. See [IconButtonDefaults.filledIconButtonColors].
+ *   button in different states. See [IconButtonDefaults.filledIconButtonColors].
  * @param interactionSource an optional hoisted [MutableInteractionSource] for observing and
- * emitting [Interaction]s for this icon button. You can use this to change the icon button's
- * appearance or preview the icon button in different states. Note that if `null` is provided,
- * interactions will still happen internally.
+ *   emitting [Interaction]s for this icon button. You can use this to change the icon button's
+ *   appearance or preview the icon button in different states. Note that if `null` is provided,
+ *   interactions will still happen internally.
  * @param content the content of this icon button, typically an [Icon]
  */
 @Composable
@@ -209,59 +219,62 @@
     colors: IconButtonColors = IconButtonDefaults.filledIconButtonColors(),
     interactionSource: MutableInteractionSource? = null,
     content: @Composable () -> Unit
-) = Surface(
-    onClick = onClick,
-    modifier = modifier.semantics { role = Role.Button },
-    enabled = enabled,
-    shape = shape,
-    color = colors.containerColor(enabled),
-    contentColor = colors.contentColor(enabled),
-    interactionSource = interactionSource
-) {
-    Box(
-        modifier = Modifier.size(
-            width = FilledIconButtonTokens.ContainerWidth,
-            height = FilledIconButtonTokens.ContainerHeight
-        ),
-        contentAlignment = Alignment.Center
+) =
+    Surface(
+        onClick = onClick,
+        modifier = modifier.semantics { role = Role.Button },
+        enabled = enabled,
+        shape = shape,
+        color = colors.containerColor(enabled),
+        contentColor = colors.contentColor(enabled),
+        interactionSource = interactionSource
     ) {
-        content()
+        Box(
+            modifier =
+                Modifier.size(
+                    width = FilledIconButtonTokens.ContainerWidth,
+                    height = FilledIconButtonTokens.ContainerHeight
+                ),
+            contentAlignment = Alignment.Center
+        ) {
+            content()
+        }
     }
-}
 
 /**
- * <a href="https://m3.material.io/components/icon-button/overview" class="external" target="_blank">Material Design filled tonal icon button</a>.
+ * <a href="https://m3.material.io/components/icon-button/overview" class="external"
+ * target="_blank">Material Design filled tonal icon button</a>.
  *
  * Icon buttons help people take supplementary actions with a single tap. They’re used when a
  * compact button is required, such as in a toolbar or image list.
  *
- * ![Filled tonal icon button image](https://developer.android.com/images/reference/androidx/compose/material3/filled-tonal-icon-button.png)
+ * ![Filled tonal icon button
+ * image](https://developer.android.com/images/reference/androidx/compose/material3/filled-tonal-icon-button.png)
  *
- * A filled tonal icon button is a medium-emphasis icon button that is an alternative middle
- * ground between the default [FilledIconButton] and [OutlinedIconButton].
- * They can be used in contexts where the lower-priority icon button requires slightly more emphasis
- * than an outline would give.
+ * A filled tonal icon button is a medium-emphasis icon button that is an alternative middle ground
+ * between the default [FilledIconButton] and [OutlinedIconButton]. They can be used in contexts
+ * where the lower-priority icon button requires slightly more emphasis than an outline would give.
  *
  * [content] should typically be an [Icon] (see [androidx.compose.material.icons.Icons]). If using a
- * custom icon, note that the typical size for the internal icon is 24 x 24 dp.
- * This icon button has an overall minimum touch target size of 48 x 48dp, to meet accessibility
- * guidelines.
+ * custom icon, note that the typical size for the internal icon is 24 x 24 dp. This icon button has
+ * an overall minimum touch target size of 48 x 48dp, to meet accessibility guidelines.
  *
  * Filled tonal icon button sample:
+ *
  * @sample androidx.compose.material3.samples.FilledTonalIconButtonSample
  *
  * @param onClick called when this icon button is clicked
  * @param modifier the [Modifier] to be applied to this icon button
  * @param enabled controls the enabled state of this icon button. When `false`, this component will
- * not respond to user input, and it will appear visually disabled and disabled to accessibility
- * services.
+ *   not respond to user input, and it will appear visually disabled and disabled to accessibility
+ *   services.
  * @param shape defines the shape of this icon button's container
  * @param colors [IconButtonColors] that will be used to resolve the colors used for this icon
- * button in different states. See [IconButtonDefaults.filledIconButtonColors].
+ *   button in different states. See [IconButtonDefaults.filledIconButtonColors].
  * @param interactionSource an optional hoisted [MutableInteractionSource] for observing and
- * emitting [Interaction]s for this icon button. You can use this to change the icon button's
- * appearance or preview the icon button in different states. Note that if `null` is provided,
- * interactions will still happen internally.
+ *   emitting [Interaction]s for this icon button. You can use this to change the icon button's
+ *   appearance or preview the icon button in different states. Note that if `null` is provided,
+ *   interactions will still happen internally.
  * @param content the content of this icon button, typically an [Icon]
  */
 @Composable
@@ -273,55 +286,59 @@
     colors: IconButtonColors = IconButtonDefaults.filledTonalIconButtonColors(),
     interactionSource: MutableInteractionSource? = null,
     content: @Composable () -> Unit
-) = Surface(
-    onClick = onClick,
-    modifier = modifier.semantics { role = Role.Button },
-    enabled = enabled,
-    shape = shape,
-    color = colors.containerColor(enabled),
-    contentColor = colors.contentColor(enabled),
-    interactionSource = interactionSource
-) {
-    Box(
-        modifier = Modifier.size(
-            width = FilledTonalIconButtonTokens.ContainerWidth,
-            height = FilledTonalIconButtonTokens.ContainerHeight
-        ),
-        contentAlignment = Alignment.Center
+) =
+    Surface(
+        onClick = onClick,
+        modifier = modifier.semantics { role = Role.Button },
+        enabled = enabled,
+        shape = shape,
+        color = colors.containerColor(enabled),
+        contentColor = colors.contentColor(enabled),
+        interactionSource = interactionSource
     ) {
-        content()
+        Box(
+            modifier =
+                Modifier.size(
+                    width = FilledTonalIconButtonTokens.ContainerWidth,
+                    height = FilledTonalIconButtonTokens.ContainerHeight
+                ),
+            contentAlignment = Alignment.Center
+        ) {
+            content()
+        }
     }
-}
 
 /**
- * <a href="https://m3.material.io/components/icon-button/overview" class="external" target="_blank">Material Design filled icon toggle button</a>.
+ * <a href="https://m3.material.io/components/icon-button/overview" class="external"
+ * target="_blank">Material Design filled icon toggle button</a>.
  *
  * Icon buttons help people take supplementary actions with a single tap. They’re used when a
  * compact button is required, such as in a toolbar or image list.
  *
- * ![Filled icon toggle button image](https://developer.android.com/images/reference/androidx/compose/material3/filled-icon-toggle-button.png)
+ * ![Filled icon toggle button
+ * image](https://developer.android.com/images/reference/androidx/compose/material3/filled-icon-toggle-button.png)
  *
  * [content] should typically be an [Icon] (see [androidx.compose.material.icons.Icons]). If using a
- * custom icon, note that the typical size for the internal icon is 24 x 24 dp.
- * This icon button has an overall minimum touch target size of 48 x 48dp, to meet accessibility
- * guidelines.
+ * custom icon, note that the typical size for the internal icon is 24 x 24 dp. This icon button has
+ * an overall minimum touch target size of 48 x 48dp, to meet accessibility guidelines.
  *
  * Toggleable filled icon button sample:
+ *
  * @sample androidx.compose.material3.samples.FilledIconToggleButtonSample
  *
  * @param checked whether this icon button is toggled on or off
  * @param onCheckedChange called when this icon button is clicked
  * @param modifier the [Modifier] to be applied to this icon button
  * @param enabled controls the enabled state of this icon button. When `false`, this component will
- * not respond to user input, and it will appear visually disabled and disabled to accessibility
- * services.
+ *   not respond to user input, and it will appear visually disabled and disabled to accessibility
+ *   services.
  * @param shape defines the shape of this icon button's container
  * @param colors [IconToggleButtonColors] that will be used to resolve the colors used for this icon
- * button in different states. See [IconButtonDefaults.filledIconToggleButtonColors].
+ *   button in different states. See [IconButtonDefaults.filledIconToggleButtonColors].
  * @param interactionSource an optional hoisted [MutableInteractionSource] for observing and
- * emitting [Interaction]s for this icon button. You can use this to change the icon button's
- * appearance or preview the icon button in different states. Note that if `null` is provided,
- * interactions will still happen internally.
+ *   emitting [Interaction]s for this icon button. You can use this to change the icon button's
+ *   appearance or preview the icon button in different states. Note that if `null` is provided,
+ *   interactions will still happen internally.
  * @param content the content of this icon button, typically an [Icon]
  */
 @Composable
@@ -334,61 +351,65 @@
     colors: IconToggleButtonColors = IconButtonDefaults.filledIconToggleButtonColors(),
     interactionSource: MutableInteractionSource? = null,
     content: @Composable () -> Unit
-) = Surface(
-    checked = checked,
-    onCheckedChange = onCheckedChange,
-    modifier = modifier.semantics { role = Role.Checkbox },
-    enabled = enabled,
-    shape = shape,
-    color = colors.containerColor(enabled, checked).value,
-    contentColor = colors.contentColor(enabled, checked).value,
-    interactionSource = interactionSource
-) {
-    Box(
-        modifier = Modifier.size(
-            width = FilledIconButtonTokens.ContainerWidth,
-            height = FilledIconButtonTokens.ContainerHeight
-        ),
-        contentAlignment = Alignment.Center
+) =
+    Surface(
+        checked = checked,
+        onCheckedChange = onCheckedChange,
+        modifier = modifier.semantics { role = Role.Checkbox },
+        enabled = enabled,
+        shape = shape,
+        color = colors.containerColor(enabled, checked).value,
+        contentColor = colors.contentColor(enabled, checked).value,
+        interactionSource = interactionSource
     ) {
-        content()
+        Box(
+            modifier =
+                Modifier.size(
+                    width = FilledIconButtonTokens.ContainerWidth,
+                    height = FilledIconButtonTokens.ContainerHeight
+                ),
+            contentAlignment = Alignment.Center
+        ) {
+            content()
+        }
     }
-}
 
 /**
- * <a href="https://m3.material.io/components/icon-button/overview" class="external" target="_blank">Material Design filled tonal icon toggle button</a>.
+ * <a href="https://m3.material.io/components/icon-button/overview" class="external"
+ * target="_blank">Material Design filled tonal icon toggle button</a>.
  *
  * Icon buttons help people take supplementary actions with a single tap. They’re used when a
  * compact button is required, such as in a toolbar or image list.
  *
- * ![Filled tonal icon toggle button image](https://developer.android.com/images/reference/androidx/compose/material3/filled-tonal-icon-toggle-button.png)
+ * ![Filled tonal icon toggle button
+ * image](https://developer.android.com/images/reference/androidx/compose/material3/filled-tonal-icon-toggle-button.png)
  *
- * A filled tonal toggle icon button is a medium-emphasis icon button that is an alternative
- * middle ground between the default [FilledIconToggleButton] and [OutlinedIconToggleButton].
- * They can be used in contexts where the lower-priority icon button requires slightly more emphasis
- * than an outline would give.
+ * A filled tonal toggle icon button is a medium-emphasis icon button that is an alternative middle
+ * ground between the default [FilledIconToggleButton] and [OutlinedIconToggleButton]. They can be
+ * used in contexts where the lower-priority icon button requires slightly more emphasis than an
+ * outline would give.
  *
  * [content] should typically be an [Icon] (see [androidx.compose.material.icons.Icons]). If using a
- * custom icon, note that the typical size for the internal icon is 24 x 24 dp.
- * This icon button has an overall minimum touch target size of 48 x 48dp, to meet accessibility
- * guidelines.
+ * custom icon, note that the typical size for the internal icon is 24 x 24 dp. This icon button has
+ * an overall minimum touch target size of 48 x 48dp, to meet accessibility guidelines.
  *
  * Toggleable filled tonal icon button sample:
+ *
  * @sample androidx.compose.material3.samples.FilledTonalIconToggleButtonSample
  *
  * @param checked whether this icon button is toggled on or off
  * @param onCheckedChange called when this icon button is clicked
  * @param modifier the [Modifier] to be applied to this icon button
  * @param enabled controls the enabled state of this icon button. When `false`, this component will
- * not respond to user input, and it will appear visually disabled and disabled to accessibility
- * services.
+ *   not respond to user input, and it will appear visually disabled and disabled to accessibility
+ *   services.
  * @param shape defines the shape of this icon button's container
  * @param colors [IconToggleButtonColors] that will be used to resolve the colors used for this icon
- * button in different states. See [IconButtonDefaults.filledIconToggleButtonColors].
+ *   button in different states. See [IconButtonDefaults.filledIconToggleButtonColors].
  * @param interactionSource an optional hoisted [MutableInteractionSource] for observing and
- * emitting [Interaction]s for this icon button. You can use this to change the icon button's
- * appearance or preview the icon button in different states. Note that if `null` is provided,
- * interactions will still happen internally.
+ *   emitting [Interaction]s for this icon button. You can use this to change the icon button's
+ *   appearance or preview the icon button in different states. Note that if `null` is provided,
+ *   interactions will still happen internally.
  * @param content the content of this icon button, typically an [Icon]
  */
 @Composable
@@ -401,34 +422,38 @@
     colors: IconToggleButtonColors = IconButtonDefaults.filledTonalIconToggleButtonColors(),
     interactionSource: MutableInteractionSource? = null,
     content: @Composable () -> Unit
-) = Surface(
-    checked = checked,
-    onCheckedChange = onCheckedChange,
-    modifier = modifier.semantics { role = Role.Checkbox },
-    enabled = enabled,
-    shape = shape,
-    color = colors.containerColor(enabled, checked).value,
-    contentColor = colors.contentColor(enabled, checked).value,
-    interactionSource = interactionSource
-) {
-    Box(
-        modifier = Modifier.size(
-            width = FilledTonalIconButtonTokens.ContainerWidth,
-            height = FilledTonalIconButtonTokens.ContainerHeight
-        ),
-        contentAlignment = Alignment.Center
+) =
+    Surface(
+        checked = checked,
+        onCheckedChange = onCheckedChange,
+        modifier = modifier.semantics { role = Role.Checkbox },
+        enabled = enabled,
+        shape = shape,
+        color = colors.containerColor(enabled, checked).value,
+        contentColor = colors.contentColor(enabled, checked).value,
+        interactionSource = interactionSource
     ) {
-        content()
+        Box(
+            modifier =
+                Modifier.size(
+                    width = FilledTonalIconButtonTokens.ContainerWidth,
+                    height = FilledTonalIconButtonTokens.ContainerHeight
+                ),
+            contentAlignment = Alignment.Center
+        ) {
+            content()
+        }
     }
-}
 
 /**
- * <a href="https://m3.material.io/components/icon-button/overview" class="external" target="_blank">Material Design outlined icon button</a>.
+ * <a href="https://m3.material.io/components/icon-button/overview" class="external"
+ * target="_blank">Material Design outlined icon button</a>.
  *
  * Icon buttons help people take supplementary actions with a single tap. They’re used when a
  * compact button is required, such as in a toolbar or image list.
  *
- * ![Outlined icon button image](https://developer.android.com/images/reference/androidx/compose/material3/outlined-icon-button.png)
+ * ![Outlined icon button
+ * image](https://developer.android.com/images/reference/androidx/compose/material3/outlined-icon-button.png)
  *
  * Icon buttons help people take supplementary actions with a single tap. They’re used when a
  * compact button is required, such as in a toolbar or image list.
@@ -437,27 +462,26 @@
  * background.
  *
  * [content] should typically be an [Icon] (see [androidx.compose.material.icons.Icons]). If using a
- * custom icon, note that the typical size for the internal icon is 24 x 24 dp.
- * The outlined icon button has an overall minimum touch target size of 48 x 48dp, to meet
- * accessibility guidelines.
+ * custom icon, note that the typical size for the internal icon is 24 x 24 dp. The outlined icon
+ * button has an overall minimum touch target size of 48 x 48dp, to meet accessibility guidelines.
  *
  * @sample androidx.compose.material3.samples.OutlinedIconButtonSample
  *
  * @param onClick called when this icon button is clicked
  * @param modifier the [Modifier] to be applied to this icon button
  * @param enabled controls the enabled state of this icon button. When `false`, this component will
- * not respond to user input, and it will appear visually disabled and disabled to accessibility
- * services.
+ *   not respond to user input, and it will appear visually disabled and disabled to accessibility
+ *   services.
  * @param shape defines the shape of this icon button's container and border (when [border] is not
- * null)
+ *   null)
  * @param colors [IconButtonColors] that will be used to resolve the colors used for this icon
- * button in different states. See [IconButtonDefaults.outlinedIconButtonColors].
+ *   button in different states. See [IconButtonDefaults.outlinedIconButtonColors].
  * @param border the border to draw around the container of this icon button. Pass `null` for no
- * border. See [IconButtonDefaults.outlinedIconButtonBorder].
+ *   border. See [IconButtonDefaults.outlinedIconButtonBorder].
  * @param interactionSource an optional hoisted [MutableInteractionSource] for observing and
- * emitting [Interaction]s for this icon button. You can use this to change the icon button's
- * appearance or preview the icon button in different states. Note that if `null` is provided,
- * interactions will still happen internally.
+ *   emitting [Interaction]s for this icon button. You can use this to change the icon button's
+ *   appearance or preview the icon button in different states. Note that if `null` is provided,
+ *   interactions will still happen internally.
  * @param content the content of this icon button, typically an [Icon]
  */
 @Composable
@@ -470,36 +494,38 @@
     border: BorderStroke? = IconButtonDefaults.outlinedIconButtonBorder(enabled),
     interactionSource: MutableInteractionSource? = null,
     content: @Composable () -> Unit
-) = Surface(
-    onClick = onClick,
-    modifier = modifier.semantics { role = Role.Button },
-    enabled = enabled,
-    shape = shape,
-    color = colors.containerColor(enabled),
-    contentColor = colors.contentColor(enabled),
-    border = border,
-    interactionSource = interactionSource
-) {
-    Box(
-        modifier = Modifier.size(OutlinedIconButtonTokens.ContainerSize),
-        contentAlignment = Alignment.Center
+) =
+    Surface(
+        onClick = onClick,
+        modifier = modifier.semantics { role = Role.Button },
+        enabled = enabled,
+        shape = shape,
+        color = colors.containerColor(enabled),
+        contentColor = colors.contentColor(enabled),
+        border = border,
+        interactionSource = interactionSource
     ) {
-        content()
+        Box(
+            modifier = Modifier.size(OutlinedIconButtonTokens.ContainerSize),
+            contentAlignment = Alignment.Center
+        ) {
+            content()
+        }
     }
-}
 
 /**
- * <a href="https://m3.material.io/components/icon-button/overview" class="external" target="_blank">Material Design outlined icon toggle button</a>.
+ * <a href="https://m3.material.io/components/icon-button/overview" class="external"
+ * target="_blank">Material Design outlined icon toggle button</a>.
  *
  * Icon buttons help people take supplementary actions with a single tap. They’re used when a
  * compact button is required, such as in a toolbar or image list.
  *
- * ![Outlined icon toggle button image](https://developer.android.com/images/reference/androidx/compose/material3/outlined-icon-toggle-button.png)
+ * ![Outlined icon toggle button
+ * image](https://developer.android.com/images/reference/androidx/compose/material3/outlined-icon-toggle-button.png)
  *
  * [content] should typically be an [Icon] (see [androidx.compose.material.icons.Icons]). If using a
- * custom icon, note that the typical size for the internal icon is 24 x 24 dp.
- * This icon button has an overall minimum touch target size of 48 x 48dp, to meet accessibility
- * guidelines.
+ * custom icon, note that the typical size for the internal icon is 24 x 24 dp. This icon button has
+ * an overall minimum touch target size of 48 x 48dp, to meet accessibility guidelines.
  *
  * @sample androidx.compose.material3.samples.OutlinedIconToggleButtonSample
  *
@@ -507,18 +533,18 @@
  * @param onCheckedChange called when this icon button is clicked
  * @param modifier the [Modifier] to be applied to this icon button
  * @param enabled controls the enabled state of this icon button. When `false`, this component will
- * not respond to user input, and it will appear visually disabled and disabled to accessibility
- * services.
+ *   not respond to user input, and it will appear visually disabled and disabled to accessibility
+ *   services.
  * @param shape defines the shape of this icon button's container and border (when [border] is not
- * null)
+ *   null)
  * @param colors [IconToggleButtonColors] that will be used to resolve the colors used for this icon
- * button in different states. See [IconButtonDefaults.outlinedIconToggleButtonColors].
+ *   button in different states. See [IconButtonDefaults.outlinedIconToggleButtonColors].
  * @param border the border to draw around the container of this icon button. Pass `null` for no
- * border. See [IconButtonDefaults.outlinedIconToggleButtonBorder].
+ *   border. See [IconButtonDefaults.outlinedIconToggleButtonBorder].
  * @param interactionSource an optional hoisted [MutableInteractionSource] for observing and
- * emitting [Interaction]s for this icon button. You can use this to change the icon button's
- * appearance or preview the icon button in different states. Note that if `null` is provided,
- * interactions will still happen internally.
+ *   emitting [Interaction]s for this icon button. You can use this to change the icon button's
+ *   appearance or preview the icon button in different states. Note that if `null` is provided,
+ *   interactions will still happen internally.
  * @param content the content of this icon button, typically an [Icon]
  */
 @Composable
@@ -532,40 +558,37 @@
     border: BorderStroke? = IconButtonDefaults.outlinedIconToggleButtonBorder(enabled, checked),
     interactionSource: MutableInteractionSource? = null,
     content: @Composable () -> Unit
-) = Surface(
-    checked = checked,
-    onCheckedChange = onCheckedChange,
-    modifier = modifier.semantics { role = Role.Checkbox },
-    enabled = enabled,
-    shape = shape,
-    color = colors.containerColor(enabled, checked).value,
-    contentColor = colors.contentColor(enabled, checked).value,
-    border = border,
-    interactionSource = interactionSource
-) {
-    Box(
-        modifier = Modifier.size(OutlinedIconButtonTokens.ContainerSize),
-        contentAlignment = Alignment.Center
+) =
+    Surface(
+        checked = checked,
+        onCheckedChange = onCheckedChange,
+        modifier = modifier.semantics { role = Role.Checkbox },
+        enabled = enabled,
+        shape = shape,
+        color = colors.containerColor(enabled, checked).value,
+        contentColor = colors.contentColor(enabled, checked).value,
+        border = border,
+        interactionSource = interactionSource
     ) {
-        content()
+        Box(
+            modifier = Modifier.size(OutlinedIconButtonTokens.ContainerSize),
+            contentAlignment = Alignment.Center
+        ) {
+            content()
+        }
     }
-}
 
-/**
- * Contains the default values used by all icon button types.
- */
+/** Contains the default values used by all icon button types. */
 object IconButtonDefaults {
     /** Default shape for a filled icon button. */
-    val filledShape: Shape @Composable get() = FilledIconButtonTokens.ContainerShape.value
+    val filledShape: Shape
+        @Composable get() = FilledIconButtonTokens.ContainerShape.value
 
     /** Default shape for an outlined icon button. */
     val outlinedShape: Shape
-        @Composable get() =
-            OutlinedIconButtonTokens.ContainerShape.value
+        @Composable get() = OutlinedIconButtonTokens.ContainerShape.value
 
-    /**
-     * Creates a [IconButtonColors] that represents the default colors used in a [IconButton].
-     */
+    /** Creates a [IconButtonColors] that represents the default colors used in a [IconButton]. */
     @Composable
     fun iconButtonColors(): IconButtonColors {
         val contentColor = LocalContentColor.current
@@ -576,7 +599,7 @@
             return colors.copy(
                 contentColor = contentColor,
                 disabledContentColor =
-                contentColor.copy(alpha = IconButtonTokens.DisabledIconOpacity)
+                    contentColor.copy(alpha = IconButtonTokens.DisabledIconOpacity)
             )
         }
     }
@@ -597,27 +620,27 @@
         disabledContentColor: Color =
             contentColor.copy(alpha = IconButtonTokens.DisabledIconOpacity)
     ): IconButtonColors =
-        MaterialTheme.colorScheme.defaultIconButtonColors(LocalContentColor.current).copy(
-            containerColor = containerColor,
-            contentColor = contentColor,
-            disabledContainerColor = disabledContainerColor,
-            disabledContentColor = disabledContentColor,
-        )
+        MaterialTheme.colorScheme
+            .defaultIconButtonColors(LocalContentColor.current)
+            .copy(
+                containerColor = containerColor,
+                contentColor = contentColor,
+                disabledContainerColor = disabledContainerColor,
+                disabledContentColor = disabledContentColor,
+            )
 
-    internal fun ColorScheme.defaultIconButtonColors(
-        localContentColor: Color
-    ): IconButtonColors {
-        return defaultIconButtonColorsCached ?: run {
-            IconButtonColors(
-                containerColor = Color.Transparent,
-                contentColor = localContentColor,
-                disabledContainerColor = Color.Transparent,
-                disabledContentColor =
-                localContentColor.copy(alpha = IconButtonTokens.DisabledIconOpacity)
-            ).also {
-                defaultIconButtonColorsCached = it
+    internal fun ColorScheme.defaultIconButtonColors(localContentColor: Color): IconButtonColors {
+        return defaultIconButtonColorsCached
+            ?: run {
+                IconButtonColors(
+                        containerColor = Color.Transparent,
+                        contentColor = localContentColor,
+                        disabledContainerColor = Color.Transparent,
+                        disabledContentColor =
+                            localContentColor.copy(alpha = IconButtonTokens.DisabledIconOpacity)
+                    )
+                    .also { defaultIconButtonColorsCached = it }
             }
-        }
     }
 
     /**
@@ -634,7 +657,7 @@
             return colors.copy(
                 contentColor = contentColor,
                 disabledContentColor =
-                contentColor.copy(alpha = IconButtonTokens.DisabledIconOpacity)
+                    contentColor.copy(alpha = IconButtonTokens.DisabledIconOpacity)
             )
         }
     }
@@ -659,33 +682,34 @@
             contentColor.copy(alpha = IconButtonTokens.DisabledIconOpacity),
         checkedContainerColor: Color = Color.Unspecified,
         checkedContentColor: Color = Color.Unspecified
-    ): IconToggleButtonColors = MaterialTheme.colorScheme.defaultIconToggleButtonColors(
-        LocalContentColor.current
-    ).copy(
-        containerColor = containerColor,
-        contentColor = contentColor,
-        disabledContainerColor = disabledContainerColor,
-        disabledContentColor = disabledContentColor,
-        checkedContainerColor = checkedContainerColor,
-        checkedContentColor = checkedContentColor,
-    )
+    ): IconToggleButtonColors =
+        MaterialTheme.colorScheme
+            .defaultIconToggleButtonColors(LocalContentColor.current)
+            .copy(
+                containerColor = containerColor,
+                contentColor = contentColor,
+                disabledContainerColor = disabledContainerColor,
+                disabledContentColor = disabledContentColor,
+                checkedContainerColor = checkedContainerColor,
+                checkedContentColor = checkedContentColor,
+            )
 
     internal fun ColorScheme.defaultIconToggleButtonColors(
         localContentColor: Color
     ): IconToggleButtonColors {
-        return defaultIconToggleButtonColorsCached ?: run {
-            IconToggleButtonColors(
-                containerColor = Color.Transparent,
-                contentColor = localContentColor,
-                disabledContainerColor = Color.Transparent,
-                disabledContentColor =
-                localContentColor.copy(alpha = IconButtonTokens.DisabledIconOpacity),
-                checkedContainerColor = Color.Transparent,
-                checkedContentColor = fromToken(IconButtonTokens.SelectedIconColor)
-            ).also {
-                defaultIconToggleButtonColorsCached = it
+        return defaultIconToggleButtonColorsCached
+            ?: run {
+                IconToggleButtonColors(
+                        containerColor = Color.Transparent,
+                        contentColor = localContentColor,
+                        disabledContainerColor = Color.Transparent,
+                        disabledContentColor =
+                            localContentColor.copy(alpha = IconButtonTokens.DisabledIconOpacity),
+                        checkedContainerColor = Color.Transparent,
+                        checkedContentColor = fromToken(IconButtonTokens.SelectedIconColor)
+                    )
+                    .also { defaultIconToggleButtonColorsCached = it }
             }
-        }
     }
 
     /**
@@ -709,25 +733,29 @@
         contentColor: Color = contentColorFor(containerColor),
         disabledContainerColor: Color = Color.Unspecified,
         disabledContentColor: Color = Color.Unspecified
-    ): IconButtonColors = MaterialTheme.colorScheme.defaultFilledIconButtonColors.copy(
-        containerColor = containerColor,
-        contentColor = contentColor,
-        disabledContainerColor = disabledContainerColor,
-        disabledContentColor = disabledContentColor,
-    )
+    ): IconButtonColors =
+        MaterialTheme.colorScheme.defaultFilledIconButtonColors.copy(
+            containerColor = containerColor,
+            contentColor = contentColor,
+            disabledContainerColor = disabledContainerColor,
+            disabledContentColor = disabledContentColor,
+        )
 
     internal val ColorScheme.defaultFilledIconButtonColors: IconButtonColors
         get() {
-            return defaultFilledIconButtonColorsCached ?: IconButtonColors(
-                containerColor = fromToken(FilledIconButtonTokens.ContainerColor),
-                contentColor = contentColorFor(fromToken(FilledIconButtonTokens.ContainerColor)),
-                disabledContainerColor = fromToken(FilledIconButtonTokens.DisabledContainerColor)
-                    .copy(alpha = FilledIconButtonTokens.DisabledContainerOpacity),
-                disabledContentColor = fromToken(FilledIconButtonTokens.DisabledColor)
-                    .copy(alpha = FilledIconButtonTokens.DisabledOpacity)
-            ).also {
-                defaultFilledIconButtonColorsCached = it
-            }
+            return defaultFilledIconButtonColorsCached
+                ?: IconButtonColors(
+                        containerColor = fromToken(FilledIconButtonTokens.ContainerColor),
+                        contentColor =
+                            contentColorFor(fromToken(FilledIconButtonTokens.ContainerColor)),
+                        disabledContainerColor =
+                            fromToken(FilledIconButtonTokens.DisabledContainerColor)
+                                .copy(alpha = FilledIconButtonTokens.DisabledContainerOpacity),
+                        disabledContentColor =
+                            fromToken(FilledIconButtonTokens.DisabledColor)
+                                .copy(alpha = FilledIconButtonTokens.DisabledOpacity)
+                    )
+                    .also { defaultFilledIconButtonColorsCached = it }
         }
 
     /**
@@ -771,21 +799,27 @@
 
     internal val ColorScheme.defaultFilledIconToggleButtonColors: IconToggleButtonColors
         get() {
-            return defaultFilledIconToggleButtonColorsCached ?: IconToggleButtonColors(
-                containerColor = fromToken(FilledIconButtonTokens.UnselectedContainerColor),
-                // TODO(b/228455081): Using contentColorFor here will return OnSurfaceVariant,
-                //  while the token value is Primary.
-                contentColor = fromToken(FilledIconButtonTokens.ToggleUnselectedColor),
-                disabledContainerColor = fromToken(FilledIconButtonTokens.DisabledContainerColor)
-                    .copy(alpha = FilledIconButtonTokens.DisabledContainerOpacity),
-                disabledContentColor = fromToken(FilledIconButtonTokens.DisabledColor)
-                    .copy(alpha = FilledIconButtonTokens.DisabledOpacity),
-                checkedContainerColor = fromToken(FilledIconButtonTokens.SelectedContainerColor),
-                checkedContentColor =
-                contentColorFor(fromToken(FilledIconButtonTokens.SelectedContainerColor))
-            ).also {
-                defaultFilledIconToggleButtonColorsCached = it
-            }
+            return defaultFilledIconToggleButtonColorsCached
+                ?: IconToggleButtonColors(
+                        containerColor = fromToken(FilledIconButtonTokens.UnselectedContainerColor),
+                        // TODO(b/228455081): Using contentColorFor here will return
+                        // OnSurfaceVariant,
+                        //  while the token value is Primary.
+                        contentColor = fromToken(FilledIconButtonTokens.ToggleUnselectedColor),
+                        disabledContainerColor =
+                            fromToken(FilledIconButtonTokens.DisabledContainerColor)
+                                .copy(alpha = FilledIconButtonTokens.DisabledContainerOpacity),
+                        disabledContentColor =
+                            fromToken(FilledIconButtonTokens.DisabledColor)
+                                .copy(alpha = FilledIconButtonTokens.DisabledOpacity),
+                        checkedContainerColor =
+                            fromToken(FilledIconButtonTokens.SelectedContainerColor),
+                        checkedContentColor =
+                            contentColorFor(
+                                fromToken(FilledIconButtonTokens.SelectedContainerColor)
+                            )
+                    )
+                    .also { defaultFilledIconToggleButtonColorsCached = it }
         }
 
     /**
@@ -821,18 +855,19 @@
 
     internal val ColorScheme.defaultFilledTonalIconButtonColors: IconButtonColors
         get() {
-            return defaultFilledTonalIconButtonColorsCached ?: IconButtonColors(
-                containerColor = fromToken(FilledTonalIconButtonTokens.ContainerColor),
-                contentColor =
-                contentColorFor(fromToken(FilledTonalIconButtonTokens.ContainerColor)),
-                disabledContainerColor =
-                fromToken(FilledTonalIconButtonTokens.DisabledContainerColor)
-                    .copy(alpha = FilledTonalIconButtonTokens.DisabledContainerOpacity),
-                disabledContentColor = fromToken(FilledTonalIconButtonTokens.DisabledColor)
-                    .copy(alpha = FilledTonalIconButtonTokens.DisabledOpacity)
-            ).also {
-                defaultFilledTonalIconButtonColorsCached = it
-            }
+            return defaultFilledTonalIconButtonColorsCached
+                ?: IconButtonColors(
+                        containerColor = fromToken(FilledTonalIconButtonTokens.ContainerColor),
+                        contentColor =
+                            contentColorFor(fromToken(FilledTonalIconButtonTokens.ContainerColor)),
+                        disabledContainerColor =
+                            fromToken(FilledTonalIconButtonTokens.DisabledContainerColor)
+                                .copy(alpha = FilledTonalIconButtonTokens.DisabledContainerOpacity),
+                        disabledContentColor =
+                            fromToken(FilledTonalIconButtonTokens.DisabledColor)
+                                .copy(alpha = FilledTonalIconButtonTokens.DisabledOpacity)
+                    )
+                    .also { defaultFilledTonalIconButtonColorsCached = it }
         }
 
     /**
@@ -874,23 +909,26 @@
 
     internal val ColorScheme.defaultFilledTonalIconToggleButtonColors: IconToggleButtonColors
         get() {
-            return defaultFilledTonalIconToggleButtonColorsCached ?: IconToggleButtonColors(
-                containerColor = fromToken(FilledTonalIconButtonTokens.UnselectedContainerColor),
-                contentColor =
-                contentColorFor(
-                    fromToken(FilledTonalIconButtonTokens.UnselectedContainerColor)
-                ),
-                disabledContainerColor =
-                fromToken(FilledTonalIconButtonTokens.DisabledContainerColor)
-                    .copy(alpha = FilledTonalIconButtonTokens.DisabledContainerOpacity),
-                disabledContentColor = fromToken(FilledTonalIconButtonTokens.DisabledColor)
-                    .copy(alpha = FilledTonalIconButtonTokens.DisabledOpacity),
-                checkedContainerColor =
-                fromToken(FilledTonalIconButtonTokens.SelectedContainerColor),
-                checkedContentColor = fromToken(FilledTonalIconButtonTokens.ToggleSelectedColor)
-            ).also {
-                defaultFilledTonalIconToggleButtonColorsCached = it
-            }
+            return defaultFilledTonalIconToggleButtonColorsCached
+                ?: IconToggleButtonColors(
+                        containerColor =
+                            fromToken(FilledTonalIconButtonTokens.UnselectedContainerColor),
+                        contentColor =
+                            contentColorFor(
+                                fromToken(FilledTonalIconButtonTokens.UnselectedContainerColor)
+                            ),
+                        disabledContainerColor =
+                            fromToken(FilledTonalIconButtonTokens.DisabledContainerColor)
+                                .copy(alpha = FilledTonalIconButtonTokens.DisabledContainerOpacity),
+                        disabledContentColor =
+                            fromToken(FilledTonalIconButtonTokens.DisabledColor)
+                                .copy(alpha = FilledTonalIconButtonTokens.DisabledOpacity),
+                        checkedContainerColor =
+                            fromToken(FilledTonalIconButtonTokens.SelectedContainerColor),
+                        checkedContentColor =
+                            fromToken(FilledTonalIconButtonTokens.ToggleSelectedColor)
+                    )
+                    .also { defaultFilledTonalIconToggleButtonColorsCached = it }
         }
 
     /**
@@ -908,7 +946,7 @@
             return colors.copy(
                 contentColor = contentColor,
                 disabledContentColor =
-                contentColor.copy(alpha = OutlinedIconButtonTokens.DisabledOpacity)
+                    contentColor.copy(alpha = OutlinedIconButtonTokens.DisabledOpacity)
             )
         }
     }
@@ -930,29 +968,29 @@
         disabledContentColor: Color =
             contentColor.copy(alpha = OutlinedIconButtonTokens.DisabledOpacity)
     ): IconButtonColors =
-        MaterialTheme.colorScheme.defaultOutlinedIconButtonColors(
-            LocalContentColor.current
-        ).copy(
-            containerColor = containerColor,
-            contentColor = contentColor,
-            disabledContainerColor = disabledContainerColor,
-            disabledContentColor = disabledContentColor,
-        )
+        MaterialTheme.colorScheme
+            .defaultOutlinedIconButtonColors(LocalContentColor.current)
+            .copy(
+                containerColor = containerColor,
+                contentColor = contentColor,
+                disabledContainerColor = disabledContainerColor,
+                disabledContentColor = disabledContentColor,
+            )
 
     internal fun ColorScheme.defaultOutlinedIconButtonColors(
         localContentColor: Color
     ): IconButtonColors {
-        return defaultOutlinedIconButtonColorsCached ?: run {
-            IconButtonColors(
-                containerColor = Color.Transparent,
-                contentColor = localContentColor,
-                disabledContainerColor = Color.Transparent,
-                disabledContentColor =
-                localContentColor.copy(alpha = OutlinedIconButtonTokens.DisabledOpacity)
-            ).also {
-                defaultOutlinedIconButtonColorsCached = it
+        return defaultOutlinedIconButtonColorsCached
+            ?: run {
+                IconButtonColors(
+                        containerColor = Color.Transparent,
+                        contentColor = localContentColor,
+                        disabledContainerColor = Color.Transparent,
+                        disabledContentColor =
+                            localContentColor.copy(alpha = OutlinedIconButtonTokens.DisabledOpacity)
+                    )
+                    .also { defaultOutlinedIconButtonColorsCached = it }
             }
-        }
     }
 
     /**
@@ -969,7 +1007,7 @@
             return colors.copy(
                 contentColor = contentColor,
                 disabledContentColor =
-                contentColor.copy(alpha = OutlinedIconButtonTokens.DisabledOpacity)
+                    contentColor.copy(alpha = OutlinedIconButtonTokens.DisabledOpacity)
             )
         }
     }
@@ -995,35 +1033,39 @@
         checkedContainerColor: Color = Color.Unspecified,
         checkedContentColor: Color = contentColorFor(checkedContainerColor)
     ): IconToggleButtonColors =
-        MaterialTheme.colorScheme.defaultOutlinedIconToggleButtonColors(
-            LocalContentColor.current
-        ).copy(
-            containerColor = containerColor,
-            contentColor = contentColor,
-            disabledContainerColor = disabledContainerColor,
-            disabledContentColor = disabledContentColor,
-            checkedContainerColor = checkedContainerColor,
-            checkedContentColor = checkedContentColor,
-        )
+        MaterialTheme.colorScheme
+            .defaultOutlinedIconToggleButtonColors(LocalContentColor.current)
+            .copy(
+                containerColor = containerColor,
+                contentColor = contentColor,
+                disabledContainerColor = disabledContainerColor,
+                disabledContentColor = disabledContentColor,
+                checkedContainerColor = checkedContainerColor,
+                checkedContentColor = checkedContentColor,
+            )
 
     internal fun ColorScheme.defaultOutlinedIconToggleButtonColors(
         localContentColor: Color
     ): IconToggleButtonColors {
-        return defaultIconToggleButtonColorsCached ?: run {
-            IconToggleButtonColors(
-                containerColor = Color.Transparent,
-                contentColor = localContentColor,
-                disabledContainerColor = Color.Transparent,
-                disabledContentColor =
-                localContentColor.copy(alpha = OutlinedIconButtonTokens.DisabledOpacity),
-                checkedContainerColor =
-                fromToken(OutlinedIconButtonTokens.SelectedContainerColor),
-                checkedContentColor =
-                contentColorFor(fromToken(OutlinedIconButtonTokens.SelectedContainerColor))
-            ).also {
-                defaultOutlinedIconToggleButtonColorsCached = it
+        return defaultIconToggleButtonColorsCached
+            ?: run {
+                IconToggleButtonColors(
+                        containerColor = Color.Transparent,
+                        contentColor = localContentColor,
+                        disabledContainerColor = Color.Transparent,
+                        disabledContentColor =
+                            localContentColor.copy(
+                                alpha = OutlinedIconButtonTokens.DisabledOpacity
+                            ),
+                        checkedContainerColor =
+                            fromToken(OutlinedIconButtonTokens.SelectedContainerColor),
+                        checkedContentColor =
+                            contentColorFor(
+                                fromToken(OutlinedIconButtonTokens.SelectedContainerColor)
+                            )
+                    )
+                    .also { defaultOutlinedIconToggleButtonColorsCached = it }
             }
-        }
     }
 
     /**
@@ -1048,12 +1090,14 @@
      */
     @Composable
     fun outlinedIconButtonBorder(enabled: Boolean): BorderStroke {
-        val color: Color = if (enabled) {
-            LocalContentColor.current
-        } else {
-            LocalContentColor.current
-                .copy(alpha = OutlinedIconButtonTokens.DisabledUnselectedOutlineOpacity)
-        }
+        val color: Color =
+            if (enabled) {
+                LocalContentColor.current
+            } else {
+                LocalContentColor.current.copy(
+                    alpha = OutlinedIconButtonTokens.DisabledUnselectedOutlineOpacity
+                )
+            }
         return remember(color) {
             BorderStroke(OutlinedIconButtonTokens.UnselectedOutlineWidth, color)
         }
@@ -1063,17 +1107,16 @@
 /**
  * Represents the container and content colors used in an icon button in different states.
  *
- * @constructor create an instance with arbitrary colors.
- * - See [IconButtonDefaults.filledIconButtonColors] and
- * [IconButtonDefaults.filledTonalIconButtonColors] for the default colors used in a
- * [FilledIconButton].
- * - See [IconButtonDefaults.outlinedIconButtonColors] for the default colors used in an
- * [OutlinedIconButton].
- *
  * @param containerColor the container color of this icon button when enabled.
  * @param contentColor the content color of this icon button when enabled.
  * @param disabledContainerColor the container color of this icon button when not enabled.
  * @param disabledContentColor the content color of this icon button when not enabled.
+ * @constructor create an instance with arbitrary colors.
+ * - See [IconButtonDefaults.filledIconButtonColors] and
+ *   [IconButtonDefaults.filledTonalIconButtonColors] for the default colors used in a
+ *   [FilledIconButton].
+ * - See [IconButtonDefaults.outlinedIconButtonColors] for the default colors used in an
+ *   [OutlinedIconButton].
  */
 @Immutable
 class IconButtonColors(
@@ -1084,20 +1127,21 @@
 ) {
 
     /**
-     * Returns a copy of this IconButtonColors, optionally overriding some of the values.
-     * This uses the Color.Unspecified to mean “use the value from the source”
+     * Returns a copy of this IconButtonColors, optionally overriding some of the values. This uses
+     * the Color.Unspecified to mean “use the value from the source”
      */
     fun copy(
         containerColor: Color = this.containerColor,
         contentColor: Color = this.contentColor,
         disabledContainerColor: Color = this.disabledContainerColor,
         disabledContentColor: Color = this.disabledContentColor,
-    ) = IconButtonColors(
-        containerColor.takeOrElse { this.containerColor },
-        contentColor.takeOrElse { this.contentColor },
-        disabledContainerColor.takeOrElse { this.disabledContainerColor },
-        disabledContentColor.takeOrElse { this.disabledContentColor },
-    )
+    ) =
+        IconButtonColors(
+            containerColor.takeOrElse { this.containerColor },
+            contentColor.takeOrElse { this.contentColor },
+            disabledContainerColor.takeOrElse { this.disabledContainerColor },
+            disabledContentColor.takeOrElse { this.disabledContentColor },
+        )
 
     /**
      * Represents the container color for this icon button, depending on [enabled].
@@ -1140,15 +1184,7 @@
 }
 
 /**
- * Represents the container and content colors used in a toggleable icon button in
- * different states.
- *
- * @constructor create an instance with arbitrary colors.
- * - See [IconButtonDefaults.filledIconToggleButtonColors] and
- * [IconButtonDefaults.filledTonalIconToggleButtonColors] for the default colors used in a
- * [FilledIconButton].
- * - See [IconButtonDefaults.outlinedIconToggleButtonColors] for the default colors used in a
- *  toggleable [OutlinedIconButton].
+ * Represents the container and content colors used in a toggleable icon button in different states.
  *
  * @param containerColor the container color of this icon button when enabled.
  * @param contentColor the content color of this icon button when enabled.
@@ -1156,6 +1192,12 @@
  * @param disabledContentColor the content color of this icon button when not enabled.
  * @param checkedContainerColor the container color of this icon button when checked.
  * @param checkedContentColor the content color of this icon button when checked.
+ * @constructor create an instance with arbitrary colors.
+ * - See [IconButtonDefaults.filledIconToggleButtonColors] and
+ *   [IconButtonDefaults.filledTonalIconToggleButtonColors] for the default colors used in a
+ *   [FilledIconButton].
+ * - See [IconButtonDefaults.outlinedIconToggleButtonColors] for the default colors used in a
+ *   toggleable [OutlinedIconButton].
  */
 @Immutable
 class IconToggleButtonColors(
@@ -1168,8 +1210,8 @@
 ) {
 
     /**
-     * Returns a copy of this IconToggleButtonColors, optionally overriding some of the values.
-     * This uses the Color.Unspecified to mean “use the value from the source”
+     * Returns a copy of this IconToggleButtonColors, optionally overriding some of the values. This
+     * uses the Color.Unspecified to mean “use the value from the source”
      */
     fun copy(
         containerColor: Color = this.containerColor,
@@ -1178,14 +1220,15 @@
         disabledContentColor: Color = this.disabledContentColor,
         checkedContainerColor: Color = this.checkedContainerColor,
         checkedContentColor: Color = this.checkedContentColor
-    ) = IconToggleButtonColors(
-        containerColor.takeOrElse { this.containerColor },
-        contentColor.takeOrElse { this.contentColor },
-        disabledContainerColor.takeOrElse { this.disabledContainerColor },
-        disabledContentColor.takeOrElse { this.disabledContentColor },
-        checkedContainerColor.takeOrElse { this.checkedContainerColor },
-        checkedContentColor.takeOrElse { this.checkedContentColor }
-    )
+    ) =
+        IconToggleButtonColors(
+            containerColor.takeOrElse { this.containerColor },
+            contentColor.takeOrElse { this.contentColor },
+            disabledContainerColor.takeOrElse { this.disabledContainerColor },
+            disabledContentColor.takeOrElse { this.disabledContentColor },
+            checkedContainerColor.takeOrElse { this.checkedContainerColor },
+            checkedContentColor.takeOrElse { this.checkedContentColor }
+        )
 
     /**
      * Represents the container color for this icon button, depending on [enabled] and [checked].
@@ -1195,11 +1238,12 @@
      */
     @Composable
     internal fun containerColor(enabled: Boolean, checked: Boolean): State<Color> {
-        val target = when {
-            !enabled -> disabledContainerColor
-            !checked -> containerColor
-            else -> checkedContainerColor
-        }
+        val target =
+            when {
+                !enabled -> disabledContainerColor
+                !checked -> containerColor
+                else -> checkedContainerColor
+            }
         return rememberUpdatedState(target)
     }
 
@@ -1211,11 +1255,12 @@
      */
     @Composable
     internal fun contentColor(enabled: Boolean, checked: Boolean): State<Color> {
-        val target = when {
-            !enabled -> disabledContentColor
-            !checked -> contentColor
-            else -> checkedContentColor
-        }
+        val target =
+            when {
+                !enabled -> disabledContentColor
+                !checked -> contentColor
+                else -> checkedContentColor
+            }
         return rememberUpdatedState(target)
     }
 
diff --git a/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/InteractiveComponentSize.kt b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/InteractiveComponentSize.kt
index 5a2180c..6917960 100644
--- a/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/InteractiveComponentSize.kt
+++ b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/InteractiveComponentSize.kt
@@ -43,7 +43,8 @@
  *
  * This uses the Material recommended minimum size of 48.dp x 48.dp, which may not the same as the
  * system enforced minimum size. The minimum clickable / touch target size (48.dp by default) is
- * controlled by the system via ViewConfiguration` and automatically expanded at the touch input layer.
+ * controlled by the system via ViewConfiguration` and automatically expanded at the touch input
+ * layer.
  *
  * This modifier is not needed for touch target expansion to happen. It only affects layout, to make
  * sure there is adequate space for touch target expansion.
@@ -51,8 +52,7 @@
 @Stable
 fun Modifier.minimumInteractiveComponentSize(): Modifier = this then MinimumInteractiveModifier
 
-internal object MinimumInteractiveModifier :
-    ModifierNodeElement<MinimumInteractiveModifierNode>() {
+internal object MinimumInteractiveModifier : ModifierNodeElement<MinimumInteractiveModifierNode>() {
 
     override fun create(): MinimumInteractiveModifierNode = MinimumInteractiveModifierNode()
 
@@ -62,18 +62,18 @@
         name = "minimumInteractiveComponentSize"
         // TODO: b/214589635 - surface this information through the layout inspector in a better way
         //  - for now just add some information to help developers debug what this size represents.
-        properties["README"] = "Reserves at least 48.dp in size to disambiguate touch " +
-            "interactions if the element would measure smaller"
+        properties["README"] =
+            "Reserves at least 48.dp in size to disambiguate touch " +
+                "interactions if the element would measure smaller"
     }
 
     override fun hashCode(): Int = System.identityHashCode(this)
+
     override fun equals(other: Any?) = (other === this)
 }
 
 internal class MinimumInteractiveModifierNode :
-    Modifier.Node(),
-    CompositionLocalConsumerModifierNode,
-    LayoutModifierNode {
+    Modifier.Node(), CompositionLocalConsumerModifierNode, LayoutModifierNode {
     override fun MeasureScope.measure(
         measurable: Measurable,
         constraints: Constraints
@@ -84,16 +84,18 @@
 
         val sizePx = if (size.isSpecified) size.roundToPx() else 0
         // Be at least as big as the minimum dimension in both dimensions
-        val width = if (enforcement) {
-            maxOf(placeable.width, sizePx)
-        } else {
-            placeable.width
-        }
-        val height = if (enforcement) {
-            maxOf(placeable.height, sizePx)
-        } else {
-            placeable.height
-        }
+        val width =
+            if (enforcement) {
+                maxOf(placeable.width, sizePx)
+            } else {
+                placeable.width
+            }
+        val height =
+            if (enforcement) {
+                maxOf(placeable.height, sizePx)
+            } else {
+                placeable.height
+            }
 
         return layout(width, height) {
             val centerX = ((width - placeable.width) / 2f).roundToInt()
@@ -105,33 +107,36 @@
 
 /**
  * CompositionLocal that configures whether Material components that have a visual size that is
- * lower than the minimum touch target size for accessibility (such as Button) will include
- * extra space outside the component to ensure that they are accessible. If set to false there
- * will be no extra space, and so it is possible that if the component is placed near the edge of
- * a layout / near to another component without any padding, there will not be enough space for
- * an accessible touch target.
+ * lower than the minimum touch target size for accessibility (such as Button) will include extra
+ * space outside the component to ensure that they are accessible. If set to false there will be no
+ * extra space, and so it is possible that if the component is placed near the edge of a layout /
+ * near to another component without any padding, there will not be enough space for an accessible
+ * touch target.
  */
 @Suppress("OPT_IN_MARKER_ON_WRONG_TARGET")
 @get:ExperimentalMaterial3Api
 @ExperimentalMaterial3Api
 @Deprecated(
-    message = "Use LocalMinimumInteractiveComponentSize with Dp.Unspecified to turn off " +
-        "enforcement instead.",
-    replaceWith = ReplaceWith(
-        "LocalMinimumInteractiveComponentSize"
-    ),
+    message =
+        "Use LocalMinimumInteractiveComponentSize with Dp.Unspecified to turn off " +
+            "enforcement instead.",
+    replaceWith = ReplaceWith("LocalMinimumInteractiveComponentSize"),
     level = DeprecationLevel.WARNING
 )
 val LocalMinimumInteractiveComponentEnforcement: ProvidableCompositionLocal<Boolean> =
-    staticCompositionLocalOf { true }
+    staticCompositionLocalOf {
+        true
+    }
 
 /**
- * CompositionLocal that configures the minimum touch target size for Material components
- * (such as [Button]) to ensure they are accessible. If a component has a visual size
- * that is lower than the minimum touch target size, extra space outside the component will be
- * included. If set to [Dp.Unspecified] there will be no extra space, and so it is possible that if the
- * component is placed near the edge of a layout / near to another component without any padding,
- * there will not be enough space for an accessible touch target.
+ * CompositionLocal that configures the minimum touch target size for Material components (such as
+ * [Button]) to ensure they are accessible. If a component has a visual size that is lower than the
+ * minimum touch target size, extra space outside the component will be included. If set to
+ * [Dp.Unspecified] there will be no extra space, and so it is possible that if the component is
+ * placed near the edge of a layout / near to another component without any padding, there will not
+ * be enough space for an accessible touch target.
  */
 val LocalMinimumInteractiveComponentSize: ProvidableCompositionLocal<Dp> =
-    staticCompositionLocalOf { 48.dp }
+    staticCompositionLocalOf {
+        48.dp
+    }
diff --git a/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/Label.kt b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/Label.kt
index 2b82b6d..1487bc2 100644
--- a/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/Label.kt
+++ b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/Label.kt
@@ -40,8 +40,8 @@
 import kotlinx.coroutines.flow.collectLatest
 
 /**
- * Label component that will append a [label] to [content].
- * The positioning logic uses [TooltipDefaults.rememberPlainTooltipPositionProvider].
+ * Label component that will append a [label] to [content]. The positioning logic uses
+ * [TooltipDefaults.rememberPlainTooltipPositionProvider].
  *
  * Label appended to thumbs of Slider:
  *
@@ -53,11 +53,11 @@
  *
  * @param label composable that will be appended to [content]
  * @param modifier [Modifier] that will be applied to [content]
- * @param interactionSource the [MutableInteractionSource] representing the
- * stream of [Interaction]s for the [content].
- * @param isPersistent boolean to determine if the label should be persistent.
- * If true, then the label will always show and be anchored to [content].
- * if false, then the label will only show when pressing down or hovering over the [content].
+ * @param interactionSource the [MutableInteractionSource] representing the stream of [Interaction]s
+ *   for the [content].
+ * @param isPersistent boolean to determine if the label should be persistent. If true, then the
+ *   label will always show and be anchored to [content]. if false, then the label will only show
+ *   when pressing down or hovering over the [content].
  * @param content the composable that [label] will anchor to.
  */
 @ExperimentalMaterial3Api
@@ -73,20 +73,15 @@
     val interactionSource = interactionSource ?: remember { MutableInteractionSource() }
     // Has the same positioning logic as PlainTooltips
     val positionProvider = TooltipDefaults.rememberPlainTooltipPositionProvider()
-    val state = if (isPersistent)
-        remember { LabelStateImpl() }
-    else
-        rememberBasicTooltipState(mutatorMutex = MutatorMutex())
+    val state =
+        if (isPersistent) remember { LabelStateImpl() }
+        else rememberBasicTooltipState(mutatorMutex = MutatorMutex())
 
     var anchorBounds: MutableState<LayoutCoordinates?> = remember { mutableStateOf(null) }
     val scope = remember { TooltipScopeImpl { anchorBounds.value } }
 
     val wrappedContent: @Composable () -> Unit = {
-        Box(
-            modifier = Modifier.onGloballyPositioned { anchorBounds.value = it }
-        ) {
-            content()
-        }
+        Box(modifier = Modifier.onGloballyPositioned { anchorBounds.value = it }) { content() }
     }
 
     BasicTooltipBox(
@@ -118,10 +113,14 @@
                 when (interaction) {
                     is PressInteraction.Press,
                     is DragInteraction.Start,
-                    is HoverInteraction.Enter -> { state.show(MutatePriority.UserInput) }
+                    is HoverInteraction.Enter -> {
+                        state.show(MutatePriority.UserInput)
+                    }
                     is PressInteraction.Release,
                     is DragInteraction.Stop,
-                    is HoverInteraction.Exit -> { state.dismiss() }
+                    is HoverInteraction.Exit -> {
+                        state.dismiss()
+                    }
                 }
             }
         }
@@ -133,8 +132,8 @@
     override val isVisible: Boolean = true,
     override val isPersistent: Boolean = true,
 ) : TooltipState {
-    override val transition: MutableTransitionState<Boolean> =
-        MutableTransitionState(false)
+    override val transition: MutableTransitionState<Boolean> = MutableTransitionState(false)
+
     override suspend fun show(mutatePriority: MutatePriority) {}
 
     override fun dismiss() {}
diff --git a/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/ListItem.kt b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/ListItem.kt
index 5c95c75..03e5327 100644
--- a/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/ListItem.kt
+++ b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/ListItem.kt
@@ -54,23 +54,29 @@
 import kotlin.math.max
 
 /**
- * <a href="https://m3.material.io/components/lists/overview" class="external" target="_blank">Material Design list item.</a>
+ * <a href="https://m3.material.io/components/lists/overview" class="external"
+ * target="_blank">Material Design list item.</a>
  *
  * Lists are continuous, vertical indexes of text or images.
  *
- * ![Lists image](https://developer.android.com/images/reference/androidx/compose/material3/lists.png)
+ * ![Lists
+ * image](https://developer.android.com/images/reference/androidx/compose/material3/lists.png)
  *
  * This component can be used to achieve the list item templates existing in the spec. One-line list
  * items have a singular line of headline content. Two-line list items additionally have either
  * supporting or overline content. Three-line list items have either both supporting and overline
  * content, or extended (two-line) supporting text. For example:
  * - one-line item
+ *
  * @sample androidx.compose.material3.samples.OneLineListItem
  * - two-line item
+ *
  * @sample androidx.compose.material3.samples.TwoLineListItem
  * - three-line item with both overline and supporting content
+ *
  * @sample androidx.compose.material3.samples.ThreeLineListItemWithOverlineAndSupporting
  * - three-line item with extended supporting content
+ *
  * @sample androidx.compose.material3.samples.ThreeLineListItemWithExtendedSupporting
  *
  * @param headlineContent the headline content of the list item
@@ -80,7 +86,7 @@
  * @param leadingContent the leading content of the list item
  * @param trailingContent the trailing meta text, icon, switch or checkbox
  * @param colors [ListItemColors] that will be used to resolve the background and content color for
- * this list item in different states. See [ListItemDefaults.colors]
+ *   this list item in different states. See [ListItemDefaults.colors]
  * @param tonalElevation the tonal elevation of this list item
  * @param shadowElevation the shadow elevation of this list item
  */
@@ -103,50 +109,52 @@
             headlineContent
         )
     }
-    val decoratedSupportingContent: @Composable (() -> Unit)? = supportingContent?.let {
-        {
-            ProvideTextStyleFromToken(
-                colors.supportingColor(),
-                ListTokens.ListItemSupportingTextFont,
-                it
-            )
-        }
-    }
-    val decoratedOverlineContent: @Composable (() -> Unit)? = overlineContent?.let {
-        {
-            ProvideTextStyleFromToken(
-                colors.overlineColor(),
-                ListTokens.ListItemOverlineFont,
-                it
-            )
-        }
-    }
-    val decoratedLeadingContent: @Composable (() -> Unit)? = leadingContent?.let {
-        {
-            Box(Modifier.padding(end = LeadingContentEndPadding)) {
-                CompositionLocalProvider(
-                    LocalContentColor provides colors.leadingIconColor(enabled = true),
-                    content = it
-                )
-            }
-        }
-    }
-    val decoratedTrailingContent: @Composable (() -> Unit)? = trailingContent?.let {
-        {
-            Box(Modifier.padding(start = TrailingContentStartPadding)) {
+    val decoratedSupportingContent: @Composable (() -> Unit)? =
+        supportingContent?.let {
+            {
                 ProvideTextStyleFromToken(
-                    colors.trailingIconColor(enabled = true),
-                    ListTokens.ListItemTrailingSupportingTextFont,
-                    content = it
+                    colors.supportingColor(),
+                    ListTokens.ListItemSupportingTextFont,
+                    it
                 )
             }
         }
-    }
+    val decoratedOverlineContent: @Composable (() -> Unit)? =
+        overlineContent?.let {
+            {
+                ProvideTextStyleFromToken(
+                    colors.overlineColor(),
+                    ListTokens.ListItemOverlineFont,
+                    it
+                )
+            }
+        }
+    val decoratedLeadingContent: @Composable (() -> Unit)? =
+        leadingContent?.let {
+            {
+                Box(Modifier.padding(end = LeadingContentEndPadding)) {
+                    CompositionLocalProvider(
+                        LocalContentColor provides colors.leadingIconColor(enabled = true),
+                        content = it
+                    )
+                }
+            }
+        }
+    val decoratedTrailingContent: @Composable (() -> Unit)? =
+        trailingContent?.let {
+            {
+                Box(Modifier.padding(start = TrailingContentStartPadding)) {
+                    ProvideTextStyleFromToken(
+                        colors.trailingIconColor(enabled = true),
+                        ListTokens.ListItemTrailingSupportingTextFont,
+                        content = it
+                    )
+                }
+            }
+        }
 
     Surface(
-        modifier = Modifier
-            .semantics(mergeDescendants = true) {}
-            .then(modifier),
+        modifier = Modifier.semantics(mergeDescendants = true) {}.then(modifier),
         shape = ListItemDefaults.shape,
         color = colors.containerColor(),
         contentColor = colors.headlineColor(enabled = true),
@@ -173,13 +181,14 @@
 ) {
     val measurePolicy = remember { ListItemMeasurePolicy() }
     Layout(
-        contents = listOf(
-            headline,
-            overline ?: {},
-            supporting ?: {},
-            leading ?: {},
-            trailing ?: {},
-        ),
+        contents =
+            listOf(
+                headline,
+                overline ?: {},
+                supporting ?: {},
+                leading ?: {},
+                trailing ?: {},
+            ),
         measurePolicy = measurePolicy,
     )
 }
@@ -189,8 +198,13 @@
         measurables: List<List<Measurable>>,
         constraints: Constraints
     ): MeasureResult {
-        val (headlineMeasurable, overlineMeasurable, supportingMeasurable, leadingMeasurable,
-            trailingMeasurable) = measurables
+        val (
+            headlineMeasurable,
+            overlineMeasurable,
+            supportingMeasurable,
+            leadingMeasurable,
+            trailingMeasurable) =
+            measurables
         var currentTotalWidth = 0
 
         val looseConstraints = constraints.copy(minWidth = 0, minHeight = 0)
@@ -206,23 +220,26 @@
         // 4. Actual leading/trailing measurement
         // 5. Actual supporting measurement
         // 6. Actual vertical padding
-        val intrinsicLeadingWidth = leadingMeasurable.firstOrNull()
-            ?.minIntrinsicWidth(constraints.maxHeight) ?: 0
-        val intrinsicTrailingWidth = trailingMeasurable.firstOrNull()
-            ?.minIntrinsicWidth(constraints.maxHeight) ?: 0
-        val intrinsicSupportingWidthConstraint = looseConstraints.maxWidth
-            .subtractConstraintSafely(
+        val intrinsicLeadingWidth =
+            leadingMeasurable.firstOrNull()?.minIntrinsicWidth(constraints.maxHeight) ?: 0
+        val intrinsicTrailingWidth =
+            trailingMeasurable.firstOrNull()?.minIntrinsicWidth(constraints.maxHeight) ?: 0
+        val intrinsicSupportingWidthConstraint =
+            looseConstraints.maxWidth.subtractConstraintSafely(
                 intrinsicLeadingWidth + intrinsicTrailingWidth + horizontalPadding
             )
-        val intrinsicSupportingHeight = supportingMeasurable.firstOrNull()
-            ?.minIntrinsicHeight(intrinsicSupportingWidthConstraint) ?: 0
+        val intrinsicSupportingHeight =
+            supportingMeasurable
+                .firstOrNull()
+                ?.minIntrinsicHeight(intrinsicSupportingWidthConstraint) ?: 0
         val intrinsicIsSupportingMultiline =
             isSupportingMultilineHeuristic(intrinsicSupportingHeight)
-        val intrinsicListItemType = ListItemType(
-            hasOverline = overlineMeasurable.firstOrNull() != null,
-            hasSupporting = supportingMeasurable.firstOrNull() != null,
-            isSupportingMultiline = intrinsicIsSupportingMultiline,
-        )
+        val intrinsicListItemType =
+            ListItemType(
+                hasOverline = overlineMeasurable.firstOrNull() != null,
+                hasSupporting = supportingMeasurable.firstOrNull() != null,
+                isSupportingMultiline = intrinsicIsSupportingMultiline,
+            )
         val intrinsicVerticalPadding = (verticalPadding(intrinsicListItemType) * 2).roundToPx()
 
         val paddedLooseConstraints =
@@ -234,66 +251,74 @@
         val leadingPlaceable = leadingMeasurable.firstOrNull()?.measure(paddedLooseConstraints)
         currentTotalWidth += widthOrZero(leadingPlaceable)
 
-        val trailingPlaceable = trailingMeasurable.firstOrNull()?.measure(
-            paddedLooseConstraints.offset(
-                horizontal = -currentTotalWidth
-            )
-        )
+        val trailingPlaceable =
+            trailingMeasurable
+                .firstOrNull()
+                ?.measure(paddedLooseConstraints.offset(horizontal = -currentTotalWidth))
         currentTotalWidth += widthOrZero(trailingPlaceable)
 
         var currentTotalHeight = 0
 
-        val headlinePlaceable = headlineMeasurable.firstOrNull()?.measure(
-            paddedLooseConstraints.offset(
-                horizontal = -currentTotalWidth
-            )
-        )
+        val headlinePlaceable =
+            headlineMeasurable
+                .firstOrNull()
+                ?.measure(paddedLooseConstraints.offset(horizontal = -currentTotalWidth))
         currentTotalHeight += heightOrZero(headlinePlaceable)
 
-        val supportingPlaceable = supportingMeasurable.firstOrNull()?.measure(
-            paddedLooseConstraints.offset(
-                horizontal = -currentTotalWidth,
-                vertical = -currentTotalHeight
-            )
-        )
+        val supportingPlaceable =
+            supportingMeasurable
+                .firstOrNull()
+                ?.measure(
+                    paddedLooseConstraints.offset(
+                        horizontal = -currentTotalWidth,
+                        vertical = -currentTotalHeight
+                    )
+                )
         currentTotalHeight += heightOrZero(supportingPlaceable)
-        val isSupportingMultiline = supportingPlaceable != null &&
-            (supportingPlaceable[FirstBaseline] != supportingPlaceable[LastBaseline])
+        val isSupportingMultiline =
+            supportingPlaceable != null &&
+                (supportingPlaceable[FirstBaseline] != supportingPlaceable[LastBaseline])
 
-        val overlinePlaceable = overlineMeasurable.firstOrNull()?.measure(
-            paddedLooseConstraints.offset(
-                horizontal = -currentTotalWidth,
-                vertical = -currentTotalHeight
+        val overlinePlaceable =
+            overlineMeasurable
+                .firstOrNull()
+                ?.measure(
+                    paddedLooseConstraints.offset(
+                        horizontal = -currentTotalWidth,
+                        vertical = -currentTotalHeight
+                    )
+                )
+
+        val listItemType =
+            ListItemType(
+                hasOverline = overlinePlaceable != null,
+                hasSupporting = supportingPlaceable != null,
+                isSupportingMultiline = isSupportingMultiline,
             )
-        )
-
-        val listItemType = ListItemType(
-            hasOverline = overlinePlaceable != null,
-            hasSupporting = supportingPlaceable != null,
-            isSupportingMultiline = isSupportingMultiline,
-        )
         val topPadding = verticalPadding(listItemType)
         val verticalPadding = topPadding * 2
 
-        val width = calculateWidth(
-            leadingWidth = widthOrZero(leadingPlaceable),
-            trailingWidth = widthOrZero(trailingPlaceable),
-            headlineWidth = widthOrZero(headlinePlaceable),
-            overlineWidth = widthOrZero(overlinePlaceable),
-            supportingWidth = widthOrZero(supportingPlaceable),
-            horizontalPadding = horizontalPadding,
-            constraints = constraints,
-        )
-        val height = calculateHeight(
-            leadingHeight = heightOrZero(leadingPlaceable),
-            trailingHeight = heightOrZero(trailingPlaceable),
-            headlineHeight = heightOrZero(headlinePlaceable),
-            overlineHeight = heightOrZero(overlinePlaceable),
-            supportingHeight = heightOrZero(supportingPlaceable),
-            listItemType = listItemType,
-            verticalPadding = verticalPadding.roundToPx(),
-            constraints = constraints,
-        )
+        val width =
+            calculateWidth(
+                leadingWidth = widthOrZero(leadingPlaceable),
+                trailingWidth = widthOrZero(trailingPlaceable),
+                headlineWidth = widthOrZero(headlinePlaceable),
+                overlineWidth = widthOrZero(overlinePlaceable),
+                supportingWidth = widthOrZero(supportingPlaceable),
+                horizontalPadding = horizontalPadding,
+                constraints = constraints,
+            )
+        val height =
+            calculateHeight(
+                leadingHeight = heightOrZero(leadingPlaceable),
+                trailingHeight = heightOrZero(trailingPlaceable),
+                headlineHeight = heightOrZero(headlinePlaceable),
+                overlineHeight = heightOrZero(overlinePlaceable),
+                supportingHeight = heightOrZero(supportingPlaceable),
+                listItemType = listItemType,
+                verticalPadding = verticalPadding.roundToPx(),
+                constraints = constraints,
+            )
 
         return place(
             width = width,
@@ -335,8 +360,13 @@
         height: Int,
         intrinsicMeasure: IntrinsicMeasurable.(height: Int) -> Int,
     ): Int {
-        val (headlineMeasurable, overlineMeasurable, supportingMeasurable, leadingMeasurable,
-            trailingMeasurable) = measurables
+        val (
+            headlineMeasurable,
+            overlineMeasurable,
+            supportingMeasurable,
+            leadingMeasurable,
+            trailingMeasurable) =
+            measurables
         return calculateWidth(
             leadingWidth = leadingMeasurable.firstOrNull()?.intrinsicMeasure(height) ?: 0,
             trailingWidth = trailingMeasurable.firstOrNull()?.intrinsicMeasure(height) ?: 0,
@@ -353,36 +383,44 @@
         width: Int,
         intrinsicMeasure: IntrinsicMeasurable.(width: Int) -> Int,
     ): Int {
-        val (headlineMeasurable, overlineMeasurable, supportingMeasurable, leadingMeasurable,
-            trailingMeasurable) = measurables
+        val (
+            headlineMeasurable,
+            overlineMeasurable,
+            supportingMeasurable,
+            leadingMeasurable,
+            trailingMeasurable) =
+            measurables
 
-        var remainingWidth = width.subtractConstraintSafely(
-            (ListItemStartPadding + ListItemEndPadding).roundToPx()
-        )
-        val leadingHeight = leadingMeasurable.firstOrNull()?.let {
-            val height = it.intrinsicMeasure(remainingWidth)
-            remainingWidth = remainingWidth.subtractConstraintSafely(
-                it.maxIntrinsicWidth(Constraints.Infinity)
-            )
-            height
-        } ?: 0
-        val trailingHeight = trailingMeasurable.firstOrNull()?.let {
-            val height = it.intrinsicMeasure(remainingWidth)
-            remainingWidth = remainingWidth.subtractConstraintSafely(
-                it.maxIntrinsicWidth(Constraints.Infinity)
-            )
-            height
-        } ?: 0
-        val overlineHeight = overlineMeasurable.firstOrNull()
-            ?.intrinsicMeasure(remainingWidth) ?: 0
-        val supportingHeight = supportingMeasurable.firstOrNull()
-            ?.intrinsicMeasure(remainingWidth) ?: 0
+        var remainingWidth =
+            width.subtractConstraintSafely((ListItemStartPadding + ListItemEndPadding).roundToPx())
+        val leadingHeight =
+            leadingMeasurable.firstOrNull()?.let {
+                val height = it.intrinsicMeasure(remainingWidth)
+                remainingWidth =
+                    remainingWidth.subtractConstraintSafely(
+                        it.maxIntrinsicWidth(Constraints.Infinity)
+                    )
+                height
+            } ?: 0
+        val trailingHeight =
+            trailingMeasurable.firstOrNull()?.let {
+                val height = it.intrinsicMeasure(remainingWidth)
+                remainingWidth =
+                    remainingWidth.subtractConstraintSafely(
+                        it.maxIntrinsicWidth(Constraints.Infinity)
+                    )
+                height
+            } ?: 0
+        val overlineHeight = overlineMeasurable.firstOrNull()?.intrinsicMeasure(remainingWidth) ?: 0
+        val supportingHeight =
+            supportingMeasurable.firstOrNull()?.intrinsicMeasure(remainingWidth) ?: 0
         val isSupportingMultiline = isSupportingMultilineHeuristic(supportingHeight)
-        val listItemType = ListItemType(
-            hasOverline = overlineHeight > 0,
-            hasSupporting = supportingHeight > 0,
-            isSupportingMultiline = isSupportingMultiline,
-        )
+        val listItemType =
+            ListItemType(
+                hasOverline = overlineHeight > 0,
+                hasSupporting = supportingHeight > 0,
+                isSupportingMultiline = isSupportingMultiline,
+            )
 
         return calculateHeight(
             leadingHeight = leadingHeight,
@@ -424,19 +462,18 @@
     verticalPadding: Int,
     constraints: Constraints,
 ): Int {
-    val defaultMinHeight = when (listItemType) {
-        ListItemType.OneLine -> ListTokens.ListItemOneLineContainerHeight
-        ListItemType.TwoLine -> ListTokens.ListItemTwoLineContainerHeight
-        else /* ListItemType.ThreeLine */ -> ListTokens.ListItemThreeLineContainerHeight
-    }
+    val defaultMinHeight =
+        when (listItemType) {
+            ListItemType.OneLine -> ListTokens.ListItemOneLineContainerHeight
+            ListItemType.TwoLine -> ListTokens.ListItemTwoLineContainerHeight
+            else /* ListItemType.ThreeLine */ -> ListTokens.ListItemThreeLineContainerHeight
+        }
     val minHeight = max(constraints.minHeight, defaultMinHeight.roundToPx())
 
     val mainContentHeight = headlineHeight + overlineHeight + supportingHeight
 
-    return max(
-        minHeight,
-        verticalPadding + maxOf(leadingHeight, mainContentHeight, trailingHeight)
-    ).coerceAtMost(constraints.maxHeight)
+    return max(minHeight, verticalPadding + maxOf(leadingHeight, mainContentHeight, trailingHeight))
+        .coerceAtMost(constraints.maxHeight)
 }
 
 private fun MeasureScope.place(
@@ -467,13 +504,16 @@
         }
 
         val mainContentX = startPadding + widthOrZero(leadingPlaceable)
-        val mainContentY = if (isThreeLine) {
-            topPadding
-        } else {
-            val totalHeight = heightOrZero(headlinePlaceable) + heightOrZero(overlinePlaceable) +
-                heightOrZero(supportingPlaceable)
-            CenterVertically.align(totalHeight, height)
-        }
+        val mainContentY =
+            if (isThreeLine) {
+                topPadding
+            } else {
+                val totalHeight =
+                    heightOrZero(headlinePlaceable) +
+                        heightOrZero(overlinePlaceable) +
+                        heightOrZero(supportingPlaceable)
+                CenterVertically.align(totalHeight, height)
+            }
         var currentY = mainContentY
 
         overlinePlaceable?.placeRelative(mainContentX, currentY)
@@ -486,44 +526,38 @@
     }
 }
 
-/**
- * Contains the default values used by list items.
- */
+/** Contains the default values used by list items. */
 object ListItemDefaults {
     /** The default elevation of a list item */
     val Elevation: Dp = ListTokens.ListItemContainerElevation
 
     /** The default shape of a list item */
     val shape: Shape
-        @Composable
-        @ReadOnlyComposable get() = ListTokens.ListItemContainerShape.value
+        @Composable @ReadOnlyComposable get() = ListTokens.ListItemContainerShape.value
 
     /** The container color of a list item */
     val containerColor: Color
-        @Composable
-        @ReadOnlyComposable get() = ListTokens.ListItemContainerColor.value
+        @Composable @ReadOnlyComposable get() = ListTokens.ListItemContainerColor.value
 
     /** The content color of a list item */
     val contentColor: Color
-        @Composable
-        @ReadOnlyComposable get() = ListTokens.ListItemLabelTextColor.value
+        @Composable @ReadOnlyComposable get() = ListTokens.ListItemLabelTextColor.value
 
     /**
      * Creates a [ListItemColors] that represents the default container and content colors used in a
      * [ListItem].
      *
      * @param containerColor the container color of this list item when enabled.
-     * @param headlineColor the headline text content color of this list item when
-     * enabled.
+     * @param headlineColor the headline text content color of this list item when enabled.
      * @param leadingIconColor the color of this list item's leading content when enabled.
      * @param overlineColor the overline text color of this list item
      * @param supportingColor the supporting text color of this list item
      * @param trailingIconColor the color of this list item's trailing content when enabled.
      * @param disabledHeadlineColor the content color of this list item when not enabled.
      * @param disabledLeadingIconColor the color of this list item's leading content when not
-     * enabled.
+     *   enabled.
      * @param disabledTrailingIconColor the color of this list item's trailing content when not
-     * enabled.
+     *   enabled.
      */
     @Composable
     fun colors(
@@ -533,12 +567,18 @@
         overlineColor: Color = ListTokens.ListItemOverlineColor.value,
         supportingColor: Color = ListTokens.ListItemSupportingTextColor.value,
         trailingIconColor: Color = ListTokens.ListItemTrailingIconColor.value,
-        disabledHeadlineColor: Color = ListTokens.ListItemDisabledLabelTextColor.value
-            .copy(alpha = ListTokens.ListItemDisabledLabelTextOpacity),
-        disabledLeadingIconColor: Color = ListTokens.ListItemDisabledLeadingIconColor.value
-            .copy(alpha = ListTokens.ListItemDisabledLeadingIconOpacity),
-        disabledTrailingIconColor: Color = ListTokens.ListItemDisabledTrailingIconColor.value
-            .copy(alpha = ListTokens.ListItemDisabledTrailingIconOpacity)
+        disabledHeadlineColor: Color =
+            ListTokens.ListItemDisabledLabelTextColor.value.copy(
+                alpha = ListTokens.ListItemDisabledLabelTextOpacity
+            ),
+        disabledLeadingIconColor: Color =
+            ListTokens.ListItemDisabledLeadingIconColor.value.copy(
+                alpha = ListTokens.ListItemDisabledLeadingIconOpacity
+            ),
+        disabledTrailingIconColor: Color =
+            ListTokens.ListItemDisabledTrailingIconColor.value.copy(
+                alpha = ListTokens.ListItemDisabledTrailingIconOpacity
+            )
     ): ListItemColors =
         ListItemColors(
             containerColor = containerColor,
@@ -556,24 +596,21 @@
 /**
  * Represents the container and content colors used in a list item in different states.
  *
- * @constructor create an instance with arbitrary colors.
- * See [ListItemDefaults.colors] for the default colors used in a [ListItem].
- *
  * @param containerColor the container color of this list item when enabled.
- * @param headlineColor the headline text content color of this list item when
- * enabled.
+ * @param headlineColor the headline text content color of this list item when enabled.
  * @param leadingIconColor the color of this list item's leading content when enabled.
  * @param overlineColor the overline text color of this list item
  * @param supportingTextColor the supporting text color of this list item
  * @param trailingIconColor the color of this list item's trailing content when enabled.
  * @param disabledHeadlineColor the content color of this list item when not enabled.
- * @param disabledLeadingIconColor the color of this list item's leading content when not
- * enabled.
- * @param disabledTrailingIconColor the color of this list item's trailing content when not
- * enabled.
+ * @param disabledLeadingIconColor the color of this list item's leading content when not enabled.
+ * @param disabledTrailingIconColor the color of this list item's trailing content when not enabled.
+ * @constructor create an instance with arbitrary colors. See [ListItemDefaults.colors] for the
+ *   default colors used in a [ListItem].
  */
 @Immutable
-class ListItemColors constructor(
+class ListItemColors
+constructor(
     val containerColor: Color,
     val headlineColor: Color,
     val leadingIconColor: Color,
@@ -601,12 +638,10 @@
         if (enabled) leadingIconColor else disabledLeadingIconColor
 
     /** The color of this [ListItem]'s overline text based on enabled state */
-    @Stable
-    internal fun overlineColor(): Color = overlineColor
+    @Stable internal fun overlineColor(): Color = overlineColor
 
     /** The color of this [ListItem]'s supporting text based on enabled state */
-    @Stable
-    internal fun supportingColor(): Color = supportingTextColor
+    @Stable internal fun supportingColor(): Color = supportingTextColor
 
     /** The color of this [ListItem]'s trailing content based on enabled state */
     @Stable
@@ -619,15 +654,14 @@
     color: Color,
     textToken: TypographyKeyTokens,
     content: @Composable () -> Unit,
-) = ProvideContentColorTextStyle(
-    contentColor = color,
-    textStyle = textToken.value,
-    content = content
-)
+) =
+    ProvideContentColorTextStyle(
+        contentColor = color,
+        textStyle = textToken.value,
+        content = content
+    )
 
-/**
- * Helper class to define list item type. Used for padding and sizing definition.
- */
+/** Helper class to define list item type. Used for padding and sizing definition. */
 @JvmInline
 private value class ListItemType private constructor(private val lines: Int) :
     Comparable<ListItemType> {
@@ -660,38 +694,32 @@
 
 // Container related defaults
 // TODO: Make sure these values stay up to date until replaced with tokens.
-@VisibleForTesting
-internal val ListItemVerticalPadding = 8.dp
+@VisibleForTesting internal val ListItemVerticalPadding = 8.dp
 
-@VisibleForTesting
-internal val ListItemThreeLineVerticalPadding = 12.dp
+@VisibleForTesting internal val ListItemThreeLineVerticalPadding = 12.dp
 
-@VisibleForTesting
-internal val ListItemStartPadding = 16.dp
+@VisibleForTesting internal val ListItemStartPadding = 16.dp
 
-@VisibleForTesting
-internal val ListItemEndPadding = 16.dp
+@VisibleForTesting internal val ListItemEndPadding = 16.dp
 
 // Icon related defaults.
 // TODO: Make sure these values stay up to date until replaced with tokens.
-@VisibleForTesting
-internal val LeadingContentEndPadding = 16.dp
+@VisibleForTesting internal val LeadingContentEndPadding = 16.dp
 
 // Trailing related defaults.
 // TODO: Make sure these values stay up to date until replaced with tokens.
-@VisibleForTesting
-internal val TrailingContentStartPadding = 16.dp
+@VisibleForTesting internal val TrailingContentStartPadding = 16.dp
 
 // In the actual layout phase, we can query supporting baselines,
 // but for an intrinsic measurement pass, we have to estimate.
-private fun Density.isSupportingMultilineHeuristic(
-    estimatedSupportingHeight: Int
-): Boolean = estimatedSupportingHeight > 30.sp.roundToPx()
+private fun Density.isSupportingMultilineHeuristic(estimatedSupportingHeight: Int): Boolean =
+    estimatedSupportingHeight > 30.sp.roundToPx()
 
-private fun verticalPadding(listItemType: ListItemType): Dp = when (listItemType) {
-    ListItemType.ThreeLine -> ListItemThreeLineVerticalPadding
-    else -> ListItemVerticalPadding
-}
+private fun verticalPadding(listItemType: ListItemType): Dp =
+    when (listItemType) {
+        ListItemType.ThreeLine -> ListItemThreeLineVerticalPadding
+        else -> ListItemVerticalPadding
+    }
 
 private fun Int.subtractConstraintSafely(n: Int): Int {
     if (this == Constraints.Infinity) {
diff --git a/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/MaterialTheme.kt b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/MaterialTheme.kt
index d980ee5..43c1bfa 100644
--- a/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/MaterialTheme.kt
+++ b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/MaterialTheme.kt
@@ -33,13 +33,13 @@
  * default values.
  *
  * All values may be set by providing this component with the [colorScheme][ColorScheme],
- * [typography][Typography] and [shapes][Shapes] attributes. Use this to configure the overall
- * theme of elements within this MaterialTheme.
+ * [typography][Typography] and [shapes][Shapes] attributes. Use this to configure the overall theme
+ * of elements within this MaterialTheme.
  *
  * Any values that are not set will inherit the current value from the theme, falling back to the
- * defaults if there is no parent MaterialTheme. This allows using a MaterialTheme at the top
- * of your application, and then separate MaterialTheme(s) for different screens / parts of your
- * UI, overriding only the parts of the theme definition that need to change.
+ * defaults if there is no parent MaterialTheme. This allows using a MaterialTheme at the top of
+ * your application, and then separate MaterialTheme(s) for different screens / parts of your UI,
+ * overriding only the parts of the theme definition that need to change.
  *
  * @sample androidx.compose.material3.samples.MaterialThemeSample
  *
@@ -71,8 +71,8 @@
 }
 
 /**
- * Contains functions to access the current theme values provided at the call site's position in
- * the hierarchy.
+ * Contains functions to access the current theme values provided at the call site's position in the
+ * hierarchy.
  */
 object MaterialTheme {
     /**
@@ -81,9 +81,7 @@
      * @sample androidx.compose.material3.samples.ThemeColorSample
      */
     val colorScheme: ColorScheme
-        @Composable
-        @ReadOnlyComposable
-        get() = LocalColorScheme.current
+        @Composable @ReadOnlyComposable get() = LocalColorScheme.current
 
     /**
      * Retrieves the current [Typography] at the call site's position in the hierarchy.
@@ -91,9 +89,7 @@
      * @sample androidx.compose.material3.samples.ThemeTextStyleSample
      */
     val typography: Typography
-        @Composable
-        @ReadOnlyComposable
-        get() = LocalTypography.current
+        @Composable @ReadOnlyComposable get() = LocalTypography.current
 
     /**
      * Retrieves the current [Shapes] at the call site's position in the hierarchy.
@@ -101,9 +97,7 @@
      * @sample androidx.compose.material3.samples.ThemeShapeSample
      */
     val shapes: Shapes
-        @Composable
-        @ReadOnlyComposable
-        get() = LocalShapes.current
+        @Composable @ReadOnlyComposable get() = LocalShapes.current
 }
 
 // TODO: Create a sample androidx.compose.material3.samples.MaterialExpressiveThemeSample
@@ -115,17 +109,16 @@
  * default values.
  *
  * All values may be set by providing this component with the [colorScheme][ColorScheme],
- * [typography][Typography], [shapes][Shapes] attributes. Use this to configure the overall
- * theme of elements within this MaterialTheme.
+ * [typography][Typography], [shapes][Shapes] attributes. Use this to configure the overall theme of
+ * elements within this MaterialTheme.
  *
  * Any values that are not set will fall back to the defaults. To inherit the current value from the
  * theme, pass them into subsequent calls and override only the parts of the theme definition that
  * need to change.
  *
- * Alternatively, only call this function at the top
- * of your application, and then call [MaterialTheme] to specify separate MaterialTheme(s) for
- * different screens / parts of your UI, overriding only the parts of the theme definition that need
- * to change.
+ * Alternatively, only call this function at the top of your application, and then call
+ * [MaterialTheme] to specify separate MaterialTheme(s) for different screens / parts of your UI,
+ * overriding only the parts of the theme definition that need to change.
  *
  * @param colorScheme A complete definition of the Material Color theme for this hierarchy
  * @param typography A set of text styles to be used as this hierarchy's typography system
diff --git a/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/Menu.kt b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/Menu.kt
index 26e5b58..e6b6f61 100644
--- a/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/Menu.kt
+++ b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/Menu.kt
@@ -66,12 +66,14 @@
 import kotlin.math.min
 
 /**
- * <a href="https://m3.material.io/components/menus/overview" class="external" target="_blank">Material Design dropdown menu</a>.
+ * <a href="https://m3.material.io/components/menus/overview" class="external"
+ * target="_blank">Material Design dropdown menu</a>.
  *
  * Menus display a list of choices on a temporary surface. They appear when users interact with a
  * button, action, or other control.
  *
- * ![Dropdown menu image](https://developer.android.com/images/reference/androidx/compose/material3/menu.png)
+ * ![Dropdown menu
+ * image](https://developer.android.com/images/reference/androidx/compose/material3/menu.png)
  *
  * A [DropdownMenu] behaves similarly to a [Popup], and will use the position of the parent layout
  * to position itself on screen. Commonly a [DropdownMenu] will be placed in a [Box] with a sibling
@@ -79,12 +81,12 @@
  * space in a layout, as the menu is displayed in a separate window, on top of other content.
  *
  * The [content] of a [DropdownMenu] will typically be [DropdownMenuItem]s, as well as custom
- * content. Using [DropdownMenuItem]s will result in a menu that matches the Material
- * specification for menus. Also note that the [content] is placed inside a scrollable [Column],
- * so using a [LazyColumn] as the root layout inside [content] is unsupported.
+ * content. Using [DropdownMenuItem]s will result in a menu that matches the Material specification
+ * for menus. Also note that the [content] is placed inside a scrollable [Column], so using a
+ * [LazyColumn] as the root layout inside [content] is unsupported.
  *
- * [onDismissRequest] will be called when the menu should close - for example when there is a
- * tap outside the menu, or when the back key is pressed.
+ * [onDismissRequest] will be called when the menu should close - for example when there is a tap
+ * outside the menu, or when the back key is pressed.
  *
  * [DropdownMenu] changes its positioning depending on the available space, always trying to be
  * fully visible. Depending on layout direction, first it will try to align its start to the start
@@ -96,24 +98,26 @@
  * bounds of its parent do not coincide with its visual bounds.
  *
  * Example usage:
+ *
  * @sample androidx.compose.material3.samples.MenuSample
  *
  * Example usage with a [ScrollState] to control the menu items scroll position:
+ *
  * @sample androidx.compose.material3.samples.MenuWithScrollStateSample
  *
  * @param expanded whether the menu is expanded or not
  * @param onDismissRequest called when the user requests to dismiss the menu, such as by tapping
- * outside the menu's bounds
+ *   outside the menu's bounds
  * @param modifier [Modifier] to be applied to the menu's content
  * @param offset [DpOffset] from the original position of the menu. The offset respects the
- * [LayoutDirection], so the offset's x position will be added in LTR and subtracted in RTL.
+ *   [LayoutDirection], so the offset's x position will be added in LTR and subtracted in RTL.
  * @param scrollState a [ScrollState] to used by the menu's content for items vertical scrolling
  * @param properties [PopupProperties] for further customization of this popup's behavior
  * @param shape the shape of the menu
  * @param containerColor the container color of the menu
  * @param tonalElevation when [containerColor] is [ColorScheme.surface], a translucent primary color
- * overlay is applied on top of the container. A higher tonal elevation value will result in a
- * darker color in light theme and lighter color in dark theme. See also: [Surface].
+ *   overlay is applied on top of the container. A higher tonal elevation value will result in a
+ *   darker color in light theme and lighter color in dark theme. See also: [Surface].
  * @param shadowElevation the elevation for the shadow below the menu
  * @param border the border to draw around the container of the menu. Pass `null` for no border.
  * @param content the content of this dropdown menu, typically a [DropdownMenuItem]
@@ -135,14 +139,17 @@
 )
 
 /**
- * <a href="https://m3.material.io/components/menus/overview" class="external" target="_blank">Material Design dropdown menu</a> item.
+ * <a href="https://m3.material.io/components/menus/overview" class="external"
+ * target="_blank">Material Design dropdown menu</a> item.
  *
  * Menus display a list of choices on a temporary surface. They appear when users interact with a
  * button, action, or other control.
  *
- * ![Dropdown menu image](https://developer.android.com/images/reference/androidx/compose/material3/menu.png)
+ * ![Dropdown menu
+ * image](https://developer.android.com/images/reference/androidx/compose/material3/menu.png)
  *
  * Example usage:
+ *
  * @sample androidx.compose.material3.samples.MenuSample
  *
  * @param text text of the menu item
@@ -150,17 +157,17 @@
  * @param modifier the [Modifier] to be applied to this menu item
  * @param leadingIcon optional leading icon to be displayed at the beginning of the item's text
  * @param trailingIcon optional trailing icon to be displayed at the end of the item's text. This
- * trailing icon slot can also accept [Text] to indicate a keyboard shortcut.
+ *   trailing icon slot can also accept [Text] to indicate a keyboard shortcut.
  * @param enabled controls the enabled state of this menu item. When `false`, this component will
- * not respond to user input, and it will appear visually disabled and disabled to accessibility
- * services.
+ *   not respond to user input, and it will appear visually disabled and disabled to accessibility
+ *   services.
  * @param colors [MenuItemColors] that will be used to resolve the colors used for this menu item in
- * different states. See [MenuDefaults.itemColors].
+ *   different states. See [MenuDefaults.itemColors].
  * @param contentPadding the padding applied to the content of this menu item
  * @param interactionSource an optional hoisted [MutableInteractionSource] for observing and
- * emitting [Interaction]s for this menu item. You can use this to change the menu item's appearance
- * or preview the menu item in different states. Note that if `null` is provided, interactions will
- * still happen internally.
+ *   emitting [Interaction]s for this menu item. You can use this to change the menu item's
+ *   appearance or preview the menu item in different states. Note that if `null` is provided,
+ *   interactions will still happen internally.
  */
 @Composable
 expect fun DropdownMenuItem(
@@ -175,9 +182,7 @@
     interactionSource: MutableInteractionSource? = null,
 )
 
-/**
- * Contains default values used for [DropdownMenu] and [DropdownMenuItem].
- */
+/** Contains default values used for [DropdownMenu] and [DropdownMenuItem]. */
 object MenuDefaults {
     /** The default tonal elevation for a menu. */
     val TonalElevation = ElevationTokens.Level0
@@ -186,17 +191,18 @@
     val ShadowElevation = MenuTokens.ContainerElevation
 
     /** The default shape for a menu. */
-    val shape @Composable get() = MenuTokens.ContainerShape.value
+    val shape
+        @Composable get() = MenuTokens.ContainerShape.value
 
     /** The default container color for a menu. */
-    val containerColor @Composable get() = MenuTokens.ContainerColor.value
+    val containerColor
+        @Composable get() = MenuTokens.ContainerColor.value
 
     /**
      * Creates a [MenuItemColors] that represents the default text and icon colors used in a
      * [DropdownMenuItemContent].
      */
-    @Composable
-    fun itemColors() = MaterialTheme.colorScheme.defaultMenuItemColors
+    @Composable fun itemColors() = MaterialTheme.colorScheme.defaultMenuItemColors
 
     /**
      * Creates a [MenuItemColors] that represents the default text and icon colors used in a
@@ -205,12 +211,12 @@
      * @param textColor the text color of this [DropdownMenuItemContent] when enabled
      * @param leadingIconColor the leading icon color of this [DropdownMenuItemContent] when enabled
      * @param trailingIconColor the trailing icon color of this [DropdownMenuItemContent] when
-     * enabled
+     *   enabled
      * @param disabledTextColor the text color of this [DropdownMenuItemContent] when not enabled
      * @param disabledLeadingIconColor the leading icon color of this [DropdownMenuItemContent] when
-     * not enabled
+     *   not enabled
      * @param disabledTrailingIconColor the trailing icon color of this [DropdownMenuItemContent]
-     * when not enabled
+     *   when not enabled
      */
     @Composable
     fun itemColors(
@@ -220,39 +226,39 @@
         disabledTextColor: Color = Color.Unspecified,
         disabledLeadingIconColor: Color = Color.Unspecified,
         disabledTrailingIconColor: Color = Color.Unspecified,
-    ): MenuItemColors = MaterialTheme.colorScheme.defaultMenuItemColors.copy(
-        textColor = textColor,
-        leadingIconColor = leadingIconColor,
-        trailingIconColor = trailingIconColor,
-        disabledTextColor = disabledTextColor,
-        disabledLeadingIconColor = disabledLeadingIconColor,
-        disabledTrailingIconColor = disabledTrailingIconColor,
-    )
+    ): MenuItemColors =
+        MaterialTheme.colorScheme.defaultMenuItemColors.copy(
+            textColor = textColor,
+            leadingIconColor = leadingIconColor,
+            trailingIconColor = trailingIconColor,
+            disabledTextColor = disabledTextColor,
+            disabledLeadingIconColor = disabledLeadingIconColor,
+            disabledTrailingIconColor = disabledTrailingIconColor,
+        )
 
     internal val ColorScheme.defaultMenuItemColors: MenuItemColors
         get() {
-            return defaultMenuItemColorsCached ?: MenuItemColors(
-                textColor = fromToken(ListTokens.ListItemLabelTextColor),
-                leadingIconColor = fromToken(ListTokens.ListItemLeadingIconColor),
-                trailingIconColor = fromToken(ListTokens.ListItemTrailingIconColor),
-                disabledTextColor = fromToken(ListTokens.ListItemDisabledLabelTextColor)
-                    .copy(alpha = ListTokens.ListItemDisabledLabelTextOpacity),
-                disabledLeadingIconColor = fromToken(ListTokens.ListItemDisabledLeadingIconColor)
-                    .copy(alpha = ListTokens.ListItemDisabledLeadingIconOpacity),
-                disabledTrailingIconColor = fromToken(ListTokens.ListItemDisabledTrailingIconColor)
-                    .copy(alpha = ListTokens.ListItemDisabledTrailingIconOpacity),
-            ).also {
-                defaultMenuItemColorsCached = it
-            }
+            return defaultMenuItemColorsCached
+                ?: MenuItemColors(
+                        textColor = fromToken(ListTokens.ListItemLabelTextColor),
+                        leadingIconColor = fromToken(ListTokens.ListItemLeadingIconColor),
+                        trailingIconColor = fromToken(ListTokens.ListItemTrailingIconColor),
+                        disabledTextColor =
+                            fromToken(ListTokens.ListItemDisabledLabelTextColor)
+                                .copy(alpha = ListTokens.ListItemDisabledLabelTextOpacity),
+                        disabledLeadingIconColor =
+                            fromToken(ListTokens.ListItemDisabledLeadingIconColor)
+                                .copy(alpha = ListTokens.ListItemDisabledLeadingIconOpacity),
+                        disabledTrailingIconColor =
+                            fromToken(ListTokens.ListItemDisabledTrailingIconColor)
+                                .copy(alpha = ListTokens.ListItemDisabledTrailingIconOpacity),
+                    )
+                    .also { defaultMenuItemColorsCached = it }
         }
 
-    /**
-     * Default padding used for [DropdownMenuItem].
-     */
-    val DropdownMenuItemContentPadding = PaddingValues(
-        horizontal = DropdownMenuItemHorizontalPadding,
-        vertical = 0.dp
-    )
+    /** Default padding used for [DropdownMenuItem]. */
+    val DropdownMenuItemContentPadding =
+        PaddingValues(horizontal = DropdownMenuItemHorizontalPadding, vertical = 0.dp)
 }
 
 // TODO: Consider to move into public [MenuDefaults]
@@ -261,18 +267,16 @@
 /**
  * Represents the text and icon colors used in a menu item at different states.
  *
- * @constructor create an instance with arbitrary colors.
- * See [MenuDefaults.itemColors] for the default colors used in a [DropdownMenuItemContent].
- *
  * @param textColor the text color of this [DropdownMenuItemContent] when enabled
  * @param leadingIconColor the leading icon color of this [DropdownMenuItemContent] when enabled
- * @param trailingIconColor the trailing icon color of this [DropdownMenuItemContent] when
- * enabled
+ * @param trailingIconColor the trailing icon color of this [DropdownMenuItemContent] when enabled
  * @param disabledTextColor the text color of this [DropdownMenuItemContent] when not enabled
- * @param disabledLeadingIconColor the leading icon color of this [DropdownMenuItemContent] when
- * not enabled
- * @param disabledTrailingIconColor the trailing icon color of this [DropdownMenuItemContent]
- * when not enabled
+ * @param disabledLeadingIconColor the leading icon color of this [DropdownMenuItemContent] when not
+ *   enabled
+ * @param disabledTrailingIconColor the trailing icon color of this [DropdownMenuItemContent] when
+ *   not enabled
+ * @constructor create an instance with arbitrary colors. See [MenuDefaults.itemColors] for the
+ *   default colors used in a [DropdownMenuItemContent].
  */
 @Immutable
 class MenuItemColors(
@@ -285,8 +289,8 @@
 ) {
 
     /**
-     * Returns a copy of this MenuItemColors, optionally overriding some of the values.
-     * This uses the Color.Unspecified to mean “use the value from the source”
+     * Returns a copy of this MenuItemColors, optionally overriding some of the values. This uses
+     * the Color.Unspecified to mean “use the value from the source”
      */
     fun copy(
         textColor: Color = this.textColor,
@@ -295,14 +299,15 @@
         disabledTextColor: Color = this.disabledTextColor,
         disabledLeadingIconColor: Color = this.disabledLeadingIconColor,
         disabledTrailingIconColor: Color = this.disabledTrailingIconColor,
-    ) = MenuItemColors(
-        textColor.takeOrElse { this.textColor },
-        leadingIconColor.takeOrElse { this.leadingIconColor },
-        trailingIconColor.takeOrElse { this.trailingIconColor },
-        disabledTextColor.takeOrElse { this.disabledTextColor },
-        disabledLeadingIconColor.takeOrElse { this.disabledLeadingIconColor },
-        disabledTrailingIconColor.takeOrElse { this.disabledTrailingIconColor },
-    )
+    ) =
+        MenuItemColors(
+            textColor.takeOrElse { this.textColor },
+            leadingIconColor.takeOrElse { this.leadingIconColor },
+            trailingIconColor.takeOrElse { this.trailingIconColor },
+            disabledTextColor.takeOrElse { this.disabledTextColor },
+            disabledLeadingIconColor.takeOrElse { this.disabledLeadingIconColor },
+            disabledTrailingIconColor.takeOrElse { this.disabledTrailingIconColor },
+        )
 
     /**
      * Represents the text color for a menu item, depending on its [enabled] state.
@@ -310,8 +315,7 @@
      * @param enabled whether the menu item is enabled
      */
     @Stable
-    internal fun textColor(enabled: Boolean): Color =
-        if (enabled) textColor else disabledTextColor
+    internal fun textColor(enabled: Boolean): Color = if (enabled) textColor else disabledTextColor
 
     /**
      * Represents the leading icon color for a menu item, depending on its [enabled] state.
@@ -370,60 +374,53 @@
     content: @Composable ColumnScope.() -> Unit
 ) {
     // Menu open/close animation.
-    @Suppress("DEPRECATION")
-    val transition = updateTransition(expandedState, "DropDownMenu")
+    @Suppress("DEPRECATION") val transition = updateTransition(expandedState, "DropDownMenu")
 
-    val scale by transition.animateFloat(
-        transitionSpec = {
-            if (false isTransitioningTo true) {
-                // Dismissed to expanded
-                tween(
-                    durationMillis = InTransitionDuration,
-                    easing = LinearOutSlowInEasing
-                )
-            } else {
-                // Expanded to dismissed.
-                tween(
-                    durationMillis = 1,
-                    delayMillis = OutTransitionDuration - 1
-                )
+    val scale by
+        transition.animateFloat(
+            transitionSpec = {
+                if (false isTransitioningTo true) {
+                    // Dismissed to expanded
+                    tween(durationMillis = InTransitionDuration, easing = LinearOutSlowInEasing)
+                } else {
+                    // Expanded to dismissed.
+                    tween(durationMillis = 1, delayMillis = OutTransitionDuration - 1)
+                }
             }
+        ) { expanded ->
+            if (expanded) ExpandedScaleTarget else ClosedScaleTarget
         }
-    ) { expanded ->
-        if (expanded) ExpandedScaleTarget else ClosedScaleTarget
-    }
 
-    val alpha by transition.animateFloat(
-        transitionSpec = {
-            if (false isTransitioningTo true) {
-                // Dismissed to expanded
-                tween(durationMillis = 30)
-            } else {
-                // Expanded to dismissed.
-                tween(durationMillis = OutTransitionDuration)
+    val alpha by
+        transition.animateFloat(
+            transitionSpec = {
+                if (false isTransitioningTo true) {
+                    // Dismissed to expanded
+                    tween(durationMillis = 30)
+                } else {
+                    // Expanded to dismissed.
+                    tween(durationMillis = OutTransitionDuration)
+                }
             }
+        ) { expanded ->
+            if (expanded) ExpandedAlphaTarget else ClosedAlphaTarget
         }
-    ) { expanded ->
-        if (expanded) ExpandedAlphaTarget else ClosedAlphaTarget
-    }
 
     val isInspecting = LocalInspectionMode.current
     Surface(
-        modifier = Modifier.graphicsLayer {
-            scaleX =
-                if (!isInspecting) scale
-                else if (expandedState.targetState) ExpandedScaleTarget
-                else ClosedScaleTarget
-            scaleY =
-                if (!isInspecting) scale
-                else if (expandedState.targetState) ExpandedScaleTarget
-                else ClosedScaleTarget
-            this.alpha =
-                if (!isInspecting) alpha
-                else if (expandedState.targetState) ExpandedAlphaTarget
-                else ClosedAlphaTarget
-            transformOrigin = transformOriginState.value
-        },
+        modifier =
+            Modifier.graphicsLayer {
+                scaleX =
+                    if (!isInspecting) scale
+                    else if (expandedState.targetState) ExpandedScaleTarget else ClosedScaleTarget
+                scaleY =
+                    if (!isInspecting) scale
+                    else if (expandedState.targetState) ExpandedScaleTarget else ClosedScaleTarget
+                this.alpha =
+                    if (!isInspecting) alpha
+                    else if (expandedState.targetState) ExpandedAlphaTarget else ClosedAlphaTarget
+                transformOrigin = transformOriginState.value
+            },
         shape = shape,
         color = containerColor,
         tonalElevation = tonalElevation,
@@ -431,10 +428,11 @@
         border = border,
     ) {
         Column(
-            modifier = modifier
-                .padding(vertical = DropdownMenuVerticalPadding)
-                .width(IntrinsicSize.Max)
-                .verticalScroll(scrollState),
+            modifier =
+                modifier
+                    .padding(vertical = DropdownMenuVerticalPadding)
+                    .width(IntrinsicSize.Max)
+                    .verticalScroll(scrollState),
             content = content
         )
     }
@@ -453,21 +451,22 @@
     interactionSource: MutableInteractionSource?
 ) {
     Row(
-        modifier = modifier
-            .clickable(
-                enabled = enabled,
-                onClick = onClick,
-                interactionSource = interactionSource,
-                indication = rippleOrFallbackImplementation(true)
-            )
-            .fillMaxWidth()
-            // Preferred min and max width used during the intrinsic measurement.
-            .sizeIn(
-                minWidth = DropdownMenuItemDefaultMinWidth,
-                maxWidth = DropdownMenuItemDefaultMaxWidth,
-                minHeight = MenuListItemContainerHeight
-            )
-            .padding(contentPadding),
+        modifier =
+            modifier
+                .clickable(
+                    enabled = enabled,
+                    onClick = onClick,
+                    interactionSource = interactionSource,
+                    indication = rippleOrFallbackImplementation(true)
+                )
+                .fillMaxWidth()
+                // Preferred min and max width used during the intrinsic measurement.
+                .sizeIn(
+                    minWidth = DropdownMenuItemDefaultMinWidth,
+                    maxWidth = DropdownMenuItemDefaultMaxWidth,
+                    minHeight = MenuListItemContainerHeight
+                )
+                .padding(contentPadding),
         verticalAlignment = Alignment.CenterVertically
     ) {
         // TODO(b/271818892): Align menu list item style with general list item style.
@@ -483,19 +482,20 @@
             }
             CompositionLocalProvider(LocalContentColor provides colors.textColor(enabled)) {
                 Box(
-                    Modifier
-                        .weight(1f)
+                    Modifier.weight(1f)
                         .padding(
-                            start = if (leadingIcon != null) {
-                                DropdownMenuItemHorizontalPadding
-                            } else {
-                                0.dp
-                            },
-                            end = if (trailingIcon != null) {
-                                DropdownMenuItemHorizontalPadding
-                            } else {
-                                0.dp
-                            }
+                            start =
+                                if (leadingIcon != null) {
+                                    DropdownMenuItemHorizontalPadding
+                                } else {
+                                    0.dp
+                                },
+                            end =
+                                if (trailingIcon != null) {
+                                    DropdownMenuItemHorizontalPadding
+                                } else {
+                                    0.dp
+                                }
                         )
                 ) {
                     text()
@@ -514,32 +514,31 @@
     }
 }
 
-internal fun calculateTransformOrigin(
-    anchorBounds: IntRect,
-    menuBounds: IntRect
-): TransformOrigin {
-    val pivotX = when {
-        menuBounds.left >= anchorBounds.right -> 0f
-        menuBounds.right <= anchorBounds.left -> 1f
-        menuBounds.width == 0 -> 0f
-        else -> {
-            val intersectionCenter =
-                (max(anchorBounds.left, menuBounds.left) +
-                    min(anchorBounds.right, menuBounds.right)) / 2
-            (intersectionCenter - menuBounds.left).toFloat() / menuBounds.width
+internal fun calculateTransformOrigin(anchorBounds: IntRect, menuBounds: IntRect): TransformOrigin {
+    val pivotX =
+        when {
+            menuBounds.left >= anchorBounds.right -> 0f
+            menuBounds.right <= anchorBounds.left -> 1f
+            menuBounds.width == 0 -> 0f
+            else -> {
+                val intersectionCenter =
+                    (max(anchorBounds.left, menuBounds.left) +
+                        min(anchorBounds.right, menuBounds.right)) / 2
+                (intersectionCenter - menuBounds.left).toFloat() / menuBounds.width
+            }
         }
-    }
-    val pivotY = when {
-        menuBounds.top >= anchorBounds.bottom -> 0f
-        menuBounds.bottom <= anchorBounds.top -> 1f
-        menuBounds.height == 0 -> 0f
-        else -> {
-            val intersectionCenter =
-                (max(anchorBounds.top, menuBounds.top) +
-                    min(anchorBounds.bottom, menuBounds.bottom)) / 2
-            (intersectionCenter - menuBounds.top).toFloat() / menuBounds.height
+    val pivotY =
+        when {
+            menuBounds.top >= anchorBounds.bottom -> 0f
+            menuBounds.bottom <= anchorBounds.top -> 1f
+            menuBounds.height == 0 -> 0f
+            else -> {
+                val intersectionCenter =
+                    (max(anchorBounds.top, menuBounds.top) +
+                        min(anchorBounds.bottom, menuBounds.bottom)) / 2
+                (intersectionCenter - menuBounds.top).toFloat() / menuBounds.height
+            }
         }
-    }
     return TransformOrigin(pivotX, pivotY)
 }
 
diff --git a/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/ModalBottomSheet.kt b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/ModalBottomSheet.kt
index 6feb86a..539e5c5 100644
--- a/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/ModalBottomSheet.kt
+++ b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/ModalBottomSheet.kt
@@ -74,7 +74,8 @@
 import kotlinx.coroutines.launch
 
 /**
- * <a href="https://m3.material.io/components/bottom-sheets/overview" class="external" target="_blank">Material Design modal bottom sheet</a>.
+ * <a href="https://m3.material.io/components/bottom-sheets/overview" class="external"
+ * target="_blank">Material Design modal bottom sheet</a>.
  *
  * Modal bottom sheets are used as an alternative to inline menus or simple dialogs on mobile,
  * especially when offering a long list of action items, or when items require longer descriptions
@@ -82,32 +83,33 @@
  * app functionality when they appear, and remaining on screen until confirmed, dismissed, or a
  * required action has been taken.
  *
- * ![Bottom sheet image](https://developer.android.com/images/reference/androidx/compose/material3/bottom_sheet.png)
+ * ![Bottom sheet
+ * image](https://developer.android.com/images/reference/androidx/compose/material3/bottom_sheet.png)
  *
  * A simple example of a modal bottom sheet looks like this:
  *
  * @sample androidx.compose.material3.samples.ModalBottomSheetSample
  *
  * @param onDismissRequest Executes when the user clicks outside of the bottom sheet, after sheet
- * animates to [Hidden].
+ *   animates to [Hidden].
  * @param modifier Optional [Modifier] for the bottom sheet.
  * @param sheetState The state of the bottom sheet.
- * @param sheetMaxWidth [Dp] that defines what the maximum width the sheet will take.
- * Pass in [Dp.Unspecified] for a sheet that spans the entire screen width.
+ * @param sheetMaxWidth [Dp] that defines what the maximum width the sheet will take. Pass in
+ *   [Dp.Unspecified] for a sheet that spans the entire screen width.
  * @param shape The shape of the bottom sheet.
  * @param containerColor The color used for the background of this bottom sheet
  * @param contentColor The preferred color for content inside this bottom sheet. Defaults to either
- * the matching content color for [containerColor], or to the current [LocalContentColor] if
- * [containerColor] is not a color from the theme.
+ *   the matching content color for [containerColor], or to the current [LocalContentColor] if
+ *   [containerColor] is not a color from the theme.
  * @param tonalElevation when [containerColor] is [ColorScheme.surface], a translucent primary color
- * overlay is applied on top of the container. A higher tonal elevation value will result in a
- * darker color in light theme and lighter color in dark theme. See also: [Surface].
+ *   overlay is applied on top of the container. A higher tonal elevation value will result in a
+ *   darker color in light theme and lighter color in dark theme. See also: [Surface].
  * @param scrimColor Color of the scrim that obscures content when the bottom sheet is open.
  * @param dragHandle Optional visual marker to swipe the bottom sheet.
- * @param contentWindowInsets window insets to be passed to the bottom sheet content via [PaddingValues]
- * params.
- * @param properties [ModalBottomSheetProperties] for further customization of this
- * modal bottom sheet's window behavior.
+ * @param contentWindowInsets window insets to be passed to the bottom sheet content via
+ *   [PaddingValues] params.
+ * @param properties [ModalBottomSheetProperties] for further customization of this modal bottom
+ *   sheet's window behavior.
  * @param content The content to be displayed inside the bottom sheet.
  */
 @Composable
@@ -130,17 +132,19 @@
     val scope = rememberCoroutineScope()
     val animateToDismiss: () -> Unit = {
         if (sheetState.anchoredDraggableState.confirmValueChange(Hidden)) {
-            scope.launch { sheetState.hide() }.invokeOnCompletion {
-                if (!sheetState.isVisible) {
-                    onDismissRequest()
+            scope
+                .launch { sheetState.hide() }
+                .invokeOnCompletion {
+                    if (!sheetState.isVisible) {
+                        onDismissRequest()
+                    }
                 }
-            }
         }
     }
     val settleToDismiss: (velocity: Float) -> Unit = {
-        scope.launch { sheetState.settle(it) }.invokeOnCompletion {
-            if (!sheetState.isVisible) onDismissRequest()
-        }
+        scope
+            .launch { sheetState.settle(it) }
+            .invokeOnCompletion { if (!sheetState.isVisible) onDismissRequest() }
     }
 
     val predictiveBackProgress = remember { Animatable(initialValue = 0f) }
@@ -160,11 +164,7 @@
         },
         predictiveBackProgress = predictiveBackProgress,
     ) {
-        Box(
-            modifier = Modifier
-                .fillMaxSize()
-                .imePadding()
-        ) {
+        Box(modifier = Modifier.fillMaxSize().imePadding()) {
             Scrim(
                 color = scrimColor,
                 onDismissRequest = animateToDismiss,
@@ -189,9 +189,7 @@
         }
     }
     if (sheetState.hasExpandedState) {
-        LaunchedEffect(sheetState) {
-            sheetState.show()
-        }
+        LaunchedEffect(sheetState) { sheetState.show() }
     }
 }
 
@@ -216,126 +214,121 @@
     val bottomSheetPaneTitle = getString(string = Strings.BottomSheetPaneTitle)
 
     Surface(
-        modifier = modifier
-            .align(Alignment.TopCenter)
-            .widthIn(max = sheetMaxWidth)
-            .fillMaxWidth()
-            .graphicsLayer {
-                val sheetOffset = sheetState.anchoredDraggableState.offset
-                val sheetHeight = size.height
-                if (!sheetOffset.isNaN() && !sheetHeight.isNaN() && sheetHeight != 0f) {
-                    val progress = predictiveBackProgress.value
-                    scaleX = calculatePredictiveBackScaleX(progress)
-                    scaleY = calculatePredictiveBackScaleY(progress)
-                    transformOrigin =
-                        TransformOrigin(0.5f, (sheetOffset + sheetHeight) / sheetHeight)
-                }
-            }
-            .nestedScroll(
-                remember(sheetState) {
-                    ConsumeSwipeWithinBottomSheetBoundsNestedScrollConnection(
-                        sheetState = sheetState,
-                        orientation = Orientation.Vertical,
-                        onFling = settleToDismiss
-                    )
-                }
-            )
-            .draggableAnchors(
-                sheetState.anchoredDraggableState,
-                Orientation.Vertical
-            ) { sheetSize, constraints ->
-                val fullHeight = constraints.maxHeight.toFloat()
-                val newAnchors = DraggableAnchors {
-                    Hidden at fullHeight
-                    if (sheetSize.height > (fullHeight / 2) &&
-                        !sheetState.skipPartiallyExpanded
-                    ) {
-                        PartiallyExpanded at fullHeight / 2f
-                    }
-                    if (sheetSize.height != 0) {
-                        Expanded at max(0f, fullHeight - sheetSize.height)
+        modifier =
+            modifier
+                .align(Alignment.TopCenter)
+                .widthIn(max = sheetMaxWidth)
+                .fillMaxWidth()
+                .graphicsLayer {
+                    val sheetOffset = sheetState.anchoredDraggableState.offset
+                    val sheetHeight = size.height
+                    if (!sheetOffset.isNaN() && !sheetHeight.isNaN() && sheetHeight != 0f) {
+                        val progress = predictiveBackProgress.value
+                        scaleX = calculatePredictiveBackScaleX(progress)
+                        scaleY = calculatePredictiveBackScaleY(progress)
+                        transformOrigin =
+                            TransformOrigin(0.5f, (sheetOffset + sheetHeight) / sheetHeight)
                     }
                 }
-                val newTarget = when (sheetState.anchoredDraggableState.targetValue) {
-                    Hidden -> Hidden
-                    PartiallyExpanded, Expanded -> {
-                        val hasPartiallyExpandedState = newAnchors
-                            .hasAnchorFor(PartiallyExpanded)
-                        val newTarget = if (hasPartiallyExpandedState) PartiallyExpanded
-                        else if (newAnchors.hasAnchorFor(Expanded)) Expanded else Hidden
-                        newTarget
+                .nestedScroll(
+                    remember(sheetState) {
+                        ConsumeSwipeWithinBottomSheetBoundsNestedScrollConnection(
+                            sheetState = sheetState,
+                            orientation = Orientation.Vertical,
+                            onFling = settleToDismiss
+                        )
                     }
+                )
+                .draggableAnchors(sheetState.anchoredDraggableState, Orientation.Vertical) {
+                    sheetSize,
+                    constraints ->
+                    val fullHeight = constraints.maxHeight.toFloat()
+                    val newAnchors = DraggableAnchors {
+                        Hidden at fullHeight
+                        if (
+                            sheetSize.height > (fullHeight / 2) && !sheetState.skipPartiallyExpanded
+                        ) {
+                            PartiallyExpanded at fullHeight / 2f
+                        }
+                        if (sheetSize.height != 0) {
+                            Expanded at max(0f, fullHeight - sheetSize.height)
+                        }
+                    }
+                    val newTarget =
+                        when (sheetState.anchoredDraggableState.targetValue) {
+                            Hidden -> Hidden
+                            PartiallyExpanded,
+                            Expanded -> {
+                                val hasPartiallyExpandedState =
+                                    newAnchors.hasAnchorFor(PartiallyExpanded)
+                                val newTarget =
+                                    if (hasPartiallyExpandedState) PartiallyExpanded
+                                    else if (newAnchors.hasAnchorFor(Expanded)) Expanded else Hidden
+                                newTarget
+                            }
+                        }
+                    return@draggableAnchors newAnchors to newTarget
                 }
-                return@draggableAnchors newAnchors to newTarget
-            }
-            .draggable(
-                state = sheetState.anchoredDraggableState.draggableState,
-                orientation = Orientation.Vertical,
-                enabled = sheetState.isVisible,
-                startDragImmediately = sheetState.anchoredDraggableState.isAnimationRunning,
-                onDragStopped = { settleToDismiss(it) }
-            )
-            .semantics { paneTitle = bottomSheetPaneTitle },
+                .draggable(
+                    state = sheetState.anchoredDraggableState.draggableState,
+                    orientation = Orientation.Vertical,
+                    enabled = sheetState.isVisible,
+                    startDragImmediately = sheetState.anchoredDraggableState.isAnimationRunning,
+                    onDragStopped = { settleToDismiss(it) }
+                )
+                .semantics { paneTitle = bottomSheetPaneTitle },
         shape = shape,
         color = containerColor,
         contentColor = contentColor,
         tonalElevation = tonalElevation,
     ) {
         Column(
-            Modifier
-                .fillMaxWidth()
-                .windowInsetsPadding(contentWindowInsets())
-                .graphicsLayer {
-                    val progress = predictiveBackProgress.value
-                    val predictiveBackScaleX = calculatePredictiveBackScaleX(progress)
-                    val predictiveBackScaleY = calculatePredictiveBackScaleY(progress)
+            Modifier.fillMaxWidth().windowInsetsPadding(contentWindowInsets()).graphicsLayer {
+                val progress = predictiveBackProgress.value
+                val predictiveBackScaleX = calculatePredictiveBackScaleX(progress)
+                val predictiveBackScaleY = calculatePredictiveBackScaleY(progress)
 
-                    // Preserve the original aspect ratio and alignment of the child content.
-                    scaleY =
-                        if (predictiveBackScaleY != 0f) predictiveBackScaleX / predictiveBackScaleY
-                        else 1f
-                    transformOrigin = PredictiveBackChildTransformOrigin
-                }
+                // Preserve the original aspect ratio and alignment of the child content.
+                scaleY =
+                    if (predictiveBackScaleY != 0f) predictiveBackScaleX / predictiveBackScaleY
+                    else 1f
+                transformOrigin = PredictiveBackChildTransformOrigin
+            }
         ) {
             if (dragHandle != null) {
-                val collapseActionLabel =
-                    getString(Strings.BottomSheetPartialExpandDescription)
+                val collapseActionLabel = getString(Strings.BottomSheetPartialExpandDescription)
                 val dismissActionLabel = getString(Strings.BottomSheetDismissDescription)
                 val expandActionLabel = getString(Strings.BottomSheetExpandDescription)
                 Box(
-                    Modifier
-                        .align(Alignment.CenterHorizontally)
-                        .semantics(mergeDescendants = true) {
-                            // Provides semantics to interact with the bottomsheet based on its
-                            // current value.
-                            with(sheetState) {
-                                dismiss(dismissActionLabel) {
-                                    animateToDismiss()
+                    Modifier.align(Alignment.CenterHorizontally).semantics(
+                        mergeDescendants = true
+                    ) {
+                        // Provides semantics to interact with the bottomsheet based on its
+                        // current value.
+                        with(sheetState) {
+                            dismiss(dismissActionLabel) {
+                                animateToDismiss()
+                                true
+                            }
+                            if (currentValue == PartiallyExpanded) {
+                                expand(expandActionLabel) {
+                                    if (anchoredDraggableState.confirmValueChange(Expanded)) {
+                                        scope.launch { sheetState.expand() }
+                                    }
                                     true
                                 }
-                                if (currentValue == PartiallyExpanded) {
-                                    expand(expandActionLabel) {
-                                        if (anchoredDraggableState.confirmValueChange(
-                                                Expanded
-                                            )
-                                        ) {
-                                            scope.launch { sheetState.expand() }
-                                        }
-                                        true
+                            } else if (hasPartiallyExpandedState) {
+                                collapse(collapseActionLabel) {
+                                    if (
+                                        anchoredDraggableState.confirmValueChange(PartiallyExpanded)
+                                    ) {
+                                        scope.launch { partialExpand() }
                                     }
-                                } else if (hasPartiallyExpandedState) {
-                                    collapse(collapseActionLabel) {
-                                        if (anchoredDraggableState.confirmValueChange(
-                                                PartiallyExpanded
-                                            )
-                                        ) {
-                                            scope.launch { partialExpand() }
-                                        }
-                                        true
-                                    }
+                                    true
                                 }
                             }
                         }
+                    }
                 ) {
                     dragHandle()
                 }
@@ -366,8 +359,8 @@
 /**
  * Properties used to customize the behavior of a [ModalBottomSheet].
  *
- * @param shouldDismissOnBackPress Whether the modal bottom sheet can be dismissed by pressing
- * the back button. If true, pressing the back button will call onDismissRequest.
+ * @param shouldDismissOnBackPress Whether the modal bottom sheet can be dismissed by pressing the
+ *   back button. If true, pressing the back button will call onDismissRequest.
  */
 @Immutable
 @ExperimentalMaterial3Api
@@ -377,16 +370,12 @@
     val shouldDismissOnBackPress: Boolean
 }
 
-/**
- * Default values for [ModalBottomSheet]
- */
+/** Default values for [ModalBottomSheet] */
 @Immutable
 @ExperimentalMaterial3Api
 expect object ModalBottomSheetDefaults {
 
-    /**
-     * Properties used to customize the behavior of a [ModalBottomSheet].
-     */
+    /** Properties used to customize the behavior of a [ModalBottomSheet]. */
     val properties: ModalBottomSheetProperties
 }
 
@@ -394,8 +383,8 @@
  * Create and [remember] a [SheetState] for [ModalBottomSheet].
  *
  * @param skipPartiallyExpanded Whether the partially expanded state, if the sheet is tall enough,
- * should be skipped. If true, the sheet will always expand to the [Expanded] state and move to the
- * [Hidden] state when hiding the sheet, either programmatically or by user interaction.
+ *   should be skipped. If true, the sheet will always expand to the [Expanded] state and move to
+ *   the [Hidden] state when hiding the sheet, either programmatically or by user interaction.
  * @param confirmValueChange Optional callback invoked to confirm or veto a pending state change.
  */
 @Composable
@@ -403,41 +392,33 @@
 fun rememberModalBottomSheetState(
     skipPartiallyExpanded: Boolean = false,
     confirmValueChange: (SheetValue) -> Boolean = { true },
-) = rememberSheetState(
-    skipPartiallyExpanded = skipPartiallyExpanded,
-    confirmValueChange = confirmValueChange,
-    initialValue = Hidden,
-)
+) =
+    rememberSheetState(
+        skipPartiallyExpanded = skipPartiallyExpanded,
+        confirmValueChange = confirmValueChange,
+        initialValue = Hidden,
+    )
 
 @Composable
-private fun Scrim(
-    color: Color,
-    onDismissRequest: () -> Unit,
-    visible: Boolean
-) {
+private fun Scrim(color: Color, onDismissRequest: () -> Unit, visible: Boolean) {
     if (color.isSpecified) {
-        val alpha by animateFloatAsState(
-            targetValue = if (visible) 1f else 0f,
-            animationSpec = TweenSpec()
-        )
+        val alpha by
+            animateFloatAsState(targetValue = if (visible) 1f else 0f, animationSpec = TweenSpec())
         val closeSheet = getString(Strings.CloseSheet)
-        val dismissSheet = if (visible) {
-            Modifier
-                .pointerInput(onDismissRequest) { detectTapGestures { onDismissRequest() } }
-                .semantics(mergeDescendants = true) {
-                    contentDescription = closeSheet
-                    onClick {
-                        onDismissRequest(); true
+        val dismissSheet =
+            if (visible) {
+                Modifier.pointerInput(onDismissRequest) { detectTapGestures { onDismissRequest() } }
+                    .semantics(mergeDescendants = true) {
+                        contentDescription = closeSheet
+                        onClick {
+                            onDismissRequest()
+                            true
+                        }
                     }
-                }
-        } else {
-            Modifier
-        }
-        Canvas(
-            Modifier
-                .fillMaxSize()
-                .then(dismissSheet)
-        ) {
+            } else {
+                Modifier
+            }
+        Canvas(Modifier.fillMaxSize().then(dismissSheet)) {
             drawRect(color = color, alpha = alpha.coerceIn(0f, 1f))
         }
     }
diff --git a/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/NavigationBar.kt b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/NavigationBar.kt
index 77404ca..0c83f55 100644
--- a/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/NavigationBar.kt
+++ b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/NavigationBar.kt
@@ -75,17 +75,20 @@
 import kotlin.math.roundToInt
 
 /**
- * <a href="https://m3.material.io/components/navigation-bar/overview" class="external" target="_blank">Material Design bottom navigation bar</a>.
+ * <a href="https://m3.material.io/components/navigation-bar/overview" class="external"
+ * target="_blank">Material Design bottom navigation bar</a>.
  *
  * Navigation bars offer a persistent and convenient way to switch between primary destinations in
  * an app.
  *
- * ![Navigation bar image](https://developer.android.com/images/reference/androidx/compose/material3/navigation-bar.png)
+ * ![Navigation bar
+ * image](https://developer.android.com/images/reference/androidx/compose/material3/navigation-bar.png)
  *
  * [NavigationBar] should contain three to five [NavigationBarItem]s, each representing a singular
  * destination.
  *
  * A simple example looks like:
+ *
  * @sample androidx.compose.material3.samples.NavigationBarSample
  *
  * See [NavigationBarItem] for configuration specific to each item, and not the overall
@@ -93,13 +96,13 @@
  *
  * @param modifier the [Modifier] to be applied to this navigation bar
  * @param containerColor the color used for the background of this navigation bar. Use
- * [Color.Transparent] to have no color.
+ *   [Color.Transparent] to have no color.
  * @param contentColor the preferred color for content inside this navigation bar. Defaults to
- * either the matching content color for [containerColor], or to the current [LocalContentColor] if
- * [containerColor] is not a color from the theme.
+ *   either the matching content color for [containerColor], or to the current [LocalContentColor]
+ *   if [containerColor] is not a color from the theme.
  * @param tonalElevation when [containerColor] is [ColorScheme.surface], a translucent primary color
- * overlay is applied on top of the container. A higher tonal elevation value will result in a
- * darker color in light theme and lighter color in dark theme. See also: [Surface].
+ *   overlay is applied on top of the container. A higher tonal elevation value will result in a
+ *   darker color in light theme and lighter color in dark theme. See also: [Surface].
  * @param windowInsets a window insets of the navigation bar.
  * @param content the content of this navigation bar, typically 3-5 [NavigationBarItem]s
  */
@@ -119,11 +122,11 @@
         modifier = modifier
     ) {
         Row(
-            modifier = Modifier
-                .fillMaxWidth()
-                .windowInsetsPadding(windowInsets)
-                .defaultMinSize(minHeight = NavigationBarHeight)
-                .selectableGroup(),
+            modifier =
+                Modifier.fillMaxWidth()
+                    .windowInsetsPadding(windowInsets)
+                    .defaultMinSize(minHeight = NavigationBarHeight)
+                    .selectableGroup(),
             horizontalArrangement = Arrangement.spacedBy(NavigationBarItemHorizontalPadding),
             verticalAlignment = Alignment.CenterVertically,
             content = content
@@ -139,32 +142,31 @@
  *
  * The recommended configuration for a [NavigationBarItem] depends on how many items there are
  * inside a [NavigationBar]:
- *
  * - Three destinations: Display icons and text labels for all destinations.
  * - Four destinations: Active destinations display an icon and text label. Inactive destinations
- * display icons, and text labels are recommended.
+ *   display icons, and text labels are recommended.
  * - Five destinations: Active destinations display an icon and text label. Inactive destinations
- * use icons, and use text labels if space permits.
+ *   use icons, and use text labels if space permits.
  *
- * A [NavigationBarItem] always shows text labels (if it exists) when selected. Showing text
- * labels if not selected is controlled by [alwaysShowLabel].
+ * A [NavigationBarItem] always shows text labels (if it exists) when selected. Showing text labels
+ * if not selected is controlled by [alwaysShowLabel].
  *
  * @param selected whether this item is selected
  * @param onClick called when this item is clicked
  * @param icon icon for this item, typically an [Icon]
  * @param modifier the [Modifier] to be applied to this item
  * @param enabled controls the enabled state of this item. When `false`, this component will not
- * respond to user input, and it will appear visually disabled and disabled to accessibility
- * services.
+ *   respond to user input, and it will appear visually disabled and disabled to accessibility
+ *   services.
  * @param label optional text label for this item
  * @param alwaysShowLabel whether to always show the label for this item. If `false`, the label will
- * only be shown when this item is selected.
+ *   only be shown when this item is selected.
  * @param colors [NavigationBarItemColors] that will be used to resolve the colors used for this
- * item in different states. See [NavigationBarItemDefaults.colors].
+ *   item in different states. See [NavigationBarItemDefaults.colors].
  * @param interactionSource an optional hoisted [MutableInteractionSource] for observing and
- * emitting [Interaction]s for this item. You can use this to change the item's appearance
- * or preview the item in different states. Note that if `null` is provided, interactions will
- * still happen internally.
+ *   emitting [Interaction]s for this item. You can use this to change the item's appearance or
+ *   preview the item in different states. Note that if `null` is provided, interactions will still
+ *   happen internally.
  */
 @Composable
 fun RowScope.NavigationBarItem(
@@ -180,32 +182,36 @@
 ) {
     @Suppress("NAME_SHADOWING")
     val interactionSource = interactionSource ?: remember { MutableInteractionSource() }
-    val styledIcon = @Composable {
-        val iconColor by animateColorAsState(
-            targetValue = colors.iconColor(selected = selected, enabled = enabled),
-            animationSpec = tween(ItemAnimationDurationMillis)
-        )
-        // If there's a label, don't have a11y services repeat the icon description.
-        val clearSemantics = label != null && (alwaysShowLabel || selected)
-        Box(modifier = if (clearSemantics) Modifier.clearAndSetSemantics {} else Modifier) {
-            CompositionLocalProvider(LocalContentColor provides iconColor, content = icon)
-        }
-    }
-
-    val styledLabel: @Composable (() -> Unit)? = label?.let {
+    val styledIcon =
         @Composable {
-            val style = NavigationBarTokens.LabelTextFont.value
-            val textColor by animateColorAsState(
-                targetValue = colors.textColor(selected = selected, enabled = enabled),
-                animationSpec = tween(ItemAnimationDurationMillis)
-            )
-            ProvideContentColorTextStyle(
-                contentColor = textColor,
-                textStyle = style,
-                content = label
-            )
+            val iconColor by
+                animateColorAsState(
+                    targetValue = colors.iconColor(selected = selected, enabled = enabled),
+                    animationSpec = tween(ItemAnimationDurationMillis)
+                )
+            // If there's a label, don't have a11y services repeat the icon description.
+            val clearSemantics = label != null && (alwaysShowLabel || selected)
+            Box(modifier = if (clearSemantics) Modifier.clearAndSetSemantics {} else Modifier) {
+                CompositionLocalProvider(LocalContentColor provides iconColor, content = icon)
+            }
         }
-    }
+
+    val styledLabel: @Composable (() -> Unit)? =
+        label?.let {
+            @Composable {
+                val style = NavigationBarTokens.LabelTextFont.value
+                val textColor by
+                    animateColorAsState(
+                        targetValue = colors.textColor(selected = selected, enabled = enabled),
+                        animationSpec = tween(ItemAnimationDurationMillis)
+                    )
+                ProvideContentColorTextStyle(
+                    contentColor = textColor,
+                    textStyle = style,
+                    content = label
+                )
+            }
+        }
 
     var itemWidth by remember { mutableIntStateOf(0) }
 
@@ -221,16 +227,15 @@
             )
             .defaultMinSize(minHeight = NavigationBarHeight)
             .weight(1f)
-            .onSizeChanged {
-                itemWidth = it.width
-            },
+            .onSizeChanged { itemWidth = it.width },
         contentAlignment = Alignment.Center,
         propagateMinConstraints = true,
     ) {
-        val animationProgress: State<Float> = animateFloatAsState(
-            targetValue = if (selected) 1f else 0f,
-            animationSpec = tween(ItemAnimationDurationMillis)
-        )
+        val animationProgress: State<Float> =
+            animateFloatAsState(
+                targetValue = if (selected) 1f else 0f,
+                animationSpec = tween(ItemAnimationDurationMillis)
+            )
 
         // The entire item is selectable, but only the indicator pill shows the ripple. To achieve
         // this, we re-map the coordinates of the item's InteractionSource into the coordinates of
@@ -238,36 +243,35 @@
         val deltaOffset: Offset
         with(LocalDensity.current) {
             val indicatorWidth = NavigationBarTokens.ActiveIndicatorWidth.roundToPx()
-            deltaOffset = Offset(
-                (itemWidth - indicatorWidth).toFloat() / 2,
-                IndicatorVerticalOffset.toPx()
-            )
+            deltaOffset =
+                Offset((itemWidth - indicatorWidth).toFloat() / 2, IndicatorVerticalOffset.toPx())
         }
-        val offsetInteractionSource = remember(interactionSource, deltaOffset) {
-            MappedInteractionSource(interactionSource, deltaOffset)
-        }
+        val offsetInteractionSource =
+            remember(interactionSource, deltaOffset) {
+                MappedInteractionSource(interactionSource, deltaOffset)
+            }
 
         // The indicator has a width-expansion animation which interferes with the timing of the
         // ripple, which is why they are separate composables
-        val indicatorRipple = @Composable {
-            Box(
-                Modifier
-                    .layoutId(IndicatorRippleLayoutIdTag)
-                    .clip(NavigationBarTokens.ActiveIndicatorShape.value)
-                    .indication(offsetInteractionSource, rippleOrFallbackImplementation())
-            )
-        }
-        val indicator = @Composable {
-            Box(
-                Modifier
-                    .layoutId(IndicatorLayoutIdTag)
-                    .graphicsLayer { alpha = animationProgress.value }
-                    .background(
-                        color = colors.indicatorColor,
-                        shape = NavigationBarTokens.ActiveIndicatorShape.value,
-                    )
-            )
-        }
+        val indicatorRipple =
+            @Composable {
+                Box(
+                    Modifier.layoutId(IndicatorRippleLayoutIdTag)
+                        .clip(NavigationBarTokens.ActiveIndicatorShape.value)
+                        .indication(offsetInteractionSource, rippleOrFallbackImplementation())
+                )
+            }
+        val indicator =
+            @Composable {
+                Box(
+                    Modifier.layoutId(IndicatorLayoutIdTag)
+                        .graphicsLayer { alpha = animationProgress.value }
+                        .background(
+                            color = colors.indicatorColor,
+                            shape = NavigationBarTokens.ActiveIndicatorShape.value,
+                        )
+                )
+            }
 
         NavigationBarItemLayout(
             indicatorRipple = indicatorRipple,
@@ -286,15 +290,16 @@
     val Elevation: Dp = ElevationTokens.Level0
 
     /** Default color for a navigation bar. */
-    val containerColor: Color @Composable get() = NavigationBarTokens.ContainerColor.value
+    val containerColor: Color
+        @Composable get() = NavigationBarTokens.ContainerColor.value
 
-    /**
-     * Default window insets to be used and consumed by navigation bar
-     */
+    /** Default window insets to be used and consumed by navigation bar */
     val windowInsets: WindowInsets
         @Composable
-        get() = WindowInsets.systemBarsForVisualComponents
-            .only(WindowInsetsSides.Horizontal + WindowInsetsSides.Bottom)
+        get() =
+            WindowInsets.systemBarsForVisualComponents.only(
+                WindowInsetsSides.Horizontal + WindowInsetsSides.Bottom
+            )
 }
 
 /** Defaults used in [NavigationBarItem]. */
@@ -304,8 +309,7 @@
      * Creates a [NavigationBarItemColors] with the provided colors according to the Material
      * specification.
      */
-    @Composable
-    fun colors() = MaterialTheme.colorScheme.defaultNavigationBarItemColors
+    @Composable fun colors() = MaterialTheme.colorScheme.defaultNavigationBarItemColors
 
     /**
      * Creates a [NavigationBarItemColors] with the provided colors according to the Material
@@ -329,31 +333,35 @@
         unselectedTextColor: Color = Color.Unspecified,
         disabledIconColor: Color = Color.Unspecified,
         disabledTextColor: Color = Color.Unspecified,
-    ): NavigationBarItemColors = MaterialTheme.colorScheme.defaultNavigationBarItemColors.copy(
-        selectedIconColor = selectedIconColor,
-        selectedTextColor = selectedTextColor,
-        selectedIndicatorColor = indicatorColor,
-        unselectedIconColor = unselectedIconColor,
-        unselectedTextColor = unselectedTextColor,
-        disabledIconColor = disabledIconColor,
-        disabledTextColor = disabledTextColor,
-    )
+    ): NavigationBarItemColors =
+        MaterialTheme.colorScheme.defaultNavigationBarItemColors.copy(
+            selectedIconColor = selectedIconColor,
+            selectedTextColor = selectedTextColor,
+            selectedIndicatorColor = indicatorColor,
+            unselectedIconColor = unselectedIconColor,
+            unselectedTextColor = unselectedTextColor,
+            disabledIconColor = disabledIconColor,
+            disabledTextColor = disabledTextColor,
+        )
 
     internal val ColorScheme.defaultNavigationBarItemColors: NavigationBarItemColors
         get() {
-            return defaultNavigationBarItemColorsCached ?: NavigationBarItemColors(
-                selectedIconColor = fromToken(NavigationBarTokens.ActiveIconColor),
-                selectedTextColor = fromToken(NavigationBarTokens.ActiveLabelTextColor),
-                selectedIndicatorColor = fromToken(NavigationBarTokens.ActiveIndicatorColor),
-                unselectedIconColor = fromToken(NavigationBarTokens.InactiveIconColor),
-                unselectedTextColor = fromToken(NavigationBarTokens.InactiveLabelTextColor),
-                disabledIconColor =
-                fromToken(NavigationBarTokens.InactiveIconColor).copy(alpha = DisabledAlpha),
-                disabledTextColor =
-                fromToken(NavigationBarTokens.InactiveLabelTextColor).copy(alpha = DisabledAlpha),
-            ).also {
-                defaultNavigationBarItemColorsCached = it
-            }
+            return defaultNavigationBarItemColorsCached
+                ?: NavigationBarItemColors(
+                        selectedIconColor = fromToken(NavigationBarTokens.ActiveIconColor),
+                        selectedTextColor = fromToken(NavigationBarTokens.ActiveLabelTextColor),
+                        selectedIndicatorColor =
+                            fromToken(NavigationBarTokens.ActiveIndicatorColor),
+                        unselectedIconColor = fromToken(NavigationBarTokens.InactiveIconColor),
+                        unselectedTextColor = fromToken(NavigationBarTokens.InactiveLabelTextColor),
+                        disabledIconColor =
+                            fromToken(NavigationBarTokens.InactiveIconColor)
+                                .copy(alpha = DisabledAlpha),
+                        disabledTextColor =
+                            fromToken(NavigationBarTokens.InactiveLabelTextColor)
+                                .copy(alpha = DisabledAlpha),
+                    )
+                    .also { defaultNavigationBarItemColorsCached = it }
         }
 
     @Deprecated(
@@ -367,22 +375,21 @@
         indicatorColor: Color = NavigationBarTokens.ActiveIndicatorColor.value,
         unselectedIconColor: Color = NavigationBarTokens.InactiveIconColor.value,
         unselectedTextColor: Color = NavigationBarTokens.InactiveLabelTextColor.value,
-    ): NavigationBarItemColors = NavigationBarItemColors(
-        selectedIconColor = selectedIconColor,
-        selectedTextColor = selectedTextColor,
-        selectedIndicatorColor = indicatorColor,
-        unselectedIconColor = unselectedIconColor,
-        unselectedTextColor = unselectedTextColor,
-        disabledIconColor = unselectedIconColor.copy(alpha = DisabledAlpha),
-        disabledTextColor = unselectedTextColor.copy(alpha = DisabledAlpha),
-    )
+    ): NavigationBarItemColors =
+        NavigationBarItemColors(
+            selectedIconColor = selectedIconColor,
+            selectedTextColor = selectedTextColor,
+            selectedIndicatorColor = indicatorColor,
+            unselectedIconColor = unselectedIconColor,
+            unselectedTextColor = unselectedTextColor,
+            disabledIconColor = unselectedIconColor.copy(alpha = DisabledAlpha),
+            disabledTextColor = unselectedTextColor.copy(alpha = DisabledAlpha),
+        )
 }
 
 /**
  * Represents the colors of the various elements of a navigation item.
  *
- * @constructor create an instance with arbitrary colors.
- *
  * @param selectedIconColor the color to use for the icon when the item is selected.
  * @param selectedTextColor the color to use for the text label when the item is selected.
  * @param selectedIndicatorColor the color to use for the indicator when the item is selected.
@@ -390,9 +397,11 @@
  * @param unselectedTextColor the color to use for the text label when the item is unselected.
  * @param disabledIconColor the color to use for the icon when the item is disabled.
  * @param disabledTextColor the color to use for the text label when the item is disabled.
-*/
+ * @constructor create an instance with arbitrary colors.
+ */
 @Immutable
-class NavigationBarItemColors constructor(
+class NavigationBarItemColors
+constructor(
     val selectedIconColor: Color,
     val selectedTextColor: Color,
     val selectedIndicatorColor: Color,
@@ -413,15 +422,16 @@
         unselectedTextColor: Color = this.unselectedTextColor,
         disabledIconColor: Color = this.disabledIconColor,
         disabledTextColor: Color = this.disabledTextColor,
-    ) = NavigationBarItemColors(
-        selectedIconColor.takeOrElse { this.selectedIconColor },
-        selectedTextColor.takeOrElse { this.selectedTextColor },
-        selectedIndicatorColor.takeOrElse { this.selectedIndicatorColor },
-        unselectedIconColor.takeOrElse { this.unselectedIconColor },
-        unselectedTextColor.takeOrElse { this.unselectedTextColor },
-        disabledIconColor.takeOrElse { this.disabledIconColor },
-        disabledTextColor.takeOrElse { this.disabledTextColor },
-    )
+    ) =
+        NavigationBarItemColors(
+            selectedIconColor.takeOrElse { this.selectedIconColor },
+            selectedTextColor.takeOrElse { this.selectedTextColor },
+            selectedIndicatorColor.takeOrElse { this.selectedIndicatorColor },
+            unselectedIconColor.takeOrElse { this.unselectedIconColor },
+            unselectedTextColor.takeOrElse { this.unselectedTextColor },
+            disabledIconColor.takeOrElse { this.disabledIconColor },
+            disabledTextColor.takeOrElse { this.disabledTextColor },
+        )
 
     /**
      * Represents the icon color for this item, depending on whether it is [selected].
@@ -430,11 +440,12 @@
      * @param enabled whether the item is enabled
      */
     @Stable
-    internal fun iconColor(selected: Boolean, enabled: Boolean): Color = when {
-        !enabled -> disabledIconColor
-        selected -> selectedIconColor
-        else -> unselectedIconColor
-    }
+    internal fun iconColor(selected: Boolean, enabled: Boolean): Color =
+        when {
+            !enabled -> disabledIconColor
+            selected -> selectedIconColor
+            else -> unselectedIconColor
+        }
 
     /**
      * Represents the text color for this item, depending on whether it is [selected].
@@ -443,11 +454,12 @@
      * @param enabled whether the item is enabled
      */
     @Stable
-    internal fun textColor(selected: Boolean, enabled: Boolean): Color = when {
-        !enabled -> disabledTextColor
-        selected -> selectedTextColor
-        else -> unselectedTextColor
-    }
+    internal fun textColor(selected: Boolean, enabled: Boolean): Color =
+        when {
+            !enabled -> disabledTextColor
+            selected -> selectedTextColor
+            else -> unselectedTextColor
+        }
 
     /** Represents the color of the indicator used for selected items. */
     internal val indicatorColor: Color
@@ -467,6 +479,7 @@
 
         return true
     }
+
     override fun hashCode(): Int {
         var result = selectedIconColor.hashCode()
         result = 31 * result + unselectedIconColor.hashCode()
@@ -488,10 +501,10 @@
  * @param icon icon for this item
  * @param label text label for this item
  * @param alwaysShowLabel whether to always show the label for this item. If false, the label will
- * only be shown when this item is selected.
+ *   only be shown when this item is selected.
  * @param animationProgress progress of the animation, where 0 represents the unselected state of
- * this item and 1 represents the selected state. This value controls other values such as indicator
- * size, icon and label positions, etc.
+ *   this item and 1 represents the selected state. This value controls other values such as
+ *   indicator size, icon and label positions, etc.
  */
 @Composable
 private fun NavigationBarItemLayout(
@@ -510,15 +523,15 @@
 
         if (label != null) {
             Box(
-                Modifier
-                    .layoutId(LabelLayoutIdTag)
+                Modifier.layoutId(LabelLayoutIdTag)
                     .graphicsLayer { alpha = if (alwaysShowLabel) 1f else animationProgress() }
                     .padding(horizontal = NavigationBarItemHorizontalPadding / 2)
-            ) { label() }
+            ) {
+                label()
+            }
         }
     }) { measurables, constraints ->
-        @Suppress("NAME_SHADOWING")
-        val animationProgress = animationProgress()
+        @Suppress("NAME_SHADOWING") val animationProgress = animationProgress()
         val looseConstraints = constraints.copy(minWidth = 0, minHeight = 0)
         val iconPlaceable =
             measurables.fastFirst { it.layoutId == IconLayoutIdTag }.measure(looseConstraints)
@@ -529,27 +542,17 @@
         val indicatorRipplePlaceable =
             measurables
                 .fastFirst { it.layoutId == IndicatorRippleLayoutIdTag }
-                .measure(
-                    Constraints.fixed(
-                        width = totalIndicatorWidth,
-                        height = indicatorHeight
-                    )
-                )
+                .measure(Constraints.fixed(width = totalIndicatorWidth, height = indicatorHeight))
         val indicatorPlaceable =
             measurables
                 .fastFirstOrNull { it.layoutId == IndicatorLayoutIdTag }
                 ?.measure(
-                    Constraints.fixed(
-                        width = animatedIndicatorWidth,
-                        height = indicatorHeight
-                    )
+                    Constraints.fixed(width = animatedIndicatorWidth, height = indicatorHeight)
                 )
 
         val labelPlaceable =
             label?.let {
-                measurables
-                    .fastFirst { it.layoutId == LabelLayoutIdTag }
-                    .measure(looseConstraints)
+                measurables.fastFirst { it.layoutId == LabelLayoutIdTag }.measure(looseConstraints)
             }
 
         if (label == null) {
@@ -568,9 +571,7 @@
     }
 }
 
-/**
- * Places the provided [Placeable]s in the center of the provided [constraints].
- */
+/** Places the provided [Placeable]s in the center of the provided [constraints]. */
 private fun MeasureScope.placeIcon(
     iconPlaceable: Placeable,
     indicatorRipplePlaceable: Placeable,
@@ -623,11 +624,11 @@
  * @param indicatorPlaceable indicator placeable inside this item, if it exists
  * @param constraints constraints of the item
  * @param alwaysShowLabel whether to always show the label for this item. If true, icon and label
- * positions will not change. If false, positions transition between 'centered icon with no label'
- * and 'top aligned icon with label'.
+ *   positions will not change. If false, positions transition between 'centered icon with no label'
+ *   and 'top aligned icon with label'.
  * @param animationProgress progress of the animation, where 0 represents the unselected state of
- * this item and 1 represents the selected state. Values between 0 and 1 interpolate positions of
- * the icon and label.
+ *   this item and 1 represents the selected state. Values between 0 and 1 interpolate positions of
+ *   the icon and label.
  */
 private fun MeasureScope.placeLabelAndIcon(
     labelPlaceable: Placeable,
@@ -638,10 +639,13 @@
     alwaysShowLabel: Boolean,
     animationProgress: Float,
 ): MeasureResult {
-    val contentHeight = iconPlaceable.height + IndicatorVerticalPadding.toPx() +
-        NavigationBarIndicatorToLabelPadding.toPx() + labelPlaceable.height
-    val contentVerticalPadding = ((constraints.minHeight - contentHeight) / 2)
-        .coerceAtLeast(IndicatorVerticalPadding.toPx())
+    val contentHeight =
+        iconPlaceable.height +
+            IndicatorVerticalPadding.toPx() +
+            NavigationBarIndicatorToLabelPadding.toPx() +
+            labelPlaceable.height
+    val contentVerticalPadding =
+        ((constraints.minHeight - contentHeight) / 2).coerceAtLeast(IndicatorVerticalPadding.toPx())
     val height = contentHeight + contentVerticalPadding * 2
 
     // Icon (when selected) should be `contentVerticalPadding` from top
@@ -657,8 +661,11 @@
     val offset = iconDistance * (1 - animationProgress)
 
     // Label should be fixed padding below icon
-    val labelY = selectedIconY + iconPlaceable.height + IndicatorVerticalPadding.toPx() +
-        NavigationBarIndicatorToLabelPadding.toPx()
+    val labelY =
+        selectedIconY +
+            iconPlaceable.height +
+            IndicatorVerticalPadding.toPx() +
+            NavigationBarIndicatorToLabelPadding.toPx()
 
     val containerWidth = constraints.maxWidth
 
diff --git a/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/NavigationDrawer.kt b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/NavigationDrawer.kt
index c8cf3d7..5dfbe49 100644
--- a/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/NavigationDrawer.kt
+++ b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/NavigationDrawer.kt
@@ -98,18 +98,12 @@
 import kotlinx.coroutines.CancellationException
 import kotlinx.coroutines.launch
 
-/**
- * Possible values of [DrawerState].
- */
+/** Possible values of [DrawerState]. */
 enum class DrawerValue {
-    /**
-     * The state of the drawer when it is closed.
-     */
+    /** The state of the drawer when it is closed. */
     Closed,
 
-    /**
-     * The state of the drawer when it is open.
-     */
+    /** The state of the drawer when it is open. */
     Open
 }
 
@@ -126,41 +120,36 @@
     confirmStateChange: (DrawerValue) -> Boolean = { true }
 ) {
 
-    internal val anchoredDraggableState = AnchoredDraggableState(
-        initialValue = initialValue,
-        animationSpec = AnimationSpec,
-        confirmValueChange = confirmStateChange,
-        positionalThreshold = { distance -> distance * DrawerPositionalThreshold },
-        velocityThreshold = { with(requireDensity()) { DrawerVelocityThreshold.toPx() } }
-    )
+    internal val anchoredDraggableState =
+        AnchoredDraggableState(
+            initialValue = initialValue,
+            animationSpec = AnimationSpec,
+            confirmValueChange = confirmStateChange,
+            positionalThreshold = { distance -> distance * DrawerPositionalThreshold },
+            velocityThreshold = { with(requireDensity()) { DrawerVelocityThreshold.toPx() } }
+        )
 
-    /**
-     * Whether the drawer is open.
-     */
+    /** Whether the drawer is open. */
     val isOpen: Boolean
         get() = currentValue == DrawerValue.Open
 
-    /**
-     * Whether the drawer is closed.
-     */
+    /** Whether the drawer is closed. */
     val isClosed: Boolean
         get() = currentValue == DrawerValue.Closed
 
     /**
      * The current value of the state.
      *
-     * If no swipe or animation is in progress, this corresponds to the start the drawer
-     * currently in. If a swipe or an animation is in progress, this corresponds the state drawer
-     * was in before the swipe or animation started.
+     * If no swipe or animation is in progress, this corresponds to the start the drawer currently
+     * in. If a swipe or an animation is in progress, this corresponds the state drawer was in
+     * before the swipe or animation started.
      */
     val currentValue: DrawerValue
         get() {
             return anchoredDraggableState.currentValue
         }
 
-    /**
-     * Whether the state is currently animating.
-     */
+    /** Whether the state is currently animating. */
     val isAnimationRunning: Boolean
         get() {
             return anchoredDraggableState.isAnimationRunning
@@ -168,8 +157,7 @@
 
     /**
      * Open the drawer with animation and suspend until it if fully opened or animation has been
-     * cancelled. This method will throw [CancellationException] if the animation is
-     * interrupted
+     * cancelled. This method will throw [CancellationException] if the animation is interrupted
      *
      * @return the reason the open animation ended
      */
@@ -177,8 +165,7 @@
 
     /**
      * Close the drawer with animation and suspend until it if fully closed or animation has been
-     * cancelled. This method will throw [CancellationException] if the animation is
-     * interrupted
+     * cancelled. This method will throw [CancellationException] if the animation is interrupted
      *
      * @return the reason the close animation ended
      */
@@ -191,8 +178,9 @@
      * @param anim The animation that will be used to animate to the new value.
      */
     @Deprecated(
-        message = "This method has been replaced by the open and close methods. The animation " +
-            "spec is now an implementation detail of ModalDrawer.",
+        message =
+            "This method has been replaced by the open and close methods. The animation " +
+                "spec is now an implementation detail of ModalDrawer.",
     )
     suspend fun animateTo(targetValue: DrawerValue, anim: AnimationSpec<Float>) {
         animateTo(targetValue = targetValue, animationSpec = anim)
@@ -210,9 +198,9 @@
     /**
      * The target value of the drawer state.
      *
-     * If a swipe is in progress, this is the value that the Drawer would animate to if the
-     * swipe finishes. If an animation is running, this is the target value of that animation.
-     * Finally, if no swipe or animation is in progress, this is the same as the [currentValue].
+     * If a swipe is in progress, this is the value that the Drawer would animate to if the swipe
+     * finishes. If an animation is running, this is the target value of that animation. Finally, if
+     * no swipe or animation is in progress, this is the same as the [currentValue].
      */
     val targetValue: DrawerValue
         get() = anchoredDraggableState.targetValue
@@ -224,13 +212,16 @@
      * @see [AnchoredDraggableState.offset] for more information.
      */
     @Deprecated(
-        message = "Please access the offset through currentOffset, which returns the value " +
-            "directly instead of wrapping it in a state object.",
+        message =
+            "Please access the offset through currentOffset, which returns the value " +
+                "directly instead of wrapping it in a state object.",
         replaceWith = ReplaceWith("currentOffset")
     )
-    val offset: State<Float> = object : State<Float> {
-        override val value: Float get() = anchoredDraggableState.offset
-    }
+    val offset: State<Float> =
+        object : State<Float> {
+            override val value: Float
+                get() = anchoredDraggableState.offset
+        }
 
     /**
      * The current position (in pixels) of the drawer sheet, or Float.NaN before the offset is
@@ -238,14 +229,16 @@
      *
      * @see [AnchoredDraggableState.offset] for more information.
      */
-    val currentOffset: Float get() = anchoredDraggableState.offset
+    val currentOffset: Float
+        get() = anchoredDraggableState.offset
 
     internal var density: Density? by mutableStateOf(null)
 
-    private fun requireDensity() = requireNotNull(density) {
-        "The density on DrawerState ($this) was not set. Did you use DrawerState" +
-            " with the ModalNavigationDrawer or DismissibleNavigationDrawer composables?"
-    }
+    private fun requireDensity() =
+        requireNotNull(density) {
+            "The density on DrawerState ($this) was not set. Did you use DrawerState" +
+                " with the ModalNavigationDrawer or DismissibleNavigationDrawer composables?"
+        }
 
     internal fun requireOffset(): Float = anchoredDraggableState.requireOffset()
 
@@ -271,9 +264,7 @@
     }
 
     companion object {
-        /**
-         * The default [Saver] implementation for [DrawerState].
-         */
+        /** The default [Saver] implementation for [DrawerState]. */
         fun Saver(confirmStateChange: (DrawerValue) -> Boolean) =
             Saver<DrawerState, DrawerValue>(
                 save = { it.currentValue },
@@ -299,14 +290,16 @@
 }
 
 /**
- * <a href="https://m3.material.io/components/navigation-drawer/overview" class="external" target="_blank">Material Design navigation drawer</a>.
+ * <a href="https://m3.material.io/components/navigation-drawer/overview" class="external"
+ * target="_blank">Material Design navigation drawer</a>.
  *
  * Navigation drawers provide ergonomic access to destinations in an app.
  *
- * Modal navigation drawers block interaction with the rest of an app’s content with a scrim.
- * They are elevated above most of the app’s UI and don’t affect the screen’s layout grid.
+ * Modal navigation drawers block interaction with the rest of an app’s content with a scrim. They
+ * are elevated above most of the app’s UI and don’t affect the screen’s layout grid.
  *
- * ![Navigation drawer image](https://developer.android.com/images/reference/androidx/compose/material3/navigation-drawer.png)
+ * ![Navigation drawer
+ * image](https://developer.android.com/images/reference/androidx/compose/material3/navigation-drawer.png)
  *
  * @sample androidx.compose.material3.samples.ModalNavigationDrawerSample
  *
@@ -333,9 +326,7 @@
     var minValue by remember(density) { mutableFloatStateOf(0f) }
     val maxValue = 0f
 
-    SideEffect {
-        drawerState.density = density
-    }
+    SideEffect { drawerState.density = density }
 
     val isRtl = LocalLayoutDirection.current == LayoutDirection.Rtl
     Box(
@@ -348,45 +339,44 @@
                 reverseDirection = isRtl
             )
     ) {
-        Box {
-            content()
-        }
+        Box { content() }
         Scrim(
             open = drawerState.isOpen,
             onClose = {
                 if (
                     gesturesEnabled &&
-                    drawerState.anchoredDraggableState.confirmValueChange(DrawerValue.Closed)
+                        drawerState.anchoredDraggableState.confirmValueChange(DrawerValue.Closed)
                 ) {
                     scope.launch { drawerState.close() }
                 }
             },
-            fraction = {
-                calculateFraction(minValue, maxValue, drawerState.requireOffset())
-            },
+            fraction = { calculateFraction(minValue, maxValue, drawerState.requireOffset()) },
             color = scrimColor
         )
         Layout(
             content = drawerContent,
-            modifier = Modifier
-                .offset {
-                    drawerState.currentOffset.let { offset ->
-                        if (offset.isNaN()) IntOffset.Zero else IntOffset(offset.roundToInt(), 0)
-                    }
-                }
-                .semantics {
-                    paneTitle = navigationMenu
-                    if (drawerState.isOpen) {
-                        dismiss {
-                            if (drawerState.anchoredDraggableState.confirmValueChange(
-                                    DrawerValue.Closed
-                                )
-                            ) {
-                                scope.launch { drawerState.close() }
-                            }; true
+            modifier =
+                Modifier.offset {
+                        drawerState.currentOffset.let { offset ->
+                            if (offset.isNaN()) IntOffset.Zero
+                            else IntOffset(offset.roundToInt(), 0)
                         }
                     }
-                },
+                    .semantics {
+                        paneTitle = navigationMenu
+                        if (drawerState.isOpen) {
+                            dismiss {
+                                if (
+                                    drawerState.anchoredDraggableState.confirmValueChange(
+                                        DrawerValue.Closed
+                                    )
+                                ) {
+                                    scope.launch { drawerState.close() }
+                                }
+                                true
+                            }
+                        }
+                    },
         ) { measurables, constraints ->
             val looseConstraints = constraints.copy(minWidth = 0, minHeight = 0)
             val placeables = measurables.fastMap { it.measure(looseConstraints) }
@@ -410,25 +400,25 @@
                         }
                     )
                 }
-                placeables.fastForEach {
-                    it.placeRelative(0, 0)
-                }
+                placeables.fastForEach { it.placeRelative(0, 0) }
             }
         }
     }
 }
 
 /**
- * <a href="https://m3.material.io/components/navigation-drawer/overview" class="external" target="_blank">Material Design navigation drawer</a>.
+ * <a href="https://m3.material.io/components/navigation-drawer/overview" class="external"
+ * target="_blank">Material Design navigation drawer</a>.
  *
- * Navigation drawers provide ergonomic access to destinations in an app. They’re often next to
- * app content and affect the screen’s layout grid.
+ * Navigation drawers provide ergonomic access to destinations in an app. They’re often next to app
+ * content and affect the screen’s layout grid.
  *
- * ![Navigation drawer image](https://developer.android.com/images/reference/androidx/compose/material3/navigation-drawer.png)
+ * ![Navigation drawer
+ * image](https://developer.android.com/images/reference/androidx/compose/material3/navigation-drawer.png)
  *
- * Dismissible standard drawers can be used for layouts that prioritize content (such as a
- * photo gallery) or for apps where users are unlikely to switch destinations often. They should
- * use a visible navigation menu icon to open and close the drawer.
+ * Dismissible standard drawers can be used for layouts that prioritize content (such as a photo
+ * gallery) or for apps where users are unlikely to switch destinations often. They should use a
+ * visible navigation menu icon to open and close the drawer.
  *
  * @sample androidx.compose.material3.samples.DismissibleNavigationDrawerSample
  *
@@ -448,46 +438,44 @@
 ) {
     var anchorsInitialized by remember { mutableStateOf(false) }
     val density = LocalDensity.current
-    SideEffect {
-        drawerState.density = density
-    }
+    SideEffect { drawerState.density = density }
 
     val scope = rememberCoroutineScope()
     val navigationMenu = getString(Strings.NavigationMenu)
 
     val isRtl = LocalLayoutDirection.current == LayoutDirection.Rtl
     Box(
-        modifier
-            .anchoredDraggable(
-                state = drawerState.anchoredDraggableState,
-                orientation = Orientation.Horizontal,
-                enabled = gesturesEnabled,
-                reverseDirection = isRtl
-            )
+        modifier.anchoredDraggable(
+            state = drawerState.anchoredDraggableState,
+            orientation = Orientation.Horizontal,
+            enabled = gesturesEnabled,
+            reverseDirection = isRtl
+        )
     ) {
-        Layout(content = {
-            Box(
-                Modifier
-                    .semantics {
+        Layout(
+            content = {
+                Box(
+                    Modifier.semantics {
                         paneTitle = navigationMenu
                         if (drawerState.isOpen) {
                             dismiss {
-                                if (drawerState.anchoredDraggableState.confirmValueChange(
+                                if (
+                                    drawerState.anchoredDraggableState.confirmValueChange(
                                         DrawerValue.Closed
                                     )
                                 ) {
                                     scope.launch { drawerState.close() }
-                                }; true
+                                }
+                                true
                             }
                         }
                     }
-            ) {
-                drawerContent()
+                ) {
+                    drawerContent()
+                }
+                Box { content() }
             }
-            Box {
-                content()
-            }
-        }) { measurables, constraints ->
+        ) { measurables, constraints ->
             val sheetPlaceable = measurables[0].measure(constraints)
             val contentPlaceable = measurables[1].measure(constraints)
             layout(contentPlaceable.width, contentPlaceable.height) {
@@ -518,12 +506,14 @@
 }
 
 /**
- * <a href="https://m3.material.io/components/navigation-drawer/overview" class="external" target="_blank">Material Design navigation permanent drawer</a>.
+ * <a href="https://m3.material.io/components/navigation-drawer/overview" class="external"
+ * target="_blank">Material Design navigation permanent drawer</a>.
  *
  * Navigation drawers provide ergonomic access to destinations in an app. They’re often next to app
  * content and affect the screen’s layout grid.
  *
- * ![Navigation drawer image](https://developer.android.com/images/reference/androidx/compose/material3/navigation-drawer.png)
+ * ![Navigation drawer
+ * image](https://developer.android.com/images/reference/androidx/compose/material3/navigation-drawer.png)
  *
  * The permanent navigation drawer is always visible and usually used for frequently switching
  * destinations. On mobile screens, use [ModalNavigationDrawer] instead.
@@ -542,15 +532,13 @@
 ) {
     Row(modifier.fillMaxSize()) {
         drawerContent()
-        Box {
-            content()
-        }
+        Box { content() }
     }
 }
 
 /**
  * Content inside of a modal navigation drawer.
-
+ *
  * Note: This version of [ModalDrawerSheet] does not handle back by default. For automatic back
  * handling and predictive back animations on Android 14+, use the [ModalDrawerSheet] that accepts
  * `drawerState` as a param.
@@ -558,13 +546,13 @@
  * @param modifier the [Modifier] to be applied to this drawer's content
  * @param drawerShape defines the shape of this drawer's container
  * @param drawerContainerColor the color used for the background of this drawer. Use
- * [Color.Transparent] to have no color.
+ *   [Color.Transparent] to have no color.
  * @param drawerContentColor the preferred color for content inside this drawer. Defaults to either
- * the matching content color for [drawerContainerColor], or to the current [LocalContentColor] if
- * [drawerContainerColor] is not a color from the theme.
+ *   the matching content color for [drawerContainerColor], or to the current [LocalContentColor] if
+ *   [drawerContainerColor] is not a color from the theme.
  * @param drawerTonalElevation when [drawerContainerColor] is [ColorScheme.surface], a translucent
- * primary color overlay is applied on top of the container. A higher tonal elevation value will
- * result in a darker color in light theme and lighter color in dark theme. See also: [Surface].
+ *   primary color overlay is applied on top of the container. A higher tonal elevation value will
+ *   result in a darker color in light theme and lighter color in dark theme. See also: [Surface].
  * @param windowInsets a window insets for the sheet.
  * @param content content inside of a modal navigation drawer
  */
@@ -601,13 +589,13 @@
  * @param modifier the [Modifier] to be applied to this drawer's content
  * @param drawerShape defines the shape of this drawer's container
  * @param drawerContainerColor the color used for the background of this drawer. Use
- * [Color.Transparent] to have no color.
+ *   [Color.Transparent] to have no color.
  * @param drawerContentColor the preferred color for content inside this drawer. Defaults to either
- * the matching content color for [drawerContainerColor], or to the current [LocalContentColor] if
- * [drawerContainerColor] is not a color from the theme.
+ *   the matching content color for [drawerContainerColor], or to the current [LocalContentColor] if
+ *   [drawerContainerColor] is not a color from the theme.
  * @param drawerTonalElevation when [drawerContainerColor] is [ColorScheme.surface], a translucent
- * primary color overlay is applied on top of the container. A higher tonal elevation value will
- * result in a darker color in light theme and lighter color in dark theme. See also: [Surface].
+ *   primary color overlay is applied on top of the container. A higher tonal elevation value will
+ *   result in a darker color in light theme and lighter color in dark theme. See also: [Surface].
  * @param windowInsets a window insets for the sheet.
  * @param content content inside of a modal navigation drawer
  */
@@ -646,13 +634,13 @@
  * @param modifier the [Modifier] to be applied to this drawer's content
  * @param drawerShape defines the shape of this drawer's container
  * @param drawerContainerColor the color used for the background of this drawer. Use
- * [Color.Transparent] to have no color.
+ *   [Color.Transparent] to have no color.
  * @param drawerContentColor the preferred color for content inside this drawer. Defaults to either
- * the matching content color for [drawerContainerColor], or to the current [LocalContentColor] if
- * [drawerContainerColor] is not a color from the theme.
+ *   the matching content color for [drawerContainerColor], or to the current [LocalContentColor] if
+ *   [drawerContainerColor] is not a color from the theme.
  * @param drawerTonalElevation when [drawerContainerColor] is [ColorScheme.surface], a translucent
- * primary color overlay is applied on top of the container. A higher tonal elevation value will
- * result in a darker color in light theme and lighter color in dark theme. See also: [Surface].
+ *   primary color overlay is applied on top of the container. A higher tonal elevation value will
+ *   result in a darker color in light theme and lighter color in dark theme. See also: [Surface].
  * @param windowInsets a window insets for the sheet.
  * @param content content inside of a dismissible navigation drawer
  */
@@ -680,7 +668,7 @@
 
 /**
  * Content inside of a dismissible navigation drawer.
-
+ *
  * Note: This version of [DismissibleDrawerSheet] requires a [drawerState] to be provided and will
  * handle back by default for all Android versions, as well as animate during predictive back on
  * Android 14+.
@@ -689,13 +677,13 @@
  * @param modifier the [Modifier] to be applied to this drawer's content
  * @param drawerShape defines the shape of this drawer's container
  * @param drawerContainerColor the color used for the background of this drawer. Use
- * [Color.Transparent] to have no color.
+ *   [Color.Transparent] to have no color.
  * @param drawerContentColor the preferred color for content inside this drawer. Defaults to either
- * the matching content color for [drawerContainerColor], or to the current [LocalContentColor] if
- * [drawerContainerColor] is not a color from the theme.
+ *   the matching content color for [drawerContainerColor], or to the current [LocalContentColor] if
+ *   [drawerContainerColor] is not a color from the theme.
  * @param drawerTonalElevation when [drawerContainerColor] is [ColorScheme.surface], a translucent
- * primary color overlay is applied on top of the container. A higher tonal elevation value will
- * result in a darker color in light theme and lighter color in dark theme. See also: [Surface].
+ *   primary color overlay is applied on top of the container. A higher tonal elevation value will
+ *   result in a darker color in light theme and lighter color in dark theme. See also: [Surface].
  * @param windowInsets a window insets for the sheet.
  * @param content content inside of a dismissible navigation drawer
  */
@@ -730,13 +718,13 @@
  * @param modifier the [Modifier] to be applied to this drawer's content
  * @param drawerShape defines the shape of this drawer's container
  * @param drawerContainerColor the color used for the background of this drawer. Use
- * [Color.Transparent] to have no color.
+ *   [Color.Transparent] to have no color.
  * @param drawerContentColor the preferred color for content inside this drawer. Defaults to either
- * the matching content color for [drawerContainerColor], or to the current [LocalContentColor] if
- * [drawerContainerColor] is not a color from the theme.
+ *   the matching content color for [drawerContainerColor], or to the current [LocalContentColor] if
+ *   [drawerContainerColor] is not a color from the theme.
  * @param drawerTonalElevation when [drawerContainerColor] is [ColorScheme.surface], a translucent
- * primary color overlay is applied on top of the container. A higher tonal elevation value will
- * result in a darker color in light theme and lighter color in dark theme. See also: [Surface].
+ *   primary color overlay is applied on top of the container. A higher tonal elevation value will
+ *   result in a darker color in light theme and lighter color in dark theme. See also: [Surface].
  * @param windowInsets a window insets for the sheet.
  * @param content content inside a permanent navigation drawer
  */
@@ -754,9 +742,7 @@
     DrawerSheet(
         drawerPredictiveBackState = null,
         windowInsets,
-        modifier.semantics {
-            paneTitle = navigationMenu
-        },
+        modifier.semantics { paneTitle = navigationMenu },
         drawerShape,
         drawerContainerColor,
         drawerContentColor,
@@ -778,31 +764,26 @@
 ) {
     val isRtl = LocalLayoutDirection.current == LayoutDirection.Rtl
     val predictiveBackDrawerContainerModifier =
-        if (drawerPredictiveBackState != null) Modifier.predictiveBackDrawerContainer(
-            drawerPredictiveBackState,
-            isRtl
-        ) else Modifier
+        if (drawerPredictiveBackState != null)
+            Modifier.predictiveBackDrawerContainer(drawerPredictiveBackState, isRtl)
+        else Modifier
     Surface(
-        modifier = modifier
-            .sizeIn(
-                minWidth = MinimumDrawerWidth,
-                maxWidth = DrawerDefaults.MaximumDrawerWidth
-            )
-            .then(predictiveBackDrawerContainerModifier)
-            .fillMaxHeight(),
+        modifier =
+            modifier
+                .sizeIn(minWidth = MinimumDrawerWidth, maxWidth = DrawerDefaults.MaximumDrawerWidth)
+                .then(predictiveBackDrawerContainerModifier)
+                .fillMaxHeight(),
         shape = drawerShape,
         color = drawerContainerColor,
         contentColor = drawerContentColor,
         tonalElevation = drawerTonalElevation
     ) {
         val predictiveBackDrawerChildModifier =
-            if (drawerPredictiveBackState != null) Modifier.predictiveBackDrawerChild(
-                drawerPredictiveBackState,
-                isRtl
-            ) else Modifier
+            if (drawerPredictiveBackState != null)
+                Modifier.predictiveBackDrawerChild(drawerPredictiveBackState, isRtl)
+            else Modifier
         Column(
-            Modifier
-                .sizeIn(
+            Modifier.sizeIn(
                     minWidth = MinimumDrawerWidth,
                     maxWidth = DrawerDefaults.MaximumDrawerWidth
                 )
@@ -863,27 +844,20 @@
     content: @Composable (DrawerPredictiveBackState) -> Unit
 )
 
-/**
- * Object to hold default values for [ModalNavigationDrawer]
- */
+/** Object to hold default values for [ModalNavigationDrawer] */
 object DrawerDefaults {
-    /**
-     * Default Elevation for drawer container in the [ModalNavigationDrawer].
-     */
+    /** Default Elevation for drawer container in the [ModalNavigationDrawer]. */
     val ModalDrawerElevation = ElevationTokens.Level0
 
-    /**
-     * Default Elevation for drawer container in the [PermanentNavigationDrawer].
-     */
+    /** Default Elevation for drawer container in the [PermanentNavigationDrawer]. */
     val PermanentDrawerElevation = NavigationDrawerTokens.StandardContainerElevation
 
-    /**
-     * Default Elevation for drawer container in the [DismissibleNavigationDrawer].
-     */
+    /** Default Elevation for drawer container in the [DismissibleNavigationDrawer]. */
     val DismissibleDrawerElevation = NavigationDrawerTokens.StandardContainerElevation
 
     /** Default shape for a navigation drawer. */
-    val shape: Shape @Composable get() = NavigationDrawerTokens.ContainerShape.value
+    val shape: Shape
+        @Composable get() = NavigationDrawerTokens.ContainerShape.value
 
     /** Default color of the scrim that obscures content when the drawer is open */
     val scrimColor: Color
@@ -895,29 +869,29 @@
         replaceWith = ReplaceWith("standardContainerColor"),
         level = DeprecationLevel.WARNING,
     )
-    val containerColor: Color @Composable get() =
-        NavigationDrawerTokens.StandardContainerColor.value
+    val containerColor: Color
+        @Composable get() = NavigationDrawerTokens.StandardContainerColor.value
 
     /**
      * Default container color for a [DismissibleNavigationDrawer] and [PermanentNavigationDrawer]
      */
-    val standardContainerColor: Color @Composable get() =
-        NavigationDrawerTokens.StandardContainerColor.value
+    val standardContainerColor: Color
+        @Composable get() = NavigationDrawerTokens.StandardContainerColor.value
 
     /** Default container color for a [ModalNavigationDrawer] */
-    val modalContainerColor: Color @Composable get() =
-        NavigationDrawerTokens.ModalContainerColor.value
+    val modalContainerColor: Color
+        @Composable get() = NavigationDrawerTokens.ModalContainerColor.value
 
     /** Default and maximum width of a navigation drawer */
     val MaximumDrawerWidth = NavigationDrawerTokens.ContainerWidth
 
-    /**
-     * Default window insets for drawer sheets
-     */
+    /** Default window insets for drawer sheets */
     val windowInsets: WindowInsets
         @Composable
-        get() = WindowInsets.systemBarsForVisualComponents
-            .only(WindowInsetsSides.Vertical + WindowInsetsSides.Start)
+        get() =
+            WindowInsets.systemBarsForVisualComponents.only(
+                WindowInsetsSides.Vertical + WindowInsetsSides.Start
+            )
 }
 
 /**
@@ -935,11 +909,11 @@
  * @param icon optional icon for this item, typically an [Icon]
  * @param badge optional badge to show on this item from the end side
  * @param colors [NavigationDrawerItemColors] that will be used to resolve the colors used for this
- * item in different states. See [NavigationDrawerItemDefaults.colors].
+ *   item in different states. See [NavigationDrawerItemDefaults.colors].
  * @param interactionSource an optional hoisted [MutableInteractionSource] for observing and
- * emitting [Interaction]s for this item. You can use this to change the item's appearance
- * or preview the item in different states. Note that if `null` is provided, interactions will
- * still happen internally.
+ *   emitting [Interaction]s for this item. You can use this to change the item's appearance or
+ *   preview the item in different states. Note that if `null` is provided, interactions will still
+ *   happen internally.
  */
 @Composable
 fun NavigationDrawerItem(
@@ -956,10 +930,11 @@
     Surface(
         selected = selected,
         onClick = onClick,
-        modifier = modifier
-            .semantics { role = Role.Tab }
-            .heightIn(min = NavigationDrawerTokens.ActiveIndicatorHeight)
-            .fillMaxWidth(),
+        modifier =
+            modifier
+                .semantics { role = Role.Tab }
+                .heightIn(min = NavigationDrawerTokens.ActiveIndicatorHeight)
+                .fillMaxWidth(),
         shape = shape,
         color = colors.containerColor(selected).value,
         interactionSource = interactionSource,
@@ -994,32 +969,28 @@
      *
      * @param selected whether the item is selected
      */
-    @Composable
-    fun iconColor(selected: Boolean): State<Color>
+    @Composable fun iconColor(selected: Boolean): State<Color>
 
     /**
      * Represents the text color for this item, depending on whether it is [selected].
      *
      * @param selected whether the item is selected
      */
-    @Composable
-    fun textColor(selected: Boolean): State<Color>
+    @Composable fun textColor(selected: Boolean): State<Color>
 
     /**
      * Represents the badge color for this item, depending on whether it is [selected].
      *
      * @param selected whether the item is selected
      */
-    @Composable
-    fun badgeColor(selected: Boolean): State<Color>
+    @Composable fun badgeColor(selected: Boolean): State<Color>
 
     /**
      * Represents the container color for this item, depending on whether it is [selected].
      *
      * @param selected whether the item is selected
      */
-    @Composable
-    fun containerColor(selected: Boolean): State<Color>
+    @Composable fun containerColor(selected: Boolean): State<Color>
 }
 
 /** Defaults used in [NavigationDrawerItem]. */
@@ -1030,14 +1001,13 @@
      *
      * @param selectedContainerColor the color to use for the background of the item when selected
      * @param unselectedContainerColor the color to use for the background of the item when
-     * unselected
+     *   unselected
      * @param selectedIconColor the color to use for the icon when the item is selected.
      * @param unselectedIconColor the color to use for the icon when the item is unselected.
      * @param selectedTextColor the color to use for the text label when the item is selected.
      * @param unselectedTextColor the color to use for the text label when the item is unselected.
      * @param selectedBadgeColor the color to use for the badge when the item is selected.
      * @param unselectedBadgeColor the color to use for the badge when the item is unselected.
-     *
      * @return the resulting [NavigationDrawerItemColors] used for [NavigationDrawerItem]
      */
     @Composable
@@ -1050,16 +1020,17 @@
         unselectedTextColor: Color = NavigationDrawerTokens.InactiveLabelTextColor.value,
         selectedBadgeColor: Color = selectedTextColor,
         unselectedBadgeColor: Color = unselectedTextColor,
-    ): NavigationDrawerItemColors = DefaultDrawerItemsColor(
-        selectedIconColor,
-        unselectedIconColor,
-        selectedTextColor,
-        unselectedTextColor,
-        selectedContainerColor,
-        unselectedContainerColor,
-        selectedBadgeColor,
-        unselectedBadgeColor
-    )
+    ): NavigationDrawerItemColors =
+        DefaultDrawerItemsColor(
+            selectedIconColor,
+            unselectedIconColor,
+            selectedTextColor,
+            unselectedTextColor,
+            selectedContainerColor,
+            unselectedContainerColor,
+            selectedBadgeColor,
+            unselectedBadgeColor
+        )
 
     /**
      * Default external padding for a [NavigationDrawerItem] according to the Material
@@ -1091,6 +1062,7 @@
         scaleXDistance = lerp(0f, maxScaleXDistance, progress)
         scaleYDistance = lerp(0f, maxScaleYDistance, progress)
     }
+
     fun clear() {
         swipeEdgeMatchesDrawer = true
         scaleXDistance = 0f
@@ -1127,9 +1099,7 @@
 
     @Composable
     override fun badgeColor(selected: Boolean): State<Color> {
-        return rememberUpdatedState(
-            if (selected) selectedBadgeColor else unselectedBadgeColor
-        )
+        return rememberUpdatedState(if (selected) selectedBadgeColor else unselectedBadgeColor)
     }
 
     override fun equals(other: Any?): Boolean {
@@ -1163,31 +1133,23 @@
     ((pos - a) / (b - a)).coerceIn(0f, 1f)
 
 @Composable
-private fun Scrim(
-    open: Boolean,
-    onClose: () -> Unit,
-    fraction: () -> Float,
-    color: Color
-) {
+private fun Scrim(open: Boolean, onClose: () -> Unit, fraction: () -> Float, color: Color) {
     val closeDrawer = getString(Strings.CloseDrawer)
-    val dismissDrawer = if (open) {
-        Modifier
-            .pointerInput(onClose) { detectTapGestures { onClose() } }
-            .semantics(mergeDescendants = true) {
-                contentDescription = closeDrawer
-                onClick { onClose(); true }
-            }
-    } else {
-        Modifier
-    }
+    val dismissDrawer =
+        if (open) {
+            Modifier.pointerInput(onClose) { detectTapGestures { onClose() } }
+                .semantics(mergeDescendants = true) {
+                    contentDescription = closeDrawer
+                    onClick {
+                        onClose()
+                        true
+                    }
+                }
+        } else {
+            Modifier
+        }
 
-    Canvas(
-        Modifier
-            .fillMaxSize()
-            .then(dismissDrawer)
-    ) {
-        drawRect(color, alpha = fraction())
-    }
+    Canvas(Modifier.fillMaxSize().then(dismissDrawer)) { drawRect(color, alpha = fraction()) }
 }
 
 private val DrawerPositionalThreshold = 0.5f
diff --git a/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/NavigationItem.kt b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/NavigationItem.kt
index ccb4c3a..5317bcc 100644
--- a/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/NavigationItem.kt
+++ b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/NavigationItem.kt
@@ -85,18 +85,17 @@
         val Start = NavigationItemIconPosition(1)
     }
 
-    override fun toString() = when (this) {
-        Top -> "Top"
-        Start -> "Start"
-        else -> "Unknown"
-    }
+    override fun toString() =
+        when (this) {
+            Top -> "Top"
+            Start -> "Start"
+            else -> "Unknown"
+        }
 }
 
 /**
  * Represents the colors of the various elements of a navigation item.
  *
- * @constructor create an instance with arbitrary colors.
- *
  * @param selectedIconColor the color to use for the icon when the item is selected.
  * @param selectedTextColor the color to use for the text label when the item is selected.
  * @param selectedIndicatorColor the color to use for the indicator when the item is selected.
@@ -104,11 +103,13 @@
  * @param unselectedTextColor the color to use for the text label when the item is unselected.
  * @param disabledIconColor the color to use for the icon when the item is disabled.
  * @param disabledTextColor the color to use for the text label when the item is disabled.
+ * @constructor create an instance with arbitrary colors.
  *
  * TODO: Remove "internal".
  */
 @Immutable
-internal class NavigationItemColors constructor(
+internal class NavigationItemColors
+constructor(
     val selectedIconColor: Color,
     val selectedTextColor: Color,
     val selectedIndicatorColor: Color,
@@ -118,8 +119,8 @@
     val disabledTextColor: Color,
 ) {
     /**
-     * Returns a copy of this NavigationItemColors, optionally overriding some of the values.
-     * This uses the Color.Unspecified to mean “use the value from the source”.
+     * Returns a copy of this NavigationItemColors, optionally overriding some of the values. This
+     * uses the Color.Unspecified to mean “use the value from the source”.
      */
     fun copy(
         selectedIconColor: Color = this.selectedIconColor,
@@ -129,15 +130,16 @@
         unselectedTextColor: Color = this.unselectedTextColor,
         disabledIconColor: Color = this.disabledIconColor,
         disabledTextColor: Color = this.disabledTextColor,
-    ) = NavigationItemColors(
-        selectedIconColor.takeOrElse { this.selectedIconColor },
-        selectedTextColor.takeOrElse { this.selectedTextColor },
-        selectedIndicatorColor.takeOrElse { this.selectedIndicatorColor },
-        unselectedIconColor.takeOrElse { this.unselectedIconColor },
-        unselectedTextColor.takeOrElse { this.unselectedTextColor },
-        disabledIconColor.takeOrElse { this.disabledIconColor },
-        disabledTextColor.takeOrElse { this.disabledTextColor },
-    )
+    ) =
+        NavigationItemColors(
+            selectedIconColor.takeOrElse { this.selectedIconColor },
+            selectedTextColor.takeOrElse { this.selectedTextColor },
+            selectedIndicatorColor.takeOrElse { this.selectedIndicatorColor },
+            unselectedIconColor.takeOrElse { this.unselectedIconColor },
+            unselectedTextColor.takeOrElse { this.unselectedTextColor },
+            disabledIconColor.takeOrElse { this.disabledIconColor },
+            disabledTextColor.takeOrElse { this.disabledTextColor },
+        )
 
     /**
      * Represents the icon color for this item, depending on whether it is [selected].
@@ -210,23 +212,22 @@
  * @param indicatorHorizontalPadding the horizontal padding of the indicator
  * @param indicatorVerticalPadding the vertical padding of the indicator
  * @param indicatorToLabelVerticalPadding the padding between the indicator and the label when there
- * is a top icon for this item (the iconPosition is Top)
+ *   is a top icon for this item (the iconPosition is Top)
  * @param startIconToLabelHorizontalPadding the padding between the start icon and the label of the
- * item (the iconPosition is Start)
+ *   item (the iconPosition is Start)
  * @param topIconItemVerticalPadding the vertical padding of the item when the iconPosition is Top
  * @param colors [NavigationItemColors] that will be used to resolve the colors used for this item
- * in different states
+ *   in different states
  * @param modifier the [Modifier] to be applied to this item
  * @param enabled controls the enabled state of this item. When `false`, this component will not
- * respond to user input, and it will appear visually disabled and disabled to accessibility
- * services
+ *   respond to user input, and it will appear visually disabled and disabled to accessibility
+ *   services
  * @param label the text label for this item
  * @param badge optional badge to show on this item, typically a [Badge]
  * @param iconPosition the [NavigationItemIconPosition] for this icon
  * @param interactionSource the [MutableInteractionSource] representing the stream of [Interaction]s
- * for this item. You can create and pass in your own `remember`ed instance to observe
- * [Interaction]s and customize the appearance / behavior of this item in different states
- *
+ *   for this item. You can create and pass in your own `remember`ed instance to observe
+ *   [Interaction]s and customize the appearance / behavior of this item in different states
  */
 @OptIn(ExperimentalMaterial3Api::class)
 @Composable
@@ -250,14 +251,15 @@
     iconPosition: NavigationItemIconPosition,
     interactionSource: MutableInteractionSource
 ) {
-    val styledIcon = @Composable {
-        val iconColor = colors.iconColor(selected = selected, enabled = enabled)
-        // If there's a label, don't have a11y services repeat the icon description.
-        val clearSemantics = label != null
-        Box(modifier = if (clearSemantics) Modifier.clearAndSetSemantics {} else Modifier) {
-            CompositionLocalProvider(LocalContentColor provides iconColor, content = icon)
+    val styledIcon =
+        @Composable {
+            val iconColor = colors.iconColor(selected = selected, enabled = enabled)
+            // If there's a label, don't have a11y services repeat the icon description.
+            val clearSemantics = label != null
+            Box(modifier = if (clearSemantics) Modifier.clearAndSetSemantics {} else Modifier) {
+                CompositionLocalProvider(LocalContentColor provides iconColor, content = icon)
+            }
         }
-    }
     val iconWithBadge =
         if (badge != null) {
             { BadgedBox(badge = { badge() }) { styledIcon() } }
@@ -265,19 +267,17 @@
             styledIcon
         }
 
-    val styledLabel: @Composable (() -> Unit)? = label?.let {
-        @Composable {
-            val textColor = colors.textColor(
-                selected = selected,
-                enabled = enabled
-            )
-            ProvideContentColorTextStyle(
-                contentColor = textColor,
-                textStyle = labelTextStyle,
-                content = label
-            )
+    val styledLabel: @Composable (() -> Unit)? =
+        label?.let {
+            @Composable {
+                val textColor = colors.textColor(selected = selected, enabled = enabled)
+                ProvideContentColorTextStyle(
+                    contentColor = textColor,
+                    textStyle = labelTextStyle,
+                    content = label
+                )
+            }
         }
-    }
 
     var itemWidth by remember { mutableIntStateOf(0) }
 
@@ -296,10 +296,11 @@
         contentAlignment = Alignment.Center,
         propagateMinConstraints = true,
     ) {
-        val animationProgress: State<Float> = animateFloatAsState(
-            targetValue = if (selected) 1f else 0f,
-            animationSpec = tween(ItemAnimationDurationMillis)
-        )
+        val animationProgress: State<Float> =
+            animateFloatAsState(
+                targetValue = if (selected) 1f else 0f,
+                animationSpec = tween(ItemAnimationDurationMillis)
+            )
 
         var offsetInteractionSource: MappedInteractionSource? = null
         if (iconPosition == NavigationItemIconPosition.Top) {
@@ -308,14 +309,16 @@
             // coordinates of the indicator.
             val deltaOffset: Offset
             with(LocalDensity.current) {
-                deltaOffset = Offset(
-                    (itemWidth - indicatorWidth.roundToPx()).toFloat() / 2,
-                    IndicatorVerticalOffset.toPx()
-                )
+                deltaOffset =
+                    Offset(
+                        (itemWidth - indicatorWidth.roundToPx()).toFloat() / 2,
+                        IndicatorVerticalOffset.toPx()
+                    )
             }
-            offsetInteractionSource = remember(interactionSource, deltaOffset) {
-                MappedInteractionSource(interactionSource, deltaOffset)
-            }
+            offsetInteractionSource =
+                remember(interactionSource, deltaOffset) {
+                    MappedInteractionSource(interactionSource, deltaOffset)
+                }
         }
 
         NavigationItemLayout(
@@ -355,16 +358,15 @@
         content = {
             // Create the indicator ripple.
             Box(
-                Modifier
-                    .layoutId(IndicatorRippleLayoutIdTag)
+                Modifier.layoutId(IndicatorRippleLayoutIdTag)
                     .clip(indicatorShape)
                     .indication(interactionSource, rippleOrFallbackImplementation())
             )
-            // Create the indicator. The indicator has a width-expansion animation which interferes with
+            // Create the indicator. The indicator has a width-expansion animation which interferes
+            // with
             // the timing of the ripple, which is why they are separate composables.
             Box(
-                Modifier
-                    .layoutId(IndicatorLayoutIdTag)
+                Modifier.layoutId(IndicatorLayoutIdTag)
                     .graphicsLayer { alpha = animationProgress() }
                     .background(
                         color = indicatorColor,
@@ -376,23 +378,24 @@
                 Box(Modifier.layoutId(LabelLayoutIdTag)) { label() }
             }
         },
-        measurePolicy = if (label == null || iconPosition == NavigationItemIconPosition.Top) {
-            TopIconOrIconOnlyMeasurePolicy(
-                label != null,
-                animationProgress,
-                indicatorHorizontalPadding,
-                indicatorVerticalPadding,
-                indicatorToLabelVerticalPadding,
-                topIconItemVerticalPadding
-            )
-        } else {
-            StartIconMeasurePolicy(
-                animationProgress,
-                indicatorHorizontalPadding,
-                indicatorVerticalPadding,
-                startIconToLabelHorizontalPadding,
-            )
-        }
+        measurePolicy =
+            if (label == null || iconPosition == NavigationItemIconPosition.Top) {
+                TopIconOrIconOnlyMeasurePolicy(
+                    label != null,
+                    animationProgress,
+                    indicatorHorizontalPadding,
+                    indicatorVerticalPadding,
+                    indicatorToLabelVerticalPadding,
+                    topIconItemVerticalPadding
+                )
+            } else {
+                StartIconMeasurePolicy(
+                    animationProgress,
+                    indicatorHorizontalPadding,
+                    indicatorVerticalPadding,
+                    startIconToLabelHorizontalPadding,
+                )
+            }
     )
 }
 
@@ -408,21 +411,21 @@
         measurables: List<Measurable>,
         constraints: Constraints
     ): MeasureResult {
-        @Suppress("NAME_SHADOWING")
-        val animationProgress = animationProgress()
+        @Suppress("NAME_SHADOWING") val animationProgress = animationProgress()
         val looseConstraints = constraints.copy(minWidth = 0, minHeight = 0)
         // When measuring icon, account for the indicator in its constraints.
         val iconPlaceable =
-            measurables.fastFirst { it.layoutId == IconLayoutIdTag }.measure(
-                looseConstraints.offset(
-                    horizontal = -(indicatorHorizontalPadding * 2).roundToPx(),
-                    vertical = -(indicatorVerticalPadding * 2).roundToPx()
+            measurables
+                .fastFirst { it.layoutId == IconLayoutIdTag }
+                .measure(
+                    looseConstraints.offset(
+                        horizontal = -(indicatorHorizontalPadding * 2).roundToPx(),
+                        vertical = -(indicatorVerticalPadding * 2).roundToPx()
+                    )
                 )
-            )
         // Next, when measuring the indicator and ripple, still need to obey looseConstraints.
         val totalIndicatorWidth = iconPlaceable.width + (indicatorHorizontalPadding * 2).roundToPx()
-        val indicatorHeight =
-            iconPlaceable.height + (indicatorVerticalPadding * 2).roundToPx()
+        val indicatorHeight = iconPlaceable.height + (indicatorVerticalPadding * 2).roundToPx()
         val animatedIndicatorWidth = (totalIndicatorWidth * animationProgress).roundToInt()
         val indicatorRipplePlaceable =
             measurables
@@ -449,8 +452,9 @@
                     .fastFirst { it.layoutId == LabelLayoutIdTag }
                     .measure(
                         looseConstraints.offset(
-                            vertical = -(indicatorPlaceable.height +
-                                indicatorToLabelVerticalPadding.roundToPx())
+                            vertical =
+                                -(indicatorPlaceable.height +
+                                    indicatorToLabelVerticalPadding.roundToPx())
                         )
                     )
 
@@ -473,12 +477,17 @@
         measurables: List<IntrinsicMeasurable>,
         width: Int
     ): Int {
-        val iconHeight = measurables.fastFirst { it.layoutId == IconLayoutIdTag }
-            .maxIntrinsicHeight(width)
-        val labelHeight = measurables.fastFirstOrNull { it.layoutId == LabelLayoutIdTag }
-            ?.maxIntrinsicHeight(width) ?: 0
-        val paddings = (topIconItemVerticalPadding * 2 + indicatorVerticalPadding * 2 +
-            indicatorToLabelVerticalPadding).roundToPx()
+        val iconHeight =
+            measurables.fastFirst { it.layoutId == IconLayoutIdTag }.maxIntrinsicHeight(width)
+        val labelHeight =
+            measurables
+                .fastFirstOrNull { it.layoutId == LabelLayoutIdTag }
+                ?.maxIntrinsicHeight(width) ?: 0
+        val paddings =
+            (topIconItemVerticalPadding * 2 +
+                    indicatorVerticalPadding * 2 +
+                    indicatorToLabelVerticalPadding)
+                .roundToPx()
 
         return iconHeight + labelHeight + paddings
     }
@@ -494,14 +503,14 @@
         measurables: List<Measurable>,
         constraints: Constraints
     ): MeasureResult {
-        @Suppress("NAME_SHADOWING")
-        val animationProgress = animationProgress()
+        @Suppress("NAME_SHADOWING") val animationProgress = animationProgress()
         val looseConstraints = constraints.copy(minWidth = 0, minHeight = 0)
         // When measuring icon, account for the indicator in its constraints.
-        val iconConstraints = looseConstraints.offset(
-            horizontal = -(indicatorHorizontalPadding * 2).roundToPx(),
-            vertical = -(indicatorVerticalPadding * 2).roundToPx()
-        )
+        val iconConstraints =
+            looseConstraints.offset(
+                horizontal = -(indicatorHorizontalPadding * 2).roundToPx(),
+                vertical = -(indicatorVerticalPadding * 2).roundToPx()
+            )
         val iconPlaceable =
             measurables.fastFirst { it.layoutId == IconLayoutIdTag }.measure(iconConstraints)
         // When measuring the label, account for the indicator, the icon, and the padding between
@@ -511,15 +520,18 @@
                 .fastFirst { it.layoutId == LabelLayoutIdTag }
                 .measure(
                     iconConstraints.offset(
-                        horizontal = -(iconPlaceable.width +
-                            startIconToLabelHorizontalPadding.roundToPx())
+                        horizontal =
+                            -(iconPlaceable.width + startIconToLabelHorizontalPadding.roundToPx())
                     )
                 )
 
-        val totalIndicatorWidth = iconPlaceable.width + labelPlaceable.width +
-            (startIconToLabelHorizontalPadding + indicatorHorizontalPadding * 2).roundToPx()
-        val indicatorHeight = max(iconPlaceable.height, labelPlaceable.height) +
-            (indicatorVerticalPadding * 2).roundToPx()
+        val totalIndicatorWidth =
+            iconPlaceable.width +
+                labelPlaceable.width +
+                (startIconToLabelHorizontalPadding + indicatorHorizontalPadding * 2).roundToPx()
+        val indicatorHeight =
+            max(iconPlaceable.height, labelPlaceable.height) +
+                (indicatorVerticalPadding * 2).roundToPx()
         val animatedIndicatorWidth = (totalIndicatorWidth * animationProgress).roundToInt()
         // When measuring the indicator and ripple, still need to obey looseConstraints.
         val indicatorRipplePlaceable =
@@ -553,10 +565,10 @@
         measurables: List<IntrinsicMeasurable>,
         height: Int
     ): Int {
-        val iconWidth = measurables.fastFirst { it.layoutId == IconLayoutIdTag }
-            .maxIntrinsicWidth(height)
-        val labelWidth = measurables.fastFirst { it.layoutId == LabelLayoutIdTag }
-            .maxIntrinsicWidth(height)
+        val iconWidth =
+            measurables.fastFirst { it.layoutId == IconLayoutIdTag }.maxIntrinsicWidth(height)
+        val labelWidth =
+            measurables.fastFirst { it.layoutId == LabelLayoutIdTag }.maxIntrinsicWidth(height)
         val paddings =
             (indicatorHorizontalPadding * 2 + startIconToLabelHorizontalPadding).roundToPx()
 
@@ -617,7 +629,7 @@
  * @param indicatorPlaceable indicator placeable inside this item, if it exists
  * @param constraints constraints of the item
  * @param indicatorToLabelVerticalPadding the padding between the bottom of the indicator and the
- * top of the label
+ *   top of the label
  * @param indicatorVerticalPadding vertical padding of the indicator
  * @param topIconItemVerticalPadding vertical padding of the item
  */
@@ -633,10 +645,14 @@
 ): MeasureResult {
     val width =
         constraints.constrainWidth(maxOf(labelPlaceable.width, indicatorRipplePlaceable.width))
-    val contentHeight = indicatorRipplePlaceable.height + indicatorToLabelVerticalPadding.toPx() +
-        labelPlaceable.height
-    val height = constraints
-        .constrainHeight((contentHeight + topIconItemVerticalPadding.toPx() * 2).roundToInt())
+    val contentHeight =
+        indicatorRipplePlaceable.height +
+            indicatorToLabelVerticalPadding.toPx() +
+            labelPlaceable.height
+    val height =
+        constraints.constrainHeight(
+            (contentHeight + topIconItemVerticalPadding.toPx() * 2).roundToInt()
+        )
 
     val iconY = (topIconItemVerticalPadding + indicatorVerticalPadding).roundToPx()
     val iconX = (width - iconPlaceable.width) / 2
@@ -644,8 +660,10 @@
     val indicatorY = iconY - indicatorVerticalPadding.roundToPx()
     val labelX = (width - labelPlaceable.width) / 2
     // Label should be fixed padding below icon.
-    val labelY = iconY + iconPlaceable.height +
-        (indicatorVerticalPadding + indicatorToLabelVerticalPadding).roundToPx()
+    val labelY =
+        iconY +
+            iconPlaceable.height +
+            (indicatorVerticalPadding + indicatorToLabelVerticalPadding).roundToPx()
     val rippleX = (width - indicatorRipplePlaceable.width) / 2
     val rippleY = indicatorY
 
@@ -666,7 +684,7 @@
  * @param indicatorPlaceable indicator placeable inside this item
  * @param constraints constraints of the item
  * @param startIconToLabelHorizontalPadding the padding between end of the icon and the start of the
- * label of this item
+ *   label of this item
  */
 private fun MeasureScope.placeLabelAndStartIcon(
     labelPlaceable: Placeable,
@@ -683,8 +701,8 @@
     val indicatorY = (height - indicatorPlaceable.height) / 2
     val iconY = (height - iconPlaceable.height) / 2
     val labelY = (height - labelPlaceable.height) / 2
-    val itemContentWidth = iconPlaceable.width + startIconToLabelHorizontalPadding.roundToPx() +
-        labelPlaceable.width
+    val itemContentWidth =
+        iconPlaceable.width + startIconToLabelHorizontalPadding.roundToPx() + labelPlaceable.width
     val iconX = (width - itemContentWidth) / 2
     val labelX = iconX + iconPlaceable.width + startIconToLabelHorizontalPadding.roundToPx()
     val rippleX = (width - indicatorRipplePlaceable.width) / 2
diff --git a/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/NavigationRail.kt b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/NavigationRail.kt
index 97febc4..6ad6b45 100644
--- a/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/NavigationRail.kt
+++ b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/NavigationRail.kt
@@ -75,12 +75,14 @@
 import kotlin.math.roundToInt
 
 /**
- * <a href="https://m3.material.io/components/navigation-rail/overview" class="external" target="_blank">Material Design bottom navigation rail</a>.
+ * <a href="https://m3.material.io/components/navigation-rail/overview" class="external"
+ * target="_blank">Material Design bottom navigation rail</a>.
  *
  * Navigation rails provide access to primary destinations in apps when using tablet and desktop
  * screens.
  *
- * ![Navigation rail image](https://developer.android.com/images/reference/androidx/compose/material3/navigation-rail.png)
+ * ![Navigation rail
+ * image](https://developer.android.com/images/reference/androidx/compose/material3/navigation-rail.png)
  *
  * The navigation rail should be used to display three to seven app destinations and, optionally, a
  * [FloatingActionButton] or a logo header. Each destination is typically represented by an icon and
@@ -90,6 +92,7 @@
  * destination.
  *
  * A simple example looks like:
+ *
  * @sample androidx.compose.material3.samples.NavigationRailSample
  *
  * See [NavigationRailItem] for configuration specific to each item, and not the overall
@@ -97,10 +100,10 @@
  *
  * @param modifier the [Modifier] to be applied to this navigation rail
  * @param containerColor the color used for the background of this navigation rail. Use
- * [Color.Transparent] to have no color.
+ *   [Color.Transparent] to have no color.
  * @param contentColor the preferred color for content inside this navigation rail. Defaults to
- * either the matching content color for [containerColor], or to the current [LocalContentColor] if
- * [containerColor] is not a color from the theme.
+ *   either the matching content color for [containerColor], or to the current [LocalContentColor]
+ *   if [containerColor] is not a color from the theme.
  * @param header optional header that may hold a [FloatingActionButton] or a logo
  * @param windowInsets a window insets of the navigation rail.
  * @param content the content of this navigation rail, typically 3-7 [NavigationRailItem]s
@@ -120,8 +123,7 @@
         modifier = modifier,
     ) {
         Column(
-            Modifier
-                .fillMaxHeight()
+            Modifier.fillMaxHeight()
                 .windowInsetsPadding(windowInsets)
                 .widthIn(min = NavigationRailTokens.ContainerWidth)
                 .padding(vertical = NavigationRailVerticalPadding)
@@ -154,17 +156,17 @@
  * @param icon icon for this item, typically an [Icon]
  * @param modifier the [Modifier] to be applied to this item
  * @param enabled controls the enabled state of this item. When `false`, this component will not
- * respond to user input, and it will appear visually disabled and disabled to accessibility
- * services.
+ *   respond to user input, and it will appear visually disabled and disabled to accessibility
+ *   services.
  * @param label optional text label for this item
  * @param alwaysShowLabel whether to always show the label for this item. If false, the label will
- * only be shown when this item is selected.
+ *   only be shown when this item is selected.
  * @param colors [NavigationRailItemColors] that will be used to resolve the colors used for this
- * item in different states. See [NavigationRailItemDefaults.colors].
+ *   item in different states. See [NavigationRailItemDefaults.colors].
  * @param interactionSource an optional hoisted [MutableInteractionSource] for observing and
- * emitting [Interaction]s for this item. You can use this to change the item's appearance
- * or preview the item in different states. Note that if `null` is provided, interactions will
- * still happen internally.
+ *   emitting [Interaction]s for this item. You can use this to change the item's appearance or
+ *   preview the item in different states. Note that if `null` is provided, interactions will still
+ *   happen internally.
  */
 @Composable
 fun NavigationRailItem(
@@ -180,32 +182,36 @@
 ) {
     @Suppress("NAME_SHADOWING")
     val interactionSource = interactionSource ?: remember { MutableInteractionSource() }
-    val styledIcon = @Composable {
-        val iconColor by animateColorAsState(
-            targetValue = colors.iconColor(selected = selected, enabled = enabled),
-            animationSpec = tween(ItemAnimationDurationMillis)
-        )
-        // If there's a label, don't have a11y services repeat the icon description.
-        val clearSemantics = label != null && (alwaysShowLabel || selected)
-        Box(modifier = if (clearSemantics) Modifier.clearAndSetSemantics {} else Modifier) {
-            CompositionLocalProvider(LocalContentColor provides iconColor, content = icon)
-        }
-    }
-
-    val styledLabel: @Composable (() -> Unit)? = label?.let {
+    val styledIcon =
         @Composable {
-            val style = NavigationRailTokens.LabelTextFont.value
-            val textColor by animateColorAsState(
-                targetValue = colors.textColor(selected = selected, enabled = enabled),
-                animationSpec = tween(ItemAnimationDurationMillis)
-            )
-            ProvideContentColorTextStyle(
-                contentColor = textColor,
-                textStyle = style,
-                content = label
-            )
+            val iconColor by
+                animateColorAsState(
+                    targetValue = colors.iconColor(selected = selected, enabled = enabled),
+                    animationSpec = tween(ItemAnimationDurationMillis)
+                )
+            // If there's a label, don't have a11y services repeat the icon description.
+            val clearSemantics = label != null && (alwaysShowLabel || selected)
+            Box(modifier = if (clearSemantics) Modifier.clearAndSetSemantics {} else Modifier) {
+                CompositionLocalProvider(LocalContentColor provides iconColor, content = icon)
+            }
         }
-    }
+
+    val styledLabel: @Composable (() -> Unit)? =
+        label?.let {
+            @Composable {
+                val style = NavigationRailTokens.LabelTextFont.value
+                val textColor by
+                    animateColorAsState(
+                        targetValue = colors.textColor(selected = selected, enabled = enabled),
+                        animationSpec = tween(ItemAnimationDurationMillis)
+                    )
+                ProvideContentColorTextStyle(
+                    contentColor = textColor,
+                    textStyle = style,
+                    content = label
+                )
+            }
+        }
 
     Box(
         modifier
@@ -222,10 +228,11 @@
         contentAlignment = Alignment.Center,
         propagateMinConstraints = true,
     ) {
-        val animationProgress: State<Float> = animateFloatAsState(
-            targetValue = if (selected) 1f else 0f,
-            animationSpec = tween(ItemAnimationDurationMillis)
-        )
+        val animationProgress: State<Float> =
+            animateFloatAsState(
+                targetValue = if (selected) 1f else 0f,
+                animationSpec = tween(ItemAnimationDurationMillis)
+            )
 
         // The entire item is selectable, but only the indicator pill shows the ripple. To achieve
         // this, we re-map the coordinates of the item's InteractionSource into the coordinates of
@@ -236,37 +243,36 @@
             val indicatorWidth = NavigationRailTokens.ActiveIndicatorWidth.roundToPx()
             deltaOffset = Offset((itemWidth - indicatorWidth).toFloat() / 2, 0f)
         }
-        val offsetInteractionSource = remember(interactionSource, deltaOffset) {
-            MappedInteractionSource(interactionSource, deltaOffset)
-        }
+        val offsetInteractionSource =
+            remember(interactionSource, deltaOffset) {
+                MappedInteractionSource(interactionSource, deltaOffset)
+            }
 
-        val indicatorShape = if (label != null) {
-            NavigationRailTokens.ActiveIndicatorShape.value
-        } else {
-            NavigationRailTokens.NoLabelActiveIndicatorShape.value
-        }
+        val indicatorShape =
+            if (label != null) {
+                NavigationRailTokens.ActiveIndicatorShape.value
+            } else {
+                NavigationRailTokens.NoLabelActiveIndicatorShape.value
+            }
 
         // The indicator has a width-expansion animation which interferes with the timing of the
         // ripple, which is why they are separate composables
-        val indicatorRipple = @Composable {
-            Box(
-                Modifier
-                    .layoutId(IndicatorRippleLayoutIdTag)
-                    .clip(indicatorShape)
-                    .indication(offsetInteractionSource, rippleOrFallbackImplementation())
-            )
-        }
-        val indicator = @Composable {
-            Box(
-                Modifier
-                    .layoutId(IndicatorLayoutIdTag)
-                    .graphicsLayer { alpha = animationProgress.value }
-                    .background(
-                        color = colors.indicatorColor,
-                        shape = indicatorShape
-                    )
-            )
-        }
+        val indicatorRipple =
+            @Composable {
+                Box(
+                    Modifier.layoutId(IndicatorRippleLayoutIdTag)
+                        .clip(indicatorShape)
+                        .indication(offsetInteractionSource, rippleOrFallbackImplementation())
+                )
+            }
+        val indicator =
+            @Composable {
+                Box(
+                    Modifier.layoutId(IndicatorLayoutIdTag)
+                        .graphicsLayer { alpha = animationProgress.value }
+                        .background(color = colors.indicatorColor, shape = indicatorShape)
+                )
+            }
 
         NavigationRailItemLayout(
             indicatorRipple = indicatorRipple,
@@ -282,15 +288,16 @@
 /** Defaults used in [NavigationRail] */
 object NavigationRailDefaults {
     /** Default container color of a navigation rail. */
-    val ContainerColor: Color @Composable get() = NavigationRailTokens.ContainerColor.value
+    val ContainerColor: Color
+        @Composable get() = NavigationRailTokens.ContainerColor.value
 
-    /**
-     * Default window insets for navigation rail.
-     */
+    /** Default window insets for navigation rail. */
     val windowInsets: WindowInsets
         @Composable
-        get() = WindowInsets.systemBarsForVisualComponents
-            .only(WindowInsetsSides.Vertical + WindowInsetsSides.Start)
+        get() =
+            WindowInsets.systemBarsForVisualComponents.only(
+                WindowInsetsSides.Vertical + WindowInsetsSides.Start
+            )
 }
 
 /** Defaults used in [NavigationRailItem]. */
@@ -299,8 +306,7 @@
      * Creates a [NavigationRailItemColors] with the provided colors according to the Material
      * specification.
      */
-    @Composable
-    fun colors() = MaterialTheme.colorScheme.defaultNavigationRailItemColors
+    @Composable fun colors() = MaterialTheme.colorScheme.defaultNavigationRailItemColors
 
     /**
      * Creates a [NavigationRailItemColors] with the provided colors according to the Material
@@ -324,31 +330,36 @@
         unselectedTextColor: Color = NavigationRailTokens.InactiveLabelTextColor.value,
         disabledIconColor: Color = unselectedIconColor.copy(alpha = DisabledAlpha),
         disabledTextColor: Color = unselectedTextColor.copy(alpha = DisabledAlpha),
-    ): NavigationRailItemColors = MaterialTheme.colorScheme.defaultNavigationRailItemColors.copy(
-        selectedIconColor = selectedIconColor,
-        selectedTextColor = selectedTextColor,
-        selectedIndicatorColor = indicatorColor,
-        unselectedIconColor = unselectedIconColor,
-        unselectedTextColor = unselectedTextColor,
-        disabledIconColor = disabledIconColor,
-        disabledTextColor = disabledTextColor,
-    )
+    ): NavigationRailItemColors =
+        MaterialTheme.colorScheme.defaultNavigationRailItemColors.copy(
+            selectedIconColor = selectedIconColor,
+            selectedTextColor = selectedTextColor,
+            selectedIndicatorColor = indicatorColor,
+            unselectedIconColor = unselectedIconColor,
+            unselectedTextColor = unselectedTextColor,
+            disabledIconColor = disabledIconColor,
+            disabledTextColor = disabledTextColor,
+        )
 
     internal val ColorScheme.defaultNavigationRailItemColors: NavigationRailItemColors
         get() {
-            return defaultNavigationRailItemColorsCached ?: NavigationRailItemColors(
-                selectedIconColor = fromToken(NavigationRailTokens.ActiveIconColor),
-            selectedTextColor = fromToken(NavigationRailTokens.ActiveLabelTextColor),
-                selectedIndicatorColor = fromToken(NavigationRailTokens.ActiveIndicatorColor),
-            unselectedIconColor = fromToken(NavigationRailTokens.InactiveIconColor),
-            unselectedTextColor = fromToken(NavigationRailTokens.InactiveLabelTextColor),
-            disabledIconColor =
-            fromToken(NavigationRailTokens.InactiveIconColor).copy(alpha = DisabledAlpha),
-            disabledTextColor =
-            fromToken(NavigationRailTokens.InactiveLabelTextColor).copy(alpha = DisabledAlpha),
-            ).also {
-                defaultNavigationRailItemColorsCached = it
-            }
+            return defaultNavigationRailItemColorsCached
+                ?: NavigationRailItemColors(
+                        selectedIconColor = fromToken(NavigationRailTokens.ActiveIconColor),
+                        selectedTextColor = fromToken(NavigationRailTokens.ActiveLabelTextColor),
+                        selectedIndicatorColor =
+                            fromToken(NavigationRailTokens.ActiveIndicatorColor),
+                        unselectedIconColor = fromToken(NavigationRailTokens.InactiveIconColor),
+                        unselectedTextColor =
+                            fromToken(NavigationRailTokens.InactiveLabelTextColor),
+                        disabledIconColor =
+                            fromToken(NavigationRailTokens.InactiveIconColor)
+                                .copy(alpha = DisabledAlpha),
+                        disabledTextColor =
+                            fromToken(NavigationRailTokens.InactiveLabelTextColor)
+                                .copy(alpha = DisabledAlpha),
+                    )
+                    .also { defaultNavigationRailItemColorsCached = it }
         }
 
     @Deprecated(
@@ -362,22 +373,21 @@
         indicatorColor: Color = NavigationRailTokens.ActiveIndicatorColor.value,
         unselectedIconColor: Color = NavigationRailTokens.InactiveIconColor.value,
         unselectedTextColor: Color = NavigationRailTokens.InactiveLabelTextColor.value,
-    ): NavigationRailItemColors = NavigationRailItemColors(
-        selectedIconColor = selectedIconColor,
-        selectedTextColor = selectedTextColor,
-        selectedIndicatorColor = indicatorColor,
-        unselectedIconColor = unselectedIconColor,
-        unselectedTextColor = unselectedTextColor,
-        disabledIconColor = unselectedIconColor.copy(alpha = DisabledAlpha),
-        disabledTextColor = unselectedTextColor.copy(alpha = DisabledAlpha),
-    )
+    ): NavigationRailItemColors =
+        NavigationRailItemColors(
+            selectedIconColor = selectedIconColor,
+            selectedTextColor = selectedTextColor,
+            selectedIndicatorColor = indicatorColor,
+            unselectedIconColor = unselectedIconColor,
+            unselectedTextColor = unselectedTextColor,
+            disabledIconColor = unselectedIconColor.copy(alpha = DisabledAlpha),
+            disabledTextColor = unselectedTextColor.copy(alpha = DisabledAlpha),
+        )
 }
 
 /**
  * Represents the colors of the various elements of a navigation item.
  *
- * @constructor create an instance with arbitrary colors.
- *
  * @param selectedIconColor the color to use for the icon when the item is selected.
  * @param selectedTextColor the color to use for the text label when the item is selected.
  * @param selectedIndicatorColor the color to use for the indicator when the item is selected.
@@ -385,9 +395,11 @@
  * @param unselectedTextColor the color to use for the text label when the item is unselected.
  * @param disabledIconColor the color to use for the icon when the item is disabled.
  * @param disabledTextColor the color to use for the text label when the item is disabled.
+ * @constructor create an instance with arbitrary colors.
  */
 @Immutable
-class NavigationRailItemColors constructor(
+class NavigationRailItemColors
+constructor(
     val selectedIconColor: Color,
     val selectedTextColor: Color,
     val selectedIndicatorColor: Color,
@@ -408,15 +420,16 @@
         unselectedTextColor: Color = this.unselectedTextColor,
         disabledIconColor: Color = this.disabledIconColor,
         disabledTextColor: Color = this.disabledTextColor,
-    ) = NavigationRailItemColors(
-        selectedIconColor.takeOrElse { this.selectedIconColor },
-        selectedTextColor.takeOrElse { this.selectedTextColor },
-        selectedIndicatorColor.takeOrElse { this.selectedIndicatorColor },
-        unselectedIconColor.takeOrElse { this.unselectedIconColor },
-        unselectedTextColor.takeOrElse { this.unselectedTextColor },
-        disabledIconColor.takeOrElse { this.disabledIconColor },
-        disabledTextColor.takeOrElse { this.disabledTextColor },
-    )
+    ) =
+        NavigationRailItemColors(
+            selectedIconColor.takeOrElse { this.selectedIconColor },
+            selectedTextColor.takeOrElse { this.selectedTextColor },
+            selectedIndicatorColor.takeOrElse { this.selectedIndicatorColor },
+            unselectedIconColor.takeOrElse { this.unselectedIconColor },
+            unselectedTextColor.takeOrElse { this.unselectedTextColor },
+            disabledIconColor.takeOrElse { this.disabledIconColor },
+            disabledTextColor.takeOrElse { this.disabledTextColor },
+        )
 
     /**
      * Represents the icon color for this item, depending on whether it is [selected].
@@ -425,11 +438,12 @@
      * @param enabled whether the item is enabled
      */
     @Stable
-    internal fun iconColor(selected: Boolean, enabled: Boolean): Color = when {
-        !enabled -> disabledIconColor
-        selected -> selectedIconColor
-        else -> unselectedIconColor
-    }
+    internal fun iconColor(selected: Boolean, enabled: Boolean): Color =
+        when {
+            !enabled -> disabledIconColor
+            selected -> selectedIconColor
+            else -> unselectedIconColor
+        }
 
     /**
      * Represents the text color for this item, depending on whether it is [selected].
@@ -438,11 +452,12 @@
      * @param enabled whether the item is enabled
      */
     @Stable
-    internal fun textColor(selected: Boolean, enabled: Boolean): Color = when {
-        !enabled -> disabledTextColor
-        selected -> selectedTextColor
-        else -> unselectedTextColor
-    }
+    internal fun textColor(selected: Boolean, enabled: Boolean): Color =
+        when {
+            !enabled -> disabledTextColor
+            selected -> selectedTextColor
+            else -> unselectedTextColor
+        }
 
     /** Represents the color of the indicator used for selected items. */
     internal val indicatorColor: Color
@@ -484,10 +499,10 @@
  * @param icon icon for this item
  * @param label text label for this item
  * @param alwaysShowLabel whether to always show the label for this item. If false, the label will
- * only be shown when this item is selected.
+ *   only be shown when this item is selected.
  * @param animationProgress progress of the animation, where 0 represents the unselected state of
- * this item and 1 represents the selected state. This value controls other values such as indicator
- * size, icon and label positions, etc.
+ *   this item and 1 represents the selected state. This value controls other values such as
+ *   indicator size, icon and label positions, etc.
  */
 @Composable
 private fun NavigationRailItemLayout(
@@ -506,51 +521,43 @@
 
         if (label != null) {
             Box(
-                Modifier
-                    .layoutId(LabelLayoutIdTag)
-                    .graphicsLayer { alpha = if (alwaysShowLabel) 1f else animationProgress() }
-            ) { label() }
+                Modifier.layoutId(LabelLayoutIdTag).graphicsLayer {
+                    alpha = if (alwaysShowLabel) 1f else animationProgress()
+                }
+            ) {
+                label()
+            }
         }
     }) { measurables, constraints ->
-        @Suppress("NAME_SHADOWING")
-        val animationProgress = animationProgress()
+        @Suppress("NAME_SHADOWING") val animationProgress = animationProgress()
         val looseConstraints = constraints.copy(minWidth = 0, minHeight = 0)
         val iconPlaceable =
             measurables.fastFirst { it.layoutId == IconLayoutIdTag }.measure(looseConstraints)
 
         val totalIndicatorWidth = iconPlaceable.width + (IndicatorHorizontalPadding * 2).roundToPx()
         val animatedIndicatorWidth = (totalIndicatorWidth * animationProgress).roundToInt()
-        val indicatorVerticalPadding = if (label == null) {
-            IndicatorVerticalPaddingNoLabel
-        } else {
-            IndicatorVerticalPaddingWithLabel
-        }
+        val indicatorVerticalPadding =
+            if (label == null) {
+                IndicatorVerticalPaddingNoLabel
+            } else {
+                IndicatorVerticalPaddingWithLabel
+            }
         val indicatorHeight = iconPlaceable.height + (indicatorVerticalPadding * 2).roundToPx()
 
         val indicatorRipplePlaceable =
             measurables
                 .fastFirst { it.layoutId == IndicatorRippleLayoutIdTag }
-                .measure(
-                    Constraints.fixed(
-                        width = totalIndicatorWidth,
-                        height = indicatorHeight
-                    )
-                )
+                .measure(Constraints.fixed(width = totalIndicatorWidth, height = indicatorHeight))
         val indicatorPlaceable =
             measurables
                 .fastFirstOrNull { it.layoutId == IndicatorLayoutIdTag }
                 ?.measure(
-                    Constraints.fixed(
-                        width = animatedIndicatorWidth,
-                        height = indicatorHeight
-                    )
+                    Constraints.fixed(width = animatedIndicatorWidth, height = indicatorHeight)
                 )
 
         val labelPlaceable =
             label?.let {
-                measurables
-                    .fastFirst { it.layoutId == LabelLayoutIdTag }
-                    .measure(looseConstraints)
+                measurables.fastFirst { it.layoutId == LabelLayoutIdTag }.measure(looseConstraints)
             }
 
         if (label == null) {
@@ -569,22 +576,21 @@
     }
 }
 
-/**
- * Places the provided [Placeable]s in the center of the provided [constraints].
- */
+/** Places the provided [Placeable]s in the center of the provided [constraints]. */
 private fun MeasureScope.placeIcon(
     iconPlaceable: Placeable,
     indicatorRipplePlaceable: Placeable,
     indicatorPlaceable: Placeable?,
     constraints: Constraints,
 ): MeasureResult {
-    val width = constraints.constrainWidth(
-        maxOf(
-            iconPlaceable.width,
-            indicatorRipplePlaceable.width,
-            indicatorPlaceable?.width ?: 0
+    val width =
+        constraints.constrainWidth(
+            maxOf(
+                iconPlaceable.width,
+                indicatorRipplePlaceable.width,
+                indicatorPlaceable?.width ?: 0
+            )
         )
-    )
     val height = constraints.constrainHeight(NavigationRailItemHeight.roundToPx())
 
     val iconX = (width - iconPlaceable.width) / 2
@@ -630,11 +636,11 @@
  * @param indicatorPlaceable indicator placeable inside this item, if it exists
  * @param constraints constraints of the item
  * @param alwaysShowLabel whether to always show the label for this item. If true, icon and label
- * positions will not change. If false, positions transition between 'centered icon with no label'
- * and 'top aligned icon with label'.
+ *   positions will not change. If false, positions transition between 'centered icon with no label'
+ *   and 'top aligned icon with label'.
  * @param animationProgress progress of the animation, where 0 represents the unselected state of
- * this item and 1 represents the selected state. Values between 0 and 1 interpolate positions of
- * the icon and label.
+ *   this item and 1 represents the selected state. Values between 0 and 1 interpolate positions of
+ *   the icon and label.
  */
 private fun MeasureScope.placeLabelAndIcon(
     labelPlaceable: Placeable,
@@ -645,10 +651,15 @@
     alwaysShowLabel: Boolean,
     animationProgress: Float,
 ): MeasureResult {
-    val contentHeight = iconPlaceable.height + IndicatorVerticalPaddingWithLabel.toPx() +
-        NavigationRailItemVerticalPadding.toPx() + labelPlaceable.height
-    val contentVerticalPadding = ((constraints.minHeight - contentHeight) / 2)
-        .coerceAtLeast(IndicatorVerticalPaddingWithLabel.toPx())
+    val contentHeight =
+        iconPlaceable.height +
+            IndicatorVerticalPaddingWithLabel.toPx() +
+            NavigationRailItemVerticalPadding.toPx() +
+            labelPlaceable.height
+    val contentVerticalPadding =
+        ((constraints.minHeight - contentHeight) / 2).coerceAtLeast(
+            IndicatorVerticalPaddingWithLabel.toPx()
+        )
     val height = contentHeight + contentVerticalPadding * 2
 
     // Icon (when selected) should be `contentVerticalPadding` from the top
@@ -664,17 +675,16 @@
     val offset = iconDistance * (1 - animationProgress)
 
     // Label should be fixed padding below icon
-    val labelY = selectedIconY + iconPlaceable.height +
-        IndicatorVerticalPaddingWithLabel.toPx() +
-        NavigationRailItemVerticalPadding.toPx()
+    val labelY =
+        selectedIconY +
+            iconPlaceable.height +
+            IndicatorVerticalPaddingWithLabel.toPx() +
+            NavigationRailItemVerticalPadding.toPx()
 
-    val width = constraints.constrainWidth(
-        maxOf(
-            iconPlaceable.width,
-            labelPlaceable.width,
-            indicatorPlaceable?.width ?: 0
+    val width =
+        constraints.constrainWidth(
+            maxOf(iconPlaceable.width, labelPlaceable.width, indicatorPlaceable?.width ?: 0)
         )
-    )
     val labelX = (width - labelPlaceable.width) / 2
     val iconX = (width - iconPlaceable.width) / 2
     val rippleX = (width - indicatorRipplePlaceable.width) / 2
diff --git a/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/OutlinedTextField.kt b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/OutlinedTextField.kt
index 200429a..12ce5d5 100644
--- a/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/OutlinedTextField.kt
+++ b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/OutlinedTextField.kt
@@ -97,71 +97,73 @@
 import kotlin.math.roundToInt
 
 /**
- * <a href="https://m3.material.io/components/text-fields/overview" class="external" target="_blank">Material Design outlined text field</a>.
+ * <a href="https://m3.material.io/components/text-fields/overview" class="external"
+ * target="_blank">Material Design outlined text field</a>.
  *
  * Text fields allow users to enter text into a UI. They typically appear in forms and dialogs.
  * Outlined text fields have less visual emphasis than filled text fields. When they appear in
  * places like forms, where many text fields are placed together, their reduced emphasis helps
  * simplify the layout.
  *
- * ![Outlined text field image](https://developer.android.com/images/reference/androidx/compose/material3/outlined-text-field.png)
+ * ![Outlined text field
+ * image](https://developer.android.com/images/reference/androidx/compose/material3/outlined-text-field.png)
  *
  * See example usage:
+ *
  * @sample androidx.compose.material3.samples.SimpleOutlinedTextFieldSample
  *
- * If apart from input text change you also want to observe the cursor location, selection range,
- * or IME composition use the OutlinedTextField overload with the [TextFieldValue] parameter
- * instead.
+ * If apart from input text change you also want to observe the cursor location, selection range, or
+ * IME composition use the OutlinedTextField overload with the [TextFieldValue] parameter instead.
  *
  * @param value the input text to be shown in the text field
  * @param onValueChange the callback that is triggered when the input service updates the text. An
- * updated text comes as a parameter of the callback
+ *   updated text comes as a parameter of the callback
  * @param modifier the [Modifier] to be applied to this text field
  * @param enabled controls the enabled state of this text field. When `false`, this component will
- * not respond to user input, and it will appear visually disabled and disabled to accessibility
- * services.
+ *   not respond to user input, and it will appear visually disabled and disabled to accessibility
+ *   services.
  * @param readOnly controls the editable state of the text field. When `true`, the text field cannot
- * be modified. However, a user can focus it and copy text from it. Read-only text fields are
- * usually used to display pre-filled forms that a user cannot edit.
+ *   be modified. However, a user can focus it and copy text from it. Read-only text fields are
+ *   usually used to display pre-filled forms that a user cannot edit.
  * @param textStyle the style to be applied to the input text. Defaults to [LocalTextStyle].
- * @param label the optional label to be displayed inside the text field container. The default
- * text style for internal [Text] is [Typography.bodySmall] when the text field is in focus and
- * [Typography.bodyLarge] when the text field is not in focus
+ * @param label the optional label to be displayed inside the text field container. The default text
+ *   style for internal [Text] is [Typography.bodySmall] when the text field is in focus and
+ *   [Typography.bodyLarge] when the text field is not in focus
  * @param placeholder the optional placeholder to be displayed when the text field is in focus and
- * the input text is empty. The default text style for internal [Text] is [Typography.bodyLarge]
+ *   the input text is empty. The default text style for internal [Text] is [Typography.bodyLarge]
  * @param leadingIcon the optional leading icon to be displayed at the beginning of the text field
- * container
+ *   container
  * @param trailingIcon the optional trailing icon to be displayed at the end of the text field
- * container
+ *   container
  * @param prefix the optional prefix to be displayed before the input text in the text field
  * @param suffix the optional suffix to be displayed after the input text in the text field
  * @param supportingText the optional supporting text to be displayed below the text field
  * @param isError indicates if the text field's current value is in error. If set to true, the
- * label, bottom indicator and trailing icon by default will be displayed in error color
- * @param visualTransformation transforms the visual representation of the input [value]
- * For example, you can use
- * [PasswordVisualTransformation][androidx.compose.ui.text.input.PasswordVisualTransformation] to
- * create a password text field. By default, no visual transformation is applied.
+ *   label, bottom indicator and trailing icon by default will be displayed in error color
+ * @param visualTransformation transforms the visual representation of the input [value] For
+ *   example, you can use
+ *   [PasswordVisualTransformation][androidx.compose.ui.text.input.PasswordVisualTransformation] to
+ *   create a password text field. By default, no visual transformation is applied.
  * @param keyboardOptions software keyboard options that contains configuration such as
- * [KeyboardType] and [ImeAction]
- * @param keyboardActions when the input service emits an IME action, the corresponding callback
- * is called. Note that this IME action may be different from what you specified in
- * [KeyboardOptions.imeAction]
+ *   [KeyboardType] and [ImeAction]
+ * @param keyboardActions when the input service emits an IME action, the corresponding callback is
+ *   called. Note that this IME action may be different from what you specified in
+ *   [KeyboardOptions.imeAction]
  * @param singleLine when `true`, this text field becomes a single horizontally scrolling text field
- * instead of wrapping onto multiple lines. The keyboard will be informed to not show the return key
- * as the [ImeAction]. Note that [maxLines] parameter will be ignored as the maxLines attribute will
- * be automatically set to 1.
+ *   instead of wrapping onto multiple lines. The keyboard will be informed to not show the return
+ *   key as the [ImeAction]. Note that [maxLines] parameter will be ignored as the maxLines
+ *   attribute will be automatically set to 1.
  * @param maxLines the maximum height in terms of maximum number of visible lines. It is required
- * that 1 <= [minLines] <= [maxLines]. This parameter is ignored when [singleLine] is true.
+ *   that 1 <= [minLines] <= [maxLines]. This parameter is ignored when [singleLine] is true.
  * @param minLines the minimum height in terms of minimum number of visible lines. It is required
- * that 1 <= [minLines] <= [maxLines]. This parameter is ignored when [singleLine] is true.
+ *   that 1 <= [minLines] <= [maxLines]. This parameter is ignored when [singleLine] is true.
  * @param interactionSource an optional hoisted [MutableInteractionSource] for observing and
- * emitting [Interaction]s for this text field. You can use this to change the text field's
- * appearance or preview the text field in different states. Note that if `null` is provided,
- * interactions will still happen internally.
+ *   emitting [Interaction]s for this text field. You can use this to change the text field's
+ *   appearance or preview the text field in different states. Note that if `null` is provided,
+ *   interactions will still happen internally.
  * @param shape defines the shape of this text field's border
  * @param colors [TextFieldColors] that will be used to resolve the colors used for this text field
- * in different states. See [OutlinedTextFieldDefaults.colors].
+ *   in different states. See [OutlinedTextFieldDefaults.colors].
  */
 @OptIn(ExperimentalMaterial3Api::class)
 @Composable
@@ -193,10 +195,11 @@
     @Suppress("NAME_SHADOWING")
     val interactionSource = interactionSource ?: remember { MutableInteractionSource() }
     // If color is not provided via the text style, use content color as a default
-    val textColor = textStyle.color.takeOrElse {
-        val focused = interactionSource.collectIsFocusedAsState().value
-        colors.textColor(enabled, isError, focused)
-    }
+    val textColor =
+        textStyle.color.takeOrElse {
+            val focused = interactionSource.collectIsFocusedAsState().value
+            colors.textColor(enabled, isError, focused)
+        }
     val mergedTextStyle = textStyle.merge(TextStyle(color = textColor))
 
     val density = LocalDensity.current
@@ -204,23 +207,24 @@
     CompositionLocalProvider(LocalTextSelectionColors provides colors.textSelectionColors) {
         BasicTextField(
             value = value,
-            modifier = modifier
-                .then(
-                    if (label != null) {
-                        Modifier
-                            // Merge semantics at the beginning of the modifier chain to ensure
-                            // padding is considered part of the text field.
-                            .semantics(mergeDescendants = true) {}
-                            .padding(top = with(density) { OutlinedTextFieldTopPadding.toDp() })
-                    } else {
-                        Modifier
-                    }
-                )
-                .defaultErrorSemantics(isError, getString(Strings.DefaultErrorMessage))
-                .defaultMinSize(
-                    minWidth = OutlinedTextFieldDefaults.MinWidth,
-                    minHeight = OutlinedTextFieldDefaults.MinHeight
-                ),
+            modifier =
+                modifier
+                    .then(
+                        if (label != null) {
+                            Modifier
+                                // Merge semantics at the beginning of the modifier chain to ensure
+                                // padding is considered part of the text field.
+                                .semantics(mergeDescendants = true) {}
+                                .padding(top = with(density) { OutlinedTextFieldTopPadding.toDp() })
+                        } else {
+                            Modifier
+                        }
+                    )
+                    .defaultErrorSemantics(isError, getString(Strings.DefaultErrorMessage))
+                    .defaultMinSize(
+                        minWidth = OutlinedTextFieldDefaults.MinWidth,
+                        minHeight = OutlinedTextFieldDefaults.MinHeight
+                    ),
             onValueChange = onValueChange,
             enabled = enabled,
             readOnly = readOnly,
@@ -233,104 +237,108 @@
             singleLine = singleLine,
             maxLines = maxLines,
             minLines = minLines,
-            decorationBox = @Composable { innerTextField ->
-                OutlinedTextFieldDefaults.DecorationBox(
-                    value = value,
-                    visualTransformation = visualTransformation,
-                    innerTextField = innerTextField,
-                    placeholder = placeholder,
-                    label = label,
-                    leadingIcon = leadingIcon,
-                    trailingIcon = trailingIcon,
-                    prefix = prefix,
-                    suffix = suffix,
-                    supportingText = supportingText,
-                    singleLine = singleLine,
-                    enabled = enabled,
-                    isError = isError,
-                    interactionSource = interactionSource,
-                    colors = colors,
-                    container = {
-                        OutlinedTextFieldDefaults.Container(
-                            enabled = enabled,
-                            isError = isError,
-                            interactionSource = interactionSource,
-                            colors = colors,
-                            shape = shape,
-                        )
-                    }
-                )
-            }
+            decorationBox =
+                @Composable { innerTextField ->
+                    OutlinedTextFieldDefaults.DecorationBox(
+                        value = value,
+                        visualTransformation = visualTransformation,
+                        innerTextField = innerTextField,
+                        placeholder = placeholder,
+                        label = label,
+                        leadingIcon = leadingIcon,
+                        trailingIcon = trailingIcon,
+                        prefix = prefix,
+                        suffix = suffix,
+                        supportingText = supportingText,
+                        singleLine = singleLine,
+                        enabled = enabled,
+                        isError = isError,
+                        interactionSource = interactionSource,
+                        colors = colors,
+                        container = {
+                            OutlinedTextFieldDefaults.Container(
+                                enabled = enabled,
+                                isError = isError,
+                                interactionSource = interactionSource,
+                                colors = colors,
+                                shape = shape,
+                            )
+                        }
+                    )
+                }
         )
     }
 }
 
 /**
- * <a href="https://m3.material.io/components/text-fields/overview" class="external" target="_blank">Material Design outlined text field</a>.
+ * <a href="https://m3.material.io/components/text-fields/overview" class="external"
+ * target="_blank">Material Design outlined text field</a>.
  *
  * Text fields allow users to enter text into a UI. They typically appear in forms and dialogs.
  * Outlined text fields have less visual emphasis than filled text fields. When they appear in
  * places like forms, where many text fields are placed together, their reduced emphasis helps
  * simplify the layout.
  *
- * ![Outlined text field image](https://developer.android.com/images/reference/androidx/compose/material3/outlined-text-field.png)
+ * ![Outlined text field
+ * image](https://developer.android.com/images/reference/androidx/compose/material3/outlined-text-field.png)
  *
  * See example usage:
+ *
  * @sample androidx.compose.material3.samples.OutlinedTextFieldSample
  *
- * This overload provides access to the input text, cursor position and selection range and
- * IME composition. If you only want to observe an input text change, use the OutlinedTextField
- * overload with the [String] parameter instead.
+ * This overload provides access to the input text, cursor position and selection range and IME
+ * composition. If you only want to observe an input text change, use the OutlinedTextField overload
+ * with the [String] parameter instead.
  *
  * @param value the input [TextFieldValue] to be shown in the text field
  * @param onValueChange the callback that is triggered when the input service updates values in
- * [TextFieldValue]. An updated [TextFieldValue] comes as a parameter of the callback
+ *   [TextFieldValue]. An updated [TextFieldValue] comes as a parameter of the callback
  * @param modifier the [Modifier] to be applied to this text field
  * @param enabled controls the enabled state of this text field. When `false`, this component will
- * not respond to user input, and it will appear visually disabled and disabled to accessibility
- * services.
+ *   not respond to user input, and it will appear visually disabled and disabled to accessibility
+ *   services.
  * @param readOnly controls the editable state of the text field. When `true`, the text field cannot
- * be modified. However, a user can focus it and copy text from it. Read-only text fields are
- * usually used to display pre-filled forms that a user cannot edit.
+ *   be modified. However, a user can focus it and copy text from it. Read-only text fields are
+ *   usually used to display pre-filled forms that a user cannot edit.
  * @param textStyle the style to be applied to the input text. Defaults to [LocalTextStyle].
- * @param label the optional label to be displayed inside the text field container. The default
- * text style for internal [Text] is [Typography.bodySmall] when the text field is in focus and
- * [Typography.bodyLarge] when the text field is not in focus
+ * @param label the optional label to be displayed inside the text field container. The default text
+ *   style for internal [Text] is [Typography.bodySmall] when the text field is in focus and
+ *   [Typography.bodyLarge] when the text field is not in focus
  * @param placeholder the optional placeholder to be displayed when the text field is in focus and
- * the input text is empty. The default text style for internal [Text] is [Typography.bodyLarge]
+ *   the input text is empty. The default text style for internal [Text] is [Typography.bodyLarge]
  * @param leadingIcon the optional leading icon to be displayed at the beginning of the text field
- * container
+ *   container
  * @param trailingIcon the optional trailing icon to be displayed at the end of the text field
- * container
+ *   container
  * @param prefix the optional prefix to be displayed before the input text in the text field
  * @param suffix the optional suffix to be displayed after the input text in the text field
  * @param supportingText the optional supporting text to be displayed below the text field
- * @param isError indicates if the text field's current value is in error state. If set to
- * true, the label, bottom indicator and trailing icon by default will be displayed in error color
- * @param visualTransformation transforms the visual representation of the input [value]
- * For example, you can use
- * [PasswordVisualTransformation][androidx.compose.ui.text.input.PasswordVisualTransformation] to
- * create a password text field. By default, no visual transformation is applied.
+ * @param isError indicates if the text field's current value is in error state. If set to true, the
+ *   label, bottom indicator and trailing icon by default will be displayed in error color
+ * @param visualTransformation transforms the visual representation of the input [value] For
+ *   example, you can use
+ *   [PasswordVisualTransformation][androidx.compose.ui.text.input.PasswordVisualTransformation] to
+ *   create a password text field. By default, no visual transformation is applied.
  * @param keyboardOptions software keyboard options that contains configuration such as
- * [KeyboardType] and [ImeAction]
- * @param keyboardActions when the input service emits an IME action, the corresponding callback
- * is called. Note that this IME action may be different from what you specified in
- * [KeyboardOptions.imeAction]
+ *   [KeyboardType] and [ImeAction]
+ * @param keyboardActions when the input service emits an IME action, the corresponding callback is
+ *   called. Note that this IME action may be different from what you specified in
+ *   [KeyboardOptions.imeAction]
  * @param singleLine when `true`, this text field becomes a single horizontally scrolling text field
- * instead of wrapping onto multiple lines. The keyboard will be informed to not show the return key
- * as the [ImeAction]. Note that [maxLines] parameter will be ignored as the maxLines attribute will
- * be automatically set to 1.
+ *   instead of wrapping onto multiple lines. The keyboard will be informed to not show the return
+ *   key as the [ImeAction]. Note that [maxLines] parameter will be ignored as the maxLines
+ *   attribute will be automatically set to 1.
  * @param maxLines the maximum height in terms of maximum number of visible lines. It is required
- * that 1 <= [minLines] <= [maxLines]. This parameter is ignored when [singleLine] is true.
+ *   that 1 <= [minLines] <= [maxLines]. This parameter is ignored when [singleLine] is true.
  * @param minLines the minimum height in terms of minimum number of visible lines. It is required
- * that 1 <= [minLines] <= [maxLines]. This parameter is ignored when [singleLine] is true.
+ *   that 1 <= [minLines] <= [maxLines]. This parameter is ignored when [singleLine] is true.
  * @param interactionSource an optional hoisted [MutableInteractionSource] for observing and
- * emitting [Interaction]s for this text field. You can use this to change the text field's
- * appearance or preview the text field in different states. Note that if `null` is provided,
- * interactions will still happen internally.
+ *   emitting [Interaction]s for this text field. You can use this to change the text field's
+ *   appearance or preview the text field in different states. Note that if `null` is provided,
+ *   interactions will still happen internally.
  * @param shape defines the shape of this text field's border
  * @param colors [TextFieldColors] that will be used to resolve the colors used for this text field
- * in different states. See [OutlinedTextFieldDefaults.colors].
+ *   in different states. See [OutlinedTextFieldDefaults.colors].
  */
 @OptIn(ExperimentalMaterial3Api::class)
 @Composable
@@ -362,10 +370,11 @@
     @Suppress("NAME_SHADOWING")
     val interactionSource = interactionSource ?: remember { MutableInteractionSource() }
     // If color is not provided via the text style, use content color as a default
-    val textColor = textStyle.color.takeOrElse {
-        val focused = interactionSource.collectIsFocusedAsState().value
-        colors.textColor(enabled, isError, focused)
-    }
+    val textColor =
+        textStyle.color.takeOrElse {
+            val focused = interactionSource.collectIsFocusedAsState().value
+            colors.textColor(enabled, isError, focused)
+        }
     val mergedTextStyle = textStyle.merge(TextStyle(color = textColor))
 
     val density = LocalDensity.current
@@ -373,23 +382,24 @@
     CompositionLocalProvider(LocalTextSelectionColors provides colors.textSelectionColors) {
         BasicTextField(
             value = value,
-            modifier = modifier
-                .then(
-                    if (label != null) {
-                        Modifier
-                            // Merge semantics at the beginning of the modifier chain to ensure
-                            // padding is considered part of the text field.
-                            .semantics(mergeDescendants = true) {}
-                            .padding(top = with(density) { OutlinedTextFieldTopPadding.toDp() })
-                    } else {
-                        Modifier
-                    }
-                )
-                .defaultErrorSemantics(isError, getString(Strings.DefaultErrorMessage))
-                .defaultMinSize(
-                    minWidth = OutlinedTextFieldDefaults.MinWidth,
-                    minHeight = OutlinedTextFieldDefaults.MinHeight
-                ),
+            modifier =
+                modifier
+                    .then(
+                        if (label != null) {
+                            Modifier
+                                // Merge semantics at the beginning of the modifier chain to ensure
+                                // padding is considered part of the text field.
+                                .semantics(mergeDescendants = true) {}
+                                .padding(top = with(density) { OutlinedTextFieldTopPadding.toDp() })
+                        } else {
+                            Modifier
+                        }
+                    )
+                    .defaultErrorSemantics(isError, getString(Strings.DefaultErrorMessage))
+                    .defaultMinSize(
+                        minWidth = OutlinedTextFieldDefaults.MinWidth,
+                        minHeight = OutlinedTextFieldDefaults.MinHeight
+                    ),
             onValueChange = onValueChange,
             enabled = enabled,
             readOnly = readOnly,
@@ -402,43 +412,43 @@
             singleLine = singleLine,
             maxLines = maxLines,
             minLines = minLines,
-            decorationBox = @Composable { innerTextField ->
-                OutlinedTextFieldDefaults.DecorationBox(
-                    value = value.text,
-                    visualTransformation = visualTransformation,
-                    innerTextField = innerTextField,
-                    placeholder = placeholder,
-                    label = label,
-                    leadingIcon = leadingIcon,
-                    trailingIcon = trailingIcon,
-                    prefix = prefix,
-                    suffix = suffix,
-                    supportingText = supportingText,
-                    singleLine = singleLine,
-                    enabled = enabled,
-                    isError = isError,
-                    interactionSource = interactionSource,
-                    colors = colors,
-                    container = {
-                        OutlinedTextFieldDefaults.Container(
-                            enabled = enabled,
-                            isError = isError,
-                            interactionSource = interactionSource,
-                            colors = colors,
-                            shape = shape,
-                        )
-                    }
-                )
-            }
+            decorationBox =
+                @Composable { innerTextField ->
+                    OutlinedTextFieldDefaults.DecorationBox(
+                        value = value.text,
+                        visualTransformation = visualTransformation,
+                        innerTextField = innerTextField,
+                        placeholder = placeholder,
+                        label = label,
+                        leadingIcon = leadingIcon,
+                        trailingIcon = trailingIcon,
+                        prefix = prefix,
+                        suffix = suffix,
+                        supportingText = supportingText,
+                        singleLine = singleLine,
+                        enabled = enabled,
+                        isError = isError,
+                        interactionSource = interactionSource,
+                        colors = colors,
+                        container = {
+                            OutlinedTextFieldDefaults.Container(
+                                enabled = enabled,
+                                isError = isError,
+                                interactionSource = interactionSource,
+                                colors = colors,
+                                shape = shape,
+                            )
+                        }
+                    )
+                }
         )
     }
 }
 
 /**
  * Layout of the leading and trailing icons and the text field, label and placeholder in
- * [OutlinedTextField].
- * It doesn't use Row to position the icons and middle part because label should not be
- * positioned in the middle part.
+ * [OutlinedTextField]. It doesn't use Row to position the icons and middle part because label
+ * should not be positioned in the middle part.
  */
 @Composable
 internal fun OutlinedTextFieldLayout(
@@ -457,14 +467,15 @@
     supporting: @Composable (() -> Unit)?,
     paddingValues: PaddingValues
 ) {
-    val measurePolicy = remember(onLabelMeasured, singleLine, animationProgress, paddingValues) {
-        OutlinedTextFieldMeasurePolicy(
-            onLabelMeasured,
-            singleLine,
-            animationProgress,
-            paddingValues
-        )
-    }
+    val measurePolicy =
+        remember(onLabelMeasured, singleLine, animationProgress, paddingValues) {
+            OutlinedTextFieldMeasurePolicy(
+                onLabelMeasured,
+                singleLine,
+                animationProgress,
+                paddingValues
+            )
+        }
     val layoutDirection = LocalLayoutDirection.current
     Layout(
         modifier = modifier,
@@ -491,21 +502,22 @@
             val startTextFieldPadding = paddingValues.calculateStartPadding(layoutDirection)
             val endTextFieldPadding = paddingValues.calculateEndPadding(layoutDirection)
 
-            val startPadding = if (leading != null) {
-                (startTextFieldPadding - HorizontalIconPadding).coerceAtLeast(0.dp)
-            } else {
-                startTextFieldPadding
-            }
-            val endPadding = if (trailing != null) {
-                (endTextFieldPadding - HorizontalIconPadding).coerceAtLeast(0.dp)
-            } else {
-                endTextFieldPadding
-            }
+            val startPadding =
+                if (leading != null) {
+                    (startTextFieldPadding - HorizontalIconPadding).coerceAtLeast(0.dp)
+                } else {
+                    startTextFieldPadding
+                }
+            val endPadding =
+                if (trailing != null) {
+                    (endTextFieldPadding - HorizontalIconPadding).coerceAtLeast(0.dp)
+                } else {
+                    endTextFieldPadding
+                }
 
             if (prefix != null) {
                 Box(
-                    Modifier
-                        .layoutId(PrefixId)
+                    Modifier.layoutId(PrefixId)
                         .heightIn(min = MinTextLineHeight)
                         .wrapContentHeight()
                         .padding(start = startPadding, end = PrefixSuffixTextPadding)
@@ -515,8 +527,7 @@
             }
             if (suffix != null) {
                 Box(
-                    Modifier
-                        .layoutId(SuffixId)
+                    Modifier.layoutId(SuffixId)
                         .heightIn(min = MinTextLineHeight)
                         .wrapContentHeight()
                         .padding(start = PrefixSuffixTextPadding, end = endPadding)
@@ -525,44 +536,51 @@
                 }
             }
 
-            val textPadding = Modifier
-                .heightIn(min = MinTextLineHeight)
-                .wrapContentHeight()
-                .padding(
-                    start = if (prefix == null) startPadding else 0.dp,
-                    end = if (suffix == null) endPadding else 0.dp,
-                )
+            val textPadding =
+                Modifier.heightIn(min = MinTextLineHeight)
+                    .wrapContentHeight()
+                    .padding(
+                        start = if (prefix == null) startPadding else 0.dp,
+                        end = if (suffix == null) endPadding else 0.dp,
+                    )
 
             if (placeholder != null) {
-                placeholder(Modifier
-                    .layoutId(PlaceholderId)
-                    .then(textPadding))
+                placeholder(Modifier.layoutId(PlaceholderId).then(textPadding))
             }
 
             Box(
-                modifier = Modifier
-                    .layoutId(TextFieldId)
-                    .then(textPadding),
+                modifier = Modifier.layoutId(TextFieldId).then(textPadding),
                 propagateMinConstraints = true
             ) {
                 textField()
             }
 
             if (label != null) {
-                Box(Modifier
-                    .heightIn(min = lerp(
-                        MinTextLineHeight, MinFocusedLabelLineHeight, animationProgress))
-                    .wrapContentHeight()
-                    .layoutId(LabelId)) { label() }
+                Box(
+                    Modifier.heightIn(
+                            min =
+                                lerp(
+                                    MinTextLineHeight,
+                                    MinFocusedLabelLineHeight,
+                                    animationProgress
+                                )
+                        )
+                        .wrapContentHeight()
+                        .layoutId(LabelId)
+                ) {
+                    label()
+                }
             }
 
             if (supporting != null) {
-                Box(Modifier
-                    .layoutId(SupportingId)
-                    .heightIn(min = MinSupportingTextLineHeight)
-                    .wrapContentHeight()
-                    .padding(TextFieldDefaults.supportingTextPadding())
-                ) { supporting() }
+                Box(
+                    Modifier.layoutId(SupportingId)
+                        .heightIn(min = MinSupportingTextLineHeight)
+                        .wrapContentHeight()
+                        .padding(TextFieldDefaults.supportingTextPadding())
+                ) {
+                    supporting()
+                }
             }
         },
         measurePolicy = measurePolicy
@@ -586,47 +604,54 @@
         val relaxedConstraints = constraints.copy(minWidth = 0, minHeight = 0)
 
         // measure leading icon
-        val leadingPlaceable = measurables.fastFirstOrNull {
-            it.layoutId == LeadingId
-        }?.measure(relaxedConstraints)
+        val leadingPlaceable =
+            measurables.fastFirstOrNull { it.layoutId == LeadingId }?.measure(relaxedConstraints)
         occupiedSpaceHorizontally += widthOrZero(leadingPlaceable)
         occupiedSpaceVertically = max(occupiedSpaceVertically, heightOrZero(leadingPlaceable))
 
         // measure trailing icon
-        val trailingPlaceable = measurables.fastFirstOrNull { it.layoutId == TrailingId }
-            ?.measure(relaxedConstraints.offset(horizontal = -occupiedSpaceHorizontally))
+        val trailingPlaceable =
+            measurables
+                .fastFirstOrNull { it.layoutId == TrailingId }
+                ?.measure(relaxedConstraints.offset(horizontal = -occupiedSpaceHorizontally))
         occupiedSpaceHorizontally += widthOrZero(trailingPlaceable)
         occupiedSpaceVertically = max(occupiedSpaceVertically, heightOrZero(trailingPlaceable))
 
         // measure prefix
-        val prefixPlaceable = measurables.fastFirstOrNull { it.layoutId == PrefixId }
-            ?.measure(relaxedConstraints.offset(horizontal = -occupiedSpaceHorizontally))
+        val prefixPlaceable =
+            measurables
+                .fastFirstOrNull { it.layoutId == PrefixId }
+                ?.measure(relaxedConstraints.offset(horizontal = -occupiedSpaceHorizontally))
         occupiedSpaceHorizontally += widthOrZero(prefixPlaceable)
         occupiedSpaceVertically = max(occupiedSpaceVertically, heightOrZero(prefixPlaceable))
 
         // measure suffix
-        val suffixPlaceable = measurables.fastFirstOrNull { it.layoutId == SuffixId }
-            ?.measure(relaxedConstraints.offset(horizontal = -occupiedSpaceHorizontally))
+        val suffixPlaceable =
+            measurables
+                .fastFirstOrNull { it.layoutId == SuffixId }
+                ?.measure(relaxedConstraints.offset(horizontal = -occupiedSpaceHorizontally))
         occupiedSpaceHorizontally += widthOrZero(suffixPlaceable)
         occupiedSpaceVertically = max(occupiedSpaceVertically, heightOrZero(suffixPlaceable))
 
         // measure label
         val labelHorizontalPaddingOffset =
             paddingValues.calculateLeftPadding(layoutDirection).roundToPx() +
-            paddingValues.calculateRightPadding(layoutDirection).roundToPx()
-        val labelConstraints = relaxedConstraints.offset(
-            horizontal = lerp(
-                -occupiedSpaceHorizontally - labelHorizontalPaddingOffset, // label in middle
-                -labelHorizontalPaddingOffset, // label at top
-                animationProgress,
-            ),
-            vertical = -bottomPadding
-        )
+                paddingValues.calculateRightPadding(layoutDirection).roundToPx()
+        val labelConstraints =
+            relaxedConstraints.offset(
+                horizontal =
+                    lerp(
+                        -occupiedSpaceHorizontally -
+                            labelHorizontalPaddingOffset, // label in middle
+                        -labelHorizontalPaddingOffset, // label at top
+                        animationProgress,
+                    ),
+                vertical = -bottomPadding
+            )
         val labelPlaceable =
             measurables.fastFirstOrNull { it.layoutId == LabelId }?.measure(labelConstraints)
-        val labelSize = labelPlaceable?.let {
-            Size(it.width.toFloat(), it.height.toFloat())
-        } ?: Size.Zero
+        val labelSize =
+            labelPlaceable?.let { Size(it.width.toFloat(), it.height.toFloat()) } ?: Size.Zero
         onLabelMeasured(labelSize)
 
         // supporting text must be measured after other elements, but we
@@ -636,27 +661,32 @@
             supportingMeasurable?.minIntrinsicHeight(constraints.minWidth) ?: 0
 
         // measure text field
-        val topPadding = max(
-            heightOrZero(labelPlaceable) / 2,
-            paddingValues.calculateTopPadding().roundToPx()
-        )
-        val textConstraints = constraints.offset(
-            horizontal = -occupiedSpaceHorizontally,
-            vertical = -bottomPadding - topPadding - supportingIntrinsicHeight
-        ).copy(minHeight = 0)
+        val topPadding =
+            max(heightOrZero(labelPlaceable) / 2, paddingValues.calculateTopPadding().roundToPx())
+        val textConstraints =
+            constraints
+                .offset(
+                    horizontal = -occupiedSpaceHorizontally,
+                    vertical = -bottomPadding - topPadding - supportingIntrinsicHeight
+                )
+                .copy(minHeight = 0)
         val textFieldPlaceable =
             measurables.fastFirst { it.layoutId == TextFieldId }.measure(textConstraints)
 
         // measure placeholder
         val placeholderConstraints = textConstraints.copy(minWidth = 0)
-        val placeholderPlaceable = measurables.fastFirstOrNull { it.layoutId == PlaceholderId }
-            ?.measure(placeholderConstraints)
+        val placeholderPlaceable =
+            measurables
+                .fastFirstOrNull { it.layoutId == PlaceholderId }
+                ?.measure(placeholderConstraints)
 
-        occupiedSpaceVertically = max(
-            occupiedSpaceVertically,
-            max(heightOrZero(textFieldPlaceable), heightOrZero(placeholderPlaceable)) +
-                topPadding + bottomPadding
-        )
+        occupiedSpaceVertically =
+            max(
+                occupiedSpaceVertically,
+                max(heightOrZero(textFieldPlaceable), heightOrZero(placeholderPlaceable)) +
+                    topPadding +
+                    bottomPadding
+            )
 
         val width =
             calculateWidth(
@@ -674,9 +704,10 @@
             )
 
         // measure supporting text
-        val supportingConstraints = relaxedConstraints.offset(
-            vertical = -occupiedSpaceVertically
-        ).copy(minHeight = 0, maxWidth = width)
+        val supportingConstraints =
+            relaxedConstraints
+                .offset(vertical = -occupiedSpaceVertically)
+                .copy(minHeight = 0, maxWidth = width)
         val supportingPlaceable = supportingMeasurable?.measure(supportingConstraints)
         val supportingHeight = heightOrZero(supportingPlaceable)
 
@@ -697,14 +728,17 @@
             )
         val height = totalHeight - supportingHeight
 
-        val containerPlaceable = measurables.fastFirst { it.layoutId == ContainerId }.measure(
-            Constraints(
-                minWidth = if (width != Constraints.Infinity) width else 0,
-                maxWidth = width,
-                minHeight = if (height != Constraints.Infinity) height else 0,
-                maxHeight = height
-            )
-        )
+        val containerPlaceable =
+            measurables
+                .fastFirst { it.layoutId == ContainerId }
+                .measure(
+                    Constraints(
+                        minWidth = if (width != Constraints.Infinity) width else 0,
+                        maxWidth = width,
+                        minHeight = if (height != Constraints.Infinity) height else 0,
+                        maxHeight = height
+                    )
+                )
         return layout(width, totalHeight) {
             place(
                 totalHeight = totalHeight,
@@ -770,24 +804,30 @@
     ): Int {
         val textFieldWidth =
             intrinsicMeasurer(measurables.fastFirst { it.layoutId == TextFieldId }, height)
-        val labelWidth = measurables.fastFirstOrNull { it.layoutId == LabelId }?.let {
-            intrinsicMeasurer(it, height)
-        } ?: 0
-        val trailingWidth = measurables.fastFirstOrNull { it.layoutId == TrailingId }?.let {
-            intrinsicMeasurer(it, height)
-        } ?: 0
-        val leadingWidth = measurables.fastFirstOrNull { it.layoutId == LeadingId }?.let {
-            intrinsicMeasurer(it, height)
-        } ?: 0
-        val prefixWidth = measurables.fastFirstOrNull { it.layoutId == PrefixId }?.let {
-            intrinsicMeasurer(it, height)
-        } ?: 0
-        val suffixWidth = measurables.fastFirstOrNull { it.layoutId == SuffixId }?.let {
-            intrinsicMeasurer(it, height)
-        } ?: 0
-        val placeholderWidth = measurables.fastFirstOrNull { it.layoutId == PlaceholderId }?.let {
-            intrinsicMeasurer(it, height)
-        } ?: 0
+        val labelWidth =
+            measurables
+                .fastFirstOrNull { it.layoutId == LabelId }
+                ?.let { intrinsicMeasurer(it, height) } ?: 0
+        val trailingWidth =
+            measurables
+                .fastFirstOrNull { it.layoutId == TrailingId }
+                ?.let { intrinsicMeasurer(it, height) } ?: 0
+        val leadingWidth =
+            measurables
+                .fastFirstOrNull { it.layoutId == LeadingId }
+                ?.let { intrinsicMeasurer(it, height) } ?: 0
+        val prefixWidth =
+            measurables
+                .fastFirstOrNull { it.layoutId == PrefixId }
+                ?.let { intrinsicMeasurer(it, height) } ?: 0
+        val suffixWidth =
+            measurables
+                .fastFirstOrNull { it.layoutId == SuffixId }
+                ?.let { intrinsicMeasurer(it, height) } ?: 0
+        val placeholderWidth =
+            measurables
+                .fastFirstOrNull { it.layoutId == PlaceholderId }
+                ?.let { intrinsicMeasurer(it, height) } ?: 0
         return calculateWidth(
             leadingPlaceableWidth = leadingWidth,
             trailingPlaceableWidth = trailingWidth,
@@ -809,48 +849,67 @@
         intrinsicMeasurer: (IntrinsicMeasurable, Int) -> Int
     ): Int {
         var remainingWidth = width
-        val leadingHeight = measurables.fastFirstOrNull { it.layoutId == LeadingId }?.let {
-            remainingWidth = remainingWidth.substractConstraintSafely(
-                it.maxIntrinsicWidth(Constraints.Infinity)
-            )
-            intrinsicMeasurer(it, width)
-        } ?: 0
-        val trailingHeight = measurables.fastFirstOrNull { it.layoutId == TrailingId }?.let {
-            remainingWidth = remainingWidth.substractConstraintSafely(
-                it.maxIntrinsicWidth(Constraints.Infinity)
-            )
-            intrinsicMeasurer(it, width)
-        } ?: 0
+        val leadingHeight =
+            measurables
+                .fastFirstOrNull { it.layoutId == LeadingId }
+                ?.let {
+                    remainingWidth =
+                        remainingWidth.substractConstraintSafely(
+                            it.maxIntrinsicWidth(Constraints.Infinity)
+                        )
+                    intrinsicMeasurer(it, width)
+                } ?: 0
+        val trailingHeight =
+            measurables
+                .fastFirstOrNull { it.layoutId == TrailingId }
+                ?.let {
+                    remainingWidth =
+                        remainingWidth.substractConstraintSafely(
+                            it.maxIntrinsicWidth(Constraints.Infinity)
+                        )
+                    intrinsicMeasurer(it, width)
+                } ?: 0
 
-        val labelHeight = measurables.fastFirstOrNull { it.layoutId == LabelId }?.let {
-            intrinsicMeasurer(it, lerp(remainingWidth, width, animationProgress))
-        } ?: 0
+        val labelHeight =
+            measurables
+                .fastFirstOrNull { it.layoutId == LabelId }
+                ?.let { intrinsicMeasurer(it, lerp(remainingWidth, width, animationProgress)) } ?: 0
 
-        val prefixHeight = measurables.fastFirstOrNull { it.layoutId == PrefixId }?.let {
-            val height = intrinsicMeasurer(it, remainingWidth)
-            remainingWidth = remainingWidth.substractConstraintSafely(
-                it.maxIntrinsicWidth(Constraints.Infinity)
-            )
-            height
-        } ?: 0
-        val suffixHeight = measurables.fastFirstOrNull { it.layoutId == SuffixId }?.let {
-            val height = intrinsicMeasurer(it, remainingWidth)
-            remainingWidth = remainingWidth.substractConstraintSafely(
-                it.maxIntrinsicWidth(Constraints.Infinity)
-            )
-            height
-        } ?: 0
+        val prefixHeight =
+            measurables
+                .fastFirstOrNull { it.layoutId == PrefixId }
+                ?.let {
+                    val height = intrinsicMeasurer(it, remainingWidth)
+                    remainingWidth =
+                        remainingWidth.substractConstraintSafely(
+                            it.maxIntrinsicWidth(Constraints.Infinity)
+                        )
+                    height
+                } ?: 0
+        val suffixHeight =
+            measurables
+                .fastFirstOrNull { it.layoutId == SuffixId }
+                ?.let {
+                    val height = intrinsicMeasurer(it, remainingWidth)
+                    remainingWidth =
+                        remainingWidth.substractConstraintSafely(
+                            it.maxIntrinsicWidth(Constraints.Infinity)
+                        )
+                    height
+                } ?: 0
 
         val textFieldHeight =
             intrinsicMeasurer(measurables.fastFirst { it.layoutId == TextFieldId }, remainingWidth)
 
-        val placeholderHeight = measurables.fastFirstOrNull { it.layoutId == PlaceholderId }?.let {
-            intrinsicMeasurer(it, remainingWidth)
-        } ?: 0
+        val placeholderHeight =
+            measurables
+                .fastFirstOrNull { it.layoutId == PlaceholderId }
+                ?.let { intrinsicMeasurer(it, remainingWidth) } ?: 0
 
-        val supportingHeight = measurables.fastFirstOrNull { it.layoutId == SupportingId }?.let {
-            intrinsicMeasurer(it, width)
-        } ?: 0
+        val supportingHeight =
+            measurables
+                .fastFirstOrNull { it.layoutId == SupportingId }
+                ?.let { intrinsicMeasurer(it, width) } ?: 0
 
         return calculateHeight(
             leadingHeight = leadingHeight,
@@ -893,18 +952,20 @@
     paddingValues: PaddingValues,
 ): Int {
     val affixTotalWidth = prefixPlaceableWidth + suffixPlaceableWidth
-    val middleSection = maxOf(
-        textFieldPlaceableWidth + affixTotalWidth,
-        placeholderPlaceableWidth + affixTotalWidth,
-        // Prefix/suffix does not get applied to label
-        lerp(labelPlaceableWidth, 0, animationProgress),
-    )
-    val wrappedWidth =
-        leadingPlaceableWidth + middleSection + trailingPlaceableWidth
+    val middleSection =
+        maxOf(
+            textFieldPlaceableWidth + affixTotalWidth,
+            placeholderPlaceableWidth + affixTotalWidth,
+            // Prefix/suffix does not get applied to label
+            lerp(labelPlaceableWidth, 0, animationProgress),
+        )
+    val wrappedWidth = leadingPlaceableWidth + middleSection + trailingPlaceableWidth
 
     // Actual LayoutDirection doesn't matter; we only need the sum
-    val labelHorizontalPadding = (paddingValues.calculateLeftPadding(LayoutDirection.Ltr) +
-        paddingValues.calculateRightPadding(LayoutDirection.Ltr)).value * density
+    val labelHorizontalPadding =
+        (paddingValues.calculateLeftPadding(LayoutDirection.Ltr) +
+                paddingValues.calculateRightPadding(LayoutDirection.Ltr))
+            .value * density
     val focusedLabelWidth =
         ((labelPlaceableWidth + labelHorizontalPadding) * animationProgress).roundToInt()
     return maxOf(wrappedWidth, focusedLabelWidth, constraints.minWidth)
@@ -929,13 +990,14 @@
     density: Float,
     paddingValues: PaddingValues
 ): Int {
-    val inputFieldHeight = maxOf(
-        textFieldHeight,
-        placeholderHeight,
-        prefixHeight,
-        suffixHeight,
-        lerp(labelHeight, 0, animationProgress)
-    )
+    val inputFieldHeight =
+        maxOf(
+            textFieldHeight,
+            placeholderHeight,
+            prefixHeight,
+            suffixHeight,
+            lerp(labelHeight, 0, animationProgress)
+        )
     val topPadding = paddingValues.calculateTopPadding().value * density
     val actualTopPadding = lerp(topPadding, max(topPadding, labelHeight / 2f), animationProgress)
     val bottomPadding = paddingValues.calculateBottomPadding().value * density
@@ -943,11 +1005,7 @@
 
     return max(
         constraints.minHeight,
-        maxOf(
-            leadingHeight,
-            trailingHeight,
-            middleSectionHeight.roundToInt()
-        ) + supportingHeight
+        maxOf(leadingHeight, trailingHeight, middleSectionHeight.roundToInt()) + supportingHeight
     )
 }
 
@@ -994,19 +1052,20 @@
     // label position is animated
     // in single line text field, label is centered vertically before animation starts
     labelPlaceable?.let {
-        val startPositionY = if (singleLine) {
-            Alignment.CenterVertically.align(it.height, height)
-        } else {
-            topPadding
-        }
-        val positionY = lerp(startPositionY, -(it.height / 2), animationProgress)
-        val positionX = (
-            if (leadingPlaceable == null) {
-                0f
+        val startPositionY =
+            if (singleLine) {
+                Alignment.CenterVertically.align(it.height, height)
             } else {
-                (widthOrZero(leadingPlaceable) - iconPadding) * (1 - animationProgress)
+                topPadding
             }
-            ).roundToInt() + startPadding
+        val positionY = lerp(startPositionY, -(it.height / 2), animationProgress)
+        val positionX =
+            (if (leadingPlaceable == null) {
+                    0f
+                } else {
+                    (widthOrZero(leadingPlaceable) - iconPadding) * (1 - animationProgress)
+                })
+                .roundToInt() + startPadding
         it.placeRelative(positionX, positionY)
     }
 
@@ -1063,14 +1122,16 @@
             val innerPadding = OutlinedTextFieldInnerPadding.toPx()
             val leftLtr = paddingValues.calculateLeftPadding(layoutDirection).toPx() - innerPadding
             val rightLtr = leftLtr + labelWidth + 2 * innerPadding
-            val left = when (layoutDirection) {
-                LayoutDirection.Rtl -> size.width - rightLtr
-                else -> leftLtr.coerceAtLeast(0f)
-            }
-            val right = when (layoutDirection) {
-                LayoutDirection.Rtl -> size.width - leftLtr.coerceAtLeast(0f)
-                else -> rightLtr
-            }
+            val left =
+                when (layoutDirection) {
+                    LayoutDirection.Rtl -> size.width - rightLtr
+                    else -> leftLtr.coerceAtLeast(0f)
+                }
+            val right =
+                when (layoutDirection) {
+                    LayoutDirection.Rtl -> size.width - leftLtr.coerceAtLeast(0f)
+                    else -> rightLtr
+                }
             val labelHeight = labelSizeValue.height
             // using label height as a cutout area to make sure that no hairline artifacts are
             // left when we clip the border
@@ -1086,8 +1147,8 @@
 
 /**
  * In the focused state, the top half of the label sticks out above the text field. This default
- * padding is a best-effort approximation to keep the label from overlapping with the content
- * above it. It is sufficient when the label is a single line and developers do not override the
- * label's font size/style. Otherwise, developers will need to add additional padding themselves.
+ * padding is a best-effort approximation to keep the label from overlapping with the content above
+ * it. It is sufficient when the label is a single line and developers do not override the label's
+ * font size/style. Otherwise, developers will need to add additional padding themselves.
  */
 internal val OutlinedTextFieldTopPadding = TypeScaleTokens.BodySmallLineHeight / 2
diff --git a/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/ProgressIndicator.kt b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/ProgressIndicator.kt
index d193764..e93ebb20 100644
--- a/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/ProgressIndicator.kt
+++ b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/ProgressIndicator.kt
@@ -56,11 +56,13 @@
 import kotlin.math.min
 
 /**
- * <a href="https://m3.material.io/components/progress-indicators/overview" class="external" target="_blank">Determinate Material Design linear progress indicator</a>.
+ * <a href="https://m3.material.io/components/progress-indicators/overview" class="external"
+ * target="_blank">Determinate Material Design linear progress indicator</a>.
  *
  * Progress indicators express an unspecified wait time or display the duration of a process.
  *
- * ![Linear progress indicator image](https://firebasestorage.googleapis.com/v0/b/design-spec/o/projects%2Fgoogle-material-3%2Fimages%2Flqdiyyvh-1P-progress-indicator-configurations.png?alt=media)
+ * ![Linear progress indicator
+ * image](https://firebasestorage.googleapis.com/v0/b/design-spec/o/projects%2Fgoogle-material-3%2Fimages%2Flqdiyyvh-1P-progress-indicator-configurations.png?alt=media)
  *
  * By default there is no animation between [progress] values. You can use
  * [ProgressIndicatorDefaults.ProgressAnimationSpec] as the default recommended [AnimationSpec] when
@@ -69,20 +71,22 @@
  * @sample androidx.compose.material3.samples.LinearProgressIndicatorSample
  *
  * @param progress the progress of this progress indicator, where 0.0 represents no progress and 1.0
- * represents full progress. Values outside of this range are coerced into the range.
+ *   represents full progress. Values outside of this range are coerced into the range.
  * @param modifier the [Modifier] to be applied to this progress indicator
  * @param color color of this progress indicator
  * @param trackColor color of the track behind the indicator, visible when the progress has not
- * reached the area of the overall indicator yet
+ *   reached the area of the overall indicator yet
  * @param strokeCap stroke cap to use for the ends of this progress indicator
  */
 @Deprecated(
-    message = "Use the overload that takes `gapSize` and `drawStopIndicator`, see " +
-        "`LegacyLinearProgressIndicatorSample` on how to restore the previous behavior",
-    replaceWith = ReplaceWith(
-        "LinearProgressIndicator(progress, modifier, color, trackColor, strokeCap, " +
-            "gapSize, drawStopIndicator)"
-    ),
+    message =
+        "Use the overload that takes `gapSize` and `drawStopIndicator`, see " +
+            "`LegacyLinearProgressIndicatorSample` on how to restore the previous behavior",
+    replaceWith =
+        ReplaceWith(
+            "LinearProgressIndicator(progress, modifier, color, trackColor, strokeCap, " +
+                "gapSize, drawStopIndicator)"
+        ),
     level = DeprecationLevel.HIDDEN
 )
 @OptIn(ExperimentalMaterial3Api::class)
@@ -105,11 +109,13 @@
 }
 
 /**
- * <a href="https://m3.material.io/components/progress-indicators/overview" class="external" target="_blank">Determinate Material Design linear progress indicator</a>.
+ * <a href="https://m3.material.io/components/progress-indicators/overview" class="external"
+ * target="_blank">Determinate Material Design linear progress indicator</a>.
  *
  * Progress indicators express an unspecified wait time or display the duration of a process.
  *
- * ![Linear progress indicator image](https://firebasestorage.googleapis.com/v0/b/design-spec/o/projects%2Fgoogle-material-3%2Fimages%2Flqdiyyvh-1P-progress-indicator-configurations.png?alt=media)
+ * ![Linear progress indicator
+ * image](https://firebasestorage.googleapis.com/v0/b/design-spec/o/projects%2Fgoogle-material-3%2Fimages%2Flqdiyyvh-1P-progress-indicator-configurations.png?alt=media)
  *
  * By default there is no animation between [progress] values. You can use
  * [ProgressIndicatorDefaults.ProgressAnimationSpec] as the default recommended [AnimationSpec] when
@@ -118,11 +124,11 @@
  * @sample androidx.compose.material3.samples.LinearProgressIndicatorSample
  *
  * @param progress the progress of this progress indicator, where 0.0 represents no progress and 1.0
- * represents full progress. Values outside of this range are coerced into the range.
+ *   represents full progress. Values outside of this range are coerced into the range.
  * @param modifier the [Modifier] to be applied to this progress indicator
  * @param color color of this progress indicator
  * @param trackColor color of the track behind the indicator, visible when the progress has not
- * reached the area of the overall indicator yet
+ *   reached the area of the overall indicator yet
  * @param strokeCap stroke cap to use for the ends of this progress indicator
  * @param gapSize size of the gap between the progress indicator and the track
  * @param drawStopIndicator lambda that will be called to draw the stop indicator
@@ -155,11 +161,12 @@
             .size(LinearIndicatorWidth, LinearIndicatorHeight)
     ) {
         val strokeWidth = size.height
-        val adjustedGapSize = if (strokeCap == StrokeCap.Butt || size.height > size.width) {
-            gapSize
-        } else {
-            gapSize + strokeWidth.toDp()
-        }
+        val adjustedGapSize =
+            if (strokeCap == StrokeCap.Butt || size.height > size.width) {
+                gapSize
+            } else {
+                gapSize + strokeWidth.toDp()
+            }
         val gapSizeFraction = adjustedGapSize / size.width.toDp()
         val currentCoercedProgress = coercedProgress()
 
@@ -167,40 +174,38 @@
         val trackStartFraction =
             currentCoercedProgress + min(currentCoercedProgress, gapSizeFraction)
         if (trackStartFraction <= 1f) {
-            drawLinearIndicator(
-                trackStartFraction, 1f, trackColor, strokeWidth, strokeCap
-            )
+            drawLinearIndicator(trackStartFraction, 1f, trackColor, strokeWidth, strokeCap)
         }
         // indicator
-        drawLinearIndicator(
-            0f, currentCoercedProgress, color, strokeWidth, strokeCap
-        )
+        drawLinearIndicator(0f, currentCoercedProgress, color, strokeWidth, strokeCap)
         // stop
         drawStopIndicator(this)
     }
 }
 
 /**
- * <a href="https://m3.material.io/components/progress-indicators/overview" class="external" target="_blank">Indeterminate Material Design linear progress indicator</a>.
+ * <a href="https://m3.material.io/components/progress-indicators/overview" class="external"
+ * target="_blank">Indeterminate Material Design linear progress indicator</a>.
  *
  * Progress indicators express an unspecified wait time or display the duration of a process.
  *
- * ![Linear progress indicator image](https://firebasestorage.googleapis.com/v0/b/design-spec/o/projects%2Fgoogle-material-3%2Fimages%2Flqdiyyvh-1P-progress-indicator-configurations.png?alt=media)
+ * ![Linear progress indicator
+ * image](https://firebasestorage.googleapis.com/v0/b/design-spec/o/projects%2Fgoogle-material-3%2Fimages%2Flqdiyyvh-1P-progress-indicator-configurations.png?alt=media)
  *
  * @sample androidx.compose.material3.samples.IndeterminateLinearProgressIndicatorSample
  *
  * @param modifier the [Modifier] to be applied to this progress indicator
  * @param color color of this progress indicator
  * @param trackColor color of the track behind the indicator, visible when the progress has not
- * reached the area of the overall indicator yet
+ *   reached the area of the overall indicator yet
  * @param strokeCap stroke cap to use for the ends of this progress indicator
  */
 @Deprecated(
-    message = "Use the overload that takes `gapSize`, see `" +
-        "LegacyIndeterminateLinearProgressIndicatorSample` on how to restore the previous behavior",
-    replaceWith = ReplaceWith(
-        "LinearProgressIndicator(modifier, color, trackColor, strokeCap, gapSize)"
-    ),
+    message =
+        "Use the overload that takes `gapSize`, see `" +
+            "LegacyIndeterminateLinearProgressIndicatorSample` on how to restore the previous behavior",
+    replaceWith =
+        ReplaceWith("LinearProgressIndicator(modifier, color, trackColor, strokeCap, gapSize)"),
     level = DeprecationLevel.HIDDEN
 )
 @OptIn(ExperimentalMaterial3Api::class)
@@ -221,18 +226,20 @@
 }
 
 /**
- * <a href="https://m3.material.io/components/progress-indicators/overview" class="external" target="_blank">Indeterminate Material Design linear progress indicator</a>.
+ * <a href="https://m3.material.io/components/progress-indicators/overview" class="external"
+ * target="_blank">Indeterminate Material Design linear progress indicator</a>.
  *
  * Progress indicators express an unspecified wait time or display the duration of a process.
  *
- * ![Linear progress indicator image](https://firebasestorage.googleapis.com/v0/b/design-spec/o/projects%2Fgoogle-material-3%2Fimages%2Flqdiyyvh-1P-progress-indicator-configurations.png?alt=media)
+ * ![Linear progress indicator
+ * image](https://firebasestorage.googleapis.com/v0/b/design-spec/o/projects%2Fgoogle-material-3%2Fimages%2Flqdiyyvh-1P-progress-indicator-configurations.png?alt=media)
  *
  * @sample androidx.compose.material3.samples.IndeterminateLinearProgressIndicatorSample
  *
  * @param modifier the [Modifier] to be applied to this progress indicator
  * @param color color of this progress indicator
  * @param trackColor color of the track behind the indicator, visible when the progress has not
- * reached the area of the overall indicator yet
+ *   reached the area of the overall indicator yet
  * @param strokeCap stroke cap to use for the ends of this progress indicator
  * @param gapSize size of the gap between the progress indicator and the track
  */
@@ -249,50 +256,58 @@
     // Fractional position of the 'head' and 'tail' of the two lines drawn, i.e. if the head is 0.8
     // and the tail is 0.2, there is a line drawn from between 20% along to 80% along the total
     // width.
-    val firstLineHead = infiniteTransition.animateFloat(
-        0f,
-        1f,
-        infiniteRepeatable(
-            animation = keyframes {
-                durationMillis = LinearAnimationDuration
-                0f at FirstLineHeadDelay using FirstLineHeadEasing
-                1f at FirstLineHeadDuration + FirstLineHeadDelay
-            }
+    val firstLineHead =
+        infiniteTransition.animateFloat(
+            0f,
+            1f,
+            infiniteRepeatable(
+                animation =
+                    keyframes {
+                        durationMillis = LinearAnimationDuration
+                        0f at FirstLineHeadDelay using FirstLineHeadEasing
+                        1f at FirstLineHeadDuration + FirstLineHeadDelay
+                    }
+            )
         )
-    )
-    val firstLineTail = infiniteTransition.animateFloat(
-        0f,
-        1f,
-        infiniteRepeatable(
-            animation = keyframes {
-                durationMillis = LinearAnimationDuration
-                0f at FirstLineTailDelay using FirstLineTailEasing
-                1f at FirstLineTailDuration + FirstLineTailDelay
-            }
+    val firstLineTail =
+        infiniteTransition.animateFloat(
+            0f,
+            1f,
+            infiniteRepeatable(
+                animation =
+                    keyframes {
+                        durationMillis = LinearAnimationDuration
+                        0f at FirstLineTailDelay using FirstLineTailEasing
+                        1f at FirstLineTailDuration + FirstLineTailDelay
+                    }
+            )
         )
-    )
-    val secondLineHead = infiniteTransition.animateFloat(
-        0f,
-        1f,
-        infiniteRepeatable(
-            animation = keyframes {
-                durationMillis = LinearAnimationDuration
-                0f at SecondLineHeadDelay using SecondLineHeadEasing
-                1f at SecondLineHeadDuration + SecondLineHeadDelay
-            }
+    val secondLineHead =
+        infiniteTransition.animateFloat(
+            0f,
+            1f,
+            infiniteRepeatable(
+                animation =
+                    keyframes {
+                        durationMillis = LinearAnimationDuration
+                        0f at SecondLineHeadDelay using SecondLineHeadEasing
+                        1f at SecondLineHeadDuration + SecondLineHeadDelay
+                    }
+            )
         )
-    )
-    val secondLineTail = infiniteTransition.animateFloat(
-        0f,
-        1f,
-        infiniteRepeatable(
-            animation = keyframes {
-                durationMillis = LinearAnimationDuration
-                0f at SecondLineTailDelay using SecondLineTailEasing
-                1f at SecondLineTailDuration + SecondLineTailDelay
-            }
+    val secondLineTail =
+        infiniteTransition.animateFloat(
+            0f,
+            1f,
+            infiniteRepeatable(
+                animation =
+                    keyframes {
+                        durationMillis = LinearAnimationDuration
+                        0f at SecondLineTailDelay using SecondLineTailEasing
+                        1f at SecondLineTailDuration + SecondLineTailDelay
+                    }
+            )
         )
-    )
     Canvas(
         modifier
             .then(IncreaseSemanticsBounds)
@@ -300,19 +315,18 @@
             .size(LinearIndicatorWidth, LinearIndicatorHeight)
     ) {
         val strokeWidth = size.height
-        val adjustedGapSize = if (strokeCap == StrokeCap.Butt || size.height > size.width) {
-            gapSize
-        } else {
-            gapSize + strokeWidth.toDp()
-        }
+        val adjustedGapSize =
+            if (strokeCap == StrokeCap.Butt || size.height > size.width) {
+                gapSize
+            } else {
+                gapSize + strokeWidth.toDp()
+            }
         val gapSizeFraction = adjustedGapSize / size.width.toDp()
 
         // Track before line 1
         if (firstLineHead.value < 1f - gapSizeFraction) {
             val start = if (firstLineHead.value > 0) firstLineHead.value + gapSizeFraction else 0f
-            drawLinearIndicator(
-                start, 1f, trackColor, strokeWidth, strokeCap
-            )
+            drawLinearIndicator(start, 1f, trackColor, strokeWidth, strokeCap)
         }
 
         // Line 1
@@ -330,9 +344,7 @@
         if (firstLineTail.value > gapSizeFraction) {
             val start = if (secondLineHead.value > 0) secondLineHead.value + gapSizeFraction else 0f
             val end = if (firstLineTail.value < 1f) firstLineTail.value - gapSizeFraction else 1f
-            drawLinearIndicator(
-                start, end, trackColor, strokeWidth, strokeCap
-            )
+            drawLinearIndicator(start, end, trackColor, strokeWidth, strokeCap)
         }
 
         // Line 2
@@ -349,24 +361,23 @@
         // Track after line 2
         if (secondLineTail.value > gapSizeFraction) {
             val end = if (secondLineTail.value < 1) secondLineTail.value - gapSizeFraction else 1f
-            drawLinearIndicator(
-                0f, end, trackColor, strokeWidth, strokeCap
-            )
+            drawLinearIndicator(0f, end, trackColor, strokeWidth, strokeCap)
         }
     }
 }
 
 @Deprecated(
     message = "Use the overload that takes `progress` as a lambda",
-    replaceWith = ReplaceWith(
-        "LinearProgressIndicator(\n" +
-            "progress = { progress },\n" +
-            "modifier = modifier,\n" +
-            "color = color,\n" +
-            "trackColor = trackColor,\n" +
-            "strokeCap = strokeCap,\n" +
-            ")"
-    )
+    replaceWith =
+        ReplaceWith(
+            "LinearProgressIndicator(\n" +
+                "progress = { progress },\n" +
+                "modifier = modifier,\n" +
+                "color = color,\n" +
+                "trackColor = trackColor,\n" +
+                "strokeCap = strokeCap,\n" +
+                ")"
+        )
 )
 @Composable
 fun LinearProgressIndicator(
@@ -375,13 +386,14 @@
     color: Color = ProgressIndicatorDefaults.linearColor,
     trackColor: Color = ProgressIndicatorDefaults.linearTrackColor,
     strokeCap: StrokeCap = ProgressIndicatorDefaults.LinearStrokeCap,
-) = LinearProgressIndicator(
-    progress = { progress },
-    modifier = modifier,
-    color = color,
-    trackColor = trackColor,
-    strokeCap = strokeCap,
-)
+) =
+    LinearProgressIndicator(
+        progress = { progress },
+        modifier = modifier,
+        color = color,
+        trackColor = trackColor,
+        strokeCap = strokeCap,
+    )
 
 @Suppress("DEPRECATION")
 @Deprecated("Maintained for binary compatibility", level = DeprecationLevel.HIDDEN)
@@ -391,13 +403,14 @@
     modifier: Modifier = Modifier,
     color: Color = ProgressIndicatorDefaults.linearColor,
     trackColor: Color = ProgressIndicatorDefaults.linearTrackColor,
-) = LinearProgressIndicator(
-    progress,
-    modifier,
-    color,
-    trackColor,
-    strokeCap = ProgressIndicatorDefaults.LinearStrokeCap,
-)
+) =
+    LinearProgressIndicator(
+        progress,
+        modifier,
+        color,
+        trackColor,
+        strokeCap = ProgressIndicatorDefaults.LinearStrokeCap,
+    )
 
 @Deprecated("Maintained for binary compatibility", level = DeprecationLevel.HIDDEN)
 @Composable
@@ -405,12 +418,13 @@
     modifier: Modifier = Modifier,
     color: Color = ProgressIndicatorDefaults.linearColor,
     trackColor: Color = ProgressIndicatorDefaults.linearTrackColor,
-) = LinearProgressIndicator(
-    modifier,
-    color,
-    trackColor,
-    strokeCap = ProgressIndicatorDefaults.LinearStrokeCap,
-)
+) =
+    LinearProgressIndicator(
+        modifier,
+        color,
+        trackColor,
+        strokeCap = ProgressIndicatorDefaults.LinearStrokeCap,
+    )
 
 private fun DrawScope.drawLinearIndicator(
     startFraction: Float,
@@ -453,34 +467,34 @@
 }
 
 private val SemanticsBoundsPadding: Dp = 10.dp
-private val IncreaseSemanticsBounds: Modifier = Modifier
-    .layout { measurable, constraints ->
-        val paddingPx = SemanticsBoundsPadding.roundToPx()
-        // We need to add vertical padding to the semantics bounds in order to meet
-        // screenreader green box minimum size, but we also want to
-        // preserve a visual appearance and layout size below that minimum
-        // in order to maintain backwards compatibility. This custom
-        // layout effectively implements "negative padding".
-        val newConstraint = constraints.offset(0, paddingPx * 2)
-        val placeable = measurable.measure(newConstraint)
+private val IncreaseSemanticsBounds: Modifier =
+    Modifier.layout { measurable, constraints ->
+            val paddingPx = SemanticsBoundsPadding.roundToPx()
+            // We need to add vertical padding to the semantics bounds in order to meet
+            // screenreader green box minimum size, but we also want to
+            // preserve a visual appearance and layout size below that minimum
+            // in order to maintain backwards compatibility. This custom
+            // layout effectively implements "negative padding".
+            val newConstraint = constraints.offset(0, paddingPx * 2)
+            val placeable = measurable.measure(newConstraint)
 
-        // But when actually placing the placeable, create the layout without additional
-        // space. Place the placeable where it would've been without any extra padding.
-        val height = placeable.height - paddingPx * 2
-        val width = placeable.width
-        layout(width, height) {
-            placeable.place(0, -paddingPx)
+            // But when actually placing the placeable, create the layout without additional
+            // space. Place the placeable where it would've been without any extra padding.
+            val height = placeable.height - paddingPx * 2
+            val width = placeable.width
+            layout(width, height) { placeable.place(0, -paddingPx) }
         }
-    }
-    .semantics(mergeDescendants = true) {}
-    .padding(vertical = SemanticsBoundsPadding)
+        .semantics(mergeDescendants = true) {}
+        .padding(vertical = SemanticsBoundsPadding)
 
 /**
- * <a href="https://m3.material.io/components/progress-indicators/overview" class="external" target="_blank">Determinate Material Design circular progress indicator</a>.
+ * <a href="https://m3.material.io/components/progress-indicators/overview" class="external"
+ * target="_blank">Determinate Material Design circular progress indicator</a>.
  *
  * Progress indicators express an unspecified wait time or display the duration of a process.
  *
- * ![Circular progress indicator image](https://firebasestorage.googleapis.com/v0/b/design-spec/o/projects%2Fgoogle-material-3%2Fimages%2Flqdiyyvh-1P-progress-indicator-configurations.png?alt=media)
+ * ![Circular progress indicator
+ * image](https://firebasestorage.googleapis.com/v0/b/design-spec/o/projects%2Fgoogle-material-3%2Fimages%2Flqdiyyvh-1P-progress-indicator-configurations.png?alt=media)
  *
  * By default there is no animation between [progress] values. You can use
  * [ProgressIndicatorDefaults.ProgressAnimationSpec] as the default recommended [AnimationSpec] when
@@ -489,21 +503,23 @@
  * @sample androidx.compose.material3.samples.CircularProgressIndicatorSample
  *
  * @param progress the progress of this progress indicator, where 0.0 represents no progress and 1.0
- * represents full progress. Values outside of this range are coerced into the range.
+ *   represents full progress. Values outside of this range are coerced into the range.
  * @param modifier the [Modifier] to be applied to this progress indicator
  * @param color color of this progress indicator
  * @param strokeWidth stroke width of this progress indicator
  * @param trackColor color of the track behind the indicator, visible when the progress has not
- * reached the area of the overall indicator yet
+ *   reached the area of the overall indicator yet
  * @param strokeCap stroke cap to use for the ends of this progress indicator
  */
 @Deprecated(
-    message = "Use the overload that takes `gapSize`, see " +
-        "`LegacyCircularProgressIndicatorSample` on how to restore the previous behavior",
-    replaceWith = ReplaceWith(
-        "CircularProgressIndicator(progress, modifier, color, strokeWidth, trackColor, " +
-            "strokeCap, gapSize)"
-    ),
+    message =
+        "Use the overload that takes `gapSize`, see " +
+            "`LegacyCircularProgressIndicatorSample` on how to restore the previous behavior",
+    replaceWith =
+        ReplaceWith(
+            "CircularProgressIndicator(progress, modifier, color, strokeWidth, trackColor, " +
+                "strokeCap, gapSize)"
+        ),
     level = DeprecationLevel.HIDDEN
 )
 @OptIn(ExperimentalMaterial3Api::class)
@@ -528,11 +544,13 @@
 }
 
 /**
- * <a href="https://m3.material.io/components/progress-indicators/overview" class="external" target="_blank">Determinate Material Design circular progress indicator</a>.
+ * <a href="https://m3.material.io/components/progress-indicators/overview" class="external"
+ * target="_blank">Determinate Material Design circular progress indicator</a>.
  *
  * Progress indicators express an unspecified wait time or display the duration of a process.
  *
- * ![Circular progress indicator image](https://firebasestorage.googleapis.com/v0/b/design-spec/o/projects%2Fgoogle-material-3%2Fimages%2Flqdiyyvh-1P-progress-indicator-configurations.png?alt=media)
+ * ![Circular progress indicator
+ * image](https://firebasestorage.googleapis.com/v0/b/design-spec/o/projects%2Fgoogle-material-3%2Fimages%2Flqdiyyvh-1P-progress-indicator-configurations.png?alt=media)
  *
  * By default there is no animation between [progress] values. You can use
  * [ProgressIndicatorDefaults.ProgressAnimationSpec] as the default recommended [AnimationSpec] when
@@ -541,12 +559,12 @@
  * @sample androidx.compose.material3.samples.CircularProgressIndicatorSample
  *
  * @param progress the progress of this progress indicator, where 0.0 represents no progress and 1.0
- * represents full progress. Values outside of this range are coerced into the range.
+ *   represents full progress. Values outside of this range are coerced into the range.
  * @param modifier the [Modifier] to be applied to this progress indicator
  * @param color color of this progress indicator
  * @param strokeWidth stroke width of this progress indicator
  * @param trackColor color of the track behind the indicator, visible when the progress has not
- * reached the area of the overall indicator yet
+ *   reached the area of the overall indicator yet
  * @param strokeCap stroke cap to use for the ends of this progress indicator
  * @param gapSize size of the gap between the progress indicator and the track
  */
@@ -562,9 +580,7 @@
     gapSize: Dp = ProgressIndicatorDefaults.CircularIndicatorTrackGapSize,
 ) {
     val coercedProgress = { progress().coerceIn(0f, 1f) }
-    val stroke = with(LocalDensity.current) {
-        Stroke(width = strokeWidth.toPx(), cap = strokeCap)
-    }
+    val stroke = with(LocalDensity.current) { Stroke(width = strokeWidth.toPx(), cap = strokeCap) }
     Canvas(
         modifier
             .semantics(mergeDescendants = true) {
@@ -575,11 +591,12 @@
         // Start at 12 o'clock
         val startAngle = 270f
         val sweep = coercedProgress() * 360f
-        val adjustedGapSize = if (strokeCap == StrokeCap.Butt || size.height > size.width) {
-            gapSize
-        } else {
-            gapSize + strokeWidth
-        }
+        val adjustedGapSize =
+            if (strokeCap == StrokeCap.Butt || size.height > size.width) {
+                gapSize
+            } else {
+                gapSize + strokeWidth
+            }
         val gapSizeSweep =
             (adjustedGapSize.value / (Math.PI * size.width.toDp().value).toFloat()) * 360f
 
@@ -594,11 +611,13 @@
 }
 
 /**
- * <a href="https://m3.material.io/components/progress-indicators/overview" class="external" target="_blank">Indeterminate Material Design circular progress indicator</a>.
+ * <a href="https://m3.material.io/components/progress-indicators/overview" class="external"
+ * target="_blank">Indeterminate Material Design circular progress indicator</a>.
  *
  * Progress indicators express an unspecified wait time or display the duration of a process.
  *
- * ![Circular progress indicator image](https://firebasestorage.googleapis.com/v0/b/design-spec/o/projects%2Fgoogle-material-3%2Fimages%2Flqdiyyvh-1P-progress-indicator-configurations.png?alt=media)
+ * ![Circular progress indicator
+ * image](https://firebasestorage.googleapis.com/v0/b/design-spec/o/projects%2Fgoogle-material-3%2Fimages%2Flqdiyyvh-1P-progress-indicator-configurations.png?alt=media)
  *
  * @sample androidx.compose.material3.samples.IndeterminateCircularProgressIndicatorSample
  *
@@ -606,7 +625,7 @@
  * @param color color of this progress indicator
  * @param strokeWidth stroke width of this progress indicator
  * @param trackColor color of the track behind the indicator, visible when the progress has not
- * reached the area of the overall indicator yet
+ *   reached the area of the overall indicator yet
  * @param strokeCap stroke cap to use for the ends of this progress indicator
  */
 @Composable
@@ -617,62 +636,60 @@
     trackColor: Color = ProgressIndicatorDefaults.circularIndeterminateTrackColor,
     strokeCap: StrokeCap = ProgressIndicatorDefaults.CircularIndeterminateStrokeCap,
 ) {
-    val stroke = with(LocalDensity.current) {
-        Stroke(width = strokeWidth.toPx(), cap = strokeCap)
-    }
+    val stroke = with(LocalDensity.current) { Stroke(width = strokeWidth.toPx(), cap = strokeCap) }
 
     val transition = rememberInfiniteTransition()
     // The current rotation around the circle, so we know where to start the rotation from
-    val currentRotation = transition.animateValue(
-        0,
-        RotationsPerCycle,
-        Int.VectorConverter,
-        infiniteRepeatable(
-            animation = tween(
-                durationMillis = RotationDuration * RotationsPerCycle,
-                easing = LinearEasing
+    val currentRotation =
+        transition.animateValue(
+            0,
+            RotationsPerCycle,
+            Int.VectorConverter,
+            infiniteRepeatable(
+                animation =
+                    tween(
+                        durationMillis = RotationDuration * RotationsPerCycle,
+                        easing = LinearEasing
+                    )
             )
         )
-    )
     // How far forward (degrees) the base point should be from the start point
-    val baseRotation = transition.animateFloat(
-        0f,
-        BaseRotationAngle,
-        infiniteRepeatable(
-            animation = tween(
-                durationMillis = RotationDuration,
-                easing = LinearEasing
+    val baseRotation =
+        transition.animateFloat(
+            0f,
+            BaseRotationAngle,
+            infiniteRepeatable(
+                animation = tween(durationMillis = RotationDuration, easing = LinearEasing)
             )
         )
-    )
     // How far forward (degrees) both the head and tail should be from the base point
-    val endAngle = transition.animateFloat(
-        0f,
-        JumpRotationAngle,
-        infiniteRepeatable(
-            animation = keyframes {
-                durationMillis = HeadAndTailAnimationDuration + HeadAndTailDelayDuration
-                0f at 0 using CircularEasing
-                JumpRotationAngle at HeadAndTailAnimationDuration
-            }
+    val endAngle =
+        transition.animateFloat(
+            0f,
+            JumpRotationAngle,
+            infiniteRepeatable(
+                animation =
+                    keyframes {
+                        durationMillis = HeadAndTailAnimationDuration + HeadAndTailDelayDuration
+                        0f at 0 using CircularEasing
+                        JumpRotationAngle at HeadAndTailAnimationDuration
+                    }
+            )
         )
-    )
-    val startAngle = transition.animateFloat(
-        0f,
-        JumpRotationAngle,
-        infiniteRepeatable(
-            animation = keyframes {
-                durationMillis = HeadAndTailAnimationDuration + HeadAndTailDelayDuration
-                0f at HeadAndTailDelayDuration using CircularEasing
-                JumpRotationAngle at durationMillis
-            }
+    val startAngle =
+        transition.animateFloat(
+            0f,
+            JumpRotationAngle,
+            infiniteRepeatable(
+                animation =
+                    keyframes {
+                        durationMillis = HeadAndTailAnimationDuration + HeadAndTailDelayDuration
+                        0f at HeadAndTailDelayDuration using CircularEasing
+                        JumpRotationAngle at durationMillis
+                    }
+            )
         )
-    )
-    Canvas(
-        modifier
-            .progressSemantics()
-            .size(CircularIndicatorDiameter)
-    ) {
+    Canvas(modifier.progressSemantics().size(CircularIndicatorDiameter)) {
         drawCircularIndicatorTrack(trackColor, stroke)
 
         val currentRotationAngleOffset = (currentRotation.value * RotationAngleOffset) % 360f
@@ -695,16 +712,17 @@
 @Suppress("DEPRECATION")
 @Deprecated(
     message = "Use the overload that takes `progress` as a lambda",
-    replaceWith = ReplaceWith(
-        "CircularProgressIndicator(\n" +
-            "progress = { progress },\n" +
-            "modifier = modifier,\n" +
-            "color = color,\n" +
-            "strokeWidth = strokeWidth,\n" +
-            "trackColor = trackColor,\n" +
-            "strokeCap = strokeCap,\n" +
-            ")"
-    )
+    replaceWith =
+        ReplaceWith(
+            "CircularProgressIndicator(\n" +
+                "progress = { progress },\n" +
+                "modifier = modifier,\n" +
+                "color = color,\n" +
+                "strokeWidth = strokeWidth,\n" +
+                "trackColor = trackColor,\n" +
+                "strokeCap = strokeCap,\n" +
+                ")"
+        )
 )
 @Composable
 fun CircularProgressIndicator(
@@ -714,14 +732,15 @@
     strokeWidth: Dp = ProgressIndicatorDefaults.CircularStrokeWidth,
     trackColor: Color = ProgressIndicatorDefaults.circularTrackColor,
     strokeCap: StrokeCap = ProgressIndicatorDefaults.CircularDeterminateStrokeCap,
-) = CircularProgressIndicator(
-    progress = { progress },
-    modifier = modifier,
-    color = color,
-    strokeWidth = strokeWidth,
-    trackColor = trackColor,
-    strokeCap = strokeCap,
-)
+) =
+    CircularProgressIndicator(
+        progress = { progress },
+        modifier = modifier,
+        color = color,
+        strokeWidth = strokeWidth,
+        trackColor = trackColor,
+        strokeCap = strokeCap,
+    )
 
 @Suppress("DEPRECATION")
 @Deprecated("Maintained for binary compatibility", level = DeprecationLevel.HIDDEN)
@@ -731,14 +750,15 @@
     modifier: Modifier = Modifier,
     color: Color = ProgressIndicatorDefaults.circularColor,
     strokeWidth: Dp = ProgressIndicatorDefaults.CircularStrokeWidth
-) = CircularProgressIndicator(
-    progress,
-    modifier,
-    color,
-    strokeWidth,
-    trackColor = ProgressIndicatorDefaults.circularTrackColor,
-    strokeCap = ProgressIndicatorDefaults.CircularDeterminateStrokeCap,
-)
+) =
+    CircularProgressIndicator(
+        progress,
+        modifier,
+        color,
+        strokeWidth,
+        trackColor = ProgressIndicatorDefaults.circularTrackColor,
+        strokeCap = ProgressIndicatorDefaults.CircularDeterminateStrokeCap,
+    )
 
 @Suppress("DEPRECATION")
 @Deprecated("Maintained for binary compatibility", level = DeprecationLevel.HIDDEN)
@@ -747,13 +767,14 @@
     modifier: Modifier = Modifier,
     color: Color = ProgressIndicatorDefaults.circularColor,
     strokeWidth: Dp = ProgressIndicatorDefaults.CircularStrokeWidth
-) = CircularProgressIndicator(
-    modifier,
-    color,
-    strokeWidth,
-    trackColor = ProgressIndicatorDefaults.circularTrackColor,
-    strokeCap = ProgressIndicatorDefaults.CircularIndeterminateStrokeCap,
-)
+) =
+    CircularProgressIndicator(
+        modifier,
+        color,
+        strokeWidth,
+        trackColor = ProgressIndicatorDefaults.circularTrackColor,
+        strokeCap = ProgressIndicatorDefaults.CircularIndeterminateStrokeCap,
+    )
 
 private fun DrawScope.drawCircularIndicator(
     startAngle: Float,
@@ -776,10 +797,8 @@
     )
 }
 
-private fun DrawScope.drawCircularIndicatorTrack(
-    color: Color,
-    stroke: Stroke
-) = drawCircularIndicator(0f, 360f, color, stroke)
+private fun DrawScope.drawCircularIndicatorTrack(color: Color, stroke: Stroke) =
+    drawCircularIndicator(0f, 360f, color, stroke)
 
 private fun DrawScope.drawDeterminateCircularIndicator(
     startAngle: Float,
@@ -795,14 +814,15 @@
     color: Color,
     stroke: Stroke
 ) {
-    val strokeCapOffset = if (stroke.cap == StrokeCap.Butt) {
-        0f
-    } else {
-        // Length of arc is angle * radius
-        // Angle (radians) is length / radius
-        // The length should be the same as the stroke width for calculating the min angle
-        (180.0 / PI).toFloat() * (strokeWidth / (CircularIndicatorDiameter / 2)) / 2f
-    }
+    val strokeCapOffset =
+        if (stroke.cap == StrokeCap.Butt) {
+            0f
+        } else {
+            // Length of arc is angle * radius
+            // Angle (radians) is length / radius
+            // The length should be the same as the stroke width for calculating the min angle
+            (180.0 / PI).toFloat() * (strokeWidth / (CircularIndicatorDiameter / 2)) / 2f
+        }
 
     // Adding a stroke cap draws half the stroke width behind the start point, so we want to
     // move it forward by that amount so the arc visually appears in the correct place
@@ -821,13 +841,11 @@
 object ProgressIndicatorDefaults {
     /** Default color for a linear progress indicator. */
     val linearColor: Color
-        @Composable get() =
-            ProgressIndicatorTokens.ActiveIndicatorColor.value
+        @Composable get() = ProgressIndicatorTokens.ActiveIndicatorColor.value
 
     /** Default color for a circular progress indicator. */
     val circularColor: Color
-        @Composable get() =
-            ProgressIndicatorTokens.ActiveIndicatorColor.value
+        @Composable get() = ProgressIndicatorTokens.ActiveIndicatorColor.value
 
     /** Default track color for a linear progress indicator. */
     val linearTrackColor: Color
@@ -884,13 +902,14 @@
      * The default [AnimationSpec] that should be used when animating between progress in a
      * determinate progress indicator.
      */
-    val ProgressAnimationSpec = SpringSpec(
-        dampingRatio = Spring.DampingRatioNoBouncy,
-        stiffness = Spring.StiffnessVeryLow,
-        // The default threshold is 0.01, or 1% of the overall progress range, which is quite
-        // large and noticeable. We purposefully choose a smaller threshold.
-        visibilityThreshold = 1 / 1000f
-    )
+    val ProgressAnimationSpec =
+        SpringSpec(
+            dampingRatio = Spring.DampingRatioNoBouncy,
+            stiffness = Spring.StiffnessVeryLow,
+            // The default threshold is 0.01, or 1% of the overall progress range, which is quite
+            // large and noticeable. We purposefully choose a smaller threshold.
+            visibilityThreshold = 1 / 1000f
+        )
 
     /**
      * Draws the stop indicator at the end of the track.
@@ -914,18 +933,20 @@
                 drawCircle(
                     color = color,
                     radius = adjustedStopSize / 2f,
-                    center = Offset(
-                        x = size.width - (adjustedStopSize / 2f) - stopOffset,
-                        y = size.height / 2f
-                    )
+                    center =
+                        Offset(
+                            x = size.width - (adjustedStopSize / 2f) - stopOffset,
+                            y = size.height / 2f
+                        )
                 )
             } else {
                 drawRect(
                     color = color,
-                    topLeft = Offset(
-                        x = size.width - adjustedStopSize - stopOffset,
-                        y = (size.height - adjustedStopSize) / 2f
-                    ),
+                    topLeft =
+                        Offset(
+                            x = size.width - adjustedStopSize - stopOffset,
+                            y = (size.height - adjustedStopSize) / 2f
+                        ),
                     size = Size(width = adjustedStopSize, height = adjustedStopSize)
                 )
             }
diff --git a/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/RadioButton.kt b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/RadioButton.kt
index 51601eb..faf9bad 100644
--- a/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/RadioButton.kt
+++ b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/RadioButton.kt
@@ -43,31 +43,34 @@
 import androidx.compose.ui.unit.dp
 
 /**
- * <a href="https://m3.material.io/components/radio-button/overview" class="external" target="_blank">Material Design radio button</a>.
+ * <a href="https://m3.material.io/components/radio-button/overview" class="external"
+ * target="_blank">Material Design radio button</a>.
  *
  * Radio buttons allow users to select one option from a set.
  *
- * ![Radio button image](https://developer.android.com/images/reference/androidx/compose/material3/radio-button.png)
+ * ![Radio button
+ * image](https://developer.android.com/images/reference/androidx/compose/material3/radio-button.png)
  *
  * @sample androidx.compose.material3.samples.RadioButtonSample
  *
  * [RadioButton]s can be combined together with [Text] in the desired layout (e.g. [Column] or
  * [Row]) to achieve radio group-like behaviour, where the entire layout is selectable:
+ *
  * @sample androidx.compose.material3.samples.RadioGroupSample
  *
  * @param selected whether this radio button is selected or not
  * @param onClick called when this radio button is clicked. If `null`, then this radio button will
- * not be interactable, unless something else handles its input events and updates its state.
+ *   not be interactable, unless something else handles its input events and updates its state.
  * @param modifier the [Modifier] to be applied to this radio button
  * @param enabled controls the enabled state of this radio button. When `false`, this component will
- * not respond to user input, and it will appear visually disabled and disabled to accessibility
- * services.
+ *   not respond to user input, and it will appear visually disabled and disabled to accessibility
+ *   services.
  * @param colors [RadioButtonColors] that will be used to resolve the color used for this radio
- * button in different states. See [RadioButtonDefaults.colors].
+ *   button in different states. See [RadioButtonDefaults.colors].
  * @param interactionSource an optional hoisted [MutableInteractionSource] for observing and
- * emitting [Interaction]s for this radio button. You can use this to change the radio button's
- * appearance or preview the radio button in different states. Note that if `null` is provided,
- * interactions will still happen internally.
+ *   emitting [Interaction]s for this radio button. You can use this to change the radio button's
+ *   appearance or preview the radio button in different states. Note that if `null` is provided,
+ *   interactions will still happen internally.
  */
 @Composable
 fun RadioButton(
@@ -78,10 +81,11 @@
     colors: RadioButtonColors = RadioButtonDefaults.colors(),
     interactionSource: MutableInteractionSource? = null
 ) {
-    val dotRadius = animateDpAsState(
-        targetValue = if (selected) RadioButtonDotSize / 2 else 0.dp,
-        animationSpec = tween(durationMillis = RadioAnimationDuration)
-    )
+    val dotRadius =
+        animateDpAsState(
+            targetValue = if (selected) RadioButtonDotSize / 2 else 0.dp,
+            animationSpec = tween(durationMillis = RadioAnimationDuration)
+        )
     val radioColor = colors.radioColor(enabled, selected)
     val selectableModifier =
         if (onClick != null) {
@@ -91,10 +95,11 @@
                 enabled = enabled,
                 role = Role.RadioButton,
                 interactionSource = interactionSource,
-                indication = rippleOrFallbackImplementation(
-                    bounded = false,
-                    radius = RadioButtonTokens.StateLayerSize / 2
-                )
+                indication =
+                    rippleOrFallbackImplementation(
+                        bounded = false,
+                        radius = RadioButtonTokens.StateLayerSize / 2
+                    )
             )
         } else {
             Modifier
@@ -126,27 +131,24 @@
     }
 }
 
-/**
- * Defaults used in [RadioButton].
- */
+/** Defaults used in [RadioButton]. */
 object RadioButtonDefaults {
 
     /**
-     * Creates a [RadioButtonColors] that will animate between the provided colors according to
-     * the Material specification.
+     * Creates a [RadioButtonColors] that will animate between the provided colors according to the
+     * Material specification.
      */
-    @Composable
-    fun colors() = MaterialTheme.colorScheme.defaultRadioButtonColors
+    @Composable fun colors() = MaterialTheme.colorScheme.defaultRadioButtonColors
 
     /**
-     * Creates a [RadioButtonColors] that will animate between the provided colors according to
-     * the Material specification.
+     * Creates a [RadioButtonColors] that will animate between the provided colors according to the
+     * Material specification.
      *
      * @param selectedColor the color to use for the RadioButton when selected and enabled.
      * @param unselectedColor the color to use for the RadioButton when unselected and enabled.
      * @param disabledSelectedColor the color to use for the RadioButton when disabled and selected.
      * @param disabledUnselectedColor the color to use for the RadioButton when disabled and not
-     * selected.
+     *   selected.
      * @return the resulting [RadioButtonColors] used for the RadioButton
      */
     @Composable
@@ -155,79 +157,83 @@
         unselectedColor: Color = Color.Unspecified,
         disabledSelectedColor: Color = Color.Unspecified,
         disabledUnselectedColor: Color = Color.Unspecified
-    ): RadioButtonColors = MaterialTheme.colorScheme.defaultRadioButtonColors.copy(
-        selectedColor,
-        unselectedColor,
-        disabledSelectedColor,
-        disabledUnselectedColor
-    )
+    ): RadioButtonColors =
+        MaterialTheme.colorScheme.defaultRadioButtonColors.copy(
+            selectedColor,
+            unselectedColor,
+            disabledSelectedColor,
+            disabledUnselectedColor
+        )
 
     internal val ColorScheme.defaultRadioButtonColors: RadioButtonColors
         get() {
-            return defaultRadioButtonColorsCached ?: RadioButtonColors(
-                selectedColor = fromToken(RadioButtonTokens.SelectedIconColor),
-                unselectedColor = fromToken(RadioButtonTokens.UnselectedIconColor),
-                disabledSelectedColor = fromToken(RadioButtonTokens.DisabledSelectedIconColor)
-                    .copy(alpha = RadioButtonTokens.DisabledSelectedIconOpacity),
-                disabledUnselectedColor = fromToken(RadioButtonTokens.DisabledUnselectedIconColor)
-                    .copy(alpha = RadioButtonTokens.DisabledUnselectedIconOpacity)
-            ).also {
-                defaultRadioButtonColorsCached = it
-            }
+            return defaultRadioButtonColorsCached
+                ?: RadioButtonColors(
+                        selectedColor = fromToken(RadioButtonTokens.SelectedIconColor),
+                        unselectedColor = fromToken(RadioButtonTokens.UnselectedIconColor),
+                        disabledSelectedColor =
+                            fromToken(RadioButtonTokens.DisabledSelectedIconColor)
+                                .copy(alpha = RadioButtonTokens.DisabledSelectedIconOpacity),
+                        disabledUnselectedColor =
+                            fromToken(RadioButtonTokens.DisabledUnselectedIconColor)
+                                .copy(alpha = RadioButtonTokens.DisabledUnselectedIconOpacity)
+                    )
+                    .also { defaultRadioButtonColorsCached = it }
         }
 }
 
 /**
  * Represents the color used by a [RadioButton] in different states.
  *
- * @constructor create an instance with arbitrary colors.
- * See [RadioButtonDefaults.colors] for the default implementation that follows Material
- * specifications.
- *
  * @param selectedColor the color to use for the RadioButton when selected and enabled.
  * @param unselectedColor the color to use for the RadioButton when unselected and enabled.
  * @param disabledSelectedColor the color to use for the RadioButton when disabled and selected.
  * @param disabledUnselectedColor the color to use for the RadioButton when disabled and not
- * selected.
+ *   selected.
+ * @constructor create an instance with arbitrary colors. See [RadioButtonDefaults.colors] for the
+ *   default implementation that follows Material specifications.
  */
 @Immutable
-class RadioButtonColors constructor(
+class RadioButtonColors
+constructor(
     val selectedColor: Color,
     val unselectedColor: Color,
     val disabledSelectedColor: Color,
     val disabledUnselectedColor: Color
 ) {
     /**
-     * Returns a copy of this SelectableChipColors, optionally overriding some of the values.
-     * This uses the Color.Unspecified to mean “use the value from the source”
+     * Returns a copy of this SelectableChipColors, optionally overriding some of the values. This
+     * uses the Color.Unspecified to mean “use the value from the source”
      */
     fun copy(
         selectedColor: Color = this.selectedColor,
         unselectedColor: Color = this.unselectedColor,
         disabledSelectedColor: Color = this.disabledSelectedColor,
         disabledUnselectedColor: Color = this.disabledUnselectedColor,
-    ) = RadioButtonColors(
-        selectedColor.takeOrElse { this.selectedColor },
-        unselectedColor.takeOrElse { this.unselectedColor },
-        disabledSelectedColor.takeOrElse { this.disabledSelectedColor },
-        disabledUnselectedColor.takeOrElse { this.disabledUnselectedColor },
-    )
+    ) =
+        RadioButtonColors(
+            selectedColor.takeOrElse { this.selectedColor },
+            unselectedColor.takeOrElse { this.unselectedColor },
+            disabledSelectedColor.takeOrElse { this.disabledSelectedColor },
+            disabledUnselectedColor.takeOrElse { this.disabledUnselectedColor },
+        )
 
     /**
-     * Represents the main color used to draw the outer and inner circles, depending on whether
-     * the [RadioButton] is [enabled] / [selected].
+     * Represents the main color used to draw the outer and inner circles, depending on whether the
+     * [RadioButton] is [enabled] / [selected].
      *
      * @param enabled whether the [RadioButton] is enabled
      * @param selected whether the [RadioButton] is selected
      */
     @Composable
     internal fun radioColor(enabled: Boolean, selected: Boolean): State<Color> {
-        val target = when {
-            enabled && selected -> selectedColor
-            enabled && !selected -> unselectedColor
-            !enabled && selected -> disabledSelectedColor
-            else -> disabledUnselectedColor
-        }
+        val target =
+            when {
+                enabled && selected -> selectedColor
+                enabled && !selected -> unselectedColor
+                !enabled && selected -> disabledSelectedColor
+                else -> disabledUnselectedColor
+            }
 
         // If not enabled 'snap' to the disabled state, as there should be no animations between
         // enabled / disabled.
diff --git a/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/Ripple.kt b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/Ripple.kt
index 485b51c..61a9b2f 100644
--- a/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/Ripple.kt
+++ b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/Ripple.kt
@@ -44,17 +44,17 @@
 /**
  * Creates a Ripple using the provided values and values inferred from the theme.
  *
- * A Ripple is a Material implementation of [Indication] that expresses different [Interaction]s
- * by drawing ripple animations and state layers.
+ * A Ripple is a Material implementation of [Indication] that expresses different [Interaction]s by
+ * drawing ripple animations and state layers.
  *
- * A Ripple responds to [PressInteraction.Press] by starting a new ripple animation, and
- * responds to other [Interaction]s by showing a fixed state layer with varying alpha values
- * depending on the [Interaction].
+ * A Ripple responds to [PressInteraction.Press] by starting a new ripple animation, and responds to
+ * other [Interaction]s by showing a fixed state layer with varying alpha values depending on the
+ * [Interaction].
  *
  * [MaterialTheme] provides Ripples using [androidx.compose.foundation.LocalIndication], so a Ripple
  * will be used as the default [Indication] inside components such as
- * [androidx.compose.foundation.clickable] and [androidx.compose.foundation.indication], in
- * addition to Material provided components that use a Ripple as well.
+ * [androidx.compose.foundation.clickable] and [androidx.compose.foundation.indication], in addition
+ * to Material provided components that use a Ripple as well.
  *
  * You can also explicitly create a Ripple and provide it to custom components in order to change
  * the parameters from the default, such as to create an unbounded ripple with a fixed size.
@@ -63,15 +63,14 @@
  * [ripple] overload with a [ColorProducer] parameter. This will avoid unnecessary recompositions
  * when changing the color, and preserve existing ripple state when the color changes.
  *
- * @param bounded If true, ripples are clipped by the bounds of the target layout. Unbounded
- * ripples always animate from the target layout center, bounded ripples animate from the touch
- * position.
+ * @param bounded If true, ripples are clipped by the bounds of the target layout. Unbounded ripples
+ *   always animate from the target layout center, bounded ripples animate from the touch position.
  * @param radius the radius for the ripple. If [Dp.Unspecified] is provided then the size will be
- * calculated based on the target layout size.
+ *   calculated based on the target layout size.
  * @param color the color of the ripple. This color is usually the same color used by the text or
- * iconography in the component. This color will then have [RippleDefaults.RippleAlpha]
- * applied to calculate the final color used to draw the ripple. If [Color.Unspecified] is
- * provided the color used will be [LocalContentColor] instead.
+ *   iconography in the component. This color will then have [RippleDefaults.RippleAlpha] applied to
+ *   calculate the final color used to draw the ripple. If [Color.Unspecified] is provided the color
+ *   used will be [LocalContentColor] instead.
  */
 @Stable
 fun ripple(
@@ -89,17 +88,17 @@
 /**
  * Creates a Ripple using the provided values and values inferred from the theme.
  *
- * A Ripple is a Material implementation of [Indication] that expresses different [Interaction]s
- * by drawing ripple animations and state layers.
+ * A Ripple is a Material implementation of [Indication] that expresses different [Interaction]s by
+ * drawing ripple animations and state layers.
  *
- * A Ripple responds to [PressInteraction.Press] by starting a new ripple animation, and
- * responds to other [Interaction]s by showing a fixed state layer with varying alpha values
- * depending on the [Interaction].
+ * A Ripple responds to [PressInteraction.Press] by starting a new ripple animation, and responds to
+ * other [Interaction]s by showing a fixed state layer with varying alpha values depending on the
+ * [Interaction].
  *
  * [MaterialTheme] provides Ripples using [androidx.compose.foundation.LocalIndication], so a Ripple
  * will be used as the default [Indication] inside components such as
- * [androidx.compose.foundation.clickable] and [androidx.compose.foundation.indication], in
- * addition to Material provided components that use a Ripple as well.
+ * [androidx.compose.foundation.clickable] and [androidx.compose.foundation.indication], in addition
+ * to Material provided components that use a Ripple as well.
  *
  * You can also explicitly create a Ripple and provide it to custom components in order to change
  * the parameters from the default, such as to create an unbounded ripple with a fixed size.
@@ -109,16 +108,15 @@
  * unnecessary recompositions.
  *
  * @param color the color of the ripple. This color is usually the same color used by the text or
- * iconography in the component. This color will then have [RippleDefaults.RippleAlpha]
- * applied to calculate the final color used to draw the ripple. If you are creating this
- * [ColorProducer] outside of composition (where it will be automatically remembered), make sure
- * that its instance is stable (such as by remembering the object that holds it), or remember the
- * returned [ripple] object to make sure that ripple nodes are not being created each recomposition.
- * @param bounded If true, ripples are clipped by the bounds of the target layout. Unbounded
- * ripples always animate from the target layout center, bounded ripples animate from the touch
- * position.
+ *   iconography in the component. This color will then have [RippleDefaults.RippleAlpha] applied to
+ *   calculate the final color used to draw the ripple. If you are creating this [ColorProducer]
+ *   outside of composition (where it will be automatically remembered), make sure that its instance
+ *   is stable (such as by remembering the object that holds it), or remember the returned [ripple]
+ *   object to make sure that ripple nodes are not being created each recomposition.
+ * @param bounded If true, ripples are clipped by the bounds of the target layout. Unbounded ripples
+ *   always animate from the target layout center, bounded ripples animate from the touch position.
  * @param radius the radius for the ripple. If [Dp.Unspecified] is provided then the size will be
- * calculated based on the target layout size.
+ *   calculated based on the target layout size.
  */
 @Stable
 fun ripple(
@@ -129,27 +127,26 @@
     return RippleNodeFactory(bounded, radius, color)
 }
 
-/**
- * Default values used by [ripple].
- */
+/** Default values used by [ripple]. */
 object RippleDefaults {
     /**
      * Represents the default [RippleAlpha] that will be used for a ripple to indicate different
      * states.
      */
-    val RippleAlpha: RippleAlpha = RippleAlpha(
-        pressedAlpha = StateTokens.PressedStateLayerOpacity,
-        focusedAlpha = StateTokens.FocusStateLayerOpacity,
-        draggedAlpha = StateTokens.DraggedStateLayerOpacity,
-        hoveredAlpha = StateTokens.HoverStateLayerOpacity
-    )
+    val RippleAlpha: RippleAlpha =
+        RippleAlpha(
+            pressedAlpha = StateTokens.PressedStateLayerOpacity,
+            focusedAlpha = StateTokens.FocusStateLayerOpacity,
+            draggedAlpha = StateTokens.DraggedStateLayerOpacity,
+            hoveredAlpha = StateTokens.HoverStateLayerOpacity
+        )
 }
 
 /**
  * Temporary CompositionLocal to allow configuring whether the old ripple implementation that uses
  * the deprecated [androidx.compose.material.ripple.RippleTheme] API should be used in Material
- * components and LocalIndication, instead of the new [ripple] API. This flag defaults to false,
- * and will be removed after one stable release: it should only be used to temporarily unblock
+ * components and LocalIndication, instead of the new [ripple] API. This flag defaults to false, and
+ * will be removed after one stable release: it should only be used to temporarily unblock
  * upgrading.
  *
  * Provide this CompositionLocal before you provide [MaterialTheme] to make sure it is correctly
@@ -160,7 +157,9 @@
 @get:ExperimentalMaterial3Api
 @ExperimentalMaterial3Api
 val LocalUseFallbackRippleImplementation: ProvidableCompositionLocal<Boolean> =
-    staticCompositionLocalOf { false }
+    staticCompositionLocalOf {
+        false
+    }
 
 /**
  * CompositionLocal used for providing [RippleConfiguration] down the tree. This acts as a
@@ -170,27 +169,29 @@
  *
  * In most cases you should rely on the default theme behavior for consistency with other components
  * - this exists as an escape hatch for individual components and is not intended to be used for
- * full theme customization across an application. For this use case you should instead build your
- * own custom ripple that queries your design system theme values directly using
- * [createRippleModifierNode].
+ *   full theme customization across an application. For this use case you should instead build your
+ *   own custom ripple that queries your design system theme values directly using
+ *   [createRippleModifierNode].
  */
 @Suppress("OPT_IN_MARKER_ON_WRONG_TARGET")
 @get:ExperimentalMaterial3Api
 @ExperimentalMaterial3Api
 val LocalRippleConfiguration: ProvidableCompositionLocal<RippleConfiguration?> =
-    compositionLocalOf { RippleConfiguration() }
+    compositionLocalOf {
+        RippleConfiguration()
+    }
 
 /**
  * Configuration for [ripple] appearance, provided using [LocalRippleConfiguration]. In most cases
- * the default values should be used, for custom design system use cases you should instead
- * build your own custom ripple using [createRippleModifierNode]. To disable the ripple, provide
- * `null` using [LocalRippleConfiguration].
+ * the default values should be used, for custom design system use cases you should instead build
+ * your own custom ripple using [createRippleModifierNode]. To disable the ripple, provide `null`
+ * using [LocalRippleConfiguration].
  *
  * @param color the color override for the ripple. If [Color.Unspecified], then the default color
- * from the theme will be used instead. Note that if the ripple has a color explicitly set with
- * the parameter on [ripple], that will always be used instead of this value.
+ *   from the theme will be used instead. Note that if the ripple has a color explicitly set with
+ *   the parameter on [ripple], that will always be used instead of this value.
  * @param rippleAlpha the [RippleAlpha] override for this ripple. If null, then the default alpha
- * will be used instead.
+ *   will be used instead.
  */
 @Immutable
 @ExperimentalMaterial3Api
@@ -249,7 +250,8 @@
 }
 
 @Stable
-private class RippleNodeFactory private constructor(
+private class RippleNodeFactory
+private constructor(
     private val bounded: Boolean,
     private val radius: Dp,
     private val colorProducer: ColorProducer?,
@@ -261,11 +263,7 @@
         colorProducer: ColorProducer
     ) : this(bounded, radius, colorProducer, Color.Unspecified)
 
-    constructor(
-        bounded: Boolean,
-        radius: Dp,
-        color: Color
-    ) : this(bounded, radius, null, color)
+    constructor(bounded: Boolean, radius: Dp, color: Color) : this(bounded, radius, null, color)
 
     override fun create(interactionSource: InteractionSource): DelegatableNode {
         val colorProducer = colorProducer ?: ColorProducer { color }
@@ -310,8 +308,8 @@
 
     /**
      * Handles [LocalRippleConfiguration] changing between null / non-null. Changes to
-     * [RippleConfiguration.color] and [RippleConfiguration.rippleAlpha] are handled as part of
-     * the ripple definition.
+     * [RippleConfiguration.color] and [RippleConfiguration.rippleAlpha] are handled as part of the
+     * ripple definition.
      */
     private fun updateConfiguration() {
         observeReads {
@@ -348,13 +346,16 @@
             rippleConfiguration?.rippleAlpha ?: RippleDefaults.RippleAlpha
         }
 
-        rippleNode = delegate(createRippleModifierNode(
-            interactionSource,
-            bounded,
-            radius,
-            calculateColor,
-            calculateRippleAlpha
-        ))
+        rippleNode =
+            delegate(
+                createRippleModifierNode(
+                    interactionSource,
+                    bounded,
+                    radius,
+                    calculateColor,
+                    calculateRippleAlpha
+                )
+            )
     }
 
     private fun removeRipple() {
@@ -362,13 +363,7 @@
     }
 }
 
-private val DefaultBoundedRipple = RippleNodeFactory(
-    bounded = true,
-    radius = Dp.Unspecified,
-    color = Color.Unspecified
-)
-private val DefaultUnboundedRipple = RippleNodeFactory(
-    bounded = false,
-    radius = Dp.Unspecified,
-    color = Color.Unspecified
-)
+private val DefaultBoundedRipple =
+    RippleNodeFactory(bounded = true, radius = Dp.Unspecified, color = Color.Unspecified)
+private val DefaultUnboundedRipple =
+    RippleNodeFactory(bounded = false, radius = Dp.Unspecified, color = Color.Unspecified)
diff --git a/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/Scaffold.kt b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/Scaffold.kt
index 6f9f2af..b5e55a3 100644
--- a/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/Scaffold.kt
+++ b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/Scaffold.kt
@@ -41,13 +41,14 @@
 import androidx.compose.ui.util.fastMaxBy
 
 /**
- * <a href="https://material.io/design/layout/understanding-layout.html" class="external" target="_blank">Material Design layout</a>.
+ * <a href="https://material.io/design/layout/understanding-layout.html" class="external"
+ * target="_blank">Material Design layout</a>.
  *
  * Scaffold implements the basic material design visual layout structure.
  *
- * This component provides API to put together several material components to construct your
- * screen, by ensuring proper layout strategy for them and collecting necessary data so these
- * components will work together correctly.
+ * This component provides API to put together several material components to construct your screen,
+ * by ensuring proper layout strategy for them and collecting necessary data so these components
+ * will work together correctly.
  *
  * Simple example of a Scaffold with [SmallTopAppBar], [FloatingActionButton]:
  *
@@ -61,23 +62,23 @@
  * @param topBar top app bar of the screen, typically a [SmallTopAppBar]
  * @param bottomBar bottom bar of the screen, typically a [NavigationBar]
  * @param snackbarHost component to host [Snackbar]s that are pushed to be shown via
- * [SnackbarHostState.showSnackbar], typically a [SnackbarHost]
+ *   [SnackbarHostState.showSnackbar], typically a [SnackbarHost]
  * @param floatingActionButton Main action button of the screen, typically a [FloatingActionButton]
  * @param floatingActionButtonPosition position of the FAB on the screen. See [FabPosition].
  * @param containerColor the color used for the background of this scaffold. Use [Color.Transparent]
- * to have no color.
+ *   to have no color.
  * @param contentColor the preferred color for content inside this scaffold. Defaults to either the
- * matching content color for [containerColor], or to the current [LocalContentColor] if
- * [containerColor] is not a color from the theme.
+ *   matching content color for [containerColor], or to the current [LocalContentColor] if
+ *   [containerColor] is not a color from the theme.
  * @param contentWindowInsets window insets to be passed to [content] slot via [PaddingValues]
- * params. Scaffold will take the insets into account from the top/bottom only if the [topBar]/
- * [bottomBar] are not present, as the scaffold expect [topBar]/[bottomBar] to handle insets
- * instead. Any insets consumed by other insets padding modifiers or [consumeWindowInsets] on a
- * parent layout will be excluded from [contentWindowInsets].
+ *   params. Scaffold will take the insets into account from the top/bottom only if the [topBar]/
+ *   [bottomBar] are not present, as the scaffold expect [topBar]/[bottomBar] to handle insets
+ *   instead. Any insets consumed by other insets padding modifiers or [consumeWindowInsets] on a
+ *   parent layout will be excluded from [contentWindowInsets].
  * @param content content of the screen. The lambda receives a [PaddingValues] that should be
- * applied to the content root via [Modifier.padding] and [Modifier.consumeWindowInsets] to
- * properly offset top and bottom bars. If using [Modifier.verticalScroll], apply this modifier to
- * the child of the scroll, and not on the scroll itself.
+ *   applied to the content root via [Modifier.padding] and [Modifier.consumeWindowInsets] to
+ *   properly offset top and bottom bars. If using [Modifier.verticalScroll], apply this modifier to
+ *   the child of the scroll, and not on the scroll itself.
  */
 @Composable
 fun Scaffold(
@@ -92,16 +93,16 @@
     contentWindowInsets: WindowInsets = ScaffoldDefaults.contentWindowInsets,
     content: @Composable (PaddingValues) -> Unit
 ) {
-    val safeInsets = remember(contentWindowInsets) {
-        MutableWindowInsets(contentWindowInsets)
-    }
+    val safeInsets = remember(contentWindowInsets) { MutableWindowInsets(contentWindowInsets) }
     Surface(
-        modifier = modifier.onConsumedWindowInsetsChanged { consumedWindowInsets ->
-            // Exclude currently consumed window insets from user provided contentWindowInsets
-            safeInsets.insets = contentWindowInsets.exclude(consumedWindowInsets)
-        },
+        modifier =
+            modifier.onConsumedWindowInsetsChanged { consumedWindowInsets ->
+                // Exclude currently consumed window insets from user provided contentWindowInsets
+                safeInsets.insets = contentWindowInsets.exclude(consumedWindowInsets)
+            },
         color = containerColor,
-        contentColor = contentColor) {
+        contentColor = contentColor
+    ) {
         ScaffoldLayout(
             fabPosition = floatingActionButtonPosition,
             topBar = topBar,
@@ -121,10 +122,10 @@
  * @param topBar the content to place at the top of the [Scaffold], typically a [SmallTopAppBar]
  * @param content the main 'body' of the [Scaffold]
  * @param snackbar the [Snackbar] displayed on top of the [content]
- * @param fab the [FloatingActionButton] displayed on top of the [content], below the [snackbar]
- * and above the [bottomBar]
- * @param bottomBar the content to place at the bottom of the [Scaffold], on top of the
- * [content], typically a [NavigationBar].
+ * @param fab the [FloatingActionButton] displayed on top of the [content], below the [snackbar] and
+ *   above the [bottomBar]
+ * @param bottomBar the content to place at the bottom of the [Scaffold], on top of the [content],
+ *   typically a [NavigationBar].
  */
 @Composable
 private fun ScaffoldLayout(
@@ -142,27 +143,23 @@
 
         val looseConstraints = constraints.copy(minWidth = 0, minHeight = 0)
 
-        val topBarPlaceables = subcompose(ScaffoldLayoutContent.TopBar, topBar).fastMap {
-            it.measure(looseConstraints)
-        }
+        val topBarPlaceables =
+            subcompose(ScaffoldLayoutContent.TopBar, topBar).fastMap {
+                it.measure(looseConstraints)
+            }
 
         val topBarHeight = topBarPlaceables.fastMaxBy { it.height }?.height ?: 0
 
-        val snackbarPlaceables = subcompose(ScaffoldLayoutContent.Snackbar, snackbar).fastMap {
-            // respect only bottom and horizontal for snackbar and fab
-            val leftInset = contentWindowInsets
-                .getLeft(this@SubcomposeLayout, layoutDirection)
-            val rightInset = contentWindowInsets
-                .getRight(this@SubcomposeLayout, layoutDirection)
-            val bottomInset = contentWindowInsets.getBottom(this@SubcomposeLayout)
-            // offset the snackbar constraints by the insets values
-            it.measure(
-                looseConstraints.offset(
-                    -leftInset - rightInset,
-                    -bottomInset
-                )
-            )
-        }
+        val snackbarPlaceables =
+            subcompose(ScaffoldLayoutContent.Snackbar, snackbar).fastMap {
+                // respect only bottom and horizontal for snackbar and fab
+                val leftInset = contentWindowInsets.getLeft(this@SubcomposeLayout, layoutDirection)
+                val rightInset =
+                    contentWindowInsets.getRight(this@SubcomposeLayout, layoutDirection)
+                val bottomInset = contentWindowInsets.getBottom(this@SubcomposeLayout)
+                // offset the snackbar constraints by the insets values
+                it.measure(looseConstraints.offset(-leftInset - rightInset, -bottomInset))
+            }
 
         val snackbarHeight = snackbarPlaceables.fastMaxBy { it.height }?.height ?: 0
         val snackbarWidth = snackbarPlaceables.fastMaxBy { it.width }?.width ?: 0
@@ -170,105 +167,106 @@
         val fabPlaceables =
             subcompose(ScaffoldLayoutContent.Fab, fab).fastMapNotNull { measurable ->
                 // respect only bottom and horizontal for snackbar and fab
-                val leftInset =
-                    contentWindowInsets.getLeft(this@SubcomposeLayout, layoutDirection)
+                val leftInset = contentWindowInsets.getLeft(this@SubcomposeLayout, layoutDirection)
                 val rightInset =
                     contentWindowInsets.getRight(this@SubcomposeLayout, layoutDirection)
                 val bottomInset = contentWindowInsets.getBottom(this@SubcomposeLayout)
-                measurable.measure(
-                    looseConstraints.offset(
-                        -leftInset - rightInset,
-                        -bottomInset
-                    )
-                )
+                measurable
+                    .measure(looseConstraints.offset(-leftInset - rightInset, -bottomInset))
                     .takeIf { it.height != 0 && it.width != 0 }
             }
 
-        val fabPlacement = if (fabPlaceables.isNotEmpty()) {
-            val fabWidth = fabPlaceables.fastMaxBy { it.width }!!.width
-            val fabHeight = fabPlaceables.fastMaxBy { it.height }!!.height
-            // FAB distance from the left of the layout, taking into account LTR / RTL
-            val fabLeftOffset = when (fabPosition) {
-                FabPosition.Start -> {
-                    if (layoutDirection == LayoutDirection.Ltr) {
-                        FabSpacing.roundToPx()
-                    } else {
-                        layoutWidth - FabSpacing.roundToPx() - fabWidth
+        val fabPlacement =
+            if (fabPlaceables.isNotEmpty()) {
+                val fabWidth = fabPlaceables.fastMaxBy { it.width }!!.width
+                val fabHeight = fabPlaceables.fastMaxBy { it.height }!!.height
+                // FAB distance from the left of the layout, taking into account LTR / RTL
+                val fabLeftOffset =
+                    when (fabPosition) {
+                        FabPosition.Start -> {
+                            if (layoutDirection == LayoutDirection.Ltr) {
+                                FabSpacing.roundToPx()
+                            } else {
+                                layoutWidth - FabSpacing.roundToPx() - fabWidth
+                            }
+                        }
+                        FabPosition.End,
+                        FabPosition.EndOverlay -> {
+                            if (layoutDirection == LayoutDirection.Ltr) {
+                                layoutWidth - FabSpacing.roundToPx() - fabWidth
+                            } else {
+                                FabSpacing.roundToPx()
+                            }
+                        }
+                        else -> (layoutWidth - fabWidth) / 2
                     }
-                }
-                FabPosition.End, FabPosition.EndOverlay -> {
-                    if (layoutDirection == LayoutDirection.Ltr) {
-                        layoutWidth - FabSpacing.roundToPx() - fabWidth
-                    } else {
-                        FabSpacing.roundToPx()
-                    }
-                }
-                else -> (layoutWidth - fabWidth) / 2
+
+                FabPlacement(left = fabLeftOffset, width = fabWidth, height = fabHeight)
+            } else {
+                null
             }
 
-            FabPlacement(
-                left = fabLeftOffset,
-                width = fabWidth,
-                height = fabHeight
-            )
-        } else {
-            null
-        }
-
-        val bottomBarPlaceables = subcompose(ScaffoldLayoutContent.BottomBar) {
-            bottomBar()
-        }.fastMap { it.measure(looseConstraints) }
+        val bottomBarPlaceables =
+            subcompose(ScaffoldLayoutContent.BottomBar) { bottomBar() }
+                .fastMap { it.measure(looseConstraints) }
 
         val bottomBarHeight = bottomBarPlaceables.fastMaxBy { it.height }?.height
-        val fabOffsetFromBottom = fabPlacement?.let {
-            if (bottomBarHeight == null || fabPosition == FabPosition.EndOverlay) {
-                it.height + FabSpacing.roundToPx() +
-                    contentWindowInsets.getBottom(this@SubcomposeLayout)
-            } else {
-                // Total height is the bottom bar height + the FAB height + the padding
-                // between the FAB and bottom bar
-                bottomBarHeight + it.height + FabSpacing.roundToPx()
+        val fabOffsetFromBottom =
+            fabPlacement?.let {
+                if (bottomBarHeight == null || fabPosition == FabPosition.EndOverlay) {
+                    it.height +
+                        FabSpacing.roundToPx() +
+                        contentWindowInsets.getBottom(this@SubcomposeLayout)
+                } else {
+                    // Total height is the bottom bar height + the FAB height + the padding
+                    // between the FAB and bottom bar
+                    bottomBarHeight + it.height + FabSpacing.roundToPx()
+                }
             }
-        }
 
-        val snackbarOffsetFromBottom = if (snackbarHeight != 0) {
-            snackbarHeight +
-                (fabOffsetFromBottom ?: bottomBarHeight
-                ?: contentWindowInsets.getBottom(this@SubcomposeLayout))
-        } else {
-            0
-        }
+        val snackbarOffsetFromBottom =
+            if (snackbarHeight != 0) {
+                snackbarHeight +
+                    (fabOffsetFromBottom
+                        ?: bottomBarHeight
+                        ?: contentWindowInsets.getBottom(this@SubcomposeLayout))
+            } else {
+                0
+            }
 
-        val bodyContentPlaceables = subcompose(ScaffoldLayoutContent.MainContent) {
-            val insets = contentWindowInsets.asPaddingValues(this@SubcomposeLayout)
-            val innerPadding = PaddingValues(
-                top =
-                if (topBarPlaceables.isEmpty()) {
-                    insets.calculateTopPadding()
-                } else {
-                    topBarHeight.toDp()
-                },
-                bottom =
-                if (bottomBarPlaceables.isEmpty() || bottomBarHeight == null) {
-                    insets.calculateBottomPadding()
-                } else {
-                    bottomBarHeight.toDp()
-                },
-                start = insets.calculateStartPadding((this@SubcomposeLayout).layoutDirection),
-                end = insets.calculateEndPadding((this@SubcomposeLayout).layoutDirection)
-            )
-            content(innerPadding)
-        }.fastMap { it.measure(looseConstraints) }
+        val bodyContentPlaceables =
+            subcompose(ScaffoldLayoutContent.MainContent) {
+                    val insets = contentWindowInsets.asPaddingValues(this@SubcomposeLayout)
+                    val innerPadding =
+                        PaddingValues(
+                            top =
+                                if (topBarPlaceables.isEmpty()) {
+                                    insets.calculateTopPadding()
+                                } else {
+                                    topBarHeight.toDp()
+                                },
+                            bottom =
+                                if (bottomBarPlaceables.isEmpty() || bottomBarHeight == null) {
+                                    insets.calculateBottomPadding()
+                                } else {
+                                    bottomBarHeight.toDp()
+                                },
+                            start =
+                                insets.calculateStartPadding(
+                                    (this@SubcomposeLayout).layoutDirection
+                                ),
+                            end =
+                                insets.calculateEndPadding((this@SubcomposeLayout).layoutDirection)
+                        )
+                    content(innerPadding)
+                }
+                .fastMap { it.measure(looseConstraints) }
 
         layout(layoutWidth, layoutHeight) {
             // Placing to control drawing order to match default elevation of each placeable
 
-            bodyContentPlaceables.fastForEach {
-                it.place(0, 0)
-            }
-            topBarPlaceables.fastForEach {
-                it.place(0, 0)
-            }
+            bodyContentPlaceables.fastForEach { it.place(0, 0) }
+            topBarPlaceables.fastForEach { it.place(0, 0) }
             snackbarPlaceables.fastForEach {
                 it.place(
                     (layoutWidth - snackbarWidth) / 2 +
@@ -277,9 +275,7 @@
                 )
             }
             // The bottom bar is always at the bottom of the layout
-            bottomBarPlaceables.fastForEach {
-                it.place(0, layoutHeight - (bottomBarHeight ?: 0))
-            }
+            bottomBarPlaceables.fastForEach { it.place(0, layoutHeight - (bottomBarHeight ?: 0)) }
             // Explicitly not using placeRelative here as `leftOffset` already accounts for RTL
             fabPlacement?.let { placement ->
                 fabPlaceables.fastForEach {
@@ -290,21 +286,14 @@
     }
 }
 
-/**
- * Object containing various default values for [Scaffold] component.
- */
+/** Object containing various default values for [Scaffold] component. */
 object ScaffoldDefaults {
-    /**
-     * Default insets to be used and consumed by the scaffold content slot
-     */
+    /** Default insets to be used and consumed by the scaffold content slot */
     val contentWindowInsets: WindowInsets
-        @Composable
-        get() = WindowInsets.systemBarsForVisualComponents
+        @Composable get() = WindowInsets.systemBarsForVisualComponents
 }
 
-/**
- * The possible positions for a [FloatingActionButton] attached to a [Scaffold].
- */
+/** The possible positions for a [FloatingActionButton] attached to a [Scaffold]. */
 @kotlin.jvm.JvmInline
 value class FabPosition internal constructor(@Suppress("unused") private val value: Int) {
     companion object {
@@ -347,18 +336,19 @@
  * Placement information for a [FloatingActionButton] inside a [Scaffold].
  *
  * @property left the FAB's offset from the left edge of the bottom bar, already adjusted for RTL
- * support
+ *   support
  * @property width the width of the FAB
  * @property height the height of the FAB
  */
-@Immutable
-internal class FabPlacement(
-    val left: Int,
-    val width: Int,
-    val height: Int
-)
+@Immutable internal class FabPlacement(val left: Int, val width: Int, val height: Int)
 
 // FAB spacing above the bottom bar / bottom of the Scaffold
 private val FabSpacing = 16.dp
 
-private enum class ScaffoldLayoutContent { TopBar, MainContent, Snackbar, Fab, BottomBar }
+private enum class ScaffoldLayoutContent {
+    TopBar,
+    MainContent,
+    Snackbar,
+    Fab,
+    BottomBar
+}
diff --git a/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/SegmentedButton.kt b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/SegmentedButton.kt
index 7e5455d..7df16c6 100644
--- a/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/SegmentedButton.kt
+++ b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/SegmentedButton.kt
@@ -41,9 +41,7 @@
 import androidx.compose.foundation.layout.padding
 import androidx.compose.foundation.layout.size
 import androidx.compose.foundation.layout.width
-import androidx.compose.foundation.selection.selectable
 import androidx.compose.foundation.selection.selectableGroup
-import androidx.compose.foundation.selection.toggleable
 import androidx.compose.foundation.shape.CornerBasedShape
 import androidx.compose.material.icons.Icons
 import androidx.compose.material.icons.filled.Check
@@ -91,11 +89,12 @@
 import kotlinx.coroutines.launch
 
 /**
- * <a href="https://m3.material.io/components/segmented-buttons/overview" class="external" target="_blank">Material Segmented Button</a>.
- * Segmented buttons help people select options, switch views, or sort elements.
+ * <a href="https://m3.material.io/components/segmented-buttons/overview" class="external"
+ * target="_blank">Material Segmented Button</a>. Segmented buttons help people select options,
+ * switch views, or sort elements.
  *
- * A default Toggleable Segmented Button. Also known as Outlined Segmented Button.
- * See [Modifier.toggleable].
+ * A default Toggleable Segmented Button. Also known as Outlined Segmented Button. See
+ * [Modifier.toggleable].
  *
  * Toggleable segmented buttons should be used for cases where the selection is not mutually
  * exclusive.
@@ -103,26 +102,26 @@
  * This should typically be used inside of a [MultiChoiceSegmentedButtonRow]
  *
  * For a sample showing Segmented button with only checked icons see:
+ *
  * @sample androidx.compose.material3.samples.SegmentedButtonMultiSelectSample
  *
  * @param checked whether this button is checked or not
- * @param onCheckedChange callback to be invoked when the button is clicked.
- * therefore the change of checked state in requested.
+ * @param onCheckedChange callback to be invoked when the button is clicked. therefore the change of
+ *   checked state in requested.
  * @param shape the shape for this button
  * @param modifier the [Modifier] to be applied to this button
  * @param enabled controls the enabled state of this button. When `false`, this component will not
- * respond to user input, and it will appear visually disabled and disabled to accessibility
- * services.
+ *   respond to user input, and it will appear visually disabled and disabled to accessibility
+ *   services.
  * @param colors [SegmentedButtonColors] that will be used to resolve the colors used for this
- * @param border the border for this button, see [SegmentedButtonColors]
- * Button in different states
+ * @param border the border for this button, see [SegmentedButtonColors] Button in different states
  * @param interactionSource an optional hoisted [MutableInteractionSource] for observing and
- * emitting [Interaction]s for this button. You can use this to change the button's
- * appearance or preview the button in different states. Note that if `null` is provided,
- * interactions will still happen internally.
- * @param icon the icon slot for this button, you can pass null in unchecked, in which case
- * the content will displace to show the checked icon, or pass different icon lambdas for
- * unchecked and checked in which case the icons will crossfade.
+ *   emitting [Interaction]s for this button. You can use this to change the button's appearance or
+ *   preview the button in different states. Note that if `null` is provided, interactions will
+ *   still happen internally.
+ * @param icon the icon slot for this button, you can pass null in unchecked, in which case the
+ *   content will displace to show the checked icon, or pass different icon lambdas for unchecked
+ *   and checked in which case the icons will crossfade.
  * @param label content to be rendered inside this button
  */
 @Composable
@@ -133,9 +132,8 @@
     modifier: Modifier = Modifier,
     enabled: Boolean = true,
     colors: SegmentedButtonColors = SegmentedButtonDefaults.colors(),
-    border: BorderStroke = SegmentedButtonDefaults.borderStroke(
-        colors.borderColor(enabled, checked)
-    ),
+    border: BorderStroke =
+        SegmentedButtonDefaults.borderStroke(colors.borderColor(enabled, checked)),
     interactionSource: MutableInteractionSource? = null,
     icon: @Composable () -> Unit = { SegmentedButtonDefaults.Icon(checked) },
     label: @Composable () -> Unit,
@@ -147,13 +145,14 @@
     val interactionCount = interactionSource.interactionCountAsState()
 
     Surface(
-        modifier = modifier
-            .weight(1f)
-            .interactionZIndex(checked, interactionCount)
-            .defaultMinSize(
-                minWidth = ButtonDefaults.MinWidth,
-                minHeight = ButtonDefaults.MinHeight
-            ),
+        modifier =
+            modifier
+                .weight(1f)
+                .interactionZIndex(checked, interactionCount)
+                .defaultMinSize(
+                    minWidth = ButtonDefaults.MinWidth,
+                    minHeight = ButtonDefaults.MinHeight
+                ),
         checked = checked,
         onCheckedChange = onCheckedChange,
         enabled = enabled,
@@ -168,38 +167,39 @@
 }
 
 /**
- * <a href="https://m3.material.io/components/segmented-buttons/overview" class="external" target="_blank">Material Segmented Button</a>.
- * Segmented buttons help people select options, switch views, or sort elements.
+ * <a href="https://m3.material.io/components/segmented-buttons/overview" class="external"
+ * target="_blank">Material Segmented Button</a>. Segmented buttons help people select options,
+ * switch views, or sort elements.
  *
- * A default Toggleable Segmented Button. Also known as Outlined Segmented Button.
- * See [Modifier.selectable].
+ * A default Toggleable Segmented Button. Also known as Outlined Segmented Button. See
+ * [Modifier.selectable].
  *
- * Selectable segmented buttons should be used for cases where the selection is mutually
- * exclusive, when only one button can be selected at a time.
+ * Selectable segmented buttons should be used for cases where the selection is mutually exclusive,
+ * when only one button can be selected at a time.
  *
  * This should typically be used inside of a [SingleChoiceSegmentedButtonRow]
  *
  * For a sample showing Segmented button with only checked icons see:
+ *
  * @sample androidx.compose.material3.samples.SegmentedButtonSingleSelectSample
  *
  * @param selected whether this button is selected or not
- * @param onClick callback to be invoked when the button is clicked.
- * therefore the change of checked state in requested.
+ * @param onClick callback to be invoked when the button is clicked. therefore the change of checked
+ *   state in requested.
  * @param shape the shape for this button
  * @param modifier the [Modifier] to be applied to this button
  * @param enabled controls the enabled state of this button. When `false`, this component will not
- * respond to user input, and it will appear visually disabled and disabled to accessibility
- * services.
+ *   respond to user input, and it will appear visually disabled and disabled to accessibility
+ *   services.
  * @param colors [SegmentedButtonColors] that will be used to resolve the colors used for this
- * @param border the border for this button, see [SegmentedButtonColors]
- * Button in different states
+ * @param border the border for this button, see [SegmentedButtonColors] Button in different states
  * @param interactionSource an optional hoisted [MutableInteractionSource] for observing and
- * emitting [Interaction]s for this button. You can use this to change the button's
- * appearance or preview the button in different states. Note that if `null` is provided,
- * interactions will still happen internally.
- * @param icon the icon slot for this button, you can pass null in unchecked, in which case
- * the content will displace to show the checked icon, or pass different icon lambdas for
- * unchecked and checked in which case the icons will crossfade.
+ *   emitting [Interaction]s for this button. You can use this to change the button's appearance or
+ *   preview the button in different states. Note that if `null` is provided, interactions will
+ *   still happen internally.
+ * @param icon the icon slot for this button, you can pass null in unchecked, in which case the
+ *   content will displace to show the checked icon, or pass different icon lambdas for unchecked
+ *   and checked in which case the icons will crossfade.
  * @param label content to be rendered inside this button
  */
 @Composable
@@ -210,9 +210,8 @@
     modifier: Modifier = Modifier,
     enabled: Boolean = true,
     colors: SegmentedButtonColors = SegmentedButtonDefaults.colors(),
-    border: BorderStroke = SegmentedButtonDefaults.borderStroke(
-        colors.borderColor(enabled, selected)
-    ),
+    border: BorderStroke =
+        SegmentedButtonDefaults.borderStroke(colors.borderColor(enabled, selected)),
     interactionSource: MutableInteractionSource? = null,
     icon: @Composable () -> Unit = { SegmentedButtonDefaults.Icon(selected) },
     label: @Composable () -> Unit,
@@ -224,14 +223,15 @@
     val interactionCount = interactionSource.interactionCountAsState()
 
     Surface(
-        modifier = modifier
-            .weight(1f)
-            .interactionZIndex(selected, interactionCount)
-            .defaultMinSize(
-                minWidth = ButtonDefaults.MinWidth,
-                minHeight = ButtonDefaults.MinHeight
-            )
-            .semantics { role = Role.RadioButton },
+        modifier =
+            modifier
+                .weight(1f)
+                .interactionZIndex(selected, interactionCount)
+                .defaultMinSize(
+                    minWidth = ButtonDefaults.MinWidth,
+                    minHeight = ButtonDefaults.MinHeight
+                )
+                .semantics { role = Role.RadioButton },
         selected = selected,
         onClick = onClick,
         enabled = enabled,
@@ -246,20 +246,20 @@
 }
 
 /**
- * <a href="https://m3.material.io/components/segmented-buttons/overview" class="external" target="_blank">Material Segmented Button</a>.
+ * <a href="https://m3.material.io/components/segmented-buttons/overview" class="external"
+ * target="_blank">Material Segmented Button</a>.
  *
- * A Layout to correctly position and size [SegmentedButton]s in a Row.
- * It handles overlapping items so that strokes of the item are correctly on top of each other.
- * [SingleChoiceSegmentedButtonRow] is used when the selection only allows one value, for correct
- * semantics.
+ * A Layout to correctly position and size [SegmentedButton]s in a Row. It handles overlapping items
+ * so that strokes of the item are correctly on top of each other. [SingleChoiceSegmentedButtonRow]
+ * is used when the selection only allows one value, for correct semantics.
  *
  * @sample androidx.compose.material3.samples.SegmentedButtonSingleSelectSample
  *
  * @param modifier the [Modifier] to be applied to this row
  * @param space the dimension of the overlap between buttons. Should be equal to the stroke width
- *  used on the items.
+ *   used on the items.
  * @param content the content of this Segmented Button Row, typically a sequence of
- * [SegmentedButton]s
+ *   [SegmentedButton]s
  */
 @Composable
 fun SingleChoiceSegmentedButtonRow(
@@ -268,10 +268,11 @@
     content: @Composable SingleChoiceSegmentedButtonRowScope.() -> Unit
 ) {
     Row(
-        modifier = modifier
-            .selectableGroup()
-            .defaultMinSize(minHeight = OutlinedSegmentedButtonTokens.ContainerHeight)
-            .width(IntrinsicSize.Min),
+        modifier =
+            modifier
+                .selectableGroup()
+                .defaultMinSize(minHeight = OutlinedSegmentedButtonTokens.ContainerHeight)
+                .width(IntrinsicSize.Min),
         horizontalArrangement = Arrangement.spacedBy(-space),
         verticalAlignment = Alignment.CenterVertically
     ) {
@@ -281,10 +282,11 @@
 }
 
 /**
- * <a href="https://m3.material.io/components/segmented-buttons/overview" class="external" target="_blank">Material Segmented Button</a>.
+ * <a href="https://m3.material.io/components/segmented-buttons/overview" class="external"
+ * target="_blank">Material Segmented Button</a>.
  *
- * A Layout to correctly position, size, and add semantics to [SegmentedButton]s in a Row.
- * It handles overlapping items so that strokes of the item are correctly on top of each other.
+ * A Layout to correctly position, size, and add semantics to [SegmentedButton]s in a Row. It
+ * handles overlapping items so that strokes of the item are correctly on top of each other.
  *
  * [MultiChoiceSegmentedButtonRow] is used when the selection allows multiple value, for correct
  * semantics.
@@ -293,10 +295,9 @@
  *
  * @param modifier the [Modifier] to be applied to this row
  * @param space the dimension of the overlap between buttons. Should be equal to the stroke width
- *  used on the items.
+ *   used on the items.
  * @param content the content of this Segmented Button Row, typically a sequence of
- * [SegmentedButton]s
- *
+ *   [SegmentedButton]s
  */
 @Composable
 fun MultiChoiceSegmentedButtonRow(
@@ -305,9 +306,10 @@
     content: @Composable MultiChoiceSegmentedButtonRowScope.() -> Unit
 ) {
     Row(
-        modifier = modifier
-            .defaultMinSize(minHeight = OutlinedSegmentedButtonTokens.ContainerHeight)
-            .width(IntrinsicSize.Min),
+        modifier =
+            modifier
+                .defaultMinSize(minHeight = OutlinedSegmentedButtonTokens.ContainerHeight)
+                .width(IntrinsicSize.Min),
         horizontalArrangement = Arrangement.spacedBy(-space),
         verticalAlignment = Alignment.CenterVertically
     ) {
@@ -339,9 +341,8 @@
     }
 }
 
-internal class SegmentedButtonContentMeasurePolicy(
-    val scope: CoroutineScope
-) : MultiContentMeasurePolicy {
+internal class SegmentedButtonContentMeasurePolicy(val scope: CoroutineScope) :
+    MultiContentMeasurePolicy {
     var animatable: Animatable<Int, AnimationVector1D>? = null
     private var initialOffset: Int? = null
 
@@ -355,20 +356,23 @@
         val contentPlaceables = contentMeasurables.fastMap { it.measure(constraints) }
         val contentWidth = contentPlaceables.fastMaxBy { it.width }?.width
         val height = contentPlaceables.fastMaxBy { it.height }?.height ?: 0
-        val width = maxOf(SegmentedButtonDefaults.IconSize.roundToPx(), iconWidth) +
-            IconSpacing.roundToPx() +
-            (contentWidth ?: 0)
-        val offsetX = if (iconWidth == 0) {
-            -(SegmentedButtonDefaults.IconSize.roundToPx() + IconSpacing.roundToPx()) / 2
-        } else {
-            0
-        }
+        val width =
+            maxOf(SegmentedButtonDefaults.IconSize.roundToPx(), iconWidth) +
+                IconSpacing.roundToPx() +
+                (contentWidth ?: 0)
+        val offsetX =
+            if (iconWidth == 0) {
+                -(SegmentedButtonDefaults.IconSize.roundToPx() + IconSpacing.roundToPx()) / 2
+            } else {
+                0
+            }
 
         if (initialOffset == null) {
             initialOffset = offsetX
         } else {
-            val anim = animatable ?: Animatable(initialOffset!!, Int.VectorConverter)
-                .also { animatable = it }
+            val anim =
+                animatable
+                    ?: Animatable(initialOffset!!, Int.VectorConverter).also { animatable = it }
             if (anim.targetValue != offsetX) {
                 scope.launch {
                     anim.animateTo(offsetX, tween(MotionTokens.DurationMedium3.toInt()))
@@ -377,19 +381,14 @@
         }
 
         return layout(width, height) {
-            iconPlaceables.fastForEach {
-                it.place(0, (height - it.height) / 2)
-            }
+            iconPlaceables.fastForEach { it.place(0, (height - it.height) / 2) }
 
-            val contentOffsetX = SegmentedButtonDefaults.IconSize.roundToPx() +
-                IconSpacing.roundToPx() + (animatable?.value ?: offsetX)
+            val contentOffsetX =
+                SegmentedButtonDefaults.IconSize.roundToPx() +
+                    IconSpacing.roundToPx() +
+                    (animatable?.value ?: offsetX)
 
-            contentPlaceables.fastForEach {
-                it.place(
-                    contentOffsetX,
-                    (height - it.height) / 2
-                )
-            }
+            contentPlaceables.fastForEach { it.place(contentOffsetX, (height - it.height) / 2) }
         }
     }
 }
@@ -404,7 +403,6 @@
                 is FocusInteraction.Focus -> {
                     interactionCount.intValue++
                 }
-
                 is PressInteraction.Release,
                 is FocusInteraction.Unfocus,
                 is PressInteraction.Cancel -> {
@@ -428,15 +426,14 @@
 object SegmentedButtonDefaults {
 
     /**
-     * Creates a [SegmentedButtonColors] that represents the different colors
-     * used in a [SegmentedButton] in different states.
+     * Creates a [SegmentedButtonColors] that represents the different colors used in a
+     * [SegmentedButton] in different states.
      */
-    @Composable
-    fun colors() = MaterialTheme.colorScheme.defaultSegmentedButtonColors
+    @Composable fun colors() = MaterialTheme.colorScheme.defaultSegmentedButtonColors
 
     /**
-     * Creates a [SegmentedButtonColors] that represents the different colors
-     * used in a [SegmentedButton] in different states.
+     * Creates a [SegmentedButtonColors] that represents the different colors used in a
+     * [SegmentedButton] in different states.
      *
      * @param activeContainerColor the color used for the container when enabled and active
      * @param activeContentColor the color used for the content when enabled and active
@@ -444,14 +441,13 @@
      * @param inactiveContainerColor the color used for the container when enabled and inactive
      * @param inactiveContentColor the color used for the content when enabled and inactive
      * @param inactiveBorderColor the color used for the border when enabled and active
-     * @param disabledActiveContainerColor the color used for the container
-     * when disabled and active
+     * @param disabledActiveContainerColor the color used for the container when disabled and active
      * @param disabledActiveContentColor the color used for the content when disabled and active
      * @param disabledActiveBorderColor the color used for the border when disabled and active
-     * @param disabledInactiveContainerColor the color used for the container
-     * when disabled and inactive
+     * @param disabledInactiveContainerColor the color used for the container when disabled and
+     *   inactive
      * @param disabledInactiveContentColor the color used for the content when disabled and
-     * unchecked
+     *   unchecked
      * @param disabledInactiveBorderColor the color used for the border when disabled and inactive
      */
     @Composable
@@ -468,41 +464,43 @@
         disabledInactiveContainerColor: Color = Color.Unspecified,
         disabledInactiveContentColor: Color = Color.Unspecified,
         disabledInactiveBorderColor: Color = Color.Unspecified,
-    ): SegmentedButtonColors = MaterialTheme.colorScheme.defaultSegmentedButtonColors.copy(
-        activeContainerColor = activeContainerColor,
-        activeContentColor = activeContentColor,
-        activeBorderColor = activeBorderColor,
-        inactiveContainerColor = inactiveContainerColor,
-        inactiveContentColor = inactiveContentColor,
-        inactiveBorderColor = inactiveBorderColor,
-        disabledActiveContainerColor = disabledActiveContainerColor,
-        disabledActiveContentColor = disabledActiveContentColor,
-        disabledActiveBorderColor = disabledActiveBorderColor,
-        disabledInactiveContainerColor = disabledInactiveContainerColor,
-        disabledInactiveContentColor = disabledInactiveContentColor,
-        disabledInactiveBorderColor = disabledInactiveBorderColor
-    )
+    ): SegmentedButtonColors =
+        MaterialTheme.colorScheme.defaultSegmentedButtonColors.copy(
+            activeContainerColor = activeContainerColor,
+            activeContentColor = activeContentColor,
+            activeBorderColor = activeBorderColor,
+            inactiveContainerColor = inactiveContainerColor,
+            inactiveContentColor = inactiveContentColor,
+            inactiveBorderColor = inactiveBorderColor,
+            disabledActiveContainerColor = disabledActiveContainerColor,
+            disabledActiveContentColor = disabledActiveContentColor,
+            disabledActiveBorderColor = disabledActiveBorderColor,
+            disabledInactiveContainerColor = disabledInactiveContainerColor,
+            disabledInactiveContentColor = disabledInactiveContentColor,
+            disabledInactiveBorderColor = disabledInactiveBorderColor
+        )
 
     internal val ColorScheme.defaultSegmentedButtonColors: SegmentedButtonColors
         get() {
-            return defaultSegmentedButtonColorsCached ?: SegmentedButtonColors(
-                activeContainerColor = fromToken(SelectedContainerColor),
-                activeContentColor = fromToken(SelectedLabelTextColor),
-                activeBorderColor = fromToken(OutlineColor),
-                inactiveContainerColor = surface,
-                inactiveContentColor = fromToken(UnselectedLabelTextColor),
-                inactiveBorderColor = fromToken(OutlineColor),
-                disabledActiveContainerColor = fromToken(SelectedContainerColor),
-                disabledActiveContentColor = fromToken(DisabledLabelTextColor)
-                    .copy(alpha = DisabledLabelTextOpacity),
-                disabledActiveBorderColor = fromToken(OutlineColor)
-                    .copy(alpha = DisabledOutlineOpacity),
-                disabledInactiveContainerColor = surface,
-                disabledInactiveContentColor = fromToken(DisabledLabelTextColor),
-                disabledInactiveBorderColor = fromToken(OutlineColor),
-            ).also {
-                defaultSegmentedButtonColorsCached = it
-            }
+            return defaultSegmentedButtonColorsCached
+                ?: SegmentedButtonColors(
+                        activeContainerColor = fromToken(SelectedContainerColor),
+                        activeContentColor = fromToken(SelectedLabelTextColor),
+                        activeBorderColor = fromToken(OutlineColor),
+                        inactiveContainerColor = surface,
+                        inactiveContentColor = fromToken(UnselectedLabelTextColor),
+                        inactiveBorderColor = fromToken(OutlineColor),
+                        disabledActiveContainerColor = fromToken(SelectedContainerColor),
+                        disabledActiveContentColor =
+                            fromToken(DisabledLabelTextColor)
+                                .copy(alpha = DisabledLabelTextOpacity),
+                        disabledActiveBorderColor =
+                            fromToken(OutlineColor).copy(alpha = DisabledOutlineOpacity),
+                        disabledInactiveContainerColor = surface,
+                        disabledInactiveContentColor = fromToken(DisabledLabelTextColor),
+                        disabledInactiveBorderColor = fromToken(OutlineColor),
+                    )
+                    .also { defaultSegmentedButtonColorsCached = it }
         }
 
     /**
@@ -524,7 +522,7 @@
      * @param index the index for this button in the row
      * @param count the count of buttons in this row
      * @param baseShape the [CornerBasedShape] the base shape that should be used in buttons that
-     * are not in the start or the end.
+     *   are not in the start or the end.
      */
     @Composable
     @ReadOnlyComposable
@@ -540,9 +538,7 @@
         }
     }
 
-    /**
-     * Icon size to use for icons used in [SegmentedButton]
-     */
+    /** Icon size to use for icons used in [SegmentedButton] */
     val IconSize = OutlinedSegmentedButtonTokens.IconSize
 
     /** And icon to indicate the segmented button is checked or selected */
@@ -561,7 +557,7 @@
      * @param active whether the button is activated or not.
      * @param activeContent usually a checkmark icon of [IconSize] dimensions.
      * @param inactiveContent typically an icon of [IconSize]. It shows only when the button is not
-     * checked.
+     *   checked.
      */
     @Composable
     fun Icon(
@@ -573,24 +569,24 @@
             AnimatedVisibility(
                 visible = active,
                 exit = ExitTransition.None,
-                enter = fadeIn(tween(MotionTokens.DurationMedium3.toInt())) + scaleIn(
-                    initialScale = 0f,
-                    transformOrigin = TransformOrigin(0f, 1f),
-                    animationSpec = tween(MotionTokens.DurationMedium3.toInt()),
-                ),
+                enter =
+                    fadeIn(tween(MotionTokens.DurationMedium3.toInt())) +
+                        scaleIn(
+                            initialScale = 0f,
+                            transformOrigin = TransformOrigin(0f, 1f),
+                            animationSpec = tween(MotionTokens.DurationMedium3.toInt()),
+                        ),
             ) {
                 activeContent()
             }
         } else {
-            Crossfade(targetState = active) {
-                if (it) activeContent() else inactiveContent()
-            }
+            Crossfade(targetState = active) { if (it) activeContent() else inactiveContent() }
         }
     }
 
     /**
-     * Default factory for Segmented Button [BorderStroke] can be customized through [width],
-     * and [color]. When using a width different than default make sure to also update
+     * Default factory for Segmented Button [BorderStroke] can be customized through [width], and
+     * [color]. When using a width different than default make sure to also update
      * [MultiChoiceSegmentedButtonRow] or [SingleChoiceSegmentedButtonRow] space param.
      */
     fun borderStroke(
@@ -602,9 +598,6 @@
 /**
  * The different colors used in parts of the [SegmentedButton] in different states
  *
- * @constructor create an instance with arbitrary colors, see [SegmentedButtonDefaults] for a
- * factory method using the default material3 spec
- *
  * @param activeContainerColor the color used for the container when enabled and active
  * @param activeContentColor the color used for the content when enabled and active
  * @param activeBorderColor the color used for the border when enabled and active
@@ -614,10 +607,11 @@
  * @param disabledActiveContainerColor the color used for the container when disabled and active
  * @param disabledActiveContentColor the color used for the content when disabled and active
  * @param disabledActiveBorderColor the color used for the border when disabled and active
- * @param disabledInactiveContainerColor the color used for the container
- * when disabled and inactive
+ * @param disabledInactiveContainerColor the color used for the container when disabled and inactive
  * @param disabledInactiveContentColor the color used for the content when disabled and inactive
  * @param disabledInactiveBorderColor the color used for the border when disabled and inactive
+ * @constructor create an instance with arbitrary colors, see [SegmentedButtonDefaults] for a
+ *   factory method using the default material3 spec
  */
 @Immutable
 class SegmentedButtonColors(
@@ -639,8 +633,8 @@
     val disabledInactiveBorderColor: Color
 ) {
     /**
-     * Returns a copy of this ChipColors, optionally overriding some of the ues.
-     * This uses the Color.Unspecified to mean “use the value from the source”
+     * Returns a copy of this ChipColors, optionally overriding some of the ues. This uses the
+     * Color.Unspecified to mean “use the value from the source”
      */
     fun copy(
         activeContainerColor: Color = this.activeContainerColor,
@@ -655,24 +649,25 @@
         disabledInactiveContainerColor: Color = this.disabledInactiveContainerColor,
         disabledInactiveContentColor: Color = this.disabledInactiveContentColor,
         disabledInactiveBorderColor: Color = this.disabledInactiveBorderColor
-    ) = SegmentedButtonColors(
-        activeContainerColor.takeOrElse { this.activeContainerColor },
-        activeContentColor.takeOrElse { this.activeContentColor },
-        activeBorderColor.takeOrElse { this.activeBorderColor },
-        inactiveContainerColor.takeOrElse { this.inactiveContainerColor },
-        inactiveContentColor.takeOrElse { this.inactiveContentColor },
-        inactiveBorderColor.takeOrElse { this.inactiveBorderColor },
-        disabledActiveContainerColor.takeOrElse { this.disabledActiveContainerColor },
-        disabledActiveContentColor.takeOrElse { this.disabledActiveContentColor },
-        disabledActiveBorderColor.takeOrElse { this.disabledActiveBorderColor },
-        disabledInactiveContainerColor.takeOrElse { this.disabledInactiveContainerColor },
-        disabledInactiveContentColor.takeOrElse { this.disabledInactiveContentColor },
-        disabledInactiveBorderColor.takeOrElse { this.disabledInactiveBorderColor }
-    )
+    ) =
+        SegmentedButtonColors(
+            activeContainerColor.takeOrElse { this.activeContainerColor },
+            activeContentColor.takeOrElse { this.activeContentColor },
+            activeBorderColor.takeOrElse { this.activeBorderColor },
+            inactiveContainerColor.takeOrElse { this.inactiveContainerColor },
+            inactiveContentColor.takeOrElse { this.inactiveContentColor },
+            inactiveBorderColor.takeOrElse { this.inactiveBorderColor },
+            disabledActiveContainerColor.takeOrElse { this.disabledActiveContainerColor },
+            disabledActiveContentColor.takeOrElse { this.disabledActiveContentColor },
+            disabledActiveBorderColor.takeOrElse { this.disabledActiveBorderColor },
+            disabledInactiveContainerColor.takeOrElse { this.disabledInactiveContainerColor },
+            disabledInactiveContentColor.takeOrElse { this.disabledInactiveContentColor },
+            disabledInactiveBorderColor.takeOrElse { this.disabledInactiveBorderColor }
+        )
 
     /**
-     * Represents the color used for the SegmentedButton's border,
-     * depending on [enabled] and [active].
+     * Represents the color used for the SegmentedButton's border, depending on [enabled] and
+     * [active].
      *
      * @param enabled whether the [SegmentedButton] is enabled or not
      * @param active whether the [SegmentedButton] item is checked or not
diff --git a/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/Shapes.kt b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/Shapes.kt
index 4edc870..cd9c254 100644
--- a/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/Shapes.kt
+++ b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/Shapes.kt
@@ -43,28 +43,29 @@
  * - Large
  * - Extra Large
  *
- * You can customize the shape system for all components in the [MaterialTheme] or you can do it
- * on a per component basis.
+ * You can customize the shape system for all components in the [MaterialTheme] or you can do it on
+ * a per component basis.
  *
  * You can change the shape that a component has by overriding the shape parameter for that
  * component. For example, by default, buttons use the shape style “full.” If your product requires
  * a smaller amount of roundedness, you can override the shape parameter with a different shape
  * value like [MaterialTheme.shapes.small].
  *
- * To learn more about shapes, see [Material Design shapes](https://m3.material.io/styles/shape/overview).
+ * To learn more about shapes, see
+ * [Material Design shapes](https://m3.material.io/styles/shape/overview).
  *
  * @param extraSmall A shape style with 4 same-sized corners whose size are bigger than
- * [RectangleShape] and smaller than [Shapes.small]. By default autocomplete menu, select menu,
- * snackbars, standard menu, and text fields use this shape.
+ *   [RectangleShape] and smaller than [Shapes.small]. By default autocomplete menu, select menu,
+ *   snackbars, standard menu, and text fields use this shape.
  * @param small A shape style with 4 same-sized corners whose size are bigger than
- * [Shapes.extraSmall] and smaller than [Shapes.medium]. By default chips use this shape.
+ *   [Shapes.extraSmall] and smaller than [Shapes.medium]. By default chips use this shape.
  * @param medium A shape style with 4 same-sized corners whose size are bigger than [Shapes.small]
- * and smaller than [Shapes.large]. By default cards and small FABs use this shape.
+ *   and smaller than [Shapes.large]. By default cards and small FABs use this shape.
  * @param large A shape style with 4 same-sized corners whose size are bigger than [Shapes.medium]
- * and smaller than [Shapes.extraLarge]. By default extended FABs, FABs, and navigation drawers use
- * this shape.
+ *   and smaller than [Shapes.extraLarge]. By default extended FABs, FABs, and navigation drawers
+ *   use this shape.
  * @param extraLarge A shape style with 4 same-sized corners whose size are bigger than
- * [Shapes.large] and smaller than [CircleShape]. By default large FABs use this shape.
+ *   [Shapes.large] and smaller than [CircleShape]. By default large FABs use this shape.
  */
 @Immutable
 class Shapes(
@@ -82,13 +83,14 @@
         medium: CornerBasedShape = this.medium,
         large: CornerBasedShape = this.large,
         extraLarge: CornerBasedShape = this.extraLarge,
-    ): Shapes = Shapes(
-        extraSmall = extraSmall,
-        small = small,
-        medium = medium,
-        large = large,
-        extraLarge = extraLarge,
-    )
+    ): Shapes =
+        Shapes(
+            extraSmall = extraSmall,
+            small = small,
+            medium = medium,
+            large = large,
+            extraLarge = extraLarge,
+        )
 
     override fun equals(other: Any?): Boolean {
         if (this === other) return true
@@ -120,9 +122,7 @@
     }
 }
 
-/**
- * Contains the default values used by [Shapes]
- */
+/** Contains the default values used by [Shapes] */
 object ShapeDefaults {
     /** Extra small sized corner shape */
     val ExtraSmall: CornerBasedShape = ShapeTokens.CornerExtraSmall
@@ -152,7 +152,9 @@
     return copy(topStart = CornerSize(0.0.dp), topEnd = CornerSize(0.0.dp))
 }
 
-/** Helper function for component shape tokens. Used to grab the start values of a shape parameter. */
+/**
+ * Helper function for component shape tokens. Used to grab the start values of a shape parameter.
+ */
 internal fun CornerBasedShape.start(): CornerBasedShape {
     return copy(topEnd = CornerSize(0.0.dp), bottomEnd = CornerSize(0.0.dp))
 }
@@ -164,8 +166,7 @@
 
 /**
  * Helper function for component shape tokens. Here is an example on how to use component color
- * tokens:
- * ``MaterialTheme.shapes.fromToken(FabPrimarySmallTokens.ContainerShape)``
+ * tokens: ``MaterialTheme.shapes.fromToken(FabPrimarySmallTokens.ContainerShape)``
  */
 internal fun Shapes.fromToken(value: ShapeKeyTokens): Shape {
     return when (value) {
@@ -184,13 +185,11 @@
 }
 
 /**
- * Converts a shape token key to the local shape provided by the theme
- * The color is subscribed to [LocalShapes] changes
+ * Converts a shape token key to the local shape provided by the theme The color is subscribed to
+ * [LocalShapes] changes
  */
 internal val ShapeKeyTokens.value: Shape
-    @Composable
-    @ReadOnlyComposable
-    get() = MaterialTheme.shapes.fromToken(this)
+    @Composable @ReadOnlyComposable get() = MaterialTheme.shapes.fromToken(this)
 
 /** CompositionLocal used to specify the default shapes for the surfaces. */
 internal val LocalShapes = staticCompositionLocalOf { Shapes() }
diff --git a/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/SheetDefaults.kt b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/SheetDefaults.kt
index a04b579..a97f7c0 100644
--- a/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/SheetDefaults.kt
+++ b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/SheetDefaults.kt
@@ -61,16 +61,16 @@
  *
  * Contains states relating to its swipe position as well as animations between state values.
  *
- * @param skipPartiallyExpanded Whether the partially expanded state, if the sheet is large
- * enough, should be skipped. If true, the sheet will always expand to the [Expanded] state and move
- * to the [Hidden] state if available when hiding the sheet, either programmatically or by user
- * interaction.
+ * @param skipPartiallyExpanded Whether the partially expanded state, if the sheet is large enough,
+ *   should be skipped. If true, the sheet will always expand to the [Expanded] state and move to
+ *   the [Hidden] state if available when hiding the sheet, either programmatically or by user
+ *   interaction.
  * @param initialValue The initial value of the state.
  * @param density The density that this state can use to convert values to and from dp.
  * @param confirmValueChange Optional callback invoked to confirm or veto a pending state change.
  * @param skipHiddenState Whether the hidden state should be skipped. If true, the sheet will always
- * expand to the [Expanded] state and move to the [PartiallyExpanded] if available, either
- * programmatically or by user interaction.
+ *   expand to the [Expanded] state and move to the [PartiallyExpanded] if available, either
+ *   programmatically or by user interaction.
  */
 @Stable
 @ExperimentalMaterial3Api
@@ -102,21 +102,20 @@
      * currently in. If a swipe or an animation is in progress, this corresponds the state the sheet
      * was in before the swipe or animation started.
      */
-
-    val currentValue: SheetValue get() = anchoredDraggableState.currentValue
+    val currentValue: SheetValue
+        get() = anchoredDraggableState.currentValue
 
     /**
      * The target value of the bottom sheet state.
      *
-     * If a swipe is in progress, this is the value that the sheet would animate to if the
-     * swipe finishes. If an animation is running, this is the target value of that animation.
-     * Finally, if no swipe or animation is in progress, this is the same as the [currentValue].
+     * If a swipe is in progress, this is the value that the sheet would animate to if the swipe
+     * finishes. If an animation is running, this is the target value of that animation. Finally, if
+     * no swipe or animation is in progress, this is the same as the [currentValue].
      */
-    val targetValue: SheetValue get() = anchoredDraggableState.targetValue
+    val targetValue: SheetValue
+        get() = anchoredDraggableState.targetValue
 
-    /**
-     * Whether the modal bottom sheet is visible.
-     */
+    /** Whether the modal bottom sheet is visible. */
     val isVisible: Boolean
         get() = anchoredDraggableState.currentValue != Hidden
 
@@ -126,8 +125,8 @@
      * The offset will be initialized during the first measurement phase of the provided sheet
      * content.
      *
-     * These are the phases:
-     * Composition { -> Effects } -> Layout { Measurement -> Placement } -> Drawing
+     * These are the phases: Composition { -> Effects } -> Layout { Measurement -> Placement } ->
+     * Drawing
      *
      * During the first composition, an [IllegalStateException] is thrown. In subsequent
      * compositions, the offset will be derived from the anchors of the previous pass. Always prefer
@@ -138,16 +137,11 @@
      */
     fun requireOffset(): Float = anchoredDraggableState.requireOffset()
 
-    /**
-     * Whether the sheet has an expanded state defined.
-     */
-
+    /** Whether the sheet has an expanded state defined. */
     val hasExpandedState: Boolean
         get() = anchoredDraggableState.anchors.hasAnchorFor(Expanded)
 
-    /**
-     * Whether the modal bottom sheet has a partially expanded state defined.
-     */
+    /** Whether the modal bottom sheet has a partially expanded state defined. */
     val hasPartiallyExpandedState: Boolean
         get() = anchoredDraggableState.anchors.hasAnchorFor(PartiallyExpanded)
 
@@ -155,6 +149,7 @@
      * Fully expand the bottom sheet with animation and suspend until it is fully expanded or
      * animation has been cancelled.
      * *
+     *
      * @throws [CancellationException] if the animation is interrupted
      */
     suspend fun expand() {
@@ -164,6 +159,7 @@
     /**
      * Animate the bottom sheet and suspend until it is partially expanded or animation has been
      * cancelled.
+     *
      * @throws [CancellationException] if the animation is interrupted
      * @throws [IllegalStateException] if [skipPartiallyExpanded] is set to true
      */
@@ -178,19 +174,22 @@
     /**
      * Expand the bottom sheet with animation and suspend until it is [PartiallyExpanded] if defined
      * else [Expanded].
+     *
      * @throws [CancellationException] if the animation is interrupted
      */
     suspend fun show() {
-        val targetValue = when {
-            hasPartiallyExpandedState -> PartiallyExpanded
-            else -> Expanded
-        }
+        val targetValue =
+            when {
+                hasPartiallyExpandedState -> PartiallyExpanded
+                else -> Expanded
+            }
         animateTo(targetValue)
     }
 
     /**
      * Hide the bottom sheet with animation and suspend until it is fully hidden or animation has
      * been cancelled.
+     *
      * @throws [CancellationException] if the animation is interrupted
      */
     suspend fun hide() {
@@ -202,14 +201,13 @@
     }
 
     /**
-     * Animate to a [targetValue].
-     * If the [targetValue] is not in the set of anchors, the [currentValue] will be updated to the
-     * [targetValue] without updating the offset.
-     *
-     * @throws CancellationException if the interaction interrupted by another interaction like a
-     * gesture interaction or another programmatic interaction like a [animateTo] or [snapTo] call.
+     * Animate to a [targetValue]. If the [targetValue] is not in the set of anchors, the
+     * [currentValue] will be updated to the [targetValue] without updating the offset.
      *
      * @param targetValue The target value of the animation
+     * @throws CancellationException if the interaction interrupted by another interaction like a
+     *   gesture interaction or another programmatic interaction like a [animateTo] or [snapTo]
+     *   call.
      */
     internal suspend fun animateTo(
         targetValue: SheetValue,
@@ -221,10 +219,10 @@
     /**
      * Snap to a [targetValue] without any animation.
      *
-     * @throws CancellationException if the interaction interrupted by another interaction like a
-     * gesture interaction or another programmatic interaction like a [animateTo] or [snapTo] call.
-     *
      * @param targetValue The target value of the animation
+     * @throws CancellationException if the interaction interrupted by another interaction like a
+     *   gesture interaction or another programmatic interaction like a [animateTo] or [snapTo]
+     *   call.
      */
     internal suspend fun snapTo(targetValue: SheetValue) {
         anchoredDraggableState.snapTo(targetValue)
@@ -237,110 +235,88 @@
         anchoredDraggableState.settle(velocity)
     }
 
-    internal var anchoredDraggableState = AnchoredDraggableState(
-        initialValue = initialValue,
-        animationSpec = BottomSheetAnimationSpec,
-        confirmValueChange = confirmValueChange,
-        positionalThreshold = { with(density) { 56.dp.toPx() } },
-        velocityThreshold = { with(density) { 125.dp.toPx() } },
-    )
+    internal var anchoredDraggableState =
+        AnchoredDraggableState(
+            initialValue = initialValue,
+            animationSpec = BottomSheetAnimationSpec,
+            confirmValueChange = confirmValueChange,
+            positionalThreshold = { with(density) { 56.dp.toPx() } },
+            velocityThreshold = { with(density) { 125.dp.toPx() } },
+        )
 
-    internal val offset: Float? get() = anchoredDraggableState.offset
+    internal val offset: Float?
+        get() = anchoredDraggableState.offset
 
     companion object {
-        /**
-         * The default [Saver] implementation for [SheetState].
-         */
+        /** The default [Saver] implementation for [SheetState]. */
         fun Saver(
             skipPartiallyExpanded: Boolean,
             confirmValueChange: (SheetValue) -> Boolean,
             density: Density,
             skipHiddenState: Boolean,
-        ) = Saver<SheetState, SheetValue>(
-            save = { it.currentValue },
-            restore = { savedValue ->
-                SheetState(
-                    skipPartiallyExpanded,
-                    density,
-                    savedValue,
-                    confirmValueChange,
-                    skipHiddenState,
-                )
-            }
-        )
+        ) =
+            Saver<SheetState, SheetValue>(
+                save = { it.currentValue },
+                restore = { savedValue ->
+                    SheetState(
+                        skipPartiallyExpanded,
+                        density,
+                        savedValue,
+                        confirmValueChange,
+                        skipHiddenState,
+                    )
+                }
+            )
     }
 }
 
-/**
- * Possible values of [SheetState].
- */
+/** Possible values of [SheetState]. */
 @ExperimentalMaterial3Api
 enum class SheetValue {
-    /**
-     * The sheet is not visible.
-     */
+    /** The sheet is not visible. */
     Hidden,
 
-    /**
-     * The sheet is visible at full height.
-     */
+    /** The sheet is visible at full height. */
     Expanded,
 
-    /**
-     * The sheet is partially visible.
-     */
+    /** The sheet is partially visible. */
     PartiallyExpanded,
 }
 
-/**
- * Contains the default values used by [ModalBottomSheet] and [BottomSheetScaffold].
- */
+/** Contains the default values used by [ModalBottomSheet] and [BottomSheetScaffold]. */
 @Stable
 @ExperimentalMaterial3Api
 object BottomSheetDefaults {
     /** The default shape for bottom sheets in a [Hidden] state. */
     val HiddenShape: Shape
-        @Composable get() =
-            SheetBottomTokens.DockedMinimizedContainerShape.value
+        @Composable get() = SheetBottomTokens.DockedMinimizedContainerShape.value
 
     /** The default shape for a bottom sheets in [PartiallyExpanded] and [Expanded] states. */
     val ExpandedShape: Shape
-        @Composable get() =
-            SheetBottomTokens.DockedContainerShape.value
+        @Composable get() = SheetBottomTokens.DockedContainerShape.value
 
     /** The default container color for a bottom sheet. */
     val ContainerColor: Color
-        @Composable get() =
-            SheetBottomTokens.DockedContainerColor.value
+        @Composable get() = SheetBottomTokens.DockedContainerColor.value
 
     /** The default elevation for a bottom sheet. */
     val Elevation = SheetBottomTokens.DockedModalContainerElevation
 
     /** The default color of the scrim overlay for background content. */
     val ScrimColor: Color
-        @Composable get() =
-            ScrimTokens.ContainerColor.value.copy(ScrimTokens.ContainerOpacity)
+        @Composable get() = ScrimTokens.ContainerColor.value.copy(ScrimTokens.ContainerOpacity)
 
-    /**
-     * The default peek height used by [BottomSheetScaffold].
-     */
+    /** The default peek height used by [BottomSheetScaffold]. */
     val SheetPeekHeight = 56.dp
 
-    /**
-     * The default max width used by [ModalBottomSheet] and [BottomSheetScaffold]
-     */
+    /** The default max width used by [ModalBottomSheet] and [BottomSheetScaffold] */
     val SheetMaxWidth = 640.dp
 
-    /**
-     * Default insets to be used and consumed by the [ModalBottomSheet]'s content.
-     */
+    /** Default insets to be used and consumed by the [ModalBottomSheet]'s content. */
     val windowInsets: WindowInsets
-        @Composable
-        get() = WindowInsets.safeDrawing.only(WindowInsetsSides.Bottom)
+        @Composable get() = WindowInsets.safeDrawing.only(WindowInsetsSides.Bottom)
 
-    /**
-     * The optional visual marker placed on top of a bottom sheet to indicate it may be dragged.
-     */
+    /** The optional visual marker placed on top of a bottom sheet to indicate it may be dragged. */
     @Composable
     fun DragHandle(
         modifier: Modifier = Modifier,
@@ -351,19 +327,14 @@
     ) {
         val dragHandleDescription = getString(Strings.BottomSheetDragHandleDescription)
         Surface(
-            modifier = modifier
-                .padding(vertical = DragHandleVerticalPadding)
-                .semantics { contentDescription = dragHandleDescription },
+            modifier =
+                modifier.padding(vertical = DragHandleVerticalPadding).semantics {
+                    contentDescription = dragHandleDescription
+                },
             color = color,
             shape = shape
         ) {
-            Box(
-                Modifier
-                    .size(
-                        width = width,
-                        height = height
-                    )
-            )
+            Box(Modifier.size(width = width, height = height))
         }
     }
 }
@@ -373,58 +344,60 @@
     sheetState: SheetState,
     orientation: Orientation,
     onFling: (velocity: Float) -> Unit
-): NestedScrollConnection = object : NestedScrollConnection {
-    override fun onPreScroll(available: Offset, source: NestedScrollSource): Offset {
-        val delta = available.toFloat()
-        return if (delta < 0 && source == NestedScrollSource.UserInput) {
-            sheetState.anchoredDraggableState.dispatchRawDelta(delta).toOffset()
-        } else {
-            Offset.Zero
+): NestedScrollConnection =
+    object : NestedScrollConnection {
+        override fun onPreScroll(available: Offset, source: NestedScrollSource): Offset {
+            val delta = available.toFloat()
+            return if (delta < 0 && source == NestedScrollSource.UserInput) {
+                sheetState.anchoredDraggableState.dispatchRawDelta(delta).toOffset()
+            } else {
+                Offset.Zero
+            }
         }
-    }
 
-    override fun onPostScroll(
-        consumed: Offset,
-        available: Offset,
-        source: NestedScrollSource
-    ): Offset {
-        return if (source == NestedScrollSource.UserInput) {
-            sheetState.anchoredDraggableState.dispatchRawDelta(available.toFloat()).toOffset()
-        } else {
-            Offset.Zero
+        override fun onPostScroll(
+            consumed: Offset,
+            available: Offset,
+            source: NestedScrollSource
+        ): Offset {
+            return if (source == NestedScrollSource.UserInput) {
+                sheetState.anchoredDraggableState.dispatchRawDelta(available.toFloat()).toOffset()
+            } else {
+                Offset.Zero
+            }
         }
-    }
 
-    override suspend fun onPreFling(available: Velocity): Velocity {
-        val toFling = available.toFloat()
-        val currentOffset = sheetState.requireOffset()
-        val minAnchor = sheetState.anchoredDraggableState.anchors.minAnchor()
-        return if (toFling < 0 && currentOffset > minAnchor) {
-            onFling(toFling)
-            // since we go to the anchor with tween settling, consume all for the best UX
-            available
-        } else {
-            Velocity.Zero
+        override suspend fun onPreFling(available: Velocity): Velocity {
+            val toFling = available.toFloat()
+            val currentOffset = sheetState.requireOffset()
+            val minAnchor = sheetState.anchoredDraggableState.anchors.minAnchor()
+            return if (toFling < 0 && currentOffset > minAnchor) {
+                onFling(toFling)
+                // since we go to the anchor with tween settling, consume all for the best UX
+                available
+            } else {
+                Velocity.Zero
+            }
         }
+
+        override suspend fun onPostFling(consumed: Velocity, available: Velocity): Velocity {
+            onFling(available.toFloat())
+            return available
+        }
+
+        private fun Float.toOffset(): Offset =
+            Offset(
+                x = if (orientation == Orientation.Horizontal) this else 0f,
+                y = if (orientation == Orientation.Vertical) this else 0f
+            )
+
+        @JvmName("velocityToFloat")
+        private fun Velocity.toFloat() = if (orientation == Orientation.Horizontal) x else y
+
+        @JvmName("offsetToFloat")
+        private fun Offset.toFloat(): Float = if (orientation == Orientation.Horizontal) x else y
     }
 
-    override suspend fun onPostFling(consumed: Velocity, available: Velocity): Velocity {
-        onFling(available.toFloat())
-        return available
-    }
-
-    private fun Float.toOffset(): Offset = Offset(
-        x = if (orientation == Orientation.Horizontal) this else 0f,
-        y = if (orientation == Orientation.Vertical) this else 0f
-    )
-
-    @JvmName("velocityToFloat")
-    private fun Velocity.toFloat() = if (orientation == Orientation.Horizontal) x else y
-
-    @JvmName("offsetToFloat")
-    private fun Offset.toFloat(): Float = if (orientation == Orientation.Horizontal) x else y
-}
-
 @Composable
 @ExperimentalMaterial3Api
 internal fun rememberSheetState(
@@ -435,13 +408,16 @@
 ): SheetState {
     val density = LocalDensity.current
     return rememberSaveable(
-        skipPartiallyExpanded, confirmValueChange, skipHiddenState,
-        saver = SheetState.Saver(
-            skipPartiallyExpanded = skipPartiallyExpanded,
-            confirmValueChange = confirmValueChange,
-            density = density,
-            skipHiddenState = skipHiddenState,
-        )
+        skipPartiallyExpanded,
+        confirmValueChange,
+        skipHiddenState,
+        saver =
+            SheetState.Saver(
+                skipPartiallyExpanded = skipPartiallyExpanded,
+                confirmValueChange = confirmValueChange,
+                density = density,
+                skipHiddenState = skipHiddenState,
+            )
     ) {
         SheetState(
             skipPartiallyExpanded,
@@ -454,10 +430,6 @@
 }
 
 private val DragHandleVerticalPadding = 22.dp
-/**
- * The default animation spec used by [SheetState].
- */
-private val BottomSheetAnimationSpec: AnimationSpec<Float> = tween(
-    durationMillis = 300,
-    easing = FastOutSlowInEasing
-)
+/** The default animation spec used by [SheetState]. */
+private val BottomSheetAnimationSpec: AnimationSpec<Float> =
+    tween(durationMillis = 300, easing = FastOutSlowInEasing)
diff --git a/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/Slider.kt b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/Slider.kt
index c06a03e..03e903e 100644
--- a/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/Slider.kt
+++ b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/Slider.kt
@@ -110,19 +110,21 @@
 import kotlinx.coroutines.launch
 
 /**
- * <a href="https://m3.material.io/components/sliders/overview" class="external" target="_blank">Material Design slider</a>.
+ * <a href="https://m3.material.io/components/sliders/overview" class="external"
+ * target="_blank">Material Design slider</a>.
  *
  * Sliders allow users to make selections from a range of values.
  *
  * It uses [SliderDefaults.Thumb] and [SliderDefaults.Track] as the thumb and track.
  *
- * Sliders reflect a range of values along a bar, from which users may select a single value.
- * They are ideal for adjusting settings such as volume, brightness, or applying image filters.
+ * Sliders reflect a range of values along a bar, from which users may select a single value. They
+ * are ideal for adjusting settings such as volume, brightness, or applying image filters.
  *
- * ![Sliders image](https://firebasestorage.googleapis.com/v0/b/design-spec/o/projects%2Fgoogle-material-3%2Fimages%2Flqe2zb2b-1.png?alt=media)
+ * ![Sliders
+ * image](https://firebasestorage.googleapis.com/v0/b/design-spec/o/projects%2Fgoogle-material-3%2Fimages%2Flqe2zb2b-1.png?alt=media)
  *
- * Use continuous sliders to allow users to make meaningful selections that don’t
- * require a specific value:
+ * Use continuous sliders to allow users to make meaningful selections that don’t require a specific
+ * value:
  *
  * @sample androidx.compose.material3.samples.SliderSample
  *
@@ -132,25 +134,25 @@
  * @sample androidx.compose.material3.samples.StepsSliderSample
  *
  * @param value current value of the slider. If outside of [valueRange] provided, value will be
- * coerced to this range.
+ *   coerced to this range.
  * @param onValueChange callback in which value should be updated
  * @param modifier the [Modifier] to be applied to this slider
  * @param enabled controls the enabled state of this slider. When `false`, this component will not
- * respond to user input, and it will appear visually disabled and disabled to accessibility
- * services.
+ *   respond to user input, and it will appear visually disabled and disabled to accessibility
+ *   services.
  * @param valueRange range of values that this slider can take. The passed [value] will be coerced
- * to this range.
+ *   to this range.
  * @param steps if positive, specifies the amount of discrete allowable values (in addition to the
- * endpoints of the value range). Step values are evenly distributed across the range. If 0, the
- * slider will behave continuously and allow any value from the range. Must not be negative.
+ *   endpoints of the value range). Step values are evenly distributed across the range. If 0, the
+ *   slider will behave continuously and allow any value from the range. Must not be negative.
  * @param onValueChangeFinished called when value change has ended. This should not be used to
- * update the slider value (use [onValueChange] instead), but rather to know when the user has
- * completed selecting a new value by ending a drag or a click.
+ *   update the slider value (use [onValueChange] instead), but rather to know when the user has
+ *   completed selecting a new value by ending a drag or a click.
  * @param colors [SliderColors] that will be used to resolve the colors used for this slider in
- * different states. See [SliderDefaults.colors].
+ *   different states. See [SliderDefaults.colors].
  * @param interactionSource the [MutableInteractionSource] representing the stream of [Interaction]s
- * for this slider. You can create and pass in your own `remember`ed instance to observe
- * [Interaction]s and customize the appearance / behavior of this slider in different states.
+ *   for this slider. You can create and pass in your own `remember`ed instance to observe
+ *   [Interaction]s and customize the appearance / behavior of this slider in different states.
  */
 @OptIn(ExperimentalMaterial3Api::class)
 @Composable
@@ -160,8 +162,7 @@
     modifier: Modifier = Modifier,
     enabled: Boolean = true,
     valueRange: ClosedFloatingPointRange<Float> = 0f..1f,
-    @IntRange(from = 0)
-    steps: Int = 0,
+    @IntRange(from = 0) steps: Int = 0,
     onValueChangeFinished: (() -> Unit)? = null,
     colors: SliderColors = SliderDefaults.colors(),
     interactionSource: MutableInteractionSource = remember { MutableInteractionSource() }
@@ -183,28 +184,26 @@
             )
         },
         track = { sliderState ->
-            SliderDefaults.Track(
-                colors = colors,
-                enabled = enabled,
-                sliderState = sliderState
-            )
+            SliderDefaults.Track(colors = colors, enabled = enabled, sliderState = sliderState)
         },
         valueRange = valueRange
     )
 }
 
 /**
- * <a href="https://m3.material.io/components/sliders/overview" class="external" target="_blank">Material Design slider</a>.
+ * <a href="https://m3.material.io/components/sliders/overview" class="external"
+ * target="_blank">Material Design slider</a>.
  *
  * Sliders allow users to make selections from a range of values.
  *
- * Sliders reflect a range of values along a bar, from which users may select a single value.
- * They are ideal for adjusting settings such as volume, brightness, or applying image filters.
+ * Sliders reflect a range of values along a bar, from which users may select a single value. They
+ * are ideal for adjusting settings such as volume, brightness, or applying image filters.
  *
- * ![Sliders image](https://firebasestorage.googleapis.com/v0/b/design-spec/o/projects%2Fgoogle-material-3%2Fimages%2Flqe2zb2b-1.png?alt=media)
+ * ![Sliders
+ * image](https://firebasestorage.googleapis.com/v0/b/design-spec/o/projects%2Fgoogle-material-3%2Fimages%2Flqe2zb2b-1.png?alt=media)
  *
- * Use continuous sliders to allow users to make meaningful selections that don’t
- * require a specific value:
+ * Use continuous sliders to allow users to make meaningful selections that don’t require a specific
+ * value:
  *
  * @sample androidx.compose.material3.samples.SliderSample
  *
@@ -222,29 +221,29 @@
  * @sample androidx.compose.material3.samples.SliderWithCustomTrackAndThumb
  *
  * @param value current value of the slider. If outside of [valueRange] provided, value will be
- * coerced to this range.
+ *   coerced to this range.
  * @param onValueChange callback in which value should be updated
  * @param modifier the [Modifier] to be applied to this slider
  * @param enabled controls the enabled state of this slider. When `false`, this component will not
- * respond to user input, and it will appear visually disabled and disabled to accessibility
- * services.
+ *   respond to user input, and it will appear visually disabled and disabled to accessibility
+ *   services.
  * @param onValueChangeFinished called when value change has ended. This should not be used to
- * update the slider value (use [onValueChange] instead), but rather to know when the user has
- * completed selecting a new value by ending a drag or a click.
+ *   update the slider value (use [onValueChange] instead), but rather to know when the user has
+ *   completed selecting a new value by ending a drag or a click.
  * @param colors [SliderColors] that will be used to resolve the colors used for this slider in
- * different states. See [SliderDefaults.colors].
+ *   different states. See [SliderDefaults.colors].
  * @param interactionSource the [MutableInteractionSource] representing the stream of [Interaction]s
- * for this slider. You can create and pass in your own `remember`ed instance to observe
- * [Interaction]s and customize the appearance / behavior of this slider in different states.
+ *   for this slider. You can create and pass in your own `remember`ed instance to observe
+ *   [Interaction]s and customize the appearance / behavior of this slider in different states.
  * @param steps if positive, specifies the amount of discrete allowable values (in addition to the
- * endpoints of the value range). Step values are evenly distributed across the range. If 0, the
- * slider will behave continuously and allow any value from the range. Must not be negative.
+ *   endpoints of the value range). Step values are evenly distributed across the range. If 0, the
+ *   slider will behave continuously and allow any value from the range. Must not be negative.
  * @param thumb the thumb to be displayed on the slider, it is placed on top of the track. The
- * lambda receives a [SliderState] which is used to obtain the current active track.
+ *   lambda receives a [SliderState] which is used to obtain the current active track.
  * @param track the track to be displayed on the slider, it is placed underneath the thumb. The
- * lambda receives a [SliderState] which is used to obtain the current active track.
+ *   lambda receives a [SliderState] which is used to obtain the current active track.
  * @param valueRange range of values that this slider can take. The passed [value] will be coerced
- * to this range.
+ *   to this range.
  */
 @Composable
 @ExperimentalMaterial3Api
@@ -256,8 +255,7 @@
     onValueChangeFinished: (() -> Unit)? = null,
     colors: SliderColors = SliderDefaults.colors(),
     interactionSource: MutableInteractionSource = remember { MutableInteractionSource() },
-    @IntRange(from = 0)
-    steps: Int = 0,
+    @IntRange(from = 0) steps: Int = 0,
     thumb: @Composable (SliderState) -> Unit = {
         SliderDefaults.Thumb(
             interactionSource = interactionSource,
@@ -266,25 +264,12 @@
         )
     },
     track: @Composable (SliderState) -> Unit = { sliderState ->
-        SliderDefaults.Track(
-            colors = colors,
-            enabled = enabled,
-            sliderState = sliderState
-        )
+        SliderDefaults.Track(colors = colors, enabled = enabled, sliderState = sliderState)
     },
     valueRange: ClosedFloatingPointRange<Float> = 0f..1f
 ) {
-    val state = remember(
-        steps,
-        valueRange
-    ) {
-        SliderState(
-            value,
-            steps,
-            onValueChangeFinished,
-            valueRange
-        )
-    }
+    val state =
+        remember(steps, valueRange) { SliderState(value, steps, onValueChangeFinished, valueRange) }
 
     state.onValueChangeFinished = onValueChangeFinished
     state.onValueChange = onValueChange
@@ -301,17 +286,19 @@
 }
 
 /**
- * <a href="https://m3.material.io/components/sliders/overview" class="external" target="_blank">Material Design slider</a>.
+ * <a href="https://m3.material.io/components/sliders/overview" class="external"
+ * target="_blank">Material Design slider</a>.
  *
  * Sliders allow users to make selections from a range of values.
  *
- * Sliders reflect a range of values along a bar, from which users may select a single value.
- * They are ideal for adjusting settings such as volume, brightness, or applying image filters.
+ * Sliders reflect a range of values along a bar, from which users may select a single value. They
+ * are ideal for adjusting settings such as volume, brightness, or applying image filters.
  *
- * ![Sliders image](https://firebasestorage.googleapis.com/v0/b/design-spec/o/projects%2Fgoogle-material-3%2Fimages%2Flqe2zb2b-1.png?alt=media)
+ * ![Sliders
+ * image](https://firebasestorage.googleapis.com/v0/b/design-spec/o/projects%2Fgoogle-material-3%2Fimages%2Flqe2zb2b-1.png?alt=media)
  *
- * Use continuous sliders to allow users to make meaningful selections that don’t
- * require a specific value:
+ * Use continuous sliders to allow users to make meaningful selections that don’t require a specific
+ * value:
  *
  * @sample androidx.compose.material3.samples.SliderSample
  *
@@ -331,17 +318,17 @@
  * @param state [SliderState] which contains the slider's current value.
  * @param modifier the [Modifier] to be applied to this slider
  * @param enabled controls the enabled state of this slider. When `false`, this component will not
- * respond to user input, and it will appear visually disabled and disabled to accessibility
- * services.
+ *   respond to user input, and it will appear visually disabled and disabled to accessibility
+ *   services.
  * @param colors [SliderColors] that will be used to resolve the colors used for this slider in
- * different states. See [SliderDefaults.colors].
+ *   different states. See [SliderDefaults.colors].
  * @param interactionSource the [MutableInteractionSource] representing the stream of [Interaction]s
- * for this slider. You can create and pass in your own `remember`ed instance to observe
- * [Interaction]s and customize the appearance / behavior of this slider in different states.
+ *   for this slider. You can create and pass in your own `remember`ed instance to observe
+ *   [Interaction]s and customize the appearance / behavior of this slider in different states.
  * @param thumb the thumb to be displayed on the slider, it is placed on top of the track. The
- * lambda receives a [SliderState] which is used to obtain the current active track.
+ *   lambda receives a [SliderState] which is used to obtain the current active track.
  * @param track the track to be displayed on the slider, it is placed underneath the thumb. The
- * lambda receives a [SliderState] which is used to obtain the current active track.
+ *   lambda receives a [SliderState] which is used to obtain the current active track.
  */
 @Composable
 @ExperimentalMaterial3Api
@@ -359,11 +346,7 @@
         )
     },
     track: @Composable (SliderState) -> Unit = { sliderState ->
-        SliderDefaults.Track(
-            colors = colors,
-            enabled = enabled,
-            sliderState = sliderState
-        )
+        SliderDefaults.Track(colors = colors, enabled = enabled, sliderState = sliderState)
     }
 ) {
     require(state.steps >= 0) { "steps should be >= 0" }
@@ -379,14 +362,15 @@
 }
 
 /**
- * <a href="https://m3.material.io/components/sliders/overview" class="external" target="_blank">Material Design Range slider</a>.
+ * <a href="https://m3.material.io/components/sliders/overview" class="external"
+ * target="_blank">Material Design Range slider</a>.
  *
  * Range Sliders expand upon [Slider] using the same concepts but allow the user to select 2 values.
  *
  * The two values are still bounded by the value range but they also cannot cross each other.
  *
- * Use continuous Range Sliders to allow users to make meaningful selections that don’t
- * require a specific values:
+ * Use continuous Range Sliders to allow users to make meaningful selections that don’t require a
+ * specific values:
  *
  * @sample androidx.compose.material3.samples.RangeSliderSample
  *
@@ -396,20 +380,20 @@
  * @sample androidx.compose.material3.samples.StepRangeSliderSample
  *
  * @param value current values of the RangeSlider. If either value is outside of [valueRange]
- * provided, it will be coerced to this range.
+ *   provided, it will be coerced to this range.
  * @param onValueChange lambda in which values should be updated
  * @param modifier modifiers for the Range Slider layout
  * @param enabled whether or not component is enabled and can we interacted with or not
  * @param valueRange range of values that Range Slider values can take. Passed [value] will be
- * coerced to this range
+ *   coerced to this range
  * @param steps if positive, specifies the amount of discrete allowable values (in addition to the
- * endpoints of the value range). Step values are evenly distributed across the range. If 0, the
- * range slider will behave continuously and allow any value from the range. Must not be negative.
+ *   endpoints of the value range). Step values are evenly distributed across the range. If 0, the
+ *   range slider will behave continuously and allow any value from the range. Must not be negative.
  * @param onValueChangeFinished lambda to be invoked when value change has ended. This callback
- * shouldn't be used to update the range slider values (use [onValueChange] for that), but rather to
- * know when the user has completed selecting a new value by ending a drag or a click.
- * @param colors [SliderColors] that will be used to determine the color of the Range Slider
- * parts in different state. See [SliderDefaults.colors] to customize.
+ *   shouldn't be used to update the range slider values (use [onValueChange] for that), but rather
+ *   to know when the user has completed selecting a new value by ending a drag or a click.
+ * @param colors [SliderColors] that will be used to determine the color of the Range Slider parts
+ *   in different state. See [SliderDefaults.colors] to customize.
  */
 @OptIn(ExperimentalMaterial3Api::class)
 @Composable
@@ -419,8 +403,7 @@
     modifier: Modifier = Modifier,
     enabled: Boolean = true,
     valueRange: ClosedFloatingPointRange<Float> = 0f..1f,
-    @IntRange(from = 0)
-    steps: Int = 0,
+    @IntRange(from = 0) steps: Int = 0,
     onValueChangeFinished: (() -> Unit)? = null,
     colors: SliderColors = SliderDefaults.colors()
 ) {
@@ -462,19 +445,20 @@
 }
 
 /**
- * <a href="https://m3.material.io/components/sliders/overview" class="external" target="_blank">Material Design Range slider</a>.
+ * <a href="https://m3.material.io/components/sliders/overview" class="external"
+ * target="_blank">Material Design Range slider</a>.
  *
  * Range Sliders expand upon [Slider] using the same concepts but allow the user to select 2 values.
  *
  * The two values are still bounded by the value range but they also cannot cross each other.
  *
- * It uses the provided startThumb for the slider's start thumb and endThumb for the
- * slider's end thumb. It also uses the provided track for the slider's track. If nothing is
- * passed for these parameters, it will use [SliderDefaults.Thumb] and [SliderDefaults.Track]
- * for the thumbs and track.
+ * It uses the provided startThumb for the slider's start thumb and endThumb for the slider's end
+ * thumb. It also uses the provided track for the slider's track. If nothing is passed for these
+ * parameters, it will use [SliderDefaults.Thumb] and [SliderDefaults.Track] for the thumbs and
+ * track.
  *
- * Use continuous Range Sliders to allow users to make meaningful selections that don’t
- * require a specific values:
+ * Use continuous Range Sliders to allow users to make meaningful selections that don’t require a
+ * specific values:
  *
  * @sample androidx.compose.material3.samples.RangeSliderSample
  *
@@ -488,32 +472,32 @@
  * @sample androidx.compose.material3.samples.RangeSliderWithCustomComponents
  *
  * @param value current values of the RangeSlider. If either value is outside of [valueRange]
- * provided, it will be coerced to this range.
+ *   provided, it will be coerced to this range.
  * @param onValueChange lambda in which values should be updated
  * @param modifier modifiers for the Range Slider layout
  * @param enabled whether or not component is enabled and can we interacted with or not
  * @param onValueChangeFinished lambda to be invoked when value change has ended. This callback
- * shouldn't be used to update the range slider values (use [onValueChange] for that), but rather to
- * know when the user has completed selecting a new value by ending a drag or a click.
- * @param colors [SliderColors] that will be used to determine the color of the Range Slider
- * parts in different state. See [SliderDefaults.colors] to customize.
+ *   shouldn't be used to update the range slider values (use [onValueChange] for that), but rather
+ *   to know when the user has completed selecting a new value by ending a drag or a click.
+ * @param colors [SliderColors] that will be used to determine the color of the Range Slider parts
+ *   in different state. See [SliderDefaults.colors] to customize.
  * @param startInteractionSource the [MutableInteractionSource] representing the stream of
- * [Interaction]s for the start thumb. You can create and pass in your own
- * `remember`ed instance to observe.
+ *   [Interaction]s for the start thumb. You can create and pass in your own `remember`ed instance
+ *   to observe.
  * @param endInteractionSource the [MutableInteractionSource] representing the stream of
- * [Interaction]s for the end thumb. You can create and pass in your own
- * `remember`ed instance to observe.
+ *   [Interaction]s for the end thumb. You can create and pass in your own `remember`ed instance to
+ *   observe.
  * @param steps if positive, specifies the amount of discrete allowable values (in addition to the
- * endpoints of the value range). Step values are evenly distributed across the range. If 0, the
- * range slider will behave continuously and allow any value from the range. Must not be negative.
+ *   endpoints of the value range). Step values are evenly distributed across the range. If 0, the
+ *   range slider will behave continuously and allow any value from the range. Must not be negative.
  * @param startThumb the start thumb to be displayed on the Range Slider. The lambda receives a
- * [RangeSliderState] which is used to obtain the current active track.
+ *   [RangeSliderState] which is used to obtain the current active track.
  * @param endThumb the end thumb to be displayed on the Range Slider. The lambda receives a
- * [RangeSliderState] which is used to obtain the current active track.
+ *   [RangeSliderState] which is used to obtain the current active track.
  * @param track the track to be displayed on the range slider, it is placed underneath the thumb.
- * The lambda receives a [RangeSliderState] which is used to obtain the current active track.
+ *   The lambda receives a [RangeSliderState] which is used to obtain the current active track.
  * @param valueRange range of values that Range Slider values can take. Passed [value] will be
- * coerced to this range.
+ *   coerced to this range.
  */
 @Composable
 @ExperimentalMaterial3Api
@@ -548,21 +532,18 @@
             rangeSliderState = rangeSliderState
         )
     },
-    @IntRange(from = 0)
-    steps: Int = 0
+    @IntRange(from = 0) steps: Int = 0
 ) {
-    val state = remember(
-        steps,
-        valueRange
-    ) {
-        RangeSliderState(
-            value.start,
-            value.endInclusive,
-            steps,
-            onValueChangeFinished,
-            valueRange
-        )
-    }
+    val state =
+        remember(steps, valueRange) {
+            RangeSliderState(
+                value.start,
+                value.endInclusive,
+                steps,
+                onValueChangeFinished,
+                valueRange
+            )
+        }
 
     state.onValueChangeFinished = onValueChangeFinished
     state.onValueChange = { onValueChange(it.start..it.endInclusive) }
@@ -582,19 +563,20 @@
 }
 
 /**
- * <a href="https://m3.material.io/components/sliders/overview" class="external" target="_blank">Material Design Range slider</a>.
+ * <a href="https://m3.material.io/components/sliders/overview" class="external"
+ * target="_blank">Material Design Range slider</a>.
  *
  * Range Sliders expand upon [Slider] using the same concepts but allow the user to select 2 values.
  *
  * The two values are still bounded by the value range but they also cannot cross each other.
  *
- * It uses the provided startThumb for the slider's start thumb and endThumb for the
- * slider's end thumb. It also uses the provided track for the slider's track. If nothing is
- * passed for these parameters, it will use [SliderDefaults.Thumb] and [SliderDefaults.Track]
- * for the thumbs and track.
+ * It uses the provided startThumb for the slider's start thumb and endThumb for the slider's end
+ * thumb. It also uses the provided track for the slider's track. If nothing is passed for these
+ * parameters, it will use [SliderDefaults.Thumb] and [SliderDefaults.Track] for the thumbs and
+ * track.
  *
- * Use continuous Range Sliders to allow users to make meaningful selections that don’t
- * require a specific values:
+ * Use continuous Range Sliders to allow users to make meaningful selections that don’t require a
+ * specific values:
  *
  * @sample androidx.compose.material3.samples.RangeSliderSample
  *
@@ -610,20 +592,20 @@
  * @param state [RangeSliderState] which contains the current values of the RangeSlider.
  * @param modifier modifiers for the Range Slider layout
  * @param enabled whether or not component is enabled and can we interacted with or not
- * @param colors [SliderColors] that will be used to determine the color of the Range Slider
- * parts in different state. See [SliderDefaults.colors] to customize.
+ * @param colors [SliderColors] that will be used to determine the color of the Range Slider parts
+ *   in different state. See [SliderDefaults.colors] to customize.
  * @param startInteractionSource the [MutableInteractionSource] representing the stream of
- * [Interaction]s for the start thumb. You can create and pass in your own
- * `remember`ed instance to observe.
+ *   [Interaction]s for the start thumb. You can create and pass in your own `remember`ed instance
+ *   to observe.
  * @param endInteractionSource the [MutableInteractionSource] representing the stream of
- * [Interaction]s for the end thumb. You can create and pass in your own
- * `remember`ed instance to observe.
+ *   [Interaction]s for the end thumb. You can create and pass in your own `remember`ed instance to
+ *   observe.
  * @param startThumb the start thumb to be displayed on the Range Slider. The lambda receives a
- * [RangeSliderState] which is used to obtain the current active track.
+ *   [RangeSliderState] which is used to obtain the current active track.
  * @param endThumb the end thumb to be displayed on the Range Slider. The lambda receives a
- * [RangeSliderState] which is used to obtain the current active track.
+ *   [RangeSliderState] which is used to obtain the current active track.
  * @param track the track to be displayed on the range slider, it is placed underneath the thumb.
- * The lambda receives a [RangeSliderState] which is used to obtain the current active track.
+ *   The lambda receives a [RangeSliderState] which is used to obtain the current active track.
  */
 @Composable
 @ExperimentalMaterial3Api
@@ -681,69 +663,51 @@
     track: @Composable (SliderState) -> Unit
 ) {
     state.isRtl = LocalLayoutDirection.current == LayoutDirection.Rtl
-    val press = Modifier.sliderTapModifier(
-        state,
-        interactionSource,
-        enabled
-    )
-    val drag = Modifier.draggable(
-        orientation = Orientation.Horizontal,
-        reverseDirection = state.isRtl,
-        enabled = enabled,
-        interactionSource = interactionSource,
-        onDragStopped = { state.gestureEndAction() },
-        startDragImmediately = state.isDragging,
-        state = state
-    )
+    val press = Modifier.sliderTapModifier(state, interactionSource, enabled)
+    val drag =
+        Modifier.draggable(
+            orientation = Orientation.Horizontal,
+            reverseDirection = state.isRtl,
+            enabled = enabled,
+            interactionSource = interactionSource,
+            onDragStopped = { state.gestureEndAction() },
+            startDragImmediately = state.isDragging,
+            state = state
+        )
 
     Layout(
         {
-            Box(modifier = Modifier
-                .layoutId(SliderComponents.THUMB)
-                .wrapContentWidth()
-                .onSizeChanged {
-                    state.thumbWidth = it.width.toFloat()
-                }) {
+            Box(
+                modifier =
+                    Modifier.layoutId(SliderComponents.THUMB).wrapContentWidth().onSizeChanged {
+                        state.thumbWidth = it.width.toFloat()
+                    }
+            ) {
                 thumb(state)
             }
-            Box(modifier = Modifier.layoutId(SliderComponents.TRACK)) {
-                track(state)
-            }
+            Box(modifier = Modifier.layoutId(SliderComponents.TRACK)) { track(state) }
         },
-        modifier = modifier
-            .minimumInteractiveComponentSize()
-            .requiredSizeIn(
-                minWidth = ThumbWidth,
-                minHeight = TrackHeight
-            )
-            .sliderSemantics(
-                state,
-                enabled
-            )
-            .focusable(enabled, interactionSource)
-            .then(press)
-            .then(drag)
+        modifier =
+            modifier
+                .minimumInteractiveComponentSize()
+                .requiredSizeIn(minWidth = ThumbWidth, minHeight = TrackHeight)
+                .sliderSemantics(state, enabled)
+                .focusable(enabled, interactionSource)
+                .then(press)
+                .then(drag)
     ) { measurables, constraints ->
+        val thumbPlaceable =
+            measurables.fastFirst { it.layoutId == SliderComponents.THUMB }.measure(constraints)
 
-        val thumbPlaceable = measurables.fastFirst {
-            it.layoutId == SliderComponents.THUMB
-        }.measure(constraints)
-
-        val trackPlaceable = measurables.fastFirst {
-            it.layoutId == SliderComponents.TRACK
-        }.measure(
-            constraints.offset(
-                horizontal = -thumbPlaceable.width
-            ).copy(minHeight = 0)
-        )
+        val trackPlaceable =
+            measurables
+                .fastFirst { it.layoutId == SliderComponents.TRACK }
+                .measure(constraints.offset(horizontal = -thumbPlaceable.width).copy(minHeight = 0))
 
         val sliderWidth = thumbPlaceable.width + trackPlaceable.width
         val sliderHeight = max(trackPlaceable.height, thumbPlaceable.height)
 
-        state.updateDimensions(
-            trackPlaceable.height.toFloat(),
-            sliderWidth
-        )
+        state.updateDimensions(trackPlaceable.height.toFloat(), sliderWidth)
 
         val trackOffsetX = thumbPlaceable.width / 2
         val thumbOffsetX = ((trackPlaceable.width) * state.coercedValueAsFraction).roundToInt()
@@ -751,14 +715,8 @@
         val thumbOffsetY = (sliderHeight - thumbPlaceable.height) / 2
 
         layout(sliderWidth, sliderHeight) {
-            trackPlaceable.placeRelative(
-                trackOffsetX,
-                trackOffsetY
-            )
-            thumbPlaceable.placeRelative(
-                thumbOffsetX,
-                thumbOffsetY
-            )
+            trackPlaceable.placeRelative(trackOffsetX, trackOffsetY)
+            thumbPlaceable.placeRelative(thumbOffsetX, thumbOffsetY)
         }
     }
 }
@@ -777,12 +735,13 @@
 ) {
     state.isRtl = LocalLayoutDirection.current == LayoutDirection.Rtl
 
-    val pressDrag = Modifier.rangeSliderPressDragModifier(
-        state,
-        startInteractionSource,
-        endInteractionSource,
-        enabled
-    )
+    val pressDrag =
+        Modifier.rangeSliderPressDragModifier(
+            state,
+            startInteractionSource,
+            endInteractionSource,
+            enabled
+        )
 
     val startThumbSemantics = Modifier.rangeSliderStartThumbSemantics(state, enabled)
     val endThumbSemantics = Modifier.rangeSliderEndThumbSemantics(state, enabled)
@@ -792,69 +751,65 @@
 
     Layout(
         {
-            Box(modifier = Modifier
-                .layoutId(RangeSliderComponents.STARTTHUMB)
-                .wrapContentWidth()
-                .onSizeChanged {
-                    state.startThumbWidth = it.width.toFloat()
-                }
-                .semantics(mergeDescendants = true) {
-                    contentDescription = startContentDescription
-                }
-                .focusable(enabled, startInteractionSource)
-                .then(startThumbSemantics)
-            ) { startThumb(state) }
-            Box(modifier = Modifier
-                .layoutId(RangeSliderComponents.ENDTHUMB)
-                .wrapContentWidth()
-                .onSizeChanged {
-                    state.endThumbWidth = it.width.toFloat()
-                }
-                .semantics(mergeDescendants = true) {
-                    contentDescription = endContentDescription
-                }
-                .focusable(enabled, endInteractionSource)
-                .then(endThumbSemantics)
-            ) { endThumb(state) }
-            Box(modifier = Modifier.layoutId(RangeSliderComponents.TRACK)) {
-                track(state)
+            Box(
+                modifier =
+                    Modifier.layoutId(RangeSliderComponents.STARTTHUMB)
+                        .wrapContentWidth()
+                        .onSizeChanged { state.startThumbWidth = it.width.toFloat() }
+                        .semantics(mergeDescendants = true) {
+                            contentDescription = startContentDescription
+                        }
+                        .focusable(enabled, startInteractionSource)
+                        .then(startThumbSemantics)
+            ) {
+                startThumb(state)
             }
+            Box(
+                modifier =
+                    Modifier.layoutId(RangeSliderComponents.ENDTHUMB)
+                        .wrapContentWidth()
+                        .onSizeChanged { state.endThumbWidth = it.width.toFloat() }
+                        .semantics(mergeDescendants = true) {
+                            contentDescription = endContentDescription
+                        }
+                        .focusable(enabled, endInteractionSource)
+                        .then(endThumbSemantics)
+            ) {
+                endThumb(state)
+            }
+            Box(modifier = Modifier.layoutId(RangeSliderComponents.TRACK)) { track(state) }
         },
-        modifier = modifier
-            .minimumInteractiveComponentSize()
-            .requiredSizeIn(
-                minWidth = ThumbWidth,
-                minHeight = TrackHeight
-            )
-            .then(pressDrag)
+        modifier =
+            modifier
+                .minimumInteractiveComponentSize()
+                .requiredSizeIn(minWidth = ThumbWidth, minHeight = TrackHeight)
+                .then(pressDrag)
     ) { measurables, constraints ->
-        val startThumbPlaceable = measurables.fastFirst {
-            it.layoutId == RangeSliderComponents.STARTTHUMB
-        }.measure(
-            constraints
-        )
+        val startThumbPlaceable =
+            measurables
+                .fastFirst { it.layoutId == RangeSliderComponents.STARTTHUMB }
+                .measure(constraints)
 
-        val endThumbPlaceable = measurables.fastFirst {
-            it.layoutId == RangeSliderComponents.ENDTHUMB
-        }.measure(
-            constraints
-        )
+        val endThumbPlaceable =
+            measurables
+                .fastFirst { it.layoutId == RangeSliderComponents.ENDTHUMB }
+                .measure(constraints)
 
-        val trackPlaceable = measurables.fastFirst {
-            it.layoutId == RangeSliderComponents.TRACK
-        }.measure(
-            constraints.offset(
-                horizontal = -(startThumbPlaceable.width + endThumbPlaceable.width) / 2
-            ).copy(minHeight = 0)
-        )
+        val trackPlaceable =
+            measurables
+                .fastFirst { it.layoutId == RangeSliderComponents.TRACK }
+                .measure(
+                    constraints
+                        .offset(
+                            horizontal = -(startThumbPlaceable.width + endThumbPlaceable.width) / 2
+                        )
+                        .copy(minHeight = 0)
+                )
 
-        val sliderWidth = trackPlaceable.width +
-            (startThumbPlaceable.width + endThumbPlaceable.width) / 2
-        val sliderHeight = maxOf(
-            trackPlaceable.height,
-            startThumbPlaceable.height,
-            endThumbPlaceable.height
-        )
+        val sliderWidth =
+            trackPlaceable.width + (startThumbPlaceable.width + endThumbPlaceable.width) / 2
+        val sliderHeight =
+            maxOf(trackPlaceable.height, startThumbPlaceable.height, endThumbPlaceable.height)
 
         state.trackHeight = trackPlaceable.height.toFloat()
         state.totalWidth = sliderWidth
@@ -862,8 +817,8 @@
         state.updateMinMaxPx()
 
         val trackOffsetX = startThumbPlaceable.width / 2
-        val startThumbOffsetX = (trackPlaceable.width * state.coercedActiveRangeStartAsFraction)
-            .roundToInt()
+        val startThumbOffsetX =
+            (trackPlaceable.width * state.coercedActiveRangeStartAsFraction).roundToInt()
         // When start thumb and end thumb have different widths,
         // we need to add a correction for the centering of the slider.
         val endCorrection = (startThumbPlaceable.width - endThumbPlaceable.width) / 2
@@ -874,65 +829,50 @@
         val startThumbOffsetY = (sliderHeight - startThumbPlaceable.height) / 2
         val endThumbOffsetY = (sliderHeight - endThumbPlaceable.height) / 2
 
-        layout(
-            sliderWidth,
-            sliderHeight
-        ) {
-            trackPlaceable.placeRelative(
-                trackOffsetX,
-                trackOffsetY
-            )
-            startThumbPlaceable.placeRelative(
-                startThumbOffsetX,
-                startThumbOffsetY
-            )
-            endThumbPlaceable.placeRelative(
-                endThumbOffsetX,
-                endThumbOffsetY
-            )
+        layout(sliderWidth, sliderHeight) {
+            trackPlaceable.placeRelative(trackOffsetX, trackOffsetY)
+            startThumbPlaceable.placeRelative(startThumbOffsetX, startThumbOffsetY)
+            endThumbPlaceable.placeRelative(endThumbOffsetX, endThumbOffsetY)
         }
     }
 }
 
-/**
- * Object to hold defaults used by [Slider]
- */
+/** Object to hold defaults used by [Slider] */
 @Stable
 object SliderDefaults {
 
     /**
-     * Creates a [SliderColors] that represents the different colors used in parts of the
-     * [Slider] in different states.
+     * Creates a [SliderColors] that represents the different colors used in parts of the [Slider]
+     * in different states.
      */
-    @Composable
-    fun colors() = MaterialTheme.colorScheme.defaultSliderColors
+    @Composable fun colors() = MaterialTheme.colorScheme.defaultSliderColors
 
     /**
-     * Creates a [SliderColors] that represents the different colors used in parts of the
-     * [Slider] in different states.
+     * Creates a [SliderColors] that represents the different colors used in parts of the [Slider]
+     * in different states.
      *
-     * For the name references below the words "active" and "inactive" are used. Active part of
-     * the slider is filled with progress, so if slider's progress is 30% out of 100%, left (or
-     * right in RTL) 30% of the track will be active, while the rest is inactive.
+     * For the name references below the words "active" and "inactive" are used. Active part of the
+     * slider is filled with progress, so if slider's progress is 30% out of 100%, left (or right in
+     * RTL) 30% of the track will be active, while the rest is inactive.
      *
      * @param thumbColor thumb color when enabled
      * @param activeTrackColor color of the track in the part that is "active", meaning that the
-     * thumb is ahead of it
+     *   thumb is ahead of it
      * @param activeTickColor colors to be used to draw tick marks on the active track, if `steps`
-     * is specified
+     *   is specified
      * @param inactiveTrackColor color of the track in the part that is "inactive", meaning that the
-     * thumb is before it
+     *   thumb is before it
      * @param inactiveTickColor colors to be used to draw tick marks on the inactive track, if
-     * `steps` are specified on the Slider is specified
+     *   `steps` are specified on the Slider is specified
      * @param disabledThumbColor thumb colors when disabled
      * @param disabledActiveTrackColor color of the track in the "active" part when the Slider is
-     * disabled
-     * @param disabledActiveTickColor colors to be used to draw tick marks on the active track
-     * when Slider is disabled and when `steps` are specified on it
-     * @param disabledInactiveTrackColor color of the track in the "inactive" part when the
-     * Slider is disabled
-     * @param disabledInactiveTickColor colors to be used to draw tick marks on the inactive part
-     * of the track when Slider is disabled and when `steps` are specified on it
+     *   disabled
+     * @param disabledActiveTickColor colors to be used to draw tick marks on the active track when
+     *   Slider is disabled and when `steps` are specified on it
+     * @param disabledInactiveTrackColor color of the track in the "inactive" part when the Slider
+     *   is disabled
+     * @param disabledInactiveTickColor colors to be used to draw tick marks on the inactive part of
+     *   the track when Slider is disabled and when `steps` are specified on it
      */
     @Composable
     fun colors(
@@ -946,55 +886,61 @@
         disabledActiveTickColor: Color = Color.Unspecified,
         disabledInactiveTrackColor: Color = Color.Unspecified,
         disabledInactiveTickColor: Color = Color.Unspecified
-    ): SliderColors = MaterialTheme.colorScheme.defaultSliderColors.copy(
-        thumbColor = thumbColor,
-        activeTrackColor = activeTrackColor,
-        activeTickColor = activeTickColor,
-        inactiveTrackColor = inactiveTrackColor,
-        inactiveTickColor = inactiveTickColor,
-        disabledThumbColor = disabledThumbColor,
-        disabledActiveTrackColor = disabledActiveTrackColor,
-        disabledActiveTickColor = disabledActiveTickColor,
-        disabledInactiveTrackColor = disabledInactiveTrackColor,
-        disabledInactiveTickColor = disabledInactiveTickColor
-    )
+    ): SliderColors =
+        MaterialTheme.colorScheme.defaultSliderColors.copy(
+            thumbColor = thumbColor,
+            activeTrackColor = activeTrackColor,
+            activeTickColor = activeTickColor,
+            inactiveTrackColor = inactiveTrackColor,
+            inactiveTickColor = inactiveTickColor,
+            disabledThumbColor = disabledThumbColor,
+            disabledActiveTrackColor = disabledActiveTrackColor,
+            disabledActiveTickColor = disabledActiveTickColor,
+            disabledInactiveTrackColor = disabledInactiveTrackColor,
+            disabledInactiveTickColor = disabledInactiveTickColor
+        )
 
     internal val ColorScheme.defaultSliderColors: SliderColors
         get() {
-            return defaultSliderColorsCached ?: SliderColors(
-                thumbColor = fromToken(SliderTokens.HandleColor),
-                activeTrackColor = fromToken(SliderTokens.ActiveTrackColor),
-                activeTickColor = fromToken(SliderTokens.InactiveTrackColor),
-                inactiveTrackColor = fromToken(SliderTokens.InactiveTrackColor),
-                inactiveTickColor = fromToken(SliderTokens.ActiveTrackColor),
-                disabledThumbColor = fromToken(SliderTokens.DisabledHandleColor)
-                    .copy(alpha = SliderTokens.DisabledHandleOpacity)
-                    .compositeOver(surface),
-                disabledActiveTrackColor = fromToken(SliderTokens.DisabledActiveTrackColor)
-                    .copy(alpha = SliderTokens.DisabledActiveTrackOpacity),
-                disabledActiveTickColor = fromToken(SliderTokens.DisabledInactiveTrackColor)
-                    .copy(alpha = SliderTokens.DisabledInactiveTrackOpacity),
-                disabledInactiveTrackColor = fromToken(SliderTokens.DisabledInactiveTrackColor)
-                    .copy(alpha = SliderTokens.DisabledInactiveTrackOpacity),
-                disabledInactiveTickColor = fromToken(SliderTokens.DisabledActiveTrackColor)
-                    .copy(alpha = SliderTokens.DisabledActiveTrackOpacity)
-            ).also {
-                defaultSliderColorsCached = it
-            }
+            return defaultSliderColorsCached
+                ?: SliderColors(
+                        thumbColor = fromToken(SliderTokens.HandleColor),
+                        activeTrackColor = fromToken(SliderTokens.ActiveTrackColor),
+                        activeTickColor = fromToken(SliderTokens.InactiveTrackColor),
+                        inactiveTrackColor = fromToken(SliderTokens.InactiveTrackColor),
+                        inactiveTickColor = fromToken(SliderTokens.ActiveTrackColor),
+                        disabledThumbColor =
+                            fromToken(SliderTokens.DisabledHandleColor)
+                                .copy(alpha = SliderTokens.DisabledHandleOpacity)
+                                .compositeOver(surface),
+                        disabledActiveTrackColor =
+                            fromToken(SliderTokens.DisabledActiveTrackColor)
+                                .copy(alpha = SliderTokens.DisabledActiveTrackOpacity),
+                        disabledActiveTickColor =
+                            fromToken(SliderTokens.DisabledInactiveTrackColor)
+                                .copy(alpha = SliderTokens.DisabledInactiveTrackOpacity),
+                        disabledInactiveTrackColor =
+                            fromToken(SliderTokens.DisabledInactiveTrackColor)
+                                .copy(alpha = SliderTokens.DisabledInactiveTrackOpacity),
+                        disabledInactiveTickColor =
+                            fromToken(SliderTokens.DisabledActiveTrackColor)
+                                .copy(alpha = SliderTokens.DisabledActiveTrackOpacity)
+                    )
+                    .also { defaultSliderColorsCached = it }
         }
 
     /**
      * The Default thumb for [Slider] and [RangeSlider]
      *
      * @param interactionSource the [MutableInteractionSource] representing the stream of
-     * [Interaction]s for this thumb. You can create and pass in your own `remember`ed
-     * instance to observe
+     *   [Interaction]s for this thumb. You can create and pass in your own `remember`ed instance to
+     *   observe
      * @param modifier the [Modifier] to be applied to the thumb.
      * @param colors [SliderColors] that will be used to resolve the colors used for this thumb in
-     * different states. See [SliderDefaults.colors].
+     *   different states. See [SliderDefaults.colors].
      * @param enabled controls the enabled state of this slider. When `false`, this component will
-     * not respond to user input, and it will appear visually disabled and disabled to
-     * accessibility services.
+     *   not respond to user input, and it will appear visually disabled and disabled to
+     *   accessibility services.
      * @param thumbSize the size of the thumb.
      */
     @Composable
@@ -1019,11 +965,12 @@
             }
         }
 
-        val size = if (interactions.isNotEmpty()) {
-            thumbSize.copy(width = thumbSize.width / 2)
-        } else {
-            thumbSize
-        }
+        val size =
+            if (interactions.isNotEmpty()) {
+                thumbSize.copy(width = thumbSize.width / 2)
+            } else {
+                thumbSize
+            }
         Spacer(
             modifier
                 .size(size)
@@ -1035,14 +982,14 @@
     /**
      * The Default track for [Slider] and [RangeSlider]
      *
-     * @param sliderPositions [SliderPositions] which is used to obtain the current active track
-     * and the tick positions if the slider is discrete.
+     * @param sliderPositions [SliderPositions] which is used to obtain the current active track and
+     *   the tick positions if the slider is discrete.
      * @param modifier the [Modifier] to be applied to the track.
      * @param colors [SliderColors] that will be used to resolve the colors used for this track in
-     * different states. See [SliderDefaults.colors].
+     *   different states. See [SliderDefaults.colors].
      * @param enabled controls the enabled state of this slider. When `false`, this component will
-     * not respond to user input, and it will appear visually disabled and disabled to
-     * accessibility services.
+     *   not respond to user input, and it will appear visually disabled and disabled to
+     *   accessibility services.
      */
     @Suppress("DEPRECATION")
     @Composable
@@ -1057,11 +1004,7 @@
         val activeTrackColor = colors.trackColor(enabled, active = true)
         val inactiveTickColor = colors.tickColor(enabled, active = false)
         val activeTickColor = colors.tickColor(enabled, active = true)
-        Canvas(
-            modifier
-                .fillMaxWidth()
-                .height(TrackHeight)
-        ) {
+        Canvas(modifier.fillMaxWidth().height(TrackHeight)) {
             val isRtl = layoutDirection == LayoutDirection.Rtl
             val sliderLeft = Offset(0f, center.y)
             val sliderRight = Offset(size.width, center.y)
@@ -1069,24 +1012,20 @@
             val sliderEnd = if (isRtl) sliderLeft else sliderRight
             val tickSize = TickSize.toPx()
             val trackStrokeWidth = TrackHeight.toPx()
-            drawLine(
-                inactiveTrackColor,
-                sliderStart,
-                sliderEnd,
-                trackStrokeWidth,
-                StrokeCap.Round
-            )
-            val sliderValueEnd = Offset(
-                sliderStart.x +
-                    (sliderEnd.x - sliderStart.x) * sliderPositions.activeRange.endInclusive,
-                center.y
-            )
+            drawLine(inactiveTrackColor, sliderStart, sliderEnd, trackStrokeWidth, StrokeCap.Round)
+            val sliderValueEnd =
+                Offset(
+                    sliderStart.x +
+                        (sliderEnd.x - sliderStart.x) * sliderPositions.activeRange.endInclusive,
+                    center.y
+                )
 
-            val sliderValueStart = Offset(
-                sliderStart.x +
-                    (sliderEnd.x - sliderStart.x) * sliderPositions.activeRange.start,
-                center.y
-            )
+            val sliderValueStart =
+                Offset(
+                    sliderStart.x +
+                        (sliderEnd.x - sliderStart.x) * sliderPositions.activeRange.start,
+                    center.y
+                )
 
             drawLine(
                 activeTrackColor,
@@ -1095,20 +1034,20 @@
                 trackStrokeWidth,
                 StrokeCap.Round
             )
-            sliderPositions.tickFractions.groupBy {
-                it > sliderPositions.activeRange.endInclusive ||
-                    it < sliderPositions.activeRange.start
-            }.forEach { (outsideFraction, list) ->
-                drawPoints(
-                    list.fastMap {
-                        Offset(lerp(sliderStart, sliderEnd, it).x, center.y)
-                    },
-                    PointMode.Points,
-                    (if (outsideFraction) inactiveTickColor else activeTickColor),
-                    tickSize,
-                    StrokeCap.Round
-                )
-            }
+            sliderPositions.tickFractions
+                .groupBy {
+                    it > sliderPositions.activeRange.endInclusive ||
+                        it < sliderPositions.activeRange.start
+                }
+                .forEach { (outsideFraction, list) ->
+                    drawPoints(
+                        list.fastMap { Offset(lerp(sliderStart, sliderEnd, it).x, center.y) },
+                        PointMode.Points,
+                        (if (outsideFraction) inactiveTickColor else activeTickColor),
+                        tickSize,
+                        StrokeCap.Round
+                    )
+                }
         }
     }
 
@@ -1118,19 +1057,21 @@
      * @param sliderState [SliderState] which is used to obtain the current active track.
      * @param modifier the [Modifier] to be applied to the track.
      * @param colors [SliderColors] that will be used to resolve the colors used for this track in
-     * different states. See [SliderDefaults.colors].
+     *   different states. See [SliderDefaults.colors].
      * @param enabled controls the enabled state of this slider. When `false`, this component will
-     * not respond to user input, and it will appear visually disabled and disabled to
-     * accessibility services.
+     *   not respond to user input, and it will appear visually disabled and disabled to
+     *   accessibility services.
      */
     @Deprecated(
-        message = "Use the overload that takes `drawStopIndicator`, `drawTick`, " +
-            "`thumbTrackGapSize` and `trackInsideCornerSize`, see `LegacySliderSample` " +
-            "on how to restore the previous behavior",
-        replaceWith = ReplaceWith(
-            "Track(sliderState, modifier, enabled, colors, drawStopIndicator, " +
-                "drawTick, thumbTrackGapSize, trackInsideCornerSize)"
-        ),
+        message =
+            "Use the overload that takes `drawStopIndicator`, `drawTick`, " +
+                "`thumbTrackGapSize` and `trackInsideCornerSize`, see `LegacySliderSample` " +
+                "on how to restore the previous behavior",
+        replaceWith =
+            ReplaceWith(
+                "Track(sliderState, modifier, enabled, colors, drawStopIndicator, " +
+                    "drawTick, thumbTrackGapSize, trackInsideCornerSize)"
+            ),
         level = DeprecationLevel.HIDDEN
     )
     @Composable
@@ -1157,12 +1098,12 @@
      * @param sliderState [SliderState] which is used to obtain the current active track.
      * @param modifier the [Modifier] to be applied to the track.
      * @param enabled controls the enabled state of this slider. When `false`, this component will
-     * not respond to user input, and it will appear visually disabled and disabled to
-     * accessibility services.
+     *   not respond to user input, and it will appear visually disabled and disabled to
+     *   accessibility services.
      * @param colors [SliderColors] that will be used to resolve the colors used for this track in
-     * different states. See [SliderDefaults.colors].
+     *   different states. See [SliderDefaults.colors].
      * @param drawStopIndicator lambda that will be called to draw the stop indicator at the end of
-     * the track.
+     *   the track.
      * @param drawTick lambda that will be called to draw the ticks if steps are greater than 0.
      * @param thumbTrackGapSize size of the gap between the thumb and the track.
      * @param trackInsideCornerSize size of the corners towards the thumb when a gap is set.
@@ -1183,12 +1124,7 @@
             )
         },
         drawTick: DrawScope.(Offset, Color) -> Unit = { offset, color ->
-            drawStopIndicator(
-                drawScope = this,
-                offset = offset,
-                color = color,
-                size = TickSize
-            )
+            drawStopIndicator(drawScope = this, offset = offset, color = color, size = TickSize)
         },
         thumbTrackGapSize: Dp = ThumbTrackGapSize,
         trackInsideCornerSize: Dp = TrackInsideCornerSize
@@ -1229,19 +1165,21 @@
      * @param rangeSliderState [RangeSliderState] which is used to obtain the current active track.
      * @param modifier the [Modifier] to be applied to the track.
      * @param colors [SliderColors] that will be used to resolve the colors used for this track in
-     * different states. See [SliderDefaults.colors].
+     *   different states. See [SliderDefaults.colors].
      * @param enabled controls the enabled state of this slider. When `false`, this component will
-     * not respond to user input, and it will appear visually disabled and disabled to
-     * accessibility services.
+     *   not respond to user input, and it will appear visually disabled and disabled to
+     *   accessibility services.
      */
     @Deprecated(
-        message = "Use the overload that takes `drawStopIndicator`, `drawTick`, " +
-            "`thumbTrackGapSize` and `trackInsideCornerSize`, see `LegacyRangeSliderSample` " +
-            "on how to restore the previous behavior",
-        replaceWith = ReplaceWith(
-            "Track(rangeSliderState, modifier, colors, enabled, drawStopIndicator, " +
-                "drawTick, thumbTrackGapSize, trackInsideCornerSize)"
-        ),
+        message =
+            "Use the overload that takes `drawStopIndicator`, `drawTick`, " +
+                "`thumbTrackGapSize` and `trackInsideCornerSize`, see `LegacyRangeSliderSample` " +
+                "on how to restore the previous behavior",
+        replaceWith =
+            ReplaceWith(
+                "Track(rangeSliderState, modifier, colors, enabled, drawStopIndicator, " +
+                    "drawTick, thumbTrackGapSize, trackInsideCornerSize)"
+            ),
         level = DeprecationLevel.HIDDEN
     )
     @OptIn(ExperimentalMaterial3Api::class)
@@ -1268,12 +1206,12 @@
      * @param rangeSliderState [RangeSliderState] which is used to obtain the current active track.
      * @param modifier the [Modifier] to be applied to the track.
      * @param enabled controls the enabled state of this slider. When `false`, this component will
-     * not respond to user input, and it will appear visually disabled and disabled to
-     * accessibility services.
+     *   not respond to user input, and it will appear visually disabled and disabled to
+     *   accessibility services.
      * @param colors [SliderColors] that will be used to resolve the colors used for this track in
-     * different states. See [SliderDefaults.colors].
+     *   different states. See [SliderDefaults.colors].
      * @param drawStopIndicator lambda that will be called to draw the stop indicator at the
-     * start/end of the track.
+     *   start/end of the track.
      * @param drawTick lambda that will be called to draw the ticks if steps are greater than 0.
      * @param thumbTrackGapSize size of the gap between the thumbs and the track.
      * @param trackInsideCornerSize size of the corners towards the thumbs when a gap is set.
@@ -1294,12 +1232,7 @@
             )
         },
         drawTick: DrawScope.(Offset, Color) -> Unit = { offset, color ->
-            drawStopIndicator(
-                drawScope = this,
-                offset = offset,
-                color = color,
-                size = TickSize
-            )
+            drawStopIndicator(drawScope = this, offset = offset, color = color, size = TickSize)
         },
         thumbTrackGapSize: Dp = ThumbTrackGapSize,
         trackInsideCornerSize: Dp = TrackInsideCornerSize
@@ -1355,17 +1288,11 @@
         val sliderEnd = Offset(size.width, center.y)
         val trackStrokeWidth = height.toPx()
 
-        val sliderValueEnd = Offset(
-            sliderStart.x +
-                (sliderEnd.x - sliderStart.x) * activeRangeEnd,
-            center.y
-        )
+        val sliderValueEnd =
+            Offset(sliderStart.x + (sliderEnd.x - sliderStart.x) * activeRangeEnd, center.y)
 
-        val sliderValueStart = Offset(
-            sliderStart.x +
-                (sliderEnd.x - sliderStart.x) * activeRangeStart,
-            center.y
-        )
+        val sliderValueStart =
+            Offset(sliderStart.x + (sliderEnd.x - sliderStart.x) * activeRangeStart, center.y)
 
         val cornerSize = trackStrokeWidth / 2
         val insideCornerSize = trackInsideCornerSize.toPx()
@@ -1403,8 +1330,7 @@
             drawStopIndicator?.invoke(this, Offset(end - cornerSize, center.y))
         }
         // active track
-        val activeTrackStart =
-            if (isRangeSlider) sliderValueStart.x + startGap else 0f
+        val activeTrackStart = if (isRangeSlider) sliderValueStart.x + startGap else 0f
         val activeTrackEnd = sliderValueEnd.x - endGap
         val startCornerRadius = if (isRangeSlider) insideCornerSize else cornerSize
         if (activeTrackEnd - activeTrackStart > startCornerRadius) {
@@ -1454,10 +1380,7 @@
         val endCorner = CornerRadius(endCornerRadius, endCornerRadius)
         val track =
             RoundRect(
-                rect = Rect(
-                    Offset(offset.x, 0f),
-                    size = Size(size.width, size.height)
-                ),
+                rect = Rect(Offset(offset.x, 0f), size = Size(size.width, size.height)),
                 topLeft = startCorner,
                 topRight = endCorner,
                 bottomRight = endCorner,
@@ -1468,29 +1391,14 @@
         trackPath.rewind()
     }
 
-    private fun drawStopIndicator(
-        drawScope: DrawScope,
-        offset: Offset,
-        size: Dp,
-        color: Color
-    ) {
-        with(drawScope) {
-            drawCircle(
-                color = color,
-                center = offset,
-                radius = size.toPx() / 2f
-            )
-        }
+    private fun drawStopIndicator(drawScope: DrawScope, offset: Offset, size: Dp, color: Color) {
+        with(drawScope) { drawCircle(color = color, center = offset, radius = size.toPx() / 2f) }
     }
 
-    /**
-     * The default size for the stop indicator at the end of the track.
-     */
+    /** The default size for the stop indicator at the end of the track. */
     val TrackStopIndicatorSize: Dp = SliderTokens.StopIndicatorSize
 
-    /**
-     * The default size for the ticks if steps are greater than 0.
-     */
+    /** The default size for the ticks if steps are greater than 0. */
     val TickSize: Dp = SliderTokens.StopIndicatorSize
 
     private val trackPath = Path()
@@ -1505,8 +1413,7 @@
     // target is a closest anchor to the `current`, if exists
     return tickFractions
         .minByOrNull { abs(lerp(minPx, maxPx, it) - current) }
-        ?.run { lerp(minPx, maxPx, this) }
-        ?: current
+        ?.run { lerp(minPx, maxPx, this) } ?: current
 }
 
 private suspend fun AwaitPointerEventScope.awaitSlop(
@@ -1539,61 +1446,57 @@
     (if (b - a == 0f) 0f else (pos - a) / (b - a)).coerceIn(0f, 1f)
 
 @OptIn(ExperimentalMaterial3Api::class)
-private fun Modifier.sliderSemantics(
-    state: SliderState,
-    enabled: Boolean
-): Modifier {
+private fun Modifier.sliderSemantics(state: SliderState, enabled: Boolean): Modifier {
     return semantics {
-        if (!enabled) disabled()
-        setProgress(
-            action = { targetValue ->
-                var newValue = targetValue.coerceIn(
-                    state.valueRange.start,
-                    state.valueRange.endInclusive
-                )
-                val originalVal = newValue
-                val resolvedValue = if (state.steps > 0) {
-                    var distance: Float = newValue
-                    for (i in 0..state.steps + 1) {
-                        val stepValue = lerp(
-                            state.valueRange.start,
-                            state.valueRange.endInclusive,
-                            i.toFloat() / (state.steps + 1)
-                        )
-                        if (abs(stepValue - originalVal) <= distance) {
-                            distance = abs(stepValue - originalVal)
-                            newValue = stepValue
-                        }
-                    }
-                    newValue
-                } else {
-                    newValue
-                }
-
-                // This is to keep it consistent with AbsSeekbar.java: return false if no
-                // change from current.
-                if (resolvedValue == state.value) {
-                    false
-                } else {
-                    if (resolvedValue != state.value) {
-                        if (state.onValueChange != null) {
-                            state.onValueChange?.let {
-                                it(resolvedValue)
+            if (!enabled) disabled()
+            setProgress(
+                action = { targetValue ->
+                    var newValue =
+                        targetValue.coerceIn(state.valueRange.start, state.valueRange.endInclusive)
+                    val originalVal = newValue
+                    val resolvedValue =
+                        if (state.steps > 0) {
+                            var distance: Float = newValue
+                            for (i in 0..state.steps + 1) {
+                                val stepValue =
+                                    lerp(
+                                        state.valueRange.start,
+                                        state.valueRange.endInclusive,
+                                        i.toFloat() / (state.steps + 1)
+                                    )
+                                if (abs(stepValue - originalVal) <= distance) {
+                                    distance = abs(stepValue - originalVal)
+                                    newValue = stepValue
+                                }
                             }
+                            newValue
                         } else {
-                            state.value = resolvedValue
+                            newValue
                         }
+
+                    // This is to keep it consistent with AbsSeekbar.java: return false if no
+                    // change from current.
+                    if (resolvedValue == state.value) {
+                        false
+                    } else {
+                        if (resolvedValue != state.value) {
+                            if (state.onValueChange != null) {
+                                state.onValueChange?.let { it(resolvedValue) }
+                            } else {
+                                state.value = resolvedValue
+                            }
+                        }
+                        state.onValueChangeFinished?.invoke()
+                        true
                     }
-                    state.onValueChangeFinished?.invoke()
-                    true
                 }
-            }
+            )
+        }
+        .progressSemantics(
+            state.value,
+            state.valueRange.start..state.valueRange.endInclusive,
+            state.steps
         )
-    }.progressSemantics(
-        state.value,
-        state.valueRange.start..state.valueRange.endInclusive,
-        state.steps
-    )
 }
 
 @OptIn(ExperimentalMaterial3Api::class)
@@ -1604,58 +1507,53 @@
     val valueRange = state.valueRange.start..state.activeRangeEnd
 
     return semantics {
-
-        if (!enabled) disabled()
-        setProgress(
-            action = { targetValue ->
-                var newValue = targetValue.coerceIn(
-                    valueRange.start,
-                    valueRange.endInclusive
-                )
-                val originalVal = newValue
-                val resolvedValue = if (state.startSteps > 0) {
-                    var distance: Float = newValue
-                    for (i in 0..state.startSteps + 1) {
-                        val stepValue = lerp(
-                            valueRange.start,
-                            valueRange.endInclusive,
-                            i.toFloat() / (state.startSteps + 1)
-                        )
-                        if (abs(stepValue - originalVal) <= distance) {
-                            distance = abs(stepValue - originalVal)
-                            newValue = stepValue
-                        }
-                    }
-                    newValue
-                } else {
-                    newValue
-                }
-
-                // This is to keep it consistent with AbsSeekbar.java: return false if no
-                // change from current.
-                if (resolvedValue == state.activeRangeStart) {
-                    false
-                } else {
-                    val resolvedRange = SliderRange(resolvedValue, state.activeRangeEnd)
-                    val activeRange = SliderRange(state.activeRangeStart, state.activeRangeEnd)
-                    if (resolvedRange != activeRange) {
-                        if (state.onValueChange != null) {
-                            state.onValueChange?.let { it(resolvedRange) }
+            if (!enabled) disabled()
+            setProgress(
+                action = { targetValue ->
+                    var newValue = targetValue.coerceIn(valueRange.start, valueRange.endInclusive)
+                    val originalVal = newValue
+                    val resolvedValue =
+                        if (state.startSteps > 0) {
+                            var distance: Float = newValue
+                            for (i in 0..state.startSteps + 1) {
+                                val stepValue =
+                                    lerp(
+                                        valueRange.start,
+                                        valueRange.endInclusive,
+                                        i.toFloat() / (state.startSteps + 1)
+                                    )
+                                if (abs(stepValue - originalVal) <= distance) {
+                                    distance = abs(stepValue - originalVal)
+                                    newValue = stepValue
+                                }
+                            }
+                            newValue
                         } else {
-                            state.activeRangeStart = resolvedRange.start
-                            state.activeRangeEnd = resolvedRange.endInclusive
+                            newValue
                         }
+
+                    // This is to keep it consistent with AbsSeekbar.java: return false if no
+                    // change from current.
+                    if (resolvedValue == state.activeRangeStart) {
+                        false
+                    } else {
+                        val resolvedRange = SliderRange(resolvedValue, state.activeRangeEnd)
+                        val activeRange = SliderRange(state.activeRangeStart, state.activeRangeEnd)
+                        if (resolvedRange != activeRange) {
+                            if (state.onValueChange != null) {
+                                state.onValueChange?.let { it(resolvedRange) }
+                            } else {
+                                state.activeRangeStart = resolvedRange.start
+                                state.activeRangeEnd = resolvedRange.endInclusive
+                            }
+                        }
+                        state.onValueChangeFinished?.invoke()
+                        true
                     }
-                    state.onValueChangeFinished?.invoke()
-                    true
                 }
-            }
-        )
-    }.progressSemantics(
-        state.activeRangeStart,
-        valueRange,
-        state.startSteps
-    )
+            )
+        }
+        .progressSemantics(state.activeRangeStart, valueRange, state.startSteps)
 }
 
 @OptIn(ExperimentalMaterial3Api::class)
@@ -1666,55 +1564,54 @@
     val valueRange = state.activeRangeStart..state.valueRange.endInclusive
 
     return semantics {
-        if (!enabled) disabled()
+            if (!enabled) disabled()
 
-        setProgress(
-            action = { targetValue ->
-                var newValue = targetValue.coerceIn(valueRange.start, valueRange.endInclusive)
-                val originalVal = newValue
-                val resolvedValue = if (state.endSteps > 0) {
-                    var distance: Float = newValue
-                    for (i in 0..state.endSteps + 1) {
-                        val stepValue = lerp(
-                            valueRange.start,
-                            valueRange.endInclusive,
-                            i.toFloat() / (state.endSteps + 1)
-                        )
-                        if (abs(stepValue - originalVal) <= distance) {
-                            distance = abs(stepValue - originalVal)
-                            newValue = stepValue
-                        }
-                    }
-                    newValue
-                } else {
-                    newValue
-                }
-
-                // This is to keep it consistent with AbsSeekbar.java: return false if no
-                // change from current.
-                if (resolvedValue == state.activeRangeEnd) {
-                    false
-                } else {
-                    val resolvedRange = SliderRange(state.activeRangeStart, resolvedValue)
-                    val activeRange = SliderRange(state.activeRangeStart, state.activeRangeEnd)
-                    if (resolvedRange != activeRange) {
-                        if (state.onValueChange != null) {
-                            state.onValueChange?.let { it(resolvedRange) }
+            setProgress(
+                action = { targetValue ->
+                    var newValue = targetValue.coerceIn(valueRange.start, valueRange.endInclusive)
+                    val originalVal = newValue
+                    val resolvedValue =
+                        if (state.endSteps > 0) {
+                            var distance: Float = newValue
+                            for (i in 0..state.endSteps + 1) {
+                                val stepValue =
+                                    lerp(
+                                        valueRange.start,
+                                        valueRange.endInclusive,
+                                        i.toFloat() / (state.endSteps + 1)
+                                    )
+                                if (abs(stepValue - originalVal) <= distance) {
+                                    distance = abs(stepValue - originalVal)
+                                    newValue = stepValue
+                                }
+                            }
+                            newValue
                         } else {
-                            state.activeRangeStart = resolvedRange.start
-                            state.activeRangeEnd = resolvedRange.endInclusive
+                            newValue
                         }
+
+                    // This is to keep it consistent with AbsSeekbar.java: return false if no
+                    // change from current.
+                    if (resolvedValue == state.activeRangeEnd) {
+                        false
+                    } else {
+                        val resolvedRange = SliderRange(state.activeRangeStart, resolvedValue)
+                        val activeRange = SliderRange(state.activeRangeStart, state.activeRangeEnd)
+                        if (resolvedRange != activeRange) {
+                            if (state.onValueChange != null) {
+                                state.onValueChange?.let { it(resolvedRange) }
+                            } else {
+                                state.activeRangeStart = resolvedRange.start
+                                state.activeRangeEnd = resolvedRange.endInclusive
+                            }
+                        }
+                        state.onValueChangeFinished?.invoke()
+                        true
                     }
-                    state.onValueChangeFinished?.invoke()
-                    true
                 }
-            }
-        )
-    }.progressSemantics(
-        state.activeRangeEnd,
-        valueRange,
-        state.endSteps
-    )
+            )
+        }
+        .progressSemantics(state.activeRangeEnd, valueRange, state.endSteps)
 }
 
 @OptIn(ExperimentalMaterial3Api::class)
@@ -1723,19 +1620,20 @@
     state: SliderState,
     interactionSource: MutableInteractionSource,
     enabled: Boolean
-) = if (enabled) {
-    pointerInput(state, interactionSource) {
-        detectTapGestures(
-            onPress = { state.onPress(it) },
-            onTap = {
-                state.dispatchRawDelta(0f)
-                state.gestureEndAction()
-            }
-        )
+) =
+    if (enabled) {
+        pointerInput(state, interactionSource) {
+            detectTapGestures(
+                onPress = { state.onPress(it) },
+                onTap = {
+                    state.dispatchRawDelta(0f)
+                    state.gestureEndAction()
+                }
+            )
+        }
+    } else {
+        this
     }
-} else {
-    this
-}
 
 @OptIn(ExperimentalMaterial3Api::class)
 @Stable
@@ -1747,28 +1645,27 @@
 ): Modifier =
     if (enabled) {
         pointerInput(startInteractionSource, endInteractionSource, state) {
-            val rangeSliderLogic = RangeSliderLogic(
-                state,
-                startInteractionSource,
-                endInteractionSource
-            )
+            val rangeSliderLogic =
+                RangeSliderLogic(state, startInteractionSource, endInteractionSource)
             coroutineScope {
                 awaitEachGesture {
                     val event = awaitFirstDown(requireUnconsumed = false)
                     val interaction = DragInteraction.Start()
-                    var posX = if (state.isRtl)
-                        state.totalWidth - event.position.x else event.position.x
+                    var posX =
+                        if (state.isRtl) state.totalWidth - event.position.x else event.position.x
                     val compare = rangeSliderLogic.compareOffsets(posX)
-                    var draggingStart = if (compare != 0) {
-                        compare < 0
-                    } else {
-                        state.rawOffsetStart > posX
-                    }
+                    var draggingStart =
+                        if (compare != 0) {
+                            compare < 0
+                        } else {
+                            state.rawOffsetStart > posX
+                        }
 
                     awaitSlop(event.id, event.type)?.let {
                         val slop = viewConfiguration.pointerSlop(event.type)
-                        val shouldUpdateCapturedThumb = abs(state.rawOffsetEnd - posX) < slop &&
-                            abs(state.rawOffsetStart - posX) < slop
+                        val shouldUpdateCapturedThumb =
+                            abs(state.rawOffsetEnd - posX) < slop &&
+                                abs(state.rawOffsetStart - posX) < slop
                         if (shouldUpdateCapturedThumb) {
                             val dir = it.second
                             draggingStart = if (state.isRtl) dir >= 0f else dir < 0f
@@ -1783,25 +1680,28 @@
                         this@coroutineScope
                     )
 
-                    val finishInteraction = try {
-                        val success = horizontalDrag(pointerId = event.id) {
-                            val deltaX = it.positionChange().x
-                            state.onDrag(draggingStart, if (state.isRtl) -deltaX else deltaX)
-                        }
-                        if (success) {
-                            DragInteraction.Stop(interaction)
-                        } else {
+                    val finishInteraction =
+                        try {
+                            val success =
+                                horizontalDrag(pointerId = event.id) {
+                                    val deltaX = it.positionChange().x
+                                    state.onDrag(
+                                        draggingStart,
+                                        if (state.isRtl) -deltaX else deltaX
+                                    )
+                                }
+                            if (success) {
+                                DragInteraction.Stop(interaction)
+                            } else {
+                                DragInteraction.Cancel(interaction)
+                            }
+                        } catch (e: CancellationException) {
                             DragInteraction.Cancel(interaction)
                         }
-                    } catch (e: CancellationException) {
-                        DragInteraction.Cancel(interaction)
-                    }
 
                     state.gestureEndAction(draggingStart)
                     launch {
-                        rangeSliderLogic
-                            .activeInteraction(draggingStart)
-                            .emit(finishInteraction)
+                        rangeSliderLogic.activeInteraction(draggingStart).emit(finishInteraction)
                     }
                 }
             }
@@ -1835,37 +1735,33 @@
             draggingStart,
             posX - if (draggingStart) state.rawOffsetStart else state.rawOffsetEnd
         )
-        scope.launch {
-            activeInteraction(draggingStart).emit(interaction)
-        }
+        scope.launch { activeInteraction(draggingStart).emit(interaction) }
     }
 }
 
 /**
  * Represents the color used by a [Slider] in different states.
  *
- * @constructor create an instance with arbitrary colors.
- * See [SliderDefaults.colors] for the default implementation that follows Material
- * specifications.
- *
  * @param thumbColor thumb color when enabled
- * @param activeTrackColor color of the track in the part that is "active", meaning that the
- * thumb is ahead of it
- * @param activeTickColor colors to be used to draw tick marks on the active track, if `steps`
- * is specified
+ * @param activeTrackColor color of the track in the part that is "active", meaning that the thumb
+ *   is ahead of it
+ * @param activeTickColor colors to be used to draw tick marks on the active track, if `steps` is
+ *   specified
  * @param inactiveTrackColor color of the track in the part that is "inactive", meaning that the
- * thumb is before it
- * @param inactiveTickColor colors to be used to draw tick marks on the inactive track, if
- * `steps` are specified on the Slider is specified
+ *   thumb is before it
+ * @param inactiveTickColor colors to be used to draw tick marks on the inactive track, if `steps`
+ *   are specified on the Slider is specified
  * @param disabledThumbColor thumb colors when disabled
  * @param disabledActiveTrackColor color of the track in the "active" part when the Slider is
- * disabled
- * @param disabledActiveTickColor colors to be used to draw tick marks on the active track
- * when Slider is disabled and when `steps` are specified on it
- * @param disabledInactiveTrackColor color of the track in the "inactive" part when the
- * Slider is disabled
- * @param disabledInactiveTickColor colors to be used to draw tick marks on the inactive part
- * of the track when Slider is disabled and when `steps` are specified on it
+ *   disabled
+ * @param disabledActiveTickColor colors to be used to draw tick marks on the active track when
+ *   Slider is disabled and when `steps` are specified on it
+ * @param disabledInactiveTrackColor color of the track in the "inactive" part when the Slider is
+ *   disabled
+ * @param disabledInactiveTickColor colors to be used to draw tick marks on the inactive part of the
+ *   track when Slider is disabled and when `steps` are specified on it
+ * @constructor create an instance with arbitrary colors. See [SliderDefaults.colors] for the
+ *   default implementation that follows Material specifications.
  */
 @Immutable
 class SliderColors(
@@ -1882,8 +1778,8 @@
 ) {
 
     /**
-     * Returns a copy of this SelectableChipColors, optionally overriding some of the values.
-     * This uses the Color.Unspecified to mean “use the value from the source”
+     * Returns a copy of this SelectableChipColors, optionally overriding some of the values. This
+     * uses the Color.Unspecified to mean “use the value from the source”
      */
     fun copy(
         thumbColor: Color = this.thumbColor,
@@ -1896,18 +1792,19 @@
         disabledActiveTickColor: Color = this.disabledActiveTickColor,
         disabledInactiveTrackColor: Color = this.disabledInactiveTrackColor,
         disabledInactiveTickColor: Color = this.disabledInactiveTickColor,
-    ) = SliderColors(
-        thumbColor.takeOrElse { this.thumbColor },
-        activeTrackColor.takeOrElse { this.activeTrackColor },
-        activeTickColor.takeOrElse { this.activeTickColor },
-        inactiveTrackColor.takeOrElse { this.inactiveTrackColor },
-        inactiveTickColor.takeOrElse { this.inactiveTickColor },
-        disabledThumbColor.takeOrElse { this.disabledThumbColor },
-        disabledActiveTrackColor.takeOrElse { this.disabledActiveTrackColor },
-        disabledActiveTickColor.takeOrElse { this.disabledActiveTickColor },
-        disabledInactiveTrackColor.takeOrElse { this.disabledInactiveTrackColor },
-        disabledInactiveTickColor.takeOrElse { this.disabledInactiveTickColor },
-    )
+    ) =
+        SliderColors(
+            thumbColor.takeOrElse { this.thumbColor },
+            activeTrackColor.takeOrElse { this.activeTrackColor },
+            activeTickColor.takeOrElse { this.activeTickColor },
+            inactiveTrackColor.takeOrElse { this.inactiveTrackColor },
+            inactiveTickColor.takeOrElse { this.inactiveTickColor },
+            disabledThumbColor.takeOrElse { this.disabledThumbColor },
+            disabledActiveTrackColor.takeOrElse { this.disabledActiveTrackColor },
+            disabledActiveTickColor.takeOrElse { this.disabledActiveTickColor },
+            disabledInactiveTrackColor.takeOrElse { this.disabledInactiveTrackColor },
+            disabledInactiveTickColor.takeOrElse { this.disabledInactiveTickColor },
+        )
 
     @Stable
     internal fun thumbColor(enabled: Boolean): Color =
@@ -1983,8 +1880,8 @@
 }
 
 /**
- * Class that holds information about [Slider]'s and [RangeSlider]'s active track
- * and fractional positions where the discrete ticks should be drawn on the track.
+ * Class that holds information about [Slider]'s and [RangeSlider]'s active track and fractional
+ * positions where the discrete ticks should be drawn on the track.
  */
 @Suppress("DEPRECATION")
 @Deprecated("Not necessary with the introduction of Slider state")
@@ -1994,16 +1891,16 @@
     initialTickFractions: FloatArray = floatArrayOf()
 ) {
     /**
-     * [ClosedFloatingPointRange] that indicates the current active range for the
-     * start to thumb for a [Slider] and start thumb to end thumb for a [RangeSlider].
+     * [ClosedFloatingPointRange] that indicates the current active range for the start to thumb for
+     * a [Slider] and start thumb to end thumb for a [RangeSlider].
      */
     var activeRange: ClosedFloatingPointRange<Float> by mutableStateOf(initialActiveRange)
         internal set
 
     /**
-     * The discrete points where a tick should be drawn on the track.
-     * Each value of tickFractions should be within the range [0f, 1f]. If
-     * the track is continuous, then tickFractions will be an empty [FloatArray].
+     * The discrete points where a tick should be drawn on the track. Each value of tickFractions
+     * should be within the range [0f, 1f]. If the track is continuous, then tickFractions will be
+     * an empty [FloatArray].
      */
     var tickFractions: FloatArray by mutableStateOf(initialTickFractions)
         internal set
@@ -2028,23 +1925,21 @@
 /**
  * Class that holds information about [Slider]'s active range.
  *
- * @param value [Float] that indicates the initial
- * position of the thumb. If outside of [valueRange]
- * provided, value will be coerced to this range.
+ * @param value [Float] that indicates the initial position of the thumb. If outside of [valueRange]
+ *   provided, value will be coerced to this range.
  * @param steps if positive, specifies the amount of discrete allowable values (in addition to the
- * endpoints of the value range). Step values are evenly distributed across the range. If 0, the
- * slider will behave continuously and allow any value from the range. Must not be negative.
+ *   endpoints of the value range). Step values are evenly distributed across the range. If 0, the
+ *   slider will behave continuously and allow any value from the range. Must not be negative.
  * @param onValueChangeFinished lambda to be invoked when value change has ended. This callback
- * shouldn't be used to update the range slider values (use [onValueChange] for that),
- * but rather to know when the user has completed selecting a new value by ending a drag or a click.
- * @param valueRange range of values that Slider values can take. [value] will be
- * coerced to this range.
+ *   shouldn't be used to update the range slider values (use [onValueChange] for that), but rather
+ *   to know when the user has completed selecting a new value by ending a drag or a click.
+ * @param valueRange range of values that Slider values can take. [value] will be coerced to this
+ *   range.
  */
 @ExperimentalMaterial3Api
 class SliderState(
     value: Float = 0f,
-    @IntRange(from = 0)
-    val steps: Int = 0,
+    @IntRange(from = 0) val steps: Int = 0,
     var onValueChangeFinished: (() -> Unit)? = null,
     val valueRange: ClosedFloatingPointRange<Float> = 0f..1f
 ) : DraggableState {
@@ -2052,18 +1947,18 @@
     private var valueState by mutableFloatStateOf(value)
 
     /**
-     * [Float] that indicates the current value that the thumb
-     * currently is in respect to the track.
+     * [Float] that indicates the current value that the thumb currently is in respect to the track.
      */
     var value: Float
         set(newVal) {
             val coercedValue = newVal.coerceIn(valueRange.start, valueRange.endInclusive)
-            val snappedValue = snapValueToTick(
-                coercedValue,
-                tickFractions,
-                valueRange.start,
-                valueRange.endInclusive
-            )
+            val snappedValue =
+                snapValueToTick(
+                    coercedValue,
+                    tickFractions,
+                    valueRange.start,
+                    valueRange.endInclusive
+                )
             valueState = snappedValue
         }
         get() = valueState
@@ -2093,9 +1988,7 @@
         }
     }
 
-    /**
-     * callback in which value should be updated
-     */
+    /** callback in which value should be updated */
     internal var onValueChange: ((Float) -> Unit)? = null
 
     internal val tickFractions = stepsToTickFractions(steps)
@@ -2105,19 +1998,17 @@
     internal var thumbWidth by mutableFloatStateOf(0f)
 
     internal val coercedValueAsFraction
-        get() = calcFraction(
-            valueRange.start,
-            valueRange.endInclusive,
-            value.coerceIn(valueRange.start, valueRange.endInclusive)
-        )
+        get() =
+            calcFraction(
+                valueRange.start,
+                valueRange.endInclusive,
+                value.coerceIn(valueRange.start, valueRange.endInclusive)
+            )
 
     internal var isDragging by mutableStateOf(false)
         private set
 
-    internal fun updateDimensions(
-        newTrackHeight: Float,
-        newTotalWidth: Int
-    ) {
+    internal fun updateDimensions(newTrackHeight: Float, newTotalWidth: Int) {
         trackHeight = newTrackHeight
         totalWidth = newTotalWidth
     }
@@ -2136,9 +2027,10 @@
 
     private var rawOffset by mutableFloatStateOf(scaleToOffset(0f, 0f, value))
     private var pressOffset by mutableFloatStateOf(0f)
-    private val dragScope: DragScope = object : DragScope {
-        override fun dragBy(pixels: Float): Unit = dispatchRawDelta(pixels)
-    }
+    private val dragScope: DragScope =
+        object : DragScope {
+            override fun dragBy(pixels: Float): Unit = dispatchRawDelta(pixels)
+        }
 
     private val scrollMutex = MutatorMutex()
 
@@ -2152,61 +2044,56 @@
 /**
  * Class that holds information about [RangeSlider]'s active range.
  *
- * @param activeRangeStart [Float] that indicates the initial
- * start of the active range of the slider. If outside of [valueRange]
- * provided, value will be coerced to this range.
- * @param activeRangeEnd [Float] that indicates the initial
- * end of the active range of the slider. If outside of [valueRange]
- * provided, value will be coerced to this range.
+ * @param activeRangeStart [Float] that indicates the initial start of the active range of the
+ *   slider. If outside of [valueRange] provided, value will be coerced to this range.
+ * @param activeRangeEnd [Float] that indicates the initial end of the active range of the slider.
+ *   If outside of [valueRange] provided, value will be coerced to this range.
  * @param steps if positive, specifies the amount of discrete allowable values (in addition to the
- * endpoints of the value range). Step values are evenly distributed across the range. If 0, the
- * range slider will behave continuously and allow any value from the range. Must not be negative.
+ *   endpoints of the value range). Step values are evenly distributed across the range. If 0, the
+ *   range slider will behave continuously and allow any value from the range. Must not be negative.
  * @param onValueChangeFinished lambda to be invoked when value change has ended. This callback
- * shouldn't be used to update the range slider values (use [onValueChange] for that), but rather
- * to know when the user has completed selecting a new value by ending a drag or a click.
- * @param valueRange range of values that Range Slider values can take. [activeRangeStart]
- * and [activeRangeEnd] will be coerced to this range.
+ *   shouldn't be used to update the range slider values (use [onValueChange] for that), but rather
+ *   to know when the user has completed selecting a new value by ending a drag or a click.
+ * @param valueRange range of values that Range Slider values can take. [activeRangeStart] and
+ *   [activeRangeEnd] will be coerced to this range.
  */
 @ExperimentalMaterial3Api
 class RangeSliderState(
     activeRangeStart: Float = 0f,
     activeRangeEnd: Float = 1f,
-    @IntRange(from = 0)
-    val steps: Int = 0,
+    @IntRange(from = 0) val steps: Int = 0,
     var onValueChangeFinished: (() -> Unit)? = null,
     val valueRange: ClosedFloatingPointRange<Float> = 0f..1f
 ) {
     private var activeRangeStartState by mutableFloatStateOf(activeRangeStart)
     private var activeRangeEndState by mutableFloatStateOf(activeRangeEnd)
 
-    /**
-     * [Float] that indicates the start of the current active range for the [RangeSlider].
-     */
+    /** [Float] that indicates the start of the current active range for the [RangeSlider]. */
     var activeRangeStart: Float
         set(newVal) {
             val coercedValue = newVal.coerceIn(valueRange.start, activeRangeEnd)
-            val snappedValue = snapValueToTick(
-                coercedValue,
-                tickFractions,
-                valueRange.start,
-                valueRange.endInclusive
-            )
+            val snappedValue =
+                snapValueToTick(
+                    coercedValue,
+                    tickFractions,
+                    valueRange.start,
+                    valueRange.endInclusive
+                )
             activeRangeStartState = snappedValue
         }
         get() = activeRangeStartState
 
-    /**
-     * [Float] that indicates the end of the current active range for the [RangeSlider].
-     */
+    /** [Float] that indicates the end of the current active range for the [RangeSlider]. */
     var activeRangeEnd: Float
         set(newVal) {
             val coercedValue = newVal.coerceIn(activeRangeStart, valueRange.endInclusive)
-            val snappedValue = snapValueToTick(
-                coercedValue,
-                tickFractions,
-                valueRange.start,
-                valueRange.endInclusive
-            )
+            val snappedValue =
+                snapValueToTick(
+                    coercedValue,
+                    tickFractions,
+                    valueRange.start,
+                    valueRange.endInclusive
+                )
             activeRangeEndState = snappedValue
         }
         get() = activeRangeEndState
@@ -2224,29 +2111,28 @@
 
     internal var isRtl by mutableStateOf(false)
 
-    internal val gestureEndAction: (Boolean) -> Unit = {
-        onValueChangeFinished?.invoke()
-    }
+    internal val gestureEndAction: (Boolean) -> Unit = { onValueChangeFinished?.invoke() }
 
     private var maxPx by mutableFloatStateOf(0f)
     private var minPx by mutableFloatStateOf(0f)
 
     internal fun onDrag(isStart: Boolean, offset: Float) {
-        val offsetRange = if (isStart) {
-            rawOffsetStart = (rawOffsetStart + offset)
-            rawOffsetEnd = scaleToOffset(minPx, maxPx, activeRangeEnd)
-            val offsetEnd = rawOffsetEnd
-            var offsetStart = rawOffsetStart.coerceIn(minPx, offsetEnd)
-            offsetStart = snapValueToTick(offsetStart, tickFractions, minPx, maxPx)
-            SliderRange(offsetStart, offsetEnd)
-        } else {
-            rawOffsetEnd = (rawOffsetEnd + offset)
-            rawOffsetStart = scaleToOffset(minPx, maxPx, activeRangeStart)
-            val offsetStart = rawOffsetStart
-            var offsetEnd = rawOffsetEnd.coerceIn(offsetStart, maxPx)
-            offsetEnd = snapValueToTick(offsetEnd, tickFractions, minPx, maxPx)
-            SliderRange(offsetStart, offsetEnd)
-        }
+        val offsetRange =
+            if (isStart) {
+                rawOffsetStart = (rawOffsetStart + offset)
+                rawOffsetEnd = scaleToOffset(minPx, maxPx, activeRangeEnd)
+                val offsetEnd = rawOffsetEnd
+                var offsetStart = rawOffsetStart.coerceIn(minPx, offsetEnd)
+                offsetStart = snapValueToTick(offsetStart, tickFractions, minPx, maxPx)
+                SliderRange(offsetStart, offsetEnd)
+            } else {
+                rawOffsetEnd = (rawOffsetEnd + offset)
+                rawOffsetStart = scaleToOffset(minPx, maxPx, activeRangeStart)
+                val offsetStart = rawOffsetStart
+                var offsetEnd = rawOffsetEnd.coerceIn(offsetStart, maxPx)
+                offsetEnd = snapValueToTick(offsetEnd, tickFractions, minPx, maxPx)
+                SliderRange(offsetStart, offsetEnd)
+            }
         val scaledUserValue = scaleToUserValue(minPx, maxPx, offsetRange)
         if (scaledUserValue != SliderRange(activeRangeStart, activeRangeEnd)) {
             if (onValueChange != null) {
@@ -2259,18 +2145,10 @@
     }
 
     internal val coercedActiveRangeStartAsFraction
-        get() = calcFraction(
-            valueRange.start,
-            valueRange.endInclusive,
-            activeRangeStart
-        )
+        get() = calcFraction(valueRange.start, valueRange.endInclusive, activeRangeStart)
 
     internal val coercedActiveRangeEndAsFraction
-        get() = calcFraction(
-            valueRange.start,
-            valueRange.endInclusive,
-            activeRangeEnd
-        )
+        get() = calcFraction(valueRange.start, valueRange.endInclusive, activeRangeEnd)
 
     internal val startSteps
         get() = floor(steps * coercedActiveRangeEndAsFraction).toInt()
@@ -2279,11 +2157,8 @@
         get() = floor(steps * (1f - coercedActiveRangeStartAsFraction)).toInt()
 
     // scales range offset from within minPx..maxPx to within valueRange.start..valueRange.end
-    private fun scaleToUserValue(
-        minPx: Float,
-        maxPx: Float,
-        offset: SliderRange
-    ) = scale(minPx, maxPx, offset, valueRange.start, valueRange.endInclusive)
+    private fun scaleToUserValue(minPx: Float, maxPx: Float, offset: SliderRange) =
+        scale(minPx, maxPx, offset, valueRange.start, valueRange.endInclusive)
 
     // scales float userValue within valueRange.start..valueRange.end to within minPx..maxPx
     private fun scaleToOffset(minPx: Float, maxPx: Float, userValue: Float) =
@@ -2295,16 +2170,8 @@
         if (minPx != newMinPx || maxPx != newMaxPx) {
             minPx = newMinPx
             maxPx = newMaxPx
-            rawOffsetStart = scaleToOffset(
-                minPx,
-                maxPx,
-                activeRangeStart
-            )
-            rawOffsetEnd = scaleToOffset(
-                minPx,
-                maxPx,
-                activeRangeEnd
-            )
+            rawOffsetStart = scaleToOffset(minPx, maxPx, activeRangeStart)
+            rawOffsetEnd = scaleToOffset(minPx, maxPx, activeRangeEnd)
         }
     }
 }
@@ -2312,62 +2179,50 @@
 /**
  * Immutable float range for [RangeSlider]
  *
- * Used in [RangeSlider] to determine the active track range for the component.
- * The range is as follows: SliderRange.start..SliderRange.endInclusive.
+ * Used in [RangeSlider] to determine the active track range for the component. The range is as
+ * follows: SliderRange.start..SliderRange.endInclusive.
  */
 @Immutable
 @JvmInline
-internal value class SliderRange(
-    val packedValue: Long
-) {
-    /**
-     * start of the [SliderRange]
-     */
+internal value class SliderRange(val packedValue: Long) {
+    /** start of the [SliderRange] */
     @Stable
     val start: Float
         get() {
             // Explicitly compare against packed values to avoid auto-boxing of Size.Unspecified
-            check(this.packedValue != Unspecified.packedValue) {
-                "SliderRange is unspecified"
-            }
+            check(this.packedValue != Unspecified.packedValue) { "SliderRange is unspecified" }
             return unpackFloat1(packedValue)
         }
 
-    /**
-     * End (inclusive) of the [SliderRange]
-     */
+    /** End (inclusive) of the [SliderRange] */
     @Stable
     val endInclusive: Float
         get() {
             // Explicitly compare against packed values to avoid auto-boxing of Size.Unspecified
-            check(this.packedValue != Unspecified.packedValue) {
-                "SliderRange is unspecified"
-            }
+            check(this.packedValue != Unspecified.packedValue) { "SliderRange is unspecified" }
             return unpackFloat2(packedValue)
         }
 
     companion object {
         /**
-         * Represents an unspecified [SliderRange] value, usually a replacement for `null`
-         * when a primitive value is desired.
+         * Represents an unspecified [SliderRange] value, usually a replacement for `null` when a
+         * primitive value is desired.
          */
-        @Stable
-        val Unspecified = SliderRange(Float.NaN, Float.NaN)
+        @Stable val Unspecified = SliderRange(Float.NaN, Float.NaN)
     }
 
-    /**
-     * String representation of the [SliderRange]
-     */
-    override fun toString() = if (isSpecified) {
-        "$start..$endInclusive"
-    } else {
-        "FloatRange.Unspecified"
-    }
+    /** String representation of the [SliderRange] */
+    override fun toString() =
+        if (isSpecified) {
+            "$start..$endInclusive"
+        } else {
+            "FloatRange.Unspecified"
+        }
 }
 
 /**
- * Creates a [SliderRange] from a given start and endInclusive float.
- * It requires endInclusive to be >= start.
+ * Creates a [SliderRange] from a given start and endInclusive float. It requires endInclusive to
+ * be >= start.
  *
  * @param start float that indicates the start of the range
  * @param endInclusive float that indicates the end of the range
@@ -2383,8 +2238,8 @@
 }
 
 /**
- * Creates a [SliderRange] from a given [ClosedFloatingPointRange].
- * It requires range.endInclusive >= range.start.
+ * Creates a [SliderRange] from a given [ClosedFloatingPointRange]. It requires
+ * range.endInclusive >= range.start.
  *
  * @param range the ClosedFloatingPointRange<Float> for the range.
  */
@@ -2400,9 +2255,7 @@
     return SliderRange(packFloats(start, endInclusive))
 }
 
-/**
- * Check for if a given [SliderRange] is not [SliderRange.Unspecified].
- */
+/** Check for if a given [SliderRange] is not [SliderRange.Unspecified]. */
 @Stable
 internal val SliderRange.isSpecified: Boolean
     get() = packedValue != SliderRange.Unspecified.packedValue
diff --git a/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/Snackbar.kt b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/Snackbar.kt
index ed987ae..31f5a6c 100644
--- a/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/Snackbar.kt
+++ b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/Snackbar.kt
@@ -47,15 +47,17 @@
 import kotlin.math.min
 
 /**
- * <a href="https://m3.material.io/components/snackbar/overview" class="external" target="_blank">Material Design snackbar</a>.
+ * <a href="https://m3.material.io/components/snackbar/overview" class="external"
+ * target="_blank">Material Design snackbar</a>.
  *
  * Snackbars provide brief messages about app processes at the bottom of the screen.
  *
- * ![Snackbar image](https://developer.android.com/images/reference/androidx/compose/material3/snackbar.png)
+ * ![Snackbar
+ * image](https://developer.android.com/images/reference/androidx/compose/material3/snackbar.png)
  *
  * Snackbars inform users of a process that an app has performed or will perform. They appear
- * temporarily, towards the bottom of the screen. They shouldn’t interrupt the user experience,
- * and they don’t require user input to disappear.
+ * temporarily, towards the bottom of the screen. They shouldn’t interrupt the user experience, and
+ * they don’t require user input to disappear.
  *
  * A Snackbar can contain a single action. "Dismiss" or "cancel" actions are optional.
  *
@@ -63,37 +65,39 @@
  * action. Here, moving the keyboard focus indicator to navigate through interactive elements in a
  * page is not considered an action.
  *
- * This component provides only the visuals of the Snackbar. If you need to show a Snackbar
- * with defaults on the screen, use [SnackbarHostState.showSnackbar]:
+ * This component provides only the visuals of the Snackbar. If you need to show a Snackbar with
+ * defaults on the screen, use [SnackbarHostState.showSnackbar]:
  *
  * @sample androidx.compose.material3.samples.ScaffoldWithSimpleSnackbar
  *
- * If you want to customize appearance of the Snackbar, you can pass your own version as a child
- * of the [SnackbarHost] to the [Scaffold]:
+ * If you want to customize appearance of the Snackbar, you can pass your own version as a child of
+ * the [SnackbarHost] to the [Scaffold]:
+ *
  * @sample androidx.compose.material3.samples.ScaffoldWithCustomSnackbar
  *
  * For a multiline sample following the Material recommended spec of a maximum of 2 lines, see:
+ *
  * @sample androidx.compose.material3.samples.ScaffoldWithMultilineSnackbar
  *
  * @param modifier the [Modifier] to be applied to this snackbar
  * @param action action / button component to add as an action to the snackbar. Consider using
- * [ColorScheme.inversePrimary] as the color for the action, if you do not have a predefined color
- * you wish to use instead.
+ *   [ColorScheme.inversePrimary] as the color for the action, if you do not have a predefined color
+ *   you wish to use instead.
  * @param dismissAction action / button component to add as an additional close affordance action
- * when a snackbar is non self-dismissive. Consider using [ColorScheme.inverseOnSurface] as the
- * color for the action, if you do not have a predefined color you wish to use instead.
+ *   when a snackbar is non self-dismissive. Consider using [ColorScheme.inverseOnSurface] as the
+ *   color for the action, if you do not have a predefined color you wish to use instead.
  * @param actionOnNewLine whether or not action should be put on a separate line. Recommended for
- * action with long action text.
+ *   action with long action text.
  * @param shape defines the shape of this snackbar's container
  * @param containerColor the color used for the background of this snackbar. Use [Color.Transparent]
- * to have no color.
+ *   to have no color.
  * @param contentColor the preferred color for content inside this snackbar
  * @param actionContentColor the preferred content color for the optional [action] inside this
- * snackbar
+ *   snackbar
  * @param dismissActionContentColor the preferred content color for the optional [dismissAction]
- * inside this snackbar
+ *   inside this snackbar
  * @param content content to show information about a process that an app has performed or will
- * perform
+ *   perform
  */
 @Composable
 fun Snackbar(
@@ -119,37 +123,41 @@
         val actionTextStyle = SnackbarTokens.ActionLabelTextFont.value
         CompositionLocalProvider(LocalTextStyle provides textStyle) {
             when {
-                actionOnNewLine && action != null -> NewLineButtonSnackbar(
-                    text = content,
-                    action = action,
-                    dismissAction = dismissAction,
-                    actionTextStyle = actionTextStyle,
-                    actionContentColor = actionContentColor,
-                    dismissActionContentColor = dismissActionContentColor,
-                )
-                else -> OneRowSnackbar(
-                    text = content,
-                    action = action,
-                    dismissAction = dismissAction,
-                    actionTextStyle = actionTextStyle,
-                    actionTextColor = actionContentColor,
-                    dismissActionColor = dismissActionContentColor,
-                )
+                actionOnNewLine && action != null ->
+                    NewLineButtonSnackbar(
+                        text = content,
+                        action = action,
+                        dismissAction = dismissAction,
+                        actionTextStyle = actionTextStyle,
+                        actionContentColor = actionContentColor,
+                        dismissActionContentColor = dismissActionContentColor,
+                    )
+                else ->
+                    OneRowSnackbar(
+                        text = content,
+                        action = action,
+                        dismissAction = dismissAction,
+                        actionTextStyle = actionTextStyle,
+                        actionTextColor = actionContentColor,
+                        dismissActionColor = dismissActionContentColor,
+                    )
             }
         }
     }
 }
 
 /**
- * <a href="https://m3.material.io/components/snackbar/overview" class="external" target="_blank">Material Design snackbar</a>.
+ * <a href="https://m3.material.io/components/snackbar/overview" class="external"
+ * target="_blank">Material Design snackbar</a>.
  *
  * Snackbars provide brief messages about app processes at the bottom of the screen.
  *
- * ![Snackbar image](https://developer.android.com/images/reference/androidx/compose/material3/snackbar.png)
+ * ![Snackbar
+ * image](https://developer.android.com/images/reference/androidx/compose/material3/snackbar.png)
  *
  * Snackbars inform users of a process that an app has performed or will perform. They appear
- * temporarily, towards the bottom of the screen. They shouldn’t interrupt the user experience,
- * and they don’t require user input to disappear.
+ * temporarily, towards the bottom of the screen. They shouldn’t interrupt the user experience, and
+ * they don’t require user input to disappear.
  *
  * A Snackbar can contain a single action. "Dismiss" or "cancel" actions are optional.
  *
@@ -157,38 +165,38 @@
  * action. Here, moving the keyboard focus indicator to navigate through interactive elements in a
  * page is not considered an action.
  *
- * This version of snackbar is designed to work with [SnackbarData] provided by the
- * [SnackbarHost], which is usually used inside of the [Scaffold].
+ * This version of snackbar is designed to work with [SnackbarData] provided by the [SnackbarHost],
+ * which is usually used inside of the [Scaffold].
  *
- * This components provides only the visuals of the Snackbar. If you need to show a Snackbar
- * with defaults on the screen, use [SnackbarHostState.showSnackbar]:
+ * This components provides only the visuals of the Snackbar. If you need to show a Snackbar with
+ * defaults on the screen, use [SnackbarHostState.showSnackbar]:
  *
  * @sample androidx.compose.material3.samples.ScaffoldWithSimpleSnackbar
  *
- * If you want to customize appearance of the Snackbar, you can pass your own version as a child
- * of the [SnackbarHost] to the [Scaffold]:
+ * If you want to customize appearance of the Snackbar, you can pass your own version as a child of
+ * the [SnackbarHost] to the [Scaffold]:
  *
  * @sample androidx.compose.material3.samples.ScaffoldWithCustomSnackbar
  *
  * When a [SnackbarData.visuals] sets the Snackbar's duration as [SnackbarDuration.Indefinite], it's
- * recommended to display an additional close affordance action.
- * See [SnackbarVisuals.withDismissAction]:
+ * recommended to display an additional close affordance action. See
+ * [SnackbarVisuals.withDismissAction]:
  *
  * @sample androidx.compose.material3.samples.ScaffoldWithIndefiniteSnackbar
  *
  * @param snackbarData data about the current snackbar showing via [SnackbarHostState]
  * @param modifier the [Modifier] to be applied to this snackbar
  * @param actionOnNewLine whether or not action should be put on a separate line. Recommended for
- * action with long action text.
+ *   action with long action text.
  * @param shape defines the shape of this snackbar's container
  * @param containerColor the color used for the background of this snackbar. Use [Color.Transparent]
- * to have no color.
+ *   to have no color.
  * @param contentColor the preferred color for content inside this snackbar
  * @param actionColor the color of the snackbar's action
  * @param actionContentColor the preferred content color for the optional action inside this
- * snackbar. See [SnackbarVisuals.actionLabel].
+ *   snackbar. See [SnackbarVisuals.actionLabel].
  * @param dismissActionContentColor the preferred content color for the optional dismiss action
- * inside this snackbar. See [SnackbarVisuals.withDismissAction].
+ *   inside this snackbar. See [SnackbarVisuals.withDismissAction].
  */
 @Composable
 fun Snackbar(
@@ -203,17 +211,18 @@
     dismissActionContentColor: Color = SnackbarDefaults.dismissActionContentColor,
 ) {
     val actionLabel = snackbarData.visuals.actionLabel
-    val actionComposable: (@Composable () -> Unit)? = if (actionLabel != null) {
-        @Composable {
-            TextButton(
-                colors = ButtonDefaults.textButtonColors(contentColor = actionColor),
-                onClick = { snackbarData.performAction() },
-                content = { Text(actionLabel) }
-            )
+    val actionComposable: (@Composable () -> Unit)? =
+        if (actionLabel != null) {
+            @Composable {
+                TextButton(
+                    colors = ButtonDefaults.textButtonColors(contentColor = actionColor),
+                    onClick = { snackbarData.performAction() },
+                    content = { Text(actionLabel) }
+                )
+            }
+        } else {
+            null
         }
-    } else {
-        null
-    }
     val dismissActionComposable: (@Composable () -> Unit)? =
         if (snackbarData.visuals.withDismissAction) {
             @Composable {
@@ -254,19 +263,19 @@
     dismissActionContentColor: Color
 ) {
     Column(
-        modifier = Modifier
-            // Fill max width, up to ContainerMaxWidth.
-            .widthIn(max = ContainerMaxWidth)
-            .fillMaxWidth()
-            .padding(
-                start = HorizontalSpacing,
-                bottom = SeparateButtonExtraY
-            )
+        modifier =
+            Modifier
+                // Fill max width, up to ContainerMaxWidth.
+                .widthIn(max = ContainerMaxWidth)
+                .fillMaxWidth()
+                .padding(start = HorizontalSpacing, bottom = SeparateButtonExtraY)
     ) {
         Box(
             Modifier.paddingFromBaseline(HeightToFirstLine, LongButtonVerticalOffset)
                 .padding(end = HorizontalSpacingButtonSide)
-        ) { text() }
+        ) {
+            text()
+        }
 
         Box(
             Modifier.align(Alignment.End)
@@ -322,10 +331,11 @@
                 }
             }
         },
-        modifier = Modifier.padding(
-            start = HorizontalSpacing,
-            end = if (dismissAction == null) HorizontalSpacingButtonSide else 0.dp
-        )
+        modifier =
+            Modifier.padding(
+                start = HorizontalSpacing,
+                end = if (dismissAction == null) HorizontalSpacingButtonSide else 0.dp
+            )
     ) { measurables, constraints ->
         val containerWidth = min(constraints.maxWidth, ContainerMaxWidth.roundToPx())
         val actionButtonPlaceable =
@@ -340,14 +350,16 @@
         val textMaxWidth =
             (containerWidth - actionButtonWidth - dismissButtonWidth - extraSpacingWidth)
                 .coerceAtLeast(constraints.minWidth)
-        val textPlaceable = measurables.fastFirst { it.layoutId == textTag }.measure(
-            constraints.copy(minHeight = 0, maxWidth = textMaxWidth)
-        )
+        val textPlaceable =
+            measurables
+                .fastFirst { it.layoutId == textTag }
+                .measure(constraints.copy(minHeight = 0, maxWidth = textMaxWidth))
 
         val firstTextBaseline = textPlaceable[FirstBaseline]
         val lastTextBaseline = textPlaceable[LastBaseline]
-        val hasText = firstTextBaseline != AlignmentLine.Unspecified &&
-            lastTextBaseline != AlignmentLine.Unspecified
+        val hasText =
+            firstTextBaseline != AlignmentLine.Unspecified &&
+                lastTextBaseline != AlignmentLine.Unspecified
         val isOneLine = firstTextBaseline == lastTextBaseline || !hasText
         val dismissButtonPlaceX = containerWidth - dismissButtonWidth
         val actionButtonPlaceX = dismissButtonPlaceX - actionButtonWidth
@@ -360,34 +372,37 @@
             val contentHeight = max(actionButtonHeight, dismissButtonHeight)
             containerHeight = max(minContainerHeight, contentHeight)
             textPlaceY = (containerHeight - textPlaceable.height) / 2
-            actionButtonPlaceY = if (actionButtonPlaceable != null) {
-                actionButtonPlaceable[FirstBaseline].let {
-                    if (it != AlignmentLine.Unspecified) {
-                        textPlaceY + firstTextBaseline - it
-                    } else {
-                        0
+            actionButtonPlaceY =
+                if (actionButtonPlaceable != null) {
+                    actionButtonPlaceable[FirstBaseline].let {
+                        if (it != AlignmentLine.Unspecified) {
+                            textPlaceY + firstTextBaseline - it
+                        } else {
+                            0
+                        }
                     }
+                } else {
+                    0
                 }
-            } else {
-                0
-            }
         } else {
             val baselineOffset = HeightToFirstLine.roundToPx()
             textPlaceY = baselineOffset - firstTextBaseline
             val minContainerHeight = SnackbarTokens.TwoLinesContainerHeight.roundToPx()
             val contentHeight = textPlaceY + textPlaceable.height
             containerHeight = max(minContainerHeight, contentHeight)
-            actionButtonPlaceY = if (actionButtonPlaceable != null) {
-                (containerHeight - actionButtonPlaceable.height) / 2
+            actionButtonPlaceY =
+                if (actionButtonPlaceable != null) {
+                    (containerHeight - actionButtonPlaceable.height) / 2
+                } else {
+                    0
+                }
+        }
+        val dismissButtonPlaceY =
+            if (dismissButtonPlaceable != null) {
+                (containerHeight - dismissButtonPlaceable.height) / 2
             } else {
                 0
             }
-        }
-        val dismissButtonPlaceY = if (dismissButtonPlaceable != null) {
-            (containerHeight - dismissButtonPlaceable.height) / 2
-        } else {
-            0
-        }
 
         layout(containerWidth, containerHeight) {
             textPlaceable.placeRelative(0, textPlaceY)
@@ -397,27 +412,31 @@
     }
 }
 
-/**
- * Contains the default values used for [Snackbar].
- */
+/** Contains the default values used for [Snackbar]. */
 object SnackbarDefaults {
     /** Default shape of a snackbar. */
-    val shape: Shape @Composable get() = SnackbarTokens.ContainerShape.value
+    val shape: Shape
+        @Composable get() = SnackbarTokens.ContainerShape.value
 
     /** Default color of a snackbar. */
-    val color: Color @Composable get() = SnackbarTokens.ContainerColor.value
+    val color: Color
+        @Composable get() = SnackbarTokens.ContainerColor.value
 
     /** Default content color of a snackbar. */
-    val contentColor: Color @Composable get() = SnackbarTokens.SupportingTextColor.value
+    val contentColor: Color
+        @Composable get() = SnackbarTokens.SupportingTextColor.value
 
     /** Default action color of a snackbar. */
-    val actionColor: Color @Composable get() = SnackbarTokens.ActionLabelTextColor.value
+    val actionColor: Color
+        @Composable get() = SnackbarTokens.ActionLabelTextColor.value
 
     /** Default action content color of a snackbar. */
-    val actionContentColor: Color @Composable get() = SnackbarTokens.ActionLabelTextColor.value
+    val actionContentColor: Color
+        @Composable get() = SnackbarTokens.ActionLabelTextColor.value
 
     /** Default dismiss action content color of a snackbar. */
-    val dismissActionContentColor: Color @Composable get() = SnackbarTokens.IconColor.value
+    val dismissActionContentColor: Color
+        @Composable get() = SnackbarTokens.IconColor.value
 }
 
 private val ContainerMaxWidth = 600.dp
diff --git a/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/SnackbarHost.kt b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/SnackbarHost.kt
index dfd2279..6d75627 100644
--- a/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/SnackbarHost.kt
+++ b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/SnackbarHost.kt
@@ -67,9 +67,7 @@
      */
     private val mutex = Mutex()
 
-    /**
-     * The current [SnackbarData] being shown by the [SnackbarHost], or `null` if none.
-     */
+    /** The current [SnackbarData] being shown by the [SnackbarHost], or `null` if none. */
     var currentSnackbarData by mutableStateOf<SnackbarData?>(null)
         private set
 
@@ -91,13 +89,12 @@
      * @param message text to be shown in the Snackbar
      * @param actionLabel optional action label to show as button in the Snackbar
      * @param withDismissAction a boolean to show a dismiss action in the Snackbar. This is
-     * recommended to be set to true for better accessibility when a Snackbar is set with a
-     * [SnackbarDuration.Indefinite]
+     *   recommended to be set to true for better accessibility when a Snackbar is set with a
+     *   [SnackbarDuration.Indefinite]
      * @param duration duration to control how long snackbar will be shown in [SnackbarHost], either
-     * [SnackbarDuration.Short], [SnackbarDuration.Long] or [SnackbarDuration.Indefinite].
-     *
+     *   [SnackbarDuration.Short], [SnackbarDuration.Long] or [SnackbarDuration.Indefinite].
      * @return [SnackbarResult.ActionPerformed] if option action has been clicked or
-     * [SnackbarResult.Dismissed] if snackbar has been dismissed via timeout or by the user
+     *   [SnackbarResult.Dismissed] if snackbar has been dismissed via timeout or by the user
      */
     suspend fun showSnackbar(
         message: String,
@@ -122,19 +119,19 @@
      * @sample androidx.compose.material3.samples.ScaffoldWithCustomSnackbar
      *
      * @param visuals [SnackbarVisuals] that are used to create a Snackbar
-     *
      * @return [SnackbarResult.ActionPerformed] if option action has been clicked or
-     * [SnackbarResult.Dismissed] if snackbar has been dismissed via timeout or by the user
+     *   [SnackbarResult.Dismissed] if snackbar has been dismissed via timeout or by the user
      */
-    suspend fun showSnackbar(visuals: SnackbarVisuals): SnackbarResult = mutex.withLock {
-        try {
-            return suspendCancellableCoroutine { continuation ->
-                currentSnackbarData = SnackbarDataImpl(visuals, continuation)
+    suspend fun showSnackbar(visuals: SnackbarVisuals): SnackbarResult =
+        mutex.withLock {
+            try {
+                return suspendCancellableCoroutine { continuation ->
+                    currentSnackbarData = SnackbarDataImpl(visuals, continuation)
+                }
+            } finally {
+                currentSnackbarData = null
             }
-        } finally {
-            currentSnackbarData = null
         }
-    }
 
     private class SnackbarVisualsImpl(
         override val message: String,
@@ -199,8 +196,8 @@
 }
 
 /**
- * Host for [Snackbar]s to be used in [Scaffold] to properly show, hide and dismiss items based
- * on Material specification and the [hostState].
+ * Host for [Snackbar]s to be used in [Scaffold] to properly show, hide and dismiss items based on
+ * Material specification and the [hostState].
  *
  * This component with default parameters comes build-in with [Scaffold], if you need to show a
  * default [Snackbar], use [SnackbarHostState.showSnackbar].
@@ -215,7 +212,7 @@
  * @param hostState state of this component to read and show [Snackbar]s accordingly
  * @param modifier the [Modifier] to be applied to this component
  * @param snackbar the instance of the [Snackbar] to be shown at the appropriate time with
- * appearance based on the [SnackbarData] provided as a param
+ *   appearance based on the [SnackbarData] provided as a param
  */
 @Composable
 fun SnackbarHost(
@@ -227,10 +224,11 @@
     val accessibilityManager = LocalAccessibilityManager.current
     LaunchedEffect(currentSnackbarData) {
         if (currentSnackbarData != null) {
-            val duration = currentSnackbarData.visuals.duration.toMillis(
-                currentSnackbarData.visuals.actionLabel != null,
-                accessibilityManager
-            )
+            val duration =
+                currentSnackbarData.visuals.duration.toMillis(
+                    currentSnackbarData.visuals.actionLabel != null,
+                    accessibilityManager
+                )
             delay(duration)
             currentSnackbarData.dismiss()
         }
@@ -248,8 +246,8 @@
  * @property message text to be shown in the Snackbar
  * @property actionLabel optional action label to show as button in the Snackbar
  * @property withDismissAction a boolean to show a dismiss action in the Snackbar. This is
- * recommended to be set to true better accessibility when a Snackbar is set with a
- * [SnackbarDuration.Indefinite]
+ *   recommended to be set to true better accessibility when a Snackbar is set with a
+ *   [SnackbarDuration.Indefinite]
  * @property duration duration of the Snackbar
  */
 @Stable
@@ -270,49 +268,31 @@
 interface SnackbarData {
     val visuals: SnackbarVisuals
 
-    /**
-     * Function to be called when Snackbar action has been performed to notify the listeners.
-     */
+    /** Function to be called when Snackbar action has been performed to notify the listeners. */
     fun performAction()
 
-    /**
-     * Function to be called when Snackbar is dismissed either by timeout or by the user.
-     */
+    /** Function to be called when Snackbar is dismissed either by timeout or by the user. */
     fun dismiss()
 }
 
-/**
- * Possible results of the [SnackbarHostState.showSnackbar] call
- */
+/** Possible results of the [SnackbarHostState.showSnackbar] call */
 enum class SnackbarResult {
-    /**
-     * [Snackbar] that is shown has been dismissed either by timeout of by user
-     */
+    /** [Snackbar] that is shown has been dismissed either by timeout of by user */
     Dismissed,
 
-    /**
-     * Action on the [Snackbar] has been clicked before the time out passed
-     */
+    /** Action on the [Snackbar] has been clicked before the time out passed */
     ActionPerformed,
 }
 
-/**
- * Possible durations of the [Snackbar] in [SnackbarHost]
- */
+/** Possible durations of the [Snackbar] in [SnackbarHost] */
 enum class SnackbarDuration {
-    /**
-     * Show the Snackbar for a short period of time
-     */
+    /** Show the Snackbar for a short period of time */
     Short,
 
-    /**
-     * Show the Snackbar for a long period of time
-     */
+    /** Show the Snackbar for a long period of time */
     Long,
 
-    /**
-     * Show the Snackbar indefinitely until explicitly dismissed or action is clicked
-     */
+    /** Show the Snackbar indefinitely until explicitly dismissed or action is clicked */
     Indefinite
 }
 
@@ -321,11 +301,12 @@
     hasAction: Boolean,
     accessibilityManager: AccessibilityManager?
 ): Long {
-    val original = when (this) {
-        SnackbarDuration.Indefinite -> Long.MAX_VALUE
-        SnackbarDuration.Long -> 10000L
-        SnackbarDuration.Short -> 4000L
-    }
+    val original =
+        when (this) {
+            SnackbarDuration.Indefinite -> Long.MAX_VALUE
+            SnackbarDuration.Long -> 10000L
+            SnackbarDuration.Short -> 4000L
+        }
     if (accessibilityManager == null) {
         return original
     }
@@ -358,44 +339,51 @@
                 val isVisible = key == current
                 val duration = if (isVisible) SnackbarFadeInMillis else SnackbarFadeOutMillis
                 val delay = SnackbarFadeOutMillis + SnackbarInBetweenDelayMillis
-                val animationDelay = if (isVisible && keys.fastFilterNotNull().size != 1) {
-                    delay
-                } else {
-                    0
-                }
-                val opacity = animatedOpacity(
-                    animation = tween(
-                        easing = LinearEasing,
-                        delayMillis = animationDelay,
-                        durationMillis = duration
-                    ),
-                    visible = isVisible,
-                    onAnimationFinish = {
-                        if (key != state.current) {
-                            // leave only the current in the list
-                            state.items.removeAll { it.key == key }
-                            state.scope?.invalidate()
-                        }
+                val animationDelay =
+                    if (isVisible && keys.fastFilterNotNull().size != 1) {
+                        delay
+                    } else {
+                        0
                     }
-                )
-                val scale = animatedScale(
-                    animation = tween(
-                        easing = FastOutSlowInEasing,
-                        delayMillis = animationDelay,
-                        durationMillis = duration
-                    ),
-                    visible = isVisible
-                )
+                val opacity =
+                    animatedOpacity(
+                        animation =
+                            tween(
+                                easing = LinearEasing,
+                                delayMillis = animationDelay,
+                                durationMillis = duration
+                            ),
+                        visible = isVisible,
+                        onAnimationFinish = {
+                            if (key != state.current) {
+                                // leave only the current in the list
+                                state.items.removeAll { it.key == key }
+                                state.scope?.invalidate()
+                            }
+                        }
+                    )
+                val scale =
+                    animatedScale(
+                        animation =
+                            tween(
+                                easing = FastOutSlowInEasing,
+                                delayMillis = animationDelay,
+                                durationMillis = duration
+                            ),
+                        visible = isVisible
+                    )
                 Box(
-                    Modifier
-                        .graphicsLayer(
+                    Modifier.graphicsLayer(
                             scaleX = scale.value,
                             scaleY = scale.value,
                             alpha = opacity.value
                         )
                         .semantics {
                             liveRegion = LiveRegionMode.Polite
-                            dismiss { key.dismiss(); true }
+                            dismiss {
+                                key.dismiss()
+                                true
+                            }
                         }
                 ) {
                     children()
@@ -405,13 +393,7 @@
     }
     Box(modifier) {
         state.scope = currentRecomposeScope
-        state.items.fastForEach { (item, opacity) ->
-            key(item) {
-                opacity {
-                    content(item!!)
-                }
-            }
-        }
+        state.items.fastForEach { (item, opacity) -> key(item) { opacity { content(item!!) } } }
     }
 }
 
@@ -437,10 +419,7 @@
 ): State<Float> {
     val alpha = remember { Animatable(if (!visible) 1f else 0f) }
     LaunchedEffect(visible) {
-        alpha.animateTo(
-            if (visible) 1f else 0f,
-            animationSpec = animation
-        )
+        alpha.animateTo(if (visible) 1f else 0f, animationSpec = animation)
         onAnimationFinish()
     }
     return alpha.asState()
@@ -450,10 +429,7 @@
 private fun animatedScale(animation: AnimationSpec<Float>, visible: Boolean): State<Float> {
     val scale = remember { Animatable(if (!visible) 1f else 0.8f) }
     LaunchedEffect(visible) {
-        scale.animateTo(
-            if (visible) 1f else 0.8f,
-            animationSpec = animation
-        )
+        scale.animateTo(if (visible) 1f else 0.8f, animationSpec = animation)
     }
     return scale.asState()
 }
diff --git a/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/Surface.kt b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/Surface.kt
index 4bc72d8..9e3addf 100644
--- a/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/Surface.kt
+++ b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/Surface.kt
@@ -22,7 +22,6 @@
 import androidx.compose.foundation.clickable
 import androidx.compose.foundation.interaction.Interaction
 import androidx.compose.foundation.interaction.MutableInteractionSource
-import androidx.compose.foundation.interaction.PressInteraction
 import androidx.compose.foundation.layout.Box
 import androidx.compose.foundation.selection.selectable
 import androidx.compose.foundation.selection.toggleable
@@ -39,7 +38,6 @@
 import androidx.compose.ui.graphics.graphicsLayer
 import androidx.compose.ui.input.pointer.pointerInput
 import androidx.compose.ui.platform.LocalDensity
-import androidx.compose.ui.semantics.Role
 import androidx.compose.ui.semantics.isContainer
 import androidx.compose.ui.semantics.semantics
 import androidx.compose.ui.unit.Dp
@@ -54,19 +52,15 @@
  * See the other overloads for clickable, selectable, and toggleable surfaces.
  *
  * The Surface is responsible for:
- *
  * 1) Clipping: Surface clips its children to the shape specified by [shape]
- *
  * 2) Borders: If [shape] has a border, then it will also be drawn.
- *
  * 3) Background: Surface fills the shape specified by [shape] with the [color]. If [color] is
- * [ColorScheme.surface] a color overlay will be applied. The color of the overlay depends on the
- * [tonalElevation] of this Surface, and the [LocalAbsoluteTonalElevation] set by any parent
- * surfaces. This ensures that a Surface never appears to have a lower elevation overlay than its
- * ancestors, by summing the elevation of all previous Surfaces.
- *
+ *    [ColorScheme.surface] a color overlay will be applied. The color of the overlay depends on the
+ *    [tonalElevation] of this Surface, and the [LocalAbsoluteTonalElevation] set by any parent
+ *    surfaces. This ensures that a Surface never appears to have a lower elevation overlay than its
+ *    ancestors, by summing the elevation of all previous Surfaces.
  * 4) Content color: Surface uses [contentColor] to specify a preferred color for the content of
- * this surface - this is used by the [Text] and [Icon] components as a default color.
+ *    this surface - this is used by the [Text] and [Icon] components as a default color.
  *
  * If no [contentColor] is set, this surface will try and match its background color to a color
  * defined in the theme [ColorScheme], and return the corresponding content color. For example, if
@@ -75,24 +69,24 @@
  * the same value set above this Surface.
  *
  * To manually retrieve the content color inside a surface, use [LocalContentColor].
- *
  * 5) Blocking touch propagation behind the surface.
  *
  * Surface sample:
+ *
  * @sample androidx.compose.material3.samples.SurfaceSample
  *
  * @param modifier Modifier to be applied to the layout corresponding to the surface
  * @param shape Defines the surface's shape as well its shadow.
  * @param color The background color. Use [Color.Transparent] to have no color.
  * @param contentColor The preferred content color provided by this Surface to its children.
- * Defaults to either the matching content color for [color], or if [color] is not a color from the
- * theme, this will keep the same value set above this Surface.
+ *   Defaults to either the matching content color for [color], or if [color] is not a color from
+ *   the theme, this will keep the same value set above this Surface.
  * @param tonalElevation When [color] is [ColorScheme.surface], a higher the elevation will result
- * in a darker color in light theme and lighter color in dark theme.
+ *   in a darker color in light theme and lighter color in dark theme.
  * @param shadowElevation The size of the shadow below the surface. To prevent shadow creep, only
- * apply shadow elevation when absolutely necessary, such as when the surface requires visual
- * separation from a patterned background. Note that It will not affect z index of the Surface.
- * If you want to change the drawing order you can use `Modifier.zIndex`.
+ *   apply shadow elevation when absolutely necessary, such as when the surface requires visual
+ *   separation from a patterned background. Note that It will not affect z index of the Surface. If
+ *   you want to change the drawing order you can use `Modifier.zIndex`.
  * @param border Optional border to draw on top of the surface
  */
 @Composable
@@ -113,21 +107,20 @@
         LocalAbsoluteTonalElevation provides absoluteElevation
     ) {
         Box(
-            modifier = modifier
-                .surface(
-                    shape = shape,
-                    backgroundColor = surfaceColorAtElevation(
-                        color = color,
-                        elevation = absoluteElevation
-                    ),
-                    border = border,
-                    shadowElevation = with(LocalDensity.current) { shadowElevation.toPx() }
-                )
-                .semantics(mergeDescendants = false) {
-                    @Suppress("DEPRECATION")
-                    isContainer = true
-                }
-                .pointerInput(Unit) {},
+            modifier =
+                modifier
+                    .surface(
+                        shape = shape,
+                        backgroundColor =
+                            surfaceColorAtElevation(color = color, elevation = absoluteElevation),
+                        border = border,
+                        shadowElevation = with(LocalDensity.current) { shadowElevation.toPx() }
+                    )
+                    .semantics(mergeDescendants = false) {
+                        @Suppress("DEPRECATION")
+                        isContainer = true
+                    }
+                    .pointerInput(Unit) {},
             propagateMinConstraints = true
         ) {
             content()
@@ -144,59 +137,55 @@
  * regular Surface does:
  *
  * This clickable Surface is responsible for:
- *
  * 1) Clipping: Surface clips its children to the shape specified by [shape]
- *
  * 2) Borders: If [shape] has a border, then it will also be drawn.
- *
  * 3) Background: Surface fills the shape specified by [shape] with the [color]. If [color] is
- * [ColorScheme.surface] a color overlay may be applied. The color of the overlay depends on the
- * [tonalElevation] of this Surface, and the [LocalAbsoluteTonalElevation] set by any
- * parent surfaces. This ensures that a Surface never appears to have a lower elevation overlay than
- * its ancestors, by summing the elevation of all previous Surfaces.
- *
+ *    [ColorScheme.surface] a color overlay may be applied. The color of the overlay depends on the
+ *    [tonalElevation] of this Surface, and the [LocalAbsoluteTonalElevation] set by any parent
+ *    surfaces. This ensures that a Surface never appears to have a lower elevation overlay than its
+ *    ancestors, by summing the elevation of all previous Surfaces.
  * 4) Content color: Surface uses [contentColor] to specify a preferred color for the content of
- * this surface - this is used by the [Text] and [Icon] components as a default color. If no
- * [contentColor] is set, this surface will try and match its background color to a color defined in
- * the theme [ColorScheme], and return the corresponding content color. For example, if the [color]
- * of this surface is [ColorScheme.surface], [contentColor] will be set to [ColorScheme.onSurface].
- * If [color] is not part of the theme palette, [contentColor] will keep the same value set above
- * this Surface.
- *
+ *    this surface - this is used by the [Text] and [Icon] components as a default color. If no
+ *    [contentColor] is set, this surface will try and match its background color to a color defined
+ *    in the theme [ColorScheme], and return the corresponding content color. For example, if the
+ *    [color] of this surface is [ColorScheme.surface], [contentColor] will be set to
+ *    [ColorScheme.onSurface]. If [color] is not part of the theme palette, [contentColor] will keep
+ *    the same value set above this Surface.
  * 5) Click handling. This version of surface will react to the clicks, calling [onClick] lambda,
- * updating the [interactionSource] when [PressInteraction] occurs, and showing ripple indication in
- * response to press events. If you don't need click handling, consider using the Surface function
- * that doesn't require [onClick] param. If you need to set a custom label for the [onClick], apply
- * a `Modifier.semantics { onClick(label = "YOUR_LABEL", action = null) }` to the Surface.
- *
+ *    updating the [interactionSource] when [PressInteraction] occurs, and showing ripple indication
+ *    in response to press events. If you don't need click handling, consider using the Surface
+ *    function that doesn't require [onClick] param. If you need to set a custom label for the
+ *    [onClick], apply a `Modifier.semantics { onClick(label = "YOUR_LABEL", action = null) }` to
+ *    the Surface.
  * 6) Semantics for clicks. Just like with [Modifier.clickable], clickable version of Surface will
- * produce semantics to indicate that it is clicked. No semantic role is set by default, you
- * may specify one by passing a desired [Role] with a [Modifier.semantics].
+ *    produce semantics to indicate that it is clicked. No semantic role is set by default, you may
+ *    specify one by passing a desired [Role] with a [Modifier.semantics].
  *
  * To manually retrieve the content color inside a surface, use [LocalContentColor].
  *
  * Clickable surface sample:
+ *
  * @sample androidx.compose.material3.samples.ClickableSurfaceSample
  *
  * @param onClick callback to be called when the surface is clicked
  * @param modifier Modifier to be applied to the layout corresponding to the surface
  * @param enabled Controls the enabled state of the surface. When `false`, this surface will not be
- * clickable
+ *   clickable
  * @param shape Defines the surface's shape as well its shadow. A shadow is only displayed if the
- * [tonalElevation] is greater than zero.
+ *   [tonalElevation] is greater than zero.
  * @param color The background color. Use [Color.Transparent] to have no color.
  * @param contentColor The preferred content color provided by this Surface to its children.
- * Defaults to either the matching content color for [color], or if [color] is not a color from the
- * theme, this will keep the same value set above this Surface.
+ *   Defaults to either the matching content color for [color], or if [color] is not a color from
+ *   the theme, this will keep the same value set above this Surface.
  * @param border Optional border to draw on top of the surface
  * @param tonalElevation When [color] is [ColorScheme.surface], a higher the elevation will result
- * in a darker color in light theme and lighter color in dark theme.
+ *   in a darker color in light theme and lighter color in dark theme.
  * @param shadowElevation The size of the shadow below the surface. Note that It will not affect z
- * index of the Surface. If you want to change the drawing order you can use `Modifier.zIndex`.
+ *   index of the Surface. If you want to change the drawing order you can use `Modifier.zIndex`.
  * @param interactionSource an optional hoisted [MutableInteractionSource] for observing and
- * emitting [Interaction]s for this surface. You can use this to change the surface's
- * appearance or preview the surface in different states. Note that if `null` is provided,
- * interactions will still happen internally.
+ *   emitting [Interaction]s for this surface. You can use this to change the surface's appearance
+ *   or preview the surface in different states. Note that if `null` is provided, interactions will
+ *   still happen internally.
  */
 @Composable
 @NonRestartableComposable
@@ -219,23 +208,22 @@
         LocalAbsoluteTonalElevation provides absoluteElevation
     ) {
         Box(
-            modifier = modifier
-                .minimumInteractiveComponentSize()
-                .surface(
-                    shape = shape,
-                    backgroundColor = surfaceColorAtElevation(
-                        color = color,
-                        elevation = absoluteElevation
+            modifier =
+                modifier
+                    .minimumInteractiveComponentSize()
+                    .surface(
+                        shape = shape,
+                        backgroundColor =
+                            surfaceColorAtElevation(color = color, elevation = absoluteElevation),
+                        border = border,
+                        shadowElevation = with(LocalDensity.current) { shadowElevation.toPx() }
+                    )
+                    .clickable(
+                        interactionSource = interactionSource,
+                        indication = rippleOrFallbackImplementation(),
+                        enabled = enabled,
+                        onClick = onClick
                     ),
-                    border = border,
-                    shadowElevation = with(LocalDensity.current) { shadowElevation.toPx() }
-                )
-                .clickable(
-                    interactionSource = interactionSource,
-                    indication = rippleOrFallbackImplementation(),
-                    enabled = enabled,
-                    onClick = onClick
-                ),
             propagateMinConstraints = true
         ) {
             content()
@@ -248,63 +236,58 @@
  * elevation, which influences how that piece of surface visually relates to other surfaces and how
  * that surface is modified by tonal variance.
  *
- * This version of Surface is responsible for a selection handling as well as everything else that
- * a regular Surface does:
+ * This version of Surface is responsible for a selection handling as well as everything else that a
+ * regular Surface does:
  *
  * This selectable Surface is responsible for:
- *
  * 1) Clipping: Surface clips its children to the shape specified by [shape]
- *
  * 2) Borders: If [shape] has a border, then it will also be drawn.
- *
  * 3) Background: Surface fills the shape specified by [shape] with the [color]. If [color] is
- * [ColorScheme.surface] a color overlay may be applied. The color of the overlay depends on the
- * [tonalElevation] of this Surface, and the [LocalAbsoluteTonalElevation] set by any
- * parent surfaces. This ensures that a Surface never appears to have a lower elevation overlay than
- * its ancestors, by summing the elevation of all previous Surfaces.
- *
+ *    [ColorScheme.surface] a color overlay may be applied. The color of the overlay depends on the
+ *    [tonalElevation] of this Surface, and the [LocalAbsoluteTonalElevation] set by any parent
+ *    surfaces. This ensures that a Surface never appears to have a lower elevation overlay than its
+ *    ancestors, by summing the elevation of all previous Surfaces.
  * 4) Content color: Surface uses [contentColor] to specify a preferred color for the content of
- * this surface - this is used by the [Text] and [Icon] components as a default color. If no
- * [contentColor] is set, this surface will try and match its background color to a color defined in
- * the theme [ColorScheme], and return the corresponding content color. For example, if the [color]
- * of this surface is [ColorScheme.surface], [contentColor] will be set to [ColorScheme.onSurface].
- * If [color] is not part of the theme palette, [contentColor] will keep the same value set above
- * this Surface.
- *
+ *    this surface - this is used by the [Text] and [Icon] components as a default color. If no
+ *    [contentColor] is set, this surface will try and match its background color to a color defined
+ *    in the theme [ColorScheme], and return the corresponding content color. For example, if the
+ *    [color] of this surface is [ColorScheme.surface], [contentColor] will be set to
+ *    [ColorScheme.onSurface]. If [color] is not part of the theme palette, [contentColor] will keep
+ *    the same value set above this Surface.
  * 5) Click handling. This version of surface will react to the clicks, calling [onClick] lambda,
- * updating the [interactionSource] when [PressInteraction] occurs, and showing ripple indication in
- * response to press events. If you don't need click handling, consider using the Surface function
- * that doesn't require [onClick] param.
- *
+ *    updating the [interactionSource] when [PressInteraction] occurs, and showing ripple indication
+ *    in response to press events. If you don't need click handling, consider using the Surface
+ *    function that doesn't require [onClick] param.
  * 6) Semantics for selection. Just like with [Modifier.selectable], selectable version of Surface
- * will produce semantics to indicate that it is selected. No semantic role is set by default, you
- * may specify one by passing a desired [Role] with a [Modifier.semantics].
+ *    will produce semantics to indicate that it is selected. No semantic role is set by default,
+ *    you may specify one by passing a desired [Role] with a [Modifier.semantics].
  *
  * To manually retrieve the content color inside a surface, use [LocalContentColor].
  *
  * Selectable surface sample:
+ *
  * @sample androidx.compose.material3.samples.SelectableSurfaceSample
  *
  * @param selected whether or not this Surface is selected
  * @param onClick callback to be called when the surface is clicked
  * @param modifier Modifier to be applied to the layout corresponding to the surface
  * @param enabled Controls the enabled state of the surface. When `false`, this surface will not be
- * clickable
+ *   clickable
  * @param shape Defines the surface's shape as well its shadow. A shadow is only displayed if the
- * [tonalElevation] is greater than zero.
+ *   [tonalElevation] is greater than zero.
  * @param color The background color. Use [Color.Transparent] to have no color.
  * @param contentColor The preferred content color provided by this Surface to its children.
- * Defaults to either the matching content color for [color], or if [color] is not a color from the
- * theme, this will keep the same value set above this Surface.
+ *   Defaults to either the matching content color for [color], or if [color] is not a color from
+ *   the theme, this will keep the same value set above this Surface.
  * @param border Optional border to draw on top of the surface
  * @param tonalElevation When [color] is [ColorScheme.surface], a higher the elevation will result
- * in a darker color in light theme and lighter color in dark theme.
+ *   in a darker color in light theme and lighter color in dark theme.
  * @param shadowElevation The size of the shadow below the surface. Note that It will not affect z
- * index of the Surface. If you want to change the drawing order you can use `Modifier.zIndex`.
+ *   index of the Surface. If you want to change the drawing order you can use `Modifier.zIndex`.
  * @param interactionSource an optional hoisted [MutableInteractionSource] for observing and
- * emitting [Interaction]s for this surface. You can use this to change the surface's
- * appearance or preview the surface in different states. Note that if `null` is provided,
- * interactions will still happen internally.
+ *   emitting [Interaction]s for this surface. You can use this to change the surface's appearance
+ *   or preview the surface in different states. Note that if `null` is provided, interactions will
+ *   still happen internally.
  */
 @Composable
 @NonRestartableComposable
@@ -328,24 +311,23 @@
         LocalAbsoluteTonalElevation provides absoluteElevation
     ) {
         Box(
-            modifier = modifier
-                .minimumInteractiveComponentSize()
-                .surface(
-                    shape = shape,
-                    backgroundColor = surfaceColorAtElevation(
-                        color = color,
-                        elevation = absoluteElevation
+            modifier =
+                modifier
+                    .minimumInteractiveComponentSize()
+                    .surface(
+                        shape = shape,
+                        backgroundColor =
+                            surfaceColorAtElevation(color = color, elevation = absoluteElevation),
+                        border = border,
+                        shadowElevation = with(LocalDensity.current) { shadowElevation.toPx() }
+                    )
+                    .selectable(
+                        selected = selected,
+                        interactionSource = interactionSource,
+                        indication = rippleOrFallbackImplementation(),
+                        enabled = enabled,
+                        onClick = onClick
                     ),
-                    border = border,
-                    shadowElevation = with(LocalDensity.current) { shadowElevation.toPx() }
-                )
-                .selectable(
-                    selected = selected,
-                    interactionSource = interactionSource,
-                    indication = rippleOrFallbackImplementation(),
-                    enabled = enabled,
-                    onClick = onClick
-                ),
             propagateMinConstraints = true
         ) {
             content()
@@ -362,59 +344,54 @@
  * else that a regular Surface does:
  *
  * This toggleable Surface is responsible for:
- *
  * 1) Clipping: Surface clips its children to the shape specified by [shape]
- *
  * 2) Borders: If [shape] has a border, then it will also be drawn.
- *
  * 3) Background: Surface fills the shape specified by [shape] with the [color]. If [color] is
- * [ColorScheme.surface] a color overlay may be applied. The color of the overlay depends on the
- * [tonalElevation] of this Surface, and the [LocalAbsoluteTonalElevation] set by any
- * parent surfaces. This ensures that a Surface never appears to have a lower elevation overlay than
- * its ancestors, by summing the elevation of all previous Surfaces.
- *
+ *    [ColorScheme.surface] a color overlay may be applied. The color of the overlay depends on the
+ *    [tonalElevation] of this Surface, and the [LocalAbsoluteTonalElevation] set by any parent
+ *    surfaces. This ensures that a Surface never appears to have a lower elevation overlay than its
+ *    ancestors, by summing the elevation of all previous Surfaces.
  * 4) Content color: Surface uses [contentColor] to specify a preferred color for the content of
- * this surface - this is used by the [Text] and [Icon] components as a default color. If no
- * [contentColor] is set, this surface will try and match its background color to a color defined in
- * the theme [ColorScheme], and return the corresponding content color. For example, if the [color]
- * of this surface is [ColorScheme.surface], [contentColor] will be set to [ColorScheme.onSurface].
- * If [color] is not part of the theme palette, [contentColor] will keep the same value set above
- * this Surface.
- *
+ *    this surface - this is used by the [Text] and [Icon] components as a default color. If no
+ *    [contentColor] is set, this surface will try and match its background color to a color defined
+ *    in the theme [ColorScheme], and return the corresponding content color. For example, if the
+ *    [color] of this surface is [ColorScheme.surface], [contentColor] will be set to
+ *    [ColorScheme.onSurface]. If [color] is not part of the theme palette, [contentColor] will keep
+ *    the same value set above this Surface.
  * 5) Click handling. This version of surface will react to the check toggles, calling
- * [onCheckedChange] lambda, updating the [interactionSource] when [PressInteraction] occurs, and
- * showing ripple indication in response to press events. If you don't need check
- * handling, consider using a Surface function that doesn't require [onCheckedChange] param.
- *
- * 6) Semantics for toggle. Just like with [Modifier.toggleable], toggleable version of Surface
- * will produce semantics to indicate that it is checked.  No semantic role is set by default, you
- * may specify one by passing a desired [Role] with a [Modifier.semantics].
+ *    [onCheckedChange] lambda, updating the [interactionSource] when [PressInteraction] occurs, and
+ *    showing ripple indication in response to press events. If you don't need check handling,
+ *    consider using a Surface function that doesn't require [onCheckedChange] param.
+ * 6) Semantics for toggle. Just like with [Modifier.toggleable], toggleable version of Surface will
+ *    produce semantics to indicate that it is checked. No semantic role is set by default, you may
+ *    specify one by passing a desired [Role] with a [Modifier.semantics].
  *
  * To manually retrieve the content color inside a surface, use [LocalContentColor].
  *
  * Toggleable surface sample:
+ *
  * @sample androidx.compose.material3.samples.ToggleableSurfaceSample
  *
  * @param checked whether or not this Surface is toggled on or off
  * @param onCheckedChange callback to be invoked when the toggleable Surface is clicked
  * @param modifier Modifier to be applied to the layout corresponding to the surface
  * @param enabled Controls the enabled state of the surface. When `false`, this surface will not be
- * clickable
+ *   clickable
  * @param shape Defines the surface's shape as well its shadow. A shadow is only displayed if the
- * [tonalElevation] is greater than zero.
+ *   [tonalElevation] is greater than zero.
  * @param color The background color. Use [Color.Transparent] to have no color.
  * @param contentColor The preferred content color provided by this Surface to its children.
- * Defaults to either the matching content color for [color], or if [color] is not a color from the
- * theme, this will keep the same value set above this Surface.
+ *   Defaults to either the matching content color for [color], or if [color] is not a color from
+ *   the theme, this will keep the same value set above this Surface.
  * @param border Optional border to draw on top of the surface
  * @param tonalElevation When [color] is [ColorScheme.surface], a higher the elevation will result
- * in a darker color in light theme and lighter color in dark theme.
+ *   in a darker color in light theme and lighter color in dark theme.
  * @param shadowElevation The size of the shadow below the surface. Note that It will not affect z
- * index of the Surface. If you want to change the drawing order you can use `Modifier.zIndex`.
+ *   index of the Surface. If you want to change the drawing order you can use `Modifier.zIndex`.
  * @param interactionSource an optional hoisted [MutableInteractionSource] for observing and
- * emitting [Interaction]s for this surface. You can use this to change the surface's
- * appearance or preview the surface in different states. Note that if `null` is provided,
- * interactions will still happen internally.
+ *   emitting [Interaction]s for this surface. You can use this to change the surface's appearance
+ *   or preview the surface in different states. Note that if `null` is provided, interactions will
+ *   still happen internally.
  */
 @Composable
 @NonRestartableComposable
@@ -438,24 +415,23 @@
         LocalAbsoluteTonalElevation provides absoluteElevation
     ) {
         Box(
-            modifier = modifier
-                .minimumInteractiveComponentSize()
-                .surface(
-                    shape = shape,
-                    backgroundColor = surfaceColorAtElevation(
-                        color = color,
-                        elevation = absoluteElevation
+            modifier =
+                modifier
+                    .minimumInteractiveComponentSize()
+                    .surface(
+                        shape = shape,
+                        backgroundColor =
+                            surfaceColorAtElevation(color = color, elevation = absoluteElevation),
+                        border = border,
+                        shadowElevation = with(LocalDensity.current) { shadowElevation.toPx() }
+                    )
+                    .toggleable(
+                        value = checked,
+                        interactionSource = interactionSource,
+                        indication = rippleOrFallbackImplementation(),
+                        enabled = enabled,
+                        onValueChange = onCheckedChange
                     ),
-                    border = border,
-                    shadowElevation = with(LocalDensity.current) { shadowElevation.toPx() }
-                )
-                .toggleable(
-                    value = checked,
-                    interactionSource = interactionSource,
-                    indication = rippleOrFallbackImplementation(),
-                    enabled = enabled,
-                    onValueChange = onCheckedChange
-                ),
             propagateMinConstraints = true
         ) {
             content()
@@ -469,17 +445,21 @@
     backgroundColor: Color,
     border: BorderStroke?,
     shadowElevation: Float,
-) = this
-    .then(
-        if (shadowElevation > 0f) {
-            Modifier.graphicsLayer(shadowElevation = shadowElevation, shape = shape, clip = false)
-        } else {
-            Modifier
-        }
-    )
-    .then(if (border != null) Modifier.border(border, shape) else Modifier)
-    .background(color = backgroundColor, shape = shape)
-    .clip(shape)
+) =
+    this.then(
+            if (shadowElevation > 0f) {
+                Modifier.graphicsLayer(
+                    shadowElevation = shadowElevation,
+                    shape = shape,
+                    clip = false
+                )
+            } else {
+                Modifier
+            }
+        )
+        .then(if (border != null) Modifier.border(border, shape) else Modifier)
+        .background(color = backgroundColor, shape = shape)
+        .clip(shape)
 
 @Composable
 private fun surfaceColorAtElevation(color: Color, elevation: Dp): Color =
diff --git a/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/SwipeToDismissBox.kt b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/SwipeToDismissBox.kt
index 55795a0..95bbbee 100644
--- a/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/SwipeToDismissBox.kt
+++ b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/SwipeToDismissBox.kt
@@ -41,23 +41,15 @@
 import androidx.compose.ui.unit.dp
 import kotlinx.coroutines.CancellationException
 
-/**
- * The directions in which a [SwipeToDismissBox] can be dismissed.
- */
+/** The directions in which a [SwipeToDismissBox] can be dismissed. */
 enum class SwipeToDismissBoxValue {
-    /**
-     * Can be dismissed by swiping in the reading direction.
-     */
+    /** Can be dismissed by swiping in the reading direction. */
     StartToEnd,
 
-    /**
-     * Can be dismissed by swiping in the reverse of the reading direction.
-     */
+    /** Can be dismissed by swiping in the reverse of the reading direction. */
     EndToStart,
 
-    /**
-     * Cannot currently be dismissed.
-     */
+    /** Cannot currently be dismissed. */
     Settled
 }
 
@@ -68,9 +60,9 @@
  * @param density The density that this state can use to convert values to and from dp.
  * @param confirmValueChange Optional callback invoked to confirm or veto a pending state change.
  * @param positionalThreshold The positional threshold to be used when calculating the target state
- * while a swipe is in progress and when settling after the swipe ends. This is the distance from
- * the start of a transition. It will be, depending on the direction of the interaction, added or
- * subtracted from/to the origin offset. It should always be a positive value.
+ *   while a swipe is in progress and when settling after the swipe ends. This is the distance from
+ *   the start of a transition. It will be, depending on the direction of the interaction, added or
+ *   subtracted from/to the origin offset. It should always be a positive value.
  */
 class SwipeToDismissBoxState(
     initialValue: SwipeToDismissBoxValue,
@@ -78,15 +70,17 @@
     confirmValueChange: (SwipeToDismissBoxValue) -> Boolean = { true },
     positionalThreshold: (totalDistance: Float) -> Float
 ) {
-    internal val anchoredDraggableState = AnchoredDraggableState(
-        initialValue = initialValue,
-        animationSpec = AnchoredDraggableDefaults.AnimationSpec,
-        confirmValueChange = confirmValueChange,
-        positionalThreshold = positionalThreshold,
-        velocityThreshold = { with(density) { DismissVelocityThreshold.toPx() } }
-    )
+    internal val anchoredDraggableState =
+        AnchoredDraggableState(
+            initialValue = initialValue,
+            animationSpec = AnchoredDraggableDefaults.AnimationSpec,
+            confirmValueChange = confirmValueChange,
+            positionalThreshold = positionalThreshold,
+            velocityThreshold = { with(density) { DismissVelocityThreshold.toPx() } }
+        )
 
-    internal val offset: Float get() = anchoredDraggableState.offset
+    internal val offset: Float
+        get() = anchoredDraggableState.offset
 
     /**
      * Require the current offset.
@@ -95,36 +89,38 @@
      */
     fun requireOffset(): Float = anchoredDraggableState.requireOffset()
 
-    /**
-     * The current state value of the [SwipeToDismissBoxState].
-     */
-    val currentValue: SwipeToDismissBoxValue get() = anchoredDraggableState.currentValue
+    /** The current state value of the [SwipeToDismissBoxState]. */
+    val currentValue: SwipeToDismissBoxValue
+        get() = anchoredDraggableState.currentValue
 
     /**
      * The target state. This is the closest state to the current offset (taking into account
      * positional thresholds). If no interactions like animations or drags are in progress, this
      * will be the current state.
      */
-    val targetValue: SwipeToDismissBoxValue get() = anchoredDraggableState.targetValue
+    val targetValue: SwipeToDismissBoxValue
+        get() = anchoredDraggableState.targetValue
 
     /**
      * The fraction of the progress going from currentValue to targetValue, within [0f..1f] bounds.
      */
     @get:FloatRange(from = 0.0, to = 1.0)
-    val progress: Float get() = anchoredDraggableState.progress
+    val progress: Float
+        get() = anchoredDraggableState.progress
 
     /**
      * The direction (if any) in which the composable has been or is being dismissed.
      *
-     * Use this to change the background of the [SwipeToDismissBox] if you want different actions
-     * on each side.
+     * Use this to change the background of the [SwipeToDismissBox] if you want different actions on
+     * each side.
      */
     val dismissDirection: SwipeToDismissBoxValue
-        get() = when {
-            offset == 0f || offset.isNaN() -> SwipeToDismissBoxValue.Settled
-            offset > 0f -> SwipeToDismissBoxValue.StartToEnd
-            else -> SwipeToDismissBoxValue.EndToStart
-        }
+        get() =
+            when {
+                offset == 0f || offset.isNaN() -> SwipeToDismissBoxValue.Settled
+                offset > 0f -> SwipeToDismissBoxValue.StartToEnd
+                else -> SwipeToDismissBoxValue.EndToStart
+            }
 
     /**
      * Set the state without any animation and suspend until it's set
@@ -137,14 +133,13 @@
 
     /**
      * Reset the component to the default position with animation and suspend until it if fully
-     * reset or animation has been cancelled. This method will throw [CancellationException] if
-     * the animation is interrupted
+     * reset or animation has been cancelled. This method will throw [CancellationException] if the
+     * animation is interrupted
      *
      * @return the reason the reset animation ended
      */
-    suspend fun reset() = anchoredDraggableState.animateTo(
-        targetValue = SwipeToDismissBoxValue.Settled
-    )
+    suspend fun reset() =
+        anchoredDraggableState.animateTo(targetValue = SwipeToDismissBoxValue.Settled)
 
     /**
      * Dismiss the component in the given [direction], with an animation and suspend. This method
@@ -158,21 +153,18 @@
 
     companion object {
 
-        /**
-         * The default [Saver] implementation for [SwipeToDismissBoxState].
-         */
+        /** The default [Saver] implementation for [SwipeToDismissBoxState]. */
         fun Saver(
             confirmValueChange: (SwipeToDismissBoxValue) -> Boolean,
             positionalThreshold: (totalDistance: Float) -> Float,
             density: Density
-        ) = Saver<SwipeToDismissBoxState, SwipeToDismissBoxValue>(
-            save = { it.currentValue },
-            restore = {
-                SwipeToDismissBoxState(
-                    it, density, confirmValueChange, positionalThreshold
-                )
-            }
-        )
+        ) =
+            Saver<SwipeToDismissBoxState, SwipeToDismissBoxValue>(
+                save = { it.currentValue },
+                restore = {
+                    SwipeToDismissBoxState(it, density, confirmValueChange, positionalThreshold)
+                }
+            )
     }
 }
 
@@ -182,9 +174,9 @@
  * @param initialValue The initial value of the state.
  * @param confirmValueChange Optional callback invoked to confirm or veto a pending state change.
  * @param positionalThreshold The positional threshold to be used when calculating the target state
- * while a swipe is in progress and when settling after the swipe ends. This is the distance from
- * the start of a transition. It will be, depending on the direction of the interaction, added or
- * subtracted from/to the origin offset. It should always be a positive value.
+ *   while a swipe is in progress and when settling after the swipe ends. This is the distance from
+ *   the start of a transition. It will be, depending on the direction of the interaction, added or
+ *   subtracted from/to the origin offset. It should always be a positive value.
  */
 @Composable
 fun rememberSwipeToDismissBoxState(
@@ -195,11 +187,12 @@
 ): SwipeToDismissBoxState {
     val density = LocalDensity.current
     return rememberSaveable(
-        saver = Saver(
-            confirmValueChange = confirmValueChange,
-            density = density,
-            positionalThreshold = positionalThreshold
-        )
+        saver =
+            Saver(
+                confirmValueChange = confirmValueChange,
+                density = density,
+                positionalThreshold = positionalThreshold
+            )
     ) {
         SwipeToDismissBoxState(initialValue, density, confirmValueChange, positionalThreshold)
     }
@@ -212,7 +205,8 @@
  *
  * @param state The state of this component.
  * @param backgroundContent A composable that is stacked behind the [content] and is exposed when
- * the content is swiped. You can/should use the [state] to have different backgrounds on each side.
+ *   the content is swiped. You can/should use the [state] to have different backgrounds on each
+ *   side.
  * @param modifier Optional [Modifier] for this component.
  * @param enableDismissFromStartToEnd Whether SwipeToDismissBox can be dismissed from start to end.
  * @param enableDismissFromEndToStart Whether SwipeToDismissBox can be dismissed from end to start.
@@ -232,35 +226,31 @@
     val isRtl = LocalLayoutDirection.current == LayoutDirection.Rtl
 
     Box(
-        modifier
-            .anchoredDraggable(
-                state = state.anchoredDraggableState,
-                orientation = Orientation.Horizontal,
-                enabled = gesturesEnabled && state.currentValue == SwipeToDismissBoxValue.Settled,
-            ),
+        modifier.anchoredDraggable(
+            state = state.anchoredDraggableState,
+            orientation = Orientation.Horizontal,
+            enabled = gesturesEnabled && state.currentValue == SwipeToDismissBoxValue.Settled,
+        ),
         propagateMinConstraints = true
     ) {
-        Row(
-            content = backgroundContent,
-            modifier = Modifier.matchParentSize()
-        )
+        Row(content = backgroundContent, modifier = Modifier.matchParentSize())
         Row(
             content = content,
-            modifier = Modifier.draggableAnchors(
-                state.anchoredDraggableState,
-                Orientation.Horizontal
-            ) { size, _ ->
-                val width = size.width.toFloat()
-                return@draggableAnchors DraggableAnchors {
-                    SwipeToDismissBoxValue.Settled at 0f
-                    if (enableDismissFromStartToEnd) {
-                        SwipeToDismissBoxValue.StartToEnd at (if (isRtl) -width else width)
-                    }
-                    if (enableDismissFromEndToStart) {
-                        SwipeToDismissBoxValue.EndToStart at (if (isRtl) width else -width)
-                    }
-                } to state.targetValue
-            }
+            modifier =
+                Modifier.draggableAnchors(state.anchoredDraggableState, Orientation.Horizontal) {
+                    size,
+                    _ ->
+                    val width = size.width.toFloat()
+                    return@draggableAnchors DraggableAnchors {
+                        SwipeToDismissBoxValue.Settled at 0f
+                        if (enableDismissFromStartToEnd) {
+                            SwipeToDismissBoxValue.StartToEnd at (if (isRtl) -width else width)
+                        }
+                        if (enableDismissFromEndToStart) {
+                            SwipeToDismissBoxValue.EndToStart at (if (isRtl) width else -width)
+                        }
+                    } to state.targetValue
+                }
         )
     }
 }
@@ -269,9 +259,7 @@
 object SwipeToDismissBoxDefaults {
     /** Default positional threshold of 56.dp for [SwipeToDismissBoxState]. */
     val positionalThreshold: (totalDistance: Float) -> Float
-        @Composable get() = with(LocalDensity.current) {
-            { 56.dp.toPx() }
-        }
+        @Composable get() = with(LocalDensity.current) { { 56.dp.toPx() } }
 }
 
 private val DismissVelocityThreshold = 125.dp
diff --git a/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/Switch.kt b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/Switch.kt
index 5681ab7..33fca06 100644
--- a/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/Switch.kt
+++ b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/Switch.kt
@@ -57,11 +57,13 @@
 import kotlinx.coroutines.launch
 
 /**
- * <a href="https://m3.material.io/components/switch" class="external" target="_blank">Material Design Switch</a>.
+ * <a href="https://m3.material.io/components/switch" class="external" target="_blank">Material
+ * Design Switch</a>.
  *
  * Switches toggle the state of a single item on or off.
  *
- * ![Switch image](https://developer.android.com/images/reference/androidx/compose/material3/switch.png)
+ * ![Switch
+ * image](https://developer.android.com/images/reference/androidx/compose/material3/switch.png)
  *
  * @sample androidx.compose.material3.samples.SwitchSample
  *
@@ -71,19 +73,19 @@
  *
  * @param checked whether or not this switch is checked
  * @param onCheckedChange called when this switch is clicked. If `null`, then this switch will not
- * be interactable, unless something else handles its input events and updates its state.
+ *   be interactable, unless something else handles its input events and updates its state.
  * @param modifier the [Modifier] to be applied to this switch
  * @param thumbContent content that will be drawn inside the thumb, expected to measure
- * [SwitchDefaults.IconSize]
+ *   [SwitchDefaults.IconSize]
  * @param enabled controls the enabled state of this switch. When `false`, this component will not
- * respond to user input, and it will appear visually disabled and disabled to accessibility
- * services.
+ *   respond to user input, and it will appear visually disabled and disabled to accessibility
+ *   services.
  * @param colors [SwitchColors] that will be used to resolve the colors used for this switch in
- * different states. See [SwitchDefaults.colors].
+ *   different states. See [SwitchDefaults.colors].
  * @param interactionSource an optional hoisted [MutableInteractionSource] for observing and
- * emitting [Interaction]s for this switch. You can use this to change the switch's
- * appearance or preview the switch in different states. Note that if `null` is provided,
- * interactions will still happen internally.
+ *   emitting [Interaction]s for this switch. You can use this to change the switch's appearance or
+ *   preview the switch in different states. Note that if `null` is provided, interactions will
+ *   still happen internally.
  */
 @Composable
 @Suppress("ComposableLambdaParameterNaming", "ComposableLambdaParameterPosition")
@@ -96,30 +98,31 @@
     colors: SwitchColors = SwitchDefaults.colors(),
     interactionSource: MutableInteractionSource? = null,
 ) {
-    @Suppress("NAME_SHADOWING") val interactionSource =
-        interactionSource ?: remember { MutableInteractionSource() }
+    @Suppress("NAME_SHADOWING")
+    val interactionSource = interactionSource ?: remember { MutableInteractionSource() }
 
     // TODO: Add Swipeable modifier b/223797571
-    val toggleableModifier = if (onCheckedChange != null) {
-        Modifier
-            .minimumInteractiveComponentSize()
-            .toggleable(
-                value = checked,
-                onValueChange = onCheckedChange,
-                enabled = enabled,
-                role = Role.Switch,
-                interactionSource = interactionSource,
-                indication = null
-            )
-    } else {
-        Modifier
-    }
+    val toggleableModifier =
+        if (onCheckedChange != null) {
+            Modifier.minimumInteractiveComponentSize()
+                .toggleable(
+                    value = checked,
+                    onValueChange = onCheckedChange,
+                    enabled = enabled,
+                    role = Role.Switch,
+                    interactionSource = interactionSource,
+                    indication = null
+                )
+        } else {
+            Modifier
+        }
 
     SwitchImpl(
-        modifier = modifier
-            .then(toggleableModifier)
-            .wrapContentSize(Alignment.Center)
-            .requiredSize(SwitchWidth, SwitchHeight),
+        modifier =
+            modifier
+                .then(toggleableModifier)
+                .wrapContentSize(Alignment.Center)
+                .requiredSize(SwitchWidth, SwitchHeight),
         checked = checked,
         enabled = enabled,
         colors = colors,
@@ -146,25 +149,22 @@
 
     Box(
         modifier
-            .border(
-                TrackOutlineWidth,
-                colors.borderColor(enabled, checked),
-                trackShape
-            )
+            .border(TrackOutlineWidth, colors.borderColor(enabled, checked), trackShape)
             .background(trackColor, trackShape)
     ) {
         Box(
-            modifier = Modifier
-                .align(Alignment.CenterStart)
-                .then(ThumbElement(interactionSource, checked))
-                .indication(
-                    interactionSource = interactionSource,
-                    indication = rippleOrFallbackImplementation(
-                        bounded = false,
-                        radius = SwitchTokens.StateLayerSize / 2
+            modifier =
+                Modifier.align(Alignment.CenterStart)
+                    .then(ThumbElement(interactionSource, checked))
+                    .indication(
+                        interactionSource = interactionSource,
+                        indication =
+                            rippleOrFallbackImplementation(
+                                bounded = false,
+                                radius = SwitchTokens.StateLayerSize / 2
+                            )
                     )
-                )
-                .background(resolvedThumbColor, thumbShape),
+                    .background(resolvedThumbColor, thumbShape),
             contentAlignment = Alignment.Center
         ) {
             if (thumbContent != null) {
@@ -236,44 +236,39 @@
         measurable: Measurable,
         constraints: Constraints
     ): MeasureResult {
-        val hasContent = measurable.maxIntrinsicHeight(constraints.maxWidth) != 0 &&
-            measurable.maxIntrinsicWidth(constraints.maxHeight) != 0
-        val size = when {
-            isPressed -> SwitchTokens.PressedHandleWidth
-            hasContent || checked -> ThumbDiameter
-            else -> UncheckedThumbDiameter
-        }.toPx()
+        val hasContent =
+            measurable.maxIntrinsicHeight(constraints.maxWidth) != 0 &&
+                measurable.maxIntrinsicWidth(constraints.maxHeight) != 0
+        val size =
+            when {
+                isPressed -> SwitchTokens.PressedHandleWidth
+                hasContent || checked -> ThumbDiameter
+                else -> UncheckedThumbDiameter
+            }.toPx()
 
         val actualSize = (sizeAnim?.value ?: size).toInt()
-        val placeable = measurable.measure(
-            Constraints.fixed(actualSize, actualSize)
-        )
+        val placeable = measurable.measure(Constraints.fixed(actualSize, actualSize))
         val thumbPaddingStart = (SwitchHeight - size.toDp()) / 2f
         val minBound = thumbPaddingStart.toPx()
         val thumbPathLength = (SwitchWidth - ThumbDiameter) - ThumbPadding
         val maxBound = thumbPathLength.toPx()
-        val offset = when {
-            isPressed && checked -> maxBound - TrackOutlineWidth.toPx()
-            isPressed && !checked -> TrackOutlineWidth.toPx()
-            checked -> maxBound
-            else -> minBound
-        }
+        val offset =
+            when {
+                isPressed && checked -> maxBound - TrackOutlineWidth.toPx()
+                isPressed && !checked -> TrackOutlineWidth.toPx()
+                checked -> maxBound
+                else -> minBound
+            }
 
         if (sizeAnim?.targetValue != size) {
             coroutineScope.launch {
-                sizeAnim?.animateTo(
-                    size,
-                    if (isPressed) SnapSpec else AnimationSpec
-                )
+                sizeAnim?.animateTo(size, if (isPressed) SnapSpec else AnimationSpec)
             }
         }
 
         if (offsetAnim?.targetValue != offset) {
             coroutineScope.launch {
-                offsetAnim?.animateTo(
-                    offset,
-                    if (isPressed) SnapSpec else AnimationSpec
-                )
+                offsetAnim?.animateTo(offset, if (isPressed) SnapSpec else AnimationSpec)
             }
         }
 
@@ -292,25 +287,21 @@
             sizeAnim = Animatable(initialSize)
         }
 
-        if (offsetAnim == null && !initialOffset.isNaN())
-            offsetAnim = Animatable(initialOffset)
+        if (offsetAnim == null && !initialOffset.isNaN()) offsetAnim = Animatable(initialOffset)
     }
 }
 
-/**
- * Contains the default values used by [Switch]
- */
+/** Contains the default values used by [Switch] */
 object SwitchDefaults {
     /**
-     * Creates a [SwitchColors] that represents the different colors used in a [Switch] in
-     * different states.
+     * Creates a [SwitchColors] that represents the different colors used in a [Switch] in different
+     * states.
      */
-    @Composable
-    fun colors() = MaterialTheme.colorScheme.defaultSwitchColors
+    @Composable fun colors() = MaterialTheme.colorScheme.defaultSwitchColors
 
     /**
-     * Creates a [SwitchColors] that represents the different colors used in a [Switch] in
-     * different states.
+     * Creates a [SwitchColors] that represents the different colors used in a [Switch] in different
+     * states.
      *
      * @param checkedThumbColor the color used for the thumb when enabled and checked
      * @param checkedTrackColor the color used for the track when enabled and checked
@@ -339,100 +330,108 @@
         uncheckedTrackColor: Color = SwitchTokens.UnselectedTrackColor.value,
         uncheckedBorderColor: Color = SwitchTokens.UnselectedFocusTrackOutlineColor.value,
         uncheckedIconColor: Color = SwitchTokens.UnselectedIconColor.value,
-        disabledCheckedThumbColor: Color = SwitchTokens.DisabledSelectedHandleColor.value
-            .copy(alpha = SwitchTokens.DisabledSelectedHandleOpacity)
-            .compositeOver(MaterialTheme.colorScheme.surface),
-        disabledCheckedTrackColor: Color = SwitchTokens.DisabledSelectedTrackColor.value
-            .copy(alpha = SwitchTokens.DisabledTrackOpacity)
-            .compositeOver(MaterialTheme.colorScheme.surface),
+        disabledCheckedThumbColor: Color =
+            SwitchTokens.DisabledSelectedHandleColor.value
+                .copy(alpha = SwitchTokens.DisabledSelectedHandleOpacity)
+                .compositeOver(MaterialTheme.colorScheme.surface),
+        disabledCheckedTrackColor: Color =
+            SwitchTokens.DisabledSelectedTrackColor.value
+                .copy(alpha = SwitchTokens.DisabledTrackOpacity)
+                .compositeOver(MaterialTheme.colorScheme.surface),
         disabledCheckedBorderColor: Color = Color.Transparent,
-        disabledCheckedIconColor: Color = SwitchTokens.DisabledSelectedIconColor.value
-            .copy(alpha = SwitchTokens.DisabledSelectedIconOpacity)
-            .compositeOver(MaterialTheme.colorScheme.surface),
-        disabledUncheckedThumbColor: Color = SwitchTokens.DisabledUnselectedHandleColor.value
-            .copy(alpha = SwitchTokens.DisabledUnselectedHandleOpacity)
-            .compositeOver(MaterialTheme.colorScheme.surface),
-        disabledUncheckedTrackColor: Color = SwitchTokens.DisabledUnselectedTrackColor.value
-            .copy(alpha = SwitchTokens.DisabledTrackOpacity)
-            .compositeOver(MaterialTheme.colorScheme.surface),
+        disabledCheckedIconColor: Color =
+            SwitchTokens.DisabledSelectedIconColor.value
+                .copy(alpha = SwitchTokens.DisabledSelectedIconOpacity)
+                .compositeOver(MaterialTheme.colorScheme.surface),
+        disabledUncheckedThumbColor: Color =
+            SwitchTokens.DisabledUnselectedHandleColor.value
+                .copy(alpha = SwitchTokens.DisabledUnselectedHandleOpacity)
+                .compositeOver(MaterialTheme.colorScheme.surface),
+        disabledUncheckedTrackColor: Color =
+            SwitchTokens.DisabledUnselectedTrackColor.value
+                .copy(alpha = SwitchTokens.DisabledTrackOpacity)
+                .compositeOver(MaterialTheme.colorScheme.surface),
         disabledUncheckedBorderColor: Color =
             SwitchTokens.DisabledUnselectedTrackOutlineColor.value
                 .copy(alpha = SwitchTokens.DisabledTrackOpacity)
                 .compositeOver(MaterialTheme.colorScheme.surface),
-        disabledUncheckedIconColor: Color = SwitchTokens.DisabledUnselectedIconColor.value
-            .copy(alpha = SwitchTokens.DisabledUnselectedIconOpacity)
-            .compositeOver(MaterialTheme.colorScheme.surface),
-    ): SwitchColors = SwitchColors(
-        checkedThumbColor = checkedThumbColor,
-        checkedTrackColor = checkedTrackColor,
-        checkedBorderColor = checkedBorderColor,
-        checkedIconColor = checkedIconColor,
-        uncheckedThumbColor = uncheckedThumbColor,
-        uncheckedTrackColor = uncheckedTrackColor,
-        uncheckedBorderColor = uncheckedBorderColor,
-        uncheckedIconColor = uncheckedIconColor,
-        disabledCheckedThumbColor = disabledCheckedThumbColor,
-        disabledCheckedTrackColor = disabledCheckedTrackColor,
-        disabledCheckedBorderColor = disabledCheckedBorderColor,
-        disabledCheckedIconColor = disabledCheckedIconColor,
-        disabledUncheckedThumbColor = disabledUncheckedThumbColor,
-        disabledUncheckedTrackColor = disabledUncheckedTrackColor,
-        disabledUncheckedBorderColor = disabledUncheckedBorderColor,
-        disabledUncheckedIconColor = disabledUncheckedIconColor
-    )
+        disabledUncheckedIconColor: Color =
+            SwitchTokens.DisabledUnselectedIconColor.value
+                .copy(alpha = SwitchTokens.DisabledUnselectedIconOpacity)
+                .compositeOver(MaterialTheme.colorScheme.surface),
+    ): SwitchColors =
+        SwitchColors(
+            checkedThumbColor = checkedThumbColor,
+            checkedTrackColor = checkedTrackColor,
+            checkedBorderColor = checkedBorderColor,
+            checkedIconColor = checkedIconColor,
+            uncheckedThumbColor = uncheckedThumbColor,
+            uncheckedTrackColor = uncheckedTrackColor,
+            uncheckedBorderColor = uncheckedBorderColor,
+            uncheckedIconColor = uncheckedIconColor,
+            disabledCheckedThumbColor = disabledCheckedThumbColor,
+            disabledCheckedTrackColor = disabledCheckedTrackColor,
+            disabledCheckedBorderColor = disabledCheckedBorderColor,
+            disabledCheckedIconColor = disabledCheckedIconColor,
+            disabledUncheckedThumbColor = disabledUncheckedThumbColor,
+            disabledUncheckedTrackColor = disabledUncheckedTrackColor,
+            disabledUncheckedBorderColor = disabledUncheckedBorderColor,
+            disabledUncheckedIconColor = disabledUncheckedIconColor
+        )
 
     internal val ColorScheme.defaultSwitchColors: SwitchColors
         get() {
-            return defaultSwitchColorsCached ?: SwitchColors(
-                checkedThumbColor = fromToken(SwitchTokens.SelectedHandleColor),
-                checkedTrackColor = fromToken(SwitchTokens.SelectedTrackColor),
-                checkedBorderColor = Color.Transparent,
-                checkedIconColor = fromToken(SwitchTokens.SelectedIconColor),
-                uncheckedThumbColor = fromToken(SwitchTokens.UnselectedHandleColor),
-                uncheckedTrackColor = fromToken(SwitchTokens.UnselectedTrackColor),
-                uncheckedBorderColor = fromToken(SwitchTokens.UnselectedFocusTrackOutlineColor),
-                uncheckedIconColor = fromToken(SwitchTokens.UnselectedIconColor),
-                disabledCheckedThumbColor = fromToken(SwitchTokens.DisabledSelectedHandleColor)
-                    .copy(alpha = SwitchTokens.DisabledSelectedHandleOpacity)
-                    .compositeOver(surface),
-                disabledCheckedTrackColor = fromToken(SwitchTokens.DisabledSelectedTrackColor)
-                    .copy(alpha = SwitchTokens.DisabledTrackOpacity)
-                    .compositeOver(surface),
-                disabledCheckedBorderColor = Color.Transparent,
-                disabledCheckedIconColor = fromToken(SwitchTokens.DisabledSelectedIconColor)
-                    .copy(alpha = SwitchTokens.DisabledSelectedIconOpacity)
-                    .compositeOver(surface),
-                disabledUncheckedThumbColor = fromToken(SwitchTokens.DisabledUnselectedHandleColor)
-                    .copy(alpha = SwitchTokens.DisabledUnselectedHandleOpacity)
-                    .compositeOver(surface),
-                disabledUncheckedTrackColor = fromToken(SwitchTokens.DisabledUnselectedTrackColor)
-                    .copy(alpha = SwitchTokens.DisabledTrackOpacity)
-                    .compositeOver(surface),
-                disabledUncheckedBorderColor =
-                fromToken(SwitchTokens.DisabledUnselectedTrackOutlineColor)
-                    .copy(alpha = SwitchTokens.DisabledTrackOpacity)
-                    .compositeOver(surface),
-                disabledUncheckedIconColor = fromToken(SwitchTokens.DisabledUnselectedIconColor)
-                    .copy(alpha = SwitchTokens.DisabledUnselectedIconOpacity)
-                    .compositeOver(surface),
-            ).also {
-                defaultSwitchColorsCached = it
-            }
+            return defaultSwitchColorsCached
+                ?: SwitchColors(
+                        checkedThumbColor = fromToken(SwitchTokens.SelectedHandleColor),
+                        checkedTrackColor = fromToken(SwitchTokens.SelectedTrackColor),
+                        checkedBorderColor = Color.Transparent,
+                        checkedIconColor = fromToken(SwitchTokens.SelectedIconColor),
+                        uncheckedThumbColor = fromToken(SwitchTokens.UnselectedHandleColor),
+                        uncheckedTrackColor = fromToken(SwitchTokens.UnselectedTrackColor),
+                        uncheckedBorderColor =
+                            fromToken(SwitchTokens.UnselectedFocusTrackOutlineColor),
+                        uncheckedIconColor = fromToken(SwitchTokens.UnselectedIconColor),
+                        disabledCheckedThumbColor =
+                            fromToken(SwitchTokens.DisabledSelectedHandleColor)
+                                .copy(alpha = SwitchTokens.DisabledSelectedHandleOpacity)
+                                .compositeOver(surface),
+                        disabledCheckedTrackColor =
+                            fromToken(SwitchTokens.DisabledSelectedTrackColor)
+                                .copy(alpha = SwitchTokens.DisabledTrackOpacity)
+                                .compositeOver(surface),
+                        disabledCheckedBorderColor = Color.Transparent,
+                        disabledCheckedIconColor =
+                            fromToken(SwitchTokens.DisabledSelectedIconColor)
+                                .copy(alpha = SwitchTokens.DisabledSelectedIconOpacity)
+                                .compositeOver(surface),
+                        disabledUncheckedThumbColor =
+                            fromToken(SwitchTokens.DisabledUnselectedHandleColor)
+                                .copy(alpha = SwitchTokens.DisabledUnselectedHandleOpacity)
+                                .compositeOver(surface),
+                        disabledUncheckedTrackColor =
+                            fromToken(SwitchTokens.DisabledUnselectedTrackColor)
+                                .copy(alpha = SwitchTokens.DisabledTrackOpacity)
+                                .compositeOver(surface),
+                        disabledUncheckedBorderColor =
+                            fromToken(SwitchTokens.DisabledUnselectedTrackOutlineColor)
+                                .copy(alpha = SwitchTokens.DisabledTrackOpacity)
+                                .compositeOver(surface),
+                        disabledUncheckedIconColor =
+                            fromToken(SwitchTokens.DisabledUnselectedIconColor)
+                                .copy(alpha = SwitchTokens.DisabledUnselectedIconOpacity)
+                                .compositeOver(surface),
+                    )
+                    .also { defaultSwitchColorsCached = it }
         }
 
-    /**
-     * Icon size to use for `thumbContent`
-     */
+    /** Icon size to use for `thumbContent` */
     val IconSize = 16.dp
 }
 
 /**
  * Represents the colors used by a [Switch] in different states
  *
- * @constructor create an instance with arbitrary colors.
- * See [SwitchDefaults.colors] for the default implementation that follows Material
- * specifications.
- *
  * @param checkedThumbColor the color used for the thumb when enabled and checked
  * @param checkedTrackColor the color used for the track when enabled and checked
  * @param checkedBorderColor the color used for the border when enabled and checked
@@ -449,9 +448,12 @@
  * @param disabledUncheckedTrackColor the color used for the track when disabled and unchecked
  * @param disabledUncheckedBorderColor the color used for the border when disabled and unchecked
  * @param disabledUncheckedIconColor the color used for the icon when disabled and unchecked
+ * @constructor create an instance with arbitrary colors. See [SwitchDefaults.colors] for the
+ *   default implementation that follows Material specifications.
  */
 @Immutable
-class SwitchColors constructor(
+class SwitchColors
+constructor(
     val checkedThumbColor: Color,
     val checkedTrackColor: Color,
     val checkedBorderColor: Color,
@@ -470,8 +472,8 @@
     val disabledUncheckedIconColor: Color
 ) {
     /**
-     * Returns a copy of this SwitchColors, optionally overriding some of the values.
-     * This uses the Color.Unspecified to mean “use the value from the source”
+     * Returns a copy of this SwitchColors, optionally overriding some of the values. This uses the
+     * Color.Unspecified to mean “use the value from the source”
      */
     fun copy(
         checkedThumbColor: Color = this.checkedThumbColor,
@@ -490,24 +492,25 @@
         disabledUncheckedTrackColor: Color = this.disabledUncheckedTrackColor,
         disabledUncheckedBorderColor: Color = this.disabledUncheckedBorderColor,
         disabledUncheckedIconColor: Color = this.disabledUncheckedIconColor,
-    ) = SwitchColors(
-        checkedThumbColor.takeOrElse { this.checkedThumbColor },
-        checkedTrackColor.takeOrElse { this.checkedTrackColor },
-        checkedBorderColor.takeOrElse { this.checkedBorderColor },
-        checkedIconColor.takeOrElse { this.checkedIconColor },
-        uncheckedThumbColor.takeOrElse { this.uncheckedThumbColor },
-        uncheckedTrackColor.takeOrElse { this.uncheckedTrackColor },
-        uncheckedBorderColor.takeOrElse { this.uncheckedBorderColor },
-        uncheckedIconColor.takeOrElse { this.uncheckedIconColor },
-        disabledCheckedThumbColor.takeOrElse { this.disabledCheckedThumbColor },
-        disabledCheckedTrackColor.takeOrElse { this.disabledCheckedTrackColor },
-        disabledCheckedBorderColor.takeOrElse { this.disabledCheckedBorderColor },
-        disabledCheckedIconColor.takeOrElse { this.disabledCheckedIconColor },
-        disabledUncheckedThumbColor.takeOrElse { this.disabledUncheckedThumbColor },
-        disabledUncheckedTrackColor.takeOrElse { this.disabledUncheckedTrackColor },
-        disabledUncheckedBorderColor.takeOrElse { this.disabledUncheckedBorderColor },
-        disabledUncheckedIconColor.takeOrElse { this.disabledUncheckedIconColor },
-    )
+    ) =
+        SwitchColors(
+            checkedThumbColor.takeOrElse { this.checkedThumbColor },
+            checkedTrackColor.takeOrElse { this.checkedTrackColor },
+            checkedBorderColor.takeOrElse { this.checkedBorderColor },
+            checkedIconColor.takeOrElse { this.checkedIconColor },
+            uncheckedThumbColor.takeOrElse { this.uncheckedThumbColor },
+            uncheckedTrackColor.takeOrElse { this.uncheckedTrackColor },
+            uncheckedBorderColor.takeOrElse { this.uncheckedBorderColor },
+            uncheckedIconColor.takeOrElse { this.uncheckedIconColor },
+            disabledCheckedThumbColor.takeOrElse { this.disabledCheckedThumbColor },
+            disabledCheckedTrackColor.takeOrElse { this.disabledCheckedTrackColor },
+            disabledCheckedBorderColor.takeOrElse { this.disabledCheckedBorderColor },
+            disabledCheckedIconColor.takeOrElse { this.disabledCheckedIconColor },
+            disabledUncheckedThumbColor.takeOrElse { this.disabledUncheckedThumbColor },
+            disabledUncheckedTrackColor.takeOrElse { this.disabledUncheckedTrackColor },
+            disabledUncheckedBorderColor.takeOrElse { this.disabledUncheckedBorderColor },
+            disabledUncheckedIconColor.takeOrElse { this.disabledUncheckedIconColor },
+        )
 
     /**
      * Represents the color used for the switch's thumb, depending on [enabled] and [checked].
diff --git a/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/Tab.kt b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/Tab.kt
index 683a9b2..3e7de14 100644
--- a/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/Tab.kt
+++ b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/Tab.kt
@@ -54,12 +54,14 @@
 import kotlin.math.max
 
 /**
- * <a href="https://m3.material.io/components/tabs/overview" class="external" target="_blank">Material Design tab.</a>
+ * <a href="https://m3.material.io/components/tabs/overview" class="external"
+ * target="_blank">Material Design tab.</a>
  *
  * A default Tab, also known as a Primary Navigation Tab. Tabs organize content across different
  * screens, data sets, and other interactions.
  *
- * ![Tabs image](https://developer.android.com/images/reference/androidx/compose/material3/secondary-tabs.png)
+ * ![Tabs
+ * image](https://developer.android.com/images/reference/androidx/compose/material3/secondary-tabs.png)
  *
  * A Tab represents a single page of content using a text label and/or icon. It represents its
  * selected state by tinting the text label and/or image with [selectedContentColor].
@@ -67,25 +69,24 @@
  * This should typically be used inside of a [TabRow], see the corresponding documentation for
  * example usage.
  *
- * This Tab has slots for [text] and/or [icon] - see the other Tab overload for a generic Tab
- * that is not opinionated about its content.
+ * This Tab has slots for [text] and/or [icon] - see the other Tab overload for a generic Tab that
+ * is not opinionated about its content.
  *
  * @param selected whether this tab is selected or not
  * @param onClick called when this tab is clicked
  * @param modifier the [Modifier] to be applied to this tab
  * @param enabled controls the enabled state of this tab. When `false`, this component will not
- * respond to user input, and it will appear visually disabled and disabled to accessibility
- * services.
+ *   respond to user input, and it will appear visually disabled and disabled to accessibility
+ *   services.
  * @param text the text label displayed in this tab
  * @param icon the icon displayed in this tab
- * @param selectedContentColor the color for the content of this tab when selected, and the color
- * of the ripple.
+ * @param selectedContentColor the color for the content of this tab when selected, and the color of
+ *   the ripple.
  * @param unselectedContentColor the color for the content of this tab when not selected
  * @param interactionSource an optional hoisted [MutableInteractionSource] for observing and
- * emitting [Interaction]s for this tab. You can use this to change the tab's
- * appearance or preview the tab in different states. Note that if `null` is provided,
- * interactions will still happen internally.
- *
+ *   emitting [Interaction]s for this tab. You can use this to change the tab's appearance or
+ *   preview the tab in different states. Note that if `null` is provided, interactions will still
+ *   happen internally.
  * @see LeadingIconTab
  */
 @Composable
@@ -100,13 +101,16 @@
     unselectedContentColor: Color = selectedContentColor,
     interactionSource: MutableInteractionSource? = null
 ) {
-    val styledText: @Composable (() -> Unit)? = text?.let {
-        @Composable {
-            val style = PrimaryNavigationTabTokens.LabelTextFont.value
-                .copy(textAlign = TextAlign.Center)
-            ProvideTextStyle(style, content = text)
+    val styledText: @Composable (() -> Unit)? =
+        text?.let {
+            @Composable {
+                val style =
+                    PrimaryNavigationTabTokens.LabelTextFont.value.copy(
+                        textAlign = TextAlign.Center
+                    )
+                ProvideTextStyle(style, content = text)
+            }
         }
-    }
     Tab(
         selected,
         onClick,
@@ -121,13 +125,14 @@
 }
 
 /**
- * <a href="https://m3.material.io/components/tabs/overview" class="external" target="_blank">Material Design tab.</a>
+ * <a href="https://m3.material.io/components/tabs/overview" class="external"
+ * target="_blank">Material Design tab.</a>
  *
  * Tabs organize content across different screens, data sets, and other interactions.
  *
- * A LeadingIconTab represents a single page of content using a text label and an icon in
- * front of the label.
- * It represents its selected state by tinting the text label and icon with [selectedContentColor].
+ * A LeadingIconTab represents a single page of content using a text label and an icon in front of
+ * the label. It represents its selected state by tinting the text label and icon with
+ * [selectedContentColor].
  *
  * This should typically be used inside of a [TabRow], see the corresponding documentation for
  * example usage.
@@ -138,16 +143,15 @@
  * @param icon the icon displayed in this tab. Should be 24.dp.
  * @param modifier the [Modifier] to be applied to this tab
  * @param enabled controls the enabled state of this tab. When `false`, this component will not
- * respond to user input, and it will appear visually disabled and disabled to accessibility
- * services.
- * @param selectedContentColor the color for the content of this tab when selected, and the color
- * of the ripple.
+ *   respond to user input, and it will appear visually disabled and disabled to accessibility
+ *   services.
+ * @param selectedContentColor the color for the content of this tab when selected, and the color of
+ *   the ripple.
  * @param unselectedContentColor the color for the content of this tab when not selected
  * @param interactionSource an optional hoisted [MutableInteractionSource] for observing and
- * emitting [Interaction]s for this tab. You can use this to change the tab's
- * appearance or preview the tab in different states. Note that if `null` is provided,
- * interactions will still happen internally.
- *
+ *   emitting [Interaction]s for this tab. You can use this to change the tab's appearance or
+ *   preview the tab in different states. Note that if `null` is provided, interactions will still
+ *   happen internally.
  * @see Tab
  */
 @Composable
@@ -169,40 +173,43 @@
 
     TabTransition(selectedContentColor, unselectedContentColor, selected) {
         Row(
-            modifier = modifier
-                .height(SmallTabHeight)
-                .selectable(
-                    selected = selected,
-                    onClick = onClick,
-                    enabled = enabled,
-                    role = Role.Tab,
-                    interactionSource = interactionSource,
-                    indication = ripple
-                )
-                .padding(horizontal = HorizontalTextPadding)
-                .fillMaxWidth(),
+            modifier =
+                modifier
+                    .height(SmallTabHeight)
+                    .selectable(
+                        selected = selected,
+                        onClick = onClick,
+                        enabled = enabled,
+                        role = Role.Tab,
+                        interactionSource = interactionSource,
+                        indication = ripple
+                    )
+                    .padding(horizontal = HorizontalTextPadding)
+                    .fillMaxWidth(),
             horizontalArrangement = Arrangement.Center,
             verticalAlignment = Alignment.CenterVertically
         ) {
             icon()
             Spacer(Modifier.requiredWidth(TextDistanceFromLeadingIcon))
-            val style = PrimaryNavigationTabTokens.LabelTextFont.value
-                .copy(textAlign = TextAlign.Center)
+            val style =
+                PrimaryNavigationTabTokens.LabelTextFont.value.copy(textAlign = TextAlign.Center)
             ProvideTextStyle(style, content = text)
         }
     }
 }
 
 /**
- * <a href="https://m3.material.io/components/tabs/overview" class="external" target="_blank">Material Design tab.</a>
+ * <a href="https://m3.material.io/components/tabs/overview" class="external"
+ * target="_blank">Material Design tab.</a>
  *
  * Tabs organize content across different screens, data sets, and other interactions.
  *
- * ![Tabs image](https://developer.android.com/images/reference/androidx/compose/material3/secondary-tabs.png)
+ * ![Tabs
+ * image](https://developer.android.com/images/reference/androidx/compose/material3/secondary-tabs.png)
  *
- * Generic [Tab] overload that is not opinionated about content / color. See the other overload
- * for a Tab that has specific slots for text and / or an icon, as well as providing the correct
- * colors for selected / unselected states.
+ * Generic [Tab] overload that is not opinionated about content / color. See the other overload for
+ * a Tab that has specific slots for text and / or an icon, as well as providing the correct colors
+ * for selected / unselected states.
  *
  * A custom tab using this API may look like:
  *
@@ -212,15 +219,15 @@
  * @param onClick called when this tab is clicked
  * @param modifier the [Modifier] to be applied to this tab
  * @param enabled controls the enabled state of this tab. When `false`, this component will not
- * respond to user input, and it will appear visually disabled and disabled to accessibility
- * services.
- * @param selectedContentColor the color for the content of this tab when selected, and the color
- * of the ripple.
+ *   respond to user input, and it will appear visually disabled and disabled to accessibility
+ *   services.
+ * @param selectedContentColor the color for the content of this tab when selected, and the color of
+ *   the ripple.
  * @param unselectedContentColor the color for the content of this tab when not selected
  * @param interactionSource an optional hoisted [MutableInteractionSource] for observing and
- * emitting [Interaction]s for this tab. You can use this to change the tab's
- * appearance or preview the tab in different states. Note that if `null` is provided,
- * interactions will still happen internally.
+ *   emitting [Interaction]s for this tab. You can use this to change the tab's appearance or
+ *   preview the tab in different states. Note that if `null` is provided, interactions will still
+ *   happen internally.
  * @param content the content of this tab
  */
 @Composable
@@ -241,16 +248,17 @@
 
     TabTransition(selectedContentColor, unselectedContentColor, selected) {
         Column(
-            modifier = modifier
-                .selectable(
-                    selected = selected,
-                    onClick = onClick,
-                    enabled = enabled,
-                    role = Role.Tab,
-                    interactionSource = interactionSource,
-                    indication = ripple
-                )
-                .fillMaxWidth(),
+            modifier =
+                modifier
+                    .selectable(
+                        selected = selected,
+                        onClick = onClick,
+                        enabled = enabled,
+                        role = Role.Tab,
+                        interactionSource = interactionSource,
+                        indication = ripple
+                    )
+                    .fillMaxWidth(),
             horizontalAlignment = Alignment.CenterHorizontally,
             verticalArrangement = Arrangement.Center,
             content = content
@@ -260,8 +268,8 @@
 
 /**
  * Transition defining how the tint color for a tab animates, when a new tab is selected. This
- * component uses [LocalContentColor] to provide an interpolated value between [activeColor]
- * and [inactiveColor] depending on the animation status.
+ * component uses [LocalContentColor] to provide an interpolated value between [activeColor] and
+ * [inactiveColor] depending on the animation status.
  */
 @Composable
 private fun TabTransition(
@@ -271,28 +279,23 @@
     content: @Composable () -> Unit
 ) {
     val transition = updateTransition(selected)
-    val color by transition.animateColor(
-        transitionSpec = {
-            if (false isTransitioningTo true) {
-                tween(
-                    durationMillis = TabFadeInAnimationDuration,
-                    delayMillis = TabFadeInAnimationDelay,
-                    easing = LinearEasing
-                )
-            } else {
-                tween(
-                    durationMillis = TabFadeOutAnimationDuration,
-                    easing = LinearEasing
-                )
+    val color by
+        transition.animateColor(
+            transitionSpec = {
+                if (false isTransitioningTo true) {
+                    tween(
+                        durationMillis = TabFadeInAnimationDuration,
+                        delayMillis = TabFadeInAnimationDelay,
+                        easing = LinearEasing
+                    )
+                } else {
+                    tween(durationMillis = TabFadeOutAnimationDuration, easing = LinearEasing)
+                }
             }
+        ) {
+            if (it) activeColor else inactiveColor
         }
-    ) {
-        if (it) activeColor else inactiveColor
-    }
-    CompositionLocalProvider(
-        LocalContentColor provides color,
-        content = content
-    )
+    CompositionLocalProvider(LocalContentColor provides color, content = content)
 }
 
 /**
@@ -301,77 +304,72 @@
  * place the text and/or icon inside with the correct baseline alignment.
  */
 @Composable
-private fun TabBaselineLayout(
-    text: @Composable (() -> Unit)?,
-    icon: @Composable (() -> Unit)?
-) {
-    Layout(
-        {
-            if (text != null) {
-                Box(
-                    Modifier
-                        .layoutId("text")
-                        .padding(horizontal = HorizontalTextPadding)
-                ) { text() }
-            }
-            if (icon != null) {
-                Box(Modifier.layoutId("icon")) { icon() }
-            }
+private fun TabBaselineLayout(text: @Composable (() -> Unit)?, icon: @Composable (() -> Unit)?) {
+    Layout({
+        if (text != null) {
+            Box(Modifier.layoutId("text").padding(horizontal = HorizontalTextPadding)) { text() }
         }
-    ) { measurables, constraints ->
-        val textPlaceable = text?.let {
-            measurables.fastFirst { it.layoutId == "text" }.measure(
-                // Measure with loose constraints for height as we don't want the text to take up more
-                // space than it needs
-                constraints.copy(minHeight = 0)
-            )
+        if (icon != null) {
+            Box(Modifier.layoutId("icon")) { icon() }
         }
+    }) { measurables, constraints ->
+        val textPlaceable =
+            text?.let {
+                measurables
+                    .fastFirst { it.layoutId == "text" }
+                    .measure(
+                        // Measure with loose constraints for height as we don't want the text to
+                        // take up more
+                        // space than it needs
+                        constraints.copy(minHeight = 0)
+                    )
+            }
 
-        val iconPlaceable = icon?.let {
-            measurables.fastFirst { it.layoutId == "icon" }.measure(constraints)
-        }
+        val iconPlaceable =
+            icon?.let { measurables.fastFirst { it.layoutId == "icon" }.measure(constraints) }
 
         val tabWidth = max(textPlaceable?.width ?: 0, iconPlaceable?.width ?: 0)
 
-        val specHeight = if (textPlaceable != null && iconPlaceable != null) {
-            LargeTabHeight
-        } else {
-            SmallTabHeight
-        }.roundToPx()
+        val specHeight =
+            if (textPlaceable != null && iconPlaceable != null) {
+                    LargeTabHeight
+                } else {
+                    SmallTabHeight
+                }
+                .roundToPx()
 
-        val tabHeight = max(
-            specHeight,
-            (iconPlaceable?.height ?: 0) + (textPlaceable?.height ?: 0) +
-                IconDistanceFromBaseline.roundToPx()
-        )
+        val tabHeight =
+            max(
+                specHeight,
+                (iconPlaceable?.height ?: 0) +
+                    (textPlaceable?.height ?: 0) +
+                    IconDistanceFromBaseline.roundToPx()
+            )
 
         val firstBaseline = textPlaceable?.get(FirstBaseline)
         val lastBaseline = textPlaceable?.get(LastBaseline)
 
         layout(tabWidth, tabHeight) {
             when {
-                textPlaceable != null && iconPlaceable != null -> placeTextAndIcon(
-                    density = this@Layout,
-                    textPlaceable = textPlaceable,
-                    iconPlaceable = iconPlaceable,
-                    tabWidth = tabWidth,
-                    tabHeight = tabHeight,
-                    firstBaseline = firstBaseline!!,
-                    lastBaseline = lastBaseline!!
-                )
+                textPlaceable != null && iconPlaceable != null ->
+                    placeTextAndIcon(
+                        density = this@Layout,
+                        textPlaceable = textPlaceable,
+                        iconPlaceable = iconPlaceable,
+                        tabWidth = tabWidth,
+                        tabHeight = tabHeight,
+                        firstBaseline = firstBaseline!!,
+                        lastBaseline = lastBaseline!!
+                    )
                 textPlaceable != null -> placeTextOrIcon(textPlaceable, tabHeight)
                 iconPlaceable != null -> placeTextOrIcon(iconPlaceable, tabHeight)
-                else -> {
-                }
+                else -> {}
             }
         }
     }
 }
 
-/**
- * Places the provided [textOrIconPlaceable] in the vertical center of the provided
- * [tabHeight].
- */
+/** Places the provided [textOrIconPlaceable] in the vertical center of the provided [tabHeight]. */
 private fun Placeable.PlacementScope.placeTextOrIcon(
     textOrIconPlaceable: Placeable,
     tabHeight: Int
@@ -381,9 +379,9 @@
 }
 
 /**
- * Places the provided [textPlaceable] offset from the bottom of the tab using the correct
- * baseline offset, with the provided [iconPlaceable] placed above the text using the correct
- * baseline offset.
+ * Places the provided [textPlaceable] offset from the bottom of the tab using the correct baseline
+ * offset, with the provided [iconPlaceable] placed above the text using the correct baseline
+ * offset.
  */
 private fun Placeable.PlacementScope.placeTextAndIcon(
     density: Density,
@@ -394,22 +392,26 @@
     firstBaseline: Int,
     lastBaseline: Int
 ) {
-    val baselineOffset = if (firstBaseline == lastBaseline) {
-        SingleLineTextBaselineWithIcon
-    } else {
-        DoubleLineTextBaselineWithIcon
-    }
+    val baselineOffset =
+        if (firstBaseline == lastBaseline) {
+            SingleLineTextBaselineWithIcon
+        } else {
+            DoubleLineTextBaselineWithIcon
+        }
 
     // Total offset between the last text baseline and the bottom of the Tab layout
-    val textOffset = with(density) {
-        baselineOffset.roundToPx() + PrimaryNavigationTabTokens.ActiveIndicatorHeight.roundToPx()
-    }
+    val textOffset =
+        with(density) {
+            baselineOffset.roundToPx() +
+                PrimaryNavigationTabTokens.ActiveIndicatorHeight.roundToPx()
+        }
 
     // How much space there is between the top of the icon (essentially the top of this layout)
     // and the top of the text layout's bounding box (not baseline)
-    val iconOffset = with(density) {
-        iconPlaceable.height + IconDistanceFromBaseline.roundToPx() - firstBaseline
-    }
+    val iconOffset =
+        with(density) {
+            iconPlaceable.height + IconDistanceFromBaseline.roundToPx() - firstBaseline
+        }
 
     val textPlaceableX = (tabWidth - textPlaceable.width) / 2
     val textPlaceableY = tabHeight - lastBaseline - textOffset
diff --git a/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/TabRow.kt b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/TabRow.kt
index 49e10fd..70aca2d 100644
--- a/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/TabRow.kt
+++ b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/TabRow.kt
@@ -78,17 +78,18 @@
 import kotlinx.coroutines.launch
 
 /**
- * <a href="https://m3.material.io/components/tabs/overview" class="external" target="_blank">Material Design Fixed Primary tabs</a>
+ * <a href="https://m3.material.io/components/tabs/overview" class="external"
+ * target="_blank">Material Design Fixed Primary tabs</a>
  *
  * Primary tabs are placed at the top of the content pane under a top app bar. They display the main
  * content destinations. Fixed tabs display all tabs in a set simultaneously. They are best for
  * switching between related content quickly, such as between transportation methods in a map. To
  * navigate between fixed tabs, tap an individual tab, or swipe left or right in the content area.
  *
- * A TabRow contains a row of [Tab]s, and displays an indicator underneath the currently
- * selected tab. A TabRow places its tabs evenly spaced along the entire row, with each tab
- * taking up an equal amount of space. See [PrimaryScrollableTabRow] for a tab row that does not
- * enforce equal size, and allows scrolling to tabs that do not fit on screen.
+ * A TabRow contains a row of [Tab]s, and displays an indicator underneath the currently selected
+ * tab. A TabRow places its tabs evenly spaced along the entire row, with each tab taking up an
+ * equal amount of space. See [PrimaryScrollableTabRow] for a tab row that does not enforce equal
+ * size, and allows scrolling to tabs that do not fit on screen.
  *
  * A simple example with text tabs looks like:
  *
@@ -102,27 +103,27 @@
  *
  * @sample androidx.compose.material3.samples.FancyTab
  *
- * As well as customizing the tab, you can also provide a custom [indicator], to customize
- * the indicator displayed for a tab. [indicator] will be placed to fill the entire TabRow, so it
- * should internally take care of sizing and positioning the indicator to match changes to
+ * As well as customizing the tab, you can also provide a custom [indicator], to customize the
+ * indicator displayed for a tab. [indicator] will be placed to fill the entire TabRow, so it should
+ * internally take care of sizing and positioning the indicator to match changes to
  * [selectedTabIndex].
  *
  * For example, given an indicator that draws a rounded rectangle near the edges of the [Tab]:
  *
  * @sample androidx.compose.material3.samples.FancyIndicator
  *
- * We can reuse [TabRowDefaults.tabIndicatorOffset] and just provide this indicator,
- * as we aren't changing how the size and position of the indicator changes between tabs:
+ * We can reuse [TabRowDefaults.tabIndicatorOffset] and just provide this indicator, as we aren't
+ * changing how the size and position of the indicator changes between tabs:
  *
  * @sample androidx.compose.material3.samples.FancyIndicatorTabs
  *
- * You may also want to use a custom transition, to allow you to dynamically change the
- * appearance of the indicator as it animates between tabs, such as changing its color or size.
- * [indicator] is stacked on top of the entire TabRow, so you just need to provide a custom
- * transition that animates the offset of the indicator from the start of the TabRow. For
- * example, take the following example that uses a transition to animate the offset, width, and
- * color of the same FancyIndicator from before, also adding a physics based 'spring' effect to
- * the indicator in the direction of motion:
+ * You may also want to use a custom transition, to allow you to dynamically change the appearance
+ * of the indicator as it animates between tabs, such as changing its color or size. [indicator] is
+ * stacked on top of the entire TabRow, so you just need to provide a custom transition that
+ * animates the offset of the indicator from the start of the TabRow. For example, take the
+ * following example that uses a transition to animate the offset, width, and color of the same
+ * FancyIndicator from before, also adding a physics based 'spring' effect to the indicator in the
+ * direction of motion:
  *
  * @sample androidx.compose.material3.samples.FancyAnimatedIndicatorWithModifier
  *
@@ -133,17 +134,18 @@
  * @param selectedTabIndex the index of the currently selected tab
  * @param modifier the [Modifier] to be applied to this tab row
  * @param containerColor the color used for the background of this tab row. Use [Color.Transparent]
- * to have no color.
+ *   to have no color.
  * @param contentColor the preferred color for content inside this tab row. Defaults to either the
- * matching content color for [containerColor], or to the current [LocalContentColor] if
- * [containerColor] is not a color from the theme.
+ *   matching content color for [containerColor], or to the current [LocalContentColor] if
+ *   [containerColor] is not a color from the theme.
  * @param indicator the indicator that represents which tab is currently selected. By default this
- * will be a [TabRowDefaults.PrimaryIndicator], using a [TabRowDefaults.tabIndicatorOffset] modifier
- * to animate its position.
+ *   will be a [TabRowDefaults.PrimaryIndicator], using a [TabRowDefaults.tabIndicatorOffset]
+ *   modifier to animate its position.
  * @param divider the divider displayed at the bottom of the tab row. This provides a layer of
- * separation between the tab row and the content displayed underneath.
+ *   separation between the tab row and the content displayed underneath.
  * @param tabs the tabs inside this tab row. Typically this will be multiple [Tab]s. Each element
- * inside this lambda will be measured and placed evenly across the row, each taking up equal space.
+ *   inside this lambda will be measured and placed evenly across the row, each taking up equal
+ *   space.
  */
 @ExperimentalMaterial3Api
 @Composable
@@ -154,32 +156,28 @@
     contentColor: Color = TabRowDefaults.primaryContentColor,
     indicator: @Composable TabIndicatorScope.() -> Unit = {
         TabRowDefaults.PrimaryIndicator(
-            modifier = Modifier.tabIndicatorOffset(
-                selectedTabIndex,
-                matchContentSize = true
-            ),
+            modifier = Modifier.tabIndicatorOffset(selectedTabIndex, matchContentSize = true),
             width = Dp.Unspecified,
         )
     },
-    divider: @Composable () -> Unit = @Composable {
-        HorizontalDivider()
-    },
+    divider: @Composable () -> Unit = @Composable { HorizontalDivider() },
     tabs: @Composable () -> Unit
 ) {
     TabRowImpl(modifier, containerColor, contentColor, indicator, divider, tabs)
 }
 
 /**
- * <a href="https://m3.material.io/components/tabs/overview" class="external" target="_blank">Material Design Fixed Secondary tabs</a>
+ * <a href="https://m3.material.io/components/tabs/overview" class="external"
+ * target="_blank">Material Design Fixed Secondary tabs</a>
  *
  * Secondary tabs are used within a content area to further separate related content and establish
  * hierarchy. Fixed tabs display all tabs in a set simultaneously. To navigate between fixed tabs,
  * tap an individual tab, or swipe left or right in the content area.
  *
- * A TabRow contains a row of [Tab]s, and displays an indicator underneath the currently
- * selected tab. A Fixed TabRow places its tabs evenly spaced along the entire row, with each tab
- * taking up an equal amount of space. See [SecondaryScrollableTabRow] for a tab row that does not
- * enforce equal size, and allows scrolling to tabs that do not fit on screen.
+ * A TabRow contains a row of [Tab]s, and displays an indicator underneath the currently selected
+ * tab. A Fixed TabRow places its tabs evenly spaced along the entire row, with each tab taking up
+ * an equal amount of space. See [SecondaryScrollableTabRow] for a tab row that does not enforce
+ * equal size, and allows scrolling to tabs that do not fit on screen.
  *
  * A simple example with text tabs looks like:
  *
@@ -188,19 +186,20 @@
  * @param selectedTabIndex the index of the currently selected tab
  * @param modifier the [Modifier] to be applied to this tab row
  * @param containerColor the color used for the background of this tab row. Use [Color.Transparent]
- * to have no color.
+ *   to have no color.
  * @param contentColor the preferred color for content inside this tab row. Defaults to either the
- * matching content color for [containerColor], or to the current [LocalContentColor] if
- * [containerColor] is not a color from the theme.
+ *   matching content color for [containerColor], or to the current [LocalContentColor] if
+ *   [containerColor] is not a color from the theme.
  * @param indicator the indicator that represents which tab is currently selected. By default this
- * will be a [TabRowDefaults.SecondaryIndicator], using a [TabRowDefaults.tabIndicatorOffset]
- * modifier to animate its position. Note that this indicator will be forced to fill up the entire
- * tab row, so you should use [TabRowDefaults.tabIndicatorOffset] or similar to animate the actual
- * drawn indicator inside this space, and provide an offset from the start.
+ *   will be a [TabRowDefaults.SecondaryIndicator], using a [TabRowDefaults.tabIndicatorOffset]
+ *   modifier to animate its position. Note that this indicator will be forced to fill up the entire
+ *   tab row, so you should use [TabRowDefaults.tabIndicatorOffset] or similar to animate the actual
+ *   drawn indicator inside this space, and provide an offset from the start.
  * @param divider the divider displayed at the bottom of the tab row. This provides a layer of
- * separation between the tab row and the content displayed underneath.
+ *   separation between the tab row and the content displayed underneath.
  * @param tabs the tabs inside this tab row. Typically this will be multiple [Tab]s. Each element
- * inside this lambda will be measured and placed evenly across the row, each taking up equal space.
+ *   inside this lambda will be measured and placed evenly across the row, each taking up equal
+ *   space.
  */
 @ExperimentalMaterial3Api
 @Composable
@@ -209,20 +208,21 @@
     modifier: Modifier = Modifier,
     containerColor: Color = TabRowDefaults.secondaryContainerColor,
     contentColor: Color = TabRowDefaults.secondaryContentColor,
-    indicator: @Composable TabIndicatorScope.() -> Unit = @Composable {
-        TabRowDefaults.SecondaryIndicator(
-            Modifier.tabIndicatorOffset(selectedTabIndex, matchContentSize = false)
-        )
-    },
-    divider: @Composable () -> Unit = @Composable {
-        HorizontalDivider()
-    },
+    indicator: @Composable TabIndicatorScope.() -> Unit =
+        @Composable {
+            TabRowDefaults.SecondaryIndicator(
+                Modifier.tabIndicatorOffset(selectedTabIndex, matchContentSize = false)
+            )
+        },
+    divider: @Composable () -> Unit = @Composable { HorizontalDivider() },
     tabs: @Composable () -> Unit
 ) {
     TabRowImpl(modifier, containerColor, contentColor, indicator, divider, tabs)
 }
+
 /**
- * <a href="https://m3.material.io/components/tabs/overview" class="external" target="_blank">Material Design tabs</a>
+ * <a href="https://m3.material.io/components/tabs/overview" class="external"
+ * target="_blank">Material Design tabs</a>
  *
  * Material Design fixed tabs.
  *
@@ -233,10 +233,10 @@
  * content quickly, such as between transportation methods in a map. To navigate between fixed tabs,
  * tap an individual tab, or swipe left or right in the content area.
  *
- * A TabRow contains a row of [Tab]s, and displays an indicator underneath the currently
- * selected tab. A TabRow places its tabs evenly spaced along the entire row, with each tab
- * taking up an equal amount of space. See [ScrollableTabRow] for a tab row that does not enforce
- * equal size, and allows scrolling to tabs that do not fit on screen.
+ * A TabRow contains a row of [Tab]s, and displays an indicator underneath the currently selected
+ * tab. A TabRow places its tabs evenly spaced along the entire row, with each tab taking up an
+ * equal amount of space. See [ScrollableTabRow] for a tab row that does not enforce equal size, and
+ * allows scrolling to tabs that do not fit on screen.
  *
  * A simple example with text tabs looks like:
  *
@@ -250,27 +250,27 @@
  *
  * @sample androidx.compose.material3.samples.FancyTab
  *
- * As well as customizing the tab, you can also provide a custom [indicator], to customize
- * the indicator displayed for a tab. [indicator] will be placed to fill the entire TabRow, so it
- * should internally take care of sizing and positioning the indicator to match changes to
+ * As well as customizing the tab, you can also provide a custom [indicator], to customize the
+ * indicator displayed for a tab. [indicator] will be placed to fill the entire TabRow, so it should
+ * internally take care of sizing and positioning the indicator to match changes to
  * [selectedTabIndex].
  *
  * For example, given an indicator that draws a rounded rectangle near the edges of the [Tab]:
  *
  * @sample androidx.compose.material3.samples.FancyIndicator
  *
- * We can reuse [TabRowDefaults.tabIndicatorOffset] and just provide this indicator,
- * as we aren't changing how the size and position of the indicator changes between tabs:
+ * We can reuse [TabRowDefaults.tabIndicatorOffset] and just provide this indicator, as we aren't
+ * changing how the size and position of the indicator changes between tabs:
  *
  * @sample androidx.compose.material3.samples.FancyIndicatorTabs
  *
- * You may also want to use a custom transition, to allow you to dynamically change the
- * appearance of the indicator as it animates between tabs, such as changing its color or size.
- * [indicator] is stacked on top of the entire TabRow, so you just need to provide a custom
- * transition that animates the offset of the indicator from the start of the TabRow. For
- * example, take the following example that uses a transition to animate the offset, width, and
- * color of the same FancyIndicator from before, also adding a physics based 'spring' effect to
- * the indicator in the direction of motion:
+ * You may also want to use a custom transition, to allow you to dynamically change the appearance
+ * of the indicator as it animates between tabs, such as changing its color or size. [indicator] is
+ * stacked on top of the entire TabRow, so you just need to provide a custom transition that
+ * animates the offset of the indicator from the start of the TabRow. For example, take the
+ * following example that uses a transition to animate the offset, width, and color of the same
+ * FancyIndicator from before, also adding a physics based 'spring' effect to the indicator in the
+ * direction of motion:
  *
  * @sample androidx.compose.material3.samples.FancyAnimatedIndicatorWithModifier
  *
@@ -281,19 +281,20 @@
  * @param selectedTabIndex the index of the currently selected tab
  * @param modifier the [Modifier] to be applied to this tab row
  * @param containerColor the color used for the background of this tab row. Use [Color.Transparent]
- * to have no color.
+ *   to have no color.
  * @param contentColor the preferred color for content inside this tab row. Defaults to either the
- * matching content color for [containerColor], or to the current [LocalContentColor] if
- * [containerColor] is not a color from the theme.
+ *   matching content color for [containerColor], or to the current [LocalContentColor] if
+ *   [containerColor] is not a color from the theme.
  * @param indicator the indicator that represents which tab is currently selected. By default this
- * will be a [TabRowDefaults.SecondaryIndicator], using a [TabRowDefaults.tabIndicatorOffset]
- * modifier to animate its position. Note that this indicator will be forced to fill up the entire
- * tab row, so you should use [TabRowDefaults.tabIndicatorOffset] or similar to animate the actual
- * drawn indicator inside this space, and provide an offset from the start.
+ *   will be a [TabRowDefaults.SecondaryIndicator], using a [TabRowDefaults.tabIndicatorOffset]
+ *   modifier to animate its position. Note that this indicator will be forced to fill up the entire
+ *   tab row, so you should use [TabRowDefaults.tabIndicatorOffset] or similar to animate the actual
+ *   drawn indicator inside this space, and provide an offset from the start.
  * @param divider the divider displayed at the bottom of the tab row. This provides a layer of
- * separation between the tab row and the content displayed underneath.
+ *   separation between the tab row and the content displayed underneath.
  * @param tabs the tabs inside this tab row. Typically this will be multiple [Tab]s. Each element
- * inside this lambda will be measured and placed evenly across the row, each taking up equal space.
+ *   inside this lambda will be measured and placed evenly across the row, each taking up equal
+ *   space.
  */
 @Composable
 fun TabRow(
@@ -301,23 +302,23 @@
     modifier: Modifier = Modifier,
     containerColor: Color = TabRowDefaults.primaryContainerColor,
     contentColor: Color = TabRowDefaults.primaryContentColor,
-    indicator: @Composable (tabPositions: List<TabPosition>) -> Unit = @Composable { tabPositions ->
-        if (selectedTabIndex < tabPositions.size) {
-            TabRowDefaults.SecondaryIndicator(
-                Modifier.tabIndicatorOffset(tabPositions[selectedTabIndex])
-            )
-        }
-    },
-    divider: @Composable () -> Unit = @Composable {
-        HorizontalDivider()
-    },
+    indicator: @Composable (tabPositions: List<TabPosition>) -> Unit =
+        @Composable { tabPositions ->
+            if (selectedTabIndex < tabPositions.size) {
+                TabRowDefaults.SecondaryIndicator(
+                    Modifier.tabIndicatorOffset(tabPositions[selectedTabIndex])
+                )
+            }
+        },
+    divider: @Composable () -> Unit = @Composable { HorizontalDivider() },
     tabs: @Composable () -> Unit
 ) {
     TabRowWithSubcomposeImpl(modifier, containerColor, contentColor, indicator, divider, tabs)
 }
 
 /**
- * <a href="https://m3.material.io/components/tabs/overview" class="external" target="_blank">Material Design Scrollable Primary tabs</a>
+ * <a href="https://m3.material.io/components/tabs/overview" class="external"
+ * target="_blank">Material Design Scrollable Primary tabs</a>
  *
  * Primary tabs are placed at the top of the content pane under a top app bar. They display the main
  * content destinations. When a set of tabs cannot fit on screen, use scrollable tabs. Scrollable
@@ -326,27 +327,28 @@
  *
  * A scrollable tab row contains a row of [Tab]s, and displays an indicator underneath the currently
  * selected tab. A scrollable tab row places its tabs offset from the starting edge, and allows
- * scrolling to tabs that are placed off screen. For a fixed tab row that does not allow
- * scrolling, and evenly places its tabs, see [PrimaryTabRow].
+ * scrolling to tabs that are placed off screen. For a fixed tab row that does not allow scrolling,
+ * and evenly places its tabs, see [PrimaryTabRow].
  *
  * @param selectedTabIndex the index of the currently selected tab
  * @param modifier the [Modifier] to be applied to this tab row
  * @param scrollState the [ScrollState] of this tab row
  * @param containerColor the color used for the background of this tab row. Use [Color.Transparent]
- * to have no color.
+ *   to have no color.
  * @param contentColor the preferred color for content inside this tab row. Defaults to either the
- * matching content color for [containerColor], or to the current [LocalContentColor] if
- * [containerColor] is not a color from the theme.
+ *   matching content color for [containerColor], or to the current [LocalContentColor] if
+ *   [containerColor] is not a color from the theme.
  * @param edgePadding the padding between the starting and ending edge of the scrollable tab row,
- * and the tabs inside the row. This padding helps inform the user that this tab row can be
- * scrolled, unlike a [TabRow].
+ *   and the tabs inside the row. This padding helps inform the user that this tab row can be
+ *   scrolled, unlike a [TabRow].
  * @param indicator the indicator that represents which tab is currently selected. By default this
- * will be a [TabRowDefaults.PrimaryIndicator], using a [TabRowDefaults.tabIndicatorOffset] modifier
- * to animate its position.
+ *   will be a [TabRowDefaults.PrimaryIndicator], using a [TabRowDefaults.tabIndicatorOffset]
+ *   modifier to animate its position.
  * @param divider the divider displayed at the bottom of the tab row. This provides a layer of
- * separation between the tab row and the content displayed underneath.
+ *   separation between the tab row and the content displayed underneath.
  * @param tabs the tabs inside this tab row. Typically this will be multiple [Tab]s. Each element
- * inside this lambda will be measured and placed evenly across the row, each taking up equal space.
+ *   inside this lambda will be measured and placed evenly across the row, each taking up equal
+ *   space.
  */
 @ExperimentalMaterial3Api
 @Composable
@@ -357,15 +359,14 @@
     containerColor: Color = TabRowDefaults.primaryContainerColor,
     contentColor: Color = TabRowDefaults.primaryContentColor,
     edgePadding: Dp = TabRowDefaults.ScrollableTabRowEdgeStartPadding,
-    indicator: @Composable TabIndicatorScope.() -> Unit = @Composable {
-        TabRowDefaults.PrimaryIndicator(
-            Modifier.tabIndicatorOffset(selectedTabIndex, matchContentSize = true),
-            width = Dp.Unspecified,
-        )
-    },
-    divider: @Composable () -> Unit = @Composable {
-        HorizontalDivider()
-    },
+    indicator: @Composable TabIndicatorScope.() -> Unit =
+        @Composable {
+            TabRowDefaults.PrimaryIndicator(
+                Modifier.tabIndicatorOffset(selectedTabIndex, matchContentSize = true),
+                width = Dp.Unspecified,
+            )
+        },
+    divider: @Composable () -> Unit = @Composable { HorizontalDivider() },
     tabs: @Composable () -> Unit
 ) {
     ScrollableTabRowImpl(
@@ -382,7 +383,8 @@
 }
 
 /**
- * <a href="https://m3.material.io/components/tabs/overview" class="external" target="_blank">Material Design Scrollable Secondary tabs</a>
+ * <a href="https://m3.material.io/components/tabs/overview" class="external"
+ * target="_blank">Material Design Scrollable Secondary tabs</a>
  *
  * Material Design scrollable tabs.
  *
@@ -393,29 +395,30 @@
  *
  * A scrollable tab row contains a row of [Tab]s, and displays an indicator underneath the currently
  * selected tab. A scrollable tab row places its tabs offset from the starting edge, and allows
- * scrolling to tabs that are placed off screen. For a fixed tab row that does not allow
- * scrolling, and evenly places its tabs, see [SecondaryTabRow].
+ * scrolling to tabs that are placed off screen. For a fixed tab row that does not allow scrolling,
+ * and evenly places its tabs, see [SecondaryTabRow].
  *
  * @param selectedTabIndex the index of the currently selected tab
  * @param modifier the [Modifier] to be applied to this tab row
  * @param scrollState the [ScrollState] of this tab row
  * @param containerColor the color used for the background of this tab row. Use [Color.Transparent]
- * to have no color.
+ *   to have no color.
  * @param contentColor the preferred color for content inside this tab row. Defaults to either the
- * matching content color for [containerColor], or to the current [LocalContentColor] if
- * [containerColor] is not a color from the theme.
+ *   matching content color for [containerColor], or to the current [LocalContentColor] if
+ *   [containerColor] is not a color from the theme.
  * @param edgePadding the padding between the starting and ending edge of the scrollable tab row,
- * and the tabs inside the row. This padding helps inform the user that this tab row can be
- * scrolled, unlike a [TabRow].
+ *   and the tabs inside the row. This padding helps inform the user that this tab row can be
+ *   scrolled, unlike a [TabRow].
  * @param indicator the indicator that represents which tab is currently selected. By default this
- * will be a [TabRowDefaults.SecondaryIndicator], using a [TabRowDefaults.tabIndicatorOffset]
- * modifier to animate its position. Note that this indicator will be forced to fill up the entire
- * tab row, so you should use [TabRowDefaults.tabIndicatorOffset] or similar to animate the actual
- * drawn indicator inside this space, and provide an offset from the start.
+ *   will be a [TabRowDefaults.SecondaryIndicator], using a [TabRowDefaults.tabIndicatorOffset]
+ *   modifier to animate its position. Note that this indicator will be forced to fill up the entire
+ *   tab row, so you should use [TabRowDefaults.tabIndicatorOffset] or similar to animate the actual
+ *   drawn indicator inside this space, and provide an offset from the start.
  * @param divider the divider displayed at the bottom of the tab row. This provides a layer of
- * separation between the tab row and the content displayed underneath.
+ *   separation between the tab row and the content displayed underneath.
  * @param tabs the tabs inside this tab row. Typically this will be multiple [Tab]s. Each element
- * inside this lambda will be measured and placed evenly across the row, each taking up equal space.
+ *   inside this lambda will be measured and placed evenly across the row, each taking up equal
+ *   space.
  */
 @ExperimentalMaterial3Api
 @Composable
@@ -426,14 +429,13 @@
     containerColor: Color = TabRowDefaults.secondaryContainerColor,
     contentColor: Color = TabRowDefaults.secondaryContentColor,
     edgePadding: Dp = TabRowDefaults.ScrollableTabRowEdgeStartPadding,
-    indicator: @Composable TabIndicatorScope.() -> Unit = @Composable {
-        TabRowDefaults.SecondaryIndicator(
-            Modifier.tabIndicatorOffset(selectedTabIndex, matchContentSize = false)
-        )
-    },
-    divider: @Composable () -> Unit = @Composable {
-        HorizontalDivider()
-    },
+    indicator: @Composable TabIndicatorScope.() -> Unit =
+        @Composable {
+            TabRowDefaults.SecondaryIndicator(
+                Modifier.tabIndicatorOffset(selectedTabIndex, matchContentSize = false)
+            )
+        },
+    divider: @Composable () -> Unit = @Composable { HorizontalDivider() },
     tabs: @Composable () -> Unit
 ) {
     ScrollableTabRowImpl(
@@ -450,7 +452,8 @@
 }
 
 /**
- * <a href="https://m3.material.io/components/tabs/overview" class="external" target="_blank">Material Design tabs</a>
+ * <a href="https://m3.material.io/components/tabs/overview" class="external"
+ * target="_blank">Material Design tabs</a>
  *
  * Material Design scrollable tabs.
  *
@@ -462,28 +465,29 @@
  *
  * A ScrollableTabRow contains a row of [Tab]s, and displays an indicator underneath the currently
  * selected tab. A ScrollableTabRow places its tabs offset from the starting edge, and allows
- * scrolling to tabs that are placed off screen. For a fixed tab row that does not allow
- * scrolling, and evenly places its tabs, see [TabRow].
+ * scrolling to tabs that are placed off screen. For a fixed tab row that does not allow scrolling,
+ * and evenly places its tabs, see [TabRow].
  *
  * @param selectedTabIndex the index of the currently selected tab
  * @param modifier the [Modifier] to be applied to this tab row
  * @param containerColor the color used for the background of this tab row. Use [Color.Transparent]
- * to have no color.
+ *   to have no color.
  * @param contentColor the preferred color for content inside this tab row. Defaults to either the
- * matching content color for [containerColor], or to the current [LocalContentColor] if
- * [containerColor] is not a color from the theme.
+ *   matching content color for [containerColor], or to the current [LocalContentColor] if
+ *   [containerColor] is not a color from the theme.
  * @param edgePadding the padding between the starting and ending edge of the scrollable tab row,
- * and the tabs inside the row. This padding helps inform the user that this tab row can be
- * scrolled, unlike a [TabRow].
+ *   and the tabs inside the row. This padding helps inform the user that this tab row can be
+ *   scrolled, unlike a [TabRow].
  * @param indicator the indicator that represents which tab is currently selected. By default this
- * will be a [TabRowDefaults.SecondaryIndicator], using a [TabRowDefaults.tabIndicatorOffset] modifier to
- * animate its position. Note that this indicator will be forced to fill up the entire tab row, so
- * you should use [TabRowDefaults.tabIndicatorOffset] or similar to animate the actual drawn
- * indicator inside this space, and provide an offset from the start.
+ *   will be a [TabRowDefaults.SecondaryIndicator], using a [TabRowDefaults.tabIndicatorOffset]
+ *   modifier to animate its position. Note that this indicator will be forced to fill up the entire
+ *   tab row, so you should use [TabRowDefaults.tabIndicatorOffset] or similar to animate the actual
+ *   drawn indicator inside this space, and provide an offset from the start.
  * @param divider the divider displayed at the bottom of the tab row. This provides a layer of
- * separation between the tab row and the content displayed underneath.
+ *   separation between the tab row and the content displayed underneath.
  * @param tabs the tabs inside this tab row. Typically this will be multiple [Tab]s. Each element
- * inside this lambda will be measured and placed evenly across the row, each taking up equal space.
+ *   inside this lambda will be measured and placed evenly across the row, each taking up equal
+ *   space.
  */
 @Composable
 fun ScrollableTabRow(
@@ -492,14 +496,13 @@
     containerColor: Color = TabRowDefaults.primaryContainerColor,
     contentColor: Color = TabRowDefaults.primaryContentColor,
     edgePadding: Dp = TabRowDefaults.ScrollableTabRowEdgeStartPadding,
-    indicator: @Composable (tabPositions: List<TabPosition>) -> Unit = @Composable { tabPositions ->
-        TabRowDefaults.SecondaryIndicator(
-            Modifier.tabIndicatorOffset(tabPositions[selectedTabIndex])
-        )
-    },
-    divider: @Composable () -> Unit = @Composable {
-        HorizontalDivider()
-    },
+    indicator: @Composable (tabPositions: List<TabPosition>) -> Unit =
+        @Composable { tabPositions ->
+            TabRowDefaults.SecondaryIndicator(
+                Modifier.tabIndicatorOffset(tabPositions[selectedTabIndex])
+            )
+        },
+    divider: @Composable () -> Unit = @Composable { HorizontalDivider() },
     tabs: @Composable () -> Unit
 ) {
     ScrollableTabRowWithSubcomposeImpl(
@@ -516,33 +519,34 @@
 }
 
 /**
- * Scope for the composable used to render a Tab indicator,
- * this can be used for more complex indicators requiring layout information about the tabs
- * like [TabRowDefaults.PrimaryIndicator] and [TabRowDefaults.SecondaryIndicator]
+ * Scope for the composable used to render a Tab indicator, this can be used for more complex
+ * indicators requiring layout information about the tabs like [TabRowDefaults.PrimaryIndicator] and
+ * [TabRowDefaults.SecondaryIndicator]
  */
 @ExperimentalMaterial3Api
 interface TabIndicatorScope {
 
     /**
-     * A layout modifier that provides tab positions, this can be used to animate and layout
-     * a TabIndicator depending on size, position, and content size of each Tab.
+     * A layout modifier that provides tab positions, this can be used to animate and layout a
+     * TabIndicator depending on size, position, and content size of each Tab.
      *
      * @sample androidx.compose.material3.samples.FancyAnimatedIndicatorWithModifier
      */
     fun Modifier.tabIndicatorLayout(
-        measure: MeasureScope.(
-            Measurable,
-            Constraints,
-            List<TabPosition>,
-        ) -> MeasureResult
+        measure:
+            MeasureScope.(
+                Measurable,
+                Constraints,
+                List<TabPosition>,
+            ) -> MeasureResult
     ): Modifier
 
     /**
      * A Modifier that follows the default offset and animation
      *
      * @param selectedTabIndex the index of the current selected tab
-     * @param matchContentSize this modifier can also animate the width of the indicator \
-     * to match the content size of the tab.
+     * @param matchContentSize this modifier can also animate the width of the indicator \ to match
+     *   the content size of the tab.
      */
     fun Modifier.tabIndicatorOffset(
         selectedTabIndex: Int,
@@ -576,11 +580,12 @@
                 val tabPositions = mutableStateOf<(List<TabPosition>)>(listOf())
 
                 override fun Modifier.tabIndicatorLayout(
-                    measure: MeasureScope.(
-                        Measurable,
-                        Constraints,
-                        List<TabPosition>,
-                    ) -> MeasureResult
+                    measure:
+                        MeasureScope.(
+                            Measurable,
+                            Constraints,
+                            List<TabPosition>,
+                        ) -> MeasureResult
                 ): Modifier =
                     this.layout { measurable: Measurable, constraints: Constraints ->
                         measure(
@@ -595,11 +600,7 @@
                     matchContentSize: Boolean
                 ): Modifier =
                     this.then(
-                        TabIndicatorModifier(
-                            tabPositions,
-                            selectedTabIndex,
-                            matchContentSize
-                        )
+                        TabIndicatorModifier(tabPositions, selectedTabIndex, matchContentSize)
                     )
 
                 override fun setTabPositions(positions: List<TabPosition>) {
@@ -610,11 +611,12 @@
 
         Layout(
             modifier = Modifier.fillMaxWidth(),
-            contents = listOf(
-                tabs,
-                divider,
-                { scope.indicator() },
-            )
+            contents =
+                listOf(
+                    tabs,
+                    divider,
+                    { scope.indicator() },
+                )
         ) { (tabMeasurables, dividerMeasurables, indicatorMeasurables), constraints ->
             val tabRowWidth = constraints.maxWidth
             val tabCount = tabMeasurables.size
@@ -622,48 +624,50 @@
             if (tabCount > 0) {
                 tabWidth = (tabRowWidth / tabCount)
             }
-            val tabRowHeight = tabMeasurables.fastFold(initial = 0) { max, curr ->
-                maxOf(curr.maxIntrinsicHeight(tabWidth), max)
-            }
+            val tabRowHeight =
+                tabMeasurables.fastFold(initial = 0) { max, curr ->
+                    maxOf(curr.maxIntrinsicHeight(tabWidth), max)
+                }
 
-            scope.setTabPositions(List(tabCount) { index ->
-                var contentWidth =
-                    minOf(
-                        tabMeasurables[index].maxIntrinsicWidth(tabRowHeight),
-                        tabWidth
-                    ).toDp()
-                contentWidth -= HorizontalTextPadding * 2
-                // Enforce minimum touch target of 24.dp
-                val indicatorWidth = maxOf(contentWidth, 24.dp)
+            scope.setTabPositions(
+                List(tabCount) { index ->
+                    var contentWidth =
+                        minOf(tabMeasurables[index].maxIntrinsicWidth(tabRowHeight), tabWidth)
+                            .toDp()
+                    contentWidth -= HorizontalTextPadding * 2
+                    // Enforce minimum touch target of 24.dp
+                    val indicatorWidth = maxOf(contentWidth, 24.dp)
 
-                TabPosition(tabWidth.toDp() * index, tabWidth.toDp(), indicatorWidth)
-            })
+                    TabPosition(tabWidth.toDp() * index, tabWidth.toDp(), indicatorWidth)
+                }
+            )
 
-            val tabPlaceables = tabMeasurables.fastMap {
-                it.measure(
-                    constraints.copy(
-                        minWidth = tabWidth,
-                        maxWidth = tabWidth,
-                        minHeight = tabRowHeight,
-                        maxHeight = tabRowHeight,
+            val tabPlaceables =
+                tabMeasurables.fastMap {
+                    it.measure(
+                        constraints.copy(
+                            minWidth = tabWidth,
+                            maxWidth = tabWidth,
+                            minHeight = tabRowHeight,
+                            maxHeight = tabRowHeight,
+                        )
                     )
-                )
-            }
+                }
 
-            val dividerPlaceables = dividerMeasurables.fastMap {
-                it.measure(constraints.copy(minHeight = 0))
-            }
+            val dividerPlaceables =
+                dividerMeasurables.fastMap { it.measure(constraints.copy(minHeight = 0)) }
 
-            val indicatorPlaceables = indicatorMeasurables.fastMap {
-                it.measure(
-                    constraints.copy(
-                        minWidth = tabWidth,
-                        maxWidth = tabWidth,
-                        minHeight = 0,
-                        maxHeight = tabRowHeight
+            val indicatorPlaceables =
+                indicatorMeasurables.fastMap {
+                    it.measure(
+                        constraints.copy(
+                            minWidth = tabWidth,
+                            maxWidth = tabWidth,
+                            minHeight = 0,
+                            maxHeight = tabRowHeight
+                        )
                     )
-                )
-            }
+                }
 
             layout(tabRowWidth, tabRowHeight) {
                 tabPlaceables.fastForEachIndexed { index, placeable ->
@@ -674,9 +678,7 @@
                     placeable.placeRelative(0, tabRowHeight - placeable.height)
                 }
 
-                indicatorPlaceables.fastForEach {
-                    it.placeRelative(0, tabRowHeight - it.height)
-                }
+                indicatorPlaceables.fastForEach { it.placeRelative(0, tabRowHeight - it.height) }
             }
         }
     }
@@ -696,22 +698,21 @@
     tabs: @Composable () -> Unit
 ) {
     Surface(
-        modifier = modifier
-            .fillMaxWidth()
-            .wrapContentSize(align = Alignment.CenterStart)
-            .horizontalScroll(scrollState)
-            .selectableGroup()
-            .clipToBounds(),
+        modifier =
+            modifier
+                .fillMaxWidth()
+                .wrapContentSize(align = Alignment.CenterStart)
+                .horizontalScroll(scrollState)
+                .selectableGroup()
+                .clipToBounds(),
         color = containerColor,
         contentColor = contentColor
     ) {
         val coroutineScope = rememberCoroutineScope()
-        val scrollableTabData = remember(scrollState, coroutineScope) {
-            ScrollableTabData(
-                scrollState = scrollState,
-                coroutineScope = coroutineScope
-            )
-        }
+        val scrollableTabData =
+            remember(scrollState, coroutineScope) {
+                ScrollableTabData(scrollState = scrollState, coroutineScope = coroutineScope)
+            }
 
         val scope = remember {
             object : TabIndicatorScope, TabPositionsHolder {
@@ -719,11 +720,12 @@
                 val tabPositions = mutableStateOf<(List<TabPosition>)>(listOf())
 
                 override fun Modifier.tabIndicatorLayout(
-                    measure: MeasureScope.(
-                        Measurable,
-                        Constraints,
-                        List<TabPosition>,
-                    ) -> MeasureResult
+                    measure:
+                        MeasureScope.(
+                            Measurable,
+                            Constraints,
+                            List<TabPosition>,
+                        ) -> MeasureResult
                 ): Modifier =
                     this.layout { measurable: Measurable, constraints: Constraints ->
                         measure(
@@ -738,11 +740,7 @@
                     matchContentSize: Boolean
                 ): Modifier =
                     this.then(
-                        TabIndicatorModifier(
-                            tabPositions,
-                            selectedTabIndex,
-                            matchContentSize
-                        )
+                        TabIndicatorModifier(tabPositions, selectedTabIndex, matchContentSize)
                     )
 
                 override fun setTabPositions(positions: List<TabPosition>) {
@@ -752,68 +750,67 @@
         }
 
         Layout(
-            contents = listOf(
-                tabs,
-                divider,
-                { scope.indicator() },
-            )
+            contents =
+                listOf(
+                    tabs,
+                    divider,
+                    { scope.indicator() },
+                )
         ) { (tabMeasurables, dividerMeasurables, indicatorMeasurables), constraints ->
             val padding = edgePadding.roundToPx()
             val tabCount = tabMeasurables.size
             val minTabWidth = ScrollableTabRowMinimumTabWidth.roundToPx()
-            val layoutHeight = tabMeasurables.fastFold(initial = 0) { curr, measurable ->
-                maxOf(curr, measurable.maxIntrinsicHeight(Constraints.Infinity))
-            }
+            val layoutHeight =
+                tabMeasurables.fastFold(initial = 0) { curr, measurable ->
+                    maxOf(curr, measurable.maxIntrinsicHeight(Constraints.Infinity))
+                }
             var layoutWidth = padding * 2
-            val tabConstraints = constraints.copy(
-                minWidth = minTabWidth,
-                minHeight = layoutHeight,
-                maxHeight = layoutHeight,
-            )
+            val tabConstraints =
+                constraints.copy(
+                    minWidth = minTabWidth,
+                    minHeight = layoutHeight,
+                    maxHeight = layoutHeight,
+                )
 
             var left = edgePadding
-            val tabPlaceables = tabMeasurables.fastMap {
-                it.measure(tabConstraints)
-            }
+            val tabPlaceables = tabMeasurables.fastMap { it.measure(tabConstraints) }
 
-            val positions = List(tabCount) { index ->
-                val tabWidth = maxOf(
-                    ScrollableTabRowMinimumTabWidth,
-                    tabPlaceables[index].width.toDp()
-                )
-                layoutWidth += tabWidth.roundToPx()
-                // Enforce minimum touch target of 24.dp
-                val contentWidth = maxOf(tabWidth - (HorizontalTextPadding * 2), 24.dp)
-                val tabPosition = TabPosition(
-                    left = left,
-                    width = tabWidth,
-                    contentWidth = contentWidth
-                )
-                left += tabWidth
-                tabPosition
-            }
+            val positions =
+                List(tabCount) { index ->
+                    val tabWidth =
+                        maxOf(ScrollableTabRowMinimumTabWidth, tabPlaceables[index].width.toDp())
+                    layoutWidth += tabWidth.roundToPx()
+                    // Enforce minimum touch target of 24.dp
+                    val contentWidth = maxOf(tabWidth - (HorizontalTextPadding * 2), 24.dp)
+                    val tabPosition =
+                        TabPosition(left = left, width = tabWidth, contentWidth = contentWidth)
+                    left += tabWidth
+                    tabPosition
+                }
             scope.setTabPositions(positions)
 
-            val dividerPlaceables = dividerMeasurables.fastMap {
-                it.measure(
-                    constraints.copy(
-                        minHeight = 0,
-                        minWidth = layoutWidth,
-                        maxWidth = layoutWidth
+            val dividerPlaceables =
+                dividerMeasurables.fastMap {
+                    it.measure(
+                        constraints.copy(
+                            minHeight = 0,
+                            minWidth = layoutWidth,
+                            maxWidth = layoutWidth
+                        )
                     )
-                )
-            }
+                }
 
-            val indicatorPlaceables = indicatorMeasurables.fastMap {
-                it.measure(
-                    constraints.copy(
-                        minWidth = 0,
-                        maxWidth = positions[selectedTabIndex].width.roundToPx(),
-                        minHeight = 0,
-                        maxHeight = layoutHeight
+            val indicatorPlaceables =
+                indicatorMeasurables.fastMap {
+                    it.measure(
+                        constraints.copy(
+                            minWidth = 0,
+                            maxWidth = positions[selectedTabIndex].width.roundToPx(),
+                            minHeight = 0,
+                            maxHeight = layoutHeight
+                        )
                     )
-                )
-            }
+                }
 
             layout(layoutWidth, layoutHeight) {
                 left = edgePadding
@@ -827,10 +824,8 @@
                 }
 
                 indicatorPlaceables.fastForEach {
-                    val relativeOffset = max(
-                        0,
-                        (positions[selectedTabIndex].width.roundToPx() - it.width) / 2
-                    )
+                    val relativeOffset =
+                        max(0, (positions[selectedTabIndex].width.roundToPx() - it.width) / 2)
                     it.placeRelative(relativeOffset, layoutHeight - it.height)
                 }
 
@@ -886,25 +881,23 @@
         constraints: Constraints
     ): MeasureResult {
         if (tabPositionsState.value.isEmpty()) {
-            return layout(0, 0) { }
+            return layout(0, 0) {}
         }
 
-        val currentTabWidth = if (followContentSize) {
-            tabPositionsState.value[selectedTabIndex].contentWidth
-        } else {
-            tabPositionsState.value[selectedTabIndex].width
-        }
+        val currentTabWidth =
+            if (followContentSize) {
+                tabPositionsState.value[selectedTabIndex].contentWidth
+            } else {
+                tabPositionsState.value[selectedTabIndex].width
+            }
 
         if (initialWidth != null) {
             val widthAnim =
-                widthAnimatable ?: Animatable(initialWidth!!, Dp.VectorConverter).also {
-                    widthAnimatable = it
-                }
+                widthAnimatable
+                    ?: Animatable(initialWidth!!, Dp.VectorConverter).also { widthAnimatable = it }
 
             if (currentTabWidth != widthAnim.targetValue) {
-                coroutineScope.launch {
-                    widthAnim.animateTo(currentTabWidth, TabRowIndicatorSpec)
-                }
+                coroutineScope.launch { widthAnim.animateTo(currentTabWidth, TabRowIndicatorSpec) }
             }
         } else {
             initialWidth = currentTabWidth
@@ -914,9 +907,10 @@
 
         if (initialOffset != null) {
             val offsetAnim =
-                offsetAnimatable ?: Animatable(initialOffset!!, Dp.VectorConverter).also {
-                    offsetAnimatable = it
-                }
+                offsetAnimatable
+                    ?: Animatable(initialOffset!!, Dp.VectorConverter).also {
+                        offsetAnimatable = it
+                    }
 
             if (indicatorOffset != offsetAnim.targetValue) {
                 coroutineScope.launch { offsetAnim.animateTo(indicatorOffset, TabRowIndicatorSpec) }
@@ -929,13 +923,12 @@
 
         val width = widthAnimatable?.value ?: currentTabWidth
 
-        val placeable = measurable.measure(
-            constraints.copy(minWidth = width.roundToPx(), maxWidth = width.roundToPx())
-        )
+        val placeable =
+            measurable.measure(
+                constraints.copy(minWidth = width.roundToPx(), maxWidth = width.roundToPx())
+            )
 
-        return layout(placeable.width, placeable.height) {
-            placeable.place(offset.roundToPx(), 0)
-        }
+        return layout(placeable.width, placeable.height) { placeable.place(offset.roundToPx(), 0) }
     }
 }
 
@@ -961,29 +954,33 @@
             if (tabCount > 0) {
                 tabWidth = (tabRowWidth / tabCount)
             }
-            val tabRowHeight = tabMeasurables.fastFold(initial = 0) { max, curr ->
-                maxOf(curr.maxIntrinsicHeight(tabWidth), max)
-            }
+            val tabRowHeight =
+                tabMeasurables.fastFold(initial = 0) { max, curr ->
+                    maxOf(curr.maxIntrinsicHeight(tabWidth), max)
+                }
 
-            val tabPlaceables = tabMeasurables.fastMap {
-                it.measure(
-                    constraints.copy(
-                        minWidth = tabWidth,
-                        maxWidth = tabWidth,
-                        minHeight = tabRowHeight,
-                        maxHeight = tabRowHeight,
+            val tabPlaceables =
+                tabMeasurables.fastMap {
+                    it.measure(
+                        constraints.copy(
+                            minWidth = tabWidth,
+                            maxWidth = tabWidth,
+                            minHeight = tabRowHeight,
+                            maxHeight = tabRowHeight,
+                        )
                     )
-                )
-            }
+                }
 
-            val tabPositions = List(tabCount) { index ->
-                var contentWidth =
-                    minOf(tabMeasurables[index].maxIntrinsicWidth(tabRowHeight), tabWidth).toDp()
-                contentWidth -= HorizontalTextPadding * 2
-                // Enforce minimum touch target of 24.dp
-                val indicatorWidth = maxOf(contentWidth, 24.dp)
-                TabPosition(tabWidth.toDp() * index, tabWidth.toDp(), indicatorWidth)
-            }
+            val tabPositions =
+                List(tabCount) { index ->
+                    var contentWidth =
+                        minOf(tabMeasurables[index].maxIntrinsicWidth(tabRowHeight), tabWidth)
+                            .toDp()
+                    contentWidth -= HorizontalTextPadding * 2
+                    // Enforce minimum touch target of 24.dp
+                    val indicatorWidth = maxOf(contentWidth, 24.dp)
+                    TabPosition(tabWidth.toDp() * index, tabWidth.toDp(), indicatorWidth)
+                }
 
             layout(tabRowWidth, tabRowHeight) {
                 tabPlaceables.fastForEachIndexed { index, placeable ->
@@ -995,11 +992,10 @@
                     placeable.placeRelative(0, tabRowHeight - placeable.height)
                 }
 
-                subcompose(TabSlots.Indicator) {
-                    indicator(tabPositions)
-                }.fastForEach {
-                    it.measure(Constraints.fixed(tabRowWidth, tabRowHeight)).placeRelative(0, 0)
-                }
+                subcompose(TabSlots.Indicator) { indicator(tabPositions) }
+                    .fastForEach {
+                        it.measure(Constraints.fixed(tabRowWidth, tabRowHeight)).placeRelative(0, 0)
+                    }
             }
         }
     }
@@ -1013,27 +1009,18 @@
     containerColor: Color = TabRowDefaults.primaryContainerColor,
     contentColor: Color = TabRowDefaults.primaryContentColor,
     edgePadding: Dp = TabRowDefaults.ScrollableTabRowEdgeStartPadding,
-    divider: @Composable () -> Unit = @Composable {
-        HorizontalDivider()
-    },
+    divider: @Composable () -> Unit = @Composable { HorizontalDivider() },
     tabs: @Composable () -> Unit,
     scrollState: ScrollState,
 ) {
-    Surface(
-        modifier = modifier,
-        color = containerColor,
-        contentColor = contentColor
-    ) {
+    Surface(modifier = modifier, color = containerColor, contentColor = contentColor) {
         val coroutineScope = rememberCoroutineScope()
-        val scrollableTabData = remember(scrollState, coroutineScope) {
-            ScrollableTabData(
-                scrollState = scrollState,
-                coroutineScope = coroutineScope
-            )
-        }
+        val scrollableTabData =
+            remember(scrollState, coroutineScope) {
+                ScrollableTabData(scrollState = scrollState, coroutineScope = coroutineScope)
+            }
         SubcomposeLayout(
-            Modifier
-                .fillMaxWidth()
+            Modifier.fillMaxWidth()
                 .wrapContentSize(align = Alignment.CenterStart)
                 .horizontalScroll(scrollState)
                 .selectableGroup()
@@ -1044,33 +1031,33 @@
 
             val tabMeasurables = subcompose(TabSlots.Tabs, tabs)
 
-            val layoutHeight = tabMeasurables.fastFold(initial = 0) { curr, measurable ->
-                maxOf(curr, measurable.maxIntrinsicHeight(Constraints.Infinity))
-            }
+            val layoutHeight =
+                tabMeasurables.fastFold(initial = 0) { curr, measurable ->
+                    maxOf(curr, measurable.maxIntrinsicHeight(Constraints.Infinity))
+                }
 
-            val tabConstraints = constraints.copy(
-                minWidth = minTabWidth,
-                minHeight = layoutHeight,
-                maxHeight = layoutHeight,
-            )
+            val tabConstraints =
+                constraints.copy(
+                    minWidth = minTabWidth,
+                    minHeight = layoutHeight,
+                    maxHeight = layoutHeight,
+                )
 
             val tabPlaceables = mutableListOf<Placeable>()
             val tabContentWidths = mutableListOf<Dp>()
             tabMeasurables.fastForEach {
                 val placeable = it.measure(tabConstraints)
                 var contentWidth =
-                    minOf(
-                        it.maxIntrinsicWidth(placeable.height),
-                        placeable.width
-                    ).toDp()
+                    minOf(it.maxIntrinsicWidth(placeable.height), placeable.width).toDp()
                 contentWidth -= HorizontalTextPadding * 2
                 tabPlaceables.add(placeable)
                 tabContentWidths.add(contentWidth)
             }
 
-            val layoutWidth = tabPlaceables.fastFold(initial = padding * 2) { curr, measurable ->
-                curr + measurable.width
-            }
+            val layoutWidth =
+                tabPlaceables.fastFold(initial = padding * 2) { curr, measurable ->
+                    curr + measurable.width
+                }
 
             // Position the children.
             layout(layoutWidth, layoutHeight) {
@@ -1092,23 +1079,23 @@
                 // The divider is measured with its own height, and width equal to the total width
                 // of the tab row, and then placed on top of the tabs.
                 subcompose(TabSlots.Divider, divider).fastForEach {
-                    val placeable = it.measure(
-                        constraints.copy(
-                            minHeight = 0,
-                            minWidth = layoutWidth,
-                            maxWidth = layoutWidth
+                    val placeable =
+                        it.measure(
+                            constraints.copy(
+                                minHeight = 0,
+                                minWidth = layoutWidth,
+                                maxWidth = layoutWidth
+                            )
                         )
-                    )
                     placeable.placeRelative(0, layoutHeight - placeable.height)
                 }
 
                 // The indicator container is measured to fill the entire space occupied by the tab
                 // row, and then placed on top of the divider.
-                subcompose(TabSlots.Indicator) {
-                    indicator(tabPositions)
-                }.fastForEach {
-                    it.measure(Constraints.fixed(layoutWidth, layoutHeight)).placeRelative(0, 0)
-                }
+                subcompose(TabSlots.Indicator) { indicator(tabPositions) }
+                    .fastForEach {
+                        it.measure(Constraints.fixed(layoutWidth, layoutHeight)).placeRelative(0, 0)
+                    }
 
                 scrollableTabData.onLaidOut(
                     density = this@SubcomposeLayout,
@@ -1122,8 +1109,8 @@
 }
 
 /**
- * Data class that contains information about a tab's position on screen, used for calculating
- * where to place the indicator that shows which tab is selected.
+ * Data class that contains information about a tab's position on screen, used for calculating where
+ * to place the indicator that shows which tab is selected.
  *
  * @property left the left edge's x position from the start of the [TabRow]
  * @property right the right edge's x position from the start of the [TabRow]
@@ -1133,7 +1120,8 @@
 @Immutable
 class TabPosition internal constructor(val left: Dp, val width: Dp, val contentWidth: Dp) {
 
-    val right: Dp get() = left + width
+    val right: Dp
+        get() = left + width
 
     override fun equals(other: Any?): Boolean {
         if (this === other) return true
@@ -1158,13 +1146,9 @@
     }
 }
 
-/**
- * Contains default implementations and values used for TabRow.
- */
+/** Contains default implementations and values used for TabRow. */
 object TabRowDefaults {
-    /**
-     * The default padding from the starting edge before a tab in a [ScrollableTabRow].
-     */
+    /** The default padding from the starting edge before a tab in a [ScrollableTabRow]. */
     val ScrollableTabRowEdgeStartPadding = 52.dp
 
     /** Default container color of a tab row. */
@@ -1173,18 +1157,15 @@
         replaceWith = ReplaceWith("primaryContainerColor")
     )
     val containerColor: Color
-        @Composable get() =
-            PrimaryNavigationTabTokens.ContainerColor.value
+        @Composable get() = PrimaryNavigationTabTokens.ContainerColor.value
 
     /** Default container color of a [PrimaryTabRow]. */
     val primaryContainerColor: Color
-        @Composable get() =
-            PrimaryNavigationTabTokens.ContainerColor.value
+        @Composable get() = PrimaryNavigationTabTokens.ContainerColor.value
 
     /** Default container color of a [SecondaryTabRow]. */
     val secondaryContainerColor: Color
-        @Composable get() =
-            SecondaryNavigationTabTokens.ContainerColor.value
+        @Composable get() = SecondaryNavigationTabTokens.ContainerColor.value
 
     /** Default content color of a tab row. */
     @Deprecated(
@@ -1192,18 +1173,15 @@
         replaceWith = ReplaceWith("primaryContentColor")
     )
     val contentColor: Color
-        @Composable get() =
-            PrimaryNavigationTabTokens.ActiveLabelTextColor.value
+        @Composable get() = PrimaryNavigationTabTokens.ActiveLabelTextColor.value
 
     /** Default content color of a [PrimaryTabRow]. */
     val primaryContentColor: Color
-        @Composable get() =
-            PrimaryNavigationTabTokens.ActiveLabelTextColor.value
+        @Composable get() = PrimaryNavigationTabTokens.ActiveLabelTextColor.value
 
     /** Default content color of a [SecondaryTabRow]. */
     val secondaryContentColor: Color
-        @Composable get() =
-            SecondaryNavigationTabTokens.ActiveLabelTextColor.value
+        @Composable get() = SecondaryNavigationTabTokens.ActiveLabelTextColor.value
 
     /**
      * Default indicator, which will be positioned at the bottom of the [TabRow], on top of the
@@ -1216,9 +1194,7 @@
     @Composable
     @Deprecated(
         message = "Use SecondaryIndicator instead.",
-        replaceWith = ReplaceWith(
-            "SecondaryIndicator(modifier, height, color)"
-        )
+        replaceWith = ReplaceWith("SecondaryIndicator(modifier, height, color)")
     )
     fun Indicator(
         modifier: Modifier = Modifier,
@@ -1226,12 +1202,7 @@
         color: Color =
             MaterialTheme.colorScheme.fromToken(PrimaryNavigationTabTokens.ActiveIndicatorColor)
     ) {
-        Box(
-            modifier
-                .fillMaxWidth()
-                .height(height)
-                .background(color = color)
-        )
+        Box(modifier.fillMaxWidth().height(height).background(color = color))
     }
 
     /**
@@ -1274,42 +1245,39 @@
         height: Dp = PrimaryNavigationTabTokens.ActiveIndicatorHeight,
         color: Color = PrimaryNavigationTabTokens.ActiveIndicatorColor.value
     ) {
-        Box(
-            modifier
-                .fillMaxWidth()
-                .height(height)
-                .background(color = color)
-        )
+        Box(modifier.fillMaxWidth().height(height).background(color = color))
     }
 
     /**
-     * [Modifier] that takes up all the available width inside the [TabRow], and then animates
-     * the offset of the indicator it is applied to, depending on the [currentTabPosition].
+     * [Modifier] that takes up all the available width inside the [TabRow], and then animates the
+     * offset of the indicator it is applied to, depending on the [currentTabPosition].
      *
      * @param currentTabPosition [TabPosition] of the currently selected tab. This is used to
-     * calculate the offset of the indicator this modifier is applied to, as well as its width.
+     *   calculate the offset of the indicator this modifier is applied to, as well as its width.
      */
-    fun Modifier.tabIndicatorOffset(
-        currentTabPosition: TabPosition
-    ): Modifier = composed(
-        inspectorInfo = debugInspectorInfo {
-            name = "tabIndicatorOffset"
-            value = currentTabPosition
+    fun Modifier.tabIndicatorOffset(currentTabPosition: TabPosition): Modifier =
+        composed(
+            inspectorInfo =
+                debugInspectorInfo {
+                    name = "tabIndicatorOffset"
+                    value = currentTabPosition
+                }
+        ) {
+            val currentTabWidth by
+                animateDpAsState(
+                    targetValue = currentTabPosition.width,
+                    animationSpec = TabRowIndicatorSpec
+                )
+            val indicatorOffset by
+                animateDpAsState(
+                    targetValue = currentTabPosition.left,
+                    animationSpec = TabRowIndicatorSpec
+                )
+            fillMaxWidth()
+                .wrapContentSize(Alignment.BottomStart)
+                .offset { IntOffset(x = indicatorOffset.roundToPx(), y = 0) }
+                .width(currentTabWidth)
         }
-    ) {
-        val currentTabWidth by animateDpAsState(
-            targetValue = currentTabPosition.width,
-            animationSpec = TabRowIndicatorSpec
-        )
-        val indicatorOffset by animateDpAsState(
-            targetValue = currentTabPosition.left,
-            animationSpec = TabRowIndicatorSpec
-        )
-        fillMaxWidth()
-            .wrapContentSize(Alignment.BottomStart)
-            .offset { IntOffset(x = indicatorOffset.roundToPx(), y = 0) }
-            .width(currentTabWidth)
-    }
 }
 
 private enum class TabSlots {
@@ -1318,9 +1286,7 @@
     Indicator
 }
 
-/**
- * Class holding onto state needed for [ScrollableTabRow]
- */
+/** Class holding onto state needed for [ScrollableTabRow] */
 private class ScrollableTabData(
     private val scrollState: ScrollState,
     private val coroutineScope: CoroutineScope
@@ -1354,42 +1320,35 @@
     }
 
     /**
-     * @return the offset required to horizontally center the tab inside this TabRow.
-     * If the tab is at the start / end, and there is not enough space to fully centre the tab, this
-     * will just clamp to the min / max position given the max width.
+     * @return the offset required to horizontally center the tab inside this TabRow. If the tab is
+     *   at the start / end, and there is not enough space to fully centre the tab, this will just
+     *   clamp to the min / max position given the max width.
      */
     private fun TabPosition.calculateTabOffset(
         density: Density,
         edgeOffset: Int,
         tabPositions: List<TabPosition>
-    ): Int = with(density) {
-        val totalTabRowWidth = tabPositions.last().right.roundToPx() + edgeOffset
-        val visibleWidth = totalTabRowWidth - scrollState.maxValue
-        val tabOffset = left.roundToPx()
-        val scrollerCenter = visibleWidth / 2
-        val tabWidth = width.roundToPx()
-        val centeredTabOffset = tabOffset - (scrollerCenter - tabWidth / 2)
-        // How much space we have to scroll. If the visible width is <= to the total width, then
-        // we have no space to scroll as everything is always visible.
-        val availableSpace = (totalTabRowWidth - visibleWidth).coerceAtLeast(0)
-        return centeredTabOffset.coerceIn(0, availableSpace)
-    }
+    ): Int =
+        with(density) {
+            val totalTabRowWidth = tabPositions.last().right.roundToPx() + edgeOffset
+            val visibleWidth = totalTabRowWidth - scrollState.maxValue
+            val tabOffset = left.roundToPx()
+            val scrollerCenter = visibleWidth / 2
+            val tabWidth = width.roundToPx()
+            val centeredTabOffset = tabOffset - (scrollerCenter - tabWidth / 2)
+            // How much space we have to scroll. If the visible width is <= to the total width, then
+            // we have no space to scroll as everything is always visible.
+            val availableSpace = (totalTabRowWidth - visibleWidth).coerceAtLeast(0)
+            return centeredTabOffset.coerceIn(0, availableSpace)
+        }
 }
 
 private val ScrollableTabRowMinimumTabWidth = 90.dp
 
-/**
- * [AnimationSpec] used when scrolling to a tab that is not fully visible.
- */
-private val ScrollableTabRowScrollSpec: AnimationSpec<Float> = tween(
-    durationMillis = 250,
-    easing = FastOutSlowInEasing
-)
+/** [AnimationSpec] used when scrolling to a tab that is not fully visible. */
+private val ScrollableTabRowScrollSpec: AnimationSpec<Float> =
+    tween(durationMillis = 250, easing = FastOutSlowInEasing)
 
-/**
- * [AnimationSpec] used when an indicator is updating width and/or offset.
- */
-private val TabRowIndicatorSpec: AnimationSpec<Dp> = tween(
-    durationMillis = 250,
-    easing = FastOutSlowInEasing
-)
+/** [AnimationSpec] used when an indicator is updating width and/or offset. */
+private val TabRowIndicatorSpec: AnimationSpec<Dp> =
+    tween(durationMillis = 250, easing = FastOutSlowInEasing)
diff --git a/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/Text.kt b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/Text.kt
index a26609f..fe0f83c 100644
--- a/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/Text.kt
+++ b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/Text.kt
@@ -42,16 +42,16 @@
  * High level element that displays text and provides semantics / accessibility information.
  *
  * The default [style] uses the [LocalTextStyle] provided by the [MaterialTheme] / components. If
- * you are setting your own style, you may want to consider first retrieving [LocalTextStyle],
- * and using [TextStyle.copy] to keep any theme defined attributes, only modifying the specific
+ * you are setting your own style, you may want to consider first retrieving [LocalTextStyle], and
+ * using [TextStyle.copy] to keep any theme defined attributes, only modifying the specific
  * attributes you want to override.
  *
  * For ease of use, commonly used parameters from [TextStyle] are also present here. The order of
  * precedence is as follows:
- * - If a parameter is explicitly set here (i.e, it is _not_ `null` or [TextUnit.Unspecified]),
- * then this parameter will always be used.
+ * - If a parameter is explicitly set here (i.e, it is _not_ `null` or [TextUnit.Unspecified]), then
+ *   this parameter will always be used.
  * - If a parameter is _not_ set, (`null` or [TextUnit.Unspecified]), then the corresponding value
- * from [style] will be used instead.
+ *   from [style] will be used instead.
  *
  * Additionally, for [color], if [color] is not set, and [style] does not have a color, then
  * [LocalContentColor] will be used.
@@ -59,33 +59,33 @@
  * @param text the text to be displayed
  * @param modifier the [Modifier] to be applied to this layout node
  * @param color [Color] to apply to the text. If [Color.Unspecified], and [style] has no color set,
- * this will be [LocalContentColor].
+ *   this will be [LocalContentColor].
  * @param fontSize the size of glyphs to use when painting the text. See [TextStyle.fontSize].
- * @param fontStyle the typeface variant to use when drawing the letters (e.g., italic).
- * See [TextStyle.fontStyle].
+ * @param fontStyle the typeface variant to use when drawing the letters (e.g., italic). See
+ *   [TextStyle.fontStyle].
  * @param fontWeight the typeface thickness to use when painting the text (e.g., [FontWeight.Bold]).
  * @param fontFamily the font family to be used when rendering the text. See [TextStyle.fontFamily].
- * @param letterSpacing the amount of space to add between each letter.
- * See [TextStyle.letterSpacing].
- * @param textDecoration the decorations to paint on the text (e.g., an underline).
- * See [TextStyle.textDecoration].
- * @param textAlign the alignment of the text within the lines of the paragraph.
- * See [TextStyle.textAlign].
- * @param lineHeight line height for the [Paragraph] in [TextUnit] unit, e.g. SP or EM.
- * See [TextStyle.lineHeight].
+ * @param letterSpacing the amount of space to add between each letter. See
+ *   [TextStyle.letterSpacing].
+ * @param textDecoration the decorations to paint on the text (e.g., an underline). See
+ *   [TextStyle.textDecoration].
+ * @param textAlign the alignment of the text within the lines of the paragraph. See
+ *   [TextStyle.textAlign].
+ * @param lineHeight line height for the [Paragraph] in [TextUnit] unit, e.g. SP or EM. See
+ *   [TextStyle.lineHeight].
  * @param overflow how visual overflow should be handled.
  * @param softWrap whether the text should break at soft line breaks. If false, the glyphs in the
- * text will be positioned as if there was unlimited horizontal space. If [softWrap] is false,
- * [overflow] and TextAlign may have unexpected effects.
- * @param maxLines An optional maximum number of lines for the text to span, wrapping if
- * necessary. If the text exceeds the given number of lines, it will be truncated according to
- * [overflow] and [softWrap]. It is required that 1 <= [minLines] <= [maxLines].
+ *   text will be positioned as if there was unlimited horizontal space. If [softWrap] is false,
+ *   [overflow] and TextAlign may have unexpected effects.
+ * @param maxLines An optional maximum number of lines for the text to span, wrapping if necessary.
+ *   If the text exceeds the given number of lines, it will be truncated according to [overflow] and
+ *   [softWrap]. It is required that 1 <= [minLines] <= [maxLines].
  * @param minLines The minimum height in terms of minimum number of visible lines. It is required
- * that 1 <= [minLines] <= [maxLines].
+ *   that 1 <= [minLines] <= [maxLines].
  * @param onTextLayout callback that is executed when a new text layout is calculated. A
- * [TextLayoutResult] object that callback provides contains paragraph information, size of the
- * text, baselines and other details. The callback can be used to add additional decoration or
- * functionality to the text. For example, to draw selection around the text.
+ *   [TextLayoutResult] object that callback provides contains paragraph information, size of the
+ *   text, baselines and other details. The callback can be used to add additional decoration or
+ *   functionality to the text. For example, to draw selection around the text.
  * @param style style configuration for the text such as color, font, line height etc.
  */
 @Composable
@@ -109,11 +109,7 @@
     style: TextStyle = LocalTextStyle.current
 ) {
 
-    val textColor = color.takeOrElse {
-        style.color.takeOrElse {
-            LocalContentColor.current
-        }
-    }
+    val textColor = color.takeOrElse { style.color.takeOrElse { LocalContentColor.current } }
 
     BasicText(
         text,
@@ -185,55 +181,56 @@
  * High level element that displays text and provides semantics / accessibility information.
  *
  * The default [style] uses the [LocalTextStyle] provided by the [MaterialTheme] / components. If
- * you are setting your own style, you may want to consider first retrieving [LocalTextStyle],
- * and using [TextStyle.copy] to keep any theme defined attributes, only modifying the specific
+ * you are setting your own style, you may want to consider first retrieving [LocalTextStyle], and
+ * using [TextStyle.copy] to keep any theme defined attributes, only modifying the specific
  * attributes you want to override.
  *
  * For ease of use, commonly used parameters from [TextStyle] are also present here. The order of
  * precedence is as follows:
- * - If a parameter is explicitly set here (i.e, it is _not_ `null` or [TextUnit.Unspecified]),
- * then this parameter will always be used.
+ * - If a parameter is explicitly set here (i.e, it is _not_ `null` or [TextUnit.Unspecified]), then
+ *   this parameter will always be used.
  * - If a parameter is _not_ set, (`null` or [TextUnit.Unspecified]), then the corresponding value
- * from [style] will be used instead.
+ *   from [style] will be used instead.
  *
  * Additionally, for [color], if [color] is not set, and [style] does not have a color, then
  * [LocalContentColor] will be used.
  *
  * See an example of displaying text with links where links apply the styling from the theme:
+ *
  * @sample androidx.compose.material3.samples.TextWithLinks
  *
  * @param text the text to be displayed
  * @param modifier the [Modifier] to be applied to this layout node
  * @param color [Color] to apply to the text. If [Color.Unspecified], and [style] has no color set,
- * this will be [LocalContentColor].
+ *   this will be [LocalContentColor].
  * @param fontSize the size of glyphs to use when painting the text. See [TextStyle.fontSize].
- * @param fontStyle the typeface variant to use when drawing the letters (e.g., italic).
- * See [TextStyle.fontStyle].
+ * @param fontStyle the typeface variant to use when drawing the letters (e.g., italic). See
+ *   [TextStyle.fontStyle].
  * @param fontWeight the typeface thickness to use when painting the text (e.g., [FontWeight.Bold]).
  * @param fontFamily the font family to be used when rendering the text. See [TextStyle.fontFamily].
- * @param letterSpacing the amount of space to add between each letter.
- * See [TextStyle.letterSpacing].
- * @param textDecoration the decorations to paint on the text (e.g., an underline).
- * See [TextStyle.textDecoration].
- * @param textAlign the alignment of the text within the lines of the paragraph.
- * See [TextStyle.textAlign].
- * @param lineHeight line height for the [Paragraph] in [TextUnit] unit, e.g. SP or EM.
- * See [TextStyle.lineHeight].
+ * @param letterSpacing the amount of space to add between each letter. See
+ *   [TextStyle.letterSpacing].
+ * @param textDecoration the decorations to paint on the text (e.g., an underline). See
+ *   [TextStyle.textDecoration].
+ * @param textAlign the alignment of the text within the lines of the paragraph. See
+ *   [TextStyle.textAlign].
+ * @param lineHeight line height for the [Paragraph] in [TextUnit] unit, e.g. SP or EM. See
+ *   [TextStyle.lineHeight].
  * @param overflow how visual overflow should be handled.
  * @param softWrap whether the text should break at soft line breaks. If false, the glyphs in the
- * text will be positioned as if there was unlimited horizontal space. If [softWrap] is false,
- * [overflow] and TextAlign may have unexpected effects.
- * @param maxLines An optional maximum number of lines for the text to span, wrapping if
- * necessary. If the text exceeds the given number of lines, it will be truncated according to
- * [overflow] and [softWrap]. It is required that 1 <= [minLines] <= [maxLines].
+ *   text will be positioned as if there was unlimited horizontal space. If [softWrap] is false,
+ *   [overflow] and TextAlign may have unexpected effects.
+ * @param maxLines An optional maximum number of lines for the text to span, wrapping if necessary.
+ *   If the text exceeds the given number of lines, it will be truncated according to [overflow] and
+ *   [softWrap]. It is required that 1 <= [minLines] <= [maxLines].
  * @param minLines The minimum height in terms of minimum number of visible lines. It is required
- * that 1 <= [minLines] <= [maxLines].
+ *   that 1 <= [minLines] <= [maxLines].
  * @param inlineContent a map storing composables that replaces certain ranges of the text, used to
- * insert composables into text layout. See [InlineTextContent].
+ *   insert composables into text layout. See [InlineTextContent].
  * @param onTextLayout callback that is executed when a new text layout is calculated. A
- * [TextLayoutResult] object that callback provides contains paragraph information, size of the
- * text, baselines and other details. The callback can be used to add additional decoration or
- * functionality to the text. For example, to draw selection around the text.
+ *   [TextLayoutResult] object that callback provides contains paragraph information, size of the
+ *   text, baselines and other details. The callback can be used to add additional decoration or
+ *   functionality to the text. For example, to draw selection around the text.
  * @param style style configuration for the text such as color, font, line height etc.
  */
 @Composable
@@ -257,26 +254,23 @@
     onTextLayout: (TextLayoutResult) -> Unit = {},
     style: TextStyle = LocalTextStyle.current
 ) {
-    val textColor = color.takeOrElse {
-        style.color.takeOrElse {
-            LocalContentColor.current
-        }
-    }
+    val textColor = color.takeOrElse { style.color.takeOrElse { LocalContentColor.current } }
 
     BasicText(
         text = text,
         modifier = modifier,
-        style = style.merge(
-            color = textColor,
-            fontSize = fontSize,
-            fontWeight = fontWeight,
-            textAlign = textAlign ?: TextAlign.Unspecified,
-            lineHeight = lineHeight,
-            fontFamily = fontFamily,
-            textDecoration = textDecoration,
-            fontStyle = fontStyle,
-            letterSpacing = letterSpacing
-        ),
+        style =
+            style.merge(
+                color = textColor,
+                fontSize = fontSize,
+                fontWeight = fontWeight,
+                textAlign = textAlign ?: TextAlign.Unspecified,
+                lineHeight = lineHeight,
+                fontFamily = fontFamily,
+                textDecoration = textDecoration,
+                fontStyle = fontStyle,
+                letterSpacing = letterSpacing
+            ),
         onTextLayout = onTextLayout,
         overflow = overflow,
         softWrap = softWrap,
@@ -343,9 +337,9 @@
 
 // TODO(b/156598010): remove this and replace with fold definition on the backing CompositionLocal
 /**
- * This function is used to set the current value of [LocalTextStyle], merging the given style
- * with the current style values for any missing attributes. Any [Text] components included in
- * this component's [content] will be styled with this style unless styled explicitly.
+ * This function is used to set the current value of [LocalTextStyle], merging the given style with
+ * the current style values for any missing attributes. Any [Text] components included in this
+ * component's [content] will be styled with this style unless styled explicitly.
  *
  * @see LocalTextStyle
  */
diff --git a/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/TextField.kt b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/TextField.kt
index 79ee41b..fae16bb 100644
--- a/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/TextField.kt
+++ b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/TextField.kt
@@ -94,13 +94,15 @@
 import kotlin.math.roundToInt
 
 /**
- * <a href="https://m3.material.io/components/text-fields/overview" class="external" target="_blank">Material Design filled text field</a>.
+ * <a href="https://m3.material.io/components/text-fields/overview" class="external"
+ * target="_blank">Material Design filled text field</a>.
  *
  * Text fields allow users to enter text into a UI. They typically appear in forms and dialogs.
  * Filled text fields have more visual emphasis than outlined text fields, making them stand out
  * when surrounded by other content and components.
  *
- * ![Filled text field image](https://developer.android.com/images/reference/androidx/compose/material3/filled-text-field.png)
+ * ![Filled text field
+ * image](https://developer.android.com/images/reference/androidx/compose/material3/filled-text-field.png)
  *
  * If you are looking for an outlined version, see [OutlinedTextField].
  *
@@ -136,58 +138,58 @@
  *
  * @sample androidx.compose.material3.samples.TextFieldWithHideKeyboardOnImeAction
  *
- * If apart from input text change you also want to observe the cursor location, selection range,
- * or IME composition use the TextField overload with the [TextFieldValue] parameter instead.
+ * If apart from input text change you also want to observe the cursor location, selection range, or
+ * IME composition use the TextField overload with the [TextFieldValue] parameter instead.
  *
  * @param value the input text to be shown in the text field
  * @param onValueChange the callback that is triggered when the input service updates the text. An
- * updated text comes as a parameter of the callback
+ *   updated text comes as a parameter of the callback
  * @param modifier the [Modifier] to be applied to this text field
  * @param enabled controls the enabled state of this text field. When `false`, this component will
- * not respond to user input, and it will appear visually disabled and disabled to accessibility
- * services.
+ *   not respond to user input, and it will appear visually disabled and disabled to accessibility
+ *   services.
  * @param readOnly controls the editable state of the text field. When `true`, the text field cannot
- * be modified. However, a user can focus it and copy text from it. Read-only text fields are
- * usually used to display pre-filled forms that a user cannot edit.
+ *   be modified. However, a user can focus it and copy text from it. Read-only text fields are
+ *   usually used to display pre-filled forms that a user cannot edit.
  * @param textStyle the style to be applied to the input text. Defaults to [LocalTextStyle].
- * @param label the optional label to be displayed inside the text field container. The default
- * text style for internal [Text] is [Typography.bodySmall] when the text field is in focus and
- * [Typography.bodyLarge] when the text field is not in focus
+ * @param label the optional label to be displayed inside the text field container. The default text
+ *   style for internal [Text] is [Typography.bodySmall] when the text field is in focus and
+ *   [Typography.bodyLarge] when the text field is not in focus
  * @param placeholder the optional placeholder to be displayed when the text field is in focus and
- * the input text is empty. The default text style for internal [Text] is [Typography.bodyLarge]
+ *   the input text is empty. The default text style for internal [Text] is [Typography.bodyLarge]
  * @param leadingIcon the optional leading icon to be displayed at the beginning of the text field
- * container
+ *   container
  * @param trailingIcon the optional trailing icon to be displayed at the end of the text field
- * container
+ *   container
  * @param prefix the optional prefix to be displayed before the input text in the text field
  * @param suffix the optional suffix to be displayed after the input text in the text field
  * @param supportingText the optional supporting text to be displayed below the text field
  * @param isError indicates if the text field's current value is in error. If set to true, the
- * label, bottom indicator and trailing icon by default will be displayed in error color
- * @param visualTransformation transforms the visual representation of the input [value]
- * For example, you can use
- * [PasswordVisualTransformation][androidx.compose.ui.text.input.PasswordVisualTransformation] to
- * create a password text field. By default, no visual transformation is applied.
+ *   label, bottom indicator and trailing icon by default will be displayed in error color
+ * @param visualTransformation transforms the visual representation of the input [value] For
+ *   example, you can use
+ *   [PasswordVisualTransformation][androidx.compose.ui.text.input.PasswordVisualTransformation] to
+ *   create a password text field. By default, no visual transformation is applied.
  * @param keyboardOptions software keyboard options that contains configuration such as
- * [KeyboardType] and [ImeAction].
- * @param keyboardActions when the input service emits an IME action, the corresponding callback
- * is called. Note that this IME action may be different from what you specified in
- * [KeyboardOptions.imeAction].
+ *   [KeyboardType] and [ImeAction].
+ * @param keyboardActions when the input service emits an IME action, the corresponding callback is
+ *   called. Note that this IME action may be different from what you specified in
+ *   [KeyboardOptions.imeAction].
  * @param singleLine when `true`, this text field becomes a single horizontally scrolling text field
- * instead of wrapping onto multiple lines. The keyboard will be informed to not show the return key
- * as the [ImeAction]. Note that [maxLines] parameter will be ignored as the maxLines attribute will
- * be automatically set to 1.
+ *   instead of wrapping onto multiple lines. The keyboard will be informed to not show the return
+ *   key as the [ImeAction]. Note that [maxLines] parameter will be ignored as the maxLines
+ *   attribute will be automatically set to 1.
  * @param maxLines the maximum height in terms of maximum number of visible lines. It is required
- * that 1 <= [minLines] <= [maxLines]. This parameter is ignored when [singleLine] is true.
+ *   that 1 <= [minLines] <= [maxLines]. This parameter is ignored when [singleLine] is true.
  * @param minLines the minimum height in terms of minimum number of visible lines. It is required
- * that 1 <= [minLines] <= [maxLines]. This parameter is ignored when [singleLine] is true.
+ *   that 1 <= [minLines] <= [maxLines]. This parameter is ignored when [singleLine] is true.
  * @param interactionSource an optional hoisted [MutableInteractionSource] for observing and
- * emitting [Interaction]s for this text field. You can use this to change the text field's
- * appearance or preview the text field in different states. Note that if `null` is provided,
- * interactions will still happen internally.
+ *   emitting [Interaction]s for this text field. You can use this to change the text field's
+ *   appearance or preview the text field in different states. Note that if `null` is provided,
+ *   interactions will still happen internally.
  * @param shape defines the shape of this text field's container
  * @param colors [TextFieldColors] that will be used to resolve the colors used for this text field
- * in different states. See [TextFieldDefaults.colors].
+ *   in different states. See [TextFieldDefaults.colors].
  */
 @OptIn(ExperimentalMaterial3Api::class)
 @Composable
@@ -219,21 +221,23 @@
     @Suppress("NAME_SHADOWING")
     val interactionSource = interactionSource ?: remember { MutableInteractionSource() }
     // If color is not provided via the text style, use content color as a default
-    val textColor = textStyle.color.takeOrElse {
-        val focused = interactionSource.collectIsFocusedAsState().value
-        colors.textColor(enabled, isError, focused)
-    }
+    val textColor =
+        textStyle.color.takeOrElse {
+            val focused = interactionSource.collectIsFocusedAsState().value
+            colors.textColor(enabled, isError, focused)
+        }
     val mergedTextStyle = textStyle.merge(TextStyle(color = textColor))
 
     CompositionLocalProvider(LocalTextSelectionColors provides colors.textSelectionColors) {
         BasicTextField(
             value = value,
-            modifier = modifier
-                .defaultErrorSemantics(isError, getString(Strings.DefaultErrorMessage))
-                .defaultMinSize(
-                    minWidth = TextFieldDefaults.MinWidth,
-                    minHeight = TextFieldDefaults.MinHeight
-                ),
+            modifier =
+                modifier
+                    .defaultErrorSemantics(isError, getString(Strings.DefaultErrorMessage))
+                    .defaultMinSize(
+                        minWidth = TextFieldDefaults.MinWidth,
+                        minHeight = TextFieldDefaults.MinHeight
+                    ),
             onValueChange = onValueChange,
             enabled = enabled,
             readOnly = readOnly,
@@ -246,98 +250,102 @@
             singleLine = singleLine,
             maxLines = maxLines,
             minLines = minLines,
-            decorationBox = @Composable { innerTextField ->
-                // places leading icon, text field with label and placeholder, trailing icon
-                TextFieldDefaults.DecorationBox(
-                    value = value,
-                    visualTransformation = visualTransformation,
-                    innerTextField = innerTextField,
-                    placeholder = placeholder,
-                    label = label,
-                    leadingIcon = leadingIcon,
-                    trailingIcon = trailingIcon,
-                    prefix = prefix,
-                    suffix = suffix,
-                    supportingText = supportingText,
-                    shape = shape,
-                    singleLine = singleLine,
-                    enabled = enabled,
-                    isError = isError,
-                    interactionSource = interactionSource,
-                    colors = colors
-                )
-            }
+            decorationBox =
+                @Composable { innerTextField ->
+                    // places leading icon, text field with label and placeholder, trailing icon
+                    TextFieldDefaults.DecorationBox(
+                        value = value,
+                        visualTransformation = visualTransformation,
+                        innerTextField = innerTextField,
+                        placeholder = placeholder,
+                        label = label,
+                        leadingIcon = leadingIcon,
+                        trailingIcon = trailingIcon,
+                        prefix = prefix,
+                        suffix = suffix,
+                        supportingText = supportingText,
+                        shape = shape,
+                        singleLine = singleLine,
+                        enabled = enabled,
+                        isError = isError,
+                        interactionSource = interactionSource,
+                        colors = colors
+                    )
+                }
         )
     }
 }
 
 /**
- * <a href="https://m3.material.io/components/text-fields/overview" class="external" target="_blank">Material Design filled text field</a>.
+ * <a href="https://m3.material.io/components/text-fields/overview" class="external"
+ * target="_blank">Material Design filled text field</a>.
  *
  * Text fields allow users to enter text into a UI. They typically appear in forms and dialogs.
  * Filled text fields have more visual emphasis than outlined text fields, making them stand out
  * when surrounded by other content and components.
  *
- * ![Filled text field image](https://developer.android.com/images/reference/androidx/compose/material3/filled-text-field.png)
+ * ![Filled text field
+ * image](https://developer.android.com/images/reference/androidx/compose/material3/filled-text-field.png)
  *
  * If you are looking for an outlined version, see [OutlinedTextField].
  *
  * See example usage:
+ *
  * @sample androidx.compose.material3.samples.TextFieldSample
  *
- * This overload provides access to the input text, cursor position, selection range and
- * IME composition. If you only want to observe an input text change, use the TextField
- * overload with the [String] parameter instead.
+ * This overload provides access to the input text, cursor position, selection range and IME
+ * composition. If you only want to observe an input text change, use the TextField overload with
+ * the [String] parameter instead.
  *
  * @param value the input [TextFieldValue] to be shown in the text field
  * @param onValueChange the callback that is triggered when the input service updates values in
- * [TextFieldValue]. An updated [TextFieldValue] comes as a parameter of the callback
+ *   [TextFieldValue]. An updated [TextFieldValue] comes as a parameter of the callback
  * @param modifier the [Modifier] to be applied to this text field
  * @param enabled controls the enabled state of this text field. When `false`, this component will
- * not respond to user input, and it will appear visually disabled and disabled to accessibility
- * services.
+ *   not respond to user input, and it will appear visually disabled and disabled to accessibility
+ *   services.
  * @param readOnly controls the editable state of the text field. When `true`, the text field cannot
- * be modified. However, a user can focus it and copy text from it. Read-only text fields are
- * usually used to display pre-filled forms that a user cannot edit.
+ *   be modified. However, a user can focus it and copy text from it. Read-only text fields are
+ *   usually used to display pre-filled forms that a user cannot edit.
  * @param textStyle the style to be applied to the input text. Defaults to [LocalTextStyle].
- * @param label the optional label to be displayed inside the text field container. The default
- * text style for internal [Text] is [Typography.bodySmall] when the text field is in focus and
- * [Typography.bodyLarge] when the text field is not in focus
+ * @param label the optional label to be displayed inside the text field container. The default text
+ *   style for internal [Text] is [Typography.bodySmall] when the text field is in focus and
+ *   [Typography.bodyLarge] when the text field is not in focus
  * @param placeholder the optional placeholder to be displayed when the text field is in focus and
- * the input text is empty. The default text style for internal [Text] is [Typography.bodyLarge]
+ *   the input text is empty. The default text style for internal [Text] is [Typography.bodyLarge]
  * @param leadingIcon the optional leading icon to be displayed at the beginning of the text field
- * container
+ *   container
  * @param trailingIcon the optional trailing icon to be displayed at the end of the text field
- * container
+ *   container
  * @param prefix the optional prefix to be displayed before the input text in the text field
  * @param suffix the optional suffix to be displayed after the input text in the text field
  * @param supportingText the optional supporting text to be displayed below the text field
- * @param isError indicates if the text field's current value is in error state. If set to
- * true, the label, bottom indicator and trailing icon by default will be displayed in error color
- * @param visualTransformation transforms the visual representation of the input [value].
- * For example, you can use
- * [PasswordVisualTransformation][androidx.compose.ui.text.input.PasswordVisualTransformation] to
- * create a password text field. By default, no visual transformation is applied.
+ * @param isError indicates if the text field's current value is in error state. If set to true, the
+ *   label, bottom indicator and trailing icon by default will be displayed in error color
+ * @param visualTransformation transforms the visual representation of the input [value]. For
+ *   example, you can use
+ *   [PasswordVisualTransformation][androidx.compose.ui.text.input.PasswordVisualTransformation] to
+ *   create a password text field. By default, no visual transformation is applied.
  * @param keyboardOptions software keyboard options that contains configuration such as
- * [KeyboardType] and [ImeAction].
- * @param keyboardActions when the input service emits an IME action, the corresponding callback
- * is called. Note that this IME action may be different from what you specified in
- * [KeyboardOptions.imeAction].
+ *   [KeyboardType] and [ImeAction].
+ * @param keyboardActions when the input service emits an IME action, the corresponding callback is
+ *   called. Note that this IME action may be different from what you specified in
+ *   [KeyboardOptions.imeAction].
  * @param singleLine when `true`, this text field becomes a single horizontally scrolling text field
- * instead of wrapping onto multiple lines. The keyboard will be informed to not show the return key
- * as the [ImeAction]. Note that [maxLines] parameter will be ignored as the maxLines attribute will
- * be automatically set to 1.
+ *   instead of wrapping onto multiple lines. The keyboard will be informed to not show the return
+ *   key as the [ImeAction]. Note that [maxLines] parameter will be ignored as the maxLines
+ *   attribute will be automatically set to 1.
  * @param maxLines the maximum height in terms of maximum number of visible lines. It is required
- * that 1 <= [minLines] <= [maxLines]. This parameter is ignored when [singleLine] is true.
+ *   that 1 <= [minLines] <= [maxLines]. This parameter is ignored when [singleLine] is true.
  * @param minLines the minimum height in terms of minimum number of visible lines. It is required
- * that 1 <= [minLines] <= [maxLines]. This parameter is ignored when [singleLine] is true.
+ *   that 1 <= [minLines] <= [maxLines]. This parameter is ignored when [singleLine] is true.
  * @param interactionSource an optional hoisted [MutableInteractionSource] for observing and
- * emitting [Interaction]s for this text field. You can use this to change the text field's
- * appearance or preview the text field in different states. Note that if `null` is provided,
- * interactions will still happen internally.
+ *   emitting [Interaction]s for this text field. You can use this to change the text field's
+ *   appearance or preview the text field in different states. Note that if `null` is provided,
+ *   interactions will still happen internally.
  * @param shape defines the shape of this text field's container
  * @param colors [TextFieldColors] that will be used to resolve the colors used for this text field
- * in different states. See [TextFieldDefaults.colors].
+ *   in different states. See [TextFieldDefaults.colors].
  */
 @OptIn(ExperimentalMaterial3Api::class)
 @Composable
@@ -369,21 +377,23 @@
     @Suppress("NAME_SHADOWING")
     val interactionSource = interactionSource ?: remember { MutableInteractionSource() }
     // If color is not provided via the text style, use content color as a default
-    val textColor = textStyle.color.takeOrElse {
-        val focused = interactionSource.collectIsFocusedAsState().value
-        colors.textColor(enabled, isError, focused)
-    }
+    val textColor =
+        textStyle.color.takeOrElse {
+            val focused = interactionSource.collectIsFocusedAsState().value
+            colors.textColor(enabled, isError, focused)
+        }
     val mergedTextStyle = textStyle.merge(TextStyle(color = textColor))
 
     CompositionLocalProvider(LocalTextSelectionColors provides colors.textSelectionColors) {
         BasicTextField(
             value = value,
-            modifier = modifier
-                .defaultErrorSemantics(isError, getString(Strings.DefaultErrorMessage))
-                .defaultMinSize(
-                    minWidth = TextFieldDefaults.MinWidth,
-                    minHeight = TextFieldDefaults.MinHeight
-                ),
+            modifier =
+                modifier
+                    .defaultErrorSemantics(isError, getString(Strings.DefaultErrorMessage))
+                    .defaultMinSize(
+                        minWidth = TextFieldDefaults.MinWidth,
+                        minHeight = TextFieldDefaults.MinHeight
+                    ),
             onValueChange = onValueChange,
             enabled = enabled,
             readOnly = readOnly,
@@ -396,27 +406,28 @@
             singleLine = singleLine,
             maxLines = maxLines,
             minLines = minLines,
-            decorationBox = @Composable { innerTextField ->
-                // places leading icon, text field with label and placeholder, trailing icon
-                TextFieldDefaults.DecorationBox(
-                    value = value.text,
-                    visualTransformation = visualTransformation,
-                    innerTextField = innerTextField,
-                    placeholder = placeholder,
-                    label = label,
-                    leadingIcon = leadingIcon,
-                    trailingIcon = trailingIcon,
-                    prefix = prefix,
-                    suffix = suffix,
-                    supportingText = supportingText,
-                    shape = shape,
-                    singleLine = singleLine,
-                    enabled = enabled,
-                    isError = isError,
-                    interactionSource = interactionSource,
-                    colors = colors
-                )
-            }
+            decorationBox =
+                @Composable { innerTextField ->
+                    // places leading icon, text field with label and placeholder, trailing icon
+                    TextFieldDefaults.DecorationBox(
+                        value = value.text,
+                        visualTransformation = visualTransformation,
+                        innerTextField = innerTextField,
+                        placeholder = placeholder,
+                        label = label,
+                        leadingIcon = leadingIcon,
+                        trailingIcon = trailingIcon,
+                        prefix = prefix,
+                        suffix = suffix,
+                        supportingText = supportingText,
+                        shape = shape,
+                        singleLine = singleLine,
+                        enabled = enabled,
+                        isError = isError,
+                        interactionSource = interactionSource,
+                        colors = colors
+                    )
+                }
         )
     }
 }
@@ -441,9 +452,10 @@
     supporting: @Composable (() -> Unit)?,
     paddingValues: PaddingValues
 ) {
-    val measurePolicy = remember(singleLine, animationProgress, paddingValues) {
-        TextFieldMeasurePolicy(singleLine, animationProgress, paddingValues)
-    }
+    val measurePolicy =
+        remember(singleLine, animationProgress, paddingValues) {
+            TextFieldMeasurePolicy(singleLine, animationProgress, paddingValues)
+        }
     val layoutDirection = LocalLayoutDirection.current
     Layout(
         modifier = modifier,
@@ -455,9 +467,7 @@
 
             if (leading != null) {
                 Box(
-                    modifier = Modifier
-                        .layoutId(LeadingId)
-                        .then(IconDefaultSizeModifier),
+                    modifier = Modifier.layoutId(LeadingId).then(IconDefaultSizeModifier),
                     contentAlignment = Alignment.Center
                 ) {
                     leading()
@@ -465,9 +475,7 @@
             }
             if (trailing != null) {
                 Box(
-                    modifier = Modifier
-                        .layoutId(TrailingId)
-                        .then(IconDefaultSizeModifier),
+                    modifier = Modifier.layoutId(TrailingId).then(IconDefaultSizeModifier),
                     contentAlignment = Alignment.Center
                 ) {
                     trailing()
@@ -477,21 +485,22 @@
             val startTextFieldPadding = paddingValues.calculateStartPadding(layoutDirection)
             val endTextFieldPadding = paddingValues.calculateEndPadding(layoutDirection)
 
-            val startPadding = if (leading != null) {
-                (startTextFieldPadding - HorizontalIconPadding).coerceAtLeast(0.dp)
-            } else {
-                startTextFieldPadding
-            }
-            val endPadding = if (trailing != null) {
-                (endTextFieldPadding - HorizontalIconPadding).coerceAtLeast(0.dp)
-            } else {
-                endTextFieldPadding
-            }
+            val startPadding =
+                if (leading != null) {
+                    (startTextFieldPadding - HorizontalIconPadding).coerceAtLeast(0.dp)
+                } else {
+                    startTextFieldPadding
+                }
+            val endPadding =
+                if (trailing != null) {
+                    (endTextFieldPadding - HorizontalIconPadding).coerceAtLeast(0.dp)
+                } else {
+                    endTextFieldPadding
+                }
 
             if (prefix != null) {
                 Box(
-                    Modifier
-                        .layoutId(PrefixId)
+                    Modifier.layoutId(PrefixId)
                         .heightIn(min = MinTextLineHeight)
                         .wrapContentHeight()
                         .padding(start = startPadding, end = PrefixSuffixTextPadding)
@@ -501,8 +510,7 @@
             }
             if (suffix != null) {
                 Box(
-                    Modifier
-                        .layoutId(SuffixId)
+                    Modifier.layoutId(SuffixId)
                         .heightIn(min = MinTextLineHeight)
                         .wrapContentHeight()
                         .padding(start = PrefixSuffixTextPadding, end = endPadding)
@@ -513,31 +521,35 @@
 
             if (label != null) {
                 Box(
-                    Modifier
-                        .layoutId(LabelId)
-                        .heightIn(min = lerp(
-                            MinTextLineHeight, MinFocusedLabelLineHeight, animationProgress))
+                    Modifier.layoutId(LabelId)
+                        .heightIn(
+                            min =
+                                lerp(
+                                    MinTextLineHeight,
+                                    MinFocusedLabelLineHeight,
+                                    animationProgress
+                                )
+                        )
                         .wrapContentHeight()
-                        .padding(start = startPadding, end = endPadding)) { label() }
+                        .padding(start = startPadding, end = endPadding)
+                ) {
+                    label()
+                }
             }
 
-            val textPadding = Modifier
-                .heightIn(min = MinTextLineHeight)
-                .wrapContentHeight()
-                .padding(
-                    start = if (prefix == null) startPadding else 0.dp,
-                    end = if (suffix == null) endPadding else 0.dp,
-                )
+            val textPadding =
+                Modifier.heightIn(min = MinTextLineHeight)
+                    .wrapContentHeight()
+                    .padding(
+                        start = if (prefix == null) startPadding else 0.dp,
+                        end = if (suffix == null) endPadding else 0.dp,
+                    )
 
             if (placeholder != null) {
-                placeholder(Modifier
-                    .layoutId(PlaceholderId)
-                    .then(textPadding))
+                placeholder(Modifier.layoutId(PlaceholderId).then(textPadding))
             }
             Box(
-                modifier = Modifier
-                    .layoutId(TextFieldId)
-                    .then(textPadding),
+                modifier = Modifier.layoutId(TextFieldId).then(textPadding),
                 propagateMinConstraints = true,
             ) {
                 textField()
@@ -545,12 +557,14 @@
 
             if (supporting != null) {
                 @OptIn(ExperimentalMaterial3Api::class)
-                Box(Modifier
-                    .layoutId(SupportingId)
-                    .heightIn(min = MinSupportingTextLineHeight)
-                    .wrapContentHeight()
-                    .padding(TextFieldDefaults.supportingTextPadding())
-                ) { supporting() }
+                Box(
+                    Modifier.layoutId(SupportingId)
+                        .heightIn(min = MinSupportingTextLineHeight)
+                        .wrapContentHeight()
+                        .padding(TextFieldDefaults.supportingTextPadding())
+                ) {
+                    supporting()
+                }
             }
         },
         measurePolicy = measurePolicy
@@ -581,26 +595,32 @@
         occupiedSpaceVertically = max(occupiedSpaceVertically, heightOrZero(leadingPlaceable))
 
         // measure trailing icon
-        val trailingPlaceable = measurables.fastFirstOrNull { it.layoutId == TrailingId }
-            ?.measure(looseConstraints.offset(horizontal = -occupiedSpaceHorizontally))
+        val trailingPlaceable =
+            measurables
+                .fastFirstOrNull { it.layoutId == TrailingId }
+                ?.measure(looseConstraints.offset(horizontal = -occupiedSpaceHorizontally))
         occupiedSpaceHorizontally += widthOrZero(trailingPlaceable)
         occupiedSpaceVertically = max(occupiedSpaceVertically, heightOrZero(trailingPlaceable))
 
         // measure prefix
-        val prefixPlaceable = measurables.fastFirstOrNull { it.layoutId == PrefixId }
-            ?.measure(looseConstraints.offset(horizontal = -occupiedSpaceHorizontally))
+        val prefixPlaceable =
+            measurables
+                .fastFirstOrNull { it.layoutId == PrefixId }
+                ?.measure(looseConstraints.offset(horizontal = -occupiedSpaceHorizontally))
         occupiedSpaceHorizontally += widthOrZero(prefixPlaceable)
         occupiedSpaceVertically = max(occupiedSpaceVertically, heightOrZero(prefixPlaceable))
 
         // measure suffix
-        val suffixPlaceable = measurables.fastFirstOrNull { it.layoutId == SuffixId }
-            ?.measure(looseConstraints.offset(horizontal = -occupiedSpaceHorizontally))
+        val suffixPlaceable =
+            measurables
+                .fastFirstOrNull { it.layoutId == SuffixId }
+                ?.measure(looseConstraints.offset(horizontal = -occupiedSpaceHorizontally))
         occupiedSpaceHorizontally += widthOrZero(suffixPlaceable)
         occupiedSpaceVertically = max(occupiedSpaceVertically, heightOrZero(suffixPlaceable))
 
         // measure label
-        val labelConstraints = looseConstraints
-            .offset(
+        val labelConstraints =
+            looseConstraints.offset(
                 vertical = -bottomPaddingValue,
                 horizontal = -occupiedSpaceHorizontally
             )
@@ -615,69 +635,78 @@
 
         // measure input field
         val effectiveTopOffset = topPaddingValue + heightOrZero(labelPlaceable)
-        val textFieldConstraints = constraints
-            .copy(minHeight = 0)
-            .offset(
-                vertical = -effectiveTopOffset - bottomPaddingValue - supportingIntrinsicHeight,
-                horizontal = -occupiedSpaceHorizontally
-            )
-        val textFieldPlaceable = measurables
-            .fastFirst { it.layoutId == TextFieldId }
-            .measure(textFieldConstraints)
+        val textFieldConstraints =
+            constraints
+                .copy(minHeight = 0)
+                .offset(
+                    vertical = -effectiveTopOffset - bottomPaddingValue - supportingIntrinsicHeight,
+                    horizontal = -occupiedSpaceHorizontally
+                )
+        val textFieldPlaceable =
+            measurables.fastFirst { it.layoutId == TextFieldId }.measure(textFieldConstraints)
 
         // measure placeholder
         val placeholderConstraints = textFieldConstraints.copy(minWidth = 0)
-        val placeholderPlaceable = measurables
-            .fastFirstOrNull { it.layoutId == PlaceholderId }
-            ?.measure(placeholderConstraints)
+        val placeholderPlaceable =
+            measurables
+                .fastFirstOrNull { it.layoutId == PlaceholderId }
+                ?.measure(placeholderConstraints)
 
-        occupiedSpaceVertically = max(
-            occupiedSpaceVertically,
-            max(heightOrZero(textFieldPlaceable), heightOrZero(placeholderPlaceable)) +
-                effectiveTopOffset + bottomPaddingValue
-        )
-        val width = calculateWidth(
-            leadingWidth = widthOrZero(leadingPlaceable),
-            trailingWidth = widthOrZero(trailingPlaceable),
-            prefixWidth = widthOrZero(prefixPlaceable),
-            suffixWidth = widthOrZero(suffixPlaceable),
-            textFieldWidth = textFieldPlaceable.width,
-            labelWidth = widthOrZero(labelPlaceable),
-            placeholderWidth = widthOrZero(placeholderPlaceable),
-            constraints = constraints,
-        )
+        occupiedSpaceVertically =
+            max(
+                occupiedSpaceVertically,
+                max(heightOrZero(textFieldPlaceable), heightOrZero(placeholderPlaceable)) +
+                    effectiveTopOffset +
+                    bottomPaddingValue
+            )
+        val width =
+            calculateWidth(
+                leadingWidth = widthOrZero(leadingPlaceable),
+                trailingWidth = widthOrZero(trailingPlaceable),
+                prefixWidth = widthOrZero(prefixPlaceable),
+                suffixWidth = widthOrZero(suffixPlaceable),
+                textFieldWidth = textFieldPlaceable.width,
+                labelWidth = widthOrZero(labelPlaceable),
+                placeholderWidth = widthOrZero(placeholderPlaceable),
+                constraints = constraints,
+            )
 
         // measure supporting text
-        val supportingConstraints = looseConstraints.offset(
-            vertical = -occupiedSpaceVertically
-        ).copy(minHeight = 0, maxWidth = width)
+        val supportingConstraints =
+            looseConstraints
+                .offset(vertical = -occupiedSpaceVertically)
+                .copy(minHeight = 0, maxWidth = width)
         val supportingPlaceable = supportingMeasurable?.measure(supportingConstraints)
         val supportingHeight = heightOrZero(supportingPlaceable)
 
-        val totalHeight = calculateHeight(
-            textFieldHeight = textFieldPlaceable.height,
-            labelHeight = heightOrZero(labelPlaceable),
-            leadingHeight = heightOrZero(leadingPlaceable),
-            trailingHeight = heightOrZero(trailingPlaceable),
-            prefixHeight = heightOrZero(prefixPlaceable),
-            suffixHeight = heightOrZero(suffixPlaceable),
-            placeholderHeight = heightOrZero(placeholderPlaceable),
-            supportingHeight = heightOrZero(supportingPlaceable),
-            animationProgress = animationProgress,
-            constraints = constraints,
-            density = density,
-            paddingValues = paddingValues,
-        )
+        val totalHeight =
+            calculateHeight(
+                textFieldHeight = textFieldPlaceable.height,
+                labelHeight = heightOrZero(labelPlaceable),
+                leadingHeight = heightOrZero(leadingPlaceable),
+                trailingHeight = heightOrZero(trailingPlaceable),
+                prefixHeight = heightOrZero(prefixPlaceable),
+                suffixHeight = heightOrZero(suffixPlaceable),
+                placeholderHeight = heightOrZero(placeholderPlaceable),
+                supportingHeight = heightOrZero(supportingPlaceable),
+                animationProgress = animationProgress,
+                constraints = constraints,
+                density = density,
+                paddingValues = paddingValues,
+            )
         val height = totalHeight - supportingHeight
 
-        val containerPlaceable = measurables.fastFirst { it.layoutId == ContainerId }.measure(
-            Constraints(
-                minWidth = if (width != Constraints.Infinity) width else 0,
-                maxWidth = width,
-                minHeight = if (height != Constraints.Infinity) height else 0,
-                maxHeight = height
-            )
-        )
+        val containerPlaceable =
+            measurables
+                .fastFirst { it.layoutId == ContainerId }
+                .measure(
+                    Constraints(
+                        minWidth = if (width != Constraints.Infinity) width else 0,
+                        maxWidth = width,
+                        minHeight = if (height != Constraints.Infinity) height else 0,
+                        maxHeight = height
+                    )
+                )
 
         return layout(width, totalHeight) {
             if (labelPlaceable != null) {
@@ -762,24 +791,30 @@
     ): Int {
         val textFieldWidth =
             intrinsicMeasurer(measurables.fastFirst { it.layoutId == TextFieldId }, height)
-        val labelWidth = measurables.fastFirstOrNull { it.layoutId == LabelId }?.let {
-            intrinsicMeasurer(it, height)
-        } ?: 0
-        val trailingWidth = measurables.fastFirstOrNull { it.layoutId == TrailingId }?.let {
-            intrinsicMeasurer(it, height)
-        } ?: 0
-        val prefixWidth = measurables.fastFirstOrNull { it.layoutId == PrefixId }?.let {
-            intrinsicMeasurer(it, height)
-        } ?: 0
-        val suffixWidth = measurables.fastFirstOrNull { it.layoutId == SuffixId }?.let {
-            intrinsicMeasurer(it, height)
-        } ?: 0
-        val leadingWidth = measurables.fastFirstOrNull { it.layoutId == LeadingId }?.let {
-            intrinsicMeasurer(it, height)
-        } ?: 0
-        val placeholderWidth = measurables.fastFirstOrNull { it.layoutId == PlaceholderId }?.let {
-            intrinsicMeasurer(it, height)
-        } ?: 0
+        val labelWidth =
+            measurables
+                .fastFirstOrNull { it.layoutId == LabelId }
+                ?.let { intrinsicMeasurer(it, height) } ?: 0
+        val trailingWidth =
+            measurables
+                .fastFirstOrNull { it.layoutId == TrailingId }
+                ?.let { intrinsicMeasurer(it, height) } ?: 0
+        val prefixWidth =
+            measurables
+                .fastFirstOrNull { it.layoutId == PrefixId }
+                ?.let { intrinsicMeasurer(it, height) } ?: 0
+        val suffixWidth =
+            measurables
+                .fastFirstOrNull { it.layoutId == SuffixId }
+                ?.let { intrinsicMeasurer(it, height) } ?: 0
+        val leadingWidth =
+            measurables
+                .fastFirstOrNull { it.layoutId == LeadingId }
+                ?.let { intrinsicMeasurer(it, height) } ?: 0
+        val placeholderWidth =
+            measurables
+                .fastFirstOrNull { it.layoutId == PlaceholderId }
+                ?.let { intrinsicMeasurer(it, height) } ?: 0
         return calculateWidth(
             leadingWidth = leadingWidth,
             trailingWidth = trailingWidth,
@@ -798,46 +833,65 @@
         intrinsicMeasurer: (IntrinsicMeasurable, Int) -> Int
     ): Int {
         var remainingWidth = width
-        val leadingHeight = measurables.fastFirstOrNull { it.layoutId == LeadingId }?.let {
-            remainingWidth = remainingWidth.substractConstraintSafely(
-                it.maxIntrinsicWidth(Constraints.Infinity)
-            )
-            intrinsicMeasurer(it, width)
-        } ?: 0
-        val trailingHeight = measurables.fastFirstOrNull { it.layoutId == TrailingId }?.let {
-            remainingWidth = remainingWidth.substractConstraintSafely(
-                it.maxIntrinsicWidth(Constraints.Infinity)
-            )
-            intrinsicMeasurer(it, width)
-        } ?: 0
-        val labelHeight = measurables.fastFirstOrNull { it.layoutId == LabelId }?.let {
-            intrinsicMeasurer(it, remainingWidth)
-        } ?: 0
+        val leadingHeight =
+            measurables
+                .fastFirstOrNull { it.layoutId == LeadingId }
+                ?.let {
+                    remainingWidth =
+                        remainingWidth.substractConstraintSafely(
+                            it.maxIntrinsicWidth(Constraints.Infinity)
+                        )
+                    intrinsicMeasurer(it, width)
+                } ?: 0
+        val trailingHeight =
+            measurables
+                .fastFirstOrNull { it.layoutId == TrailingId }
+                ?.let {
+                    remainingWidth =
+                        remainingWidth.substractConstraintSafely(
+                            it.maxIntrinsicWidth(Constraints.Infinity)
+                        )
+                    intrinsicMeasurer(it, width)
+                } ?: 0
+        val labelHeight =
+            measurables
+                .fastFirstOrNull { it.layoutId == LabelId }
+                ?.let { intrinsicMeasurer(it, remainingWidth) } ?: 0
 
-        val prefixHeight = measurables.fastFirstOrNull { it.layoutId == PrefixId }?.let {
-            val height = intrinsicMeasurer(it, remainingWidth)
-            remainingWidth = remainingWidth.substractConstraintSafely(
-                it.maxIntrinsicWidth(Constraints.Infinity)
-            )
-            height
-        } ?: 0
-        val suffixHeight = measurables.fastFirstOrNull { it.layoutId == SuffixId }?.let {
-            val height = intrinsicMeasurer(it, remainingWidth)
-            remainingWidth = remainingWidth.substractConstraintSafely(
-                it.maxIntrinsicWidth(Constraints.Infinity)
-            )
-            height
-        } ?: 0
+        val prefixHeight =
+            measurables
+                .fastFirstOrNull { it.layoutId == PrefixId }
+                ?.let {
+                    val height = intrinsicMeasurer(it, remainingWidth)
+                    remainingWidth =
+                        remainingWidth.substractConstraintSafely(
+                            it.maxIntrinsicWidth(Constraints.Infinity)
+                        )
+                    height
+                } ?: 0
+        val suffixHeight =
+            measurables
+                .fastFirstOrNull { it.layoutId == SuffixId }
+                ?.let {
+                    val height = intrinsicMeasurer(it, remainingWidth)
+                    remainingWidth =
+                        remainingWidth.substractConstraintSafely(
+                            it.maxIntrinsicWidth(Constraints.Infinity)
+                        )
+                    height
+                } ?: 0
 
         val textFieldHeight =
             intrinsicMeasurer(measurables.fastFirst { it.layoutId == TextFieldId }, remainingWidth)
-        val placeholderHeight = measurables.fastFirstOrNull { it.layoutId == PlaceholderId }?.let {
-            intrinsicMeasurer(it, remainingWidth)
-        } ?: 0
+        val placeholderHeight =
+            measurables
+                .fastFirstOrNull { it.layoutId == PlaceholderId }
+                ?.let { intrinsicMeasurer(it, remainingWidth) } ?: 0
 
-        val supportingHeight = measurables.fastFirstOrNull { it.layoutId == SupportingId }?.let {
-            intrinsicMeasurer(it, width)
-        } ?: 0
+        val supportingHeight =
+            measurables
+                .fastFirstOrNull { it.layoutId == SupportingId }
+                ?.let { intrinsicMeasurer(it, width) } ?: 0
 
         return calculateHeight(
             textFieldHeight = textFieldHeight,
@@ -874,12 +928,13 @@
     constraints: Constraints
 ): Int {
     val affixTotalWidth = prefixWidth + suffixWidth
-    val middleSection = maxOf(
-        textFieldWidth + affixTotalWidth,
-        placeholderWidth + affixTotalWidth,
-        // Prefix/suffix does not get applied to label
-        labelWidth,
-    )
+    val middleSection =
+        maxOf(
+            textFieldWidth + affixTotalWidth,
+            placeholderWidth + affixTotalWidth,
+            // Prefix/suffix does not get applied to label
+            labelWidth,
+        )
     val wrappedWidth = leadingWidth + middleSection + trailingWidth
     return max(wrappedWidth, constraints.minWidth)
 }
@@ -900,34 +955,33 @@
 ): Int {
     val hasLabel = labelHeight > 0
 
-    val verticalPadding = density *
-        (paddingValues.calculateTopPadding() + paddingValues.calculateBottomPadding()).value
+    val verticalPadding =
+        density *
+            (paddingValues.calculateTopPadding() + paddingValues.calculateBottomPadding()).value
     // Even though the padding is defined by the developer, if there's a label, it only affects the
     // text field in the focused state. Otherwise, we use the default value.
-    val actualVerticalPadding = if (hasLabel) {
-        lerp((TextFieldPadding * 2).value * density, verticalPadding, animationProgress)
-    } else {
-        verticalPadding
-    }
+    val actualVerticalPadding =
+        if (hasLabel) {
+            lerp((TextFieldPadding * 2).value * density, verticalPadding, animationProgress)
+        } else {
+            verticalPadding
+        }
 
-    val inputFieldHeight = maxOf(
-        textFieldHeight,
-        placeholderHeight,
-        prefixHeight,
-        suffixHeight,
-        lerp(labelHeight, 0, animationProgress)
-    )
+    val inputFieldHeight =
+        maxOf(
+            textFieldHeight,
+            placeholderHeight,
+            prefixHeight,
+            suffixHeight,
+            lerp(labelHeight, 0, animationProgress)
+        )
 
     val middleSectionHeight =
         actualVerticalPadding + lerp(0, labelHeight, animationProgress) + inputFieldHeight
 
     return max(
         constraints.minHeight,
-        maxOf(
-            leadingHeight,
-            trailingHeight,
-            middleSectionHeight.roundToInt()
-        ) + supportingHeight
+        maxOf(leadingHeight, trailingHeight, middleSectionHeight.roundToInt()) + supportingHeight
     )
 }
 
@@ -968,13 +1022,15 @@
         // if it's a single line, the label's start position is in the center of the
         // container. When it's a multiline text field, the label's start position is at the
         // top with padding
-        val startPosition = if (singleLine) {
-            Alignment.CenterVertically.align(it.height, height)
-        } else {
-            // Even though the padding is defined by the developer, it only affects the text field
-            // when the text field is focused. Otherwise, we use the default value.
-            (TextFieldPadding.value * density).roundToInt()
-        }
+        val startPosition =
+            if (singleLine) {
+                Alignment.CenterVertically.align(it.height, height)
+            } else {
+                // Even though the padding is defined by the developer, it only affects the text
+                // field
+                // when the text field is focused. Otherwise, we use the default value.
+                (TextFieldPadding.value * density).roundToInt()
+            }
         val distance = startPosition - labelEndPosition
         val positionY = startPosition - (distance * animationProgress).roundToInt()
         it.placeRelative(widthOrZero(leadingPlaceable), positionY)
@@ -1000,8 +1056,8 @@
 }
 
 /**
- * Places the provided text field and placeholder in [TextField] when there is no label. When
- * there is a label, [placeWithLabel] is used
+ * Places the provided text field and placeholder in [TextField] when there is no label. When there
+ * is a label, [placeWithLabel] is used
  */
 private fun Placeable.PlacementScope.placeWithoutLabel(
     width: Int,
@@ -1068,20 +1124,13 @@
     supportingPlaceable?.placeRelative(0, height)
 }
 
-/**
- * A draw modifier that draws a bottom indicator line in [TextField]
- */
+/** A draw modifier that draws a bottom indicator line in [TextField] */
 internal fun Modifier.drawIndicatorLine(indicatorBorder: State<BorderStroke>): Modifier {
     return drawWithContent {
         drawContent()
         val strokeWidth = indicatorBorder.value.width.toPx()
         val y = size.height - strokeWidth / 2
-        drawLine(
-            indicatorBorder.value.brush,
-            Offset(0f, y),
-            Offset(size.width, y),
-            strokeWidth
-        )
+        drawLine(indicatorBorder.value.brush, Offset(0f, y), Offset(size.width, y), strokeWidth)
     }
 }
 
diff --git a/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/TextFieldDefaults.kt b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/TextFieldDefaults.kt
index 96612a6..e07731f 100644
--- a/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/TextFieldDefaults.kt
+++ b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/TextFieldDefaults.kt
@@ -57,47 +57,44 @@
 @Immutable
 object TextFieldDefaults {
     /** Default shape for a [TextField]. */
-    val shape: Shape @Composable get() = FilledTextFieldTokens.ContainerShape.value
+    val shape: Shape
+        @Composable get() = FilledTextFieldTokens.ContainerShape.value
 
     /**
-     * The default min height applied to a [TextField].
-     * Note that you can override it by applying Modifier.heightIn directly on a text field.
+     * The default min height applied to a [TextField]. Note that you can override it by applying
+     * Modifier.heightIn directly on a text field.
      */
     val MinHeight = 56.dp
 
     /**
-     * The default min width applied to a [TextField].
-     * Note that you can override it by applying Modifier.widthIn directly on a text field.
+     * The default min width applied to a [TextField]. Note that you can override it by applying
+     * Modifier.widthIn directly on a text field.
      */
     val MinWidth = 280.dp
 
-    /**
-     * The default thickness of the indicator line in [TextField] in unfocused state.
-     */
+    /** The default thickness of the indicator line in [TextField] in unfocused state. */
     val UnfocusedIndicatorThickness = 1.dp
 
-    /**
-     * The default thickness of the indicator line in [TextField] in focused state.
-     */
+    /** The default thickness of the indicator line in [TextField] in focused state. */
     val FocusedIndicatorThickness = 2.dp
 
     /**
      * Composable that draws a default container for a [TextField] with an indicator line at the
      * bottom. You can apply it to a [BasicTextField] using [DecorationBox] to create a custom text
-     * field based on the styling of a Material filled text field. The [TextField] component
-     * applies it automatically.
+     * field based on the styling of a Material filled text field. The [TextField] component applies
+     * it automatically.
      *
      * @param enabled whether the text field is enabled
      * @param isError whether the text field's current value is in error
-     * @param interactionSource the [InteractionSource] of the text field. Used to determine if
-     * the text field is in focus or not
+     * @param interactionSource the [InteractionSource] of the text field. Used to determine if the
+     *   text field is in focus or not
      * @param modifier the [Modifier] of this container
      * @param colors [TextFieldColors] used to resolve colors of the text field
      * @param shape the shape of this container
      * @param focusedIndicatorLineThickness thickness of the indicator line when the text field is
-     * focused
+     *   focused
      * @param unfocusedIndicatorLineThickness thickness of the indicator line when the text field is
-     * not focused
+     *   not focused
      */
     @ExperimentalMaterial3Api
     @Composable
@@ -112,10 +109,11 @@
         unfocusedIndicatorLineThickness: Dp = UnfocusedIndicatorThickness,
     ) {
         val focused = interactionSource.collectIsFocusedAsState().value
-        val containerColor = animateColorAsState(
-            targetValue = colors.containerColor(enabled, isError, focused),
-            animationSpec = tween(durationMillis = TextFieldAnimationDuration),
-        )
+        val containerColor =
+            animateColorAsState(
+                targetValue = colors.containerColor(enabled, isError, focused),
+                animationSpec = tween(durationMillis = TextFieldAnimationDuration),
+            )
         Box(
             modifier
                 .textFieldBackground(containerColor::value, shape)
@@ -132,21 +130,21 @@
 
     /**
      * A modifier to draw a default bottom indicator line for [TextField]. You can apply it to a
-     * [BasicTextField] or to [DecorationBox] to create a custom text field based on the styling
-     * of a Material filled text field.
+     * [BasicTextField] or to [DecorationBox] to create a custom text field based on the styling of
+     * a Material filled text field.
      *
      * Consider using [Container], which automatically applies this modifier as well as other text
      * field container styling.
      *
      * @param enabled whether the text field is enabled
      * @param isError whether the text field's current value is in error
-     * @param interactionSource the [InteractionSource] of the text field. Used to determine if
-     * the text field is in focus or not
+     * @param interactionSource the [InteractionSource] of the text field. Used to determine if the
+     *   text field is in focus or not
      * @param colors [TextFieldColors] used to resolve colors of the text field
      * @param focusedIndicatorLineThickness thickness of the indicator line when the text field is
-     * focused
+     *   focused
      * @param unfocusedIndicatorLineThickness thickness of the indicator line when the text field is
-     * not focused
+     *   not focused
      */
     @ExperimentalMaterial3Api
     fun Modifier.indicatorLine(
@@ -156,81 +154,88 @@
         colors: TextFieldColors,
         focusedIndicatorLineThickness: Dp = FocusedIndicatorThickness,
         unfocusedIndicatorLineThickness: Dp = UnfocusedIndicatorThickness
-    ) = composed(inspectorInfo = debugInspectorInfo {
-        name = "indicatorLine"
-        properties["enabled"] = enabled
-        properties["isError"] = isError
-        properties["interactionSource"] = interactionSource
-        properties["colors"] = colors
-        properties["focusedIndicatorLineThickness"] = focusedIndicatorLineThickness
-        properties["unfocusedIndicatorLineThickness"] = unfocusedIndicatorLineThickness
-    }) {
-        val focused = interactionSource.collectIsFocusedAsState().value
-        val stroke = animateBorderStrokeAsState(
-            enabled,
-            isError,
-            focused,
-            colors,
-            focusedIndicatorLineThickness,
-            unfocusedIndicatorLineThickness
-        )
-        Modifier.drawIndicatorLine(stroke)
-    }
+    ) =
+        composed(
+            inspectorInfo =
+                debugInspectorInfo {
+                    name = "indicatorLine"
+                    properties["enabled"] = enabled
+                    properties["isError"] = isError
+                    properties["interactionSource"] = interactionSource
+                    properties["colors"] = colors
+                    properties["focusedIndicatorLineThickness"] = focusedIndicatorLineThickness
+                    properties["unfocusedIndicatorLineThickness"] = unfocusedIndicatorLineThickness
+                }
+        ) {
+            val focused = interactionSource.collectIsFocusedAsState().value
+            val stroke =
+                animateBorderStrokeAsState(
+                    enabled,
+                    isError,
+                    focused,
+                    colors,
+                    focusedIndicatorLineThickness,
+                    unfocusedIndicatorLineThickness
+                )
+            Modifier.drawIndicatorLine(stroke)
+        }
 
     /**
-     * A decoration box used to create custom text fields based on
-     * <a href="https://m3.material.io/components/text-fields/overview" class="external" target="_blank">Material Design filled text field</a>.
+     * A decoration box used to create custom text fields based on <a
+     * href="https://m3.material.io/components/text-fields/overview" class="external"
+     * target="_blank">Material Design filled text field</a>.
      *
-     * If your text field requires customising elements that aren't exposed by [TextField],
-     * consider using this decoration box to achieve the desired design.
+     * If your text field requires customising elements that aren't exposed by [TextField], consider
+     * using this decoration box to achieve the desired design.
      *
      * For example, if you wish to customise the bottom indicator line, you can pass a custom
      * [Container] to this decoration box's [container].
      *
      * An example of building a custom text field using [DecorationBox]:
+     *
      * @sample androidx.compose.material3.samples.CustomTextFieldBasedOnDecorationBox
      *
      * @param value the input [String] shown by the text field
      * @param innerTextField input text field that this decoration box wraps. You will pass here a
-     * framework-controlled composable parameter "innerTextField" from the decorationBox lambda of
-     * the [BasicTextField]
+     *   framework-controlled composable parameter "innerTextField" from the decorationBox lambda of
+     *   the [BasicTextField]
      * @param enabled the enabled state of the text field. When `false`, this decoration box will
-     * appear visually disabled. This must be the same value that is passed to [BasicTextField].
+     *   appear visually disabled. This must be the same value that is passed to [BasicTextField].
      * @param singleLine indicates if this is a single line or multi line text field. This must be
-     * the same value that is passed to [BasicTextField].
+     *   the same value that is passed to [BasicTextField].
      * @param visualTransformation transforms the visual representation of the input [value]. This
-     * must be the same value that is passed to [BasicTextField].
+     *   must be the same value that is passed to [BasicTextField].
      * @param interactionSource the read-only [InteractionSource] representing the stream of
-     * [Interaction]s for this text field. You must first create and pass in your own `remember`ed
-     * [MutableInteractionSource] instance to the [BasicTextField] for it to dispatch events. And
-     * then pass the same instance to this decoration box to observe [Interaction]s and customize
-     * the appearance / behavior of this text field in different states.
+     *   [Interaction]s for this text field. You must first create and pass in your own `remember`ed
+     *   [MutableInteractionSource] instance to the [BasicTextField] for it to dispatch events. And
+     *   then pass the same instance to this decoration box to observe [Interaction]s and customize
+     *   the appearance / behavior of this text field in different states.
      * @param isError indicates if the text field's current value is in an error state. When `true`,
-     * this decoration box will display its contents in an error color.
+     *   this decoration box will display its contents in an error color.
      * @param label the optional label to be displayed inside the text field container. The default
-     * text style for internal [Text] is [Typography.bodySmall] when the text field is in focus and
-     * [Typography.bodyLarge] when the text field is not in focus.
+     *   text style for internal [Text] is [Typography.bodySmall] when the text field is in focus
+     *   and [Typography.bodyLarge] when the text field is not in focus.
      * @param placeholder the optional placeholder to be displayed when the text field is in focus
-     * and the input text is empty. The default text style for internal [Text] is
-     * [Typography.bodyLarge].
+     *   and the input text is empty. The default text style for internal [Text] is
+     *   [Typography.bodyLarge].
      * @param leadingIcon the optional leading icon to be displayed at the beginning of the text
-     * field container
+     *   field container
      * @param trailingIcon the optional trailing icon to be displayed at the end of the text field
-     * container
+     *   container
      * @param prefix the optional prefix to be displayed before the input text in the text field
      * @param suffix the optional suffix to be displayed after the input text in the text field
      * @param supportingText the optional supporting text to be displayed below the text field
      * @param shape defines the shape of this decoration box's container
      * @param colors [TextFieldColors] that will be used to resolve the colors used for this text
-     * field decoration box in different states. See [TextFieldDefaults.colors].
+     *   field decoration box in different states. See [TextFieldDefaults.colors].
      * @param contentPadding the padding applied between the internal elements of this decoration
-     * box and the edge of its container. If a [label] is present, the top padding represents
-     * the distance from the top edge of the container to the top of the label when the text field
-     * is focused. When [label] is null, the top padding represents the distance from the top edge
-     * of the container to the top of the input field. All other paddings represent the distance
-     * from the edge of the container to the corresponding edge of the closest element.
+     *   box and the edge of its container. If a [label] is present, the top padding represents the
+     *   distance from the top edge of the container to the top of the label when the text field is
+     *   focused. When [label] is null, the top padding represents the distance from the top edge of
+     *   the container to the top of the input field. All other paddings represent the distance from
+     *   the edge of the container to the corresponding edge of the closest element.
      * @param container the container to be drawn behind the text field. By default, this uses
-     * [Container]. Default colors for the container come from the [colors].
+     *   [Container]. Default colors for the container come from the [colors].
      */
     @Composable
     @ExperimentalMaterial3Api
@@ -305,9 +310,7 @@
         bottom: Dp = TextFieldWithLabelVerticalPadding
     ): PaddingValues = PaddingValues(start, top, end, bottom)
 
-    /**
-     * Default content padding applied to [TextField] when the label is null.
-     */
+    /** Default content padding applied to [TextField] when the label is null. */
     fun contentPaddingWithoutLabel(
         start: Dp = TextFieldPadding,
         top: Dp = TextFieldPadding,
@@ -316,8 +319,8 @@
     ): PaddingValues = PaddingValues(start, top, end, bottom)
 
     /**
-     * Default padding applied to supporting text for both [TextField] and [OutlinedTextField].
-     * See [PaddingValues] for more details.
+     * Default padding applied to supporting text for both [TextField] and [OutlinedTextField]. See
+     * [PaddingValues] for more details.
      */
     // TODO(246775477): consider making this public
     internal fun supportingTextPadding(
@@ -331,8 +334,7 @@
      * Creates a [TextFieldColors] that represents the default input text, container, and content
      * colors (including label, placeholder, icons, etc.) used in a [TextField].
      */
-    @Composable
-    fun colors() = MaterialTheme.colorScheme.defaultTextFieldColors
+    @Composable fun colors() = MaterialTheme.colorScheme.defaultTextFieldColors
 
     /**
      * Creates a [TextFieldColors] that represents the default input text, container, and content
@@ -340,10 +342,10 @@
      *
      * @param focusedTextColor the color used for the input text of this text field when focused
      * @param unfocusedTextColor the color used for the input text of this text field when not
-     * focused
+     *   focused
      * @param disabledTextColor the color used for the input text of this text field when disabled
      * @param errorTextColor the color used for the input text of this text field when in error
-     * state
+     *   state
      * @param focusedContainerColor the container color for this text field when focused
      * @param unfocusedContainerColor the container color for this text field when not focused
      * @param disabledContainerColor the container color for this text field when disabled
@@ -361,7 +363,7 @@
      * @param errorLeadingIconColor the leading icon color for this text field when in error state
      * @param focusedTrailingIconColor the trailing icon color for this text field when focused
      * @param unfocusedTrailingIconColor the trailing icon color for this text field when not
-     * focused
+     *   focused
      * @param disabledTrailingIconColor the trailing icon color for this text field when disabled
      * @param errorTrailingIconColor the trailing icon color for this text field when in error state
      * @param focusedLabelColor the label color for this text field when focused
@@ -374,11 +376,11 @@
      * @param errorPlaceholderColor the placeholder color for this text field when in error state
      * @param focusedSupportingTextColor the supporting text color for this text field when focused
      * @param unfocusedSupportingTextColor the supporting text color for this text field when not
-     * focused
+     *   focused
      * @param disabledSupportingTextColor the supporting text color for this text field when
-     * disabled
+     *   disabled
      * @param errorSupportingTextColor the supporting text color for this text field when in error
-     * state
+     *   state
      * @param focusedPrefixColor the prefix color for this text field when focused
      * @param unfocusedPrefixColor the prefix color for this text field when not focused
      * @param disabledPrefixColor the prefix color for this text field when disabled
@@ -433,7 +435,8 @@
         unfocusedSuffixColor: Color = Color.Unspecified,
         disabledSuffixColor: Color = Color.Unspecified,
         errorSuffixColor: Color = Color.Unspecified,
-    ): TextFieldColors = MaterialTheme.colorScheme.defaultTextFieldColors.copy(
+    ): TextFieldColors =
+        MaterialTheme.colorScheme.defaultTextFieldColors.copy(
             focusedTextColor = focusedTextColor,
             unfocusedTextColor = unfocusedTextColor,
             disabledTextColor = disabledTextColor,
@@ -482,76 +485,100 @@
     internal val ColorScheme.defaultTextFieldColors: TextFieldColors
         @Composable
         get() {
-            return defaultTextFieldColorsCached ?: TextFieldColors(
-                focusedTextColor = fromToken(FilledTextFieldTokens.FocusInputColor),
-                unfocusedTextColor = fromToken(FilledTextFieldTokens.InputColor),
-                disabledTextColor = fromToken(FilledTextFieldTokens.DisabledInputColor)
-                    .copy(alpha = FilledTextFieldTokens.DisabledInputOpacity),
-                errorTextColor = fromToken(FilledTextFieldTokens.ErrorInputColor),
-                focusedContainerColor = fromToken(FilledTextFieldTokens.ContainerColor),
-                unfocusedContainerColor = fromToken(FilledTextFieldTokens.ContainerColor),
-                disabledContainerColor = fromToken(FilledTextFieldTokens.ContainerColor),
-                errorContainerColor = fromToken(FilledTextFieldTokens.ContainerColor),
-                cursorColor = fromToken(FilledTextFieldTokens.CaretColor),
-                errorCursorColor = fromToken(FilledTextFieldTokens.ErrorFocusCaretColor),
-                textSelectionColors = LocalTextSelectionColors.current,
-                focusedIndicatorColor = fromToken(FilledTextFieldTokens.FocusActiveIndicatorColor),
-                unfocusedIndicatorColor = fromToken(FilledTextFieldTokens.ActiveIndicatorColor),
-                disabledIndicatorColor =
-                fromToken(FilledTextFieldTokens.DisabledActiveIndicatorColor)
-                    .copy(alpha = FilledTextFieldTokens.DisabledActiveIndicatorOpacity),
-                errorIndicatorColor = fromToken(FilledTextFieldTokens.ErrorActiveIndicatorColor),
-                focusedLeadingIconColor = fromToken(FilledTextFieldTokens.FocusLeadingIconColor),
-                unfocusedLeadingIconColor = fromToken(FilledTextFieldTokens.LeadingIconColor),
-                disabledLeadingIconColor = fromToken(FilledTextFieldTokens.DisabledLeadingIconColor)
-                    .copy(alpha = FilledTextFieldTokens.DisabledLeadingIconOpacity),
-                errorLeadingIconColor = fromToken(FilledTextFieldTokens.ErrorLeadingIconColor),
-                focusedTrailingIconColor = fromToken(FilledTextFieldTokens.FocusTrailingIconColor),
-                unfocusedTrailingIconColor = fromToken(FilledTextFieldTokens.TrailingIconColor),
-                disabledTrailingIconColor =
-                fromToken(FilledTextFieldTokens.DisabledTrailingIconColor)
-                    .copy(alpha = FilledTextFieldTokens.DisabledTrailingIconOpacity),
-                errorTrailingIconColor = fromToken(FilledTextFieldTokens.ErrorTrailingIconColor),
-                focusedLabelColor = fromToken(FilledTextFieldTokens.FocusLabelColor),
-                unfocusedLabelColor = fromToken(FilledTextFieldTokens.LabelColor),
-                disabledLabelColor = fromToken(FilledTextFieldTokens.DisabledLabelColor)
-                    .copy(alpha = FilledTextFieldTokens.DisabledLabelOpacity),
-                errorLabelColor = fromToken(FilledTextFieldTokens.ErrorLabelColor),
-                focusedPlaceholderColor = fromToken(FilledTextFieldTokens.InputPlaceholderColor),
-                unfocusedPlaceholderColor = fromToken(FilledTextFieldTokens.InputPlaceholderColor),
-                disabledPlaceholderColor = fromToken(FilledTextFieldTokens.DisabledInputColor)
-                    .copy(alpha = FilledTextFieldTokens.DisabledInputOpacity),
-                errorPlaceholderColor = fromToken(FilledTextFieldTokens.InputPlaceholderColor),
-                focusedSupportingTextColor = fromToken(FilledTextFieldTokens.FocusSupportingColor),
-                unfocusedSupportingTextColor = fromToken(FilledTextFieldTokens.SupportingColor),
-                disabledSupportingTextColor =
-                fromToken(FilledTextFieldTokens.DisabledSupportingColor)
-                    .copy(alpha = FilledTextFieldTokens.DisabledSupportingOpacity),
-                errorSupportingTextColor = fromToken(FilledTextFieldTokens.ErrorSupportingColor),
-                focusedPrefixColor = fromToken(FilledTextFieldTokens.InputPrefixColor),
-                unfocusedPrefixColor = fromToken(FilledTextFieldTokens.InputPrefixColor),
-                disabledPrefixColor = fromToken(FilledTextFieldTokens.InputPrefixColor)
-                    .copy(alpha = FilledTextFieldTokens.DisabledInputOpacity),
-                errorPrefixColor = fromToken(FilledTextFieldTokens.InputPrefixColor),
-                focusedSuffixColor = fromToken(FilledTextFieldTokens.InputSuffixColor),
-                unfocusedSuffixColor = fromToken(FilledTextFieldTokens.InputSuffixColor),
-                disabledSuffixColor = fromToken(FilledTextFieldTokens.InputSuffixColor)
-                    .copy(alpha = FilledTextFieldTokens.DisabledInputOpacity),
-                errorSuffixColor = fromToken(FilledTextFieldTokens.InputSuffixColor),
-            ).also {
-                defaultTextFieldColorsCached = it
-            }
+            return defaultTextFieldColorsCached
+                ?: TextFieldColors(
+                        focusedTextColor = fromToken(FilledTextFieldTokens.FocusInputColor),
+                        unfocusedTextColor = fromToken(FilledTextFieldTokens.InputColor),
+                        disabledTextColor =
+                            fromToken(FilledTextFieldTokens.DisabledInputColor)
+                                .copy(alpha = FilledTextFieldTokens.DisabledInputOpacity),
+                        errorTextColor = fromToken(FilledTextFieldTokens.ErrorInputColor),
+                        focusedContainerColor = fromToken(FilledTextFieldTokens.ContainerColor),
+                        unfocusedContainerColor = fromToken(FilledTextFieldTokens.ContainerColor),
+                        disabledContainerColor = fromToken(FilledTextFieldTokens.ContainerColor),
+                        errorContainerColor = fromToken(FilledTextFieldTokens.ContainerColor),
+                        cursorColor = fromToken(FilledTextFieldTokens.CaretColor),
+                        errorCursorColor = fromToken(FilledTextFieldTokens.ErrorFocusCaretColor),
+                        textSelectionColors = LocalTextSelectionColors.current,
+                        focusedIndicatorColor =
+                            fromToken(FilledTextFieldTokens.FocusActiveIndicatorColor),
+                        unfocusedIndicatorColor =
+                            fromToken(FilledTextFieldTokens.ActiveIndicatorColor),
+                        disabledIndicatorColor =
+                            fromToken(FilledTextFieldTokens.DisabledActiveIndicatorColor)
+                                .copy(alpha = FilledTextFieldTokens.DisabledActiveIndicatorOpacity),
+                        errorIndicatorColor =
+                            fromToken(FilledTextFieldTokens.ErrorActiveIndicatorColor),
+                        focusedLeadingIconColor =
+                            fromToken(FilledTextFieldTokens.FocusLeadingIconColor),
+                        unfocusedLeadingIconColor =
+                            fromToken(FilledTextFieldTokens.LeadingIconColor),
+                        disabledLeadingIconColor =
+                            fromToken(FilledTextFieldTokens.DisabledLeadingIconColor)
+                                .copy(alpha = FilledTextFieldTokens.DisabledLeadingIconOpacity),
+                        errorLeadingIconColor =
+                            fromToken(FilledTextFieldTokens.ErrorLeadingIconColor),
+                        focusedTrailingIconColor =
+                            fromToken(FilledTextFieldTokens.FocusTrailingIconColor),
+                        unfocusedTrailingIconColor =
+                            fromToken(FilledTextFieldTokens.TrailingIconColor),
+                        disabledTrailingIconColor =
+                            fromToken(FilledTextFieldTokens.DisabledTrailingIconColor)
+                                .copy(alpha = FilledTextFieldTokens.DisabledTrailingIconOpacity),
+                        errorTrailingIconColor =
+                            fromToken(FilledTextFieldTokens.ErrorTrailingIconColor),
+                        focusedLabelColor = fromToken(FilledTextFieldTokens.FocusLabelColor),
+                        unfocusedLabelColor = fromToken(FilledTextFieldTokens.LabelColor),
+                        disabledLabelColor =
+                            fromToken(FilledTextFieldTokens.DisabledLabelColor)
+                                .copy(alpha = FilledTextFieldTokens.DisabledLabelOpacity),
+                        errorLabelColor = fromToken(FilledTextFieldTokens.ErrorLabelColor),
+                        focusedPlaceholderColor =
+                            fromToken(FilledTextFieldTokens.InputPlaceholderColor),
+                        unfocusedPlaceholderColor =
+                            fromToken(FilledTextFieldTokens.InputPlaceholderColor),
+                        disabledPlaceholderColor =
+                            fromToken(FilledTextFieldTokens.DisabledInputColor)
+                                .copy(alpha = FilledTextFieldTokens.DisabledInputOpacity),
+                        errorPlaceholderColor =
+                            fromToken(FilledTextFieldTokens.InputPlaceholderColor),
+                        focusedSupportingTextColor =
+                            fromToken(FilledTextFieldTokens.FocusSupportingColor),
+                        unfocusedSupportingTextColor =
+                            fromToken(FilledTextFieldTokens.SupportingColor),
+                        disabledSupportingTextColor =
+                            fromToken(FilledTextFieldTokens.DisabledSupportingColor)
+                                .copy(alpha = FilledTextFieldTokens.DisabledSupportingOpacity),
+                        errorSupportingTextColor =
+                            fromToken(FilledTextFieldTokens.ErrorSupportingColor),
+                        focusedPrefixColor = fromToken(FilledTextFieldTokens.InputPrefixColor),
+                        unfocusedPrefixColor = fromToken(FilledTextFieldTokens.InputPrefixColor),
+                        disabledPrefixColor =
+                            fromToken(FilledTextFieldTokens.InputPrefixColor)
+                                .copy(alpha = FilledTextFieldTokens.DisabledInputOpacity),
+                        errorPrefixColor = fromToken(FilledTextFieldTokens.InputPrefixColor),
+                        focusedSuffixColor = fromToken(FilledTextFieldTokens.InputSuffixColor),
+                        unfocusedSuffixColor = fromToken(FilledTextFieldTokens.InputSuffixColor),
+                        disabledSuffixColor =
+                            fromToken(FilledTextFieldTokens.InputSuffixColor)
+                                .copy(alpha = FilledTextFieldTokens.DisabledInputOpacity),
+                        errorSuffixColor = fromToken(FilledTextFieldTokens.InputSuffixColor),
+                    )
+                    .also { defaultTextFieldColorsCached = it }
         }
 
     @Deprecated(
         message = "Renamed to TextFieldDefaults.Container",
-        replaceWith = ReplaceWith("Container(\n" +
-            "    enabled = enabled,\n" +
-            "    isError = isError,\n" +
-            "    interactionSource = interactionSource,\n" +
-            "    colors = colors,\n" +
-            "    shape = shape,\n" +
-            ")"),
+        replaceWith =
+            ReplaceWith(
+                "Container(\n" +
+                    "    enabled = enabled,\n" +
+                    "    isError = isError,\n" +
+                    "    interactionSource = interactionSource,\n" +
+                    "    colors = colors,\n" +
+                    "    shape = shape,\n" +
+                    ")"
+            ),
         level = DeprecationLevel.WARNING
     )
     @ExperimentalMaterial3Api
@@ -562,43 +589,51 @@
         interactionSource: InteractionSource,
         colors: TextFieldColors,
         shape: Shape = TextFieldDefaults.shape,
-    ) = Container(
-        enabled = enabled,
-        isError = isError,
-        interactionSource = interactionSource,
-        modifier = Modifier,
-        colors = colors,
-        shape = shape,
-        focusedIndicatorLineThickness = FocusedIndicatorThickness,
-        unfocusedIndicatorLineThickness = UnfocusedIndicatorThickness,
-    )
+    ) =
+        Container(
+            enabled = enabled,
+            isError = isError,
+            interactionSource = interactionSource,
+            modifier = Modifier,
+            colors = colors,
+            shape = shape,
+            focusedIndicatorLineThickness = FocusedIndicatorThickness,
+            unfocusedIndicatorLineThickness = UnfocusedIndicatorThickness,
+        )
 
     @Deprecated(
         message = "Renamed to `OutlinedTextFieldDefaults.shape`",
-        replaceWith = ReplaceWith("OutlinedTextFieldDefaults.shape",
-            "androidx.compose.material.OutlinedTextFieldDefaults"),
+        replaceWith =
+            ReplaceWith(
+                "OutlinedTextFieldDefaults.shape",
+                "androidx.compose.material.OutlinedTextFieldDefaults"
+            ),
         level = DeprecationLevel.WARNING
     )
-    val outlinedShape: Shape @Composable get() = OutlinedTextFieldDefaults.shape
+    val outlinedShape: Shape
+        @Composable get() = OutlinedTextFieldDefaults.shape
 
     @Deprecated(
         message = "Renamed to `TextFieldDefaults.shape`",
         replaceWith = ReplaceWith("TextFieldDefaults.shape"),
         level = DeprecationLevel.WARNING
     )
-    val filledShape: Shape @Composable get() = shape
+    val filledShape: Shape
+        @Composable get() = shape
 
     @Deprecated(
-        message = "Split into `TextFieldDefaults.UnfocusedIndicatorThickness` and " +
-            "`OutlinedTextFieldDefaults.UnfocusedBorderThickness`. Please update as appropriate.",
+        message =
+            "Split into `TextFieldDefaults.UnfocusedIndicatorThickness` and " +
+                "`OutlinedTextFieldDefaults.UnfocusedBorderThickness`. Please update as appropriate.",
         replaceWith = ReplaceWith("TextFieldDefaults.UnfocusedIndicatorThickness"),
         level = DeprecationLevel.WARNING,
     )
     val UnfocusedBorderThickness = UnfocusedIndicatorThickness
 
     @Deprecated(
-        message = "Split into `TextFieldDefaults.FocusedIndicatorThickness` and " +
-            "`OutlinedTextFieldDefaults.FocusedBorderThickness`. Please update as appropriate.",
+        message =
+            "Split into `TextFieldDefaults.FocusedIndicatorThickness` and " +
+                "`OutlinedTextFieldDefaults.FocusedBorderThickness`. Please update as appropriate.",
         replaceWith = ReplaceWith("TextFieldDefaults.FocusedIndicatorThickness"),
         level = DeprecationLevel.WARNING,
     )
@@ -606,12 +641,15 @@
 
     @Deprecated(
         message = "Renamed to `TextFieldDefaults.contentPaddingWithLabel`",
-        replaceWith = ReplaceWith("TextFieldDefaults.contentPaddingWithLabel(\n" +
-            "        start = start,\n" +
-            "        top = top,\n" +
-            "        end = end,\n" +
-            "        bottom = bottom,\n" +
-            "    )"),
+        replaceWith =
+            ReplaceWith(
+                "TextFieldDefaults.contentPaddingWithLabel(\n" +
+                    "        start = start,\n" +
+                    "        top = top,\n" +
+                    "        end = end,\n" +
+                    "        bottom = bottom,\n" +
+                    "    )"
+            ),
         level = DeprecationLevel.WARNING
     )
     fun textFieldWithLabelPadding(
@@ -619,21 +657,25 @@
         end: Dp = TextFieldPadding,
         top: Dp = TextFieldWithLabelVerticalPadding,
         bottom: Dp = TextFieldWithLabelVerticalPadding
-    ): PaddingValues = contentPaddingWithLabel(
-        start = start,
-        top = top,
-        end = end,
-        bottom = bottom,
-    )
+    ): PaddingValues =
+        contentPaddingWithLabel(
+            start = start,
+            top = top,
+            end = end,
+            bottom = bottom,
+        )
 
     @Deprecated(
         message = "Renamed to `TextFieldDefaults.contentPaddingWithoutLabel`",
-        replaceWith = ReplaceWith("TextFieldDefaults.contentPaddingWithoutLabel(\n" +
-            "        start = start,\n" +
-            "        top = top,\n" +
-            "        end = end,\n" +
-            "        bottom = bottom,\n" +
-            "    )"),
+        replaceWith =
+            ReplaceWith(
+                "TextFieldDefaults.contentPaddingWithoutLabel(\n" +
+                    "        start = start,\n" +
+                    "        top = top,\n" +
+                    "        end = end,\n" +
+                    "        bottom = bottom,\n" +
+                    "    )"
+            ),
         level = DeprecationLevel.WARNING
     )
     fun textFieldWithoutLabelPadding(
@@ -641,22 +683,26 @@
         top: Dp = TextFieldPadding,
         end: Dp = TextFieldPadding,
         bottom: Dp = TextFieldPadding
-    ): PaddingValues = contentPaddingWithoutLabel(
-        start = start,
-        top = top,
-        end = end,
-        bottom = bottom,
-    )
+    ): PaddingValues =
+        contentPaddingWithoutLabel(
+            start = start,
+            top = top,
+            end = end,
+            bottom = bottom,
+        )
 
     @Deprecated(
         message = "Renamed to `OutlinedTextFieldDefaults.contentPadding`",
-        replaceWith = ReplaceWith("OutlinedTextFieldDefaults.contentPadding(\n" +
-            "        start = start,\n" +
-            "        top = top,\n" +
-            "        end = end,\n" +
-            "        bottom = bottom,\n" +
-            "    )",
-            "androidx.compose.material.OutlinedTextFieldDefaults"),
+        replaceWith =
+            ReplaceWith(
+                "OutlinedTextFieldDefaults.contentPadding(\n" +
+                    "        start = start,\n" +
+                    "        top = top,\n" +
+                    "        end = end,\n" +
+                    "        bottom = bottom,\n" +
+                    "    )",
+                "androidx.compose.material.OutlinedTextFieldDefaults"
+            ),
         level = DeprecationLevel.WARNING
     )
     fun outlinedTextFieldPadding(
@@ -664,12 +710,13 @@
         top: Dp = TextFieldPadding,
         end: Dp = TextFieldPadding,
         bottom: Dp = TextFieldPadding
-    ): PaddingValues = OutlinedTextFieldDefaults.contentPadding(
-        start = start,
-        top = top,
-        end = end,
-        bottom = bottom,
-    )
+    ): PaddingValues =
+        OutlinedTextFieldDefaults.contentPadding(
+            start = start,
+            top = top,
+            end = end,
+            bottom = bottom,
+        )
 }
 
 /**
@@ -679,28 +726,25 @@
 @Immutable
 object OutlinedTextFieldDefaults {
     /** Default shape for an [OutlinedTextField]. */
-    val shape: Shape @Composable get() = OutlinedTextFieldTokens.ContainerShape.value
+    val shape: Shape
+        @Composable get() = OutlinedTextFieldTokens.ContainerShape.value
 
     /**
-     * The default min height applied to an [OutlinedTextField].
-     * Note that you can override it by applying Modifier.heightIn directly on a text field.
+     * The default min height applied to an [OutlinedTextField]. Note that you can override it by
+     * applying Modifier.heightIn directly on a text field.
      */
     val MinHeight = 56.dp
 
     /**
-     * The default min width applied to an [OutlinedTextField].
-     * Note that you can override it by applying Modifier.widthIn directly on a text field.
+     * The default min width applied to an [OutlinedTextField]. Note that you can override it by
+     * applying Modifier.widthIn directly on a text field.
      */
     val MinWidth = 280.dp
 
-    /**
-     * The default thickness of the border in [OutlinedTextField] in unfocused state.
-     */
+    /** The default thickness of the border in [OutlinedTextField] in unfocused state. */
     val UnfocusedBorderThickness = 1.dp
 
-    /**
-     * The default thickness of the border in [OutlinedTextField] in focused state.
-     */
+    /** The default thickness of the border in [OutlinedTextField] in focused state. */
     val FocusedBorderThickness = 2.dp
 
     /**
@@ -711,8 +755,8 @@
      *
      * @param enabled whether the text field is enabled
      * @param isError whether the text field's current value is in error
-     * @param interactionSource the [InteractionSource] of the text field. Used to determine if
-     * the text field is in focus or not
+     * @param interactionSource the [InteractionSource] of the text field. Used to determine if the
+     *   text field is in focus or not
      * @param modifier the [Modifier] of this container
      * @param colors [TextFieldColors] used to resolve colors of the text field
      * @param shape the shape of this container
@@ -732,18 +776,20 @@
         unfocusedBorderThickness: Dp = UnfocusedBorderThickness,
     ) {
         val focused = interactionSource.collectIsFocusedAsState().value
-        val borderStroke = animateBorderStrokeAsState(
-            enabled,
-            isError,
-            focused,
-            colors,
-            focusedBorderThickness,
-            unfocusedBorderThickness,
-        )
-        val containerColor = animateColorAsState(
-            targetValue = colors.containerColor(enabled, isError, focused),
-            animationSpec = tween(durationMillis = TextFieldAnimationDuration),
-        )
+        val borderStroke =
+            animateBorderStrokeAsState(
+                enabled,
+                isError,
+                focused,
+                colors,
+                focusedBorderThickness,
+                unfocusedBorderThickness,
+            )
+        val containerColor =
+            animateColorAsState(
+                targetValue = colors.containerColor(enabled, isError, focused),
+                animationSpec = tween(durationMillis = TextFieldAnimationDuration),
+            )
         Box(
             modifier
                 .border(borderStroke.value, shape)
@@ -752,8 +798,9 @@
     }
 
     /**
-     * A decoration box used to create custom text fields based on
-     * <a href="https://m3.material.io/components/text-fields/overview" class="external" target="_blank">Material Design outlined text field</a>.
+     * A decoration box used to create custom text fields based on <a
+     * href="https://m3.material.io/components/text-fields/overview" class="external"
+     * target="_blank">Material Design outlined text field</a>.
      *
      * If your text field requires customising elements that aren't exposed by [OutlinedTextField],
      * consider using this decoration box to achieve the desired design.
@@ -762,46 +809,47 @@
      * [Container] to this decoration box's [container].
      *
      * An example of building a custom text field using [DecorationBox]:
+     *
      * @sample androidx.compose.material3.samples.CustomOutlinedTextFieldBasedOnDecorationBox
      *
      * @param value the input [String] shown by the text field
      * @param innerTextField input text field that this decoration box wraps. You will pass here a
-     * framework-controlled composable parameter "innerTextField" from the decorationBox lambda of
-     * the [BasicTextField]
+     *   framework-controlled composable parameter "innerTextField" from the decorationBox lambda of
+     *   the [BasicTextField]
      * @param enabled the enabled state of the text field. When `false`, this decoration box will
-     * appear visually disabled. This must be the same value that is passed to [BasicTextField].
+     *   appear visually disabled. This must be the same value that is passed to [BasicTextField].
      * @param singleLine indicates if this is a single line or multi line text field. This must be
-     * the same value that is passed to [BasicTextField].
+     *   the same value that is passed to [BasicTextField].
      * @param visualTransformation transforms the visual representation of the input [value]. This
-     * must be the same value that is passed to [BasicTextField].
+     *   must be the same value that is passed to [BasicTextField].
      * @param interactionSource the read-only [InteractionSource] representing the stream of
-     * [Interaction]s for this text field. You must first create and pass in your own `remember`ed
-     * [MutableInteractionSource] instance to the [BasicTextField] for it to dispatch events. And
-     * then pass the same instance to this decoration box to observe [Interaction]s and customize
-     * the appearance / behavior of this text field in different states.
+     *   [Interaction]s for this text field. You must first create and pass in your own `remember`ed
+     *   [MutableInteractionSource] instance to the [BasicTextField] for it to dispatch events. And
+     *   then pass the same instance to this decoration box to observe [Interaction]s and customize
+     *   the appearance / behavior of this text field in different states.
      * @param isError indicates if the text field's current value is in an error state. When `true`,
-     * this decoration box will display its contents in an error color.
+     *   this decoration box will display its contents in an error color.
      * @param label the optional label to be displayed inside the text field container. The default
-     * text style for internal [Text] is [Typography.bodySmall] when the text field is in focus and
-     * [Typography.bodyLarge] when the text field is not in focus.
+     *   text style for internal [Text] is [Typography.bodySmall] when the text field is in focus
+     *   and [Typography.bodyLarge] when the text field is not in focus.
      * @param placeholder the optional placeholder to be displayed when the text field is in focus
-     * and the input text is empty. The default text style for internal [Text] is
-     * [Typography.bodyLarge].
+     *   and the input text is empty. The default text style for internal [Text] is
+     *   [Typography.bodyLarge].
      * @param leadingIcon the optional leading icon to be displayed at the beginning of the text
-     * field container
+     *   field container
      * @param trailingIcon the optional trailing icon to be displayed at the end of the text field
-     * container
+     *   container
      * @param prefix the optional prefix to be displayed before the input text in the text field
      * @param suffix the optional suffix to be displayed after the input text in the text field
      * @param supportingText the optional supporting text to be displayed below the text field
      * @param colors [TextFieldColors] that will be used to resolve the colors used for this text
-     * field in different states. See [OutlinedTextFieldDefaults.colors].
+     *   field in different states. See [OutlinedTextFieldDefaults.colors].
      * @param contentPadding the padding applied between the internal elements of this decoration
-     * box and the edge of its container
+     *   box and the edge of its container
      * @param container the container to be drawn behind the text field. By default, this is
-     * transparent and only includes a border. The cutout in the border to fit the [label] will be
-     * automatically added by the framework. Default colors for the container come from the
-     * [colors].
+     *   transparent and only includes a border. The cutout in the border to fit the [label] will be
+     *   automatically added by the framework. Default colors for the container come from the
+     *   [colors].
      */
     @Composable
     @ExperimentalMaterial3Api
@@ -858,8 +906,7 @@
     }
 
     /**
-     * Default content padding applied to [OutlinedTextField].
-     * See [PaddingValues] for more details.
+     * Default content padding applied to [OutlinedTextField]. See [PaddingValues] for more details.
      */
     fun contentPadding(
         start: Dp = TextFieldPadding,
@@ -872,8 +919,7 @@
      * Creates a [TextFieldColors] that represents the default input text, container, and content
      * colors (including label, placeholder, icons, etc.) used in an [OutlinedTextField].
      */
-    @Composable
-    fun colors() = MaterialTheme.colorScheme.defaultOutlinedTextFieldColors
+    @Composable fun colors() = MaterialTheme.colorScheme.defaultOutlinedTextFieldColors
 
     /**
      * Creates a [TextFieldColors] that represents the default input text, container, and content
@@ -881,10 +927,10 @@
      *
      * @param focusedTextColor the color used for the input text of this text field when focused
      * @param unfocusedTextColor the color used for the input text of this text field when not
-     * focused
+     *   focused
      * @param disabledTextColor the color used for the input text of this text field when disabled
      * @param errorTextColor the color used for the input text of this text field when in error
-     * state
+     *   state
      * @param focusedContainerColor the container color for this text field when focused
      * @param unfocusedContainerColor the container color for this text field when not focused
      * @param disabledContainerColor the container color for this text field when disabled
@@ -901,7 +947,8 @@
      * @param disabledLeadingIconColor the leading icon color for this text field when disabled
      * @param errorLeadingIconColor the leading icon color for this text field when in error state
      * @param focusedTrailingIconColor the trailing icon color for this text field when focused
-     * @param unfocusedTrailingIconColor the trailing icon color for this text field when not focused
+     * @param unfocusedTrailingIconColor the trailing icon color for this text field when not
+     *   focused
      * @param disabledTrailingIconColor the trailing icon color for this text field when disabled
      * @param errorTrailingIconColor the trailing icon color for this text field when in error state
      * @param focusedLabelColor the label color for this text field when focused
@@ -914,11 +961,11 @@
      * @param errorPlaceholderColor the placeholder color for this text field when in error state
      * @param focusedSupportingTextColor the supporting text color for this text field when focused
      * @param unfocusedSupportingTextColor the supporting text color for this text field when not
-     * focused
+     *   focused
      * @param disabledSupportingTextColor the supporting text color for this text field when
-     * disabled
+     *   disabled
      * @param errorSupportingTextColor the supporting text color for this text field when in error
-     * state
+     *   state
      * @param focusedPrefixColor the prefix color for this text field when focused
      * @param unfocusedPrefixColor the prefix color for this text field when not focused
      * @param disabledPrefixColor the prefix color for this text field when disabled
@@ -1023,81 +1070,100 @@
     internal val ColorScheme.defaultOutlinedTextFieldColors: TextFieldColors
         @Composable
         get() {
-            return defaultOutlinedTextFieldColorsCached ?: TextFieldColors(
-                focusedTextColor = fromToken(OutlinedTextFieldTokens.FocusInputColor),
-                unfocusedTextColor = fromToken(OutlinedTextFieldTokens.InputColor),
-                disabledTextColor = fromToken(OutlinedTextFieldTokens.DisabledInputColor)
-                    .copy(alpha = OutlinedTextFieldTokens.DisabledInputOpacity),
-                errorTextColor = fromToken(OutlinedTextFieldTokens.ErrorInputColor),
-                focusedContainerColor = Color.Transparent,
-                unfocusedContainerColor = Color.Transparent,
-                disabledContainerColor = Color.Transparent,
-                errorContainerColor = Color.Transparent,
-                cursorColor = fromToken(OutlinedTextFieldTokens.CaretColor),
-                errorCursorColor = fromToken(OutlinedTextFieldTokens.ErrorFocusCaretColor),
-                textSelectionColors = LocalTextSelectionColors.current,
-                focusedIndicatorColor = fromToken(OutlinedTextFieldTokens.FocusOutlineColor),
-                unfocusedIndicatorColor = fromToken(OutlinedTextFieldTokens.OutlineColor),
-                disabledIndicatorColor = fromToken(OutlinedTextFieldTokens.DisabledOutlineColor)
-                    .copy(alpha = OutlinedTextFieldTokens.DisabledOutlineOpacity),
-                errorIndicatorColor = fromToken(OutlinedTextFieldTokens.ErrorOutlineColor),
-                focusedLeadingIconColor = fromToken(OutlinedTextFieldTokens.FocusLeadingIconColor),
-                unfocusedLeadingIconColor = fromToken(OutlinedTextFieldTokens.LeadingIconColor),
-                disabledLeadingIconColor =
-                fromToken(OutlinedTextFieldTokens.DisabledLeadingIconColor)
-                    .copy(alpha = OutlinedTextFieldTokens.DisabledLeadingIconOpacity),
-                errorLeadingIconColor = fromToken(OutlinedTextFieldTokens.ErrorLeadingIconColor),
-                focusedTrailingIconColor =
-                fromToken(OutlinedTextFieldTokens.FocusTrailingIconColor),
-                unfocusedTrailingIconColor = fromToken(OutlinedTextFieldTokens.TrailingIconColor),
-                disabledTrailingIconColor =
-                fromToken(OutlinedTextFieldTokens.DisabledTrailingIconColor)
-                    .copy(alpha = OutlinedTextFieldTokens.DisabledTrailingIconOpacity),
-                errorTrailingIconColor = fromToken(OutlinedTextFieldTokens.ErrorTrailingIconColor),
-                focusedLabelColor = fromToken(OutlinedTextFieldTokens.FocusLabelColor),
-                unfocusedLabelColor = fromToken(OutlinedTextFieldTokens.LabelColor),
-                disabledLabelColor = fromToken(OutlinedTextFieldTokens.DisabledLabelColor)
-                    .copy(alpha = OutlinedTextFieldTokens.DisabledLabelOpacity),
-                errorLabelColor = fromToken(OutlinedTextFieldTokens.ErrorLabelColor),
-                focusedPlaceholderColor = fromToken(OutlinedTextFieldTokens.InputPlaceholderColor),
-                unfocusedPlaceholderColor =
-                fromToken(OutlinedTextFieldTokens.InputPlaceholderColor),
-                disabledPlaceholderColor = fromToken(OutlinedTextFieldTokens.DisabledInputColor)
-                    .copy(alpha = OutlinedTextFieldTokens.DisabledInputOpacity),
-                errorPlaceholderColor = fromToken(OutlinedTextFieldTokens.InputPlaceholderColor),
-                focusedSupportingTextColor =
-                fromToken(OutlinedTextFieldTokens.FocusSupportingColor),
-                unfocusedSupportingTextColor = fromToken(OutlinedTextFieldTokens.SupportingColor),
-                disabledSupportingTextColor =
-                fromToken(OutlinedTextFieldTokens.DisabledSupportingColor)
-                    .copy(alpha = OutlinedTextFieldTokens.DisabledSupportingOpacity),
-                errorSupportingTextColor = fromToken(OutlinedTextFieldTokens.ErrorSupportingColor),
-                focusedPrefixColor = fromToken(OutlinedTextFieldTokens.InputPrefixColor),
-                unfocusedPrefixColor = fromToken(OutlinedTextFieldTokens.InputPrefixColor),
-                disabledPrefixColor = fromToken(OutlinedTextFieldTokens.InputPrefixColor)
-                    .copy(alpha = OutlinedTextFieldTokens.DisabledInputOpacity),
-                errorPrefixColor = fromToken(OutlinedTextFieldTokens.InputPrefixColor),
-                focusedSuffixColor = fromToken(OutlinedTextFieldTokens.InputSuffixColor),
-                unfocusedSuffixColor = fromToken(OutlinedTextFieldTokens.InputSuffixColor),
-                disabledSuffixColor = fromToken(OutlinedTextFieldTokens.InputSuffixColor)
-                    .copy(alpha = OutlinedTextFieldTokens.DisabledInputOpacity),
-                errorSuffixColor = fromToken(OutlinedTextFieldTokens.InputSuffixColor)
-            ).also {
-                defaultOutlinedTextFieldColorsCached = it
-            }
+            return defaultOutlinedTextFieldColorsCached
+                ?: TextFieldColors(
+                        focusedTextColor = fromToken(OutlinedTextFieldTokens.FocusInputColor),
+                        unfocusedTextColor = fromToken(OutlinedTextFieldTokens.InputColor),
+                        disabledTextColor =
+                            fromToken(OutlinedTextFieldTokens.DisabledInputColor)
+                                .copy(alpha = OutlinedTextFieldTokens.DisabledInputOpacity),
+                        errorTextColor = fromToken(OutlinedTextFieldTokens.ErrorInputColor),
+                        focusedContainerColor = Color.Transparent,
+                        unfocusedContainerColor = Color.Transparent,
+                        disabledContainerColor = Color.Transparent,
+                        errorContainerColor = Color.Transparent,
+                        cursorColor = fromToken(OutlinedTextFieldTokens.CaretColor),
+                        errorCursorColor = fromToken(OutlinedTextFieldTokens.ErrorFocusCaretColor),
+                        textSelectionColors = LocalTextSelectionColors.current,
+                        focusedIndicatorColor =
+                            fromToken(OutlinedTextFieldTokens.FocusOutlineColor),
+                        unfocusedIndicatorColor = fromToken(OutlinedTextFieldTokens.OutlineColor),
+                        disabledIndicatorColor =
+                            fromToken(OutlinedTextFieldTokens.DisabledOutlineColor)
+                                .copy(alpha = OutlinedTextFieldTokens.DisabledOutlineOpacity),
+                        errorIndicatorColor = fromToken(OutlinedTextFieldTokens.ErrorOutlineColor),
+                        focusedLeadingIconColor =
+                            fromToken(OutlinedTextFieldTokens.FocusLeadingIconColor),
+                        unfocusedLeadingIconColor =
+                            fromToken(OutlinedTextFieldTokens.LeadingIconColor),
+                        disabledLeadingIconColor =
+                            fromToken(OutlinedTextFieldTokens.DisabledLeadingIconColor)
+                                .copy(alpha = OutlinedTextFieldTokens.DisabledLeadingIconOpacity),
+                        errorLeadingIconColor =
+                            fromToken(OutlinedTextFieldTokens.ErrorLeadingIconColor),
+                        focusedTrailingIconColor =
+                            fromToken(OutlinedTextFieldTokens.FocusTrailingIconColor),
+                        unfocusedTrailingIconColor =
+                            fromToken(OutlinedTextFieldTokens.TrailingIconColor),
+                        disabledTrailingIconColor =
+                            fromToken(OutlinedTextFieldTokens.DisabledTrailingIconColor)
+                                .copy(alpha = OutlinedTextFieldTokens.DisabledTrailingIconOpacity),
+                        errorTrailingIconColor =
+                            fromToken(OutlinedTextFieldTokens.ErrorTrailingIconColor),
+                        focusedLabelColor = fromToken(OutlinedTextFieldTokens.FocusLabelColor),
+                        unfocusedLabelColor = fromToken(OutlinedTextFieldTokens.LabelColor),
+                        disabledLabelColor =
+                            fromToken(OutlinedTextFieldTokens.DisabledLabelColor)
+                                .copy(alpha = OutlinedTextFieldTokens.DisabledLabelOpacity),
+                        errorLabelColor = fromToken(OutlinedTextFieldTokens.ErrorLabelColor),
+                        focusedPlaceholderColor =
+                            fromToken(OutlinedTextFieldTokens.InputPlaceholderColor),
+                        unfocusedPlaceholderColor =
+                            fromToken(OutlinedTextFieldTokens.InputPlaceholderColor),
+                        disabledPlaceholderColor =
+                            fromToken(OutlinedTextFieldTokens.DisabledInputColor)
+                                .copy(alpha = OutlinedTextFieldTokens.DisabledInputOpacity),
+                        errorPlaceholderColor =
+                            fromToken(OutlinedTextFieldTokens.InputPlaceholderColor),
+                        focusedSupportingTextColor =
+                            fromToken(OutlinedTextFieldTokens.FocusSupportingColor),
+                        unfocusedSupportingTextColor =
+                            fromToken(OutlinedTextFieldTokens.SupportingColor),
+                        disabledSupportingTextColor =
+                            fromToken(OutlinedTextFieldTokens.DisabledSupportingColor)
+                                .copy(alpha = OutlinedTextFieldTokens.DisabledSupportingOpacity),
+                        errorSupportingTextColor =
+                            fromToken(OutlinedTextFieldTokens.ErrorSupportingColor),
+                        focusedPrefixColor = fromToken(OutlinedTextFieldTokens.InputPrefixColor),
+                        unfocusedPrefixColor = fromToken(OutlinedTextFieldTokens.InputPrefixColor),
+                        disabledPrefixColor =
+                            fromToken(OutlinedTextFieldTokens.InputPrefixColor)
+                                .copy(alpha = OutlinedTextFieldTokens.DisabledInputOpacity),
+                        errorPrefixColor = fromToken(OutlinedTextFieldTokens.InputPrefixColor),
+                        focusedSuffixColor = fromToken(OutlinedTextFieldTokens.InputSuffixColor),
+                        unfocusedSuffixColor = fromToken(OutlinedTextFieldTokens.InputSuffixColor),
+                        disabledSuffixColor =
+                            fromToken(OutlinedTextFieldTokens.InputSuffixColor)
+                                .copy(alpha = OutlinedTextFieldTokens.DisabledInputOpacity),
+                        errorSuffixColor = fromToken(OutlinedTextFieldTokens.InputSuffixColor)
+                    )
+                    .also { defaultOutlinedTextFieldColorsCached = it }
         }
 
     @Deprecated(
         message = "Renamed to OutlinedTextFieldDefaults.Container",
-        replaceWith = ReplaceWith("Container(\n" +
-            "    enabled = enabled,\n" +
-            "    isError = isError,\n" +
-            "    interactionSource = interactionSource,\n" +
-            "    colors = colors,\n" +
-            "    shape = shape,\n" +
-            "    focusedBorderThickness = focusedBorderThickness,\n" +
-            "    unfocusedBorderThickness = unfocusedBorderThickness,\n" +
-            ")"),
+        replaceWith =
+            ReplaceWith(
+                "Container(\n" +
+                    "    enabled = enabled,\n" +
+                    "    isError = isError,\n" +
+                    "    interactionSource = interactionSource,\n" +
+                    "    colors = colors,\n" +
+                    "    shape = shape,\n" +
+                    "    focusedBorderThickness = focusedBorderThickness,\n" +
+                    "    unfocusedBorderThickness = unfocusedBorderThickness,\n" +
+                    ")"
+            ),
         level = DeprecationLevel.WARNING
     )
     @ExperimentalMaterial3Api
@@ -1110,32 +1176,27 @@
         shape: Shape = OutlinedTextFieldDefaults.shape,
         focusedBorderThickness: Dp = FocusedBorderThickness,
         unfocusedBorderThickness: Dp = UnfocusedBorderThickness,
-    ) = Container(
-        enabled = enabled,
-        isError = isError,
-        interactionSource = interactionSource,
-        modifier = Modifier,
-        colors = colors,
-        shape = shape,
-        focusedBorderThickness = focusedBorderThickness,
-        unfocusedBorderThickness = unfocusedBorderThickness,
-    )
+    ) =
+        Container(
+            enabled = enabled,
+            isError = isError,
+            interactionSource = interactionSource,
+            modifier = Modifier,
+            colors = colors,
+            shape = shape,
+            focusedBorderThickness = focusedBorderThickness,
+            unfocusedBorderThickness = unfocusedBorderThickness,
+        )
 }
 
 /**
  * Represents the colors of the input text, container, and content (including label, placeholder,
  * leading and trailing icons) used in a text field in different states.
  *
- * @constructor create an instance with arbitrary colors.
- * See [TextFieldDefaults.colors] for the default colors used in [TextField].
- * See [OutlinedTextFieldDefaults.colors] for the default colors used in [OutlinedTextField].
- *
  * @param focusedTextColor the color used for the input text of this text field when focused
- * @param unfocusedTextColor the color used for the input text of this text field when not
- * focused
+ * @param unfocusedTextColor the color used for the input text of this text field when not focused
  * @param disabledTextColor the color used for the input text of this text field when disabled
- * @param errorTextColor the color used for the input text of this text field when in error
- * state
+ * @param errorTextColor the color used for the input text of this text field when in error state
  * @param focusedContainerColor the container color for this text field when focused
  * @param unfocusedContainerColor the container color for this text field when not focused
  * @param disabledContainerColor the container color for this text field when disabled
@@ -1152,8 +1213,7 @@
  * @param disabledLeadingIconColor the leading icon color for this text field when disabled
  * @param errorLeadingIconColor the leading icon color for this text field when in error state
  * @param focusedTrailingIconColor the trailing icon color for this text field when focused
- * @param unfocusedTrailingIconColor the trailing icon color for this text field when not
- * focused
+ * @param unfocusedTrailingIconColor the trailing icon color for this text field when not focused
  * @param disabledTrailingIconColor the trailing icon color for this text field when disabled
  * @param errorTrailingIconColor the trailing icon color for this text field when in error state
  * @param focusedLabelColor the label color for this text field when focused
@@ -1166,11 +1226,9 @@
  * @param errorPlaceholderColor the placeholder color for this text field when in error state
  * @param focusedSupportingTextColor the supporting text color for this text field when focused
  * @param unfocusedSupportingTextColor the supporting text color for this text field when not
- * focused
- * @param disabledSupportingTextColor the supporting text color for this text field when
- * disabled
- * @param errorSupportingTextColor the supporting text color for this text field when in error
- * state
+ *   focused
+ * @param disabledSupportingTextColor the supporting text color for this text field when disabled
+ * @param errorSupportingTextColor the supporting text color for this text field when in error state
  * @param focusedPrefixColor the prefix color for this text field when focused
  * @param unfocusedPrefixColor the prefix color for this text field when not focused
  * @param disabledPrefixColor the prefix color for this text field when disabled
@@ -1179,9 +1237,13 @@
  * @param unfocusedSuffixColor the suffix color for this text field when not focused
  * @param disabledSuffixColor the suffix color for this text field when disabled
  * @param errorSuffixColor the suffix color for this text field when in error state
+ * @constructor create an instance with arbitrary colors. See [TextFieldDefaults.colors] for the
+ *   default colors used in [TextField]. See [OutlinedTextFieldDefaults.colors] for the default
+ *   colors used in [OutlinedTextField].
  */
 @Immutable
-class TextFieldColors constructor(
+class TextFieldColors
+constructor(
     val focusedTextColor: Color,
     val unfocusedTextColor: Color,
     val disabledTextColor: Color,
@@ -1228,8 +1290,8 @@
 ) {
 
     /**
-     * Returns a copy of this ChipColors, optionally overriding some of the values.
-     * This uses the Color.Unspecified to mean “use the value from the source”
+     * Returns a copy of this ChipColors, optionally overriding some of the values. This uses the
+     * Color.Unspecified to mean “use the value from the source”
      */
     fun copy(
         focusedTextColor: Color = this.focusedTextColor,
@@ -1275,54 +1337,56 @@
         unfocusedSuffixColor: Color = this.unfocusedSuffixColor,
         disabledSuffixColor: Color = this.disabledSuffixColor,
         errorSuffixColor: Color = this.errorSuffixColor,
-    ) = TextFieldColors(
-        focusedTextColor.takeOrElse { this.focusedTextColor },
-        unfocusedTextColor.takeOrElse { this.unfocusedTextColor },
-        disabledTextColor.takeOrElse { this.disabledTextColor },
-        errorTextColor.takeOrElse { this.errorTextColor },
-        focusedContainerColor.takeOrElse { this.focusedContainerColor },
-        unfocusedContainerColor.takeOrElse { this.unfocusedContainerColor },
-        disabledContainerColor.takeOrElse { this.disabledContainerColor },
-        errorContainerColor.takeOrElse { this.errorContainerColor },
-        cursorColor.takeOrElse { this.cursorColor },
-        errorCursorColor.takeOrElse { this.errorCursorColor },
-        textSelectionColors.takeOrElse { this.textSelectionColors },
-        focusedIndicatorColor.takeOrElse { this.focusedIndicatorColor },
-        unfocusedIndicatorColor.takeOrElse { this.unfocusedIndicatorColor },
-        disabledIndicatorColor.takeOrElse { this.disabledIndicatorColor },
-        errorIndicatorColor.takeOrElse { this.errorIndicatorColor },
-        focusedLeadingIconColor.takeOrElse { this.focusedLeadingIconColor },
-        unfocusedLeadingIconColor.takeOrElse { this.unfocusedLeadingIconColor },
-        disabledLeadingIconColor.takeOrElse { this.disabledLeadingIconColor },
-        errorLeadingIconColor.takeOrElse { this.errorLeadingIconColor },
-        focusedTrailingIconColor.takeOrElse { this.focusedTrailingIconColor },
-        unfocusedTrailingIconColor.takeOrElse { this.unfocusedTrailingIconColor },
-        disabledTrailingIconColor.takeOrElse { this.disabledTrailingIconColor },
-        errorTrailingIconColor.takeOrElse { this.errorTrailingIconColor },
-        focusedLabelColor.takeOrElse { this.focusedLabelColor },
-        unfocusedLabelColor.takeOrElse { this.unfocusedLabelColor },
-        disabledLabelColor.takeOrElse { this.disabledLabelColor },
-        errorLabelColor.takeOrElse { this.errorLabelColor },
-        focusedPlaceholderColor.takeOrElse { this.focusedPlaceholderColor },
-        unfocusedPlaceholderColor.takeOrElse { this.unfocusedPlaceholderColor },
-        disabledPlaceholderColor.takeOrElse { this.disabledPlaceholderColor },
-        errorPlaceholderColor.takeOrElse { this.errorPlaceholderColor },
-        focusedSupportingTextColor.takeOrElse { this.focusedSupportingTextColor },
-        unfocusedSupportingTextColor.takeOrElse { this.unfocusedSupportingTextColor },
-        disabledSupportingTextColor.takeOrElse { this.disabledSupportingTextColor },
-        errorSupportingTextColor.takeOrElse { this.errorSupportingTextColor },
-        focusedPrefixColor.takeOrElse { this.focusedPrefixColor },
-        unfocusedPrefixColor.takeOrElse { this.unfocusedPrefixColor },
-        disabledPrefixColor.takeOrElse { this.disabledPrefixColor },
-        errorPrefixColor.takeOrElse { this.errorPrefixColor },
-        focusedSuffixColor.takeOrElse { this.focusedSuffixColor },
-        unfocusedSuffixColor.takeOrElse { this.unfocusedSuffixColor },
-        disabledSuffixColor.takeOrElse { this.disabledSuffixColor },
-        errorSuffixColor.takeOrElse { this.errorSuffixColor },
-    )
+    ) =
+        TextFieldColors(
+            focusedTextColor.takeOrElse { this.focusedTextColor },
+            unfocusedTextColor.takeOrElse { this.unfocusedTextColor },
+            disabledTextColor.takeOrElse { this.disabledTextColor },
+            errorTextColor.takeOrElse { this.errorTextColor },
+            focusedContainerColor.takeOrElse { this.focusedContainerColor },
+            unfocusedContainerColor.takeOrElse { this.unfocusedContainerColor },
+            disabledContainerColor.takeOrElse { this.disabledContainerColor },
+            errorContainerColor.takeOrElse { this.errorContainerColor },
+            cursorColor.takeOrElse { this.cursorColor },
+            errorCursorColor.takeOrElse { this.errorCursorColor },
+            textSelectionColors.takeOrElse { this.textSelectionColors },
+            focusedIndicatorColor.takeOrElse { this.focusedIndicatorColor },
+            unfocusedIndicatorColor.takeOrElse { this.unfocusedIndicatorColor },
+            disabledIndicatorColor.takeOrElse { this.disabledIndicatorColor },
+            errorIndicatorColor.takeOrElse { this.errorIndicatorColor },
+            focusedLeadingIconColor.takeOrElse { this.focusedLeadingIconColor },
+            unfocusedLeadingIconColor.takeOrElse { this.unfocusedLeadingIconColor },
+            disabledLeadingIconColor.takeOrElse { this.disabledLeadingIconColor },
+            errorLeadingIconColor.takeOrElse { this.errorLeadingIconColor },
+            focusedTrailingIconColor.takeOrElse { this.focusedTrailingIconColor },
+            unfocusedTrailingIconColor.takeOrElse { this.unfocusedTrailingIconColor },
+            disabledTrailingIconColor.takeOrElse { this.disabledTrailingIconColor },
+            errorTrailingIconColor.takeOrElse { this.errorTrailingIconColor },
+            focusedLabelColor.takeOrElse { this.focusedLabelColor },
+            unfocusedLabelColor.takeOrElse { this.unfocusedLabelColor },
+            disabledLabelColor.takeOrElse { this.disabledLabelColor },
+            errorLabelColor.takeOrElse { this.errorLabelColor },
+            focusedPlaceholderColor.takeOrElse { this.focusedPlaceholderColor },
+            unfocusedPlaceholderColor.takeOrElse { this.unfocusedPlaceholderColor },
+            disabledPlaceholderColor.takeOrElse { this.disabledPlaceholderColor },
+            errorPlaceholderColor.takeOrElse { this.errorPlaceholderColor },
+            focusedSupportingTextColor.takeOrElse { this.focusedSupportingTextColor },
+            unfocusedSupportingTextColor.takeOrElse { this.unfocusedSupportingTextColor },
+            disabledSupportingTextColor.takeOrElse { this.disabledSupportingTextColor },
+            errorSupportingTextColor.takeOrElse { this.errorSupportingTextColor },
+            focusedPrefixColor.takeOrElse { this.focusedPrefixColor },
+            unfocusedPrefixColor.takeOrElse { this.unfocusedPrefixColor },
+            disabledPrefixColor.takeOrElse { this.disabledPrefixColor },
+            errorPrefixColor.takeOrElse { this.errorPrefixColor },
+            focusedSuffixColor.takeOrElse { this.focusedSuffixColor },
+            unfocusedSuffixColor.takeOrElse { this.unfocusedSuffixColor },
+            disabledSuffixColor.takeOrElse { this.disabledSuffixColor },
+            errorSuffixColor.takeOrElse { this.errorSuffixColor },
+        )
 
-    internal fun TextSelectionColors?.takeOrElse(block: () -> TextSelectionColors):
-        TextSelectionColors = this ?: block()
+    internal fun TextSelectionColors?.takeOrElse(
+        block: () -> TextSelectionColors
+    ): TextSelectionColors = this ?: block()
 
     /**
      * Represents the color used for the leading icon of this text field.
@@ -1336,12 +1400,13 @@
         enabled: Boolean,
         isError: Boolean,
         focused: Boolean,
-    ): Color = when {
-        !enabled -> disabledLeadingIconColor
-        isError -> errorLeadingIconColor
-        focused -> focusedLeadingIconColor
-        else -> unfocusedLeadingIconColor
-    }
+    ): Color =
+        when {
+            !enabled -> disabledLeadingIconColor
+            isError -> errorLeadingIconColor
+            focused -> focusedLeadingIconColor
+            else -> unfocusedLeadingIconColor
+        }
 
     /**
      * Represents the color used for the trailing icon of this text field.
@@ -1355,12 +1420,13 @@
         enabled: Boolean,
         isError: Boolean,
         focused: Boolean,
-    ): Color = when {
-        !enabled -> disabledTrailingIconColor
-        isError -> errorTrailingIconColor
-        focused -> focusedTrailingIconColor
-        else -> unfocusedTrailingIconColor
-    }
+    ): Color =
+        when {
+            !enabled -> disabledTrailingIconColor
+            isError -> errorTrailingIconColor
+            focused -> focusedTrailingIconColor
+            else -> unfocusedTrailingIconColor
+        }
 
     /**
      * Represents the color used for the border indicator of this text field.
@@ -1374,12 +1440,13 @@
         enabled: Boolean,
         isError: Boolean,
         focused: Boolean,
-    ): Color = when {
-        !enabled -> disabledIndicatorColor
-        isError -> errorIndicatorColor
-        focused -> focusedIndicatorColor
-        else -> unfocusedIndicatorColor
-    }
+    ): Color =
+        when {
+            !enabled -> disabledIndicatorColor
+            isError -> errorIndicatorColor
+            focused -> focusedIndicatorColor
+            else -> unfocusedIndicatorColor
+        }
 
     /**
      * Represents the container color for this text field.
@@ -1393,12 +1460,13 @@
         enabled: Boolean,
         isError: Boolean,
         focused: Boolean,
-    ): Color = when {
-        !enabled -> disabledContainerColor
-        isError -> errorContainerColor
-        focused -> focusedContainerColor
-        else -> unfocusedContainerColor
-    }
+    ): Color =
+        when {
+            !enabled -> disabledContainerColor
+            isError -> errorContainerColor
+            focused -> focusedContainerColor
+            else -> unfocusedContainerColor
+        }
 
     /**
      * Represents the color used for the placeholder of this text field.
@@ -1412,12 +1480,13 @@
         enabled: Boolean,
         isError: Boolean,
         focused: Boolean,
-    ): Color = when {
-        !enabled -> disabledPlaceholderColor
-        isError -> errorPlaceholderColor
-        focused -> focusedPlaceholderColor
-        else -> unfocusedPlaceholderColor
-    }
+    ): Color =
+        when {
+            !enabled -> disabledPlaceholderColor
+            isError -> errorPlaceholderColor
+            focused -> focusedPlaceholderColor
+            else -> unfocusedPlaceholderColor
+        }
 
     /**
      * Represents the color used for the label of this text field.
@@ -1431,12 +1500,13 @@
         enabled: Boolean,
         isError: Boolean,
         focused: Boolean,
-    ): Color = when {
-        !enabled -> disabledLabelColor
-        isError -> errorLabelColor
-        focused -> focusedLabelColor
-        else -> unfocusedLabelColor
-    }
+    ): Color =
+        when {
+            !enabled -> disabledLabelColor
+            isError -> errorLabelColor
+            focused -> focusedLabelColor
+            else -> unfocusedLabelColor
+        }
 
     /**
      * Represents the color used for the input field of this text field.
@@ -1450,12 +1520,13 @@
         enabled: Boolean,
         isError: Boolean,
         focused: Boolean,
-    ): Color = when {
-        !enabled -> disabledTextColor
-        isError -> errorTextColor
-        focused -> focusedTextColor
-        else -> unfocusedTextColor
-    }
+    ): Color =
+        when {
+            !enabled -> disabledTextColor
+            isError -> errorTextColor
+            focused -> focusedTextColor
+            else -> unfocusedTextColor
+        }
 
     /**
      * Represents the colors used for the supporting text of this text field.
@@ -1469,12 +1540,13 @@
         enabled: Boolean,
         isError: Boolean,
         focused: Boolean,
-    ): Color = when {
-        !enabled -> disabledSupportingTextColor
-        isError -> errorSupportingTextColor
-        focused -> focusedSupportingTextColor
-        else -> unfocusedSupportingTextColor
-    }
+    ): Color =
+        when {
+            !enabled -> disabledSupportingTextColor
+            isError -> errorSupportingTextColor
+            focused -> focusedSupportingTextColor
+            else -> unfocusedSupportingTextColor
+        }
 
     /**
      * Represents the color used for the prefix of this text field.
@@ -1488,12 +1560,13 @@
         enabled: Boolean,
         isError: Boolean,
         focused: Boolean,
-    ): Color = when {
-        !enabled -> disabledPrefixColor
-        isError -> errorPrefixColor
-        focused -> focusedPrefixColor
-        else -> unfocusedPrefixColor
-    }
+    ): Color =
+        when {
+            !enabled -> disabledPrefixColor
+            isError -> errorPrefixColor
+            focused -> focusedPrefixColor
+            else -> unfocusedPrefixColor
+        }
 
     /**
      * Represents the color used for the suffix of this text field.
@@ -1507,12 +1580,13 @@
         enabled: Boolean,
         isError: Boolean,
         focused: Boolean,
-    ): Color = when {
-        !enabled -> disabledSuffixColor
-        isError -> errorSuffixColor
-        focused -> focusedSuffixColor
-        else -> unfocusedSuffixColor
-    }
+    ): Color =
+        when {
+            !enabled -> disabledSuffixColor
+            isError -> errorSuffixColor
+            focused -> focusedSuffixColor
+            else -> unfocusedSuffixColor
+        }
 
     /**
      * Represents the color used for the cursor of this text field.
diff --git a/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/TimeFormat.kt b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/TimeFormat.kt
index 01f635a..0bcfb7a 100644
--- a/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/TimeFormat.kt
+++ b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/TimeFormat.kt
@@ -20,5 +20,4 @@
 import androidx.compose.runtime.ReadOnlyComposable
 
 internal expect val is24HourFormat: Boolean
-  @Composable
-  @ReadOnlyComposable get
+    @Composable @ReadOnlyComposable get
diff --git a/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/TimePicker.kt b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/TimePicker.kt
index 69236b4..40a23ec 100644
--- a/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/TimePicker.kt
+++ b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/TimePicker.kt
@@ -185,28 +185,31 @@
 import kotlinx.coroutines.launch
 
 /**
- * <a href="https://m3.material.io/components/time-pickers/overview" class="external" target="_blank">Material Design time picker</a>.
+ * <a href="https://m3.material.io/components/time-pickers/overview" class="external"
+ * target="_blank">Material Design time picker</a>.
  *
  * Time pickers help users select and set a specific time.
  *
- * Shows a picker that allows the user to select time.
- * Subscribe to updates through [TimePickerState]
+ * Shows a picker that allows the user to select time. Subscribe to updates through
+ * [TimePickerState]
  *
- * ![Time picker image](https://developer.android.com/images/reference/androidx/compose/material3/time-picker.png)
+ * ![Time picker
+ * image](https://developer.android.com/images/reference/androidx/compose/material3/time-picker.png)
  *
  * @sample androidx.compose.material3.samples.TimePickerSample
+ *
  * @sample androidx.compose.material3.samples.TimePickerSwitchableSample
  *
  * [state] state for this timepicker, allows to subscribe to changes to [TimePickerState.hour] and
  * [TimePickerState.minute], and set the initial time for this picker.
  *
  * @param state state for this time input, allows to subscribe to changes to [TimePickerState.hour]
- * and [TimePickerState.minute], and set the initial time for this input.
+ *   and [TimePickerState.minute], and set the initial time for this input.
  * @param modifier the [Modifier] to be applied to this time input
  * @param colors colors [TimePickerColors] that will be used to resolve the colors used for this
- * time picker in different states. See [TimePickerDefaults.colors].
- * @param layoutType, the different [TimePickerLayoutType] supported by this time picker,
- * it will change the position and sizing of different components of the timepicker.
+ *   time picker in different states. See [TimePickerDefaults.colors].
+ * @param layoutType, the different [TimePickerLayoutType] supported by this time picker, it will
+ *   change the position and sizing of different components of the timepicker.
  */
 @Composable
 @ExperimentalMaterial3Api
@@ -238,17 +241,16 @@
 /**
  * Time pickers help users select and set a specific time.
  *
- * Shows a time input that allows the user to enter the time via
- * two text fields, one for minutes and one for hours
- * Subscribe to updates through [TimePickerState]
+ * Shows a time input that allows the user to enter the time via two text fields, one for minutes
+ * and one for hours Subscribe to updates through [TimePickerState]
  *
  * @sample androidx.compose.material3.samples.TimeInputSample
  *
  * @param state state for this timepicker, allows to subscribe to changes to [TimePickerState.hour]
- * and [TimePickerState.minute], and set the initial time for this picker.
+ *   and [TimePickerState.minute], and set the initial time for this picker.
  * @param modifier the [Modifier] to be applied to this time input
  * @param colors colors [TimePickerColors] that will be used to resolve the colors used for this
- * time input in different states. See [TimePickerDefaults.colors].
+ *   time input in different states. See [TimePickerDefaults.colors].
  */
 @Composable
 @ExperimentalMaterial3Api
@@ -260,46 +262,41 @@
     TimeInputImpl(modifier, colors, state)
 }
 
-/**
- * Contains the default values used by [TimePicker]
- */
+/** Contains the default values used by [TimePicker] */
 @ExperimentalMaterial3Api
 @Stable
 object TimePickerDefaults {
 
-    /**
-     * Default colors used by a [TimePicker] in different states
-     */
-    @Composable
-    fun colors() = MaterialTheme.colorScheme.defaultTimePickerColors
+    /** Default colors used by a [TimePicker] in different states */
+    @Composable fun colors() = MaterialTheme.colorScheme.defaultTimePickerColors
 
     /**
      * Default colors used by a [TimePicker] in different states
      *
      * @param clockDialColor The color of the clock dial.
-     * @param clockDialSelectedContentColor the color of the numbers of the clock dial when they
-     * are selected or overlapping with the selector
+     * @param clockDialSelectedContentColor the color of the numbers of the clock dial when they are
+     *   selected or overlapping with the selector
      * @param clockDialUnselectedContentColor the color of the numbers of the clock dial when they
-     * are unselected
+     *   are unselected
      * @param selectorColor The color of the clock dial selector.
      * @param containerColor The container color of the time picker.
      * @param periodSelectorBorderColor the color used for the border of the AM/PM toggle.
-     * @param periodSelectorSelectedContainerColor the color used for the selected container of
-     * the AM/PM toggle
-     * @param periodSelectorUnselectedContainerColor the color used for the unselected container
-     * of the AM/PM toggle
-     * @param periodSelectorSelectedContentColor color used for the selected content of
-     * the AM/PM toggle
-     * @param periodSelectorUnselectedContentColor color used for the unselected content
-     * of the AM/PM toggle
+     * @param periodSelectorSelectedContainerColor the color used for the selected container of the
+     *   AM/PM toggle
+     * @param periodSelectorUnselectedContainerColor the color used for the unselected container of
+     *   the AM/PM toggle
+     * @param periodSelectorSelectedContentColor color used for the selected content of the AM/PM
+     *   toggle
+     * @param periodSelectorUnselectedContentColor color used for the unselected content of the
+     *   AM/PM toggle
      * @param timeSelectorSelectedContainerColor color used for the selected container of the
-     * display buttons to switch between hour and minutes
+     *   display buttons to switch between hour and minutes
      * @param timeSelectorUnselectedContainerColor color used for the unselected container of the
-     * display buttons to switch between hour and minutes
+     *   display buttons to switch between hour and minutes
      * @param timeSelectorSelectedContentColor color used for the selected content of the display
-     * buttons to switch between hour and minutes
+     *   buttons to switch between hour and minutes
      * @param timeSelectorUnselectedContentColor color used for the unselected content of the
-     * display buttons to switch between hour and minutes
+     *   display buttons to switch between hour and minutes
      */
     @Composable
     fun colors(
@@ -317,50 +314,52 @@
         timeSelectorUnselectedContainerColor: Color = Color.Unspecified,
         timeSelectorSelectedContentColor: Color = Color.Unspecified,
         timeSelectorUnselectedContentColor: Color = Color.Unspecified,
-    ) = MaterialTheme.colorScheme.defaultTimePickerColors.copy(
-        clockDialColor = clockDialColor,
-        clockDialSelectedContentColor = clockDialSelectedContentColor,
-        clockDialUnselectedContentColor = clockDialUnselectedContentColor,
-        selectorColor = selectorColor,
-        containerColor = containerColor,
-        periodSelectorBorderColor = periodSelectorBorderColor,
-        periodSelectorSelectedContainerColor = periodSelectorSelectedContainerColor,
-        periodSelectorUnselectedContainerColor = periodSelectorUnselectedContainerColor,
-        periodSelectorSelectedContentColor = periodSelectorSelectedContentColor,
-        periodSelectorUnselectedContentColor = periodSelectorUnselectedContentColor,
-        timeSelectorSelectedContainerColor = timeSelectorSelectedContainerColor,
-        timeSelectorUnselectedContainerColor = timeSelectorUnselectedContainerColor,
-        timeSelectorSelectedContentColor = timeSelectorSelectedContentColor,
-        timeSelectorUnselectedContentColor = timeSelectorUnselectedContentColor
-    )
+    ) =
+        MaterialTheme.colorScheme.defaultTimePickerColors.copy(
+            clockDialColor = clockDialColor,
+            clockDialSelectedContentColor = clockDialSelectedContentColor,
+            clockDialUnselectedContentColor = clockDialUnselectedContentColor,
+            selectorColor = selectorColor,
+            containerColor = containerColor,
+            periodSelectorBorderColor = periodSelectorBorderColor,
+            periodSelectorSelectedContainerColor = periodSelectorSelectedContainerColor,
+            periodSelectorUnselectedContainerColor = periodSelectorUnselectedContainerColor,
+            periodSelectorSelectedContentColor = periodSelectorSelectedContentColor,
+            periodSelectorUnselectedContentColor = periodSelectorUnselectedContentColor,
+            timeSelectorSelectedContainerColor = timeSelectorSelectedContainerColor,
+            timeSelectorUnselectedContainerColor = timeSelectorUnselectedContainerColor,
+            timeSelectorSelectedContentColor = timeSelectorSelectedContentColor,
+            timeSelectorUnselectedContentColor = timeSelectorUnselectedContentColor
+        )
 
     internal val ColorScheme.defaultTimePickerColors: TimePickerColors
         get() {
-            return defaultTimePickerColorsCached ?: TimePickerColors(
-                clockDialColor = fromToken(ClockDialColor),
-                clockDialSelectedContentColor = fromToken(ClockDialSelectedLabelTextColor),
-                clockDialUnselectedContentColor = fromToken(ClockDialUnselectedLabelTextColor),
-                selectorColor = fromToken(ClockDialSelectorHandleContainerColor),
-                containerColor = fromToken(ContainerColor),
-                periodSelectorBorderColor = fromToken(PeriodSelectorOutlineColor),
-                periodSelectorSelectedContainerColor = fromToken(
-                    PeriodSelectorSelectedContainerColor
-                ),
-                periodSelectorUnselectedContainerColor = Color.Transparent,
-                periodSelectorSelectedContentColor =
-                fromToken(PeriodSelectorSelectedLabelTextColor),
-                periodSelectorUnselectedContentColor =
-                fromToken(PeriodSelectorUnselectedLabelTextColor),
-                timeSelectorSelectedContainerColor = fromToken(TimeSelectorSelectedContainerColor),
-                timeSelectorUnselectedContainerColor = fromToken(
-                    TimeSelectorUnselectedContainerColor
-                ),
-                timeSelectorSelectedContentColor = fromToken(TimeSelectorSelectedLabelTextColor),
-                timeSelectorUnselectedContentColor =
-                fromToken(TimeSelectorUnselectedLabelTextColor),
-            ).also {
-                defaultTimePickerColorsCached = it
-            }
+            return defaultTimePickerColorsCached
+                ?: TimePickerColors(
+                        clockDialColor = fromToken(ClockDialColor),
+                        clockDialSelectedContentColor = fromToken(ClockDialSelectedLabelTextColor),
+                        clockDialUnselectedContentColor =
+                            fromToken(ClockDialUnselectedLabelTextColor),
+                        selectorColor = fromToken(ClockDialSelectorHandleContainerColor),
+                        containerColor = fromToken(ContainerColor),
+                        periodSelectorBorderColor = fromToken(PeriodSelectorOutlineColor),
+                        periodSelectorSelectedContainerColor =
+                            fromToken(PeriodSelectorSelectedContainerColor),
+                        periodSelectorUnselectedContainerColor = Color.Transparent,
+                        periodSelectorSelectedContentColor =
+                            fromToken(PeriodSelectorSelectedLabelTextColor),
+                        periodSelectorUnselectedContentColor =
+                            fromToken(PeriodSelectorUnselectedLabelTextColor),
+                        timeSelectorSelectedContainerColor =
+                            fromToken(TimeSelectorSelectedContainerColor),
+                        timeSelectorUnselectedContainerColor =
+                            fromToken(TimeSelectorUnselectedContainerColor),
+                        timeSelectorSelectedContentColor =
+                            fromToken(TimeSelectorSelectedLabelTextColor),
+                        timeSelectorUnselectedContentColor =
+                            fromToken(TimeSelectorUnselectedLabelTextColor),
+                    )
+                    .also { defaultTimePickerColorsCached = it }
         }
 
     /** Default layout type, uses the screen dimensions to choose an appropriate layout. */
@@ -372,38 +371,36 @@
 /**
  * Represents the colors used by a [TimePicker] in different states
  *
- * @constructor create an instance with arbitrary colors.
- * See [TimePickerDefaults.colors] for the default implementation that follows Material
- * specifications.
- *
  * @param clockDialColor The color of the clock dial.
- * @param clockDialSelectedContentColor the color of the numbers of the clock dial when they
- * are selected or overlapping with the selector
- * @param clockDialUnselectedContentColor the color of the numbers of the clock dial when they
- * are unselected
+ * @param clockDialSelectedContentColor the color of the numbers of the clock dial when they are
+ *   selected or overlapping with the selector
+ * @param clockDialUnselectedContentColor the color of the numbers of the clock dial when they are
+ *   unselected
  * @param selectorColor The color of the clock dial selector.
  * @param containerColor The container color of the time picker.
  * @param periodSelectorBorderColor the color used for the border of the AM/PM toggle.
- * @param periodSelectorSelectedContainerColor the color used for the selected container of
- * the AM/PM toggle
- * @param periodSelectorUnselectedContainerColor the color used for the unselected container
- * of the AM/PM toggle
- * @param periodSelectorSelectedContentColor color used for the selected content of
- * the AM/PM toggle
- * @param periodSelectorUnselectedContentColor color used for the unselected content
- * of the AM/PM toggle
- * @param timeSelectorSelectedContainerColor color used for the selected container of the
- * display buttons to switch between hour and minutes
+ * @param periodSelectorSelectedContainerColor the color used for the selected container of the
+ *   AM/PM toggle
+ * @param periodSelectorUnselectedContainerColor the color used for the unselected container of the
+ *   AM/PM toggle
+ * @param periodSelectorSelectedContentColor color used for the selected content of the AM/PM toggle
+ * @param periodSelectorUnselectedContentColor color used for the unselected content of the AM/PM
+ *   toggle
+ * @param timeSelectorSelectedContainerColor color used for the selected container of the display
+ *   buttons to switch between hour and minutes
  * @param timeSelectorUnselectedContainerColor color used for the unselected container of the
- * display buttons to switch between hour and minutes
+ *   display buttons to switch between hour and minutes
  * @param timeSelectorSelectedContentColor color used for the selected content of the display
- * buttons to switch between hour and minutes
- * @param timeSelectorUnselectedContentColor color used for the unselected content of the
- * display buttons to switch between hour and minutes
+ *   buttons to switch between hour and minutes
+ * @param timeSelectorUnselectedContentColor color used for the unselected content of the display
+ *   buttons to switch between hour and minutes
+ * @constructor create an instance with arbitrary colors. See [TimePickerDefaults.colors] for the
+ *   default implementation that follows Material specifications.
  */
 @Immutable
 @ExperimentalMaterial3Api
-class TimePickerColors constructor(
+class TimePickerColors
+constructor(
     val clockDialColor: Color,
     val selectorColor: Color,
     val containerColor: Color,
@@ -420,8 +417,8 @@
     val timeSelectorUnselectedContentColor: Color,
 ) {
     /**
-     * Returns a copy of this TimePickerColors, optionally overriding some of the values.
-     * This uses the Color.Unspecified to mean “use the value from the source”
+     * Returns a copy of this TimePickerColors, optionally overriding some of the values. This uses
+     * the Color.Unspecified to mean “use the value from the source”
      */
     fun copy(
         clockDialColor: Color = this.containerColor,
@@ -438,26 +435,37 @@
         timeSelectorUnselectedContainerColor: Color = this.timeSelectorUnselectedContainerColor,
         timeSelectorSelectedContentColor: Color = this.timeSelectorSelectedContentColor,
         timeSelectorUnselectedContentColor: Color = this.timeSelectorUnselectedContentColor,
-    ) = TimePickerColors(
-        clockDialColor.takeOrElse { this.clockDialColor },
-        selectorColor.takeOrElse { this.selectorColor },
-        containerColor.takeOrElse { this.containerColor },
-        periodSelectorBorderColor.takeOrElse { this.periodSelectorBorderColor },
-        clockDialSelectedContentColor.takeOrElse { this.clockDialSelectedContentColor },
-        clockDialUnselectedContentColor.takeOrElse { this.clockDialUnselectedContentColor },
-        periodSelectorSelectedContainerColor
-            .takeOrElse { this.periodSelectorSelectedContainerColor },
-        periodSelectorUnselectedContainerColor
-            .takeOrElse { this.periodSelectorUnselectedContainerColor },
-        periodSelectorSelectedContentColor.takeOrElse { this.periodSelectorSelectedContentColor },
-        periodSelectorUnselectedContentColor
-            .takeOrElse { this.periodSelectorUnselectedContentColor },
-        timeSelectorSelectedContainerColor.takeOrElse { this.timeSelectorSelectedContainerColor },
-        timeSelectorUnselectedContainerColor
-            .takeOrElse { this.timeSelectorUnselectedContainerColor },
-        timeSelectorSelectedContentColor.takeOrElse { this.timeSelectorSelectedContentColor },
-        timeSelectorUnselectedContentColor.takeOrElse { this.timeSelectorUnselectedContentColor },
-    )
+    ) =
+        TimePickerColors(
+            clockDialColor.takeOrElse { this.clockDialColor },
+            selectorColor.takeOrElse { this.selectorColor },
+            containerColor.takeOrElse { this.containerColor },
+            periodSelectorBorderColor.takeOrElse { this.periodSelectorBorderColor },
+            clockDialSelectedContentColor.takeOrElse { this.clockDialSelectedContentColor },
+            clockDialUnselectedContentColor.takeOrElse { this.clockDialUnselectedContentColor },
+            periodSelectorSelectedContainerColor.takeOrElse {
+                this.periodSelectorSelectedContainerColor
+            },
+            periodSelectorUnselectedContainerColor.takeOrElse {
+                this.periodSelectorUnselectedContainerColor
+            },
+            periodSelectorSelectedContentColor.takeOrElse {
+                this.periodSelectorSelectedContentColor
+            },
+            periodSelectorUnselectedContentColor.takeOrElse {
+                this.periodSelectorUnselectedContentColor
+            },
+            timeSelectorSelectedContainerColor.takeOrElse {
+                this.timeSelectorSelectedContainerColor
+            },
+            timeSelectorUnselectedContainerColor.takeOrElse {
+                this.timeSelectorUnselectedContainerColor
+            },
+            timeSelectorSelectedContentColor.takeOrElse { this.timeSelectorSelectedContentColor },
+            timeSelectorUnselectedContentColor.takeOrElse {
+                this.timeSelectorUnselectedContentColor
+            },
+        )
 
     @Stable
     internal fun periodSelectorContainerColor(selected: Boolean) =
@@ -522,8 +530,7 @@
             return false
         if (timeSelectorUnselectedContainerColor != other.timeSelectorUnselectedContainerColor)
             return false
-        if (timeSelectorSelectedContentColor != other.timeSelectorSelectedContentColor)
-            return false
+        if (timeSelectorSelectedContentColor != other.timeSelectorSelectedContentColor) return false
         if (timeSelectorUnselectedContentColor != other.timeSelectorUnselectedContentColor)
             return false
 
@@ -548,15 +555,15 @@
 }
 
 /**
- * Creates a [TimePickerState] for a time picker that is remembered across compositions
- * and configuration changes.
+ * Creates a [TimePickerState] for a time picker that is remembered across compositions and
+ * configuration changes.
  *
  * @param initialHour starting hour for this state, will be displayed in the time picker when
- * launched. Ranges from 0 to 23
+ *   launched. Ranges from 0 to 23
  * @param initialMinute starting minute for this state, will be displayed in the time picker when
- * launched. Ranges from 0 to 59
+ *   launched. Ranges from 0 to 59
  * @param is24Hour The format for this time picker. `false` for 12 hour format with an AM/PM toggle
- * or `true` for 24 hour format without toggle. Defaults to follow system setting.
+ *   or `true` for 24 hour format without toggle. Defaults to follow system setting.
  */
 @Composable
 @ExperimentalMaterial3Api
@@ -565,20 +572,19 @@
     initialMinute: Int = 0,
     is24Hour: Boolean = is24HourFormat,
 ): TimePickerState {
-    val state: TimePickerStateImpl = rememberSaveable(saver = TimePickerStateImpl.Saver()) {
-        TimePickerStateImpl(
-            initialHour = initialHour,
-            initialMinute = initialMinute,
-            is24Hour = is24Hour,
-        )
-    }
+    val state: TimePickerStateImpl =
+        rememberSaveable(saver = TimePickerStateImpl.Saver()) {
+            TimePickerStateImpl(
+                initialHour = initialHour,
+                initialMinute = initialMinute,
+                is24Hour = is24Hour,
+            )
+        }
 
     return state
 }
 
-/**
- * Represents the different configurations for the layout of the Time Picker
- */
+/** Represents the different configurations for the layout of the Time Picker */
 @Immutable
 @JvmInline
 @ExperimentalMaterial3Api
@@ -588,15 +594,16 @@
         /** Displays the Time picker with a horizontal layout. Should be used in landscape mode. */
         val Horizontal = TimePickerLayoutType(0)
 
-        /** Displays the Time picker with a vertical layout. Should be used in portrait mode.*/
+        /** Displays the Time picker with a vertical layout. Should be used in portrait mode. */
         val Vertical = TimePickerLayoutType(1)
     }
 
-    override fun toString() = when (this) {
-        Horizontal -> "Horizontal"
-        Vertical -> "Vertical"
-        else -> "Unknown"
-    }
+    override fun toString() =
+        when (this) {
+            Horizontal -> "Horizontal"
+            Vertical -> "Vertical"
+            else -> "Unknown"
+        }
 }
 
 /**
@@ -608,54 +615,39 @@
 @ExperimentalMaterial3Api
 interface TimePickerState {
 
-    /**
-     * The currently selected minute (0-59).
-     */
-    @get:IntRange(from = 0, to = 59)
-    @setparam:IntRange(from = 0, to = 59)
-    var minute: Int
+    /** The currently selected minute (0-59). */
+    @get:IntRange(from = 0, to = 59) @setparam:IntRange(from = 0, to = 59) var minute: Int
+
+    /** The currently selected hour (0-23). */
+    @get:IntRange(from = 0, to = 23) @setparam:IntRange(from = 0, to = 23) var hour: Int
 
     /**
-     * The currently selected hour (0-23).
-     */
-    @get:IntRange(from = 0, to = 23)
-    @setparam:IntRange(from = 0, to = 23)
-    var hour: Int
-
-    /**
-     * Indicates whether the time picker uses 24-hour format (`true`) or
-     * 12-hour format with AM/PM (`false`).
+     * Indicates whether the time picker uses 24-hour format (`true`) or 12-hour format with AM/PM
+     * (`false`).
      */
     var is24hour: Boolean
 
-    /**
-     * Specifies whether the hour or minute component is being actively selected by the user.
-     */
+    /** Specifies whether the hour or minute component is being actively selected by the user. */
     var selection: TimePickerSelectionMode
 
-    /**
-     * Indicates whether the selected time falls within the afternoon period (12 PM - 12 AM).
-     */
+    /** Indicates whether the selected time falls within the afternoon period (12 PM - 12 AM). */
     var isAfternoon: Boolean
 }
 
 /**
- * Factory function for the default implementation of [TimePickerState]
- * [rememberTimePickerState] should be used in most cases.
+ * Factory function for the default implementation of [TimePickerState] [rememberTimePickerState]
+ * should be used in most cases.
  *
- * @param initialHour starting hour for this state, will be displayed in the time picker when launched
- * Ranges from 0 to 23
+ * @param initialHour starting hour for this state, will be displayed in the time picker when
+ *   launched Ranges from 0 to 23
  * @param initialMinute starting minute for this state, will be displayed in the time picker when
- * launched. Ranges from 0 to 59
+ *   launched. Ranges from 0 to 59
  * @param is24Hour The format for this time picker. `false` for 12 hour format with an AM/PM toggle
- * or `true` for 24 hour format without toggle. Defaults to follow system setting.
+ *   or `true` for 24 hour format without toggle. Defaults to follow system setting.
  */
 @ExperimentalMaterial3Api
-fun TimePickerState(
-    initialHour: Int,
-    initialMinute: Int,
-    is24Hour: Boolean
-): TimePickerState = TimePickerStateImpl(initialHour, initialMinute, is24Hour)
+fun TimePickerState(initialHour: Int, initialMinute: Int, is24Hour: Boolean): TimePickerState =
+    TimePickerStateImpl(initialHour, initialMinute, is24Hour)
 
 /** The selection mode for the time picker */
 @JvmInline
@@ -666,11 +658,12 @@
         val Minute = TimePickerSelectionMode(1)
     }
 
-    override fun toString(): String = when (this) {
-        Hour -> "Hour"
-        Minute -> "Minute"
-        else -> ""
-    }
+    override fun toString(): String =
+        when (this) {
+            Hour -> "Hour"
+            Minute -> "Minute"
+            else -> ""
+        }
 }
 
 private class TimePickerStateImpl(
@@ -707,25 +700,18 @@
         }
 
     companion object {
-        /**
-         * The default [Saver] implementation for [TimePickerState].
-         */
-        fun Saver(): Saver<TimePickerStateImpl, *> = Saver(
-            save = {
-                listOf(
-                    it.hour,
-                    it.minute,
-                    it.is24hour
-                )
-            },
-            restore = { value ->
-                TimePickerStateImpl(
-                    initialHour = value[0] as Int,
-                    initialMinute = value[1] as Int,
-                    is24Hour = value[2] as Boolean
-                )
-            }
-        )
+        /** The default [Saver] implementation for [TimePickerState]. */
+        fun Saver(): Saver<TimePickerStateImpl, *> =
+            Saver(
+                save = { listOf(it.hour, it.minute, it.is24hour) },
+                restore = { value ->
+                    TimePickerStateImpl(
+                        initialHour = value[0] as Int,
+                        initialMinute = value[1] as Int,
+                        is24Hour = value[2] as Boolean
+                    )
+                }
+            )
     }
 }
 
@@ -742,24 +728,29 @@
             return
         }
 
-        val end = if (selection == TimePickerSelectionMode.Hour) {
-            endValueForAnimation(hourAngle)
-        } else {
-            endValueForAnimation(minuteAngle)
-        }
+        val end =
+            if (selection == TimePickerSelectionMode.Hour) {
+                endValueForAnimation(hourAngle)
+            } else {
+                endValueForAnimation(minuteAngle)
+            }
         mutex.mutate(priority = PreventUserInput) {
             anim.animateTo(end, spring(dampingRatio = 1f, stiffness = 700f))
         }
     }
 
     private fun isUpdated(): Boolean {
-        if (selection == TimePickerSelectionMode.Hour &&
-            anim.targetValue.normalize() == hourAngle.normalize()) {
+        if (
+            selection == TimePickerSelectionMode.Hour &&
+                anim.targetValue.normalize() == hourAngle.normalize()
+        ) {
             return false
         }
 
-        if (selection == TimePickerSelectionMode.Minute &&
-            anim.targetValue.normalize() == minuteAngle.normalize()) {
+        if (
+            selection == TimePickerSelectionMode.Minute &&
+                anim.targetValue.normalize() == minuteAngle.normalize()
+        ) {
             return false
         }
 
@@ -788,12 +779,14 @@
     suspend fun onGestureEnd() {
         val end =
             endValueForAnimation(
-                if (selection == TimePickerSelectionMode.Hour) { hourAngle } else { minuteAngle }
+                if (selection == TimePickerSelectionMode.Hour) {
+                    hourAngle
+                } else {
+                    minuteAngle
+                }
             )
 
-        mutex.mutate(priority = PreventUserInput) {
-            anim.animateTo(end, spring())
-        }
+        mutex.mutate(priority = PreventUserInput) { anim.animateTo(end, spring()) }
     }
 
     suspend fun rotateTo(angle: Float, animate: Boolean = false) {
@@ -826,9 +819,7 @@
             updateBaseStateMinute()
         }
 
-    private fun updateBaseStateMinute() = Snapshot.withoutReadObservation {
-        state.minute = minute
-    }
+    private fun updateBaseStateMinute() = Snapshot.withoutReadObservation { state.minute = minute }
 
     override var hour: Int
         get() = state.hour
@@ -840,7 +831,7 @@
             }
         }
 
-   private fun Float.normalize(): Float {
+    private fun Float.normalize(): Float {
         var normalizedAngle = this % (2 * PI)
 
         if (normalizedAngle < 0) {
@@ -871,12 +862,13 @@
 }
 
 internal val TimePickerState.hourForDisplay: Int
-    get() = when {
-        is24hour -> hour % 24
-        hour % 12 == 0 -> 12
-        isAfternoon -> hour - 12
-        else -> hour
-    }
+    get() =
+        when {
+            is24hour -> hour % 24
+            hour % 12 == 0 -> 12
+            isAfternoon -> hour - 12
+            else -> hour
+        }
 
 private fun TimePickerState.moveSelector(x: Float, y: Float, maxDist: Float, center: IntOffset) {
     if (selection == TimePickerSelectionMode.Hour && is24hour) {
@@ -915,10 +907,11 @@
         val handleRadiusPx = ClockDialSelectorHandleContainerSize / 2
         val selectorLength =
             if (is24hour && this.isAfternoon && selection == TimePickerSelectionMode.Hour) {
-                InnerCircleRadius
-            } else {
-                OuterCircleSizeRadius
-            }.minus(handleRadiusPx)
+                    InnerCircleRadius
+                } else {
+                    OuterCircleSizeRadius
+                }
+                .minus(handleRadiusPx)
 
         val length = selectorLength + handleRadiusPx
         val offsetX = length * cos(currentAngle) + ClockDialContainerSize / 2
@@ -969,18 +962,20 @@
     colors: TimePickerColors,
     state: TimePickerState,
 ) {
-    var hourValue by rememberSaveable(stateSaver = TextFieldValue.Saver) {
-        mutableStateOf(TextFieldValue(text = state.hourForDisplay.toLocalString(minDigits = 2)))
-    }
-    var minuteValue by rememberSaveable(stateSaver = TextFieldValue.Saver) {
-        mutableStateOf(TextFieldValue(text = state.minute.toLocalString(minDigits = 2)))
-    }
+    var hourValue by
+        rememberSaveable(stateSaver = TextFieldValue.Saver) {
+            mutableStateOf(TextFieldValue(text = state.hourForDisplay.toLocalString(minDigits = 2)))
+        }
+    var minuteValue by
+        rememberSaveable(stateSaver = TextFieldValue.Saver) {
+            mutableStateOf(TextFieldValue(text = state.minute.toLocalString(minDigits = 2)))
+        }
     Row(
         modifier = modifier.padding(bottom = TimeInputBottomPadding),
         verticalAlignment = Alignment.Top
     ) {
-        val textStyle = TimeInputTokens.TimeFieldLabelTextFont.value
-            .copy(
+        val textStyle =
+            TimeInputTokens.TimeFieldLabelTextFont.value.copy(
                 textAlign = TextAlign.Center,
                 color = colors.timeSelectorContentColor(true)
             )
@@ -992,11 +987,13 @@
         ) {
             Row {
                 TimePickerTextField(
-                    modifier = Modifier
-                        .onKeyEvent { event ->
+                    modifier =
+                        Modifier.onKeyEvent { event ->
                             // Zero == 48, Nine == 57
-                            val switchFocus = event.utf16CodePoint in 48..57 &&
-                                hourValue.selection.start == 2 && hourValue.text.length == 2
+                            val switchFocus =
+                                event.utf16CodePoint in 48..57 &&
+                                    hourValue.selection.start == 2 &&
+                                    hourValue.text.length == 2
 
                             if (switchFocus) {
                                 state.selection = TimePickerSelectionMode.Minute
@@ -1012,31 +1009,32 @@
                             value = newValue,
                             prevValue = hourValue,
                             max = if (state.is24hour) 23 else 12,
-                        ) { hourValue = it }
+                        ) {
+                            hourValue = it
+                        }
                     },
                     state = state,
                     selection = TimePickerSelectionMode.Hour,
-                    keyboardOptions = KeyboardOptions(
-                        imeAction = ImeAction.Next,
-                        keyboardType = KeyboardType.Number
-                    ),
-                    keyboardActions = KeyboardActions(onNext = {
-                        state.selection = TimePickerSelectionMode.Minute
-                    }),
+                    keyboardOptions =
+                        KeyboardOptions(
+                            imeAction = ImeAction.Next,
+                            keyboardType = KeyboardType.Number
+                        ),
+                    keyboardActions =
+                        KeyboardActions(
+                            onNext = { state.selection = TimePickerSelectionMode.Minute }
+                        ),
                     colors = colors,
                 )
                 DisplaySeparator(
-                    Modifier.size(
-                        DisplaySeparatorWidth,
-                        PeriodSelectorContainerHeight
-                    )
+                    Modifier.size(DisplaySeparatorWidth, PeriodSelectorContainerHeight)
                 )
                 TimePickerTextField(
-                    modifier = Modifier
-                        .onPreviewKeyEvent { event ->
+                    modifier =
+                        Modifier.onPreviewKeyEvent { event ->
                             // 0 == KEYCODE_DEL
-                            val switchFocus = event.utf16CodePoint == 0 &&
-                                minuteValue.selection.start == 0
+                            val switchFocus =
+                                event.utf16CodePoint == 0 && minuteValue.selection.start == 0
 
                             if (switchFocus) {
                                 state.selection = TimePickerSelectionMode.Hour
@@ -1044,7 +1042,6 @@
 
                             switchFocus
                         },
-
                     value = minuteValue,
                     onValueChange = { newValue ->
                         timeInputOnChange(
@@ -1053,17 +1050,21 @@
                             value = newValue,
                             prevValue = minuteValue,
                             max = 59,
-                        ) { minuteValue = it }
+                        ) {
+                            minuteValue = it
+                        }
                     },
                     state = state,
                     selection = TimePickerSelectionMode.Minute,
-                    keyboardOptions = KeyboardOptions(
-                        imeAction = ImeAction.Done,
-                        keyboardType = KeyboardType.Number
-                    ),
-                    keyboardActions = KeyboardActions(onNext = {
-                        state.selection = TimePickerSelectionMode.Minute
-                    }),
+                    keyboardOptions =
+                        KeyboardOptions(
+                            imeAction = ImeAction.Done,
+                            keyboardType = KeyboardType.Number
+                        ),
+                    keyboardActions =
+                        KeyboardActions(
+                            onNext = { state.selection = TimePickerSelectionMode.Minute }
+                        ),
                     colors = colors,
                 )
             }
@@ -1072,10 +1073,8 @@
         if (!state.is24hour) {
             Box(Modifier.padding(start = PeriodToggleMargin)) {
                 VerticalPeriodToggle(
-                    modifier = Modifier.size(
-                        PeriodSelectorContainerWidth,
-                        PeriodSelectorContainerHeight
-                    ),
+                    modifier =
+                        Modifier.size(PeriodSelectorContainerWidth, PeriodSelectorContainerHeight),
                     state = state,
                     colors = colors,
                 )
@@ -1091,10 +1090,11 @@
         if (!state.is24hour) {
             Box(modifier = Modifier.padding(top = PeriodToggleMargin)) {
                 HorizontalPeriodToggle(
-                    modifier = Modifier.size(
-                        PeriodSelectorHorizontalContainerWidth,
-                        PeriodSelectorHorizontalContainerHeight
-                    ),
+                    modifier =
+                        Modifier.size(
+                            PeriodSelectorHorizontalContainerWidth,
+                            PeriodSelectorHorizontalContainerHeight
+                        ),
                     state = state,
                     colors = colors,
                 )
@@ -1110,10 +1110,11 @@
         if (!state.is24hour) {
             Box(modifier = Modifier.padding(start = PeriodToggleMargin)) {
                 VerticalPeriodToggle(
-                    modifier = Modifier.size(
-                        PeriodSelectorVerticalContainerWidth,
-                        PeriodSelectorVerticalContainerHeight
-                    ),
+                    modifier =
+                        Modifier.size(
+                            PeriodSelectorVerticalContainerWidth,
+                            PeriodSelectorVerticalContainerHeight
+                        ),
                     state = state,
                     colors = colors,
                 )
@@ -1123,10 +1124,7 @@
 }
 
 @Composable
-private fun ClockDisplayNumbers(
-    state: TimePickerState,
-    colors: TimePickerColors
-) {
+private fun ClockDisplayNumbers(state: TimePickerState, colors: TimePickerColors) {
     CompositionLocalProvider(
         LocalTextStyle provides TimeSelectorLabelTextFont.value,
         // Always display the TimeSelectors from left to right.
@@ -1134,26 +1132,17 @@
     ) {
         Row {
             TimeSelector(
-                modifier = Modifier.size(
-                    TimeSelectorContainerWidth,
-                    TimeSelectorContainerHeight
-                ),
+                modifier = Modifier.size(TimeSelectorContainerWidth, TimeSelectorContainerHeight),
                 value = state.hourForDisplay,
                 state = state,
                 selection = TimePickerSelectionMode.Hour,
                 colors = colors,
             )
             DisplaySeparator(
-                Modifier.size(
-                    DisplaySeparatorWidth,
-                    PeriodSelectorVerticalContainerHeight
-                )
+                Modifier.size(DisplaySeparatorWidth, PeriodSelectorVerticalContainerHeight)
             )
             TimeSelector(
-                modifier = Modifier.size(
-                    TimeSelectorContainerWidth,
-                    TimeSelectorContainerHeight
-                ),
+                modifier = Modifier.size(TimeSelectorContainerWidth, TimeSelectorContainerHeight),
                 value = state.minute,
                 state = state,
                 selection = TimePickerSelectionMode.Minute,
@@ -1172,21 +1161,22 @@
     val measurePolicy = remember {
         MeasurePolicy { measurables, constraints ->
             val spacer = measurables.fastFirst { it.layoutId == "Spacer" }
-            val spacerPlaceable = spacer.measure(
-                constraints.copy(
-                    minWidth = 0,
-                    maxWidth = TimePickerTokens.PeriodSelectorOutlineWidth.roundToPx(),
-                )
-            )
-
-            val items = measurables.fastFilter { it.layoutId != "Spacer" }.fastMap { item ->
-                item.measure(
+            val spacerPlaceable =
+                spacer.measure(
                     constraints.copy(
                         minWidth = 0,
-                        maxWidth = constraints.maxWidth / 2
+                        maxWidth = TimePickerTokens.PeriodSelectorOutlineWidth.roundToPx(),
                     )
                 )
-            }
+
+            val items =
+                measurables
+                    .fastFilter { it.layoutId != "Spacer" }
+                    .fastMap { item ->
+                        item.measure(
+                            constraints.copy(minWidth = 0, maxWidth = constraints.maxWidth / 2)
+                        )
+                    }
 
             layout(constraints.maxWidth, constraints.maxHeight) {
                 items[0].place(0, 0)
@@ -1217,21 +1207,22 @@
     val measurePolicy = remember {
         MeasurePolicy { measurables, constraints ->
             val spacer = measurables.fastFirst { it.layoutId == "Spacer" }
-            val spacerPlaceable = spacer.measure(
-                constraints.copy(
-                    minHeight = 0,
-                    maxHeight = TimePickerTokens.PeriodSelectorOutlineWidth.roundToPx()
-                )
-            )
-
-            val items = measurables.fastFilter { it.layoutId != "Spacer" }.fastMap { item ->
-                item.measure(
+            val spacerPlaceable =
+                spacer.measure(
                     constraints.copy(
                         minHeight = 0,
-                        maxHeight = constraints.maxHeight / 2
+                        maxHeight = TimePickerTokens.PeriodSelectorOutlineWidth.roundToPx()
                     )
                 )
-            }
+
+            val items =
+                measurables
+                    .fastFilter { it.layoutId != "Spacer" }
+                    .fastMap { item ->
+                        item.measure(
+                            constraints.copy(minHeight = 0, maxHeight = constraints.maxHeight / 2)
+                        )
+                    }
 
             layout(constraints.maxWidth, constraints.maxHeight) {
                 items[0].place(0, 0)
@@ -1262,21 +1253,20 @@
     startShape: Shape,
     endShape: Shape,
 ) {
-    val borderStroke = BorderStroke(
-        TimePickerTokens.PeriodSelectorOutlineWidth,
-        colors.periodSelectorBorderColor
-    )
+    val borderStroke =
+        BorderStroke(TimePickerTokens.PeriodSelectorOutlineWidth, colors.periodSelectorBorderColor)
 
     val shape = PeriodSelectorContainerShape.value as CornerBasedShape
     val contentDescription = getString(Strings.TimePickerPeriodToggle)
     Layout(
-        modifier = modifier
-            .semantics {
-                isTraversalGroup = true
-                this.contentDescription = contentDescription
-            }
-            .selectableGroup()
-            .border(border = borderStroke, shape = shape),
+        modifier =
+            modifier
+                .semantics {
+                    isTraversalGroup = true
+                    this.contentDescription = contentDescription
+                }
+                .selectableGroup()
+                .border(border = borderStroke, shape = shape),
         measurePolicy = measurePolicy,
         content = {
             ToggleItem(
@@ -1284,21 +1274,23 @@
                 shape = startShape,
                 onClick = { state.isAfternoon = false },
                 colors = colors,
-            ) { Text(text = getString(string = Strings.TimePickerAM)) }
+            ) {
+                Text(text = getString(string = Strings.TimePickerAM))
+            }
             Spacer(
-                Modifier
-                    .layoutId("Spacer")
+                Modifier.layoutId("Spacer")
                     .zIndex(SeparatorZIndex)
                     .fillMaxSize()
                     .background(color = colors.periodSelectorBorderColor)
             )
             ToggleItem(
-                checked =
-                state.isAfternoon,
+                checked = state.isAfternoon,
                 shape = endShape,
                 onClick = { state.isAfternoon = true },
                 colors = colors,
-            ) { Text(getString(string = Strings.TimePickerPM)) }
+            ) {
+                Text(getString(string = Strings.TimePickerPM))
+            }
         }
     )
 }
@@ -1315,40 +1307,34 @@
     val containerColor = colors.periodSelectorContainerColor(checked)
 
     TextButton(
-        modifier = Modifier
-            .zIndex(if (checked) 0f else 1f)
-            .fillMaxSize()
-            .semantics { selected = checked },
+        modifier =
+            Modifier.zIndex(if (checked) 0f else 1f).fillMaxSize().semantics { selected = checked },
         contentPadding = PaddingValues(0.dp),
         shape = shape,
         onClick = onClick,
         content = content,
-        colors = ButtonDefaults.textButtonColors(
-            contentColor = contentColor,
-            containerColor = containerColor
-        )
+        colors =
+            ButtonDefaults.textButtonColors(
+                contentColor = contentColor,
+                containerColor = containerColor
+            )
     )
 }
 
 @Composable
 private fun DisplaySeparator(modifier: Modifier) {
-    val style = LocalTextStyle.current.copy(
-        textAlign = TextAlign.Center,
-        lineHeightStyle = LineHeightStyle(
-            alignment = LineHeightStyle.Alignment.Center,
-            trim = LineHeightStyle.Trim.Both
+    val style =
+        LocalTextStyle.current.copy(
+            textAlign = TextAlign.Center,
+            lineHeightStyle =
+                LineHeightStyle(
+                    alignment = LineHeightStyle.Alignment.Center,
+                    trim = LineHeightStyle.Trim.Both
+                )
         )
-    )
 
-    Box(
-        modifier = modifier.clearAndSetSemantics { },
-        contentAlignment = Alignment.Center
-    ) {
-        Text(
-            text = ":",
-            color = TimeFieldSeparatorColor.value,
-            style = style
-        )
+    Box(modifier = modifier.clearAndSetSemantics {}, contentAlignment = Alignment.Center) {
+        Text(text = ":", color = TimeFieldSeparatorColor.value, style = style)
     }
 }
 
@@ -1362,19 +1348,20 @@
     colors: TimePickerColors,
 ) {
     val selected = state.selection == selection
-    val selectorContentDescription = getString(
-        if (selection == TimePickerSelectionMode.Hour) {
-            Strings.TimePickerHourSelection
-        } else {
-            Strings.TimePickerMinuteSelection
-        }
-    )
+    val selectorContentDescription =
+        getString(
+            if (selection == TimePickerSelectionMode.Hour) {
+                Strings.TimePickerHourSelection
+            } else {
+                Strings.TimePickerMinuteSelection
+            }
+        )
 
     val containerColor = colors.timeSelectorContainerColor(selected)
     val contentColor = colors.timeSelectorContentColor(selected)
     Surface(
-        modifier = modifier
-            .semantics(mergeDescendants = true) {
+        modifier =
+            modifier.semantics(mergeDescendants = true) {
                 role = Role.RadioButton
                 this.contentDescription = selectorContentDescription
             },
@@ -1410,11 +1397,12 @@
     private val selection: TimePickerSelectionMode,
 ) : ModifierNodeElement<ClockDialNode>() {
 
-    override fun create(): ClockDialNode = ClockDialNode(
-        state = state,
-        autoSwitchToMinute = autoSwitchToMinute,
-        selection = selection,
-    )
+    override fun create(): ClockDialNode =
+        ClockDialNode(
+            state = state,
+            autoSwitchToMinute = autoSwitchToMinute,
+            selection = selection,
+        )
 
     override fun update(node: ClockDialNode) {
         node.updateNode(
@@ -1433,7 +1421,8 @@
     private var state: AnalogTimePickerState,
     private var autoSwitchToMinute: Boolean,
     private var selection: TimePickerSelectionMode,
-) : DelegatingNode(),
+) :
+    DelegatingNode(),
     PointerInputModifierNode,
     CompositionLocalConsumerModifierNode,
     LayoutAwareModifierNode {
@@ -1441,39 +1430,48 @@
     private var offsetX = 0f
     private var offsetY = 0f
     private var center: IntOffset = IntOffset.Zero
-    private val maxDist get() = with(requireDensity()) { MaxDistance.toPx() }
+    private val maxDist
+        get() = with(requireDensity()) { MaxDistance.toPx() }
 
-    private val pointerInputTapNode = delegate(SuspendingPointerInputModifierNode {
-        detectTapGestures(
-            onPress = {
-                offsetX = it.x
-                offsetY = it.y
-            },
-            onTap = {
-                coroutineScope.launch {
-                    state.onTap(it.x, it.y, maxDist, autoSwitchToMinute, center)
-                }
-            },
+    private val pointerInputTapNode =
+        delegate(
+            SuspendingPointerInputModifierNode {
+                detectTapGestures(
+                    onPress = {
+                        offsetX = it.x
+                        offsetY = it.y
+                    },
+                    onTap = {
+                        coroutineScope.launch {
+                            state.onTap(it.x, it.y, maxDist, autoSwitchToMinute, center)
+                        }
+                    },
+                )
+            }
         )
-    })
 
-    private val pointerInputDragNode = delegate(SuspendingPointerInputModifierNode {
-        detectDragGestures(onDragEnd = {
-            coroutineScope.launch {
-                if (autoSwitchToMinute) {
-                    state.selection = TimePickerSelectionMode.Minute
+    private val pointerInputDragNode =
+        delegate(
+            SuspendingPointerInputModifierNode {
+                detectDragGestures(
+                    onDragEnd = {
+                        coroutineScope.launch {
+                            if (autoSwitchToMinute) {
+                                state.selection = TimePickerSelectionMode.Minute
+                            }
+                            state.onGestureEnd()
+                        }
+                    }
+                ) { _, dragAmount ->
+                    coroutineScope.launch {
+                        offsetX += dragAmount.x
+                        offsetY += dragAmount.y
+                        state.rotateTo(atan(offsetY - center.y, offsetX - center.x))
+                    }
+                    state.moveSelector(offsetX, offsetY, maxDist, center)
                 }
-                state.onGestureEnd()
             }
-        }) { _, dragAmount ->
-            coroutineScope.launch {
-                offsetX += dragAmount.x
-                offsetY += dragAmount.y
-                state.rotateTo(atan(offsetY - center.y, offsetX - center.x))
-            }
-            state.moveSelector(offsetX, offsetY, maxDist, center)
-        }
-    })
+        )
 
     override fun onRemeasured(size: IntSize) {
         center = size.center
@@ -1502,9 +1500,7 @@
         this.autoSwitchToMinute = autoSwitchToMinute
         if (this.selection != selection) {
             this.selection = selection
-            coroutineScope.launch {
-                state.animateToCurrent()
-            }
+            coroutineScope.launch { state.animateToCurrent() }
         }
     }
 }
@@ -1516,18 +1512,16 @@
     autoSwitchToMinute: Boolean
 ) {
     Crossfade(
-        modifier = Modifier
-            .background(shape = CircleShape, color = colors.clockDialColor)
-            .then(ClockDialModifier(state, autoSwitchToMinute, state.selection))
-            .size(ClockDialContainerSize)
-            .drawSelector(state, colors),
+        modifier =
+            Modifier.background(shape = CircleShape, color = colors.clockDialColor)
+                .then(ClockDialModifier(state, autoSwitchToMinute, state.selection))
+                .size(ClockDialContainerSize)
+                .drawSelector(state, colors),
         targetState = state.clockFaceValues,
         animationSpec = tween(durationMillis = 200)
     ) { screen ->
         CircularLayout(
-            modifier = Modifier
-                .size(ClockDialContainerSize)
-                .semantics { selectableGroup() },
+            modifier = Modifier.size(ClockDialContainerSize).semantics { selectableGroup() },
             radius = OuterCircleSizeRadius,
         ) {
             CompositionLocalProvider(
@@ -1541,9 +1535,7 @@
                             screen[index] % 12
                         }
                     ClockText(
-                        modifier = Modifier.semantics {
-                            traversalIndex = index.toFloat()
-                        },
+                        modifier = Modifier.semantics { traversalIndex = index.toFloat() },
                         state = state,
                         value = outerValue,
                         autoSwitchToMinute = autoSwitchToMinute
@@ -1552,18 +1544,17 @@
 
                 if (state.selection == TimePickerSelectionMode.Hour && state.is24hour) {
                     CircularLayout(
-                        modifier = Modifier
-                            .layoutId(LayoutId.InnerCircle)
-                            .size(ClockDialContainerSize)
-                            .background(shape = CircleShape, color = Color.Transparent),
+                        modifier =
+                            Modifier.layoutId(LayoutId.InnerCircle)
+                                .size(ClockDialContainerSize)
+                                .background(shape = CircleShape, color = Color.Transparent),
                         radius = InnerCircleRadius
                     ) {
                         repeat(ExtraHours.size) { index ->
                             val innerValue = ExtraHours[index]
                             ClockText(
-                                modifier = Modifier.semantics {
-                                    traversalIndex = 12 + index.toFloat()
-                                },
+                                modifier =
+                                    Modifier.semantics { traversalIndex = 12 + index.toFloat() },
                                 state = state,
                                 value = innerValue,
                                 autoSwitchToMinute = autoSwitchToMinute
@@ -1579,63 +1570,65 @@
 private fun Modifier.drawSelector(
     state: AnalogTimePickerState,
     colors: TimePickerColors,
-): Modifier = this.drawWithContent {
-    val selectorOffsetPx = Offset(state.selectorPos.x.toPx(), state.selectorPos.y.toPx())
+): Modifier =
+    this.drawWithContent {
+        val selectorOffsetPx = Offset(state.selectorPos.x.toPx(), state.selectorPos.y.toPx())
 
-    val selectorRadius = ClockDialSelectorHandleContainerSize.toPx() / 2
-    val selectorColor = colors.selectorColor
+        val selectorRadius = ClockDialSelectorHandleContainerSize.toPx() / 2
+        val selectorColor = colors.selectorColor
 
-    // clear out the selector section
-    drawCircle(
-        radius = selectorRadius,
-        center = selectorOffsetPx,
-        color = Color.Black,
-        blendMode = BlendMode.Clear,
-    )
-
-    // draw the text composables
-    drawContent()
-
-    // draw the selector and clear out the numbers overlapping
-    drawCircle(
-        radius = selectorRadius,
-        center = selectorOffsetPx,
-        color = selectorColor,
-        blendMode = BlendMode.Xor
-    )
-
-    val strokeWidth = ClockDialSelectorTrackContainerWidth.toPx()
-    val lineLength = selectorOffsetPx.minus(
-        Offset(
-            (selectorRadius * cos(state.currentAngle)),
-            (selectorRadius * sin(state.currentAngle))
+        // clear out the selector section
+        drawCircle(
+            radius = selectorRadius,
+            center = selectorOffsetPx,
+            color = Color.Black,
+            blendMode = BlendMode.Clear,
         )
-    )
 
-    // draw the selector line
-    drawLine(
-        start = size.center,
-        strokeWidth = strokeWidth,
-        end = lineLength,
-        color = selectorColor,
-        blendMode = BlendMode.SrcOver
-    )
+        // draw the text composables
+        drawContent()
 
-    // draw the selector small dot
-    drawCircle(
-        radius = ClockDialSelectorCenterContainerSize.toPx() / 2,
-        center = size.center,
-        color = selectorColor,
-    )
+        // draw the selector and clear out the numbers overlapping
+        drawCircle(
+            radius = selectorRadius,
+            center = selectorOffsetPx,
+            color = selectorColor,
+            blendMode = BlendMode.Xor
+        )
 
-    // draw the portion of the number that was overlapping
-    drawCircle(
-        radius = selectorRadius,
-        center = selectorOffsetPx,
-        color = colors.clockDialContentColor(selected = true),
-        blendMode = BlendMode.DstOver
-    )
-}
+        val strokeWidth = ClockDialSelectorTrackContainerWidth.toPx()
+        val lineLength =
+            selectorOffsetPx.minus(
+                Offset(
+                    (selectorRadius * cos(state.currentAngle)),
+                    (selectorRadius * sin(state.currentAngle))
+                )
+            )
+
+        // draw the selector line
+        drawLine(
+            start = size.center,
+            strokeWidth = strokeWidth,
+            end = lineLength,
+            color = selectorColor,
+            blendMode = BlendMode.SrcOver
+        )
+
+        // draw the selector small dot
+        drawCircle(
+            radius = ClockDialSelectorCenterContainerSize.toPx() / 2,
+            center = size.center,
+            color = selectorColor,
+        )
+
+        // draw the portion of the number that was overlapping
+        drawCircle(
+            radius = selectorRadius,
+            center = selectorOffsetPx,
+            color = colors.clockDialContentColor(selected = true),
+            blendMode = BlendMode.DstOver
+        )
+    }
 
 @Composable
 private fun ClockText(
@@ -1657,36 +1650,43 @@
         )
 
     val text = value.toLocalString()
-    val selected = if (state.selection == TimePickerSelectionMode.Minute) {
-        state.minute.toLocalString() == text
-    } else {
-        state.hour.toLocalString() == text
-    }
+    val selected =
+        if (state.selection == TimePickerSelectionMode.Minute) {
+            state.minute.toLocalString() == text
+        } else {
+            state.hour.toLocalString() == text
+        }
 
     Box(
         contentAlignment = Alignment.Center,
-        modifier = modifier
-            .minimumInteractiveComponentSize()
-            .size(MinimumInteractiveSize)
-            .onGloballyPositioned {
-                parentCenter = it.parentCoordinates?.size?.center ?: IntOffset.Zero
-                center = it.boundsInParent().center
-            }
-            .focusable()
-            .semantics(mergeDescendants = true) {
-                onClick {
-                    scope.launch {
-                        state.onTap(center.x, center.y, maxDist, autoSwitchToMinute, parentCenter)
-                    }
-                    true
+        modifier =
+            modifier
+                .minimumInteractiveComponentSize()
+                .size(MinimumInteractiveSize)
+                .onGloballyPositioned {
+                    parentCenter = it.parentCoordinates?.size?.center ?: IntOffset.Zero
+                    center = it.boundsInParent().center
                 }
-                this.selected = selected
-            }
+                .focusable()
+                .semantics(mergeDescendants = true) {
+                    onClick {
+                        scope.launch {
+                            state.onTap(
+                                center.x,
+                                center.y,
+                                maxDist,
+                                autoSwitchToMinute,
+                                parentCenter
+                            )
+                        }
+                        true
+                    }
+                    this.selected = selected
+                }
     ) {
         Text(
-            modifier = Modifier.clearAndSetSemantics {
-                this.contentDescription = contentDescription
-            },
+            modifier =
+                Modifier.clearAndSetSemantics { this.contentDescription = contentDescription },
             text = text,
             style = style,
         )
@@ -1718,11 +1718,12 @@
     }
 
     try {
-        val newValue = if (value.text.length == 3 && value.selection.start == 1) {
-            value.text[0].digitToInt()
-        } else {
-            value.text.toInt()
-        }
+        val newValue =
+            if (value.text.length == 3 && value.selection.start == 1) {
+                value.text[0].digitToInt()
+            } else {
+                value.text.toInt()
+            }
 
         if (newValue <= max) {
             if (selection == TimePickerSelectionMode.Hour) {
@@ -1742,8 +1743,7 @@
                 }
             )
         }
-    } catch (_: NumberFormatException) {
-    } catch (_: IllegalArgumentException) {
+    } catch (_: NumberFormatException) {} catch (_: IllegalArgumentException) {
         // do nothing no state update
     }
 }
@@ -1762,59 +1762,61 @@
 ) {
     val interactionSource = remember { MutableInteractionSource() }
     val focusRequester = remember { FocusRequester() }
-    val textFieldColors = OutlinedTextFieldDefaults.colors(
-        focusedContainerColor = colors.timeSelectorContainerColor(true),
-        unfocusedContainerColor = colors.timeSelectorContainerColor(true),
-        focusedTextColor = colors.timeSelectorContentColor(true),
-    )
+    val textFieldColors =
+        OutlinedTextFieldDefaults.colors(
+            focusedContainerColor = colors.timeSelectorContainerColor(true),
+            unfocusedContainerColor = colors.timeSelectorContainerColor(true),
+            focusedTextColor = colors.timeSelectorContentColor(true),
+        )
     val selected = selection == state.selection
     Column(modifier = modifier) {
         if (!selected) {
             TimeSelector(
                 modifier = Modifier.size(TimeFieldContainerWidth, TimeFieldContainerHeight),
-                value = if (selection == TimePickerSelectionMode.Hour) {
-                    state.hourForDisplay
-                } else {
-                    state.minute
-                },
+                value =
+                    if (selection == TimePickerSelectionMode.Hour) {
+                        state.hourForDisplay
+                    } else {
+                        state.minute
+                    },
                 state = state,
                 selection = selection,
                 colors = colors,
             )
         }
 
-        val contentDescription = getString(
-            if (selection == TimePickerSelectionMode.Minute) {
-                Strings.TimePickerMinuteTextField
-            } else {
-                Strings.TimePickerHourTextField
-            }
-        )
+        val contentDescription =
+            getString(
+                if (selection == TimePickerSelectionMode.Minute) {
+                    Strings.TimePickerMinuteTextField
+                } else {
+                    Strings.TimePickerHourTextField
+                }
+            )
 
         Box(Modifier.visible(selected)) {
             BasicTextField(
                 value = value,
                 onValueChange = onValueChange,
-                modifier = Modifier
-                    .focusRequester(focusRequester)
-                    .size(TimeFieldContainerWidth, TimeFieldContainerHeight)
-                    .semantics {
-                        this.contentDescription = contentDescription
-                    },
+                modifier =
+                    Modifier.focusRequester(focusRequester)
+                        .size(TimeFieldContainerWidth, TimeFieldContainerHeight)
+                        .semantics { this.contentDescription = contentDescription },
                 interactionSource = interactionSource,
                 keyboardOptions = keyboardOptions,
                 keyboardActions = keyboardActions,
                 textStyle = LocalTextStyle.current,
                 enabled = true,
                 singleLine = true,
-                cursorBrush = Brush.verticalGradient(
-                    0.00f to Color.Transparent,
-                    0.10f to Color.Transparent,
-                    0.10f to MaterialTheme.colorScheme.primary,
-                    0.90f to MaterialTheme.colorScheme.primary,
-                    0.90f to Color.Transparent,
-                    1.00f to Color.Transparent
-                )
+                cursorBrush =
+                    Brush.verticalGradient(
+                        0.00f to Color.Transparent,
+                        0.10f to Color.Transparent,
+                        0.10f to MaterialTheme.colorScheme.primary,
+                        0.90f to MaterialTheme.colorScheme.primary,
+                        0.90f to Color.Transparent,
+                        1.00f to Color.Transparent
+                    )
             ) {
                 OutlinedTextFieldDefaults.DecorationBox(
                     value = value.text,
@@ -1839,16 +1841,15 @@
         }
 
         Text(
-            modifier = Modifier
-                .offset(y = SupportLabelTop)
-                .clearAndSetSemantics {},
-            text = getString(
-                if (selection == TimePickerSelectionMode.Hour) {
-                    Strings.TimePickerHour
-                } else {
-                    Strings.TimePickerMinute
-                }
-            ),
+            modifier = Modifier.offset(y = SupportLabelTop).clearAndSetSemantics {},
+            text =
+                getString(
+                    if (selection == TimePickerSelectionMode.Hour) {
+                        Strings.TimePickerHour
+                    } else {
+                        Strings.TimePickerMinute
+                    }
+                ),
             color = TimeInputTokens.TimeFieldSupportingTextColor.value,
             style = TimeInputTokens.TimeFieldSupportingTextFont.value
         )
@@ -1868,14 +1869,15 @@
     radius: Dp,
     content: @Composable () -> Unit,
 ) {
-    Layout(
-        modifier = modifier, content = content
-    ) { measurables, constraints ->
+    Layout(modifier = modifier, content = content) { measurables, constraints ->
         val radiusPx = radius.toPx()
         val itemConstraints = constraints.copy(minWidth = 0, minHeight = 0)
-        val placeables = measurables.fastFilter {
-            it.layoutId != LayoutId.Selector && it.layoutId != LayoutId.InnerCircle
-        }.fastMap { measurable -> measurable.measure(itemConstraints) }
+        val placeables =
+            measurables
+                .fastFilter {
+                    it.layoutId != LayoutId.Selector && it.layoutId != LayoutId.InnerCircle
+                }
+                .fastMap { measurable -> measurable.measure(itemConstraints) }
         val selectorMeasurable = measurables.fastFirstOrNull { it.layoutId == LayoutId.Selector }
         val innerMeasurable = measurables.fastFirstOrNull { it.layoutId == LayoutId.InnerCircle }
         val theta = FullCircle / (placeables.count())
@@ -1893,9 +1895,7 @@
                 val centerOffsetY = constraints.maxHeight / 2 - it.height / 2
                 val offsetX = radiusPx * cos(theta * i - QuarterCircle) + centerOffsetX
                 val offsetY = radiusPx * sin(theta * i - QuarterCircle) + centerOffsetY
-                it.place(
-                    x = offsetX.roundToInt(), y = offsetY.roundToInt()
-                )
+                it.place(x = offsetX.roundToInt(), y = offsetY.roundToInt())
             }
 
             innerCirclePlaceable?.place(
@@ -1913,13 +1913,14 @@
     is24Hour: Boolean,
     number: Int
 ): String {
-    val id = if (selection == TimePickerSelectionMode.Minute) {
-        Strings.TimePickerMinuteSuffix
-    } else if (is24Hour) {
-        Strings.TimePicker24HourSuffix
-    } else {
-        Strings.TimePickerHourSuffix
-    }
+    val id =
+        if (selection == TimePickerSelectionMode.Minute) {
+            Strings.TimePickerMinuteSuffix
+        } else if (is24Hour) {
+            Strings.TimePicker24HourSuffix
+        } else {
+            Strings.TimePickerHourSuffix
+        }
 
     return getString(id, number)
 }
@@ -1936,12 +1937,12 @@
 }
 
 private enum class LayoutId {
-    Selector, InnerCircle,
+    Selector,
+    InnerCircle,
 }
 
 internal expect val defaultTimePickerLayoutType: TimePickerLayoutType
-    @Composable
-    @ReadOnlyComposable get
+    @Composable @ReadOnlyComposable get
 
 private const val FullCircle: Float = (PI * 2).toFloat()
 private const val HalfCircle: Float = FullCircle / 2f
@@ -1962,30 +1963,28 @@
 private val MinimumInteractiveSize = 48.dp
 private val Minutes = intListOf(0, 5, 10, 15, 20, 25, 30, 35, 40, 45, 50, 55)
 private val Hours = intListOf(12, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11)
-private val ExtraHours: IntList = MutableIntList(Hours.size).apply {
-    Hours.forEach { add((it % 12 + 12)) }
-}
+private val ExtraHours: IntList =
+    MutableIntList(Hours.size).apply { Hours.forEach { add((it % 12 + 12)) } }
 private val PeriodToggleMargin = 12.dp
 
 /**
- * Measure the composable with 0,0 so that it stays on the screen. Necessary to correctly
- * handle focus
+ * Measure the composable with 0,0 so that it stays on the screen. Necessary to correctly handle
+ * focus
  */
 @Stable
-private fun Modifier.visible(visible: Boolean) = this.then(
-    VisibleModifier(
-        visible,
-        debugInspectorInfo {
-            name = "visible"
-            properties["visible"] = visible
-        }
+private fun Modifier.visible(visible: Boolean) =
+    this.then(
+        VisibleModifier(
+            visible,
+            debugInspectorInfo {
+                name = "visible"
+                properties["visible"] = visible
+            }
+        )
     )
-)
 
-private class VisibleModifier(
-    val visible: Boolean,
-    inspectorInfo: InspectorInfo.() -> Unit
-) : LayoutModifier, InspectorValueInfo(inspectorInfo) {
+private class VisibleModifier(val visible: Boolean, inspectorInfo: InspectorInfo.() -> Unit) :
+    LayoutModifier, InspectorValueInfo(inspectorInfo) {
 
     override fun MeasureScope.measure(
         measurable: Measurable,
@@ -1996,9 +1995,7 @@
         if (!visible) {
             return layout(0, 0) {}
         }
-        return layout(placeable.width, placeable.height) {
-            placeable.place(0, 0)
-        }
+        return layout(placeable.width, placeable.height) { placeable.place(0, 0) }
     }
 
     override fun hashCode(): Int = visible.hashCode()
diff --git a/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/TonalPalette.kt b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/TonalPalette.kt
index c795263..4bfd47a 100644
--- a/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/TonalPalette.kt
+++ b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/TonalPalette.kt
@@ -22,8 +22,8 @@
 /**
  * Tonal Palette structure in Material.
  *
- * A tonal palette is comprised of 5 tonal ranges. Each tonal range includes the 13 stops, or
- * tonal swatches.
+ * A tonal palette is comprised of 5 tonal ranges. Each tonal range includes the 13 stops, or tonal
+ * swatches.
  *
  * Tonal range names are:
  * - Neutral (N)
@@ -137,9 +137,7 @@
     val tertiary0: Color,
 )
 
-/**
- * Baseline colors in Material.
- */
+/** Baseline colors in Material. */
 internal val BaselineTonalPalette =
     TonalPalette(
         neutral100 = PaletteTokens.Neutral100,
diff --git a/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/Tooltip.kt b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/Tooltip.kt
index a673371..f4e12ac 100644
--- a/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/Tooltip.kt
+++ b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/Tooltip.kt
@@ -70,8 +70,8 @@
 /**
  * Material TooltipBox that wraps a composable with a tooltip.
  *
- * tooltips provide a descriptive message for an anchor.
- * It can be used to call the users attention to the anchor.
+ * tooltips provide a descriptive message for an anchor. It can be used to call the users attention
+ * to the anchor.
  *
  * Tooltip that is invoked when the anchor is long pressed:
  *
@@ -105,18 +105,18 @@
  *
  * @sample androidx.compose.material3.samples.RichTooltipWithCustomCaretSample
  *
- * @param positionProvider [PopupPositionProvider] that will be used to place the tooltip
- * relative to the anchor content.
+ * @param positionProvider [PopupPositionProvider] that will be used to place the tooltip relative
+ *   to the anchor content.
  * @param tooltip the composable that will be used to populate the tooltip's content.
  * @param state handles the state of the tooltip's visibility.
  * @param modifier the [Modifier] to be applied to the TooltipBox.
- * @param focusable [Boolean] that determines if the tooltip is focusable. When true,
- * the tooltip will consume touch events while it's shown and will have accessibility
- * focus move to the first element of the component. When false, the tooltip
- * won't consume touch events while it's shown but assistive-tech users will need
- * to swipe or drag to get to the first element of the component.
- * @param enableUserInput [Boolean] which determines if this TooltipBox will handle
- * long press and mouse hover to trigger the tooltip through the state provided.
+ * @param focusable [Boolean] that determines if the tooltip is focusable. When true, the tooltip
+ *   will consume touch events while it's shown and will have accessibility focus move to the first
+ *   element of the component. When false, the tooltip won't consume touch events while it's shown
+ *   but assistive-tech users will need to swipe or drag to get to the first element of the
+ *   component.
+ * @param enableUserInput [Boolean] which determines if this TooltipBox will handle long press and
+ *   mouse hover to trigger the tooltip through the state provided.
  * @param content the composable that the tooltip will anchor to.
  */
 @Composable
@@ -136,11 +136,7 @@
     val scope = remember { TooltipScopeImpl { anchorBounds.value } }
 
     val wrappedContent: @Composable () -> Unit = {
-        Box(
-            modifier = Modifier.onGloballyPositioned { anchorBounds.value = it }
-        ) {
-            content()
-        }
+        Box(modifier = Modifier.onGloballyPositioned { anchorBounds.value = it }) { content() }
     }
 
     BasicTooltipBox(
@@ -155,31 +151,25 @@
 }
 
 /**
- * Tooltip scope for [TooltipBox] to be used to obtain the [LayoutCoordinates] of the
- * anchor content, and to draw a caret for the tooltip.
+ * Tooltip scope for [TooltipBox] to be used to obtain the [LayoutCoordinates] of the anchor
+ * content, and to draw a caret for the tooltip.
  */
 @ExperimentalMaterial3Api
 sealed interface TooltipScope {
     /**
-     * [Modifier] that is used to draw the caret for the tooltip. A [LayoutCoordinates] will
-     * be provided that can be used to obtain the bounds of the anchor content, which can be used
-     * to draw the caret more precisely. [PlainTooltip] and [RichTooltip] have
-     * default implementations for their caret.
+     * [Modifier] that is used to draw the caret for the tooltip. A [LayoutCoordinates] will be
+     * provided that can be used to obtain the bounds of the anchor content, which can be used to
+     * draw the caret more precisely. [PlainTooltip] and [RichTooltip] have default implementations
+     * for their caret.
      */
-    fun Modifier.drawCaret(
-        draw: CacheDrawScope.(LayoutCoordinates?) -> DrawResult
-    ): Modifier
+    fun Modifier.drawCaret(draw: CacheDrawScope.(LayoutCoordinates?) -> DrawResult): Modifier
 }
 
 @OptIn(ExperimentalMaterial3Api::class)
-internal class TooltipScopeImpl(
-    val getAnchorBounds: () -> LayoutCoordinates?
-) : TooltipScope {
+internal class TooltipScopeImpl(val getAnchorBounds: () -> LayoutCoordinates?) : TooltipScope {
     override fun Modifier.drawCaret(
         draw: CacheDrawScope.(LayoutCoordinates?) -> DrawResult
-    ): Modifier = this.drawWithCache {
-        draw(getAnchorBounds())
-    }
+    ): Modifier = this.drawWithCache { draw(getAnchorBounds()) }
 }
 
 /**
@@ -188,9 +178,9 @@
  * Usually used with [TooltipBox].
  *
  * @param modifier the [Modifier] to be applied to the tooltip.
- * @param caretSize [DpSize] for the caret of the tooltip, if a default
- * caret is desired with a specific dimension. Please see [TooltipDefaults.caretSize] to
- * see the default dimensions. Pass in Dp.Unspecified for this parameter if no caret is desired.
+ * @param caretSize [DpSize] for the caret of the tooltip, if a default caret is desired with a
+ *   specific dimension. Please see [TooltipDefaults.caretSize] to see the default dimensions. Pass
+ *   in Dp.Unspecified for this parameter if no caret is desired.
  * @param shape the [Shape] that should be applied to the tooltip container.
  * @param contentColor [Color] that will be applied to the tooltip's content.
  * @param containerColor [Color] that will be applied to the tooltip's container.
@@ -212,17 +202,17 @@
 )
 
 /**
- * Rich text tooltip that allows the user to pass in a title, text, and action.
- * Tooltips are used to provide a descriptive message.
+ * Rich text tooltip that allows the user to pass in a title, text, and action. Tooltips are used to
+ * provide a descriptive message.
  *
  * Usually used with [TooltipBox]
  *
  * @param modifier the [Modifier] to be applied to the tooltip.
  * @param title An optional title for the tooltip.
  * @param action An optional action for the tooltip.
- * @param caretSize [DpSize] for the caret of the tooltip, if a default
- * caret is desired with a specific dimension. Please see [TooltipDefaults.caretSize] to
- * see the default dimensions. Pass in Dp.Unspecified for this parameter if no caret is desired.
+ * @param caretSize [DpSize] for the caret of the tooltip, if a default caret is desired with a
+ *   specific dimension. Please see [TooltipDefaults.caretSize] to see the default dimensions. Pass
+ *   in Dp.Unspecified for this parameter if no caret is desired.
  * @param shape the [Shape] that should be applied to the tooltip container.
  * @param colors [RichTooltipColors] that will be applied to the tooltip's container and content.
  * @param tonalElevation the tonal elevation of the tooltip.
@@ -243,51 +233,37 @@
     text: @Composable () -> Unit
 )
 
-/**
- * Tooltip defaults that contain default values for both [PlainTooltip] and [RichTooltip]
- */
+/** Tooltip defaults that contain default values for both [PlainTooltip] and [RichTooltip] */
 @ExperimentalMaterial3Api
 object TooltipDefaults {
-    /**
-     * The default [Shape] for a [PlainTooltip]'s container.
-     */
+    /** The default [Shape] for a [PlainTooltip]'s container. */
     val plainTooltipContainerShape: Shape
         @Composable get() = PlainTooltipTokens.ContainerShape.value
 
-    /**
-     * The default [Color] for a [PlainTooltip]'s container.
-     */
+    /** The default [Color] for a [PlainTooltip]'s container. */
     val plainTooltipContainerColor: Color
         @Composable get() = PlainTooltipTokens.ContainerColor.value
 
-    /**
-     * The default [Color] for the content within the [PlainTooltip].
-     */
+    /** The default [Color] for the content within the [PlainTooltip]. */
     val plainTooltipContentColor: Color
         @Composable get() = PlainTooltipTokens.SupportingTextColor.value
 
-    /**
-     * The default [Shape] for a [RichTooltip]'s container.
-     */
-    val richTooltipContainerShape: Shape @Composable get() =
-        RichTooltipTokens.ContainerShape.value
+    /** The default [Shape] for a [RichTooltip]'s container. */
+    val richTooltipContainerShape: Shape
+        @Composable get() = RichTooltipTokens.ContainerShape.value
+
+    /** The default [DpSize] for tooltip carets. */
+    val caretSize: DpSize = DpSize(16.dp, 8.dp)
 
     /**
-     * The default [DpSize] for tooltip carets.
+     * Method to create a [RichTooltipColors] for [RichTooltip] using [RichTooltipTokens] to obtain
+     * the default colors.
      */
-    val caretSize: DpSize =
-        DpSize(16.dp, 8.dp)
+    @Composable fun richTooltipColors() = MaterialTheme.colorScheme.defaultRichTooltipColors
 
     /**
-     * Method to create a [RichTooltipColors] for [RichTooltip]
-     * using [RichTooltipTokens] to obtain the default colors.
-     */
-    @Composable
-    fun richTooltipColors() = MaterialTheme.colorScheme.defaultRichTooltipColors
-
-    /**
-     * Method to create a [RichTooltipColors] for [RichTooltip]
-     * using [RichTooltipTokens] to obtain the default colors.
+     * Method to create a [RichTooltipColors] for [RichTooltip] using [RichTooltipTokens] to obtain
+     * the default colors.
      */
     @Composable
     fun richTooltipColors(
@@ -295,28 +271,29 @@
         contentColor: Color = Color.Unspecified,
         titleContentColor: Color = Color.Unspecified,
         actionContentColor: Color = Color.Unspecified,
-    ): RichTooltipColors = MaterialTheme.colorScheme.defaultRichTooltipColors.copy(
-        containerColor = containerColor,
-        contentColor = contentColor,
-        titleContentColor = titleContentColor,
-        actionContentColor = actionContentColor
-    )
+    ): RichTooltipColors =
+        MaterialTheme.colorScheme.defaultRichTooltipColors.copy(
+            containerColor = containerColor,
+            contentColor = contentColor,
+            titleContentColor = titleContentColor,
+            actionContentColor = actionContentColor
+        )
 
     internal val ColorScheme.defaultRichTooltipColors: RichTooltipColors
         get() {
-            return defaultRichTooltipColorsCached ?: RichTooltipColors(
-                containerColor = fromToken(RichTooltipTokens.ContainerColor),
-                contentColor = fromToken(RichTooltipTokens.SupportingTextColor),
-                titleContentColor = fromToken(RichTooltipTokens.SubheadColor),
-                actionContentColor = fromToken(RichTooltipTokens.ActionLabelTextColor),
-            ).also {
-                defaultRichTooltipColorsCached = it
-            }
+            return defaultRichTooltipColorsCached
+                ?: RichTooltipColors(
+                        containerColor = fromToken(RichTooltipTokens.ContainerColor),
+                        contentColor = fromToken(RichTooltipTokens.SupportingTextColor),
+                        titleContentColor = fromToken(RichTooltipTokens.SubheadColor),
+                        actionContentColor = fromToken(RichTooltipTokens.ActionLabelTextColor),
+                    )
+                    .also { defaultRichTooltipColorsCached = it }
         }
 
     /**
-     * [PopupPositionProvider] that should be used with [PlainTooltip].
-     * It correctly positions the tooltip in respect to the anchor content.
+     * [PopupPositionProvider] that should be used with [PlainTooltip]. It correctly positions the
+     * tooltip in respect to the anchor content.
      *
      * @param spacingBetweenTooltipAndAnchor the spacing between the tooltip and the anchor content.
      */
@@ -324,9 +301,8 @@
     fun rememberPlainTooltipPositionProvider(
         spacingBetweenTooltipAndAnchor: Dp = SpacingBetweenTooltipAndAnchor
     ): PopupPositionProvider {
-        val tooltipAnchorSpacing = with(LocalDensity.current) {
-            spacingBetweenTooltipAndAnchor.roundToPx()
-        }
+        val tooltipAnchorSpacing =
+            with(LocalDensity.current) { spacingBetweenTooltipAndAnchor.roundToPx() }
         return remember(tooltipAnchorSpacing) {
             object : PopupPositionProvider {
                 override fun calculatePosition(
@@ -341,8 +317,7 @@
                     // but if this causes the tooltip to overlap with the anchor
                     // then we place it below the anchor
                     var y = anchorBounds.top - popupContentSize.height - tooltipAnchorSpacing
-                    if (y < 0)
-                        y = anchorBounds.bottom + tooltipAnchorSpacing
+                    if (y < 0) y = anchorBounds.bottom + tooltipAnchorSpacing
                     return IntOffset(x, y)
                 }
             }
@@ -350,8 +325,8 @@
     }
 
     /**
-     * [PopupPositionProvider] that should be used with [RichTooltip].
-     * It correctly positions the tooltip in respect to the anchor content.
+     * [PopupPositionProvider] that should be used with [RichTooltip]. It correctly positions the
+     * tooltip in respect to the anchor content.
      *
      * @param spacingBetweenTooltipAndAnchor the spacing between the tooltip and the anchor content.
      */
@@ -359,9 +334,8 @@
     fun rememberRichTooltipPositionProvider(
         spacingBetweenTooltipAndAnchor: Dp = SpacingBetweenTooltipAndAnchor
     ): PopupPositionProvider {
-        val tooltipAnchorSpacing = with(LocalDensity.current) {
-            spacingBetweenTooltipAndAnchor.roundToPx()
-        }
+        val tooltipAnchorSpacing =
+            with(LocalDensity.current) { spacingBetweenTooltipAndAnchor.roundToPx() }
         return remember(tooltipAnchorSpacing) {
             object : PopupPositionProvider {
                 override fun calculatePosition(
@@ -377,16 +351,16 @@
                         x = anchorBounds.right - popupContentSize.width
                         // Center if it'll also collide with the left side of the screen
                         if (x < 0)
-                            x = anchorBounds.left +
-                                (anchorBounds.width - popupContentSize.width) / 2
+                            x =
+                                anchorBounds.left +
+                                    (anchorBounds.width - popupContentSize.width) / 2
                     }
 
                     // Tooltip prefers to be above the anchor,
                     // but if this causes the tooltip to overlap with the anchor
                     // then we place it below the anchor
                     var y = anchorBounds.top - popupContentSize.height - tooltipAnchorSpacing
-                    if (y < 0)
-                        y = anchorBounds.bottom + tooltipAnchorSpacing
+                    if (y < 0) y = anchorBounds.bottom + tooltipAnchorSpacing
                     return IntOffset(x, y)
                 }
             }
@@ -404,20 +378,21 @@
     val actionContentColor: Color
 ) {
     /**
-     * Returns a copy of this RichTooltipColors, optionally overriding some of the values.
-     * This uses the Color.Unspecified to mean “use the value from the source”
+     * Returns a copy of this RichTooltipColors, optionally overriding some of the values. This uses
+     * the Color.Unspecified to mean “use the value from the source”
      */
     fun copy(
         containerColor: Color = this.containerColor,
         contentColor: Color = this.contentColor,
         titleContentColor: Color = this.titleContentColor,
         actionContentColor: Color = this.actionContentColor,
-    ) = RichTooltipColors(
-        containerColor.takeOrElse { this.containerColor },
-        contentColor.takeOrElse { this.contentColor },
-        titleContentColor.takeOrElse { this.titleContentColor },
-        actionContentColor.takeOrElse { this.actionContentColor },
-    )
+    ) =
+        RichTooltipColors(
+            containerColor.takeOrElse { this.containerColor },
+            contentColor.takeOrElse { this.contentColor },
+            titleContentColor.takeOrElse { this.titleContentColor },
+            actionContentColor.takeOrElse { this.actionContentColor },
+        )
 
     override fun equals(other: Any?): Boolean {
         if (this === other) return true
@@ -444,15 +419,13 @@
  * Create and remember the default [TooltipState] for [TooltipBox].
  *
  * @param initialIsVisible the initial value for the tooltip's visibility when drawn.
- * @param isPersistent [Boolean] that determines if the tooltip associated with this
- * will be persistent or not. If isPersistent is true, then the tooltip will
- * only be dismissed when the user clicks outside the bounds of the tooltip or if
- * [TooltipState.dismiss] is called. When isPersistent is false, the tooltip will dismiss after
- * a short duration. Ideally, this should be set to true when there is actionable content
- * being displayed within a tooltip.
- * @param mutatorMutex [MutatorMutex] used to ensure that for all of the tooltips associated
- * with the mutator mutex, only one will be shown on the screen at any time.
- *
+ * @param isPersistent [Boolean] that determines if the tooltip associated with this will be
+ *   persistent or not. If isPersistent is true, then the tooltip will only be dismissed when the
+ *   user clicks outside the bounds of the tooltip or if [TooltipState.dismiss] is called. When
+ *   isPersistent is false, the tooltip will dismiss after a short duration. Ideally, this should be
+ *   set to true when there is actionable content being displayed within a tooltip.
+ * @param mutatorMutex [MutatorMutex] used to ensure that for all of the tooltips associated with
+ *   the mutator mutex, only one will be shown on the screen at any time.
  */
 @Composable
 @ExperimentalMaterial3Api
@@ -461,10 +434,7 @@
     isPersistent: Boolean = false,
     mutatorMutex: MutatorMutex = BasicTooltipDefaults.GlobalMutatorMutex
 ): TooltipState =
-    remember(
-        isPersistent,
-        mutatorMutex
-    ) {
+    remember(isPersistent, mutatorMutex) {
         TooltipStateImpl(
             initialIsVisible = initialIsVisible,
             isPersistent = isPersistent,
@@ -476,14 +446,13 @@
  * Constructor extension function for [TooltipState]
  *
  * @param initialIsVisible the initial value for the tooltip's visibility when drawn.
- * @param isPersistent [Boolean] that determines if the tooltip associated with this
- * will be persistent or not. If isPersistent is true, then the tooltip will
- * only be dismissed when the user clicks outside the bounds of the tooltip or if
- * [TooltipState.dismiss] is called. When isPersistent is false, the tooltip will dismiss after
- * a short duration. Ideally, this should be set to true when there is actionable content
- * being displayed within a tooltip.
- * @param mutatorMutex [MutatorMutex] used to ensure that for all of the tooltips associated
- * with the mutator mutex, only one will be shown on the screen at any time.
+ * @param isPersistent [Boolean] that determines if the tooltip associated with this will be
+ *   persistent or not. If isPersistent is true, then the tooltip will only be dismissed when the
+ *   user clicks outside the bounds of the tooltip or if [TooltipState.dismiss] is called. When
+ *   isPersistent is false, the tooltip will dismiss after a short duration. Ideally, this should be
+ *   set to true when there is actionable content being displayed within a tooltip.
+ * @param mutatorMutex [MutatorMutex] used to ensure that for all of the tooltips associated with
+ *   the mutator mutex, only one will be shown on the screen at any time.
  */
 @ExperimentalMaterial3Api
 fun TooltipState(
@@ -510,21 +479,16 @@
     override val isVisible: Boolean
         get() = transition.currentState || transition.targetState
 
-            /**
-     * continuation used to clean up
-     */
+    /** continuation used to clean up */
     private var job: (CancellableContinuation<Unit>)? = null
 
     /**
-     * Show the tooltip associated with the current [TooltipState].
-     * When this method is called, all of the other tooltips associated
-     * with [mutatorMutex] will be dismissed.
+     * Show the tooltip associated with the current [TooltipState]. When this method is called, all
+     * of the other tooltips associated with [mutatorMutex] will be dismissed.
      *
      * @param mutatePriority [MutatePriority] to be used with [mutatorMutex].
      */
-    override suspend fun show(
-        mutatePriority: MutatePriority
-    ) {
+    override suspend fun show(mutatePriority: MutatePriority) {
         val cancellableShow: suspend () -> Unit = {
             suspendCancellableCoroutine { continuation ->
                 transition.targetState = true
@@ -539,9 +503,7 @@
                 if (isPersistent) {
                     cancellableShow()
                 } else {
-                    withTimeout(BasicTooltipDefaults.TooltipDuration) {
-                        cancellableShow()
-                    }
+                    withTimeout(BasicTooltipDefaults.TooltipDuration) { cancellableShow() }
                 }
             } finally {
                 if (mutatePriority != MutatePriority.PreventUserInput) {
@@ -552,137 +514,114 @@
         }
     }
 
-    /**
-     * Dismiss the tooltip associated with
-     * this [TooltipState] if it's currently being shown.
-     */
+    /** Dismiss the tooltip associated with this [TooltipState] if it's currently being shown. */
     override fun dismiss() {
         transition.targetState = false
     }
 
-    /**
-     * Cleans up [mutatorMutex] when the tooltip associated
-     * with this state leaves Composition.
-     */
+    /** Cleans up [mutatorMutex] when the tooltip associated with this state leaves Composition. */
     override fun onDispose() {
         job?.cancel()
     }
 }
 
 /**
- * The state that is associated with a [TooltipBox].
- * Each instance of [TooltipBox] should have its own [TooltipState].
+ * The state that is associated with a [TooltipBox]. Each instance of [TooltipBox] should have its
+ * own [TooltipState].
  */
 @ExperimentalMaterial3Api
 interface TooltipState {
     /**
-     * The current transition state of the tooltip.
-     * Used to start the transition of the tooltip when fading in and out.
+     * The current transition state of the tooltip. Used to start the transition of the tooltip when
+     * fading in and out.
      */
     val transition: MutableTransitionState<Boolean>
 
-    /**
-     * [Boolean] that indicates if the tooltip is currently being shown or not.
-     */
+    /** [Boolean] that indicates if the tooltip is currently being shown or not. */
     val isVisible: Boolean
 
     /**
-     * [Boolean] that determines if the tooltip associated with this
-     * will be persistent or not. If isPersistent is true, then the tooltip will
-     * only be dismissed when the user clicks outside the bounds of the tooltip or if
-     * [TooltipState.dismiss] is called. When isPersistent is false, the tooltip will
-     * dismiss after a short duration. Ideally, this should be set to true when there
-     * is actionable content being displayed within a tooltip.
+     * [Boolean] that determines if the tooltip associated with this will be persistent or not. If
+     * isPersistent is true, then the tooltip will only be dismissed when the user clicks outside
+     * the bounds of the tooltip or if [TooltipState.dismiss] is called. When isPersistent is false,
+     * the tooltip will dismiss after a short duration. Ideally, this should be set to true when
+     * there is actionable content being displayed within a tooltip.
      */
     val isPersistent: Boolean
 
     /**
-     * Show the tooltip associated with the current [TooltipState].
-     * When this method is called all of the other tooltips currently
-     * being shown will dismiss.
+     * Show the tooltip associated with the current [TooltipState]. When this method is called all
+     * of the other tooltips currently being shown will dismiss.
      *
      * @param mutatePriority [MutatePriority] to be used.
      */
     suspend fun show(mutatePriority: MutatePriority = MutatePriority.Default)
 
-    /**
-     * Dismiss the tooltip associated with
-     * this [TooltipState] if it's currently being shown.
-     */
+    /** Dismiss the tooltip associated with this [TooltipState] if it's currently being shown. */
     fun dismiss()
 
-    /**
-     * Clean up when the this state leaves Composition.
-     */
+    /** Clean up when the this state leaves Composition. */
     fun onDispose()
 }
 
 @Stable
-internal fun Modifier.textVerticalPadding(
-    subheadExists: Boolean,
-    actionExists: Boolean
-): Modifier {
+internal fun Modifier.textVerticalPadding(subheadExists: Boolean, actionExists: Boolean): Modifier {
     return if (!subheadExists && !actionExists) {
         this.padding(vertical = PlainTooltipVerticalPadding)
     } else {
-        this
-            .paddingFromBaseline(top = HeightFromSubheadToTextFirstLine)
+        this.paddingFromBaseline(top = HeightFromSubheadToTextFirstLine)
             .padding(bottom = TextBottomPadding)
     }
 }
 
-internal fun Modifier.animateTooltip(
-    transition: Transition<Boolean>
-): Modifier = composed(
-    inspectorInfo = debugInspectorInfo {
-        name = "animateTooltip"
-        properties["transition"] = transition
+internal fun Modifier.animateTooltip(transition: Transition<Boolean>): Modifier =
+    composed(
+        inspectorInfo =
+            debugInspectorInfo {
+                name = "animateTooltip"
+                properties["transition"] = transition
+            }
+    ) {
+        val scale by
+            transition.animateFloat(
+                transitionSpec = {
+                    if (false isTransitioningTo true) {
+                        // show tooltip
+                        tween(
+                            durationMillis = TooltipFadeInDuration,
+                            easing = LinearOutSlowInEasing
+                        )
+                    } else {
+                        // dismiss tooltip
+                        tween(
+                            durationMillis = TooltipFadeOutDuration,
+                            easing = LinearOutSlowInEasing
+                        )
+                    }
+                },
+                label = "tooltip transition: scaling"
+            ) {
+                if (it) 1f else 0.8f
+            }
+
+        val alpha by
+            transition.animateFloat(
+                transitionSpec = {
+                    if (false isTransitioningTo true) {
+                        // show tooltip
+                        tween(durationMillis = TooltipFadeInDuration, easing = LinearEasing)
+                    } else {
+                        // dismiss tooltip
+                        tween(durationMillis = TooltipFadeOutDuration, easing = LinearEasing)
+                    }
+                },
+                label = "tooltip transition: alpha"
+            ) {
+                if (it) 1f else 0f
+            }
+
+        this.graphicsLayer(scaleX = scale, scaleY = scale, alpha = alpha)
     }
-) {
-    val scale by transition.animateFloat(
-        transitionSpec = {
-            if (false isTransitioningTo true) {
-                // show tooltip
-                tween(
-                    durationMillis = TooltipFadeInDuration,
-                    easing = LinearOutSlowInEasing
-                )
-            } else {
-                // dismiss tooltip
-                tween(
-                    durationMillis = TooltipFadeOutDuration,
-                    easing = LinearOutSlowInEasing
-                )
-            }
-        },
-        label = "tooltip transition: scaling"
-    ) { if (it) 1f else 0.8f }
-
-    val alpha by transition.animateFloat(
-        transitionSpec = {
-            if (false isTransitioningTo true) {
-                // show tooltip
-                tween(
-                    durationMillis = TooltipFadeInDuration,
-                    easing = LinearEasing
-                )
-            } else {
-                // dismiss tooltip
-                tween(
-                    durationMillis = TooltipFadeOutDuration,
-                    easing = LinearEasing
-                )
-            }
-        },
-        label = "tooltip transition: alpha"
-    ) { if (it) 1f else 0f }
-
-    this.graphicsLayer(
-        scaleX = scale,
-        scaleY = scale,
-        alpha = alpha
-    )
-}
 
 internal val SpacingBetweenTooltipAndAnchor = 4.dp
 internal val TooltipMinHeight = 24.dp
@@ -699,6 +638,7 @@
 private val TextBottomPadding = 16.dp
 internal val ActionLabelMinHeight = 36.dp
 internal val ActionLabelBottomPadding = 8.dp
-// No specification for fade in and fade out duration, so aligning it with the behavior for snack bar
+// No specification for fade in and fade out duration, so aligning it with the behavior for snack
+// bar
 internal const val TooltipFadeInDuration = 150
 internal const val TooltipFadeOutDuration = 75
diff --git a/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/Typography.kt b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/Typography.kt
index d9ef648..0bfc8d5 100644
--- a/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/Typography.kt
+++ b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/Typography.kt
@@ -34,48 +34,49 @@
  * The type scale is a combination of thirteen styles that are supported by the type system. It
  * contains reusable categories of text, each with an intended application and meaning.
  *
- * To learn more about typography, see [Material Design typography](https://m3.material.io/styles/typography/overview).
+ * To learn more about typography, see
+ * [Material Design typography](https://m3.material.io/styles/typography/overview).
  *
  * @property displayLarge displayLarge is the largest display text.
  * @property displayMedium displayMedium is the second largest display text.
  * @property displaySmall displaySmall is the smallest display text.
  * @property headlineLarge headlineLarge is the largest headline, reserved for short, important text
- * or numerals. For headlines, you can choose an expressive font, such as a display, handwritten, or
- * script style. These unconventional font designs have details and intricacy that help attract the
- * eye.
+ *   or numerals. For headlines, you can choose an expressive font, such as a display, handwritten,
+ *   or script style. These unconventional font designs have details and intricacy that help attract
+ *   the eye.
  * @property headlineMedium headlineMedium is the second largest headline, reserved for short,
- * important text or numerals. For headlines, you can choose an expressive font, such as a display,
- * handwritten, or script style. These unconventional font designs have details and intricacy that
- * help attract the eye.
+ *   important text or numerals. For headlines, you can choose an expressive font, such as a
+ *   display, handwritten, or script style. These unconventional font designs have details and
+ *   intricacy that help attract the eye.
  * @property headlineSmall headlineSmall is the smallest headline, reserved for short, important
- * text or numerals. For headlines, you can choose an expressive font, such as a display,
- * handwritten, or script style. These unconventional font designs have details and intricacy that
- * help attract the eye.
+ *   text or numerals. For headlines, you can choose an expressive font, such as a display,
+ *   handwritten, or script style. These unconventional font designs have details and intricacy that
+ *   help attract the eye.
  * @property titleLarge titleLarge is the largest title, and is typically reserved for
- * medium-emphasis text that is shorter in length. Serif or sans serif typefaces work well for
- * subtitles.
+ *   medium-emphasis text that is shorter in length. Serif or sans serif typefaces work well for
+ *   subtitles.
  * @property titleMedium titleMedium is the second largest title, and is typically reserved for
- * medium-emphasis text that is shorter in length. Serif or sans serif typefaces work well for
- * subtitles.
+ *   medium-emphasis text that is shorter in length. Serif or sans serif typefaces work well for
+ *   subtitles.
  * @property titleSmall titleSmall is the smallest title, and is typically reserved for
- * medium-emphasis text that is shorter in length. Serif or sans serif typefaces work well for
- * subtitles.
+ *   medium-emphasis text that is shorter in length. Serif or sans serif typefaces work well for
+ *   subtitles.
  * @property bodyLarge bodyLarge is the largest body, and is typically used for long-form writing as
- * it works well for small text sizes. For longer sections of text, a serif or sans serif typeface
- * is recommended.
+ *   it works well for small text sizes. For longer sections of text, a serif or sans serif typeface
+ *   is recommended.
  * @property bodyMedium bodyMedium is the second largest body, and is typically used for long-form
- * writing as it works well for small text sizes. For longer sections of text, a serif or sans serif
- * typeface is recommended.
+ *   writing as it works well for small text sizes. For longer sections of text, a serif or sans
+ *   serif typeface is recommended.
  * @property bodySmall bodySmall is the smallest body, and is typically used for long-form writing
- * as it works well for small text sizes. For longer sections of text, a serif or sans serif
- * typeface is recommended.
+ *   as it works well for small text sizes. For longer sections of text, a serif or sans serif
+ *   typeface is recommended.
  * @property labelLarge labelLarge text is a call to action used in different types of buttons (such
- * as text, outlined and contained buttons) and in tabs, dialogs, and cards. Button text is
- * typically sans serif, using all caps text.
+ *   as text, outlined and contained buttons) and in tabs, dialogs, and cards. Button text is
+ *   typically sans serif, using all caps text.
  * @property labelMedium labelMedium is one of the smallest font sizes. It is used sparingly to
- * annotate imagery or to introduce a headline.
+ *   annotate imagery or to introduce a headline.
  * @property labelSmall labelSmall is one of the smallest font sizes. It is used sparingly to
- * annotate imagery or to introduce a headline.
+ *   annotate imagery or to introduce a headline.
  */
 @Immutable
 class Typography(
@@ -184,9 +185,7 @@
     }
 }
 
-/**
- * Helper function for component typography tokens.
- */
+/** Helper function for component typography tokens. */
 private fun Typography.fromToken(value: TypographyKeyTokens): TextStyle {
     return when (value) {
         TypographyKeyTokens.DisplayLarge -> displayLarge
@@ -208,8 +207,6 @@
 }
 
 internal val TypographyKeyTokens.value: TextStyle
-    @Composable
-    @ReadOnlyComposable
-    get() = MaterialTheme.typography.fromToken(this)
+    @Composable @ReadOnlyComposable get() = MaterialTheme.typography.fromToken(this)
 
 internal val LocalTypography = staticCompositionLocalOf { Typography() }
diff --git a/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/carousel/Arrangement.kt b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/carousel/Arrangement.kt
index 11f3179..1939313 100644
--- a/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/carousel/Arrangement.kt
+++ b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/carousel/Arrangement.kt
@@ -22,8 +22,8 @@
 
 /**
  * A class that holds data about a combination of large, medium, and small items, knows how to alter
- * an arrangement to fit within an available space, and can assess the arrangement's
- * desirability according to a priority heuristic.
+ * an arrangement to fit within an available space, and can assess the arrangement's desirability
+ * according to a priority heuristic.
  */
 internal class Arrangement(
     private val priority: Int,
@@ -47,9 +47,8 @@
     /**
      * Calculates the cost of this arrangement to determine visual desirability and adherence to
      * inputs. Cost is a value calculated based on the arrangement's `priority` and how true it is
-     * to the target large size.
-     * Arrangements have a lower cost if they have a priority closer to 1 and their `largeSize` is
-     * altered as little as possible from `targetLargeSize`.
+     * to the target large size. Arrangements have a lower cost if they have a priority closer to 1
+     * and their `largeSize` is altered as little as possible from `targetLargeSize`.
      *
      * @param targetLargeSize the size large items would like to be
      * @return a float representing the cost of this arrangement where the lower the cost the better
@@ -61,9 +60,7 @@
         return abs(targetLargeSize - largeSize) * priority
     }
 
-    /**
-     * Returns number of items (keylines) in the arrangement
-     */
+    /** Returns number of items (keylines) in the arrangement */
     fun itemCount(): Int {
         return largeCount + mediumCount + smallCount
     }
@@ -75,8 +72,7 @@
 
         /**
          * Create an arrangement for all possible permutations for `smallCounts` and `largeCounts`,
-         * fit each into the available space, and return the arrangement with the lowest
-         * cost.
+         * fit each into the available space, and return the arrangement with the lowest cost.
          *
          * Keep in mind that the returned arrangements do not take into account the available space
          * from the carousel. They will all occupy varying degrees of more or less space. The caller
@@ -89,15 +85,15 @@
          * @param minSmallSize the minimum size of which small item sizes are allowed to be
          * @param maxSmallSize the maximum size of which small item sizes are allowed to be
          * @param smallCounts an array of small item counts for a valid arrangement ordered by
-         * priority
+         *   priority
          * @param targetMediumSize the size medium items would like to be
          * @param mediumCounts an array of medium item counts for a valid arrangement ordered by
-         * priority
+         *   priority
          * @param targetLargeSize the size large items would like to be
          * @param largeCounts an array of large item counts for a valid arrangement ordered by
-         * priority
+         *   priority
          * @return the arrangement that is considered the most desirable and has been adjusted to
-         * fit within the available space
+         *   fit within the available space
          */
         fun findLowestCostArrangement(
             availableSpace: Float,
@@ -116,22 +112,24 @@
             for (largeCount in largeCounts) {
                 for (mediumCount in mediumCounts) {
                     for (smallCount in smallCounts) {
-                        val arrangement = fit(
-                            priority = priority,
-                            availableSpace = availableSpace,
-                            itemSpacing = itemSpacing,
-                            smallCount = smallCount,
-                            smallSize = targetSmallSize,
-                            minSmallSize = minSmallSize,
-                            maxSmallSize = maxSmallSize,
-                            mediumCount = mediumCount,
-                            mediumSize = targetMediumSize,
-                            largeCount = largeCount,
-                            largeSize = targetLargeSize,
-                        )
-                        if (lowestCostArrangement == null ||
-                            arrangement.cost(targetLargeSize) <
-                            lowestCostArrangement.cost(targetLargeSize)
+                        val arrangement =
+                            fit(
+                                priority = priority,
+                                availableSpace = availableSpace,
+                                itemSpacing = itemSpacing,
+                                smallCount = smallCount,
+                                smallSize = targetSmallSize,
+                                minSmallSize = minSmallSize,
+                                maxSmallSize = maxSmallSize,
+                                mediumCount = mediumCount,
+                                mediumSize = targetMediumSize,
+                                largeCount = largeCount,
+                                largeSize = targetLargeSize,
+                            )
+                        if (
+                            lowestCostArrangement == null ||
+                                arrangement.cost(targetLargeSize) <
+                                    lowestCostArrangement.cost(targetLargeSize)
                         ) {
                             lowestCostArrangement = arrangement
                             if (lowestCostArrangement.cost(targetLargeSize) == 0f) {
@@ -186,38 +184,35 @@
         ): Arrangement {
             val totalItemCount = largeCount + mediumCount + smallCount
             val availableSpaceWithoutSpacing = availableSpace - ((totalItemCount - 1) * itemSpacing)
-            var arrangedSmallSize = smallSize.coerceIn(
-                minSmallSize,
-                maxSmallSize
-            )
+            var arrangedSmallSize = smallSize.coerceIn(minSmallSize, maxSmallSize)
             var arrangedMediumSize = mediumSize
             var arrangedLargeSize = largeSize
 
-            val totalSpaceTakenByArrangement = arrangedLargeSize * largeCount +
-                arrangedMediumSize * mediumCount + arrangedSmallSize * smallCount
+            val totalSpaceTakenByArrangement =
+                arrangedLargeSize * largeCount +
+                    arrangedMediumSize * mediumCount +
+                    arrangedSmallSize * smallCount
             val delta = availableSpaceWithoutSpacing - totalSpaceTakenByArrangement
             // First, resize small items within their allowable min-max range to try to fit the
             // arrangement into the available space.
             if (smallCount > 0 && delta > 0) {
                 // grow the small items
-                arrangedSmallSize += min(
-                    delta / smallCount,
-                    maxSmallSize - arrangedSmallSize
-                )
+                arrangedSmallSize += min(delta / smallCount, maxSmallSize - arrangedSmallSize)
             } else if (smallCount > 0 && delta < 0) {
                 // shrink the small items
-                arrangedSmallSize += max(
-                    delta / smallCount,
-                    minSmallSize - arrangedSmallSize
-                )
+                arrangedSmallSize += max(delta / smallCount, minSmallSize - arrangedSmallSize)
             }
 
             // Zero out small size if there are no small items
             arrangedSmallSize = if (smallCount > 0) arrangedSmallSize else 0f
-            arrangedLargeSize = calculateLargeSize(
-                availableSpaceWithoutSpacing, smallCount, arrangedSmallSize,
-                mediumCount, largeCount
-            )
+            arrangedLargeSize =
+                calculateLargeSize(
+                    availableSpaceWithoutSpacing,
+                    smallCount,
+                    arrangedSmallSize,
+                    mediumCount,
+                    largeCount
+                )
             arrangedMediumSize = (arrangedLargeSize + arrangedSmallSize) / 2f
 
             // If the large size has been adjusted away from its target size to fit the arrangement,
@@ -265,7 +260,7 @@
          * @param mediumCount the number of medium items in the calculation
          * @param largeCount the number of large items in the calculation
          * @return the large item size which will fit for the available space and other item
-         * constraints
+         *   constraints
          */
         private fun calculateLargeSize(
             availableSpace: Float,
diff --git a/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/carousel/Carousel.kt b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/carousel/Carousel.kt
index 2a6e41e..0bd44ad 100644
--- a/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/carousel/Carousel.kt
+++ b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/carousel/Carousel.kt
@@ -57,41 +57,43 @@
 import kotlin.math.roundToInt
 
 /**
- * <a href=https://m3.material.io/components/carousel/overview" class="external" target="_blank">Material Design Carousel</a>
+ * <a href=https://m3.material.io/components/carousel/overview" class="external"
+ * target="_blank">Material Design Carousel</a>
  *
  * A horizontal carousel meant to display many items at once for quick browsing of smaller content
  * like album art or photo thumbnails.
  *
- * Note that this carousel may adjust the size of items in order to ensure a mix of large,
- * medium, and small items fit perfectly into the available space and are arranged in a
- * visually pleasing way. Carousel then lays out items using the large item size and clips
- * (or masks) items depending on their scroll offset to create items which smoothly expand
- * and collapse between the large, medium, and small sizes.
+ * Note that this carousel may adjust the size of items in order to ensure a mix of large, medium,
+ * and small items fit perfectly into the available space and are arranged in a visually pleasing
+ * way. Carousel then lays out items using the large item size and clips (or masks) items depending
+ * on their scroll offset to create items which smoothly expand and collapse between the large,
+ * medium, and small sizes.
  *
  * For more information, see <a href="https://material.io/components/carousel/overview">design
  * guidelines</a>.
  *
  * Example of a multi-browse carousel:
+ *
  * @sample androidx.compose.material3.samples.HorizontalMultiBrowseCarouselSample
  *
  * @param state The state object to be used to control the carousel's state
  * @param preferredItemWidth The width that large, fully visible items would like to be in the
- * horizontal axis. This width is a target and will likely be adjusted by carousel in order to fit
- * a whole number of items within the container. Carousel adjusts small items first (between the
- * [minSmallItemWidth] and [maxSmallItemWidth]) then medium items when present, and finally large
- * items if necessary.
+ *   horizontal axis. This width is a target and will likely be adjusted by carousel in order to fit
+ *   a whole number of items within the container. Carousel adjusts small items first (between the
+ *   [minSmallItemWidth] and [maxSmallItemWidth]) then medium items when present, and finally large
+ *   items if necessary.
  * @param modifier A modifier instance to be applied to this carousel container
  * @param itemSpacing The amount of space used to separate items in the carousel
  * @param flingBehavior The [TargetedFlingBehavior] to be used for post scroll gestures
  * @param minSmallItemWidth The minimum allowable width of small items in dp. Depending on the
- * [preferredItemWidth] and the width of the carousel, the small item width will be chosen from a
- * range of [minSmallItemWidth] and [maxSmallItemWidth]
+ *   [preferredItemWidth] and the width of the carousel, the small item width will be chosen from a
+ *   range of [minSmallItemWidth] and [maxSmallItemWidth]
  * @param maxSmallItemWidth The maximum allowable width of small items in dp. Depending on the
- * [preferredItemWidth] and the width of the carousel, the small item width will be chosen from a
- * range of [minSmallItemWidth] and [maxSmallItemWidth]
- * @param contentPadding a padding around the whole content. This will add padding for the
- * content after it has been clipped. You can use it to add a padding before the first item or
- * after the last one. Use [itemSpacing] to add spacing between the items.
+ *   [preferredItemWidth] and the width of the carousel, the small item width will be chosen from a
+ *   range of [minSmallItemWidth] and [maxSmallItemWidth]
+ * @param contentPadding a padding around the whole content. This will add padding for the content
+ *   after it has been clipped. You can use it to add a padding before the first item or after the
+ *   last one. Use [itemSpacing] to add spacing between the items.
  * @param content The carousel's content Composable
  */
 @ExperimentalMaterial3Api
@@ -137,7 +139,8 @@
 }
 
 /**
- * <a href=https://m3.material.io/components/carousel/overview" class="external" target="_blank">Material Design Carousel</a>
+ * <a href=https://m3.material.io/components/carousel/overview" class="external"
+ * target="_blank">Material Design Carousel</a>
  *
  * A horizontal carousel that displays its items with the given size except for one item at the end
  * that is cut off.
@@ -150,6 +153,7 @@
  * guidelines</a>.
  *
  * Example of an uncontained carousel:
+ *
  * @sample androidx.compose.material3.samples.HorizontalUncontainedCarouselSample
  *
  * @param state The state object to be used to control the carousel's state
@@ -157,9 +161,9 @@
  * @param modifier A modifier instance to be applied to this carousel container
  * @param itemSpacing The amount of space used to separate items in the carousel
  * @param flingBehavior The [TargetedFlingBehavior] to be used for post scroll gestures
- * @param contentPadding a padding around the whole content. This will add padding for the
- * content after it has been clipped. You can use it to add a padding before the first item or
- * after the last one. Use [itemSpacing] to add spacing between the items.
+ * @param contentPadding a padding around the whole content. This will add padding for the content
+ *   after it has been clipped. You can use it to add a padding before the first item or after the
+ *   last one. Use [itemSpacing] to add spacing between the items.
  * @param content The carousel's content Composable
  */
 @ExperimentalMaterial3Api
@@ -199,7 +203,8 @@
 }
 
 /**
- * <a href=https://m3.material.io/components/carousel/overview" class="external" target="_blank">Material Design Carousel</a>
+ * <a href=https://m3.material.io/components/carousel/overview" class="external"
+ * target="_blank">Material Design Carousel</a>
  *
  * Carousels contain a collection of items that changes sizes according to their placement and the
  * chosen strategy.
@@ -207,18 +212,19 @@
  * @param state The state object to be used to control the carousel's state.
  * @param orientation The layout orientation of the carousel
  * @param keylineList The list of keylines that are fixed positions along the scrolling axis which
- * define the state an item should be in when its center is co-located with the keyline's position.
+ *   define the state an item should be in when its center is co-located with the keyline's
+ *   position.
  * @param contentPadding a padding around the whole content. This will add padding for the
  * @param maxNonFocalVisibleItemCount the maximum number of items that are visible but not fully
- * unmasked (focal) at one time. This number helps determine how many items should be composed
- * to fill the entire viewport.
- * @param modifier A modifier instance to be applied to this carousel outer layout
- * content after it has been clipped. You can use it to add a padding before the first item or
- * after the last one. Use [itemSpacing] to add spacing between the items.
+ *   unmasked (focal) at one time. This number helps determine how many items should be composed to
+ *   fill the entire viewport.
+ * @param modifier A modifier instance to be applied to this carousel outer layout content after it
+ *   has been clipped. You can use it to add a padding before the first item or after the last one.
+ *   Use [itemSpacing] to add spacing between the items.
  * @param itemSpacing The amount of space used to separate items in the carousel
  * @param flingBehavior The [TargetedFlingBehavior] to be used for post scroll gestures
  * @param content The carousel's content Composable where each call is passed the index, from the
- * total item count, of the item being composed
+ *   total item count, of the item being composed
  */
 @OptIn(ExperimentalMaterial3Api::class)
 @Composable
@@ -236,9 +242,10 @@
 ) {
     val beforeContentPadding = contentPadding.calculateBeforeContentPadding(orientation)
     val afterContentPadding = contentPadding.calculateAfterContentPadding(orientation)
-    val pageSize = remember(keylineList) {
-        CarouselPageSize(keylineList, beforeContentPadding, afterContentPadding)
-    }
+    val pageSize =
+        remember(keylineList) {
+            CarouselPageSize(keylineList, beforeContentPadding, afterContentPadding)
+        }
 
     val snapPosition = KeylineSnapPosition(pageSize)
 
@@ -246,10 +253,11 @@
         HorizontalPager(
             state = state.pagerState,
             // Only pass cross axis padding as main axis padding will be handled by the strategy
-            contentPadding = PaddingValues(
-                top = contentPadding.calculateTopPadding(),
-                bottom = contentPadding.calculateBottomPadding()
-            ),
+            contentPadding =
+                PaddingValues(
+                    top = contentPadding.calculateTopPadding(),
+                    bottom = contentPadding.calculateBottomPadding()
+                ),
             pageSize = pageSize,
             pageSpacing = itemSpacing,
             beyondViewportPageCount = maxNonFocalVisibleItemCount,
@@ -272,13 +280,14 @@
             }
 
             Box(
-                modifier = Modifier.carouselItem(
-                    index = page,
-                    state = state,
-                    strategy = { pageSize.strategy },
-                    carouselItemInfo = carouselItemInfo,
-                    clipShape = clipShape
-                )
+                modifier =
+                    Modifier.carouselItem(
+                        index = page,
+                        state = state,
+                        strategy = { pageSize.strategy },
+                        carouselItemInfo = carouselItemInfo,
+                        clipShape = clipShape
+                    )
             ) {
                 scope.content(page)
             }
@@ -287,10 +296,11 @@
         VerticalPager(
             state = state.pagerState,
             // Only pass cross axis padding as main axis padding will be handled by the strategy
-            contentPadding = PaddingValues(
-                start = contentPadding.calculateStartPadding(LocalLayoutDirection.current),
-                end = contentPadding.calculateEndPadding(LocalLayoutDirection.current)
-            ),
+            contentPadding =
+                PaddingValues(
+                    start = contentPadding.calculateStartPadding(LocalLayoutDirection.current),
+                    end = contentPadding.calculateEndPadding(LocalLayoutDirection.current)
+                ),
             pageSize = pageSize,
             pageSpacing = itemSpacing,
             beyondViewportPageCount = maxNonFocalVisibleItemCount,
@@ -313,13 +323,14 @@
             }
 
             Box(
-                modifier = Modifier.carouselItem(
-                    index = page,
-                    state = state,
-                    strategy = { pageSize.strategy },
-                    carouselItemInfo = carouselItemInfo,
-                    clipShape = clipShape
-                )
+                modifier =
+                    Modifier.carouselItem(
+                        index = page,
+                        state = state,
+                        strategy = { pageSize.strategy },
+                        carouselItemInfo = carouselItemInfo,
+                        clipShape = clipShape
+                    )
             ) {
                 scope.content(page)
             }
@@ -329,32 +340,35 @@
 
 @Composable
 private fun PaddingValues.calculateBeforeContentPadding(orientation: Orientation): Float {
-    val dpValue = if (orientation == Orientation.Vertical) {
-        calculateTopPadding()
-    } else {
-        calculateStartPadding(LocalLayoutDirection.current)
-    }
+    val dpValue =
+        if (orientation == Orientation.Vertical) {
+            calculateTopPadding()
+        } else {
+            calculateStartPadding(LocalLayoutDirection.current)
+        }
 
     return with(LocalDensity.current) { dpValue.toPx() }
 }
 
 @Composable
 private fun PaddingValues.calculateAfterContentPadding(orientation: Orientation): Float {
-    val dpValue = if (orientation == Orientation.Vertical) {
-        calculateBottomPadding()
-    } else {
-        calculateEndPadding(LocalLayoutDirection.current)
-    }
+    val dpValue =
+        if (orientation == Orientation.Vertical) {
+            calculateBottomPadding()
+        } else {
+            calculateEndPadding(LocalLayoutDirection.current)
+        }
 
     return with(LocalDensity.current) { dpValue.toPx() }
 }
 
 /**
- * A [PageSize] implementation that maintains a strategy that is kept up-to-date with the
- * latest available space of the container.
+ * A [PageSize] implementation that maintains a strategy that is kept up-to-date with the latest
+ * available space of the container.
  *
  * @param keylineList The list of keylines that are fixed positions along the scrolling axis which
- * define the state an item should be in when its center is co-located with the keyline's position.
+ *   define the state an item should be in when its center is co-located with the keyline's
+ *   position.
  */
 internal class CarouselPageSize(
     private val keylineList: (availableSpace: Float, itemSpacing: Float) -> KeylineList,
@@ -368,13 +382,14 @@
 
     override fun Density.calculateMainAxisPageSize(availableSpace: Int, pageSpacing: Int): Int {
         val keylines = keylineList.invoke(availableSpace.toFloat(), pageSpacing.toFloat())
-        strategyState = Strategy(
-            keylines,
-            availableSpace.toFloat(),
-            pageSpacing.toFloat(),
-            beforeContentPadding,
-            afterContentPadding
-        )
+        strategyState =
+            Strategy(
+                keylines,
+                availableSpace.toFloat(),
+                pageSpacing.toFloat(),
+                beforeContentPadding,
+                afterContentPadding
+            )
 
         // If a valid strategy is available, use the strategy's item size. Otherwise, default to
         // a full size item as Pager does by default.
@@ -386,9 +401,7 @@
     }
 }
 
-/**
- * This class defines ways items can be aligned along a carousel's main axis.
- */
+/** This class defines ways items can be aligned along a carousel's main axis. */
 @JvmInline
 internal value class CarouselAlignment private constructor(internal val value: Int) {
     companion object {
@@ -404,16 +417,16 @@
 }
 
 /**
- * A modifier that handles clipping and translating an item as it moves along the scrolling axis
- * of a Carousel.
+ * A modifier that handles clipping and translating an item as it moves along the scrolling axis of
+ * a Carousel.
  *
  * @param index the index of the item in the carousel
  * @param state the carousel state
  * @param strategy the strategy used to mask and translate items in the carousel
  * @param carouselItemInfo the item info that should be updated with the changes in this modifier
  * @param clipShape the shape the item will clip itself to. This should be a rectangle with a bounds
- * that match the carousel item info's mask rect. Corner radii and other shape customizations can
- * be done by the client using [CarouselItemScope.maskClip] and [CarouselItemScope.maskBorder].
+ *   that match the carousel item info's mask rect. Corner radii and other shape customizations can
+ *   be done by the client using [CarouselItemScope.maskClip] and [CarouselItemScope.maskBorder].
  */
 @OptIn(ExperimentalMaterial3Api::class)
 internal fun Modifier.carouselItem(
@@ -427,7 +440,7 @@
         val strategyResult = strategy.invoke()
         if (!strategyResult.isValid) {
             // If there is no strategy, avoid displaying content
-            return@layout layout(0, 0) { }
+            return@layout layout(0, 0) {}
         }
 
         val isVertical = state.pagerState.layoutInfo.orientation == Orientation.Vertical
@@ -435,96 +448,101 @@
 
         // Force the item to use the strategy's itemMainAxisSize along its main axis
         val mainAxisSize = strategyResult.itemMainAxisSize
-        val itemConstraints = if (isVertical) {
-            constraints.copy(
-                minWidth = constraints.minWidth,
-                maxWidth = constraints.maxWidth,
-                minHeight = mainAxisSize.roundToInt(),
-                maxHeight = mainAxisSize.roundToInt()
-            )
-        } else {
-            constraints.copy(
-                minWidth = mainAxisSize.roundToInt(),
-                maxWidth = mainAxisSize.roundToInt(),
-                minHeight = constraints.minHeight,
-                maxHeight = constraints.maxHeight
-            )
-        }
+        val itemConstraints =
+            if (isVertical) {
+                constraints.copy(
+                    minWidth = constraints.minWidth,
+                    maxWidth = constraints.maxWidth,
+                    minHeight = mainAxisSize.roundToInt(),
+                    maxHeight = mainAxisSize.roundToInt()
+                )
+            } else {
+                constraints.copy(
+                    minWidth = mainAxisSize.roundToInt(),
+                    maxWidth = mainAxisSize.roundToInt(),
+                    minHeight = constraints.minHeight,
+                    maxHeight = constraints.maxHeight
+                )
+            }
 
         val placeable = measurable.measure(itemConstraints)
         layout(placeable.width, placeable.height) {
-            placeable.placeWithLayer(0, 0, layerBlock = {
-                val scrollOffset = calculateCurrentScrollOffset(state, strategyResult)
-                val maxScrollOffset = calculateMaxScrollOffset(state, strategyResult)
-                // TODO: Reduce the number of times keylins are calculated
-                val keylines = strategyResult.getKeylineListForScrollOffset(
-                    scrollOffset,
-                    maxScrollOffset
-                )
-                val roundedKeylines = strategyResult.getKeylineListForScrollOffset(
-                    scrollOffset = scrollOffset,
-                    maxScrollOffset = maxScrollOffset,
-                    roundToNearestStep = true
-                )
+            placeable.placeWithLayer(
+                0,
+                0,
+                layerBlock = {
+                    val scrollOffset = calculateCurrentScrollOffset(state, strategyResult)
+                    val maxScrollOffset = calculateMaxScrollOffset(state, strategyResult)
+                    // TODO: Reduce the number of times keylins are calculated
+                    val keylines =
+                        strategyResult.getKeylineListForScrollOffset(scrollOffset, maxScrollOffset)
+                    val roundedKeylines =
+                        strategyResult.getKeylineListForScrollOffset(
+                            scrollOffset = scrollOffset,
+                            maxScrollOffset = maxScrollOffset,
+                            roundToNearestStep = true
+                        )
 
-                // Find center of the item at this index
-                val itemSizeWithSpacing = strategyResult.itemMainAxisSize +
-                    strategyResult.itemSpacing
-                val unadjustedCenter = (index * itemSizeWithSpacing) +
-                    (strategyResult.itemMainAxisSize / 2f) - scrollOffset
+                    // Find center of the item at this index
+                    val itemSizeWithSpacing =
+                        strategyResult.itemMainAxisSize + strategyResult.itemSpacing
+                    val unadjustedCenter =
+                        (index * itemSizeWithSpacing) + (strategyResult.itemMainAxisSize / 2f) -
+                            scrollOffset
 
-                // Find the keyline before and after this item's center and create an interpolated
-                // keyline that the item should use for its clip shape and offset
-                val keylineBefore =
-                    keylines.getKeylineBefore(unadjustedCenter)
-                val keylineAfter =
-                    keylines.getKeylineAfter(unadjustedCenter)
-                val progress = getProgress(keylineBefore, keylineAfter, unadjustedCenter)
-                val interpolatedKeyline = lerp(keylineBefore, keylineAfter, progress)
-                val isOutOfKeylineBounds = keylineBefore == keylineAfter
+                    // Find the keyline before and after this item's center and create an
+                    // interpolated
+                    // keyline that the item should use for its clip shape and offset
+                    val keylineBefore = keylines.getKeylineBefore(unadjustedCenter)
+                    val keylineAfter = keylines.getKeylineAfter(unadjustedCenter)
+                    val progress = getProgress(keylineBefore, keylineAfter, unadjustedCenter)
+                    val interpolatedKeyline = lerp(keylineBefore, keylineAfter, progress)
+                    val isOutOfKeylineBounds = keylineBefore == keylineAfter
 
-                val centerX =
-                    if (isVertical) size.height / 2f else strategyResult.itemMainAxisSize / 2f
-                val centerY =
-                    if (isVertical) strategyResult.itemMainAxisSize / 2f else size.height / 2f
-                val halfMaskWidth =
-                    if (isVertical) size.width / 2f else interpolatedKeyline.size / 2f
-                val halfMaskHeight =
-                    if (isVertical) interpolatedKeyline.size / 2f else size.height / 2f
-                val maskRect = Rect(
-                    left = centerX - halfMaskWidth,
-                    top = centerY - halfMaskHeight,
-                    right = centerX + halfMaskWidth,
-                    bottom = centerY + halfMaskHeight
-                )
+                    val centerX =
+                        if (isVertical) size.height / 2f else strategyResult.itemMainAxisSize / 2f
+                    val centerY =
+                        if (isVertical) strategyResult.itemMainAxisSize / 2f else size.height / 2f
+                    val halfMaskWidth =
+                        if (isVertical) size.width / 2f else interpolatedKeyline.size / 2f
+                    val halfMaskHeight =
+                        if (isVertical) interpolatedKeyline.size / 2f else size.height / 2f
+                    val maskRect =
+                        Rect(
+                            left = centerX - halfMaskWidth,
+                            top = centerY - halfMaskHeight,
+                            right = centerX + halfMaskWidth,
+                            bottom = centerY + halfMaskHeight
+                        )
 
-                // Update carousel item info
-                carouselItemInfo.sizeState = interpolatedKeyline.size
-                carouselItemInfo.minSizeState = roundedKeylines.minBy { it.size }.size
-                carouselItemInfo.maxSizeState = roundedKeylines.firstFocal.size
-                carouselItemInfo.maskRectState = maskRect
+                    // Update carousel item info
+                    carouselItemInfo.sizeState = interpolatedKeyline.size
+                    carouselItemInfo.minSizeState = roundedKeylines.minBy { it.size }.size
+                    carouselItemInfo.maxSizeState = roundedKeylines.firstFocal.size
+                    carouselItemInfo.maskRectState = maskRect
 
-                // Clip the item
-                clip = maskRect != Rect(0f, 0f, size.width, size.height)
-                shape = clipShape
+                    // Clip the item
+                    clip = maskRect != Rect(0f, 0f, size.width, size.height)
+                    shape = clipShape
 
-                // After clipping, the items will have white space between them. Translate the
-                // items to pin their edges together
-                var translation = interpolatedKeyline.offset - unadjustedCenter
-                if (isOutOfKeylineBounds) {
-                    // If this item is beyond the first or last keyline, continue to offset the
-                    // item by cutting its unadjustedOffset according to its masked size.
-                    val outOfBoundsOffset =
-                        (unadjustedCenter - interpolatedKeyline.unadjustedOffset) /
-                            interpolatedKeyline.size
-                    translation += outOfBoundsOffset
+                    // After clipping, the items will have white space between them. Translate the
+                    // items to pin their edges together
+                    var translation = interpolatedKeyline.offset - unadjustedCenter
+                    if (isOutOfKeylineBounds) {
+                        // If this item is beyond the first or last keyline, continue to offset the
+                        // item by cutting its unadjustedOffset according to its masked size.
+                        val outOfBoundsOffset =
+                            (unadjustedCenter - interpolatedKeyline.unadjustedOffset) /
+                                interpolatedKeyline.size
+                        translation += outOfBoundsOffset
+                    }
+                    if (isVertical) {
+                        translationY = translation
+                    } else {
+                        translationX = if (isRtl) -translation else translation
+                    }
                 }
-                if (isVertical) {
-                    translationY = translation
-                } else {
-                    translationX = if (isRtl) -translation else translation
-                }
-            })
+            )
         }
     }
 }
@@ -548,20 +566,20 @@
 @VisibleForTesting
 internal fun calculateMaxScrollOffset(state: CarouselState, strategy: Strategy): Float {
     val itemCount = state.pagerState.pageCount.toFloat()
-    val maxScrollPossible = (strategy.itemMainAxisSize * itemCount) +
-        (strategy.itemSpacing * (itemCount - 1))
+    val maxScrollPossible =
+        (strategy.itemMainAxisSize * itemCount) + (strategy.itemSpacing * (itemCount - 1))
 
     return (maxScrollPossible - strategy.availableSpace).coerceAtLeast(0f)
 }
 
 /**
- * Returns a float between 0 and 1 that represents how far [unadjustedOffset] is between
- * [before] and [after].
+ * Returns a float between 0 and 1 that represents how far [unadjustedOffset] is between [before]
+ * and [after].
  *
  * @param before the first keyline whose unadjustedOffset is less than [unadjustedOffset]
  * @param after the first keyline whose unadjustedOffset is greater than [unadjustedOffset]
  * @param unadjustedOffset the unadjustedOffset between [before] and [after]'s unadjustedOffset that
- * a progress value will be returned for
+ *   a progress value will be returned for
  */
 private fun getProgress(before: Keyline, after: Keyline, unadjustedOffset: Float): Float {
     if (before == after) {
@@ -572,9 +590,7 @@
     return (unadjustedOffset - before.unadjustedOffset) / total
 }
 
-/**
- * Contains the default values used by [Carousel].
- */
+/** Contains the default values used by [Carousel]. */
 @ExperimentalMaterial3Api
 object CarouselDefaults {
 
@@ -583,11 +599,11 @@
      * be used to control the snap animation.
      *
      * @param state The [CarouselState] that controls which Carousel this TargetedFlingBehavior will
-     * be applied to.
+     *   be applied to.
      * @param snapAnimationSpec The animation spec used to finally snap to the position.
-     * @return An instance of [TargetedFlingBehavior] that performs snapping to the next item.
-     * The animation will be governed by the post scroll velocity and the Carousel will use
-     * [snapAnimationSpec] to approach the snapped position
+     * @return An instance of [TargetedFlingBehavior] that performs snapping to the next item. The
+     *   animation will be governed by the post scroll velocity and the Carousel will use
+     *   [snapAnimationSpec] to approach the snapped position
      */
     @Composable
     fun singleAdvanceFlingBehavior(
@@ -606,21 +622,20 @@
      * [snapAnimationSpec] and [decayAnimationSpec] can be used to control the animation specs.
      *
      * The Carousel may use [decayAnimationSpec] or [snapAnimationSpec] to approach the target item
-     * post-scroll, depending on the gesture velocity.
-     * If the gesture has a high enough velocity to approach the target item, the Carousel will use
-     * [decayAnimationSpec] followed by [snapAnimationSpec] for the final step of the animation.
-     * If the gesture doesn't have enough velocity, it will use [snapAnimationSpec] +
-     * [snapAnimationSpec] in a similar fashion.
+     * post-scroll, depending on the gesture velocity. If the gesture has a high enough velocity to
+     * approach the target item, the Carousel will use [decayAnimationSpec] followed by
+     * [snapAnimationSpec] for the final step of the animation. If the gesture doesn't have enough
+     * velocity, it will use [snapAnimationSpec] + [snapAnimationSpec] in a similar fashion.
      *
      * @param state The [CarouselState] that controls which Carousel this TargetedFlingBehavior will
-     * be applied to.
-     * @param decayAnimationSpec The animation spec used to approach the target offset when the
-     * the fling velocity is large enough to naturally decay.
+     *   be applied to.
+     * @param decayAnimationSpec The animation spec used to approach the target offset when the the
+     *   fling velocity is large enough to naturally decay.
      * @param snapAnimationSpec The animation spec used to finally snap to the position.
      * @return An instance of [TargetedFlingBehavior] that performs flinging based on the gesture
-     * velocity and then snapping to the closest item post-fling.
-     * The animation will be governed by the post scroll velocity and the Carousel will use
-     * [snapAnimationSpec] to approach the snapped position
+     *   velocity and then snapping to the closest item post-fling. The animation will be governed
+     *   by the post scroll velocity and the Carousel will use [snapAnimationSpec] to approach the
+     *   snapped position
      */
     @Composable
     fun multiBrowseFlingBehavior(
@@ -628,17 +643,18 @@
         decayAnimationSpec: DecayAnimationSpec<Float> = rememberSplineBasedDecay(),
         snapAnimationSpec: AnimationSpec<Float> = spring(stiffness = Spring.StiffnessMediumLow),
     ): TargetedFlingBehavior {
-        val pagerSnapDistance = object : PagerSnapDistance {
-            override fun calculateTargetPage(
-                startPage: Int,
-                suggestedTargetPage: Int,
-                velocity: Float,
-                pageSize: Int,
-                pageSpacing: Int
-            ): Int {
-                return suggestedTargetPage
+        val pagerSnapDistance =
+            object : PagerSnapDistance {
+                override fun calculateTargetPage(
+                    startPage: Int,
+                    suggestedTargetPage: Int,
+                    velocity: Float,
+                    pageSize: Int,
+                    pageSpacing: Int
+                ): Int {
+                    return suggestedTargetPage
+                }
             }
-        }
         return PagerDefaults.flingBehavior(
             state = state.pagerState,
             pagerSnapDistance = pagerSnapDistance,
@@ -652,7 +668,7 @@
      * post-fling.
      *
      * @return An instance of [TargetedFlingBehavior] that performs flinging based on the gesture
-     * velocity and does not snap to anything post-fling.
+     *   velocity and does not snap to anything post-fling.
      */
     @Composable
     fun noSnapFlingBehavior(): TargetedFlingBehavior {
@@ -665,10 +681,10 @@
         return rememberSnapFlingBehavior(snapLayoutInfoProvider = decayLayoutInfoProvider)
     }
 
-    /** The minimum size that a carousel strategy can choose its small items to be. **/
+    /** The minimum size that a carousel strategy can choose its small items to be. * */
     internal val MinSmallItemSize = 40.dp
 
-    /** The maximum size that a carousel strategy can choose its small items to be. **/
+    /** The maximum size that a carousel strategy can choose its small items to be. * */
     internal val MaxSmallItemSize = 56.dp
 
     internal val AnchorSize = 10.dp
diff --git a/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/carousel/CarouselItemScope.kt b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/carousel/CarouselItemScope.kt
index 47a7aaf..6c1756d 100644
--- a/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/carousel/CarouselItemScope.kt
+++ b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/carousel/CarouselItemScope.kt
@@ -30,17 +30,15 @@
 import androidx.compose.ui.graphics.addOutline
 import androidx.compose.ui.platform.LocalDensity
 
-/**
- * Receiver scope for [Carousel] item content.
- */
+/** Receiver scope for [Carousel] item content. */
 @ExperimentalMaterial3Api
 sealed interface CarouselItemScope {
     /**
      * Information regarding the carousel item, such as its minimum and maximum size.
      *
      * The item information is updated after every scroll. If you use it in a composable function,
-     * it will be recomposed on every change causing potential performance issues. Avoid using it
-     * in the composition.
+     * it will be recomposed on every change causing potential performance issues. Avoid using it in
+     * the composition.
      */
     val carouselItemInfo: CarouselItemInfo
 
@@ -50,8 +48,7 @@
      *
      * @param shape the shape to be applied to the composable
      */
-    @Composable
-    fun Modifier.maskClip(shape: Shape): Modifier
+    @Composable fun Modifier.maskClip(shape: Shape): Modifier
 
     /**
      * Draw a border on the composable using the given [shape], taking into account the item's size
@@ -60,8 +57,7 @@
      * @param border the border to be drawn around the composable
      * @param shape the shape of the border
      */
-    @Composable
-    fun Modifier.maskBorder(border: BorderStroke, shape: Shape): Modifier
+    @Composable fun Modifier.maskBorder(border: BorderStroke, shape: Shape): Modifier
 
     /**
      * Converts and remembers [shape] into a [GenericShape] that uses the intersection of the
@@ -71,28 +67,22 @@
      * where the shape should follow the changes in the item's mask size.
      *
      * @param shape The shape that will be converted and remembered and react to changes in the
-     * item's mask.
+     *   item's mask.
      */
-    @Composable
-    fun rememberMaskShape(shape: Shape): GenericShape
+    @Composable fun rememberMaskShape(shape: Shape): GenericShape
 }
 
 @ExperimentalMaterial3Api
-internal class CarouselItemScopeImpl(
-    private val itemInfo: CarouselItemInfo
-) : CarouselItemScope {
+internal class CarouselItemScopeImpl(private val itemInfo: CarouselItemInfo) : CarouselItemScope {
     override val carouselItemInfo: CarouselItemInfo
         get() = itemInfo
 
     @Composable
-    override fun Modifier.maskClip(shape: Shape): Modifier =
-        clip(rememberMaskShape(shape = shape))
+    override fun Modifier.maskClip(shape: Shape): Modifier = clip(rememberMaskShape(shape = shape))
 
     @Composable
-    override fun Modifier.maskBorder(
-        border: BorderStroke,
-        shape: Shape
-    ): Modifier = border(border, rememberMaskShape(shape = shape))
+    override fun Modifier.maskBorder(border: BorderStroke, shape: Shape): Modifier =
+        border(border, rememberMaskShape(shape = shape))
 
     @Composable
     override fun rememberMaskShape(shape: Shape): GenericShape {
diff --git a/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/carousel/CarouselState.kt b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/carousel/CarouselState.kt
index 0e45d2b..c3daefa 100644
--- a/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/carousel/CarouselState.kt
+++ b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/carousel/CarouselState.kt
@@ -37,8 +37,8 @@
  *
  * @param currentItem the current item to be scrolled to.
  * @param currentItemOffsetFraction the offset of the current item as a fraction of the item's size.
- * This should vary between -0.5 and 0.5 and indicates how to offset the current item from the
- * snapped position.
+ *   This should vary between -0.5 and 0.5 and indicates how to offset the current item from the
+ *   snapped position.
  * @param itemCount the number of items this Carousel will have.
  */
 @ExperimentalMaterial3Api
@@ -49,8 +49,8 @@
 ) : ScrollableState {
     var itemCountState = mutableStateOf(itemCount)
 
-    internal var pagerState: PagerState = PagerState(currentItem, currentItemOffsetFraction,
-        itemCountState.value)
+    internal var pagerState: PagerState =
+        PagerState(currentItem, currentItemOffsetFraction, itemCountState.value)
 
     override val isScrollInProgress: Boolean
         get() = pagerState.isScrollInProgress
@@ -68,25 +68,24 @@
 
     @ExperimentalMaterial3Api
     companion object {
-        /**
-         * To keep current item and item offset saved
-         */
-        val Saver: Saver<CarouselState, *> = listSaver(
-            save = {
-                listOf(
-                    it.pagerState.currentPage,
-                    it.pagerState.currentPageOffsetFraction,
-                    it.pagerState.pageCount,
-                )
-            },
-            restore = {
-                CarouselState(
-                    currentItem = it[0] as Int,
-                    currentItemOffsetFraction = it[1] as Float,
-                    itemCount = { it[2] as Int },
-                )
-            }
-        )
+        /** To keep current item and item offset saved */
+        val Saver: Saver<CarouselState, *> =
+            listSaver(
+                save = {
+                    listOf(
+                        it.pagerState.currentPage,
+                        it.pagerState.currentPageOffsetFraction,
+                        it.pagerState.pageCount,
+                    )
+                },
+                restore = {
+                    CarouselState(
+                        currentItem = it[0] as Int,
+                        currentItemOffsetFraction = it[1] as Float,
+                        itemCount = { it[2] as Int },
+                    )
+                }
+            )
     }
 }
 
@@ -103,20 +102,20 @@
     itemCount: () -> Int,
 ): CarouselState {
     return rememberSaveable(saver = CarouselState.Saver) {
-        CarouselState(
-            currentItem = initialItem,
-            currentItemOffsetFraction = 0F,
-            itemCount = itemCount
-        )
-    }.apply {
-        itemCountState.value = itemCount
-    }
+            CarouselState(
+                currentItem = initialItem,
+                currentItemOffsetFraction = 0F,
+                itemCount = itemCount
+            )
+        }
+        .apply { itemCountState.value = itemCount }
 }
 
 /**
  * Interface to hold information about a Carousel item and its size.
  *
  * Example of CarouselItemInfo usage:
+ *
  * @sample androidx.compose.material3.samples.FadingHorizontalMultiBrowseCarouselSample
  */
 @ExperimentalMaterial3Api
diff --git a/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/carousel/KeylineList.kt b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/carousel/KeylineList.kt
index 0f2acee..2132315 100644
--- a/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/carousel/KeylineList.kt
+++ b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/carousel/KeylineList.kt
@@ -23,8 +23,8 @@
 import kotlin.math.abs
 
 /**
- * A structure that is fixed at a specific [offset] along a scrolling axis and
- * defines properties of an item when its center is located at [offset].
+ * A structure that is fixed at a specific [offset] along a scrolling axis and defines properties of
+ * an item when its center is located at [offset].
  *
  * [Keyline] is the primary structure of any carousel. When multiple keylines are placed along a
  * carousel's axis and an item is scrolled, that item will always be between two keylines. The
@@ -33,17 +33,16 @@
  *
  * @param size the size an item should be in pixels when its center is at [offset]
  * @param offset the location of the keyline along the scrolling axis and where the center of an
- * item should be (usually translated to) when it is at [unadjustedOffset] in the end-to-end
- * scrolling model
- * @param unadjustedOffset the location of:445
- * the keyline in the end-to-end scrolling model (when all
- * items are laid out with their full size and placed end-to-end)
+ *   item should be (usually translated to) when it is at [unadjustedOffset] in the end-to-end
+ *   scrolling model
+ * @param unadjustedOffset the location of:445 the keyline in the end-to-end scrolling model (when
+ *   all items are laid out with their full size and placed end-to-end)
  * @param isFocal whether an item at this keyline is focal or fully "viewable"
  * @param isAnchor true if this keyline is able to be shifted within a list of keylines
  * @param isPivot true if this is the keyline that was used to calculate all other keyline offsets
- * and unadjusted offsets in a list
- * @param cutoff the amount this item bleeds beyond the bounds of the container - 0 if the item
- * is fully in-bounds or fully out-of-bounds
+ *   and unadjusted offsets in a list
+ * @param cutoff the amount this item bleeds beyond the bounds of the container - 0 if the item is
+ *   fully in-bounds or fully out-of-bounds
  */
 internal data class Keyline(
     val size: Float,
@@ -60,12 +59,11 @@
  *
  * Note that [KeylineList]'s constructor should only be used when creating an interpolated
  * KeylineList. If creating a new KeylineList - for a strategy or shifted step - prefer using the
- * [keylineListOf] method which will handle setting all offsets and unadjusted offsets based on
- * a pivot keyline.
+ * [keylineListOf] method which will handle setting all offsets and unadjusted offsets based on a
+ * pivot keyline.
  */
-internal class KeylineList internal constructor(
-    keylines: List<Keyline>
-) : List<Keyline> by keylines {
+internal class KeylineList internal constructor(keylines: List<Keyline>) :
+    List<Keyline> by keylines {
 
     /**
      * Returns the index of the pivot keyline used to calculate all other keyline offsets and
@@ -85,6 +83,7 @@
 
     /**
      * Returns the first non-anchor [Keyline].
+     *
      * @throws [NoSuchElementException] if there are no non-anchor keylines.
      */
     val firstNonAnchor: Keyline
@@ -98,47 +97,55 @@
 
     /**
      * Returns the last non-anchor [Keyline].
+     *
      * @throws [NoSuchElementException] if there are no non-anchor keylines.
      */
     val lastNonAnchor: Keyline
         get() = get(lastNonAnchorIndex)
 
     /**
-     * Returns the index of the first focal keyline or -1 if the list does not contain a
-     * focal keyline.
+     * Returns the index of the first focal keyline or -1 if the list does not contain a focal
+     * keyline.
      */
     val firstFocalIndex = indexOfFirst { it.isFocal }
 
     /**
      * Returns the first focal [Keyline].
+     *
      * @throws [NoSuchElementException] if there are no focal keylines.
      */
     val firstFocal: Keyline
-        get() = getOrNull(firstFocalIndex)
-            ?: throw NoSuchElementException("All KeylineLists must have at least one focal keyline")
+        get() =
+            getOrNull(firstFocalIndex)
+                ?: throw NoSuchElementException(
+                    "All KeylineLists must have at least one focal keyline"
+                )
 
     /**
-     * Returns the index of the last focal keyline or -1 if the list does not contain a
-     * focal keyline.
+     * Returns the index of the last focal keyline or -1 if the list does not contain a focal
+     * keyline.
      */
     val lastFocalIndex: Int = indexOfLast { it.isFocal }
 
     /**
      * Returns the last focal [Keyline].
+     *
      * @throws [NoSuchElementException] if there are no focal keylines.
      */
     val lastFocal: Keyline
-        get() = getOrNull(lastFocalIndex)
-            ?: throw NoSuchElementException("All KeylineLists must have at least one focal keyline")
+        get() =
+            getOrNull(lastFocalIndex)
+                ?: throw NoSuchElementException(
+                    "All KeylineLists must have at least one focal keyline"
+                )
 
     /**
      * Returns true if the first focal item's left/top is within the visible bounds of the container
      * and is the first non-anchor keyline.
      *
-     * When this is true, it means the focal range cannot be shifted left/top or is shifted as
-     * far left/top as possible. When this is false, there are keylines that can be swapped to
-     * shift the first focal item closer to the left/top of the container while still remaining
-     * visible.
+     * When this is true, it means the focal range cannot be shifted left/top or is shifted as far
+     * left/top as possible. When this is false, there are keylines that can be swapped to shift the
+     * first focal item closer to the left/top of the container while still remaining visible.
      */
     fun isFirstFocalItemAtStartOfContainer(): Boolean {
         val firstFocalLeft = firstFocal.offset - (firstFocal.size / 2)
@@ -203,8 +210,8 @@
     }
 
     /**
-     * Returns the first [Keyline] with an unadjustedOffset that is greater than
-     * [unadjustedOffset] or the last keyline if none is found.
+     * Returns the first [Keyline] with an unadjustedOffset that is greater than [unadjustedOffset]
+     * or the last keyline if none is found.
      */
     fun getKeylineAfter(unadjustedOffset: Float): Keyline {
         return fastFirstOrNull { it.unadjustedOffset >= unadjustedOffset } ?: last()
@@ -215,9 +222,7 @@
         if (other !is KeylineList) return false
         if (size != other.size) return false
 
-        fastForEachIndexed { i, keyline ->
-            if (keyline != other[i]) return false
-        }
+        fastForEachIndexed { i, keyline -> if (keyline != other[i]) return false }
 
         return true
     }
@@ -235,9 +240,7 @@
 
 internal fun emptyKeylineList() = KeylineList.Empty
 
-/**
- * Returns a [KeylineList] by aligning the focal range relative to the carousel container.
- */
+/** Returns a [KeylineList] by aligning the focal range relative to the carousel container. */
 internal fun keylineListOf(
     carouselMainAxisSize: Float,
     itemSpacing: Float,
@@ -284,7 +287,7 @@
      *
      * @param size the size of an item in pixels at this keyline
      * @param isAnchor true if this keyline should not be shifted - usually the first and last fully
-     * off-screen keylines
+     *   off-screen keylines
      */
     fun add(size: Float, isAnchor: Boolean = false)
 }
@@ -298,6 +301,7 @@
     private var pivotIndex: Int = -1
     private var pivotOffset: Float = 0f
     private val tmpKeylines = mutableListOf<TmpKeyline>()
+
     override fun add(size: Float, isAnchor: Boolean) {
         tmpKeylines.add(TmpKeyline(size, isAnchor))
         // Save the first "focal" item by looking for the first index of the largest item added
@@ -316,16 +320,17 @@
         pivotIndex: Int,
         pivotOffset: Float
     ): KeylineList {
-        val keylines = createKeylinesWithPivot(
-            pivotIndex,
-            pivotOffset,
-            firstFocalIndex,
-            findLastFocalIndex(),
-            itemMainAxisSize = focalItemSize,
-            carouselMainAxisSize = carouselMainAxisSize,
-            itemSpacing,
-            tmpKeylines
-        )
+        val keylines =
+            createKeylinesWithPivot(
+                pivotIndex,
+                pivotOffset,
+                firstFocalIndex,
+                findLastFocalIndex(),
+                itemMainAxisSize = focalItemSize,
+                carouselMainAxisSize = carouselMainAxisSize,
+                itemSpacing,
+                tmpKeylines
+            )
         return KeylineList(keylines)
     }
 
@@ -338,34 +343,38 @@
         val focalItemCount = lastFocalIndex - firstFocalIndex
 
         pivotIndex = firstFocalIndex
-        pivotOffset = when (carouselAlignment) {
-            CarouselAlignment.Center -> {
-                // If there is an even number of keylines, the itemSpacing will be placed in the
-                // center of the container. Divide the item spacing by half before subtracting
-                // the pivot item's center.
-                val itemSpacingSplit = if (itemSpacing == 0f || focalItemCount.mod(2) == 0) {
-                    0f
-                } else {
-                    itemSpacing / 2f
+        pivotOffset =
+            when (carouselAlignment) {
+                CarouselAlignment.Center -> {
+                    // If there is an even number of keylines, the itemSpacing will be placed in the
+                    // center of the container. Divide the item spacing by half before subtracting
+                    // the pivot item's center.
+                    val itemSpacingSplit =
+                        if (itemSpacing == 0f || focalItemCount.mod(2) == 0) {
+                            0f
+                        } else {
+                            itemSpacing / 2f
+                        }
+                    (carouselMainAxisSize / 2) -
+                        ((focalItemSize / 2) * focalItemCount) -
+                        itemSpacingSplit
                 }
-                (carouselMainAxisSize / 2) - ((focalItemSize / 2) * focalItemCount) -
-                    itemSpacingSplit
+                CarouselAlignment.End -> carouselMainAxisSize - (focalItemSize / 2)
+                // Else covers and defaults to CarouselAlignment.Start
+                else -> focalItemSize / 2
             }
-            CarouselAlignment.End -> carouselMainAxisSize - (focalItemSize / 2)
-            // Else covers and defaults to CarouselAlignment.Start
-            else -> focalItemSize / 2
-        }
 
-        val keylines = createKeylinesWithPivot(
-            pivotIndex,
-            pivotOffset,
-            firstFocalIndex,
-            lastFocalIndex,
-            itemMainAxisSize = focalItemSize,
-            carouselMainAxisSize = carouselMainAxisSize,
-            itemSpacing,
-            tmpKeylines
-        )
+        val keylines =
+            createKeylinesWithPivot(
+                pivotIndex,
+                pivotOffset,
+                firstFocalIndex,
+                lastFocalIndex,
+                itemMainAxisSize = focalItemSize,
+                carouselMainAxisSize = carouselMainAxisSize,
+                itemSpacing,
+                tmpKeylines
+            )
         return KeylineList(keylines)
     }
 
@@ -374,30 +383,32 @@
         // while items remain the same size as the first focal item size - finding a contiguous
         // range of indices where item size is equal to focalItemSize.
         var lastFocalIndex = firstFocalIndex
-        while (lastFocalIndex < tmpKeylines.lastIndex &&
-            tmpKeylines[lastFocalIndex + 1].size == focalItemSize) {
-            lastFocalIndex ++
+        while (
+            lastFocalIndex < tmpKeylines.lastIndex &&
+                tmpKeylines[lastFocalIndex + 1].size == focalItemSize
+        ) {
+            lastFocalIndex++
         }
         return lastFocalIndex
     }
 
     /**
-     * Converts a list of [TmpKeyline] to a list of [Keyline]s whose offset, unadjusted offset,
-     * and cutoff are calculated from a pivot.
+     * Converts a list of [TmpKeyline] to a list of [Keyline]s whose offset, unadjusted offset, and
+     * cutoff are calculated from a pivot.
      *
      * Pivoting is useful when aligning the entire arrangement relative to the scrolling container.
      * When creating a keyline list with the first focal keyline aligned to the start of the
      * container, use the first focal item as the pivot and set the pivot offset to where that first
-     * focal item's center should be placed (carouselStart + (item size / 2)). All keylines
-     * before and after the pivot will have their offset, unadjusted offset, and cutoff calculated
-     * based on the pivot offset. When shifting keylines and moving the carousel's alignment from
-     * start to end, use setPivot to align the last focal keyline to the end of the container.
+     * focal item's center should be placed (carouselStart + (item size / 2)). All keylines before
+     * and after the pivot will have their offset, unadjusted offset, and cutoff calculated based on
+     * the pivot offset. When shifting keylines and moving the carousel's alignment from start to
+     * end, use setPivot to align the last focal keyline to the end of the container.
      *
      * @param pivotIndex the index of the keyline from [tmpKeylines] that is used to align the
-     * entire arrangement
-     * @param pivotOffset the offset along the scrolling axis where the pivot keyline should
-     * be placed and where keylines before and after will have their offset, unadjustedOffset, and
-     * cutoff calculated from
+     *   entire arrangement
+     * @param pivotOffset the offset along the scrolling axis where the pivot keyline should be
+     *   placed and where keylines before and after will have their offset, unadjustedOffset, and
+     *   cutoff calculated from
      * @param firstFocalIndex the index of the first focal item in the [tmpKeylines] list
      * @param lastFocalIndex the index of the last focal item in the [tmpKeylines] list
      * @param itemMainAxisSize the size of focal, or fully unmasked/clipped, items
@@ -416,16 +427,13 @@
         val pivot = tmpKeylines[pivotIndex]
         val keylines = mutableListOf<Keyline>()
 
-        val pivotCutoff: Float = when {
-            isCutoffLeft(pivot.size, pivotOffset) -> pivotOffset - (pivot.size / 2)
-            isCutoffRight(
-                pivot.size,
-                pivotOffset,
-                carouselMainAxisSize
-            ) -> (pivotOffset + (pivot.size / 2)) - carouselMainAxisSize
-
-            else -> 0f
-        }
+        val pivotCutoff: Float =
+            when {
+                isCutoffLeft(pivot.size, pivotOffset) -> pivotOffset - (pivot.size / 2)
+                isCutoffRight(pivot.size, pivotOffset, carouselMainAxisSize) ->
+                    (pivotOffset + (pivot.size / 2)) - carouselMainAxisSize
+                else -> 0f
+            }
         keylines.add(
             // Add the pivot keyline first
             Keyline(
@@ -448,9 +456,10 @@
             val tmp = tmpKeylines[originalIndex]
             val tmpOffset = offset - (tmp.size / 2)
             val tmpUnadjustedOffset = unadjustedOffset - (itemMainAxisSize / 2)
-            val cutoff = if (isCutoffLeft(tmp.size, tmpOffset))
-                abs(tmpOffset - (tmp.size / 2)) else 0f
-            keylines.add(0,
+            val cutoff =
+                if (isCutoffLeft(tmp.size, tmpOffset)) abs(tmpOffset - (tmp.size / 2)) else 0f
+            keylines.add(
+                0,
                 Keyline(
                     size = tmp.size,
                     offset = tmpOffset,
@@ -475,11 +484,12 @@
             val tmp = tmpKeylines[originalIndex]
             val tmpOffset = offset + (tmp.size / 2)
             val tmpUnadjustedOffset = unadjustedOffset + (itemMainAxisSize / 2)
-            val cutoff = if (isCutoffRight(tmp.size, tmpOffset, carouselMainAxisSize)) {
-                (tmpOffset + (tmp.size / 2)) - carouselMainAxisSize
-            } else {
-                0f
-            }
+            val cutoff =
+                if (isCutoffRight(tmp.size, tmpOffset, carouselMainAxisSize)) {
+                    (tmpOffset + (tmp.size / 2)) - carouselMainAxisSize
+                } else {
+                    0f
+                }
             keylines.add(
                 Keyline(
                     size = tmp.size,
@@ -503,9 +513,9 @@
      * Returns whether an item of [size] whose center is at [offset] is straddling the carousel
      * container's left/top.
      *
-     * This method will return false if the item is either fully visible (its left/top edge
-     * comes after the container's left/top) or fully invisible (its right/bottom edge comes before
-     * the container's left/top).
+     * This method will return false if the item is either fully visible (its left/top edge comes
+     * after the container's left/top) or fully invisible (its right/bottom edge comes before the
+     * container's left/top).
      */
     private fun isCutoffLeft(size: Float, offset: Float): Boolean {
         return offset - (size / 2) < 0f && offset + (size / 2) > 0f
@@ -516,8 +526,8 @@
      * container's right/bottom edge.
      *
      * This method will return false if the item is either fully visible (its right/bottom edge
-     * comes before the container's right/bottom) or fully invisible (its left/top edge comes
-     * after the container's right/bottom).
+     * comes before the container's right/bottom) or fully invisible (its left/top edge comes after
+     * the container's right/bottom).
      */
     private fun isCutoffRight(size: Float, offset: Float, carouselMainAxisSize: Float): Boolean {
         return offset - (size / 2) < carouselMainAxisSize &&
@@ -526,18 +536,15 @@
 }
 
 /**
- * Returns an interpolated [Keyline] whose values are all interpolated based on [fraction]
- * between the [start] and [end] keylines.
+ * Returns an interpolated [Keyline] whose values are all interpolated based on [fraction] between
+ * the [start] and [end] keylines.
  */
 internal fun lerp(start: Keyline, end: Keyline, fraction: Float): Keyline {
     return Keyline(
         size = androidx.compose.ui.util.lerp(start.size, end.size, fraction),
         offset = androidx.compose.ui.util.lerp(start.offset, end.offset, fraction),
-        unadjustedOffset = androidx.compose.ui.util.lerp(
-            start.unadjustedOffset,
-            end.unadjustedOffset,
-            fraction
-        ),
+        unadjustedOffset =
+            androidx.compose.ui.util.lerp(start.unadjustedOffset, end.unadjustedOffset, fraction),
         isFocal = if (fraction < .5f) start.isFocal else end.isFocal,
         isAnchor = if (fraction < .5f) start.isAnchor else end.isAnchor,
         isPivot = if (fraction < .5f) start.isPivot else end.isPivot,
@@ -549,16 +556,10 @@
  * Returns an interpolated KeylineList between [from] and [to].
  *
  * Unlike creating a [KeylineList] using [keylineListOf], this method does not set unadjusted
- * offsets by calculating them from a pivot index. This method simply interpolates all values of
- * all keylines between the given pair.
+ * offsets by calculating them from a pivot index. This method simply interpolates all values of all
+ * keylines between the given pair.
  */
-internal fun lerp(
-    from: KeylineList,
-    to: KeylineList,
-    fraction: Float
-): KeylineList {
-    val interpolatedKeylines = from.fastMapIndexed { i, k ->
-        lerp(k, to[i], fraction)
-    }
+internal fun lerp(from: KeylineList, to: KeylineList, fraction: Float): KeylineList {
+    val interpolatedKeylines = from.fastMapIndexed { i, k -> lerp(k, to[i], fraction) }
     return KeylineList(interpolatedKeylines)
 }
diff --git a/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/carousel/KeylineSnapPosition.kt b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/carousel/KeylineSnapPosition.kt
index f310d9f..87d8a4b7 100644
--- a/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/carousel/KeylineSnapPosition.kt
+++ b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/carousel/KeylineSnapPosition.kt
@@ -22,8 +22,8 @@
 import kotlin.math.roundToInt
 
 /**
- * Calculates the offset from the beginning of the carousel container needed to snap to the item
- * at [itemIndex].
+ * Calculates the offset from the beginning of the carousel container needed to snap to the item at
+ * [itemIndex].
  *
  * This method takes into account the correct keyline list needed to allow the item to be fully
  * visible and located at a focal position.
@@ -31,27 +31,29 @@
 internal fun getSnapPositionOffset(strategy: Strategy, itemIndex: Int, itemCount: Int): Int {
     if (!strategy.isValid) return 0
 
-    val numOfFocalKeylines = strategy.defaultKeylines.lastFocalIndex -
-        strategy.defaultKeylines.firstFocalIndex
+    val numOfFocalKeylines =
+        strategy.defaultKeylines.lastFocalIndex - strategy.defaultKeylines.firstFocalIndex
     val startStepsSize = strategy.startKeylineSteps.size + numOfFocalKeylines
     val endStepsSize = strategy.endKeylineSteps.size + numOfFocalKeylines
 
-    var offset = (strategy.defaultKeylines.firstFocal.unadjustedOffset -
-        strategy.itemMainAxisSize / 2F).roundToInt()
+    var offset =
+        (strategy.defaultKeylines.firstFocal.unadjustedOffset - strategy.itemMainAxisSize / 2F)
+            .roundToInt()
 
     if (itemIndex < startStepsSize) {
         var startIndex = max(0, startStepsSize - 1 - itemIndex)
         startIndex = min(strategy.startKeylineSteps.size - 1, startIndex)
         val startKeylines = strategy.startKeylineSteps[startIndex]
-        offset = (startKeylines.firstFocal.unadjustedOffset -
-            strategy.itemMainAxisSize / 2f).roundToInt()
+        offset =
+            (startKeylines.firstFocal.unadjustedOffset - strategy.itemMainAxisSize / 2f)
+                .roundToInt()
     }
     if (itemCount > numOfFocalKeylines + 1 && itemIndex >= itemCount - endStepsSize) {
         var endIndex = max(0, itemIndex - itemCount + endStepsSize)
         endIndex = min(strategy.endKeylineSteps.size - 1, endIndex)
         val endKeylines = strategy.endKeylineSteps[endIndex]
-        offset = (endKeylines.firstFocal.unadjustedOffset -
-            strategy.itemMainAxisSize / 2f).roundToInt()
+        offset =
+            (endKeylines.firstFocal.unadjustedOffset - strategy.itemMainAxisSize / 2f).roundToInt()
     }
 
     return offset
diff --git a/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/carousel/Keylines.kt b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/carousel/Keylines.kt
index ecb6b00..3de5b18 100644
--- a/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/carousel/Keylines.kt
+++ b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/carousel/Keylines.kt
@@ -26,11 +26,10 @@
 /**
  * Creates a list of keylines that arranges items into a multi-browse configuration.
  *
- * Note that this function may adjust the size of large items. In order to ensure large, medium,
- * and small items fit perfectly into the available space and are numbered/arranged in a
- * visually pleasing and opinionated way, this strategy finds the nearest number of large items that
- * will fit into an approved arrangement that requires the least amount of size adjustment
- * necessary.
+ * Note that this function may adjust the size of large items. In order to ensure large, medium, and
+ * small items fit perfectly into the available space and are numbered/arranged in a visually
+ * pleasing and opinionated way, this strategy finds the nearest number of large items that will fit
+ * into an approved arrangement that requires the least amount of size adjustment necessary.
  *
  * For more information, see <a href="https://material.io/components/carousel/overview">design
  * guidelines</a>.
@@ -77,27 +76,28 @@
 
     // Find the minimum space left for large items after filling the carousel with the most
     // permissible medium and small items to determine a plausible minimum large count.
-    val minAvailableLargeSpace = carouselMainAxisSize - targetMediumSize * mediumCounts.max() -
-        maxSmallItemSize * smallCounts.max()
-    val minLargeCount = max(
-        1,
-        floor(minAvailableLargeSpace / targetLargeSize).toInt())
+    val minAvailableLargeSpace =
+        carouselMainAxisSize -
+            targetMediumSize * mediumCounts.max() -
+            maxSmallItemSize * smallCounts.max()
+    val minLargeCount = max(1, floor(minAvailableLargeSpace / targetLargeSize).toInt())
     val maxLargeCount = ceil(carouselMainAxisSize / targetLargeSize).toInt()
 
     val largeCounts = IntArray(maxLargeCount - minLargeCount + 1) { maxLargeCount - it }
     val anchorSize = with(density) { CarouselDefaults.AnchorSize.toPx() }
-    var arrangement = Arrangement.findLowestCostArrangement(
-        availableSpace = carouselMainAxisSize,
-        itemSpacing = itemSpacing,
-        targetSmallSize = targetSmallSize,
-        minSmallSize = minSmallItemSize,
-        maxSmallSize = maxSmallItemSize,
-        smallCounts = smallCounts,
-        targetMediumSize = targetMediumSize,
-        mediumCounts = mediumCounts,
-        targetLargeSize = targetLargeSize,
-        largeCounts = largeCounts,
-    )
+    var arrangement =
+        Arrangement.findLowestCostArrangement(
+            availableSpace = carouselMainAxisSize,
+            itemSpacing = itemSpacing,
+            targetSmallSize = targetSmallSize,
+            minSmallSize = minSmallItemSize,
+            maxSmallSize = maxSmallItemSize,
+            smallCounts = smallCounts,
+            targetMediumSize = targetMediumSize,
+            mediumCounts = mediumCounts,
+            targetLargeSize = targetLargeSize,
+            largeCounts = largeCounts,
+        )
 
     if (arrangement != null && arrangement.itemCount() > itemCount) {
         var keylineSurplus = arrangement.itemCount() - itemCount
@@ -115,18 +115,19 @@
             // are already fully unmasked.
             keylineSurplus -= 1
         }
-        arrangement = Arrangement.findLowestCostArrangement(
-            availableSpace = carouselMainAxisSize,
-            itemSpacing = itemSpacing,
-            targetSmallSize = targetSmallSize,
-            minSmallSize = minSmallItemSize,
-            maxSmallSize = maxSmallItemSize,
-            smallCounts = intArrayOf(smallCount),
-            targetMediumSize = targetMediumSize,
-            mediumCounts = intArrayOf(mediumCount),
-            targetLargeSize = targetLargeSize,
-            largeCounts = largeCounts,
-        )
+        arrangement =
+            Arrangement.findLowestCostArrangement(
+                availableSpace = carouselMainAxisSize,
+                itemSpacing = itemSpacing,
+                targetSmallSize = targetSmallSize,
+                minSmallSize = minSmallItemSize,
+                maxSmallSize = maxSmallItemSize,
+                smallCounts = intArrayOf(smallCount),
+                targetMediumSize = targetMediumSize,
+                mediumCounts = intArrayOf(mediumCount),
+                targetLargeSize = targetLargeSize,
+                largeCounts = largeCounts,
+            )
     }
 
     if (arrangement == null) {
@@ -193,19 +194,13 @@
     val mediumCount = if (remainingSpace > 0) 1 else 0
 
     val defaultAnchorSize = with(density) { CarouselDefaults.AnchorSize.toPx() }
-    val mediumItemSize = calculateMediumChildSize(
-        minimumMediumSize = defaultAnchorSize,
-        largeItemSize = largeItemSize,
-        remainingSpace = remainingSpace)
-    val arrangement = Arrangement(
-        0,
-        0F,
-        0,
-        mediumItemSize,
-        mediumCount,
-        largeItemSize,
-        largeCount
-    )
+    val mediumItemSize =
+        calculateMediumChildSize(
+            minimumMediumSize = defaultAnchorSize,
+            largeItemSize = largeItemSize,
+            remainingSpace = remainingSpace
+        )
+    val arrangement = Arrangement(0, 0F, 0, mediumItemSize, mediumCount, largeItemSize, largeCount)
 
     val xSmallSize = min(defaultAnchorSize, itemSize)
     // Make the left anchor size half the cut off item size to make the motion at the left closer
@@ -221,9 +216,9 @@
 }
 
 /**
- * Calculates a size of a medium item in the carousel that is not bigger than the large item
- * size, and arbitrarily chooses a size small enough such that there is a size disparity between
- * the medium and large sizes, but large enough to have a sufficient percentage cut off.
+ * Calculates a size of a medium item in the carousel that is not bigger than the large item size,
+ * and arbitrarily chooses a size small enough such that there is a size disparity between the
+ * medium and large sizes, but large enough to have a sufficient percentage cut off.
  */
 @OptIn(ExperimentalMaterial3Api::class)
 private fun calculateMediumChildSize(
@@ -241,8 +236,7 @@
     // If the medium child is larger than the threshold percentage of the large child size,
     // it's too similar and won't create sufficient motion when scrolling items between the large
     // items and the medium item.
-    val largeItemThreshold: Float =
-        largeItemSize * CarouselDefaults.MediumLargeItemDiffThreshold
+    val largeItemThreshold: Float = largeItemSize * CarouselDefaults.MediumLargeItemDiffThreshold
     if (mediumItemSize > largeItemThreshold) {
         // Choose whichever is bigger between the maximum threshold of the medium child size, or
         // a size such that only 20% of the space is cut off.
diff --git a/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/carousel/Strategy.kt b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/carousel/Strategy.kt
index d548b78..c33944c 100644
--- a/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/carousel/Strategy.kt
+++ b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/carousel/Strategy.kt
@@ -31,19 +31,20 @@
  * scroll offset, layout direction, and snapping behaviors.
  *
  * @param defaultKeylines the keylines that define how items should be arranged in their default
- * state
- * @param startKeylineSteps a list of [KeylineList]s that move the focal range from its position
- * in [defaultKeylines] to the start of the carousel container, one keyline at a time per step
+ *   state
+ * @param startKeylineSteps a list of [KeylineList]s that move the focal range from its position in
+ *   [defaultKeylines] to the start of the carousel container, one keyline at a time per step
  * @param endKeylineSteps a list of [KeylineList]s that move the focal range from its position in
- * [defaultKeylines] to the end of the carousel container, one keyline at a time per step.
- * [endKeylineSteps] and whose value is the percentage of [endShiftDistance] that should be
- * scrolled when the end step is used.
+ *   [defaultKeylines] to the end of the carousel container, one keyline at a time per step.
+ *   [endKeylineSteps] and whose value is the percentage of [endShiftDistance] that should be
+ *   scrolled when the end step is used.
  * @param availableSpace the available space in the main axis
  * @param itemSpacing the spacing between each item
  * @param beforeContentPadding the padding preceding the first item in the list
  * @param afterContentPadding the padding proceeding the last item in the list
  */
-internal class Strategy private constructor(
+internal class Strategy
+private constructor(
     val defaultKeylines: KeylineList,
     val startKeylineSteps: List<KeylineList>,
     val endKeylineSteps: List<KeylineList>,
@@ -56,21 +57,20 @@
     /**
      * Creates a new [Strategy] for a keyline list and set of carousel container parameters.
      *
-     * The [defaultKeylines] are a list of keylines that defines how items should be arranged,
-     * from left-to-right (or top-to-bottom), to achieve the carousel's desired appearance. For
-     * example, a start-aligned large item, followed by a medium and a small item for a
-     * multi-browse carousel. Or a small item, a center-aligned large item, and a small item for
-     * a centered hero carousel. This method will use the [defaultKeylines] to then derive new
-     * scroll and layout direction-aware [KeylineList]s to be used by carousel. For example, when
-     * a device is running in a right-to-left layout direction, Strategy will handle reversing
-     * the default [KeylineList]. Or if the default keylines use a center-aligned large item,
-     * Strategy will generate additional KeylineLists that handle shifting the large item to the
-     * start or end of the screen when the carousel is scrolled to the start or end of the list,
-     * letting all items become large without having them detach from the edges of the
-     * scroll container.
+     * The [defaultKeylines] are a list of keylines that defines how items should be arranged, from
+     * left-to-right (or top-to-bottom), to achieve the carousel's desired appearance. For example,
+     * a start-aligned large item, followed by a medium and a small item for a multi-browse
+     * carousel. Or a small item, a center-aligned large item, and a small item for a centered hero
+     * carousel. This method will use the [defaultKeylines] to then derive new scroll and layout
+     * direction-aware [KeylineList]s to be used by carousel. For example, when a device is running
+     * in a right-to-left layout direction, Strategy will handle reversing the default
+     * [KeylineList]. Or if the default keylines use a center-aligned large item, Strategy will
+     * generate additional KeylineLists that handle shifting the large item to the start or end of
+     * the screen when the carousel is scrolled to the start or end of the list, letting all items
+     * become large without having them detach from the edges of the scroll container.
      *
-     * @param defaultKeylines a default [KeylineList] that represents the arrangement
-     * of items in a left-to-right (or top-to-bottom) layout.
+     * @param defaultKeylines a default [KeylineList] that represents the arrangement of items in a
+     *   left-to-right (or top-to-bottom) layout.
      * @param availableSpace the size of the carousel container in scrolling axis
      * @param beforeContentPadding the padding to add before the list content
      * @param afterContentPadding the padding to add after the list content
@@ -83,18 +83,15 @@
         afterContentPadding: Float
     ) : this(
         defaultKeylines = defaultKeylines,
-        startKeylineSteps = getStartKeylineSteps(
-            defaultKeylines,
-            availableSpace,
-            itemSpacing,
-            beforeContentPadding
-        ),
-        endKeylineSteps = getEndKeylineSteps(
-            defaultKeylines,
-            availableSpace,
-            itemSpacing,
-            afterContentPadding
-        ),
+        startKeylineSteps =
+            getStartKeylineSteps(
+                defaultKeylines,
+                availableSpace,
+                itemSpacing,
+                beforeContentPadding
+            ),
+        endKeylineSteps =
+            getEndKeylineSteps(defaultKeylines, availableSpace, itemSpacing, afterContentPadding),
         availableSpace = availableSpace,
         itemSpacing = itemSpacing,
         beforeContentPadding = beforeContentPadding,
@@ -106,25 +103,19 @@
     /** The scroll distance needed to move through all steps in [endKeylineSteps]. */
     private val endShiftDistance = getEndShiftDistance(endKeylineSteps, afterContentPadding)
     /**
-     * A list of floats whose index aligns with a [KeylineList] from [startKeylineSteps] and
-     * whose value is the percentage of [startShiftDistance] that should be scrolled when the
-     * start step is used.
+     * A list of floats whose index aligns with a [KeylineList] from [startKeylineSteps] and whose
+     * value is the percentage of [startShiftDistance] that should be scrolled when the start step
+     * is used.
      */
-    private val startShiftPoints = getStepInterpolationPoints(
-        startShiftDistance,
-        startKeylineSteps,
-        true
-    )
+    private val startShiftPoints =
+        getStepInterpolationPoints(startShiftDistance, startKeylineSteps, true)
     /**
-     * A list of floats whose index aligns with a [KeylineList] from [endKeylineSteps] and
-     * whose value is the percentage of [endShiftDistance] that should be scrolled when the
-     * end step is used.
+     * A list of floats whose index aligns with a [KeylineList] from [endKeylineSteps] and whose
+     * value is the percentage of [endShiftDistance] that should be scrolled when the end step is
+     * used.
      */
-    private val endShiftPoints = getStepInterpolationPoints(
-        endShiftDistance,
-        endKeylineSteps,
-        false
-    )
+    private val endShiftPoints =
+        getStepInterpolationPoints(endShiftDistance, endKeylineSteps, false)
 
     /** The size of items when in focus and fully unmasked. */
     val itemMainAxisSize: Float
@@ -157,40 +148,39 @@
             return defaultKeylines
         }
 
-        var interpolation = lerp(
-            outputMin = 1f,
-            outputMax = 0f,
-            inputMin = 0f,
-            inputMax = startShiftOffset,
-            value = positiveScrollOffset
-        )
+        var interpolation =
+            lerp(
+                outputMin = 1f,
+                outputMax = 0f,
+                inputMin = 0f,
+                inputMax = startShiftOffset,
+                value = positiveScrollOffset
+            )
         var shiftPoints = startShiftPoints
         var steps = startKeylineSteps
 
         if (positiveScrollOffset > endShiftOffset) {
-            interpolation = lerp(
-                outputMin = 0f,
-                outputMax = 1f,
-                inputMin = endShiftOffset,
-                inputMax = maxScrollOffset,
-                value = positiveScrollOffset
-            )
+            interpolation =
+                lerp(
+                    outputMin = 0f,
+                    outputMax = 1f,
+                    inputMin = endShiftOffset,
+                    inputMax = maxScrollOffset,
+                    value = positiveScrollOffset
+                )
             shiftPoints = endShiftPoints
             steps = endKeylineSteps
         }
 
-        val shiftPointRange = getShiftPointRange(
-            steps.size,
-            shiftPoints,
-            interpolation
-        )
+        val shiftPointRange = getShiftPointRange(steps.size, shiftPoints, interpolation)
 
         if (roundToNearestStep) {
-            val roundedStepIndex = if (shiftPointRange.steppedInterpolation.roundToInt() == 0) {
-                shiftPointRange.fromStepIndex
-            } else {
-                shiftPointRange.toStepIndex
-            }
+            val roundedStepIndex =
+                if (shiftPointRange.steppedInterpolation.roundToInt() == 0) {
+                    shiftPointRange.fromStepIndex
+                } else {
+                    shiftPointRange.toStepIndex
+                }
             return steps[roundedStepIndex]
         }
 
@@ -243,15 +233,16 @@
     }
 
     companion object {
-        val Empty = Strategy(
-            defaultKeylines = emptyKeylineList(),
-            startKeylineSteps = emptyList(),
-            endKeylineSteps = emptyList(),
-            availableSpace = 0f,
-            itemSpacing = 0f,
-            beforeContentPadding = 0f,
-            afterContentPadding = 0f,
-        )
+        val Empty =
+            Strategy(
+                defaultKeylines = emptyKeylineList(),
+                startKeylineSteps = emptyList(),
+                endKeylineSteps = emptyList(),
+                availableSpace = 0f,
+                itemSpacing = 0f,
+                beforeContentPadding = 0f,
+                afterContentPadding = 0f,
+            )
     }
 }
 
@@ -263,36 +254,39 @@
     beforeContentPadding: Float
 ): Float {
     if (startKeylineSteps.isEmpty()) return 0f
-    return max(startKeylineSteps.last().first().unadjustedOffset -
-        startKeylineSteps.first().first().unadjustedOffset, beforeContentPadding)
+    return max(
+        startKeylineSteps.last().first().unadjustedOffset -
+            startKeylineSteps.first().first().unadjustedOffset,
+        beforeContentPadding
+    )
 }
-/**
- * Returns the total scroll offset needed to move through the entire list of [endKeylineSteps].
- */
+
+/** Returns the total scroll offset needed to move through the entire list of [endKeylineSteps]. */
 private fun getEndShiftDistance(
     endKeylineSteps: List<KeylineList>,
     afterContentPadding: Float
 ): Float {
     if (endKeylineSteps.isEmpty()) return 0f
-    return max(endKeylineSteps.first().last().unadjustedOffset -
-        endKeylineSteps.last().last().unadjustedOffset, afterContentPadding)
+    return max(
+        endKeylineSteps.first().last().unadjustedOffset -
+            endKeylineSteps.last().last().unadjustedOffset,
+        afterContentPadding
+    )
 }
 
 /**
- * Generates discreet steps which move the focal range from its original position until
- * it reaches the start of the carousel container.
+ * Generates discreet steps which move the focal range from its original position until it reaches
+ * the start of the carousel container.
  *
- * Each step can only move the focal range by one keyline at a time to ensure every
- * item in the list passes through the focal range. Each step removes the keyline at the
- * start of the container and re-inserts it after the focal range in an order that retains
- * visual balance. This is repeated until the first focal keyline is at the start of the
- * container. Re-inserting keylines after the focal range in a balanced way is done by
- * looking at the size of they keyline next to the keyline that is being re-positioned
- * and finding a match on the other side of the focal range.
+ * Each step can only move the focal range by one keyline at a time to ensure every item in the list
+ * passes through the focal range. Each step removes the keyline at the start of the container and
+ * re-inserts it after the focal range in an order that retains visual balance. This is repeated
+ * until the first focal keyline is at the start of the container. Re-inserting keylines after the
+ * focal range in a balanced way is done by looking at the size of they keyline next to the keyline
+ * that is being re-positioned and finding a match on the other side of the focal range.
  *
- * The first state in the returned list is always the default [KeylineList] while
- * the last state will be the start state or the state that has the focal range at the
- * beginning of the carousel.
+ * The first state in the returned list is always the default [KeylineList] while the last state
+ * will be the start state or the state that has the focal range at the beginning of the carousel.
  */
 private fun getStartKeylineSteps(
     defaultKeylines: KeylineList,
@@ -347,9 +341,7 @@
         var dstIndex = defaultKeylines.lastIndex
         if (originalItemIndex > 0) {
             val originalNeighborBeforeSize = defaultKeylines[originalItemIndex - 1].size
-            dstIndex = prevStep.firstIndexAfterFocalRangeWithSize(
-                originalNeighborBeforeSize
-            ) - 1
+            dstIndex = prevStep.firstIndexAfterFocalRangeWithSize(originalNeighborBeforeSize) - 1
         }
 
         steps.add(
@@ -365,34 +357,33 @@
     }
 
     if (beforeContentPadding != 0f) {
-        steps[steps.lastIndex] = createShiftedKeylineListForContentPadding(
-            steps.last(),
-            carouselMainAxisSize,
-            itemSpacing,
-            beforeContentPadding,
-            steps.last().firstFocal,
-            steps.last().firstFocalIndex
-        )
+        steps[steps.lastIndex] =
+            createShiftedKeylineListForContentPadding(
+                steps.last(),
+                carouselMainAxisSize,
+                itemSpacing,
+                beforeContentPadding,
+                steps.last().firstFocal,
+                steps.last().firstFocalIndex
+            )
     }
 
     return steps
 }
 
 /**
- * Generates discreet steps which move the focal range from its original position until
- * it reaches the end of the carousel container.
+ * Generates discreet steps which move the focal range from its original position until it reaches
+ * the end of the carousel container.
  *
- * Each step can only move the focal range by one keyline at a time to ensure every
- * item in the list passes through the focal range. Each step removes the keyline at the
- * end of the container and re-inserts it before the focal range in an order that retains
- * visual balance. This is repeated until the last focal keyline is at the start of the
- * container. Re-inserting keylines before the focal range in a balanced way is done by
- * looking at the size of they keyline next to the keyline that is being re-positioned
- * and finding a match on the other side of the focal range.
+ * Each step can only move the focal range by one keyline at a time to ensure every item in the list
+ * passes through the focal range. Each step removes the keyline at the end of the container and
+ * re-inserts it before the focal range in an order that retains visual balance. This is repeated
+ * until the last focal keyline is at the start of the container. Re-inserting keylines before the
+ * focal range in a balanced way is done by looking at the size of they keyline next to the keyline
+ * that is being re-positioned and finding a match on the other side of the focal range.
  *
- * The first state in the returned list is always the default [KeylineList] while
- * the last state will be the end state or the state that has the focal range at the
- * end of the carousel.
+ * The first state in the returned list is always the default [KeylineList] while the last state
+ * will be the end state or the state that has the focal range at the end of the carousel.
  */
 private fun getEndKeylineSteps(
     defaultKeylines: KeylineList,
@@ -406,14 +397,16 @@
 
     if (defaultKeylines.isLastFocalItemAtEndOfContainer(carouselMainAxisSize)) {
         if (afterContentPadding != 0f) {
-            steps.add(createShiftedKeylineListForContentPadding(
-                defaultKeylines,
-                carouselMainAxisSize,
-                itemSpacing,
-                -afterContentPadding,
-                defaultKeylines.lastFocal,
-                defaultKeylines.lastFocalIndex
-            ))
+            steps.add(
+                createShiftedKeylineListForContentPadding(
+                    defaultKeylines,
+                    carouselMainAxisSize,
+                    itemSpacing,
+                    -afterContentPadding,
+                    defaultKeylines.lastFocal,
+                    defaultKeylines.lastFocalIndex
+                )
+            )
         }
         return steps
     }
@@ -445,39 +438,39 @@
 
         if (originalItemIndex < defaultKeylines.lastIndex) {
             val originalNeighborAfterSize = defaultKeylines[originalItemIndex + 1].size
-            dstIndex = prevStep.lastIndexBeforeFocalRangeWithSize(
-                originalNeighborAfterSize
-            ) + 1
+            dstIndex = prevStep.lastIndexBeforeFocalRangeWithSize(originalNeighborAfterSize) + 1
         }
 
-        val keylines = moveKeylineAndCreateShiftedKeylineList(
-            from = prevStep,
-            srcIndex = defaultKeylines.lastNonAnchorIndex,
-            dstIndex = dstIndex,
-            carouselMainAxisSize = carouselMainAxisSize,
-            itemSpacing = itemSpacing
-        )
+        val keylines =
+            moveKeylineAndCreateShiftedKeylineList(
+                from = prevStep,
+                srcIndex = defaultKeylines.lastNonAnchorIndex,
+                dstIndex = dstIndex,
+                carouselMainAxisSize = carouselMainAxisSize,
+                itemSpacing = itemSpacing
+            )
         steps.add(keylines)
         i++
     }
 
     if (afterContentPadding != 0f) {
-        steps[steps.lastIndex] = createShiftedKeylineListForContentPadding(
-            steps.last(),
-            carouselMainAxisSize,
-            itemSpacing,
-            -afterContentPadding,
-            steps.last().lastFocal,
-            steps.last().lastFocalIndex
-        )
+        steps[steps.lastIndex] =
+            createShiftedKeylineListForContentPadding(
+                steps.last(),
+                carouselMainAxisSize,
+                itemSpacing,
+                -afterContentPadding,
+                steps.last().lastFocal,
+                steps.last().lastFocalIndex
+            )
     }
 
     return steps
 }
 
 /**
- * Returns a new [KeylineList] identical to [from] but with each keyline's offset shifted
- * by [contentPadding].
+ * Returns a new [KeylineList] identical to [from] but with each keyline's offset shifted by
+ * [contentPadding].
  */
 private fun createShiftedKeylineListForContentPadding(
     from: KeylineList,
@@ -491,30 +484,27 @@
     val sizeReduction = contentPadding / numberOfNonAnchorKeylines
     // Let keylineListOf create a new keyline list with offsets adjusted for each item's
     // reduction in size
-    val newKeylines = keylineListOf(
-        carouselMainAxisSize = carouselMainAxisSize,
-        itemSpacing = itemSpacing,
-        pivotIndex = pivotIndex,
-        pivotOffset = pivot.offset - (sizeReduction / 2f) + contentPadding
-    ) {
-        from.fastForEach { k -> add(k.size - abs(sizeReduction), k.isAnchor) }
-    }
+    val newKeylines =
+        keylineListOf(
+            carouselMainAxisSize = carouselMainAxisSize,
+            itemSpacing = itemSpacing,
+            pivotIndex = pivotIndex,
+            pivotOffset = pivot.offset - (sizeReduction / 2f) + contentPadding
+        ) {
+            from.fastForEach { k -> add(k.size - abs(sizeReduction), k.isAnchor) }
+        }
 
     // Then reset each item's unadjusted offset back to their original value from the
     // incoming keyline list. This is necessary because Pager will still be laying out items
     // end-to-end with the original page size and not the new reduced size.
     return KeylineList(
-        newKeylines.fastMapIndexed { i, k ->
-            k.copy(
-                unadjustedOffset = from[i].unadjustedOffset
-            )
-        }
+        newKeylines.fastMapIndexed { i, k -> k.copy(unadjustedOffset = from[i].unadjustedOffset) }
     )
 }
 
 /**
- * Returns a new [KeylineList] where the keyline at [srcIndex] is moved to [dstIndex] and
- * with updated pivot and offsets that reflect any change in focal shift.
+ * Returns a new [KeylineList] where the keyline at [srcIndex] is moved to [dstIndex] and with
+ * updated pivot and offsets that reflect any change in focal shift.
  */
 private fun moveKeylineAndCreateShiftedKeylineList(
     from: KeylineList,
@@ -529,40 +519,35 @@
     val newPivotIndex = from.pivotIndex + pivotDir
     val newPivotOffset = from.pivot.offset + pivotDelta
     return keylineListOf(carouselMainAxisSize, itemSpacing, newPivotIndex, newPivotOffset) {
-        from.toMutableList()
-            .move(srcIndex, dstIndex)
-            .fastForEach { k -> add(k.size, k.isAnchor) }
+        from.toMutableList().move(srcIndex, dstIndex).fastForEach { k -> add(k.size, k.isAnchor) }
     }
 }
 
 /**
- * Creates and returns a list of float values containing points between 0 and 1 that
- * represent interpolation values for when the [KeylineList] at the corresponding index in
- * [steps] should be visible.
+ * Creates and returns a list of float values containing points between 0 and 1 that represent
+ * interpolation values for when the [KeylineList] at the corresponding index in [steps] should be
+ * visible.
  *
- * For example, if [steps] has a size of 4, this method will return an array of 4 float
- * values that could look like [0, .33, .66, 1]. When interpolating through a list of
- * [KeylineList]s, an interpolation value will be between 0-1. This interpolation will be
- * used to find the range it falls within from this method's returned value. If
- * interpolation is .25, that would fall between the 0 and .33, the 0th and 1st indices
- * of the float array. Meaning the 0th and 1st items from [steps] should be the current
- * [KeylineList]s being interpolated. This is an example with equally distributed values
- * but these values will typically be unequally distributed since their size depends on
- * the distance keylines shift between each step.
+ * For example, if [steps] has a size of 4, this method will return an array of 4 float values that
+ * could look like [0, .33, .66, 1]. When interpolating through a list of [KeylineList]s, an
+ * interpolation value will be between 0-1. This interpolation will be used to find the range it
+ * falls within from this method's returned value. If interpolation is .25, that would fall between
+ * the 0 and .33, the 0th and 1st indices of the float array. Meaning the 0th and 1st items from
+ * [steps] should be the current [KeylineList]s being interpolated. This is an example with equally
+ * distributed values but these values will typically be unequally distributed since their size
+ * depends on the distance keylines shift between each step.
  *
- * @see [lerp] for more details on how interpolation points are used
- * @see [Strategy.getKeylineListForScrollOffset] for more details on how interpolation points
- * are used
- *
- * @param totalShiftDistance the total distance keylines will shift between the first and
- * last [KeylineList] of [steps]
+ * @param totalShiftDistance the total distance keylines will shift between the first and last
+ *   [KeylineList] of [steps]
  * @param steps the steps to find interpolation points for
- * @param isShiftingLeft true if this method should find interpolation points for shifting
- * keylines to the left/top of a carousel, false if this method should find interpolation
- * points for shifting keylines to the right/bottom of a carousel
- * @return a list of floats, equal in size to [steps] that contains points between 0-1
- * that align with when a [KeylineList] from [steps should be shown for a 0-1
- * interpolation value
+ * @param isShiftingLeft true if this method should find interpolation points for shifting keylines
+ *   to the left/top of a carousel, false if this method should find interpolation points for
+ *   shifting keylines to the right/bottom of a carousel
+ * @return a list of floats, equal in size to [steps] that contains points between 0-1 that align
+ *   with when a [KeylineList] from [steps should be shown for a 0-1 interpolation value
+ * @see [lerp] for more details on how interpolation points are used
+ * @see [Strategy.getKeylineListForScrollOffset] for more details on how interpolation points are
+ *   used
  */
 private fun getStepInterpolationPoints(
     totalShiftDistance: Float,
@@ -577,11 +562,12 @@
     (1 until steps.size).map { i ->
         val prevKeylines = steps[i - 1]
         val currKeylines = steps[i]
-        val distanceShifted = if (isShiftingLeft) {
-            currKeylines.first().unadjustedOffset - prevKeylines.first().unadjustedOffset
-        } else {
-            prevKeylines.last().unadjustedOffset - currKeylines.last().unadjustedOffset
-        }
+        val distanceShifted =
+            if (isShiftingLeft) {
+                currKeylines.first().unadjustedOffset - prevKeylines.first().unadjustedOffset
+            } else {
+                prevKeylines.last().unadjustedOffset - currKeylines.last().unadjustedOffset
+            }
         val stepPercentage = distanceShifted / totalShiftDistance
         val point = if (i == steps.lastIndex) 1f else points[i - 1] + stepPercentage
         points.add(point)
@@ -612,11 +598,7 @@
         }
         lowerBounds = upperBounds
     }
-    return ShiftPointRange(
-        fromStepIndex = 0,
-        toStepIndex = 0,
-        steppedInterpolation = 0f
-    )
+    return ShiftPointRange(fromStepIndex = 0, toStepIndex = 0, steppedInterpolation = 0f)
 }
 
 private fun MutableList<Keyline>.move(srcIndex: Int, dstIndex: Int): MutableList<Keyline> {
diff --git a/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/internal/AccessibilityServiceStateProvider.kt b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/internal/AccessibilityServiceStateProvider.kt
index 4c54a0b..e03821f 100644
--- a/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/internal/AccessibilityServiceStateProvider.kt
+++ b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/internal/AccessibilityServiceStateProvider.kt
@@ -23,7 +23,7 @@
  * Returns the state of whether any accessibility services are enabled.
  *
  * @param listenToTouchExplorationState whether to track the enabled/disabled state of touch
- * exploration (i.e. TalkBack)
+ *   exploration (i.e. TalkBack)
  * @param listenToSwitchAccessState whether to track the enabled/disabled state of Switch Access
  */
 @Composable
diff --git a/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/internal/AnchoredDraggable.kt b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/internal/AnchoredDraggable.kt
index 7941e5a..0a4a8fc 100644
--- a/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/internal/AnchoredDraggable.kt
+++ b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/internal/AnchoredDraggable.kt
@@ -87,7 +87,6 @@
      * Find the closest anchor to the [position].
      *
      * @param position The position to start searching from
-     *
      * @return The closest anchor or null if the anchors are empty
      */
     fun closestAnchor(position: Float): T?
@@ -97,24 +96,17 @@
      *
      * @param position The position to start searching from
      * @param searchUpwards Whether to search upwards from the current position or downwards
-     *
      * @return The closest anchor or null if the anchors are empty
      */
     fun closestAnchor(position: Float, searchUpwards: Boolean): T?
 
-    /**
-     * The smallest anchor, or [Float.NEGATIVE_INFINITY] if the anchors are empty.
-     */
+    /** The smallest anchor, or [Float.NEGATIVE_INFINITY] if the anchors are empty. */
     fun minAnchor(): Float
 
-    /**
-     * The biggest anchor, or [Float.POSITIVE_INFINITY] if the anchors are empty.
-     */
+    /** The biggest anchor, or [Float.POSITIVE_INFINITY] if the anchors are empty. */
     fun maxAnchor(): Float
 
-    /**
-     * The amount of anchors
-     */
+    /** The amount of anchors */
     val size: Int
 }
 
@@ -143,7 +135,7 @@
  *
  * @param builder A function with a [DraggableAnchorsConfig] that offers APIs to configure anchors
  * @return A new [DraggableAnchors] instance with the anchor positions set by the `builder`
- * function.
+ *   function.
  */
 internal fun <T : Any> DraggableAnchors(
     builder: DraggableAnchorsConfig<T>.() -> Unit
@@ -153,20 +145,20 @@
  * Enable drag gestures between a set of predefined values.
  *
  * When a drag is detected, the offset of the [AnchoredDraggableState] will be updated with the drag
- * delta. You should use this offset to move your content accordingly (see [Modifier.offset]).
- * When the drag ends, the offset will be animated to one of the anchors and when that anchor is
- * reached, the value of the [AnchoredDraggableState] will also be updated to the value
- * corresponding to the new anchor.
+ * delta. You should use this offset to move your content accordingly (see [Modifier.offset]). When
+ * the drag ends, the offset will be animated to one of the anchors and when that anchor is reached,
+ * the value of the [AnchoredDraggableState] will also be updated to the value corresponding to the
+ * new anchor.
  *
  * Dragging is constrained between the minimum and maximum anchors.
  *
  * @param state The associated [AnchoredDraggableState].
  * @param orientation The orientation in which the [anchoredDraggable] can be dragged.
  * @param enabled Whether this [anchoredDraggable] is enabled and should react to the user's input.
- * @param reverseDirection Whether to reverse the direction of the drag, so a top to bottom
- * drag will behave like bottom to top, and a left to right drag will behave like right to left.
- * @param interactionSource Optional [MutableInteractionSource] that will passed on to
- * the internal [Modifier.draggable].
+ * @param reverseDirection Whether to reverse the direction of the drag, so a top to bottom drag
+ *   will behave like bottom to top, and a left to right drag will behave like right to left.
+ * @param interactionSource Optional [MutableInteractionSource] that will passed on to the internal
+ *   [Modifier.draggable].
  */
 internal fun <T> Modifier.anchoredDraggable(
     state: AnchoredDraggableState<T>,
@@ -174,22 +166,23 @@
     enabled: Boolean = true,
     reverseDirection: Boolean = false,
     interactionSource: MutableInteractionSource? = null
-) = draggable(
-    state = state.draggableState,
-    orientation = orientation,
-    enabled = enabled,
-    interactionSource = interactionSource,
-    reverseDirection = reverseDirection,
-    startDragImmediately = state.isAnimationRunning,
-    onDragStopped = { velocity -> launch { state.settle(velocity) } }
-)
+) =
+    draggable(
+        state = state.draggableState,
+        orientation = orientation,
+        enabled = enabled,
+        interactionSource = interactionSource,
+        reverseDirection = reverseDirection,
+        startDragImmediately = state.isAnimationRunning,
+        onDragStopped = { velocity -> launch { state.settle(velocity) } }
+    )
 
 /**
  * Scope used for suspending anchored drag blocks. Allows to set [AnchoredDraggableState.offset] to
  * a new value.
  *
  * @see [AnchoredDraggableState.anchoredDrag] to learn how to start the anchored drag and get the
- * access to this scope.
+ *   access to this scope.
  */
 internal interface AnchoredDragScope {
     /**
@@ -198,28 +191,25 @@
      * @param newOffset new value for [AnchoredDraggableState.offset].
      * @param lastKnownVelocity last known velocity (if known)
      */
-    fun dragTo(
-        newOffset: Float,
-        lastKnownVelocity: Float = 0f
-    )
+    fun dragTo(newOffset: Float, lastKnownVelocity: Float = 0f)
 }
 
 /**
- * State of the [anchoredDraggable] modifier.
- * Use the constructor overload with anchors if the anchors are defined in composition, or update
- * the anchors using [updateAnchors].
+ * State of the [anchoredDraggable] modifier. Use the constructor overload with anchors if the
+ * anchors are defined in composition, or update the anchors using [updateAnchors].
  *
- * This contains necessary information about any ongoing drag or animation and provides methods
- * to change the state either immediately or by starting an animation.
+ * This contains necessary information about any ongoing drag or animation and provides methods to
+ * change the state either immediately or by starting an animation.
  *
  * @param initialValue The initial value of the state.
  * @param positionalThreshold The positional threshold, in px, to be used when calculating the
- * target state while a drag is in progress and when settling after the drag ends. This is the
- * distance from the start of a transition. It will be, depending on the direction of the
- * interaction, added or subtracted from/to the origin offset. It should always be a positive value.
+ *   target state while a drag is in progress and when settling after the drag ends. This is the
+ *   distance from the start of a transition. It will be, depending on the direction of the
+ *   interaction, added or subtracted from/to the origin offset. It should always be a positive
+ *   value.
  * @param velocityThreshold The velocity threshold (in px per second) that the end velocity has to
- * exceed in order to animate to the next state, even if the [positionalThreshold] has not been
- * reached.
+ *   exceed in order to animate to the next state, even if the [positionalThreshold] has not been
+ *   reached.
  * @param animationSpec The default animation that will be used to animate to a new state.
  * @param confirmValueChange Optional callback invoked to confirm or veto a pending state change.
  */
@@ -239,15 +229,15 @@
      * @param anchors The anchors of the state. Use [updateAnchors] to update the anchors later.
      * @param animationSpec The default animation that will be used to animate to a new state.
      * @param confirmValueChange Optional callback invoked to confirm or veto a pending state
-     * change.
+     *   change.
      * @param positionalThreshold The positional threshold, in px, to be used when calculating the
-     * target state while a drag is in progress and when settling after the drag ends. This is the
-     * distance from the start of a transition. It will be, depending on the direction of the
-     * interaction, added or subtracted from/to the origin offset. It should always be a positive
-     * value.
+     *   target state while a drag is in progress and when settling after the drag ends. This is the
+     *   distance from the start of a transition. It will be, depending on the direction of the
+     *   interaction, added or subtracted from/to the origin offset. It should always be a positive
+     *   value.
      * @param velocityThreshold The velocity threshold (in px per second) that the end velocity has
-     * to exceed in order to animate to the next state, even if the [positionalThreshold] has not
-     * been reached.
+     *   to exceed in order to animate to the next state, even if the [positionalThreshold] has not
+     *   been reached.
      */
     constructor(
         initialValue: T,
@@ -269,48 +259,47 @@
 
     private val dragMutex = InternalMutatorMutex()
 
-    internal val draggableState = object : DraggableState {
+    internal val draggableState =
+        object : DraggableState {
 
-        private val dragScope = object : DragScope {
-            override fun dragBy(pixels: Float) {
-                with(anchoredDragScope) {
-                    dragTo(newOffsetForDelta(pixels))
+            private val dragScope =
+                object : DragScope {
+                    override fun dragBy(pixels: Float) {
+                        with(anchoredDragScope) { dragTo(newOffsetForDelta(pixels)) }
+                    }
+                }
+
+            override suspend fun drag(
+                dragPriority: MutatePriority,
+                block: suspend DragScope.() -> Unit
+            ) {
+                this@AnchoredDraggableState.anchoredDrag(dragPriority) {
+                    with(dragScope) { block() }
                 }
             }
-        }
 
-        override suspend fun drag(
-            dragPriority: MutatePriority,
-            block: suspend DragScope.() -> Unit
-        ) {
-            this@AnchoredDraggableState.anchoredDrag(dragPriority) {
-                with(dragScope) { block() }
+            override fun dispatchRawDelta(delta: Float) {
+                this@AnchoredDraggableState.dispatchRawDelta(delta)
             }
         }
 
-        override fun dispatchRawDelta(delta: Float) {
-            this@AnchoredDraggableState.dispatchRawDelta(delta)
-        }
-    }
-
-    /**
-     * The current value of the [AnchoredDraggableState].
-     */
+    /** The current value of the [AnchoredDraggableState]. */
     var currentValue: T by mutableStateOf(initialValue)
         private set
 
     /**
      * The target value. This is the closest value to the current offset, taking into account
-     * positional thresholds. If no interactions like animations or drags are in progress, this
-     * will be the current value.
+     * positional thresholds. If no interactions like animations or drags are in progress, this will
+     * be the current value.
      */
     val targetValue: T by derivedStateOf {
-        dragTarget ?: run {
-            val currentOffset = offset
-            if (!currentOffset.isNaN()) {
-                computeTarget(currentOffset, currentValue, velocity = 0f)
-            } else currentValue
-        }
+        dragTarget
+            ?: run {
+                val currentOffset = offset
+                if (!currentOffset.isNaN()) {
+                    computeTarget(currentOffset, currentValue, velocity = 0f)
+                } else currentValue
+            }
     }
 
     /**
@@ -319,12 +308,13 @@
      * specified).
      */
     internal val closestValue: T by derivedStateOf {
-        dragTarget ?: run {
-            val currentOffset = offset
-            if (!currentOffset.isNaN()) {
-                computeTargetWithoutThresholds(currentOffset, currentValue)
-            } else currentValue
-        }
+        dragTarget
+            ?: run {
+                val currentOffset = offset
+                if (!currentOffset.isNaN()) {
+                    computeTargetWithoutThresholds(currentOffset, currentValue)
+                } else currentValue
+            }
     }
 
     /**
@@ -341,9 +331,8 @@
     /**
      * Require the current offset.
      *
-     * @see offset
-     *
      * @throws IllegalStateException If the offset has not been initialized yet
+     * @see offset
      */
     fun requireOffset(): Float {
         check(!offset.isNaN()) {
@@ -353,32 +342,31 @@
         return offset
     }
 
-    /**
-     * Whether an animation is currently in progress.
-     */
-    val isAnimationRunning: Boolean get() = dragTarget != null
+    /** Whether an animation is currently in progress. */
+    val isAnimationRunning: Boolean
+        get() = dragTarget != null
 
     /**
      * The fraction of the progress going from [currentValue] to [closestValue], within [0f..1f]
      * bounds, or 1f if the [AnchoredDraggableState] is in a settled state.
      */
     @get:FloatRange(from = 0.0, to = 1.0)
-    val progress: Float by derivedStateOf(structuralEqualityPolicy()) {
-        val a = anchors.positionOf(currentValue)
-        val b = anchors.positionOf(closestValue)
-        val distance = abs(b - a)
-        if (!distance.isNaN() && distance > 1e-6f) {
-            val progress = (this.requireOffset() - a) / (b - a)
-            // If we are very close to 0f or 1f, we round to the closest
-            if (progress < 1e-6f) 0f else if (progress > 1 - 1e-6f) 1f else progress
-        } else 1f
-    }
+    val progress: Float by
+        derivedStateOf(structuralEqualityPolicy()) {
+            val a = anchors.positionOf(currentValue)
+            val b = anchors.positionOf(closestValue)
+            val distance = abs(b - a)
+            if (!distance.isNaN() && distance > 1e-6f) {
+                val progress = (this.requireOffset() - a) / (b - a)
+                // If we are very close to 0f or 1f, we round to the closest
+                if (progress < 1e-6f) 0f else if (progress > 1 - 1e-6f) 1f else progress
+            } else 1f
+        }
 
     /**
      * The velocity of the last known animation. Gets reset to 0f when an animation completes
-     * successfully, but does not get reset when an animation gets interrupted.
-     * You can use this value to provide smooth reconciliation behavior when re-targeting an
-     * animation.
+     * successfully, but does not get reset when an animation gets interrupted. You can use this
+     * value to provide smooth reconciliation behavior when re-targeting an animation.
      */
     var lastVelocity: Float by mutableFloatStateOf(0f)
         private set
@@ -395,19 +383,19 @@
      *
      * <b>If your anchors depend on the size of the layout, updateAnchors should be called in the
      * layout (placement) phase, e.g. through Modifier.onSizeChanged.</b> This ensures that the
-     * state is set up within the same frame.
-     * For static anchors, or anchors with different data dependencies, [updateAnchors] is safe to
-     * be called from side effects or layout.
+     * state is set up within the same frame. For static anchors, or anchors with different data
+     * dependencies, [updateAnchors] is safe to be called from side effects or layout.
      *
      * @param newAnchors The new anchors.
      * @param newTarget The new target, by default the closest anchor or the current target if there
-     * are no anchors.
+     *   are no anchors.
      */
     fun updateAnchors(
         newAnchors: DraggableAnchors<T>,
-        newTarget: T = if (!offset.isNaN()) {
-            newAnchors.closestAnchor(offset) ?: targetValue
-        } else targetValue
+        newTarget: T =
+            if (!offset.isNaN()) {
+                newAnchors.closestAnchor(offset) ?: targetValue
+            } else targetValue
     ) {
         if (anchors != newAnchors) {
             anchors = newAnchors
@@ -432,11 +420,12 @@
      */
     suspend fun settle(velocity: Float) {
         val previousValue = this.currentValue
-        val targetValue = computeTarget(
-            offset = requireOffset(),
-            currentValue = previousValue,
-            velocity = velocity
-        )
+        val targetValue =
+            computeTarget(
+                offset = requireOffset(),
+                currentValue = previousValue,
+                velocity = velocity
+            )
         if (confirmValueChange(targetValue)) {
             animateTo(targetValue, velocity)
         } else {
@@ -445,11 +434,7 @@
         }
     }
 
-    private fun computeTarget(
-        offset: Float,
-        currentValue: T,
-        velocity: Float
-    ): T {
+    private fun computeTarget(offset: Float, currentValue: T, velocity: Float): T {
         val currentAnchors = anchors
         val currentAnchorPosition = currentAnchors.positionOf(currentValue)
         val velocityThresholdPx = velocityThreshold()
@@ -501,20 +486,21 @@
         }
     }
 
-    private val anchoredDragScope: AnchoredDragScope = object : AnchoredDragScope {
-        override fun dragTo(newOffset: Float, lastKnownVelocity: Float) {
-            offset = newOffset
-            lastVelocity = lastKnownVelocity
+    private val anchoredDragScope: AnchoredDragScope =
+        object : AnchoredDragScope {
+            override fun dragTo(newOffset: Float, lastKnownVelocity: Float) {
+                offset = newOffset
+                lastVelocity = lastKnownVelocity
+            }
         }
-    }
 
     /**
      * Call this function to take control of drag logic and perform anchored drag with the latest
      * anchors.
      *
      * All actions that change the [offset] of this [AnchoredDraggableState] must be performed
-     * within an [anchoredDrag] block (even if they don't call any other methods on this object)
-     * in order to guarantee that mutual exclusion is enforced.
+     * within an [anchoredDrag] block (even if they don't call any other methods on this object) in
+     * order to guarantee that mutual exclusion is enforced.
      *
      * If [anchoredDrag] is called from elsewhere with the [dragPriority] higher or equal to ongoing
      * drag, the ongoing drag will be cancelled.
@@ -538,9 +524,10 @@
             }
         } finally {
             val closest = anchors.closestAnchor(offset)
-            if (closest != null &&
-                abs(offset - anchors.positionOf(closest)) <= 0.5f &&
-                confirmValueChange.invoke(closest)
+            if (
+                closest != null &&
+                    abs(offset - anchors.positionOf(closest)) <= 0.5f &&
+                    confirmValueChange.invoke(closest)
             ) {
                 currentValue = closest
             }
@@ -552,8 +539,8 @@
      * anchors and target.
      *
      * All actions that change the [offset] of this [AnchoredDraggableState] must be performed
-     * within an [anchoredDrag] block (even if they don't call any other methods on this object)
-     * in order to guarantee that mutual exclusion is enforced.
+     * within an [anchoredDrag] block (even if they don't call any other methods on this object) in
+     * order to guarantee that mutual exclusion is enforced.
      *
      * This overload allows the caller to hint the target value that this [anchoredDrag] is intended
      * to arrive to. This will set [AnchoredDraggableState.targetValue] to provided value so
@@ -579,18 +566,18 @@
             try {
                 dragMutex.mutate(dragPriority) {
                     dragTarget = targetValue
-                    restartable(
-                        inputs = { anchors to this@AnchoredDraggableState.targetValue }
-                    ) { (latestAnchors, latestTarget) ->
+                    restartable(inputs = { anchors to this@AnchoredDraggableState.targetValue }) {
+                        (latestAnchors, latestTarget) ->
                         anchoredDragScope.block(latestAnchors, latestTarget)
                     }
                 }
             } finally {
                 dragTarget = null
                 val closest = anchors.closestAnchor(offset)
-                if (closest != null &&
-                    abs(offset - anchors.positionOf(closest)) <= 0.5f &&
-                    confirmValueChange.invoke(closest)
+                if (
+                    closest != null &&
+                        abs(offset - anchors.positionOf(closest)) <= 0.5f &&
+                        confirmValueChange.invoke(closest)
                 ) {
                     currentValue = closest
                 }
@@ -602,8 +589,10 @@
     }
 
     internal fun newOffsetForDelta(delta: Float) =
-        ((if (offset.isNaN()) 0f else offset) + delta)
-            .coerceIn(anchors.minAnchor(), anchors.maxAnchor())
+        ((if (offset.isNaN()) 0f else offset) + delta).coerceIn(
+            anchors.minAnchor(),
+            anchors.maxAnchor()
+        )
 
     /**
      * Drag by the [delta], coerce it in the bounds and dispatch it to the [AnchoredDraggableState].
@@ -624,50 +613,49 @@
      *
      * @return true if the synchronous snap was successful, or false if we couldn't snap synchronous
      */
-    private fun trySnapTo(targetValue: T): Boolean = dragMutex.tryMutate {
-        with(anchoredDragScope) {
-            val targetOffset = anchors.positionOf(targetValue)
-            if (!targetOffset.isNaN()) {
-                dragTo(targetOffset)
-                dragTarget = null
+    private fun trySnapTo(targetValue: T): Boolean =
+        dragMutex.tryMutate {
+            with(anchoredDragScope) {
+                val targetOffset = anchors.positionOf(targetValue)
+                if (!targetOffset.isNaN()) {
+                    dragTo(targetOffset)
+                    dragTarget = null
+                }
+                currentValue = targetValue
             }
-            currentValue = targetValue
         }
-    }
 
     companion object {
-        /**
-         * The default [Saver] implementation for [AnchoredDraggableState].
-         */
+        /** The default [Saver] implementation for [AnchoredDraggableState]. */
         fun <T : Any> Saver(
             animationSpec: AnimationSpec<Float>,
             confirmValueChange: (T) -> Boolean,
             positionalThreshold: (distance: Float) -> Float,
             velocityThreshold: () -> Float,
-        ) = Saver<AnchoredDraggableState<T>, T>(
-            save = { it.currentValue },
-            restore = {
-                AnchoredDraggableState(
-                    initialValue = it,
-                    animationSpec = animationSpec,
-                    confirmValueChange = confirmValueChange,
-                    positionalThreshold = positionalThreshold,
-                    velocityThreshold = velocityThreshold
-                )
-            }
-        )
+        ) =
+            Saver<AnchoredDraggableState<T>, T>(
+                save = { it.currentValue },
+                restore = {
+                    AnchoredDraggableState(
+                        initialValue = it,
+                        animationSpec = animationSpec,
+                        confirmValueChange = confirmValueChange,
+                        positionalThreshold = positionalThreshold,
+                        velocityThreshold = velocityThreshold
+                    )
+                }
+            )
     }
 }
 
 /**
- * Snap to a [targetValue] without any animation.
- * If the [targetValue] is not in the set of anchors, the [AnchoredDraggableState.currentValue] will
- * be updated to the [targetValue] without updating the offset.
- *
- * @throws CancellationException if the interaction interrupted by another interaction like a
- * gesture interaction or another programmatic interaction like a [animateTo] or [snapTo] call.
+ * Snap to a [targetValue] without any animation. If the [targetValue] is not in the set of anchors,
+ * the [AnchoredDraggableState.currentValue] will be updated to the [targetValue] without updating
+ * the offset.
  *
  * @param targetValue The target value of the animation
+ * @throws CancellationException if the interaction interrupted by another interaction like a
+ *   gesture interaction or another programmatic interaction like a [animateTo] or [snapTo] call.
  */
 internal suspend fun <T> AnchoredDraggableState<T>.snapTo(targetValue: T) {
     anchoredDrag(targetValue = targetValue) { anchors, latestTarget ->
@@ -677,15 +665,14 @@
 }
 
 /**
- * Animate to a [targetValue].
- * If the [targetValue] is not in the set of anchors, the [AnchoredDraggableState.currentValue] will
- * be updated to the [targetValue] without updating the offset.
- *
- * @throws CancellationException if the interaction interrupted by another interaction like a
- * gesture interaction or another programmatic interaction like a [animateTo] or [snapTo] call.
+ * Animate to a [targetValue]. If the [targetValue] is not in the set of anchors, the
+ * [AnchoredDraggableState.currentValue] will be updated to the [targetValue] without updating the
+ * offset.
  *
  * @param targetValue The target value of the animation
  * @param velocity The velocity the animation should start with
+ * @throws CancellationException if the interaction interrupted by another interaction like a
+ *   gesture interaction or another programmatic interaction like a [animateTo] or [snapTo] call.
  */
 internal suspend fun <T> AnchoredDraggableState<T>.animateTo(
     targetValue: T,
@@ -707,14 +694,10 @@
     }
 }
 
-/**
- * Contains useful defaults for [anchoredDraggable] and [AnchoredDraggableState].
- */
+/** Contains useful defaults for [anchoredDraggable] and [AnchoredDraggableState]. */
 @Stable
 internal object AnchoredDraggableDefaults {
-    /**
-     * The default animation used by [AnchoredDraggableState].
-     */
+    /** The default animation used by [AnchoredDraggableState]. */
     val AnimationSpec = SpringSpec<Float>()
 }
 
@@ -729,17 +712,17 @@
     try {
         coroutineScope {
             var previousDrag: Job? = null
-            snapshotFlow(inputs)
-                .collect { latestInputs ->
-                    previousDrag?.apply {
-                        cancel(AnchoredDragFinishedSignal())
-                        join()
-                    }
-                    previousDrag = launch(start = CoroutineStart.UNDISPATCHED) {
+            snapshotFlow(inputs).collect { latestInputs ->
+                previousDrag?.apply {
+                    cancel(AnchoredDragFinishedSignal())
+                    join()
+                }
+                previousDrag =
+                    launch(start = CoroutineStart.UNDISPATCHED) {
                         block(latestInputs)
                         this@coroutineScope.cancel(AnchoredDragFinishedSignal())
                     }
-                }
+            }
         }
     } catch (anchoredDragFinished: AnchoredDragFinishedSignal) {
         // Ignored
@@ -751,20 +734,19 @@
 private class MapDraggableAnchors<T>(private val anchors: Map<T, Float>) : DraggableAnchors<T> {
 
     override fun positionOf(value: T): Float = anchors[value] ?: Float.NaN
+
     override fun hasAnchorFor(value: T) = anchors.containsKey(value)
 
-    override fun closestAnchor(position: Float): T? = anchors.minByOrNull {
-        abs(position - it.value)
-    }?.key
+    override fun closestAnchor(position: Float): T? =
+        anchors.minByOrNull { abs(position - it.value) }?.key
 
-    override fun closestAnchor(
-        position: Float,
-        searchUpwards: Boolean
-    ): T? {
-        return anchors.minByOrNull { (_, anchor) ->
-            val delta = if (searchUpwards) anchor - position else position - anchor
-            if (delta < 0) Float.POSITIVE_INFINITY else delta
-        }?.key
+    override fun closestAnchor(position: Float, searchUpwards: Boolean): T? {
+        return anchors
+            .minByOrNull { (_, anchor) ->
+                val delta = if (searchUpwards) anchor - position else position - anchor
+                if (delta < 0) Float.POSITIVE_INFINITY else delta
+            }
+            ?.key
     }
 
     override fun minAnchor() = anchors.values.minOrNull() ?: Float.NaN
@@ -788,16 +770,15 @@
 
 /**
  * This Modifier allows configuring an [AnchoredDraggableState]'s anchors based on this layout
- * node's size and offsetting it.
- * It considers lookahead and reports the appropriate size and measurement for the appropriate
- * phase.
+ * node's size and offsetting it. It considers lookahead and reports the appropriate size and
+ * measurement for the appropriate phase.
  *
  * @param state The state the anchors should be attached to
  * @param orientation The orientation the component should be offset in
  * @param anchors Lambda to calculate the anchors based on this layout's size and the incoming
- * constraints. These can be useful to avoid subcomposition.
+ *   constraints. These can be useful to avoid subcomposition.
  */
-internal fun<T> Modifier.draggableAnchors(
+internal fun <T> Modifier.draggableAnchors(
     state: AnchoredDraggableState<T>,
     orientation: Orientation,
     anchors: (size: IntSize, constraints: Constraints) -> Pair<DraggableAnchors<T>, T>,
@@ -874,9 +855,10 @@
             // In a lookahead pass, we use the position of the current target as this is where any
             // ongoing animations would move. If the component is in a settled state, lookahead
             // and post-lookahead will converge.
-            val offset = if (isLookingAhead) {
-                state.anchors.positionOf(state.targetValue)
-            } else state.requireOffset()
+            val offset =
+                if (isLookingAhead) {
+                    state.anchors.positionOf(state.targetValue)
+                } else state.requireOffset()
             val xOffset = if (orientation == Orientation.Horizontal) offset else 0f
             val yOffset = if (orientation == Orientation.Vertical) offset else 0f
             placeable.place(xOffset.roundToInt(), yOffset.roundToInt())
diff --git a/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/internal/BasicTooltip.kt b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/internal/BasicTooltip.kt
index 9b2e0c9..de34a09 100644
--- a/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/internal/BasicTooltip.kt
+++ b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/internal/BasicTooltip.kt
@@ -36,26 +36,25 @@
 import kotlinx.coroutines.withTimeout
 
 /**
- * NOTICE:
- * Fork from androidx.compose.foundation.BasicTooltip box since those are experimental
+ * NOTICE: Fork from androidx.compose.foundation.BasicTooltip box since those are experimental
  *
  * BasicTooltipBox that wraps a composable with a tooltip.
  *
- * Tooltip that provides a descriptive message for an anchor.
- * It can be used to call the users attention to the anchor.
+ * Tooltip that provides a descriptive message for an anchor. It can be used to call the users
+ * attention to the anchor.
  *
- * @param positionProvider [PopupPositionProvider] that will be used to place the tooltip
- * relative to the anchor content.
+ * @param positionProvider [PopupPositionProvider] that will be used to place the tooltip relative
+ *   to the anchor content.
  * @param tooltip the composable that will be used to populate the tooltip's content.
  * @param state handles the state of the tooltip's visibility.
  * @param modifier the [Modifier] to be applied to this BasicTooltipBox.
- * @param focusable [Boolean] that determines if the tooltip is focusable. When true,
- * the tooltip will consume touch events while it's shown and will have accessibility
- * focus move to the first element of the component. When false, the tooltip
- * won't consume touch events while it's shown but assistive-tech users will need
- * to swipe or drag to get to the first element of the component.
- * @param enableUserInput [Boolean] which determines if this BasicTooltipBox will handle
- * long press and mouse hover to trigger the tooltip through the state provided.
+ * @param focusable [Boolean] that determines if the tooltip is focusable. When true, the tooltip
+ *   will consume touch events while it's shown and will have accessibility focus move to the first
+ *   element of the component. When false, the tooltip won't consume touch events while it's shown
+ *   but assistive-tech users will need to swipe or drag to get to the first element of the
+ *   component.
+ * @param enableUserInput [Boolean] which determines if this BasicTooltipBox will handle long press
+ *   and mouse hover to trigger the tooltip through the state provided.
  * @param content the composable that the tooltip will anchor to.
  */
 @Composable
@@ -73,14 +72,13 @@
  * Create and remember the default [BasicTooltipState].
  *
  * @param initialIsVisible the initial value for the tooltip's visibility when drawn.
- * @param isPersistent [Boolean] that determines if the tooltip associated with this
- * will be persistent or not. If isPersistent is true, then the tooltip will
- * only be dismissed when the user clicks outside the bounds of the tooltip or if
- * [TooltipState.dismiss] is called. When isPersistent is false, the tooltip will dismiss after
- * a short duration. Ideally, this should be set to true when there is actionable content
- * being displayed within a tooltip.
- * @param mutatorMutex [MutatorMutex] used to ensure that for all of the tooltips associated
- * with the mutator mutex, only one will be shown on the screen at any time.
+ * @param isPersistent [Boolean] that determines if the tooltip associated with this will be
+ *   persistent or not. If isPersistent is true, then the tooltip will only be dismissed when the
+ *   user clicks outside the bounds of the tooltip or if [TooltipState.dismiss] is called. When
+ *   isPersistent is false, the tooltip will dismiss after a short duration. Ideally, this should be
+ *   set to true when there is actionable content being displayed within a tooltip.
+ * @param mutatorMutex [MutatorMutex] used to ensure that for all of the tooltips associated with
+ *   the mutator mutex, only one will be shown on the screen at any time.
  */
 @Composable
 internal fun rememberBasicTooltipState(
@@ -88,10 +86,7 @@
     isPersistent: Boolean = true,
     mutatorMutex: MutatorMutex = BasicTooltipDefaults.GlobalMutatorMutex
 ): TooltipState =
-    remember(
-        isPersistent,
-        mutatorMutex
-    ) {
+    remember(isPersistent, mutatorMutex) {
         BasicTooltipStateImpl(
             initialIsVisible = initialIsVisible,
             isPersistent = isPersistent,
@@ -103,14 +98,13 @@
  * Constructor extension function for [BasicTooltipState]
  *
  * @param initialIsVisible the initial value for the tooltip's visibility when drawn.
- * @param isPersistent [Boolean] that determines if the tooltip associated with this
- * will be persistent or not. If isPersistent is true, then the tooltip will
- * only be dismissed when the user clicks outside the bounds of the tooltip or if
- * [TooltipState.dismiss] is called. When isPersistent is false, the tooltip will dismiss after
- * a short duration. Ideally, this should be set to true when there is actionable content
- * being displayed within a tooltip.
- * @param mutatorMutex [MutatorMutex] used to ensure that for all of the tooltips associated
- * with the mutator mutex, only one will be shown on the screen at any time.
+ * @param isPersistent [Boolean] that determines if the tooltip associated with this will be
+ *   persistent or not. If isPersistent is true, then the tooltip will only be dismissed when the
+ *   user clicks outside the bounds of the tooltip or if [TooltipState.dismiss] is called. When
+ *   isPersistent is false, the tooltip will dismiss after a short duration. Ideally, this should be
+ *   set to true when there is actionable content being displayed within a tooltip.
+ * @param mutatorMutex [MutatorMutex] used to ensure that for all of the tooltips associated with
+ *   the mutator mutex, only one will be shown on the screen at any time.
  */
 @Stable
 internal fun BasicTooltipState(
@@ -131,24 +125,18 @@
     private val mutatorMutex: MutatorMutex
 ) : TooltipState {
     override var isVisible by mutableStateOf(initialIsVisible)
-    override val transition: MutableTransitionState<Boolean> =
-        MutableTransitionState(false)
+    override val transition: MutableTransitionState<Boolean> = MutableTransitionState(false)
 
-    /**
-     * continuation used to clean up
-     */
+    /** continuation used to clean up */
     private var job: (CancellableContinuation<Unit>)? = null
 
     /**
-     * Show the tooltip associated with the current [BasicTooltipState].
-     * When this method is called, all of the other tooltips associated
-     * with [mutatorMutex] will be dismissed.
+     * Show the tooltip associated with the current [BasicTooltipState]. When this method is called,
+     * all of the other tooltips associated with [mutatorMutex] will be dismissed.
      *
      * @param mutatePriority [MutatePriority] to be used with [mutatorMutex].
      */
-    override suspend fun show(
-        mutatePriority: MutatePriority
-    ) {
+    override suspend fun show(mutatePriority: MutatePriority) {
         val cancellableShow: suspend () -> Unit = {
             suspendCancellableCoroutine { continuation ->
                 isVisible = true
@@ -163,9 +151,7 @@
                 if (isPersistent) {
                     cancellableShow()
                 } else {
-                    withTimeout(BasicTooltipDefaults.TooltipDuration) {
-                        cancellableShow()
-                    }
+                    withTimeout(BasicTooltipDefaults.TooltipDuration) { cancellableShow() }
                 }
             } finally {
                 // timeout or cancellation has occurred
@@ -176,34 +162,26 @@
     }
 
     /**
-     * Dismiss the tooltip associated with
-     * this [BasicTooltipState] if it's currently being shown.
+     * Dismiss the tooltip associated with this [BasicTooltipState] if it's currently being shown.
      */
     override fun dismiss() {
         isVisible = false
     }
 
-    /**
-     * Cleans up [mutatorMutex] when the tooltip associated
-     * with this state leaves Composition.
-     */
+    /** Cleans up [mutatorMutex] when the tooltip associated with this state leaves Composition. */
     override fun onDispose() {
         job?.cancel()
     }
 }
 
-/**
- * BasicTooltip defaults that contain default values for tooltips created.
- */
+/** BasicTooltip defaults that contain default values for tooltips created. */
 internal object BasicTooltipDefaults {
-    /**
-     * The global/default [MutatorMutex] used to sync Tooltips.
-     */
+    /** The global/default [MutatorMutex] used to sync Tooltips. */
     val GlobalMutatorMutex: MutatorMutex = MutatorMutex()
 
     /**
-     * The default duration, in milliseconds, that non-persistent tooltips
-     * will show on the screen before dismissing.
+     * The default duration, in milliseconds, that non-persistent tooltips will show on the screen
+     * before dismissing.
      */
     const val TooltipDuration = 1500L
 }
diff --git a/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/internal/CalendarModel.kt b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/internal/CalendarModel.kt
index 824fec4..3d8c3c2 100644
--- a/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/internal/CalendarModel.kt
+++ b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/internal/CalendarModel.kt
@@ -61,9 +61,7 @@
     // A map for caching formatter related results for better performance
     internal val formatterCache = mutableMapOf<String, Any>()
 
-    /**
-     * A [CalendarDate] representing the current day.
-     */
+    /** A [CalendarDate] representing the current day. */
     abstract val today: CalendarDate
 
     /**
@@ -78,8 +76,7 @@
      * Each item in this list is a [Pair] that holds the full name of the day, and its short
      * abbreviation letter(s).
      *
-     * Newer APIs (i.e. API 26+), a [Pair] will hold a full name and the first letter of the
-     * day.
+     * Newer APIs (i.e. API 26+), a [Pair] will hold a full name and the first letter of the day.
      * Older APIs that predate API 26 will hold a full name and the first three letters of the day.
      */
     abstract val weekdayNames: List<Pair<String, String>>
@@ -87,18 +84,18 @@
     /**
      * Returns a [DateInputFormat] for the given [CalendarLocale].
      *
-     * The input format represents the date with two digits for the day and the month, and
-     * four digits for the year.
+     * The input format represents the date with two digits for the day and the month, and four
+     * digits for the year.
      *
      * For example, the input format patterns, including delimiters, will hold 10-characters strings
      * in one of the following variations:
-     *  - yyyy/MM/dd
-     *  - yyyy-MM-dd
-     *  - yyyy.MM.dd
-     *  - dd/MM/yyyy
-     *  - dd-MM-yyyy
-     *  - dd.MM.yyyy
-     *  - MM/dd/yyyy
+     * - yyyy/MM/dd
+     * - yyyy-MM-dd
+     * - yyyy.MM.dd
+     * - dd/MM/yyyy
+     * - dd-MM-yyyy
+     * - dd.MM.yyyy
+     * - MM/dd/yyyy
      */
     abstract fun getDateInputFormat(locale: CalendarLocale = this.locale): DateInputFormat
 
@@ -122,8 +119,8 @@
     /**
      * Returns a [CalendarMonth] from a given [CalendarDate].
      *
-     * Note: This function ignores the [CalendarDate.dayOfMonth] value and just uses the date's
-     * year and month to resolve a [CalendarMonth].
+     * Note: This function ignores the [CalendarDate.dayOfMonth] value and just uses the date's year
+     * and month to resolve a [CalendarMonth].
      *
      * @param date a [CalendarDate] to resolve into a month
      */
@@ -173,8 +170,7 @@
         month: CalendarMonth,
         skeleton: String,
         locale: CalendarLocale = this.locale
-    ): String =
-        formatWithSkeleton(month.startUtcTimeMillis, skeleton, locale, formatterCache)
+    ): String = formatWithSkeleton(month.startUtcTimeMillis, skeleton, locale, formatterCache)
 
     /**
      * Formats a [CalendarDate] into a string with a given date format skeleton.
@@ -230,14 +226,11 @@
     override operator fun compareTo(other: CalendarDate): Int =
         this.utcTimeMillis.compareTo(other.utcTimeMillis)
 
-    /**
-     * Formats the date into a string with the given skeleton format and a [CalendarLocale].
-     */
+    /** Formats the date into a string with the given skeleton format and a [CalendarLocale]. */
     fun format(
         calendarModel: CalendarModel,
         skeleton: String,
-    ): String =
-        calendarModel.formatWithSkeleton(this, skeleton, calendarModel.locale)
+    ): String = calendarModel.formatWithSkeleton(this, skeleton, calendarModel.locale)
 }
 
 /**
@@ -247,7 +240,7 @@
  * @param month the calendar month as an integer (e.g. JANUARY as 1, December as 12)
  * @param numberOfDays the number of days in the month
  * @param daysFromStartOfWeekToFirstOfMonth the number of days from the start of the week to the
- * first day of the month
+ *   first day of the month
  * @param startUtcTimeMillis the first day of the month in _UTC_ milliseconds from the epoch
  */
 @OptIn(ExperimentalMaterial3Api::class)
@@ -265,20 +258,13 @@
      */
     val endUtcTimeMillis: Long = startUtcTimeMillis + (numberOfDays * MillisecondsIn24Hours) - 1
 
-    /**
-     * Returns the position of a [CalendarMonth] within given years range.
-     */
+    /** Returns the position of a [CalendarMonth] within given years range. */
     fun indexIn(years: IntRange): Int {
         return (year - years.first) * 12 + month - 1
     }
 
-    /**
-     * Formats the month into a string with the given skeleton format and a [CalendarLocale].
-     */
-    fun format(
-        calendarModel: CalendarModel,
-        skeleton: String
-    ): String =
+    /** Formats the month into a string with the given skeleton format and a [CalendarLocale]. */
+    fun format(calendarModel: CalendarModel, skeleton: String): String =
         calendarModel.formatWithSkeleton(this, skeleton, calendarModel.locale)
 }
 
@@ -289,10 +275,7 @@
  * dates in a short format, as well as a date pattern with and without a delimiter.
  */
 @Immutable
-internal data class DateInputFormat(
-    val patternWithDelimiters: String,
-    val delimiter: Char
-) {
+internal data class DateInputFormat(val patternWithDelimiters: String, val delimiter: Char) {
     val patternWithoutDelimiters: String = patternWithDelimiters.replace(delimiter.toString(), "")
 }
 
@@ -301,35 +284,34 @@
  * and parsed by the date parser.
  *
  * This function:
- *  - Removes all characters that don't match `d`, `M` and `y`, or any of the date format delimiters
- *    `.`, `/` and `-`.
- *  - Ensures that the format is for two digits day and month, and four digits year.
+ * - Removes all characters that don't match `d`, `M` and `y`, or any of the date format delimiters
+ *   `.`, `/` and `-`.
+ * - Ensures that the format is for two digits day and month, and four digits year.
  *
  * The output of this cleanup is always a 10 characters string in one of the following variations:
- *  - yyyy/MM/dd
- *  - yyyy-MM-dd
- *  - yyyy.MM.dd
- *  - dd/MM/yyyy
- *  - dd-MM-yyyy
- *  - dd.MM.yyyy
- *  - MM/dd/yyyy
+ * - yyyy/MM/dd
+ * - yyyy-MM-dd
+ * - yyyy.MM.dd
+ * - dd/MM/yyyy
+ * - dd-MM-yyyy
+ * - dd.MM.yyyy
+ * - MM/dd/yyyy
  */
 internal fun datePatternAsInputFormat(localeFormat: String): DateInputFormat {
-    val patternWithDelimiters = localeFormat.replace(Regex("[^dMy/\\-.]"), "")
-        .replace(Regex("d{1,2}"), "dd")
-        .replace(Regex("M{1,2}"), "MM")
-        .replace(Regex("y{1,4}"), "yyyy")
-        .replace("My", "M/y") // Edge case for the Kako locale
-        .removeSuffix(".") // Removes a dot suffix that appears in some formats
+    val patternWithDelimiters =
+        localeFormat
+            .replace(Regex("[^dMy/\\-.]"), "")
+            .replace(Regex("d{1,2}"), "dd")
+            .replace(Regex("M{1,2}"), "MM")
+            .replace(Regex("y{1,4}"), "yyyy")
+            .replace("My", "M/y") // Edge case for the Kako locale
+            .removeSuffix(".") // Removes a dot suffix that appears in some formats
 
     val delimiterRegex = Regex("[/\\-.]")
     val delimiterMatchResult = delimiterRegex.find(patternWithDelimiters)
     val delimiterIndex = delimiterMatchResult!!.groups[0]!!.range.first
     val delimiter = patternWithDelimiters.substring(delimiterIndex, delimiterIndex + 1)
-    return DateInputFormat(
-        patternWithDelimiters = patternWithDelimiters,
-        delimiter = delimiter[0]
-    )
+    return DateInputFormat(patternWithDelimiters = patternWithDelimiters, delimiter = delimiter[0])
 }
 
 internal const val DaysInWeek: Int = 7
diff --git a/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/internal/DefaultPlatformTextStyle.kt b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/internal/DefaultPlatformTextStyle.kt
index a72b2ad..842d7dc 100644
--- a/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/internal/DefaultPlatformTextStyle.kt
+++ b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/internal/DefaultPlatformTextStyle.kt
@@ -18,7 +18,5 @@
 
 import androidx.compose.ui.text.PlatformTextStyle
 
-/**
- * Returns Default [PlatformTextStyle].
- */
+/** Returns Default [PlatformTextStyle]. */
 internal expect fun defaultPlatformTextStyle(): PlatformTextStyle?
diff --git a/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/internal/DragGestureDetectorCopy.kt b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/internal/DragGestureDetectorCopy.kt
index 7865f75..7a1f47f 100644
--- a/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/internal/DragGestureDetectorCopy.kt
+++ b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/internal/DragGestureDetectorCopy.kt
@@ -38,32 +38,32 @@
     pointerId: PointerId,
     pointerType: PointerType,
     onPointerSlopReached: (change: PointerInputChange, overSlop: Float) -> Unit
-) = awaitPointerSlopOrCancellation(
-    pointerId = pointerId,
-    pointerType = pointerType,
-    onPointerSlopReached = onPointerSlopReached,
-    getDragDirectionValue = { it.x }
-)
+) =
+    awaitPointerSlopOrCancellation(
+        pointerId = pointerId,
+        pointerType = pointerType,
+        onPointerSlopReached = onPointerSlopReached,
+        getDragDirectionValue = { it.x }
+    )
 
 /**
- * Waits for drag motion along one axis based on [getDragDirectionValue] to pass pointer slop,
- * using [pointerId] as the pointer to examine. If [pointerId] is raised, another pointer
- * from those that are down will be chosen to lead the gesture, and if none are down,
- * `null` is returned. If [pointerId] is not down when [awaitPointerSlopOrCancellation] is called,
- * then `null` is returned.
+ * Waits for drag motion along one axis based on [getDragDirectionValue] to pass pointer slop, using
+ * [pointerId] as the pointer to examine. If [pointerId] is raised, another pointer from those that
+ * are down will be chosen to lead the gesture, and if none are down, `null` is returned. If
+ * [pointerId] is not down when [awaitPointerSlopOrCancellation] is called, then `null` is returned.
  *
  * When pointer slop is detected, [onPointerSlopReached] is called with the change and the distance
  * beyond the pointer slop. [getDragDirectionValue] should return the position change in the
  * direction of the drag axis. If [onPointerSlopReached] does not consume the position change,
- * pointer slop will not have been considered detected and the detection will continue or,
- * if it is consumed, the [PointerInputChange] that was consumed will be returned.
+ * pointer slop will not have been considered detected and the detection will continue or, if it is
+ * consumed, the [PointerInputChange] that was consumed will be returned.
  *
  * This works with [awaitTouchSlopOrCancellation] for the other axis to ensure that only horizontal
  * or vertical dragging is done, but not both.
  *
  * @return The [PointerInputChange] of the event that was consumed in [onPointerSlopReached] or
- * `null` if all pointers are raised or the position change was consumed by another gesture
- * detector.
+ *   `null` if all pointers are raised or the position change was consumed by another gesture
+ *   detector.
  */
 private suspend inline fun AwaitPointerEventScope.awaitPointerSlopOrCancellation(
     pointerId: PointerId,
@@ -94,8 +94,8 @@
         } else {
             val currentPosition = dragEvent.position
             val previousPosition = dragEvent.previousPosition
-            val positionChange = getDragDirectionValue(currentPosition) -
-                getDragDirectionValue(previousPosition)
+            val positionChange =
+                getDragDirectionValue(currentPosition) - getDragDirectionValue(previousPosition)
             totalPositionChange += positionChange
 
             val inDirection = abs(totalPositionChange)
diff --git a/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/internal/Elevation.kt b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/internal/Elevation.kt
index 4991e74..0b6c913 100644
--- a/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/internal/Elevation.kt
+++ b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/internal/Elevation.kt
@@ -36,27 +36,28 @@
  * [ElevationDefaults.outgoingAnimationSpecForInteraction] for more details.
  *
  * @param target the [Dp] target elevation for this component, corresponding to the elevation
- * desired for the [to] state.
- * @param from the previous [Interaction] that was used to calculate elevation. `null` if there
- * was no previous [Interaction], such as when the component is in its default state.
+ *   desired for the [to] state.
+ * @param from the previous [Interaction] that was used to calculate elevation. `null` if there was
+ *   no previous [Interaction], such as when the component is in its default state.
  * @param to the [Interaction] that this component is moving to, such as [PressInteraction.Press]
- * when this component is being pressed. `null` if this component is moving back to its default
- * state.
+ *   when this component is being pressed. `null` if this component is moving back to its default
+ *   state.
  */
 internal suspend fun Animatable<Dp, *>.animateElevation(
     target: Dp,
     from: Interaction? = null,
     to: Interaction? = null
 ) {
-    val spec = when {
-        // Moving to a new state
-        to != null -> ElevationDefaults.incomingAnimationSpecForInteraction(to)
-        // Moving to default, from a previous state
-        from != null -> ElevationDefaults.outgoingAnimationSpecForInteraction(from)
-        // Loading the initial state, or moving back to the baseline state from a disabled /
-        // unknown state, so just snap to the final value.
-        else -> null
-    }
+    val spec =
+        when {
+            // Moving to a new state
+            to != null -> ElevationDefaults.incomingAnimationSpecForInteraction(to)
+            // Moving to default, from a previous state
+            from != null -> ElevationDefaults.outgoingAnimationSpecForInteraction(from)
+            // Loading the initial state, or moving back to the baseline state from a disabled /
+            // unknown state, so just snap to the final value.
+            else -> null
+        }
     if (spec != null) animateTo(target, spec) else snapTo(target)
 }
 
@@ -71,8 +72,8 @@
 private object ElevationDefaults {
     /**
      * Returns the [AnimationSpec]s used when animating elevation to [interaction], either from a
-     * previous [Interaction], or from the default state. If [interaction] is unknown, then
-     * returns `null`.
+     * previous [Interaction], or from the default state. If [interaction] is unknown, then returns
+     * `null`.
      *
      * @param interaction the [Interaction] that is being animated to
      */
@@ -105,17 +106,8 @@
 
 private val OutgoingSpecEasing: Easing = CubicBezierEasing(0.40f, 0.00f, 0.60f, 1.00f)
 
-private val DefaultIncomingSpec = TweenSpec<Dp>(
-    durationMillis = 120,
-    easing = FastOutSlowInEasing
-)
+private val DefaultIncomingSpec = TweenSpec<Dp>(durationMillis = 120, easing = FastOutSlowInEasing)
 
-private val DefaultOutgoingSpec = TweenSpec<Dp>(
-    durationMillis = 150,
-    easing = OutgoingSpecEasing
-)
+private val DefaultOutgoingSpec = TweenSpec<Dp>(durationMillis = 150, easing = OutgoingSpecEasing)
 
-private val HoveredOutgoingSpec = TweenSpec<Dp>(
-    durationMillis = 120,
-    easing = OutgoingSpecEasing
-)
+private val HoveredOutgoingSpec = TweenSpec<Dp>(durationMillis = 120, easing = OutgoingSpecEasing)
diff --git a/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/internal/InternalMutatorMutex.kt b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/internal/InternalMutatorMutex.kt
index c4f10de..217e526 100644
--- a/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/internal/InternalMutatorMutex.kt
+++ b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/internal/InternalMutatorMutex.kt
@@ -24,29 +24,33 @@
 import kotlinx.coroutines.sync.Mutex
 import kotlinx.coroutines.sync.withLock
 
-/*** This is an internal copy of androidx.compose.foundation.MutatorMutex with an additional
- * tryMutate method. Do not modify, except for tryMutate. ***/
-
+/**
+ * This is an internal copy of androidx.compose.foundation.MutatorMutex with an additional tryMutate
+ * method. Do not modify, except for tryMutate. **
+ */
 internal expect class InternalAtomicReference<V>(value: V) {
     fun get(): V
+
     fun set(value: V)
+
     fun getAndSet(value: V): V
+
     fun compareAndSet(expect: V, newValue: V): Boolean
 }
 
 /**
  * Mutual exclusion for UI state mutation over time.
  *
- * [mutate] permits interruptible state mutation over time using a standard [MutatePriority].
- * A [InternalMutatorMutex] enforces that only a single writer can be active at a time for a particular
- * state resource. Instead of queueing callers that would acquire the lock like a traditional
- * [Mutex], new attempts to [mutate] the guarded state will either cancel the current mutator or
- * if the current mutator has a higher priority, the new caller will throw [CancellationException].
+ * [mutate] permits interruptible state mutation over time using a standard [MutatePriority]. A
+ * [InternalMutatorMutex] enforces that only a single writer can be active at a time for a
+ * particular state resource. Instead of queueing callers that would acquire the lock like a
+ * traditional [Mutex], new attempts to [mutate] the guarded state will either cancel the current
+ * mutator or if the current mutator has a higher priority, the new caller will throw
+ * [CancellationException].
  *
- * [InternalMutatorMutex] should be used for implementing hoisted state objects that many mutators may
- * want to manipulate over time such that those mutators can coordinate with one another. The
+ * [InternalMutatorMutex] should be used for implementing hoisted state objects that many mutators
+ * may want to manipulate over time such that those mutators can coordinate with one another. The
  * [InternalMutatorMutex] instance should be hidden as an implementation detail. For example:
- *
  */
 @Stable
 internal class InternalMutatorMutex {
@@ -77,14 +81,14 @@
      * If [mutate] is called while another call to [mutate] or [mutateWith] is in progress, their
      * [priority] values are compared. If the new caller has a [priority] equal to or higher than
      * the call in progress, the call in progress will be cancelled, throwing
-     * [CancellationException] and the new caller's [block] will be invoked. If the call in
-     * progress had a higher [priority] than the new caller, the new caller will throw
+     * [CancellationException] and the new caller's [block] will be invoked. If the call in progress
+     * had a higher [priority] than the new caller, the new caller will throw
      * [CancellationException] without invoking [block].
      *
-     * @param priority the priority of this mutation; [MutatePriority.Default] by default.
-     * Higher priority mutations will interrupt lower priority mutations.
+     * @param priority the priority of this mutation; [MutatePriority.Default] by default. Higher
+     *   priority mutations will interrupt lower priority mutations.
      * @param block mutation code to run mutually exclusive with any other call to [mutate],
-     * [mutateWith] or [tryMutate].
+     *   [mutateWith] or [tryMutate].
      */
     suspend fun <R> mutate(
         priority: MutatePriority = MutatePriority.Default,
@@ -107,22 +111,22 @@
      * Enforce that only a single caller may be active at a time.
      *
      * If [mutateWith] is called while another call to [mutate] or [mutateWith] is in progress,
-     * their [priority] values are compared. If the new caller has a [priority] equal to or
-     * higher than the call in progress, the call in progress will be cancelled, throwing
-     * [CancellationException] and the new caller's [block] will be invoked. If the call in
-     * progress had a higher [priority] than the new caller, the new caller will throw
+     * their [priority] values are compared. If the new caller has a [priority] equal to or higher
+     * than the call in progress, the call in progress will be cancelled, throwing
+     * [CancellationException] and the new caller's [block] will be invoked. If the call in progress
+     * had a higher [priority] than the new caller, the new caller will throw
      * [CancellationException] without invoking [block].
      *
-     * This variant of [mutate] calls its [block] with a [receiver], removing the need to create
-     * an additional capturing lambda to invoke it with a receiver object. This can be used to
-     * expose a mutable scope to the provided [block] while leaving the rest of the state object
-     * read-only. For example:
+     * This variant of [mutate] calls its [block] with a [receiver], removing the need to create an
+     * additional capturing lambda to invoke it with a receiver object. This can be used to expose a
+     * mutable scope to the provided [block] while leaving the rest of the state object read-only.
+     * For example:
      *
      * @param receiver the receiver `this` that [block] will be called with
-     * @param priority the priority of this mutation; [MutatePriority.Default] by default.
-     * Higher priority mutations will interrupt lower priority mutations.
+     * @param priority the priority of this mutation; [MutatePriority.Default] by default. Higher
+     *   priority mutations will interrupt lower priority mutations.
      * @param block mutation code to run mutually exclusive with any other call to [mutate],
-     * [mutateWith] or [tryMutate].
+     *   [mutateWith] or [tryMutate].
      */
     suspend fun <T, R> mutateWith(
         receiver: T,
@@ -143,18 +147,17 @@
     }
 
     /**
-     * Attempt to mutate synchronously if there is no other active caller.
-     * If there is no other active caller, the [block] will be executed in a lock. If there is
-     * another active caller, this method will return false, indicating that the active caller
-     * needs to be cancelled through a [mutate] or [mutateWith] call with an equal or higher
-     * mutation priority.
+     * Attempt to mutate synchronously if there is no other active caller. If there is no other
+     * active caller, the [block] will be executed in a lock. If there is another active caller,
+     * this method will return false, indicating that the active caller needs to be cancelled
+     * through a [mutate] or [mutateWith] call with an equal or higher mutation priority.
      *
      * Calls to [mutate] and [mutateWith] will suspend until execution of the [block] has finished.
      *
      * @param block mutation code to run mutually exclusive with any other call to [mutate],
-     * [mutateWith] or [tryMutate].
+     *   [mutateWith] or [tryMutate].
      * @return true if the [block] was executed, false if there was another active caller and the
-     * [block] was not executed.
+     *   [block] was not executed.
      */
     fun tryMutate(block: () -> Unit): Boolean {
         val didLock = mutex.tryLock()
diff --git a/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/internal/MappedInteractionSource.kt b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/internal/MappedInteractionSource.kt
index 108ab41..2f38481 100644
--- a/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/internal/MappedInteractionSource.kt
+++ b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/internal/MappedInteractionSource.kt
@@ -29,35 +29,35 @@
     underlyingInteractionSource: InteractionSource,
     private val delta: Offset
 ) : InteractionSource {
-    private val mappedPresses =
-        mutableMapOf<PressInteraction.Press, PressInteraction.Press>()
+    private val mappedPresses = mutableMapOf<PressInteraction.Press, PressInteraction.Press>()
 
-    override val interactions = underlyingInteractionSource.interactions.map { interaction ->
-        when (interaction) {
-            is PressInteraction.Press -> {
-                val mappedPress = mapPress(interaction)
-                mappedPresses[interaction] = mappedPress
-                mappedPress
-            }
-            is PressInteraction.Cancel -> {
-                val mappedPress = mappedPresses.remove(interaction.press)
-                if (mappedPress == null) {
-                    interaction
-                } else {
-                    PressInteraction.Cancel(mappedPress)
+    override val interactions =
+        underlyingInteractionSource.interactions.map { interaction ->
+            when (interaction) {
+                is PressInteraction.Press -> {
+                    val mappedPress = mapPress(interaction)
+                    mappedPresses[interaction] = mappedPress
+                    mappedPress
                 }
-            }
-            is PressInteraction.Release -> {
-                val mappedPress = mappedPresses.remove(interaction.press)
-                if (mappedPress == null) {
-                    interaction
-                } else {
-                    PressInteraction.Release(mappedPress)
+                is PressInteraction.Cancel -> {
+                    val mappedPress = mappedPresses.remove(interaction.press)
+                    if (mappedPress == null) {
+                        interaction
+                    } else {
+                        PressInteraction.Cancel(mappedPress)
+                    }
                 }
+                is PressInteraction.Release -> {
+                    val mappedPress = mappedPresses.remove(interaction.press)
+                    if (mappedPress == null) {
+                        interaction
+                    } else {
+                        PressInteraction.Release(mappedPress)
+                    }
+                }
+                else -> interaction
             }
-            else -> interaction
         }
-    }
 
     private fun mapPress(press: PressInteraction.Press): PressInteraction.Press =
         PressInteraction.Press(press.pressPosition - delta)
diff --git a/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/internal/MenuPosition.kt b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/internal/MenuPosition.kt
index 6f9cc5e..46c8c6a 100644
--- a/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/internal/MenuPosition.kt
+++ b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/internal/MenuPosition.kt
@@ -157,8 +157,7 @@
         )
 
     /**
-     * Returns a [MenuPosition.Vertical] which aligns the top of the menu to the top of the
-     * window.
+     * Returns a [MenuPosition.Vertical] which aligns the top of the menu to the top of the window.
      *
      * The resulting y position will be coerced so that the menu remains within the area inside the
      * given [margin] from the top and bottom edges of the window.
@@ -204,16 +203,18 @@
             menuWidth: Int,
             layoutDirection: LayoutDirection,
         ): Int {
-            val anchorAlignmentOffset = anchorAlignment.align(
-                size = 0,
-                space = anchorBounds.width,
-                layoutDirection = layoutDirection,
-            )
-            val menuAlignmentOffset = -menuAlignment.align(
-                size = 0,
-                space = menuWidth,
-                layoutDirection,
-            )
+            val anchorAlignmentOffset =
+                anchorAlignment.align(
+                    size = 0,
+                    space = anchorBounds.width,
+                    layoutDirection = layoutDirection,
+                )
+            val menuAlignmentOffset =
+                -menuAlignment.align(
+                    size = 0,
+                    space = menuWidth,
+                    layoutDirection,
+                )
             val resolvedOffset = if (layoutDirection == LayoutDirection.Ltr) offset else -offset
             return anchorBounds.left + anchorAlignmentOffset + menuAlignmentOffset + resolvedOffset
         }
@@ -234,14 +235,16 @@
             windowSize: IntSize,
             menuHeight: Int,
         ): Int {
-            val anchorAlignmentOffset = anchorAlignment.align(
-                size = 0,
-                space = anchorBounds.height,
-            )
-            val menuAlignmentOffset = -menuAlignment.align(
-                size = 0,
-                space = menuHeight,
-            )
+            val anchorAlignmentOffset =
+                anchorAlignment.align(
+                    size = 0,
+                    space = anchorBounds.height,
+                )
+            val menuAlignmentOffset =
+                -menuAlignment.align(
+                    size = 0,
+                    space = menuHeight,
+                )
             return anchorBounds.top + anchorAlignmentOffset + menuAlignmentOffset + offset
         }
     }
@@ -250,8 +253,8 @@
 @Immutable
 internal object WindowAlignmentMarginPosition {
     /**
-     * A [MenuPosition.Horizontal] which horizontally aligns the menu within the window according
-     * to the given [alignment].
+     * A [MenuPosition.Horizontal] which horizontally aligns the menu within the window according to
+     * the given [alignment].
      *
      * The resulting x position will be coerced so that the menu remains within the area inside the
      * given [margin] from the left and right edges of the window. If this is not possible, i.e.,
@@ -275,18 +278,19 @@
                     layoutDirection = layoutDirection,
                 )
             }
-            val x = alignment.align(
-                size = menuWidth,
-                space = windowSize.width,
-                layoutDirection = layoutDirection,
-            )
+            val x =
+                alignment.align(
+                    size = menuWidth,
+                    space = windowSize.width,
+                    layoutDirection = layoutDirection,
+                )
             return x.coerceIn(margin, windowSize.width - margin - menuWidth)
         }
     }
 
     /**
-     * A [MenuPosition.Vertical] which vertically aligns the menu within the window according to
-     * the given [alignment].
+     * A [MenuPosition.Vertical] which vertically aligns the menu within the window according to the
+     * given [alignment].
      *
      * The resulting y position will be coerced so that the menu remains within the area inside the
      * given [margin] from the top and bottom edges of the window. If this is not possible, i.e.,
@@ -308,18 +312,17 @@
                     space = windowSize.height,
                 )
             }
-            val y = alignment.align(
-                size = menuHeight,
-                space = windowSize.height,
-            )
+            val y =
+                alignment.align(
+                    size = menuHeight,
+                    space = windowSize.height,
+                )
             return y.coerceIn(margin, windowSize.height - margin - menuHeight)
         }
     }
 }
 
-/**
- * Calculates the position of a Material [DropdownMenu].
- */
+/** Calculates the position of a Material [DropdownMenu]. */
 @Immutable
 internal data class DropdownMenuPositionProvider(
     val contentOffset: DpOffset,
@@ -361,50 +364,58 @@
         layoutDirection: LayoutDirection,
         popupContentSize: IntSize
     ): IntOffset {
-        val xCandidates = listOf(
-            startToAnchorStart,
-            endToAnchorEnd,
-            if (anchorBounds.center.x < windowSize.width / 2) {
-                leftToWindowLeft
-            } else {
-                rightToWindowRight
-            }
-        )
+        val xCandidates =
+            listOf(
+                startToAnchorStart,
+                endToAnchorEnd,
+                if (anchorBounds.center.x < windowSize.width / 2) {
+                    leftToWindowLeft
+                } else {
+                    rightToWindowRight
+                }
+            )
         var x = 0
         for (index in xCandidates.indices) {
-            val xCandidate = xCandidates[index].position(
-                anchorBounds = anchorBounds,
-                windowSize = windowSize,
-                menuWidth = popupContentSize.width,
-                layoutDirection = layoutDirection
-            )
-            if (index == xCandidates.lastIndex ||
-                (xCandidate >= 0 && xCandidate + popupContentSize.width <= windowSize.width)) {
+            val xCandidate =
+                xCandidates[index].position(
+                    anchorBounds = anchorBounds,
+                    windowSize = windowSize,
+                    menuWidth = popupContentSize.width,
+                    layoutDirection = layoutDirection
+                )
+            if (
+                index == xCandidates.lastIndex ||
+                    (xCandidate >= 0 && xCandidate + popupContentSize.width <= windowSize.width)
+            ) {
                 x = xCandidate
                 break
             }
         }
 
-        val yCandidates = listOf(
-            topToAnchorBottom,
-            bottomToAnchorTop,
-            centerToAnchorTop,
-            if (anchorBounds.center.y < windowSize.height / 2) {
-                topToWindowTop
-            } else {
-                bottomToWindowBottom
-            }
-        )
+        val yCandidates =
+            listOf(
+                topToAnchorBottom,
+                bottomToAnchorTop,
+                centerToAnchorTop,
+                if (anchorBounds.center.y < windowSize.height / 2) {
+                    topToWindowTop
+                } else {
+                    bottomToWindowBottom
+                }
+            )
         var y = 0
         for (index in yCandidates.indices) {
-            val yCandidate = yCandidates[index].position(
-                anchorBounds = anchorBounds,
-                windowSize = windowSize,
-                menuHeight = popupContentSize.height
-            )
-            if (index == yCandidates.lastIndex ||
-                (yCandidate >= verticalMargin &&
-                    yCandidate + popupContentSize.height <= windowSize.height - verticalMargin)) {
+            val yCandidate =
+                yCandidates[index].position(
+                    anchorBounds = anchorBounds,
+                    windowSize = windowSize,
+                    menuHeight = popupContentSize.height
+                )
+            if (
+                index == yCandidates.lastIndex ||
+                    (yCandidate >= verticalMargin &&
+                        yCandidate + popupContentSize.height <= windowSize.height - verticalMargin)
+            ) {
                 y = yCandidate
                 break
             }
@@ -412,8 +423,8 @@
 
         val menuOffset = IntOffset(x, y)
         onPositionCalculated(
-            /* anchorBounds = */anchorBounds,
-            /* menuBounds = */IntRect(offset = menuOffset, size = popupContentSize)
+            /* anchorBounds = */ anchorBounds,
+            /* menuBounds = */ IntRect(offset = menuOffset, size = popupContentSize)
         )
         return menuOffset
     }
diff --git a/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/internal/MutableWindowInsets.kt b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/internal/MutableWindowInsets.kt
index f7da7bc..d59d962 100644
--- a/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/internal/MutableWindowInsets.kt
+++ b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/internal/MutableWindowInsets.kt
@@ -24,25 +24,27 @@
 import androidx.compose.ui.unit.LayoutDirection
 
 /**
- * A [WindowInsets] whose values can change without changing the instance. This is useful
- * to avoid recomposition when [WindowInsets] can change.
+ * A [WindowInsets] whose values can change without changing the instance. This is useful to avoid
+ * recomposition when [WindowInsets] can change.
  *
  * Copied from [androidx.compose.foundation.layout.MutableWindowInsets], which is marked as
  * experimental and thus cannot be used cross-module.
  */
-internal class MutableWindowInsets(
-    initialInsets: WindowInsets = WindowInsets(0, 0, 0, 0)
-) : WindowInsets {
+internal class MutableWindowInsets(initialInsets: WindowInsets = WindowInsets(0, 0, 0, 0)) :
+    WindowInsets {
     /**
-     * The [WindowInsets] that are used for [left][getLeft], [top][getTop], [right][getRight],
-     * and [bottom][getBottom] values.
+     * The [WindowInsets] that are used for [left][getLeft], [top][getTop], [right][getRight], and
+     * [bottom][getBottom] values.
      */
     var insets by mutableStateOf(initialInsets)
 
     override fun getLeft(density: Density, layoutDirection: LayoutDirection): Int =
         insets.getLeft(density, layoutDirection)
+
     override fun getTop(density: Density): Int = insets.getTop(density)
+
     override fun getRight(density: Density, layoutDirection: LayoutDirection): Int =
         insets.getRight(density, layoutDirection)
+
     override fun getBottom(density: Density): Int = insets.getBottom(density)
 }
diff --git a/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/internal/ProvideContentColorTextStyle.kt b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/internal/ProvideContentColorTextStyle.kt
index 3219f18..dad0c48 100644
--- a/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/internal/ProvideContentColorTextStyle.kt
+++ b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/internal/ProvideContentColorTextStyle.kt
@@ -26,8 +26,8 @@
 /**
  * ProvideContentColorTextStyle
  *
- * A convenience method to provide values to both LocalContentColor and LocalTextStyle in
- * one call. This is less expensive than nesting calls to CompositionLocalProvider.
+ * A convenience method to provide values to both LocalContentColor and LocalTextStyle in one call.
+ * This is less expensive than nesting calls to CompositionLocalProvider.
  *
  * Text styles will be merged with the current value of LocalTextStyle.
  */
diff --git a/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/internal/Strings.kt b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/internal/Strings.kt
index 02e0181..f9b7962 100644
--- a/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/internal/Strings.kt
+++ b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/internal/Strings.kt
@@ -91,9 +91,7 @@
     }
 }
 
-@Composable
-@ReadOnlyComposable
-internal expect fun getString(string: Strings): String
+@Composable @ReadOnlyComposable internal expect fun getString(string: Strings): String
 
 @Composable
 @ReadOnlyComposable
diff --git a/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/internal/TextFieldImpl.kt b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/internal/TextFieldImpl.kt
index d3f51de..adda9d9 100644
--- a/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/internal/TextFieldImpl.kt
+++ b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/internal/TextFieldImpl.kt
@@ -69,12 +69,11 @@
 import androidx.compose.ui.unit.dp
 
 internal enum class TextFieldType {
-    Filled, Outlined
+    Filled,
+    Outlined
 }
 
-/**
- * Implementation of the [TextField] and [OutlinedTextField]
- */
+/** Implementation of the [TextField] and [OutlinedTextField] */
 @Composable
 internal fun CommonDecorationBox(
     type: TextFieldType,
@@ -96,16 +95,20 @@
     colors: TextFieldColors,
     container: @Composable () -> Unit,
 ) {
-    val transformedText = remember(value, visualTransformation) {
-        visualTransformation.filter(AnnotatedString(value))
-    }.text.text
+    val transformedText =
+        remember(value, visualTransformation) {
+                visualTransformation.filter(AnnotatedString(value))
+            }
+            .text
+            .text
 
     val isFocused = interactionSource.collectIsFocusedAsState().value
-    val inputState = when {
-        isFocused -> InputPhase.Focused
-        transformedText.isEmpty() -> InputPhase.UnfocusedEmpty
-        else -> InputPhase.UnfocusedNotEmpty
-    }
+    val inputState =
+        when {
+            isFocused -> InputPhase.Focused
+            transformedText.isEmpty() -> InputPhase.UnfocusedEmpty
+            else -> InputPhase.UnfocusedNotEmpty
+        }
 
     val labelColor = colors.labelColor(enabled, isError, isFocused)
 
@@ -118,39 +121,40 @@
 
     TextFieldTransitionScope(
         inputState = inputState,
-        focusedLabelTextStyleColor = with(bodySmall.color) {
-            if (overrideLabelTextStyleColor) this.takeOrElse { labelColor } else this
-        },
-        unfocusedLabelTextStyleColor = with(bodyLarge.color) {
-            if (overrideLabelTextStyleColor) this.takeOrElse { labelColor } else this
-        },
+        focusedLabelTextStyleColor =
+            with(bodySmall.color) {
+                if (overrideLabelTextStyleColor) this.takeOrElse { labelColor } else this
+            },
+        unfocusedLabelTextStyleColor =
+            with(bodyLarge.color) {
+                if (overrideLabelTextStyleColor) this.takeOrElse { labelColor } else this
+            },
         labelColor = labelColor,
         showLabel = label != null,
-    ) { labelProgress, labelTextStyleColor, labelContentColor, placeholderAlpha,
-        prefixSuffixAlpha ->
+    ) { labelProgress, labelTextStyleColor, labelContentColor, placeholderAlpha, prefixSuffixAlpha
+        ->
         val labelProgressValue = labelProgress.value
-        val decoratedLabel: @Composable (() -> Unit)? = label?.let {
-            @Composable {
-                val labelTextStyle =
-                    lerp(bodyLarge, bodySmall, labelProgressValue).let { textStyle ->
-                        if (overrideLabelTextStyleColor) {
-                            textStyle.copy(color = labelTextStyleColor.value)
-                        } else {
-                            textStyle
+        val decoratedLabel: @Composable (() -> Unit)? =
+            label?.let {
+                @Composable {
+                    val labelTextStyle =
+                        lerp(bodyLarge, bodySmall, labelProgressValue).let { textStyle ->
+                            if (overrideLabelTextStyleColor) {
+                                textStyle.copy(color = labelTextStyleColor.value)
+                            } else {
+                                textStyle
+                            }
                         }
-                    }
-                Decoration(labelContentColor.value, labelTextStyle, it)
+                    Decoration(labelContentColor.value, labelTextStyle, it)
+                }
             }
-        }
 
         // Transparent components interfere with Talkback (b/261061240), so if any components below
         // have alpha == 0, we set the component to null instead.
 
         val placeholderColor = colors.placeholderColor(enabled, isError, isFocused)
         val showPlaceholder by remember {
-            derivedStateOf(structuralEqualityPolicy()) {
-                placeholderAlpha.value > 0f
-            }
+            derivedStateOf(structuralEqualityPolicy()) { placeholderAlpha.value > 0f }
         }
         val decoratedPlaceholder: @Composable ((Modifier) -> Unit)? =
             if (placeholder != null && transformedText.isEmpty() && showPlaceholder) {
@@ -167,9 +171,7 @@
 
         val prefixColor = colors.prefixColor(enabled, isError, isFocused)
         val showPrefixSuffix by remember {
-            derivedStateOf(structuralEqualityPolicy()) {
-                prefixSuffixAlpha.value > 0f
-            }
+            derivedStateOf(structuralEqualityPolicy()) { prefixSuffixAlpha.value > 0f }
         }
         val decoratedPrefix: @Composable (() -> Unit)? =
             if (prefix != null && showPrefixSuffix) {
@@ -199,32 +201,33 @@
             } else null
 
         val leadingIconColor = colors.leadingIconColor(enabled, isError, isFocused)
-        val decoratedLeading: @Composable (() -> Unit)? = leadingIcon?.let {
-            @Composable {
-                Decoration(contentColor = leadingIconColor, content = it)
+        val decoratedLeading: @Composable (() -> Unit)? =
+            leadingIcon?.let {
+                @Composable { Decoration(contentColor = leadingIconColor, content = it) }
             }
-        }
 
         val trailingIconColor = colors.trailingIconColor(enabled, isError, isFocused)
-        val decoratedTrailing: @Composable (() -> Unit)? = trailingIcon?.let {
-            @Composable {
-                Decoration(contentColor = trailingIconColor, content = it)
+        val decoratedTrailing: @Composable (() -> Unit)? =
+            trailingIcon?.let {
+                @Composable { Decoration(contentColor = trailingIconColor, content = it) }
             }
-        }
 
-        val supportingTextColor =
-            colors.supportingTextColor(enabled, isError, isFocused)
-        val decoratedSupporting: @Composable (() -> Unit)? = supportingText?.let {
-            @Composable {
-                Decoration(contentColor = supportingTextColor, textStyle = bodySmall, content = it)
+        val supportingTextColor = colors.supportingTextColor(enabled, isError, isFocused)
+        val decoratedSupporting: @Composable (() -> Unit)? =
+            supportingText?.let {
+                @Composable {
+                    Decoration(
+                        contentColor = supportingTextColor,
+                        textStyle = bodySmall,
+                        content = it
+                    )
+                }
             }
-        }
 
         when (type) {
             TextFieldType.Filled -> {
                 val containerWithId: @Composable () -> Unit = {
-                    Box(Modifier.layoutId(ContainerId),
-                        propagateMinConstraints = true) {
+                    Box(Modifier.layoutId(ContainerId), propagateMinConstraints = true) {
                         container()
                     }
                 }
@@ -251,8 +254,7 @@
                 val labelSize = remember { mutableStateOf(Size.Zero) }
                 val borderContainerWithId: @Composable () -> Unit = {
                     Box(
-                        Modifier
-                            .layoutId(ContainerId)
+                        Modifier.layoutId(ContainerId)
                             .outlineCutout(labelSize::value, contentPadding),
                         propagateMinConstraints = true
                     ) {
@@ -274,8 +276,9 @@
                     onLabelMeasured = {
                         val labelWidth = it.width * labelProgressValue
                         val labelHeight = it.height * labelProgressValue
-                        if (labelSize.value.width != labelWidth ||
-                            labelSize.value.height != labelHeight
+                        if (
+                            labelSize.value.width != labelWidth ||
+                                labelSize.value.height != labelHeight
                         ) {
                             labelSize.value = Size(labelWidth, labelHeight)
                         }
@@ -290,24 +293,15 @@
     }
 }
 
-/**
- * Decorates [content] with [contentColor] and [textStyle].
- */
+/** Decorates [content] with [contentColor] and [textStyle]. */
 @Composable
-private fun Decoration(
-    contentColor: Color,
-    textStyle: TextStyle,
-    content: @Composable () -> Unit
-) = ProvideContentColorTextStyle(contentColor, textStyle, content)
+private fun Decoration(contentColor: Color, textStyle: TextStyle, content: @Composable () -> Unit) =
+    ProvideContentColorTextStyle(contentColor, textStyle, content)
 
-/**
- * Decorates [content] with [contentColor].
- */
+/** Decorates [content] with [contentColor]. */
 @Composable
-private fun Decoration(
-    contentColor: Color,
-    content: @Composable () -> Unit
-) = CompositionLocalProvider(LocalContentColor provides contentColor, content = content)
+private fun Decoration(contentColor: Color, content: @Composable () -> Unit) =
+    CompositionLocalProvider(LocalContentColor provides contentColor, content = content)
 
 // Developers need to handle invalid input manually. But since we don't provide an error message
 // slot API, we can set the default error message in case developers forget about it.
@@ -317,20 +311,20 @@
 ): Modifier = if (isError) semantics { error(defaultErrorMessage) } else this
 
 /**
- *  Replacement for Modifier.background which takes color as a State to avoid
- *  recomposition while animating.
+ * Replacement for Modifier.background which takes color as a State to avoid recomposition while
+ * animating.
  */
 internal fun Modifier.textFieldBackground(
     color: ColorProducer,
     shape: Shape,
-): Modifier = this.drawWithCache {
-    val outline = shape.createOutline(size, layoutDirection, this)
-    onDrawBehind {
-        drawOutline(outline, color = color())
+): Modifier =
+    this.drawWithCache {
+        val outline = shape.createOutline(size, layoutDirection, this)
+        onDrawBehind { drawOutline(outline, color = color()) }
     }
-}
 
 internal fun widthOrZero(placeable: Placeable?) = placeable?.width ?: 0
+
 internal fun heightOrZero(placeable: Placeable?) = placeable?.height ?: 0
 
 @Composable
@@ -340,85 +334,93 @@
     unfocusedLabelTextStyleColor: Color,
     labelColor: Color,
     showLabel: Boolean,
-    content: @Composable (
-        labelProgress: State<Float>,
-        labelTextStyleColor: State<Color>,
-        labelContentColor: State<Color>,
-        placeholderOpacity: State<Float>,
-        prefixSuffixOpacity: State<Float>,
-    ) -> Unit
+    content:
+        @Composable
+        (
+            labelProgress: State<Float>,
+            labelTextStyleColor: State<Color>,
+            labelContentColor: State<Color>,
+            placeholderOpacity: State<Float>,
+            prefixSuffixOpacity: State<Float>,
+        ) -> Unit
 ) {
     // Transitions from/to InputPhase.Focused are the most critical in the transition below.
     // UnfocusedEmpty <-> UnfocusedNotEmpty are needed when a single state is used to control
     // multiple text fields.
     val transition = updateTransition(inputState, label = "TextFieldInputState")
 
-    val labelProgress = transition.animateFloat(
-        label = "LabelProgress",
-        transitionSpec = { tween(durationMillis = TextFieldAnimationDuration) }
-    ) {
-        when (it) {
-            InputPhase.Focused -> 1f
-            InputPhase.UnfocusedEmpty -> 0f
-            InputPhase.UnfocusedNotEmpty -> 1f
-        }
-    }
-
-    val placeholderOpacity = transition.animateFloat(
-        label = "PlaceholderOpacity",
-        transitionSpec = {
-            if (InputPhase.Focused isTransitioningTo InputPhase.UnfocusedEmpty) {
-                tween(
-                    durationMillis = PlaceholderAnimationDelayOrDuration,
-                    easing = LinearEasing
-                )
-            } else if (InputPhase.UnfocusedEmpty isTransitioningTo InputPhase.Focused ||
-                InputPhase.UnfocusedNotEmpty isTransitioningTo InputPhase.UnfocusedEmpty
-            ) {
-                tween(
-                    durationMillis = PlaceholderAnimationDuration,
-                    delayMillis = PlaceholderAnimationDelayOrDuration,
-                    easing = LinearEasing
-                )
-            } else {
-                spring()
+    val labelProgress =
+        transition.animateFloat(
+            label = "LabelProgress",
+            transitionSpec = { tween(durationMillis = TextFieldAnimationDuration) }
+        ) {
+            when (it) {
+                InputPhase.Focused -> 1f
+                InputPhase.UnfocusedEmpty -> 0f
+                InputPhase.UnfocusedNotEmpty -> 1f
             }
         }
-    ) {
-        when (it) {
-            InputPhase.Focused -> 1f
-            InputPhase.UnfocusedEmpty -> if (showLabel) 0f else 1f
-            InputPhase.UnfocusedNotEmpty -> 0f
-        }
-    }
 
-    val prefixSuffixOpacity = transition.animateFloat(
-        label = "PrefixSuffixOpacity",
-        transitionSpec = { tween(durationMillis = TextFieldAnimationDuration) }
-    ) {
-        when (it) {
-            InputPhase.Focused -> 1f
-            InputPhase.UnfocusedEmpty -> if (showLabel) 0f else 1f
-            InputPhase.UnfocusedNotEmpty -> 1f
+    val placeholderOpacity =
+        transition.animateFloat(
+            label = "PlaceholderOpacity",
+            transitionSpec = {
+                if (InputPhase.Focused isTransitioningTo InputPhase.UnfocusedEmpty) {
+                    tween(
+                        durationMillis = PlaceholderAnimationDelayOrDuration,
+                        easing = LinearEasing
+                    )
+                } else if (
+                    InputPhase.UnfocusedEmpty isTransitioningTo InputPhase.Focused ||
+                        InputPhase.UnfocusedNotEmpty isTransitioningTo InputPhase.UnfocusedEmpty
+                ) {
+                    tween(
+                        durationMillis = PlaceholderAnimationDuration,
+                        delayMillis = PlaceholderAnimationDelayOrDuration,
+                        easing = LinearEasing
+                    )
+                } else {
+                    spring()
+                }
+            }
+        ) {
+            when (it) {
+                InputPhase.Focused -> 1f
+                InputPhase.UnfocusedEmpty -> if (showLabel) 0f else 1f
+                InputPhase.UnfocusedNotEmpty -> 0f
+            }
         }
-    }
 
-    val labelTextStyleColor = transition.animateColor(
-        transitionSpec = { tween(durationMillis = TextFieldAnimationDuration) },
-        label = "LabelTextStyleColor"
-    ) {
-        when (it) {
-            InputPhase.Focused -> focusedLabelTextStyleColor
-            else -> unfocusedLabelTextStyleColor
+    val prefixSuffixOpacity =
+        transition.animateFloat(
+            label = "PrefixSuffixOpacity",
+            transitionSpec = { tween(durationMillis = TextFieldAnimationDuration) }
+        ) {
+            when (it) {
+                InputPhase.Focused -> 1f
+                InputPhase.UnfocusedEmpty -> if (showLabel) 0f else 1f
+                InputPhase.UnfocusedNotEmpty -> 1f
+            }
         }
-    }
+
+    val labelTextStyleColor =
+        transition.animateColor(
+            transitionSpec = { tween(durationMillis = TextFieldAnimationDuration) },
+            label = "LabelTextStyleColor"
+        ) {
+            when (it) {
+                InputPhase.Focused -> focusedLabelTextStyleColor
+                else -> unfocusedLabelTextStyleColor
+            }
+        }
 
     @Suppress("UnusedTransitionTargetStateParameter")
-    val labelContentColor = transition.animateColor(
-        transitionSpec = { tween(durationMillis = TextFieldAnimationDuration) },
-        label = "LabelContentColor",
-        targetValueByState = { labelColor }
-    )
+    val labelContentColor =
+        transition.animateColor(
+            transitionSpec = { tween(durationMillis = TextFieldAnimationDuration) },
+            label = "LabelContentColor",
+            targetValueByState = { labelColor }
+        )
 
     content(
         labelProgress,
@@ -439,25 +441,25 @@
     unfocusedBorderThickness: Dp
 ): State<BorderStroke> {
     val targetColor = colors.indicatorColor(enabled, isError, focused)
-    val indicatorColor = if (enabled) {
-        animateColorAsState(targetColor, tween(durationMillis = TextFieldAnimationDuration))
-    } else {
-        rememberUpdatedState(targetColor)
-    }
+    val indicatorColor =
+        if (enabled) {
+            animateColorAsState(targetColor, tween(durationMillis = TextFieldAnimationDuration))
+        } else {
+            rememberUpdatedState(targetColor)
+        }
 
-    val thickness = if (enabled) {
-        val targetThickness = if (focused) focusedBorderThickness else unfocusedBorderThickness
-        animateDpAsState(targetThickness, tween(durationMillis = TextFieldAnimationDuration))
-    } else {
-        rememberUpdatedState(unfocusedBorderThickness)
-    }
+    val thickness =
+        if (enabled) {
+            val targetThickness = if (focused) focusedBorderThickness else unfocusedBorderThickness
+            animateDpAsState(targetThickness, tween(durationMillis = TextFieldAnimationDuration))
+        } else {
+            rememberUpdatedState(unfocusedBorderThickness)
+        }
 
     return rememberUpdatedState(BorderStroke(thickness.value, indicatorColor.value))
 }
 
-/**
- * An internal state used to animate a label and an indicator.
- */
+/** An internal state used to animate a label and an indicator. */
 private enum class InputPhase {
     // Text field is focused
     Focused,
diff --git a/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/pulltorefresh/PullToRefresh.kt b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/pulltorefresh/PullToRefresh.kt
index 373b1da..38c0f19 100644
--- a/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/pulltorefresh/PullToRefresh.kt
+++ b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/pulltorefresh/PullToRefresh.kt
@@ -31,7 +31,6 @@
 import androidx.compose.foundation.layout.size
 import androidx.compose.foundation.lazy.LazyColumn
 import androidx.compose.foundation.shape.CircleShape
-import androidx.compose.foundation.verticalScroll
 import androidx.compose.material3.CircularProgressIndicator
 import androidx.compose.material3.ExperimentalMaterial3Api
 import androidx.compose.material3.MaterialTheme
@@ -89,30 +88,33 @@
 // TODO: Link to Material design specs when available.
 /**
  * [PullToRefreshBox] is a container that expects a scrollable layout as content and adds gesture
- * support for manually refreshing when the user swipes downward at the beginning of the content.
- * By default, it uses [PullToRefreshDefaults.Indicator] as the refresh indicator.
+ * support for manually refreshing when the user swipes downward at the beginning of the content. By
+ * default, it uses [PullToRefreshDefaults.Indicator] as the refresh indicator.
  *
  * @sample androidx.compose.material3.samples.PullToRefreshSample
  *
  * View models can be used as source as truth as shown in
+ *
  * @sample androidx.compose.material3.samples.PullToRefreshViewModelSample
  *
  * A custom state implementation can be initialized like this
+ *
  * @sample androidx.compose.material3.samples.PullToRefreshSampleCustomState
  *
  * Scaling behavior can be implemented like this
+ *
  * @sample androidx.compose.material3.samples.PullToRefreshScalingSample
  *
  * @param isRefreshing whether a refresh is occurring
- * @param onRefresh callback invoked when the user gesture crosses the threshold, thereby
- * requesting a refresh.
+ * @param onRefresh callback invoked when the user gesture crosses the threshold, thereby requesting
+ *   a refresh.
  * @param modifier the [Modifier] to be applied to this container
  * @param state the state that keeps track of distance pulled
  * @param contentAlignment The default alignment inside the Box.
- * @param indicator the indicator that will be drawn on top of the content when the user begins
- * a pull or a refresh is occurring
+ * @param indicator the indicator that will be drawn on top of the content when the user begins a
+ *   pull or a refresh is occurring
  * @param content the content of the pull refresh container, typically a scrollable layout such as
- * [LazyColumn] or a layout using [Modifier.verticalScroll]
+ *   [LazyColumn] or a layout using [Modifier.verticalScroll]
  */
 @Composable
 @ExperimentalMaterial3Api
@@ -132,11 +134,7 @@
     content: @Composable BoxScope.() -> Unit
 ) {
     Box(
-        modifier.pullToRefresh(
-            state = state,
-            isRefreshing = isRefreshing,
-            onRefresh = onRefresh
-        ),
+        modifier.pullToRefresh(state = state, isRefreshing = isRefreshing, onRefresh = onRefresh),
         contentAlignment = contentAlignment
     ) {
         content()
@@ -149,14 +147,14 @@
  * pull-to-refresh indicator, useful when implementing custom indicators.
  * [PullToRefreshDefaults.Indicator] applies this automatically.
  *
- *  @param state the state of this modifier, will use `state.distanceFraction` and [threshold]
- *  to calculate the offset
- *  @param isRefreshing whether a refresh is occurring
- *  @param threshold how much the indicator can be pulled down before a refresh
- *  is triggered on release
- *  @param shape the [Shape] of this indicator
- *  @param containerColor the container color of this indicator
- *  @param elevation the elevation for the indicator
+ * @param state the state of this modifier, will use `state.distanceFraction` and [threshold] to
+ *   calculate the offset
+ * @param isRefreshing whether a refresh is occurring
+ * @param threshold how much the indicator can be pulled down before a refresh is triggered on
+ *   release
+ * @param shape the [Shape] of this indicator
+ * @param containerColor the container color of this indicator
+ * @param elevation the elevation for the indicator
  */
 @ExperimentalMaterial3Api
 fun Modifier.pullToRefreshIndicator(
@@ -166,37 +164,36 @@
     shape: Shape = PullToRefreshDefaults.shape,
     containerColor: Color = Color.Unspecified,
     elevation: Dp = PullToRefreshDefaults.Elevation,
-): Modifier = this
-    .size(SpinnerContainerSize)
-    .drawWithContent {
-        clipRect(
-            top = 0f,
-            left = -Float.MAX_VALUE,
-            right = Float.MAX_VALUE,
-            bottom = Float.MAX_VALUE
-        ) {
-            this@drawWithContent.drawContent()
+): Modifier =
+    this.size(SpinnerContainerSize)
+        .drawWithContent {
+            clipRect(
+                top = 0f,
+                left = -Float.MAX_VALUE,
+                right = Float.MAX_VALUE,
+                bottom = Float.MAX_VALUE
+            ) {
+                this@drawWithContent.drawContent()
+            }
         }
-    }
-    .graphicsLayer {
-        val showElevation = state.distanceFraction > 0f || isRefreshing
-        translationY = state.distanceFraction * threshold.roundToPx() - size.height
-        shadowElevation = if (showElevation) elevation.toPx() else 0f
-        this.shape = shape
-        clip = true
-    }
-    .background(color = containerColor, shape = shape)
+        .graphicsLayer {
+            val showElevation = state.distanceFraction > 0f || isRefreshing
+            translationY = state.distanceFraction * threshold.roundToPx() - size.height
+            shadowElevation = if (showElevation) elevation.toPx() else 0f
+            this.shape = shape
+            clip = true
+        }
+        .background(color = containerColor, shape = shape)
 
 /**
- * A Modifier that adds nested scroll to a container to support a pull-to-refresh gesture. When
- * the user pulls a distance greater than [threshold] and releases the gesture, [onRefresh] is
- * invoked. [PullToRefreshBox] applies this automatically.
+ * A Modifier that adds nested scroll to a container to support a pull-to-refresh gesture. When the
+ * user pulls a distance greater than [threshold] and releases the gesture, [onRefresh] is invoked.
+ * [PullToRefreshBox] applies this automatically.
  *
  * @param isRefreshing whether a refresh is occurring or not, if there is no gesture in progress
- * when isRefreshing is false the `state.distanceFraction` will animate to 0f,
- * otherwise it will animate to 1f
+ *   when isRefreshing is false the `state.distanceFraction` will animate to 0f, otherwise it will
+ *   animate to 1f
  * @param state state that keeps track of the distance pulled
- *
  * @param enabled whether nested scroll events should be consumed by this modifier
  * @param threshold how much distance can be scrolled down before [onRefresh] is invoked
  * @param onRefresh callback that is invoked when the distance pulled is greater than [threshold]
@@ -208,13 +205,15 @@
     enabled: Boolean = true,
     threshold: Dp = PullToRefreshDefaults.PositionalThreshold,
     onRefresh: () -> Unit,
-): Modifier = this then PullToRefreshElement(
-    state = state,
-    isRefreshing = isRefreshing,
-    enabled = enabled,
-    onRefresh = onRefresh,
-    threshold = threshold
-)
+): Modifier =
+    this then
+        PullToRefreshElement(
+            state = state,
+            isRefreshing = isRefreshing,
+            enabled = enabled,
+            onRefresh = onRefresh,
+            threshold = threshold
+        )
 
 @OptIn(ExperimentalMaterial3Api::class)
 internal data class PullToRefreshElement(
@@ -224,13 +223,14 @@
     val state: PullToRefreshState,
     val threshold: Dp,
 ) : ModifierNodeElement<PullToRefreshModifierNode>() {
-    override fun create() = PullToRefreshModifierNode(
-        isRefreshing = isRefreshing,
-        onRefresh = onRefresh,
-        enabled = enabled,
-        state = state,
-        threshold = threshold
-    )
+    override fun create() =
+        PullToRefreshModifierNode(
+            isRefreshing = isRefreshing,
+            onRefresh = onRefresh,
+            enabled = enabled,
+            state = state,
+            threshold = threshold
+        )
 
     override fun update(node: PullToRefreshModifierNode) {
         node.onRefresh = onRefresh
@@ -271,9 +271,12 @@
     private var verticalOffset by mutableFloatStateOf(0f)
     private var distancePulled by mutableFloatStateOf(0f)
 
-    private val adjustedDistancePulled: Float get() = distancePulled * DragMultiplier
+    private val adjustedDistancePulled: Float
+        get() = distancePulled * DragMultiplier
+
     private val thresholdPx
         get() = with(currentValueOf(LocalDensity)) { threshold.roundToPx() }
+
     private val progress
         get() = adjustedDistancePulled / thresholdPx
 
@@ -284,37 +287,35 @@
     override fun onPreScroll(
         available: Offset,
         source: NestedScrollSource,
-    ): Offset = when {
-        state.isAnimating -> Offset.Zero
-        !enabled -> Offset.Zero
-        // Swiping up
-        source == NestedScrollSource.UserInput && available.y < 0 -> {
-            consumeAvailableOffset(available)
+    ): Offset =
+        when {
+            state.isAnimating -> Offset.Zero
+            !enabled -> Offset.Zero
+            // Swiping up
+            source == NestedScrollSource.UserInput && available.y < 0 -> {
+                consumeAvailableOffset(available)
+            }
+            else -> Offset.Zero
         }
 
-        else -> Offset.Zero
-    }
-
     override fun onPostScroll(
         consumed: Offset,
         available: Offset,
         source: NestedScrollSource
-    ): Offset = when {
-        state.isAnimating -> Offset.Zero
-        !enabled -> Offset.Zero
-        // Swiping down
-        source == NestedScrollSource.UserInput -> {
-            val newOffset = consumeAvailableOffset(available)
-            coroutineScope.launch {
-                state.snapTo(verticalOffset / thresholdPx)
+    ): Offset =
+        when {
+            state.isAnimating -> Offset.Zero
+            !enabled -> Offset.Zero
+            // Swiping down
+            source == NestedScrollSource.UserInput -> {
+                val newOffset = consumeAvailableOffset(available)
+                coroutineScope.launch { state.snapTo(verticalOffset / thresholdPx) }
+
+                newOffset
             }
-
-            newOffset
+            else -> Offset.Zero
         }
 
-        else -> Offset.Zero
-    }
-
     override suspend fun onPreFling(available: Velocity): Velocity {
         return Velocity(0f, onRelease(available.y))
     }
@@ -331,13 +332,15 @@
 
     /** Helper method for nested scroll connection */
     private fun consumeAvailableOffset(available: Offset): Offset {
-        val y = if (isRefreshing) 0f else {
-            val newOffset = (distancePulled + available.y).coerceAtLeast(0f)
-            val dragConsumed = newOffset - distancePulled
-            distancePulled = newOffset
-            verticalOffset = calculateVerticalOffset()
-            dragConsumed
-        }
+        val y =
+            if (isRefreshing) 0f
+            else {
+                val newOffset = (distancePulled + available.y).coerceAtLeast(0f)
+                val dragConsumed = newOffset - distancePulled
+                distancePulled = newOffset
+                verticalOffset = calculateVerticalOffset()
+                dragConsumed
+            }
         return Offset(0f, y)
     }
 
@@ -352,35 +355,39 @@
             animateToHidden()
         }
 
-        val consumed = when {
-            // We are flinging without having dragged the pull refresh (for example a fling inside
-            // a list) - don't consume
-            distancePulled == 0f -> 0f
-            // If the velocity is negative, the fling is upwards, and we don't want to prevent the
-            // the list from scrolling
-            velocity < 0f -> 0f
-            // We are showing the indicator, and the fling is downwards - consume everything
-            else -> velocity
-        }
+        val consumed =
+            when {
+                // We are flinging without having dragged the pull refresh (for example a fling
+                // inside
+                // a list) - don't consume
+                distancePulled == 0f -> 0f
+                // If the velocity is negative, the fling is upwards, and we don't want to prevent
+                // the
+                // the list from scrolling
+                velocity < 0f -> 0f
+                // We are showing the indicator, and the fling is downwards - consume everything
+                else -> velocity
+            }
         distancePulled = 0f
         return consumed
     }
 
-    private fun calculateVerticalOffset(): Float = when {
-        // If drag hasn't gone past the threshold, the position is the adjustedDistancePulled.
-        adjustedDistancePulled <= thresholdPx -> adjustedDistancePulled
-        else -> {
-            // How far beyond the threshold pull has gone, as a percentage of the threshold.
-            val overshootPercent = abs(progress) - 1.0f
-            // Limit the overshoot to 200%. Linear between 0 and 200.
-            val linearTension = overshootPercent.coerceIn(0f, 2f)
-            // Non-linear tension. Increases with linearTension, but at a decreasing rate.
-            val tensionPercent = linearTension - linearTension.pow(2) / 4
-            // The additional offset beyond the threshold.
-            val extraOffset = thresholdPx * tensionPercent
-            thresholdPx + extraOffset
+    private fun calculateVerticalOffset(): Float =
+        when {
+            // If drag hasn't gone past the threshold, the position is the adjustedDistancePulled.
+            adjustedDistancePulled <= thresholdPx -> adjustedDistancePulled
+            else -> {
+                // How far beyond the threshold pull has gone, as a percentage of the threshold.
+                val overshootPercent = abs(progress) - 1.0f
+                // Limit the overshoot to 200%. Linear between 0 and 200.
+                val linearTension = overshootPercent.coerceIn(0f, 2f)
+                // Non-linear tension. Increases with linearTension, but at a decreasing rate.
+                val tensionPercent = linearTension - linearTension.pow(2) / 4
+                // The additional offset beyond the threshold.
+                val extraOffset = thresholdPx * tensionPercent
+                thresholdPx + extraOffset
+            }
         }
-    }
 
     private suspend fun animateToThreshold() {
         state.animateToThreshold()
@@ -395,19 +402,19 @@
     }
 }
 
-/**
- * Contains the default values for [PullToRefreshBox]
- */
+/** Contains the default values for [PullToRefreshBox] */
 @ExperimentalMaterial3Api
 object PullToRefreshDefaults {
     /** The default shape for [Indicator] */
     val shape: Shape = CircleShape
 
     /** The default container color for [Indicator] */
-    val containerColor: Color @Composable get() = MaterialTheme.colorScheme.surfaceContainerHigh
+    val containerColor: Color
+        @Composable get() = MaterialTheme.colorScheme.surfaceContainerHigh
 
     /** The default indicator color for [Indicator] */
-    val indicatorColor: Color @Composable get() = MaterialTheme.colorScheme.onSurfaceVariant
+    val indicatorColor: Color
+        @Composable get() = MaterialTheme.colorScheme.onSurfaceVariant
 
     /** The default refresh threshold for [rememberPullToRefreshState] */
     val PositionalThreshold = 80.dp
@@ -415,9 +422,7 @@
     /** The default elevation for [pullToRefreshIndicator] */
     val Elevation = ElevationTokens.Level2
 
-    /**
-     * The default indicator for [PullToRefreshBox].
-     */
+    /** The default indicator for [PullToRefreshBox]. */
     @Composable
     fun Indicator(
         state: PullToRefreshState,
@@ -428,12 +433,13 @@
         threshold: Dp = PositionalThreshold,
     ) {
         Box(
-            modifier = modifier.pullToRefreshIndicator(
-                state = state,
-                isRefreshing = isRefreshing,
-                containerColor = containerColor,
-                threshold = threshold,
-            ),
+            modifier =
+                modifier.pullToRefreshIndicator(
+                    state = state,
+                    isRefreshing = isRefreshing,
+                    containerColor = containerColor,
+                    threshold = threshold,
+                ),
             contentAlignment = Alignment.Center
         ) {
             Crossfade(
@@ -458,12 +464,13 @@
 }
 
 /**
- * The state of a [PullToRefreshBox] which tracks the distance that the container
- * and indicator have been pulled.
+ * The state of a [PullToRefreshBox] which tracks the distance that the container and indicator have
+ * been pulled.
  *
  * Each instance of [PullToRefreshBox] should have its own [PullToRefreshState].
  *
  * [PullToRefreshState] can be used with other progress indicators like so:
+ *
  * @sample androidx.compose.material3.samples.PullToRefreshLinearProgressIndicatorSample
  */
 @Stable
@@ -471,58 +478,45 @@
 interface PullToRefreshState {
 
     /**
-     * Distance percentage towards the refresh threshold. 0.0 indicates no distance,
-     * 1.0 indicates being at the threshold offset, > 1.0 indicates overshoot beyond the provided
-     * threshold.
+     * Distance percentage towards the refresh threshold. 0.0 indicates no distance, 1.0 indicates
+     * being at the threshold offset, > 1.0 indicates overshoot beyond the provided threshold.
      */
-    @get:FloatRange(from = 0.0)
-    val distanceFraction: Float
+    @get:FloatRange(from = 0.0) val distanceFraction: Float
 
     /** Whether the state is currently animating */
     val isAnimating: Boolean
         get() = false
 
     /**
-     * Animate the distance towards the anchor or threshold position, where the indicator will
-     * be shown when refreshing.
+     * Animate the distance towards the anchor or threshold position, where the indicator will be
+     * shown when refreshing.
      */
     suspend fun animateToThreshold()
 
-    /**
-     * Animate the distance towards the position where the indicator will be hidden when idle
-     */
+    /** Animate the distance towards the position where the indicator will be hidden when idle */
     suspend fun animateToHidden()
 
-    /**
-     * Snap the indicator to the desired threshold fraction
-     */
+    /** Snap the indicator to the desired threshold fraction */
     suspend fun snapTo(@FloatRange(from = 0.0) targetValue: Float)
 }
 
-/**
- * Create and remember the default [PullToRefreshState].
- */
+/** Create and remember the default [PullToRefreshState]. */
 @Composable
 @ExperimentalMaterial3Api
 fun rememberPullToRefreshState(): PullToRefreshState {
-    return rememberSaveable(saver = PullToRefreshStateImpl.Saver) {
-        PullToRefreshStateImpl()
-    }
+    return rememberSaveable(saver = PullToRefreshStateImpl.Saver) { PullToRefreshStateImpl() }
 }
 
 /**
  * Creates a [PullToRefreshState].
  *
  * Note that in most cases, you are advised to use [rememberPullToRefreshState] when in composition.
- *
  */
-@ExperimentalMaterial3Api
-fun PullToRefreshState(): PullToRefreshState = PullToRefreshStateImpl()
+@ExperimentalMaterial3Api fun PullToRefreshState(): PullToRefreshState = PullToRefreshStateImpl()
 
 @ExperimentalMaterial3Api
-internal class PullToRefreshStateImpl private constructor(
-    private val anim: Animatable<Float, AnimationVector1D>
-) : PullToRefreshState {
+internal class PullToRefreshStateImpl
+private constructor(private val anim: Animatable<Float, AnimationVector1D>) : PullToRefreshState {
     constructor() : this(Animatable(0f, Float.VectorConverter))
 
     override val distanceFraction
@@ -545,10 +539,11 @@
     }
 
     companion object {
-        val Saver = Saver<PullToRefreshStateImpl, Float>(
-            save = { it.anim.value },
-            restore = { PullToRefreshStateImpl(Animatable(it, Float.VectorConverter)) }
-        )
+        val Saver =
+            Saver<PullToRefreshStateImpl, Float>(
+                save = { it.anim.value },
+                restore = { PullToRefreshStateImpl(Animatable(it, Float.VectorConverter)) }
+            )
     }
 }
 
@@ -560,15 +555,11 @@
 ) {
     val path = remember { Path().apply { fillType = PathFillType.EvenOdd } }
     // TODO: Consider refactoring this sub-component utilizing Modifier.Node
-    val targetAlpha by remember {
-        derivedStateOf { if (progress() >= 1f) MaxAlpha else MinAlpha }
-    }
+    val targetAlpha by remember { derivedStateOf { if (progress() >= 1f) MaxAlpha else MinAlpha } }
     val alphaState = animateFloatAsState(targetValue = targetAlpha, animationSpec = AlphaTween)
     Canvas(
-        Modifier
-            .semantics(mergeDescendants = true) {
-                progressBarRangeInfo =
-                    ProgressBarRangeInfo(progress(), 0f..1f, 0)
+        Modifier.semantics(mergeDescendants = true) {
+                progressBarRangeInfo = ProgressBarRangeInfo(progress(), 0f..1f, 0)
             }
             .size(SpinnerSize)
     ) {
@@ -598,10 +589,7 @@
         useCenter = false,
         topLeft = arcBounds.topLeft,
         size = arcBounds.size,
-        style = Stroke(
-            width = strokeWidth.toPx(),
-            cap = StrokeCap.Butt
-        )
+        style = Stroke(width = strokeWidth.toPx(), cap = StrokeCap.Butt)
     )
 }
 
@@ -644,19 +632,13 @@
     arrow.reset()
     arrow.moveTo(0f, 0f) // Move to left corner
     // Line to tip of arrow
-    arrow.lineTo(
-        x = ArrowWidth.toPx() * values.scale / 2,
-        y = ArrowHeight.toPx() * values.scale
-    )
+    arrow.lineTo(x = ArrowWidth.toPx() * values.scale / 2, y = ArrowHeight.toPx() * values.scale)
     arrow.lineTo(x = ArrowWidth.toPx() * values.scale, y = 0f) // Line to right corner
 
     val radius = min(bounds.width, bounds.height) / 2f
     val inset = ArrowWidth.toPx() * values.scale / 2f
     arrow.translate(
-        Offset(
-            x = radius + bounds.center.x - inset,
-            y = bounds.center.y - strokeWidth.toPx()
-        )
+        Offset(x = radius + bounds.center.x - inset, y = bounds.center.y - strokeWidth.toPx())
     )
     rotate(degrees = values.endAngle - strokeWidth.toPx()) {
         drawPath(path = arrow, color = color, alpha = alpha, style = Stroke(strokeWidth.toPx()))
@@ -680,9 +662,9 @@
 private val AlphaTween = tween<Float>(MotionTokens.DurationMedium2.toInt(), easing = LinearEasing)
 
 /**
- * The distance pulled is multiplied by this value to give us the adjusted distance pulled, which
- * is used in calculating the indicator position (when the adjusted distance pulled is less than
- * the refresh threshold, it is the indicator position, otherwise the indicator position is
- * derived from the progress).
+ * The distance pulled is multiplied by this value to give us the adjusted distance pulled, which is
+ * used in calculating the indicator position (when the adjusted distance pulled is less than the
+ * refresh threshold, it is the indicator position, otherwise the indicator position is derived from
+ * the progress).
  */
 private const val DragMultiplier = 0.5f
diff --git a/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/tokens/ShapeTokens.kt b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/tokens/ShapeTokens.kt
index 92dedaa..e9d4cb6 100644
--- a/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/tokens/ShapeTokens.kt
+++ b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/tokens/ShapeTokens.kt
@@ -33,12 +33,13 @@
             bottomStart = 0.0.dp
         )
     val CornerExtraSmall = RoundedCornerShape(4.0.dp)
-    val CornerExtraSmallTop = RoundedCornerShape(
-        topStart = 4.0.dp,
-        topEnd = 4.0.dp,
-        bottomEnd = 0.0.dp,
-        bottomStart = 0.0.dp
-    )
+    val CornerExtraSmallTop =
+        RoundedCornerShape(
+            topStart = 4.0.dp,
+            topEnd = 4.0.dp,
+            bottomEnd = 0.0.dp,
+            bottomStart = 0.0.dp
+        )
     val CornerFull = CircleShape
     val CornerLarge = RoundedCornerShape(16.0.dp)
     val CornerLargeEnd =
diff --git a/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/tokens/TimeInputTokens.kt b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/tokens/TimeInputTokens.kt
index 2bd2372..4b09f4f 100644
--- a/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/tokens/TimeInputTokens.kt
+++ b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/tokens/TimeInputTokens.kt
@@ -17,7 +17,9 @@
 // VERSION: v0_210
 // GENERATED CODE - DO NOT MODIFY BY HAND
 package androidx.compose.material3.tokens
+
 import androidx.compose.ui.unit.dp
+
 internal object TimeInputTokens {
     val ContainerColor = ColorSchemeKeyTokens.SurfaceContainerHigh
     val ContainerElevation = ElevationTokens.Level3
diff --git a/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/tokens/TimePickerTokens.kt b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/tokens/TimePickerTokens.kt
index 76170c1..ecbb752 100644
--- a/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/tokens/TimePickerTokens.kt
+++ b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/tokens/TimePickerTokens.kt
@@ -17,7 +17,9 @@
 // VERSION: v0_210
 // GENERATED CODE - DO NOT MODIFY BY HAND
 package androidx.compose.material3.tokens
+
 import androidx.compose.ui.unit.dp
+
 internal object TimePickerTokens {
     val ClockDialColor = ColorSchemeKeyTokens.SurfaceContainerHighest
     val ClockDialContainerSize = 256.0.dp
diff --git a/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/tokens/TypographyTokens.kt b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/tokens/TypographyTokens.kt
index 78b17f8..46d7643 100644
--- a/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/tokens/TypographyTokens.kt
+++ b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/tokens/TypographyTokens.kt
@@ -145,12 +145,11 @@
         )
 }
 
-internal val DefaultLineHeightStyle = LineHeightStyle(
-    alignment = LineHeightStyle.Alignment.Center,
-    trim = LineHeightStyle.Trim.None
-)
+internal val DefaultLineHeightStyle =
+    LineHeightStyle(alignment = LineHeightStyle.Alignment.Center, trim = LineHeightStyle.Trim.None)
 
-internal val DefaultTextStyle = TextStyle.Default.copy(
-    platformStyle = defaultPlatformTextStyle(),
-    lineHeightStyle = DefaultLineHeightStyle,
-)
+internal val DefaultTextStyle =
+    TextStyle.Default.copy(
+        platformStyle = defaultPlatformTextStyle(),
+        lineHeightStyle = DefaultLineHeightStyle,
+    )
diff --git a/compose/material3/material3/src/desktopMain/kotlin/androidx/compose/material3/CalendarLocale.desktop.kt b/compose/material3/material3/src/desktopMain/kotlin/androidx/compose/material3/CalendarLocale.desktop.kt
index ab5d047..3f24336 100644
--- a/compose/material3/material3/src/desktopMain/kotlin/androidx/compose/material3/CalendarLocale.desktop.kt
+++ b/compose/material3/material3/src/desktopMain/kotlin/androidx/compose/material3/CalendarLocale.desktop.kt
@@ -19,9 +19,7 @@
 import androidx.compose.runtime.Composable
 import androidx.compose.runtime.ReadOnlyComposable
 
-/**
- * Returns the default [CalendarLocale].
- */
+/** Returns the default [CalendarLocale]. */
 @Composable
 @ReadOnlyComposable
 @OptIn(ExperimentalMaterial3Api::class)
diff --git a/compose/material3/material3/src/desktopMain/kotlin/androidx/compose/material3/TimeFormat.desktop.kt b/compose/material3/material3/src/desktopMain/kotlin/androidx/compose/material3/TimeFormat.desktop.kt
index f1c70f9..ca9055a 100644
--- a/compose/material3/material3/src/desktopMain/kotlin/androidx/compose/material3/TimeFormat.desktop.kt
+++ b/compose/material3/material3/src/desktopMain/kotlin/androidx/compose/material3/TimeFormat.desktop.kt
@@ -20,5 +20,4 @@
 import androidx.compose.runtime.ReadOnlyComposable
 
 internal actual val is24HourFormat: Boolean
-    @Composable
-    @ReadOnlyComposable get() = false
+    @Composable @ReadOnlyComposable get() = false
diff --git a/compose/material3/material3/src/desktopMain/kotlin/androidx/compose/material3/Tooltip.desktop.kt b/compose/material3/material3/src/desktopMain/kotlin/androidx/compose/material3/Tooltip.desktop.kt
index 71f431b..1085812 100644
--- a/compose/material3/material3/src/desktopMain/kotlin/androidx/compose/material3/Tooltip.desktop.kt
+++ b/compose/material3/material3/src/desktopMain/kotlin/androidx/compose/material3/Tooltip.desktop.kt
@@ -38,9 +38,9 @@
  * Usually used with [TooltipBox].
  *
  * @param modifier the [Modifier] to be applied to the tooltip.
- * @param caretSize [DpSize] for the caret of the tooltip, if a default
- * caret is desired with a specific dimension. Please see [TooltipDefaults.caretSize] to
- * see the default dimensions. Pass in Dp.Unspecified for this parameter if no caret is desired.
+ * @param caretSize [DpSize] for the caret of the tooltip, if a default caret is desired with a
+ *   specific dimension. Please see [TooltipDefaults.caretSize] to see the default dimensions. Pass
+ *   in Dp.Unspecified for this parameter if no caret is desired.
  * @param shape the [Shape] that should be applied to the tooltip container.
  * @param contentColor [Color] that will be applied to the tooltip's content.
  * @param containerColor [Color] that will be applied to the tooltip's container.
@@ -67,13 +67,14 @@
         tonalElevation = tonalElevation,
         shadowElevation = shadowElevation
     ) {
-        Box(modifier = Modifier
-            .sizeIn(
-                minWidth = TooltipMinWidth,
-                maxWidth = PlainTooltipMaxWidth,
-                minHeight = TooltipMinHeight
-            )
-            .padding(PlainTooltipContentPadding)
+        Box(
+            modifier =
+                Modifier.sizeIn(
+                        minWidth = TooltipMinWidth,
+                        maxWidth = PlainTooltipMaxWidth,
+                        minHeight = TooltipMinHeight
+                    )
+                    .padding(PlainTooltipContentPadding)
         ) {
             val textStyle = PlainTooltipTokens.SupportingTextFont.value
             CompositionLocalProvider(
@@ -86,17 +87,17 @@
 }
 
 /**
- * Rich text tooltip that allows the user to pass in a title, text, and action.
- * Tooltips are used to provide a descriptive message.
+ * Rich text tooltip that allows the user to pass in a title, text, and action. Tooltips are used to
+ * provide a descriptive message.
  *
  * Usually used with [TooltipBox]
  *
  * @param modifier the [Modifier] to be applied to the tooltip.
  * @param title An optional title for the tooltip.
  * @param action An optional action for the tooltip.
- * @param caretSize [DpSize] for the caret of the tooltip, if a default
- * caret is desired with a specific dimension. Please see [TooltipDefaults.caretSize] to
- * see the default dimensions. Pass in Dp.Unspecified for this parameter if no caret is desired.
+ * @param caretSize [DpSize] for the caret of the tooltip, if a default caret is desired with a
+ *   specific dimension. Please see [TooltipDefaults.caretSize] to see the default dimensions. Pass
+ *   in Dp.Unspecified for this parameter if no caret is desired.
  * @param shape the [Shape] that should be applied to the tooltip container.
  * @param colors [RichTooltipColors] that will be applied to the tooltip's container and content.
  * @param tonalElevation the tonal elevation of the tooltip.
@@ -117,8 +118,8 @@
     text: @Composable () -> Unit
 ) {
     Surface(
-        modifier = modifier
-            .sizeIn(
+        modifier =
+            modifier.sizeIn(
                 minWidth = TooltipMinWidth,
                 maxWidth = RichTooltipMaxWidth,
                 minHeight = TooltipMinHeight
@@ -132,13 +133,9 @@
         val subheadTextStyle = RichTooltipTokens.SubheadFont.value
         val supportingTextStyle = RichTooltipTokens.SupportingTextFont.value
 
-        Column(
-            modifier = Modifier.padding(horizontal = RichTooltipHorizontalPadding)
-        ) {
+        Column(modifier = Modifier.padding(horizontal = RichTooltipHorizontalPadding)) {
             title?.let {
-                Box(
-                    modifier = Modifier.paddingFromBaseline(top = HeightToSubheadFirstLine)
-                ) {
+                Box(modifier = Modifier.paddingFromBaseline(top = HeightToSubheadFirstLine)) {
                     CompositionLocalProvider(
                         LocalContentColor provides colors.titleContentColor,
                         LocalTextStyle provides subheadTextStyle,
@@ -146,9 +143,7 @@
                     )
                 }
             }
-            Box(
-                modifier = Modifier.textVerticalPadding(title != null, action != null)
-            ) {
+            Box(modifier = Modifier.textVerticalPadding(title != null, action != null)) {
                 CompositionLocalProvider(
                     LocalContentColor provides colors.contentColor,
                     LocalTextStyle provides supportingTextStyle,
@@ -157,9 +152,9 @@
             }
             action?.let {
                 Box(
-                    modifier = Modifier
-                        .requiredHeightIn(min = ActionLabelMinHeight)
-                        .padding(bottom = ActionLabelBottomPadding)
+                    modifier =
+                        Modifier.requiredHeightIn(min = ActionLabelMinHeight)
+                            .padding(bottom = ActionLabelBottomPadding)
                 ) {
                     CompositionLocalProvider(
                         LocalContentColor provides colors.actionContentColor,
diff --git a/compose/material3/material3/src/desktopMain/kotlin/androidx/compose/material3/internal/BasicTooltip.desktop.kt b/compose/material3/material3/src/desktopMain/kotlin/androidx/compose/material3/internal/BasicTooltip.desktop.kt
index 30845c6..a689144 100644
--- a/compose/material3/material3/src/desktopMain/kotlin/androidx/compose/material3/internal/BasicTooltip.desktop.kt
+++ b/compose/material3/material3/src/desktopMain/kotlin/androidx/compose/material3/internal/BasicTooltip.desktop.kt
@@ -26,24 +26,23 @@
 import androidx.compose.ui.window.PopupProperties
 
 /**
- * NOTICE:
- * Fork from androidx.compose.foundation.BasicTooltip box since those are experimental
+ * NOTICE: Fork from androidx.compose.foundation.BasicTooltip box since those are experimental
  *
- * Tooltip that provides a descriptive message for an anchor.
- * It can be used to call the users attention to the anchor.
+ * Tooltip that provides a descriptive message for an anchor. It can be used to call the users
+ * attention to the anchor.
  *
- * @param positionProvider [PopupPositionProvider] that will be used to place the tooltip
- * relative to the anchor content.
+ * @param positionProvider [PopupPositionProvider] that will be used to place the tooltip relative
+ *   to the anchor content.
  * @param tooltip the composable that will be used to populate the tooltip's content.
  * @param state handles the state of the tooltip's visibility.
  * @param modifier the [Modifier] to be applied to this BasicTooltipBox.
- * @param focusable [Boolean] that determines if the tooltip is focusable. When true,
- * the tooltip will consume touch events while it's shown and will have accessibility
- * focus move to the first element of the component. When false, the tooltip
- * won't consume touch events while it's shown but assistive-tech users will need
- * to swipe or drag to get to the first element of the component.
- * @param enableUserInput [Boolean] which determines if this BasicTooltipBox will handle
- * long press and mouse hover to trigger the tooltip through the state provided.
+ * @param focusable [Boolean] that determines if the tooltip is focusable. When true, the tooltip
+ *   will consume touch events while it's shown and will have accessibility focus move to the first
+ *   element of the component. When false, the tooltip won't consume touch events while it's shown
+ *   but assistive-tech users will need to swipe or drag to get to the first element of the
+ *   component.
+ * @param enableUserInput [Boolean] which determines if this BasicTooltipBox will handle long press
+ *   and mouse hover to trigger the tooltip through the state provided.
  * @param content the composable that the tooltip will anchor to.
  */
 @OptIn(ExperimentalMaterial3Api::class)
@@ -65,11 +64,14 @@
             Popup(
                 popupPositionProvider = positionProvider,
                 onDismissRequest = { state.dismiss() },
-                properties = PopupProperties(
-                    // TODO(b/326167778): focusable = true cannot work with mouse
-                    focusable = false
-                )
-            ) { tooltip() }
+                properties =
+                    PopupProperties(
+                        // TODO(b/326167778): focusable = true cannot work with mouse
+                        focusable = false
+                    )
+            ) {
+                tooltip()
+            }
         }
     }
 }
diff --git a/compose/material3/material3/src/desktopMain/kotlin/androidx/compose/material3/internal/CalendarModel.desktop.kt b/compose/material3/material3/src/desktopMain/kotlin/androidx/compose/material3/internal/CalendarModel.desktop.kt
index 4a8f76e..2e183af 100644
--- a/compose/material3/material3/src/desktopMain/kotlin/androidx/compose/material3/internal/CalendarModel.desktop.kt
+++ b/compose/material3/material3/src/desktopMain/kotlin/androidx/compose/material3/internal/CalendarModel.desktop.kt
@@ -18,9 +18,7 @@
 
 import androidx.compose.material3.CalendarLocale
 
-/**
- * Returns a [CalendarModel] to be used by the date picker.
- */
+/** Returns a [CalendarModel] to be used by the date picker. */
 internal actual fun createCalendarModel(locale: CalendarLocale): CalendarModel =
     LegacyCalendarModelImpl(locale)
 
diff --git a/compose/material3/material3/src/desktopMain/kotlin/androidx/compose/material3/internal/Strings.desktop.kt b/compose/material3/material3/src/desktopMain/kotlin/androidx/compose/material3/internal/Strings.desktop.kt
index a37f4fe..4e0f782 100644
--- a/compose/material3/material3/src/desktopMain/kotlin/androidx/compose/material3/internal/Strings.desktop.kt
+++ b/compose/material3/material3/src/desktopMain/kotlin/androidx/compose/material3/internal/Strings.desktop.kt
@@ -42,8 +42,8 @@
         Strings.DatePickerHeadline -> "Selected date"
         Strings.DatePickerYearPickerPaneTitle -> "Year picker visible"
         Strings.DatePickerSwitchToYearSelection -> "Switch to selecting a year"
-        Strings.DatePickerSwitchToDaySelection -> "Swipe to select a year, or tap to switch " +
-            "back to selecting a day"
+        Strings.DatePickerSwitchToDaySelection ->
+            "Swipe to select a year, or tap to switch " + "back to selecting a day"
         Strings.DatePickerSwitchToNextMonth -> "Change to next month"
         Strings.DatePickerSwitchToPreviousMonth -> "Change to previous month"
         Strings.DatePickerNavigateToYearDescription -> "Navigate to year %1$"
diff --git a/compose/material3/material3/src/desktopMain/kotlin/androidx/compose/material3/internal/SystemBarsDefaultInsets.desktop.kt b/compose/material3/material3/src/desktopMain/kotlin/androidx/compose/material3/internal/SystemBarsDefaultInsets.desktop.kt
index db63677..fef57d6 100644
--- a/compose/material3/material3/src/desktopMain/kotlin/androidx/compose/material3/internal/SystemBarsDefaultInsets.desktop.kt
+++ b/compose/material3/material3/src/desktopMain/kotlin/androidx/compose/material3/internal/SystemBarsDefaultInsets.desktop.kt
@@ -21,5 +21,4 @@
 import androidx.compose.ui.unit.dp
 
 internal actual val WindowInsets.Companion.systemBarsForVisualComponents: WindowInsets
-    @Composable
-    get() = WindowInsets(0.dp, 0.dp, 0.dp, 0.dp)
+    @Composable get() = WindowInsets(0.dp, 0.dp, 0.dp, 0.dp)
diff --git a/compose/material3/material3/src/jvmMain/kotlin/androidx/compose/material3/CalendarLocale.jvm.kt b/compose/material3/material3/src/jvmMain/kotlin/androidx/compose/material3/CalendarLocale.jvm.kt
index 209f94e..e40ab63 100644
--- a/compose/material3/material3/src/jvmMain/kotlin/androidx/compose/material3/CalendarLocale.jvm.kt
+++ b/compose/material3/material3/src/jvmMain/kotlin/androidx/compose/material3/CalendarLocale.jvm.kt
@@ -28,22 +28,22 @@
  */
 actual typealias CalendarLocale = Locale
 
-/**
- * Returns a string representation of an integer for the current Locale.
- */
+/** Returns a string representation of an integer for the current Locale. */
 internal actual fun Int.toLocalString(
     minDigits: Int,
     maxDigits: Int,
     isGroupingUsed: Boolean
 ): String {
     return getCachedDateTimeFormatter(
-        minDigits = minDigits,
-        maxDigits = maxDigits,
-        isGroupingUsed = isGroupingUsed
-    ).format(this)
+            minDigits = minDigits,
+            maxDigits = maxDigits,
+            isGroupingUsed = isGroupingUsed
+        )
+        .format(this)
 }
 
 private val cachedFormatters = WeakHashMap<String, NumberFormat>()
+
 private fun getCachedDateTimeFormatter(
     minDigits: Int,
     maxDigits: Int,
diff --git a/compose/material3/material3/src/jvmMain/kotlin/androidx/compose/material3/internal/InternalMutatorMutex.jvm.kt b/compose/material3/material3/src/jvmMain/kotlin/androidx/compose/material3/internal/InternalMutatorMutex.jvm.kt
index a36586f..f57d7d2 100644
--- a/compose/material3/material3/src/jvmMain/kotlin/androidx/compose/material3/internal/InternalMutatorMutex.jvm.kt
+++ b/compose/material3/material3/src/jvmMain/kotlin/androidx/compose/material3/internal/InternalMutatorMutex.jvm.kt
@@ -17,8 +17,8 @@
 package androidx.compose.material3.internal
 
 /* Copy of androidx.compose.material.ActualJvm, mirrored from Foundation. This is used for the
-   M2/M3-internal copy of MutatorMutex.
- */
+  M2/M3-internal copy of MutatorMutex.
+*/
 @Suppress("ACTUAL_WITHOUT_EXPECT") // https://youtrack.jetbrains.com/issue/KT-37316
 internal actual typealias InternalAtomicReference<V> =
     java.util.concurrent.atomic.AtomicReference<V>
diff --git a/compose/material3/material3/src/jvmMain/kotlin/androidx/compose/material3/internal/LegacyCalendarModelImpl.jvm.kt b/compose/material3/material3/src/jvmMain/kotlin/androidx/compose/material3/internal/LegacyCalendarModelImpl.jvm.kt
index 74a8957..0065acc 100644
--- a/compose/material3/material3/src/jvmMain/kotlin/androidx/compose/material3/internal/LegacyCalendarModelImpl.jvm.kt
+++ b/compose/material3/material3/src/jvmMain/kotlin/androidx/compose/material3/internal/LegacyCalendarModelImpl.jvm.kt
@@ -51,8 +51,7 @@
             )
         }
 
-    override val firstDayOfWeek: Int =
-        dayInISO8601(Calendar.getInstance(locale).firstDayOfWeek)
+    override val firstDayOfWeek: Int = dayInISO8601(Calendar.getInstance(locale).firstDayOfWeek)
 
     override val weekdayNames: List<Pair<String, String>> = buildList {
         val weekdays = DateFormatSymbols(locale).weekdays
@@ -68,10 +67,7 @@
 
     override fun getDateInputFormat(locale: CalendarLocale): DateInputFormat {
         return datePatternAsInputFormat(
-            (DateFormat.getDateInstance(
-                DateFormat.SHORT,
-                locale
-            ) as SimpleDateFormat).toPattern()
+            (DateFormat.getDateInstance(DateFormat.SHORT, locale) as SimpleDateFormat).toPattern()
         )
     }
 
@@ -185,9 +181,7 @@
             return dateFormat.format(calendar.timeInMillis)
         }
 
-        /**
-         * Holds a UTC [TimeZone].
-         */
+        /** Holds a UTC [TimeZone]. */
         internal val utcTimeZone: TimeZone = TimeZone.getTimeZone("UTC")
 
         private fun getCachedSimpleDateFormat(
@@ -214,11 +208,12 @@
 
     private fun getMonth(firstDayCalendar: Calendar): CalendarMonth {
         val difference = dayInISO8601(firstDayCalendar[Calendar.DAY_OF_WEEK]) - firstDayOfWeek
-        val daysFromStartOfWeekToFirstOfMonth = if (difference < 0) {
-            difference + DaysInWeek
-        } else {
-            difference
-        }
+        val daysFromStartOfWeekToFirstOfMonth =
+            if (difference < 0) {
+                difference + DaysInWeek
+            } else {
+                difference
+            }
         return CalendarMonth(
             year = firstDayCalendar[Calendar.YEAR],
             month = firstDayCalendar[Calendar.MONTH] + 1,
diff --git a/compose/material3/material3/src/skikoMain/kotlin/androidx/compose/material3/AlertDialog.skiko.kt b/compose/material3/material3/src/skikoMain/kotlin/androidx/compose/material3/AlertDialog.skiko.kt
index e3b2ca3..da00d6f 100644
--- a/compose/material3/material3/src/skikoMain/kotlin/androidx/compose/material3/AlertDialog.skiko.kt
+++ b/compose/material3/material3/src/skikoMain/kotlin/androidx/compose/material3/AlertDialog.skiko.kt
@@ -43,19 +43,20 @@
     textContentColor: Color,
     tonalElevation: Dp,
     properties: DialogProperties
-): Unit = AlertDialogImpl(
-    onDismissRequest = onDismissRequest,
-    confirmButton = confirmButton,
-    modifier = modifier,
-    dismissButton = dismissButton,
-    icon = icon,
-    title = title,
-    text = text,
-    shape = shape,
-    containerColor = containerColor,
-    iconContentColor = iconContentColor,
-    titleContentColor = titleContentColor,
-    textContentColor = textContentColor,
-    tonalElevation = tonalElevation,
-    properties = properties
-)
+): Unit =
+    AlertDialogImpl(
+        onDismissRequest = onDismissRequest,
+        confirmButton = confirmButton,
+        modifier = modifier,
+        dismissButton = dismissButton,
+        icon = icon,
+        title = title,
+        text = text,
+        shape = shape,
+        containerColor = containerColor,
+        iconContentColor = iconContentColor,
+        titleContentColor = titleContentColor,
+        textContentColor = textContentColor,
+        tonalElevation = tonalElevation,
+        properties = properties
+    )
diff --git a/compose/material3/material3/src/skikoMain/kotlin/androidx/compose/material3/ModalBottomSheet.skiko.kt b/compose/material3/material3/src/skikoMain/kotlin/androidx/compose/material3/ModalBottomSheet.skiko.kt
index c0bc170..15778bb 100644
--- a/compose/material3/material3/src/skikoMain/kotlin/androidx/compose/material3/ModalBottomSheet.skiko.kt
+++ b/compose/material3/material3/src/skikoMain/kotlin/androidx/compose/material3/ModalBottomSheet.skiko.kt
@@ -25,7 +25,8 @@
 
 @Immutable
 @ExperimentalMaterial3Api
-actual class ModalBottomSheetProperties actual constructor(
+actual class ModalBottomSheetProperties
+actual constructor(
     actual val shouldDismissOnBackPress: Boolean,
 ) {
     override fun equals(other: Any?): Boolean {
@@ -57,9 +58,7 @@
 ) {
     Dialog(
         onDismissRequest = onDismissRequest,
-        properties = DialogProperties(
-            dismissOnBackPress = properties.shouldDismissOnBackPress
-        ),
+        properties = DialogProperties(dismissOnBackPress = properties.shouldDismissOnBackPress),
         content = content
     )
 }
diff --git a/compose/material3/material3/src/skikoMain/kotlin/androidx/compose/material3/SkikoMenu.skiko.kt b/compose/material3/material3/src/skikoMain/kotlin/androidx/compose/material3/SkikoMenu.skiko.kt
index f01240a..d0d080b 100644
--- a/compose/material3/material3/src/skikoMain/kotlin/androidx/compose/material3/SkikoMenu.skiko.kt
+++ b/compose/material3/material3/src/skikoMain/kotlin/androidx/compose/material3/SkikoMenu.skiko.kt
@@ -54,9 +54,11 @@
 
 @Deprecated(
     "Replaced by DropdownMenu with properties parameter",
-    ReplaceWith("DropdownMenu(expanded, onDismissRequest, modifier, offset, " +
-        "androidx.compose.ui.window.PopupProperties(focusable = focusable), " +
-        "content)"),
+    ReplaceWith(
+        "DropdownMenu(expanded, onDismissRequest, modifier, offset, " +
+            "androidx.compose.ui.window.PopupProperties(focusable = focusable), " +
+            "content)"
+    ),
     level = DeprecationLevel.HIDDEN
 )
 @Suppress("ModifierParameter")
@@ -68,14 +70,15 @@
     modifier: Modifier = Modifier,
     offset: DpOffset = DpOffset(0.dp, 0.dp),
     content: @Composable ColumnScope.() -> Unit
-) = DropdownMenu(
-    expanded = expanded,
-    onDismissRequest = onDismissRequest,
-    modifier = modifier,
-    offset = offset,
-    properties = PopupProperties(focusable = focusable),
-    content = content
-)
+) =
+    DropdownMenu(
+        expanded = expanded,
+        onDismissRequest = onDismissRequest,
+        modifier = modifier,
+        offset = offset,
+        properties = PopupProperties(focusable = focusable),
+        content = content
+    )
 
 // Workaround for `Overload resolution ambiguity` between old and new overload.
 @Deprecated("Maintained for binary compatibility", level = DeprecationLevel.HIDDEN)
@@ -86,14 +89,15 @@
     modifier: Modifier = Modifier,
     offset: DpOffset = DpOffset(0.dp, 0.dp),
     content: @Composable ColumnScope.() -> Unit
-) = DropdownMenu(
-    expanded = expanded,
-    onDismissRequest = onDismissRequest,
-    modifier = modifier,
-    offset = offset,
-    properties = PopupProperties(focusable = true),
-    content = content
-)
+) =
+    DropdownMenu(
+        expanded = expanded,
+        onDismissRequest = onDismissRequest,
+        modifier = modifier,
+        offset = offset,
+        properties = PopupProperties(focusable = true),
+        content = content
+    )
 
 @Composable
 actual fun DropdownMenu(
@@ -116,14 +120,12 @@
     if (expandedState.currentState || expandedState.targetState) {
         val transformOriginState = remember { mutableStateOf(TransformOrigin.Center) }
         val density = LocalDensity.current
-        val popupPositionProvider = remember(offset, density) {
-            DropdownMenuPositionProvider(
-                offset,
-                density
-            ) { parentBounds, menuBounds ->
-                transformOriginState.value = calculateTransformOrigin(parentBounds, menuBounds)
+        val popupPositionProvider =
+            remember(offset, density) {
+                DropdownMenuPositionProvider(offset, density) { parentBounds, menuBounds ->
+                    transformOriginState.value = calculateTransformOrigin(parentBounds, menuBounds)
+                }
             }
-        }
 
         var focusManager: FocusManager? by mutableStateOf(null)
         var inputModeManager: InputModeManager? by mutableStateOf(null)
@@ -131,9 +133,7 @@
             onDismissRequest = onDismissRequest,
             popupPositionProvider = popupPositionProvider,
             properties = properties,
-            onKeyEvent = {
-                handlePopupOnKeyEvent(it, focusManager, inputModeManager)
-            },
+            onKeyEvent = { handlePopupOnKeyEvent(it, focusManager, inputModeManager) },
         ) {
             focusManager = LocalFocusManager.current
             inputModeManager = LocalInputModeManager.current
@@ -156,24 +156,27 @@
 
 @Deprecated(
     level = DeprecationLevel.HIDDEN,
-    replaceWith = ReplaceWith(
-        expression = "DropdownMenu(\n" +
-            "    expanded = expanded,\n" +
-            "    onDismissRequest = onDismissRequest,\n" +
-            "    modifier = modifier,\n" +
-            "    offset = offset,\n" +
-            "    scrollState = scrollState,\n" +
-            "    properties = properties,\n" +
-            "    shape = MenuDefaults.shape,\n" +
-            "    containerColor = MenuDefaults.containerColor,\n" +
-            "    tonalElevation = MenuDefaults.TonalElevation,\n" +
-            "    shadowElevation = MenuDefaults.ShadowElevation,\n" +
-            "    border = null,\n" +
-            "    content = content,\n" +
-            ")",
-    ),
-    message = "Maintained for binary compatibility. Use overload with parameters for shape, " +
-        "color, elevation, and border."
+    replaceWith =
+        ReplaceWith(
+            expression =
+                "DropdownMenu(\n" +
+                    "    expanded = expanded,\n" +
+                    "    onDismissRequest = onDismissRequest,\n" +
+                    "    modifier = modifier,\n" +
+                    "    offset = offset,\n" +
+                    "    scrollState = scrollState,\n" +
+                    "    properties = properties,\n" +
+                    "    shape = MenuDefaults.shape,\n" +
+                    "    containerColor = MenuDefaults.containerColor,\n" +
+                    "    tonalElevation = MenuDefaults.TonalElevation,\n" +
+                    "    shadowElevation = MenuDefaults.ShadowElevation,\n" +
+                    "    border = null,\n" +
+                    "    content = content,\n" +
+                    ")",
+        ),
+    message =
+        "Maintained for binary compatibility. Use overload with parameters for shape, " +
+            "color, elevation, and border."
 )
 @Composable
 fun DropdownMenu(
@@ -184,30 +187,33 @@
     scrollState: ScrollState = rememberScrollState(),
     properties: PopupProperties = PopupProperties(focusable = true),
     content: @Composable ColumnScope.() -> Unit
-) = DropdownMenu(
-    expanded = expanded,
-    onDismissRequest = onDismissRequest,
-    modifier = modifier,
-    offset = offset,
-    scrollState = scrollState,
-    properties = properties,
-    shape = MenuDefaults.shape,
-    containerColor = MenuDefaults.containerColor,
-    tonalElevation = MenuDefaults.TonalElevation,
-    shadowElevation = MenuDefaults.ShadowElevation,
-    border = null,
-    content = content,
-)
+) =
+    DropdownMenu(
+        expanded = expanded,
+        onDismissRequest = onDismissRequest,
+        modifier = modifier,
+        offset = offset,
+        scrollState = scrollState,
+        properties = properties,
+        shape = MenuDefaults.shape,
+        containerColor = MenuDefaults.containerColor,
+        tonalElevation = MenuDefaults.TonalElevation,
+        shadowElevation = MenuDefaults.ShadowElevation,
+        border = null,
+        content = content,
+    )
 
 @Suppress("ModifierParameter")
 @OptIn(ExperimentalMaterial3Api::class)
 @Deprecated(
     level = DeprecationLevel.HIDDEN,
-    replaceWith = ReplaceWith(
-        expression = "DropdownMenu(expanded,onDismissRequest, modifier, offset, " +
-            "rememberScrollState(), properties, content)",
-        "androidx.compose.foundation.rememberScrollState"
-    ),
+    replaceWith =
+        ReplaceWith(
+            expression =
+                "DropdownMenu(expanded,onDismissRequest, modifier, offset, " +
+                    "rememberScrollState(), properties, content)",
+            "androidx.compose.foundation.rememberScrollState"
+        ),
     message = "Replaced by a DropdownMenu function with a ScrollState parameter"
 )
 @Composable
@@ -218,15 +224,16 @@
     offset: DpOffset,
     properties: PopupProperties,
     content: @Composable ColumnScope.() -> Unit
-) = DropdownMenu(
-    expanded = expanded,
-    onDismissRequest = onDismissRequest,
-    modifier = modifier,
-    offset = offset,
-    scrollState = rememberScrollState(),
-    properties = properties,
-    content = content
-)
+) =
+    DropdownMenu(
+        expanded = expanded,
+        onDismissRequest = onDismissRequest,
+        modifier = modifier,
+        offset = offset,
+        scrollState = rememberScrollState(),
+        properties = properties,
+        content = content
+    )
 
 @Composable
 actual fun DropdownMenuItem(
@@ -264,20 +271,21 @@
     keyEvent: KeyEvent,
     focusManager: FocusManager?,
     inputModeManager: InputModeManager?
-): Boolean = if (keyEvent.type == KeyEventType.KeyDown) {
-    when (keyEvent.key) {
-        Key.DirectionDown -> {
-            inputModeManager?.requestInputMode(InputMode.Keyboard)
-            focusManager?.moveFocus(FocusDirection.Next)
-            true
+): Boolean =
+    if (keyEvent.type == KeyEventType.KeyDown) {
+        when (keyEvent.key) {
+            Key.DirectionDown -> {
+                inputModeManager?.requestInputMode(InputMode.Keyboard)
+                focusManager?.moveFocus(FocusDirection.Next)
+                true
+            }
+            Key.DirectionUp -> {
+                inputModeManager?.requestInputMode(InputMode.Keyboard)
+                focusManager?.moveFocus(FocusDirection.Previous)
+                true
+            }
+            else -> false
         }
-        Key.DirectionUp -> {
-            inputModeManager?.requestInputMode(InputMode.Keyboard)
-            focusManager?.moveFocus(FocusDirection.Previous)
-            true
-        }
-        else -> false
+    } else {
+        false
     }
-} else {
-    false
-}
diff --git a/compose/runtime/runtime-lint/src/main/java/androidx/compose/runtime/lint/AutoboxingStateCreationDetector.kt b/compose/runtime/runtime-lint/src/main/java/androidx/compose/runtime/lint/AutoboxingStateCreationDetector.kt
index 50bd616..714cd79 100644
--- a/compose/runtime/runtime-lint/src/main/java/androidx/compose/runtime/lint/AutoboxingStateCreationDetector.kt
+++ b/compose/runtime/runtime-lint/src/main/java/androidx/compose/runtime/lint/AutoboxingStateCreationDetector.kt
@@ -49,24 +49,24 @@
  * - `T` is in the [replacements] map
  * - `T` is a non-nullable type
  *
- * This check only runs over Kotlin code, despite the possibility of calling mutableStateOf in
- * Java. It's not possible to annotate a generic type in Java with @Nullable or @NonNull,
- * so we will never have enough information to make the right call about whether you can make
- * a suggested replacement or not. We therefore skip this check in all Java files to err on
- * the side of underreporting.
+ * This check only runs over Kotlin code, despite the possibility of calling mutableStateOf in Java.
+ * It's not possible to annotate a generic type in Java with @Nullable or @NonNull, so we will never
+ * have enough information to make the right call about whether you can make a suggested replacement
+ * or not. We therefore skip this check in all Java files to err on the side of underreporting.
  */
 class AutoboxingStateCreationDetector : Detector(), SourceCodeScanner {
 
     /**
-     * Map of canonical PSI types to the fully-qualified function that should be used to
-     * create MutableState instances of said type.
+     * Map of canonical PSI types to the fully-qualified function that should be used to create
+     * MutableState instances of said type.
      */
-    private val replacements = mapOf(
-        "kotlin.Int" to Names.Runtime.MutableIntStateOf,
-        "kotlin.Long" to Names.Runtime.MutableLongStateOf,
-        "kotlin.Float" to Names.Runtime.MutableFloatStateOf,
-        "kotlin.Double" to Names.Runtime.MutableDoubleStateOf,
-    )
+    private val replacements =
+        mapOf(
+            "kotlin.Int" to Names.Runtime.MutableIntStateOf,
+            "kotlin.Long" to Names.Runtime.MutableLongStateOf,
+            "kotlin.Float" to Names.Runtime.MutableFloatStateOf,
+            "kotlin.Double" to Names.Runtime.MutableDoubleStateOf,
+        )
 
     override fun getApplicableMethodNames() = listOf(Names.Runtime.MutableStateOf.shortName)
 
@@ -90,33 +90,36 @@
         node: UCallExpression,
         replacementFunction: Name
     ): LintFix {
-        val fixes = listOfNotNull(
-            // Replace the function name
-            LintFix.create()
-                .replace()
-                .range(context.getNameLocation(node))
-                .with(replacementFunction.javaFqn)
-                .shortenNames(true)
-                .build(),
+        val fixes =
+            listOfNotNull(
+                // Replace the function name
+                LintFix.create()
+                    .replace()
+                    .range(context.getNameLocation(node))
+                    .with(replacementFunction.javaFqn)
+                    .shortenNames(true)
+                    .build(),
 
-            // Remove the type arguments list (if present)
-            context.getLocationOfTypeArguments(node)
-                ?.let { LintFix.create().replace().range(it).with("").build() },
+                // Remove the type arguments list (if present)
+                context.getLocationOfTypeArguments(node)?.let {
+                    LintFix.create().replace().range(it).with("").build()
+                },
 
-            // Remove the SnapshotMutationPolicy argument (if present)
-            context.getLocationOfArgumentsList(node)
-                ?.takeIf { node.getArgumentForParameter(MUTATION_POLICY_PARAM_IDX) != null }
-                ?.let { argsListLocation ->
-                    node.getArgumentForParameter(VALUE_PARAM_IDX)?.sourcePsi?.text
-                        ?.let { valueArg ->
+                // Remove the SnapshotMutationPolicy argument (if present)
+                context
+                    .getLocationOfArgumentsList(node)
+                    ?.takeIf { node.getArgumentForParameter(MUTATION_POLICY_PARAM_IDX) != null }
+                    ?.let { argsListLocation ->
+                        node.getArgumentForParameter(VALUE_PARAM_IDX)?.sourcePsi?.text?.let {
+                            valueArg ->
                             LintFix.create()
                                 .replace()
                                 .range(argsListLocation)
                                 .with("($valueArg)")
                                 .build()
                         }
-                }
-        )
+                    }
+            )
 
         return LintFix.create()
             .name("Replace with ${replacementFunction.shortName}")
@@ -124,20 +127,18 @@
     }
 
     private fun JavaContext.getLocationOfTypeArguments(node: UCallExpression): Location? {
-        val typeArgsList = node.sourcePsi?.children?.firstIsInstanceOrNull<KtTypeArgumentList>()
-            ?: return null
+        val typeArgsList =
+            node.sourcePsi?.children?.firstIsInstanceOrNull<KtTypeArgumentList>() ?: return null
         return getLocation(typeArgsList)
     }
 
     private fun JavaContext.getLocationOfArgumentsList(node: UCallExpression): Location? {
-        val argsList = node.sourcePsi?.children?.firstIsInstanceOrNull<KtValueArgumentList>()
-            ?: return null
+        val argsList =
+            node.sourcePsi?.children?.firstIsInstanceOrNull<KtValueArgumentList>() ?: return null
         return getLocation(argsList)
     }
 
-    private fun getSuggestedReplacementName(
-        invocation: UCallExpression
-    ): Name? {
+    private fun getSuggestedReplacementName(invocation: UCallExpression): Name? {
         if (!usesStructuralEqualityPolicy(invocation)) return null
 
         val sourcePsi = invocation.sourcePsi as? KtElement ?: return null
@@ -156,16 +157,17 @@
         }
     }
 
-    private fun usesStructuralEqualityPolicy(
-        invocation: UCallExpression
-    ): Boolean {
-        val policyExpr = invocation.valueArguments.getOrNull(MUTATION_POLICY_PARAM_IDX)
-            ?.skipParenthesizedExprDown()
-            ?: return true // No argument passed; we're using the default policy
+    private fun usesStructuralEqualityPolicy(invocation: UCallExpression): Boolean {
+        val policyExpr =
+            invocation.valueArguments
+                .getOrNull(MUTATION_POLICY_PARAM_IDX)
+                ?.skipParenthesizedExprDown()
+                ?: return true // No argument passed; we're using the default policy
 
-        val policyMethod = (policyExpr as? UCallExpression)?.resolve()
-            ?: return false // Argument isn't a direct function call. Assume it's a more complex
-                            // policy, or isn't always the structural equality policy.
+        val policyMethod =
+            (policyExpr as? UCallExpression)?.resolve()
+                ?: return false // Argument isn't a direct function call. Assume it's a more complex
+        // policy, or isn't always the structural equality policy.
 
         return policyMethod.isInPackageName(Names.Runtime.PackageName) &&
             policyMethod.name == Names.Runtime.StructuralEqualityPolicy.shortName
@@ -175,25 +177,31 @@
         private const val VALUE_PARAM_IDX = 0
         private const val MUTATION_POLICY_PARAM_IDX = 1
 
-        val AutoboxingStateCreation = Issue.create(
-            id = "AutoboxingStateCreation",
-            briefDescription = "`State<T>` will autobox values assigned to this state. " +
-                "Use a specialized state type instead.",
-            explanation = "Calling `mutableStateOf<T>()` when `T` is either backed by a " +
-                "primitive type on the JVM or is a value class results in a state implementation " +
-                "that requires all state values to be boxed. This usually causes an additional " +
-                "allocation for each state write, and adds some additional work to auto-unbox " +
-                "values when reading the value of the state. Instead, prefer to use a " +
-                "specialized primitive state implementation for `Int`, `Long`, `Float`, and " +
-                "`Double` when the state does not need to track null values and does not " +
-                "override the default `SnapshotMutationPolicy`. See `mutableIntStateOf()`, " +
-                "`mutableLongStateOf()`, `mutableFloatStateOf()`, and `mutableDoubleStateOf()` " +
-                "for more information.",
-            category = Category.PERFORMANCE, priority = 3, severity = Severity.INFORMATIONAL,
-            implementation = Implementation(
-                AutoboxingStateCreationDetector::class.java,
-                EnumSet.of(Scope.JAVA_FILE)
+        val AutoboxingStateCreation =
+            Issue.create(
+                id = "AutoboxingStateCreation",
+                briefDescription =
+                    "`State<T>` will autobox values assigned to this state. " +
+                        "Use a specialized state type instead.",
+                explanation =
+                    "Calling `mutableStateOf<T>()` when `T` is either backed by a " +
+                        "primitive type on the JVM or is a value class results in a state implementation " +
+                        "that requires all state values to be boxed. This usually causes an additional " +
+                        "allocation for each state write, and adds some additional work to auto-unbox " +
+                        "values when reading the value of the state. Instead, prefer to use a " +
+                        "specialized primitive state implementation for `Int`, `Long`, `Float`, and " +
+                        "`Double` when the state does not need to track null values and does not " +
+                        "override the default `SnapshotMutationPolicy`. See `mutableIntStateOf()`, " +
+                        "`mutableLongStateOf()`, `mutableFloatStateOf()`, and `mutableDoubleStateOf()` " +
+                        "for more information.",
+                category = Category.PERFORMANCE,
+                priority = 3,
+                severity = Severity.INFORMATIONAL,
+                implementation =
+                    Implementation(
+                        AutoboxingStateCreationDetector::class.java,
+                        EnumSet.of(Scope.JAVA_FILE)
+                    )
             )
-        )
     }
 }
diff --git a/compose/runtime/runtime-lint/src/main/java/androidx/compose/runtime/lint/AutoboxingStateValuePropertyDetector.kt b/compose/runtime/runtime-lint/src/main/java/androidx/compose/runtime/lint/AutoboxingStateValuePropertyDetector.kt
index 5503a4b..04655ee 100644
--- a/compose/runtime/runtime-lint/src/main/java/androidx/compose/runtime/lint/AutoboxingStateValuePropertyDetector.kt
+++ b/compose/runtime/runtime-lint/src/main/java/androidx/compose/runtime/lint/AutoboxingStateValuePropertyDetector.kt
@@ -63,11 +63,12 @@
         val preferredPropertyName =
             annotationInfo.annotation.preferredPropertyName ?: "<unknown replacement>"
 
-        val accessKind = when (element.resolvedName?.takeWhile { it.isLowerCase() }) {
-            "get" -> "Reading"
-            "set" -> "Assigning"
-            else -> "Accessing"
-        }
+        val accessKind =
+            when (element.resolvedName?.takeWhile { it.isLowerCase() }) {
+                "get" -> "Reading"
+                "set" -> "Assigning"
+                else -> "Accessing"
+            }
 
         context.report(
             AutoboxingStateValueProperty,
@@ -86,7 +87,8 @@
         resolvedPropertyName: String,
         preferredPropertyName: String
     ): LintFix {
-        return fix().name("Replace with `$preferredPropertyName`")
+        return fix()
+            .name("Replace with `$preferredPropertyName`")
             .replace()
             .text(resolvedPropertyName)
             .with(preferredPropertyName)
@@ -95,19 +97,22 @@
 
     companion object {
 
-        val AutoboxingStateValueProperty = Issue.create(
-            "AutoboxingStateValueProperty",
-            "State access causes value to be autoboxed",
-            "Avoid using the generic `value` property when using a specialized State type. " +
-                "Reading or writing to the state's generic `value` property will result in an " +
-                "unnecessary autoboxing operation. Prefer the specialized value property " +
-                "(e.g. `intValue` for `MutableIntState`), or use property delegation to " +
-                "avoid unnecessary allocations.",
-            Category.PERFORMANCE, 3, Severity.WARNING,
-            Implementation(
-                AutoboxingStateValuePropertyDetector::class.java,
-                EnumSet.of(Scope.JAVA_FILE, Scope.TEST_SOURCES)
+        val AutoboxingStateValueProperty =
+            Issue.create(
+                "AutoboxingStateValueProperty",
+                "State access causes value to be autoboxed",
+                "Avoid using the generic `value` property when using a specialized State type. " +
+                    "Reading or writing to the state's generic `value` property will result in an " +
+                    "unnecessary autoboxing operation. Prefer the specialized value property " +
+                    "(e.g. `intValue` for `MutableIntState`), or use property delegation to " +
+                    "avoid unnecessary allocations.",
+                Category.PERFORMANCE,
+                3,
+                Severity.WARNING,
+                Implementation(
+                    AutoboxingStateValuePropertyDetector::class.java,
+                    EnumSet.of(Scope.JAVA_FILE, Scope.TEST_SOURCES)
+                )
             )
-        )
     }
 }
diff --git a/compose/runtime/runtime-lint/src/main/java/androidx/compose/runtime/lint/ComposableCoroutineCreationDetector.kt b/compose/runtime/runtime-lint/src/main/java/androidx/compose/runtime/lint/ComposableCoroutineCreationDetector.kt
index 373c6f1..8e98e54 100644
--- a/compose/runtime/runtime-lint/src/main/java/androidx/compose/runtime/lint/ComposableCoroutineCreationDetector.kt
+++ b/compose/runtime/runtime-lint/src/main/java/androidx/compose/runtime/lint/ComposableCoroutineCreationDetector.kt
@@ -35,20 +35,23 @@
 import org.jetbrains.uast.UCallExpression
 
 /**
- * [Detector] that checks `async` and `launch` calls to make sure they don't happen inside the
- * body of a composable function / lambda.
+ * [Detector] that checks `async` and `launch` calls to make sure they don't happen inside the body
+ * of a composable function / lambda.
  */
 class ComposableCoroutineCreationDetector : Detector(), SourceCodeScanner {
-    override fun getApplicableMethodNames() = listOf(
-        Async.shortName,
-        Launch.shortName,
-        LaunchIn.shortName,
-    )
+    override fun getApplicableMethodNames() =
+        listOf(
+            Async.shortName,
+            Launch.shortName,
+            LaunchIn.shortName,
+        )
 
     override fun visitMethodCall(context: JavaContext, node: UCallExpression, method: PsiMethod) {
-        if (!(method.isInPackageName(CoroutinePackageName) ||
+        if (
+            !(method.isInPackageName(CoroutinePackageName) ||
                 method.isInPackageName(FlowPackageName))
-        ) return
+        )
+            return
 
         if (node.isInvokedWithinComposable()) {
             context.report(
@@ -62,23 +65,26 @@
     }
 
     companion object {
-        val CoroutineCreationDuringComposition = Issue.create(
-            "CoroutineCreationDuringComposition",
-            "Calls to `async` or `launch` should happen inside a LaunchedEffect and not " +
-                "composition",
-            "Creating a coroutine with `async` or `launch` during composition is often incorrect " +
-                "- this means that a coroutine will be created even if the composition fails / is" +
-                " rolled back, and it also means that multiple coroutines could end up mutating " +
-                "the same state, causing inconsistent results. Instead, use `LaunchedEffect` and " +
-                "create coroutines inside the suspending block. The block will only run after a " +
-                "successful composition, and will cancel existing coroutines when `key` changes, " +
-                "allowing correct cleanup.",
-            Category.CORRECTNESS, 3, Severity.ERROR,
-            Implementation(
-                ComposableCoroutineCreationDetector::class.java,
-                EnumSet.of(Scope.JAVA_FILE, Scope.TEST_SOURCES)
+        val CoroutineCreationDuringComposition =
+            Issue.create(
+                "CoroutineCreationDuringComposition",
+                "Calls to `async` or `launch` should happen inside a LaunchedEffect and not " +
+                    "composition",
+                "Creating a coroutine with `async` or `launch` during composition is often incorrect " +
+                    "- this means that a coroutine will be created even if the composition fails / is" +
+                    " rolled back, and it also means that multiple coroutines could end up mutating " +
+                    "the same state, causing inconsistent results. Instead, use `LaunchedEffect` and " +
+                    "create coroutines inside the suspending block. The block will only run after a " +
+                    "successful composition, and will cancel existing coroutines when `key` changes, " +
+                    "allowing correct cleanup.",
+                Category.CORRECTNESS,
+                3,
+                Severity.ERROR,
+                Implementation(
+                    ComposableCoroutineCreationDetector::class.java,
+                    EnumSet.of(Scope.JAVA_FILE, Scope.TEST_SOURCES)
+                )
             )
-        )
     }
 }
 
diff --git a/compose/runtime/runtime-lint/src/main/java/androidx/compose/runtime/lint/ComposableFlowOperatorDetector.kt b/compose/runtime/runtime-lint/src/main/java/androidx/compose/runtime/lint/ComposableFlowOperatorDetector.kt
index bf2a594..c13b3324 100644
--- a/compose/runtime/runtime-lint/src/main/java/androidx/compose/runtime/lint/ComposableFlowOperatorDetector.kt
+++ b/compose/runtime/runtime-lint/src/main/java/androidx/compose/runtime/lint/ComposableFlowOperatorDetector.kt
@@ -47,51 +47,55 @@
  * happen inside the body of a composable function / lambda. This detector defines an operator
  * function as any function with a receiver of Flow, and a return type of Flow, such as:
  *
- * fun <T, R> Flow<T>.map(crossinline transform: suspend (value: T) -> R): Flow<R>
- * fun <T> Flow<T>.drop(count: Int): Flow<T>
+ * fun <T, R> Flow<T>.map(crossinline transform: suspend (value: T) -> R): Flow<R> fun <T>
+ * Flow<T>.drop(count: Int): Flow<T>
  */
 class ComposableFlowOperatorDetector : Detector(), SourceCodeScanner {
     override fun getApplicableUastTypes() = listOf(UCallExpression::class.java)
 
-    override fun createUastHandler(context: JavaContext) = object : UElementHandler() {
-        override fun visitCallExpression(node: UCallExpression) {
-            val method = node.resolveToUElement() as? UMethod ?: return
-            val receiverType = node.receiverType
+    override fun createUastHandler(context: JavaContext) =
+        object : UElementHandler() {
+            override fun visitCallExpression(node: UCallExpression) {
+                val method = node.resolveToUElement() as? UMethod ?: return
+                val receiverType = node.receiverType
 
-            // We are calling a method on a `Flow` type, and the method is an operator function
-            if (receiverType?.inheritsFrom(FlowName) == true && method.isFlowOperator()) {
-                if (node.isInvokedWithinComposable()) {
-                    context.report(
-                        FlowOperatorInvokedInComposition,
-                        node,
-                        context.getNameLocation(node),
-                        "Flow operator functions should not be invoked within composition"
-                    )
+                // We are calling a method on a `Flow` type, and the method is an operator function
+                if (receiverType?.inheritsFrom(FlowName) == true && method.isFlowOperator()) {
+                    if (node.isInvokedWithinComposable()) {
+                        context.report(
+                            FlowOperatorInvokedInComposition,
+                            node,
+                            context.getNameLocation(node),
+                            "Flow operator functions should not be invoked within composition"
+                        )
+                    }
                 }
             }
         }
-    }
 
     companion object {
-        val FlowOperatorInvokedInComposition = Issue.create(
-            "FlowOperatorInvokedInComposition",
-            "Flow operator functions should not be invoked within composition",
-            "Calling a Flow operator function within composition will result in a new " +
-                "Flow being created every recomposition, which will reset collectAsState() and " +
-                "cause other related problems. Instead Flow operators should be called inside " +
-                "`remember`, or a side effect such as LaunchedEffect.",
-            Category.CORRECTNESS, 3, Severity.ERROR,
-            Implementation(
-                ComposableFlowOperatorDetector::class.java,
-                EnumSet.of(Scope.JAVA_FILE, Scope.TEST_SOURCES)
+        val FlowOperatorInvokedInComposition =
+            Issue.create(
+                "FlowOperatorInvokedInComposition",
+                "Flow operator functions should not be invoked within composition",
+                "Calling a Flow operator function within composition will result in a new " +
+                    "Flow being created every recomposition, which will reset collectAsState() and " +
+                    "cause other related problems. Instead Flow operators should be called inside " +
+                    "`remember`, or a side effect such as LaunchedEffect.",
+                Category.CORRECTNESS,
+                3,
+                Severity.ERROR,
+                Implementation(
+                    ComposableFlowOperatorDetector::class.java,
+                    EnumSet.of(Scope.JAVA_FILE, Scope.TEST_SOURCES)
+                )
             )
-        )
     }
 }
 
 /**
- * @return whether this [UMethod] is an extension function with a receiver of Flow, and a
- * return type of Flow
+ * @return whether this [UMethod] is an extension function with a receiver of Flow, and a return
+ *   type of Flow
  */
 private fun UMethod.isFlowOperator(): Boolean {
     // Whether this method returns Flow
@@ -108,8 +112,8 @@
         // Parsing Kotlin source
         is KtNamedFunction -> {
             val receiver = source.receiverTypeReference
-            (receiver.toUElement() as? UTypeReferenceExpression)
-                ?.getQualifiedName() == FlowName.javaFqn
+            (receiver.toUElement() as? UTypeReferenceExpression)?.getQualifiedName() ==
+                FlowName.javaFqn
         }
         // Should never happen, safe return if it does
         else -> false
diff --git a/compose/runtime/runtime-lint/src/main/java/androidx/compose/runtime/lint/ComposableLambdaParameterDetector.kt b/compose/runtime/runtime-lint/src/main/java/androidx/compose/runtime/lint/ComposableLambdaParameterDetector.kt
index 5993c93..4a3af89 100644
--- a/compose/runtime/runtime-lint/src/main/java/androidx/compose/runtime/lint/ComposableLambdaParameterDetector.kt
+++ b/compose/runtime/runtime-lint/src/main/java/androidx/compose/runtime/lint/ComposableLambdaParameterDetector.kt
@@ -39,8 +39,8 @@
 import org.jetbrains.uast.UParameter
 
 /**
- * [Detector] that checks composable lambda parameters inside composable functions for
- * consistency with guidelines.
+ * [Detector] that checks composable lambda parameters inside composable functions for consistency
+ * with guidelines.
  *
  * Composable functions that have exactly one composable lambda parameter must:
  * - name this parameter `content`
@@ -49,120 +49,133 @@
 class ComposableLambdaParameterDetector : Detector(), SourceCodeScanner {
     override fun getApplicableUastTypes() = listOf(UMethod::class.java)
 
-    override fun createUastHandler(context: JavaContext) = object : UElementHandler() {
-        override fun visitMethod(node: UMethod) {
-            // Ignore non-composable functions
-            if (!node.isComposable) return
+    override fun createUastHandler(context: JavaContext) =
+        object : UElementHandler() {
+            override fun visitMethod(node: UMethod) {
+                // Ignore non-composable functions
+                if (!node.isComposable) return
 
-            // Ignore non-unit composable functions
-            if (!node.returnsUnit) return
+                // Ignore non-unit composable functions
+                if (!node.returnsUnit) return
 
-            /**
-             * Small class to hold information from lambda properties needed for lint checks.
-             */
-            class ComposableLambdaParameterInfo(
-                val parameter: UParameter,
-                val functionType: KtFunctionType
-            )
+                /**
+                 * Small class to hold information from lambda properties needed for lint checks.
+                 */
+                class ComposableLambdaParameterInfo(
+                    val parameter: UParameter,
+                    val functionType: KtFunctionType
+                )
 
-            // Filter all parameters to only contain composable lambda parameters
-            val composableLambdaParameters = node.uastParameters.mapNotNull { parameter ->
-                // If it is not a KtParameter, it could be the implicit receiver 'parameter' for
-                // an extension function - just ignore it.
-                val ktParameter = parameter.sourcePsi as? KtParameter ?: return@mapNotNull null
+                // Filter all parameters to only contain composable lambda parameters
+                val composableLambdaParameters =
+                    node.uastParameters.mapNotNull { parameter ->
+                        // If it is not a KtParameter, it could be the implicit receiver 'parameter'
+                        // for
+                        // an extension function - just ignore it.
+                        val ktParameter =
+                            parameter.sourcePsi as? KtParameter ?: return@mapNotNull null
 
-                val isComposable = parameter.isComposable
+                        val isComposable = parameter.isComposable
 
-                val functionType = when (val type = ktParameter.typeReference!!.typeElement) {
-                    is KtFunctionType -> type
-                    is KtNullableType -> type.innerType as? KtFunctionType
-                    else -> null
+                        val functionType =
+                            when (val type = ktParameter.typeReference!!.typeElement) {
+                                is KtFunctionType -> type
+                                is KtNullableType -> type.innerType as? KtFunctionType
+                                else -> null
+                            }
+
+                        if (functionType != null && isComposable) {
+                            ComposableLambdaParameterInfo(parameter, functionType)
+                        } else {
+                            null
+                        }
+                    }
+
+                // Only look at functions with exactly 1 composable lambda parameter. This detector
+                // does not apply to functions with no composable lambda parameters, and there isn't
+                // an easily lintable rule for functions with multiple.
+                if (composableLambdaParameters.size != 1) return
+
+                val parameterInfo = composableLambdaParameters.first()
+
+                val parameter = parameterInfo.parameter
+
+                val name = parameter.name
+
+                // Need to strongly type this or else Kotlinc cannot resolve overloads for
+                // getNameLocation
+                val uElement: UElement = parameter
+
+                // Ignore composable lambda parameters with parameters, such as
+                // itemContent: @Composable (item: T) -> Unit - in this case content is not required
+                // as a name and more semantically meaningful names such as `itemContent` are
+                // preferred.
+                if (name != "content" && parameterInfo.functionType.parameters.isEmpty()) {
+                    context.report(
+                        ComposableLambdaParameterNaming,
+                        uElement,
+                        context.getNameLocation(uElement),
+                        "Composable lambda parameter should be named `content`",
+                        LintFix.create()
+                            .replace()
+                            .name("Rename $name to content")
+                            .text(name)
+                            .with("content")
+                            .autoFix()
+                            .build()
+                    )
                 }
 
-                if (functionType != null && isComposable) {
-                    ComposableLambdaParameterInfo(parameter, functionType)
-                } else {
-                    null
+                if (parameter !== node.uastParameters.last()) {
+                    context.report(
+                        ComposableLambdaParameterPosition,
+                        uElement,
+                        context.getNameLocation(uElement),
+                        "Composable lambda parameter should be the last parameter so it can be used " +
+                            "as a trailing lambda"
+                        // Hard to make a lint fix for this and keep parameter formatting, so ignore
+                        // it
+                    )
                 }
             }
-
-            // Only look at functions with exactly 1 composable lambda parameter. This detector
-            // does not apply to functions with no composable lambda parameters, and there isn't
-            // an easily lintable rule for functions with multiple.
-            if (composableLambdaParameters.size != 1) return
-
-            val parameterInfo = composableLambdaParameters.first()
-
-            val parameter = parameterInfo.parameter
-
-            val name = parameter.name
-
-            // Need to strongly type this or else Kotlinc cannot resolve overloads for
-            // getNameLocation
-            val uElement: UElement = parameter
-
-            // Ignore composable lambda parameters with parameters, such as
-            // itemContent: @Composable (item: T) -> Unit - in this case content is not required
-            // as a name and more semantically meaningful names such as `itemContent` are preferred.
-            if (name != "content" && parameterInfo.functionType.parameters.isEmpty()) {
-                context.report(
-                    ComposableLambdaParameterNaming,
-                    uElement,
-                    context.getNameLocation(uElement),
-                    "Composable lambda parameter should be named `content`",
-                    LintFix.create()
-                        .replace()
-                        .name("Rename $name to content")
-                        .text(name)
-                        .with("content")
-                        .autoFix()
-                        .build()
-                )
-            }
-
-            if (parameter !== node.uastParameters.last()) {
-                context.report(
-                    ComposableLambdaParameterPosition,
-                    uElement,
-                    context.getNameLocation(uElement),
-                    "Composable lambda parameter should be the last parameter so it can be used " +
-                        "as a trailing lambda"
-                    // Hard to make a lint fix for this and keep parameter formatting, so ignore it
-                )
-            }
         }
-    }
 
     companion object {
-        val ComposableLambdaParameterNaming = Issue.create(
-            id = "ComposableLambdaParameterNaming",
-            briefDescription = "Primary composable lambda parameter not named `content`",
-            explanation = "Composable functions with only one composable lambda parameter should " +
-                "use the name `content` for the parameter.",
-            category = Category.CORRECTNESS,
-            priority = 3,
-            severity = Severity.WARNING,
-            enabledByDefault = false,
-            implementation = Implementation(
-                ComposableLambdaParameterDetector::class.java,
-                EnumSet.of(Scope.JAVA_FILE, Scope.TEST_SOURCES)
+        val ComposableLambdaParameterNaming =
+            Issue.create(
+                id = "ComposableLambdaParameterNaming",
+                briefDescription = "Primary composable lambda parameter not named `content`",
+                explanation =
+                    "Composable functions with only one composable lambda parameter should " +
+                        "use the name `content` for the parameter.",
+                category = Category.CORRECTNESS,
+                priority = 3,
+                severity = Severity.WARNING,
+                enabledByDefault = false,
+                implementation =
+                    Implementation(
+                        ComposableLambdaParameterDetector::class.java,
+                        EnumSet.of(Scope.JAVA_FILE, Scope.TEST_SOURCES)
+                    )
             )
-        )
 
-        val ComposableLambdaParameterPosition = Issue.create(
-            id = "ComposableLambdaParameterPosition",
-            briefDescription = "Non-trailing primary composable lambda parameter",
-            explanation = "Composable functions with only one composable lambda parameter should " +
-                "place the parameter at the end of the parameter list, so it can be used as a " +
-                "trailing lambda.",
-            category = Category.CORRECTNESS,
-            priority = 3,
-            severity = Severity.WARNING,
-            enabledByDefault = false,
-            implementation = Implementation(
-                ComposableLambdaParameterDetector::class.java,
-                EnumSet.of(Scope.JAVA_FILE, Scope.TEST_SOURCES)
+        val ComposableLambdaParameterPosition =
+            Issue.create(
+                id = "ComposableLambdaParameterPosition",
+                briefDescription = "Non-trailing primary composable lambda parameter",
+                explanation =
+                    "Composable functions with only one composable lambda parameter should " +
+                        "place the parameter at the end of the parameter list, so it can be used as a " +
+                        "trailing lambda.",
+                category = Category.CORRECTNESS,
+                priority = 3,
+                severity = Severity.WARNING,
+                enabledByDefault = false,
+                implementation =
+                    Implementation(
+                        ComposableLambdaParameterDetector::class.java,
+                        EnumSet.of(Scope.JAVA_FILE, Scope.TEST_SOURCES)
+                    )
             )
-        )
     }
 }
diff --git a/compose/runtime/runtime-lint/src/main/java/androidx/compose/runtime/lint/ComposableNamingDetector.kt b/compose/runtime/runtime-lint/src/main/java/androidx/compose/runtime/lint/ComposableNamingDetector.kt
index 9aca2b4..06e0ccb 100644
--- a/compose/runtime/runtime-lint/src/main/java/androidx/compose/runtime/lint/ComposableNamingDetector.kt
+++ b/compose/runtime/runtime-lint/src/main/java/androidx/compose/runtime/lint/ComposableNamingDetector.kt
@@ -36,86 +36,90 @@
 
 /**
  * [Detector] that checks the naming of @Composable functions for consistency with guidelines.
- *
  * - @Composable functions that return Unit should follow typical class naming (PascalCase)
  * - @Composable functions with a return type should follow typical function naming (camelCase)
  */
 class ComposableNamingDetector : Detector(), SourceCodeScanner {
     override fun getApplicableUastTypes() = listOf(UMethod::class.java)
 
-    override fun createUastHandler(context: JavaContext) = object : UElementHandler() {
-        override fun visitMethod(node: UMethod) {
-            // Ignore non-composable functions
-            if (!node.isComposable) return
+    override fun createUastHandler(context: JavaContext) =
+        object : UElementHandler() {
+            override fun visitMethod(node: UMethod) {
+                // Ignore non-composable functions
+                if (!node.isComposable) return
 
-            // Ignore operator functions as their name is case sensitive and cannot be changed
-            if (context.evaluator.isOperator(node)) return
+                // Ignore operator functions as their name is case sensitive and cannot be changed
+                if (context.evaluator.isOperator(node)) return
 
-            // Ignore overrides as the check will flag the base function. This also ignores a
-            // special case where a generic return type and a Unit type parameter is used.
-            if (node.findSuperMethods().isNotEmpty()) return
+                // Ignore overrides as the check will flag the base function. This also ignores a
+                // special case where a generic return type and a Unit type parameter is used.
+                if (node.findSuperMethods().isNotEmpty()) return
 
-            val name = node.name
+                val name = node.name
 
-            val capitalizedFunctionName = name.first().isUpperCase()
+                val capitalizedFunctionName = name.first().isUpperCase()
 
-            if (node.returnsUnit) {
-                if (!capitalizedFunctionName) {
-                    val capitalizedName = name.replaceFirstChar {
-                        if (it.isLowerCase()) it.titlecase(
-                            Locale.getDefault()
-                        ) else it.toString()
+                if (node.returnsUnit) {
+                    if (!capitalizedFunctionName) {
+                        val capitalizedName =
+                            name.replaceFirstChar {
+                                if (it.isLowerCase()) it.titlecase(Locale.getDefault())
+                                else it.toString()
+                            }
+                        context.report(
+                            ComposableNaming,
+                            node,
+                            context.getNameLocation(node),
+                            "Composable functions that return Unit should start with an " +
+                                "uppercase letter",
+                            LintFix.create()
+                                .replace()
+                                .name("Change to $capitalizedName")
+                                .text(name)
+                                .with(capitalizedName)
+                                .autoFix()
+                                .build()
+                        )
                     }
-                    context.report(
-                        ComposableNaming,
-                        node,
-                        context.getNameLocation(node),
-                        "Composable functions that return Unit should start with an " +
-                            "uppercase letter",
-                        LintFix.create()
-                            .replace()
-                            .name("Change to $capitalizedName")
-                            .text(name)
-                            .with(capitalizedName)
-                            .autoFix()
-                            .build()
-                    )
-                }
-            } else {
-                if (capitalizedFunctionName) {
-                    val lowercaseName = name.replaceFirstChar { it.lowercase(Locale.getDefault()) }
-                    context.report(
-                        ComposableNaming,
-                        node,
-                        context.getNameLocation(node),
-                        "Composable functions with a return type should start with a " +
-                            "lowercase letter",
-                        LintFix.create()
-                            .replace()
-                            .name("Change to $lowercaseName")
-                            .text(name)
-                            .with(lowercaseName)
-                            .autoFix()
-                            .build()
-                    )
+                } else {
+                    if (capitalizedFunctionName) {
+                        val lowercaseName =
+                            name.replaceFirstChar { it.lowercase(Locale.getDefault()) }
+                        context.report(
+                            ComposableNaming,
+                            node,
+                            context.getNameLocation(node),
+                            "Composable functions with a return type should start with a " +
+                                "lowercase letter",
+                            LintFix.create()
+                                .replace()
+                                .name("Change to $lowercaseName")
+                                .text(name)
+                                .with(lowercaseName)
+                                .autoFix()
+                                .build()
+                        )
+                    }
                 }
             }
         }
-    }
 
     companion object {
-        val ComposableNaming = Issue.create(
-            "ComposableNaming",
-            "Incorrect naming for @Composable functions",
-            "@Composable functions without a return type should use similar naming to " +
-                "classes, starting with an uppercase letter and ending with a noun. @Composable " +
-                "functions with a return type should be treated as normal Kotlin functions, " +
-                "starting with a lowercase letter.",
-            Category.CORRECTNESS, 3, Severity.WARNING,
-            Implementation(
-                ComposableNamingDetector::class.java,
-                EnumSet.of(Scope.JAVA_FILE, Scope.TEST_SOURCES)
+        val ComposableNaming =
+            Issue.create(
+                "ComposableNaming",
+                "Incorrect naming for @Composable functions",
+                "@Composable functions without a return type should use similar naming to " +
+                    "classes, starting with an uppercase letter and ending with a noun. @Composable " +
+                    "functions with a return type should be treated as normal Kotlin functions, " +
+                    "starting with a lowercase letter.",
+                Category.CORRECTNESS,
+                3,
+                Severity.WARNING,
+                Implementation(
+                    ComposableNamingDetector::class.java,
+                    EnumSet.of(Scope.JAVA_FILE, Scope.TEST_SOURCES)
+                )
             )
-        )
     }
 }
diff --git a/compose/runtime/runtime-lint/src/main/java/androidx/compose/runtime/lint/ComposableStateFlowValueDetector.kt b/compose/runtime/runtime-lint/src/main/java/androidx/compose/runtime/lint/ComposableStateFlowValueDetector.kt
index ce42adb..0d89fe2 100644
--- a/compose/runtime/runtime-lint/src/main/java/androidx/compose/runtime/lint/ComposableStateFlowValueDetector.kt
+++ b/compose/runtime/runtime-lint/src/main/java/androidx/compose/runtime/lint/ComposableStateFlowValueDetector.kt
@@ -37,44 +37,48 @@
 import org.jetbrains.uast.tryResolve
 
 /**
- * [Detector] that checks calls to StateFlow.value to make sure they don't happen inside the body
- * of a composable function / lambda.
+ * [Detector] that checks calls to StateFlow.value to make sure they don't happen inside the body of
+ * a composable function / lambda.
  */
 class ComposableStateFlowValueDetector : Detector(), SourceCodeScanner {
     override fun getApplicableUastTypes() = listOf(USimpleNameReferenceExpression::class.java)
 
-    override fun createUastHandler(context: JavaContext) = object : UElementHandler() {
-        override fun visitSimpleNameReferenceExpression(node: USimpleNameReferenceExpression) {
-            // Look for a call to .value that comes from StateFlow
-            if (node.identifier != "value") return
-            val method = node.tryResolve() as? PsiMethod ?: return
-            if (method.containingClass?.inheritsFrom(StateFlowName) == true) {
-                if (node.isInvokedWithinComposable()) {
-                    context.report(
-                        StateFlowValueCalledInComposition,
-                        node,
-                        context.getNameLocation(node),
-                        "StateFlow.value should not be called within composition"
-                    )
+    override fun createUastHandler(context: JavaContext) =
+        object : UElementHandler() {
+            override fun visitSimpleNameReferenceExpression(node: USimpleNameReferenceExpression) {
+                // Look for a call to .value that comes from StateFlow
+                if (node.identifier != "value") return
+                val method = node.tryResolve() as? PsiMethod ?: return
+                if (method.containingClass?.inheritsFrom(StateFlowName) == true) {
+                    if (node.isInvokedWithinComposable()) {
+                        context.report(
+                            StateFlowValueCalledInComposition,
+                            node,
+                            context.getNameLocation(node),
+                            "StateFlow.value should not be called within composition"
+                        )
+                    }
                 }
             }
         }
-    }
 
     companion object {
-        val StateFlowValueCalledInComposition = Issue.create(
-            "StateFlowValueCalledInComposition",
-            "StateFlow.value should not be called within composition",
-            "Calling StateFlow.value within composition will not observe changes to the " +
-                "StateFlow, so changes might not be reflected within the composition. Instead " +
-                "you should use stateFlow.collectAsState() to observe changes to the StateFlow, " +
-                "and recompose when it changes.",
-            Category.CORRECTNESS, 3, Severity.ERROR,
-            Implementation(
-                ComposableStateFlowValueDetector::class.java,
-                EnumSet.of(Scope.JAVA_FILE, Scope.TEST_SOURCES)
+        val StateFlowValueCalledInComposition =
+            Issue.create(
+                "StateFlowValueCalledInComposition",
+                "StateFlow.value should not be called within composition",
+                "Calling StateFlow.value within composition will not observe changes to the " +
+                    "StateFlow, so changes might not be reflected within the composition. Instead " +
+                    "you should use stateFlow.collectAsState() to observe changes to the StateFlow, " +
+                    "and recompose when it changes.",
+                Category.CORRECTNESS,
+                3,
+                Severity.ERROR,
+                Implementation(
+                    ComposableStateFlowValueDetector::class.java,
+                    EnumSet.of(Scope.JAVA_FILE, Scope.TEST_SOURCES)
+                )
             )
-        )
     }
 }
 
diff --git a/compose/runtime/runtime-lint/src/main/java/androidx/compose/runtime/lint/CompositionLocalNamingDetector.kt b/compose/runtime/runtime-lint/src/main/java/androidx/compose/runtime/lint/CompositionLocalNamingDetector.kt
index dee4098..50752d3 100644
--- a/compose/runtime/runtime-lint/src/main/java/androidx/compose/runtime/lint/CompositionLocalNamingDetector.kt
+++ b/compose/runtime/runtime-lint/src/main/java/androidx/compose/runtime/lint/CompositionLocalNamingDetector.kt
@@ -39,51 +39,55 @@
 /**
  * [Detector] that checks the naming of CompositionLocal properties for consistency with guidelines.
  *
- * CompositionLocal properties should be prefixed with `Local` to make it clear that their value
- * is local to the current composition.
+ * CompositionLocal properties should be prefixed with `Local` to make it clear that their value is
+ * local to the current composition.
  */
 class CompositionLocalNamingDetector : Detector(), SourceCodeScanner {
     override fun getApplicableUastTypes() = listOf(UVariable::class.java)
 
-    override fun createUastHandler(context: JavaContext) = object : UElementHandler() {
-        override fun visitVariable(node: UVariable) {
-            // Ignore parameters of type CompositionLocal
-            if (node is UParameter) return
-            if (node.sourcePsi is KtParameter) return
-            // Ignore local properties
-            if ((node.sourcePsi as? KtProperty)?.isLocal == true) return
+    override fun createUastHandler(context: JavaContext) =
+        object : UElementHandler() {
+            override fun visitVariable(node: UVariable) {
+                // Ignore parameters of type CompositionLocal
+                if (node is UParameter) return
+                if (node.sourcePsi is KtParameter) return
+                // Ignore local properties
+                if ((node.sourcePsi as? KtProperty)?.isLocal == true) return
 
-            val type = node.type
-            if (!type.inheritsFrom(Names.Runtime.CompositionLocal)) return
+                val type = node.type
+                if (!type.inheritsFrom(Names.Runtime.CompositionLocal)) return
 
-            val name = node.name
-            if (name!!.startsWith("Local", ignoreCase = true)) return
+                val name = node.name
+                if (name!!.startsWith("Local", ignoreCase = true)) return
 
-            // Kotlinc can't disambiguate overloads for report / getNameLocation otherwise
-            val uElementNode: UElement = node
+                // Kotlinc can't disambiguate overloads for report / getNameLocation otherwise
+                val uElementNode: UElement = node
 
-            context.report(
-                CompositionLocalNaming,
-                uElementNode,
-                context.getNameLocation(uElementNode),
-                "CompositionLocal properties should be prefixed with `Local`",
-            )
+                context.report(
+                    CompositionLocalNaming,
+                    uElementNode,
+                    context.getNameLocation(uElementNode),
+                    "CompositionLocal properties should be prefixed with `Local`",
+                )
+            }
         }
-    }
 
     companion object {
-        val CompositionLocalNaming = Issue.create(
-            "CompositionLocalNaming",
-            "CompositionLocal properties should be prefixed with `Local`",
-            "CompositionLocal properties should be prefixed with `Local`. This helps make " +
-                "it clear at their use site that these values are local to the current " +
-                "composition. Typically the full name will be `Local` + the type of the " +
-                "CompositionLocal, for example val LocalFoo = compositionLocalOf { Foo() }.",
-            Category.CORRECTNESS, 3, Severity.WARNING,
-            Implementation(
-                CompositionLocalNamingDetector::class.java,
-                EnumSet.of(Scope.JAVA_FILE, Scope.TEST_SOURCES)
+        val CompositionLocalNaming =
+            Issue.create(
+                "CompositionLocalNaming",
+                "CompositionLocal properties should be prefixed with `Local`",
+                "CompositionLocal properties should be prefixed with `Local`. This helps make " +
+                    "it clear at their use site that these values are local to the current " +
+                    "composition. Typically the full name will be `Local` + the type of the " +
+                    "CompositionLocal, for example val LocalFoo = compositionLocalOf { Foo() }.",
+                Category.CORRECTNESS,
+                3,
+                Severity.WARNING,
+                Implementation(
+                    CompositionLocalNamingDetector::class.java,
+                    EnumSet.of(Scope.JAVA_FILE, Scope.TEST_SOURCES)
+                )
             )
-        )
     }
 }
diff --git a/compose/runtime/runtime-lint/src/main/java/androidx/compose/runtime/lint/MutableCollectionMutableStateDetector.kt b/compose/runtime/runtime-lint/src/main/java/androidx/compose/runtime/lint/MutableCollectionMutableStateDetector.kt
index 1b650c1..d72cec3 100644
--- a/compose/runtime/runtime-lint/src/main/java/androidx/compose/runtime/lint/MutableCollectionMutableStateDetector.kt
+++ b/compose/runtime/runtime-lint/src/main/java/androidx/compose/runtime/lint/MutableCollectionMutableStateDetector.kt
@@ -45,9 +45,8 @@
  * changes.
  */
 class MutableCollectionMutableStateDetector : Detector(), SourceCodeScanner {
-    override fun getApplicableMethodNames(): List<String> = listOf(
-        Names.Runtime.MutableStateOf.shortName
-    )
+    override fun getApplicableMethodNames(): List<String> =
+        listOf(Names.Runtime.MutableStateOf.shortName)
 
     override fun visitMethodCall(context: JavaContext, node: UCallExpression, method: PsiMethod) {
         if (!method.isInPackageName(Names.Runtime.PackageName)) return
@@ -80,33 +79,34 @@
     }
 
     companion object {
-        val MutableCollectionMutableState = Issue.create(
-            "MutableCollectionMutableState",
-            "Creating a MutableState object with a mutable collection type",
-            "Writes to mutable collections inside a MutableState will not cause a " +
-                "recomposition - only writes to the MutableState itself will. In most cases you " +
-                "should either use a read-only collection (such as List or Map) and assign a new " +
-                "instance to the MutableState when your data changes, or you can use " +
-                "an snapshot-backed collection such as SnapshotStateList or SnapshotStateMap " +
-                "which will correctly cause a recomposition when their contents are modified.",
-            Category.CORRECTNESS, 3, Severity.WARNING,
-            Implementation(
-                MutableCollectionMutableStateDetector::class.java,
-                EnumSet.of(Scope.JAVA_FILE, Scope.TEST_SOURCES)
+        val MutableCollectionMutableState =
+            Issue.create(
+                "MutableCollectionMutableState",
+                "Creating a MutableState object with a mutable collection type",
+                "Writes to mutable collections inside a MutableState will not cause a " +
+                    "recomposition - only writes to the MutableState itself will. In most cases you " +
+                    "should either use a read-only collection (such as List or Map) and assign a new " +
+                    "instance to the MutableState when your data changes, or you can use " +
+                    "an snapshot-backed collection such as SnapshotStateList or SnapshotStateMap " +
+                    "which will correctly cause a recomposition when their contents are modified.",
+                Category.CORRECTNESS,
+                3,
+                Severity.WARNING,
+                Implementation(
+                    MutableCollectionMutableStateDetector::class.java,
+                    EnumSet.of(Scope.JAVA_FILE, Scope.TEST_SOURCES)
+                )
             )
-        )
     }
 }
 
 /**
- * Returns whether this type can be considered a mutable collection.
- * Returns true if this is, or this is a subclass of:
- *
+ * Returns whether this type can be considered a mutable collection. Returns true if this is, or
+ * this is a subclass of:
  * - [kotlin.collections.MutableCollection]
  * - [kotlin.collections.MutableMap]
  *
  * If not, returns false if this is, or this is a subclass of:
- *
  * - [kotlin.collections.Collection]
  * - [kotlin.collections.Map]
  *
@@ -117,20 +117,16 @@
 private fun KtAnalysisSession.isMutableCollection(ktType: KtType): Boolean {
     // MutableCollection::class.qualifiedName == Collection::class.qualifiedName, so using hardcoded
     // strings instead
-    val kotlinImmutableTypes = listOf(
-        "kotlin.collections.Collection",
-        "kotlin.collections.Map",
-    )
+    val kotlinImmutableTypes =
+        listOf(
+            "kotlin.collections.Collection",
+            "kotlin.collections.Map",
+        )
 
-    val kotlinMutableTypes = listOf(
-        "kotlin.collections.MutableCollection",
-        "kotlin.collections.MutableMap"
-    )
+    val kotlinMutableTypes =
+        listOf("kotlin.collections.MutableCollection", "kotlin.collections.MutableMap")
 
-    val javaMutableTypes = listOf(
-        "java.util.Collection",
-        "java.util.Map"
-    )
+    val javaMutableTypes = listOf("java.util.Collection", "java.util.Map")
 
     // Check `this`
     if (kotlinMutableTypes.any { it == fqn(ktType) }) return true
diff --git a/compose/runtime/runtime-lint/src/main/java/androidx/compose/runtime/lint/OpaqueUnitKeyDetector.kt b/compose/runtime/runtime-lint/src/main/java/androidx/compose/runtime/lint/OpaqueUnitKeyDetector.kt
index 4b33f97..fe6d5de 100644
--- a/compose/runtime/runtime-lint/src/main/java/androidx/compose/runtime/lint/OpaqueUnitKeyDetector.kt
+++ b/compose/runtime/runtime-lint/src/main/java/androidx/compose/runtime/lint/OpaqueUnitKeyDetector.kt
@@ -49,24 +49,25 @@
 
 /**
  * Detector to warn when [Unit] is being passed "opaquely" as an argument to any of the methods in
- * [getApplicableMethodNames]. An argument is defined as an opaque unit key if all the following
- * are true:
- *  - The argument is an expression of type `Unit`
- *  - The argument is being passed to a parameter of type `Any?`
- *  - The argument is not the `Unit` literal
- *  - The argument is not a trivial variable or property read expression
+ * [getApplicableMethodNames]. An argument is defined as an opaque unit key if all the following are
+ * true:
+ * - The argument is an expression of type `Unit`
+ * - The argument is being passed to a parameter of type `Any?`
+ * - The argument is not the `Unit` literal
+ * - The argument is not a trivial variable or property read expression
  */
 class OpaqueUnitKeyDetector : Detector(), SourceCodeScanner {
 
-    override fun getApplicableMethodNames(): List<String> = listOf(
-        Names.Runtime.Remember.shortName,
-        Names.Runtime.RememberSaveable.shortName,
-        Names.Runtime.DisposableEffect.shortName,
-        Names.Runtime.LaunchedEffect.shortName,
-        Names.Runtime.ProduceState.shortName,
-        Names.Runtime.ReusableContent.shortName,
-        Names.Runtime.Key.shortName,
-    )
+    override fun getApplicableMethodNames(): List<String> =
+        listOf(
+            Names.Runtime.Remember.shortName,
+            Names.Runtime.RememberSaveable.shortName,
+            Names.Runtime.DisposableEffect.shortName,
+            Names.Runtime.LaunchedEffect.shortName,
+            Names.Runtime.ProduceState.shortName,
+            Names.Runtime.ReusableContent.shortName,
+            Names.Runtime.Key.shortName,
+        )
 
     override fun visitMethodCall(context: JavaContext, node: UCallExpression, method: PsiMethod) {
         if (!method.isInPackageName(Names.Runtime.PackageName)) return
@@ -108,8 +109,9 @@
     ) {
         val rootExpression = methodInvocation.resolveRootExpression()
         val rootExpressionLocation = context.getLocation(rootExpression)
-        val name = "Move expression outside of `${method.name}`'s arguments " +
-            "and pass `Unit` explicitly"
+        val name =
+            "Move expression outside of `${method.name}`'s arguments " +
+                "and pass `Unit` explicitly"
         context.report(
             OpaqueUnitKey,
             argument,
@@ -174,7 +176,9 @@
         var root: UExpression = this
         var parent: UExpression? = root.getParentExpression()
         while (parent != null && parent !is UBlockExpression) {
-            if (!parent.isVirtual) { root = parent }
+            if (!parent.isVirtual) {
+                root = parent
+            }
             parent = parent.getParentExpression()
         }
         return root
@@ -191,7 +195,8 @@
         return false
     }
 
-    private val UElement.isVirtual get() = sourcePsi == null
+    private val UElement.isVirtual
+        get() = sourcePsi == null
 
     private fun UExpression.getParentExpression(): UExpression? {
         return when (val parent = uastParent) {
@@ -227,26 +232,29 @@
         private const val FqUnitName = "kotlin.Unit"
         private const val FqKotlinNullableAnnotation = "org.jetbrains.annotations.Nullable"
 
-        val OpaqueUnitKey = Issue.create(
-            "OpaqueUnitKey",
-            "Passing an expression which always returns `Unit` as a key argument",
-            "Certain Compose functions including `remember`, `LaunchedEffect`, and " +
-                "`DisposableEffect` declare (and sometimes require) one or more key parameters. " +
-                "When a key parameter changes, it is a signal that the previous invocation is " +
-                "now invalid. In certain cases, it may be required to pass `Unit` as a key to " +
-                "one of these functions, indicating that the invocation never becomes invalid. " +
-                "Using `Unit` as a key should be done infrequently, and should always be done " +
-                "explicitly by passing the `Unit` literal. This inspection checks for " +
-                "invocations where `Unit` is being passed as a key argument in any form other " +
-                "than the `Unit` literal. This is usually done by mistake, and can harm " +
-                "readability. If a Unit expression is being passed as a key, it is always " +
-                "equivalent to move the expression before the function invocation and pass the " +
-                "`Unit` literal instead.",
-            Category.CORRECTNESS, 3, Severity.WARNING,
-            Implementation(
-                OpaqueUnitKeyDetector::class.java,
-                EnumSet.of(Scope.JAVA_FILE, Scope.TEST_SOURCES)
+        val OpaqueUnitKey =
+            Issue.create(
+                "OpaqueUnitKey",
+                "Passing an expression which always returns `Unit` as a key argument",
+                "Certain Compose functions including `remember`, `LaunchedEffect`, and " +
+                    "`DisposableEffect` declare (and sometimes require) one or more key parameters. " +
+                    "When a key parameter changes, it is a signal that the previous invocation is " +
+                    "now invalid. In certain cases, it may be required to pass `Unit` as a key to " +
+                    "one of these functions, indicating that the invocation never becomes invalid. " +
+                    "Using `Unit` as a key should be done infrequently, and should always be done " +
+                    "explicitly by passing the `Unit` literal. This inspection checks for " +
+                    "invocations where `Unit` is being passed as a key argument in any form other " +
+                    "than the `Unit` literal. This is usually done by mistake, and can harm " +
+                    "readability. If a Unit expression is being passed as a key, it is always " +
+                    "equivalent to move the expression before the function invocation and pass the " +
+                    "`Unit` literal instead.",
+                Category.CORRECTNESS,
+                3,
+                Severity.WARNING,
+                Implementation(
+                    OpaqueUnitKeyDetector::class.java,
+                    EnumSet.of(Scope.JAVA_FILE, Scope.TEST_SOURCES)
+                )
             )
-        )
     }
 }
diff --git a/compose/runtime/runtime-lint/src/main/java/androidx/compose/runtime/lint/ProduceStateDetector.kt b/compose/runtime/runtime-lint/src/main/java/androidx/compose/runtime/lint/ProduceStateDetector.kt
index 2afb1ab..84099fd 100644
--- a/compose/runtime/runtime-lint/src/main/java/androidx/compose/runtime/lint/ProduceStateDetector.kt
+++ b/compose/runtime/runtime-lint/src/main/java/androidx/compose/runtime/lint/ProduceStateDetector.kt
@@ -53,64 +53,67 @@
     override fun visitMethodCall(context: JavaContext, node: UCallExpression, method: PsiMethod) {
         if (method.isInPackageName(Names.Runtime.PackageName)) {
             // The ProduceStateScope lambda
-            val producer = node.valueArguments.find {
-                node.getParameterForArgument(it)?.name == "producer"
-            } ?: return
+            val producer =
+                node.valueArguments.find { node.getParameterForArgument(it)?.name == "producer" }
+                    ?: return
 
             var referencesReceiver = false
             var callsSetValue = false
 
-            producer.accept(object : AbstractUastVisitor() {
-                val mutableStatePsiClass =
-                    context.evaluator.findClass(Names.Runtime.MutableState.javaFqn)
+            producer.accept(
+                object : AbstractUastVisitor() {
+                    val mutableStatePsiClass =
+                        context.evaluator.findClass(Names.Runtime.MutableState.javaFqn)
 
-                /**
-                 * Visit function calls to see if the functions have a parameter of MutableState
-                 * / ProduceStateScope. If they do, we cannot know for sure whether those
-                 * functions internally call setValue, so we avoid reporting an error to avoid
-                 * false positives.
-                 */
-                override fun visitCallExpression(
-                    node: UCallExpression
-                ): Boolean {
-                    val resolvedMethod = node.resolve() ?: return false
-                    return resolvedMethod.parameterList.parameters.any { parameter ->
-                        val type = parameter.type
+                    /**
+                     * Visit function calls to see if the functions have a parameter of MutableState
+                     * / ProduceStateScope. If they do, we cannot know for sure whether those
+                     * functions internally call setValue, so we avoid reporting an error to avoid
+                     * false positives.
+                     */
+                    override fun visitCallExpression(node: UCallExpression): Boolean {
+                        val resolvedMethod = node.resolve() ?: return false
+                        return resolvedMethod.parameterList.parameters.any { parameter ->
+                            val type = parameter.type
 
-                        // Is the parameter type ProduceStateScope or a subclass
-                        if (type.inheritsFrom(ProduceStateScopeName)) {
-                            referencesReceiver = true
+                            // Is the parameter type ProduceStateScope or a subclass
+                            if (type.inheritsFrom(ProduceStateScopeName)) {
+                                referencesReceiver = true
+                            }
+
+                            // Is the parameter type MutableState
+                            if (
+                                mutableStatePsiClass != null &&
+                                    context.evaluator.getTypeClass(type) == mutableStatePsiClass
+                            ) {
+                                referencesReceiver = true
+                            }
+
+                            referencesReceiver
                         }
+                    }
 
-                        // Is the parameter type MutableState
-                        if (mutableStatePsiClass != null &&
-                            context.evaluator.getTypeClass(type) == mutableStatePsiClass) {
-                            referencesReceiver = true
+                    /**
+                     * Visit any simple name reference expressions to see if there is a reference to
+                     * `value` that resolves to a call to MutableState#setValue.
+                     */
+                    override fun visitSimpleNameReferenceExpression(
+                        node: USimpleNameReferenceExpression
+                    ): Boolean {
+                        if (node.identifier != "value") return false
+                        val resolvedMethod = node.tryResolve() as? PsiMethod ?: return false
+                        if (
+                            resolvedMethod.name == "setValue" &&
+                                resolvedMethod.containingClass?.inheritsFrom(
+                                    Names.Runtime.MutableState
+                                ) == true
+                        ) {
+                            callsSetValue = true
                         }
-
-                        referencesReceiver
+                        return callsSetValue
                     }
                 }
-
-                /**
-                 * Visit any simple name reference expressions to see if there is a reference to
-                 * `value` that resolves to a call to MutableState#setValue.
-                 */
-                override fun visitSimpleNameReferenceExpression(
-                    node: USimpleNameReferenceExpression
-                ): Boolean {
-                    if (node.identifier != "value") return false
-                    val resolvedMethod = node.tryResolve() as? PsiMethod ?: return false
-                    if (resolvedMethod.name == "setValue" &&
-                        resolvedMethod.containingClass?.inheritsFrom(
-                            Names.Runtime.MutableState
-                        ) == true
-                    ) {
-                        callsSetValue = true
-                    }
-                    return callsSetValue
-                }
-            })
+            )
 
             if (!callsSetValue && !referencesReceiver) {
                 context.report(
@@ -124,20 +127,23 @@
     }
 
     companion object {
-        val ProduceStateDoesNotAssignValue = Issue.create(
-            "ProduceStateDoesNotAssignValue",
-            "produceState calls should assign `value` inside the producer lambda",
-            "produceState returns an observable State using values assigned inside the producer " +
-                "lambda. If the lambda never assigns (i.e `value = foo`), then the State will " +
-                "never change. Make sure to assign a value when the source you are producing " +
-                "values from changes / emits a new value. For sample usage see the produceState " +
-                "documentation.",
-            Category.CORRECTNESS, 3, Severity.ERROR,
-            Implementation(
-                ProduceStateDetector::class.java,
-                EnumSet.of(Scope.JAVA_FILE, Scope.TEST_SOURCES)
+        val ProduceStateDoesNotAssignValue =
+            Issue.create(
+                "ProduceStateDoesNotAssignValue",
+                "produceState calls should assign `value` inside the producer lambda",
+                "produceState returns an observable State using values assigned inside the producer " +
+                    "lambda. If the lambda never assigns (i.e `value = foo`), then the State will " +
+                    "never change. Make sure to assign a value when the source you are producing " +
+                    "values from changes / emits a new value. For sample usage see the produceState " +
+                    "documentation.",
+                Category.CORRECTNESS,
+                3,
+                Severity.ERROR,
+                Implementation(
+                    ProduceStateDetector::class.java,
+                    EnumSet.of(Scope.JAVA_FILE, Scope.TEST_SOURCES)
+                )
             )
-        )
     }
 }
 
diff --git a/compose/runtime/runtime-lint/src/main/java/androidx/compose/runtime/lint/RememberDetector.kt b/compose/runtime/runtime-lint/src/main/java/androidx/compose/runtime/lint/RememberDetector.kt
index 354a305..77a490f 100644
--- a/compose/runtime/runtime-lint/src/main/java/androidx/compose/runtime/lint/RememberDetector.kt
+++ b/compose/runtime/runtime-lint/src/main/java/androidx/compose/runtime/lint/RememberDetector.kt
@@ -37,9 +37,7 @@
 import org.jetbrains.uast.UExpression
 import org.jetbrains.uast.toUElementOfType
 
-/**
- * [Detector] that checks `remember` calls to make sure they are not returning [Unit].
- */
+/** [Detector] that checks `remember` calls to make sure they are not returning [Unit]. */
 class RememberDetector : Detector(), SourceCodeScanner {
     override fun getApplicableMethodNames(): List<String> = listOf(Names.Runtime.Remember.shortName)
 
@@ -49,30 +47,34 @@
         if (!callExpressionType.isVoidOrUnit) return
 
         val sourcePsi = node.sourcePsi
-        val isReallyUnit = when {
-            node.typeArguments.singleOrNull()?.isVoidOrUnit == true -> {
-                // Call with an explicit type argument, e.g., remember<Unit> { 42 }
-                true
-            }
-            sourcePsi is KtCallExpression -> {
-                // Even though the return type is Unit, we should double check if the type of
-                // the lambda expression matches
-                val calculationParameterIndex = method.parameters.lastIndex
-                val argument = node.getArgumentForParameter(calculationParameterIndex)?.sourcePsi
-                // If the argument is a lambda, check the expression inside
-                if (argument is KtLambdaExpression) {
-                    val lastExp = argument.bodyExpression?.statements?.lastOrNull()
-                    val lastExpType = lastExp?.toUElementOfType<UExpression>()?.getExpressionType()
-                    // If unresolved (i.e., type error), the expression type will be actually `null`
-                    callExpressionType == lastExpType
-                } else {
-                    // Otherwise return true, since it is a reference to something else that is
-                    // unit (such as a variable)
+        val isReallyUnit =
+            when {
+                node.typeArguments.singleOrNull()?.isVoidOrUnit == true -> {
+                    // Call with an explicit type argument, e.g., remember<Unit> { 42 }
                     true
                 }
-           }
-           else -> true
-        }
+                sourcePsi is KtCallExpression -> {
+                    // Even though the return type is Unit, we should double check if the type of
+                    // the lambda expression matches
+                    val calculationParameterIndex = method.parameters.lastIndex
+                    val argument =
+                        node.getArgumentForParameter(calculationParameterIndex)?.sourcePsi
+                    // If the argument is a lambda, check the expression inside
+                    if (argument is KtLambdaExpression) {
+                        val lastExp = argument.bodyExpression?.statements?.lastOrNull()
+                        val lastExpType =
+                            lastExp?.toUElementOfType<UExpression>()?.getExpressionType()
+                        // If unresolved (i.e., type error), the expression type will be actually
+                        // `null`
+                        callExpressionType == lastExpType
+                    } else {
+                        // Otherwise return true, since it is a reference to something else that is
+                        // unit (such as a variable)
+                        true
+                    }
+                }
+                else -> true
+            }
         if (isReallyUnit) {
             context.report(
                 RememberReturnType,
@@ -84,21 +86,24 @@
     }
 
     companion object {
-        val RememberReturnType = Issue.create(
-            "RememberReturnType",
-            "`remember` calls must not return `Unit`",
-            "A call to `remember` that returns `Unit` is always an error. This typically happens " +
-                "when using `remember` to mutate variables on an object. `remember` is executed " +
-                "during the composition, which means that if the composition fails or is " +
-                "happening on a separate thread, the mutated variables may not reflect the true " +
-                "state of the composition. Instead, use `SideEffect` to make deferred changes " +
-                "once the composition succeeds, or mutate `MutableState` backed variables " +
-                "directly, as these will handle composition failure for you.",
-            Category.CORRECTNESS, 3, Severity.ERROR,
-            Implementation(
-                RememberDetector::class.java,
-                EnumSet.of(Scope.JAVA_FILE, Scope.TEST_SOURCES)
+        val RememberReturnType =
+            Issue.create(
+                "RememberReturnType",
+                "`remember` calls must not return `Unit`",
+                "A call to `remember` that returns `Unit` is always an error. This typically happens " +
+                    "when using `remember` to mutate variables on an object. `remember` is executed " +
+                    "during the composition, which means that if the composition fails or is " +
+                    "happening on a separate thread, the mutated variables may not reflect the true " +
+                    "state of the composition. Instead, use `SideEffect` to make deferred changes " +
+                    "once the composition succeeds, or mutate `MutableState` backed variables " +
+                    "directly, as these will handle composition failure for you.",
+                Category.CORRECTNESS,
+                3,
+                Severity.ERROR,
+                Implementation(
+                    RememberDetector::class.java,
+                    EnumSet.of(Scope.JAVA_FILE, Scope.TEST_SOURCES)
+                )
             )
-        )
     }
 }
diff --git a/compose/runtime/runtime-lint/src/main/java/androidx/compose/runtime/lint/RuntimeIssueRegistry.kt b/compose/runtime/runtime-lint/src/main/java/androidx/compose/runtime/lint/RuntimeIssueRegistry.kt
index 1ead6c8..c07020d 100644
--- a/compose/runtime/runtime-lint/src/main/java/androidx/compose/runtime/lint/RuntimeIssueRegistry.kt
+++ b/compose/runtime/runtime-lint/src/main/java/androidx/compose/runtime/lint/RuntimeIssueRegistry.kt
@@ -22,32 +22,34 @@
 import com.android.tools.lint.client.api.Vendor
 import com.android.tools.lint.detector.api.CURRENT_API
 
-/**
- * [IssueRegistry] containing runtime specific lint issues.
- */
+/** [IssueRegistry] containing runtime specific lint issues. */
 class RuntimeIssueRegistry : IssueRegistry() {
     // Tests are run with this version. We ensure that with ApiLintVersionsTest
     override val api = 14
     override val minApi = CURRENT_API
-    override val issues get() = listOf(
-        AutoboxingStateValuePropertyDetector.AutoboxingStateValueProperty,
-        AutoboxingStateCreationDetector.AutoboxingStateCreation,
-        ComposableCoroutineCreationDetector.CoroutineCreationDuringComposition,
-        ComposableFlowOperatorDetector.FlowOperatorInvokedInComposition,
-        ComposableLambdaParameterDetector.ComposableLambdaParameterNaming,
-        ComposableLambdaParameterDetector.ComposableLambdaParameterPosition,
-        ComposableNamingDetector.ComposableNaming,
-        ComposableStateFlowValueDetector.StateFlowValueCalledInComposition,
-        CompositionLocalNamingDetector.CompositionLocalNaming,
-        MutableCollectionMutableStateDetector.MutableCollectionMutableState,
-        ProduceStateDetector.ProduceStateDoesNotAssignValue,
-        RememberDetector.RememberReturnType,
-        OpaqueUnitKeyDetector.OpaqueUnitKey,
-        UnrememberedStateDetector.UnrememberedState
-    )
-    override val vendor = Vendor(
-        vendorName = "Jetpack Compose",
-        identifier = "androidx.compose.runtime",
-        feedbackUrl = "https://issuetracker.google.com/issues/new?component=612128"
-    )
+    override val issues
+        get() =
+            listOf(
+                AutoboxingStateValuePropertyDetector.AutoboxingStateValueProperty,
+                AutoboxingStateCreationDetector.AutoboxingStateCreation,
+                ComposableCoroutineCreationDetector.CoroutineCreationDuringComposition,
+                ComposableFlowOperatorDetector.FlowOperatorInvokedInComposition,
+                ComposableLambdaParameterDetector.ComposableLambdaParameterNaming,
+                ComposableLambdaParameterDetector.ComposableLambdaParameterPosition,
+                ComposableNamingDetector.ComposableNaming,
+                ComposableStateFlowValueDetector.StateFlowValueCalledInComposition,
+                CompositionLocalNamingDetector.CompositionLocalNaming,
+                MutableCollectionMutableStateDetector.MutableCollectionMutableState,
+                ProduceStateDetector.ProduceStateDoesNotAssignValue,
+                RememberDetector.RememberReturnType,
+                OpaqueUnitKeyDetector.OpaqueUnitKey,
+                UnrememberedStateDetector.UnrememberedState
+            )
+
+    override val vendor =
+        Vendor(
+            vendorName = "Jetpack Compose",
+            identifier = "androidx.compose.runtime",
+            feedbackUrl = "https://issuetracker.google.com/issues/new?component=612128"
+        )
 }
diff --git a/compose/runtime/runtime-lint/src/main/java/androidx/compose/runtime/lint/UnrememberedStateDetector.kt b/compose/runtime/runtime-lint/src/main/java/androidx/compose/runtime/lint/UnrememberedStateDetector.kt
index 70ff3eb..6994396 100644
--- a/compose/runtime/runtime-lint/src/main/java/androidx/compose/runtime/lint/UnrememberedStateDetector.kt
+++ b/compose/runtime/runtime-lint/src/main/java/androidx/compose/runtime/lint/UnrememberedStateDetector.kt
@@ -33,9 +33,9 @@
 import org.jetbrains.uast.UElement
 
 /**
- * [Detector] that checks `derivedStateOf`, `mutableStateOf`, `mutableStateListOf`,
- * and `mutableStateMapOf` calls to make sure that if they are called inside a Composable body,
- * they are `remember`ed.
+ * [Detector] that checks `derivedStateOf`, `mutableStateOf`, `mutableStateListOf`, and
+ * `mutableStateMapOf` calls to make sure that if they are called inside a Composable body, they are
+ * `remember`ed.
  */
 class UnrememberedStateDetector : Detector(), SourceCodeScanner {
     override fun getApplicableUastTypes(): List<Class<out UElement>> {
@@ -64,18 +64,21 @@
         private const val FqStateFactoryAnnotationName =
             "androidx.compose.runtime.snapshots.StateFactoryMarker"
 
-        val UnrememberedState = Issue.create(
-            "UnrememberedMutableState", // Left as previous id for backwards compatibility
-            "Creating a state object during composition without using `remember`",
-            "State objects created during composition need to be `remember`ed, otherwise " +
-                "they will be recreated during recomposition, and lose their state. Either hoist " +
-                "the state to an object that is not created during composition, or wrap the " +
-                "state in a call to `remember`.",
-            Category.CORRECTNESS, 3, Severity.ERROR,
-            Implementation(
-                UnrememberedStateDetector::class.java,
-                EnumSet.of(Scope.JAVA_FILE, Scope.TEST_SOURCES)
+        val UnrememberedState =
+            Issue.create(
+                "UnrememberedMutableState", // Left as previous id for backwards compatibility
+                "Creating a state object during composition without using `remember`",
+                "State objects created during composition need to be `remember`ed, otherwise " +
+                    "they will be recreated during recomposition, and lose their state. Either hoist " +
+                    "the state to an object that is not created during composition, or wrap the " +
+                    "state in a call to `remember`.",
+                Category.CORRECTNESS,
+                3,
+                Severity.ERROR,
+                Implementation(
+                    UnrememberedStateDetector::class.java,
+                    EnumSet.of(Scope.JAVA_FILE, Scope.TEST_SOURCES)
+                )
             )
-        )
     }
 }
diff --git a/compose/runtime/runtime-lint/src/test/java/androidx/compose/runtime/lint/AutoboxingStateCreationDetectorTest.kt b/compose/runtime/runtime-lint/src/test/java/androidx/compose/runtime/lint/AutoboxingStateCreationDetectorTest.kt
index 1eba489..489c515 100644
--- a/compose/runtime/runtime-lint/src/test/java/androidx/compose/runtime/lint/AutoboxingStateCreationDetectorTest.kt
+++ b/compose/runtime/runtime-lint/src/test/java/androidx/compose/runtime/lint/AutoboxingStateCreationDetectorTest.kt
@@ -27,9 +27,7 @@
 
 /* ktlint-disable max-line-length */
 @RunWith(Parameterized::class)
-class AutoboxingStateCreationDetectorTest(
-    typeUnderTest: TypeUnderTest
-) : LintDetectorTest() {
+class AutoboxingStateCreationDetectorTest(typeUnderTest: TypeUnderTest) : LintDetectorTest() {
 
     private val fqType = typeUnderTest.fqName
     private val type = typeUnderTest.typeName
@@ -37,8 +35,9 @@
     private val fqJvmClass = typeUnderTest.fqJvmName
     private val stateValue = typeUnderTest.sampleValue
 
-    private val primitiveStateStub = kotlin(
-        """
+    private val primitiveStateStub =
+        kotlin(
+            """
         package androidx.compose.runtime
 
         import kotlin.reflect.KProperty
@@ -68,7 +67,7 @@
             ${type.toLowerCaseAsciiOnly()}Value = value
         }
         """
-    )
+        )
 
     override fun getDetector(): Detector = AutoboxingStateCreationDetector()
 
@@ -77,13 +76,14 @@
 
     @Test
     fun testTrivialMutableStateOf_thatCouldBeMutablePrimitiveStateOf() {
-        lint().files(
-            primitiveStateStub,
-            Stubs.Composable,
-            Stubs.SnapshotState,
-            Stubs.StateFactoryMarker,
-            kotlin(
-                """
+        lint()
+            .files(
+                primitiveStateStub,
+                Stubs.Composable,
+                Stubs.SnapshotState,
+                Stubs.StateFactoryMarker,
+                kotlin(
+                    """
                     package androidx.compose.runtime.lint.test
 
                     import androidx.compose.runtime.*
@@ -94,40 +94,44 @@
                         state.value = $stateValue
                     }
                 """
+                )
             )
-        ).run().expect(
-            """
+            .run()
+            .expect(
+                """
 src/androidx/compose/runtime/lint/test/test.kt:8: Information: Prefer mutable${type}StateOf instead of mutableStateOf [AutoboxingStateCreation]
                         val state = mutableStateOf<$type>($stateValue)
                                     ~~~~~~~~~~~~~~
 0 errors, 0 warnings
             """
-        ).expectFixDiffs(
-            """
+            )
+            .expectFixDiffs(
+                """
 Fix for src/androidx/compose/runtime/lint/test/test.kt line 8: Replace with mutable${type}StateOf:
 @@ -8 +8
 -                         val state = mutableStateOf<$type>($stateValue)
 +                         val state = mutable${type}StateOf($stateValue)
             """
-        )
+            )
     }
 
     /**
      * Regression test for b/314093514. Java doesn't allow specifying nullity of the generic type
      * with either the AndroidX or JetBrains nullity annotations, so we never have enough
      * information to know whether a mutableState created in Java is capable of being refactored
-     * into the specialized primitive version. Therefore, this inspection should never report
-     * for Java callers.
+     * into the specialized primitive version. Therefore, this inspection should never report for
+     * Java callers.
      */
     @Test
     fun testTrivialMutableStateOf_notReportedInJava() {
-        lint().files(
-            primitiveStateStub,
-            Stubs.Composable,
-            Stubs.SnapshotState,
-            Stubs.StateFactoryMarker,
-            java(
-                """
+        lint()
+            .files(
+                primitiveStateStub,
+                Stubs.Composable,
+                Stubs.SnapshotState,
+                Stubs.StateFactoryMarker,
+                java(
+                    """
                     package androidx.compose.runtime.lint.test;
 
                     import static androidx.compose.runtime.SnapshotStateKt.mutableStateOf;
@@ -143,19 +147,22 @@
                         }
                     }
                 """
+                )
             )
-        ).run().expectClean()
+            .run()
+            .expectClean()
     }
 
     @Test
     fun testInferredMutableStateOf_thatCouldBeMutablePrimitiveStateOf() {
-        lint().files(
-            primitiveStateStub,
-            Stubs.Composable,
-            Stubs.SnapshotState,
-            Stubs.StateFactoryMarker,
-            kotlin(
-                """
+        lint()
+            .files(
+                primitiveStateStub,
+                Stubs.Composable,
+                Stubs.SnapshotState,
+                Stubs.StateFactoryMarker,
+                kotlin(
+                    """
                     package androidx.compose.runtime.lint.test
 
                     import androidx.compose.runtime.*
@@ -166,33 +173,37 @@
                         state.value = $stateValue
                     }
                 """
+                )
             )
-        ).run().expect(
-            """
+            .run()
+            .expect(
+                """
 src/androidx/compose/runtime/lint/test/test.kt:8: Information: Prefer mutable${type}StateOf instead of mutableStateOf [AutoboxingStateCreation]
                         val state = mutableStateOf($stateValue)
                                     ~~~~~~~~~~~~~~
 0 errors, 0 warnings
             """
-        ).expectFixDiffs(
-            """
+            )
+            .expectFixDiffs(
+                """
 Fix for src/androidx/compose/runtime/lint/test/test.kt line 8: Replace with mutable${type}StateOf:
 @@ -8 +8
 -                         val state = mutableStateOf($stateValue)
 +                         val state = mutable${type}StateOf($stateValue)
             """
-        )
+            )
     }
 
     @Test
     fun testFqMutableStateOf_thatCouldBeMutablePrimitiveStateOf() {
-        lint().files(
-            primitiveStateStub,
-            Stubs.Composable,
-            Stubs.SnapshotState,
-            Stubs.StateFactoryMarker,
-            kotlin(
-                """
+        lint()
+            .files(
+                primitiveStateStub,
+                Stubs.Composable,
+                Stubs.SnapshotState,
+                Stubs.StateFactoryMarker,
+                kotlin(
+                    """
                     package androidx.compose.runtime.lint.test
 
                     import androidx.compose.runtime.*
@@ -203,33 +214,37 @@
                         state.value = $stateValue
                     }
                 """
+                )
             )
-        ).run().expect(
-            """
+            .run()
+            .expect(
+                """
 src/androidx/compose/runtime/lint/test/test.kt:8: Information: Prefer mutable${type}StateOf instead of mutableStateOf [AutoboxingStateCreation]
                         val state = mutableStateOf<$fqType>($stateValue)
                                     ~~~~~~~~~~~~~~
 0 errors, 0 warnings
             """
-        ).expectFixDiffs(
-            """
+            )
+            .expectFixDiffs(
+                """
 Fix for src/androidx/compose/runtime/lint/test/test.kt line 8: Replace with mutable${type}StateOf:
 @@ -8 +8
 -                         val state = mutableStateOf<$fqType>($stateValue)
 +                         val state = mutable${type}StateOf($stateValue)
             """
-        )
+            )
     }
 
     @Test
     fun testStateDelegate_withExplicitType_thatCouldBeMutablePrimitiveStateOf() {
-        lint().files(
-            primitiveStateStub,
-            Stubs.Composable,
-            Stubs.SnapshotState,
-            Stubs.StateFactoryMarker,
-            kotlin(
-                """
+        lint()
+            .files(
+                primitiveStateStub,
+                Stubs.Composable,
+                Stubs.SnapshotState,
+                Stubs.StateFactoryMarker,
+                kotlin(
+                    """
                     package androidx.compose.runtime.lint.test
 
                     import androidx.compose.runtime.*
@@ -240,33 +255,37 @@
                         state = $stateValue
                     }
                 """
+                )
             )
-        ).run().expect(
-            """
+            .run()
+            .expect(
+                """
 src/androidx/compose/runtime/lint/test/test.kt:8: Information: Prefer mutable${type}StateOf instead of mutableStateOf [AutoboxingStateCreation]
                         var state by mutableStateOf<$type>($stateValue)
                                      ~~~~~~~~~~~~~~
 0 errors, 0 warnings
             """
-        ).expectFixDiffs(
-            """
+            )
+            .expectFixDiffs(
+                """
 Fix for src/androidx/compose/runtime/lint/test/test.kt line 8: Replace with mutable${type}StateOf:
 @@ -8 +8
 -                         var state by mutableStateOf<$type>($stateValue)
 +                         var state by mutable${type}StateOf($stateValue)
             """
-        )
+            )
     }
 
     @Test
     fun testStateDelegate_withInferredType_thatCouldBeMutablePrimitiveStateOf() {
-        lint().files(
-            primitiveStateStub,
-            Stubs.Composable,
-            Stubs.SnapshotState,
-            Stubs.StateFactoryMarker,
-            kotlin(
-                """
+        lint()
+            .files(
+                primitiveStateStub,
+                Stubs.Composable,
+                Stubs.SnapshotState,
+                Stubs.StateFactoryMarker,
+                kotlin(
+                    """
                     package androidx.compose.runtime.lint.test
 
                     import androidx.compose.runtime.*
@@ -277,33 +296,37 @@
                         state = $stateValue
                     }
                 """
+                )
             )
-        ).run().expect(
-            """
+            .run()
+            .expect(
+                """
 src/androidx/compose/runtime/lint/test/test.kt:8: Information: Prefer mutable${type}StateOf instead of mutableStateOf [AutoboxingStateCreation]
                         var state by mutableStateOf($stateValue)
                                      ~~~~~~~~~~~~~~
 0 errors, 0 warnings
             """
-        ).expectFixDiffs(
-            """
+            )
+            .expectFixDiffs(
+                """
 Fix for src/androidx/compose/runtime/lint/test/test.kt line 8: Replace with mutable${type}StateOf:
 @@ -8 +8
 -                         var state by mutableStateOf($stateValue)
 +                         var state by mutable${type}StateOf($stateValue)
             """
-        )
+            )
     }
 
     @Test
     fun testStateDelegate_withInferredType_andInternalSetter_thatCouldBeMutablePrimitiveStateOf() {
-        lint().files(
-            primitiveStateStub,
-            Stubs.Composable,
-            Stubs.SnapshotState,
-            Stubs.StateFactoryMarker,
-            kotlin(
-                """
+        lint()
+            .files(
+                primitiveStateStub,
+                Stubs.Composable,
+                Stubs.SnapshotState,
+                Stubs.StateFactoryMarker,
+                kotlin(
+                    """
                 package androidx.compose.runtime.lint.test
 
                 import androidx.compose.runtime.*
@@ -314,33 +337,37 @@
                         private set
                 }
             """
+                )
             )
-        ).run().expect(
+            .run()
+            .expect(
                 """
 src/androidx/compose/runtime/lint/test/Test.kt:8: Information: Prefer mutable${type}StateOf instead of mutableStateOf [AutoboxingStateCreation]
                     var state by mutableStateOf(initialValue)
                                  ~~~~~~~~~~~~~~
 0 errors, 0 warnings
             """
-        ).expectFixDiffs(
+            )
+            .expectFixDiffs(
                 """
 Fix for src/androidx/compose/runtime/lint/test/Test.kt line 8: Replace with mutable${type}StateOf:
 @@ -8 +8
 -                     var state by mutableStateOf(initialValue)
 +                     var state by mutable${type}StateOf(initialValue)
             """
-        )
+            )
     }
 
     @Test
     fun testStateDelegate_withTypeInferredFromProperty_thatCouldBeMutablePrimitiveStateOf() {
-        lint().files(
-            primitiveStateStub,
-            Stubs.Composable,
-            Stubs.SnapshotState,
-            Stubs.StateFactoryMarker,
-            kotlin(
-                """
+        lint()
+            .files(
+                primitiveStateStub,
+                Stubs.Composable,
+                Stubs.SnapshotState,
+                Stubs.StateFactoryMarker,
+                kotlin(
+                    """
                     package androidx.compose.runtime.lint.test
 
                     import androidx.compose.runtime.*
@@ -351,33 +378,37 @@
                         state = $stateValue
                     }
                 """
+                )
             )
-        ).run().expect(
-            """
+            .run()
+            .expect(
+                """
 src/androidx/compose/runtime/lint/test/test.kt:8: Information: Prefer mutable${type}StateOf instead of mutableStateOf [AutoboxingStateCreation]
                         var state: $type by mutableStateOf($stateValue)
                                    ${" ".repeat(type.length)}    ~~~~~~~~~~~~~~
 0 errors, 0 warnings
             """
-        ).expectFixDiffs(
-            """
+            )
+            .expectFixDiffs(
+                """
 Fix for src/androidx/compose/runtime/lint/test/test.kt line 8: Replace with mutable${type}StateOf:
 @@ -8 +8
 -                         var state: $type by mutableStateOf($stateValue)
 +                         var state: $type by mutable${type}StateOf($stateValue)
             """
-        )
+            )
     }
 
     @Test
     fun testStateDelegate_withNullableInferredType_cannotBeReplacedWithMutablePrimitiveStateOf() {
-        lint().files(
-            primitiveStateStub,
-            Stubs.Composable,
-            Stubs.SnapshotState,
-            Stubs.StateFactoryMarker,
-            kotlin(
-                """
+        lint()
+            .files(
+                primitiveStateStub,
+                Stubs.Composable,
+                Stubs.SnapshotState,
+                Stubs.StateFactoryMarker,
+                kotlin(
+                    """
                     package androidx.compose.runtime.lint.test
 
                     import androidx.compose.runtime.*
@@ -388,19 +419,22 @@
                         state = $stateValue
                     }
                 """
+                )
             )
-        ).run().expectClean()
+            .run()
+            .expectClean()
     }
 
     @Test
     fun testInferredMutableStateOf_withExplicitEqualityPolicy_thatCouldBeMutablePrimitiveStateOf() {
-        lint().files(
-            primitiveStateStub,
-            Stubs.Composable,
-            Stubs.SnapshotState,
-            Stubs.StateFactoryMarker,
-            kotlin(
-                """
+        lint()
+            .files(
+                primitiveStateStub,
+                Stubs.Composable,
+                Stubs.SnapshotState,
+                Stubs.StateFactoryMarker,
+                kotlin(
+                    """
                     package androidx.compose.runtime.lint.test
 
                     import androidx.compose.runtime.*
@@ -411,33 +445,37 @@
                         state.value = $stateValue
                     }
                 """
+                )
             )
-        ).run().expect(
-            """
+            .run()
+            .expect(
+                """
 src/androidx/compose/runtime/lint/test/test.kt:8: Information: Prefer mutable${type}StateOf instead of mutableStateOf [AutoboxingStateCreation]
                         val state = mutableStateOf($stateValue, structuralEqualityPolicy())
                                     ~~~~~~~~~~~~~~
 0 errors, 0 warnings
             """
-        ).expectFixDiffs(
-            """
+            )
+            .expectFixDiffs(
+                """
 Fix for src/androidx/compose/runtime/lint/test/test.kt line 8: Replace with mutable${type}StateOf:
 @@ -8 +8
 -                         val state = mutableStateOf($stateValue, structuralEqualityPolicy())
 +                         val state = mutable${type}StateOf($stateValue)
             """
-        )
+            )
     }
 
     @Test
     fun testNonStructuralEqualityPolicy_cannotBeReplacedWithMutablePrimitiveStateOf() {
-        lint().files(
-            primitiveStateStub,
-            Stubs.Composable,
-            Stubs.SnapshotState,
-            Stubs.StateFactoryMarker,
-            kotlin(
-                """
+        lint()
+            .files(
+                primitiveStateStub,
+                Stubs.Composable,
+                Stubs.SnapshotState,
+                Stubs.StateFactoryMarker,
+                kotlin(
+                    """
                     package androidx.compose.runtime.lint.test
 
                     import androidx.compose.runtime.*
@@ -448,19 +486,22 @@
                         state.value = $stateValue
                     }
                 """
+                )
             )
-        ).run().expectClean()
+            .run()
+            .expectClean()
     }
 
     @Test
     fun testNullableMutableStateOf_cannotBeReplacedWithMutablePrimitiveStateOf() {
-        lint().files(
-            primitiveStateStub,
-            Stubs.Composable,
-            Stubs.SnapshotState,
-            Stubs.StateFactoryMarker,
-            kotlin(
-                """
+        lint()
+            .files(
+                primitiveStateStub,
+                Stubs.Composable,
+                Stubs.SnapshotState,
+                Stubs.StateFactoryMarker,
+                kotlin(
+                    """
                     package androidx.compose.runtime.lint.test
 
                     import androidx.compose.runtime.*
@@ -471,19 +512,22 @@
                         state.value = $stateValue
                     }
                 """
+                )
             )
-        ).run().expectClean()
+            .run()
+            .expectClean()
     }
 
     @Test
     fun testInferredNullableMutableStateOf_cannotBeReplacedWithMutablePrimitiveStateOf() {
-        lint().files(
-            primitiveStateStub,
-            Stubs.Composable,
-            Stubs.SnapshotState,
-            Stubs.StateFactoryMarker,
-            kotlin(
-                """
+        lint()
+            .files(
+                primitiveStateStub,
+                Stubs.Composable,
+                Stubs.SnapshotState,
+                Stubs.StateFactoryMarker,
+                kotlin(
+                    """
                     package androidx.compose.runtime.lint.test
 
                     import androidx.compose.runtime.*
@@ -494,19 +538,22 @@
                         state.value = $stateValue
                     }
                 """
+                )
             )
-        ).run().expectClean()
+            .run()
+            .expectClean()
     }
 
     @Test
     fun testInferredByCastNullableMutableStateOf_cannotBeReplacedWithMutablePrimitiveStateOf() {
-        lint().files(
-            primitiveStateStub,
-            Stubs.Composable,
-            Stubs.SnapshotState,
-            Stubs.StateFactoryMarker,
-            kotlin(
-                """
+        lint()
+            .files(
+                primitiveStateStub,
+                Stubs.Composable,
+                Stubs.SnapshotState,
+                Stubs.StateFactoryMarker,
+                kotlin(
+                    """
                     package androidx.compose.runtime.lint.test
 
                     import androidx.compose.runtime.*
@@ -517,31 +564,31 @@
                         state.value = $stateValue
                     }
                 """
+                )
             )
-        ).run().expectClean()
+            .run()
+            .expectClean()
     }
 
     companion object {
         @JvmStatic
         @Parameterized.Parameters(name = "{0}")
-        fun initParameters() = listOf(
-            testCase("kotlin.Int", "java.lang.Integer", "42"),
-            testCase("kotlin.Long", "java.lang.Long", "0xABCDEF1234"),
-            testCase("kotlin.Float", "java.lang.Float", "1.5f"),
-            testCase("kotlin.Double", "java.lang.Double", "1.024")
-        )
+        fun initParameters() =
+            listOf(
+                testCase("kotlin.Int", "java.lang.Integer", "42"),
+                testCase("kotlin.Long", "java.lang.Long", "0xABCDEF1234"),
+                testCase("kotlin.Float", "java.lang.Float", "1.5f"),
+                testCase("kotlin.Double", "java.lang.Double", "1.024")
+            )
 
-        private fun testCase(
-            fqName: String,
-            jvmFqName: String,
-            value: String
-        ) = TypeUnderTest(
-            fqName = fqName,
-            typeName = fqName.split('.').last(),
-            fqJvmName = jvmFqName,
-            jvmClassName = jvmFqName.split('.').last(),
-            sampleValue = value
-        )
+        private fun testCase(fqName: String, jvmFqName: String, value: String) =
+            TypeUnderTest(
+                fqName = fqName,
+                typeName = fqName.split('.').last(),
+                fqJvmName = jvmFqName,
+                jvmClassName = jvmFqName.split('.').last(),
+                sampleValue = value
+            )
     }
 
     data class TypeUnderTest(
diff --git a/compose/runtime/runtime-lint/src/test/java/androidx/compose/runtime/lint/AutoboxingStateValuePropertyDetectorTest.kt b/compose/runtime/runtime-lint/src/test/java/androidx/compose/runtime/lint/AutoboxingStateValuePropertyDetectorTest.kt
index ed6258f..572baed2 100644
--- a/compose/runtime/runtime-lint/src/test/java/androidx/compose/runtime/lint/AutoboxingStateValuePropertyDetectorTest.kt
+++ b/compose/runtime/runtime-lint/src/test/java/androidx/compose/runtime/lint/AutoboxingStateValuePropertyDetectorTest.kt
@@ -36,9 +36,10 @@
 
     @Test
     fun testReadAutoboxingPropertyAsVariableAssignment() {
-        lint().files(
-            kotlin(
-                """
+        lint()
+            .files(
+                kotlin(
+                    """
                     package androidx.compose.runtime.lint.test
 
                     import androidx.compose.runtime.mutableIntStateOf
@@ -47,32 +48,37 @@
                         val state = mutableIntStateOf(4)
                         val value = state.value
                     }
-                """.trimIndent()
-            ),
-            AutoboxingStateValuePropertyStub,
-            MinimalSnapshotStateStub
-        ).run().expect(
-            """
+                """
+                        .trimIndent()
+                ),
+                AutoboxingStateValuePropertyStub,
+                MinimalSnapshotStateStub
+            )
+            .run()
+            .expect(
+                """
 src/androidx/compose/runtime/lint/test/test.kt:7: Warning: Reading value will cause an autoboxing operation. Use intValue to avoid unnecessary allocations. [AutoboxingStateValueProperty]
     val value = state.value
                       ~~~~~
 0 errors, 1 warnings
             """
-        ).expectFixDiffs(
-            """
+            )
+            .expectFixDiffs(
+                """
 Fix for src/androidx/compose/runtime/lint/test/test.kt line 7: Replace with `intValue`:
 @@ -7 +7
 -     val value = state.value
 +     val value = state.intValue
             """
-        )
+            )
     }
 
     @Test
     fun testTrivialAssignAutoboxingProperty() {
-        lint().files(
-            kotlin(
-                """
+        lint()
+            .files(
+                kotlin(
+                    """
                     package androidx.compose.runtime.lint.test
 
                     import androidx.compose.runtime.mutableIntStateOf
@@ -81,33 +87,39 @@
                         val state = mutableIntStateOf(0)
                         state.value = 42
                     }
-                """.trimIndent()
-            ),
-            AutoboxingStateValuePropertyStub,
-            MinimalSnapshotStateStub
-        ).run().expect(
-            """
+                """
+                        .trimIndent()
+                ),
+                AutoboxingStateValuePropertyStub,
+                MinimalSnapshotStateStub
+            )
+            .run()
+            .expect(
+                """
 src/androidx/compose/runtime/lint/test/test.kt:7: Warning: Assigning value will cause an autoboxing operation. Use intValue to avoid unnecessary allocations. [AutoboxingStateValueProperty]
     state.value = 42
           ~~~~~
 0 errors, 1 warnings
             """
-        ).expectFixDiffs(
-            """
+            )
+            .expectFixDiffs(
+                """
 Fix for src/androidx/compose/runtime/lint/test/test.kt line 7: Replace with `intValue`:
 @@ -7 +7
 -     state.value = 42
 +     state.intValue = 42
             """
-        )
+            )
     }
 
     companion object {
-        private val AutoboxingStateValuePropertyStub = bytecodeStub(
-            filename = "AutoboxingStateValueProperty.kt",
-            filepath = "androidx/compose/runtime/snapshots",
-            checksum = 0xd8b7ebd3,
-            source = """
+        private val AutoboxingStateValuePropertyStub =
+            bytecodeStub(
+                filename = "AutoboxingStateValueProperty.kt",
+                filepath = "androidx/compose/runtime/snapshots",
+                checksum = 0xd8b7ebd3,
+                source =
+                    """
                 package androidx.compose.runtime.snapshots
 
                 @Retention(AnnotationRetention.BINARY)
@@ -116,13 +128,13 @@
                     val preferredPropertyName: String
                 )
             """,
-            """
+                """
             META-INF/main.kotlin_module:
             H4sIAAAAAAAA/2NgYGBmYGBgBGJOBijg0uaSSMxLKcrPTKnQS87PLcgvTtUr
             Ks0rycxNFeIPzkssKM7ILwkuSSxJ9S7h0uFSwqVYLyczr0SvJLW4RIgtBEh6
             lygxaDEAAHx2CidzAAAA
             """,
-            """
+                """
             androidx/compose/runtime/snapshots/AutoboxingStateValueProperty.class:
             H4sIAAAAAAAA/6VSz28SURD+3vKzqLCtrVJqpdZK68XFxpsmhioqCS1kd9Ok
             4WAe8MQtyz7cfSC9cfP/8M/wYEiP/lHG2WKBA6kHLzPfzsw3883s+/X7x08A
@@ -138,13 +150,15 @@
             ASZwD/eRJepmA5EKchVsVfAA2wTxsII8dqgqwCPsNhAL8DjAXoDElU3+AfvU
             hgfXAwAA
             """
-        )
+            )
 
-        private val MinimalSnapshotStateStub: TestFile = bytecodeStub(
-            filename = "SnapshotState.kt",
-            filepath = "androidx/compose/runtime",
-            checksum = 0x992154cd,
-            source = """
+        private val MinimalSnapshotStateStub: TestFile =
+            bytecodeStub(
+                filename = "SnapshotState.kt",
+                filepath = "androidx/compose/runtime",
+                checksum = 0x992154cd,
+                source =
+                    """
             package androidx.compose.runtime
 
             import androidx.compose.runtime.snapshots.AutoboxingStateValueProperty
@@ -178,13 +192,13 @@
                 override var intValue: Int
             }
             """,
-            """
+                """
             META-INF/main.kotlin_module:
             H4sIAAAAAAAA/2NgYGBmYGBgBGJOBijg0uaSSMxLKcrPTKnQS87PLcgvTtUr
             Ks0rycxNFeIPzkssKM7ILwkuSSxJ9S7h0uFSwqVYLyczr0SvJLW4RIgtBEh6
             lygxaDEAAHx2CidzAAAA
             """,
-            """
+                """
             androidx/compose/runtime/IntState＄DefaultImpls.class:
             H4sIAAAAAAAA/4VTy27TQBQ9E7d1mhjSlrYQCoXSAElBNUgskLqKipAsmbQi
             VTasJskkncSeicbjKPwVS2DBB/BRiGs3pUBBWcx9nLlz7sv+/uPrNwCv8Jzh
@@ -199,7 +213,7 @@
             /kReAY9JruQ3m3hC0ruIwm3cIf2UToWi6A9AMSHCEgF1Om7GljkOGnk8zZPe
             PkIVBznvPp6R3iW8SjF3P8AJsBPgXoD72A3wAA8D7P0EkuUIJ5QDAAA=
             """,
-            """
+                """
             androidx/compose/runtime/IntState.class:
             H4sIAAAAAAAA/4WS304TQRTGv9n+2xaEpVKFogiCCjcsEi9MMCaNBrNJraRN
             kISraTvUhe1MMzPb1DuewgfwwofwwpBe+lDGsy1VomIvZuacM+f7zZmZ8/3H
@@ -215,7 +229,7 @@
             o5R1LONRIkYKj0frQzyh9YD2PUIvnCAVoBjgdoBFlMjEnQB3sXQCZkhbPkHe
             YMXgnsF9OspgzmDeYNXANcj/BKBShOC5AwAA
             """,
-            """
+                """
             androidx/compose/runtime/MutableIntState＄DefaultImpls.class:
             H4sIAAAAAAAA/5VT205TQRRd0wKl7dECCooIqFRtq3K84BMmhmBMJimFiOmL
             T9N2KAOnM82cOQ3+lb6JD36AH2Xcc1ougib4MLPnsrLWXrP3/Pz1/QeANawx
@@ -232,7 +246,7 @@
             hWMsZfD1gsJSqjA3xIwU/GoZ9+jeaxUpnmp5nXxmpEMlI28+M6ocZVkj3Zcp
             /xO8SrkZ7hPmwSdkOVY4yhwP8YjjMSoc1d+/bB9ggQQAAA==
             """,
-            """
+                """
             androidx/compose/runtime/MutableIntState.class:
             H4sIAAAAAAAA/41T3U4TQRg9sy3d7VJxKaAF/ONPWlS2NpqYYIxEY7JJqaZN
             gISrKR3qwna27sw2eMdT+ABe+BBeGMKlD2X8trRAVISLmfl+zpzzzcw3P399
@@ -250,7 +264,7 @@
             yk+R+q0dpDzc9lDwCDlDJmY93MHdHTCFe7i/k6g8UJhTmFdYIEWFvMKEwqTC
             uMKigq2on+H8BhJaxEnABAAA
             """,
-            """
+                """
             androidx/compose/runtime/MutableState.class:
             H4sIAAAAAAAA/4VR0WoTURA9c3eT3aQxbmOradRaBTHxwa3FBzGlIKIYSBCa
             EIQ83SZr3GZzt+TeDX3cb/HBj/BBlj76UeJsKkUM1Zc7c+aeOTOc+fHz23cA
@@ -264,7 +278,7 @@
             A6+DzQ5quMUptjrYxu0RSOMO6iM+IXY0Ghp3Ne7pHJY0NjQqvwDJFOU0xwIA
             AA==
             """,
-            """
+                """
             androidx/compose/runtime/SnapshotStateKt.class:
             H4sIAAAAAAAA/5WSXWsTQRSG39l8r7HdRqtN6lc/tKmg2xbBi4ogorC4TaDR
             QMnVJDvGSTYzy+5syGX+laCgufZHiTObQCjihTfvOfOeZ87MnN1fv7/9APAC
@@ -279,7 +293,7 @@
             l9qt6f63esh5uO1h28Md3PWwg7qHBnZ7IAnu4X4P+QSFBA8SOAke/gF9don0
             8QIAAA==
             """,
-            """
+                """
             androidx/compose/runtime/State.class:
             H4sIAAAAAAAA/31Qy0rDQBQ9k6RpGl+pz1pFXLYuTBUX4gvcCIWKYIsIXY3t
             WMemE+lMi8t8iws/woUEl36UeFNdqbi5955z77mv94+XVwB7WGfY4Ko7jGX3
@@ -291,7 +305,7 @@
             ggf7O7JRnvgS1sgfU0WBNH4bdh1TdUzXMYNZCjFXR4BiG0xjHgttuBqLGksa
             yxorOoP5T7cJbagBAgAA
             """
-        )
+            )
     }
 }
 /* ktlint-enable max-line-length */
diff --git a/compose/runtime/runtime-lint/src/test/java/androidx/compose/runtime/lint/ComposableCoroutineCreationDetectorTest.kt b/compose/runtime/runtime-lint/src/test/java/androidx/compose/runtime/lint/ComposableCoroutineCreationDetectorTest.kt
index a45ff5f..dc5a1e8 100644
--- a/compose/runtime/runtime-lint/src/test/java/androidx/compose/runtime/lint/ComposableCoroutineCreationDetectorTest.kt
+++ b/compose/runtime/runtime-lint/src/test/java/androidx/compose/runtime/lint/ComposableCoroutineCreationDetectorTest.kt
@@ -32,20 +32,19 @@
 /* ktlint-disable max-line-length */
 @RunWith(JUnit4::class)
 
-/**
- * Test for [ComposableCoroutineCreationDetector].
- */
+/** Test for [ComposableCoroutineCreationDetector]. */
 class ComposableCoroutineCreationDetectorTest : LintDetectorTest() {
     override fun getDetector(): Detector = ComposableCoroutineCreationDetector()
 
     override fun getIssues(): MutableList<Issue> =
         mutableListOf(ComposableCoroutineCreationDetector.CoroutineCreationDuringComposition)
 
-    private val coroutineBuildersStub: TestFile = bytecodeStub(
-        filename = "Builders.common.kt",
-        filepath = "kotlinx/coroutines",
-        checksum = 0x8bc08fcf,
-        """
+    private val coroutineBuildersStub: TestFile =
+        bytecodeStub(
+            filename = "Builders.common.kt",
+            filepath = "kotlinx/coroutines",
+            checksum = 0x8bc08fcf,
+            """
         package kotlinx.coroutines
 
         object CoroutineScope
@@ -58,14 +57,14 @@
             block: suspend CoroutineScope.() -> Unit
         ) {}
         """,
-"""
+            """
         META-INF/main.kotlin_module:
         H4sIAAAAAAAA/2XMsQoCMRAE0BXh4LZzm2usLBQsgt+g5bX2Ipc9CCa7R7JB
         P98IWjkw3ZsBgDUArFp7+Ab3uL2Lzxr8y02aFi3schULid2sSt2Vi42GB6SH
         WgzyYVmrBeFCm3MN0XMut7ZNKg2ecPiHbo76JPzp0ai/aIw8tesdHOENLed0
         U5sAAAA=
         """,
-        """
+            """
         kotlinx/coroutines/Builders_commonKt.class:
         H4sIAAAAAAAA/61TXU8TQRQ9M/1guxQpKyBUxSpVvoQtxAeTEhIkkmxENIK8
         8GCm27Vsu501+0HgjX9i4i/QN+ODIT76o4x3tl0ENRGNL3fOvXPumTt37nz9
@@ -84,7 +83,7 @@
         UvHCSdcufxLHUmJnYdJqUXSCbjm5j4yFsoXrFm7gpoUp3LJQwe19sBB3ML0P
         PUQuRDXEaIiREHdD3EvcmRD5EOPfAUeuoPKFBQAA
         """,
-        """
+            """
         kotlinx/coroutines/CoroutineScope.class:
         H4sIAAAAAAAA/4WSTW/TQBCG390kjuMGGspHE8pXaQ/AoW4rblRIbQSSpRAk
         UkWqeto4q7KJvYvsddRjTvwQ/kHFoRJIKIIbPwoxawIcOOCVZuadnX3WM/b3
@@ -98,25 +97,26 @@
         P4fXqdo9K5/BTy7R/IjVizLB8bC0d7FV/lX0GQiwdopKhOsRbkS4iVsUYj1C
         G51TsBy3sUH7OYIcd3J4PwGm9PkckgIAAA==
         """
-    )
+        )
 
-    private val flowStub: TestFile = bytecodeStub(
-        filename = "Flow.kt",
-        filepath = "kotlinx/coroutines/flow",
-        checksum = 0x40e0a7,
-        """
+    private val flowStub: TestFile =
+        bytecodeStub(
+            filename = "Flow.kt",
+            filepath = "kotlinx/coroutines/flow",
+            checksum = 0x40e0a7,
+            """
         package kotlinx.coroutines.flow
 
         class Flow<out T>
         """,
-"""
+            """
         META-INF/main.kotlin_module:
         H4sIAAAAAAAA/2XMsQoCMRAE0BXh4LZzm2usLBQsgt+g5bX2Ipc9CCa7R7JB
         P98IWjkw3ZsBgDUArFp7+Ab3uL2Lzxr8y02aFi3schULid2sSt2Vi42GB6SH
         WgzyYVmrBeFCm3MN0XMut7ZNKg2ecPiHbo76JPzp0ai/aIw8tesdHOENLed0
         U5sAAAA=
         """,
-        """
+            """
         kotlinx/coroutines/flow/Flow.class:
         H4sIAAAAAAAA/31QwW4TMRSc5012m22g21IghVJ6LDmwbYWEVKpKgFQpUgCJ
         Rrnk5CRLcbOxpbW39Ljfwh9wQuqhWnHko6o+h5xA4jJvZjx+fs+/b69vALzC
@@ -129,27 +129,28 @@
         a860OXNvhKCH+z2s9ZBgnSk2eniAzRHI4iEejdCwWLV4bNGxiO4ApHDXcycC
         AAA=
         """
-    )
+        )
 
-    private val flowBuildersStub: TestFile = bytecodeStub(
-        filename = "Builders.kt",
-        filepath = "kotlinx/coroutines/flow",
-        checksum = 0xa1c50396,
-        """
+    private val flowBuildersStub: TestFile =
+        bytecodeStub(
+            filename = "Builders.kt",
+            filepath = "kotlinx/coroutines/flow",
+            checksum = 0xa1c50396,
+            """
         package kotlinx.coroutines.flow
 
         fun <T> flowOf(
             value: T
         ): Flow<T> = Flow()
         """,
-"""
+            """
         META-INF/main.kotlin_module:
         H4sIAAAAAAAA/2XMsQoCMRAE0BXh4LZzm2usLBQsgt+g5bX2Ipc9CCa7R7JB
         P98IWjkw3ZsBgDUArFp7+Ab3uL2Lzxr8y02aFi3schULid2sSt2Vi42GB6SH
         WgzyYVmrBeFCm3MN0XMut7ZNKg2ecPiHbo76JPzp0ai/aIw8tesdHOENLed0
         U5sAAAA=
         """,
-        """
+            """
         kotlinx/coroutines/flow/BuildersKt.class:
         H4sIAAAAAAAA/4VRXW8SQRQ9dxcW2KJs8aultVXqB31xW+JTS0jUpHEjtokl
         JIanAbZkYNlJdmexj/wWf4FvJpoY4qM/yniXYkwk2mT33HvPnHtn5syPn1++
@@ -164,13 +165,14 @@
         8YjZdd6l3IXp4ZaH2x7u4K6He9jweP9KFxRjC9tdZOP0ux9jJ0YphvULZwN9
         KR0DAAA=
         """
-    )
+        )
 
-    private val flowCollectStub: TestFile = bytecodeStub(
-        filename = "Collect.kt",
-        filepath = "kotlinx/coroutines/flow",
-        checksum = 0xf321f548,
-        """
+    private val flowCollectStub: TestFile =
+        bytecodeStub(
+            filename = "Collect.kt",
+            filepath = "kotlinx/coroutines/flow",
+            checksum = 0xf321f548,
+            """
         package kotlinx.coroutines.flow
 
         import kotlinx.coroutines.CoroutineScope
@@ -180,14 +182,14 @@
             scope: CoroutineScope
         ) = scope.launch {}
         """,
-"""
+            """
         META-INF/main.kotlin_module:
         H4sIAAAAAAAA/2XMsQoCMRAE0BXh4LZzm2usLBQsgt+g5bX2Ipc9CCa7R7JB
         P98IWjkw3ZsBgDUArFp7+Ab3uL2Lzxr8y02aFi3schULid2sSt2Vi42GB6SH
         WgzyYVmrBeFCm3MN0XMut7ZNKg2ecPiHbo76JPzp0ai/aIw8tesdHOENLed0
         U5sAAAA=
         """,
-        """
+            """
         kotlinx/coroutines/flow/CollectKt＄launchIn＄1.class:
         H4sIAAAAAAAA/61WbVMTVxR+7gYIxEQiVetbJWoqEDBBa6stKYoh1C0xWAJY
         S1t7s1zCwmY33Re03/jcn9JPttOqU2faTD/2R3V67maTIIkGp2Vm757ce+55
@@ -220,7 +222,7 @@
         4oRDG++uyxtyOS2XM3I561CNnHPwHtbI+IN1hFR8qeKhiq+wruJrfKOSkUfr
         9A8SvgNfR5+DsgPNwYaDpX8BZeuV7iUMAAA=
         """,
-        """
+            """
         kotlinx/coroutines/flow/CollectKt.class:
         H4sIAAAAAAAA/41UW08TURD+zrb0snJpKyAgVoEqV9lS7xSbKKZxY0ViGxLD
         g55ul7Lt9qzZS+Wxf8kniSamz/4o4+y2FUEEX2bmzJz55puZs/vj59fvAO4j
@@ -239,13 +241,14 @@
         kcQCxR8Gt6N4RHpEIkcsKOrLEB6TlOk0HqRM4UlwOYdN0k/JnyFqt/cRUnFH
         xaKKJSyrWMGqijXc3QdzsA5lHxGHPjtkqS0H8w6SDhZ+AcPOvm8nBQAA
         """
-    )
+        )
 
     @Test
     fun errors() {
-        lint().files(
-            kotlin(
-                """
+        lint()
+            .files(
+                kotlin(
+                    """
                 package androidx.compose.runtime.foo
 
                 import androidx.compose.runtime.Composable
@@ -302,13 +305,13 @@
                     }
                 }
             """
-            ),
-            Stubs.Composable,
-            coroutineBuildersStub,
-            flowStub,
-            flowBuildersStub,
-            flowCollectStub,
-        )
+                ),
+                Stubs.Composable,
+                coroutineBuildersStub,
+                flowStub,
+                flowBuildersStub,
+                flowCollectStub,
+            )
             .skipTestModes(TestMode.TYPE_ALIAS)
             .run()
             .expect(
@@ -383,9 +386,10 @@
 
     @Test
     fun noErrors() {
-        lint().files(
-            kotlin(
-                """
+        lint()
+            .files(
+                kotlin(
+                    """
                 package androidx.compose.runtime.foo
 
                 import androidx.compose.runtime.Composable
@@ -439,13 +443,13 @@
                     }
                 }
             """
-            ),
-            Stubs.Composable,
-            coroutineBuildersStub,
-            flowStub,
-            flowBuildersStub,
-            flowCollectStub,
-        )
+                ),
+                Stubs.Composable,
+                coroutineBuildersStub,
+                flowStub,
+                flowBuildersStub,
+                flowCollectStub,
+            )
             .run()
             .expectClean()
     }
diff --git a/compose/runtime/runtime-lint/src/test/java/androidx/compose/runtime/lint/ComposableFlowOperatorDetectorTest.kt b/compose/runtime/runtime-lint/src/test/java/androidx/compose/runtime/lint/ComposableFlowOperatorDetectorTest.kt
index b1f1f0a..28e74cd 100644
--- a/compose/runtime/runtime-lint/src/test/java/androidx/compose/runtime/lint/ComposableFlowOperatorDetectorTest.kt
+++ b/compose/runtime/runtime-lint/src/test/java/androidx/compose/runtime/lint/ComposableFlowOperatorDetectorTest.kt
@@ -32,23 +32,20 @@
 /* ktlint-disable max-line-length */
 @RunWith(JUnit4::class)
 
-/**
- * Test for [ComposableFlowOperatorDetector].
- */
+/** Test for [ComposableFlowOperatorDetector]. */
 class ComposableFlowOperatorDetectorTest : LintDetectorTest() {
     override fun getDetector(): Detector = ComposableFlowOperatorDetector()
 
     override fun getIssues(): MutableList<Issue> =
         mutableListOf(ComposableFlowOperatorDetector.FlowOperatorInvokedInComposition)
 
-    /**
-     * Combined stub of some Flow APIs
-     */
-    private val flowStub: TestFile = bytecodeStub(
-        filename = "Flow.kt",
-        filepath = "kotlinx/coroutines/flow",
-        checksum = 0xab106046,
-        """
+    /** Combined stub of some Flow APIs */
+    private val flowStub: TestFile =
+        bytecodeStub(
+            filename = "Flow.kt",
+            filepath = "kotlinx/coroutines/flow",
+            checksum = 0xab106046,
+            """
         package kotlinx.coroutines.flow
 
         interface Flow<out T>
@@ -59,13 +56,13 @@
 
         fun <T> Flow<T>.drop(count: Int): Flow<T> = this
         """,
-"""
+            """
         META-INF/main.kotlin_module:
         H4sIAAAAAAAA/2NgYGBmYGBgBGJOBijgUuOSScxLKcrPTKnQS87PLcgvTtUr
         Ks0rycxN1UvLzxdiC0ktLvEu4VLkEs/OL8nJzAMpK8ovLcnMSy3WS8vJLxdi
         cwOS3iVKDFoMAPfFl7BjAAAA
         """,
-        """
+            """
         kotlinx/coroutines/flow/Flow.class:
         H4sIAAAAAAAA/31QPUsDQRSct9Fccn5d/Iwgop1YeDFYqQg2gYOIYIJNqk2y
         CWsue5Ddiynvd1nI1f4o8V3SKbjFzJvZgXm7X98fnwBuUCecTBIXa7MIB8ks
@@ -75,7 +72,7 @@
         khqnp+pVW92P1aMxiZNOJ8aWuQzrWJ0SDhgF8+GS93G0/FNCmTNeD6UIlQjV
         CD42eMRmhC1s90AWOwj43qJmsWux9wOUHf5akAEAAA==
         """,
-        """
+            """
         kotlinx/coroutines/flow/FlowKt＄map＄1.class:
         H4sIAAAAAAAA/7VSW28SQRT+ZqEFRuwFq7a2tmixtrS6bqOJkaZJU0tCStWU
         pi8kJgNs6cAya3ZnkUd+kj6Z+GB49kcZzy6QGDUbX3yYb87tO5eZ8/3H128A
@@ -92,7 +89,7 @@
         XSpjUUNz1OR8HYkKFipYrCCHWyRiqYLbuFMH83EXy3UYfiiuYI9oc0TL03kQ
         uR/+BILNGH6EBAAA
         """,
-        """
+            """
         kotlinx/coroutines/flow/FlowKt.class:
         H4sIAAAAAAAA/41T32/bVBT+rpM6jpu2jteVJhulbIalLZ3TbvxasoxRqapF
         KaiNCqgScJu6nVvHRr5O2GOf+EP4C3gDMQlFe+SV/wdxruOEbC0JDz6/7nfO
@@ -116,13 +113,14 @@
         Ne8eIePgnoOKgxWsOljDew7Wcf8ITMBG9QhzAssCS3StApbApsCUwAOBosBD
         gfcFPhD4UOCj5Ej9ByMF+2JjBwAA
         """
-    )
+        )
 
     @Test
     fun errors() {
-        lint().files(
-            kotlin(
-                """
+        lint()
+            .files(
+                kotlin(
+                    """
                 package androidx.compose.runtime.foo
 
                 import androidx.compose.runtime.Composable
@@ -189,10 +187,10 @@
                     }
                 }
             """
-            ),
-            Stubs.Composable,
-            flowStub
-        )
+                ),
+                Stubs.Composable,
+                flowStub
+            )
             .skipTestModes(TestMode.TYPE_ALIAS)
             .run()
             .expect(
@@ -267,9 +265,10 @@
 
     @Test
     fun noErrors() {
-        lint().files(
-            kotlin(
-                """
+        lint()
+            .files(
+                kotlin(
+                    """
                 package androidx.compose.runtime.foo
 
                 import androidx.compose.runtime.Composable
@@ -333,10 +332,10 @@
                     }
                 }
             """
-            ),
-            Stubs.Composable,
-            flowStub
-        )
+                ),
+                Stubs.Composable,
+                flowStub
+            )
             .run()
             .expectClean()
     }
diff --git a/compose/runtime/runtime-lint/src/test/java/androidx/compose/runtime/lint/ComposableLambdaParameterDetectorTest.kt b/compose/runtime/runtime-lint/src/test/java/androidx/compose/runtime/lint/ComposableLambdaParameterDetectorTest.kt
index 463830d..5bb8509 100644
--- a/compose/runtime/runtime-lint/src/test/java/androidx/compose/runtime/lint/ComposableLambdaParameterDetectorTest.kt
+++ b/compose/runtime/runtime-lint/src/test/java/androidx/compose/runtime/lint/ComposableLambdaParameterDetectorTest.kt
@@ -30,22 +30,22 @@
 /* ktlint-disable max-line-length */
 @RunWith(JUnit4::class)
 
-/**
- * Test for [ComposableLambdaParameterDetector].
- */
+/** Test for [ComposableLambdaParameterDetector]. */
 class ComposableLambdaParameterDetectorTest : LintDetectorTest() {
     override fun getDetector(): Detector = ComposableLambdaParameterDetector()
 
-    override fun getIssues(): MutableList<Issue> = mutableListOf(
-        ComposableLambdaParameterDetector.ComposableLambdaParameterNaming,
-        ComposableLambdaParameterDetector.ComposableLambdaParameterPosition
-    )
+    override fun getIssues(): MutableList<Issue> =
+        mutableListOf(
+            ComposableLambdaParameterDetector.ComposableLambdaParameterNaming,
+            ComposableLambdaParameterDetector.ComposableLambdaParameterPosition
+        )
 
     @Test
     fun incorrectNaming() {
-        lint().files(
-            kotlin(
-                """
+        lint()
+            .files(
+                kotlin(
+                    """
                 package androidx.compose.ui.foo
 
                 import androidx.compose.runtime.Composable
@@ -55,9 +55,9 @@
 
                 }
             """
-            ),
-            Stubs.Composable
-        )
+                ),
+                Stubs.Composable
+            )
             .skipTestModes(TestMode.TYPE_ALIAS)
             .run()
             .expect(
@@ -80,9 +80,10 @@
 
     @Test
     fun notTrailing() {
-        lint().files(
-            kotlin(
-                """
+        lint()
+            .files(
+                kotlin(
+                    """
                 package androidx.compose.ui.foo
 
                 import androidx.compose.runtime.Composable
@@ -92,9 +93,9 @@
 
                 }
             """
-            ),
-            Stubs.Composable
-        )
+                ),
+                Stubs.Composable
+            )
             .skipTestModes(TestMode.TYPE_ALIAS)
             .run()
             .expect(
@@ -109,9 +110,10 @@
 
     @Test
     fun incorrectNamingAndNotTrailing() {
-        lint().files(
-            kotlin(
-                """
+        lint()
+            .files(
+                kotlin(
+                    """
                 package androidx.compose.ui.foo
 
                 import androidx.compose.runtime.Composable
@@ -121,9 +123,9 @@
 
                 }
             """
-            ),
-            Stubs.Composable
-        )
+                ),
+                Stubs.Composable
+            )
             .skipTestModes(TestMode.TYPE_ALIAS)
             .run()
             .expect(
@@ -149,9 +151,10 @@
 
     @Test
     fun lambdaParameterWithReceiver() {
-        lint().files(
-            kotlin(
-                """
+        lint()
+            .files(
+                kotlin(
+                    """
                 package androidx.compose.ui.foo
 
                 import androidx.compose.runtime.Composable
@@ -163,9 +166,9 @@
 
                 }
             """
-            ),
-            Stubs.Composable
-        )
+                ),
+                Stubs.Composable
+            )
             .run()
             .expect(
                 """
@@ -187,9 +190,10 @@
 
     @Test
     fun multipleParameters() {
-        lint().files(
-            kotlin(
-                """
+        lint()
+            .files(
+                kotlin(
+                    """
                 package androidx.compose.ui.foo
 
                 import androidx.compose.runtime.Composable
@@ -199,18 +203,19 @@
 
                 }
             """
-            ),
-            Stubs.Composable
-        )
+                ),
+                Stubs.Composable
+            )
             .run()
             .expectClean()
     }
 
     @Test
     fun nullableComposableLambdas() {
-        lint().files(
-            kotlin(
-                """
+        lint()
+            .files(
+                kotlin(
+                    """
                 package androidx.compose.ui.foo
 
                 import androidx.compose.runtime.Composable
@@ -227,9 +232,9 @@
                     foo: Int
                 ) {}
             """
-            ),
-            Stubs.Composable
-        )
+                ),
+                Stubs.Composable
+            )
             .skipTestModes(TestMode.TYPE_ALIAS)
             .run()
             .expect(
@@ -265,9 +270,10 @@
 
     @Test
     fun receiverScopedComposableFunction() {
-        lint().files(
-            kotlin(
-                """
+        lint()
+            .files(
+                kotlin(
+                    """
                 package androidx.compose.ui.foo
 
                 import androidx.compose.runtime.Composable
@@ -277,18 +283,19 @@
                 @Composable
                 fun FooScope.Button(foo: Int) {}
             """
-            ),
-            Stubs.Composable
-        )
+                ),
+                Stubs.Composable
+            )
             .run()
             .expectClean()
     }
 
     @Test
     fun composableLambdaWithParameter() {
-        lint().files(
-            kotlin(
-                """
+        lint()
+            .files(
+                kotlin(
+                    """
                 package androidx.compose.ui.foo
 
                 import androidx.compose.runtime.Composable
@@ -298,18 +305,19 @@
                 @Composable
                 fun Button(foo: @Composable (Int, Boolean) -> Unit) {}
             """
-            ),
-            Stubs.Composable
-        )
+                ),
+                Stubs.Composable
+            )
             .run()
             .expectClean()
     }
 
     @Test
     fun nonComposableLambda() {
-        lint().files(
-            kotlin(
-                """
+        lint()
+            .files(
+                kotlin(
+                    """
                 package androidx.compose.ui.foo
 
                 import androidx.compose.runtime.Composable
@@ -319,9 +327,9 @@
 
                 }
             """
-            ),
-            Stubs.Composable
-        )
+                ),
+                Stubs.Composable
+            )
             .run()
             .expectClean()
     }
diff --git a/compose/runtime/runtime-lint/src/test/java/androidx/compose/runtime/lint/ComposableNamingDetectorTest.kt b/compose/runtime/runtime-lint/src/test/java/androidx/compose/runtime/lint/ComposableNamingDetectorTest.kt
index f4c3354..c4707ca 100644
--- a/compose/runtime/runtime-lint/src/test/java/androidx/compose/runtime/lint/ComposableNamingDetectorTest.kt
+++ b/compose/runtime/runtime-lint/src/test/java/androidx/compose/runtime/lint/ComposableNamingDetectorTest.kt
@@ -29,9 +29,7 @@
 /* ktlint-disable max-line-length */
 @RunWith(JUnit4::class)
 
-/**
- * Test for [ComposableNamingDetector].
- */
+/** Test for [ComposableNamingDetector]. */
 class ComposableNamingDetectorTest : LintDetectorTest() {
     override fun getDetector(): Detector = ComposableNamingDetector()
 
@@ -40,9 +38,10 @@
 
     @Test
     fun returnsUnit_lowerCaseName_fails() {
-        lint().files(
-            kotlin(
-                """
+        lint()
+            .files(
+                kotlin(
+                    """
                 package androidx.compose.runtime.foo
 
                 import androidx.compose.runtime.Composable
@@ -50,9 +49,9 @@
                 @Composable
                 fun button() {}
             """
-            ),
-            Stubs.Composable
-        )
+                ),
+                Stubs.Composable
+            )
             .run()
             .expect(
                 """
@@ -74,9 +73,10 @@
 
     @Test
     fun returnsUnit_upperCaseName_passes() {
-        lint().files(
-            kotlin(
-                """
+        lint()
+            .files(
+                kotlin(
+                    """
                 package androidx.compose.runtime.foo
 
                 import androidx.compose.runtime.Composable
@@ -84,18 +84,19 @@
                 @Composable
                 fun Button() {}
             """
-            ),
-            Stubs.Composable
-        )
+                ),
+                Stubs.Composable
+            )
             .run()
             .expectClean()
     }
 
     @Test
     fun returnsValue_lowerCaseName_passes() {
-        lint().files(
-            kotlin(
-                """
+        lint()
+            .files(
+                kotlin(
+                    """
                 package androidx.compose.runtime.foo
 
                 import androidx.compose.runtime.Composable
@@ -103,18 +104,19 @@
                 @Composable
                 fun getInt(): Int { return 5 }
             """
-            ),
-            Stubs.Composable
-        )
+                ),
+                Stubs.Composable
+            )
             .run()
             .expectClean()
     }
 
     @Test
     fun returnsValue_upperCaseName_fails() {
-        lint().files(
-            kotlin(
-                """
+        lint()
+            .files(
+                kotlin(
+                    """
                 package androidx.compose.runtime.foo
 
                 import androidx.compose.runtime.Composable
@@ -122,9 +124,9 @@
                 @Composable
                 fun GetInt(): Int { return 5 }
             """
-            ),
-            Stubs.Composable
-        )
+                ),
+                Stubs.Composable
+            )
             .run()
             .expect(
                 """
@@ -146,9 +148,10 @@
 
     @Test
     fun ignoreNonComposableFunctions() {
-        lint().files(
-            kotlin(
-                """
+        lint()
+            .files(
+                kotlin(
+                    """
                 package androidx.compose.runtime.foo
 
                 fun button() {}
@@ -156,17 +159,18 @@
                 fun GetInt(): Int { return 5 }
                 fun getInt(): Int { return 5 }
             """
+                )
             )
-        )
             .run()
             .expectClean()
     }
 
     @Test
     fun ignoreOperatorComposableFunctions() {
-        lint().files(
-            kotlin(
-                """
+        lint()
+            .files(
+                kotlin(
+                    """
                 package androidx.compose.runtime.foo
 
                 import androidx.compose.runtime.Composable
@@ -179,18 +183,19 @@
                     operator fun unaryPlus() {}
                 }
             """
-            ),
-            Stubs.Composable
-        )
+                ),
+                Stubs.Composable
+            )
             .run()
             .expectClean()
     }
 
     @Test
     fun ignoreInvalidOverrides() {
-        lint().files(
-            kotlin(
-                """
+        lint()
+            .files(
+                kotlin(
+                    """
                 package androidx.compose.runtime.foo
 
                 import androidx.compose.runtime.Composable
@@ -218,9 +223,9 @@
                     override fun generic() {}
                 }
             """
-            ),
-            Stubs.Composable
-        )
+                ),
+                Stubs.Composable
+            )
             .run()
             .expectClean()
     }
diff --git a/compose/runtime/runtime-lint/src/test/java/androidx/compose/runtime/lint/ComposableStateFlowValueDetectorTest.kt b/compose/runtime/runtime-lint/src/test/java/androidx/compose/runtime/lint/ComposableStateFlowValueDetectorTest.kt
index 8c1c95d..abca27e4 100644
--- a/compose/runtime/runtime-lint/src/test/java/androidx/compose/runtime/lint/ComposableStateFlowValueDetectorTest.kt
+++ b/compose/runtime/runtime-lint/src/test/java/androidx/compose/runtime/lint/ComposableStateFlowValueDetectorTest.kt
@@ -32,23 +32,20 @@
 /* ktlint-disable max-line-length */
 @RunWith(JUnit4::class)
 
-/**
- * Test for [ComposableStateFlowValueDetector].
- */
+/** Test for [ComposableStateFlowValueDetector]. */
 class ComposableStateFlowValueDetectorTest : LintDetectorTest() {
     override fun getDetector(): Detector = ComposableStateFlowValueDetector()
 
     override fun getIssues(): MutableList<Issue> =
         mutableListOf(ComposableStateFlowValueDetector.StateFlowValueCalledInComposition)
 
-    /**
-     * Combined stub of StateFlow / supertypes
-     */
-    private val stateFlowStub: TestFile = bytecodeStub(
-        filename = "StateFlow.kt",
-        filepath = "kotlinx/coroutines/flow",
-        checksum = 0xd479b246,
-        """
+    /** Combined stub of StateFlow / supertypes */
+    private val stateFlowStub: TestFile =
+        bytecodeStub(
+            filename = "StateFlow.kt",
+            filepath = "kotlinx/coroutines/flow",
+            checksum = 0xd479b246,
+            """
         package kotlinx.coroutines.flow
 
         interface Flow<out T>
@@ -59,12 +56,12 @@
             val value: T
         }
         """,
-"""
+            """
         META-INF/main.kotlin_module:
         H4sIAAAAAAAA/2NgYGBmYGBgBGJOBijg0uKSScxLKcrPTKnQS87PLcgvTtUr
         Ks0rycxN1UvLzxfiCkktLnHLyS/3LlFi0GIAAH26nstEAAAA
         """,
-        """
+            """
         kotlinx/coroutines/flow/Flow.class:
         H4sIAAAAAAAA/31QPU8CQRSctygfJ+rhJybGaGcsPCRWakxsSC7BmAixoVpg
         IQvHXsLuIeX9LgtztT/K+A46Tdxi5r3Z2cy+9/X98QngFnXC6TR2kTbLYBDP
@@ -74,7 +71,7 @@
         6Yibk9fEOD1Tb9rqfqSejIn5oY6NLXIiNrE+BRwyCuajFR/geLVYQpE9pR4K
         IcohKiE8bHGJaoht7PRAFrvw+d6iZrFnsf8DtOaVdpUBAAA=
         """,
-        """
+            """
         kotlinx/coroutines/flow/SharedFlow.class:
         H4sIAAAAAAAA/31RTUtCQRQ992k+fVmpfWlERESLFj2TVilCG0kygpQ2rkYd
         bfQ5D94bzaW/q0W47kdF90kQFLq5554795zhzHx+vX8AuMER4WzkG0/pmdv1
@@ -85,7 +82,7 @@
         TmufhcrXISe3sMG57CgeYjjkajHml3iAwvI7CUneSrURq8OpY7OONLa4xXYd
         O8i0QSGyyPF5iN0QeyH2vwGCO5LBCwIAAA==
         """,
-        """
+            """
         kotlinx/coroutines/flow/StateFlow.class:
         H4sIAAAAAAAA/41RTU/bQBB9s3YcJ6VgAqUh/VALHIADpqiHilAkLqiRqBAk
         Qkg5bZIlLDG2lF2nHP1bOPAjeqgsjv1RVceU9lCE2svMvNl9b2fefv/x9RuA
@@ -98,13 +95,14 @@
         5V1u4BXnj3zjCbOmunBaeNrCdAszCLjEbAs1zHVBBvN41oVnsGDw3KBusGjg
         G1R+AgX9oFiBAgAA
         """
-    )
+        )
 
     @Test
     fun errors() {
-        lint().files(
-            kotlin(
-                """
+        lint()
+            .files(
+                kotlin(
+                    """
                 package androidx.compose.runtime.foo
 
                 import androidx.compose.runtime.Composable
@@ -163,10 +161,10 @@
                     }
                 }
             """
-            ),
-            Stubs.Composable,
-            stateFlowStub
-        )
+                ),
+                Stubs.Composable,
+                stateFlowStub
+            )
             .skipTestModes(TestMode.TYPE_ALIAS)
             .run()
             .expect(
@@ -220,9 +218,10 @@
 
     @Test
     fun noErrors() {
-        lint().files(
-            kotlin(
-                """
+        lint()
+            .files(
+                kotlin(
+                    """
                 package androidx.compose.runtime.foo
 
                 import androidx.compose.runtime.Composable
@@ -278,10 +277,10 @@
                     }
                 }
             """
-            ),
-            Stubs.Composable,
-            stateFlowStub
-        )
+                ),
+                Stubs.Composable,
+                stateFlowStub
+            )
             .run()
             .expectClean()
     }
diff --git a/compose/runtime/runtime-lint/src/test/java/androidx/compose/runtime/lint/CompositionLocalNamingDetectorTest.kt b/compose/runtime/runtime-lint/src/test/java/androidx/compose/runtime/lint/CompositionLocalNamingDetectorTest.kt
index eaf12b9..c08db15 100644
--- a/compose/runtime/runtime-lint/src/test/java/androidx/compose/runtime/lint/CompositionLocalNamingDetectorTest.kt
+++ b/compose/runtime/runtime-lint/src/test/java/androidx/compose/runtime/lint/CompositionLocalNamingDetectorTest.kt
@@ -29,9 +29,7 @@
 /* ktlint-disable max-line-length */
 @RunWith(JUnit4::class)
 
-/**
- * Test for [CompositionLocalNamingDetector].
- */
+/** Test for [CompositionLocalNamingDetector]. */
 class CompositionLocalNamingDetectorTest : LintDetectorTest() {
     override fun getDetector(): Detector = CompositionLocalNamingDetector()
 
@@ -39,11 +37,12 @@
         mutableListOf(CompositionLocalNamingDetector.CompositionLocalNaming)
 
     // Simplified CompositionLocal.kt stubs
-    private val compositionLocalStub = bytecodeStub(
-        filename = "CompositionLocal.kt",
-        filepath = "androidx/compose/runtime",
-        checksum = 0xeda1836e,
-        """
+    private val compositionLocalStub =
+        bytecodeStub(
+            filename = "CompositionLocal.kt",
+            filepath = "androidx/compose/runtime",
+            checksum = 0xeda1836e,
+            """
             package androidx.compose.runtime
 
             sealed class CompositionLocal<T> constructor(defaultFactory: (() -> T)? = null)
@@ -68,13 +67,13 @@
                 defaultFactory: (() -> T)? = null
             ): ProvidableCompositionLocal<T> = StaticProvidableCompositionLocal(defaultFactory)
         """,
-"""
+            """
         META-INF/main.kotlin_module:
         H4sIAAAAAAAA/2NgYGBmYGBgBGJOBijg0uOSSMxLKcrPTKnQS87PLcgvTtUr
         Ks0rycxNFRJyBgtklmTm5/nkJyfmeJdwqXHJ4FKvl5afL8QWklpc4l2ixKDF
         AAAiXiK7cAAAAA==
         """,
-        """
+            """
         androidx/compose/runtime/CompositionLocal.class:
         H4sIAAAAAAAA/5VTS08TURT+7nT6YOQxFMWCqCCofShTiRoUQlQMSZMiCk03
         LMxlZsBL2xkyc9vgxjT+C7f+A1YkLkzD0h9lPHdalKCksjmv+51zvjPnzI+f
@@ -92,7 +91,7 @@
         as+JfOEY146i9SsG093obwaJHgNljeN6lNVlE8PDSN/HPOkXhMkQ34ltxEqY
         LOFGCVO4SSZulXAb09tgIWZwZxvJEEMhZkPMhRgOcTdUkXu/AG89zFz4BAAA
         """,
-        """
+            """
         androidx/compose/runtime/CompositionLocalKt.class:
         H4sIAAAAAAAA/51UW08TQRT+ZntfCpSiUIoXhKpclC0gqLSSGAyxoVwiDcbw
         NN0uZHrZJbvbBl4Mf8N/4ZtGE9Nnf5TxzLZELZSavpw5M+eb73x7zpn9+evb
@@ -112,7 +111,7 @@
         e12FjhHhOBGOUXjNAy3iOa2viO0+1XjqCL4cHuQwncMMUjk8xKMcHmP2CMzB
         HOaPEHQQcLDg4ImDuIOnDhK/AezqFjcEBwAA
         """,
-        """
+            """
         androidx/compose/runtime/DynamicProvidableCompositionLocal.class:
         H4sIAAAAAAAA/51SXU8TQRQ9sy0tXaGUIljwAxQ0AolbUBNDaxPFEJpUJNLw
         wtN0d6jT7s6a3dkG3vpb/Ac+mfhgGh/9UcY7bYloQkh4mXvumXPP3Lkzv35/
@@ -128,7 +127,7 @@
         hy4Z5DFDTo+GFZNYpZg11jkCqTGdwtowPsBjiq9pt0CGsydI1VGsY66O25gn
         iIU67qB0AhZjEUsnyMSYjnE3xr0Y+Rj3Y2T/AJbWL04aBAAA
         """,
-        """
+            """
         androidx/compose/runtime/ProvidableCompositionLocal.class:
         H4sIAAAAAAAA/41SXU9TQRA9e1vacsVSikLBLxBEgcRbURNjK0YxjTUFURpe
         eNr2Lrjt7V6zd2+Db/0t/gOfTHwwjY/+KONsWyKSEHjZmT1z5szszP7+8+Mn
@@ -145,7 +144,7 @@
         RnAC9wb2DlbIvqDoFHWRP0CiiukqrlVxHTPkYraKAuYOwCLM48YBUhGyEW5G
         uBVhMsLtCOm/jQDw8EUEAAA=
         """,
-        """
+            """
         androidx/compose/runtime/StaticProvidableCompositionLocal.class:
         H4sIAAAAAAAA/51SXW8SQRQ9s1A+1pZSaiutH60WjW0Tl1ZNVJBEmzQlwUqE
         8MLTsDvFgWXX7M6S+sZv8R/4ZOKDIT76o4x3gMZqQpr0Ze65Z849c+fO/Pr9
@@ -161,13 +160,14 @@
         pYlLgvhlcnowqUhhh2JSW6cJxGZ0DIVJvIeHFF/TrjZcaSNWRa6K1SpuYo0g
         1qu4hXwbLMQGNttIhFgKcTvEnRCZEHdDJP8AhWEFiBgEAAA=
         """
-    )
+        )
 
     @Test
     fun noLocalPrefix() {
-        lint().files(
-            kotlin(
-                """
+        lint()
+            .files(
+                kotlin(
+                    """
                 package androidx.compose.runtime.foo
 
                 import androidx.compose.runtime.*
@@ -187,9 +187,9 @@
                     }
                 }
             """
-            ),
-            compositionLocalStub
-        )
+                ),
+                compositionLocalStub
+            )
             .run()
             .expect(
                 """
@@ -209,9 +209,10 @@
 
     @Test
     fun prefixedWithLocal() {
-        lint().files(
-            kotlin(
-                """
+        lint()
+            .files(
+                kotlin(
+                    """
                 package androidx.compose.runtime.foo
 
                 import androidx.compose.runtime.*
@@ -228,9 +229,9 @@
                     }
                 }
             """
-            ),
-            compositionLocalStub
-        )
+                ),
+                compositionLocalStub
+            )
             .run()
             .expectClean()
     }
diff --git a/compose/runtime/runtime-lint/src/test/java/androidx/compose/runtime/lint/MutableCollectionMutableStateDetectorTest.kt b/compose/runtime/runtime-lint/src/test/java/androidx/compose/runtime/lint/MutableCollectionMutableStateDetectorTest.kt
index 594cabd..e77e697 100644
--- a/compose/runtime/runtime-lint/src/test/java/androidx/compose/runtime/lint/MutableCollectionMutableStateDetectorTest.kt
+++ b/compose/runtime/runtime-lint/src/test/java/androidx/compose/runtime/lint/MutableCollectionMutableStateDetectorTest.kt
@@ -31,9 +31,7 @@
 /* ktlint-disable max-line-length */
 @RunWith(JUnit4::class)
 
-/**
- * Test for [MutableCollectionMutableStateDetector].
- */
+/** Test for [MutableCollectionMutableStateDetector]. */
 class MutableCollectionMutableStateDetectorTest : LintDetectorTest() {
     override fun getDetector(): Detector = MutableCollectionMutableStateDetector()
 
@@ -43,11 +41,12 @@
     /**
      * Extensions / subclasses around Kotlin mutable collections, both in source and compiled form.
      */
-    private val KotlinMutableCollectionExtensions = kotlinAndBytecodeStub(
-        filename = "MutableCollectionExtensions.kt",
-        filepath = "stubs",
-        checksum = 0xb32e2e72,
-        """
+    private val KotlinMutableCollectionExtensions =
+        kotlinAndBytecodeStub(
+            filename = "MutableCollectionExtensions.kt",
+            filepath = "stubs",
+            checksum = 0xb32e2e72,
+            """
             package stubs
 
             fun mutableList(): MutableList<Int> = mutableListOf()
@@ -70,13 +69,13 @@
             object MutableCollectionObject : MutableCollection<Int> by mutableListOf()
             class MutableCollectionSubclass : MutableCollection<Int> by mutableListOf()
         """,
-"""
+            """
         META-INF/main.kotlin_module:
         H4sIAAAAAAAA/2NgYGBmYGBgBGJOBijg0uaSSMxLKcrPTKnQS87PLcgvTtUr
         Ks0rycxNFeIPzkssKM7ILwkuSSxJ9S7hUuNiLS4pTSoWkvUtLUlMykl1zs/J
         SU0uyczPc60oSc0rBjKKger4uFhKUotLhNhCgKR3iRKDFgMAINgad30AAAA=
         """,
-        """
+            """
         stubs/MutableCollectionExtensionsKt.class:
         H4sIAAAAAAAA/52W224aRxjH/wMLCwuGBWM7Jond4HOcZMk5rl23rps0NOA0
         cRSp8tVir+jasETMYqV3fpY+QVtfVGqlCvWyr9B3qfrNerXLjqFKiszOzHf4
@@ -101,7 +100,7 @@
         oBLN9crjqeM1tceU+TlFf3GAeA07NXxZwy6+quEpntXwNZ4fgHHU8M0Bpjge
         cbzw/h7S4eIoev0CR5Ljltdf51jkmPf6cxwzHFWOBKffXpj+F3+GwS2MCQAA
         """,
-        """
+            """
         stubs/MutableCollectionObject.class:
         H4sIAAAAAAAA/6VWW1cTVxT+zoQkQzLKEAzXilpRA2kJotUWkIKINRpACaUq
         tnYIIw5MJnZmQtXe6M3erw8+9LHPPtTVFrGu1UXtW39UV/eZGRIIA9J2rWTO
@@ -141,7 +140,7 @@
         bfFBGh/ioykwCx/jzhQaLf77xPlFLbRYaLLQbKHVobRbSFpIOfse53nCwoCF
         UxbOOK8jFkYtZC1M/gPQMrgUVA8AAA==
         """,
-        """
+            """
         stubs/MutableCollectionSubclass.class:
         H4sIAAAAAAAA/6VWW1cTVxT+TkLuI5kECbcWpaIG0hJAqy0gBW81GkAJpSq2
         dghjHJhM7MyEqr3R+/3Vhz722Ye6VovYrtVFfeyP6uo+k2ECyURou1Yy58ze
@@ -180,7 +179,7 @@
         PrV+EQNdBjoMdBrotih9BlIG0tZ+xHqeMjBh4KyBC9brlIFpAzkD8/8AHPTg
         +vQOAAA=
         """,
-        """
+            """
         stubs/MutableListObject.class:
         H4sIAAAAAAAA/6VYiXsT1xH/7cqWZGmN1wLfxIZg4kMEGZKSBjs0DhAiMCZg
         1yW4NFnLi1lbB9WuXJM2LU3apOl90pbeaXrTFprE4NCmDumZHn9Sv868fV5L
@@ -236,7 +235,7 @@
         xjEb222csDFu47SYOmvjGTGwbMzaKNgo2ijZWLBx0cZzNp638cL/AWVqBCvg
         GAAA
         """,
-        """
+            """
         stubs/MutableListSubclass.class:
         H4sIAAAAAAAA/6VYi3sTxxH/nWTrecZnGb+JDcHEDxFkSEoaTGgcIETYQMCu
         S3BpcpYPc7YeVHtyDW1amrRN0/eTtvSdpm/aQpsYnLSpQ9/9o/p1Zm99luST
@@ -290,7 +289,7 @@
         I//iAh0CbQLtAtukpE8+HxbYI7BPjkcEjggcExgV2CFwSmBC4KycOi/wghzY
         AnMCBYGiQElgUeCywIsCLwm8/H/95bQCgBgAAA==
         """,
-        """
+            """
         stubs/MutableMapObject.class:
         H4sIAAAAAAAA/7VW61cb1xH/3ZWQhFjsRbxk2QEnlmMBiYWp6ziF0gIhtgzG
         Brk0sUvTRazxotXK1V1RO325r/SRPvJo3Tb91s/+gE9bJ27O6aHut/5RPZ3Z
@@ -334,7 +333,7 @@
         b0FI/Aw/v4UXJPokfuH+OiTe3aH7JZISv5QYkDgtcUoiLTHiLmUkhiTOuvQ5
         9zshMSkxJTEtcUHiksScxLzEdYm8K7DyXx6SSY0REgAA
         """,
-        """
+            """
         stubs/MutableMapSubclass.class:
         H4sIAAAAAAAA/7VW63Mb1RX/3ZWsl9fxWn4pSrADUYhsQ+S4aQjYGOw0JIqd
         hy1qIMHAWt44a61WQXflJpSW8OgDSh9Amw/92M/5YGbaQGCGMfnIH8X0nN21
@@ -377,7 +376,7 @@
         99cp8fttelAiIfEHiSGJYxJHJVISY+5SWmJE4oRLn3THKYlpiRmJWYnTEucl
         5iTmJa5K5FyB5f8CUiecwrERAAA=
         """,
-        """
+            """
         stubs/MutableSetObject.class:
         H4sIAAAAAAAA/6VX61cTRxT/zQaSJVnMEt5o0VbUQCpBtL5CqUixRl5CUqrQ
         1i7JGhaSjd3dULUv+rLv5wc/9GM/+6Getoj1nB5qv/WP6umd3XV5LcppzyEz
@@ -417,7 +416,7 @@
         xhI+oCE+TOMjfDwDZuIT3KKHoUn/3+JT+y9iotVEs8mFe2zJIROdJg7b45N2
         mzLRb+KsiXP257CJERMTJrL/AgVNgdYyDwAA
         """,
-        """
+            """
         stubs/MutableSetSubclass.class:
         H4sIAAAAAAAA/6VWW3PTRhT+Vo7vCpGde6CBlgBOXOIQKDenKYFCMbmRxE1p
         0pYqtnAUyzKV5BToLb3fX3noY595KDNtCO1MJ+WxP6rTs7IiJ44MmXbG1q7O
@@ -456,17 +455,18 @@
         PrN/URPdJjpNLjxgS46Z6Ddx3J6ftZ9pE6MmLpq4Yr+Om5gwMWMi+y/NlFaM
         0g4AAA==
         """
-    )
+        )
 
     /**
      * Extensions / subclasses around Kotlin immutable collections, both in source and compiled
      * form.
      */
-    private val KotlinImmutableCollectionExtensions = kotlinAndBytecodeStub(
-        filename = "ImmutableCollectionExtensions.kt",
-        filepath = "stubs",
-        checksum = 0x366b10e3,
-        """
+    private val KotlinImmutableCollectionExtensions =
+        kotlinAndBytecodeStub(
+            filename = "ImmutableCollectionExtensions.kt",
+            filepath = "stubs",
+            checksum = 0x366b10e3,
+            """
             package stubs
 
             fun list(): List<Int> = listOf()
@@ -489,13 +489,13 @@
             object CollectionObject : Collection<Int> by listOf()
             class CollectionSubclass : Collection<Int> by listOf()
         """,
-"""
+            """
         META-INF/main.kotlin_module:
         H4sIAAAAAAAA/y2KuwrCQBBFR3yAUyhsZSdYSYT8hFhIyvgDm2TAhd2dkLkL
         +Xy38MI5nOIS0ZaINpUj/ccPvvg8LRqmtR01zWrSLiUjJHHnPvvZvooeHtKB
         77w3lMHc9Z1SgR+iPDVGGRE0v1ZIthpWnyfeQQzu8KnucKOGfhfuUbR/AAAA
         """,
-        """
+            """
         stubs/CollectionObject.class:
         H4sIAAAAAAAA/61WW1cTVxT+zoQkwxAhRLlbGitqIEoQrVZBWqRYg1wUkKrU
         2iEZwsBkJp2ZULQ3e7P3PvrQ1ac++6CrrWJdq6X2rT+qq/tMxiEmg8tlXSs5
@@ -534,7 +534,7 @@
         /YLVO44g4JoI4Dtn/hzf08yDvUZMX51HII1rabyfxgf4kJb4KI2PcX0ezMIn
         +HQeDRbaLHzm/OosdFpot9BhYZcj2W+h10K/hRMWhknyH/VQQCa0DgAA
         """,
-        """
+            """
         stubs/CollectionSubclass.class:
         H4sIAAAAAAAA/61WW3PTVhD+jhzbsiISx5CQC01NCeDEEIdAoeA0baChOOQC
         SUiBlFLFVhwlsuRKchrojd7bP8BDH/vMA51pIbQzbcpjf1Sne2ShGFthGMqM
@@ -572,7 +572,7 @@
         aOT7aFMSnUWEcqjksJ7Dx9igKW7lcBufLILZ+BSfLaLVRpeNz91fs41eG902
         emzsdyVHbAzaGLbxpo0xkvwHiMP5IlQOAAA=
         """,
-        """
+            """
         stubs/ImmutableCollectionExtensionsKt.class:
         H4sIAAAAAAAA/51VW1PbRhg9a/kiK8IWtnOxIYkxhEATEJA0aQolTWmSqjGk
         LZ288CSDxiOQZca7ZtI3fkt/QVteOn3oMH3sX+h/6fRbWZGMsDtJbGt3v9s5
@@ -597,7 +597,7 @@
         SwvP8JWFLXxt4Tle7IFxvMQ3e7jK8YDDCn5rHMscxWBc4MhyLAbjBY4Zjulg
         PMVR4VjiyHDUOcr/AfU3caL+CAAA
         """,
-        """
+            """
         stubs/ListObject.class:
         H4sIAAAAAAAA/61Y+18U1xX/zizsLssqCwoIWN0aEheILmqaNC5FiSXNImIU
         QqO2NcPugAOzs9uZWYrpI6aPJH2mTVvbpu/03dpWm0Qh9tNa+1v/qH56zp3L
@@ -649,7 +649,7 @@
         fgG9Dnoc3BD/Wx3sdpjS52CvoAw6eNTBsFhnHBxz0O/guINxB1lBnHJwRizO
         O7jo4IX/Af1E8byHFwAA
         """,
-        """
+            """
         stubs/ListSubclass.class:
         H4sIAAAAAAAA/61Y+3cbRxX+ZmU9LCuxrMR2bIdEpG4jW02kJKWllnHqBpfK
         cZwmdk0bA+laWjtrr1Zid2Wc8kp5tTwLBQKUd3lDgACtY8M5YPIjfxSHO7Pj
@@ -699,7 +699,7 @@
         ORX4W3Tw5fGLPH6Zx6/waxriN3n8Fr+bB7Pxe/xhHv02+mzcEv87bBy2uWTA
         xlEhGbbxqI2sGOdsnLUxaOMpGxM28kI4beOSGFyxcdXGS/8DOjz+UycXAAA=
         """,
-        """
+            """
         stubs/MapObject.class:
         H4sIAAAAAAAA/7VY+1cbxxX+ZiUkIYS9yObdJNihRoCxMHGd2FJpgWJHNmAD
         Do5xE2cRC1m02lV3V9SkTeM+8uj77abpO323bktOWztpzmld97f+UT29M7tI
@@ -750,7 +750,7 @@
         /Ez8Gmz8fKNN8k4bv7BxxEbMxjEbPTZOiK5+G8fp3UK0kzaGbYzYGLVx2sb5
         /wNOKu12BRsAAA==
         """,
-        """
+            """
         stubs/MapSubclass.class:
         H4sIAAAAAAAA/7VY+1cbxxX+ZiUkIWR7kQ3m0STYoSDAWJi4TmyptECxIxts
         AwlOcBNnEYuyaLWr7q6oSZvWbZP0/W7dNH2n7x7/QM9pnaQ9p3X9Y/+ont6Z
@@ -799,7 +799,7 @@
         E4EMvp/BDzL4IX5ETfw4g7v4yU0wG2/jpzfRZaPTxjvi12LjZ5ttknfb+LmN
         EzYSNvps9Ns4LbqGbJyiVwTRTtsYszFuY8LGORuX/g8xSG5wpRoAAA==
         """,
-        """
+            """
         stubs/SetObject.class:
         H4sIAAAAAAAA/61WbVcTRxR+ZkOyy7JIiCICVlNFDUQJotVqKBYp1iAvSpCq
         2NolWXFhs5vubij21b7Z9g/4oR97+tEPetoq1nNaar/1R/X0zmZdQhJ6ONZz
@@ -837,7 +837,7 @@
         5LsI4Vtv/hzf0TxHZg4x7c4hlEEpg+UMPsQKLXE7g4/wMSk4+ASfziHqoMPB
         Z95fk4PdDjoddDnY60l6HRx20O+t0w7O0OJfSxUks8cNAAA=
         """,
-        """
+            """
         stubs/SetSubclass.class:
         H4sIAAAAAAAA/61WW3PTVhD+jhzfFIUohgBJKLgQwIkhDoFCwWlooKE45AJx
         SIHQUsUWRoksuZKchl7p5Tfw0Ic+9JkHOtNCaGfalMf+qE73yIrs2EonQ5mx
@@ -874,13 +874,14 @@
         Es1FhHKo5PBJDhZsmsLJoYpVUrDxKdYWIdvosfHQ/bXbOGCj10afjUOuZNDG
         CRvD7jxr4yJN/gX455r+Zw0AAA==
         """
-    )
+        )
 
     @Test
     fun mutableCollection_stdlib() {
-        lint().files(
-            kotlin(
-                """
+        lint()
+            .files(
+                kotlin(
+                    """
                 package test
 
                 import androidx.compose.runtime.*
@@ -913,10 +914,10 @@
                     val collectionProperty = mutableStateOf(collectionParam)
                 }
             """
-            ),
-            Stubs.SnapshotState,
-            Stubs.StateFactoryMarker
-        )
+                ),
+                Stubs.SnapshotState,
+                Stubs.StateFactoryMarker
+            )
             .skipTestModes(TestMode.TYPE_ALIAS)
             .run()
             .expect(
@@ -961,9 +962,10 @@
 
     @Test
     fun mutableCollection_stdlib_explicitExpressionType_noErrors() {
-        lint().files(
-            kotlin(
-                """
+        lint()
+            .files(
+                kotlin(
+                    """
                 package test
 
                 import androidx.compose.runtime.*
@@ -996,10 +998,10 @@
                     val collectionProperty = mutableStateOf<Collection<Int>>(collectionParam)
                 }
             """
-            ),
-            Stubs.SnapshotState,
-            Stubs.StateFactoryMarker
-        )
+                ),
+                Stubs.SnapshotState,
+                Stubs.StateFactoryMarker
+            )
             .skipTestModes(TestMode.TYPE_ALIAS)
             .run()
             .expectClean()
@@ -1007,9 +1009,10 @@
 
     @Test
     fun mutableCollection_stdlib_explicitPropertyType_noErrors() {
-        lint().files(
-            kotlin(
-                """
+        lint()
+            .files(
+                kotlin(
+                    """
                 package test
 
                 import androidx.compose.runtime.*
@@ -1042,10 +1045,10 @@
                     val collectionProperty: MutableState<Collection<Int>> = mutableStateOf(collectionParam)
                 }
             """
-            ),
-            Stubs.SnapshotState,
-            Stubs.StateFactoryMarker
-        )
+                ),
+                Stubs.SnapshotState,
+                Stubs.StateFactoryMarker
+            )
             .skipTestModes(TestMode.TYPE_ALIAS)
             .run()
             .expectClean()
@@ -1053,9 +1056,10 @@
 
     @Test
     fun mutableCollection_java() {
-        lint().files(
-            kotlin(
-                """
+        lint()
+            .files(
+                kotlin(
+                    """
                 package test
 
                 import androidx.compose.runtime.*
@@ -1100,10 +1104,10 @@
                     val collectionProperty = mutableStateOf(collectionParam)
                 }
             """
-            ),
-            Stubs.SnapshotState,
-            Stubs.StateFactoryMarker
-        )
+                ),
+                Stubs.SnapshotState,
+                Stubs.StateFactoryMarker
+            )
             .skipTestModes(TestMode.TYPE_ALIAS)
             .run()
             .expect(
@@ -1169,9 +1173,10 @@
      */
     @Test
     fun mutableCollection_kotlinTypeAliases() {
-        lint().files(
-            kotlin(
-                """
+        lint()
+            .files(
+                kotlin(
+                    """
                 package test
 
                 import androidx.compose.runtime.*
@@ -1211,10 +1216,10 @@
                     val linkedMapParameter = mutableStateOf(linkedMapParam)
                 }
             """
-            ),
-            Stubs.SnapshotState,
-            Stubs.StateFactoryMarker
-        )
+                ),
+                Stubs.SnapshotState,
+                Stubs.StateFactoryMarker
+            )
             .skipTestModes(TestMode.TYPE_ALIAS)
             .run()
             .expect(
@@ -1271,9 +1276,10 @@
 
     @Test
     fun mutableCollection_sourceExtensions() {
-        lint().files(
-            kotlin(
-                """
+        lint()
+            .files(
+                kotlin(
+                    """
                 package test
 
                 import androidx.compose.runtime.*
@@ -1299,11 +1305,11 @@
                 val collectionObjectImplementation = mutableStateOf(MutableCollectionObject)
                 val collectionSubclass = mutableStateOf(MutableCollectionSubclass())
             """
-            ),
-            Stubs.SnapshotState,
-            Stubs.StateFactoryMarker,
-            KotlinMutableCollectionExtensions.kotlin
-        )
+                ),
+                Stubs.SnapshotState,
+                Stubs.StateFactoryMarker,
+                KotlinMutableCollectionExtensions.kotlin
+            )
             .skipTestModes(TestMode.TYPE_ALIAS)
             .run()
             .expect(
@@ -1363,9 +1369,10 @@
 
     @Test
     fun mutableCollection_compiledExtensions() {
-        lint().files(
-            kotlin(
-                """
+        lint()
+            .files(
+                kotlin(
+                    """
                 package test
 
                 import androidx.compose.runtime.*
@@ -1391,12 +1398,12 @@
                 val collectionObjectImplementation = mutableStateOf(MutableCollectionObject)
                 val collectionSubclass = mutableStateOf(MutableCollectionSubclass())
             """
-            ),
-            Stubs.SnapshotState,
-            Stubs.StateFactoryMarker,
-            Stubs.Composable,
-            KotlinMutableCollectionExtensions.bytecode
-        )
+                ),
+                Stubs.SnapshotState,
+                Stubs.StateFactoryMarker,
+                Stubs.Composable,
+                KotlinMutableCollectionExtensions.bytecode
+            )
             .skipTestModes(TestMode.TYPE_ALIAS)
             .run()
             .expect(
@@ -1456,9 +1463,10 @@
 
     @Test
     fun immutableCollection_stdlib_noErrors() {
-        lint().files(
-            kotlin(
-                """
+        lint()
+            .files(
+                kotlin(
+                    """
                 package test
 
                 import androidx.compose.runtime.*
@@ -1491,10 +1499,10 @@
                     val collectionProperty = mutableStateOf(collectionParam)
                 }
             """
-            ),
-            Stubs.SnapshotState,
-            Stubs.StateFactoryMarker
-        )
+                ),
+                Stubs.SnapshotState,
+                Stubs.StateFactoryMarker
+            )
             .skipTestModes(TestMode.TYPE_ALIAS)
             .run()
             .expectClean()
@@ -1502,9 +1510,10 @@
 
     @Test
     fun immutableCollection_sourceExtensions_noErrors() {
-        lint().files(
-            kotlin(
-                """
+        lint()
+            .files(
+                kotlin(
+                    """
                 package test
 
                 import androidx.compose.runtime.*
@@ -1530,11 +1539,11 @@
                 val collectionObjectImplementation = mutableStateOf(CollectionObject)
                 val collectionSubclass = mutableStateOf(CollectionSubclass())
             """
-            ),
-            Stubs.SnapshotState,
-            Stubs.StateFactoryMarker,
-            KotlinImmutableCollectionExtensions.kotlin
-        )
+                ),
+                Stubs.SnapshotState,
+                Stubs.StateFactoryMarker,
+                KotlinImmutableCollectionExtensions.kotlin
+            )
             .skipTestModes(TestMode.TYPE_ALIAS)
             .run()
             .expectClean()
@@ -1542,9 +1551,10 @@
 
     @Test
     fun immutableCollection_compiledExtensions_noErrors() {
-        lint().files(
-            kotlin(
-                """
+        lint()
+            .files(
+                kotlin(
+                    """
                 package test
 
                 import androidx.compose.runtime.*
@@ -1570,12 +1580,12 @@
                 val collectionObjectImplementation = mutableStateOf(CollectionObject)
                 val collectionSubclass = mutableStateOf(CollectionSubclass())
             """
-            ),
-            Stubs.SnapshotState,
-            Stubs.StateFactoryMarker,
-            Stubs.Composable,
-            KotlinImmutableCollectionExtensions.bytecode
-        )
+                ),
+                Stubs.SnapshotState,
+                Stubs.StateFactoryMarker,
+                Stubs.Composable,
+                KotlinImmutableCollectionExtensions.bytecode
+            )
             .skipTestModes(TestMode.TYPE_ALIAS)
             .run()
             .expectClean()
diff --git a/compose/runtime/runtime-lint/src/test/java/androidx/compose/runtime/lint/ProduceStateDetectorTest.kt b/compose/runtime/runtime-lint/src/test/java/androidx/compose/runtime/lint/ProduceStateDetectorTest.kt
index e83b2b96..39730e1 100644
--- a/compose/runtime/runtime-lint/src/test/java/androidx/compose/runtime/lint/ProduceStateDetectorTest.kt
+++ b/compose/runtime/runtime-lint/src/test/java/androidx/compose/runtime/lint/ProduceStateDetectorTest.kt
@@ -30,9 +30,7 @@
 /* ktlint-disable max-line-length */
 @RunWith(JUnit4::class)
 
-/**
- * Test for [ProduceStateDetector].
- */
+/** Test for [ProduceStateDetector]. */
 class ProduceStateDetectorTest : LintDetectorTest() {
     override fun getDetector(): Detector = ProduceStateDetector()
 
@@ -41,9 +39,10 @@
 
     @Test
     fun errors() {
-        lint().files(
-            kotlin(
-                """
+        lint()
+            .files(
+                kotlin(
+                    """
                 package androidx.compose.runtime.foo
 
                 import androidx.compose.runtime.*
@@ -73,10 +72,10 @@
 
                 fun <T> doSomethingElseWithState(state: State<T>) {}
             """
-            ),
-            Stubs.Composable,
-            Stubs.SnapshotState
-        )
+                ),
+                Stubs.Composable,
+                Stubs.SnapshotState
+            )
             .skipTestModes(TestMode.TYPE_ALIAS)
             .run()
             .expect(
@@ -100,9 +99,10 @@
 
     @Test
     fun noErrors() {
-        lint().files(
-            kotlin(
-                """
+        lint()
+            .files(
+                kotlin(
+                    """
                 package androidx.compose.runtime.foo
 
                 import androidx.compose.runtime.*
@@ -137,10 +137,10 @@
 
                 fun <T> doSomethingElseWithScope(scope: ProduceStateScope<T>) {}
             """
-            ),
-            Stubs.Composable,
-            Stubs.SnapshotState
-        )
+                ),
+                Stubs.Composable,
+                Stubs.SnapshotState
+            )
             .run()
             .expectClean()
     }
diff --git a/compose/runtime/runtime-lint/src/test/java/androidx/compose/runtime/lint/RememberDetectorTest.kt b/compose/runtime/runtime-lint/src/test/java/androidx/compose/runtime/lint/RememberDetectorTest.kt
index 937ec62..92205a2 100644
--- a/compose/runtime/runtime-lint/src/test/java/androidx/compose/runtime/lint/RememberDetectorTest.kt
+++ b/compose/runtime/runtime-lint/src/test/java/androidx/compose/runtime/lint/RememberDetectorTest.kt
@@ -29,9 +29,7 @@
 /* ktlint-disable max-line-length */
 @RunWith(JUnit4::class)
 
-/**
- * Test for [RememberDetector].
- */
+/** Test for [RememberDetector]. */
 class RememberDetectorTest : LintDetectorTest() {
     override fun getDetector(): Detector = RememberDetector()
 
@@ -40,9 +38,10 @@
 
     @Test
     fun returnsUnit() {
-        lint().files(
-            kotlin(
-                """
+        lint()
+            .files(
+                kotlin(
+                    """
                 package androidx.compose.runtime.foo
 
                 import androidx.compose.runtime.Composable
@@ -132,10 +131,10 @@
                     val unit2 = remember(number1, number2, number3, flag, calculation = unitLambda)
                 }
             """
-            ),
-            Stubs.Composable,
-            Stubs.Remember
-        )
+                ),
+                Stubs.Composable,
+                Stubs.Remember
+            )
             .run()
             .expect(
                 """
@@ -206,9 +205,10 @@
 
     @Test
     fun returnsUnit_dueToTypeError() {
-        lint().files(
-            kotlin(
-                """
+        lint()
+            .files(
+                kotlin(
+                    """
                 package androidx.compose.runtime.foo
 
                 import androidx.compose.runtime.Composable
@@ -228,19 +228,20 @@
                     }
                 }
                 """
-            ),
-            Stubs.Composable,
-            Stubs.Remember
-        )
+                ),
+                Stubs.Composable,
+                Stubs.Remember
+            )
             .run()
             .expectClean()
     }
 
     @Test
     fun returnsValue_explicitUnitType() {
-        lint().files(
-            kotlin(
-                """
+        lint()
+            .files(
+                kotlin(
+                    """
                 package androidx.compose.runtime.foo
 
                 import androidx.compose.runtime.Composable
@@ -315,10 +316,10 @@
                     }
                 }
             """
-            ),
-            Stubs.Composable,
-            Stubs.Remember
-        )
+                ),
+                Stubs.Composable,
+                Stubs.Remember
+            )
             .run()
             .expect(
                 """
@@ -359,9 +360,10 @@
 
     @Test
     fun noErrors() {
-        lint().files(
-            kotlin(
-                """
+        lint()
+            .files(
+                kotlin(
+                    """
                 package androidx.compose.runtime.foo
 
                 import androidx.compose.runtime.Composable
@@ -426,10 +428,10 @@
                     }
                 }
             """
-            ),
-            Stubs.Composable,
-            Stubs.Remember
-        )
+                ),
+                Stubs.Composable,
+                Stubs.Remember
+            )
             .run()
             .expectClean()
     }
diff --git a/compose/runtime/runtime-lint/src/test/java/androidx/compose/runtime/lint/UnrememberedStateDetectorTest.kt b/compose/runtime/runtime-lint/src/test/java/androidx/compose/runtime/lint/UnrememberedStateDetectorTest.kt
index a10571f..ae21bae 100644
--- a/compose/runtime/runtime-lint/src/test/java/androidx/compose/runtime/lint/UnrememberedStateDetectorTest.kt
+++ b/compose/runtime/runtime-lint/src/test/java/androidx/compose/runtime/lint/UnrememberedStateDetectorTest.kt
@@ -30,9 +30,7 @@
 /* ktlint-disable max-line-length */
 @RunWith(JUnit4::class)
 
-/**
- * Test for [UnrememberedStateDetector].
- */
+/** Test for [UnrememberedStateDetector]. */
 class UnrememberedStateDetectorTest : LintDetectorTest() {
     override fun getDetector(): Detector = UnrememberedStateDetector()
 
@@ -41,9 +39,10 @@
 
     @Test
     fun notRemembered() {
-        lint().files(
-            kotlin(
-                """
+        lint()
+            .files(
+                kotlin(
+                    """
                 package androidx.compose.runtime.foo
 
                 import androidx.compose.runtime.*
@@ -115,12 +114,12 @@
                     }
                 }
             """
-            ),
-            Stubs.Composable,
-            Stubs.SnapshotState,
-            Stubs.StateFactoryMarker,
-            Stubs.Remember
-        )
+                ),
+                Stubs.Composable,
+                Stubs.SnapshotState,
+                Stubs.StateFactoryMarker,
+                Stubs.Remember
+            )
             .skipTestModes(TestMode.TYPE_ALIAS)
             .run()
             .expect(
@@ -228,9 +227,10 @@
 
     @Test
     fun rememberedInsideComposableBody() {
-        lint().files(
-            kotlin(
-                """
+        lint()
+            .files(
+                kotlin(
+                    """
                 package androidx.compose.runtime.foo
 
                 import androidx.compose.runtime.*
@@ -313,21 +313,22 @@
                     }
                 }
             """
-            ),
-            Stubs.Composable,
-            Stubs.SnapshotState,
-            Stubs.StateFactoryMarker,
-            Stubs.Remember
-        )
+                ),
+                Stubs.Composable,
+                Stubs.SnapshotState,
+                Stubs.StateFactoryMarker,
+                Stubs.Remember
+            )
             .run()
             .expectClean()
     }
 
     @Test
     fun noErrors() {
-        lint().files(
-            kotlin(
-                """
+        lint()
+            .files(
+                kotlin(
+                    """
                 package androidx.compose.runtime.foo
 
                 import androidx.compose.runtime.*
@@ -412,20 +413,21 @@
                     }
                 }
             """
-            ),
-            Stubs.Composable,
-            Stubs.SnapshotState,
-            Stubs.Remember
-        )
+                ),
+                Stubs.Composable,
+                Stubs.SnapshotState,
+                Stubs.Remember
+            )
             .run()
             .expectClean()
     }
 
     @Test
     fun arbitraryStateFactoryAnnotated() {
-        lint().files(
-            kotlin(
-                """
+        lint()
+            .files(
+                kotlin(
+                    """
                 package androidx.compose.runtime.foo
 
                 import androidx.compose.runtime.*
@@ -485,15 +487,16 @@
                     }
                 }
             """
-            ),
-            Stubs.Composable,
-            Stubs.SnapshotState,
-            Stubs.StateFactoryMarker,
-            Stubs.Remember
-        )
+                ),
+                Stubs.Composable,
+                Stubs.SnapshotState,
+                Stubs.StateFactoryMarker,
+                Stubs.Remember
+            )
             .skipTestModes(TestMode.TYPE_ALIAS)
             .run()
-            .expect("""
+            .expect(
+                """
 src/androidx/compose/runtime/foo/{.kt:12: Error: Creating a state object during composition without using remember [UnrememberedMutableState]
                     val foo = makeMyState()
                               ~~~~~~~~~~~
diff --git a/compose/runtime/runtime-livedata/src/androidTest/java/androidx/compose/runtime/livedata/LiveDataAdapterTest.kt b/compose/runtime/runtime-livedata/src/androidTest/java/androidx/compose/runtime/livedata/LiveDataAdapterTest.kt
index 756ccab..3bd338e 100644
--- a/compose/runtime/runtime-livedata/src/androidTest/java/androidx/compose/runtime/livedata/LiveDataAdapterTest.kt
+++ b/compose/runtime/runtime-livedata/src/androidTest/java/androidx/compose/runtime/livedata/LiveDataAdapterTest.kt
@@ -36,16 +36,13 @@
 @RunWith(AndroidJUnit4::class)
 class LiveDataAdapterTest {
 
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
     @Test
     fun whenValueIsNotSetWeGotNull() {
         val liveData = MutableLiveData<String>()
         var realValue: String? = "to-be-updated"
-        rule.setContent {
-            realValue = liveData.observeAsState().value
-        }
+        rule.setContent { realValue = liveData.observeAsState().value }
 
         assertThat(realValue).isNull()
     }
@@ -55,9 +52,7 @@
         val liveData = MutableLiveData<String>()
         liveData.postValue("value")
         var realValue: String? = null
-        rule.setContent {
-            realValue = liveData.observeAsState().value
-        }
+        rule.setContent { realValue = liveData.observeAsState().value }
 
         assertThat(realValue).isEqualTo("value")
     }
@@ -82,17 +77,11 @@
         val liveData = MutableLiveData<String>()
         liveData.postValue("value")
         var realValue: String? = null
-        rule.setContent {
-            realValue = liveData.observeAsState().value
-        }
+        rule.setContent { realValue = liveData.observeAsState().value }
 
-        rule.runOnIdle {
-            liveData.postValue("value2")
-        }
+        rule.runOnIdle { liveData.postValue("value2") }
 
-        rule.runOnIdle {
-            assertThat(realValue).isEqualTo("value2")
-        }
+        rule.runOnIdle { assertThat(realValue).isEqualTo("value2") }
     }
 
     @Test
@@ -109,13 +98,9 @@
 
         lifecycleOwner.currentState = Lifecycle.State.DESTROYED
 
-        rule.runOnIdle {
-            liveData.postValue("value2")
-        }
+        rule.runOnIdle { liveData.postValue("value2") }
 
-        rule.runOnIdle {
-            assertThat(realValue).isEqualTo("value")
-        }
+        rule.runOnIdle { assertThat(realValue).isEqualTo("value") }
     }
 
     @Test
@@ -135,13 +120,11 @@
 
         rule.runOnIdle { emit = true }
 
-        assertThat(rule.runOnIdle { lifecycleOwner.observerCount })
-            .isEqualTo(initialCount + 1)
+        assertThat(rule.runOnIdle { lifecycleOwner.observerCount }).isEqualTo(initialCount + 1)
 
         rule.runOnIdle { emit = false }
 
-        assertThat(rule.runOnIdle { lifecycleOwner.observerCount })
-            .isEqualTo(initialCount)
+        assertThat(rule.runOnIdle { lifecycleOwner.observerCount }).isEqualTo(initialCount)
     }
 
     @Test
@@ -158,19 +141,13 @@
         // activity stopped
         lifecycleOwner.currentState = Lifecycle.State.CREATED
 
-        rule.runOnIdle {
-            liveData.postValue("value2")
-        }
+        rule.runOnIdle { liveData.postValue("value2") }
 
-        rule.runOnIdle {
-            assertThat(realValue).isNull()
-        }
+        rule.runOnIdle { assertThat(realValue).isNull() }
 
         lifecycleOwner.currentState = Lifecycle.State.RESUMED
 
-        rule.runOnIdle {
-            assertThat(realValue).isEqualTo("value2")
-        }
+        rule.runOnIdle { assertThat(realValue).isEqualTo("value2") }
     }
 
     @Test
diff --git a/compose/runtime/runtime-livedata/src/main/java/androidx/compose/runtime/livedata/LiveDataAdapter.kt b/compose/runtime/runtime-livedata/src/main/java/androidx/compose/runtime/livedata/LiveDataAdapter.kt
index 6bb5e0e..81ec8db 100644
--- a/compose/runtime/runtime-livedata/src/main/java/androidx/compose/runtime/livedata/LiveDataAdapter.kt
+++ b/compose/runtime/runtime-livedata/src/main/java/androidx/compose/runtime/livedata/LiveDataAdapter.kt
@@ -28,26 +28,25 @@
 import androidx.lifecycle.compose.LocalLifecycleOwner
 
 /**
- * Starts observing this [LiveData] and represents its values via [State]. Every time there would
- * be new value posted into the [LiveData] the returned [State] will be updated causing
- * recomposition of every [State.value] usage.
+ * Starts observing this [LiveData] and represents its values via [State]. Every time there would be
+ * new value posted into the [LiveData] the returned [State] will be updated causing recomposition
+ * of every [State.value] usage.
  *
  * The inner observer will automatically be removed when this composable disposes or the current
  * [LifecycleOwner] moves to the [Lifecycle.State.DESTROYED] state.
  *
  * @sample androidx.compose.runtime.livedata.samples.LiveDataSample
  */
-@Composable
-fun <T> LiveData<T>.observeAsState(): State<T?> = observeAsState(value)
+@Composable fun <T> LiveData<T>.observeAsState(): State<T?> = observeAsState(value)
 
 /**
- * Starts observing this [LiveData] and represents its values via [State]. Every time there would
- * be new value posted into the [LiveData] the returned [State] will be updated causing
- * recomposition of every [State.value] usage.
+ * Starts observing this [LiveData] and represents its values via [State]. Every time there would be
+ * new value posted into the [LiveData] the returned [State] will be updated causing recomposition
+ * of every [State.value] usage.
  *
  * The [initial] value will be used only if this LiveData is not already
- * [initialized][isInitialized]. Note that if [T] is a non-null type, it is your
- * responsibility to ensure that any value you set on this LiveData is also non-null.
+ * [initialized][isInitialized]. Note that if [T] is a non-null type, it is your responsibility to
+ * ensure that any value you set on this LiveData is also non-null.
  *
  * The inner observer will automatically be removed when this composable disposes or the current
  * [LifecycleOwner] moves to the [Lifecycle.State.DESTROYED] state.
diff --git a/compose/runtime/runtime-rxjava2/src/androidTest/java/androidx/compose/runtime/rxjava2/CompletableAdapterTest.kt b/compose/runtime/runtime-rxjava2/src/androidTest/java/androidx/compose/runtime/rxjava2/CompletableAdapterTest.kt
index 116819d..32621f7 100644
--- a/compose/runtime/runtime-rxjava2/src/androidTest/java/androidx/compose/runtime/rxjava2/CompletableAdapterTest.kt
+++ b/compose/runtime/runtime-rxjava2/src/androidTest/java/androidx/compose/runtime/rxjava2/CompletableAdapterTest.kt
@@ -30,16 +30,13 @@
 @RunWith(AndroidJUnit4::class)
 class CompletableAdapterTest {
 
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
     @Test
     fun whenNotCompletedSetWeGotFalse() {
         val stream = CompletableStream()
         var realValue: Boolean? = null
-        rule.setContent {
-            realValue = stream.completable.subscribeAsState().value
-        }
+        rule.setContent { realValue = stream.completable.subscribeAsState().value }
 
         Truth.assertThat(realValue).isFalse()
     }
@@ -49,9 +46,7 @@
         val stream = CompletableStream()
         stream.onComplete()
         var realValue: Boolean? = null
-        rule.setContent {
-            realValue = stream.completable.subscribeAsState().value
-        }
+        rule.setContent { realValue = stream.completable.subscribeAsState().value }
 
         Truth.assertThat(realValue).isTrue()
     }
@@ -61,17 +56,11 @@
         val stream = CompletableStream()
 
         var realValue: Boolean? = null
-        rule.setContent {
-            realValue = stream.completable.subscribeAsState().value
-        }
+        rule.setContent { realValue = stream.completable.subscribeAsState().value }
 
-        rule.runOnIdle {
-            stream.onComplete()
-        }
+        rule.runOnIdle { stream.onComplete() }
 
-        rule.runOnIdle {
-            Truth.assertThat(realValue).isTrue()
-        }
+        rule.runOnIdle { Truth.assertThat(realValue).isTrue() }
     }
 }
 
@@ -79,13 +68,14 @@
 
     private val emitters = mutableListOf<CompletableEmitter>()
 
-    val completable = Completable.create {
-        if (completed) {
-            it.onComplete()
-        } else {
-            emitters.add(it)
+    val completable =
+        Completable.create {
+            if (completed) {
+                it.onComplete()
+            } else {
+                emitters.add(it)
+            }
         }
-    }
 
     private var completed = false
 
diff --git a/compose/runtime/runtime-rxjava2/src/androidTest/java/androidx/compose/runtime/rxjava2/RxJava2AdapterTest.kt b/compose/runtime/runtime-rxjava2/src/androidTest/java/androidx/compose/runtime/rxjava2/RxJava2AdapterTest.kt
index 0c19acb..e4552f4 100644
--- a/compose/runtime/runtime-rxjava2/src/androidTest/java/androidx/compose/runtime/rxjava2/RxJava2AdapterTest.kt
+++ b/compose/runtime/runtime-rxjava2/src/androidTest/java/androidx/compose/runtime/rxjava2/RxJava2AdapterTest.kt
@@ -44,24 +44,17 @@
     companion object {
         @JvmStatic
         @Parameterized.Parameters(name = "{0}")
-        fun initParameters(): Array<() -> Stream> = arrayOf(
-            ObservableStream(),
-            FlowableStream(),
-            SingleStream(),
-            MaybeStream()
-        )
+        fun initParameters(): Array<() -> Stream> =
+            arrayOf(ObservableStream(), FlowableStream(), SingleStream(), MaybeStream())
     }
 
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
     @Test
     fun whenValueIsNotSetWeGotNull() {
         val stream = factory()
         var realValue: String? = "to-be-updated"
-        rule.setContent {
-            realValue = stream.subscribeAsState(null).value
-        }
+        rule.setContent { realValue = stream.subscribeAsState(null).value }
 
         assertThat(realValue).isNull()
     }
@@ -71,9 +64,7 @@
         val stream = factory()
         stream.onNext("value")
         var realValue: String? = null
-        rule.setContent {
-            realValue = stream.subscribeAsState(null).value
-        }
+        rule.setContent { realValue = stream.subscribeAsState(null).value }
 
         assertThat(realValue).isEqualTo("value")
     }
@@ -83,17 +74,11 @@
         val stream = factory()
 
         var realValue: String? = null
-        rule.setContent {
-            realValue = stream.subscribeAsState(null).value
-        }
+        rule.setContent { realValue = stream.subscribeAsState(null).value }
 
-        rule.runOnIdle {
-            stream.onNext("value")
-        }
+        rule.runOnIdle { stream.onNext("value") }
 
-        rule.runOnIdle {
-            assertThat(realValue).isEqualTo("value")
-        }
+        rule.runOnIdle { assertThat(realValue).isEqualTo("value") }
     }
 
     @Test
@@ -103,17 +88,11 @@
 
         stream.onNext("value")
         var realValue: String? = null
-        rule.setContent {
-            realValue = stream.subscribeAsState(null).value
-        }
+        rule.setContent { realValue = stream.subscribeAsState(null).value }
 
-        rule.runOnIdle {
-            stream.onNext("value2")
-        }
+        rule.runOnIdle { stream.onNext("value2") }
 
-        rule.runOnIdle {
-            assertThat(realValue).isEqualTo("value2")
-        }
+        rule.runOnIdle { assertThat(realValue).isEqualTo("value2") }
     }
 
     @Test
@@ -129,22 +108,16 @@
 
         rule.runOnIdle { emit = false }
 
-        rule.runOnIdle {
-            stream.onNext("value")
-        }
+        rule.runOnIdle { stream.onNext("value") }
 
-        rule.runOnIdle {
-            assertThat(realValue).isNull()
-        }
+        rule.runOnIdle { assertThat(realValue).isNull() }
     }
 
     @Test
     fun testObservableWithInitialValue() {
         val stream = factory()
         var realValue: String? = "to-be-updated"
-        rule.setContent {
-            realValue = stream.subscribeAsState("value").value
-        }
+        rule.setContent { realValue = stream.subscribeAsState("value").value }
 
         assertThat(realValue).isEqualTo("value")
     }
@@ -154,15 +127,9 @@
         val stream = factory()
 
         var realValue: String? = null
-        rule.setContent {
-            realValue = stream.subscribeAsState(null).value
-        }
+        rule.setContent { realValue = stream.subscribeAsState(null).value }
 
-        Thread(
-            Runnable {
-                stream.onNext("value")
-            }
-        ).start()
+        Thread(Runnable { stream.onNext("value") }).start()
 
         rule.waitUntil(5_000) { realValue == "value" }
     }
@@ -171,8 +138,7 @@
 interface Stream {
     fun onNext(value: String)
 
-    @Composable
-    fun subscribeAsState(initial: String?): State<String?>
+    @Composable fun subscribeAsState(initial: String?): State<String?>
 
     fun supportMultipleValues(): Boolean
 }
diff --git a/compose/runtime/runtime-rxjava2/src/main/java/androidx/compose/runtime/rxjava2/RxJava2Adapter.kt b/compose/runtime/runtime-rxjava2/src/main/java/androidx/compose/runtime/rxjava2/RxJava2Adapter.kt
index bf8119f..52fb78e 100644
--- a/compose/runtime/runtime-rxjava2/src/main/java/androidx/compose/runtime/rxjava2/RxJava2Adapter.kt
+++ b/compose/runtime/runtime-rxjava2/src/main/java/androidx/compose/runtime/rxjava2/RxJava2Adapter.kt
@@ -30,94 +30,92 @@
 import io.reactivex.plugins.RxJavaPlugins
 
 /**
- * Subscribes to this [Observable] and represents its values via [State]. Every time there would
- * be new value posted into the [Observable] the returned [State] will be updated causing
- * recomposition of every [State.value] usage.
+ * Subscribes to this [Observable] and represents its values via [State]. Every time there would be
+ * new value posted into the [Observable] the returned [State] will be updated causing recomposition
+ * of every [State.value] usage.
  *
  * The internal observer will be automatically disposed when this composable disposes.
  *
- * Note that errors are not handled and the default [RxJavaPlugins.onError] logic will be
- * used. To handle the error in a more meaningful way you can use operators like
- * [Observable.onErrorReturn] or [Observable.onErrorResumeNext].
+ * Note that errors are not handled and the default [RxJavaPlugins.onError] logic will be used. To
+ * handle the error in a more meaningful way you can use operators like [Observable.onErrorReturn]
+ * or [Observable.onErrorResumeNext].
  *
  * @sample androidx.compose.runtime.rxjava2.samples.ObservableSample
  *
  * @param initial The initial value for the returned [State] which will be asynchronously updated
- * with the real one once we receive it from the stream
+ *   with the real one once we receive it from the stream
  */
 @Composable
 fun <R, T : R> Observable<T>.subscribeAsState(initial: R): State<R> =
     asState(initial) { subscribe(it) }
 
 /**
- * Subscribes to this [Flowable] and represents its values via [State]. Every time there would
- * be new value posted into the [Flowable] the returned [State] will be updated causing
- * recomposition of every [State.value] usage.
+ * Subscribes to this [Flowable] and represents its values via [State]. Every time there would be
+ * new value posted into the [Flowable] the returned [State] will be updated causing recomposition
+ * of every [State.value] usage.
  *
  * The internal observer will be automatically disposed when this composable disposes.
  *
- * Note that errors are not handled and the default [RxJavaPlugins.onError] logic will be
- * used. To handle the error in a more meaningful way you can use operators like
- * [Flowable.onErrorReturn] or [Flowable.onErrorResumeNext].
+ * Note that errors are not handled and the default [RxJavaPlugins.onError] logic will be used. To
+ * handle the error in a more meaningful way you can use operators like [Flowable.onErrorReturn] or
+ * [Flowable.onErrorResumeNext].
  *
  * @sample androidx.compose.runtime.rxjava2.samples.FlowableSample
  *
  * @param initial The initial value for the returned [State] which will be asynchronously updated
- * with the real one once we receive it from the stream
+ *   with the real one once we receive it from the stream
  */
 @Composable
 fun <R, T : R> Flowable<T>.subscribeAsState(initial: R): State<R> =
     asState(initial) { subscribe(it) }
 
 /**
- * Subscribes to this [Single] and represents its value via [State]. Once the value would be
- * posted into the [Single] the returned [State] will be updated causing recomposition of
- * every [State.value] usage.
+ * Subscribes to this [Single] and represents its value via [State]. Once the value would be posted
+ * into the [Single] the returned [State] will be updated causing recomposition of every
+ * [State.value] usage.
  *
  * The internal observer will be automatically disposed when this composable disposes.
  *
- * Note that errors are not handled and the default [RxJavaPlugins.onError] logic will be
- * used. To handle the error in a more meaningful way you can use operators like
- * [Single.onErrorReturn] or [Single.onErrorResumeNext].
+ * Note that errors are not handled and the default [RxJavaPlugins.onError] logic will be used. To
+ * handle the error in a more meaningful way you can use operators like [Single.onErrorReturn] or
+ * [Single.onErrorResumeNext].
  *
  * @sample androidx.compose.runtime.rxjava2.samples.SingleSample
  *
  * @param initial The initial value for the returned [State] which will be asynchronously updated
- * with the real one once we receive it from the stream
+ *   with the real one once we receive it from the stream
  */
 @Composable
-fun <R, T : R> Single<T>.subscribeAsState(initial: R): State<R> =
-    asState(initial) { subscribe(it) }
+fun <R, T : R> Single<T>.subscribeAsState(initial: R): State<R> = asState(initial) { subscribe(it) }
 
 /**
- * Subscribes to this [Maybe] and represents its value via [State]. Once the value would be
- * posted into the [Maybe] the returned [State] will be updated causing recomposition of
- * every [State.value] usage.
+ * Subscribes to this [Maybe] and represents its value via [State]. Once the value would be posted
+ * into the [Maybe] the returned [State] will be updated causing recomposition of every
+ * [State.value] usage.
  *
  * The internal observer will be automatically disposed when this composable disposes.
  *
- * Note that errors are not handled and the default [RxJavaPlugins.onError] logic will be
- * used. To handle the error in a more meaningful way you can use operators like
- * [Maybe.onErrorComplete], [Maybe.onErrorReturn] or [Maybe.onErrorResumeNext].
+ * Note that errors are not handled and the default [RxJavaPlugins.onError] logic will be used. To
+ * handle the error in a more meaningful way you can use operators like [Maybe.onErrorComplete],
+ * [Maybe.onErrorReturn] or [Maybe.onErrorResumeNext].
  *
  * @sample androidx.compose.runtime.rxjava2.samples.MaybeSample
  *
  * @param initial The initial value for the returned [State] which will be asynchronously updated
- * with the real one once we receive it from the stream
+ *   with the real one once we receive it from the stream
  */
 @Composable
-fun <R, T : R> Maybe<T>.subscribeAsState(initial: R): State<R> =
-    asState(initial) { subscribe(it) }
+fun <R, T : R> Maybe<T>.subscribeAsState(initial: R): State<R> = asState(initial) { subscribe(it) }
 
 /**
  * Subscribes to this [Completable] and represents its completed state via [State]. Once the
- * [Completable] will be completed the returned [State] will be updated with `true` value
- * causing recomposition of every [State.value] usage.
+ * [Completable] will be completed the returned [State] will be updated with `true` value causing
+ * recomposition of every [State.value] usage.
  *
  * The internal observer will be automatically disposed when this composable disposes.
  *
- * Note that errors are not handled and the default [RxJavaPlugins.onError] logic will be
- * used. To handle the error in a more meaningful way you can use operators like
+ * Note that errors are not handled and the default [RxJavaPlugins.onError] logic will be used. To
+ * handle the error in a more meaningful way you can use operators like
  * [Completable.onErrorComplete] or [Completable.onErrorResumeNext].
  *
  * @sample androidx.compose.runtime.rxjava2.samples.CompletableSample
@@ -133,9 +131,7 @@
 ): State<T> {
     val state = remember { mutableStateOf(initial) }
     DisposableEffect(this) {
-        val disposable = subscribe {
-            state.value = it
-        }
+        val disposable = subscribe { state.value = it }
         onDispose { disposable.dispose() }
     }
     return state
diff --git a/compose/runtime/runtime-rxjava3/src/androidTest/java/androidx/compose/runtime/rxjava3/CompletableAdapterTest.kt b/compose/runtime/runtime-rxjava3/src/androidTest/java/androidx/compose/runtime/rxjava3/CompletableAdapterTest.kt
index 55f3a40..794000a 100644
--- a/compose/runtime/runtime-rxjava3/src/androidTest/java/androidx/compose/runtime/rxjava3/CompletableAdapterTest.kt
+++ b/compose/runtime/runtime-rxjava3/src/androidTest/java/androidx/compose/runtime/rxjava3/CompletableAdapterTest.kt
@@ -30,16 +30,13 @@
 @RunWith(AndroidJUnit4::class)
 class CompletableAdapterTest {
 
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
     @Test
     fun whenNotCompletedSetWeGotFalse() {
         val stream = CompletableStream()
         var realValue: Boolean? = null
-        rule.setContent {
-            realValue = stream.completable.subscribeAsState().value
-        }
+        rule.setContent { realValue = stream.completable.subscribeAsState().value }
 
         Truth.assertThat(realValue).isFalse()
     }
@@ -49,9 +46,7 @@
         val stream = CompletableStream()
         stream.onComplete()
         var realValue: Boolean? = null
-        rule.setContent {
-            realValue = stream.completable.subscribeAsState().value
-        }
+        rule.setContent { realValue = stream.completable.subscribeAsState().value }
 
         Truth.assertThat(realValue).isTrue()
     }
@@ -61,17 +56,11 @@
         val stream = CompletableStream()
 
         var realValue: Boolean? = null
-        rule.setContent {
-            realValue = stream.completable.subscribeAsState().value
-        }
+        rule.setContent { realValue = stream.completable.subscribeAsState().value }
 
-        rule.runOnIdle {
-            stream.onComplete()
-        }
+        rule.runOnIdle { stream.onComplete() }
 
-        rule.runOnIdle {
-            Truth.assertThat(realValue).isTrue()
-        }
+        rule.runOnIdle { Truth.assertThat(realValue).isTrue() }
     }
 }
 
@@ -79,13 +68,14 @@
 
     private val emitters = mutableListOf<CompletableEmitter>()
 
-    val completable = Completable.create {
-        if (completed) {
-            it.onComplete()
-        } else {
-            emitters.add(it)
+    val completable =
+        Completable.create {
+            if (completed) {
+                it.onComplete()
+            } else {
+                emitters.add(it)
+            }
         }
-    }
 
     private var completed = false
 
diff --git a/compose/runtime/runtime-rxjava3/src/androidTest/java/androidx/compose/runtime/rxjava3/RxJava3AdapterTest.kt b/compose/runtime/runtime-rxjava3/src/androidTest/java/androidx/compose/runtime/rxjava3/RxJava3AdapterTest.kt
index 5ad2315..fdff833 100644
--- a/compose/runtime/runtime-rxjava3/src/androidTest/java/androidx/compose/runtime/rxjava3/RxJava3AdapterTest.kt
+++ b/compose/runtime/runtime-rxjava3/src/androidTest/java/androidx/compose/runtime/rxjava3/RxJava3AdapterTest.kt
@@ -44,24 +44,17 @@
     companion object {
         @JvmStatic
         @Parameterized.Parameters(name = "{0}")
-        fun initParameters(): Array<() -> Stream> = arrayOf(
-            ObservableStream(),
-            FlowableStream(),
-            SingleStream(),
-            MaybeStream()
-        )
+        fun initParameters(): Array<() -> Stream> =
+            arrayOf(ObservableStream(), FlowableStream(), SingleStream(), MaybeStream())
     }
 
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
     @Test
     fun whenValueIsNotSetWeGotNull() {
         val stream = factory()
         var realValue: String? = "to-be-updated"
-        rule.setContent {
-            realValue = stream.subscribeAsState(null).value
-        }
+        rule.setContent { realValue = stream.subscribeAsState(null).value }
 
         assertThat(realValue).isNull()
     }
@@ -71,9 +64,7 @@
         val stream = factory()
         stream.onNext("value")
         var realValue: String? = null
-        rule.setContent {
-            realValue = stream.subscribeAsState(null).value
-        }
+        rule.setContent { realValue = stream.subscribeAsState(null).value }
 
         assertThat(realValue).isEqualTo("value")
     }
@@ -83,17 +74,11 @@
         val stream = factory()
 
         var realValue: String? = null
-        rule.setContent {
-            realValue = stream.subscribeAsState(null).value
-        }
+        rule.setContent { realValue = stream.subscribeAsState(null).value }
 
-        rule.runOnIdle {
-            stream.onNext("value")
-        }
+        rule.runOnIdle { stream.onNext("value") }
 
-        rule.runOnIdle {
-            assertThat(realValue).isEqualTo("value")
-        }
+        rule.runOnIdle { assertThat(realValue).isEqualTo("value") }
     }
 
     @Test
@@ -103,17 +88,11 @@
 
         stream.onNext("value")
         var realValue: String? = null
-        rule.setContent {
-            realValue = stream.subscribeAsState(null).value
-        }
+        rule.setContent { realValue = stream.subscribeAsState(null).value }
 
-        rule.runOnIdle {
-            stream.onNext("value2")
-        }
+        rule.runOnIdle { stream.onNext("value2") }
 
-        rule.runOnIdle {
-            assertThat(realValue).isEqualTo("value2")
-        }
+        rule.runOnIdle { assertThat(realValue).isEqualTo("value2") }
     }
 
     @Test
@@ -129,22 +108,16 @@
 
         rule.runOnIdle { emit = false }
 
-        rule.runOnIdle {
-            stream.onNext("value")
-        }
+        rule.runOnIdle { stream.onNext("value") }
 
-        rule.runOnIdle {
-            assertThat(realValue).isNull()
-        }
+        rule.runOnIdle { assertThat(realValue).isNull() }
     }
 
     @Test
     fun testObservableWithInitialValue() {
         val stream = factory()
         var realValue: String? = "to-be-updated"
-        rule.setContent {
-            realValue = stream.subscribeAsState("value").value
-        }
+        rule.setContent { realValue = stream.subscribeAsState("value").value }
 
         assertThat(realValue).isEqualTo("value")
     }
@@ -154,15 +127,9 @@
         val stream = factory()
 
         var realValue: String? = null
-        rule.setContent {
-            realValue = stream.subscribeAsState(null).value
-        }
+        rule.setContent { realValue = stream.subscribeAsState(null).value }
 
-        Thread(
-            Runnable {
-                stream.onNext("value")
-            }
-        ).start()
+        Thread(Runnable { stream.onNext("value") }).start()
 
         rule.waitUntil(5_000) { realValue == "value" }
     }
@@ -171,8 +138,7 @@
 interface Stream {
     fun onNext(value: String)
 
-    @Composable
-    fun subscribeAsState(initial: String?): State<String?>
+    @Composable fun subscribeAsState(initial: String?): State<String?>
 
     fun supportMultipleValues(): Boolean
 }
diff --git a/compose/runtime/runtime-rxjava3/src/main/java/androidx/compose/runtime/rxjava3/RxJava3Adapter.kt b/compose/runtime/runtime-rxjava3/src/main/java/androidx/compose/runtime/rxjava3/RxJava3Adapter.kt
index 0736da3..d3aa403 100644
--- a/compose/runtime/runtime-rxjava3/src/main/java/androidx/compose/runtime/rxjava3/RxJava3Adapter.kt
+++ b/compose/runtime/runtime-rxjava3/src/main/java/androidx/compose/runtime/rxjava3/RxJava3Adapter.kt
@@ -30,20 +30,20 @@
 import io.reactivex.rxjava3.plugins.RxJavaPlugins
 
 /**
- * Subscribes to this [Observable] and represents its values via [State]. Every time there would
- * be new value posted into the [Observable] the returned [State] will be updated causing
- * recomposition of every [State.value] usage.
+ * Subscribes to this [Observable] and represents its values via [State]. Every time there would be
+ * new value posted into the [Observable] the returned [State] will be updated causing recomposition
+ * of every [State.value] usage.
  *
  * The internal observer will be automatically disposed when this composable disposes.
  *
- * Note that errors are not handled and the default [RxJavaPlugins.onError] logic will be
- * used. To handle the error in a more meaningful way you can use operators like
- * [Observable.onErrorReturn] or [Observable.onErrorResumeNext].
+ * Note that errors are not handled and the default [RxJavaPlugins.onError] logic will be used. To
+ * handle the error in a more meaningful way you can use operators like [Observable.onErrorReturn]
+ * or [Observable.onErrorResumeNext].
  *
  * @sample androidx.compose.runtime.rxjava3.samples.ObservableSample
  *
  * @param initial The initial value for the returned [State] which will be asynchronously updated
- * with the real one once we receive it from the stream
+ *   with the real one once we receive it from the stream
  */
 @Suppress("UPPER_BOUND_VIOLATED")
 @Composable
@@ -51,20 +51,20 @@
     asState(initial) { subscribe(it) }
 
 /**
- * Subscribes to this [Flowable] and represents its values via [State]. Every time there would
- * be new value posted into the [Flowable] the returned [State] will be updated causing
- * recomposition of every [State.value] usage.
+ * Subscribes to this [Flowable] and represents its values via [State]. Every time there would be
+ * new value posted into the [Flowable] the returned [State] will be updated causing recomposition
+ * of every [State.value] usage.
  *
  * The internal observer will be automatically disposed when this composable disposes.
  *
- * Note that errors are not handled and the default [RxJavaPlugins.onError] logic will be
- * used. To handle the error in a more meaningful way you can use operators like
- * [Flowable.onErrorReturn] or [Flowable.onErrorResumeNext].
+ * Note that errors are not handled and the default [RxJavaPlugins.onError] logic will be used. To
+ * handle the error in a more meaningful way you can use operators like [Flowable.onErrorReturn] or
+ * [Flowable.onErrorResumeNext].
  *
  * @sample androidx.compose.runtime.rxjava3.samples.FlowableSample
  *
  * @param initial The initial value for the returned [State] which will be asynchronously updated
- * with the real one once we receive it from the stream
+ *   with the real one once we receive it from the stream
  */
 @Suppress("UPPER_BOUND_VIOLATED")
 @Composable
@@ -72,55 +72,53 @@
     asState(initial) { subscribe(it) }
 
 /**
- * Subscribes to this [Single] and represents its value via [State]. Once the value would be
- * posted into the [Single] the returned [State] will be updated causing recomposition of
- * every [State.value] usage.
+ * Subscribes to this [Single] and represents its value via [State]. Once the value would be posted
+ * into the [Single] the returned [State] will be updated causing recomposition of every
+ * [State.value] usage.
  *
  * The internal observer will be automatically disposed when this composable disposes.
  *
- * Note that errors are not handled and the default [RxJavaPlugins.onError] logic will be
- * used. To handle the error in a more meaningful way you can use operators like
- * [Single.onErrorReturn] or [Single.onErrorResumeNext].
+ * Note that errors are not handled and the default [RxJavaPlugins.onError] logic will be used. To
+ * handle the error in a more meaningful way you can use operators like [Single.onErrorReturn] or
+ * [Single.onErrorResumeNext].
  *
  * @sample androidx.compose.runtime.rxjava3.samples.SingleSample
  *
  * @param initial The initial value for the returned [State] which will be asynchronously updated
- * with the real one once we receive it from the stream
+ *   with the real one once we receive it from the stream
  */
 @Suppress("UPPER_BOUND_VIOLATED")
 @Composable
-fun <R, T : R> Single<T>.subscribeAsState(initial: R): State<R> =
-    asState(initial) { subscribe(it) }
+fun <R, T : R> Single<T>.subscribeAsState(initial: R): State<R> = asState(initial) { subscribe(it) }
 
 /**
- * Subscribes to this [Maybe] and represents its value via [State]. Once the value would be
- * posted into the [Maybe] the returned [State] will be updated causing recomposition of
- * every [State.value] usage.
+ * Subscribes to this [Maybe] and represents its value via [State]. Once the value would be posted
+ * into the [Maybe] the returned [State] will be updated causing recomposition of every
+ * [State.value] usage.
  *
  * The internal observer will be automatically disposed when this composable disposes.
  *
- * Note that errors are not handled and the default [RxJavaPlugins.onError] logic will be
- * used. To handle the error in a more meaningful way you can use operators like
- * [Maybe.onErrorComplete], [Maybe.onErrorReturn] or [Maybe.onErrorResumeNext].
+ * Note that errors are not handled and the default [RxJavaPlugins.onError] logic will be used. To
+ * handle the error in a more meaningful way you can use operators like [Maybe.onErrorComplete],
+ * [Maybe.onErrorReturn] or [Maybe.onErrorResumeNext].
  *
  * @sample androidx.compose.runtime.rxjava3.samples.MaybeSample
  *
  * @param initial The initial value for the returned [State] which will be asynchronously updated
- * with the real one once we receive it from the stream
+ *   with the real one once we receive it from the stream
  */
 @Composable
-fun <R, T : R> Maybe<T>.subscribeAsState(initial: R): State<R> =
-    asState(initial) { subscribe(it) }
+fun <R, T : R> Maybe<T>.subscribeAsState(initial: R): State<R> = asState(initial) { subscribe(it) }
 
 /**
  * Subscribes to this [Completable] and represents its completed state via [State]. Once the
- * [Completable] will be completed the returned [State] will be updated with `true` value
- * causing recomposition of every [State.value] usage.
+ * [Completable] will be completed the returned [State] will be updated with `true` value causing
+ * recomposition of every [State.value] usage.
  *
  * The internal observer will be automatically disposed when this composable disposes.
  *
- * Note that errors are not handled and the default [RxJavaPlugins.onError] logic will be
- * used. To handle the error in a more meaningful way you can use operators like
+ * Note that errors are not handled and the default [RxJavaPlugins.onError] logic will be used. To
+ * handle the error in a more meaningful way you can use operators like
  * [Completable.onErrorComplete] or [Completable.onErrorResumeNext].
  *
  * @sample androidx.compose.runtime.rxjava3.samples.CompletableSample
@@ -136,9 +134,7 @@
 ): State<T> {
     val state = remember { mutableStateOf(initial) }
     DisposableEffect(this) {
-        val disposable = subscribe {
-            state.value = it
-        }
+        val disposable = subscribe { state.value = it }
         onDispose { disposable.dispose() }
     }
     return state
diff --git a/compose/runtime/runtime-saveable-lint/src/main/java/androidx/compose/runtime/saveable/lint/RememberSaveableDetector.kt b/compose/runtime/runtime-saveable-lint/src/main/java/androidx/compose/runtime/saveable/lint/RememberSaveableDetector.kt
index c96aa91..232a562 100644
--- a/compose/runtime/runtime-saveable-lint/src/main/java/androidx/compose/runtime/saveable/lint/RememberSaveableDetector.kt
+++ b/compose/runtime/runtime-saveable-lint/src/main/java/androidx/compose/runtime/saveable/lint/RememberSaveableDetector.kt
@@ -38,8 +38,8 @@
 import org.jetbrains.uast.UCallExpression
 
 /**
- * [Detector] that checks `rememberSaveable` calls to make sure that a `Saver` is not passed to
- * the vararg argument.
+ * [Detector] that checks `rememberSaveable` calls to make sure that a `Saver` is not passed to the
+ * vararg argument.
  */
 class RememberSaveableDetector : Detector(), SourceCodeScanner {
     override fun getApplicableMethodNames(): List<String> = listOf(RememberSaveable.shortName)
@@ -49,21 +49,26 @@
 
         val argumentMapping = context.evaluator.computeArgumentMapping(node, method)
         // Filter the arguments provided to those that correspond to the varargs parameter.
-        val varargArguments = argumentMapping.toList().filter { (_, parameter) ->
-            // TODO: https://youtrack.jetbrains.com/issue/KT-45700 parameter.isVarArgs
-            //  returns false because only varargs parameters at the end of a function are
-            //  considered varargs in PSI, since Java callers can not call them as a vararg
-            //  parameter otherwise. This is true for both KtLightParameterImpl, and
-            //  ClsParameterImpl, so if we wanted to actually find if the parameter was
-            //  vararg for Kotlin callers we would instead need to look through the metadata on
-            //  the class file, or the source KtParameter.
-            //  Instead since they are just treated as an array type in PSI, just find the
-            //  corresponding array parameter.
-            parameter.type is PsiArrayType
-        }.map {
-            // We don't need the parameter anymore, so just return the argument
-            it.first
-        }
+        val varargArguments =
+            argumentMapping
+                .toList()
+                .filter { (_, parameter) ->
+                    // TODO: https://youtrack.jetbrains.com/issue/KT-45700 parameter.isVarArgs
+                    //  returns false because only varargs parameters at the end of a function are
+                    //  considered varargs in PSI, since Java callers can not call them as a vararg
+                    //  parameter otherwise. This is true for both KtLightParameterImpl, and
+                    //  ClsParameterImpl, so if we wanted to actually find if the parameter was
+                    //  vararg for Kotlin callers we would instead need to look through the metadata
+                    // on
+                    //  the class file, or the source KtParameter.
+                    //  Instead since they are just treated as an array type in PSI, just find the
+                    //  corresponding array parameter.
+                    parameter.type is PsiArrayType
+                }
+                .map {
+                    // We don't need the parameter anymore, so just return the argument
+                    it.first
+                }
 
         // Ignore if there are no vararg arguments provided, and ignore if there are multiple (we
         // assume if that multiple are provided then the developer knows what they are doing)
@@ -77,16 +82,17 @@
 
         // If the type is a MutableState, there is a second overload with a differently
         // named parameter we should use instead
-        val isMutableStateSaver = node.getExpressionType()
-            ?.inheritsFrom(Names.Runtime.MutableState) == true
+        val isMutableStateSaver =
+            node.getExpressionType()?.inheritsFrom(Names.Runtime.MutableState) == true
 
         // TODO: might be safer to try and find the other overload through PSI, and get
         //  the parameter name directly.
-        val parameterName = if (isMutableStateSaver) {
-            "stateSaver"
-        } else {
-            "saver"
-        }
+        val parameterName =
+            if (isMutableStateSaver) {
+                "stateSaver"
+            } else {
+                "saver"
+            }
 
         val argumentText = argument.sourcePsi?.text
 
@@ -109,21 +115,24 @@
     }
 
     companion object {
-        val RememberSaveableSaverParameter = Issue.create(
-            "RememberSaveableSaverParameter",
-            "`Saver` objects should be passed to the saver parameter, not the vararg " +
-                "`inputs` parameter",
-            "The first parameter to `rememberSaveable` is a vararg parameter for inputs that when" +
-                " changed will cause the state to reset. Passing a `Saver` object to this " +
-                "parameter is an error, as the intention is to pass the `Saver` object to the " +
-                "saver parameter. Since the saver parameter is not the first parameter, it must " +
-                "be explicitly named.",
-            Category.CORRECTNESS, 3, Severity.ERROR,
-            Implementation(
-                RememberSaveableDetector::class.java,
-                EnumSet.of(Scope.JAVA_FILE, Scope.TEST_SOURCES)
+        val RememberSaveableSaverParameter =
+            Issue.create(
+                "RememberSaveableSaverParameter",
+                "`Saver` objects should be passed to the saver parameter, not the vararg " +
+                    "`inputs` parameter",
+                "The first parameter to `rememberSaveable` is a vararg parameter for inputs that when" +
+                    " changed will cause the state to reset. Passing a `Saver` object to this " +
+                    "parameter is an error, as the intention is to pass the `Saver` object to the " +
+                    "saver parameter. Since the saver parameter is not the first parameter, it must " +
+                    "be explicitly named.",
+                Category.CORRECTNESS,
+                3,
+                Severity.ERROR,
+                Implementation(
+                    RememberSaveableDetector::class.java,
+                    EnumSet.of(Scope.JAVA_FILE, Scope.TEST_SOURCES)
+                )
             )
-        )
     }
 }
 
diff --git a/compose/runtime/runtime-saveable-lint/src/main/java/androidx/compose/runtime/saveable/lint/RuntimeSaveableIssueRegistry.kt b/compose/runtime/runtime-saveable-lint/src/main/java/androidx/compose/runtime/saveable/lint/RuntimeSaveableIssueRegistry.kt
index 60bbfa0..fb64c4b 100644
--- a/compose/runtime/runtime-saveable-lint/src/main/java/androidx/compose/runtime/saveable/lint/RuntimeSaveableIssueRegistry.kt
+++ b/compose/runtime/runtime-saveable-lint/src/main/java/androidx/compose/runtime/saveable/lint/RuntimeSaveableIssueRegistry.kt
@@ -22,19 +22,18 @@
 import com.android.tools.lint.client.api.Vendor
 import com.android.tools.lint.detector.api.CURRENT_API
 
-/**
- * [IssueRegistry] containing runtime-saveable specific lint issues.
- */
+/** [IssueRegistry] containing runtime-saveable specific lint issues. */
 class RuntimeSaveableIssueRegistry : IssueRegistry() {
     // Tests are run with this version. We ensure that with ApiLintVersionsTest
     override val api = 14
     override val minApi = CURRENT_API
-    override val issues get() = listOf(
-        RememberSaveableDetector.RememberSaveableSaverParameter
-    )
-    override val vendor = Vendor(
-        vendorName = "Jetpack Compose",
-        identifier = "androidx.compose.runtime.saveable",
-        feedbackUrl = "https://issuetracker.google.com/issues/new?component=612128"
-    )
+    override val issues
+        get() = listOf(RememberSaveableDetector.RememberSaveableSaverParameter)
+
+    override val vendor =
+        Vendor(
+            vendorName = "Jetpack Compose",
+            identifier = "androidx.compose.runtime.saveable",
+            feedbackUrl = "https://issuetracker.google.com/issues/new?component=612128"
+        )
 }
diff --git a/compose/runtime/runtime-saveable-lint/src/test/java/androidx/compose/runtime/saveable/lint/RememberSaveableDetectorTest.kt b/compose/runtime/runtime-saveable-lint/src/test/java/androidx/compose/runtime/saveable/lint/RememberSaveableDetectorTest.kt
index 37f46b7..ce4608e 100644
--- a/compose/runtime/runtime-saveable-lint/src/test/java/androidx/compose/runtime/saveable/lint/RememberSaveableDetectorTest.kt
+++ b/compose/runtime/runtime-saveable-lint/src/test/java/androidx/compose/runtime/saveable/lint/RememberSaveableDetectorTest.kt
@@ -30,20 +30,19 @@
 
 /* ktlint-disable max-line-length */
 @RunWith(JUnit4::class)
-/**
- * Test for [RememberSaveableDetector].
- */
+/** Test for [RememberSaveableDetector]. */
 class RememberSaveableDetectorTest : LintDetectorTest() {
     override fun getDetector(): Detector = RememberSaveableDetector()
 
     override fun getIssues(): MutableList<Issue> =
         mutableListOf(RememberSaveableDetector.RememberSaveableSaverParameter)
 
-    private val rememberSaveableStub: TestFile = bytecodeStub(
-        filename = "RememberSaveable.kt",
-        filepath = "androidx/compose/runtime/saveable",
-        checksum = 0x7556f44f,
-        """
+    private val rememberSaveableStub: TestFile =
+        bytecodeStub(
+            filename = "RememberSaveable.kt",
+            filepath = "androidx/compose/runtime/saveable",
+            checksum = 0x7556f44f,
+            """
         package androidx.compose.runtime.saveable
 
         import androidx.compose.runtime.*
@@ -79,13 +78,13 @@
         private fun <T> mutableStateSaver(inner: Saver<T, out Any>) =
             Any() as Saver<MutableState<T>, MutableState<Any?>>
         """,
-"""
+            """
         META-INF/main.kotlin_module:
         H4sIAAAAAAAA/2NgYGBmYGBgBGJOBijg0uaSSMxLKcrPTKnQS87PLcgvTtUr
         Ks0rycxNFeIPzkssKM7ILwkuSSxJ9S7hMudSxKVYrzixLDUxKSdVSCgoNTc1
         Nym1KBgqAtTIy8VSklpcIsTqlp/vXaLEoMUAALqJaBaNAAAA
         """,
-        """
+            """
         androidx/compose/runtime/saveable/RememberSaveableKt.class:
         H4sIAAAAAAAA/81X3VMbVRT/3WSTbD4Ky/JR2GJbgdiQ0C4gfhVEEYvEBlqb
         iK34tYQtLkl2md0N07441f/BcXztizM+9U3UmQ7jo/+Kf4EvjufubkJKgqR2
@@ -119,7 +118,7 @@
         PtqE7GDCwXkHtxwUHcw5KDm45tB/DyQ9Tr+DCx4x6OBjB1EHUw6y/wIvfIxc
         Kg8AAA==
         """,
-        """
+            """
         androidx/compose/runtime/saveable/Saver.class:
         H4sIAAAAAAAA/41PTU/CQBB92yKUilrED/gFxh4sEhMTNSZeTGowJDTxwmmB
         lSzQrekuhGN/lwfTsz/KOBW5qAc3mZm3b95k3rx/vL4BuECL4YSrcZrI8SoY
@@ -130,13 +129,14 @@
         xHdKJYYbmShdJlfYwvrZOKJsUT3+qodoUr2kfWXSVAawQzghqiFcbBNELcQO
         dgdgGnvwBihp1DX2NRoaB5+QkX6G8gEAAA==
         """
-    )
+        )
 
     @Test
     fun saverPassedToVarargs() {
-        lint().files(
-            kotlin(
-                """
+        lint()
+            .files(
+                kotlin(
+                    """
                 package test
 
                 import androidx.compose.runtime.*
@@ -160,12 +160,12 @@
                     val mutableStateFoo4 = rememberSaveable(fooSaver4) { mutableStateOf(Foo()) }
                 }
             """
-            ),
-            rememberSaveableStub,
-            Stubs.Composable,
-            Stubs.SnapshotState,
-            Stubs.StateFactoryMarker
-        )
+                ),
+                rememberSaveableStub,
+                Stubs.Composable,
+                Stubs.SnapshotState,
+                Stubs.StateFactoryMarker
+            )
             .run()
             .expect(
                 """
@@ -236,9 +236,10 @@
 
     @Test
     fun noErrors() {
-        lint().files(
-            kotlin(
-                """
+        lint()
+            .files(
+                kotlin(
+                    """
                 package test
 
                 import androidx.compose.runtime.*
@@ -275,12 +276,12 @@
                     }
                 }
             """
-            ),
-            rememberSaveableStub,
-            Stubs.Composable,
-            Stubs.SnapshotState,
-            Stubs.StateFactoryMarker
-        )
+                ),
+                rememberSaveableStub,
+                Stubs.Composable,
+                Stubs.SnapshotState,
+                Stubs.StateFactoryMarker
+            )
             .run()
             .expectClean()
     }
diff --git a/compose/runtime/runtime-saveable/samples/src/main/java/androidx/compose/runtime/saveable/samples/RememberSaveableSamples.kt b/compose/runtime/runtime-saveable/samples/src/main/java/androidx/compose/runtime/saveable/samples/RememberSaveableSamples.kt
index 0e741ce..5f24cac 100644
--- a/compose/runtime/runtime-saveable/samples/src/main/java/androidx/compose/runtime/saveable/samples/RememberSaveableSamples.kt
+++ b/compose/runtime/runtime-saveable/samples/src/main/java/androidx/compose/runtime/saveable/samples/RememberSaveableSamples.kt
@@ -52,7 +52,4 @@
 
 private data class Holder(var value: Int)
 
-private val HolderSaver = Saver<Holder, Int>(
-    save = { it.value },
-    restore = { Holder(it) }
-)
+private val HolderSaver = Saver<Holder, Int>(save = { it.value }, restore = { Holder(it) })
diff --git a/compose/runtime/runtime-saveable/samples/src/main/java/androidx/compose/runtime/saveable/samples/SaveableStateHolderSamples.kt b/compose/runtime/runtime-saveable/samples/src/main/java/androidx/compose/runtime/saveable/samples/SaveableStateHolderSamples.kt
index cd7caaa..35d102f 100644
--- a/compose/runtime/runtime-saveable/samples/src/main/java/androidx/compose/runtime/saveable/samples/SaveableStateHolderSamples.kt
+++ b/compose/runtime/runtime-saveable/samples/src/main/java/androidx/compose/runtime/saveable/samples/SaveableStateHolderSamples.kt
@@ -52,21 +52,15 @@
             // Wrap the content representing the `currentScreen` inside `SaveableStateProvider`.
             // Here you can also add a screen switch animation like Crossfade where during the
             // animation multiple screens will be displayed at the same time.
-            saveableStateHolder.SaveableStateProvider(currentScreen) {
-                content(currentScreen)
-            }
+            saveableStateHolder.SaveableStateProvider(currentScreen) { content(currentScreen) }
         }
     }
 
     Column {
         var screen by rememberSaveable { mutableStateOf("screen1") }
         Row(horizontalArrangement = Arrangement.SpaceEvenly) {
-            Button(onClick = { screen = "screen1" }) {
-                Text("Go to screen1")
-            }
-            Button(onClick = { screen = "screen2" }) {
-                Text("Go to screen2")
-            }
+            Button(onClick = { screen = "screen1" }) { Text("Go to screen1") }
+            Button(onClick = { screen = "screen2" }) { Text("Go to screen2") }
         }
         Navigation(screen, Modifier.fillMaxSize()) { currentScreen ->
             if (currentScreen == "screen1") {
@@ -81,9 +75,7 @@
 @Composable
 fun Screen1() {
     var counter by rememberSaveable { mutableStateOf(0) }
-    Button(onClick = { counter++ }) {
-        Text("Counter=$counter on Screen1")
-    }
+    Button(onClick = { counter++ }) { Text("Counter=$counter on Screen1") }
 }
 
 @Composable
diff --git a/compose/runtime/runtime-saveable/samples/src/main/java/androidx/compose/runtime/saveable/samples/SaverSamples.kt b/compose/runtime/runtime-saveable/samples/src/main/java/androidx/compose/runtime/saveable/samples/SaverSamples.kt
index 3df4773..efbce03 100644
--- a/compose/runtime/runtime-saveable/samples/src/main/java/androidx/compose/runtime/saveable/samples/SaverSamples.kt
+++ b/compose/runtime/runtime-saveable/samples/src/main/java/androidx/compose/runtime/saveable/samples/SaverSamples.kt
@@ -31,10 +31,7 @@
 
     // this Saver implementation converts Holder object which we don't know how to save
     // to Int which we can save
-    val HolderSaver = Saver<Holder, Int>(
-        save = { it.value },
-        restore = { Holder(it) }
-    )
+    val HolderSaver = Saver<Holder, Int>(save = { it.value }, restore = { Holder(it) })
 }
 
 @Sampled
@@ -42,10 +39,8 @@
 fun ListSaverSample() {
     data class Size(val x: Int, val y: Int)
 
-    val sizeSaver = listSaver<Size, Int>(
-        save = { listOf(it.x, it.y) },
-        restore = { Size(it[0], it[1]) }
-    )
+    val sizeSaver =
+        listSaver<Size, Int>(save = { listOf(it.x, it.y) }, restore = { Size(it[0], it[1]) })
 }
 
 @Sampled
diff --git a/compose/runtime/runtime-saveable/src/androidInstrumentedTest/kotlin/androidx/compose/runtime/saveable/ActivityRecreationTest.kt b/compose/runtime/runtime-saveable/src/androidInstrumentedTest/kotlin/androidx/compose/runtime/saveable/ActivityRecreationTest.kt
index ab8811c..eb1dec7 100644
--- a/compose/runtime/runtime-saveable/src/androidInstrumentedTest/kotlin/androidx/compose/runtime/saveable/ActivityRecreationTest.kt
+++ b/compose/runtime/runtime-saveable/src/androidInstrumentedTest/kotlin/androidx/compose/runtime/saveable/ActivityRecreationTest.kt
@@ -60,9 +60,7 @@
 
         activityScenario.recreate()
 
-        activityScenario.onActivity {
-            assertThat(it.array).isEqualTo(intArrayOf(0))
-        }
+        activityScenario.onActivity { assertThat(it.array).isEqualTo(intArrayOf(0)) }
     }
 
     @Test
@@ -80,9 +78,7 @@
 
         activityScenario.recreate()
 
-        activityScenario.onActivity {
-            assertThat(it.array).isEqualTo(intArrayOf(1))
-        }
+        activityScenario.onActivity { assertThat(it.array).isEqualTo(intArrayOf(1)) }
     }
 
     @Test
@@ -150,9 +146,7 @@
 
         activityScenario.recreate()
 
-        activityScenario.onActivity {
-            assertThat(it.state.value).isEqualTo(1)
-        }
+        activityScenario.onActivity { assertThat(it.state.value).isEqualTo(1) }
     }
 
     @Test
@@ -170,9 +164,7 @@
 
         activityScenario.recreate()
 
-        activityScenario.onActivity {
-            assertThat(it.state.value).isEqualTo(1)
-        }
+        activityScenario.onActivity { assertThat(it.state.value).isEqualTo(1) }
     }
 
     @Test
@@ -190,9 +182,7 @@
 
         activityScenario.recreate()
 
-        activityScenario.onActivity {
-            assertThat(it.state.value).isEqualTo(Count(1))
-        }
+        activityScenario.onActivity { assertThat(it.state.value).isEqualTo(Count(1)) }
     }
 
     @Test
@@ -284,9 +274,7 @@
 
     override fun onCreate(savedInstanceState: Bundle?) {
         super.onCreate(savedInstanceState)
-        setContent {
-            array = remember { intArrayOf(0) }
-        }
+        setContent { array = remember { intArrayOf(0) } }
     }
 }
 
@@ -312,12 +300,12 @@
 
         val linear = LinearLayout(this)
         linear.orientation = LinearLayout.VERTICAL
-        val params = LinearLayout.LayoutParams(
-            ViewGroup.LayoutParams.MATCH_PARENT,
-            ViewGroup
-                .LayoutParams.WRAP_CONTENT,
-            1f
-        )
+        val params =
+            LinearLayout.LayoutParams(
+                ViewGroup.LayoutParams.MATCH_PARENT,
+                ViewGroup.LayoutParams.WRAP_CONTENT,
+                1f
+            )
         val child1 = ComposeView(this)
         child1.id = R.id.child1
         linear.addView(child1, params)
@@ -344,12 +332,12 @@
 
         val linear = LinearLayout(this)
         linear.orientation = LinearLayout.VERTICAL
-        val params = LinearLayout.LayoutParams(
-            ViewGroup.LayoutParams.MATCH_PARENT,
-            ViewGroup
-                .LayoutParams.WRAP_CONTENT,
-            1f
-        )
+        val params =
+            LinearLayout.LayoutParams(
+                ViewGroup.LayoutParams.MATCH_PARENT,
+                ViewGroup.LayoutParams.WRAP_CONTENT,
+                1f
+            )
         val child1 = FrameLayout(this)
         child1.id = R.id.child1
         linear.addView(child1, params)
@@ -359,7 +347,8 @@
         setContentView(linear)
 
         if (savedInstanceState == null) {
-            supportFragmentManager.beginTransaction()
+            supportFragmentManager
+                .beginTransaction()
                 .replace(R.id.child1, TestFragment())
                 .replace(R.id.child2, TestFragment())
                 .commitNow()
@@ -373,9 +362,7 @@
 
     override fun onCreate(savedInstanceState: Bundle?) {
         super.onCreate(savedInstanceState)
-        setContent {
-            state = rememberSaveable { mutableStateOf(0) }
-        }
+        setContent { state = rememberSaveable { mutableStateOf(0) } }
     }
 }
 
@@ -387,9 +374,7 @@
         super.onCreate(savedInstanceState)
         setContent {
             val holder = rememberSaveableStateHolder()
-            holder.SaveableStateProvider(0) {
-                state = rememberSaveable { mutableStateOf(0) }
-            }
+            holder.SaveableStateProvider(0) { state = rememberSaveable { mutableStateOf(0) } }
         }
     }
 }
@@ -426,18 +411,17 @@
     }
 }
 
-val StateAsListSaver = listSaver<MutableState<Int>, MutableState<Int>>(
-    save = { listOf(it) },
-    restore = { it[0] }
-)
+val StateAsListSaver =
+    listSaver<MutableState<Int>, MutableState<Int>>(save = { listOf(it) }, restore = { it[0] })
 
-val StateAsMapSaver = mapSaver(
-    save = { mapOf("state" to it) },
-    restore = {
-        @Suppress("UNCHECKED_CAST")
-        it["state"] as MutableState<Int>
-    }
-)
+val StateAsMapSaver =
+    mapSaver(
+        save = { mapOf("state" to it) },
+        restore = {
+            @Suppress("UNCHECKED_CAST")
+            it["state"] as MutableState<Int>
+        }
+    )
 
 class PopupsRecreationTestActivity : BaseRestorableActivity() {
 
@@ -447,12 +431,8 @@
     override fun onCreate(savedInstanceState: Bundle?) {
         super.onCreate(savedInstanceState)
         setContent {
-            Popup {
-                valueInPopup1 = rememberSaveable { Random.nextInt() }
-            }
-            Popup {
-                valueInPopup2 = rememberSaveable { Random.nextInt() }
-            }
+            Popup { valueInPopup1 = rememberSaveable { Random.nextInt() } }
+            Popup { valueInPopup2 = rememberSaveable { Random.nextInt() } }
         }
     }
 }
@@ -465,12 +445,8 @@
     override fun onCreate(savedInstanceState: Bundle?) {
         super.onCreate(savedInstanceState)
         setContent {
-            Dialog(onDismissRequest = {}) {
-                valueInDialog1 = rememberSaveable { Random.nextInt() }
-            }
-            Dialog(onDismissRequest = {}) {
-                valueInDialog2 = rememberSaveable { Random.nextInt() }
-            }
+            Dialog(onDismissRequest = {}) { valueInDialog1 = rememberSaveable { Random.nextInt() } }
+            Dialog(onDismissRequest = {}) { valueInDialog2 = rememberSaveable { Random.nextInt() } }
         }
     }
 }
@@ -500,17 +476,15 @@
         inflater: LayoutInflater,
         container: ViewGroup?,
         savedInstanceState: Bundle?
-    ) = ComposeView(requireContext()).apply {
-        setContent {
-            arrayOf<Any?>()
-            array = rememberSaveable(key = "key") { intArrayOf(0) }
+    ) =
+        ComposeView(requireContext()).apply {
+            setContent {
+                arrayOf<Any?>()
+                array = rememberSaveable(key = "key") { intArrayOf(0) }
+            }
         }
-    }
 }
 
 data class Count(val count: Int)
 
-val CountSaver = Saver<Count, Int>(
-    save = { it.count },
-    restore = { Count(it) }
-)
+val CountSaver = Saver<Count, Int>(save = { it.count }, restore = { Count(it) })
diff --git a/compose/runtime/runtime-saveable/src/androidInstrumentedTest/kotlin/androidx/compose/runtime/saveable/Holder.kt b/compose/runtime/runtime-saveable/src/androidInstrumentedTest/kotlin/androidx/compose/runtime/saveable/Holder.kt
index 87b64a6..f4e23ab 100644
--- a/compose/runtime/runtime-saveable/src/androidInstrumentedTest/kotlin/androidx/compose/runtime/saveable/Holder.kt
+++ b/compose/runtime/runtime-saveable/src/androidInstrumentedTest/kotlin/androidx/compose/runtime/saveable/Holder.kt
@@ -18,7 +18,4 @@
 
 internal data class Holder(var value: Int)
 
-internal val HolderSaver = Saver<Holder, Int>(
-    save = { it.value },
-    restore = { Holder(it) }
-)
+internal val HolderSaver = Saver<Holder, Int>(save = { it.value }, restore = { Holder(it) })
diff --git a/compose/runtime/runtime-saveable/src/androidInstrumentedTest/kotlin/androidx/compose/runtime/saveable/RememberSaveableTest.kt b/compose/runtime/runtime-saveable/src/androidInstrumentedTest/kotlin/androidx/compose/runtime/saveable/RememberSaveableTest.kt
index 4babdd8..58f4447 100644
--- a/compose/runtime/runtime-saveable/src/androidInstrumentedTest/kotlin/androidx/compose/runtime/saveable/RememberSaveableTest.kt
+++ b/compose/runtime/runtime-saveable/src/androidInstrumentedTest/kotlin/androidx/compose/runtime/saveable/RememberSaveableTest.kt
@@ -38,19 +38,14 @@
 @RunWith(AndroidJUnit4::class)
 class RememberSaveableTest {
 
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
     private val restorationTester = StateRestorationTester(rule)
 
     @Test
     fun simpleRestore() {
         var array: IntArray? = null
-        restorationTester.setContent {
-            array = rememberSaveable {
-                intArrayOf(0)
-            }
-        }
+        restorationTester.setContent { array = rememberSaveable { intArrayOf(0) } }
 
         assertThat(array).isEqualTo(intArrayOf(0))
 
@@ -69,9 +64,7 @@
     fun restoreWithSaver() {
         var holder: Holder? = null
         restorationTester.setContent {
-            holder = rememberSaveable(saver = HolderSaver) {
-                Holder(0)
-            }
+            holder = rememberSaveable(saver = HolderSaver) { Holder(0) }
         }
 
         assertThat(holder).isEqualTo(Holder(0))
@@ -170,31 +163,28 @@
     @Test
     fun unregistersFromPrevProviderAndRegistersToTheNewOne() {
         var unregisterCalledForKey: String? = null
-        var registryFactory by mutableStateOf<(SaveableStateRegistry) -> SaveableStateRegistry>(
-            value = {
-                object : DelegateRegistry(it) {
-                    override fun registerProvider(
-                        key: String,
-                        valueProvider: () -> Any?
-                    ): SaveableStateRegistry.Entry {
-                        val entry = super.registerProvider(key, valueProvider)
-                        return object : SaveableStateRegistry.Entry {
-                            override fun unregister() {
-                                unregisterCalledForKey = key
-                                entry.unregister()
+        var registryFactory by
+            mutableStateOf<(SaveableStateRegistry) -> SaveableStateRegistry>(
+                value = {
+                    object : DelegateRegistry(it) {
+                        override fun registerProvider(
+                            key: String,
+                            valueProvider: () -> Any?
+                        ): SaveableStateRegistry.Entry {
+                            val entry = super.registerProvider(key, valueProvider)
+                            return object : SaveableStateRegistry.Entry {
+                                override fun unregister() {
+                                    unregisterCalledForKey = key
+                                    entry.unregister()
+                                }
                             }
                         }
                     }
                 }
-            }
-        )
+            )
 
         rule.setContent {
-            WrapRegistry(
-                wrap = {
-                    registryFactory(it)
-                }
-            ) {
+            WrapRegistry(wrap = { registryFactory(it) }) {
                 val v = rememberSaveable { 1 }
                 assertEquals(1, v)
             }
@@ -256,9 +246,7 @@
         }
 
         rule.mainClock.advanceTimeUntil { registerCalled == 1 }
-        rule.runOnUiThread {
-            key = "key2"
-        }
+        rule.runOnUiThread { key = "key2" }
 
         rule.mainClock.advanceTimeUntil { registerCalled == 2 }
         assertThat(registeredKeys).isEqualTo(mutableSetOf("key2"))
@@ -266,27 +254,21 @@
 
     @Test
     fun theLatestPassedSaverIsUsed() {
-        var saver by mutableStateOf(
-            Saver<Int, Int>(
-                save = { 1 },
-                restore = { 1 }
-            )
-        )
+        var saver by mutableStateOf(Saver<Int, Int>(save = { 1 }, restore = { 1 }))
 
-        restorationTester.setContent {
-            rememberSaveable(saver = saver) { 1 }
-        }
+        restorationTester.setContent { rememberSaveable(saver = saver) { 1 } }
 
         val latch = CountDownLatch(1)
 
         rule.runOnIdle {
-            saver = Saver(
-                save = {
-                    latch.countDown()
-                    1
-                },
-                restore = { 1 }
-            )
+            saver =
+                Saver(
+                    save = {
+                        latch.countDown()
+                        1
+                    },
+                    restore = { 1 }
+                )
         }
 
         restorationTester.emulateSavedInstanceStateRestore()
@@ -388,11 +370,7 @@
         var counter = 0
         var composedValue: Int? = null
         var input by mutableStateOf(0)
-        restorationTester.setContent {
-            composedValue = rememberSaveable(input) {
-                counter++
-            }
-        }
+        restorationTester.setContent { composedValue = rememberSaveable(input) { counter++ } }
 
         rule.runOnIdle {
             assertThat(composedValue).isEqualTo(0)
@@ -406,9 +384,7 @@
 
         restorationTester.emulateSavedInstanceStateRestore()
 
-        rule.runOnIdle {
-            assertThat(composedValue).isEqualTo(1)
-        }
+        rule.runOnIdle { assertThat(composedValue).isEqualTo(1) }
     }
 
     @Test
diff --git a/compose/runtime/runtime-saveable/src/androidInstrumentedTest/kotlin/androidx/compose/runtime/saveable/RememberSaveableWithMutableStateTest.kt b/compose/runtime/runtime-saveable/src/androidInstrumentedTest/kotlin/androidx/compose/runtime/saveable/RememberSaveableWithMutableStateTest.kt
index d37ca3b..c0d3298 100644
--- a/compose/runtime/runtime-saveable/src/androidInstrumentedTest/kotlin/androidx/compose/runtime/saveable/RememberSaveableWithMutableStateTest.kt
+++ b/compose/runtime/runtime-saveable/src/androidInstrumentedTest/kotlin/androidx/compose/runtime/saveable/RememberSaveableWithMutableStateTest.kt
@@ -31,17 +31,14 @@
 @RunWith(AndroidJUnit4::class)
 class RememberSaveableWithMutableStateTest {
 
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
     private val restorationTester = StateRestorationTester(rule)
 
     @Test
     fun simpleRestore() {
         var state: MutableState<Int>? = null
-        restorationTester.setContent {
-            state = rememberSaveable { mutableStateOf(0) }
-        }
+        restorationTester.setContent { state = rememberSaveable { mutableStateOf(0) } }
 
         rule.runOnUiThread {
             assertThat(state!!.value).isEqualTo(0)
@@ -53,18 +50,14 @@
 
         restorationTester.emulateSavedInstanceStateRestore()
 
-        rule.runOnUiThread {
-            assertThat(state!!.value).isEqualTo(1)
-        }
+        rule.runOnUiThread { assertThat(state!!.value).isEqualTo(1) }
     }
 
     @Test
     fun restoreWithSaver() {
         var state: MutableState<Holder>? = null
         restorationTester.setContent {
-            state = rememberSaveable(stateSaver = HolderSaver) {
-                mutableStateOf(Holder(0))
-            }
+            state = rememberSaveable(stateSaver = HolderSaver) { mutableStateOf(Holder(0)) }
         }
 
         rule.runOnIdle {
@@ -77,17 +70,13 @@
 
         restorationTester.emulateSavedInstanceStateRestore()
 
-        rule.runOnIdle {
-            assertThat(state!!.value).isEqualTo(Holder(1))
-        }
+        rule.runOnIdle { assertThat(state!!.value).isEqualTo(Holder(1)) }
     }
 
     @Test
     fun nullableStateRestoresNonNullValue() {
         var state: MutableState<String?>? = null
-        restorationTester.setContent {
-            state = rememberSaveable { mutableStateOf(null) }
-        }
+        restorationTester.setContent { state = rememberSaveable { mutableStateOf(null) } }
 
         rule.runOnUiThread {
             assertThat(state!!.value).isNull()
@@ -99,17 +88,13 @@
 
         restorationTester.emulateSavedInstanceStateRestore()
 
-        rule.runOnUiThread {
-            assertThat(state!!.value).isEqualTo("value")
-        }
+        rule.runOnUiThread { assertThat(state!!.value).isEqualTo("value") }
     }
 
     @Test
     fun nullableStateRestoresNullValue() {
         var state: MutableState<String?>? = null
-        restorationTester.setContent {
-            state = rememberSaveable { mutableStateOf("initial") }
-        }
+        restorationTester.setContent { state = rememberSaveable { mutableStateOf("initial") } }
 
         rule.runOnUiThread {
             assertThat(state!!.value).isEqualTo("initial")
@@ -121,26 +106,19 @@
 
         restorationTester.emulateSavedInstanceStateRestore()
 
-        rule.runOnUiThread {
-            assertThat(state!!.value).isNull()
-        }
+        rule.runOnUiThread { assertThat(state!!.value).isNull() }
     }
 
     @Test
     fun stateSaverReturnsNull() {
         var state: MutableState<String>? = null
-        val saver = Saver<String, String>(
-            save = { null },
-            restore = { it }
-        )
+        val saver = Saver<String, String>(save = { null }, restore = { it })
         restorationTester.setContent {
             state = rememberSaveable(stateSaver = saver) { mutableStateOf("value") }
         }
 
         restorationTester.emulateSavedInstanceStateRestore()
 
-        rule.runOnUiThread {
-            assertThat(state!!.value).isEqualTo("value")
-        }
+        rule.runOnUiThread { assertThat(state!!.value).isEqualTo("value") }
     }
 }
diff --git a/compose/runtime/runtime-saveable/src/androidInstrumentedTest/kotlin/androidx/compose/runtime/saveable/RestorationInVariousScenariosTest.kt b/compose/runtime/runtime-saveable/src/androidInstrumentedTest/kotlin/androidx/compose/runtime/saveable/RestorationInVariousScenariosTest.kt
index 20b47f6..6bba821 100644
--- a/compose/runtime/runtime-saveable/src/androidInstrumentedTest/kotlin/androidx/compose/runtime/saveable/RestorationInVariousScenariosTest.kt
+++ b/compose/runtime/runtime-saveable/src/androidInstrumentedTest/kotlin/androidx/compose/runtime/saveable/RestorationInVariousScenariosTest.kt
@@ -33,8 +33,7 @@
 @RunWith(AndroidJUnit4::class)
 class RestorationInVariousScenariosTest {
 
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
     private val restorationTester = StateRestorationTester(rule)
 
@@ -72,9 +71,7 @@
         val states = arrayOfNulls<MutableState<Int>>(2)
         restorationTester.setContent {
             for (i in 0..1) {
-                key(i) {
-                    states[i] = rememberSaveable { mutableStateOf(0) }
-                }
+                key(i) { states[i] = rememberSaveable { mutableStateOf(0) } }
             }
         }
 
@@ -133,9 +130,7 @@
         val statesInLoop = arrayOfNulls<MutableState<Int>?>(2)
         var stateOutside: MutableState<String>? = null
         restorationTester.setContent {
-            repeat(number) {
-                statesInLoop[it] = rememberSaveable { mutableStateOf(0) }
-            }
+            repeat(number) { statesInLoop[it] = rememberSaveable { mutableStateOf(0) } }
             stateOutside = rememberSaveable { mutableStateOf("0") }
         }
 
diff --git a/compose/runtime/runtime-saveable/src/androidInstrumentedTest/kotlin/androidx/compose/runtime/saveable/SaveableStateHolderTest.kt b/compose/runtime/runtime-saveable/src/androidInstrumentedTest/kotlin/androidx/compose/runtime/saveable/SaveableStateHolderTest.kt
index 29dd6fc..2fe194a 100644
--- a/compose/runtime/runtime-saveable/src/androidInstrumentedTest/kotlin/androidx/compose/runtime/saveable/SaveableStateHolderTest.kt
+++ b/compose/runtime/runtime-saveable/src/androidInstrumentedTest/kotlin/androidx/compose/runtime/saveable/SaveableStateHolderTest.kt
@@ -37,8 +37,7 @@
 @RunWith(AndroidJUnit4::class)
 class SaveableStateHolderTest {
 
-    @get:Rule
-    val rule = createAndroidComposeRule<Activity>()
+    @get:Rule val rule = createAndroidComposeRule<Activity>()
 
     private val restorationTester = StateRestorationTester(rule)
 
@@ -125,9 +124,7 @@
             }
         }
 
-        rule.runOnIdle {
-            screen = Screens.Screen2
-        }
+        rule.runOnIdle { screen = Screens.Screen2 }
 
         // wait for the screen switch to apply
         rule.runOnIdle {
@@ -179,9 +176,7 @@
         restorationTester.emulateSavedInstanceStateRestore()
 
         // switch back to screen1
-        rule.runOnIdle {
-            screen = Screens.Screen1
-        }
+        rule.runOnIdle { screen = Screens.Screen1 }
 
         rule.runOnIdle {
             assertThat(numberOnScreen1).isEqualTo(2)
@@ -220,9 +215,7 @@
             screen = Screens.Screen1
         }
 
-        rule.runOnIdle {
-            assertThat(restorableNumberOnScreen1).isEqualTo(1)
-        }
+        rule.runOnIdle { assertThat(restorableNumberOnScreen1).isEqualTo(1) }
     }
 
     @Test
@@ -256,9 +249,7 @@
             screen = Screens.Screen1
         }
 
-        rule.runOnIdle {
-            assertThat(restorableNumberOnScreen1).isEqualTo(1)
-        }
+        rule.runOnIdle { assertThat(restorableNumberOnScreen1).isEqualTo(1) }
     }
 
     @Test
@@ -288,9 +279,7 @@
             showFirstPage = true
         }
 
-        rule.runOnIdle {
-            assertThat(firstPageState!!.value).isEqualTo(1)
-        }
+        rule.runOnIdle { assertThat(firstPageState!!.value).isEqualTo(1) }
     }
 
     @Test
@@ -301,14 +290,11 @@
         rule.setContent {
             CompositionLocalProvider(LocalSaveableStateRegistry provides registry) {
                 val holder = rememberSaveableStateHolder()
-                holder.SaveableStateProvider(showFirstPage) {
-                }
+                holder.SaveableStateProvider(showFirstPage) {}
             }
         }
 
-        rule.runOnIdle {
-            showFirstPage = false
-        }
+        rule.runOnIdle { showFirstPage = false }
 
         rule.runOnIdle {
             val savedData = registry.performSave()
diff --git a/compose/runtime/runtime-saveable/src/androidUnitTest/kotlin/androidx/compose/runtime/saveable/AutoSaverTest.kt b/compose/runtime/runtime-saveable/src/androidUnitTest/kotlin/androidx/compose/runtime/saveable/AutoSaverTest.kt
index 58f56ff..39a44a8 100644
--- a/compose/runtime/runtime-saveable/src/androidUnitTest/kotlin/androidx/compose/runtime/saveable/AutoSaverTest.kt
+++ b/compose/runtime/runtime-saveable/src/androidUnitTest/kotlin/androidx/compose/runtime/saveable/AutoSaverTest.kt
@@ -28,17 +28,16 @@
     fun simpleSave() {
         val saver = autoSaver<Int>()
 
-        with(saver) {
-            assertThat(allowingScope.save(2))
-                .isEqualTo(2)
-        }
+        with(saver) { assertThat(allowingScope.save(2)).isEqualTo(2) }
     }
 }
 
-val allowingScope = object : SaverScope {
-    override fun canBeSaved(value: Any) = true
-}
+val allowingScope =
+    object : SaverScope {
+        override fun canBeSaved(value: Any) = true
+    }
 
-val disallowingScope = object : SaverScope {
-    override fun canBeSaved(value: Any) = false
-}
+val disallowingScope =
+    object : SaverScope {
+        override fun canBeSaved(value: Any) = false
+    }
diff --git a/compose/runtime/runtime-saveable/src/androidUnitTest/kotlin/androidx/compose/runtime/saveable/ListSaverTest.kt b/compose/runtime/runtime-saveable/src/androidUnitTest/kotlin/androidx/compose/runtime/saveable/ListSaverTest.kt
index 99d6d4d..82981b8 100644
--- a/compose/runtime/runtime-saveable/src/androidUnitTest/kotlin/androidx/compose/runtime/saveable/ListSaverTest.kt
+++ b/compose/runtime/runtime-saveable/src/androidUnitTest/kotlin/androidx/compose/runtime/saveable/ListSaverTest.kt
@@ -28,33 +28,27 @@
     @Test
     fun simpleSaveAndRestore() {
         val original = Size(2, 3)
-        val saved = with(SizeSaver) {
-            allowingScope.save(original)
-        }
+        val saved = with(SizeSaver) { allowingScope.save(original) }
 
         assertThat(saved).isNotNull()
-        assertThat(SizeSaver.restore(saved!!))
-            .isEqualTo(original)
+        assertThat(SizeSaver.restore(saved!!)).isEqualTo(original)
     }
 
     @Test(expected = IllegalArgumentException::class)
     fun exceptionWhenAllItemsCantBeSaved() {
-        with(SizeSaver) {
-            disallowingScope.save(Size(2, 3))
-        }
+        with(SizeSaver) { disallowingScope.save(Size(2, 3)) }
     }
 
     @Test
     fun customListIsTransformedToArrayList() {
         val saver = listSaver<List<String>, String>(save = { it }, restore = { null })
-        val scopeAllowingOnlyArrayListAndString = object : SaverScope {
-            override fun canBeSaved(value: Any) = value is ArrayList<*> || value is String
-        }
+        val scopeAllowingOnlyArrayListAndString =
+            object : SaverScope {
+                override fun canBeSaved(value: Any) = value is ArrayList<*> || value is String
+            }
 
         val stateList = mutableStateListOf("One", "Two")
-        val savedList = with(saver) {
-            scopeAllowingOnlyArrayListAndString.save(stateList)
-        }
+        val savedList = with(saver) { scopeAllowingOnlyArrayListAndString.save(stateList) }
         assertThat(savedList).isInstanceOf(ArrayList::class.java)
         assertThat(savedList).isEqualTo(listOf("One", "Two"))
     }
@@ -62,24 +56,18 @@
     @Test
     fun nullableListItemsAreSupported() {
         val original = NullableSize(null, 3)
-        val saved = with(NullableSizeSaver) {
-            allowingScope.save(original)
-        }
+        val saved = with(NullableSizeSaver) { allowingScope.save(original) }
 
         assertThat(saved).isNotNull()
-        assertThat(NullableSizeSaver.restore(saved!!))
-            .isEqualTo(original)
+        assertThat(NullableSizeSaver.restore(saved!!)).isEqualTo(original)
     }
 
     @Test
     fun nullableTypeIsSupported() {
-        val saved = with(NullableSizeSaver) {
-            allowingScope.save(null)
-        }
+        val saved = with(NullableSizeSaver) { allowingScope.save(null) }
 
         assertThat(saved).isNotNull()
-        assertThat(NullableSizeSaver.restore(saved!!))
-            .isEqualTo(NullableSize(null, null))
+        assertThat(NullableSizeSaver.restore(saved!!)).isEqualTo(NullableSize(null, null))
     }
 }
 
@@ -87,12 +75,11 @@
 
 private data class NullableSize(val x: Int?, val y: Int?)
 
-private val SizeSaver = listSaver<Size, Int>(
-    save = { listOf(it.x, it.y) },
-    restore = { Size(it[0], it[1]) }
-)
+private val SizeSaver =
+    listSaver<Size, Int>(save = { listOf(it.x, it.y) }, restore = { Size(it[0], it[1]) })
 
-private val NullableSizeSaver = listSaver<NullableSize?, Int?>(
-    save = { listOf(it?.x, it?.y) },
-    restore = { NullableSize(it[0], it[1]) }
-)
+private val NullableSizeSaver =
+    listSaver<NullableSize?, Int?>(
+        save = { listOf(it?.x, it?.y) },
+        restore = { NullableSize(it[0], it[1]) }
+    )
diff --git a/compose/runtime/runtime-saveable/src/androidUnitTest/kotlin/androidx/compose/runtime/saveable/MapSaverTest.kt b/compose/runtime/runtime-saveable/src/androidUnitTest/kotlin/androidx/compose/runtime/saveable/MapSaverTest.kt
index 10621d5..bc5b2347 100644
--- a/compose/runtime/runtime-saveable/src/androidUnitTest/kotlin/androidx/compose/runtime/saveable/MapSaverTest.kt
+++ b/compose/runtime/runtime-saveable/src/androidUnitTest/kotlin/androidx/compose/runtime/saveable/MapSaverTest.kt
@@ -27,54 +27,42 @@
     @Test
     fun simpleSaveAndRestore() {
         val original = User("John", 30)
-        val saved = with(UserSaver) {
-            allowingScope.save(original)
-        }
+        val saved = with(UserSaver) { allowingScope.save(original) }
 
         assertThat(saved).isNotNull()
-        assertThat(UserSaver.restore(saved!!))
-            .isEqualTo(original)
+        assertThat(UserSaver.restore(saved!!)).isEqualTo(original)
     }
 
     @Test(expected = IllegalArgumentException::class)
     fun exceptionWhenAllItemsCantBeSaved() {
-        with(UserSaver) {
-            disallowingScope.save(User("John", 30))
-        }
+        with(UserSaver) { disallowingScope.save(User("John", 30)) }
     }
 
     @Test(expected = IllegalArgumentException::class)
     fun exceptionWhenOneValueCantBeSaved() {
-        val onlyInts = object : SaverScope {
-            override fun canBeSaved(value: Any) = value is Int
-        }
+        val onlyInts =
+            object : SaverScope {
+                override fun canBeSaved(value: Any) = value is Int
+            }
 
-        with(UserSaver) {
-            onlyInts.save(User("John", 30))
-        }
+        with(UserSaver) { onlyInts.save(User("John", 30)) }
     }
 
     @Test
     fun nullableMapItemsAreSupported() {
         val original = NullableUser(null, 30)
-        val saved = with(NullableUserSaver) {
-            allowingScope.save(original)
-        }
+        val saved = with(NullableUserSaver) { allowingScope.save(original) }
 
         assertThat(saved).isNotNull()
-        assertThat(NullableUserSaver.restore(saved!!))
-            .isEqualTo(original)
+        assertThat(NullableUserSaver.restore(saved!!)).isEqualTo(original)
     }
 
     @Test
     fun nullableTypeIsSupported() {
-        val saved = with(NullableUserSaver) {
-            allowingScope.save(null)
-        }
+        val saved = with(NullableUserSaver) { allowingScope.save(null) }
 
         assertThat(saved).isNotNull()
-        assertThat(NullableUserSaver.restore(saved!!))
-            .isEqualTo(NullableUser(null, null))
+        assertThat(NullableUserSaver.restore(saved!!)).isEqualTo(NullableUser(null, null))
     }
 }
 
diff --git a/compose/runtime/runtime-saveable/src/androidUnitTest/kotlin/androidx/compose/runtime/saveable/SaveableStateRegistryTest.kt b/compose/runtime/runtime-saveable/src/androidUnitTest/kotlin/androidx/compose/runtime/saveable/SaveableStateRegistryTest.kt
index c74d862..7c82533 100644
--- a/compose/runtime/runtime-saveable/src/androidUnitTest/kotlin/androidx/compose/runtime/saveable/SaveableStateRegistryTest.kt
+++ b/compose/runtime/runtime-saveable/src/androidUnitTest/kotlin/androidx/compose/runtime/saveable/SaveableStateRegistryTest.kt
@@ -30,9 +30,7 @@
 
         registry.registerProvider("key") { 10 }
 
-        registry.performSave().apply {
-            assertThat(get("key")).isEqualTo(listOf(10))
-        }
+        registry.performSave().apply { assertThat(get("key")).isEqualTo(listOf(10)) }
     }
 
     @Test
@@ -43,9 +41,7 @@
         val entry = registry.registerProvider("key", provider)
         entry.unregister()
 
-        registry.performSave().apply {
-            assertThat(containsKey("key")).isFalse()
-        }
+        registry.performSave().apply { assertThat(containsKey("key")).isFalse() }
     }
 
     @Test
@@ -57,9 +53,7 @@
         entry.unregister()
         registry.registerProvider("key") { "value2" }
 
-        registry.performSave().apply {
-            assertThat(get("key")).isEqualTo(listOf("value2"))
-        }
+        registry.performSave().apply { assertThat(get("key")).isEqualTo(listOf("value2")) }
     }
 
     @Test
@@ -87,9 +81,7 @@
 
         registry.registerProvider("key") { null }
 
-        registry.performSave().apply {
-            assertThat(containsKey("key")).isFalse()
-        }
+        registry.performSave().apply { assertThat(containsKey("key")).isFalse() }
     }
 
     @Test
@@ -98,9 +90,7 @@
 
         registry.registerProvider("a") { 1 }
 
-        registry.performSave().apply {
-            assertThat(get("a")).isEqualTo(listOf(1))
-        }
+        registry.performSave().apply { assertThat(get("a")).isEqualTo(listOf(1)) }
     }
 
     @Test(expected = IllegalArgumentException::class)
diff --git a/compose/runtime/runtime-saveable/src/commonMain/kotlin/androidx/compose/runtime/saveable/ListSaver.kt b/compose/runtime/runtime-saveable/src/commonMain/kotlin/androidx/compose/runtime/saveable/ListSaver.kt
index d4f19d52..b5606ce 100644
--- a/compose/runtime/runtime-saveable/src/commonMain/kotlin/androidx/compose/runtime/saveable/ListSaver.kt
+++ b/compose/runtime/runtime-saveable/src/commonMain/kotlin/androidx/compose/runtime/saveable/ListSaver.kt
@@ -20,8 +20,8 @@
  * The [Saver] implementation which allows to represent your [Original] class as a list of
  * [Saveable] values.
  *
- * What types can be saved is defined by [SaveableStateRegistry], by default everything which can
- * be stored in the Bundle class can be saved.
+ * What types can be saved is defined by [SaveableStateRegistry], by default everything which can be
+ * stored in the Bundle class can be saved.
  *
  * You can use it as a parameter for [rememberSaveable].
  *
@@ -30,16 +30,18 @@
 fun <Original, Saveable> listSaver(
     save: SaverScope.(value: Original) -> List<Saveable>,
     restore: (list: List<Saveable>) -> Original?
-): Saver<Original, Any> = @Suppress("UNCHECKED_CAST") Saver(
-    save = {
-        val list = save(it)
-        for (index in list.indices) {
-            val item = list[index]
-            if (item != null) {
-                require(canBeSaved(item)) { "item can't be saved" }
+): Saver<Original, Any> =
+    @Suppress("UNCHECKED_CAST")
+    Saver(
+        save = {
+            val list = save(it)
+            for (index in list.indices) {
+                val item = list[index]
+                if (item != null) {
+                    require(canBeSaved(item)) { "item can't be saved" }
+                }
             }
-        }
-        if (list.isNotEmpty()) ArrayList(list) else null
-    },
-    restore = restore as (Any) -> Original?
-)
+            if (list.isNotEmpty()) ArrayList(list) else null
+        },
+        restore = restore as (Any) -> Original?
+    )
diff --git a/compose/runtime/runtime-saveable/src/commonMain/kotlin/androidx/compose/runtime/saveable/MapSaver.kt b/compose/runtime/runtime-saveable/src/commonMain/kotlin/androidx/compose/runtime/saveable/MapSaver.kt
index 9c43afa..1d1ffc1 100644
--- a/compose/runtime/runtime-saveable/src/commonMain/kotlin/androidx/compose/runtime/saveable/MapSaver.kt
+++ b/compose/runtime/runtime-saveable/src/commonMain/kotlin/androidx/compose/runtime/saveable/MapSaver.kt
@@ -17,11 +17,11 @@
 package androidx.compose.runtime.saveable
 
 /**
- * The [Saver] implementation which allows to represent your class as a map of values which can
- * be saved individually.
+ * The [Saver] implementation which allows to represent your class as a map of values which can be
+ * saved individually.
  *
- * What types can be saved is defined by [SaveableStateRegistry], by default everything which can
- * be stored in the Bundle class can be saved.
+ * What types can be saved is defined by [SaveableStateRegistry], by default everything which can be
+ * stored in the Bundle class can be saved.
  *
  * You can use it as a parameter for [rememberSaveable].
  *
@@ -30,25 +30,26 @@
 fun <T> mapSaver(
     save: SaverScope.(value: T) -> Map<String, Any?>,
     restore: (Map<String, Any?>) -> T?
-) = listSaver<T, Any?>(
-    save = {
-        mutableListOf<Any?>().apply {
-            save(it).forEach { entry ->
-                add(entry.key)
-                add(entry.value)
+) =
+    listSaver<T, Any?>(
+        save = {
+            mutableListOf<Any?>().apply {
+                save(it).forEach { entry ->
+                    add(entry.key)
+                    add(entry.value)
+                }
             }
+        },
+        restore = { list ->
+            val map = mutableMapOf<String, Any?>()
+            check(list.size.rem(2) == 0) { "non-zero remainder" }
+            var index = 0
+            while (index < list.size) {
+                val key = list[index] as String
+                val value = list[index + 1]
+                map[key] = value
+                index += 2
+            }
+            restore(map)
         }
-    },
-    restore = { list ->
-        val map = mutableMapOf<String, Any?>()
-        check(list.size.rem(2) == 0) { "non-zero remainder" }
-        var index = 0
-        while (index < list.size) {
-            val key = list[index] as String
-            val value = list[index + 1]
-            map[key] = value
-            index += 2
-        }
-        restore(map)
-    }
-)
+    )
diff --git a/compose/runtime/runtime-saveable/src/commonMain/kotlin/androidx/compose/runtime/saveable/RememberSaveable.kt b/compose/runtime/runtime-saveable/src/commonMain/kotlin/androidx/compose/runtime/saveable/RememberSaveable.kt
index c9b860e..57ea656 100644
--- a/compose/runtime/runtime-saveable/src/commonMain/kotlin/androidx/compose/runtime/saveable/RememberSaveable.kt
+++ b/compose/runtime/runtime-saveable/src/commonMain/kotlin/androidx/compose/runtime/saveable/RememberSaveable.kt
@@ -38,8 +38,8 @@
  *
  * @sample androidx.compose.runtime.saveable.samples.RememberSaveable
  *
- * If you use it with types which can be stored inside the Bundle then it will be saved and
- * restored automatically using [autoSaver], otherwise you will need to provide a custom [Saver]
+ * If you use it with types which can be stored inside the Bundle then it will be saved and restored
+ * automatically using [autoSaver], otherwise you will need to provide a custom [Saver]
  * implementation via the [saver] param.
  *
  * @sample androidx.compose.runtime.saveable.samples.RememberSaveableCustomSaver
@@ -48,18 +48,18 @@
  *
  * @sample androidx.compose.runtime.saveable.samples.RememberSaveableWithMutableState
  *
- * If the value inside the MutableState can be stored inside the Bundle it would be saved
- * and restored automatically, otherwise you will need to provide a custom [Saver]
- * implementation via an overload with which has `stateSaver` param.
+ * If the value inside the MutableState can be stored inside the Bundle it would be saved and
+ * restored automatically, otherwise you will need to provide a custom [Saver] implementation via an
+ * overload with which has `stateSaver` param.
  *
  * @sample androidx.compose.runtime.saveable.samples.RememberSaveableWithMutableStateAndCustomSaver
  *
  * @param inputs A set of inputs such that, when any of them have changed, will cause the state to
- * reset and [init] to be rerun
+ *   reset and [init] to be rerun
  * @param saver The [Saver] object which defines how the state is saved and restored.
  * @param key An optional key to be used as a key for the saved value. If not provided we use the
- * automatically generated by the Compose runtime which is unique for the every exact code location
- * in the composition tree
+ *   automatically generated by the Compose runtime which is unique for the every exact code
+ *   location in the composition tree
  * @param init A factory function to create the initial value of this state
  */
 @Composable
@@ -71,29 +71,25 @@
 ): T {
     val compositeKey = currentCompositeKeyHash
     // key is the one provided by the user or the one generated by the compose runtime
-    val finalKey = if (!key.isNullOrEmpty()) {
-        key
-    } else {
-        compositeKey.toString(MaxSupportedRadix)
-    }
-    @Suppress("UNCHECKED_CAST")
-    (saver as Saver<T, Any>)
+    val finalKey =
+        if (!key.isNullOrEmpty()) {
+            key
+        } else {
+            compositeKey.toString(MaxSupportedRadix)
+        }
+    @Suppress("UNCHECKED_CAST") (saver as Saver<T, Any>)
 
     val registry = LocalSaveableStateRegistry.current
 
     val holder = remember {
         // value is restored using the registry or created via [init] lambda
-        val restored = registry?.consumeRestored(finalKey)?.let {
-            saver.restore(it)
-        }
+        val restored = registry?.consumeRestored(finalKey)?.let { saver.restore(it) }
         val finalValue = restored ?: init()
         SaveableHolder(saver, registry, finalKey, finalValue, inputs)
     }
 
     val value = holder.getValueIfInputsDidntChange(inputs) ?: init()
-    SideEffect {
-        holder.update(saver, registry, finalKey, value, inputs)
-    }
+    SideEffect { holder.update(saver, registry, finalKey, value, inputs) }
 
     return value
 }
@@ -105,18 +101,18 @@
  * recreation using the saved instance state mechanism (for example it happens when the screen is
  * rotated in the Android application).
  *
- * Use this overload if you remember a mutable state with a type which can't be stored in the
- * Bundle so you have to provide a custom saver object.
+ * Use this overload if you remember a mutable state with a type which can't be stored in the Bundle
+ * so you have to provide a custom saver object.
  *
  * @sample androidx.compose.runtime.saveable.samples.RememberSaveableWithMutableStateAndCustomSaver
  *
  * @param inputs A set of inputs such that, when any of them have changed, will cause the state to
- * reset and [init] to be rerun
- * @param stateSaver The [Saver] object which defines how the value inside the MutableState is
- * saved and restored.
+ *   reset and [init] to be rerun
+ * @param stateSaver The [Saver] object which defines how the value inside the MutableState is saved
+ *   and restored.
  * @param key An optional key to be used as a key for the saved value. If not provided we use the
- * automatically generated by the Compose runtime which is unique for the every exact code location
- * in the composition tree
+ *   automatically generated by the Compose runtime which is unique for the every exact code
+ *   location in the composition tree
  * @param init A factory function to create the initial value of this state
  */
 @Composable
@@ -125,12 +121,8 @@
     stateSaver: Saver<T, out Any>,
     key: String? = null,
     init: () -> MutableState<T>
-): MutableState<T> = rememberSaveable(
-    *inputs,
-    saver = mutableStateSaver(stateSaver),
-    key = key,
-    init = init
-)
+): MutableState<T> =
+    rememberSaveable(*inputs, saver = mutableStateSaver(stateSaver), key = key, init = init)
 
 private class SaveableHolder<T>(
     private var saver: Saver<T, Any>,
@@ -140,13 +132,9 @@
     private var inputs: Array<out Any?>
 ) : SaverScope, RememberObserver {
     private var entry: SaveableStateRegistry.Entry? = null
-    /**
-     * Value provider called by the registry.
-     */
+    /** Value provider called by the registry. */
     private val valueProvider = {
-        with(saver) {
-            save(requireNotNull(value) { "Value should be initialized" })
-        }
+        with(saver) { save(requireNotNull(value) { "Value should be initialized" }) }
     }
 
     fun update(
@@ -211,39 +199,43 @@
 }
 
 @Suppress("UNCHECKED_CAST")
-private fun <T> mutableStateSaver(inner: Saver<T, out Any>) = with(inner as Saver<T, Any>) {
-    Saver<MutableState<T>, MutableState<Any?>>(
-        save = { state ->
-            require(state is SnapshotMutableState<T>) {
-                "If you use a custom MutableState implementation you have to write a custom " +
-                    "Saver and pass it as a saver param to rememberSaveable()"
-            }
-            val saved = save(state.value)
-            if (saved != null) {
-                mutableStateOf(saved, state.policy as SnapshotMutationPolicy<Any?>)
-            } else {
-                // if the inner saver returned null we need to return null as well so the
-                // user's init lambda will be used instead of restoring mutableStateOf(null)
-                null
-            }
-        },
-        restore = @Suppress("UNCHECKED_CAST", "ExceptionMessage") {
-            require(it is SnapshotMutableState<Any?>)
-            mutableStateOf(
-                if (it.value != null) restore(it.value!!) else null,
-                it.policy as SnapshotMutationPolicy<T?>
-            ) as MutableState<T>
-        }
-    )
-}
+private fun <T> mutableStateSaver(inner: Saver<T, out Any>) =
+    with(inner as Saver<T, Any>) {
+        Saver<MutableState<T>, MutableState<Any?>>(
+            save = { state ->
+                require(state is SnapshotMutableState<T>) {
+                    "If you use a custom MutableState implementation you have to write a custom " +
+                        "Saver and pass it as a saver param to rememberSaveable()"
+                }
+                val saved = save(state.value)
+                if (saved != null) {
+                    mutableStateOf(saved, state.policy as SnapshotMutationPolicy<Any?>)
+                } else {
+                    // if the inner saver returned null we need to return null as well so the
+                    // user's init lambda will be used instead of restoring mutableStateOf(null)
+                    null
+                }
+            },
+            restore =
+                @Suppress("UNCHECKED_CAST", "ExceptionMessage") {
+                    require(it is SnapshotMutableState<Any?>)
+                    mutableStateOf(
+                        if (it.value != null) restore(it.value!!) else null,
+                        it.policy as SnapshotMutationPolicy<T?>
+                    )
+                        as MutableState<T>
+                }
+        )
+    }
 
 private fun SaveableStateRegistry.requireCanBeSaved(value: Any?) {
     if (value != null && !canBeSaved(value)) {
         throw IllegalArgumentException(
             if (value is SnapshotMutableState<*>) {
-                if (value.policy !== neverEqualPolicy<Any?>() &&
-                    value.policy !== structuralEqualityPolicy<Any?>() &&
-                    value.policy !== referentialEqualityPolicy<Any?>()
+                if (
+                    value.policy !== neverEqualPolicy<Any?>() &&
+                        value.policy !== structuralEqualityPolicy<Any?>() &&
+                        value.policy !== referentialEqualityPolicy<Any?>()
                 ) {
                     "If you use a custom SnapshotMutationPolicy for your MutableState you have to" +
                         " write a custom Saver"
@@ -267,7 +259,5 @@
         ". Please consider implementing a custom Saver for this class and pass it" +
         " to rememberSaveable()."
 
-/**
- * The maximum radix available for conversion to and from strings.
- */
+/** The maximum radix available for conversion to and from strings. */
 private val MaxSupportedRadix = 36
diff --git a/compose/runtime/runtime-saveable/src/commonMain/kotlin/androidx/compose/runtime/saveable/SaveableStateHolder.kt b/compose/runtime/runtime-saveable/src/commonMain/kotlin/androidx/compose/runtime/saveable/SaveableStateHolder.kt
index 18d68e1..ac149b5 100644
--- a/compose/runtime/runtime-saveable/src/commonMain/kotlin/androidx/compose/runtime/saveable/SaveableStateHolder.kt
+++ b/compose/runtime/runtime-saveable/src/commonMain/kotlin/androidx/compose/runtime/saveable/SaveableStateHolder.kt
@@ -23,8 +23,8 @@
 import androidx.compose.runtime.remember
 
 /**
- * Allows to save the state defined with [rememberSaveable] for the subtree before disposing it
- * to make it possible to compose it back next time with the restored state. It allows different
+ * Allows to save the state defined with [rememberSaveable] for the subtree before disposing it to
+ * make it possible to compose it back next time with the restored state. It allows different
  * navigation patterns to keep the ui state like scroll position for the currently not composed
  * screens from the backstack.
  *
@@ -36,35 +36,25 @@
  */
 interface SaveableStateHolder {
     /**
-     * Put your content associated with a [key] inside the [content]. This will automatically
-     * save all the states defined with [rememberSaveable] before disposing the content and will
-     * restore the states when you compose with this key again.
+     * Put your content associated with a [key] inside the [content]. This will automatically save
+     * all the states defined with [rememberSaveable] before disposing the content and will restore
+     * the states when you compose with this key again.
      *
      * @param key to be used for saving and restoring the states for the subtree. Note that on
-     * Android you can only use types which can be stored inside the Bundle.
+     *   Android you can only use types which can be stored inside the Bundle.
      * @param content the content for which [key] is associated.
      */
-    @Composable
-    fun SaveableStateProvider(key: Any, content: @Composable () -> Unit)
+    @Composable fun SaveableStateProvider(key: Any, content: @Composable () -> Unit)
 
-    /**
-     * Removes the saved state associated with the passed [key].
-     */
+    /** Removes the saved state associated with the passed [key]. */
     fun removeState(key: Any)
 }
 
-/**
- * Creates and remembers the instance of [SaveableStateHolder].
- */
+/** Creates and remembers the instance of [SaveableStateHolder]. */
 @Composable
 fun rememberSaveableStateHolder(): SaveableStateHolder =
-    rememberSaveable(
-        saver = SaveableStateHolderImpl.Saver
-    ) {
-        SaveableStateHolderImpl()
-    }.apply {
-        parentSaveableStateRegistry = LocalSaveableStateRegistry.current
-    }
+    rememberSaveable(saver = SaveableStateHolderImpl.Saver) { SaveableStateHolderImpl() }
+        .apply { parentSaveableStateRegistry = LocalSaveableStateRegistry.current }
 
 private class SaveableStateHolderImpl(
     private val savedStates: MutableMap<Any, Map<String, List<Any?>>> = mutableMapOf()
@@ -113,13 +103,12 @@
         }
     }
 
-    inner class RegistryHolder constructor(
-        val key: Any
-    ) {
+    inner class RegistryHolder constructor(val key: Any) {
         var shouldSave = true
-        val registry: SaveableStateRegistry = SaveableStateRegistry(savedStates[key]) {
-            parentSaveableStateRegistry?.canBeSaved(it) ?: true
-        }
+        val registry: SaveableStateRegistry =
+            SaveableStateRegistry(savedStates[key]) {
+                parentSaveableStateRegistry?.canBeSaved(it) ?: true
+            }
 
         fun saveTo(map: MutableMap<Any, Map<String, List<Any?>>>) {
             if (shouldSave) {
@@ -134,9 +123,7 @@
     }
 
     companion object {
-        val Saver: Saver<SaveableStateHolderImpl, *> = Saver(
-            save = { it.saveAll() },
-            restore = { SaveableStateHolderImpl(it) }
-        )
+        val Saver: Saver<SaveableStateHolderImpl, *> =
+            Saver(save = { it.saveAll() }, restore = { SaveableStateHolderImpl(it) })
     }
 }
diff --git a/compose/runtime/runtime-saveable/src/commonMain/kotlin/androidx/compose/runtime/saveable/SaveableStateRegistry.kt b/compose/runtime/runtime-saveable/src/commonMain/kotlin/androidx/compose/runtime/saveable/SaveableStateRegistry.kt
index 0428ffe..d353689 100644
--- a/compose/runtime/runtime-saveable/src/commonMain/kotlin/androidx/compose/runtime/saveable/SaveableStateRegistry.kt
+++ b/compose/runtime/runtime-saveable/src/commonMain/kotlin/androidx/compose/runtime/saveable/SaveableStateRegistry.kt
@@ -19,13 +19,11 @@
 import androidx.compose.runtime.saveable.SaveableStateRegistry.Entry
 import androidx.compose.runtime.staticCompositionLocalOf
 
-/**
- * Allows components to save and restore their state using the saved instance state mechanism.
- */
+/** Allows components to save and restore their state using the saved instance state mechanism. */
 interface SaveableStateRegistry {
     /**
-     * Returns the restored value for the given key.
-     * Once being restored the value is cleared, so you can't restore the same key twice.
+     * Returns the restored value for the given key. Once being restored the value is cleared, so
+     * you can't restore the same key twice.
      *
      * @param key Key used to save the value
      */
@@ -34,42 +32,38 @@
     /**
      * Registers the value provider.
      *
-     * There are could be multiple providers registered for the same [key]. In this case the
-     * order in which they were registered matters.
+     * There are could be multiple providers registered for the same [key]. In this case the order
+     * in which they were registered matters.
      *
      * Say we registered two providers for the key. One provides "1", second provides "2".
-     * [performSave] in this case will have listOf("1", "2) as a value for the key in the map.
-     * And later, when the registry will be recreated with the previously saved values, the first
+     * [performSave] in this case will have listOf("1", "2) as a value for the key in the map. And
+     * later, when the registry will be recreated with the previously saved values, the first
      * execution of [consumeRestored] would consume "1" and the second one "2".
      *
      * @param key Key to use for storing the value
-     * @param valueProvider Provides the current value, to be executed when [performSave]
-     * will be triggered to collect all the registered values
+     * @param valueProvider Provides the current value, to be executed when [performSave] will be
+     *   triggered to collect all the registered values
      * @return the registry entry which you can use to unregister the provider
      */
     fun registerProvider(key: String, valueProvider: () -> Any?): Entry
 
     /**
-     * Returns true if the value can be saved using this Registry.
-     * The default implementation will return true if this value can be stored in Bundle.
+     * Returns true if the value can be saved using this Registry. The default implementation will
+     * return true if this value can be stored in Bundle.
      *
      * @param value The value which we want to save using this Registry
      */
     fun canBeSaved(value: Any): Boolean
 
     /**
-     * Executes all the registered value providers and combines these values into a map. We have
-     * a list of values for each key as it is allowed to have multiple providers for the same key.
+     * Executes all the registered value providers and combines these values into a map. We have a
+     * list of values for each key as it is allowed to have multiple providers for the same key.
      */
     fun performSave(): Map<String, List<Any?>>
 
-    /**
-     * The registry entry which you get when you use [registerProvider].
-     */
+    /** The registry entry which you get when you use [registerProvider]. */
     interface Entry {
-        /**
-         * Unregister previously registered entry.
-         */
+        /** Unregister previously registered entry. */
         fun unregister()
     }
 }
@@ -85,9 +79,7 @@
     canBeSaved: (Any) -> Boolean
 ): SaveableStateRegistry = SaveableStateRegistryImpl(restoredValues, canBeSaved)
 
-/**
- * CompositionLocal with a current [SaveableStateRegistry] instance.
- */
+/** CompositionLocal with a current [SaveableStateRegistry] instance. */
 val LocalSaveableStateRegistry = staticCompositionLocalOf<SaveableStateRegistry?> { null }
 
 // CharSequence.isBlank() allocates an iterator because it calls indices.all{}
@@ -156,13 +148,14 @@
                 // the first provider returned null(nothing to save) and the second one returned
                 // "1". when we will be restoring the first provider would restore null (it is the
                 // same as to have nothing to restore) and the second one restore "1".
-                map[key] = List(list.size) { index ->
-                    val value = list[index].invoke()
-                    if (value != null) {
-                        check(canBeSaved(value)) { generateCannotBeSavedErrorMessage(value) }
+                map[key] =
+                    List(list.size) { index ->
+                        val value = list[index].invoke()
+                        if (value != null) {
+                            check(canBeSaved(value)) { generateCannotBeSavedErrorMessage(value) }
+                        }
+                        value
                     }
-                    value
-                }
             }
         }
         return map
diff --git a/compose/runtime/runtime-saveable/src/commonMain/kotlin/androidx/compose/runtime/saveable/Saver.kt b/compose/runtime/runtime-saveable/src/commonMain/kotlin/androidx/compose/runtime/saveable/Saver.kt
index 9d98db9..25b9823 100644
--- a/compose/runtime/runtime-saveable/src/commonMain/kotlin/androidx/compose/runtime/saveable/Saver.kt
+++ b/compose/runtime/runtime-saveable/src/commonMain/kotlin/androidx/compose/runtime/saveable/Saver.kt
@@ -20,23 +20,21 @@
  * The [Saver] describes how the object of [Original] class can be simplified and converted into
  * something which is [Saveable].
  *
- * What types can be saved is defined by [SaveableStateRegistry], by default everything which can
- * be stored in the Bundle class can be saved.
- * The implementations can check that the provided value can be saved via [SaverScope.canBeSaved]
+ * What types can be saved is defined by [SaveableStateRegistry], by default everything which can be
+ * stored in the Bundle class can be saved. The implementations can check that the provided value
+ * can be saved via [SaverScope.canBeSaved]
  *
  * You can pass the implementations of this class as a parameter for [rememberSaveable].
  *
  * @sample androidx.compose.runtime.saveable.samples.CustomSaverSample
  */
 interface Saver<Original, Saveable : Any> {
-    /**
-     * Convert the value into a saveable one. If null is returned the value will not be saved.
-     */
+    /** Convert the value into a saveable one. If null is returned the value will not be saved. */
     fun SaverScope.save(value: Original): Saveable?
 
     /**
-     * Convert the restored value back to the original Class. If null is returned the value will
-     * not be restored and would be initialized again instead.
+     * Convert the restored value back to the original Class. If null is returned the value will not
+     * be restored and would be initialized again instead.
      */
     fun restore(value: Saveable): Original?
 }
@@ -45,18 +43,18 @@
  * The [Saver] describes how the object of [Original] class can be simplified and converted into
  * something which is [Saveable].
  *
- * What types can be saved is defined by [SaveableStateRegistry], by default everything which can
- * be stored in the Bundle class can be saved.
- * The implementations can check that the provided value can be saved via [SaverScope.canBeSaved]
+ * What types can be saved is defined by [SaveableStateRegistry], by default everything which can be
+ * stored in the Bundle class can be saved. The implementations can check that the provided value
+ * can be saved via [SaverScope.canBeSaved]
  *
  * You can pass the implementations of this class as a parameter for [rememberSaveable].
  *
  * @sample androidx.compose.runtime.saveable.samples.CustomSaverSample
  *
- * @param save Defines how to convert the value into a saveable one. If null is returned the
- * value will not be saved.
- * @param restore Defines how to convert the restored value back to the original Class. If null
- * is returned the value will not be restored and would be initialized again instead.
+ * @param save Defines how to convert the value into a saveable one. If null is returned the value
+ *   will not be saved.
+ * @param restore Defines how to convert the restored value back to the original Class. If null is
+ *   returned the value will not be restored and would be initialized again instead.
  */
 fun <Original, Saveable : Any> Saver(
     save: SaverScope.(value: Original) -> Saveable?,
@@ -76,8 +74,8 @@
  */
 fun interface SaverScope {
     /**
-     * What types can be saved is defined by [SaveableStateRegistry], by default everything which can
-     * be stored in the Bundle class can be saved.
+     * What types can be saved is defined by [SaveableStateRegistry], by default everything which
+     * can be stored in the Bundle class can be saved.
      */
     fun canBeSaved(value: Any): Boolean
 }
@@ -89,11 +87,6 @@
  *
  * @see Saver
  */
-fun <T> autoSaver(): Saver<T, Any> =
-    @Suppress("UNCHECKED_CAST")
-    (AutoSaver as Saver<T, Any>)
+fun <T> autoSaver(): Saver<T, Any> = @Suppress("UNCHECKED_CAST") (AutoSaver as Saver<T, Any>)
 
-private val AutoSaver = Saver<Any?, Any>(
-    save = { it },
-    restore = { it }
-)
+private val AutoSaver = Saver<Any?, Any>(save = { it }, restore = { it })
diff --git a/compose/runtime/runtime-test-utils/src/commonMain/kotlin/androidx/compose/runtime/mock/ComposeContact.kt b/compose/runtime/runtime-test-utils/src/commonMain/kotlin/androidx/compose/runtime/mock/ComposeContact.kt
index 494fc5c..a0202c6 100644
--- a/compose/runtime/runtime-test-utils/src/commonMain/kotlin/androidx/compose/runtime/mock/ComposeContact.kt
+++ b/compose/runtime/runtime-test-utils/src/commonMain/kotlin/androidx/compose/runtime/mock/ComposeContact.kt
@@ -49,23 +49,11 @@
 @Suppress("ComposableNaming")
 @Composable
 fun contacts(contacts: Collection<Contact>, selected: Contact?) {
-    Linear {
-        Repeated(of = contacts) {
-            SelectBox(it == selected) {
-                contact(it)
-            }
-        }
-    }
+    Linear { Repeated(of = contacts) { SelectBox(it == selected) { contact(it) } } }
 }
 
 fun MockViewValidator.contacts(contacts: Collection<Contact>, selected: Contact?) {
-    Linear {
-        Repeated(of = contacts) {
-            SelectBox(it == selected) {
-                contact(it)
-            }
-        }
-    }
+    Linear { Repeated(of = contacts) { SelectBox(it == selected) { contact(it) } } }
 }
 
 // <linear>
diff --git a/compose/runtime/runtime-test-utils/src/commonMain/kotlin/androidx/compose/runtime/mock/ComposePoints.kt b/compose/runtime/runtime-test-utils/src/commonMain/kotlin/androidx/compose/runtime/mock/ComposePoints.kt
index dd2aff1..03e3213 100644
--- a/compose/runtime/runtime-test-utils/src/commonMain/kotlin/androidx/compose/runtime/mock/ComposePoints.kt
+++ b/compose/runtime/runtime-test-utils/src/commonMain/kotlin/androidx/compose/runtime/mock/ComposePoints.kt
@@ -31,13 +31,9 @@
 
 @Composable
 fun Points(points: Iterable<Point>) {
-    Repeated(of = points) {
-        Point(it)
-    }
+    Repeated(of = points) { Point(it) }
 }
 
 fun MockViewValidator.Points(points: Iterable<Point>) {
-    Repeated(of = points) {
-        Point(it)
-    }
+    Repeated(of = points) { Point(it) }
 }
diff --git a/compose/runtime/runtime-test-utils/src/commonMain/kotlin/androidx/compose/runtime/mock/ComposeReport.kt b/compose/runtime/runtime-test-utils/src/commonMain/kotlin/androidx/compose/runtime/mock/ComposeReport.kt
index 24333a9..376a542 100644
--- a/compose/runtime/runtime-test-utils/src/commonMain/kotlin/androidx/compose/runtime/mock/ComposeReport.kt
+++ b/compose/runtime/runtime-test-utils/src/commonMain/kotlin/androidx/compose/runtime/mock/ComposeReport.kt
@@ -33,17 +33,9 @@
 
 @Composable
 fun ReportsReport(reports: Iterable<Report>) {
-    Linear {
-        Repeated(of = reports) { report ->
-            ReportsTo(report)
-        }
-    }
+    Linear { Repeated(of = reports) { report -> ReportsTo(report) } }
 }
 
 fun MockViewValidator.ReportsReport(reports: Iterable<Report>) {
-    Linear {
-        Repeated(of = reports) { report ->
-            ReportsTo(report)
-        }
-    }
+    Linear { Repeated(of = reports) { report -> ReportsTo(report) } }
 }
diff --git a/compose/runtime/runtime-test-utils/src/commonMain/kotlin/androidx/compose/runtime/mock/CompositionTest.kt b/compose/runtime/runtime-test-utils/src/commonMain/kotlin/androidx/compose/runtime/mock/CompositionTest.kt
index 73712a0..7102fe9 100644
--- a/compose/runtime/runtime-test-utils/src/commonMain/kotlin/androidx/compose/runtime/mock/CompositionTest.kt
+++ b/compose/runtime/runtime-test-utils/src/commonMain/kotlin/androidx/compose/runtime/mock/CompositionTest.kt
@@ -44,61 +44,63 @@
         testScheduler.runCurrent()
 
         // Create a test scope for the test using the test scope passed in by runTest
-        val scope = object : CompositionTestScope, CoroutineScope by this@runTest {
-            var composed = false
-            override var composition: Composition? = null
+        val scope =
+            object : CompositionTestScope, CoroutineScope by this@runTest {
+                var composed = false
+                override var composition: Composition? = null
 
-            override lateinit var root: View
+                override lateinit var root: View
 
-            override val testCoroutineScheduler: TestCoroutineScheduler
-                get() = this@runTest.testScheduler
+                override val testCoroutineScheduler: TestCoroutineScheduler
+                    get() = this@runTest.testScheduler
 
-            override fun compose(block: @Composable () -> Unit) {
-                check(!composed) { "Compose should only be called once" }
-                composed = true
-                root = View().apply { name = "root" }
-                val composition = Composition(ViewApplier(root), recomposer)
-                this.composition = composition
-                composition.setContent(block)
-            }
-
-            @OptIn(ExperimentalComposeRuntimeApi::class)
-            override fun compose(
-                observer: CompositionObserver,
-                block: @Composable () -> Unit
-            ): CompositionObserverHandle? {
-                check(!composed) { "Compose should only be called once" }
-                composed = true
-                root = View().apply { name = "root" }
-                val composition = Composition(ViewApplier(root), recomposer)
-                val result = composition.observe(observer)
-                this.composition = composition
-                composition.setContent(block)
-                return result
-            }
-
-            override fun advanceCount(ignorePendingWork: Boolean): Long {
-                val changeCount = recomposer.changeCount
-                Snapshot.sendApplyNotifications()
-                if (recomposer.hasPendingWork) {
-                    advanceTimeBy(5_000)
-                    check(ignorePendingWork || !recomposer.hasPendingWork) {
-                        "Potentially infinite recomposition, still recomposing after advancing"
-                    }
+                override fun compose(block: @Composable () -> Unit) {
+                    check(!composed) { "Compose should only be called once" }
+                    composed = true
+                    root = View().apply { name = "root" }
+                    val composition = Composition(ViewApplier(root), recomposer)
+                    this.composition = composition
+                    composition.setContent(block)
                 }
-                return recomposer.changeCount - changeCount
+
+                @OptIn(ExperimentalComposeRuntimeApi::class)
+                override fun compose(
+                    observer: CompositionObserver,
+                    block: @Composable () -> Unit
+                ): CompositionObserverHandle? {
+                    check(!composed) { "Compose should only be called once" }
+                    composed = true
+                    root = View().apply { name = "root" }
+                    val composition = Composition(ViewApplier(root), recomposer)
+                    val result = composition.observe(observer)
+                    this.composition = composition
+                    composition.setContent(block)
+                    return result
+                }
+
+                override fun advanceCount(ignorePendingWork: Boolean): Long {
+                    val changeCount = recomposer.changeCount
+                    Snapshot.sendApplyNotifications()
+                    if (recomposer.hasPendingWork) {
+                        advanceTimeBy(5_000)
+                        check(ignorePendingWork || !recomposer.hasPendingWork) {
+                            "Potentially infinite recomposition, still recomposing after advancing"
+                        }
+                    }
+                    return recomposer.changeCount - changeCount
+                }
+
+                override fun advanceTimeBy(amount: Long) = testScheduler.advanceTimeBy(amount)
+
+                override fun advance(ignorePendingWork: Boolean) =
+                    advanceCount(ignorePendingWork) != 0L
+
+                override fun verifyConsistent() {
+                    (composition as? ControlledComposition)?.verifyConsistent()
+                }
+
+                override var validator: (MockViewValidator.() -> Unit)? = null
             }
-
-            override fun advanceTimeBy(amount: Long) = testScheduler.advanceTimeBy(amount)
-
-            override fun advance(ignorePendingWork: Boolean) = advanceCount(ignorePendingWork) != 0L
-
-            override fun verifyConsistent() {
-                (composition as? ControlledComposition)?.verifyConsistent()
-            }
-
-            override var validator: (MockViewValidator.() -> Unit)? = null
-        }
         scope.block()
         scope.composition?.dispose()
         recomposer.cancel()
@@ -106,26 +108,17 @@
     }
 }
 
-/**
- * A test scope used in tests that allows controlling and testing composition.
- */
+/** A test scope used in tests that allows controlling and testing composition. */
 @OptIn(ExperimentalCoroutinesApi::class)
 interface CompositionTestScope : CoroutineScope {
 
-    /**
-     * A scheduler used by [CoroutineScope]
-     */
+    /** A scheduler used by [CoroutineScope] */
     val testCoroutineScheduler: TestCoroutineScheduler
 
-    /**
-     * Compose a block using the mock view composer.
-     */
+    /** Compose a block using the mock view composer. */
     fun compose(block: @Composable () -> Unit)
 
-    /**
-     * Compose a block observed using the mock view composer.
-     */
-
+    /** Compose a block observed using the mock view composer. */
     @OptIn(ExperimentalComposeRuntimeApi::class)
     fun compose(
         observer: CompositionObserver,
@@ -133,72 +126,45 @@
     ): CompositionObserverHandle?
 
     /**
-     * Advance the state which executes any pending compositions, if any. Returns true if
-     * advancing resulted in changes being applied.
+     * Advance the state which executes any pending compositions, if any. Returns true if advancing
+     * resulted in changes being applied.
      */
     fun advance(ignorePendingWork: Boolean = false): Boolean
 
-    /**
-     * Advance counting the number of time the recomposer ran.
-     */
+    /** Advance counting the number of time the recomposer ran. */
     fun advanceCount(ignorePendingWork: Boolean = false): Long
 
-    /**
-     * Advance the clock by [amount] ms
-     */
+    /** Advance the clock by [amount] ms */
     fun advanceTimeBy(amount: Long)
 
-    /**
-     * Verify the composition is well-formed.
-     */
+    /** Verify the composition is well-formed. */
     fun verifyConsistent()
 
-    /**
-     * The root mock view of the mock views being composed.
-     */
+    /** The root mock view of the mock views being composed. */
     val root: View
 
-    /**
-     * The last validator used.
-     */
+    /** The last validator used. */
     var validator: (MockViewValidator.() -> Unit)?
 
-    /**
-     * Access to the composition created for the call to [compose]
-     */
+    /** Access to the composition created for the call to [compose] */
     val composition: Composition?
 }
 
-/**
- * Create a mock view validator and validate the view.
- */
+/** Create a mock view validator and validate the view. */
 fun CompositionTestScope.validate(block: MockViewValidator.() -> Unit) =
     MockViewListValidator(root.children).validate(block).also { validator = block }
 
-/**
- * Revalidate using the last validator
- */
-fun CompositionTestScope.revalidate() =
-    validate(validator ?: error("validate was not called"))
+/** Revalidate using the last validator */
+fun CompositionTestScope.revalidate() = validate(validator ?: error("validate was not called"))
 
-/**
- * Advance and expect changes
- */
+/** Advance and expect changes */
 fun CompositionTestScope.expectChanges() {
     val changes = advance()
-    assertTrue(
-        actual = changes,
-        message = "Expected changes but none were found"
-    )
+    assertTrue(actual = changes, message = "Expected changes but none were found")
 }
 
-/**
- * Advance and expect no changes
- */
+/** Advance and expect no changes */
 fun CompositionTestScope.expectNoChanges() {
     val changes = advance()
-    assertFalse(
-        actual = changes,
-        message = "Expected no changes but changes occurred"
-    )
+    assertFalse(actual = changes, message = "Expected no changes but changes occurred")
 }
diff --git a/compose/runtime/runtime-test-utils/src/commonMain/kotlin/androidx/compose/runtime/mock/ContactModel.kt b/compose/runtime/runtime-test-utils/src/commonMain/kotlin/androidx/compose/runtime/mock/ContactModel.kt
index 2e2bbf3..7f6b712 100644
--- a/compose/runtime/runtime-test-utils/src/commonMain/kotlin/androidx/compose/runtime/mock/ContactModel.kt
+++ b/compose/runtime/runtime-test-utils/src/commonMain/kotlin/androidx/compose/runtime/mock/ContactModel.kt
@@ -21,7 +21,8 @@
     var contacts: List<Contact>,
     var selected: Contact? = null
 ) {
-    val filtered get() = contacts.filter { it.name.contains(filter) }
+    val filtered
+        get() = contacts.filter { it.name.contains(filter) }
 
     fun add(contact: Contact, after: Contact? = null) {
         val retList = mutableListOf<Contact>().apply { addAll(contacts) }
diff --git a/compose/runtime/runtime-test-utils/src/commonMain/kotlin/androidx/compose/runtime/mock/EmptyApplier.kt b/compose/runtime/runtime-test-utils/src/commonMain/kotlin/androidx/compose/runtime/mock/EmptyApplier.kt
index 81cd8ee..a9adfc5 100644
--- a/compose/runtime/runtime-test-utils/src/commonMain/kotlin/androidx/compose/runtime/mock/EmptyApplier.kt
+++ b/compose/runtime/runtime-test-utils/src/commonMain/kotlin/androidx/compose/runtime/mock/EmptyApplier.kt
@@ -20,19 +20,26 @@
 
 class EmptyApplier : Applier<Unit> {
     override val current: Unit = Unit
+
     override fun down(node: Unit) {}
+
     override fun up() {}
+
     override fun insertTopDown(index: Int, instance: Unit) {
         error("Unexpected")
     }
+
     override fun insertBottomUp(index: Int, instance: Unit) {
         error("Unexpected")
     }
+
     override fun remove(index: Int, count: Int) {
         error("Unexpected")
     }
+
     override fun move(from: Int, to: Int, count: Int) {
         error("Unexpected")
     }
+
     override fun clear() {}
 }
diff --git a/compose/runtime/runtime-test-utils/src/commonMain/kotlin/androidx/compose/runtime/mock/MockViewValidator.kt b/compose/runtime/runtime-test-utils/src/commonMain/kotlin/androidx/compose/runtime/mock/MockViewValidator.kt
index 95eee27..17f4ff6 100644
--- a/compose/runtime/runtime-test-utils/src/commonMain/kotlin/androidx/compose/runtime/mock/MockViewValidator.kt
+++ b/compose/runtime/runtime-test-utils/src/commonMain/kotlin/androidx/compose/runtime/mock/MockViewValidator.kt
@@ -21,11 +21,11 @@
 
 interface MockViewValidator {
     val view: View
+
     fun next(): Boolean
 }
 
-class MockViewListValidator(private val views: List<View>) :
-    MockViewValidator {
+class MockViewListValidator(private val views: List<View>) : MockViewValidator {
     override lateinit var view: View
 
     override fun next(): Boolean {
@@ -76,14 +76,19 @@
 }
 
 fun MockViewValidator.Linear() = view("linear", null)
+
 fun MockViewValidator.Linear(block: MockViewValidator.() -> Unit) = view("linear", block)
+
 inline fun MockViewValidator.InlineLinear(block: MockViewValidator.() -> Unit) =
     inlineView("linear", block)
+
 fun MockViewValidator.box(block: MockViewValidator.() -> Unit) = view("box", block)
+
 fun MockViewValidator.Text(value: String) {
     view("text")
     assertEquals(value, view.attributes["text"])
 }
+
 fun MockViewValidator.Edit(value: String) {
     view("edit")
     assertEquals(value, view.attributes["value"])
diff --git a/compose/runtime/runtime-test-utils/src/commonMain/kotlin/androidx/compose/runtime/mock/TestMonotonicFrameClock.kt b/compose/runtime/runtime-test-utils/src/commonMain/kotlin/androidx/compose/runtime/mock/TestMonotonicFrameClock.kt
index c106287..23fb7cb 100644
--- a/compose/runtime/runtime-test-utils/src/commonMain/kotlin/androidx/compose/runtime/mock/TestMonotonicFrameClock.kt
+++ b/compose/runtime/runtime-test-utils/src/commonMain/kotlin/androidx/compose/runtime/mock/TestMonotonicFrameClock.kt
@@ -32,9 +32,9 @@
 private const val DefaultFrameDelay = 16_000_000L
 
 /**
- * Construct a [TestMonotonicFrameClock] for [coroutineScope], obtaining the [TestCoroutineScheduler]
- * from the scope's [context][CoroutineScope.coroutineContext]. This frame clock may be used to
- * consistently drive time under controlled tests.
+ * Construct a [TestMonotonicFrameClock] for [coroutineScope], obtaining the
+ * [TestCoroutineScheduler] from the scope's [context][CoroutineScope.coroutineContext]. This frame
+ * clock may be used to consistently drive time under controlled tests.
  *
  * Calls to [TestMonotonicFrameClock.withFrameNanos] will schedule an upcoming frame
  * [frameDelayNanos] nanoseconds in the future by launching into [coroutineScope] if such a frame
@@ -45,24 +45,25 @@
 fun TestMonotonicFrameClock(
     coroutineScope: CoroutineScope,
     frameDelayNanos: Long = DefaultFrameDelay
-): TestMonotonicFrameClock = TestMonotonicFrameClock(
-    coroutineScope = coroutineScope,
-    testCoroutineScheduler =
-    requireNotNull(coroutineScope.coroutineContext[TestCoroutineScheduler]) {
-        "coroutuineScope should have TestCoroutineScheduler"
-    },
-    frameDelayNanos = frameDelayNanos
-)
+): TestMonotonicFrameClock =
+    TestMonotonicFrameClock(
+        coroutineScope = coroutineScope,
+        testCoroutineScheduler =
+            requireNotNull(coroutineScope.coroutineContext[TestCoroutineScheduler]) {
+                "coroutuineScope should have TestCoroutineScheduler"
+            },
+        frameDelayNanos = frameDelayNanos
+    )
 
 /**
  * A [MonotonicFrameClock] with a time source controlled by a `kotlinx-coroutines-test`
- * [TestCoroutineScheduler]. This frame clock may be used to consistently drive time under controlled
- * tests.
+ * [TestCoroutineScheduler]. This frame clock may be used to consistently drive time under
+ * controlled tests.
  *
  * Calls to [withFrameNanos] will schedule an upcoming frame [frameDelayNanos] nanoseconds in the
- * future by launching into [coroutineScope] if such a frame has not yet been scheduled. The
- * current frame time for [withFrameNanos] is provided by [TestCoroutineScheduler]. It is strongly
- * suggested that [coroutineScope] contain the test dispatcher controlled by [TestCoroutineScheduler].
+ * future by launching into [coroutineScope] if such a frame has not yet been scheduled. The current
+ * frame time for [withFrameNanos] is provided by [TestCoroutineScheduler]. It is strongly suggested
+ * that [coroutineScope] contain the test dispatcher controlled by [TestCoroutineScheduler].
  */
 @ExperimentalCoroutinesApi
 class TestMonotonicFrameClock(
@@ -112,9 +113,7 @@
     }
 }
 
-/**
- * The frame delay time for the [TestMonotonicFrameClock] in milliseconds.
- */
+/** The frame delay time for the [TestMonotonicFrameClock] in milliseconds. */
 @ExperimentalCoroutinesApi
 val TestMonotonicFrameClock.frameDelayMillis: Long
     get() = frameDelayNanos / 1_000_000
diff --git a/compose/runtime/runtime-test-utils/src/commonMain/kotlin/androidx/compose/runtime/mock/View.kt b/compose/runtime/runtime-test-utils/src/commonMain/kotlin/androidx/compose/runtime/mock/View.kt
index 3a1a247..91ae2f0 100644
--- a/compose/runtime/runtime-test-utils/src/commonMain/kotlin/androidx/compose/runtime/mock/View.kt
+++ b/compose/runtime/runtime-test-utils/src/commonMain/kotlin/androidx/compose/runtime/mock/View.kt
@@ -24,7 +24,7 @@
 
 @Stable
 interface Modifier {
-    companion object : Modifier { }
+    companion object : Modifier {}
 }
 
 open class View {
@@ -91,7 +91,9 @@
         children.clear()
     }
 
-    fun attribute(name: String, value: Any) { attributes[name] = value }
+    fun attribute(name: String, value: Any) {
+        attributes[name] = value
+    }
 
     var value: String?
         get() = attributes["value"] as? String
@@ -113,25 +115,30 @@
             }
         }
 
-    private val attributesAsString get() =
-        if (attributes.isEmpty()) ""
-        else attributes.map { " ${it.key}='${it.value}'" }.joinToString()
-    private val childrenAsString: String get() =
-        children.map { it.toString() }.joinToString(" ")
+    private val attributesAsString
+        get() =
+            if (attributes.isEmpty()) ""
+            else attributes.map { " ${it.key}='${it.value}'" }.joinToString()
+
+    private val childrenAsString: String
+        get() = children.map { it.toString() }.joinToString(" ")
 
     override fun toString() =
-            if (children.isEmpty()) "<$name$attributesAsString>" else
-            "<$name$attributesAsString>$childrenAsString</$name>"
+        if (children.isEmpty()) "<$name$attributesAsString>"
+        else "<$name$attributesAsString>$childrenAsString</$name>"
 
-    fun toFmtString() = StringBuilder().let {
-        render(0, it)
-        it.toString()
-    }
+    fun toFmtString() =
+        StringBuilder().let {
+            render(0, it)
+            it.toString()
+        }
 
     private fun findFirstOrNull(predicate: (view: View) -> Boolean): View? {
         if (predicate(this)) return this
         for (child in children) {
-            child.findFirstOrNull(predicate)?.let { return it }
+            child.findFirstOrNull(predicate)?.let {
+                return it
+            }
         }
         return null
     }
@@ -139,4 +146,5 @@
     fun findFirst(predicate: (view: View) -> Boolean) =
         findFirstOrNull(predicate) ?: error("View not found")
 }
+
 fun View.flatten(): List<View> = listOf(this) + children.flatMap { it.flatten() }
diff --git a/compose/runtime/runtime-test-utils/src/commonMain/kotlin/androidx/compose/runtime/mock/Views.kt b/compose/runtime/runtime-test-utils/src/commonMain/kotlin/androidx/compose/runtime/mock/Views.kt
index 9afeeef..0e49640 100644
--- a/compose/runtime/runtime-test-utils/src/commonMain/kotlin/androidx/compose/runtime/mock/Views.kt
+++ b/compose/runtime/runtime-test-utils/src/commonMain/kotlin/androidx/compose/runtime/mock/Views.kt
@@ -26,14 +26,9 @@
 import androidx.compose.runtime.rememberUpdatedState
 
 @Composable
-fun <T : Any> Repeated(
-    of: Iterable<T>,
-    block: @Composable (value: T) -> Unit
-) {
+fun <T : Any> Repeated(of: Iterable<T>, block: @Composable (value: T) -> Unit) {
     for (value in of) {
-        key(value) {
-            block(value)
-        }
+        key(value) { block(value) }
     }
 }
 
@@ -41,7 +36,7 @@
 fun Linear(content: @Composable () -> Unit) {
     ReusableComposeNode<View, ViewApplier>(
         factory = { View().also { it.name = "linear" } },
-        update = { }
+        update = {}
     ) {
         content()
     }
@@ -51,7 +46,7 @@
 inline fun InlineLinear(content: @Composable () -> Unit) {
     ReusableComposeNode<View, ViewApplier>(
         factory = { View().also { it.name = "linear" } },
-        update = { }
+        update = {}
     ) {
         content()
     }
@@ -88,9 +83,7 @@
                 }
             }
         },
-        update = {
-            set(onSet) { onSet() }
-        },
+        update = { set(onSet) { onSet() } },
     ) {
         content()
     }
@@ -98,15 +91,13 @@
 
 @Composable
 fun NonReusableLinear(content: @Composable () -> Unit) {
-    ComposeNode<View, ViewApplier>(
-        factory = { View().also { it.name = "linear" } },
-        update = { }
-    ) {
+    ComposeNode<View, ViewApplier>(factory = { View().also { it.name = "linear" } }, update = {}) {
         content()
     }
 }
 
-@Composable @NonRestartableComposable
+@Composable
+@NonRestartableComposable
 fun Text(value: String) {
     ReusableComposeNode<View, ViewApplier>(
         factory = { View().also { it.name = "text" } },
@@ -131,14 +122,11 @@
 }
 
 @Composable
-fun SelectBox(
-    selected: Boolean,
-    content: @Composable () -> Unit
-) {
+fun SelectBox(selected: Boolean, content: @Composable () -> Unit) {
     if (selected) {
         ReusableComposeNode<View, ViewApplier>(
             factory = { View().also { it.name = "box" } },
-            update = { },
+            update = {},
             content = { content() }
         )
     } else {
diff --git a/compose/runtime/runtime-tracing/src/main/java/androidx/compose/runtime/tracing/ComposeTracingInitializer.kt b/compose/runtime/runtime-tracing/src/main/java/androidx/compose/runtime/tracing/ComposeTracingInitializer.kt
index c34f3f0..3586871 100644
--- a/compose/runtime/runtime-tracing/src/main/java/androidx/compose/runtime/tracing/ComposeTracingInitializer.kt
+++ b/compose/runtime/runtime-tracing/src/main/java/androidx/compose/runtime/tracing/ComposeTracingInitializer.kt
@@ -24,20 +24,22 @@
 import androidx.tracing.perfetto.PerfettoSdkTrace
 
 /**
- * Configures Perfetto SDK tracing in the app allowing for capturing Compose specific
- * information (e.g. Composable function names) in a Perfetto SDK trace
+ * Configures Perfetto SDK tracing in the app allowing for capturing Compose specific information
+ * (e.g. Composable function names) in a Perfetto SDK trace
  */
 @OptIn(InternalComposeTracingApi::class)
 class ComposeTracingInitializer : Initializer<Unit> {
     override fun create(context: Context) {
-        Composer.setTracer(object : CompositionTracer {
-            override fun traceEventStart(key: Int, dirty1: Int, dirty2: Int, info: String) =
-                PerfettoSdkTrace.beginSection(info)
+        Composer.setTracer(
+            object : CompositionTracer {
+                override fun traceEventStart(key: Int, dirty1: Int, dirty2: Int, info: String) =
+                    PerfettoSdkTrace.beginSection(info)
 
-            override fun traceEventEnd() = PerfettoSdkTrace.endSection()
+                override fun traceEventEnd() = PerfettoSdkTrace.endSection()
 
-            override fun isTraceInProgress(): Boolean = PerfettoSdkTrace.isEnabled
-        })
+                override fun isTraceInProgress(): Boolean = PerfettoSdkTrace.isEnabled
+            }
+        )
     }
 
     override fun dependencies(): List<Class<out Initializer<*>>> = emptyList()
diff --git a/compose/runtime/runtime/compose-runtime-benchmark/src/androidTest/java/androidx/compose/runtime/benchmark/ComposeBenchmark.kt b/compose/runtime/runtime/compose-runtime-benchmark/src/androidTest/java/androidx/compose/runtime/benchmark/ComposeBenchmark.kt
index 522b894..7335b2c 100644
--- a/compose/runtime/runtime/compose-runtime-benchmark/src/androidTest/java/androidx/compose/runtime/benchmark/ComposeBenchmark.kt
+++ b/compose/runtime/runtime/compose-runtime-benchmark/src/androidTest/java/androidx/compose/runtime/benchmark/ComposeBenchmark.kt
@@ -52,27 +52,21 @@
     @Test
     fun benchmark_01_Compose_OneRect() = runBlockingTestWithFrameClock {
         val model = ColorModel()
-        measureCompose {
-            OneRect(model)
-        }
+        measureCompose { OneRect(model) }
     }
 
     @UiThreadTest
     @Test
     fun benchmark_02_Compose_TenRects() = runBlockingTestWithFrameClock {
         val model = ColorModel()
-        measureCompose {
-            TenRects(model)
-        }
+        measureCompose { TenRects(model) }
     }
 
     @UiThreadTest
     @Test
     fun benchmark_03_Compose_100Rects() = runBlockingTestWithFrameClock {
         val model = ColorModel()
-        measureCompose {
-            HundredRects(model = model)
-        }
+        measureCompose { HundredRects(model = model) }
     }
 
     @UiThreadTest
@@ -80,12 +74,8 @@
     fun benchmark_04_Recompose_OneRect() = runBlockingTestWithFrameClock {
         val model = ColorModel()
         measureRecomposeSuspending {
-            compose {
-                OneRect(model)
-            }
-            update {
-                model.toggle()
-            }
+            compose { OneRect(model) }
+            update { model.toggle() }
         }
     }
 
@@ -94,12 +84,8 @@
     fun benchmark_04_Recompose_OneRect_WithRecomposer() = runBlockingTestWithFrameClock {
         val model = ColorModel()
         measureRecomposeSuspending {
-            compose {
-                OneRect(model)
-            }
-            update {
-                model.toggle()
-            }
+            compose { OneRect(model) }
+            update { model.toggle() }
         }
     }
 
@@ -108,12 +94,8 @@
     fun benchmark_05_Recompose_TenRect_Wide() = runBlockingTestWithFrameClock {
         val model = ColorModel()
         measureRecomposeSuspending {
-            compose {
-                TenRects(model, narrow = false)
-            }
-            update {
-                model.toggle()
-            }
+            compose { TenRects(model, narrow = false) }
+            update { model.toggle() }
         }
     }
 
@@ -122,12 +104,8 @@
     fun benchmark_06_Recompose_TenRect_Narrow() = runBlockingTestWithFrameClock {
         val model = ColorModel()
         measureRecomposeSuspending {
-            compose {
-                TenRects(model, narrow = true)
-            }
-            update {
-                model.toggle()
-            }
+            compose { TenRects(model, narrow = true) }
+            update { model.toggle() }
         }
     }
 
@@ -136,12 +114,8 @@
     fun benchmark_07_Recompose_100Rect_Wide() = runBlockingTestWithFrameClock {
         val model = ColorModel()
         measureRecomposeSuspending {
-            compose {
-                HundredRects(model, narrow = false)
-            }
-            update {
-                model.toggle()
-            }
+            compose { HundredRects(model, narrow = false) }
+            update { model.toggle() }
         }
     }
 
@@ -150,12 +124,8 @@
     fun benchmark_08_Recompose_100Rect_Narrow() = runBlockingTestWithFrameClock {
         val model = ColorModel()
         measureRecomposeSuspending {
-            compose {
-                HundredRects(model, narrow = true)
-            }
-            update {
-                model.toggle()
-            }
+            compose { HundredRects(model, narrow = true) }
+            update { model.toggle() }
         }
     }
 
@@ -163,23 +133,11 @@
     @Test
     fun benchmark_10_NestedRowColumnsWithModifier() = runBlockingTestWithFrameClock {
         var pad by mutableStateOf(0)
-        val modifier = Modifier.composed {
-            Modifier.padding(pad.dp)
-        }
+        val modifier = Modifier.composed { Modifier.padding(pad.dp) }
         measureRecomposeSuspending {
-            compose {
-                Column(modifier = modifier) {
-                    repeat(100) {
-                        Text("Some text")
-                    }
-                }
-            }
-            update {
-                pad = 10
-            }
-            reset {
-                pad = 0
-            }
+            compose { Column(modifier = modifier) { repeat(100) { Text("Some text") } } }
+            update { pad = 10 }
+            reset { pad = 0 }
         }
     }
 
@@ -189,9 +147,7 @@
         val state1 by mutableStateOf(1)
         val state2 by mutableStateOf(3)
         val state3 by mutableStateOf(6)
-        val list by derivedStateOf {
-            List(state1 + state2 + state3) { "$it" }
-        }
+        val list by derivedStateOf { List(state1 + state2 + state3) { "$it" } }
 
         measureCompose {
             Column {
@@ -208,9 +164,7 @@
         var state1 by mutableStateOf(1)
         var state2 by mutableStateOf(3)
         val state3 by mutableStateOf(6)
-        val list by derivedStateOf {
-            List(state1 + state2 + state3) { "$it" }
-        }
+        val list by derivedStateOf { List(state1 + state2 + state3) { "$it" } }
 
         measureRecomposeSuspending {
             compose {
@@ -220,68 +174,73 @@
                     }
                 }
             }
-            update {
-                state1 += 1
-            }
-            reset {
-                state1 = 1
-            }
+            update { state1 += 1 }
+            reset { state1 = 1 }
         }
     }
 
     @UiThreadTest
     @Test
     fun benchmark_reverse_list() = runBlockingTestWithFrameClock {
-        val state = mutableStateListOf(
-            1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20
-        )
+        val state =
+            mutableStateListOf(
+                1,
+                2,
+                3,
+                4,
+                5,
+                6,
+                7,
+                8,
+                9,
+                10,
+                11,
+                12,
+                13,
+                14,
+                15,
+                16,
+                17,
+                18,
+                19,
+                20
+            )
 
         measureRecomposeSuspending {
             compose {
                 Column {
                     for (value in state) {
-                        key(value) {
-                            Text(value.toString())
-                        }
+                        key(value) { Text(value.toString()) }
                     }
                 }
             }
-            update {
-                state.reverse()
-            }
-            reset {
-                state.reverse()
-            }
+            update { state.reverse() }
+            reset { state.reverse() }
         }
     }
 
     @UiThreadTest
     @Test
     fun benchmark_f_compose_Rect_1() = runBlockingTestWithFrameClock {
-        measureComposeFocused {
-            Rect()
-        }
+        measureComposeFocused { Rect() }
     }
 
     @UiThreadTest
     @Test
     fun benchmark_f_compose_Rect_10() = runBlockingTestWithFrameClock {
-        measureComposeFocused {
-            repeat(10) { Rect() }
-        }
+        measureComposeFocused { repeat(10) { Rect() } }
     }
 
     @UiThreadTest
     @Test
     fun benchmark_f_compose_Rect_100() = runBlockingTestWithFrameClock {
-        measureComposeFocused {
-            repeat(100) { Rect() }
-        }
+        measureComposeFocused { repeat(100) { Rect() } }
     }
 }
 
 class ColorModel(color: Color = Color.Black) {
     var color: Color by mutableStateOf(color)
+
     fun toggle() {
         color = if (color == Color.Black) Color.Red else Color.Black
     }
@@ -291,15 +250,13 @@
 
 @Composable
 private fun Rect() {
-    Column(defaultModifier) { }
+    Column(defaultModifier) {}
 }
 
 @Composable
 private fun Rect(color: Color) {
-    val modifier = remember(color) {
-        Modifier.background(color)
-    }
-    Column(modifier) { }
+    val modifier = remember(color) { Modifier.background(color) }
+    Column(modifier) {}
 }
 
 @Composable
@@ -312,15 +269,11 @@
 @Composable
 fun TenRects(model: ColorModel, narrow: Boolean = false) {
     if (narrow) {
-        Observe {
-            Rect(model.color)
-        }
+        Observe { Rect(model.color) }
     } else {
         Rect(model.color)
     }
-    repeat(9) {
-        Rect()
-    }
+    repeat(9) { Rect() }
 }
 
 @Composable
@@ -328,12 +281,10 @@
     repeat(100) {
         if (it % 10 == 0)
             if (narrow) {
-                Observe {
-                    Rect(model.color)
-                }
+                Observe { Rect(model.color) }
             } else {
                 Rect(model.color)
-            } else
-            Rect()
+            }
+        else Rect()
     }
 }
diff --git a/compose/runtime/runtime/compose-runtime-benchmark/src/androidTest/java/androidx/compose/runtime/benchmark/ComposeBenchmarkBase.kt b/compose/runtime/runtime/compose-runtime-benchmark/src/androidTest/java/androidx/compose/runtime/benchmark/ComposeBenchmarkBase.kt
index 04cc84a..1e40fdb 100644
--- a/compose/runtime/runtime/compose-runtime-benchmark/src/androidTest/java/androidx/compose/runtime/benchmark/ComposeBenchmarkBase.kt
+++ b/compose/runtime/runtime/compose-runtime-benchmark/src/androidTest/java/androidx/compose/runtime/benchmark/ComposeBenchmarkBase.kt
@@ -75,44 +75,42 @@
     val data = currentComposer.compositionData
     currentComposer.disableSourceInformation()
     CompositionLocalProvider(LocalInspectionTables provides compositionTables, content = content)
-    SideEffect {
-        compositionTables?.let {
-            countGroupsAndSlots(data, it)
-        }
-    }
+    SideEffect { compositionTables?.let { countGroupsAndSlots(data, it) } }
 }
 
 @OptIn(ExperimentalBenchmarkConfigApi::class)
 abstract class ComposeBenchmarkBase {
     @get:Rule
-    val benchmarkRule = BenchmarkRule(
-        MicrobenchmarkConfig(
-            metrics = listOf(
-                TimeCapture(),
-                object : MetricCapture(listOf(GROUP_METRIC_NAME, SLOT_METRIC_NAME)) {
-                    override fun captureStart(timeNs: Long) {
-                        compositionTables = mutableSetOf()
-                        groupsCount = 0
-                        slotsCount = 0
-                    }
+    val benchmarkRule =
+        BenchmarkRule(
+            MicrobenchmarkConfig(
+                metrics =
+                    listOf(
+                        TimeCapture(),
+                        object : MetricCapture(listOf(GROUP_METRIC_NAME, SLOT_METRIC_NAME)) {
+                            override fun captureStart(timeNs: Long) {
+                                compositionTables = mutableSetOf()
+                                groupsCount = 0
+                                slotsCount = 0
+                            }
 
-                    override fun captureStop(timeNs: Long, output: LongArray, offset: Int) {
-                        output[offset + GROUP_METRIC_INDEX] = groupsCount
-                        output[offset + SLOT_METRIC_INDEX] = slotsCount
-                        compositionTables = null
-                    }
+                            override fun captureStop(timeNs: Long, output: LongArray, offset: Int) {
+                                output[offset + GROUP_METRIC_INDEX] = groupsCount
+                                output[offset + SLOT_METRIC_INDEX] = slotsCount
+                                compositionTables = null
+                            }
 
-                    override fun capturePaused() {
-                        // Unsupported for now
-                    }
+                            override fun capturePaused() {
+                                // Unsupported for now
+                            }
 
-                    override fun captureResumed() {
-                        // Unsupported for now
-                    }
-                }
-            ),
+                            override fun captureResumed() {
+                                // Unsupported for now
+                            }
+                        }
+                    ),
+            )
         )
-    )
 
     @Suppress("DEPRECATION")
     @get:Rule
@@ -131,9 +129,7 @@
 
         try {
             benchmarkRule.measureRepeatedSuspendable {
-                activity.setContent(recomposer) {
-                    CountGroupsAndSlots(block)
-                }
+                activity.setContent(recomposer) { CountGroupsAndSlots(block) }
 
                 runWithTimingDisabled {
                     activity.setContentView(emptyView)
@@ -184,48 +180,42 @@
 
     @ExperimentalCoroutinesApi
     @ExperimentalTestApi
-    suspend fun TestScope.measureRecomposeSuspending(
-        block: RecomposeReceiver.() -> Unit
-    ) = coroutineScope {
-        val receiver = RecomposeReceiver()
-        receiver.block()
+    suspend fun TestScope.measureRecomposeSuspending(block: RecomposeReceiver.() -> Unit) =
+        coroutineScope {
+            val receiver = RecomposeReceiver()
+            receiver.block()
 
-        val activity = activityRule.activity
-        val emptyView = View(activity)
+            val activity = activityRule.activity
+            val emptyView = View(activity)
 
-        val recomposer = Recomposer(coroutineContext)
-        launch { recomposer.runRecomposeAndApplyChanges() }
+            val recomposer = Recomposer(coroutineContext)
+            launch { recomposer.runRecomposeAndApplyChanges() }
 
-        activity.setContent(recomposer) {
-            CountGroupsAndSlots(receiver.composeCb)
-        }
+            activity.setContent(recomposer) { CountGroupsAndSlots(receiver.composeCb) }
 
-        var iterations = 0
-        benchmarkRule.measureRepeatedSuspendable {
-            runWithTimingDisabled {
-                receiver.updateModelCb()
-                Snapshot.sendApplyNotifications()
-            }
-            assertTrue(
-                "recomposer does not have invalidations for frame",
-                recomposer.hasPendingWork
-            )
-            testScheduler.advanceUntilIdle()
-            assertFalse(
-                "recomposer has invalidations for frame",
-                recomposer.hasPendingWork
-            )
-            runWithTimingDisabled {
-                receiver.resetCb()
-                Snapshot.sendApplyNotifications()
+            var iterations = 0
+            benchmarkRule.measureRepeatedSuspendable {
+                runWithTimingDisabled {
+                    receiver.updateModelCb()
+                    Snapshot.sendApplyNotifications()
+                }
+                assertTrue(
+                    "recomposer does not have invalidations for frame",
+                    recomposer.hasPendingWork
+                )
                 testScheduler.advanceUntilIdle()
+                assertFalse("recomposer has invalidations for frame", recomposer.hasPendingWork)
+                runWithTimingDisabled {
+                    receiver.resetCb()
+                    Snapshot.sendApplyNotifications()
+                    testScheduler.advanceUntilIdle()
+                }
+                iterations++
             }
-            iterations++
-        }
 
-        activity.setContentView(emptyView)
-        recomposer.cancel()
-    }
+            activity.setContentView(emptyView)
+            recomposer.cancel()
+        }
 }
 
 @ExperimentalCoroutinesApi
@@ -233,11 +223,10 @@
 fun runBlockingTestWithFrameClock(
     context: CoroutineContext = EmptyCoroutineContext,
     testBody: suspend TestScope.() -> Unit
-): Unit = runTest(UnconfinedTestDispatcher() + context) {
-    withContext(TestMonotonicFrameClock(this)) {
-        testBody()
+): Unit =
+    runTest(UnconfinedTestDispatcher() + context) {
+        withContext(TestMonotonicFrameClock(this)) { testBody() }
     }
-}
 
 inline fun BenchmarkRule.measureRepeatedSuspendable(block: BenchmarkRule.Scope.() -> Unit) {
     // Note: this is an extension function to discourage calling from Java.
@@ -256,16 +245,14 @@
     writeObserver: (Any) -> Unit
 ): Boolean {
     val snapshot = Snapshot.takeMutableSnapshot(readObserver, writeObserver)
-    val result = snapshot.enter {
-        recompose().also { applyChanges() }
-    }
+    val result = snapshot.enter { recompose().also { applyChanges() } }
     snapshot.apply().check()
     return result
 }
 
 class RecomposeReceiver {
-    var composeCb: @Composable () -> Unit = @Composable { }
-    var updateModelCb: () -> Unit = { }
+    var composeCb: @Composable () -> Unit = @Composable {}
+    var updateModelCb: () -> Unit = {}
     var resetCb: () -> Unit = {}
 
     fun compose(block: @Composable () -> Unit) {
diff --git a/compose/runtime/runtime/compose-runtime-benchmark/src/androidTest/java/androidx/compose/runtime/benchmark/CompositionLocalBenchmark.kt b/compose/runtime/runtime/compose-runtime-benchmark/src/androidTest/java/androidx/compose/runtime/benchmark/CompositionLocalBenchmark.kt
index d748eca..6022001 100644
--- a/compose/runtime/runtime/compose-runtime-benchmark/src/androidTest/java/androidx/compose/runtime/benchmark/CompositionLocalBenchmark.kt
+++ b/compose/runtime/runtime/compose-runtime-benchmark/src/androidTest/java/androidx/compose/runtime/benchmark/CompositionLocalBenchmark.kt
@@ -41,11 +41,7 @@
     @Ignore // Only used for overhead comparison, not to be tracked.
     fun compositionLocal_compose_depth_1_1() = runBlockingTestWithFrameClock {
         measureCompose {
-            CompositionLocalProvider(local provides 100) {
-                DepthOf(1) {
-                    local.current
-                }
-            }
+            CompositionLocalProvider(local provides 100) { DepthOf(1) { local.current } }
         }
     }
 
@@ -55,9 +51,7 @@
     fun compositionLocal_compose_depth_1_10() = runBlockingTestWithFrameClock {
         measureCompose {
             CompositionLocalProvider(local provides 100) {
-                DepthOf(1) {
-                    repeat(10) { local.current }
-                }
+                DepthOf(1) { repeat(10) { local.current } }
             }
         }
     }
@@ -68,9 +62,7 @@
     fun compositionLocal_compose_depth_1_100() = runBlockingTestWithFrameClock {
         measureCompose {
             CompositionLocalProvider(local provides 100) {
-                DepthOf(1) {
-                    repeat(100) { local.current }
-                }
+                DepthOf(1) { repeat(100) { local.current } }
             }
         }
     }
@@ -80,11 +72,7 @@
     @Ignore // Only used for overhead comparison, not to be tracked.
     fun compositionLocal_compose_depth_100_1() = runBlockingTestWithFrameClock {
         measureCompose {
-            CompositionLocalProvider(local provides 100) {
-                DepthOf(100) {
-                    local.current
-                }
-            }
+            CompositionLocalProvider(local provides 100) { DepthOf(100) { local.current } }
         }
     }
 
@@ -94,9 +82,7 @@
     fun compositionLocal_compose_depth_100_10() = runBlockingTestWithFrameClock {
         measureCompose {
             CompositionLocalProvider(local provides 100) {
-                DepthOf(100) {
-                    repeat(10) { local.current }
-                }
+                DepthOf(100) { repeat(10) { local.current } }
             }
         }
     }
@@ -107,9 +93,7 @@
     fun compositionLocal_compose_depth_100_100() = runBlockingTestWithFrameClock {
         measureCompose {
             CompositionLocalProvider(local provides 100) {
-                DepthOf(100) {
-                    repeat(100) { local.current }
-                }
+                DepthOf(100) { repeat(100) { local.current } }
             }
         }
     }
@@ -119,11 +103,7 @@
     @Ignore // Only used for overhead comparison, not to be tracked.
     fun compositionLocal_compose_nested_providers_10() = runBlockingTestWithFrameClock {
         val local = staticCompositionLocalOf { 0 }
-        measureCompose {
-            NestedProviders(10) {
-                local.current
-            }
-        }
+        measureCompose { NestedProviders(10) { local.current } }
     }
 
     @UiThreadTest
@@ -131,11 +111,7 @@
     @Ignore // Only used for overhead comparison, not to be tracked.
     fun compositionLocal_compose_nested_providers_100() = runBlockingTestWithFrameClock {
         val local = staticCompositionLocalOf { 0 }
-        measureCompose {
-            NestedProviders(100) {
-                local.current
-            }
-        }
+        measureCompose { NestedProviders(100) { local.current } }
     }
 
     @UiThreadTest
@@ -143,26 +119,19 @@
     @Ignore // Only used for overhead comparison, not to be tracked.
     fun compositionLocal_compose_nested_providers_1000() = runBlockingTestWithFrameClock {
         val local = staticCompositionLocalOf { 0 }
-        measureCompose {
-            NestedProviders(1000) {
-                local.current
-            }
-        }
+        measureCompose { NestedProviders(1000) { local.current } }
     }
 }
 
 @Composable
 fun DepthOf(count: Int, content: @Composable () -> Unit) {
-    if (count > 0) DepthOf(count - 1, content)
-    else content()
+    if (count > 0) DepthOf(count - 1, content) else content()
 }
 
 @Composable
 fun NestedProviders(count: Int, content: @Composable () -> Unit) {
     if (count > 0) {
-        CompositionLocalProvider(
-            staticCompositionLocalOf { 0 } provides 0
-        ) {
+        CompositionLocalProvider(staticCompositionLocalOf { 0 } provides 0) {
             NestedProviders(count = count - 1, content)
         }
     } else content()
diff --git a/compose/runtime/runtime/compose-runtime-benchmark/src/androidTest/java/androidx/compose/runtime/benchmark/DbMonsterBenchmark.kt b/compose/runtime/runtime/compose-runtime-benchmark/src/androidTest/java/androidx/compose/runtime/benchmark/DbMonsterBenchmark.kt
index ad91d96..9297e68 100644
--- a/compose/runtime/runtime/compose-runtime-benchmark/src/androidTest/java/androidx/compose/runtime/benchmark/DbMonsterBenchmark.kt
+++ b/compose/runtime/runtime/compose-runtime-benchmark/src/androidTest/java/androidx/compose/runtime/benchmark/DbMonsterBenchmark.kt
@@ -33,8 +33,9 @@
 import org.junit.runners.MethodSorters
 
 /**
- * This is an implementation of a classic web perf benchmark "dbmonster". This can provide insight into apps with
- * lots of updating parts at once. It may also be good tests for the Text and Layout stacks of compose UI.
+ * This is an implementation of a classic web perf benchmark "dbmonster". This can provide insight
+ * into apps with lots of updating parts at once. It may also be good tests for the Text and Layout
+ * stacks of compose UI.
  *
  * See: http://mathieuancelin.github.io/js-repaint-perfs/
  */
@@ -54,7 +55,8 @@
 
     /**
      * @param count - the number of databases (2x this will be number of rows)
-     * @param mutate - the number of databases to mutate/update on each frame (2x count will be 100%)
+     * @param mutate - the number of databases to mutate/update on each frame (2x count will be
+     *   100%)
      */
     private fun dbMonsterBenchmark(count: Int, mutate: Int) = runBlockingTestWithFrameClock {
         val random = Random(0)
@@ -70,9 +72,7 @@
                     }
                 }
             }
-            update {
-                list.update(mutate)
-            }
+            update { list.update(mutate) }
         }
     }
 }
diff --git a/compose/runtime/runtime/compose-runtime-benchmark/src/androidTest/java/androidx/compose/runtime/benchmark/DeepTreeBenchmark.kt b/compose/runtime/runtime/compose-runtime-benchmark/src/androidTest/java/androidx/compose/runtime/benchmark/DeepTreeBenchmark.kt
index 079ac56c..db4b63a 100644
--- a/compose/runtime/runtime/compose-runtime-benchmark/src/androidTest/java/androidx/compose/runtime/benchmark/DeepTreeBenchmark.kt
+++ b/compose/runtime/runtime/compose-runtime-benchmark/src/androidTest/java/androidx/compose/runtime/benchmark/DeepTreeBenchmark.kt
@@ -28,10 +28,10 @@
 import org.junit.runners.MethodSorters
 
 /**
- * This is definitely a synthetic benchmark that may not map to realistic trees, but it is an effective way of
- * stress-testing some very large and very complex trees that may map pretty well to the more complicated
- * scenarios. I think this is a decent benchmark for testing Compose UI’s layout system in addition to
- * Compose’s composition performance.
+ * This is definitely a synthetic benchmark that may not map to realistic trees, but it is an
+ * effective way of stress-testing some very large and very complex trees that may map pretty well
+ * to the more complicated scenarios. I think this is a decent benchmark for testing Compose UI’s
+ * layout system in addition to Compose’s composition performance.
  */
 @LargeTest
 @RunWith(AndroidJUnit4::class)
@@ -41,32 +41,24 @@
     @UiThreadTest
     @Test
     fun benchmark_deep_tree_01_depth1_breadth100_wrap2() = runBlockingTestWithFrameClock {
-        measureCompose {
-            DeepTree(depth = 1, breadth = 100, wrap = 2)
-        }
+        measureCompose { DeepTree(depth = 1, breadth = 100, wrap = 2) }
     }
 
     @UiThreadTest
     @Test
     fun benchmark_deep_tree_02_depth7_breadth3_wrap2() = runBlockingTestWithFrameClock {
-        measureCompose {
-            DeepTree(depth = 7, breadth = 3, wrap = 2)
-        }
+        measureCompose { DeepTree(depth = 7, breadth = 3, wrap = 2) }
     }
 
     @UiThreadTest
     @Test
     fun benchmark_deep_tree_03_depth2_breadth10_wrap2() = runBlockingTestWithFrameClock {
-        measureCompose {
-            DeepTree(depth = 2, breadth = 10, wrap = 2)
-        }
+        measureCompose { DeepTree(depth = 2, breadth = 10, wrap = 2) }
     }
 
     @UiThreadTest
     @Test
     fun benchmark_deep_tree_04_depth2_breadth10_wrap6() = runBlockingTestWithFrameClock {
-        measureCompose {
-            DeepTree(depth = 2, breadth = 10, wrap = 6)
-        }
+        measureCompose { DeepTree(depth = 2, breadth = 10, wrap = 6) }
     }
 }
diff --git a/compose/runtime/runtime/compose-runtime-benchmark/src/androidTest/java/androidx/compose/runtime/benchmark/RememberSavableBenchmark.kt b/compose/runtime/runtime/compose-runtime-benchmark/src/androidTest/java/androidx/compose/runtime/benchmark/RememberSavableBenchmark.kt
index 73bf219..ff8c93b 100644
--- a/compose/runtime/runtime/compose-runtime-benchmark/src/androidTest/java/androidx/compose/runtime/benchmark/RememberSavableBenchmark.kt
+++ b/compose/runtime/runtime/compose-runtime-benchmark/src/androidTest/java/androidx/compose/runtime/benchmark/RememberSavableBenchmark.kt
@@ -38,10 +38,7 @@
     @Test
     fun rememberSaveable_1() = runBlockingTestWithFrameClock {
         measureComposeFocused {
-            @Suppress("UNUSED_VARIABLE")
-            val i: Int = rememberSaveable {
-                10
-            }
+            @Suppress("UNUSED_VARIABLE") val i: Int = rememberSaveable { 10 }
         }
     }
 
@@ -50,10 +47,7 @@
     fun rememberSaveable_10() = runBlockingTestWithFrameClock {
         measureComposeFocused {
             repeat(10) {
-                @Suppress("UNUSED_VARIABLE")
-                val i: Int = rememberSaveable {
-                    10
-                }
+                @Suppress("UNUSED_VARIABLE") val i: Int = rememberSaveable { 10 }
             }
         }
     }
@@ -63,10 +57,7 @@
     fun rememberSaveable_100() = runBlockingTestWithFrameClock {
         measureComposeFocused {
             repeat(100) {
-                @Suppress("UNUSED_VARIABLE")
-                val i: Int = rememberSaveable {
-                    10
-                }
+                @Suppress("UNUSED_VARIABLE") val i: Int = rememberSaveable { 10 }
             }
         }
     }
@@ -76,9 +67,7 @@
     fun rememberSaveable_mutable_1() = runBlockingTestWithFrameClock {
         measureComposeFocused {
             @Suppress("UNUSED_VARIABLE")
-            val i = rememberSaveable(stateSaver = autoSaver()) {
-                mutableStateOf(10)
-            }
+            val i = rememberSaveable(stateSaver = autoSaver()) { mutableStateOf(10) }
         }
     }
 
@@ -88,9 +77,7 @@
         measureComposeFocused {
             repeat(10) {
                 @Suppress("UNUSED_VARIABLE")
-                val i = rememberSaveable(stateSaver = autoSaver()) {
-                    mutableStateOf(10)
-                }
+                val i = rememberSaveable(stateSaver = autoSaver()) { mutableStateOf(10) }
             }
         }
     }
@@ -101,9 +88,7 @@
         measureComposeFocused {
             repeat(100) {
                 @Suppress("UNUSED_VARIABLE")
-                val i = rememberSaveable(stateSaver = autoSaver()) {
-                    mutableStateOf(10)
-                }
+                val i = rememberSaveable(stateSaver = autoSaver()) { mutableStateOf(10) }
             }
         }
     }
diff --git a/compose/runtime/runtime/compose-runtime-benchmark/src/androidTest/java/androidx/compose/runtime/benchmark/SiblingBenchmark.kt b/compose/runtime/runtime/compose-runtime-benchmark/src/androidTest/java/androidx/compose/runtime/benchmark/SiblingBenchmark.kt
index da437421..a9d0b2a 100644
--- a/compose/runtime/runtime/compose-runtime-benchmark/src/androidTest/java/androidx/compose/runtime/benchmark/SiblingBenchmark.kt
+++ b/compose/runtime/runtime/compose-runtime-benchmark/src/androidTest/java/androidx/compose/runtime/benchmark/SiblingBenchmark.kt
@@ -32,33 +32,30 @@
 import org.junit.runners.Parameterized
 
 /**
- * Managing “lists” of components that are siblings in Compose and other declarative reactive frameworks ends up
- * being an important performance characteristic to monitor. The algorithm we use here can depend greatly on how
- * we update lists of items and we might choose to bias towards what happens more commonly in the real world,
- * but understanding our performance characteristics for various types of list updates will be useful.
+ * Managing “lists” of components that are siblings in Compose and other declarative reactive
+ * frameworks ends up being an important performance characteristic to monitor. The algorithm we use
+ * here can depend greatly on how we update lists of items and we might choose to bias towards what
+ * happens more commonly in the real world, but understanding our performance characteristics for
+ * various types of list updates will be useful.
  *
- * @param count - number of items in the list. Really long lists probably should use a Recycler or something
- * similar in the real world, but testing this will at least let us understand our asymptotic complexity
- * characteristics.
- *
- * @param reorder - This determines what kinds of changes we will be making to the list each frame. Different list
- * management algorithms that Compose uses will yield different trade offs depending on where items in the list
- * are moved/added/removed/etc. For instance, we might be optimized for "append" but not "prepend", so we
- * should benchmark these types of changes individually. Note that some like "AddMiddle" insert at a random
- * index, so benchmarks should run this many times in order to average the randomness into something reasonable
- * to compare with a different run of the same benchmark.
- *
- * @param identity - this will toggle how Compose identifies a row. These three options are slightly different and
- * we might want to test all three.
+ * @param count - number of items in the list. Really long lists probably should use a Recycler or
+ *   something similar in the real world, but testing this will at least let us understand our
+ *   asymptotic complexity characteristics.
+ * @param reorder - This determines what kinds of changes we will be making to the list each frame.
+ *   Different list management algorithms that Compose uses will yield different trade offs
+ *   depending on where items in the list are moved/added/removed/etc. For instance, we might be
+ *   optimized for "append" but not "prepend", so we should benchmark these types of changes
+ *   individually. Note that some like "AddMiddle" insert at a random index, so benchmarks should
+ *   run this many times in order to average the randomness into something reasonable to compare
+ *   with a different run of the same benchmark.
+ * @param identity - this will toggle how Compose identifies a row. These three options are slightly
+ *   different and we might want to test all three.
  */
 @LargeTest
 @RunWith(Parameterized::class)
 @OptIn(ExperimentalCoroutinesApi::class, ExperimentalTestApi::class)
-class SiblingBenchmark(
-    val count: Int,
-    val reorder: ReorderType,
-    val identity: IdentityType
-) : ComposeBenchmarkBase() {
+class SiblingBenchmark(val count: Int, val reorder: ReorderType, val identity: IdentityType) :
+    ComposeBenchmarkBase() {
     companion object {
         @JvmStatic
         @Parameterized.Parameters(name = "{0}_{1}_{2}")
@@ -92,15 +89,9 @@
 
             runBlockingTestWithFrameClock {
                 measureRecomposeSuspending {
-                    compose {
-                        SiblingManagement(identity = identity, items = items.value)
-                    }
-                    update {
-                        items.value = listB
-                    }
-                    reset {
-                        items.value = listA
-                    }
+                    compose { SiblingManagement(identity = identity, items = items.value) }
+                    update { items.value = listB }
+                    reset { items.value = listA }
                 }
             }
         }
@@ -110,9 +101,11 @@
 // NOTE: remove when SAM conversion works in IR
 @Suppress("DEPRECATION")
 fun androidx.test.rule.ActivityTestRule<ComposeActivity>.runUiRunnable(block: () -> Unit) {
-    runOnUiThread(object : Runnable {
-        override fun run() {
-            block()
+    runOnUiThread(
+        object : Runnable {
+            override fun run() {
+                block()
+            }
         }
-    })
+    )
 }
diff --git a/compose/runtime/runtime/compose-runtime-benchmark/src/androidTest/java/androidx/compose/runtime/benchmark/SlotTableIntegrationBenchmark.kt b/compose/runtime/runtime/compose-runtime-benchmark/src/androidTest/java/androidx/compose/runtime/benchmark/SlotTableIntegrationBenchmark.kt
index 9b61a35..f66d8c9 100644
--- a/compose/runtime/runtime/compose-runtime-benchmark/src/androidTest/java/androidx/compose/runtime/benchmark/SlotTableIntegrationBenchmark.kt
+++ b/compose/runtime/runtime/compose-runtime-benchmark/src/androidTest/java/androidx/compose/runtime/benchmark/SlotTableIntegrationBenchmark.kt
@@ -56,14 +56,8 @@
     @Test
     fun create() = runBlockingTestWithFrameClock {
         measureCompose {
-            Column(
-                modifier = Modifier.size(width = 20.dp, height = 300.dp)
-            ) {
-                repeat(100) {
-                    key(it) {
-                        Pixel(color = Color.Blue)
-                    }
-                }
+            Column(modifier = Modifier.size(width = 20.dp, height = 300.dp)) {
+                repeat(100) { key(it) { Pixel(color = Color.Blue) } }
             }
         }
     }
@@ -74,15 +68,9 @@
         var includeGroups by mutableStateOf(true)
         measureRecomposeSuspending {
             compose {
-                Column(
-                    modifier = Modifier.size(width = 20.dp, height = 300.dp)
-                ) {
+                Column(modifier = Modifier.size(width = 20.dp, height = 300.dp)) {
                     if (includeGroups) {
-                        repeat(100) {
-                            key(it) {
-                                Pixel(color = Color.Blue)
-                            }
-                        }
+                        repeat(100) { key(it) { Pixel(color = Color.Blue) } }
                     }
                 }
             }
@@ -97,14 +85,10 @@
         var insertAlternatingGroups by mutableStateOf(true)
         measureRecomposeSuspending {
             compose {
-                Column(
-                    modifier = Modifier.size(width = 20.dp, height = 300.dp)
-                ) {
+                Column(modifier = Modifier.size(width = 20.dp, height = 300.dp)) {
                     repeat(100) { index ->
                         if (index % 2 == 0 || insertAlternatingGroups) {
-                            key(index) {
-                                Pixel(color = Color.Blue)
-                            }
+                            key(index) { Pixel(color = Color.Blue) }
                         }
                     }
                 }
@@ -120,16 +104,10 @@
         var insertAlternatingGroups by mutableStateOf(true)
         measureRecomposeSuspending {
             compose {
-                Column(
-                    modifier = Modifier.size(width = 20.dp, height = 300.dp)
-                ) {
+                Column(modifier = Modifier.size(width = 20.dp, height = 300.dp)) {
                     repeat(100) { index ->
                         if (index % 2 == 0 || insertAlternatingGroups) {
-                            Pixel(color = Color(
-                                red = 0,
-                                green = 2 * index,
-                                blue = 0
-                            ))
+                            Pixel(color = Color(red = 0, green = 2 * index, blue = 0))
                         }
                     }
                 }
@@ -145,15 +123,9 @@
         var includeGroups by mutableStateOf(false)
         measureRecomposeSuspending {
             compose {
-                Column(
-                    modifier = Modifier.size(width = 20.dp, height = 300.dp)
-                ) {
+                Column(modifier = Modifier.size(width = 20.dp, height = 300.dp)) {
                     if (includeGroups) {
-                        repeat(100) {
-                            key(it) {
-                                Pixel(color = Color.Blue)
-                            }
-                        }
+                        repeat(100) { key(it) { Pixel(color = Color.Blue) } }
                     }
                 }
             }
@@ -168,14 +140,10 @@
         var insertAlternatingGroups by mutableStateOf(false)
         measureRecomposeSuspending {
             compose {
-                Column(
-                    modifier = Modifier.size(width = 20.dp, height = 300.dp)
-                ) {
+                Column(modifier = Modifier.size(width = 20.dp, height = 300.dp)) {
                     repeat(100) { index ->
                         if (index % 2 == 0 || insertAlternatingGroups) {
-                            key(index) {
-                                Pixel(color = Color.Blue)
-                            }
+                            key(index) { Pixel(color = Color.Blue) }
                         }
                     }
                 }
@@ -191,16 +159,10 @@
         var insertAlternatingGroups by mutableStateOf(false)
         measureRecomposeSuspending {
             compose {
-                Column(
-                    modifier = Modifier.size(width = 20.dp, height = 300.dp)
-                ) {
+                Column(modifier = Modifier.size(width = 20.dp, height = 300.dp)) {
                     repeat(100) { index ->
                         if (index % 2 == 0 || insertAlternatingGroups) {
-                            Pixel(color = Color(
-                                red = 0,
-                                green = 2 * index,
-                                blue = 0
-                            ))
+                            Pixel(color = Color(red = 0, green = 2 * index, blue = 0))
                         }
                     }
                 }
@@ -226,9 +188,7 @@
                             Pixel(color = Color.Green)
                             Pixel(color = Color.Blue)
                         }
-                        MinimalBox {
-                            NonRenderingText("abcdef")
-                        }
+                        MinimalBox { NonRenderingText("abcdef") }
                         NonRenderingText(
                             text = random.nextString(),
                             textColor = Color(random.nextInt()),
@@ -288,17 +248,11 @@
             compose {
                 val random = remember(seed) { Random(seed) }
                 Pixel(PixelColorLocal.current)
-                CompositionLocalProvider(
-                    PixelColorLocal provides Color(random.nextInt())
-                ) {
+                CompositionLocalProvider(PixelColorLocal provides Color(random.nextInt())) {
                     Pixel(PixelColorLocal.current)
-                    CompositionLocalProvider(
-                        PixelColorLocal provides Color(random.nextInt())
-                    ) {
+                    CompositionLocalProvider(PixelColorLocal provides Color(random.nextInt())) {
                         Pixel(PixelColorLocal.current)
-                        CompositionLocalProvider(
-                            PixelColorLocal provides Color(random.nextInt())
-                        ) {
+                        CompositionLocalProvider(PixelColorLocal provides Color(random.nextInt())) {
                             Pixel(PixelColorLocal.current)
                             CompositionLocalProvider(
                                 PixelColorLocal provides Color(random.nextInt())
@@ -335,14 +289,8 @@
         var keys by mutableStateOf(originalItems)
         measureRecomposeSuspending {
             compose {
-                Column(
-                    modifier = Modifier.size(width = 20.dp, height = 300.dp)
-                ) {
-                    keys.forEach {
-                        key(it) {
-                            Pixel(color = Color.Blue)
-                        }
-                    }
+                Column(modifier = Modifier.size(width = 20.dp, height = 300.dp)) {
+                    keys.forEach { key(it) { Pixel(color = Color.Blue) } }
                 }
             }
             update { keys = keys.reversed() }
@@ -353,11 +301,7 @@
 
 @Composable
 private fun Pixel(color: Color) {
-    Layout(
-        modifier = Modifier.background(color)
-    ) { _, _ ->
-        layout(1, 1) {}
-    }
+    Layout(modifier = Modifier.background(color)) { _, _ -> layout(1, 1) {} }
 }
 
 @Composable
@@ -375,24 +319,16 @@
     use(ellipsize)
     use(minLines)
     use(maxLines)
-    Layout { _, _ ->
-        layout(1, 1) {}
-    }
+    Layout { _, _ -> layout(1, 1) {} }
 }
 
 @Composable
-private fun MinimalBox(
-    modifier: Modifier = Modifier,
-    content: @Composable () -> Unit
-) {
+private fun MinimalBox(modifier: Modifier = Modifier, content: @Composable () -> Unit) {
     Layout(content, modifier, MinimalBoxMeasurePolicy)
 }
 
 @Composable
-private fun MatryoshkaLayout(
-    depth: Int,
-    content: @Composable (depth: Int) -> Unit
-) {
+private fun MatryoshkaLayout(depth: Int, content: @Composable (depth: Int) -> Unit) {
     if (depth <= 0) {
         content(0)
     } else {
@@ -408,30 +344,28 @@
 
 private val MinimalBoxMeasurePolicy = MeasurePolicy { measurables, constraints ->
     val placeables = measurables.map { it.measure(constraints) }
-    val (usedWidth, usedHeight) = placeables.fold(
-        initial = IntOffset(0, 0)
-    ) { (maxWidth, maxHeight), placeable ->
-        IntOffset(
-            maxOf(maxWidth, placeable.measuredWidth),
-            maxOf(maxHeight, placeable.measuredHeight)
-        )
-    }
+    val (usedWidth, usedHeight) =
+        placeables.fold(initial = IntOffset(0, 0)) { (maxWidth, maxHeight), placeable ->
+            IntOffset(
+                maxOf(maxWidth, placeable.measuredWidth),
+                maxOf(maxHeight, placeable.measuredHeight)
+            )
+        }
 
-    layout(
-        width = usedWidth,
-        height = usedHeight
-    ) {
-        placeables.forEach { it.place(0, 0) }
-    }
+    layout(width = usedWidth, height = usedHeight) { placeables.forEach { it.place(0, 0) } }
 }
 
-private fun Random.nextString(length: Int = 16) = buildString(length) {
-    repeat(length) { append(nextInt('A'.code, 'z'.code).toChar()) }
-}
+private fun Random.nextString(length: Int = 16) =
+    buildString(length) { repeat(length) { append(nextInt('A'.code, 'z'.code).toChar()) } }
 
 @Suppress("UNUSED_PARAMETER") private fun use(value: Any?) {}
+
 @Suppress("UNUSED_PARAMETER") private fun use(value: Int) {}
+
 @Suppress("UNUSED_PARAMETER") private fun use(value: Long) {}
+
 @Suppress("UNUSED_PARAMETER") private fun use(value: Float) {}
+
 @Suppress("UNUSED_PARAMETER") private fun use(value: Double) {}
+
 @Suppress("UNUSED_PARAMETER") private fun use(value: Boolean) {}
diff --git a/compose/runtime/runtime/compose-runtime-benchmark/src/androidTest/java/androidx/compose/runtime/benchmark/SnapshotStateObserverBenchmark.kt b/compose/runtime/runtime/compose-runtime-benchmark/src/androidTest/java/androidx/compose/runtime/benchmark/SnapshotStateObserverBenchmark.kt
index 055b6f9..3ed1f72 100644
--- a/compose/runtime/runtime/compose-runtime-benchmark/src/androidTest/java/androidx/compose/runtime/benchmark/SnapshotStateObserverBenchmark.kt
+++ b/compose/runtime/runtime/compose-runtime-benchmark/src/androidTest/java/androidx/compose/runtime/benchmark/SnapshotStateObserverBenchmark.kt
@@ -71,9 +71,7 @@
 
     @After
     fun teardown() {
-        runOnUiThread {
-            stateObserver.stop()
-        }
+        runOnUiThread { stateObserver.stop() }
     }
 
     @Test
@@ -82,9 +80,7 @@
         runOnUiThread {
             benchmarkRule.measureRepeated {
                 runWithTimingDisabled {
-                    nodes.forEach { node ->
-                        stateObserver.clear(node)
-                    }
+                    nodes.forEach { node -> stateObserver.clear(node) }
                     random = Random(0)
                 }
                 setupObservations()
@@ -97,20 +93,14 @@
         assumeTrue(Build.VERSION.SDK_INT != 29)
         runOnUiThread {
             val list = mutableListOf<Any>()
-            repeat(10) {
-                list += nodes[random.nextInt(ScopeCount)]
-            }
+            repeat(10) { list += nodes[random.nextInt(ScopeCount)] }
             benchmarkRule.measureRepeated {
                 runWithTimingDisabled {
                     random = Random(0)
-                    nodes.forEach { node ->
-                        stateObserver.clear(node)
-                    }
+                    nodes.forEach { node -> stateObserver.clear(node) }
                 }
                 stateObserver.observeReads(nodes[0], doNothing) {
-                    list.forEach { node ->
-                        observeForNode(node)
-                    }
+                    list.forEach { node -> observeForNode(node) }
                 }
             }
         }
@@ -127,23 +117,17 @@
 
             stateObserver.observeReads(node, doNothing) {
                 // read derived state a few times
-                repeat(10) {
-                    derivedState.value
-                }
+                repeat(10) { derivedState.value }
             }
 
             benchmarkRule.measureRepeated {
                 stateObserver.observeReads(node, doNothing) {
                     // read derived state a few times
-                    repeat(10) {
-                        derivedState.value
-                    }
+                    repeat(10) { derivedState.value }
                 }
 
                 runWithTimingDisabled {
-                    states.forEach {
-                        it.value += 1
-                    }
+                    states.forEach { it.value += 1 }
                     Snapshot.sendApplyNotifications()
                 }
             }
@@ -155,9 +139,7 @@
         assumeTrue(Build.VERSION.SDK_INT != 29)
         runOnUiThread {
             val list = mutableListOf<Any>()
-            repeat(100) {
-                list += nodes[random.nextInt(ScopeCount)]
-            }
+            repeat(100) { list += nodes[random.nextInt(ScopeCount)] }
 
             fun observeRecursive(index: Int) {
                 if (index == 100) return
@@ -171,9 +153,7 @@
             benchmarkRule.measureRepeated {
                 runWithTimingDisabled {
                     random = Random(0)
-                    nodes.forEach { node ->
-                        stateObserver.clear(node)
-                    }
+                    nodes.forEach { node -> stateObserver.clear(node) }
                 }
                 observeRecursive(0)
             }
@@ -188,13 +168,9 @@
             nodeSet.addAll(nodes)
 
             benchmarkRule.measureRepeated {
-                stateObserver.clearIf { node ->
-                    node in nodeSet
-                }
+                stateObserver.clearIf { node -> node in nodeSet }
                 random = Random(0)
-                runWithTimingDisabled {
-                    setupObservations()
-                }
+                runWithTimingDisabled { setupObservations() }
             }
         }
     }
@@ -205,13 +181,9 @@
         runOnUiThread {
             benchmarkRule.measureRepeated {
                 for (i in 0 until nodes.size) {
-                    stateObserver.clearIf { node ->
-                        (node as Int) < i
-                    }
+                    stateObserver.clearIf { node -> (node as Int) < i }
                 }
-                runWithTimingDisabled {
-                    setupObservations()
-                }
+                runWithTimingDisabled { setupObservations() }
             }
         }
     }
@@ -221,9 +193,7 @@
         assumeTrue(Build.VERSION.SDK_INT != 29)
         runOnUiThread {
             val states = mutableSetOf<Int>()
-            repeat(50) {
-                states += random.nextInt(StateCount)
-            }
+            repeat(50) { states += random.nextInt(StateCount) }
             val snapshot: Snapshot = Snapshot.current
             benchmarkRule.measureRepeated {
                 random = Random(0)
@@ -237,6 +207,7 @@
     }
 
     private fun runOnUiThread(block: () -> Unit) = activityRule.runOnUiThread(block)
+
     private fun setupObservations() = nodes.forEach { observeForNode(it) }
 
     private fun observeForNode(node: Any) {
diff --git a/compose/runtime/runtime/compose-runtime-benchmark/src/androidTest/java/androidx/compose/runtime/benchmark/TrivialCompositionBenchmarkValidator.kt b/compose/runtime/runtime/compose-runtime-benchmark/src/androidTest/java/androidx/compose/runtime/benchmark/TrivialCompositionBenchmarkValidator.kt
index 70bc144..dec1cf4 100644
--- a/compose/runtime/runtime/compose-runtime-benchmark/src/androidTest/java/androidx/compose/runtime/benchmark/TrivialCompositionBenchmarkValidator.kt
+++ b/compose/runtime/runtime/compose-runtime-benchmark/src/androidTest/java/androidx/compose/runtime/benchmark/TrivialCompositionBenchmarkValidator.kt
@@ -45,9 +45,7 @@
     }
 }
 
-private val measurePolicy = MeasurePolicy { _, _ ->
-    layout(300, 300) {}
-}
+private val measurePolicy = MeasurePolicy { _, _ -> layout(300, 300) {} }
 
 private val modifier = Modifier.fillMaxSize()
 
@@ -55,12 +53,9 @@
 @RunWith(Parameterized::class)
 class TrivialCompositionBenchmarkValidatorTest(private val testIteration: Int) {
 
-    @get:Rule
-    val benchmarkRule = ComposeBenchmarkRule()
+    @get:Rule val benchmarkRule = ComposeBenchmarkRule()
 
-    private val caseFactory = {
-        TrivialCompositionBenchmarkValidator()
-    }
+    private val caseFactory = { TrivialCompositionBenchmarkValidator() }
 
     companion object {
         @JvmStatic
diff --git a/compose/runtime/runtime/compose-runtime-benchmark/src/androidTest/java/androidx/compose/runtime/benchmark/collection/MutableVectorBenchmark.kt b/compose/runtime/runtime/compose-runtime-benchmark/src/androidTest/java/androidx/compose/runtime/benchmark/collection/MutableVectorBenchmark.kt
index 21cb181..89fbec5 100644
--- a/compose/runtime/runtime/compose-runtime-benchmark/src/androidTest/java/androidx/compose/runtime/benchmark/collection/MutableVectorBenchmark.kt
+++ b/compose/runtime/runtime/compose-runtime-benchmark/src/androidTest/java/androidx/compose/runtime/benchmark/collection/MutableVectorBenchmark.kt
@@ -31,9 +31,7 @@
 import org.junit.runner.RunWith
 import org.junit.runners.MethodSorters
 
-/**
- * Benchmark that tests the performance of ArrayList and MutableVector.
- */
+/** Benchmark that tests the performance of ArrayList and MutableVector. */
 @LargeTest
 @RunWith(AndroidJUnit4::class)
 @FixMethodOrder(MethodSorters.NAME_ASCENDING)
@@ -44,68 +42,52 @@
 
     @Before
     fun setUp() {
-        repeat(arraySize) {
-            content[it] = it
-        }
+        repeat(arraySize) { content[it] = it }
     }
 
     @Test
     fun createArrayList() {
-        benchmarkRule.measureRepeated {
-            mutableListOf(*content)
-        }
+        benchmarkRule.measureRepeated { mutableListOf(*content) }
     }
 
     @Test
     fun createVector() {
-        benchmarkRule.measureRepeated {
-            mutableVectorOf(*content)
-        }
+        benchmarkRule.measureRepeated { mutableVectorOf(*content) }
     }
 
     @Test
     fun indexOfArrayList() {
         val list = mutableListOf(*content)
         var sum = 0
-        benchmarkRule.measureRepeated {
-            sum += list.indexOf(-1)
-        }
+        benchmarkRule.measureRepeated { sum += list.indexOf(-1) }
     }
 
     @Test
     fun indexOfVector() {
         val list = mutableVectorOf(*content)
         var sum = 0
-        benchmarkRule.measureRepeated {
-            sum += list.indexOf(-1)
-        }
+        benchmarkRule.measureRepeated { sum += list.indexOf(-1) }
     }
 
     @Test
     fun iterateArrayList() {
         val list = mutableListOf(*content)
         var sum = 0
-        benchmarkRule.measureRepeated {
-            list.fastForEach { sum += it }
-        }
+        benchmarkRule.measureRepeated { list.fastForEach { sum += it } }
     }
 
     @Test
     fun iterateVector() {
         val list = mutableVectorOf(*content)
         var sum = 0
-        benchmarkRule.measureRepeated {
-            list.forEach { sum += it }
-        }
+        benchmarkRule.measureRepeated { list.forEach { sum += it } }
     }
 
     @Test
     fun addArrayList() {
         val list = ArrayList<Int>(arraySize)
         benchmarkRule.measureRepeated {
-            repeat(arraySize) {
-                list.add(it)
-            }
+            repeat(arraySize) { list.add(it) }
             list.clear()
         }
     }
@@ -114,9 +96,7 @@
     fun addVector() {
         val list = MutableVector<Int>(arraySize)
         benchmarkRule.measureRepeated {
-            repeat(arraySize) {
-                list.add(it)
-            }
+            repeat(arraySize) { list.add(it) }
             list.clear()
         }
     }
@@ -126,9 +106,7 @@
         val list = ArrayList<Int>(arraySize)
         benchmarkRule.measureRepeated {
             list.addAll(content)
-            repeat(arraySize) {
-                list.removeAt(list.lastIndex)
-            }
+            repeat(arraySize) { list.removeAt(list.lastIndex) }
         }
     }
 
@@ -137,9 +115,7 @@
         val list = MutableVector<Int>(arraySize)
         benchmarkRule.measureRepeated {
             list.addAll(content)
-            repeat(arraySize) {
-                list.removeAt(list.lastIndex)
-            }
+            repeat(arraySize) { list.removeAt(list.lastIndex) }
         }
     }
 
@@ -148,9 +124,7 @@
         val list = ArrayList<Int>(arraySize)
         benchmarkRule.measureRepeated {
             list.addAll(content)
-            repeat(arraySize) {
-                list.removeAt(0)
-            }
+            repeat(arraySize) { list.removeAt(0) }
         }
     }
 
@@ -159,9 +133,7 @@
         val list = MutableVector<Int>(arraySize)
         benchmarkRule.measureRepeated {
             list.addAll(content)
-            repeat(arraySize) {
-                list.removeAt(0)
-            }
+            repeat(arraySize) { list.removeAt(0) }
         }
     }
 
@@ -189,72 +161,56 @@
     fun indexOfLastArrayList() {
         val list = mutableListOf(*content)
         var sum = 0
-        benchmarkRule.measureRepeated {
-            sum += list.indexOfLast { it == 0 }
-        }
+        benchmarkRule.measureRepeated { sum += list.indexOfLast { it == 0 } }
     }
 
     @Test
     fun indexOfLastVector() {
         val list = mutableVectorOf(*content)
         var sum = 0
-        benchmarkRule.measureRepeated {
-            sum += list.indexOfLast { it == 0 }
-        }
+        benchmarkRule.measureRepeated { sum += list.indexOfLast { it == 0 } }
     }
 
     @Test
     fun lastIndexOfArrayList() {
         val list = mutableListOf(*content)
         var sum = 0
-        benchmarkRule.measureRepeated {
-            sum += list.lastIndexOf(0)
-        }
+        benchmarkRule.measureRepeated { sum += list.lastIndexOf(0) }
     }
 
     @Test
     fun lastIndexOfVector() {
         val list = mutableVectorOf(*content)
         var sum = 0
-        benchmarkRule.measureRepeated {
-            sum += list.lastIndexOf(0)
-        }
+        benchmarkRule.measureRepeated { sum += list.lastIndexOf(0) }
     }
 
     @Test
     fun anyArrayList() {
         val list = mutableListOf(*content)
         var sum = 0
-        benchmarkRule.measureRepeated {
-            sum += if (list.fastAny { it == -1 }) 1 else 0
-        }
+        benchmarkRule.measureRepeated { sum += if (list.fastAny { it == -1 }) 1 else 0 }
     }
 
     @Test
     fun anyVector() {
         val list = mutableVectorOf(*content)
         var sum = 0
-        benchmarkRule.measureRepeated {
-            sum += if (list.any { it == -1 }) 1 else 0
-        }
+        benchmarkRule.measureRepeated { sum += if (list.any { it == -1 }) 1 else 0 }
     }
 
     @Test
     fun sumByArrayList() {
         val list = mutableListOf(*content)
         var sum = 0
-        benchmarkRule.measureRepeated {
-            sum += list.fastSumBy { it }
-        }
+        benchmarkRule.measureRepeated { sum += list.fastSumBy { it } }
     }
 
     @Test
     fun sumByVector() {
         val list = mutableVectorOf(*content)
         var sum = 0
-        benchmarkRule.measureRepeated {
-            sum += list.sumBy { it }
-        }
+        benchmarkRule.measureRepeated { sum += list.sumBy { it } }
     }
 
     @Test
@@ -266,18 +222,21 @@
             list2.addAll(list)
             list2.addAll(list)
             list2.addAll(list)
-            runWithTimingDisabled {
-                list2.clear()
-            }
+            runWithTimingDisabled { list2.clear() }
         }
     }
 
     // These are temporary, to investigate CI instability (b/208713172)
     @Test fun addAllArrayList1() = addAllArrayList()
+
     @Test fun addAllArrayList2() = addAllArrayList()
+
     @Test fun addAllArrayList3() = addAllArrayList()
+
     @Test fun addAllArrayList4() = addAllArrayList()
-    @Test fun addAllArrayListRotateInput() {
+
+    @Test
+    fun addAllArrayListRotateInput() {
         val listOfLists = List(16) { mutableListOf(*content) }
         var counter = 0
         benchmarkRule.measureRepeated {
@@ -300,18 +259,21 @@
             list2.addAll(list)
             list2.addAll(list)
             list2.addAll(list)
-            runWithTimingDisabled {
-                list2.clear()
-            }
+            runWithTimingDisabled { list2.clear() }
         }
     }
 
     // These are temporary, to investigate CI instability (b/208713172)
     @Test fun addAllVector1() = addAllVector()
+
     @Test fun addAllVector2() = addAllVector()
+
     @Test fun addAllVector3() = addAllVector()
+
     @Test fun addAllVector4() = addAllVector()
-    @Test fun addAllVectorRotateInput() {
+
+    @Test
+    fun addAllVectorRotateInput() {
         val listOfLists = List(16) { mutableVectorOf(*content) }
         var counter = 0
         val list2 = MutableVector<Int>(content.size * 4)
@@ -335,9 +297,7 @@
             list2.addAll(0, list)
             list2.addAll(0, list)
             list2.addAll(0, list)
-            runWithTimingDisabled {
-                list2.clear()
-            }
+            runWithTimingDisabled { list2.clear() }
         }
     }
 
@@ -350,9 +310,7 @@
             list2.addAll(0, list)
             list2.addAll(0, list)
             list2.addAll(0, list)
-            runWithTimingDisabled {
-                list2.clear()
-            }
+            runWithTimingDisabled { list2.clear() }
         }
     }
 
@@ -360,21 +318,13 @@
     fun setArrayList() {
         val list = mutableListOf<Int>()
         list.addAll(content)
-        benchmarkRule.measureRepeated {
-            repeat(arraySize) {
-                list[it] = list[(it + 1) % 100]
-            }
-        }
+        benchmarkRule.measureRepeated { repeat(arraySize) { list[it] = list[(it + 1) % 100] } }
     }
 
     @Test
     fun setVector() {
         val list = mutableVectorOf<Int>()
         list.addAll(content)
-        benchmarkRule.measureRepeated {
-            repeat(arraySize) {
-                list[it] = list[(it + 1) % 100]
-            }
-        }
+        benchmarkRule.measureRepeated { repeat(arraySize) { list[it] = list[(it + 1) % 100] } }
     }
 }
diff --git a/compose/runtime/runtime/compose-runtime-benchmark/src/androidTest/java/androidx/compose/runtime/benchmark/dbmonster/DbMonster.kt b/compose/runtime/runtime/compose-runtime-benchmark/src/androidTest/java/androidx/compose/runtime/benchmark/dbmonster/DbMonster.kt
index 9681ac4..5b3e84a 100644
--- a/compose/runtime/runtime/compose-runtime-benchmark/src/androidTest/java/androidx/compose/runtime/benchmark/dbmonster/DbMonster.kt
+++ b/compose/runtime/runtime/compose-runtime-benchmark/src/androidTest/java/androidx/compose/runtime/benchmark/dbmonster/DbMonster.kt
@@ -28,13 +28,14 @@
 import androidx.compose.ui.Modifier
 import kotlin.random.Random
 
-private fun randomQuery(random: Random): String = random.nextDouble().let {
-    when {
-        it < 0.1 -> "Idle"
-        it < 0.2 -> "vacuum"
-        else -> "SELECT blah FROM something"
+private fun randomQuery(random: Random): String =
+    random.nextDouble().let {
+        when {
+            it < 0.1 -> "Idle"
+            it < 0.2 -> "vacuum"
+            else -> "SELECT blah FROM something"
+        }
     }
-}
 
 private const val MAX_ELAPSED = 15.0
 
@@ -46,27 +47,25 @@
 class Database(name: String, random: Random) {
     var name: String by mutableStateOf(name)
     private val myRandom = random
-    var queries: List<Query> = (1..10).map {
-        Query(randomQuery(random), random.nextDouble() * MAX_ELAPSED)
-    }
+    var queries: List<Query> =
+        (1..10).map { Query(randomQuery(random), random.nextDouble() * MAX_ELAPSED) }
+
     fun topQueries(n: Int): List<Query> {
-        return queries/*.sortedByDescending { it.elapsed }*/.take(n)
+        return queries /*.sortedByDescending { it.elapsed }*/.take(n)
     }
+
     fun update() {
         val r = myRandom.nextInt(queries.size)
-        (0..r).forEach {
-            queries[it].elapsed = myRandom.nextDouble() * MAX_ELAPSED
-        }
+        (0..r).forEach { queries[it].elapsed = myRandom.nextDouble() * MAX_ELAPSED }
     }
 }
 
 class DatabaseList(n: Int, val random: Random) {
-    val databases: List<Database> = (0..n).flatMap {
-        listOf(
-            Database("cluster $it", random),
-            Database("cluster $it slave", random)
-        )
-    }
+    val databases: List<Database> =
+        (0..n).flatMap {
+            listOf(Database("cluster $it", random), Database("cluster $it slave", random))
+        }
+
     fun update(n: Int) {
         // update n random databases in the list
         databases.shuffled(random).take(n).forEach { it.update() }
@@ -90,8 +89,6 @@
     Row(Modifier.fillMaxWidth()) {
         Column(Modifier.fillMaxHeight()) { Text(text = db.name) }
         Column(Modifier.fillMaxHeight()) { Text(text = "${db.queries.size}") }
-        topQueries.forEach { query ->
-            QueryColumn(query = query)
-        }
+        topQueries.forEach { query -> QueryColumn(query = query) }
     }
 }
diff --git a/compose/runtime/runtime/compose-runtime-benchmark/src/androidTest/java/androidx/compose/runtime/benchmark/deeptree/DeepTree.kt b/compose/runtime/runtime/compose-runtime-benchmark/src/androidTest/java/androidx/compose/runtime/benchmark/deeptree/DeepTree.kt
index c481a56..2b02b0fa 100644
--- a/compose/runtime/runtime/compose-runtime-benchmark/src/androidTest/java/androidx/compose/runtime/benchmark/deeptree/DeepTree.kt
+++ b/compose/runtime/runtime/compose-runtime-benchmark/src/androidTest/java/androidx/compose/runtime/benchmark/deeptree/DeepTree.kt
@@ -33,11 +33,12 @@
 
 @Composable
 fun Terminal(style: Int) {
-    val background = when (style) {
-        0 -> blueBackground
-        1 -> blackBackground
-        else -> magentaBackground
-    }
+    val background =
+        when (style) {
+            0 -> blueBackground
+            1 -> blackBackground
+            else -> magentaBackground
+        }
     Box(modifier = Modifier.fillMaxSize().then(background))
 }
 
@@ -51,38 +52,31 @@
 }
 
 /**
- *
  * This Component will emit `breadth ^ depth` Terminal components.
  *
- *
- * @param depth - increasing this will determine how many nested <Stack> elements will result in the tree. Higher
- * numbers would be a proxy for very complicated layouts
- *
- * @param breadth - increasing this will increase the number of nodes at each level. Correlates to exponential
- * growth in the number of nodes in the tree, so be careful making it too large.
- *
- * @param wrap - to make the depth of the composition tree greater, we can increase this and it will just wrap
- * the component this many times at each level. It will not increase the number of layout nodes in the tree, but
- * will make composition more expensive.
- *
+ * @param depth - increasing this will determine how many nested <Stack> elements will result in the
+ *   tree. Higher numbers would be a proxy for very complicated layouts
+ * @param breadth - increasing this will increase the number of nodes at each level. Correlates to
+ *   exponential growth in the number of nodes in the tree, so be careful making it too large.
+ * @param wrap - to make the depth of the composition tree greater, we can increase this and it will
+ *   just wrap the component this many times at each level. It will not increase the number of
+ *   layout nodes in the tree, but will make composition more expensive.
  * @param id - an int that determines the style of the next terminal
  */
 @Suppress("UNUSED_PARAMETER")
 @Composable
 fun DeepTree(depth: Int, breadth: Int, wrap: Int, id: Int = 0) {
-//    if (wrap > 0) {
-//        Container {
-//            DeepTree(depth=depth, breadth=breadth, wrap=wrap - 1, id=id)
-//        }
-//    } else {
+    //    if (wrap > 0) {
+    //        Container {
+    //            DeepTree(depth=depth, breadth=breadth, wrap=wrap - 1, id=id)
+    //        }
+    //    } else {
     Stack(vertical = depth % 2 == 0) {
         if (depth == 0) {
             Terminal(style = id % 3)
         } else {
-            repeat(breadth) {
-                Box(Modifier.fillMaxSize().then(blueBackground))
-            }
+            repeat(breadth) { Box(Modifier.fillMaxSize().then(blueBackground)) }
         }
     }
-//    }
+    //    }
 }
diff --git a/compose/runtime/runtime/compose-runtime-benchmark/src/androidTest/java/androidx/compose/runtime/benchmark/realworld4/RealWorld4_DataModels.kt b/compose/runtime/runtime/compose-runtime-benchmark/src/androidTest/java/androidx/compose/runtime/benchmark/realworld4/RealWorld4_DataModels.kt
index a7d8191..2bc9184 100644
--- a/compose/runtime/runtime/compose-runtime-benchmark/src/androidTest/java/androidx/compose/runtime/benchmark/realworld4/RealWorld4_DataModels.kt
+++ b/compose/runtime/runtime/compose-runtime-benchmark/src/androidTest/java/androidx/compose/runtime/benchmark/realworld4/RealWorld4_DataModels.kt
@@ -20,22 +20,31 @@
  * RealWorld4 is a performance test that attempts to simulate a real-world application of reasonably
  * large scale (eg. gmail-sized application).
  */
-
 import androidx.compose.runtime.getValue
 import androidx.compose.runtime.mutableStateOf
 import androidx.compose.runtime.setValue
 import androidx.compose.ui.graphics.Color
 
 class RealWorld4_DataModel_09() {
-    var f0: Color by mutableStateOf(
-        Color(red = random.nextInt(255), green = random.nextInt(255), blue = random.nextInt(255))
-    )
+    var f0: Color by
+        mutableStateOf(
+            Color(
+                red = random.nextInt(255),
+                green = random.nextInt(255),
+                blue = random.nextInt(255)
+            )
+        )
     var f1: String by mutableStateOf(smallRange().map { createSomeText() }.joinToString("\n"))
     var f2: RealWorld4_DataModel_10 by mutableStateOf(RealWorld4_DataModel_10())
     var f3: Boolean by mutableStateOf(random.nextBoolean())
-    var f4: Color by mutableStateOf(
-        Color(red = random.nextInt(255), green = random.nextInt(255), blue = random.nextInt(255))
-    )
+    var f4: Color by
+        mutableStateOf(
+            Color(
+                red = random.nextInt(255),
+                green = random.nextInt(255),
+                blue = random.nextInt(255)
+            )
+        )
     var f5: RealWorld4_DataModel_10 by mutableStateOf(RealWorld4_DataModel_10())
 }
 
@@ -43,20 +52,40 @@
     var f0: Boolean by mutableStateOf(random.nextBoolean())
     var f1: Int by mutableStateOf(random.nextInt())
     var f2: Boolean by mutableStateOf(random.nextBoolean())
-    var f3: Color by mutableStateOf(
-        Color(red = random.nextInt(255), green = random.nextInt(255), blue = random.nextInt(255))
-    )
-    var f4: Color by mutableStateOf(
-        Color(red = random.nextInt(255), green = random.nextInt(255), blue = random.nextInt(255))
-    )
+    var f3: Color by
+        mutableStateOf(
+            Color(
+                red = random.nextInt(255),
+                green = random.nextInt(255),
+                blue = random.nextInt(255)
+            )
+        )
+    var f4: Color by
+        mutableStateOf(
+            Color(
+                red = random.nextInt(255),
+                green = random.nextInt(255),
+                blue = random.nextInt(255)
+            )
+        )
     var f5: Int by mutableStateOf(random.nextInt())
     var f6: Int by mutableStateOf(random.nextInt())
-    var f7: Color by mutableStateOf(
-        Color(red = random.nextInt(255), green = random.nextInt(255), blue = random.nextInt(255))
-    )
-    var f8: Color by mutableStateOf(
-        Color(red = random.nextInt(255), green = random.nextInt(255), blue = random.nextInt(255))
-    )
+    var f7: Color by
+        mutableStateOf(
+            Color(
+                red = random.nextInt(255),
+                green = random.nextInt(255),
+                blue = random.nextInt(255)
+            )
+        )
+    var f8: Color by
+        mutableStateOf(
+            Color(
+                red = random.nextInt(255),
+                green = random.nextInt(255),
+                blue = random.nextInt(255)
+            )
+        )
     var f9: Int by mutableStateOf(random.nextInt())
     var f10: RealWorld4_DataModel_07 by mutableStateOf(RealWorld4_DataModel_07())
     var f11: RealWorld4_DataModel_07 by mutableStateOf(RealWorld4_DataModel_07())
@@ -65,9 +94,14 @@
 class RealWorld4_DataModel_08() {
     var f0: RealWorld4_DataModel_09 by mutableStateOf(RealWorld4_DataModel_09())
     var f1: String by mutableStateOf(smallRange().map { createSomeText() }.joinToString("\n"))
-    var f2: Color by mutableStateOf(
-        Color(red = random.nextInt(255), green = random.nextInt(255), blue = random.nextInt(255))
-    )
+    var f2: Color by
+        mutableStateOf(
+            Color(
+                red = random.nextInt(255),
+                green = random.nextInt(255),
+                blue = random.nextInt(255)
+            )
+        )
     var f3: Int by mutableStateOf(random.nextInt())
     var f4: RealWorld4_DataModel_09 by mutableStateOf(RealWorld4_DataModel_09())
     var f5: String by mutableStateOf(smallRange().map { createSomeText() }.joinToString("\n"))
@@ -93,15 +127,30 @@
 
 class RealWorld4_DataModel_05() {
     var f0: RealWorld4_DataModel_06 by mutableStateOf(RealWorld4_DataModel_06())
-    var f1: Color by mutableStateOf(
-        Color(red = random.nextInt(255), green = random.nextInt(255), blue = random.nextInt(255))
-    )
-    var f2: Color by mutableStateOf(
-        Color(red = random.nextInt(255), green = random.nextInt(255), blue = random.nextInt(255))
-    )
-    var f3: Color by mutableStateOf(
-        Color(red = random.nextInt(255), green = random.nextInt(255), blue = random.nextInt(255))
-    )
+    var f1: Color by
+        mutableStateOf(
+            Color(
+                red = random.nextInt(255),
+                green = random.nextInt(255),
+                blue = random.nextInt(255)
+            )
+        )
+    var f2: Color by
+        mutableStateOf(
+            Color(
+                red = random.nextInt(255),
+                green = random.nextInt(255),
+                blue = random.nextInt(255)
+            )
+        )
+    var f3: Color by
+        mutableStateOf(
+            Color(
+                red = random.nextInt(255),
+                green = random.nextInt(255),
+                blue = random.nextInt(255)
+            )
+        )
     var f4: Boolean by mutableStateOf(random.nextBoolean())
     var f5: Boolean by mutableStateOf(random.nextBoolean())
     var f6: RealWorld4_DataModel_06 by mutableStateOf(RealWorld4_DataModel_06())
@@ -114,9 +163,14 @@
     var f2: RealWorld4_DataModel_01 by mutableStateOf(RealWorld4_DataModel_01())
     var f3: RealWorld4_DataModel_01 by mutableStateOf(RealWorld4_DataModel_01())
     var f4: Int by mutableStateOf(random.nextInt())
-    var f5: Color by mutableStateOf(
-        Color(red = random.nextInt(255), green = random.nextInt(255), blue = random.nextInt(255))
-    )
+    var f5: Color by
+        mutableStateOf(
+            Color(
+                red = random.nextInt(255),
+                green = random.nextInt(255),
+                blue = random.nextInt(255)
+            )
+        )
     var f6: String by mutableStateOf(smallRange().map { createSomeText() }.joinToString("\n"))
     var f7: Int by mutableStateOf(random.nextInt())
     var f8: Int by mutableStateOf(random.nextInt())
@@ -126,17 +180,27 @@
     var f0: Int by mutableStateOf(random.nextInt())
     var f1: RealWorld4_DataModel_03 by mutableStateOf(RealWorld4_DataModel_03())
     var f2: Boolean by mutableStateOf(random.nextBoolean())
-    var f3: Color by mutableStateOf(
-        Color(red = random.nextInt(255), green = random.nextInt(255), blue = random.nextInt(255))
-    )
+    var f3: Color by
+        mutableStateOf(
+            Color(
+                red = random.nextInt(255),
+                green = random.nextInt(255),
+                blue = random.nextInt(255)
+            )
+        )
     var f4: Int by mutableStateOf(random.nextInt())
     var f5: Int by mutableStateOf(random.nextInt())
     var f6: RealWorld4_DataModel_03 by mutableStateOf(RealWorld4_DataModel_03())
     var f7: Int by mutableStateOf(random.nextInt())
     var f8: Int by mutableStateOf(random.nextInt())
-    var f9: Color by mutableStateOf(
-        Color(red = random.nextInt(255), green = random.nextInt(255), blue = random.nextInt(255))
-    )
+    var f9: Color by
+        mutableStateOf(
+            Color(
+                red = random.nextInt(255),
+                green = random.nextInt(255),
+                blue = random.nextInt(255)
+            )
+        )
 }
 
 class RealWorld4_DataModel_04() {
@@ -156,9 +220,14 @@
 class RealWorld4_DataModel_01() {
     var f0: RealWorld4_DataModel_02 by mutableStateOf(RealWorld4_DataModel_02())
     var f1: Int by mutableStateOf(random.nextInt())
-    var f2: Color by mutableStateOf(
-        Color(red = random.nextInt(255), green = random.nextInt(255), blue = random.nextInt(255))
-    )
+    var f2: Color by
+        mutableStateOf(
+            Color(
+                red = random.nextInt(255),
+                green = random.nextInt(255),
+                blue = random.nextInt(255)
+            )
+        )
     var f3: Boolean by mutableStateOf(random.nextBoolean())
     var f4: Boolean by mutableStateOf(random.nextBoolean())
     var f5: Int by mutableStateOf(random.nextInt())
@@ -175,14 +244,24 @@
 }
 
 class RealWorld4_DataModel_03() {
-    var f0: Color by mutableStateOf(
-        Color(red = random.nextInt(255), green = random.nextInt(255), blue = random.nextInt(255))
-    )
+    var f0: Color by
+        mutableStateOf(
+            Color(
+                red = random.nextInt(255),
+                green = random.nextInt(255),
+                blue = random.nextInt(255)
+            )
+        )
     var f1: RealWorld4_DataModel_04 by mutableStateOf(RealWorld4_DataModel_04())
     var f2: Int by mutableStateOf(random.nextInt())
-    var f3: Color by mutableStateOf(
-        Color(red = random.nextInt(255), green = random.nextInt(255), blue = random.nextInt(255))
-    )
+    var f3: Color by
+        mutableStateOf(
+            Color(
+                red = random.nextInt(255),
+                green = random.nextInt(255),
+                blue = random.nextInt(255)
+            )
+        )
     var f4: Boolean by mutableStateOf(random.nextBoolean())
     var f5: RealWorld4_DataModel_04 by mutableStateOf(RealWorld4_DataModel_04())
 }
diff --git a/compose/runtime/runtime/compose-runtime-benchmark/src/androidTest/java/androidx/compose/runtime/benchmark/realworld4/RealWorld4_UnmemoizablePojos.kt b/compose/runtime/runtime/compose-runtime-benchmark/src/androidTest/java/androidx/compose/runtime/benchmark/realworld4/RealWorld4_UnmemoizablePojos.kt
index 78658f3..bd28690 100644
--- a/compose/runtime/runtime/compose-runtime-benchmark/src/androidTest/java/androidx/compose/runtime/benchmark/realworld4/RealWorld4_UnmemoizablePojos.kt
+++ b/compose/runtime/runtime/compose-runtime-benchmark/src/androidTest/java/androidx/compose/runtime/benchmark/realworld4/RealWorld4_UnmemoizablePojos.kt
@@ -20,7 +20,6 @@
  * RealWorld4 is a performance test that attempts to simulate a real-world application of reasonably
  * large scale (eg. gmail-sized application).
  */
-
 import androidx.compose.ui.graphics.Color
 
 class RealWorld4_UnmemoizablePojo_0() {
diff --git a/compose/runtime/runtime/compose-runtime-benchmark/src/androidTest/java/androidx/compose/runtime/benchmark/siblings/SiblingManagement.kt b/compose/runtime/runtime/compose-runtime-benchmark/src/androidTest/java/androidx/compose/runtime/benchmark/siblings/SiblingManagement.kt
index 818adec..4dccb10 100644
--- a/compose/runtime/runtime/compose-runtime-benchmark/src/androidTest/java/androidx/compose/runtime/benchmark/siblings/SiblingManagement.kt
+++ b/compose/runtime/runtime/compose-runtime-benchmark/src/androidTest/java/androidx/compose/runtime/benchmark/siblings/SiblingManagement.kt
@@ -43,16 +43,18 @@
     // the complexity of this will influence the benchmark a lot because if
     // identity doesn't influence what the component looks like, it's not
     // very important to track it.
-    val background = when (item.id % 3) {
-        0 -> blueBackground
-        1 -> blackBackground
-        else -> magentaBackground
-    }
-    val style = when (item.id % 3) {
-        0 -> blackStyle
-        1 -> blueStyle
-        else -> magentaStyle
-    }
+    val background =
+        when (item.id % 3) {
+            0 -> blueBackground
+            1 -> blackBackground
+            else -> magentaBackground
+        }
+    val style =
+        when (item.id % 3) {
+            0 -> blackStyle
+            1 -> blueStyle
+            else -> magentaStyle
+        }
     Row(Modifier.fillMaxWidth()) {
         Box(Modifier.fillMaxSize().then(background))
         Text(text = "${item.id}", style = style)
@@ -61,13 +63,22 @@
 
 data class Item(val id: Int)
 
-enum class IdentityType { Index, Key }
+enum class IdentityType {
+    Index,
+    Key
+}
 
 enum class ReorderType {
-    Shuffle, ShiftRight, ShiftLeft, Swap,
-    AddEnd, RemoveEnd,
-    AddStart, RemoveStart,
-    AddMiddle, RemoveMiddle
+    Shuffle,
+    ShiftRight,
+    ShiftLeft,
+    Swap,
+    AddEnd,
+    RemoveEnd,
+    AddStart,
+    RemoveStart,
+    AddMiddle,
+    RemoveMiddle
 }
 
 fun <T> List<T>.move(from: Int, to: Int): List<T> {
@@ -93,9 +104,8 @@
         ReorderType.RemoveEnd -> dropLast(1)
         ReorderType.AddStart -> listOf(factory(size)) + this
         ReorderType.RemoveStart -> drop(1)
-        ReorderType.AddMiddle -> random.nextInt(size).let {
-            subList(0, it) + listOf(factory(size)) + subList(it, size)
-        }
+        ReorderType.AddMiddle ->
+            random.nextInt(size).let { subList(0, it) + listOf(factory(size)) + subList(it, size) }
         ReorderType.RemoveMiddle -> random.nextInt(size).let { filterIndexed { i, _ -> i == it } }
     }
 }
@@ -111,9 +121,7 @@
             }
             IdentityType.Key -> {
                 for (item in items) {
-                    key(item.id) {
-                        ItemRow(item = item)
-                    }
+                    key(item.id) { ItemRow(item = item) }
                 }
             }
         }
diff --git a/compose/runtime/runtime/compose-runtime-benchmark/src/androidTest/java/androidx/compose/runtime/benchmark/state/ComposeStateReadBenchmark.kt b/compose/runtime/runtime/compose-runtime-benchmark/src/androidTest/java/androidx/compose/runtime/benchmark/state/ComposeStateReadBenchmark.kt
index 8916a28..2283e82 100644
--- a/compose/runtime/runtime/compose-runtime-benchmark/src/androidTest/java/androidx/compose/runtime/benchmark/state/ComposeStateReadBenchmark.kt
+++ b/compose/runtime/runtime/compose-runtime-benchmark/src/androidTest/java/androidx/compose/runtime/benchmark/state/ComposeStateReadBenchmark.kt
@@ -39,7 +39,7 @@
 class ComposeStateReadBenchmark(private val readContext: ReadContext) {
     enum class ReadContext {
         Composition,
-        Measure;
+        Measure
     }
 
     companion object {
@@ -51,16 +51,13 @@
         fun parameters() = arrayOf(ReadContext.Composition, ReadContext.Measure)
     }
 
-    @get:Rule
-    val benchmarkRule = BenchmarkRule()
+    @get:Rule val benchmarkRule = BenchmarkRule()
 
     @Test
     fun readState() {
         val state = mutableIntStateOf(0)
 
-        benchmarkRead {
-            state.value
-        }
+        benchmarkRead { state.value }
     }
 
     @Test
@@ -71,9 +68,7 @@
 
         derivedState.value // precompute result
 
-        benchmarkRead {
-            derivedState.value
-        }
+        benchmarkRead { derivedState.value }
     }
 
     @Test
@@ -84,9 +79,7 @@
 
         derivedState.value // precompute result
 
-        benchmarkRead(before = { derivedState.value }) {
-            derivedState.value
-        }
+        benchmarkRead(before = { derivedState.value }) { derivedState.value }
     }
 
     @Test
@@ -97,18 +90,14 @@
 
         derivedState.value // precompute result
 
-        benchmarkRead(before = { stateA.value += 1 }) {
-            derivedState.value
-        }
+        benchmarkRead(before = { stateA.value += 1 }) { derivedState.value }
     }
 
     @Test
     fun readState_afterWrite() {
         val stateA = mutableIntStateOf(0)
 
-        benchmarkRead(before = { stateA.value += 1 }) {
-            stateA.value
-        }
+        benchmarkRead(before = { stateA.value += 1 }) { stateA.value }
     }
 
     @Test
@@ -116,9 +105,7 @@
         val stateA = mutableIntStateOf(0)
         val stateB = mutableIntStateOf(0)
 
-        benchmarkRead(before = { stateA.value }) {
-            stateB.value
-        }
+        benchmarkRead(before = { stateA.value }) { stateB.value }
     }
 
     @Test
@@ -129,9 +116,7 @@
         val derivedStateA = derivedStateOf { stateA.value + stateB.value }
         val derivedStateB = derivedStateOf { stateB.value + stateA.value }
 
-        benchmarkRead(before = { derivedStateA.value }) {
-            derivedStateB.value
-        }
+        benchmarkRead(before = { derivedStateA.value }) { derivedStateB.value }
     }
 
     private fun benchmarkRead(
@@ -161,17 +146,16 @@
             ReadContext.Measure -> {
                 val snapshot = Snapshot.takeMutableSnapshot()
                 snapshot.enter {
-                    SnapshotStateObserver { it() }.apply {
-                        val nodes = List(MEASURE_OBSERVATION_DEPTH) { Any() }
-                        start()
-                        recursiveObserve(nodes, nodes.size, scopeBlock)
-                        stop()
-                    }
+                    SnapshotStateObserver { it() }
+                        .apply {
+                            val nodes = List(MEASURE_OBSERVATION_DEPTH) { Any() }
+                            start()
+                            recursiveObserve(nodes, nodes.size, scopeBlock)
+                            stop()
+                        }
                 }
                 val applyResult = snapshot.apply()
-                check(applyResult !is SnapshotApplyResult.Failure) {
-                    "Failed to apply snapshot"
-                }
+                check(applyResult !is SnapshotApplyResult.Failure) { "Failed to apply snapshot" }
                 snapshot.dispose()
             }
         }
@@ -201,12 +185,19 @@
 
     private class UnitApplier : Applier<Unit> {
         override val current: Unit = Unit
+
         override fun clear() {}
+
         override fun move(from: Int, to: Int, count: Int) {}
+
         override fun remove(index: Int, count: Int) {}
+
         override fun up() {}
+
         override fun insertTopDown(index: Int, instance: Unit) {}
+
         override fun insertBottomUp(index: Int, instance: Unit) {}
+
         override fun down(node: Unit) {}
     }
 }
diff --git a/compose/runtime/runtime/integration-tests/src/androidInstrumentedTest/kotlin/androidx/compose/runtime/AndroidCompositionObserverTests.kt b/compose/runtime/runtime/integration-tests/src/androidInstrumentedTest/kotlin/androidx/compose/runtime/AndroidCompositionObserverTests.kt
index 6d654e4..38d41aa 100644
--- a/compose/runtime/runtime/integration-tests/src/androidInstrumentedTest/kotlin/androidx/compose/runtime/AndroidCompositionObserverTests.kt
+++ b/compose/runtime/runtime/integration-tests/src/androidInstrumentedTest/kotlin/androidx/compose/runtime/AndroidCompositionObserverTests.kt
@@ -31,29 +31,30 @@
 @MediumTest
 @RunWith(AndroidJUnit4::class)
 class AndroidCompositionObserverTests : BaseComposeTest() {
-    @get:Rule
-    override val activityRule = makeTestActivityRule()
+    @get:Rule override val activityRule = makeTestActivityRule()
 
     @OptIn(ExperimentalComposeRuntimeApi::class)
     @Test
     fun testObservingUiComposition() {
         var handle: CompositionObserverHandle? = null
         compose {
-            val view = LocalView.current
-            val composition = view.getTag(R.id.wrapped_composition_tag) as Composition
-            handle = composition.observe(object : CompositionObserver {
-                override fun onBeginComposition(
-                    composition: Composition,
-                    invalidationMap: Map<RecomposeScope, Set<Any>?>
-                ) {
-                }
+                val view = LocalView.current
+                val composition = view.getTag(R.id.wrapped_composition_tag) as Composition
+                handle =
+                    composition.observe(
+                        object : CompositionObserver {
+                            override fun onBeginComposition(
+                                composition: Composition,
+                                invalidationMap: Map<RecomposeScope, Set<Any>?>
+                            ) {}
 
-                override fun onEndComposition(composition: Composition) {
-                }
-            })
-        }.then {
-            assertNotNull(handle)
-            handle?.dispose()
-        }
+                            override fun onEndComposition(composition: Composition) {}
+                        }
+                    )
+            }
+            .then {
+                assertNotNull(handle)
+                handle?.dispose()
+            }
     }
 }
diff --git a/compose/runtime/runtime/integration-tests/src/androidInstrumentedTest/kotlin/androidx/compose/runtime/AndroidMovableContentTests.kt b/compose/runtime/runtime/integration-tests/src/androidInstrumentedTest/kotlin/androidx/compose/runtime/AndroidMovableContentTests.kt
index 7f9f42d..eaea6f3 100644
--- a/compose/runtime/runtime/integration-tests/src/androidInstrumentedTest/kotlin/androidx/compose/runtime/AndroidMovableContentTests.kt
+++ b/compose/runtime/runtime/integration-tests/src/androidInstrumentedTest/kotlin/androidx/compose/runtime/AndroidMovableContentTests.kt
@@ -27,17 +27,14 @@
 @MediumTest
 @RunWith(AndroidJUnit4::class)
 class AndroidMovableContentTests : BaseComposeTest() {
-    @get:Rule
-    override val activityRule = makeTestActivityRule()
+    @get:Rule override val activityRule = makeTestActivityRule()
 
     @Test
     fun testMovableContentParameterInBoxWithConstraints() {
         var state by mutableStateOf(false)
         var lastSeen: Boolean? = null
         val content = movableContentOf { parameter: Boolean ->
-            val content = @Composable {
-                lastSeen = parameter
-            }
+            val content = @Composable { lastSeen = parameter }
             Container(content)
         }
 
@@ -62,22 +59,22 @@
         }
 
         compose {
-            if (state) {
-                content(true)
-            } else {
-                BoxWithConstraints {
-                    content(false)
+                if (state) {
+                    content(true)
+                } else {
+                    BoxWithConstraints { content(false) }
                 }
             }
-        }.then {
-            phase("In initial composition").expect(lastSeen).toEqual(state)
-            state = true
-        }.then {
-            phase("When setting state to true").expect(lastSeen).toEqual(state)
-            state = false
-        }.then {
-            phase("When setting state to false").expect(lastSeen).toEqual(state)
-        }.done()
+            .then {
+                phase("In initial composition").expect(lastSeen).toEqual(state)
+                state = true
+            }
+            .then {
+                phase("When setting state to true").expect(lastSeen).toEqual(state)
+                state = false
+            }
+            .then { phase("When setting state to false").expect(lastSeen).toEqual(state) }
+            .done()
 
         assertEquals("", failureReasons.joinToString())
     }
diff --git a/compose/runtime/runtime/integration-tests/src/androidInstrumentedTest/kotlin/androidx/compose/runtime/AndroidSnapshotTests.kt b/compose/runtime/runtime/integration-tests/src/androidInstrumentedTest/kotlin/androidx/compose/runtime/AndroidSnapshotTests.kt
index ab2247a..02bb382 100644
--- a/compose/runtime/runtime/integration-tests/src/androidInstrumentedTest/kotlin/androidx/compose/runtime/AndroidSnapshotTests.kt
+++ b/compose/runtime/runtime/integration-tests/src/androidInstrumentedTest/kotlin/androidx/compose/runtime/AndroidSnapshotTests.kt
@@ -26,37 +26,34 @@
 @LargeTest
 @RunWith(AndroidJUnit4::class)
 class AndroidSnapshotTests : BaseComposeTest() {
-    @get:Rule
-    override val activityRule = makeTestActivityRule()
+    @get:Rule override val activityRule = makeTestActivityRule()
 
     @Test // regression test for b/163903673
     fun testCommittingInABackgroundThread() {
         val states = Array(10000) { mutableStateOf(0) }
         var stop = false
         object : Thread() {
-            override fun run() {
-                while (!stop) {
-                    for (state in states) {
-                        state.value = state.value + 1
+                override fun run() {
+                    while (!stop) {
+                        for (state in states) {
+                            state.value = state.value + 1
+                        }
+                        sleep(1)
                     }
-                    sleep(1)
                 }
             }
-        }.start()
+            .start()
         try {
-            val unregister = Snapshot.registerApplyObserver { changed, _ ->
-                // Try to catch a concurrent modification exception
-                val iterator = changed.iterator()
-                while (iterator.hasNext()) {
-                    iterator.next()
-                }
-            }
-            try {
-                repeat(100) {
-                    activityRule.activity.uiThread {
-                        Snapshot.sendApplyNotifications()
+            val unregister =
+                Snapshot.registerApplyObserver { changed, _ ->
+                    // Try to catch a concurrent modification exception
+                    val iterator = changed.iterator()
+                    while (iterator.hasNext()) {
+                        iterator.next()
                     }
                 }
+            try {
+                repeat(100) { activityRule.activity.uiThread { Snapshot.sendApplyNotifications() } }
             } finally {
                 unregister.dispose()
             }
diff --git a/compose/runtime/runtime/integration-tests/src/androidInstrumentedTest/kotlin/androidx/compose/runtime/BaseComposeTest.kt b/compose/runtime/runtime/integration-tests/src/androidInstrumentedTest/kotlin/androidx/compose/runtime/BaseComposeTest.kt
index 187595c..c1c4778 100644
--- a/compose/runtime/runtime/integration-tests/src/androidInstrumentedTest/kotlin/androidx/compose/runtime/BaseComposeTest.kt
+++ b/compose/runtime/runtime/integration-tests/src/androidInstrumentedTest/kotlin/androidx/compose/runtime/BaseComposeTest.kt
@@ -15,6 +15,7 @@
  */
 
 @file:Suppress("PLUGIN_ERROR")
+
 package androidx.compose.runtime
 
 import android.app.Activity
@@ -35,22 +36,25 @@
 @Suppress("DEPRECATION")
 fun makeTestActivityRule() = androidx.test.rule.ActivityTestRule(TestActivity::class.java)
 
-internal val Activity.root get() = findViewById<ViewGroup>(android.R.id.content)
+internal val Activity.root
+    get() = findViewById<ViewGroup>(android.R.id.content)
 
 internal fun Activity.uiThread(block: () -> Unit) {
     val latch = CountDownLatch(1)
     var throwable: Throwable? = null
-    runOnUiThread(object : Runnable {
-        override fun run() {
-            try {
-                block()
-            } catch (e: Throwable) {
-                throwable = e
-            } finally {
-                latch.countDown()
+    runOnUiThread(
+        object : Runnable {
+            override fun run() {
+                try {
+                    block()
+                } catch (e: Throwable) {
+                    throwable = e
+                } finally {
+                    latch.countDown()
+                }
             }
         }
-    })
+    )
 
     val completed = latch.await(5, TimeUnit.SECONDS)
     if (!completed) error("UI thread work did not complete within 5 seconds")
@@ -58,10 +62,7 @@
         throw when (it) {
             is AssertionError -> AssertionError(it.localizedMessage, it)
             else ->
-                IllegalStateException(
-                    "UI thread threw an exception: ${it.localizedMessage}",
-                    it
-                )
+                IllegalStateException("UI thread threw an exception: ${it.localizedMessage}", it)
         }
     }
 }
@@ -78,9 +79,7 @@
         throw Exception("Cannot be run from the main thread")
     }
     val latch = CountDownLatch(1)
-    uiThread {
-        Choreographer.getInstance().postFrameCallback { latch.countDown() }
-    }
+    uiThread { Choreographer.getInstance().postFrameCallback { latch.countDown() } }
     assertTrue(latch.await(1, TimeUnit.MINUTES), "Time-out waiting for choreographer frame")
 }
 
@@ -89,29 +88,25 @@
     @Suppress("DEPRECATION")
     abstract val activityRule: androidx.test.rule.ActivityTestRule<TestActivity>
 
-    val activity get() = activityRule.activity
+    val activity
+        get() = activityRule.activity
 
-    fun compose(
-        composable: @Composable () -> Unit
-    ) = ComposeTester(
-        activity,
-        composable
-    )
+    fun compose(composable: @Composable () -> Unit) = ComposeTester(activity, composable)
 
     @Composable
     @Suppress("UNUSED_PARAMETER")
     fun subCompose(block: @Composable () -> Unit) {
-//        val reference = rememberCompositionContext()
-//        remember {
-//            Composition(
-//                UiApplier(View(activity)),
-//                reference
-//            )
-//        }.apply {
-//            setContent {
-//                block()
-//            }
-//        }
+        //        val reference = rememberCompositionContext()
+        //        remember {
+        //            Composition(
+        //                UiApplier(View(activity)),
+        //                reference
+        //            )
+        //        }.apply {
+        //            setContent {
+        //                block()
+        //            }
+        //        }
     }
 }
 
@@ -119,36 +114,24 @@
     inner class ActiveTest(val activity: Activity) {
         fun then(block: ActiveTest.(activity: Activity) -> Unit): ActiveTest {
             activity.waitForAFrame()
-            activity.uiThread {
-                block(activity)
-            }
+            activity.uiThread { block(activity) }
             return this
         }
 
         fun done() {
-            activity.uiThread {
-                activity.setContentView(View(activity))
-            }
+            activity.uiThread { activity.setContentView(View(activity)) }
             activity.waitForAFrame()
         }
     }
 
     private fun initialComposition(composable: @Composable () -> Unit) {
-        activity.show {
-            CompositionLocalProvider(
-                LocalContext provides activity
-            ) {
-                composable()
-            }
-        }
+        activity.show { CompositionLocalProvider(LocalContext provides activity) { composable() } }
     }
 
     fun then(block: ComposeTester.(activity: Activity) -> Unit): ActiveTest {
         initialComposition(composable)
         activity.waitForAFrame()
-        activity.uiThread {
-            block(activity)
-        }
+        activity.uiThread { block(activity) }
         return ActiveTest(activity)
     }
 }
diff --git a/compose/runtime/runtime/integration-tests/src/androidInstrumentedTest/kotlin/androidx/compose/runtime/ComposeIntoTests.kt b/compose/runtime/runtime/integration-tests/src/androidInstrumentedTest/kotlin/androidx/compose/runtime/ComposeIntoTests.kt
index 373961f..201ce21 100644
--- a/compose/runtime/runtime/integration-tests/src/androidInstrumentedTest/kotlin/androidx/compose/runtime/ComposeIntoTests.kt
+++ b/compose/runtime/runtime/integration-tests/src/androidInstrumentedTest/kotlin/androidx/compose/runtime/ComposeIntoTests.kt
@@ -35,8 +35,7 @@
 
 @RunWith(AndroidJUnit4::class)
 class ComposeIntoTests : BaseComposeTest() {
-    @get:Rule
-    override val activityRule = makeTestActivityRule()
+    @get:Rule override val activityRule = makeTestActivityRule()
 
     @Test
     @MediumTest
@@ -44,12 +43,13 @@
         val activity = activityRule.activity
 
         var initializationCount = 0
-        val composable = @Composable {
-            DisposableEffect(Unit) {
-                initializationCount++
-                onDispose { }
+        val composable =
+            @Composable {
+                DisposableEffect(Unit) {
+                    initializationCount++
+                    onDispose {}
+                }
             }
-        }
 
         activity.show(composable)
         activity.waitForAFrame()
@@ -88,9 +88,7 @@
             compositionLatch.wait()
             assertEquals(1, composed)
         } finally {
-            activity.runOnUiThread {
-                activity.setContentView(View(activity))
-            }
+            activity.runOnUiThread { activity.setContentView(View(activity)) }
             thread.quitSafely()
         }
     }
diff --git a/compose/runtime/runtime/integration-tests/src/androidInstrumentedTest/kotlin/androidx/compose/runtime/CompositeHashTests.kt b/compose/runtime/runtime/integration-tests/src/androidInstrumentedTest/kotlin/androidx/compose/runtime/CompositeHashTests.kt
index f14249d..12f18e5 100644
--- a/compose/runtime/runtime/integration-tests/src/androidInstrumentedTest/kotlin/androidx/compose/runtime/CompositeHashTests.kt
+++ b/compose/runtime/runtime/integration-tests/src/androidInstrumentedTest/kotlin/androidx/compose/runtime/CompositeHashTests.kt
@@ -31,8 +31,7 @@
 @RunWith(AndroidJUnit4::class)
 class CompositeHashTests : BaseComposeTest() {
 
-    @get:Rule
-    override val activityRule = makeTestActivityRule()
+    @get:Rule override val activityRule = makeTestActivityRule()
 
     @Test // b/338478720
     @MediumTest
@@ -43,11 +42,12 @@
         activity.show {
             AnimatedVisibility(
                 true,
-                modifier = if (useFirstModifier) {
-                    Modifier.consumeWindowInsets(PaddingValues(0.dp))
-                } else {
-                    Modifier
-                },
+                modifier =
+                    if (useFirstModifier) {
+                        Modifier.consumeWindowInsets(PaddingValues(0.dp))
+                    } else {
+                        Modifier
+                    },
             ) {
                 val hash = currentCompositeKeyHash
                 val original = remember { hash }
diff --git a/compose/runtime/runtime/integration-tests/src/androidInstrumentedTest/kotlin/androidx/compose/runtime/ContextReceiverTests.kt b/compose/runtime/runtime/integration-tests/src/androidInstrumentedTest/kotlin/androidx/compose/runtime/ContextReceiverTests.kt
index 5fb7c53..9d6d365 100644
--- a/compose/runtime/runtime/integration-tests/src/androidInstrumentedTest/kotlin/androidx/compose/runtime/ContextReceiverTests.kt
+++ b/compose/runtime/runtime/integration-tests/src/androidInstrumentedTest/kotlin/androidx/compose/runtime/ContextReceiverTests.kt
@@ -27,8 +27,7 @@
 @RunWith(AndroidJUnit4::class)
 class ContextReceiverTests : BaseComposeTest() {
 
-    @get:Rule
-    override val activityRule = makeTestActivityRule()
+    @get:Rule override val activityRule = makeTestActivityRule()
 
     @Test
     fun testDefaultParams() {
@@ -50,7 +49,8 @@
     }
 
     context(CtxA)
-    @Composable fun composableA(
+    @Composable
+    fun composableA(
         param1: Int,
         param2: String = "Hello",
         onBodyInvoked: (Int, String, String) -> Unit
@@ -73,18 +73,15 @@
     }
 
     context(CtxA)
-    @Composable fun composableAB(
-        param1: Int = 1,
-        onBodyInvoked: (Int, String, String) -> Unit
-    ) {
+    @Composable
+    fun composableAB(param1: Int = 1, onBodyInvoked: (Int, String, String) -> Unit) {
         val ctx = CtxB()
-        with(ctx) {
-            composableB(param1 = param1, onBodyInvoked = onBodyInvoked)
-        }
+        with(ctx) { composableB(param1 = param1, onBodyInvoked = onBodyInvoked) }
     }
 
     context(CtxA, CtxB)
-    @Composable fun composableB(
+    @Composable
+    fun composableB(
         param1: Int,
         param2: String = "Hello",
         onBodyInvoked: (Int, String, String) -> Unit
@@ -96,6 +93,7 @@
     class CtxA {
         fun getA() = "A"
     }
+
     class CtxB {
         fun getB() = "B"
     }
diff --git a/compose/runtime/runtime/integration-tests/src/androidInstrumentedTest/kotlin/androidx/compose/runtime/DisposeTests.kt b/compose/runtime/runtime/integration-tests/src/androidInstrumentedTest/kotlin/androidx/compose/runtime/DisposeTests.kt
index c6edc91..33a345e 100644
--- a/compose/runtime/runtime/integration-tests/src/androidInstrumentedTest/kotlin/androidx/compose/runtime/DisposeTests.kt
+++ b/compose/runtime/runtime/integration-tests/src/androidInstrumentedTest/kotlin/androidx/compose/runtime/DisposeTests.kt
@@ -27,35 +27,32 @@
 @MediumTest
 @RunWith(AndroidJUnit4::class)
 class DisposeTests : BaseComposeTest() {
-    @get:Rule
-    override val activityRule = makeTestActivityRule()
+    @get:Rule override val activityRule = makeTestActivityRule()
 
-    private val NeverEqualObject = object {
-        override fun equals(other: Any?): Boolean {
-            return false
+    private val NeverEqualObject =
+        object {
+            override fun equals(other: Any?): Boolean {
+                return false
+            }
         }
-    }
 
     @Test
     fun testDisposeComposition() {
         val log = mutableListOf<String>()
 
         lateinit var recomposeScope: RecomposeScope
-        val composable = @Composable {
-            recomposeScope = currentRecomposeScope
-            DisposableEffect(NeverEqualObject) {
-                log.add("onCommit")
-                onDispose {
-                    log.add("onCommitDispose")
+        val composable =
+            @Composable {
+                recomposeScope = currentRecomposeScope
+                DisposableEffect(NeverEqualObject) {
+                    log.add("onCommit")
+                    onDispose { log.add("onCommitDispose") }
+                }
+                DisposableEffect(Unit) {
+                    log.add("onActive")
+                    onDispose { log.add("onActiveDispose") }
                 }
             }
-            DisposableEffect(Unit) {
-                log.add("onActive")
-                onDispose {
-                    log.add("onActiveDispose")
-                }
-            }
-        }
 
         fun assertLog(expected: String, block: () -> Unit) {
             log.clear()
@@ -74,9 +71,7 @@
         }
 
         assertLog("onActiveDispose, onCommitDispose") {
-            activity.uiThread {
-                activity.setContentView(View(activity))
-            }
+            activity.uiThread { activity.setContentView(View(activity)) }
             activity.waitForAFrame()
         }
 
diff --git a/compose/runtime/runtime/integration-tests/src/androidInstrumentedTest/kotlin/androidx/compose/runtime/EmittableComposer.kt b/compose/runtime/runtime/integration-tests/src/androidInstrumentedTest/kotlin/androidx/compose/runtime/EmittableComposer.kt
index 1ab873f..9f739db 100644
--- a/compose/runtime/runtime/integration-tests/src/androidInstrumentedTest/kotlin/androidx/compose/runtime/EmittableComposer.kt
+++ b/compose/runtime/runtime/integration-tests/src/androidInstrumentedTest/kotlin/androidx/compose/runtime/EmittableComposer.kt
@@ -23,31 +23,21 @@
 
 @Suppress("UNUSED_PARAMETER")
 @Composable
-fun TextView(
-    id: Int = 0,
-    text: String = "",
-    onClickListener: View.OnClickListener? = null
-) {
+fun TextView(id: Int = 0, text: String = "", onClickListener: View.OnClickListener? = null) {
     AndroidView(factory = { TextView(it) }) { view ->
         view.id = id
         view.text = text
-        if (onClickListener != null)
-            view.setOnClickListener(onClickListener)
+        if (onClickListener != null) view.setOnClickListener(onClickListener)
     }
 }
 
 @Suppress("UNUSED_PARAMETER")
 @Composable
-fun Button(
-    id: Int = 0,
-    text: String = "",
-    onClickListener: View.OnClickListener? = null
-) {
+fun Button(id: Int = 0, text: String = "", onClickListener: View.OnClickListener? = null) {
     AndroidView(factory = { Button(it) }) { view ->
         view.id = id
         view.text = text
-        if (onClickListener != null)
-            view.setOnClickListener(onClickListener)
+        if (onClickListener != null) view.setOnClickListener(onClickListener)
     }
 }
 
diff --git a/compose/runtime/runtime/integration-tests/src/androidInstrumentedTest/kotlin/androidx/compose/runtime/FlowAdapterTest.kt b/compose/runtime/runtime/integration-tests/src/androidInstrumentedTest/kotlin/androidx/compose/runtime/FlowAdapterTest.kt
index 7d7a083..4b18939 100644
--- a/compose/runtime/runtime/integration-tests/src/androidInstrumentedTest/kotlin/androidx/compose/runtime/FlowAdapterTest.kt
+++ b/compose/runtime/runtime/integration-tests/src/androidInstrumentedTest/kotlin/androidx/compose/runtime/FlowAdapterTest.kt
@@ -34,25 +34,18 @@
 @RunWith(AndroidJUnit4::class)
 class FlowAdapterTest {
 
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
     @Test
     fun weReceiveSubmittedValue() {
         val stream = MutableSharedFlow<String>(extraBufferCapacity = 1)
 
         var realValue: String? = null
-        rule.setContent {
-            realValue = stream.collectAsState(initial = null).value
-        }
+        rule.setContent { realValue = stream.collectAsState(initial = null).value }
 
-        rule.runOnIdle {
-            stream.tryEmit("value")
-        }
+        rule.runOnIdle { stream.tryEmit("value") }
 
-        rule.runOnIdle {
-            assertThat(realValue).isEqualTo("value")
-        }
+        rule.runOnIdle { assertThat(realValue).isEqualTo("value") }
     }
 
     @Test
@@ -60,22 +53,16 @@
         val stream = MutableSharedFlow<String>(extraBufferCapacity = 1)
 
         var realValue: String? = null
-        rule.setContent {
-            realValue = stream.collectAsState(initial = null).value
-        }
+        rule.setContent { realValue = stream.collectAsState(initial = null).value }
 
-        rule.runOnIdle {
-            stream.tryEmit("value")
-        }
+        rule.runOnIdle { stream.tryEmit("value") }
 
         rule.runOnIdle {
             assertThat(realValue).isEqualTo("value")
             stream.tryEmit("value2")
         }
 
-        rule.runOnIdle {
-            assertThat(realValue).isEqualTo("value2")
-        }
+        rule.runOnIdle { assertThat(realValue).isEqualTo("value2") }
     }
 
     @Test
@@ -91,22 +78,16 @@
 
         rule.runOnIdle { emit = false }
 
-        rule.runOnIdle {
-            stream.tryEmit("value")
-        }
+        rule.runOnIdle { stream.tryEmit("value") }
 
-        rule.runOnIdle {
-            assertThat(realValue).isNull()
-        }
+        rule.runOnIdle { assertThat(realValue).isNull() }
     }
 
     @Test
     fun testCollectionWithInitialValue() {
         val stream = MutableSharedFlow<String>(extraBufferCapacity = 1)
         var realValue = "to-be-updated"
-        rule.setContent {
-            realValue = stream.collectAsState("value").value
-        }
+        rule.setContent { realValue = stream.collectAsState("value").value }
 
         assertThat(realValue).isEqualTo("value")
     }
@@ -115,17 +96,11 @@
     fun testOverridingInitialValue() {
         val stream = MutableSharedFlow<String>(extraBufferCapacity = 1)
         var realValue = "to-be-updated"
-        rule.setContent {
-            realValue = stream.collectAsState("value").value
-        }
+        rule.setContent { realValue = stream.collectAsState("value").value }
 
-        rule.runOnIdle {
-            stream.tryEmit("value2")
-        }
+        rule.runOnIdle { stream.tryEmit("value2") }
 
-        rule.runOnIdle {
-            assertThat(realValue).isEqualTo("value2")
-        }
+        rule.runOnIdle { assertThat(realValue).isEqualTo("value2") }
     }
 
     @Test
@@ -134,17 +109,11 @@
         var initial by mutableStateOf("initial1")
 
         var realValue: String? = null
-        rule.setContent {
-            realValue = stream.collectAsState(initial).value
-        }
+        rule.setContent { realValue = stream.collectAsState(initial).value }
 
-        rule.runOnIdle {
-            initial = "initial2"
-        }
+        rule.runOnIdle { initial = "initial2" }
 
-        rule.runOnIdle {
-            assertThat(realValue).isEqualTo("initial1")
-        }
+        rule.runOnIdle { assertThat(realValue).isEqualTo("initial1") }
     }
 
     @Test
@@ -154,25 +123,15 @@
         var stream by mutableStateOf(stream1)
 
         var realValue: String? = null
-        rule.setContent {
-            realValue = stream.collectAsState(initial = null).value
-        }
+        rule.setContent { realValue = stream.collectAsState(initial = null).value }
 
-        rule.runOnIdle {
-            stream = stream2
-        }
+        rule.runOnIdle { stream = stream2 }
 
-        rule.runOnIdle {
-            stream2.tryEmit("stream2")
-        }
+        rule.runOnIdle { stream2.tryEmit("stream2") }
 
-        rule.runOnIdle {
-            stream1.tryEmit("stream1")
-        }
+        rule.runOnIdle { stream1.tryEmit("stream1") }
 
-        rule.runOnIdle {
-            assertThat(realValue).isEqualTo("stream2")
-        }
+        rule.runOnIdle { assertThat(realValue).isEqualTo("stream2") }
     }
 
     @Test
@@ -182,21 +141,13 @@
         var stream by mutableStateOf(stream1)
 
         var realValue: String? = null
-        rule.setContent {
-            realValue = stream.collectAsState(initial = null).value
-        }
+        rule.setContent { realValue = stream.collectAsState(initial = null).value }
 
-        rule.runOnIdle {
-            stream1.tryEmit("value")
-        }
+        rule.runOnIdle { stream1.tryEmit("value") }
 
-        rule.runOnIdle {
-            stream = stream2
-        }
+        rule.runOnIdle { stream = stream2 }
 
-        rule.runOnIdle {
-            assertThat(realValue).isEqualTo("value")
-        }
+        rule.runOnIdle { assertThat(realValue).isEqualTo("value") }
     }
 
     @Ignore("b/177256608")
@@ -205,13 +156,9 @@
         val stream = MutableSharedFlow<String>(extraBufferCapacity = 1)
 
         var realValue: String? = null
-        rule.setContent {
-            realValue = stream.collectAsState(null, Dispatchers.Default).value
-        }
+        rule.setContent { realValue = stream.collectAsState(null, Dispatchers.Default).value }
 
-        rule.runOnUiThread {
-            stream.tryEmit("value")
-        }
+        rule.runOnUiThread { stream.tryEmit("value") }
 
         rule.waitUntil { realValue != null }
         assertThat(realValue).isEqualTo("value")
@@ -223,64 +170,42 @@
         var context by mutableStateOf<CoroutineContext>(Dispatchers.Main)
 
         var realValue: String? = null
-        rule.setContent {
-            realValue = stream.collectAsState(null, context).value
-        }
+        rule.setContent { realValue = stream.collectAsState(null, context).value }
 
-        rule.runOnIdle {
-            stream.tryEmit("value")
-        }
+        rule.runOnIdle { stream.tryEmit("value") }
 
-        rule.runOnIdle {
-            context = Dispatchers.IO
-        }
+        rule.runOnIdle { context = Dispatchers.IO }
 
-        rule.runOnIdle {
-            assertThat(realValue).isEqualTo("value")
-        }
+        rule.runOnIdle { assertThat(realValue).isEqualTo("value") }
     }
 
     @Test
     fun testInitialValueOfStateFlow() {
         val flow = MutableStateFlow("initial")
         var realValue = "to-be-updated"
-        rule.setContent {
-            realValue = flow.collectAsState().value
-        }
+        rule.setContent { realValue = flow.collectAsState().value }
 
-        rule.runOnIdle {
-            assertThat(realValue).isEqualTo("initial")
-        }
+        rule.runOnIdle { assertThat(realValue).isEqualTo("initial") }
     }
 
     @Test
     fun stateFlowHandlesNullValue() {
         val flow = MutableStateFlow<String?>(null)
         var realValue: String? = "to-be-updated"
-        rule.setContent {
-            realValue = flow.collectAsState().value
-        }
+        rule.setContent { realValue = flow.collectAsState().value }
 
-        rule.runOnIdle {
-            assertThat(realValue).isNull()
-        }
+        rule.runOnIdle { assertThat(realValue).isNull() }
     }
 
     @Test
     fun updatingValueOfStateFlow() {
         val flow = MutableStateFlow("initial")
         var realValue = "to-be-updated"
-        rule.setContent {
-            realValue = flow.collectAsState().value
-        }
+        rule.setContent { realValue = flow.collectAsState().value }
 
-        rule.runOnIdle {
-            flow.value = "updated"
-        }
+        rule.runOnIdle { flow.value = "updated" }
 
-        rule.runOnIdle {
-            assertThat(realValue).isEqualTo("updated")
-        }
+        rule.runOnIdle { assertThat(realValue).isEqualTo("updated") }
     }
 
     @Test // Regression test for 232007227
@@ -288,10 +213,11 @@
         class Car(val model: String)
         class Person(val name: String, val car: MutableStateFlow<Car>)
 
-        val people = mutableListOf<MutableStateFlow<Person?>>(
-            MutableStateFlow(Person("Ford", MutableStateFlow(Car("Model T")))),
-            MutableStateFlow(Person("Musk", MutableStateFlow(Car("Model 3"))))
-        )
+        val people =
+            mutableListOf<MutableStateFlow<Person?>>(
+                MutableStateFlow(Person("Ford", MutableStateFlow(Car("Model T")))),
+                MutableStateFlow(Person("Musk", MutableStateFlow(Car("Model 3"))))
+            )
 
         var carValue: Any? = null
 
@@ -307,12 +233,8 @@
             }
         }
 
-        rule.runOnIdle {
-            people[0].value = null
-        }
+        rule.runOnIdle { people[0].value = null }
 
-        rule.runOnIdle {
-            assertNotNull(carValue)
-        }
+        rule.runOnIdle { assertNotNull(carValue) }
     }
 }
diff --git a/compose/runtime/runtime/integration-tests/src/androidInstrumentedTest/kotlin/androidx/compose/runtime/GroupSizeTests.kt b/compose/runtime/runtime/integration-tests/src/androidInstrumentedTest/kotlin/androidx/compose/runtime/GroupSizeTests.kt
index 4731f73..df9d671 100644
--- a/compose/runtime/runtime/integration-tests/src/androidInstrumentedTest/kotlin/androidx/compose/runtime/GroupSizeTests.kt
+++ b/compose/runtime/runtime/integration-tests/src/androidInstrumentedTest/kotlin/androidx/compose/runtime/GroupSizeTests.kt
@@ -33,20 +33,13 @@
 
 @RunWith(AndroidJUnit4::class)
 class GroupSizeTests : BaseComposeTest() {
-    @get:Rule
-    override val activityRule = makeTestActivityRule()
+    @get:Rule override val activityRule = makeTestActivityRule()
 
     @Test
     @MediumTest
     @Ignore("Only run explicitly to check framework")
     fun spacerSize() {
-        slotExpect(
-            "spacerSize",
-            noMoreGroupsThan = 8,
-            noMoreSlotsThan = 10
-        ) {
-            Spacer(Modifier)
-        }
+        slotExpect("spacerSize", noMoreGroupsThan = 8, noMoreSlotsThan = 10) { Spacer(Modifier) }
     }
 
     @Test
@@ -58,7 +51,7 @@
             noMoreGroupsThan = 154,
             noMoreSlotsThan = 179,
         ) {
-            Checkbox(true, onCheckedChange = { })
+            Checkbox(true, onCheckedChange = {})
         }
     }
 
@@ -66,26 +59,14 @@
     @MediumTest
     @Ignore("Only run explicitly to check framework")
     fun textSize() {
-        slotExpect(
-            "textSize",
-            noMoreGroupsThan = 13,
-            noMoreSlotsThan = 12
-        ) {
-            Text("")
-        }
+        slotExpect("textSize", noMoreGroupsThan = 13, noMoreSlotsThan = 12) { Text("") }
     }
 
     @Test
     @MediumTest
     @Ignore("Only run explicitly to check framework")
     fun boxSize() {
-        slotExpect(
-            "boxSize",
-            noMoreGroupsThan = 9,
-            noMoreSlotsThan = 10
-        ) {
-            Box { }
-        }
+        slotExpect("boxSize", noMoreGroupsThan = 9, noMoreSlotsThan = 10) { Box {} }
     }
 
     @Test
@@ -97,9 +78,7 @@
             noMoreGroupsThan = 165,
             noMoreSlotsThan = 193,
         ) {
-            androidx.compose.material.Button({ }) {
-                Text("Click me")
-            }
+            androidx.compose.material.Button({}) { Text("Click me") }
         }
     }
 
@@ -107,13 +86,7 @@
     @MediumTest
     @Ignore("Only run explicitly to check framework")
     fun columnSize() {
-        slotExpect(
-            "columnSize",
-            noMoreGroupsThan = 9,
-            noMoreSlotsThan = 13
-        ) {
-            Column { }
-        }
+        slotExpect("columnSize", noMoreGroupsThan = 9, noMoreSlotsThan = 13) { Column {} }
     }
 
     private fun slotExpect(
@@ -124,31 +97,33 @@
     ) {
         var compositionData: CompositionData? = null
         compose {
-            compositionData = currentComposer.compositionData
-            currentComposer.disableSourceInformation()
-            Marker { content() }
-        }.then {
-            val group = findMarkerGroup(compositionData!!)
-            val receivedGroups = group.groupSize
-            val receivedSlots = group.slotsSize
+                compositionData = currentComposer.compositionData
+                currentComposer.disableSourceInformation()
+                Marker { content() }
+            }
+            .then {
+                val group = findMarkerGroup(compositionData!!)
+                val receivedGroups = group.groupSize
+                val receivedSlots = group.slotsSize
 
-            if (receivedGroups > noMoreGroupsThan || receivedSlots > noMoreSlotsThan) {
-                error("Expected $noMoreGroupsThan groups and $noMoreSlotsThan slots " +
-                    "but received $receivedGroups and $receivedSlots\n" +
-                    "If this was expected execute the gradlew command:\n   ${
+                if (receivedGroups > noMoreGroupsThan || receivedSlots > noMoreSlotsThan) {
+                    error(
+                        "Expected $noMoreGroupsThan groups and $noMoreSlotsThan slots " +
+                            "but received $receivedGroups and $receivedSlots\n" +
+                            "If this was expected execute the gradlew command:\n   ${
                         updateTestCommand(name, receivedGroups, receivedSlots)
                     }"
-                )
+                    )
+                }
+                if (receivedSlots < noMoreSlotsThan || receivedGroups < noMoreGroupsThan) {
+                    println(
+                        "WARNING: Improvement detected. Update test GroupSizeTests.$name to\n" +
+                            "If this was expected, running the gradle command:\n\n" +
+                            "   ${updateTestCommand(name, receivedGroups, receivedSlots)}\n\n" +
+                            "is recommended"
+                    )
+                }
             }
-            if (receivedSlots < noMoreSlotsThan || receivedGroups < noMoreGroupsThan) {
-                println(
-                    "WARNING: Improvement detected. Update test GroupSizeTests.$name to\n" +
-                    "If this was expected, running the gradle command:\n\n" +
-                    "   ${updateTestCommand(name, receivedGroups, receivedSlots)}\n\n" +
-                    "is recommended"
-                )
-            }
-        }
     }
 }
 
@@ -162,19 +137,19 @@
     fun findGroup(groups: Iterable<CompositionGroup>, key: Int): CompositionGroup? {
         for (group in groups) {
             if (group.key == key) return group
-            findGroup(group.compositionGroups, key)?.let { return it }
+            findGroup(group.compositionGroups, key)?.let {
+                return it
+            }
         }
         return null
     }
 
     return findGroup(compositionData.compositionGroups, MarkerGroup)
         ?.compositionGroups
-        ?.firstOrNull()
-        ?: error("Could not find marker")
+        ?.firstOrNull() ?: error("Could not find marker")
 }
 
-@Composable
-private inline fun Marker(content: @Composable () -> Unit) = content()
+@Composable private inline fun Marker(content: @Composable () -> Unit) = content()
 
 // left unused for debugging. This is useful for debugging differences in the slot table
 @Suppress("unused")
diff --git a/compose/runtime/runtime/integration-tests/src/androidInstrumentedTest/kotlin/androidx/compose/runtime/LiveEditApiTests.kt b/compose/runtime/runtime/integration-tests/src/androidInstrumentedTest/kotlin/androidx/compose/runtime/LiveEditApiTests.kt
index 8f1e69d..e82df85 100644
--- a/compose/runtime/runtime/integration-tests/src/androidInstrumentedTest/kotlin/androidx/compose/runtime/LiveEditApiTests.kt
+++ b/compose/runtime/runtime/integration-tests/src/androidInstrumentedTest/kotlin/androidx/compose/runtime/LiveEditApiTests.kt
@@ -32,15 +32,13 @@
 @OptIn(InternalComposeApi::class)
 @RunWith(AndroidJUnit4::class)
 class LiveEditApiTests : BaseComposeTest() {
-    @get:Rule
-    override val activityRule = makeTestActivityRule()
+    @get:Rule override val activityRule = makeTestActivityRule()
 
     private fun invalidateGroup(key: Int) {
         invalidateGroupsWithKey(key)
     }
 
-    private fun compositionErrors(): List<Pair<Exception, Boolean>> =
-        currentCompositionErrors()
+    private fun compositionErrors(): List<Pair<Exception, Boolean>> = currentCompositionErrors()
 
     @Before
     fun setUp() {
@@ -80,9 +78,7 @@
     @MediumTest
     fun forceRecompose_Simple() {
         val activity = activityRule.activity
-        activity.show {
-            TestSimple()
-        }
+        activity.show { TestSimple() }
         activity.waitForAFrame()
 
         val someFunctionStart = someFunctionInvoked
@@ -90,10 +86,7 @@
         invalidateGroup(someFunctionKey)
         activity.waitForAFrame()
 
-        assertTrue(
-            "SomeFunction should have been invoked",
-            someFunctionInvoked > someFunctionStart
-        )
+        assertTrue("SomeFunction should have been invoked", someFunctionInvoked > someFunctionStart)
         assertTrue(
             "NestedContent should have been invoked",
             nestedContentInvoked > nestedContentStart
@@ -104,9 +97,7 @@
     @MediumTest
     fun forceRecompose_NonRestartable() {
         val activity = activityRule.activity
-        activity.show {
-            TestNonRestartable()
-        }
+        activity.show { TestNonRestartable() }
         activity.waitForAFrame()
 
         val nonRestartableStart = nonRestartableInvoked
@@ -141,9 +132,7 @@
     @Test
     @MediumTest
     fun throwError_doesntCrash() {
-        activity.show {
-            TestError()
-        }
+        activity.show { TestError() }
 
         activity.waitForAFrame()
 
@@ -152,10 +141,7 @@
             val errorStart = errorInvoked
             invalidateGroup(errorKey)
 
-            assertTrue(
-                "TestError should have been invoked",
-                errorInvoked > errorStart
-            )
+            assertTrue("TestError should have been invoked", errorInvoked > errorStart)
         }
     }
 
@@ -164,9 +150,7 @@
     fun throwError_invalidatesOnlyAfterHotReloadCall() {
         val shouldThrow = mutableStateOf(true)
 
-        activity.show {
-            TestError { shouldThrow.value }
-        }
+        activity.show { TestError { shouldThrow.value } }
 
         activity.waitForAFrame()
 
@@ -176,16 +160,10 @@
 
             activity.waitForAFrame()
 
-            assertTrue(
-                "TestError should not have been invoked",
-                errorInvoked == errorStart
-            )
+            assertTrue("TestError should not have been invoked", errorInvoked == errorStart)
 
             invalidateGroup(errorKey)
-            assertTrue(
-                "TestError should have been invoked",
-                errorInvoked > errorStart
-            )
+            assertTrue("TestError should have been invoked", errorInvoked > errorStart)
         }
     }
 
@@ -193,9 +171,7 @@
     @MediumTest
     fun throwError_recompose_doesntCrash() {
         val shouldThrow = mutableStateOf(false)
-        activity.show {
-            TestError { shouldThrow.value }
-        }
+        activity.show { TestError { shouldThrow.value } }
 
         activity.waitForAFrame()
 
@@ -217,9 +193,7 @@
     @MediumTest
     fun throwError_recompose_clearErrorOnInvalidate() {
         var shouldThrow by mutableStateOf(false)
-        activity.show {
-            TestError { shouldThrow }
-        }
+        activity.show { TestError { shouldThrow } }
 
         activity.waitForAFrame()
 
@@ -245,9 +219,7 @@
     @MediumTest
     fun throwError_returnsCurrentError() {
         var shouldThrow by mutableStateOf(true)
-        activity.show {
-            TestError { shouldThrow }
-        }
+        activity.show { TestError { shouldThrow } }
 
         activity.waitForAFrame()
 
@@ -268,9 +240,7 @@
     @Test
     @MediumTest
     fun throwErrorInEffect_doesntCrash() {
-        activity.show {
-            TestEffectError()
-        }
+        activity.show { TestEffectError() }
 
         activity.waitForAFrame()
 
@@ -296,9 +266,7 @@
     @MediumTest
     fun throwErrorInEffect_doesntRecoverOnInvalidate() {
         var shouldThrow = true
-        activity.show {
-            TestEffectError { shouldThrow }
-        }
+        activity.show { TestEffectError { shouldThrow } }
 
         activity.waitForAFrame()
 
@@ -320,9 +288,7 @@
     @MediumTest
     fun throwErrorInEffect_recoversOnReload() {
         var shouldThrow = true
-        activity.show {
-            TestEffectError { shouldThrow }
-        }
+        activity.show { TestEffectError { shouldThrow } }
 
         activity.waitForAFrame()
 
@@ -347,9 +313,7 @@
     @MediumTest
     fun throwErrorOnReload_recoversAfterInvalidate() {
         var shouldThrow = false
-        activity.show {
-            TestError { shouldThrow }
-        }
+        activity.show { TestError { shouldThrow } }
 
         activity.waitForAFrame()
 
@@ -377,9 +341,7 @@
     @MediumTest
     fun throwErrorOnReload_withNode() {
         var shouldThrow = false
-        activity.show {
-            TestTextWError(text = "abc") { shouldThrow }
-        }
+        activity.show { TestTextWError(text = "abc") { shouldThrow } }
 
         activity.waitForAFrame()
 
@@ -406,6 +368,7 @@
 
 const val someFunctionKey = -1580285603 // Extracted from .class file
 var someFunctionInvoked = 0
+
 @Composable
 fun SomeFunction(a: Int) {
     Text("a = $a, someData = ${someData.value}")
@@ -415,6 +378,7 @@
 
 const val nestedContentKey = 1771808426 // Extracted from .class file
 var nestedContentInvoked = 0
+
 @Composable
 fun NestedContent() {
     Text("Some nested content: ${someData.value}")
@@ -423,6 +387,7 @@
 
 const val nonRestartableKey = 1860384 // Extracted from .class file
 var nonRestartableInvoked = 0
+
 @Composable
 @NonRestartableComposable
 fun NonRestartable() {
@@ -432,6 +397,7 @@
 
 const val nonRestartWrapperKey = 1287143243 // Extracted from .class file
 var nonRestartWrapperInvoked = 0
+
 @Composable
 @NonRestartableComposable
 fun NonRestartWrapper(block: @Composable () -> Unit) {
@@ -443,6 +409,7 @@
 
 const val restartableWrapperKey = -153795690 // Extracted from .class file
 var restartWrapperInvoked = 0
+
 @Composable
 fun RestartableWrapper(block: @Composable () -> Unit) {
     Text("Before")
@@ -453,6 +420,7 @@
 
 const val readOnlyKey = -1414835162 // Extracted from .class file
 var readOnlyInvoked = 0
+
 @Composable
 @ReadOnlyComposable
 fun ReadOnly() {
@@ -478,13 +446,12 @@
 
 @Composable
 fun TestReadOnlyNested() {
-    RestartableWrapper {
-        ReadOnly()
-    }
+    RestartableWrapper { ReadOnly() }
 }
 
 private const val errorKey = -0x3d6d007a // Extracted from .class file
 private var errorInvoked = 0
+
 @Composable
 fun TestError(shouldThrow: () -> Boolean = { true }) {
     errorInvoked++
@@ -496,6 +463,7 @@
 
 private const val effectErrorKey = -0x43852062 // Extracted from .class file
 private var effectErrorInvoked = 0
+
 @Composable
 fun TestEffectError(shouldThrow: () -> Boolean = { true }) {
     effectErrorInvoked++
@@ -508,6 +476,7 @@
 }
 
 private var textInvoked = 0
+
 @Composable
 fun TestTextWError(text: String, shouldThrow: () -> Boolean = { true }) {
     textInvoked++
diff --git a/compose/runtime/runtime/integration-tests/src/androidInstrumentedTest/kotlin/androidx/compose/runtime/ProduceStateTests.kt b/compose/runtime/runtime/integration-tests/src/androidInstrumentedTest/kotlin/androidx/compose/runtime/ProduceStateTests.kt
index 6d7d71a..9a19126 100644
--- a/compose/runtime/runtime/integration-tests/src/androidInstrumentedTest/kotlin/androidx/compose/runtime/ProduceStateTests.kt
+++ b/compose/runtime/runtime/integration-tests/src/androidInstrumentedTest/kotlin/androidx/compose/runtime/ProduceStateTests.kt
@@ -28,8 +28,7 @@
 @MediumTest
 @RunWith(AndroidJUnit4::class)
 class ProduceStateTests {
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
     @Test
     fun testProducingState() {
@@ -37,15 +36,16 @@
         val emitter = Channel<Int>(Channel.BUFFERED)
 
         rule.setContent {
-            val state by produceState(0, emitter) {
-                for (item in emitter) {
-                    value = item
+            val state by
+                produceState(0, emitter) {
+                    for (item in emitter) {
+                        value = item
+                    }
                 }
-            }
 
             DisposableEffect(state) {
                 observedResult = state
-                onDispose { }
+                onDispose {}
             }
         }
 
diff --git a/compose/runtime/runtime/integration-tests/src/androidInstrumentedTest/kotlin/androidx/compose/runtime/RecomposerTests.kt b/compose/runtime/runtime/integration-tests/src/androidInstrumentedTest/kotlin/androidx/compose/runtime/RecomposerTests.kt
index 331ba8a..f91962a 100644
--- a/compose/runtime/runtime/integration-tests/src/androidInstrumentedTest/kotlin/androidx/compose/runtime/RecomposerTests.kt
+++ b/compose/runtime/runtime/integration-tests/src/androidInstrumentedTest/kotlin/androidx/compose/runtime/RecomposerTests.kt
@@ -41,21 +41,19 @@
 @RunWith(AndroidJUnit4::class)
 class RecomposerTests : BaseComposeTest() {
 
-    @get:Rule
-    override val activityRule = makeTestActivityRule()
+    @get:Rule override val activityRule = makeTestActivityRule()
 
     @Test
     fun testNativeViewWithAttributes() {
-        compose {
-            TextView(id = 456, text = "some text")
-        }.then { activity ->
-            assertEquals(1, activity.root.childCount)
+        compose { TextView(id = 456, text = "some text") }
+            .then { activity ->
+                assertEquals(1, activity.root.childCount)
 
-            val tv = activity.findViewById(456) as TextView
-            assertEquals("some text", tv.text)
+                val tv = activity.findViewById(456) as TextView
+                assertEquals("some text", tv.text)
 
-            assertEquals(tv, activity.root.traversal().first { it is TextView })
-        }
+                assertEquals(tv, activity.root.traversal().first { it is TextView })
+            }
     }
 
     @Test
@@ -64,41 +62,40 @@
         var tv1: TextView? = null
         val trigger = Trigger()
         compose {
-            trigger.subscribe()
-            // this should cause the textview to get recreated on every compose
-            i++
+                trigger.subscribe()
+                // this should cause the textview to get recreated on every compose
+                i++
 
-            key(i) {
-                TextView(id = 456, text = "some text")
+                key(i) { TextView(id = 456, text = "some text") }
             }
-        }.then { activity ->
-            tv1 = activity.findViewById(456) as TextView
-            trigger.recompose()
-        }.then { activity ->
-            assertEquals("Compose got called twice", 3, i)
+            .then { activity ->
+                tv1 = activity.findViewById(456) as TextView
+                trigger.recompose()
+            }
+            .then { activity ->
+                assertEquals("Compose got called twice", 3, i)
 
-            val tv2 = activity.findViewById(456) as TextView
+                val tv2 = activity.findViewById(456) as TextView
 
-            assertFalse(
-                "The text views should be different instances",
-                tv1 === tv2
-            )
+                assertFalse("The text views should be different instances", tv1 === tv2)
 
-            assertEquals(
-                "The unused child got removed from the view hierarchy",
-                1,
-                activity.root.childCount
-            )
-        }
+                assertEquals(
+                    "The unused child got removed from the view hierarchy",
+                    1,
+                    activity.root.childCount
+                )
+            }
     }
 
     // components for testing recompose behavior above
     sealed class ClickAction {
         object Recompose : ClickAction()
+
         class PerformOnView(val action: (View) -> Unit) : ClickAction()
     }
 
-    @Composable fun RecomposeTestComponentsB(counter: Counter, listener: ClickAction, id: Int = 0) {
+    @Composable
+    fun RecomposeTestComponentsB(counter: Counter, listener: ClickAction, id: Int = 0) {
         counter.inc("$id")
 
         val scope = currentRecomposeScope
@@ -118,39 +115,46 @@
     @Test
     fun testFrameTransition() {
         var snapshotId: Int? = null
-        compose {
-            snapshotId = Snapshot.current.id
-        }.then {
-            assertNotSame(snapshotId, Snapshot.current.id)
-        }
+        compose { snapshotId = Snapshot.current.id }
+            .then { assertNotSame(snapshotId, Snapshot.current.id) }
     }
 
     @Test
     @OptIn(ExperimentalCoroutinesApi::class, ExperimentalTestApi::class)
-    fun runningRecomposerFlow() = runTest(UnconfinedTestDispatcher()) {
-        lateinit var recomposer: RecomposerInfo
-        val recomposerJob = launch(TestMonotonicFrameClock(this)) {
-            withRunningRecomposer {
-                recomposer = it.asRecomposerInfo()
-                suspendCancellableCoroutine<Unit> { }
-            }
+    fun runningRecomposerFlow() =
+        runTest(UnconfinedTestDispatcher()) {
+            lateinit var recomposer: RecomposerInfo
+            val recomposerJob =
+                launch(TestMonotonicFrameClock(this)) {
+                    withRunningRecomposer {
+                        recomposer = it.asRecomposerInfo()
+                        suspendCancellableCoroutine<Unit> {}
+                    }
+                }
+            val afterLaunch = Recomposer.runningRecomposers.value
+            assertTrue("recomposer in running list", recomposer in afterLaunch)
+            recomposerJob.cancelAndJoin()
+            val afterCancel = Recomposer.runningRecomposers.value
+            assertFalse("recomposer no longer in running list", recomposer in afterCancel)
         }
-        val afterLaunch = Recomposer.runningRecomposers.value
-        assertTrue("recomposer in running list", recomposer in afterLaunch)
-        recomposerJob.cancelAndJoin()
-        val afterCancel = Recomposer.runningRecomposers.value
-        assertFalse("recomposer no longer in running list", recomposer in afterCancel)
-    }
 }
 
 class Counter {
     private var counts = mutableMapOf<String, Int>()
+
     fun inc(key: String) = counts.getOrPut(key, { 0 }).let { counts[key] = it + 1 }
+
     operator fun get(key: String) = counts[key] ?: 0
 }
 
 private class Trigger {
     val count = mutableStateOf(0)
-    fun subscribe() { count.value }
-    fun recompose() { count.value += 1 }
+
+    fun subscribe() {
+        count.value
+    }
+
+    fun recompose() {
+        count.value += 1
+    }
 }
diff --git a/compose/runtime/runtime/integration-tests/src/androidInstrumentedTest/kotlin/androidx/compose/runtime/SideEffectTests.kt b/compose/runtime/runtime/integration-tests/src/androidInstrumentedTest/kotlin/androidx/compose/runtime/SideEffectTests.kt
index da25ff8..50c9cdc 100644
--- a/compose/runtime/runtime/integration-tests/src/androidInstrumentedTest/kotlin/androidx/compose/runtime/SideEffectTests.kt
+++ b/compose/runtime/runtime/integration-tests/src/androidInstrumentedTest/kotlin/androidx/compose/runtime/SideEffectTests.kt
@@ -37,42 +37,37 @@
 @RunWith(AndroidJUnit4::class)
 class SideEffectTests : BaseComposeTest() {
 
-    @get:Rule
-    override val activityRule = makeTestActivityRule()
+    @get:Rule override val activityRule = makeTestActivityRule()
 
-    /**
-     * Test that side effects run in order of appearance each time the composable
-     * is recomposed.
-     */
+    /** Test that side effects run in order of appearance each time the composable is recomposed. */
     @Test
     fun testSideEffectsRunInOrder() {
         val results = mutableListOf<Int>()
         var resultsAtComposition: List<Int>? = null
         var scope: RecomposeScope? = null
         compose {
-            SideEffect {
-                results += 1
+                SideEffect { results += 1 }
+                SideEffect { results += 2 }
+                resultsAtComposition = results.toList()
+                scope = currentRecomposeScope
             }
-            SideEffect {
-                results += 2
+            .then {
+                assertEquals(listOf(1, 2), results, "side effects were applied")
+                assertEquals(
+                    emptyList(),
+                    resultsAtComposition,
+                    "side effects weren't applied until after composition"
+                )
+                scope?.invalidate() ?: error("missing recompose function")
             }
-            resultsAtComposition = results.toList()
-            scope = currentRecomposeScope
-        }.then {
-            assertEquals(listOf(1, 2), results, "side effects were applied")
-            assertEquals(
-                emptyList(), resultsAtComposition,
-                "side effects weren't applied until after composition"
-            )
-            scope?.invalidate() ?: error("missing recompose function")
-        }.then {
-            assertEquals(listOf(1, 2, 1, 2), results, "side effects applied a second time")
-        }
+            .then {
+                assertEquals(listOf(1, 2, 1, 2), results, "side effects applied a second time")
+            }
     }
 
     /**
-     * Test that side effects run after lifecycle observers enter the composition,
-     * even if their remembrance happens after the SideEffect call appears.
+     * Test that side effects run after lifecycle observers enter the composition, even if their
+     * remembrance happens after the SideEffect call appears.
      */
     @Test
     fun testSideEffectsRunAfterLifecycleObservers() {
@@ -99,16 +94,17 @@
         var wasObserverTwoPresent = false
 
         compose {
-            val one = remember { myObserverOne }
-            SideEffect {
-                wasObserverOnePresent = myObserverOne.isPresent
-                wasObserverTwoPresent = myObserverTwo.isPresent
+                val one = remember { myObserverOne }
+                SideEffect {
+                    wasObserverOnePresent = myObserverOne.isPresent
+                    wasObserverTwoPresent = myObserverTwo.isPresent
+                }
+                val two = remember { myObserverTwo }
             }
-            val two = remember { myObserverTwo }
-        }.then {
-            assertTrue(wasObserverOnePresent, "observer one present for side effect")
-            assertTrue(wasObserverTwoPresent, "observer two present for side effect")
-        }
+            .then {
+                assertTrue(wasObserverOnePresent, "observer one present for side effect")
+                assertTrue(wasObserverTwoPresent, "observer two present for side effect")
+            }
     }
 
     @Test
@@ -123,46 +119,46 @@
             log("Unmountable:start")
             DisposableEffect(Unit) {
                 log("DisposableEffect")
-                onDispose {
-                    log("onDispose")
-                }
+                onDispose { log("onDispose") }
             }
             log("Unmountable:end")
         }
 
         compose {
-            log("compose:start")
-            if (mount) {
-                Unmountable()
+                log("compose:start")
+                if (mount) {
+                    Unmountable()
+                }
+                log("compose:end")
             }
-            log("compose:end")
-        }.then { _ ->
-            assertEquals(
-                listOf(
-                    "compose:start",
-                    "Unmountable:start",
-                    "Unmountable:end",
-                    "compose:end",
-                    "DisposableEffect"
-                ),
-                logHistory
-            )
-            mount = false
-        }.then { _ ->
-            assertEquals(
-                listOf(
-                    "compose:start",
-                    "Unmountable:start",
-                    "Unmountable:end",
-                    "compose:end",
-                    "DisposableEffect",
-                    "compose:start",
-                    "compose:end",
-                    "onDispose"
-                ),
-                logHistory
-            )
-        }
+            .then { _ ->
+                assertEquals(
+                    listOf(
+                        "compose:start",
+                        "Unmountable:start",
+                        "Unmountable:end",
+                        "compose:end",
+                        "DisposableEffect"
+                    ),
+                    logHistory
+                )
+                mount = false
+            }
+            .then { _ ->
+                assertEquals(
+                    listOf(
+                        "compose:start",
+                        "Unmountable:start",
+                        "Unmountable:end",
+                        "compose:end",
+                        "DisposableEffect",
+                        "compose:start",
+                        "compose:end",
+                        "onDispose"
+                    ),
+                    logHistory
+                )
+            }
     }
 
     @Test
@@ -176,64 +172,58 @@
         fun Unmountable() {
             DisposableEffect(Unit) {
                 log("DisposableEffect:a2")
-                onDispose {
-                    log("onDispose:a2")
-                }
+                onDispose { log("onDispose:a2") }
             }
             DisposableEffect(Unit) {
                 log("DisposableEffect:b2")
-                onDispose {
-                    log("onDispose:b2")
-                }
+                onDispose { log("onDispose:b2") }
             }
         }
 
         compose {
-            DisposableEffect(NeverEqualObject) {
-                log("DisposableEffect:a1")
-                onDispose {
-                    log("onDispose:a1")
+                DisposableEffect(NeverEqualObject) {
+                    log("DisposableEffect:a1")
+                    onDispose { log("onDispose:a1") }
+                }
+                if (mount) {
+                    Unmountable()
+                }
+                DisposableEffect(NeverEqualObject) {
+                    log("DisposableEffect:b1")
+                    onDispose { log("onDispose:b1") }
                 }
             }
-            if (mount) {
-                Unmountable()
+            .then { _ ->
+                assertEquals(
+                    listOf(
+                        "DisposableEffect:a1",
+                        "DisposableEffect:a2",
+                        "DisposableEffect:b2",
+                        "DisposableEffect:b1"
+                    ),
+                    logHistory
+                )
+                mount = false
+                log("recompose")
             }
-            DisposableEffect(NeverEqualObject) {
-                log("DisposableEffect:b1")
-                onDispose {
-                    log("onDispose:b1")
-                }
+            .then { _ ->
+                assertEquals(
+                    listOf(
+                        "DisposableEffect:a1",
+                        "DisposableEffect:a2",
+                        "DisposableEffect:b2",
+                        "DisposableEffect:b1",
+                        "recompose",
+                        "onDispose:b1",
+                        "onDispose:b2",
+                        "onDispose:a2",
+                        "onDispose:a1",
+                        "DisposableEffect:a1",
+                        "DisposableEffect:b1"
+                    ),
+                    logHistory
+                )
             }
-        }.then { _ ->
-            assertEquals(
-                listOf(
-                    "DisposableEffect:a1",
-                    "DisposableEffect:a2",
-                    "DisposableEffect:b2",
-                    "DisposableEffect:b1"
-                ),
-                logHistory
-            )
-            mount = false
-            log("recompose")
-        }.then { _ ->
-            assertEquals(
-                listOf(
-                    "DisposableEffect:a1",
-                    "DisposableEffect:a2",
-                    "DisposableEffect:b2",
-                    "DisposableEffect:b1",
-                    "recompose",
-                    "onDispose:b1",
-                    "onDispose:b2",
-                    "onDispose:a2",
-                    "onDispose:a1",
-                    "DisposableEffect:a1",
-                    "DisposableEffect:b1"
-                ),
-                logHistory
-            )
-        }
     }
 
     @Test
@@ -246,40 +236,35 @@
         fun log(x: String) = logHistory.add(x)
 
         compose {
-            scope = currentRecomposeScope
-            DisposableEffect(key) {
-                val y = x++
-                log("DisposableEffect:$y")
-                onDispose {
-                    log("dispose:$y")
+                scope = currentRecomposeScope
+                DisposableEffect(key) {
+                    val y = x++
+                    log("DisposableEffect:$y")
+                    onDispose { log("dispose:$y") }
                 }
             }
-        }.then { _ ->
-            log("recompose")
-            scope.invalidate()
-        }.then { _ ->
-            assertEquals(
-                listOf(
-                    "DisposableEffect:0",
-                    "recompose"
-                ),
-                logHistory
-            )
-            log("recompose (key -> 345)")
-            key = 345
-            scope.invalidate()
-        }.then { _ ->
-            assertEquals(
-                listOf(
-                    "DisposableEffect:0",
-                    "recompose",
-                    "recompose (key -> 345)",
-                    "dispose:0",
-                    "DisposableEffect:1"
-                ),
-                logHistory
-            )
-        }
+            .then { _ ->
+                log("recompose")
+                scope.invalidate()
+            }
+            .then { _ ->
+                assertEquals(listOf("DisposableEffect:0", "recompose"), logHistory)
+                log("recompose (key -> 345)")
+                key = 345
+                scope.invalidate()
+            }
+            .then { _ ->
+                assertEquals(
+                    listOf(
+                        "DisposableEffect:0",
+                        "recompose",
+                        "recompose (key -> 345)",
+                        "dispose:0",
+                        "DisposableEffect:1"
+                    ),
+                    logHistory
+                )
+            }
     }
 
     @Test
@@ -289,22 +274,23 @@
         // Used as a signal that LaunchedEffect will await
         val ch = Channel<Unit>(Channel.CONFLATED)
         compose {
-            LaunchedEffect(ch) {
-                counter++
-                ch.receive()
-                counter++
-                ch.receive()
-                counter++
+                LaunchedEffect(ch) {
+                    counter++
+                    ch.receive()
+                    counter++
+                    ch.receive()
+                    counter++
+                }
             }
-        }.then {
-            assertEquals(1, counter)
-            ch.trySend(Unit)
-        }.then {
-            assertEquals(2, counter)
-            ch.trySend(Unit)
-        }.then {
-            assertEquals(3, counter)
-        }
+            .then {
+                assertEquals(1, counter)
+                ch.trySend(Unit)
+            }
+            .then {
+                assertEquals(2, counter)
+                ch.trySend(Unit)
+            }
+            .then { assertEquals(3, counter) }
     }
 
     @Test
@@ -312,25 +298,31 @@
         var choreographerTime by mutableStateOf(Long.MIN_VALUE)
         var awaitFrameTime by mutableStateOf(Long.MAX_VALUE)
         compose {
-            LaunchedEffect(Unit) {
-                withFrameNanos {
-                    awaitFrameTime = it
+                LaunchedEffect(Unit) { withFrameNanos { awaitFrameTime = it } }
+                DisposableEffect(true) {
+                    Choreographer.getInstance().postFrameCallback { frameTimeNanos ->
+                        choreographerTime = frameTimeNanos
+                    }
+                    onDispose {}
                 }
             }
-            DisposableEffect(true) {
-                Choreographer.getInstance().postFrameCallback { frameTimeNanos ->
-                    choreographerTime = frameTimeNanos
-                }
-                onDispose { }
+            .then {
+                assertNotEquals(
+                    choreographerTime,
+                    Long.MIN_VALUE,
+                    "Choreographer callback never ran"
+                )
+                assertNotEquals(
+                    awaitFrameTime,
+                    Long.MAX_VALUE,
+                    "awaitFrameNanos callback never ran"
+                )
+                assertEquals(
+                    choreographerTime,
+                    awaitFrameTime,
+                    "expected same values from choreographer post and awaitFrameNanos"
+                )
             }
-        }.then {
-            assertNotEquals(choreographerTime, Long.MIN_VALUE, "Choreographer callback never ran")
-            assertNotEquals(awaitFrameTime, Long.MAX_VALUE, "awaitFrameNanos callback never ran")
-            assertEquals(
-                choreographerTime, awaitFrameTime,
-                "expected same values from choreographer post and awaitFrameNanos"
-            )
-        }
     }
 
     @Test
@@ -338,17 +330,14 @@
         var onCommitRan = false
         var launchRanAfter = false
         compose {
-            // Confirms that these run "out of order" with respect to one another because
-            // the launch runs dispatched.
-            LaunchedEffect(Unit) {
-                launchRanAfter = onCommitRan
+                // Confirms that these run "out of order" with respect to one another because
+                // the launch runs dispatched.
+                LaunchedEffect(Unit) { launchRanAfter = onCommitRan }
+                SideEffect { onCommitRan = true }
             }
-            SideEffect {
-                onCommitRan = true
+            .then {
+                assertTrue(launchRanAfter, "expected LaunchedEffect to run after later onCommit")
             }
-        }.then {
-            assertTrue(launchRanAfter, "expected LaunchedEffect to run after later onCommit")
-        }
     }
 
     @OptIn(InternalComposeApi::class)
@@ -359,33 +348,29 @@
         var rememberCoroutineScopeFrameClock: MonotonicFrameClock? = null
 
         compose {
-            recomposerClock = currentComposer.applyCoroutineContext[MonotonicFrameClock]
-            LaunchedEffect(Unit) {
-                LaunchedEffectClock = coroutineContext[MonotonicFrameClock]
+                recomposerClock = currentComposer.applyCoroutineContext[MonotonicFrameClock]
+                LaunchedEffect(Unit) { LaunchedEffectClock = coroutineContext[MonotonicFrameClock] }
+                val rememberedScope = rememberCoroutineScope()
+                SideEffect {
+                    rememberCoroutineScopeFrameClock =
+                        rememberedScope.coroutineContext[MonotonicFrameClock]
+                }
             }
-            val rememberedScope = rememberCoroutineScope()
-            SideEffect {
-                rememberCoroutineScopeFrameClock =
-                    rememberedScope.coroutineContext[MonotonicFrameClock]
+            .then {
+                assertNotNull(recomposerClock, "Recomposer frameClock")
+                assertSame(recomposerClock, LaunchedEffectClock, "LaunchedEffect clock")
+                assertSame(
+                    recomposerClock,
+                    rememberCoroutineScopeFrameClock,
+                    "rememberCoroutineScope clock"
+                )
             }
-        }.then {
-            assertNotNull(recomposerClock, "Recomposer frameClock")
-            assertSame(recomposerClock, LaunchedEffectClock, "LaunchedEffect clock")
-            assertSame(
-                recomposerClock, rememberCoroutineScopeFrameClock,
-                "rememberCoroutineScope clock"
-            )
-        }
     }
 
     @Test
     fun testRememberUpdatedStateRecomposition() {
         @Composable
-        fun MyComposable(
-            arg: String,
-            inCh: ReceiveChannel<Unit>,
-            outCh: SendChannel<String>
-        ) {
+        fun MyComposable(arg: String, inCh: ReceiveChannel<Unit>, outCh: SendChannel<String>) {
             val currentArg by rememberUpdatedState(arg)
 
             // This block closes over currentArg and is long-lived; it is important that the
@@ -400,26 +385,26 @@
         val pleaseSend = Channel<Unit>()
         val output = Channel<String>()
 
-        compose {
-            MyComposable(myComposableArg, pleaseSend, output)
-        }.then {
-            myComposableArg = "world"
-        }.then {
-            val offerSucceeded = pleaseSend.trySend(Unit).isSuccess
-            assertTrue(offerSucceeded, "task wasn't awaiting send signal")
-        }.then {
-            val receivedResult = output.tryReceive().getOrNull()
-            assertEquals("world", receivedResult)
-        }
+        compose { MyComposable(myComposableArg, pleaseSend, output) }
+            .then { myComposableArg = "world" }
+            .then {
+                val offerSucceeded = pleaseSend.trySend(Unit).isSuccess
+                assertTrue(offerSucceeded, "task wasn't awaiting send signal")
+            }
+            .then {
+                val receivedResult = output.tryReceive().getOrNull()
+                assertEquals("world", receivedResult)
+            }
     }
 
     /**
-     * Always compares as unequal to itself (and everything else) to force DisposableEffect
-     * to recompose on every recomposition
+     * Always compares as unequal to itself (and everything else) to force DisposableEffect to
+     * recompose on every recomposition
      */
     @Suppress("EqualsOrHashCode")
     private object NeverEqualObject {
         override fun equals(other: Any?) = false
+
         override fun hashCode() = 42
     }
 }
diff --git a/compose/runtime/runtime/integration-tests/src/androidInstrumentedTest/kotlin/androidx/compose/runtime/SuspendingEffectsTests.kt b/compose/runtime/runtime/integration-tests/src/androidInstrumentedTest/kotlin/androidx/compose/runtime/SuspendingEffectsTests.kt
index 243e11a..342c6cf 100644
--- a/compose/runtime/runtime/integration-tests/src/androidInstrumentedTest/kotlin/androidx/compose/runtime/SuspendingEffectsTests.kt
+++ b/compose/runtime/runtime/integration-tests/src/androidInstrumentedTest/kotlin/androidx/compose/runtime/SuspendingEffectsTests.kt
@@ -37,8 +37,7 @@
 @RunWith(AndroidJUnit4::class)
 class SuspendingEffectsTests : BaseComposeTest() {
 
-    @get:Rule
-    override val activityRule = makeTestActivityRule()
+    @get:Rule override val activityRule = makeTestActivityRule()
 
     @Test
     fun testLaunchedTask() {
@@ -47,22 +46,23 @@
         // Used as a signal that LaunchedTask will await
         val ch = Channel<Unit>(Channel.CONFLATED)
         compose {
-            LaunchedEffect(Unit) {
-                counter++
-                ch.receive()
-                counter++
-                ch.receive()
-                counter++
+                LaunchedEffect(Unit) {
+                    counter++
+                    ch.receive()
+                    counter++
+                    ch.receive()
+                    counter++
+                }
             }
-        }.then {
-            assertEquals(1, counter)
-            ch.trySend(Unit)
-        }.then {
-            assertEquals(2, counter)
-            ch.trySend(Unit)
-        }.then {
-            assertEquals(3, counter)
-        }
+            .then {
+                assertEquals(1, counter)
+                ch.trySend(Unit)
+            }
+            .then {
+                assertEquals(2, counter)
+                ch.trySend(Unit)
+            }
+            .then { assertEquals(3, counter) }
     }
 
     @Test
@@ -70,25 +70,31 @@
         var choreographerTime by mutableStateOf(Long.MIN_VALUE)
         var awaitFrameTime by mutableStateOf(Long.MAX_VALUE)
         compose {
-            LaunchedEffect(Unit) {
-                withFrameNanos {
-                    awaitFrameTime = it
+                LaunchedEffect(Unit) { withFrameNanos { awaitFrameTime = it } }
+                DisposableEffect(true) {
+                    Choreographer.getInstance().postFrameCallback { frameTimeNanos ->
+                        choreographerTime = frameTimeNanos
+                    }
+                    onDispose {}
                 }
             }
-            DisposableEffect(true) {
-                Choreographer.getInstance().postFrameCallback { frameTimeNanos ->
-                    choreographerTime = frameTimeNanos
-                }
-                onDispose { }
+            .then {
+                assertNotEquals(
+                    choreographerTime,
+                    Long.MIN_VALUE,
+                    "Choreographer callback never ran"
+                )
+                assertNotEquals(
+                    awaitFrameTime,
+                    Long.MAX_VALUE,
+                    "awaitFrameNanos callback never ran"
+                )
+                assertEquals(
+                    choreographerTime,
+                    awaitFrameTime,
+                    "expected same values from choreographer post and awaitFrameNanos"
+                )
             }
-        }.then {
-            assertNotEquals(choreographerTime, Long.MIN_VALUE, "Choreographer callback never ran")
-            assertNotEquals(awaitFrameTime, Long.MAX_VALUE, "awaitFrameNanos callback never ran")
-            assertEquals(
-                choreographerTime, awaitFrameTime,
-                "expected same values from choreographer post and awaitFrameNanos"
-            )
-        }
     }
 
     @Test
@@ -96,36 +102,42 @@
         var choreographerTime by mutableStateOf(Long.MIN_VALUE)
         var awaitFrameTime by mutableStateOf(Long.MAX_VALUE)
         compose {
-            val scope = rememberCoroutineScope()
-            DisposableEffect(true) {
-                scope.launch {
-                    withFrameNanos {
-                        awaitFrameTime = it
+                val scope = rememberCoroutineScope()
+                DisposableEffect(true) {
+                    scope.launch { withFrameNanos { awaitFrameTime = it } }
+                    Choreographer.getInstance().postFrameCallback { frameTimeNanos ->
+                        choreographerTime = frameTimeNanos
                     }
+                    onDispose {}
                 }
-                Choreographer.getInstance().postFrameCallback { frameTimeNanos ->
-                    choreographerTime = frameTimeNanos
-                }
-                onDispose { }
             }
-        }.then {
-            assertNotEquals(choreographerTime, Long.MIN_VALUE, "Choreographer callback never ran")
-            assertNotEquals(awaitFrameTime, Long.MAX_VALUE, "awaitFrameNanos callback never ran")
-            assertEquals(
-                choreographerTime, awaitFrameTime,
-                "expected same values from choreographer post and awaitFrameNanos"
-            )
-        }
+            .then {
+                assertNotEquals(
+                    choreographerTime,
+                    Long.MIN_VALUE,
+                    "Choreographer callback never ran"
+                )
+                assertNotEquals(
+                    awaitFrameTime,
+                    Long.MAX_VALUE,
+                    "awaitFrameNanos callback never ran"
+                )
+                assertEquals(
+                    choreographerTime,
+                    awaitFrameTime,
+                    "expected same values from choreographer post and awaitFrameNanos"
+                )
+            }
     }
 
     @Test
     fun testRememberCoroutineScopeActiveWithComposition() {
         lateinit var coroutineScope: CoroutineScope
-        compose {
-            coroutineScope = rememberCoroutineScope()
-        }.then {
-            assertTrue(coroutineScope.isActive, "coroutine scope was active before dispose")
-        }.done()
+        compose { coroutineScope = rememberCoroutineScope() }
+            .then {
+                assertTrue(coroutineScope.isActive, "coroutine scope was active before dispose")
+            }
+            .done()
         assertFalse(coroutineScope.isActive, "coroutine scope was inactive after dispose")
     }
 
@@ -134,22 +146,23 @@
         var coroutineScope: CoroutineScope? = null
         var toggle by mutableStateOf(true)
         compose {
-            if (toggle) {
-                coroutineScope = rememberCoroutineScope()
+                if (toggle) {
+                    coroutineScope = rememberCoroutineScope()
+                }
             }
-        }.then {
-            assertTrue(
-                coroutineScope?.isActive == true,
-                "coroutine scope should be active after initial composition"
-            )
-        }.then {
-            toggle = false
-        }.then {
-            assertTrue(
-                coroutineScope?.isActive == false,
-                "coroutine scope should be cancelled after leaving composition"
-            )
-        }
+            .then {
+                assertTrue(
+                    coroutineScope?.isActive == true,
+                    "coroutine scope should be active after initial composition"
+                )
+            }
+            .then { toggle = false }
+            .then {
+                assertTrue(
+                    coroutineScope?.isActive == false,
+                    "coroutine scope should be cancelled after leaving composition"
+                )
+            }
     }
 
     @OptIn(InternalComposeApi::class)
@@ -160,23 +173,23 @@
         var rememberCoroutineScopeFrameClock: MonotonicFrameClock? = null
 
         compose {
-            recomposerClock = currentComposer.applyCoroutineContext[MonotonicFrameClock]
-            LaunchedEffect(Unit) {
-                launchedTaskClock = coroutineContext[MonotonicFrameClock]
+                recomposerClock = currentComposer.applyCoroutineContext[MonotonicFrameClock]
+                LaunchedEffect(Unit) { launchedTaskClock = coroutineContext[MonotonicFrameClock] }
+                val rememberedScope = rememberCoroutineScope()
+                SideEffect {
+                    rememberCoroutineScopeFrameClock =
+                        rememberedScope.coroutineContext[MonotonicFrameClock]
+                }
             }
-            val rememberedScope = rememberCoroutineScope()
-            SideEffect {
-                rememberCoroutineScopeFrameClock =
-                    rememberedScope.coroutineContext[MonotonicFrameClock]
+            .then {
+                assertNotNull(recomposerClock, "Recomposer frameClock")
+                assertSame(recomposerClock, launchedTaskClock, "LaunchedTask clock")
+                assertSame(
+                    recomposerClock,
+                    rememberCoroutineScopeFrameClock,
+                    "rememberCoroutineScope clock"
+                )
             }
-        }.then {
-            assertNotNull(recomposerClock, "Recomposer frameClock")
-            assertSame(recomposerClock, launchedTaskClock, "LaunchedTask clock")
-            assertSame(
-                recomposerClock, rememberCoroutineScopeFrameClock,
-                "rememberCoroutineScope clock"
-            )
-        }
     }
 
     @Test
@@ -184,17 +197,14 @@
         var onCommitRan = false
         var launchRanAfter = false
         compose {
-            // Confirms that these run "out of order" with respect to one another because
-            // the launch runs dispatched.
-            LaunchedEffect(Unit) {
-                launchRanAfter = onCommitRan
+                // Confirms that these run "out of order" with respect to one another because
+                // the launch runs dispatched.
+                LaunchedEffect(Unit) { launchRanAfter = onCommitRan }
+                SideEffect { onCommitRan = true }
             }
-            SideEffect {
-                onCommitRan = true
+            .then {
+                assertTrue(launchRanAfter, "expected LaunchedTask to run after later onCommit")
             }
-        }.then {
-            assertTrue(launchRanAfter, "expected LaunchedTask to run after later onCommit")
-        }
     }
 
     /*
diff --git a/compose/runtime/runtime/samples/src/main/java/androidx/compose/runtime/samples/CompositionLocalSamples.kt b/compose/runtime/runtime/samples/src/main/java/androidx/compose/runtime/samples/CompositionLocalSamples.kt
index 915eb75..3ec5f81 100644
--- a/compose/runtime/runtime/samples/src/main/java/androidx/compose/runtime/samples/CompositionLocalSamples.kt
+++ b/compose/runtime/runtime/samples/src/main/java/androidx/compose/runtime/samples/CompositionLocalSamples.kt
@@ -33,9 +33,7 @@
 fun compositionLocalProvider() {
     @Composable
     fun App(user: User) {
-        CompositionLocalProvider(ActiveUser provides user) {
-            SomeScreen()
-        }
+        CompositionLocalProvider(ActiveUser provides user) { SomeScreen() }
     }
 }
 
@@ -55,9 +53,7 @@
     @Composable
     fun App() {
         CompositionLocalProvider(
-            LocalLargerValue providesComputed {
-                LocalValue.currentValue + 10
-            }
+            LocalLargerValue providesComputed { LocalValue.currentValue + 10 }
         ) {
             SomeScreen()
         }
@@ -68,9 +64,7 @@
 fun compositionLocalComputedAfterProvidingLocal() {
     val LocalValue = compositionLocalOf { 10 }
     val LocalLargerValue = compositionLocalOf { 12 }
-    val LocalComputedValue = compositionLocalWithComputedDefaultOf {
-        LocalValue.currentValue + 4
-    }
+    val LocalComputedValue = compositionLocalWithComputedDefaultOf { LocalValue.currentValue + 4 }
 
     // In this example `LocalLargerValue` needs to be re-provided
     // whenever `LocalValue` is provided to keep its value larger
@@ -89,24 +83,18 @@
         val largerValue = LocalLargerValue.current
         // Value is computed to be 14
         val computedValue = LocalComputedValue.current
-        CompositionLocalProvider(
-            LocalValue provides 20
-        ) {
+        CompositionLocalProvider(LocalValue provides 20) {
             // Value is 20 provided above
             val nestedValue = LocalValue.current
             // Value is still 12 as an updated value was not re-provided
             val nestedLargerValue = LocalLargerValue.current
             // Values is computed to be 24; LocalValue.current + 4
             val nestedComputedValue = LocalComputedValue.current
-            CompositionLocalProvider(
-                LocalLargerValue provides LocalValue.current + 2
-            ) {
+            CompositionLocalProvider(LocalLargerValue provides LocalValue.current + 2) {
                 // Value is 22 provided above
                 val newLargerValue = LocalLargerValue.current
 
-                CompositionLocalProvider(
-                    LocalValue provides 50
-                ) {
+                CompositionLocalProvider(LocalValue provides 50) {
                     // Value is now 50 provided above
                     val finalValue = LocalValue.current
                     // Value is still 22
diff --git a/compose/runtime/runtime/samples/src/main/java/androidx/compose/runtime/samples/CustomTreeCompositionSamples.kt b/compose/runtime/runtime/samples/src/main/java/androidx/compose/runtime/samples/CustomTreeCompositionSamples.kt
index 28d0089..397dd50 100644
--- a/compose/runtime/runtime/samples/src/main/java/androidx/compose/runtime/samples/CustomTreeCompositionSamples.kt
+++ b/compose/runtime/runtime/samples/src/main/java/androidx/compose/runtime/samples/CustomTreeCompositionSamples.kt
@@ -60,13 +60,8 @@
     }
 
     // A function like the following could be created to create a composition provided a root Node.
-    fun Node.setContent(
-        parent: CompositionContext,
-        content: @Composable () -> Unit
-    ): Composition {
-        return Composition(NodeApplier(this), parent).apply {
-            setContent(content)
-        }
+    fun Node.setContent(parent: CompositionContext, content: @Composable () -> Unit): Composition {
+        return Composition(NodeApplier(this), parent).apply { setContent(content) }
     }
 
     // assuming we have Node sub-classes like "TextNode" and "GroupNode"
@@ -77,14 +72,16 @@
     class GroupNode : Node()
 
     // Composable equivalents could be created
-    @Composable fun Text(text: String, onClick: () -> Unit = {}) {
+    @Composable
+    fun Text(text: String, onClick: () -> Unit = {}) {
         ComposeNode<TextNode, NodeApplier>(::TextNode) {
             set(text) { this.text = it }
             set(onClick) { this.onClick = it }
         }
     }
 
-    @Composable fun Group(content: @Composable () -> Unit) {
+    @Composable
+    fun Group(content: @Composable () -> Unit) {
         ComposeNode<GroupNode, NodeApplier>(::GroupNode, {}, content)
     }
 
diff --git a/compose/runtime/runtime/samples/src/main/java/androidx/compose/runtime/samples/EffectSamples.kt b/compose/runtime/runtime/samples/src/main/java/androidx/compose/runtime/samples/EffectSamples.kt
index b488925..2048df3 100644
--- a/compose/runtime/runtime/samples/src/main/java/androidx/compose/runtime/samples/EffectSamples.kt
+++ b/compose/runtime/runtime/samples/src/main/java/androidx/compose/runtime/samples/EffectSamples.kt
@@ -37,12 +37,8 @@
     fun observeUser(userId: Int): User? {
         val user = remember(userId) { mutableStateOf<User?>(null) }
         DisposableEffect(userId) {
-            val subscription = UserAPI.subscribeToUser(userId) {
-                user.value = it
-            }
-            onDispose {
-                subscription.unsubscribe()
-            }
+            val subscription = UserAPI.subscribeToUser(userId) { user.value = it }
+            onDispose { subscription.unsubscribe() }
         }
         return user.value
     }
@@ -63,9 +59,7 @@
     val count = remember { mutableStateOf(0) }
 
     Text(text = "You clicked ${count.value} times")
-    Button(onClick = { count.value++ }) {
-        Text("Click me")
-    }
+    Button(onClick = { count.value++ }) { Text("Click me") }
 }
 
 @Sampled
@@ -74,17 +68,14 @@
     val (count, setCount) = remember { mutableStateOf(0) }
 
     Text(text = "You clicked $count times")
-    Button(onClick = { setCount(count + 1) }) {
-        Text("Click me")
-    }
+    Button(onClick = { setCount(count + 1) }) { Text("Click me") }
 }
 
 @Sampled
 @Composable
 fun DelegatedReadOnlyStateSample() {
     // Composable function that manages a subscription to a data source, returning it as State
-    @Composable
-    fun observeSampleData(): State<String> = TODO()
+    @Composable fun observeSampleData(): State<String> = TODO()
 
     // Subscription is managed here, but currentValue is not read yet
     val currentValue by observeSampleData()
@@ -104,9 +95,7 @@
     var count by remember { mutableStateOf(0) }
 
     Text(text = "You clicked $count times")
-    Button(onClick = { count = count + 1 }) {
-        Text("Click me")
-    }
+    Button(onClick = { count = count + 1 }) { Text("Click me") }
 }
 
 private class Subscription {
@@ -124,9 +113,7 @@
 
 private class Element(val id: Int)
 
-@Suppress("UNUSED_PARAMETER")
-@Composable
-private fun ListItem(item: Any, selected: Boolean) {}
+@Suppress("UNUSED_PARAMETER") @Composable private fun ListItem(item: Any, selected: Boolean) {}
 
 private const val parentId = 0
 
@@ -134,11 +121,13 @@
 @Sampled
 @Composable
 fun DerivedStateSample() {
-    @Composable fun CountDisplay(count: State<Int>) {
+    @Composable
+    fun CountDisplay(count: State<Int>) {
         Text("Count: ${count.value}")
     }
 
-    @Composable fun Example() {
+    @Composable
+    fun Example() {
         var a by remember { mutableStateOf(0) }
         var b by remember { mutableStateOf(0) }
         val sum = remember { derivedStateOf { a + b } }
diff --git a/compose/runtime/runtime/samples/src/main/java/androidx/compose/runtime/samples/ImmutableSamples.kt b/compose/runtime/runtime/samples/src/main/java/androidx/compose/runtime/samples/ImmutableSamples.kt
index df458ba..1d529b3 100644
--- a/compose/runtime/runtime/samples/src/main/java/androidx/compose/runtime/samples/ImmutableSamples.kt
+++ b/compose/runtime/runtime/samples/src/main/java/androidx/compose/runtime/samples/ImmutableSamples.kt
@@ -25,8 +25,7 @@
 
 @Sampled
 fun simpleImmutableClass() {
-    @Immutable
-    data class Person(val name: String, val phoneNumber: String)
+    @Immutable data class Person(val name: String, val phoneNumber: String)
 
     @Composable
     fun PersonView(person: Person) {
diff --git a/compose/runtime/runtime/samples/src/main/java/androidx/compose/runtime/samples/ModelSamples.kt b/compose/runtime/runtime/samples/src/main/java/androidx/compose/runtime/samples/ModelSamples.kt
index 7080f39..19f805a 100644
--- a/compose/runtime/runtime/samples/src/main/java/androidx/compose/runtime/samples/ModelSamples.kt
+++ b/compose/runtime/runtime/samples/src/main/java/androidx/compose/runtime/samples/ModelSamples.kt
@@ -37,16 +37,8 @@
 
         fun login() = Api.login(username, password)
 
-        BasicTextField(
-            value = username,
-            onValueChange = { username = it }
-        )
-        BasicTextField(
-            value = password,
-            onValueChange = { password = it }
-        )
-        Button(onClick = { login() }) {
-            Text("Login")
-        }
+        BasicTextField(value = username, onValueChange = { username = it })
+        BasicTextField(value = password, onValueChange = { password = it })
+        Button(onClick = { login() }) { Text("Login") }
     }
 }
diff --git a/compose/runtime/runtime/samples/src/main/java/androidx/compose/runtime/samples/MovableContentSamples.kt b/compose/runtime/runtime/samples/src/main/java/androidx/compose/runtime/samples/MovableContentSamples.kt
index e098eaa..e02445f 100644
--- a/compose/runtime/runtime/samples/src/main/java/androidx/compose/runtime/samples/MovableContentSamples.kt
+++ b/compose/runtime/runtime/samples/src/main/java/androidx/compose/runtime/samples/MovableContentSamples.kt
@@ -23,8 +23,8 @@
 import androidx.compose.runtime.movableContentOf
 import androidx.compose.runtime.remember
 
-@Composable
-fun ItemView(@Suppress("UNUSED_PARAMETER") userId: Int) { }
+@Composable fun ItemView(@Suppress("UNUSED_PARAMETER") userId: Int) {}
+
 typealias Item = Int
 
 @Suppress("unused")
@@ -34,13 +34,9 @@
     val movableContent = remember(content) { movableContentOf(content) }
 
     if (vertical) {
-        Column {
-            movableContent()
-        }
+        Column { movableContent() }
     } else {
-        Row {
-            movableContent()
-        }
+        Row { movableContent() }
     }
 }
 
@@ -48,9 +44,7 @@
 @Sampled
 @Composable
 fun MovableContentMultiColumnSample(items: List<Item>) {
-    val itemMap = remember {
-        mutableMapOf<Item, @Composable () -> Unit>()
-    }
+    val itemMap = remember { mutableMapOf<Item, @Composable () -> Unit>() }
     val movableItems =
         items.map { item -> itemMap.getOrPut(item) { movableContentOf { ItemView(item) } } }
 
diff --git a/compose/runtime/runtime/samples/src/main/java/androidx/compose/runtime/samples/MutableStateListSamples.kt b/compose/runtime/runtime/samples/src/main/java/androidx/compose/runtime/samples/MutableStateListSamples.kt
index 24f0b6f..061e7bd 100644
--- a/compose/runtime/runtime/samples/src/main/java/androidx/compose/runtime/samples/MutableStateListSamples.kt
+++ b/compose/runtime/runtime/samples/src/main/java/androidx/compose/runtime/samples/MutableStateListSamples.kt
@@ -40,13 +40,8 @@
 
         Column {
             Row {
-                BasicTextField(
-                    value = name,
-                    onValueChange = { name = it }
-                )
-                Button(onClick = { names.add(name) }) {
-                    Text("Add")
-                }
+                BasicTextField(value = name, onValueChange = { name = it })
+                Button(onClick = { names.add(name) }) { Text("Add") }
             }
             Text("Added names:")
             Column {
diff --git a/compose/runtime/runtime/samples/src/main/java/androidx/compose/runtime/samples/MutableStateMapSample.kt b/compose/runtime/runtime/samples/src/main/java/androidx/compose/runtime/samples/MutableStateMapSample.kt
index 8a6f4df..edb222d 100644
--- a/compose/runtime/runtime/samples/src/main/java/androidx/compose/runtime/samples/MutableStateMapSample.kt
+++ b/compose/runtime/runtime/samples/src/main/java/androidx/compose/runtime/samples/MutableStateMapSample.kt
@@ -47,20 +47,10 @@
 
         Column {
             Row {
-                BasicTextField(
-                    value = name,
-                    onValueChange = { name = it }
-                )
-                BasicTextField(
-                    value = saying,
-                    onValueChange = { saying = it }
-                )
-                Button(onClick = { sayings[name] = saying }) {
-                    Text("Add")
-                }
-                Button(onClick = { sayings.remove(name) }) {
-                    Text("Remove")
-                }
+                BasicTextField(value = name, onValueChange = { name = it })
+                BasicTextField(value = saying, onValueChange = { saying = it })
+                Button(onClick = { sayings[name] = saying }) { Text("Add") }
+                Button(onClick = { sayings.remove(name) }) { Text("Remove") }
             }
             Text("Sayings:")
             Column {
diff --git a/compose/runtime/runtime/samples/src/main/java/androidx/compose/runtime/samples/ProduceStateSamples.kt b/compose/runtime/runtime/samples/src/main/java/androidx/compose/runtime/samples/ProduceStateSamples.kt
index 015a6cf..cfaa8ac 100644
--- a/compose/runtime/runtime/samples/src/main/java/androidx/compose/runtime/samples/ProduceStateSamples.kt
+++ b/compose/runtime/runtime/samples/src/main/java/androidx/compose/runtime/samples/ProduceStateSamples.kt
@@ -25,9 +25,7 @@
 import kotlinx.coroutines.flow.collect
 import kotlinx.coroutines.flow.map
 
-@Suppress("UNUSED_PARAMETER")
-@Composable
-private fun Text(text: String): Unit = TODO()
+@Suppress("UNUSED_PARAMETER") @Composable private fun Text(text: String): Unit = TODO()
 
 class ProduceStateSampleViewModel {
     val people: Flow<List<Person>> = TODO()
@@ -44,25 +42,26 @@
 
 private sealed class UiState<out T> {
     object Loading : UiState<Nothing>()
+
     class Data<T>(val data: T) : UiState<T>()
 }
 
 @Sampled
 @Composable
 fun ProduceState(viewModel: ProduceStateSampleViewModel) {
-    val uiState by produceState<UiState<List<Person>>>(UiState.Loading, viewModel) {
-        viewModel.people
-            .map { UiState.Data(it) }
-            .collect { value = it }
-    }
+    val uiState by
+        produceState<UiState<List<Person>>>(UiState.Loading, viewModel) {
+            viewModel.people.map { UiState.Data(it) }.collect { value = it }
+        }
 
     when (val state = uiState) {
         is UiState.Loading -> Text("Loading...")
-        is UiState.Data -> Column {
-            for (person in state.data) {
-                Text("Hello, ${person.name}")
+        is UiState.Data ->
+            Column {
+                for (person in state.data) {
+                    Text("Hello, ${person.name}")
+                }
             }
-        }
     }
 }
 
@@ -70,13 +69,10 @@
 @Sampled
 @Composable
 fun ProduceStateAwaitDispose(viewModel: ProduceStateSampleViewModel) {
-    val currentPerson by produceState<Person?>(null, viewModel) {
-        val disposable = viewModel.registerPersonObserver { person ->
-            value = person
-        }
+    val currentPerson by
+        produceState<Person?>(null, viewModel) {
+            val disposable = viewModel.registerPersonObserver { person -> value = person }
 
-        awaitDispose {
-            disposable.dispose()
+            awaitDispose { disposable.dispose() }
         }
-    }
 }
diff --git a/compose/runtime/runtime/samples/src/main/java/androidx/compose/runtime/samples/SharedSamples.kt b/compose/runtime/runtime/samples/src/main/java/androidx/compose/runtime/samples/SharedSamples.kt
index 5030ff4..b138b0f 100644
--- a/compose/runtime/runtime/samples/src/main/java/androidx/compose/runtime/samples/SharedSamples.kt
+++ b/compose/runtime/runtime/samples/src/main/java/androidx/compose/runtime/samples/SharedSamples.kt
@@ -20,8 +20,7 @@
 
 import androidx.compose.runtime.Composable
 
-@Composable
-internal fun ProfileIcon(src: String) {}
+@Composable internal fun ProfileIcon(src: String) {}
 
 internal class User {
     val id = 0
@@ -31,5 +30,6 @@
 
 internal object Api {
     fun login(username: String, password: String) {}
+
     fun getUserAsync(id: Int, user: (User) -> Unit): () -> Unit = {}
 }
diff --git a/compose/runtime/runtime/samples/src/main/java/androidx/compose/runtime/samples/SideEffectSamples.kt b/compose/runtime/runtime/samples/src/main/java/androidx/compose/runtime/samples/SideEffectSamples.kt
index bab72f9..e8e7cb6 100644
--- a/compose/runtime/runtime/samples/src/main/java/androidx/compose/runtime/samples/SideEffectSamples.kt
+++ b/compose/runtime/runtime/samples/src/main/java/androidx/compose/runtime/samples/SideEffectSamples.kt
@@ -34,6 +34,7 @@
 }
 
 private interface UserDataRequest
+
 private interface UserDataResponse
 
 private interface UserRepository {
@@ -46,9 +47,11 @@
 
 private sealed class UserDataState {
     object Loading : UserDataState()
+
     class UserData(val name: String, val avatar: String) : UserDataState() {
         constructor(response: UserDataResponse) : this("", "")
     }
+
     class Error(val message: String?) : UserDataState()
 }
 
@@ -62,19 +65,16 @@
         // and begin a new data fetch. We will cancel the current data fetch if UserProfile
         // leaves the composition.
         DisposableEffect(userRepository, userRequest) {
-            val requestDisposable = userRepository.fetchUserData(
-                userRequest,
-                onSuccess = { response ->
-                    userDataState = UserDataState.UserData(response)
-                },
-                onError = { throwable ->
-                    userDataState = UserDataState.Error(throwable.message)
-                }
-            )
+            val requestDisposable =
+                userRepository.fetchUserData(
+                    userRequest,
+                    onSuccess = { response -> userDataState = UserDataState.UserData(response) },
+                    onError = { throwable ->
+                        userDataState = UserDataState.Error(throwable.message)
+                    }
+                )
 
-            onDispose {
-                requestDisposable.dispose()
-            }
+            onDispose { requestDisposable.dispose() }
         }
 
         // ...
@@ -95,14 +95,13 @@
         // Event handlers are ordered and a new onEvent should not cause us to re-register,
         // losing our position in the dispatcher.
         DisposableEffect(dispatcher) {
-            val disposable = dispatcher.addListener {
-                // currentOnEvent will always refer to the latest onEvent function that
-                // the EventHandler was recomposed with
-                currentOnEvent()
-            }
-            onDispose {
-                disposable.dispose()
-            }
+            val disposable =
+                dispatcher.addListener {
+                    // currentOnEvent will always refer to the latest onEvent function that
+                    // the EventHandler was recomposed with
+                    currentOnEvent()
+                }
+            onDispose { disposable.dispose() }
         }
     }
 }
diff --git a/compose/runtime/runtime/samples/src/main/java/androidx/compose/runtime/samples/SnapshotMutationPolicySamples.kt b/compose/runtime/runtime/samples/src/main/java/androidx/compose/runtime/samples/SnapshotMutationPolicySamples.kt
index 0e58303..23b2ffb 100644
--- a/compose/runtime/runtime/samples/src/main/java/androidx/compose/runtime/samples/SnapshotMutationPolicySamples.kt
+++ b/compose/runtime/runtime/samples/src/main/java/androidx/compose/runtime/samples/SnapshotMutationPolicySamples.kt
@@ -30,16 +30,18 @@
      * the applying snapshot are added together with changes of other snapshots. Changes to a
      * [MutableState] with a counterPolicy will never cause an apply conflict.
      *
-     * As the name implies, this is useful when counting things, such as tracking the amount of
-     * a resource consumed or produced while in a snapshot. For example, if snapshot A produces 10
+     * As the name implies, this is useful when counting things, such as tracking the amount of a
+     * resource consumed or produced while in a snapshot. For example, if snapshot A produces 10
      * things and snapshot B produces 20 things, the result of applying both A and B should be that
      * 30 things were produced.
      */
-    fun counterPolicy(): SnapshotMutationPolicy<Int> = object : SnapshotMutationPolicy<Int> {
-        override fun equivalent(a: Int, b: Int): Boolean = a == b
-        override fun merge(previous: Int, current: Int, applied: Int) =
-            current + (applied - previous)
-    }
+    fun counterPolicy(): SnapshotMutationPolicy<Int> =
+        object : SnapshotMutationPolicy<Int> {
+            override fun equivalent(a: Int, b: Int): Boolean = a == b
+
+            override fun merge(previous: Int, current: Int, applied: Int) =
+                current + (applied - previous)
+        }
 
     val state = mutableStateOf(0, counterPolicy())
     val snapshot1 = Snapshot.takeMutableSnapshot()
diff --git a/compose/runtime/runtime/samples/src/main/java/androidx/compose/runtime/samples/SnapshotSamples.kt b/compose/runtime/runtime/samples/src/main/java/androidx/compose/runtime/samples/SnapshotSamples.kt
index 2310b38..c8bcd117 100644
--- a/compose/runtime/runtime/samples/src/main/java/androidx/compose/runtime/samples/SnapshotSamples.kt
+++ b/compose/runtime/runtime/samples/src/main/java/androidx/compose/runtime/samples/SnapshotSamples.kt
@@ -47,11 +47,7 @@
     val collectionScope: CoroutineScope = TODO("Use your scope here")
 
     // Collect the flow and offer greetings!
-    collectionScope.launch {
-        greetPersonFlow.collect {
-            println(greeting)
-        }
-    }
+    collectionScope.launch { greetPersonFlow.collect { println(greeting) } }
 
     // ...
 
diff --git a/compose/runtime/runtime/src/androidInstrumentedTest/kotlin/androidx/compose/runtime/snapshots/ParcelableMutableStateTests.kt b/compose/runtime/runtime/src/androidInstrumentedTest/kotlin/androidx/compose/runtime/snapshots/ParcelableMutableStateTests.kt
index ea749aa..0fbd03a 100644
--- a/compose/runtime/runtime/src/androidInstrumentedTest/kotlin/androidx/compose/runtime/snapshots/ParcelableMutableStateTests.kt
+++ b/compose/runtime/runtime/src/androidInstrumentedTest/kotlin/androidx/compose/runtime/snapshots/ParcelableMutableStateTests.kt
@@ -29,9 +29,7 @@
 import org.junit.runners.Parameterized
 
 @RunWith(Parameterized::class)
-class ParcelableMutableStateTests(
-    private val policy: SnapshotMutationPolicy<Int>
-) {
+class ParcelableMutableStateTests(private val policy: SnapshotMutationPolicy<Int>) {
     @Test
     fun saveAndRestoreTheMutableStateOf() {
         val a = mutableStateOf(0, policy)
@@ -52,10 +50,6 @@
         @JvmStatic
         @Parameterized.Parameters(name = "{0}")
         fun initParameters(): Array<SnapshotMutationPolicy<Int>> =
-            arrayOf(
-                structuralEqualityPolicy(),
-                referentialEqualityPolicy(),
-                neverEqualPolicy()
-            )
+            arrayOf(structuralEqualityPolicy(), referentialEqualityPolicy(), neverEqualPolicy())
     }
 }
diff --git a/compose/runtime/runtime/src/androidInstrumentedTest/kotlin/androidx/compose/runtime/snapshots/ParcelablePrimitiveMutableStateTests.kt b/compose/runtime/runtime/src/androidInstrumentedTest/kotlin/androidx/compose/runtime/snapshots/ParcelablePrimitiveMutableStateTests.kt
index b074391..fcd7f3c 100644
--- a/compose/runtime/runtime/src/androidInstrumentedTest/kotlin/androidx/compose/runtime/snapshots/ParcelablePrimitiveMutableStateTests.kt
+++ b/compose/runtime/runtime/src/androidInstrumentedTest/kotlin/androidx/compose/runtime/snapshots/ParcelablePrimitiveMutableStateTests.kt
@@ -63,10 +63,11 @@
     }
 
     private inline fun <reified T> recreateViaParcel(value: T): T {
-        val parcel = Parcel.obtain().apply {
-            writeParcelable(value as Parcelable, 0)
-            setDataPosition(0)
-        }
+        val parcel =
+            Parcel.obtain().apply {
+                writeParcelable(value as Parcelable, 0)
+                setDataPosition(0)
+            }
         @Suppress("DEPRECATION")
         return parcel.readParcelable<Parcelable>(javaClass.classLoader) as T
     }
diff --git a/compose/runtime/runtime/src/androidMain/kotlin/androidx/compose/runtime/MonotonicFrameClock.android.kt b/compose/runtime/runtime/src/androidMain/kotlin/androidx/compose/runtime/MonotonicFrameClock.android.kt
index a12bc89..fe9a294 100644
--- a/compose/runtime/runtime/src/androidMain/kotlin/androidx/compose/runtime/MonotonicFrameClock.android.kt
+++ b/compose/runtime/runtime/src/androidMain/kotlin/androidx/compose/runtime/MonotonicFrameClock.android.kt
@@ -28,9 +28,9 @@
 import kotlinx.coroutines.withContext
 
 /**
- * This is an inaccurate implementation that will only be used when running linked against
- * Android SDK stubs in host-side tests. A real implementation should synchronize with the
- * device's default display's vsync rate.
+ * This is an inaccurate implementation that will only be used when running linked against Android
+ * SDK stubs in host-side tests. A real implementation should synchronize with the device's default
+ * display's vsync rate.
  */
 private object FallbackFrameClock : MonotonicFrameClock {
     private const val DefaultFrameDelay = 16L // milliseconds
@@ -43,19 +43,18 @@
 }
 
 private object DefaultChoreographerFrameClock : MonotonicFrameClock {
-    private val choreographer = runBlocking(Dispatchers.Main.immediate) {
-        Choreographer.getInstance()
-    }
+    private val choreographer =
+        runBlocking(Dispatchers.Main.immediate) { Choreographer.getInstance() }
 
-    override suspend fun <R> withFrameNanos(
-        onFrame: (frameTimeNanos: Long) -> R
-    ): R = suspendCancellableCoroutine<R> { co ->
-        val callback = Choreographer.FrameCallback { frameTimeNanos ->
-            co.resumeWith(runCatching { onFrame(frameTimeNanos) })
+    override suspend fun <R> withFrameNanos(onFrame: (frameTimeNanos: Long) -> R): R =
+        suspendCancellableCoroutine<R> { co ->
+            val callback =
+                Choreographer.FrameCallback { frameTimeNanos ->
+                    co.resumeWith(runCatching { onFrame(frameTimeNanos) })
+                }
+            choreographer.postFrameCallback(callback)
+            co.invokeOnCancellation { choreographer.removeFrameCallback(callback) }
         }
-        choreographer.postFrameCallback(callback)
-        co.invokeOnCancellation { choreographer.removeFrameCallback(callback) }
-    }
 }
 
 // For local testing
@@ -71,6 +70,5 @@
     // When linked against Android SDK stubs and running host-side tests, APIs such as
     // Looper.getMainLooper() that will never return null on a real device will return null.
     // This branch offers an alternative solution.
-    if (Looper.getMainLooper() != null) DefaultChoreographerFrameClock
-    else FallbackFrameClock
+    if (Looper.getMainLooper() != null) DefaultChoreographerFrameClock else FallbackFrameClock
 }
diff --git a/compose/runtime/runtime/src/androidMain/kotlin/androidx/compose/runtime/SnapshotDoubleState.android.kt b/compose/runtime/runtime/src/androidMain/kotlin/androidx/compose/runtime/SnapshotDoubleState.android.kt
index 3288d35..3174957 100644
--- a/compose/runtime/runtime/src/androidMain/kotlin/androidx/compose/runtime/SnapshotDoubleState.android.kt
+++ b/compose/runtime/runtime/src/androidMain/kotlin/androidx/compose/runtime/SnapshotDoubleState.android.kt
@@ -20,14 +20,12 @@
 import android.os.Parcel
 import android.os.Parcelable
 
-internal actual fun createSnapshotMutableDoubleState(
-    value: Double
-): MutableDoubleState = ParcelableSnapshotMutableDoubleState(value)
+internal actual fun createSnapshotMutableDoubleState(value: Double): MutableDoubleState =
+    ParcelableSnapshotMutableDoubleState(value)
 
 @SuppressLint("BanParcelableUsage")
-private class ParcelableSnapshotMutableDoubleState(
-    value: Double
-) : SnapshotMutableDoubleStateImpl(value), Parcelable {
+private class ParcelableSnapshotMutableDoubleState(value: Double) :
+    SnapshotMutableDoubleStateImpl(value), Parcelable {
 
     override fun writeToParcel(parcel: Parcel, flags: Int) {
         parcel.writeDouble(doubleValue)
@@ -40,15 +38,16 @@
     companion object {
         @Suppress("unused")
         @JvmField
-        val CREATOR = object : Parcelable.Creator<ParcelableSnapshotMutableDoubleState> {
-            override fun createFromParcel(parcel: Parcel): ParcelableSnapshotMutableDoubleState {
-                return ParcelableSnapshotMutableDoubleState(
-                    value = parcel.readDouble()
-                )
-            }
+        val CREATOR =
+            object : Parcelable.Creator<ParcelableSnapshotMutableDoubleState> {
+                override fun createFromParcel(
+                    parcel: Parcel
+                ): ParcelableSnapshotMutableDoubleState {
+                    return ParcelableSnapshotMutableDoubleState(value = parcel.readDouble())
+                }
 
-            override fun newArray(size: Int) =
-                arrayOfNulls<ParcelableSnapshotMutableDoubleState>(size)
-        }
+                override fun newArray(size: Int) =
+                    arrayOfNulls<ParcelableSnapshotMutableDoubleState>(size)
+            }
     }
 }
diff --git a/compose/runtime/runtime/src/androidMain/kotlin/androidx/compose/runtime/SnapshotFloatState.android.kt b/compose/runtime/runtime/src/androidMain/kotlin/androidx/compose/runtime/SnapshotFloatState.android.kt
index e2ca04e..7ea7cec 100644
--- a/compose/runtime/runtime/src/androidMain/kotlin/androidx/compose/runtime/SnapshotFloatState.android.kt
+++ b/compose/runtime/runtime/src/androidMain/kotlin/androidx/compose/runtime/SnapshotFloatState.android.kt
@@ -20,14 +20,12 @@
 import android.os.Parcel
 import android.os.Parcelable
 
-internal actual fun createSnapshotMutableFloatState(
-    value: Float
-): MutableFloatState = ParcelableSnapshotMutableFloatState(value)
+internal actual fun createSnapshotMutableFloatState(value: Float): MutableFloatState =
+    ParcelableSnapshotMutableFloatState(value)
 
 @SuppressLint("BanParcelableUsage")
-private class ParcelableSnapshotMutableFloatState(
-    value: Float
-) : SnapshotMutableFloatStateImpl(value), Parcelable {
+private class ParcelableSnapshotMutableFloatState(value: Float) :
+    SnapshotMutableFloatStateImpl(value), Parcelable {
 
     override fun writeToParcel(parcel: Parcel, flags: Int) {
         parcel.writeFloat(floatValue)
@@ -40,15 +38,14 @@
     companion object {
         @Suppress("unused")
         @JvmField
-        val CREATOR = object : Parcelable.Creator<ParcelableSnapshotMutableFloatState> {
-            override fun createFromParcel(parcel: Parcel): ParcelableSnapshotMutableFloatState {
-                return ParcelableSnapshotMutableFloatState(
-                    value = parcel.readFloat()
-                )
-            }
+        val CREATOR =
+            object : Parcelable.Creator<ParcelableSnapshotMutableFloatState> {
+                override fun createFromParcel(parcel: Parcel): ParcelableSnapshotMutableFloatState {
+                    return ParcelableSnapshotMutableFloatState(value = parcel.readFloat())
+                }
 
-            override fun newArray(size: Int) =
-                arrayOfNulls<ParcelableSnapshotMutableFloatState>(size)
-        }
+                override fun newArray(size: Int) =
+                    arrayOfNulls<ParcelableSnapshotMutableFloatState>(size)
+            }
     }
 }
diff --git a/compose/runtime/runtime/src/androidMain/kotlin/androidx/compose/runtime/SnapshotIntState.android.kt b/compose/runtime/runtime/src/androidMain/kotlin/androidx/compose/runtime/SnapshotIntState.android.kt
index bf07dde..064d9b3 100644
--- a/compose/runtime/runtime/src/androidMain/kotlin/androidx/compose/runtime/SnapshotIntState.android.kt
+++ b/compose/runtime/runtime/src/androidMain/kotlin/androidx/compose/runtime/SnapshotIntState.android.kt
@@ -20,14 +20,12 @@
 import android.os.Parcel
 import android.os.Parcelable
 
-internal actual fun createSnapshotMutableIntState(
-    value: Int
-): MutableIntState = ParcelableSnapshotMutableIntState(value)
+internal actual fun createSnapshotMutableIntState(value: Int): MutableIntState =
+    ParcelableSnapshotMutableIntState(value)
 
 @SuppressLint("BanParcelableUsage")
-private class ParcelableSnapshotMutableIntState(
-    value: Int
-) : SnapshotMutableIntStateImpl(value), Parcelable {
+private class ParcelableSnapshotMutableIntState(value: Int) :
+    SnapshotMutableIntStateImpl(value), Parcelable {
 
     override fun writeToParcel(parcel: Parcel, flags: Int) {
         parcel.writeInt(intValue)
@@ -40,15 +38,14 @@
     companion object {
         @Suppress("unused")
         @JvmField
-        val CREATOR = object : Parcelable.Creator<ParcelableSnapshotMutableIntState> {
-            override fun createFromParcel(parcel: Parcel): ParcelableSnapshotMutableIntState {
-                return ParcelableSnapshotMutableIntState(
-                    value = parcel.readInt()
-                )
-            }
+        val CREATOR =
+            object : Parcelable.Creator<ParcelableSnapshotMutableIntState> {
+                override fun createFromParcel(parcel: Parcel): ParcelableSnapshotMutableIntState {
+                    return ParcelableSnapshotMutableIntState(value = parcel.readInt())
+                }
 
-            override fun newArray(size: Int) =
-                arrayOfNulls<ParcelableSnapshotMutableIntState>(size)
-        }
+                override fun newArray(size: Int) =
+                    arrayOfNulls<ParcelableSnapshotMutableIntState>(size)
+            }
     }
 }
diff --git a/compose/runtime/runtime/src/androidMain/kotlin/androidx/compose/runtime/SnapshotLongState.android.kt b/compose/runtime/runtime/src/androidMain/kotlin/androidx/compose/runtime/SnapshotLongState.android.kt
index 8da8b4c..7bdabf0 100644
--- a/compose/runtime/runtime/src/androidMain/kotlin/androidx/compose/runtime/SnapshotLongState.android.kt
+++ b/compose/runtime/runtime/src/androidMain/kotlin/androidx/compose/runtime/SnapshotLongState.android.kt
@@ -20,14 +20,12 @@
 import android.os.Parcel
 import android.os.Parcelable
 
-internal actual fun createSnapshotMutableLongState(
-    value: Long
-): MutableLongState = ParcelableSnapshotMutableLongState(value)
+internal actual fun createSnapshotMutableLongState(value: Long): MutableLongState =
+    ParcelableSnapshotMutableLongState(value)
 
 @SuppressLint("BanParcelableUsage")
-private class ParcelableSnapshotMutableLongState(
-    value: Long
-) : SnapshotMutableLongStateImpl(value), Parcelable {
+private class ParcelableSnapshotMutableLongState(value: Long) :
+    SnapshotMutableLongStateImpl(value), Parcelable {
 
     override fun writeToParcel(parcel: Parcel, flags: Int) {
         parcel.writeLong(longValue)
@@ -40,15 +38,14 @@
     companion object {
         @Suppress("unused")
         @JvmField
-        val CREATOR = object : Parcelable.Creator<ParcelableSnapshotMutableLongState> {
-            override fun createFromParcel(parcel: Parcel): ParcelableSnapshotMutableLongState {
-                return ParcelableSnapshotMutableLongState(
-                    value = parcel.readLong()
-                )
-            }
+        val CREATOR =
+            object : Parcelable.Creator<ParcelableSnapshotMutableLongState> {
+                override fun createFromParcel(parcel: Parcel): ParcelableSnapshotMutableLongState {
+                    return ParcelableSnapshotMutableLongState(value = parcel.readLong())
+                }
 
-            override fun newArray(size: Int) =
-                arrayOfNulls<ParcelableSnapshotMutableLongState>(size)
-        }
+                override fun newArray(size: Int) =
+                    arrayOfNulls<ParcelableSnapshotMutableLongState>(size)
+            }
     }
 }
diff --git a/compose/runtime/runtime/src/androidMain/kotlin/androidx/compose/runtime/SnapshotState.android.kt b/compose/runtime/runtime/src/androidMain/kotlin/androidx/compose/runtime/SnapshotState.android.kt
index 277feb9..25a7b37 100644
--- a/compose/runtime/runtime/src/androidMain/kotlin/androidx/compose/runtime/SnapshotState.android.kt
+++ b/compose/runtime/runtime/src/androidMain/kotlin/androidx/compose/runtime/SnapshotState.android.kt
@@ -27,10 +27,8 @@
 ): SnapshotMutableState<T> = ParcelableSnapshotMutableState(value, policy)
 
 @SuppressLint("BanParcelableUsage")
-private class ParcelableSnapshotMutableState<T>(
-    value: T,
-    policy: SnapshotMutationPolicy<T>
-) : SnapshotMutableStateImpl<T>(value, policy), Parcelable {
+private class ParcelableSnapshotMutableState<T>(value: T, policy: SnapshotMutationPolicy<T>) :
+    SnapshotMutableStateImpl<T>(value, policy), Parcelable {
 
     override fun writeToParcel(parcel: Parcel, flags: Int) {
         parcel.writeValue(value)
@@ -39,9 +37,10 @@
                 neverEqualPolicy<Any?>() -> PolicyNeverEquals
                 structuralEqualityPolicy<Any?>() -> PolicyStructuralEquality
                 referentialEqualityPolicy<Any?>() -> PolicyReferentialEquality
-                else -> throw IllegalStateException(
-                    "Only known types of MutableState's SnapshotMutationPolicy are supported"
-                )
+                else ->
+                    throw IllegalStateException(
+                        "Only known types of MutableState's SnapshotMutationPolicy are supported"
+                    )
             }
         )
     }
@@ -71,9 +70,10 @@
                             PolicyNeverEquals -> neverEqualPolicy()
                             PolicyStructuralEquality -> structuralEqualityPolicy()
                             PolicyReferentialEquality -> referentialEqualityPolicy()
-                            else -> throw IllegalStateException(
-                                "Unsupported MutableState policy $policyIndex was restored"
-                            )
+                            else ->
+                                throw IllegalStateException(
+                                    "Unsupported MutableState policy $policyIndex was restored"
+                                )
                         }
                     )
                 }
diff --git a/compose/runtime/runtime/src/androidMain/kotlin/androidx/compose/runtime/collection/ActualIntMap.android.kt b/compose/runtime/runtime/src/androidMain/kotlin/androidx/compose/runtime/collection/ActualIntMap.android.kt
index 67757a5..1f894ed 100644
--- a/compose/runtime/runtime/src/androidMain/kotlin/androidx/compose/runtime/collection/ActualIntMap.android.kt
+++ b/compose/runtime/runtime/src/androidMain/kotlin/androidx/compose/runtime/collection/ActualIntMap.android.kt
@@ -18,30 +18,21 @@
 
 import android.util.SparseArray
 
-internal actual class IntMap<E> private constructor(
-    private val sparseArray: android.util.SparseArray<E>
-) {
+internal actual class IntMap<E>
+private constructor(private val sparseArray: android.util.SparseArray<E>) {
 
     actual constructor(initialCapacity: Int) : this(SparseArray(initialCapacity))
 
-    /**
-     * True if this map contains key
-     */
+    /** True if this map contains key */
     actual operator fun contains(key: Int): Boolean = sparseArray.indexOfKey(key) >= 0
 
-    /**
-     * Get [key] or null
-     */
+    /** Get [key] or null */
     actual operator fun get(key: Int): E? = sparseArray[key]
 
-    /**
-     * Get [key] or [valueIfAbsent]
-     */
+    /** Get [key] or [valueIfAbsent] */
     actual fun get(key: Int, valueIfAbsent: E): E = sparseArray.get(key, valueIfAbsent)
 
-    /**
-     * Set [key] to [value]
-     */
+    /** Set [key] to [value] */
     actual operator fun set(key: Int, value: E) = sparseArray.put(key, value)
 
     /**
@@ -51,14 +42,10 @@
      */
     actual fun remove(key: Int) = sparseArray.remove(key)
 
-    /**
-     * Clear this map
-     */
+    /** Clear this map */
     actual fun clear() = sparseArray.clear()
 
-    /**
-     * Current count of values
-     */
+    /** Current count of values */
     actual val size: Int
         get() = sparseArray.size()
 }
diff --git a/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/Applier.kt b/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/Applier.kt
index 694aff4..500dec7 100644
--- a/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/Applier.kt
+++ b/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/Applier.kt
@@ -35,8 +35,8 @@
 @JvmDefaultWithCompatibility
 interface Applier<N> {
     /**
-     * The node that operations will be applied on at any given time. It is expected that the
-     * value of this property will change as [down] and [up] are called.
+     * The node that operations will be applied on at any given time. It is expected that the value
+     * of this property will change as [down] and [up] are called.
      */
     val current: N
 
@@ -47,22 +47,22 @@
     fun onBeginChanges() {}
 
     /**
-     * Called when the [Composer] is finished applying changes using this applier.
-     * A call to [onBeginChanges] will always precede a call to [onEndChanges].
+     * Called when the [Composer] is finished applying changes using this applier. A call to
+     * [onBeginChanges] will always precede a call to [onEndChanges].
      */
     fun onEndChanges() {}
 
     /**
      * Indicates that the applier is getting traversed "down" the tree. When this gets called,
-     * [node] is expected to be a child of [current], and after this operation, [node] is
-     * expected to be the new [current].
+     * [node] is expected to be a child of [current], and after this operation, [node] is expected
+     * to be the new [current].
      */
     fun down(node: N)
 
     /**
      * Indicates that the applier is getting traversed "up" the tree. After this operation
-     * completes, the [current] should return the "parent" of the [current] node at the beginning
-     * of this operation.
+     * completes, the [current] should return the "parent" of the [current] node at the beginning of
+     * this operation.
      */
     fun up()
 
@@ -74,12 +74,11 @@
      * inserted into it. [insertBottomUp] is called after all children have been created and
      * inserted.
      *
-     * Some trees are faster to build top-down, in which case the [insertTopDown] method should
-     * be used to insert the [instance]. Other trees are faster to build bottom-up in which case
+     * Some trees are faster to build top-down, in which case the [insertTopDown] method should be
+     * used to insert the [instance]. Other trees are faster to build bottom-up in which case
      * [insertBottomUp] should be used.
      *
      * To give example of building a tree top-down vs. bottom-up consider the following tree,
-     *
      * ```
      *      R
      *      |
@@ -88,9 +87,9 @@
      *    A   C
      *  ```
      *
-     *  where the node `B` is being inserted into the tree at `R`. Top-down building of the tree
-     *  first inserts `B` into `R`, then inserts `A` into `B` followed by inserting `C` into B`.
-     *  For example,
+     * where the node `B` is being inserted into the tree at `R`. Top-down building of the tree
+     * first inserts `B` into `R`, then inserts `A` into `B` followed by inserting `C` into B`. For
+     * example,
      *
      *  ```
      *      1           2           3
@@ -101,8 +100,8 @@
      *                A           A   C
      * ```
      *
-     * A bottom-up building of the tree starts with inserting `A` and `C` into `B` then inserts
-     * `B` tree into `R`.
+     * A bottom-up building of the tree starts with inserting `A` and `C` into `B` then inserts `B`
+     * tree into `R`.
      *
      * ```
      *    1           2           3
@@ -113,50 +112,46 @@
      *                          A   C
      * ```
      *
-     * To see how building top-down vs. bottom-up can differ significantly in performance
-     * consider a tree where whenever a child is added to the tree all parent nodes, up to the root,
-     * are notified of the new child entering the tree. If the tree is built top-down,
+     * To see how building top-down vs. bottom-up can differ significantly in performance consider a
+     * tree where whenever a child is added to the tree all parent nodes, up to the root, are
+     * notified of the new child entering the tree. If the tree is built top-down,
+     * 1. `R` is notified of `B` entering.
+     * 2. `B` is notified of `A` entering, `R` is notified of `A` entering.
+     * 3. `B` is notified of `C` entering, `R` is notified of `C` entering.
      *
-     *  1. `R` is notified of `B` entering.
-     *  2. `B` is notified of `A` entering, `R` is notified of `A` entering.
-     *  3. `B` is notified of `C` entering, `R` is notified of `C` entering.
+     * for a total of 5 notifications. The number of notifications grows exponentially with the
+     * number of inserts.
      *
-     *  for a total of 5 notifications. The number of notifications grows exponentially with the
-     *  number of inserts.
+     * For bottom-up, the notifications are,
+     * 1. `B` is notified `A` entering.
+     * 2. `B` is notified `C` entering.
+     * 3. `R` is notified `B` entering.
      *
-     *  For bottom-up, the notifications are,
+     * The notifications are linear to the number of nodes inserted.
      *
-     *  1. `B` is notified `A` entering.
-     *  2. `B` is notified `C` entering.
-     *  3. `R` is notified `B` entering.
+     * If, on the other hand, all children are notified when the parent enters a tree, then the
+     * notifications are, for top-down,
+     * 1. `B` is notified it is entering `R`.
+     * 2. `A` is notified it is entering `B`.
+     * 3. `C` is notified it is entering `B`.
      *
-     *  The notifications are linear to the number of nodes inserted.
+     * which is linear to the number of nodes inserted.
      *
-     *  If, on the other hand, all children are notified when the parent enters a tree, then the
-     *  notifications are, for top-down,
+     * For bottom-up, the notifications look like,
+     * 1. `A` is notified it is entering `B`.
+     * 2. `C` is notified it is entering `B`.
+     * 3. `B` is notified it is entering `R`, `A` is notified it is entering `R`, `C` is notified it
+     *    is entering `R`.
      *
-     *  1. `B` is notified it is entering `R`.
-     *  2. `A` is notified it is entering `B`.
-     *  3. `C` is notified it is entering `B`.
-     *
-     *  which is linear to the number of nodes inserted.
-     *
-     *  For bottom-up, the notifications look like,
-     *
-     *  1. `A` is notified it is entering `B`.
-     *  2. `C` is notified it is entering `B`.
-     *  3. `B` is notified it is entering `R`, `A` is notified it is entering `R`,
-     *     `C` is notified it is entering `R`.
-     *
-     *  which exponential to the number of nodes inserted.
+     *    which exponential to the number of nodes inserted.
      */
     fun insertTopDown(index: Int, instance: N)
 
     /**
      * Indicates that [instance] should be inserted as a child of [current] at [index]. An applier
-     * should insert the node into the tree either in [insertTopDown] or [insertBottomUp], not
-     * both. See the description of [insertTopDown] to which describes when to implement
-     * [insertTopDown] and when to use [insertBottomUp].
+     * should insert the node into the tree either in [insertTopDown] or [insertBottomUp], not both.
+     * See the description of [insertTopDown] to which describes when to implement [insertTopDown]
+     * and when to use [insertBottomUp].
      */
     fun insertBottomUp(index: Int, instance: N)
 
@@ -176,8 +171,8 @@
     fun move(from: Int, to: Int, count: Int)
 
     /**
-     * Move to the root and remove all nodes from the root, preparing both this [Applier]
-     * and its root to be used as the target of a new composition in the future.
+     * Move to the root and remove all nodes from the root, preparing both this [Applier] and its
+     * root to be used as the target of a new composition in the future.
      */
     fun clear()
 }
@@ -213,9 +208,7 @@
         onClear()
     }
 
-    /**
-     * Called to perform clearing of the [root] when [clear] is called.
-     */
+    /** Called to perform clearing of the [root] when [clear] is called. */
     protected abstract fun onClear()
 
     protected fun MutableList<T>.remove(index: Int, count: Int) {
@@ -247,12 +240,11 @@
     }
 }
 
-internal class OffsetApplier<N>(
-    private val applier: Applier<N>,
-    private val offset: Int
-) : Applier<N> {
+internal class OffsetApplier<N>(private val applier: Applier<N>, private val offset: Int) :
+    Applier<N> {
     private var nesting = 0
-    override val current: N get() = applier.current
+    override val current: N
+        get() = applier.current
 
     override fun down(node: N) {
         nesting++
diff --git a/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/BitwiseOperators.kt b/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/BitwiseOperators.kt
index 46615a3..8d105de 100644
--- a/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/BitwiseOperators.kt
+++ b/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/BitwiseOperators.kt
@@ -15,6 +15,7 @@
  */
 
 @file:Suppress("NOTHING_TO_INLINE")
+
 package androidx.compose.runtime
 
 // NOTE: rotateRight, marked @ExperimentalStdlibApi is also marked inline-only,
diff --git a/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/BroadcastFrameClock.kt b/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/BroadcastFrameClock.kt
index e524b29..8e42d1a 100644
--- a/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/BroadcastFrameClock.kt
+++ b/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/BroadcastFrameClock.kt
@@ -26,17 +26,15 @@
 /**
  * A simple frame clock.
  *
- * This implementation is intended for low-contention environments involving
- * low total numbers of threads in a pool on the order of ~number of CPU cores available for UI
- * recomposition work, while avoiding additional allocation where possible.
+ * This implementation is intended for low-contention environments involving low total numbers of
+ * threads in a pool on the order of ~number of CPU cores available for UI recomposition work, while
+ * avoiding additional allocation where possible.
  *
- * [onNewAwaiters] will be invoked whenever the number of awaiters has changed from 0 to 1.
- * If [onNewAwaiters] **fails** by throwing an exception it will permanently fail this
+ * [onNewAwaiters] will be invoked whenever the number of awaiters has changed from 0 to 1. If
+ * [onNewAwaiters] **fails** by throwing an exception it will permanently fail this
  * [BroadcastFrameClock]; all current and future awaiters will resume with the thrown exception.
  */
-class BroadcastFrameClock(
-    private val onNewAwaiters: (() -> Unit)? = null
-) : MonotonicFrameClock {
+class BroadcastFrameClock(private val onNewAwaiters: (() -> Unit)? = null) : MonotonicFrameClock {
 
     private class FrameAwaiter<R>(val onFrame: (Long) -> R, val continuation: Continuation<R>) {
         fun resume(timeNanos: Long) {
@@ -53,15 +51,13 @@
     // runtime.
     private val hasAwaitersUnlocked = AtomicInt(0)
 
-    /**
-     * `true` if there are any callers of [withFrameNanos] awaiting to run for a pending frame.
-     */
-    val hasAwaiters: Boolean get() = hasAwaitersUnlocked.get() != 0
+    /** `true` if there are any callers of [withFrameNanos] awaiting to run for a pending frame. */
+    val hasAwaiters: Boolean
+        get() = hasAwaitersUnlocked.get() != 0
 
     /**
-     * Send a frame for time [timeNanos] to all current callers of [withFrameNanos].
-     * The `onFrame` callback for each caller is invoked synchronously during the call to
-     * [sendFrame].
+     * Send a frame for time [timeNanos] to all current callers of [withFrameNanos]. The `onFrame`
+     * callback for each caller is invoked synchronously during the call to [sendFrame].
      */
     fun sendFrame(timeNanos: Long) {
         synchronized(lock) {
@@ -80,56 +76,55 @@
         }
     }
 
-    override suspend fun <R> withFrameNanos(
-        onFrame: (Long) -> R
-    ): R = suspendCancellableCoroutine { co ->
-        val awaiter = FrameAwaiter(onFrame, co)
-        val hasNewAwaiters = synchronized(lock) {
-            val cause = failureCause
-            if (cause != null) {
-                co.resumeWithException(cause)
-                return@suspendCancellableCoroutine
-            }
-            val hadAwaiters = awaiters.isNotEmpty()
-            awaiters.add(awaiter)
-            if (!hadAwaiters) hasAwaitersUnlocked.set(1)
-            !hadAwaiters
-        }
+    override suspend fun <R> withFrameNanos(onFrame: (Long) -> R): R =
+        suspendCancellableCoroutine { co ->
+            val awaiter = FrameAwaiter(onFrame, co)
+            val hasNewAwaiters =
+                synchronized(lock) {
+                    val cause = failureCause
+                    if (cause != null) {
+                        co.resumeWithException(cause)
+                        return@suspendCancellableCoroutine
+                    }
+                    val hadAwaiters = awaiters.isNotEmpty()
+                    awaiters.add(awaiter)
+                    if (!hadAwaiters) hasAwaitersUnlocked.set(1)
+                    !hadAwaiters
+                }
 
-        co.invokeOnCancellation {
-            synchronized(lock) {
-                awaiters.remove(awaiter)
-                if (awaiters.isEmpty()) hasAwaitersUnlocked.set(0)
+            co.invokeOnCancellation {
+                synchronized(lock) {
+                    awaiters.remove(awaiter)
+                    if (awaiters.isEmpty()) hasAwaitersUnlocked.set(0)
+                }
             }
-        }
 
-        // Wake up anything that was waiting for someone to schedule a frame
-        if (hasNewAwaiters && onNewAwaiters != null) {
-            try {
-                // BUG: Kotlin 1.4.21 plugin doesn't smart cast for a direct onNewAwaiters() here
-                onNewAwaiters.invoke()
-            } catch (t: Throwable) {
-                // If onNewAwaiters fails, we permanently fail the BroadcastFrameClock.
-                fail(t)
+            // Wake up anything that was waiting for someone to schedule a frame
+            if (hasNewAwaiters && onNewAwaiters != null) {
+                try {
+                    // BUG: Kotlin 1.4.21 plugin doesn't smart cast for a direct onNewAwaiters()
+                    // here
+                    onNewAwaiters.invoke()
+                } catch (t: Throwable) {
+                    // If onNewAwaiters fails, we permanently fail the BroadcastFrameClock.
+                    fail(t)
+                }
             }
         }
-    }
 
     private fun fail(cause: Throwable) {
         synchronized(lock) {
             if (failureCause != null) return
             failureCause = cause
-            awaiters.fastForEach { awaiter ->
-                awaiter.continuation.resumeWithException(cause)
-            }
+            awaiters.fastForEach { awaiter -> awaiter.continuation.resumeWithException(cause) }
             awaiters.clear()
             hasAwaitersUnlocked.set(0)
         }
     }
 
     /**
-     * Permanently cancel this [BroadcastFrameClock] and cancel all current and future
-     * awaiters with [cancellationException].
+     * Permanently cancel this [BroadcastFrameClock] and cancel all current and future awaiters with
+     * [cancellationException].
      */
     fun cancel(
         cancellationException: CancellationException = CancellationException("clock cancelled")
diff --git a/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/Composable.kt b/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/Composable.kt
index 29c6b30..c831b65 100644
--- a/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/Composable.kt
+++ b/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/Composable.kt
@@ -20,16 +20,15 @@
  * [Composable] functions are the fundamental building blocks of an application built with Compose.
  *
  * [Composable] can be applied to a function or lambda to indicate that the function/lambda can be
- * used as part of a composition to describe a transformation from application data into a
- * tree or hierarchy.
+ * used as part of a composition to describe a transformation from application data into a tree or
+ * hierarchy.
  *
  * Annotating a function or expression with [Composable] changes the type of that function or
  * expression. For example, [Composable] functions can only ever be called from within another
  * [Composable] function. A useful mental model for [Composable] functions is that an implicit
- * "composable context" is passed into a [Composable] function, and is done so implicitly when it
- * is called from within another [Composable] function.  This "context" can be used to store
- * information from previous executions of the function that happened at the same logical point of
- * the tree.
+ * "composable context" is passed into a [Composable] function, and is done so implicitly when it is
+ * called from within another [Composable] function. This "context" can be used to store information
+ * from previous executions of the function that happened at the same logical point of the tree.
  */
 @MustBeDocumented
 @Retention(AnnotationRetention.BINARY)
diff --git a/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/ComposableOpenTarget.kt b/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/ComposableOpenTarget.kt
index 5a2ee7f..226df2e 100644
--- a/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/ComposableOpenTarget.kt
+++ b/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/ComposableOpenTarget.kt
@@ -17,26 +17,24 @@
 package androidx.compose.runtime
 
 /**
- * The [Composable] declares that it doesn't expect a particular applier. See
- * [ComposableTarget] for more details on what appliers a [Composable] function expects.
+ * The [Composable] declares that it doesn't expect a particular applier. See [ComposableTarget] for
+ * more details on what appliers a [Composable] function expects.
  *
  * In a [Composable] function, all the open composable appliers with the same applier index must
- * have the same name.. [CompositionLocalProvider], for example, can use [ComposableOpenTarget]
- * to declare that its content parameter must have the same applier as it receives, since it
- * calls the content parameter directly, but it could be any applier. [ComposableOpenTarget], in
- * this way, works like an open type parameter for the type of applier used by the implied
- * composer parameter.
+ * have the same name.. [CompositionLocalProvider], for example, can use [ComposableOpenTarget] to
+ * declare that its content parameter must have the same applier as it receives, since it calls the
+ * content parameter directly, but it could be any applier. [ComposableOpenTarget], in this way,
+ * works like an open type parameter for the type of applier used by the implied composer parameter.
  *
- * Th [ComposableOpenTarget] is unlikely to be required explicitly as it is inferred
- * automatically by the Compose compiler plugin. See [ComposableTarget] for more details on how
- * attributes are inferred.
+ * Th [ComposableOpenTarget] is unlikely to be required explicitly as it is inferred automatically
+ * by the Compose compiler plugin. See [ComposableTarget] for more details on how attributes are
+ * inferred.
  *
  * @param index The index of the open applier parameter. All open appliers with the same
- * non-negative index in the same declaration must have the same name. All negative indexes are
- * considered anonymous and can match any applier. If the [index] is only used once in a
- * declaration it can also match any applier but it is recommended to use a negative index
- * instead or just leave the annotation off as a missing annotation is equivalent to an anonymous
- * applier.
+ *   non-negative index in the same declaration must have the same name. All negative indexes are
+ *   considered anonymous and can match any applier. If the [index] is only used once in a
+ *   declaration it can also match any applier but it is recommended to use a negative index instead
+ *   or just leave the annotation off as a missing annotation is equivalent to an anonymous applier.
  */
 @Retention(AnnotationRetention.BINARY)
 @Target(
diff --git a/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/ComposableTarget.kt b/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/ComposableTarget.kt
index eed1f93..b74ae39 100644
--- a/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/ComposableTarget.kt
+++ b/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/ComposableTarget.kt
@@ -18,21 +18,20 @@
 
 /**
  * The [Composable] function is declared to expect an applier with the name [applier]. The [applier]
- * name can be an arbitrary string but is expected to be a fully qualified name of a class that
- * is annotated by [ComposableTargetMarker] containing a descriptive name to be used in diagnostic
+ * name can be an arbitrary string but is expected to be a fully qualified name of a class that is
+ * annotated by [ComposableTargetMarker] containing a descriptive name to be used in diagnostic
  * messages.
  *
  * The [applier] name is used in diagnostic messages but, if it refers to a marked annotation,
  * [ComposableTargetMarker.description] is used instead of the class name.
  *
  * The Compose compiler plugin can, in most cases, infer this or an equivalent
- * [ComposableInferredTarget], for composable functions. For example, if a composable function
- * calls another composable function then both must be of the same group of composable functions
- * (that is, have declared or inferred the same [applier] value). This means that, if the function
- * called is already determined to be in a group, them the function that calls it must also be in
- * the same group. If two functions are called of different groups then the Compose compiler plugin
- * will generate an diagnostic message describing which group was received and which group was
- * expected.
+ * [ComposableInferredTarget], for composable functions. For example, if a composable function calls
+ * another composable function then both must be of the same group of composable functions (that is,
+ * have declared or inferred the same [applier] value). This means that, if the function called is
+ * already determined to be in a group, them the function that calls it must also be in the same
+ * group. If two functions are called of different groups then the Compose compiler plugin will
+ * generate an diagnostic message describing which group was received and which group was expected.
  *
  * The grouping of composable functions corresponds to the instance of [Applier] that is required to
  * be used by the [Composer] to apply changes to the composition. The [Applier] is checked at
@@ -42,19 +41,18 @@
  * [Composable] function will result in the [Applier] check failing.
  *
  * In most cases this annotation can be inferred. However, this annotation is required for
- * [Composable] functions that call [ComposeNode] directly, for abstract methods, such as
- * interfaces functions (which do not contain a body from which the plugin can infer the
- * annotation), when using a composable lambda in sub-composition, or when a composable lambda is
- * stored in a class field or global variable.
+ * [Composable] functions that call [ComposeNode] directly, for abstract methods, such as interfaces
+ * functions (which do not contain a body from which the plugin can infer the annotation), when
+ * using a composable lambda in sub-composition, or when a composable lambda is stored in a class
+ * field or global variable.
  *
  * Leaving the annotation off in such cases will result in the compiler ignoring the function and it
  * will not emit the diagnostic when the function is called incorrectly.
  *
- * @param applier The applier name used during composable call checking. This is usually
- * inferred by the compiler. This can be an arbitrary string value but is expected to be a fully
- * qualified name of a class that is marked with [ComposableTargetMarker].
+ * @param applier The applier name used during composable call checking. This is usually inferred by
+ *   the compiler. This can be an arbitrary string value but is expected to be a fully qualified
+ *   name of a class that is marked with [ComposableTargetMarker].
  */
-
 @Retention(AnnotationRetention.BINARY)
 @Target(
     AnnotationTarget.FILE,
diff --git a/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/Composables.kt b/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/Composables.kt
index e7b8507..0ac1d58 100644
--- a/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/Composables.kt
+++ b/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/Composables.kt
@@ -25,22 +25,18 @@
     currentComposer.cache(false, calculation)
 
 /**
- * Remember the value returned by [calculation] if [key1] compares equal (`==`) to the value it
- * had in the previous composition, otherwise produce and remember a new value by calling
- * [calculation].
+ * Remember the value returned by [calculation] if [key1] compares equal (`==`) to the value it had
+ * in the previous composition, otherwise produce and remember a new value by calling [calculation].
  */
 @Composable
-inline fun <T> remember(
-    key1: Any?,
-    crossinline calculation: @DisallowComposableCalls () -> T
-): T {
+inline fun <T> remember(key1: Any?, crossinline calculation: @DisallowComposableCalls () -> T): T {
     return currentComposer.cache(currentComposer.changed(key1), calculation)
 }
 
 /**
- * Remember the value returned by [calculation] if [key1] and [key2] are equal (`==`) to the
- * values they had in the previous composition, otherwise produce and remember a new value by
- * calling [calculation].
+ * Remember the value returned by [calculation] if [key1] and [key2] are equal (`==`) to the values
+ * they had in the previous composition, otherwise produce and remember a new value by calling
+ * [calculation].
  */
 @Composable
 inline fun <T> remember(
@@ -111,9 +107,9 @@
  *
  * @sample androidx.compose.runtime.samples.NotAlwaysUniqueKeys
  *
- * This example assumes that `parent.id` is a unique key for each item in the collection,
- * but this is only true if it is fair to assume that a parent will only ever have a single child,
- * which may not be the case.  Instead, it may be more correct to do the following:
+ * This example assumes that `parent.id` is a unique key for each item in the collection, but this
+ * is only true if it is fair to assume that a parent will only ever have a single child, which may
+ * not be the case. Instead, it may be more correct to do the following:
  *
  * @sample androidx.compose.runtime.samples.MoreCorrectUniqueKeys
  *
@@ -122,30 +118,24 @@
  * @sample androidx.compose.runtime.samples.TwoInputsKeySample
  *
  * @param keys The set of values to be used to create a compound key. These will be compared to
- * their previous values using [equals] and [hashCode]
+ *   their previous values using [equals] and [hashCode]
  * @param block The composable children for this group.
  */
 @Composable
-inline fun <T> key(
-    @Suppress("UNUSED_PARAMETER")
-    vararg keys: Any?,
-    block: @Composable () -> T
-) = block()
+inline fun <T> key(@Suppress("UNUSED_PARAMETER") vararg keys: Any?, block: @Composable () -> T) =
+    block()
 
 /**
  * A utility function to mark a composition as supporting recycling. If the [key] changes the
- * composition is replaced by a new composition (as would happen for [key]) but reusable nodes
- * that are emitted by [ReusableComposeNode] are reused.
+ * composition is replaced by a new composition (as would happen for [key]) but reusable nodes that
+ * are emitted by [ReusableComposeNode] are reused.
  *
- * @param key the value that is used to trigger recycling. If recomposed with a different value
- * the composer creates a new composition but tries to reuse reusable nodes.
+ * @param key the value that is used to trigger recycling. If recomposed with a different value the
+ *   composer creates a new composition but tries to reuse reusable nodes.
  * @param content the composable children that are recyclable.
  */
 @Composable
-inline fun ReusableContent(
-    key: Any?,
-    content: @Composable () -> Unit
-) {
+inline fun ReusableContent(key: Any?, content: @Composable () -> Unit) {
     currentComposer.startReusableGroup(reuseKey, key)
     content()
     currentComposer.endReusableGroup()
@@ -159,17 +149,14 @@
  * remembered state of the composition's lifetime being arbitrarily extended.
  *
  * @param active when [active] is `true` [content] is composed normally. When [active] is `false`
- * then the content is deactivated and all remembered state is treated as if the content was
- * deleted but the nodes managed by the composition's [Applier] are unaffected. A [active] becomes
- * `true` any reusable nodes from the previously active composition are candidates for reuse.
+ *   then the content is deactivated and all remembered state is treated as if the content was
+ *   deleted but the nodes managed by the composition's [Applier] are unaffected. A [active] becomes
+ *   `true` any reusable nodes from the previously active composition are candidates for reuse.
  * @param content the composable content that is managed by this composable.
  */
 @Composable
 @ExplicitGroupsComposable
-inline fun ReusableContentHost(
-    active: Boolean,
-    crossinline content: @Composable () -> Unit
-) {
+inline fun ReusableContentHost(active: Boolean, crossinline content: @Composable () -> Unit) {
     currentComposer.startReusableGroup(reuseKey, active)
     val activeChanged = currentComposer.changed(active)
     if (active) {
@@ -180,12 +167,13 @@
     currentComposer.endReusableGroup()
 }
 
-/**
- * TODO(lmr): provide documentation
- */
+/** TODO(lmr): provide documentation */
 val currentComposer: Composer
     @ReadOnlyComposable
-    @Composable get() { throw NotImplementedError("Implemented as an intrinsic") }
+    @Composable
+    get() {
+        throw NotImplementedError("Implemented as an intrinsic")
+    }
 
 /**
  * Returns an object which can be used to invalidate the current scope at this point in composition.
@@ -194,33 +182,31 @@
 val currentRecomposeScope: RecomposeScope
     @ReadOnlyComposable
     @OptIn(InternalComposeApi::class)
-    @Composable get() {
+    @Composable
+    get() {
         val scope = currentComposer.recomposeScope ?: error("no recompose scope found")
         currentComposer.recordUsed(scope)
         return scope
     }
 
 /**
- * Returns the current [CompositionLocalContext] which contains all
- * [CompositionLocal]'s in the current composition and their values
- * provided by [CompositionLocalProvider]'s.
- * This context can be used to pass locals to another composition via [CompositionLocalProvider].
- * That is usually needed if another composition is not a subcomposition of the current one.
+ * Returns the current [CompositionLocalContext] which contains all [CompositionLocal]'s in the
+ * current composition and their values provided by [CompositionLocalProvider]'s. This context can
+ * be used to pass locals to another composition via [CompositionLocalProvider]. That is usually
+ * needed if another composition is not a subcomposition of the current one.
  */
 @OptIn(InternalComposeApi::class)
 val currentCompositionLocalContext: CompositionLocalContext
-    @Composable get() = CompositionLocalContext(
-        currentComposer.buildContext().getCompositionLocalScope()
-    )
+    @Composable
+    get() = CompositionLocalContext(currentComposer.buildContext().getCompositionLocalScope())
 
 /**
- * This a hash value used to coordinate map externally stored state to the composition. For
- * example, this is used by saved instance state to preserve state across activity lifetime
- * boundaries.
+ * This a hash value used to coordinate map externally stored state to the composition. For example,
+ * this is used by saved instance state to preserve state across activity lifetime boundaries.
  *
- * This value is likely to be unique but is not guaranteed unique. There are known cases,
- * such as for loops without a [key], where the runtime does not have enough information to
- * make the compound key hash unique.
+ * This value is likely to be unique but is not guaranteed unique. There are known cases, such as
+ * for loops without a [key], where the runtime does not have enough information to make the
+ * compound key hash unique.
  */
 val currentCompositeKeyHash: Int
     @Composable
@@ -237,10 +223,9 @@
  * @sample androidx.compose.runtime.samples.CustomTreeComposition
  *
  * @param factory A function which will create a new instance of [T]. This function is NOT
- * guaranteed to be called in place.
+ *   guaranteed to be called in place.
  * @param update A function to perform updates on the node. This will run every time emit is
- * executed. This function is called in place and will be inlined.
- *
+ *   executed. This function is called in place and will be inlined.
  * @see Updater
  * @see Applier
  * @see Composition
@@ -248,7 +233,8 @@
 // ComposeNode is a special case of readonly composable and handles creating its own groups, so
 // it is okay to use.
 @Suppress("NONREADONLY_CALL_IN_READONLY_COMPOSABLE", "UnnecessaryLambdaCreation")
-@Composable inline fun <T : Any, reified E : Applier<*>> ComposeNode(
+@Composable
+inline fun <T : Any, reified E : Applier<*>> ComposeNode(
     noinline factory: () -> T,
     update: @DisallowComposableCalls Updater<T>.() -> Unit
 ) {
@@ -272,10 +258,9 @@
  * @sample androidx.compose.runtime.samples.CustomTreeComposition
  *
  * @param factory A function which will create a new instance of [T]. This function is NOT
- * guaranteed to be called in place.
+ *   guaranteed to be called in place.
  * @param update A function to perform updates on the node. This will run every time emit is
- * executed. This function is called in place and will be inlined.
- *
+ *   executed. This function is called in place and will be inlined.
  * @see Updater
  * @see Applier
  * @see Composition
@@ -283,7 +268,8 @@
 // ComposeNode is a special case of readonly composable and handles creating its own groups, so
 // it is okay to use.
 @Suppress("NONREADONLY_CALL_IN_READONLY_COMPOSABLE", "UnnecessaryLambdaCreation")
-@Composable inline fun <T : Any, reified E : Applier<*>> ReusableComposeNode(
+@Composable
+inline fun <T : Any, reified E : Applier<*>> ReusableComposeNode(
     noinline factory: () -> T,
     update: @DisallowComposableCalls Updater<T>.() -> Unit
 ) {
@@ -308,11 +294,10 @@
  * @sample androidx.compose.runtime.samples.CustomTreeComposition
  *
  * @param factory A function which will create a new instance of [T]. This function is NOT
- * guaranteed to be called in place.
+ *   guaranteed to be called in place.
  * @param update A function to perform updates on the node. This will run every time emit is
- * executed. This function is called in place and will be inlined.
+ *   executed. This function is called in place and will be inlined.
  * @param content the composable content that will emit the "children" of this node.
- *
  * @see Updater
  * @see Applier
  * @see Composition
@@ -348,11 +333,10 @@
  * @sample androidx.compose.runtime.samples.CustomTreeComposition
  *
  * @param factory A function which will create a new instance of [T]. This function is NOT
- * guaranteed to be called in place.
+ *   guaranteed to be called in place.
  * @param update A function to perform updates on the node. This will run every time emit is
- * executed. This function is called in place and will be inlined.
+ *   executed. This function is called in place and will be inlined.
  * @param content the composable content that will emit the "children" of this node.
- *
  * @see Updater
  * @see Applier
  * @see Composition
@@ -388,22 +372,22 @@
  * @sample androidx.compose.runtime.samples.CustomTreeComposition
  *
  * @param factory A function which will create a new instance of [T]. This function is NOT
- * guaranteed to be called in place.
+ *   guaranteed to be called in place.
  * @param update A function to perform updates on the node. This will run every time emit is
- * executed. This function is called in place and will be inlined.
- * @param skippableUpdate A function to perform updates on the node. Unlike [update], this
- * function is Composable and will therefore be skipped unless it has been invalidated by some
- * other mechanism. This can be useful to perform expensive calculations for updating the node
- * where the calculations are likely to have the same inputs over time, so the function's
- * execution can be skipped.
+ *   executed. This function is called in place and will be inlined.
+ * @param skippableUpdate A function to perform updates on the node. Unlike [update], this function
+ *   is Composable and will therefore be skipped unless it has been invalidated by some other
+ *   mechanism. This can be useful to perform expensive calculations for updating the node where the
+ *   calculations are likely to have the same inputs over time, so the function's execution can be
+ *   skipped.
  * @param content the composable content that will emit the "children" of this node.
- *
  * @see Updater
  * @see SkippableUpdater
  * @see Applier
  * @see Composition
  */
-@Composable @ExplicitGroupsComposable
+@Composable
+@ExplicitGroupsComposable
 inline fun <T, reified E : Applier<*>> ComposeNode(
     noinline factory: () -> T,
     update: @DisallowComposableCalls Updater<T>.() -> Unit,
@@ -435,22 +419,22 @@
  * @sample androidx.compose.runtime.samples.CustomTreeComposition
  *
  * @param factory A function which will create a new instance of [T]. This function is NOT
- * guaranteed to be called in place.
+ *   guaranteed to be called in place.
  * @param update A function to perform updates on the node. This will run every time emit is
- * executed. This function is called in place and will be inlined.
- * @param skippableUpdate A function to perform updates on the node. Unlike [update], this
- * function is Composable and will therefore be skipped unless it has been invalidated by some
- * other mechanism. This can be useful to perform expensive calculations for updating the node
- * where the calculations are likely to have the same inputs over time, so the function's
- * execution can be skipped.
+ *   executed. This function is called in place and will be inlined.
+ * @param skippableUpdate A function to perform updates on the node. Unlike [update], this function
+ *   is Composable and will therefore be skipped unless it has been invalidated by some other
+ *   mechanism. This can be useful to perform expensive calculations for updating the node where the
+ *   calculations are likely to have the same inputs over time, so the function's execution can be
+ *   skipped.
  * @param content the composable content that will emit the "children" of this node.
- *
  * @see Updater
  * @see SkippableUpdater
  * @see Applier
  * @see Composition
  */
-@Composable @ExplicitGroupsComposable
+@Composable
+@ExplicitGroupsComposable
 inline fun <T, reified E : Applier<*>> ReusableComposeNode(
     noinline factory: () -> T,
     update: @DisallowComposableCalls Updater<T>.() -> Unit,
@@ -472,8 +456,7 @@
     currentComposer.endNode()
 }
 
-@PublishedApi
-internal fun invalidApplier(): Unit = error("Invalid applier")
+@PublishedApi internal fun invalidApplier(): Unit = error("Invalid applier")
 
 /**
  * An Effect to construct a [CompositionContext] at the current point of composition. This can be
@@ -482,6 +465,7 @@
  * context is invalidated.
  */
 @OptIn(InternalComposeApi::class)
-@Composable fun rememberCompositionContext(): CompositionContext {
+@Composable
+fun rememberCompositionContext(): CompositionContext {
     return currentComposer.buildContext()
 }
diff --git a/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/ComposeNodeLifecycleCallback.kt b/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/ComposeNodeLifecycleCallback.kt
index 55377e1..62d7b7ee 100644
--- a/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/ComposeNodeLifecycleCallback.kt
+++ b/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/ComposeNodeLifecycleCallback.kt
@@ -21,30 +21,29 @@
  * [ReusableContentHost] and [ReusableContent].
  *
  * The [ReusableContentHost] introduces the concept of reusing (or recycling) nodes, as well as
- * deactivating parts of composition, while keeping the nodes around to reuse common structures
- * in the next iteration. In this state, [RememberObserver] is not sufficient to track lifetime
- * of data associated with reused node, as deactivated or reused parts of composition is disposed.
+ * deactivating parts of composition, while keeping the nodes around to reuse common structures in
+ * the next iteration. In this state, [RememberObserver] is not sufficient to track lifetime of data
+ * associated with reused node, as deactivated or reused parts of composition is disposed.
  *
- * These callbacks track intermediate states of the node in reusable groups for managing
- * data contained inside reusable nodes or associated with them (e.g. subcomposition).
+ * These callbacks track intermediate states of the node in reusable groups for managing data
+ * contained inside reusable nodes or associated with them (e.g. subcomposition).
  *
  * Important: the runtime only supports node implementation of this interface.
  */
 interface ComposeNodeLifecycleCallback {
     /**
-     * Invoked when the node was reused in the composition.
-     * Consumers might use this callback to reset data associated with the previous content, as
-     * it is no longer valid.
+     * Invoked when the node was reused in the composition. Consumers might use this callback to
+     * reset data associated with the previous content, as it is no longer valid.
      */
     fun onReuse()
 
     /**
-     * Invoked when the group containing the node was deactivated.
-     * This happens when the content of [ReusableContentHost] is deactivated.
+     * Invoked when the group containing the node was deactivated. This happens when the content of
+     * [ReusableContentHost] is deactivated.
      *
-     * The node will not be reused in this recompose cycle, but might be reused or released in
-     * the future. Consumers might use this callback to release expensive resources or stop
-     * continuous process that was dependent on the node being used in composition.
+     * The node will not be reused in this recompose cycle, but might be reused or released in the
+     * future. Consumers might use this callback to release expensive resources or stop continuous
+     * process that was dependent on the node being used in composition.
      *
      * If the node is reused, [onReuse] will be called again to prepare the node for reuse.
      * Similarly, [onRelease] will indicate that deactivated node will never be reused again.
@@ -52,8 +51,8 @@
     fun onDeactivate()
 
     /**
-     * Invoked when the node exits the composition entirely and won't be reused again.
-     * All intermediate data related to the node can be safely disposed.
+     * Invoked when the node exits the composition entirely and won't be reused again. All
+     * intermediate data related to the node can be safely disposed.
      */
     fun onRelease()
 }
diff --git a/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/ComposeVersion.kt b/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/ComposeVersion.kt
index 23727bf..2ac484a 100644
--- a/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/ComposeVersion.kt
+++ b/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/ComposeVersion.kt
@@ -19,8 +19,8 @@
 @Suppress("unused")
 internal object ComposeVersion {
     /**
-     * This version number is used by the compose compiler in order to verify that the compiler
-     * and the runtime are compatible with one another.
+     * This version number is used by the compose compiler in order to verify that the compiler and
+     * the runtime are compatible with one another.
      *
      * Every release should increase this number to a multiple of 100, which provides for the
      * opportunity to use the last two digits for releases made out-of-band.
diff --git a/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/Composer.kt b/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/Composer.kt
index 20678df..b582d4c 100644
--- a/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/Composer.kt
+++ b/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/Composer.kt
@@ -17,6 +17,7 @@
 @file:OptIn(
     InternalComposeApi::class,
 )
+
 package androidx.compose.runtime
 
 import androidx.collection.MutableIntIntMap
@@ -59,26 +60,20 @@
      */
     var nodeIndex: Int,
 
-    /**
-     * The current number of nodes the group contains after changes have been applied
-     */
+    /** The current number of nodes the group contains after changes have been applied */
     var nodeCount: Int
 )
 
 /**
- * An interface used during [ControlledComposition.applyChanges] and [Composition.dispose] to
- * track when [RememberObserver] instances and leave the composition an also allows recording
- * [SideEffect] calls.
+ * An interface used during [ControlledComposition.applyChanges] and [Composition.dispose] to track
+ * when [RememberObserver] instances and leave the composition an also allows recording [SideEffect]
+ * calls.
  */
 internal interface RememberManager {
-    /**
-     * The [RememberObserver] is being remembered by a slot in the slot table.
-     */
+    /** The [RememberObserver] is being remembered by a slot in the slot table. */
     fun remembering(instance: RememberObserver)
 
-    /**
-     * The [RememberObserver] is being forgotten by a slot in the slot table.
-     */
+    /** The [RememberObserver] is being forgotten by a slot in the slot table. */
     fun forgetting(
         instance: RememberObserver,
         endRelativeOrder: Int,
@@ -92,9 +87,7 @@
      */
     fun sideEffect(effect: () -> Unit)
 
-    /**
-     * The [ComposeNodeLifecycleCallback] is being deactivated.
-     */
+    /** The [ComposeNodeLifecycleCallback] is being deactivated. */
     fun deactivating(
         instance: ComposeNodeLifecycleCallback,
         endRelativeOrder: Int,
@@ -102,9 +95,7 @@
         endRelativeAfter: Int
     )
 
-    /**
-     * The [ComposeNodeLifecycleCallback] is being released.
-     */
+    /** The [ComposeNodeLifecycleCallback] is being released. */
     fun releasing(
         instance: ComposeNodeLifecycleCallback,
         endRelativeOrder: Int,
@@ -118,10 +109,7 @@
  * changed. It is used to determine how to update the nodes and the slot table when changes to the
  * structure of the tree is detected.
  */
-private class Pending(
-    val keyInfos: MutableList<KeyInfo>,
-    val startIndex: Int
-) {
+private class Pending(val keyInfos: MutableList<KeyInfo>, val startIndex: Int) {
     var groupIndex: Int = 0
 
     init {
@@ -153,20 +141,17 @@
         }
     }
 
-    /**
-     * Get the next key information for the given key.
-     */
+    /** Get the next key information for the given key. */
     fun getNext(key: Int, dataKey: Any?): KeyInfo? {
         val joinedKey: Any = if (dataKey != null) JoinedKey(key, dataKey) else key
         return keyMap.pop(joinedKey)
     }
 
-    /**
-     * Record that this key info was generated.
-     */
+    /** Record that this key info was generated. */
     fun recordUsed(keyInfo: KeyInfo) = usedKeys.add(keyInfo)
 
-    val used: List<KeyInfo> get() = usedKeys
+    val used: List<KeyInfo>
+        get() = usedKeys
 
     // TODO(chuckj): This is a correct but expensive implementation (worst cases of O(N^2)). Rework
     // to O(N)
@@ -217,8 +202,7 @@
                 groupInfos.forEachValue { childGroupInfo ->
                     if (childGroupInfo.nodeIndex >= index && childGroupInfo != groupInfo) {
                         val newIndex = childGroupInfo.nodeIndex + difference
-                        if (newIndex >= 0)
-                            childGroupInfo.nodeIndex = newIndex
+                        if (newIndex >= 0) childGroupInfo.nodeIndex = newIndex
                     }
                 }
             }
@@ -239,14 +223,10 @@
 }
 
 private class Invalidation(
-    /**
-     * The recompose scope being invalidate
-     */
+    /** The recompose scope being invalidate */
     val scope: RecomposeScopeImpl,
 
-    /**
-     * The index of the group in the slot table being invalidated.
-     */
+    /** The index of the group in the slot table being invalidated. */
     val location: Int,
 
     /**
@@ -263,8 +243,8 @@
 }
 
 /**
- * Internal compose compiler plugin API that is used to update the function the composer will
- * call to recompose a recomposition scope. This should not be used or called directly.
+ * Internal compose compiler plugin API that is used to update the function the composer will call
+ * to recompose a recomposition scope. This should not be used or called directly.
  */
 @ComposeCompilerApi
 interface ScopeUpdateScope {
@@ -293,24 +273,24 @@
     SCHEDULED,
 
     /**
-     * The composition that owns the recompose scope is actively composing but the scope has
-     * already been composed or is in the process of composing. The invalidation is treated as
-     * SCHEDULED above.
+     * The composition that owns the recompose scope is actively composing but the scope has already
+     * been composed or is in the process of composing. The invalidation is treated as SCHEDULED
+     * above.
      */
     DEFERRED,
 
     /**
-     * The composition that owns the recompose scope is actively composing and the invalidated
-     * scope has not been composed yet but will be recomposed before the composition completes. A
-     * new recomposition was not scheduled for this invalidation.
+     * The composition that owns the recompose scope is actively composing and the invalidated scope
+     * has not been composed yet but will be recomposed before the composition completes. A new
+     * recomposition was not scheduled for this invalidation.
      */
     IMMINENT
 }
 
 /**
  * An instance to hold a value provided by [CompositionLocalProvider] and is created by the
- * [ProvidableCompositionLocal.provides] infix operator. If [canOverride] is `false`, the
- * provided value will not overwrite a potentially already existing value in the scope.
+ * [ProvidableCompositionLocal.provides] infix operator. If [canOverride] is `false`, the provided
+ * value will not overwrite a potentially already existing value in the scope.
  *
  * This value cannot be created directly. It can only be created by using one of the `provides`
  * operators of [ProvidableCompositionLocal].
@@ -319,7 +299,8 @@
  * @see ProvidableCompositionLocal.providesDefault
  * @see ProvidableCompositionLocal.providesComputed
  */
-class ProvidedValue<T> internal constructor(
+class ProvidedValue<T>
+internal constructor(
     /**
      * The composition local that is provided by this value. This is the left-hand side of the
      * [ProvidableCompositionLocal.provides] infix operator.
@@ -339,7 +320,8 @@
      * right-hand side of the operator.
      */
     @Suppress("UNCHECKED_CAST")
-    val value: T get() = providedValue as T
+    val value: T
+        get() = providedValue as T
 
     /**
      * This value is `true` if the provided value will override any value provided above it. This
@@ -352,15 +334,19 @@
     @get:JvmName("getCanOverride")
     var canOverride: Boolean = true
         private set
+
     @Suppress("UNCHECKED_CAST")
     internal val effectiveValue: T
-        get() = when {
-            explicitNull -> null as T
-            state != null -> state.value
-            providedValue != null -> providedValue
-            else -> composeRuntimeError("Unexpected form of a provided value")
-        }
-    internal val isStatic get() = (explicitNull || value != null) && !isDynamic
+        get() =
+            when {
+                explicitNull -> null as T
+                state != null -> state.value
+                providedValue != null -> providedValue
+                else -> composeRuntimeError("Unexpected form of a provided value")
+            }
+
+    internal val isStatic
+        get() = (explicitNull || value != null) && !isDynamic
 
     internal fun ifNotAlreadyProvided() = this.also { canOverride = false }
 }
@@ -369,13 +355,12 @@
  * A Compose compiler plugin API. DO NOT call directly.
  *
  * An instance used to track the identity of the movable content. Using a holder object allows
- * creating unique movable content instances from the same instance of a lambda. This avoids
- * using the identity of a lambda instance as it can be merged into a singleton or merged by later
+ * creating unique movable content instances from the same instance of a lambda. This avoids using
+ * the identity of a lambda instance as it can be merged into a singleton or merged by later
  * rewritings and using its identity might lead to unpredictable results that might change from the
  * debug and release builds.
  */
-@InternalComposeApi
-class MovableContent<P>(val content: @Composable (parameter: P) -> Unit)
+@InternalComposeApi class MovableContent<P>(val content: @Composable (parameter: P) -> Unit)
 
 /**
  * A Compose compiler plugin API. DO NOT call directly.
@@ -383,7 +368,8 @@
  * A reference to the movable content state prior to changes being applied.
  */
 @InternalComposeApi
-class MovableContentStateReference internal constructor(
+class MovableContentStateReference
+internal constructor(
     internal val content: MovableContent<Any?>,
     internal val parameter: Any?,
     internal val composition: ControlledComposition,
@@ -401,49 +387,44 @@
  * and before it is inserted during [ControlledComposition.insertMovableContent].
  */
 @InternalComposeApi
-class MovableContentState internal constructor(
-    internal val slotTable: SlotTable
-)
+class MovableContentState internal constructor(internal val slotTable: SlotTable)
 
 /**
- * Composer is the interface that is targeted by the Compose Kotlin compiler plugin and used by
- * code generation helpers. It is highly recommended that direct calls these be avoided as the
- * runtime assumes that the calls are generated by the compiler and contain only a minimum amount
- * of state validation.
+ * Composer is the interface that is targeted by the Compose Kotlin compiler plugin and used by code
+ * generation helpers. It is highly recommended that direct calls these be avoided as the runtime
+ * assumes that the calls are generated by the compiler and contain only a minimum amount of state
+ * validation.
  */
 sealed interface Composer {
     /**
      * A Compose compiler plugin API. DO NOT call directly.
      *
-     * Changes calculated and recorded during composition and are sent to [applier] which makes
-     * the physical changes to the node tree implied by a composition.
+     * Changes calculated and recorded during composition and are sent to [applier] which makes the
+     * physical changes to the node tree implied by a composition.
      *
      * Composition has two discrete phases, 1) calculate and record changes and 2) making the
-     * changes via the [applier]. While a [Composable] functions is executing, none of the
-     * [applier] methods are called. The recorded changes are sent to the [applier] all at once
-     * after all [Composable] functions have completed.
+     * changes via the [applier]. While a [Composable] functions is executing, none of the [applier]
+     * methods are called. The recorded changes are sent to the [applier] all at once after all
+     * [Composable] functions have completed.
      */
-    @ComposeCompilerApi
-    val applier: Applier<*>
+    @ComposeCompilerApi val applier: Applier<*>
 
     /**
      * A Compose compiler plugin API. DO NOT call directly.
      *
-     * Reflects that a new part of the composition is being created, that is, the composition
-     * will insert new nodes into the resulting tree.
+     * Reflects that a new part of the composition is being created, that is, the composition will
+     * insert new nodes into the resulting tree.
      */
-    @ComposeCompilerApi
-    val inserting: Boolean
+    @ComposeCompilerApi val inserting: Boolean
 
     /**
      * A Compose compiler plugin API. DO NOT call directly.
      *
      * Reflects whether the [Composable] function can skip. Even if a [Composable] function is
-     * called with the same parameters it might still need to run because, for example, a new
-     * value was provided for a [CompositionLocal] created by [staticCompositionLocalOf].
+     * called with the same parameters it might still need to run because, for example, a new value
+     * was provided for a [CompositionLocal] created by [staticCompositionLocalOf].
      */
-    @ComposeCompilerApi
-    val skipping: Boolean
+    @ComposeCompilerApi val skipping: Boolean
 
     /**
      * A Compose compiler plugin API. DO NOT call directly.
@@ -452,19 +433,16 @@
      * `false` if a [State] object read in the [startDefaults] group was modified since the last
      * time the [Composable] function was run.
      */
-    @ComposeCompilerApi
-    val defaultsInvalid: Boolean
+    @ComposeCompilerApi val defaultsInvalid: Boolean
 
     /**
      * A Compose internal property. DO NOT call directly. Use [currentRecomposeScope] instead.
      *
      * The invalidation current invalidation scope. An new invalidation scope is created whenever
-     * [startRestartGroup] is called. when this scope's [RecomposeScope.invalidate] is called
-     * then lambda supplied to [endRestartGroup]'s [ScopeUpdateScope] will be scheduled to be
-     * run.
+     * [startRestartGroup] is called. when this scope's [RecomposeScope.invalidate] is called then
+     * lambda supplied to [endRestartGroup]'s [ScopeUpdateScope] will be scheduled to be run.
      */
-    @InternalComposeApi
-    val recomposeScope: RecomposeScope?
+    @InternalComposeApi val recomposeScope: RecomposeScope?
 
     /**
      * A Compose compiler plugin API. DO NOT call directly.
@@ -474,8 +452,7 @@
      *
      * This is used internally by tooling track composable function invocations.
      */
-    @ComposeCompilerApi
-    val recomposeScopeIdentity: Any?
+    @ComposeCompilerApi val recomposeScopeIdentity: Any?
 
     /**
      * A Compose internal property. DO NOT call directly. Use [currentCompositeKeyHash] instead.
@@ -485,11 +462,10 @@
      * boundaries.
      *
      * This value is not likely to be unique but is not guaranteed unique. There are known cases,
-     * such as for loops without a [key], where the runtime does not have enough information to
-     * make the compound key hash unique.
+     * such as for loops without a [key], where the runtime does not have enough information to make
+     * the compound key hash unique.
      */
-    @InternalComposeApi
-    val compoundKeyHash: Int
+    @InternalComposeApi val compoundKeyHash: Int
 
     // Groups
 
@@ -497,22 +473,21 @@
      * A Compose compiler plugin API. DO NOT call directly.
      *
      * Start a replaceable group. A replaceable group is a group that cannot be moved during
-     * execution and can only either inserted, removed, or replaced. For example, the group
-     * created by most control flow constructs such as an `if` statement are replaceable groups.
+     * execution and can only either inserted, removed, or replaced. For example, the group created
+     * by most control flow constructs such as an `if` statement are replaceable groups.
      *
      * Warning: Versions of the compiler that generate calls to this function also contain subtle
-     * bug that does not generate a group around a loop containing code that just creates
-     * composable lambdas (AnimatedContent from androidx.compose.animation, for example) which
-     * makes replacing the group unsafe and the this must treat this like a movable group.
-     * [startReplaceGroup] was added that will replace the group as described above and is only
-     * called by versions of the compiler that correctly generate code around loops that create
-     * lambdas. This method is kept to maintain compatibility with code generated by older versions
-     * of the compose compiler plugin.
+     * bug that does not generate a group around a loop containing code that just creates composable
+     * lambdas (AnimatedContent from androidx.compose.animation, for example) which makes replacing
+     * the group unsafe and the this must treat this like a movable group. [startReplaceGroup] was
+     * added that will replace the group as described above and is only called by versions of the
+     * compiler that correctly generate code around loops that create lambdas. This method is kept
+     * to maintain compatibility with code generated by older versions of the compose compiler
+     * plugin.
      *
      * @param key A compiler generated key based on the source location of the call.
      */
-    @ComposeCompilerApi
-    fun startReplaceableGroup(key: Int)
+    @ComposeCompilerApi fun startReplaceableGroup(key: Int)
 
     /**
      * A Compose compiler plugin API. DO NOT call directly.
@@ -521,26 +496,24 @@
      *
      * @see startRestartGroup
      */
-    @ComposeCompilerApi
-    fun endReplaceableGroup()
+    @ComposeCompilerApi fun endReplaceableGroup()
 
     /**
      * A Compose compiler plugin API. DO NOT call directly.
      *
-     * Start a replace group. A replace group is a group that cannot be moved during must
-     * only either be inserted, removed, or replaced. For example, the group created by most
-     * control flow constructs such as an `if` statement are replaceable groups.
+     * Start a replace group. A replace group is a group that cannot be moved during must only
+     * either be inserted, removed, or replaced. For example, the group created by most control flow
+     * constructs such as an `if` statement are replaceable groups.
      *
-     * Note: This method replaces [startReplaceableGroup] which is only generated by older
-     * versions of the compose compiler plugin that predate the addition of this method.
-     * The runtime is now required to replace the group if a different group is detected instead
-     * of treating it like a movable group.
+     * Note: This method replaces [startReplaceableGroup] which is only generated by older versions
+     * of the compose compiler plugin that predate the addition of this method. The runtime is now
+     * required to replace the group if a different group is detected instead of treating it like a
+     * movable group.
      *
      * @param key A compiler generated key based on the source location of the call.
      * @see endReplaceGroup
      */
-    @ComposeCompilerApi
-    fun startReplaceGroup(key: Int)
+    @ComposeCompilerApi fun startReplaceGroup(key: Int)
 
     /**
      * A Compose compiler plugin API. DO NOT call directly.
@@ -549,8 +522,7 @@
      *
      * @see startReplaceGroup
      */
-    @ComposeCompilerApi
-    fun endReplaceGroup()
+    @ComposeCompilerApi fun endReplaceGroup()
 
     /**
      * A Compose compiler plugin API. DO NOT call directly.
@@ -562,14 +534,13 @@
      * A movable group implements the semantics of [key][androidx.compose.runtime.key] which allows
      * the state and nodes generated by a loop to move with the composition implied by the key
      * passed to [key][androidx.compose.runtime.key].
-
+     *
      * @param key a compiler generated key based on the source location of the call.
      * @param dataKey an additional object that is used as a second part of the key. This key
-     * produced from the `keys` parameter supplied to the [key][androidx.compose.runtime.key]
-     * pseudo compiler function.
+     *   produced from the `keys` parameter supplied to the [key][androidx.compose.runtime.key]
+     *   pseudo compiler function.
      */
-    @ComposeCompilerApi
-    fun startMovableGroup(key: Int, dataKey: Any?)
+    @ComposeCompilerApi fun startMovableGroup(key: Int, dataKey: Any?)
 
     /**
      * A Compose compiler plugin API. DO NOT call directly.
@@ -578,21 +549,19 @@
      *
      * @see startMovableGroup
      */
-    @ComposeCompilerApi
-    fun endMovableGroup()
+    @ComposeCompilerApi fun endMovableGroup()
 
     /**
      * A Compose compiler plugin API. DO NOT call directly.
      *
      * Called to start the group that calculates the default parameters of a [Composable] function.
      *
-     * This method is called near the beginning of a [Composable] function with default
-     * parameters and surrounds the remembered values or [Composable] calls necessary to produce
-     * the default parameters. For example, for `model: Model = remember { DefaultModel() }` the
-     * call to [remember] is called inside a [startDefaults] group.
+     * This method is called near the beginning of a [Composable] function with default parameters
+     * and surrounds the remembered values or [Composable] calls necessary to produce the default
+     * parameters. For example, for `model: Model = remember { DefaultModel() }` the call to
+     * [remember] is called inside a [startDefaults] group.
      */
-    @ComposeCompilerApi
-    fun startDefaults()
+    @ComposeCompilerApi fun startDefaults()
 
     /**
      * A Compose compiler plugin API. DO NOT call directly.
@@ -601,8 +570,7 @@
      *
      * @see startDefaults
      */
-    @ComposeCompilerApi
-    fun endDefaults()
+    @ComposeCompilerApi fun endDefaults()
 
     /**
      * A Compose compiler plugin API. DO NOT call directly.
@@ -614,36 +582,32 @@
      * @param key A compiler generated key based on the source location of the call.
      * @return the instance of the composer to use for the rest of the function.
      */
-    @ComposeCompilerApi
-    fun startRestartGroup(key: Int): Composer
+    @ComposeCompilerApi fun startRestartGroup(key: Int): Composer
 
     /**
      * A Compose compiler plugin API. DO NOT call directly.
      *
      * Called to end a restart group.
      */
-    @ComposeCompilerApi
-    fun endRestartGroup(): ScopeUpdateScope?
+    @ComposeCompilerApi fun endRestartGroup(): ScopeUpdateScope?
 
     /**
      * A Compose internal API. DO NOT call directly.
      *
-     * Request movable content be inserted at the current location. This will schedule with the
-     * root composition parent a call to [insertMovableContent] with the correct
-     * [MovableContentState] if one was released in another part of composition.
+     * Request movable content be inserted at the current location. This will schedule with the root
+     * composition parent a call to [insertMovableContent] with the correct [MovableContentState] if
+     * one was released in another part of composition.
      */
-    @InternalComposeApi
-    fun insertMovableContent(value: MovableContent<*>, parameter: Any?)
+    @InternalComposeApi fun insertMovableContent(value: MovableContent<*>, parameter: Any?)
 
     /**
      * A Compose internal API. DO NOT call directly.
      *
      * Perform a late composition that adds to the current late apply that will insert the given
-     * references to [MovableContent] into the composition. If a [MovableContent] is paired
-     * then this is a request to move a released [MovableContent] from a different location or
-     * from a different composition. If it is not paired (i.e. the `second`
-     * [MovableContentStateReference] is `null`) then new state for the [MovableContent] is
-     * inserted into the composition.
+     * references to [MovableContent] into the composition. If a [MovableContent] is paired then
+     * this is a request to move a released [MovableContent] from a different location or from a
+     * different composition. If it is not paired (i.e. the `second` [MovableContentStateReference]
+     * is `null`) then new state for the [MovableContent] is inserted into the composition.
      */
     @InternalComposeApi
     fun insertMovableContentReferences(
@@ -657,7 +621,7 @@
      * start of a group.
      *
      * @param sourceInformation An string value to that provides the compose tools enough
-     * information to calculate the source location of calls to composable functions.
+     *   information to calculate the source location of calls to composable functions.
      */
     fun sourceInformation(sourceInformation: String)
 
@@ -665,13 +629,12 @@
      * A compose compiler plugin API. DO NOT call directly.
      *
      * Record a source information marker. This marker can be used in place of a group that would
-     * have contained the information but was elided as the compiler plugin determined the group
-     * was not necessary such as when a function is marked with [ReadOnlyComposable].
+     * have contained the information but was elided as the compiler plugin determined the group was
+     * not necessary such as when a function is marked with [ReadOnlyComposable].
      *
      * @param key A compiler generated key based on the source location of the call.
      * @param sourceInformation An string value to that provides the compose tools enough
-     * information to calculate the source location of calls to composable functions.
-     *
+     *   information to calculate the source location of calls to composable functions.
      */
     fun sourceInformationMarkerStart(key: Int, sourceInformation: String)
 
@@ -689,8 +652,7 @@
      * the body of a [Composable] function can be skipped typically because the parameters to the
      * function are equal to the values passed to it in the previous composition.
      */
-    @ComposeCompilerApi
-    fun skipToGroupEnd()
+    @ComposeCompilerApi fun skipToGroupEnd()
 
     /**
      * A Compose compiler plugin API. DO NOT call directly.
@@ -699,39 +661,35 @@
      * replaces all slot table entries for calls to [cache] to be [Empty]. This must be called as
      * the first call for a group.
      */
-    @ComposeCompilerApi
-    fun deactivateToEndGroup(changed: Boolean)
+    @ComposeCompilerApi fun deactivateToEndGroup(changed: Boolean)
 
     /**
      * A Compose compiler plugin API. DO NOT call directly.
      *
-     * Skips the current group. This called by the compiler to indicate that the current group
-     * can be skipped, for example, this is generated to skip the [startDefaults] group the
-     * default group is was not invalidated.
+     * Skips the current group. This called by the compiler to indicate that the current group can
+     * be skipped, for example, this is generated to skip the [startDefaults] group the default
+     * group is was not invalidated.
      */
-    @ComposeCompilerApi
-    fun skipCurrentGroup()
+    @ComposeCompilerApi fun skipCurrentGroup()
 
     // Nodes
 
     /**
      * A Compose compiler plugin API. DO NOT call directly.
      *
-     * Start a group that tracks a the code that will create or update a node that is generated
-     * as part of the tree implied by the composition.
+     * Start a group that tracks a the code that will create or update a node that is generated as
+     * part of the tree implied by the composition.
      */
-    @ComposeCompilerApi
-    fun startNode()
+    @ComposeCompilerApi fun startNode()
 
     /**
      * A Compose compiler plugin API. DO NOT call directly.
      *
-     * Start a group that tracks a the code that will create or update a node that is generated
-     * as part of the tree implied by the composition. A reusable node can be reused in a
-     * reusable group even if the group key is changed.
+     * Start a group that tracks a the code that will create or update a node that is generated as
+     * part of the tree implied by the composition. A reusable node can be reused in a reusable
+     * group even if the group key is changed.
      */
-    @ComposeCompilerApi
-    fun startReusableNode()
+    @ComposeCompilerApi fun startReusableNode()
 
     /**
      * A Compose compiler plugin API. DO NOT call directly.
@@ -739,11 +697,10 @@
      * Report the [factory] that will be used to create the node that will be generated into the
      * tree implied by the composition. This will only be called if [inserting] is is `true`.
      *
-     * @param factory a factory function that will generate a node that will eventually be
-     * supplied to [applier] though [Applier.insertBottomUp] and [Applier.insertTopDown].
+     * @param factory a factory function that will generate a node that will eventually be supplied
+     *   to [applier] though [Applier.insertBottomUp] and [Applier.insertTopDown].
      */
-    @ComposeCompilerApi
-    fun <T> createNode(factory: () -> T)
+    @ComposeCompilerApi fun <T> createNode(factory: () -> T)
 
     /**
      * A Compose compiler plugin API. DO NOT call directly.
@@ -751,77 +708,69 @@
      * Report that the node is still being used. This will be called in the same location as the
      * corresponding [createNode] when [inserting] is `false`.
      */
-    @ComposeCompilerApi
-    fun useNode()
+    @ComposeCompilerApi fun useNode()
 
     /**
      * A Compose compiler plugin API. DO NOT call directly.
      *
      * Called at the end of a node group.
      */
-    @ComposeCompilerApi
-    fun endNode()
+    @ComposeCompilerApi fun endNode()
 
     /**
      * A Compose compiler plugin API. DO NOT call directly.
      *
-     * Start a reuse group. Unlike a movable group, in a reuse group if the [dataKey] changes
-     * the composition shifts into a reusing state cause the composer to act like it is
-     * inserting (e.g. [cache] acts as if all values are invalid, [changed] always returns
-     * true, etc.) even though it is recomposing until it encounters a reusable node. If the
-     * node is reusable it temporarily shifts into recomposition for the node and then shifts
-     * back to reusing for the children.  If a non-reusable node is generated the composer
-     * shifts to inserting for the node and all of its children.
+     * Start a reuse group. Unlike a movable group, in a reuse group if the [dataKey] changes the
+     * composition shifts into a reusing state cause the composer to act like it is inserting (e.g.
+     * [cache] acts as if all values are invalid, [changed] always returns true, etc.) even though
+     * it is recomposing until it encounters a reusable node. If the node is reusable it temporarily
+     * shifts into recomposition for the node and then shifts back to reusing for the children. If a
+     * non-reusable node is generated the composer shifts to inserting for the node and all of its
+     * children.
      *
      * @param key An compiler generated key based on the source location of the call.
      * @param dataKey A key provided by the [ReusableContent] composable function that is used to
-     * determine if the composition shifts into a reusing state for this group.
+     *   determine if the composition shifts into a reusing state for this group.
      */
-    @ComposeCompilerApi
-    fun startReusableGroup(key: Int, dataKey: Any?)
+    @ComposeCompilerApi fun startReusableGroup(key: Int, dataKey: Any?)
 
     /**
      * A Compose compiler plugin API. DO NOT call directly.
      *
      * Called at the end of a reusable group.
      */
-    @ComposeCompilerApi
-    fun endReusableGroup()
+    @ComposeCompilerApi fun endReusableGroup()
 
     /**
      * A Compose compiler plugin API. DO NOT call directly.
      *
      * Temporarily disable reusing if it is enabled.
      */
-    @ComposeCompilerApi
-    fun disableReusing()
+    @ComposeCompilerApi fun disableReusing()
 
     /**
      * A Compose compiler plugin API. DO NOT call directly.
      *
      * Reenable reusing if it was previously enabled before the last call to [disableReusing].
      */
-    @ComposeCompilerApi
-    fun enableReusing()
+    @ComposeCompilerApi fun enableReusing()
 
     /**
      * A Compose compiler plugin API. DO NOT call directly.
      *
      * Return a marker for the current group that can be used in a call to [endToMarker].
      */
-    @ComposeCompilerApi
-    val currentMarker: Int
+    @ComposeCompilerApi val currentMarker: Int
 
     /**
-     *  Compose compiler plugin API. DO NOT call directly.
+     * Compose compiler plugin API. DO NOT call directly.
      *
-     *  Ends all the groups up to but not including the group that is the parent group when
-     *  [currentMarker] was called to produce [marker]. All groups ended must have been started with
-     *  either [startReplaceableGroup] or [startMovableGroup]. Ending other groups can cause the
-     *  state of the composer to become inconsistent.
+     * Ends all the groups up to but not including the group that is the parent group when
+     * [currentMarker] was called to produce [marker]. All groups ended must have been started with
+     * either [startReplaceableGroup] or [startMovableGroup]. Ending other groups can cause the
+     * state of the composer to become inconsistent.
      */
-    @ComposeCompilerApi
-    fun endToMarker(marker: Int)
+    @ComposeCompilerApi fun endToMarker(marker: Int)
 
     /**
      * A Compose compiler plugin API. DO NOT call directly.
@@ -832,27 +781,25 @@
      * @param value the new value to be set into some property of the node.
      * @param block the block that sets the some property of the node to [value].
      */
-    @ComposeCompilerApi
-    fun <V, T> apply(value: V, block: T.(V) -> Unit)
+    @ComposeCompilerApi fun <V, T> apply(value: V, block: T.(V) -> Unit)
 
     // State
 
     /**
      * A Compose compiler plugin API. DO NOT call directly.
      *
-     * Produce an object that will compare equal an iff [left] and [right] compare equal to
-     * some [left] and [right] of a previous call to [joinKey]. This is used by [key] to handle
-     * multiple parameters. Since the previous composition stored [left] and [right] in a "join
-     * key" object this call is used to return the previous value without an allocation instead
-     * of blindly creating a new value that will be immediately discarded.
+     * Produce an object that will compare equal an iff [left] and [right] compare equal to some
+     * [left] and [right] of a previous call to [joinKey]. This is used by [key] to handle multiple
+     * parameters. Since the previous composition stored [left] and [right] in a "join key" object
+     * this call is used to return the previous value without an allocation instead of blindly
+     * creating a new value that will be immediately discarded.
      *
      * @param left the first part of a a joined key.
      * @param right the second part of a joined key.
      * @return an object that will compare equal to a value previously returned by [joinKey] iff
-     * [left] and [right] compare equal to the [left] and [right] passed to the previous call.
+     *   [left] and [right] compare equal to the [left] and [right] passed to the previous call.
      */
-    @ComposeCompilerApi
-    fun joinKey(left: Any?, right: Any?): Any
+    @ComposeCompilerApi fun joinKey(left: Any?, right: Any?): Any
 
     /**
      * A Compose compiler plugin API. DO NOT call directly.
@@ -861,191 +808,175 @@
      * [remember].
      *
      * @return [Composer.Empty] when [inserting] is `true` or the value passed to
-     * [updateRememberedValue]
-     * from the previous composition.
-     *
+     *   [updateRememberedValue] from the previous composition.
      * @see cache
      */
-    @ComposeCompilerApi
-    fun rememberedValue(): Any?
+    @ComposeCompilerApi fun rememberedValue(): Any?
 
     /**
      * A Compose compiler plugin API. DO NOT call directly.
      *
-     * Update the remembered value correspond to the previous call to [rememberedValue]. The
-     * [value] will be returned by [rememberedValue] for the next composition.
+     * Update the remembered value correspond to the previous call to [rememberedValue]. The [value]
+     * will be returned by [rememberedValue] for the next composition.
      */
-    @ComposeCompilerApi
-    fun updateRememberedValue(value: Any?)
+    @ComposeCompilerApi fun updateRememberedValue(value: Any?)
 
     /**
      * A Compose compiler plugin API. DO NOT call directly.
      *
-     * Check [value] is different than the value used in the previous composition. This is used,
-     * for example, to check parameter values to determine if they have changed.
+     * Check [value] is different than the value used in the previous composition. This is used, for
+     * example, to check parameter values to determine if they have changed.
      *
      * @param value the value to check
      * @return `true` if the value if [equals] of the previous value returns `false` when passed
-     * [value].
+     *   [value].
      */
-    @ComposeCompilerApi
-    fun changed(value: Any?): Boolean
+    @ComposeCompilerApi fun changed(value: Any?): Boolean
 
     /**
      * A Compose compiler plugin API. DO NOT call directly.
      *
-     * Check [value] is different than the value used in the previous composition. This is used,
-     * for example, to check parameter values to determine if they have changed.
+     * Check [value] is different than the value used in the previous composition. This is used, for
+     * example, to check parameter values to determine if they have changed.
      *
-     * This overload is provided to avoid boxing [value] to compare with a potentially boxed
-     * version of [value] in the composition state.
+     * This overload is provided to avoid boxing [value] to compare with a potentially boxed version
+     * of [value] in the composition state.
      *
      * @param value the value to check
      * @return `true` if the value if [equals] of the previous value returns `false` when passed
-     * [value].
+     *   [value].
      */
-    @ComposeCompilerApi
-    fun changed(value: Boolean): Boolean = changed(value)
+    @ComposeCompilerApi fun changed(value: Boolean): Boolean = changed(value)
 
     /**
      * A Compose compiler plugin API. DO NOT call directly.
      *
-     * Check [value] is different than the value used in the previous composition. This is used,
-     * for example, to check parameter values to determine if they have changed.
+     * Check [value] is different than the value used in the previous composition. This is used, for
+     * example, to check parameter values to determine if they have changed.
      *
-     * This overload is provided to avoid boxing [value] to compare with a potentially boxed
-     * version of [value] in the composition state.
+     * This overload is provided to avoid boxing [value] to compare with a potentially boxed version
+     * of [value] in the composition state.
      *
      * @param value the value to check
      * @return `true` if the value if [equals] of the previous value returns `false` when passed
-     * [value].
+     *   [value].
      */
-    @ComposeCompilerApi
-    fun changed(value: Char): Boolean = changed(value)
+    @ComposeCompilerApi fun changed(value: Char): Boolean = changed(value)
 
     /**
      * A Compose compiler plugin API. DO NOT call directly.
      *
-     * Check [value] is different than the value used in the previous composition. This is used,
-     * for example, to check parameter values to determine if they have changed.
+     * Check [value] is different than the value used in the previous composition. This is used, for
+     * example, to check parameter values to determine if they have changed.
      *
-     * This overload is provided to avoid boxing [value] to compare with a potentially boxed
-     * version of [value] in the composition state.
+     * This overload is provided to avoid boxing [value] to compare with a potentially boxed version
+     * of [value] in the composition state.
      *
      * @param value the value to check
      * @return `true` if the value if [equals] of the previous value returns `false` when passed
-     * [value].
+     *   [value].
      */
-    @ComposeCompilerApi
-    fun changed(value: Byte): Boolean = changed(value)
+    @ComposeCompilerApi fun changed(value: Byte): Boolean = changed(value)
 
     /**
      * A Compose compiler plugin API. DO NOT call directly.
      *
-     * Check [value] is different than the value used in the previous composition. This is used,
-     * for example, to check parameter values to determine if they have changed.
+     * Check [value] is different than the value used in the previous composition. This is used, for
+     * example, to check parameter values to determine if they have changed.
      *
-     * This overload is provided to avoid boxing [value] to compare with a potentially boxed
-     * version of [value] in the composition state.
+     * This overload is provided to avoid boxing [value] to compare with a potentially boxed version
+     * of [value] in the composition state.
      *
      * @param value the value to check
      * @return `true` if the value if [equals] of the previous value returns `false` when passed
-     * [value].
+     *   [value].
      */
-    @ComposeCompilerApi
-    fun changed(value: Short): Boolean = changed(value)
+    @ComposeCompilerApi fun changed(value: Short): Boolean = changed(value)
 
     /**
      * A Compose compiler plugin API. DO NOT call directly.
      *
-     * Check [value] is different than the value used in the previous composition. This is used,
-     * for example, to check parameter values to determine if they have changed.
+     * Check [value] is different than the value used in the previous composition. This is used, for
+     * example, to check parameter values to determine if they have changed.
      *
-     * This overload is provided to avoid boxing [value] to compare with a potentially boxed
-     * version of [value] in the composition state.
+     * This overload is provided to avoid boxing [value] to compare with a potentially boxed version
+     * of [value] in the composition state.
      *
      * @param value the value to check
      * @return `true` if the value if [equals] of the previous value returns `false` when passed
-     * [value].
+     *   [value].
      */
-    @ComposeCompilerApi
-    fun changed(value: Int): Boolean = changed(value)
+    @ComposeCompilerApi fun changed(value: Int): Boolean = changed(value)
 
     /**
      * A Compose compiler plugin API. DO NOT call directly.
      *
-     * Check [value] is different than the value used in the previous composition. This is used,
-     * for example, to check parameter values to determine if they have changed.
+     * Check [value] is different than the value used in the previous composition. This is used, for
+     * example, to check parameter values to determine if they have changed.
      *
-     * This overload is provided to avoid boxing [value] to compare with a potentially boxed
-     * version of [value] in the composition state.
+     * This overload is provided to avoid boxing [value] to compare with a potentially boxed version
+     * of [value] in the composition state.
      *
      * @param value the value to check
      * @return `true` if the value if [equals] of the previous value returns `false` when passed
-     * [value].
+     *   [value].
      */
-    @ComposeCompilerApi
-    fun changed(value: Float): Boolean = changed(value)
+    @ComposeCompilerApi fun changed(value: Float): Boolean = changed(value)
 
     /**
      * A Compose compiler plugin API. DO NOT call directly.
      *
-     * Check [value] is different than the value used in the previous composition. This is used,
-     * for example, to check parameter values to determine if they have changed.
+     * Check [value] is different than the value used in the previous composition. This is used, for
+     * example, to check parameter values to determine if they have changed.
      *
-     * This overload is provided to avoid boxing [value] to compare with a potentially boxed
-     * version of [value] in the composition state.
+     * This overload is provided to avoid boxing [value] to compare with a potentially boxed version
+     * of [value] in the composition state.
      *
      * @param value the value to check
      * @return `true` if the value if [equals] of the previous value returns `false` when passed
-     * [value].
+     *   [value].
      */
-    @ComposeCompilerApi
-    fun changed(value: Long): Boolean = changed(value)
+    @ComposeCompilerApi fun changed(value: Long): Boolean = changed(value)
 
     /**
      * A Compose compiler plugin API. DO NOT call directly.
      *
-     * Check [value] is different than the value used in the previous composition. This is used,
-     * for example, to check parameter values to determine if they have changed.
+     * Check [value] is different than the value used in the previous composition. This is used, for
+     * example, to check parameter values to determine if they have changed.
      *
-     * This overload is provided to avoid boxing [value] to compare with a potentially boxed
-     * version of [value] in the composition state.
+     * This overload is provided to avoid boxing [value] to compare with a potentially boxed version
+     * of [value] in the composition state.
      *
      * @param value the value to check
      * @return `true` if the value if [equals] of the previous value returns `false` when passed
-     * [value].
+     *   [value].
      */
-    @ComposeCompilerApi
-    fun changed(value: Double): Boolean = changed(value)
+    @ComposeCompilerApi fun changed(value: Double): Boolean = changed(value)
 
     /**
      * A Compose compiler plugin API. DO NOT call directly.
      *
      * Check [value] is different than the value used in the previous composition using `===`
-     * instead of `==` equality. This is used,  for example, to check parameter values to determine
+     * instead of `==` equality. This is used, for example, to check parameter values to determine
      * if they have changed for values that use value equality but, for correct behavior, the
      * composer needs reference equality.
      *
      * @param value the value to check
      * @return `true` if the value is === equal to the previous value and returns `false` when
-     * [value] is different.
+     *   [value] is different.
      */
-    @ComposeCompilerApi
-    fun changedInstance(value: Any?): Boolean = changed(value)
+    @ComposeCompilerApi fun changedInstance(value: Any?): Boolean = changed(value)
 
     // Scopes
 
     /**
      * A Compose compiler plugin API. DO NOT call directly.
      *
-     * Mark [scope] as used. [endReplaceableGroup] will return `null` unless [recordUsed] is
-     * called on the corresponding [scope]. This is called implicitly when [State] objects are
-     * read during composition is called when [currentRecomposeScope] is called in the
-     * [Composable] function.
+     * Mark [scope] as used. [endReplaceableGroup] will return `null` unless [recordUsed] is called
+     * on the corresponding [scope]. This is called implicitly when [State] objects are read during
+     * composition is called when [currentRecomposeScope] is called in the [Composable] function.
      */
-    @InternalComposeApi
-    fun recordUsed(scope: RecomposeScope)
+    @InternalComposeApi fun recordUsed(scope: RecomposeScope)
 
     // Internal API
 
@@ -1056,10 +987,9 @@
      * [applier]. This is used to implement [SideEffect].
      *
      * @param effect a lambda to invoke after the changes calculated up to this point have been
-     * applied.
+     *   applied.
      */
-    @InternalComposeApi
-    fun recordSideEffect(effect: () -> Unit)
+    @InternalComposeApi fun recordSideEffect(effect: () -> Unit)
 
     /**
      * Returns the active set of CompositionLocals at the current position in the composition
@@ -1069,12 +999,12 @@
      * This API does not track reads of CompositionLocals and does not automatically dispatch new
      * values to previous readers when the value of a CompositionLocal changes. To use this API as
      * intended, you must set up observation manually. This means:
-     *  - For [non-static CompositionLocals][compositionLocalOf], composables reading this map need
-     *  to observe the snapshot state for CompositionLocals being read to be notified when their
-     *  values in this map change.
-     *  - For [static CompositionLocals][staticCompositionLocalOf], all composables including the
-     *  composable reading this map will be recomposed and you will need to re-obtain this map to
-     *  get the latest values.
+     * - For [non-static CompositionLocals][compositionLocalOf], composables reading this map need
+     *   to observe the snapshot state for CompositionLocals being read to be notified when their
+     *   values in this map change.
+     * - For [static CompositionLocals][staticCompositionLocalOf], all composables including the
+     *   composable reading this map will be recomposed and you will need to re-obtain this map to
+     *   get the latest values.
      *
      * Most applications shouldn't use this API directly, and should instead use
      * [CompositionLocal.current].
@@ -1089,8 +1019,7 @@
      *
      * @param key the [CompositionLocal] value to be retrieved.
      */
-    @InternalComposeApi
-    fun <T> consume(key: CompositionLocal<T>): T
+    @InternalComposeApi fun <T> consume(key: CompositionLocal<T>): T
 
     /**
      * A Compose internal function. DO NOT call directly.
@@ -1100,8 +1029,7 @@
      *
      * @param values an array of value to provider key pairs.
      */
-    @InternalComposeApi
-    fun startProviders(values: Array<out ProvidedValue<*>>)
+    @InternalComposeApi fun startProviders(values: Array<out ProvidedValue<*>>)
 
     /**
      * A Compose internal function. DO NOT call directly.
@@ -1110,8 +1038,7 @@
      *
      * @see startProviders
      */
-    @InternalComposeApi
-    fun endProviders()
+    @InternalComposeApi fun endProviders()
 
     /**
      * A Compose internal function. DO NOT call directly.
@@ -1121,8 +1048,7 @@
      *
      * @param value a value to provider key pairs.
      */
-    @InternalComposeApi
-    fun startProvider(value: ProvidedValue<*>)
+    @InternalComposeApi fun startProvider(value: ProvidedValue<*>)
 
     /**
      * A Compose internal function. DO NOT call directly.
@@ -1131,8 +1057,7 @@
      *
      * @see startProvider
      */
-    @InternalComposeApi
-    fun endProvider()
+    @InternalComposeApi fun endProvider()
 
     /**
      * A tooling API function. DO NOT call directly.
@@ -1145,10 +1070,10 @@
     /**
      * A tooling API function. DO NOT call directly.
      *
-     * Called by the inspector to inform the composer that it should collect additional
-     * information about call parameters. By default, only collect parameter information for
-     * scopes that are [recordUsed] has been called on. If [collectParameterInformation] is called
-     * it will attempt to collect all calls even if the runtime doesn't need them.
+     * Called by the inspector to inform the composer that it should collect additional information
+     * about call parameters. By default, only collect parameter information for scopes that are
+     * [recordUsed] has been called on. If [collectParameterInformation] is called it will attempt
+     * to collect all calls even if the runtime doesn't need them.
      *
      * WARNING: calling this will result in a significant number of additional allocations that are
      * typically avoided.
@@ -1162,8 +1087,7 @@
      * reference is used to communicate information from this composition to the subcompositions
      * such as the all the [CompositionLocal]s provided at the point the reference is created.
      */
-    @InternalComposeApi
-    fun buildContext(): CompositionContext
+    @InternalComposeApi fun buildContext(): CompositionContext
 
     /**
      * A Compose internal function. DO NOT call directly.
@@ -1173,12 +1097,9 @@
      */
     @InternalComposeApi
     val applyCoroutineContext: CoroutineContext
-        @TestOnly
-        get
+        @TestOnly get
 
-    /**
-     * The composition that is used to control this composer.
-     */
+    /** The composition that is used to control this composer. */
     val composition: ControlledComposition
         @TestOnly get
 
@@ -1190,22 +1111,22 @@
      * This function is only safe to call in a test and will produce incorrect composition results
      * if called on a composer not under test.
      */
-    @TestOnly
-    fun disableSourceInformation()
+    @TestOnly fun disableSourceInformation()
 
     companion object {
         /**
          * A special value used to represent no value was stored (e.g. an empty slot). This is
-         * returned, for example by [Composer.rememberedValue] while it is [Composer.inserting]
-         * is `true`.
+         * returned, for example by [Composer.rememberedValue] while it is [Composer.inserting] is
+         * `true`.
          */
-        val Empty = object {
-            override fun toString() = "Empty"
-        }
+        val Empty =
+            object {
+                override fun toString() = "Empty"
+            }
 
         /**
-         * Internal API for specifying a tracer used for instrumenting frequent
-         * operations, e.g. recompositions.
+         * Internal API for specifying a tracer used for instrumenting frequent operations, e.g.
+         * recompositions.
          */
         @InternalComposeTracingApi
         fun setTracer(tracer: CompositionTracer) {
@@ -1236,8 +1157,8 @@
 /**
  * A Compose internal function. DO NOT call directly.
  *
- * Records source information that can be used for tooling to determine the source location of
- * the corresponding composable function. By default, this function is declared as having no
+ * Records source information that can be used for tooling to determine the source location of the
+ * corresponding composable function. By default, this function is declared as having no
  * side-effects. It is safe for code shrinking tools (such as R8 or ProGuard) to remove it.
  */
 @ComposeCompilerApi
@@ -1270,12 +1191,13 @@
 @InternalComposeTracingApi
 interface CompositionTracer {
     fun traceEventStart(key: Int, dirty1: Int, dirty2: Int, info: String): Unit
+
     fun traceEventEnd(): Unit
+
     fun isTraceInProgress(): Boolean
 }
 
-@OptIn(InternalComposeTracingApi::class)
-private var compositionTracer: CompositionTracer? = null
+@OptIn(InternalComposeTracingApi::class) private var compositionTracer: CompositionTracer? = null
 
 /**
  * Internal tracing API.
@@ -1301,11 +1223,11 @@
  * Should be called without thread synchronization with occasional information loss.
  *
  * @param key is a group key generated by the compiler plugin for the function being traced. This
- * key is unique the function.
+ *   key is unique the function.
  * @param dirty1 $dirty metadata: forced-recomposition and function parameters 1..10 if present
  * @param dirty2 $dirty2 metadata: forced-recomposition and function parameters 11..20 if present
- * @param info is a user displayable string that describes the function for which this is the
- * start event.
+ * @param info is a user displayable string that describes the function for which this is the start
+ *   event.
  */
 @OptIn(InternalComposeTracingApi::class)
 @ComposeCompilerApi
@@ -1341,35 +1263,22 @@
     composer.sourceInformationMarkerEnd()
 }
 
-/**
- * Implementation of a composer for a mutable tree.
- */
+/** Implementation of a composer for a mutable tree. */
 @OptIn(ExperimentalComposeRuntimeApi::class)
 internal class ComposerImpl(
-    /**
-     * An adapter that applies changes to the tree using the Applier abstraction.
-     */
+    /** An adapter that applies changes to the tree using the Applier abstraction. */
     override val applier: Applier<*>,
 
-    /**
-     * Parent of this composition; a [Recomposer] for root-level compositions.
-     */
+    /** Parent of this composition; a [Recomposer] for root-level compositions. */
     private val parentContext: CompositionContext,
 
-    /**
-     * The slot table to use to store composition data
-     */
+    /** The slot table to use to store composition data */
     private val slotTable: SlotTable,
-
     private val abandonSet: MutableSet<RememberObserver>,
-
     private var changes: ChangeList,
-
     private var lateChanges: ChangeList,
 
-    /**
-     * The composition that owns this composer
-     */
+    /** The composition that owns this composer */
     override val composition: ControlledComposition
 ) : Composer {
     private val pendingStack = Stack<Pending?>()
@@ -1394,34 +1303,40 @@
     private var reusingGroup = -1
     private var childrenComposing: Int = 0
     private var compositionToken: Int = 0
-    private var sourceMarkersEnabled = parentContext.collectingSourceInformation ||
-        parentContext.collectingCallByInformation
-    private val derivedStateObserver = object : DerivedStateObserver {
-        override fun start(derivedState: DerivedState<*>) {
-            childrenComposing++
-        }
+    private var sourceMarkersEnabled =
+        parentContext.collectingSourceInformation || parentContext.collectingCallByInformation
+    private val derivedStateObserver =
+        object : DerivedStateObserver {
+            override fun start(derivedState: DerivedState<*>) {
+                childrenComposing++
+            }
 
-        override fun done(derivedState: DerivedState<*>) {
-            childrenComposing--
+            override fun done(derivedState: DerivedState<*>) {
+                childrenComposing--
+            }
         }
-    }
 
     private val invalidateStack = Stack<RecomposeScopeImpl>()
 
     internal var isComposing = false
         private set
+
     internal var isDisposed = false
         private set
-    internal val areChildrenComposing get() = childrenComposing > 0
 
-    internal val hasPendingChanges: Boolean get() = changes.isNotEmpty()
+    internal val areChildrenComposing
+        get() = childrenComposing > 0
+
+    internal val hasPendingChanges: Boolean
+        get() = changes.isNotEmpty()
 
     internal var reader: SlotReader = slotTable.openReader().also { it.close() }
 
-    internal var insertTable = SlotTable().apply {
-        if (parentContext.collectingSourceInformation) collectSourceInformation()
-        if (parentContext.collectingCallByInformation) collectCalledByInformation()
-    }
+    internal var insertTable =
+        SlotTable().apply {
+            if (parentContext.collectingSourceInformation) collectSourceInformation()
+            if (parentContext.collectingCallByInformation) collectCalledByInformation()
+        }
 
     private var writer: SlotWriter = insertTable.openWriter().also { it.close(true) }
     private var writerHasAProvider = false
@@ -1437,8 +1352,8 @@
 
     /**
      * Inserts a "Replaceable Group" starting marker in the slot table at the current execution
-     * position. A Replaceable Group is a group which cannot be moved between its siblings, but
-     * can be removed or inserted. These groups are inserted by the compiler around branches of
+     * position. A Replaceable Group is a group which cannot be moved between its siblings, but can
+     * be removed or inserted. These groups are inserted by the compiler around branches of
      * conditional logic in Composable functions such as if expressions, when expressions, early
      * returns, and null-coalescing operators.
      *
@@ -1446,45 +1361,39 @@
      * [endReplaceableGroup].
      *
      * Warning: Versions of the compiler that generate calls to this function also contain subtle
-     * bug that does not generate a group around a loop containing code that just creates
-     * composable lambdas (AnimatedContent from androidx.compose.animation, for example) which
-     * makes replacing the group unsafe and the this must treat this like a movable group.
-     * [startReplaceGroup] was added that will replace the group as described above and is only
-     * called by versions of the compiler that correctly generate code around loops that create
-     * lambdas.
+     * bug that does not generate a group around a loop containing code that just creates composable
+     * lambdas (AnimatedContent from androidx.compose.animation, for example) which makes replacing
+     * the group unsafe and the this must treat this like a movable group. [startReplaceGroup] was
+     * added that will replace the group as described above and is only called by versions of the
+     * compiler that correctly generate code around loops that create lambdas.
      *
      * Warning: This is expected to be executed by the compiler only and should not be called
      * directly from source code. Call this API at your own risk.
      *
      * @param key The source-location-based key for the group. Expected to be unique among its
-     * siblings.
-     *
+     *   siblings.
      * @see [endReplaceableGroup]
      * @see [startMovableGroup]
      * @see [startRestartGroup]
      */
     @ComposeCompilerApi
-    override fun startReplaceableGroup(key: Int) =
-        start(key, null, GroupKind.Group, null)
+    override fun startReplaceableGroup(key: Int) = start(key, null, GroupKind.Group, null)
 
     /**
-     * Indicates the end of a "Replaceable Group" at the current execution position. A
-     * Replaceable Group is a group which cannot be moved between its siblings, but
-     * can be removed or inserted. These groups are inserted by the compiler around branches of
-     * conditional logic in Composable functions such as if expressions, when expressions, early
-     * returns, and null-coalescing operators.
+     * Indicates the end of a "Replaceable Group" at the current execution position. A Replaceable
+     * Group is a group which cannot be moved between its siblings, but can be removed or inserted.
+     * These groups are inserted by the compiler around branches of conditional logic in Composable
+     * functions such as if expressions, when expressions, early returns, and null-coalescing
+     * operators.
      *
      * Warning: This is expected to be executed by the compiler only and should not be called
      * directly from source code. Call this API at your own risk.
      *
      * @see [startReplaceableGroup]
      */
-    @ComposeCompilerApi
-    override fun endReplaceableGroup() = endGroup()
+    @ComposeCompilerApi override fun endReplaceableGroup() = endGroup()
 
-    /**
-     * See [Composer.startReplaceGroup]
-     */
+    /** See [Composer.startReplaceGroup] */
     @ComposeCompilerApi
     override fun startReplaceGroup(key: Int) {
         val pending = pending
@@ -1536,25 +1445,18 @@
         enterGroup(false, null)
     }
 
-    /**
-     * See [Composer.endReplaceGroup]
-     */
-    @ComposeCompilerApi
-    override fun endReplaceGroup() = endGroup()
+    /** See [Composer.endReplaceGroup] */
+    @ComposeCompilerApi override fun endReplaceGroup() = endGroup()
 
     /**
-     *
      * Warning: This is expected to be executed by the compiler only and should not be called
      * directly from source code. Call this API at your own risk.
-     *
      */
     @ComposeCompilerApi
     @Suppress("unused")
-    override fun startDefaults() =
-        start(defaultsKey, null, GroupKind.Group, null)
+    override fun startDefaults() = start(defaultsKey, null, GroupKind.Group, null)
 
     /**
-     *
      * Warning: This is expected to be executed by the compiler only and should not be called
      * directly from source code. Call this API at your own risk.
      *
@@ -1579,12 +1481,12 @@
 
     /**
      * Inserts a "Movable Group" starting marker in the slot table at the current execution
-     * position. A Movable Group is a group which can be moved or reordered between its siblings
-     * and retain slot table state, in addition to being removed or inserted. Movable Groups
-     * are more expensive than other groups because when they are encountered with a mismatched
-     * key in the slot table, they must be held on to temporarily until the entire parent group
-     * finishes execution in case it moved to a later position in the group. Movable groups are
-     * only inserted by the compiler as a result of calls to [key].
+     * position. A Movable Group is a group which can be moved or reordered between its siblings and
+     * retain slot table state, in addition to being removed or inserted. Movable Groups are more
+     * expensive than other groups because when they are encountered with a mismatched key in the
+     * slot table, they must be held on to temporarily until the entire parent group finishes
+     * execution in case it moved to a later position in the group. Movable groups are only inserted
+     * by the compiler as a result of calls to [key].
      *
      * A call to [startMovableGroup] must be matched with a corresponding call to [endMovableGroup].
      *
@@ -1592,12 +1494,10 @@
      * directly from source code. Call this API at your own risk.
      *
      * @param key The source-location-based key for the group. Expected to be unique among its
-     * siblings.
-     *
+     *   siblings.
      * @param dataKey Additional identifying information to compound with [key]. If there are
-     * multiple values, this is expected to be compounded together with [joinKey]. Whatever value
-     * is passed in here is expected to have a meaningful [equals] and [hashCode] implementation.
-     *
+     *   multiple values, this is expected to be compounded together with [joinKey]. Whatever value
+     *   is passed in here is expected to have a meaningful [equals] and [hashCode] implementation.
      * @see [endMovableGroup]
      * @see [key]
      * @see [joinKey]
@@ -1610,25 +1510,24 @@
 
     /**
      * Indicates the end of a "Movable Group" at the current execution position. A Movable Group is
-     * a group which can be moved or reordered between its siblings and retain slot table state,
-     * in addition to being removed or inserted. These groups are only valid when they are
-     * inserted as direct children of Container Groups. Movable Groups are more expensive than
-     * other groups because when they are encountered with a mismatched key in the slot table,
-     * they must be held on to temporarily until the entire parent group finishes execution in
-     * case it moved to a later position in the group. Movable groups are only inserted by the
-     * compiler as a result of calls to [key].
+     * a group which can be moved or reordered between its siblings and retain slot table state, in
+     * addition to being removed or inserted. These groups are only valid when they are inserted as
+     * direct children of Container Groups. Movable Groups are more expensive than other groups
+     * because when they are encountered with a mismatched key in the slot table, they must be held
+     * on to temporarily until the entire parent group finishes execution in case it moved to a
+     * later position in the group. Movable groups are only inserted by the compiler as a result of
+     * calls to [key].
      *
      * Warning: This is expected to be executed by the compiler only and should not be called
      * directly from source code. Call this API at your own risk.
      *
      * @see [startMovableGroup]
      */
-    @ComposeCompilerApi
-    override fun endMovableGroup() = endGroup()
+    @ComposeCompilerApi override fun endMovableGroup() = endGroup()
 
     /**
-     * Start the composition. This should be called, and only be called, as the first group in
-     * the composition.
+     * Start the composition. This should be called, and only be called, as the first group in the
+     * composition.
      */
     @OptIn(InternalComposeApi::class)
     private fun startRoot() {
@@ -1661,8 +1560,8 @@
     }
 
     /**
-     * End the composition. This should be called, and only be called, to end the first group in
-     * the composition.
+     * End the composition. This should be called, and only be called, to end the first group in the
+     * composition.
      */
     @OptIn(InternalComposeApi::class)
     private fun endRoot() {
@@ -1676,9 +1575,7 @@
         providersInvalid = providersInvalidStack.pop().asBool()
     }
 
-    /**
-     * Discard a pending composition because an error was encountered during composition
-     */
+    /** Discard a pending composition because an error was encountered during composition */
     @OptIn(InternalComposeApi::class)
     private fun abortRoot() {
         cleanUpCompose()
@@ -1712,20 +1609,19 @@
 
     /**
      * True if the composition is currently scheduling nodes to be inserted into the tree. During
-     * first composition this is always true. During recomposition this is true when new nodes
-     * are being scheduled to be added to the tree.
+     * first composition this is always true. During recomposition this is true when new nodes are
+     * being scheduled to be added to the tree.
      */
     @ComposeCompilerApi
     override var inserting: Boolean = false
         private set
 
-    /**
-     * True if the composition should be checking if the composable functions can be skipped.
-     */
+    /** True if the composition should be checking if the composable functions can be skipped. */
     @ComposeCompilerApi
     override val skipping: Boolean
         get() {
-            return !inserting && !reusing &&
+            return !inserting &&
+                !reusing &&
                 !providersInvalid &&
                 currentRecomposeScope?.requiresRecompose == false &&
                 !forciblyRecompose
@@ -1781,21 +1677,19 @@
 
     /**
      * Start a group with the given key. During recomposition if the currently expected group does
-     * not match the given key a group the groups emitted in the same parent group are inspected
-     * to determine if one of them has this key and that group the first such group is moved
-     * (along with any nodes emitted by the group) to the current position and composition
-     * continues. If no group with this key is found, then the composition shifts into insert
-     * mode and new nodes are added at the current position.
+     * not match the given key a group the groups emitted in the same parent group are inspected to
+     * determine if one of them has this key and that group the first such group is moved (along
+     * with any nodes emitted by the group) to the current position and composition continues. If no
+     * group with this key is found, then the composition shifts into insert mode and new nodes are
+     * added at the current position.
      *
-     *  @param key The key for the group
+     * @param key The key for the group
      */
     private fun startGroup(key: Int) = start(key, null, GroupKind.Group, null)
 
     private fun startGroup(key: Int, dataKey: Any?) = start(key, dataKey, GroupKind.Group, null)
 
-    /**
-     * End the current group.
-     */
+    /** End the current group. */
     private fun endGroup() = end(isNode = false)
 
     @OptIn(InternalComposeApi::class)
@@ -1804,11 +1698,11 @@
     }
 
     /**
-     * Start emitting a node. It is required that [createNode] is called after [startNode].
-     * Similar to [startGroup], if, during recomposition, the current node does not have the
-     * provided key a node with that key is scanned for and moved into the current position if
-     * found, if no such node is found the composition switches into insert mode and a the node
-     * is scheduled to be inserted at the current location.
+     * Start emitting a node. It is required that [createNode] is called after [startNode]. Similar
+     * to [startGroup], if, during recomposition, the current node does not have the provided key a
+     * node with that key is scanned for and moved into the current position if found, if no such
+     * node is found the composition switches into insert mode and a the node is scheduled to be
+     * inserted at the current location.
      */
     override fun startNode() {
         start(nodeKey, null, GroupKind.Node, null)
@@ -1834,9 +1728,7 @@
         insertFixups.createAndInsertNode(factory, insertIndex, groupAnchor)
     }
 
-    /**
-     * Mark the node that was created by [createNode] as used by composition.
-     */
+    /** Mark the node that was created by [createNode] as used by composition. */
     @OptIn(InternalComposeApi::class)
     override fun useNode() {
         validateNodeExpected()
@@ -1849,9 +1741,7 @@
         }
     }
 
-    /**
-     * Called to end the node group.
-     */
+    /** Called to end the node group. */
     override fun endNode() = end(isNode = true)
 
     override fun startReusableGroup(key: Int, dataKey: Any?) {
@@ -1928,8 +1818,8 @@
     }
 
     /**
-     * Schedule a change to be applied to a node's property. This change will be applied to the
-     * node that is the current node in the tree which was either created by [createNode].
+     * Schedule a change to be applied to a node's property. This change will be applied to the node
+     * that is the current node in the tree which was either created by [createNode].
      */
     override fun <V, T> apply(value: V, block: T.(V) -> Unit) {
         if (inserting) {
@@ -1940,25 +1830,25 @@
     }
 
     /**
-     * Create a composed key that can be used in calls to [startGroup] or [startNode]. This will
-     * use the key stored at the current location in the slot table to avoid allocating a new key.
+     * Create a composed key that can be used in calls to [startGroup] or [startNode]. This will use
+     * the key stored at the current location in the slot table to avoid allocating a new key.
      */
     @ComposeCompilerApi
     @OptIn(InternalComposeApi::class)
     override fun joinKey(left: Any?, right: Any?): Any =
         getKey(reader.groupObjectKey, left, right) ?: JoinedKey(left, right)
 
-    /**
-     * Return the next value in the slot table and advance the current location.
-     */
+    /** Return the next value in the slot table and advance the current location. */
     @PublishedApi
     @OptIn(InternalComposeApi::class)
-    internal fun nextSlot(): Any? = if (inserting) {
-        validateNodeNotExpected()
-        Composer.Empty
-    } else reader.next().let {
-        if (reusing && it !is ReusableRememberObserver) Composer.Empty else it
-    }
+    internal fun nextSlot(): Any? =
+        if (inserting) {
+            validateNodeNotExpected()
+            Composer.Empty
+        } else
+            reader.next().let {
+                if (reusing && it !is ReusableRememberObserver) Composer.Empty else it
+            }
 
     @PublishedApi
     @OptIn(InternalComposeApi::class)
@@ -1966,16 +1856,16 @@
         return if (inserting) {
             validateNodeNotExpected()
             Composer.Empty
-        } else reader.next().let {
-            if (reusing && it !is ReusableRememberObserver) Composer.Empty
-            else if (it is RememberObserverHolder) it.wrapped
-            else it
-        }
+        } else
+            reader.next().let {
+                if (reusing && it !is ReusableRememberObserver) Composer.Empty
+                else if (it is RememberObserverHolder) it.wrapped else it
+            }
     }
 
     /**
-     * Determine if the current slot table value is equal to the given value, if true, the value
-     * is scheduled to be skipped during [ControlledComposition.applyChanges] and [changes] return
+     * Determine if the current slot table value is equal to the given value, if true, the value is
+     * scheduled to be skipped during [ControlledComposition.applyChanges] and [changes] return
      * false; otherwise [ControlledComposition.applyChanges] will update the slot table to [value].
      * In either case the composer's slot table is advanced.
      *
@@ -2091,10 +1981,9 @@
 
     /**
      * Cache a value in the composition. During initial composition [block] is called to produce the
-     * value that is then stored in the slot table. During recomposition, if [invalid] is false
-     * the value is obtained from the slot table and [block] is not invoked. If [invalid] is
-     * false a new value is produced by calling [block] and the slot table is updated to contain
-     * the new value.
+     * value that is then stored in the slot table. During recomposition, if [invalid] is false the
+     * value is obtained from the slot table and [block] is not invoked. If [invalid] is false a new
+     * value is produced by calling [block] and the slot table is updated to contain the new value.
      */
     @ComposeCompilerApi
     inline fun <T> cache(invalid: Boolean, block: () -> T): T {
@@ -2105,8 +1994,7 @@
             result = value
         }
 
-        @Suppress("UNCHECKED_CAST")
-        return result as T
+        @Suppress("UNCHECKED_CAST") return result as T
     }
 
     private fun updateSlot(value: Any?) {
@@ -2165,11 +2053,14 @@
     @PublishedApi
     @OptIn(InternalComposeApi::class)
     internal fun updateCachedValue(value: Any?) {
-        val toStore = if (value is RememberObserver) {
-            if (inserting) { changeListWriter.remember(value) }
-            abandonSet.add(value)
-            RememberObserverHolder(value, rememberObserverAnchor())
-        } else value
+        val toStore =
+            if (value is RememberObserver) {
+                if (inserting) {
+                    changeListWriter.remember(value)
+                }
+                abandonSet.add(value)
+                RememberObserverHolder(value, rememberObserverAnchor())
+            } else value
         updateValue(toStore)
     }
 
@@ -2196,32 +2087,32 @@
             } else null
         }
 
-    override val compositionData: CompositionData get() = slotTable
+    override val compositionData: CompositionData
+        get() = slotTable
 
-    /**
-     * Schedule a side effect to run when we apply composition changes.
-     */
+    /** Schedule a side effect to run when we apply composition changes. */
     override fun recordSideEffect(effect: () -> Unit) {
         changeListWriter.sideEffect(effect)
     }
 
     private fun currentCompositionLocalScope(): PersistentCompositionLocalMap {
-        providerCache?.let { return it }
+        providerCache?.let {
+            return it
+        }
         return currentCompositionLocalScope(reader.parent)
     }
 
     override val currentCompositionLocalMap: CompositionLocalMap
         get() = currentCompositionLocalScope()
 
-    /**
-     * Return the current [CompositionLocal] scope which was provided by a parent group.
-     */
+    /** Return the current [CompositionLocal] scope which was provided by a parent group. */
     private fun currentCompositionLocalScope(group: Int): PersistentCompositionLocalMap {
         if (inserting && writerHasAProvider) {
             var current = writer.parent
             while (current > 0) {
-                if (writer.groupKey(current) == compositionLocalMapKey &&
-                    writer.groupObjectKey(current) == compositionLocalMap
+                if (
+                    writer.groupKey(current) == compositionLocalMapKey &&
+                        writer.groupObjectKey(current) == compositionLocalMap
                 ) {
                     val providers = writer.groupAux(current) as PersistentCompositionLocalMap
                     providerCache = providers
@@ -2233,11 +2124,13 @@
         if (reader.size > 0) {
             var current = group
             while (current > 0) {
-                if (reader.groupKey(current) == compositionLocalMapKey &&
-                    reader.groupObjectKey(current) == compositionLocalMap
+                if (
+                    reader.groupKey(current) == compositionLocalMapKey &&
+                        reader.groupObjectKey(current) == compositionLocalMap
                 ) {
-                    val providers = providerUpdates?.get(current)
-                        ?: reader.groupAux(current) as PersistentCompositionLocalMap
+                    val providers =
+                        providerUpdates?.get(current)
+                            ?: reader.groupAux(current) as PersistentCompositionLocalMap
                     providerCache = providers
                     return providers
                 }
@@ -2249,9 +2142,9 @@
     }
 
     /**
-     * Update (or create) the slots to record the providers. The providers maps are first the
-     * scope followed by the map used to augment the parent scope. Both are needed to detect
-     * inserts, updates and deletes to the providers.
+     * Update (or create) the slots to record the providers. The providers maps are first the scope
+     * followed by the map used to augment the parent scope. Both are needed to detect inserts,
+     * updates and deletes to the providers.
      */
     private fun updateProviderMapGroup(
         parentScope: PersistentCompositionLocalMap,
@@ -2270,10 +2163,8 @@
     override fun startProvider(value: ProvidedValue<*>) {
         val parentScope = currentCompositionLocalScope()
         startGroup(providerKey, provider)
-        val oldState = rememberedValue().let {
-            if (it == Composer.Empty) null
-            else it as ValueHolder<Any?>
-        }
+        val oldState =
+            rememberedValue().let { if (it == Composer.Empty) null else it as ValueHolder<Any?> }
         val local = value.compositionLocal as CompositionLocal<Any?>
         val state = local.updatedStateOf(value as ProvidedValue<Any?>, oldState)
         val change = state != oldState
@@ -2283,9 +2174,12 @@
         val providers: PersistentCompositionLocalMap
         val invalid: Boolean
         if (inserting) {
-            providers = if (value.canOverride || !parentScope.contains(local)) {
-                parentScope.putValue(local, state)
-            } else { parentScope }
+            providers =
+                if (value.canOverride || !parentScope.contains(local)) {
+                    parentScope.putValue(local, state)
+                } else {
+                    parentScope
+                }
             invalid = false
             writerHasAProvider = true
         } else {
@@ -2306,11 +2200,13 @@
     }
 
     private fun recordProviderUpdate(providers: PersistentCompositionLocalMap) {
-        val providerUpdates = providerUpdates ?: run {
-            val newProviderUpdates = IntMap<PersistentCompositionLocalMap>()
-            this.providerUpdates = newProviderUpdates
-            newProviderUpdates
-        }
+        val providerUpdates =
+            providerUpdates
+                ?: run {
+                    val newProviderUpdates = IntMap<PersistentCompositionLocalMap>()
+                    this.providerUpdates = newProviderUpdates
+                    newProviderUpdates
+                }
         providerUpdates[reader.currentGroup] = providers
     }
 
@@ -2381,19 +2277,19 @@
      */
     override fun buildContext(): CompositionContext {
         startGroup(referenceKey, reference)
-        if (inserting)
-            writer.markGroup()
+        if (inserting) writer.markGroup()
 
         var holder = nextSlot() as? CompositionContextHolder
         if (holder == null) {
-            holder = CompositionContextHolder(
-                CompositionContextImpl(
-                    compoundKeyHash,
-                    forceRecomposeScopes,
-                    sourceMarkersEnabled,
-                    (composition as? CompositionImpl)?.observerHolder
+            holder =
+                CompositionContextHolder(
+                    CompositionContextImpl(
+                        compoundKeyHash,
+                        forceRecomposeScopes,
+                        sourceMarkersEnabled,
+                        (composition as? CompositionImpl)?.observerHolder
+                    )
                 )
-            )
             updateValue(holder)
         }
         holder.ref.updateCompositionLocalScope(currentCompositionLocalScope())
@@ -2406,15 +2302,17 @@
      * The number of changes that have been scheduled to be applied during
      * [ControlledComposition.applyChanges].
      *
-     * Slot table movement (skipping groups and nodes) will be coalesced so this number is
-     * possibly less than the total changes detected.
+     * Slot table movement (skipping groups and nodes) will be coalesced so this number is possibly
+     * less than the total changes detected.
      */
-    internal val changeCount get() = changes.size
+    internal val changeCount
+        get() = changes.size
 
     internal val currentRecomposeScope: RecomposeScopeImpl?
-        get() = invalidateStack.let {
-            if (childrenComposing == 0 && it.isNotEmpty()) it.peek() else null
-        }
+        get() =
+            invalidateStack.let {
+                if (childrenComposing == 0 && it.isNotEmpty()) it.peek() else null
+            }
 
     private fun ensureWriter() {
         if (writer.closed) {
@@ -2432,16 +2330,15 @@
     }
 
     private fun forceFreshInsertTable() {
-        insertTable = SlotTable().apply {
-            if (sourceMarkersEnabled) collectSourceInformation()
-            if (parentContext.collectingCallByInformation) collectCalledByInformation()
-        }
+        insertTable =
+            SlotTable().apply {
+                if (sourceMarkersEnabled) collectSourceInformation()
+                if (parentContext.collectingCallByInformation) collectCalledByInformation()
+            }
         writer = insertTable.openWriter().also { it.close(true) }
     }
 
-    /**
-     * Start the reader group updating the data of the group if necessary
-     */
+    /** Start the reader group updating the data of the group if necessary */
     private fun startReaderGroup(isNode: Boolean, data: Any?) {
         if (isNode) {
             reader.startNode()
@@ -2472,13 +2369,14 @@
                 else -> writer.startGroup(key, objectKey ?: Composer.Empty)
             }
             pending?.let { pending ->
-                val insertKeyInfo = KeyInfo(
-                    key = key,
-                    objectKey = -1,
-                    location = insertedGroupVirtualIndex(startIndex),
-                    nodes = -1,
-                    index = 0
-                )
+                val insertKeyInfo =
+                    KeyInfo(
+                        key = key,
+                        objectKey = -1,
+                        location = insertedGroupVirtualIndex(startIndex),
+                        nodes = -1,
+                        index = 0
+                    )
                 pending.registerInsert(insertKeyInfo, nodeIndex - pending.startIndex)
                 pending.recordUsed(insertKeyInfo)
             }
@@ -2493,10 +2391,7 @@
                 // The group is the same as what was generated last time.
                 startReaderGroup(isNode, data)
             } else {
-                pending = Pending(
-                    reader.extractKeys(),
-                    nodeIndex
-                )
+                pending = Pending(reader.extractKeys(), nodeIndex)
             }
         }
 
@@ -2545,19 +2440,17 @@
                     else -> writer.startGroup(key, objectKey ?: Composer.Empty)
                 }
                 insertAnchor = writer.anchor(startIndex)
-                val insertKeyInfo = KeyInfo(
-                    key = key,
-                    objectKey = -1,
-                    location = insertedGroupVirtualIndex(startIndex),
-                    nodes = -1,
-                    index = 0
-                )
+                val insertKeyInfo =
+                    KeyInfo(
+                        key = key,
+                        objectKey = -1,
+                        location = insertedGroupVirtualIndex(startIndex),
+                        nodes = -1,
+                        index = 0
+                    )
                 pending.registerInsert(insertKeyInfo, nodeIndex - pending.startIndex)
                 pending.recordUsed(insertKeyInfo)
-                newPending = Pending(
-                    mutableListOf(),
-                    if (isNode) 0 else nodeIndex
-                )
+                newPending = Pending(mutableListOf(), if (isNode) 0 else nodeIndex)
             }
         }
 
@@ -2766,8 +2659,8 @@
     /**
      * Recompose any invalidate child groups of the current parent group. This should be called
      * after the group is started but on or before the first child group. It is intended to be
-     * called instead of [skipReaderToGroupEnd] if any child groups are invalid. If no children
-     * are invalid it will call [skipReaderToGroupEnd].
+     * called instead of [skipReaderToGroupEnd] if any child groups are invalid. If no children are
+     * invalid it will call [skipReaderToGroupEnd].
      */
     private fun recomposeToGroupEnd() {
         val wasComposing = isComposing
@@ -2799,12 +2692,7 @@
 
                 // Calculate the node index (the distance index in the node this groups nodes are
                 // located in the parent node).
-                nodeIndex = nodeIndexOf(
-                    location,
-                    newGroup,
-                    parent,
-                    recomposeIndex
-                )
+                nodeIndex = nodeIndexOf(location, newGroup, parent, recomposeIndex)
 
                 // Calculate the current rGroupIndex for this node, storing any parent rGroup
                 // indexes we needed into the rGroup IntList
@@ -2813,12 +2701,8 @@
                 // Calculate the compound hash code (a semi-unique code for every group in the
                 // composition used to restore saved state).
                 val newParent = reader.parent(newGroup)
-                compoundKeyHash = compoundKeyOf(
-                    newParent,
-                    rGroupIndexOf(newParent),
-                    parent,
-                    recomposeCompoundKey
-                )
+                compoundKeyHash =
+                    compoundKeyOf(newParent, rGroupIndexOf(newParent), parent, recomposeCompoundKey)
 
                 // We have moved so the cached lookup of the provider is invalid
                 providerCache = null
@@ -2873,8 +2757,8 @@
      * track newly inserted groups is set to be negative offset from -2. This reserves -1 as the
      * root index which is the parent value returned by the root groups of the slot table.
      *
-     * This function will also restore a virtual index to its index in the insertTable which is
-     * not needed here but could be useful for debugging.
+     * This function will also restore a virtual index to its index in the insertTable which is not
+     * needed here but could be useful for debugging.
      */
     private fun insertedGroupVirtualIndex(index: Int) = -2 - index
 
@@ -2918,10 +2802,9 @@
     }
 
     /**
-     * Calculates the node index (the index in the child list of a node will appear in the
-     * resulting tree) for [group]. Passing in [recomposeGroup] and its node index in
-     * [recomposeIndex] allows the calculation to exit early if there is no node group between
-     * [group] and [recomposeGroup].
+     * Calculates the node index (the index in the child list of a node will appear in the resulting
+     * tree) for [group]. Passing in [recomposeGroup] and its node index in [recomposeIndex] allows
+     * the calculation to exit early if there is no node group between [group] and [recomposeGroup].
      */
     private fun nodeIndexOf(
         groupLocation: Int,
@@ -2970,9 +2853,8 @@
     }
 
     private fun updatedNodeCount(group: Int): Int {
-        if (group < 0) return nodeCountVirtualOverrides?.let {
-            if (it.contains(group)) it[group] else 0
-        } ?: 0
+        if (group < 0)
+            return nodeCountVirtualOverrides?.let { if (it.contains(group)) it[group] else 0 } ?: 0
         val nodeCounts = nodeCountOverrides
         if (nodeCounts != null) {
             val override = nodeCounts[group]
@@ -2984,19 +2866,23 @@
     private fun updateNodeCount(group: Int, count: Int) {
         if (updatedNodeCount(group) != count) {
             if (group < 0) {
-                val virtualCounts = nodeCountVirtualOverrides ?: run {
-                    val newCounts = MutableIntIntMap()
-                    nodeCountVirtualOverrides = newCounts
-                    newCounts
-                }
+                val virtualCounts =
+                    nodeCountVirtualOverrides
+                        ?: run {
+                            val newCounts = MutableIntIntMap()
+                            nodeCountVirtualOverrides = newCounts
+                            newCounts
+                        }
                 virtualCounts[group] = count
             } else {
-                val nodeCounts = nodeCountOverrides ?: run {
-                    val newCounts = IntArray(reader.size)
-                    newCounts.fill(-1)
-                    nodeCountOverrides = newCounts
-                    newCounts
-                }
+                val nodeCounts =
+                    nodeCountOverrides
+                        ?: run {
+                            val newCounts = IntArray(reader.size)
+                            newCounts.fill(-1)
+                            nodeCountOverrides = newCounts
+                            newCounts
+                        }
                 nodeCounts[group] = count
             }
         }
@@ -3008,16 +2894,12 @@
     }
 
     /**
-     * Records the operations necessary to move the applier the node affected by the previous
-     * group to the new group.
+     * Records the operations necessary to move the applier the node affected by the previous group
+     * to the new group.
      */
     private fun recordUpsAndDowns(oldGroup: Int, newGroup: Int, commonRoot: Int) {
         val reader = reader
-        val nearestCommonRoot = reader.nearestCommonRootOf(
-            oldGroup,
-            newGroup,
-            commonRoot
-        )
+        val nearestCommonRoot = reader.nearestCommonRootOf(oldGroup, newGroup, commonRoot)
 
         // Record ups for the nodes between oldGroup and nearestCommonRoot
         var current = oldGroup
@@ -3048,18 +2930,26 @@
         recomposeGroup: Int,
         recomposeKey: Int
     ): Int {
-        return if (group == recomposeGroup) recomposeKey else run {
-            val groupKey = reader.groupCompoundKeyPart(group)
-            if (groupKey == movableContentKey)
-                groupKey
-            else {
-                val parent = reader.parent(group)
-                val parentKey = if (parent == recomposeGroup) recomposeKey else
-                    compoundKeyOf(parent, rGroupIndexOf(parent), recomposeGroup, recomposeKey)
-                val effectiveRGroupIndex = if (reader.hasObjectKey(group)) 0 else rGroupIndex
-                (((parentKey rol 3) xor groupKey) rol 3) xor effectiveRGroupIndex
+        return if (group == recomposeGroup) recomposeKey
+        else
+            run {
+                val groupKey = reader.groupCompoundKeyPart(group)
+                if (groupKey == movableContentKey) groupKey
+                else {
+                    val parent = reader.parent(group)
+                    val parentKey =
+                        if (parent == recomposeGroup) recomposeKey
+                        else
+                            compoundKeyOf(
+                                parent,
+                                rGroupIndexOf(parent),
+                                recomposeGroup,
+                                recomposeKey
+                            )
+                    val effectiveRGroupIndex = if (reader.hasObjectKey(group)) 0 else rGroupIndex
+                    (((parentKey rol 3) xor groupKey) rol 3) xor effectiveRGroupIndex
+                }
             }
-        }
     }
 
     private fun SlotReader.groupCompoundKeyPart(group: Int) =
@@ -3071,11 +2961,14 @@
                     else -> it.hashCode()
                 }
             } ?: 0
-        } else groupKey(group).let {
-            if (it == reuseKey) groupAux(group)?.let { aux ->
-                if (aux == Composer.Empty) it else aux.hashCode()
-            } ?: it else it
-        }
+        } else
+            groupKey(group).let {
+                if (it == reuseKey)
+                    groupAux(group)?.let { aux ->
+                        if (aux == Composer.Empty) it else aux.hashCode()
+                    } ?: it
+                else it
+            }
 
     internal fun tryImminentInvalidation(scope: RecomposeScopeImpl, instance: Any?): Boolean {
         val anchor = scope.anchor ?: return false
@@ -3126,9 +3019,7 @@
         reader.skipToGroupEnd()
     }
 
-    /**
-     * Skip to the end of the group opened by [startGroup].
-     */
+    /** Skip to the end of the group opened by [startGroup]. */
     @ComposeCompilerApi
     override fun skipToGroupEnd() {
         runtimeCheck(groupNodeCount == 0) {
@@ -3182,16 +3073,19 @@
         } else {
             val invalidation = invalidations.removeLocation(reader.parent)
             val slot = reader.next()
-            val scope = if (slot == Composer.Empty) {
-                // This code is executed when a previously deactivate region is becomes active
-                // again. See Composer.deactivateToEndGroup()
-                val newScope = RecomposeScopeImpl(composition as CompositionImpl)
-                updateValue(newScope)
-                newScope
-            } else slot as RecomposeScopeImpl
-            scope.requiresRecompose = invalidation != null || scope.forcedRecompose.also { forced ->
-                if (forced) scope.forcedRecompose = false
-            }
+            val scope =
+                if (slot == Composer.Empty) {
+                    // This code is executed when a previously deactivate region is becomes active
+                    // again. See Composer.deactivateToEndGroup()
+                    val newScope = RecomposeScopeImpl(composition as CompositionImpl)
+                    updateValue(newScope)
+                    newScope
+                } else slot as RecomposeScopeImpl
+            scope.requiresRecompose =
+                invalidation != null ||
+                    scope.forcedRecompose.also { forced ->
+                        if (forced) scope.forcedRecompose = false
+                    }
             invalidateStack.push(scope)
             scope.start(compositionToken)
         }
@@ -3208,28 +3102,24 @@
         // This allows for the invalidate stack to be out of sync since this might be called during
         // exception stack unwinding that might have not called the doneJoin/endRestartGroup in the
         // the correct order.
-        val scope = if (invalidateStack.isNotEmpty()) invalidateStack.pop()
-        else null
+        val scope = if (invalidateStack.isNotEmpty()) invalidateStack.pop() else null
         scope?.requiresRecompose = false
-        scope?.end(compositionToken)?.let {
-            changeListWriter.endCompositionScope(it, composition)
-        }
-        val result = if (scope != null &&
-            !scope.skipped &&
-            (scope.used || forceRecomposeScopes)
-        ) {
-            if (scope.anchor == null) {
-                scope.anchor = if (inserting) {
-                    writer.anchor(writer.parent)
-                } else {
-                    reader.anchor(reader.parent)
+        scope?.end(compositionToken)?.let { changeListWriter.endCompositionScope(it, composition) }
+        val result =
+            if (scope != null && !scope.skipped && (scope.used || forceRecomposeScopes)) {
+                if (scope.anchor == null) {
+                    scope.anchor =
+                        if (inserting) {
+                            writer.anchor(writer.parent)
+                        } else {
+                            reader.anchor(reader.parent)
+                        }
                 }
+                scope.defaultsInvalid = false
+                scope
+            } else {
+                null
             }
-            scope.defaultsInvalid = false
-            scope
-        } else {
-            null
-        }
         end(isNode = false)
         return result
     }
@@ -3265,7 +3155,8 @@
             if (inserting) writer.markGroup()
 
             // Capture the local providers at the point of the invocation. This allows detecting
-            // changes to the locals as the value moves well as enables finding the correct providers
+            // changes to the locals as the value moves well as enables finding the correct
+            // providers
             // when applying late changes which might be very complicated otherwise.
             val providersChanged = if (inserting) false else reader.groupAux != locals
             if (providersChanged) recordProviderUpdate(locals)
@@ -3280,15 +3171,16 @@
 
                 // Create an anchor to the movable group
                 val anchor = writer.anchor(writer.parent(writer.parent))
-                val reference = MovableContentStateReference(
-                    content,
-                    parameter,
-                    composition,
-                    insertTable,
-                    anchor,
-                    emptyList(),
-                    currentCompositionLocalScope()
-                )
+                val reference =
+                    MovableContentStateReference(
+                        content,
+                        parameter,
+                        composition,
+                        insertTable,
+                        anchor,
+                        emptyList(),
+                        currentCompositionLocalScope()
+                    )
                 parentContext.insertMovableContent(reference)
             } else {
                 val savedProvidersInvalid = providersInvalid
@@ -3384,7 +3276,8 @@
                     // Insert nodes if necessary
                     if (nodesToInsert.isNotEmpty()) {
                         changeListWriter.copyNodesToNewAnchorLocation(
-                            nodesToInsert, effectiveNodeIndex
+                            nodesToInsert,
+                            effectiveNodeIndex
                         )
                         if (to.slotTable == slotTable) {
                             // Inserting the content into the current slot table then we need to
@@ -3392,10 +3285,7 @@
                             // a new slot table which is being created, not updated, so the virtual
                             // node counts do not need to be updated.
                             val group = slotTable.anchorIndex(anchor)
-                            updateNodeCount(
-                                group,
-                                updatedNodeCount(group) + nodesToInsert.size
-                            )
+                            updateNodeCount(group, updatedNodeCount(group) + nodesToInsert.size)
                         }
                     }
 
@@ -3546,29 +3436,19 @@
         // some invalidations scheduled already. it can happen when during some parent composition
         // there were a change for a state which was used by the child composition. such changes
         // will be tracked and added into `invalidations` list.
-        if (
-            invalidationsRequested.size > 0 ||
-            invalidations.isNotEmpty() ||
-            forciblyRecompose
-        ) {
+        if (invalidationsRequested.size > 0 || invalidations.isNotEmpty() || forciblyRecompose) {
             doCompose(invalidationsRequested, null)
             return changes.isNotEmpty()
         }
         return false
     }
 
-    fun updateComposerInvalidations(
-        invalidationsRequested: ScopeMap<RecomposeScopeImpl, Any>
-    ) {
+    fun updateComposerInvalidations(invalidationsRequested: ScopeMap<RecomposeScopeImpl, Any>) {
         invalidationsRequested.map.forEach { scope, instances ->
             scope as RecomposeScopeImpl
             val location = scope.anchor?.location ?: return@forEach
             invalidations.add(
-                Invalidation(
-                    scope,
-                    location,
-                    instances.takeUnless { it === ScopeInvalidated }
-                )
+                Invalidation(scope, location, instances.takeUnless { it === ScopeInvalidated })
             )
         }
         invalidations.sortWith(InvalidationLocationAscending)
@@ -3604,8 +3484,8 @@
                         endGroup()
                     } else if (
                         (forciblyRecompose || providersInvalid) &&
-                        savedContent != null &&
-                        savedContent != Composer.Empty
+                            savedContent != null &&
+                            savedContent != Composer.Empty
                     ) {
                         startGroup(invocationKey, invocation)
                         @Suppress("UNCHECKED_CAST")
@@ -3626,9 +3506,11 @@
         }
     }
 
-    val hasInvalidations get() = invalidations.isNotEmpty()
+    val hasInvalidations
+        get() = invalidations.isNotEmpty()
 
-    private val SlotReader.node get() = node(parent)
+    private val SlotReader.node
+        get() = node(parent)
 
     private fun SlotReader.nodeAt(index: Int) = node(index)
 
@@ -3663,8 +3545,8 @@
      * Report any movable content that the group contains as being removed and ready to be moved.
      * Returns true if the group itself was removed.
      *
-     * Returns the number of nodes left in place which is used to calculate the node index of
-     * any nested calls.
+     * Returns the number of nodes left in place which is used to calculate the node index of any
+     * nested calls.
      *
      * @param groupBeingRemoved The group that is being removed from the table or 0 if the entire
      *   table is being removed.
@@ -3689,22 +3571,26 @@
                     val parameter = reader.groupGet(group, 0)
                     val anchor = reader.anchor(group)
                     val end = group + reader.groupSize(group)
-                    val invalidations = this.invalidations.filterToRange(group, end).fastMap {
-                        it.scope to it.instances
-                    }
-                    val reference = MovableContentStateReference(
-                        movableContent,
-                        parameter,
-                        composition,
-                        slotTable,
-                        anchor,
-                        invalidations,
-                        currentCompositionLocalScope(group)
-                    )
+                    val invalidations =
+                        this.invalidations.filterToRange(group, end).fastMap {
+                            it.scope to it.instances
+                        }
+                    val reference =
+                        MovableContentStateReference(
+                            movableContent,
+                            parameter,
+                            composition,
+                            slotTable,
+                            anchor,
+                            invalidations,
+                            currentCompositionLocalScope(group)
+                        )
                     parentContext.deletedMovableContent(reference)
                     changeListWriter.recordSlotEditing()
                     changeListWriter.releaseMovableGroupAtCurrent(
-                        composition, parentContext, reference
+                        composition,
+                        parentContext,
+                        reference
                     )
                     if (needsNodeDelete) {
                         changeListWriter.endNodeMovementAndDeleteNode(nodeIndex, group)
@@ -3752,11 +3638,12 @@
                         changeListWriter.endNodeMovement()
                         changeListWriter.moveDown(reader.node(current))
                     }
-                    runningNodeCount += reportGroup(
-                        group = current,
-                        needsNodeDelete = isNode || needsNodeDelete,
-                        nodeIndex = if (isNode) 0 else nodeIndex + runningNodeCount
-                    )
+                    runningNodeCount +=
+                        reportGroup(
+                            group = current,
+                            needsNodeDelete = isNode || needsNodeDelete,
+                            nodeIndex = if (isNode) 0 else nodeIndex + runningNodeCount
+                        )
                     if (isNode) {
                         changeListWriter.endNodeMovement()
                         changeListWriter.moveUp()
@@ -3771,8 +3658,8 @@
     }
 
     /**
-     * Called during composition to report all the content of the composition will be released
-     * as this composition is to be disposed.
+     * Called during composition to report all the content of the composition will be released as
+     * this composition is to be disposed.
      */
     private fun reportAllMovableContent() {
         if (slotTable.containsMark()) {
@@ -3811,16 +3698,17 @@
     }
 
     /**
-     * A holder that will dispose of its [CompositionContext] when it leaves the composition
-     * that will not have its reference made visible to user code.
+     * A holder that will dispose of its [CompositionContext] when it leaves the composition that
+     * will not have its reference made visible to user code.
      */
-    private class CompositionContextHolder(
-        val ref: ComposerImpl.CompositionContextImpl
-    ) : ReusableRememberObserver {
-        override fun onRemembered() { }
+    private class CompositionContextHolder(val ref: ComposerImpl.CompositionContextImpl) :
+        ReusableRememberObserver {
+        override fun onRemembered() {}
+
         override fun onAbandoned() {
             ref.dispose()
         }
+
         override fun onForgotten() {
             ref.dispose()
         }
@@ -3843,8 +3731,7 @@
             if (composers.isNotEmpty()) {
                 inspectionTables?.let {
                     for (composer in composers) {
-                        for (table in it)
-                            table.remove(composer.slotTable)
+                        for (table in it) table.remove(composer.slotTable)
                     }
                 }
                 composers.clear()
@@ -3907,10 +3794,11 @@
         // we need changes made to it in composition to be visible for the rest of the current
         // composition and not become visible outside of the composition process until composition
         // succeeds.
-        private var compositionLocalScope by mutableStateOf<PersistentCompositionLocalMap>(
-            persistentCompositionLocalHashMapOf(),
-            referentialEqualityPolicy()
-        )
+        private var compositionLocalScope by
+            mutableStateOf<PersistentCompositionLocalMap>(
+                persistentCompositionLocalHashMapOf(),
+                referentialEqualityPolicy()
+            )
 
         override fun getCompositionLocalScope(): PersistentCompositionLocalMap =
             compositionLocalScope
@@ -3920,11 +3808,9 @@
         }
 
         override fun recordInspectionTable(table: MutableSet<CompositionData>) {
-            (
-                inspectionTables ?: HashSet<MutableSet<CompositionData>>().also {
-                    inspectionTables = it
-                }
-                ).add(table)
+            (inspectionTables
+                    ?: HashSet<MutableSet<CompositionData>>().also { inspectionTables = it })
+                .add(table)
         }
 
         override fun startComposing() {
@@ -3969,12 +3855,9 @@
         if (dataKey == null)
             if (data != null && groupKey == reuseKey && data != Composer.Empty)
                 updateCompoundKeyWhenWeEnterGroupKeyHash(data.hashCode(), rGroupIndex)
-            else
-                updateCompoundKeyWhenWeEnterGroupKeyHash(groupKey, rGroupIndex)
-        else if (dataKey is Enum<*>)
-            updateCompoundKeyWhenWeEnterGroupKeyHash(dataKey.ordinal, 0)
-        else
-            updateCompoundKeyWhenWeEnterGroupKeyHash(dataKey.hashCode(), 0)
+            else updateCompoundKeyWhenWeEnterGroupKeyHash(groupKey, rGroupIndex)
+        else if (dataKey is Enum<*>) updateCompoundKeyWhenWeEnterGroupKeyHash(dataKey.ordinal, 0)
+        else updateCompoundKeyWhenWeEnterGroupKeyHash(dataKey.hashCode(), 0)
     }
 
     @Suppress("NOTHING_TO_INLINE")
@@ -3992,12 +3875,9 @@
         if (dataKey == null)
             if (data != null && groupKey == reuseKey && data != Composer.Empty)
                 updateCompoundKeyWhenWeExitGroupKeyHash(data.hashCode(), rGroupIndex)
-            else
-                updateCompoundKeyWhenWeExitGroupKeyHash(groupKey, rGroupIndex)
-        else if (dataKey is Enum<*>)
-            updateCompoundKeyWhenWeExitGroupKeyHash(dataKey.ordinal, 0)
-        else
-            updateCompoundKeyWhenWeExitGroupKeyHash(dataKey.hashCode(), 0)
+            else updateCompoundKeyWhenWeExitGroupKeyHash(groupKey, rGroupIndex)
+        else if (dataKey is Enum<*>) updateCompoundKeyWhenWeExitGroupKeyHash(dataKey.ordinal, 0)
+        else updateCompoundKeyWhenWeExitGroupKeyHash(dataKey.hashCode(), 0)
     }
 
     @Suppress("NOTHING_TO_INLINE")
@@ -4007,108 +3887,109 @@
 
     // This is only used in tests to ensure the stacks do not silently leak.
     internal fun stacksSize(): Int {
-        return entersStack.size + invalidateStack.size + providersInvalidStack.size +
-            pendingStack.size + parentStateStack.size
+        return entersStack.size +
+            invalidateStack.size +
+            providersInvalidStack.size +
+            pendingStack.size +
+            parentStateStack.size
     }
 
-    override val recomposeScope: RecomposeScope? get() = currentRecomposeScope
-    override val recomposeScopeIdentity: Any? get() = currentRecomposeScope?.anchor
+    override val recomposeScope: RecomposeScope?
+        get() = currentRecomposeScope
+
+    override val recomposeScopeIdentity: Any?
+        get() = currentRecomposeScope?.anchor
+
     override fun rememberedValue(): Any? = nextSlotForCache()
+
     override fun updateRememberedValue(value: Any?) = updateCachedValue(value)
-    override fun recordUsed(scope: RecomposeScope) { (scope as? RecomposeScopeImpl)?.used = true }
+
+    override fun recordUsed(scope: RecomposeScope) {
+        (scope as? RecomposeScopeImpl)?.used = true
+    }
 }
 
 /**
- * A helper receiver scope class used by [ComposeNode] to help write code to initialized and update a
- * node.
+ * A helper receiver scope class used by [ComposeNode] to help write code to initialized and update
+ * a node.
  *
  * @see ComposeNode
  */
 @JvmInline
-value class Updater<T> constructor(
-    @PublishedApi internal val composer: Composer
-) {
+value class Updater<T> constructor(@PublishedApi internal val composer: Composer) {
     /**
      * Set the value property of the emitted node.
      *
-     * Schedules [block] to be run when the node is first created or when [value] is different
-     * than the previous composition.
+     * Schedules [block] to be run when the node is first created or when [value] is different than
+     * the previous composition.
      *
      * @see update
      */
     @Suppress("NOTHING_TO_INLINE") // Inlining the compare has noticeable impact
-    inline fun set(
-        value: Int,
-        noinline block: T.(value: Int) -> Unit
-    ) = with(composer) {
-        if (inserting || rememberedValue() != value) {
-            updateRememberedValue(value)
-            composer.apply(value, block)
+    inline fun set(value: Int, noinline block: T.(value: Int) -> Unit) =
+        with(composer) {
+            if (inserting || rememberedValue() != value) {
+                updateRememberedValue(value)
+                composer.apply(value, block)
+            }
         }
-    }
 
     /**
      * Set the value property of the emitted node.
      *
-     * Schedules [block] to be run when the node is first created or when [value] is different
-     * than the previous composition.
+     * Schedules [block] to be run when the node is first created or when [value] is different than
+     * the previous composition.
      *
      * @see update
      */
-    fun <V> set(
-        value: V,
-        block: T.(value: V) -> Unit
-    ) = with(composer) {
-        if (inserting || rememberedValue() != value) {
-            updateRememberedValue(value)
-            composer.apply(value, block)
+    fun <V> set(value: V, block: T.(value: V) -> Unit) =
+        with(composer) {
+            if (inserting || rememberedValue() != value) {
+                updateRememberedValue(value)
+                composer.apply(value, block)
+            }
         }
-    }
 
     /**
      * Update the value of a property of the emitted node.
      *
      * Schedules [block] to be run when [value] is different than the previous composition. It is
      * different than [set] in that it does not run when the node is created. This is used when
-     * initial value set by the [ComposeNode] in the constructor callback already has the correct value.
-     * For example, use [update} when [value] is passed into of the classes constructor
+     * initial value set by the [ComposeNode] in the constructor callback already has the correct
+     * value. For example, use [update} when [value] is passed into of the classes constructor
      * parameters.
      *
      * @see set
      */
     @Suppress("NOTHING_TO_INLINE") // Inlining the compare has noticeable impact
-    inline fun update(
-        value: Int,
-        noinline block: T.(value: Int) -> Unit
-    ) = with(composer) {
-        val inserting = inserting
-        if (inserting || rememberedValue() != value) {
-            updateRememberedValue(value)
-            if (!inserting) apply(value, block)
+    inline fun update(value: Int, noinline block: T.(value: Int) -> Unit) =
+        with(composer) {
+            val inserting = inserting
+            if (inserting || rememberedValue() != value) {
+                updateRememberedValue(value)
+                if (!inserting) apply(value, block)
+            }
         }
-    }
 
     /**
      * Update the value of a property of the emitted node.
      *
      * Schedules [block] to be run when [value] is different than the previous composition. It is
      * different than [set] in that it does not run when the node is created. This is used when
-     * initial value set by the [ComposeNode] in the constructor callback already has the correct value.
-     * For example, use [update} when [value] is passed into of the classes constructor
+     * initial value set by the [ComposeNode] in the constructor callback already has the correct
+     * value. For example, use [update} when [value] is passed into of the classes constructor
      * parameters.
      *
      * @see set
      */
-    fun <V> update(
-        value: V,
-        block: T.(value: V) -> Unit
-    ) = with(composer) {
-        val inserting = inserting
-        if (inserting || rememberedValue() != value) {
-            updateRememberedValue(value)
-            if (!inserting) apply(value, block)
+    fun <V> update(value: V, block: T.(value: V) -> Unit) =
+        with(composer) {
+            val inserting = inserting
+            if (inserting || rememberedValue() != value) {
+                updateRememberedValue(value)
+                if (!inserting) apply(value, block)
+            }
         }
-    }
 
     /**
      * Initialize emitted node.
@@ -4121,35 +4002,29 @@
      * @see reconcile
      */
     fun init(block: T.() -> Unit) {
-        if (composer.inserting) composer.apply<Unit, T>(Unit) {
-            block()
-        }
+        if (composer.inserting) composer.apply<Unit, T>(Unit) { block() }
     }
 
     /**
      * Reconcile the node to the current state.
      *
-     * This is used when [set] and [update] are insufficient to update the state of the node
-     * based on changes passed to the function calling [ComposeNode].
+     * This is used when [set] and [update] are insufficient to update the state of the node based
+     * on changes passed to the function calling [ComposeNode].
      *
-     * Schedules [block] to execute. As this unconditionally schedules [block] to executed it
-     * might be executed unnecessarily as no effort is taken to ensure it only executes when the
-     * values [block] captures have changed. It is highly recommended that [set] and [update] be
-     * used instead as they will only schedule their blocks to executed when the value passed to
-     * them has changed.
+     * Schedules [block] to execute. As this unconditionally schedules [block] to executed it might
+     * be executed unnecessarily as no effort is taken to ensure it only executes when the values
+     * [block] captures have changed. It is highly recommended that [set] and [update] be used
+     * instead as they will only schedule their blocks to executed when the value passed to them has
+     * changed.
      */
     @Suppress("MemberVisibilityCanBePrivate")
     fun reconcile(block: T.() -> Unit) {
-        composer.apply<Unit, T>(Unit) {
-            this.block()
-        }
+        composer.apply<Unit, T>(Unit) { this.block() }
     }
 }
 
 @JvmInline
-value class SkippableUpdater<T> constructor(
-    @PublishedApi internal val composer: Composer
-) {
+value class SkippableUpdater<T> constructor(@PublishedApi internal val composer: Composer) {
     inline fun update(block: Updater<T>.() -> Unit) {
         composer.startReplaceableGroup(0x1e65194f)
         Updater<T>(composer).block()
@@ -4201,8 +4076,10 @@
     cb(priority, endRelativeAfter)
 }
 
-internal val SlotWriter.isAfterFirstChild get() = currentGroup > parent + 1
-internal val SlotReader.isAfterFirstChild get() = currentGroup > parent + 1
+internal val SlotWriter.isAfterFirstChild
+    get() = currentGroup > parent + 1
+internal val SlotReader.isAfterFirstChild
+    get() = currentGroup > parent + 1
 
 internal fun SlotWriter.deactivateCurrentGroup(rememberManager: RememberManager) {
     // Notify the lifecycle manager of any observers leaving the slot table
@@ -4249,16 +4126,12 @@
 }
 
 private fun SlotWriter.removeData(group: Int, index: Int, data: Any?) {
-    runtimeCheck(data === set(group, index, Composer.Empty)) {
-        "Slot table is out of sync"
-    }
+    runtimeCheck(data === set(group, index, Composer.Empty)) { "Slot table is out of sync" }
 }
 
 @JvmInline
 @Suppress("UNCHECKED_CAST")
-private value class MutableScatterMultiMap<K, V : Any>(
-    val map: MutableScatterMap<K, Any>
-) {
+private value class MutableScatterMultiMap<K, V : Any>(val map: MutableScatterMap<K, Any>) {
     fun put(key: K, value: V) {
         map.compute(key) { _, previous ->
             when (previous) {
@@ -4280,34 +4153,33 @@
         }
     }
 
-    fun pop(key: K) = map[key]?.let { entry ->
-        @Suppress("UNCHECKED_CAST")
-        when (entry) {
-            is MutableList<*> -> {
-                val list = entry as MutableList<V>
-                val result = list.removeAt(0)
-                if (list.isEmpty()) map.remove(key)
-                result
+    fun pop(key: K) =
+        map[key]?.let { entry ->
+            @Suppress("UNCHECKED_CAST")
+            when (entry) {
+                is MutableList<*> -> {
+                    val list = entry as MutableList<V>
+                    val result = list.removeAt(0)
+                    if (list.isEmpty()) map.remove(key)
+                    result
+                }
+                else -> {
+                    map.remove(key)
+                    entry
+                }
             }
-            else -> {
-                map.remove(key)
-                entry
-            }
-        } as V
-    }
+                as V
+        }
 }
 
 private fun <K, V : Any> multiMap(initialCapacity: Int) =
     MutableScatterMultiMap<K, V>(MutableScatterMap(initialCapacity))
 
-private fun getKey(value: Any?, left: Any?, right: Any?): Any? = (value as? JoinedKey)?.let {
-    if (it.left == left && it.right == right) value
-    else getKey(it.left, left, right) ?: getKey(
-        it.right,
-        left,
-        right
-    )
-}
+private fun getKey(value: Any?, left: Any?, right: Any?): Any? =
+    (value as? JoinedKey)?.let {
+        if (it.left == left && it.right == right) value
+        else getKey(it.left, left, right) ?: getKey(it.right, left, right)
+    }
 
 // Invalidation helpers
 private fun MutableList<Invalidation>.findLocation(location: Int): Int {
@@ -4358,7 +4230,6 @@
                     oldInstance as MutableScatterSet<Any?>
                     oldInstance.add(instance)
                 }
-
                 else -> {
                     invalidation.instances = mutableScatterSetOf(oldInstance, instance)
                 }
@@ -4387,8 +4258,7 @@
     val index = findInsertLocation(start)
     while (index < size) {
         val validation = get(index)
-        if (validation.location < end) removeAt(index)
-        else break
+        if (validation.location < end) removeAt(index) else break
     }
 }
 
@@ -4400,14 +4270,14 @@
     var index = findInsertLocation(start)
     while (index < size) {
         val invalidation = get(index)
-        if (invalidation.location < end) result.add(invalidation)
-        else break
+        if (invalidation.location < end) result.add(invalidation) else break
         index++
     }
     return result
 }
 
 private fun Boolean.asInt() = if (this) 1 else 0
+
 private fun Int.asBool() = this != 0
 
 private fun SlotTable.collectNodesFrom(anchor: Anchor): List<Any?> {
@@ -4469,15 +4339,19 @@
     return currentA
 }
 
-private val KeyInfo.joinedKey: Any get() = if (objectKey != null) JoinedKey(key, objectKey) else key
+private val KeyInfo.joinedKey: Any
+    get() = if (objectKey != null) JoinedKey(key, objectKey) else key
 
 /*
  * Group types used with [Composer.start] to differentiate between different types of groups
  */
 @JvmInline
 private value class GroupKind private constructor(val value: Int) {
-    inline val isNode get() = value != Group.value
-    inline val isReusable get() = value != Node.value
+    inline val isNode
+        get() = value != Group.value
+
+    inline val isReusable
+        get() = value != Node.value
 
     companion object {
         val Group = GroupKind(0)
@@ -4492,10 +4366,7 @@
  */
 internal interface ReusableRememberObserver : RememberObserver
 
-internal class RememberObserverHolder(
-    var wrapped: RememberObserver,
-    var after: Anchor?
-)
+internal class RememberObserverHolder(var wrapped: RememberObserver, var after: Anchor?)
 
 /*
  * Integer keys are arbitrary values in the biload range. The do not need to be unique as if
@@ -4513,44 +4384,31 @@
 // An arbitrary key value that marks the default parameter group
 private const val defaultsKey = -127
 
-@PublishedApi
-internal const val invocationKey = 200
+@PublishedApi internal const val invocationKey = 200
 
-@PublishedApi
-internal val invocation: Any = OpaqueKey("provider")
+@PublishedApi internal val invocation: Any = OpaqueKey("provider")
 
-@PublishedApi
-internal const val providerKey = 201
+@PublishedApi internal const val providerKey = 201
 
-@PublishedApi
-internal val provider: Any = OpaqueKey("provider")
+@PublishedApi internal val provider: Any = OpaqueKey("provider")
 
-@PublishedApi
-internal const val compositionLocalMapKey = 202
+@PublishedApi internal const val compositionLocalMapKey = 202
 
-@PublishedApi
-internal val compositionLocalMap: Any = OpaqueKey("compositionLocalMap")
+@PublishedApi internal val compositionLocalMap: Any = OpaqueKey("compositionLocalMap")
 
-@PublishedApi
-internal const val providerValuesKey = 203
+@PublishedApi internal const val providerValuesKey = 203
 
-@PublishedApi
-internal val providerValues: Any = OpaqueKey("providerValues")
+@PublishedApi internal val providerValues: Any = OpaqueKey("providerValues")
 
-@PublishedApi
-internal const val providerMapsKey = 204
+@PublishedApi internal const val providerMapsKey = 204
 
-@PublishedApi
-internal val providerMaps: Any = OpaqueKey("providers")
+@PublishedApi internal val providerMaps: Any = OpaqueKey("providers")
 
-@PublishedApi
-internal const val referenceKey = 206
+@PublishedApi internal const val referenceKey = 206
 
-@PublishedApi
-internal val reference: Any = OpaqueKey("reference")
+@PublishedApi internal val reference: Any = OpaqueKey("reference")
 
-@PublishedApi
-internal const val reuseKey = 207
+@PublishedApi internal const val reuseKey = 207
 
 private const val invalidGroupLocation = -2
 
@@ -4559,9 +4417,7 @@
 @Suppress("BanInlineOptIn")
 @OptIn(ExperimentalContracts::class)
 internal inline fun runtimeCheck(value: Boolean, lazyMessage: () -> String) {
-    contract {
-        returns() implies value
-    }
+    contract { returns() implies value }
     if (!value) {
         composeImmediateRuntimeError(lazyMessage())
     }
@@ -4587,6 +4443,5 @@
     )
 }
 
-private val InvalidationLocationAscending = Comparator<Invalidation> { i1, i2 ->
-    i1.location.compareTo(i2.location)
-}
+private val InvalidationLocationAscending =
+    Comparator<Invalidation> { i1, i2 -> i1.location.compareTo(i2.location) }
diff --git a/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/Composition.kt b/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/Composition.kt
index d2a50a8..d9a2494 100644
--- a/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/Composition.kt
+++ b/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/Composition.kt
@@ -15,6 +15,7 @@
  */
 
 @file:OptIn(InternalComposeApi::class)
+
 package androidx.compose.runtime
 
 import androidx.collection.MutableIntList
@@ -36,44 +37,41 @@
 import kotlin.coroutines.EmptyCoroutineContext
 
 /**
- * A composition object is usually constructed for you, and returned from an API that
- * is used to initially compose a UI. For instance, [setContent] returns a Composition.
+ * A composition object is usually constructed for you, and returned from an API that is used to
+ * initially compose a UI. For instance, [setContent] returns a Composition.
  *
- * The [dispose] method should be used when you would like to dispose of the UI and
- * the Composition.
+ * The [dispose] method should be used when you would like to dispose of the UI and the Composition.
  */
 interface Composition {
     /**
-     * Returns true if any pending invalidations have been scheduled. An invalidation is schedule
-     * if [RecomposeScope.invalidate] has been called on any composition scopes create for the
+     * Returns true if any pending invalidations have been scheduled. An invalidation is schedule if
+     * [RecomposeScope.invalidate] has been called on any composition scopes create for the
      * composition.
      *
-     * Modifying [MutableState.value] of a value produced by [mutableStateOf] will
-     * automatically call [RecomposeScope.invalidate] for any scope that read [State.value] of
-     * the mutable state instance during composition.
+     * Modifying [MutableState.value] of a value produced by [mutableStateOf] will automatically
+     * call [RecomposeScope.invalidate] for any scope that read [State.value] of the mutable state
+     * instance during composition.
      *
      * @see RecomposeScope
      * @see mutableStateOf
      */
     val hasInvalidations: Boolean
 
-    /**
-     * True if [dispose] has been called.
-     */
+    /** True if [dispose] has been called. */
     val isDisposed: Boolean
 
     /**
-     * Clear the hierarchy that was created from the composition and release resources allocated
-     * for composition. After calling [dispose] the composition will no longer be recomposed and
-     * calling [setContent] will throw an [IllegalStateException]. Calling [dispose] is
-     * idempotent, all calls after the first are a no-op.
+     * Clear the hierarchy that was created from the composition and release resources allocated for
+     * composition. After calling [dispose] the composition will no longer be recomposed and calling
+     * [setContent] will throw an [IllegalStateException]. Calling [dispose] is idempotent, all
+     * calls after the first are a no-op.
      */
     fun dispose()
 
     /**
-     * Update the composition with the content described by the [content] composable. After this
-     * has been called the changes to produce the initial composition has been calculated and
-     * applied to the composition.
+     * Update the composition with the content described by the [content] composable. After this has
+     * been called the changes to produce the initial composition has been calculated and applied to
+     * the composition.
      *
      * Will throw an [IllegalStateException] if the composition has been disposed.
      *
@@ -91,14 +89,14 @@
  */
 sealed interface ReusableComposition : Composition {
     /**
-     * Update the composition with the content described by the [content] composable.
-     * After this has been called the changes to produce the initial composition has been calculated
-     * and applied to the composition.
+     * Update the composition with the content described by the [content] composable. After this has
+     * been called the changes to produce the initial composition has been calculated and applied to
+     * the composition.
      *
      * This method forces this composition into "reusing" state before setting content. In reusing
      * state, all remembered content is discarded, and nodes emitted by [ReusableComposeNode] are
-     * re-used for the new content. The nodes are only reused if the group structure containing
-     * the node matches new content.
+     * re-used for the new content. The nodes are only reused if the group structure containing the
+     * node matches new content.
      *
      * Will throw an [IllegalStateException] if the composition has been disposed.
      *
@@ -109,15 +107,15 @@
 
     /**
      * Deactivate all observation scopes in composition and remove all remembered slots while
-     * preserving nodes in place.
-     * The composition can be re-activated by calling [setContent] with a new content.
+     * preserving nodes in place. The composition can be re-activated by calling [setContent] with a
+     * new content.
      */
     fun deactivate()
 }
 
 /**
- * A key to locate a service using the [CompositionServices] interface optionally implemented
- * by implementations of [Composition].
+ * A key to locate a service using the [CompositionServices] interface optionally implemented by
+ * implementations of [Composition].
  */
 interface CompositionServiceKey<T>
 
@@ -132,9 +130,7 @@
  * this interface and delegate calls to [getCompositionService] to the original [Composition].
  */
 interface CompositionServices {
-    /**
-     * Find a service of class [T].
-     */
+    /** Find a service of class [T]. */
     fun <T> getCompositionService(key: CompositionServiceKey<T>): T?
 }
 
@@ -153,8 +149,8 @@
  * This is the interface used by the [Recomposer] to control how and when a composition is
  * invalidated and subsequently recomposed.
  *
- * Normally a composition is controlled by the [Recomposer] but it is often more efficient for
- * tests to take direct control over a composition by calling [ControlledComposition] instead of
+ * Normally a composition is controlled by the [Recomposer] but it is often more efficient for tests
+ * to take direct control over a composition by calling [ControlledComposition] instead of
  * [Composition].
  *
  * @see ControlledComposition
@@ -167,16 +163,16 @@
     val isComposing: Boolean
 
     /**
-     * True after [composeContent] or [recompose] has been called and [applyChanges] is expected
-     * as the next call. An exception will be throw in [composeContent] or [recompose] is called
-     * while there are pending from the previous composition pending to be applied.
+     * True after [composeContent] or [recompose] has been called and [applyChanges] is expected as
+     * the next call. An exception will be throw in [composeContent] or [recompose] is called while
+     * there are pending from the previous composition pending to be applied.
      */
     val hasPendingChanges: Boolean
 
     /**
-     * Called by the parent composition in response to calling [setContent]. After this method
-     * the changes should be calculated but not yet applied. DO NOT call this method directly if
-     * this is interface is controlled by a [Recomposer], either use [setContent] or
+     * Called by the parent composition in response to calling [setContent]. After this method the
+     * changes should be calculated but not yet applied. DO NOT call this method directly if this is
+     * interface is controlled by a [Recomposer], either use [setContent] or
      * [Recomposer.composeInitial] instead.
      *
      * @param content A composable function that describes the tree.
@@ -184,18 +180,18 @@
     fun composeContent(content: @Composable () -> Unit)
 
     /**
-     * Record the values that were modified after the last call to [recompose] or from the
-     * initial call to [composeContent]. This should be called before [recompose] is called to
-     * record which parts of the composition need to be recomposed.
+     * Record the values that were modified after the last call to [recompose] or from the initial
+     * call to [composeContent]. This should be called before [recompose] is called to record which
+     * parts of the composition need to be recomposed.
      *
      * @param values the set of values that have changed since the last composition.
      */
     fun recordModificationsOf(values: Set<Any>)
 
     /**
-     * Returns true if any of the object instances in [values] is observed by this composition.
-     * This allows detecting if values changed by a previous composition will potentially affect
-     * this composition.
+     * Returns true if any of the object instances in [values] is observed by this composition. This
+     * allows detecting if values changed by a previous composition will potentially affect this
+     * composition.
      */
     fun observesAnyOf(values: Set<Any>): Boolean
 
@@ -209,8 +205,8 @@
 
     /**
      * Record that [value] has been read. This is used primarily by the [Recomposer] to inform the
-     * composer when the a [MutableState] instance has been read implying it should be observed
-     * for changes.
+     * composer when the a [MutableState] instance has been read implying it should be observed for
+     * changes.
      *
      * @param value the instance from which a property was read
      */
@@ -223,9 +219,9 @@
     fun recordWriteOf(value: Any)
 
     /**
-     * Recompose the composition to calculate any changes necessary to the composition state and
-     * the tree maintained by the applier. No changes have been made yet. Changes calculated will
-     * be applied when [applyChanges] is called.
+     * Recompose the composition to calculate any changes necessary to the composition state and the
+     * tree maintained by the applier. No changes have been made yet. Changes calculated will be
+     * applied when [applyChanges] is called.
      *
      * @return returns `true` if any changes are pending and [applyChanges] should be called.
      */
@@ -242,31 +238,28 @@
         references: List<Pair<MovableContentStateReference, MovableContentStateReference?>>
     )
 
-    /**
-     * Dispose the value state that is no longer needed.
-     */
-    @InternalComposeApi
-    fun disposeUnusedMovableContent(state: MovableContentState)
+    /** Dispose the value state that is no longer needed. */
+    @InternalComposeApi fun disposeUnusedMovableContent(state: MovableContentState)
 
     /**
-     * Apply the changes calculated during [setContent] or [recompose]. If an exception is thrown
-     * by [applyChanges] the composition is irreparably damaged and should be [dispose]d.
+     * Apply the changes calculated during [setContent] or [recompose]. If an exception is thrown by
+     * [applyChanges] the composition is irreparably damaged and should be [dispose]d.
      */
     fun applyChanges()
 
     /**
      * Apply change that must occur after the main bulk of changes have been applied. Late changes
      * are the result of inserting movable content and it must be performed after [applyChanges]
-     * because, for content that have moved must be inserted only after it has been removed from
-     * the previous location. All deletes must be executed before inserts. To ensure this, all
-     * deletes are performed in [applyChanges] and all inserts are performed in [applyLateChanges].
+     * because, for content that have moved must be inserted only after it has been removed from the
+     * previous location. All deletes must be executed before inserts. To ensure this, all deletes
+     * are performed in [applyChanges] and all inserts are performed in [applyLateChanges].
      */
     fun applyLateChanges()
 
     /**
      * Call when all changes, including late changes, have been applied. This signals to the
-     * composition that any transitory composition state can now be discarded. This is advisory
-     * only and a controlled composition will execute correctly when this is not called.
+     * composition that any transitory composition state can now be discarded. This is advisory only
+     * and a controlled composition will execute correctly when this is not called.
      */
     fun changesApplied()
 
@@ -284,31 +277,26 @@
     fun invalidateAll()
 
     /**
-     * Throws an exception if the internal state of the composer has been corrupted and is no
-     * longer consistent. Used in testing the composer itself.
+     * Throws an exception if the internal state of the composer has been corrupted and is no longer
+     * consistent. Used in testing the composer itself.
      */
-    @InternalComposeApi
-    fun verifyConsistent()
+    @InternalComposeApi fun verifyConsistent()
 
     /**
-     * Temporarily delegate all invalidations sent to this composition to the [to] composition.
-     * This is used when movable content moves between compositions. The recompose scopes are not
+     * Temporarily delegate all invalidations sent to this composition to the [to] composition. This
+     * is used when movable content moves between compositions. The recompose scopes are not
      * redirected until after the move occurs during [applyChanges] and [applyLateChanges]. This is
      * used to compose as if the scopes have already been changed.
      */
-    fun <R> delegateInvalidations(
-        to: ControlledComposition?,
-        groupIndex: Int,
-        block: () -> R
-    ): R
+    fun <R> delegateInvalidations(to: ControlledComposition?, groupIndex: Int, block: () -> R): R
 }
 
 /**
  * The [CoroutineContext] that should be used to perform concurrent recompositions of this
  * [ControlledComposition] when used in an environment supporting concurrent composition.
  *
- * See [Recomposer.runRecomposeConcurrentlyAndApplyChanges] as an example of configuring
- * such an environment.
+ * See [Recomposer.runRecomposeConcurrentlyAndApplyChanges] as an example of configuring such an
+ * environment.
  */
 // Implementation note: as/if this method graduates it should become a real method of
 // ControlledComposition with a default implementation.
@@ -320,58 +308,47 @@
 
 /**
  * This method is the way to initiate a composition. [parent] [CompositionContext] can be
- *  * provided to make the composition behave as a sub-composition of the parent. If composition does
- *  * not have a parent, [Recomposer] instance should be provided.
+ * * provided to make the composition behave as a sub-composition of the parent. If composition does
+ * * not have a parent, [Recomposer] instance should be provided.
  *
- * It is important to call [Composition.dispose] when composition is no longer needed in order
- * to release resources.
+ * It is important to call [Composition.dispose] when composition is no longer needed in order to
+ * release resources.
  *
  * @sample androidx.compose.runtime.samples.CustomTreeComposition
  *
  * @param applier The [Applier] instance to be used in the composition.
  * @param parent The parent [CompositionContext].
- *
  * @see Applier
  * @see Composition
  * @see Recomposer
  */
-fun Composition(
-    applier: Applier<*>,
-    parent: CompositionContext
-): Composition =
-    CompositionImpl(
-        parent,
-        applier
-    )
+fun Composition(applier: Applier<*>, parent: CompositionContext): Composition =
+    CompositionImpl(parent, applier)
 
 /**
  * This method is the way to initiate a reusable composition. [parent] [CompositionContext] can be
  * provided to make the composition behave as a sub-composition of the parent. If composition does
  * not have a parent, [Recomposer] instance should be provided.
  *
- * It is important to call [Composition.dispose] when composition is no longer needed in order
- * to release resources.
+ * It is important to call [Composition.dispose] when composition is no longer needed in order to
+ * release resources.
  *
  * @param applier The [Applier] instance to be used in the composition.
  * @param parent The parent [CompositionContext].
- *
  * @see Applier
  * @see ReusableComposition
  * @see rememberCompositionContext
  */
-fun ReusableComposition(
-    applier: Applier<*>,
-    parent: CompositionContext
-): ReusableComposition =
+fun ReusableComposition(applier: Applier<*>, parent: CompositionContext): ReusableComposition =
     CompositionImpl(parent, applier)
 
 /**
- * This method is a way to initiate a composition. Optionally, a [parent]
- * [CompositionContext] can be provided to make the composition behave as a sub-composition of
- * the parent or a [Recomposer] can be provided.
+ * This method is a way to initiate a composition. Optionally, a [parent] [CompositionContext] can
+ * be provided to make the composition behave as a sub-composition of the parent or a [Recomposer]
+ * can be provided.
  *
- * A controlled composition allows direct control of the composition instead of it being
- * controlled by the [Recomposer] passed ot the root composition.
+ * A controlled composition allows direct control of the composition instead of it being controlled
+ * by the [Recomposer] passed ot the root composition.
  *
  * It is important to call [Composition.dispose] this composer is no longer needed in order to
  * release resources.
@@ -380,38 +357,27 @@
  *
  * @param applier The [Applier] instance to be used in the composition.
  * @param parent The parent [CompositionContext].
- *
  * @see Applier
  * @see Composition
  * @see Recomposer
  */
 @TestOnly
-fun ControlledComposition(
-    applier: Applier<*>,
-    parent: CompositionContext
-): ControlledComposition =
-    CompositionImpl(
-        parent,
-        applier
-    )
+fun ControlledComposition(applier: Applier<*>, parent: CompositionContext): ControlledComposition =
+    CompositionImpl(parent, applier)
 
 /**
  * Create a [Composition] using [applier] to manage the composition, as a child of [parent].
  *
- * When used in a configuration that supports concurrent recomposition, hint to the environment
- * that [recomposeCoroutineContext] should be used to perform recomposition. Recompositions will
- * be launched into the
+ * When used in a configuration that supports concurrent recomposition, hint to the environment that
+ * [recomposeCoroutineContext] should be used to perform recomposition. Recompositions will be
+ * launched into the
  */
 @ExperimentalComposeApi
 fun Composition(
     applier: Applier<*>,
     parent: CompositionContext,
     recomposeCoroutineContext: CoroutineContext
-): Composition = CompositionImpl(
-    parent,
-    applier,
-    recomposeContext = recomposeCoroutineContext
-)
+): Composition = CompositionImpl(parent, applier, recomposeContext = recomposeCoroutineContext)
 
 @TestOnly
 @ExperimentalComposeApi
@@ -419,15 +385,12 @@
     applier: Applier<*>,
     parent: CompositionContext,
     recomposeCoroutineContext: CoroutineContext
-): ControlledComposition = CompositionImpl(
-    parent,
-    applier,
-    recomposeContext = recomposeCoroutineContext
-)
+): ControlledComposition =
+    CompositionImpl(parent, applier, recomposeContext = recomposeCoroutineContext)
 
 private val PendingApplyNoModifications = Any()
 
-internal val CompositionImplServiceKey = object : CompositionServiceKey<CompositionImpl> { }
+internal val CompositionImplServiceKey = object : CompositionServiceKey<CompositionImpl> {}
 
 /**
  * The implementation of the [Composition] interface.
@@ -435,7 +398,7 @@
  * @param parent An optional reference to the parent composition.
  * @param applier The applier to use to manage the tree built by the composer.
  * @param recomposeContext The coroutine context to use to recompose this composition. If left
- * `null` the controlling recomposer's default context is used.
+ *   `null` the controlling recomposer's default context is used.
  */
 @OptIn(ExperimentalComposeRuntimeApi::class)
 internal class CompositionImpl(
@@ -445,19 +408,15 @@
      */
     private val parent: CompositionContext,
 
-    /**
-     * The applier to use to update the tree managed by the composition.
-     */
+    /** The applier to use to update the tree managed by the composition. */
     private val applier: Applier<*>,
-
     recomposeContext: CoroutineContext? = null
 ) : ControlledComposition, ReusableComposition, RecomposeScopeOwner, CompositionServices {
     /**
-     * `null` if a composition isn't pending to apply.
-     * `Set<Any>` or `Array<Set<Any>>` if there are modifications to record
-     * [PendingApplyNoModifications] if a composition is pending to apply, no modifications.
-     * any set contents will be sent to [recordModificationsOf] after applying changes
-     * before releasing [lock]
+     * `null` if a composition isn't pending to apply. `Set<Any>` or `Array<Set<Any>>` if there are
+     * modifications to record [PendingApplyNoModifications] if a composition is pending to apply,
+     * no modifications. any set contents will be sent to [recordModificationsOf] after applying
+     * changes before releasing [lock]
      */
     private val pendingModifications = AtomicReference<Any?>(null)
 
@@ -468,20 +427,19 @@
      * A set of remember observers that were potentially abandoned between [composeContent] or
      * [recompose] and [applyChanges]. When inserting new content any newly remembered
      * [RememberObserver]s are added to this set and then removed as [RememberObserver.onRemembered]
-     * is dispatched. If any are left in this when exiting [applyChanges] they have been
-     * abandoned and are sent an [RememberObserver.onAbandoned] notification.
+     * is dispatched. If any are left in this when exiting [applyChanges] they have been abandoned
+     * and are sent an [RememberObserver.onAbandoned] notification.
      */
     @Suppress("AsCollectionCall") // Requires iterator API when dispatching abandons
     private val abandonSet = MutableScatterSet<RememberObserver>().asMutableSet()
 
-    /**
-     * The slot table is used to store the composition information required for recomposition.
-     */
+    /** The slot table is used to store the composition information required for recomposition. */
     @Suppress("MemberVisibilityCanBePrivate") // published as internal
-    internal val slotTable = SlotTable().also {
-        if (parent.collectingCallByInformation) it.collectCalledByInformation()
-        if (parent.collectingSourceInformation) it.collectSourceInformation()
-    }
+    internal val slotTable =
+        SlotTable().also {
+            if (parent.collectingCallByInformation) it.collectCalledByInformation()
+            if (parent.collectingSourceInformation) it.collectSourceInformation()
+        }
 
     /**
      * A map of observable objects to the [RecomposeScope]s that observe the object. If the key
@@ -489,15 +447,13 @@
      */
     private val observations = ScopeMap<Any, RecomposeScopeImpl>()
 
-    /**
-     * Used for testing. Returns the objects that are observed
-     */
+    /** Used for testing. Returns the objects that are observed */
     internal val observedObjects
         @TestOnly @Suppress("AsCollectionCall") get() = observations.map.asMap().keys
 
     /**
-     * A set of scopes that were invalidated by a call from [recordModificationsOf].
-     * This set is only used in [addPendingInvalidationsLocked], and is reused between invocations.
+     * A set of scopes that were invalidated by a call from [recordModificationsOf]. This set is
+     * only used in [addPendingInvalidationsLocked], and is reused between invocations.
      */
     private val invalidatedScopes = MutableScatterSet<RecomposeScopeImpl>()
 
@@ -509,35 +465,30 @@
      */
     private val conditionallyInvalidatedScopes = MutableScatterSet<RecomposeScopeImpl>()
 
-    /**
-     * A map of object read during derived states to the corresponding derived state.
-     */
+    /** A map of object read during derived states to the corresponding derived state. */
     private val derivedStates = ScopeMap<Any, DerivedState<*>>()
 
-    /**
-     * Used for testing. Returns dependencies of derived states that are currently observed.
-     */
+    /** Used for testing. Returns dependencies of derived states that are currently observed. */
     internal val derivedStateDependencies
         @TestOnly @Suppress("AsCollectionCall") get() = derivedStates.map.asMap().keys
 
-    /**
-     * Used for testing. Returns the conditional scopes being tracked by the composer
-     */
+    /** Used for testing. Returns the conditional scopes being tracked by the composer */
     internal val conditionalScopes: List<RecomposeScopeImpl>
-        @TestOnly @Suppress("AsCollectionCall")
+        @TestOnly
+        @Suppress("AsCollectionCall")
         get() = conditionallyInvalidatedScopes.asSet().toList()
 
     /**
-     * A list of changes calculated by [Composer] to be applied to the [Applier] and the
-     * [SlotTable] to reflect the result of composition. This is a list of lambdas that need to
-     * be invoked in order to produce the desired effects.
+     * A list of changes calculated by [Composer] to be applied to the [Applier] and the [SlotTable]
+     * to reflect the result of composition. This is a list of lambdas that need to be invoked in
+     * order to produce the desired effects.
      */
     private val changes = ChangeList()
 
     /**
      * A list of changes calculated by [Composer] to be applied after all other compositions have
-     * had [applyChanges] called. These changes move [MovableContent] state from one composition
-     * to another and must be applied after [applyChanges] because [applyChanges] copies and removes
+     * had [applyChanges] called. These changes move [MovableContent] state from one composition to
+     * another and must be applied after [applyChanges] because [applyChanges] copies and removes
      * the state out of the previous composition so it can be inserted into the new location. As
      * inserts might be earlier in the composition than the position it is deleted, this move must
      * be done in two phases.
@@ -547,18 +498,18 @@
     /**
      * When an observable object is modified during composition any recompose scopes that are
      * observing that object are invalidated immediately. Since they have already been processed
-     * there is no need to process them again, so this set maintains a set of the recompose
-     * scopes that were already dismissed by composition and should be ignored in the next call
-     * to [recordModificationsOf].
+     * there is no need to process them again, so this set maintains a set of the recompose scopes
+     * that were already dismissed by composition and should be ignored in the next call to
+     * [recordModificationsOf].
      */
     private val observationsProcessed = ScopeMap<Any, RecomposeScopeImpl>()
 
     /**
-     * A map of the invalid [RecomposeScope]s. If this map is non-empty the current state of
-     * the composition does not reflect the current state of the objects it observes and should
-     * be recomposed by calling [recompose]. Tbe value is a map of values that invalidated the
-     * scope. The scope is checked with these instances to ensure the value has changed. This is
-     * used to only invalidate the scope if a [derivedStateOf] object changes.
+     * A map of the invalid [RecomposeScope]s. If this map is non-empty the current state of the
+     * composition does not reflect the current state of the objects it observes and should be
+     * recomposed by calling [recompose]. Tbe value is a map of values that invalidated the scope.
+     * The scope is checked with these instances to ensure the value has changed. This is used to
+     * only invalidate the scope if a [derivedStateOf] object changes.
      */
     private var invalidations = ScopeMap<RecomposeScopeImpl, Any>()
 
@@ -577,58 +528,47 @@
 
     internal val observerHolder = CompositionObserverHolder()
 
-    /**
-     * The [Composer] to use to create and update the tree managed by this composition.
-     */
+    /** The [Composer] to use to create and update the tree managed by this composition. */
     private val composer: ComposerImpl =
         ComposerImpl(
-            applier = applier,
-            parentContext = parent,
-            slotTable = slotTable,
-            abandonSet = abandonSet,
-            changes = changes,
-            lateChanges = lateChanges,
-            composition = this
-        ).also {
-            parent.registerComposer(it)
-        }
+                applier = applier,
+                parentContext = parent,
+                slotTable = slotTable,
+                abandonSet = abandonSet,
+                changes = changes,
+                lateChanges = lateChanges,
+                composition = this
+            )
+            .also { parent.registerComposer(it) }
 
-    /**
-     * The [CoroutineContext] override, if there is one, for this composition.
-     */
+    /** The [CoroutineContext] override, if there is one, for this composition. */
     private val _recomposeContext: CoroutineContext? = recomposeContext
 
-    /**
-     * the [CoroutineContext] to use to [recompose] this composition.
-     */
+    /** the [CoroutineContext] to use to [recompose] this composition. */
     val recomposeContext: CoroutineContext
         get() = _recomposeContext ?: parent.recomposeCoroutineContext
 
-    /**
-     * Return true if this is a root (non-sub-) composition.
-     */
+    /** Return true if this is a root (non-sub-) composition. */
     val isRoot: Boolean = parent is Recomposer
 
-    /**
-     * True if [dispose] has been called.
-     */
+    /** True if [dispose] has been called. */
     private var disposed = false
 
-    /**
-     * True if a sub-composition of this composition is current composing.
-     */
-    private val areChildrenComposing get() = composer.areChildrenComposing
+    /** True if a sub-composition of this composition is current composing. */
+    private val areChildrenComposing
+        get() = composer.areChildrenComposing
 
     /**
-     * The [Composable] function used to define the tree managed by this composition. This is set
-     * by [setContent].
+     * The [Composable] function used to define the tree managed by this composition. This is set by
+     * [setContent].
      */
     var composable: @Composable () -> Unit = {}
 
     override val isComposing: Boolean
         get() = composer.isComposing
 
-    override val isDisposed: Boolean get() = disposed
+    override val isDisposed: Boolean
+        get() = disposed
 
     override val hasPendingChanges: Boolean
         get() = synchronized(lock) { composer.hasPendingChanges }
@@ -670,16 +610,16 @@
     }
 
     fun invalidateGroupsWithKey(key: Int) {
-        val scopesToInvalidate = synchronized(lock) {
-            slotTable.invalidateGroupsWithKey(key)
-        }
+        val scopesToInvalidate = synchronized(lock) { slotTable.invalidateGroupsWithKey(key) }
         // Calls to invalidate must be performed without the lock as the they may cause the
         // recomposer to take its lock to respond to the invalidation and that takes the locks
         // in the opposite order of composition so if composition begins in another thread taking
         // the recomposer lock with the composer lock held will deadlock.
-        val forceComposition = scopesToInvalidate == null || scopesToInvalidate.fastAny {
-            it.invalidateForResult(null) == InvalidationResult.IGNORED
-        }
+        val forceComposition =
+            scopesToInvalidate == null ||
+                scopesToInvalidate.fastAny {
+                    it.invalidateForResult(null) == InvalidationResult.IGNORED
+                }
         if (forceComposition && composer.forceRecomposeScopes()) {
             parent.invalidate(this)
         }
@@ -699,9 +639,10 @@
             is Set<*> -> {
                 addPendingInvalidationsLocked(toRecord as Set<Any>, forgetConditionalScopes = true)
             }
-            is Array<*> -> for (changed in toRecord as Array<Set<Any>>) {
-                addPendingInvalidationsLocked(changed, forgetConditionalScopes = true)
-            }
+            is Array<*> ->
+                for (changed in toRecord as Array<Set<Any>>) {
+                    addPendingInvalidationsLocked(changed, forgetConditionalScopes = true)
+                }
             else -> composeRuntimeError("corrupt pendingModifications drain: $pendingModifications")
         }
     }
@@ -715,15 +656,15 @@
             is Set<*> -> {
                 addPendingInvalidationsLocked(toRecord as Set<Any>, forgetConditionalScopes = false)
             }
-            is Array<*> -> for (changed in toRecord as Array<Set<Any>>) {
-                addPendingInvalidationsLocked(changed, forgetConditionalScopes = false)
-            }
-            null -> composeRuntimeError(
-                "calling recordModificationsOf and applyChanges concurrently is not supported"
-            )
-            else -> composeRuntimeError(
-                "corrupt pendingModifications drain: $pendingModifications"
-            )
+            is Array<*> ->
+                for (changed in toRecord as Array<Set<Any>>) {
+                    addPendingInvalidationsLocked(changed, forgetConditionalScopes = false)
+                }
+            null ->
+                composeRuntimeError(
+                    "calling recordModificationsOf and applyChanges concurrently is not supported"
+                )
+            else -> composeRuntimeError("corrupt pendingModifications drain: $pendingModifications")
         }
     }
 
@@ -790,9 +731,7 @@
                     val manager = RememberEventDispatcher(abandonSet)
                     if (nonEmptySlotTable) {
                         applier.onBeginChanges()
-                        slotTable.write { writer ->
-                            writer.removeCurrentGroup(manager)
-                        }
+                        slotTable.write { writer -> writer.removeCurrentGroup(manager) }
                         applier.clear()
                         applier.onEndChanges()
                         manager.dispatchRememberObservers()
@@ -805,30 +744,31 @@
         parent.unregisterComposition(this)
     }
 
-    override val hasInvalidations get() = synchronized(lock) { invalidations.size > 0 }
+    override val hasInvalidations
+        get() = synchronized(lock) { invalidations.size > 0 }
 
     /**
      * To bootstrap multithreading handling, recording modifications is now deferred between
      * recomposition with changes to apply and the application of those changes.
-     * [pendingModifications] will contain a queue of changes to apply once all current changes
-     * have been successfully processed. Draining this queue is the responsibility of [recompose]
-     * if it would return `false` (changes do not need to be applied) or [applyChanges].
+     * [pendingModifications] will contain a queue of changes to apply once all current changes have
+     * been successfully processed. Draining this queue is the responsibility of [recompose] if it
+     * would return `false` (changes do not need to be applied) or [applyChanges].
      */
     @Suppress("UNCHECKED_CAST")
     override fun recordModificationsOf(values: Set<Any>) {
         while (true) {
             val old = pendingModifications.get()
-            val new: Any = when (old) {
-                null, PendingApplyNoModifications -> values
-                is Set<*> -> arrayOf(old, values)
-                is Array<*> -> (old as Array<Set<Any>>) + values
-                else -> error("corrupt pendingModifications: $pendingModifications")
-            }
+            val new: Any =
+                when (old) {
+                    null,
+                    PendingApplyNoModifications -> values
+                    is Set<*> -> arrayOf(old, values)
+                    is Array<*> -> (old as Array<Set<Any>>) + values
+                    else -> error("corrupt pendingModifications: $pendingModifications")
+                }
             if (pendingModifications.compareAndSet(old, new)) {
                 if (old == null) {
-                    synchronized(lock) {
-                        drainPendingModificationsLocked()
-                    }
+                    synchronized(lock) { drainPendingModificationsLocked() }
                 }
                 break
             }
@@ -844,14 +784,11 @@
 
     override fun prepareCompose(block: () -> Unit) = composer.prepareCompose(block)
 
-    private fun addPendingInvalidationsLocked(
-        value: Any,
-        forgetConditionalScopes: Boolean
-    ) {
+    private fun addPendingInvalidationsLocked(value: Any, forgetConditionalScopes: Boolean) {
         observations.forEachScopeOf(value) { scope ->
             if (
                 !observationsProcessed.remove(value, scope) &&
-                scope.invalidateForResult(value) != InvalidationResult.IGNORED
+                    scope.invalidateForResult(value) != InvalidationResult.IGNORED
             ) {
                 if (scope.isConditional && !forgetConditionalScopes) {
                     conditionallyInvalidatedScopes.add(scope)
@@ -936,50 +873,46 @@
         }
     }
 
-    override fun recordWriteOf(value: Any) = synchronized(lock) {
-        invalidateScopeOfLocked(value)
+    override fun recordWriteOf(value: Any) =
+        synchronized(lock) {
+            invalidateScopeOfLocked(value)
 
-        // If writing to dependency of a derived value and the value is changed, invalidate the
-        // scopes that read the derived value.
-        derivedStates.forEachScopeOf(value) {
-            invalidateScopeOfLocked(it)
+            // If writing to dependency of a derived value and the value is changed, invalidate the
+            // scopes that read the derived value.
+            derivedStates.forEachScopeOf(value) { invalidateScopeOfLocked(it) }
         }
-    }
 
-    override fun recompose(): Boolean = synchronized(lock) {
-        drainPendingModificationsForCompositionLocked()
-        guardChanges {
-            guardInvalidationsLocked { invalidations ->
-                val observer = observer()
-                @Suppress("UNCHECKED_CAST")
-                observer?.onBeginComposition(
-                    this,
-                    invalidations.asMap() as Map<RecomposeScope, Set<Any>?>
-                )
-                composer.recompose(invalidations).also { shouldDrain ->
-                    // Apply would normally do this for us; do it now if apply shouldn't happen.
-                    if (!shouldDrain) drainPendingModificationsLocked()
-                    observer?.onEndComposition(this)
+    override fun recompose(): Boolean =
+        synchronized(lock) {
+            drainPendingModificationsForCompositionLocked()
+            guardChanges {
+                guardInvalidationsLocked { invalidations ->
+                    val observer = observer()
+                    @Suppress("UNCHECKED_CAST")
+                    observer?.onBeginComposition(
+                        this,
+                        invalidations.asMap() as Map<RecomposeScope, Set<Any>?>
+                    )
+                    composer.recompose(invalidations).also { shouldDrain ->
+                        // Apply would normally do this for us; do it now if apply shouldn't happen.
+                        if (!shouldDrain) drainPendingModificationsLocked()
+                        observer?.onEndComposition(this)
+                    }
                 }
             }
         }
-    }
 
     override fun insertMovableContent(
         references: List<Pair<MovableContentStateReference, MovableContentStateReference?>>
     ) {
         runtimeCheck(references.fastAll { it.first.composition == this })
-        guardChanges {
-            composer.insertMovableContentReferences(references)
-        }
+        guardChanges { composer.insertMovableContentReferences(references) }
     }
 
     override fun disposeUnusedMovableContent(state: MovableContentState) {
         val manager = RememberEventDispatcher(abandonSet)
         val slotTable = state.slotTable
-        slotTable.write { writer ->
-            writer.removeCurrentGroup(manager)
-        }
+        slotTable.write { writer -> writer.removeCurrentGroup(manager) }
         manager.dispatchRememberObservers()
     }
 
@@ -1013,8 +946,7 @@
         } finally {
             // Only dispatch abandons if we do not have any late changes. The instances in the
             // abandon set can be remembered in the late changes.
-            if (this.lateChanges.isEmpty())
-                manager.dispatchAbandons()
+            if (this.lateChanges.isEmpty()) manager.dispatchAbandons()
         }
     }
 
@@ -1042,7 +974,8 @@
             guardChanges {
                 composer.changesApplied()
 
-                // By this time all abandon objects should be notified that they have been abandoned.
+                // By this time all abandon objects should be notified that they have been
+                // abandoned.
                 if (this.abandonSet.isNotEmpty()) {
                     RememberEventDispatcher(abandonSet).dispatchAbandons()
                 }
@@ -1081,9 +1014,7 @@
     }
 
     override fun invalidateAll() {
-        synchronized(lock) {
-            slotTable.slots.forEach { (it as? RecomposeScopeImpl)?.invalidate() }
-        }
+        synchronized(lock) { slotTable.slots.forEach { (it as? RecomposeScopeImpl)?.invalidate() } }
     }
 
     override fun verifyConsistent() {
@@ -1105,7 +1036,7 @@
             invalidationDelegate = to as CompositionImpl
             invalidationDelegateGroup = groupIndex
             try {
-               block()
+                block()
             } finally {
                 invalidationDelegate = null
                 invalidationDelegateGroup = 0
@@ -1149,42 +1080,50 @@
         anchor: Anchor,
         instance: Any?
     ): InvalidationResult {
-        val delegate = synchronized(lock) {
-            val delegate = invalidationDelegate?.let { changeDelegate ->
-                // Invalidations are delegated when recomposing changes to movable content that
-                // is destined to be moved. The movable content is composed in the destination
-                // composer but all the recompose scopes point the current composer and will arrive
-                // here. this redirects the invalidations that will be moved to the destination
-                // composer instead of recording an invalid invalidation in the from composer.
-                if (slotTable.groupContainsAnchor(invalidationDelegateGroup, anchor)) {
-                    changeDelegate
-                } else null
-            }
-            if (delegate == null) {
-                if (tryImminentInvalidation(scope, instance)) {
-                    // The invalidation was redirected to the composer.
-                    return InvalidationResult.IMMINENT
-                }
+        val delegate =
+            synchronized(lock) {
+                val delegate =
+                    invalidationDelegate?.let { changeDelegate ->
+                        // Invalidations are delegated when recomposing changes to movable content
+                        // that
+                        // is destined to be moved. The movable content is composed in the
+                        // destination
+                        // composer but all the recompose scopes point the current composer and will
+                        // arrive
+                        // here. this redirects the invalidations that will be moved to the
+                        // destination
+                        // composer instead of recording an invalid invalidation in the from
+                        // composer.
+                        if (slotTable.groupContainsAnchor(invalidationDelegateGroup, anchor)) {
+                            changeDelegate
+                        } else null
+                    }
+                if (delegate == null) {
+                    if (tryImminentInvalidation(scope, instance)) {
+                        // The invalidation was redirected to the composer.
+                        return InvalidationResult.IMMINENT
+                    }
 
-                // Observer requires a map of scope -> states, so we have to fill it if observer
-                // is set.
-                val observer = observer()
-                if (instance == null) {
-                    // invalidations[scope] containing ScopeInvalidated means it was invalidated
-                    // unconditionally.
-                    invalidations.set(scope, ScopeInvalidated)
-                } else if (observer == null && instance !is DerivedState<*>) {
-                    // If observer is not set, we only need to add derived states to invalidation,
-                    // as regular states are always going to invalidate.
-                    invalidations.set(scope, ScopeInvalidated)
-                } else {
-                    if (!invalidations.anyScopeOf(scope) { it === ScopeInvalidated }) {
-                        invalidations.add(scope, instance)
+                    // Observer requires a map of scope -> states, so we have to fill it if observer
+                    // is set.
+                    val observer = observer()
+                    if (instance == null) {
+                        // invalidations[scope] containing ScopeInvalidated means it was invalidated
+                        // unconditionally.
+                        invalidations.set(scope, ScopeInvalidated)
+                    } else if (observer == null && instance !is DerivedState<*>) {
+                        // If observer is not set, we only need to add derived states to
+                        // invalidation,
+                        // as regular states are always going to invalidate.
+                        invalidations.set(scope, ScopeInvalidated)
+                    } else {
+                        if (!invalidations.anyScopeOf(scope) { it === ScopeInvalidated }) {
+                            invalidations.add(scope, instance)
+                        }
                     }
                 }
+                delegate
             }
-            delegate
-        }
 
         // We call through the delegate here to ensure we don't nest synchronization scopes.
         if (delegate != null) {
@@ -1206,8 +1145,8 @@
     }
 
     /**
-     * This takes ownership of the current invalidations and sets up a new array map to hold the
-     * new invalidations.
+     * This takes ownership of the current invalidations and sets up a new array map to hold the new
+     * invalidations.
      */
     private fun takeInvalidations(): ScopeMap<RecomposeScopeImpl, Any> {
         val invalidations = invalidations
@@ -1235,9 +1174,7 @@
     private inline fun <T> trackAbandonedValues(block: () -> T): T {
         var success = false
         return try {
-            block().also {
-                success = true
-            }
+            block().also { success = true }
         } finally {
             if (!success && abandonSet.isNotEmpty()) {
                 RememberEventDispatcher(abandonSet).dispatchAbandons()
@@ -1268,9 +1205,7 @@
                     val manager = RememberEventDispatcher(abandonSet)
                     if (nonEmptySlotTable) {
                         applier.onBeginChanges()
-                        slotTable.write { writer ->
-                            writer.deactivateCurrentGroup(manager)
-                        }
+                        slotTable.write { writer -> writer.deactivateCurrentGroup(manager) }
                         applier.onEndChanges()
                         manager.dispatchRememberObservers()
                     }
@@ -1289,12 +1224,9 @@
     // This is only used in tests to ensure the stacks do not silently leak.
     internal fun composerStacksSizes(): Int = composer.stacksSize()
 
-    /**
-     * Helper for collecting remember observers for later strictly ordered dispatch.
-     */
-    private class RememberEventDispatcher(
-        private val abandoning: MutableSet<RememberObserver>
-    ) : RememberManager {
+    /** Helper for collecting remember observers for later strictly ordered dispatch. */
+    private class RememberEventDispatcher(private val abandoning: MutableSet<RememberObserver>) :
+        RememberManager {
         private val remembering = mutableListOf<RememberObserver>()
         private val leaving = mutableListOf<Any>()
         private val sideEffects = mutableListOf<() -> Unit>()
@@ -1302,6 +1234,7 @@
         private val pending = mutableListOf<Any>()
         private val priorities = MutableIntList()
         private val afters = MutableIntList()
+
         override fun remembering(instance: RememberObserver) {
             remembering.add(instance)
         }
@@ -1334,8 +1267,9 @@
             priority: Int,
             endRelativeAfter: Int
         ) {
-            val releasing = releasing
-                ?: mutableScatterSetOf<ComposeNodeLifecycleCallback>().also { releasing = it }
+            val releasing =
+                releasing
+                    ?: mutableScatterSetOf<ComposeNodeLifecycleCallback>().also { releasing = it }
 
             releasing += instance
             recordLeaving(instance, endRelativeOrder, priority, endRelativeAfter)
@@ -1381,9 +1315,7 @@
         fun dispatchSideEffects() {
             if (sideEffects.isNotEmpty()) {
                 trace("Compose:sideeffects") {
-                    sideEffects.fastForEach { sideEffect ->
-                        sideEffect()
-                    }
+                    sideEffects.fastForEach { sideEffect -> sideEffect() }
                     sideEffects.clear()
                 }
             }
@@ -1478,7 +1410,7 @@
                             val jAfter = toAddAfter[j]
                             if (
                                 iAfter < jAfter ||
-                                (jAfter == iAfter && toAddPriority[i] < toAddPriority[j])
+                                    (jAfter == iAfter && toAddPriority[i] < toAddPriority[j])
                             ) {
                                 toAdd.swap(i, j)
                                 toAddPriority.swap(i, j)
diff --git a/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/CompositionContext.kt b/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/CompositionContext.kt
index 7ebdbbe..561890c 100644
--- a/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/CompositionContext.kt
+++ b/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/CompositionContext.kt
@@ -25,8 +25,8 @@
 
 /**
  * A [CompositionContext] is an opaque type that is used to logically "link" two compositions
- * together. The [CompositionContext] instance represents a reference to the "parent" composition
- * in a specific position of that composition's tree, and the instance can then be given to a new
+ * together. The [CompositionContext] instance represents a reference to the "parent" composition in
+ * a specific position of that composition's tree, and the instance can then be given to a new
  * "child" composition. This reference ensures that invalidations and [CompositionLocal]s flow
  * logically through the two compositions as if they were not separate.
  *
@@ -40,32 +40,41 @@
     internal abstract val collectingParameterInformation: Boolean
     internal abstract val collectingSourceInformation: Boolean
     internal abstract val collectingCallByInformation: Boolean
-    internal open val observerHolder: CompositionObserverHolder? get() = null
+    internal open val observerHolder: CompositionObserverHolder?
+        get() = null
 
-    /**
-     *  The [CoroutineContext] with which effects for the composition will be executed in.
-     */
+    /** The [CoroutineContext] with which effects for the composition will be executed in. */
     abstract val effectCoroutineContext: CoroutineContext
     internal abstract val recomposeCoroutineContext: CoroutineContext
+
     internal abstract fun composeInitial(
         composition: ControlledComposition,
         content: @Composable () -> Unit
     )
+
     internal abstract fun invalidate(composition: ControlledComposition)
+
     internal abstract fun invalidateScope(scope: RecomposeScopeImpl)
 
     internal open fun recordInspectionTable(table: MutableSet<CompositionData>) {}
-    internal open fun registerComposer(composer: Composer) { }
-    internal open fun unregisterComposer(composer: Composer) { }
+
+    internal open fun registerComposer(composer: Composer) {}
+
+    internal open fun unregisterComposer(composer: Composer) {}
+
     internal abstract fun registerComposition(composition: ControlledComposition)
+
     internal abstract fun unregisterComposition(composition: ControlledComposition)
 
     internal open fun getCompositionLocalScope(): PersistentCompositionLocalMap =
         EmptyPersistentCompositionLocalMap
+
     internal open fun startComposing() {}
+
     internal open fun doneComposing() {}
 
     internal abstract fun insertMovableContent(reference: MovableContentStateReference)
+
     internal abstract fun deletedMovableContent(reference: MovableContentStateReference)
 
     internal abstract fun movableContentStateReleased(
diff --git a/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/CompositionLocal.kt b/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/CompositionLocal.kt
index 0efe678..35661b2 100644
--- a/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/CompositionLocal.kt
+++ b/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/CompositionLocal.kt
@@ -18,8 +18,8 @@
 
 /**
  * Compose passes data through the composition tree explicitly through means of parameters to
- * composable functions. This is often times the simplest and best way to have data flow through
- * the tree.
+ * composable functions. This is often times the simplest and best way to have data flow through the
+ * tree.
  *
  * Sometimes this model can be cumbersome or break down for data that is needed by lots of
  * components, or when components need to pass data between one another but keep that implementation
@@ -33,14 +33,14 @@
  * statically. [CompositionLocal] instances themselves hold no data, and can be thought of as a
  * type-safe identifier for the data being passed down a tree. [CompositionLocal] factory functions
  * take a single parameter: a factory to create a default value in cases where a [CompositionLocal]
- * is used without a Provider. If this is a situation you would rather not handle, you can throw
- * an error in this factory.
+ * is used without a Provider. If this is a situation you would rather not handle, you can throw an
+ * error in this factory.
  *
  * @sample androidx.compose.runtime.samples.createCompositionLocal
  *
- * Somewhere up the tree, a [CompositionLocalProvider] component can be used, which provides a
- * value for the [CompositionLocal]. This would often be at the "root" of a tree, but could be
- * anywhere, and can also be used in multiple places to override the provided value for a sub-tree.
+ * Somewhere up the tree, a [CompositionLocalProvider] component can be used, which provides a value
+ * for the [CompositionLocal]. This would often be at the "root" of a tree, but could be anywhere,
+ * and can also be used in multiple places to override the provided value for a sub-tree.
  *
  * @sample androidx.compose.runtime.samples.compositionLocalProvider
  *
@@ -50,8 +50,8 @@
  * @sample androidx.compose.runtime.samples.someScreenSample
  *
  * Finally, a component that wishes to consume the [CompositionLocal] value can use the [current]
- * property of the [CompositionLocal] key which returns the current value of the
- * [CompositionLocal], and subscribes the component to changes of it.
+ * property of the [CompositionLocal] key which returns the current value of the [CompositionLocal],
+ * and subscribes the component to changes of it.
  *
  * @sample androidx.compose.runtime.samples.consumeCompositionLocal
  */
@@ -65,16 +65,14 @@
     ): ValueHolder<T>
 
     /**
-     * Return the value provided by the nearest [CompositionLocalProvider] component that invokes, directly or
-     * indirectly, the composable function that uses this property.
+     * Return the value provided by the nearest [CompositionLocalProvider] component that invokes,
+     * directly or indirectly, the composable function that uses this property.
      *
      * @sample androidx.compose.runtime.samples.consumeCompositionLocal
      */
     @OptIn(InternalComposeApi::class)
     inline val current: T
-        @ReadOnlyComposable
-        @Composable
-        get() = currentComposer.consume(this)
+        @ReadOnlyComposable @Composable get() = currentComposer.consume(this)
 }
 
 /**
@@ -87,7 +85,7 @@
  */
 @Stable
 abstract class ProvidableCompositionLocal<T> internal constructor(defaultFactory: () -> T) :
-    CompositionLocal<T> (defaultFactory) {
+    CompositionLocal<T>(defaultFactory) {
     internal abstract fun defaultProvidedValue(value: T): ProvidedValue<T>
 
     /**
@@ -109,9 +107,9 @@
 
     /**
      * Associates a [CompositionLocal] key to a lambda, [compute], in a call to [CompositionLocal].
-     * The [compute] lambda is invoked whenever the key is retrieved. The lambda is executed in
-     * the context of a [CompositionLocalContext] which allow retrieving the current values of
-     * other composition locals by calling [CompositionLocalAccessorScope.currentValue], which is an
+     * The [compute] lambda is invoked whenever the key is retrieved. The lambda is executed in the
+     * context of a [CompositionLocalContext] which allow retrieving the current values of other
+     * composition locals by calling [CompositionLocalAccessorScope.currentValue], which is an
      * extension function provided by the context for a [CompositionLocal] key.
      *
      * The lambda passed to [providesComputed] will be invoked every time the
@@ -123,6 +121,7 @@
      * would automatically update all the accent colors.
      *
      * @sample androidx.compose.runtime.samples.compositionLocalProvidedComputed
+     *
      * @sample androidx.compose.runtime.samples.compositionLocalComputedAfterProvidingLocal
      *
      * @see CompositionLocal
@@ -151,13 +150,8 @@
                     previous
                 } else null
             is StaticValueHolder ->
-                if (value.isStatic && value.effectiveValue == previous.value)
-                    previous
-                else null
-            is ComputedValueHolder ->
-                if (value.compute === previous.compute)
-                    previous
-                else null
+                if (value.isStatic && value.effectiveValue == previous.value) previous else null
+            is ComputedValueHolder -> if (value.compute === previous.compute) previous else null
             else -> null
         } ?: valueHolderOf(value)
     }
@@ -167,8 +161,9 @@
             value.isDynamic ->
                 DynamicValueHolder(
                     value.state
-                        ?: mutableStateOf(value.value, value.mutationPolicy
-                            ?: structuralEqualityPolicy()
+                        ?: mutableStateOf(
+                            value.value,
+                            value.mutationPolicy ?: structuralEqualityPolicy()
                         )
                 )
             value.compute != null -> ComputedValueHolder(value.compute)
@@ -224,29 +219,27 @@
 }
 
 /**
- * Create a [CompositionLocal] key that can be provided using [CompositionLocalProvider].
- * Changing the value provided during recomposition will invalidate the content of
- * [CompositionLocalProvider] that read the value using [CompositionLocal.current].
+ * Create a [CompositionLocal] key that can be provided using [CompositionLocalProvider]. Changing
+ * the value provided during recomposition will invalidate the content of [CompositionLocalProvider]
+ * that read the value using [CompositionLocal.current].
  *
  * [compositionLocalOf] creates a [ProvidableCompositionLocal] which can be used in a a call to
- * [CompositionLocalProvider]. Similar to [MutableList] vs. [List], if the key is made public
- * as [CompositionLocal] instead of [ProvidableCompositionLocal], it can be read using
+ * [CompositionLocalProvider]. Similar to [MutableList] vs. [List], if the key is made public as
+ * [CompositionLocal] instead of [ProvidableCompositionLocal], it can be read using
  * [CompositionLocal.current] but not re-provided.
  *
  * @param policy a policy to determine when a [CompositionLocal] is considered changed. See
- * [SnapshotMutationPolicy] for details.
+ *   [SnapshotMutationPolicy] for details.
  * @param defaultFactory a value factory to supply a value when a value is not provided. This
- * factory is called when no value is provided through a [CompositionLocalProvider] of the caller
- * of the component using [CompositionLocal.current]. If no reasonable default can be provided then
- * consider throwing an exception.
- *
+ *   factory is called when no value is provided through a [CompositionLocalProvider] of the caller
+ *   of the component using [CompositionLocal.current]. If no reasonable default can be provided
+ *   then consider throwing an exception.
  * @see CompositionLocal
  * @see staticCompositionLocalOf
  * @see mutableStateOf
  */
 fun <T> compositionLocalOf(
-    policy: SnapshotMutationPolicy<T> =
-        structuralEqualityPolicy(),
+    policy: SnapshotMutationPolicy<T> = structuralEqualityPolicy(),
     defaultFactory: () -> T
 ): ProvidableCompositionLocal<T> = DynamicProvidableCompositionLocal(policy, defaultFactory)
 
@@ -257,22 +250,21 @@
  * composer and changing the value provided in the [CompositionLocalProvider] call will cause the
  * entirety of the content to be recomposed instead of just the places where in the composition the
  * local value is used. This lack of tracking, however, makes a [staticCompositionLocalOf] more
- * efficient when the value provided is highly unlikely to or will never change. For example,
- * the android context, font loaders, or similar shared values, are unlikely to change for the
+ * efficient when the value provided is highly unlikely to or will never change. For example, the
+ * android context, font loaders, or similar shared values, are unlikely to change for the
  * components in the content of a the [CompositionLocalProvider] and should consider using a
- * [staticCompositionLocalOf]. A color, or other theme like value, might change or even be
- * animated therefore a [compositionLocalOf] should be used.
+ * [staticCompositionLocalOf]. A color, or other theme like value, might change or even be animated
+ * therefore a [compositionLocalOf] should be used.
  *
- * [staticCompositionLocalOf] creates a [ProvidableCompositionLocal] which can be used in a a
- * call to [CompositionLocalProvider]. Similar to [MutableList] vs. [List], if the key is made
- * public as [CompositionLocal] instead of [ProvidableCompositionLocal], it can be read using
+ * [staticCompositionLocalOf] creates a [ProvidableCompositionLocal] which can be used in a a call
+ * to [CompositionLocalProvider]. Similar to [MutableList] vs. [List], if the key is made public as
+ * [CompositionLocal] instead of [ProvidableCompositionLocal], it can be read using
  * [CompositionLocal.current] but not re-provided.
  *
  * @param defaultFactory a value factory to supply a value when a value is not provided. This
- * factory is called when no value is provided through a [CompositionLocalProvider] of the caller
- * of the component using [CompositionLocal.current]. If no reasonable default can be provided then
- * consider throwing an exception.
- *
+ *   factory is called when no value is provided through a [CompositionLocalProvider] of the caller
+ *   of the component using [CompositionLocal.current]. If no reasonable default can be provided
+ *   then consider throwing an exception.
  * @see CompositionLocal
  * @see compositionLocalOf
  */
@@ -282,35 +274,34 @@
 /**
  * Create a [CompositionLocal] that behaves like it was provided using
  * [ProvidableCompositionLocal.providesComputed] by default. If a value is provided using
- * [ProvidableCompositionLocal.provides] it behaves as if the [CompositionLocal] was produced
- * by calling [compositionLocalOf].
+ * [ProvidableCompositionLocal.provides] it behaves as if the [CompositionLocal] was produced by
+ * calling [compositionLocalOf].
  *
  * In other words, a [CompositionLocal] produced by can be provided identically to
- * [CompositionLocal] created with  [compositionLocalOf] with the only difference is how it behaves
+ * [CompositionLocal] created with [compositionLocalOf] with the only difference is how it behaves
  * when the value is not provided. For a [compositionLocalOf] the default value is returned. If no
  * default value has be computed for [CompositionLocal] the default computation is called.
  *
  * The lambda passed to [compositionLocalWithComputedDefaultOf] will be invoked every time the
- * [CompositionLocal.current] is evaluated for the composition local and computes its value based
- * on the current value of the locals referenced in the lambda at the time
- * [CompositionLocal.current] is evaluated. This allows providing values that can be derived from
- * other locals. For example, if accent colors can be calculated from a single base color, the
- * accent colors can be provided as computed composition locals. Providing a new base color would
- * automatically update all the accent colors.
+ * [CompositionLocal.current] is evaluated for the composition local and computes its value based on
+ * the current value of the locals referenced in the lambda at the time [CompositionLocal.current]
+ * is evaluated. This allows providing values that can be derived from other locals. For example, if
+ * accent colors can be calculated from a single base color, the accent colors can be provided as
+ * computed composition locals. Providing a new base color would automatically update all the accent
+ * colors.
  *
  * @sample androidx.compose.runtime.samples.compositionLocalComputedByDefault
+ *
  * @sample androidx.compose.runtime.samples.compositionLocalComputedAfterProvidingLocal
  *
  * @param defaultComputation the default computation to use when this [CompositionLocal] is not
- * provided.
- *
+ *   provided.
  * @see CompositionLocal
  * @see ProvidableCompositionLocal
  */
 fun <T> compositionLocalWithComputedDefaultOf(
     defaultComputation: CompositionLocalAccessorScope.() -> T
-): ProvidableCompositionLocal<T> =
-    ComputedProvidableCompositionLocal(defaultComputation)
+): ProvidableCompositionLocal<T> = ComputedProvidableCompositionLocal(defaultComputation)
 
 internal class ComputedProvidableCompositionLocal<T>(
     defaultComputation: CompositionLocalAccessorScope.() -> T
@@ -331,9 +322,9 @@
 
 interface CompositionLocalAccessorScope {
     /**
-     * An extension property that allows accessing the current value of a composition local in
-     * the context of this scope. This scope is the type of the `this` parameter when in a
-     * computed composition. Computed composition locals can be provided by either using
+     * An extension property that allows accessing the current value of a composition local in the
+     * context of this scope. This scope is the type of the `this` parameter when in a computed
+     * composition. Computed composition locals can be provided by either using
      * [compositionLocalWithComputedDefaultOf] or by using the
      * [ProvidableCompositionLocal.providesComputed] infix operator.
      *
@@ -350,21 +341,20 @@
 /**
  * Stores [CompositionLocal]'s and their values.
  *
- * Can be obtained via [currentCompositionLocalContext] and passed to another composition
- * via [CompositionLocalProvider].
+ * Can be obtained via [currentCompositionLocalContext] and passed to another composition via
+ * [CompositionLocalProvider].
  *
  * [CompositionLocalContext] is immutable and won't be changed after its obtaining.
  */
 @Stable
-class CompositionLocalContext internal constructor(
-    internal val compositionLocals: PersistentCompositionLocalMap
-)
+class CompositionLocalContext
+internal constructor(internal val compositionLocals: PersistentCompositionLocalMap)
 
 /**
  * [CompositionLocalProvider] binds values to [ProvidableCompositionLocal] keys. Reading the
  * [CompositionLocal] using [CompositionLocal.current] will return the value provided in
- * [CompositionLocalProvider]'s [values] parameter for all composable functions called directly
- * or indirectly in the [content] lambda.
+ * [CompositionLocalProvider]'s [values] parameter for all composable functions called directly or
+ * indirectly in the [content] lambda.
  *
  * @sample androidx.compose.runtime.samples.compositionLocalProvider
  *
@@ -384,8 +374,8 @@
 /**
  * [CompositionLocalProvider] binds value to [ProvidableCompositionLocal] key. Reading the
  * [CompositionLocal] using [CompositionLocal.current] will return the value provided in
- * [CompositionLocalProvider]'s [value] parameter for all composable functions called directly
- * or indirectly in the [content] lambda.
+ * [CompositionLocalProvider]'s [value] parameter for all composable functions called directly or
+ * indirectly in the [content] lambda.
  *
  * @sample androidx.compose.runtime.samples.compositionLocalProvider
  *
@@ -403,10 +393,10 @@
 }
 
 /**
- * [CompositionLocalProvider] binds values to [CompositionLocal]'s, provided by [context].
- * Reading the [CompositionLocal] using [CompositionLocal.current] will return the value provided in
- * values stored inside [context] for all composable functions called directly
- * or indirectly in the [content] lambda.
+ * [CompositionLocalProvider] binds values to [CompositionLocal]'s, provided by [context]. Reading
+ * the [CompositionLocal] using [CompositionLocal.current] will return the value provided in values
+ * stored inside [context] for all composable functions called directly or indirectly in the
+ * [content] lambda.
  *
  * @sample androidx.compose.runtime.samples.compositionLocalProvider
  *
diff --git a/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/CompositionLocalMap.kt b/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/CompositionLocalMap.kt
index 45e4540..aadfd6c 100644
--- a/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/CompositionLocalMap.kt
+++ b/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/CompositionLocalMap.kt
@@ -26,24 +26,22 @@
 sealed interface CompositionLocalMap {
     /**
      * Returns the value of the provided [composition local][key] at the position in the composition
-     * hierarchy represented by this [CompositionLocalMap] instance. If the provided [key]
-     * is not set at this point in the hierarchy, its default value will be used.
+     * hierarchy represented by this [CompositionLocalMap] instance. If the provided [key] is not
+     * set at this point in the hierarchy, its default value will be used.
      *
      * For [non-static CompositionLocals][compositionLocalOf], this function will return the latest
      * value of the CompositionLocal, which might change over time across the same instance of the
      * CompositionLocalMap. Reads done in this way are not tracked in the snapshot system.
      *
-     * For [static CompositionLocals][staticCompositionLocalOf], this function returns the value
-     * at the time of creation of the CompositionLocalMap. When a static CompositionLocal is
+     * For [static CompositionLocals][staticCompositionLocalOf], this function returns the value at
+     * the time of creation of the CompositionLocalMap. When a static CompositionLocal is
      * reassigned, the entire composition hierarchy is recomposed and a new CompositionLocalMap is
      * created with the updated value of the static CompositionLocal.
      */
     operator fun <T> get(key: CompositionLocal<T>): T
 
     companion object {
-        /**
-         * An empty [CompositionLocalMap] instance which contains no keys or values.
-         */
+        /** An empty [CompositionLocalMap] instance which contains no keys or values. */
         val Empty: CompositionLocalMap = persistentCompositionLocalHashMapOf()
     }
 }
@@ -86,9 +84,8 @@
     this.containsKey(key as CompositionLocal<Any?>)
 
 @Suppress("UNCHECKED_CAST")
-internal fun <T> PersistentCompositionLocalMap.read(
-    key: CompositionLocal<T>
-): T = getOrElse(key as CompositionLocal<Any?>) { key.defaultValueHolder }.readValue(this) as T
+internal fun <T> PersistentCompositionLocalMap.read(key: CompositionLocal<T>): T =
+    getOrElse(key as CompositionLocal<Any?>) { key.defaultValueHolder }.readValue(this) as T
 
 internal fun updateCompositionMap(
     values: Array<out ProvidedValue<*>>,
diff --git a/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/DerivedState.kt b/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/DerivedState.kt
index e6ae008..e50046a 100644
--- a/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/DerivedState.kt
+++ b/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/DerivedState.kt
@@ -16,6 +16,7 @@
 
 @file:JvmName("SnapshotStateKt")
 @file:JvmMultifileClass
+
 package androidx.compose.runtime
 
 import androidx.collection.MutableObjectIntMap
@@ -44,21 +45,20 @@
  * @see derivedStateOf
  */
 internal interface DerivedState<T> : State<T> {
-    /**
-     * Provides a current [Record].
-     */
+    /** Provides a current [Record]. */
     val currentRecord: Record<T>
 
     /**
-     * Mutation policy that controls how changes are handled after state dependencies update.
-     * If the policy is `null`, the derived state update is triggered regardless of the value
-     * produced and it is up to observer to invalidate it correctly.
+     * Mutation policy that controls how changes are handled after state dependencies update. If the
+     * policy is `null`, the derived state update is triggered regardless of the value produced and
+     * it is up to observer to invalidate it correctly.
      */
     val policy: SnapshotMutationPolicy<T>?
 
     interface Record<T> {
         /**
-         * The value of the derived state retrieved without triggering a notification to read observers.
+         * The value of the derived state retrieved without triggering a notification to read
+         * observers.
          */
         val currentValue: T
 
@@ -73,10 +73,10 @@
 }
 
 private val calculationBlockNestedLevel = SnapshotThreadLocal<IntRef>()
+
 private inline fun <T> withCalculationNestedLevel(block: (IntRef) -> T): T {
-    val ref = calculationBlockNestedLevel.get() ?: IntRef(0).also {
-        calculationBlockNestedLevel.set(it)
-    }
+    val ref =
+        calculationBlockNestedLevel.get() ?: IntRef(0).also { calculationBlockNestedLevel.set(it) }
     return block(ref)
 }
 
@@ -99,8 +99,7 @@
         var resultHash: Int = 0
 
         override fun assign(value: StateRecord) {
-            @Suppress("UNCHECKED_CAST")
-            val other = value as ResultRecord<T>
+            @Suppress("UNCHECKED_CAST") val other = value as ResultRecord<T>
             dependencies = other.dependencies
             result = other.result
             resultHash = other.resultHash
@@ -112,8 +111,9 @@
             val snapshotChanged = sync {
                 validSnapshotId != snapshot.id || validSnapshotWriteCount != snapshot.writeCount
             }
-            val isValid = result !== Unset &&
-                (!snapshotChanged || resultHash == readableHash(derivedState, snapshot))
+            val isValid =
+                result !== Unset &&
+                    (!snapshotChanged || resultHash == readableHash(derivedState, snapshot))
 
             if (isValid && snapshotChanged) {
                 sync {
@@ -136,15 +136,16 @@
                         }
 
                         // Find the first record without triggering an observer read.
-                        val record = if (stateObject is DerivedSnapshotState<*>) {
-                            // eagerly access the parent derived states without recording the
-                            // read
-                            // that way we can be sure derived states in deps were recalculated,
-                            // and are updated to the last values
-                            stateObject.current(snapshot)
-                        } else {
-                            current(stateObject.firstStateRecord, snapshot)
-                        }
+                        val record =
+                            if (stateObject is DerivedSnapshotState<*>) {
+                                // eagerly access the parent derived states without recording the
+                                // read
+                                // that way we can be sure derived states in deps were recalculated,
+                                // and are updated to the last values
+                                stateObject.current(snapshot)
+                            } else {
+                                current(stateObject.firstStateRecord, snapshot)
+                            }
 
                         hash = 31 * hash + identityHashCode(record)
                         hash = 31 * hash + record.snapshotId
@@ -155,13 +156,12 @@
         }
 
         override val currentValue: T
-            @Suppress("UNCHECKED_CAST")
-            get() = result as T
+            @Suppress("UNCHECKED_CAST") get() = result as T
     }
 
     /**
-     * Get current record in snapshot. Forces recalculation if record is invalid to refresh
-     * state value.
+     * Get current record in snapshot. Forces recalculation if record is invalid to refresh state
+     * value.
      *
      * @return latest state record for the derived state.
      */
@@ -199,20 +199,22 @@
             notifyObservers(this) {
                 calculationLevelRef.element = nestedCalculationLevel + 1
 
-                val result = Snapshot.observe(
-                    {
-                        if (it === this)
-                            error("A derived state calculation cannot read itself")
-                        if (it is StateObject) {
-                            val readNestedLevel = calculationLevelRef.element
-                            newDependencies[it] = min(
-                                readNestedLevel - nestedCalculationLevel,
-                                newDependencies.getOrDefault(it, Int.MAX_VALUE)
-                            )
-                        }
-                    },
-                    null, calculation
-                )
+                val result =
+                    Snapshot.observe(
+                        {
+                            if (it === this) error("A derived state calculation cannot read itself")
+                            if (it is StateObject) {
+                                val readNestedLevel = calculationLevelRef.element
+                                newDependencies[it] =
+                                    min(
+                                        readNestedLevel - nestedCalculationLevel,
+                                        newDependencies.getOrDefault(it, Int.MAX_VALUE)
+                                    )
+                            }
+                        },
+                        null,
+                        calculation
+                    )
 
                 calculationLevelRef.element = nestedCalculationLevel
                 result
@@ -224,8 +226,8 @@
 
             if (
                 readable.result !== ResultRecord.Unset &&
-                @Suppress("UNCHECKED_CAST")
-                policy?.equivalent(result, readable.result as T) == true
+                    @Suppress("UNCHECKED_CAST") policy?.equivalent(result, readable.result as T) ==
+                        true
             ) {
                 readable.dependencies = newDependencies
                 readable.resultHash = readable.readableHash(this, currentSnapshot)
@@ -252,7 +254,8 @@
         return record
     }
 
-    override val firstStateRecord: StateRecord get() = first
+    override val firstStateRecord: StateRecord
+        get() = first
 
     override fun prependStateRecord(value: StateRecord) {
         @Suppress("UNCHECKED_CAST")
@@ -261,7 +264,8 @@
 
     override val value: T
         get() {
-            // Unlike most state objects, the record list of a derived state can change during a read
+            // Unlike most state objects, the record list of a derived state can change during a
+            // read
             // because reading updates the cache. To account for this, instead of calling readable,
             // which sends the read notification, the read observer is notified directly and current
             // value is used instead which doesn't notify. This allow the read observer to read the
@@ -281,9 +285,8 @@
             return currentRecord(record, snapshot, false, calculation)
         }
 
-    override fun toString(): String = first.withCurrent {
-        "DerivedState(value=${displayValue()})@${hashCode()}"
-    }
+    override fun toString(): String =
+        first.withCurrent { "DerivedState(value=${displayValue()})@${hashCode()}" }
 
     /**
      * A function used by the debugger to display the value of the current value of the mutable
@@ -292,12 +295,11 @@
     @Suppress("unused")
     val debuggerDisplayValue: T?
         @JvmName("getDebuggerDisplayValue")
-        get() = first.withCurrent {
-            @Suppress("UNCHECKED_CAST")
-            if (it.isValid(this, Snapshot.current))
-                it.result as T
-            else null
-        }
+        get() =
+            first.withCurrent {
+                @Suppress("UNCHECKED_CAST")
+                if (it.isValid(this, Snapshot.current)) it.result as T else null
+            }
 
     private fun displayValue(): String {
         first.withCurrent {
@@ -313,12 +315,11 @@
  * Creates a [State] object whose [State.value] is the result of [calculation]. The result of
  * calculation will be cached in such a way that calling [State.value] repeatedly will not cause
  * [calculation] to be executed multiple times, but reading [State.value] will cause all [State]
- * objects that got read during the [calculation] to be read in the current [Snapshot], meaning
- * that this will correctly subscribe to the derived state objects if the value is being read in
- * an observed context such as a [Composable] function.
- * Derived states without mutation policy trigger updates on each dependency change. To avoid
- * invalidation on update, provide suitable [SnapshotMutationPolicy] through [derivedStateOf]
- * overload.
+ * objects that got read during the [calculation] to be read in the current [Snapshot], meaning that
+ * this will correctly subscribe to the derived state objects if the value is being read in an
+ * observed context such as a [Composable] function. Derived states without mutation policy trigger
+ * updates on each dependency change. To avoid invalidation on update, provide suitable
+ * [SnapshotMutationPolicy] through [derivedStateOf] overload.
  *
  * @sample androidx.compose.runtime.samples.DerivedStateSample
  *
@@ -333,9 +334,9 @@
  * Creates a [State] object whose [State.value] is the result of [calculation]. The result of
  * calculation will be cached in such a way that calling [State.value] repeatedly will not cause
  * [calculation] to be executed multiple times, but reading [State.value] will cause all [State]
- * objects that got read during the [calculation] to be read in the current [Snapshot], meaning
- * that this will correctly subscribe to the derived state objects if the value is being read in
- * an observed context such as a [Composable] function.
+ * objects that got read during the [calculation] to be read in the current [Snapshot], meaning that
+ * this will correctly subscribe to the derived state objects if the value is being read in an
+ * observed context such as a [Composable] function.
  *
  * @sample androidx.compose.runtime.samples.DerivedStateSample
  *
@@ -348,27 +349,20 @@
     calculation: () -> T,
 ): State<T> = DerivedSnapshotState(calculation, policy)
 
-/**
- * Observe the recalculations performed by derived states.
- */
+/** Observe the recalculations performed by derived states. */
 internal interface DerivedStateObserver {
-    /**
-     * Called before a calculation starts.
-     */
+    /** Called before a calculation starts. */
     fun start(derivedState: DerivedState<*>)
 
-    /**
-     * Called after the started calculation is complete.
-     */
+    /** Called after the started calculation is complete. */
     fun done(derivedState: DerivedState<*>)
 }
 
 private val derivedStateObservers = SnapshotThreadLocal<MutableVector<DerivedStateObserver>>()
 
 internal fun derivedStateObservers(): MutableVector<DerivedStateObserver> =
-    derivedStateObservers.get() ?: MutableVector<DerivedStateObserver>(0).also {
-        derivedStateObservers.set(it)
-    }
+    derivedStateObservers.get()
+        ?: MutableVector<DerivedStateObserver>(0).also { derivedStateObservers.set(it) }
 
 private inline fun <R> notifyObservers(derivedState: DerivedState<*>, block: () -> R): R {
     val observers = derivedStateObservers()
diff --git a/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/DisallowComposableCalls.kt b/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/DisallowComposableCalls.kt
index 8d9ba3c..2de6f36 100644
--- a/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/DisallowComposableCalls.kt
+++ b/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/DisallowComposableCalls.kt
@@ -17,9 +17,9 @@
 package androidx.compose.runtime
 
 /**
- * This will prevent composable calls from happening inside of the
- * function that it applies to. This is usually applied to lambda parameters of inline composable
- * functions that ought to be inlined but cannot safely have composable calls in them.
+ * This will prevent composable calls from happening inside of the function that it applies to. This
+ * is usually applied to lambda parameters of inline composable functions that ought to be inlined
+ * but cannot safely have composable calls in them.
  */
 @MustBeDocumented
 @Retention(AnnotationRetention.BINARY)
diff --git a/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/DontMemoize.kt b/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/DontMemoize.kt
index a422d36..00c4b18 100644
--- a/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/DontMemoize.kt
+++ b/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/DontMemoize.kt
@@ -17,9 +17,8 @@
 package androidx.compose.runtime
 
 /**
- * Mark a lambda in composition to opt out of auto-memoization.
- * This annotation can be applied to individual lambdas e.g.
- * val foo = @DontMemoize { ... }
+ * Mark a lambda in composition to opt out of auto-memoization. This annotation can be applied to
+ * individual lambdas e.g. val foo = @DontMemoize { ... }
  */
 @Retention(AnnotationRetention.SOURCE)
 @Target(AnnotationTarget.EXPRESSION)
diff --git a/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/Effects.kt b/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/Effects.kt
index e2c3e15..ff72dab 100644
--- a/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/Effects.kt
+++ b/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/Effects.kt
@@ -25,47 +25,43 @@
 import kotlinx.coroutines.launch
 
 /**
- * Schedule [effect] to run when the current composition completes successfully and applies
- * changes. [SideEffect] can be used to apply side effects to objects managed by the
- * composition that are not backed by [snapshots][androidx.compose.runtime.snapshots.Snapshot] so
- * as not to leave those objects in an inconsistent state if the current composition operation
- * fails.
+ * Schedule [effect] to run when the current composition completes successfully and applies changes.
+ * [SideEffect] can be used to apply side effects to objects managed by the composition that are not
+ * backed by [snapshots][androidx.compose.runtime.snapshots.Snapshot] so as not to leave those
+ * objects in an inconsistent state if the current composition operation fails.
  *
  * [effect] will always be run on the composition's apply dispatcher and appliers are never run
  * concurrent with themselves, one another, applying changes to the composition tree, or running
- * [RememberObserver] event callbacks. [SideEffect]s are always run after [RememberObserver]
- * event callbacks.
+ * [RememberObserver] event callbacks. [SideEffect]s are always run after [RememberObserver] event
+ * callbacks.
  *
- * A [SideEffect] runs after **every** recomposition. To launch an ongoing task spanning
- * potentially many recompositions, see [LaunchedEffect]. To manage an event subscription or other
- * object lifecycle, see [DisposableEffect].
+ * A [SideEffect] runs after **every** recomposition. To launch an ongoing task spanning potentially
+ * many recompositions, see [LaunchedEffect]. To manage an event subscription or other object
+ * lifecycle, see [DisposableEffect].
  */
 @Composable
 @NonRestartableComposable
 @ExplicitGroupsComposable
 @OptIn(InternalComposeApi::class)
-fun SideEffect(
-    effect: () -> Unit
-) {
+fun SideEffect(effect: () -> Unit) {
     currentComposer.recordSideEffect(effect)
 }
 
 /**
- * Receiver scope for [DisposableEffect] that offers the [onDispose] clause that should be
- * the last statement in any call to [DisposableEffect].
+ * Receiver scope for [DisposableEffect] that offers the [onDispose] clause that should be the last
+ * statement in any call to [DisposableEffect].
  */
 class DisposableEffectScope {
     /**
-     * Provide [onDisposeEffect] to the [DisposableEffect] to run when it leaves the composition
-     * or its key changes.
+     * Provide [onDisposeEffect] to the [DisposableEffect] to run when it leaves the composition or
+     * its key changes.
      */
-    inline fun onDispose(
-        crossinline onDisposeEffect: () -> Unit
-    ): DisposableEffectResult = object : DisposableEffectResult {
-        override fun dispose() {
-            onDisposeEffect()
+    inline fun onDispose(crossinline onDisposeEffect: () -> Unit): DisposableEffectResult =
+        object : DisposableEffectResult {
+            override fun dispose() {
+                onDisposeEffect()
+            }
         }
-    }
 }
 
 interface DisposableEffectResult {
@@ -104,8 +100,8 @@
         "and a new effect launched for the new key."
 
 /**
- * A side effect of composition that must be reversed or cleaned up if the [DisposableEffect]
- * leaves the composition.
+ * A side effect of composition that must be reversed or cleaned up if the [DisposableEffect] leaves
+ * the composition.
  *
  * It is an error to call [DisposableEffect] without at least one `key` parameter.
  */
@@ -115,77 +111,67 @@
 @NonRestartableComposable
 @Suppress("DeprecatedCallableAddReplaceWith", "UNUSED_PARAMETER")
 @Deprecated(DisposableEffectNoParamError, level = DeprecationLevel.ERROR)
-fun DisposableEffect(
-    effect: DisposableEffectScope.() -> DisposableEffectResult
-): Unit = error(DisposableEffectNoParamError)
+fun DisposableEffect(effect: DisposableEffectScope.() -> DisposableEffectResult): Unit =
+    error(DisposableEffectNoParamError)
 
 /**
  * A side effect of composition that must run for any new unique value of [key1] and must be
  * reversed or cleaned up if [key1] changes or if the [DisposableEffect] leaves the composition.
  *
- * A [DisposableEffect]'s _key_ is a value that defines the identity of the
- * [DisposableEffect]. If a key changes, the [DisposableEffect] must
- * [dispose][DisposableEffectScope.onDispose] its current [effect] and reset by calling [effect]
- * again. Examples of keys include:
- *
+ * A [DisposableEffect]'s _key_ is a value that defines the identity of the [DisposableEffect]. If a
+ * key changes, the [DisposableEffect] must [dispose][DisposableEffectScope.onDispose] its current
+ * [effect] and reset by calling [effect] again. Examples of keys include:
  * * Observable objects that the effect subscribes to
  * * Unique request parameters to an operation that must cancel and retry if those parameters change
  *
- * [DisposableEffect] may be used to initialize or subscribe to a key and reinitialize
- * when a different key is provided, performing cleanup for the old operation before
- * initializing the new. For example:
+ * [DisposableEffect] may be used to initialize or subscribe to a key and reinitialize when a
+ * different key is provided, performing cleanup for the old operation before initializing the new.
+ * For example:
  *
  * @sample androidx.compose.runtime.samples.disposableEffectSample
  *
- * A [DisposableEffect] **must** include an [onDispose][DisposableEffectScope.onDispose] clause
- * as the final statement in its [effect] block. If your operation does not require disposal
- * it might be a [SideEffect] instead, or a [LaunchedEffect] if it launches a coroutine that should
- * be managed by the composition.
+ * A [DisposableEffect] **must** include an [onDispose][DisposableEffectScope.onDispose] clause as
+ * the final statement in its [effect] block. If your operation does not require disposal it might
+ * be a [SideEffect] instead, or a [LaunchedEffect] if it launches a coroutine that should be
+ * managed by the composition.
  *
  * There is guaranteed to be one call to [dispose][DisposableEffectScope.onDispose] for every call
- * to [effect]. Both [effect] and [dispose][DisposableEffectScope.onDispose] will always be run
- * on the composition's apply dispatcher and appliers are never run concurrent with themselves,
- * one another, applying changes to the composition tree, or running [RememberObserver] event
- * callbacks.
+ * to [effect]. Both [effect] and [dispose][DisposableEffectScope.onDispose] will always be run on
+ * the composition's apply dispatcher and appliers are never run concurrent with themselves, one
+ * another, applying changes to the composition tree, or running [RememberObserver] event callbacks.
  */
 @Composable
 @NonRestartableComposable
-fun DisposableEffect(
-    key1: Any?,
-    effect: DisposableEffectScope.() -> DisposableEffectResult
-) {
+fun DisposableEffect(key1: Any?, effect: DisposableEffectScope.() -> DisposableEffectResult) {
     remember(key1) { DisposableEffectImpl(effect) }
 }
 
 /**
- * A side effect of composition that must run for any new unique value of [key1] or [key2]
- * and must be reversed or cleaned up if [key1] or [key2] changes, or if the
- * [DisposableEffect] leaves the composition.
+ * A side effect of composition that must run for any new unique value of [key1] or [key2] and must
+ * be reversed or cleaned up if [key1] or [key2] changes, or if the [DisposableEffect] leaves the
+ * composition.
  *
- * A [DisposableEffect]'s _key_ is a value that defines the identity of the
- * [DisposableEffect]. If a key changes, the [DisposableEffect] must
- * [dispose][DisposableEffectScope.onDispose] its current [effect] and reset by calling [effect]
- * again. Examples of keys include:
- *
+ * A [DisposableEffect]'s _key_ is a value that defines the identity of the [DisposableEffect]. If a
+ * key changes, the [DisposableEffect] must [dispose][DisposableEffectScope.onDispose] its current
+ * [effect] and reset by calling [effect] again. Examples of keys include:
  * * Observable objects that the effect subscribes to
  * * Unique request parameters to an operation that must cancel and retry if those parameters change
  *
- * [DisposableEffect] may be used to initialize or subscribe to a key and reinitialize
- * when a different key is provided, performing cleanup for the old operation before
- * initializing the new. For example:
+ * [DisposableEffect] may be used to initialize or subscribe to a key and reinitialize when a
+ * different key is provided, performing cleanup for the old operation before initializing the new.
+ * For example:
  *
  * @sample androidx.compose.runtime.samples.disposableEffectSample
  *
- * A [DisposableEffect] **must** include an [onDispose][DisposableEffectScope.onDispose] clause
- * as the final statement in its [effect] block. If your operation does not require disposal
- * it might be a [SideEffect] instead, or a [LaunchedEffect] if it launches a coroutine that should
- * be managed by the composition.
+ * A [DisposableEffect] **must** include an [onDispose][DisposableEffectScope.onDispose] clause as
+ * the final statement in its [effect] block. If your operation does not require disposal it might
+ * be a [SideEffect] instead, or a [LaunchedEffect] if it launches a coroutine that should be
+ * managed by the composition.
  *
  * There is guaranteed to be one call to [dispose][DisposableEffectScope.onDispose] for every call
- * to [effect]. Both [effect] and [dispose][DisposableEffectScope.onDispose] will always be run
- * on the composition's apply dispatcher and appliers are never run concurrent with themselves,
- * one another, applying changes to the composition tree, or running [RememberObserver]
- * event callbacks.
+ * to [effect]. Both [effect] and [dispose][DisposableEffectScope.onDispose] will always be run on
+ * the composition's apply dispatcher and appliers are never run concurrent with themselves, one
+ * another, applying changes to the composition tree, or running [RememberObserver] event callbacks.
  */
 @Composable
 @NonRestartableComposable
@@ -198,34 +184,31 @@
 }
 
 /**
- * A side effect of composition that must run for any new unique value of [key1], [key2]
- * or [key3] and must be reversed or cleaned up if [key1], [key2] or [key3]
- * changes, or if the [DisposableEffect] leaves the composition.
+ * A side effect of composition that must run for any new unique value of [key1], [key2] or [key3]
+ * and must be reversed or cleaned up if [key1], [key2] or [key3] changes, or if the
+ * [DisposableEffect] leaves the composition.
  *
- * A [DisposableEffect]'s _key_ is a value that defines the identity of the
- * [DisposableEffect]. If a key changes, the [DisposableEffect] must
- * [dispose][DisposableEffectScope.onDispose] its current [effect] and reset by calling [effect]
- * again. Examples of keys include:
- *
+ * A [DisposableEffect]'s _key_ is a value that defines the identity of the [DisposableEffect]. If a
+ * key changes, the [DisposableEffect] must [dispose][DisposableEffectScope.onDispose] its current
+ * [effect] and reset by calling [effect] again. Examples of keys include:
  * * Observable objects that the effect subscribes to
  * * Unique request parameters to an operation that must cancel and retry if those parameters change
  *
- * [DisposableEffect] may be used to initialize or subscribe to a key and reinitialize
- * when a different key is provided, performing cleanup for the old operation before
- * initializing the new. For example:
+ * [DisposableEffect] may be used to initialize or subscribe to a key and reinitialize when a
+ * different key is provided, performing cleanup for the old operation before initializing the new.
+ * For example:
  *
  * @sample androidx.compose.runtime.samples.disposableEffectSample
  *
- * A [DisposableEffect] **must** include an [onDispose][DisposableEffectScope.onDispose] clause
- * as the final statement in its [effect] block. If your operation does not require disposal
- * it might be a [SideEffect] instead, or a [LaunchedEffect] if it launches a coroutine that should
- * be managed by the composition.
+ * A [DisposableEffect] **must** include an [onDispose][DisposableEffectScope.onDispose] clause as
+ * the final statement in its [effect] block. If your operation does not require disposal it might
+ * be a [SideEffect] instead, or a [LaunchedEffect] if it launches a coroutine that should be
+ * managed by the composition.
  *
  * There is guaranteed to be one call to [dispose][DisposableEffectScope.onDispose] for every call
- * to [effect]. Both [effect] and [dispose][DisposableEffectScope.onDispose] will always be run
- * on the composition's apply dispatcher and appliers are never run concurrent with themselves,
- * one another, applying changes to the composition tree, or running [RememberObserver] event
- * callbacks.
+ * to [effect]. Both [effect] and [dispose][DisposableEffectScope.onDispose] will always be run on
+ * the composition's apply dispatcher and appliers are never run concurrent with themselves, one
+ * another, applying changes to the composition tree, or running [RememberObserver] event callbacks.
  */
 @Composable
 @NonRestartableComposable
@@ -239,34 +222,30 @@
 }
 
 /**
- * A side effect of composition that must run for any new unique value of [keys] and must
- * be reversed or cleaned up if any [keys] change or if the [DisposableEffect] leaves the
- * composition.
+ * A side effect of composition that must run for any new unique value of [keys] and must be
+ * reversed or cleaned up if any [keys] change or if the [DisposableEffect] leaves the composition.
  *
- * A [DisposableEffect]'s _key_ is a value that defines the identity of the
- * [DisposableEffect]. If a key changes, the [DisposableEffect] must
- * [dispose][DisposableEffectScope.onDispose] its current [effect] and reset by calling [effect]
- * again. Examples of keys include:
- *
+ * A [DisposableEffect]'s _key_ is a value that defines the identity of the [DisposableEffect]. If a
+ * key changes, the [DisposableEffect] must [dispose][DisposableEffectScope.onDispose] its current
+ * [effect] and reset by calling [effect] again. Examples of keys include:
  * * Observable objects that the effect subscribes to
  * * Unique request parameters to an operation that must cancel and retry if those parameters change
  *
- * [DisposableEffect] may be used to initialize or subscribe to a key and reinitialize
- * when a different key is provided, performing cleanup for the old operation before
- * initializing the new. For example:
+ * [DisposableEffect] may be used to initialize or subscribe to a key and reinitialize when a
+ * different key is provided, performing cleanup for the old operation before initializing the new.
+ * For example:
  *
  * @sample androidx.compose.runtime.samples.disposableEffectSample
  *
- * A [DisposableEffect] **must** include an [onDispose][DisposableEffectScope.onDispose] clause
- * as the final statement in its [effect] block. If your operation does not require disposal
- * it might be a [SideEffect] instead, or a [LaunchedEffect] if it launches a coroutine that should
- * be managed by the composition.
+ * A [DisposableEffect] **must** include an [onDispose][DisposableEffectScope.onDispose] clause as
+ * the final statement in its [effect] block. If your operation does not require disposal it might
+ * be a [SideEffect] instead, or a [LaunchedEffect] if it launches a coroutine that should be
+ * managed by the composition.
  *
  * There is guaranteed to be one call to [dispose][DisposableEffectScope.onDispose] for every call
- * to [effect]. Both [effect] and [dispose][DisposableEffectScope.onDispose] will always be run
- * on the composition's apply dispatcher and appliers are never run concurrent with themselves,
- * one another, applying changes to the composition tree, or running [RememberObserver] event
- * callbacks.
+ * to [effect]. Both [effect] and [dispose][DisposableEffectScope.onDispose] will always be run on
+ * the composition's apply dispatcher and appliers are never run concurrent with themselves, one
+ * another, applying changes to the composition tree, or running [RememberObserver] event callbacks.
  */
 @Composable
 @NonRestartableComposable
@@ -314,9 +293,8 @@
 @Deprecated(LaunchedEffectNoParamError, level = DeprecationLevel.ERROR)
 @Suppress("DeprecatedCallableAddReplaceWith", "UNUSED_PARAMETER")
 @Composable
-fun LaunchedEffect(
-    block: suspend CoroutineScope.() -> Unit
-): Unit = error(LaunchedEffectNoParamError)
+fun LaunchedEffect(block: suspend CoroutineScope.() -> Unit): Unit =
+    error(LaunchedEffectNoParamError)
 
 /**
  * When [LaunchedEffect] enters the composition it will launch [block] into the composition's
@@ -324,18 +302,15 @@
  * [LaunchedEffect] is recomposed with a different [key1]. The coroutine will be
  * [cancelled][Job.cancel] when the [LaunchedEffect] leaves the composition.
  *
- * This function should **not** be used to (re-)launch ongoing tasks in response to callback
- * events by way of storing callback data in [MutableState] passed to [key1]. Instead, see
+ * This function should **not** be used to (re-)launch ongoing tasks in response to callback events
+ * by way of storing callback data in [MutableState] passed to [key1]. Instead, see
  * [rememberCoroutineScope] to obtain a [CoroutineScope] that may be used to launch ongoing jobs
  * scoped to the composition in response to event callbacks.
  */
 @Composable
 @NonRestartableComposable
 @OptIn(InternalComposeApi::class)
-fun LaunchedEffect(
-    key1: Any?,
-    block: suspend CoroutineScope.() -> Unit
-) {
+fun LaunchedEffect(key1: Any?, block: suspend CoroutineScope.() -> Unit) {
     val applyContext = currentComposer.applyCoroutineContext
     remember(key1) { LaunchedEffectImpl(applyContext, block) }
 }
@@ -346,19 +321,15 @@
  * [LaunchedEffect] is recomposed with a different [key1] or [key2]. The coroutine will be
  * [cancelled][Job.cancel] when the [LaunchedEffect] leaves the composition.
  *
- * This function should **not** be used to (re-)launch ongoing tasks in response to callback
- * events by way of storing callback data in [MutableState] passed to [key]. Instead, see
+ * This function should **not** be used to (re-)launch ongoing tasks in response to callback events
+ * by way of storing callback data in [MutableState] passed to [key]. Instead, see
  * [rememberCoroutineScope] to obtain a [CoroutineScope] that may be used to launch ongoing jobs
  * scoped to the composition in response to event callbacks.
  */
 @Composable
 @NonRestartableComposable
 @OptIn(InternalComposeApi::class)
-fun LaunchedEffect(
-    key1: Any?,
-    key2: Any?,
-    block: suspend CoroutineScope.() -> Unit
-) {
+fun LaunchedEffect(key1: Any?, key2: Any?, block: suspend CoroutineScope.() -> Unit) {
     val applyContext = currentComposer.applyCoroutineContext
     remember(key1, key2) { LaunchedEffectImpl(applyContext, block) }
 }
@@ -366,30 +337,24 @@
 /**
  * When [LaunchedEffect] enters the composition it will launch [block] into the composition's
  * [CoroutineContext]. The coroutine will be [cancelled][Job.cancel] and **re-launched** when
- * [LaunchedEffect] is recomposed with a different [key1], [key2] or [key3].
- * The coroutine will be [cancelled][Job.cancel] when the [LaunchedEffect] leaves the composition.
+ * [LaunchedEffect] is recomposed with a different [key1], [key2] or [key3]. The coroutine will be
+ * [cancelled][Job.cancel] when the [LaunchedEffect] leaves the composition.
  *
- * This function should **not** be used to (re-)launch ongoing tasks in response to callback
- * events by way of storing callback data in [MutableState] passed to [key]. Instead, see
+ * This function should **not** be used to (re-)launch ongoing tasks in response to callback events
+ * by way of storing callback data in [MutableState] passed to [key]. Instead, see
  * [rememberCoroutineScope] to obtain a [CoroutineScope] that may be used to launch ongoing jobs
  * scoped to the composition in response to event callbacks.
  */
 @Composable
 @NonRestartableComposable
 @OptIn(InternalComposeApi::class)
-fun LaunchedEffect(
-    key1: Any?,
-    key2: Any?,
-    key3: Any?,
-    block: suspend CoroutineScope.() -> Unit
-) {
+fun LaunchedEffect(key1: Any?, key2: Any?, key3: Any?, block: suspend CoroutineScope.() -> Unit) {
     val applyContext = currentComposer.applyCoroutineContext
     remember(key1, key2, key3) { LaunchedEffectImpl(applyContext, block) }
 }
 
-private class LeftCompositionCancellationException : PlatformOptimizedCancellationException(
-    "The coroutine scope left the composition"
-)
+private class LeftCompositionCancellationException :
+    PlatformOptimizedCancellationException("The coroutine scope left the composition")
 
 /**
  * When [LaunchedEffect] enters the composition it will launch [block] into the composition's
@@ -397,8 +362,8 @@
  * [LaunchedEffect] is recomposed with any different [keys]. The coroutine will be
  * [cancelled][Job.cancel] when the [LaunchedEffect] leaves the composition.
  *
- * This function should **not** be used to (re-)launch ongoing tasks in response to callback
- * events by way of storing callback data in [MutableState] passed to [key]. Instead, see
+ * This function should **not** be used to (re-)launch ongoing tasks in response to callback events
+ * by way of storing callback data in [MutableState] passed to [key]. Instead, see
  * [rememberCoroutineScope] to obtain a [CoroutineScope] that may be used to launch ongoing jobs
  * scoped to the composition in response to event callbacks.
  */
@@ -406,18 +371,14 @@
 @NonRestartableComposable
 @Suppress("ArrayReturn")
 @OptIn(InternalComposeApi::class)
-fun LaunchedEffect(
-    vararg keys: Any?,
-    block: suspend CoroutineScope.() -> Unit
-) {
+fun LaunchedEffect(vararg keys: Any?, block: suspend CoroutineScope.() -> Unit) {
     val applyContext = currentComposer.applyCoroutineContext
     remember(*keys) { LaunchedEffectImpl(applyContext, block) }
 }
 
 @PublishedApi
-internal class CompositionScopedCoroutineScopeCanceller(
-    val coroutineScope: CoroutineScope
-) : RememberObserver {
+internal class CompositionScopedCoroutineScopeCanceller(val coroutineScope: CoroutineScope) :
+    RememberObserver {
     override fun onRemembered() {
         // Nothing to do
     }
@@ -436,30 +397,31 @@
 internal fun createCompositionCoroutineScope(
     coroutineContext: CoroutineContext,
     composer: Composer
-) = if (coroutineContext[Job] != null) {
-    CoroutineScope(
-        Job().apply {
-            completeExceptionally(
-                IllegalArgumentException(
-                    "CoroutineContext supplied to " +
-                        "rememberCoroutineScope may not include a parent job"
+) =
+    if (coroutineContext[Job] != null) {
+        CoroutineScope(
+            Job().apply {
+                completeExceptionally(
+                    IllegalArgumentException(
+                        "CoroutineContext supplied to " +
+                            "rememberCoroutineScope may not include a parent job"
+                    )
                 )
-            )
-        }
-    )
-} else {
-    val applyContext = composer.applyCoroutineContext
-    CoroutineScope(applyContext + Job(applyContext[Job]) + coroutineContext)
-}
+            }
+        )
+    } else {
+        val applyContext = composer.applyCoroutineContext
+        CoroutineScope(applyContext + Job(applyContext[Job]) + coroutineContext)
+    }
 
 /**
  * Return a [CoroutineScope] bound to this point in the composition using the optional
  * [CoroutineContext] provided by [getContext]. [getContext] will only be called once and the same
  * [CoroutineScope] instance will be returned across recompositions.
  *
- * This scope will be [cancelled][CoroutineScope.cancel] when this call leaves the composition.
- * The [CoroutineContext] returned by [getContext] may not contain a [Job] as this scope is
- * considered to be a child of the composition.
+ * This scope will be [cancelled][CoroutineScope.cancel] when this call leaves the composition. The
+ * [CoroutineContext] returned by [getContext] may not contain a [Job] as this scope is considered
+ * to be a child of the composition.
  *
  * The default dispatcher of this scope if one is not provided by the context returned by
  * [getContext] will be the applying dispatcher of the composition's [Recomposer].
@@ -467,18 +429,19 @@
  * Use this scope to launch jobs in response to callback events such as clicks or other user
  * interaction where the response to that event needs to unfold over time and be cancelled if the
  * composable managing that process leaves the composition. Jobs should never be launched into
- * **any** coroutine scope as a side effect of composition itself. For scoped ongoing jobs
- * initiated by composition, see [LaunchedEffect].
+ * **any** coroutine scope as a side effect of composition itself. For scoped ongoing jobs initiated
+ * by composition, see [LaunchedEffect].
  *
  * This function will not throw if preconditions are not met, as composable functions do not yet
  * fully support exceptions. Instead the returned scope's [CoroutineScope.coroutineContext] will
- * contain a failed [Job] with the associated exception and will not be capable of launching
- * child jobs.
+ * contain a failed [Job] with the associated exception and will not be capable of launching child
+ * jobs.
  */
 @Composable
 inline fun rememberCoroutineScope(
-    crossinline getContext: @DisallowComposableCalls () -> CoroutineContext =
-        { EmptyCoroutineContext }
+    crossinline getContext: @DisallowComposableCalls () -> CoroutineContext = {
+        EmptyCoroutineContext
+    }
 ): CoroutineScope {
     val composer = currentComposer
     val wrapper = remember {
diff --git a/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/ExperimentalComposeApi.kt b/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/ExperimentalComposeApi.kt
index 3b3242f..c1163a3 100644
--- a/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/ExperimentalComposeApi.kt
+++ b/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/ExperimentalComposeApi.kt
@@ -18,8 +18,9 @@
 
 @RequiresOptIn(
     level = RequiresOptIn.Level.ERROR,
-    message = "This is an experimental API for Compose and is likely to change before becoming " +
-        "stable."
+    message =
+        "This is an experimental API for Compose and is likely to change before becoming " +
+            "stable."
 )
 @Target(
     AnnotationTarget.CLASS,
diff --git a/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/ExplicitGroupsComposable.kt b/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/ExplicitGroupsComposable.kt
index db2bddf..1b511f4 100644
--- a/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/ExplicitGroupsComposable.kt
+++ b/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/ExplicitGroupsComposable.kt
@@ -17,19 +17,16 @@
 package androidx.compose.runtime
 
 /**
- * This annotation can be applied to [Composable] functions so that no groups will be generated
- * in the body of the function it annotates. The expectation is that the groups the function
- * should produce will be created manually using methods on [currentComposer].
+ * This annotation can be applied to [Composable] functions so that no groups will be generated in
+ * the body of the function it annotates. The expectation is that the groups the function should
+ * produce will be created manually using methods on [currentComposer].
  *
- * Unlike [ReadOnlyComposable], the expectation with this annotation is that the marked
- * [Composable] does in fact make writes to the [Composer] and produces a single group.
+ * Unlike [ReadOnlyComposable], the expectation with this annotation is that the marked [Composable]
+ * does in fact make writes to the [Composer] and produces a single group.
  *
- * Caution: Use of this annotation removes all guarantees provided by the Compose Compiler and
- * usage of it should be considered at your own risk.
+ * Caution: Use of this annotation removes all guarantees provided by the Compose Compiler and usage
+ * of it should be considered at your own risk.
  */
 @Retention(AnnotationRetention.SOURCE)
-@Target(
-    AnnotationTarget.FUNCTION,
-    AnnotationTarget.PROPERTY_GETTER
-)
+@Target(AnnotationTarget.FUNCTION, AnnotationTarget.PROPERTY_GETTER)
 annotation class ExplicitGroupsComposable
diff --git a/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/HotReloader.kt b/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/HotReloader.kt
index 576b29e..5d29f70 100644
--- a/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/HotReloader.kt
+++ b/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/HotReloader.kt
@@ -15,13 +15,14 @@
  */
 
 @file:OptIn(InternalComposeApi::class)
+
 package androidx.compose.runtime
 
 /**
  * Apply Code Changes will invoke the two functions before and after a code swap.
  *
- * This forces the whole view hierarchy to be redrawn to invoke any code change that was
- * introduce in the code swap.
+ * This forces the whole view hierarchy to be redrawn to invoke any code change that was introduce
+ * in the code swap.
  *
  * All these are private as within JVMTI / JNI accessibility is mostly a formality.
  */
@@ -62,28 +63,24 @@
 
 /**
  * Simulates hot reload of all current compositions by disposing all composed content and restarting
- * compositions. Calling this method switches recomposer into hot reload mode.
- * Test-only API, not for use in production.
+ * compositions. Calling this method switches recomposer into hot reload mode. Test-only API, not
+ * for use in production.
  *
  * @param context context for disposal.
  */
-@TestOnly
-fun simulateHotReload(context: Any) = HotReloader.simulateHotReload(context)
+@TestOnly fun simulateHotReload(context: Any) = HotReloader.simulateHotReload(context)
 
 /**
  * Invalidates composed groups with the given key. Calling this method switches recomposer into hot
- * reload mode.
- * Test-only API, not for use in production.
+ * reload mode. Test-only API, not for use in production.
  *
  * @param key group key to invalidate.
  */
-@TestOnly
-fun invalidateGroupsWithKey(key: Int) = HotReloader.invalidateGroupsWithKey(key)
+@TestOnly fun invalidateGroupsWithKey(key: Int) = HotReloader.invalidateGroupsWithKey(key)
 
 /**
- * Get list of errors captured in composition. This list is only available when recomposer is in
- * hot reload mode.
- * Test-only API, not for use in production.
+ * Get list of errors captured in composition. This list is only available when recomposer is in hot
+ * reload mode. Test-only API, not for use in production.
  *
  * @return pair of error and whether the error is recoverable.
  */
@@ -91,12 +88,9 @@
 @Suppress("ListIterator")
 @TestOnly
 fun currentCompositionErrors(): List<Pair<Exception, Boolean>> =
-    HotReloader.getCurrentErrors()
-        .map { it.cause to it.recoverable }
+    HotReloader.getCurrentErrors().map { it.cause to it.recoverable }
 
 /**
- * Clears current composition errors in hot reload mode.
- * Test-only API, not for use in production.
+ * Clears current composition errors in hot reload mode. Test-only API, not for use in production.
  */
-@TestOnly
-fun clearCompositionErrors() = HotReloader.clearErrors()
+@TestOnly fun clearCompositionErrors() = HotReloader.clearErrors()
diff --git a/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/Immutable.kt b/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/Immutable.kt
index 1938b4a..0b5b6e5 100644
--- a/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/Immutable.kt
+++ b/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/Immutable.kt
@@ -18,18 +18,17 @@
 
 /**
  * [Immutable] can be used to mark class as producing immutable instances. The immutability of the
- * class is not validated and is a promise by the type that all publicly accessible properties
- * and fields will not change after the instance is constructed. This is a stronger promise than
- * `val` as it promises that the value will never change not only that values cannot be changed
- * through a setter.
+ * class is not validated and is a promise by the type that all publicly accessible properties and
+ * fields will not change after the instance is constructed. This is a stronger promise than `val`
+ * as it promises that the value will never change not only that values cannot be changed through a
+ * setter.
  *
- * [Immutable] is used by composition which enables composition optimizations that can be
- * performed based on the assumption that values read from the type will not change.  See
- * [StableMarker] for additional details.
+ * [Immutable] is used by composition which enables composition optimizations that can be performed
+ * based on the assumption that values read from the type will not change. See [StableMarker] for
+ * additional details.
  *
- * `data` classes that only contain `val` properties that do not have custom getters can safely
- * be marked as [Immutable] if the types of properties are either primitive types or also
- * [Immutable]:
+ * `data` classes that only contain `val` properties that do not have custom getters can safely be
+ * marked as [Immutable] if the types of properties are either primitive types or also [Immutable]:
  *
  * @sample androidx.compose.runtime.samples.simpleImmutableClass
  *
diff --git a/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/InternalComposeApi.kt b/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/InternalComposeApi.kt
index 928e1ee..37b465b 100644
--- a/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/InternalComposeApi.kt
+++ b/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/InternalComposeApi.kt
@@ -18,13 +18,10 @@
 
 @RequiresOptIn(
     level = RequiresOptIn.Level.ERROR,
-    message = "This is internal API for Compose modules that may change frequently " +
-        "and without warning."
+    message =
+        "This is internal API for Compose modules that may change frequently " +
+            "and without warning."
 )
-@Target(
-    AnnotationTarget.CLASS,
-    AnnotationTarget.FUNCTION,
-    AnnotationTarget.PROPERTY
-)
+@Target(AnnotationTarget.CLASS, AnnotationTarget.FUNCTION, AnnotationTarget.PROPERTY)
 @Retention(AnnotationRetention.BINARY)
 annotation class InternalComposeApi
diff --git a/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/JoinedKey.kt b/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/JoinedKey.kt
index 4e70352..2a9ff70 100644
--- a/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/JoinedKey.kt
+++ b/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/JoinedKey.kt
@@ -17,10 +17,7 @@
 package androidx.compose.runtime
 
 @Suppress("EqualsOrHashCode")
-internal data class JoinedKey(
-    val left: Any?,
-    val right: Any?
-) {
+internal data class JoinedKey(val left: Any?, val right: Any?) {
     override fun hashCode(): Int = hashCodeOf(left) * 31 + hashCodeOf(right)
 
     private fun hashCodeOf(value: Any?) =
diff --git a/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/Latch.kt b/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/Latch.kt
index 9978704..be20498 100644
--- a/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/Latch.kt
+++ b/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/Latch.kt
@@ -22,12 +22,12 @@
 
 /**
  * A boolean open or closed latch for awaiting a single repeating event, like pending
- * recompositions. Closing while already closed or opening while already open is a no-op;
- * only one event producer should be responsible for opening or closing the latch.
+ * recompositions. Closing while already closed or opening while already open is a no-op; only one
+ * event producer should be responsible for opening or closing the latch.
  *
- * This implementation is intended for low-contention environments involving
- * low total numbers of threads in a pool on the order of ~number of CPU cores available for UI
- * recomposition work, while avoiding additional allocation where possible.
+ * This implementation is intended for low-contention environments involving low total numbers of
+ * threads in a pool on the order of ~number of CPU cores available for UI recomposition work, while
+ * avoiding additional allocation where possible.
  */
 internal class Latch {
 
@@ -36,7 +36,8 @@
     private var spareList = mutableListOf<Continuation<Unit>>()
 
     private var _isOpen = true
-    val isOpen get() = synchronized(lock) { _isOpen }
+    val isOpen
+        get() = synchronized(lock) { _isOpen }
 
     inline fun <R> withClosed(block: () -> R): R {
         closeLatch()
@@ -48,9 +49,7 @@
     }
 
     fun closeLatch() {
-        synchronized(lock) {
-            _isOpen = false
-        }
+        synchronized(lock) { _isOpen = false }
     }
 
     fun openLatch() {
@@ -76,15 +75,9 @@
         if (isOpen) return
 
         suspendCancellableCoroutine<Unit> { co ->
-            synchronized(lock) {
-                awaiters.add(co)
-            }
+            synchronized(lock) { awaiters.add(co) }
 
-            co.invokeOnCancellation {
-                synchronized(lock) {
-                    awaiters.remove(co)
-                }
-            }
+            co.invokeOnCancellation { synchronized(lock) { awaiters.remove(co) } }
         }
     }
 }
diff --git a/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/MonotonicFrameClock.kt b/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/MonotonicFrameClock.kt
index 66f5e49..7bc5b3d 100644
--- a/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/MonotonicFrameClock.kt
+++ b/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/MonotonicFrameClock.kt
@@ -28,37 +28,36 @@
 @JvmDefaultWithCompatibility
 interface MonotonicFrameClock : CoroutineContext.Element {
     /**
-     * Suspends until a new frame is requested, immediately invokes [onFrame] with the frame time
-     * in nanoseconds in the calling context of frame dispatch, then resumes with the result from
+     * Suspends until a new frame is requested, immediately invokes [onFrame] with the frame time in
+     * nanoseconds in the calling context of frame dispatch, then resumes with the result from
      * [onFrame].
      *
-     * `frameTimeNanos` should be used when calculating animation time deltas from frame to frame
-     * as it may be normalized to the target time for the frame, not necessarily a direct,
-     * "now" value.
+     * `frameTimeNanos` should be used when calculating animation time deltas from frame to frame as
+     * it may be normalized to the target time for the frame, not necessarily a direct, "now" value.
      *
-     * The time base of the value provided by [withFrameNanos] is implementation defined.
-     * Time values provided are strictly monotonically increasing; after a call to [withFrameNanos]
+     * The time base of the value provided by [withFrameNanos] is implementation defined. Time
+     * values provided are strictly monotonically increasing; after a call to [withFrameNanos]
      * completes it must not provide the same value again for a subsequent call.
      */
     suspend fun <R> withFrameNanos(onFrame: (frameTimeNanos: Long) -> R): R
 
-    override val key: CoroutineContext.Key<*> get() = Key
+    override val key: CoroutineContext.Key<*>
+        get() = Key
 
     companion object Key : CoroutineContext.Key<MonotonicFrameClock>
 }
 
 /**
- * Suspends until a new frame is requested, immediately invokes [onFrame] with the frame time
- * in milliseconds in the calling context of frame dispatch, then resumes with the result from
+ * Suspends until a new frame is requested, immediately invokes [onFrame] with the frame time in
+ * milliseconds in the calling context of frame dispatch, then resumes with the result from
  * [onFrame].
  *
- * `frameTimeMillis` should be used when calculating animation time deltas from frame to frame
- * as it may be normalized to the target time for the frame, not necessarily a direct,
- * "now" value.
+ * `frameTimeMillis` should be used when calculating animation time deltas from frame to frame as it
+ * may be normalized to the target time for the frame, not necessarily a direct, "now" value.
  *
- * The time base of the value provided by [MonotonicFrameClock.withFrameMillis] is
- * implementation defined. Time values provided are monotonically increasing; after a call to
- * [withFrameMillis] completes it must not provide a smaller value for a subsequent call.
+ * The time base of the value provided by [MonotonicFrameClock.withFrameMillis] is implementation
+ * defined. Time values provided are monotonically increasing; after a call to [withFrameMillis]
+ * completes it must not provide a smaller value for a subsequent call.
  */
 @Suppress("UnnecessaryLambdaCreation")
 suspend inline fun <R> MonotonicFrameClock.withFrameMillis(
@@ -66,17 +65,16 @@
 ): R = withFrameNanos { onFrame(it / 1_000_000L) }
 
 /**
- * Suspends until a new frame is requested, immediately invokes [onFrame] with the frame time
- * in nanoseconds in the calling context of frame dispatch, then resumes with the result from
+ * Suspends until a new frame is requested, immediately invokes [onFrame] with the frame time in
+ * nanoseconds in the calling context of frame dispatch, then resumes with the result from
  * [onFrame].
  *
- * `frameTimeNanos` should be used when calculating animation time deltas from frame to frame
- * as it may be normalized to the target time for the frame, not necessarily a direct,
- * "now" value.
+ * `frameTimeNanos` should be used when calculating animation time deltas from frame to frame as it
+ * may be normalized to the target time for the frame, not necessarily a direct, "now" value.
  *
- * The time base of the value provided by [withFrameNanos] is implementation defined.
- * Time values provided are strictly monotonically increasing; after a call to [withFrameNanos]
- * completes it must not provide the same value again for a subsequent call.
+ * The time base of the value provided by [withFrameNanos] is implementation defined. Time values
+ * provided are strictly monotonically increasing; after a call to [withFrameNanos] completes it
+ * must not provide the same value again for a subsequent call.
  *
  * This function will invoke [MonotonicFrameClock.withFrameNanos] using the calling
  * [CoroutineContext]'s [MonotonicFrameClock] and will throw an [IllegalStateException] if one is
@@ -87,17 +85,16 @@
     coroutineContext.monotonicFrameClock.withFrameNanos(onFrame)
 
 /**
- * Suspends until a new frame is requested, immediately invokes [onFrame] with the frame time
- * in milliseconds in the calling context of frame dispatch, then resumes with the result from
+ * Suspends until a new frame is requested, immediately invokes [onFrame] with the frame time in
+ * milliseconds in the calling context of frame dispatch, then resumes with the result from
  * [onFrame].
  *
- * `frameTimeMillis` should be used when calculating animation time deltas from frame to frame
- * as it may be normalized to the target time for the frame, not necessarily a direct,
- * "now" value.
+ * `frameTimeMillis` should be used when calculating animation time deltas from frame to frame as it
+ * may be normalized to the target time for the frame, not necessarily a direct, "now" value.
  *
- * The time base of the value provided by [MonotonicFrameClock.withFrameMillis] is
- * implementation defined. Time values provided are monotonically increasing; after a call to
- * [withFrameMillis] completes it must not provide a smaller value for a subsequent call.
+ * The time base of the value provided by [MonotonicFrameClock.withFrameMillis] is implementation
+ * defined. Time values provided are monotonically increasing; after a call to [withFrameMillis]
+ * completes it must not provide a smaller value for a subsequent call.
  *
  * This function will invoke [MonotonicFrameClock.withFrameNanos] using the calling
  * [CoroutineContext]'s [MonotonicFrameClock] and will throw an [IllegalStateException] if one is
@@ -113,14 +110,16 @@
  */
 @ExperimentalComposeApi
 val CoroutineContext.monotonicFrameClock: MonotonicFrameClock
-    get() = this[MonotonicFrameClock] ?: error(
-        "A MonotonicFrameClock is not available in this CoroutineContext. Callers should supply " +
-            "an appropriate MonotonicFrameClock using withContext."
-    )
+    get() =
+        this[MonotonicFrameClock]
+            ?: error(
+                "A MonotonicFrameClock is not available in this CoroutineContext. Callers should supply " +
+                    "an appropriate MonotonicFrameClock using withContext."
+            )
 
 /**
- * The [MonotonicFrameClock] used by [withFrameNanos] and [withFrameMillis] if one is not present
- * in the calling [kotlin.coroutines.CoroutineContext].
+ * The [MonotonicFrameClock] used by [withFrameNanos] and [withFrameMillis] if one is not present in
+ * the calling [kotlin.coroutines.CoroutineContext].
  *
  * This value is no longer used by compose runtime.
  */
diff --git a/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/MovableContent.kt b/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/MovableContent.kt
index 11e33b8..a2166bd 100644
--- a/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/MovableContent.kt
+++ b/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/MovableContent.kt
@@ -36,9 +36,7 @@
 @OptIn(InternalComposeApi::class)
 fun movableContentOf(content: @Composable () -> Unit): @Composable () -> Unit {
     val movableContent = MovableContent<Unit>({ content() })
-    return {
-        currentComposer.insertMovableContent(movableContent, Unit)
-    }
+    return { currentComposer.insertMovableContent(movableContent, Unit) }
 }
 
 /**
@@ -61,9 +59,7 @@
 @OptIn(InternalComposeApi::class)
 fun <P> movableContentOf(content: @Composable (P) -> Unit): @Composable (P) -> Unit {
     val movableContent = MovableContent(content)
-    return {
-        currentComposer.insertMovableContent(movableContent, it)
-    }
+    return { currentComposer.insertMovableContent(movableContent, it) }
 }
 
 /**
@@ -86,9 +82,7 @@
 @OptIn(InternalComposeApi::class)
 fun <P1, P2> movableContentOf(content: @Composable (P1, P2) -> Unit): @Composable (P1, P2) -> Unit {
     val movableContent = MovableContent<Pair<P1, P2>> { content(it.first, it.second) }
-    return { p1, p2 ->
-        currentComposer.insertMovableContent(movableContent, p1 to p2)
-    }
+    return { p1, p2 -> currentComposer.insertMovableContent(movableContent, p1 to p2) }
 }
 
 /**
@@ -112,12 +106,11 @@
 fun <P1, P2, P3> movableContentOf(
     content: @Composable (P1, P2, P3) -> Unit
 ): @Composable (P1, P2, P3) -> Unit {
-    val movableContent = MovableContent<Pair<Pair<P1, P2>, P3>> {
-        content(it.first.first, it.first.second, it.second)
-    }
-    return { p1, p2, p3 ->
-        currentComposer.insertMovableContent(movableContent, (p1 to p2) to p3)
-    }
+    val movableContent =
+        MovableContent<Pair<Pair<P1, P2>, P3>> {
+            content(it.first.first, it.first.second, it.second)
+        }
+    return { p1, p2, p3 -> currentComposer.insertMovableContent(movableContent, (p1 to p2) to p3) }
 }
 
 /**
@@ -141,9 +134,10 @@
 fun <P1, P2, P3, P4> movableContentOf(
     content: @Composable (P1, P2, P3, P4) -> Unit
 ): @Composable (P1, P2, P3, P4) -> Unit {
-    val movableContent = MovableContent<Pair<Pair<P1, P2>, Pair<P3, P4>>> {
-        content(it.first.first, it.first.second, it.second.first, it.second.second)
-    }
+    val movableContent =
+        MovableContent<Pair<Pair<P1, P2>, Pair<P3, P4>>> {
+            content(it.first.first, it.first.second, it.second.first, it.second.second)
+        }
     return { p1, p2, p3, p4 ->
         currentComposer.insertMovableContent(movableContent, (p1 to p2) to (p3 to p4))
     }
@@ -169,9 +163,7 @@
 @OptIn(InternalComposeApi::class)
 fun <R> movableContentWithReceiverOf(content: @Composable R.() -> Unit): @Composable R.() -> Unit {
     val movableContent = MovableContent<R>({ it.content() })
-    return {
-        currentComposer.insertMovableContent(movableContent, this)
-    }
+    return { currentComposer.insertMovableContent(movableContent, this) }
 }
 
 /**
@@ -196,9 +188,7 @@
     content: @Composable R.(P) -> Unit
 ): @Composable R.(P) -> Unit {
     val movableContent = MovableContent<Pair<R, P>>({ it.first.content(it.second) })
-    return {
-        currentComposer.insertMovableContent(movableContent, this to it)
-    }
+    return { currentComposer.insertMovableContent(movableContent, this to it) }
 }
 
 /**
@@ -222,12 +212,9 @@
 fun <R, P1, P2> movableContentWithReceiverOf(
     content: @Composable R.(P1, P2) -> Unit
 ): @Composable R.(P1, P2) -> Unit {
-    val movableContent = MovableContent<Pair<Pair<R, P1>, P2>> {
-        it.first.first.content(it.first.second, it.second)
-    }
-    return { p1, p2 ->
-        currentComposer.insertMovableContent(movableContent, (this to p1) to p2)
-    }
+    val movableContent =
+        MovableContent<Pair<Pair<R, P1>, P2>> { it.first.first.content(it.first.second, it.second) }
+    return { p1, p2 -> currentComposer.insertMovableContent(movableContent, (this to p1) to p2) }
 }
 
 /**
@@ -251,9 +238,10 @@
 fun <R, P1, P2, P3> movableContentWithReceiverOf(
     content: @Composable R.(P1, P2, P3) -> Unit
 ): @Composable R.(P1, P2, P3) -> Unit {
-    val movableContent = MovableContent<Pair<Pair<R, P1>, Pair<P2, P3>>> {
-        it.first.first.content(it.first.second, it.second.first, it.second.second)
-    }
+    val movableContent =
+        MovableContent<Pair<Pair<R, P1>, Pair<P2, P3>>> {
+            it.first.first.content(it.first.second, it.second.first, it.second.second)
+        }
     return { p1, p2, p3 ->
         currentComposer.insertMovableContent(movableContent, (this to p1) to (p2 to p3))
     }
diff --git a/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/NoLiveLiterals.kt b/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/NoLiveLiterals.kt
index 7bb2370..7c4d44c 100644
--- a/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/NoLiveLiterals.kt
+++ b/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/NoLiveLiterals.kt
@@ -18,8 +18,8 @@
 
 /**
  * This annotation is used to indicate to the Compose Compiler to not attempt to generate live
- * literals inside the scope of the declaration it is applied to, even when the live literals
- * code generation is turned on.
+ * literals inside the scope of the declaration it is applied to, even when the live literals code
+ * generation is turned on.
  */
 @Target(
     AnnotationTarget.PROPERTY,
diff --git a/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/NonRestartableComposable.kt b/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/NonRestartableComposable.kt
index 9bfd087..df6f5db 100644
--- a/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/NonRestartableComposable.kt
+++ b/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/NonRestartableComposable.kt
@@ -18,13 +18,10 @@
 
 /**
  * This annotation can be applied to [Composable] functions in order to prevent code from being
- * generated which allow this function's execution to be skipped or restarted. This may be
- * desirable for small functions which just directly call another composable function and have
- * very little machinery in them directly, and are unlikely to be invalidated themselves.
+ * generated which allow this function's execution to be skipped or restarted. This may be desirable
+ * for small functions which just directly call another composable function and have very little
+ * machinery in them directly, and are unlikely to be invalidated themselves.
  */
 @Retention(AnnotationRetention.SOURCE)
-@Target(
-    AnnotationTarget.FUNCTION,
-    AnnotationTarget.PROPERTY_GETTER
-)
+@Target(AnnotationTarget.FUNCTION, AnnotationTarget.PROPERTY_GETTER)
 annotation class NonRestartableComposable
diff --git a/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/NonSkippableComposable.kt b/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/NonSkippableComposable.kt
index 43ac9b4..33f8c1f 100644
--- a/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/NonSkippableComposable.kt
+++ b/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/NonSkippableComposable.kt
@@ -21,8 +21,5 @@
  * generated which allow this function's execution to be skipped.
  */
 @Retention(AnnotationRetention.SOURCE)
-@Target(
-    AnnotationTarget.FUNCTION,
-    AnnotationTarget.PROPERTY_GETTER
-)
+@Target(AnnotationTarget.FUNCTION, AnnotationTarget.PROPERTY_GETTER)
 annotation class NonSkippableComposable
diff --git a/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/OpaqueKey.kt b/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/OpaqueKey.kt
index bda78274..9bb76b8d 100644
--- a/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/OpaqueKey.kt
+++ b/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/OpaqueKey.kt
@@ -18,6 +18,6 @@
 
 /**
  * @param key This [String] should be hardcoded on the compile-time which allows the hashcode
- * implementation of this class to always be the same and survive the process recreation.
+ *   implementation of this class to always be the same and survive the process recreation.
  */
 internal data class OpaqueKey(val key: String)
diff --git a/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/PausableMonotonicFrameClock.kt b/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/PausableMonotonicFrameClock.kt
index b8a9246c..666bdb0 100644
--- a/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/PausableMonotonicFrameClock.kt
+++ b/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/PausableMonotonicFrameClock.kt
@@ -19,18 +19,17 @@
 /**
  * A [MonotonicFrameClock] wrapper that can be [pause]d and [resume]d.
  *
- * A paused clock will not dispatch [withFrameNanos] events until it is resumed.
- * Pausing a clock does **not** stop or change the frame times reported to [withFrameNanos] calls;
- * the clock times reported will always remain consistent with [frameClock].
+ * A paused clock will not dispatch [withFrameNanos] events until it is resumed. Pausing a clock
+ * does **not** stop or change the frame times reported to [withFrameNanos] calls; the clock times
+ * reported will always remain consistent with [frameClock].
  *
- * [PausableMonotonicFrameClock] should be used in cases where frames should not be produced
- * under some conditions, such as when a window hosting a UI is not currently visible.
- * As clock times are not altered from the source [frameClock], animations in progress may
- * be fully complete by the time the clock is resumed and a new frame is produced.
+ * [PausableMonotonicFrameClock] should be used in cases where frames should not be produced under
+ * some conditions, such as when a window hosting a UI is not currently visible. As clock times are
+ * not altered from the source [frameClock], animations in progress may be fully complete by the
+ * time the clock is resumed and a new frame is produced.
  */
-class PausableMonotonicFrameClock(
-    private val frameClock: MonotonicFrameClock
-) : MonotonicFrameClock {
+class PausableMonotonicFrameClock(private val frameClock: MonotonicFrameClock) :
+    MonotonicFrameClock {
     private val latch = Latch()
 
     /**
@@ -41,10 +40,10 @@
         get() = !latch.isOpen
 
     /**
-     * Pause the generation of frames. Pausing a clock that is already paused has no effect.
-     * While the clock is paused any calls to [withFrameNanos] will suspend until the clock is
-     * resumed before delegating to the wrapped [frameClock]'s [withFrameNanos] method.
-     * Call [resume] to resume generating frames.
+     * Pause the generation of frames. Pausing a clock that is already paused has no effect. While
+     * the clock is paused any calls to [withFrameNanos] will suspend until the clock is resumed
+     * before delegating to the wrapped [frameClock]'s [withFrameNanos] method. Call [resume] to
+     * resume generating frames.
      */
     fun pause() {
         latch.closeLatch()
diff --git a/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/Preconditions.kt b/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/Preconditions.kt
index 90aa989..d2b4740 100644
--- a/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/Preconditions.kt
+++ b/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/Preconditions.kt
@@ -30,9 +30,7 @@
 @Suppress("BanInlineOptIn") // same opt-in as using Kotlin's require()
 @OptIn(ExperimentalContracts::class)
 internal inline fun requirePrecondition(value: Boolean, lazyMessage: () -> String) {
-    contract {
-        returns() implies value
-    }
+    contract { returns() implies value }
     if (!value) {
         throwIllegalArgumentException(lazyMessage())
     }
@@ -47,9 +45,7 @@
 @Suppress("BanInlineOptIn") // same opt-in as using Kotlin's check()
 @OptIn(ExperimentalContracts::class)
 internal inline fun checkPrecondition(value: Boolean, lazyMessage: () -> String) {
-    contract {
-        returns() implies value
-    }
+    contract { returns() implies value }
     if (!value) {
         throwIllegalStateException(lazyMessage())
     }
@@ -58,9 +54,7 @@
 @Suppress("BanInlineOptIn", "NOTHING_TO_INLINE")
 @OptIn(ExperimentalContracts::class)
 internal inline fun checkPrecondition(value: Boolean) {
-    contract {
-        returns() implies value
-    }
+    contract { returns() implies value }
     if (!value) {
         throwIllegalStateException("Check failed.")
     }
diff --git a/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/ProduceState.kt b/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/ProduceState.kt
index cd26a4c..12522ff 100644
--- a/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/ProduceState.kt
+++ b/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/ProduceState.kt
@@ -16,6 +16,7 @@
 
 @file:JvmName("SnapshotStateKt")
 @file:JvmMultifileClass
+
 package androidx.compose.runtime
 
 import kotlin.coroutines.CoroutineContext
@@ -24,13 +25,11 @@
 import kotlinx.coroutines.CoroutineScope
 import kotlinx.coroutines.suspendCancellableCoroutine
 
-/**
- * Receiver scope for use with [produceState].
- */
+/** Receiver scope for use with [produceState]. */
 interface ProduceStateScope<T> : MutableState<T>, CoroutineScope {
     /**
-     * Await the disposal of this producer whether it left the composition,
-     * the source changed, or an error occurred. Always runs [onDispose] before resuming.
+     * Await the disposal of this producer whether it left the composition, the source changed, or
+     * an error occurred. Always runs [onDispose] before resuming.
      *
      * This method is useful when configuring callback-based state producers that do not suspend,
      * for example:
@@ -47,7 +46,7 @@
 
     override suspend fun awaitDispose(onDispose: () -> Unit): Nothing {
         try {
-            suspendCancellableCoroutine<Nothing> { }
+            suspendCancellableCoroutine<Nothing> {}
         } finally {
             onDispose()
         }
@@ -59,12 +58,12 @@
  * produces values over time without a defined data source.
  *
  * [producer] is launched when [produceState] enters the composition and is cancelled when
- * [produceState] leaves the composition. [producer] should use [ProduceStateScope.value]
- * to set new values on the returned [State].
+ * [produceState] leaves the composition. [producer] should use [ProduceStateScope.value] to set new
+ * values on the returned [State].
  *
- * The returned [State] conflates values; no change will be observable if
- * [ProduceStateScope.value] is used to set a value that is [equal][Any.equals] to its old value,
- * and observers may only see the latest value if several values are set in rapid succession.
+ * The returned [State] conflates values; no change will be observable if [ProduceStateScope.value]
+ * is used to set a value that is [equal][Any.equals] to its old value, and observers may only see
+ * the latest value if several values are set in rapid succession.
  *
  * [produceState] may be used to observe either suspending or non-suspending sources of external
  * data, for example:
@@ -74,14 +73,9 @@
  * @sample androidx.compose.runtime.samples.ProduceStateAwaitDispose
  */
 @Composable
-fun <T> produceState(
-    initialValue: T,
-    producer: suspend ProduceStateScope<T>.() -> Unit
-): State<T> {
+fun <T> produceState(initialValue: T, producer: suspend ProduceStateScope<T>.() -> Unit): State<T> {
     val result = remember { mutableStateOf(initialValue) }
-    LaunchedEffect(Unit) {
-        ProduceStateScopeImpl(result, coroutineContext).producer()
-    }
+    LaunchedEffect(Unit) { ProduceStateScopeImpl(result, coroutineContext).producer() }
     return result
 }
 
@@ -90,13 +84,13 @@
  * produces values over time from [key1].
  *
  * [producer] is launched when [produceState] enters the composition and is cancelled when
- * [produceState] leaves the composition. If [key1] changes, a running [producer] will be
- * cancelled and re-launched for the new source. [producer] should use [ProduceStateScope.value]
- * to set new values on the returned [State].
+ * [produceState] leaves the composition. If [key1] changes, a running [producer] will be cancelled
+ * and re-launched for the new source. [producer] should use [ProduceStateScope.value] to set new
+ * values on the returned [State].
  *
- * The returned [State] conflates values; no change will be observable if
- * [ProduceStateScope.value] is used to set a value that is [equal][Any.equals] to its old value,
- * and observers may only see the latest value if several values are set in rapid succession.
+ * The returned [State] conflates values; no change will be observable if [ProduceStateScope.value]
+ * is used to set a value that is [equal][Any.equals] to its old value, and observers may only see
+ * the latest value if several values are set in rapid succession.
  *
  * [produceState] may be used to observe either suspending or non-suspending sources of external
  * data, for example:
@@ -112,9 +106,7 @@
     producer: suspend ProduceStateScope<T>.() -> Unit
 ): State<T> {
     val result = remember { mutableStateOf(initialValue) }
-    LaunchedEffect(key1) {
-        ProduceStateScopeImpl(result, coroutineContext).producer()
-    }
+    LaunchedEffect(key1) { ProduceStateScopeImpl(result, coroutineContext).producer() }
     return result
 }
 
@@ -123,13 +115,13 @@
  * produces values over time from [key1] and [key2].
  *
  * [producer] is launched when [produceState] enters the composition and is cancelled when
- * [produceState] leaves the composition. If [key1] or [key2] change, a running [producer]
- * will be cancelled and re-launched for the new source. [producer] should use
- * [ProduceStateScope.value] to set new values on the returned [State].
+ * [produceState] leaves the composition. If [key1] or [key2] change, a running [producer] will be
+ * cancelled and re-launched for the new source. [producer] should use [ProduceStateScope.value] to
+ * set new values on the returned [State].
  *
- * The returned [State] conflates values; no change will be observable if
- * [ProduceStateScope.value] is used to set a value that is [equal][Any.equals] to its old value,
- * and observers may only see the latest value if several values are set in rapid succession.
+ * The returned [State] conflates values; no change will be observable if [ProduceStateScope.value]
+ * is used to set a value that is [equal][Any.equals] to its old value, and observers may only see
+ * the latest value if several values are set in rapid succession.
  *
  * [produceState] may be used to observe either suspending or non-suspending sources of external
  * data, for example:
@@ -146,9 +138,7 @@
     producer: suspend ProduceStateScope<T>.() -> Unit
 ): State<T> {
     val result = remember { mutableStateOf(initialValue) }
-    LaunchedEffect(key1, key2) {
-        ProduceStateScopeImpl(result, coroutineContext).producer()
-    }
+    LaunchedEffect(key1, key2) { ProduceStateScopeImpl(result, coroutineContext).producer() }
     return result
 }
 
@@ -157,13 +147,13 @@
  * produces values over time from [key1], [key2] and [key3].
  *
  * [producer] is launched when [produceState] enters the composition and is cancelled when
- * [produceState] leaves the composition. If [key1], [key2] or [key3] change, a running
- * [producer] will be cancelled and re-launched for the new source. [producer should use
- * [ProduceStateScope.value] to set new values on the returned [State].
+ * [produceState] leaves the composition. If [key1], [key2] or [key3] change, a running [producer]
+ * will be cancelled and re-launched for the new source.
+ * [producer should use [ProduceStateScope.value] to set new values on the returned [State].
  *
- * The returned [State] conflates values; no change will be observable if
- * [ProduceStateScope.value] is used to set a value that is [equal][Any.equals] to its old value,
- * and observers may only see the latest value if several values are set in rapid succession.
+ * The returned [State] conflates values; no change will be observable if [ProduceStateScope.value]
+ * is used to set a value that is [equal][Any.equals] to its old value, and observers may only see
+ * the latest value if several values are set in rapid succession.
  *
  * [produceState] may be used to observe either suspending or non-suspending sources of external
  * data, for example:
@@ -181,9 +171,7 @@
     producer: suspend ProduceStateScope<T>.() -> Unit
 ): State<T> {
     val result = remember { mutableStateOf(initialValue) }
-    LaunchedEffect(key1, key2, key3) {
-        ProduceStateScopeImpl(result, coroutineContext).producer()
-    }
+    LaunchedEffect(key1, key2, key3) { ProduceStateScopeImpl(result, coroutineContext).producer() }
     return result
 }
 
@@ -192,13 +180,13 @@
  * produces values over time from [keys].
  *
  * [producer] is launched when [produceState] enters the composition and is cancelled when
- * [produceState] leaves the composition. If [keys] change, a running [producer] will be
- * cancelled and re-launched for the new source. [producer] should use [ProduceStateScope.value]
- * to set new values on the returned [State].
+ * [produceState] leaves the composition. If [keys] change, a running [producer] will be cancelled
+ * and re-launched for the new source. [producer] should use [ProduceStateScope.value] to set new
+ * values on the returned [State].
  *
- * The returned [State] conflates values; no change will be observable if
- * [ProduceStateScope.value] is used to set a value that is [equal][Any.equals] to its old value,
- * and observers may only see the latest value if several values are set in rapid succession.
+ * The returned [State] conflates values; no change will be observable if [ProduceStateScope.value]
+ * is used to set a value that is [equal][Any.equals] to its old value, and observers may only see
+ * the latest value if several values are set in rapid succession.
  *
  * [produceState] may be used to observe either suspending or non-suspending sources of external
  * data, for example:
@@ -215,8 +203,6 @@
 ): State<T> {
     val result = remember { mutableStateOf(initialValue) }
     @Suppress("CHANGING_ARGUMENTS_EXECUTION_ORDER_FOR_NAMED_VARARGS")
-    LaunchedEffect(keys = keys) {
-        ProduceStateScopeImpl(result, coroutineContext).producer()
-    }
+    LaunchedEffect(keys = keys) { ProduceStateScopeImpl(result, coroutineContext).producer() }
     return result
 }
diff --git a/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/ReadOnlyComposable.kt b/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/ReadOnlyComposable.kt
index e8191a7..7efbf9c 100644
--- a/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/ReadOnlyComposable.kt
+++ b/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/ReadOnlyComposable.kt
@@ -19,8 +19,8 @@
 /**
  * This annotation can be applied to [Composable] functions so that no group will be generated
  * around the body of the function it annotates. This is not safe unless the body of the function
- * and any functions that it calls only executes "read" operations on the passed in composer.
- * This will result in slightly more efficient code.
+ * and any functions that it calls only executes "read" operations on the passed in composer. This
+ * will result in slightly more efficient code.
  *
  * A common use case for this are for functions that only need to be composable in order to read
  * [CompositionLocal] values, but don't call any other composables.
@@ -30,8 +30,5 @@
  */
 @MustBeDocumented
 @Retention(AnnotationRetention.BINARY)
-@Target(
-    AnnotationTarget.FUNCTION,
-    AnnotationTarget.PROPERTY_GETTER
-)
+@Target(AnnotationTarget.FUNCTION, AnnotationTarget.PROPERTY_GETTER)
 annotation class ReadOnlyComposable
diff --git a/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/RecomposeScopeImpl.kt b/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/RecomposeScopeImpl.kt
index 3161c75..88245a7 100644
--- a/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/RecomposeScopeImpl.kt
+++ b/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/RecomposeScopeImpl.kt
@@ -25,8 +25,8 @@
 import androidx.compose.runtime.tooling.RecomposeScopeObserver
 
 /**
- * Represents a recomposable scope or section of the composition hierarchy. Can be used to
- * manually invalidate the scope to schedule it for recomposition.
+ * Represents a recomposable scope or section of the composition hierarchy. Can be used to manually
+ * invalidate the scope to schedule it for recomposition.
  */
 interface RecomposeScope {
     /**
@@ -51,7 +51,8 @@
     val lowBits = flags and changedLowBitMask
     val highBits = flags and changedHighBitMask
     return ((flags and changedMask) or
-        (lowBits or (highBits shr 1)) or ((lowBits shl 1) and highBits))
+        (lowBits or (highBits shr 1)) or
+        ((lowBits shl 1) and highBits))
 }
 
 private const val UsedFlag = 0x01
@@ -64,7 +65,9 @@
 
 internal interface RecomposeScopeOwner {
     fun invalidate(scope: RecomposeScopeImpl, instance: Any?): InvalidationResult
+
     fun recomposeScopeReleased(scope: RecomposeScopeImpl)
+
     fun recordReadOf(value: Any)
 }
 
@@ -72,13 +75,11 @@
 
 /**
  * A RecomposeScope is created for a region of the composition that can be recomposed independently
- * of the rest of the composition. The composer will position the slot table to the location
- * stored in [anchor] and call [block] when recomposition is requested. It is created by
+ * of the rest of the composition. The composer will position the slot table to the location stored
+ * in [anchor] and call [block] when recomposition is requested. It is created by
  * [Composer.startRestartGroup] and is used to track how to restart the group.
  */
-internal class RecomposeScopeImpl(
-    owner: RecomposeScopeOwner?
-) : ScopeUpdateScope, RecomposeScope {
+internal class RecomposeScopeImpl(owner: RecomposeScopeOwner?) : ScopeUpdateScope, RecomposeScope {
 
     private var flags: Int = 0
 
@@ -95,9 +96,11 @@
      * removed from the slot table. For example, if the scope is in the then clause of an if
      * statement that later becomes false.
      */
-    val valid: Boolean get() = owner != null && anchor?.valid ?: false
+    val valid: Boolean
+        get() = owner != null && anchor?.valid ?: false
 
-    val canRecompose: Boolean get() = block != null
+    val canRecompose: Boolean
+        get() = block != null
 
     /**
      * Used is set when the [RecomposeScopeImpl] is used by, for example, [currentRecomposeScope].
@@ -115,10 +118,10 @@
         }
 
     /**
-     * Set to true when the there are function default calculations in the scope. These are
-     * treated as a special case to avoid having to create a special scope for them. If these
-     * change the this scope needs to be recomposed but the default values can be skipped if they
-     * where not invalidated.
+     * Set to true when the there are function default calculations in the scope. These are treated
+     * as a special case to avoid having to create a special scope for them. If these change the
+     * this scope needs to be recomposed but the default values can be skipped if they where not
+     * invalidated.
      */
     var defaultsInScope: Boolean
         get() = flags and DefaultsInScopeFlag != 0
@@ -145,8 +148,8 @@
         }
 
     /**
-     * Tracks whether the scope was invalidated directly but was recomposed because the caller
-     * was recomposed. This ensures that a scope invalidated directly will recompose even if its
+     * Tracks whether the scope was invalidated directly but was recomposed because the caller was
+     * recomposed. This ensures that a scope invalidated directly will recompose even if its
      * parameters are the same as the previous recomposition.
      */
     var requiresRecompose: Boolean
@@ -159,22 +162,17 @@
             }
         }
 
-    /**
-     * The lambda to call to restart the scopes composition.
-     */
+    /** The lambda to call to restart the scopes composition. */
     private var block: ((Composer, Int) -> Unit)? = null
 
-    /**
-     * The recompose scope observer, if one is registered.
-     */
-    @ExperimentalComposeRuntimeApi
-    private var observer: RecomposeScopeObserver? = null
+    /** The recompose scope observer, if one is registered. */
+    @ExperimentalComposeRuntimeApi private var observer: RecomposeScopeObserver? = null
 
     /**
      * Restart the scope's composition. It is an error if [block] was not updated. The code
-     * generated by the compiler ensures that when the recompose scope is used then [block] will
-     * be set but it might occur if the compiler is out-of-date (or ahead of the runtime) or
-     * incorrect direct calls to [Composer.startRestartGroup] and [Composer.endRestartGroup].
+     * generated by the compiler ensures that when the recompose scope is used then [block] will be
+     * set but it might occur if the compiler is out-of-date (or ahead of the runtime) or incorrect
+     * direct calls to [Composer.startRestartGroup] and [Composer.endRestartGroup].
      */
     @OptIn(ExperimentalComposeRuntimeApi::class)
     fun compose(composer: Composer) {
@@ -194,9 +192,7 @@
 
     @ExperimentalComposeRuntimeApi
     internal fun observe(observer: RecomposeScopeObserver): CompositionObserverHandle {
-        synchronized(callbackLock) {
-            this.observer = observer
-        }
+        synchronized(callbackLock) { this.observer = observer }
         return object : CompositionObserverHandle {
             override fun dispose() {
                 synchronized(callbackLock) {
@@ -209,8 +205,8 @@
     }
 
     /**
-     * Invalidate the group which will cause [owner] to request this scope be recomposed,
-     * and an [InvalidationResult] will be returned.
+     * Invalidate the group which will cause [owner] to request this scope be recomposed, and an
+     * [InvalidationResult] will be returned.
      */
     fun invalidateForResult(value: Any?): InvalidationResult =
         owner?.invalidate(this, value) ?: InvalidationResult.IGNORED
@@ -224,8 +220,7 @@
         owner = null
         trackedInstances = null
         trackedDependencies = null
-        @OptIn(ExperimentalComposeRuntimeApi::class)
-        observer?.onScopeDisposed(this)
+        @OptIn(ExperimentalComposeRuntimeApi::class) observer?.onScopeDisposed(this)
     }
 
     /**
@@ -239,18 +234,20 @@
     /**
      * Invalidate the group which will cause [owner] to request this scope be recomposed.
      *
-     * Unlike [invalidateForResult], this method is thread safe and calls the thread safe
-     * invalidate on the composer.
+     * Unlike [invalidateForResult], this method is thread safe and calls the thread safe invalidate
+     * on the composer.
      */
     override fun invalidate() {
         owner?.invalidate(this, null)
     }
 
     /**
-     * Update [block]. The scope is returned by [Composer.endRestartGroup] when [used] is true
-     * and implements [ScopeUpdateScope].
+     * Update [block]. The scope is returned by [Composer.endRestartGroup] when [used] is true and
+     * implements [ScopeUpdateScope].
      */
-    override fun updateScope(block: (Composer, Int) -> Unit) { this.block = block }
+    override fun updateScope(block: (Composer, Int) -> Unit) {
+        this.block = block
+    }
 
     private var currentToken = 0
     private var trackedInstances: MutableObjectIntMap<Any>? = null
@@ -266,9 +263,9 @@
         }
 
     /**
-     * Used to explicitly force recomposition. This is used during live edit to force a
-     * recompose scope that doesn't have a restart callback to recompose as its parent (or
-     * some parent above it) was invalidated and the path to this scope has also been forced.
+     * Used to explicitly force recomposition. This is used during live edit to force a recompose
+     * scope that doesn't have a restart callback to recompose as its parent (or some parent above
+     * it) was invalidated and the path to this scope has also been forced.
      */
     var forcedRecompose: Boolean
         get() = flags and ForcedRecomposeFlag != 0
@@ -280,9 +277,7 @@
             }
         }
 
-    /**
-     * Indicates whether the scope was skipped (e.g. [scopeSkipped] was called.
-     */
+    /** Indicates whether the scope was skipped (e.g. [scopeSkipped] was called. */
     internal var skipped: Boolean
         get() = flags and SkippedFlag != 0
         private set(value) {
@@ -309,13 +304,14 @@
 
     /**
      * Track instances that were read in scope.
+     *
      * @return whether the value was already read in scope during current pass
      */
     fun recordRead(instance: Any): Boolean {
         if (rereading) return false // Re-reading should force composition to update its tracking
 
-        val trackedInstances = trackedInstances
-            ?: MutableObjectIntMap<Any>().also { trackedInstances = it }
+        val trackedInstances =
+            trackedInstances ?: MutableObjectIntMap<Any>().also { trackedInstances = it }
 
         val token = trackedInstances.put(instance, currentToken, default = -1)
         if (token == currentToken) {
@@ -326,8 +322,9 @@
     }
 
     fun recordDerivedStateValue(instance: DerivedState<*>, value: Any?) {
-        val trackedDependencies = trackedDependencies
-            ?: MutableScatterMap<DerivedState<*>, Any?>().also { trackedDependencies = it }
+        val trackedDependencies =
+            trackedDependencies
+                ?: MutableScatterMap<DerivedState<*>, Any?>().also { trackedDependencies = it }
 
         trackedDependencies[instance] = value
     }
@@ -336,7 +333,8 @@
      * Returns true if the scope is observing derived state which might make this scope
      * conditionally invalidated.
      */
-    val isConditional: Boolean get() = trackedDependencies != null
+    val isConditional: Boolean
+        get() = trackedDependencies != null
 
     /**
      * Determine if the scope should be considered invalid.
@@ -378,9 +376,7 @@
             trackedInstances?.let { trackedInstances ->
                 rereading = true
                 try {
-                    trackedInstances.forEach { value, _ ->
-                        owner.recordReadOf(value)
-                    }
+                    trackedInstances.forEach { value, _ -> owner.recordReadOf(value) }
                 } finally {
                     rereading = false
                 }
@@ -389,9 +385,9 @@
     }
 
     /**
-     * Called when composition is completed for this scope. The [token] is the same token passed
-     * in the previous call to [start]. If [end] returns a non-null value the lambda returned
-     * will be called during [ControlledComposition.applyChanges].
+     * Called when composition is completed for this scope. The [token] is the same token passed in
+     * the previous call to [start]. If [end] returns a non-null value the lambda returned will be
+     * called during [ControlledComposition.applyChanges].
      */
     fun end(token: Int): ((Composition) -> Unit)? {
         return trackedInstances?.let { instances ->
@@ -400,27 +396,27 @@
             // observations tracked by the composition.
             // [skipped] is true if the scope was skipped. If the scope was skipped we should
             // leave the observations unmodified.
-            if (
-                !skipped && instances.any { _, instanceToken -> instanceToken != token }
-            ) { composition ->
-                if (
-                    currentToken == token &&
-                    instances == trackedInstances &&
-                    composition is CompositionImpl
-                ) {
-                    instances.removeIf { instance, instanceToken ->
-                        val shouldRemove = instanceToken != token
-                        if (shouldRemove) {
-                            composition.removeObservation(instance, this)
-                            if (instance is DerivedState<*>) {
-                                composition.removeDerivedStateObservation(instance)
-                                trackedDependencies?.remove(instance)
+            if (!skipped && instances.any { _, instanceToken -> instanceToken != token })
+                { composition ->
+                    if (
+                        currentToken == token &&
+                            instances == trackedInstances &&
+                            composition is CompositionImpl
+                    ) {
+                        instances.removeIf { instance, instanceToken ->
+                            val shouldRemove = instanceToken != token
+                            if (shouldRemove) {
+                                composition.removeObservation(instance, this)
+                                if (instance is DerivedState<*>) {
+                                    composition.removeDerivedStateObservation(instance)
+                                    trackedDependencies?.remove(instance)
+                                }
                             }
+                            shouldRemove
                         }
-                        shouldRemove
                     }
                 }
-            } else null
+            else null
         }
     }
 
@@ -441,8 +437,10 @@
         }
 
         internal fun hasAnchoredRecomposeScopes(slots: SlotTable, anchors: List<Anchor>) =
-            anchors.isNotEmpty() && anchors.fastAny {
-                slots.ownsAnchor(it) && slots.slot(slots.anchorIndex(it), 0) is RecomposeScopeImpl
-            }
+            anchors.isNotEmpty() &&
+                anchors.fastAny {
+                    slots.ownsAnchor(it) &&
+                        slots.slot(slots.anchorIndex(it), 0) is RecomposeScopeImpl
+                }
     }
 }
diff --git a/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/Recomposer.kt b/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/Recomposer.kt
index 3625ab6..5934e4c 100644
--- a/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/Recomposer.kt
+++ b/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/Recomposer.kt
@@ -67,8 +67,8 @@
 /**
  * Runs [block] with a new, active [Recomposer] applying changes in the calling [CoroutineContext].
  * The [Recomposer] will be [closed][Recomposer.close] after [block] returns.
- * [withRunningRecomposer] will return once the [Recomposer] is [Recomposer.State.ShutDown]
- * and all child jobs launched by [block] have [joined][Job.join].
+ * [withRunningRecomposer] will return once the [Recomposer] is [Recomposer.State.ShutDown] and all
+ * child jobs launched by [block] have [joined][Job.join].
  */
 suspend fun <R> withRunningRecomposer(
     block: suspend CoroutineScope.(recomposer: Recomposer) -> R
@@ -83,45 +83,38 @@
 }
 
 /**
- * Read-only information about a [Recomposer]. Used when code should only monitor the activity of
- * a [Recomposer], and not attempt to alter its state or create new compositions from it.
+ * Read-only information about a [Recomposer]. Used when code should only monitor the activity of a
+ * [Recomposer], and not attempt to alter its state or create new compositions from it.
  */
 interface RecomposerInfo {
-    /**
-     * The current [State] of the [Recomposer]. See each [State] value for its meaning.
-     */
+    /** The current [State] of the [Recomposer]. See each [State] value for its meaning. */
     // TODO: Mirror the currentState/StateFlow API change here once we can safely add
     // default interface methods. https://youtrack.jetbrains.com/issue/KT-47000
     val state: Flow<Recomposer.State>
 
     /**
-     * `true` if the [Recomposer] has been assigned work to do and it is currently performing
-     * that work or awaiting an opportunity to do so.
+     * `true` if the [Recomposer] has been assigned work to do and it is currently performing that
+     * work or awaiting an opportunity to do so.
      */
     val hasPendingWork: Boolean
 
     /**
-     * The running count of the number of times the [Recomposer] awoke and applied changes to
-     * one or more [Composer]s. This count is unaffected if the composer awakes and recomposed but
+     * The running count of the number of times the [Recomposer] awoke and applied changes to one or
+     * more [Composer]s. This count is unaffected if the composer awakes and recomposed but
      * composition did not produce changes to apply.
      */
     val changeCount: Long
 }
 
-/**
- * Read only information about [Recomposer] error state.
- */
+/** Read only information about [Recomposer] error state. */
 @InternalComposeApi
 internal interface RecomposerErrorInfo {
-    /**
-     * Exception which forced recomposition to halt.
-     */
+    /** Exception which forced recomposition to halt. */
     val cause: Exception
 
     /**
-     * Whether composition can recover from the error by itself.
-     * If the error is not recoverable, recomposer will not react to invalidate calls
-     * until state is reloaded.
+     * Whether composition can recover from the error by itself. If the error is not recoverable,
+     * recomposer will not react to invalidate calls until state is reloaded.
      */
     val recoverable: Boolean
 }
@@ -134,9 +127,7 @@
 // NotCloseable suppressed because this is Kotlin-only common code; [Auto]Closeable not available.
 @Suppress("RedundantVisibilityModifier", "NotCloseable")
 @OptIn(InternalComposeApi::class)
-class Recomposer(
-    effectCoroutineContext: CoroutineContext
-) : CompositionContext() {
+class Recomposer(effectCoroutineContext: CoroutineContext) : CompositionContext() {
     /**
      * This is a running count of the number of times the recomposer awoke and applied changes to
      * one or more composers. This count is unaffected if the composer awakes and recomposed but
@@ -147,29 +138,29 @@
 
     private val broadcastFrameClock = BroadcastFrameClock {
         synchronized(stateLock) {
-            deriveStateLocked().also {
-                if (_state.value <= State.ShuttingDown) throw CancellationException(
-                    "Recomposer shutdown; frame clock awaiter will never resume",
-                    closeCause
-                )
+                deriveStateLocked().also {
+                    if (_state.value <= State.ShuttingDown)
+                        throw CancellationException(
+                            "Recomposer shutdown; frame clock awaiter will never resume",
+                            closeCause
+                        )
+                }
             }
-        }?.resume(Unit)
+            ?.resume(Unit)
     }
 
-    /**
-     * Valid operational states of a [Recomposer].
-     */
+    /** Valid operational states of a [Recomposer]. */
     enum class State {
         /**
-         * [cancel] was called on the [Recomposer] and all cleanup work has completed.
-         * The [Recomposer] is no longer available for use.
+         * [cancel] was called on the [Recomposer] and all cleanup work has completed. The
+         * [Recomposer] is no longer available for use.
          */
         ShutDown,
 
         /**
-         * [cancel] was called on the [Recomposer] and it is no longer available for use.
-         * Cleanup work has not yet been fully completed and composition effect coroutines may
-         * still be running.
+         * [cancel] was called on the [Recomposer] and it is no longer available for use. Cleanup
+         * work has not yet been fully completed and composition effect coroutines may still be
+         * running.
          */
         ShuttingDown,
 
@@ -194,12 +185,11 @@
         Idle,
 
         /**
-         * The [Recomposer] has been notified of pending work it must perform and is either
-         * actively performing it or awaiting the appropriate opportunity to perform it.
-         * This work may include invalidated composers that must be recomposed, snapshot state
-         * changes that must be presented to known composers to check for invalidated
-         * compositions, or coroutines awaiting a frame using the Recomposer's
-         * [MonotonicFrameClock].
+         * The [Recomposer] has been notified of pending work it must perform and is either actively
+         * performing it or awaiting the appropriate opportunity to perform it. This work may
+         * include invalidated composers that must be recomposed, snapshot state changes that must
+         * be presented to known composers to check for invalidated compositions, or coroutines
+         * awaiting a frame using the Recomposer's [MonotonicFrameClock].
          */
         PendingWork
     }
@@ -211,12 +201,17 @@
     private var closeCause: Throwable? = null
     private val _knownCompositions = mutableListOf<ControlledComposition>()
     private var _knownCompositionsCache: List<ControlledComposition>? = null
-    private val knownCompositions get() = _knownCompositionsCache ?: run {
-        val compositions = _knownCompositions
-        val newCache = if (compositions.isEmpty()) emptyList() else ArrayList(compositions)
-        _knownCompositionsCache = newCache
-        newCache
-    }
+    private val knownCompositions
+        get() =
+            _knownCompositionsCache
+                ?: run {
+                    val compositions = _knownCompositions
+                    val newCache =
+                        if (compositions.isEmpty()) emptyList() else ArrayList(compositions)
+                    _knownCompositionsCache = newCache
+                    newCache
+                }
+
     private var snapshotInvalidations = MutableScatterSet<Any>()
     private val compositionInvalidations = mutableVectorOf<ControlledComposition>()
     private val compositionsAwaitingApply = mutableListOf<ControlledComposition>()
@@ -237,70 +232,73 @@
     private val _state = MutableStateFlow(State.Inactive)
 
     /**
-     * A [Job] used as a parent of any effects created by this [Recomposer]'s compositions.
-     * Its cleanup is used to advance to [State.ShuttingDown] or [State.ShutDown].
+     * A [Job] used as a parent of any effects created by this [Recomposer]'s compositions. Its
+     * cleanup is used to advance to [State.ShuttingDown] or [State.ShutDown].
      *
-     * Initialized after other state above, since it is possible for [Job.invokeOnCompletion]
-     * to run synchronously during construction if the [Recomposer] is constructed with
-     * a completed or cancelled [Job].
+     * Initialized after other state above, since it is possible for [Job.invokeOnCompletion] to run
+     * synchronously during construction if the [Recomposer] is constructed with a completed or
+     * cancelled [Job].
      */
-    private val effectJob = Job(effectCoroutineContext[Job]).apply {
-        invokeOnCompletion { throwable ->
-            // Since the running recompose job is operating in a disjoint job if present,
-            // kick it out and make sure no new ones start if we have one.
-            val cancellation = CancellationException("Recomposer effect job completed", throwable)
+    private val effectJob =
+        Job(effectCoroutineContext[Job]).apply {
+            invokeOnCompletion { throwable ->
+                // Since the running recompose job is operating in a disjoint job if present,
+                // kick it out and make sure no new ones start if we have one.
+                val cancellation =
+                    CancellationException("Recomposer effect job completed", throwable)
 
-            var continuationToResume: CancellableContinuation<Unit>? = null
-            synchronized(stateLock) {
-                val runnerJob = runnerJob
-                if (runnerJob != null) {
-                    _state.value = State.ShuttingDown
-                    // If the recomposer is closed we will let the runnerJob return from
-                    // runRecomposeAndApplyChanges normally and consider ourselves shut down
-                    // immediately.
-                    if (!isClosed) {
-                        // This is the job hosting frameContinuation; no need to resume it otherwise
-                        runnerJob.cancel(cancellation)
-                    } else if (workContinuation != null) {
-                        continuationToResume = workContinuation
-                    }
-                    workContinuation = null
-                    runnerJob.invokeOnCompletion { runnerJobCause ->
-                        synchronized(stateLock) {
-                            closeCause = throwable?.apply {
-                                runnerJobCause
-                                    ?.takeIf { it !is CancellationException }
-                                    ?.let { addSuppressed(it) }
-                            }
-                            _state.value = State.ShutDown
+                var continuationToResume: CancellableContinuation<Unit>? = null
+                synchronized(stateLock) {
+                    val runnerJob = runnerJob
+                    if (runnerJob != null) {
+                        _state.value = State.ShuttingDown
+                        // If the recomposer is closed we will let the runnerJob return from
+                        // runRecomposeAndApplyChanges normally and consider ourselves shut down
+                        // immediately.
+                        if (!isClosed) {
+                            // This is the job hosting frameContinuation; no need to resume it
+                            // otherwise
+                            runnerJob.cancel(cancellation)
+                        } else if (workContinuation != null) {
+                            continuationToResume = workContinuation
                         }
+                        workContinuation = null
+                        runnerJob.invokeOnCompletion { runnerJobCause ->
+                            synchronized(stateLock) {
+                                closeCause =
+                                    throwable?.apply {
+                                        runnerJobCause
+                                            ?.takeIf { it !is CancellationException }
+                                            ?.let { addSuppressed(it) }
+                                    }
+                                _state.value = State.ShutDown
+                            }
+                        }
+                    } else {
+                        closeCause = cancellation
+                        _state.value = State.ShutDown
                     }
-                } else {
-                    closeCause = cancellation
-                    _state.value = State.ShutDown
                 }
+                continuationToResume?.resume(Unit)
             }
-            continuationToResume?.resume(Unit)
         }
-    }
 
-    /**
-     * The [effectCoroutineContext] is derived from the parameter of the same name.
-     */
+    /** The [effectCoroutineContext] is derived from the parameter of the same name. */
     override val effectCoroutineContext: CoroutineContext =
         effectCoroutineContext + broadcastFrameClock + effectJob
 
     internal override val recomposeCoroutineContext: CoroutineContext
         get() = EmptyCoroutineContext
 
-    private val hasBroadcastFrameClockAwaitersLocked: Boolean get() =
-        !frameClockPaused && broadcastFrameClock.hasAwaiters
+    private val hasBroadcastFrameClockAwaitersLocked: Boolean
+        get() = !frameClockPaused && broadcastFrameClock.hasAwaiters
 
-    private val hasBroadcastFrameClockAwaiters: Boolean get() =
-        synchronized(stateLock) { hasBroadcastFrameClockAwaitersLocked }
+    private val hasBroadcastFrameClockAwaiters: Boolean
+        get() = synchronized(stateLock) { hasBroadcastFrameClockAwaitersLocked }
+
     /**
-     * Determine the new value of [_state]. Call only while locked on [stateLock].
-     * If it returns a continuation, that continuation should be resumed after releasing the lock.
+     * Determine the new value of [_state]. Call only while locked on [stateLock]. If it returns a
+     * continuation, that continuation should be resumed after releasing the lock.
      */
     private fun deriveStateLocked(): CancellableContinuation<Unit>? {
         if (_state.value <= State.ShuttingDown) {
@@ -316,50 +314,42 @@
             return null
         }
 
-        val newState = when {
-            errorState != null -> {
-                State.Inactive
+        val newState =
+            when {
+                errorState != null -> {
+                    State.Inactive
+                }
+                runnerJob == null -> {
+                    snapshotInvalidations = MutableScatterSet()
+                    compositionInvalidations.clear()
+                    if (hasBroadcastFrameClockAwaitersLocked) State.InactivePendingWork
+                    else State.Inactive
+                }
+                compositionInvalidations.isNotEmpty() ||
+                    snapshotInvalidations.isNotEmpty() ||
+                    compositionsAwaitingApply.isNotEmpty() ||
+                    compositionValuesAwaitingInsert.isNotEmpty() ||
+                    concurrentCompositionsOutstanding > 0 ||
+                    hasBroadcastFrameClockAwaitersLocked -> State.PendingWork
+                else -> State.Idle
             }
-            runnerJob == null -> {
-                snapshotInvalidations = MutableScatterSet()
-                compositionInvalidations.clear()
-                if (hasBroadcastFrameClockAwaitersLocked) State.InactivePendingWork
-                else State.Inactive
-            }
-            compositionInvalidations.isNotEmpty() ||
-                snapshotInvalidations.isNotEmpty() ||
-                compositionsAwaitingApply.isNotEmpty() ||
-                compositionValuesAwaitingInsert.isNotEmpty() ||
-                concurrentCompositionsOutstanding > 0 ||
-                hasBroadcastFrameClockAwaitersLocked -> State.PendingWork
-            else -> State.Idle
-        }
 
         _state.value = newState
         return if (newState == State.PendingWork) {
-            workContinuation.also {
-                workContinuation = null
-            }
+            workContinuation.also { workContinuation = null }
         } else null
     }
 
-    /**
-     * `true` if there is still work to do for an active caller of [runRecomposeAndApplyChanges]
-     */
+    /** `true` if there is still work to do for an active caller of [runRecomposeAndApplyChanges] */
     private val shouldKeepRecomposing: Boolean
-        get() = synchronized(stateLock) { !isClosed } ||
-            effectJob.children.any { it.isActive }
+        get() = synchronized(stateLock) { !isClosed } || effectJob.children.any { it.isActive }
 
-    /**
-     * The current [State] of this [Recomposer]. See each [State] value for its meaning.
-     */
+    /** The current [State] of this [Recomposer]. See each [State] value for its meaning. */
     @Deprecated("Replaced by currentState as a StateFlow", ReplaceWith("currentState"))
     public val state: Flow<State>
         get() = currentState
 
-    /**
-     * The current [State] of this [Recomposer], available synchronously.
-     */
+    /** The current [State] of this [Recomposer], available synchronously. */
     public val currentState: StateFlow<State>
         get() = _state
 
@@ -368,46 +358,43 @@
     private inner class RecomposerInfoImpl : RecomposerInfo {
         override val state: Flow<State>
             get() = this@Recomposer.currentState
+
         override val hasPendingWork: Boolean
             get() = this@Recomposer.hasPendingWork
+
         override val changeCount: Long
             get() = this@Recomposer.changeCount
+
         val currentError: RecomposerErrorInfo?
-            get() = synchronized(stateLock) {
-                this@Recomposer.errorState
-            }
+            get() = synchronized(stateLock) { this@Recomposer.errorState }
 
         fun invalidateGroupsWithKey(key: Int) {
-            val compositions: List<ControlledComposition> = synchronized(stateLock) {
-                knownCompositions
-            }
+            val compositions: List<ControlledComposition> =
+                synchronized(stateLock) { knownCompositions }
             compositions
                 .fastMapNotNull { it as? CompositionImpl }
                 .fastForEach { it.invalidateGroupsWithKey(key) }
         }
+
         fun saveStateAndDisposeForHotReload(): List<HotReloadable> {
-            val compositions: List<ControlledComposition> = synchronized(stateLock) {
-                knownCompositions
-            }
+            val compositions: List<ControlledComposition> =
+                synchronized(stateLock) { knownCompositions }
             return compositions
                 .fastMapNotNull { it as? CompositionImpl }
                 .fastMap { HotReloadable(it).apply { clearContent() } }
         }
 
-        fun resetErrorState(): RecomposerErrorState? =
-            this@Recomposer.resetErrorState()
+        fun resetErrorState(): RecomposerErrorState? = this@Recomposer.resetErrorState()
 
-        fun retryFailedCompositions() =
-            this@Recomposer.retryFailedCompositions()
+        fun retryFailedCompositions() = this@Recomposer.retryFailedCompositions()
     }
 
-    private class HotReloadable(
-        private val composition: CompositionImpl
-    ) {
+    private class HotReloadable(private val composition: CompositionImpl) {
         private var composable: @Composable () -> Unit = composition.composable
+
         fun clearContent() {
             if (composition.isRoot) {
-                composition.setContent { }
+                composition.setContent {}
             }
         }
 
@@ -429,26 +416,23 @@
 
     private val recomposerInfo = RecomposerInfoImpl()
 
-    /**
-     * Obtain a read-only [RecomposerInfo] for this [Recomposer].
-     */
+    /** Obtain a read-only [RecomposerInfo] for this [Recomposer]. */
     fun asRecomposerInfo(): RecomposerInfo = recomposerInfo
 
     /**
-     * Propagate all invalidations from `snapshotInvalidations` to all the known
-     * compositions.
+     * Propagate all invalidations from `snapshotInvalidations` to all the known compositions.
      *
      * @return `true` if the frame has work to do (e.g. [hasFrameWorkLocked])
      */
     private fun recordComposerModifications(): Boolean {
-        val changes = synchronized(stateLock) {
-            if (snapshotInvalidations.isEmpty()) return hasFrameWorkLocked
-            snapshotInvalidations.wrapIntoSet()
-                .also { snapshotInvalidations = MutableScatterSet() }
-        }
-        val compositions = synchronized(stateLock) {
-            knownCompositions
-        }
+        val changes =
+            synchronized(stateLock) {
+                if (snapshotInvalidations.isEmpty()) return hasFrameWorkLocked
+                snapshotInvalidations.wrapIntoSet().also {
+                    snapshotInvalidations = MutableScatterSet()
+                }
+            }
+        val compositions = synchronized(stateLock) { knownCompositions }
         var complete = false
         try {
             run {
@@ -460,18 +444,14 @@
                     if (_state.value <= State.ShuttingDown) return@run
                 }
             }
-            synchronized(stateLock) {
-                snapshotInvalidations = MutableScatterSet()
-            }
+            synchronized(stateLock) { snapshotInvalidations = MutableScatterSet() }
             complete = true
         } finally {
             if (!complete) {
                 // If the previous loop was not complete, we have not sent all of theses
                 // changes to all the composers so try again after the exception that caused
                 // the early exit is handled and we can then retry sending the changes.
-                synchronized(stateLock) {
-                    snapshotInvalidations.addAll(changes)
-                }
+                synchronized(stateLock) { snapshotInvalidations.addAll(changes) }
             }
         }
         return synchronized(stateLock) {
@@ -485,11 +465,13 @@
     private inline fun recordComposerModifications(
         onEachInvalidComposition: (ControlledComposition) -> Unit
     ) {
-        val changes = synchronized(stateLock) {
-            snapshotInvalidations.also {
-                if (it.isNotEmpty()) snapshotInvalidations = MutableScatterSet()
-            }
-        }.wrapIntoSet()
+        val changes =
+            synchronized(stateLock) {
+                    snapshotInvalidations.also {
+                        if (it.isNotEmpty()) snapshotInvalidations = MutableScatterSet()
+                    }
+                }
+                .wrapIntoSet()
         if (changes.isNotEmpty()) {
             knownCompositions.fastForEach { composition ->
                 composition.recordModificationsOf(changes)
@@ -515,15 +497,15 @@
     }
 
     /**
-     * Await the invalidation of any associated [Composer]s, recompose them, and apply their
-     * changes to their associated [Composition]s if recomposition is successful.
+     * Await the invalidation of any associated [Composer]s, recompose them, and apply their changes
+     * to their associated [Composition]s if recomposition is successful.
      *
      * While [runRecomposeAndApplyChanges] is running, [awaitIdle] will suspend until there are no
      * more invalid composers awaiting recomposition.
      *
      * This method will not return unless the [Recomposer] is [close]d and all effects in managed
-     * compositions complete.
-     * Unhandled failure exceptions from child coroutines will be thrown by this method.
+     * compositions complete. Unhandled failure exceptions from child coroutines will be thrown by
+     * this method.
      */
     suspend fun runRecomposeAndApplyChanges() = recompositionRunner { parentFrameClock ->
         val toRecompose = mutableListOf<ControlledComposition>()
@@ -604,9 +586,7 @@
                     // composers to work on
                     recordComposerModifications()
                     synchronized(stateLock) {
-                        compositionInvalidations.forEach {
-                            toRecompose += it
-                        }
+                        compositionInvalidations.forEach { toRecompose += it }
                         compositionInvalidations.clear()
                     }
 
@@ -616,9 +596,7 @@
                     while (toRecompose.isNotEmpty() || toInsert.isNotEmpty()) {
                         try {
                             toRecompose.fastForEach { composition ->
-                                performRecompose(composition, modifiedValues)?.let {
-                                    toApply += it
-                                }
+                                performRecompose(composition, modifiedValues)?.let { toApply += it }
                                 alreadyComposed.add(composition)
                             }
                         } catch (e: Exception) {
@@ -638,7 +616,7 @@
                                 knownCompositions.fastForEach { value ->
                                     if (
                                         value !in alreadyComposed &&
-                                        value.observesAnyOf(modifiedValuesSet)
+                                            value.observesAnyOf(modifiedValuesSet)
                                     ) {
                                         toRecompose += value
                                     }
@@ -681,12 +659,8 @@
                             // We could do toComplete += toApply but doing it like below
                             // avoids unnecessary allocations since toApply is a mutable list
                             // toComplete += toApply
-                            toApply.fastForEach { composition ->
-                                toComplete.add(composition)
-                            }
-                            toApply.fastForEach { composition ->
-                                composition.applyChanges()
-                            }
+                            toApply.fastForEach { composition -> toComplete.add(composition) }
+                            toApply.fastForEach { composition -> composition.applyChanges() }
                         } catch (e: Exception) {
                             processCompositionError(e)
                             clearRecompositionState()
@@ -699,9 +673,7 @@
                     if (toLateApply.isNotEmpty()) {
                         try {
                             toComplete += toLateApply
-                            toLateApply.forEach { composition ->
-                                composition.applyLateChanges()
-                            }
+                            toLateApply.forEach { composition -> composition.applyLateChanges() }
                         } catch (e: Exception) {
                             processCompositionError(e)
                             clearRecompositionState()
@@ -713,9 +685,7 @@
 
                     if (toComplete.isNotEmpty()) {
                         try {
-                            toComplete.forEach { composition ->
-                                composition.changesApplied()
-                            }
+                            toComplete.forEach { composition -> composition.changesApplied() }
                         } catch (e: Exception) {
                             processCompositionError(e)
                             clearRecompositionState()
@@ -725,9 +695,7 @@
                         }
                     }
 
-                    synchronized(stateLock) {
-                        deriveStateLocked()
-                    }
+                    synchronized(stateLock) { deriveStateLocked() }
 
                     // Ensure any state objects that were written during apply changes, e.g. nodes
                     // with state-backed properties, get sent apply notifications to invalidate
@@ -762,10 +730,7 @@
                 compositionValuesRemoved.clear()
                 compositionValueStatesAvailable.clear()
 
-                errorState = RecomposerErrorState(
-                    recoverable = recoverable,
-                    cause = e
-                )
+                errorState = RecomposerErrorState(recoverable = recoverable, cause = e)
 
                 if (failedInitialComposition != null) {
                     recordFailedCompositionLocked(failedInitialComposition)
@@ -812,21 +777,22 @@
     }
 
     private fun resetErrorState(): RecomposerErrorState? {
-        val errorState = synchronized(stateLock) {
-            val error = errorState
-            if (error != null) {
-                errorState = null
-                deriveStateLocked()
+        val errorState =
+            synchronized(stateLock) {
+                val error = errorState
+                if (error != null) {
+                    errorState = null
+                    deriveStateLocked()
+                }
+                error
             }
-            error
-        }
         return errorState
     }
 
     private fun retryFailedCompositions() {
-        val compositionsToRetry = synchronized(stateLock) {
-            failedCompositions.also { failedCompositions = null }
-        } ?: return
+        val compositionsToRetry =
+            synchronized(stateLock) { failedCompositions.also { failedCompositions = null } }
+                ?: return
         try {
             while (compositionsToRetry.isNotEmpty()) {
                 val composition = compositionsToRetry.removeLast()
@@ -842,19 +808,16 @@
                 // If we did not complete the last list then add the remaining compositions back
                 // into the failedCompositions list
                 synchronized(stateLock) {
-                    compositionsToRetry.fastForEach {
-                        recordFailedCompositionLocked(it)
-                    }
+                    compositionsToRetry.fastForEach { recordFailedCompositionLocked(it) }
                 }
             }
         }
     }
 
     private fun recordFailedCompositionLocked(composition: ControlledComposition) {
-        val failedCompositions = failedCompositions
-            ?: mutableListOf<ControlledComposition>().also {
-                failedCompositions = it
-            }
+        val failedCompositions =
+            failedCompositions
+                ?: mutableListOf<ControlledComposition>().also { failedCompositions = it }
 
         if (composition !in failedCompositions) {
             failedCompositions += composition
@@ -863,8 +826,8 @@
     }
 
     /**
-     * Await the invalidation of any associated [Composer]s, recompose them, and apply their
-     * changes to their associated [Composition]s if recomposition is successful.
+     * Await the invalidation of any associated [Composer]s, recompose them, and apply their changes
+     * to their associated [Composition]s if recomposition is successful.
      *
      * While [runRecomposeConcurrentlyAndApplyChanges] is running, [awaitIdle] will suspend until
      * there are no more invalid composers awaiting recomposition.
@@ -873,8 +836,8 @@
      * [recomposeCoroutineContext] must not contain a [Job].
      *
      * This method will not return unless the [Recomposer] is [close]d and all effects in managed
-     * compositions complete.
-     * Unhandled failure exceptions from child coroutines will be thrown by this method.
+     * compositions complete. Unhandled failure exceptions from child coroutines will be thrown by
+     * this method.
      */
     @ExperimentalComposeApi
     suspend fun runRecomposeConcurrentlyAndApplyChanges(
@@ -884,9 +847,8 @@
             "recomposeCoroutineContext may not contain a Job; found " +
                 recomposeCoroutineContext[Job]
         }
-        val recomposeCoroutineScope = CoroutineScope(
-            coroutineContext + recomposeCoroutineContext + Job(coroutineContext.job)
-        )
+        val recomposeCoroutineScope =
+            CoroutineScope(coroutineContext + recomposeCoroutineContext + Job(coroutineContext.job))
         val frameSignal = ProduceFrameSignal()
         val frameLoop = launch { runFrameLoop(parentFrameClock, frameSignal) }
         while (shouldKeepRecomposing) {
@@ -894,21 +856,21 @@
 
             // Don't await a new frame if we don't have frame-scoped work
             recordComposerModifications { composition ->
-                synchronized(stateLock) {
-                    concurrentCompositionsOutstanding++
-                }
+                synchronized(stateLock) { concurrentCompositionsOutstanding++ }
                 recomposeCoroutineScope.launch(composition.recomposeCoroutineContext) {
                     val changedComposition = performRecompose(composition, null)
                     synchronized(stateLock) {
-                        changedComposition?.let { compositionsAwaitingApply += it }
-                        concurrentCompositionsOutstanding--
-                        deriveStateLocked()
-                    }?.resume(Unit)
+                            changedComposition?.let { compositionsAwaitingApply += it }
+                            concurrentCompositionsOutstanding--
+                            deriveStateLocked()
+                        }
+                        ?.resume(Unit)
                 }
             }
             synchronized(stateLock) {
-                if (hasConcurrentFrameWorkLocked) frameSignal.requestFrameLocked() else null
-            }?.resume(Unit)
+                    if (hasConcurrentFrameWorkLocked) frameSignal.requestFrameLocked() else null
+                }
+                ?.resume(Unit)
         }
         recomposeCoroutineScope.coroutineContext.job.cancelAndJoin()
         frameLoop.cancelAndJoin()
@@ -959,9 +921,7 @@
                     val modifiedValues = MutableScatterSet<Any>()
                     try {
                         toRecompose.fastForEach { composer ->
-                            performRecompose(composer, modifiedValues)?.let {
-                                toApply += it
-                            }
+                            performRecompose(composer, modifiedValues)?.let { toApply += it }
                         }
                     } finally {
                         toRecompose.clear()
@@ -973,27 +933,24 @@
 
                     // Perform apply changes
                     try {
-                        toApply.fastForEach { composition ->
-                            composition.applyChanges()
-                        }
+                        toApply.fastForEach { composition -> composition.applyChanges() }
                     } finally {
                         toApply.clear()
                     }
 
-                    synchronized(stateLock) {
-                        deriveStateLocked()
-                    }
+                    synchronized(stateLock) { deriveStateLocked() }
                 }
             }
         }
     }
 
     private val hasSchedulingWork: Boolean
-        get() = synchronized(stateLock) {
-            snapshotInvalidations.isNotEmpty() ||
-                compositionInvalidations.isNotEmpty() ||
-                hasBroadcastFrameClockAwaitersLocked
-        }
+        get() =
+            synchronized(stateLock) {
+                snapshotInvalidations.isNotEmpty() ||
+                    compositionInvalidations.isNotEmpty() ||
+                    hasBroadcastFrameClockAwaitersLocked
+            }
 
     private suspend fun awaitWorkAvailable() {
         if (!hasSchedulingWork) {
@@ -1002,13 +959,14 @@
             // an error message
             suspendCancellableCoroutine<Unit> { co ->
                 synchronized(stateLock) {
-                    if (hasSchedulingWork) {
-                        co
-                    } else {
-                        workContinuation = co
-                        null
+                        if (hasSchedulingWork) {
+                            co
+                        } else {
+                            workContinuation = co
+                            null
+                        }
                     }
-                }?.resume(Unit)
+                    ?.resume(Unit)
             }
         }
     }
@@ -1026,37 +984,36 @@
             // Observe snapshot changes and propagate them to known composers only from
             // this caller's dispatcher, never working with the same composer in parallel.
             // unregisterApplyObserver is called as part of the big finally below
-            val unregisterApplyObserver = Snapshot.registerApplyObserver { changed, _ ->
-                synchronized(stateLock) {
-                    if (_state.value >= State.Idle) {
-                        val snapshotInvalidations = snapshotInvalidations
-                        changed.fastForEach {
-                            if (
-                                it is StateObjectImpl &&
-                                    !it.isReadIn(ReaderKind.Composition)
-                            ) {
-                                // continue if we know that state is never read in composition
-                                return@fastForEach
-                            }
-                            snapshotInvalidations.add(it)
+            val unregisterApplyObserver =
+                Snapshot.registerApplyObserver { changed, _ ->
+                    synchronized(stateLock) {
+                            if (_state.value >= State.Idle) {
+                                val snapshotInvalidations = snapshotInvalidations
+                                changed.fastForEach {
+                                    if (
+                                        it is StateObjectImpl &&
+                                            !it.isReadIn(ReaderKind.Composition)
+                                    ) {
+                                        // continue if we know that state is never read in
+                                        // composition
+                                        return@fastForEach
+                                    }
+                                    snapshotInvalidations.add(it)
+                                }
+                                deriveStateLocked()
+                            } else null
                         }
-                        deriveStateLocked()
-                    } else null
-                }?.resume(Unit)
-            }
+                        ?.resume(Unit)
+                }
 
             addRunning(recomposerInfo)
 
             try {
                 // Invalidate all registered composers when we start since we weren't observing
                 // snapshot changes on their behalf. Assume anything could have changed.
-                synchronized(stateLock) {
-                    knownCompositions
-                }.fastForEach { it.invalidateAll() }
+                synchronized(stateLock) { knownCompositions }.fastForEach { it.invalidateAll() }
 
-                coroutineScope {
-                    block(parentFrameClock)
-                }
+                coroutineScope { block(parentFrameClock) }
             } finally {
                 unregisterApplyObserver.dispose()
                 synchronized(stateLock) {
@@ -1072,12 +1029,12 @@
 
     /**
      * Permanently shut down this [Recomposer] for future use. [currentState] will immediately
-     * reflect [State.ShuttingDown] (or a lower state) before this call returns.
-     * All ongoing recompositions will stop, new composer invalidations with this [Recomposer] at
-     * the root will no longer occur, and any [LaunchedEffect]s currently running in compositions
-     * managed by this [Recomposer] will be cancelled. Any [rememberCoroutineScope] scopes from
-     * compositions managed by this [Recomposer] will also be cancelled. See [join] to await the
-     * completion of all of these outstanding tasks.
+     * reflect [State.ShuttingDown] (or a lower state) before this call returns. All ongoing
+     * recompositions will stop, new composer invalidations with this [Recomposer] at the root will
+     * no longer occur, and any [LaunchedEffect]s currently running in compositions managed by this
+     * [Recomposer] will be cancelled. Any [rememberCoroutineScope] scopes from compositions managed
+     * by this [Recomposer] will also be cancelled. See [join] to await the completion of all of
+     * these outstanding tasks.
      */
     fun cancel() {
         // Move to State.ShuttingDown immediately rather than waiting for effectJob to join
@@ -1095,22 +1052,17 @@
     }
 
     /**
-     * Close this [Recomposer]. Once all effects launched by managed compositions complete,
-     * any active call to [runRecomposeAndApplyChanges] will return normally and this [Recomposer]
-     * will be [State.ShutDown]. See [join] to await the completion of all of these outstanding
-     * tasks.
+     * Close this [Recomposer]. Once all effects launched by managed compositions complete, any
+     * active call to [runRecomposeAndApplyChanges] will return normally and this [Recomposer] will
+     * be [State.ShutDown]. See [join] to await the completion of all of these outstanding tasks.
      */
     fun close() {
         if (effectJob.complete()) {
-            synchronized(stateLock) {
-                isClosed = true
-            }
+            synchronized(stateLock) { isClosed = true }
         }
     }
 
-    /**
-     * Await the completion of a [cancel] operation.
-     */
+    /** Await the completion of a [cancel] operation. */
     suspend fun join() {
         currentState.first { it == State.ShutDown }
     }
@@ -1121,9 +1073,7 @@
     ) {
         val composerWasComposing = composition.isComposing
         try {
-            composing(composition, null) {
-                composition.composeContent(content)
-            }
+            composing(composition, null) { composition.composeContent(content) }
         } catch (e: Exception) {
             processCompositionError(e, composition, recoverable = true)
             return
@@ -1193,9 +1143,12 @@
         composition: ControlledComposition,
         modifiedValues: MutableScatterSet<Any>?
     ): ControlledComposition? {
-        if (composition.isComposing ||
-            composition.isDisposed ||
-            compositionsRemoved?.contains(composition) == true) return null
+        if (
+            composition.isComposing ||
+                composition.isDisposed ||
+                compositionsRemoved?.contains(composition) == true
+        )
+            return null
 
         return if (
             composing(composition, modifiedValues) {
@@ -1208,7 +1161,9 @@
                 }
                 composition.recompose()
             }
-        ) composition else null
+        )
+            composition
+        else null
     }
 
     private fun performInsertValues(
@@ -1221,31 +1176,34 @@
             composing(composition, modifiedValues) {
                 // Map insert movable content to movable content states that have been released
                 // during `performRecompose`.
-                val pairs = synchronized(stateLock) {
-                    refs.fastMap { reference ->
-                        reference to
-                            compositionValuesRemoved.removeLastMultiValue(reference.content)
+                val pairs =
+                    synchronized(stateLock) {
+                        refs.fastMap { reference ->
+                            reference to
+                                compositionValuesRemoved.removeLastMultiValue(reference.content)
+                        }
                     }
-                }
 
                 // Avoid mixing creating new content with moving content as the moved content
                 // may release content when it is moved as it is recomposed when move.
-                val toInsert = if (
-                    pairs.fastAll { it.second == null } || pairs.fastAll { it.second != null }
-                ) { pairs } else {
-                    // Return the content not moving to the awaiting list. These will come back
-                    // here in the next iteration of the caller's loop and either have content
-                    // to move or by still needing to create the content.
-                    val toReturn = pairs.fastMapNotNull { item ->
-                        if (item.second == null) item.first else null
-                    }
-                    synchronized(stateLock) {
-                        compositionValuesAwaitingInsert += toReturn
-                    }
+                val toInsert =
+                    if (
+                        pairs.fastAll { it.second == null } || pairs.fastAll { it.second != null }
+                    ) {
+                        pairs
+                    } else {
+                        // Return the content not moving to the awaiting list. These will come back
+                        // here in the next iteration of the caller's loop and either have content
+                        // to move or by still needing to create the content.
+                        val toReturn =
+                            pairs.fastMapNotNull { item ->
+                                if (item.second == null) item.first else null
+                            }
+                        synchronized(stateLock) { compositionValuesAwaitingInsert += toReturn }
 
-                    // Only insert the moving content this time
-                    pairs.fastFilterIndexed { _, item -> item.second != null }
-                }
+                        // Only insert the moving content this time
+                        pairs.fastFilterIndexed { _, item -> item.second != null }
+                    }
 
                 // toInsert is guaranteed to be not empty as,
                 // 1) refs is guaranteed to be not empty as a condition of groupBy
@@ -1262,17 +1220,17 @@
     }
 
     private fun discardUnusedValues() {
-        val unusedValues = synchronized(stateLock) {
-            if (compositionValuesRemoved.isNotEmpty()) {
-                val references = compositionValuesRemoved.values.flatten()
-                compositionValuesRemoved.clear()
-                val unusedValues = references.fastMap {
-                    it to compositionValueStatesAvailable[it]
-                }
-                compositionValueStatesAvailable.clear()
-                unusedValues
-            } else emptyList()
-        }
+        val unusedValues =
+            synchronized(stateLock) {
+                if (compositionValuesRemoved.isNotEmpty()) {
+                    val references = compositionValuesRemoved.values.flatten()
+                    compositionValuesRemoved.clear()
+                    val unusedValues =
+                        references.fastMap { it to compositionValueStatesAvailable[it] }
+                    compositionValueStatesAvailable.clear()
+                    unusedValues
+                } else emptyList()
+            }
         unusedValues.fastForEach { (reference, state) ->
             if (state != null) {
                 reference.composition.disposeUnusedMovableContent(state)
@@ -1299,9 +1257,11 @@
         modifiedValues: MutableScatterSet<Any>?,
         block: () -> T
     ): T {
-        val snapshot = Snapshot.takeMutableSnapshot(
-            readObserverOf(composition), writeObserverOf(composition, modifiedValues)
-        )
+        val snapshot =
+            Snapshot.takeMutableSnapshot(
+                readObserverOf(composition),
+                writeObserverOf(composition, modifiedValues)
+            )
         try {
             return snapshot.enter(block)
         } finally {
@@ -1324,17 +1284,18 @@
     }
 
     /**
-     * `true` if this [Recomposer] has any pending work scheduled, regardless of whether or not
-     * it is currently [running][runRecomposeAndApplyChanges].
+     * `true` if this [Recomposer] has any pending work scheduled, regardless of whether or not it
+     * is currently [running][runRecomposeAndApplyChanges].
      */
     val hasPendingWork: Boolean
-        get() = synchronized(stateLock) {
-            snapshotInvalidations.isNotEmpty() ||
-                compositionInvalidations.isNotEmpty() ||
-                concurrentCompositionsOutstanding > 0 ||
-                compositionsAwaitingApply.isNotEmpty() ||
-                hasBroadcastFrameClockAwaitersLocked
-        }
+        get() =
+            synchronized(stateLock) {
+                snapshotInvalidations.isNotEmpty() ||
+                    compositionInvalidations.isNotEmpty() ||
+                    concurrentCompositionsOutstanding > 0 ||
+                    compositionsAwaitingApply.isNotEmpty() ||
+                    hasBroadcastFrameClockAwaitersLocked
+            }
 
     private val hasFrameWorkLocked: Boolean
         get() = compositionInvalidations.isNotEmpty() || hasBroadcastFrameClockAwaitersLocked
@@ -1343,9 +1304,9 @@
         get() = compositionsAwaitingApply.isNotEmpty() || hasBroadcastFrameClockAwaitersLocked
 
     /**
-     * Suspends until the currently pending recomposition frame is complete.
-     * Any recomposition for this recomposer triggered by actions before this call begins
-     * will be complete and applied (if recomposition was successful) when this call returns.
+     * Suspends until the currently pending recomposition frame is complete. Any recomposition for
+     * this recomposer triggered by actions before this call begins will be complete and applied (if
+     * recomposition was successful) when this call returns.
      *
      * If [runRecomposeAndApplyChanges] is not currently running the [Recomposer] is considered idle
      * and this method will not suspend.
@@ -1355,8 +1316,8 @@
     }
 
     /**
-     * Pause broadcasting the frame clock while recomposing. This effectively pauses animations,
-     * or any other use of the [withFrameNanos], while the frame clock is paused.
+     * Pause broadcasting the frame clock while recomposing. This effectively pauses animations, or
+     * any other use of the [withFrameNanos], while the frame clock is paused.
      *
      * [pauseCompositionFrameClock] should be called when the recomposer is not being displayed for
      * some reason such as not being the current activity in Android, for example.
@@ -1365,27 +1326,26 @@
      * frame clock is already paused is a no-op).
      */
     fun pauseCompositionFrameClock() {
-        synchronized(stateLock) {
-            frameClockPaused = true
-        }
+        synchronized(stateLock) { frameClockPaused = true }
     }
 
     /**
      * Resume broadcasting the frame clock after is has been paused. Pending calls to
      * [withFrameNanos] will start receiving frame clock broadcasts at the beginning of the frame
-     * and a frame will be requested if there are pending calls to [withFrameNanos] if a frame
-     * has not already been scheduled.
+     * and a frame will be requested if there are pending calls to [withFrameNanos] if a frame has
+     * not already been scheduled.
      *
      * Calls to [resumeCompositionFrameClock] are thread-safe and idempotent (calling it when the
      * frame clock is running is a no-op).
      */
     fun resumeCompositionFrameClock() {
         synchronized(stateLock) {
-            if (frameClockPaused) {
-                frameClockPaused = false
-                deriveStateLocked()
-            } else null
-        }?.resume(Unit)
+                if (frameClockPaused) {
+                    frameClockPaused = false
+                    deriveStateLocked()
+                } else null
+            }
+            ?.resume(Unit)
     }
 
     // Recomposer always starts with a constant compound hash
@@ -1421,25 +1381,28 @@
 
     internal override fun invalidate(composition: ControlledComposition) {
         synchronized(stateLock) {
-            if (composition !in compositionInvalidations) {
-                compositionInvalidations += composition
-                deriveStateLocked()
-            } else null
-        }?.resume(Unit)
+                if (composition !in compositionInvalidations) {
+                    compositionInvalidations += composition
+                    deriveStateLocked()
+                } else null
+            }
+            ?.resume(Unit)
     }
 
     internal override fun invalidateScope(scope: RecomposeScopeImpl) {
         synchronized(stateLock) {
-            snapshotInvalidations.add(scope)
-            deriveStateLocked()
-        }?.resume(Unit)
+                snapshotInvalidations.add(scope)
+                deriveStateLocked()
+            }
+            ?.resume(Unit)
     }
 
     internal override fun insertMovableContent(reference: MovableContentStateReference) {
         synchronized(stateLock) {
-            compositionValuesAwaitingInsert += reference
-            deriveStateLocked()
-        }?.resume(Unit)
+                compositionValuesAwaitingInsert += reference
+                deriveStateLocked()
+            }
+            ?.resume(Unit)
     }
 
     internal override fun deletedMovableContent(reference: MovableContentStateReference) {
@@ -1452,17 +1415,14 @@
         reference: MovableContentStateReference,
         data: MovableContentState
     ) {
-        synchronized(stateLock) {
-            compositionValueStatesAvailable[reference] = data
-        }
+        synchronized(stateLock) { compositionValueStatesAvailable[reference] = data }
     }
 
     internal override fun reportRemovedComposition(composition: ControlledComposition) {
         synchronized(stateLock) {
-            val compositionsRemoved = compositionsRemoved
-                ?: mutableSetOf<ControlledComposition>().also {
-                    compositionsRemoved = it
-                }
+            val compositionsRemoved =
+                compositionsRemoved
+                    ?: mutableSetOf<ControlledComposition>().also { compositionsRemoved = it }
             compositionsRemoved.add(composition)
         }
     }
@@ -1470,14 +1430,12 @@
     override fun movableContentStateResolve(
         reference: MovableContentStateReference
     ): MovableContentState? =
-        synchronized(stateLock) {
-            compositionValueStatesAvailable.remove(reference)
-        }
+        synchronized(stateLock) { compositionValueStatesAvailable.remove(reference) }
 
     /**
      * hack: the companion object is thread local in Kotlin/Native to avoid freezing
-     * [_runningRecomposers] with the current memory model. As a side effect,
-     * recomposers are now forced to be single threaded in Kotlin/Native targets.
+     * [_runningRecomposers] with the current memory model. As a side effect, recomposers are now
+     * forced to be single threaded in Kotlin/Native targets.
      *
      * This annotation WILL BE REMOVED with the new memory model of Kotlin/Native.
      */
@@ -1491,8 +1449,7 @@
 
         /**
          * An observable [Set] of [RecomposerInfo]s for currently
-         * [running][runRecomposeAndApplyChanges] [Recomposer]s.
-         * Emitted sets are immutable.
+         * [running][runRecomposeAndApplyChanges] [Recomposer]s. Emitted sets are immutable.
          */
         val runningRecomposers: StateFlow<Set<RecomposerInfo>>
             get() = _runningRecomposers
@@ -1529,18 +1486,13 @@
             // to ensure that we pause recompositions before this call.
             _hotReloadEnabled.set(true)
 
-            _runningRecomposers.value.forEach {
-                it.resetErrorState()
-            }
+            _runningRecomposers.value.forEach { it.resetErrorState() }
 
-            @Suppress("UNCHECKED_CAST")
-            val holders = token as List<HotReloadable>
+            @Suppress("UNCHECKED_CAST") val holders = token as List<HotReloadable>
             holders.fastForEach { it.resetContent() }
             holders.fastForEach { it.recompose() }
 
-            _runningRecomposers.value.forEach {
-                it.retryFailedCompositions()
-            }
+            _runningRecomposers.value.forEach { it.retryFailedCompositions() }
         }
 
         internal fun invalidateGroupsWithKey(key: Int) {
@@ -1559,21 +1511,15 @@
         }
 
         internal fun getCurrentErrors(): List<RecomposerErrorInfo> =
-            _runningRecomposers.value.mapNotNull {
-                it.currentError
-            }
+            _runningRecomposers.value.mapNotNull { it.currentError }
 
         internal fun clearErrors() {
-            _runningRecomposers.value.mapNotNull {
-                it.resetErrorState()
-            }
+            _runningRecomposers.value.mapNotNull { it.resetErrorState() }
         }
     }
 }
 
-/**
- * Sentinel used by [ProduceFrameSignal]
- */
+/** Sentinel used by [ProduceFrameSignal] */
 private val ProduceAnotherFrame = Any()
 private val FramePending = Any()
 
@@ -1587,8 +1533,8 @@
 
     /**
      * Suspend until a frame is requested. After this method returns the signal is in a
-     * [FramePending] state which must be acknowledged by a call to [takeFrameRequestLocked]
-     * once all data that will be used to produce the frame has been claimed.
+     * [FramePending] state which must be acknowledged by a call to [takeFrameRequestLocked] once
+     * all data that will be used to produce the frame has been claimed.
      */
     suspend fun awaitFrameRequest(lock: SynchronizedObject) {
         synchronized(lock) {
@@ -1599,14 +1545,15 @@
         }
         suspendCancellableCoroutine<Unit> { co ->
             synchronized(lock) {
-                if (pendingFrameContinuation === ProduceAnotherFrame) {
-                    pendingFrameContinuation = FramePending
-                    co
-                } else {
-                    pendingFrameContinuation = co
-                    null
+                    if (pendingFrameContinuation === ProduceAnotherFrame) {
+                        pendingFrameContinuation = FramePending
+                        co
+                    } else {
+                        pendingFrameContinuation = co
+                        null
+                    }
                 }
-            }?.resume(Unit)
+                ?.resume(Unit)
         }
     }
 
@@ -1619,19 +1566,21 @@
         pendingFrameContinuation = null
     }
 
-    fun requestFrameLocked(): Continuation<Unit>? = when (val co = pendingFrameContinuation) {
-        is Continuation<*> -> {
-            pendingFrameContinuation = FramePending
-            @Suppress("UNCHECKED_CAST")
-            co as Continuation<Unit>
+    fun requestFrameLocked(): Continuation<Unit>? =
+        when (val co = pendingFrameContinuation) {
+            is Continuation<*> -> {
+                pendingFrameContinuation = FramePending
+                @Suppress("UNCHECKED_CAST")
+                co as Continuation<Unit>
+            }
+            ProduceAnotherFrame,
+            FramePending -> null
+            null -> {
+                pendingFrameContinuation = ProduceAnotherFrame
+                null
+            }
+            else -> error("invalid pendingFrameContinuation $co")
         }
-        ProduceAnotherFrame, FramePending -> null
-        null -> {
-            pendingFrameContinuation = ProduceAnotherFrame
-            null
-        }
-        else -> error("invalid pendingFrameContinuation $co")
-    }
 }
 
 // Allow treating a mutable map of shape MutableMap<K, MutableMap<V>> as a multi-value map
@@ -1639,9 +1588,4 @@
     getOrPut(key) { mutableListOf() }.add(value)
 
 internal fun <K, V> MutableMap<K, MutableList<V>>.removeLastMultiValue(key: K): V? =
-    get(key)?.let { list ->
-        list.removeFirst().also {
-            if (list.isEmpty())
-                remove(key)
-        }
-    }
+    get(key)?.let { list -> list.removeFirst().also { if (list.isEmpty()) remove(key) } }
diff --git a/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/RememberObserver.kt b/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/RememberObserver.kt
index cfa9727..3cb2d66 100644
--- a/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/RememberObserver.kt
+++ b/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/RememberObserver.kt
@@ -20,29 +20,27 @@
  * Objects implementing this interface are notified when they are initially used in a composition
  * and when they are no longer being used.
  *
- * An object is [remembered][onRemembered] by the composition if it is [remember]ed in at least
- * one place in a composition. Compose may implicitly [remember] an object if doing so is
- * required to restart the composition later, such as for composable function parameters. An
- * object is [forgotten][onForgotten] when it is no longer [remember]ed anywhere in that
- * composition. If a single instance is [remember]ed in more than one location in
- * the same composition, its [onRemembered] and [onForgotten] will be called for each location in
- * the composition.
+ * An object is [remembered][onRemembered] by the composition if it is [remember]ed in at least one
+ * place in a composition. Compose may implicitly [remember] an object if doing so is required to
+ * restart the composition later, such as for composable function parameters. An object is
+ * [forgotten][onForgotten] when it is no longer [remember]ed anywhere in that composition. If a
+ * single instance is [remember]ed in more than one location in the same composition, its
+ * [onRemembered] and [onForgotten] will be called for each location in the composition.
  *
- * When objects implementing this interface is remembered and forgotten together,
- * the order of [onForgotten] is guaranteed to be called in the opposite order of [onRemembered].
- * For example, if two objects, A and B are [remember]ed together, A followed by B,
- * [onRemembered] will be called first on A then on B. If they forgotten together then
- * [onForgotten] will be called on B first then on A.
+ * When objects implementing this interface is remembered and forgotten together, the order of
+ * [onForgotten] is guaranteed to be called in the opposite order of [onRemembered]. For example, if
+ * two objects, A and B are [remember]ed together, A followed by B, [onRemembered] will be called
+ * first on A then on B. If they forgotten together then [onForgotten] will be called on B first
+ * then on A.
  *
- * Implementations of [RememberObserver] should generally not expose those object references
- * outside of their immediate usage sites. A [RememberObserver] reference that is propagated to
- * multiple parts of a composition might remain present in the composition for longer than
- * expected if it is remembered (explicitly or implicitly) elsewhere, and a [RememberObserver]
- * that appears more once can have its callback methods called multiple times in no meaningful
- * order and on multiple threads.
+ * Implementations of [RememberObserver] should generally not expose those object references outside
+ * of their immediate usage sites. A [RememberObserver] reference that is propagated to multiple
+ * parts of a composition might remain present in the composition for longer than expected if it is
+ * remembered (explicitly or implicitly) elsewhere, and a [RememberObserver] that appears more once
+ * can have its callback methods called multiple times in no meaningful order and on multiple
+ * threads.
  *
  * An object remembered in only one place in only one composition is guaranteed to,
- *
  * 1. have either [onRemembered] or [onAbandoned] called
  * 2. if [onRemembered] is called, [onForgotten] will eventually be called
  */
diff --git a/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/SlotTable.kt b/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/SlotTable.kt
index b250c76..0e87025 100644
--- a/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/SlotTable.kt
+++ b/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/SlotTable.kt
@@ -82,31 +82,26 @@
 
 internal class SlotTable : CompositionData, Iterable<CompositionGroup> {
     /**
-     * An array to store group information that is stored as groups of [Group_Fields_Size]
-     * elements of the array. The [groups] array can be thought of as an array of an inline
-     * struct.
+     * An array to store group information that is stored as groups of [Group_Fields_Size] elements
+     * of the array. The [groups] array can be thought of as an array of an inline struct.
      */
     var groups = IntArray(0)
         private set
 
-    /**
-     * The number of groups contained in [groups].
-     */
+    /** The number of groups contained in [groups]. */
     var groupsSize = 0
         private set
 
     /**
-     * An array that stores the slots for a group. The slot elements for a group start at the
-     * offset returned by [dataAnchor] of [groups] and continue to the next group's slots or to
-     * [slotsSize] for the last group. When in a writer the [dataAnchor] is an anchor instead of
-     * an index as [slots] might contain a gap.
+     * An array that stores the slots for a group. The slot elements for a group start at the offset
+     * returned by [dataAnchor] of [groups] and continue to the next group's slots or to [slotsSize]
+     * for the last group. When in a writer the [dataAnchor] is an anchor instead of an index as
+     * [slots] might contain a gap.
      */
     var slots = Array<Any?>(0) { null }
         private set
 
-    /**
-     * The number of slots used in [slots].
-     */
+    /** The number of slots used in [slots]. */
     var slotsSize = 0
         private set
 
@@ -118,26 +113,20 @@
 
     private val lock = SynchronizedObject()
 
-    /**
-     * Tracks whether there is an active writer.
-     */
+    /** Tracks whether there is an active writer. */
     internal var writer = false
         private set
 
     /**
-     * An internal version that is incremented whenever a writer is created. This is used to
-     * detect when an iterator created by [CompositionData] is invalid.
+     * An internal version that is incremented whenever a writer is created. This is used to detect
+     * when an iterator created by [CompositionData] is invalid.
      */
     internal var version = 0
 
-    /**
-     * A list of currently active anchors.
-     */
+    /** A list of currently active anchors. */
     internal var anchors: ArrayList<Anchor> = arrayListOf()
 
-    /**
-     * A map of source information to anchor.
-     */
+    /** A map of source information to anchor. */
     internal var sourceInformationMap: HashMap<Anchor, GroupSourceInformation>? = null
 
     /**
@@ -146,10 +135,9 @@
      */
     internal var calledByMap: MutableIntObjectMap<MutableIntSet>? = null
 
-    /**
-     * Returns true if the slot table is empty
-     */
-    override val isEmpty get() = groupsSize == 0
+    /** Returns true if the slot table is empty */
+    override val isEmpty
+        get() = groupsSize == 0
 
     /**
      * Read the slot table in [block]. Any number of readers can be created but a slot table cannot
@@ -157,8 +145,8 @@
      *
      * @see SlotReader
      */
-    inline fun <T> read(block: (reader: SlotReader) -> T): T = openReader()
-        .let { reader ->
+    inline fun <T> read(block: (reader: SlotReader) -> T): T =
+        openReader().let { reader ->
             try {
                 block(reader)
             } finally {
@@ -167,14 +155,14 @@
         }
 
     /**
-     * Write to the slot table in [block]. Only one writer can be created for a slot table at a
-     * time and all readers must be closed an do readers can be created while the slot table is
-     * being written to.
+     * Write to the slot table in [block]. Only one writer can be created for a slot table at a time
+     * and all readers must be closed an do readers can be created while the slot table is being
+     * written to.
      *
      * @see SlotWriter
      */
-    inline fun <T> write(block: (writer: SlotWriter) -> T): T = openWriter()
-        .let { writer ->
+    inline fun <T> write(block: (writer: SlotWriter) -> T): T =
+        openWriter().let { writer ->
             var normalClose = false
             try {
                 block(writer).also { normalClose = true }
@@ -184,8 +172,8 @@
         }
 
     /**
-     * Open a reader. Any number of readers can be created but a slot table cannot be read while
-     * it is being written to.
+     * Open a reader. Any number of readers can be created but a slot table cannot be read while it
+     * is being written to.
      *
      * @see SlotReader
      */
@@ -196,8 +184,8 @@
     }
 
     /**
-     * Open a writer. Only one writer can be created for a slot table at a time and all readers
-     * must be closed an do readers can be created while the slot table is being written to.
+     * Open a writer. Only one writer can be created for a slot table at a time and all readers must
+     * be closed an do readers can be created while the slot table is being written to.
      *
      * @see SlotWriter
      */
@@ -215,32 +203,26 @@
      * group itself was moved. [Anchor.valid] will be `false` if the group at [index] was removed.
      *
      * If an anchor is moved using [SlotWriter.moveFrom] or [SlotWriter.moveTo] the anchor will move
-     * to be owned by the receiving table. [ownsAnchor] can be used to determine if the group
-     * at [index] is still in this table.
+     * to be owned by the receiving table. [ownsAnchor] can be used to determine if the group at
+     * [index] is still in this table.
      */
     fun anchor(index: Int): Anchor {
         runtimeCheck(!writer) { "use active SlotWriter to create an anchor location instead" }
-        requirePrecondition(index in 0 until groupsSize) {
-            "Parameter index is out of range"
-        }
-        return anchors.getOrAdd(index, groupsSize) {
-            Anchor(index)
-        }
+        requirePrecondition(index in 0 until groupsSize) { "Parameter index is out of range" }
+        return anchors.getOrAdd(index, groupsSize) { Anchor(index) }
     }
 
-    /**
-     * Return an anchor to the given index if there is one already, null otherwise.
-     */
+    /** Return an anchor to the given index if there is one already, null otherwise. */
     private fun tryAnchor(index: Int): Anchor? {
         runtimeCheck(!writer) { "use active SlotWriter to crate an anchor for location instead" }
         return if (index in 0 until groupsSize) anchors.find(index, groupsSize) else null
     }
 
     /**
-     * Return the group index for [anchor]. This [SlotTable] is assumed to own [anchor] but that
-     * is not validated. If [anchor] is not owned by this [SlotTable] the result is undefined.
-     * If a [SlotWriter] is open the [SlotWriter.anchorIndex] must be called instead as [anchor]
-     * might be affected by the modifications being performed by the [SlotWriter].
+     * Return the group index for [anchor]. This [SlotTable] is assumed to own [anchor] but that is
+     * not validated. If [anchor] is not owned by this [SlotTable] the result is undefined. If a
+     * [SlotWriter] is open the [SlotWriter.anchorIndex] must be called instead as [anchor] might be
+     * affected by the modifications being performed by the [SlotWriter].
      */
     fun anchorIndex(anchor: Anchor): Int {
         runtimeCheck(!writer) { "Use active SlotWriter to determine anchor location instead" }
@@ -249,19 +231,16 @@
     }
 
     /**
-     * Returns true if [anchor] is owned by this [SlotTable] or false if it is owned by a
-     * different [SlotTable] or no longer part of this table (e.g. it was moved or the group it
-     * was an anchor for was removed).
+     * Returns true if [anchor] is owned by this [SlotTable] or false if it is owned by a different
+     * [SlotTable] or no longer part of this table (e.g. it was moved or the group it was an anchor
+     * for was removed).
      */
     fun ownsAnchor(anchor: Anchor): Boolean {
-        return anchor.valid && anchors.search(anchor.location, groupsSize).let {
-            it >= 0 && anchors[it] == anchor
-        }
+        return anchor.valid &&
+            anchors.search(anchor.location, groupsSize).let { it >= 0 && anchors[it] == anchor }
     }
 
-    /**
-     * Returns true if the [anchor] is for the group at [groupIndex] or one of it child groups.
-     */
+    /** Returns true if the [anchor] is for the group at [groupIndex] or one of it child groups. */
     fun groupContainsAnchor(groupIndex: Int, anchor: Anchor): Boolean {
         runtimeCheck(!writer) { "Writer is active" }
         runtimeCheck(groupIndex in 0 until groupsSize) { "Invalid group index" }
@@ -269,9 +248,7 @@
             anchor.location in groupIndex until (groupIndex + groups.groupSize(groupIndex))
     }
 
-    /**
-     * Close [reader].
-     */
+    /** Close [reader]. */
     internal fun close(
         reader: SlotReader,
         sourceInformationMap: HashMap<Anchor, GroupSourceInformation>?
@@ -292,8 +269,8 @@
 
     /**
      * Close [writer] and adopt the slot arrays returned. The [SlotTable] is invalid until
-     * [SlotWriter.close] is called as the [SlotWriter] is modifying [groups] and [slots]
-     * directly and will only make copies of the arrays if the slot table grows.
+     * [SlotWriter.close] is called as the [SlotWriter] is modifying [groups] and [slots] directly
+     * and will only make copies of the arrays if the slot table grows.
      */
     internal fun close(
         writer: SlotWriter,
@@ -311,8 +288,8 @@
     }
 
     /**
-     * Used internally by [SlotWriter.moveFrom] to swap arrays with a slot table target
-     * [SlotTable] is empty.
+     * Used internally by [SlotWriter.moveFrom] to swap arrays with a slot table target [SlotTable]
+     * is empty.
      */
     internal fun setTo(
         groups: IntArray,
@@ -342,17 +319,18 @@
      * which we know will no longer have the same structure so we want to remove them before
      * recomposing.
      *
-     * Returns a list of groups if they were successfully invalidated. If this returns null then
-     * a full composition must be forced.
+     * Returns a list of groups if they were successfully invalidated. If this returns null then a
+     * full composition must be forced.
      */
     internal fun invalidateGroupsWithKey(target: Int): List<RecomposeScopeImpl>? {
         val anchors = mutableListOf<Anchor>()
         val scopes = mutableListOf<RecomposeScopeImpl>()
         var allScopesFound = true
-        val set = MutableIntSet().also {
-            it.add(target)
-            it.add(LIVE_EDIT_INVALID_KEY)
-        }
+        val set =
+            MutableIntSet().also {
+                it.add(target)
+                it.add(LIVE_EDIT_INVALID_KEY)
+            }
         calledByMap?.get(target)?.let { set.addAll(it) }
 
         // Invalidate groups with the target key
@@ -360,8 +338,7 @@
             fun scanGroup() {
                 val key = reader.groupKey
                 if (key in set) {
-                    if (key != LIVE_EDIT_INVALID_KEY)
-                        anchors.add(reader.anchor())
+                    if (key != LIVE_EDIT_INVALID_KEY) anchors.add(reader.anchor())
                     if (allScopesFound) {
                         val nearestScope = findEffectiveRecomposeScope(reader.currentGroup)
                         if (nearestScope != null) {
@@ -408,30 +385,25 @@
         return if (allScopesFound) scopes else null
     }
 
-    /**
-     * Turns true if the first group (considered the root group) contains a mark.
-     */
+    /** Turns true if the first group (considered the root group) contains a mark. */
     fun containsMark(): Boolean {
         return groupsSize > 0 && groups.containsMark(0)
     }
 
-    fun sourceInformationOf(group: Int) = sourceInformationMap?.let { map ->
-        tryAnchor(group)?.let { anchor -> map[anchor] }
-    }
+    fun sourceInformationOf(group: Int) =
+        sourceInformationMap?.let { map -> tryAnchor(group)?.let { anchor -> map[anchor] } }
 
     /**
-     * Find the nearest recompose scope for [group] that, when invalidated, will cause [group]
-     * group to be recomposed. This will force non-restartable recompose scopes in between this
-     * [group] and the restartable group to recompose.
+     * Find the nearest recompose scope for [group] that, when invalidated, will cause [group] group
+     * to be recomposed. This will force non-restartable recompose scopes in between this [group]
+     * and the restartable group to recompose.
      */
     private fun findEffectiveRecomposeScope(group: Int): RecomposeScopeImpl? {
         var current = group
         while (current > 0) {
             for (data in DataIterator(this, current)) {
                 if (data is RecomposeScopeImpl) {
-                    if (data.used && current != group)
-                        return data
-                    else data.forcedRecompose = true
+                    if (data.used && current != group) return data else data.forcedRecompose = true
                 }
             }
             current = groups.parentAnchor(current)
@@ -440,8 +412,8 @@
     }
 
     /**
-     * A debugging aid to validate the internal structure of the slot table. Throws an exception
-     * if the slot table is not in the expected shape.
+     * A debugging aid to validate the internal structure of the slot table. Throws an exception if
+     * the slot table is not in the expected shape.
      */
     fun verifyWellFormed() {
         // If the check passes Address and Index are identical so there is no need for
@@ -467,16 +439,13 @@
             checkPrecondition(dataEnd <= slots.size) {
                 "Slots for $group extend past the end of the slot table"
             }
-            checkPrecondition(dataStart <= dataEnd) {
-                "Invalid data anchor at $group"
-            }
+            checkPrecondition(dataStart <= dataEnd) { "Invalid data anchor at $group" }
             val slotStart = groups.slotAnchor(group)
-            checkPrecondition(slotStart <= dataEnd) {
-                "Slots start out of range at $group"
-            }
-            val minSlotsNeeded = (if (groups.isNode(group)) 1 else 0) +
-                (if (groups.hasObjectKey(group)) 1 else 0) +
-                (if (groups.hasAux(group)) 1 else 0)
+            checkPrecondition(slotStart <= dataEnd) { "Slots start out of range at $group" }
+            val minSlotsNeeded =
+                (if (groups.isNode(group)) 1 else 0) +
+                    (if (groups.hasObjectKey(group)) 1 else 0) +
+                    (if (groups.hasAux(group)) 1 else 0)
             checkPrecondition(dataEnd - dataStart >= minSlotsNeeded) {
                 "Not enough slots added for group $group"
             }
@@ -540,9 +509,7 @@
             group.groups?.fastForEach { item ->
                 when (item) {
                     is Anchor -> {
-                        requirePrecondition(item.valid) {
-                            "Source map contains invalid anchor"
-                        }
+                        requirePrecondition(item.valid) { "Source map contains invalid anchor" }
                         requirePrecondition(ownsAnchor(item)) {
                             "Source map anchor is not owned by the slot table"
                         }
@@ -554,9 +521,7 @@
 
         sourceInformationMap?.let { sourceInformationMap ->
             for ((anchor, sourceGroup) in sourceInformationMap) {
-                requirePrecondition(anchor.valid) {
-                    "Source map contains invalid anchor"
-                }
+                requirePrecondition(anchor.valid) { "Source map contains invalid anchor" }
                 requirePrecondition(ownsAnchor(anchor)) {
                     "Source map anchor is not owned by the slot table"
                 }
@@ -580,7 +545,8 @@
      */
     @Suppress("unused", "MemberVisibilityCanBePrivate")
     fun toDebugString(): String {
-        return if (writer) super.toString() else
+        return if (writer) super.toString()
+        else
             buildString {
                 append(super.toString())
                 append('\n')
@@ -590,14 +556,11 @@
                     while (current < groupsSize) {
                         current += emitGroup(current, 0)
                     }
-                } else
-                    append("<EMPTY>")
+                } else append("<EMPTY>")
             }
     }
 
-    /**
-     * A helper function used by [toDebugString] to render a particular group.
-     */
+    /** A helper function used by [toDebugString] to render a particular group. */
     private fun StringBuilder.emitGroup(index: Int, level: Int): Int {
         repeat(level) { append(' ') }
         append("Group(")
@@ -614,8 +577,7 @@
         }
         append(" key=")
         append(groups.key(index))
-        fun dataIndex(index: Int) =
-            if (index >= groupsSize) slotsSize else groups.dataAnchor(index)
+        fun dataIndex(index: Int) = if (index >= groupsSize) slotsSize else groups.dataAnchor(index)
 
         val groupSize = groups.groupSize(index)
         append(", nodes=")
@@ -632,9 +594,11 @@
         val dataEnd = dataIndex(index + 1)
         if (dataStart in 0..dataEnd && dataEnd <= slotsSize) {
             if (groups.hasObjectKey(index)) {
-                append(" objectKey=${slots[
+                append(
+                    " objectKey=${slots[
                     groups.objectKeyIndex(index)].toString().summarize(10)
-                }")
+                }"
+                )
             }
             if (groups.isNode(index)) {
                 append(" node=${slots[groups.nodeIndex(index)].toString().summarize(10)}")
@@ -665,35 +629,22 @@
         return groupSize
     }
 
-    /**
-     * A debugging aid to list all the keys [key] values in the [groups] array.
-     */
-    @Suppress("unused")
-    private fun keys() = groups.keys(groupsSize * Group_Fields_Size)
+    /** A debugging aid to list all the keys [key] values in the [groups] array. */
+    @Suppress("unused") private fun keys() = groups.keys(groupsSize * Group_Fields_Size)
 
-    /**
-     * A debugging aid to list all the [nodeCount] values in the [groups] array.
-     */
-    @Suppress("unused")
-    private fun nodes() = groups.nodeCounts(groupsSize * Group_Fields_Size)
+    /** A debugging aid to list all the [nodeCount] values in the [groups] array. */
+    @Suppress("unused") private fun nodes() = groups.nodeCounts(groupsSize * Group_Fields_Size)
 
-    /**
-     * A debugging aid to list all the [parentAnchor] values in the [groups] array.
-     */
+    /** A debugging aid to list all the [parentAnchor] values in the [groups] array. */
     @Suppress("unused")
     private fun parentIndexes() = groups.parentAnchors(groupsSize * Group_Fields_Size)
 
-    /**
-     * A debugging aid to list all the indexes into the [slots] array from the [groups] array.
-     */
+    /** A debugging aid to list all the indexes into the [slots] array from the [groups] array. */
     @Suppress("unused")
     private fun dataIndexes() = groups.dataAnchors(groupsSize * Group_Fields_Size)
 
-    /**
-     * A debugging aid to list the [groupsSize] of all the groups in [groups].
-     */
-    @Suppress("unused")
-    private fun groupSizes() = groups.groupSizes(groupsSize * Group_Fields_Size)
+    /** A debugging aid to list the [groupsSize] of all the groups in [groups]. */
+    @Suppress("unused") private fun groupSizes() = groups.groupSizes(groupsSize * Group_Fields_Size)
 
     @Suppress("unused")
     internal fun slotsOf(group: Int): List<Any?> {
@@ -709,27 +660,29 @@
         return if (slotIndex in 0 until len) return slots[start + slotIndex] else Composer.Empty
     }
 
-    override val compositionGroups: Iterable<CompositionGroup> get() = this
+    override val compositionGroups: Iterable<CompositionGroup>
+        get() = this
 
-    override fun iterator(): Iterator<CompositionGroup> =
-        GroupIterator(this, 0, groupsSize)
+    override fun iterator(): Iterator<CompositionGroup> = GroupIterator(this, 0, groupsSize)
 
     override fun find(identityToFind: Any): CompositionGroup? =
-         SlotTableGroup(this, 0).find(identityToFind)
+        SlotTableGroup(this, 0).find(identityToFind)
 }
 
 /**
- * An [Anchor] tracks a groups as its index changes due to other groups being inserted and
- * removed before it. If the group the [Anchor] is tracking is removed, directly or indirectly,
- * [valid] will return false. The current index of the group can be determined by passing either
- * the [SlotTable] or [SlotWriter] to [toIndexFor]. If a [SlotWriter] is active, it must be used
- * instead of the [SlotTable] as the anchor index could have shifted due to operations performed
- * on the writer.
+ * An [Anchor] tracks a groups as its index changes due to other groups being inserted and removed
+ * before it. If the group the [Anchor] is tracking is removed, directly or indirectly, [valid] will
+ * return false. The current index of the group can be determined by passing either the [SlotTable]
+ * or [SlotWriter] to [toIndexFor]. If a [SlotWriter] is active, it must be used instead of the
+ * [SlotTable] as the anchor index could have shifted due to operations performed on the writer.
  */
 internal class Anchor(loc: Int) {
     internal var location: Int = loc
-    val valid get() = location != Int.MIN_VALUE
+    val valid
+        get() = location != Int.MIN_VALUE
+
     fun toIndexFor(slots: SlotTable) = slots.anchorIndex(this)
+
     fun toIndexFor(writer: SlotWriter) = writer.anchorIndex(this)
 
     override fun toString(): String {
@@ -750,7 +703,9 @@
         openInformation().add(GroupSourceInformation(key, sourceInformation, dataOffset))
     }
 
-    fun endGrouplessCall(dataOffset: Int) { openInformation().close(dataOffset) }
+    fun endGrouplessCall(dataOffset: Int) {
+        openInformation().close(dataOffset)
+    }
 
     fun reportGroup(writer: SlotWriter, group: Int) {
         openInformation().add(writer.anchor(group))
@@ -762,15 +717,15 @@
 
     fun addGroupAfter(writer: SlotWriter, predecessor: Int, group: Int) {
         val groups = groups ?: ArrayList<Any>().also { groups = it }
-        val index = if (predecessor >= 0) {
-            val anchor = writer.tryAnchor(predecessor)
-            if (anchor != null) {
-                groups.fastIndexOf {
-                    it == anchor ||
-                        (it is GroupSourceInformation && it.hasAnchor(anchor))
-                }
+        val index =
+            if (predecessor >= 0) {
+                val anchor = writer.tryAnchor(predecessor)
+                if (anchor != null) {
+                    groups.fastIndexOf {
+                        it == anchor || (it is GroupSourceInformation && it.hasAnchor(anchor))
+                    }
+                } else 0
             } else 0
-        } else 0
         groups.add(index, writer.anchor(group))
     }
 
@@ -781,9 +736,10 @@
 
     // Return the current open nested source information or this.
     private fun openInformation(): GroupSourceInformation =
-        (groups?.let {
-            groups -> groups.fastLastOrNull { it is GroupSourceInformation && !it.closed }
-        } as? GroupSourceInformation)?.openInformation() ?: this
+        (groups?.let { groups ->
+                groups.fastLastOrNull { it is GroupSourceInformation && !it.closed }
+            } as? GroupSourceInformation)
+            ?.openInformation() ?: this
 
     private fun add(group: Any /* Anchor | GroupSourceInformation */) {
         val groups = groups ?: ArrayList()
@@ -803,9 +759,10 @@
             while (index >= 0) {
                 when (val item = groups[index]) {
                     is Anchor -> if (item == anchor) groups.removeAt(index)
-                    is GroupSourceInformation -> if (!item.removeAnchor(anchor)) {
-                        groups.removeAt(index)
-                    }
+                    is GroupSourceInformation ->
+                        if (!item.removeAnchor(anchor)) {
+                            groups.removeAt(index)
+                        }
                 }
                 index--
             }
@@ -840,142 +797,103 @@
     return -1
 }
 
-/**
- * A reader of a slot table. See [SlotTable]
- */
+/** A reader of a slot table. See [SlotTable] */
 internal class SlotReader(
-    /**
-     * The table for whom this is a reader.
-     */
+    /** The table for whom this is a reader. */
     internal val table: SlotTable
 ) {
 
-    /**
-     * A copy of the [SlotTable.groups] array to avoid having indirect through [table].
-     */
+    /** A copy of the [SlotTable.groups] array to avoid having indirect through [table]. */
     private val groups: IntArray = table.groups
 
-    /**
-     * A copy of [SlotTable.groupsSize] to avoid having to indirect through [table].
-     */
+    /** A copy of [SlotTable.groupsSize] to avoid having to indirect through [table]. */
     private val groupsSize: Int = table.groupsSize
 
-    /**
-     * A copy of [SlotTable.slots] to avoid having to indirect through [table].
-     */
+    /** A copy of [SlotTable.slots] to avoid having to indirect through [table]. */
     private val slots: Array<Any?> = table.slots
 
-    /**
-     * A Copy of [SlotTable.slotsSize] to avoid having to indirect through [table].
-     */
+    /** A Copy of [SlotTable.slotsSize] to avoid having to indirect through [table]. */
     private val slotsSize: Int = table.slotsSize
 
     /**
-     * A local copy of the [sourceInformationMap] being created to be merged into [table]
-     * when the reader closes.
+     * A local copy of the [sourceInformationMap] being created to be merged into [table] when the
+     * reader closes.
      */
     private var sourceInformationMap: HashMap<Anchor, GroupSourceInformation>? = null
 
-    /**
-     * True if the reader has been closed
-     */
+    /** True if the reader has been closed */
     var closed: Boolean = false
         private set
 
-    /**
-     * The current group that will be started with [startGroup] or skipped with [skipGroup].
-     */
+    /** The current group that will be started with [startGroup] or skipped with [skipGroup]. */
     var currentGroup = 0
         private set
 
-    /**
-     * The end of the [parent] group.
-     */
+    /** The end of the [parent] group. */
     var currentEnd = groupsSize
         private set
 
-    /**
-     * The parent of the [currentGroup] group which is the last group started with [startGroup].
-     */
+    /** The parent of the [currentGroup] group which is the last group started with [startGroup]. */
     var parent = -1
         private set
 
-    /**
-     * The current location of the current slot to restore [endGroup] is called.
-     */
+    /** The current location of the current slot to restore [endGroup] is called. */
     private val currentSlotStack = IntStack()
 
-    /**
-     * The number of times [beginEmpty] has been called.
-     */
+    /** The number of times [beginEmpty] has been called. */
     private var emptyCount = 0
 
     /**
-     * The current slot of [parent]. This slot will be the next slot returned by [next] unless it
-     * is equal ot [currentSlotEnd].
+     * The current slot of [parent]. This slot will be the next slot returned by [next] unless it is
+     * equal ot [currentSlotEnd].
      */
     private var currentSlot = 0
 
-    /**
-     * The current end slot of [parent].
-     */
+    /** The current end slot of [parent]. */
     private var currentSlotEnd = 0
 
-    /**
-     * Return the total number of groups in the slot table.
-     */
-    val size: Int get() = groupsSize
+    /** Return the total number of groups in the slot table. */
+    val size: Int
+        get() = groupsSize
 
-    /**
-     * Return the current slot of the group whose value will be returned by calling [next].
-     */
-    val slot: Int get() = currentSlot - groups.slotAnchor(parent)
+    /** Return the current slot of the group whose value will be returned by calling [next]. */
+    val slot: Int
+        get() = currentSlot - groups.slotAnchor(parent)
 
-    /**
-     * Return the parent index of [index].
-     */
+    /** Return the parent index of [index]. */
     fun parent(index: Int) = groups.parentAnchor(index)
 
-    /**
-     * Determine if the slot is start of a node.
-     */
-    val isNode: Boolean get() = groups.isNode(currentGroup)
+    /** Determine if the slot is start of a node. */
+    val isNode: Boolean
+        get() = groups.isNode(currentGroup)
 
-    /**
-     * Determine if the group at [index] is a node.
-     */
+    /** Determine if the group at [index] is a node. */
     fun isNode(index: Int) = groups.isNode(index)
 
     /**
      * The number of nodes managed by the current group. For node groups, this is the list of the
      * children nodes.
      */
-    val nodeCount: Int get() = groups.nodeCount(currentGroup)
+    val nodeCount: Int
+        get() = groups.nodeCount(currentGroup)
 
-    /**
-     * Return the number of nodes for the group at [index].
-     */
+    /** Return the number of nodes for the group at [index]. */
     fun nodeCount(index: Int) = groups.nodeCount(index)
 
-    /**
-     * Return the node at [index] if [index] is a node group else null.
-     */
+    /** Return the node at [index] if [index] is a node group else null. */
     fun node(index: Int): Any? = if (groups.isNode(index)) groups.node(index) else null
 
-    /**
-     * Determine if the reader is at the end of a group and an [endGroup] is expected.
-     */
-    val isGroupEnd get() = inEmpty || currentGroup == currentEnd
+    /** Determine if the reader is at the end of a group and an [endGroup] is expected. */
+    val isGroupEnd
+        get() = inEmpty || currentGroup == currentEnd
 
-    /**
-     * Determine if a [beginEmpty] has been called.
-     */
-    val inEmpty get() = emptyCount > 0
+    /** Determine if a [beginEmpty] has been called. */
+    val inEmpty
+        get() = emptyCount > 0
 
-    /**
-     * Get the size of the group at [currentGroup].
-     */
-    val groupSize get() = groups.groupSize(currentGroup)
+    /** Get the size of the group at [currentGroup]. */
+    val groupSize
+        get() = groups.groupSize(currentGroup)
 
     /**
      * Get the size of the group at [index]. Will throw an exception if [index] is not a group
@@ -983,107 +901,82 @@
      */
     fun groupSize(index: Int) = groups.groupSize(index)
 
-    /**
-     * Get location the end of the currently started group.
-     */
-    val groupEnd get() = currentEnd
+    /** Get location the end of the currently started group. */
+    val groupEnd
+        get() = currentEnd
 
-    /**
-     * Get location of the end of the group at [index].
-     */
+    /** Get location of the end of the group at [index]. */
     fun groupEnd(index: Int) = index + groups.groupSize(index)
 
-    /**
-     * Get the key of the current group. Returns 0 if the [currentGroup] is not a group.
-     */
+    /** Get the key of the current group. Returns 0 if the [currentGroup] is not a group. */
     val groupKey
-        get() = if (currentGroup < currentEnd) {
-            groups.key(currentGroup)
-        } else 0
+        get() =
+            if (currentGroup < currentEnd) {
+                groups.key(currentGroup)
+            } else 0
 
-    /**
-     * Get the key of the group at [index].
-     */
+    /** Get the key of the group at [index]. */
     fun groupKey(index: Int) = groups.key(index)
 
     /**
-     * The group slot index is the index into the current groups slots that will be updated by
-     * read by [next].
+     * The group slot index is the index into the current groups slots that will be updated by read
+     * by [next].
      */
-    val groupSlotIndex get() = currentSlot - groups.slotAnchor(parent)
+    val groupSlotIndex
+        get() = currentSlot - groups.slotAnchor(parent)
 
-    /**
-     * Determine if the group at [index] has an object key
-     */
+    /** Determine if the group at [index] has an object key */
     fun hasObjectKey(index: Int) = groups.hasObjectKey(index)
 
-    val hasObjectKey: Boolean get() = currentGroup < currentEnd && groups.hasObjectKey(currentGroup)
+    val hasObjectKey: Boolean
+        get() = currentGroup < currentEnd && groups.hasObjectKey(currentGroup)
 
-    /**
-     * Get the object key for the current group or null if no key was provide
-     */
+    /** Get the object key for the current group or null if no key was provide */
     val groupObjectKey
-        get() =
-            if (currentGroup < currentEnd) groups.objectKey(currentGroup) else null
+        get() = if (currentGroup < currentEnd) groups.objectKey(currentGroup) else null
 
-    /**
-     * Get the object key at [index].
-     */
+    /** Get the object key at [index]. */
     fun groupObjectKey(index: Int) = groups.objectKey(index)
 
-    /**
-     * Get the current group aux data.
-     */
-    val groupAux get() = if (currentGroup < currentEnd) groups.aux(currentGroup) else 0
+    /** Get the current group aux data. */
+    val groupAux
+        get() = if (currentGroup < currentEnd) groups.aux(currentGroup) else 0
 
-    /**
-     * Get the aux data for the group at [index]
-     */
+    /** Get the aux data for the group at [index] */
     fun groupAux(index: Int) = groups.aux(index)
 
-    /**
-     * Get the node associated with the group if there is one.
-     */
-    val groupNode get() = if (currentGroup < currentEnd) groups.node(currentGroup) else null
+    /** Get the node associated with the group if there is one. */
+    val groupNode
+        get() = if (currentGroup < currentEnd) groups.node(currentGroup) else null
 
-    /**
-     * Get the group key at [anchor]. This return 0 if the anchor is not valid.
-     */
+    /** Get the group key at [anchor]. This return 0 if the anchor is not valid. */
     fun groupKey(anchor: Anchor) = if (anchor.valid) groups.key(table.anchorIndex(anchor)) else 0
 
-    /**
-     * Returns true when the group at [index] was marked with [SlotWriter.markGroup].
-     */
+    /** Returns true when the group at [index] was marked with [SlotWriter.markGroup]. */
     fun hasMark(index: Int) = groups.hasMark(index)
 
     /**
-     * Returns true if the group contains a group, directly or indirectly, that has been marked by
-     * a call to [SlotWriter.markGroup].
+     * Returns true if the group contains a group, directly or indirectly, that has been marked by a
+     * call to [SlotWriter.markGroup].
      */
     fun containsMark(index: Int) = groups.containsMark(index)
 
-    /**
-     * Return the number of nodes where emitted into the current group.
-     */
-    val parentNodes: Int get() = if (parent >= 0) groups.nodeCount(parent) else 0
+    /** Return the number of nodes where emitted into the current group. */
+    val parentNodes: Int
+        get() = if (parent >= 0) groups.nodeCount(parent) else 0
 
-    /**
-     * Return the number of slots left to enumerate with [next].
-     */
-    val remainingSlots get(): Int = currentSlotEnd - currentSlot
+    /** Return the number of slots left to enumerate with [next]. */
+    val remainingSlots
+        get(): Int = currentSlotEnd - currentSlot
 
-    /**
-     * Return the index of the parent group of the given group
-     */
+    /** Return the index of the parent group of the given group */
     fun parentOf(index: Int): Int {
         @Suppress("ConvertTwoComparisonsToRangeCheck")
         requirePrecondition(index >= 0 && index < groupsSize) { "Invalid group index $index" }
         return groups.parentAnchor(index)
     }
 
-    /**
-     * Return the number of slots allocated to the [currentGroup] group.
-     */
+    /** Return the number of slots allocated to the [currentGroup] group. */
     val groupSlotCount: Int
         get() {
             val current = currentGroup
@@ -1093,21 +986,16 @@
             return end - start
         }
 
-    /**
-     * Get the value stored at [index] in the parent group's slot.
-     */
-    fun get(index: Int) = (currentSlot + index).let { slotIndex ->
-        if (slotIndex < currentSlotEnd) slots[slotIndex] else Composer.Empty
-    }
+    /** Get the value stored at [index] in the parent group's slot. */
+    fun get(index: Int) =
+        (currentSlot + index).let { slotIndex ->
+            if (slotIndex < currentSlotEnd) slots[slotIndex] else Composer.Empty
+        }
 
-    /**
-     * Get the value of the group's slot at [index] for the [currentGroup] group.
-     */
+    /** Get the value of the group's slot at [index] for the [currentGroup] group. */
     fun groupGet(index: Int): Any? = groupGet(currentGroup, index)
 
-    /**
-     * Get the slot value of the [group] at [index]
-     */
+    /** Get the slot value of the [group] at [index] */
     fun groupGet(group: Int, index: Int): Any? {
         val start = groups.slotAnchor(group)
         val next = group + 1
@@ -1130,9 +1018,7 @@
         return slots[currentSlot++]
     }
 
-    /**
-     * `true` if the last call to `next()` returned a slot value and [currentSlot] advanced.
-     */
+    /** `true` if the last call to `next()` returned a slot value and [currentSlot] advanced. */
     var hadNext: Boolean = false
         private set
 
@@ -1144,9 +1030,7 @@
         emptyCount++
     }
 
-    /**
-     * End reporting [Composer.Empty] for calls to [next] and [get],
-     */
+    /** End reporting [Composer.Empty] for calls to [next] and [get], */
     fun endEmpty() {
         requirePrecondition(emptyCount > 0) { "Unbalanced begin/end empty" }
         emptyCount--
@@ -1161,9 +1045,7 @@
         table.close(this, sourceInformationMap)
     }
 
-    /**
-     * Start a group.
-     */
+    /** Start a group. */
     fun startGroup() {
         if (emptyCount <= 0) {
             val parent = parent
@@ -1184,15 +1066,13 @@
             currentEnd = currentGroup + groups.groupSize(currentGroup)
             this.currentGroup = currentGroup + 1
             this.currentSlot = groups.slotAnchor(currentGroup)
-            this.currentSlotEnd = if (currentGroup >= groupsSize - 1)
-                slotsSize else
-                groups.dataAnchor(currentGroup + 1)
+            this.currentSlotEnd =
+                if (currentGroup >= groupsSize - 1) slotsSize
+                else groups.dataAnchor(currentGroup + 1)
         }
     }
 
-    /**
-     * Start a group and validate it is a node group
-     */
+    /** Start a group and validate it is a node group */
     fun startNode() {
         if (emptyCount <= 0) {
             requirePrecondition(groups.isNode(currentGroup)) { "Expected a node group" }
@@ -1200,9 +1080,7 @@
         }
     }
 
-    /**
-     *  Skip a group. Must be called at the start of a group.
-     */
+    /** Skip a group. Must be called at the start of a group. */
     fun skipGroup(): Int {
         runtimeCheck(emptyCount == 0) { "Cannot skip while in an empty region" }
         val count = if (groups.isNode(currentGroup)) 1 else groups.nodeCount(currentGroup)
@@ -1210,9 +1088,7 @@
         return count
     }
 
-    /**
-     * Skip to the end of the current group.
-     */
+    /** Skip to the end of the current group. */
     fun skipToGroupEnd() {
         runtimeCheck(emptyCount == 0) { "Cannot skip the enclosing group while in an empty region" }
         currentGroup = currentEnd
@@ -1220,25 +1096,19 @@
         currentSlotEnd = 0
     }
 
-    /**
-     * Reposition the read to the group at [index].
-     */
+    /** Reposition the read to the group at [index]. */
     fun reposition(index: Int) {
         runtimeCheck(emptyCount == 0) { "Cannot reposition while in an empty region" }
         currentGroup = index
         val parent = if (index < groupsSize) groups.parentAnchor(index) else -1
         this.parent = parent
-        if (parent < 0)
-            this.currentEnd = groupsSize
-        else
-            this.currentEnd = parent + groups.groupSize(parent)
+        if (parent < 0) this.currentEnd = groupsSize
+        else this.currentEnd = parent + groups.groupSize(parent)
         this.currentSlot = 0
         this.currentSlotEnd = 0
     }
 
-    /**
-     * Restore the parent to a parent of the current group.
-     */
+    /** Restore the parent to a parent of the current group. */
     fun restoreParent(index: Int) {
         val newCurrentEnd = index + groups.groupSize(index)
         val current = currentGroup
@@ -1252,9 +1122,7 @@
         this.currentSlotEnd = 0
     }
 
-    /**
-     * End the current group. Must be called after the corresponding [startGroup].
-     */
+    /** End the current group. Must be called after the corresponding [startGroup]. */
     fun endGroup() {
         if (emptyCount == 0) {
             runtimeCheck(currentGroup == currentEnd) {
@@ -1262,10 +1130,7 @@
             }
             val parent = groups.parentAnchor(parent)
             this.parent = parent
-            currentEnd = if (parent < 0)
-                groupsSize
-            else
-                parent + groups.groupSize(parent)
+            currentEnd = if (parent < 0) groupsSize else parent + groups.groupSize(parent)
             val currentSlotStack = currentSlotStack
             val newCurrentSlot = currentSlotStack.pop()
             if (newCurrentSlot < 0) {
@@ -1273,9 +1138,8 @@
                 currentSlotEnd = 0
             } else {
                 currentSlot = newCurrentSlot
-                currentSlotEnd = if (parent >= groupsSize - 1)
-                    slotsSize else
-                    groups.dataAnchor(parent + 1)
+                currentSlotEnd =
+                    if (parent >= groupsSize - 1) slotsSize else groups.dataAnchor(parent + 1)
             }
         }
     }
@@ -1304,243 +1168,185 @@
         return result
     }
 
-    override fun toString(): String = "SlotReader(current=$currentGroup, key=$groupKey, " +
-        "parent=$parent, end=$currentEnd)"
+    override fun toString(): String =
+        "SlotReader(current=$currentGroup, key=$groupKey, " + "parent=$parent, end=$currentEnd)"
 
-    /**
-     * Create an anchor to the current reader location or [index].
-     */
-    fun anchor(index: Int = currentGroup) = table.anchors.getOrAdd(index, groupsSize) {
-        Anchor(index)
-    }
+    /** Create an anchor to the current reader location or [index]. */
+    fun anchor(index: Int = currentGroup) =
+        table.anchors.getOrAdd(index, groupsSize) { Anchor(index) }
 
-    private fun IntArray.node(index: Int) = if (isNode(index)) {
-        slots[nodeIndex(index)]
-    } else Composer.Empty
+    private fun IntArray.node(index: Int) =
+        if (isNode(index)) {
+            slots[nodeIndex(index)]
+        } else Composer.Empty
 
-    private fun IntArray.aux(index: Int) = if (hasAux(index)) {
-        slots[auxIndex(index)]
-    } else Composer.Empty
+    private fun IntArray.aux(index: Int) =
+        if (hasAux(index)) {
+            slots[auxIndex(index)]
+        } else Composer.Empty
 
-    private fun IntArray.objectKey(index: Int) = if (hasObjectKey(index)) {
-        slots[objectKeyIndex(index)]
-    } else null
+    private fun IntArray.objectKey(index: Int) =
+        if (hasObjectKey(index)) {
+            slots[objectKeyIndex(index)]
+        } else null
 }
 
-/**
- * Information about groups and their keys.
- */
-internal class KeyInfo internal constructor(
-    /**
-     * The group key.
-     */
+/** Information about groups and their keys. */
+internal class KeyInfo
+internal constructor(
+    /** The group key. */
     val key: Int,
 
-    /**
-     * The object key for the group
-     */
+    /** The object key for the group */
     val objectKey: Any?,
 
-    /**
-     * The location of the group.
-     */
+    /** The location of the group. */
     val location: Int,
 
-    /**
-     * The number of nodes in the group. If the group is a node this is always 1.
-     */
+    /** The number of nodes in the group. If the group is a node this is always 1. */
     val nodes: Int,
 
-    /**
-     * The index of the key info in the list returned by extractKeys
-     */
+    /** The index of the key info in the list returned by extractKeys */
     val index: Int
 )
 
-/**
- * The writer for a slot table. See [SlotTable] for details.
- */
+/** The writer for a slot table. See [SlotTable] for details. */
 internal class SlotWriter(
-    /**
-     * The [SlotTable] for whom this is writer.
-     */
+    /** The [SlotTable] for whom this is writer. */
     internal val table: SlotTable
 ) {
     /**
-     * The gap buffer for groups. This might change as groups are inserted and the array needs to
-     * be expanded to account groups. The current valid groups occupy 0 until [groupGapStart]
-     * followed [groupGapStart] + [groupGapLen] until groups.size where [groupGapStart]
-     * until [groupGapStart] + [groupGapLen] is the gap.
+     * The gap buffer for groups. This might change as groups are inserted and the array needs to be
+     * expanded to account groups. The current valid groups occupy 0 until [groupGapStart] followed
+     * [groupGapStart] + [groupGapLen] until groups.size where [groupGapStart] until
+     * [groupGapStart] + [groupGapLen] is the gap.
      */
     private var groups: IntArray = table.groups
 
     /**
-     * The gap buffer for the slots. This might change as slots are inserted an and the array
-     * needs to be expanded to account for the new slots. The current valid slots occupy 0 until
+     * The gap buffer for the slots. This might change as slots are inserted an and the array needs
+     * to be expanded to account for the new slots. The current valid slots occupy 0 until
      * [slotsGapStart] and [slotsGapStart] + [slotsGapLen] until slots.size where [slotsGapStart]
      * until [slotsGapStart] + [slotsGapLen] is the gap.
      */
     private var slots: Array<Any?> = table.slots
 
-    /**
-     * A copy of the [SlotTable.anchors] to avoid having to index through [table].
-     */
+    /** A copy of the [SlotTable.anchors] to avoid having to index through [table]. */
     private var anchors: ArrayList<Anchor> = table.anchors
 
-    /**
-     * A copy of [SlotTable.sourceInformationMap] to avoid having to index through [table]
-     */
+    /** A copy of [SlotTable.sourceInformationMap] to avoid having to index through [table] */
     private var sourceInformationMap = table.sourceInformationMap
 
-    /**
-     * A copy of [SlotTable.calledByMap] to avoid having to index through [table]
-     */
+    /** A copy of [SlotTable.calledByMap] to avoid having to index through [table] */
     private var calledByMap = table.calledByMap
 
-    /**
-     * Group index of the start of the gap in the groups array.
-     */
+    /** Group index of the start of the gap in the groups array. */
     private var groupGapStart: Int = table.groupsSize
 
-    /**
-     * The number of groups in the gap in the groups array.
-     */
+    /** The number of groups in the gap in the groups array. */
     private var groupGapLen: Int = groups.size / Group_Fields_Size - table.groupsSize
 
-    /**
-     * The location of the [slots] array that contains the data for the [parent] group.
-     */
+    /** The location of the [slots] array that contains the data for the [parent] group. */
     private var currentSlot = 0
 
-    /**
-     * The location of the index in [slots] after the slots for the [parent] group.
-     */
+    /** The location of the index in [slots] after the slots for the [parent] group. */
     private var currentSlotEnd = 0
 
-    /**
-     * The is the index of gap in the [slots] array.
-     */
+    /** The is the index of gap in the [slots] array. */
     private var slotsGapStart: Int = table.slotsSize
 
-    /**
-     * The number of slots in the gop in the [slots] array.
-     */
+    /** The number of slots in the gop in the [slots] array. */
     private var slotsGapLen: Int = slots.size - table.slotsSize
 
-    /**
-     * The owner of the gap is the first group that has a end relative index.
-     */
+    /** The owner of the gap is the first group that has a end relative index. */
     private var slotsGapOwner = table.groupsSize
 
-    /**
-     * The number of times [beginInsert] has been called.
-     */
+    /** The number of times [beginInsert] has been called. */
     private var insertCount = 0
 
     /**
      * The number of nodes in the current group. Used to track when nodes are being added and
-     * removed in the [parent] group. Once [endGroup] is called, if the nodes count has changed,
-     * the containing groups are updated until a node group is encountered.
+     * removed in the [parent] group. Once [endGroup] is called, if the nodes count has changed, the
+     * containing groups are updated until a node group is encountered.
      */
     private var nodeCount = 0
 
     /**
-     * A stack of the groups that have been explicitly started. A group can be implicitly started
-     * by using [seek] to seek to indirect child and calling [startGroup] on that child. The
-     * groups implicitly started groups will be updated when the [endGroup] is called for the
-     * indirect child group.
+     * A stack of the groups that have been explicitly started. A group can be implicitly started by
+     * using [seek] to seek to indirect child and calling [startGroup] on that child. The groups
+     * implicitly started groups will be updated when the [endGroup] is called for the indirect
+     * child group.
      */
     private val startStack = IntStack()
 
     /**
-     * A stack of the [currentGroupEnd] corresponding with the group is [startStack]. As groups
-     * are ended by calling [endGroup], the size of the group might have changed. This stack is a
-     * stack of enc group anchors where will reflect the group size change when it is restored by
-     * calling [restoreCurrentGroupEnd].
+     * A stack of the [currentGroupEnd] corresponding with the group is [startStack]. As groups are
+     * ended by calling [endGroup], the size of the group might have changed. This stack is a stack
+     * of enc group anchors where will reflect the group size change when it is restored by calling
+     * [restoreCurrentGroupEnd].
      */
     private val endStack = IntStack()
 
-    /**
-     * This a count of the [nodeCount] of the explicitly started groups.
-     */
+    /** This a count of the [nodeCount] of the explicitly started groups. */
     private val nodeCountStack = IntStack()
 
-    /**
-     * The current group that will be started by [startGroup] or skipped by [skipGroup]
-     */
+    /** The current group that will be started by [startGroup] or skipped by [skipGroup] */
     var currentGroup = 0
         private set
 
-    /**
-     * The index end of the current group.
-     */
+    /** The index end of the current group. */
     var currentGroupEnd = table.groupsSize
         private set
 
-    /**
-     * True if at the end of a group and an [endGroup] is expected.
-     */
-    val isGroupEnd get() = currentGroup == currentGroupEnd
+    /** True if at the end of a group and an [endGroup] is expected. */
+    val isGroupEnd
+        get() = currentGroup == currentGroupEnd
 
-    val slotsSize get() = slots.size - slotsGapLen
+    val slotsSize
+        get() = slots.size - slotsGapLen
 
     /**
-     * Return true if the current slot starts a node. A node is a kind of group so this will
-     * return true for isGroup as well.
+     * Return true if the current slot starts a node. A node is a kind of group so this will return
+     * true for isGroup as well.
      */
     val isNode
-        get() =
-            currentGroup < currentGroupEnd && groups.isNode(groupIndexToAddress(currentGroup))
+        get() = currentGroup < currentGroupEnd && groups.isNode(groupIndexToAddress(currentGroup))
 
-    /**
-     * Returns true if the writer is collecting source information
-     */
-    val collectingSourceInformation get() = sourceInformationMap != null
+    /** Returns true if the writer is collecting source information */
+    val collectingSourceInformation
+        get() = sourceInformationMap != null
 
-    /**
-     * Returns true if the writer is collecting called by information
-     */
-    val collectingCalledInformation get() = calledByMap != null
+    /** Returns true if the writer is collecting called by information */
+    val collectingCalledInformation
+        get() = calledByMap != null
 
-    /**
-     * Return true if the group at [index] is a node.
-     */
+    /** Return true if the group at [index] is a node. */
     fun isNode(index: Int) = groups.isNode(groupIndexToAddress(index))
 
-    /**
-     * return the number of nodes contained in the group at [index]
-     */
+    /** return the number of nodes contained in the group at [index] */
     fun nodeCount(index: Int) = groups.nodeCount(groupIndexToAddress(index))
 
-    /**
-     * Return the key for the group at [index].
-     */
+    /** Return the key for the group at [index]. */
     fun groupKey(index: Int): Int = groups.key(groupIndexToAddress(index))
 
-    /**
-     * Return the object key for the group at [index], if it has one, or null if not.
-     */
+    /** Return the object key for the group at [index], if it has one, or null if not. */
     fun groupObjectKey(index: Int): Any? {
         val address = groupIndexToAddress(index)
         return if (groups.hasObjectKey(address)) slots[groups.objectKeyIndex(address)] else null
     }
 
-    /**
-     * Return the size of the group at [index].
-     */
+    /** Return the size of the group at [index]. */
     fun groupSize(index: Int): Int = groups.groupSize(groupIndexToAddress(index))
 
-    /**
-     * Return the aux of the group at [index].
-     */
+    /** Return the aux of the group at [index]. */
     fun groupAux(index: Int): Any? {
         val address = groupIndexToAddress(index)
         return if (groups.hasAux(address)) slots[groups.auxIndex(address)] else Composer.Empty
     }
 
     @Suppress("ConvertTwoComparisonsToRangeCheck")
-    fun indexInParent(index: Int): Boolean = index > parent && index < currentGroupEnd ||
-        (parent == 0 && index == 0)
+    fun indexInParent(index: Int): Boolean =
+        index > parent && index < currentGroupEnd || (parent == 0 && index == 0)
 
     fun indexInCurrentGroup(index: Int): Boolean = indexInGroup(index, currentGroup)
 
@@ -1548,44 +1354,36 @@
     fun indexInGroup(index: Int, group: Int): Boolean {
         // If the group is open then the group size in the groups array has not been updated yet
         // so calculate the end from the stored anchor value in the end stack.
-        val end = when {
-            group == parent -> currentGroupEnd
-            group > startStack.peekOr(0) -> group + groupSize(group)
-            else -> {
-                val openIndex = startStack.indexOf(group)
-                when {
-                    openIndex < 0 -> group + groupSize(group)
-                    else -> (capacity - groupGapLen) - endStack.peek(openIndex)
+        val end =
+            when {
+                group == parent -> currentGroupEnd
+                group > startStack.peekOr(0) -> group + groupSize(group)
+                else -> {
+                    val openIndex = startStack.indexOf(group)
+                    when {
+                        openIndex < 0 -> group + groupSize(group)
+                        else -> (capacity - groupGapLen) - endStack.peek(openIndex)
+                    }
                 }
             }
-        }
         return index > group && index < end
     }
 
-    /**
-     * Return the node at [index] if [index] is a node group or null.
-     */
+    /** Return the node at [index] if [index] is a node group or null. */
     fun node(index: Int): Any? {
         val address = groupIndexToAddress(index)
-        return if (groups.isNode(address))
-            slots[dataIndexToDataAddress(groups.nodeIndex(address))]
+        return if (groups.isNode(address)) slots[dataIndexToDataAddress(groups.nodeIndex(address))]
         else null
     }
 
-    /**
-     * Return the node at [anchor] if it is a node group or null.
-     */
+    /** Return the node at [anchor] if it is a node group or null. */
     fun node(anchor: Anchor) = node(anchor.toIndexFor(this))
 
-    /**
-     * Return the index of the nearest group that contains [currentGroup].
-     */
+    /** Return the index of the nearest group that contains [currentGroup]. */
     var parent: Int = -1
         private set
 
-    /**
-     * Return the index of the parent for the group at [index].
-     */
+    /** Return the index of the parent for the group at [index]. */
     fun parent(index: Int) = groups.parent(index)
 
     /**
@@ -1594,15 +1392,11 @@
      */
     fun parent(anchor: Anchor) = if (anchor.valid) groups.parent(anchorIndex(anchor)) else -1
 
-    /**
-     * True if the writer has been closed
-     */
+    /** True if the writer has been closed */
     var closed = false
         private set
 
-    /**
-     * Close the writer
-     */
+    /** Close the writer */
     fun close(normalClose: Boolean) {
         closed = true
         // Ensure, for readers, there is no gap
@@ -1627,8 +1421,8 @@
 
     /**
      * Reset the writer to the beginning of the slot table and in the state as if it had just been
-     * opened. This differs form closing a writer and opening a new one in that the instance
-     * doesn't change and the gap in the slots are not reset to the end of the buffer.
+     * opened. This differs form closing a writer and opening a new one in that the instance doesn't
+     * change and the gap in the slots are not reset to the end of the buffer.
      */
     fun reset() {
         runtimeCheck(insertCount == 0) { "Cannot reset when inserting" }
@@ -1641,8 +1435,8 @@
     }
 
     /**
-     * Set the value of the next slot. Returns the previous value of the slot or [Composer.Empty]
-     * is being inserted.
+     * Set the value of the next slot. Returns the previous value of the slot or [Composer.Empty] is
+     * being inserted.
      */
     fun update(value: Any?): Any? {
         val result = skip()
@@ -1650,13 +1444,9 @@
         return result
     }
 
-    /**
-     * Append a slot to the [parent] group.
-     */
+    /** Append a slot to the [parent] group. */
     fun appendSlot(anchor: Anchor, value: Any?) {
-        runtimeCheck(insertCount == 0) {
-            "Can only append a slot if not current inserting"
-        }
+        runtimeCheck(insertCount == 0) { "Can only append a slot if not current inserting" }
         var previousCurrentSlot = currentSlot
         var previousCurrentSlotEnd = currentSlotEnd
         val anchorIndex = anchorIndex(anchor)
@@ -1682,12 +1472,12 @@
         runtimeCheck(removeStart >= groupSlotStart)
         removeSlots(removeStart, count, parent)
         val currentSlot = currentSlot
-        if (currentSlot >= groupSlotStart) { this.currentSlot = currentSlot - count }
+        if (currentSlot >= groupSlotStart) {
+            this.currentSlot = currentSlot - count
+        }
     }
 
-    /**
-     * Updates the data for the current data group.
-     */
+    /** Updates the data for the current data group. */
     fun updateAux(value: Any?) {
         val address = groupIndexToAddress(currentGroup)
         runtimeCheck(groups.hasAux(address)) {
@@ -1699,8 +1489,8 @@
     /**
      * Insert aux data into the parent group.
      *
-     * This must be done only after at most one value has been inserted into the slot table for
-     * the group.
+     * This must be done only after at most one value has been inserted into the slot table for the
+     * group.
      */
     fun insertAux(value: Any?) {
         runtimeCheck(insertCount >= 0) { "Cannot insert auxiliary data when not inserting" }
@@ -1741,75 +1531,58 @@
     fun recordGrouplessCallSourceInformationStart(key: Int, value: String) {
         if (insertCount > 0) {
             calledByMap?.add(key, groupKey(parent))
-            groupSourceInformationFor(parent, null)?.startGrouplessCall(
-                key, value, currentGroupSlotIndex
-            )
+            groupSourceInformationFor(parent, null)
+                ?.startGrouplessCall(key, value, currentGroupSlotIndex)
         }
     }
 
     fun recordGrouplessCallSourceInformationEnd() {
         if (insertCount > 0) {
-            groupSourceInformationFor(parent, null)?.endGrouplessCall(
-                currentGroupSlotIndex
-            )
+            groupSourceInformationFor(parent, null)?.endGrouplessCall(currentGroupSlotIndex)
         }
     }
 
     private fun groupSourceInformationFor(
         parent: Int,
         sourceInformation: String?
-    ): GroupSourceInformation? = sourceInformationMap?.getOrPut(anchor(parent)) {
-        val result = GroupSourceInformation(0, sourceInformation, 0)
+    ): GroupSourceInformation? =
+        sourceInformationMap?.getOrPut(anchor(parent)) {
+            val result = GroupSourceInformation(0, sourceInformation, 0)
 
-        // If we called from a groupless call then the groups added before this call
-        // are not reflected in this group information so they need to be added now
-        // if they exist.
-        if (sourceInformation == null) {
-            var child = parent + 1
-            val end = currentGroup
-            while (child < end) {
-                result.reportGroup(this, child)
-                child += groups.groupSize(child)
+            // If we called from a groupless call then the groups added before this call
+            // are not reflected in this group information so they need to be added now
+            // if they exist.
+            if (sourceInformation == null) {
+                var child = parent + 1
+                val end = currentGroup
+                while (child < end) {
+                    result.reportGroup(this, child)
+                    child += groups.groupSize(child)
+                }
             }
+
+            result
         }
 
-        result
-    }
-
-    /**
-     * Updates the node for the current node group to [value].
-     */
+    /** Updates the node for the current node group to [value]. */
     fun updateNode(value: Any?) = updateNodeOfGroup(currentGroup, value)
 
-    /**
-     * Update the node of a the group at [anchor] to [value].
-     */
+    /** Update the node of a the group at [anchor] to [value]. */
     fun updateNode(anchor: Anchor, value: Any?) = updateNodeOfGroup(anchor.toIndexFor(this), value)
 
-    /**
-     * Updates the node of the parent group.
-     */
+    /** Updates the node of the parent group. */
     fun updateParentNode(value: Any?) = updateNodeOfGroup(parent, value)
 
-    /**
-     * Set the value at the groups current data slot
-     */
+    /** Set the value at the groups current data slot */
     fun set(value: Any?) {
-        runtimeCheck(currentSlot <= currentSlotEnd) {
-            "Writing to an invalid slot"
-        }
+        runtimeCheck(currentSlot <= currentSlotEnd) { "Writing to an invalid slot" }
         slots[dataIndexToDataAddress(currentSlot - 1)] = value
     }
 
-    /**
-     * Set the group's slot at [index] to [value]. Returns the previous value.
-     */
-    fun set(index: Int, value: Any?): Any? =
-        set(currentGroup, index, value)
+    /** Set the group's slot at [index] to [value]. Returns the previous value. */
+    fun set(index: Int, value: Any?): Any? = set(currentGroup, index, value)
 
-    /**
-     * Convert a slot group index into a global slot index.
-     */
+    /** Convert a slot group index into a global slot index. */
     fun slotIndexOfGroupSlotIndex(group: Int, index: Int): Int {
         val address = groupIndexToAddress(group)
         val slotsStart = groups.slotIndex(address)
@@ -1822,9 +1595,7 @@
         return slotsIndex
     }
 
-    /**
-     * Set the [group] slot at [index] to [value]. Returns the previous value.
-     */
+    /** Set the [group] slot at [index] to [value]. Returns the previous value. */
     fun set(group: Int, index: Int, value: Any?): Any? {
         val slotsIndex = slotIndexOfGroupSlotIndex(group, index)
         val slotAddress = dataIndexToDataAddress(slotsIndex)
@@ -1845,8 +1616,8 @@
     }
 
     /**
-     * Read the [index] slot at the group at [anchor]. Returns [Composer.Empty] if the slot is
-     * empty (e.g. out of range).
+     * Read the [index] slot at the group at [anchor]. Returns [Composer.Empty] if the slot is empty
+     * (e.g. out of range).
      */
     fun slot(anchor: Anchor, index: Int) = slot(anchorIndex(anchor), index)
 
@@ -1866,9 +1637,7 @@
         return slots[slotAddress]
     }
 
-    /**
-     * Call [block] for up to [count] slots values at the end of the group's slots.
-     */
+    /** Call [block] for up to [count] slots values at the end of the group's slots. */
     inline fun forEachTailSlot(groupIndex: Int, count: Int, block: (Int, Any?) -> Unit) {
         val slotsStart = slotsStartIndex(groupIndex)
         val slotsEnd = slotsEndIndex(groupIndex)
@@ -1878,15 +1647,15 @@
     }
 
     /**
-     * Return the start index of the slot for [groupIndex]. Used in [forEachTailSlot] to
-     * enumerate slots.
+     * Return the start index of the slot for [groupIndex]. Used in [forEachTailSlot] to enumerate
+     * slots.
      */
     internal fun slotsStartIndex(groupIndex: Int): Int =
         groups.slotIndex(groupIndexToAddress(groupIndex))
 
     /**
-     * Return the end index of the slot for [groupIndex]. Used in [forEachTailSlot] to
-     * enumerate slots.
+     * Return the end index of the slot for [groupIndex]. Used in [forEachTailSlot] to enumerate
+     * slots.
      */
     internal fun slotsEndIndex(groupIndex: Int): Int =
         groups.dataIndex(groupIndexToAddress(groupIndex + 1))
@@ -1894,8 +1663,8 @@
     internal fun slotsEndAllIndex(groupIndex: Int): Int =
         groups.dataIndex(groupIndexToAddress(groupIndex + groupSize(groupIndex)))
 
-    private val currentGroupSlotIndex: Int get() =
-        currentSlot - slotsStartIndex(parent)
+    private val currentGroupSlotIndex: Int
+        get() = currentSlot - slotsStartIndex(parent)
 
     /**
      * Advance [currentGroup] by [amount]. The [currentGroup] group cannot be advanced outside the
@@ -1917,14 +1686,12 @@
     }
 
     /**
-     * Seek the current location to [anchor]. The [anchor] must be an anchor to a possibly
-     * indirect child of [parent].
+     * Seek the current location to [anchor]. The [anchor] must be an anchor to a possibly indirect
+     * child of [parent].
      */
     fun seek(anchor: Anchor) = advanceBy(anchor.toIndexFor(this) - currentGroup)
 
-    /**
-     * Skip to the end of the current group.
-     */
+    /** Skip to the end of the current group. */
     fun skipToGroupEnd() {
         val newGroup = currentGroupEnd
         currentGroup = newGroup
@@ -1941,9 +1708,7 @@
         }
     }
 
-    /**
-     * Ends inserting.
-     */
+    /** Ends inserting. */
     fun endInsert() {
         checkPrecondition(insertCount > 0) { "Unbalanced begin/end insert" }
         if (--insertCount == 0) {
@@ -1954,54 +1719,32 @@
         }
     }
 
-    /**
-     * Enter the group at current without changing it. Requires not currently inserting.
-     */
+    /** Enter the group at current without changing it. Requires not currently inserting. */
     fun startGroup() {
         runtimeCheck(insertCount == 0) { "Key must be supplied when inserting" }
         startGroup(key = 0, objectKey = Composer.Empty, isNode = false, aux = Composer.Empty)
     }
 
-    /**
-     * Start a group with a integer key
-     */
+    /** Start a group with a integer key */
     fun startGroup(key: Int) = startGroup(key, Composer.Empty, isNode = false, aux = Composer.Empty)
 
-    /**
-     * Start a group with a data key
-     */
-    fun startGroup(key: Int, dataKey: Any?) = startGroup(
-        key,
-        dataKey,
-        isNode = false,
-        aux = Composer.Empty
-    )
+    /** Start a group with a data key */
+    fun startGroup(key: Int, dataKey: Any?) =
+        startGroup(key, dataKey, isNode = false, aux = Composer.Empty)
 
-    /**
-     * Start a node.
-     */
+    /** Start a node. */
     fun startNode(key: Int, objectKey: Any?) =
         startGroup(key, objectKey, isNode = true, aux = Composer.Empty)
 
-    /**
-     * Start a node
-     */
+    /** Start a node */
     fun startNode(key: Int, objectKey: Any?, node: Any?) =
         startGroup(key, objectKey, isNode = true, aux = node)
 
-    /**
-     * Start a data group.
-     */
-    fun startData(key: Int, objectKey: Any?, aux: Any?) = startGroup(
-        key,
-        objectKey,
-        isNode = false,
-        aux = aux
-    )
+    /** Start a data group. */
+    fun startData(key: Int, objectKey: Any?, aux: Any?) =
+        startGroup(key, objectKey, isNode = false, aux = aux)
 
-    /**
-     * Start a data group.
-     */
+    /** Start a data group. */
     fun startData(key: Int, aux: Any?) = startGroup(key, Composer.Empty, isNode = false, aux = aux)
 
     private fun startGroup(key: Int, objectKey: Any?, isNode: Boolean, aux: Any?) {
@@ -2009,91 +1752,93 @@
         val inserting = insertCount > 0
         nodeCountStack.push(nodeCount)
 
-        currentGroupEnd = if (inserting) {
-            val current = currentGroup
-            val newCurrentSlot = groups.dataIndex(groupIndexToAddress(current))
-            insertGroups(1)
-            currentSlot = newCurrentSlot
-            currentSlotEnd = newCurrentSlot
-            val currentAddress = groupIndexToAddress(current)
-            val hasObjectKey = objectKey !== Composer.Empty
-            val hasAux = !isNode && aux !== Composer.Empty
-            val dataAnchor = dataIndexToDataAnchor(
-                index = newCurrentSlot,
-                gapLen = slotsGapLen,
-                gapStart = slotsGapStart,
-                capacity = slots.size
-            ).let { anchor ->
-                if (anchor >= 0 && slotsGapOwner < current) {
-                    // This is a special case where the a parent added slots to its group
-                    // setting the slotGapOwner back, but no intervening groups contain slots
-                    // so the slotCurrent is at the beginning fo the gap but is not owned by this
-                    // group. By definition the beginning of the gap is the index but there are
-                    // actually two valid anchor values for this location a positive one and a
-                    // negative (distance from theend of the slot array). In this case
-                    // moveSlotGapTo() the negative value for all groups after the slotGapOwner
-                    // so when the gap moves it can adjust the anchors correctly needs the negative
-                    // anchor.
-                    val slotsSize = slots.size - slotsGapLen
-                    -(slotsSize - anchor + 1)
-                } else anchor
-            }
-            groups.initGroup(
-                address = currentAddress,
-                key = key,
-                isNode = isNode,
-                hasDataKey = hasObjectKey,
-                hasData = hasAux,
-                parentAnchor = parent,
-                dataAnchor = dataAnchor
-            )
+        currentGroupEnd =
+            if (inserting) {
+                val current = currentGroup
+                val newCurrentSlot = groups.dataIndex(groupIndexToAddress(current))
+                insertGroups(1)
+                currentSlot = newCurrentSlot
+                currentSlotEnd = newCurrentSlot
+                val currentAddress = groupIndexToAddress(current)
+                val hasObjectKey = objectKey !== Composer.Empty
+                val hasAux = !isNode && aux !== Composer.Empty
+                val dataAnchor =
+                    dataIndexToDataAnchor(
+                            index = newCurrentSlot,
+                            gapLen = slotsGapLen,
+                            gapStart = slotsGapStart,
+                            capacity = slots.size
+                        )
+                        .let { anchor ->
+                            if (anchor >= 0 && slotsGapOwner < current) {
+                                // This is a special case where the a parent added slots to its
+                                // group
+                                // setting the slotGapOwner back, but no intervening groups contain
+                                // slots
+                                // so the slotCurrent is at the beginning fo the gap but is not
+                                // owned by this
+                                // group. By definition the beginning of the gap is the index but
+                                // there are
+                                // actually two valid anchor values for this location a positive one
+                                // and a
+                                // negative (distance from theend of the slot array). In this case
+                                // moveSlotGapTo() the negative value for all groups after the
+                                // slotGapOwner
+                                // so when the gap moves it can adjust the anchors correctly needs
+                                // the negative
+                                // anchor.
+                                val slotsSize = slots.size - slotsGapLen
+                                -(slotsSize - anchor + 1)
+                            } else anchor
+                        }
+                groups.initGroup(
+                    address = currentAddress,
+                    key = key,
+                    isNode = isNode,
+                    hasDataKey = hasObjectKey,
+                    hasData = hasAux,
+                    parentAnchor = parent,
+                    dataAnchor = dataAnchor
+                )
 
-            val dataSlotsNeeded = (if (isNode) 1 else 0) +
-                (if (hasObjectKey) 1 else 0) +
-                (if (hasAux) 1 else 0)
-            if (dataSlotsNeeded > 0) {
-                insertSlots(dataSlotsNeeded, current)
-                val slots = slots
-                var currentSlot = currentSlot
-                if (isNode) slots[currentSlot++] = aux
-                if (hasObjectKey) slots[currentSlot++] = objectKey
-                if (hasAux) slots[currentSlot++] = aux
-                this.currentSlot = currentSlot
-            }
-            nodeCount = 0
-            val newCurrent = current + 1
-            this.parent = current
-            this.currentGroup = newCurrent
-            if (previousParent >= 0) {
-                sourceInformationOf(previousParent)?.reportGroup(this, current)
-            }
-            newCurrent
-        } else {
-            startStack.push(previousParent)
-            saveCurrentGroupEnd()
-            val currentGroup = currentGroup
-            val currentGroupAddress = groupIndexToAddress(currentGroup)
-            if (aux != Composer.Empty) {
-                if (isNode)
-                    updateNode(aux)
-                else
-                    updateAux(aux)
-            }
-            currentSlot = groups.slotIndex(currentGroupAddress)
-            currentSlotEnd = groups.dataIndex(
-                groupIndexToAddress(this.currentGroup + 1)
-            )
-            nodeCount = groups.nodeCount(currentGroupAddress)
+                val dataSlotsNeeded =
+                    (if (isNode) 1 else 0) + (if (hasObjectKey) 1 else 0) + (if (hasAux) 1 else 0)
+                if (dataSlotsNeeded > 0) {
+                    insertSlots(dataSlotsNeeded, current)
+                    val slots = slots
+                    var currentSlot = currentSlot
+                    if (isNode) slots[currentSlot++] = aux
+                    if (hasObjectKey) slots[currentSlot++] = objectKey
+                    if (hasAux) slots[currentSlot++] = aux
+                    this.currentSlot = currentSlot
+                }
+                nodeCount = 0
+                val newCurrent = current + 1
+                this.parent = current
+                this.currentGroup = newCurrent
+                if (previousParent >= 0) {
+                    sourceInformationOf(previousParent)?.reportGroup(this, current)
+                }
+                newCurrent
+            } else {
+                startStack.push(previousParent)
+                saveCurrentGroupEnd()
+                val currentGroup = currentGroup
+                val currentGroupAddress = groupIndexToAddress(currentGroup)
+                if (aux != Composer.Empty) {
+                    if (isNode) updateNode(aux) else updateAux(aux)
+                }
+                currentSlot = groups.slotIndex(currentGroupAddress)
+                currentSlotEnd = groups.dataIndex(groupIndexToAddress(this.currentGroup + 1))
+                nodeCount = groups.nodeCount(currentGroupAddress)
 
-            this.parent = currentGroup
-            this.currentGroup = currentGroup + 1
-            currentGroup + groups.groupSize(currentGroupAddress)
-        }
+                this.parent = currentGroup
+                this.currentGroup = currentGroup + 1
+                currentGroup + groups.groupSize(currentGroupAddress)
+            }
     }
 
-    /**
-     * End the current group. Must be called after the corresponding startGroup().
-     */
+    /** End the current group. Must be called after the corresponding startGroup(). */
     fun endGroup(): Int {
         val inserting = insertCount > 0
         val currentGroup = currentGroup
@@ -2114,9 +1859,7 @@
             currentSlot = newCurrentSlot
             currentSlotEnd = newCurrentSlot
         } else {
-            runtimeCheck(currentGroup == currentGroupEnd) {
-                "Expected to be at the end of a group"
-            }
+            runtimeCheck(currentGroup == currentGroupEnd) { "Expected to be at the end of a group" }
             // Update group length
             val oldGroupSize = groups.groupSize(groupAddress)
             val oldNodes = groups.nodeCount(groupAddress)
@@ -2143,8 +1886,8 @@
                     var current = groupParent
                     while (
                         current != 0 &&
-                        current != newParent &&
-                        (nodesDelta != 0 || groupSizeDelta != 0)
+                            current != newParent &&
+                            (nodesDelta != 0 || groupSizeDelta != 0)
                     ) {
                         val currentAddress = groupIndexToAddress(current)
                         if (groupSizeDelta != 0) {
@@ -2174,8 +1917,8 @@
      * [currentGroup] is not at the start of a group for which [index] is not location the parent
      * group, an exception is thrown.
      *
-     * Calling [ensureStarted] implies that an [endGroup] should be called once the end of the
-     * group is reached.
+     * Calling [ensureStarted] implies that an [endGroup] should be called once the end of the group
+     * is reached.
      */
     fun ensureStarted(index: Int) {
         runtimeCheck(insertCount <= 0) { "Cannot call ensureStarted() while inserting" }
@@ -2200,9 +1943,7 @@
 
     fun ensureStarted(anchor: Anchor) = ensureStarted(anchor.toIndexFor(this))
 
-    /**
-     *  Skip the current group. Returns the number of nodes skipped by skipping the group.
-     */
+    /** Skip the current group. Returns the number of nodes skipped by skipping the group. */
     fun skipGroup(): Int {
         val groupAddress = groupIndexToAddress(currentGroup)
         val newGroup = currentGroup + groups.groupSize(groupAddress)
@@ -2211,9 +1952,7 @@
         return if (groups.isNode(groupAddress)) 1 else groups.nodeCount(groupAddress)
     }
 
-    /**
-     * Remove the current group. Returns if any anchors were in the group removed.
-     */
+    /** Remove the current group. Returns if any anchors were in the group removed. */
     fun removeGroup(): Boolean {
         runtimeCheck(insertCount == 0) { "Cannot remove group while inserting" }
         val oldGroup = currentGroup
@@ -2223,9 +1962,7 @@
 
         // Remove the group from its parent information
         sourceInformationOf(parent)?.let { sourceInformation ->
-            tryAnchor(oldGroup)?.let { anchor ->
-                sourceInformation.removeAnchor(anchor)
-            }
+            tryAnchor(oldGroup)?.let { anchor -> sourceInformation.removeAnchor(anchor) }
         }
 
         // Remove any recalculate markers ahead of this delete as they are in the group
@@ -2244,17 +1981,15 @@
         return anchorsRemoved
     }
 
-    /**
-     * Returns an iterator for all the slots of group and all the children of the group.
-     */
+    /** Returns an iterator for all the slots of group and all the children of the group. */
     fun groupSlots(): Iterator<Any?> {
         val start = groups.dataIndex(groupIndexToAddress(currentGroup))
-        val end = groups.dataIndex(
-            groupIndexToAddress(currentGroup + groupSize(currentGroup))
-        )
+        val end = groups.dataIndex(groupIndexToAddress(currentGroup + groupSize(currentGroup)))
         return object : Iterator<Any?> {
             var current = start
+
             override fun hasNext(): Boolean = current < end
+
             override fun next(): Any? =
                 if (hasNext()) slots[dataIndexToDataAddress(current++)] else null
         }
@@ -2273,9 +2008,7 @@
     inline fun forAllData(group: Int, block: (index: Int, data: Any?) -> Unit) {
         val address = groupIndexToAddress(group)
         val start = groups.dataIndex(address)
-        val end = groups.dataIndex(
-            groupIndexToAddress(currentGroup + groupSize(currentGroup))
-        )
+        val end = groups.dataIndex(groupIndexToAddress(currentGroup + groupSize(currentGroup)))
         for (slot in start until end) {
             block(slot, slots[dataIndexToDataAddress(slot)])
         }
@@ -2298,23 +2031,15 @@
         var count = offset
         var groupToMove = current
         while (count > 0) {
-            groupToMove += groups.groupSize(
-                address = groupIndexToAddress(groupToMove)
-            )
+            groupToMove += groups.groupSize(address = groupIndexToAddress(groupToMove))
             runtimeCheck(groupToMove <= parentEnd) { "Parameter offset is out of bounds" }
             count--
         }
 
-        val moveLen = groups.groupSize(
-            address = groupIndexToAddress(groupToMove)
-        )
+        val moveLen = groups.groupSize(address = groupIndexToAddress(groupToMove))
         val destinationSlot = groups.dataIndex(groupIndexToAddress(currentGroup))
         val dataStart = groups.dataIndex(groupIndexToAddress(groupToMove))
-        val dataEnd = groups.dataIndex(
-            address = groupIndexToAddress(
-                index = groupToMove + moveLen
-            )
-        )
+        val dataEnd = groups.dataIndex(address = groupIndexToAddress(index = groupToMove + moveLen))
         val moveDataLen = dataEnd - dataStart
 
         // The order of operations is important here. Moving a block in the array requires,
@@ -2382,12 +2107,13 @@
             val groupAddress = groupIndexToAddress(group)
             val oldIndex = groups.dataIndex(groupAddress)
             val newIndex = oldIndex - dataMoveDistance
-            val newAnchor = dataIndexToDataAnchor(
-                index = newIndex,
-                gapStart = if (slotsGapOwner < groupAddress) 0 else slotsGapStart,
-                gapLen = slotsGapLen,
-                capacity = slotsCapacity
-            )
+            val newAnchor =
+                dataIndexToDataAnchor(
+                    index = newIndex,
+                    gapStart = if (slotsGapOwner < groupAddress) 0 else slotsGapStart,
+                    gapLen = slotsGapLen,
+                    capacity = slotsCapacity
+                )
             groups.updateDataIndex(groupAddress, newAnchor)
         }
 
@@ -2471,19 +2197,20 @@
                     groups.updateParentAnchor(groupAddress, previousParent + parentDelta)
                 }
 
-                val newDataIndex = with(toWriter) {
-                    groups.dataIndex(groupAddress) + dataIndexDelta
-                }
-                val newDataAnchor = with(toWriter) {
-                    dataIndexToDataAnchor(
-                        newDataIndex,
-                        // Ensure that if the slotGapOwner is below groupAddress we get an end relative
-                        // anchor
-                        if (slotsGapOwner < groupAddress) 0 else slotsGapStart,
-                        slotsGapLen,
-                        slotsCapacity
-                    )
-                }
+                val newDataIndex =
+                    with(toWriter) { groups.dataIndex(groupAddress) + dataIndexDelta }
+                val newDataAnchor =
+                    with(toWriter) {
+                        dataIndexToDataAnchor(
+                            newDataIndex,
+                            // Ensure that if the slotGapOwner is below groupAddress we get an end
+                            // relative
+                            // anchor
+                            if (slotsGapOwner < groupAddress) 0 else slotsGapStart,
+                            slotsGapLen,
+                            slotsCapacity
+                        )
+                    }
 
                 // Update the data index
                 groups.updateDataAnchor(groupAddress, newDataAnchor)
@@ -2496,30 +2223,29 @@
             // Extract the anchors in range
             val startAnchors = fromWriter.anchors.locationOf(fromIndex, fromWriter.size)
             val endAnchors = fromWriter.anchors.locationOf(sourceGroupsEnd, fromWriter.size)
-            val anchors = if (startAnchors < endAnchors) {
-                val sourceAnchors = fromWriter.anchors
-                val anchors = ArrayList<Anchor>(endAnchors - startAnchors)
+            val anchors =
+                if (startAnchors < endAnchors) {
+                    val sourceAnchors = fromWriter.anchors
+                    val anchors = ArrayList<Anchor>(endAnchors - startAnchors)
 
-                // update the anchor locations to their new location
-                val anchorDelta = currentGroup - fromIndex
-                for (anchorIndex in startAnchors until endAnchors) {
-                    val sourceAnchor = sourceAnchors[anchorIndex]
-                    sourceAnchor.location += anchorDelta
-                    anchors.add(sourceAnchor)
-                }
+                    // update the anchor locations to their new location
+                    val anchorDelta = currentGroup - fromIndex
+                    for (anchorIndex in startAnchors until endAnchors) {
+                        val sourceAnchor = sourceAnchors[anchorIndex]
+                        sourceAnchor.location += anchorDelta
+                        anchors.add(sourceAnchor)
+                    }
 
-                // Insert them into the new table
-                val insertLocation = toWriter.anchors.locationOf(
-                    toWriter.currentGroup,
-                    toWriter.size
-                )
-                toWriter.anchors.addAll(insertLocation, anchors)
+                    // Insert them into the new table
+                    val insertLocation =
+                        toWriter.anchors.locationOf(toWriter.currentGroup, toWriter.size)
+                    toWriter.anchors.addAll(insertLocation, anchors)
 
-                // Remove them from the old table
-                sourceAnchors.subList(startAnchors, endAnchors).clear()
+                    // Remove them from the old table
+                    sourceAnchors.subList(startAnchors, endAnchors).clear()
 
-                anchors
-            } else emptyList()
+                    anchors
+                } else emptyList()
 
             // Move any source information from the source table to the destination table
             if (anchors.isNotEmpty()) {
@@ -2549,45 +2275,48 @@
                 it.addGroupAfter(toWriter, predecessor, endGroup)
             }
             val parentGroup = fromWriter.parent(fromIndex)
-            val anchorsRemoved = if (!removeSourceGroup) {
-                // e.g.: we can skip groups removal for insertTable of Composer because
-                // it's going to be disposed anyway after changes applied
-                false
-            } else if (updateFromCursor) {
-                // Remove the group using the sequence the writer expects when removing a group, that
-                // is the root group and the group's parent group must be correctly started and ended
-                // when it is not a root group.
-                val needsStartGroups = parentGroup >= 0
-                if (needsStartGroups) {
-                    // If we are not a root group then we are removing from a group so ensure the
-                    // root group is started and then seek to the parent group and start it.
-                    fromWriter.startGroup()
-                    fromWriter.advanceBy(parentGroup - fromWriter.currentGroup)
-                    fromWriter.startGroup()
+            val anchorsRemoved =
+                if (!removeSourceGroup) {
+                    // e.g.: we can skip groups removal for insertTable of Composer because
+                    // it's going to be disposed anyway after changes applied
+                    false
+                } else if (updateFromCursor) {
+                    // Remove the group using the sequence the writer expects when removing a group,
+                    // that
+                    // is the root group and the group's parent group must be correctly started and
+                    // ended
+                    // when it is not a root group.
+                    val needsStartGroups = parentGroup >= 0
+                    if (needsStartGroups) {
+                        // If we are not a root group then we are removing from a group so ensure
+                        // the
+                        // root group is started and then seek to the parent group and start it.
+                        fromWriter.startGroup()
+                        fromWriter.advanceBy(parentGroup - fromWriter.currentGroup)
+                        fromWriter.startGroup()
+                    }
+                    fromWriter.advanceBy(fromIndex - fromWriter.currentGroup)
+                    val anchorsRemoved = fromWriter.removeGroup()
+                    if (needsStartGroups) {
+                        fromWriter.skipToGroupEnd()
+                        fromWriter.endGroup()
+                        fromWriter.skipToGroupEnd()
+                        fromWriter.endGroup()
+                    }
+                    anchorsRemoved
+                } else {
+                    // Remove the group directly instead of using cursor operations.
+                    val anchorsRemoved = fromWriter.removeGroups(fromIndex, groupsToMove)
+                    fromWriter.removeSlots(sourceSlotsStart, slotsToMove, fromIndex - 1)
+                    anchorsRemoved
                 }
-                fromWriter.advanceBy(fromIndex - fromWriter.currentGroup)
-                val anchorsRemoved = fromWriter.removeGroup()
-                if (needsStartGroups) {
-                    fromWriter.skipToGroupEnd()
-                    fromWriter.endGroup()
-                    fromWriter.skipToGroupEnd()
-                    fromWriter.endGroup()
-                }
-                anchorsRemoved
-            } else {
-                // Remove the group directly instead of using cursor operations.
-                val anchorsRemoved = fromWriter.removeGroups(fromIndex, groupsToMove)
-                fromWriter.removeSlots(sourceSlotsStart, slotsToMove, fromIndex - 1)
-                anchorsRemoved
-            }
 
             // Ensure we correctly do not remove anchors with the above delete.
             runtimeCheck(!anchorsRemoved) { "Unexpectedly removed anchors" }
 
             // Update the node count in the toWriter
-            toWriter.nodeCount += if (groups.isNode(currentGroup)) 1 else groups.nodeCount(
-                currentGroup
-            )
+            toWriter.nodeCount +=
+                if (groups.isNode(currentGroup)) 1 else groups.nodeCount(currentGroup)
 
             // Move the toWriter's currentGroup passed the insert
             if (updateToCursor) {
@@ -2606,8 +2335,8 @@
 
     /**
      * Move (insert then delete) the group at [anchor] group into the current insert location of
-     * [writer]. All anchors in the group are moved into the slot table of [writer]. [anchor]
-     * must be a group contained in the current started group.
+     * [writer]. All anchors in the group are moved into the slot table of [writer]. [anchor] must
+     * be a group contained in the current started group.
      *
      * This requires [writer] be inserting and this writer to not be inserting.
      */
@@ -2621,13 +2350,14 @@
         val parent = parent(location)
         val size = groupSize(location)
         val nodes = if (isNode(location)) 1 else nodeCount(location)
-        val result = moveGroup(
-            fromWriter = this,
-            fromIndex = location,
-            toWriter = writer,
-            updateFromCursor = false,
-            updateToCursor = false
-        )
+        val result =
+            moveGroup(
+                fromWriter = this,
+                fromIndex = location,
+                toWriter = writer,
+                updateFromCursor = false,
+                updateToCursor = false
+            )
 
         updateContainsMark(parent)
 
@@ -2638,8 +2368,7 @@
             val currentAddress = groupIndexToAddress(current)
             groups.updateGroupSize(currentAddress, groups.groupSize(currentAddress) - size)
             if (updatingNodes) {
-                if (groups.isNode(currentAddress))
-                    updatingNodes = false
+                if (groups.isNode(currentAddress)) updatingNodes = false
                 else
                     groups.updateNodeCount(currentAddress, groups.nodeCount(currentAddress) - nodes)
             }
@@ -2665,9 +2394,10 @@
         runtimeCheck(insertCount > 0)
 
         if (
-            index == 0 && currentGroup == 0 &&
-            this.table.groupsSize == 0 &&
-            table.groups.groupSize(index) == table.groupsSize
+            index == 0 &&
+                currentGroup == 0 &&
+                this.table.groupsSize == 0 &&
+                table.groups.groupSize(index) == table.groupsSize
         ) {
             // Special case for moving the entire slot table into an empty table. This case occurs
             // during initial composition.
@@ -2693,15 +2423,7 @@
             this.sourceInformationMap = sourceInformation
             this.calledByMap = callInformation
 
-            table.setTo(
-                myGroups,
-                0,
-                mySlots,
-                0,
-                myAnchors,
-                mySourceInformation,
-                myCallInformation
-            )
+            table.setTo(myGroups, 0, mySlots, 0, myAnchors, mySourceInformation, myCallInformation)
             return this.anchors
         }
 
@@ -2746,15 +2468,10 @@
         advanceBy(offset)
         startGroup()
         beginInsert()
-        val anchors = table.write { tableWriter ->
-            moveGroup(
-                tableWriter,
-                index,
-                this,
-                updateFromCursor = false,
-                updateToCursor = true
-            )
-        }
+        val anchors =
+            table.write { tableWriter ->
+                moveGroup(tableWriter, index, this, updateFromCursor = false, updateToCursor = true)
+            }
         endInsert()
         endGroup()
         currentGroup = previousCurrentGroup
@@ -2763,12 +2480,11 @@
         return anchors
     }
 
-    /**
-     * Allocate an anchor to the current group or [index].
-     */
-    fun anchor(index: Int = currentGroup): Anchor = anchors.getOrAdd(index, size) {
-        Anchor(if (index <= groupGapStart) index else -(size - index))
-    }
+    /** Allocate an anchor to the current group or [index]. */
+    fun anchor(index: Int = currentGroup): Anchor =
+        anchors.getOrAdd(index, size) {
+            Anchor(if (index <= groupGapStart) index else -(size - index))
+        }
 
     fun markGroup(group: Int = parent) {
         val groupAddress = groupIndexToAddress(group)
@@ -2799,8 +2515,9 @@
 
     private fun updateContainsMark(group: Int) {
         if (group >= 0) {
-            (pendingRecalculateMarks ?: PrioritySet().also { pendingRecalculateMarks = it })
-                .add(group)
+            (pendingRecalculateMarks ?: PrioritySet().also { pendingRecalculateMarks = it }).add(
+                group
+            )
         }
     }
 
@@ -2825,9 +2542,7 @@
         return false
     }
 
-    /**
-     * Return the current anchor location while changing the slot table.
-     */
+    /** Return the current anchor location while changing the slot table. */
     fun anchorIndex(anchor: Anchor) = anchor.location.let { if (it < 0) size + it else it }
 
     override fun toString(): String {
@@ -2835,9 +2550,7 @@
             "gap=$groupGapStart-${groupGapStart + groupGapLen})"
     }
 
-    /**
-     * Save [currentGroupEnd] to [endStack].
-     */
+    /** Save [currentGroupEnd] to [endStack]. */
     private fun saveCurrentGroupEnd() {
         // Record the end location as relative to the end of the slot table so when we pop it
         // back off again all inserts and removes that happened while a child group was open
@@ -2845,9 +2558,7 @@
         endStack.push(capacity - groupGapLen - currentGroupEnd)
     }
 
-    /**
-     * Restore [currentGroupEnd] from [endStack].
-     */
+    /** Restore [currentGroupEnd] from [endStack]. */
     private fun restoreCurrentGroupEnd(): Int {
         val newGroupEnd = (capacity - groupGapLen) - endStack.pop()
         currentGroupEnd = newGroupEnd
@@ -2855,10 +2566,9 @@
     }
 
     /**
-     * As groups move their parent anchors need to be updated. This recursively updates the
-     * parent anchors [parent] starting at [firstChild] and ending at [endGroup]. These are
-     * passed as a parameter to as the [groups] does not contain the current values for [parent]
-     * yet.
+     * As groups move their parent anchors need to be updated. This recursively updates the parent
+     * anchors [parent] starting at [firstChild] and ending at [endGroup]. These are passed as a
+     * parameter to as the [groups] does not contain the current values for [parent] yet.
      */
     private fun fixParentAnchorsFor(parent: Int, endGroup: Int, firstChild: Int) {
         val parentAnchor = parentIndexToAnchor(parent, groupGapStart)
@@ -2871,9 +2581,7 @@
         }
     }
 
-    /**
-     * Move the gap in [groups] to [index].
-     */
+    /** Move the gap in [groups] to [index]. */
     private fun moveGroupGapTo(index: Int) {
         val gapLen = groupGapLen
         val gapStart = groupGapStart
@@ -2881,7 +2589,8 @@
             if (anchors.isNotEmpty()) updateAnchors(gapStart, index)
             if (gapLen > 0) {
                 val groups = groups
-                // Here physical is used to mean an index of the actual first int of the group in the
+                // Here physical is used to mean an index of the actual first int of the group in
+                // the
                 // array as opposed ot the logical address which is in groups of Group_Field_Size
                 // integers. IntArray.copyInto expects physical indexes.
                 val groupPhysicalAddress = index * Group_Fields_Size
@@ -3009,10 +2718,7 @@
                 val groups = groups
 
                 // Double the size of the array, but at least MinGrowthSize and >= size
-                val newCapacity = max(
-                    max(oldCapacity * 2, oldSize + size),
-                    MinGroupGrowthSize
-                )
+                val newCapacity = max(max(oldCapacity * 2, oldSize + size), MinGroupGrowthSize)
                 val newGroups = IntArray(newCapacity * Group_Fields_Size)
                 val newGapLen = newCapacity - oldSize
                 val oldGapEndAddress = gapStart + gapLen
@@ -3049,12 +2755,13 @@
             val index = if (oldSize > 0) dataIndex(currentGroup + size) else 0
 
             // If the slotGapOwner is before the current location ensure we get end relative offsets
-            val anchor = dataIndexToDataAnchor(
-                index,
-                if (slotsGapOwner < gapStart) 0 else slotsGapStart,
-                slotsGapLen,
-                slots.size
-            )
+            val anchor =
+                dataIndexToDataAnchor(
+                    index,
+                    if (slotsGapOwner < gapStart) 0 else slotsGapStart,
+                    slotsGapLen,
+                    slots.size
+                )
             for (groupAddress in gapStart until gapStart + size) {
                 groups.updateDataAnchor(groupAddress, anchor)
             }
@@ -3067,8 +2774,8 @@
 
     /**
      * Insert room into the slot table. This is performed by first moving the gap to [currentSlot]
-     * and then reducing the gap [size] slots. If the gap is smaller than [size] the gap is grown
-     * to at least accommodate [size] slots. The new slots are associated with [group].
+     * and then reducing the gap [size] slots. If the gap is smaller than [size] the gap is grown to
+     * at least accommodate [size] slots. The new slots are associated with [group].
      */
     private fun insertSlots(size: Int, group: Int) {
         if (size > 0) {
@@ -3083,10 +2790,7 @@
                 val oldSize = oldCapacity - gapLen
 
                 // Double the size of the array, but at least MinGrowthSize and >= size
-                val newCapacity = max(
-                    max(oldCapacity * 2, oldSize + size),
-                    MinSlotsGrowthSize
-                )
+                val newCapacity = max(max(oldCapacity * 2, oldSize + size), MinSlotsGrowthSize)
                 val newData = Array<Any?>(newCapacity) { null }
                 val newGapLen = newCapacity - oldSize
                 val oldGapEndAddress = gapStart + gapLen
@@ -3117,9 +2821,7 @@
         }
     }
 
-    /**
-     * Remove [len] group from [start].
-     */
+    /** Remove [len] group from [start]. */
     private fun removeGroups(start: Int, len: Int): Boolean {
         return if (len > 0) {
             var anchorsRemoved = false
@@ -3155,16 +2857,12 @@
     }
 
     private fun sourceInformationOf(group: Int): GroupSourceInformation? =
-        sourceInformationMap?.let { map ->
-            tryAnchor(group)?.let { anchor -> map[anchor] }
-        }
+        sourceInformationMap?.let { map -> tryAnchor(group)?.let { anchor -> map[anchor] } }
 
     internal fun tryAnchor(group: Int) =
         if (group in 0 until size) anchors.find(group, size) else null
 
-    /**
-     * Remove [len] slots from [start].
-     */
+    /** Remove [len] slots from [start]. */
     private fun removeSlots(start: Int, len: Int, group: Int) {
         if (len > 0) {
             val gapLen = slotsGapLen
@@ -3178,9 +2876,7 @@
         }
     }
 
-    /**
-     * A helper function to update the number of nodes in a group.
-     */
+    /** A helper function to update the number of nodes in a group. */
     private fun updateNodeOfGroup(index: Int, value: Any?) {
         val address = groupIndexToAddress(index)
         runtimeCheck(address < groups.size && groups.isNode(address)) {
@@ -3189,9 +2885,7 @@
         slots[dataIndexToDataAddress(groups.nodeIndex(address))] = value
     }
 
-    /**
-     * A helper function to update the anchors as the gap in [groups] moves.
-     */
+    /** A helper function to update the anchors as the gap in [groups] moves. */
     private fun updateAnchors(previousGapStart: Int, newGapStart: Int) {
         val gapLen = groupGapLen
         val size = capacity - gapLen
@@ -3226,9 +2920,7 @@
         }
     }
 
-    /**
-     * A helper function to remove the anchors for groups that are removed.
-     */
+    /** A helper function to remove the anchors for groups that are removed. */
     private fun removeAnchors(
         gapStart: Int,
         size: Int,
@@ -3237,9 +2929,10 @@
         val gapLen = groupGapLen
         val removeEnd = gapStart + size
         val groupsSize = capacity - gapLen
-        var index = anchors.locationOf(gapStart + size, groupsSize).let {
-            if (it >= anchors.size) it - 1 else it
-        }
+        var index =
+            anchors.locationOf(gapStart + size, groupsSize).let {
+                if (it >= anchors.size) it - 1 else it
+            }
         var removeAnchorEnd = 0
         var removeAnchorStart = index + 1
         while (index >= 0) {
@@ -3260,9 +2953,7 @@
         }
     }
 
-    /**
-     * A helper function to update anchors for groups that have moved.
-     */
+    /** A helper function to update anchors for groups that have moved. */
     private fun moveAnchors(originalLocation: Int, newLocation: Int, size: Int) {
         val end = originalLocation + size
         val groupsSize = this.size
@@ -3297,9 +2988,7 @@
         }
     }
 
-    /**
-     * A debugging aid that emits [groups] as a string.
-     */
+    /** A debugging aid that emits [groups] as a string. */
     @Suppress("unused")
     fun toDebugString(): String = buildString {
         appendLine(this@SlotWriter.toString())
@@ -3314,9 +3003,7 @@
         }
     }
 
-    /**
-     * A debugging aid that emits a group as a string into a string builder.
-     */
+    /** A debugging aid that emits a group as a string into a string builder. */
     private fun StringBuilder.groupAsString(index: Int) {
         val address = groupIndexToAddress(index)
         append("Group(")
@@ -3418,8 +3105,11 @@
         }
     }
 
-    internal val size get() = capacity - groupGapLen
-    private val capacity get() = groups.size / Group_Fields_Size
+    internal val size
+        get() = capacity - groupGapLen
+
+    private val capacity
+        get() = groups.size / Group_Fields_Size
 
     private fun groupIndexToAddress(index: Int) =
         if (index < groupGapStart) index else index + groupGapLen
@@ -3448,19 +3138,25 @@
     }
 
     private fun IntArray.nodeIndex(address: Int) = dataIndex(address)
+
     private fun IntArray.auxIndex(address: Int) =
         dataIndex(address) + countOneBits(groupInfo(address) shr (Aux_Shift + 1))
 
     @Suppress("unused")
-    private fun IntArray.dataIndexes() = groups.dataAnchors().let {
-        it.slice(0 until groupGapStart) +
-            it.slice(groupGapStart + groupGapLen until (size / Group_Fields_Size))
-    }.fastMap { anchor -> dataAnchorToDataIndex(anchor, slotsGapLen, slots.size) }
+    private fun IntArray.dataIndexes() =
+        groups
+            .dataAnchors()
+            .let {
+                it.slice(0 until groupGapStart) +
+                    it.slice(groupGapStart + groupGapLen until (size / Group_Fields_Size))
+            }
+            .fastMap { anchor -> dataAnchorToDataIndex(anchor, slotsGapLen, slots.size) }
 
     @Suppress("unused")
-    private fun keys() = groups.keys().fastFilterIndexed { index, _ ->
-        index < groupGapStart || index >= groupGapStart + groupGapLen
-    }
+    private fun keys() =
+        groups.keys().fastFilterIndexed { index, _ ->
+            index < groupGapStart || index >= groupGapStart + groupGapLen
+        }
 
     private fun dataIndexToDataAnchor(index: Int, gapStart: Int, gapLen: Int, capacity: Int) =
         if (index > gapStart) -((capacity - gapLen) - index + 1) else index
@@ -3476,47 +3172,45 @@
 }
 
 // Summarize the toString of an object.
-private fun String.summarize(size: Int) = this
-    .replace("androidx.", "a.")
-    .replace("compose.", "c.")
-    .replace("runtime.", "r.")
-    .replace("internal.", "ι.")
-    .replace("ui.", "u.")
-    .replace("Modifier", "μ")
-    .replace("material.", "m.")
-    .replace("Function", "λ")
-    .replace("OpaqueKey", "κ")
-    .replace("MutableState", "σ")
-    .let {
-        it.substring(0, min(size, it.length))
-    }
+private fun String.summarize(size: Int) =
+    this.replace("androidx.", "a.")
+        .replace("compose.", "c.")
+        .replace("runtime.", "r.")
+        .replace("internal.", "ι.")
+        .replace("ui.", "u.")
+        .replace("Modifier", "μ")
+        .replace("material.", "m.")
+        .replace("Function", "λ")
+        .replace("OpaqueKey", "κ")
+        .replace("MutableState", "σ")
+        .let { it.substring(0, min(size, it.length)) }
 
 private class SlotTableGroup(
     val table: SlotTable,
     val group: Int,
     val version: Int = table.version
 ) : CompositionGroup, Iterable<CompositionGroup> {
-    override val isEmpty: Boolean get() = table.groups.groupSize(group) == 0
+    override val isEmpty: Boolean
+        get() = table.groups.groupSize(group) == 0
 
     override val key: Any
-        get() = if (table.groups.hasObjectKey(group))
-            table.slots[table.groups.objectKeyIndex(group)]!!
-        else table.groups.key(group)
+        get() =
+            if (table.groups.hasObjectKey(group)) table.slots[table.groups.objectKeyIndex(group)]!!
+            else table.groups.key(group)
 
     override val sourceInfo: String?
-        get() = if (table.groups.hasAux(group))
-            table.slots[table.groups.auxIndex(group)] as? String
-        else table.sourceInformationOf(group)?.sourceInformation
+        get() =
+            if (table.groups.hasAux(group)) table.slots[table.groups.auxIndex(group)] as? String
+            else table.sourceInformationOf(group)?.sourceInformation
 
     override val node: Any?
-        get() = if (table.groups.isNode(group))
-            table.slots[table.groups.nodeIndex(group)] else
-            null
+        get() = if (table.groups.isNode(group)) table.slots[table.groups.nodeIndex(group)] else null
 
-    override val data: Iterable<Any?> get() =
-        table.sourceInformationOf(group)?.let {
-            SourceInformationGroupDataIterator(table, group, it)
-        } ?: DataIterator(table, group)
+    override val data: Iterable<Any?>
+        get() =
+            table.sourceInformationOf(group)?.let {
+                SourceInformationGroupDataIterator(table, group, it)
+            } ?: DataIterator(table, group)
 
     override val identity: Any
         get() {
@@ -3524,25 +3218,24 @@
             return table.read { it.anchor(group) }
         }
 
-    override val compositionGroups: Iterable<CompositionGroup> get() = this
+    override val compositionGroups: Iterable<CompositionGroup>
+        get() = this
 
     override fun iterator(): Iterator<CompositionGroup> {
         validateRead()
         return table.sourceInformationOf(group)?.let {
             SourceInformationGroupIterator(table, group, it, AnchoredGroupPath(group))
-        } ?: GroupIterator(
-            table,
-            group + 1,
-            group + table.groups.groupSize(group)
-        )
+        } ?: GroupIterator(table, group + 1, group + table.groups.groupSize(group))
     }
 
-    override val groupSize: Int get() = table.groups.groupSize(group)
+    override val groupSize: Int
+        get() = table.groups.groupSize(group)
 
     override val slotsSize: Int
         get() {
             val nextGroup = group + groupSize
-            val nextSlot = if (nextGroup < table.groupsSize) table.groups.dataAnchor(nextGroup)
+            val nextSlot =
+                if (nextGroup < table.groupsSize) table.groups.dataAnchor(nextGroup)
                 else table.slotsSize
             return nextSlot - table.groups.dataAnchor(group)
         }
@@ -3578,23 +3271,20 @@
     }
 }
 
-private data class SourceInformationSlotTableGroupIdentity(
-    val parentIdentity: Any,
-    val index: Int
-)
+private data class SourceInformationSlotTableGroupIdentity(val parentIdentity: Any, val index: Int)
 
 private sealed class SourceInformationGroupPath {
     abstract fun getIdentity(table: SlotTable): Any
 }
 
 private class AnchoredGroupPath(val group: Int) : SourceInformationGroupPath() {
-    override fun getIdentity(table: SlotTable): Any { return table.anchor(group) }
+    override fun getIdentity(table: SlotTable): Any {
+        return table.anchor(group)
+    }
 }
 
-private class RelativeGroupPath(
-    val parent: SourceInformationGroupPath,
-    val index: Int
-) : SourceInformationGroupPath() {
+private class RelativeGroupPath(val parent: SourceInformationGroupPath, val index: Int) :
+    SourceInformationGroupPath() {
     override fun getIdentity(table: SlotTable): Any {
         return SourceInformationSlotTableGroupIdentity(parent.getIdentity(table), index)
     }
@@ -3607,23 +3297,28 @@
     val identityPath: SourceInformationGroupPath
 ) : CompositionGroup, Iterable<CompositionGroup> {
     override val key: Any = sourceInformation.key
-    override val sourceInfo: String? get() = sourceInformation.sourceInformation
-    override val node: Any? get() = null
-    override val data: Iterable<Any?> get() =
-        SourceInformationGroupDataIterator(table, parent, sourceInformation)
+    override val sourceInfo: String?
+        get() = sourceInformation.sourceInformation
+
+    override val node: Any?
+        get() = null
+
+    override val data: Iterable<Any?>
+        get() = SourceInformationGroupDataIterator(table, parent, sourceInformation)
+
     override val compositionGroups: Iterable<CompositionGroup> = this
-    override val identity: Any get() = identityPath.getIdentity(table)
+    override val identity: Any
+        get() = identityPath.getIdentity(table)
+
     override val isEmpty: Boolean
         get() = sourceInformation.groups?.isEmpty() != false
+
     override fun iterator(): Iterator<CompositionGroup> =
         SourceInformationGroupIterator(table, parent, sourceInformation, identityPath)
 }
 
-private class GroupIterator(
-    val table: SlotTable,
-    start: Int,
-    val end: Int
-) : Iterator<CompositionGroup> {
+private class GroupIterator(val table: SlotTable, start: Int, val end: Int) :
+    Iterator<CompositionGroup> {
     private var index = start
     private val version = table.version
 
@@ -3653,16 +3348,16 @@
     group: Int,
 ) : Iterable<Any?>, Iterator<Any?> {
     val start = table.groups.dataAnchor(group)
-    val end = if (group + 1 < table.groupsSize)
-        table.groups.dataAnchor(group + 1) else table.slotsSize
+    val end =
+        if (group + 1 < table.groupsSize) table.groups.dataAnchor(group + 1) else table.slotsSize
     var index = start
+
     override fun iterator(): Iterator<Any?> = this
+
     override fun hasNext(): Boolean = index < end
-    override fun next(): Any? = (
-        if (index >= 0 && index < table.slots.size)
-            table.slots[index]
-        else null
-    ).also { index++ }
+
+    override fun next(): Any? =
+        (if (index >= 0 && index < table.slots.size) table.slots[index] else null).also { index++ }
 }
 
 private class SourceInformationGroupDataIterator(
@@ -3672,27 +3367,33 @@
 ) : Iterable<Any?>, Iterator<Any?> {
     private val base = table.groups.dataAnchor(group)
     private val start: Int = sourceInformation.dataStartOffset
-    private val end: Int = sourceInformation.dataEndOffset.let {
-        if (it > 0) it else (if (group + 1 < table.groupsSize)
-            table.groups.dataAnchor(group + 1) else table.slotsSize) -
-            base
-    }
-    private val filter = BitVector().also {
-        // Filter any groups
-        val groups = sourceInformation.groups ?: return@also
-        groups.fastForEach { info ->
-            if (info is GroupSourceInformation) {
-                it.setRange(info.dataStartOffset, info.dataEndOffset)
+    private val end: Int =
+        sourceInformation.dataEndOffset.let {
+            if (it > 0) it
+            else
+                (if (group + 1 < table.groupsSize) table.groups.dataAnchor(group + 1)
+                else table.slotsSize) - base
+        }
+    private val filter =
+        BitVector().also {
+            // Filter any groups
+            val groups = sourceInformation.groups ?: return@also
+            groups.fastForEach { info ->
+                if (info is GroupSourceInformation) {
+                    it.setRange(info.dataStartOffset, info.dataEndOffset)
+                }
             }
         }
-    }
     private var index = filter.nextClear(start)
 
     override fun iterator(): Iterator<Any?> = this
+
     override fun hasNext() = index < end
-    override fun next(): Any? = (
-        if (index in 0 until end) table.slots[base + index] else null
-    ).also { index = filter.nextClear(index + 1) }
+
+    override fun next(): Any? =
+        (if (index in 0 until end) table.slots[base + index] else null).also {
+            index = filter.nextClear(index + 1)
+        }
 }
 
 internal class BitVector {
@@ -3700,7 +3401,8 @@
     private var second: Long = 0
     private var others: LongArray? = null
 
-    val size get() = others.let { if (it != null) (it.size + 2) * 64 else 128 }
+    val size
+        get() = others.let { if (it != null) (it.size + 2) * 64 else 128 }
 
     operator fun get(index: Int): Boolean {
         if (index < 0 || index >= size) error("Index $index out of bound")
@@ -3726,11 +3428,13 @@
         }
         val address = (index / 64) - 2
         val mask = 1L shl (index % 64)
-        var others = others ?: run {
-            val others = LongArray(address + 1)
-            this.others = others
+        var others =
             others
-        }
+                ?: run {
+                    val others = LongArray(address + 1)
+                    this.others = others
+                    others
+                }
         if (address >= others.size) {
             others = others.copyOf(address + 1)
             this.others = others
@@ -3781,7 +3485,9 @@
 ) : Iterator<CompositionGroup> {
     private val version = table.version
     private var index = 0
+
     override fun hasNext(): Boolean = group.groups?.let { index < it.size } ?: false
+
     override fun next(): CompositionGroup {
         return when (val group = group.groups?.get(index++)) {
             is Anchor -> SlotTableGroup(table, group.location, version)
@@ -3855,13 +3561,15 @@
     this[address * Group_Fields_Size + GroupInfo_Offset] and NodeBit_Mask != 0
 
 private fun IntArray.nodeIndex(address: Int) = this[address * Group_Fields_Size + DataAnchor_Offset]
+
 private fun IntArray.hasObjectKey(address: Int) =
     this[address * Group_Fields_Size + GroupInfo_Offset] and ObjectKey_Mask != 0
 
-private fun IntArray.objectKeyIndex(address: Int) = (address * Group_Fields_Size).let { slot ->
-    this[slot + DataAnchor_Offset] +
-        countOneBits(this[slot + GroupInfo_Offset] shr (ObjectKey_Shift + 1))
-}
+private fun IntArray.objectKeyIndex(address: Int) =
+    (address * Group_Fields_Size).let { slot ->
+        this[slot + DataAnchor_Offset] +
+            countOneBits(this[slot + GroupInfo_Offset] shr (ObjectKey_Shift + 1))
+    }
 
 private fun IntArray.hasAux(address: Int) =
     this[address * Group_Fields_Size + GroupInfo_Offset] and Aux_Mask != 0
@@ -3896,36 +3604,38 @@
 }
 
 private fun IntArray.containsAnyMark(address: Int) =
-    this[address * Group_Fields_Size + GroupInfo_Offset] and
-        (ContainsMark_Mask or Mark_Mask) != 0
+    this[address * Group_Fields_Size + GroupInfo_Offset] and (ContainsMark_Mask or Mark_Mask) != 0
 
-private fun IntArray.auxIndex(address: Int) = (address * Group_Fields_Size).let { slot ->
-    if (slot >= size) size
-    else this[slot + DataAnchor_Offset] +
-        countOneBits(this[slot + GroupInfo_Offset] shr (Aux_Shift + 1))
-}
+private fun IntArray.auxIndex(address: Int) =
+    (address * Group_Fields_Size).let { slot ->
+        if (slot >= size) size
+        else
+            this[slot + DataAnchor_Offset] +
+                countOneBits(this[slot + GroupInfo_Offset] shr (Aux_Shift + 1))
+    }
 
-private fun IntArray.slotAnchor(address: Int) = (address * Group_Fields_Size).let { slot ->
-    this[slot + DataAnchor_Offset] +
-        countOneBits(this[slot + GroupInfo_Offset] shr Slots_Shift)
-}
+private fun IntArray.slotAnchor(address: Int) =
+    (address * Group_Fields_Size).let { slot ->
+        this[slot + DataAnchor_Offset] + countOneBits(this[slot + GroupInfo_Offset] shr Slots_Shift)
+    }
 
 // Count the 1 bits of value less than 8
-private fun countOneBits(value: Int) = when (value) {
-    0 -> 0
-    1 -> 1
-    2 -> 1
-    3 -> 2
-    4 -> 1
-    5 -> 2
-    6 -> 2
-    else -> 3
-}
+private fun countOneBits(value: Int) =
+    when (value) {
+        0 -> 0
+        1 -> 1
+        2 -> 1
+        3 -> 2
+        4 -> 1
+        5 -> 2
+        6 -> 2
+        else -> 3
+    }
 
 // Key access
 private fun IntArray.key(address: Int) = this[address * Group_Fields_Size]
-private fun IntArray.keys(len: Int = size) =
-    slice(Key_Offset until len step Group_Fields_Size)
+
+private fun IntArray.keys(len: Int = size) = slice(Key_Offset until len step Group_Fields_Size)
 
 // Node count access
 private fun IntArray.nodeCount(address: Int) =
@@ -3939,8 +3649,7 @@
 }
 
 private fun IntArray.nodeCounts(len: Int = size) =
-    slice(GroupInfo_Offset until len step Group_Fields_Size)
-        .fastMap { it and NodeCount_Mask }
+    slice(GroupInfo_Offset until len step Group_Fields_Size).fastMap { it and NodeCount_Mask }
 
 // Parent anchor
 private fun IntArray.parentAnchor(address: Int) =
@@ -3955,6 +3664,7 @@
 
 // Slot count access
 private fun IntArray.groupSize(address: Int) = this[address * Group_Fields_Size + Size_Offset]
+
 private fun IntArray.updateGroupSize(address: Int, value: Int) {
     runtimeCheck(value >= 0)
     this[address * Group_Fields_Size + Size_Offset] = value
@@ -4030,9 +3740,7 @@
     return if (location >= 0) get(location) else null
 }
 
-/**
- * This is inlined here instead to avoid allocating a lambda for the compare when this is used.
- */
+/** This is inlined here instead to avoid allocating a lambda for the compare when this is used. */
 private fun ArrayList<Anchor>.search(location: Int, effectiveSize: Int): Int {
     var low = 0
     var high = size - 1
@@ -4059,10 +3767,10 @@
     search(index, effectiveSize).let { if (it >= 0) it else -(it + 1) }
 
 /**
- * PropertySet implements a set which allows recording integers into a set an efficiently
- * extracting the greatest max value out of the set. It does this using the heap structure from a
- * heap sort that ensures that adding or removing a value is O(log N) operation even if values are
- * repeatedly added and removed.
+ * PropertySet implements a set which allows recording integers into a set an efficiently extracting
+ * the greatest max value out of the set. It does this using the heap structure from a heap sort
+ * that ensures that adding or removing a value is O(log N) operation even if values are repeatedly
+ * added and removed.
  */
 internal class PrioritySet(private val list: MutableList<Int> = mutableListOf()) {
     // Add a value to the heap
@@ -4086,7 +3794,9 @@
     }
 
     fun isEmpty() = list.isEmpty()
+
     fun isNotEmpty() = list.isNotEmpty()
+
     fun peek() = list.first()
 
     // Remove a de-duplicated value from the heap
diff --git a/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/SnapshotDoubleState.kt b/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/SnapshotDoubleState.kt
index 2fd78ed..81a6b63 100644
--- a/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/SnapshotDoubleState.kt
+++ b/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/SnapshotDoubleState.kt
@@ -43,7 +43,6 @@
  * when using `MutableState<Double>`.
  *
  * @param value the initial value for the [MutableDoubleState]
- *
  * @see DoubleState
  * @see MutableDoubleState
  * @see mutableStateOf
@@ -52,9 +51,8 @@
  * @see mutableFloatStateOf
  */
 @StateFactoryMarker
-fun mutableDoubleStateOf(
-    value: Double
-): MutableDoubleState = createSnapshotMutableDoubleState(value)
+fun mutableDoubleStateOf(value: Double): MutableDoubleState =
+    createSnapshotMutableDoubleState(value)
 
 /**
  * A value holder where reads to the [doubleValue] property during the execution of a [Composable]
@@ -73,21 +71,17 @@
     val doubleValue: Double
 }
 
-/**
- * Permits property delegation of `val`s using `by` for [DoubleState].
- */
+/** Permits property delegation of `val`s using `by` for [DoubleState]. */
 @Suppress("NOTHING_TO_INLINE")
-inline operator fun DoubleState.getValue(
-    thisObj: Any?,
-    property: KProperty<*>
-): Double = doubleValue
+inline operator fun DoubleState.getValue(thisObj: Any?, property: KProperty<*>): Double =
+    doubleValue
 
 /**
  * A value holder where reads to the [doubleValue] property during the execution of a [Composable]
  * function cause the current [RecomposeScope] to subscribe to changes of that value. When the
- * [doubleValue] property is written to and changed, a recomposition of any subscribed [RecomposeScope]s
- * will be scheduled. If [doubleValue] is written to with the same value, no recompositions will be
- * scheduled.
+ * [doubleValue] property is written to and changed, a recomposition of any subscribed
+ * [RecomposeScope]s will be scheduled. If [doubleValue] is written to with the same value, no
+ * recompositions will be scheduled.
  *
  * @see [DoubleState]
  * @see [mutableDoubleStateOf]
@@ -99,14 +93,14 @@
     @set:AutoboxingStateValueProperty("doubleValue")
     override var value: Double
         @Suppress("AutoBoxing") get() = doubleValue
-        set(value) { doubleValue = value }
+        set(value) {
+            doubleValue = value
+        }
 
     override var doubleValue: Double
 }
 
-/**
- * Permits property delegation of `var`s using `by` for [MutableDoubleState].
- */
+/** Permits property delegation of `var`s using `by` for [MutableDoubleState]. */
 @Suppress("NOTHING_TO_INLINE")
 inline operator fun MutableDoubleState.setValue(
     thisObj: Any?,
@@ -116,9 +110,7 @@
     this.doubleValue = value
 }
 
-internal expect fun createSnapshotMutableDoubleState(
-    value: Double
-): MutableDoubleState
+internal expect fun createSnapshotMutableDoubleState(value: Double): MutableDoubleState
 
 /**
  * A single value holder whose reads and writes are observed by Compose.
@@ -126,31 +118,32 @@
  * Additionally, writes to it are transacted as part of the [Snapshot] system.
  *
  * @param value the wrapped value
- *
  * @see [mutableDoubleStateOf]
  */
-internal open class SnapshotMutableDoubleStateImpl(
-    value: Double
-) : StateObjectImpl(), MutableDoubleState, SnapshotMutableState<Double> {
+internal open class SnapshotMutableDoubleStateImpl(value: Double) :
+    StateObjectImpl(), MutableDoubleState, SnapshotMutableState<Double> {
 
-    private var next = DoubleStateStateRecord(value).also {
-        if (Snapshot.isInSnapshot) {
-            it.next = DoubleStateStateRecord(value).also { next ->
-                next.snapshotId = Snapshot.PreexistingSnapshotId
+    private var next =
+        DoubleStateStateRecord(value).also {
+            if (Snapshot.isInSnapshot) {
+                it.next =
+                    DoubleStateStateRecord(value).also { next ->
+                        next.snapshotId = Snapshot.PreexistingSnapshotId
+                    }
             }
         }
-    }
 
     override val firstStateRecord: StateRecord
         get() = next
 
     override var doubleValue: Double
         get() = next.readable(this).value
-        set(value) = next.withCurrent {
-            if (!it.value.equalsWithNanFix(value)) {
-                next.overwritable(this, it) { this.value = value }
+        set(value) =
+            next.withCurrent {
+                if (!it.value.equalsWithNanFix(value)) {
+                    next.overwritable(this, it) { this.value = value }
+                }
             }
-        }
 
     // Arbitrary policies are not allowed. The underlying `==` implementation
     // for primitive types corresponds to structural equality
@@ -179,13 +172,10 @@
         }
     }
 
-    override fun toString(): String = next.withCurrent {
-        "MutableDoubleState(value=${it.value})@${hashCode()}"
-    }
+    override fun toString(): String =
+        next.withCurrent { "MutableDoubleState(value=${it.value})@${hashCode()}" }
 
-    private class DoubleStateStateRecord(
-        var value: Double
-    ) : StateRecord() {
+    private class DoubleStateStateRecord(var value: Double) : StateRecord() {
         override fun assign(value: StateRecord) {
             this.value = (value as DoubleStateStateRecord).value
         }
diff --git a/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/SnapshotFloatState.kt b/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/SnapshotFloatState.kt
index c6d1a55..afe2f15 100644
--- a/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/SnapshotFloatState.kt
+++ b/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/SnapshotFloatState.kt
@@ -43,7 +43,6 @@
  * when using `MutableState<Float>`.
  *
  * @param value the initial value for the [MutableFloatState]
- *
  * @see FloatState
  * @see MutableFloatState
  * @see mutableStateOf
@@ -52,9 +51,7 @@
  * @see mutableDoubleStateOf
  */
 @StateFactoryMarker
-fun mutableFloatStateOf(
-    value: Float
-): MutableFloatState = createSnapshotMutableFloatState(value)
+fun mutableFloatStateOf(value: Float): MutableFloatState = createSnapshotMutableFloatState(value)
 
 /**
  * A value holder where reads to the [floatValue] property during the execution of a [Composable]
@@ -73,18 +70,16 @@
     val floatValue: Float
 }
 
-/**
- * Permits property delegation of `val`s using `by` for [FloatState].
- */
+/** Permits property delegation of `val`s using `by` for [FloatState]. */
 @Suppress("NOTHING_TO_INLINE")
 inline operator fun FloatState.getValue(thisObj: Any?, property: KProperty<*>): Float = floatValue
 
 /**
  * A value holder where reads to the [floatValue] property during the execution of a [Composable]
  * function cause the current [RecomposeScope] to subscribe to changes of that value. When the
- * [floatValue] property is written to and changed, a recomposition of any subscribed [RecomposeScope]s
- * will be scheduled. If [floatValue] is written to with the same value, no recompositions will be
- * scheduled.
+ * [floatValue] property is written to and changed, a recomposition of any subscribed
+ * [RecomposeScope]s will be scheduled. If [floatValue] is written to with the same value, no
+ * recompositions will be scheduled.
  *
  * @see [FloatState]
  * @see [mutableDoubleStateOf]
@@ -96,14 +91,14 @@
     @set:AutoboxingStateValueProperty("floatValue")
     override var value: Float
         @Suppress("AutoBoxing") get() = floatValue
-        set(value) { floatValue = value }
+        set(value) {
+            floatValue = value
+        }
 
     override var floatValue: Float
 }
 
-/**
- * Permits property delegation of `var`s using `by` for [MutableFloatState].
- */
+/** Permits property delegation of `var`s using `by` for [MutableFloatState]. */
 @Suppress("NOTHING_TO_INLINE")
 inline operator fun MutableFloatState.setValue(
     thisObj: Any?,
@@ -113,9 +108,7 @@
     this.floatValue = value
 }
 
-internal expect fun createSnapshotMutableFloatState(
-    value: Float
-): MutableFloatState
+internal expect fun createSnapshotMutableFloatState(value: Float): MutableFloatState
 
 /**
  * A single value holder whose reads and writes are observed by Compose.
@@ -123,31 +116,32 @@
  * Additionally, writes to it are transacted as part of the [Snapshot] system.
  *
  * @param value the wrapped value
- *
  * @see [mutableDoubleStateOf]
  */
-internal open class SnapshotMutableFloatStateImpl(
-    value: Float
-) : StateObjectImpl(), MutableFloatState, SnapshotMutableState<Float> {
+internal open class SnapshotMutableFloatStateImpl(value: Float) :
+    StateObjectImpl(), MutableFloatState, SnapshotMutableState<Float> {
 
-    private var next = FloatStateStateRecord(value).also {
-        if (Snapshot.isInSnapshot) {
-            it.next = FloatStateStateRecord(value).also { next ->
-                next.snapshotId = Snapshot.PreexistingSnapshotId
+    private var next =
+        FloatStateStateRecord(value).also {
+            if (Snapshot.isInSnapshot) {
+                it.next =
+                    FloatStateStateRecord(value).also { next ->
+                        next.snapshotId = Snapshot.PreexistingSnapshotId
+                    }
             }
         }
-    }
 
     override val firstStateRecord: StateRecord
         get() = next
 
     override var floatValue: Float
         get() = next.readable(this).value
-        set(value) = next.withCurrent {
-            if (!it.value.equalsWithNanFix(value)) {
-                next.overwritable(this, it) { this.value = value }
+        set(value) =
+            next.withCurrent {
+                if (!it.value.equalsWithNanFix(value)) {
+                    next.overwritable(this, it) { this.value = value }
+                }
             }
-        }
 
     // Arbitrary policies are not allowed. The underlying `==` implementation
     // for primitive types corresponds to structural equality
@@ -176,13 +170,10 @@
         }
     }
 
-    override fun toString(): String = next.withCurrent {
-        "MutableFloatState(value=${it.value})@${hashCode()}"
-    }
+    override fun toString(): String =
+        next.withCurrent { "MutableFloatState(value=${it.value})@${hashCode()}" }
 
-    private class FloatStateStateRecord(
-        var value: Float
-    ) : StateRecord() {
+    private class FloatStateStateRecord(var value: Float) : StateRecord() {
         override fun assign(value: StateRecord) {
             this.value = (value as FloatStateStateRecord).value
         }
diff --git a/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/SnapshotFlow.kt b/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/SnapshotFlow.kt
index c218f71..cfd6585 100644
--- a/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/SnapshotFlow.kt
+++ b/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/SnapshotFlow.kt
@@ -35,10 +35,10 @@
 import kotlinx.coroutines.withContext
 
 /**
- * Collects values from this [StateFlow] and represents its latest value via [State].
- * The [StateFlow.value] is used as an initial value. Every time there would be new value posted
- * into the [StateFlow] the returned [State] will be updated causing recomposition of every
- * [State.value] usage.
+ * Collects values from this [StateFlow] and represents its latest value via [State]. The
+ * [StateFlow.value] is used as an initial value. Every time there would be new value posted into
+ * the [StateFlow] the returned [State] will be updated causing recomposition of every [State.value]
+ * usage.
  *
  * @sample androidx.compose.runtime.samples.StateFlowSample
  *
@@ -46,9 +46,8 @@
  */
 @Suppress("StateFlowValueCalledInComposition")
 @Composable
-fun <T> StateFlow<T>.collectAsState(
-    context: CoroutineContext = EmptyCoroutineContext
-): State<T> = collectAsState(value, context)
+fun <T> StateFlow<T>.collectAsState(context: CoroutineContext = EmptyCoroutineContext): State<T> =
+    collectAsState(value, context)
 
 /**
  * Collects values from this [Flow] and represents its latest value via [State]. Every time there
@@ -64,24 +63,22 @@
 fun <T : R, R> Flow<T>.collectAsState(
     initial: R,
     context: CoroutineContext = EmptyCoroutineContext
-): State<R> = produceState(initial, this, context) {
-    if (context == EmptyCoroutineContext) {
-        collect { value = it }
-    } else withContext(context) {
-        collect { value = it }
+): State<R> =
+    produceState(initial, this, context) {
+        if (context == EmptyCoroutineContext) {
+            collect { value = it }
+        } else withContext(context) { collect { value = it } }
     }
-}
 
 /**
  * Create a [Flow] from observable [Snapshot] state. (e.g. state holders returned by
  * [mutableStateOf][androidx.compose.runtime.mutableStateOf].)
  *
- * [snapshotFlow] creates a [Flow] that runs [block] when collected and emits the result,
- * recording any snapshot state that was accessed. While collection continues, if a new [Snapshot]
- * is applied that changes state accessed by [block], the flow will run [block] again,
- * re-recording the snapshot state that was accessed.
- * If the result of [block] is not [equal to][Any.equals] the previous result, the flow will emit
- * that new result. (This behavior is similar to that of
+ * [snapshotFlow] creates a [Flow] that runs [block] when collected and emits the result, recording
+ * any snapshot state that was accessed. While collection continues, if a new [Snapshot] is applied
+ * that changes state accessed by [block], the flow will run [block] again, re-recording the
+ * snapshot state that was accessed. If the result of [block] is not [equal to][Any.equals] the
+ * previous result, the flow will emit that new result. (This behavior is similar to that of
  * [Flow.distinctUntilChanged][kotlinx.coroutines.flow.distinctUntilChanged].) Collection will
  * continue indefinitely unless it is explicitly cancelled or limited by the use of other [Flow]
  * operators.
@@ -91,29 +88,26 @@
  * [block] is run in a **read-only** [Snapshot] and may not modify snapshot data. If [block]
  * attempts to modify snapshot data, flow collection will fail with [IllegalStateException].
  *
- * [block] may run more than once for equal sets of inputs or only once after many rapid
- * snapshot changes; it should be idempotent and free of side effects.
+ * [block] may run more than once for equal sets of inputs or only once after many rapid snapshot
+ * changes; it should be idempotent and free of side effects.
  *
  * When working with [Snapshot] state it is useful to keep the distinction between **events** and
  * **state** in mind. [snapshotFlow] models snapshot changes as events, but events **cannot** be
  * effectively modeled as observable state. Observable state is a lossy compression of the events
  * that produced that state.
  *
- * An observable **event** happens at a point in time and is discarded. All registered observers
- * at the time the event occurred are notified. All individual events in a stream are assumed
- * to be relevant and may build on one another; repeated equal events have meaning and therefore
- * a registered observer must observe all events without skipping.
+ * An observable **event** happens at a point in time and is discarded. All registered observers at
+ * the time the event occurred are notified. All individual events in a stream are assumed to be
+ * relevant and may build on one another; repeated equal events have meaning and therefore a
+ * registered observer must observe all events without skipping.
  *
- * Observable **state** raises change events when the state changes from one value to a new,
- * unequal value. State change events are **conflated;** only the most recent state matters.
- * Observers of state changes must therefore be **idempotent;** given the same state value the
- * observer should produce the same result. It is valid for a state observer to both skip
- * intermediate states as well as run multiple times for the same state and the result should
- * be the same.
+ * Observable **state** raises change events when the state changes from one value to a new, unequal
+ * value. State change events are **conflated;** only the most recent state matters. Observers of
+ * state changes must therefore be **idempotent;** given the same state value the observer should
+ * produce the same result. It is valid for a state observer to both skip intermediate states as
+ * well as run multiple times for the same state and the result should be the same.
  */
-fun <T> snapshotFlow(
-    block: () -> T
-): Flow<T> = flow {
+fun <T> snapshotFlow(block: () -> T): Flow<T> = flow {
     // Objects read the last time block was run
     val readSet = MutableScatterSet<Any>()
     val readObserver: (Any) -> Unit = {
@@ -128,24 +122,25 @@
 
     // Register the apply observer before running for the first time
     // so that we don't miss updates.
-    val unregisterApplyObserver = Snapshot.registerApplyObserver { changed, _ ->
-        val maybeObserved = changed.fastAny {
-            it !is StateObjectImpl || it.isReadIn(ReaderKind.SnapshotFlow)
-        }
+    val unregisterApplyObserver =
+        Snapshot.registerApplyObserver { changed, _ ->
+            val maybeObserved =
+                changed.fastAny { it !is StateObjectImpl || it.isReadIn(ReaderKind.SnapshotFlow) }
 
-        if (maybeObserved) {
-            appliedChanges.trySend(changed)
-        }
-    }
-
-    try {
-        var lastValue = Snapshot.takeSnapshot(readObserver).run {
-            try {
-                enter(block)
-            } finally {
-                dispose()
+            if (maybeObserved) {
+                appliedChanges.trySend(changed)
             }
         }
+
+    try {
+        var lastValue =
+            Snapshot.takeSnapshot(readObserver).run {
+                try {
+                    enter(block)
+                } finally {
+                    dispose()
+                }
+            }
         emit(lastValue)
 
         while (true) {
@@ -162,13 +157,14 @@
 
             if (found) {
                 readSet.clear()
-                val newValue = Snapshot.takeSnapshot(readObserver).run {
-                    try {
-                        enter(block)
-                    } finally {
-                        dispose()
+                val newValue =
+                    Snapshot.takeSnapshot(readObserver).run {
+                        try {
+                            enter(block)
+                        } finally {
+                            dispose()
+                        }
                     }
-                }
 
                 if (newValue != lastValue) {
                     lastValue = newValue
@@ -181,5 +177,4 @@
     }
 }
 
-private fun MutableScatterSet<Any>.intersects(set: Set<Any>) =
-    any { it in set }
+private fun MutableScatterSet<Any>.intersects(set: Set<Any>) = any { it in set }
diff --git a/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/SnapshotIntState.kt b/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/SnapshotIntState.kt
index 4f3abd1..107df59 100644
--- a/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/SnapshotIntState.kt
+++ b/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/SnapshotIntState.kt
@@ -42,7 +42,6 @@
  * using `MutableState<Int>`.
  *
  * @param value the initial value for the [MutableIntState]
- *
  * @see IntState
  * @see MutableIntState
  * @see mutableStateOf
@@ -51,9 +50,7 @@
  * @see mutableDoubleStateOf
  */
 @StateFactoryMarker
-fun mutableIntStateOf(
-    value: Int
-): MutableIntState = createSnapshotMutableIntState(value)
+fun mutableIntStateOf(value: Int): MutableIntState = createSnapshotMutableIntState(value)
 
 /**
  * A value holder where reads to the [intValue] property during the execution of a [Composable]
@@ -72,18 +69,16 @@
     val intValue: Int
 }
 
-/**
- * Permits property delegation of `val`s using `by` for [IntState].
- */
+/** Permits property delegation of `val`s using `by` for [IntState]. */
 @Suppress("NOTHING_TO_INLINE")
 inline operator fun IntState.getValue(thisObj: Any?, property: KProperty<*>): Int = intValue
 
 /**
  * A value holder where reads to the [intValue] property during the execution of a [Composable]
  * function cause the current [RecomposeScope] to subscribe to changes of that value. When the
- * [intValue] property is written to and changed, a recomposition of any subscribed [RecomposeScope]s
- * will be scheduled. If [intValue] is written to with the same value, no recompositions will be
- * scheduled.
+ * [intValue] property is written to and changed, a recomposition of any subscribed
+ * [RecomposeScope]s will be scheduled. If [intValue] is written to with the same value, no
+ * recompositions will be scheduled.
  *
  * @see [IntState]
  * @see [mutableDoubleStateOf]
@@ -95,20 +90,16 @@
     @set:AutoboxingStateValueProperty("intValue")
     override var value: Int
         @Suppress("AutoBoxing") get() = intValue
-        set(value) { intValue = value }
+        set(value) {
+            intValue = value
+        }
 
     override var intValue: Int
 }
 
-/**
- * Permits property delegation of `var`s using `by` for [MutableIntState].
- */
+/** Permits property delegation of `var`s using `by` for [MutableIntState]. */
 @Suppress("NOTHING_TO_INLINE")
-inline operator fun MutableIntState.setValue(
-    thisObj: Any?,
-    property: KProperty<*>,
-    value: Int
-) {
+inline operator fun MutableIntState.setValue(thisObj: Any?, property: KProperty<*>, value: Int) {
     intValue = value
 }
 
@@ -116,9 +107,7 @@
  * Returns a platform-specific implementation of [MutableIntState] based on
  * [SnapshotMutableStateImpl].
  */
-internal expect fun createSnapshotMutableIntState(
-    value: Int
-): MutableIntState
+internal expect fun createSnapshotMutableIntState(value: Int): MutableIntState
 
 /**
  * A single value holder whose reads and writes are observed by Compose.
@@ -126,31 +115,32 @@
  * Additionally, writes to it are transacted as part of the [Snapshot] system.
  *
  * @param value the wrapped value
- *
  * @see [mutableDoubleStateOf]
  */
-internal open class SnapshotMutableIntStateImpl(
-    value: Int
-) : StateObjectImpl(), MutableIntState, SnapshotMutableState<Int> {
+internal open class SnapshotMutableIntStateImpl(value: Int) :
+    StateObjectImpl(), MutableIntState, SnapshotMutableState<Int> {
 
-    private var next = IntStateStateRecord(value).also {
-        if (Snapshot.isInSnapshot) {
-            it.next = IntStateStateRecord(value).also { next ->
-                next.snapshotId = Snapshot.PreexistingSnapshotId
+    private var next =
+        IntStateStateRecord(value).also {
+            if (Snapshot.isInSnapshot) {
+                it.next =
+                    IntStateStateRecord(value).also { next ->
+                        next.snapshotId = Snapshot.PreexistingSnapshotId
+                    }
             }
         }
-    }
 
     override val firstStateRecord: StateRecord
         get() = next
 
     override var intValue: Int
         get() = next.readable(this).value
-        set(value) = next.withCurrent {
-            if (it.value != value) {
-                next.overwritable(this, it) { this.value = value }
+        set(value) =
+            next.withCurrent {
+                if (it.value != value) {
+                    next.overwritable(this, it) { this.value = value }
+                }
             }
-        }
 
     // Arbitrary policies are not allowed. The underlying `==` implementation
     // for primitive types corresponds to structural equality
@@ -179,18 +169,14 @@
         }
     }
 
-    override fun toString(): String = next.withCurrent {
-        "MutableIntState(value=${it.value})@${hashCode()}"
-    }
+    override fun toString(): String =
+        next.withCurrent { "MutableIntState(value=${it.value})@${hashCode()}" }
 
     @InternalComposeApi
     val debuggerDisplayValue: Int
-        @JvmName("getDebuggerDisplayValue")
-        get() = next.withCurrent { it.value }
+        @JvmName("getDebuggerDisplayValue") get() = next.withCurrent { it.value }
 
-    private class IntStateStateRecord(
-        var value: Int
-    ) : StateRecord() {
+    private class IntStateStateRecord(var value: Int) : StateRecord() {
         override fun assign(value: StateRecord) {
             this.value = (value as IntStateStateRecord).value
         }
diff --git a/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/SnapshotLongState.kt b/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/SnapshotLongState.kt
index 52100d3..22a244f 100644
--- a/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/SnapshotLongState.kt
+++ b/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/SnapshotLongState.kt
@@ -42,7 +42,6 @@
  * when using `MutableState<Long>`.
  *
  * @param value the initial value for the [MutableLongState]
- *
  * @see LongState
  * @see MutableLongState
  * @see mutableStateOf
@@ -51,9 +50,7 @@
  * @see mutableDoubleStateOf
  */
 @StateFactoryMarker
-fun mutableLongStateOf(
-    value: Long
-): MutableLongState = createSnapshotMutableLongState(value)
+fun mutableLongStateOf(value: Long): MutableLongState = createSnapshotMutableLongState(value)
 
 /**
  * A value holder where reads to the [longValue] property during the execution of a [Composable]
@@ -72,18 +69,16 @@
     val longValue: Long
 }
 
-/**
- * Permits property delegation of `val`s using `by` for [LongState].
- */
+/** Permits property delegation of `val`s using `by` for [LongState]. */
 @Suppress("NOTHING_TO_INLINE")
 inline operator fun LongState.getValue(thisObj: Any?, property: KProperty<*>): Long = longValue
 
 /**
  * A value holder where reads to the [longValue] property during the execution of a [Composable]
  * function cause the current [RecomposeScope] to subscribe to changes of that value. When the
- * [longValue] property is written to and changed, a recomposition of any subscribed [RecomposeScope]s
- * will be scheduled. If [longValue] is written to with the same value, no recompositions will be
- * scheduled.
+ * [longValue] property is written to and changed, a recomposition of any subscribed
+ * [RecomposeScope]s will be scheduled. If [longValue] is written to with the same value, no
+ * recompositions will be scheduled.
  *
  * @see [LongState]
  * @see [mutableDoubleStateOf]
@@ -95,26 +90,20 @@
     @set:AutoboxingStateValueProperty("longValue")
     override var value: Long
         @Suppress("AutoBoxing") get() = longValue
-        set(value) { longValue = value }
+        set(value) {
+            longValue = value
+        }
 
     override var longValue: Long
 }
 
-/**
- * Permits property delegation of `var`s using `by` for [MutableLongState].
- */
+/** Permits property delegation of `var`s using `by` for [MutableLongState]. */
 @Suppress("NOTHING_TO_INLINE")
-inline operator fun MutableLongState.setValue(
-    thisObj: Any?,
-    property: KProperty<*>,
-    value: Long
-) {
+inline operator fun MutableLongState.setValue(thisObj: Any?, property: KProperty<*>, value: Long) {
     longValue = value
 }
 
-internal expect fun createSnapshotMutableLongState(
-    value: Long
-): MutableLongState
+internal expect fun createSnapshotMutableLongState(value: Long): MutableLongState
 
 /**
  * A single value holder whose reads and writes are observed by Compose.
@@ -122,31 +111,32 @@
  * Additionally, writes to it are transacted as part of the [Snapshot] system.
  *
  * @param value the wrapped value
- *
  * @see [mutableDoubleStateOf]
  */
-internal open class SnapshotMutableLongStateImpl(
-    value: Long
-) : StateObjectImpl(), MutableLongState, SnapshotMutableState<Long> {
+internal open class SnapshotMutableLongStateImpl(value: Long) :
+    StateObjectImpl(), MutableLongState, SnapshotMutableState<Long> {
 
-    private var next = LongStateStateRecord(value).also {
-        if (Snapshot.isInSnapshot) {
-            it.next = LongStateStateRecord(value).also { next ->
-                next.snapshotId = Snapshot.PreexistingSnapshotId
+    private var next =
+        LongStateStateRecord(value).also {
+            if (Snapshot.isInSnapshot) {
+                it.next =
+                    LongStateStateRecord(value).also { next ->
+                        next.snapshotId = Snapshot.PreexistingSnapshotId
+                    }
             }
         }
-    }
 
     override val firstStateRecord: StateRecord
         get() = next
 
     override var longValue: Long
         get() = next.readable(this).value
-        set(value) = next.withCurrent {
-            if (it.value != value) {
-                next.overwritable(this, it) { this.value = value }
+        set(value) =
+            next.withCurrent {
+                if (it.value != value) {
+                    next.overwritable(this, it) { this.value = value }
+                }
             }
-        }
 
     // Arbitrary policies are not allowed. The underlying `==` implementation
     // for primitive types corresponds to structural equality
@@ -175,13 +165,10 @@
         }
     }
 
-    override fun toString(): String = next.withCurrent {
-        "MutableLongState(value=${it.value})@${hashCode()}"
-    }
+    override fun toString(): String =
+        next.withCurrent { "MutableLongState(value=${it.value})@${hashCode()}" }
 
-    private class LongStateStateRecord(
-        var value: Long
-    ) : StateRecord() {
+    private class LongStateStateRecord(var value: Long) : StateRecord() {
         override fun assign(value: StateRecord) {
             this.value = (value as LongStateStateRecord).value
         }
diff --git a/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/SnapshotMutationPolicy.kt b/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/SnapshotMutationPolicy.kt
index caf2695..93bd6c9 100644
--- a/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/SnapshotMutationPolicy.kt
+++ b/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/SnapshotMutationPolicy.kt
@@ -25,8 +25,8 @@
 import kotlin.jvm.JvmName
 
 /**
- * A policy to control how the result of [mutableStateOf] report and merge changes to
- * the state object.
+ * A policy to control how the result of [mutableStateOf] report and merge changes to the state
+ * object.
  *
  * A mutation policy can be passed as an parameter to [mutableStateOf], and [compositionLocalOf].
  *
@@ -48,9 +48,9 @@
      * Merge conflicting changes in snapshots. This is only called if [current] and [applied] are
      * not [equivalent]. If a valid merged value can be calculated then it should be returned.
      *
-     * For example, if the state object holds an immutable data class with multiple fields,
-     * and [applied] has changed fields that are unmodified by [current] it might be valid to return
-     * a new copy of the data class that combines that changes from both [current] and [applied]
+     * For example, if the state object holds an immutable data class with multiple fields, and
+     * [applied] has changed fields that are unmodified by [current] it might be valid to return a
+     * new copy of the data class that combines that changes from both [current] and [applied]
      * allowing a snapshot to apply that would have otherwise failed.
      *
      * @sample androidx.compose.runtime.samples.counterSample
@@ -61,9 +61,9 @@
 /**
  * A policy to treat values of a [MutableState] as equivalent if they are referentially (===) equal.
  *
- * Setting [MutableState.value] to its current referentially (===) equal value is not considered
- * a change. When applying a [MutableSnapshot], if the snapshot changes the value to the
- * equivalent value the parent snapshot has is not considered a conflict.
+ * Setting [MutableState.value] to its current referentially (===) equal value is not considered a
+ * change. When applying a [MutableSnapshot], if the snapshot changes the value to the equivalent
+ * value the parent snapshot has is not considered a conflict.
  */
 @Suppress("UNCHECKED_CAST")
 fun <T> referentialEqualityPolicy(): SnapshotMutationPolicy<T> =
@@ -78,9 +78,9 @@
 /**
  * A policy to treat values of a [MutableState] as equivalent if they are structurally (==) equal.
  *
- * Setting [MutableState.value] to its current structurally (==) equal value is not considered
- * a change. When applying a [MutableSnapshot], if the snapshot changes the value to the
- * equivalent value the parent snapshot has is not considered a conflict.
+ * Setting [MutableState.value] to its current structurally (==) equal value is not considered a
+ * change. When applying a [MutableSnapshot], if the snapshot changes the value to the equivalent
+ * value the parent snapshot has is not considered a conflict.
  */
 @Suppress("UNCHECKED_CAST")
 fun <T> structuralEqualityPolicy(): SnapshotMutationPolicy<T> =
diff --git a/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/SnapshotState.kt b/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/SnapshotState.kt
index 41081f3..6c7dc84 100644
--- a/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/SnapshotState.kt
+++ b/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/SnapshotState.kt
@@ -36,15 +36,18 @@
 /**
  * Return a new [MutableState] initialized with the passed in [value]
  *
- * The MutableState class is a single value holder whose reads and writes are observed by
- * Compose. Additionally, writes to it are transacted as part of the [Snapshot] system.
+ * The MutableState class is a single value holder whose reads and writes are observed by Compose.
+ * Additionally, writes to it are transacted as part of the [Snapshot] system.
  *
  * @param value the initial value for the [MutableState]
  * @param policy a policy to controls how changes are handled in mutable snapshots.
  *
  * @sample androidx.compose.runtime.samples.SimpleStateSample
+ *
  * @sample androidx.compose.runtime.samples.DestructuredStateSample
+ *
  * @sample androidx.compose.runtime.samples.observeUserSample
+ *
  * @sample androidx.compose.runtime.samples.stateSample
  *
  * @see State
@@ -94,7 +97,9 @@
 @Stable
 interface MutableState<T> : State<T> {
     override var value: T
+
     operator fun component1(): T
+
     operator fun component2(): (T) -> Unit
 }
 
@@ -108,9 +113,7 @@
     this.value = value
 }
 
-/**
- * Returns platform specific implementation based on [SnapshotMutableStateImpl].
- */
+/** Returns platform specific implementation based on [SnapshotMutableStateImpl]. */
 internal expect fun <T> createSnapshotMutableState(
     value: T,
     policy: SnapshotMutationPolicy<T>
@@ -123,7 +126,6 @@
  *
  * @param value the wrapped value
  * @param policy a policy to control how changes are handled in a mutable snapshot.
- *
  * @see mutableStateOf
  * @see SnapshotMutationPolicy
  */
@@ -134,19 +136,22 @@
     @Suppress("UNCHECKED_CAST")
     override var value: T
         get() = next.readable(this).value
-        set(value) = next.withCurrent {
-            if (!policy.equivalent(it.value, value)) {
-                next.overwritable(this, it) { this.value = value }
+        set(value) =
+            next.withCurrent {
+                if (!policy.equivalent(it.value, value)) {
+                    next.overwritable(this, it) { this.value = value }
+                }
             }
-        }
 
-    private var next: StateStateRecord<T> = StateStateRecord(value).also {
-        if (Snapshot.isInSnapshot) {
-            it.next = StateStateRecord(value).also { next ->
-                next.snapshotId = Snapshot.PreexistingSnapshotId
+    private var next: StateStateRecord<T> =
+        StateStateRecord(value).also {
+            if (Snapshot.isInSnapshot) {
+                it.next =
+                    StateStateRecord(value).also { next ->
+                        next.snapshotId = Snapshot.PreexistingSnapshotId
+                    }
             }
         }
-    }
 
     override val firstStateRecord: StateRecord
         get() = next
@@ -165,27 +170,20 @@
         val previousRecord = previous as StateStateRecord<T>
         val currentRecord = current as StateStateRecord<T>
         val appliedRecord = applied as StateStateRecord<T>
-        return if (policy.equivalent(currentRecord.value, appliedRecord.value))
-            current
+        return if (policy.equivalent(currentRecord.value, appliedRecord.value)) current
         else {
-            val merged = policy.merge(
-                previousRecord.value,
-                currentRecord.value,
-                appliedRecord.value
-            )
+            val merged =
+                policy.merge(previousRecord.value, currentRecord.value, appliedRecord.value)
             if (merged != null) {
-                appliedRecord.create().also {
-                    (it as StateStateRecord<T>).value = merged
-                }
+                appliedRecord.create().also { (it as StateStateRecord<T>).value = merged }
             } else {
                 null
             }
         }
     }
 
-    override fun toString(): String = next.withCurrent {
-        "MutableState(value=${it.value})@${hashCode()}"
-    }
+    override fun toString(): String =
+        next.withCurrent { "MutableState(value=${it.value})@${hashCode()}" }
 
     private class StateStateRecord<T>(myValue: T) : StateRecord() {
         override fun assign(value: StateRecord) {
@@ -218,8 +216,7 @@
      */
     @Suppress("unused")
     val debuggerDisplayValue: T
-        @JvmName("getDebuggerDisplayValue")
-        get() = next.withCurrent { it }.value
+        @JvmName("getDebuggerDisplayValue") get() = next.withCurrent { it }.value
 }
 
 /**
@@ -232,8 +229,7 @@
  * @see MutableList
  * @see Snapshot.takeSnapshot
  */
-@StateFactoryMarker
-fun <T> mutableStateListOf() = SnapshotStateList<T>()
+@StateFactoryMarker fun <T> mutableStateListOf() = SnapshotStateList<T>()
 
 /**
  * Create an instance of [MutableList]<T> that is observable and can be snapshot.
@@ -248,8 +244,7 @@
     SnapshotStateList<T>().also { it.addAll(elements.toList()) }
 
 /**
- * Create an instance of [MutableList]<T> from a collection that is observable and can be
- * snapshot.
+ * Create an instance of [MutableList]<T> from a collection that is observable and can be snapshot.
  */
 fun <T> Collection<T>.toMutableStateList() = SnapshotStateList<T>().also { it.addAll(this) }
 
@@ -263,8 +258,7 @@
  * @see MutableMap
  * @see Snapshot.takeSnapshot
  */
-@StateFactoryMarker
-fun <K, V> mutableStateMapOf() = SnapshotStateMap<K, V>()
+@StateFactoryMarker fun <K, V> mutableStateMapOf() = SnapshotStateMap<K, V>()
 
 /**
  * Create a instance of [MutableMap]<K, V> that is observable and can be snapshot.
@@ -287,15 +281,15 @@
     SnapshotStateMap<K, V>().also { it.putAll(this.toMap()) }
 
 /**
- * [remember] a [mutableStateOf] [newValue] and update its value to [newValue] on each
- * recomposition of the [rememberUpdatedState] call.
+ * [remember] a [mutableStateOf] [newValue] and update its value to [newValue] on each recomposition
+ * of the [rememberUpdatedState] call.
  *
- * [rememberUpdatedState] should be used when parameters or values computed during composition
- * are referenced by a long-lived lambda or object expression. Recomposition will update the
- * resulting [State] without recreating the long-lived lambda or object, allowing that object to
- * persist without cancelling and resubscribing, or relaunching a long-lived operation that may
- * be expensive or prohibitive to recreate and restart.
- * This may be common when working with [DisposableEffect] or [LaunchedEffect], for example:
+ * [rememberUpdatedState] should be used when parameters or values computed during composition are
+ * referenced by a long-lived lambda or object expression. Recomposition will update the resulting
+ * [State] without recreating the long-lived lambda or object, allowing that object to persist
+ * without cancelling and resubscribing, or relaunching a long-lived operation that may be expensive
+ * or prohibitive to recreate and restart. This may be common when working with [DisposableEffect]
+ * or [LaunchedEffect], for example:
  *
  * @sample androidx.compose.runtime.samples.rememberUpdatedStateSampleWithDisposableEffect
  *
@@ -308,6 +302,5 @@
  * By using [rememberUpdatedState] a composable function can update these operations in progress.
  */
 @Composable
-fun <T> rememberUpdatedState(newValue: T): State<T> = remember {
-    mutableStateOf(newValue)
-}.apply { value = newValue }
+fun <T> rememberUpdatedState(newValue: T): State<T> =
+    remember { mutableStateOf(newValue) }.apply { value = newValue }
diff --git a/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/SnapshotStateExtensions.kt b/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/SnapshotStateExtensions.kt
index f9676e3..fe5ff69 100644
--- a/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/SnapshotStateExtensions.kt
+++ b/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/SnapshotStateExtensions.kt
@@ -27,12 +27,9 @@
  * of a state of type `Int`.
  */
 @Stable
-fun State<Int>.asIntState(): IntState =
-    if (this is IntState) this else UnboxedIntState(this)
+fun State<Int>.asIntState(): IntState = if (this is IntState) this else UnboxedIntState(this)
 
-internal class UnboxedIntState(
-    private val baseState: State<Int>
-) : IntState {
+internal class UnboxedIntState(private val baseState: State<Int>) : IntState {
     override val intValue: Int
         get() = baseState.value
 
@@ -53,12 +50,9 @@
  * representation of a state of type `Long`.
  */
 @Stable
-fun State<Long>.asLongState(): LongState =
-    if (this is LongState) this else UnboxedLongState(this)
+fun State<Long>.asLongState(): LongState = if (this is LongState) this else UnboxedLongState(this)
 
-internal class UnboxedLongState(
-    private val baseState: State<Long>
-) : LongState {
+internal class UnboxedLongState(private val baseState: State<Long>) : LongState {
     override val longValue: Long
         get() = baseState.value
 
@@ -74,17 +68,15 @@
  * read-only. The returned state will mirror the values of the base state and apply updates in the
  * same way as the receiver defines.
  *
- * On the JVM, this conversion does not avoid the autoboxing that [Float] attempts to escape,
- * but instead is intended to allow interoperability between components that use either
- * representation of a state of type `Float`.
+ * On the JVM, this conversion does not avoid the autoboxing that [Float] attempts to escape, but
+ * instead is intended to allow interoperability between components that use either representation
+ * of a state of type `Float`.
  */
 @Stable
 fun State<Float>.asFloatState(): FloatState =
     if (this is FloatState) this else UnboxedFloatState(this)
 
-internal class UnboxedFloatState(
-    private val baseState: State<Float>
-) : FloatState {
+internal class UnboxedFloatState(private val baseState: State<Float>) : FloatState {
     override val floatValue: Float
         get() = baseState.value
 
@@ -100,17 +92,15 @@
  * state is read-only. The returned state will mirror the values of the base state and apply updates
  * in the same way as the receiver defines.
  *
- * On the JVM, this conversion does not avoid the autoboxing that [Double] attempts to escape,
- * but instead is intended to allow interoperability between components that use either
- * representation of a state of type `Double`.
+ * On the JVM, this conversion does not avoid the autoboxing that [Double] attempts to escape, but
+ * instead is intended to allow interoperability between components that use either representation
+ * of a state of type `Double`.
  */
 @Stable
 fun State<Double>.asDoubleState(): DoubleState =
     if (this is DoubleState) this else UnboxedDoubleState(this)
 
-internal class UnboxedDoubleState(
-    private val baseState: State<Double>
-) : DoubleState {
+internal class UnboxedDoubleState(private val baseState: State<Double>) : DoubleState {
     override val doubleValue: Double
         get() = baseState.value
 
diff --git a/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/Stable.kt b/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/Stable.kt
index d371d89..fa70593 100644
--- a/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/Stable.kt
+++ b/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/Stable.kt
@@ -17,22 +17,21 @@
 package androidx.compose.runtime
 
 /**
- * Stable is used to communicate some guarantees to the compose compiler about how a certain type
- * or function will behave.
+ * Stable is used to communicate some guarantees to the compose compiler about how a certain type or
+ * function will behave.
  *
  * When applied to a class or an interface, [Stable] indicates that the following must be true:
- *
- *   1) The result of [equals] will always return the same result for the same two instances.
- *   2) When a public property of the type changes, composition will be notified.
- *   3) All public property types are stable.
+ * 1) The result of [equals] will always return the same result for the same two instances.
+ * 2) When a public property of the type changes, composition will be notified.
+ * 3) All public property types are stable.
  *
  * When applied to a function or a property, the [Stable] annotation indicates that the function
- * will return the same result if the same parameters are passed in. This is only meaningful if
- * the parameters and results are themselves [Stable], [Immutable], or primitive.
+ * will return the same result if the same parameters are passed in. This is only meaningful if the
+ * parameters and results are themselves [Stable], [Immutable], or primitive.
  *
  * The invariants that this annotation implies are used for optimizations by the compose compiler,
- * and have undefined behavior if the above assumptions are not met. As a result, one should not
- * use this annotation unless they are certain that these conditions are satisfied.
+ * and have undefined behavior if the above assumptions are not met. As a result, one should not use
+ * this annotation unless they are certain that these conditions are satisfied.
  *
  * @see Immutable
  * @see StableMarker
diff --git a/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/StableMarker.kt b/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/StableMarker.kt
index 71e78f9..5967d1e 100644
--- a/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/StableMarker.kt
+++ b/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/StableMarker.kt
@@ -19,16 +19,15 @@
 /**
  * [StableMarker] marks an annotation as indicating a type is stable. A stable type obeys the
  * following assumptions,
+ * 1) The result of [equals] will always return the same result for the same two instances.
+ * 2) When a public property of the type changes, composition will be notified.
+ * 3) All public property types are stable.
  *
- *   1) The result of [equals] will always return the same result for the same two instances.
- *   2) When a public property of the type changes, composition will be notified.
- *   3) All public property types are stable.
+ * A type that is immutable obeys the above assumptions because the public values will never change.
+ * The [Immutable] annotation is provided to mark immutable types as stable.
  *
- * A type that is immutable obeys the above assumptions because the public values will never
- * change. The [Immutable] annotation is provided to mark immutable types as stable.
- *
- * An object whose public properties do not change but is not immutable (for example, it has
- * private mutable state or uses property delegation to a [MutableState] object, but is otherwise
+ * An object whose public properties do not change but is not immutable (for example, it has private
+ * mutable state or uses property delegation to a [MutableState] object, but is otherwise
  * immutable), should use the [Stable] annotation.
  *
  * Mutable object that do not notify composition when they changed should not be marked as stable.
@@ -37,8 +36,8 @@
  * parameter values are compared for equality based on positional memoization and the call is
  * skipped if all the values are the equal to the previous call.
  *
- * Primitive value types (such as Int, Float, etc), String and enum types are considered, a
- * priori, stable.
+ * Primitive value types (such as Int, Float, etc), String and enum types are considered, a priori,
+ * stable.
  *
  * @see Immutable
  * @see Stable
diff --git a/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/Stack.kt b/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/Stack.kt
index 61f6314..42f0d1a 100644
--- a/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/Stack.kt
+++ b/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/Stack.kt
@@ -20,15 +20,23 @@
 internal class Stack<T> {
     private val backing = ArrayList<T>()
 
-    val size: Int get() = backing.size
+    val size: Int
+        get() = backing.size
 
     fun push(value: T) = backing.add(value)
+
     fun pop(): T = backing.removeAt(size - 1)
+
     fun peek(): T = backing.get(size - 1)
+
     fun peek(index: Int): T = backing.get(index)
+
     fun isEmpty() = backing.isEmpty()
+
     fun isNotEmpty() = !isEmpty()
+
     fun clear() = backing.clear()
+
     @Suppress("UNCHECKED_CAST")
     fun toArray(): Array<T> = Array<Any?>(backing.size) { backing[it] } as Array<T>
 }
@@ -37,7 +45,8 @@
     private var slots = IntArray(10)
     private var tos = 0
 
-    val size: Int get() = tos
+    val size: Int
+        get() = tos
 
     fun push(value: Int) {
         if (tos >= slots.size) {
@@ -47,16 +56,25 @@
     }
 
     fun pop(): Int = slots[--tos]
+
     fun peekOr(default: Int): Int = if (tos > 0) peek() else default
+
     fun peek() = slots[tos - 1]
+
     fun peek2() = slots[tos - 2]
+
     fun peek(index: Int) = slots[index]
+
     fun isEmpty() = tos == 0
+
     fun isNotEmpty() = tos != 0
-    fun clear() { tos = 0 }
+
+    fun clear() {
+        tos = 0
+    }
+
     fun indexOf(value: Int): Int {
-        for (i in 0 until tos)
-            if (slots[i] == value) return i
+        for (i in 0 until tos) if (slots[i] == value) return i
         return -1
     }
 }
diff --git a/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/ValueHolders.kt b/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/ValueHolders.kt
index fa3eca0..599cbc2 100644
--- a/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/ValueHolders.kt
+++ b/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/ValueHolders.kt
@@ -18,14 +18,14 @@
 
 internal interface ValueHolder<T> {
     fun readValue(map: PersistentCompositionLocalMap): T
+
     fun toProvided(local: CompositionLocal<T>): ProvidedValue<T>
 }
 
-/**
- * A StaticValueHolder holds a value that will never change.
- */
+/** A StaticValueHolder holds a value that will never change. */
 internal data class StaticValueHolder<T>(val value: T) : ValueHolder<T> {
     override fun readValue(map: PersistentCompositionLocalMap): T = value
+
     override fun toProvided(local: CompositionLocal<T>): ProvidedValue<T> =
         ProvidedValue(
             compositionLocal = local,
@@ -46,15 +46,15 @@
     private val current by lazy(valueProducer)
 
     override fun readValue(map: PersistentCompositionLocalMap): T = current
+
     override fun toProvided(local: CompositionLocal<T>): ProvidedValue<T> =
         composeRuntimeError("Cannot produce a provider from a lazy value holder")
 }
 
-internal data class ComputedValueHolder<T>(
-    val compute: CompositionLocalAccessorScope.() -> T
-) : ValueHolder<T> {
-    override fun readValue(map: PersistentCompositionLocalMap): T =
-        map.compute()
+internal data class ComputedValueHolder<T>(val compute: CompositionLocalAccessorScope.() -> T) :
+    ValueHolder<T> {
+    override fun readValue(map: PersistentCompositionLocalMap): T = map.compute()
+
     override fun toProvided(local: CompositionLocal<T>): ProvidedValue<T> =
         ProvidedValue(
             compositionLocal = local,
@@ -69,6 +69,7 @@
 
 internal data class DynamicValueHolder<T>(val state: MutableState<T>) : ValueHolder<T> {
     override fun readValue(map: PersistentCompositionLocalMap): T = state.value
+
     override fun toProvided(local: CompositionLocal<T>): ProvidedValue<T> =
         ProvidedValue(
             compositionLocal = local,
diff --git a/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/changelist/ChangeList.kt b/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/changelist/ChangeList.kt
index a268bff..4780cdb 100644
--- a/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/changelist/ChangeList.kt
+++ b/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/changelist/ChangeList.kt
@@ -66,8 +66,11 @@
 
     private val operations = Operations()
 
-    val size: Int get() = operations.size
+    val size: Int
+        get() = operations.size
+
     fun isEmpty() = operations.isEmpty()
+
     fun isNotEmpty() = operations.isNotEmpty()
 
     fun clear() {
@@ -81,9 +84,7 @@
     ) = operations.executeAndFlushAllPendingOperations(applier, slots, rememberManager)
 
     fun pushRemember(value: RememberObserver) {
-        operations.push(Remember) {
-            setObject(Remember.Value, value)
-        }
+        operations.push(Remember) { setObject(Remember.Value, value) }
     }
 
     fun pushUpdateValue(value: Any?, groupSlotIndex: Int) {
@@ -109,9 +110,7 @@
     }
 
     fun pushTrimValues(count: Int) {
-        operations.push(TrimParentValues) {
-            setInt(TrimParentValues.Count, count)
-        }
+        operations.push(TrimParentValues) { setInt(TrimParentValues.Count, count) }
     }
 
     fun pushResetSlots() {
@@ -123,9 +122,7 @@
     }
 
     fun pushUpdateAuxData(data: Any?) {
-        operations.push(UpdateAuxData) {
-            setObject(UpdateAuxData.Data, data)
-        }
+        operations.push(UpdateAuxData) { setObject(UpdateAuxData.Data, data) }
     }
 
     fun pushEnsureRootStarted() {
@@ -133,9 +130,7 @@
     }
 
     fun pushEnsureGroupStarted(anchor: Anchor) {
-        operations.push(EnsureGroupStarted) {
-            setObject(EnsureGroupStarted.Anchor, anchor)
-        }
+        operations.push(EnsureGroupStarted) { setObject(EnsureGroupStarted.Anchor, anchor) }
     }
 
     fun pushEndCurrentGroup() {
@@ -150,21 +145,14 @@
         operations.push(RemoveCurrentGroup)
     }
 
-    fun pushInsertSlots(
-        anchor: Anchor,
-        from: SlotTable
-    ) {
+    fun pushInsertSlots(anchor: Anchor, from: SlotTable) {
         operations.push(InsertSlots) {
             setObject(InsertSlots.Anchor, anchor)
             setObject(InsertSlots.FromSlotTable, from)
         }
     }
 
-    fun pushInsertSlots(
-        anchor: Anchor,
-        from: SlotTable,
-        fixups: FixupList
-    ) {
+    fun pushInsertSlots(anchor: Anchor, from: SlotTable, fixups: FixupList) {
         operations.push(InsertSlotsWithFixups) {
             setObject(InsertSlotsWithFixups.Anchor, anchor)
             setObject(InsertSlotsWithFixups.FromSlotTable, from)
@@ -172,18 +160,11 @@
         }
     }
 
-    fun pushMoveCurrentGroup(
-        offset: Int
-    ) {
-        operations.push(MoveCurrentGroup) {
-            setInt(MoveCurrentGroup.Offset, offset)
-        }
+    fun pushMoveCurrentGroup(offset: Int) {
+        operations.push(MoveCurrentGroup) { setInt(MoveCurrentGroup.Offset, offset) }
     }
 
-    fun pushEndCompositionScope(
-        action: (Composition) -> Unit,
-        composition: Composition
-    ) {
+    fun pushEndCompositionScope(action: (Composition) -> Unit, composition: Composition) {
         operations.push(EndCompositionScope) {
             setObject(EndCompositionScope.Action, action)
             setObject(EndCompositionScope.Composition, composition)
@@ -199,8 +180,7 @@
     fun <T, V> pushUpdateNode(value: V, block: T.(V) -> Unit) {
         operations.push(UpdateNode) {
             setObject(UpdateNode.Value, value)
-            @Suppress("UNCHECKED_CAST")
-            setObject(UpdateNode.Block, block as (Any?.(Any?) -> Unit))
+            @Suppress("UNCHECKED_CAST") setObject(UpdateNode.Block, block as (Any?.(Any?) -> Unit))
         }
     }
 
@@ -220,45 +200,31 @@
     }
 
     fun pushAdvanceSlotsBy(distance: Int) {
-        operations.push(AdvanceSlotsBy) {
-            setInt(AdvanceSlotsBy.Distance, distance)
-        }
+        operations.push(AdvanceSlotsBy) { setInt(AdvanceSlotsBy.Distance, distance) }
     }
 
     fun pushUps(count: Int) {
-        operations.push(Ups) {
-            setInt(Ups.Count, count)
-        }
+        operations.push(Ups) { setInt(Ups.Count, count) }
     }
 
     fun pushDowns(nodes: Array<Any?>) {
         if (nodes.isNotEmpty()) {
-            operations.push(Downs) {
-                setObject(Downs.Nodes, nodes)
-            }
+            operations.push(Downs) { setObject(Downs.Nodes, nodes) }
         }
     }
 
     fun pushSideEffect(effect: () -> Unit) {
-        operations.push(SideEffect) {
-            setObject(SideEffect.Effect, effect)
-        }
+        operations.push(SideEffect) { setObject(SideEffect.Effect, effect) }
     }
 
-    fun pushDetermineMovableContentNodeIndex(
-        effectiveNodeIndexOut: IntRef,
-        anchor: Anchor
-    ) {
+    fun pushDetermineMovableContentNodeIndex(effectiveNodeIndexOut: IntRef, anchor: Anchor) {
         operations.push(DetermineMovableContentNodeIndex) {
             setObject(DetermineMovableContentNodeIndex.EffectiveNodeIndexOut, effectiveNodeIndexOut)
             setObject(DetermineMovableContentNodeIndex.Anchor, anchor)
         }
     }
 
-    fun pushCopyNodesToNewAnchorLocation(
-        nodes: List<Any?>,
-        effectiveNodeIndex: IntRef
-    ) {
+    fun pushCopyNodesToNewAnchorLocation(nodes: List<Any?>, effectiveNodeIndex: IntRef) {
         if (nodes.isNotEmpty()) {
             operations.push(CopyNodesToNewAnchorLocation) {
                 setObject(CopyNodesToNewAnchorLocation.Nodes, nodes)
@@ -299,10 +265,7 @@
         operations.push(EndMovableContentPlacement)
     }
 
-    fun pushExecuteOperationsIn(
-        changeList: ChangeList,
-        effectiveNodeIndex: IntRef? = null
-    ) {
+    fun pushExecuteOperationsIn(changeList: ChangeList, effectiveNodeIndex: IntRef? = null) {
         if (changeList.isNotEmpty()) {
             operations.push(ApplyChangeList) {
                 setObject(ApplyChangeList.Changes, changeList)
diff --git a/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/changelist/ComposerChangeListWriter.kt b/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/changelist/ComposerChangeListWriter.kt
index dd9a063..74c7146 100644
--- a/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/changelist/ComposerChangeListWriter.kt
+++ b/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/changelist/ComposerChangeListWriter.kt
@@ -34,27 +34,23 @@
 
 internal class ComposerChangeListWriter(
     /**
-     * The [Composer][ComposerImpl] that is building this ChangeList. The Composer's state
-     * may be used to determine how the ChangeList should be written to.
+     * The [Composer][ComposerImpl] that is building this ChangeList. The Composer's state may be
+     * used to determine how the ChangeList should be written to.
      */
     private val composer: ComposerImpl,
-    /**
-     * The ChangeList that will be written to
-     */
+    /** The ChangeList that will be written to */
     var changeList: ChangeList
 ) {
     private val reader: SlotReader
         get() = composer.reader
 
     /**
-     * Record whether any groups were stared. If no groups were started then the root group
-     * doesn't need to be started or ended either.
+     * Record whether any groups were stared. If no groups were started then the root group doesn't
+     * need to be started or ended either.
      */
     private var startedGroup: Boolean = false
 
-    /**
-     * A stack of the location of the groups that were started.
-     */
+    /** A stack of the location of the groups that were started. */
     private val startedGroups = IntStack()
 
     /**
@@ -82,10 +78,10 @@
     // groups that must be closed before we can move past the started group.
 
     /**
-     * The skew or delta between where the writer will be and where the reader is now. This can
-     * be thought of as the unrealized distance the writer must move to match the current slot in
-     * the reader. When an operation affects the slot table the writer location must be realized
-     * by moving the writer slot table the unrealized distance.
+     * The skew or delta between where the writer will be and where the reader is now. This can be
+     * thought of as the unrealized distance the writer must move to match the current slot in the
+     * reader. When an operation affects the slot table the writer location must be realized by
+     * moving the writer slot table the unrealized distance.
      */
     private var writersReaderDelta: Int = 0
 
@@ -116,9 +112,7 @@
         realizeOperationLocation(useParentSlot)
     }
 
-    /**
-     * Called when reader current is moved directly, such as when a group moves, to [location].
-     */
+    /** Called when reader current is moved directly, such as when a group moves, to [location]. */
     fun moveReaderRelativeTo(location: Int) {
         // Ensure the next skip will account for the distance we have already travelled.
         writersReaderDelta += location - reader.currentGroup
@@ -164,21 +158,17 @@
     private fun realizeOperationLocation(forParent: Boolean = false) {
         val location = if (forParent) reader.parent else reader.currentGroup
         val distance = location - writersReaderDelta
-        runtimeCheck(distance >= 0) {
-            "Tried to seek backward"
-        }
+        runtimeCheck(distance >= 0) { "Tried to seek backward" }
         if (distance > 0) {
             changeList.pushAdvanceSlotsBy(distance)
             writersReaderDelta = location
         }
     }
 
-    val pastParent: Boolean get() = reader.parent - writersReaderDelta < 0
+    val pastParent: Boolean
+        get() = reader.parent - writersReaderDelta < 0
 
-    inline fun withChangeList(
-        newChangeList: ChangeList,
-        block: () -> Unit
-    ) {
+    inline fun withChangeList(newChangeList: ChangeList, block: () -> Unit) {
         val previousChangeList = changeList
         try {
             changeList = newChangeList
@@ -259,47 +249,35 @@
 
     fun removeCurrentGroup() {
         /*
-           When a group is removed the reader will move but the writer will not so to ensure both
-           the writer and reader are tracking the same slot we advance `writersReaderDelta` to
-           account for the removal.
-         */
+          When a group is removed the reader will move but the writer will not so to ensure both
+          the writer and reader are tracking the same slot we advance `writersReaderDelta` to
+          account for the removal.
+        */
         pushSlotEditingOperationPreamble()
         changeList.pushRemoveCurrentGroup()
         writersReaderDelta += reader.groupSize
     }
 
-    fun insertSlots(
-        anchor: Anchor,
-        from: SlotTable
-    ) {
+    fun insertSlots(anchor: Anchor, from: SlotTable) {
         pushPendingUpsAndDowns()
         pushSlotEditingOperationPreamble()
         realizeNodeMovementOperations()
         changeList.pushInsertSlots(anchor, from)
     }
 
-    fun insertSlots(
-        anchor: Anchor,
-        from: SlotTable,
-        fixups: FixupList
-    ) {
+    fun insertSlots(anchor: Anchor, from: SlotTable, fixups: FixupList) {
         pushPendingUpsAndDowns()
         pushSlotEditingOperationPreamble()
         realizeNodeMovementOperations()
         changeList.pushInsertSlots(anchor, from, fixups)
     }
 
-    fun moveCurrentGroup(
-        offset: Int
-    ) {
+    fun moveCurrentGroup(offset: Int) {
         pushSlotEditingOperationPreamble()
         changeList.pushMoveCurrentGroup(offset)
     }
 
-    fun endCompositionScope(
-        action: (Composition) -> Unit,
-        composition: Composition
-    ) {
+    fun endCompositionScope(action: (Composition) -> Unit, composition: Composition) {
         changeList.pushEndCompositionScope(action, composition)
     }
 
@@ -415,18 +393,12 @@
         changeList.pushSideEffect(effect)
     }
 
-    fun determineMovableContentNodeIndex(
-        effectiveNodeIndexOut: IntRef,
-        anchor: Anchor
-    ) {
+    fun determineMovableContentNodeIndex(effectiveNodeIndexOut: IntRef, anchor: Anchor) {
         pushPendingUpsAndDowns()
         changeList.pushDetermineMovableContentNodeIndex(effectiveNodeIndexOut, anchor)
     }
 
-    fun copyNodesToNewAnchorLocation(
-        nodes: List<Any?>,
-        effectiveNodeIndex: IntRef
-    ) {
+    fun copyNodesToNewAnchorLocation(nodes: List<Any?>, effectiveNodeIndex: IntRef) {
         changeList.pushCopyNodesToNewAnchorLocation(nodes, effectiveNodeIndex)
     }
 
@@ -454,10 +426,7 @@
         writersReaderDelta = 0
     }
 
-    fun includeOperationsIn(
-        other: ChangeList,
-        effectiveNodeIndex: IntRef? = null
-    ) {
+    fun includeOperationsIn(other: ChangeList, effectiveNodeIndex: IntRef? = null) {
         changeList.pushExecuteOperationsIn(other, effectiveNodeIndex)
     }
 
diff --git a/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/changelist/FixupList.kt b/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/changelist/FixupList.kt
index 2e78ea9..343a775 100644
--- a/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/changelist/FixupList.kt
+++ b/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/changelist/FixupList.kt
@@ -29,8 +29,11 @@
     private val operations = Operations()
     private val pendingOperations = Operations()
 
-    val size: Int get() = operations.size
+    val size: Int
+        get() = operations.size
+
     fun isEmpty() = operations.isEmpty()
+
     fun isNotEmpty() = operations.isNotEmpty()
 
     fun clear() {
@@ -50,11 +53,7 @@
         operations.executeAndFlushAllPendingOperations(applier, slots, rememberManager)
     }
 
-    fun createAndInsertNode(
-        factory: () -> Any?,
-        insertIndex: Int,
-        groupAnchor: Anchor
-    ) {
+    fun createAndInsertNode(factory: () -> Any?, insertIndex: Int, groupAnchor: Anchor) {
         operations.push(InsertNodeFixup) {
             setObject(InsertNodeFixup.Factory, factory)
             setInt(InsertNodeFixup.InsertIndex, insertIndex)
diff --git a/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/changelist/Operation.kt b/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/changelist/Operation.kt
index b553fa9..deb241c 100644
--- a/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/changelist/Operation.kt
+++ b/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/changelist/Operation.kt
@@ -46,10 +46,7 @@
 import androidx.compose.runtime.withAfterAnchorInfo
 import kotlin.jvm.JvmInline
 
-internal sealed class Operation(
-    val ints: Int = 0,
-    val objects: Int = 0
-) {
+internal sealed class Operation(val ints: Int = 0, val objects: Int = 0) {
 
     val name: String
         get() = this::class.simpleName.orEmpty()
@@ -60,28 +57,27 @@
         rememberManager: RememberManager
     )
 
-    open fun intParamName(parameter: IntParameter): String =
-        "IntParameter(${parameter.offset})"
+    open fun intParamName(parameter: IntParameter): String = "IntParameter(${parameter.offset})"
 
     open fun objectParamName(parameter: ObjectParameter<*>): String =
         "ObjectParameter(${parameter.offset})"
 
     override fun toString() = name
 
-    @JvmInline
-    value class IntParameter(val offset: Int)
+    @JvmInline value class IntParameter(val offset: Int)
 
-    @JvmInline
-    value class ObjectParameter<T>(val offset: Int)
+    @JvmInline value class ObjectParameter<T>(val offset: Int)
 
     // region traversal operations
     object Ups : Operation(ints = 1) {
-        inline val Count get() = IntParameter(0)
+        inline val Count
+            get() = IntParameter(0)
 
-        override fun intParamName(parameter: IntParameter) = when (parameter) {
-            Count -> "count"
-            else -> super.intParamName(parameter)
-        }
+        override fun intParamName(parameter: IntParameter) =
+            when (parameter) {
+                Count -> "count"
+                else -> super.intParamName(parameter)
+            }
 
         override fun OperationArgContainer.execute(
             applier: Applier<*>,
@@ -93,20 +89,21 @@
     }
 
     object Downs : Operation(objects = 1) {
-        inline val Nodes get() = ObjectParameter<Array<Any?>>(0)
+        inline val Nodes
+            get() = ObjectParameter<Array<Any?>>(0)
 
-        override fun objectParamName(parameter: ObjectParameter<*>) = when (parameter) {
-            Nodes -> "nodes"
-            else -> super.objectParamName(parameter)
-        }
+        override fun objectParamName(parameter: ObjectParameter<*>) =
+            when (parameter) {
+                Nodes -> "nodes"
+                else -> super.objectParamName(parameter)
+            }
 
         override fun OperationArgContainer.execute(
             applier: Applier<*>,
             slots: SlotWriter,
             rememberManager: RememberManager
         ) {
-            @Suppress("UNCHECKED_CAST")
-            val nodeApplier = applier as Applier<Any?>
+            @Suppress("UNCHECKED_CAST") val nodeApplier = applier as Applier<Any?>
             val nodes = getObject(Nodes)
             for (index in nodes.indices) {
                 nodeApplier.down(nodes[index])
@@ -115,12 +112,14 @@
     }
 
     object AdvanceSlotsBy : Operation(ints = 1) {
-        inline val Distance get() = IntParameter(0)
+        inline val Distance
+            get() = IntParameter(0)
 
-        override fun intParamName(parameter: IntParameter) = when (parameter) {
-            Distance -> "distance"
-            else -> super.intParamName(parameter)
-        }
+        override fun intParamName(parameter: IntParameter) =
+            when (parameter) {
+                Distance -> "distance"
+                else -> super.intParamName(parameter)
+            }
 
         override fun OperationArgContainer.execute(
             applier: Applier<*>,
@@ -130,16 +129,19 @@
             slots.advanceBy(getInt(Distance))
         }
     }
+
     // endregion traversal operations
 
     // region operations for Remember and SideEffects
     object SideEffect : Operation(objects = 1) {
-        inline val Effect get() = ObjectParameter<() -> Unit>(0)
+        inline val Effect
+            get() = ObjectParameter<() -> Unit>(0)
 
-        override fun objectParamName(parameter: ObjectParameter<*>) = when (parameter) {
-            Effect -> "effect"
-            else -> super.objectParamName(parameter)
-        }
+        override fun objectParamName(parameter: ObjectParameter<*>) =
+            when (parameter) {
+                Effect -> "effect"
+                else -> super.objectParamName(parameter)
+            }
 
         override fun OperationArgContainer.execute(
             applier: Applier<*>,
@@ -151,12 +153,14 @@
     }
 
     object Remember : Operation(objects = 1) {
-        inline val Value get() = ObjectParameter<RememberObserver>(0)
+        inline val Value
+            get() = ObjectParameter<RememberObserver>(0)
 
-        override fun objectParamName(parameter: ObjectParameter<*>) = when (parameter) {
-            Value -> "value"
-            else -> super.objectParamName(parameter)
-        }
+        override fun objectParamName(parameter: ObjectParameter<*>) =
+            when (parameter) {
+                Value -> "value"
+                else -> super.objectParamName(parameter)
+            }
 
         override fun OperationArgContainer.execute(
             applier: Applier<*>,
@@ -168,14 +172,18 @@
     }
 
     object AppendValue : Operation(objects = 2) {
-        inline val Anchor get() = ObjectParameter<Anchor>(0)
-        inline val Value get() = ObjectParameter<Any?>(1)
+        inline val Anchor
+            get() = ObjectParameter<Anchor>(0)
 
-        override fun objectParamName(parameter: ObjectParameter<*>): String = when (parameter) {
-            Anchor -> "anchor"
-            Value -> "value"
-            else -> super.objectParamName(parameter)
-        }
+        inline val Value
+            get() = ObjectParameter<Any?>(1)
+
+        override fun objectParamName(parameter: ObjectParameter<*>): String =
+            when (parameter) {
+                Anchor -> "anchor"
+                Value -> "value"
+                else -> super.objectParamName(parameter)
+            }
 
         override fun OperationArgContainer.execute(
             applier: Applier<*>,
@@ -192,12 +200,14 @@
     }
 
     object TrimParentValues : Operation(ints = 1) {
-        inline val Count get() = IntParameter(0)
+        inline val Count
+            get() = IntParameter(0)
 
-        override fun intParamName(parameter: IntParameter): String = when (parameter) {
-            Count -> "count"
-            else -> super.intParamName(parameter)
-        }
+        override fun intParamName(parameter: IntParameter): String =
+            when (parameter) {
+                Count -> "count"
+                else -> super.intParamName(parameter)
+            }
 
         override fun OperationArgContainer.execute(
             applier: Applier<*>,
@@ -222,18 +232,23 @@
     }
 
     object UpdateValue : Operation(ints = 1, objects = 1) {
-        inline val Value get() = ObjectParameter<Any?>(0)
-        inline val GroupSlotIndex get() = IntParameter(0)
+        inline val Value
+            get() = ObjectParameter<Any?>(0)
 
-        override fun intParamName(parameter: IntParameter) = when (parameter) {
-            GroupSlotIndex -> "groupSlotIndex"
-            else -> super.intParamName(parameter)
-        }
+        inline val GroupSlotIndex
+            get() = IntParameter(0)
 
-        override fun objectParamName(parameter: ObjectParameter<*>) = when (parameter) {
-            Value -> "value"
-            else -> super.objectParamName(parameter)
-        }
+        override fun intParamName(parameter: IntParameter) =
+            when (parameter) {
+                GroupSlotIndex -> "groupSlotIndex"
+                else -> super.intParamName(parameter)
+            }
+
+        override fun objectParamName(parameter: ObjectParameter<*>) =
+            when (parameter) {
+                Value -> "value"
+                else -> super.objectParamName(parameter)
+            }
 
         override fun OperationArgContainer.execute(
             applier: Applier<*>,
@@ -247,10 +262,9 @@
             }
             when (val previous = slots.set(groupSlotIndex, value)) {
                 is RememberObserverHolder -> {
-                    val endRelativeOrder = slots.slotsSize - slots.slotIndexOfGroupSlotIndex(
-                        slots.currentGroup,
-                        groupSlotIndex
-                    )
+                    val endRelativeOrder =
+                        slots.slotsSize -
+                            slots.slotIndexOfGroupSlotIndex(slots.currentGroup, groupSlotIndex)
                     // Values are always updated in the composition order (not slot table order)
                     // so there is no need to reorder these.
                     rememberManager.forgetting(previous.wrapped, endRelativeOrder, -1, -1)
@@ -261,20 +275,27 @@
     }
 
     object UpdateAnchoredValue : Operation(objects = 2, ints = 1) {
-        inline val Value get() = ObjectParameter<Any?>(0)
-        inline val Anchor get() = ObjectParameter<Anchor>(1)
-        inline val GroupSlotIndex get() = IntParameter(0)
+        inline val Value
+            get() = ObjectParameter<Any?>(0)
 
-        override fun intParamName(parameter: IntParameter) = when (parameter) {
-            UpdateAnchoredValue.GroupSlotIndex -> "groupSlotIndex"
-            else -> super.intParamName(parameter)
-        }
+        inline val Anchor
+            get() = ObjectParameter<Anchor>(1)
 
-        override fun objectParamName(parameter: ObjectParameter<*>) = when (parameter) {
-            UpdateAnchoredValue.Value -> "value"
-            UpdateAnchoredValue.Anchor -> "anchor"
-            else -> super.objectParamName(parameter)
-        }
+        inline val GroupSlotIndex
+            get() = IntParameter(0)
+
+        override fun intParamName(parameter: IntParameter) =
+            when (parameter) {
+                UpdateAnchoredValue.GroupSlotIndex -> "groupSlotIndex"
+                else -> super.intParamName(parameter)
+            }
+
+        override fun objectParamName(parameter: ObjectParameter<*>) =
+            when (parameter) {
+                UpdateAnchoredValue.Value -> "value"
+                UpdateAnchoredValue.Anchor -> "anchor"
+                else -> super.objectParamName(parameter)
+            }
 
         override fun OperationArgContainer.execute(
             applier: Applier<*>,
@@ -290,8 +311,9 @@
             val groupIndex = slots.anchorIndex(anchor)
             when (val previous = slots.set(groupIndex, groupSlotIndex, value)) {
                 is RememberObserverHolder -> {
-                    val endRelativeSlotOrder = slots.slotsSize -
-                        slots.slotIndexOfGroupSlotIndex(groupIndex, groupSlotIndex)
+                    val endRelativeSlotOrder =
+                        slots.slotsSize -
+                            slots.slotIndexOfGroupSlotIndex(groupIndex, groupSlotIndex)
                     slots.withAfterAnchorInfo(previous.after) { priority, endRelativeAfter ->
                         rememberManager.forgetting(
                             previous.wrapped,
@@ -305,16 +327,19 @@
             }
         }
     }
+
     // endregion operations for Remember and SideEffects
 
     // region operations for Nodes and Groups
     object UpdateAuxData : Operation(objects = 1) {
-        inline val Data get() = ObjectParameter<Any?>(0)
+        inline val Data
+            get() = ObjectParameter<Any?>(0)
 
-        override fun objectParamName(parameter: ObjectParameter<*>) = when (parameter) {
-            Data -> "data"
-            else -> super.objectParamName(parameter)
-        }
+        override fun objectParamName(parameter: ObjectParameter<*>) =
+            when (parameter) {
+                Data -> "data"
+                else -> super.objectParamName(parameter)
+            }
 
         override fun OperationArgContainer.execute(
             applier: Applier<*>,
@@ -336,12 +361,14 @@
     }
 
     object EnsureGroupStarted : Operation(objects = 1) {
-        inline val Anchor get() = ObjectParameter<Anchor>(0)
+        inline val Anchor
+            get() = ObjectParameter<Anchor>(0)
 
-        override fun objectParamName(parameter: ObjectParameter<*>) = when (parameter) {
-            Anchor -> "anchor"
-            else -> super.objectParamName(parameter)
-        }
+        override fun objectParamName(parameter: ObjectParameter<*>) =
+            when (parameter) {
+                Anchor -> "anchor"
+                else -> super.objectParamName(parameter)
+            }
 
         override fun OperationArgContainer.execute(
             applier: Applier<*>,
@@ -363,12 +390,14 @@
     }
 
     object MoveCurrentGroup : Operation(ints = 1) {
-        inline val Offset get() = IntParameter(0)
+        inline val Offset
+            get() = IntParameter(0)
 
-        override fun intParamName(parameter: IntParameter) = when (parameter) {
-            Offset -> "offset"
-            else -> super.intParamName(parameter)
-        }
+        override fun intParamName(parameter: IntParameter) =
+            when (parameter) {
+                Offset -> "offset"
+                else -> super.intParamName(parameter)
+            }
 
         override fun OperationArgContainer.execute(
             applier: Applier<*>,
@@ -400,14 +429,18 @@
     }
 
     object EndCompositionScope : Operation(objects = 2) {
-        inline val Action get() = ObjectParameter<(Composition) -> Unit>(0)
-        inline val Composition get() = ObjectParameter<Composition>(1)
+        inline val Action
+            get() = ObjectParameter<(Composition) -> Unit>(0)
 
-        override fun objectParamName(parameter: ObjectParameter<*>) = when (parameter) {
-            Action -> "anchor"
-            Composition -> "composition"
-            else -> super.objectParamName(parameter)
-        }
+        inline val Composition
+            get() = ObjectParameter<Composition>(1)
+
+        override fun objectParamName(parameter: ObjectParameter<*>) =
+            when (parameter) {
+                Action -> "anchor"
+                Composition -> "composition"
+                else -> super.objectParamName(parameter)
+            }
 
         override fun OperationArgContainer.execute(
             applier: Applier<*>,
@@ -432,14 +465,18 @@
     }
 
     object UpdateNode : Operation(objects = 2) {
-        inline val Value get() = ObjectParameter<Any?>(0)
-        inline val Block get() = ObjectParameter<Any?.(Any?) -> Unit /* Node?.(Value) -> Unit */>(1)
+        inline val Value
+            get() = ObjectParameter<Any?>(0)
 
-        override fun objectParamName(parameter: ObjectParameter<*>) = when (parameter) {
-            Value -> "value"
-            Block -> "block"
-            else -> super.objectParamName(parameter)
-        }
+        inline val Block
+            get() = ObjectParameter<Any?.(Any?) -> Unit /* Node?.(Value) -> Unit */>(1)
+
+        override fun objectParamName(parameter: ObjectParameter<*>) =
+            when (parameter) {
+                Value -> "value"
+                Block -> "block"
+                else -> super.objectParamName(parameter)
+            }
 
         override fun OperationArgContainer.execute(
             applier: Applier<*>,
@@ -453,61 +490,68 @@
     }
 
     object RemoveNode : Operation(ints = 2) {
-        inline val RemoveIndex get() = IntParameter(0)
-        inline val Count get() = IntParameter(1)
+        inline val RemoveIndex
+            get() = IntParameter(0)
 
-        override fun intParamName(parameter: IntParameter) = when (parameter) {
-            RemoveIndex -> "removeIndex"
-            Count -> "count"
-            else -> super.intParamName(parameter)
-        }
+        inline val Count
+            get() = IntParameter(1)
+
+        override fun intParamName(parameter: IntParameter) =
+            when (parameter) {
+                RemoveIndex -> "removeIndex"
+                Count -> "count"
+                else -> super.intParamName(parameter)
+            }
 
         override fun OperationArgContainer.execute(
             applier: Applier<*>,
             slots: SlotWriter,
             rememberManager: RememberManager
         ) {
-            applier.remove(
-                index = getInt(RemoveIndex),
-                count = getInt(Count)
-            )
+            applier.remove(index = getInt(RemoveIndex), count = getInt(Count))
         }
     }
 
     object MoveNode : Operation(ints = 3) {
-        inline val From get() = IntParameter(0)
-        inline val To get() = IntParameter(1)
-        inline val Count get() = IntParameter(2)
+        inline val From
+            get() = IntParameter(0)
 
-        override fun intParamName(parameter: IntParameter) = when (parameter) {
-            From -> "from"
-            To -> "to"
-            Count -> "count"
-            else -> super.intParamName(parameter)
-        }
+        inline val To
+            get() = IntParameter(1)
+
+        inline val Count
+            get() = IntParameter(2)
+
+        override fun intParamName(parameter: IntParameter) =
+            when (parameter) {
+                From -> "from"
+                To -> "to"
+                Count -> "count"
+                else -> super.intParamName(parameter)
+            }
 
         override fun OperationArgContainer.execute(
             applier: Applier<*>,
             slots: SlotWriter,
             rememberManager: RememberManager
         ) {
-            applier.move(
-                from = getInt(From),
-                to = getInt(To),
-                count = getInt(Count)
-            )
+            applier.move(from = getInt(From), to = getInt(To), count = getInt(Count))
         }
     }
 
     object InsertSlots : Operation(objects = 2) {
-        inline val Anchor get() = ObjectParameter<Anchor>(0)
-        inline val FromSlotTable get() = ObjectParameter<SlotTable>(1)
+        inline val Anchor
+            get() = ObjectParameter<Anchor>(0)
 
-        override fun objectParamName(parameter: ObjectParameter<*>) = when (parameter) {
-            Anchor -> "anchor"
-            FromSlotTable -> "from"
-            else -> super.objectParamName(parameter)
-        }
+        inline val FromSlotTable
+            get() = ObjectParameter<SlotTable>(1)
+
+        override fun objectParamName(parameter: ObjectParameter<*>) =
+            when (parameter) {
+                Anchor -> "anchor"
+                FromSlotTable -> "from"
+                else -> super.objectParamName(parameter)
+            }
 
         override fun OperationArgContainer.execute(
             applier: Applier<*>,
@@ -528,16 +572,22 @@
     }
 
     object InsertSlotsWithFixups : Operation(objects = 3) {
-        inline val Anchor get() = ObjectParameter<Anchor>(0)
-        inline val FromSlotTable get() = ObjectParameter<SlotTable>(1)
-        inline val Fixups get() = ObjectParameter<FixupList>(2)
+        inline val Anchor
+            get() = ObjectParameter<Anchor>(0)
 
-        override fun objectParamName(parameter: ObjectParameter<*>) = when (parameter) {
-            Anchor -> "anchor"
-            FromSlotTable -> "from"
-            Fixups -> "fixups"
-            else -> super.objectParamName(parameter)
-        }
+        inline val FromSlotTable
+            get() = ObjectParameter<SlotTable>(1)
+
+        inline val Fixups
+            get() = ObjectParameter<FixupList>(2)
+
+        override fun objectParamName(parameter: ObjectParameter<*>) =
+            when (parameter) {
+                Anchor -> "anchor"
+                FromSlotTable -> "from"
+                Fixups -> "fixups"
+                else -> super.objectParamName(parameter)
+            }
 
         override fun OperationArgContainer.execute(
             applier: Applier<*>,
@@ -562,20 +612,27 @@
     }
 
     object InsertNodeFixup : Operation(ints = 1, objects = 2) {
-        inline val Factory get() = ObjectParameter<() -> Any?>(0)
-        inline val InsertIndex get() = IntParameter(0)
-        inline val GroupAnchor get() = ObjectParameter<Anchor>(1)
+        inline val Factory
+            get() = ObjectParameter<() -> Any?>(0)
 
-        override fun intParamName(parameter: IntParameter) = when (parameter) {
-            InsertIndex -> "insertIndex"
-            else -> super.intParamName(parameter)
-        }
+        inline val InsertIndex
+            get() = IntParameter(0)
 
-        override fun objectParamName(parameter: ObjectParameter<*>) = when (parameter) {
-            Factory -> "factory"
-            GroupAnchor -> "groupAnchor"
-            else -> super.objectParamName(parameter)
-        }
+        inline val GroupAnchor
+            get() = ObjectParameter<Anchor>(1)
+
+        override fun intParamName(parameter: IntParameter) =
+            when (parameter) {
+                InsertIndex -> "insertIndex"
+                else -> super.intParamName(parameter)
+            }
+
+        override fun objectParamName(parameter: ObjectParameter<*>) =
+            when (parameter) {
+                Factory -> "factory"
+                GroupAnchor -> "groupAnchor"
+                else -> super.objectParamName(parameter)
+            }
 
         override fun OperationArgContainer.execute(
             applier: Applier<*>,
@@ -594,18 +651,23 @@
     }
 
     object PostInsertNodeFixup : Operation(ints = 1, objects = 1) {
-        inline val InsertIndex get() = IntParameter(0)
-        inline val GroupAnchor get() = ObjectParameter<Anchor>(0)
+        inline val InsertIndex
+            get() = IntParameter(0)
 
-        override fun intParamName(parameter: IntParameter) = when (parameter) {
-            InsertIndex -> "insertIndex"
-            else -> super.intParamName(parameter)
-        }
+        inline val GroupAnchor
+            get() = ObjectParameter<Anchor>(0)
 
-        override fun objectParamName(parameter: ObjectParameter<*>) = when (parameter) {
-            GroupAnchor -> "groupAnchor"
-            else -> super.objectParamName(parameter)
-        }
+        override fun intParamName(parameter: IntParameter) =
+            when (parameter) {
+                InsertIndex -> "insertIndex"
+                else -> super.intParamName(parameter)
+            }
+
+        override fun objectParamName(parameter: ObjectParameter<*>) =
+            when (parameter) {
+                GroupAnchor -> "groupAnchor"
+                else -> super.objectParamName(parameter)
+            }
 
         override fun OperationArgContainer.execute(
             applier: Applier<*>,
@@ -631,6 +693,7 @@
             slots.deactivateCurrentGroup(rememberManager)
         }
     }
+
     // endregion operations for Nodes and Groups
 
     // region operations for MovableContent
@@ -645,42 +708,50 @@
     }
 
     object DetermineMovableContentNodeIndex : Operation(objects = 2) {
-        inline val EffectiveNodeIndexOut get() = ObjectParameter<IntRef>(0)
-        inline val Anchor get() = ObjectParameter<Anchor>(1)
+        inline val EffectiveNodeIndexOut
+            get() = ObjectParameter<IntRef>(0)
 
-        override fun objectParamName(parameter: ObjectParameter<*>) = when (parameter) {
-            EffectiveNodeIndexOut -> "effectiveNodeIndexOut"
-            Anchor -> "anchor"
-            else -> super.objectParamName(parameter)
-        }
+        inline val Anchor
+            get() = ObjectParameter<Anchor>(1)
+
+        override fun objectParamName(parameter: ObjectParameter<*>) =
+            when (parameter) {
+                EffectiveNodeIndexOut -> "effectiveNodeIndexOut"
+                Anchor -> "anchor"
+                else -> super.objectParamName(parameter)
+            }
 
         override fun OperationArgContainer.execute(
             applier: Applier<*>,
             slots: SlotWriter,
             rememberManager: RememberManager
         ) {
-            val effectiveNodeIndexOut =
-                getObject(EffectiveNodeIndexOut)
+            val effectiveNodeIndexOut = getObject(EffectiveNodeIndexOut)
 
-            effectiveNodeIndexOut.element = positionToInsert(
-                slots = slots,
-                anchor = getObject(Anchor),
-                applier = @Suppress("UNCHECKED_CAST") (applier as Applier<Any?>)
-            )
+            effectiveNodeIndexOut.element =
+                positionToInsert(
+                    slots = slots,
+                    anchor = getObject(Anchor),
+                    applier = @Suppress("UNCHECKED_CAST") (applier as Applier<Any?>)
+                )
         }
     }
 
     object CopyNodesToNewAnchorLocation : Operation(objects = 2) {
         // IntRef because the index calculated after the operation is queued as part of
         // `DetermineMovableContentNodeIndex`
-        inline val EffectiveNodeIndex get() = ObjectParameter<IntRef>(0)
-        inline val Nodes get() = ObjectParameter<List<Any?>>(1)
+        inline val EffectiveNodeIndex
+            get() = ObjectParameter<IntRef>(0)
 
-        override fun objectParamName(parameter: ObjectParameter<*>) = when (parameter) {
-            EffectiveNodeIndex -> "effectiveNodeIndex"
-            Nodes -> "nodes"
-            else -> super.objectParamName(parameter)
-        }
+        inline val Nodes
+            get() = ObjectParameter<List<Any?>>(1)
+
+        override fun objectParamName(parameter: ObjectParameter<*>) =
+            when (parameter) {
+                EffectiveNodeIndex -> "effectiveNodeIndex"
+                Nodes -> "nodes"
+                else -> super.objectParamName(parameter)
+            }
 
         override fun OperationArgContainer.execute(
             applier: Applier<*>,
@@ -700,18 +771,26 @@
 
     @OptIn(InternalComposeApi::class)
     object CopySlotTableToAnchorLocation : Operation(objects = 4) {
-        inline val ResolvedState get() = ObjectParameter<MovableContentState?>(0)
-        inline val ParentCompositionContext get() = ObjectParameter<CompositionContext>(1)
-        inline val From get() = ObjectParameter<MovableContentStateReference>(2)
-        inline val To get() = ObjectParameter<MovableContentStateReference>(3)
+        inline val ResolvedState
+            get() = ObjectParameter<MovableContentState?>(0)
 
-        override fun objectParamName(parameter: ObjectParameter<*>) = when (parameter) {
-            ResolvedState -> "resolvedState"
-            ParentCompositionContext -> "resolvedCompositionContext"
-            From -> "from"
-            To -> "to"
-            else -> super.objectParamName(parameter)
-        }
+        inline val ParentCompositionContext
+            get() = ObjectParameter<CompositionContext>(1)
+
+        inline val From
+            get() = ObjectParameter<MovableContentStateReference>(2)
+
+        inline val To
+            get() = ObjectParameter<MovableContentStateReference>(3)
+
+        override fun objectParamName(parameter: ObjectParameter<*>) =
+            when (parameter) {
+                ResolvedState -> "resolvedState"
+                ParentCompositionContext -> "resolvedCompositionContext"
+                From -> "from"
+                To -> "to"
+                else -> super.objectParamName(parameter)
+            }
 
         override fun OperationArgContainer.execute(
             applier: Applier<*>,
@@ -720,12 +799,12 @@
         ) {
             val from = getObject(From)
             val to = getObject(To)
-            val parentCompositionContext =
-                getObject(ParentCompositionContext)
+            val parentCompositionContext = getObject(ParentCompositionContext)
 
-            val resolvedState = getObject(ResolvedState)
-                ?: parentCompositionContext.movableContentStateResolve(from)
-                ?: composeRuntimeError("Could not resolve state for movable content")
+            val resolvedState =
+                getObject(ResolvedState)
+                    ?: parentCompositionContext.movableContentStateResolve(from)
+                    ?: composeRuntimeError("Could not resolve state for movable content")
 
             // The slot table contains the movable content group plus the group
             // containing the movable content's table which then contains the actual
@@ -761,16 +840,22 @@
 
     @OptIn(InternalComposeApi::class)
     object ReleaseMovableGroupAtCurrent : Operation(objects = 3) {
-        inline val Composition get() = ObjectParameter<ControlledComposition>(0)
-        inline val ParentCompositionContext get() = ObjectParameter<CompositionContext>(1)
-        inline val Reference get() = ObjectParameter<MovableContentStateReference>(2)
+        inline val Composition
+            get() = ObjectParameter<ControlledComposition>(0)
 
-        override fun objectParamName(parameter: ObjectParameter<*>) = when (parameter) {
-            Composition -> "composition"
-            ParentCompositionContext -> "parentCompositionContext"
-            Reference -> "reference"
-            else -> super.objectParamName(parameter)
-        }
+        inline val ParentCompositionContext
+            get() = ObjectParameter<CompositionContext>(1)
+
+        inline val Reference
+            get() = ObjectParameter<MovableContentStateReference>(2)
+
+        override fun objectParamName(parameter: ObjectParameter<*>) =
+            when (parameter) {
+                Composition -> "composition"
+                ParentCompositionContext -> "parentCompositionContext"
+                Reference -> "reference"
+                else -> super.objectParamName(parameter)
+            }
 
         override fun OperationArgContainer.execute(
             applier: Applier<*>,
@@ -787,14 +872,18 @@
     }
 
     object ApplyChangeList : Operation(objects = 2) {
-        inline val Changes get() = ObjectParameter<ChangeList>(0)
-        inline val EffectiveNodeIndex get() = ObjectParameter<IntRef?>(1)
+        inline val Changes
+            get() = ObjectParameter<ChangeList>(0)
 
-        override fun objectParamName(parameter: ObjectParameter<*>) = when (parameter) {
-            Changes -> "changes"
-            EffectiveNodeIndex -> "effectiveNodeIndex"
-            else -> super.objectParamName(parameter)
-        }
+        inline val EffectiveNodeIndex
+            get() = ObjectParameter<IntRef?>(1)
+
+        override fun objectParamName(parameter: ObjectParameter<*>) =
+            when (parameter) {
+                Changes -> "changes"
+                EffectiveNodeIndex -> "effectiveNodeIndex"
+                else -> super.objectParamName(parameter)
+            }
 
         override fun OperationArgContainer.execute(
             applier: Applier<*>,
@@ -803,17 +892,20 @@
         ) {
             val effectiveNodeIndex = getObject(EffectiveNodeIndex)?.element ?: 0
 
-            getObject(Changes).executeAndFlushAllPendingChanges(
-                applier = if (effectiveNodeIndex > 0) {
-                    OffsetApplier(applier, effectiveNodeIndex)
-                } else {
-                    applier
-                },
-                slots = slots,
-                rememberManager = rememberManager
-            )
+            getObject(Changes)
+                .executeAndFlushAllPendingChanges(
+                    applier =
+                        if (effectiveNodeIndex > 0) {
+                            OffsetApplier(applier, effectiveNodeIndex)
+                        } else {
+                            applier
+                        },
+                    slots = slots,
+                    rememberManager = rememberManager
+                )
         }
     }
+
     // endregion operations for MovableContent
 
     /**
@@ -821,7 +913,9 @@
      * params, which lets us test [Operations] without relying on the implementation details of any
      * particular operation we use in production.
      */
-    class TestOperation @TestOnly constructor(
+    class TestOperation
+    @TestOnly
+    constructor(
         ints: Int = 0,
         objects: Int = 0,
         val block: (Applier<*>, SlotWriter, RememberManager) -> Unit = { _, _, _ -> }
@@ -871,11 +965,7 @@
     return index
 }
 
-private fun positionToInsert(
-    slots: SlotWriter,
-    anchor: Anchor,
-    applier: Applier<Any?>
-): Int {
+private fun positionToInsert(slots: SlotWriter, anchor: Anchor, applier: Applier<Any?>): Int {
     val destination = slots.anchorIndex(anchor)
     runtimeCheck(slots.currentGroup < destination)
     positionToParentOf(slots, applier, destination)
@@ -921,64 +1011,67 @@
     // composition before the new composition can be composed to receive it. When
     // the new composition receives the state it must recompose over the state by
     // calling invokeMovableContentLambda.
-    val anchors = slotTable.write { writer ->
-        writer.beginInsert()
+    val anchors =
+        slotTable.write { writer ->
+            writer.beginInsert()
 
-        // This is the prefix created by invokeMovableContentLambda
-        writer.startGroup(movableContentKey, reference.content)
-        writer.markGroup()
-        writer.update(reference.parameter)
+            // This is the prefix created by invokeMovableContentLambda
+            writer.startGroup(movableContentKey, reference.content)
+            writer.markGroup()
+            writer.update(reference.parameter)
 
-        // Move the content into current location
-        val anchors = slots.moveTo(reference.anchor, 1, writer)
+            // Move the content into current location
+            val anchors = slots.moveTo(reference.anchor, 1, writer)
 
-        // skip the group that was just inserted.
-        writer.skipGroup()
+            // skip the group that was just inserted.
+            writer.skipGroup()
 
-        // End the group that represents the call to invokeMovableContentLambda
-        writer.endGroup()
+            // End the group that represents the call to invokeMovableContentLambda
+            writer.endGroup()
 
-        writer.endInsert()
+            writer.endInsert()
 
-        anchors
-    }
+            anchors
+        }
 
     val state = MovableContentState(slotTable)
     if (RecomposeScopeImpl.hasAnchoredRecomposeScopes(slotTable, anchors)) {
         // If any recompose scopes are invalidated while the movable content is outside
         // a composition, ensure the reference is updated to contain the invalidation.
-        val movableContentRecomposeScopeOwner = object : RecomposeScopeOwner {
-            override fun invalidate(
-                scope: RecomposeScopeImpl,
-                instance: Any?
-            ): InvalidationResult {
-                // Try sending this to the original owner first.
-                val result = (composition as? RecomposeScopeOwner)?.invalidate(scope, instance)
-                    ?: InvalidationResult.IGNORED
+        val movableContentRecomposeScopeOwner =
+            object : RecomposeScopeOwner {
+                override fun invalidate(
+                    scope: RecomposeScopeImpl,
+                    instance: Any?
+                ): InvalidationResult {
+                    // Try sending this to the original owner first.
+                    val result =
+                        (composition as? RecomposeScopeOwner)?.invalidate(scope, instance)
+                            ?: InvalidationResult.IGNORED
 
-                // If the original owner ignores this then we need to record it in the
-                // reference
-                if (result == InvalidationResult.IGNORED) {
-                    reference.invalidations += scope to instance
-                    return InvalidationResult.SCHEDULED
+                    // If the original owner ignores this then we need to record it in the
+                    // reference
+                    if (result == InvalidationResult.IGNORED) {
+                        reference.invalidations += scope to instance
+                        return InvalidationResult.SCHEDULED
+                    }
+                    return result
                 }
-                return result
-            }
 
-            // The only reason [recomposeScopeReleased] is called is when the recompose scope is
-            // removed from the table. First, this never happens for content that is moving, and
-            // 2) even if it did the only reason we tell the composer is to clear tracking
-            // tables that contain this information which is not relevant here.
-            override fun recomposeScopeReleased(scope: RecomposeScopeImpl) {
-                // Nothing to do
-            }
+                // The only reason [recomposeScopeReleased] is called is when the recompose scope is
+                // removed from the table. First, this never happens for content that is moving, and
+                // 2) even if it did the only reason we tell the composer is to clear tracking
+                // tables that contain this information which is not relevant here.
+                override fun recomposeScopeReleased(scope: RecomposeScopeImpl) {
+                    // Nothing to do
+                }
 
-            // [recordReadOf] this is also something that would happen only during active
-            // recomposition which doesn't happened to a slot table that is moving.
-            override fun recordReadOf(value: Any) {
-                // Nothing to do
+                // [recordReadOf] this is also something that would happen only during active
+                // recomposition which doesn't happened to a slot table that is moving.
+                override fun recordReadOf(value: Any) {
+                    // Nothing to do
+                }
             }
-        }
         slotTable.write { writer ->
             RecomposeScopeImpl.adoptAnchoredScopes(
                 slots = writer,
diff --git a/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/changelist/OperationArgContainer.kt b/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/changelist/OperationArgContainer.kt
index ff4a320..e8ac540 100644
--- a/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/changelist/OperationArgContainer.kt
+++ b/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/changelist/OperationArgContainer.kt
@@ -16,17 +16,11 @@
 
 package androidx.compose.runtime.changelist
 
-/**
- * A container of parameters assigned to the arguments of an [Operation].
- */
+/** A container of parameters assigned to the arguments of an [Operation]. */
 internal interface OperationArgContainer {
-    /**
-     * Returns the assigned value of [parameter] for the current operation.
-     */
+    /** Returns the assigned value of [parameter] for the current operation. */
     fun getInt(parameter: Operation.IntParameter): Int
 
-    /**
-     * Returns the assigned value of [parameter] for the current operation.
-     */
+    /** Returns the assigned value of [parameter] for the current operation. */
     fun <T> getObject(parameter: Operation.ObjectParameter<T>): T
 }
diff --git a/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/changelist/Operations.kt b/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/changelist/Operations.kt
index 93f873d..5ccd71e 100644
--- a/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/changelist/Operations.kt
+++ b/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/changelist/Operations.kt
@@ -52,26 +52,23 @@
     private var objectArgsSize = 0
 
     /*
-        The two masks below are used to track which arguments have been assigned for the most
-        recently pushed operation. When an argument is set, its corresponding bit is set to 1.
-        The bit indices correspond to the parameter's offset value. Offset 0 corresponds to the
-        least significant bit, so a parameter with offset 2 will correspond to the mask 0b100.
-     */
+       The two masks below are used to track which arguments have been assigned for the most
+       recently pushed operation. When an argument is set, its corresponding bit is set to 1.
+       The bit indices correspond to the parameter's offset value. Offset 0 corresponds to the
+       least significant bit, so a parameter with offset 2 will correspond to the mask 0b100.
+    */
     private var pushedIntMask = 0b0
     private var pushedObjectMask = 0b0
 
-    /**
-     * Returns the number of pending operations contained in this operation stack.
-     */
+    /** Returns the number of pending operations contained in this operation stack. */
     val size: Int
         get() = opCodesSize
 
     fun isEmpty() = size == 0
+
     fun isNotEmpty() = size != 0
 
-    /**
-     * Resets the collection to its initial state, clearing all stored operations and arguments.
-     */
+    /** Resets the collection to its initial state, clearing all stored operations and arguments. */
     fun clear() {
         // We don't technically need to clear the opCodes or intArgs arrays, because we ensure
         // that every operation that gets pushed to this data structure has all of its arguments
@@ -86,17 +83,16 @@
     }
 
     /**
-     * Pushes [operation] to the stack, ensures that there is space in the backing argument
-     * arrays to store the parameters, and increments the internal pointers to track the
-     * operation's arguments.
+     * Pushes [operation] to the stack, ensures that there is space in the backing argument arrays
+     * to store the parameters, and increments the internal pointers to track the operation's
+     * arguments.
      *
-     * It is expected that the arguments of this operation will be added after [pushOp]
-     * returns. The index to write a parameter is `intArgsSize - operation.ints + arg.offset`
-     * for int arguments, and `objectArgsSize - operation.objects + arg.offset` for
-     * object arguments.
+     * It is expected that the arguments of this operation will be added after [pushOp] returns. The
+     * index to write a parameter is `intArgsSize - operation.ints + arg.offset` for int arguments,
+     * and `objectArgsSize - operation.objects + arg.offset` for object arguments.
      *
-     * Do not use this API outside of the [Operations] class directly. Use [push] instead.
-     * This function is kept visible so that it may be inlined.
+     * Do not use this API outside of the [Operations] class directly. Use [push] instead. This
+     * function is kept visible so that it may be inlined.
      */
     @InternalComposeApi
     fun pushOp(operation: Operation) {
@@ -139,35 +135,33 @@
     /**
      * Adds an [operation] to the stack with no arguments.
      *
-     * If [operation] defines any arguments, you must use the overload that accepts an `args`
-     * lambda to provide those arguments. This function will throw an exception if the operation
-     * defines any arguments.
+     * If [operation] defines any arguments, you must use the overload that accepts an `args` lambda
+     * to provide those arguments. This function will throw an exception if the operation defines
+     * any arguments.
      */
     fun push(operation: Operation) {
         requirePrecondition(operation.ints == 0 && operation.objects == 0) {
             "Cannot push $operation without arguments because it expects " +
                 "${operation.ints} ints and ${operation.objects} objects."
         }
-        @OptIn(InternalComposeApi::class)
-        pushOp(operation)
+        @OptIn(InternalComposeApi::class) pushOp(operation)
     }
 
     /**
      * Adds an [operation] to the stack with arguments. To set arguments on the operation, call
      * [WriteScope.setObject] and [WriteScope.setInt] inside of the [args] lambda.
      *
-     * The [args] lambda is called exactly once inline. You must set all arguments defined on
-     * the [operation] exactly once. An exception is thrown if you attempt to call
-     * [WriteScope.setInt] or [WriteScope.setObject] on an argument you have already set, and
-     * when [args] returns if not all arguments were set.
+     * The [args] lambda is called exactly once inline. You must set all arguments defined on the
+     * [operation] exactly once. An exception is thrown if you attempt to call [WriteScope.setInt]
+     * or [WriteScope.setObject] on an argument you have already set, and when [args] returns if not
+     * all arguments were set.
      */
     @Suppress("BanInlineOptIn")
     @OptIn(ExperimentalContracts::class)
     inline fun push(operation: Operation, args: WriteScope.() -> Unit) {
         contract { callsInPlace(args, EXACTLY_ONCE) }
 
-        @OptIn(InternalComposeApi::class)
-        pushOp(operation)
+        @OptIn(InternalComposeApi::class) pushOp(operation)
         WriteScope(this).args()
 
         // Verify all arguments were written to.
@@ -205,8 +199,8 @@
 
     /**
      * Returns a bitmask int where the bottommost [paramCount] bits are 1's, and the rest of the
-     * bits are 0's. This corresponds to what [pushedIntMask] and [pushedObjectMask] will equal
-     * if all [paramCount] arguments are set for the most recently pushed operation.
+     * bits are 0's. This corresponds to what [pushedIntMask] and [pushedObjectMask] will equal if
+     * all [paramCount] arguments are set for the most recently pushed operation.
      */
     private fun createExpectedArgMask(paramCount: Int): Int {
         // Calling ushr(32) no-ops instead of returning 0, so add a special case if paramCount is 0
@@ -224,13 +218,9 @@
         val op = opCodes[--opCodesSize]!!
         opCodes[opCodesSize] = null
 
-        repeat(op.objects) {
-            objectArgs[--objectArgsSize] = null
-        }
+        repeat(op.objects) { objectArgs[--objectArgsSize] = null }
 
-        repeat(op.ints) {
-            intArgs[--intArgsSize] = 0
-        }
+        repeat(op.ints) { intArgs[--intArgsSize] = 0 }
     }
 
     /**
@@ -273,25 +263,21 @@
      * Iterates through the stack in the order that items were added, calling [sink] for each
      * operation in the stack.
      *
-     * Iteration moves from oldest elements to newest (more like a queue than a stack). [drain] is
-     * a destructive operation that also clears the items in the stack, and is used to apply all
-     * of the operations in the stack, since they must be applied in the order they were added
-     * instead of being popped.
+     * Iteration moves from oldest elements to newest (more like a queue than a stack). [drain] is a
+     * destructive operation that also clears the items in the stack, and is used to apply all of
+     * the operations in the stack, since they must be applied in the order they were added instead
+     * of being popped.
      */
-    inline fun drain(
-        sink: OpIterator.() -> Unit
-    ) {
+    inline fun drain(sink: OpIterator.() -> Unit) {
         forEach(sink)
         clear()
     }
 
     /**
-     * Iterates through the stack, calling [action] for each operation in the stack. Iteration
-     * moves from oldest elements to newest (more like a queue than a stack).
+     * Iterates through the stack, calling [action] for each operation in the stack. Iteration moves
+     * from oldest elements to newest (more like a queue than a stack).
      */
-    inline fun forEach(
-        action: OpIterator.() -> Unit
-    ) {
+    inline fun forEach(action: OpIterator.() -> Unit) {
         if (isNotEmpty()) {
             val iterator = OpIterator()
             do {
@@ -307,11 +293,7 @@
     ) {
         drain {
             with(operation) {
-                execute(
-                    applier = applier,
-                    slots = slots,
-                    rememberManager = rememberManager
-                )
+                execute(applier = applier, slots = slots, rememberManager = rememberManager)
             }
         }
     }
@@ -331,23 +313,25 @@
         val operation: Operation
             get() = stack.peekOperation()
 
-        fun setInt(parameter: IntParameter, value: Int) = with(stack) {
-            val mask = 0b1 shl parameter.offset
-            checkPrecondition(pushedIntMask and mask == 0) {
-                "Already pushed argument ${operation.intParamName(parameter)}"
+        fun setInt(parameter: IntParameter, value: Int) =
+            with(stack) {
+                val mask = 0b1 shl parameter.offset
+                checkPrecondition(pushedIntMask and mask == 0) {
+                    "Already pushed argument ${operation.intParamName(parameter)}"
+                }
+                pushedIntMask = pushedIntMask or mask
+                intArgs[topIntIndexOf(parameter)] = value
             }
-            pushedIntMask = pushedIntMask or mask
-            intArgs[topIntIndexOf(parameter)] = value
-        }
 
-        fun <T> setObject(parameter: ObjectParameter<T>, value: T) = with(stack) {
-            val mask = 0b1 shl parameter.offset
-            checkPrecondition(pushedObjectMask and mask == 0) {
-                "Already pushed argument ${operation.objectParamName(parameter)}"
+        fun <T> setObject(parameter: ObjectParameter<T>, value: T) =
+            with(stack) {
+                val mask = 0b1 shl parameter.offset
+                checkPrecondition(pushedObjectMask and mask == 0) {
+                    "Already pushed argument ${operation.objectParamName(parameter)}"
+                }
+                pushedObjectMask = pushedObjectMask or mask
+                objectArgs[topObjectIndexOf(parameter)] = value
             }
-            pushedObjectMask = pushedObjectMask or mask
-            objectArgs[topObjectIndexOf(parameter)] = value
-        }
     }
 
     inner class OpIterator : OperationArgContainer {
@@ -365,9 +349,7 @@
             return opIdx < opCodesSize
         }
 
-        /**
-         * Returns the [Operation] at the current position of the iterator in the [Operations].
-         */
+        /** Returns the [Operation] at the current position of the iterator in the [Operations]. */
         val operation: Operation
             get() = opCodes[opIdx]!!
 
@@ -375,8 +357,7 @@
          * Returns the value of [parameter] for the operation at the current position of the
          * iterator.
          */
-        override fun getInt(parameter: IntParameter): Int =
-            intArgs[intIdx + parameter.offset]
+        override fun getInt(parameter: IntParameter): Int = intArgs[intIdx + parameter.offset]
 
         /**
          * Returns the value of [parameter] for the operation at the current position of the
@@ -413,56 +394,54 @@
         }
     }
 
-    private fun Operations.OpIterator.currentOpToDebugString(
-        linePrefix: String
-    ): String {
+    private fun Operations.OpIterator.currentOpToDebugString(linePrefix: String): String {
         val operation = operation
         return if (operation.ints == 0 && operation.objects == 0) {
             operation.name
-        } else buildString {
-            append(operation.name)
-            append('(')
-            var isFirstParam = true
-            val argLinePrefix = linePrefix.indent()
-            repeat(operation.ints) { offset ->
-                val param = Operation.IntParameter(offset)
-                val name = operation.intParamName(param)
-                if (!isFirstParam) append(", ") else isFirstParam = false
+        } else
+            buildString {
+                append(operation.name)
+                append('(')
+                var isFirstParam = true
+                val argLinePrefix = linePrefix.indent()
+                repeat(operation.ints) { offset ->
+                    val param = Operation.IntParameter(offset)
+                    val name = operation.intParamName(param)
+                    if (!isFirstParam) append(", ") else isFirstParam = false
+                    appendLine()
+                    append(argLinePrefix)
+                    append(name)
+                    append(" = ")
+                    append(getInt(param))
+                }
+                repeat(operation.objects) { offset ->
+                    val param = Operation.ObjectParameter<Any?>(offset)
+                    val name = operation.objectParamName(param)
+                    if (!isFirstParam) append(", ") else isFirstParam = false
+                    appendLine()
+                    append(argLinePrefix)
+                    append(name)
+                    append(" = ")
+                    append(getObject(param).formatOpArgumentToString(argLinePrefix))
+                }
                 appendLine()
-                append(argLinePrefix)
-                append(name)
-                append(" = ")
-                append(getInt(param))
+                append(linePrefix)
+                append(")")
             }
-            repeat(operation.objects) { offset ->
-                val param = Operation.ObjectParameter<Any?>(offset)
-                val name = operation.objectParamName(param)
-                if (!isFirstParam) append(", ") else isFirstParam = false
-                appendLine()
-                append(argLinePrefix)
-                append(name)
-                append(" = ")
-                append(getObject(param).formatOpArgumentToString(argLinePrefix))
-            }
-            appendLine()
-            append(linePrefix)
-            append(")")
-        }
     }
 
-    private fun Any?.formatOpArgumentToString(
-        linePrefix: String
-    ) = when (this) {
-        null -> "null"
-        is Array<*> -> asIterable().toCollectionString(linePrefix)
-        is IntArray -> asIterable().toCollectionString(linePrefix)
-        is LongArray -> asIterable().toCollectionString(linePrefix)
-        is FloatArray -> asIterable().toCollectionString(linePrefix)
-        is DoubleArray -> asIterable().toCollectionString(linePrefix)
-        is Iterable<*> -> toCollectionString(linePrefix)
-        is OperationsDebugStringFormattable -> toDebugString(linePrefix)
-        else -> toString()
-    }
+    private fun Any?.formatOpArgumentToString(linePrefix: String) =
+        when (this) {
+            null -> "null"
+            is Array<*> -> asIterable().toCollectionString(linePrefix)
+            is IntArray -> asIterable().toCollectionString(linePrefix)
+            is LongArray -> asIterable().toCollectionString(linePrefix)
+            is FloatArray -> asIterable().toCollectionString(linePrefix)
+            is DoubleArray -> asIterable().toCollectionString(linePrefix)
+            is Iterable<*> -> toCollectionString(linePrefix)
+            is OperationsDebugStringFormattable -> toDebugString(linePrefix)
+            else -> toString()
+        }
 
     private fun <T> Iterable<T>.toCollectionString(linePrefix: String): String =
         joinToString(prefix = "[", postfix = "]", separator = ", ") {
diff --git a/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/collection/IntMap.kt b/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/collection/IntMap.kt
index b0b7ae8..a89d532 100644
--- a/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/collection/IntMap.kt
+++ b/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/collection/IntMap.kt
@@ -16,29 +16,19 @@
 
 package androidx.compose.runtime.collection
 
-/**
- * Map of (int) -> Element that attempts to avoid boxing.
- */
+/** Map of (int) -> Element that attempts to avoid boxing. */
 internal expect class IntMap<E>(initialCapacity: Int = 10) {
 
-    /**
-     * True if this map contains key
-     */
+    /** True if this map contains key */
     operator fun contains(key: Int): Boolean
 
-    /**
-     * Get [key] or null
-     */
+    /** Get [key] or null */
     operator fun get(key: Int): E?
 
-    /**
-     * Get [key] or [valueIfAbsent]
-     */
+    /** Get [key] or [valueIfAbsent] */
     fun get(key: Int, valueIfAbsent: E): E
 
-    /**
-     * Sets [key] to [value]
-     */
+    /** Sets [key] to [value] */
     operator fun set(key: Int, value: E)
 
     /**
@@ -48,13 +38,9 @@
      */
     fun remove(key: Int)
 
-    /**
-     * Clear this map
-     */
+    /** Clear this map */
     fun clear()
 
-    /**
-     * Current count of key value pairs.
-     */
+    /** Current count of key value pairs. */
     val size: Int
 }
diff --git a/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/collection/MutableVector.kt b/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/collection/MutableVector.kt
index b539b12..18cddf2 100644
--- a/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/collection/MutableVector.kt
+++ b/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/collection/MutableVector.kt
@@ -27,34 +27,25 @@
  * [ArrayList].
  */
 @OptIn(ExperimentalContracts::class)
-class MutableVector<T> @PublishedApi internal constructor(
-    @PublishedApi internal var content: Array<T?>,
-    size: Int
-) : RandomAccess {
-    /**
-     * Stores allocated [MutableList] representation of this vector.
-     */
+class MutableVector<T>
+@PublishedApi
+internal constructor(@PublishedApi internal var content: Array<T?>, size: Int) : RandomAccess {
+    /** Stores allocated [MutableList] representation of this vector. */
     private var list: MutableList<T>? = null
 
-    /**
-     * The number of elements in the [MutableVector].
-     */
+    /** The number of elements in the [MutableVector]. */
     var size: Int = size
         private set
 
-    /**
-     * Returns the last valid index in the [MutableVector].
-     */
-    inline val lastIndex: Int get() = size - 1
+    /** Returns the last valid index in the [MutableVector]. */
+    inline val lastIndex: Int
+        get() = size - 1
 
-    /**
-     * Returns an [IntRange] of the valid indices for this [MutableVector].
-     */
-    inline val indices: IntRange get() = 0..size - 1
+    /** Returns an [IntRange] of the valid indices for this [MutableVector]. */
+    inline val indices: IntRange
+        get() = 0..size - 1
 
-    /**
-     * Adds [element] to the [MutableVector] and returns `true`.
-     */
+    /** Adds [element] to the [MutableVector] and returns `true`. */
     fun add(element: T): Boolean {
         ensureCapacity(size + 1)
         content[size] = element
@@ -63,8 +54,8 @@
     }
 
     /**
-     * Adds [element] to the [MutableVector] at the given [index], shifting over any elements
-     * that are in the way.
+     * Adds [element] to the [MutableVector] at the given [index], shifting over any elements that
+     * are in the way.
      */
     fun add(index: Int, element: T) {
         ensureCapacity(size + 1)
@@ -82,8 +73,8 @@
     }
 
     /**
-     * Adds all [elements] to the [MutableVector] at the given [index], shifting over any
-     * elements that are in the way.
+     * Adds all [elements] to the [MutableVector] at the given [index], shifting over any elements
+     * that are in the way.
      */
     fun addAll(index: Int, elements: List<T>): Boolean {
         if (elements.isEmpty()) return false
@@ -105,8 +96,8 @@
     }
 
     /**
-     * Adds all [elements] to the [MutableVector] at the given [index], shifting over any
-     * elements that are in the way.
+     * Adds all [elements] to the [MutableVector] at the given [index], shifting over any elements
+     * that are in the way.
      */
     fun addAll(index: Int, elements: MutableVector<T>): Boolean {
         if (elements.isEmpty()) return false
@@ -150,25 +141,19 @@
      * Adds all [elements] to the end of the [MutableVector] and returns `true` if the
      * [MutableVector] was changed.
      */
-    fun addAll(
-        @Suppress("ArrayReturn")
-        elements: Array<T>
-    ): Boolean {
+    fun addAll(@Suppress("ArrayReturn") elements: Array<T>): Boolean {
         if (elements.isEmpty()) {
             return false
         }
         ensureCapacity(size + elements.size)
-        elements.copyInto(
-            destination = content,
-            destinationOffset = size
-        )
+        elements.copyInto(destination = content, destinationOffset = size)
         size += elements.size
         return true
     }
 
     /**
-     * Adds all [elements] to the [MutableVector] at the given [index], shifting over any
-     * elements that are in the way.
+     * Adds all [elements] to the [MutableVector] at the given [index], shifting over any elements
+     * that are in the way.
      */
     fun addAll(index: Int, elements: Collection<T>): Boolean {
         if (elements.isEmpty()) return false
@@ -182,9 +167,7 @@
                 endIndex = size
             )
         }
-        elements.forEachIndexed { i, item ->
-            content[index + i] = item
-        }
+        elements.forEachIndexed { i, item -> content[index + i] = item }
         size += elements.size
         return true
     }
@@ -197,9 +180,7 @@
         return addAll(size, elements)
     }
 
-    /**
-     * Returns `true` if any of the elements give a `true` return value for [predicate].
-     */
+    /** Returns `true` if any of the elements give a `true` return value for [predicate]. */
     inline fun any(predicate: (T) -> Boolean): Boolean {
         contract { callsInPlace(predicate) }
         val size = size
@@ -232,18 +213,12 @@
         return false
     }
 
-    /**
-     * Returns [MutableList] interface access to the [MutableVector].
-     */
+    /** Returns [MutableList] interface access to the [MutableVector]. */
     fun asMutableList(): MutableList<T> {
-        return list ?: MutableVectorList(this).also {
-            list = it
-        }
+        return list ?: MutableVectorList(this).also { list = it }
     }
 
-    /**
-     * Removes all elements in the [MutableVector].
-     */
+    /** Removes all elements in the [MutableVector]. */
     fun clear() {
         val content = content
         for (i in lastIndex downTo 0) {
@@ -252,9 +227,7 @@
         size = 0
     }
 
-    /**
-     * Returns `true` if the [MutableVector] contains [element] or `false` otherwise.
-     */
+    /** Returns `true` if the [MutableVector] contains [element] or `false` otherwise. */
     operator fun contains(element: T): Boolean {
         for (i in 0..lastIndex) {
             if (get(i) == element) return true
@@ -263,8 +236,8 @@
     }
 
     /**
-     * Returns `true` if the [MutableVector] contains all elements in [elements] or `false` if
-     * one or more are missing.
+     * Returns `true` if the [MutableVector] contains all elements in [elements] or `false` if one
+     * or more are missing.
      */
     fun containsAll(elements: List<T>): Boolean {
         for (i in elements.indices) {
@@ -274,19 +247,17 @@
     }
 
     /**
-     * Returns `true` if the [MutableVector] contains all elements in [elements] or `false` if
-     * one or more are missing.
+     * Returns `true` if the [MutableVector] contains all elements in [elements] or `false` if one
+     * or more are missing.
      */
     fun containsAll(elements: Collection<T>): Boolean {
-        elements.forEach {
-            if (!contains(it)) return false
-        }
+        elements.forEach { if (!contains(it)) return false }
         return true
     }
 
     /**
-     * Returns `true` if the [MutableVector] contains all elements in [elements] or `false` if
-     * one or more are missing.
+     * Returns `true` if the [MutableVector] contains all elements in [elements] or `false` if one
+     * or more are missing.
      */
     fun containsAll(elements: MutableVector<T>): Boolean {
         for (i in elements.indices) {
@@ -296,9 +267,8 @@
     }
 
     /**
-     * Returns `true` if the contents of the [MutableVector] are the same or `false` if there
-     * is any difference. This uses equality comparisons on each element rather than reference
-     * equality.
+     * Returns `true` if the contents of the [MutableVector] are the same or `false` if there is any
+     * difference. This uses equality comparisons on each element rather than reference equality.
      */
     fun contentEquals(other: MutableVector<T>): Boolean {
         if (other.size != size) {
@@ -312,9 +282,7 @@
         return true
     }
 
-    /**
-     * Ensures that there is enough space to store [capacity] elements in the [MutableVector].
-     */
+    /** Ensures that there is enough space to store [capacity] elements in the [MutableVector]. */
     fun ensureCapacity(capacity: Int) {
         val oldContent = content
         if (oldContent.size < capacity) {
@@ -324,8 +292,8 @@
     }
 
     /**
-     * Returns the first element in the [MutableVector] or throws a [NoSuchElementException] if
-     * it [isEmpty].
+     * Returns the first element in the [MutableVector] or throws a [NoSuchElementException] if it
+     * [isEmpty].
      */
     fun first(): T {
         if (isEmpty()) {
@@ -353,9 +321,7 @@
         throwNoSuchElementException()
     }
 
-    /**
-     * Returns the first element in the [MutableVector] or `null` if it [isEmpty].
-     */
+    /** Returns the first element in the [MutableVector] or `null` if it [isEmpty]. */
     inline fun firstOrNull() = if (isEmpty()) null else get(0)
 
     /**
@@ -378,8 +344,8 @@
     }
 
     /**
-     * Accumulates values, starting with [initial], and applying [operation] to each element
-     * in the [MutableVector] in order.
+     * Accumulates values, starting with [initial], and applying [operation] to each element in the
+     * [MutableVector] in order.
      */
     inline fun <R> fold(initial: R, operation: (acc: R, T) -> R): R {
         contract { callsInPlace(operation) }
@@ -397,8 +363,8 @@
     }
 
     /**
-     * Accumulates values, starting with [initial], and applying [operation] to each element
-     * in the [MutableVector] in order.
+     * Accumulates values, starting with [initial], and applying [operation] to each element in the
+     * [MutableVector] in order.
      */
     inline fun <R> foldIndexed(initial: R, operation: (index: Int, acc: R, T) -> R): R {
         contract { callsInPlace(operation) }
@@ -416,8 +382,8 @@
     }
 
     /**
-     * Accumulates values, starting with [initial], and applying [operation] to each element
-     * in the [MutableVector] in reverse order.
+     * Accumulates values, starting with [initial], and applying [operation] to each element in the
+     * [MutableVector] in reverse order.
      */
     inline fun <R> foldRight(initial: R, operation: (T, acc: R) -> R): R {
         contract { callsInPlace(operation) }
@@ -435,8 +401,8 @@
     }
 
     /**
-     * Accumulates values, starting with [initial], and applying [operation] to each element
-     * in the [MutableVector] in reverse order.
+     * Accumulates values, starting with [initial], and applying [operation] to each element in the
+     * [MutableVector] in reverse order.
      */
     inline fun <R> foldRightIndexed(initial: R, operation: (index: Int, T, acc: R) -> R): R {
         contract { callsInPlace(operation) }
@@ -453,9 +419,7 @@
         return acc
     }
 
-    /**
-     * Calls [block] for each element in the [MutableVector], in order.
-     */
+    /** Calls [block] for each element in the [MutableVector], in order. */
     inline fun forEach(block: (T) -> Unit) {
         contract { callsInPlace(block) }
         val size = size
@@ -469,9 +433,7 @@
         }
     }
 
-    /**
-     * Calls [block] for each element in the [MutableVector] along with its index, in order.
-     */
+    /** Calls [block] for each element in the [MutableVector] along with its index, in order. */
     inline fun forEachIndexed(block: (Int, T) -> Unit) {
         contract { callsInPlace(block) }
         val size = size
@@ -485,9 +447,7 @@
         }
     }
 
-    /**
-     * Calls [block] for each element in the [MutableVector] in reverse order.
-     */
+    /** Calls [block] for each element in the [MutableVector] in reverse order. */
     inline fun forEachReversed(block: (T) -> Unit) {
         contract { callsInPlace(block) }
         val size = size
@@ -502,8 +462,7 @@
     }
 
     /**
-     * Calls [block] for each element in the [MutableVector] along with its index, in reverse
-     * order.
+     * Calls [block] for each element in the [MutableVector] along with its index, in reverse order.
      */
     inline fun forEachReversedIndexed(block: (Int, T) -> Unit) {
         contract { callsInPlace(block) }
@@ -517,14 +476,10 @@
         }
     }
 
-    /**
-     * Returns the element at the given [index].
-     */
+    /** Returns the element at the given [index]. */
     inline operator fun get(index: Int): T = content[index] as T
 
-    /**
-     * Returns the index of [element] in the [MutableVector] or `-1` if [element] is not there.
-     */
+    /** Returns the index of [element] in the [MutableVector] or `-1` if [element] is not there. */
     fun indexOf(element: T): Int {
         val size = size
         if (size > 0) {
@@ -539,8 +494,8 @@
     }
 
     /**
-     * Returns the index if the first element in the [MutableVector] for which [predicate]
-     * returns `true`.
+     * Returns the index if the first element in the [MutableVector] for which [predicate] returns
+     * `true`.
      */
     inline fun indexOfFirst(predicate: (T) -> Boolean): Int {
         contract { callsInPlace(predicate) }
@@ -557,8 +512,8 @@
     }
 
     /**
-     * Returns the index if the last element in the [MutableVector] for which [predicate]
-     * returns `true`.
+     * Returns the index if the last element in the [MutableVector] for which [predicate] returns
+     * `true`.
      */
     inline fun indexOfLast(predicate: (T) -> Boolean): Int {
         contract { callsInPlace(predicate) }
@@ -574,19 +529,15 @@
         return -1
     }
 
-    /**
-     * Returns `true` if the [MutableVector] has no elements in it or `false` otherwise.
-     */
+    /** Returns `true` if the [MutableVector] has no elements in it or `false` otherwise. */
     fun isEmpty(): Boolean = size == 0
 
-    /**
-     * Returns `true` if there are elements in the [MutableVector] or `false` if it is empty.
-     */
+    /** Returns `true` if there are elements in the [MutableVector] or `false` if it is empty. */
     fun isNotEmpty(): Boolean = size != 0
 
     /**
-     * Returns the last element in the [MutableVector] or throws a [NoSuchElementException] if
-     * it [isEmpty].
+     * Returns the last element in the [MutableVector] or throws a [NoSuchElementException] if it
+     * [isEmpty].
      */
     fun last(): T {
         if (isEmpty()) {
@@ -615,8 +566,8 @@
     }
 
     /**
-     * Returns the index of the last element in the [MutableVector] that is the same as
-     * [element] or `-1` if no elements match.
+     * Returns the index of the last element in the [MutableVector] that is the same as [element] or
+     * `-1` if no elements match.
      */
     fun lastIndexOf(element: T): Int {
         val size = size
@@ -631,9 +582,7 @@
         return -1
     }
 
-    /**
-     * Returns the last element in the [MutableVector] or `null` if it [isEmpty].
-     */
+    /** Returns the last element in the [MutableVector] or `null` if it [isEmpty]. */
     inline fun lastOrNull() = if (isEmpty()) null else get(lastIndex)
 
     /**
@@ -656,8 +605,8 @@
     }
 
     /**
-     * Returns an [Array] of results of transforming each element in the [MutableVector]. The
-     * Array will be the same size as this.
+     * Returns an [Array] of results of transforming each element in the [MutableVector]. The Array
+     * will be the same size as this.
      */
     @Suppress("ArrayReturn")
     inline fun <reified R> map(transform: (T) -> R): Array<R> {
@@ -666,8 +615,8 @@
     }
 
     /**
-     * Returns an [Array] of results of transforming each element in the [MutableVector]. The
-     * Array will be the same size as this.
+     * Returns an [Array] of results of transforming each element in the [MutableVector]. The Array
+     * will be the same size as this.
      */
     @Suppress("ArrayReturn")
     inline fun <reified R> mapIndexed(transform: (index: Int, T) -> R): Array<R> {
@@ -721,24 +670,19 @@
         return MutableVector(arr, targetSize)
     }
 
-    /**
-     * [add] [element] to the [MutableVector].
-     */
+    /** [add] [element] to the [MutableVector]. */
     inline operator fun plusAssign(element: T) {
         add(element)
     }
 
-    /**
-     * [remove] [element] from the [MutableVector]
-     */
+    /** [remove] [element] from the [MutableVector] */
     inline operator fun minusAssign(element: T) {
         remove(element)
     }
 
     /**
-     * Removes [element] from the [MutableVector]. If [element] was in the [MutableVector]
-     * and was removed, `true` will be returned, or `false` will be returned if the element
-     * was not found.
+     * Removes [element] from the [MutableVector]. If [element] was in the [MutableVector] and was
+     * removed, `true` will be returned, or `false` will be returned if the element was not found.
      */
     fun remove(element: T): Boolean {
         val index = indexOf(element)
@@ -779,15 +723,11 @@
             return false
         }
         val initialSize = size
-        elements.forEach {
-            remove(it)
-        }
+        elements.forEach { remove(it) }
         return initialSize != size
     }
 
-    /**
-     * Removes the element at the given [index] and returns it.
-     */
+    /** Removes the element at the given [index] and returns it. */
     fun removeAt(index: Int): T {
         val content = content
         val item = content[index] as T
@@ -804,9 +744,7 @@
         return item
     }
 
-    /**
-     * Removes items from index [start] (inclusive) to [end] (exclusive).
-     */
+    /** Removes items from index [start] (inclusive) to [end] (exclusive). */
     fun removeRange(start: Int, end: Int) {
         if (end > start) {
             if (end < size) {
@@ -831,9 +769,7 @@
         size = newSize
     }
 
-    /**
-     * Removes items that satisfy [predicate]
-     */
+    /** Removes items that satisfy [predicate] */
     inline fun removeIf(predicate: (T) -> Boolean) {
         var gap = 0
         val size = size
@@ -851,9 +787,7 @@
         setSize(size - gap)
     }
 
-    /**
-     * Keeps only [elements] in the [MutableVector] and removes all other values.
-     */
+    /** Keeps only [elements] in the [MutableVector] and removes all other values. */
     fun retainAll(elements: Collection<T>): Boolean {
         val initialSize = size
         for (i in lastIndex downTo 0) {
@@ -865,9 +799,7 @@
         return initialSize != size
     }
 
-    /**
-     * Sets the value at [index] to [element].
-     */
+    /** Sets the value at [index] to [element]. */
     operator fun set(index: Int, element: T): T {
         val content = content
         val old = content[index] as T
@@ -875,16 +807,13 @@
         return old
     }
 
-    /**
-     * Sorts the [MutableVector] using [comparator] to order the items.
-     */
+    /** Sorts the [MutableVector] using [comparator] to order the items. */
     fun sortWith(comparator: Comparator<T>) {
         (content as Array<T>).sortWith(comparator = comparator, fromIndex = 0, toIndex = size)
     }
 
     /**
-     * Returns the sum of all values produced by [selector] for each element in the
-     * [MutableVector].
+     * Returns the sum of all values produced by [selector] for each element in the [MutableVector].
      */
     inline fun sumBy(selector: (T) -> Int): Int {
         contract { callsInPlace(selector) }
@@ -906,10 +835,8 @@
         throw NoSuchElementException("MutableVector contains no element matching the predicate.")
     }
 
-    private class VectorListIterator<T>(
-        private val list: MutableList<T>,
-        private var index: Int
-    ) : MutableListIterator<T> {
+    private class VectorListIterator<T>(private val list: MutableList<T>, private var index: Int) :
+        MutableListIterator<T> {
 
         override fun hasNext(): Boolean {
             return index < list.size
@@ -951,9 +878,7 @@
         }
     }
 
-    /**
-     * [MutableList] implementation for a [MutableVector], used in [asMutableList].
-     */
+    /** [MutableList] implementation for a [MutableVector], used in [asMutableList]. */
     private class MutableVectorList<T>(private val vector: MutableVector<T>) : MutableList<T> {
         override val size: Int
             get() = vector.size
@@ -1015,8 +940,8 @@
 
     /**
      * A view into an underlying [MutableList] that directly accesses the underlying [MutableList].
-     * This is important for the implementation of [List.subList]. A change to the [SubList]
-     * also changes the referenced [MutableList].
+     * This is important for the implementation of [List.subList]. A change to the [SubList] also
+     * changes the referenced [MutableList].
      */
     private class SubList<T>(
         private val list: MutableList<T>,
@@ -1118,9 +1043,7 @@
 
         override fun removeAll(elements: Collection<T>): Boolean {
             val originalEnd = end
-            elements.forEach {
-                remove(it)
-            }
+            elements.forEach { remove(it) }
             return originalEnd != end
         }
 
@@ -1158,16 +1081,19 @@
 private fun List<*>.checkIndex(index: Int) {
     val size = size
     if (index < 0 || index >= size) {
-        throw IndexOutOfBoundsException("Index $index is out of bounds. " +
-            "The list has $size elements.")
+        throw IndexOutOfBoundsException(
+            "Index $index is out of bounds. " + "The list has $size elements."
+        )
     }
 }
 
 private fun List<*>.checkSubIndex(fromIndex: Int, toIndex: Int) {
     val size = size
     if (fromIndex > toIndex) {
-        throw IllegalArgumentException("Indices are out of order. fromIndex ($fromIndex) is " +
-            "greater than toIndex ($toIndex).")
+        throw IllegalArgumentException(
+            "Indices are out of order. fromIndex ($fromIndex) is " +
+                "greater than toIndex ($toIndex)."
+        )
     }
     if (fromIndex < 0) {
         throw IndexOutOfBoundsException("fromIndex ($fromIndex) is less than 0.")
@@ -1201,19 +1127,13 @@
     return MutableVector(arr as Array<T?>, size)
 }
 
-/**
- * Creates an empty [MutableVector] with a [capacity][MutableVector.ensureCapacity] of 16.
- */
-inline fun <reified T> mutableVectorOf() =
-    MutableVector<T>()
+/** Creates an empty [MutableVector] with a [capacity][MutableVector.ensureCapacity] of 16. */
+inline fun <reified T> mutableVectorOf() = MutableVector<T>()
 
 /**
  * Creates a [MutableVector] with the given values. This will use the passed vararg [elements]
  * storage.
  */
 inline fun <reified T> mutableVectorOf(vararg elements: T): MutableVector<T> {
-    return MutableVector(
-        elements as Array<T?>,
-        elements.size
-    )
+    return MutableVector(elements as Array<T?>, elements.size)
 }
diff --git a/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/collection/ScatterSetWrapper.kt b/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/collection/ScatterSetWrapper.kt
index ddeccc1..e1410e9 100644
--- a/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/collection/ScatterSetWrapper.kt
+++ b/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/collection/ScatterSetWrapper.kt
@@ -22,24 +22,17 @@
  * A wrapper for [ScatterSet] that implements [Set] APIs. This wrapper allows to use [ScatterSet]
  * through external APIs and unwrap it back into [Set] for faster iteration / other operations.
  */
-internal class ScatterSetWrapper<T>(
-    internal val set: ScatterSet<T>
-) : Set<T> {
+internal class ScatterSetWrapper<T>(internal val set: ScatterSet<T>) : Set<T> {
     override val size: Int
         get() = set.size
 
     override fun isEmpty(): Boolean = set.isEmpty()
-    override fun iterator(): Iterator<T> = iterator {
-        set.forEach {
-            yield(it)
-        }
-    }
 
-    override fun containsAll(elements: Collection<T>): Boolean =
-        elements.all { set.contains(it) }
+    override fun iterator(): Iterator<T> = iterator { set.forEach { yield(it) } }
 
-    override fun contains(element: T): Boolean =
-        set.contains(element)
+    override fun containsAll(elements: Collection<T>): Boolean = elements.all { set.contains(it) }
+
+    override fun contains(element: T): Boolean = set.contains(element)
 }
 
 internal fun <T> ScatterSet<T>.wrapIntoSet(): Set<T> = ScatterSetWrapper(this)
diff --git a/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/collection/ScopeMap.kt b/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/collection/ScopeMap.kt
index 861d6ba..497f33f 100644
--- a/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/collection/ScopeMap.kt
+++ b/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/collection/ScopeMap.kt
@@ -19,35 +19,27 @@
 import androidx.collection.MutableScatterSet
 import androidx.collection.mutableScatterMapOf
 
-/**
- * Maps values to a set of scopes.
- */
+/** Maps values to a set of scopes. */
 internal class ScopeMap<Key : Any, Scope : Any> {
     val map = mutableScatterMapOf<Any, Any>()
 
-    /**
-     * The number of values in the map.
-     */
-    val size get() = map.size
+    /** The number of values in the map. */
+    val size
+        get() = map.size
 
-    /**
-     * Adds a [key]/[scope] pair to the map.
-     */
+    /** Adds a [key]/[scope] pair to the map. */
     fun add(key: Key, scope: Scope) {
         map.compute(key) { _, value ->
             when (value) {
                 null -> scope
                 is MutableScatterSet<*> -> {
-                    @Suppress("UNCHECKED_CAST")
-                    (value as MutableScatterSet<Scope>).add(scope)
+                    @Suppress("UNCHECKED_CAST") (value as MutableScatterSet<Scope>).add(scope)
                     value
                 }
-
                 else -> {
                     if (value !== scope) {
                         val set = MutableScatterSet<Scope>()
-                        @Suppress("UNCHECKED_CAST")
-                        set.add(value as Scope)
+                        @Suppress("UNCHECKED_CAST") set.add(value as Scope)
                         set.add(scope)
                         set
                     } else {
@@ -58,52 +50,42 @@
         }
     }
 
-    /**
-     * Replaces scopes for [key] with [value]
-     */
+    /** Replaces scopes for [key] with [value] */
     fun set(key: Key, value: Scope) {
         map[key] = value
     }
 
-    /**
-     * Returns true if any scopes are associated with [element]
-     */
+    /** Returns true if any scopes are associated with [element] */
     operator fun contains(element: Key): Boolean = map.containsKey(element)
 
-    /**
-     * Executes [block] for all scopes mapped to the given [key].
-     */
+    /** Executes [block] for all scopes mapped to the given [key]. */
     inline fun forEachScopeOf(key: Key, block: (scope: Scope) -> Unit) {
         when (val value = map[key]) {
-            null -> { /* do nothing */ }
+            null -> {
+                /* do nothing */
+            }
             is MutableScatterSet<*> -> {
-                @Suppress("UNCHECKED_CAST")
-                (value as MutableScatterSet<Scope>).forEach(block)
+                @Suppress("UNCHECKED_CAST") (value as MutableScatterSet<Scope>).forEach(block)
             }
             else -> {
-                @Suppress("UNCHECKED_CAST")
-                block(value as Scope)
+                @Suppress("UNCHECKED_CAST") block(value as Scope)
             }
         }
     }
 
     inline fun anyScopeOf(key: Key, block: (scope: Scope) -> Boolean): Boolean {
-        forEachScopeOf(key) {
-            if (block(it)) return true
-        }
+        forEachScopeOf(key) { if (block(it)) return true }
         return false
     }
 
-    /**
-     * Removes all values and scopes from the map
-     */
+    /** Removes all values and scopes from the map */
     fun clear() {
         map.clear()
     }
 
     /**
-     * Remove [scope] from the scope set for [key]. If the scope set is empty after [scope] has
-     * been remove the reference to [key] is removed as well.
+     * Remove [scope] from the scope set for [key]. If the scope set is empty after [scope] has been
+     * remove the reference to [key] is removed as well.
      *
      * @param key the key of the scope map
      * @param scope the scope being removed
@@ -113,8 +95,7 @@
         val value = map[key] ?: return false
         return when (value) {
             is MutableScatterSet<*> -> {
-                @Suppress("UNCHECKED_CAST")
-                val set = value as MutableScatterSet<Scope>
+                @Suppress("UNCHECKED_CAST") val set = value as MutableScatterSet<Scope>
 
                 val removed = set.remove(scope)
                 if (removed && set.isEmpty()) {
@@ -131,36 +112,33 @@
     }
 
     /**
-     * Removes all scopes that match [predicate]. If all scopes for a given value have been
-     * removed, that value is removed also.
+     * Removes all scopes that match [predicate]. If all scopes for a given value have been removed,
+     * that value is removed also.
      */
     inline fun removeScopeIf(crossinline predicate: (scope: Scope) -> Boolean) {
         map.removeIf { _, value ->
             when (value) {
                 is MutableScatterSet<*> -> {
-                    @Suppress("UNCHECKED_CAST")
-                    val set = value as MutableScatterSet<Scope>
+                    @Suppress("UNCHECKED_CAST") val set = value as MutableScatterSet<Scope>
                     set.removeIf(predicate)
                     set.isEmpty()
                 }
                 else -> {
-                    @Suppress("UNCHECKED_CAST")
-                    predicate(value as Scope)
+                    @Suppress("UNCHECKED_CAST") predicate(value as Scope)
                 }
             }
         }
     }
 
     /**
-     * Removes given scope from all sets. If all scopes for a given value are removed, that value
-     * is removed as well.
+     * Removes given scope from all sets. If all scopes for a given value are removed, that value is
+     * removed as well.
      */
     fun removeScope(scope: Scope) {
         map.removeIf { _, value ->
             when (value) {
                 is MutableScatterSet<*> -> {
-                    @Suppress("UNCHECKED_CAST")
-                    val set = value as MutableScatterSet<Scope>
+                    @Suppress("UNCHECKED_CAST") val set = value as MutableScatterSet<Scope>
                     set.remove(scope)
                     set.isEmpty()
                 }
@@ -172,21 +150,21 @@
     }
 
     /**
-     * Converts values to regular Map to expose to instrumentation.
-     * WARNING: extremely slow, do no use in production!
+     * Converts values to regular Map to expose to instrumentation. WARNING: extremely slow, do no
+     * use in production!
      */
     fun asMap(): Map<Key, Set<Scope>> {
         val result = hashMapOf<Key, Set<Scope>>()
         map.forEach { key, value ->
             @Suppress("UNCHECKED_CAST")
-            result[key as Key] = when (value) {
-                is MutableScatterSet<*> -> {
-                    val set = value as MutableScatterSet<Scope>
-                    @Suppress("AsCollectionCall")
-                    set.asSet()
+            result[key as Key] =
+                when (value) {
+                    is MutableScatterSet<*> -> {
+                        val set = value as MutableScatterSet<Scope>
+                        @Suppress("AsCollectionCall") set.asSet()
+                    }
+                    else -> mutableSetOf(value as Scope)
                 }
-                else -> mutableSetOf(value as Scope)
-            }
         }
         return result
     }
diff --git a/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/internal/Atomic.kt b/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/internal/Atomic.kt
index 69c3094..b253148 100644
--- a/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/internal/Atomic.kt
+++ b/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/internal/Atomic.kt
@@ -18,14 +18,20 @@
 
 internal expect class AtomicReference<V>(value: V) {
     fun get(): V
+
     fun set(value: V)
+
     fun getAndSet(value: V): V
+
     fun compareAndSet(expect: V, newValue: V): Boolean
 }
 
 internal expect class AtomicInt(value: Int) {
     fun get(): Int
+
     fun set(value: Int)
+
     fun add(amount: Int): Int
+
     fun compareAndSet(expect: Int, newValue: Int): Boolean
 }
diff --git a/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/internal/ComposableLambda.kt b/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/internal/ComposableLambda.kt
index 9c66c95..db1f9b5 100644
--- a/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/internal/ComposableLambda.kt
+++ b/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/internal/ComposableLambda.kt
@@ -15,6 +15,7 @@
  */
 
 @file:OptIn(InternalComposeApi::class)
+
 package androidx.compose.runtime.internal
 
 import androidx.compose.runtime.Composable
@@ -37,23 +38,22 @@
 }
 
 internal fun sameBits(slot: Int): Int = bitsForSlot(0b01, slot)
+
 internal fun differentBits(slot: Int): Int = bitsForSlot(0b10, slot)
 
 /**
- * A Restart is created to hold composable lambdas to track when they are invoked allowing
- * the invocations to be invalidated when a new composable lambda is created during composition.
+ * A Restart is created to hold composable lambdas to track when they are invoked allowing the
+ * invocations to be invalidated when a new composable lambda is created during composition.
  *
  * This allows much of the call-graph to be skipped when a composable function is passed through
  * multiple levels of composable functions.
  */
 @Suppress("NAME_SHADOWING", "UNCHECKED_CAST")
 @Stable
-/* ktlint-disable parameter-list-wrapping */ // TODO(https://github.com/pinterest/ktlint/issues/921): reenable
-internal class ComposableLambdaImpl(
-    val key: Int,
-    private val tracked: Boolean,
-    block: Any?
-) : ComposableLambda {
+/* ktlint-disable parameter-list-wrapping */
+// TODO(https://github.com/pinterest/ktlint/issues/921): reenable
+internal class ComposableLambdaImpl(val key: Int, private val tracked: Boolean, block: Any?) :
+    ComposableLambda {
     private var _block: Any? = block
     private var scope: RecomposeScope? = null
     private var scopes: MutableList<RecomposeScope>? = null
@@ -129,17 +129,7 @@
         val c = c.startRestartGroup(key)
         trackRead(c)
         val dirty = changed or if (c.changed(this)) differentBits(1) else sameBits(1)
-        val result = (
-            _block as (
-                p1: Any?,
-                c: Composer,
-                changed: Int
-            ) -> Any?
-            )(
-            p1,
-            c,
-            dirty
-        )
+        val result = (_block as (p1: Any?, c: Composer, changed: Int) -> Any?)(p1, c, dirty)
         c.endRestartGroup()?.updateScope { nc, _ ->
             this(p1, nc, updateChangedFlags(changed) or 0b1)
         }
@@ -150,43 +140,26 @@
         val c = c.startRestartGroup(key)
         trackRead(c)
         val dirty = changed or if (c.changed(this)) differentBits(2) else sameBits(2)
-        val result = (_block as (p1: Any?, p2: Any?, c: Composer, changed: Int) -> Any?)(
-            p1,
-            p2,
-            c,
-            dirty
-        )
+        val result =
+            (_block as (p1: Any?, p2: Any?, c: Composer, changed: Int) -> Any?)(p1, p2, c, dirty)
         c.endRestartGroup()?.updateScope { nc, _ ->
             this(p1, p2, nc, updateChangedFlags(changed) or 0b1)
         }
         return result
     }
 
-    override operator fun invoke(
-        p1: Any?,
-        p2: Any?,
-        p3: Any?,
-        c: Composer,
-        changed: Int
-    ): Any? {
+    override operator fun invoke(p1: Any?, p2: Any?, p3: Any?, c: Composer, changed: Int): Any? {
         val c = c.startRestartGroup(key)
         trackRead(c)
         val dirty = changed or if (c.changed(this)) differentBits(3) else sameBits(3)
-        val result = (
-            _block as (
-                p1: Any?,
-                p2: Any?,
-                p3: Any?,
-                c: Composer,
-                changed: Int
-            ) -> Any?
-            )(
-            p1,
-            p2,
-            p3,
-            c,
-            dirty
-        )
+        val result =
+            (_block as (p1: Any?, p2: Any?, p3: Any?, c: Composer, changed: Int) -> Any?)(
+                p1,
+                p2,
+                p3,
+                c,
+                dirty
+            )
         c.endRestartGroup()?.updateScope { nc, _ ->
             this(p1, p2, p3, nc, updateChangedFlags(changed) or 0b1)
         }
@@ -204,23 +177,15 @@
         val c = c.startRestartGroup(key)
         trackRead(c)
         val dirty = changed or if (c.changed(this)) differentBits(4) else sameBits(4)
-        val result = (
-            _block as (
-                p1: Any?,
-                p2: Any?,
-                p3: Any?,
-                p4: Any?,
-                c: Composer,
-                changed: Int
-            ) -> Any?
-            )(
-            p1,
-            p2,
-            p3,
-            p4,
-            c,
-            dirty
-        )
+        val result =
+            (_block as (p1: Any?, p2: Any?, p3: Any?, p4: Any?, c: Composer, changed: Int) -> Any?)(
+                p1,
+                p2,
+                p3,
+                p4,
+                c,
+                dirty
+            )
         c.endRestartGroup()?.updateScope { nc, _ ->
             this(p1, p2, p3, p4, nc, updateChangedFlags(changed) or 0b1)
         }
@@ -239,25 +204,12 @@
         val c = c.startRestartGroup(key)
         trackRead(c)
         val dirty = changed or if (c.changed(this)) differentBits(5) else sameBits(5)
-        val result = (
-            _block as (
-                p1: Any?,
-                p2: Any?,
-                p3: Any?,
-                p4: Any?,
-                p5: Any?,
-                c: Composer,
-                changed: Int
-            ) -> Any?
-            )(
-            p1,
-            p2,
-            p3,
-            p4,
-            p5,
-            c,
-            dirty
-        )
+        val result =
+            (_block
+                as
+                (
+                    p1: Any?, p2: Any?, p3: Any?, p4: Any?, p5: Any?, c: Composer, changed: Int
+                ) -> Any?)(p1, p2, p3, p4, p5, c, dirty)
         c.endRestartGroup()?.updateScope { nc, _ ->
             this(p1, p2, p3, p4, p5, nc, updateChangedFlags(changed) or 0b1)
         }
@@ -277,27 +229,19 @@
         val c = c.startRestartGroup(key)
         trackRead(c)
         val dirty = changed or if (c.changed(this)) differentBits(6) else sameBits(6)
-        val result = (
-            _block as (
-                p1: Any?,
-                p2: Any?,
-                p3: Any?,
-                p4: Any?,
-                p5: Any?,
-                p6: Any?,
-                c: Composer,
-                changed: Int
-            ) -> Any?
-            )(
-            p1,
-            p2,
-            p3,
-            p4,
-            p5,
-            p6,
-            c,
-            dirty
-        )
+        val result =
+            (_block
+                as
+                (
+                    p1: Any?,
+                    p2: Any?,
+                    p3: Any?,
+                    p4: Any?,
+                    p5: Any?,
+                    p6: Any?,
+                    c: Composer,
+                    changed: Int
+                ) -> Any?)(p1, p2, p3, p4, p5, p6, c, dirty)
         c.endRestartGroup()?.updateScope { nc, _ ->
             this(p1, p2, p3, p4, p5, p6, nc, updateChangedFlags(changed) or 0b1)
         }
@@ -318,29 +262,20 @@
         val c = c.startRestartGroup(key)
         trackRead(c)
         val dirty = changed or if (c.changed(this)) differentBits(7) else sameBits(7)
-        val result = (
-            _block as (
-                p1: Any?,
-                p2: Any?,
-                p3: Any?,
-                p4: Any?,
-                p5: Any?,
-                p6: Any?,
-                p7: Any?,
-                c: Composer,
-                changed: Int
-            ) -> Any?
-            )(
-            p1,
-            p2,
-            p3,
-            p4,
-            p5,
-            p6,
-            p7,
-            c,
-            dirty
-        )
+        val result =
+            (_block
+                as
+                (
+                    p1: Any?,
+                    p2: Any?,
+                    p3: Any?,
+                    p4: Any?,
+                    p5: Any?,
+                    p6: Any?,
+                    p7: Any?,
+                    c: Composer,
+                    changed: Int
+                ) -> Any?)(p1, p2, p3, p4, p5, p6, p7, c, dirty)
         c.endRestartGroup()?.updateScope { nc, _ ->
             this(p1, p2, p3, p4, p5, p6, p7, nc, updateChangedFlags(changed) or 0b1)
         }
@@ -362,31 +297,21 @@
         val c = c.startRestartGroup(key)
         trackRead(c)
         val dirty = changed or if (c.changed(this)) differentBits(8) else sameBits(8)
-        val result = (
-            _block as (
-                p1: Any?,
-                p2: Any?,
-                p3: Any?,
-                p4: Any?,
-                p5: Any?,
-                p6: Any?,
-                p7: Any?,
-                p8: Any?,
-                c: Composer,
-                changed: Int
-            ) -> Any?
-            )(
-            p1,
-            p2,
-            p3,
-            p4,
-            p5,
-            p6,
-            p7,
-            p8,
-            c,
-            dirty
-        )
+        val result =
+            (_block
+                as
+                (
+                    p1: Any?,
+                    p2: Any?,
+                    p3: Any?,
+                    p4: Any?,
+                    p5: Any?,
+                    p6: Any?,
+                    p7: Any?,
+                    p8: Any?,
+                    c: Composer,
+                    changed: Int
+                ) -> Any?)(p1, p2, p3, p4, p5, p6, p7, p8, c, dirty)
         c.endRestartGroup()?.updateScope { nc, _ ->
             this(p1, p2, p3, p4, p5, p6, p7, p8, nc, updateChangedFlags(changed) or 0b1)
         }
@@ -409,33 +334,22 @@
         val c = c.startRestartGroup(key)
         trackRead(c)
         val dirty = changed or if (c.changed(this)) differentBits(9) else sameBits(9)
-        val result = (
-            _block as (
-                p1: Any?,
-                p2: Any?,
-                p3: Any?,
-                p4: Any?,
-                p5: Any?,
-                p6: Any?,
-                p7: Any?,
-                p8: Any?,
-                p9: Any?,
-                c: Composer,
-                changed: Int
-            ) -> Any?
-            )(
-            p1,
-            p2,
-            p3,
-            p4,
-            p5,
-            p6,
-            p7,
-            p8,
-            p9,
-            c,
-            dirty
-        )
+        val result =
+            (_block
+                as
+                (
+                    p1: Any?,
+                    p2: Any?,
+                    p3: Any?,
+                    p4: Any?,
+                    p5: Any?,
+                    p6: Any?,
+                    p7: Any?,
+                    p8: Any?,
+                    p9: Any?,
+                    c: Composer,
+                    changed: Int
+                ) -> Any?)(p1, p2, p3, p4, p5, p6, p7, p8, p9, c, dirty)
         c.endRestartGroup()?.updateScope { nc, _ ->
             this(p1, p2, p3, p4, p5, p6, p7, p8, p9, nc, updateChangedFlags(changed) or 0b1)
         }
@@ -460,37 +374,24 @@
         val c = c.startRestartGroup(key)
         trackRead(c)
         val dirty = changed1 or if (c.changed(this)) differentBits(10) else sameBits(10)
-        val result = (
-            _block as (
-                p1: Any?,
-                p2: Any?,
-                p3: Any?,
-                p4: Any?,
-                p5: Any?,
-                p6: Any?,
-                p7: Any?,
-                p8: Any?,
-                p9: Any?,
-                p10: Any?,
-                c: Composer,
-                changed: Int,
-                changed1: Int
-            ) -> Any?
-            )(
-            p1,
-            p2,
-            p3,
-            p4,
-            p5,
-            p6,
-            p7,
-            p8,
-            p9,
-            p10,
-            c,
-            changed,
-            dirty
-        )
+        val result =
+            (_block
+                as
+                (
+                    p1: Any?,
+                    p2: Any?,
+                    p3: Any?,
+                    p4: Any?,
+                    p5: Any?,
+                    p6: Any?,
+                    p7: Any?,
+                    p8: Any?,
+                    p9: Any?,
+                    p10: Any?,
+                    c: Composer,
+                    changed: Int,
+                    changed1: Int
+                ) -> Any?)(p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, c, changed, dirty)
         c.endRestartGroup()?.updateScope { nc, _ ->
             this(p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, nc, changed or 0b1, changed)
         }
@@ -516,39 +417,25 @@
         val c = c.startRestartGroup(key)
         trackRead(c)
         val dirty = changed1 or if (c.changed(this)) differentBits(11) else sameBits(11)
-        val result = (
-            _block as (
-                p1: Any?,
-                p2: Any?,
-                p3: Any?,
-                p4: Any?,
-                p5: Any?,
-                p6: Any?,
-                p7: Any?,
-                p8: Any?,
-                p9: Any?,
-                p10: Any?,
-                p11: Any?,
-                c: Composer,
-                changed: Int,
-                changed1: Int
-            ) -> Any?
-            )(
-            p1,
-            p2,
-            p3,
-            p4,
-            p5,
-            p6,
-            p7,
-            p8,
-            p9,
-            p10,
-            p11,
-            c,
-            changed,
-            dirty
-        )
+        val result =
+            (_block
+                as
+                (
+                    p1: Any?,
+                    p2: Any?,
+                    p3: Any?,
+                    p4: Any?,
+                    p5: Any?,
+                    p6: Any?,
+                    p7: Any?,
+                    p8: Any?,
+                    p9: Any?,
+                    p10: Any?,
+                    p11: Any?,
+                    c: Composer,
+                    changed: Int,
+                    changed1: Int
+                ) -> Any?)(p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, c, changed, dirty)
         c.endRestartGroup()?.updateScope { nc, _ ->
             this(
                 p1,
@@ -563,7 +450,8 @@
                 p10,
                 p11,
                 nc,
-                updateChangedFlags(changed) or 0b1, updateChangedFlags(changed1)
+                updateChangedFlags(changed) or 0b1,
+                updateChangedFlags(changed1)
             )
         }
         return result
@@ -589,41 +477,26 @@
         val c = c.startRestartGroup(key)
         trackRead(c)
         val dirty = changed1 or if (c.changed(this)) differentBits(12) else sameBits(12)
-        val result = (
-            _block as (
-                p1: Any?,
-                p2: Any?,
-                p3: Any?,
-                p4: Any?,
-                p5: Any?,
-                p6: Any?,
-                p7: Any?,
-                p8: Any?,
-                p9: Any?,
-                p10: Any?,
-                p11: Any?,
-                p12: Any?,
-                c: Composer,
-                changed: Int,
-                changed1: Int
-            ) -> Any?
-            )(
-            p1,
-            p2,
-            p3,
-            p4,
-            p5,
-            p6,
-            p7,
-            p8,
-            p9,
-            p10,
-            p11,
-            p12,
-            c,
-            changed,
-            dirty
-        )
+        val result =
+            (_block
+                as
+                (
+                    p1: Any?,
+                    p2: Any?,
+                    p3: Any?,
+                    p4: Any?,
+                    p5: Any?,
+                    p6: Any?,
+                    p7: Any?,
+                    p8: Any?,
+                    p9: Any?,
+                    p10: Any?,
+                    p11: Any?,
+                    p12: Any?,
+                    c: Composer,
+                    changed: Int,
+                    changed1: Int
+                ) -> Any?)(p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, c, changed, dirty)
         c.endRestartGroup()?.updateScope { nc, _ ->
             this(
                 p1,
@@ -667,43 +540,44 @@
         val c = c.startRestartGroup(key)
         trackRead(c)
         val dirty = changed1 or if (c.changed(this)) differentBits(13) else sameBits(13)
-        val result = (
-            _block as (
-                p1: Any?,
-                p2: Any?,
-                p3: Any?,
-                p4: Any?,
-                p5: Any?,
-                p6: Any?,
-                p7: Any?,
-                p8: Any?,
-                p9: Any?,
-                p10: Any?,
-                p11: Any?,
-                p12: Any?,
-                p13: Any?,
-                c: Composer,
-                changed: Int,
-                changed1: Int
-            ) -> Any?
-            )(
-            p1,
-            p2,
-            p3,
-            p4,
-            p5,
-            p6,
-            p7,
-            p8,
-            p9,
-            p10,
-            p11,
-            p12,
-            p13,
-            c,
-            changed,
-            dirty
-        )
+        val result =
+            (_block
+                as
+                (
+                    p1: Any?,
+                    p2: Any?,
+                    p3: Any?,
+                    p4: Any?,
+                    p5: Any?,
+                    p6: Any?,
+                    p7: Any?,
+                    p8: Any?,
+                    p9: Any?,
+                    p10: Any?,
+                    p11: Any?,
+                    p12: Any?,
+                    p13: Any?,
+                    c: Composer,
+                    changed: Int,
+                    changed1: Int
+                ) -> Any?)(
+                p1,
+                p2,
+                p3,
+                p4,
+                p5,
+                p6,
+                p7,
+                p8,
+                p9,
+                p10,
+                p11,
+                p12,
+                p13,
+                c,
+                changed,
+                dirty
+            )
         c.endRestartGroup()?.updateScope { nc, _ ->
             this(
                 p1,
@@ -749,45 +623,46 @@
         val c = c.startRestartGroup(key)
         trackRead(c)
         val dirty = changed1 or if (c.changed(this)) differentBits(14) else sameBits(14)
-        val result = (
-            _block as (
-                p1: Any?,
-                p2: Any?,
-                p3: Any?,
-                p4: Any?,
-                p5: Any?,
-                p6: Any?,
-                p7: Any?,
-                p8: Any?,
-                p9: Any?,
-                p10: Any?,
-                p11: Any?,
-                p12: Any?,
-                p13: Any?,
-                p14: Any?,
-                c: Composer,
-                changed: Int,
-                changed1: Int
-            ) -> Any?
-            )(
-            p1,
-            p2,
-            p3,
-            p4,
-            p5,
-            p6,
-            p7,
-            p8,
-            p9,
-            p10,
-            p11,
-            p12,
-            p13,
-            p14,
-            c,
-            changed,
-            dirty
-        )
+        val result =
+            (_block
+                as
+                (
+                    p1: Any?,
+                    p2: Any?,
+                    p3: Any?,
+                    p4: Any?,
+                    p5: Any?,
+                    p6: Any?,
+                    p7: Any?,
+                    p8: Any?,
+                    p9: Any?,
+                    p10: Any?,
+                    p11: Any?,
+                    p12: Any?,
+                    p13: Any?,
+                    p14: Any?,
+                    c: Composer,
+                    changed: Int,
+                    changed1: Int
+                ) -> Any?)(
+                p1,
+                p2,
+                p3,
+                p4,
+                p5,
+                p6,
+                p7,
+                p8,
+                p9,
+                p10,
+                p11,
+                p12,
+                p13,
+                p14,
+                c,
+                changed,
+                dirty
+            )
         c.endRestartGroup()?.updateScope { nc, _ ->
             this(
                 p1,
@@ -835,47 +710,48 @@
         val c = c.startRestartGroup(key)
         trackRead(c)
         val dirty = changed1 or if (c.changed(this)) differentBits(15) else sameBits(15)
-        val result = (
-            _block as (
-                p1: Any?,
-                p2: Any?,
-                p3: Any?,
-                p4: Any?,
-                p5: Any?,
-                p6: Any?,
-                p7: Any?,
-                p8: Any?,
-                p9: Any?,
-                p10: Any?,
-                p11: Any?,
-                p12: Any?,
-                p13: Any?,
-                p14: Any?,
-                p15: Any?,
-                c: Composer,
-                changed: Int,
-                changed1: Int
-            ) -> Any?
-            )(
-            p1,
-            p2,
-            p3,
-            p4,
-            p5,
-            p6,
-            p7,
-            p8,
-            p9,
-            p10,
-            p11,
-            p12,
-            p13,
-            p14,
-            p15,
-            c,
-            changed,
-            dirty
-        )
+        val result =
+            (_block
+                as
+                (
+                    p1: Any?,
+                    p2: Any?,
+                    p3: Any?,
+                    p4: Any?,
+                    p5: Any?,
+                    p6: Any?,
+                    p7: Any?,
+                    p8: Any?,
+                    p9: Any?,
+                    p10: Any?,
+                    p11: Any?,
+                    p12: Any?,
+                    p13: Any?,
+                    p14: Any?,
+                    p15: Any?,
+                    c: Composer,
+                    changed: Int,
+                    changed1: Int
+                ) -> Any?)(
+                p1,
+                p2,
+                p3,
+                p4,
+                p5,
+                p6,
+                p7,
+                p8,
+                p9,
+                p10,
+                p11,
+                p12,
+                p13,
+                p14,
+                p15,
+                c,
+                changed,
+                dirty
+            )
         c.endRestartGroup()?.updateScope { nc, _ ->
             this(
                 p1,
@@ -925,49 +801,50 @@
         val c = c.startRestartGroup(key)
         trackRead(c)
         val dirty = changed1 or if (c.changed(this)) differentBits(16) else sameBits(16)
-        val result = (
-            _block as (
-                p1: Any?,
-                p2: Any?,
-                p3: Any?,
-                p4: Any?,
-                p5: Any?,
-                p6: Any?,
-                p7: Any?,
-                p8: Any?,
-                p9: Any?,
-                p10: Any?,
-                p11: Any?,
-                p12: Any?,
-                p13: Any?,
-                p14: Any?,
-                p15: Any?,
-                p16: Any?,
-                c: Composer,
-                changed: Int,
-                changed1: Int
-            ) -> Any?
-            )(
-            p1,
-            p2,
-            p3,
-            p4,
-            p5,
-            p6,
-            p7,
-            p8,
-            p9,
-            p10,
-            p11,
-            p12,
-            p13,
-            p14,
-            p15,
-            p16,
-            c,
-            changed,
-            dirty
-        )
+        val result =
+            (_block
+                as
+                (
+                    p1: Any?,
+                    p2: Any?,
+                    p3: Any?,
+                    p4: Any?,
+                    p5: Any?,
+                    p6: Any?,
+                    p7: Any?,
+                    p8: Any?,
+                    p9: Any?,
+                    p10: Any?,
+                    p11: Any?,
+                    p12: Any?,
+                    p13: Any?,
+                    p14: Any?,
+                    p15: Any?,
+                    p16: Any?,
+                    c: Composer,
+                    changed: Int,
+                    changed1: Int
+                ) -> Any?)(
+                p1,
+                p2,
+                p3,
+                p4,
+                p5,
+                p6,
+                p7,
+                p8,
+                p9,
+                p10,
+                p11,
+                p12,
+                p13,
+                p14,
+                p15,
+                p16,
+                c,
+                changed,
+                dirty
+            )
         c.endRestartGroup()?.updateScope { nc, _ ->
             this(
                 p1,
@@ -1019,51 +896,52 @@
         val c = c.startRestartGroup(key)
         trackRead(c)
         val dirty = changed1 or if (c.changed(this)) differentBits(17) else sameBits(17)
-        val result = (
-            _block as (
-                p1: Any?,
-                p2: Any?,
-                p3: Any?,
-                p4: Any?,
-                p5: Any?,
-                p6: Any?,
-                p7: Any?,
-                p8: Any?,
-                p9: Any?,
-                p10: Any?,
-                p11: Any?,
-                p12: Any?,
-                p13: Any?,
-                p14: Any?,
-                p15: Any?,
-                p16: Any?,
-                p17: Any?,
-                c: Composer,
-                changed: Int,
-                changed1: Int
-            ) -> Any?
-            )(
-            p1,
-            p2,
-            p3,
-            p4,
-            p5,
-            p6,
-            p7,
-            p8,
-            p9,
-            p10,
-            p11,
-            p12,
-            p13,
-            p14,
-            p15,
-            p16,
-            p17,
-            c,
-            changed,
-            dirty
-        )
+        val result =
+            (_block
+                as
+                (
+                    p1: Any?,
+                    p2: Any?,
+                    p3: Any?,
+                    p4: Any?,
+                    p5: Any?,
+                    p6: Any?,
+                    p7: Any?,
+                    p8: Any?,
+                    p9: Any?,
+                    p10: Any?,
+                    p11: Any?,
+                    p12: Any?,
+                    p13: Any?,
+                    p14: Any?,
+                    p15: Any?,
+                    p16: Any?,
+                    p17: Any?,
+                    c: Composer,
+                    changed: Int,
+                    changed1: Int
+                ) -> Any?)(
+                p1,
+                p2,
+                p3,
+                p4,
+                p5,
+                p6,
+                p7,
+                p8,
+                p9,
+                p10,
+                p11,
+                p12,
+                p13,
+                p14,
+                p15,
+                p16,
+                p17,
+                c,
+                changed,
+                dirty
+            )
         c.endRestartGroup()?.updateScope { nc, _ ->
             this(
                 p1,
@@ -1117,53 +995,54 @@
         val c = c.startRestartGroup(key)
         trackRead(c)
         val dirty = changed1 or if (c.changed(this)) differentBits(18) else sameBits(18)
-        val result = (
-            _block as (
-                p1: Any?,
-                p2: Any?,
-                p3: Any?,
-                p4: Any?,
-                p5: Any?,
-                p6: Any?,
-                p7: Any?,
-                p8: Any?,
-                p9: Any?,
-                p10: Any?,
-                p11: Any?,
-                p12: Any?,
-                p13: Any?,
-                p14: Any?,
-                p15: Any?,
-                p16: Any?,
-                p17: Any?,
-                p18: Any?,
-                c: Composer,
-                changed: Int,
-                changed1: Int
-            ) -> Any?
-            )(
-            p1,
-            p2,
-            p3,
-            p4,
-            p5,
-            p6,
-            p7,
-            p8,
-            p9,
-            p10,
-            p11,
-            p12,
-            p13,
-            p14,
-            p15,
-            p16,
-            p17,
-            p18,
-            c,
-            changed,
-            dirty
-        )
+        val result =
+            (_block
+                as
+                (
+                    p1: Any?,
+                    p2: Any?,
+                    p3: Any?,
+                    p4: Any?,
+                    p5: Any?,
+                    p6: Any?,
+                    p7: Any?,
+                    p8: Any?,
+                    p9: Any?,
+                    p10: Any?,
+                    p11: Any?,
+                    p12: Any?,
+                    p13: Any?,
+                    p14: Any?,
+                    p15: Any?,
+                    p16: Any?,
+                    p17: Any?,
+                    p18: Any?,
+                    c: Composer,
+                    changed: Int,
+                    changed1: Int
+                ) -> Any?)(
+                p1,
+                p2,
+                p3,
+                p4,
+                p5,
+                p6,
+                p7,
+                p8,
+                p9,
+                p10,
+                p11,
+                p12,
+                p13,
+                p14,
+                p15,
+                p16,
+                p17,
+                p18,
+                c,
+                changed,
+                dirty
+            )
         c.endRestartGroup()?.updateScope { nc, _ ->
             this(
                 p1,
@@ -1194,11 +1073,10 @@
 }
 
 internal fun RecomposeScope?.replacableWith(other: RecomposeScope) =
-    this == null || (
-        this is RecomposeScopeImpl && other is RecomposeScopeImpl && (
-            !this.valid || this == other || this.anchor == other.anchor
-            )
-        )
+    this == null ||
+        (this is RecomposeScopeImpl &&
+            other is RecomposeScopeImpl &&
+            (!this.valid || this == other || this.anchor == other.anchor))
 
 @ComposeCompilerApi
 @Stable
@@ -1211,14 +1089,7 @@
 
     operator fun invoke(p1: Any?, p2: Any?, p3: Any?, c: Composer, changed: Int): Any?
 
-    operator fun invoke(
-        p1: Any?,
-        p2: Any?,
-        p3: Any?,
-        p4: Any?,
-        c: Composer,
-        changed: Int
-    ): Any?
+    operator fun invoke(p1: Any?, p2: Any?, p3: Any?, p4: Any?, c: Composer, changed: Int): Any?
 
     operator fun invoke(
         p1: Any?,
@@ -1463,27 +1334,23 @@
 
 @Suppress("unused")
 @ComposeCompilerApi
-fun composableLambda(
-    composer: Composer,
-    key: Int,
-    tracked: Boolean,
-    block: Any
-): ComposableLambda {
+fun composableLambda(composer: Composer, key: Int, tracked: Boolean, block: Any): ComposableLambda {
     // Use a rolled version of the key to avoid the key being a duplicate of the function's
     // key. This is particularly important for live edit scenarios where the groups will be
     // invalidated by the key number. This ensures that invalidating the function will not
     // also invalidate its lambda.
     composer.startMovableGroup(key.rol(1), lambdaKey)
     val slot = composer.rememberedValue()
-    val result = if (slot === Composer.Empty) {
-        val value = ComposableLambdaImpl(key, tracked, block)
-        composer.updateRememberedValue(value)
-        value
-    } else {
-        slot as ComposableLambdaImpl
-        slot.update(block)
-        slot
-    }
+    val result =
+        if (slot === Composer.Empty) {
+            val value = ComposableLambdaImpl(key, tracked, block)
+            composer.updateRememberedValue(value)
+            value
+        } else {
+            slot as ComposableLambdaImpl
+            slot.update(block)
+            slot
+        }
     composer.endMovableGroup()
     return result
 }
@@ -1492,20 +1359,11 @@
 
 @Suppress("unused")
 @ComposeCompilerApi
-fun composableLambdaInstance(
-    key: Int,
-    tracked: Boolean,
-    block: Any
-): ComposableLambda =
+fun composableLambdaInstance(key: Int, tracked: Boolean, block: Any): ComposableLambda =
     ComposableLambdaImpl(key, tracked, block)
 
 @Suppress("unused")
 @Composable
 @ComposeCompilerApi
-fun rememberComposableLambda(
-    key: Int,
-    tracked: Boolean,
-    block: Any
-): ComposableLambda = remember { ComposableLambdaImpl(key, tracked, block) }.also {
-    it.update(block)
-}
+fun rememberComposableLambda(key: Int, tracked: Boolean, block: Any): ComposableLambda =
+    remember { ComposableLambdaImpl(key, tracked, block) }.also { it.update(block) }
diff --git a/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/internal/Decoy.kt b/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/internal/Decoy.kt
index 28add91..2f13594 100644
--- a/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/internal/Decoy.kt
+++ b/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/internal/Decoy.kt
@@ -20,23 +20,19 @@
 import androidx.compose.runtime.ExperimentalComposeApi
 
 /**
- * Used with decoys to stub the body of the decoy function.
- * Any call to this function at runtime indicates compiler error, as all calls to decoys
- * should be compiled out.
+ * Used with decoys to stub the body of the decoy function. Any call to this function at runtime
+ * indicates compiler error, as all calls to decoys should be compiled out.
  *
  * @throws IllegalStateException
  */
 @Suppress("unused")
 @ComposeCompilerApi
 fun illegalDecoyCallException(fName: String): Nothing =
-    throw IllegalStateException(
-        "Function $fName should have been replaced by compiler."
-    )
+    throw IllegalStateException("Function $fName should have been replaced by compiler.")
 
 /**
- * With decoys enabled, indicates original composable function that was stubbed by compiler
- * plugin. Provides metadata to link it with the implementation function
- * generated by compiler.
+ * With decoys enabled, indicates original composable function that was stubbed by compiler plugin.
+ * Provides metadata to link it with the implementation function generated by compiler.
  *
  * @param targetName Name of the implementation function which this composable was copied to.
  * @param signature Serialized signature of the actual composable function.
@@ -59,9 +55,8 @@
 
 /**
  * Complements [DecoyImplementation] with extra information about default values for parameters.
- * Default values are erased and not present in klib.
- * This annotation uses [bitMask] to store the information about default values in original (decoy)
- * functions.
+ * Default values are erased and not present in klib. This annotation uses [bitMask] to store the
+ * information about default values in original (decoy) functions.
  *
  * @param bitMask keeps the flags of default values presence.
  */
diff --git a/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/internal/FloatingPointEquality.kt b/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/internal/FloatingPointEquality.kt
index e1894f9..e74a028 100644
--- a/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/internal/FloatingPointEquality.kt
+++ b/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/internal/FloatingPointEquality.kt
@@ -18,10 +18,10 @@
 
 /**
  * A backwards-compatible comparison check which returns true if the receiver and the [other]
- * operands are equal to each other. Equality as specified in the IEEE-754 standard. If at least
- * one operand is `NaN`, the result will always be `false`. The sign bit is ignored for operands
- * that are zero (i.e. +0 and -0 will always be equal to one another). All other comparisons check
- * the logical value of the float.
+ * operands are equal to each other. Equality as specified in the IEEE-754 standard. If at least one
+ * operand is `NaN`, the result will always be `false`. The sign bit is ignored for operands that
+ * are zero (i.e. +0 and -0 will always be equal to one another). All other comparisons check the
+ * logical value of the float.
  *
  * This implementation is needed for proper behavior on x86 builds of Android SDK levels 21 and 22,
  * which contain a bug where [Float.NaN] is equal to every other [Float] value.
@@ -32,10 +32,10 @@
 
 /**
  * A backwards-compatible comparison check which returns true if the receiver and the [other]
- * operands are equal to each other. Equality as specified in the IEEE-754 standard. If at least
- * one operand is `NaN`, the result will always be `false`. The sign bit is ignored for operands
- * that are zero (i.e. +0 and -0 will always be equal to one another). All other comparisons check
- * the logical value of the double.
+ * operands are equal to each other. Equality as specified in the IEEE-754 standard. If at least one
+ * operand is `NaN`, the result will always be `false`. The sign bit is ignored for operands that
+ * are zero (i.e. +0 and -0 will always be equal to one another). All other comparisons check the
+ * logical value of the double.
  *
  * This implementation is needed for proper behavior on x86 builds of Android SDK levels 21 and 22,
  * which contain a bug where [Double.NaN] is equal to every other [Double] value.
diff --git a/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/internal/FunctionKeyMeta.kt b/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/internal/FunctionKeyMeta.kt
index 5056419..ef13eca 100644
--- a/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/internal/FunctionKeyMeta.kt
+++ b/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/internal/FunctionKeyMeta.kt
@@ -19,10 +19,10 @@
 import androidx.compose.runtime.ComposeCompilerApi
 
 /**
- * This annotation is applied to the FunctionKeyMeta classes created by the Compose
- * Compiler. These classes will have multiple of these annotations, each one corresponding to a
- * single composable function. The annotation holds some metadata about the function itself and is
- * intended to be used to provide information useful to tooling.
+ * This annotation is applied to the FunctionKeyMeta classes created by the Compose Compiler. These
+ * classes will have multiple of these annotations, each one corresponding to a single composable
+ * function. The annotation holds some metadata about the function itself and is intended to be used
+ * to provide information useful to tooling.
  *
  * @param key The key used for the function's group.
  * @param startOffset The startOffset of the function in the source file at the time of compilation.
@@ -32,21 +32,15 @@
 @Target(AnnotationTarget.CLASS)
 @Retention(AnnotationRetention.RUNTIME)
 @Repeatable
-annotation class FunctionKeyMeta(
-    val key: Int,
-    val startOffset: Int,
-    val endOffset: Int
-)
+annotation class FunctionKeyMeta(val key: Int, val startOffset: Int, val endOffset: Int)
 
 /**
- * This annotation is applied to the FunctionKeyMeta classes created by the Compose
- * Compiler. This is intended to be used to provide information useful to tooling.
+ * This annotation is applied to the FunctionKeyMeta classes created by the Compose Compiler. This
+ * is intended to be used to provide information useful to tooling.
  *
  * @param file The file path of the file the associated class was produced for
  */
 @ComposeCompilerApi
 @Target(AnnotationTarget.CLASS)
 @Retention(AnnotationRetention.RUNTIME)
-annotation class FunctionKeyMetaClass(
-    val file: String
-)
+annotation class FunctionKeyMetaClass(val file: String)
diff --git a/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/internal/IntRef.kt b/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/internal/IntRef.kt
index ea58692..31e2cf0 100644
--- a/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/internal/IntRef.kt
+++ b/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/internal/IntRef.kt
@@ -16,8 +16,6 @@
 
 package androidx.compose.runtime.internal
 
-internal class IntRef(
-    var element: Int = 0
-) {
+internal class IntRef(var element: Int = 0) {
     override fun toString() = "IntRef(element = $element)@${hashCode().toString(16)}"
 }
diff --git a/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/internal/LiveLiteral.kt b/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/internal/LiveLiteral.kt
index 07285b5..6066443 100644
--- a/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/internal/LiveLiteral.kt
+++ b/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/internal/LiveLiteral.kt
@@ -32,23 +32,18 @@
 @ComposeCompilerApi
 @Target(AnnotationTarget.FUNCTION)
 @Retention(AnnotationRetention.RUNTIME)
-annotation class LiveLiteralInfo(
-    val key: String,
-    val offset: Int
-)
+annotation class LiveLiteralInfo(val key: String, val offset: Int)
 
 /**
- * This annotation is applied to LiveLiteral classes by the Compose Compiler. It is intended to
- * be used to provide information useful to tooling.
+ * This annotation is applied to LiveLiteral classes by the Compose Compiler. It is intended to be
+ * used to provide information useful to tooling.
  *
  * @param file The file path of the file the associate LiveLiterals class was produced for
  */
 @ComposeCompilerApi
 @Target(AnnotationTarget.CLASS)
 @Retention(AnnotationRetention.RUNTIME)
-annotation class LiveLiteralFileInfo(
-    val file: String
-)
+annotation class LiveLiteralFileInfo(val file: String)
 
 private val liveLiteralCache = HashMap<String, MutableState<Any?>>()
 
@@ -69,8 +64,8 @@
 
 /**
  * Constructs a [State] object identified by the provided global [key] and initialized to the
- * provided [value]. This value may then be updated from tooling with the
- * [updateLiveLiteralValue] API. Only a single [State] object will be created for any given [key].
+ * provided [value]. This value may then be updated from tooling with the [updateLiveLiteralValue]
+ * API. Only a single [State] object will be created for any given [key].
  *
  * Caution: This API is intended to be used by tooling only. Use at your own risk.
  */
@@ -78,21 +73,18 @@
 @ComposeCompilerApi
 fun <T> liveLiteral(key: String, value: T): State<T> {
     @Suppress("UNCHECKED_CAST")
-    return liveLiteralCache.getOrPut(key) {
-        mutableStateOf<Any?>(value)
-    } as State<T>
+    return liveLiteralCache.getOrPut(key) { mutableStateOf<Any?>(value) } as State<T>
 }
 
-/**
- * Updates the value of a [State] object that was created by [liveLiteral] with the same key.
- */
+/** Updates the value of a [State] object that was created by [liveLiteral] with the same key. */
 @InternalComposeApi
 fun updateLiveLiteralValue(key: String, value: Any?) {
     var needToUpdate = true
-    val stateObj = liveLiteralCache.getOrPut(key) {
-        needToUpdate = false
-        mutableStateOf<Any?>(value)
-    }
+    val stateObj =
+        liveLiteralCache.getOrPut(key) {
+            needToUpdate = false
+            mutableStateOf<Any?>(value)
+        }
     if (needToUpdate) {
         stateObj.value = value
     }
diff --git a/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/internal/PersistentCompositionLocalMap.kt b/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/internal/PersistentCompositionLocalMap.kt
index c0c60e6..51ff5c9 100644
--- a/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/internal/PersistentCompositionLocalMap.kt
+++ b/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/internal/PersistentCompositionLocalMap.kt
@@ -30,7 +30,8 @@
 internal class PersistentCompositionLocalHashMap(
     node: TrieNode<CompositionLocal<Any?>, ValueHolder<Any?>>,
     size: Int
-) : PersistentHashMap<CompositionLocal<Any?>, ValueHolder<Any?>>(node, size),
+) :
+    PersistentHashMap<CompositionLocal<Any?>, ValueHolder<Any?>>(node, size),
     PersistentCompositionLocalMap {
 
     override val entries: ImmutableSet<Map.Entry<CompositionLocal<Any?>, ValueHolder<Any?>>>
@@ -43,37 +44,35 @@
         value: ValueHolder<Any?>
     ): PersistentCompositionLocalMap {
         val newNodeResult = node.put(key.hashCode(), key, value, 0) ?: return this
-        return PersistentCompositionLocalHashMap(
-            newNodeResult.node,
-            size + newNodeResult.sizeDelta
-        )
+        return PersistentCompositionLocalHashMap(newNodeResult.node, size + newNodeResult.sizeDelta)
     }
 
     override fun builder(): Builder {
         return Builder(this)
     }
 
-    class Builder(
-        internal var map: PersistentCompositionLocalHashMap
-    ) : PersistentHashMapBuilder<CompositionLocal<Any?>, ValueHolder<Any?>>(map),
+    class Builder(internal var map: PersistentCompositionLocalHashMap) :
+        PersistentHashMapBuilder<CompositionLocal<Any?>, ValueHolder<Any?>>(map),
         PersistentCompositionLocalMap.Builder {
         override fun build(): PersistentCompositionLocalHashMap {
-            map = if (node === map.node) {
-                map
-            } else {
-                ownership = MutabilityOwnership()
-                PersistentCompositionLocalHashMap(node, size)
-            }
+            map =
+                if (node === map.node) {
+                    map
+                } else {
+                    ownership = MutabilityOwnership()
+                    PersistentCompositionLocalHashMap(node, size)
+                }
             return map
         }
     }
 
     companion object {
         @Suppress("UNCHECKED_CAST")
-        val Empty = PersistentCompositionLocalHashMap(
-            node = TrieNode.EMPTY as TrieNode<CompositionLocal<Any?>, ValueHolder<Any?>>,
-            size = 0
-        )
+        val Empty =
+            PersistentCompositionLocalHashMap(
+                node = TrieNode.EMPTY as TrieNode<CompositionLocal<Any?>, ValueHolder<Any?>>,
+                size = 0
+            )
     }
 }
 
diff --git a/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/internal/SnapshotThreadLocal.kt b/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/internal/SnapshotThreadLocal.kt
index 0c383b3..f379b1c 100644
--- a/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/internal/SnapshotThreadLocal.kt
+++ b/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/internal/SnapshotThreadLocal.kt
@@ -21,8 +21,8 @@
 
 /**
  * This is similar to a [ThreadLocal] but has lower overhead because it avoids a weak reference.
- * This should only be used when the writes are delimited by a try...finally call that will clean
- * up the reference such as [androidx.compose.runtime.snapshots.Snapshot.enter] else the reference
+ * This should only be used when the writes are delimited by a try...finally call that will clean up
+ * the reference such as [androidx.compose.runtime.snapshots.Snapshot.enter] else the reference
  * could get pinned by the thread local causing a leak.
  *
  * [ThreadLocal] can be used to implement the actual for platforms that do not exhibit the same
diff --git a/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/internal/StabilityInferred.kt b/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/internal/StabilityInferred.kt
index 1fc13dd..f601793 100644
--- a/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/internal/StabilityInferred.kt
+++ b/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/internal/StabilityInferred.kt
@@ -20,13 +20,13 @@
 
 /**
  * This annotation is added on classes by the compiler when their stability is inferred. It
- * indicates that there will be a synthetic static final int `$stable` added to the class which
- * can be used by the compose compiler plugin to generate expressions to determine the stability
- * of a realized type at runtime.
+ * indicates that there will be a synthetic static final int `$stable` added to the class which can
+ * be used by the compose compiler plugin to generate expressions to determine the stability of a
+ * realized type at runtime.
  *
  * @param parameters A bitmask, with one bit per type parameter of the annotated class. A 1 bit
- * indicates that the stability of the annotated class should be calculated as a combination of
- * the stability of the class itself and the stability of that type parameter.
+ *   indicates that the stability of the annotated class should be calculated as a combination of
+ *   the stability of the class itself and the stability of that type parameter.
  */
 @ComposeCompilerApi
 @Target(AnnotationTarget.CLASS)
diff --git a/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/internal/Trace.kt b/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/internal/Trace.kt
index 6b961b4..5bfb167 100644
--- a/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/internal/Trace.kt
+++ b/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/internal/Trace.kt
@@ -18,20 +18,19 @@
 
 internal expect object Trace {
     /**
-     * Writes a trace message to indicate that a given section of code has begun.
-     * This call must be followed by a corresponding call to [endSection] on the same thread.
+     * Writes a trace message to indicate that a given section of code has begun. This call must be
+     * followed by a corresponding call to [endSection] on the same thread.
      *
-     * @return An arbitrary token which will be supplied to the corresponding call
-     * to [endSection]. May be null.
+     * @return An arbitrary token which will be supplied to the corresponding call to [endSection].
+     *   May be null.
      */
     fun beginSection(name: String): Any?
 
     /**
-     * Writes a trace message to indicate that a given section of code has ended.
-     * This call must be preceded by a corresponding call to [beginSection].
-     * Calling this method will mark the end of the most recently begun section of code, so care
-     * must be taken to ensure that `beginSection` / `endSection` pairs are properly nested and
-     * called from the same thread.
+     * Writes a trace message to indicate that a given section of code has ended. This call must be
+     * preceded by a corresponding call to [beginSection]. Calling this method will mark the end of
+     * the most recently begun section of code, so care must be taken to ensure that `beginSection`
+     * / `endSection` pairs are properly nested and called from the same thread.
      *
      * @param token The instance returned from the corresponding call to [beginSection].
      */
@@ -39,8 +38,8 @@
 }
 
 /**
- * Wrap the specified [block] in calls to [Trace.beginSection] (with the supplied [sectionName])
- * and [Trace.endSection].
+ * Wrap the specified [block] in calls to [Trace.beginSection] (with the supplied [sectionName]) and
+ * [Trace.endSection].
  */
 internal inline fun <T> trace(sectionName: String, block: () -> T): T {
     val token = Trace.beginSection(sectionName)
diff --git a/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/internal/Utils.kt b/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/internal/Utils.kt
index 2fd70c6..b324b2e 100644
--- a/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/internal/Utils.kt
+++ b/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/internal/Utils.kt
@@ -24,12 +24,13 @@
  * Returns the hash code for the given object that is unique across all currently allocated objects.
  * The hash code for the null reference is zero.
  *
- * Can be negative, and near Int.MAX_VALUE, so it can overflow if used as part of calculations.
- * For example, don't use this:
+ * Can be negative, and near Int.MAX_VALUE, so it can overflow if used as part of calculations. For
+ * example, don't use this:
  * ```
  * val comparison = identityHashCode(midVal) - identityHashCode(leftVal)
  * if (comparison < 0) ...
  * ```
+ *
  * Use this instead:
  * ```
  * if (identityHashCode(midVal) < identityHashCode(leftVal)) ...
@@ -42,9 +43,8 @@
 internal expect fun logError(message: String, e: Throwable)
 
 /**
- * Represents a platform-optimized cancellation exception.
- * This allows us to configure exceptions separately on JVM and other platforms.
+ * Represents a platform-optimized cancellation exception. This allows us to configure exceptions
+ * separately on JVM and other platforms.
  */
-internal expect abstract class PlatformOptimizedCancellationException(
-    message: String? = null
-) : CancellationException
+internal expect abstract class PlatformOptimizedCancellationException(message: String? = null) :
+    CancellationException
diff --git a/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/snapshots/AutoboxingStateValueProperty.kt b/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/snapshots/AutoboxingStateValueProperty.kt
index b81a5e5..6078b31 100644
--- a/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/snapshots/AutoboxingStateValueProperty.kt
+++ b/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/snapshots/AutoboxingStateValueProperty.kt
@@ -18,20 +18,20 @@
 
 /**
  * This annotation designates that a property on a [State] class will autobox when it is read from
- * or assigned to. This is helpful for state APIs like [IntState], which define an alternative
- * value property that does not box while maintaining compatibility with the generic
- * [`State<T>`][State] API.
+ * or assigned to. This is helpful for state APIs like [IntState], which define an alternative value
+ * property that does not box while maintaining compatibility with the generic [`State<T>`][State]
+ * API.
  *
- * Whenever a property that is annotated with `AutoboxingStateValueProperty` is accessed in code,
- * it will be flagged with a warning and will suggest using an alternative, non-boxing property
+ * Whenever a property that is annotated with `AutoboxingStateValueProperty` is accessed in code, it
+ * will be flagged with a warning and will suggest using an alternative, non-boxing property
  * instead.
  */
 @Retention(AnnotationRetention.BINARY)
 @Target(AnnotationTarget.PROPERTY_SETTER, AnnotationTarget.PROPERTY_GETTER)
 annotation class AutoboxingStateValueProperty(
     /**
-     * An alternative, non-boxing property that can be used instead of the annotated property.
-     * The property indicated in this property should contain the exact same value as the annotated
+     * An alternative, non-boxing property that can be used instead of the annotated property. The
+     * property indicated in this property should contain the exact same value as the annotated
      * property and should be observed in Compose in the same way, meaning that the designated
      * replacement property can serve as a drop-in replacement to the annotated property.
      *
diff --git a/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/snapshots/ListUtils.kt b/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/snapshots/ListUtils.kt
index 4513e97..ec54e92 100644
--- a/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/snapshots/ListUtils.kt
+++ b/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/snapshots/ListUtils.kt
@@ -20,8 +20,8 @@
 import kotlin.contracts.contract
 
 /**
- * Iterates through a [List] using the index and calls [action] for each item.
- * This does not allocate an iterator like [Iterable.forEach].
+ * Iterates through a [List] using the index and calls [action] for each item. This does not
+ * allocate an iterator like [Iterable.forEach].
  *
  * **Do not use for collections that come from public APIs**, since they may not support random
  * access in an efficient way, and this method may actually be a lot slower. Only use for
@@ -46,13 +46,12 @@
  * access in an efficient way, and this method may actually be a lot slower. Only use for
  * collections that are created by code we control and are known to support random access.
  */
-internal fun <T> List<T>.fastToSet(): Set<T> = HashSet<T>(size).also { set ->
-    fastForEach { item -> set.add(item) }
-}
+internal fun <T> List<T>.fastToSet(): Set<T> =
+    HashSet<T>(size).also { set -> fastForEach { item -> set.add(item) } }
 
 /**
- * Iterates through a [List] using the index and calls [action] for each item.
- * This does not allocate an iterator like [Iterable.forEachIndexed].
+ * Iterates through a [List] using the index and calls [action] for each item. This does not
+ * allocate an iterator like [Iterable.forEachIndexed].
  *
  * **Do not use for collections that come from public APIs**, since they may not support random
  * access in an efficient way, and this method may actually be a lot slower. Only use for
@@ -69,8 +68,8 @@
 }
 
 /**
- * Returns a list containing the results of applying the given [transform] function
- * to each element in the original collection.
+ * Returns a list containing the results of applying the given [transform] function to each element
+ * in the original collection.
  *
  * **Do not use for collections that come from public APIs**, since they may not support random
  * access in an efficient way, and this method may actually be a lot slower. Only use for
@@ -81,9 +80,7 @@
 internal inline fun <T, R> List<T>.fastMap(transform: (T) -> R): List<R> {
     contract { callsInPlace(transform) }
     val target = ArrayList<R>(size)
-    fastForEach {
-        target += transform(it)
-    }
+    fastForEach { target += transform(it) }
     return target
 }
 
@@ -91,9 +88,7 @@
 @OptIn(ExperimentalContracts::class)
 internal inline fun <T> List<T>.fastAny(predicate: (T) -> Boolean): Boolean {
     contract { callsInPlace(predicate) }
-    fastForEach {
-        if (predicate(it)) return true
-    }
+    fastForEach { if (predicate(it)) return true }
     return false
 }
 
@@ -114,9 +109,7 @@
 
 @Suppress("BanInlineOptIn") // Treat Kotlin Contracts as non-experimental.
 @OptIn(ExperimentalContracts::class)
-internal inline fun <T, K> List<T>.fastGroupBy(
-    keySelector: (T) -> K
-): Map<K, List<T>> {
+internal inline fun <T, K> List<T>.fastGroupBy(keySelector: (T) -> K): Map<K, List<T>> {
     contract { callsInPlace(keySelector) }
     val destination = HashMap<K, ArrayList<T>>(size)
     fastForEach {
@@ -126,6 +119,7 @@
     }
     return destination
 }
+
 /**
  * Creates a string from all the elements separated using [separator] and using the given [prefix]
  * and [postfix] if supplied.
@@ -151,12 +145,12 @@
 }
 
 /**
- * Appends the string from all the elements separated using [separator] and using the given
- * [prefix] and [postfix] if supplied.
+ * Appends the string from all the elements separated using [separator] and using the given [prefix]
+ * and [postfix] if supplied.
  *
- * If the collection could be huge, you can specify a non-negative value of [limit], in which
- * case only the first [limit] elements will be appended, followed by the [truncated] string
- * (which defaults to "...").
+ * If the collection could be huge, you can specify a non-negative value of [limit], in which case
+ * only the first [limit] elements will be appended, followed by the [truncated] string (which
+ * defaults to "...").
  *
  * **Do not use for collections that come from public APIs**, since they may not support random
  * access in an efficient way, and this method may actually be a lot slower. Only use for
@@ -185,9 +179,7 @@
     return buffer
 }
 
-/**
- * Copied from Appendable.kt
- */
+/** Copied from Appendable.kt */
 private fun <T> Appendable.appendElement(element: T, transform: ((T) -> CharSequence)?) {
     when {
         transform != null -> append(transform(element))
@@ -198,8 +190,8 @@
 }
 
 /**
- * Returns a list containing the results of applying the given [transform] function
- * to each element in the original collection.
+ * Returns a list containing the results of applying the given [transform] function to each element
+ * in the original collection.
  *
  * **Do not use for collections that come from public APIs**, since they may not support random
  * access in an efficient way, and this method may actually be a lot slower. Only use for
@@ -210,16 +202,15 @@
 internal inline fun <T, R> List<T>.fastMapNotNull(transform: (T) -> R?): List<R> {
     contract { callsInPlace(transform) }
     val target = ArrayList<R>(size)
-    fastForEach { e ->
-        transform(e)?.let { target += it }
-    }
+    fastForEach { e -> transform(e)?.let { target += it } }
     return target
 }
 
 /**
  * Returns a list containing only elements matching the given [predicate].
- * @param [predicate] function that takes the index of an element and the element itself
- * and returns the result of predicate evaluation on the element.
+ *
+ * @param [predicate] function that takes the index of an element and the element itself and returns
+ *   the result of predicate evaluation on the element.
  *
  * **Do not use for collections that come from public APIs**, since they may not support random
  * access in an efficient way, and this method may actually be a lot slower. Only use for
@@ -230,8 +221,6 @@
 internal inline fun <T> List<T>.fastFilterIndexed(predicate: (index: Int, T) -> Boolean): List<T> {
     contract { callsInPlace(predicate) }
     val target = ArrayList<T>(size)
-    fastForEachIndexed { index, e ->
-        if (predicate(index, e)) target += e
-    }
+    fastForEachIndexed { index, e -> if (predicate(index, e)) target += e }
     return target
 }
diff --git a/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/snapshots/Snapshot.kt b/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/snapshots/Snapshot.kt
index 8586450..f5d9bbf 100644
--- a/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/snapshots/Snapshot.kt
+++ b/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/snapshots/Snapshot.kt
@@ -39,9 +39,9 @@
 import kotlin.contracts.contract
 
 /**
- * A snapshot of the values return by mutable states and other state objects. All state object
- * will have the same value in the snapshot as they had when the snapshot was created unless they
- * are explicitly changed in the snapshot.
+ * A snapshot of the values return by mutable states and other state objects. All state object will
+ * have the same value in the snapshot as they had when the snapshot was created unless they are
+ * explicitly changed in the snapshot.
  *
  * To enter a snapshot call [enter]. The snapshot is the current snapshot as returned by
  * [currentSnapshot] until the control returns from the lambda (or until a nested [enter] is
@@ -59,9 +59,7 @@
 sealed class Snapshot(
     id: Int,
 
-    /**
-     * A set of all the snapshots that should be treated as invalid.
-     */
+    /** A set of all the snapshots that should be treated as invalid. */
     internal open var invalid: SnapshotIdSet
 ) {
     /**
@@ -84,21 +82,17 @@
      */
     abstract val root: Snapshot
 
-    /**
-     * True if any change to a state object in this snapshot will throw.
-     */
+    /** True if any change to a state object in this snapshot will throw. */
     abstract val readOnly: Boolean
 
     /**
-     * Dispose the snapshot. Neglecting to dispose a snapshot will result in difficult to
-     * diagnose memory leaks as it indirectly causes all state objects to maintain its value for
-     * the un-disposed snapshot.
+     * Dispose the snapshot. Neglecting to dispose a snapshot will result in difficult to diagnose
+     * memory leaks as it indirectly causes all state objects to maintain its value for the
+     * un-disposed snapshot.
      */
     open fun dispose() {
         disposed = true
-        sync {
-            releasePinnedSnapshotLocked()
-        }
+        sync { releasePinnedSnapshotLocked() }
     }
 
     /**
@@ -110,24 +104,24 @@
     abstract fun takeNestedSnapshot(readObserver: ((Any) -> Unit)? = null): Snapshot
 
     /**
-     * Whether there are any pending changes in this snapshot. These changes are not visible
-     * until the snapshot is applied.
+     * Whether there are any pending changes in this snapshot. These changes are not visible until
+     * the snapshot is applied.
      */
     abstract fun hasPendingChanges(): Boolean
 
     /**
      * Enter the snapshot. In [block] all state objects have the value associated with this
-     * snapshot. The value of [currentSnapshot] will be this snapshot until this [block] returns
-     * or a nested call to [enter] is called. When [block] returns, the previous current snapshot
-     * is restored if there was one.
+     * snapshot. The value of [currentSnapshot] will be this snapshot until this [block] returns or
+     * a nested call to [enter] is called. When [block] returns, the previous current snapshot is
+     * restored if there was one.
      *
-     * All changes to state objects inside [block] are isolated to this snapshot and are not
-     * visible to other snapshot or as global state. If this is a [readOnly] snapshot, any
-     * changes to state objects will throw an [IllegalStateException].
+     * All changes to state objects inside [block] are isolated to this snapshot and are not visible
+     * to other snapshot or as global state. If this is a [readOnly] snapshot, any changes to state
+     * objects will throw an [IllegalStateException].
      *
-     * For a [MutableSnapshot], changes made to a snapshot inside [block] can be applied
-     * atomically to the global state (or to its parent snapshot if it is a nested snapshot) by
-     * calling [MutableSnapshot.apply].
+     * For a [MutableSnapshot], changes made to a snapshot inside [block] can be applied atomically
+     * to the global state (or to its parent snapshot if it is a nested snapshot) by calling
+     * [MutableSnapshot.apply].
      *
      * @see androidx.compose.runtime.mutableStateOf
      * @see androidx.compose.runtime.mutableStateListOf
@@ -155,31 +149,25 @@
     }
 
     /**
-     * Enter the snapshot, returning the previous [Snapshot] for leaving this snapshot later
-     * using [unsafeLeave]. Prefer [enter] or [asContextElement] instead of using [unsafeEnter]
-     * directly to prevent mismatched [unsafeEnter]/[unsafeLeave] calls.
+     * Enter the snapshot, returning the previous [Snapshot] for leaving this snapshot later using
+     * [unsafeLeave]. Prefer [enter] or [asContextElement] instead of using [unsafeEnter] directly
+     * to prevent mismatched [unsafeEnter]/[unsafeLeave] calls.
      *
-     * After returning all state objects have the value associated with this snapshot.
-     * The value of [currentSnapshot] will be this snapshot until [unsafeLeave] is called
-     * with the returned [Snapshot] or another call to [unsafeEnter] or [enter]
-     * is made.
+     * After returning all state objects have the value associated with this snapshot. The value of
+     * [currentSnapshot] will be this snapshot until [unsafeLeave] is called with the returned
+     * [Snapshot] or another call to [unsafeEnter] or [enter] is made.
      *
-     * All changes to state objects until another snapshot is entered or this snapshot is left
-     * are isolated to this snapshot and are not visible to other snapshot or as global state.
-     * If this is a [readOnly] snapshot, any changes to state objects will throw an
-     * [IllegalStateException].
+     * All changes to state objects until another snapshot is entered or this snapshot is left are
+     * isolated to this snapshot and are not visible to other snapshot or as global state. If this
+     * is a [readOnly] snapshot, any changes to state objects will throw an [IllegalStateException].
      *
-     * For a [MutableSnapshot], changes made to a snapshot can be applied
-     * atomically to the global state (or to its parent snapshot if it is a nested snapshot) by
-     * calling [MutableSnapshot.apply].
+     * For a [MutableSnapshot], changes made to a snapshot can be applied atomically to the global
+     * state (or to its parent snapshot if it is a nested snapshot) by calling
+     * [MutableSnapshot.apply].
      */
-    @ExperimentalComposeApi
-    fun unsafeEnter(): Snapshot? = makeCurrent()
+    @ExperimentalComposeApi fun unsafeEnter(): Snapshot? = makeCurrent()
 
-    /**
-     * Leave the snapshot, restoring the [oldSnapshot] before returning.
-     * See [unsafeEnter].
-     */
+    /** Leave the snapshot, restoring the [oldSnapshot] before returning. See [unsafeEnter]. */
     @ExperimentalComposeApi
     fun unsafeLeave(oldSnapshot: Snapshot?) {
         checkPrecondition(threadSnapshot.get() === this) {
@@ -197,45 +185,35 @@
     private var pinningTrackingHandle =
         if (id != INVALID_SNAPSHOT) trackPinning(id, invalid) else -1
 
-    internal inline val isPinned get() = pinningTrackingHandle >= 0
+    internal inline val isPinned
+        get() = pinningTrackingHandle >= 0
 
     /*
      * The read observer for the snapshot if there is one.
      */
-    @PublishedApi
-    internal abstract val readObserver: ((Any) -> Unit)?
+    @PublishedApi internal abstract val readObserver: ((Any) -> Unit)?
 
-    /**
-     * The write observer for the snapshot if there is one.
-     */
+    /** The write observer for the snapshot if there is one. */
     internal abstract val writeObserver: ((Any) -> Unit)?
 
-    /**
-     * Called when a nested snapshot of this snapshot is activated
-     */
+    /** Called when a nested snapshot of this snapshot is activated */
     internal abstract fun nestedActivated(snapshot: Snapshot)
 
-    /**
-     * Called when a nested snapshot of this snapshot is deactivated
-     */
+    /** Called when a nested snapshot of this snapshot is deactivated */
     internal abstract fun nestedDeactivated(snapshot: Snapshot)
 
-    /**
-     * Record that state was modified in the snapshot.
-     */
+    /** Record that state was modified in the snapshot. */
     internal abstract fun recordModified(state: StateObject)
 
-    /**
-     * The set of state objects that have been modified in this snapshot.
-     */
+    /** The set of state objects that have been modified in this snapshot. */
     internal abstract val modified: MutableScatterSet<StateObject>?
 
     /**
      * Notify the snapshot that all objects created in this snapshot to this point should be
-     * considered initialized. If any state object is modified after this point it will
-     * appear as modified in the snapshot. Any applicable snapshot write observer will be
-     * called for the object and the object will be part of the a set of mutated objects sent to
-     * any applicable snapshot apply observer.
+     * considered initialized. If any state object is modified after this point it will appear as
+     * modified in the snapshot. Any applicable snapshot write observer will be called for the
+     * object and the object will be part of the a set of mutated objects sent to any applicable
+     * snapshot apply observer.
      *
      * Unless [notifyObjectsInitialized] is called, state objects created in a snapshot are not
      * considered modified by the snapshot even if they are modified after construction.
@@ -243,8 +221,8 @@
     internal abstract fun notifyObjectsInitialized()
 
     /**
-     * Closes the snapshot by removing the snapshot id (an any previous id's) from the list of
-     * open snapshots and unpinning snapshots that no longer are referenced by this snapshot.
+     * Closes the snapshot by removing the snapshot id (an any previous id's) from the list of open
+     * snapshots and unpinning snapshots that no longer are referenced by this snapshot.
      */
     internal fun closeAndReleasePinning() {
         sync {
@@ -254,9 +232,9 @@
     }
 
     /**
-     * Closes the snapshot by removing the snapshot id (and any previous ids) from the list of
-     * open snapshots. Does not release pinned snapshots. See [releasePinnedSnapshotsForCloseLocked]
-     * for the second half of [closeAndReleasePinning].
+     * Closes the snapshot by removing the snapshot id (and any previous ids) from the list of open
+     * snapshots. Does not release pinned snapshots. See [releasePinnedSnapshotsForCloseLocked] for
+     * the second half of [closeAndReleasePinning].
      *
      * Call while holding a `sync {}` lock.
      */
@@ -294,12 +272,12 @@
          * Return the thread's active snapshot. If no thread snapshot is active then the current
          * global snapshot is used.
          */
-        val current get() = currentSnapshot()
+        val current
+            get() = currentSnapshot()
 
-        /**
-         * Return `true` if the thread is currently in the context of a snapshot.
-         */
-        val isInSnapshot: Boolean get() = threadSnapshot.get() != null
+        /** Return `true` if the thread is currently in the context of a snapshot. */
+        val isInSnapshot: Boolean
+            get() = threadSnapshot.get() != null
 
         /**
          * Returns whether any threads are currently in the process of notifying observers about
@@ -313,8 +291,7 @@
          * allows snapshots outside the creating snapshot to access the object with its initial
          * state.
          */
-        @Suppress("ConstPropertyName")
-        const val PreexistingSnapshotId = 1
+        @Suppress("ConstPropertyName") const val PreexistingSnapshotId = 1
 
         /**
          * Take a snapshot of the current value of all state objects. The values are preserved until
@@ -336,27 +313,25 @@
          * automatically update the composition when state objects read during composition change.
          *
          * A nested snapshot can be taken of a snapshot which is an independent read-only copy of
-         * the snapshot and can be disposed independently. This is used by [takeSnapshot] when in
-         * a read-only snapshot for API consistency allowing the result of [takeSnapshot] to be
+         * the snapshot and can be disposed independently. This is used by [takeSnapshot] when in a
+         * read-only snapshot for API consistency allowing the result of [takeSnapshot] to be
          * disposed leaving the parent snapshot active.
          *
          * @param readObserver called when any state object is read in the lambda passed to
-         * [Snapshot.enter] or in the [Snapshot.enter] of any nested snapshot.
-         *
+         *   [Snapshot.enter] or in the [Snapshot.enter] of any nested snapshot.
          * @see Snapshot
          * @see Snapshot.registerApplyObserver
          */
-        fun takeSnapshot(
-            readObserver: ((Any) -> Unit)? = null
-        ): Snapshot = currentSnapshot().takeNestedSnapshot(readObserver)
+        fun takeSnapshot(readObserver: ((Any) -> Unit)? = null): Snapshot =
+            currentSnapshot().takeNestedSnapshot(readObserver)
 
         /**
-         * Take a snapshot of the current value of all state objects that also allows the state
-         * to be changed and later atomically applied when [MutableSnapshot.apply] is called. The
-         * values are preserved until [Snapshot.dispose] is called on the result. The global
-         * state will either see all the changes made as one atomic change, when [MutableSnapshot
-         * .apply] is called, or none of the changes if the mutable state object is disposed
-         * before being applied.
+         * Take a snapshot of the current value of all state objects that also allows the state to
+         * be changed and later atomically applied when [MutableSnapshot.apply] is called. The
+         * values are preserved until [Snapshot.dispose] is called on the result. The global state
+         * will either see all the changes made as one atomic change, when [MutableSnapshot .apply]
+         * is called, or none of the changes if the mutable state object is disposed before being
+         * applied.
          *
          * The values in a snapshot can be modified by calling [Snapshot.enter] and then, in its
          * lambda, modify any state object. The new values of the state objects will only become
@@ -373,10 +348,9 @@
          * A nested snapshot can be taken by calling [Snapshot.takeNestedSnapshot], for a read-only
          * snapshot, or [MutableSnapshot.takeNestedMutableSnapshot] for a snapshot that can be
          * changed. Nested mutable snapshots are applied to the this, the parent snapshot, when
-         * their [MutableSnapshot.apply] is called. Their applied changes will be visible to in
-         * this snapshot but will not be visible other snapshots (including other nested
-         * snapshots) or the global state until this snapshot is applied by calling
-         * [MutableSnapshot.apply].
+         * their [MutableSnapshot.apply] is called. Their applied changes will be visible to in this
+         * snapshot but will not be visible other snapshots (including other nested snapshots) or
+         * the global state until this snapshot is applied by calling [MutableSnapshot.apply].
          *
          * Once [MutableSnapshot.apply] is called on this, the parent snapshot, all calls to
          * [MutableSnapshot.apply] on an active nested snapshot will fail.
@@ -385,8 +359,8 @@
          * snapshots. Their changes are only visible as global state or to new snapshots once
          * [MutableSnapshot.apply] is called.
          *
-         * Applying a snapshot can fail if currently visible changes to the state object
-         * conflicts with a change made in the snapshot.
+         * Applying a snapshot can fail if currently visible changes to the state object conflicts
+         * with a change made in the snapshot.
          *
          * When in a mutable snapshot, [takeMutableSnapshot] creates a nested snapshot of the
          * current mutable snapshot. If the current snapshot is read-only, an exception is thrown.
@@ -394,21 +368,21 @@
          * calling [Snapshot.enter] which makes the [Snapshot] the current snapshot while in its
          * lambda.
          *
-         * Composition uses mutable snapshots to allow changes made in a [Composable] functions
-         * to be temporarily isolated from the global state and is later applied to the global
-         * state when the composition is applied. If [MutableSnapshot.apply] fails applying this
-         * snapshot, the snapshot and the changes calculated during composition are disposed and
-         * a new composition is scheduled to be calculated again.
+         * Composition uses mutable snapshots to allow changes made in a [Composable] functions to
+         * be temporarily isolated from the global state and is later applied to the global state
+         * when the composition is applied. If [MutableSnapshot.apply] fails applying this snapshot,
+         * the snapshot and the changes calculated during composition are disposed and a new
+         * composition is scheduled to be calculated again.
          *
          * @param readObserver called when any state object is read in the lambda passed to
-         * [Snapshot.enter] or in the [Snapshot.enter] of any nested snapshots.
+         *   [Snapshot.enter] or in the [Snapshot.enter] of any nested snapshots.
          *
          * Composition, layout and draw use [readObserver] to implicitly subscribe to changes to
          * state objects to know when to update.
          *
-         * @param writeObserver called when a state object is created or just before it is
-         * written to the first time in the snapshot or a nested mutable snapshot. This might be
-         * called several times for the same object if nested mutable snapshots are created.
+         * @param writeObserver called when a state object is created or just before it is written
+         *   to the first time in the snapshot or a nested mutable snapshot. This might be called
+         *   several times for the same object if nested mutable snapshots are created.
          *
          * Composition uses [writeObserver] to track when a state object is modified during
          * composition in order to invalidate the reads that have not yet occurred. This allows a
@@ -448,21 +422,20 @@
          * Prior to returning, any changes made to snapshot state (e.g. state holders returned by
          * [androidx.compose.runtime.mutableStateOf] are not visible to other threads. When
          * [withMutableSnapshot] returns successfully those changes will be made visible to other
-         * threads  and any snapshot observers (e.g. [androidx.compose.runtime.snapshotFlow]) will
-         * be notified of changes.
+         * threads and any snapshot observers (e.g. [androidx.compose.runtime.snapshotFlow]) will be
+         * notified of changes.
          *
          * [block] must not suspend if [withMutableSnapshot] is called from a suspend function.
          */
         // TODO: determine a good way to prevent/discourage suspending in an inlined [block]
-        inline fun <R> withMutableSnapshot(
-            block: () -> R
-        ): R = takeMutableSnapshot().run {
-            try {
-                enter(block).also { apply().check() }
-            } finally {
-                dispose()
+        inline fun <R> withMutableSnapshot(block: () -> R): R =
+            takeMutableSnapshot().run {
+                try {
+                    enter(block).also { apply().check() }
+                } finally {
+                    dispose()
+                }
             }
-        }
 
         /**
          * Observe reads and or write of state objects in the current thread.
@@ -472,11 +445,11 @@
          * previous created even if [Snapshot.enter] is called in [block].
          *
          * @param readObserver called when any state object is read.
-         * @param writeObserver called when a state object is created or just before it is
-         * written to the first time in the snapshot or a nested mutable snapshot. This might be
-         * called several times for the same object if nested mutable snapshots are created.
+         * @param writeObserver called when a state object is created or just before it is written
+         *   to the first time in the snapshot or a nested mutable snapshot. This might be called
+         *   several times for the same object if nested mutable snapshots are created.
          * @param block the code the [readObserver] and [writeObserver] will be observing. Once
-         * [block] returns, the [readObserver] and [writeObserver] will no longer be called.
+         *   [block] returns, the [readObserver] and [writeObserver] will no longer be called.
          */
         fun <T> observe(
             readObserver: ((Any) -> Unit)? = null,
@@ -495,8 +468,7 @@
                 val previousWriteObserver = previous.writeObserver
 
                 try {
-                    previous.readObserver =
-                        mergedReadObserver(readObserver, previousReadObserver)
+                    previous.readObserver = mergedReadObserver(readObserver, previousReadObserver)
                     previous.writeObserver =
                         mergedWriteObserver(writeObserver, previousWriteObserver)
                     return block()
@@ -540,7 +512,8 @@
             )
 
         @PublishedApi
-        internal val currentThreadSnapshot: Snapshot? get() = threadSnapshot.get()
+        internal val currentThreadSnapshot: Snapshot?
+            get() = threadSnapshot.get()
 
         private inline val TransparentObserverMutableSnapshot.canBeReused: Boolean
             get() = threadId == currentThreadId()
@@ -560,9 +533,10 @@
                     previous
                 }
                 else -> {
-                    val snapshot = createTransparentSnapshotWithNoParentReadObserver(
-                        previousSnapshot = previous
-                    )
+                    val snapshot =
+                        createTransparentSnapshotWithNoParentReadObserver(
+                            previousSnapshot = previous
+                        )
                     snapshot.makeCurrent()
                     snapshot
                 }
@@ -610,8 +584,8 @@
         }
 
         /**
-         * Register an apply listener that is called back when snapshots are applied to the
-         * global state.
+         * Register an apply listener that is called back when snapshots are applied to the global
+         * state.
          *
          * @return [ObserverHandle] to unregister [observer].
          */
@@ -619,26 +593,20 @@
             // Ensure observer does not see changes before this call.
             advanceGlobalSnapshot(emptyLambda)
 
-            sync {
-                applyObservers += observer
-            }
-            return ObserverHandle {
-                sync {
-                    applyObservers -= observer
-                }
-            }
+            sync { applyObservers += observer }
+            return ObserverHandle { sync { applyObservers -= observer } }
         }
 
         /**
          * Register an observer of the first write to the global state of a global state object
          * since the last call to [sendApplyNotifications].
          *
-         * Composition uses this to schedule a new composition whenever a state object that
-         * was read in composition is modified.
+         * Composition uses this to schedule a new composition whenever a state object that was read
+         * in composition is modified.
          *
          * State objects can be sent to the apply observer that have not been sent to global write
-         * observers. This happens for state objects inside [MutableSnapshot] that is later
-         * applied by calling [MutableSnapshot.apply].
+         * observers. This happens for state objects inside [MutableSnapshot] that is later applied
+         * by calling [MutableSnapshot.apply].
          *
          * This should only be used to determine if a call to [sendApplyNotifications] should be
          * scheduled to be called.
@@ -646,14 +614,10 @@
          * @return [ObserverHandle] to unregister [observer].
          */
         fun registerGlobalWriteObserver(observer: ((Any) -> Unit)): ObserverHandle {
-            sync {
-                globalWriteObservers += observer
-            }
+            sync { globalWriteObservers += observer }
             advanceGlobalSnapshot()
             return ObserverHandle {
-                sync {
-                    globalWriteObservers -= observer
-                }
+                sync { globalWriteObservers -= observer }
                 advanceGlobalSnapshot()
             }
         }
@@ -677,22 +641,18 @@
          * Send any pending apply notifications for state objects changed outside a snapshot.
          *
          * Apply notifications for state objects modified outside snapshot are deferred until method
-         * is called. This method is implicitly called whenever a non-nested [MutableSnapshot]
-         * is applied making its changes visible to all new, non-nested snapshots.
+         * is called. This method is implicitly called whenever a non-nested [MutableSnapshot] is
+         * applied making its changes visible to all new, non-nested snapshots.
          *
-         * Composition schedules this to be called after changes to state objects are
-         * detected an observer registered with [registerGlobalWriteObserver].
+         * Composition schedules this to be called after changes to state objects are detected an
+         * observer registered with [registerGlobalWriteObserver].
          */
         fun sendApplyNotifications() {
-            val changes = sync {
-                currentGlobalSnapshot.get().modified?.isNotEmpty() == true
-            }
-            if (changes)
-                advanceGlobalSnapshot()
+            val changes = sync { currentGlobalSnapshot.get().modified?.isNotEmpty() == true }
+            if (changes) advanceGlobalSnapshot()
         }
 
-        @InternalComposeApi
-        fun openSnapshotCount() = openSnapshots.toList().size
+        @InternalComposeApi fun openSnapshotCount() = openSnapshots.toList().size
 
         @PublishedApi
         internal fun removeCurrent(): Snapshot? {
@@ -711,36 +671,31 @@
 /**
  * Pin the snapshot and invalid set.
  *
- * @return returns a handle that should be passed to [releasePinningLocked] when the snapshot closes or
- * is disposed.
+ * @return returns a handle that should be passed to [releasePinningLocked] when the snapshot closes
+ *   or is disposed.
  */
 internal fun trackPinning(id: Int, invalid: SnapshotIdSet): Int {
     val pinned = invalid.lowest(id)
-    return sync {
-        pinningTable.add(pinned)
-    }
+    return sync { pinningTable.add(pinned) }
 }
 
-/**
- * Release the [handle] returned by [trackPinning]
- */
+/** Release the [handle] returned by [trackPinning] */
 internal fun releasePinningLocked(handle: Int) {
     pinningTable.remove(handle)
 }
 
 /**
- * A snapshot of the values return by mutable states and other state objects. All state object
- * will have the same value in the snapshot as they had when the snapshot was created unless they
- * are explicitly changed in the snapshot.
-
- * To enter a snapshot call [enter]. The snapshot is the current snapshot as returned by
- * [currentSnapshot] until the control returns from the lambda (or until a nested [enter] is
- * called. All state objects will return the values associated with this snapshot, locally in the
- * thread, until [enter] returns. All other threads are unaffected.
+ * A snapshot of the values return by mutable states and other state objects. All state object will
+ * have the same value in the snapshot as they had when the snapshot was created unless they are
+ * explicitly changed in the snapshot.
  *
- * All changes made in a [MutableSnapshot] are snapshot isolated from all other snapshots and
- * their changes can only be seen globally, or by new shots, after [MutableSnapshot.apply] as been
- * called.
+ * To enter a snapshot call [enter]. The snapshot is the current snapshot as returned by
+ * [currentSnapshot] until the control returns from the lambda (or until a nested [enter] is called.
+ * All state objects will return the values associated with this snapshot, locally in the thread,
+ * until [enter] returns. All other threads are unaffected.
+ *
+ * All changes made in a [MutableSnapshot] are snapshot isolated from all other snapshots and their
+ * changes can only be seen globally, or by new shots, after [MutableSnapshot.apply] as been called.
  *
  * Snapshots can be nested by calling [takeNestedSnapshot] or
  * [MutableSnapshot.takeNestedMutableSnapshot].
@@ -750,15 +705,16 @@
  * @see androidx.compose.runtime.mutableStateListOf
  * @see androidx.compose.runtime.mutableStateMapOf
  */
-open class MutableSnapshot internal constructor(
+open class MutableSnapshot
+internal constructor(
     id: Int,
     invalid: SnapshotIdSet,
     override val readObserver: ((Any) -> Unit)?,
     override val writeObserver: ((Any) -> Unit)?
 ) : Snapshot(id, invalid) {
     /**
-     * Whether there are any pending changes in this snapshot. These changes are not visible
-     * until the snapshot is applied.
+     * Whether there are any pending changes in this snapshot. These changes are not visible until
+     * the snapshot is applied.
      */
     override fun hasPendingChanges(): Boolean = modified?.isNotEmpty() == true
 
@@ -806,30 +762,34 @@
      * global state of the state object or to the parent snapshot.
      *
      * While a snapshot is active (after it is created but before [apply] or [dispose] is called)
-     * requires resources to track the values in the snapshot. Once a snapshot is no longer
-     * needed it should be either applied by calling [apply] or disposed by calling [dispose]. A
-     * snapshot that has been had is [apply] called can also have [dispose] called on it. However,
-     * calling [apply] after calling [dispose] will throw an exception.
+     * requires resources to track the values in the snapshot. Once a snapshot is no longer needed
+     * it should be either applied by calling [apply] or disposed by calling [dispose]. A snapshot
+     * that has been had is [apply] called can also have [dispose] called on it. However, calling
+     * [apply] after calling [dispose] will throw an exception.
      *
-     * Leaving a snapshot active could cause hard to diagnose memory leaks values are maintained
-     * by state objects for unneeded snapshots. Take care to always call [dispose] on any snapshot.
+     * Leaving a snapshot active could cause hard to diagnose memory leaks values are maintained by
+     * state objects for unneeded snapshots. Take care to always call [dispose] on any snapshot.
      */
     open fun apply(): SnapshotApplyResult {
         // NOTE: the this algorithm is currently does not guarantee serializable snapshots as it
         // doesn't prevent crossing writes as described here https://arxiv.org/pdf/1412.2324.pdf
 
         // Just removing the snapshot from the active snapshot set is enough to make it part of the
-        // next snapshot, however, this should only be done after first determining that there are no
+        // next snapshot, however, this should only be done after first determining that there are
+        // no
         // colliding writes are being applied.
 
         // A write is considered colliding if any write occurred in a state object in a snapshot
         // applied since the snapshot was taken.
         val modified = modified
-        val optimisticMerges = if (modified != null) optimisticMerges(
-            currentGlobalSnapshot.get(),
-            this,
-            openSnapshots.clear(currentGlobalSnapshot.get().id)
-        ) else null
+        val optimisticMerges =
+            if (modified != null)
+                optimisticMerges(
+                    currentGlobalSnapshot.get(),
+                    this,
+                    openSnapshots.clear(currentGlobalSnapshot.get().id)
+                )
+            else null
 
         var observers = emptyList<(Set<Any>, Snapshot) -> Unit>()
         var globalModified: MutableScatterSet<StateObject>? = null
@@ -846,11 +806,12 @@
                 }
             } else {
                 val previousGlobalSnapshot = currentGlobalSnapshot.get()
-                val result = innerApplyLocked(
-                    nextSnapshotId,
-                    optimisticMerges,
-                    openSnapshots.clear(previousGlobalSnapshot.id)
-                )
+                val result =
+                    innerApplyLocked(
+                        nextSnapshotId,
+                        optimisticMerges,
+                        openSnapshots.clear(previousGlobalSnapshot.id)
+                    )
                 if (result != SnapshotApplyResult.Success) return result
 
                 closeLocked()
@@ -873,17 +834,13 @@
         if (globalModified != null) {
             val nonNullGlobalModified = globalModified!!.wrapIntoSet()
             if (nonNullGlobalModified.isNotEmpty()) {
-                observers.fastForEach {
-                    it(nonNullGlobalModified, this)
-                }
+                observers.fastForEach { it(nonNullGlobalModified, this) }
             }
         }
 
         if (modified != null && modified.isNotEmpty()) {
             val modifiedSet = modified.wrapIntoSet()
-            observers.fastForEach {
-                it(modifiedSet, this)
-            }
+            observers.fastForEach { it(modifiedSet, this) }
         }
 
         // Wait to release pinned snapshots until after running observers.
@@ -901,9 +858,11 @@
         return SnapshotApplyResult.Success
     }
 
-    override val readOnly: Boolean get() = false
+    override val readOnly: Boolean
+        get() = false
 
-    override val root: Snapshot get() = this
+    override val root: Snapshot
+        get() = this
 
     override fun dispose() {
         if (!disposed) {
@@ -930,7 +889,9 @@
         }
     }
 
-    override fun nestedActivated(snapshot: Snapshot) { snapshots++ }
+    override fun nestedActivated(snapshot: Snapshot) {
+        snapshots++
+    }
 
     override fun nestedDeactivated(snapshot: Snapshot) {
         requirePrecondition(snapshots > 0) { "no pending nested snapshots" }
@@ -957,9 +918,7 @@
     }
 
     private fun validateNotApplied() {
-        checkPrecondition(!applied) {
-            "Unsupported operation on a snapshot that has been applied"
-        }
+        checkPrecondition(!applied) { "Unsupported operation on a snapshot that has been applied" }
     }
 
     private fun validateNotAppliedOrPinned() {
@@ -969,8 +928,8 @@
     }
 
     /**
-     * Abandon the snapshot. This does NOT [closeAndReleasePinning], which must be done
-     * as an additional step by callers.
+     * Abandon the snapshot. This does NOT [closeAndReleasePinning], which must be done as an
+     * additional step by callers.
      */
     private fun abandon() {
         val modified = modified
@@ -1033,9 +992,9 @@
             }
             if (current != previous) {
                 val applied = readable(first, id, this.invalid) ?: readError()
-                val merged = optimisticMerges?.get(current) ?: run {
-                    state.mergeRecords(previous, current, applied)
-                }
+                val merged =
+                    optimisticMerges?.get(current)
+                        ?: run { state.mergeRecords(previous, current, applied) }
                 when (merged) {
                     null -> return SnapshotApplyResult.Failure(this)
                     applied -> {
@@ -1043,28 +1002,26 @@
                         // obscure the current value so ignore the conflict
                     }
                     current -> {
-                        (
-                            mergedRecords ?: mutableListOf<Pair<StateObject, StateRecord>>().also {
-                                mergedRecords = it
-                            }
-                        ).add(state to current.create())
+                        (mergedRecords
+                                ?: mutableListOf<Pair<StateObject, StateRecord>>().also {
+                                    mergedRecords = it
+                                })
+                            .add(state to current.create())
 
                         // If we revert to current then the state is no longer modified.
-                        (
-                            statesToRemove ?: mutableListOf<StateObject>().also {
-                                statesToRemove = it
-                            }
-                        ).add(state)
+                        (statesToRemove
+                                ?: mutableListOf<StateObject>().also { statesToRemove = it })
+                            .add(state)
                     }
                     else -> {
-                        (
-                            mergedRecords ?: mutableListOf<Pair<StateObject, StateRecord>>().also {
-                                mergedRecords = it
-                            }
-                        ).add(
-                            if (merged != previous) state to merged
-                            else state to previous.create()
-                        )
+                        (mergedRecords
+                                ?: mutableListOf<Pair<StateObject, StateRecord>>().also {
+                                    mergedRecords = it
+                                })
+                            .add(
+                                if (merged != previous) state to merged
+                                else state to previous.create()
+                            )
                     }
                 }
             }
@@ -1112,17 +1069,14 @@
         }
     }
 
-    internal fun advance(): Unit = advance { }
+    internal fun advance(): Unit = advance {}
 
     internal fun recordPrevious(id: Int) {
-        sync {
-            previousIds = previousIds.set(id)
-        }
+        sync { previousIds = previousIds.set(id) }
     }
 
     internal fun recordPreviousPinnedSnapshot(id: Int) {
-        if (id >= 0)
-            previousPinnedSnapshots += id
+        if (id >= 0) previousPinnedSnapshots += id
     }
 
     internal fun recordPreviousPinnedSnapshots(handles: IntArray) {
@@ -1139,9 +1093,7 @@
     }
 
     internal fun recordPreviousList(snapshots: SnapshotIdSet) {
-        sync {
-            previousIds = previousIds.or(snapshots)
-        }
+        sync { previousIds = previousIds.or(snapshots) }
     }
 
     override fun recordModified(state: StateObject) {
@@ -1155,25 +1107,21 @@
     internal var merged: List<StateObject>? = null
 
     /**
-     * A set of the id's previously associated with this snapshot. When this snapshot closes
-     * then these ids must be removed from the global as well.
+     * A set of the id's previously associated with this snapshot. When this snapshot closes then
+     * these ids must be removed from the global as well.
      */
     internal var previousIds: SnapshotIdSet = SnapshotIdSet.EMPTY
 
-    /**
-     * A list of the pinned snapshots handles that must be released by this snapshot
-     */
+    /** A list of the pinned snapshots handles that must be released by this snapshot */
     internal var previousPinnedSnapshots: IntArray = EmptyIntArray
 
     /**
-     * The number of pending nested snapshots of this snapshot. To simplify the code, this
-     * snapshot it, itself, counted as its own nested snapshot.
+     * The number of pending nested snapshots of this snapshot. To simplify the code, this snapshot
+     * it, itself, counted as its own nested snapshot.
      */
     private var snapshots = 1
 
-    /**
-     * Tracks whether the snapshot has been applied.
-     */
+    /** Tracks whether the snapshot has been applied. */
     internal var applied = false
 
     private companion object {
@@ -1183,31 +1131,30 @@
 
 /**
  * The result of a applying a mutable snapshot. [Success] indicates that the snapshot was
- * successfully applied and is now visible as the global state of the state object (or visible
- * in the parent snapshot for a nested snapshot). [Failure] indicates one or more state objects
- * were modified by both this snapshot and in the global (or parent) snapshot, and the changes from
- * this snapshot are **not** visible in the global or parent snapshot.
+ * successfully applied and is now visible as the global state of the state object (or visible in
+ * the parent snapshot for a nested snapshot). [Failure] indicates one or more state objects were
+ * modified by both this snapshot and in the global (or parent) snapshot, and the changes from this
+ * snapshot are **not** visible in the global or parent snapshot.
  */
 sealed class SnapshotApplyResult {
     /**
-     * Check the result of an apply. If the result is [Success] then this does does nothing. If
-     * the result is [Failure] then a [SnapshotApplyConflictException] exception is thrown. Once
-     * [check] as been called the snapshot is disposed.
+     * Check the result of an apply. If the result is [Success] then this does does nothing. If the
+     * result is [Failure] then a [SnapshotApplyConflictException] exception is thrown. Once [check]
+     * as been called the snapshot is disposed.
      */
     abstract fun check()
 
-    /**
-     * True if the result is [Success].
-     */
+    /** True if the result is [Success]. */
     abstract val succeeded: Boolean
 
     object Success : SnapshotApplyResult() {
         /**
          * Check the result of a snapshot apply. Calling [check] on a [Success] result is a noop.
          */
-        override fun check() { }
+        override fun check() {}
 
-        override val succeeded: Boolean get() = true
+        override val succeeded: Boolean
+            get() = true
     }
 
     class Failure(val snapshot: Snapshot) : SnapshotApplyResult() {
@@ -1220,7 +1167,8 @@
             throw SnapshotApplyConflictException(snapshot)
         }
 
-        override val succeeded: Boolean get() = false
+        override val succeeded: Boolean
+            get() = false
     }
 }
 
@@ -1230,9 +1178,7 @@
  */
 @Suppress("CallbackName")
 fun interface ObserverHandle {
-    /**
-     * Dispose the observer causing it to be unregistered from the snapshot system.
-     */
+    /** Dispose the observer causing it to be unregistered from the snapshot system. */
     fun dispose()
 }
 
@@ -1240,50 +1186,39 @@
  * Return the thread's active snapshot. If no thread snapshot is active then the current global
  * snapshot is used.
  */
-internal fun currentSnapshot(): Snapshot =
-    threadSnapshot.get() ?: currentGlobalSnapshot.get()
+internal fun currentSnapshot(): Snapshot = threadSnapshot.get() ?: currentGlobalSnapshot.get()
 
 /**
  * An exception that is thrown when [SnapshotApplyResult.check] is called on a result of a
  * [MutableSnapshot.apply] that fails to apply.
  */
-class SnapshotApplyConflictException(
-    @Suppress("unused") val snapshot: Snapshot
-) : Exception()
+class SnapshotApplyConflictException(@Suppress("unused") val snapshot: Snapshot) : Exception()
 
-/**
- * Snapshot local value of a state object.
- */
+/** Snapshot local value of a state object. */
 abstract class StateRecord {
-    /**
-     * The snapshot id of the snapshot in which the record was created.
-     */
+    /** The snapshot id of the snapshot in which the record was created. */
     internal var snapshotId: Int = currentSnapshot().id
 
     /**
      * Reference of the next state record. State records are stored in a linked list.
      *
      * Changes to [next] must preserve all existing records to all threads even during
-     * intermediately changes. For example, it is safe to add the beginning or end of the list
-     * but adding to the middle requires care. First the new record must have its [next] updated
-     * then the [next] of its new predecessor can then be set to point to it. This implies that
-     * records that are already in the list cannot be moved in the list as this the change must
-     * be atomic to all threads that cannot happen without a lock which this list cannot afford.
+     * intermediately changes. For example, it is safe to add the beginning or end of the list but
+     * adding to the middle requires care. First the new record must have its [next] updated then
+     * the [next] of its new predecessor can then be set to point to it. This implies that records
+     * that are already in the list cannot be moved in the list as this the change must be atomic to
+     * all threads that cannot happen without a lock which this list cannot afford.
      *
-     * It is unsafe to remove a record as it might be in the process of being reused (see [usedLocked]).
-     * If a record is removed care must be taken to ensure that it is not being claimed by some
-     * other thread. This would require changes to [usedLocked].
+     * It is unsafe to remove a record as it might be in the process of being reused (see
+     * [usedLocked]). If a record is removed care must be taken to ensure that it is not being
+     * claimed by some other thread. This would require changes to [usedLocked].
      */
     internal var next: StateRecord? = null
 
-    /**
-     * Copy the value into this state record from another for the same state object.
-     */
+    /** Copy the value into this state record from another for the same state object. */
     abstract fun assign(value: StateRecord)
 
-    /**
-     * Create a new state record for the same state object.
-     */
+    /** Create a new state record for the same state object. */
     abstract fun create(): StateRecord
 }
 
@@ -1293,9 +1228,7 @@
  */
 @JvmDefaultWithCompatibility
 interface StateObject {
-    /**
-     * The first state record in a linked list of state records.
-     */
+    /** The first state record in a linked list of state records. */
     val firstStateRecord: StateRecord
 
     /**
@@ -1307,24 +1240,19 @@
     /**
      * Produce a merged state based on the conflicting state changes.
      *
-     * This method must not modify any of the records received and should treat the state records
-     * as immutable, even the [applied] record.
+     * This method must not modify any of the records received and should treat the state records as
+     * immutable, even the [applied] record.
      *
      * @param previous the state record that was used to create the [applied] record and is a state
-     * that also (though indirectly) produced the [current] record.
-     *
+     *   that also (though indirectly) produced the [current] record.
      * @param current the state record of the parent snapshot or global state.
-     *
-     * @param applied the state record that is being applied of the parent snapshot or global
-     * state.
-     *
-     * @return the modified state or `null` if the values cannot be merged. If the states cannot
-     * be merged the current apply will fail. Any of the parameters can be returned as a result.
-     * If it is not one of the parameter values then it *must* be a new value that is created by
-     * calling [StateRecord.create] on one of the records passed and then can be modified
-     * to have the merged value before being returned. If a new record is returned
-     * [MutableSnapshot.apply] will update the internal snapshot id and call
-     * [prependStateRecord] if the record is used.
+     * @param applied the state record that is being applied of the parent snapshot or global state.
+     * @return the modified state or `null` if the values cannot be merged. If the states cannot be
+     *   merged the current apply will fail. Any of the parameters can be returned as a result. If
+     *   it is not one of the parameter values then it *must* be a new value that is created by
+     *   calling [StateRecord.create] on one of the records passed and then can be modified to have
+     *   the merged value before being returned. If a new record is returned [MutableSnapshot.apply]
+     *   will update the internal snapshot id and call [prependStateRecord] if the record is used.
      */
     fun mergeRecords(
         previous: StateRecord,
@@ -1337,25 +1265,28 @@
  * A snapshot whose state objects cannot be modified. If a state object is modified when in a
  * read-only snapshot a [IllegalStateException] is thrown.
  */
-internal class ReadonlySnapshot internal constructor(
-    id: Int,
-    invalid: SnapshotIdSet,
-    override val readObserver: ((Any) -> Unit)?
-) : Snapshot(id, invalid) {
+internal class ReadonlySnapshot
+internal constructor(id: Int, invalid: SnapshotIdSet, override val readObserver: ((Any) -> Unit)?) :
+    Snapshot(id, invalid) {
     /**
      * The number of nested snapshots that are active. To simplify the code, this snapshot counts
      * itself as a nested snapshot.
      */
     private var snapshots = 1
-    override val readOnly: Boolean get() = true
-    override val root: Snapshot get() = this
+    override val readOnly: Boolean
+        get() = true
+
+    override val root: Snapshot
+        get() = this
+
     override fun hasPendingChanges(): Boolean = false
-    override val writeObserver: ((Any) -> Unit)? get() = null
+
+    override val writeObserver: ((Any) -> Unit)?
+        get() = null
 
     override var modified: MutableScatterSet<StateObject>?
         get() = null
-        @Suppress("UNUSED_PARAMETER")
-        set(value) = unsupported()
+        @Suppress("UNUSED_PARAMETER") set(value) = unsupported()
 
     override fun takeNestedSnapshot(readObserver: ((Any) -> Unit)?): Snapshot {
         validateOpen(this)
@@ -1378,7 +1309,9 @@
         }
     }
 
-    override fun nestedActivated(snapshot: Snapshot) { snapshots++ }
+    override fun nestedActivated(snapshot: Snapshot) {
+        snapshots++
+    }
 
     override fun nestedDeactivated(snapshot: Snapshot) {
         if (--snapshots == 0) {
@@ -1398,9 +1331,16 @@
     override val readObserver: ((Any) -> Unit)?,
     val parent: Snapshot
 ) : Snapshot(id, invalid) {
-    init { parent.nestedActivated(this) }
-    override val readOnly get() = true
-    override val root: Snapshot get() = parent.root
+    init {
+        parent.nestedActivated(this)
+    }
+
+    override val readOnly
+        get() = true
+
+    override val root: Snapshot
+        get() = parent.root
+
     override fun takeNestedSnapshot(readObserver: ((Any) -> Unit)?) =
         NestedReadonlySnapshot(
             id = id,
@@ -1412,6 +1352,7 @@
     override fun notifyObjectsInitialized() {
         // Nothing to do for read-only snapshots
     }
+
     override fun hasPendingChanges(): Boolean = false
 
     override fun dispose() {
@@ -1424,27 +1365,32 @@
         }
     }
 
-    override val modified: MutableScatterSet<StateObject>? get() = null
-    override val writeObserver: ((Any) -> Unit)? get() = null
+    override val modified: MutableScatterSet<StateObject>?
+        get() = null
+
+    override val writeObserver: ((Any) -> Unit)?
+        get() = null
+
     override fun recordModified(state: StateObject) = reportReadonlySnapshotWrite()
 
     override fun nestedDeactivated(snapshot: Snapshot) = unsupported()
+
     override fun nestedActivated(snapshot: Snapshot) = unsupported()
 }
 
-private val emptyLambda: (invalid: SnapshotIdSet) -> Unit = { }
+private val emptyLambda: (invalid: SnapshotIdSet) -> Unit = {}
 
 /**
  * A snapshot object that simplifies the code by treating the global state as a mutable snapshot.
  */
 internal class GlobalSnapshot(id: Int, invalid: SnapshotIdSet) :
     MutableSnapshot(
-        id, invalid, null,
+        id,
+        invalid,
+        null,
         sync {
             globalWriteObservers.let {
-                it.singleOrNull() ?: { state: Any ->
-                    it.fastForEach { it(state) }
-                }
+                it.singleOrNull() ?: { state: Any -> it.fastForEach { it(state) } }
             }
         }
     ) {
@@ -1481,20 +1427,18 @@
     }
 
     override fun nestedDeactivated(snapshot: Snapshot) = unsupported()
+
     override fun nestedActivated(snapshot: Snapshot) = unsupported()
+
     override fun apply(): SnapshotApplyResult =
         error("Cannot apply the global snapshot directly. Call Snapshot.advanceGlobalSnapshot")
 
     override fun dispose() {
-        sync {
-            releasePinnedSnapshotLocked()
-        }
+        sync { releasePinnedSnapshotLocked() }
     }
 }
 
-/**
- * A nested mutable snapshot created by [MutableSnapshot.takeNestedMutableSnapshot].
- */
+/** A nested mutable snapshot created by [MutableSnapshot.takeNestedMutableSnapshot]. */
 internal class NestedMutableSnapshot(
     id: Int,
     invalid: SnapshotIdSet,
@@ -1504,9 +1448,12 @@
 ) : MutableSnapshot(id, invalid, readObserver, writeObserver) {
     private var deactivated = false
 
-    init { parent.nestedActivated(this) }
+    init {
+        parent.nestedActivated(this)
+    }
 
-    override val root: Snapshot get() = parent.root
+    override val root: Snapshot
+        get() = parent.root
 
     override fun dispose() {
         if (!disposed) {
@@ -1527,9 +1474,8 @@
 
         val modified = modified
         val id = id
-        val optimisticMerges = if (modified != null)
-            optimisticMerges(parent, this, parent.invalid)
-        else null
+        val optimisticMerges =
+            if (modified != null) optimisticMerges(parent, this, parent.invalid) else null
         sync {
             validateOpen(this)
             if (modified == null || modified.size == 0) {
@@ -1574,28 +1520,27 @@
     }
 }
 
-/**
- * A pseudo snapshot that doesn't introduce isolation but does introduce observers.
- */
+/** A pseudo snapshot that doesn't introduce isolation but does introduce observers. */
 internal class TransparentObserverMutableSnapshot(
     private val parentSnapshot: MutableSnapshot?,
     specifiedReadObserver: ((Any) -> Unit)?,
     specifiedWriteObserver: ((Any) -> Unit)?,
     private val mergeParentObservers: Boolean,
     private val ownsParentSnapshot: Boolean
-) : MutableSnapshot(
-    INVALID_SNAPSHOT,
-    SnapshotIdSet.EMPTY,
-    mergedReadObserver(
-        specifiedReadObserver,
-        parentSnapshot?.readObserver ?: currentGlobalSnapshot.get().readObserver,
-        mergeParentObservers
-    ),
-    mergedWriteObserver(
-        specifiedWriteObserver,
-        parentSnapshot?.writeObserver ?: currentGlobalSnapshot.get().writeObserver
-    )
-) {
+) :
+    MutableSnapshot(
+        INVALID_SNAPSHOT,
+        SnapshotIdSet.EMPTY,
+        mergedReadObserver(
+            specifiedReadObserver,
+            parentSnapshot?.readObserver ?: currentGlobalSnapshot.get().readObserver,
+            mergeParentObservers
+        ),
+        mergedWriteObserver(
+            specifiedWriteObserver,
+            parentSnapshot?.writeObserver ?: currentGlobalSnapshot.get().writeObserver
+        )
+    ) {
     override var readObserver: ((Any) -> Unit)? = super.readObserver
     override var writeObserver: ((Any) -> Unit)? = super.writeObserver
 
@@ -1615,18 +1560,19 @@
     override var id: Int
         get() = currentSnapshot.id
         @Suppress("UNUSED_PARAMETER")
-        set(value) { unsupported() }
+        set(value) {
+            unsupported()
+        }
 
-    override var invalid get() = currentSnapshot.invalid
-        @Suppress("UNUSED_PARAMETER")
-        set(value) = unsupported()
+    override var invalid
+        get() = currentSnapshot.invalid
+        @Suppress("UNUSED_PARAMETER") set(value) = unsupported()
 
     override fun hasPendingChanges(): Boolean = currentSnapshot.hasPendingChanges()
 
     override var modified: MutableScatterSet<StateObject>?
         get() = currentSnapshot.modified
-        @Suppress("UNUSED_PARAMETER")
-        set(value) = unsupported()
+        @Suppress("UNUSED_PARAMETER") set(value) = unsupported()
 
     override var writeCount: Int
         get() = currentSnapshot.writeCount
@@ -1637,11 +1583,9 @@
     override val readOnly: Boolean
         get() = currentSnapshot.readOnly
 
-    override fun apply(): SnapshotApplyResult =
-        currentSnapshot.apply()
+    override fun apply(): SnapshotApplyResult = currentSnapshot.apply()
 
-    override fun recordModified(state: StateObject) =
-        currentSnapshot.recordModified(state)
+    override fun recordModified(state: StateObject) = currentSnapshot.recordModified(state)
 
     override fun takeNestedSnapshot(readObserver: ((Any) -> Unit)?): Snapshot {
         val mergedReadObserver = mergedReadObserver(readObserver, this.readObserver)
@@ -1663,10 +1607,11 @@
         val mergedReadObserver = mergedReadObserver(readObserver, this.readObserver)
         val mergedWriteObserver = mergedWriteObserver(writeObserver, this.writeObserver)
         return if (!mergeParentObservers) {
-            val nestedSnapshot = currentSnapshot.takeNestedMutableSnapshot(
-                readObserver = null,
-                writeObserver = mergedWriteObserver
-            )
+            val nestedSnapshot =
+                currentSnapshot.takeNestedMutableSnapshot(
+                    readObserver = null,
+                    writeObserver = mergedWriteObserver
+                )
             TransparentObserverMutableSnapshot(
                 parentSnapshot = nestedSnapshot,
                 specifiedReadObserver = mergedReadObserver,
@@ -1675,10 +1620,7 @@
                 ownsParentSnapshot = true
             )
         } else {
-            currentSnapshot.takeNestedMutableSnapshot(
-                mergedReadObserver,
-                mergedWriteObserver
-            )
+            currentSnapshot.takeNestedMutableSnapshot(mergedReadObserver, mergedWriteObserver)
         }
     }
 
@@ -1690,23 +1632,23 @@
     override fun nestedDeactivated(snapshot: Snapshot) = unsupported()
 }
 
-/**
- * A pseudo snapshot that doesn't introduce isolation but does introduce observers.
- */
+/** A pseudo snapshot that doesn't introduce isolation but does introduce observers. */
 internal class TransparentObserverSnapshot(
     private val previousSnapshot: Snapshot?,
     specifiedReadObserver: ((Any) -> Unit)?,
     private val mergeParentObservers: Boolean,
     private val ownsPreviousSnapshot: Boolean
-) : Snapshot(
-    INVALID_SNAPSHOT,
-    SnapshotIdSet.EMPTY,
-) {
-    override var readObserver: ((Any) -> Unit)? = mergedReadObserver(
-        specifiedReadObserver,
-        previousSnapshot?.readObserver ?: currentGlobalSnapshot.get().readObserver,
-        mergeParentObservers
-    )
+) :
+    Snapshot(
+        INVALID_SNAPSHOT,
+        SnapshotIdSet.EMPTY,
+    ) {
+    override var readObserver: ((Any) -> Unit)? =
+        mergedReadObserver(
+            specifiedReadObserver,
+            previousSnapshot?.readObserver ?: currentGlobalSnapshot.get().readObserver,
+            mergeParentObservers
+        )
     override val writeObserver: ((Any) -> Unit)? = null
 
     internal val threadId: Long = currentThreadId()
@@ -1727,24 +1669,24 @@
     override var id: Int
         get() = currentSnapshot.id
         @Suppress("UNUSED_PARAMETER")
-        set(value) { unsupported() }
+        set(value) {
+            unsupported()
+        }
 
-    override var invalid get() = currentSnapshot.invalid
-        @Suppress("UNUSED_PARAMETER")
-        set(value) = unsupported()
+    override var invalid
+        get() = currentSnapshot.invalid
+        @Suppress("UNUSED_PARAMETER") set(value) = unsupported()
 
     override fun hasPendingChanges(): Boolean = currentSnapshot.hasPendingChanges()
 
     override var modified: MutableScatterSet<StateObject>?
         get() = currentSnapshot.modified
-        @Suppress("UNUSED_PARAMETER")
-        set(value) = unsupported()
+        @Suppress("UNUSED_PARAMETER") set(value) = unsupported()
 
     override val readOnly: Boolean
         get() = currentSnapshot.readOnly
 
-    override fun recordModified(state: StateObject) =
-        currentSnapshot.recordModified(state)
+    override fun recordModified(state: StateObject) = currentSnapshot.recordModified(state)
 
     override fun takeNestedSnapshot(readObserver: ((Any) -> Unit)?): Snapshot {
         val mergedReadObserver = mergedReadObserver(readObserver, this.readObserver)
@@ -1771,30 +1713,30 @@
     previousSnapshot: Snapshot?,
     readObserver: ((Any) -> Unit)? = null,
     ownsPreviousSnapshot: Boolean = false
-): Snapshot = if (previousSnapshot is MutableSnapshot || previousSnapshot == null) {
-    TransparentObserverMutableSnapshot(
-        parentSnapshot = previousSnapshot as? MutableSnapshot,
-        specifiedReadObserver = readObserver,
-        specifiedWriteObserver = null,
-        mergeParentObservers = false,
-        ownsParentSnapshot = ownsPreviousSnapshot
-    )
-} else {
-    TransparentObserverSnapshot(
-        previousSnapshot = previousSnapshot,
-        specifiedReadObserver = readObserver,
-        mergeParentObservers = false,
-        ownsPreviousSnapshot = ownsPreviousSnapshot
-    )
-}
+): Snapshot =
+    if (previousSnapshot is MutableSnapshot || previousSnapshot == null) {
+        TransparentObserverMutableSnapshot(
+            parentSnapshot = previousSnapshot as? MutableSnapshot,
+            specifiedReadObserver = readObserver,
+            specifiedWriteObserver = null,
+            mergeParentObservers = false,
+            ownsParentSnapshot = ownsPreviousSnapshot
+        )
+    } else {
+        TransparentObserverSnapshot(
+            previousSnapshot = previousSnapshot,
+            specifiedReadObserver = readObserver,
+            mergeParentObservers = false,
+            ownsPreviousSnapshot = ownsPreviousSnapshot
+        )
+    }
 
 private fun mergedReadObserver(
     readObserver: ((Any) -> Unit)?,
     parentObserver: ((Any) -> Unit)?,
     mergeReadObserver: Boolean = true
 ): ((Any) -> Unit)? {
-    @Suppress("NAME_SHADOWING")
-    val parentObserver = if (mergeReadObserver) parentObserver else null
+    @Suppress("NAME_SHADOWING") val parentObserver = if (mergeReadObserver) parentObserver else null
     return if (readObserver != null && parentObserver != null && readObserver !== parentObserver) {
         { state: Any ->
             readObserver(state)
@@ -1826,20 +1768,16 @@
  */
 private const val INVALID_SNAPSHOT = 0
 
-/**
- * Current thread snapshot
- */
+/** Current thread snapshot */
 private val threadSnapshot = SnapshotThreadLocal<Snapshot>()
 
 /**
  * A global synchronization object. This synchronization object should be taken before modifying any
  * of the fields below.
  */
-@PublishedApi
-internal val lock = SynchronizedObject()
+@PublishedApi internal val lock = SynchronizedObject()
 
-@PublishedApi
-internal inline fun <T> sync(block: () -> T): T = synchronized(lock, block)
+@PublishedApi internal inline fun <T> sync(block: () -> T): T = synchronized(lock, block)
 
 // The following variables should only be written when sync is taken
 
@@ -1848,8 +1786,7 @@
  */
 private var openSnapshots = SnapshotIdSet.EMPTY
 
-/** The first snapshot created must be at least on more than the
- * [Snapshot.PreexistingSnapshotId] */
+/** The first snapshot created must be at least on more than the [Snapshot.PreexistingSnapshotId] */
 private var nextSnapshotId = Snapshot.PreexistingSnapshotId + 1
 
 /**
@@ -1860,9 +1797,9 @@
 private val pinningTable = SnapshotDoubleIndexHeap()
 
 /**
- * The set of objects who have more than one active state record. These are traversed during
- * apply of mutable snapshots and when the global snapshot is advanced to determine if any of the
- * records can be cleared.
+ * The set of objects who have more than one active state record. These are traversed during apply
+ * of mutable snapshots and when the global snapshot is advanced to determine if any of the records
+ * can be cleared.
  */
 private val extraStateObjects = SnapshotWeakSet<StateObject>()
 
@@ -1872,14 +1809,12 @@
 /** A list of observers of writes to the global state. */
 private var globalWriteObservers = emptyList<(Any) -> Unit>()
 
-private val currentGlobalSnapshot = AtomicReference(
-    GlobalSnapshot(
-        id = nextSnapshotId++,
-        invalid = SnapshotIdSet.EMPTY
-    ).also {
-        openSnapshots = openSnapshots.set(it.id)
-    }
-)
+private val currentGlobalSnapshot =
+    AtomicReference(
+        GlobalSnapshot(id = nextSnapshotId++, invalid = SnapshotIdSet.EMPTY).also {
+            openSnapshots = openSnapshots.set(it.id)
+        }
+    )
 
 /**
  * A value to use to initialize the snapshot local variable of writable below. The value of this
@@ -1889,8 +1824,7 @@
  * with the correct contracts so the compiler would be able to figure out that the variable is
  * initialized.
  */
-@PublishedApi
-internal val snapshotInitializer: Snapshot = currentGlobalSnapshot.get()
+@PublishedApi internal val snapshotInitializer: Snapshot = currentGlobalSnapshot.get()
 
 private fun <T> takeNewGlobalSnapshot(
     previousGlobalSnapshot: Snapshot,
@@ -1903,12 +1837,7 @@
     sync {
         val globalId = nextSnapshotId++
         openSnapshots = openSnapshots.clear(previousGlobalSnapshot.id)
-        currentGlobalSnapshot.set(
-            GlobalSnapshot(
-                id = globalId,
-                invalid = openSnapshots
-            )
-        )
+        currentGlobalSnapshot.set(GlobalSnapshot(id = globalId, invalid = openSnapshots))
         previousGlobalSnapshot.dispose()
         openSnapshots = openSnapshots.set(globalId)
     }
@@ -1940,9 +1869,7 @@
     modified?.let {
         try {
             val observers = applyObservers
-            observers.fastForEach { observer ->
-                observer(it.wrapIntoSet(), previousGlobalSnapshot)
-            }
+            observers.fastForEach { observer -> observer(it.wrapIntoSet(), previousGlobalSnapshot) }
         } finally {
             pendingApplyObserverCount.add(-1)
         }
@@ -1956,14 +1883,12 @@
     return result
 }
 
-private fun advanceGlobalSnapshot() = advanceGlobalSnapshot { }
+private fun advanceGlobalSnapshot() = advanceGlobalSnapshot {}
 
 private fun <T : Snapshot> takeNewSnapshot(block: (invalid: SnapshotIdSet) -> T): T =
     advanceGlobalSnapshot { invalid ->
         val result = block(invalid)
-        sync {
-            openSnapshots = openSnapshots.set(result.id)
-        }
+        sync { openSnapshots = openSnapshots.set(result.id) }
         result
     }
 
@@ -1985,11 +1910,11 @@
 }
 
 /**
- * A candidate snapshot is valid if the it is less than or equal to the current snapshot
- * and it wasn't specifically marked as invalid when the snapshot started.
+ * A candidate snapshot is valid if the it is less than or equal to the current snapshot and it
+ * wasn't specifically marked as invalid when the snapshot started.
  *
- * All snapshot active at when the snapshot was taken considered invalid for the snapshot
- * (they have not been applied and therefore are considered invalid).
+ * All snapshot active at when the snapshot was taken considered invalid for the snapshot (they have
+ * not been applied and therefore are considered invalid).
  *
  * All snapshots taken after the current snapshot are considered invalid since they where taken
  * after the current snapshot was taken.
@@ -1997,7 +1922,8 @@
  * INVALID_SNAPSHOT is reserved as an invalid snapshot id.
  */
 private fun valid(currentSnapshot: Int, candidateSnapshot: Int, invalid: SnapshotIdSet): Boolean {
-    return candidateSnapshot != INVALID_SNAPSHOT && candidateSnapshot <= currentSnapshot &&
+    return candidateSnapshot != INVALID_SNAPSHOT &&
+        candidateSnapshot <= currentSnapshot &&
         !invalid.get(candidateSnapshot)
 }
 
@@ -2012,40 +1938,45 @@
     var candidate: StateRecord? = null
     while (current != null) {
         if (valid(current, id, invalid)) {
-            candidate = if (candidate == null) current
-            else if (candidate.snapshotId < current.snapshotId) current else candidate
+            candidate =
+                if (candidate == null) current
+                else if (candidate.snapshotId < current.snapshotId) current else candidate
         }
         current = current.next
     }
     if (candidate != null) {
-        @Suppress("UNCHECKED_CAST")
-        return candidate as T
+        @Suppress("UNCHECKED_CAST") return candidate as T
     }
     return null
 }
 
 /**
- * Return the current readable state record for the current snapshot. It is assumed that [this]
- * is the first record of [state]
+ * Return the current readable state record for the current snapshot. It is assumed that [this] is
+ * the first record of [state]
  */
 fun <T : StateRecord> T.readable(state: StateObject): T {
     val snapshot = Snapshot.current
     snapshot.readObserver?.invoke(state)
-    return readable(this, snapshot.id, snapshot.invalid) ?: sync {
-        // Readable can return null when the global snapshot has been advanced by another thread
-        // and state written to the object was overwritten while this thread was paused. Repeating
-        // the read is valid here as either this will return the same result as the previous call
-        // or will find a valid record. Being in a sync block prevents other threads from writing
-        // to this state object until the read completes.
-        val syncSnapshot = Snapshot.current
-        @Suppress("UNCHECKED_CAST")
-        readable(state.firstStateRecord as T, syncSnapshot.id, syncSnapshot.invalid) ?: readError()
-    }
+    return readable(this, snapshot.id, snapshot.invalid)
+        ?: sync {
+            // Readable can return null when the global snapshot has been advanced by another thread
+            // and state written to the object was overwritten while this thread was paused.
+            // Repeating
+            // the read is valid here as either this will return the same result as the previous
+            // call
+            // or will find a valid record. Being in a sync block prevents other threads from
+            // writing
+            // to this state object until the read completes.
+            val syncSnapshot = Snapshot.current
+            @Suppress("UNCHECKED_CAST")
+            readable(state.firstStateRecord as T, syncSnapshot.id, syncSnapshot.invalid)
+                ?: readError()
+        }
 }
 
 /**
- * Return the current readable state record for the [snapshot]. It is assumed that [this]
- * is the first record of [state]
+ * Return the current readable state record for the [snapshot]. It is assumed that [this] is the
+ * first record of [state]
  */
 fun <T : StateRecord> T.readable(state: StateObject, snapshot: Snapshot): T {
     // invoke the observer associated with the current snapshot.
@@ -2062,8 +1993,8 @@
 
 /**
  * A record can be reused if no other snapshot will see it as valid. This is always true for a
- * record created in an abandoned snapshot. It is also true if the record is valid in the
- * previous snapshot and is obscured by another record also valid in the previous state record.
+ * record created in an abandoned snapshot. It is also true if the record is valid in the previous
+ * snapshot and is obscured by another record also valid in the previous state record.
  */
 private fun usedLocked(state: StateObject): StateRecord? {
     var current: StateRecord? = state.firstStateRecord
@@ -2094,10 +2025,10 @@
 /**
  * Clear records that cannot be selected in any currently open snapshot.
  *
- * This method uses the same technique as [usedLocked] which uses the [pinningTable] to
- * determine lowest id in the invalid set for all snapshots. Only the record with the greatest
- * id of all records less or equal to this lowest id can possibly be selected in any snapshot
- * and all other records below that number can be overwritten.
+ * This method uses the same technique as [usedLocked] which uses the [pinningTable] to determine
+ * lowest id in the invalid set for all snapshots. Only the record with the greatest id of all
+ * records less or equal to this lowest id can possibly be selected in any snapshot and all other
+ * records below that number can be overwritten.
  *
  * However, this technique doesn't find all records that will not be selected by any open snapshot
  * as a record that has an id above that number could be reusable but will not be found.
@@ -2130,20 +2061,20 @@
                     retainedRecords++
                 } else {
                     // If [validRecord] is from an earlier snapshot, overwrite it instead
-                    val recordToOverwrite = if (current.snapshotId < validRecord.snapshotId) {
-                        current
-                    } else {
-                        // We cannot use `.also { }` here as it prevents smart casting of other
-                        // uses of [validRecord].
-                        val result = validRecord
-                        validRecord = current
-                        result
-                    }
+                    val recordToOverwrite =
+                        if (current.snapshotId < validRecord.snapshotId) {
+                            current
+                        } else {
+                            // We cannot use `.also { }` here as it prevents smart casting of other
+                            // uses of [validRecord].
+                            val result = validRecord
+                            validRecord = current
+                            result
+                        }
                     if (overwriteRecord == null) {
                         // Find a record we will definitely keep
-                        overwriteRecord = state.firstStateRecord.findYoungestOr {
-                            it.snapshotId >= reuseLimit
-                        }
+                        overwriteRecord =
+                            state.firstStateRecord.findYoungestOr { it.snapshotId >= reuseLimit }
                     }
                     recordToOverwrite.snapshotId = INVALID_SNAPSHOT
                     recordToOverwrite.assign(overwriteRecord)
@@ -2163,8 +2094,7 @@
     var youngest = this
     while (current != null) {
         if (predicate(current)) return current
-        if (youngest.snapshotId < current.snapshotId)
-            youngest = current
+        if (youngest.snapshotId < current.snapshotId) youngest = current
         current = current.next
     }
     return youngest
@@ -2195,13 +2125,14 @@
     // Otherwise, make a copy of the readable data and mark it as born in this snapshot, making it
     // writable.
     @Suppress("UNCHECKED_CAST")
-    val newData = sync {
-        // Verify that some other thread didn't already create this.
-        val newReadData = readable(state.firstStateRecord, id, snapshot.invalid) ?: readError()
-        if (newReadData.snapshotId == id)
-            newReadData
-        else newReadData.newWritableRecordLocked(state, snapshot)
-    } as T
+    val newData =
+        sync {
+            // Verify that some other thread didn't already create this.
+            val newReadData = readable(state.firstStateRecord, id, snapshot.invalid) ?: readError()
+            if (newReadData.snapshotId == id) newReadData
+            else newReadData.newWritableRecordLocked(state, snapshot)
+        }
+            as T
 
     if (readData.snapshotId != Snapshot.PreexistingSnapshotId) snapshot.recordModified(state)
 
@@ -2229,8 +2160,9 @@
     return newData
 }
 
-internal fun <T : StateRecord> T.newWritableRecord(state: StateObject, snapshot: Snapshot) =
-    sync { newWritableRecordLocked(state, snapshot) }
+internal fun <T : StateRecord> T.newWritableRecord(state: StateObject, snapshot: Snapshot) = sync {
+    newWritableRecordLocked(state, snapshot)
+}
 
 private fun <T : StateRecord> T.newWritableRecordLocked(state: StateObject, snapshot: Snapshot): T {
     // Calling used() on a state object might return the same record for each thread calling
@@ -2263,13 +2195,12 @@
     // cache the result of readable() as the mutating thread calls to writable() can change the
     // result of readable().
     @Suppress("UNCHECKED_CAST")
-    return (usedLocked(state) as T?)?.apply {
-        snapshotId = Int.MAX_VALUE
-    } ?: create().apply {
-        snapshotId = Int.MAX_VALUE
-        this.next = state.firstStateRecord
-        state.prependStateRecord(this as T)
-    } as T
+    return (usedLocked(state) as T?)?.apply { snapshotId = Int.MAX_VALUE }
+        ?: create().apply {
+            snapshotId = Int.MAX_VALUE
+            this.next = state.firstStateRecord
+            state.prependStateRecord(this as T)
+        } as T
 }
 
 @PublishedApi
@@ -2279,9 +2210,9 @@
 }
 
 /**
- * Call [block] with a writable state record for [snapshot] of the given record. It is
- * assumed that this is called for the first state record in a state object. If the snapshot is
- * read-only calling this will throw.
+ * Call [block] with a writable state record for [snapshot] of the given record. It is assumed that
+ * this is called for the first state record in a state object. If the snapshot is read-only calling
+ * this will throw.
  */
 inline fun <T : StateRecord, R> T.writable(
     state: StateObject,
@@ -2298,35 +2229,33 @@
     // Writes need to be in a `sync` block as all writes in flight must be completed before a new
     // snapshot is take. Writing in a sync block ensures this is the case because new snapshots
     // are also in a sync block.
-    return sync {
-        this.writableRecord(state, snapshot).block()
-    }.also { notifyWrite(snapshot, state) }
+    return sync { this.writableRecord(state, snapshot).block() }
+        .also { notifyWrite(snapshot, state) }
 }
 
 /**
- * Call [block] with a writable state record for the given record. It is assumed that this is
- * called for the first state record in a state object. A record is writable if it was created in
- * the current mutable snapshot.
+ * Call [block] with a writable state record for the given record. It is assumed that this is called
+ * for the first state record in a state object. A record is writable if it was created in the
+ * current mutable snapshot.
  */
 inline fun <T : StateRecord, R> T.writable(state: StateObject, block: T.() -> R): R {
     var snapshot: Snapshot = snapshotInitializer
     return sync {
-        snapshot = Snapshot.current
-        this.writableRecord(state, snapshot).block()
-    }.also {
-        notifyWrite(snapshot, state)
-    }
+            snapshot = Snapshot.current
+            this.writableRecord(state, snapshot).block()
+        }
+        .also { notifyWrite(snapshot, state) }
 }
 
 /**
- * Call [block] with a writable state record for the given record. It is assumed that this is
- * called for the first state record in a state object. A record is writable if it was created in
- * the current mutable snapshot. This should only be used when the record will be overwritten in
- * its entirety (such as having only one field and that field is written to).
+ * Call [block] with a writable state record for the given record. It is assumed that this is called
+ * for the first state record in a state object. A record is writable if it was created in the
+ * current mutable snapshot. This should only be used when the record will be overwritten in its
+ * entirety (such as having only one field and that field is written to).
  *
  * WARNING: If the caller doesn't overwrite all the fields in the state record the object will be
- * inconsistent and the fields not written are almost guaranteed to be incorrect. If it is
- * possible that [block] will not write to all the fields use [writable] instead.
+ * inconsistent and the fields not written are almost guaranteed to be incorrect. If it is possible
+ * that [block] will not write to all the fields use [writable] instead.
  *
  * @param state The object that has this record in its record list.
  * @param candidate The current for the snapshot record returned by [withCurrent]
@@ -2339,17 +2268,16 @@
 ): R {
     var snapshot: Snapshot = snapshotInitializer
     return sync {
-        snapshot = Snapshot.current
-        this.overwritableRecord(state, snapshot, candidate).block()
-    }.also {
-        notifyWrite(snapshot, state)
-    }
+            snapshot = Snapshot.current
+            this.overwritableRecord(state, snapshot, candidate).block()
+        }
+        .also { notifyWrite(snapshot, state) }
 }
 
 /**
- * Produce a set of optimistic merges of the state records, this is performed outside the
- * a synchronization block to reduce the amount of time taken in the synchronization block
- * reducing the thread contention of merging state values.
+ * Produce a set of optimistic merges of the state records, this is performed outside the a
+ * synchronization block to reduce the amount of time taken in the synchronization block reducing
+ * the thread contention of merging state values.
  */
 private fun optimisticMerges(
     currentSnapshot: MutableSnapshot,
@@ -2367,15 +2295,12 @@
         val previous = readable(first, id, start) ?: return@forEach
         if (current != previous) {
             // Try to produce a merged state record
-            val applied = readable(first, applyingSnapshot.id, applyingSnapshot.invalid)
-                ?: readError()
+            val applied =
+                readable(first, applyingSnapshot.id, applyingSnapshot.invalid) ?: readError()
             val merged = state.mergeRecords(previous, current, applied)
             if (merged != null) {
-                (
-                    result ?: hashMapOf<StateRecord, StateRecord>().also {
-                        result = it
-                    }
-                    )[current] = merged
+                (result ?: hashMapOf<StateRecord, StateRecord>().also { result = it })[current] =
+                    merged
             } else {
                 // If one fails don't bother calculating the others as they are likely not going
                 // to be used. There is an unlikely case that a optimistic merge cannot be
@@ -2393,9 +2318,7 @@
     error("Cannot modify a state object in a read-only snapshot")
 }
 
-/**
- * Returns the current record without notifying any read observers.
- */
+/** Returns the current record without notifying any read observers. */
 @PublishedApi
 internal fun <T : StateRecord> current(r: T, snapshot: Snapshot) =
     readable(r, snapshot.id, snapshot.invalid) ?: readError()
@@ -2403,11 +2326,13 @@
 @PublishedApi
 internal fun <T : StateRecord> current(r: T) =
     Snapshot.current.let { snapshot ->
-        readable(r, snapshot.id, snapshot.invalid) ?: sync {
-            Snapshot.current.let { syncSnapshot ->
-                readable(r, syncSnapshot.id, syncSnapshot.invalid)
+        readable(r, snapshot.id, snapshot.invalid)
+            ?: sync {
+                Snapshot.current.let { syncSnapshot ->
+                    readable(r, syncSnapshot.id, syncSnapshot.invalid)
+                }
             }
-        } ?: readError()
+            ?: readError()
     }
 
 /**
@@ -2415,15 +2340,11 @@
  *
  * @see readable
  */
-inline fun <T : StateRecord, R> T.withCurrent(block: (r: T) -> R): R =
-    block(current(this))
+inline fun <T : StateRecord, R> T.withCurrent(block: (r: T) -> R): R = block(current(this))
 
-/**
- * Helper routine to add a range of values ot a snapshot set
- */
+/** Helper routine to add a range of values ot a snapshot set */
 internal fun SnapshotIdSet.addRange(from: Int, until: Int): SnapshotIdSet {
     var result = this
-    for (invalidId in from until until)
-        result = result.set(invalidId)
+    for (invalidId in from until until) result = result.set(invalidId)
     return result
 }
diff --git a/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/snapshots/SnapshotContextElement.kt b/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/snapshots/SnapshotContextElement.kt
index deb196e..fdc0ad1 100644
--- a/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/snapshots/SnapshotContextElement.kt
+++ b/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/snapshots/SnapshotContextElement.kt
@@ -20,10 +20,9 @@
 import kotlin.coroutines.CoroutineContext
 
 /**
- * Return a [SnapshotContextElement] that will [enter][Snapshot.enter] this [Snapshot] whenever
- * the associated coroutine is resumed and leave this snapshot when it suspends.
- * The snapshot still must be [disposed][Snapshot.dispose] separately when it will no longer
- * be used.
+ * Return a [SnapshotContextElement] that will [enter][Snapshot.enter] this [Snapshot] whenever the
+ * associated coroutine is resumed and leave this snapshot when it suspends. The snapshot still must
+ * be [disposed][Snapshot.dispose] separately when it will no longer be used.
  *
  * @sample androidx.compose.runtime.samples.snapshotAsContextElementSample
  */
@@ -31,8 +30,8 @@
 fun Snapshot.asContextElement(): SnapshotContextElement = SnapshotContextElementImpl(this)
 
 /**
- * A [CoroutineContext] element that [enters][Snapshot.enter] an associated snapshot
- * whenever a coroutine associated with this context is resumed.
+ * A [CoroutineContext] element that [enters][Snapshot.enter] an associated snapshot whenever a
+ * coroutine associated with this context is resumed.
  */
 @ExperimentalComposeApi
 interface SnapshotContextElement : CoroutineContext.Element {
@@ -40,6 +39,4 @@
 }
 
 @OptIn(ExperimentalComposeApi::class)
-internal expect class SnapshotContextElementImpl(
-    snapshot: Snapshot
-) : SnapshotContextElement
+internal expect class SnapshotContextElementImpl(snapshot: Snapshot) : SnapshotContextElement
diff --git a/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/snapshots/SnapshotDoubleIndexHeap.kt b/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/snapshots/SnapshotDoubleIndexHeap.kt
index 78d7def..361d22f 100644
--- a/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/snapshots/SnapshotDoubleIndexHeap.kt
+++ b/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/snapshots/SnapshotDoubleIndexHeap.kt
@@ -24,8 +24,8 @@
  * can be later used to remove the number also with at worst O(log N).
  *
  * The data structure used is a heap, the first stage of a heap sort. As values are added and
- * removed the heap invariants are reestablished for the new value by either shifting values up
- * or down in the heap.
+ * removed the heap invariants are reestablished for the new value by either shifting values up or
+ * down in the heap.
  *
  * This class is used to track the lowest pinning snapshot id. A pinning snapshot id is either the
  * lowest snapshot in its invalid list or its own id if its invalid list is empty.
@@ -37,6 +37,7 @@
 internal class SnapshotDoubleIndexHeap {
     var size = 0
         private set
+
     // An array of values which are the snapshot ids
     private var values = IntArray(INITIAL_CAPACITY)
 
@@ -55,8 +56,8 @@
     fun lowestOrDefault(default: Int = 0) = if (size > 0) values[0] else default
 
     /**
-     * Add a value to the heap by adding it to the end of the heap and then shifting it up until
-     * it is either at the root or its parent is less or equal to it.
+     * Add a value to the heap by adding it to the end of the heap and then shifting it up until it
+     * is either at the root or its parent is less or equal to it.
      */
     fun add(value: Int): Int {
         ensure(size + 1)
@@ -71,8 +72,8 @@
 
     /**
      * Remove a value by using the index to locate where it is in the heap then replacing its
-     * location with the last member of the heap and shifting it up or down depending to restore
-     * the heap invariants.
+     * location with the last member of the heap and shifting it up or down depending to restore the
+     * heap invariants.
      */
     fun remove(handle: Int) {
         val i = handles[handle]
@@ -83,9 +84,7 @@
         freeHandle(handle)
     }
 
-    /**
-     * Validate that the heap invariants hold.
-     */
+    /** Validate that the heap invariants hold. */
     @TestOnly
     fun validate() {
         for (index in 1 until size) {
@@ -94,9 +93,7 @@
         }
     }
 
-    /**
-     * Validate that the handle refers to the expected value.
-     */
+    /** Validate that the handle refers to the expected value. */
     @TestOnly
     fun validateHandle(handle: Int, value: Int) {
         val i = handles[handle]
@@ -105,9 +102,7 @@
             error("Value for handle $handle was ${values[i]} but was supposed to be $value")
     }
 
-    /**
-     * Shift a value at [index] until its parent is less than it is or it is at index 0.
-     */
+    /** Shift a value at [index] until its parent is less than it is or it is at index 0. */
     private fun shiftUp(index: Int) {
         val values = values
         val value = values[index]
@@ -138,13 +133,11 @@
                 if (values[right] < values[current]) {
                     swap(right, current)
                     current = right
-                } else
-                    return
+                } else return
             } else if (values[left] < values[current]) {
                 swap(left, current)
                 current = left
-            } else
-                return
+            } else return
         }
     }
 
@@ -167,9 +160,7 @@
         handles[index[b]] = b
     }
 
-    /**
-     * Ensure that the heap can contain at least [atLeast] elements.
-     */
+    /** Ensure that the heap can contain at least [atLeast] elements. */
     private fun ensure(atLeast: Int) {
         val capacity = values.size
         if (atLeast <= capacity) return
@@ -182,9 +173,7 @@
         index = newIndex
     }
 
-    /**
-     * Allocate a free handle, growing the list of handles if necessary.
-     */
+    /** Allocate a free handle, growing the list of handles if necessary. */
     private fun allocateHandle(): Int {
         val capacity = handles.size
         if (firstFreeHandle >= capacity) {
diff --git a/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/snapshots/SnapshotIdSet.kt b/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/snapshots/SnapshotIdSet.kt
index 98c5c29..28f7998 100644
--- a/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/snapshots/SnapshotIdSet.kt
+++ b/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/snapshots/SnapshotIdSet.kt
@@ -19,11 +19,11 @@
 import androidx.compose.runtime.Immutable
 
 /**
- * An implementation of a bit set that that is optimized around for the top 128 bits and
- * sparse access for bits below that. Is is O(1) to set, clear and get the bit value of the top 128
- * values of the set. Below lowerBound it is O(log N) to get a bit and O(N) to set or clear a bit
- * where N is the number of bits set below lowerBound. Clearing a cleared bit or setting a set bit
- * is the same complexity of get.
+ * An implementation of a bit set that that is optimized around for the top 128 bits and sparse
+ * access for bits below that. Is is O(1) to set, clear and get the bit value of the top 128 values
+ * of the set. Below lowerBound it is O(log N) to get a bit and O(N) to set or clear a bit where N
+ * is the number of bits set below lowerBound. Clearing a cleared bit or setting a set bit is the
+ * same complexity of get.
  *
  * The set is immutable and calling the set or clear methods produce the modified set, leaving the
  * previous set unmodified. If the operation does not modify the set, such as setting a set bit or
@@ -33,11 +33,12 @@
  * than the that range to be mostly or completely clear.
  *
  * This class does not implement equals intentionally. Equals is hard and expensive as a normal form
- * for a particular set is not guaranteed (that is, two sets that compare equal might have
- * different field values). As snapshots does not need this, it is not implemented.
+ * for a particular set is not guaranteed (that is, two sets that compare equal might have different
+ * field values). As snapshots does not need this, it is not implemented.
  */
 @Immutable
-internal class SnapshotIdSet private constructor(
+internal class SnapshotIdSet
+private constructor(
     // Bit set from (lowerBound + 64)-(lowerBound+127) of the set
     private val upperSet: Long,
     // Bit set from (lowerBound)-(lowerBound+63) of the set
@@ -49,9 +50,7 @@
     private val belowBound: IntArray?
 ) : Iterable<Int> {
 
-    /**
-     * The value of the bit at index [bit]
-     */
+    /** The value of the bit at index [bit] */
     fun get(bit: Int): Boolean {
         val offset = bit - lowerBound
         if (offset >= 0 && offset < Long.SIZE_BITS) {
@@ -60,14 +59,10 @@
             return (1L shl (offset - Long.SIZE_BITS)) and upperSet != 0L
         } else if (offset > 0) {
             return false
-        } else return belowBound?.let {
-            it.binarySearch(bit) >= 0
-        } ?: false
+        } else return belowBound?.let { it.binarySearch(bit) >= 0 } ?: false
     }
 
-    /**
-     * Produce a copy of this set with the addition of the bit at index [bit] set.
-     */
+    /** Produce a copy of this set with the addition of the bit at index [bit] set. */
     fun set(bit: Int): SnapshotIdSet {
         val offset = bit - lowerBound
         if (offset >= 0 && offset < Long.SIZE_BITS) {
@@ -102,11 +97,10 @@
                     // Shift the lower set into the array
                     if (newLowerSet != 0L) {
                         if (newBelowBound == null)
-                            newBelowBound = mutableListOf<Int>().apply {
-                                belowBound?.let {
-                                    it.forEach { this.add(it) }
+                            newBelowBound =
+                                mutableListOf<Int>().apply {
+                                    belowBound?.let { it.forEach { this.add(it) } }
                                 }
-                            }
                         repeat(Long.SIZE_BITS) { bitOffset ->
                             if (newLowerSet and (1L shl bitOffset) != 0L) {
                                 newBelowBound.add(bitOffset + newLowerBound)
@@ -124,15 +118,16 @@
                 }
 
                 return SnapshotIdSet(
-                    newUpperSet,
-                    newLowerSet,
-                    newLowerBound,
-                    newBelowBound?.toIntArray() ?: belowBound
-                ).set(bit)
+                        newUpperSet,
+                        newLowerSet,
+                        newLowerBound,
+                        newBelowBound?.toIntArray() ?: belowBound
+                    )
+                    .set(bit)
             }
         } else {
-            val array = belowBound
-                ?: return SnapshotIdSet(upperSet, lowerSet, lowerBound, intArrayOf(bit))
+            val array =
+                belowBound ?: return SnapshotIdSet(upperSet, lowerSet, lowerBound, intArrayOf(bit))
 
             val location = array.binarySearch(bit)
             if (location < 0) {
@@ -160,9 +155,7 @@
         return this
     }
 
-    /**
-     * Produce a copy of this set with the addition of the bit at index [bit] cleared.
-     */
+    /** Produce a copy of this set with the addition of the bit at index [bit] cleared. */
     fun clear(bit: Int): SnapshotIdSet {
         val offset = bit - lowerBound
         if (offset >= 0 && offset < Long.SIZE_BITS) {
@@ -219,9 +212,7 @@
         return this
     }
 
-    /**
-     * Produce a copy of this with all the values in [bits] cleared (`a & ~b`)
-     */
+    /** Produce a copy of this with all the values in [bits] cleared (`a & ~b`) */
     fun andNot(bits: SnapshotIdSet): SnapshotIdSet {
         if (bits === EMPTY) return this
         if (this === EMPTY) return EMPTY
@@ -243,8 +234,7 @@
         return if (bits.lowerBound == this.lowerBound && bits.belowBound === this.belowBound) {
             val newUpper = this.upperSet and bits.upperSet
             val newLower = this.lowerSet and bits.lowerSet
-            if (newUpper == 0L && newLower == 0L && this.belowBound == null)
-                EMPTY
+            if (newUpper == 0L && newLower == 0L && this.belowBound == null) EMPTY
             else
                 SnapshotIdSet(
                     this.upperSet and bits.upperSet,
@@ -264,9 +254,7 @@
         }
     }
 
-    /**
-     * Produce a set that if the value is set in this set or [bits] (`a | b`)
-     */
+    /** Produce a set that if the value is set in this set or [bits] (`a | b`) */
     fun or(bits: SnapshotIdSet): SnapshotIdSet {
         if (bits === EMPTY) return this
         if (this === EMPTY) return bits
@@ -288,36 +276,36 @@
         }
     }
 
-    override fun iterator(): Iterator<Int> = sequence {
-        val belowBound = belowBound
-        if (belowBound != null)
-            for (element in belowBound) {
-                yield(element)
-            }
-        if (lowerSet != 0L) {
-            for (index in 0 until Long.SIZE_BITS) {
-                if (lowerSet and (1L shl index) != 0L) {
-                    yield(index + lowerBound)
+    override fun iterator(): Iterator<Int> =
+        sequence {
+                val belowBound = belowBound
+                if (belowBound != null)
+                    for (element in belowBound) {
+                        yield(element)
+                    }
+                if (lowerSet != 0L) {
+                    for (index in 0 until Long.SIZE_BITS) {
+                        if (lowerSet and (1L shl index) != 0L) {
+                            yield(index + lowerBound)
+                        }
+                    }
+                }
+                if (upperSet != 0L) {
+                    for (index in 0 until Long.SIZE_BITS) {
+                        if (upperSet and (1L shl index) != 0L) {
+                            yield(index + Long.SIZE_BITS + lowerBound)
+                        }
+                    }
                 }
             }
-        }
-        if (upperSet != 0L) {
-            for (index in 0 until Long.SIZE_BITS) {
-                if (upperSet and (1L shl index) != 0L) {
-                    yield(index + Long.SIZE_BITS + lowerBound)
-                }
-            }
-        }
-    }.iterator()
+            .iterator()
 
     inline fun fastFold(
         initial: SnapshotIdSet,
         operation: (acc: SnapshotIdSet, Int) -> SnapshotIdSet
     ): SnapshotIdSet {
         var accumulator = initial
-        fastForEach { element ->
-            accumulator = operation(accumulator, element)
-        }
+        fastForEach { element -> accumulator = operation(accumulator, element) }
         return accumulator
     }
 
@@ -351,14 +339,13 @@
         return default
     }
 
-    override fun toString(): String = "${super.toString()} [${this.map {
+    override fun toString(): String =
+        "${super.toString()} [${this.map {
         it.toString()
     }.fastJoinToString()}]"
 
     companion object {
-        /**
-         * An empty frame it set
-         */
+        /** An empty frame it set */
         val EMPTY = SnapshotIdSet(0, 0, 0, null)
     }
 }
@@ -370,12 +357,7 @@
     while (low <= high) {
         val mid = (low + high).ushr(1)
         val midVal = get(mid)
-        if (value > midVal)
-            low = mid + 1
-        else if (value < midVal)
-            high = mid - 1
-        else
-            return mid
+        if (value > midVal) low = mid + 1 else if (value < midVal) high = mid - 1 else return mid
     }
     return -(low + 1)
 }
diff --git a/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/snapshots/SnapshotMutableState.kt b/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/snapshots/SnapshotMutableState.kt
index d14b04d..b0c1b17 100644
--- a/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/snapshots/SnapshotMutableState.kt
+++ b/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/snapshots/SnapshotMutableState.kt
@@ -37,8 +37,6 @@
  * @see [mutableStateOf]
  */
 interface SnapshotMutableState<T> : MutableState<T> {
-    /**
-     * A policy to control how changes are handled in a mutable snapshot.
-     */
+    /** A policy to control how changes are handled in a mutable snapshot. */
     val policy: SnapshotMutationPolicy<T>
 }
diff --git a/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/snapshots/SnapshotStateList.kt b/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/snapshots/SnapshotStateList.kt
index 7830497..337157a 100644
--- a/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/snapshots/SnapshotStateList.kt
+++ b/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/snapshots/SnapshotStateList.kt
@@ -38,9 +38,10 @@
         persistentListOf<T>().let { list ->
             StateListStateRecord(list).also {
                 if (Snapshot.isInSnapshot) {
-                    it.next = StateListStateRecord(list).also { next ->
-                        next.snapshotId = Snapshot.PreexistingSnapshotId
-                    }
+                    it.next =
+                        StateListStateRecord(list).also { next ->
+                            next.snapshotId = Snapshot.PreexistingSnapshotId
+                        }
                 }
             }
         }
@@ -61,28 +62,27 @@
      * and removing the same item from the this list might produce a different instance with the
      * same content.
      *
-     * This operation is O(1) and does not involve a physically copying the list. It instead
-     * returns the underlying immutable list used internally to store the content of the list.
+     * This operation is O(1) and does not involve a physically copying the list. It instead returns
+     * the underlying immutable list used internally to store the content of the list.
      *
      * It is recommended to use [toList] when using returning the value of this list from
      * [androidx.compose.runtime.snapshotFlow].
      */
     fun toList(): List<T> = readable.list
 
-    internal val structure: Int get() = withCurrent { structuralChange }
+    internal val structure: Int
+        get() = withCurrent { structuralChange }
 
     @Suppress("UNCHECKED_CAST")
-    internal val readable: StateListStateRecord<T> get() =
-        (firstStateRecord as StateListStateRecord<T>).readable(this)
+    internal val readable: StateListStateRecord<T>
+        get() = (firstStateRecord as StateListStateRecord<T>).readable(this)
 
-    /**
-     * This is an internal implementation class of [SnapshotStateList]. Do not use.
-     */
-    internal class StateListStateRecord<T> internal constructor(
-        internal var list: PersistentList<T>
-    ) : StateRecord() {
+    /** This is an internal implementation class of [SnapshotStateList]. Do not use. */
+    internal class StateListStateRecord<T>
+    internal constructor(internal var list: PersistentList<T>) : StateRecord() {
         internal var modification = 0
         internal var structuralChange = 0
+
         override fun assign(value: StateRecord) {
             synchronized(sync) {
                 @Suppress("UNCHECKED_CAST")
@@ -95,34 +95,50 @@
         override fun create(): StateRecord = StateListStateRecord(list)
     }
 
-    override val size: Int get() = readable.list.size
+    override val size: Int
+        get() = readable.list.size
+
     override fun contains(element: T) = readable.list.contains(element)
+
     override fun containsAll(elements: Collection<T>) = readable.list.containsAll(elements)
+
     override fun get(index: Int) = readable.list[index]
+
     override fun indexOf(element: T): Int = readable.list.indexOf(element)
+
     override fun isEmpty() = readable.list.isEmpty()
+
     override fun iterator(): MutableIterator<T> = listIterator()
+
     override fun lastIndexOf(element: T) = readable.list.lastIndexOf(element)
+
     override fun listIterator(): MutableListIterator<T> = StateListIterator(this, 0)
+
     override fun listIterator(index: Int): MutableListIterator<T> = StateListIterator(this, index)
+
     override fun subList(fromIndex: Int, toIndex: Int): MutableList<T> {
         requirePrecondition(fromIndex in 0..toIndex && toIndex <= size) {
             "fromIndex or toIndex are out of bounds"
         }
         return SubList(this, fromIndex, toIndex)
     }
+
     @Suppress("UNCHECKED_CAST")
-    override fun toString(): String = (firstStateRecord as StateListStateRecord<T>).withCurrent {
-        "SnapshotStateList(value=${it.list})@${hashCode()}"
-    }
+    override fun toString(): String =
+        (firstStateRecord as StateListStateRecord<T>).withCurrent {
+            "SnapshotStateList(value=${it.list})@${hashCode()}"
+        }
 
     override fun add(element: T) = conditionalUpdate { it.add(element) }
+
     override fun add(index: Int, element: T) = update { it.add(index, element) }
+
     override fun addAll(index: Int, elements: Collection<T>) = mutateBoolean {
         it.addAll(index, elements)
     }
 
     override fun addAll(elements: Collection<T>) = conditionalUpdate { it.addAll(elements) }
+
     override fun clear() {
         writable {
             synchronized(sync) {
@@ -132,25 +148,25 @@
             }
         }
     }
+
     override fun remove(element: T) = conditionalUpdate { it.remove(element) }
+
     override fun removeAll(elements: Collection<T>) = conditionalUpdate { it.removeAll(elements) }
+
     override fun removeAt(index: Int): T = get(index).also { update { it.removeAt(index) } }
+
     override fun retainAll(elements: Collection<T>) = mutateBoolean { it.retainAll(elements) }
-    override fun set(index: Int, element: T): T = get(index).also {
-        update(structural = false) { it.set(index, element) }
-    }
+
+    override fun set(index: Int, element: T): T =
+        get(index).also { update(structural = false) { it.set(index, element) } }
 
     fun removeRange(fromIndex: Int, toIndex: Int) {
-        mutate {
-            it.subList(fromIndex, toIndex).clear()
-        }
+        mutate { it.subList(fromIndex, toIndex).clear() }
     }
 
     internal fun retainAllInRange(elements: Collection<T>, start: Int, end: Int): Int {
         val startSize = size
-        mutate<Unit> {
-            it.subList(start, end).retainAll(elements)
-        }
+        mutate<Unit> { it.subList(start, end).retainAll(elements) }
         return startSize - size
     }
 
@@ -160,16 +176,14 @@
      */
     @Suppress("unused")
     internal val debuggerDisplayValue: List<T>
-        @JvmName("getDebuggerDisplayValue")
-        get() = withCurrent { list }
+        @JvmName("getDebuggerDisplayValue") get() = withCurrent { list }
 
     private inline fun <R> writable(block: StateListStateRecord<T>.() -> R): R =
         @Suppress("UNCHECKED_CAST")
         (firstStateRecord as StateListStateRecord<T>).writable(this, block)
 
     private inline fun <R> withCurrent(block: StateListStateRecord<T>.() -> R): R =
-        @Suppress("UNCHECKED_CAST")
-        (firstStateRecord as StateListStateRecord<T>).withCurrent(block)
+        @Suppress("UNCHECKED_CAST") (firstStateRecord as StateListStateRecord<T>).withCurrent(block)
 
     private fun mutateBoolean(block: (MutableList<T>) -> Boolean): Boolean = mutate(block)
 
@@ -186,17 +200,20 @@
             val builder = oldList!!.builder()
             result = block(builder)
             val newList = builder.build()
-            if (newList == oldList || writable {
-                 synchronized(sync) {
-                    if (modification == currentModification) {
-                        list = newList
-                        modification++
-                        structuralChange++
-                        true
-                    } else false
-                }
-            }
-            ) break
+            if (
+                newList == oldList ||
+                    writable {
+                        synchronized(sync) {
+                            if (modification == currentModification) {
+                                list = newList
+                                modification++
+                                structuralChange++
+                                true
+                            } else false
+                        }
+                    }
+            )
+                break
         }
         return result
     }
@@ -211,23 +228,23 @@
     private inline fun conditionalUpdate(
         structural: Boolean = true,
         block: (PersistentList<T>) -> PersistentList<T>
-    ) =
-        run {
-            val result: Boolean
-            while (true) {
-                var oldList: PersistentList<T>? = null
-                var currentModification = 0
-                synchronized(sync) {
-                    val current = withCurrent { this }
-                    currentModification = current.modification
-                    oldList = current.list
-                }
-                val newList = block(oldList!!)
-                if (newList == oldList) {
-                    result = false
-                    break
-                }
-                if (writable {
+    ) = run {
+        val result: Boolean
+        while (true) {
+            var oldList: PersistentList<T>? = null
+            var currentModification = 0
+            synchronized(sync) {
+                val current = withCurrent { this }
+                currentModification = current.modification
+                oldList = current.list
+            }
+            val newList = block(oldList!!)
+            if (newList == oldList) {
+                result = false
+                break
+            }
+            if (
+                writable {
                     synchronized(sync) {
                         if (modification == currentModification) {
                             list = newList
@@ -237,18 +254,18 @@
                         } else false
                     }
                 }
-                ) {
-                    result = true
-                    break
-                }
+            ) {
+                result = true
+                break
             }
-            result
         }
+        result
+    }
 }
 
 /**
- * This lock is used to ensure that the value of modification and the list in the state record,
- * when used together, are atomically read and written.
+ * This lock is used to ensure that the value of modification and the list in the state record, when
+ * used together, are atomically read and written.
  *
  * A global sync object is used to avoid having to allocate a sync object and initialize a monitor
  * for each instance the list. This avoid additional allocations but introduces some contention
@@ -260,8 +277,7 @@
  */
 private val sync = SynchronizedObject()
 
-private fun modificationError(): Nothing =
-    error("Cannot modify a state list through an iterator")
+private fun modificationError(): Nothing = error("Cannot modify a state list through an iterator")
 
 private fun validateRange(index: Int, size: Int) {
     if (index !in 0 until size) {
@@ -275,10 +291,8 @@
             "or immediately after a call to add() or remove()"
     )
 
-private class StateListIterator<T>(
-    val list: SnapshotStateList<T>,
-    offset: Int
-) : MutableListIterator<T> {
+private class StateListIterator<T>(val list: SnapshotStateList<T>, offset: Int) :
+    MutableListIterator<T> {
     private var index = offset - 1
     private var lastRequested = -1
     private var structure = list.structure
@@ -336,18 +350,17 @@
     }
 }
 
-private class SubList<T>(
-    val parentList: SnapshotStateList<T>,
-    fromIndex: Int,
-    toIndex: Int
-) : MutableList<T> {
+private class SubList<T>(val parentList: SnapshotStateList<T>, fromIndex: Int, toIndex: Int) :
+    MutableList<T> {
     private val offset = fromIndex
     private var structure = parentList.structure
     override var size = toIndex - fromIndex
         private set
 
     override fun contains(element: T): Boolean = indexOf(element) >= 0
+
     override fun containsAll(elements: Collection<T>): Boolean = elements.all { contains(it) }
+
     override fun get(index: Int): T {
         validateModification()
         validateRange(index, size)
@@ -356,9 +369,7 @@
 
     override fun indexOf(element: T): Int {
         validateModification()
-        (offset until offset + size).forEach {
-            if (element == parentList[it]) return it - offset
-        }
+        (offset until offset + size).forEach { if (element == parentList[it]) return it - offset }
         return -1
     }
 
@@ -413,28 +424,37 @@
     }
 
     override fun listIterator(): MutableListIterator<T> = listIterator(0)
+
     override fun listIterator(index: Int): MutableListIterator<T> {
         validateModification()
         var current = index - 1
         return object : MutableListIterator<T> {
             override fun hasPrevious() = current >= 0
+
             override fun nextIndex(): Int = current + 1
+
             override fun previous(): T {
                 val oldCurrent = current
                 validateRange(oldCurrent, size)
                 current = oldCurrent - 1
                 return this@SubList[oldCurrent]
             }
+
             override fun previousIndex(): Int = current
+
             override fun add(element: T) = modificationError()
+
             override fun hasNext(): Boolean = current < size - 1
+
             override fun next(): T {
                 val newCurrent = current + 1
                 validateRange(newCurrent, size)
                 current = newCurrent
                 return this@SubList[newCurrent]
             }
+
             override fun remove() = modificationError()
+
             override fun set(element: T) = modificationError()
         }
     }
diff --git a/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/snapshots/SnapshotStateMap.kt b/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/snapshots/SnapshotStateMap.kt
index ee90b08..ac20fb6 100644
--- a/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/snapshots/SnapshotStateMap.kt
+++ b/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/snapshots/SnapshotStateMap.kt
@@ -37,9 +37,10 @@
         persistentHashMapOf<K, V>().let { map ->
             StateMapStateRecord(map).also {
                 if (Snapshot.isInSnapshot) {
-                    it.next = StateMapStateRecord(map).also { next ->
-                        next.snapshotId = Snapshot.PreexistingSnapshotId
-                    }
+                    it.next =
+                        StateMapStateRecord(map).also { next ->
+                            next.snapshotId = Snapshot.PreexistingSnapshotId
+                        }
                 }
             }
         }
@@ -58,36 +59,53 @@
      * however, guaranteed to be the same instance for the same content as adding and removing the
      * same item from the this map might produce a different instance with the same content.
      *
-     * This operation is O(1) and does not involve a physically copying the map. It instead
-     * returns the underlying immutable map used internally to store the content of the map.
+     * This operation is O(1) and does not involve a physically copying the map. It instead returns
+     * the underlying immutable map used internally to store the content of the map.
      *
      * It is recommended to use [toMap] when using returning the value of this map from
      * [androidx.compose.runtime.snapshotFlow].
      */
     fun toMap(): Map<K, V> = readable.map
 
-    override val size get() = readable.map.size
+    override val size
+        get() = readable.map.size
+
     override fun containsKey(key: K) = readable.map.containsKey(key)
+
     override fun containsValue(value: V) = readable.map.containsValue(value)
+
     override fun get(key: K) = readable.map[key]
+
     override fun isEmpty() = readable.map.isEmpty()
+
     override val entries: MutableSet<MutableMap.MutableEntry<K, V>> = SnapshotMapEntrySet(this)
     override val keys: MutableSet<K> = SnapshotMapKeySet(this)
     override val values: MutableCollection<V> = SnapshotMapValueSet(this)
+
     @Suppress("UNCHECKED_CAST")
-    override fun toString(): String = (firstStateRecord as StateMapStateRecord<K, V>).withCurrent {
-        "SnapshotStateMap(value=${it.map})@${hashCode()}"
-    }
+    override fun toString(): String =
+        (firstStateRecord as StateMapStateRecord<K, V>).withCurrent {
+            "SnapshotStateMap(value=${it.map})@${hashCode()}"
+        }
 
     override fun clear() = update { persistentHashMapOf() }
+
     override fun put(key: K, value: V): V? = mutate { it.put(key, value) }
+
     override fun putAll(from: Map<out K, V>) = mutate { it.putAll(from) }
+
     override fun remove(key: K): V? = mutate { it.remove(key) }
 
-    internal val modification get() = readable.modification
+    internal val modification
+        get() = readable.modification
 
     internal fun removeValue(value: V) =
-        entries.firstOrNull { it.value == value }?.let { remove(it.key); true } == true
+        entries
+            .firstOrNull { it.value == value }
+            ?.let {
+                remove(it.key)
+                true
+            } == true
 
     @Suppress("UNCHECKED_CAST")
     internal val readable: StateMapStateRecord<K, V>
@@ -126,8 +144,7 @@
      */
     @Suppress("unused")
     internal val debuggerDisplayValue: Map<K, V>
-        @JvmName("getDebuggerDisplayValue")
-        get() = withCurrent { map }
+        @JvmName("getDebuggerDisplayValue") get() = withCurrent { map }
 
     private inline fun <R> withCurrent(block: StateMapStateRecord<K, V>.() -> R): R =
         @Suppress("UNCHECKED_CAST")
@@ -150,40 +167,41 @@
             val builder = oldMap!!.builder()
             result = block(builder)
             val newMap = builder.build()
-            if (newMap == oldMap || writable {
-                synchronized(sync) {
-                    if (modification == currentModification) {
-                        map = newMap
-                        modification++
-                        true
-                    } else false
-                }
-            }
-            ) break
+            if (
+                newMap == oldMap ||
+                    writable {
+                        synchronized(sync) {
+                            if (modification == currentModification) {
+                                map = newMap
+                                modification++
+                                true
+                            } else false
+                        }
+                    }
+            )
+                break
         }
         return result
     }
 
     private inline fun update(block: (PersistentMap<K, V>) -> PersistentMap<K, V>) = withCurrent {
         val newMap = block(map)
-        if (newMap !== map) writable {
-            synchronized(sync) {
-                map = newMap
-                modification++
+        if (newMap !== map)
+            writable {
+                synchronized(sync) {
+                    map = newMap
+                    modification++
+                }
             }
-        }
     }
 
-    /**
-     * Implementation class of [SnapshotStateMap]. Do not use.
-     */
-    internal class StateMapStateRecord<K, V> internal constructor(
-        internal var map: PersistentMap<K, V>
-    ) : StateRecord() {
+    /** Implementation class of [SnapshotStateMap]. Do not use. */
+    internal class StateMapStateRecord<K, V>
+    internal constructor(internal var map: PersistentMap<K, V>) : StateRecord() {
         internal var modification = 0
+
         override fun assign(value: StateRecord) {
-            @Suppress("UNCHECKED_CAST")
-            val other = (value as StateMapStateRecord<K, V>)
+            @Suppress("UNCHECKED_CAST") val other = (value as StateMapStateRecord<K, V>)
             synchronized(sync) {
                 map = other.map
                 modification = other.modification
@@ -194,23 +212,26 @@
     }
 }
 
-private abstract class SnapshotMapSet<K, V, E>(
-    val map: SnapshotStateMap<K, V>
-) : MutableSet<E> {
-    override val size: Int get() = map.size
+private abstract class SnapshotMapSet<K, V, E>(val map: SnapshotStateMap<K, V>) : MutableSet<E> {
+    override val size: Int
+        get() = map.size
+
     override fun clear() = map.clear()
+
     override fun isEmpty() = map.isEmpty()
 }
 
-private class SnapshotMapEntrySet<K, V>(
-    map: SnapshotStateMap<K, V>
-) : SnapshotMapSet<K, V, MutableMap.MutableEntry<K, V>>(map) {
+private class SnapshotMapEntrySet<K, V>(map: SnapshotStateMap<K, V>) :
+    SnapshotMapSet<K, V, MutableMap.MutableEntry<K, V>>(map) {
     override fun add(element: MutableMap.MutableEntry<K, V>) = unsupported()
+
     override fun addAll(elements: Collection<MutableMap.MutableEntry<K, V>>) = unsupported()
+
     override fun iterator(): MutableIterator<MutableMap.MutableEntry<K, V>> =
         StateMapMutableEntriesIterator(map, map.readable.map.entries.iterator())
-    override fun remove(element: MutableMap.MutableEntry<K, V>) =
-        map.remove(element.key) != null
+
+    override fun remove(element: MutableMap.MutableEntry<K, V>) = map.remove(element.key) != null
+
     override fun removeAll(elements: Collection<MutableMap.MutableEntry<K, V>>): Boolean {
         var removed = false
         for (element in elements) {
@@ -218,13 +239,16 @@
         }
         return removed
     }
+
     override fun retainAll(elements: Collection<MutableMap.MutableEntry<K, V>>): Boolean {
         val entries = elements.associate { it.key to it.value }
         return map.removeIf { !entries.containsKey(it.key) || entries[it.key] != it.value }
     }
+
     override fun contains(element: MutableMap.MutableEntry<K, V>): Boolean {
         return map[element.key] == element.value
     }
+
     override fun containsAll(elements: Collection<MutableMap.MutableEntry<K, V>>): Boolean {
         return elements.all { contains(it) }
     }
@@ -232,49 +256,60 @@
 
 private class SnapshotMapKeySet<K, V>(map: SnapshotStateMap<K, V>) : SnapshotMapSet<K, V, K>(map) {
     override fun add(element: K) = unsupported()
+
     override fun addAll(elements: Collection<K>) = unsupported()
+
     override fun iterator() = StateMapMutableKeysIterator(map, map.readable.map.entries.iterator())
+
     override fun remove(element: K): Boolean = map.remove(element) != null
+
     override fun removeAll(elements: Collection<K>): Boolean {
         var removed = false
-        elements.forEach {
-            removed = map.remove(it) != null || removed
-        }
+        elements.forEach { removed = map.remove(it) != null || removed }
         return removed
     }
+
     override fun retainAll(elements: Collection<K>): Boolean {
         val set = elements.toSet()
         return map.removeIf { it.key !in set }
     }
+
     override fun contains(element: K) = map.contains(element)
+
     override fun containsAll(elements: Collection<K>): Boolean = elements.all { map.contains(it) }
 }
 
-private class SnapshotMapValueSet<K, V>(
-    map: SnapshotStateMap<K, V>
-) : SnapshotMapSet<K, V, V>(map) {
+private class SnapshotMapValueSet<K, V>(map: SnapshotStateMap<K, V>) :
+    SnapshotMapSet<K, V, V>(map) {
     override fun add(element: V) = unsupported()
+
     override fun addAll(elements: Collection<V>) = unsupported()
+
     override fun iterator() =
         StateMapMutableValuesIterator(map, map.readable.map.entries.iterator())
+
     override fun remove(element: V): Boolean = map.removeValue(element)
+
     override fun removeAll(elements: Collection<V>): Boolean {
         val set = elements.toSet()
         return map.removeIf { it.value in set }
     }
+
     override fun retainAll(elements: Collection<V>): Boolean {
         val set = elements.toSet()
         return map.removeIf { it.value !in set }
     }
+
     override fun contains(element: V) = map.containsValue(element)
+
     override fun containsAll(elements: Collection<V>): Boolean {
         return elements.all { map.containsValue(it) }
     }
 }
 
 /**
- * This lock is used to ensure that the value of modification and the map in the state record,
- * when used together, are atomically read and written.
+ * This lock is used to ensure that the value of modification and the map in the state record, when
+ * used together, are atomically read and written.
  *
  * A global sync object is used to avoid having to allocate a sync object and initialize a monitor
  * for each instance the map. This avoids additional allocations but introduces some contention
@@ -294,7 +329,9 @@
     protected var current: Map.Entry<K, V>? = null
     protected var next: Map.Entry<K, V>? = null
 
-    init { advance() }
+    init {
+        advance()
+    }
 
     fun remove() = modify {
         val value = current
@@ -332,6 +369,7 @@
             return object : MutableMap.MutableEntry<K, V> {
                 override val key = current!!.key
                 override var value = current!!.value
+
                 override fun setValue(newValue: V): V = modify {
                     val result = value
                     map[key] = newValue
diff --git a/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/snapshots/SnapshotStateObserver.kt b/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/snapshots/SnapshotStateObserver.kt
index c6e72b5..33f98c1 100644
--- a/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/snapshots/SnapshotStateObserver.kt
+++ b/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/snapshots/SnapshotStateObserver.kt
@@ -77,8 +77,7 @@
     /**
      * Send any pending notifications. Uses [onChangedExecutor] to schedule this work.
      *
-     * This method should only be called if, and only if, a call to `drainChanges()` returns
-     * `true`.
+     * This method should only be called if, and only if, a call to `drainChanges()` returns `true`.
      */
     private fun sendNotifications() {
         onChangedExecutor {
@@ -108,27 +107,26 @@
      * the queue, the set itself is the atomic reference. If the queue is empty the reference is
      * null. Only if there are more than one set added to the queue is an allocation required, then
      * the atomic reference is a list containing all the sets in the queue. Given the size of the
-     * queue, the type of object referenced is,
-     *   0 -> null
-     *   1 -> Set<Any?>
-     *   2 or more -> List<Set<Any?>>
+     * queue, the type of object referenced is, 0 -> null 1 -> Set<Any?> 2 or more ->
+     * List<Set<Any?>>
      */
     private fun addChanges(set: Set<Any>) {
         while (true) {
             val old = pendingChanges.get()
-            val new = when (old) {
-                null -> set
-                is Set<*> -> listOf(old, set)
-                is List<*> -> old + listOf(set)
-                else -> report()
-            }
+            val new =
+                when (old) {
+                    null -> set
+                    is Set<*> -> listOf(old, set)
+                    is List<*> -> old + listOf(set)
+                    else -> report()
+                }
             if (pendingChanges.compareAndSet(old, new)) break
         }
     }
 
     /**
-     * Remove a set of changes from the change queue. See [addChanges] for a description of how
-     * this queue works.
+     * Remove a set of changes from the change queue. See [addChanges] for a description of how this
+     * queue works.
      */
     @Suppress("UNCHECKED_CAST")
     private fun removeChanges(): Set<Any>? {
@@ -144,11 +142,12 @@
                 }
                 is List<*> -> {
                     result = old[0] as Set<Any>?
-                    new = when {
-                        old.size == 2 -> old[1]
-                        old.size > 2 -> old.subList(1, old.size)
-                        else -> null
-                    }
+                    new =
+                        when {
+                            old.size == 2 -> old[1]
+                            old.size > 2 -> old.subList(1, old.size)
+                            else -> null
+                        }
                 }
                 else -> report()
             }
@@ -160,14 +159,10 @@
 
     private fun report(): Nothing = composeRuntimeError("Unexpected notification")
 
-    /**
-     * The observer used by this [SnapshotStateObserver] during [observeReads].
-     */
+    /** The observer used by this [SnapshotStateObserver] during [observeReads]. */
     private val readObserver: (Any) -> Unit = { state ->
         if (!isPaused) {
-            synchronized(observedScopeMapsLock) {
-                currentMap!!.recordRead(state)
-            }
+            synchronized(observedScopeMapsLock) { currentMap!!.recordRead(state) }
         }
     }
 
@@ -180,30 +175,24 @@
     private val observedScopeMapsLock = SynchronizedObject()
 
     /**
-     * Helper for synchronized iteration over [observedScopeMaps]. All observed reads should
-     * happen on the same thread, but snapshots can be applied on a different thread, requiring
+     * Helper for synchronized iteration over [observedScopeMaps]. All observed reads should happen
+     * on the same thread, but snapshots can be applied on a different thread, requiring
      * synchronization.
      */
     private inline fun forEachScopeMap(block: (ObservedScopeMap) -> Unit) {
-        synchronized(observedScopeMapsLock) {
-            observedScopeMaps.forEach(block)
-        }
+        synchronized(observedScopeMapsLock) { observedScopeMaps.forEach(block) }
     }
 
     private inline fun removeScopeMapIf(block: (ObservedScopeMap) -> Boolean) {
-        synchronized(observedScopeMapsLock) {
-            observedScopeMaps.removeIf(block)
-        }
+        synchronized(observedScopeMapsLock) { observedScopeMaps.removeIf(block) }
     }
 
-    /**
-     * Method to call when unsubscribing from the apply observer.
-     */
+    /** Method to call when unsubscribing from the apply observer. */
     private var applyUnsubscribe: ObserverHandle? = null
 
     /**
-     * `true` when [withNoObservations] is called and read observations should not
-     * be considered invalidations for the current scope.
+     * `true` when [withNoObservations] is called and read observations should not be considered
+     * invalidations for the current scope.
      */
     private var isPaused = false
 
@@ -212,30 +201,25 @@
      */
     private var currentMap: ObservedScopeMap? = null
 
-    /**
-     * Thread id that has set the [currentMap]
-     */
+    /** Thread id that has set the [currentMap] */
     private var currentMapThreadId = -1L
 
     /**
      * Executes [block], observing state object reads during its execution.
      *
-     * The [scope] and [onValueChangedForScope] are associated with any values that are read so
-     * that when those values change, [onValueChangedForScope] will be called with the [scope]
-     * parameter.
+     * The [scope] and [onValueChangedForScope] are associated with any values that are read so that
+     * when those values change, [onValueChangedForScope] will be called with the [scope] parameter.
      *
      * Observation can be paused with [Snapshot.withoutReadObservation].
      *
      * @param scope value associated with the observed scope.
-     * @param onValueChangedForScope is called with the [scope] when value read within [block]
-     * has been changed. For repeated observations, it is more performant to pass the same instance
-     * of the callback, as [observedScopeMaps] grows with each new callback instance.
+     * @param onValueChangedForScope is called with the [scope] when value read within [block] has
+     *   been changed. For repeated observations, it is more performant to pass the same instance of
+     *   the callback, as [observedScopeMaps] grows with each new callback instance.
      * @param block to observe reads within.
      */
     fun <T : Any> observeReads(scope: T, onValueChangedForScope: (T) -> Unit, block: () -> Unit) {
-        val scopeMap = synchronized(observedScopeMapsLock) {
-            ensureMap(onValueChangedForScope)
-        }
+        val scopeMap = synchronized(observedScopeMapsLock) { ensureMap(onValueChangedForScope) }
 
         val oldPaused = isPaused
         val oldMap = currentMap
@@ -298,8 +282,8 @@
     }
 
     /**
-     * Remove observations using [predicate] to identify scopes to be removed. This is
-     * used when a scope is no longer in the hierarchy and should not receive any callbacks.
+     * Remove observations using [predicate] to identify scopes to be removed. This is used when a
+     * scope is no longer in the hierarchy and should not receive any callbacks.
      */
     fun clearIf(predicate: (scope: Any) -> Boolean) {
         removeScopeMapIf { scopeMap ->
@@ -308,16 +292,12 @@
         }
     }
 
-    /**
-     * Starts watching for state commits.
-     */
+    /** Starts watching for state commits. */
     fun start() {
         applyUnsubscribe = Snapshot.registerApplyObserver(applyObserver)
     }
 
-    /**
-     * Stops watching for state commits.
-     */
+    /** Stops watching for state commits. */
     fun stop() {
         applyUnsubscribe?.dispose()
     }
@@ -331,18 +311,14 @@
         applyObserver(changes, snapshot)
     }
 
-    /**
-     * Remove all observations.
-     */
+    /** Remove all observations. */
     fun clear() {
-        forEachScopeMap { scopeMap ->
-            scopeMap.clear()
-        }
+        forEachScopeMap { scopeMap -> scopeMap.clear() }
     }
 
     /**
-     * Returns the [ObservedScopeMap] within [observedScopeMaps] associated with [onChanged] or a newly-
-     * inserted one if it doesn't exist.
+     * Returns the [ObservedScopeMap] within [observedScopeMaps] associated with [onChanged] or a
+     * newly- inserted one if it doesn't exist.
      *
      * Must be called inside a synchronized block.
      */
@@ -357,19 +333,15 @@
         return scopeMap
     }
 
-    /**
-     * Connects observed values to scopes for each [onChanged] callback.
-     */
+    /** Connects observed values to scopes for each [onChanged] callback. */
     @Suppress("UNCHECKED_CAST")
     private class ObservedScopeMap(val onChanged: (Any) -> Unit) {
-        /**
-         * Currently observed scope.
-         */
+        /** Currently observed scope. */
         private var currentScope: Any? = null
 
         /**
-         * key: State reads observed in current scope.
-         * value: [currentToken] at the time the read was observed in.
+         * key: State reads observed in current scope. value: [currentToken] at the time the read
+         * was observed in.
          */
         private var currentScopeReads: MutableObjectIntMap<Any>? = null
 
@@ -379,58 +351,44 @@
          */
         private var currentToken: Int = -1
 
-        /**
-         * Values that have been read during the scope's [SnapshotStateObserver.observeReads].
-         */
+        /** Values that have been read during the scope's [SnapshotStateObserver.observeReads]. */
         private val valueToScopes = ScopeMap<Any, Any>()
 
-        /**
-         * Reverse index (scope -> values) for faster scope invalidation.
-         */
+        /** Reverse index (scope -> values) for faster scope invalidation. */
         private val scopeToValues: MutableScatterMap<Any, MutableObjectIntMap<Any>> =
             MutableScatterMap()
 
-        /**
-         * Scopes that were invalidated during previous apply step.
-         */
+        /** Scopes that were invalidated during previous apply step. */
         private val invalidated = MutableScatterSet<Any>()
 
-        /**
-         * Reusable vector for re-recording states inside [recordInvalidation]
-         */
+        /** Reusable vector for re-recording states inside [recordInvalidation] */
         private val statesToReread = mutableVectorOf<DerivedState<*>>()
 
         // derived state handling
 
-        /**
-         * Observer for derived state recalculation
-         */
-        val derivedStateObserver = object : DerivedStateObserver {
-            override fun start(derivedState: DerivedState<*>) {
-                deriveStateScopeCount++
+        /** Observer for derived state recalculation */
+        val derivedStateObserver =
+            object : DerivedStateObserver {
+                override fun start(derivedState: DerivedState<*>) {
+                    deriveStateScopeCount++
+                }
+
+                override fun done(derivedState: DerivedState<*>) {
+                    deriveStateScopeCount--
+                }
             }
 
-            override fun done(derivedState: DerivedState<*>) {
-                deriveStateScopeCount--
-            }
-        }
-
         /**
-         * Counter for skipping reads inside derived states. If count is > 0, read happens inside
-         * a derived state.
-         * Reads for derived states are captured separately through
+         * Counter for skipping reads inside derived states. If count is > 0, read happens inside a
+         * derived state. Reads for derived states are captured separately through
          * [DerivedState.Record.dependencies].
          */
         private var deriveStateScopeCount = 0
 
-        /**
-         * Invalidation index from state objects to derived states reading them.
-         */
+        /** Invalidation index from state objects to derived states reading them. */
         private val dependencyToDerivedStates = ScopeMap<Any, DerivedState<*>>()
 
-        /**
-         * Last derived state value recorded during read.
-         */
+        /** Last derived state value recorded during read. */
         private val recordedDerivedStateValues = HashMap<DerivedState<*>, Any?>()
 
         fun recordRead(value: Any) {
@@ -439,16 +397,16 @@
                 value = value,
                 currentToken = currentToken,
                 currentScope = scope,
-                recordedValues = currentScopeReads ?: MutableObjectIntMap<Any>().also {
-                    currentScopeReads = it
-                    scopeToValues[scope] = it
-                }
+                recordedValues =
+                    currentScopeReads
+                        ?: MutableObjectIntMap<Any>().also {
+                            currentScopeReads = it
+                            scopeToValues[scope] = it
+                        }
             )
         }
 
-        /**
-         * Record that [value] was read in [currentScope].
-         */
+        /** Record that [value] was read in [currentScope]. */
         private fun recordRead(
             value: Any,
             currentToken: Int,
@@ -486,9 +444,7 @@
             }
         }
 
-        /**
-         * Setup new scope for state read observation, observe them, and cleanup afterwards
-         */
+        /** Setup new scope for state read observation, observe them, and cleanup afterwards */
         fun observe(scope: Any, readObserver: (Any) -> Unit, block: () -> Unit) {
             val previousScope = currentScope
             val previousReads = currentScopeReads
@@ -522,33 +478,24 @@
             }
         }
 
-        /**
-         * Clear observations for [scope].
-         */
+        /** Clear observations for [scope]. */
         fun clearScopeObservations(scope: Any) {
             val recordedValues = scopeToValues.remove(scope) ?: return
-            recordedValues.forEach { value, _ ->
-                removeObservation(scope, value)
-            }
+            recordedValues.forEach { value, _ -> removeObservation(scope, value) }
         }
 
-        /**
-         * Remove observations in scopes matching [predicate].
-         */
+        /** Remove observations in scopes matching [predicate]. */
         fun removeScopeIf(predicate: (scope: Any) -> Boolean) {
             scopeToValues.removeIf { scope, valueSet ->
                 predicate(scope).also { willRemove ->
                     if (willRemove) {
-                        valueSet.forEach { value, _ ->
-                            removeObservation(scope, value)
-                        }
+                        valueSet.forEach { value, _ -> removeObservation(scope, value) }
                     }
                 }
             }
         }
 
-        fun hasScopeObservations(): Boolean =
-            scopeToValues.isNotEmpty()
+        fun hasScopeObservations(): Boolean = scopeToValues.isNotEmpty()
 
         private fun removeObservation(scope: Any, value: Any) {
             valueToScopes.remove(value, scope)
@@ -558,9 +505,7 @@
             }
         }
 
-        /**
-         * Clear all observations.
-         */
+        /** Clear all observations. */
         fun clear() {
             valueToScopes.clear()
             scopeToValues.clear()
@@ -570,6 +515,7 @@
 
         /**
          * Record scope invalidation for given set of values.
+         *
          * @return whether any scopes observe changed values
          */
         fun recordInvalidation(changes: Set<Any>): Boolean {
@@ -581,9 +527,7 @@
             val invalidated = invalidated
 
             changes.fastForEach { value ->
-                if (value is StateObjectImpl &&
-                    !value.isReadIn(ReaderKind.SnapshotStateObserver)
-                ) {
+                if (value is StateObjectImpl && !value.isReadIn(ReaderKind.SnapshotStateObserver)) {
                     return@fastForEach
                 }
 
@@ -595,7 +539,8 @@
                         val policy = derivedState.policy ?: structuralEqualityPolicy()
 
                         // Invalidate only if currentValue is different than observed on read
-                        if (!policy.equivalent(
+                        if (
+                            !policy.equivalent(
                                 derivedState.currentRecord.currentValue,
                                 previousValue
                             )
@@ -618,9 +563,7 @@
             }
 
             if (statesToReread.isNotEmpty()) {
-                statesToReread.forEach {
-                    rereadDerivedState(it)
-                }
+                statesToReread.forEach { rereadDerivedState(it) }
                 statesToReread.clear()
             }
 
@@ -636,16 +579,14 @@
                     value = derivedState,
                     currentToken = token,
                     currentScope = scope,
-                    recordedValues = scopeToValues[scope] ?: MutableObjectIntMap<Any>().also {
-                        scopeToValues[scope] = it
-                    }
+                    recordedValues =
+                        scopeToValues[scope]
+                            ?: MutableObjectIntMap<Any>().also { scopeToValues[scope] = it }
                 )
             }
         }
 
-        /**
-         * Call [onChanged] for previously invalidated scopes.
-         */
+        /** Call [onChanged] for previously invalidated scopes. */
         fun notifyInvalidatedScopes() {
             val invalidated = invalidated
             invalidated.forEach(onChanged)
diff --git a/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/snapshots/SnapshotWeakSet.kt b/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/snapshots/SnapshotWeakSet.kt
index f908c43..66075f0 100644
--- a/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/snapshots/SnapshotWeakSet.kt
+++ b/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/snapshots/SnapshotWeakSet.kt
@@ -76,20 +76,14 @@
                 startIndex = insertIndex,
                 endIndex = size
             )
-            values.copyInto(
-                destination = newValues,
-                endIndex = insertIndex
-            )
+            values.copyInto(destination = newValues, endIndex = insertIndex)
             hashes.copyInto(
                 destination = newHashes,
                 destinationOffset = insertIndex + 1,
                 startIndex = insertIndex,
                 endIndex = size
             )
-            hashes.copyInto(
-                destination = newHashes,
-                endIndex = insertIndex
-            )
+            hashes.copyInto(destination = newHashes, endIndex = insertIndex)
             values = newValues
             hashes = newHashes
         } else {
@@ -121,7 +115,7 @@
      *
      * This call is inline to avoid allocations while enumerating the set.
      */
-     inline fun removeIf(block: (T) -> Boolean) {
+    inline fun removeIf(block: (T) -> Boolean) {
         val size = size
         var currentUsed = 0
         // Call `block` on all entries that still have a valid reference
@@ -152,8 +146,8 @@
     }
 
     /**
-     * Returns the index of [value] in the set or the negative index - 1 of the location where
-     * it would have been if it had been in the set.
+     * Returns the index of [value] in the set or the negative index - 1 of the location where it
+     * would have been if it had been in the set.
      */
     private fun find(value: T, hash: Int): Int {
         var low = 0
@@ -176,11 +170,11 @@
     }
 
     /**
-     * When multiple items share the same [identityHashCode], then we must find the specific
-     * index of the target item. This method assumes that [midIndex] has already been checked
-     * for an exact match for [value], but will look at nearby values to find the exact item index.
-     * If no match is found, the negative index - 1 of the position in which it would be will
-     * be returned, which is always after the last item with the same [identityHashCode].
+     * When multiple items share the same [identityHashCode], then we must find the specific index
+     * of the target item. This method assumes that [midIndex] has already been checked for an exact
+     * match for [value], but will look at nearby values to find the exact item index. If no match
+     * is found, the negative index - 1 of the position in which it would be will be returned, which
+     * is always after the last item with the same [identityHashCode].
      */
     private fun findExactIndex(midIndex: Int, value: T, valueHash: Int): Int {
         // hunt down first
diff --git a/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/snapshots/StateObjectImpl.kt b/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/snapshots/StateObjectImpl.kt
index c5cae47..d8d1476 100644
--- a/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/snapshots/StateObjectImpl.kt
+++ b/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/snapshots/StateObjectImpl.kt
@@ -27,6 +27,7 @@
  */
 internal abstract class StateObjectImpl internal constructor() : StateObject {
     private val readerKind = AtomicInt(0)
+
     internal fun recordReadIn(reader: ReaderKind) {
         do {
             val old = ReaderKind(readerKind.get())
@@ -44,12 +45,18 @@
 internal value class ReaderKind(val mask: Int = 0) {
     @Suppress("NOTHING_TO_INLINE")
     inline fun withReadIn(reader: ReaderKind): ReaderKind = ReaderKind(mask or reader.mask)
+
     @Suppress("NOTHING_TO_INLINE")
     inline fun isReadIn(reader: ReaderKind): Boolean = mask and reader.mask != 0
 
     internal companion object {
-        inline val Composition get() = ReaderKind(mask = 1 shl 0)
-        inline val SnapshotStateObserver get() = ReaderKind(mask = 1 shl 1)
-        inline val SnapshotFlow get() = ReaderKind(mask = 1 shl 2)
+        inline val Composition
+            get() = ReaderKind(mask = 1 shl 0)
+
+        inline val SnapshotStateObserver
+            get() = ReaderKind(mask = 1 shl 1)
+
+        inline val SnapshotFlow
+            get() = ReaderKind(mask = 1 shl 2)
     }
 }
diff --git a/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/tooling/CompositionData.kt b/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/tooling/CompositionData.kt
index 0bad0ed..290fe38 100644
--- a/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/tooling/CompositionData.kt
+++ b/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/tooling/CompositionData.kt
@@ -21,13 +21,13 @@
 /**
  * A [CompositionData] is the data tracked by the composer during composition.
  *
- * This interface is not intended to be used directly and is provided to allow the tools API to
- * have access to data tracked during composition. The tools API should be used instead which
- * provides a more usable interpretation of the slot table.
+ * This interface is not intended to be used directly and is provided to allow the tools API to have
+ * access to data tracked during composition. The tools API should be used instead which provides a
+ * more usable interpretation of the slot table.
  */
 interface CompositionData {
     /**
-     * Iterate the composition data in the group.  The composition data is structured as a tree of
+     * Iterate the composition data in the group. The composition data is structured as a tree of
      * values that corresponds to the call graph of the functions that produced the tree.
      * Interspersed are groups that represents the nodes themselves.
      */
@@ -35,16 +35,16 @@
 
     /**
      * Returns true if no composition data has been collected. This occurs when the first
-     * composition into this composition data has not completed yet or, if it is a group, it
-     * doesn't contain any child groups.
+     * composition into this composition data has not completed yet or, if it is a group, it doesn't
+     * contain any child groups.
      */
     val isEmpty: Boolean
 
     /**
      * Find a sub-group by identity. Returns `null` if the group is not found or the implementation
-     * of this interface does not support finding groups by their identity. In other words, a
-     * `null` result from this method should not be interpreted as the identity is not a group in
-     * the composition data.
+     * of this interface does not support finding groups by their identity. In other words, a `null`
+     * result from this method should not be interpreted as the identity is not a group in the
+     * composition data.
      */
     fun find(identityToFind: Any): CompositionGroup? = null
 }
@@ -54,21 +54,21 @@
  * correspond to flow control branches (such as if statements and function calls) as well as
  * emitting of a node to the tree.
  *
- * This interface is not intended to be used directly and is provided to allow the tools API to
- * have access to data tracked during composition. The tools API should be used instead which
- * provides a more usable interpretation of the slot table.
+ * This interface is not intended to be used directly and is provided to allow the tools API to have
+ * access to data tracked during composition. The tools API should be used instead which provides a
+ * more usable interpretation of the slot table.
  */
 @JvmDefaultWithCompatibility
 interface CompositionGroup : CompositionData {
     /**
-     * A value used to identify the group within its siblings and is typically a compiler
-     * generated integer but can be an object if the [key] composable is used.
+     * A value used to identify the group within its siblings and is typically a compiler generated
+     * integer but can be an object if the [key] composable is used.
      */
     val key: Any
 
     /**
-     * Information recorded by the compiler to help tooling identify the source that generated
-     * the group. The format of this string is internal and is interpreted by the tools API which
+     * Information recorded by the compiler to help tooling identify the source that generated the
+     * group. The format of this string is internal and is interpreted by the tools API which
      * translates this information into source file name and offsets.
      */
     val sourceInfo: String?
@@ -80,23 +80,21 @@
     val node: Any?
 
     /**
-     * The data stored in the slot table for this group. This information includes the values
-     * stored for parameters that are checked for change, any value passed as a parameter for
+     * The data stored in the slot table for this group. This information includes the values stored
+     * for parameters that are checked for change, any value passed as a parameter for
      * [androidx.compose.runtime.remember] and the last value returned by
      * [androidx.compose.runtime.remember], etc.
      */
     val data: Iterable<Any?>
 
-    /**
-     * A value that identifies a Group independently of movement caused by recompositions.
-     */
+    /** A value that identifies a Group independently of movement caused by recompositions. */
     val identity: Any?
-      get() = null
+        get() = null
 
-    /**
-     * The total number of groups, including itself, that this group contains.
-     */
-    val groupSize: Int get() = 0
+    /** The total number of groups, including itself, that this group contains. */
+    val groupSize: Int
+        get() = 0
 
-    val slotsSize: Int get() = 0
+    val slotsSize: Int
+        get() = 0
 }
diff --git a/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/tooling/CompositionObserver.kt b/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/tooling/CompositionObserver.kt
index 6f379b2..e3bef5b8 100644
--- a/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/tooling/CompositionObserver.kt
+++ b/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/tooling/CompositionObserver.kt
@@ -23,16 +23,14 @@
 import androidx.compose.runtime.RecomposeScopeImpl
 import androidx.compose.runtime.getCompositionService
 
-/**
- * Observe when the composition begins and ends.
- */
+/** Observe when the composition begins and ends. */
 @ExperimentalComposeRuntimeApi
 @Suppress("CallbackName")
 interface CompositionObserver {
     /**
      * Called when the composition begins on the [composition]. The [invalidationMap] a map of
-     * invalid recompose scopes that are scheduled to be recomposed. The [CompositionObserver]
-     * will be called for the [composition].
+     * invalid recompose scopes that are scheduled to be recomposed. The [CompositionObserver] will
+     * be called for the [composition].
      *
      * The scopes in the [invalidationMap] are not guaranteed to be composed. Some cases where they
      * are not composed are 1) the scope is no longer part of the composition (e.g the parent scope
@@ -44,71 +42,57 @@
      * composition claims it.
      *
      * @param composition the composition that is beginning to be recomposed
-     * @param invalidationMap the recompose scopes that will be recomposed by this composition.
-     *    This list is empty for the initial composition.
+     * @param invalidationMap the recompose scopes that will be recomposed by this composition. This
+     *   list is empty for the initial composition.
      */
     fun onBeginComposition(
         composition: Composition,
         invalidationMap: Map<RecomposeScope, Set<Any>?>
     )
 
-    /**
-     * Called after composition has been completed for [composition].
-     */
+    /** Called after composition has been completed for [composition]. */
     fun onEndComposition(composition: Composition)
 }
 
-/**
- * Observer when a recompose scope is being recomposed or when the scope is disposed.
- */
+/** Observer when a recompose scope is being recomposed or when the scope is disposed. */
 @ExperimentalComposeRuntimeApi
 @Suppress("CallbackName")
 interface RecomposeScopeObserver {
-    /**
-     * Called just before the recompose scope's recompose lambda is invoked.
-     */
+    /** Called just before the recompose scope's recompose lambda is invoked. */
     fun onBeginScopeComposition(scope: RecomposeScope)
 
-    /**
-     * Called just after the recompose scopes' recompose lambda returns.
-     */
+    /** Called just after the recompose scopes' recompose lambda returns. */
     fun onEndScopeComposition(scope: RecomposeScope)
 
-    /**
-     * Called when the recompose scope is disposed.
-     */
+    /** Called when the recompose scope is disposed. */
     fun onScopeDisposed(scope: RecomposeScope)
 }
 
 /**
- * The handle returned by [Composition.observe] and [RecomposeScope.observe]. Calling [dispose]
- * will prevent further composition observation events from being sent to the registered observer.
+ * The handle returned by [Composition.observe] and [RecomposeScope.observe]. Calling [dispose] will
+ * prevent further composition observation events from being sent to the registered observer.
  */
 @ExperimentalComposeRuntimeApi
 interface CompositionObserverHandle {
-    /**
-     * Unregister the observer.
-     */
+    /** Unregister the observer. */
     fun dispose()
 }
 
 /**
- * Observe the composition. Calling this twice on the same composition will implicitly dispose
- * the previous observer. the [CompositionObserver] will be called for this composition and
- * all sub-composition, transitively, for which this composition is a context. If, however,
- * [observe] is called on a sub-composition, it will override the parent composition and
- * notification for it and all sub-composition of it, will go to its observer instead of the
- * one registered for the parent.
+ * Observe the composition. Calling this twice on the same composition will implicitly dispose the
+ * previous observer. the [CompositionObserver] will be called for this composition and all
+ * sub-composition, transitively, for which this composition is a context. If, however, [observe] is
+ * called on a sub-composition, it will override the parent composition and notification for it and
+ * all sub-composition of it, will go to its observer instead of the one registered for the parent.
  *
- * @param observer the observer that will be informed of composition events for this
- * composition and all sub-compositions for which this composition is the composition context.
- * Observing a composition will prevent the parent composition's observer from receiving
- * composition events about this composition.
- *
+ * @param observer the observer that will be informed of composition events for this composition and
+ *   all sub-compositions for which this composition is the composition context. Observing a
+ *   composition will prevent the parent composition's observer from receiving composition events
+ *   about this composition.
  * @return a handle that allows the observer to be disposed and detached from the composition.
- * Disposing an observer for a composition with a parent observer will begin sending the events
- * to the parent composition's observer. A `null` indicates the composition does not support
- * being observed.
+ *   Disposing an observer for a composition with a parent observer will begin sending the events to
+ *   the parent composition's observer. A `null` indicates the composition does not support being
+ *   observed.
  */
 @ExperimentalComposeRuntimeApi
 fun Composition.observe(observer: CompositionObserver): CompositionObserverHandle? =
@@ -116,9 +100,8 @@
 
 /**
  * Observer when this scope recomposes.
-
- * @param observer the observer that will be informed of recompose events for this scope.
  *
+ * @param observer the observer that will be informed of recompose events for this scope.
  * @return a handle that allows the observer to be disposed and detached from the recompose scope.
  */
 @ExperimentalComposeRuntimeApi
diff --git a/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/tooling/InspectionTables.kt b/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/tooling/InspectionTables.kt
index 04e95cb..593708d 100644
--- a/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/tooling/InspectionTables.kt
+++ b/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/tooling/InspectionTables.kt
@@ -18,7 +18,5 @@
 
 import androidx.compose.runtime.staticCompositionLocalOf
 
-/**
- * A set of slot tables that where produced when in inspection mode.
- */
+/** A set of slot tables that where produced when in inspection mode. */
 val LocalInspectionTables = staticCompositionLocalOf<MutableSet<CompositionData>?> { null }
diff --git a/compose/runtime/runtime/src/commonTest/kotlin/androidx/compose/runtime/CompositionTestExtensions.kt b/compose/runtime/runtime/src/commonTest/kotlin/androidx/compose/runtime/CompositionTestExtensions.kt
index bf4fe5d..f18fa53 100644
--- a/compose/runtime/runtime/src/commonTest/kotlin/androidx/compose/runtime/CompositionTestExtensions.kt
+++ b/compose/runtime/runtime/src/commonTest/kotlin/androidx/compose/runtime/CompositionTestExtensions.kt
@@ -19,8 +19,7 @@
 import org.jetbrains.annotations.TestOnly
 
 @TestOnly
-fun Composition.getSlots(): Iterable<Any?> =
-    (this as CompositionImpl).slotTable.slots.asIterable()
+fun Composition.getSlots(): Iterable<Any?> = (this as CompositionImpl).slotTable.slots.asIterable()
 
 @TestOnly
 fun Composer.getInsertTableSlots(): Iterable<Any?> =
diff --git a/compose/runtime/runtime/src/commonTest/kotlin/androidx/compose/runtime/changelist/OperationsTest.kt b/compose/runtime/runtime/src/commonTest/kotlin/androidx/compose/runtime/changelist/OperationsTest.kt
index ff70c28..66ae4f6 100644
--- a/compose/runtime/runtime/src/commonTest/kotlin/androidx/compose/runtime/changelist/OperationsTest.kt
+++ b/compose/runtime/runtime/src/commonTest/kotlin/androidx/compose/runtime/changelist/OperationsTest.kt
@@ -50,8 +50,9 @@
     fun testPush_withNoBlock_writesOperationWithNoArgs() {
         stack.push(NoArgsOperation)
         assertStackState(
-            message = "OpStack was not in the expected state " +
-                "after pushing an operation with no arguments",
+            message =
+                "OpStack was not in the expected state " +
+                    "after pushing an operation with no arguments",
             stack = stack,
             expectedOperations = listOf(NoArgsOperation)
         )
@@ -129,9 +130,8 @@
         }
         assertStackState(
             stack = stack,
-            expectedOperations = listOf(
-                OneObjectOperation, TwoObjectsOperation, ThreeObjectsOperation
-            ),
+            expectedOperations =
+                listOf(OneObjectOperation, TwoObjectsOperation, ThreeObjectsOperation),
             expectedObjArgs = listOf(null, "Hello", "World", Unit, "Another string", 123.456)
         )
     }
@@ -192,18 +192,24 @@
         }
 
         assertStackState(
-            message = "Stack was not in the expected state after pushing " +
-                "$itemsToForceResize operations, requiring that the stack resize all " +
-                "of its internal arrays.",
+            message =
+                "Stack was not in the expected state after pushing " +
+                    "$itemsToForceResize operations, requiring that the stack resize all " +
+                    "of its internal arrays.",
             stack = stack,
-            expectedOperations = List(itemsToForceResize) { TwoIntsOperation } +
-                List(itemsToForceResize) { TwoObjectsOperation },
-            expectedIntArgs = generateSequence(0) { it + 1 }
-                .flatMap { sequenceOf(it * 10 + 1, it * 10 + 2) }
-                .take(itemsToForceResize * TwoIntsOperation.ints).toList(),
-            expectedObjArgs = generateSequence(0) { it + 1 }
-                .flatMap { sequenceOf("op $it, obj 1", "op $it, obj 2") }
-                .take(itemsToForceResize * TwoObjectsOperation.objects).toList()
+            expectedOperations =
+                List(itemsToForceResize) { TwoIntsOperation } +
+                    List(itemsToForceResize) { TwoObjectsOperation },
+            expectedIntArgs =
+                generateSequence(0) { it + 1 }
+                    .flatMap { sequenceOf(it * 10 + 1, it * 10 + 2) }
+                    .take(itemsToForceResize * TwoIntsOperation.ints)
+                    .toList(),
+            expectedObjArgs =
+                generateSequence(0) { it + 1 }
+                    .flatMap { sequenceOf("op $it, obj 1", "op $it, obj 2") }
+                    .take(itemsToForceResize * TwoObjectsOperation.objects)
+                    .toList()
         )
     }
 
@@ -220,8 +226,9 @@
             )
         } catch (e: IllegalStateException) {
             assertTrue(
-                message = "The thrown exception does not appear to have reported the expected " +
-                    "error (its message is '${e.message}')",
+                message =
+                    "The thrown exception does not appear to have reported the expected " +
+                        "error (its message is '${e.message}')",
                 actual = e.message.orEmpty().contains("Not all arguments were provided")
             )
         }
@@ -240,8 +247,9 @@
             )
         } catch (e: IllegalStateException) {
             assertTrue(
-                message = "The thrown exception does not appear to have reported the expected " +
-                    "error (its message is '${e.message}')",
+                message =
+                    "The thrown exception does not appear to have reported the expected " +
+                        "error (its message is '${e.message}')",
                 actual = e.message.orEmpty().contains("Not all arguments were provided")
             )
         }
@@ -258,8 +266,9 @@
             fail("Pushing an operation should fail if an argument is set twice")
         } catch (e: IllegalStateException) {
             assertTrue(
-                message = "The thrown exception does not appear to have reported the expected " +
-                    "error (its message is '${e.message}')",
+                message =
+                    "The thrown exception does not appear to have reported the expected " +
+                        "error (its message is '${e.message}')",
                 actual = e.message.orEmpty().contains("Already pushed argument")
             )
         }
@@ -276,8 +285,9 @@
             fail("Pushing an operation should fail if an argument is set twice")
         } catch (e: IllegalStateException) {
             assertTrue(
-                message = "The thrown exception does not appear to have reported the expected " +
-                    "error (its message is '${e.message}')",
+                message =
+                    "The thrown exception does not appear to have reported the expected " +
+                        "error (its message is '${e.message}')",
                 actual = e.message.orEmpty().contains("Already pushed argument")
             )
         }
@@ -356,18 +366,22 @@
             message = "Source stack did not initialize to the expected state",
             stack = stack,
             expectedOperations = List(40) { ThreeObjectsOperation },
-            expectedObjArgs = generateSequence(0) { it + 1 }
-                .flatMap { sequenceOf("${it}A", "${it}B", "${it}C") }
-                .take(40 * ThreeObjectsOperation.objects).toList()
+            expectedObjArgs =
+                generateSequence(0) { it + 1 }
+                    .flatMap { sequenceOf("${it}A", "${it}B", "${it}C") }
+                    .take(40 * ThreeObjectsOperation.objects)
+                    .toList()
         )
 
         assertStackState(
             message = "Destination stack did not initialize to the expected state",
             stack = destinationStack,
             expectedOperations = List(20) { ThreeIntsOperation },
-            expectedIntArgs = generateSequence(0) { it + 1 }
-                .flatMap { sequenceOf(it * 10, it * 20, it * 30) }
-                .take(20 * ThreeIntsOperation.ints).toList()
+            expectedIntArgs =
+                generateSequence(0) { it + 1 }
+                    .flatMap { sequenceOf(it * 10, it * 20, it * 30) }
+                    .take(20 * ThreeIntsOperation.ints)
+                    .toList()
         )
 
         stack.popInto(destinationStack)
@@ -376,18 +390,22 @@
             message = "The last pushed operation was not removed from the source stack as expected",
             stack = stack,
             expectedOperations = List(39) { ThreeObjectsOperation },
-            expectedObjArgs = generateSequence(0) { it + 1 }
-                .flatMap { sequenceOf("${it}A", "${it}B", "${it}C") }
-                .take(39 * ThreeObjectsOperation.objects).toList()
+            expectedObjArgs =
+                generateSequence(0) { it + 1 }
+                    .flatMap { sequenceOf("${it}A", "${it}B", "${it}C") }
+                    .take(39 * ThreeObjectsOperation.objects)
+                    .toList()
         )
 
         assertStackState(
             message = "The popped item was not added to the destination stack as expected",
             stack = destinationStack,
             expectedOperations = List(20) { ThreeIntsOperation } + ThreeObjectsOperation,
-            expectedIntArgs = generateSequence(0) { it + 1 }
-                .flatMap { sequenceOf(it * 10, it * 20, it * 30) }
-                .take(20 * ThreeIntsOperation.ints).toList(),
+            expectedIntArgs =
+                generateSequence(0) { it + 1 }
+                    .flatMap { sequenceOf(it * 10, it * 20, it * 30) }
+                    .take(20 * ThreeIntsOperation.ints)
+                    .toList(),
             expectedObjArgs = listOf("39A", "39B", "39C")
         )
     }
@@ -411,12 +429,16 @@
             message = "Stack was not seeded into the expected state",
             stack = stack,
             expectedOperations = List(operationCount) { MixedOperation },
-            expectedIntArgs = generateSequence(0) { it + 1 }
-                .flatMap { sequenceOf(it, -it) }
-                .take(operationCount * MixedOperation.ints).toList(),
-            expectedObjArgs = generateSequence(0) { it + 1 }
-                .flatMap { sequenceOf("obj1:$it", "obj2:$it") }
-                .take(operationCount * MixedOperation.objects).toList(),
+            expectedIntArgs =
+                generateSequence(0) { it + 1 }
+                    .flatMap { sequenceOf(it, -it) }
+                    .take(operationCount * MixedOperation.ints)
+                    .toList(),
+            expectedObjArgs =
+                generateSequence(0) { it + 1 }
+                    .flatMap { sequenceOf("obj1:$it", "obj2:$it") }
+                    .take(operationCount * MixedOperation.objects)
+                    .toList(),
         )
 
         stack.clear()
@@ -435,9 +457,7 @@
         val capturedObjects = mutableListOf<Any?>()
         stack.drain {
             capturedOperations += operation
-            repeat(operation.ints) { offset ->
-                capturedInts += getInt(IntParameter(offset))
-            }
+            repeat(operation.ints) { offset -> capturedInts += getInt(IntParameter(offset)) }
             repeat(operation.objects) { offset ->
                 capturedObjects += getObject(ObjectParameter<Any?>(offset))
             }
@@ -445,10 +465,14 @@
 
         assertEquals(
             message = "The stack's operations were not received in the expected order.",
-            expected = listOf<Operation>(
-                MixedOperation, NoArgsOperation, TwoIntsOperation,
-                ThreeObjectsOperation, NoArgsOperation
-            ),
+            expected =
+                listOf<Operation>(
+                    MixedOperation,
+                    NoArgsOperation,
+                    TwoIntsOperation,
+                    ThreeObjectsOperation,
+                    NoArgsOperation
+                ),
             actual = capturedOperations
         )
 
@@ -464,10 +488,7 @@
             actual = capturedObjects
         )
 
-        assertStackState(
-            message = "Stack should be empty after calling drain()",
-            stack = stack
-        )
+        assertStackState(message = "Stack should be empty after calling drain()", stack = stack)
     }
 
     @Test
@@ -479,9 +500,7 @@
         val capturedObjects = mutableListOf<Any?>()
         stack.forEach {
             capturedOperations += operation
-            repeat(operation.ints) { offset ->
-                capturedInts += getInt(IntParameter(offset))
-            }
+            repeat(operation.ints) { offset -> capturedInts += getInt(IntParameter(offset)) }
             repeat(operation.objects) { offset ->
                 capturedObjects += getObject(ObjectParameter<Any?>(offset))
             }
@@ -489,10 +508,14 @@
 
         assertEquals(
             message = "The stack's operations were not received in the expected order.",
-            expected = listOf<Operation>(
-                MixedOperation, NoArgsOperation, TwoIntsOperation,
-                ThreeObjectsOperation, NoArgsOperation
-            ),
+            expected =
+                listOf<Operation>(
+                    MixedOperation,
+                    NoArgsOperation,
+                    TwoIntsOperation,
+                    ThreeObjectsOperation,
+                    NoArgsOperation
+                ),
             actual = capturedOperations
         )
 
@@ -547,17 +570,18 @@
         }
     }
 
-    private fun assertStackInVariousOperationState(
-        message: String = "",
-        stack: Operations
-    ) {
+    private fun assertStackInVariousOperationState(message: String = "", stack: Operations) {
         assertStackState(
             message = message,
             stack = stack,
-            expectedOperations = listOf(
-                MixedOperation, NoArgsOperation, TwoIntsOperation,
-                ThreeObjectsOperation, NoArgsOperation
-            ),
+            expectedOperations =
+                listOf(
+                    MixedOperation,
+                    NoArgsOperation,
+                    TwoIntsOperation,
+                    ThreeObjectsOperation,
+                    NoArgsOperation
+                ),
             expectedIntArgs = listOf(999, -1, 0xABCDEF, 0x123456),
             expectedObjArgs = listOf("String 1", "String 2", 1.0, Unit, null)
         )
@@ -576,39 +600,45 @@
         val isEmpty = stack.isEmpty()
         val isNotEmpty = stack.isNotEmpty()
         if (size != expectedOperations.size) {
-            errors += "Stack did not report correct size " +
-                "(expected ${expectedOperations.size}, was $size)"
+            errors +=
+                "Stack did not report correct size " +
+                    "(expected ${expectedOperations.size}, was $size)"
         }
 
         if (isEmpty != expectedOperations.isEmpty()) {
-            errors += "isEmpty() did not return expected value " +
-                "(expected ${expectedOperations.isEmpty()}, was $isEmpty)"
+            errors +=
+                "isEmpty() did not return expected value " +
+                    "(expected ${expectedOperations.isEmpty()}, was $isEmpty)"
         }
 
         if (isNotEmpty != expectedOperations.isNotEmpty()) {
-            errors += "isNotEmpty() did not return expected value " +
-                "(expected ${expectedOperations.isNotEmpty()}, was $isNotEmpty)"
+            errors +=
+                "isNotEmpty() did not return expected value " +
+                    "(expected ${expectedOperations.isNotEmpty()}, was $isNotEmpty)"
         }
 
         val actualOpCodes = stack.opCodes
         if (!actualOpCodes.asIterable().startsWith(expectedOperations)) {
-            errors += "opCodes array did not match expected operations " +
-                "(expected [${expectedOperations.joinToString()}], was " +
-                "[${actualOpCodes.joinToString()}])"
+            errors +=
+                "opCodes array did not match expected operations " +
+                    "(expected [${expectedOperations.joinToString()}], was " +
+                    "[${actualOpCodes.joinToString()}])"
         }
 
         val actualIntArgs = stack.intArgs
         if (!actualIntArgs.asIterable().startsWith(expectedIntArgs)) {
-            errors += "intArgs array did not match expected operations " +
-                "(expected [${expectedIntArgs.joinToString()}], was " +
-                "[${actualIntArgs.joinToString()}])"
+            errors +=
+                "intArgs array did not match expected operations " +
+                    "(expected [${expectedIntArgs.joinToString()}], was " +
+                    "[${actualIntArgs.joinToString()}])"
         }
 
         val actualObjectArgs = stack.objectArgs
         if (!actualObjectArgs.asIterable().startsWith(expectedObjArgs, null)) {
-            errors += "objectArgs array did not match expected operations " +
-                "(expected [${expectedObjArgs.joinToString()}], was " +
-                "[${actualObjectArgs.joinToString()}])"
+            errors +=
+                "objectArgs array did not match expected operations " +
+                    "(expected [${expectedObjArgs.joinToString()}], was " +
+                    "[${actualObjectArgs.joinToString()}])"
         }
 
         if (errors.isNotEmpty()) {
@@ -620,9 +650,7 @@
         }
     }
 
-    private fun <T> Iterable<T>.startsWith(
-        other: Iterable<T>
-    ): Boolean {
+    private fun <T> Iterable<T>.startsWith(other: Iterable<T>): Boolean {
         val thisIterator = iterator()
         val otherIterator = other.iterator()
 
@@ -635,10 +663,7 @@
         return true
     }
 
-    private fun <T> Iterable<T>.startsWith(
-        other: Iterable<T>,
-        endFill: T
-    ): Boolean {
+    private fun <T> Iterable<T>.startsWith(other: Iterable<T>, endFill: T): Boolean {
         val thisIterator = iterator()
         val otherIterator = other.iterator()
 
@@ -657,17 +682,26 @@
         return true
     }
 
-    private val Operations.opCodes: Array<Operation?> get() = readPropertyReflectively("opCodes")
-    private val Operations.intArgs: IntArray get() = readPropertyReflectively("intArgs")
-    private val Operations.objectArgs: Array<Any?> get() = readPropertyReflectively("objectArgs")
+    private val Operations.opCodes: Array<Operation?>
+        get() = readPropertyReflectively("opCodes")
+
+    private val Operations.intArgs: IntArray
+        get() = readPropertyReflectively("intArgs")
+
+    private val Operations.objectArgs: Array<Any?>
+        get() = readPropertyReflectively("objectArgs")
 
     private inline fun <reified T : Any, reified R> T.readPropertyReflectively(
         propertyName: String
     ): R {
-        val property = this::class.declaredMembers.mapNotNull {
-            @Suppress("UNCHECKED_CAST")
-            it as? KProperty1<T, R>
-        }.single { it.name == propertyName }
+        val property =
+            this::class
+                .declaredMembers
+                .mapNotNull {
+                    @Suppress("UNCHECKED_CAST")
+                    it as? KProperty1<T, R>
+                }
+                .single { it.name == propertyName }
 
         property.isAccessible = true
         return property.get(this)
diff --git a/compose/runtime/runtime/src/commonTest/kotlin/androidx/compose/runtime/internal/FloatingPointEqualityTest.kt b/compose/runtime/runtime/src/commonTest/kotlin/androidx/compose/runtime/internal/FloatingPointEqualityTest.kt
index c943082..fb43523 100644
--- a/compose/runtime/runtime/src/commonTest/kotlin/androidx/compose/runtime/internal/FloatingPointEqualityTest.kt
+++ b/compose/runtime/runtime/src/commonTest/kotlin/androidx/compose/runtime/internal/FloatingPointEqualityTest.kt
@@ -128,41 +128,37 @@
         assertEqualsWithNanFix(Double.NEGATIVE_INFINITY, Double.NEGATIVE_INFINITY)
     }
 
-    private fun assertNotEqualsWithNanFix(
-        first: Float,
-        second: Float
-    ) = assertFalse(
-        message = "$first (${first.bitString}) == $second (${second.bitString}) " +
-            "returned true, expected false",
-        actual = first.equalsWithNanFix(second)
-    )
+    private fun assertNotEqualsWithNanFix(first: Float, second: Float) =
+        assertFalse(
+            message =
+                "$first (${first.bitString}) == $second (${second.bitString}) " +
+                    "returned true, expected false",
+            actual = first.equalsWithNanFix(second)
+        )
 
-    private fun assertEqualsWithNanFix(
-        first: Float,
-        second: Float
-    ) = assertTrue(
-        message = "$first (${first.bitString}) == $second (${second.bitString}) " +
-            "returned false, expected true",
-        actual = first.equalsWithNanFix(second)
-    )
+    private fun assertEqualsWithNanFix(first: Float, second: Float) =
+        assertTrue(
+            message =
+                "$first (${first.bitString}) == $second (${second.bitString}) " +
+                    "returned false, expected true",
+            actual = first.equalsWithNanFix(second)
+        )
 
-    private fun assertNotEqualsWithNanFix(
-        first: Double,
-        second: Double
-    ) = assertFalse(
-        message = "$first (${first.bitString}) == $second (${second.bitString}) " +
-            "returned true, expected false",
-        actual = first.equalsWithNanFix(second)
-    )
+    private fun assertNotEqualsWithNanFix(first: Double, second: Double) =
+        assertFalse(
+            message =
+                "$first (${first.bitString}) == $second (${second.bitString}) " +
+                    "returned true, expected false",
+            actual = first.equalsWithNanFix(second)
+        )
 
-    private fun assertEqualsWithNanFix(
-        first: Double,
-        second: Double
-    ) = assertTrue(
-        message = "$first (${first.bitString}) == $second (${second.bitString}) " +
-            "returned false, expected true",
-        actual = first.equalsWithNanFix(second)
-    )
+    private fun assertEqualsWithNanFix(first: Double, second: Double) =
+        assertTrue(
+            message =
+                "$first (${first.bitString}) == $second (${second.bitString}) " +
+                    "returned false, expected true",
+            actual = first.equalsWithNanFix(second)
+        )
 
     private val Float.bitString
         get() = "0x" + toBits().toUInt().toString(16).padStart(length = 8, '0')
diff --git a/compose/runtime/runtime/src/desktopMain/kotlin/androidx/compose/runtime/MonotonicFrameClock.desktop.kt b/compose/runtime/runtime/src/desktopMain/kotlin/androidx/compose/runtime/MonotonicFrameClock.desktop.kt
index 2316702..53c3de7 100644
--- a/compose/runtime/runtime/src/desktopMain/kotlin/androidx/compose/runtime/MonotonicFrameClock.desktop.kt
+++ b/compose/runtime/runtime/src/desktopMain/kotlin/androidx/compose/runtime/MonotonicFrameClock.desktop.kt
@@ -21,9 +21,7 @@
 private object DefaultDelayMonotonicFrameClock : MonotonicFrameClock {
     private const val DefaultFrameDelay = 16L // milliseconds
 
-    override suspend fun <R> withFrameNanos(
-        onFrame: (Long) -> R
-    ): R {
+    override suspend fun <R> withFrameNanos(onFrame: (Long) -> R): R {
         delay(DefaultFrameDelay)
         return onFrame(System.nanoTime())
     }
@@ -33,4 +31,5 @@
     "MonotonicFrameClocks are not globally applicable across platforms. " +
         "Use an appropriate local clock."
 )
-actual val DefaultMonotonicFrameClock: MonotonicFrameClock get() = DefaultDelayMonotonicFrameClock
+actual val DefaultMonotonicFrameClock: MonotonicFrameClock
+    get() = DefaultDelayMonotonicFrameClock
diff --git a/compose/runtime/runtime/src/desktopMain/kotlin/androidx/compose/runtime/collection/ActualIntMap.desktop.kt b/compose/runtime/runtime/src/desktopMain/kotlin/androidx/compose/runtime/collection/ActualIntMap.desktop.kt
index db3c120..4ecb796 100644
--- a/compose/runtime/runtime/src/desktopMain/kotlin/androidx/compose/runtime/collection/ActualIntMap.desktop.kt
+++ b/compose/runtime/runtime/src/desktopMain/kotlin/androidx/compose/runtime/collection/ActualIntMap.desktop.kt
@@ -22,17 +22,13 @@
     private var _size = 0
     private var values = Array<Any?>(initialCapacity) { null }
 
-    /**
-     * True if this map contains key
-     */
+    /** True if this map contains key */
     actual operator fun contains(key: Int): Boolean {
         val index = keys.binarySearch(_size, key)
         return index >= 0 && values[index] !== DELETED
     }
 
-    /**
-     * Get [key] or null
-     */
+    /** Get [key] or null */
     actual operator fun get(key: Int): E? {
         val index = keys.binarySearch(_size, key)
         return if (index >= 0 && values[index] !== DELETED) {
@@ -43,9 +39,7 @@
         }
     }
 
-    /**
-     * Get [key] or [valueIfAbsent]
-     */
+    /** Get [key] or [valueIfAbsent] */
     actual fun get(key: Int, valueIfAbsent: E): E {
         val index = keys.binarySearch(_size, key)
         return if (index >= 0 && values[index] !== DELETED) {
@@ -56,9 +50,7 @@
         }
     }
 
-    /**
-     * Set [key] to [value]
-     */
+    /** Set [key] to [value] */
     actual operator fun set(key: Int, value: E) {
         var index = keys.binarySearch(_size, key)
         if (index >= 0) {
@@ -85,9 +77,7 @@
         }
     }
 
-    /**
-     * Clear this map
-     */
+    /** Clear this map */
     actual fun clear() {
         _size = 0
         for (i in keys.indices) {
@@ -98,9 +88,7 @@
         }
     }
 
-    /**
-     * Current count of (key, value) pairs
-     */
+    /** Current count of (key, value) pairs */
     actual val size: Int
         get() = _size
 }
diff --git a/compose/runtime/runtime/src/jvmMain/kotlin/androidx/compose/runtime/internal/Atomic.jvm.kt b/compose/runtime/runtime/src/jvmMain/kotlin/androidx/compose/runtime/internal/Atomic.jvm.kt
index a7dc737..e1c38d0 100644
--- a/compose/runtime/runtime/src/jvmMain/kotlin/androidx/compose/runtime/internal/Atomic.jvm.kt
+++ b/compose/runtime/runtime/src/jvmMain/kotlin/androidx/compose/runtime/internal/Atomic.jvm.kt
@@ -26,6 +26,8 @@
 
     // These are implemented by Number, but Kotlin fails to resolve them
     override fun toByte(): Byte = toInt().toByte()
+
     override fun toShort(): Short = toInt().toShort()
+
     override fun toChar(): Char = toInt().toChar()
 }
diff --git a/compose/runtime/runtime/src/jvmMain/kotlin/androidx/compose/runtime/internal/ComposableLambda.jvm.kt b/compose/runtime/runtime/src/jvmMain/kotlin/androidx/compose/runtime/internal/ComposableLambda.jvm.kt
index 3bf6004..157540c 100644
--- a/compose/runtime/runtime/src/jvmMain/kotlin/androidx/compose/runtime/internal/ComposableLambda.jvm.kt
+++ b/compose/runtime/runtime/src/jvmMain/kotlin/androidx/compose/runtime/internal/ComposableLambda.jvm.kt
@@ -33,22 +33,183 @@
     Function9<Any?, Any?, Any?, Any?, Any?, Any?, Any?, Composer, Int, Any?>,
     Function10<Any?, Any?, Any?, Any?, Any?, Any?, Any?, Any?, Composer, Int, Any?>,
     Function11<Any?, Any?, Any?, Any?, Any?, Any?, Any?, Any?, Any?, Composer, Int, Any?>,
-    Function13<Any?, Any?, Any?, Any?, Any?, Any?, Any?, Any?, Any?, Any?, Composer, Int, Int,
-        Any?>,
-    Function14<Any?, Any?, Any?, Any?, Any?, Any?, Any?, Any?, Any?, Any?, Any?, Composer, Int, Int,
-        Any?>,
-    Function15<Any?, Any?, Any?, Any?, Any?, Any?, Any?, Any?, Any?, Any?, Any?, Any?, Composer,
-        Int, Int, Any?>,
-    Function16<Any?, Any?, Any?, Any?, Any?, Any?, Any?, Any?, Any?, Any?, Any?, Any?, Any?,
-        Composer, Int, Int, Any?>,
-    Function17<Any?, Any?, Any?, Any?, Any?, Any?, Any?, Any?, Any?, Any?, Any?, Any?, Any?, Any?,
-        Composer, Int,
-        Int, Any?>,
-    Function18<Any?, Any?, Any?, Any?, Any?, Any?, Any?, Any?, Any?, Any?, Any?, Any?, Any?, Any?,
-        Any?, Composer, Int, Int, Any?>,
-    Function19<Any?, Any?, Any?, Any?, Any?, Any?, Any?, Any?, Any?, Any?, Any?, Any?, Any?, Any?,
-        Any?, Any?, Composer, Int, Int, Any?>,
-    Function20<Any?, Any?, Any?, Any?, Any?, Any?, Any?, Any?, Any?, Any?, Any?, Any?, Any?, Any?,
-        Any?, Any?, Any?, Composer, Int, Int, Any?>,
-    Function21<Any?, Any?, Any?, Any?, Any?, Any?, Any?, Any?, Any?, Any?, Any?, Any?, Any?, Any?,
-        Any?, Any?, Any?, Any?, Composer, Int, Int, Any?>
+    Function13<
+        Any?,
+        Any?,
+        Any?,
+        Any?,
+        Any?,
+        Any?,
+        Any?,
+        Any?,
+        Any?,
+        Any?,
+        Composer,
+        Int,
+        Int,
+        Any?
+    >,
+    Function14<
+        Any?,
+        Any?,
+        Any?,
+        Any?,
+        Any?,
+        Any?,
+        Any?,
+        Any?,
+        Any?,
+        Any?,
+        Any?,
+        Composer,
+        Int,
+        Int,
+        Any?
+    >,
+    Function15<
+        Any?,
+        Any?,
+        Any?,
+        Any?,
+        Any?,
+        Any?,
+        Any?,
+        Any?,
+        Any?,
+        Any?,
+        Any?,
+        Any?,
+        Composer,
+        Int,
+        Int,
+        Any?
+    >,
+    Function16<
+        Any?,
+        Any?,
+        Any?,
+        Any?,
+        Any?,
+        Any?,
+        Any?,
+        Any?,
+        Any?,
+        Any?,
+        Any?,
+        Any?,
+        Any?,
+        Composer,
+        Int,
+        Int,
+        Any?
+    >,
+    Function17<
+        Any?,
+        Any?,
+        Any?,
+        Any?,
+        Any?,
+        Any?,
+        Any?,
+        Any?,
+        Any?,
+        Any?,
+        Any?,
+        Any?,
+        Any?,
+        Any?,
+        Composer,
+        Int,
+        Int,
+        Any?
+    >,
+    Function18<
+        Any?,
+        Any?,
+        Any?,
+        Any?,
+        Any?,
+        Any?,
+        Any?,
+        Any?,
+        Any?,
+        Any?,
+        Any?,
+        Any?,
+        Any?,
+        Any?,
+        Any?,
+        Composer,
+        Int,
+        Int,
+        Any?
+    >,
+    Function19<
+        Any?,
+        Any?,
+        Any?,
+        Any?,
+        Any?,
+        Any?,
+        Any?,
+        Any?,
+        Any?,
+        Any?,
+        Any?,
+        Any?,
+        Any?,
+        Any?,
+        Any?,
+        Any?,
+        Composer,
+        Int,
+        Int,
+        Any?
+    >,
+    Function20<
+        Any?,
+        Any?,
+        Any?,
+        Any?,
+        Any?,
+        Any?,
+        Any?,
+        Any?,
+        Any?,
+        Any?,
+        Any?,
+        Any?,
+        Any?,
+        Any?,
+        Any?,
+        Any?,
+        Any?,
+        Composer,
+        Int,
+        Int,
+        Any?
+    >,
+    Function21<
+        Any?,
+        Any?,
+        Any?,
+        Any?,
+        Any?,
+        Any?,
+        Any?,
+        Any?,
+        Any?,
+        Any?,
+        Any?,
+        Any?,
+        Any?,
+        Any?,
+        Any?,
+        Any?,
+        Any?,
+        Any?,
+        Composer,
+        Int,
+        Int,
+        Any?
+    >
diff --git a/compose/runtime/runtime/src/jvmMain/kotlin/androidx/compose/runtime/internal/ComposableLambdaN.jvm.kt b/compose/runtime/runtime/src/jvmMain/kotlin/androidx/compose/runtime/internal/ComposableLambdaN.jvm.kt
index 7614e9e..57af33f 100644
--- a/compose/runtime/runtime/src/jvmMain/kotlin/androidx/compose/runtime/internal/ComposableLambdaN.jvm.kt
+++ b/compose/runtime/runtime/src/jvmMain/kotlin/androidx/compose/runtime/internal/ComposableLambdaN.jvm.kt
@@ -15,6 +15,7 @@
  */
 
 @file:OptIn(InternalComposeApi::class)
+
 package androidx.compose.runtime.internal
 
 import androidx.compose.runtime.Composable
@@ -114,33 +115,24 @@
         val lastChanged = args[args.size - 1] as Int
         c = c.startRestartGroup(key)
         trackRead(c)
-        val dirty = lastChanged or if (c.changed(this))
-            differentBits(realParams)
-        else
-            sameBits(realParams)
-        @Suppress("UNCHECKED_CAST")
-        val result = (_block as FunctionN<*>)(*allArgsButLast, dirty)
+        val dirty =
+            lastChanged or if (c.changed(this)) differentBits(realParams) else sameBits(realParams)
+        @Suppress("UNCHECKED_CAST") val result = (_block as FunctionN<*>)(*allArgsButLast, dirty)
         c.endRestartGroup()?.updateScope { nc, _ ->
             val params = args.slice(0 until realParams).toTypedArray()
             @Suppress("UNUSED_VARIABLE")
             val changed = updateChangedFlags(args[realParams + 1] as Int)
-            val changedN = Array<Any?>(args.size - realParams - 2) { index ->
-                updateChangedFlags(args[realParams + 2 + index] as Int)
-            }
-            this(
-                *params,
-                nc,
-                changed or 0b1,
-                *changedN
-            )
+            val changedN =
+                Array<Any?>(args.size - realParams - 2) { index ->
+                    updateChangedFlags(args[realParams + 2 + index] as Int)
+                }
+            this(*params, nc, changed or 0b1, *changedN)
         }
         return result
     }
 }
 
-@Stable
-@ComposeCompilerApi
-interface ComposableLambdaN : FunctionN<Any?>
+@Stable @ComposeCompilerApi interface ComposableLambdaN : FunctionN<Any?>
 
 @Suppress("unused")
 @ComposeCompilerApi
@@ -153,14 +145,15 @@
 ): ComposableLambdaN {
     composer.startReplaceableGroup(key)
     val slot = composer.rememberedValue()
-    val result = if (slot === Composer.Empty) {
-        val value = ComposableLambdaNImpl(key, tracked, arity)
-        composer.updateRememberedValue(value)
-        value
-    } else {
-        @Suppress("UNCHECKED_CAST")
-        slot as ComposableLambdaNImpl
-    }
+    val result =
+        if (slot === Composer.Empty) {
+            val value = ComposableLambdaNImpl(key, tracked, arity)
+            composer.updateRememberedValue(value)
+            value
+        } else {
+            @Suppress("UNCHECKED_CAST")
+            slot as ComposableLambdaNImpl
+        }
     result.update(block)
     composer.endReplaceableGroup()
     return result
@@ -174,9 +167,8 @@
     tracked: Boolean,
     arity: Int,
     block: Any
-): ComposableLambdaN = remember { ComposableLambdaNImpl(key, tracked, arity) }.also {
-    it.update(block)
-}
+): ComposableLambdaN =
+    remember { ComposableLambdaNImpl(key, tracked, arity) }.also { it.update(block) }
 
 @Suppress("unused")
 @ComposeCompilerApi
@@ -185,8 +177,4 @@
     tracked: Boolean,
     arity: Int,
     block: Any
-): ComposableLambdaN = ComposableLambdaNImpl(
-    key,
-    tracked,
-    arity
-).apply { update(block) }
+): ComposableLambdaN = ComposableLambdaNImpl(key, tracked, arity).apply { update(block) }
diff --git a/compose/runtime/runtime/src/jvmMain/kotlin/androidx/compose/runtime/internal/Utils.jvm.kt b/compose/runtime/runtime/src/jvmMain/kotlin/androidx/compose/runtime/internal/Utils.jvm.kt
index 12f6c97..27b0be1 100644
--- a/compose/runtime/runtime/src/jvmMain/kotlin/androidx/compose/runtime/internal/Utils.jvm.kt
+++ b/compose/runtime/runtime/src/jvmMain/kotlin/androidx/compose/runtime/internal/Utils.jvm.kt
@@ -20,18 +20,15 @@
 import androidx.compose.runtime.Composer
 import kotlinx.coroutines.CancellationException
 
-internal actual fun identityHashCode(instance: Any?): Int =
-    System.identityHashCode(instance)
+internal actual fun identityHashCode(instance: Any?): Int = System.identityHashCode(instance)
 
 internal actual fun invokeComposable(composer: Composer, composable: @Composable () -> Unit) {
-    @Suppress("UNCHECKED_CAST")
-    val realFn = composable as Function2<Composer, Int, Unit>
+    @Suppress("UNCHECKED_CAST") val realFn = composable as Function2<Composer, Int, Unit>
     realFn(composer, 1)
 }
 
-internal actual abstract class PlatformOptimizedCancellationException actual constructor(
-    message: String?
-) : CancellationException(message) {
+internal actual abstract class PlatformOptimizedCancellationException
+actual constructor(message: String?) : CancellationException(message) {
 
     override fun fillInStackTrace(): Throwable {
         // Avoid null.clone() on Android <= 6.0 when accessing stackTrace
diff --git a/compose/runtime/runtime/src/jvmMain/kotlin/androidx/compose/runtime/reflect/ComposableMethod.jvm.kt b/compose/runtime/runtime/src/jvmMain/kotlin/androidx/compose/runtime/reflect/ComposableMethod.jvm.kt
index 86565a0..b34353b 100644
--- a/compose/runtime/runtime/src/jvmMain/kotlin/androidx/compose/runtime/reflect/ComposableMethod.jvm.kt
+++ b/compose/runtime/runtime/src/jvmMain/kotlin/androidx/compose/runtime/reflect/ComposableMethod.jvm.kt
@@ -30,20 +30,14 @@
 private fun changedParamCount(realValueParams: Int, thisParams: Int): Int {
     if (realValueParams == 0) return 1
     val totalParams = realValueParams + thisParams
-    return ceil(
-        totalParams.toDouble() / SLOTS_PER_INT.toDouble()
-    ).toInt()
+    return ceil(totalParams.toDouble() / SLOTS_PER_INT.toDouble()).toInt()
 }
 
 private fun defaultParamCount(realValueParams: Int): Int {
-    return ceil(
-        realValueParams.toDouble() / BITS_PER_INT.toDouble()
-    ).toInt()
+    return ceil(realValueParams.toDouble() / BITS_PER_INT.toDouble()).toInt()
 }
 
-/**
- * Structure intended to be used exclusively by [getComposableInfo].
- */
+/** Structure intended to be used exclusively by [getComposableInfo]. */
 internal data class ComposableInfo(
     val isComposable: Boolean,
     val realParamsCount: Int,
@@ -62,15 +56,13 @@
     }
     val thisParams = if (Modifier.isStatic(this.modifiers)) 0 else 1
     val changedParams = changedParamCount(realParamsCount, thisParams)
-    val totalParamsWithoutDefaults = realParamsCount +
-        1 + // composer
-        changedParams
+    val totalParamsWithoutDefaults =
+        realParamsCount +
+            1 + // composer
+            changedParams
     val totalParams = parameterTypes.size
     val isDefault = totalParams != totalParamsWithoutDefaults
-    val defaultParams = if (isDefault)
-        defaultParamCount(realParamsCount)
-    else
-        0
+    val defaultParams = if (isDefault) defaultParamCount(realParamsCount) else 0
     return ComposableInfo(
         totalParamsWithoutDefaults + defaultParams == totalParams,
         realParamsCount,
@@ -83,46 +75,35 @@
  * Returns the default value for the [Class] type. This will be 0 for numeric types, false for
  * boolean and null for object references.
  */
-private fun Class<*>.getDefaultValue(): Any? = when (name) {
-    "int" -> 0.toInt()
-    "short" -> 0.toShort()
-    "byte" -> 0.toByte()
-    "long" -> 0.toLong()
-    "double" -> 0.toDouble()
-    "float" -> 0.toFloat()
-    "boolean" -> false
-    "char" -> 0.toChar()
-    else -> null
-}
+private fun Class<*>.getDefaultValue(): Any? =
+    when (name) {
+        "int" -> 0.toInt()
+        "short" -> 0.toShort()
+        "byte" -> 0.toByte()
+        "long" -> 0.toLong()
+        "double" -> 0.toDouble()
+        "float" -> 0.toFloat()
+        "boolean" -> false
+        "char" -> 0.toChar()
+        else -> null
+    }
 
-/**
- * Represents the @Composable method.
- */
-class ComposableMethod internal constructor(
-    private val method: Method,
-    private val composableInfo: ComposableInfo
-    ) {
-    /**
-     * Returns the backing [Method].
-     */
+/** Represents the @Composable method. */
+class ComposableMethod
+internal constructor(private val method: Method, private val composableInfo: ComposableInfo) {
+    /** Returns the backing [Method]. */
     fun asMethod() = method
 
-    /**
-     * Returns the count of method parameters excluding the utility Compose-specific parameters.
-     */
+    /** Returns the count of method parameters excluding the utility Compose-specific parameters. */
     val parameterCount
         get() = composableInfo.realParamsCount
 
-    /**
-     * Returns method parameters excluding the utility Compose-specific parameters.
-     */
+    /** Returns method parameters excluding the utility Compose-specific parameters. */
     val parameters: Array<Parameter>
         @Suppress("ClassVerificationFailure", "NewApi")
         get() = method.parameters.copyOfRange(0, composableInfo.realParamsCount)
 
-    /**
-     * Returns method parameters types excluding the utility Compose-specific parameters.
-     */
+    /** Returns method parameters types excluding the utility Compose-specific parameters. */
     val parameterTypes: Array<Class<*>>
         get() = method.parameterTypes.copyOfRange(0, composableInfo.realParamsCount)
 
@@ -138,39 +119,42 @@
         val changedStartIndex = realParamsCount + 1
         val defaultStartIndex = changedStartIndex + changedParams
 
-        val defaultsMasks = Array(defaultParams) { index ->
-            val start = index * BITS_PER_INT
-            val end = minOf(start + BITS_PER_INT, realParamsCount)
-            val useDefault =
-                (start until end).map { if (it >= args.size || args[it] == null) 1 else 0 }
-            val mask = useDefault.foldIndexed(0) { i, mask, default -> mask or (default shl i) }
-            mask
-        }
-
-        val arguments = Array(totalParams) { idx ->
-            when (idx) {
-                // pass in "empty" value for all real parameters since we will be using defaults.
-                in 0 until realParamsCount -> args.getOrElse(idx) {
-                    method.parameterTypes[idx].getDefaultValue()
-                }
-                // the composer is the first synthetic parameter
-                realParamsCount -> composer
-                // since this is the root we don't need to be anything unique. 0 should suffice.
-                // changed parameters should be 0 to indicate "uncertain"
-                changedStartIndex -> 0
-                in changedStartIndex + 1 until defaultStartIndex -> 0
-                // Default values mask, all parameters set to use defaults
-                in defaultStartIndex until totalParams -> defaultsMasks[idx - defaultStartIndex]
-                else -> error("Unexpected index")
+        val defaultsMasks =
+            Array(defaultParams) { index ->
+                val start = index * BITS_PER_INT
+                val end = minOf(start + BITS_PER_INT, realParamsCount)
+                val useDefault =
+                    (start until end).map { if (it >= args.size || args[it] == null) 1 else 0 }
+                val mask = useDefault.foldIndexed(0) { i, mask, default -> mask or (default shl i) }
+                mask
             }
-        }
+
+        val arguments =
+            Array(totalParams) { idx ->
+                when (idx) {
+                    // pass in "empty" value for all real parameters since we will be using
+                    // defaults.
+                    in 0 until realParamsCount ->
+                        args.getOrElse(idx) { method.parameterTypes[idx].getDefaultValue() }
+                    // the composer is the first synthetic parameter
+                    realParamsCount -> composer
+                    // since this is the root we don't need to be anything unique. 0 should suffice.
+                    // changed parameters should be 0 to indicate "uncertain"
+                    changedStartIndex -> 0
+                    in changedStartIndex + 1 until defaultStartIndex -> 0
+                    // Default values mask, all parameters set to use defaults
+                    in defaultStartIndex until totalParams -> defaultsMasks[idx - defaultStartIndex]
+                    else -> error("Unexpected index")
+                }
+            }
         return method.invoke(instance, *arguments)
     }
 
-    override fun equals(other: Any?) = when (other) {
-        is ComposableMethod -> method == other.method
-        else -> false
-    }
+    override fun equals(other: Any?) =
+        when (other) {
+            is ComposableMethod -> method == other.method
+            else -> false
+        }
 
     override fun hashCode() = method.hashCode()
 }
@@ -187,35 +171,36 @@
     return (0 until count).map { this }.toTypedArray()
 }
 
-/**
- * Find the given @Composable method by name.
- */
+/** Find the given @Composable method by name. */
 @Throws(NoSuchMethodException::class)
-fun Class<*>.getDeclaredComposableMethod(methodName: String, vararg args: Class<*>):
-    ComposableMethod {
+fun Class<*>.getDeclaredComposableMethod(
+    methodName: String,
+    vararg args: Class<*>
+): ComposableMethod {
     val changedParams = changedParamCount(args.size, 0)
-    val method = try {
-        // without defaults
-        getDeclaredMethod(
-            methodName,
-            *args,
-            Composer::class.java, // composer param
-            *Int::class.java.dup(changedParams) // changed params
-        )
-    } catch (e: ReflectiveOperationException) {
-        val defaultParams = defaultParamCount(args.size)
+    val method =
         try {
+            // without defaults
             getDeclaredMethod(
                 methodName,
                 *args,
                 Composer::class.java, // composer param
-                *Int::class.java.dup(changedParams), // changed param
-                *Int::class.java.dup(defaultParams) // default param
+                *Int::class.java.dup(changedParams) // changed params
             )
-        } catch (e2: ReflectiveOperationException) {
-            null
-        }
-    } ?: throw NoSuchMethodException("$name.$methodName")
+        } catch (e: ReflectiveOperationException) {
+            val defaultParams = defaultParamCount(args.size)
+            try {
+                getDeclaredMethod(
+                    methodName,
+                    *args,
+                    Composer::class.java, // composer param
+                    *Int::class.java.dup(changedParams), // changed param
+                    *Int::class.java.dup(defaultParams) // default param
+                )
+            } catch (e2: ReflectiveOperationException) {
+                null
+            }
+        } ?: throw NoSuchMethodException("$name.$methodName")
 
     return method.asComposableMethod()!!
 }
diff --git a/compose/runtime/runtime/src/jvmMain/kotlin/androidx/compose/runtime/snapshots/SnapshotContextElement.jvm.kt b/compose/runtime/runtime/src/jvmMain/kotlin/androidx/compose/runtime/snapshots/SnapshotContextElement.jvm.kt
index cfb13c2..382e6ab 100644
--- a/compose/runtime/runtime/src/jvmMain/kotlin/androidx/compose/runtime/snapshots/SnapshotContextElement.jvm.kt
+++ b/compose/runtime/runtime/src/jvmMain/kotlin/androidx/compose/runtime/snapshots/SnapshotContextElement.jvm.kt
@@ -21,14 +21,13 @@
 import kotlinx.coroutines.ThreadContextElement
 
 @OptIn(ExperimentalComposeApi::class)
-internal actual class SnapshotContextElementImpl actual constructor(
-    private val snapshot: Snapshot
-) : SnapshotContextElement, ThreadContextElement<Snapshot?> {
+internal actual class SnapshotContextElementImpl
+actual constructor(private val snapshot: Snapshot) :
+    SnapshotContextElement, ThreadContextElement<Snapshot?> {
     override val key: CoroutineContext.Key<*>
         get() = SnapshotContextElement
 
-    override fun updateThreadContext(context: CoroutineContext): Snapshot? =
-        snapshot.unsafeEnter()
+    override fun updateThreadContext(context: CoroutineContext): Snapshot? = snapshot.unsafeEnter()
 
     override fun restoreThreadContext(context: CoroutineContext, oldState: Snapshot?) {
         snapshot.unsafeLeave(oldState)
diff --git a/compose/runtime/runtime/src/jvmTest/kotlin/androidx/compose/runtime/changelist/OperationDefinitionValidationTest.kt b/compose/runtime/runtime/src/jvmTest/kotlin/androidx/compose/runtime/changelist/OperationDefinitionValidationTest.kt
index 6a6025c..dd80402 100644
--- a/compose/runtime/runtime/src/jvmTest/kotlin/androidx/compose/runtime/changelist/OperationDefinitionValidationTest.kt
+++ b/compose/runtime/runtime/src/jvmTest/kotlin/androidx/compose/runtime/changelist/OperationDefinitionValidationTest.kt
@@ -26,16 +26,13 @@
 import org.junit.runners.Parameterized
 
 @RunWith(Parameterized::class)
-internal class OperationDefinitionValidationTest<T : Operation>(
-    private val operation: T
-) {
+internal class OperationDefinitionValidationTest<T : Operation>(private val operation: T) {
 
     companion object {
         @JvmStatic
         @Parameterized.Parameters(name = "{0}")
-        fun initParameters(): Array<Any> = Operation::class.sealedSubclasses
-            .mapNotNull { it.objectInstance }
-            .toTypedArray()
+        fun initParameters(): Array<Any> =
+            Operation::class.sealedSubclasses.mapNotNull { it.objectInstance }.toTypedArray()
     }
 
     @Test
@@ -44,7 +41,8 @@
         val objParams = mutableListOf<Pair<String, ObjectParameter<*>>>()
         val errors = mutableListOf<String>()
 
-        operation::class.declaredMemberProperties
+        operation::class
+            .declaredMemberProperties
             .map { @Suppress("UNCHECKED_CAST") (it as KProperty1<T, Any?>) }
             .forEach { property ->
                 when (val propertyValue = property.getter.invoke(operation)) {
@@ -65,17 +63,19 @@
         }
 
         if (intParams.size != operation.ints) {
-            errors += "Operation declared a different number of int parameters than it " +
-                "reports having. Either set ${operation.name}'s `ints` property to " +
-                "${intParams.size} or update its parameter definitions so that there are " +
-                "${operation.ints} IntParameter properties."
+            errors +=
+                "Operation declared a different number of int parameters than it " +
+                    "reports having. Either set ${operation.name}'s `ints` property to " +
+                    "${intParams.size} or update its parameter definitions so that there are " +
+                    "${operation.ints} IntParameter properties."
         }
 
         if (objParams.size != operation.objects) {
-            errors += "Operation declared a different number of object parameters than it " +
-                "reports having. Either set ${operation.name}'s `objects` property to " +
-                "${objParams.size} or update its parameter definitions so that there are " +
-                "${operation.objects} ObjectParameter properties."
+            errors +=
+                "Operation declared a different number of object parameters than it " +
+                    "reports having. Either set ${operation.name}'s `objects` property to " +
+                    "${objParams.size} or update its parameter definitions so that there are " +
+                    "${operation.objects} ObjectParameter properties."
         }
 
         errors += checkNoDuplicateOffsets(intParams, objParams)
@@ -94,32 +94,38 @@
         objParams: List<Pair<String, ObjectParameter<*>>>
     ): List<String> {
         val errors = mutableListOf<String>()
-        val duplicateIntOffsets = intParams
-            .groupBy(
-                keySelector = { (_, param) -> param.offset },
-                valueTransform = { (name, _) -> name }
-            )
-            .filterValues { it.size != 1 }
+        val duplicateIntOffsets =
+            intParams
+                .groupBy(
+                    keySelector = { (_, param) -> param.offset },
+                    valueTransform = { (name, _) -> name }
+                )
+                .filterValues { it.size != 1 }
 
         if (duplicateIntOffsets.isNotEmpty()) {
-            errors += "All int parameters must have unique offsets. " +
-                "The offending pairs are: " + duplicateIntOffsets.values.joinToString {
-                    it.joinToString(prefix = "[", postfix = "]")
-                }
+            errors +=
+                "All int parameters must have unique offsets. " +
+                    "The offending pairs are: " +
+                    duplicateIntOffsets.values.joinToString {
+                        it.joinToString(prefix = "[", postfix = "]")
+                    }
         }
 
-        val duplicateObjOffsets = objParams
-            .groupBy(
-                keySelector = { (_, param) -> param.offset },
-                valueTransform = { (name, _) -> name }
-            )
-            .filterValues { it.size != 1 }
+        val duplicateObjOffsets =
+            objParams
+                .groupBy(
+                    keySelector = { (_, param) -> param.offset },
+                    valueTransform = { (name, _) -> name }
+                )
+                .filterValues { it.size != 1 }
 
         if (duplicateObjOffsets.isNotEmpty()) {
-            errors += "All object parameters must have unique offsets. " +
-                "The offending pairs are: " + duplicateObjOffsets.values.joinToString {
-                    it.joinToString(prefix = "[", postfix = "]")
-                }
+            errors +=
+                "All object parameters must have unique offsets. " +
+                    "The offending pairs are: " +
+                    duplicateObjOffsets.values.joinToString {
+                        it.joinToString(prefix = "[", postfix = "]")
+                    }
         }
 
         return errors
@@ -131,24 +137,30 @@
     ): List<String> {
         val errors = mutableListOf<String>()
 
-        val outOfRangeInts = intParams.mapNotNull { (name, param) ->
-            name.takeIf { param.offset < 0 || param.offset >= intParams.size }
-                ?.let { paramName -> "$paramName (offset = ${param.offset})" }
-        }
+        val outOfRangeInts =
+            intParams.mapNotNull { (name, param) ->
+                name
+                    .takeIf { param.offset < 0 || param.offset >= intParams.size }
+                    ?.let { paramName -> "$paramName (offset = ${param.offset})" }
+            }
         if (outOfRangeInts.isNotEmpty()) {
-            errors += "All int parameter offsets must be in the range of " +
-                "0..${intParams.size - 1}. The offending parameters are: " +
-                outOfRangeInts.joinToString()
+            errors +=
+                "All int parameter offsets must be in the range of " +
+                    "0..${intParams.size - 1}. The offending parameters are: " +
+                    outOfRangeInts.joinToString()
         }
 
-        val outOfRangeObjects = objParams.mapNotNull { (name, param) ->
-            name.takeIf { param.offset < 0 || param.offset >= objParams.size }
-                ?.let { paramName -> "$paramName (offset = ${param.offset})" }
-        }
+        val outOfRangeObjects =
+            objParams.mapNotNull { (name, param) ->
+                name
+                    .takeIf { param.offset < 0 || param.offset >= objParams.size }
+                    ?.let { paramName -> "$paramName (offset = ${param.offset})" }
+            }
         if (outOfRangeObjects.isNotEmpty()) {
-            errors += "All object parameter offsets must be in the range of " +
-                "0..${objParams.size - 1}. The offending parameters are: " +
-                outOfRangeObjects.joinToString()
+            errors +=
+                "All object parameter offsets must be in the range of " +
+                    "0..${objParams.size - 1}. The offending parameters are: " +
+                    outOfRangeObjects.joinToString()
         }
 
         return errors
diff --git a/compose/runtime/runtime/src/nonAndroidMain/kotlin/androidx/compose/runtime/SnapshotDoubleState.nonAndroid.kt b/compose/runtime/runtime/src/nonAndroidMain/kotlin/androidx/compose/runtime/SnapshotDoubleState.nonAndroid.kt
index 88eb3f8..f271442 100644
--- a/compose/runtime/runtime/src/nonAndroidMain/kotlin/androidx/compose/runtime/SnapshotDoubleState.nonAndroid.kt
+++ b/compose/runtime/runtime/src/nonAndroidMain/kotlin/androidx/compose/runtime/SnapshotDoubleState.nonAndroid.kt
@@ -16,6 +16,5 @@
 
 package androidx.compose.runtime
 
-internal actual fun createSnapshotMutableDoubleState(
-    value: Double
-): MutableDoubleState = SnapshotMutableDoubleStateImpl(value)
+internal actual fun createSnapshotMutableDoubleState(value: Double): MutableDoubleState =
+    SnapshotMutableDoubleStateImpl(value)
diff --git a/compose/runtime/runtime/src/nonAndroidMain/kotlin/androidx/compose/runtime/SnapshotFloatState.nonAndroid.kt b/compose/runtime/runtime/src/nonAndroidMain/kotlin/androidx/compose/runtime/SnapshotFloatState.nonAndroid.kt
index 1bd79cf..a4027d1 100644
--- a/compose/runtime/runtime/src/nonAndroidMain/kotlin/androidx/compose/runtime/SnapshotFloatState.nonAndroid.kt
+++ b/compose/runtime/runtime/src/nonAndroidMain/kotlin/androidx/compose/runtime/SnapshotFloatState.nonAndroid.kt
@@ -16,6 +16,5 @@
 
 package androidx.compose.runtime
 
-internal actual fun createSnapshotMutableFloatState(
-    value: Float
-): MutableFloatState = SnapshotMutableFloatStateImpl(value)
+internal actual fun createSnapshotMutableFloatState(value: Float): MutableFloatState =
+    SnapshotMutableFloatStateImpl(value)
diff --git a/compose/runtime/runtime/src/nonAndroidMain/kotlin/androidx/compose/runtime/SnapshotIntState.nonAndroid.kt b/compose/runtime/runtime/src/nonAndroidMain/kotlin/androidx/compose/runtime/SnapshotIntState.nonAndroid.kt
index c40e762..c863d2d 100644
--- a/compose/runtime/runtime/src/nonAndroidMain/kotlin/androidx/compose/runtime/SnapshotIntState.nonAndroid.kt
+++ b/compose/runtime/runtime/src/nonAndroidMain/kotlin/androidx/compose/runtime/SnapshotIntState.nonAndroid.kt
@@ -16,6 +16,5 @@
 
 package androidx.compose.runtime
 
-internal actual fun createSnapshotMutableIntState(
-    value: Int
-): MutableIntState = SnapshotMutableIntStateImpl(value)
+internal actual fun createSnapshotMutableIntState(value: Int): MutableIntState =
+    SnapshotMutableIntStateImpl(value)
diff --git a/compose/runtime/runtime/src/nonAndroidMain/kotlin/androidx/compose/runtime/SnapshotLongState.nonAndroid.kt b/compose/runtime/runtime/src/nonAndroidMain/kotlin/androidx/compose/runtime/SnapshotLongState.nonAndroid.kt
index 09f7664..d9685b1 100644
--- a/compose/runtime/runtime/src/nonAndroidMain/kotlin/androidx/compose/runtime/SnapshotLongState.nonAndroid.kt
+++ b/compose/runtime/runtime/src/nonAndroidMain/kotlin/androidx/compose/runtime/SnapshotLongState.nonAndroid.kt
@@ -16,6 +16,5 @@
 
 package androidx.compose.runtime
 
-internal actual fun createSnapshotMutableLongState(
-    value: Long
-): MutableLongState = SnapshotMutableLongStateImpl(value)
+internal actual fun createSnapshotMutableLongState(value: Long): MutableLongState =
+    SnapshotMutableLongStateImpl(value)
diff --git a/compose/runtime/runtime/src/nonEmulatorCommonTest/kotlin/androidx/compose/runtime/AbstractApplierTest.kt b/compose/runtime/runtime/src/nonEmulatorCommonTest/kotlin/androidx/compose/runtime/AbstractApplierTest.kt
index c19e328f..d83233c 100644
--- a/compose/runtime/runtime/src/nonEmulatorCommonTest/kotlin/androidx/compose/runtime/AbstractApplierTest.kt
+++ b/compose/runtime/runtime/src/nonEmulatorCommonTest/kotlin/androidx/compose/runtime/AbstractApplierTest.kt
@@ -25,15 +25,16 @@
     private val root = Node("Root")
     private val applier = NodeApplier(root)
 
-    @Test fun upFromRootThrows() {
+    @Test
+    fun upFromRootThrows() {
         try {
             applier.up()
             fail()
-        } catch (_: IllegalStateException) {
-        }
+        } catch (_: IllegalStateException) {}
     }
 
-    @Test fun downGoesDown() {
+    @Test
+    fun downGoesDown() {
         val one = Node("one")
         applier.insertTopDown(0, one)
         applier.down(one)
@@ -45,7 +46,8 @@
         assertSame(two, applier.current)
     }
 
-    @Test fun upGoesUp() {
+    @Test
+    fun upGoesUp() {
         val one = Node("one")
         applier.insertTopDown(0, one)
         applier.down(one)
@@ -59,7 +61,8 @@
         assertSame(root, applier.current)
     }
 
-    @Test fun clearClearsAndPointsToRoot() {
+    @Test
+    fun clearClearsAndPointsToRoot() {
         val child = Node("child")
         applier.insertTopDown(0, child)
         applier.down(child)
@@ -69,7 +72,8 @@
         assertEquals(emptyList<Node>(), root.children)
     }
 
-    @Test fun removeSingle() {
+    @Test
+    fun removeSingle() {
         // Note: NodeApplier delegates to AbstractApplier's MutableList.remove
         // helper which is what is being tested here.
         val one = Node("one")
@@ -89,7 +93,8 @@
         assertEquals(listOf(three), root.children)
     }
 
-    @Test fun removeMultiple() {
+    @Test
+    fun removeMultiple() {
         // Note: NodeApplier delegates to AbstractApplier's MutableList.remove
         // helper which is what is being tested here.
         val one = Node("one")
@@ -115,7 +120,8 @@
         assertEquals(listOf(five), root.children)
     }
 
-    @Test fun moveSingleHigher() {
+    @Test
+    fun moveSingleHigher() {
         // Note: NodeApplier delegates to AbstractApplier's MutableList.move
         // helper which is what is being tested here.
         val one = Node("one")
@@ -135,7 +141,8 @@
         assertEquals(listOf(three, one, two), root.children)
     }
 
-    @Test fun moveSingleLower() {
+    @Test
+    fun moveSingleLower() {
         // Note: NodeApplier delegates to AbstractApplier's MutableList.move
         // helper which is what is being tested here.
         val one = Node("one")
@@ -155,7 +162,8 @@
         assertEquals(listOf(two, three, one), root.children)
     }
 
-    @Test fun moveMultipleHigher() {
+    @Test
+    fun moveMultipleHigher() {
         // Note: NodeApplier delegates to AbstractApplier's MutableList.move
         // helper which is what is being tested here.
         val one = Node("one")
@@ -171,7 +179,8 @@
         assertEquals(listOf(three, four, one, two), root.children)
     }
 
-    @Test fun moveMultipleLower() {
+    @Test
+    fun moveMultipleLower() {
         // Note: NodeApplier delegates to AbstractApplier's MutableList.move
         // helper which is what is being tested here.
         val one = Node("one")
@@ -190,6 +199,7 @@
 
 private class Node(val name: String) {
     val children = mutableListOf<Node>()
+
     override fun toString() = name + children.joinToString(",", "(", ")")
 }
 
@@ -198,7 +208,7 @@
         current.children.add(index, instance)
     }
 
-    override fun insertBottomUp(index: Int, instance: Node) { }
+    override fun insertBottomUp(index: Int, instance: Node) {}
 
     override fun remove(index: Int, count: Int) {
         current.children.remove(index, count)
diff --git a/compose/runtime/runtime/src/nonEmulatorCommonTest/kotlin/androidx/compose/runtime/BroadcastFrameClockTest.kt b/compose/runtime/runtime/src/nonEmulatorCommonTest/kotlin/androidx/compose/runtime/BroadcastFrameClockTest.kt
index 4a3aafd..0be2a1c 100644
--- a/compose/runtime/runtime/src/nonEmulatorCommonTest/kotlin/androidx/compose/runtime/BroadcastFrameClockTest.kt
+++ b/compose/runtime/runtime/src/nonEmulatorCommonTest/kotlin/androidx/compose/runtime/BroadcastFrameClockTest.kt
@@ -29,19 +29,17 @@
 @ExperimentalCoroutinesApi
 class BroadcastFrameClockTest {
     @Test
-    fun sendAndReceiveFrames() = runTest(UnconfinedTestDispatcher()) {
-        val clock = androidx.compose.runtime.BroadcastFrameClock()
+    fun sendAndReceiveFrames() =
+        runTest(UnconfinedTestDispatcher()) {
+            val clock = androidx.compose.runtime.BroadcastFrameClock()
 
-        val frameAwaiter = async { clock.withFrameNanos { it } }
+            val frameAwaiter = async { clock.withFrameNanos { it } }
 
-        clock.sendFrame(1)
-        assertEquals(1, frameAwaiter.await(), "awaiter frame time")
-    }
+            clock.sendFrame(1)
+            assertEquals(1, frameAwaiter.await(), "awaiter frame time")
+        }
 
-    private suspend fun assertAwaiterCancelled(
-        name: String,
-        awaiter: Deferred<*>
-    ) {
+    private suspend fun assertAwaiterCancelled(name: String, awaiter: Deferred<*>) {
         assertTrue(
             runCatching { awaiter.await() }.exceptionOrNull() is CancellationException,
             "$name threw CancellationException"
@@ -49,30 +47,34 @@
     }
 
     @Test
-    fun cancelClock() = runTest(UnconfinedTestDispatcher()) {
-        val clock = androidx.compose.runtime.BroadcastFrameClock()
-        val frameAwaiter = async { clock.withFrameNanos { it } }
+    fun cancelClock() =
+        runTest(UnconfinedTestDispatcher()) {
+            val clock = androidx.compose.runtime.BroadcastFrameClock()
+            val frameAwaiter = async { clock.withFrameNanos { it } }
 
-        clock.cancel()
+            clock.cancel()
 
-        assertAwaiterCancelled("awaiter", frameAwaiter)
+            assertAwaiterCancelled("awaiter", frameAwaiter)
 
-        assertTrue(
-            runCatching { clock.withFrameNanos { it } }.exceptionOrNull() is CancellationException,
-            "late awaiter threw CancellationException"
-        )
-    }
-
-    @Test
-    fun failClockWhenNewAwaitersNotified() = runTest(UnconfinedTestDispatcher()) {
-        val clock = androidx.compose.runtime.BroadcastFrameClock {
-            throw CancellationException("failed frame clock")
+            assertTrue(
+                runCatching { clock.withFrameNanos { it } }.exceptionOrNull()
+                    is CancellationException,
+                "late awaiter threw CancellationException"
+            )
         }
 
-        val failingAwaiter = async { clock.withFrameNanos { it } }
-        assertAwaiterCancelled("failingAwaiter", failingAwaiter)
+    @Test
+    fun failClockWhenNewAwaitersNotified() =
+        runTest(UnconfinedTestDispatcher()) {
+            val clock =
+                androidx.compose.runtime.BroadcastFrameClock {
+                    throw CancellationException("failed frame clock")
+                }
 
-        val lateAwaiter = async { clock.withFrameNanos { it } }
-        assertAwaiterCancelled("lateAwaiter", lateAwaiter)
-    }
+            val failingAwaiter = async { clock.withFrameNanos { it } }
+            assertAwaiterCancelled("failingAwaiter", failingAwaiter)
+
+            val lateAwaiter = async { clock.withFrameNanos { it } }
+            assertAwaiterCancelled("lateAwaiter", lateAwaiter)
+        }
 }
diff --git a/compose/runtime/runtime/src/nonEmulatorCommonTest/kotlin/androidx/compose/runtime/CompositionAndDerivedStateTests.kt b/compose/runtime/runtime/src/nonEmulatorCommonTest/kotlin/androidx/compose/runtime/CompositionAndDerivedStateTests.kt
index dd8461b..7ae0a87 100644
--- a/compose/runtime/runtime/src/nonEmulatorCommonTest/kotlin/androidx/compose/runtime/CompositionAndDerivedStateTests.kt
+++ b/compose/runtime/runtime/src/nonEmulatorCommonTest/kotlin/androidx/compose/runtime/CompositionAndDerivedStateTests.kt
@@ -28,9 +28,7 @@
 import kotlin.test.assertEquals
 import kotlin.test.assertTrue
 
-/**
- * Tests the interaction between [derivedStateOf] and composition.
- */
+/** Tests the interaction between [derivedStateOf] and composition. */
 @Stable
 class CompositionAndDerivedStateTests {
 
@@ -40,13 +38,9 @@
         var b by mutableStateOf(10)
         val answer by derivedStateOf { a + b }
 
-        compose {
-            Text("The answer is $answer")
-        }
+        compose { Text("The answer is $answer") }
 
-        validate {
-            Text("The answer is ${a + b}")
-        }
+        validate { Text("The answer is ${a + b}") }
 
         a++
         expectChanges()
@@ -63,13 +57,9 @@
         var b by mutableStateOf(10)
         val answer by derivedStateOf { a + b }
 
-        compose {
-            Text("The answer is $answer")
-        }
+        compose { Text("The answer is $answer") }
 
-        validate {
-            Text("The answer is ${a + b}")
-        }
+        validate { Text("The answer is ${a + b}") }
 
         // A snapshot is necessary here otherwise the ui thread might see one changed but not
         // the other. A snapshot ensures that both modifications will be seen together.
@@ -109,13 +99,9 @@
         var b by mutableStateOf(mutableListOf(10), referentialEqualityPolicy())
         val answer by derivedStateOf { a + b }
 
-        compose {
-            Text("The answer is $answer")
-        }
+        compose { Text("The answer is $answer") }
 
-        validate {
-            Text("The answer is ${a + b}")
-        }
+        validate { Text("The answer is ${a + b}") }
 
         // A snapshot is necessary here otherwise the ui thread might see one changed but not
         // the other. A snapshot ensures that both modifications will be seen together.
@@ -162,22 +148,28 @@
         }
 
         var dCalculated = 0
-        val d = "d" to derivedStateOf {
-            dCalculated++
-            a
-        }
+        val d =
+            "d" to
+                derivedStateOf {
+                    dCalculated++
+                    a
+                }
 
         var eCalculated = 0
-        val e = "e" to derivedStateOf {
-            eCalculated++
-            a + 100
-        }
+        val e =
+            "e" to
+                derivedStateOf {
+                    eCalculated++
+                    a + 100
+                }
 
         var fCalculated = 0
-        val f = "f" to derivedStateOf {
-            fCalculated++
-            a + 1000
-        }
+        val f =
+            "f" to
+                derivedStateOf {
+                    fCalculated++
+                    a + 1000
+                }
 
         var dExpected = 0
         var eExpected = 0
@@ -188,9 +180,10 @@
             if (modified and useE == useE) eExpected++
             if (modified and useF == useF) fExpected++
 
-            val additionalInfo = if (previous >= 0) {
-                " switching from ${useToString(previous)} to ${useToString(modified)}"
-            } else ""
+            val additionalInfo =
+                if (previous >= 0) {
+                    " switching from ${useToString(previous)} to ${useToString(modified)}"
+                } else ""
             assertEquals(dExpected, dCalculated, "d calculated an unexpected amount$additionalInfo")
             assertEquals(eExpected, eCalculated, "e calculated an unexpected amount$additionalInfo")
             assertEquals(fExpected, fCalculated, "f calculated an unexpected amount$additionalInfo")
@@ -275,15 +268,16 @@
         switchTo(useD or useE)
         switchTo(useD or useF)
 
-        val states = listOf(
-            useE,
-            useF,
-            useD or useE,
-            useD or useF,
-            useD or useE or useF,
-            useE or useF,
-            useNone
-        )
+        val states =
+            listOf(
+                useE,
+                useF,
+                useD or useE,
+                useD or useF,
+                useD or useE or useF,
+                useE or useF,
+                useNone
+            )
         for (newUse in states) {
             switchTo(newUse)
         }
@@ -294,10 +288,12 @@
         var a by mutableStateOf(11)
         var dCalculated = 0
         var dChanged = false
-        val d = "d" to derivedStateOf {
-            dCalculated++
-            a + 10
-        }
+        val d =
+            "d" to
+                derivedStateOf {
+                    dCalculated++
+                    a + 10
+                }
 
         compose {
             Text("a = $a")
@@ -394,18 +390,12 @@
         var reload by mutableStateOf(0)
 
         compose {
-            val items = remember(reload) {
-                derivedStateOf {
-                    List(10) { it }
-                }
-            }
+            val items = remember(reload) { derivedStateOf { List(10) { it } } }
 
             Text("List of size ${items.value.size}")
         }
 
-        validate {
-            Text("List of size 10")
-        }
+        validate { Text("List of size 10") }
 
         repeat(10) {
             reload++
@@ -426,11 +416,7 @@
         var count by mutableStateOf(0)
 
         compose {
-            val items by remember {
-                derivedStateOf {
-                    List(count) { it }
-                }
-            }
+            val items by remember { derivedStateOf { List(count) { it } } }
 
             Linear {
                 if (observeInFirstScope) {
@@ -438,19 +424,13 @@
                 }
             }
 
-            Linear {
-                Text("List of size ${items.size}")
-            }
+            Linear { Text("List of size ${items.size}") }
         }
 
         validate {
-            Linear {
-                Text("List of size 0")
-            }
+            Linear { Text("List of size 0") }
 
-            Linear {
-                Text("List of size 0")
-            }
+            Linear { Text("List of size 0") }
         }
 
         observeInFirstScope = false
@@ -459,12 +439,9 @@
         advance()
 
         validate {
-            Linear {
-            }
+            Linear {}
 
-            Linear {
-                Text("List of size 1")
-            }
+            Linear { Text("List of size 1") }
         }
     }
 
@@ -473,24 +450,14 @@
         var reload by mutableStateOf(0)
 
         compose {
-            val itemValue = remember(reload) {
-                derivedStateOf {
-                    reload
-                }
-            }
+            val itemValue = remember(reload) { derivedStateOf { reload } }
 
-            val items = remember(reload) {
-                derivedStateOf {
-                    List(10) { itemValue.value }
-                }
-            }
+            val items = remember(reload) { derivedStateOf { List(10) { itemValue.value } } }
 
             Text("List of size ${items.value.size}")
         }
 
-        validate {
-            Text("List of size 10")
-        }
+        validate { Text("List of size 10") }
 
         repeat(10) {
             reload++
@@ -509,24 +476,18 @@
         var reload by mutableStateOf(0)
 
         compose {
-            val itemValue = remember(reload) {
-                derivedStateOf { 1 }
-            }
+            val itemValue = remember(reload) { derivedStateOf { 1 } }
 
             val intermediateState = rememberUpdatedState(itemValue)
 
             val snapshot = remember {
-                derivedStateOf {
-                    List(10) { intermediateState.value.value }
-                }
+                derivedStateOf { List(10) { intermediateState.value.value } }
             }
 
             Text("List of size ${snapshot.value.size}")
         }
 
-        validate {
-            Text("List of size 10")
-        }
+        validate { Text("List of size 10") }
 
         repeat(10) {
             reload++
@@ -535,27 +496,21 @@
 
         revalidate()
 
-        // Validate there are only 2 observed dependencies, one for intermediateState, one for itemValue
+        // Validate there are only 2 observed dependencies, one for intermediateState, one for
+        // itemValue
         val observed = (composition as? CompositionImpl)?.derivedStateDependencies ?: emptyList()
         assertEquals(2, observed.count())
     }
 
     @Test
     fun changingDerivedStateShouldNotAccumulateConditionalScopes() = compositionTest {
-
         var reload by mutableStateOf(0)
 
         compose {
-            val derivedState = remember {
-                derivedStateOf {
-                    List(reload) { it }
-                }
-            }
+            val derivedState = remember { derivedStateOf { List(reload) { it } } }
 
             if (reload % 2 == 0) {
-                Wrap {
-                    Text("${derivedState.value.size}")
-                }
+                Wrap { Text("${derivedState.value.size}") }
             }
         }
 
@@ -575,13 +530,9 @@
         val transient by derivedStateOf { a + b }
         val answer by derivedStateOf { transient - 1 }
 
-        compose {
-            Text("The answer is $answer")
-        }
+        compose { Text("The answer is $answer") }
 
-        validate {
-            Text("The answer is ${a + b - 1}")
-        }
+        validate { Text("The answer is ${a + b - 1}") }
 
         a++
         expectChanges()
@@ -603,13 +554,9 @@
             transient
         }
 
-        compose {
-            Text("The answer is $answer")
-        }
+        compose { Text("The answer is $answer") }
 
-        validate {
-            Text("The answer is ${(a + b) / 10}")
-        }
+        validate { Text("The answer is ${(a + b) / 10}") }
 
         assertEquals(1, invalidateCount)
 
@@ -628,9 +575,7 @@
     fun derivedStateOfStructuralMutationPolicyDoesntRecompose() = compositionTest {
         var a by mutableStateOf(30)
         var b by mutableStateOf(10)
-        val answer by derivedStateOf(structuralEqualityPolicy()) {
-            listOf(a >= 30, b >= 10)
-        }
+        val answer by derivedStateOf(structuralEqualityPolicy()) { listOf(a >= 30, b >= 10) }
         var compositionCount = 0
 
         compose {
@@ -641,11 +586,7 @@
             }
         }
 
-        validate {
-            Linear {
-                Text("The answer is ${listOf(true, true)}")
-            }
-        }
+        validate { Linear { Text("The answer is ${listOf(true, true)}") } }
 
         assertEquals(1, compositionCount)
 
@@ -664,9 +605,7 @@
     fun derivedStateOfReferencialMutationPolicyRecomposes() = compositionTest {
         var a by mutableStateOf(30)
         var b by mutableStateOf(10)
-        val answer by derivedStateOf(referentialEqualityPolicy()) {
-            listOf(a >= 30, b >= 10)
-        }
+        val answer by derivedStateOf(referentialEqualityPolicy()) { listOf(a >= 30, b >= 10) }
         var compositionCount = 0
 
         compose {
@@ -677,11 +616,7 @@
             }
         }
 
-        validate {
-            Linear {
-                Text("The answer is ${listOf(true, true)}")
-            }
-        }
+        validate { Linear { Text("The answer is ${listOf(true, true)}") } }
 
         assertEquals(1, compositionCount)
 
diff --git a/compose/runtime/runtime/src/nonEmulatorCommonTest/kotlin/androidx/compose/runtime/CompositionLocalTests.kt b/compose/runtime/runtime/src/nonEmulatorCommonTest/kotlin/androidx/compose/runtime/CompositionLocalTests.kt
index 46de688..711a073 100644
--- a/compose/runtime/runtime/src/nonEmulatorCommonTest/kotlin/androidx/compose/runtime/CompositionLocalTests.kt
+++ b/compose/runtime/runtime/src/nonEmulatorCommonTest/kotlin/androidx/compose/runtime/CompositionLocalTests.kt
@@ -67,43 +67,22 @@
                 LocalSomeOtherIntProvider provides 42,
                 LocalSomeStaticInt provides 50
             ) {
-                assertEquals(
-                    "Test1",
-                    LocalSomeTextComposition.current
-                )
+                assertEquals("Test1", LocalSomeTextComposition.current)
                 assertEquals(12, LocalSomeIntComposition.current)
-                assertEquals(
-                    42,
-                    LocalSomeOtherIntComposition.current
-                )
+                assertEquals(42, LocalSomeOtherIntComposition.current)
                 assertEquals(50, LocalSomeStaticInt.current)
                 CompositionLocalProvider(
                     LocalSomeTextComposition provides "Test2",
                     LocalSomeStaticInt provides 60
                 ) {
-                    assertEquals(
-                        "Test2",
-                        LocalSomeTextComposition.current
-                    )
-                    assertEquals(
-                        12,
-                        LocalSomeIntComposition.current
-                    )
-                    assertEquals(
-                        42,
-                        LocalSomeOtherIntComposition.current
-                    )
+                    assertEquals("Test2", LocalSomeTextComposition.current)
+                    assertEquals(12, LocalSomeIntComposition.current)
+                    assertEquals(42, LocalSomeOtherIntComposition.current)
                     assertEquals(60, LocalSomeStaticInt.current)
                 }
-                assertEquals(
-                    "Test1",
-                    LocalSomeTextComposition.current
-                )
+                assertEquals("Test1", LocalSomeTextComposition.current)
                 assertEquals(12, LocalSomeIntComposition.current)
-                assertEquals(
-                    42,
-                    LocalSomeOtherIntComposition.current
-                )
+                assertEquals(42, LocalSomeOtherIntComposition.current)
                 assertEquals(50, LocalSomeStaticInt.current)
             }
             assertEquals("Default", LocalSomeTextComposition.current)
@@ -118,19 +97,13 @@
         var someText = "Unmodified"
         compose {
             invalidates.add(currentRecomposeScope)
-            CompositionLocalProvider(
-                LocalSomeTextComposition provides someText
-            ) {
-                ReadStringCompositionLocal(
-                    compositionLocal = LocalSomeTextComposition
-                )
+            CompositionLocalProvider(LocalSomeTextComposition provides someText) {
+                ReadStringCompositionLocal(compositionLocal = LocalSomeTextComposition)
             }
         }
 
         fun validate() {
-            validate {
-                Text(someText)
-            }
+            validate { Text(someText) }
         }
 
         someText = "Modified"
@@ -147,19 +120,13 @@
         var someText = "Unmodified"
         compose {
             invalidates.add(currentRecomposeScope)
-            CompositionLocalProvider(
-                staticStringCompositionLocal provides someText
-            ) {
-                ReadStringCompositionLocal(
-                    compositionLocal = staticStringCompositionLocal
-                )
+            CompositionLocalProvider(staticStringCompositionLocal provides someText) {
+                ReadStringCompositionLocal(compositionLocal = staticStringCompositionLocal)
             }
         }
 
         fun validate() {
-            validate {
-                Text(someText)
-            }
+            validate { Text(someText) }
         }
         validate()
 
@@ -184,32 +151,19 @@
                 ReadStringCompositionLocal(compositionLocal = LocalSomeTextComposition)
 
                 TestSubcomposition {
-                    assertEquals(
-                        someText,
-                        LocalSomeTextComposition.current
-                    )
+                    assertEquals(someText, LocalSomeTextComposition.current)
                     assertEquals(0, LocalSomeIntComposition.current)
 
-                    CompositionLocalProvider(
-                        LocalSomeIntComposition provides 42
-                    ) {
-                        assertEquals(
-                            someText,
-                            LocalSomeTextComposition.current
-                        )
-                        assertEquals(
-                            42,
-                            LocalSomeIntComposition.current
-                        )
+                    CompositionLocalProvider(LocalSomeIntComposition provides 42) {
+                        assertEquals(someText, LocalSomeTextComposition.current)
+                        assertEquals(42, LocalSomeIntComposition.current)
                     }
                 }
             }
         }
 
         fun validate() {
-            validate {
-                Text(someText)
-            }
+            validate { Text(someText) }
         }
 
         someText = "Modified"
@@ -243,9 +197,7 @@
                     assertEquals(someText, staticSomeTextCompositionLocal.current)
                     assertEquals(0, staticSomeIntCompositionLocal.current)
 
-                    CompositionLocalProvider(
-                        staticSomeIntCompositionLocal provides 42
-                    ) {
+                    CompositionLocalProvider(staticSomeIntCompositionLocal provides 42) {
                         assertEquals(someText, staticSomeTextCompositionLocal.current)
                         assertEquals(42, staticSomeIntCompositionLocal.current)
                     }
@@ -254,9 +206,7 @@
         }
 
         fun validate() {
-            validate {
-                Text(someText)
-            }
+            validate { Text(someText) }
         }
 
         someText = "Modified"
@@ -283,32 +233,19 @@
                 )
 
                 doSubCompose = testDeferredSubcomposition {
-                    assertEquals(
-                        someText,
-                        LocalSomeTextComposition.current
-                    )
+                    assertEquals(someText, LocalSomeTextComposition.current)
                     assertEquals(0, LocalSomeIntComposition.current)
 
-                    CompositionLocalProvider(
-                        LocalSomeIntComposition provides 42
-                    ) {
-                        assertEquals(
-                            someText,
-                            LocalSomeTextComposition.current
-                        )
-                        assertEquals(
-                            42,
-                            LocalSomeIntComposition.current
-                        )
+                    CompositionLocalProvider(LocalSomeIntComposition provides 42) {
+                        assertEquals(someText, LocalSomeTextComposition.current)
+                        assertEquals(42, LocalSomeIntComposition.current)
                     }
                 }
             }
         }
 
         fun validate() {
-            validate {
-                Text(someText)
-            }
+            validate { Text(someText) }
         }
         validate()
         doSubCompose()
@@ -339,18 +276,13 @@
                 assertEquals(someText, staticSomeTextCompositionLocal.current)
                 assertEquals(0, staticSomeIntCompositionLocal.current)
 
-                ReadStringCompositionLocal(
-                    compositionLocal = staticSomeTextCompositionLocal
-                )
+                ReadStringCompositionLocal(compositionLocal = staticSomeTextCompositionLocal)
 
                 doSubCompose = testDeferredSubcomposition {
-
                     assertEquals(someText, staticSomeTextCompositionLocal.current)
                     assertEquals(0, staticSomeIntCompositionLocal.current)
 
-                    CompositionLocalProvider(
-                        staticSomeIntCompositionLocal provides 42
-                    ) {
+                    CompositionLocalProvider(staticSomeIntCompositionLocal provides 42) {
                         assertEquals(someText, staticSomeTextCompositionLocal.current)
                         assertEquals(42, staticSomeIntCompositionLocal.current)
                     }
@@ -359,9 +291,7 @@
         }
 
         fun validate() {
-            validate {
-                Text(someText)
-            }
+            validate { Text(someText) }
         }
         validate()
         doSubCompose()
@@ -393,12 +323,9 @@
                 assertEquals(someText, staticSomeTextCompositionLocal.current)
                 assertEquals(0, staticSomeIntCompositionLocal.current)
 
-                ReadStringCompositionLocal(
-                    compositionLocal = staticSomeTextCompositionLocal
-                )
+                ReadStringCompositionLocal(compositionLocal = staticSomeTextCompositionLocal)
 
                 doSubCompose1 = testDeferredSubcomposition {
-
                     assertEquals(someText, staticSomeTextCompositionLocal.current)
                     assertEquals(0, staticSomeIntCompositionLocal.current)
 
@@ -411,9 +338,7 @@
         }
 
         fun validate() {
-            validate {
-                Text(someText)
-            }
+            validate { Text(someText) }
         }
         validate()
         doSubCompose1()
@@ -435,20 +360,14 @@
         val someStaticString = staticCompositionLocalOf { "Default" }
         var shouldRead = false
         compose {
-            CompositionLocalProvider(
-                someStaticString provides "Provided A"
-            ) {
+            CompositionLocalProvider(someStaticString provides "Provided A") {
                 invalidates.add(currentRecomposeScope)
-                if (shouldRead)
-                    ReadStringCompositionLocal(someStaticString)
+                if (shouldRead) ReadStringCompositionLocal(someStaticString)
             }
         }
 
         fun validate() {
-            validate {
-                if (shouldRead)
-                    Text("Provided A")
-            }
+            validate { if (shouldRead) Text("Provided A") }
         }
         validate()
 
@@ -476,9 +395,7 @@
 
         compose {
             invalidates.add(currentRecomposeScope)
-            CompositionLocalProvider(
-                someDataCompositionLocal provides SomeData("provided")
-            ) {
+            CompositionLocalProvider(someDataCompositionLocal provides SomeData("provided")) {
                 ReadSomeDataCompositionLocal(someDataCompositionLocal, composed)
             }
         }
@@ -563,9 +480,7 @@
         val e = Array(101) { it }.map { it to it }
         val c = persistentHashMapOf(*e.toTypedArray())
         val n = p.builder().apply { putAll(c) }.build()
-        repeat(101) {
-            assertEquals(it, n[it])
-        }
+        repeat(101) { assertEquals(it, n[it]) }
     }
 
     @Suppress("UNUSED_EXPRESSION")
@@ -623,17 +538,16 @@
             DisposableEffect(Unit) {
                 val context = coroutineContext + TestMonotonicFrameClock(this@compositionTest)
                 val recomposer = Recomposer(context)
-                launch(context) {
-                    recomposer.runRecomposeAndApplyChanges()
-                }
+                launch(context) { recomposer.runRecomposeAndApplyChanges() }
                 val composition2 = Composition(EmptyApplier(), recomposer)
                 composition2.setContent {
                     CompositionLocalProvider(locals) {
-                        actualValues = setOf(
-                            local1.current,
-                            local2.current,
-                            staticLocal.current,
-                        )
+                        actualValues =
+                            setOf(
+                                local1.current,
+                                local2.current,
+                                staticLocal.current,
+                            )
                     }
                 }
                 onDispose {
@@ -643,11 +557,7 @@
             }
         }
 
-        compose {
-            CompositionLocalProvider(*provided) {
-                LocalsConsumer()
-            }
-        }
+        compose { CompositionLocalProvider(*provided) { LocalsConsumer() } }
 
         advance()
         assertEquals(setOf(0, 0, 0), actualValues)
@@ -689,13 +599,9 @@
     fun testRecomposeCacheInvalidation() = compositionTest {
         var state = mutableStateOf(0)
 
-        compose {
-            CacheInvalidate(state)
-        }
+        compose { CacheInvalidate(state) }
 
-        validate {
-            this.CacheInvalidate(state)
-        }
+        validate { this.CacheInvalidate(state) }
 
         state.value++
         advance()
@@ -708,9 +614,7 @@
         val local = compositionLocalOf { 0 }
         compose {
             CompositionLocalProvider(local provides 1) {
-                CompositionLocalProvider(local providesDefault 2) {
-                    assertEquals(1, local.current)
-                }
+                CompositionLocalProvider(local providesDefault 2) { assertEquals(1, local.current) }
             }
         }
     }
@@ -796,9 +700,7 @@
             // Value is computed to be 14
             val computedValue = LocalComputedValue.current
             assertEquals(14, computedValue)
-            CompositionLocalProvider(
-                LocalValue provides 20
-            ) {
+            CompositionLocalProvider(LocalValue provides 20) {
                 // Value is 20 provided above
                 val nestedValue = LocalValue.current
                 assertEquals(20, nestedValue)
@@ -808,15 +710,11 @@
                 // Values is computed to be 24; LocalValue.current + 4
                 val nestedComputedValue = LocalComputedValue.current
                 assertEquals(24, nestedComputedValue)
-                CompositionLocalProvider(
-                    LocalLargerValue provides LocalValue.current + 2
-                ) {
+                CompositionLocalProvider(LocalLargerValue provides LocalValue.current + 2) {
                     // Value is 22 provided above
                     val newLargerValue = LocalLargerValue.current
                     assertEquals(22, newLargerValue)
-                    CompositionLocalProvider(
-                        LocalValue provides 50
-                    ) {
+                    CompositionLocalProvider(LocalValue provides 50) {
                         // Value is now 50 provided above
                         val finalValue = LocalValue.current
                         assertEquals(50, finalValue)
@@ -836,6 +734,7 @@
 }
 
 val cacheLocal = staticCompositionLocalOf { "Unset" }
+
 @Composable
 fun CacheInvalidate(state: State<Int>) {
     Text("${state.value}")
@@ -849,9 +748,7 @@
 
 @Composable
 fun CacheInvalidateSet(content: @Composable () -> Unit) {
-    CompositionLocalProvider(cacheLocal provides "Set") {
-        content()
-    }
+    CompositionLocalProvider(cacheLocal provides "Set") { content() }
 }
 
 fun MockViewValidator.CacheInvalidate(state: State<Int>) {
@@ -863,4 +760,5 @@
 }
 
 data class SomeData(val value: String = "default")
+
 @Stable class StableRef<T>(var value: T)
diff --git a/compose/runtime/runtime/src/nonEmulatorCommonTest/kotlin/androidx/compose/runtime/CompositionObserverTests.kt b/compose/runtime/runtime/src/nonEmulatorCommonTest/kotlin/androidx/compose/runtime/CompositionObserverTests.kt
index 4a6aa60..ae62ad3 100644
--- a/compose/runtime/runtime/src/nonEmulatorCommonTest/kotlin/androidx/compose/runtime/CompositionObserverTests.kt
+++ b/compose/runtime/runtime/src/nonEmulatorCommonTest/kotlin/androidx/compose/runtime/CompositionObserverTests.kt
@@ -47,23 +47,23 @@
                 Text("$data")
             }
 
-            validate {
-                Text("$data")
-            }
+            validate { Text("$data") }
 
-            scope?.observe(object : RecomposeScopeObserver {
-                override fun onBeginScopeComposition(scope: RecomposeScope) {
-                    startCount++
-                }
+            scope?.observe(
+                object : RecomposeScopeObserver {
+                    override fun onBeginScopeComposition(scope: RecomposeScope) {
+                        startCount++
+                    }
 
-                override fun onEndScopeComposition(scope: RecomposeScope) {
-                    endCount++
-                }
+                    override fun onEndScopeComposition(scope: RecomposeScope) {
+                        endCount++
+                    }
 
-                override fun onScopeDisposed(scope: RecomposeScope) {
-                    disposedCount++
+                    override fun onScopeDisposed(scope: RecomposeScope) {
+                        disposedCount++
+                    }
                 }
-            })
+            )
 
             data++
             expectChanges()
@@ -90,23 +90,24 @@
                 Text("$data")
             }
 
-            validate {
-                Text("$data")
-            }
+            validate { Text("$data") }
 
-            val handle = scope?.observe(object : RecomposeScopeObserver {
-                override fun onBeginScopeComposition(scope: RecomposeScope) {
-                    startCount++
-                }
+            val handle =
+                scope?.observe(
+                    object : RecomposeScopeObserver {
+                        override fun onBeginScopeComposition(scope: RecomposeScope) {
+                            startCount++
+                        }
 
-                override fun onEndScopeComposition(scope: RecomposeScope) {
-                    endCount++
-                }
+                        override fun onEndScopeComposition(scope: RecomposeScope) {
+                            endCount++
+                        }
 
-                override fun onScopeDisposed(scope: RecomposeScope) {
-                    disposedCount++
-                }
-            })
+                        override fun onScopeDisposed(scope: RecomposeScope) {
+                            disposedCount++
+                        }
+                    }
+                )
 
             data++
             expectChanges()
@@ -151,19 +152,21 @@
                 }
             }
 
-            scope?.observe(object : RecomposeScopeObserver {
-                override fun onBeginScopeComposition(scope: RecomposeScope) {
-                    startCount++
-                }
+            scope?.observe(
+                object : RecomposeScopeObserver {
+                    override fun onBeginScopeComposition(scope: RecomposeScope) {
+                        startCount++
+                    }
 
-                override fun onEndScopeComposition(scope: RecomposeScope) {
-                    endCount++
-                }
+                    override fun onEndScopeComposition(scope: RecomposeScope) {
+                        endCount++
+                    }
 
-                override fun onScopeDisposed(scope: RecomposeScope) {
-                    disposedCount++
+                    override fun onScopeDisposed(scope: RecomposeScope) {
+                        disposedCount++
+                    }
                 }
-            })
+            )
 
             data++
             expectChanges()
@@ -187,26 +190,23 @@
         var beginCount = 0
         var endCount = 0
         var data by mutableStateOf(0)
-        val observer = object : CompositionObserver {
-            override fun onBeginComposition(
-                composition: Composition,
-                invalidationMap: Map<RecomposeScope, Set<Any>?>
-            ) {
-                beginCount++
+        val observer =
+            object : CompositionObserver {
+                override fun onBeginComposition(
+                    composition: Composition,
+                    invalidationMap: Map<RecomposeScope, Set<Any>?>
+                ) {
+                    beginCount++
+                }
+
+                override fun onEndComposition(composition: Composition) {
+                    endCount++
+                }
             }
 
-            override fun onEndComposition(composition: Composition) {
-                endCount++
-            }
-        }
+        val handle = compose(observer) { Text("Some composition: $data") }
 
-        val handle = compose(observer) {
-            Text("Some composition: $data")
-        }
-
-        validate {
-            Text("Some composition: $data")
-        }
+        validate { Text("Some composition: $data") }
 
         assertEquals(1, beginCount)
         assertEquals(1, endCount)
@@ -233,25 +233,22 @@
         var beginCount = 0
         var endCount = 0
         var data by mutableStateOf(0)
-        val observer = object : CompositionObserver {
-            override fun onBeginComposition(
-                composition: Composition,
-                invalidationMap: Map<RecomposeScope, Set<Any>?>
-            ) {
-                beginCount++
-            }
+        val observer =
+            object : CompositionObserver {
+                override fun onBeginComposition(
+                    composition: Composition,
+                    invalidationMap: Map<RecomposeScope, Set<Any>?>
+                ) {
+                    beginCount++
+                }
 
-            override fun onEndComposition(composition: Composition) {
-                endCount++
+                override fun onEndComposition(composition: Composition) {
+                    endCount++
+                }
             }
-        }
-        compose {
-            Text("Some composition: $data")
-        }
+        compose { Text("Some composition: $data") }
 
-        validate {
-            Text("Some composition: $data")
-        }
+        validate { Text("Some composition: $data") }
         val handle = composition?.observe(observer)
 
         assertEquals(0, beginCount)
@@ -280,28 +277,28 @@
         var endCount = 0
         var data by mutableStateOf(0)
         val compositionsSeen = mutableSetOf<Composition>()
-        val observer = object : CompositionObserver {
-            override fun onBeginComposition(
-                composition: Composition,
-                invalidationMap: Map<RecomposeScope, Set<Any>?>
-            ) {
-                compositionsSeen.add(composition)
-                beginCount++
-            }
+        val observer =
+            object : CompositionObserver {
+                override fun onBeginComposition(
+                    composition: Composition,
+                    invalidationMap: Map<RecomposeScope, Set<Any>?>
+                ) {
+                    compositionsSeen.add(composition)
+                    beginCount++
+                }
 
-            override fun onEndComposition(composition: Composition) {
-                endCount++
+                override fun onEndComposition(composition: Composition) {
+                    endCount++
+                }
             }
-        }
 
         var seen = data
-        val handle = compose(observer) {
-            Text("Root: $data")
+        val handle =
+            compose(observer) {
+                Text("Root: $data")
 
-            TestSubcomposition {
-                seen = data
+                TestSubcomposition { seen = data }
             }
-        }
 
         assertEquals(data, seen)
         assertEquals(2, beginCount)
@@ -331,27 +328,26 @@
         var endCount = 0
         var data by mutableStateOf(0)
         val compositionsSeen = mutableSetOf<Composition>()
-        val observer = object : CompositionObserver {
-            override fun onBeginComposition(
-                composition: Composition,
-                invalidationMap: Map<RecomposeScope, Set<Any>?>
-            ) {
-                compositionsSeen.add(composition)
-                beginCount++
-            }
+        val observer =
+            object : CompositionObserver {
+                override fun onBeginComposition(
+                    composition: Composition,
+                    invalidationMap: Map<RecomposeScope, Set<Any>?>
+                ) {
+                    compositionsSeen.add(composition)
+                    beginCount++
+                }
 
-            override fun onEndComposition(composition: Composition) {
-                endCount++
+                override fun onEndComposition(composition: Composition) {
+                    endCount++
+                }
             }
-        }
 
         var seen = data
         compose {
             Text("Root: $data")
 
-            TestSubcomposition {
-                seen = data
-            }
+            TestSubcomposition { seen = data }
         }
 
         assertEquals(data, seen)
@@ -385,31 +381,33 @@
         var endCountTwo = 0
         var data by mutableStateOf(0)
         val compositionsSeen = mutableSetOf<Composition>()
-        val observer1 = object : CompositionObserver {
-            override fun onBeginComposition(
-                composition: Composition,
-                invalidationMap: Map<RecomposeScope, Set<Any>?>
-            ) {
-                compositionsSeen.add(composition)
-                beginCountOne++
-            }
+        val observer1 =
+            object : CompositionObserver {
+                override fun onBeginComposition(
+                    composition: Composition,
+                    invalidationMap: Map<RecomposeScope, Set<Any>?>
+                ) {
+                    compositionsSeen.add(composition)
+                    beginCountOne++
+                }
 
-            override fun onEndComposition(composition: Composition) {
-                endCountOne++
+                override fun onEndComposition(composition: Composition) {
+                    endCountOne++
+                }
             }
-        }
-        val observer2 = object : CompositionObserver {
-            override fun onBeginComposition(
-                composition: Composition,
-                invalidationMap: Map<RecomposeScope, Set<Any>?>
-            ) {
-                beginCountTwo++
-            }
+        val observer2 =
+            object : CompositionObserver {
+                override fun onBeginComposition(
+                    composition: Composition,
+                    invalidationMap: Map<RecomposeScope, Set<Any>?>
+                ) {
+                    beginCountTwo++
+                }
 
-            override fun onEndComposition(composition: Composition) {
-                endCountTwo++
+                override fun onEndComposition(composition: Composition) {
+                    endCountTwo++
+                }
             }
-        }
 
         var seen = data
         compose {
@@ -418,9 +416,7 @@
             TestSubcomposition {
                 seen = data
 
-                TestSubcomposition {
-                    seen = data
-                }
+                TestSubcomposition { seen = data }
             }
         }
 
@@ -520,23 +516,24 @@
         val composition = composition ?: error("No composition")
         fun changes(vararg indexes: Int) {
             var validatedSomething = false
-            val handle = composition.observe(
-                object : CompositionObserver {
-                    override fun onBeginComposition(
-                        composition: Composition,
-                        invalidationMap: Map<RecomposeScope, Set<Any>?>
-                    ) {
-                        validatedSomething = true
-                        for (index in indexes) {
-                            assertTrue(invalidationMap.containsKey(expectedScopes[index]))
+            val handle =
+                composition.observe(
+                    object : CompositionObserver {
+                        override fun onBeginComposition(
+                            composition: Composition,
+                            invalidationMap: Map<RecomposeScope, Set<Any>?>
+                        ) {
+                            validatedSomething = true
+                            for (index in indexes) {
+                                assertTrue(invalidationMap.containsKey(expectedScopes[index]))
+                            }
+                        }
+
+                        override fun onEndComposition(composition: Composition) {
+                            // Nothing to do
                         }
                     }
-
-                    override fun onEndComposition(composition: Composition) {
-                        // Nothing to do
-                    }
-                }
-            )
+                )
             for (index in indexes) {
                 data[index].value++
             }
diff --git a/compose/runtime/runtime/src/nonEmulatorCommonTest/kotlin/androidx/compose/runtime/CompositionReusingTests.kt b/compose/runtime/runtime/src/nonEmulatorCommonTest/kotlin/androidx/compose/runtime/CompositionReusingTests.kt
index e3f73ed..fc898ae 100644
--- a/compose/runtime/runtime/src/nonEmulatorCommonTest/kotlin/androidx/compose/runtime/CompositionReusingTests.kt
+++ b/compose/runtime/runtime/src/nonEmulatorCommonTest/kotlin/androidx/compose/runtime/CompositionReusingTests.kt
@@ -53,11 +53,7 @@
             }
         }
 
-        validate {
-            Linear {
-                Text("Key = $key")
-            }
-        }
+        validate { Linear { Text("Key = $key") } }
 
         val firstData = lastData
         val nodes = root.flatten()
@@ -72,10 +68,7 @@
         assertArrayEquals(nodes, nodesAfterChange) { "${it.hashCode()}" }
 
         // Ensure remembers are not reused
-        assertNotEquals(
-            firstData, lastData,
-            "Should not remember values when recycling"
-        )
+        assertNotEquals(firstData, lastData, "Should not remember values when recycling")
     }
 
     @Test
@@ -119,26 +112,18 @@
         compose {
             ReusableContent(key) {
                 Linear {
-                    Linear {
-                        Text("Key = $key")
-                    }
-                    NonReusableLinear {
-                        Text("Non-recyclable key = $key")
-                    }
-                    NonReusableLinear { }
+                    Linear { Text("Key = $key") }
+                    NonReusableLinear { Text("Non-recyclable key = $key") }
+                    NonReusableLinear {}
                 }
             }
         }
 
         validate {
             Linear {
-                Linear {
-                    Text("Key = $key")
-                }
-                Linear {
-                    Text("Non-recyclable key = $key")
-                }
-                Linear { }
+                Linear { Text("Key = $key") }
+                Linear { Text("Non-recyclable key = $key") }
+                Linear {}
             }
         }
 
@@ -171,11 +156,7 @@
             }
         }
 
-        validate {
-            Linear {
-                Text("Key = $key")
-            }
-        }
+        validate { Linear { Text("Key = $key") } }
 
         val firstCompositeHash = lastCompositeHash
         key++
@@ -199,11 +180,7 @@
             }
         }
 
-        validate {
-            Linear {
-                Text("Key = $key: $localValue")
-            }
-        }
+        validate { Linear { Text("Key = $key: $localValue") } }
 
         val compositeHashForKey0 = lastCompositeHash
 
@@ -229,30 +206,31 @@
         var reuseKey by mutableStateOf(0)
         var active by mutableStateOf(true)
 
-        val rememberedState = object : RememberObserver {
-            var currentlyRemembered = false
-            var rememberCount = 0
-            var forgottenCount = 0
-            var abandonCount = 0
+        val rememberedState =
+            object : RememberObserver {
+                var currentlyRemembered = false
+                var rememberCount = 0
+                var forgottenCount = 0
+                var abandonCount = 0
 
-            override fun toString(): String = "Some text"
+                override fun toString(): String = "Some text"
 
-            override fun onRemembered() {
-                rememberCount++
-                currentlyRemembered = true
+                override fun onRemembered() {
+                    rememberCount++
+                    currentlyRemembered = true
+                }
+
+                override fun onForgotten() {
+                    forgottenCount++
+                    currentlyRemembered = false
+                }
+
+                override fun onAbandoned() {
+                    abandonCount++
+                    currentlyRemembered = false
+                }
             }
 
-            override fun onForgotten() {
-                forgottenCount++
-                currentlyRemembered = false
-            }
-
-            override fun onAbandoned() {
-                abandonCount++
-                currentlyRemembered = false
-            }
-        }
-
         compose {
             ReusableContentHost(active) {
                 Linear {
@@ -266,13 +244,7 @@
             }
         }
 
-        validate {
-            Linear {
-                Linear {
-                    Text(rememberedState.toString())
-                }
-            }
-        }
+        validate { Linear { Linear { Text(rememberedState.toString()) } } }
 
         assertTrue(rememberedState.currentlyRemembered)
 
@@ -297,24 +269,25 @@
         var reuseKey by mutableStateOf(0)
         var active by mutableStateOf(true)
 
-        val rememberedState = object : RememberObserver {
-            var currentlyRemembered = false
+        val rememberedState =
+            object : RememberObserver {
+                var currentlyRemembered = false
 
-            override fun toString(): String = "Some text"
+                override fun toString(): String = "Some text"
 
-            override fun onRemembered() {
-                currentlyRemembered = true
+                override fun onRemembered() {
+                    currentlyRemembered = true
+                }
+
+                override fun onForgotten() {
+                    currentlyRemembered = false
+                }
+
+                override fun onAbandoned() {
+                    currentlyRemembered = false
+                }
             }
 
-            override fun onForgotten() {
-                currentlyRemembered = false
-            }
-
-            override fun onAbandoned() {
-                currentlyRemembered = false
-            }
-        }
-
         compose {
             if (!active) {
                 Text("Not active")
@@ -335,9 +308,7 @@
                 Text("Not active")
             }
 
-            Linear {
-                Text(rememberedState.toString())
-            }
+            Linear { Text(rememberedState.toString()) }
         }
 
         assertTrue(rememberedState.currentlyRemembered)
@@ -364,21 +335,24 @@
         var outer by mutableStateOf("Outer")
         var name by mutableStateOf("Value")
 
-        val rememberedState = object : RememberObserver {
-            var currentlyRemembered = false
-            override fun toString(): String = "Test"
-            override fun onRemembered() {
-                currentlyRemembered = true
-            }
+        val rememberedState =
+            object : RememberObserver {
+                var currentlyRemembered = false
 
-            override fun onForgotten() {
-                currentlyRemembered = false
-            }
+                override fun toString(): String = "Test"
 
-            override fun onAbandoned() {
-                currentlyRemembered = false
+                override fun onRemembered() {
+                    currentlyRemembered = true
+                }
+
+                override fun onForgotten() {
+                    currentlyRemembered = false
+                }
+
+                override fun onAbandoned() {
+                    currentlyRemembered = false
+                }
             }
-        }
 
         compose {
             Text(outer)
@@ -392,9 +366,7 @@
 
         validate {
             Text(outer)
-            Linear {
-                Text("$rememberedState $name")
-            }
+            Linear { Text("$rememberedState $name") }
         }
 
         active = false
@@ -426,20 +398,11 @@
     fun onReuseIsCalledWhenReusableContentKeyChanges() = compositionTest {
         var reuseKey by mutableStateOf(0)
         var onReuseCalls = 0
-        val onReuse: () -> Unit = {
-            onReuseCalls++
-        }
+        val onReuse: () -> Unit = { onReuseCalls++ }
 
-        compose {
-            ReusableContent(reuseKey) {
-                Linear(onReuse = onReuse) { }
-            }
-        }
+        compose { ReusableContent(reuseKey) { Linear(onReuse = onReuse) {} } }
 
-        validate {
-            Linear {
-            }
-        }
+        validate { Linear {} }
 
         assertEquals(0, onReuseCalls)
 
@@ -461,23 +424,12 @@
         var reuseKey by mutableStateOf(0)
         var onReuseCalls = 0
         val onReuseCallsWhenSetCalled = mutableListOf<Int>()
-        val onReuse: () -> Unit = {
-            onReuseCalls++
-        }
-        val onSet: () -> Unit = {
-            onReuseCallsWhenSetCalled.add(onReuseCalls)
-        }
+        val onReuse: () -> Unit = { onReuseCalls++ }
+        val onSet: () -> Unit = { onReuseCallsWhenSetCalled.add(onReuseCalls) }
 
-        compose {
-            ReusableContent(reuseKey) {
-                Linear(onReuse = onReuse, onSet = onSet) { }
-            }
-        }
+        compose { ReusableContent(reuseKey) { Linear(onReuse = onReuse, onSet = onSet) {} } }
 
-        validate {
-            Linear {
-            }
-        }
+        validate { Linear {} }
 
         assertEquals(listOf(0), onReuseCallsWhenSetCalled)
         onReuseCallsWhenSetCalled.clear()
@@ -494,21 +446,14 @@
         var reuseKey by mutableStateOf(0)
         var compositionFinished = false
         val onReuseCalls = mutableListOf<Boolean>()
-        val onReuse: () -> Unit = {
-            onReuseCalls.add(compositionFinished)
-        }
+        val onReuse: () -> Unit = { onReuseCalls.add(compositionFinished) }
 
         compose {
-            ReusableContent(reuseKey) {
-                Linear(onReuse = onReuse) { }
-            }
+            ReusableContent(reuseKey) { Linear(onReuse = onReuse) {} }
             compositionFinished = true
         }
 
-        validate {
-            Linear {
-            }
-        }
+        validate { Linear {} }
 
         assertEquals(emptyList(), onReuseCalls)
         compositionFinished = false
@@ -524,22 +469,15 @@
     fun onDeactivateIsCalledWhenReusableContentDeactivated() = compositionTest {
         var active by mutableStateOf(true)
         var onDeactivateCalls = 0
-        val onDeactivate: () -> Unit = {
-            onDeactivateCalls++
-        }
+        val onDeactivate: () -> Unit = { onDeactivateCalls++ }
 
         compose {
             ReusableContentHost(active) {
-                ReusableContent(0) {
-                    Linear(onDeactivate = onDeactivate) { }
-                }
+                ReusableContent(0) { Linear(onDeactivate = onDeactivate) {} }
             }
         }
 
-        validate {
-            Linear {
-            }
-        }
+        validate { Linear {} }
 
         assertEquals(0, onDeactivateCalls)
 
@@ -561,25 +499,16 @@
         var active by mutableStateOf(true)
         var onReuseCalls = 0
         val onReuseCallsWhenSetCalled = mutableListOf<Int>()
-        val onReuse: () -> Unit = {
-            onReuseCalls++
-        }
-        val onSet: () -> Unit = {
-            onReuseCallsWhenSetCalled.add(onReuseCalls)
-        }
+        val onReuse: () -> Unit = { onReuseCalls++ }
+        val onSet: () -> Unit = { onReuseCallsWhenSetCalled.add(onReuseCalls) }
 
         compose {
             ReusableContentHost(active) {
-                ReusableContent(0) {
-                    Linear(onReuse = onReuse, onSet = onSet) { }
-                }
+                ReusableContent(0) { Linear(onReuse = onReuse, onSet = onSet) {} }
             }
         }
 
-        validate {
-            Linear {
-            }
-        }
+        validate { Linear {} }
 
         active = false
 
@@ -598,15 +527,11 @@
     fun onReuseIsNotCalledWhenDisposed() = compositionTest {
         var emit by mutableStateOf(true)
         var onReuseCalls = 0
-        val onReuse: () -> Unit = {
-            onReuseCalls++
-        }
+        val onReuse: () -> Unit = { onReuseCalls++ }
 
         compose {
             if (emit) {
-                ReusableContent(0) {
-                    Linear(onReuse = onReuse) { }
-                }
+                ReusableContent(0) { Linear(onReuse = onReuse) {} }
             }
         }
 
@@ -621,15 +546,11 @@
         var active by mutableStateOf(true)
         var compositionFinished = false
         val onDeactivateCalls = mutableListOf<Boolean>()
-        val onDeactivate: () -> Unit = {
-            onDeactivateCalls.add(compositionFinished)
-        }
+        val onDeactivate: () -> Unit = { onDeactivateCalls.add(compositionFinished) }
 
         compose {
             ReusableContentHost(active) {
-                ReusableContent(0) {
-                    Linear(onDeactivate = onDeactivate) { }
-                }
+                ReusableContent(0) { Linear(onDeactivate = onDeactivate) {} }
             }
             if (!active) {
                 compositionFinished = true
@@ -646,15 +567,11 @@
     fun onReleaseIsCalledWhenNodeIsRemoved() = compositionTest {
         var emit by mutableStateOf(true)
         var onReleaseCalls = 0
-        val onRelease: () -> Unit = {
-            onReleaseCalls++
-        }
+        val onRelease: () -> Unit = { onReleaseCalls++ }
 
         compose {
             if (emit) {
-                ReusableContent(0) {
-                    Linear(onRelease = onRelease) { }
-                }
+                ReusableContent(0) { Linear(onRelease = onRelease) {} }
             }
         }
 
@@ -668,15 +585,9 @@
     fun onReleaseIsNotCalledOnReuse() = compositionTest {
         var key by mutableStateOf(0)
         var onReleaseCalls = 0
-        val onRelease: () -> Unit = {
-            onReleaseCalls++
-        }
+        val onRelease: () -> Unit = { onReleaseCalls++ }
 
-        compose {
-            ReusableContent(key) {
-                Linear(onRelease = onRelease) { }
-            }
-        }
+        compose { ReusableContent(key) { Linear(onRelease = onRelease) {} } }
 
         key++
         expectChanges()
@@ -689,15 +600,11 @@
         var active by mutableStateOf(true)
         var emit by mutableStateOf(true)
         var onReleaseCalls = 0
-        val onRelease: () -> Unit = {
-            onReleaseCalls++
-        }
+        val onRelease: () -> Unit = { onReleaseCalls++ }
 
         compose {
             if (emit) {
-                ReusableContentHost(active) {
-                    Linear(onRelease = onRelease) { }
-                }
+                ReusableContentHost(active) { Linear(onRelease = onRelease) {} }
             }
         }
 
@@ -716,19 +623,13 @@
     fun onReleaseIsNotCalledWithMovableContentMovement() = compositionTest {
         var wrap by mutableStateOf(true)
         var onReleaseCalls = 0
-        val onRelease: () -> Unit = {
-            onReleaseCalls++
-        }
+        val onRelease: () -> Unit = { onReleaseCalls++ }
 
-        val movableContent = movableContentOf {
-            Linear(onRelease = onRelease) { }
-        }
+        val movableContent = movableContentOf { Linear(onRelease = onRelease) {} }
 
         compose {
             if (wrap) {
-                ReusableContent(0) {
-                    movableContent()
-                }
+                ReusableContent(0) { movableContent() }
             } else {
                 movableContent()
             }
@@ -745,15 +646,11 @@
         var emit by mutableStateOf(true)
         var compositionFinished = false
         val onReleaseCalls = mutableListOf<Boolean>()
-        val onRelease: () -> Unit = {
-            onReleaseCalls.add(compositionFinished)
-        }
+        val onRelease: () -> Unit = { onReleaseCalls.add(compositionFinished) }
 
         compose {
             if (emit) {
-                ReusableContent(0) {
-                    Linear(onRelease = onRelease) { }
-                }
+                ReusableContent(0) { Linear(onRelease = onRelease) {} }
             } else {
                 compositionFinished = true
             }
@@ -780,9 +677,7 @@
                         if (subcomposition == null) {
                             subcomposition =
                                 Composition(ViewApplier(root), context).apply {
-                                    setContent {
-                                        Text("${local.current}")
-                                    }
+                                    setContent { Text("${local.current}") }
                                 }
                         }
                     }
@@ -790,9 +685,7 @@
             }
         }
 
-        validate {
-            Text("$key")
-        }
+        validate { Text("$key") }
 
         active = false
         expectChanges()
@@ -809,42 +702,40 @@
     fun forceReuseForgetsWhenContentDidntChange() = compositionTest {
         var active by mutableStateOf(true)
 
-        val rememberedState = object : RememberObserver {
-            var rememberCount = 0
-            var forgottenCount = 0
-            var abandonCount = 0
+        val rememberedState =
+            object : RememberObserver {
+                var rememberCount = 0
+                var forgottenCount = 0
+                var abandonCount = 0
 
-            override fun toString(): String = "Some text"
+                override fun toString(): String = "Some text"
 
-            override fun onRemembered() {
-                rememberCount++
-            }
+                override fun onRemembered() {
+                    rememberCount++
+                }
 
-            override fun onForgotten() {
-                forgottenCount++
-            }
+                override fun onForgotten() {
+                    forgottenCount++
+                }
 
-            override fun onAbandoned() {
-                abandonCount++
-            }
-        }
-
-        val content = @Composable {
-            ReusableContentHost(active) {
-                Linear {
-                    val state = remember { rememberedState }
-                    Text(state.toString())
+                override fun onAbandoned() {
+                    abandonCount++
                 }
             }
-        }
+
+        val content =
+            @Composable {
+                ReusableContentHost(active) {
+                    Linear {
+                        val state = remember { rememberedState }
+                        Text(state.toString())
+                    }
+                }
+            }
 
         compose(content)
 
-        validate {
-            Linear {
-                Text(rememberedState.toString())
-            }
-        }
+        validate { Linear { Text(rememberedState.toString()) } }
 
         assertEquals(1, rememberedState.rememberCount)
         assertEquals(0, rememberedState.forgottenCount)
@@ -868,40 +759,38 @@
 
     @Test
     fun deactivatesForgetsWhenContentDidntChange() = compositionTest {
-        val rememberedState = object : RememberObserver {
-            var rememberCount = 0
-            var forgottenCount = 0
-            var abandonCount = 0
+        val rememberedState =
+            object : RememberObserver {
+                var rememberCount = 0
+                var forgottenCount = 0
+                var abandonCount = 0
 
-            override fun toString(): String = "Some text"
+                override fun toString(): String = "Some text"
 
-            override fun onRemembered() {
-                rememberCount++
+                override fun onRemembered() {
+                    rememberCount++
+                }
+
+                override fun onForgotten() {
+                    forgottenCount++
+                }
+
+                override fun onAbandoned() {
+                    abandonCount++
+                }
             }
 
-            override fun onForgotten() {
-                forgottenCount++
+        val content =
+            @Composable {
+                Linear {
+                    val state = remember { rememberedState }
+                    Text(state.toString())
+                }
             }
 
-            override fun onAbandoned() {
-                abandonCount++
-            }
-        }
-
-        val content = @Composable {
-            Linear {
-                val state = remember { rememberedState }
-                Text(state.toString())
-            }
-        }
-
         compose(content)
 
-        validate {
-            Linear {
-                Text(rememberedState.toString())
-            }
-        }
+        validate { Linear { Text(rememberedState.toString()) } }
 
         assertEquals(1, rememberedState.rememberCount)
         assertEquals(0, rememberedState.forgottenCount)
@@ -923,26 +812,27 @@
     fun reusableContentTriggersRememberObserver() = compositionTest {
         var reuseKey by mutableStateOf(0)
 
-        val rememberedState = object : RememberObserver {
-            var rememberCount = 0
-            var forgottenCount = 0
-            var abandonCount = 0
+        val rememberedState =
+            object : RememberObserver {
+                var rememberCount = 0
+                var forgottenCount = 0
+                var abandonCount = 0
 
-            override fun toString(): String = "Some text"
+                override fun toString(): String = "Some text"
 
-            override fun onRemembered() {
-                rememberCount++
+                override fun onRemembered() {
+                    rememberCount++
+                }
+
+                override fun onForgotten() {
+                    forgottenCount++
+                }
+
+                override fun onAbandoned() {
+                    abandonCount++
+                }
             }
 
-            override fun onForgotten() {
-                forgottenCount++
-            }
-
-            override fun onAbandoned() {
-                abandonCount++
-            }
-        }
-
         compose {
             ReusableContent(reuseKey) {
                 val state = remember { rememberedState }
@@ -950,9 +840,7 @@
             }
         }
 
-        validate {
-            Text("$rememberedState")
-        }
+        validate { Text("$rememberedState") }
 
         assertEquals(1, rememberedState.rememberCount)
         assertEquals(0, rememberedState.forgottenCount)
@@ -968,8 +856,10 @@
     }
 }
 
-private fun View.findTextWith(contains: String) =
-    find { it.name == "text" && it.text?.contains(contains) == true }
+private fun View.findTextWith(contains: String) = find {
+    it.name == "text" && it.text?.contains(contains) == true
+}
+
 private fun CompositionTestScope.findTextWith(contains: String) = root.findTextWith(contains)
 
 private fun View.find(predicate: (view: View) -> Boolean): View? {
diff --git a/compose/runtime/runtime/src/nonEmulatorCommonTest/kotlin/androidx/compose/runtime/CompositionTests.kt b/compose/runtime/runtime/src/nonEmulatorCommonTest/kotlin/androidx/compose/runtime/CompositionTests.kt
index 1a2acaa..e360e5a 100644
--- a/compose/runtime/runtime/src/nonEmulatorCommonTest/kotlin/androidx/compose/runtime/CompositionTests.kt
+++ b/compose/runtime/runtime/src/nonEmulatorCommonTest/kotlin/androidx/compose/runtime/CompositionTests.kt
@@ -15,6 +15,7 @@
  */
 
 @file:OptIn(InternalComposeApi::class)
+
 package androidx.compose.runtime
 
 import androidx.compose.runtime.mock.Contact
@@ -71,8 +72,7 @@
 import kotlinx.coroutines.test.runTest
 import kotlinx.coroutines.withContext
 
-@Composable
-fun Container(content: @Composable () -> Unit) = content()
+@Composable fun Container(content: @Composable () -> Unit) = content()
 
 @Stable
 @OptIn(InternalComposeApi::class)
@@ -80,41 +80,29 @@
 class CompositionTests {
     @Test
     fun simple() = compositionTest {
-        compose {
-            Text("Hello!")
-        }
+        compose { Text("Hello!") }
 
-        validate {
-            Text("Hello!")
-        }
+        validate { Text("Hello!") }
     }
 
     @Test
     fun simpleChanges() = compositionTest {
         var name by mutableStateOf("Bob")
-        compose {
-            Text("Hello $name")
-        }
+        compose { Text("Hello $name") }
 
-        validate {
-            Text("Hello $name")
-        }
+        validate { Text("Hello $name") }
 
         name = "Robert"
 
         expectChanges()
 
-        validate {
-            Text("Hello $name")
-        }
+        validate { Text("Hello $name") }
     }
 
     @Test
     fun testComposeAModel() = compositionTest {
         val model = testModel()
-        compose {
-            SelectContact(model)
-        }
+        compose { SelectContact(model) }
 
         validate {
             Linear {
@@ -137,21 +125,16 @@
     @Test
     fun testRecomposeWithoutChanges() = compositionTest {
         val model = testModel()
-        compose {
-            SelectContact(model)
-        }
+        compose { SelectContact(model) }
 
         expectNoChanges()
 
-        validate {
-            SelectContact(model)
-        }
+        validate { SelectContact(model) }
     }
 
     @Test
     fun testInsertAContact() = compositionTest {
-        val model =
-            testModel(mutableListOf(bob, jon))
+        val model = testModel(mutableListOf(bob, jon))
         var scope: RecomposeScope? = null
 
         compose {
@@ -193,13 +176,7 @@
 
     @Test
     fun testMoveAContact() = compositionTest {
-        val model = testModel(
-            mutableListOf(
-                bob,
-                steve,
-                jon
-            )
-        )
+        val model = testModel(mutableListOf(bob, steve, jon))
         var scope: RecomposeScope? = null
 
         compose {
@@ -228,13 +205,7 @@
 
     @Test
     fun testChangeTheFilter() = compositionTest {
-        val model = testModel(
-            mutableListOf(
-                bob,
-                steve,
-                jon
-            )
-        )
+        val model = testModel(mutableListOf(bob, steve, jon))
         var scope: RecomposeScope? = null
 
         compose {
@@ -251,9 +222,7 @@
                 skip()
                 Linear {
                     skip()
-                    Linear {
-                        contact(jon)
-                    }
+                    Linear { contact(jon) }
                 }
             }
         }
@@ -268,9 +237,7 @@
                 Text("A")
                 Wrap {
                     if (condition.value) {
-                        InlineLinear {
-                            Text("B")
-                        }
+                        InlineLinear { Text("B") }
                     }
                 }
             }
@@ -280,9 +247,7 @@
             Linear {
                 Text("A")
                 if (condition.value) {
-                    Linear {
-                        Text("B")
-                    }
+                    Linear { Text("B") }
                 }
             }
         }
@@ -296,45 +261,27 @@
 
     @Test
     fun testComposeCompositionWithMultipleRoots() = compositionTest {
-        val reports = listOf(
-            jim_reports_to_sally,
-            rob_reports_to_alice,
-            clark_reports_to_lois
-        )
+        val reports = listOf(jim_reports_to_sally, rob_reports_to_alice, clark_reports_to_lois)
 
-        compose {
-            ReportsReport(reports)
-        }
+        compose { ReportsReport(reports) }
 
-        validate {
-            ReportsReport(reports)
-        }
+        validate { ReportsReport(reports) }
     }
 
     @Test
     fun testMoveCompositionWithMultipleRoots() = compositionTest {
-        var reports = listOf(
-            jim_reports_to_sally,
-            rob_reports_to_alice,
-            clark_reports_to_lois
-        )
+        var reports = listOf(jim_reports_to_sally, rob_reports_to_alice, clark_reports_to_lois)
         var scope: RecomposeScope? = null
         compose {
             scope = currentRecomposeScope
             ReportsReport(reports)
         }
 
-        reports = listOf(
-            jim_reports_to_sally,
-            clark_reports_to_lois,
-            rob_reports_to_alice
-        )
+        reports = listOf(jim_reports_to_sally, clark_reports_to_lois, rob_reports_to_alice)
         scope?.invalidate()
         expectChanges()
 
-        validate {
-            ReportsReport(reports)
-        }
+        validate { ReportsReport(reports) }
     }
 
     @Test
@@ -347,9 +294,7 @@
             scope = currentRecomposeScope
             Text("Before")
             if (includeA) {
-                Linear {
-                    Text("A")
-                }
+                Linear { Text("A") }
             } else {
                 Edit("B")
             }
@@ -359,35 +304,25 @@
         fun MockViewValidator.Composition() {
             Text("Before")
             if (includeA) {
-                Linear {
-                    Text("A")
-                }
+                Linear { Text("A") }
             } else {
                 Edit("B")
             }
             Text("After")
         }
 
-        compose {
-            Composition()
-        }
+        compose { Composition() }
 
-        validate {
-            this.Composition()
-        }
+        validate { this.Composition() }
 
         includeA = false
         scope?.invalidate()
         expectChanges()
-        validate {
-            this.Composition()
-        }
+        validate { this.Composition() }
         includeA = true
         scope?.invalidate()
         expectChanges()
-        validate {
-            this.Composition()
-        }
+        validate { this.Composition() }
         scope?.invalidate()
         expectNoChanges()
     }
@@ -456,12 +391,7 @@
 
     @Test
     fun testMovingMemoization() = compositionTest {
-        var points = listOf(
-            Point(1, 2),
-            Point(2, 3),
-            Point(4, 5),
-            Point(6, 7)
-        )
+        var points = listOf(Point(1, 2), Point(2, 3), Point(4, 5), Point(6, 7))
         var scope: RecomposeScope? = null
         compose {
             scope = currentRecomposeScope
@@ -470,12 +400,7 @@
 
         validate { Points(points) }
 
-        points = listOf(
-            Point(1, 2),
-            Point(4, 5),
-            Point(2, 3),
-            Point(6, 7)
-        )
+        points = listOf(Point(1, 2), Point(4, 5), Point(2, 3), Point(6, 7))
         scope?.invalidate()
         expectChanges()
 
@@ -497,21 +422,11 @@
 
         @Composable
         fun ReportsReport(reports: Iterable<Report>) {
-            Linear {
-                Repeated(of = reports) { report ->
-                    Reporter(report)
-                }
-            }
+            Linear { Repeated(of = reports) { report -> Reporter(report) } }
         }
 
-        val reports = listOf(
-            jim_reports_to_sally,
-            rob_reports_to_alice,
-            clark_reports_to_lois
-        )
-        compose {
-            ReportsReport(reports)
-        }
+        val reports = listOf(jim_reports_to_sally, rob_reports_to_alice, clark_reports_to_lois)
+        compose { ReportsReport(reports) }
 
         validate {
             Linear {
@@ -528,99 +443,61 @@
     fun testComposeTwoAttributeComponent() = compositionTest {
         @Composable
         fun Two2(first: Int = 1, second: Int = 2) {
-            Linear {
-                Text("$first $second")
-            }
+            Linear { Text("$first $second") }
         }
 
         fun MockViewValidator.two(first: Int, second: Int) {
-            Linear {
-                Text("$first $second")
-            }
+            Linear { Text("$first $second") }
         }
 
-        compose {
-            Two2(41, 42)
-        }
+        compose { Two2(41, 42) }
 
-        validate {
-            two(41, 42)
-        }
+        validate { two(41, 42) }
     }
 
     @Test
     fun testComposeThreeAttributeComponent() = compositionTest {
         @Composable
         fun Three3(first: Int = 1, second: Int = 2, third: Int = 3) {
-            Linear {
-                Text("$first $second $third")
-            }
+            Linear { Text("$first $second $third") }
         }
 
         fun MockViewValidator.Three(first: Int, second: Int, third: Int) {
-            Linear {
-                Text("$first $second $third")
-            }
+            Linear { Text("$first $second $third") }
         }
 
-        compose {
-            Three3(41, 42, 43)
-        }
+        compose { Three3(41, 42, 43) }
 
-        validate {
-            Three(41, 42, 43)
-        }
+        validate { Three(41, 42, 43) }
     }
 
     @Test
     fun testComposeFourOrMoreAttributeComponent() = compositionTest {
         @Composable
-        fun Four4(
-            first: Int = 1,
-            second: Int = 2,
-            third: Int = 3,
-            fourth: Int = 4
-        ) {
-            Linear {
-                Text("$first $second $third $fourth")
-            }
+        fun Four4(first: Int = 1, second: Int = 2, third: Int = 3, fourth: Int = 4) {
+            Linear { Text("$first $second $third $fourth") }
         }
 
         fun MockViewValidator.Four(first: Int, second: Int, third: Int, fourth: Int) {
-            Linear {
-                Text("$first $second $third $fourth")
-            }
+            Linear { Text("$first $second $third $fourth") }
         }
 
-        compose {
-            Four4(41, 42, 43, 44)
-        }
+        compose { Four4(41, 42, 43, 44) }
 
-        validate {
-            Four(41, 42, 43, 44)
-        }
+        validate { Four(41, 42, 43, 44) }
     }
 
     @Test
     fun testSkippingACall() = compositionTest {
-
         @Composable
         fun Show(value: Int) {
-            Linear {
-                Text("$value")
-            }
-            Linear {
-                Text("value")
-            }
+            Linear { Text("$value") }
+            Linear { Text("value") }
         }
 
         fun MockViewValidator.Show(value: Int) {
-            Linear {
-                Text("$value")
-            }
-            Linear {
-                Text("value")
-            }
+            Linear { Text("$value") }
+            Linear { Text("value") }
         }
 
         @Composable
@@ -651,14 +528,10 @@
         }
 
         fun validate() {
-            validate {
-                this.Test(showThree)
-            }
+            validate { this.Test(showThree) }
         }
 
-        compose {
-            Test()
-        }
+        compose { Test() }
 
         validate()
 
@@ -674,9 +547,7 @@
 
         itemRendererCalls = 0
         scrollingListCalls = 0
-        compose {
-            TestSkippingContent(data = data)
-        }
+        compose { TestSkippingContent(data = data) }
 
         data.value++
         advance()
@@ -713,17 +584,13 @@
             CallOne(value)
         }
 
-        validate {
-            this.One(42)
-        }
+        validate { this.One(42) }
 
         value = 43
         scope?.invalidate()
         expectChanges()
 
-        validate {
-            this.One(43)
-        }
+        validate { this.One(43) }
     }
 
     @Test
@@ -749,17 +616,13 @@
             CallOne(value)
         }
 
-        validate {
-            this.One(42)
-        }
+        validate { this.One(42) }
 
         value = 43
         scope?.invalidate()
         expectChanges()
 
-        validate {
-            this.One(43)
-        }
+        validate { this.One(43) }
 
         scope?.invalidate()
         expectNoChanges()
@@ -783,22 +646,12 @@
 
         @Composable
         fun ReportsReport(reports: Iterable<Report>) {
-            Linear {
-                Repeated(of = reports) { report ->
-                    Reporter(report)
-                }
-            }
+            Linear { Repeated(of = reports) { report -> Reporter(report) } }
         }
 
         val r = Report("Lois", "Perry")
-        val reports = listOf(
-            jim_reports_to_sally,
-            rob_reports_to_alice,
-            clark_reports_to_lois, r
-        )
-        compose {
-            ReportsReport(reports)
-        }
+        val reports = listOf(jim_reports_to_sally, rob_reports_to_alice, clark_reports_to_lois, r)
+        compose { ReportsReport(reports) }
 
         validate {
             Linear {
@@ -849,23 +702,14 @@
             }
         }
 
-        @Composable fun ReportsReport(reports: Iterable<Report>) {
-            Linear {
-                Repeated(of = reports) { report ->
-                    Reporter(report)
-                }
-            }
+        @Composable
+        fun ReportsReport(reports: Iterable<Report>) {
+            Linear { Repeated(of = reports) { report -> Reporter(report) } }
         }
 
         val r = Report("Lois", "Perry")
-        val reports = listOf(
-            jim_reports_to_sally,
-            rob_reports_to_alice,
-            clark_reports_to_lois, r
-        )
-        compose {
-            ReportsReport(reports)
-        }
+        val reports = listOf(jim_reports_to_sally, rob_reports_to_alice, clark_reports_to_lois, r)
+        compose { ReportsReport(reports) }
 
         validate {
             Linear {
@@ -921,10 +765,7 @@
         }
 
         @Composable
-        fun ReportsReport(
-            reports: Iterable<Report>,
-            include: (report: Report) -> Boolean
-        ) {
+        fun ReportsReport(reports: Iterable<Report>, include: (report: Report) -> Boolean) {
             Linear {
                 Repeated(of = reports) { report ->
                     if (include(report)) {
@@ -935,12 +776,7 @@
         }
 
         val r = Report("Lois", "Perry")
-        val reports = listOf(
-            jim_reports_to_sally,
-            rob_reports_to_alice,
-            clark_reports_to_lois,
-            r
-        )
+        val reports = listOf(jim_reports_to_sally, rob_reports_to_alice, clark_reports_to_lois, r)
         val all: (report: Report) -> Boolean = { true }
         val notLois: (report: Report) -> Boolean = { it.from != "Lois" && it.to != "Lois" }
 
@@ -1007,9 +843,7 @@
             Text("value = $value")
         }
 
-        compose {
-            Test(1)
-        }
+        compose { Test(1) }
 
         validate { this.Test(1) }
 
@@ -1257,10 +1091,7 @@
         }
 
         fun MockViewValidator.Composition() {
-            Linear {
-                for (value in values)
-                    Text("$value")
-            }
+            Linear { for (value in values) Text("$value") }
         }
 
         compose { Composition() }
@@ -1279,7 +1110,8 @@
     fun testInsertInGroups() = compositionTest {
         var threeVisible by mutableStateOf(false)
 
-        @Composable fun Composition() {
+        @Composable
+        fun Composition() {
             Linear {
                 Text("one")
                 Text("two")
@@ -1287,9 +1119,7 @@
                     Text("three")
                     Text("four")
                 }
-                Linear {
-                    Text("five")
-                }
+                Linear { Text("five") }
             }
         }
 
@@ -1301,9 +1131,7 @@
                     Text("three")
                     Text("four")
                 }
-                Linear {
-                    Text("five")
-                }
+                Linear { Text("five") }
             }
         }
 
@@ -1322,15 +1150,11 @@
 
         @Composable
         fun Composition() {
-            Linear {
-                Text(text)
-            }
+            Linear { Text(text) }
         }
 
         fun MockViewValidator.Composition() {
-            Linear {
-                Text(text)
-            }
+            Linear { Text(text) }
         }
 
         compose { Composition() }
@@ -1432,7 +1256,8 @@
         var innerScope: RecomposeScope? = null
         var forceInvalidate = false
 
-        @Composable fun Composition() {
+        @Composable
+        fun Composition() {
             Linear {
                 outerScope = currentRecomposeScope
                 for (i in 1..texts) {
@@ -1471,20 +1296,22 @@
 
     @Test
     fun testRememberObserver_Remember_Simple() = compositionTest {
-        val rememberedObject = object : RememberObserver {
-            var count = 0
-            override fun onRemembered() {
-                count++
-            }
+        val rememberedObject =
+            object : RememberObserver {
+                var count = 0
 
-            override fun onForgotten() {
-                count--
-            }
+                override fun onRemembered() {
+                    count++
+                }
 
-            override fun onAbandoned() {
-                assertEquals(0, count, "onRemember called on an abandon object")
+                override fun onForgotten() {
+                    count--
+                }
+
+                override fun onAbandoned() {
+                    assertEquals(0, count, "onRemember called on an abandon object")
+                }
             }
-        }
 
         var scope: RecomposeScope? = null
 
@@ -1498,14 +1325,10 @@
         }
 
         fun MockViewValidator.Composition() {
-            Linear {
-                Text("Some text")
-            }
+            Linear { Text("Some text") }
         }
 
-        compose {
-            Composition()
-        }
+        compose { Composition() }
         validate { this.Composition() }
 
         assertEquals(1, rememberedObject.count, "object should have been notified of a remember")
@@ -1519,20 +1342,22 @@
 
     @Test
     fun testRememberObserver_Remember_SingleNotification() = compositionTest {
-        val rememberedObject = object : RememberObserver {
-            var count = 0
-            override fun onRemembered() {
-                count++
-            }
+        val rememberedObject =
+            object : RememberObserver {
+                var count = 0
 
-            override fun onForgotten() {
-                count--
-            }
+                override fun onRemembered() {
+                    count++
+                }
 
-            override fun onAbandoned() {
-                assertEquals(0, count, "onRemember called on an abandon object")
+                override fun onForgotten() {
+                    count--
+                }
+
+                override fun onAbandoned() {
+                    assertEquals(0, count, "onRemember called on an abandon object")
+                }
             }
-        }
 
         var value by mutableStateOf(0)
         @Composable
@@ -1550,17 +1375,11 @@
         }
 
         fun MockViewValidator.Composition() {
-            Linear {
-                Text("Some text $value")
-            }
-            Linear {
-                Text("Some other text $value")
-            }
+            Linear { Text("Some text $value") }
+            Linear { Text("Some other text $value") }
         }
 
-        compose {
-            Composition()
-        }
+        compose { Composition() }
         validate { this.Composition() }
 
         assertEquals(2, rememberedObject.count, "object should have been notified remembered twice")
@@ -1574,20 +1393,22 @@
 
     @Test
     fun testRememberObserver_Forget_Simple() = compositionTest {
-        val rememberObject = object : RememberObserver {
-            var count = 0
-            override fun onRemembered() {
-                count++
-            }
+        val rememberObject =
+            object : RememberObserver {
+                var count = 0
 
-            override fun onForgotten() {
-                count--
-            }
+                override fun onRemembered() {
+                    count++
+                }
 
-            override fun onAbandoned() {
-                assertEquals(0, count, "onRemember called on an abandon object")
+                override fun onForgotten() {
+                    count--
+                }
+
+                override fun onAbandoned() {
+                    assertEquals(0, count, "onRemember called on an abandon object")
+                }
             }
-        }
 
         @Composable
         fun Composition(includeRememberObject: Boolean) {
@@ -1605,9 +1426,7 @@
         fun MockViewValidator.Composition(includeRememberObject: Boolean) {
             Linear {
                 if (includeRememberObject) {
-                    Linear {
-                        Text("Some text")
-                    }
+                    Linear { Text("Some text") }
                 }
             }
         }
@@ -1640,22 +1459,24 @@
     fun testRemember_Forget_ForgetOnRemember() = compositionTest {
         var expectedRemember = true
         var expectedForget = true
-        val rememberObject = object : RememberObserver {
-            var count = 0
-            override fun onRemembered() {
-                val remembered = count++ == 0
-                assertTrue(remembered && expectedRemember, "No remember expected")
-            }
+        val rememberObject =
+            object : RememberObserver {
+                var count = 0
 
-            override fun onForgotten() {
-                val forgotten = --count == 0
-                assertTrue(forgotten && expectedForget, "No forget expected")
-            }
+                override fun onRemembered() {
+                    val remembered = count++ == 0
+                    assertTrue(remembered && expectedRemember, "No remember expected")
+                }
 
-            override fun onAbandoned() {
-                assertEquals(0, count, "onAbandon called after onRemember")
+                override fun onForgotten() {
+                    val forgotten = --count == 0
+                    assertTrue(forgotten && expectedForget, "No forget expected")
+                }
+
+                override fun onAbandoned() {
+                    assertEquals(0, count, "onAbandon called after onRemember")
+                }
             }
-        }
 
         @Composable
         fun Composition(a: Boolean, b: Boolean, c: Boolean) {
@@ -1693,19 +1514,13 @@
         fun MockViewValidator.Composition(a: Boolean, b: Boolean, c: Boolean) {
             Linear {
                 if (a) {
-                    Linear {
-                        Text("a")
-                    }
+                    Linear { Text("a") }
                 }
                 if (b) {
-                    Linear {
-                        Text("b")
-                    }
+                    Linear { Text("b") }
                 }
                 if (c) {
-                    Linear {
-                        Text("c")
-                    }
+                    Linear { Text("c") }
                 }
             }
         }
@@ -1721,36 +1536,16 @@
             scope = currentRecomposeScope
             Composition(a = a, b = b, c = c)
         }
-        validate {
-            this.Composition(
-                a = true,
-                b = false,
-                c = false
-            )
-        }
+        validate { this.Composition(a = true, b = false, c = false) }
 
-        assertEquals(
-            1,
-            rememberObject.count,
-            "object should have been notified of an enter"
-        )
+        assertEquals(1, rememberObject.count, "object should have been notified of an enter")
 
         expectedRemember = false
         expectedForget = false
         scope?.invalidate()
         expectNoChanges()
-        validate {
-            this.Composition(
-                a = true,
-                b = false,
-                c = false
-            )
-        }
-        assertEquals(
-            1,
-            rememberObject.count,
-            "Object should have only been notified once"
-        )
+        validate { this.Composition(a = true, b = false, c = false) }
+        assertEquals(1, rememberObject.count, "Object should have only been notified once")
 
         expectedRemember = true
         expectedForget = true
@@ -1759,13 +1554,7 @@
         c = false
         scope?.invalidate()
         expectChanges()
-        validate {
-            this.Composition(
-                a = false,
-                b = true,
-                c = false
-            )
-        }
+        validate { this.Composition(a = false, b = true, c = false) }
         assertEquals(1, rememberObject.count, "No enter or leaves")
 
         expectedRemember = true
@@ -1775,13 +1564,7 @@
         c = true
         scope?.invalidate()
         expectChanges()
-        validate {
-            this.Composition(
-                a = false,
-                b = false,
-                c = true
-            )
-        }
+        validate { this.Composition(a = false, b = false, c = true) }
         assertEquals(1, rememberObject.count, "No enter or leaves")
 
         expectedRemember = true
@@ -1791,13 +1574,7 @@
         c = false
         scope?.invalidate()
         expectChanges()
-        validate {
-            this.Composition(
-                a = true,
-                b = false,
-                c = false
-            )
-        }
+        validate { this.Composition(a = true, b = false, c = false) }
         assertEquals(1, rememberObject.count, "No enter or leaves")
 
         expectedRemember = false
@@ -1807,48 +1584,46 @@
         c = false
         scope?.invalidate()
         expectChanges()
-        validate {
-            this.Composition(
-                a = false,
-                b = false,
-                c = false
-            )
-        }
+        validate { this.Composition(a = false, b = false, c = false) }
         assertEquals(0, rememberObject.count, "A leave")
     }
 
     @Test
     fun testRemember_Forget_ForgetOnReplace() = compositionTest {
-        val rememberObject1 = object : RememberObserver {
-            var count = 0
-            override fun onRemembered() {
-                count++
+        val rememberObject1 =
+            object : RememberObserver {
+                var count = 0
+
+                override fun onRemembered() {
+                    count++
+                }
+
+                override fun onForgotten() {
+                    count--
+                }
+
+                override fun onAbandoned() {
+                    assertEquals(0, count, "onAbandon called after onRemember")
+                }
             }
 
-            override fun onForgotten() {
-                count--
-            }
+        val rememberObject2 =
+            object : RememberObserver {
+                var count = 0
 
-            override fun onAbandoned() {
-                assertEquals(0, count, "onAbandon called after onRemember")
-            }
-        }
+                override fun onRemembered() {
+                    count++
+                }
 
-        val rememberObject2 = object : RememberObserver {
-            var count = 0
-            override fun onRemembered() {
-                count++
-            }
+                override fun onForgotten() {
+                    count--
+                }
 
-            override fun onForgotten() {
-                count--
+                override fun onAbandoned() {
+                    assertEquals(0, count, "onAbandon called after onRemember")
+                }
             }
 
-            override fun onAbandoned() {
-                assertEquals(0, count, "onAbandon called after onRemember")
-            }
-        }
-
         var rememberObject: Any = rememberObject1
         var scope: RecomposeScope? = null
 
@@ -1865,11 +1640,7 @@
         }
 
         fun MockViewValidator.Composition() {
-            Linear {
-                Linear {
-                    Text("Some value")
-                }
-            }
+            Linear { Linear { Text("Some value") } }
         }
 
         compose {
@@ -1900,31 +1671,29 @@
         var order = 0
         val objects = mutableListOf<Any>()
         val newRememberObject = { name: String ->
-            object :
-                RememberObserver,
-                Counted,
-                Ordered,
-                Named {
-                override var name = name
-                override var count = 0
-                override var rememberOrder = -1
-                override var forgetOrder = -1
-                override fun onRemembered() {
-                    assertEquals(-1, rememberOrder, "Only one call to onRemembered expected")
-                    rememberOrder = order++
-                    count++
-                }
+            object : RememberObserver, Counted, Ordered, Named {
+                    override var name = name
+                    override var count = 0
+                    override var rememberOrder = -1
+                    override var forgetOrder = -1
 
-                override fun onForgotten() {
-                    assertEquals(-1, forgetOrder, "Only one call to onForgotten expected")
-                    forgetOrder = order++
-                    count--
-                }
+                    override fun onRemembered() {
+                        assertEquals(-1, rememberOrder, "Only one call to onRemembered expected")
+                        rememberOrder = order++
+                        count++
+                    }
 
-                override fun onAbandoned() {
-                    assertEquals(0, count, "onAbandoned called after onRemembered")
+                    override fun onForgotten() {
+                        assertEquals(-1, forgetOrder, "Only one call to onForgotten expected")
+                        forgetOrder = order++
+                        count--
+                    }
+
+                    override fun onAbandoned() {
+                        assertEquals(0, count, "onAbandoned called after onRemembered")
+                    }
                 }
-            }.also { objects.add(it) }
+                .also { objects.add(it) }
         }
 
         @Composable
@@ -1966,9 +1735,7 @@
                     Linear {
                         RememberUser("G")
                         RememberUser("H")
-                        Linear {
-                            RememberUser("I")
-                        }
+                        Linear { RememberUser("I") }
                     }
                     RememberUser("J")
                 }
@@ -1977,16 +1744,12 @@
 
         @Composable
         fun Composition(includeTree: Boolean) {
-            Linear {
-                if (includeTree) Tree()
-            }
+            Linear { if (includeTree) Tree() }
         }
 
         var value by mutableStateOf(true)
 
-        compose {
-            Composition(value)
-        }
+        compose { Composition(value) }
 
         assertTrue(
             objects.mapNotNull { it as? Counted }.map { it.count == 1 }.all { it },
@@ -2004,17 +1767,21 @@
         assertArrayEquals(
             "Expected enter order",
             arrayOf("A", "B", "C", "D", "E", "F", "G", "H", "I", "J"),
-            objects.mapNotNull { it as? Ordered }.sortedBy { it.rememberOrder }.map {
-                (it as Named).name
-            }.toTypedArray()
+            objects
+                .mapNotNull { it as? Ordered }
+                .sortedBy { it.rememberOrder }
+                .map { (it as Named).name }
+                .toTypedArray()
         )
 
         assertArrayEquals(
             "Expected leave order",
             arrayOf("J", "I", "H", "G", "F", "E", "D", "C", "B", "A"),
-            objects.mapNotNull { it as? Ordered }.sortedBy { it.forgetOrder }.map {
-                (it as Named).name
-            }.toTypedArray()
+            objects
+                .mapNotNull { it as? Ordered }
+                .sortedBy { it.forgetOrder }
+                .map { (it as Named).name }
+                .toTypedArray()
         )
     }
 
@@ -2023,34 +1790,32 @@
         var order = 0
         val objects = mutableListOf<Any>()
         val newRememberObject = { name: String ->
-            object :
-                RememberObserver,
-                Counted,
-                Ordered,
-                Named {
-                override var name = name
-                override var count = 0
-                override var rememberOrder = -1
-                override var forgetOrder = -1
-                override fun onRemembered() {
-                    assertEquals(-1, rememberOrder, "Only one call to onRemembered expected")
-                    rememberOrder = order++
-                    count++
-                }
+            object : RememberObserver, Counted, Ordered, Named {
+                    override var name = name
+                    override var count = 0
+                    override var rememberOrder = -1
+                    override var forgetOrder = -1
 
-                override fun onForgotten() {
-                    assertEquals(-1, forgetOrder, "Only one call to onForgotten expected")
-                    forgetOrder = order++
-                    count--
-                }
+                    override fun onRemembered() {
+                        assertEquals(-1, rememberOrder, "Only one call to onRemembered expected")
+                        rememberOrder = order++
+                        count++
+                    }
 
-                override fun onAbandoned() {
-                    assertEquals(0, count, "onAbandoned called after onRemembered")
-                }
+                    override fun onForgotten() {
+                        assertEquals(-1, forgetOrder, "Only one call to onForgotten expected")
+                        forgetOrder = order++
+                        count--
+                    }
 
-                override fun toString(): String =
-                    "$name: count($count), remember($rememberOrder), forgotten($forgetOrder)"
-            }.also { objects.add(it) }
+                    override fun onAbandoned() {
+                        assertEquals(0, count, "onAbandoned called after onRemembered")
+                    }
+
+                    override fun toString(): String =
+                        "$name: count($count), remember($rememberOrder), forgotten($forgetOrder)"
+                }
+                .also { objects.add(it) }
         }
 
         @Composable
@@ -2091,9 +1856,7 @@
                     Linear {
                         RememberUser("G")
                         RememberUser("H")
-                        Linear {
-                            RememberUser("I")
-                        }
+                        Linear { RememberUser("I") }
                         RememberUser("J")
                     }
                     RememberUser("K")
@@ -2103,16 +1866,12 @@
 
         @Composable
         fun Composition(includeTree: Boolean) {
-            Linear {
-                if (includeTree) Tree()
-            }
+            Linear { if (includeTree) Tree() }
         }
 
         var value by mutableStateOf(true)
 
-        compose {
-            Composition(value)
-        }
+        compose { Composition(value) }
 
         assertTrue(
             objects.mapNotNull { it as? Counted }.map { it.count == 1 }.all { it },
@@ -2127,21 +1886,19 @@
             "All object should have left"
         )
 
-        val namesInRememberOrder = objects.mapNotNull {
-            it as? Ordered
-        }.sortedBy {
-            it.rememberOrder
-        }.map {
-            (it as Named).name
-        }.toTypedArray()
+        val namesInRememberOrder =
+            objects
+                .mapNotNull { it as? Ordered }
+                .sortedBy { it.rememberOrder }
+                .map { (it as Named).name }
+                .toTypedArray()
 
-        val namesInForgetOrder = objects.mapNotNull {
-            it as? Ordered
-        }.sortedBy {
-            it.forgetOrder
-        }.map {
-            (it as Named).name
-        }.toTypedArray()
+        val namesInForgetOrder =
+            objects
+                .mapNotNull { it as? Ordered }
+                .sortedBy { it.forgetOrder }
+                .map { (it as Named).name }
+                .toTypedArray()
 
         assertArrayEquals(
             "Expected enter order",
@@ -2161,36 +1918,33 @@
         var order = 0
         val objects = mutableListOf<Any>()
         val newRememberObject = { name: String, data: Int ->
-            object :
-                RememberObserver,
-                Counted,
-                Ordered,
-                Named,
-                WithData {
-                override var name = name
-                override var data = data
-                override var count = 0
-                override var rememberOrder = -1
-                override var forgetOrder = -1
-                override fun onRemembered() {
-                    assertEquals(-1, rememberOrder, "Only one call to onRemembered expected")
-                    rememberOrder = order++
-                    count++
-                }
+            object : RememberObserver, Counted, Ordered, Named, WithData {
+                    override var name = name
+                    override var data = data
+                    override var count = 0
+                    override var rememberOrder = -1
+                    override var forgetOrder = -1
 
-                override fun onForgotten() {
-                    assertEquals(-1, forgetOrder, "Only one call to onForgotten expected")
-                    forgetOrder = order++
-                    count--
-                }
+                    override fun onRemembered() {
+                        assertEquals(-1, rememberOrder, "Only one call to onRemembered expected")
+                        rememberOrder = order++
+                        count++
+                    }
 
-                override fun onAbandoned() {
-                    assertEquals(0, count, "onAbandoned called after onRemembered")
-                }
+                    override fun onForgotten() {
+                        assertEquals(-1, forgetOrder, "Only one call to onForgotten expected")
+                        forgetOrder = order++
+                        count--
+                    }
 
-                override fun toString(): String =
-                    "$name: count($count), remember($rememberOrder), forgotten($forgetOrder)"
-            }.also { objects.add(it) }
+                    override fun onAbandoned() {
+                        assertEquals(0, count, "onAbandoned called after onRemembered")
+                    }
+
+                    override fun toString(): String =
+                        "$name: count($count), remember($rememberOrder), forgotten($forgetOrder)"
+                }
+                .also { objects.add(it) }
         }
 
         var changing by mutableStateOf(0)
@@ -2212,16 +1966,12 @@
 
         @Composable
         fun Composition(includeTree: Boolean) {
-            Linear {
-                if (includeTree) Tree()
-            }
+            Linear { if (includeTree) Tree() }
         }
 
         var includeTree by mutableStateOf(true)
 
-        compose {
-            Composition(includeTree)
-        }
+        compose { Composition(includeTree) }
 
         changing++
         advance()
@@ -2229,15 +1979,16 @@
         includeTree = false
         advance()
 
-        val nameAndDataInForgetOrder = objects.mapNotNull {
-            it as? Ordered
-        }.sortedBy {
-            it.forgetOrder
-        }.map {
-            val named = it as Named
-            val withData = it as WithData
-            "${named.name}:${withData.data}"
-        }.joinToString()
+        val nameAndDataInForgetOrder =
+            objects
+                .mapNotNull { it as? Ordered }
+                .sortedBy { it.forgetOrder }
+                .map {
+                    val named = it as Named
+                    val withData = it as WithData
+                    "${named.name}:${withData.data}"
+                }
+                .joinToString()
 
         assertEquals("A:0, B:10, A:1", nameAndDataInForgetOrder)
     }
@@ -2247,36 +1998,33 @@
         var order = 0
         val objects = mutableListOf<Any>()
         val newRememberObject = { name: String, data: Int ->
-            object :
-                RememberObserver,
-                Counted,
-                Ordered,
-                Named,
-                WithData {
-                override var name = name
-                override var data = data
-                override var count = 0
-                override var rememberOrder = -1
-                override var forgetOrder = -1
-                override fun onRemembered() {
-                    assertEquals(-1, rememberOrder, "Only one call to onRemembered expected")
-                    rememberOrder = order++
-                    count++
-                }
+            object : RememberObserver, Counted, Ordered, Named, WithData {
+                    override var name = name
+                    override var data = data
+                    override var count = 0
+                    override var rememberOrder = -1
+                    override var forgetOrder = -1
 
-                override fun onForgotten() {
-                    assertEquals(-1, forgetOrder, "Only one call to onForgotten expected")
-                    forgetOrder = order++
-                    count--
-                }
+                    override fun onRemembered() {
+                        assertEquals(-1, rememberOrder, "Only one call to onRemembered expected")
+                        rememberOrder = order++
+                        count++
+                    }
 
-                override fun onAbandoned() {
-                    assertEquals(0, count, "onAbandoned called after onRemembered")
-                }
+                    override fun onForgotten() {
+                        assertEquals(-1, forgetOrder, "Only one call to onForgotten expected")
+                        forgetOrder = order++
+                        count--
+                    }
 
-                override fun toString(): String =
-                    "$name: count($count), remember($rememberOrder), forgotten($forgetOrder)"
-            }.also { objects.add(it) }
+                    override fun onAbandoned() {
+                        assertEquals(0, count, "onAbandoned called after onRemembered")
+                    }
+
+                    override fun toString(): String =
+                        "$name: count($count), remember($rememberOrder), forgotten($forgetOrder)"
+                }
+                .also { objects.add(it) }
         }
 
         var changing by mutableStateOf(0)
@@ -2296,9 +2044,7 @@
             RememberUser("B2", fixed)
         }
 
-        @Composable
-        @NonRestartableComposable
-        fun NoChildren() {}
+        @Composable @NonRestartableComposable fun NoChildren() {}
 
         @Composable
         fun Composition() {
@@ -2313,23 +2059,21 @@
             }
         }
 
-        compose {
-            Composition()
-        }
+        compose { Composition() }
 
         changing++
         includeChildren = false
         advance()
 
-        val nameAndDataInForgetOrder = objects.mapNotNull { item ->
-            (item as? Ordered)?.takeIf { it.forgetOrder >= 0 }
-        }.sortedBy {
-            it.forgetOrder
-        }.joinToString {
-            val named = it as Named
-            val withData = it as WithData
-            "${named.name}:${withData.data}"
-        }
+        val nameAndDataInForgetOrder =
+            objects
+                .mapNotNull { item -> (item as? Ordered)?.takeIf { it.forgetOrder >= 0 } }
+                .sortedBy { it.forgetOrder }
+                .joinToString {
+                    val named = it as Named
+                    val withData = it as WithData
+                    "${named.name}:${withData.data}"
+                }
 
         assertEquals("B1:0, B2:10, A2:10, A1:0", nameAndDataInForgetOrder)
     }
@@ -2337,24 +2081,24 @@
     @Test
     fun testRememberObserver_Abandon_Simple() = compositionTest {
         val abandonedObjects = mutableListOf<RememberObserver>()
-        val observed = object : RememberObserver {
-            override fun onAbandoned() {
-                abandonedObjects.add(this)
-            }
+        val observed =
+            object : RememberObserver {
+                override fun onAbandoned() {
+                    abandonedObjects.add(this)
+                }
 
-            override fun onForgotten() {
-                error("Unexpected call to onForgotten")
-            }
+                override fun onForgotten() {
+                    error("Unexpected call to onForgotten")
+                }
 
-            override fun onRemembered() {
-                error("Unexpected call to onRemembered")
+                override fun onRemembered() {
+                    error("Unexpected call to onRemembered")
+                }
             }
-        }
 
         assertFailsWith(IllegalStateException::class, message = "Throw") {
             compose {
-                @Suppress("UNUSED_EXPRESSION")
-                remember { observed }
+                @Suppress("UNUSED_EXPRESSION") remember { observed }
                 error("Throw")
             }
         }
@@ -2365,27 +2109,27 @@
     @Test
     fun testRememberObserver_Abandon_Recompose() {
         val abandonedObjects = mutableListOf<RememberObserver>()
-        val observed = object : RememberObserver {
-            override fun onAbandoned() {
-                abandonedObjects.add(this)
-            }
+        val observed =
+            object : RememberObserver {
+                override fun onAbandoned() {
+                    abandonedObjects.add(this)
+                }
 
-            override fun onForgotten() {
-                error("Unexpected call to onForgotten")
-            }
+                override fun onForgotten() {
+                    error("Unexpected call to onForgotten")
+                }
 
-            override fun onRemembered() {
-                error("Unexpected call to onRemembered")
+                override fun onRemembered() {
+                    error("Unexpected call to onRemembered")
+                }
             }
-        }
         assertFailsWith(IllegalStateException::class, message = "Throw") {
             compositionTest {
                 val rememberObject = mutableStateOf(false)
 
                 compose {
                     if (rememberObject.value) {
-                        @Suppress("UNUSED_EXPRESSION")
-                        remember { observed }
+                        @Suppress("UNUSED_EXPRESSION") remember { observed }
                         error("Throw")
                     }
                 }
@@ -2401,32 +2145,31 @@
         assertArrayEquals(listOf(observed), abandonedObjects)
     }
 
-    @Test @OptIn(ExperimentalCoroutinesApi::class)
+    @Test
+    @OptIn(ExperimentalCoroutinesApi::class)
     fun testRememberedObserver_Controlled_Dispose() = runTest {
         val recomposer = Recomposer(coroutineContext)
         val root = View()
         val controlled = ControlledComposition(ViewApplier(root), recomposer)
 
         val abandonedObjects = mutableListOf<RememberObserver>()
-        val observed = object : RememberObserver {
-            override fun onAbandoned() {
-                abandonedObjects.add(this)
-            }
+        val observed =
+            object : RememberObserver {
+                override fun onAbandoned() {
+                    abandonedObjects.add(this)
+                }
 
-            override fun onForgotten() {
-                error("Unexpected call to onForgotten")
-            }
+                override fun onForgotten() {
+                    error("Unexpected call to onForgotten")
+                }
 
-            override fun onRemembered() {
-                error("Unexpected call to onRemembered")
+                override fun onRemembered() {
+                    error("Unexpected call to onRemembered")
+                }
             }
-        }
 
         controlled.composeContent {
-            @Suppress("UNUSED_EXPRESSION")
-            remember<RememberObserver> {
-                observed
-            }
+            @Suppress("UNUSED_EXPRESSION") remember<RememberObserver> { observed }
         }
 
         assertTrue(abandonedObjects.isEmpty())
@@ -2460,9 +2203,7 @@
             assertEquals(outerKeys.last(), currentComposer.compoundKeyHash)
         }
 
-        compose {
-            Test()
-        }
+        compose { Test() }
 
         assertNotEquals(previousOuterKeysSize, outerKeys.size)
         assertNotEquals(previousInnerKeysSize, innerKeys.size)
@@ -2478,12 +2219,8 @@
         assertNotEquals(previousInnerKeysSize, innerKeys.size)
 
         assertNotEquals(innerKeys[0], outerKeys[0])
-        innerKeys.forEach {
-            assertEquals(innerKeys[0], it)
-        }
-        outerKeys.forEach {
-            assertEquals(outerKeys[0], it)
-        }
+        innerKeys.forEach { assertEquals(innerKeys[0], it) }
+        outerKeys.forEach { assertEquals(outerKeys[0], it) }
     }
 
     @Test // b/152753046
@@ -2491,22 +2228,17 @@
         val items = mutableListOf(0, 1, 2, 3, 4)
         var scope: RecomposeScope? = null
 
-        @Composable
-        fun NoNodes() { }
+        @Composable fun NoNodes() {}
 
         @Composable
         fun Test() {
             scope = currentRecomposeScope
             for (item in items) {
-                key(item) {
-                    NoNodes()
-                }
+                key(item) { NoNodes() }
             }
         }
 
-        compose {
-            Test()
-        }
+        compose { Test() }
 
         // Swap 2 and 3
         items[2] = 3
@@ -2518,14 +2250,8 @@
 
     @Test // b/154650546
     fun testInsertOnMultipleLevels() = compositionTest {
-        val items = mutableListOf(
-            1 to mutableListOf(
-                0, 1, 2, 3, 4
-            ),
-            3 to mutableListOf(
-                0, 1, 2, 3, 4
-            )
-        )
+        val items =
+            mutableListOf(1 to mutableListOf(0, 1, 2, 3, 4), 3 to mutableListOf(0, 1, 2, 3, 4))
 
         val invalidates = mutableListOf<RecomposeScope>()
         fun invalidateComposition() {
@@ -2591,14 +2317,10 @@
             }
         }
 
-        compose {
-            Test()
-        }
+        compose { Test() }
 
         fun validate() {
-            validate {
-                this.Test()
-            }
+            validate { this.Test() }
         }
 
         validate()
@@ -2618,9 +2340,7 @@
 
     @Test
     fun testInsertingAfterSkipping() = compositionTest {
-        val items = mutableListOf(
-            1 to listOf(0, 1, 2, 3, 4)
-        )
+        val items = mutableListOf(1 to listOf(0, 1, 2, 3, 4))
 
         val invalidates = mutableListOf<RecomposeScope>()
         fun invalidateComposition() {
@@ -2658,21 +2378,15 @@
             }
         }
 
-        compose {
-            Test()
-        }
+        compose { Test() }
 
-        validate {
-            this.Test()
-        }
+        validate { this.Test() }
 
         items.add(2 to listOf(3, 4, 5, 6))
         invalidateComposition()
 
         expectChanges()
-        validate {
-            this.Test()
-        }
+        validate { this.Test() }
     }
 
     @Test
@@ -2697,37 +2411,25 @@
         fun EmitText() {
             invalidates.add(currentRecomposeScope)
             if (includeOdd) {
-                key(1) {
-                    Text("odd 1")
-                }
+                key(1) { Text("odd 1") }
             }
             if (includeEven) {
-                key(2) {
-                    Text("even 2")
-                }
+                key(2) { Text("even 2") }
             }
             if (includeOdd) {
-                key(3) {
-                    Text("odd 3")
-                }
+                key(3) { Text("odd 3") }
             }
             if (includeEven) {
-                key(4) {
-                    Text("even 4")
-                }
+                key(4) { Text("even 4") }
             }
         }
 
         @Composable
         fun Test() {
             Linear {
-                Wrapper {
-                    EmitText()
-                }
+                Wrapper { EmitText() }
                 EmitText()
-                Wrapper {
-                    EmitText()
-                }
+                Wrapper { EmitText() }
                 EmitText()
             }
         }
@@ -2753,25 +2455,17 @@
 
         fun MockViewValidator.Test() {
             Linear {
-                this.Wrapper {
-                    this.EmitText()
-                }
+                this.Wrapper { this.EmitText() }
                 this.EmitText()
-                this.Wrapper {
-                    this.EmitText()
-                }
+                this.Wrapper { this.EmitText() }
                 this.EmitText()
             }
         }
 
-        compose {
-            Test()
-        }
+        compose { Test() }
 
         fun validate() {
-            validate {
-                this.Test()
-            }
+            validate { this.Test() }
         }
         validate()
 
@@ -2853,14 +2547,10 @@
             invalidates.add(currentRecomposeScope)
             for (i in order) {
                 if (i % 2 == 1 && (all || includeOdd)) {
-                    key(i) {
-                        Text("odd $i")
-                    }
+                    key(i) { Text("odd $i") }
                 }
                 if (i % 2 == 0 && (all || includeEven)) {
-                    key(i) {
-                        Text("even $i")
-                    }
+                    key(i) { Text("even $i") }
                 }
             }
         }
@@ -2920,14 +2610,10 @@
             }
         }
 
-        compose {
-            Test()
-        }
+        compose { Test() }
 
         fun validate() {
-            validate {
-                this.Test()
-            }
+            validate { this.Test() }
         }
         validate()
 
@@ -2984,9 +2670,7 @@
             states.add(s2)
         }
 
-        compose {
-            Test()
-        }
+        compose { Test() }
 
         fun invalidateFirst() {
             states.first().value++
@@ -3024,9 +2708,7 @@
         val states = mutableListOf<MutableState<Int>>()
         val iteration = mutableStateOf(0)
 
-        compose {
-            ComposeIndirect(iteration, states)
-        }
+        compose { ComposeIndirect(iteration, states) }
 
         fun nextIteration() = iteration.value++
         fun invalidateLast() = states.last().value++
@@ -3069,8 +2751,7 @@
         compose {
             Text(mainState)
             ObservationScopesTest(state, doForwardWrite)
-            if (doForwardWrite)
-                ForwardWrite(state)
+            if (doForwardWrite) ForwardWrite(state)
         }
 
         // Set up the case by skipping ObservationScopeTest
@@ -3137,11 +2818,7 @@
             }
         }
         assertEquals(
-            listOf(
-                "composition",
-                "RememberObserver",
-                "SideEffect"
-            ),
+            listOf("composition", "RememberObserver", "SideEffect"),
             checks,
             "expected order of calls"
         )
@@ -3196,9 +2873,7 @@
             this.S2()
         }
 
-        compose {
-            Test()
-        }
+        compose { Test() }
 
         fun validate() = validate { this.Test() }
 
@@ -3219,9 +2894,8 @@
     @Test
     fun testModificationsPropagateToSubcomposition() = compositionTest {
         var value by mutableStateOf(0)
-        val content: MutableState<@Composable () -> Unit> = mutableStateOf({ })
-        @Suppress("VARIABLE_WITH_REDUNDANT_INITIALIZER")
-        var subCompositionOccurred = false
+        val content: MutableState<@Composable () -> Unit> = mutableStateOf({})
+        @Suppress("VARIABLE_WITH_REDUNDANT_INITIALIZER") var subCompositionOccurred = false
 
         @Composable
         fun ComposeContent() {
@@ -3237,9 +2911,7 @@
 
         compose {
             updateContent(value)
-            TestSubcomposition {
-                ComposeContent()
-            }
+            TestSubcomposition { ComposeContent() }
         }
 
         subCompositionOccurred = false
@@ -3251,8 +2923,8 @@
     }
 
     /**
-     * This test checks that an updated ComposableLambda capture used in a subcomposition
-     * correctly invalidates that subcomposition and schedules recomposition of that subcomposition.
+     * This test checks that an updated ComposableLambda capture used in a subcomposition correctly
+     * invalidates that subcomposition and schedules recomposition of that subcomposition.
      */
     @OptIn(ExperimentalCoroutinesApi::class)
     @Test
@@ -3266,9 +2938,7 @@
                 composition.setContent {
                     // Read into local variable, local will be captured below
                     val capturedValue = rootState
-                    TestSubcomposition {
-                        composedResults.add(capturedValue)
-                    }
+                    TestSubcomposition { composedResults.add(capturedValue) }
                 }
                 assertEquals(listOf(false), composedResults)
                 rootState = true
@@ -3318,9 +2988,7 @@
                 Snapshot.notifyObjectsInitialized()
                 composition.setContent {
                     results += firstState
-                    TestSubcomposition {
-                        results += secondState
-                    }
+                    TestSubcomposition { results += secondState }
                 }
                 secondState = "secondSet"
                 Snapshot.sendApplyNotifications()
@@ -3339,10 +3007,10 @@
     }
 
     /**
-     * An [Applier] may inadvertently (or on purpose) run arbitrary user code as a side effect
-     * of performing tree manipulations as a [Composer] is applying changes. This can happen
-     * if the tree type dispatches event callbacks when nodes are added or removed from a tree.
-     * These callbacks may cause snapshot state writes, which can in turn invalidate scopes in the
+     * An [Applier] may inadvertently (or on purpose) run arbitrary user code as a side effect of
+     * performing tree manipulations as a [Composer] is applying changes. This can happen if the
+     * tree type dispatches event callbacks when nodes are added or removed from a tree. These
+     * callbacks may cause snapshot state writes, which can in turn invalidate scopes in the
      * composition that produced the tree in the first place. Ensure that the recomposition
      * machinery is robust to this, and that these invalidations are processed on a subsequent
      * recomposition.
@@ -3350,10 +3018,8 @@
     @OptIn(ExperimentalCoroutinesApi::class)
     @Test
     fun testStateWriteInApplier() = runTest {
-
-        class MutateOnRemoveApplier(
-            private val removeCounter: MutableState<Int>
-        ) : AbstractApplier<Unit>(Unit) {
+        class MutateOnRemoveApplier(private val removeCounter: MutableState<Int>) :
+            AbstractApplier<Unit>(Unit) {
             var insertCount: Int = 0
                 private set
 
@@ -3391,7 +3057,7 @@
                     // Read the state here so that the emit removal will invalidate it
                     stateMutatedOnRemove.value
                     if (shouldEmitNode) {
-                        ComposeNode<Unit, MutateOnRemoveApplier>({ }) {}
+                        ComposeNode<Unit, MutateOnRemoveApplier>({}) {}
                     }
                 }
                 // Initial composition should not contain the node we will remove. We want to test
@@ -3457,9 +3123,7 @@
         var compositeHash: Int = 0
         compose {
             parentHash = currentCompositeKeyHash
-            key(MyEnum.First) {
-                compositeHash = currentCompositeKeyHash
-            }
+            key(MyEnum.First) { compositeHash = currentCompositeKeyHash }
         }
 
         val effectiveHash = compositeHash xor (parentHash rol 6)
@@ -3472,9 +3136,7 @@
         var compositeHash: Int = 0
         compose {
             parentHash = currentCompositeKeyHash
-            key(MyEnum.First, MyEnum.Second) {
-                compositeHash = currentCompositeKeyHash
-            }
+            key(MyEnum.First, MyEnum.Second) { compositeHash = currentCompositeKeyHash }
         }
 
         val effectiveHash = compositeHash xor (parentHash rol 6)
@@ -3483,16 +3145,13 @@
 
     @Test // regression test for b/188015757
     fun testRestartOfDefaultFunctions() = compositionTest {
-
         @Composable
         fun Test() {
             Defaults()
             use(stateB)
         }
 
-        compose {
-            Test()
-        }
+        compose { Test() }
 
         // Force Defaults to skip
         stateB++
@@ -3508,9 +3167,7 @@
         Second
     }
 
-    /**
-     * set should set the value every time, update should only set after initial composition.
-     */
+    /** set should set the value every time, update should only set after initial composition. */
     @OptIn(ExperimentalCoroutinesApi::class)
     @Test
     fun composeNodeSetVsUpdate() = runTest {
@@ -3525,9 +3182,13 @@
             }
             class SetUpdateNodeApplier : AbstractApplier<SetUpdateNode>(SetUpdateNode("root")) {
                 override fun insertTopDown(index: Int, instance: SetUpdateNode) {}
+
                 override fun insertBottomUp(index: Int, instance: SetUpdateNode) {}
+
                 override fun remove(index: Int, count: Int) {}
+
                 override fun move(from: Int, to: Int, count: Int) {}
+
                 override fun onClear() {}
             }
             val composition = Composition(SetUpdateNodeApplier(), recomposer)
@@ -3539,15 +3200,11 @@
             composition.setContent {
                 ComposeNode<SetUpdateNode, SetUpdateNodeApplier>(
                     factory = { makeNode(value) },
-                    update = {
-                        set(value) { property = value }
-                    }
+                    update = { set(value) { property = value } }
                 )
                 ComposeNode<SetUpdateNode, SetUpdateNodeApplier>(
                     factory = { makeNode(value) },
-                    update = {
-                        update(value) { property = value }
-                    }
+                    update = { update(value) { property = value } }
                 )
             }
 
@@ -3569,11 +3226,7 @@
 
     @Test
     fun internalErrorsAreReportedAsInternal() = compositionTest {
-        expectError("internal") {
-            compose {
-                currentComposer.createNode { null }
-            }
-        }
+        expectError("internal") { compose { currentComposer.createNode { null } } }
     }
 
     @Test
@@ -3583,27 +3236,24 @@
             value?.let { Text("Bye!") } ?: Text("Hello!")
         }
 
-        validate {
-            Text("Hello!")
-        }
+        validate { Text("Hello!") }
     }
 
     @Test
     fun textWithIfNotNull() = compositionTest {
         val condition = false
         compose {
-            val result = if (condition) {
-                Text("Bye!")
-            } else null
+            val result =
+                if (condition) {
+                    Text("Bye!")
+                } else null
 
             if (result == null) {
                 Text("Hello!")
             }
         }
 
-        validate {
-            Text("Hello!")
-        }
+        validate { Text("Hello!") }
     }
 
     @Test // Regression test for b/249050560
@@ -3628,13 +3278,9 @@
     fun testNonLocalReturn_CM1_RetFunc_FalseTrue() = compositionTest {
         var condition by mutableStateOf(false)
 
-        compose {
-            test_CM1_RetFun(condition)
-        }
+        compose { test_CM1_RetFun(condition) }
 
-        validate {
-            this.test_CM1_RetFun(condition)
-        }
+        validate { this.test_CM1_RetFun(condition) }
 
         condition = true
 
@@ -3647,13 +3293,9 @@
     fun testNonLocalReturn_CM1_RetFunc_TrueFalse() = compositionTest {
         var condition by mutableStateOf(true)
 
-        compose {
-            test_CM1_RetFun(condition)
-        }
+        compose { test_CM1_RetFun(condition) }
 
-        validate {
-            this.test_CM1_RetFun(condition)
-        }
+        validate { this.test_CM1_RetFun(condition) }
 
         condition = false
 
@@ -3666,13 +3308,9 @@
     fun test_CM1_CCM1_RetFun_FalseTrue() = compositionTest {
         var condition by mutableStateOf(false)
 
-        compose {
-            test_CM1_CCM1_RetFun(condition)
-        }
+        compose { test_CM1_CCM1_RetFun(condition) }
 
-        validate {
-            this.test_CM1_CCM1_RetFun(condition)
-        }
+        validate { this.test_CM1_CCM1_RetFun(condition) }
 
         condition = true
 
@@ -3685,13 +3323,9 @@
     fun test_CM1_CCM1_RetFun_TrueFalse() = compositionTest {
         var condition by mutableStateOf(true)
 
-        compose {
-            test_CM1_CCM1_RetFun(condition)
-        }
+        compose { test_CM1_CCM1_RetFun(condition) }
 
-        validate {
-            this.test_CM1_CCM1_RetFun(condition)
-        }
+        validate { this.test_CM1_CCM1_RetFun(condition) }
 
         condition = false
 
@@ -3982,9 +3616,7 @@
     fun test_returnConditionally_fromFunction_nonLocal() = compositionTest {
         val text = mutableStateOf<String?>(null)
 
-        compose {
-            TextWithNonLocalReturn(text.value)
-        }
+        compose { TextWithNonLocalReturn(text.value) }
 
         validate {
             if (text.value != null) {
@@ -4007,21 +3639,33 @@
 
         compose block@{
             Text("A")
-            simulatedIf(condition1.value) { return@block }
+            simulatedIf(condition1.value) {
+                return@block
+            }
             Text("B")
-            simulatedIf(condition2.value) { return@block }
+            simulatedIf(condition2.value) {
+                return@block
+            }
             Text("C")
-            simulatedIf(condition3.value) { return@block }
+            simulatedIf(condition3.value) {
+                return@block
+            }
             Text("D")
         }
 
         validate block@{
             Text("A")
-            this.simulatedIf(condition1.value) { return@block }
+            this.simulatedIf(condition1.value) {
+                return@block
+            }
             Text("B")
-            this.simulatedIf(condition2.value) { return@block }
+            this.simulatedIf(condition2.value) {
+                return@block
+            }
             Text("C")
-            this.simulatedIf(condition3.value) { return@block }
+            this.simulatedIf(condition3.value) {
+                return@block
+            }
             Text("D")
         }
 
@@ -4058,9 +3702,7 @@
             recomposeCounter++
         }
 
-        compose {
-            content(SomeUnstableClass())
-        }
+        compose { content(SomeUnstableClass()) }
         advance()
         verifyConsistent()
 
@@ -4151,9 +3793,7 @@
         compose {
             Text(delegatedLocal)
 
-            CompositionLocalProvider(local provides "Scoped") {
-                Text(delegatedLocal)
-            }
+            CompositionLocalProvider(local provides "Scoped") { Text(delegatedLocal) }
         }
         validate {
             Text("Default")
@@ -4179,17 +3819,13 @@
 
                     val composition = Composition(EmptyApplier(), recomposer)
                     composition.setContent {
+                        val innerComposition =
+                            Composition(
+                                EmptyApplier(),
+                                rememberCompositionContext(),
+                            )
 
-                        val innerComposition = Composition(
-                            EmptyApplier(),
-                            rememberCompositionContext(),
-                        )
-
-                        DisposableEffect(composition) {
-                            onDispose {
-                                innerComposition.dispose()
-                            }
-                        }
+                        DisposableEffect(composition) { onDispose { innerComposition.dispose() } }
                     }
 
                     var value by mutableStateOf(1)
@@ -4218,9 +3854,7 @@
             }
             Text("after")
         }
-        validate {
-            Text("true")
-        }
+        validate { Text("true") }
 
         state = false
         expectChanges()
@@ -4244,16 +3878,12 @@
             }
         }
 
-        validate {
-            assertFalse(value in composition!!.getSlots())
-        }
+        validate { assertFalse(value in composition!!.getSlots()) }
 
         rememberValue = true
         expectChanges()
 
-        validate {
-            assertTrue(value in composition!!.getSlots())
-        }
+        validate { assertTrue(value in composition!!.getSlots()) }
 
         rememberValue = false
         expectChanges()
@@ -4266,7 +3896,8 @@
 
     @Stable
     class VarargConsumer(var invokeCount: Int = 0) {
-        @Composable fun Varargs(vararg ints: Int) {
+        @Composable
+        fun Varargs(vararg ints: Int) {
             invokeCount++
             for (i in ints) {
                 use(i)
@@ -4298,7 +3929,8 @@
         fun compute(value: Int)
     }
 
-    @Composable fun TestMemoizedFun(compute: TestFunInterface) {
+    @Composable
+    fun TestMemoizedFun(compute: TestFunInterface) {
         val oldCompute = remember { compute }
         assertEquals(oldCompute, compute)
     }
@@ -4339,12 +3971,15 @@
     }
 
     data class Foo(var i: Int = 0)
+
     class UnstableCompConsumer(var invokeCount: Int = 0) {
-        @Composable fun UnstableComp(foo: Foo) {
+        @Composable
+        fun UnstableComp(foo: Foo) {
             use(foo)
             invokeCount++
         }
     }
+
     @Test
     fun composableWithUnstableParameters_skipped() = compositionTest {
         val consumer = UnstableCompConsumer()
@@ -4372,10 +4007,11 @@
         class Car(val model: String)
         class Person(val name: String, val car: MutableStateFlow<Car>)
 
-        val people = mutableListOf<MutableStateFlow<Person?>>(
-            MutableStateFlow(Person("Ford", MutableStateFlow(Car("Model T")))),
-            MutableStateFlow(Person("Musk", MutableStateFlow(Car("Model 3"))))
-        )
+        val people =
+            mutableListOf<MutableStateFlow<Person?>>(
+                MutableStateFlow(Person("Ford", MutableStateFlow(Car("Model T")))),
+                MutableStateFlow(Person("Musk", MutableStateFlow(Car("Model 3"))))
+            )
         compose {
             people.forEach {
                 val person = it.collectAsState().value
@@ -4411,12 +4047,8 @@
         var state by mutableStateOf(0)
         var condition by mutableStateOf(false)
         val derived by derivedStateOf { if (!condition) 0 else state }
-        compose {
-            Text(derived.toString())
-        }
-        validate {
-            Text(derived.toString())
-        }
+        compose { Text(derived.toString()) }
+        validate { Text(derived.toString()) }
 
         condition = true
         expectNoChanges()
@@ -4446,7 +4078,7 @@
             }
         }
 
-        validate { }
+        validate {}
     }
 
     @Composable private fun key() = "key"
@@ -4458,13 +4090,13 @@
             Text(text)
         }
 
-        validate {
-            Text("")
-        }
+        validate { Text("") }
     }
 
     private val LocalNumber = compositionLocalOf { 0 }
-    @Composable fun Test(number: Int = LocalNumber.current) {
+
+    @Composable
+    fun Test(number: Int = LocalNumber.current) {
         val remembered = remember(number) { number + 1 }
         assertEquals(remembered, number + 1)
     }
@@ -4472,11 +4104,7 @@
     @Test
     fun remember_defaultParamInRestartableFunction() = compositionTest {
         var state by mutableIntStateOf(0)
-        compose {
-            CompositionLocalProvider(LocalNumber provides state) {
-                Test()
-            }
-        }
+        compose { CompositionLocalProvider(LocalNumber provides state) { Test() } }
 
         validate {}
 
@@ -4493,9 +4121,7 @@
         // the insert and then the `remember` call needs to update the `compose` group's slots.
         var count by mutableStateOf(1)
         compose {
-            repeat(count) {
-                Text("Some text")
-            }
+            repeat(count) { Text("Some text") }
             val someRemember = remember(count) { count + 1 }
             Text("$someRemember")
         }
@@ -4508,19 +4134,11 @@
     fun appendingRememberAfterLoop() = compositionTest {
         var count by mutableStateOf(1)
         compose {
-            repeat(count) {
-                Text("Some text")
-            }
-            repeat(count) {
-                unused(remember { it })
-            }
+            repeat(count) { Text("Some text") }
+            repeat(count) { unused(remember { it }) }
         }
 
-        validate {
-            repeat(count) {
-                Text("Some text")
-            }
-        }
+        validate { repeat(count) { Text("Some text") } }
 
         count++
         advance()
@@ -4539,9 +4157,7 @@
     fun composerCleanup() = compositionTest {
         var state by mutableStateOf(0)
 
-        compose {
-            Text("State = $state")
-        }
+        compose { Text("State = $state") }
 
         val stackSizes = (composition as CompositionImpl).composerStacksSizes()
         repeat(100) {
@@ -4554,9 +4170,7 @@
     @Test
     fun movableContentNoopInDeactivatedComposition() = compositionTest {
         val state = mutableStateOf(false)
-        val movableContent = movableContentOf {
-            Text("Test")
-        }
+        val movableContent = movableContentOf { Text("Test") }
 
         var composition: Composition? = null
         var context: CompositionContext? = null
@@ -4565,18 +4179,17 @@
 
             // read state to force recomposition
             state.value
-            SideEffect {
-                if (state.value) (composition as CompositionImpl).deactivate()
-            }
+            SideEffect { if (state.value) (composition as CompositionImpl).deactivate() }
         }
 
-        composition = CompositionImpl(context!!, ViewApplier(root)).apply {
-            setContent {
-                if (state.value) {
-                    movableContent()
+        composition =
+            CompositionImpl(context!!, ViewApplier(root)).apply {
+                setContent {
+                    if (state.value) {
+                        movableContent()
+                    }
                 }
             }
-        }
 
         state.value = true
         advance()
@@ -4589,17 +4202,11 @@
         compose {
             InlineLinear {
                 InlineLinear {
-                    explicitStartReplaceGroup(-0x7e52e5de) {
-                        Text("Before")
-                    }
-                    explicitStartReplaceGroup(0x9222f9c, insertGroup = state.value) { }
-                    explicitStartReplaceGroup(0x22d2581c) {
-                        Text("After")
-                    }
+                    explicitStartReplaceGroup(-0x7e52e5de) { Text("Before") }
+                    explicitStartReplaceGroup(0x9222f9c, insertGroup = state.value) {}
+                    explicitStartReplaceGroup(0x22d2581c) { Text("After") }
                 }
-                InlineLinear {
-                    Text("State is ${state.value}")
-                }
+                InlineLinear { Text("State is ${state.value}") }
                 if (state.value) {
                     Text("State is on")
                 }
@@ -4615,9 +4222,7 @@
                     Text("Before")
                     Text("After")
                 }
-                Linear {
-                    Text("State is ${state.value}")
-                }
+                Linear { Text("State is ${state.value}") }
                 if (state.value) {
                     Text("State is on")
                 }
@@ -4638,14 +4243,8 @@
 
     private inline fun CoroutineScope.withGlobalSnapshotManager(block: CoroutineScope.() -> Unit) {
         val channel = Channel<Unit>(Channel.CONFLATED)
-        val job = launch {
-            channel.consumeEach {
-                Snapshot.sendApplyNotifications()
-            }
-        }
-        val unregisterToken = Snapshot.registerGlobalWriteObserver {
-            channel.trySend(Unit)
-        }
+        val job = launch { channel.consumeEach { Snapshot.sendApplyNotifications() } }
+        val unregisterToken = Snapshot.registerGlobalWriteObserver { channel.trySend(Unit) }
         try {
             block()
         } finally {
@@ -4730,9 +4329,7 @@
 
 @OptIn(InternalComposeApi::class)
 @Composable
-internal fun TestSubcomposition(
-    content: @Composable () -> Unit
-) {
+internal fun TestSubcomposition(content: @Composable () -> Unit) {
     val parentRef = rememberCompositionContext()
     val currentContent by rememberUpdatedState(content)
     DisposableEffect(parentRef) {
@@ -4744,9 +4341,7 @@
             // subcomposition.setContent(currentContent) would snapshot read only on initial set.
             currentContent()
         }
-        onDispose {
-            subcomposition.dispose()
-        }
+        onDispose { subcomposition.dispose() }
     }
 }
 
@@ -4758,7 +4353,8 @@
     lateinit var value: T
 }
 
-@Composable fun NarrowInvalidateForReference(ref: Ref<CompositionContext>) {
+@Composable
+fun NarrowInvalidateForReference(ref: Ref<CompositionContext>) {
     ref.value = rememberCompositionContext()
 }
 
@@ -4767,35 +4363,23 @@
     val container = remember { View() }
     val ref = Ref<CompositionContext>()
     NarrowInvalidateForReference(ref = ref)
-    return {
-        Composition(
-            ViewApplier(container),
-            ref.value
-        ).apply {
-            setContent {
-                block()
-            }
-        }
-    }
+    return { Composition(ViewApplier(container), ref.value).apply { setContent { block() } } }
 }
 
 @OptIn(ExperimentalCoroutinesApi::class)
-internal suspend fun <R> TestScope.localRecomposerTest(
-    block: CoroutineScope.(Recomposer) -> R
-) = coroutineScope {
-    withContext(TestMonotonicFrameClock(this)) {
-        val recomposer = Recomposer(coroutineContext)
-        launch {
-            recomposer.runRecomposeAndApplyChanges()
+internal suspend fun <R> TestScope.localRecomposerTest(block: CoroutineScope.(Recomposer) -> R) =
+    coroutineScope {
+        withContext(TestMonotonicFrameClock(this)) {
+            val recomposer = Recomposer(coroutineContext)
+            launch { recomposer.runRecomposeAndApplyChanges() }
+            // ensure recomposition runner has started
+            testScheduler.advanceUntilIdle()
+            block(recomposer)
+            // This call doesn't need to be in a finally; everything it does will be torn down
+            // in exceptional cases by the coroutineScope failure
+            recomposer.cancel()
         }
-        // ensure recomposition runner has started
-        testScheduler.advanceUntilIdle()
-        block(recomposer)
-        // This call doesn't need to be in a finally; everything it does will be torn down
-        // in exceptional cases by the coroutineScope failure
-        recomposer.cancel()
     }
-}
 
 /**
  * Advances this scheduler by exactly one frame, as defined by the [TestMonotonicFrameClock] in
@@ -4816,18 +4400,16 @@
 
 @Composable
 fun Wrap(count: Int, content: @Composable () -> Unit) {
-    if (count > 1)
-        Wrap(count - 1, content)
-    else
-        content()
+    if (count > 1) Wrap(count - 1, content) else content()
 }
 
 private fun <T> assertArrayEquals(message: String, expected: Array<T>, received: Array<T>) {
     fun Array<T>.getString() = this.joinToString(", ") { it.toString() }
-    fun err(msg: String): Nothing = error(
-        "$message: $msg, expected: [${
+    fun err(msg: String): Nothing =
+        error(
+            "$message: $msg, expected: [${
         expected.getString()}], received: [${received.getString()}]"
-    )
+        )
     if (expected.size != received.size) err("sizes are different")
     expected.indices.forEach { index ->
         if (expected[index] != received[index])
@@ -4843,13 +4425,8 @@
 private val jon = Contact(name = "Jon Alberton", email = "jon@alberton.com")
 private val steve = Contact("Steve Roberson", email = "steverob@somemail.com")
 
-private fun testModel(
-    contacts: MutableList<Contact> = mutableListOf(
-        bob,
-        jon,
-        steve
-    )
-) = ContactModel(filter = "", contacts = contacts)
+private fun testModel(contacts: MutableList<Contact> = mutableListOf(bob, jon, steve)) =
+    ContactModel(filter = "", contacts = contacts)
 
 // Report test data
 private val jim_reports_to_sally = Report("Jim", "Sally")
@@ -4874,6 +4451,7 @@
 }
 
 private fun Int.isOdd() = this % 2 == 1
+
 private fun Int.isEven() = this % 2 == 0
 
 fun <T> MutableList<T>.swap(a: T, b: T) {
@@ -4884,11 +4462,9 @@
     set(bIndex, a)
 }
 
-@Composable
-private inline fun InlineWrapper(content: @Composable () -> Unit) = content()
+@Composable private inline fun InlineWrapper(content: @Composable () -> Unit) = content()
 
-@Composable
-private inline fun M1(content: @Composable () -> Unit) = InlineWrapper { content() }
+@Composable private inline fun M1(content: @Composable () -> Unit) = InlineWrapper { content() }
 
 @Composable
 private fun TextWithNonLocalReturn(text: String?) {
@@ -4908,9 +4484,10 @@
 }
 
 @Composable
-private inline fun InlineSubcomposition(
-    crossinline content: @Composable () -> Unit
-) = TestSubcomposition { content() }
+private inline fun InlineSubcomposition(crossinline content: @Composable () -> Unit) =
+    TestSubcomposition {
+        content()
+    }
 
 @Composable
 operator fun <T> CompositionLocal<T>.getValue(thisRef: Any?, property: KProperty<*>) = current
@@ -4946,29 +4523,20 @@
 }
 
 @Composable
-fun ListContent(
-    viewItems: List<ListViewItem>,
-    itemRenderer: @Composable (ListViewItem) -> Unit
-) {
+fun ListContent(viewItems: List<ListViewItem>, itemRenderer: @Composable (ListViewItem) -> Unit) {
     viewItems.forEach { viewItem ->
-        ListContentItem(
-            viewItem = viewItem,
-            itemRenderer = itemRenderer
-        )
+        ListContentItem(viewItem = viewItem, itemRenderer = itemRenderer)
     }
 }
 
 @Composable
-fun ListContentItem(
-    viewItem: ListViewItem,
-    itemRenderer: @Composable (ListViewItem) -> Unit
-) {
+fun ListContentItem(viewItem: ListViewItem, itemRenderer: @Composable (ListViewItem) -> Unit) {
     itemRenderer(viewItem)
 }
 
 data class ListViewItem(val id: Int)
 
-private fun <T> unused(@Suppress("UNUSED_PARAMETER") value: T) { }
+private fun <T> unused(@Suppress("UNUSED_PARAMETER") value: T) {}
 
 // Part of regression test for 339618126
 @Composable
diff --git a/compose/runtime/runtime/src/nonEmulatorCommonTest/kotlin/androidx/compose/runtime/CompoundHashKeyTests.kt b/compose/runtime/runtime/src/nonEmulatorCommonTest/kotlin/androidx/compose/runtime/CompoundHashKeyTests.kt
index 6de76c9..af5a83b 100644
--- a/compose/runtime/runtime/src/nonEmulatorCommonTest/kotlin/androidx/compose/runtime/CompoundHashKeyTests.kt
+++ b/compose/runtime/runtime/src/nonEmulatorCommonTest/kotlin/androidx/compose/runtime/CompoundHashKeyTests.kt
@@ -51,13 +51,7 @@
 
         val firstOuter = mutableListOf<Int>()
         val firstInner = mutableListOf<Int>()
-        compose {
-            (0..1).forEach {
-                key(it) {
-                    recordHashKeys()
-                }
-            }
-        }
+        compose { (0..1).forEach { key(it) { recordHashKeys() } } }
         assertEquals(2, outerKeys.size)
         assertEquals(2, innerKeys.size)
         assertNotEquals(outerKeys[0], outerKeys[1])
@@ -78,9 +72,7 @@
     @Test // b/195185633
     fun testEnumKeys() = compositionTest {
         val testClass = EnumTestClass()
-        compose {
-            testClass.Test()
-        }
+        compose { testClass.Test() }
 
         val originalKey = testClass.currentKey
         testClass.scope.invalidate()
@@ -132,34 +124,20 @@
 
     @Test // b/287537290
     fun repeatedCallsProduceUniqueKeys() = compositionTest {
-        expectUniqueHashCodes {
-            repeat(10) {
-                A()
-            }
-        }
+        expectUniqueHashCodes { repeat(10) { A() } }
     }
 
     @Test
     fun uniqueKeysGenerateUniqueCompositeKeys() = compositionTest {
         expectUniqueHashCodes {
-            key(1) {
-                A()
-            }
-            key(2) {
-                A()
-            }
+            key(1) { A() }
+            key(2) { A() }
         }
     }
 
     @Test
     fun duplicateKeysGenerateDuplicateCompositeKeys() = compositionTest {
-        expectHashCodes(duplicateCount = 4) {
-            listOf(1, 2, 1, 2, 1, 2).forEach {
-                key(it) {
-                    A()
-                }
-            }
-        }
+        expectHashCodes(duplicateCount = 4) { listOf(1, 2, 1, 2, 1, 2).forEach { key(it) { A() } } }
     }
 
     @Test
@@ -180,9 +158,7 @@
         val list = mutableStateListOf(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)
         var markers = expectUniqueHashCodes {
             for (item in list) {
-                key(item) {
-                    A()
-                }
+                key(item) { A() }
             }
         }
         list.reverse()
@@ -204,9 +180,7 @@
 
     @Composable
     fun Test() {
-        key(config.value) {
-            Child()
-        }
+        key(config.value) { Child() }
     }
 
     @Composable
@@ -216,7 +190,8 @@
     }
 
     enum class Config {
-        A, B
+        A,
+        B
     }
 }
 
@@ -225,12 +200,10 @@
 private var markerToHash = MutableIntIntMap()
 
 private var marker = 100
+
 private fun newMarker() = marker++
 
-private data class TraceResult(
-    val trace: IntList,
-    val markers: IntIntMap
-)
+private data class TraceResult(val trace: IntList, val markers: IntIntMap)
 
 private fun CompositionTestScope.composeTrace(content: @Composable () -> Unit): TraceResult {
     hashTrace = MutableIntList()
@@ -275,7 +248,8 @@
         if (duplicateCount == 0)
             "Non-unique codes detected. " +
                 "Count of unique hash codes doesn't match the number of codes collected"
-        else "Expected $duplicateCount keys but found but found ${
+        else
+            "Expected $duplicateCount keys but found but found ${
             hashCodes.size - uniqueCodes.size
         }"
     )
diff --git a/compose/runtime/runtime/src/nonEmulatorCommonTest/kotlin/androidx/compose/runtime/EffectsTests.kt b/compose/runtime/runtime/src/nonEmulatorCommonTest/kotlin/androidx/compose/runtime/EffectsTests.kt
index a92cdc3..268b3e7 100644
--- a/compose/runtime/runtime/src/nonEmulatorCommonTest/kotlin/androidx/compose/runtime/EffectsTests.kt
+++ b/compose/runtime/runtime/src/nonEmulatorCommonTest/kotlin/androidx/compose/runtime/EffectsTests.kt
@@ -25,11 +25,12 @@
 import kotlin.test.assertEquals
 
 class EffectsTests {
-    private val NeverEqualObject = object {
-        override fun equals(other: Any?): Boolean {
-            return false
+    private val NeverEqualObject =
+        object {
+            override fun equals(other: Any?): Boolean {
+                return false
+            }
         }
-    }
 
     @Test
     fun testMemoization1() = compositionTest {
@@ -37,9 +38,7 @@
 
         compose {
             // User the remembered value to avoid a lint error.
-            val someInt = remember {
-                ++inc
-            }
+            val someInt = remember { ++inc }
             use(someInt)
         }
 
@@ -104,9 +103,7 @@
         }
 
         fun validate() {
-            validate {
-                Text(local.value)
-            }
+            validate { Text(local.value) }
         }
         validate()
 
@@ -176,9 +173,7 @@
             log("Unmountable:start")
             DisposableEffect(NeverEqualObject) {
                 log("onCommit")
-                onDispose {
-                    log("onDispose")
-                }
+                onDispose { log("onDispose") }
             }
             log("Unmountable:end")
         }
@@ -229,43 +224,30 @@
         fun Unmountable() {
             DisposableEffect(NeverEqualObject) {
                 log("onCommit:a2")
-                onDispose {
-                    log("onDispose:a2")
-                }
+                onDispose { log("onDispose:a2") }
             }
             DisposableEffect(NeverEqualObject) {
                 log("onCommit:b2")
-                onDispose {
-                    log("onDispose:b2")
-                }
+                onDispose { log("onDispose:b2") }
             }
         }
 
         compose {
             DisposableEffect(NeverEqualObject) {
                 log("onCommit:a1")
-                onDispose {
-                    log("onDispose:a1")
-                }
+                onDispose { log("onDispose:a1") }
             }
             if (mount) {
                 Unmountable()
             }
             DisposableEffect(NeverEqualObject) {
                 log("onCommit:b1")
-                onDispose {
-                    log("onDispose:b1")
-                }
+                onDispose { log("onDispose:b1") }
             }
         }
 
         assertArrayEquals(
-            listOf(
-                "onCommit:a1",
-                "onCommit:a2",
-                "onCommit:b2",
-                "onCommit:b1"
-            ),
+            listOf("onCommit:a1", "onCommit:a2", "onCommit:b2", "onCommit:b1"),
             logHistory
         )
         mount = false
@@ -303,24 +285,14 @@
             DisposableEffect(NeverEqualObject) {
                 val y = x++
                 log("onCommit:$y")
-                onDispose {
-                    log("dispose:$y")
-                }
+                onDispose { log("dispose:$y") }
             }
         }
 
         log("recompose")
         trigger.recompose()
         expectChanges()
-        assertArrayEquals(
-            listOf(
-                "onCommit:0",
-                "recompose",
-                "dispose:0",
-                "onCommit:1"
-            ),
-            logHistory
-        )
+        assertArrayEquals(listOf("onCommit:0", "recompose", "dispose:0", "onCommit:1"), logHistory)
     }
 
     @Test
@@ -337,16 +309,12 @@
             DisposableEffect(NeverEqualObject) {
                 val y = a++
                 log("onCommit a:$y")
-                onDispose {
-                    log("dispose a:$y")
-                }
+                onDispose { log("dispose a:$y") }
             }
             DisposableEffect(NeverEqualObject) {
                 val y = b++
                 log("onCommit b:$y")
-                onDispose {
-                    log("dispose b:$y")
-                }
+                onDispose { log("dispose b:$y") }
             }
         }
 
@@ -381,9 +349,7 @@
             DisposableEffect(key) {
                 val y = x++
                 log("onCommit:$y")
-                onDispose {
-                    log("dispose:$y")
-                }
+                onDispose { log("dispose:$y") }
             }
         }
 
@@ -391,26 +357,14 @@
         trigger.recompose()
         expectNoChanges()
 
-        assertArrayEquals(
-            listOf(
-                "onCommit:0",
-                "recompose"
-            ),
-            logHistory
-        )
+        assertArrayEquals(listOf("onCommit:0", "recompose"), logHistory)
         log("recompose (key -> 345)")
         key = 345
         trigger.recompose()
         expectChanges()
 
         assertArrayEquals(
-            listOf(
-                "onCommit:0",
-                "recompose",
-                "recompose (key -> 345)",
-                "dispose:0",
-                "onCommit:1"
-            ),
+            listOf("onCommit:0", "recompose", "recompose (key -> 345)", "dispose:0", "onCommit:1"),
             logHistory
         )
     }
@@ -431,9 +385,7 @@
             DisposableEffect(NeverEqualObject) {
                 val y = c++
                 log("onCommit c:$y")
-                onDispose {
-                    log("dispose c:$y")
-                }
+                onDispose { log("dispose c:$y") }
             }
         }
 
@@ -442,17 +394,13 @@
             DisposableEffect(NeverEqualObject) {
                 val y = a++
                 log("onCommit a:$y")
-                onDispose {
-                    log("dispose a:$y")
-                }
+                onDispose { log("dispose a:$y") }
             }
 
             DisposableEffect(NeverEqualObject) {
                 val y = b++
                 log("onCommit b:$y")
-                onDispose {
-                    log("dispose b:$y")
-                }
+                onDispose { log("dispose b:$y") }
             }
 
             Sub()
@@ -486,14 +434,10 @@
         fun UpdateStateInCommit() {
             var value by remember { mutableStateOf(1) }
             readValue = value
-            SideEffect {
-                value = 2
-            }
+            SideEffect { value = 2 }
         }
 
-        compose {
-            UpdateStateInCommit()
-        }
+        compose { UpdateStateInCommit() }
         expectChanges()
 
         assertEquals(2, readValue)
@@ -508,9 +452,7 @@
 
         @Composable
         fun DisposeLogger(msg: String) {
-            DisposableEffect(Unit) {
-                onDispose { log(msg) }
-            }
+            DisposableEffect(Unit) { onDispose { log(msg) } }
         }
 
         compose {
@@ -520,17 +462,11 @@
             }
         }
 
-        assertArrayEquals(
-            emptyList(),
-            logHistory
-        )
+        assertArrayEquals(emptyList(), logHistory)
         mount = false
         log("recompose")
         expectChanges()
-        assertArrayEquals(
-            listOf("recompose", "onDispose:2"),
-            logHistory
-        )
+        assertArrayEquals(listOf("recompose", "onDispose:2"), logHistory)
     }
 
     @Test
@@ -544,16 +480,10 @@
             Text(foo)
         }
 
-        compose {
-            CompositionLocalProvider(Foo provides current) {
-                Bar()
-            }
-        }
+        compose { CompositionLocalProvider(Foo provides current) { Bar() } }
 
         fun validate() {
-            validate {
-                Text(current)
-            }
+            validate { Text(current) }
         }
         validate()
 
@@ -569,12 +499,14 @@
         var scope: RecomposeScope? = null
         var compositionLocalValue = 1
 
-        @Composable fun SimpleComposable2() {
+        @Composable
+        fun SimpleComposable2() {
             val value = MyCompositionLocal.current
             Text("$value")
         }
 
-        @Composable fun SimpleComposable() {
+        @Composable
+        fun SimpleComposable() {
             scope = currentRecomposeScope
             CompositionLocalProvider(MyCompositionLocal provides compositionLocalValue++) {
                 SimpleComposable2()
@@ -582,13 +514,12 @@
             }
         }
 
-        @Composable fun Root() {
+        @Composable
+        fun Root() {
             SimpleComposable()
         }
 
-        compose {
-            Root()
-        }
+        compose { Root() }
 
         fun validate() {
             validate {
@@ -609,12 +540,14 @@
         var scope: RecomposeScope? = null
         var compositionLocalValue = 1
 
-        @Composable fun SimpleComposable2() {
+        @Composable
+        fun SimpleComposable2() {
             val value = MyCompositionLocal.current
             Text("$value")
         }
 
-        @Composable fun SimpleComposable() {
+        @Composable
+        fun SimpleComposable() {
             scope = currentRecomposeScope
             CompositionLocalProvider(MyCompositionLocal provides compositionLocalValue++) {
                 SimpleComposable2()
@@ -622,13 +555,12 @@
             }
         }
 
-        @Composable fun Root() {
+        @Composable
+        fun Root() {
             SimpleComposable()
         }
 
-        compose {
-            Root()
-        }
+        compose { Root() }
 
         fun validate() {
             validate {
@@ -652,19 +584,15 @@
             Text(local.value)
         }
 
-        validate {
-            Text("Hello world! 0")
-        }
+        validate { Text("Hello world! 0") }
         expectNoChanges()
-        validate {
-            Text("Hello world! 0")
-        }
+        validate { Text("Hello world! 0") }
     }
 
     @Test // regression test for 165416179
     fun recomposeNewModifiedState() = compositionTest {
         var enabler by mutableStateOf(false)
-        var advance = { }
+        var advance = {}
         compose {
             // "enabler" forces the test into the recompose code path
             // rather than initial composition
@@ -672,13 +600,11 @@
                 var state by remember { mutableStateOf(0) }
                 DisposableEffect(Unit) {
                     state = 1
-                    onDispose { }
+                    onDispose {}
                 }
                 Text("$state")
                 Text("Some text")
-                advance = {
-                    state++
-                }
+                advance = { state++ }
             }
         }
 
@@ -719,8 +645,14 @@
 
 class Trigger {
     val count = mutableStateOf(0)
-    fun subscribe() { count.value }
-    fun recompose() { count.value += 1 }
+
+    fun subscribe() {
+        count.value
+    }
+
+    fun recompose() {
+        count.value += 1
+    }
 }
 
-fun use(@Suppress("UNUSED_PARAMETER") value: Any) { }
+fun use(@Suppress("UNUSED_PARAMETER") value: Any) {}
diff --git a/compose/runtime/runtime/src/nonEmulatorCommonTest/kotlin/androidx/compose/runtime/GroupSizeValidationTests.kt b/compose/runtime/runtime/src/nonEmulatorCommonTest/kotlin/androidx/compose/runtime/GroupSizeValidationTests.kt
index 5761c5f..0cf70873 100644
--- a/compose/runtime/runtime/src/nonEmulatorCommonTest/kotlin/androidx/compose/runtime/GroupSizeValidationTests.kt
+++ b/compose/runtime/runtime/src/nonEmulatorCommonTest/kotlin/androidx/compose/runtime/GroupSizeValidationTests.kt
@@ -45,40 +45,26 @@
             noMoreGroupsThan = 3,
             noMoreSlotsThan = 9,
         ) {
-            ColumnLike { }
+            ColumnLike {}
         }
     }
 
     @Test
     fun textLikeSize() = compositionTest {
-        slotExpect(
-            name = "TextLike",
-            noMoreGroupsThan = 4,
-            noMoreSlotsThan = 4
-        ) {
-            TextLike("")
-        }
+        slotExpect(name = "TextLike", noMoreGroupsThan = 4, noMoreSlotsThan = 4) { TextLike("") }
     }
 
     @Test
     fun basicTextLikeSize() = compositionTest {
-        slotExpect(
-            name = "TextLike",
-            noMoreGroupsThan = 5,
-            noMoreSlotsThan = 13
-        ) {
+        slotExpect(name = "TextLike", noMoreGroupsThan = 5, noMoreSlotsThan = 13) {
             BasicTextLike("")
         }
     }
 
     @Test
     fun checkboxLike() = compositionTest {
-        slotExpect(
-            name = "CheckboxLike",
-            noMoreGroupsThan = 8,
-            noMoreSlotsThan = 17
-        ) {
-            CheckboxLike(checked = false, onCheckedChange = { })
+        slotExpect(name = "CheckboxLike", noMoreGroupsThan = 8, noMoreSlotsThan = 17) {
+            CheckboxLike(checked = false, onCheckedChange = {})
         }
     }
 }
@@ -159,24 +145,20 @@
 
 @Immutable
 private object Arrangement {
-    @Stable
-    interface Vertical
+    @Stable interface Vertical
 
-    @Stable
-    val Top = object : Vertical { }
+    @Stable val Top = object : Vertical {}
 }
 
 @Immutable
 private object Alignment {
-    @Stable
-    interface Horizontal
+    @Stable interface Horizontal
 
-    @Stable
-    val Start = object : Horizontal { }
+    @Stable val Start = object : Horizontal {}
 }
 
 private object SpacerMeasurePolicy : MeasurePolicy {
-    override fun measure() { }
+    override fun measure() {}
 }
 
 @Composable
@@ -184,8 +166,7 @@
     LayoutLike(measurePolicy = SpacerMeasurePolicy, modifier = modifier)
 }
 
-@Immutable
-private interface ColumnScope
+@Immutable private interface ColumnScope
 
 private object ColumnScopeInstance : ColumnScope
 
@@ -197,8 +178,7 @@
     horizontalAlignment: Alignment.Horizontal = Alignment.Start,
     content: @Composable ColumnScope.() -> Unit
 ) {
-    val measurePolicy =
-        columnMeasurePolicy(verticalArrangement, horizontalAlignment)
+    val measurePolicy = columnMeasurePolicy(verticalArrangement, horizontalAlignment)
     LayoutLike(
         content = { ColumnScopeInstance.content() },
         measurePolicy = measurePolicy,
@@ -207,19 +187,19 @@
 }
 
 private object DefaultColumnRowMeasurePolicy : MeasurePolicy {
-    override fun measure() { }
+    override fun measure() {}
 }
 
-@Composable private fun columnMeasurePolicy(
+@Composable
+private fun columnMeasurePolicy(
     verticalArrangement: Arrangement.Vertical,
     horizontalAlignment: Alignment.Horizontal
-) = if (verticalArrangement == Arrangement.Top && horizontalAlignment == Alignment.Start) {
-    DefaultColumnRowMeasurePolicy
-} else {
-    remember(verticalArrangement, horizontalAlignment) {
+) =
+    if (verticalArrangement == Arrangement.Top && horizontalAlignment == Alignment.Start) {
         DefaultColumnRowMeasurePolicy
+    } else {
+        remember(verticalArrangement, horizontalAlignment) { DefaultColumnRowMeasurePolicy }
     }
-}
 
 @Immutable
 @JvmInline
@@ -227,19 +207,15 @@
 
     @Stable
     @Suppress("UNUSED_PARAMETER")
-    fun copy(
-        alpha: Float = 0f,
-        red: Float = 0f,
-        green: Float = 0f,
-        blue: Float = 0f
-    ): Color = this
+    fun copy(alpha: Float = 0f, red: Float = 0f, green: Float = 0f, blue: Float = 0f): Color = this
 
     companion object {
-        @Stable
-        val Unspecified = Color(0u)
+        @Stable val Unspecified = Color(0u)
     }
 }
-private val Color.isSpecified: Boolean get() = this != Color.Unspecified
+
+private val Color.isSpecified: Boolean
+    get() = this != Color.Unspecified
 
 private inline fun Color.takeOrElse(block: () -> Color): Color = if (isSpecified) this else block()
 
@@ -247,17 +223,13 @@
 @JvmInline
 private value class TextUnit(val packedValue: Long) {
     companion object {
-        @Stable
-        val Unspecified = TextUnit(0)
+        @Stable val Unspecified = TextUnit(0)
     }
 }
 
-@JvmInline
-value class FontStyle(val value: Int)
+@JvmInline value class FontStyle(val value: Int)
 
-@Immutable
-@Suppress("unused")
-private class FontWeight(val weight: Int)
+@Immutable @Suppress("unused") private class FontWeight(val weight: Int)
 
 @Immutable
 @Suppress("UNUSED_PARAMETER")
@@ -265,26 +237,21 @@
     @Stable
     interface Resolver {
         companion object {
-            val Default = object : Resolver { }
+            val Default = object : Resolver {}
         }
     }
 }
 
 private val LocalFontFamilyResolver = staticCompositionLocalOf { FontFamily.Resolver.Default }
 
-@Immutable
-@Suppress("unused")
-private class TextDecoration(val mask: Int)
+@Immutable @Suppress("unused") private class TextDecoration(val mask: Int)
 
-@JvmInline
-@Suppress("unused")
-private value class TextAlign(val value: Int)
+@JvmInline @Suppress("unused") private value class TextAlign(val value: Int)
 
 @JvmInline
 private value class TextOverflow(val value: Int) {
     companion object {
-        @Stable
-        val Clip = TextOverflow(1)
+        @Stable val Clip = TextOverflow(1)
     }
 }
 
@@ -340,9 +307,8 @@
 private val LocalTextStyle = staticCompositionLocalOf { DefaultTextStyle }
 private val LocalContentColor = staticCompositionLocalOf { Color.Unspecified }
 private val LocalContentAlpha = staticCompositionLocalOf { 1f }
-private val LocalSelectionRegistrar = staticCompositionLocalOf<SelectionRegistrar?> {
-    DefaultSelectionRegister
-}
+private val LocalSelectionRegistrar =
+    staticCompositionLocalOf<SelectionRegistrar?> { DefaultSelectionRegister }
 
 @Composable
 private fun TextLike(
@@ -366,23 +332,20 @@
 ) {
     val localColor = LocalContentColor.current
     val localAlpha = LocalContentAlpha.current
-    val textColor = color.takeOrElse {
-        style.color.takeOrElse {
-            localColor.copy(localAlpha)
-        }
-    }
+    val textColor = color.takeOrElse { style.color.takeOrElse { localColor.copy(localAlpha) } }
 
-    val mergedStyle = style.merge2(
-        color = textColor,
-        fontSize = fontSize,
-        fontWeight = fontWeight,
-        textAlign = textAlign,
-        lineHeight = lineHeight,
-        fontFamily = fontFamily,
-        textDecoration = textDecoration,
-        fontStyle = fontStyle,
-        letterSpacing = letterSpacing
-    )
+    val mergedStyle =
+        style.merge2(
+            color = textColor,
+            fontSize = fontSize,
+            fontWeight = fontWeight,
+            textAlign = textAlign,
+            lineHeight = lineHeight,
+            fontFamily = fontFamily,
+            textDecoration = textDecoration,
+            fontStyle = fontStyle,
+            letterSpacing = letterSpacing
+        )
     EmptyBasicTextLikeComposable(
         text = text,
         modifier = modifier,
@@ -395,9 +358,7 @@
     )
 }
 
-/**
- * This composable adds no internal overhead, to isolate material text details
- */
+/** This composable adds no internal overhead, to isolate material text details */
 @Suppress("UNUSED_PARAMETER")
 @Composable
 private fun EmptyBasicTextLikeComposable(
@@ -429,8 +390,9 @@
     val receivedSlots = group.slotsSize
 
     if (receivedGroups > noMoreGroupsThan || receivedSlots > noMoreSlotsThan) {
-        error("Expected $noMoreGroupsThan groups and $noMoreSlotsThan slots " +
-            "but received $receivedGroups and $receivedSlots\n"
+        error(
+            "Expected $noMoreGroupsThan groups and $noMoreSlotsThan slots " +
+                "but received $receivedGroups and $receivedSlots\n"
         )
     }
     if (receivedSlots < noMoreSlotsThan || receivedGroups < noMoreGroupsThan) {
@@ -441,16 +403,12 @@
     }
 }
 
-@Suppress("unused")
-private class AnnotatedString(val text: String)
+@Suppress("unused") private class AnnotatedString(val text: String)
 
 @Suppress("unused")
-private class TextState(
-    val textDelegate: TextDelegate,
-    val selectionId: Long
-) {
+private class TextState(val textDelegate: TextDelegate, val selectionId: Long) {
     var selectionBackgroundColor: Color = Color.Unspecified
-    var onTextLayout: (TextLayoutResult) -> Unit = { }
+    var onTextLayout: (TextLayoutResult) -> Unit = {}
 }
 
 @Suppress("unused")
@@ -481,16 +439,15 @@
 @Suppress("UNUSED_PARAMETER")
 private class TextController(val state: TextState) {
     val measurePolicy: MeasurePolicy = DefaultColumnRowMeasurePolicy
-    fun setTextDelegate(updateTextDelegate: TextDelegate) { }
-    fun update(selectionRegistrar: SelectionRegistrar?) { }
+
+    fun setTextDelegate(updateTextDelegate: TextDelegate) {}
+
+    fun update(selectionRegistrar: SelectionRegistrar?) {}
 }
 
 @Immutable
 @Suppress("unused")
-private class TextSelectionColors(
-    val handleColor: Color,
-    val backgroundColor: Color
-) {
+private class TextSelectionColors(val handleColor: Color, val backgroundColor: Color) {
     companion object {
         val Default = TextSelectionColors(Color.Unspecified, Color.Unspecified)
     }
@@ -524,13 +481,12 @@
 
     // NOTE(text-perf-review): potential bug. selectableId is regenerated here whenever text
     // changes, but it is only saved in the initial creation of TextState.
-    val selectableId = if (selectionRegistrar == null) {
-        SelectionRegistrar.InvalidSelectableId
-    } else {
-        remember(text, selectionRegistrar) {
-            selectionRegistrar.nextSelectableId()
+    val selectableId =
+        if (selectionRegistrar == null) {
+            SelectionRegistrar.InvalidSelectableId
+        } else {
+            remember(text, selectionRegistrar) { selectionRegistrar.nextSelectableId() }
         }
-    }
 
     val controller = remember {
         TextController(
@@ -586,7 +542,10 @@
 ) {
     TriStateCheckboxLike(
         state = ToggleableState(checked),
-        onClick = if (onCheckedChange != null) { { onCheckedChange(!checked) } } else null,
+        onClick =
+            if (onCheckedChange != null) {
+                { onCheckedChange(!checked) }
+            } else null,
         enabled = enabled,
         modifier = modifier
     )
@@ -609,20 +568,12 @@
     modifier: Modifier = Modifier,
     enabled: Boolean = true
 ) {
-    CheckboxImplLike(
-        enabled = enabled,
-        value = state,
-        modifier = modifier
-    )
+    CheckboxImplLike(enabled = enabled, value = state, modifier = modifier)
 }
 
 @Suppress("UNUSED_EXPRESSION")
 @Composable
-private fun CheckboxImplLike(
-    enabled: Boolean,
-    value: ToggleableState,
-    modifier: Modifier
-) {
+private fun CheckboxImplLike(enabled: Boolean, value: ToggleableState, modifier: Modifier) {
     CanvasLike(modifier) {
         enabled
         value
@@ -633,8 +584,7 @@
 
 @Suppress("UNUSED_PARAMETER")
 @Composable
-private fun CanvasLike(modifier: Modifier, onDraw: DrawScope.() -> Unit) =
-    SpacerLike(modifier)
+private fun CanvasLike(modifier: Modifier, onDraw: DrawScope.() -> Unit) = SpacerLike(modifier)
 
 // Utility functions for the tests
 
@@ -657,14 +607,15 @@
     return stringOf(this, "")
 }
 
-@Suppress("ConstPropertyName")
-private const val MarkerGroup = -340126117
+@Suppress("ConstPropertyName") private const val MarkerGroup = -340126117
 
 private fun findMarkerGroup(compositionData: CompositionData): CompositionGroup {
     fun findGroup(groups: Iterable<CompositionGroup>, key: Int): CompositionGroup? {
         for (group in groups) {
             if (group.key == key) return group
-            findGroup(group.compositionGroups, key)?.let { return it }
+            findGroup(group.compositionGroups, key)?.let {
+                return it
+            }
         }
         return null
     }
diff --git a/compose/runtime/runtime/src/nonEmulatorCommonTest/kotlin/androidx/compose/runtime/LatchTest.kt b/compose/runtime/runtime/src/nonEmulatorCommonTest/kotlin/androidx/compose/runtime/LatchTest.kt
index 041d795..4a87a12 100644
--- a/compose/runtime/runtime/src/nonEmulatorCommonTest/kotlin/androidx/compose/runtime/LatchTest.kt
+++ b/compose/runtime/runtime/src/nonEmulatorCommonTest/kotlin/androidx/compose/runtime/LatchTest.kt
@@ -45,8 +45,6 @@
         assertTrue("all awaiters still active") { awaiters.all { it.isActive } }
 
         latch.openLatch()
-        withTimeout(500) {
-            awaiters.map { it.join() }
-        }
+        withTimeout(500) { awaiters.map { it.join() } }
     }
 }
diff --git a/compose/runtime/runtime/src/nonEmulatorCommonTest/kotlin/androidx/compose/runtime/ModelViewTests.kt b/compose/runtime/runtime/src/nonEmulatorCommonTest/kotlin/androidx/compose/runtime/ModelViewTests.kt
index b121e62..1861808 100644
--- a/compose/runtime/runtime/src/nonEmulatorCommonTest/kotlin/androidx/compose/runtime/ModelViewTests.kt
+++ b/compose/runtime/runtime/src/nonEmulatorCommonTest/kotlin/androidx/compose/runtime/ModelViewTests.kt
@@ -38,38 +38,25 @@
 
     @Test
     fun testModelView_Simple() = compositionTest {
-        compose {
-            Text("Hello world!")
-        }
+        compose { Text("Hello world!") }
 
-        validate {
-            Text("Hello world!")
-        }
+        validate { Text("Hello world!") }
     }
 
     @Test
     fun testModelView_Simple_Recompose() = compositionTest {
-        compose {
-            Text(value = "Hello world!")
-        }
+        compose { Text(value = "Hello world!") }
 
-        validate {
-            Text(value = "Hello world!")
-        }
+        validate { Text(value = "Hello world!") }
 
         expectNoChanges()
 
-        validate {
-            Text(value = "Hello world!")
-        }
+        validate { Text(value = "Hello world!") }
     }
 
     @Test
     fun testModelView_PersonModel() = compositionTest {
-        val president = Person(
-            PRESIDENT_NAME_1,
-            PRESIDENT_AGE_1
-        )
+        val president = Person(PRESIDENT_NAME_1, PRESIDENT_AGE_1)
 
         compose {
             Text(president.name)
@@ -93,18 +80,13 @@
 
     @Test
     fun testModelView_RecomposeScopeCleanup() = compositionTest {
-        val washington = Person(
-            PRESIDENT_NAME_1,
-            PRESIDENT_AGE_1
-        )
-        val lincoln = Person(
-            PRESIDENT_NAME_16,
-            PRESIDENT_AGE_16
-        )
+        val washington = Person(PRESIDENT_NAME_1, PRESIDENT_AGE_1)
+        val lincoln = Person(PRESIDENT_NAME_16, PRESIDENT_AGE_16)
 
         val displayLincoln = mutableStateOf(true)
 
-        @Composable fun Display(person: Person) {
+        @Composable
+        fun Display(person: Person) {
             Text(person.name)
             Text(person.age.toString())
         }
@@ -140,12 +122,10 @@
     // b/122548164
     @Test
     fun testObserverEntering() = compositionTest {
-        val president = Person(
-            PRESIDENT_NAME_1,
-            PRESIDENT_AGE_1
-        )
+        val president = Person(PRESIDENT_NAME_1, PRESIDENT_AGE_1)
 
-        @Composable fun Display(person: Person) {
+        @Composable
+        fun Display(person: Person) {
             Text(person.name)
             Text("${person.age}")
             if (person.name == PRESIDENT_NAME_16) {
@@ -163,14 +143,10 @@
             }
         }
 
-        compose {
-            Display(president)
-        }
+        compose { Display(president) }
 
         fun validate() {
-            validate {
-                this.Display(president)
-            }
+            validate { this.Display(president) }
         }
         validate()
 
@@ -181,12 +157,10 @@
 
     @Test
     fun testModelUpdatesNextFrameVisibility() = compositionTest {
-        val president = Person(
-            PRESIDENT_NAME_1,
-            PRESIDENT_AGE_1
-        )
+        val president = Person(PRESIDENT_NAME_1, PRESIDENT_AGE_1)
 
-        @Composable fun Display(person: Person) {
+        @Composable
+        fun Display(person: Person) {
             Text(person.name)
             Text("${person.age}")
             if (person.name == PRESIDENT_NAME_16) {
@@ -205,14 +179,10 @@
             }
         }
 
-        compose {
-            Display(president)
-        }
+        compose { Display(president) }
 
         fun validate(nameOverride: String? = null) {
-            validate {
-                this.Display(president, nameOverride)
-            }
+            validate { this.Display(president, nameOverride) }
         }
         validate()
 
diff --git a/compose/runtime/runtime/src/nonEmulatorCommonTest/kotlin/androidx/compose/runtime/MovableContentTests.kt b/compose/runtime/runtime/src/nonEmulatorCommonTest/kotlin/androidx/compose/runtime/MovableContentTests.kt
index 389c6ae..54fa6f6 100644
--- a/compose/runtime/runtime/src/nonEmulatorCommonTest/kotlin/androidx/compose/runtime/MovableContentTests.kt
+++ b/compose/runtime/runtime/src/nonEmulatorCommonTest/kotlin/androidx/compose/runtime/MovableContentTests.kt
@@ -52,19 +52,13 @@
         @Composable
         fun Test() {
             if (portrait) {
-                Column {
-                    content()
-                }
+                Column { content() }
             } else {
-                Row {
-                    content()
-                }
+                Row { content() }
             }
         }
 
-        compose {
-            Test()
-        }
+        compose { Test() }
 
         validate {
             fun MockViewValidator.value() {
@@ -73,13 +67,9 @@
             }
 
             if (portrait) {
-                Column {
-                    this.value()
-                }
+                Column { this.value() }
             } else {
-                Row {
-                    this.value()
-                }
+                Row { this.value() }
             }
         }
 
@@ -105,19 +95,13 @@
         @Composable
         fun Test() {
             if (portrait) {
-                Column {
-                    content()
-                }
+                Column { content() }
             } else {
-                Row {
-                    content()
-                }
+                Row { content() }
             }
         }
 
-        compose {
-            Test()
-        }
+        compose { Test() }
 
         fun MockViewValidator.value() {
             Text("Some text")
@@ -126,13 +110,9 @@
 
         validate {
             if (portrait) {
-                Column {
-                    this.value()
-                }
+                Column { this.value() }
             } else {
-                Row {
-                    this.value()
-                }
+                Row { this.value() }
             }
         }
 
@@ -153,9 +133,7 @@
 
         @Composable
         fun addRememberedObject() {
-            remember {
-                RememberedObject().also { rememberedObject.add(it) }
-            }
+            remember { RememberedObject().also { rememberedObject.add(it) } }
         }
 
         val content = movableContentOf {
@@ -227,9 +205,7 @@
 
         @Composable
         fun addRememberObject() {
-            remember {
-                RememberedObject().also { rememberObservers.add(it) }
-            }
+            remember { RememberedObject().also { rememberObservers.add(it) } }
         }
 
         val content = movableContentOf {
@@ -304,14 +280,8 @@
 
         validate()
 
-        for (newPosition in listOf(
-            inSubcompose1,
-            inSubcompose2,
-            inSubcompose1,
-            inMain,
-            inSubcompose2,
-            inMain
-        )) {
+        for (newPosition in
+            listOf(inSubcompose1, inSubcompose2, inSubcompose1, inMain, inSubcompose2, inMain)) {
             position = newPosition
             expectChanges()
             validate()
@@ -321,9 +291,7 @@
     @Test
     fun normalMoveWithContentMove() = compositionTest {
         val random = Random(1337)
-        val list = mutableStateListOf(
-            *List(10) { it }.toTypedArray()
-        )
+        val list = mutableStateListOf(*List(10) { it }.toTypedArray())
 
         val content = movableContentOf { Marker() }
         var position by mutableStateOf(-1)
@@ -387,10 +355,8 @@
                 Column {
                     repeat(10) { item ->
                         key(item) {
-                            if (skipItem != item)
-                                Text("Item $item")
-                            if (position == item)
-                                content()
+                            if (skipItem != item) Text("Item $item")
+                            if (position == item) content()
                         }
                     }
                 }
@@ -405,10 +371,8 @@
                     if (position == -1) Marker()
                     Column {
                         repeat(10) { item ->
-                            if (skipItem != item)
-                                Text("Item $item")
-                            if (position == item)
-                                Marker()
+                            if (skipItem != item) Text("Item $item")
+                            if (position == item) Marker()
                         }
                     }
                 }
@@ -458,9 +422,7 @@
     fun invalidationsMoveWithContent() = compositionTest {
         var data by mutableStateOf(0)
         var position by mutableStateOf(-1)
-        val content = movableContentOf {
-            Text("data = $data")
-        }
+        val content = movableContentOf { Text("data = $data") }
 
         compose {
             Row {
@@ -503,9 +465,7 @@
             var right by mutableStateOf(right)
 
             fun validateNode(validator: MockViewValidator) {
-                with(validator) {
-                    Marker(value)
-                }
+                with(validator) { Marker(value) }
                 left?.validateNode(validator)
                 right?.validateNode(validator)
             }
@@ -544,13 +504,9 @@
             }
         }
 
-        compose {
-            contents[tree]?.invoke()
-        }
+        compose { contents[tree]?.invoke() }
 
-        validate {
-            tree.validateNode(this)
-        }
+        validate { tree.validateNode(this) }
 
         tree.forEach { it.swap() }
 
@@ -567,7 +523,6 @@
 
     @Test
     fun multipleContentsMovingIntoCommonParent() = compositionTest {
-
         val content1 = movableContentOf {
             Text("1-1")
             Text("1-2")
@@ -701,8 +656,7 @@
             val result = mutableMapOf<String?, View>()
             fun collect(view: View) {
                 if (view.name == "Text") {
-                    if (view.text?.contains('-') == false)
-                        result[view.text] = view
+                    if (view.text?.contains('-') == false) result[view.text] = view
                 }
                 for (child in view.children) {
                     collect(child)
@@ -741,9 +695,7 @@
 
     @Test
     fun childIndexesAreCorrectlyCalculated() = compositionTest {
-        val content = movableContentOf {
-            Marker(0)
-        }
+        val content = movableContentOf { Marker(0) }
 
         var vertical by mutableStateOf(false)
         compose {
@@ -762,13 +714,9 @@
 
         validate {
             if (vertical) {
-                Row {
-                    Marker(0)
-                }
+                Row { Marker(0) }
             } else {
-                Column {
-                    Marker(0)
-                }
+                Column { Marker(0) }
             }
         }
 
@@ -781,25 +729,11 @@
     fun validateRecomposeScopesDoNotGetLost() = compositionTest {
         var isHorizontal by mutableStateOf(false)
         val displayValue = mutableStateOf(0)
-        val content = movableContentOf {
-            DisplayInt(displayValue)
-        }
+        val content = movableContentOf { DisplayInt(displayValue) }
 
-        compose {
-            Stack(isHorizontal) {
-                Row {
-                    content()
-                }
-            }
-        }
+        compose { Stack(isHorizontal) { Row { content() } } }
 
-        validate {
-            Stack(isHorizontal) {
-                Row {
-                    DisplayInt(displayValue)
-                }
-            }
-        }
+        validate { Stack(isHorizontal) { Row { DisplayInt(displayValue) } } }
 
         displayValue.value++
         expectChanges()
@@ -817,9 +751,7 @@
     @Test
     fun compositionLocalsShouldBeAvailable() = compositionTest {
         var someValue by mutableStateOf(0)
-        val local = staticCompositionLocalOf<Int> {
-            error("No value provided for local")
-        }
+        val local = staticCompositionLocalOf<Int> { error("No value provided for local") }
 
         compose {
             Wrap(20) {
@@ -830,10 +762,7 @@
                         Text("Local = ${local.current}")
                         Text("SomeValue = $someValue")
                     }
-                    if (someValue % 2 == 0)
-                        content()
-                    else
-                        content()
+                    if (someValue % 2 == 0) content() else content()
                 }
             }
         }
@@ -852,15 +781,9 @@
     @Test
     fun compositionLocalsShouldBeAvailableInNestedContent() = compositionTest {
         var someValue by mutableStateOf(0)
-        val local = staticCompositionLocalOf<Int> {
-            error("No value provided for local")
-        }
+        val local = staticCompositionLocalOf<Int> { error("No value provided for local") }
 
-        val parent = movableContentOf<@Composable () -> Unit> { child ->
-            Wrap {
-                child()
-            }
-        }
+        val parent = movableContentOf<@Composable () -> Unit> { child -> Wrap { child() } }
 
         val child = movableContentOf {
             Text("Local = ${local.current}")
@@ -913,17 +836,14 @@
         var useInSub1 by mutableStateOf(false)
         var useInSub2 by mutableStateOf(false)
 
-        @Composable fun use() {
+        @Composable
+        fun use() {
             remember { rememberObject }
         }
         compose {
             if (useInMain) use()
-            Subcompose {
-                if (useInSub1) use()
-            }
-            Subcompose {
-                if (useInSub2) use()
-            }
+            Subcompose { if (useInSub1) use() }
+            Subcompose { if (useInSub2) use() }
         }
 
         fun expectUnused() {
@@ -975,22 +895,17 @@
 
         @Suppress("UNUSED_VARIABLE") // Object not remembered without
         val rememberTheObject = movableContentOf {
-            val obj = remember {
-                rememberObject
-            }
+            val obj = remember { rememberObject }
         }
 
-        @Composable fun use() {
+        @Composable
+        fun use() {
             rememberTheObject()
         }
         compose {
             if (useInMain) use()
-            Subcompose {
-                if (useInSub1) use()
-            }
-            Subcompose {
-                if (useInSub2) use()
-            }
+            Subcompose { if (useInSub1) use() }
+            Subcompose { if (useInSub2) use() }
         }
 
         fun expectUnused() {
@@ -1198,9 +1113,7 @@
     @Test
     fun movableContentParameters_One() = compositionTest {
         val data = mutableStateOf(0)
-        val content = movableContentOf<Int> { p1 ->
-            Text("Value p1=$p1, data=${data.value}")
-        }
+        val content = movableContentOf<Int> { p1 -> Text("Value p1=$p1, data=${data.value}") }
 
         compose {
             content(1)
@@ -1220,9 +1133,10 @@
     @Test
     fun movableContentParameters_Two() = compositionTest {
         val data = mutableStateOf(0)
-        val content = movableContentOf<Int, Int> { p1, p2 ->
-            Text("Value p1=$p1, p2=$p2, data=${data.value}")
-        }
+        val content =
+            movableContentOf<Int, Int> { p1, p2 ->
+                Text("Value p1=$p1, p2=$p2, data=${data.value}")
+            }
 
         compose {
             content(1, 2)
@@ -1242,9 +1156,10 @@
     @Test
     fun movableContentParameters_Three() = compositionTest {
         val data = mutableStateOf(0)
-        val content = movableContentOf<Int, Int, Int> { p1, p2, p3 ->
-            Text("Value p1=$p1, p2=$p2, p3=$p3, data=${data.value}")
-        }
+        val content =
+            movableContentOf<Int, Int, Int> { p1, p2, p3 ->
+                Text("Value p1=$p1, p2=$p2, p3=$p3, data=${data.value}")
+            }
 
         compose {
             content(1, 2, 3)
@@ -1264,9 +1179,10 @@
     @Test
     fun movableContentParameters_Four() = compositionTest {
         val data = mutableStateOf(0)
-        val content = movableContentOf<Int, Int, Int, Int> { p1, p2, p3, p4 ->
-            Text("Value p1=$p1, p2=$p2, p3=$p3, p4=$p4, data=${data.value}")
-        }
+        val content =
+            movableContentOf<Int, Int, Int, Int> { p1, p2, p3, p4 ->
+                Text("Value p1=$p1, p2=$p2, p3=$p3, p4=$p4, data=${data.value}")
+            }
 
         compose {
             content(1, 2, 3, 4)
@@ -1286,9 +1202,8 @@
     @Test
     fun movableContentReceiver_None() = compositionTest {
         val data = mutableStateOf(0)
-        val content = movableContentWithReceiverOf<Int>() {
-            Text("Value this=$this, data=${data.value}")
-        }
+        val content =
+            movableContentWithReceiverOf<Int>() { Text("Value this=$this, data=${data.value}") }
         val receiver1 = 100
         val receiver2 = 200
 
@@ -1310,9 +1225,10 @@
     @Test
     fun movableContentReceiver_One() = compositionTest {
         val data = mutableStateOf(0)
-        val content = movableContentWithReceiverOf<Int, Int>() { p1 ->
-            Text("Value this=$this, p1=$p1, data=${data.value}")
-        }
+        val content =
+            movableContentWithReceiverOf<Int, Int>() { p1 ->
+                Text("Value this=$this, p1=$p1, data=${data.value}")
+            }
         val receiver1 = 100
         val receiver2 = 200
 
@@ -1334,9 +1250,10 @@
     @Test
     fun movableContentReceiver_Two() = compositionTest {
         val data = mutableStateOf(0)
-        val content = movableContentWithReceiverOf<Int, Int, Int>() { p1, p2 ->
-            Text("Value this=$this, p1=$p1, p2=$p2, data=${data.value}")
-        }
+        val content =
+            movableContentWithReceiverOf<Int, Int, Int>() { p1, p2 ->
+                Text("Value this=$this, p1=$p1, p2=$p2, data=${data.value}")
+            }
         val receiver1 = 100
         val receiver2 = 200
 
@@ -1358,9 +1275,10 @@
     @Test
     fun movableContentReceiver_Three() = compositionTest {
         val data = mutableStateOf(0)
-        val content = movableContentWithReceiverOf<Int, Int, Int, Int>() { p1, p2, p3 ->
-            Text("Value this=$this, p1=$p1, p2=$p2, p3=$p3, data=${data.value}")
-        }
+        val content =
+            movableContentWithReceiverOf<Int, Int, Int, Int>() { p1, p2, p3 ->
+                Text("Value this=$this, p1=$p1, p2=$p2, p3=$p3, data=${data.value}")
+            }
         val receiver1 = 100
         val receiver2 = 200
 
@@ -1383,28 +1301,18 @@
     fun movableContentParameters_changedParameter() = compositionTest {
         val data = mutableStateOf(0)
         val location = mutableStateOf(0)
-        val content = movableContentOf<Int> { d ->
-            Text("d=$d")
-        }
+        val content = movableContentOf<Int> { d -> Text("d=$d") }
 
         compose {
             if (location.value == 0) content(data.value)
-            Column {
-                if (location.value == 1) content(data.value)
-            }
-            Row {
-                if (location.value == 2) content(data.value)
-            }
+            Column { if (location.value == 1) content(data.value) }
+            Row { if (location.value == 2) content(data.value) }
         }
 
         validate {
             if (location.value == 0) Text("d=${data.value}")
-            Column {
-                if (location.value == 1) Text("d=${data.value}")
-            }
-            Row {
-                if (location.value == 2) Text("d=${data.value}")
-            }
+            Column { if (location.value == 1) Text("d=${data.value}") }
+            Row { if (location.value == 2) Text("d=${data.value}") }
         }
 
         location.value++
@@ -1426,12 +1334,8 @@
     fun movableContentOfTheSameFunctionShouldHaveStableKeys() = compositionTest {
         val hashList1 = mutableListOf<Int>()
         val hashList2 = mutableListOf<Int>()
-        val composable1: @Composable () -> Unit = {
-            hashList1.add(currentCompositeKeyHash)
-        }
-        val composable2: @Composable () -> Unit = {
-            hashList2.add(currentCompositeKeyHash)
-        }
+        val composable1: @Composable () -> Unit = { hashList1.add(currentCompositeKeyHash) }
+        val composable2: @Composable () -> Unit = { hashList2.add(currentCompositeKeyHash) }
         val movableContent1A = movableContentOf(composable1)
         val movableContent1B = movableContentOf(composable1)
         val movableContent2A = movableContentOf(composable2)
@@ -1461,13 +1365,9 @@
             hashList.add(currentCompositeKeyHash)
             Text("counter=${counter.value}")
         }
-        compose {
-            movableContent()
-        }
+        compose { movableContent() }
 
-        validate {
-            Text("counter=${counter.value}")
-        }
+        validate { Text("counter=${counter.value}") }
 
         counter.value++
         expectChanges()
@@ -1481,19 +1381,13 @@
     fun parameterPassingThroughDeferredSubcompose() = compositionTest {
         var state by mutableStateOf(false)
         var lastSeen: Boolean? = null
-        val content = movableContentOf { parameter: Boolean ->
-            Container {
-                lastSeen = parameter
-            }
-        }
+        val content = movableContentOf { parameter: Boolean -> Container { lastSeen = parameter } }
 
         compose {
             if (state) {
                 content(true)
             } else {
-                DeferredSubcompose {
-                    content(state)
-                }
+                DeferredSubcompose { content(state) }
             }
         }
 
@@ -1526,9 +1420,7 @@
 
         compose {
             if (deferred) {
-                DeferredSubcompose {
-                    content()
-                }
+                DeferredSubcompose { content() }
                 SideEffect {
                     state++
                     scope?.invalidate()
@@ -1553,26 +1445,18 @@
     fun movableContent_moveRow() = compositionTest {
         var condition by mutableStateOf(true)
 
-        val movableContent1 = movableContentOf {
-            Text("First")
-        }
-        val movableContent2 = movableContentOf {
-            Text("Second")
-        }
+        val movableContent1 = movableContentOf { Text("First") }
+        val movableContent2 = movableContentOf { Text("Second") }
 
         compose {
             if (condition) {
                 Linear {
-                    Linear {
-                        movableContent1()
-                    }
+                    Linear { movableContent1() }
                     movableContent2()
                 }
             } else {
                 Linear {
-                    Linear {
-                        movableContent1()
-                    }
+                    Linear { movableContent1() }
                     movableContent2()
                 }
             }
@@ -1580,9 +1464,7 @@
 
         validate {
             Linear {
-                Linear {
-                    Text("First")
-                }
+                Linear { Text("First") }
                 Text("Second")
             }
         }
@@ -1595,11 +1477,7 @@
 
     @Test
     fun movableContent_rememberOrdering() = compositionTest {
-        val movableContent1 = movableContentOf {
-            repeat(100) {
-                Text("Some content")
-            }
-        }
+        val movableContent1 = movableContentOf { repeat(100) { Text("Some content") } }
         var includeContent by mutableStateOf(true)
         var rememberKey by mutableStateOf(0)
 
@@ -1607,9 +1485,7 @@
             if (includeContent) {
                 movableContent1()
             }
-            val a = remember(rememberKey) {
-                SimpleRememberedObject("Key $rememberKey")
-            }
+            val a = remember(rememberKey) { SimpleRememberedObject("Key $rememberKey") }
             Text(a.name)
         }
 
@@ -1628,9 +1504,7 @@
         var condition by mutableStateOf(true)
 
         val nestedContent = movableContentOf {
-            val state = remember {
-                data++
-            }
+            val state = remember { data++ }
             Text("Generated state: $state")
         }
 
@@ -1675,15 +1549,11 @@
     @Test // 343178423
     fun movableContent_movingContentOutOfDeferredSubcomposition() = compositionTest {
         var toggle by mutableStateOf(true)
-        val content = movableContentOf {
-            Text("Toggle = $toggle")
-        }
+        val content = movableContentOf { Text("Toggle = $toggle") }
 
         compose {
             if (toggle) {
-                DeferredSubcompose {
-                    content()
-                }
+                DeferredSubcompose { content() }
             } else {
                 content()
             }
@@ -1692,9 +1562,7 @@
 
         validate {
             if (toggle) {
-                DeferredSubcompose {
-                    Text("Toggle = $toggle")
-                }
+                DeferredSubcompose { Text("Toggle = $toggle") }
             } else {
                 Text("Toggle = false")
             }
@@ -1708,10 +1576,7 @@
 
 @Composable
 private fun Row(content: @Composable () -> Unit) {
-    ComposeNode<View, ViewApplier>(
-        factory = { View().also { it.name = "Row" } },
-        update = { }
-    ) {
+    ComposeNode<View, ViewApplier>(factory = { View().also { it.name = "Row" } }, update = {}) {
         content()
     }
 }
@@ -1722,16 +1587,12 @@
 
 @Composable
 private fun Column(content: @Composable () -> Unit) {
-    ComposeNode<View, ViewApplier>(
-        factory = { View().also { it.name = "Column" } },
-        update = { }
-    ) {
+    ComposeNode<View, ViewApplier>(factory = { View().also { it.name = "Column" } }, update = {}) {
         content()
     }
 }
 
-@Composable
-private fun Empty() { }
+@Composable private fun Empty() {}
 
 private fun MockViewValidator.Column(block: MockViewValidator.() -> Unit) {
     view("Column", block)
@@ -1741,9 +1602,7 @@
 private fun Text(text: String) {
     ComposeNode<View, ViewApplier>(
         factory = { View().also { it.name = "Text" } },
-        update = {
-            set(text) { attributes["text"] = it }
-        }
+        update = { set(text) { attributes["text"] = it } }
     )
 }
 
@@ -1754,10 +1613,7 @@
 
 @Composable
 private fun Marker() {
-    ComposeNode<View, ViewApplier>(
-        factory = { View().also { it.name = "Marker" } },
-        update = { }
-    )
+    ComposeNode<View, ViewApplier>(factory = { View().also { it.name = "Marker" } }, update = {})
 }
 
 private fun MockViewValidator.Marker() {
@@ -1768,9 +1624,7 @@
 private fun Marker(value: Int) {
     ComposeNode<View, ViewApplier>(
         factory = { View().also { it.name = "Marker" } },
-        update = {
-            set(value) { attributes["value"] = it }
-        }
+        update = { set(value) { attributes["value"] = it } }
     )
 }
 
@@ -1808,27 +1662,21 @@
 @Composable
 private fun Subcompose(content: @Composable () -> Unit) {
     val host = View().also { it.name = "SubcomposeHost" }
-    ComposeNode<View, ViewApplier>(factory = { host }, update = { })
+    ComposeNode<View, ViewApplier>(factory = { host }, update = {})
     val parent = rememberCompositionContext()
     val composition = Composition(ViewApplier(host), parent)
     composition.setContent(content)
-    DisposableEffect(Unit) {
-        onDispose { composition.dispose() }
-    }
+    DisposableEffect(Unit) { onDispose { composition.dispose() } }
 }
 
 @Composable
 private fun DeferredSubcompose(content: @Composable () -> Unit) {
     val host = View().also { it.name = "DeferredSubcompose" }
-    ComposeNode<View, ViewApplier>(factory = { host }, update = { })
+    ComposeNode<View, ViewApplier>(factory = { host }, update = {})
     val parent = rememberCompositionContext()
     val composition = remember { Composition(ViewApplier(host), parent) }
-    LaunchedEffect(content as Any) {
-        composition.setContent(content)
-    }
-    DisposableEffect(Unit) {
-        onDispose { composition.dispose() }
-    }
+    LaunchedEffect(content as Any) { composition.setContent(content) }
+    DisposableEffect(Unit) { onDispose { composition.dispose() } }
 }
 
 private fun MockViewValidator.Subcompose(content: MockViewValidator.() -> Unit) {
@@ -1841,7 +1689,9 @@
 
 class RememberedObject : RememberObserver {
     var count: Int = 0
-    val isLive: Boolean get() = count > 0
+    val isLive: Boolean
+        get() = count > 0
+
     private var rememberedCount = 0
     private var forgottenCount = 0
     private var abandonedCount = 0
@@ -1870,12 +1720,9 @@
 }
 
 class SimpleRememberedObject(val name: String) : RememberObserver {
-    override fun onRemembered() {
-    }
+    override fun onRemembered() {}
 
-    override fun onForgotten() {
-    }
+    override fun onForgotten() {}
 
-    override fun onAbandoned() {
-    }
+    override fun onAbandoned() {}
 }
diff --git a/compose/runtime/runtime/src/nonEmulatorCommonTest/kotlin/androidx/compose/runtime/NewCodeGenTests.kt b/compose/runtime/runtime/src/nonEmulatorCommonTest/kotlin/androidx/compose/runtime/NewCodeGenTests.kt
index 119889b..b9a0625 100644
--- a/compose/runtime/runtime/src/nonEmulatorCommonTest/kotlin/androidx/compose/runtime/NewCodeGenTests.kt
+++ b/compose/runtime/runtime/src/nonEmulatorCommonTest/kotlin/androidx/compose/runtime/NewCodeGenTests.kt
@@ -29,16 +29,12 @@
     fun testStaticComposition() = compositionTest {
         compose {
             Text("Hello world!")
-            Linear {
-                Text("Yellow world")
-            }
+            Linear { Text("Yellow world") }
         }
 
         validate {
             Text("Hello world!")
-            Linear {
-                Text("Yellow world")
-            }
+            Linear { Text("Yellow world") }
         }
     }
 
@@ -49,17 +45,13 @@
 
         compose {
             Text(text1)
-            Linear {
-                Text(text2)
-            }
+            Linear { Text(text2) }
         }
 
         fun validate() {
             validate {
                 Text(text1)
-                Linear {
-                    Text(text2)
-                }
+                Linear { Text(text2) }
             }
         }
         validate()
@@ -75,14 +67,10 @@
     fun testSingleView() = compositionTest {
         var text by mutableStateOf("Hello world")
 
-        compose {
-            Text(text)
-        }
+        compose { Text(text) }
 
         fun validate() {
-            validate {
-                Text(text)
-            }
+            validate { Text(text) }
         }
         validate()
 
@@ -96,18 +84,10 @@
     fun testViewGroup() = compositionTest {
         var text by mutableStateOf("Hello world")
 
-        compose {
-            Linear {
-                Text(text)
-            }
-        }
+        compose { Linear { Text(text) } }
 
         fun validate() {
-            validate {
-                Linear {
-                    Text(text)
-                }
-            }
+            validate { Linear { Text(text) } }
         }
         validate()
 
@@ -164,9 +144,7 @@
         }
 
         fun validate() {
-            validate {
-                Text("$left + $right = ${left + right}")
-            }
+            validate { Text("$left + $right = ${left + right}") }
         }
         validate()
         assertEquals(1, addCalled.count)
@@ -198,9 +176,7 @@
         compose {
             Linear {
                 for (item in data) {
-                    key(item) {
-                        Text("$item View")
-                    }
+                    key(item) { Text("$item View") }
                 }
             }
         }
@@ -221,7 +197,6 @@
     }
 }
 
-@Stable
-class StableCounter(var count: Int = 0)
+@Stable class StableCounter(var count: Int = 0)
 
 data class Phone(val area: String, val prefix: String, val number: String)
diff --git a/compose/runtime/runtime/src/nonEmulatorCommonTest/kotlin/androidx/compose/runtime/RecomposerTests.kt b/compose/runtime/runtime/src/nonEmulatorCommonTest/kotlin/androidx/compose/runtime/RecomposerTests.kt
index a6e59b3..b8acdd4 100644
--- a/compose/runtime/runtime/src/nonEmulatorCommonTest/kotlin/androidx/compose/runtime/RecomposerTests.kt
+++ b/compose/runtime/runtime/src/nonEmulatorCommonTest/kotlin/androidx/compose/runtime/RecomposerTests.kt
@@ -47,24 +47,18 @@
 class RecomposerTests {
 
     private fun runTestUnconfined(block: suspend TestScope.() -> Unit): Unit =
-        runTest(UnconfinedTestDispatcher()) {
-            block()
-        }
+        runTest(UnconfinedTestDispatcher()) { block() }
 
     @Test
     fun recomposerRecomposesWhileOpen() = runTestUnconfined {
         val testClock = TestMonotonicFrameClock(this)
         withContext(testClock) {
             val recomposer = Recomposer(coroutineContext)
-            val runner = launch {
-                recomposer.runRecomposeAndApplyChanges()
-            }
+            val runner = launch { recomposer.runRecomposeAndApplyChanges() }
             val composition = Composition(UnitApplier(), recomposer)
             var state by mutableStateOf(0)
             var lastRecomposedState = -1
-            composition.setContent {
-                lastRecomposedState = state
-            }
+            composition.setContent { lastRecomposedState = state }
             assertEquals(0, lastRecomposedState, "initial composition")
             Snapshot.withMutableSnapshot { state = 1 }
             assertNotNull(
@@ -97,16 +91,10 @@
         val testClock = TestMonotonicFrameClock(this)
         withContext(testClock) {
             val recomposer = Recomposer(coroutineContext)
-            val runner = launch {
-                recomposer.runRecomposeAndApplyChanges()
-            }
+            val runner = launch { recomposer.runRecomposeAndApplyChanges() }
             val composition = Composition(UnitApplier(), recomposer)
             val completer = Job()
-            composition.setContent {
-                LaunchedEffect(completer) {
-                    completer.join()
-                }
-            }
+            composition.setContent { LaunchedEffect(completer) { completer.join() } }
             recomposer.awaitIdle()
             recomposer.close()
             recomposer.awaitIdle()
@@ -121,27 +109,20 @@
                 recomposer.currentState.first(),
                 "recomposer state"
             )
-            assertNotNull(
-                withTimeoutOrNull(5_000) { runner.join() },
-                "Expected runner join"
-            )
+            assertNotNull(withTimeoutOrNull(5_000) { runner.join() }, "Expected runner join")
         }
     }
 
     @Test
     fun testRecomposition() = compositionTest {
         val counter = Counter()
-        val triggers = mapOf(
-            99 to Trigger(),
-            100 to Trigger(),
-            102 to Trigger(),
-        )
-        compose {
-            RecomposeTestComponentsA(
-                counter,
-                triggers
+        val triggers =
+            mapOf(
+                99 to Trigger(),
+                100 to Trigger(),
+                102 to Trigger(),
             )
-        }
+        compose { RecomposeTestComponentsA(counter, triggers) }
 
         assertEquals(1, counter["A"])
         assertEquals(1, counter["100"])
@@ -199,9 +180,7 @@
             TestSubcomposition {
                 // Take up some slot space
                 // This makes it more likely to reproduce bug 157111271.
-                remember(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15) {
-                    1
-                }
+                remember(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15) { 1 }
                 if (includeA) {
                     Wrapper {
                         B(0)
@@ -215,9 +194,7 @@
             }
         }
 
-        compose {
-            T()
-        }
+        compose { T() }
 
         includeA = true
         advance(ignorePendingWork = true)
@@ -240,9 +217,7 @@
             assertNotNull(a)
         }
 
-        @Composable
-        fun use(@Suppress("UNUSED_PARAMETER") i: Int) {
-        }
+        @Composable fun use(@Suppress("UNUSED_PARAMETER") i: Int) {}
 
         @Composable
         fun useA(a: A = A()) {
@@ -256,9 +231,7 @@
             useA()
         }
 
-        compose {
-            test()
-        }
+        compose { test() }
 
         // Recompose test() skipping useA()
         state1 = 2
@@ -293,9 +266,7 @@
         lateinit var child: ControlledComposition
         parent.setContent {
             val parentContext = rememberCompositionContext()
-            SideEffect {
-                child = ControlledComposition(UnitApplier(), parentContext)
-            }
+            SideEffect { child = ControlledComposition(UnitApplier(), parentContext) }
         }
 
         assertEquals(
@@ -310,15 +281,11 @@
         var someState by mutableStateOf(0)
         var recompostions = 0
 
-        @Composable
-        fun use(@Suppress("UNUSED_PARAMETER") i: Int) {
-        }
+        @Composable fun use(@Suppress("UNUSED_PARAMETER") i: Int) {}
 
         compose {
             recompostions++
-            use(
-                Snapshot.withoutReadObservation { someState }
-            )
+            use(Snapshot.withoutReadObservation { someState })
         }
 
         assertEquals(1, recompostions)
@@ -340,7 +307,6 @@
         runTest(dispatcher) {
             val testClock = TestMonotonicFrameClock(this)
             withContext(testClock) {
-
                 val recomposer = Recomposer(coroutineContext)
                 var launched = false
                 val runner = launch {
@@ -354,15 +320,11 @@
                 var lastCompositionTwoState = -1
                 compositionOne.setContent {
                     lastCompositionOneState = state
-                    LaunchedEffect(Unit) {
-                        delay(1_000)
-                    }
+                    LaunchedEffect(Unit) { delay(1_000) }
                 }
                 compositionTwo.setContent {
                     lastCompositionTwoState = state
-                    LaunchedEffect(Unit) {
-                        delay(1_000)
-                    }
+                    LaunchedEffect(Unit) { delay(1_000) }
                 }
 
                 assertEquals(0, lastCompositionOneState, "initial composition")
@@ -379,9 +341,7 @@
 
                 assertTrue(launched, "Recomposer was never started")
 
-                Snapshot.withMutableSnapshot {
-                    state = 1
-                }
+                Snapshot.withMutableSnapshot { state = 1 }
 
                 recomposer.cancel()
 
@@ -407,9 +367,7 @@
 
         @Composable
         fun CountRecorder(count: Int) {
-            SideEffect {
-                countFromEffect.value = count
-            }
+            SideEffect { countFromEffect.value = count }
         }
 
         compose {
@@ -425,9 +383,7 @@
 
         // Register the apply observer after changing state to invalidate composition, but
         // before actually allowing the recomposition to happen.
-        Snapshot.registerApplyObserver { applied, _ ->
-            applications += applied
-        }
+        Snapshot.registerApplyObserver { applied, _ -> applications += applied }
         assertTrue(applications.isEmpty())
 
         assertEquals(1, advanceCount())
@@ -446,15 +402,13 @@
     fun validatePotentialDeadlock() = compositionTest {
         var state by mutableIntStateOf(0)
         compose {
-            repeat(1000) {
-                Text("This is some text: $state")
-            }
+            repeat(1000) { Text("This is some text: $state") }
             LaunchedEffect(Unit) {
                 newSingleThreadContext("other thread").use {
                     while (true) {
                         withContext(it) {
                             state++
-                            Snapshot.registerGlobalWriteObserver { }.dispose()
+                            Snapshot.registerGlobalWriteObserver {}.dispose()
                         }
                     }
                 }
@@ -499,9 +453,7 @@
 
                     LaunchedEffect(Unit) {
                         while (true) {
-                            withFrameNanos { nanos ->
-                                lastNanosSeen = nanos
-                            }
+                            withFrameNanos { nanos -> lastNanosSeen = nanos }
                         }
                     }
                 }
@@ -509,10 +461,7 @@
                 dispatcher.scheduler.runCurrent()
                 assertEquals(state, lastStateSeen, "assume composition would have happened")
                 dispatcher.scheduler.advanceTimeBy(1_000)
-                assertTrue(
-                    lastNanosSeen > 0,
-                    "expected first withFramesNanos call didn't occur"
-                )
+                assertTrue(lastNanosSeen > 0, "expected first withFramesNanos call didn't occur")
                 val nanosAfterInitialComposition = lastNanosSeen
 
                 // Force a recompose and test assumptions of the test
@@ -533,21 +482,13 @@
                 Snapshot.withMutableSnapshot { state++ }
                 dispatcher.scheduler.advanceTimeBy(1_000)
                 assertEquals(state, lastStateSeen, "expected composition didn't occur")
-                assertEquals(
-                    nanosAfterPause,
-                    lastNanosSeen,
-                    "unexpected call to withFrameNanos"
-                )
+                assertEquals(nanosAfterPause, lastNanosSeen, "unexpected call to withFrameNanos")
 
                 // Force another recompose
                 Snapshot.withMutableSnapshot { state++ }
                 dispatcher.scheduler.advanceTimeBy(1_000)
                 assertEquals(state, lastStateSeen, "expected composition didn't occur")
-                assertEquals(
-                    nanosAfterPause,
-                    lastNanosSeen,
-                    "unexpected call to withFrameNanos"
-                )
+                assertEquals(nanosAfterPause, lastNanosSeen, "unexpected call to withFrameNanos")
 
                 // Resume the frame clock
                 recomposer.resumeCompositionFrameClock()
@@ -589,31 +530,26 @@
     override val current: Unit
         get() = Unit
 
-    override fun down(node: Unit) {
-    }
+    override fun down(node: Unit) {}
 
-    override fun up() {
-    }
+    override fun up() {}
 
-    override fun insertTopDown(index: Int, instance: Unit) {
-    }
+    override fun insertTopDown(index: Int, instance: Unit) {}
 
-    override fun insertBottomUp(index: Int, instance: Unit) {
-    }
+    override fun insertBottomUp(index: Int, instance: Unit) {}
 
-    override fun remove(index: Int, count: Int) {
-    }
+    override fun remove(index: Int, count: Int) {}
 
-    override fun move(from: Int, to: Int, count: Int) {
-    }
+    override fun move(from: Int, to: Int, count: Int) {}
 
-    override fun clear() {
-    }
+    override fun clear() {}
 }
 
 class Counter {
     private var counts = mutableMapOf<String, Int>()
+
     fun inc(key: String) = counts.getOrPut(key, { 0 }).let { counts[key] = it + 1 }
+
     fun reset() {
         counts = mutableMapOf()
     }
@@ -628,24 +564,14 @@
     triggers[99]?.subscribe()
     Linear {
         for (id in 100..102) {
-            key(id) {
-                RecomposeTestComponentsB(
-                    counter,
-                    triggers,
-                    id
-                )
-            }
+            key(id) { RecomposeTestComponentsB(counter, triggers, id) }
         }
     }
 }
 
 @NonSkippableComposable
 @Composable
-private fun RecomposeTestComponentsB(
-    counter: Counter,
-    triggers: Map<Int, Trigger>,
-    id: Int = 0
-) {
+private fun RecomposeTestComponentsB(counter: Counter, triggers: Map<Int, Trigger>, id: Int = 0) {
     counter.inc("$id")
     triggers[id]?.subscribe()
     Text("$id")
diff --git a/compose/runtime/runtime/src/nonEmulatorCommonTest/kotlin/androidx/compose/runtime/RestartTests.kt b/compose/runtime/runtime/src/nonEmulatorCommonTest/kotlin/androidx/compose/runtime/RestartTests.kt
index 73583c2..0b003b5 100644
--- a/compose/runtime/runtime/src/nonEmulatorCommonTest/kotlin/androidx/compose/runtime/RestartTests.kt
+++ b/compose/runtime/runtime/src/nonEmulatorCommonTest/kotlin/androidx/compose/runtime/RestartTests.kt
@@ -28,10 +28,7 @@
 class RestartTests {
     @Test
     fun restart_PersonModel_lambda() = compositionTest {
-        val president = Person(
-            PRESIDENT_NAME_1,
-            PRESIDENT_AGE_1
-        )
+        val president = Person(PRESIDENT_NAME_1, PRESIDENT_AGE_1)
 
         compose {
             RestartGroup {
@@ -59,10 +56,7 @@
 
     @Test
     fun restart_PersonModel_lambda_parameters() = compositionTest {
-        val president = Person(
-            PRESIDENT_NAME_1,
-            PRESIDENT_AGE_1
-        )
+        val president = Person(PRESIDENT_NAME_1, PRESIDENT_AGE_1)
 
         compose {
             Repeat(5) {
@@ -90,19 +84,15 @@
 
     @Test
     fun restart_PersonModel_function() = compositionTest {
-        val president = Person(
-            PRESIDENT_NAME_1,
-            PRESIDENT_AGE_1
-        )
+        val president = Person(PRESIDENT_NAME_1, PRESIDENT_AGE_1)
 
-        @Composable fun PersonView() {
+        @Composable
+        fun PersonView() {
             Text(president.name)
             Text(president.age.toString())
         }
 
-        compose {
-            PersonView()
-        }
+        compose { PersonView() }
 
         fun validate() {
             validate {
@@ -123,21 +113,23 @@
     fun restart_State_delete() = compositionTest {
         val state = mutableStateOf(true)
 
-        @Composable fun ShowSomething() {
+        @Composable
+        fun ShowSomething() {
             Text("State = ${state.value}")
         }
 
-        @Composable fun View() {
+        @Composable
+        fun View() {
             if (state.value) {
-                // This is not correct code generation as this should be called in a call function, however, this
-                // tests the assumption that calling a function should produce an item (a key followed by a group).
+                // This is not correct code generation as this should be called in a call function,
+                // however, this
+                // tests the assumption that calling a function should produce an item (a key
+                // followed by a group).
                 ShowSomething()
             }
         }
 
-        compose {
-            View()
-        }
+        compose { View() }
 
         fun validate() {
             validate {
@@ -159,22 +151,16 @@
 
     @Test
     fun restart_PersonModel_function_parameters() = compositionTest {
-        val president = Person(
-            PRESIDENT_NAME_1,
-            PRESIDENT_AGE_1
-        )
+        val president = Person(PRESIDENT_NAME_1, PRESIDENT_AGE_1)
 
-        @Composable fun PersonView(index: Int) {
+        @Composable
+        fun PersonView(index: Int) {
             Text(index.toString())
             Text(president.name)
             Text(president.age.toString())
         }
 
-        compose {
-            Repeat(5) { index ->
-                PersonView(index)
-            }
-        }
+        compose { Repeat(5) { index -> PersonView(index) } }
 
         fun validate() {
             validate {
@@ -200,16 +186,12 @@
         useCountCalled = 0
         useCount2Called = 0
 
-        compose {
-            RestartAndSkipTest(count = count.value, data = data)
-        }
+        compose { RestartAndSkipTest(count = count.value, data = data) }
 
         assertEquals(1, useCountCalled)
         assertEquals(1, useCount2Called)
 
-        validate {
-            this.RestartAndSkipTest(count = count.value, data = data)
-        }
+        validate { this.RestartAndSkipTest(count = count.value, data = data) }
 
         count.value++
 
@@ -233,8 +215,7 @@
     content()
 }
 
-@Suppress("unused")
-inline fun MockViewValidator.RestartGroup(block: () -> Unit) = block()
+@Suppress("unused") inline fun MockViewValidator.RestartGroup(block: () -> Unit) = block()
 
 @Composable
 fun Repeat(count: Int, block: @Composable (index: Int) -> Unit) {
diff --git a/compose/runtime/runtime/src/nonEmulatorCommonTest/kotlin/androidx/compose/runtime/SlotTableTests.kt b/compose/runtime/runtime/src/nonEmulatorCommonTest/kotlin/androidx/compose/runtime/SlotTableTests.kt
index 0bb052d..4ac2baa 100644
--- a/compose/runtime/runtime/src/nonEmulatorCommonTest/kotlin/androidx/compose/runtime/SlotTableTests.kt
+++ b/compose/runtime/runtime/src/nonEmulatorCommonTest/kotlin/androidx/compose/runtime/SlotTableTests.kt
@@ -125,14 +125,13 @@
     @Test
     fun testInsertInTheMiddle() {
         val slots = testSlotsNumbered()
-        val seekAmount = slots.read { reader ->
-            reader.startGroup()
-            val start = reader.currentGroup
-            repeat(50) {
-                reader.skipGroup()
+        val seekAmount =
+            slots.read { reader ->
+                reader.startGroup()
+                val start = reader.currentGroup
+                repeat(50) { reader.skipGroup() }
+                reader.currentGroup - start
             }
-            reader.currentGroup - start
-        }
         slots.write { writer ->
             writer.startGroup()
             writer.advanceBy(seekAmount)
@@ -253,17 +252,18 @@
     @Test
     fun testAllocateAnchors() {
         val slots = testSlotsNumbered()
-        val anchors = slots.read { reader ->
-            val anchors = mutableListOf<Anchor>()
-            reader.startGroup()
-            repeat(7) {
-                repeat(10) { reader.skipGroup() }
-                anchors.add(reader.anchor())
+        val anchors =
+            slots.read { reader ->
+                val anchors = mutableListOf<Anchor>()
+                reader.startGroup()
+                repeat(7) {
+                    repeat(10) { reader.skipGroup() }
+                    anchors.add(reader.anchor())
+                }
+                reader.skipToGroupEnd()
+                reader.endGroup()
+                anchors
             }
-            reader.skipToGroupEnd()
-            reader.endGroup()
-            anchors
-        }
         slots.read { reader ->
             anchors.forEachIndexed { index, anchor ->
                 val key = reader.groupKey(anchor.toIndexFor(slots))
@@ -275,17 +275,18 @@
     @Test
     fun testAnchorsTrackInserts() {
         val slots = testSlotsNumbered()
-        val anchors = slots.read { reader ->
-            val anchors = mutableListOf<Anchor>()
-            reader.startGroup()
-            repeat(7) {
-                repeat(10) { reader.skipGroup() }
-                anchors.add(reader.anchor())
+        val anchors =
+            slots.read { reader ->
+                val anchors = mutableListOf<Anchor>()
+                reader.startGroup()
+                repeat(7) {
+                    repeat(10) { reader.skipGroup() }
+                    anchors.add(reader.anchor())
+                }
+                reader.skipToGroupEnd()
+                reader.endGroup()
+                anchors
             }
-            reader.skipToGroupEnd()
-            reader.endGroup()
-            anchors
-        }
         slots.write { writer ->
             writer.startGroup()
             repeat(41) { writer.skipGroup() }
@@ -356,9 +357,7 @@
         slots.read { reader ->
             for (index in 1..7) {
                 val anchor = anchors[index - 1]
-                val expected = (index * 10).let {
-                    if (it in 40 until 60) 0 else it
-                }
+                val expected = (index * 10).let { if (it in 40 until 60) 0 else it }
                 assertEquals(expected, reader.groupKey(anchor))
             }
         }
@@ -483,9 +482,7 @@
         val slots = testSlotsNumbered()
         val anchors = slots.read { reader -> (0 until 10).map { reader.anchor(it * 5) } }
         slots.read { reader ->
-            anchors.forEachIndexed { index, anchor ->
-                assertSame(anchor, reader.anchor(index * 5))
-            }
+            anchors.forEachIndexed { index, anchor -> assertSame(anchor, reader.anchor(index * 5)) }
         }
     }
 
@@ -496,9 +493,7 @@
         val slotTable = SlotTable()
         slotTable.verifyWellFormed()
 
-        slotTable.read { reader ->
-            assertEquals(0, reader.groupKey)
-        }
+        slotTable.read { reader -> assertEquals(0, reader.groupKey) }
     }
 
     @Test
@@ -674,9 +669,7 @@
             writer.startGroup()
             writer.startGroup()
 
-            repeat(3) {
-                assertEquals(3, writer.skipGroup())
-            }
+            repeat(3) { assertEquals(3, writer.skipGroup()) }
 
             writer.startGroup()
             writer.beginInsert()
@@ -690,9 +683,7 @@
             repeat(3) { writer.skipGroup() }
             assertEquals(5, writer.endGroup())
 
-            repeat(6) {
-                assertEquals(3, writer.skipGroup())
-            }
+            repeat(6) { assertEquals(3, writer.skipGroup()) }
 
             assertEquals(32, writer.endGroup())
             writer.endGroup()
@@ -727,9 +718,7 @@
             writer.startGroup(treeRoot)
             writer.startGroup(0)
 
-            repeat(3) {
-                assertEquals(3, writer.skipGroup())
-            }
+            repeat(3) { assertEquals(3, writer.skipGroup()) }
 
             writer.startGroup(0)
 
@@ -737,9 +726,7 @@
             repeat(1) { writer.skipGroup() }
             assertEquals(1, writer.endGroup())
 
-            repeat(6) {
-                assertEquals(3, writer.skipGroup())
-            }
+            repeat(6) { assertEquals(3, writer.skipGroup()) }
 
             assertEquals(28, writer.endGroup())
 
@@ -1217,10 +1204,7 @@
             writer.startGroup()
             writer.startGroup()
             writer.beginInsert()
-            writer.moveFrom(
-                sourceTable,
-                anchors.first().toIndexFor(sourceTable)
-            )
+            writer.moveFrom(sourceTable, anchors.first().toIndexFor(sourceTable))
             writer.endInsert()
             writer.skipToGroupEnd()
             writer.endGroup()
@@ -1228,9 +1212,7 @@
             writer.endGroup()
         }
         destinationTable.verifyWellFormed()
-        destinationTable.read { reader ->
-            assertEquals(10, reader.groupKey(anchors.first()))
-        }
+        destinationTable.read { reader -> assertEquals(10, reader.groupKey(anchors.first())) }
         sourceTable.verifyWellFormed()
     }
 
@@ -1264,10 +1246,7 @@
             writer.startGroup()
             writer.startGroup()
             writer.beginInsert()
-            writer.moveFrom(
-                sourceTable,
-                anchors.first().toIndexFor(sourceTable)
-            )
+            writer.moveFrom(sourceTable, anchors.first().toIndexFor(sourceTable))
             writer.endInsert()
             writer.skipToGroupEnd()
             writer.endGroup()
@@ -1316,10 +1295,7 @@
             writer.startGroup()
             writer.startGroup()
             writer.beginInsert()
-            writer.moveFrom(
-                sourceTable,
-                anchors.first().toIndexFor(sourceTable)
-            )
+            writer.moveFrom(sourceTable, anchors.first().toIndexFor(sourceTable))
             writer.endInsert()
             writer.skipToGroupEnd()
             writer.endGroup()
@@ -1327,9 +1303,7 @@
             writer.endGroup()
         }
         destinationTable.verifyWellFormed()
-        destinationTable.read { reader ->
-            assertEquals(10, reader.groupKey(anchors.first()))
-        }
+        destinationTable.read { reader -> assertEquals(10, reader.groupKey(anchors.first())) }
         sourceTable.verifyWellFormed()
     }
 
@@ -1351,12 +1325,13 @@
         }
 
         val slotsToMove = sourceAnchors.shuffled(random)
-        val slotKeys = sourceTable.read { reader ->
-            slotsToMove.map { anchor ->
-                val location = anchor.toIndexFor(sourceTable)
-                reader.groupKey(location)
+        val slotKeys =
+            sourceTable.read { reader ->
+                slotsToMove.map { anchor ->
+                    val location = anchor.toIndexFor(sourceTable)
+                    reader.groupKey(location)
+                }
             }
-        }
 
         val movedAnchors = mutableSetOf<Anchor>()
         slotsToMove.forEach { anchor ->
@@ -1367,10 +1342,7 @@
 
                     writer.skipToGroupEnd()
                     writer.beginInsert()
-                    movedAnchors += writer.moveFrom(
-                        sourceTable,
-                        anchor.toIndexFor(sourceTable)
-                    )
+                    movedAnchors += writer.moveFrom(sourceTable, anchor.toIndexFor(sourceTable))
                     sourceTable.verifyWellFormed()
                     writer.verifyDataAnchors()
                     writer.endInsert()
@@ -1386,12 +1358,13 @@
         }
 
         // Verify the anchors still point to the correct groups
-        val movedKeys = destinationTable.read { reader ->
-            slotsToMove.map { anchor ->
-                val location = anchor.toIndexFor(destinationTable)
-                reader.groupKey(location)
+        val movedKeys =
+            destinationTable.read { reader ->
+                slotsToMove.map { anchor ->
+                    val location = anchor.toIndexFor(destinationTable)
+                    reader.groupKey(location)
+                }
             }
-        }
         assertEquals(slotKeys.size, movedKeys.size, "slot keys changed")
         for (index in slotKeys.indices) {
             val sourceKey = slotKeys[index]
@@ -1411,28 +1384,28 @@
                 writer.group(10) {
                     anchors.add(writer.anchor(writer.parent))
                     writer.group(100) {
-                        writer.group(1000) { }
-                        writer.group(1001) { }
-                        writer.group(1002) { }
-                        writer.group(10003) { }
+                        writer.group(1000) {}
+                        writer.group(1001) {}
+                        writer.group(1002) {}
+                        writer.group(10003) {}
                     }
                 }
                 writer.group(20) {
                     anchors.add(writer.anchor(writer.parent))
                     writer.group(200) {
-                        writer.group(2000) { }
-                        writer.group(2001) { }
-                        writer.group(2002) { }
-                        writer.group(20003) { }
+                        writer.group(2000) {}
+                        writer.group(2001) {}
+                        writer.group(2002) {}
+                        writer.group(20003) {}
                     }
                 }
                 writer.group(30) {
                     anchors.add(writer.anchor(writer.parent))
                     writer.group(300) {
-                        writer.group(3000) { }
-                        writer.group(3001) { }
-                        writer.group(3002) { }
-                        writer.group(30003) { }
+                        writer.group(3000) {}
+                        writer.group(3001) {}
+                        writer.group(3002) {}
+                        writer.group(30003) {}
                     }
                 }
             }
@@ -1606,8 +1579,7 @@
                     reader.skipGroup()
                 } else {
                     reader.startGroup()
-                    while (!reader.isGroupEnd)
-                        countNodes()
+                    while (!reader.isGroupEnd) countNodes()
                     reader.endGroup()
                 }
             }
@@ -1629,8 +1601,7 @@
                     writer.skipGroup()
                 } else {
                     writer.startGroup()
-                    while (!writer.isGroupEnd)
-                        countNodes()
+                    while (!writer.isGroupEnd) countNodes()
                     writer.endGroup()
                 }
             }
@@ -2024,9 +1995,9 @@
             reader.group(treeRoot) {
                 reader.group(100) {
                     reader.group(10) {
-                        reader.expectNode(5, 500) { }
-                        reader.expectNode(6, 600) { }
-                        reader.expectNode(7, 700) { }
+                        reader.expectNode(5, 500) {}
+                        reader.expectNode(6, 600) {}
+                        reader.expectNode(7, 700) {}
                     }
                 }
             }
@@ -2073,9 +2044,9 @@
             reader.group(treeRoot) {
                 reader.group(100) {
                     reader.group(10) {
-                        reader.expectNode(7, 700) { }
-                        reader.expectNode(5, 500) { }
-                        reader.expectNode(6, 600) { }
+                        reader.expectNode(7, 700) {}
+                        reader.expectNode(5, 500) {}
+                        reader.expectNode(6, 600) {}
                     }
                 }
             }
@@ -2122,9 +2093,9 @@
             reader.group(treeRoot) {
                 reader.group(100) {
                     reader.group(10) {
-                        reader.expectNode(5, 500) { }
-                        reader.expectNode(7, 700) { }
-                        reader.expectNode(6, 600) { }
+                        reader.expectNode(5, 500) {}
+                        reader.expectNode(7, 700) {}
+                        reader.expectNode(6, 600) {}
                     }
                 }
             }
@@ -2277,11 +2248,7 @@
         val innerGroupKeyBase = 1000
         val dataCount = 5
 
-        data class SlotInfo(
-            val anchor: Anchor,
-            val index: Int,
-            val value: Int
-        )
+        data class SlotInfo(val anchor: Anchor, val index: Int, val value: Int)
 
         slots.write { writer ->
             writer.insert {
@@ -2290,9 +2257,7 @@
                         writer.group(outerKey + outerGroupKeyBase) {
                             repeat(innerGroups) { innerKey ->
                                 writer.group(innerKey + innerGroupKeyBase) {
-                                    repeat(dataCount) {
-                                        writer.update(it)
-                                    }
+                                    repeat(dataCount) { writer.update(it) }
                                 }
                             }
                         }
@@ -2348,11 +2313,7 @@
             writer.insert {
                 writer.group(treeRoot) {
                     repeat(groups) { key ->
-                        writer.group(key) {
-                            repeat(items) { item ->
-                                writer.update(item)
-                            }
-                        }
+                        writer.group(key) { repeat(items) { item -> writer.update(item) } }
                     }
                 }
             }
@@ -2380,11 +2341,7 @@
             writer.insert {
                 writer.group(treeRoot) {
                     repeat(groups) { key ->
-                        writer.group(key) {
-                            repeat(items) { item ->
-                                writer.update(item)
-                            }
-                        }
+                        writer.group(key) { repeat(items) { item -> writer.update(item) } }
                     }
                 }
             }
@@ -2421,20 +2378,19 @@
     fun testWriterGroupSlots() {
         val slots = testItems()
         val allSlots = slots.write { writer -> writer.groupSlots() }.toList()
-        val sumSlots = slots.write { writer ->
-            val list = mutableListOf<Any?>()
-            writer.startGroup()
-            while (!writer.isGroupEnd) {
-                list.addAll(writer.groupSlots().toList())
-                writer.skipGroup()
+        val sumSlots =
+            slots.write { writer ->
+                val list = mutableListOf<Any?>()
+                writer.startGroup()
+                while (!writer.isGroupEnd) {
+                    list.addAll(writer.groupSlots().toList())
+                    writer.skipGroup()
+                }
+                writer.endGroup()
+                list
             }
-            writer.endGroup()
-            list
-        }
         assertEquals(allSlots.size, sumSlots.size)
-        allSlots.forEachIndexed { index, item ->
-            assertEquals(item, sumSlots[index])
-        }
+        allSlots.forEachIndexed { index, item -> assertEquals(item, sumSlots[index]) }
     }
 
     @Test
@@ -2495,8 +2451,7 @@
                 repeat(10) { innerKey ->
                     writer.startGroup(innerKey + 1000)
                     repeat(10) { anchoredKey ->
-                        if (anchoredKey % 3 == 0)
-                            nestedAnchors.add(writer.anchor())
+                        if (anchoredKey % 3 == 0) nestedAnchors.add(writer.anchor())
                         writer.startGroup(anchoredKey + 2000)
                         writer.update("anchored value")
                         writer.endGroup()
@@ -2549,18 +2504,14 @@
                 assertEquals(400, reader.next())
             }
         }
-        slots.write { writer ->
-            writer.removeGroup()
-        }
+        slots.write { writer -> writer.removeGroup() }
         slots.read { reader ->
             reader.expectGroup(200, 200) {
                 assertEquals(300, reader.next())
                 assertEquals(400, reader.next())
             }
         }
-        slots.write { writer ->
-            writer.removeGroup()
-        }
+        slots.write { writer -> writer.removeGroup() }
         assertTrue(slots.isEmpty)
     }
 
@@ -2573,38 +2524,40 @@
         val bottomGroupCount = 5
         val bottomKeyBase = 1000
         val replaceMod = 2
-        val slots = SlotTable().also {
-            it.write { writer ->
-                writer.beginInsert()
-                writer.startGroup(treeRoot)
-                repeat(outerGroupCount) { outerKey ->
-                    writer.startGroup(outerKeyBase + outerKey)
-                    repeat(innerGroupCount) { innerKey ->
-                        writer.startGroup(innerKeyBase + innerKey)
-                        repeat(bottomGroupCount) { bottomKey ->
-                            writer.startGroup(bottomKeyBase + bottomKey, bottomKey)
-                            writer.update("Some data")
+        val slots =
+            SlotTable().also {
+                it.write { writer ->
+                    writer.beginInsert()
+                    writer.startGroup(treeRoot)
+                    repeat(outerGroupCount) { outerKey ->
+                        writer.startGroup(outerKeyBase + outerKey)
+                        repeat(innerGroupCount) { innerKey ->
+                            writer.startGroup(innerKeyBase + innerKey)
+                            repeat(bottomGroupCount) { bottomKey ->
+                                writer.startGroup(bottomKeyBase + bottomKey, bottomKey)
+                                writer.update("Some data")
+                                writer.endGroup()
+                            }
                             writer.endGroup()
                         }
                         writer.endGroup()
                     }
                     writer.endGroup()
+                    writer.endInsert()
                 }
-                writer.endGroup()
-                writer.endInsert()
             }
-        }
         slots.verifyWellFormed()
-        val sourceTable = SlotTable().also {
-            it.write { writer ->
-                writer.beginInsert()
-                repeat(outerGroupCount * innerGroupCount) {
-                    writer.startGroup(0)
-                    writer.endGroup()
+        val sourceTable =
+            SlotTable().also {
+                it.write { writer ->
+                    writer.beginInsert()
+                    repeat(outerGroupCount * innerGroupCount) {
+                        writer.startGroup(0)
+                        writer.endGroup()
+                    }
+                    writer.endInsert()
                 }
-                writer.endInsert()
             }
-        }
         sourceTable.verifyWellFormed()
         slots.write { writer ->
             writer.startGroup()
@@ -2631,53 +2584,49 @@
     @Test
     fun testInsertOfZeroGroups() {
         val sourceAnchors = mutableListOf<Anchor>()
-        val sourceTable = SlotTable().also {
-            it.write { writer ->
-                writer.beginInsert()
-                sourceAnchors.add(writer.anchor())
-                writer.startGroup(0)
-                writer.update("0: Some value")
-                writer.endGroup()
-                sourceAnchors.add(writer.anchor())
-                writer.startGroup(0)
-                repeat(5) {
-                    writer.startGroup(1)
+        val sourceTable =
+            SlotTable().also {
+                it.write { writer ->
+                    writer.beginInsert()
+                    sourceAnchors.add(writer.anchor())
+                    writer.startGroup(0)
+                    writer.update("0: Some value")
                     writer.endGroup()
+                    sourceAnchors.add(writer.anchor())
+                    writer.startGroup(0)
+                    repeat(5) {
+                        writer.startGroup(1)
+                        writer.endGroup()
+                    }
+                    writer.endGroup()
+                    sourceAnchors.add(writer.anchor())
+                    writer.startGroup(0)
+                    writer.endGroup()
+                    writer.endInsert()
                 }
-                writer.endGroup()
-                sourceAnchors.add(writer.anchor())
-                writer.startGroup(0)
-                writer.endGroup()
-                writer.endInsert()
             }
-        }
 
         var container = Anchor(0)
         val destinationAnchors = mutableListOf<Anchor>()
-        val slots = SlotTable().also {
-            it.write { writer ->
-                writer.insert {
-                    writer.group(treeRoot) {
-                        writer.group(10) {
-                            writer.update("10: Some data")
-                        }
-                        container = writer.anchor()
-                        writer.group(100) {
-                            destinationAnchors.add(writer.anchor())
-                            writer.group(500) { }
-                            destinationAnchors.add(writer.anchor())
-                            writer.group(1000) {
-                                writer.update("1000: Some data")
-                            }
-                            destinationAnchors.add(writer.anchor())
-                            writer.group(2000) {
-                                writer.update("2000: Some data")
+        val slots =
+            SlotTable().also {
+                it.write { writer ->
+                    writer.insert {
+                        writer.group(treeRoot) {
+                            writer.group(10) { writer.update("10: Some data") }
+                            container = writer.anchor()
+                            writer.group(100) {
+                                destinationAnchors.add(writer.anchor())
+                                writer.group(500) {}
+                                destinationAnchors.add(writer.anchor())
+                                writer.group(1000) { writer.update("1000: Some data") }
+                                destinationAnchors.add(writer.anchor())
+                                writer.group(2000) { writer.update("2000: Some data") }
                             }
                         }
                     }
                 }
             }
-        }
 
         slots.write { writer ->
             var started = false
@@ -2691,10 +2640,7 @@
                     started = true
                 }
                 writer.beginInsert()
-                writer.moveFrom(
-                    sourceTable,
-                    sourceAnchor.toIndexFor(sourceTable)
-                )
+                writer.moveFrom(sourceTable, sourceAnchor.toIndexFor(sourceTable))
                 writer.endInsert()
             }
             writer.skipToGroupEnd()
@@ -2705,20 +2651,14 @@
 
         slots.read { reader ->
             reader.expectGroup(treeRoot) {
-                reader.expectGroup(10) {
-                    reader.expectData("10: Some data")
-                }
+                reader.expectGroup(10) { reader.expectData("10: Some data") }
                 reader.expectGroup(100) {
                     reader.expectGroup(0)
                     reader.expectGroup(500)
                     reader.expectGroup(0)
-                    reader.expectGroup(1000) {
-                        reader.expectData("1000: Some data")
-                    }
+                    reader.expectGroup(1000) { reader.expectData("1000: Some data") }
                     reader.expectGroup(0)
-                    reader.expectGroup(2000) {
-                        reader.expectData("2000: Some data")
-                    }
+                    reader.expectGroup(2000) { reader.expectData("2000: Some data") }
                 }
             }
         }
@@ -2726,34 +2666,35 @@
 
     @Test
     fun testMoveOfZeroGroup() {
-        val slots = SlotTable().also {
-            it.write { writer ->
-                writer.insert {
-                    writer.group(treeRoot) {
-                        writer.group(10) {
-                            writer.group(100) {
-                                writer.update("100: 1")
-                                writer.update("100: 2")
-                            }
-                            writer.group(200) {
-                                writer.update("200: 1")
-                                writer.update("200: 2")
-                            }
-                            writer.group(300) {
-                                writer.update("300: 1")
-                                writer.update("300: 2")
-                            }
-                            // Empty group
-                            writer.group(0) { }
-                            writer.group(400) {
-                                writer.update("400: 1")
-                                writer.update("400: 2")
+        val slots =
+            SlotTable().also {
+                it.write { writer ->
+                    writer.insert {
+                        writer.group(treeRoot) {
+                            writer.group(10) {
+                                writer.group(100) {
+                                    writer.update("100: 1")
+                                    writer.update("100: 2")
+                                }
+                                writer.group(200) {
+                                    writer.update("200: 1")
+                                    writer.update("200: 2")
+                                }
+                                writer.group(300) {
+                                    writer.update("300: 1")
+                                    writer.update("300: 2")
+                                }
+                                // Empty group
+                                writer.group(0) {}
+                                writer.group(400) {
+                                    writer.update("400: 1")
+                                    writer.update("400: 2")
+                                }
                             }
                         }
                     }
                 }
             }
-        }
         slots.verifyWellFormed()
         slots.read { reader ->
             reader.expectGroup(treeRoot) {
@@ -2826,24 +2767,25 @@
 
     @Test
     fun testReaderGet() {
-        val slots = SlotTable().also {
-            it.write { writer ->
-                writer.insert {
-                    writer.group(treeRoot) {
-                        writer.group(10) {
-                            writer.update("10: 0")
-                            writer.update("10: 1")
-                            writer.update("10: 2")
-                        }
-                        writer.group(20) {
-                            writer.update("20: 0")
-                            writer.update("20: 1")
-                            writer.update("20: 2")
+        val slots =
+            SlotTable().also {
+                it.write { writer ->
+                    writer.insert {
+                        writer.group(treeRoot) {
+                            writer.group(10) {
+                                writer.update("10: 0")
+                                writer.update("10: 1")
+                                writer.update("10: 2")
+                            }
+                            writer.group(20) {
+                                writer.update("20: 0")
+                                writer.update("20: 1")
+                                writer.update("20: 2")
+                            }
                         }
                     }
                 }
             }
-        }
         slots.verifyWellFormed()
         slots.read { reader ->
             reader.startGroup()
@@ -2863,24 +2805,25 @@
 
     @Test
     fun testReaderGroupGet() {
-        val slots = SlotTable().also {
-            it.write { writer ->
-                writer.insert {
-                    writer.group(treeRoot) {
-                        writer.group(10) {
-                            writer.update("10: 0")
-                            writer.update("10: 1")
-                            writer.update("10: 2")
-                        }
-                        writer.group(20) {
-                            writer.update("20: 0")
-                            writer.update("20: 1")
-                            writer.update("20: 2")
+        val slots =
+            SlotTable().also {
+                it.write { writer ->
+                    writer.insert {
+                        writer.group(treeRoot) {
+                            writer.group(10) {
+                                writer.update("10: 0")
+                                writer.update("10: 1")
+                                writer.update("10: 2")
+                            }
+                            writer.group(20) {
+                                writer.update("20: 0")
+                                writer.update("20: 1")
+                                writer.update("20: 2")
+                            }
                         }
                     }
                 }
             }
-        }
         slots.verifyWellFormed()
         slots.read { reader ->
             reader.startGroup()
@@ -2899,9 +2842,7 @@
     @Test
     fun testReaderSize() {
         val slots = testItems()
-        slots.read { reader ->
-            assertEquals(slots.groupsSize, reader.size)
-        }
+        slots.read { reader -> assertEquals(slots.groupsSize, reader.size) }
     }
 
     @Test
@@ -2910,11 +2851,7 @@
         slots.write { writer ->
             assertEquals(slots.groupsSize, writer.size)
             writer.startGroup()
-            writer.insert {
-                writer.group(1000) {
-                    writer.update("1000: 1")
-                }
-            }
+            writer.insert { writer.group(1000) { writer.update("1000: 1") } }
             assertEquals(slots.groupsSize + 1, writer.size)
             writer.skipToGroupEnd()
             writer.endGroup()
@@ -2923,19 +2860,16 @@
 
     @Test
     fun testGroupSlotCount() {
-        val slots = SlotTable().also {
-            it.write { writer ->
-                writer.insert {
-                    writer.group(treeRoot) {
-                        writer.group(10) {
-                            repeat(5) { item ->
-                                writer.update("Data $item")
-                            }
+        val slots =
+            SlotTable().also {
+                it.write { writer ->
+                    writer.insert {
+                        writer.group(treeRoot) {
+                            writer.group(10) { repeat(5) { item -> writer.update("Data $item") } }
                         }
                     }
                 }
             }
-        }
         slots.read { reader ->
             reader.expectGroup(treeRoot) {
                 assertEquals(reader.groupSlotCount, 5)
@@ -2948,36 +2882,27 @@
     fun testRemoveDataBoundaryCondition() {
         // Remove when the slot table contains amount that would make the slotGapSize 0
         // Test insert exactly 64 data slots.
-        val slots = SlotTable().also {
-            it.write { writer ->
-                writer.insert {
-                    writer.group(treeRoot) {
-                        repeat(4) { count ->
-                            writer.group(count * 10 + 100) {
-                                repeat(8) { value ->
-                                    writer.update(value)
+        val slots =
+            SlotTable().also {
+                it.write { writer ->
+                    writer.insert {
+                        writer.group(treeRoot) {
+                            repeat(4) { count ->
+                                writer.group(count * 10 + 100) {
+                                    repeat(8) { value -> writer.update(value) }
                                 }
                             }
-                        }
-                        writer.group(1000) {
-                            repeat(16) { value ->
-                                writer.update(value)
-                            }
-                        }
-                        repeat(2) { count ->
-                            writer.group(count * 10 + 200) {
-                                repeat(8) { value ->
-                                    writer.update(value)
+                            writer.group(1000) { repeat(16) { value -> writer.update(value) } }
+                            repeat(2) { count ->
+                                writer.group(count * 10 + 200) {
+                                    repeat(8) { value -> writer.update(value) }
                                 }
                             }
-                        }
-                        repeat(10) { count ->
-                            writer.group(300 + count) { }
+                            repeat(10) { count -> writer.group(300 + count) {} }
                         }
                     }
                 }
             }
-        }
         slots.verifyWellFormed()
 
         slots.write { writer ->
@@ -2995,42 +2920,38 @@
     @Test
     fun testInsertDataBoundaryCondition() {
         // Test insert exactly 64 data slots.
-        val slots = SlotTable().also {
-            it.write { writer ->
-                writer.insert {
-                    writer.group(treeRoot) {
-                        writer.group(10) {
-                            writer.group(100) {
-                                repeat(10) { item -> writer.update(item) }
-                            }
-                            writer.group(200) {
-                                repeat(10) { item -> writer.update(item) }
+        val slots =
+            SlotTable().also {
+                it.write { writer ->
+                    writer.insert {
+                        writer.group(treeRoot) {
+                            writer.group(10) {
+                                writer.group(100) { repeat(10) { item -> writer.update(item) } }
+                                writer.group(200) { repeat(10) { item -> writer.update(item) } }
                             }
                         }
                     }
                 }
             }
-        }
         slots.verifyWellFormed()
 
-        val sourceTable = SlotTable().also {
-            it.write { writer ->
-                writer.insert {
-                    writer.group(150) {
-                        repeat(64) { item -> writer.update("Inserted item $item") }
+        val sourceTable =
+            SlotTable().also {
+                it.write { writer ->
+                    writer.insert {
+                        writer.group(150) {
+                            repeat(64) { item -> writer.update("Inserted item $item") }
+                        }
                     }
                 }
             }
-        }
         sourceTable.verifyWellFormed()
 
         slots.write { writer ->
             writer.group {
                 writer.group {
                     writer.skipGroup()
-                    writer.insert {
-                        writer.moveFrom(sourceTable, 0)
-                    }
+                    writer.insert { writer.moveFrom(sourceTable, 0) }
                     writer.skipToGroupEnd()
                 }
             }
@@ -3040,15 +2961,11 @@
         slots.read { reader ->
             reader.expectGroup(treeRoot) {
                 reader.expectGroup(10) {
-                    reader.expectGroup(100) {
-                        repeat(10) { item -> reader.expectData(item) }
-                    }
+                    reader.expectGroup(100) { repeat(10) { item -> reader.expectData(item) } }
                     reader.expectGroup(150) {
                         repeat(64) { item -> reader.expectData("Inserted item $item") }
                     }
-                    reader.expectGroup(200) {
-                        repeat(10) { item -> reader.expectData(item) }
-                    }
+                    reader.expectGroup(200) { repeat(10) { item -> reader.expectData(item) } }
                 }
             }
         }
@@ -3057,47 +2974,43 @@
     @Test
     fun testGroupsBoundaryCondition() {
         // Test inserting exactly 32 groups with 2 data items each
-        val slots = SlotTable().also {
-            it.write { writer ->
-                writer.insert {
-                    writer.group(treeRoot) {
-                        writer.group(10) {
-                            writer.group(100) {
-                                repeat(10) { item -> writer.update(item) }
-                            }
-                            writer.group(200) {
-                                repeat(10) { item -> writer.update(item) }
+        val slots =
+            SlotTable().also {
+                it.write { writer ->
+                    writer.insert {
+                        writer.group(treeRoot) {
+                            writer.group(10) {
+                                writer.group(100) { repeat(10) { item -> writer.update(item) } }
+                                writer.group(200) { repeat(10) { item -> writer.update(item) } }
                             }
                         }
                     }
                 }
             }
-        }
         slots.verifyWellFormed()
 
-        val sourceTable = SlotTable().also {
-            it.write { writer ->
-                writer.insert {
-                    writer.group(150) {
-                        repeat(2) { item -> writer.update("Inserted item $item") }
-                        repeat(31) { key ->
-                            writer.group(150 + key) {
-                                repeat(2) { item -> writer.update("Inserted item $item") }
+        val sourceTable =
+            SlotTable().also {
+                it.write { writer ->
+                    writer.insert {
+                        writer.group(150) {
+                            repeat(2) { item -> writer.update("Inserted item $item") }
+                            repeat(31) { key ->
+                                writer.group(150 + key) {
+                                    repeat(2) { item -> writer.update("Inserted item $item") }
+                                }
                             }
                         }
                     }
                 }
             }
-        }
         sourceTable.verifyWellFormed()
 
         slots.write { writer ->
             writer.group {
                 writer.group {
                     writer.skipGroup()
-                    writer.insert {
-                        writer.moveFrom(sourceTable, 0)
-                    }
+                    writer.insert { writer.moveFrom(sourceTable, 0) }
                     writer.skipToGroupEnd()
                 }
             }
@@ -3107,9 +3020,7 @@
         slots.read { reader ->
             reader.expectGroup(treeRoot) {
                 reader.expectGroup(10) {
-                    reader.expectGroup(100) {
-                        repeat(10) { item -> reader.expectData(item) }
-                    }
+                    reader.expectGroup(100) { repeat(10) { item -> reader.expectData(item) } }
                     reader.expectGroup(150) {
                         repeat(2) { item -> reader.expectData("Inserted item $item") }
                         repeat(31) { key ->
@@ -3118,9 +3029,7 @@
                             }
                         }
                     }
-                    reader.expectGroup(200) {
-                        repeat(10) { item -> reader.expectData(item) }
-                    }
+                    reader.expectGroup(200) { repeat(10) { item -> reader.expectData(item) } }
                 }
             }
         }
@@ -3135,9 +3044,7 @@
                     writer.group(treeRoot) {
                         repeat(7) { outer ->
                             writer.group(100 + outer) {
-                                repeat(8) { inner ->
-                                    writer.group(200 + inner) { }
-                                }
+                                repeat(8) { inner -> writer.group(200 + inner) {} }
                             }
                         }
                     }
@@ -3149,9 +3056,7 @@
             it.write { writer ->
                 writer.group {
                     repeat(3) { writer.skipGroup() }
-                    writer.insert {
-                        writer.group(300) { }
-                    }
+                    writer.insert { writer.group(300) {} }
                     writer.verifyParentAnchors()
                     writer.skipToGroupEnd()
                 }
@@ -3161,17 +3066,18 @@
 
     @Test
     fun canRepositionReaderPastEndOfTable() {
-        val slots = SlotTable().also {
-            it.write { writer ->
-                // Create exactly 256 groups
-                repeat(256) {
-                    writer.insert {
-                        writer.startGroup(0)
-                        writer.endGroup()
+        val slots =
+            SlotTable().also {
+                it.write { writer ->
+                    // Create exactly 256 groups
+                    repeat(256) {
+                        writer.insert {
+                            writer.startGroup(0)
+                            writer.endGroup()
+                        }
                     }
                 }
             }
-        }
 
         slots.read { reader ->
             reader.reposition(reader.size)
@@ -3182,78 +3088,77 @@
     @Test
     fun canRemoveFromFullTable() {
         // Create a table that is exactly 64 entries
-        val slots = SlotTable().also {
-            it.write { writer ->
-                writer.insert {
-                    repeat(7) { outer ->
-                        writer.group(10 + outer) {
-                            repeat(8) { inner ->
-                                writer.group(inner) { }
+        val slots =
+            SlotTable().also {
+                it.write { writer ->
+                    writer.insert {
+                        repeat(7) { outer ->
+                            writer.group(10 + outer) {
+                                repeat(8) { inner -> writer.group(inner) {} }
                             }
                         }
+                        writer.group(30) {}
                     }
-                    writer.group(30) { }
                 }
             }
-        }
         slots.verifyWellFormed()
 
         // Remove the first group
-        slots.write { writer ->
-            writer.removeGroup()
-        }
+        slots.write { writer -> writer.removeGroup() }
         slots.verifyWellFormed()
     }
 
     @Test
     fun canInsertAuxData() {
-        val slots = SlotTable().also {
-            it.write { writer ->
-                writer.insert {
-                    // Insert a normal aux data.
-                    writer.startData(10, 10, "10")
-                    writer.endGroup()
+        val slots =
+            SlotTable().also {
+                it.write { writer ->
+                    writer.insert {
+                        // Insert a normal aux data.
+                        writer.startData(10, 10, "10")
+                        writer.endGroup()
 
-                    // Insert using insertAux
-                    writer.startGroup(20)
-                    writer.insertAux("20")
-                    writer.endGroup()
+                        // Insert using insertAux
+                        writer.startGroup(20)
+                        writer.insertAux("20")
+                        writer.endGroup()
 
-                    // Insert using insertAux after a slot value was added.
-                    writer.startGroup(30)
-                    writer.update(300)
-                    writer.insertAux("30")
-                    writer.endGroup()
+                        // Insert using insertAux after a slot value was added.
+                        writer.startGroup(30)
+                        writer.update(300)
+                        writer.insertAux("30")
+                        writer.endGroup()
 
-                    // Insert using insertAux after a group with an object key
-                    writer.startGroup(40, 40)
-                    writer.insertAux("40")
-                    writer.endGroup()
+                        // Insert using insertAux after a group with an object key
+                        writer.startGroup(40, 40)
+                        writer.insertAux("40")
+                        writer.endGroup()
 
-                    // Insert aux into an object key with a value slot and then add another value.
-                    writer.startGroup(50, 50)
-                    writer.update(500)
-                    writer.insertAux("50")
-                    writer.update(501)
-                    writer.endGroup()
+                        // Insert aux into an object key with a value slot and then add another
+                        // value.
+                        writer.startGroup(50, 50)
+                        writer.update(500)
+                        writer.insertAux("50")
+                        writer.update(501)
+                        writer.endGroup()
 
-                    // Insert aux after two slot values and then add another value.
-                    writer.startGroup(60)
-                    writer.update(600)
-                    writer.update(601)
-                    writer.insertAux("60")
-                    writer.update(602)
-                    writer.endGroup()
+                        // Insert aux after two slot values and then add another value.
+                        writer.startGroup(60)
+                        writer.update(600)
+                        writer.update(601)
+                        writer.insertAux("60")
+                        writer.update(602)
+                        writer.endGroup()
 
-                    // Write a trail group to ensure that the slot table is valid after the
-                    // insertAux
-                    writer.startGroup(1000)
-                    writer.update(10000)
-                    writer.update(10001)
-                    writer.endGroup()
+                        // Write a trail group to ensure that the slot table is valid after the
+                        // insertAux
+                        writer.startGroup(1000)
+                        writer.update(10000)
+                        writer.update(10001)
+                        writer.endGroup()
+                    }
                 }
             }
-        }
         slots.verifyWellFormed()
         slots.read { reader ->
             assertEquals(10, reader.groupKey)
@@ -3295,12 +3200,11 @@
     }
 
     @Test
-    fun incorrectUsageReportsInternalException() = expectError("internal") {
-        val table = SlotTable()
-        table.write {
-            table.write { }
+    fun incorrectUsageReportsInternalException() =
+        expectError("internal") {
+            val table = SlotTable()
+            table.write { table.write {} }
         }
-    }
 
     @Test
     fun prioritySet_Ordering() {
@@ -3308,8 +3212,7 @@
 
         repeat(100) {
             Random.nextInt().let {
-                if (it < Int.MAX_VALUE)
-                    set.add(it)
+                if (it < Int.MAX_VALUE) set.add(it)
                 set.validateHeap()
             }
         }
@@ -3371,18 +3274,12 @@
             writer.insert {
                 writer.group(0) {
                     writer.group(1) {
-                        writer.group(2) {
-                            writer.markGroup()
-                        }
-                        writer.group(3) {
-                            writer.group(4) { }
-                        }
+                        writer.group(2) { writer.markGroup() }
+                        writer.group(3) { writer.group(4) {} }
                     }
                     writer.group(5) {
                         writer.markGroup()
-                        writer.group(6) {
-                            writer.markGroup()
-                        }
+                        writer.group(6) { writer.markGroup() }
                     }
                 }
             }
@@ -3431,57 +3328,32 @@
         slots.write { writer ->
             writer.insert {
                 writer.group(0) {
-                    repeat(10) { key ->
-                        writer.group(key) {
-                            if (key % 2 == 0) writer.markGroup()
-                        }
-                    }
+                    repeat(10) { key -> writer.group(key) { if (key % 2 == 0) writer.markGroup() } }
                 }
             }
         }
         slots.verifyWellFormed()
-        slots.read { reader ->
-            assertTrue(reader.containsMark(0))
-        }
+        slots.read { reader -> assertTrue(reader.containsMark(0)) }
 
         slots.write { writer ->
             writer.group(0) {
-                repeat(10) { key ->
-                    if (key % 2 == 0)
-                        writer.removeGroup()
-                    else
-                        writer.skipGroup()
-                }
+                repeat(10) { key -> if (key % 2 == 0) writer.removeGroup() else writer.skipGroup() }
             }
         }
         slots.verifyWellFormed()
 
-        slots.read { reader ->
-            assertFalse(reader.containsMark(0))
-        }
+        slots.read { reader -> assertFalse(reader.containsMark(0)) }
     }
 
     @Test
     fun canInsertAMarkedGroup() {
         val slots = SlotTable()
-        slots.write { writer ->
-            writer.insert {
-                writer.group(0) {
-                    writer.group(1) { }
-                }
-            }
-        }
+        slots.write { writer -> writer.insert { writer.group(0) { writer.group(1) {} } } }
         slots.verifyWellFormed()
 
         slots.write { writer ->
             writer.group(0) {
-                writer.group(1) {
-                    writer.insert {
-                        writer.group(2) {
-                            writer.markGroup()
-                        }
-                    }
-                }
+                writer.group(1) { writer.insert { writer.group(2) { writer.markGroup() } } }
             }
         }
         slots.verifyWellFormed()
@@ -3510,36 +3382,20 @@
     @Test
     fun canInsertAMarkedTableGroup() {
         val slots = SlotTable()
-        slots.write { writer ->
-            writer.insert {
-                writer.group(0) { }
-            }
-        }
+        slots.write { writer -> writer.insert { writer.group(0) {} } }
         slots.verifyWellFormed()
 
         val insertTable = SlotTable()
         insertTable.write { writer ->
-            writer.insert {
-                writer.group(1) {
-                    writer.group(2) {
-                        writer.markGroup()
-                    }
-                }
-            }
+            writer.insert { writer.group(1) { writer.group(2) { writer.markGroup() } } }
         }
         insertTable.verifyWellFormed()
 
         slots.write { writer ->
-            writer.group(0) {
-                writer.insert {
-                    writer.moveFrom(insertTable, 0)
-                }
-            }
+            writer.group(0) { writer.insert { writer.moveFrom(insertTable, 0) } }
         }
         slots.verifyWellFormed()
-        slots.read { reader ->
-            assertTrue(reader.containsMark(0))
-        }
+        slots.read { reader -> assertTrue(reader.containsMark(0)) }
     }
 
     @Test
@@ -3559,9 +3415,7 @@
                                         anchor = writer.anchor(writer.parent)
                                         writer.markGroup(writer.parent)
                                     }
-                                    repeat(it) { node ->
-                                        writer.nodeGroup(2000 + node, node)
-                                    }
+                                    repeat(it) { node -> writer.nodeGroup(2000 + node, node) }
                                 }
                             }
                         }
@@ -3604,9 +3458,7 @@
                         reader.expectGroup(1000 + it) {
                             if (it != 3) {
                                 reader.expectGroup(2000 + it) {
-                                    repeat(it) { node ->
-                                        reader.expectNode(2000 + node, node)
-                                    }
+                                    repeat(it) { node -> reader.expectNode(2000 + node, node) }
                                 }
                             }
                         }
@@ -3616,11 +3468,7 @@
         }
 
         movedNodes.read { reader ->
-            reader.expectGroup(2003) {
-                repeat(3) { node ->
-                    reader.expectNode(2000 + node, node)
-                }
-            }
+            reader.expectGroup(2003) { repeat(3) { node -> reader.expectNode(2000 + node, node) } }
         }
 
         // Insert the nodes back
@@ -3629,11 +3477,7 @@
                 writer.group {
                     repeat(5) {
                         if (it == 3) {
-                            writer.group {
-                                writer.insert {
-                                    writer.moveFrom(movedNodes, 0)
-                                }
-                            }
+                            writer.group { writer.insert { writer.moveFrom(movedNodes, 0) } }
                         } else writer.skipGroup()
                     }
                 }
@@ -3654,9 +3498,7 @@
                     repeat(5) {
                         reader.expectGroup(1000 + it) {
                             reader.expectGroup(2000 + it) {
-                                repeat(it) { node ->
-                                    reader.expectNode(2000 + node, node)
-                                }
+                                repeat(it) { node -> reader.expectNode(2000 + node, node) }
                             }
                         }
                     }
@@ -3685,12 +3527,8 @@
                                             writer.group(700) {
                                                 moveAnchor = writer.anchor(writer.parent)
                                                 writer.markGroup(writer.parent)
-                                                writer.group(800) {
-                                                    writer.nodeGroup(801, 801)
-                                                }
-                                                writer.group(900) {
-                                                    writer.nodeGroup(901, 901)
-                                                }
+                                                writer.group(800) { writer.nodeGroup(801, 801) }
+                                                writer.group(900) { writer.nodeGroup(901, 901) }
                                             }
                                         }
                                     }
@@ -3728,23 +3566,15 @@
         // Validate slots
         slots.read { reader ->
             reader.expectGroup(100) {
-                reader.expectGroup(200) {
-                    reader.expectGroup(300) {
-                        reader.expectGroup(400)
-                    }
-                }
+                reader.expectGroup(200) { reader.expectGroup(300) { reader.expectGroup(400) } }
             }
         }
 
         // Validate moved nodes
         movedNodes.read { reader ->
             reader.expectGroup(700) {
-                reader.expectGroup(800) {
-                    reader.expectNode(801, 801)
-                }
-                reader.expectGroup(900) {
-                    reader.expectNode(901, 901)
-                }
+                reader.expectGroup(800) { reader.expectNode(801, 801) }
+                reader.expectGroup(900) { reader.expectNode(901, 901) }
             }
         }
     }
@@ -3763,9 +3593,7 @@
                     writer.group(200) {
                         writer.group(300) {
                             writer.group(400) {
-                                writer.group(450) {
-                                    insertAnchor = writer.anchor(writer.parent)
-                                }
+                                writer.group(450) { insertAnchor = writer.anchor(writer.parent) }
                                 writer.group(500) {
                                     deleteAnchor = writer.anchor(writer.parent)
                                     writer.nodeGroup(501, 501) {
@@ -3773,12 +3601,8 @@
                                             writer.group(700) {
                                                 moveAnchor = writer.anchor(writer.parent)
                                                 writer.markGroup(writer.parent)
-                                                writer.group(800) {
-                                                    writer.nodeGroup(801, 801)
-                                                }
-                                                writer.group(900) {
-                                                    writer.nodeGroup(901, 901)
-                                                }
+                                                writer.group(800) { writer.nodeGroup(801, 801) }
+                                                writer.group(900) { writer.nodeGroup(901, 901) }
                                             }
                                         }
                                     }
@@ -3797,11 +3621,7 @@
                     writer.seek(insertAnchor)
                     writer.ensureStarted(0)
                     writer.group {
-                        writer.insert {
-                            writer.group(455) {
-                                writer.nodeGroup(456, 456)
-                            }
-                        }
+                        writer.insert { writer.group(455) { writer.nodeGroup(456, 456) } }
                     }
 
                     // Move and delete
@@ -3841,9 +3661,7 @@
                                     writer.update(1)
                                     writer.update(2)
                                 }
-                                writer.group(450) {
-                                    insertAnchor = writer.anchor(writer.parent)
-                                }
+                                writer.group(450) { insertAnchor = writer.anchor(writer.parent) }
                                 writer.group(460) {
                                     writer.update(3)
                                     writer.update(4)
@@ -3916,20 +3734,20 @@
             writer.insert {
                 writer.group(100) {
                     writer.group(200, "C(200)") {
-                        writer.grouplessCall(300, "C(300)") { }
-                        writer.grouplessCall(301, "C(301)") { }
-                        writer.group(302, "C(302)") { }
-                        writer.grouplessCall(303, "C(303)") { }
-                        writer.group(304, "C(304)") { }
+                        writer.grouplessCall(300, "C(300)") {}
+                        writer.grouplessCall(301, "C(301)") {}
+                        writer.group(302, "C(302)") {}
+                        writer.grouplessCall(303, "C(303)") {}
+                        writer.group(304, "C(304)") {}
                         writer.grouplessCall(305, "C(305)") {
-                            writer.group(400, "C(400)") { }
-                            writer.group(401, "C(401)") { }
+                            writer.group(400, "C(400)") {}
+                            writer.group(401, "C(401)") {}
                         }
                         writer.grouplessCall(306, "C(306)") {
-                            writer.group(402, "C(402)") { }
+                            writer.group(402, "C(402)") {}
                             writer.grouplessCall(403, "C(403)") {
-                                writer.group(500, "C(500)") { }
-                                writer.group(501, "C(501)") { }
+                                writer.group(500, "C(500)") {}
+                                writer.group(501, "C(501)") {}
                             }
                         }
                     }
@@ -3938,214 +3756,198 @@
         }
         slots.verifyWellFormed()
 
-        val expectedRoot = SourceGroup.group(100) {
-            group(200, "C(200)") {
-                group(300, "C(300)") { }
-                group(301, "C(301)") { }
-                group(302, "C(302)") { }
-                group(303, "C(303)") { }
-                group(304, "C(304)") { }
-                group(305, "C(305)") {
-                    group(400, "C(400)") { }
-                    group(401, "C(401)") { }
-                }
-                group(306, "C(306)") {
-                    group(402, "C(402)") { }
-                    group(403, "C(403)") {
-                        group(500, "C(500)") { }
-                        group(501, "C(501)") { }
+        val expectedRoot =
+            SourceGroup.group(100) {
+                group(200, "C(200)") {
+                    group(300, "C(300)") {}
+                    group(301, "C(301)") {}
+                    group(302, "C(302)") {}
+                    group(303, "C(303)") {}
+                    group(304, "C(304)") {}
+                    group(305, "C(305)") {
+                        group(400, "C(400)") {}
+                        group(401, "C(401)") {}
+                    }
+                    group(306, "C(306)") {
+                        group(402, "C(402)") {}
+                        group(403, "C(403)") {
+                            group(500, "C(500)") {}
+                            group(501, "C(501)") {}
+                        }
                     }
                 }
             }
-        }
         val slotsRoot = SourceGroup.group(slots)
         assertEquals(expectedRoot, slotsRoot)
     }
 
     @Test
     fun reportsGrouplessDataInSourceInformationGroup() {
-        val table = SlotTable().apply {
-            collectSourceInformation()
-            write { writer ->
-                with(writer) {
-                    insert {
-                        group(100) {
-                            group(200, "C(200)") {
-                                update(201)
-                                update(202)
-                                update(203)
-                                group(300, "C(300)") {
-                                    update(301)
-                                    update(302)
-                                    update(301)
-                                }
-                                grouplessCall(400, "C(400)") {
-                                    update(401)
-                                    update(402)
-                                    update(403)
-                                }
-                                group(500, "C(500)") {
-                                    update(501)
-                                    update(502)
-                                    update(503)
-                                }
-                                grouplessCall(600, "C(600)") {
-                                    update(601)
-                                    grouplessCall(700, "C(700)") {
-                                        update(701)
-                                        update(702)
-                                        update(703)
+        val table =
+            SlotTable().apply {
+                collectSourceInformation()
+                write { writer ->
+                    with(writer) {
+                        insert {
+                            group(100) {
+                                group(200, "C(200)") {
+                                    update(201)
+                                    update(202)
+                                    update(203)
+                                    group(300, "C(300)") {
+                                        update(301)
+                                        update(302)
+                                        update(301)
                                     }
-                                    update(602)
-                                    grouplessCall(800, "C(800)") {
-                                        update(801)
-                                        update(802)
-                                        update(803)
+                                    grouplessCall(400, "C(400)") {
+                                        update(401)
+                                        update(402)
+                                        update(403)
                                     }
-                                    update(603)
+                                    group(500, "C(500)") {
+                                        update(501)
+                                        update(502)
+                                        update(503)
+                                    }
+                                    grouplessCall(600, "C(600)") {
+                                        update(601)
+                                        grouplessCall(700, "C(700)") {
+                                            update(701)
+                                            update(702)
+                                            update(703)
+                                        }
+                                        update(602)
+                                        grouplessCall(800, "C(800)") {
+                                            update(801)
+                                            update(802)
+                                            update(803)
+                                        }
+                                        update(603)
+                                    }
                                 }
                             }
                         }
                     }
                 }
             }
-        }
-        val expectedTree = SourceGroup.group(100) {
-            group(200, "C(200)") {
-                data(201)
-                data(202)
-                data(203)
-                group(300, "C(300)") {
-                    data(301)
-                    data(302)
-                    data(301)
-                }
-                group(400, "C(400)") {
-                    data(401)
-                    data(402)
-                    data(403)
-                }
-                group(500, "C(500)") {
-                    data(501)
-                    data(502)
-                    data(503)
-                }
-                group(600, "C(600)") {
-                    data(601)
-                    group(700, "C(700)") {
-                        data(701)
-                        data(702)
-                        data(703)
+        val expectedTree =
+            SourceGroup.group(100) {
+                group(200, "C(200)") {
+                    data(201)
+                    data(202)
+                    data(203)
+                    group(300, "C(300)") {
+                        data(301)
+                        data(302)
+                        data(301)
                     }
-                    data(602)
-                    group(800, "C(800)") {
-                        data(801)
-                        data(802)
-                        data(803)
+                    group(400, "C(400)") {
+                        data(401)
+                        data(402)
+                        data(403)
                     }
-                    data(603)
+                    group(500, "C(500)") {
+                        data(501)
+                        data(502)
+                        data(503)
+                    }
+                    group(600, "C(600)") {
+                        data(601)
+                        group(700, "C(700)") {
+                            data(701)
+                            data(702)
+                            data(703)
+                        }
+                        data(602)
+                        group(800, "C(800)") {
+                            data(801)
+                            data(802)
+                            data(803)
+                        }
+                        data(603)
+                    }
                 }
             }
-        }
         val receivedTree = SourceGroup.group(table, includeData = true)
         assertEquals(expectedTree, receivedTree)
     }
 
     @Test
     fun canMoveSourceInformationFromAnotherTable() {
-        val sourceTable = SlotTable().apply {
-            collectSourceInformation()
-            write { writer ->
-                with(writer) {
-                    insert {
-                        group(200, "C(200)") {
-                            grouplessCall(300, "C(300)") {
-                                group(400, "C(400)") { }
+        val sourceTable =
+            SlotTable().apply {
+                collectSourceInformation()
+                write { writer ->
+                    with(writer) {
+                        insert {
+                            group(200, "C(200)") {
+                                grouplessCall(300, "C(300)") { group(400, "C(400)") {} }
                             }
                         }
                     }
                 }
             }
-        }
         sourceTable.verifyWellFormed()
 
-        val mainTable = SlotTable().apply {
-            collectSourceInformation()
-            write { writer ->
-                with(writer) {
-                    insert {
-                        group(100) {
-                            group(201, "C(201)") { }
-                        }
-                    }
+        val mainTable =
+            SlotTable().apply {
+                collectSourceInformation()
+                write { writer ->
+                    with(writer) { insert { group(100) { group(201, "C(201)") {} } } }
                 }
             }
-        }
         mainTable.verifyWellFormed()
 
         mainTable.write { writer ->
             with(writer) {
                 group {
-                    insert {
-                        moveFrom(sourceTable, 0)
-                    }
+                    insert { moveFrom(sourceTable, 0) }
                     skipToGroupEnd()
                 }
             }
         }
         mainTable.verifyWellFormed()
 
-        val expected = SourceGroup.group(100) {
-            group(200, "C(200)") {
-                group(300, "C(300)") {
-                    group(400, "C(400)") { }
-                }
+        val expected =
+            SourceGroup.group(100) {
+                group(200, "C(200)") { group(300, "C(300)") { group(400, "C(400)") {} } }
+                group(201, "C(201)") {}
             }
-            group(201, "C(201)") { }
-        }
         val received = SourceGroup.group(mainTable)
         assertEquals(expected, received)
     }
 
     @Test
     fun canMoveSourceInformationIntoAGroupWithSourceInformation() {
-        val sourceTable = SlotTable().apply {
-            collectSourceInformation()
-            write { writer ->
-                with(writer) {
-                    insert {
-                        group(300, "C(300)") {
-                            grouplessCall(400, "C(400)") {
-                                group(500, "C(500)") { }
+        val sourceTable =
+            SlotTable().apply {
+                collectSourceInformation()
+                write { writer ->
+                    with(writer) {
+                        insert {
+                            group(300, "C(300)") {
+                                grouplessCall(400, "C(400)") { group(500, "C(500)") {} }
                             }
                         }
                     }
                 }
             }
-        }
         sourceTable.verifyWellFormed()
 
-        val mainTable = SlotTable().apply {
-            collectSourceInformation()
-            write { writer ->
-                with(writer) {
-                    insert {
-                        group(100) {
-                            group(201, "C(201)") { }
-                        }
-                    }
+        val mainTable =
+            SlotTable().apply {
+                collectSourceInformation()
+                write { writer ->
+                    with(writer) { insert { group(100) { group(201, "C(201)") {} } } }
                 }
             }
-        }
         mainTable.verifyWellFormed()
 
         mainTable.write { writer ->
             with(writer) {
                 group {
                     group(201) {
-                        insert {
-                            moveFrom(sourceTable, 0)
-                        }
+                        insert { moveFrom(sourceTable, 0) }
                         skipToGroupEnd()
                     }
                     skipToGroupEnd()
@@ -4154,35 +3956,33 @@
         }
         mainTable.verifyWellFormed()
 
-        val expected = SourceGroup.group(100) {
-            group(201, "C(201)") {
-                group(300, "C(300)") {
-                    group(400, "C(400)") {
-                        group(500, "C(500)") { }
-                    }
+        val expected =
+            SourceGroup.group(100) {
+                group(201, "C(201)") {
+                    group(300, "C(300)") { group(400, "C(400)") { group(500, "C(500)") {} } }
                 }
             }
-        }
         val received = SourceGroup.group(mainTable)
         assertEquals(expected, received)
     }
 
     @Test
     fun canRemoveAGroupBeforeAnEmptyGrouplessCall() {
-        val slots = SlotTable().apply {
-            collectSourceInformation()
-            write { writer ->
-                with(writer) {
-                    insert {
-                        group(100) {
-                            group(200, "C(2001)") { }
-                            grouplessCall(201, "C(201)") { }
-                            group(202, "C(202)") { }
+        val slots =
+            SlotTable().apply {
+                collectSourceInformation()
+                write { writer ->
+                    with(writer) {
+                        insert {
+                            group(100) {
+                                group(200, "C(2001)") {}
+                                grouplessCall(201, "C(201)") {}
+                                group(202, "C(202)") {}
+                            }
                         }
                     }
                 }
             }
-        }
         slots.verifyWellFormed()
 
         slots.write { writer ->
@@ -4195,30 +3995,32 @@
         }
         slots.verifyWellFormed()
 
-        val expected = SourceGroup.group(100) {
-            group(201, "C(201)") { }
-            group(202, "C(202)") { }
-        }
+        val expected =
+            SourceGroup.group(100) {
+                group(201, "C(201)") {}
+                group(202, "C(202)") {}
+            }
         val received = SourceGroup.group(slots)
         assertEquals(expected, received)
     }
 
     @Test
     fun canRemoveAGroupAfterAnEmptyGrouplessCall() {
-        val slots = SlotTable().apply {
-            collectSourceInformation()
-            write { writer ->
-                with(writer) {
-                    insert {
-                        group(100) {
-                            group(200, "C(200)") { }
-                            grouplessCall(201, "C(201)") { }
-                            group(202, "C(202)") { }
+        val slots =
+            SlotTable().apply {
+                collectSourceInformation()
+                write { writer ->
+                    with(writer) {
+                        insert {
+                            group(100) {
+                                group(200, "C(200)") {}
+                                grouplessCall(201, "C(201)") {}
+                                group(202, "C(202)") {}
+                            }
                         }
                     }
                 }
             }
-        }
         slots.verifyWellFormed()
 
         slots.write { writer ->
@@ -4232,32 +4034,32 @@
         }
         slots.verifyWellFormed()
 
-        val expected = SourceGroup.group(100) {
-            group(200, "C(200)") { }
-            group(201, "C(201)") { }
-        }
+        val expected =
+            SourceGroup.group(100) {
+                group(200, "C(200)") {}
+                group(201, "C(201)") {}
+            }
         val received = SourceGroup.group(slots)
         assertEquals(expected, received)
     }
 
     @Test
     fun canRemoveAGroupProducedInAGrouplessCall() {
-        val slots = SlotTable().apply {
-            collectSourceInformation()
-            write { writer ->
-                with(writer) {
-                    insert {
-                        group(100) {
-                            group(200, "C(200)") { }
-                            grouplessCall(201, "C(201)") {
-                                group(300, "C(300)") { }
+        val slots =
+            SlotTable().apply {
+                collectSourceInformation()
+                write { writer ->
+                    with(writer) {
+                        insert {
+                            group(100) {
+                                group(200, "C(200)") {}
+                                grouplessCall(201, "C(201)") { group(300, "C(300)") {} }
+                                group(202, "C(202)") {}
                             }
-                            group(202, "C(202)") { }
                         }
                     }
                 }
             }
-        }
         slots.verifyWellFormed()
 
         slots.write { writer ->
@@ -4271,28 +4073,29 @@
         }
         slots.verifyWellFormed()
 
-        val expected = SourceGroup.group(100) {
-            group(200, "C(200)") { }
-            group(202, "C(202)") { }
-        }
+        val expected =
+            SourceGroup.group(100) {
+                group(200, "C(200)") {}
+                group(202, "C(202)") {}
+            }
         val received = SourceGroup.group(slots)
         assertEquals(expected, received)
     }
 
     @Test
     fun canRemoveAGroupWithSourceInformation() {
-        val slots = SlotTable().apply {
-            collectSourceInformation()
-            write { writer ->
-                with(writer) {
-                    insert {
-                        group(100) {
-                            group(200, "C(200)") { }
-                            group(201, "C(201)") { }
-                            group(202, "C(202)") {
-                                grouplessCall(300, "C(300)") {
-                                    group(400, "C(400)") {
-                                        group(500, "C(500)") { }
+        val slots =
+            SlotTable().apply {
+                collectSourceInformation()
+                write { writer ->
+                    with(writer) {
+                        insert {
+                            group(100) {
+                                group(200, "C(200)") {}
+                                group(201, "C(201)") {}
+                                group(202, "C(202)") {
+                                    grouplessCall(300, "C(300)") {
+                                        group(400, "C(400)") { group(500, "C(500)") {} }
                                     }
                                 }
                             }
@@ -4300,7 +4103,6 @@
                     }
                 }
             }
-        }
         slots.verifyWellFormed()
 
         slots.write { writer ->
@@ -4319,15 +4121,12 @@
         }
         slots.verifyWellFormed()
 
-        val expected = SourceGroup.group(100) {
-            group(200, "C(200)") { }
-            group(201, "C(201)") { }
-            group(202, "C(202)") {
-                group(300, "C(300)") {
-                    group(400, "C(400)") { }
-                }
+        val expected =
+            SourceGroup.group(100) {
+                group(200, "C(200)") {}
+                group(201, "C(201)") {}
+                group(202, "C(202)") { group(300, "C(300)") { group(400, "C(400)") {} } }
             }
-        }
         val received = SourceGroup.group(slots)
 
         assertEquals(expected, received)
@@ -4335,48 +4134,46 @@
 
     @Test
     fun canAddAGrouplessCallToAGroupWithNoSourceInformation() {
-        val slots = SlotTable().apply {
-            collectSourceInformation()
-            write { writer ->
-                with(writer) {
-                    insert {
-                        group(100) {
-                            group(200) {
-                                group(300, "C(300)") { }
-                                group(301, "C(301)") { }
-                                grouplessCall(302, "C(302)") {
-                                    group(400, "C(400)") { }
+        val slots =
+            SlotTable().apply {
+                collectSourceInformation()
+                write { writer ->
+                    with(writer) {
+                        insert {
+                            group(100) {
+                                group(200) {
+                                    group(300, "C(300)") {}
+                                    group(301, "C(301)") {}
+                                    grouplessCall(302, "C(302)") { group(400, "C(400)") {} }
                                 }
-                            }
-                            group(201, "C(201)") {
-                                group(303) {
-                                    group(401, "C(401)") { }
-                                    grouplessCall(402, "C(402)") { }
-                                    group(403, "C(403)") { }
+                                group(201, "C(201)") {
+                                    group(303) {
+                                        group(401, "C(401)") {}
+                                        grouplessCall(402, "C(402)") {}
+                                        group(403, "C(403)") {}
+                                    }
                                 }
                             }
                         }
                     }
                 }
             }
-        }
 
-        val expected = SourceGroup.group(100) {
-            group(200) {
-                group(300, "C(300)") { }
-                group(301, "C(301)") { }
-                group(302, "C(302)") {
-                    group(400, "C(400)") { }
+        val expected =
+            SourceGroup.group(100) {
+                group(200) {
+                    group(300, "C(300)") {}
+                    group(301, "C(301)") {}
+                    group(302, "C(302)") { group(400, "C(400)") {} }
+                }
+                group(201, "C(201)") {
+                    group(303) {
+                        group(401, "C(401)") {}
+                        group(402, "C(402)") {}
+                        group(403, "C(403)") {}
+                    }
                 }
             }
-            group(201, "C(201)") {
-                group(303) {
-                    group(401, "C(401)") { }
-                    group(402, "C(402)") { }
-                    group(403, "C(403)") { }
-                }
-            }
-        }
         val received = SourceGroup.group(slots)
 
         assertEquals(expected, received)
@@ -4398,9 +4195,7 @@
                                     writer.update(1)
                                     writer.update(2)
                                 }
-                                writer.group(450) {
-                                    insertAnchor = writer.anchor(writer.parent)
-                                }
+                                writer.group(450) { insertAnchor = writer.anchor(writer.parent) }
                                 writer.group(460) {
                                     writer.update(3)
                                     writer.update(4)
@@ -4426,24 +4221,25 @@
         }
         insertTable.verifyWellFormed()
 
-        val (previous1, previous2) = slots.write { writer ->
-            writer.seek(insertAnchor)
-            writer.ensureStarted(0)
-            writer.ensureStarted(writer.parent(writer.currentGroup))
-            writer.moveIntoGroupFrom(0, insertTable, 0)
-            writer.startGroup()
-            writer.startGroup()
-            val previous1 = writer.update(300)
-            val previous2 = writer.update(400)
-            writer.skipToGroupEnd()
-            writer.endGroup()
-            writer.endGroup()
-            writer.skipToGroupEnd()
-            writer.endGroup()
-            writer.skipToGroupEnd()
-            writer.endGroup()
-            previous1 to previous2
-        }
+        val (previous1, previous2) =
+            slots.write { writer ->
+                writer.seek(insertAnchor)
+                writer.ensureStarted(0)
+                writer.ensureStarted(writer.parent(writer.currentGroup))
+                writer.moveIntoGroupFrom(0, insertTable, 0)
+                writer.startGroup()
+                writer.startGroup()
+                val previous1 = writer.update(300)
+                val previous2 = writer.update(400)
+                writer.skipToGroupEnd()
+                writer.endGroup()
+                writer.endGroup()
+                writer.skipToGroupEnd()
+                writer.endGroup()
+                writer.skipToGroupEnd()
+                writer.endGroup()
+                previous1 to previous2
+            }
         slots.verifyWellFormed()
 
         assertEquals(100, previous1)
@@ -4486,17 +4282,11 @@
                 writer.group(1) {
                     writer.group(10) {
                         writer.update(10)
-                        writer.group(100) {
-                            writer.update(100)
-                        }
-                        writer.group(200) {
-                            writer.update(200)
-                        }
+                        writer.group(100) { writer.update(100) }
+                        writer.group(200) { writer.update(200) }
                         writer.update(11)
                         writer.update(12)
-                        writer.group(300) {
-                            writer.update(300)
-                        }
+                        writer.group(300) { writer.update(300) }
                     }
                 }
             }
@@ -4508,17 +4298,11 @@
             reader.expectGroup(1) {
                 reader.expectGroup(10) {
                     reader.expectData(10)
-                    reader.expectGroup(100) {
-                        reader.expectData(100)
-                    }
-                    reader.expectGroup(200) {
-                        reader.expectData(200)
-                    }
+                    reader.expectGroup(100) { reader.expectData(100) }
+                    reader.expectGroup(200) { reader.expectData(200) }
                     reader.expectData(11)
                     reader.expectData(12)
-                    reader.expectGroup(300) {
-                        reader.expectData(300)
-                    }
+                    reader.expectGroup(300) { reader.expectData(300) }
                 }
             }
         }
@@ -4533,13 +4317,11 @@
                 writer.group(1) {
                     writer.group(10) {
                         writer.update(10)
-                        writer.group(300) { }
-                        writer.group(400) { }
+                        writer.group(300) {}
+                        writer.group(400) {}
                         writer.update(11)
                         writer.update(12)
-                        writer.group(500) {
-                            writer.update(500)
-                        }
+                        writer.group(500) { writer.update(500) }
                     }
                 }
             }
@@ -4551,25 +4333,26 @@
     @Test
     fun supportsAppendingSlots_first_empty() {
         var anchor: Anchor? = null
-        val slots = SlotTable().apply {
-            write { writer ->
-                with(writer) {
-                    insert {
-                        group(100) {
-                            group(200) { anchor = anchor(parent) }
-                            group(300) { }
+        val slots =
+            SlotTable().apply {
+                write { writer ->
+                    with(writer) {
+                        insert {
+                            group(100) {
+                                group(200) { anchor = anchor(parent) }
+                                group(300) {}
+                            }
                         }
                     }
                 }
             }
-        }
         slots.verifyWellFormed()
 
         slots.read { reader ->
             with(reader) {
                 expectStrictGroup(100) {
-                    expectStrictGroup(200) { }
-                    expectStrictGroup(300) { }
+                    expectStrictGroup(200) {}
+                    expectStrictGroup(300) {}
                 }
             }
         }
@@ -4590,7 +4373,7 @@
                         expectData(200)
                         expectData(201)
                     }
-                    expectStrictGroup(300) { }
+                    expectStrictGroup(300) {}
                 }
             }
         }
@@ -4599,28 +4382,29 @@
     @Test
     fun supportsAppendingSlots_first_occupied() {
         var anchor: Anchor? = null
-        val slots = SlotTable().apply {
-            write { writer ->
-                with(writer) {
-                    insert {
-                        group(100) {
-                            group(200) { anchor = anchor(parent) }
-                            group(300) {
-                                update(300)
-                                update(301)
-                                update(302)
+        val slots =
+            SlotTable().apply {
+                write { writer ->
+                    with(writer) {
+                        insert {
+                            group(100) {
+                                group(200) { anchor = anchor(parent) }
+                                group(300) {
+                                    update(300)
+                                    update(301)
+                                    update(302)
+                                }
                             }
                         }
                     }
                 }
             }
-        }
         slots.verifyWellFormed()
 
         slots.read { reader ->
             with(reader) {
                 expectStrictGroup(100) {
-                    expectStrictGroup(200) { }
+                    expectStrictGroup(200) {}
                     expectStrictGroup(300) {
                         expectData(300)
                         expectData(301)
@@ -4659,26 +4443,27 @@
     @Test
     fun supportsAppendingSlots_after_occupied() {
         var anchor: Anchor? = null
-        val slots = SlotTable().apply {
-            write { writer ->
-                with(writer) {
-                    insert {
-                        group(100) {
-                            group(200) {
-                                anchor = anchor(parent)
-                                update(200)
-                                update(201)
-                            }
-                            group(300) {
-                                update(300)
-                                update(301)
-                                update(302)
+        val slots =
+            SlotTable().apply {
+                write { writer ->
+                    with(writer) {
+                        insert {
+                            group(100) {
+                                group(200) {
+                                    anchor = anchor(parent)
+                                    update(200)
+                                    update(201)
+                                }
+                                group(300) {
+                                    update(300)
+                                    update(301)
+                                    update(302)
+                                }
                             }
                         }
                     }
                 }
             }
-        }
         slots.verifyWellFormed()
 
         slots.read { reader ->
@@ -4727,25 +4512,26 @@
     @Test
     fun supportsAppendingSlots_middle() {
         var anchor: Anchor? = null
-        val slots = SlotTable().apply {
-            write { writer ->
-                with(writer) {
-                    insert {
-                        group(100) {
-                            update(100)
-                            update(101)
-                            group(200) { anchor = anchor(parent) }
-                            group(300) {
-                                update(300)
-                                update(301)
+        val slots =
+            SlotTable().apply {
+                write { writer ->
+                    with(writer) {
+                        insert {
+                            group(100) {
+                                update(100)
+                                update(101)
+                                group(200) { anchor = anchor(parent) }
+                                group(300) {
+                                    update(300)
+                                    update(301)
+                                }
+                                update(102)
+                                update(103)
                             }
-                            update(102)
-                            update(103)
                         }
                     }
                 }
             }
-        }
         slots.verifyWellFormed()
 
         slots.read { reader ->
@@ -4753,7 +4539,7 @@
                 expectStrictGroup(100) {
                     expectData(100)
                     expectData(101)
-                    expectStrictGroup(200) { }
+                    expectStrictGroup(200) {}
                     expectStrictGroup(300) {
                         expectData(300)
                         expectData(301)
@@ -4797,22 +4583,23 @@
     @Test
     fun supportsAppendingSlots_end() {
         var anchor: Anchor? = null
-        val slots = SlotTable().apply {
-            write { writer ->
-                with(writer) {
-                    insert {
-                        group(100) {
-                            update(100)
-                            update(101)
-                            group(200) { anchor = anchor(parent) }
-                            group(300) { }
-                            update(102)
-                            update(103)
+        val slots =
+            SlotTable().apply {
+                write { writer ->
+                    with(writer) {
+                        insert {
+                            group(100) {
+                                update(100)
+                                update(101)
+                                group(200) { anchor = anchor(parent) }
+                                group(300) {}
+                                update(102)
+                                update(103)
+                            }
                         }
                     }
                 }
             }
-        }
         slots.verifyWellFormed()
 
         slots.read { reader ->
@@ -4820,8 +4607,8 @@
                 expectStrictGroup(100) {
                     expectData(100)
                     expectData(101)
-                    expectStrictGroup(200) { }
-                    expectStrictGroup(300) { }
+                    expectStrictGroup(200) {}
+                    expectStrictGroup(300) {}
                     expectData(102)
                     expectData(103)
                 }
@@ -4847,7 +4634,7 @@
                         expectData(201)
                         expectData(202)
                     }
-                    expectStrictGroup(300) { }
+                    expectStrictGroup(300) {}
                     expectData(102)
                     expectData(103)
                 }
@@ -4858,36 +4645,35 @@
     @Test
     fun supportsAppendingSlots_ensureStarted() {
         var insertAnchor: Anchor? = null
-        val slots = SlotTable().apply {
-            write { writer ->
-                with(writer) {
-                    insert {
-                        group(100) {
-                            group(1000) {
-                                group(200) {
-                                    update(200)
-                                    update(201)
-                                    update(202)
-                                    group(300) {
-                                        update(300)
-                                        group(400) {
-                                            insertAnchor = anchor(parent)
-                                            update(400)
-                                            group(500) {
-                                                update(500)
+        val slots =
+            SlotTable().apply {
+                write { writer ->
+                    with(writer) {
+                        insert {
+                            group(100) {
+                                group(1000) {
+                                    group(200) {
+                                        update(200)
+                                        update(201)
+                                        update(202)
+                                        group(300) {
+                                            update(300)
+                                            group(400) {
+                                                insertAnchor = anchor(parent)
+                                                update(400)
+                                                group(500) { update(500) }
                                             }
                                         }
                                     }
+                                    group(600) { update(600) }
+                                    group(700) { update(700) }
+                                    group(800) { update(800) }
                                 }
-                                group(600) { update(600) }
-                                group(700) { update(700) }
-                                group(800) { update(800) }
                             }
                         }
                     }
                 }
             }
-        }
         slots.verifyWellFormed()
 
         slots.write { writer ->
@@ -4916,9 +4702,7 @@
                                 expectData(300)
                                 group(400) {
                                     expectData(400)
-                                    group(500) {
-                                        expectData(500)
-                                    }
+                                    group(500) { expectData(500) }
                                     expectData(1000)
                                 }
                             }
@@ -4934,30 +4718,31 @@
 
     @Test
     fun supportsRemovingSlots_toEmpty() {
-        val slots = SlotTable().apply {
-            write { writer ->
-                with(writer) {
-                    insert {
-                        group(100) {
-                            update(100)
-                            update(101)
-                            group(200) {
-                                update(200)
-                                update(201)
-                                update(202)
+        val slots =
+            SlotTable().apply {
+                write { writer ->
+                    with(writer) {
+                        insert {
+                            group(100) {
+                                update(100)
+                                update(101)
+                                group(200) {
+                                    update(200)
+                                    update(201)
+                                    update(202)
+                                }
+                                group(300) {
+                                    update(300)
+                                    update(301)
+                                    update(302)
+                                }
+                                update(102)
+                                update(103)
                             }
-                            group(300) {
-                                update(300)
-                                update(301)
-                                update(302)
-                            }
-                            update(102)
-                            update(103)
                         }
                     }
                 }
             }
-        }
         slots.verifyWellFormed()
 
         slots.read { reader ->
@@ -4984,9 +4769,7 @@
         slots.write { writer ->
             with(writer) {
                 group {
-                    group {
-                        trimTailSlots(3)
-                    }
+                    group { trimTailSlots(3) }
                     skipToGroupEnd()
                 }
             }
@@ -5013,30 +4796,31 @@
 
     @Test
     fun supportsRemovingSlots_trim() {
-        val slots = SlotTable().apply {
-            write { writer ->
-                with(writer) {
-                    insert {
-                        group(100) {
-                            update(100)
-                            update(101)
-                            group(200) {
-                                update(200)
-                                update(201)
-                                update(202)
+        val slots =
+            SlotTable().apply {
+                write { writer ->
+                    with(writer) {
+                        insert {
+                            group(100) {
+                                update(100)
+                                update(101)
+                                group(200) {
+                                    update(200)
+                                    update(201)
+                                    update(202)
+                                }
+                                group(300) {
+                                    update(300)
+                                    update(301)
+                                    update(302)
+                                }
+                                update(102)
+                                update(103)
                             }
-                            group(300) {
-                                update(300)
-                                update(301)
-                                update(302)
-                            }
-                            update(102)
-                            update(103)
                         }
                     }
                 }
             }
-        }
         slots.verifyWellFormed()
 
         slots.read { reader ->
@@ -5063,9 +4847,7 @@
         slots.write { writer ->
             with(writer) {
                 group {
-                    group {
-                        trimTailSlots(1)
-                    }
+                    group { trimTailSlots(1) }
                     skipToGroupEnd()
                 }
             }
@@ -5095,31 +4877,32 @@
 
     @Test
     fun supportsRemovingSlots_toEmpty_withAux() {
-        val slots = SlotTable().apply {
-            write { writer ->
-                with(writer) {
-                    insert {
-                        group(100) {
-                            update(100)
-                            update(101)
-                            group(200) {
-                                insertAux("200 Aux")
-                                update(200)
-                                update(201)
-                                update(202)
+        val slots =
+            SlotTable().apply {
+                write { writer ->
+                    with(writer) {
+                        insert {
+                            group(100) {
+                                update(100)
+                                update(101)
+                                group(200) {
+                                    insertAux("200 Aux")
+                                    update(200)
+                                    update(201)
+                                    update(202)
+                                }
+                                group(300) {
+                                    update(300)
+                                    update(301)
+                                    update(302)
+                                }
+                                update(102)
+                                update(103)
                             }
-                            group(300) {
-                                update(300)
-                                update(301)
-                                update(302)
-                            }
-                            update(102)
-                            update(103)
                         }
                     }
                 }
             }
-        }
         slots.verifyWellFormed()
 
         slots.read { reader ->
@@ -5147,9 +4930,7 @@
         slots.write { writer ->
             with(writer) {
                 group {
-                    group {
-                        trimTailSlots(3)
-                    }
+                    group { trimTailSlots(3) }
                     skipToGroupEnd()
                 }
             }
@@ -5177,23 +4958,24 @@
 
     @Test
     fun supportsRemovingSlots_toEmpty_atEnd() {
-        val slots = SlotTable().apply {
-            write { writer ->
-                with(writer) {
-                    insert {
-                        group(100) {
-                            update(100)
-                            update(101)
-                            group(200) {
-                                update(200)
-                                update(201)
-                                update(202)
+        val slots =
+            SlotTable().apply {
+                write { writer ->
+                    with(writer) {
+                        insert {
+                            group(100) {
+                                update(100)
+                                update(101)
+                                group(200) {
+                                    update(200)
+                                    update(201)
+                                    update(202)
+                                }
                             }
                         }
                     }
                 }
             }
-        }
         slots.verifyWellFormed()
 
         slots.read { reader ->
@@ -5213,9 +4995,7 @@
         slots.write { writer ->
             with(writer) {
                 group {
-                    group {
-                        trimTailSlots(3)
-                    }
+                    group { trimTailSlots(3) }
                     skipToGroupEnd()
                 }
             }
@@ -5235,36 +5015,37 @@
 
     @Test
     fun movingGroupsAtTheEndOfTheTable() {
-        val slots = SlotTable().apply {
-            write { writer ->
-                with(writer) {
-                    insert {
-                        group(100) {
-                            group(200) {
-                                update(2000)
-                                update(2001)
-                                update(2002)
+        val slots =
+            SlotTable().apply {
+                write { writer ->
+                    with(writer) {
+                        insert {
+                            group(100) {
+                                group(200) {
+                                    update(2000)
+                                    update(2001)
+                                    update(2002)
+                                }
+                                group(201) {
+                                    update(2010)
+                                    update(2011)
+                                    update(2012)
+                                }
+                                group(202) {
+                                    update(2020)
+                                    update(2021)
+                                    update(2022)
+                                    group(300) {}
+                                    group(300) {}
+                                }
+                                group(203) {}
+                                group(204) {}
+                                group(205) {}
                             }
-                            group(201) {
-                                update(2010)
-                                update(2011)
-                                update(2012)
-                            }
-                            group(202) {
-                                update(2020)
-                                update(2021)
-                                update(2022)
-                                group(300) { }
-                                group(300) { }
-                            }
-                            group(203) { }
-                            group(204) { }
-                            group(205) { }
                         }
                     }
                 }
             }
-        }
         slots.verifyWellFormed()
 
         slots.read {
@@ -5284,12 +5065,12 @@
                         expectData(2020)
                         expectData(2021)
                         expectData(2022)
-                        expectStrictGroup(300) { }
-                        expectStrictGroup(300) { }
+                        expectStrictGroup(300) {}
+                        expectStrictGroup(300) {}
                     }
-                    expectStrictGroup(203) { }
-                    expectStrictGroup(204) { }
-                    expectStrictGroup(205) { }
+                    expectStrictGroup(203) {}
+                    expectStrictGroup(204) {}
+                    expectStrictGroup(205) {}
                 }
             }
         }
@@ -5299,9 +5080,7 @@
                 group {
                     skipGroup()
                     skipGroup()
-                    insert {
-                        group(1000) { }
-                    }
+                    insert { group(1000) {} }
                     moveGroup(1)
                     skipToGroupEnd()
                 }
@@ -5322,16 +5101,16 @@
                         expectData(2012)
                     }
                     expectStrictGroup(1000)
-                    expectStrictGroup(203) { }
+                    expectStrictGroup(203) {}
                     expectStrictGroup(202) {
                         expectData(2020)
                         expectData(2021)
                         expectData(2022)
-                        expectStrictGroup(300) { }
-                        expectStrictGroup(300) { }
+                        expectStrictGroup(300) {}
+                        expectStrictGroup(300) {}
                     }
-                    expectStrictGroup(204) { }
-                    expectStrictGroup(205) { }
+                    expectStrictGroup(204) {}
+                    expectStrictGroup(205) {}
                 }
             }
         }
@@ -5339,34 +5118,35 @@
 
     @Test
     fun trimmingDataAtTheEndOfTheTable() {
-        val slots = SlotTable().apply {
-            write { writer ->
-                with(writer) {
-                    insert {
-                        group(100) {
-                            group(200) { }
-                            group(300) {
-                                update(301)
-                                update(302)
-                                update(303)
-                                group(400) {
-                                    update(401)
-                                    update(402)
-                                    update(403)
+        val slots =
+            SlotTable().apply {
+                write { writer ->
+                    with(writer) {
+                        insert {
+                            group(100) {
+                                group(200) {}
+                                group(300) {
+                                    update(301)
+                                    update(302)
+                                    update(303)
+                                    group(400) {
+                                        update(401)
+                                        update(402)
+                                        update(403)
+                                    }
                                 }
+                                group(500) {}
                             }
-                            group(500) { }
                         }
                     }
                 }
             }
-        }
         slots.verifyWellFormed()
 
         slots.read { reader ->
             with(reader) {
                 expectStrictGroup(100) {
-                    expectStrictGroup(200) { }
+                    expectStrictGroup(200) {}
                     expectStrictGroup(300) {
                         expectData(301)
                         expectData(302)
@@ -5377,37 +5157,34 @@
                             expectData(403)
                         }
                     }
-                    expectStrictGroup(500) { }
+                    expectStrictGroup(500) {}
                 }
             }
         }
 
-        val insertTable = SlotTable().apply {
-            write { writer ->
-                with(writer) {
-                    insert {
-                        group(1000) {
-                            update(1001)
-                            update(1002)
+        val insertTable =
+            SlotTable().apply {
+                write { writer ->
+                    with(writer) {
+                        insert {
+                            group(1000) {
+                                update(1001)
+                                update(1002)
+                            }
                         }
                     }
                 }
             }
-        }
         slots.write { writer ->
             with(writer) {
                 group {
                     skipGroup()
-                    insert {
-                        moveFrom(insertTable, 0, false)
-                    }
+                    insert { moveFrom(insertTable, 0, false) }
                     group {
                         skipGroup()
                         trimTailSlots(3)
                     }
-                    insert {
-                        moveFrom(insertTable, 0, false)
-                    }
+                    insert { moveFrom(insertTable, 0, false) }
                     skipToGroupEnd()
                 }
             }
@@ -5417,7 +5194,7 @@
         slots.read { reader ->
             with(reader) {
                 expectStrictGroup(100) {
-                    expectStrictGroup(200) { }
+                    expectStrictGroup(200) {}
                     expectStrictGroup(1000) {
                         expectData(1001)
                         expectData(1002)
@@ -5433,7 +5210,7 @@
                         expectData(1001)
                         expectData(1002)
                     }
-                    expectStrictGroup(500) { }
+                    expectStrictGroup(500) {}
                 }
             }
         }
@@ -5442,11 +5219,9 @@
 
 private const val NodeKey = 125
 
-private fun SlotWriter.startNode(key: Any?) =
-    startNode(NodeKey, key)
+private fun SlotWriter.startNode(key: Any?) = startNode(NodeKey, key)
 
-private fun SlotWriter.startNode(key: Any?, node: Any?) =
-    startNode(NodeKey, key, node)
+private fun SlotWriter.startNode(key: Any?, node: Any?) = startNode(NodeKey, key, node)
 
 internal inline fun SlotWriter.group(block: () -> Unit) {
     startGroup()
@@ -5477,7 +5252,7 @@
     recordGrouplessCallSourceInformationEnd()
 }
 
-internal inline fun SlotWriter.nodeGroup(key: Int, node: Any, block: () -> Unit = { }) {
+internal inline fun SlotWriter.nodeGroup(key: Int, node: Any, block: () -> Unit = {}) {
     startNode(NodeKey, key, node)
     block()
     endGroup()
@@ -5502,7 +5277,7 @@
     endGroup()
 }
 
-private inline fun SlotReader.expectNode(key: Int, node: Any, block: () -> Unit = { }) {
+private inline fun SlotReader.expectNode(key: Int, node: Any, block: () -> Unit = {}) {
     assertEquals(key, groupObjectKey)
     assertEquals(node, groupNode)
     startNode()
@@ -5551,8 +5326,7 @@
             item(key) {
                 for (item in 0..key) {
                     element(key * elementKey + item) {
-                        for (element in 0..key)
-                            writer.update(-element)
+                        for (element in 0..key) writer.update(-element)
                     }
                 }
             }
@@ -5638,24 +5412,21 @@
             anchors.add(writer.anchor())
             item(key) {
                 when {
-                    width > 0 -> for (childKey in 1..width) {
-                        tree(childKey, width - 1, depth + 1)
-                    }
+                    width > 0 ->
+                        for (childKey in 1..width) {
+                            tree(childKey, width - 1, depth + 1)
+                        }
                     depth > 0 -> {
                         tree(1001, width, depth - 1)
                     }
                     else -> {
-                        repeat(depth + 2) {
-                            element(-1) { }
-                        }
+                        repeat(depth + 2) { element(-1) {} }
                     }
                 }
             }
         }
 
-        element(1000) {
-            tree(0, 5, 5)
-        }
+        element(1000) { tree(0, 5, 5) }
         writer.endGroup()
         writer.endInsert()
     }
@@ -5668,20 +5439,14 @@
     return skipGroup()
 }
 
-private fun SlotReader.expectGroup(
-    key: Int,
-    block: () -> Unit
-) {
+private fun SlotReader.expectGroup(key: Int, block: () -> Unit) {
     assertEquals(key, groupKey)
     startGroup()
     block()
     endGroup()
 }
 
-private fun SlotReader.expectStrictGroup(
-    key: Int,
-    block: () -> Unit = { }
-) {
+private fun SlotReader.expectStrictGroup(key: Int, block: () -> Unit = {}) {
     assertEquals(key, groupKey)
     startGroup()
     block()
@@ -5728,10 +5493,7 @@
             "Expected \"${e.message}\" to contain \"$message\""
         )
     }
-    assertTrue(
-        exceptionThrown,
-        "Expected test to throw an exception containing \"$message\""
-    )
+    assertTrue(exceptionThrown, "Expected test to throw an exception containing \"$message\"")
 }
 
 data class SourceGroup(
@@ -5791,6 +5553,7 @@
 
         fun group(compositionData: CompositionData, includeData: Boolean = false): SourceGroup =
             groupOf(compositionData.compositionGroups.first(), includeData)
+
         private fun groupOf(group: CompositionGroup, includeData: Boolean): SourceGroup =
             SourceGroup(
                 group.key,
diff --git a/compose/runtime/runtime/src/nonEmulatorCommonTest/kotlin/androidx/compose/runtime/SnapshotFlowTests.kt b/compose/runtime/runtime/src/nonEmulatorCommonTest/kotlin/androidx/compose/runtime/SnapshotFlowTests.kt
index 7b3f4e3..a746a0f 100644
--- a/compose/runtime/runtime/src/nonEmulatorCommonTest/kotlin/androidx/compose/runtime/SnapshotFlowTests.kt
+++ b/compose/runtime/runtime/src/nonEmulatorCommonTest/kotlin/androidx/compose/runtime/SnapshotFlowTests.kt
@@ -37,15 +37,14 @@
 
         // Use Dispatchers.Unconfined to cause the observer to run immediately for this test,
         // both here and when we apply a change.
-        val collector = snapshotFlow { state * 2 }
-            .onEach { result = it }
-            .launchIn(this + Dispatchers.Unconfined)
+        val collector =
+            snapshotFlow { state * 2 }
+                .onEach { result = it }
+                .launchIn(this + Dispatchers.Unconfined)
 
         assertEquals(2, result, "value after initial run")
 
-        Snapshot.withMutableSnapshot {
-            state = 5
-        }
+        Snapshot.withMutableSnapshot { state = 5 }
 
         assertEquals(10, result, "value after snapshot update")
 
@@ -59,9 +58,7 @@
 
         // This test uses the runTest single-threaded dispatcher for observation, which means
         // we don't flush changes to the observer until we yield() intentionally.
-        val collector = snapshotFlow { state }
-            .onEach { runCount++ }
-            .launchIn(this)
+        val collector = snapshotFlow { state }.onEach { runCount++ }.launchIn(this)
 
         assertEquals(0, runCount, "initial value - snapshot collector hasn't run yet")
         yield()
@@ -89,9 +86,7 @@
 
         // This test uses the runTest single-threaded dispatcher for observation, which means
         // we don't flush changes to the observer until we yield() intentionally.
-        val collector = snapshotFlow { state }
-            .onEach { runCount++ }
-            .launchIn(this)
+        val collector = snapshotFlow { state }.onEach { runCount++ }.launchIn(this)
         yield()
 
         assertEquals(1, runCount, "initial run")
@@ -112,13 +107,9 @@
 
         val results = mutableListOf<Int>()
 
-        val collector1 = snapshotFlow { derived2.value }
-            .onEach { results += 1 }
-            .launchIn(this)
+        val collector1 = snapshotFlow { derived2.value }.onEach { results += 1 }.launchIn(this)
 
-        val collector2 = snapshotFlow { derived2.value }
-            .onEach { results += 2 }
-            .launchIn(this)
+        val collector2 = snapshotFlow { derived2.value }.onEach { results += 2 }.launchIn(this)
 
         yield()
 
diff --git a/compose/runtime/runtime/src/nonEmulatorCommonTest/kotlin/androidx/compose/runtime/collection/MutableVectorTest.kt b/compose/runtime/runtime/src/nonEmulatorCommonTest/kotlin/androidx/compose/runtime/collection/MutableVectorTest.kt
index fe09336..491056c 100644
--- a/compose/runtime/runtime/src/nonEmulatorCommonTest/kotlin/androidx/compose/runtime/collection/MutableVectorTest.kt
+++ b/compose/runtime/runtime/src/nonEmulatorCommonTest/kotlin/androidx/compose/runtime/collection/MutableVectorTest.kt
@@ -31,18 +31,14 @@
         val l = mutableVectorOf<String>()
         assertEquals(0, l.size)
         assertEquals(16, l.content.size)
-        repeat(16) {
-            assertNull(l.content[it])
-        }
+        repeat(16) { assertNull(l.content[it]) }
     }
 
     @Test
     fun sizeConstruction() {
         val l = MutableVector<String>(4)
         assertEquals(4, l.content.size)
-        repeat(4) {
-            assertNull(l.content[it])
-        }
+        repeat(4) { assertNull(l.content[it]) }
     }
 
     @Test
@@ -204,43 +200,29 @@
     @Test
     fun map() {
         val mapped = list.map { it - 1 }
-        repeat(5) {
-            assertEquals(it, mapped[it])
-        }
+        repeat(5) { assertEquals(it, mapped[it]) }
         assertEquals(5, mapped.size)
     }
 
     @Test
     fun mapIndexed() {
-        val mapped = list.mapIndexed { index, item ->
-            index + item
-        }
+        val mapped = list.mapIndexed { index, item -> index + item }
         assertEquals(5, mapped.size)
-        repeat(5) {
-            assertEquals(it * 2 + 1, mapped[it])
-        }
+        repeat(5) { assertEquals(it * 2 + 1, mapped[it]) }
     }
 
     @Test
     fun mapIndexedNotNull() {
-        val mapped = list.mapIndexedNotNull { index, item ->
-            if (item == 5) null else index + item
-        }
+        val mapped = list.mapIndexedNotNull { index, item -> if (item == 5) null else index + item }
         assertEquals(4, mapped.size)
-        repeat(4) {
-            assertEquals(it * 2 + 1, mapped[it])
-        }
+        repeat(4) { assertEquals(it * 2 + 1, mapped[it]) }
     }
 
     @Test
     fun mapNotNull() {
-        val mapped = list.mapNotNull { item ->
-            if (item == 5) null else item - 1
-        }
+        val mapped = list.mapNotNull { item -> if (item == 5) null else item - 1 }
         assertEquals(4, mapped.size)
-        repeat(4) {
-            assertEquals(it, mapped[it])
-        }
+        repeat(4) { assertEquals(it, mapped[it]) }
     }
 
     @Test
@@ -250,9 +232,7 @@
 
     @Test
     fun firstException() {
-        assertFailsWith(NoSuchElementException::class) {
-            mutableVectorOf<String>().first()
-        }
+        assertFailsWith(NoSuchElementException::class) { mutableVectorOf<String>().first() }
     }
 
     @Test
@@ -287,9 +267,7 @@
 
     @Test
     fun lastException() {
-        assertFailsWith(NoSuchElementException::class) {
-            mutableVectorOf<String>().last()
-        }
+        assertFailsWith(NoSuchElementException::class) { mutableVectorOf<String>().last() }
     }
 
     @Test
@@ -329,12 +307,7 @@
 
     @Test
     fun foldIndexed() {
-        assertEquals(
-            "01-12-23-34-45-",
-            list.foldIndexed("") { index, acc, i ->
-                "$acc$index$i-"
-            }
-        )
+        assertEquals("01-12-23-34-45-", list.foldIndexed("") { index, acc, i -> "$acc$index$i-" })
     }
 
     @Test
@@ -346,9 +319,7 @@
     fun foldRightIndexed() {
         assertEquals(
             "45-34-23-12-01-",
-            list.foldRightIndexed("") { index, i, acc ->
-                "$acc$index$i-"
-            }
+            list.foldRightIndexed("") { index, i, acc -> "$acc$index$i-" }
         )
     }
 
@@ -453,9 +424,7 @@
         assertTrue(l.isNotEmpty())
         l.clear()
         assertTrue(l.isEmpty())
-        repeat(5) {
-            assertNull(l.content[it])
-        }
+        repeat(5) { assertNull(l.content[it]) }
     }
 
     @Test
diff --git a/compose/runtime/runtime/src/nonEmulatorCommonTest/kotlin/androidx/compose/runtime/collection/ScopeMapTest.kt b/compose/runtime/runtime/src/nonEmulatorCommonTest/kotlin/androidx/compose/runtime/collection/ScopeMapTest.kt
index 23db9fb..2de51ed 100644
--- a/compose/runtime/runtime/src/nonEmulatorCommonTest/kotlin/androidx/compose/runtime/collection/ScopeMapTest.kt
+++ b/compose/runtime/runtime/src/nonEmulatorCommonTest/kotlin/androidx/compose/runtime/collection/ScopeMapTest.kt
@@ -36,17 +36,11 @@
 
     @Test
     fun add() {
-        scopeList.forEach { scope ->
-            valueList.forEach { value ->
-                map.add(value, scope)
-            }
-        }
+        scopeList.forEach { scope -> valueList.forEach { value -> map.add(value, scope) } }
         assertEquals(valueList.size, map.size)
         val verifierList = mutableListOf<Scope>()
         valueList.forEach { value ->
-            map.forEachScopeOf(value) {
-                verifierList += it
-            }
+            map.forEachScopeOf(value) { verifierList += it }
             assertEquals(scopeList.size, verifierList.size)
             verifierList.clear()
         }
@@ -66,9 +60,7 @@
         assertEquals(1, count)
 
         val verifierSet = mutableListOf<Scope>()
-        map.forEachScopeOf(valueList[0]) { scope ->
-            verifierSet += scope
-        }
+        map.forEachScopeOf(valueList[0]) { scope -> verifierSet += scope }
         assertEquals(2, verifierSet.size)
         assertTrue(verifierSet.contains(scopeList[0]))
         assertTrue(verifierSet.contains(scopeList[1]))
@@ -111,20 +103,14 @@
         map.add(valueC, scopeList[3])
 
         // remove a scope that won't cause any values to be removed:
-        map.removeScopeIf { scope ->
-            scope === scopeList[1]
-        }
+        map.removeScopeIf { scope -> scope === scopeList[1] }
         assertEquals(3, map.size)
 
         // remove the last scope in a set:
-        map.removeScopeIf { scope ->
-            scope === scopeList[2]
-        }
+        map.removeScopeIf { scope -> scope === scopeList[2] }
         assertEquals(2, map.size)
 
-        map.forEachScopeOf(valueList[1]) {
-            fail("There shouldn't be any scopes for this value")
-        }
+        map.forEachScopeOf(valueList[1]) { fail("There shouldn't be any scopes for this value") }
     }
 
     @Test
@@ -142,5 +128,6 @@
     }
 
     class Scope(val item: Int)
+
     class Value(val s: String)
 }
diff --git a/compose/runtime/runtime/src/nonEmulatorCommonTest/kotlin/androidx/compose/runtime/snapshots/DerivedSnapshotStateTests.kt b/compose/runtime/runtime/src/nonEmulatorCommonTest/kotlin/androidx/compose/runtime/snapshots/DerivedSnapshotStateTests.kt
index f8a59eb..3490db6 100644
--- a/compose/runtime/runtime/src/nonEmulatorCommonTest/kotlin/androidx/compose/runtime/snapshots/DerivedSnapshotStateTests.kt
+++ b/compose/runtime/runtime/src/nonEmulatorCommonTest/kotlin/androidx/compose/runtime/snapshots/DerivedSnapshotStateTests.kt
@@ -43,7 +43,10 @@
     fun theCalculationIsCached() {
         var runs = 0
         var i = 0
-        val a = derivedStateOf { runs++; i }
+        val a = derivedStateOf {
+            runs++
+            i
+        }
         assertEquals(0, runs, "The calculation is run only when the value is first requested")
         i++
         assertEquals(1, a.value, "The calculation is run only when the value is first requested")
@@ -168,9 +171,7 @@
             }
 
             // Apply all the snapshots
-            repeat(count) {
-                snapshots[it].apply().check()
-            }
+            repeat(count) { snapshots[it].apply().check() }
 
             // Global should now be able to see all changes
             repeat(count) {
@@ -190,10 +191,11 @@
 
         var readCount = 0
         val readStates = mutableSetOf<Any>()
-        val snapshot = Snapshot.takeSnapshot {
-            readCount++
-            readStates.add(it)
-        }
+        val snapshot =
+            Snapshot.takeSnapshot {
+                readCount++
+                readStates.add(it)
+            }
         try {
 
             val result = snapshot.enter { derived.value }
@@ -217,9 +219,7 @@
         assertEquals(0, derived.value)
 
         val readStates = mutableListOf<Any>()
-        val snapshot = Snapshot.takeSnapshot {
-            readStates.add(it)
-        }
+        val snapshot = Snapshot.takeSnapshot { readStates.add(it) }
         try {
 
             val result = snapshot.enter { derived.value }
@@ -237,7 +237,10 @@
     @Test
     fun nullResultIsCached() {
         var runs = 0
-        val a = derivedStateOf { runs++; null }
+        val a = derivedStateOf {
+            runs++
+            null
+        }
         assertNull(a.value)
         assertEquals(1, runs)
         assertNull(a.value)
@@ -252,30 +255,22 @@
             runs++
             dependency.value
         }
-        val b = derivedStateOf {
-            a.value
-        }
+        val b = derivedStateOf { a.value }
 
         Snapshot.takeMutableSnapshot().apply {
-            enter {
-                b.value
-            }
+            enter { b.value }
             apply()
         }
 
         dependency.value++
 
         Snapshot.takeMutableSnapshot().apply {
-            enter {
-                b.value
-            }
+            enter { b.value }
             apply()
         }
 
         Snapshot.takeMutableSnapshot().apply {
-            enter {
-                b.value
-            }
+            enter { b.value }
             apply()
         }
 
diff --git a/compose/runtime/runtime/src/nonEmulatorCommonTest/kotlin/androidx/compose/runtime/snapshots/PrimitiveSnapshotStateTests.kt b/compose/runtime/runtime/src/nonEmulatorCommonTest/kotlin/androidx/compose/runtime/snapshots/PrimitiveSnapshotStateTests.kt
index 2cf4e88..2d7b17c 100644
--- a/compose/runtime/runtime/src/nonEmulatorCommonTest/kotlin/androidx/compose/runtime/snapshots/PrimitiveSnapshotStateTests.kt
+++ b/compose/runtime/runtime/src/nonEmulatorCommonTest/kotlin/androidx/compose/runtime/snapshots/PrimitiveSnapshotStateTests.kt
@@ -66,8 +66,9 @@
         val value = implementation.valueProperty.get(mutableState)
 
         assertEquals(
-            message = "The $implementation's value did not contain the expected value after " +
-                "being instantiated with value $initialValue",
+            message =
+                "The $implementation's value did not contain the expected value after " +
+                    "being instantiated with value $initialValue",
             expected = initialValue,
             actual = value
         )
@@ -84,8 +85,9 @@
         implementation.valueProperty.set(mutableState, nextValue)
 
         assertEquals(
-            message = "The $implementation's value did not contain the expected value after " +
-                "being reassigned from $initialValue to $nextValue",
+            message =
+                "The $implementation's value did not contain the expected value after " +
+                    "being reassigned from $initialValue to $nextValue",
             expected = nextValue,
             actual = implementation.valueProperty.get(mutableState)
         )
@@ -94,40 +96,41 @@
     companion object {
         @JvmStatic
         @Parameters(name = "{1}")
-        fun initParameters() = arrayOf(
+        fun initParameters() =
             arrayOf(
-                PrimitiveSnapshotStateImplementation(
-                clazz = MutableIntState::class.java,
-                creator = ::mutableIntStateOf,
-                valueProperty = MutableIntState::intValue,
-                sampleValues = generateSequence(1) { it + 1 }
-                )
-            ),
-            arrayOf(
-                PrimitiveSnapshotStateImplementation(
-                clazz = MutableLongState::class.java,
-                creator = ::mutableLongStateOf,
-                valueProperty = MutableLongState::longValue,
-                sampleValues = generateSequence(1) { it + 1 }
-                )
-            ),
-            arrayOf(
-                PrimitiveSnapshotStateImplementation(
-                clazz = MutableFloatState::class.java,
-                creator = ::mutableFloatStateOf,
-                valueProperty = MutableFloatState::floatValue,
-                sampleValues = generateSequence(1f) { it + 1 }
-                )
-            ),
-            arrayOf(
-                PrimitiveSnapshotStateImplementation(
-                clazz = MutableDoubleState::class.java,
-                creator = ::mutableDoubleStateOf,
-                valueProperty = MutableDoubleState::value,
-                sampleValues = generateSequence(1.0) { it + 1 }
+                arrayOf(
+                    PrimitiveSnapshotStateImplementation(
+                        clazz = MutableIntState::class.java,
+                        creator = ::mutableIntStateOf,
+                        valueProperty = MutableIntState::intValue,
+                        sampleValues = generateSequence(1) { it + 1 }
+                    )
+                ),
+                arrayOf(
+                    PrimitiveSnapshotStateImplementation(
+                        clazz = MutableLongState::class.java,
+                        creator = ::mutableLongStateOf,
+                        valueProperty = MutableLongState::longValue,
+                        sampleValues = generateSequence(1) { it + 1 }
+                    )
+                ),
+                arrayOf(
+                    PrimitiveSnapshotStateImplementation(
+                        clazz = MutableFloatState::class.java,
+                        creator = ::mutableFloatStateOf,
+                        valueProperty = MutableFloatState::floatValue,
+                        sampleValues = generateSequence(1f) { it + 1 }
+                    )
+                ),
+                arrayOf(
+                    PrimitiveSnapshotStateImplementation(
+                        clazz = MutableDoubleState::class.java,
+                        creator = ::mutableDoubleStateOf,
+                        valueProperty = MutableDoubleState::value,
+                        sampleValues = generateSequence(1.0) { it + 1 }
+                    )
                 )
             )
-        )
 
         data class PrimitiveSnapshotStateImplementation<S, T>(
             val clazz: Class<S>,
diff --git a/compose/runtime/runtime/src/nonEmulatorCommonTest/kotlin/androidx/compose/runtime/snapshots/SnapshotContextElementTests.kt b/compose/runtime/runtime/src/nonEmulatorCommonTest/kotlin/androidx/compose/runtime/snapshots/SnapshotContextElementTests.kt
index 7281f11..39f1085 100644
--- a/compose/runtime/runtime/src/nonEmulatorCommonTest/kotlin/androidx/compose/runtime/snapshots/SnapshotContextElementTests.kt
+++ b/compose/runtime/runtime/src/nonEmulatorCommonTest/kotlin/androidx/compose/runtime/snapshots/SnapshotContextElementTests.kt
@@ -29,16 +29,17 @@
 @OptIn(ExperimentalComposeApi::class, ExperimentalCoroutinesApi::class)
 class SnapshotContextElementTests {
     @Test
-    fun coroutineEntersExpectedSnapshot() = runTest(UnconfinedTestDispatcher()) {
-        val snapshot = Snapshot.takeSnapshot()
-        try {
-            withContext(snapshot.asContextElement()) {
-                assertSame(snapshot, Snapshot.current, "expected snapshot")
+    fun coroutineEntersExpectedSnapshot() =
+        runTest(UnconfinedTestDispatcher()) {
+            val snapshot = Snapshot.takeSnapshot()
+            try {
+                withContext(snapshot.asContextElement()) {
+                    assertSame(snapshot, Snapshot.current, "expected snapshot")
+                }
+            } finally {
+                snapshot.dispose()
             }
-        } finally {
-            snapshot.dispose()
         }
-    }
 
     @Test
     fun snapshotRestoredAfterResume() {
@@ -47,11 +48,12 @@
         try {
             runTest(UnconfinedTestDispatcher()) {
                 val stopA = Job()
-                val jobA = launch(snapshotOne.asContextElement()) {
-                    assertSame(snapshotOne, Snapshot.current, "expected snapshotOne, A")
-                    stopA.join()
-                    assertSame(snapshotOne, Snapshot.current, "expected snapshotOne, B")
-                }
+                val jobA =
+                    launch(snapshotOne.asContextElement()) {
+                        assertSame(snapshotOne, Snapshot.current, "expected snapshotOne, A")
+                        stopA.join()
+                        assertSame(snapshotOne, Snapshot.current, "expected snapshotOne, B")
+                    }
                 launch(snapshotTwo.asContextElement()) {
                     assertSame(snapshotTwo, Snapshot.current, "expected snapshotTwo, A")
                     stopA.complete()
diff --git a/compose/runtime/runtime/src/nonEmulatorCommonTest/kotlin/androidx/compose/runtime/snapshots/SnapshotDoubleIndexHeapTests.kt b/compose/runtime/runtime/src/nonEmulatorCommonTest/kotlin/androidx/compose/runtime/snapshots/SnapshotDoubleIndexHeapTests.kt
index 8ac3ebe..e87bc99 100644
--- a/compose/runtime/runtime/src/nonEmulatorCommonTest/kotlin/androidx/compose/runtime/snapshots/SnapshotDoubleIndexHeapTests.kt
+++ b/compose/runtime/runtime/src/nonEmulatorCommonTest/kotlin/androidx/compose/runtime/snapshots/SnapshotDoubleIndexHeapTests.kt
@@ -35,9 +35,7 @@
     fun canAddAndRemoveNumbersInSequence() {
         val heap = SnapshotDoubleIndexHeap()
         val handles = IntArray(100)
-        repeat(100) {
-            handles[it] = heap.add(it)
-        }
+        repeat(100) { handles[it] = heap.add(it) }
         repeat(100) {
             assertEquals(it, heap.lowestOrDefault(-1))
             heap.remove(handles[it])
@@ -72,9 +70,8 @@
             for ((value, handle) in toRemove) {
                 heap.validateHandle(handle, value)
             }
-            val lowestAdded = toRemove.fold(400) { lowest, (value, _) ->
-                if (value < lowest) value else lowest
-            }
+            val lowestAdded =
+                toRemove.fold(400) { lowest, (value, _) -> if (value < lowest) value else lowest }
             assertEquals(lowestAdded, heap.lowestOrDefault(400))
         }
     }
diff --git a/compose/runtime/runtime/src/nonEmulatorCommonTest/kotlin/androidx/compose/runtime/snapshots/SnapshotIdSetTests.kt b/compose/runtime/runtime/src/nonEmulatorCommonTest/kotlin/androidx/compose/runtime/snapshots/SnapshotIdSetTests.kt
index 848bcb2..c1e7710 100644
--- a/compose/runtime/runtime/src/nonEmulatorCommonTest/kotlin/androidx/compose/runtime/snapshots/SnapshotIdSetTests.kt
+++ b/compose/runtime/runtime/src/nonEmulatorCommonTest/kotlin/androidx/compose/runtime/snapshots/SnapshotIdSetTests.kt
@@ -26,107 +26,85 @@
     fun emptySetShouldBeEmpty() {
         val empty = SnapshotIdSet.EMPTY
 
-        repeat(1000) {
-            empty.shouldBe(it, false)
-        }
+        repeat(1000) { empty.shouldBe(it, false) }
     }
 
     @Test
     fun shouldBeAbleToSetItems() {
         val times = 10000
-        val set = (0..times).fold(SnapshotIdSet.EMPTY) { prev, index ->
-            prev.set(index)
-        }
+        val set = (0..times).fold(SnapshotIdSet.EMPTY) { prev, index -> prev.set(index) }
 
-        repeat(times) {
-            set.shouldBe(it, true)
-        }
+        repeat(times) { set.shouldBe(it, true) }
     }
 
     @Test
     fun shouldBeAbleToSetOnlyEven() {
         val times = 10000
-        val set = (0..times).fold(SnapshotIdSet.EMPTY) { prev, index ->
-            if (index % 2 == 0) prev.set(index) else prev
-        }
+        val set =
+            (0..times).fold(SnapshotIdSet.EMPTY) { prev, index ->
+                if (index % 2 == 0) prev.set(index) else prev
+            }
 
-        repeat(times) {
-            set.shouldBe(it, it % 2 == 0)
-        }
+        repeat(times) { set.shouldBe(it, it % 2 == 0) }
     }
 
     @Test
     fun shouldBeAbleToSetOnlyOdds() {
         val times = 10000
-        val set = (0..times).fold(SnapshotIdSet.EMPTY) { prev, index ->
-            if (index % 2 == 1) prev.set(index) else prev
-        }
+        val set =
+            (0..times).fold(SnapshotIdSet.EMPTY) { prev, index ->
+                if (index % 2 == 1) prev.set(index) else prev
+            }
 
-        repeat(times) {
-            set.shouldBe(it, it % 2 == 1)
-        }
+        repeat(times) { set.shouldBe(it, it % 2 == 1) }
     }
 
     @Test
     fun shouldBeAbleToClearEvens() {
         val times = 10000
-        val allSet = (0..times).fold(SnapshotIdSet.EMPTY) { prev, index ->
-            prev.set(index)
-        }
+        val allSet = (0..times).fold(SnapshotIdSet.EMPTY) { prev, index -> prev.set(index) }
 
-        val set = (0..times).fold(allSet) { prev, index ->
-            if (index % 2 == 0) prev.clear(index) else prev
-        }
+        val set =
+            (0..times).fold(allSet) { prev, index ->
+                if (index % 2 == 0) prev.clear(index) else prev
+            }
 
-        repeat(times - 1) {
-            set.shouldBe(it, it % 2 == 1)
-        }
+        repeat(times - 1) { set.shouldBe(it, it % 2 == 1) }
     }
 
     @Test
     fun shouldBeAbleToCrawlSet() {
         val times = 10000
-        val set = (0..times).fold(SnapshotIdSet.EMPTY) { prev, index ->
-            prev.clear(index - 1).set(index)
-        }
+        val set =
+            (0..times).fold(SnapshotIdSet.EMPTY) { prev, index -> prev.clear(index - 1).set(index) }
 
         set.shouldBe(times, true)
-        repeat(times - 1) {
-            set.shouldBe(it, false)
-        }
+        repeat(times - 1) { set.shouldBe(it, false) }
     }
 
     @Test
     fun shouldBeAbleToCrawlAndClear() {
         val times = 10000
-        val set = (0..times).fold(SnapshotIdSet.EMPTY) { prev, index ->
-            prev.let {
-                if ((index - 1) % 33 != 0) it.clear(index - 1) else it
-            }.set(index)
-        }
+        val set =
+            (0..times).fold(SnapshotIdSet.EMPTY) { prev, index ->
+                prev.let { if ((index - 1) % 33 != 0) it.clear(index - 1) else it }.set(index)
+            }
 
         set.shouldBe(times, true)
 
         // The multiples of 33 items should now be set
-        repeat(times - 1) {
-            set.shouldBe(it, it % 33 == 0)
-        }
+        repeat(times - 1) { set.shouldBe(it, it % 33 == 0) }
 
-        val newSet = (0 until times).fold(set) { prev, index ->
-            prev.clear(index)
-        }
+        val newSet = (0 until times).fold(set) { prev, index -> prev.clear(index) }
 
         newSet.shouldBe(times, true)
 
-        repeat(times - 1) {
-            newSet.shouldBe(it, false)
-        }
+        repeat(times - 1) { newSet.shouldBe(it, false) }
     }
 
     @Test
     fun shouldBeAbleToInsertAndRemoveOutOfOptimalRange() {
-        SnapshotIdSet.EMPTY
-            .set(1000)
+        SnapshotIdSet.EMPTY.set(1000)
             .set(1)
             .shouldBe(1000, true)
             .shouldBe(1, true)
@@ -149,43 +127,43 @@
     fun shouldMatchBooleanArray() {
         val random = Random(10)
         val booleans = BooleanArray(1000)
-        val set = (0..100).fold(SnapshotIdSet.EMPTY) { prev, _ ->
-            val value = random.nextInt(0, 1000)
-            booleans[value] = true
-            prev.set(value)
-        }
+        val set =
+            (0..100).fold(SnapshotIdSet.EMPTY) { prev, _ ->
+                val value = random.nextInt(0, 1000)
+                booleans[value] = true
+                prev.set(value)
+            }
 
-        val clear = (0..100).fold(set) { prev, _ ->
-            val value = random.nextInt(0, 1000)
-            booleans[value] = false
-            prev.clear(value)
-        }
+        val clear =
+            (0..100).fold(set) { prev, _ ->
+                val value = random.nextInt(0, 1000)
+                booleans[value] = false
+                prev.clear(value)
+            }
 
-        repeat(1000) {
-            clear.shouldBe(it, booleans[it])
-        }
+        repeat(1000) { clear.shouldBe(it, booleans[it]) }
     }
 
     @Test
     fun shouldBeAbleToAndNotBits() {
         val random = Random(11)
         val booleans = BooleanArray(1000)
-        val setA = (0..100).fold(SnapshotIdSet.EMPTY) { prev, _ ->
-            val value = random.nextInt(0, 1000)
-            booleans[value] = true
-            prev.set(value)
-        }
+        val setA =
+            (0..100).fold(SnapshotIdSet.EMPTY) { prev, _ ->
+                val value = random.nextInt(0, 1000)
+                booleans[value] = true
+                prev.set(value)
+            }
 
-        val setB = (0..100).fold(SnapshotIdSet.EMPTY) { prev, _ ->
-            val value = random.nextInt(0, 1000)
-            booleans[value] = false
-            prev.set(value)
-        }
+        val setB =
+            (0..100).fold(SnapshotIdSet.EMPTY) { prev, _ ->
+                val value = random.nextInt(0, 1000)
+                booleans[value] = false
+                prev.set(value)
+            }
 
         val set = setA.andNot(setB)
-        repeat(1000) {
-            set.shouldBe(it, booleans[it])
-        }
+        repeat(1000) { set.shouldBe(it, booleans[it]) }
     }
 
     @Test
@@ -193,22 +171,22 @@
         fun test(size: Int) {
             val random = Random(size)
             val booleans = BooleanArray(1024)
-            val setA = (0 until size).fold(SnapshotIdSet.EMPTY) { prev, index ->
-                if (random.nextInt(0, 1000) > 500) {
-                    booleans[index] = true
-                    prev.set(index)
-                } else prev
-            }
-            val setB = (0 until size).fold(SnapshotIdSet.EMPTY) { prev, index ->
-                if (random.nextInt(0, 1000) > 500) {
-                    booleans[index] = false
-                    prev.set(index)
-                } else prev
-            }
+            val setA =
+                (0 until size).fold(SnapshotIdSet.EMPTY) { prev, index ->
+                    if (random.nextInt(0, 1000) > 500) {
+                        booleans[index] = true
+                        prev.set(index)
+                    } else prev
+                }
+            val setB =
+                (0 until size).fold(SnapshotIdSet.EMPTY) { prev, index ->
+                    if (random.nextInt(0, 1000) > 500) {
+                        booleans[index] = false
+                        prev.set(index)
+                    } else prev
+                }
             val set = setA.andNot(setB)
-            repeat(size) {
-                set.shouldBe(it, booleans[it])
-            }
+            repeat(size) { set.shouldBe(it, booleans[it]) }
         }
         test(32)
         test(64)
@@ -222,22 +200,22 @@
         fun test(size: Int) {
             val random = Random(size)
             val booleans = BooleanArray(1024)
-            val setA = (0 until size).fold(SnapshotIdSet.EMPTY) { prev, index ->
-                if (random.nextInt(0, 1000) > 500) {
-                    booleans[index] = true
-                    prev.set(index)
-                } else prev
-            }
-            val setB = (0 until size).fold(SnapshotIdSet.EMPTY) { prev, index ->
-                if (random.nextInt(0, 1000) > 500) {
-                    booleans[index] = true
-                    prev.set(index)
-                } else prev
-            }
+            val setA =
+                (0 until size).fold(SnapshotIdSet.EMPTY) { prev, index ->
+                    if (random.nextInt(0, 1000) > 500) {
+                        booleans[index] = true
+                        prev.set(index)
+                    } else prev
+                }
+            val setB =
+                (0 until size).fold(SnapshotIdSet.EMPTY) { prev, index ->
+                    if (random.nextInt(0, 1000) > 500) {
+                        booleans[index] = true
+                        prev.set(index)
+                    } else prev
+                }
             val set = setA.or(setB)
-            repeat(size) {
-                set.shouldBe(it, booleans[it])
-            }
+            repeat(size) { set.shouldBe(it, booleans[it]) }
         }
         test(32)
         test(64)
@@ -251,15 +229,14 @@
         fun test(size: Int) {
             val random = Random(size)
             val values = mutableListOf<Int>()
-            val set = (0 until size).fold(SnapshotIdSet.EMPTY) { prev, index ->
-                if (random.nextInt(0, 1000) > 500) {
-                    values.add(index)
-                    prev.set(index)
-                } else prev
-            }
-            values.zip(set).forEach {
-                assertEquals(it.first, it.second)
-            }
+            val set =
+                (0 until size).fold(SnapshotIdSet.EMPTY) { prev, index ->
+                    if (random.nextInt(0, 1000) > 500) {
+                        values.add(index)
+                        prev.set(index)
+                    } else prev
+                }
+            values.zip(set).forEach { assertEquals(it.first, it.second) }
             assertEquals(values.size, set.count())
         }
 
@@ -276,14 +253,13 @@
             assertEquals(number, set.lowest(-1))
         }
 
-        repeat(64) {
-            test(it)
-        }
+        repeat(64) { test(it) }
     }
 
     @Test // Regression: b/147836978
     fun shouldValidWhenSetIsLarge() {
-        val data = """
+        val data =
+            """
 2:true,
 2:false,
 3:true,
@@ -5632,13 +5608,12 @@
 3089:false,
 3093:true"""
 
-        val operations = data.replace("\n", "").split(",").filter {
-            it.isNotEmpty()
-        }.map {
-            it.split(":").let {
-                it[0].toInt() to it[1].toBoolean()
-            }
-        }
+        val operations =
+            data
+                .replace("\n", "")
+                .split(",")
+                .filter { it.isNotEmpty() }
+                .map { it.split(":").let { it[0].toInt() to it[1].toBoolean() } }
         operations.fold(SnapshotIdSet.EMPTY) { prev, (value, op) ->
             assertTrue(prev.get(value) != op, "Error on bit $value, expected ${!op}, received $op")
             val result = if (op) prev.set(value) else prev.clear(value)
diff --git a/compose/runtime/runtime/src/nonEmulatorCommonTest/kotlin/androidx/compose/runtime/snapshots/SnapshotStateExtensionsTests.kt b/compose/runtime/runtime/src/nonEmulatorCommonTest/kotlin/androidx/compose/runtime/snapshots/SnapshotStateExtensionsTests.kt
index 636b7f5..506d37d 100644
--- a/compose/runtime/runtime/src/nonEmulatorCommonTest/kotlin/androidx/compose/runtime/snapshots/SnapshotStateExtensionsTests.kt
+++ b/compose/runtime/runtime/src/nonEmulatorCommonTest/kotlin/androidx/compose/runtime/snapshots/SnapshotStateExtensionsTests.kt
@@ -53,8 +53,9 @@
         advanceGlobalSnapshotAndSettle()
 
         assertEquals(
-            message = "asIntState() returned a State that dispatched unexpected values when its " +
-                "corresponding state had been initialized and not modified.",
+            message =
+                "asIntState() returned a State that dispatched unexpected values when its " +
+                    "corresponding state had been initialized and not modified.",
             expected = listOf(512),
             actual = intSnapshotHistory.value
         )
@@ -63,8 +64,9 @@
         advanceGlobalSnapshotAndSettle()
 
         assertEquals(
-            message = "asIntState() returned a State that dispatched unexpected values when its " +
-                "corresponding state was reassigned and changed.",
+            message =
+                "asIntState() returned a State that dispatched unexpected values when its " +
+                    "corresponding state was reassigned and changed.",
             expected = listOf(512, 1024),
             actual = intSnapshotHistory.value
         )
@@ -73,8 +75,9 @@
         advanceGlobalSnapshotAndSettle()
 
         assertEquals(
-            message = "asIntState() returned a State that dispatched unexpected values when its " +
-                "corresponding state was reassigned and changed.",
+            message =
+                "asIntState() returned a State that dispatched unexpected values when its " +
+                    "corresponding state was reassigned and changed.",
             expected = listOf(512, 1024, 2048),
             actual = intSnapshotHistory.value
         )
@@ -91,8 +94,9 @@
         advanceGlobalSnapshotAndSettle()
 
         assertEquals(
-            message = "asLongState() returned a State that dispatched unexpected values when its " +
-                "corresponding state had been initialized and not modified.",
+            message =
+                "asLongState() returned a State that dispatched unexpected values when its " +
+                    "corresponding state had been initialized and not modified.",
             expected = listOf(1000L),
             actual = longSnapshotHistory.value
         )
@@ -101,8 +105,9 @@
         advanceGlobalSnapshotAndSettle()
 
         assertEquals(
-            message = "asLongState() returned a State that dispatched unexpected values when its " +
-                "corresponding state was reassigned and changed.",
+            message =
+                "asLongState() returned a State that dispatched unexpected values when its " +
+                    "corresponding state was reassigned and changed.",
             expected = listOf(1000L, 2000L),
             actual = longSnapshotHistory.value
         )
@@ -111,8 +116,9 @@
         advanceGlobalSnapshotAndSettle()
 
         assertEquals(
-            message = "asLongState() returned a State that dispatched unexpected values when its " +
-                "corresponding state was reassigned and changed.",
+            message =
+                "asLongState() returned a State that dispatched unexpected values when its " +
+                    "corresponding state was reassigned and changed.",
             expected = listOf(1000L, 2000L, 3000L),
             actual = longSnapshotHistory.value
         )
@@ -125,14 +131,14 @@
         val snapshotObservationJob = Job()
         val state = mutableFloatStateOf(0.0f)
         val floatState = state.asFloatState()
-        val floatSnapshotHistory = getSnapshotHistory(snapshotObservationJob) {
-            floatState.floatValue
-        }
+        val floatSnapshotHistory =
+            getSnapshotHistory(snapshotObservationJob) { floatState.floatValue }
         advanceGlobalSnapshotAndSettle()
 
         assertEquals(
-            message = "asFloatState() returned a State that dispatched unexpected values when " +
-                "its corresponding state had been initialized and not modified.",
+            message =
+                "asFloatState() returned a State that dispatched unexpected values when " +
+                    "its corresponding state had been initialized and not modified.",
             expected = listOf(0f),
             actual = floatSnapshotHistory.value
         )
@@ -141,8 +147,9 @@
         advanceGlobalSnapshotAndSettle()
 
         assertEquals(
-            message = "asFloatState() returned a State that dispatched unexpected values when " +
-                "its corresponding state was reassigned and changed.",
+            message =
+                "asFloatState() returned a State that dispatched unexpected values when " +
+                    "its corresponding state was reassigned and changed.",
             expected = listOf(0f, 1f),
             actual = floatSnapshotHistory.value
         )
@@ -151,8 +158,9 @@
         advanceGlobalSnapshotAndSettle()
 
         assertEquals(
-            message = "asFloatState() returned a State that dispatched unexpected values when " +
-                "its corresponding state was reassigned and changed.",
+            message =
+                "asFloatState() returned a State that dispatched unexpected values when " +
+                    "its corresponding state was reassigned and changed.",
             expected = listOf(0f, 1f, 2f),
             actual = floatSnapshotHistory.value
         )
@@ -165,14 +173,14 @@
         val snapshotObservationJob = Job()
         val state = mutableDoubleStateOf(1.0)
         val doubleState = state.asDoubleState()
-        val doubleSnapshotHistory = getSnapshotHistory(snapshotObservationJob) {
-            doubleState.doubleValue
-        }
+        val doubleSnapshotHistory =
+            getSnapshotHistory(snapshotObservationJob) { doubleState.doubleValue }
         advanceGlobalSnapshotAndSettle()
 
         assertEquals(
-            message = "asDoubleState() returned a State that dispatched unexpected values when " +
-                "its corresponding state had been initialized and not modified.",
+            message =
+                "asDoubleState() returned a State that dispatched unexpected values when " +
+                    "its corresponding state had been initialized and not modified.",
             expected = listOf(1.0),
             actual = doubleSnapshotHistory.value
         )
@@ -181,8 +189,9 @@
         advanceGlobalSnapshotAndSettle()
 
         assertEquals(
-            message = "asDoubleState() returned a State that dispatched unexpected values when " +
-                "its corresponding state was reassigned and changed.",
+            message =
+                "asDoubleState() returned a State that dispatched unexpected values when " +
+                    "its corresponding state was reassigned and changed.",
             expected = listOf(1.0, 2.5),
             actual = doubleSnapshotHistory.value
         )
@@ -191,8 +200,9 @@
         advanceGlobalSnapshotAndSettle()
 
         assertEquals(
-            message = "asDoubleState() returned a State that dispatched unexpected values when " +
-                "its corresponding state was reassigned and changed.",
+            message =
+                "asDoubleState() returned a State that dispatched unexpected values when " +
+                    "its corresponding state was reassigned and changed.",
             expected = listOf(1.0, 2.5, 5.0),
             actual = doubleSnapshotHistory.value
         )
@@ -211,32 +221,35 @@
     ): StateFlow<List<T>> {
         // Build manually rather than use `snapshotFlow {}`, because snapshotFlow implicitly
         // has the behavior of `distinctUntilChanged()`, which hides behavior we want to test.
-        val snapshotFlow = callbackFlow<T> {
-            val readSet = mutableSetOf<Any>()
-            val readObserver: (Any) -> Unit = { readSet.add(it) }
+        val snapshotFlow =
+            callbackFlow<T> {
+                val readSet = mutableSetOf<Any>()
+                val readObserver: (Any) -> Unit = { readSet.add(it) }
 
-            fun emitLatestValue() = channel.trySendBlocking(
-                with(Snapshot.takeSnapshot(readObserver)) {
-                    try {
-                        enter { block() }
-                    } finally {
-                        dispose()
-                    }
-                }
-            )
+                fun emitLatestValue() =
+                    channel.trySendBlocking(
+                        with(Snapshot.takeSnapshot(readObserver)) {
+                            try {
+                                enter { block() }
+                            } finally {
+                                dispose()
+                            }
+                        }
+                    )
 
-            emitLatestValue()
-            val handle = Snapshot.registerApplyObserver { changed, _ ->
-                for (changedObjects in changed) {
-                    if (readSet.any { it in changed }) {
-                        emitLatestValue()
+                emitLatestValue()
+                val handle =
+                    Snapshot.registerApplyObserver { changed, _ ->
+                        for (changedObjects in changed) {
+                            if (readSet.any { it in changed }) {
+                                emitLatestValue()
+                            }
+                        }
                     }
-                }
+
+                awaitClose { handle.dispose() }
             }
 
-            awaitClose { handle.dispose() }
-        }
-
         return snapshotFlow
             .runningFold(emptyList<T>()) { acc, value -> acc + value }
             .stateIn(CoroutineScope(currentCoroutineContext() + coroutineContext))
diff --git a/compose/runtime/runtime/src/nonEmulatorCommonTest/kotlin/androidx/compose/runtime/snapshots/SnapshotStateListTests.kt b/compose/runtime/runtime/src/nonEmulatorCommonTest/kotlin/androidx/compose/runtime/snapshots/SnapshotStateListTests.kt
index 79c9a34..16d07df 100644
--- a/compose/runtime/runtime/src/nonEmulatorCommonTest/kotlin/androidx/compose/runtime/snapshots/SnapshotStateListTests.kt
+++ b/compose/runtime/runtime/src/nonEmulatorCommonTest/kotlin/androidx/compose/runtime/snapshots/SnapshotStateListTests.kt
@@ -41,9 +41,7 @@
     @Test
     fun canCreateAStateListOfInts() {
         val list = mutableStateListOf(0, 1, 2, 3, 4)
-        list.forEachIndexed { index, item ->
-            assertEquals(index, item)
-        }
+        list.forEachIndexed { index, item -> assertEquals(index, item) }
     }
 
     @Test
@@ -55,9 +53,7 @@
     @Test
     fun validateContains() {
         val list = mutableStateListOf(0, 1, 2, 3, 4)
-        (0..4).forEach {
-            assertTrue(list.contains(it))
-        }
+        (0..4).forEach { assertTrue(list.contains(it)) }
         assertFalse(list.contains(5))
     }
 
@@ -118,9 +114,7 @@
     @Test
     fun validateLastIndexOf() {
         val list = mutableStateListOf(0, 1, 2, 3, 4, 0, 1, 2, 3, 4)
-        (0..4).forEach {
-            assertEquals(it + 5, list.lastIndexOf(it))
-        }
+        (0..4).forEach { assertEquals(it + 5, list.lastIndexOf(it)) }
     }
 
     @Test
@@ -237,9 +231,7 @@
     fun validate_subList_indexOf() {
         val list = mutableStateListOf(0, 1, 2, 3, 4, 5, 6)
         val subList = list.subList(2, 5)
-        repeat(subList.size) {
-            assertEquals(it, subList.indexOf(it + 2))
-        }
+        repeat(subList.size) { assertEquals(it, subList.indexOf(it + 2)) }
         assertEquals(-1, subList.indexOf(0))
         assertEquals(-1, subList.indexOf(5))
     }
@@ -475,9 +467,7 @@
         val list = mutableStateListOf(0, 1, 2)
         list.add(3)
         assertEquals(4, list.size)
-        list.forEachIndexed { index, item ->
-            assertEquals(index, item)
-        }
+        list.forEachIndexed { index, item -> assertEquals(index, item) }
     }
 
     @Test
@@ -543,9 +533,7 @@
             list[1] = 100
             mutableList[1] = 100
             expected(mutableList, list)
-            snapshot.enter {
-                expected(original, list)
-            }
+            snapshot.enter { expected(original, list) }
         } finally {
             snapshot.dispose()
         }
@@ -558,16 +546,10 @@
         repeat(100) {
             val list = mutableStateListOf<Int>()
             coroutineScope {
-                repeat(100) { index ->
-                    launch(Dispatchers.Default) {
-                        list.add(index)
-                    }
-                }
+                repeat(100) { index -> launch(Dispatchers.Default) { list.add(index) } }
             }
 
-            repeat(100) {
-                assertTrue(list.contains(it))
-            }
+            repeat(100) { assertTrue(list.contains(it)) }
         }
     }
 
@@ -603,9 +585,7 @@
                 // Launch mutator
                 launch(Dispatchers.Default) {
                     repeat(100) { index ->
-                        lists.fastForEach { list ->
-                            list.add(index)
-                        }
+                        lists.fastForEach { list -> list.add(index) }
 
                         // Simulate the write observer
                         channel.trySend(Unit)
@@ -615,9 +595,7 @@
 
                 // Simulate the global snapshot manager
                 launch(Dispatchers.Default) {
-                    channel.consumeEach {
-                        Snapshot.notifyObjectsInitialized()
-                    }
+                    channel.consumeEach { Snapshot.notifyObjectsInitialized() }
                 }
             }
         }
@@ -648,9 +626,7 @@
 
                 // Simulate the global snapshot manager
                 launch(Dispatchers.Default) {
-                    channel.consumeEach {
-                        Snapshot.notifyObjectsInitialized()
-                    }
+                    channel.consumeEach { Snapshot.notifyObjectsInitialized() }
                 }
             }
         }
@@ -681,9 +657,7 @@
 
                 // Simulate the global snapshot manager
                 launch(Dispatchers.Default) {
-                    channel.consumeEach {
-                        Snapshot.notifyObjectsInitialized()
-                    }
+                    channel.consumeEach { Snapshot.notifyObjectsInitialized() }
                 }
             }
         }
@@ -693,14 +667,8 @@
     @Test
     fun modificationAcrossSnapshots() {
         val list = mutableStateListOf<Int>()
-        repeat(100) {
-            Snapshot.withMutableSnapshot {
-                list.add(it)
-            }
-        }
-        repeat(100) {
-            assertEquals(it, list[it])
-        }
+        repeat(100) { Snapshot.withMutableSnapshot { list.add(it) } }
+        repeat(100) { assertEquals(it, list[it]) }
     }
 
     @Test
@@ -716,17 +684,13 @@
         repeat(100) { index ->
             val current = lists[index]
             assertEquals(index + 1, current.size)
-            current.forEachIndexed { i, value ->
-                assertEquals(i, value)
-            }
+            current.forEachIndexed { i, value -> assertEquals(i, value) }
         }
     }
 
     @Test
     fun canReverseTheList() {
-        validate(List(100) { it }.toMutableStateList()) { list ->
-            list.reverse()
-        }
+        validate(List(100) { it }.toMutableStateList()) { list -> list.reverse() }
     }
 
     @Test
@@ -801,33 +765,22 @@
     @Test
     fun toStringOfSnapshotStateListDoesNotTriggerReadObserver() {
         val state = mutableStateListOf<Int>(0)
-        val normalReads = readsOf {
-            state.readable
-        }
+        val normalReads = readsOf { state.readable }
         assertEquals(1, normalReads)
-        val toStringReads = readsOf {
-            state.toString()
-        }
+        val toStringReads = readsOf { state.toString() }
         assertEquals(0, toStringReads)
     }
 
     @Test
     fun testValueOfStateListToString() {
         val state = mutableStateListOf(0, 1, 2)
-        assertEquals(
-            "SnapshotStateList(value=[0, 1, 2])@${state.hashCode()}",
-            state.toString()
-        )
+        assertEquals("SnapshotStateList(value=[0, 1, 2])@${state.hashCode()}", state.toString())
     }
 
     @Test
     fun testWritingTheSameValueDoesNotChangeTheList() {
         val state = mutableStateListOf(0, 1, 2, 3)
-        val modified = observeGlobalChanges {
-            repeat(4) {
-                state[it] = it
-            }
-        }
+        val modified = observeGlobalChanges { repeat(4) { state[it] = it } }
         assertTrue(modified.isEmpty())
     }
 
@@ -840,16 +793,12 @@
 
     private fun <T> expected(expected: List<T>, actual: List<T>) {
         assertEquals(expected.size, actual.size)
-        expected.indices.forEach {
-            assertEquals(expected[it], actual[it])
-        }
+        expected.indices.forEach { assertEquals(expected[it], actual[it]) }
     }
 
     private fun observeGlobalChanges(block: () -> Unit): Set<Any> {
         val result = mutableSetOf<Any>()
-        val handle = Snapshot.registerApplyObserver { set, _ ->
-            result.addAll(set)
-        }
+        val handle = Snapshot.registerApplyObserver { set, _ -> result.addAll(set) }
         try {
             block()
         } finally {
diff --git a/compose/runtime/runtime/src/nonEmulatorCommonTest/kotlin/androidx/compose/runtime/snapshots/SnapshotStateMapTests.kt b/compose/runtime/runtime/src/nonEmulatorCommonTest/kotlin/androidx/compose/runtime/snapshots/SnapshotStateMapTests.kt
index c5a809f..3a9c92a 100644
--- a/compose/runtime/runtime/src/nonEmulatorCommonTest/kotlin/androidx/compose/runtime/snapshots/SnapshotStateMapTests.kt
+++ b/compose/runtime/runtime/src/nonEmulatorCommonTest/kotlin/androidx/compose/runtime/snapshots/SnapshotStateMapTests.kt
@@ -46,9 +46,7 @@
 
     @Test
     fun validateSize() {
-        validateRead { map, normalMap ->
-            assertEquals(normalMap.size, map.size)
-        }
+        validateRead { map, normalMap -> assertEquals(normalMap.size, map.size) }
     }
 
     @Test
@@ -81,9 +79,7 @@
 
     @Test
     fun validateIsEmpty() {
-        validateRead { map, normalMap ->
-            assertEquals(normalMap.isEmpty(), map.isEmpty())
-        }
+        validateRead { map, normalMap -> assertEquals(normalMap.isEmpty(), map.isEmpty()) }
         validateRead(mutableStateMapOf()) { map, normalMap ->
             assertEquals(normalMap.isEmpty(), map.isEmpty())
         }
@@ -127,16 +123,12 @@
 
     @Test
     fun validateEntriesSize() {
-        validateRead { map, normalMap ->
-            assertEquals(normalMap.entries.size, map.entries.size)
-        }
+        validateRead { map, normalMap -> assertEquals(normalMap.entries.size, map.entries.size) }
     }
 
     @Test
     fun validateEntriesClear() {
-        validateWrite { map ->
-            map.entries.clear()
-        }
+        validateWrite { map -> map.entries.clear() }
     }
 
     @Test
@@ -168,11 +160,13 @@
             val normalOne = normalMap.entries.first()
             assertEquals(normalMap.entries.contains(normalOne), map.entries.contains(one))
             assertEquals(normalMap.entries.contains(one), map.entries.contains(normalOne))
-            val independent = object : MutableMap.MutableEntry<Int, Float> {
-                override val key = 1
-                override var value = 1f
-                override fun setValue(newValue: Float) = error("not supported")
-            }
+            val independent =
+                object : MutableMap.MutableEntry<Int, Float> {
+                    override val key = 1
+                    override var value = 1f
+
+                    override fun setValue(newValue: Float) = error("not supported")
+                }
             assertEquals(normalMap.entries.contains(independent), map.entries.contains(independent))
         }
     }
@@ -192,16 +186,20 @@
                 normalMap.entries.containsAll(listOf(one, two)),
                 map.entries.containsAll(listOf(normalOne, normalTwo))
             )
-            val independentOne = object : MutableMap.MutableEntry<Int, Float> {
-                override val key = 1
-                override var value = 1f
-                override fun setValue(newValue: Float) = error("not supported")
-            }
-            val independentTwo = object : MutableMap.MutableEntry<Int, Float> {
-                override val key = 1
-                override var value = 1f
-                override fun setValue(newValue: Float) = error("not supported")
-            }
+            val independentOne =
+                object : MutableMap.MutableEntry<Int, Float> {
+                    override val key = 1
+                    override var value = 1f
+
+                    override fun setValue(newValue: Float) = error("not supported")
+                }
+            val independentTwo =
+                object : MutableMap.MutableEntry<Int, Float> {
+                    override val key = 1
+                    override var value = 1f
+
+                    override fun setValue(newValue: Float) = error("not supported")
+                }
             assertEquals(
                 normalMap.entries.containsAll(listOf(independentOne, independentTwo)),
                 map.entries.containsAll(listOf(independentOne, independentTwo))
@@ -211,37 +209,27 @@
 
     @Test
     fun validateEntriesRemove() {
-        validateWrite { map ->
-            map.entries.remove(map.entries.first())
-        }
+        validateWrite { map -> map.entries.remove(map.entries.first()) }
     }
 
     @Test
     fun validateEntriesRemoveAll() {
-        validateWrite { map ->
-            map.entries.removeAll(map.entries.filter { it.key % 2 == 0 })
-        }
+        validateWrite { map -> map.entries.removeAll(map.entries.filter { it.key % 2 == 0 }) }
     }
 
     @Test
     fun validateEntriesRetainAll() {
-        validateWrite { map ->
-            map.entries.retainAll(map.entries.filter { it.key % 2 == 0 })
-        }
+        validateWrite { map -> map.entries.retainAll(map.entries.filter { it.key % 2 == 0 }) }
     }
 
     @Test
     fun validateKeysSize() {
-        validateRead { map, normalMap ->
-            assertEquals(normalMap.keys.size, map.keys.size)
-        }
+        validateRead { map, normalMap -> assertEquals(normalMap.keys.size, map.keys.size) }
     }
 
     @Test
     fun validateKeysClear() {
-        validateWrite { map ->
-            map.keys.clear()
-        }
+        validateWrite { map -> map.keys.clear() }
     }
 
     @Test
@@ -290,9 +278,7 @@
     @Test
     fun validateKeysIterator() {
         validateRead { map, normalMap ->
-            map.keys.zip(normalMap.keys).forEach {
-                assertEquals(it.second, it.first)
-            }
+            map.keys.zip(normalMap.keys).forEach { assertEquals(it.second, it.first) }
         }
     }
 
@@ -306,16 +292,12 @@
 
     @Test
     fun validateKeysRemoveAll() {
-        validateWrite { map ->
-            map.keys.removeAll(map.keys.filter { it % 2 == 0 })
-        }
+        validateWrite { map -> map.keys.removeAll(map.keys.filter { it % 2 == 0 }) }
     }
 
     @Test
     fun validateKeysRetainAll() {
-        validateWrite { map ->
-            map.keys.retainAll(map.keys.filter { it % 2 == 0 })
-        }
+        validateWrite { map -> map.keys.retainAll(map.keys.filter { it % 2 == 0 }) }
     }
 
     @Test
@@ -331,29 +313,19 @@
         validateRead { map, normalMap ->
             val l1 = listOf(1, 2, 3)
             val l2 = listOf(1, 2, 3, 100)
-            assertEquals(
-                normalMap.keys.containsAll(l1),
-                map.keys.containsAll(l1)
-            )
-            assertEquals(
-                normalMap.keys.containsAll(l2),
-                map.keys.containsAll(l2)
-            )
+            assertEquals(normalMap.keys.containsAll(l1), map.keys.containsAll(l1))
+            assertEquals(normalMap.keys.containsAll(l2), map.keys.containsAll(l2))
         }
     }
 
     @Test
     fun validateValuesSize() {
-        validateRead { map, normalMap ->
-            assertEquals(normalMap.values.size, map.values.size)
-        }
+        validateRead { map, normalMap -> assertEquals(normalMap.values.size, map.values.size) }
     }
 
     @Test
     fun validateValuesClear() {
-        validateWrite { map ->
-            map.values.clear()
-        }
+        validateWrite { map -> map.values.clear() }
     }
 
     @Test
@@ -402,9 +374,7 @@
     @Test
     fun validateValuesIterator() {
         validateRead { map, normalMap ->
-            map.values.zip(normalMap.values).forEach {
-                assertEquals(it.second, it.first)
-            }
+            map.values.zip(normalMap.values).forEach { assertEquals(it.second, it.first) }
         }
     }
 
@@ -418,16 +388,12 @@
 
     @Test
     fun validateValuesRemoveAll() {
-        validateWrite { map ->
-            map.values.removeAll(map.values.filter { it > 2f })
-        }
+        validateWrite { map -> map.values.removeAll(map.values.filter { it > 2f }) }
     }
 
     @Test
     fun validateValuesRetainAll() {
-        validateWrite { map ->
-            map.values.retainAll(map.values.filter { it > 2f })
-        }
+        validateWrite { map -> map.values.retainAll(map.values.filter { it > 2f }) }
     }
 
     @Test
@@ -443,22 +409,14 @@
         validateRead { map, normalMap ->
             val l1 = listOf(1f, 2f, 3f)
             val l2 = listOf(1f, 2f, 3f, 100f)
-            assertEquals(
-                normalMap.values.containsAll(l1),
-                map.values.containsAll(l1)
-            )
-            assertEquals(
-                normalMap.values.containsAll(l2),
-                map.values.containsAll(l2)
-            )
+            assertEquals(normalMap.values.containsAll(l1), map.values.containsAll(l1))
+            assertEquals(normalMap.values.containsAll(l2), map.values.containsAll(l2))
         }
     }
 
     @Test
     fun validateClear() {
-        validateWrite { map ->
-            map.clear()
-        }
+        validateWrite { map -> map.clear() }
     }
 
     @Test
@@ -471,9 +429,7 @@
 
     @Test
     fun validatePutAll() {
-        validateWrite { map ->
-            map.putAll(listOf(1 to 20f, 100 to 100f))
-        }
+        validateWrite { map -> map.putAll(listOf(1 to 20f, 100 to 100f)) }
     }
 
     @Test
@@ -510,9 +466,7 @@
         repeat(100) { index ->
             val current = maps[index]
             assertEquals(index + 1, current.size)
-            repeat(index) {
-                assertEquals(current[it], it.toString())
-            }
+            repeat(index) { assertEquals(current[it], it.toString()) }
         }
     }
 
@@ -523,16 +477,10 @@
         repeat(100) {
             val map = mutableStateMapOf<Int, String>()
             coroutineScope {
-                repeat(100) {
-                    launch(Dispatchers.Default) {
-                        map[it] = it.toString()
-                    }
-                }
+                repeat(100) { launch(Dispatchers.Default) { map[it] = it.toString() } }
             }
 
-            repeat(100) {
-                assertEquals(map[it], it.toString())
-            }
+            repeat(100) { assertEquals(map[it], it.toString()) }
         }
     }
 
@@ -543,30 +491,18 @@
         repeat(100) {
             val map = mutableStateMapOf(*Array(100) { it to "default" })
             coroutineScope {
-                repeat(100) {
-                    launch(Dispatchers.Default) {
-                        map[it] = it.toString()
-                    }
-                }
+                repeat(100) { launch(Dispatchers.Default) { map[it] = it.toString() } }
             }
 
-            repeat(100) {
-                assertEquals(map[it], it.toString())
-            }
+            repeat(100) { assertEquals(map[it], it.toString()) }
         }
     }
 
     @Test
     fun modificationAcrossSnapshots() {
         val map = mutableStateMapOf<Int, Int>()
-        repeat(100) {
-            Snapshot.withMutableSnapshot {
-                map[it] = it
-            }
-        }
-        repeat(100) {
-            assertEquals(it, map[it])
-        }
+        repeat(100) { Snapshot.withMutableSnapshot { map[it] = it } }
+        repeat(100) { assertEquals(it, map[it]) }
     }
 
     @Test(timeout = 30_000)
@@ -580,9 +516,7 @@
                 // Launch mutator
                 launch(Dispatchers.Default) {
                     repeat(100) { index ->
-                        maps.fastForEach { map ->
-                            map[index] = index
-                        }
+                        maps.fastForEach { map -> map[index] = index }
 
                         // Simulate the write observer
                         channel.trySend(Unit)
@@ -592,9 +526,7 @@
 
                 // Simulate the global snapshot manager
                 launch(Dispatchers.Default) {
-                    channel.consumeEach {
-                        Snapshot.notifyObjectsInitialized()
-                    }
+                    channel.consumeEach { Snapshot.notifyObjectsInitialized() }
                 }
             }
         }
@@ -625,9 +557,7 @@
 
                 // Simulate the global snapshot manager
                 launch(Dispatchers.Default) {
-                    channel.consumeEach {
-                        Snapshot.notifyObjectsInitialized()
-                    }
+                    channel.consumeEach { Snapshot.notifyObjectsInitialized() }
                 }
             }
         }
@@ -637,32 +567,23 @@
     @Test
     fun toStringOfSnapshotStateMapDoesNotTriggerReadObserver() {
         val state = mutableStateMapOf(0 to 0)
-        val normalReads = readsOf {
-            state.readable
-        }
+        val normalReads = readsOf { state.readable }
         assertEquals(1, normalReads)
-        val toStringReads = readsOf {
-            state.toString()
-        }
+        val toStringReads = readsOf { state.toString() }
         assertEquals(0, toStringReads)
     }
 
     @Test
     fun testValueOfStateMapToString() {
         val state = mutableStateMapOf(0 to 0, 1 to 1)
-        assertEquals(
-            "SnapshotStateMap(value={0=0, 1=1})@${state.hashCode()}",
-            state.toString()
-        )
+        assertEquals("SnapshotStateMap(value={0=0, 1=1})@${state.hashCode()}", state.toString())
     }
 
     private fun validateRead(
         initialMap: MutableMap<Int, Float> = defaultMap(),
         block: (Map<Int, Float>, Map<Int, Float>) -> Unit
     ) {
-        validateMaps(initialMap) { map, normalMap ->
-            block(map, normalMap)
-        }
+        validateMaps(initialMap) { map, normalMap -> block(map, normalMap) }
     }
 
     private fun validateWrite(
@@ -691,7 +612,6 @@
         }
     }
 
-    private fun defaultMap() = mutableStateMapOf(
-        1 to 1f, 2 to 2f, 3 to 3f, 4 to 4f, 5 to 1f, 6 to 2f, 7 to 3f, 8 to 4f
-    )
+    private fun defaultMap() =
+        mutableStateMapOf(1 to 1f, 2 to 2f, 3 to 3f, 4 to 4f, 5 to 1f, 6 to 2f, 7 to 3f, 8 to 4f)
 }
diff --git a/compose/runtime/runtime/src/nonEmulatorCommonTest/kotlin/androidx/compose/runtime/snapshots/SnapshotStateObserverTestsCommon.kt b/compose/runtime/runtime/src/nonEmulatorCommonTest/kotlin/androidx/compose/runtime/snapshots/SnapshotStateObserverTestsCommon.kt
index 1849164..eaa2cbd 100644
--- a/compose/runtime/runtime/src/nonEmulatorCommonTest/kotlin/androidx/compose/runtime/snapshots/SnapshotStateObserverTestsCommon.kt
+++ b/compose/runtime/runtime/src/nonEmulatorCommonTest/kotlin/androidx/compose/runtime/snapshots/SnapshotStateObserverTestsCommon.kt
@@ -90,17 +90,11 @@
         try {
             stateObserver.start()
 
-            stateObserver.observeReads(strStage1, onChangeStage1) {
-                stage1Model.value
-            }
+            stateObserver.observeReads(strStage1, onChangeStage1) { stage1Model.value }
 
-            stateObserver.observeReads(strStage2, onChangeStage2) {
-                stage2Model.value
-            }
+            stateObserver.observeReads(strStage2, onChangeStage2) { stage2Model.value }
 
-            stateObserver.observeReads(strStage3, onChangeStage3) {
-                stage3Model.value
-            }
+            stateObserver.observeReads(strStage3, onChangeStage3) { stage3Model.value }
 
             Snapshot.notifyObjectsInitialized()
 
@@ -227,9 +221,7 @@
 
         runSimpleTest { stateObserver, state ->
             stateObserver.observeReads(data, { changes++ }) {
-                stateObserver.withNoObservations {
-                    state.value
-                }
+                stateObserver.withNoObservations { state.value }
             }
         }
 
@@ -243,9 +235,7 @@
 
         runSimpleTest { stateObserver, state ->
             stateObserver.observeReads(data, { changes++ }) {
-                Snapshot.withoutReadObservation {
-                    state.value
-                }
+                Snapshot.withoutReadObservation { state.value }
             }
         }
 
@@ -259,9 +249,7 @@
 
         runSimpleTest { stateObserver, state ->
             stateObserver.observeReads(data, { changes++ }) {
-                Snapshot.withoutReadObservation {
-                    state.value
-                }
+                Snapshot.withoutReadObservation { state.value }
                 state.value
             }
         }
@@ -278,9 +266,7 @@
         runSimpleTest { stateObserver, state ->
             stateObserver.observeReads(data, { _ -> changes++ }) {
                 stateObserver.withNoObservations {
-                    stateObserver.withNoObservations {
-                        state.value
-                    }
+                    stateObserver.withNoObservations { state.value }
                     state.value
                 }
             }
@@ -297,9 +283,7 @@
         runSimpleTest { stateObserver, state ->
             stateObserver.observeReads(data, { changes++ }) {
                 Snapshot.withoutReadObservation {
-                    Snapshot.withoutReadObservation {
-                        state.value
-                    }
+                    Snapshot.withoutReadObservation { state.value }
                     state.value
                 }
             }
@@ -314,9 +298,7 @@
         var changes = 0
 
         runSimpleTest { stateObserver, state ->
-            stateObserver.observeReads(data, { _ -> changes++ }) {
-                state.value
-            }
+            stateObserver.observeReads(data, { _ -> changes++ }) { state.value }
         }
 
         assertEquals(1, changes)
@@ -332,9 +314,7 @@
         runSimpleTest { stateObserver, state ->
             stateObserver.observeReads(data, { _ -> changes1++ }) {
                 stateObserver.withNoObservations {
-                    stateObserver.observeReads(data, { _ -> changes2++ }) {
-                        state.value
-                    }
+                    stateObserver.observeReads(data, { _ -> changes2++ }) { state.value }
                 }
             }
         }
@@ -351,9 +331,7 @@
         runSimpleTest { stateObserver, state ->
             stateObserver.observeReads(data, { changes1++ }) {
                 Snapshot.withoutReadObservation {
-                    stateObserver.observeReads(data, { changes2++ }) {
-                        state.value
-                    }
+                    stateObserver.observeReads(data, { changes2++ }) { state.value }
                 }
             }
         }
@@ -369,9 +347,7 @@
         runSimpleTest { stateObserver, state ->
             stateObserver.observeReads("scope1", { changes1++ }) {
                 stateObserver.observeReads("scope2", { changes2++ }) {
-                    Snapshot.withoutReadObservation {
-                        state.value
-                    }
+                    Snapshot.withoutReadObservation { state.value }
                 }
             }
         }
@@ -389,9 +365,7 @@
                 stateObserver.observeReads("scope2", { changes2++ }) {
                     Snapshot.withoutReadObservation {
                         val newSnapshot = Snapshot.takeMutableSnapshot()
-                        newSnapshot.enter {
-                            state.value
-                        }
+                        newSnapshot.enter { state.value }
                         newSnapshot.apply().check()
                         newSnapshot.dispose()
                     }
@@ -412,9 +386,7 @@
                 stateObserver.observeReads("scope2", { changes2++ }) {
                     Snapshot.withoutReadObservation {
                         val newSnapshot = Snapshot.takeSnapshot()
-                        newSnapshot.enter {
-                            state.value
-                        }
+                        newSnapshot.enter { state.value }
                         newSnapshot.dispose()
                     }
                 }
@@ -431,11 +403,7 @@
         runSimpleTest { stateObserver, state ->
             stateObserver.observeReads("scope", { changes++ }) {
                 val newSnapshot = Snapshot.takeSnapshot()
-                newSnapshot.enter {
-                    Snapshot.withoutReadObservation {
-                        state.value
-                    }
-                }
+                newSnapshot.enter { Snapshot.withoutReadObservation { state.value } }
                 newSnapshot.dispose()
             }
         }
@@ -591,9 +559,7 @@
             }
 
             // read the same state in other scope
-            stateObserver.observeReads("other scope", onChange) {
-                derivedState.value
-            }
+            stateObserver.observeReads("other scope", onChange) { derivedState.value }
 
             // advance snapshot to invalidate reads
             Snapshot.notifyObjectsInitialized()
@@ -752,19 +718,13 @@
         }
 
         runSimpleTest { stateObserver, layoutState ->
-            val derivedState = derivedStateOf {
-                layoutState.value
-            }
+            val derivedState = derivedStateOf { layoutState.value }
 
             // record observation for a draw scope
-            stateObserver.observeReads("draw", changeBlock) {
-                derivedState.value
-            }
+            stateObserver.observeReads("draw", changeBlock) { derivedState.value }
 
             // record observation for a different draw scope
-            stateObserver.observeReads("draw_1", changeBlock) {
-                derivedState.value
-            }
+            stateObserver.observeReads("draw_1", changeBlock) { derivedState.value }
 
             Snapshot.sendApplyNotifications()
 
diff --git a/compose/runtime/runtime/src/nonEmulatorCommonTest/kotlin/androidx/compose/runtime/snapshots/SnapshotTests.kt b/compose/runtime/runtime/src/nonEmulatorCommonTest/kotlin/androidx/compose/runtime/snapshots/SnapshotTests.kt
index ec19dc7..4fd2767 100644
--- a/compose/runtime/runtime/src/nonEmulatorCommonTest/kotlin/androidx/compose/runtime/snapshots/SnapshotTests.kt
+++ b/compose/runtime/runtime/src/nonEmulatorCommonTest/kotlin/androidx/compose/runtime/snapshots/SnapshotTests.kt
@@ -127,9 +127,7 @@
             }
 
             // Ensure the modifications in snapshots are not visible to global
-            repeat(count) {
-                assertEquals(0, state[it].value)
-            }
+            repeat(count) { assertEquals(0, state[it].value) }
 
             // Ensure snapshots can see their own value but no other changes
             repeat(count) { index ->
@@ -142,14 +140,10 @@
             }
 
             // Apply all the snapshots
-            repeat(count) {
-                snapshots[it].apply().check()
-            }
+            repeat(count) { snapshots[it].apply().check() }
 
             // Global should now be able to see all changes
-            repeat(count) {
-                assertEquals(it, state[it].value)
-            }
+            repeat(count) { assertEquals(it, state[it].value) }
         } finally {
             // Dispose the snapshots
             snapshots.forEach { it.dispose() }
@@ -192,9 +186,7 @@
         val state = mutableStateOf<Int>(0)
 
         val readStates = mutableListOf<Any>()
-        val snapshot = takeSnapshot {
-            readStates.add(it)
-        }
+        val snapshot = takeSnapshot { readStates.add(it) }
         try {
 
             val result = snapshot.enter { state.value }
@@ -211,9 +203,7 @@
     fun stateWritesCanBeObserved() {
         val state = mutableStateOf<Int>(0)
         val writtenStates = mutableListOf<Any>()
-        val snapshot = takeMutableSnapshot { write ->
-            writtenStates.add(write)
-        }
+        val snapshot = takeMutableSnapshot { write -> writtenStates.add(write) }
         try {
             snapshot.enter {
                 assertEquals(0, writtenStates.size)
@@ -231,15 +221,14 @@
     fun appliesCanBeObserved() {
         val state = mutableStateOf<Int>(0)
         var observedSnapshot: Snapshot? = null
-        val unregister = Snapshot.registerApplyObserver { changed, snapshot ->
-            assertTrue(state in changed)
-            observedSnapshot = snapshot
-        }
+        val unregister =
+            Snapshot.registerApplyObserver { changed, snapshot ->
+                assertTrue(state in changed)
+                observedSnapshot = snapshot
+            }
         val snapshot = takeMutableSnapshot()
         try {
-            snapshot.enter {
-                state.value = 2
-            }
+            snapshot.enter { state.value = 2 }
             assertEquals(null, observedSnapshot)
             snapshot.apply().check()
             assertEquals(snapshot, observedSnapshot)
@@ -256,10 +245,11 @@
         Snapshot.notifyObjectsInitialized()
 
         var applyObserved = false
-        val unregister = Snapshot.registerApplyObserver { changed, _ ->
-            assertTrue(state in changed)
-            applyObserved = true
-        }
+        val unregister =
+            Snapshot.registerApplyObserver { changed, _ ->
+                assertTrue(state in changed)
+                applyObserved = true
+            }
         try {
             state.value = 2
 
@@ -280,9 +270,10 @@
         val state = mutableStateOf(0)
 
         var notificationsPendingWhileObserving = false
-        val unregister = Snapshot.registerApplyObserver { _, _ ->
-            notificationsPendingWhileObserving = Snapshot.isApplyObserverNotificationPending
-        }
+        val unregister =
+            Snapshot.registerApplyObserver { _, _ ->
+                notificationsPendingWhileObserving = Snapshot.isApplyObserverNotificationPending
+            }
 
         try {
             // Normally not pending
@@ -395,23 +386,25 @@
     @Test
     fun aParentSnapshotCanAccessAStatObjectedCreateByANestedSnapshot() {
         val snapshot = takeMutableSnapshot()
-        val state = try {
-            val nested = snapshot.takeNestedMutableSnapshot()
-            val state = try {
-                nested.notifyObjectsInitialized()
-                val state = nested.enter { mutableStateOf<Int>(1) }
-                assertEquals(1, nested.enter { state.value })
-                nested.apply().check()
+        val state =
+            try {
+                val nested = snapshot.takeNestedMutableSnapshot()
+                val state =
+                    try {
+                        nested.notifyObjectsInitialized()
+                        val state = nested.enter { mutableStateOf<Int>(1) }
+                        assertEquals(1, nested.enter { state.value })
+                        nested.apply().check()
+                        state
+                    } finally {
+                        nested.dispose()
+                    }
+                assertEquals(1, snapshot.enter { state.value })
+                snapshot.apply().check()
                 state
             } finally {
-                nested.dispose()
+                snapshot.dispose()
             }
-            assertEquals(1, snapshot.enter { state.value })
-            snapshot.apply().check()
-            state
-        } finally {
-            snapshot.dispose()
-        }
         assertEquals(1, state.value)
     }
 
@@ -598,12 +591,13 @@
         val snapshot1 = takeMutableSnapshot()
         val snapshot2 = takeMutableSnapshot()
         try {
-            val changes = changesOf(state) {
-                snapshot1.enter { state.value = 1 }
-                snapshot2.enter { state.value = 1 }
-                snapshot1.apply().check()
-                snapshot2.apply().check()
-            }
+            val changes =
+                changesOf(state) {
+                    snapshot1.enter { state.value = 1 }
+                    snapshot2.enter { state.value = 1 }
+                    snapshot1.apply().check()
+                    snapshot2.apply().check()
+                }
             assertEquals(1, changes)
         } finally {
             snapshot1.dispose()
@@ -657,9 +651,7 @@
     fun changingAnEqualityPolicyStateToItsCurrentValueIsNotConsideredAChange() {
         val value = boxInt(0)
         val state = mutableStateOf(value, referentialEqualityPolicy())
-        val changes = changesOf(state) {
-            state.value = value
-        }
+        val changes = changesOf(state) { state.value = value }
         assertEquals(0, changes)
     }
 
@@ -667,22 +659,16 @@
     fun changingANeverEqualPolicyStateToItsCurrentValueIsConsideredAChange() {
         val value = boxInt(0)
         val state = mutableStateOf(value, neverEqualPolicy())
-        val changes = changesOf(state) {
-            state.value = value
-        }
+        val changes = changesOf(state) { state.value = value }
         assertEquals(1, changes)
     }
 
     @Test
     fun toStringOfMutableStateDoesNotTriggerReadObserver() {
         val state = mutableStateOf<Int>(0)
-        val normalReads = readsOf {
-            state.value
-        }
+        val normalReads = readsOf { state.value }
         assertEquals(1, normalReads)
-        val toStringReads = readsOf {
-            state.toString()
-        }
+        val toStringReads = readsOf { state.toString() }
         assertEquals(0, toStringReads)
     }
 
@@ -690,9 +676,7 @@
     fun toStringOfDerivedStateDoesNotTriggerReadObservers() {
         val state = mutableStateOf<Int>(0)
         val derived = derivedStateOf { state.value + 1 }
-        val toStringReads = readsOf {
-            derived.toString()
-        }
+        val toStringReads = readsOf { derived.toString() }
         assertEquals(0, toStringReads)
     }
 
@@ -756,21 +740,20 @@
 
     @Test // Regression test for b/193006595
     fun transparentSnapshotAdvancesCorrectly() {
-        val state = Snapshot.observe({}) {
-            // In a transparent snapshot, advance the global snapshot
-            Snapshot.notifyObjectsInitialized()
+        val state =
+            Snapshot.observe({}) {
+                // In a transparent snapshot, advance the global snapshot
+                Snapshot.notifyObjectsInitialized()
 
-            // Create an apply an object in a snapshot
-            val state = atomic {
-                mutableStateOf<Int>(0)
+                // Create an apply an object in a snapshot
+                val state = atomic { mutableStateOf<Int>(0) }
+
+                // Ensure that the object can be accessed in the observer
+                assertEquals(0, state.value)
+
+                state
             }
 
-            // Ensure that the object can be accessed in the observer
-            assertEquals(0, state.value)
-
-            state
-        }
-
         // Ensure that the object can be accessed globally.
         assertEquals(0, state.value)
     }
@@ -808,15 +791,9 @@
         val snapshot1 = takeMutableSnapshot()
         val snapshot2 = takeMutableSnapshot()
         try {
-            snapshot2.enter {
-                state = 1
-            }
+            snapshot2.enter { state = 1 }
 
-            snapshot1.enter {
-                Snapshot.withMutableSnapshot {
-                    assertEquals(0, state)
-                }
-            }
+            snapshot1.enter { Snapshot.withMutableSnapshot { assertEquals(0, state) } }
         } finally {
             snapshot1.dispose()
             snapshot2.dispose()
@@ -831,16 +808,12 @@
         val snapshot1 = takeMutableSnapshot()
         val snapshot2 = takeMutableSnapshot()
         try {
-            snapshot2.enter {
-                state = 1
-            }
+            snapshot2.enter { state = 1 }
 
             snapshot1.enter {
                 val nestedSnapshot = takeSnapshot()
                 try {
-                    nestedSnapshot.enter {
-                        assertEquals(0, state)
-                    }
+                    nestedSnapshot.enter { assertEquals(0, state) }
                 } finally {
                     nestedSnapshot.dispose()
                 }
@@ -854,24 +827,21 @@
     @Test
     fun canTakeNestedSnapshotsFromApplyObserver() {
         var takenSnapshot: Snapshot? = null
-        val observer = Snapshot.registerApplyObserver { _, snapshot ->
-            if (takenSnapshot != null) error("already took a nested snapshot")
-            takenSnapshot = snapshot.takeNestedSnapshot()
-        }
+        val observer =
+            Snapshot.registerApplyObserver { _, snapshot ->
+                if (takenSnapshot != null) error("already took a nested snapshot")
+                takenSnapshot = snapshot.takeNestedSnapshot()
+            }
 
         try {
             var state by mutableStateOf("initial")
-            Snapshot.withMutableSnapshot {
-                state = "before observer snapshot"
-            }
+            Snapshot.withMutableSnapshot { state = "before observer snapshot" }
 
             state = "after observer snapshot"
 
             val observerSnapshot = takenSnapshot ?: fail("snapshot was not taken by observer")
 
-            observerSnapshot.enter {
-                assertEquals("before observer snapshot", state)
-            }
+            observerSnapshot.enter { assertEquals("before observer snapshot", state) }
         } finally {
             observer.dispose()
             takenSnapshot?.dispose()
@@ -881,18 +851,17 @@
     @Test
     fun canTakeNestedMutableSnapshotsFromApplyObserver() {
         var takenSnapshot: MutableSnapshot? = null
-        val observer = Snapshot.registerApplyObserver { _, snapshot ->
-            if (takenSnapshot != null) error("already took a nested snapshot")
-            takenSnapshot = (snapshot as? MutableSnapshot)
-                ?.takeNestedMutableSnapshot()
-                ?: error("Applied snapshot was not mutable")
-        }
+        val observer =
+            Snapshot.registerApplyObserver { _, snapshot ->
+                if (takenSnapshot != null) error("already took a nested snapshot")
+                takenSnapshot =
+                    (snapshot as? MutableSnapshot)?.takeNestedMutableSnapshot()
+                        ?: error("Applied snapshot was not mutable")
+            }
 
         try {
             var state by mutableStateOf("initial")
-            Snapshot.withMutableSnapshot {
-                state = "before observer snapshot"
-            }
+            Snapshot.withMutableSnapshot { state = "before observer snapshot" }
 
             state = "after observer snapshot"
 
@@ -903,8 +872,10 @@
                 state = "change made by observer snapshot"
             }
 
-            assertFalse(observerSnapshot.apply().succeeded,
-                "applying observer snapshot with conflicting change")
+            assertFalse(
+                observerSnapshot.apply().succeeded,
+                "applying observer snapshot with conflicting change"
+            )
         } finally {
             observer.dispose()
             takenSnapshot?.dispose()
@@ -941,8 +912,7 @@
             // Expected exception
             assertTrue(
                 ise.message?.let {
-                    it.contains("Snapshot is not open") &&
-                        it.contains("applied=")
+                    it.contains("Snapshot is not open") && it.contains("applied=")
                 } == true,
                 "Incorrect message: ${ise.message}"
             )
@@ -964,8 +934,7 @@
             // Expected exception
             assertTrue(
                 ise.message?.let {
-                    it.contains("Snapshot is not open") &&
-                        it.contains("applied=")
+                    it.contains("Snapshot is not open") && it.contains("applied=")
                 } == true,
                 "Incorrect message: ${ise.message}"
             )
@@ -1024,19 +993,20 @@
 
     @Test
     fun testNestedWithinTransparentSnapshotDisposedCorrectly() {
-        val outerSnapshot = TransparentObserverSnapshot(
-            previousSnapshot = currentSnapshot(),
-            specifiedReadObserver = null,
-            mergeParentObservers = false,
-            ownsPreviousSnapshot = false
-        )
+        val outerSnapshot =
+            TransparentObserverSnapshot(
+                previousSnapshot = currentSnapshot(),
+                specifiedReadObserver = null,
+                mergeParentObservers = false,
+                ownsPreviousSnapshot = false
+            )
 
         try {
             outerSnapshot.enter {
                 val innerSnapshot = outerSnapshot.takeNestedSnapshot()
 
                 try {
-                    innerSnapshot.enter { }
+                    innerSnapshot.enter {}
                 } finally {
                     innerSnapshot.dispose()
                 }
@@ -1048,20 +1018,21 @@
 
     @Test
     fun testNestedWithinTransparentMutableSnapshotDisposedCorrectly() {
-        val outerSnapshot = TransparentObserverMutableSnapshot(
-            parentSnapshot = currentSnapshot() as? MutableSnapshot,
-            specifiedReadObserver = null,
-            specifiedWriteObserver = null,
-            mergeParentObservers = false,
-            ownsParentSnapshot = false
-        )
+        val outerSnapshot =
+            TransparentObserverMutableSnapshot(
+                parentSnapshot = currentSnapshot() as? MutableSnapshot,
+                specifiedReadObserver = null,
+                specifiedWriteObserver = null,
+                mergeParentObservers = false,
+                ownsParentSnapshot = false
+            )
 
         try {
             outerSnapshot.enter {
                 val innerSnapshot = outerSnapshot.takeNestedSnapshot()
 
                 try {
-                    innerSnapshot.enter { }
+                    innerSnapshot.enter {}
                 } finally {
                     innerSnapshot.dispose()
                 }
@@ -1077,18 +1048,18 @@
         var innerChanges = 0
         val state by mutableStateOf<Int>(0)
 
-        val outerSnapshot = TransparentObserverSnapshot(
-            previousSnapshot = currentSnapshot(),
-            specifiedReadObserver = { outerChanges++ },
-            mergeParentObservers = false,
-            ownsPreviousSnapshot = false
-        )
+        val outerSnapshot =
+            TransparentObserverSnapshot(
+                previousSnapshot = currentSnapshot(),
+                specifiedReadObserver = { outerChanges++ },
+                mergeParentObservers = false,
+                ownsPreviousSnapshot = false
+            )
 
         try {
             outerSnapshot.enter {
-                val innerSnapshot = outerSnapshot.takeNestedSnapshot(
-                    readObserver = { innerChanges++ }
-                )
+                val innerSnapshot =
+                    outerSnapshot.takeNestedSnapshot(readObserver = { innerChanges++ })
 
                 try {
                     innerSnapshot.enter {
@@ -1112,19 +1083,19 @@
         var innerChanges = 0
         val state by mutableStateOf<Int>(0)
 
-        val outerSnapshot = TransparentObserverMutableSnapshot(
-            parentSnapshot = currentSnapshot() as? MutableSnapshot,
-            specifiedReadObserver = { outerChanges++ },
-            specifiedWriteObserver = null,
-            mergeParentObservers = false,
-            ownsParentSnapshot = false
-        )
+        val outerSnapshot =
+            TransparentObserverMutableSnapshot(
+                parentSnapshot = currentSnapshot() as? MutableSnapshot,
+                specifiedReadObserver = { outerChanges++ },
+                specifiedWriteObserver = null,
+                mergeParentObservers = false,
+                ownsParentSnapshot = false
+            )
 
         try {
             outerSnapshot.enter {
-                val innerSnapshot = outerSnapshot.takeNestedSnapshot(
-                    readObserver = { innerChanges++ }
-                )
+                val innerSnapshot =
+                    outerSnapshot.takeNestedSnapshot(readObserver = { innerChanges++ })
 
                 try {
                     innerSnapshot.enter {
@@ -1163,17 +1134,11 @@
         val snapshot2 = takeMutableSnapshot()
         val snapshot3 = takeMutableSnapshot()
 
-        snapshot1.enter {
-            state.value = 1
-        }
+        snapshot1.enter { state.value = 1 }
 
-        snapshot2.enter {
-            state.value = 1
-        }
+        snapshot2.enter { state.value = 1 }
 
-        snapshot3.enter {
-            state.value = 1
-        }
+        snapshot3.enter { state.value = 1 }
 
         snapshot1.apply()
         snapshot2.apply()
@@ -1196,17 +1161,11 @@
         val snapshot2 = takeMutableSnapshot()
         val snapshot3 = takeMutableSnapshot()
 
-        snapshot1.enter {
-            state1.value = 1
-        }
+        snapshot1.enter { state1.value = 1 }
 
-        snapshot2.enter {
-            state2.value = 2
-        }
+        snapshot2.enter { state2.value = 2 }
 
-        snapshot3.enter {
-            state3.value = 3
-        }
+        snapshot3.enter { state3.value = 3 }
 
         snapshot1.apply()
         snapshot2.apply()
@@ -1231,9 +1190,7 @@
     fun testWriteCount() {
         val state = mutableStateOf<Int>(0)
         val writtenStates = mutableListOf<Any>()
-        val snapshot = takeMutableSnapshot { write ->
-            writtenStates.add(write)
-        }
+        val snapshot = takeMutableSnapshot { write -> writtenStates.add(write) }
         try {
             snapshot.enter {
                 assertEquals(0, writtenStates.size)
@@ -1253,13 +1210,14 @@
     @Test
     fun testTransparentSnapshotWriteCount() {
         val state = mutableStateOf<Int>(0)
-        val transparentSnapshot = TransparentObserverMutableSnapshot(
-            parentSnapshot = currentSnapshot() as? MutableSnapshot,
-            specifiedReadObserver = null,
-            specifiedWriteObserver = null,
-            mergeParentObservers = false,
-            ownsParentSnapshot = false
-        )
+        val transparentSnapshot =
+            TransparentObserverMutableSnapshot(
+                parentSnapshot = currentSnapshot() as? MutableSnapshot,
+                specifiedReadObserver = null,
+                specifiedWriteObserver = null,
+                mergeParentObservers = false,
+                ownsParentSnapshot = false
+            )
         try {
             transparentSnapshot.enter {
                 assertEquals(0, transparentSnapshot.writeCount)
@@ -1277,40 +1235,85 @@
         fun <T, V> test(create: () -> T, read: (T) -> V, update: (T) -> V) {
             val snapshot = takeMutableSnapshot()
             val created: Any? = null
-            val modified = observeChanges(snapshot) {
-                val (state, initial) = snapshot.enter {
-                    val state = create()
-                    state to read(state)
+            val modified =
+                observeChanges(snapshot) {
+                    val (state, initial) =
+                        snapshot.enter {
+                            val state = create()
+                            state to read(state)
+                        }
+
+                    // Ensure the value is accessible and has its initial state
+                    assertEquals(initial, read(state))
+                    val newValue = snapshot.enter { update(state) }
+
+                    // Ensure the test actually modified it
+                    assertNotEquals(initial, newValue)
+
+                    // Ensure the value still has its initial state
+                    assertEquals(initial, read(state))
+                    snapshot.apply().check()
+
+                    // Ensure the value now has the modified state
+                    assertEquals(newValue, read(state))
                 }
 
-                // Ensure the value is accessible and has its initial state
-                assertEquals(initial, read(state))
-                val newValue = snapshot.enter {
-                    update(state)
-                }
-
-                // Ensure the test actually modified it
-                assertNotEquals(initial, newValue)
-
-                // Ensure the value still has its initial state
-                assertEquals(initial, read(state))
-                snapshot.apply().check()
-
-                // Ensure the value now has the modified state
-                assertEquals(newValue, read(state))
-            }
-
             // The object is not considered modified
             assertFalse(created in modified)
         }
 
-        test({ mutableStateOf("A") }, { it.value }) { it.value = "B"; "B" }
-        test({ mutableIntStateOf(1) }, { it.value }, { it.value = 2; 2 })
-        test({ mutableLongStateOf(1L) }, { it.value }, { it.value = 2L; 2L })
-        test({ mutableFloatStateOf(1f) }, { it.value }, { it.value = 2f; 2f })
-        test({ mutableDoubleStateOf(1.0) }, { it.value }, { it.value = 2.0; 2.0 })
-        test({ mutableStateListOf<Int>() }, { it.isEmpty() }, { it.add(1); it.isEmpty() })
-        test({ mutableStateMapOf<Int, Int>() }, { it.isEmpty() }, { it[23] = 42; it.isEmpty() })
+        test({ mutableStateOf("A") }, { it.value }) {
+            it.value = "B"
+            "B"
+        }
+        test(
+            { mutableIntStateOf(1) },
+            { it.value },
+            {
+                it.value = 2
+                2
+            }
+        )
+        test(
+            { mutableLongStateOf(1L) },
+            { it.value },
+            {
+                it.value = 2L
+                2L
+            }
+        )
+        test(
+            { mutableFloatStateOf(1f) },
+            { it.value },
+            {
+                it.value = 2f
+                2f
+            }
+        )
+        test(
+            { mutableDoubleStateOf(1.0) },
+            { it.value },
+            {
+                it.value = 2.0
+                2.0
+            }
+        )
+        test(
+            { mutableStateListOf<Int>() },
+            { it.isEmpty() },
+            {
+                it.add(1)
+                it.isEmpty()
+            }
+        )
+        test(
+            { mutableStateMapOf<Int, Int>() },
+            { it.isEmpty() },
+            {
+                it[23] = 42
+                it.isEmpty()
+            }
+        )
     }
 
     @Test
@@ -1326,11 +1329,7 @@
         val snapshot = takeSnapshot(readObserver1)
         try {
             snapshot.enter {
-                Snapshot.observe(readObserver2) {
-                    Snapshot.observe(readObserver3) {
-                        state.value
-                    }
-                }
+                Snapshot.observe(readObserver2) { Snapshot.observe(readObserver3) { state.value } }
             }
         } finally {
             snapshot.dispose()
@@ -1367,9 +1366,8 @@
 
 internal fun <T> changesOf(state: State<T>, block: () -> Unit): Int {
     var changes = 0
-    val removeObserver = Snapshot.registerApplyObserver { states, _ ->
-        if (states.contains(state)) changes++
-    }
+    val removeObserver =
+        Snapshot.registerApplyObserver { states, _ -> if (states.contains(state)) changes++ }
     try {
         block()
         Snapshot.sendApplyNotifications()
@@ -1381,9 +1379,10 @@
 
 internal fun observeChanges(snapshot: Snapshot, block: () -> Unit): Set<Any> {
     var changes = setOf<Any>()
-    val removeObserver = Snapshot.registerApplyObserver { states, changedSnapshot ->
-        if (changedSnapshot == snapshot) changes = states
-    }
+    val removeObserver =
+        Snapshot.registerApplyObserver { states, changedSnapshot ->
+            if (changedSnapshot == snapshot) changes = states
+        }
     try {
         block()
         Snapshot.sendApplyNotifications()
@@ -1408,9 +1407,7 @@
     val snapshot = takeMutableSnapshot()
     val result: T
     try {
-        result = snapshot.enter {
-            block()
-        }
+        result = snapshot.enter { block() }
         snapshot.apply().check()
     } finally {
         snapshot.dispose()
diff --git a/compose/runtime/runtime/src/nonEmulatorCommonTest/kotlin/androidx/compose/runtime/tooling/CompositionDataTests.kt b/compose/runtime/runtime/src/nonEmulatorCommonTest/kotlin/androidx/compose/runtime/tooling/CompositionDataTests.kt
index af749be..6e7472b 100644
--- a/compose/runtime/runtime/src/nonEmulatorCommonTest/kotlin/androidx/compose/runtime/tooling/CompositionDataTests.kt
+++ b/compose/runtime/runtime/src/nonEmulatorCommonTest/kotlin/androidx/compose/runtime/tooling/CompositionDataTests.kt
@@ -40,21 +40,22 @@
 
     @Test
     fun canIterateASlotTable() {
-        val slots = SlotTable().also {
-            it.write { writer ->
-                writer.insert {
-                    writer.group(1) {
-                        for (i in 1..5) {
-                            writer.group(i * 10) {
-                                for (j in 1..i) {
-                                    writer.update(i * 100 + j)
+        val slots =
+            SlotTable().also {
+                it.write { writer ->
+                    writer.insert {
+                        writer.group(1) {
+                            for (i in 1..5) {
+                                writer.group(i * 10) {
+                                    for (j in 1..i) {
+                                        writer.update(i * 100 + j)
+                                    }
                                 }
                             }
                         }
                     }
                 }
             }
-        }
 
         slots.verifyWellFormed()
 
@@ -73,11 +74,27 @@
 
         assertEquals(
             listOf(
-                1, 10, 101,
-                20, 201, 202,
-                30, 301, 302, 303,
-                40, 401, 402, 403, 404,
-                50, 501, 502, 503, 504, 505
+                1,
+                10,
+                101,
+                20,
+                201,
+                202,
+                30,
+                301,
+                302,
+                303,
+                40,
+                401,
+                402,
+                403,
+                404,
+                50,
+                501,
+                502,
+                503,
+                504,
+                505
             ),
             list
         )
@@ -86,28 +103,27 @@
     @Test
     fun canFindNodes() {
         val data = List(26) { 'A' + it }
-        val slots = SlotTable().also {
-            it.write { writer ->
-                writer.insert {
-                    writer.group(0) {
-                        fun emit(a: List<Char>) {
-                            if (a.isNotEmpty()) {
-                                writer.group(1) {
-                                    val mid = (a.size - 1) / 2 + 1
-                                    writer.nodeGroup(10, a[0])
-                                    if (mid > 1)
-                                        emit(a.subList(1, mid))
-                                    if (mid < a.size)
-                                        emit(a.subList(mid, a.size))
+        val slots =
+            SlotTable().also {
+                it.write { writer ->
+                    writer.insert {
+                        writer.group(0) {
+                            fun emit(a: List<Char>) {
+                                if (a.isNotEmpty()) {
+                                    writer.group(1) {
+                                        val mid = (a.size - 1) / 2 + 1
+                                        writer.nodeGroup(10, a[0])
+                                        if (mid > 1) emit(a.subList(1, mid))
+                                        if (mid < a.size) emit(a.subList(mid, a.size))
+                                    }
                                 }
                             }
-                        }
 
-                        emit(data)
+                            emit(data)
+                        }
                     }
                 }
             }
-        }
 
         val collected = mutableListOf<Char>()
 
@@ -127,31 +143,32 @@
 
     @Test
     fun canFindSourceInfo() {
-        val slots = SlotTable().also {
-            var data = 0
-            it.write { writer ->
-                writer.insert {
-                    writer.group(0) {
-                        fun emit(depth: Int) {
-                            if (depth == 0) {
-                                writer.startData(100, aux = "$data")
-                                data++
-                                writer.endGroup()
-                            } else {
-                                if (depth == 2) {
-                                    writer.startData(depth * 1000, aux = "$data")
+        val slots =
+            SlotTable().also {
+                var data = 0
+                it.write { writer ->
+                    writer.insert {
+                        writer.group(0) {
+                            fun emit(depth: Int) {
+                                if (depth == 0) {
+                                    writer.startData(100, aux = "$data")
                                     data++
-                                } else writer.startGroup(depth)
-                                emit(depth - 1)
-                                emit(depth - 1)
-                                writer.endGroup()
+                                    writer.endGroup()
+                                } else {
+                                    if (depth == 2) {
+                                        writer.startData(depth * 1000, aux = "$data")
+                                        data++
+                                    } else writer.startGroup(depth)
+                                    emit(depth - 1)
+                                    emit(depth - 1)
+                                    writer.endGroup()
+                                }
                             }
+                            emit(5)
                         }
-                        emit(5)
                     }
                 }
             }
-        }
 
         val collected = mutableListOf<String>()
 
@@ -172,25 +189,20 @@
 
     @Test
     fun writeDuringIterationCausesException() {
-        val slots = SlotTable().also {
-            it.write { writer ->
-                writer.insert {
-                    writer.group(0) {
-                        repeat(10) { index ->
-                            writer.group(100 + index) { }
-                        }
+        val slots =
+            SlotTable().also {
+                it.write { writer ->
+                    writer.insert {
+                        writer.group(0) { repeat(10) { index -> writer.group(100 + index) {} } }
                     }
                 }
             }
-        }
 
         fun insertAGroup() {
             slots.write { writer ->
                 writer.group {
-                    repeat(3) { writer.group { } }
-                    writer.insert {
-                        writer.group(200) { }
-                    }
+                    repeat(3) { writer.group {} }
+                    writer.insert { writer.group(200) {} }
                     writer.skipToGroupEnd()
                 }
             }
@@ -207,24 +219,19 @@
 
     @Test
     fun iterationDuringWriteCausesException() {
-        val slots = SlotTable().also {
-            it.write { writer ->
-                writer.insert {
-                    writer.group(0) {
-                        repeat(10) { index ->
-                            writer.group(100 + index) { }
-                        }
+        val slots =
+            SlotTable().also {
+                it.write { writer ->
+                    writer.insert {
+                        writer.group(0) { repeat(10) { index -> writer.group(100 + index) {} } }
                     }
                 }
             }
-        }
 
         slots.write { writer ->
             writer.group {
-                repeat(3) { writer.group { } }
-                writer.insert {
-                    writer.group(200) { }
-                }
+                repeat(3) { writer.group {} }
+                writer.insert { writer.group(200) {} }
                 writer.skipToGroupEnd()
 
                 assertFailsWith(ConcurrentModificationException::class) {
@@ -237,17 +244,14 @@
 
     @Test
     fun canFindAGroupInCompositionData() {
-        val slots = SlotTable().also {
-            it.write { writer ->
-                writer.insert {
-                    writer.group(0) {
-                        repeat(10) { index ->
-                            writer.group(100 + index) { }
-                        }
+        val slots =
+            SlotTable().also {
+                it.write { writer ->
+                    writer.insert {
+                        writer.group(0) { repeat(10) { index -> writer.group(100 + index) {} } }
                     }
                 }
             }
-        }
 
         val identity = slots.compositionGroups.first().compositionGroups.drop(5).first().identity
         assertEquals(identity, slots.find(identity!!)?.identity)
@@ -255,26 +259,33 @@
 
     @Test
     fun canFindAGrouplessCallGroupInCompositionData() {
-        val slots = SlotTable().also {
-            it.collectSourceInformation()
-            it.write { writer ->
-                with(writer) {
-                    insert {
-                        group(100) {
-                            group(200) {
-                                group(300) { }
-                                grouplessCall(400, "CC400") { }
-                                group(500) { }
-                                grouplessCall(600, "CC600") { }
+        val slots =
+            SlotTable().also {
+                it.collectSourceInformation()
+                it.write { writer ->
+                    with(writer) {
+                        insert {
+                            group(100) {
+                                group(200) {
+                                    group(300) {}
+                                    grouplessCall(400, "CC400") {}
+                                    group(500) {}
+                                    grouplessCall(600, "CC600") {}
+                                }
                             }
                         }
                     }
                 }
             }
-        }
 
-        val identities = slots.compositionGroups.first().compositionGroups.first()
-            .compositionGroups.filter { it.key == 400 || it.key == 600 }.map { it.identity }
+        val identities =
+            slots.compositionGroups
+                .first()
+                .compositionGroups
+                .first()
+                .compositionGroups
+                .filter { it.key == 400 || it.key == 600 }
+                .map { it.identity }
 
         for (identity in identities) {
             assertNotNull(identity)
@@ -285,30 +296,29 @@
 
     @Test
     fun canFindANestedGrouplessCallGroup() {
-        val slots = SlotTable().also {
-            it.collectSourceInformation()
-            it.write { writer ->
-                with(writer) {
-                    insert {
-                        group(100) {
-                            group(200) {
-                                grouplessCall(300, "CC300") {
-                                    grouplessCall(400, "CC400") {
-                                        group(500) { }
-                                        grouplessCall(600, "CC600") {
-                                            group(700) { }
+        val slots =
+            SlotTable().also {
+                it.collectSourceInformation()
+                it.write { writer ->
+                    with(writer) {
+                        insert {
+                            group(100) {
+                                group(200) {
+                                    grouplessCall(300, "CC300") {
+                                        grouplessCall(400, "CC400") {
+                                            group(500) {}
+                                            grouplessCall(600, "CC600") { group(700) {} }
+                                            group(800) {}
+                                            grouplessCall(900, "CC900") {}
                                         }
-                                        group(800) { }
-                                        grouplessCall(900, "CC900") { }
+                                        grouplessCall(1000, "CC1000") {}
                                     }
-                                    grouplessCall(1000, "CC1000") { }
                                 }
                             }
                         }
                     }
                 }
             }
-        }
 
         val identities = findAll(slots) { it.sourceInfo != null }.map { it.identity }
         for (identity in identities) {
diff --git a/compose/runtime/runtime/src/nonEmulatorJvmTest/kotlin/androidx/compose/runtime/JvmCompositionTests.kt b/compose/runtime/runtime/src/nonEmulatorJvmTest/kotlin/androidx/compose/runtime/JvmCompositionTests.kt
index 5c6d68a..72f248e 100644
--- a/compose/runtime/runtime/src/nonEmulatorJvmTest/kotlin/androidx/compose/runtime/JvmCompositionTests.kt
+++ b/compose/runtime/runtime/src/nonEmulatorJvmTest/kotlin/androidx/compose/runtime/JvmCompositionTests.kt
@@ -15,6 +15,7 @@
  */
 
 @file:OptIn(InternalComposeApi::class)
+
 package androidx.compose.runtime
 
 import androidx.compose.runtime.mock.EmptyApplier
@@ -58,8 +59,7 @@
         for (i in 1..1000) {
             runTest(UnconfinedTestDispatcher()) {
                 localRecomposerTest {
-                    @Suppress("ASSIGNED_BUT_NEVER_ACCESSED_VARIABLE")
-                    var value by mutableStateOf(0)
+                    @Suppress("ASSIGNED_BUT_NEVER_ACCESSED_VARIABLE") var value by mutableStateOf(0)
                     val snapshotObserver = SnapshotStateObserver {}
                     snapshotObserver.start()
                     @Suppress("UNUSED_VALUE")
@@ -107,8 +107,7 @@
         }
 
         thread.interrupt()
-        @Suppress("BlockingMethodInNonBlockingContext")
-        thread.join()
+        @Suppress("BlockingMethodInNonBlockingContext") thread.join()
         delay(10)
         threadException?.let { throw it }
     }
@@ -127,9 +126,7 @@
         val thread = thread {
             try {
                 while (!Thread.interrupted()) {
-                    Snapshot.withMutableSnapshot {
-                        count.value++
-                    }
+                    Snapshot.withMutableSnapshot { count.value++ }
                 }
             } catch (e: Exception) {
                 threadException = e
@@ -142,8 +139,7 @@
         }
 
         thread.interrupt()
-        @Suppress("BlockingMethodInNonBlockingContext")
-        thread.join()
+        @Suppress("BlockingMethodInNonBlockingContext") thread.join()
         delay(10)
         threadException?.let { throw it }
     }
@@ -176,23 +172,22 @@
         localRecomposerTest { recomposer ->
             var compositionSnapshot: WeakReference<Snapshot>? = null
             val composition = Composition(UnitApplier(), recomposer)
-            composition.setContent {
-                compositionSnapshot = WeakReference(Snapshot.current)
-            }
+            composition.setContent { compositionSnapshot = WeakReference(Snapshot.current) }
             assertNotNull(compositionSnapshot, "compositionSnapshot weak reference")
-            repeat(10) {
-                Runtime.getRuntime().gc()
-            }
+            repeat(10) { Runtime.getRuntime().gc() }
             assertNull(compositionSnapshot?.get(), "weak snapshot reference after forced gc")
         }
     }
 
     private var count = 0
-    @BeforeTest fun saveSnapshotCount() {
+
+    @BeforeTest
+    fun saveSnapshotCount() {
         count = Snapshot.openSnapshotCount()
     }
 
-    @AfterTest fun checkSnapshotCount() {
+    @AfterTest
+    fun checkSnapshotCount() {
         val afterCount = Snapshot.openSnapshotCount()
         assertEquals(count, afterCount, "A snapshot was left open after the test")
     }
diff --git a/compose/runtime/runtime/src/nonEmulatorJvmTest/kotlin/androidx/compose/runtime/LiveEditTests.kt b/compose/runtime/runtime/src/nonEmulatorJvmTest/kotlin/androidx/compose/runtime/LiveEditTests.kt
index 99e1baf..54c03b1 100644
--- a/compose/runtime/runtime/src/nonEmulatorJvmTest/kotlin/androidx/compose/runtime/LiveEditTests.kt
+++ b/compose/runtime/runtime/src/nonEmulatorJvmTest/kotlin/androidx/compose/runtime/LiveEditTests.kt
@@ -40,22 +40,19 @@
     }
 
     @Test
-    fun testRestartableFunctionPreservesParentAndSiblingState() = liveEditTest(
-        collectSourceInformation = SourceInfo.Collect
-    ) {
-        EnsureStatePreservedAndNotRecomposed("a")
-        RestartGroup {
-            Text("Hello World")
-            EnsureStatePreservedButRecomposed("b")
-            Target("c")
+    fun testRestartableFunctionPreservesParentAndSiblingState() =
+        liveEditTest(collectSourceInformation = SourceInfo.Collect) {
+            EnsureStatePreservedAndNotRecomposed("a")
+            RestartGroup {
+                Text("Hello World")
+                EnsureStatePreservedButRecomposed("b")
+                Target("c")
+            }
         }
-    }
 
     // TODO: This should pass but doesn't. Need to investigate why.
     @Ignore
-    fun testNonRestartableTargetAtRootScope() = liveEditTest {
-        Target("b", restartable = false)
-    }
+    fun testNonRestartableTargetAtRootScope() = liveEditTest { Target("b", restartable = false) }
 
     @Test
     fun testTargetSiblings() = liveEditTest {
@@ -64,81 +61,74 @@
     }
 
     @Test
-    fun testMultipleFunctionPreservesParentAndSiblingState() = liveEditTest(
-        collectSourceInformation = SourceInfo.Collect
-    ) {
-        EnsureStatePreservedButRecomposed("a")
-        Target("b")
-        RestartGroup {
-            Text("Hello World")
-            EnsureStatePreservedButRecomposed("c")
-            Target("d")
-            Target("e")
-        }
-        Target("f")
-    }
-
-    @Test
-    fun testChildGroupStateIsDestroyed() = liveEditTest(
-        collectSourceInformation = SourceInfo.Collect
-    ) {
-        EnsureStatePreservedAndNotRecomposed("a")
-        RestartGroup {
-            Text("Hello World")
-            EnsureStatePreservedButRecomposed("b")
-            Target("c") {
-                Text("Hello World")
-                EnsureStateLost("d")
-            }
-        }
-    }
-
-    @Test
-    fun testTargetWithinTarget() = liveEditTest(
-        collectSourceInformation = SourceInfo.Collect
-    ) {
-        EnsureStatePreservedAndNotRecomposed("a")
-        RestartGroup {
-            Text("Hello World")
-            EnsureStatePreservedButRecomposed("b")
-            Target("c") {
-                Text("Hello World")
-                EnsureStateLost("d")
-                RestartGroup {
-                    MarkAsTarget()
-                }
-            }
-        }
-    }
-
-    @Test
-    fun testNonRestartableFunctionPreservesParentAndSiblingState() = liveEditTest(
-        collectSourceInformation = SourceInfo.None
-    ) {
-        EnsureStatePreservedAndNotRecomposed("a")
-        RestartGroup {
-            Text("Hello World")
-            EnsureStatePreservedButRecomposed("b")
-            Target("c", restartable = false)
-        }
-    }
-
-    @Test
-    fun testMultipleNonRestartableFunctionPreservesParentAndSiblingState() = liveEditTest(
-        collectSourceInformation = SourceInfo.None
-    ) {
-        RestartGroup {
+    fun testMultipleFunctionPreservesParentAndSiblingState() =
+        liveEditTest(collectSourceInformation = SourceInfo.Collect) {
             EnsureStatePreservedButRecomposed("a")
-            Target("b", restartable = false)
+            Target("b")
             RestartGroup {
                 Text("Hello World")
                 EnsureStatePreservedButRecomposed("c")
-                Target("d", restartable = false)
-                Target("e", restartable = false)
+                Target("d")
+                Target("e")
             }
-            Target("f", restartable = false)
+            Target("f")
         }
-    }
+
+    @Test
+    fun testChildGroupStateIsDestroyed() =
+        liveEditTest(collectSourceInformation = SourceInfo.Collect) {
+            EnsureStatePreservedAndNotRecomposed("a")
+            RestartGroup {
+                Text("Hello World")
+                EnsureStatePreservedButRecomposed("b")
+                Target("c") {
+                    Text("Hello World")
+                    EnsureStateLost("d")
+                }
+            }
+        }
+
+    @Test
+    fun testTargetWithinTarget() =
+        liveEditTest(collectSourceInformation = SourceInfo.Collect) {
+            EnsureStatePreservedAndNotRecomposed("a")
+            RestartGroup {
+                Text("Hello World")
+                EnsureStatePreservedButRecomposed("b")
+                Target("c") {
+                    Text("Hello World")
+                    EnsureStateLost("d")
+                    RestartGroup { MarkAsTarget() }
+                }
+            }
+        }
+
+    @Test
+    fun testNonRestartableFunctionPreservesParentAndSiblingState() =
+        liveEditTest(collectSourceInformation = SourceInfo.None) {
+            EnsureStatePreservedAndNotRecomposed("a")
+            RestartGroup {
+                Text("Hello World")
+                EnsureStatePreservedButRecomposed("b")
+                Target("c", restartable = false)
+            }
+        }
+
+    @Test
+    fun testMultipleNonRestartableFunctionPreservesParentAndSiblingState() =
+        liveEditTest(collectSourceInformation = SourceInfo.None) {
+            RestartGroup {
+                EnsureStatePreservedButRecomposed("a")
+                Target("b", restartable = false)
+                RestartGroup {
+                    Text("Hello World")
+                    EnsureStatePreservedButRecomposed("c")
+                    Target("d", restartable = false)
+                    Target("e", restartable = false)
+                }
+                Target("f", restartable = false)
+            }
+        }
 
     @Test
     fun testLambda() = liveEditTest {
@@ -150,15 +140,14 @@
     }
 
     @Test
-    fun testInlineComposableLambda() = liveEditTest(
-        collectSourceInformation = SourceInfo.None
-    ) {
-        RestartGroup {
-            InlineTarget("a")
-            EnsureStatePreservedButRecomposed("b")
-            Text("Hello World")
+    fun testInlineComposableLambda() =
+        liveEditTest(collectSourceInformation = SourceInfo.None) {
+            RestartGroup {
+                InlineTarget("a")
+                EnsureStatePreservedButRecomposed("b")
+                Text("Hello World")
+            }
         }
-    }
 
     @Test
     fun testThrowing_initialComposition() = liveEditTest {
@@ -167,13 +156,7 @@
             // Fail once per each reload
             expectError("throwInCompose", 2)
             // Composed once - failed once
-            Expect(
-                "throw",
-                compose = 2,
-                onRememberd = 0,
-                onForgotten = 0,
-                onAbandoned = 2
-            )
+            Expect("throw", compose = 2, onRememberd = 0, onForgotten = 0, onAbandoned = 2)
             error("throwInCompose")
         }
     }
@@ -191,13 +174,7 @@
                 // only failed on 2nd recomposition
                 expectError("throwInCompose", 1)
                 // Composed 3 times, failed once
-                Expect(
-                    "throw",
-                    compose = 3,
-                    onRememberd = 2,
-                    onForgotten = 1,
-                    onAbandoned = 1
-                )
+                Expect("throw", compose = 3, onRememberd = 2, onForgotten = 1, onAbandoned = 1)
 
                 recomposeCount++
                 if (recomposeCount == 2) {
@@ -225,9 +202,7 @@
                     onAbandoned = 0,
                 )
 
-                SideEffect {
-                    error("throwInEffect")
-                }
+                SideEffect { error("throwInEffect") }
             }
         }
     }
@@ -235,9 +210,7 @@
     @Test
     fun testThrowing_recomposition_sideEffect() {
         var recomposeCount = 0
-        liveEditTest(
-            collectSourceInformation = SourceInfo.None
-        ) {
+        liveEditTest(collectSourceInformation = SourceInfo.None) {
             RestartGroup {
                 MarkAsTarget()
 
@@ -287,7 +260,9 @@
                         override fun onRemembered() {
                             error("throwOnRemember")
                         }
+
                         override fun onForgotten() {}
+
                         override fun onAbandoned() {}
                     }
                 }
@@ -334,7 +309,9 @@
                                 error("throwOnRemember")
                             }
                         }
+
                         override fun onForgotten() {}
+
                         override fun onAbandoned() {}
                     }
                 }
@@ -384,13 +361,7 @@
                 state.value
 
                 // composed initially + invalidated by crashed composition
-                Expect(
-                    "state",
-                    compose = 2,
-                    onRememberd = 1,
-                    onForgotten = 0,
-                    onAbandoned = 0
-                )
+                Expect("state", compose = 2, onRememberd = 1, onForgotten = 0, onAbandoned = 0)
             }
         }
     }
@@ -403,11 +374,7 @@
 
                 expectError("throwInMovableContent", 2)
 
-                val content = remember {
-                    movableContentOf {
-                        error("throwInMovableContent")
-                    }
-                }
+                val content = remember { movableContentOf { error("throwInMovableContent") } }
 
                 content()
             }
@@ -505,22 +472,21 @@
          */
 
         var recomposeCount = 0
-        val content: @Composable LiveEditTestScope.() -> Unit = @Composable {
-            MarkAsTarget()
-            remember { Any() }
-        }
-        val crashyContent: @Composable LiveEditTestScope.() -> Unit = @Composable {
-            MarkAsTarget()
-            remember { Any() }
-            if (recomposeCount == 2) {
-                throw IllegalArgumentException("throwInSubcompose")
+        val content: @Composable LiveEditTestScope.() -> Unit =
+            @Composable {
+                MarkAsTarget()
+                remember { Any() }
             }
-        }
+        val crashyContent: @Composable LiveEditTestScope.() -> Unit =
+            @Composable {
+                MarkAsTarget()
+                remember { Any() }
+                if (recomposeCount == 2) {
+                    throw IllegalArgumentException("throwInSubcompose")
+                }
+            }
 
-        liveEditTest(
-            reloadCount = 2,
-            collectSourceInformation = SourceInfo.None
-        ) {
+        liveEditTest(reloadCount = 2, collectSourceInformation = SourceInfo.None) {
             expectError("throwInSubcompose", 1)
 
             RestartGroup {
@@ -528,12 +494,8 @@
                 recomposeCount++
             }
 
-            Subcompose {
-                content()
-            }
-            Subcompose {
-                crashyContent()
-            }
+            Subcompose { content() }
+            Subcompose { crashyContent() }
         }
     }
 }
@@ -605,7 +567,8 @@
     expectLogCount(ref, "onAbandoned", onAbandoned)
 }
 
-@Composable fun LiveEditTestScope.Target(
+@Composable
+fun LiveEditTestScope.Target(
     ref: String,
     restartable: Boolean = true,
     content: @Composable () -> Unit = {}
@@ -622,10 +585,8 @@
     content()
 }
 
-@Composable fun LiveEditTestScope.InlineTarget(
-    ref: String,
-    content: @Composable () -> Unit = {}
-) {
+@Composable
+fun LiveEditTestScope.InlineTarget(ref: String, content: @Composable () -> Unit = {}) {
     MarkAsTarget()
     Expect(
         ref,
@@ -638,14 +599,10 @@
 }
 
 @Composable
-fun LiveEditTestScope.Subcompose(
-    content: @Composable () -> Unit
-): Composition {
+fun LiveEditTestScope.Subcompose(content: @Composable () -> Unit): Composition {
     val context = rememberCompositionContext()
     return remember(context) {
-        Composition(ViewApplier(View()), context).apply {
-            setContent(content)
-        }
+        Composition(ViewApplier(View()), context).apply { setContent(content) }
     }
 }
 
@@ -669,13 +626,11 @@
 ) {
     if (
         collectSourceInformation == SourceInfo.Both ||
-        collectSourceInformation == SourceInfo.Collect
+            collectSourceInformation == SourceInfo.Collect
     ) {
         compositionTest {
             with(LiveEditTestScope()) {
-                addCheck {
-                    (composition as? ControlledComposition)?.verifyConsistent()
-                }
+                addCheck { (composition as? ControlledComposition)?.verifyConsistent() }
 
                 recordErrors {
                     compose {
@@ -686,9 +641,7 @@
 
                 repeat(reloadCount) {
                     invalidateTargets()
-                    recordErrors {
-                        advance()
-                    }
+                    recordErrors { advance() }
                 }
 
                 runChecks()
@@ -697,24 +650,17 @@
     }
 
     if (
-        collectSourceInformation == SourceInfo.Both ||
-        collectSourceInformation == SourceInfo.None
+        collectSourceInformation == SourceInfo.Both || collectSourceInformation == SourceInfo.None
     ) {
         compositionTest {
             with(LiveEditTestScope()) {
-                addCheck {
-                    (composition as? ControlledComposition)?.verifyConsistent()
-                }
+                addCheck { (composition as? ControlledComposition)?.verifyConsistent() }
 
-                recordErrors {
-                    compose { fn(this) }
-                }
+                recordErrors { compose { fn(this) } }
 
                 repeat(reloadCount) {
                     invalidateTargets()
-                    recordErrors {
-                        advance()
-                    }
+                    recordErrors { advance() }
                 }
 
                 runChecks()
@@ -724,9 +670,7 @@
 }
 
 @OptIn(InternalComposeApi::class)
-private inline fun LiveEditTestScope.recordErrors(
-    block: () -> Unit
-) {
+private inline fun LiveEditTestScope.recordErrors(block: () -> Unit) {
     try {
         block()
     } catch (e: ComposeRuntimeError) {
@@ -734,9 +678,7 @@
     } catch (e: Exception) {
         addError(e)
     }
-    currentCompositionErrors().forEach {
-        addError(it.first)
-    }
+    currentCompositionErrors().forEach { addError(it.first) }
 }
 
 @Stable
@@ -778,22 +720,14 @@
         addCheck {
             val logs = logs.filter { it.first == ref }.map { it.second }.toList()
             val actual = logs.count { m -> m == msg }
-            Assert.assertEquals(
-                "Ref '$ref' had an unexpected # of '$msg' logs",
-                expected,
-                actual
-            )
+            Assert.assertEquals("Ref '$ref' had an unexpected # of '$msg' logs", expected, actual)
         }
     }
 
     fun expectError(message: String, count: Int) {
         addCheck {
             val errors = errors.filter { it.message == message }
-            Assert.assertEquals(
-                "Got ${errors.size} errors with $message",
-                count,
-                errors.size
-            )
+            Assert.assertEquals("Got ${errors.size} errors with $message", count, errors.size)
         }
     }
 }
diff --git a/compose/runtime/runtime/src/nonEmulatorJvmTest/kotlin/androidx/compose/runtime/MonotonicFrameClockTest.kt b/compose/runtime/runtime/src/nonEmulatorJvmTest/kotlin/androidx/compose/runtime/MonotonicFrameClockTest.kt
index a9b8eba..157c62f 100644
--- a/compose/runtime/runtime/src/nonEmulatorJvmTest/kotlin/androidx/compose/runtime/MonotonicFrameClockTest.kt
+++ b/compose/runtime/runtime/src/nonEmulatorJvmTest/kotlin/androidx/compose/runtime/MonotonicFrameClockTest.kt
@@ -27,24 +27,21 @@
     @Test
     fun monotonicFrameClockThrowsWhenAbsent() {
         assertFailsWith<IllegalStateException> {
-            runBlocking {
-                coroutineContext.monotonicFrameClock
-            }
+            runBlocking { coroutineContext.monotonicFrameClock }
         }
     }
 
     @ExperimentalComposeApi
     @Test
     fun monotonicFrameClockReturnsContextClock() {
-        val clock = object : MonotonicFrameClock {
-            override suspend fun <R> withFrameNanos(onFrame: (frameTimeNanos: Long) -> R): R {
-                error("not implemented")
+        val clock =
+            object : MonotonicFrameClock {
+                override suspend fun <R> withFrameNanos(onFrame: (frameTimeNanos: Long) -> R): R {
+                    error("not implemented")
+                }
             }
-        }
 
-        val result = runBlocking(clock) {
-            coroutineContext.monotonicFrameClock
-        }
+        val result = runBlocking(clock) { coroutineContext.monotonicFrameClock }
 
         assertSame(clock, result)
     }
@@ -62,17 +59,17 @@
 
     @Test
     fun withFrameNanosCallsPresentClock() {
-        val clock = object : MonotonicFrameClock {
-            var callCount = 0
-            override suspend fun <R> withFrameNanos(onFrame: (frameTimeNanos: Long) -> R): R {
-                callCount++
-                return onFrame(0)
+        val clock =
+            object : MonotonicFrameClock {
+                var callCount = 0
+
+                override suspend fun <R> withFrameNanos(onFrame: (frameTimeNanos: Long) -> R): R {
+                    callCount++
+                    return onFrame(0)
+                }
             }
-        }
         val expected = Any()
-        val result = runBlocking(clock) {
-            withFrameNanos { expected }
-        }
+        val result = runBlocking(clock) { withFrameNanos { expected } }
         assertSame(expected, result, "expected value not returned from withFrameNanos")
         assertEquals(1, clock.callCount, "withFrameNanos did not use supplied clock")
     }
diff --git a/compose/runtime/runtime/src/nonEmulatorJvmTest/kotlin/androidx/compose/runtime/RecomposerTests.jvm.kt b/compose/runtime/runtime/src/nonEmulatorJvmTest/kotlin/androidx/compose/runtime/RecomposerTests.jvm.kt
index 2f97105..f839923 100644
--- a/compose/runtime/runtime/src/nonEmulatorJvmTest/kotlin/androidx/compose/runtime/RecomposerTests.jvm.kt
+++ b/compose/runtime/runtime/src/nonEmulatorJvmTest/kotlin/androidx/compose/runtime/RecomposerTests.jvm.kt
@@ -60,9 +60,7 @@
             val clock = TestMonotonicFrameClock(this)
             withContext(clock) {
                 val recomposer = Recomposer(coroutineContext)
-                launch {
-                    recomposer.runRecomposeConcurrentlyAndApplyChanges(Dispatchers.Default)
-                }
+                launch { recomposer.runRecomposeConcurrentlyAndApplyChanges(Dispatchers.Default) }
 
                 val composition = Composition(UnitApplier(), recomposer)
                 val threadLog = Channel<Thread>(Channel.BUFFERED)
@@ -70,9 +68,7 @@
                 composition.setContent {
                     threadLog.trySend(Thread.currentThread())
                     val scope = currentRecomposeScope
-                    SideEffect {
-                        recomposeScope = scope
-                    }
+                    SideEffect { recomposeScope = scope }
                 }
 
                 val firstCompositionThread = threadLog.receive()
@@ -96,9 +92,7 @@
         val clock = AutoTestFrameClock()
         withContext(dispatcher + clock) {
             val recomposer = Recomposer(coroutineContext)
-            launch {
-                recomposer.runRecomposeConcurrentlyAndApplyChanges(Dispatchers.Default)
-            }
+            launch { recomposer.runRecomposeConcurrentlyAndApplyChanges(Dispatchers.Default) }
 
             val composition = Composition(UnitApplier(), recomposer)
             var longRecomposition by mutableStateOf(false)
@@ -110,16 +104,12 @@
                 if (longRecomposition) {
                     longRecompositionLatch.await()
                 }
-                SideEffect {
-                    applyCount.incrementAndGet()
-                }
+                SideEffect { applyCount.incrementAndGet() }
             }
 
             assertEquals(1, applyCount.get(), "applyCount after initial composition")
 
-            Snapshot.withMutableSnapshot {
-                longRecomposition = true
-            }
+            Snapshot.withMutableSnapshot { longRecomposition = true }
 
             assertTrue(recomposeLatch.await(5, TimeUnit.SECONDS), "recomposeLatch await timed out")
             assertEquals(1, applyCount.get(), "applyCount after starting long recomposition")
@@ -135,62 +125,57 @@
 
     @Test
     @OptIn(ExperimentalComposeApi::class)
-    fun concurrentRecompositionOnCompositionSpecificContext() = runBlocking(AutoTestFrameClock()) {
-        val recomposer = Recomposer(coroutineContext)
-        launch {
-            recomposer.runRecomposeConcurrentlyAndApplyChanges(Dispatchers.Default)
-        }
+    fun concurrentRecompositionOnCompositionSpecificContext() =
+        runBlocking(AutoTestFrameClock()) {
+            val recomposer = Recomposer(coroutineContext)
+            launch { recomposer.runRecomposeConcurrentlyAndApplyChanges(Dispatchers.Default) }
 
-        @OptIn(DelicateCoroutinesApi::class, ExperimentalCoroutinesApi::class)
-        newSingleThreadContext("specialThreadPool").use { pool ->
-            val composition = Composition(UnitApplier(), recomposer, pool)
-            var recomposition by mutableStateOf(false)
-            val recompositionThread = Channel<Thread>(1)
-            composition.setContent {
-                if (recomposition) {
-                    recompositionThread.trySend(Thread.currentThread())
+            @OptIn(DelicateCoroutinesApi::class, ExperimentalCoroutinesApi::class)
+            newSingleThreadContext("specialThreadPool").use { pool ->
+                val composition = Composition(UnitApplier(), recomposer, pool)
+                var recomposition by mutableStateOf(false)
+                val recompositionThread = Channel<Thread>(1)
+                composition.setContent {
+                    if (recomposition) {
+                        recompositionThread.trySend(Thread.currentThread())
+                    }
                 }
+
+                Snapshot.withMutableSnapshot { recomposition = true }
+
+                assertTrue(
+                    withTimeoutOrNull(3_000) { recompositionThread.receive() }
+                        ?.name
+                        ?.contains("specialThreadPool") == true,
+                    "recomposition did not occur on expected thread"
+                )
+
+                recomposer.close()
             }
-
-            Snapshot.withMutableSnapshot {
-                recomposition = true
-            }
-
-            assertTrue(
-                withTimeoutOrNull(3_000) {
-                    recompositionThread.receive()
-                }?.name?.contains("specialThreadPool") == true,
-                "recomposition did not occur on expected thread"
-            )
-
-            recomposer.close()
         }
-    }
 
     @Test
-    fun recomposerCancelReportsShuttingDownImmediately() = runBlocking(AutoTestFrameClock()) {
-        val recomposer = Recomposer(coroutineContext)
-        launch(start = CoroutineStart.UNDISPATCHED) {
-            recomposer.runRecomposeAndApplyChanges()
-        }
+    fun recomposerCancelReportsShuttingDownImmediately() =
+        runBlocking(AutoTestFrameClock()) {
+            val recomposer = Recomposer(coroutineContext)
+            launch(start = CoroutineStart.UNDISPATCHED) { recomposer.runRecomposeAndApplyChanges() }
 
-        // Create a composition with a LaunchedEffect that will need to be resumed for cancellation
-        // before the recomposer can fully join.
-        Composition(UnitApplier(), recomposer).setContent {
-            LaunchedEffect(Unit) {
-                awaitCancellation()
+            // Create a composition with a LaunchedEffect that will need to be resumed for
+            // cancellation
+            // before the recomposer can fully join.
+            Composition(UnitApplier(), recomposer).setContent {
+                LaunchedEffect(Unit) { awaitCancellation() }
             }
-        }
 
-        recomposer.cancel()
-        // runBlocking will not dispatch resumed continuations for cancellation yet;
-        // read the current state immediately.
-        val state = recomposer.currentState.value
-        assertTrue(
-            state <= Recomposer.State.ShuttingDown,
-            "recomposer state $state but expected <= ShuttingDown"
-        )
-    }
+            recomposer.cancel()
+            // runBlocking will not dispatch resumed continuations for cancellation yet;
+            // read the current state immediately.
+            val state = recomposer.currentState.value
+            assertTrue(
+                state <= Recomposer.State.ShuttingDown,
+                "recomposer state $state but expected <= ShuttingDown"
+            )
+        }
 
     @Test
     fun disposedInvalidatedCompositionDoesNotLeak(): Unit = runBlocking {
@@ -213,15 +198,15 @@
 
         // Create the composition to test in a function rather than directly, otherwise
         // we end up with a hard reference from the stack sticking around preventing gc
-        fun createWeakComposition() = WeakReference(
-            Composition(UnitApplier(), recomposer).apply {
-                setContent {
-                    // This state read will invalidate the composition
-                    @Suppress("UNUSED_VARIABLE")
-                    val readme = state
+        fun createWeakComposition() =
+            WeakReference(
+                Composition(UnitApplier(), recomposer).apply {
+                    setContent {
+                        // This state read will invalidate the composition
+                        @Suppress("UNUSED_VARIABLE") val readme = state
+                    }
                 }
-            }
-        )
+            )
 
         // Hold only a weak reference to this created composition for the test
         val weakRef = createWeakComposition()
@@ -233,9 +218,8 @@
         // Invalidate the composition
         Snapshot.withMutableSnapshot { state++ }
 
-        withTimeoutOrNull(1000) {
-            frameRequestCh.receive()
-        } ?: fail("never requested a frame from recomposer")
+        withTimeoutOrNull(1000) { frameRequestCh.receive() }
+            ?: fail("never requested a frame from recomposer")
 
         // Bug 209497244 tracked the Recomposer keeping this composition
         // in an invalidation list after disposal; confirm below that this becomes unreachable
diff --git a/compose/runtime/runtime/src/nonEmulatorJvmTest/kotlin/androidx/compose/runtime/reflect/ComposableMethodTest.kt b/compose/runtime/runtime/src/nonEmulatorJvmTest/kotlin/androidx/compose/runtime/reflect/ComposableMethodTest.kt
index 2d903c6..2eba387 100644
--- a/compose/runtime/runtime/src/nonEmulatorJvmTest/kotlin/androidx/compose/runtime/reflect/ComposableMethodTest.kt
+++ b/compose/runtime/runtime/src/nonEmulatorJvmTest/kotlin/androidx/compose/runtime/reflect/ComposableMethodTest.kt
@@ -31,16 +31,12 @@
 import kotlin.test.assertNull
 import kotlinx.coroutines.runBlocking
 
-@Composable
-private fun composableFunction() {
-}
+@Composable private fun composableFunction() {}
 
-private fun nonComposableFunction() {
-}
+private fun nonComposableFunction() {}
 
 @Suppress("UNUSED_PARAMETER")
-private fun nonComposableFunctionWithComposerParam(unused: Composer) {
-}
+private fun nonComposableFunctionWithComposerParam(unused: Composer) {}
 
 @Composable
 private fun composableFunctionWithDefaults(
@@ -49,16 +45,13 @@
     s3: String = "a",
     s4: String = "a",
     s5: String = "a"
-): String { return s1 + s2 + s3 + s4 + s5 }
-
-@Composable
-private fun overloadedComposable() {
+): String {
+    return s1 + s2 + s3 + s4 + s5
 }
 
-@Suppress("UNUSED_PARAMETER")
-@Composable
-private fun overloadedComposable(s: String) {
-}
+@Composable private fun overloadedComposable() {}
+
+@Suppress("UNUSED_PARAMETER") @Composable private fun overloadedComposable(s: String) {}
 
 @Suppress("UNUSED_PARAMETER")
 @Composable
@@ -73,7 +66,7 @@
     v8: String,
     v9: String,
     v10: String
-) { }
+) {}
 
 @Suppress("UNUSED_PARAMETER")
 @Composable
@@ -89,7 +82,7 @@
     v9: String,
     v10: String,
     v11: String
-) { }
+) {}
 
 @Suppress("UNUSED_PARAMETER")
 @Composable
@@ -106,7 +99,7 @@
     v10: String,
     v11: String,
     v12: String
-) { }
+) {}
 
 @Suppress("UNUSED_PARAMETER")
 @Composable
@@ -117,19 +110,14 @@
     v4: Float,
     v5: Double,
     v6: Long
-) { }
+) {}
 
 private class ComposablesWrapper {
-    @Composable
-    fun composableMethod() {
-    }
+    @Composable fun composableMethod() {}
 
-    fun nonComposableMethod() {
-    }
+    fun nonComposableMethod() {}
 
-    @Suppress("UNUSED_PARAMETER")
-    fun nonComposableMethodWithComposerParam(unused: Composer) {
-    }
+    @Suppress("UNUSED_PARAMETER") fun nonComposableMethodWithComposerParam(unused: Composer) {}
 
     @Composable
     fun composableMethodWithDefaults(
@@ -138,16 +126,13 @@
         s3: String = "a",
         s4: String = "a",
         s5: String = "a"
-    ): String { return s1 + s2 + s3 + s4 + s5 }
-
-    @Composable
-    fun overloadedComposableMethod() {
+    ): String {
+        return s1 + s2 + s3 + s4 + s5
     }
 
-    @Suppress("UNUSED_PARAMETER")
-    @Composable
-    fun overloadedComposableMethod(s: String) {
-    }
+    @Composable fun overloadedComposableMethod() {}
+
+    @Suppress("UNUSED_PARAMETER") @Composable fun overloadedComposableMethod(s: String) {}
 
     @Suppress("UNUSED_PARAMETER")
     @Composable
@@ -162,7 +147,7 @@
         v8: String,
         v9: String,
         v10: String
-    ) { }
+    ) {}
 
     @Suppress("UNUSED_PARAMETER")
     @Composable
@@ -178,7 +163,7 @@
         v9: String,
         v10: String,
         v11: String
-    ) { }
+    ) {}
 
     @Suppress("UNUSED_PARAMETER")
     @Composable
@@ -195,7 +180,7 @@
         v10: String,
         v11: String,
         v12: String
-    ) { }
+    ) {}
 
     @Suppress("UNUSED_PARAMETER")
     @Composable
@@ -206,14 +191,12 @@
         v4: Float,
         v5: Double,
         v6: Long
-    ) { }
+    ) {}
 }
 
 class ComposableMethodTest {
-    private val clazz =
-        Class.forName("androidx.compose.runtime.reflect.ComposableMethodTestKt")
-    private val wrapperClazz =
-        Class.forName("androidx.compose.runtime.reflect.ComposablesWrapper")
+    private val clazz = Class.forName("androidx.compose.runtime.reflect.ComposableMethodTestKt")
+    private val wrapperClazz = Class.forName("androidx.compose.runtime.reflect.ComposablesWrapper")
 
     private val composable = clazz.declaredMethods.find { it.name == "composableFunction" }!!
     private val nonComposable = clazz.declaredMethods.find { it.name == "nonComposableFunction" }!!
@@ -345,7 +328,8 @@
         val method0 = wrapperClazz.getDeclaredComposableMethod("overloadedComposableMethod")
         val method1 =
             wrapperClazz.getDeclaredComposableMethod(
-                "overloadedComposableMethod", String::class.java
+                "overloadedComposableMethod",
+                String::class.java
             )
         val method10 =
             wrapperClazz.getDeclaredComposableMethod(
@@ -462,15 +446,29 @@
 
         assertEquals(6, diffParameters.parameters.size)
         assertEquals(
-            listOf(String::class.java, Any::class.java, Int::class.java, Float::class.java,
-                Double::class.java, Long::class.java),
-            diffParameters.parameters.map { it.type })
+            listOf(
+                String::class.java,
+                Any::class.java,
+                Int::class.java,
+                Float::class.java,
+                Double::class.java,
+                Long::class.java
+            ),
+            diffParameters.parameters.map { it.type }
+        )
 
         assertEquals(6, diffParametersMethod.parameters.size)
         assertEquals(
-            listOf(String::class.java, Any::class.java, Int::class.java, Float::class.java,
-                Double::class.java, Long::class.java),
-            diffParametersMethod.parameters.map { it.type })
+            listOf(
+                String::class.java,
+                Any::class.java,
+                Int::class.java,
+                Float::class.java,
+                Double::class.java,
+                Long::class.java
+            ),
+            diffParametersMethod.parameters.map { it.type }
+        )
     }
 
     @Throws(NoSuchMethodException::class)
@@ -556,15 +554,29 @@
 
         assertEquals(6, diffParameters.parameterTypes.size)
         assertEquals(
-            listOf(String::class.java, Any::class.java, Int::class.java, Float::class.java,
-                Double::class.java, Long::class.java),
-            diffParameters.parameterTypes.toList())
+            listOf(
+                String::class.java,
+                Any::class.java,
+                Int::class.java,
+                Float::class.java,
+                Double::class.java,
+                Long::class.java
+            ),
+            diffParameters.parameterTypes.toList()
+        )
 
         assertEquals(6, diffParametersMethod.parameterTypes.size)
         assertEquals(
-            listOf(String::class.java, Any::class.java, Int::class.java, Float::class.java,
-                Double::class.java, Long::class.java),
-            diffParametersMethod.parameterTypes.toList())
+            listOf(
+                String::class.java,
+                Any::class.java,
+                Int::class.java,
+                Float::class.java,
+                Double::class.java,
+                Long::class.java
+            ),
+            diffParametersMethod.parameterTypes.toList()
+        )
     }
 
     private class TestFrameClock : MonotonicFrameClock {
@@ -573,24 +585,12 @@
 
     private fun <T> executeWithComposer(block: (composer: Composer) -> T): T =
         runBlocking(TestFrameClock()) {
-            fun compose(
-                recomposer: Recomposer,
-                block: @Composable () -> Unit
-            ): Composition {
-                return Composition(
-                    EmptyApplier(),
-                    recomposer
-                ).apply {
-                    setContent(block)
-                }
+            fun compose(recomposer: Recomposer, block: @Composable () -> Unit): Composition {
+                return Composition(EmptyApplier(), recomposer).apply { setContent(block) }
             }
 
             var res: T? = null
-            withRunningRecomposer { r ->
-                compose(r) {
-                    res = block(currentComposer)
-                }
-            }
+            withRunningRecomposer { r -> compose(r) { res = block(currentComposer) } }
             res!!
         }
 
@@ -634,8 +634,7 @@
     fun testInvokeComposableMethods() {
 
         val composableWithDefaults =
-            wrapperClazz
-                .declaredMethods
+            wrapperClazz.declaredMethods
                 .find { it.name == "composableMethodWithDefaults" }!!
                 .asComposableMethod()!!
         composableWithDefaults.asMethod().isAccessible = true
diff --git a/compose/runtime/runtime/src/nonEmulatorJvmTest/kotlin/androidx/compose/runtime/snapshots/SnapshotStateObserverTestsJvm.kt b/compose/runtime/runtime/src/nonEmulatorJvmTest/kotlin/androidx/compose/runtime/snapshots/SnapshotStateObserverTestsJvm.kt
index 4aff6ca..e894858 100644
--- a/compose/runtime/runtime/src/nonEmulatorJvmTest/kotlin/androidx/compose/runtime/snapshots/SnapshotStateObserverTestsJvm.kt
+++ b/compose/runtime/runtime/src/nonEmulatorJvmTest/kotlin/androidx/compose/runtime/snapshots/SnapshotStateObserverTestsJvm.kt
@@ -46,13 +46,10 @@
             for (i in 1..1000) {
                 val state1 by mutableStateOf(0)
                 var state2 by mutableStateOf(true)
-                val observer = SnapshotStateObserver({}).apply {
-                    start()
-                }
+                val observer = SnapshotStateObserver({}).apply { start() }
                 repeat(1000) {
                     observer.observeReads(Unit, {}) {
-                        @Suppress("UNUSED_EXPRESSION")
-                        state1
+                        @Suppress("UNUSED_EXPRESSION") state1
                         if (state2) {
                             state2 = false
                         }
@@ -84,13 +81,10 @@
             for (i in 1..1000) {
                 val state1 by mutableStateOf(0)
                 var state2 by mutableStateOf(true)
-                val observer = SnapshotStateObserver({}).apply {
-                    start()
-                }
+                val observer = SnapshotStateObserver({}).apply { start() }
                 observer.observeReads(Unit, {}) {
                     repeat(1000) {
-                        @Suppress("UNUSED_EXPRESSION")
-                        state1
+                        @Suppress("UNUSED_EXPRESSION") state1
                         if (state2) {
                             state2 = false
                         }
@@ -133,7 +127,7 @@
         val stateObserver = SnapshotStateObserver { it() }
         val state1 = mutableStateOf(true)
         val state2 = mutableStateOf(0)
-        val onChanged1: (String) -> Unit = { }
+        val onChanged1: (String) -> Unit = {}
         val onChanged2: (String) -> Unit = { _ -> changes++ }
 
         fun runObservedBlocks() {
@@ -180,21 +174,22 @@
             stateObserver.start()
             Snapshot.notifyObjectsInitialized()
 
-            val observer = object : (Any) -> Unit {
-                override fun invoke(affected: Any) {
-                    assertEquals(this, affected)
-                    assertEquals(0, changes)
-                    changes++
-                    readWithObservation()
-                }
+            val observer =
+                object : (Any) -> Unit {
+                    override fun invoke(affected: Any) {
+                        assertEquals(this, affected)
+                        assertEquals(0, changes)
+                        changes++
+                        readWithObservation()
+                    }
 
-                fun readWithObservation() {
-                    stateObserver.observeReads(this, this) {
-                        // read the value
-                        nestedDerivedState.value
+                    fun readWithObservation() {
+                        stateObserver.observeReads(this, this) {
+                            // read the value
+                            nestedDerivedState.value
+                        }
                     }
                 }
-            }
             // read with 0
             observer.readWithObservation()
             // increase to 1
@@ -212,9 +207,7 @@
         var changes = 0
         val changeBlock: (Any) -> Unit = { changes++ }
 
-        val states =
-            List(2) { mutableStateOf(true) }
-                .sortedBy { System.identityHashCode(it) }
+        val states = List(2) { mutableStateOf(true) }.sortedBy { System.identityHashCode(it) }
 
         val derivedStates =
             List(10) {
@@ -227,9 +220,7 @@
 
         runSimpleTest { stateObserver, _ ->
             // record observation for a draw scope
-            stateObserver.observeReads("draw", changeBlock) {
-                derivedStates.forEach { it.value }
-            }
+            stateObserver.observeReads("draw", changeBlock) { derivedStates.forEach { it.value } }
 
             Snapshot.sendApplyNotifications()
 
diff --git a/compose/runtime/runtime/src/nonEmulatorJvmTest/kotlin/androidx/compose/runtime/snapshots/SnapshotThreadMapTests.kt b/compose/runtime/runtime/src/nonEmulatorJvmTest/kotlin/androidx/compose/runtime/snapshots/SnapshotThreadMapTests.kt
index 11ab1c7..4cb8e35 100644
--- a/compose/runtime/runtime/src/nonEmulatorJvmTest/kotlin/androidx/compose/runtime/snapshots/SnapshotThreadMapTests.kt
+++ b/compose/runtime/runtime/src/nonEmulatorJvmTest/kotlin/androidx/compose/runtime/snapshots/SnapshotThreadMapTests.kt
@@ -27,9 +27,7 @@
 import kotlin.test.assertNull
 import kotlin.test.assertTrue
 
-/**
- * Test the internal ThreadMap
- */
+/** Test the internal ThreadMap */
 class SnapshotThreadMapTests {
     @Test
     fun canCreateAMap() {
@@ -137,9 +135,7 @@
     }
 }
 
-/**
- * Test the thread lcoal variable
- */
+/** Test the thread lcoal variable */
 class SnapshotThreadLocalTests {
     @Test
     fun canCreate() {
diff --git a/compose/test-utils/src/androidInstrumentedTest/kotlin/androidx/compose/testutils/AndroidComposeTestCaseRunnerTest.kt b/compose/test-utils/src/androidInstrumentedTest/kotlin/androidx/compose/testutils/AndroidComposeTestCaseRunnerTest.kt
index 7e76cce..d23b45c 100644
--- a/compose/test-utils/src/androidInstrumentedTest/kotlin/androidx/compose/testutils/AndroidComposeTestCaseRunnerTest.kt
+++ b/compose/test-utils/src/androidInstrumentedTest/kotlin/androidx/compose/testutils/AndroidComposeTestCaseRunnerTest.kt
@@ -46,263 +46,238 @@
 @RunWith(AndroidJUnit4::class)
 class AndroidComposeTestCaseRunnerTest {
 
-    @get:Rule
-    val composeTestRule = createAndroidComposeRule<ComponentActivity>()
+    @get:Rule val composeTestRule = createAndroidComposeRule<ComponentActivity>()
 
     internal fun <A : ComponentActivity> AndroidComposeTestRule<ActivityScenarioRule<A>, A>
-        .forGivenContent(
-        composable: @Composable () -> Unit
-    ): ComposeTestCaseSetup {
-        return forGivenTestCase(object : ComposeTestCase {
-            @Composable
-            override fun Content() {
-                composable()
+        .forGivenContent(composable: @Composable () -> Unit): ComposeTestCaseSetup {
+        return forGivenTestCase(
+            object : ComposeTestCase {
+                @Composable
+                override fun Content() {
+                    composable()
+                }
             }
-        })
+        )
     }
 
     @Test
     fun foreverRecomposing_viaModel_shouldFail() {
         val count = mutableStateOf(0)
-        composeTestRule.forGivenContent {
-            Text("Hello ${count.value}")
-            count.value++
-        }.performTestWithEventsControl {
-            // Force the first recompose as the changes during initial composition are not
-            // considered to invalidate the composition.
-            count.value++
-            assertFailsWith<AssertionError>(
-                "Changes are still pending after '10' frames."
-            ) {
-                doFramesAssertAllHadChangesExceptLastOne(10)
+        composeTestRule
+            .forGivenContent {
+                Text("Hello ${count.value}")
+                count.value++
             }
-        }
+            .performTestWithEventsControl {
+                // Force the first recompose as the changes during initial composition are not
+                // considered to invalidate the composition.
+                count.value++
+                assertFailsWith<AssertionError>("Changes are still pending after '10' frames.") {
+                    doFramesAssertAllHadChangesExceptLastOne(10)
+                }
+            }
     }
 
     // @Test //- TODO: Does not work, performs only 1 frame until stable
     fun foreverRecomposing_viaState_shouldFail() {
-        composeTestRule.forGivenContent {
-            val state = remember { mutableStateOf(0) }
-            Text("Hello ${state.value}")
-            state.value++
-        }.performTestWithEventsControl {
-            assertFailsWith<AssertionError>(
-                "Changes are still pending after '10' frames."
-            ) {
-                doFramesAssertAllHadChangesExceptLastOne(10)
+        composeTestRule
+            .forGivenContent {
+                val state = remember { mutableStateOf(0) }
+                Text("Hello ${state.value}")
+                state.value++
             }
-        }
+            .performTestWithEventsControl {
+                assertFailsWith<AssertionError>("Changes are still pending after '10' frames.") {
+                    doFramesAssertAllHadChangesExceptLastOne(10)
+                }
+            }
     }
 
     // @Test //- TODO: Does not work, performs only 1 frame until stable
     fun foreverRecomposing_viaStatePreCommit_shouldFail() {
-        composeTestRule.forGivenContent {
-            val state = remember { mutableStateOf(0) }
-            Text("Hello ${state.value}")
-            SideEffect {
-                state.value++
+        composeTestRule
+            .forGivenContent {
+                val state = remember { mutableStateOf(0) }
+                Text("Hello ${state.value}")
+                SideEffect { state.value++ }
             }
-        }.performTestWithEventsControl {
-            assertFailsWith<AssertionError>(
-                "Changes are still pending after '10' frames."
-            ) {
-                doFramesAssertAllHadChangesExceptLastOne(10)
+            .performTestWithEventsControl {
+                assertFailsWith<AssertionError>("Changes are still pending after '10' frames.") {
+                    doFramesAssertAllHadChangesExceptLastOne(10)
+                }
             }
-        }
     }
 
     @Test
     fun recomposeZeroTime() {
-        composeTestRule.forGivenContent {
-            // Just empty composable
-        }.performTestWithEventsControl {
-            doFrame()
-            assertNoPendingChanges()
-        }
+        composeTestRule
+            .forGivenContent {
+                // Just empty composable
+            }
+            .performTestWithEventsControl {
+                doFrame()
+                assertNoPendingChanges()
+            }
     }
 
     @Test
     fun recomposeZeroTime2() {
-        composeTestRule.forGivenContent {
-            Text("Hello")
-        }.performTestWithEventsControl {
-            doFrame()
-            assertNoPendingChanges()
-        }
+        composeTestRule
+            .forGivenContent { Text("Hello") }
+            .performTestWithEventsControl {
+                doFrame()
+                assertNoPendingChanges()
+            }
     }
 
     @Test
     fun recomposeOnce() {
-        composeTestRule.forGivenContent {
-            val state = remember { mutableStateOf(0) }
-            if (state.value < 1) {
-                state.value++
+        composeTestRule
+            .forGivenContent {
+                val state = remember { mutableStateOf(0) }
+                if (state.value < 1) {
+                    state.value++
+                }
             }
-        }.performTestWithEventsControl {
-            doFrame()
-            assertNoPendingChanges()
-        }
+            .performTestWithEventsControl {
+                doFrame()
+                assertNoPendingChanges()
+            }
     }
 
     // @Test //- TODO: Does not work, performs only 1 frame until stable
     fun recomposeTwice() {
-        composeTestRule.forGivenContent {
-            val state = remember { mutableStateOf(0) }
-            if (state.value < 2) {
-                state.value++
+        composeTestRule
+            .forGivenContent {
+                val state = remember { mutableStateOf(0) }
+                if (state.value < 2) {
+                    state.value++
+                }
             }
-        }.performTestWithEventsControl {
-            doFramesAssertAllHadChangesExceptLastOne(2)
-        }
+            .performTestWithEventsControl { doFramesAssertAllHadChangesExceptLastOne(2) }
     }
 
     @Test
     fun recomposeTwice2() {
         val count = mutableStateOf(0)
-        composeTestRule.forGivenContent {
-            Text("Hello ${count.value}")
-            if (count.value < 3) {
-                count.value++
+        composeTestRule
+            .forGivenContent {
+                Text("Hello ${count.value}")
+                if (count.value < 3) {
+                    count.value++
+                }
             }
-        }.performTestWithEventsControl {
-            // Force the first recompose as the changes during initial composition are not
-            // considered to invalidate the composition.
-            count.value++
-            doFramesAssertAllHadChangesExceptLastOne(2)
-        }
+            .performTestWithEventsControl {
+                // Force the first recompose as the changes during initial composition are not
+                // considered to invalidate the composition.
+                count.value++
+                doFramesAssertAllHadChangesExceptLastOne(2)
+            }
     }
 
     @Test
     fun measurePositiveOnEmptyShouldFail() {
-        composeTestRule.forGivenContent {
-            // Just empty composable
-        }.performTestWithEventsControl {
-            doFrame()
-            assertFailsWith<AssertionError> {
-                assertMeasureSizeIsPositive()
+        composeTestRule
+            .forGivenContent {
+                // Just empty composable
             }
-        }
+            .performTestWithEventsControl {
+                doFrame()
+                assertFailsWith<AssertionError> { assertMeasureSizeIsPositive() }
+            }
     }
 
     @Test
     fun measurePositive() {
-        composeTestRule.forGivenContent {
-            Box {
-                Text("Hello")
+        composeTestRule
+            .forGivenContent { Box { Text("Hello") } }
+            .performTestWithEventsControl {
+                doFrame()
+                assertMeasureSizeIsPositive()
             }
-        }.performTestWithEventsControl {
-            doFrame()
-            assertMeasureSizeIsPositive()
-        }
     }
 
     @Test
     fun countLaunchedCoroutines_noContentLaunches() {
-        composeTestRule.forGivenContent {
-            Box {
-                Text("Hello")
-            }
-        }.performTestWithEventsControl {
-            assertCoroutinesCount(0)
-        }
+        composeTestRule
+            .forGivenContent { Box { Text("Hello") } }
+            .performTestWithEventsControl { assertCoroutinesCount(0) }
     }
 
     @Test
     fun countLaunchedCoroutines_modifierLaunches() {
-        val node = object : Modifier.Node() {
-            override fun onAttach() {
-                super.onAttach()
-                coroutineScope.launch { }
+        val node =
+            object : Modifier.Node() {
+                override fun onAttach() {
+                    super.onAttach()
+                    coroutineScope.launch {}
+                }
             }
-        }
-        val element = object : ModifierNodeElement<Modifier.Node>() {
-            override fun create(): Modifier.Node = node
+        val element =
+            object : ModifierNodeElement<Modifier.Node>() {
+                override fun create(): Modifier.Node = node
 
-            override fun update(node: Modifier.Node) {
-                // no op
+                override fun update(node: Modifier.Node) {
+                    // no op
+                }
+
+                override fun hashCode(): Int = 0
+
+                override fun equals(other: Any?): Boolean = false
             }
-
-            override fun hashCode(): Int = 0
-
-            override fun equals(other: Any?): Boolean = false
-        }
-        composeTestRule.forGivenContent {
-            Box(Modifier.then(element)) {
-                Text("Hello")
-            }
-        }.performTestWithEventsControl {
-            assertCoroutinesCount(1)
-        }
+        composeTestRule
+            .forGivenContent { Box(Modifier.then(element)) { Text("Hello") } }
+            .performTestWithEventsControl { assertCoroutinesCount(1) }
     }
 
     @Test
     fun countLaunchedCoroutines_launchedEffect() {
-        composeTestRule.forGivenContent {
-            LaunchedEffect(Unit) {
-                launch { }
-            }
-        }.performTestWithEventsControl {
-            assertCoroutinesCount(2)
-        }
+        composeTestRule
+            .forGivenContent { LaunchedEffect(Unit) { launch {} } }
+            .performTestWithEventsControl { assertCoroutinesCount(2) }
     }
 
     @Test
     fun countLaunchedCoroutines_scopeLaunches_lazy() {
-        composeTestRule.forGivenContent {
-            val scope = rememberCoroutineScope()
-            Box(Modifier.clickable {
-                scope.launch { }
-            }) {
-                Text("Hello")
+        composeTestRule
+            .forGivenContent {
+                val scope = rememberCoroutineScope()
+                Box(Modifier.clickable { scope.launch {} }) { Text("Hello") }
             }
-        }.performTestWithEventsControl {
-            assertCoroutinesCount(0)
-        }
+            .performTestWithEventsControl { assertCoroutinesCount(0) }
     }
 
     @Test
     fun countLaunchedCoroutines_suspend() {
-        composeTestRule.forGivenContent {
-            LaunchedEffect(Unit) {
-                suspendCancellableCoroutine {}
-            }
+        composeTestRule
+            .forGivenContent {
+                LaunchedEffect(Unit) { suspendCancellableCoroutine {} }
 
-            LaunchedEffect(Unit) {
-                suspendCoroutine {}
+                LaunchedEffect(Unit) { suspendCoroutine {} }
             }
-        }.performTestWithEventsControl {
-            assertCoroutinesCount(2)
-        }
+            .performTestWithEventsControl { assertCoroutinesCount(2) }
     }
 
     @Test
     fun countLaunchedCoroutines_delay() {
-        composeTestRule.forGivenContent {
-            LaunchedEffect(Unit) {
-                delay(1_000L)
-            }
+        composeTestRule
+            .forGivenContent {
+                LaunchedEffect(Unit) { delay(1_000L) }
 
-            LaunchedEffect(Unit) {
-                launch { }
+                LaunchedEffect(Unit) { launch {} }
             }
-        }.performTestWithEventsControl {
-            assertCoroutinesCount(3)
-        }
+            .performTestWithEventsControl { assertCoroutinesCount(3) }
     }
 
     @Test
     fun countLaunchedCoroutines_yield() {
-        composeTestRule.forGivenContent {
-            LaunchedEffect(Unit) {
-                yield()
-            }
+        composeTestRule
+            .forGivenContent {
+                LaunchedEffect(Unit) { yield() }
 
-            LaunchedEffect(Unit) {
-                launch { }
+                LaunchedEffect(Unit) { launch {} }
             }
-        }.performTestWithEventsControl {
-            assertCoroutinesCount(3)
-        }
+            .performTestWithEventsControl { assertCoroutinesCount(3) }
     }
 
     private inline fun <reified T : Throwable> assertFailsWith(
@@ -317,8 +292,7 @@
             }
             if (expectedErrorMessage != null && e.localizedMessage != expectedErrorMessage) {
                 throw AssertionError(
-                    "Expected error message not found, received: '" +
-                        "${e.localizedMessage}'"
+                    "Expected error message not found, received: '" + "${e.localizedMessage}'"
                 )
             }
             return
diff --git a/compose/test-utils/src/androidInstrumentedTest/kotlin/androidx/compose/testutils/ImageAssertionsTest.kt b/compose/test-utils/src/androidInstrumentedTest/kotlin/androidx/compose/testutils/ImageAssertionsTest.kt
index 0eade5e..562d9ee 100644
--- a/compose/test-utils/src/androidInstrumentedTest/kotlin/androidx/compose/testutils/ImageAssertionsTest.kt
+++ b/compose/test-utils/src/androidInstrumentedTest/kotlin/androidx/compose/testutils/ImageAssertionsTest.kt
@@ -35,30 +35,30 @@
         private const val Height = 16
         private const val Width = 4
 
-        private val testPixels = Array(Height) { y ->
-            IntArray(Width) { x ->
-                when (x) {
-                    3 -> (0x10 * y).shl(24) // alpha
-                    else -> (0x10 * y).shl(8 * x) or 0xFF.shl(24) // rgb
+        private val testPixels =
+            Array(Height) { y ->
+                IntArray(Width) { x ->
+                    when (x) {
+                        3 -> (0x10 * y).shl(24) // alpha
+                        else -> (0x10 * y).shl(8 * x) or 0xFF.shl(24) // rgb
+                    }
                 }
             }
-        }
     }
 
     private fun createTestBitmap(): ImageBitmap {
-        val srcPixels = IntArray(Height * Width) { i ->
-            val y = i / Width
-            val x = i % Width
-            testPixels[y][x]
-        }
+        val srcPixels =
+            IntArray(Height * Width) { i ->
+                val y = i / Width
+                val x = i % Width
+                testPixels[y][x]
+            }
         val bitmap = Bitmap.createBitmap(Width, Height, Bitmap.Config.ARGB_8888)
         bitmap.setPixels(srcPixels, 0, Width, 0, 0, Width, Height)
         return bitmap.asImageBitmap()
     }
 
-    /**
-     * Tests if the size verification of assertPixels works
-     */
+    /** Tests if the size verification of assertPixels works */
     @Test
     fun assertPixels_size() {
         val bitmap = createTestBitmap()
@@ -66,8 +66,8 @@
     }
 
     /**
-     * Tests if the color verification of assertPixels works.
-     * Exercises all channels (RGBA) with values running from 0x00 to 0xF0.
+     * Tests if the color verification of assertPixels works. Exercises all channels (RGBA) with
+     * values running from 0x00 to 0xF0.
      */
     @Test
     fun assertPixels_colors() {
@@ -75,9 +75,7 @@
         bitmap.assertPixels { Color(testPixels[it.y][it.x]) }
     }
 
-    /**
-     * Tests the error message when size verification of assertPixels detects a failure
-     */
+    /** Tests the error message when size verification of assertPixels detects a failure */
     @Test
     fun assertPixels_wrongSize() {
         val bitmap = Bitmap.createBitmap(1, 1, Bitmap.Config.ARGB_8888).asImageBitmap()
@@ -88,9 +86,7 @@
         }
     }
 
-    /**
-     * Tests the error message when color verification of assertPixels detects a failure
-     */
+    /** Tests the error message when color verification of assertPixels detects a failure */
     @Test
     fun assertPixels_wrongColor() {
         val rawBitmap = Bitmap.createBitmap(1, 2, Bitmap.Config.ARGB_8888)
@@ -99,17 +95,16 @@
         val bitmap = rawBitmap.asImageBitmap()
 
         expectError<AssertionError>(
-            expectedMessage = "Pixel\\(0, 1\\) expected to be " +
-                "Color\\(1.0, 0.0, 0.0, 1.0, .*\\), but was " +
-                "Color\\(0.0, 1.0, 0.0, 1.0, .*\\).*"
+            expectedMessage =
+                "Pixel\\(0, 1\\) expected to be " +
+                    "Color\\(1.0, 0.0, 0.0, 1.0, .*\\), but was " +
+                    "Color\\(0.0, 1.0, 0.0, 1.0, .*\\).*"
         ) {
             bitmap.assertPixels { Color(Red) }
         }
     }
 
-    /**
-     * Tests if assertContainsColor works
-     */
+    /** Tests if assertContainsColor works */
     @Test
     fun assertContainsColor() {
         val rawBitmap = Bitmap.createBitmap(2, 2, Bitmap.Config.ARGB_8888)
@@ -118,15 +113,14 @@
         bitmap.assertContainsColor(Color(Red))
     }
 
-    /**
-     * Tests the error message when assertContainsColor detects a failure
-     */
+    /** Tests the error message when assertContainsColor detects a failure */
     @Test
     fun assertContainsColor_wrongColor() {
         val bitmap = Bitmap.createBitmap(2, 2, Bitmap.Config.ARGB_8888).asImageBitmap()
         expectError<AssertionError>(
-            expectedMessage = "The given color Color\\(1.0, 0.0, 0.0, 1.0, .*\\) " +
-                "was not found in the bitmap."
+            expectedMessage =
+                "The given color Color\\(1.0, 0.0, 0.0, 1.0, .*\\) " +
+                    "was not found in the bitmap."
         ) {
             bitmap.assertContainsColor(Color(Red))
         }
diff --git a/compose/test-utils/src/androidInstrumentedTest/kotlin/androidx/compose/testutils/ParameterizedComposeTestRuleTest.kt b/compose/test-utils/src/androidInstrumentedTest/kotlin/androidx/compose/testutils/ParameterizedComposeTestRuleTest.kt
index 0f65302..30904c7 100644
--- a/compose/test-utils/src/androidInstrumentedTest/kotlin/androidx/compose/testutils/ParameterizedComposeTestRuleTest.kt
+++ b/compose/test-utils/src/androidInstrumentedTest/kotlin/androidx/compose/testutils/ParameterizedComposeTestRuleTest.kt
@@ -25,35 +25,29 @@
 import org.junit.Test
 
 class ParameterizedComposeTestRuleTest {
-    @get:Rule
-    val composeTestRule = createParameterizedComposeTestRule<Param>()
+    @get:Rule val composeTestRule = createParameterizedComposeTestRule<Param>()
 
     @Test
     fun assertionErrorInParameterIsPropagated() {
         val paramList = listOf(Param("first"), Param("second"))
-        composeTestRule.setContent {
-            Box(modifier = Modifier.size(10.dp))
-        }
+        composeTestRule.setContent { Box(modifier = Modifier.size(10.dp)) }
 
-        val error = kotlin.runCatching {
-            composeTestRule.forEachParameter(paramList) {
-                if (it.singleParam == "first") {
-                    throw AssertionError()
+        val error =
+            kotlin.runCatching {
+                composeTestRule.forEachParameter(paramList) {
+                    if (it.singleParam == "first") {
+                        throw AssertionError()
+                    }
                 }
             }
-        }
 
         assertTrue(error.exceptionOrNull()?.localizedMessage?.contains("Error on Config") == true)
     }
 
     @Test(expected = IllegalStateException::class)
     fun setContentCannotBeCalledTwice() {
-        composeTestRule.setContent {
-            Box(modifier = Modifier.size(10.dp))
-        }
-        composeTestRule.setContent {
-            Box(modifier = Modifier.size(10.dp))
-        }
+        composeTestRule.setContent { Box(modifier = Modifier.size(10.dp)) }
+        composeTestRule.setContent { Box(modifier = Modifier.size(10.dp)) }
     }
 
     @Test(expected = IllegalStateException::class)
@@ -65,9 +59,7 @@
     fun forEachParameterRunsCompositionForEachParameter() {
         val paramList = listOf(Param("first"), Param("second"))
         var recompositionCount = 0
-        composeTestRule.setContent {
-            recompositionCount++
-        }
+        composeTestRule.setContent { recompositionCount++ }
         composeTestRule.forEachParameter(paramList) {}
         assertTrue(recompositionCount == paramList.size)
     }
@@ -76,9 +68,7 @@
     fun forEachParameterPropagatesParameterToContentAndRunBlock() {
         val paramList = listOf(Param("first"), Param("second"))
         var index = 0
-        composeTestRule.setContent {
-            assertTrue(it.singleParam == paramList[index].singleParam)
-        }
+        composeTestRule.setContent { assertTrue(it.singleParam == paramList[index].singleParam) }
 
         composeTestRule.forEachParameter(paramList) {
             assertTrue(it.singleParam == paramList[index].singleParam)
diff --git a/compose/test-utils/src/androidMain/kotlin/androidx/compose/testutils/AndroidComposeTestCaseRunner.android.kt b/compose/test-utils/src/androidMain/kotlin/androidx/compose/testutils/AndroidComposeTestCaseRunner.android.kt
index 3bb41e2..25992b7 100644
--- a/compose/test-utils/src/androidMain/kotlin/androidx/compose/testutils/AndroidComposeTestCaseRunner.android.kt
+++ b/compose/test-utils/src/androidMain/kotlin/androidx/compose/testutils/AndroidComposeTestCaseRunner.android.kt
@@ -47,9 +47,7 @@
 import kotlinx.coroutines.launch
 import kotlinx.coroutines.test.UnconfinedTestDispatcher
 
-/**
- * Factory method to provide implementation of [ComposeBenchmarkScope].
- */
+/** Factory method to provide implementation of [ComposeBenchmarkScope]. */
 fun <T : ComposeTestCase> createAndroidComposeBenchmarkRunner(
     testCaseFactory: () -> T,
     activity: ComponentActivity
@@ -65,6 +63,7 @@
 
     override val measuredWidth: Int
         get() = view!!.measuredWidth
+
     override val measuredHeight: Int
         get() = view!!.measuredHeight
 
@@ -77,35 +76,39 @@
         private set
 
     private val supportsRenderNode = Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q
-    private val supportsMRenderNode = Build.VERSION.SDK_INT < Build.VERSION_CODES.P &&
-        Build.VERSION.SDK_INT >= Build.VERSION_CODES.M
+    private val supportsMRenderNode =
+        Build.VERSION.SDK_INT < Build.VERSION_CODES.P &&
+            Build.VERSION.SDK_INT >= Build.VERSION_CODES.M
 
     private val screenWithSpec: Int
     private val screenHeightSpec: Int
 
     @Suppress("NewApi") // NewApi doesn't understand Kotlin `when` (b/189459502)
-    private val capture = when {
-        supportsRenderNode -> RenderNodeCapture()
-        supportsMRenderNode -> MRenderNodeCapture()
-        else -> PictureCapture()
-    }
+    private val capture =
+        when {
+            supportsRenderNode -> RenderNodeCapture()
+            supportsMRenderNode -> MRenderNodeCapture()
+            else -> PictureCapture()
+        }
 
     private var canvas: Canvas? = null
 
     private val testCoroutineDispatcher = UnconfinedTestDispatcher()
-    private val frameClock = TestMonotonicFrameClock(
-        CoroutineScope(testCoroutineDispatcher + testCoroutineDispatcher.scheduler)
-    )
+    private val frameClock =
+        TestMonotonicFrameClock(
+            CoroutineScope(testCoroutineDispatcher + testCoroutineDispatcher.scheduler)
+        )
 
     private val continuationCountInterceptor =
         ContinuationCountInterceptor(frameClock.continuationInterceptor)
 
     @OptIn(ExperimentalTestApi::class)
-    private val recomposerApplyCoroutineScope = CoroutineScope(
-        continuationCountInterceptor + frameClock + Job()
-    )
-    private val recomposer: Recomposer = Recomposer(recomposerApplyCoroutineScope.coroutineContext)
-        .also { recomposerApplyCoroutineScope.launch { it.runRecomposeAndApplyChanges() } }
+    private val recomposerApplyCoroutineScope =
+        CoroutineScope(continuationCountInterceptor + frameClock + Job())
+    private val recomposer: Recomposer =
+        Recomposer(recomposerApplyCoroutineScope.coroutineContext).also {
+            recomposerApplyCoroutineScope.launch { it.runRecomposeAndApplyChanges() }
+        }
 
     private var simulationState: SimulationState = SimulationState.Initialized
 
@@ -164,9 +167,9 @@
 
     /**
      * The reason we have this method is that if a model gets changed in the same frame as created
-     * it won'd trigger pending frame. So [Recompose#hasPendingChanges] stays false. Committing
-     * the current frame does not help either. So we need to check this in order to know if we
-     * need to recompose.
+     * it won'd trigger pending frame. So [Recompose#hasPendingChanges] stays false. Committing the
+     * current frame does not help either. So we need to check this in order to know if we need to
+     * recompose.
      */
     private fun hasPendingChangesInFrame(): Boolean {
         return Snapshot.current.hasPendingChanges()
@@ -363,6 +366,7 @@
 // potentially unloaded class, RenderNodeCapture.
 private interface DrawCapture {
     fun beginRecording(width: Int, height: Int): Canvas
+
     fun endRecording()
 }
 
diff --git a/compose/test-utils/src/androidMain/kotlin/androidx/compose/testutils/ImageAssertions.android.kt b/compose/test-utils/src/androidMain/kotlin/androidx/compose/testutils/ImageAssertions.android.kt
index 168a2e5..eafbbdc 100644
--- a/compose/test-utils/src/androidMain/kotlin/androidx/compose/testutils/ImageAssertions.android.kt
+++ b/compose/test-utils/src/androidMain/kotlin/androidx/compose/testutils/ImageAssertions.android.kt
@@ -41,9 +41,8 @@
  * A helper function to run asserts on [Bitmap].
  *
  * @param expectedSize The expected size of the bitmap. Leave null to skip the check.
- * @param expectedColorProvider Returns the expected color for the provided pixel position.
- * The returned color is then asserted as the expected one on the given bitmap.
- *
+ * @param expectedColorProvider Returns the expected color for the provided pixel position. The
+ *   returned color is then asserted as the expected one on the given bitmap.
  * @throws AssertionError if size or colors don't match.
  */
 fun ImageBitmap.assertPixels(
@@ -53,8 +52,7 @@
     if (expectedSize != null) {
         if (width != expectedSize.width || height != expectedSize.height) {
             throw AssertionError(
-                "Bitmap size is wrong! Expected '$expectedSize' but got " +
-                    "'$width x $height'"
+                "Bitmap size is wrong! Expected '$expectedSize' but got " + "'$width x $height'"
             )
         }
     }
@@ -71,9 +69,7 @@
     }
 }
 
-/**
- * Asserts that the color at a specific pixel in the bitmap at ([x], [y]) is [expected].
- */
+/** Asserts that the color at a specific pixel in the bitmap at ([x], [y]) is [expected]. */
 fun PixelMap.assertPixelColor(
     expected: Color,
     x: Int,
@@ -93,18 +89,14 @@
  *
  * @throws AssertionError if the expected color is not present.
  */
-fun ImageBitmap.assertContainsColor(
-    expectedColor: Color
-): ImageBitmap {
+fun ImageBitmap.assertContainsColor(expectedColor: Color): ImageBitmap {
     if (!containsColor(expectedColor)) {
         throw AssertionError("The given color $expectedColor was not found in the bitmap.")
     }
     return this
 }
 
-fun ImageBitmap.assertDoesNotContainColor(
-    unexpectedColor: Color
-): ImageBitmap {
+fun ImageBitmap.assertDoesNotContainColor(unexpectedColor: Color): ImageBitmap {
     if (containsColor(unexpectedColor)) {
         throw AssertionError("The given color $unexpectedColor was found in the bitmap.")
     }
@@ -125,9 +117,8 @@
 }
 
 /**
- * Tests to see if the given point is within the path. (That is, whether the
- * point would be in the visible portion of the path if the path was used
- * with [Canvas.clipPath].)
+ * Tests to see if the given point is within the path. (That is, whether the point would be in the
+ * visible portion of the path if the path was used with [Canvas.clipPath].)
  *
  * The `point` argument is interpreted as an offset from the origin.
  *
@@ -150,8 +141,8 @@
 
 /**
  * Asserts that the given [shape] is drawn within the bitmap with the size the dimensions
- * [shapeSizeX] x [shapeSizeY], centered at ([centerX], [centerY]) with the color [shapeColor].
- * The bitmap area examined is [sizeX] x [sizeY], centered at ([centerX], [centerY]) and everything
+ * [shapeSizeX] x [shapeSizeY], centered at ([centerX], [centerY]) with the color [shapeColor]. The
+ * bitmap area examined is [sizeX] x [sizeY], centered at ([centerX], [centerY]) and everything
  * outside the shape is expected to be color [backgroundColor].
  *
  * @param density current [Density] or the screen
@@ -166,7 +157,7 @@
  * @param centerX the X position of the center of the [shape] inside the [sizeX]
  * @param centerY the Y position of the center of the [shape] inside the [sizeY]
  * @param shapeOverlapPixelCount The size of the border area from the shape outline to leave it
- * untested as it is likely anti-aliased. The default is 1 pixel
+ *   untested as it is likely anti-aliased. The default is 1 pixel
  */
 // TODO (mount, malkov) : to investigate why it flakes when shape is not rect
 fun ImageBitmap.assertShape(
@@ -193,10 +184,7 @@
     val outline = shape.createOutline(Size(shapeSizeX, shapeSizeY), LayoutDirection.Ltr, density)
     val path = Path()
     path.addOutline(outline)
-    val shapeOffset = Offset(
-        (centerX - shapeSizeX / 2f),
-        (centerY - shapeSizeY / 2f)
-    )
+    val shapeOffset = Offset((centerX - shapeSizeX / 2f), (centerY - shapeSizeY / 2f))
     val backgroundPath = Path()
     backgroundPath.addOutline(
         backgroundShape.createOutline(Size(sizeX, sizeY), LayoutDirection.Ltr, density)
@@ -204,34 +192,22 @@
     for (y in centerY - sizeY / 2 until centerY + sizeY / 2) {
         for (x in centerX - sizeX / 2 until centerX + sizeX / 2) {
             val point = Offset(x.toFloat(), y.toFloat())
-            if (!backgroundPath.contains(
-                    pixelFartherFromCenter(
-                        point,
-                        sizeX,
-                        sizeY,
-                        shapeOverlapPixelCount
-                    )
+            if (
+                !backgroundPath.contains(
+                    pixelFartherFromCenter(point, sizeX, sizeY, shapeOverlapPixelCount)
                 )
             ) {
                 continue
             }
             val offset = point - shapeOffset
-            val isInside = path.contains(
-                pixelFartherFromCenter(
-                    offset,
-                    shapeSizeX,
-                    shapeSizeY,
-                    shapeOverlapPixelCount
+            val isInside =
+                path.contains(
+                    pixelFartherFromCenter(offset, shapeSizeX, shapeSizeY, shapeOverlapPixelCount)
                 )
-            )
-            val isOutside = !path.contains(
-                pixelCloserToCenter(
-                    offset,
-                    shapeSizeX,
-                    shapeSizeY,
-                    shapeOverlapPixelCount
+            val isOutside =
+                !path.contains(
+                    pixelCloserToCenter(offset, shapeSizeX, shapeSizeY, shapeOverlapPixelCount)
                 )
-            )
             if (isInside) {
                 pixels.assertPixelColor(shapeColor, x, y)
             } else if (isOutside) {
@@ -243,8 +219,8 @@
 
 /**
  * Asserts that the bitmap is fully occupied by the given [shape] with the color [shapeColor]
- * without [horizontalPadding] and [verticalPadding] from the sides. The padded area is expected
- * to have [backgroundColor].
+ * without [horizontalPadding] and [verticalPadding] from the sides. The padded area is expected to
+ * have [backgroundColor].
  *
  * @param density current [Density] or the screen
  * @param horizontalPadding the symmetrical padding to be applied from both left and right sides
@@ -253,7 +229,7 @@
  * @param shapeColor the color of the shape
  * @param shape defines the [Shape]
  * @param shapeOverlapPixelCount The size of the border area from the shape outline to leave it
- * untested as it is likely anti-aliased. The default is 1 pixel
+ *   untested as it is likely anti-aliased. The default is 1 pixel
  */
 fun ImageBitmap.assertShape(
     density: Density,
@@ -294,16 +270,18 @@
     val centerX = shapeSizeX / 2f
     val centerY = shapeSizeY / 2f
     val d = delta
-    val x = when {
-        offset.x > centerX -> offset.x - d
-        offset.x < centerX -> offset.x + d
-        else -> offset.x
-    }
-    val y = when {
-        offset.y > centerY -> offset.y - d
-        offset.y < centerY -> offset.y + d
-        else -> offset.y
-    }
+    val x =
+        when {
+            offset.x > centerX -> offset.x - d
+            offset.x < centerX -> offset.x + d
+            else -> offset.x
+        }
+    val y =
+        when {
+            offset.y > centerY -> offset.y - d
+            offset.y < centerY -> offset.y + d
+            else -> offset.y
+        }
     return Offset(x, y)
 }
 
@@ -316,15 +294,17 @@
     val centerX = shapeSizeX / 2f
     val centerY = shapeSizeY / 2f
     val d = delta
-    val x = when {
-        offset.x > centerX -> offset.x + d
-        offset.x < centerX -> offset.x - d
-        else -> offset.x
-    }
-    val y = when {
-        offset.y > centerY -> offset.y + d
-        offset.y < centerY -> offset.y - d
-        else -> offset.y
-    }
+    val x =
+        when {
+            offset.x > centerX -> offset.x + d
+            offset.x < centerX -> offset.x - d
+            else -> offset.x
+        }
+    val y =
+        when {
+            offset.y > centerY -> offset.y + d
+            offset.y < centerY -> offset.y - d
+            else -> offset.y
+        }
     return Offset(x, y)
 }
diff --git a/compose/test-utils/src/androidMain/kotlin/androidx/compose/testutils/ScreenshotTestsUtils.android.kt b/compose/test-utils/src/androidMain/kotlin/androidx/compose/testutils/ScreenshotTestsUtils.android.kt
index 0b410bd..cf60e71 100644
--- a/compose/test-utils/src/androidMain/kotlin/androidx/compose/testutils/ScreenshotTestsUtils.android.kt
+++ b/compose/test-utils/src/androidMain/kotlin/androidx/compose/testutils/ScreenshotTestsUtils.android.kt
@@ -32,8 +32,8 @@
  *
  * @param rule The screenshot test rule that provides the comparison and reporting.
  * @param goldenIdentifier Name of the golden. Allowed characters: 'A-Za-z0-9_-'
- * @param matcher The algorithm to be used to perform the matching. By default [MSSIMMatcher]
- * is used.
+ * @param matcher The algorithm to be used to perform the matching. By default [MSSIMMatcher] is
+ *   used.
  */
 fun ImageBitmap.assertAgainstGolden(
     rule: ScreenshotTestRule,
diff --git a/compose/test-utils/src/androidMain/kotlin/androidx/compose/testutils/TestRuleExtensions.android.kt b/compose/test-utils/src/androidMain/kotlin/androidx/compose/testutils/TestRuleExtensions.android.kt
index 4164cfa..1baa1ee 100644
--- a/compose/test-utils/src/androidMain/kotlin/androidx/compose/testutils/TestRuleExtensions.android.kt
+++ b/compose/test-utils/src/androidMain/kotlin/androidx/compose/testutils/TestRuleExtensions.android.kt
@@ -36,8 +36,5 @@
         return activity!!
     }
 
-    return AndroidComposeTestCaseSetup(
-        testCase,
-        getActivity()
-    )
+    return AndroidComposeTestCaseSetup(testCase, getActivity())
 }
diff --git a/compose/test-utils/src/androidMain/kotlin/androidx/compose/testutils/ViewCapture.android.kt b/compose/test-utils/src/androidMain/kotlin/androidx/compose/testutils/ViewCapture.android.kt
index e03df74..aa2e1ee 100644
--- a/compose/test-utils/src/androidMain/kotlin/androidx/compose/testutils/ViewCapture.android.kt
+++ b/compose/test-utils/src/androidMain/kotlin/androidx/compose/testutils/ViewCapture.android.kt
@@ -39,9 +39,9 @@
 /**
  * Captures the underlying view's surface into bitmap.
  *
- * This has currently several limitations. Currently we assume that the view is hosted in
- * Activity's window. Also if there is another window covering part of the component if won't occur
- * in the bitmap as this is taken from the component's window surface.
+ * This has currently several limitations. Currently we assume that the view is hosted in Activity's
+ * window. Also if there is another window covering part of the component if won't occur in the
+ * bitmap as this is taken from the component's window surface.
  */
 @RequiresApi(Build.VERSION_CODES.O)
 fun View.captureToImage(): ImageBitmap {
@@ -71,18 +71,21 @@
                 drawLatch.countDown()
             }
         } else {
-            decorView.viewTreeObserver.addOnDrawListener(object : ViewTreeObserver.OnDrawListener {
-                var handled = false
-                override fun onDraw() {
-                    if (!handled) {
-                        handled = true
-                        handler.post {
-                            drawLatch.countDown()
-                            decorView.viewTreeObserver.removeOnDrawListener(this)
+            decorView.viewTreeObserver.addOnDrawListener(
+                object : ViewTreeObserver.OnDrawListener {
+                    var handled = false
+
+                    override fun onDraw() {
+                        if (!handled) {
+                            handled = true
+                            handler.post {
+                                drawLatch.countDown()
+                                decorView.viewTreeObserver.removeOnDrawListener(this)
+                            }
                         }
                     }
                 }
-            })
+            )
         }
         decorView.invalidate()
     }
@@ -91,11 +94,12 @@
     }
 
     // and then request the pixel copy of the drawn buffer
-    val destBitmap = Bitmap.createBitmap(
-        boundsInWindow.width(),
-        boundsInWindow.height(),
-        Bitmap.Config.ARGB_8888
-    )
+    val destBitmap =
+        Bitmap.createBitmap(
+            boundsInWindow.width(),
+            boundsInWindow.height(),
+            Bitmap.Config.ARGB_8888
+        )
 
     val latch = CountDownLatch(1)
     var copyResult = 0
diff --git a/compose/test-utils/src/androidUnitTest/kotlin/androidx/compose/testutils/DpAssertionsTest.kt b/compose/test-utils/src/androidUnitTest/kotlin/androidx/compose/testutils/DpAssertionsTest.kt
index dc6ab69..84f18da7 100644
--- a/compose/test-utils/src/androidUnitTest/kotlin/androidx/compose/testutils/DpAssertionsTest.kt
+++ b/compose/test-utils/src/androidUnitTest/kotlin/androidx/compose/testutils/DpAssertionsTest.kt
@@ -38,9 +38,7 @@
 
     @Test
     fun dp_assertEquals_fail() {
-        expectError<AssertionError> {
-            5.dp.assertIsEqualTo(6.dp)
-        }
+        expectError<AssertionError> { 5.dp.assertIsEqualTo(6.dp) }
     }
 
     @Test
diff --git a/compose/test-utils/src/androidUnitTest/kotlin/androidx/compose/testutils/ExpectTest.kt b/compose/test-utils/src/androidUnitTest/kotlin/androidx/compose/testutils/ExpectTest.kt
index 01564423..1f07ce4 100644
--- a/compose/test-utils/src/androidUnitTest/kotlin/androidx/compose/testutils/ExpectTest.kt
+++ b/compose/test-utils/src/androidUnitTest/kotlin/androidx/compose/testutils/ExpectTest.kt
@@ -28,23 +28,17 @@
 
     @Test
     fun expectError_gotError() {
-        expectError<TestException> {
-            throw TestException()
-        }
+        expectError<TestException> { throw TestException() }
     }
 
     @Test
     fun expectError_gotErrorWithMessage() {
-        expectError<TestException> {
-            throw TestException("message")
-        }
+        expectError<TestException> { throw TestException("message") }
     }
 
     @Test
     fun expectError_gotErrorWithMultilineMessage() {
-        expectError<TestException> {
-            throw TestException("message\nwith 2 lines")
-        }
+        expectError<TestException> { throw TestException("message\nwith 2 lines") }
     }
 
     @Test
@@ -52,8 +46,7 @@
         expectErrorMessage(
             "Expected that a TestException would be thrown, but nothing was thrown"
         ) {
-            expectError<TestException> {
-            }
+            expectError<TestException> {}
         }
     }
 
@@ -63,16 +56,13 @@
             "Expected that a TestException would be thrown, " +
                 "but a IllegalStateException was thrown:\n=="
         ) {
-            expectError<TestException> {
-                throw IllegalStateException()
-            }
+            expectError<TestException> { throw IllegalStateException() }
         }
     }
 
     @Test
     fun expectNoError_gotNoError() {
-        expectError<TestException>(false) {
-        }
+        expectError<TestException>(false) {}
     }
 
     @Test
@@ -80,9 +70,7 @@
         expectErrorMessage(
             "Expected that nothing would be thrown, but a TestException was thrown:\n=="
         ) {
-            expectError<TestException>(false) {
-                throw TestException()
-            }
+            expectError<TestException>(false) { throw TestException() }
         }
     }
 
@@ -91,17 +79,13 @@
         expectErrorMessage(
             "Expected that nothing would be thrown, but a IllegalStateException was thrown:\n=="
         ) {
-            expectError<TestException>(false) {
-                throw IllegalStateException()
-            }
+            expectError<TestException>(false) { throw IllegalStateException() }
         }
     }
 
     @Test
     fun expectErrorWithMessage_gotErrorWithMessage() {
-        expectError<TestException>(expectedMessage = "message") {
-            throw TestException("message")
-        }
+        expectError<TestException>(expectedMessage = "message") { throw TestException("message") }
     }
 
     @Test
diff --git a/compose/test-utils/src/commonMain/kotlin/androidx/compose/testutils/ComposeBenchmarkScope.kt b/compose/test-utils/src/commonMain/kotlin/androidx/compose/testutils/ComposeBenchmarkScope.kt
index 2f7548b..742eedd 100644
--- a/compose/test-utils/src/commonMain/kotlin/androidx/compose/testutils/ComposeBenchmarkScope.kt
+++ b/compose/test-utils/src/commonMain/kotlin/androidx/compose/testutils/ComposeBenchmarkScope.kt
@@ -37,14 +37,14 @@
      * doFrame. However this is useful in case you need to benchmark the first composition.
      *
      * If you want to call this multiple times, make sure you call [disposeContent] and
-     * [createTestCase] in between. If you don't need to measure this but need to setup the
-     * content consider using [setupContent].
+     * [createTestCase] in between. If you don't need to measure this but need to setup the content
+     * consider using [setupContent].
      */
     fun emitContent()
 
     /**
-     * Request layout on the underlying view. This is should typically not be needed if your
-     * changes invalidate layout by default.
+     * Request layout on the underlying view. This is should typically not be needed if your changes
+     * invalidate layout by default.
      */
     fun requestLayout()
 
@@ -54,24 +54,16 @@
      */
     fun invalidateViews()
 
-    /**
-     * Preparation for [draw]. Do not measure this in benchmark.
-     */
+    /** Preparation for [draw]. Do not measure this in benchmark. */
     fun drawPrepare()
 
-    /**
-     * To be run in benchmark. Call [drawPrepare] before and [drawFinish] after.
-     */
+    /** To be run in benchmark. Call [drawPrepare] before and [drawFinish] after. */
     fun draw()
 
-    /**
-     * Final step after [draw]. Do not measure this in benchmark.
-     */
+    /** Final step after [draw]. Do not measure this in benchmark. */
     fun drawFinish()
 
-    /**
-     * Calls measureWithSpec on the underlying view.
-     */
+    /** Calls measureWithSpec on the underlying view. */
     // TODO(b/143754545): Try to remove this.
     fun measureWithSpec(widthSpec: Int, heightSpec: Int)
 
@@ -82,9 +74,7 @@
      */
     fun disposeContent()
 
-    /**
-     * Closes the recomposer when benchmark is finished.
-     */
+    /** Closes the recomposer when benchmark is finished. */
     fun close()
 
     /**
diff --git a/compose/test-utils/src/commonMain/kotlin/androidx/compose/testutils/ComposeExecutionControl.kt b/compose/test-utils/src/commonMain/kotlin/androidx/compose/testutils/ComposeExecutionControl.kt
index cce6330..c77c5a6 100644
--- a/compose/test-utils/src/commonMain/kotlin/androidx/compose/testutils/ComposeExecutionControl.kt
+++ b/compose/test-utils/src/commonMain/kotlin/androidx/compose/testutils/ComposeExecutionControl.kt
@@ -20,19 +20,13 @@
 
 expect class NativeView
 
-/**
- * Test scope accessible from execution controlled tests to test compose.
- */
+/** Test scope accessible from execution controlled tests to test compose. */
 @UiThread
 interface ComposeExecutionControl {
-    /**
-     * The measured width of the underlying view.
-     */
+    /** The measured width of the underlying view. */
     val measuredWidth: Int
 
-    /**
-     * The measured height of the underlying view.
-     */
+    /** The measured height of the underlying view. */
     val measuredHeight: Int
 
     /**
@@ -65,9 +59,7 @@
      */
     fun capturePreviewPictureToActivity()
 
-    /**
-     * Whether the last frame / recompose had changes to recompose.
-     */
+    /** Whether the last frame / recompose had changes to recompose. */
     val didLastRecomposeHaveChanges: Boolean
 
     /**
@@ -83,20 +75,13 @@
      */
     fun doFrame()
 
-    /**
-     * Whether there are pending changes in the composition.
-     */
+    /** Whether there are pending changes in the composition. */
     fun hasPendingChanges(): Boolean
 
-    /**
-     * Whether there are pending layout changes.
-     */
+    /** Whether there are pending layout changes. */
     fun hasPendingMeasureOrLayout(): Boolean
 
-    /**
-     * Whether there are pending draw changes.
-     */
-
+    /** Whether there are pending draw changes. */
     fun hasPendingDraw(): Boolean = false
 
     /**
@@ -108,20 +93,16 @@
 
     /**
      * Please avoid using this API; Make your tests more platform agnostic by utilizing platform-
-     * independent test hooks instead of invoking APIs on native views.
-     * This API may be removed in the future.
+     * independent test hooks instead of invoking APIs on native views. This API may be removed in
+     * the future.
      */
     fun getHostView(): NativeView
 
-    /**
-     * A count on launched jobs in the composition.
-     */
+    /** A count on launched jobs in the composition. */
     fun getCoroutineLaunchedCount(): Int
 }
 
-/**
- * Helper interface to run execution-controlled test via [ComposeTestRule].
- */
+/** Helper interface to run execution-controlled test via [ComposeTestRule]. */
 interface ComposeTestCaseSetup {
     /**
      * Takes the content provided via [ComposeTestRule#setContent] and runs the given test
@@ -148,16 +129,12 @@
     throw AssertionError("Measured size is not positive!")
 }
 
-/**
- * Asserts that last recomposition had some changes.
- */
+/** Asserts that last recomposition had some changes. */
 fun ComposeExecutionControl.assertLastRecomposeHadChanges() {
     assertLastRecomposeResult(expectingChanges = true)
 }
 
-/**
- * Asserts that last recomposition had no changes.
- */
+/** Asserts that last recomposition had no changes. */
 fun ComposeExecutionControl.assertLastRecomposeHadNoChanges() {
     assertLastRecomposeResult(expectingChanges = false)
 }
@@ -219,7 +196,7 @@
  * Also asserts that all the frames (except the last one) had changes to recompose.
  *
  * @throws AssertionError if any frame before [numberOfFramesToBeStable] frame had no pending
- * changes or the last frame had pending changes.
+ *   changes or the last frame had pending changes.
  */
 fun ComposeExecutionControl.doFramesAssertAllHadChangesExceptLastOne(
     numberOfFramesToBeStable: Int
@@ -254,18 +231,13 @@
     }
 
     // Still not stable
-    throw AssertionError(
-        "Changes are still pending after '$maxAmountOfFrames' " +
-            "frames."
-    )
+    throw AssertionError("Changes are still pending after '$maxAmountOfFrames' " + "frames.")
 }
 
 @UiThread
 fun ComposeExecutionControl.assertCoroutinesCount(expectedCount: Int) {
     val actual = getCoroutineLaunchedCount()
     if (getCoroutineLaunchedCount() != expectedCount) {
-        throw AssertionError(
-            "Coroutines launched is $actual when $expectedCount were expected."
-        )
+        throw AssertionError("Coroutines launched is $actual when $expectedCount were expected.")
     }
 }
diff --git a/compose/test-utils/src/commonMain/kotlin/androidx/compose/testutils/ComposeTestCase.kt b/compose/test-utils/src/commonMain/kotlin/androidx/compose/testutils/ComposeTestCase.kt
index 5278479..2feae08 100644
--- a/compose/test-utils/src/commonMain/kotlin/androidx/compose/testutils/ComposeTestCase.kt
+++ b/compose/test-utils/src/commonMain/kotlin/androidx/compose/testutils/ComposeTestCase.kt
@@ -26,32 +26,27 @@
 interface ComposeTestCase {
     /**
      * This method is guaranteed to be called only once per class lifetime. In case a benchmark
-     * needs to measure initial composition / measure / layout / draw it re-creates this class
-     * every time it needs to call Content again. This ensures that any setup you do in this
-     * class is not shared between multiple calls of this method. So the init method is a good place
-     * to setup / clean your caches.
+     * needs to measure initial composition / measure / layout / draw it re-creates this class every
+     * time it needs to call Content again. This ensures that any setup you do in this class is not
+     * shared between multiple calls of this method. So the init method is a good place to setup /
+     * clean your caches.
      */
-    @Composable
-    fun Content()
+    @Composable fun Content()
 }
 
-/**
- * To be implemented to provide a test case that is then executed in benchmarks.
- */
+/** To be implemented to provide a test case that is then executed in benchmarks. */
 // TODO(b/185389423): Make this to be an interface once the compiler gets fixed.
 abstract class LayeredComposeTestCase : ComposeTestCase {
     /**
      * This method is guaranteed to be called only once per class lifetime. In case a benchmark
-     * needs to measure initial composition / measure / layout / draw it re-creates this class
-     * every time it needs to call emitContent again. This ensures that any setup you do in this
-     * class is not shared between multiple calls of this method. So the init method is a good place
-     * to setup / clean your caches.
+     * needs to measure initial composition / measure / layout / draw it re-creates this class every
+     * time it needs to call emitContent again. This ensures that any setup you do in this class is
+     * not shared between multiple calls of this method. So the init method is a good place to setup
+     * / clean your caches.
      */
     @Composable
     override fun Content() {
-        ContentWrappers {
-            MeasuredContent()
-        }
+        ContentWrappers { MeasuredContent() }
     }
 
     /**
@@ -60,8 +55,7 @@
      *
      * The lifecycle rules for this method are same as for [Content]
      */
-    @Composable
-    abstract fun MeasuredContent()
+    @Composable abstract fun MeasuredContent()
 
     /**
      * Receives the result of [MeasuredContent].
diff --git a/compose/test-utils/src/commonMain/kotlin/androidx/compose/testutils/DpAssertions.kt b/compose/test-utils/src/commonMain/kotlin/androidx/compose/testutils/DpAssertions.kt
index 4d0c93a..5bf029ee 100644
--- a/compose/test-utils/src/commonMain/kotlin/androidx/compose/testutils/DpAssertions.kt
+++ b/compose/test-utils/src/commonMain/kotlin/androidx/compose/testutils/DpAssertions.kt
@@ -30,16 +30,13 @@
  * @param expected The expected value to which this one should be equal to.
  * @param subject Used in the error message to identify which item this assertion failed on.
  * @param tolerance The tolerance within which the values should be treated as equal.
- *
  * @throws AssertionError if comparison fails.
  */
 fun Dp.assertIsEqualTo(expected: Dp, subject: String = "", tolerance: Dp = Dp(.5f)) {
     val diff = (this - expected).value.absoluteValue
     if (diff > tolerance.value) {
         // Comparison failed, report the error in DPs
-        throw AssertionError(
-            "Actual $subject is $this, expected $expected (tolerance: $tolerance)"
-        )
+        throw AssertionError("Actual $subject is $this, expected $expected (tolerance: $tolerance)")
     }
 }
 
@@ -54,8 +51,7 @@
  * @param unexpected The value to which this one should not be equal to.
  * @param subject Used in the error message to identify which item this assertion failed on.
  * @param tolerance The tolerance that is expected to be greater than the difference between the
- * given values to treat them as non-equal.
- *
+ *   given values to treat them as non-equal.
  * @throws AssertionError if comparison fails.
  */
 fun Dp.assertIsNotEqualTo(unexpected: Dp, subject: String = "", tolerance: Dp = Dp(.5f)) {
diff --git a/compose/test-utils/src/commonMain/kotlin/androidx/compose/testutils/Expect.kt b/compose/test-utils/src/commonMain/kotlin/androidx/compose/testutils/Expect.kt
index b2f3744..ded5026 100644
--- a/compose/test-utils/src/commonMain/kotlin/androidx/compose/testutils/Expect.kt
+++ b/compose/test-utils/src/commonMain/kotlin/androidx/compose/testutils/Expect.kt
@@ -34,14 +34,14 @@
 }
 
 /**
- * Runs the [block] and asserts that a [T] is thrown with the [expectedMessage] if [expectError]
- * is `true`, or that nothing is thrown if [expectError] is `false`. The [expectedMessage] is a
- * regex with just the option [DOT_MATCHES_ALL] enabled.
+ * Runs the [block] and asserts that a [T] is thrown with the [expectedMessage] if [expectError] is
+ * `true`, or that nothing is thrown if [expectError] is `false`. The [expectedMessage] is a regex
+ * with just the option [DOT_MATCHES_ALL] enabled.
  *
  * @param expectedMessage A regular expression that matches the entire expected error message. If
- * you don't want to verify the entire error message, use `.*` in the appropriate places. The
- * option [DOT_MATCHES_ALL] is enabled so you can match new lines with `.*`. Don't forget to
- * escape special characters like `[`, `(` or `*` (and double escaping for `\`).
+ *   you don't want to verify the entire error message, use `.*` in the appropriate places. The
+ *   option [DOT_MATCHES_ALL] is enabled so you can match new lines with `.*`. Don't forget to
+ *   escape special characters like `[`, `(` or `*` (and double escaping for `\`).
  */
 inline fun <reified T : Throwable> expectError(
     expectError: Boolean = true,
@@ -74,14 +74,13 @@
     thrown: Throwable? = null,
     expectedMessage: String? = null
 ) {
-    val stackTrace = thrown?.let {
-        StringWriter().use { sw ->
-            PrintWriter(sw).use { pw ->
-                it.printStackTrace(pw)
+    val stackTrace =
+        thrown?.let {
+            StringWriter().use { sw ->
+                PrintWriter(sw).use { pw -> it.printStackTrace(pw) }
+                ":\n==============================\n$sw=============================="
             }
-            ":\n==============================\n$sw=============================="
-        }
-    } ?: ""
+        } ?: ""
 
     fun String.plusMessage(message: String?): String {
         return if (expectedMessage == null) this else "$this with message\n\"\"\"$message\"\"\"\n"
diff --git a/compose/test-utils/src/commonMain/kotlin/androidx/compose/testutils/ModifierTestUtils.kt b/compose/test-utils/src/commonMain/kotlin/androidx/compose/testutils/ModifierTestUtils.kt
index 761ca1b3..19c309c 100644
--- a/compose/test-utils/src/commonMain/kotlin/androidx/compose/testutils/ModifierTestUtils.kt
+++ b/compose/test-utils/src/commonMain/kotlin/androidx/compose/testutils/ModifierTestUtils.kt
@@ -21,25 +21,19 @@
 fun Modifier.toList(): List<Modifier.Element> =
     foldIn(mutableListOf()) { acc, e -> acc.apply { acc.add(e) } }
 
-@Suppress("ModifierFactoryReturnType")
-fun Modifier.first(): Modifier.Element =
-    toList().first()
+@Suppress("ModifierFactoryReturnType") fun Modifier.first(): Modifier.Element = toList().first()
 
 /**
- * Asserts that creating two modifier with the same inputs will resolve to true when compared. In
- * a similar fashion, toggling the inputs will resolve to false. Ideally, all modifier elements
- * should preserve this property so when creating a modifier, an additional test should be included
- * to guarantee that.
+ * Asserts that creating two modifier with the same inputs will resolve to true when compared. In a
+ * similar fashion, toggling the inputs will resolve to false. Ideally, all modifier elements should
+ * preserve this property so when creating a modifier, an additional test should be included to
+ * guarantee that.
  */
 fun assertModifierIsPure(createModifier: (toggle: Boolean) -> Modifier) {
     val first = createModifier(true)
     val second = createModifier(false)
     val third = createModifier(true)
 
-    assert(first == third) {
-        "Modifier with same inputs should resolve true to equals call"
-    }
-    assert(first != second) {
-        "Modifier with different inputs should resolve false to equals call"
-    }
+    assert(first == third) { "Modifier with same inputs should resolve true to equals call" }
+    assert(first != second) { "Modifier with different inputs should resolve false to equals call" }
 }
diff --git a/compose/test-utils/src/commonMain/kotlin/androidx/compose/testutils/ParameterizedComposeTestRule.kt b/compose/test-utils/src/commonMain/kotlin/androidx/compose/testutils/ParameterizedComposeTestRule.kt
index 9b38842..780673f 100644
--- a/compose/test-utils/src/commonMain/kotlin/androidx/compose/testutils/ParameterizedComposeTestRule.kt
+++ b/compose/test-utils/src/commonMain/kotlin/androidx/compose/testutils/ParameterizedComposeTestRule.kt
@@ -26,62 +26,46 @@
 import androidx.compose.ui.test.junit4.createComposeRule
 
 /**
- * A Rule that allows simulation of parameterized tests that change a Composable input. Make sure
- * to set the content using [setContent] and react to parameter changes proposed by the content
- * block  parameter. Later, use [forEachParameter] to execute a list of changes in the
- * parameters of the used composable.
+ * A Rule that allows simulation of parameterized tests that change a Composable input. Make sure to
+ * set the content using [setContent] and react to parameter changes proposed by the content block
+ * parameter. Later, use [forEachParameter] to execute a list of changes in the parameters of the
+ * used composable.
  */
 interface ParameterizedComposeTestRule<T> : ComposeTestRule {
     /**
      * Sets the content to be tested, make sure to use config to set the inputs of the tested
      * Composable.
      */
-    fun setContent(
-        content: @Composable (parameter: T) -> Unit
-    )
+    fun setContent(content: @Composable (parameter: T) -> Unit)
 
     /**
-     * Runs [block] for each config in [parameters] making sure that composition is
-     * reset between the runs effectively simulating a parameterized test run.
+     * Runs [block] for each config in [parameters] making sure that composition is reset between
+     * the runs effectively simulating a parameterized test run.
      */
-    fun forEachParameter(
-        parameters: List<T>,
-        block: (T) -> Unit
-    )
+    fun forEachParameter(parameters: List<T>, block: (T) -> Unit)
 }
 
 /**
- * A helper class to run parameterized tests with composition. This is useful for tests that
- * change Composables parameters in parameterized fashion.
+ * A helper class to run parameterized tests with composition. This is useful for tests that change
+ * Composables parameters in parameterized fashion.
  */
 private class ParameterizedComposeTestRuleImpl<T>(private val rule: ComposeContentTestRule) :
     ParameterizedComposeTestRule<T>, ComposeTestRule by rule {
-    private var content: @Composable (config: T) -> Unit = { }
+    private var content: @Composable (config: T) -> Unit = {}
     private var contentInitialized = false
 
-    override fun setContent(
-        content: @Composable (config: T) -> Unit
-    ) {
-        check(!contentInitialized) {
-            "SetContent should be called only once per test case."
-        }
+    override fun setContent(content: @Composable (config: T) -> Unit) {
+        check(!contentInitialized) { "SetContent should be called only once per test case." }
         this.content = content
         contentInitialized = true
     }
 
-    override fun forEachParameter(
-        parameters: List<T>,
-        block: T.() -> Unit
-    ) {
+    override fun forEachParameter(parameters: List<T>, block: T.() -> Unit) {
         check(parameters.isNotEmpty()) { "Config List Cannot Be Empty" }
         var configState by mutableStateOf(parameters.first())
 
         // setting content on the first config
-        rule.setContent {
-            key(configState) {
-                content(configState)
-            }
-        }
+        rule.setContent { key(configState) { content(configState) } }
         runBlockCheck(block, configState)
         rule.mainClock.advanceTimeByFrame() // push time forward
 
@@ -103,9 +87,7 @@
     }
 }
 
-/**
- * Creates a [ParameterizedComposeTestRule] to simulate input parameterization in tests.
- */
+/** Creates a [ParameterizedComposeTestRule] to simulate input parameterization in tests. */
 fun <T> createParameterizedComposeTestRule(): ParameterizedComposeTestRule<T> {
     val contentRule = createComposeRule()
     return ParameterizedComposeTestRuleImpl(contentRule)
diff --git a/compose/test-utils/src/commonMain/kotlin/androidx/compose/testutils/TestViewConfiguration.kt b/compose/test-utils/src/commonMain/kotlin/androidx/compose/testutils/TestViewConfiguration.kt
index b79120f..64fd471 100644
--- a/compose/test-utils/src/commonMain/kotlin/androidx/compose/testutils/TestViewConfiguration.kt
+++ b/compose/test-utils/src/commonMain/kotlin/androidx/compose/testutils/TestViewConfiguration.kt
@@ -26,12 +26,13 @@
  * Default values for [TestViewConfiguration]. This object exists so we can leverage the default
  * implementation of members from [ViewConfiguration].
  */
-private val Default = object : ViewConfiguration {
-    override val longPressTimeoutMillis: Long = 500L
-    override val doubleTapTimeoutMillis: Long = 300L
-    override val doubleTapMinTimeMillis: Long = 40L
-    override val touchSlop: Float = 18f
-}
+private val Default =
+    object : ViewConfiguration {
+        override val longPressTimeoutMillis: Long = 500L
+        override val doubleTapTimeoutMillis: Long = 300L
+        override val doubleTapMinTimeMillis: Long = 40L
+        override val touchSlop: Float = 18f
+    }
 
 /**
  * A [ViewConfiguration] that can be used for testing. The default values are representative for
@@ -78,10 +79,7 @@
 
 @Composable
 fun WithTouchSlop(touchSlop: Float, content: @Composable () -> Unit) {
-    WithViewConfiguration(
-        TestViewConfiguration(touchSlop = touchSlop),
-        content = content
-    )
+    WithViewConfiguration(TestViewConfiguration(touchSlop = touchSlop), content = content)
 }
 
 @Composable
diff --git a/compose/test-utils/src/desktopMain/kotlin/androidx/compose/testutils/NativeView.desktop.kt b/compose/test-utils/src/desktopMain/kotlin/androidx/compose/testutils/NativeView.desktop.kt
index 6eac797..7c2c304 100644
--- a/compose/test-utils/src/desktopMain/kotlin/androidx/compose/testutils/NativeView.desktop.kt
+++ b/compose/test-utils/src/desktopMain/kotlin/androidx/compose/testutils/NativeView.desktop.kt
@@ -17,4 +17,5 @@
 package androidx.compose.testutils
 
 class NativeViewEmptyImpl
+
 actual typealias NativeView = NativeViewEmptyImpl
diff --git a/compose/ui/ui-geometry/src/androidUnitTest/kotlin/androidx/compose/ui/geometry/OffsetTest.kt b/compose/ui/ui-geometry/src/androidUnitTest/kotlin/androidx/compose/ui/geometry/OffsetTest.kt
index eac13e52..6bcd179 100644
--- a/compose/ui/ui-geometry/src/androidUnitTest/kotlin/androidx/compose/ui/geometry/OffsetTest.kt
+++ b/compose/ui/ui-geometry/src/androidUnitTest/kotlin/androidx/compose/ui/geometry/OffsetTest.kt
@@ -109,8 +109,7 @@
     @Test
     fun testUnspecifiedEquals() {
         // Verify that verifying equality here does not crash
-        @Suppress("KotlinConstantConditions")
-        assertTrue(Offset.Unspecified == Offset.Unspecified)
+        @Suppress("KotlinConstantConditions") assertTrue(Offset.Unspecified == Offset.Unspecified)
     }
 
     @Test
diff --git a/compose/ui/ui-geometry/src/androidUnitTest/kotlin/androidx/compose/ui/geometry/RectTest.kt b/compose/ui/ui-geometry/src/androidUnitTest/kotlin/androidx/compose/ui/geometry/RectTest.kt
index 554987c..d96ceaf 100644
--- a/compose/ui/ui-geometry/src/androidUnitTest/kotlin/androidx/compose/ui/geometry/RectTest.kt
+++ b/compose/ui/ui-geometry/src/androidUnitTest/kotlin/androidx/compose/ui/geometry/RectTest.kt
@@ -73,10 +73,7 @@
 
     @Test
     fun `rect size`() {
-        assertEquals(
-            Size(210f, 290f),
-            Rect(70f, 10f, 280f, 300f).size
-        )
+        assertEquals(Size(210f, 290f), Rect(70f, 10f, 280f, 300f).size)
     }
 
     @Test
@@ -131,9 +128,7 @@
 
     @Test
     fun `rect intersect`() {
-        val intersected = Rect(0f, 0f, 20f, 20f).intersect(
-            Rect(10f, 10f, 30f, 30f)
-        )
+        val intersected = Rect(0f, 0f, 20f, 20f).intersect(Rect(10f, 10f, 30f, 30f))
         assertEquals(Rect(10f, 10f, 20f, 20f), intersected)
     }
 
diff --git a/compose/ui/ui-geometry/src/androidUnitTest/kotlin/androidx/compose/ui/geometry/RoundRectTest.kt b/compose/ui/ui-geometry/src/androidUnitTest/kotlin/androidx/compose/ui/geometry/RoundRectTest.kt
index 1f6aeac..f0ef6ef 100644
--- a/compose/ui/ui-geometry/src/androidUnitTest/kotlin/androidx/compose/ui/geometry/RoundRectTest.kt
+++ b/compose/ui/ui-geometry/src/androidUnitTest/kotlin/androidx/compose/ui/geometry/RoundRectTest.kt
@@ -28,13 +28,14 @@
 
     @Test
     fun testRoundRectContains() {
-        val roundRect = RoundRect(
-            Rect(1.0f, 1.0f, 2.0f, 2.0f),
-            topLeft = CornerRadius(0.5f),
-            topRight = CornerRadius(0.25f),
-            bottomRight = CornerRadius(0.25f, 0.75f),
-            bottomLeft = CornerRadius.Zero
-        )
+        val roundRect =
+            RoundRect(
+                Rect(1.0f, 1.0f, 2.0f, 2.0f),
+                topLeft = CornerRadius(0.5f),
+                topRight = CornerRadius(0.25f),
+                bottomRight = CornerRadius(0.25f, 0.75f),
+                bottomLeft = CornerRadius.Zero
+            )
 
         assertFalse(Offset(1.0f, 1.0f) in roundRect)
         assertFalse(Offset(1.1f, 1.1f) in roundRect)
@@ -48,13 +49,14 @@
 
     @Test
     fun testRoundRectContainsLargeRadii() {
-        val roundRect = RoundRect(
-            Rect(1.0f, 1.0f, 2.0f, 2.0f),
-            topLeft = CornerRadius(5000.0f),
-            topRight = CornerRadius(2500.0f),
-            bottomRight = CornerRadius(2500.0f, 7500.0f),
-            bottomLeft = CornerRadius.Zero
-        )
+        val roundRect =
+            RoundRect(
+                Rect(1.0f, 1.0f, 2.0f, 2.0f),
+                topLeft = CornerRadius(5000.0f),
+                topRight = CornerRadius(2500.0f),
+                bottomRight = CornerRadius(2500.0f, 7500.0f),
+                bottomLeft = CornerRadius.Zero
+            )
 
         assertFalse(Offset(1.0f, 1.0f) in roundRect)
         assertFalse(Offset(1.1f, 1.1f) in roundRect)
@@ -70,16 +72,17 @@
     fun testRoundRectWidthComputation() {
         val left = 10f
         val right = 30f
-        val roundRect = RoundRect(
-            10f,
-            20f,
-            30f,
-            40f,
-            CornerRadius(5f, 10f),
-            CornerRadius(15f, 20f),
-            CornerRadius(25f, 30f),
-            CornerRadius(35f, 40f)
-        )
+        val roundRect =
+            RoundRect(
+                10f,
+                20f,
+                30f,
+                40f,
+                CornerRadius(5f, 10f),
+                CornerRadius(15f, 20f),
+                CornerRadius(25f, 30f),
+                CornerRadius(35f, 40f)
+            )
         assertEquals(right - left, roundRect.width)
     }
 
@@ -87,101 +90,108 @@
     fun testRoundRectHeightComputation() {
         val top = 20f
         val bottom = 40f
-        val roundRect = RoundRect(
-            10f,
-            top,
-            30f,
-            bottom,
-            CornerRadius(5f, 10f),
-            CornerRadius(15f, 20f),
-            CornerRadius(25f, 30f),
-            CornerRadius(35f, 40f)
-        )
+        val roundRect =
+            RoundRect(
+                10f,
+                top,
+                30f,
+                bottom,
+                CornerRadius(5f, 10f),
+                CornerRadius(15f, 20f),
+                CornerRadius(25f, 30f),
+                CornerRadius(35f, 40f)
+            )
         assertEquals(bottom - top, roundRect.height)
     }
 
     @Test
     fun testRoundRectMatchingFloatConstructor() {
         val roundRect1 = RoundRect(10f, 15f, 20f, 25f, 30f, 30f)
-        val roundRect2 = RoundRect(
-            10f,
-            15f,
-            20f,
-            25f,
-            CornerRadius(30f, 30f),
-            CornerRadius(30f, 30f),
-            CornerRadius(30f, 30f),
-            CornerRadius(30f, 30f)
-        )
+        val roundRect2 =
+            RoundRect(
+                10f,
+                15f,
+                20f,
+                25f,
+                CornerRadius(30f, 30f),
+                CornerRadius(30f, 30f),
+                CornerRadius(30f, 30f),
+                CornerRadius(30f, 30f)
+            )
         assertEquals(roundRect1, roundRect2)
     }
 
     @Test
     fun testRoundRectRadiusConstructor() {
         val roundRect1 = RoundRect(10f, 15f, 20f, 25f, CornerRadius(30f))
-        val roundRect2 = RoundRect(
-            10f,
-            15f,
-            20f,
-            25f,
-            CornerRadius(30f, 30f),
-            CornerRadius(30f, 30f),
-            CornerRadius(30f, 30f),
-            CornerRadius(30f, 30f)
-        )
+        val roundRect2 =
+            RoundRect(
+                10f,
+                15f,
+                20f,
+                25f,
+                CornerRadius(30f, 30f),
+                CornerRadius(30f, 30f),
+                CornerRadius(30f, 30f),
+                CornerRadius(30f, 30f)
+            )
         assertEquals(roundRect1, roundRect2)
     }
 
     @Test
     fun testRoundRectWithRectAndRadiusConstructor() {
         val roundRect1 = RoundRect(Rect(10f, 15f, 20f, 25f), CornerRadius(30f))
-        val roundRect2 = RoundRect(
-            10f,
-            15f,
-            20f,
-            25f,
-            CornerRadius(30f, 30f),
-            CornerRadius(30f, 30f),
-            CornerRadius(30f, 30f),
-            CornerRadius(30f, 30f)
-        )
+        val roundRect2 =
+            RoundRect(
+                10f,
+                15f,
+                20f,
+                25f,
+                CornerRadius(30f, 30f),
+                CornerRadius(30f, 30f),
+                CornerRadius(30f, 30f),
+                CornerRadius(30f, 30f)
+            )
         assertEquals(roundRect1, roundRect2)
     }
 
     @Test
     fun testRoundRectWithRectAndSeparateRadii() {
-        val roundRect1 = RoundRect(
-            Rect(10f, 15f, 20f, 25f),
-            CornerRadius(1f, 2f),
-            CornerRadius(3f, 4f),
-            CornerRadius(5f, 6f),
-            CornerRadius(7f, 8f)
-        )
-        val roundRect2 = RoundRect(
-            10f,
-            15f,
-            20f,
-            25f,
-            CornerRadius(1f, 2f),
-            CornerRadius(3f, 4f),
-            CornerRadius(5f, 6f),
-            CornerRadius(7f, 8f)
-        )
+        val roundRect1 =
+            RoundRect(
+                Rect(10f, 15f, 20f, 25f),
+                CornerRadius(1f, 2f),
+                CornerRadius(3f, 4f),
+                CornerRadius(5f, 6f),
+                CornerRadius(7f, 8f)
+            )
+        val roundRect2 =
+            RoundRect(
+                10f,
+                15f,
+                20f,
+                25f,
+                CornerRadius(1f, 2f),
+                CornerRadius(3f, 4f),
+                CornerRadius(5f, 6f),
+                CornerRadius(7f, 8f)
+            )
         assertEquals(roundRect1, roundRect2)
     }
 
     @Test
     fun testRadiusProperties() {
-        val rr = RoundRect(
-            0f,
-            0f,
-            10f,
-            10f,
-            CornerRadius(10f, 15f),
-            CornerRadius(17f, 20f),
-            CornerRadius(25f, 30f),
-            CornerRadius(35f, 40f)
-        )
+        val rr =
+            RoundRect(
+                0f,
+                0f,
+                10f,
+                10f,
+                CornerRadius(10f, 15f),
+                CornerRadius(17f, 20f),
+                CornerRadius(25f, 30f),
+                CornerRadius(35f, 40f)
+            )
         assertEquals(CornerRadius(10f, 15f), rr.topLeftCornerRadius)
         assertEquals(CornerRadius(17f, 20f), rr.topRightCornerRadius)
         assertEquals(CornerRadius(25f, 30f), rr.bottomRightCornerRadius)
@@ -209,16 +219,17 @@
     @Test
     fun testSafeInnerRect() {
         val insetFactor = 0.29289321881f // 1-cos(pi/4)
-        val rr = RoundRect(
-            left = 0f,
-            top = 0f,
-            right = 100f,
-            bottom = 100f,
-            topLeftCornerRadius = CornerRadius(0f, 5f),
-            topRightCornerRadius = CornerRadius(5f, 10f),
-            bottomRightCornerRadius = CornerRadius(10f, 15f),
-            bottomLeftCornerRadius = CornerRadius(15f, 20f)
-        )
+        val rr =
+            RoundRect(
+                left = 0f,
+                top = 0f,
+                right = 100f,
+                bottom = 100f,
+                topLeftCornerRadius = CornerRadius(0f, 5f),
+                topRightCornerRadius = CornerRadius(5f, 10f),
+                bottomRightCornerRadius = CornerRadius(10f, 15f),
+                bottomLeftCornerRadius = CornerRadius(15f, 20f)
+            )
         assertEquals(
             Rect(
                 15f * insetFactor,
diff --git a/compose/ui/ui-geometry/src/androidUnitTest/kotlin/androidx/compose/ui/geometry/SizeTest.kt b/compose/ui/ui-geometry/src/androidUnitTest/kotlin/androidx/compose/ui/geometry/SizeTest.kt
index a6b033c..b2dbb7b 100644
--- a/compose/ui/ui-geometry/src/androidUnitTest/kotlin/androidx/compose/ui/geometry/SizeTest.kt
+++ b/compose/ui/ui-geometry/src/androidUnitTest/kotlin/androidx/compose/ui/geometry/SizeTest.kt
@@ -30,22 +30,13 @@
 
     @Test
     fun sizeTimesInt() {
-        assertEquals(
-            Size(10f, 10f),
-            Size(2.5f, 2.5f) * 4f
-        )
-        assertEquals(
-            Size(10f, 10f),
-            4f * Size(2.5f, 2.5f)
-        )
+        assertEquals(Size(10f, 10f), Size(2.5f, 2.5f) * 4f)
+        assertEquals(Size(10f, 10f), 4f * Size(2.5f, 2.5f))
     }
 
     @Test
     fun sizeDivInt() {
-        assertEquals(
-            Size(10f, 10f),
-            Size(40f, 40f) / 4f
-        )
+        assertEquals(Size(10f, 10f), Size(40f, 40f) / 4f)
     }
 
     @Test
@@ -67,10 +58,7 @@
 
     @Test
     fun sizeDivDouble() {
-        assertEquals(
-            Size(10f, 10f),
-            Size(40f, 40f) / 4.0f
-        )
+        assertEquals(Size(10f, 10f), Size(40f, 40f) / 4.0f)
     }
 
     @Test
@@ -193,8 +181,6 @@
         assertTrue(Size(Float.NEGATIVE_INFINITY, 20.0f).isEmpty())
         assertTrue(Size(10.0f, Float.NEGATIVE_INFINITY).isEmpty())
 
-        assertFails {
-            Size.Unspecified.isEmpty()
-        }
+        assertFails { Size.Unspecified.isEmpty() }
     }
 }
diff --git a/compose/ui/ui-geometry/src/commonMain/kotlin/androidx/compose/ui/geometry/CornerRadius.kt b/compose/ui/ui-geometry/src/commonMain/kotlin/androidx/compose/ui/geometry/CornerRadius.kt
index 808e8e61..c584335 100644
--- a/compose/ui/ui-geometry/src/commonMain/kotlin/androidx/compose/ui/geometry/CornerRadius.kt
+++ b/compose/ui/ui-geometry/src/commonMain/kotlin/androidx/compose/ui/geometry/CornerRadius.kt
@@ -24,20 +24,18 @@
 import androidx.compose.ui.util.unpackFloat2
 
 /**
- * Constructs a Radius with the given [x] and [y] parameters for the
- * size of the radius along the x and y axis respectively. By default
- * the radius along the Y axis matches that of the given x-axis
+ * Constructs a Radius with the given [x] and [y] parameters for the size of the radius along the x
+ * and y axis respectively. By default the radius along the Y axis matches that of the given x-axis
  * unless otherwise specified. Negative radii values are clamped to 0.
  */
-@Stable
-fun CornerRadius(x: Float, y: Float = x) = CornerRadius(packFloats(x, y))
+@Stable fun CornerRadius(x: Float, y: Float = x) = CornerRadius(packFloats(x, y))
 
 /**
  * A radius for either circular or elliptical (oval) shapes.
  *
- * Note consumers should create an instance of this class through the corresponding
- * function constructor as it is represented as an inline class with 2 float
- * parameters packed into a single long to reduce allocation overhead
+ * Note consumers should create an instance of this class through the corresponding function
+ * constructor as it is represented as an inline class with 2 float parameters packed into a single
+ * long to reduce allocation overhead
  */
 @Immutable
 @kotlin.jvm.JvmInline
@@ -47,22 +45,19 @@
     @Stable
     val x: Float
         get() = unpackFloat1(packedValue)
+
     /** The radius value on the vertical axis. */
     @Stable
     val y: Float
         get() = unpackFloat2(packedValue)
 
-    @Suppress("NOTHING_TO_INLINE")
-    @Stable
-    inline operator fun component1(): Float = x
+    @Suppress("NOTHING_TO_INLINE") @Stable inline operator fun component1(): Float = x
 
-    @Suppress("NOTHING_TO_INLINE")
-    @Stable
-    inline operator fun component2(): Float = y
+    @Suppress("NOTHING_TO_INLINE") @Stable inline operator fun component2(): Float = y
 
     /**
-     * Returns a copy of this Radius instance optionally overriding the
-     * radius parameter for the x or y axis
+     * Returns a copy of this Radius instance optionally overriding the radius parameter for the x
+     * or y axis
      */
     fun copy(x: Float = this.x, y: Float = this.y) = CornerRadius(x, y)
 
@@ -73,8 +68,7 @@
          *
          * You can use [CornerRadius.Zero] with [RoundRect] to have right-angle corners.
          */
-        @Stable
-        val Zero: CornerRadius = CornerRadius(0.0f)
+        @Stable val Zero: CornerRadius = CornerRadius(0.0f)
     }
 
     /**
@@ -82,53 +76,44 @@
      *
      * Returns a Radius with the distances negated.
      *
-     * Radiuses with negative values aren't geometrically meaningful, but could
-     * occur as part of expressions. For example, negating a radius of one pixel
-     * and then adding the result to another radius is equivalent to subtracting
-     * a radius of one pixel from the other.
+     * Radiuses with negative values aren't geometrically meaningful, but could occur as part of
+     * expressions. For example, negating a radius of one pixel and then adding the result to
+     * another radius is equivalent to subtracting a radius of one pixel from the other.
      */
-    @Stable
-    operator fun unaryMinus() = CornerRadius(-x, -y)
+    @Stable operator fun unaryMinus() = CornerRadius(-x, -y)
 
     /**
      * Binary subtraction operator.
      *
-     * Returns a radius whose [x] value is the left-hand-side operand's [x]
-     * minus the right-hand-side operand's [x] and whose [y] value is the
-     * left-hand-side operand's [y] minus the right-hand-side operand's [y].
+     * Returns a radius whose [x] value is the left-hand-side operand's [x] minus the
+     * right-hand-side operand's [x] and whose [y] value is the left-hand-side operand's [y] minus
+     * the right-hand-side operand's [y].
      */
-    @Stable
-    operator fun minus(other: CornerRadius) = CornerRadius(x - other.x, y - other.y)
+    @Stable operator fun minus(other: CornerRadius) = CornerRadius(x - other.x, y - other.y)
 
     /**
      * Binary addition operator.
      *
-     * Returns a radius whose [x] value is the sum of the [x] values of the
-     * two operands, and whose [y] value is the sum of the [y] values of the
-     * two operands.
+     * Returns a radius whose [x] value is the sum of the [x] values of the two operands, and whose
+     * [y] value is the sum of the [y] values of the two operands.
      */
-    @Stable
-    operator fun plus(other: CornerRadius) = CornerRadius(x + other.x, y + other.y)
+    @Stable operator fun plus(other: CornerRadius) = CornerRadius(x + other.x, y + other.y)
 
     /**
      * Multiplication operator.
      *
-     * Returns a radius whose coordinates are the coordinates of the
-     * left-hand-side operand (a radius) multiplied by the scalar
-     * right-hand-side operand (a Float).
+     * Returns a radius whose coordinates are the coordinates of the left-hand-side operand (a
+     * radius) multiplied by the scalar right-hand-side operand (a Float).
      */
-    @Stable
-    operator fun times(operand: Float) = CornerRadius(x * operand, y * operand)
+    @Stable operator fun times(operand: Float) = CornerRadius(x * operand, y * operand)
 
     /**
      * Division operator.
      *
-     * Returns a radius whose coordinates are the coordinates of the
-     * left-hand-side operand (a radius) divided by the scalar right-hand-side
-     * operand (a Float).
+     * Returns a radius whose coordinates are the coordinates of the left-hand-side operand (a
+     * radius) divided by the scalar right-hand-side operand (a Float).
      */
-    @Stable
-    operator fun div(operand: Float) = CornerRadius(x / operand, y / operand)
+    @Stable operator fun div(operand: Float) = CornerRadius(x / operand, y / operand)
 
     override fun toString(): String {
         return if (x == y) {
@@ -142,22 +127,17 @@
 /**
  * Linearly interpolate between two radii.
  *
- * The [fraction] argument represents position on the timeline, with 0.0 meaning
- * that the interpolation has not started, returning [start] (or something
- * equivalent to [start]), 1.0 meaning that the interpolation has finished,
- * returning [stop] (or something equivalent to [stop]), and values in between
- * meaning that the interpolation is at the relevant point on the timeline
- * between [start] and [stop]. The interpolation can be extrapolated beyond 0.0 and
- * 1.0, so negative values and values greater than 1.0 are valid (and can
- * easily be generated by curves).
+ * The [fraction] argument represents position on the timeline, with 0.0 meaning that the
+ * interpolation has not started, returning [start] (or something equivalent to [start]), 1.0
+ * meaning that the interpolation has finished, returning [stop] (or something equivalent to
+ * [stop]), and values in between meaning that the interpolation is at the relevant point on the
+ * timeline between [start] and [stop]. The interpolation can be extrapolated beyond 0.0 and 1.0, so
+ * negative values and values greater than 1.0 are valid (and can easily be generated by curves).
  *
- * Values for [fraction] are usually obtained from an [Animation<Float>], such as
- * an `AnimationController`.
+ * Values for [fraction] are usually obtained from an [Animation<Float>], such as an
+ * `AnimationController`.
  */
 @Stable
 fun lerp(start: CornerRadius, stop: CornerRadius, fraction: Float): CornerRadius {
-    return CornerRadius(
-        lerp(start.x, stop.x, fraction),
-        lerp(start.y, stop.y, fraction)
-    )
+    return CornerRadius(lerp(start.x, stop.x, fraction), lerp(start.y, stop.y, fraction))
 }
diff --git a/compose/ui/ui-geometry/src/commonMain/kotlin/androidx/compose/ui/geometry/GeometryUtils.kt b/compose/ui/ui-geometry/src/commonMain/kotlin/androidx/compose/ui/geometry/GeometryUtils.kt
index 73ede37..fb1fb1e 100644
--- a/compose/ui/ui-geometry/src/commonMain/kotlin/androidx/compose/ui/geometry/GeometryUtils.kt
+++ b/compose/ui/ui-geometry/src/commonMain/kotlin/androidx/compose/ui/geometry/GeometryUtils.kt
@@ -30,11 +30,12 @@
     val decimal = shifted - shifted.toInt() // obtain the decimal of the shifted value
     // Manually round up if the decimal value is greater than or equal to 0.5f.
     // because kotlin.math.round(0.5f) rounds down
-    val roundedShifted = if (decimal >= 0.5f) {
-        shifted.toInt() + 1
-    } else {
-        shifted.toInt()
-    }
+    val roundedShifted =
+        if (decimal >= 0.5f) {
+            shifted.toInt() + 1
+        } else {
+            shifted.toInt()
+        }
 
     val rounded = roundedShifted / pow // divide off the corresponding power of 10 to shift back
     return if (clampedDigits > 0) {
diff --git a/compose/ui/ui-geometry/src/commonMain/kotlin/androidx/compose/ui/geometry/InlineClassHelper.kt b/compose/ui/ui-geometry/src/commonMain/kotlin/androidx/compose/ui/geometry/InlineClassHelper.kt
index b9d0097..788877c 100644
--- a/compose/ui/ui-geometry/src/commonMain/kotlin/androidx/compose/ui/geometry/InlineClassHelper.kt
+++ b/compose/ui/ui-geometry/src/commonMain/kotlin/androidx/compose/ui/geometry/InlineClassHelper.kt
@@ -49,9 +49,7 @@
 // Like Kotlin's require() but without the .toString() call
 @OptIn(ExperimentalContracts::class)
 internal inline fun checkPrecondition(value: Boolean, lazyMessage: () -> String) {
-    contract {
-        returns() implies value
-    }
+    contract { returns() implies value }
     if (!value) {
         throwIllegalStateException(lazyMessage())
     }
diff --git a/compose/ui/ui-geometry/src/commonMain/kotlin/androidx/compose/ui/geometry/MutableRect.kt b/compose/ui/ui-geometry/src/commonMain/kotlin/androidx/compose/ui/geometry/MutableRect.kt
index 747c516..174280d 100644
--- a/compose/ui/ui-geometry/src/commonMain/kotlin/androidx/compose/ui/geometry/MutableRect.kt
+++ b/compose/ui/ui-geometry/src/commonMain/kotlin/androidx/compose/ui/geometry/MutableRect.kt
@@ -21,20 +21,15 @@
 import kotlin.math.min
 
 /**
- * An mutable, 2D, axis-aligned, floating-point rectangle whose coordinates
- * are relative to a given origin.
+ * An mutable, 2D, axis-aligned, floating-point rectangle whose coordinates are relative to a given
+ * origin.
  *
  * @param left The offset of the left edge of this rectangle from the x axis.
  * @param top The offset of the top edge of this rectangle from the y axis.
  * @param right The offset of the right edge of this rectangle from the x axis.
  * @param bottom The offset of the bottom edge of this rectangle from the y axis.
  */
-class MutableRect(
-    var left: Float,
-    var top: Float,
-    var right: Float,
-    var bottom: Float
-) {
+class MutableRect(var left: Float, var top: Float, var right: Float, var bottom: Float) {
     /** The distance between the left and right edges of this rectangle. */
     inline val width: Float
         get() = right - left
@@ -43,23 +38,17 @@
     inline val height: Float
         get() = bottom - top
 
-    /**
-     * The distance between the upper-left corner and the lower-right corner of
-     * this rectangle.
-     */
+    /** The distance between the upper-left corner and the lower-right corner of this rectangle. */
     val size: Size
         get() = Size(width, height)
 
-    /**
-     * Whether this rectangle encloses a non-zero area. Negative areas are
-     * considered empty.
-     */
+    /** Whether this rectangle encloses a non-zero area. Negative areas are considered empty. */
     val isEmpty: Boolean
         get() = left >= right || top >= bottom
 
     /**
-     * Modifies `this` to be the intersection of this and the rect formed
-     * by [left], [top], [right], and [bottom].
+     * Modifies `this` to be the intersection of this and the rect formed by [left], [top], [right],
+     * and [bottom].
      */
     @Stable
     fun intersect(left: Float, top: Float, right: Float, bottom: Float) {
@@ -70,20 +59,16 @@
     }
 
     /**
-     * Whether the point specified by the given offset (which is assumed to be
-     * relative to the origin) lies between the left and right and the top and
-     * bottom edges of this rectangle.
+     * Whether the point specified by the given offset (which is assumed to be relative to the
+     * origin) lies between the left and right and the top and bottom edges of this rectangle.
      *
-     * Rectangles include their top and left edges but exclude their bottom and
-     * right edges.
+     * Rectangles include their top and left edges but exclude their bottom and right edges.
      */
     operator fun contains(offset: Offset): Boolean {
         return offset.x >= left && offset.x < right && offset.y >= top && offset.y < bottom
     }
 
-    /**
-     * Sets new bounds to ([left], [top], [right], [bottom])
-     */
+    /** Sets new bounds to ([left], [top], [right], [bottom]) */
     fun set(left: Float, top: Float, right: Float, bottom: Float) {
         this.left = left
         this.top = top
@@ -91,11 +76,12 @@
         this.bottom = bottom
     }
 
-    override fun toString() = "MutableRect(" +
-        "${left.toStringAsFixed(1)}, " +
-        "${top.toStringAsFixed(1)}, " +
-        "${right.toStringAsFixed(1)}, " +
-        "${bottom.toStringAsFixed(1)})"
+    override fun toString() =
+        "MutableRect(" +
+            "${left.toStringAsFixed(1)}, " +
+            "${top.toStringAsFixed(1)}, " +
+            "${right.toStringAsFixed(1)}, " +
+            "${bottom.toStringAsFixed(1)})"
 }
 
 fun MutableRect.toRect(): Rect = Rect(left, top, right, bottom)
diff --git a/compose/ui/ui-geometry/src/commonMain/kotlin/androidx/compose/ui/geometry/Offset.kt b/compose/ui/ui-geometry/src/commonMain/kotlin/androidx/compose/ui/geometry/Offset.kt
index 8bd2f1b..0007a78 100644
--- a/compose/ui/ui-geometry/src/commonMain/kotlin/androidx/compose/ui/geometry/Offset.kt
+++ b/compose/ui/ui-geometry/src/commonMain/kotlin/androidx/compose/ui/geometry/Offset.kt
@@ -24,58 +24,46 @@
 import androidx.compose.ui.util.unpackFloat2
 import kotlin.math.sqrt
 
-/**
- * Constructs an Offset from the given relative x and y offsets
- */
-@Stable
-fun Offset(x: Float, y: Float) = Offset(packFloats(x, y))
+/** Constructs an Offset from the given relative x and y offsets */
+@Stable fun Offset(x: Float, y: Float) = Offset(packFloats(x, y))
 
 /**
  * An immutable 2D floating-point offset.
  *
  * Generally speaking, Offsets can be interpreted in two ways:
+ * 1. As representing a point in Cartesian space a specified distance from a separately-maintained
+ *    origin. For example, the top-left position of children in the [RenderBox] protocol is
+ *    typically represented as an [Offset] from the top left of the parent box.
+ * 2. As a vector that can be applied to coordinates. For example, when painting a [RenderObject],
+ *    the parent is passed an [Offset] from the screen's origin which it can add to the offsets of
+ *    its children to find the [Offset] from the screen's origin to each of the children.
  *
- * 1. As representing a point in Cartesian space a specified distance from a
- *    separately-maintained origin. For example, the top-left position of
- *    children in the [RenderBox] protocol is typically represented as an
- *    [Offset] from the top left of the parent box.
- *
- * 2. As a vector that can be applied to coordinates. For example, when
- *    painting a [RenderObject], the parent is passed an [Offset] from the
- *    screen's origin which it can add to the offsets of its children to find
- *    the [Offset] from the screen's origin to each of the children.
- *
- * Because a particular [Offset] can be interpreted as one sense at one time
- * then as the other sense at a later time, the same class is used for both
- * senses.
+ * Because a particular [Offset] can be interpreted as one sense at one time then as the other sense
+ * at a later time, the same class is used for both senses.
  *
  * See also:
+ * * [Size], which represents a vector describing the size of a rectangle.
  *
- *  * [Size], which represents a vector describing the size of a rectangle.
- *
- * Creates an offset. The first argument sets [x], the horizontal component,
- * and the second sets [y], the vertical component.
+ * Creates an offset. The first argument sets [x], the horizontal component, and the second sets
+ * [y], the vertical component.
  */
 @Suppress("NOTHING_TO_INLINE")
 @Immutable
 @kotlin.jvm.JvmInline
 value class Offset internal constructor(internal val packedValue: Long) {
     @Stable
-    val x: Float get() = unpackFloat1(packedValue)
+    val x: Float
+        get() = unpackFloat1(packedValue)
 
     @Stable
-    val y: Float get() = unpackFloat2(packedValue)
+    val y: Float
+        get() = unpackFloat2(packedValue)
 
-    @Stable
-    inline operator fun component1(): Float = x
+    @Stable inline operator fun component1(): Float = x
 
-    @Stable
-    inline operator fun component2(): Float = y
+    @Stable inline operator fun component2(): Float = y
 
-    /**
-     * Returns a copy of this Offset instance optionally overriding the
-     * x or y parameter
-     */
+    /** Returns a copy of this Offset instance optionally overriding the x or y parameter */
     fun copy(x: Float = unpackFloat1(packedValue), y: Float = unpackFloat2(packedValue)) =
         Offset(packFloats(x, y))
 
@@ -85,8 +73,7 @@
          *
          * This can be used to represent the origin of a coordinate space.
          */
-        @Stable
-        val Zero = Offset(0x0L)
+        @Stable val Zero = Offset(0x0L)
 
         /**
          * An offset with infinite x and y components.
@@ -94,15 +81,13 @@
          * See also [isFinite] to check whether both components are finite.
          */
         // This is included for completeness, because [Size.infinite] exists.
-        @Stable
-        val Infinite = Offset(DualFloatInfinityBase)
+        @Stable val Infinite = Offset(DualFloatInfinityBase)
 
         /**
-         * Represents an unspecified [Offset] value, usually a replacement for `null`
-         * when a primitive value is desired.
+         * Represents an unspecified [Offset] value, usually a replacement for `null` when a
+         * primitive value is desired.
          */
-        @Stable
-        val Unspecified = Offset(UnspecifiedPackedFloats)
+        @Stable val Unspecified = Offset(UnspecifiedPackedFloats)
     }
 
     /**
@@ -121,8 +106,8 @@
     /**
      * The magnitude of the offset.
      *
-     * If you need this value to compare it to another [Offset]'s distance,
-     * consider using [getDistanceSquared] instead, since it is cheaper to compute.
+     * If you need this value to compare it to another [Offset]'s distance, consider using
+     * [getDistanceSquared] instead, since it is cheaper to compute.
      */
     @Stable
     fun getDistance(): Float {
@@ -148,8 +133,8 @@
      *
      * Returns an offset with the coordinates negated.
      *
-     * If the [Offset] represents an arrow on a plane, this operator returns the
-     * same arrow but pointing in the reverse direction.
+     * If the [Offset] represents an arrow on a plane, this operator returns the same arrow but
+     * pointing in the reverse direction.
      */
     @Stable
     operator fun unaryMinus(): Offset {
@@ -159,9 +144,9 @@
     /**
      * Binary subtraction operator.
      *
-     * Returns an offset whose [x] value is the left-hand-side operand's [x]
-     * minus the right-hand-side operand's [x] and whose [y] value is the
-     * left-hand-side operand's [y] minus the right-hand-side operand's [y].
+     * Returns an offset whose [x] value is the left-hand-side operand's [x] minus the
+     * right-hand-side operand's [x] and whose [y] value is the left-hand-side operand's [y] minus
+     * the right-hand-side operand's [y].
      */
     @Stable
     operator fun minus(other: Offset): Offset {
@@ -176,9 +161,8 @@
     /**
      * Binary addition operator.
      *
-     * Returns an offset whose [x] value is the sum of the [x] values of the
-     * two operands, and whose [y] value is the sum of the [y] values of the
-     * two operands.
+     * Returns an offset whose [x] value is the sum of the [x] values of the two operands, and whose
+     * [y] value is the sum of the [y] values of the two operands.
      */
     @Stable
     operator fun plus(other: Offset): Offset {
@@ -193,77 +177,65 @@
     /**
      * Multiplication operator.
      *
-     * Returns an offset whose coordinates are the coordinates of the
-     * left-hand-side operand (an Offset) multiplied by the scalar
-     * right-hand-side operand (a Float).
+     * Returns an offset whose coordinates are the coordinates of the left-hand-side operand (an
+     * Offset) multiplied by the scalar right-hand-side operand (a Float).
      */
     @Stable
     operator fun times(operand: Float): Offset {
         return Offset(
-            packFloats(
-                unpackFloat1(packedValue) * operand,
-                unpackFloat2(packedValue) * operand
-            )
+            packFloats(unpackFloat1(packedValue) * operand, unpackFloat2(packedValue) * operand)
         )
     }
 
     /**
      * Division operator.
      *
-     * Returns an offset whose coordinates are the coordinates of the
-     * left-hand-side operand (an Offset) divided by the scalar right-hand-side
-     * operand (a Float).
+     * Returns an offset whose coordinates are the coordinates of the left-hand-side operand (an
+     * Offset) divided by the scalar right-hand-side operand (a Float).
      */
     @Stable
     operator fun div(operand: Float): Offset {
         return Offset(
-            packFloats(
-                unpackFloat1(packedValue) / operand,
-                unpackFloat2(packedValue) / operand
-            )
+            packFloats(unpackFloat1(packedValue) / operand, unpackFloat2(packedValue) / operand)
         )
     }
 
     /**
      * Modulo (remainder) operator.
      *
-     * Returns an offset whose coordinates are the remainder of dividing the
-     * coordinates of the left-hand-side operand (an Offset) by the scalar
-     * right-hand-side operand (a Float).
+     * Returns an offset whose coordinates are the remainder of dividing the coordinates of the
+     * left-hand-side operand (an Offset) by the scalar right-hand-side operand (a Float).
      */
     @Stable
     operator fun rem(operand: Float): Offset {
         return Offset(
-            packFloats(
-                unpackFloat1(packedValue) % operand,
-                unpackFloat2(packedValue) % operand
-            )
+            packFloats(unpackFloat1(packedValue) % operand, unpackFloat2(packedValue) % operand)
         )
     }
 
-    override fun toString() = if (isSpecified) {
-        "Offset(${x.toStringAsFixed(1)}, ${y.toStringAsFixed(1)})"
-    } else {
-        // In this case reading the x or y properties will throw, and they don't contain meaningful
-        // values as strings anyway.
-        "Offset.Unspecified"
-    }
+    override fun toString() =
+        if (isSpecified) {
+            "Offset(${x.toStringAsFixed(1)}, ${y.toStringAsFixed(1)})"
+        } else {
+            // In this case reading the x or y properties will throw, and they don't contain
+            // meaningful
+            // values as strings anyway.
+            "Offset.Unspecified"
+        }
 }
 
 /**
  * Linearly interpolate between two offsets.
  *
- * The [fraction] argument represents position on the timeline, with 0.0 meaning
- * that the interpolation has not started, returning [start] (or something
- * equivalent to [start]), 1.0 meaning that the interpolation has finished,
- * returning [stop] (or something equivalent to [stop]), and values in between
- * meaning that the interpolation is at the relevant point on the timeline
- * between [start] and [stop]. The interpolation can be extrapolated beyond 0.0 and
- * 1.0, so negative values and values greater than 1.0 are valid (and can
- * easily be generated by curves).
+ * The [fraction] argument represents position on the timeline, with 0.0 meaning that the
+ * interpolation has not started, returning [start] (or something equivalent to [start]), 1.0
+ * meaning that the interpolation has finished, returning [stop] (or something equivalent to
+ * [stop]), and values in between meaning that the interpolation is at the relevant point on the
+ * timeline between [start] and [stop]. The interpolation can be extrapolated beyond 0.0 and 1.0, so
+ * negative values and values greater than 1.0 are valid (and can easily be generated by curves).
  *
- * Values for [fraction] are usually obtained from an [Animation<Float>], such as
- * an `AnimationController`.
+ * Values for [fraction] are usually obtained from an [Animation<Float>], such as an
+ * `AnimationController`.
  */
 @Stable
 fun lerp(start: Offset, stop: Offset, fraction: Float): Offset {
@@ -275,36 +247,29 @@
     )
 }
 
-/**
- * True if both x and y values of the [Offset] are finite. NaN values are not
- * considered finite.
- */
+/** True if both x and y values of the [Offset] are finite. NaN values are not considered finite. */
 @Stable
-val Offset.isFinite: Boolean get() {
-    // Mask out the sign bit and do an equality check in each 32-bit lane
-    // against the "infinity base" mask (to check whether each packed float
-    // is infinite or not).
-    val v = (packedValue and DualFloatInfinityBase) xor DualFloatInfinityBase
-    return (v - Uint64Low32) and Uint64High32 == 0L
-}
+val Offset.isFinite: Boolean
+    get() {
+        // Mask out the sign bit and do an equality check in each 32-bit lane
+        // against the "infinity base" mask (to check whether each packed float
+        // is infinite or not).
+        val v = (packedValue and DualFloatInfinityBase) xor DualFloatInfinityBase
+        return (v - Uint64Low32) and Uint64High32 == 0L
+    }
 
-/**
- * `false` when this is [Offset.Unspecified].
- */
+/** `false` when this is [Offset.Unspecified]. */
 @Stable
 val Offset.isSpecified: Boolean
     get() = packedValue and DualUnsignedFloatMask != UnspecifiedPackedFloats
 
-/**
- * `true` when this is [Offset.Unspecified].
- */
+/** `true` when this is [Offset.Unspecified]. */
 @Stable
 val Offset.isUnspecified: Boolean
     get() = packedValue and DualUnsignedFloatMask == UnspecifiedPackedFloats
 
 /**
- * If this [Offset]&nbsp;[isSpecified] then this is returned, otherwise [block] is executed
- * and its result is returned.
+ * If this [Offset]&nbsp;[isSpecified] then this is returned, otherwise [block] is executed and its
+ * result is returned.
  */
-inline fun Offset.takeOrElse(block: () -> Offset): Offset =
-    if (isSpecified) this else block()
+inline fun Offset.takeOrElse(block: () -> Offset): Offset = if (isSpecified) this else block()
diff --git a/compose/ui/ui-geometry/src/commonMain/kotlin/androidx/compose/ui/geometry/Rect.kt b/compose/ui/ui-geometry/src/commonMain/kotlin/androidx/compose/ui/geometry/Rect.kt
index 29af5fe..bdc6c9b 100644
--- a/compose/ui/ui-geometry/src/commonMain/kotlin/androidx/compose/ui/geometry/Rect.kt
+++ b/compose/ui/ui-geometry/src/commonMain/kotlin/androidx/compose/ui/geometry/Rect.kt
@@ -25,57 +25,45 @@
 
 // TODO(mount): Normalize this class. There are many methods that can be extension functions.
 /**
- * An immutable, 2D, axis-aligned, floating-point rectangle whose coordinates
- * are relative to a given origin.
+ * An immutable, 2D, axis-aligned, floating-point rectangle whose coordinates are relative to a
+ * given origin.
  */
 @Immutable
 data class Rect(
-    /**
-     * The offset of the left edge of this rectangle from the x axis.
-     */
-    @Stable
-    val left: Float,
+    /** The offset of the left edge of this rectangle from the x axis. */
+    @Stable val left: Float,
 
-    /**
-     * The offset of the top edge of this rectangle from the y axis.
-     */
-    @Stable
-    val top: Float,
+    /** The offset of the top edge of this rectangle from the y axis. */
+    @Stable val top: Float,
 
-    /**
-     * The offset of the right edge of this rectangle from the x axis.
-     */
-    @Stable
-    val right: Float,
+    /** The offset of the right edge of this rectangle from the x axis. */
+    @Stable val right: Float,
 
-    /**
-     * The offset of the bottom edge of this rectangle from the y axis.
-     */
-    @Stable
-    val bottom: Float
+    /** The offset of the bottom edge of this rectangle from the y axis. */
+    @Stable val bottom: Float
 ) {
 
     companion object {
 
         /** A rectangle with left, top, right, and bottom edges all at zero. */
-        @Stable
-        val Zero: Rect = Rect(0.0f, 0.0f, 0.0f, 0.0f)
+        @Stable val Zero: Rect = Rect(0.0f, 0.0f, 0.0f, 0.0f)
     }
 
     /** The distance between the left and right edges of this rectangle. */
     @Stable
     val width: Float
-        get() { return right - left }
+        get() {
+            return right - left
+        }
 
     /** The distance between the top and bottom edges of this rectangle. */
     @Stable
     val height: Float
-        get() { return bottom - top }
+        get() {
+            return bottom - top
+        }
 
-    /**
-     * The distance between the upper-left corner and the lower-right corner of
-     * this rectangle.
-     */
+    /** The distance between the upper-left corner and the lower-right corner of this rectangle. */
     @Stable
     val size: Size
         get() = Size(width, height)
@@ -84,23 +72,18 @@
     // included for consistency with Offset and Size
     @Stable
     val isInfinite: Boolean
-        get() = left >= Float.POSITIVE_INFINITY ||
-            top >= Float.POSITIVE_INFINITY ||
-            right >= Float.POSITIVE_INFINITY ||
-            bottom >= Float.POSITIVE_INFINITY
+        get() =
+            left >= Float.POSITIVE_INFINITY ||
+                top >= Float.POSITIVE_INFINITY ||
+                right >= Float.POSITIVE_INFINITY ||
+                bottom >= Float.POSITIVE_INFINITY
 
     /** Whether all coordinates of this rectangle are finite. */
     @Stable
     val isFinite: Boolean
-        get() = left.isFinite() &&
-            top.isFinite() &&
-            right.isFinite() &&
-            bottom.isFinite()
+        get() = left.isFinite() && top.isFinite() && right.isFinite() && bottom.isFinite()
 
-    /**
-     * Whether this rectangle encloses a non-zero area. Negative areas are
-     * considered empty.
-     */
+    /** Whether this rectangle encloses a non-zero area. Negative areas are considered empty. */
     @Stable
     val isEmpty: Boolean
         get() = left >= right || top >= bottom
@@ -108,8 +91,8 @@
     /**
      * Returns a new rectangle translated by the given offset.
      *
-     * To translate a rectangle by separate x and y components rather than by an
-     * [Offset], consider [translate].
+     * To translate a rectangle by separate x and y components rather than by an [Offset], consider
+     * [translate].
      */
     @Stable
     fun translate(offset: Offset): Rect {
@@ -117,17 +100,12 @@
     }
 
     /**
-     * Returns a new rectangle with translateX added to the x components and
-     * translateY added to the y components.
+     * Returns a new rectangle with translateX added to the x components and translateY added to the
+     * y components.
      */
     @Stable
     fun translate(translateX: Float, translateY: Float): Rect {
-        return Rect(
-            left + translateX,
-            top + translateY,
-            right + translateX,
-            bottom + translateY
-        )
+        return Rect(left + translateX, top + translateY, right + translateX, bottom + translateY)
     }
 
     /** Returns a new rectangle with edges moved outwards by the given delta. */
@@ -137,14 +115,12 @@
     }
 
     /** Returns a new rectangle with edges moved inwards by the given delta. */
-    @Stable
-    fun deflate(delta: Float): Rect = inflate(-delta)
+    @Stable fun deflate(delta: Float): Rect = inflate(-delta)
 
     /**
-     * Returns a new rectangle that is the intersection of the given
-     * rectangle and this rectangle. The two rectangles must overlap
-     * for this to be meaningful. If the two rectangles do not overlap,
-     * then the resulting Rect will have a negative width or height.
+     * Returns a new rectangle that is the intersection of the given rectangle and this rectangle.
+     * The two rectangles must overlap for this to be meaningful. If the two rectangles do not
+     * overlap, then the resulting Rect will have a negative width or height.
      */
     @Stable
     fun intersect(other: Rect): Rect {
@@ -157,10 +133,9 @@
     }
 
     /**
-     * Returns a new rectangle that is the intersection of the given
-     * rectangle and this rectangle. The two rectangles must overlap
-     * for this to be meaningful. If the two rectangles do not overlap,
-     * then the resulting Rect will have a negative width or height.
+     * Returns a new rectangle that is the intersection of the given rectangle and this rectangle.
+     * The two rectangles must overlap for this to be meaningful. If the two rectangles do not
+     * overlap, then the resulting Rect will have a negative width or height.
      */
     @Stable
     fun intersect(otherLeft: Float, otherTop: Float, otherRight: Float, otherBottom: Float): Rect {
@@ -174,163 +149,128 @@
 
     /** Whether `other` has a nonzero area of overlap with this rectangle. */
     fun overlaps(other: Rect): Boolean {
-        if (right <= other.left || other.right <= left)
-            return false
-        if (bottom <= other.top || other.bottom <= top)
-            return false
+        if (right <= other.left || other.right <= left) return false
+        if (bottom <= other.top || other.bottom <= top) return false
         return true
     }
 
-    /**
-     * The lesser of the magnitudes of the [width] and the [height] of this
-     * rectangle.
-     */
+    /** The lesser of the magnitudes of the [width] and the [height] of this rectangle. */
     val minDimension: Float
         get() = min(width.absoluteValue, height.absoluteValue)
 
-    /**
-     * The greater of the magnitudes of the [width] and the [height] of this
-     * rectangle.
-     */
+    /** The greater of the magnitudes of the [width] and the [height] of this rectangle. */
     val maxDimension: Float
         get() = max(width.absoluteValue, height.absoluteValue)
 
-    /**
-     * The offset to the intersection of the top and left edges of this rectangle.
-     */
+    /** The offset to the intersection of the top and left edges of this rectangle. */
     val topLeft: Offset
         get() = Offset(left, top)
 
-    /**
-     * The offset to the center of the top edge of this rectangle.
-     */
+    /** The offset to the center of the top edge of this rectangle. */
     val topCenter: Offset
         get() = Offset(left + width / 2.0f, top)
 
-    /**
-     * The offset to the intersection of the top and right edges of this rectangle.
-     */
+    /** The offset to the intersection of the top and right edges of this rectangle. */
     val topRight: Offset
         get() = Offset(right, top)
 
-    /**
-     * The offset to the center of the left edge of this rectangle.
-     */
+    /** The offset to the center of the left edge of this rectangle. */
     val centerLeft: Offset
         get() = Offset(left, top + height / 2.0f)
 
     /**
-     * The offset to the point halfway between the left and right and the top and
-     * bottom edges of this rectangle.
+     * The offset to the point halfway between the left and right and the top and bottom edges of
+     * this rectangle.
      *
      * See also [Size.center].
      */
     val center: Offset
         get() = Offset(left + width / 2.0f, top + height / 2.0f)
 
-    /**
-     * The offset to the center of the right edge of this rectangle.
-     */
+    /** The offset to the center of the right edge of this rectangle. */
     val centerRight: Offset
         get() = Offset(right, top + height / 2.0f)
 
-    /**
-     * The offset to the intersection of the bottom and left edges of this rectangle.
-     */
+    /** The offset to the intersection of the bottom and left edges of this rectangle. */
     val bottomLeft: Offset
         get() = Offset(left, bottom)
 
-    /**
-     * The offset to the center of the bottom edge of this rectangle.
-     */
+    /** The offset to the center of the bottom edge of this rectangle. */
     val bottomCenter: Offset
-        get() { return Offset(left + width / 2.0f, bottom) }
+        get() {
+            return Offset(left + width / 2.0f, bottom)
+        }
 
-    /**
-     * The offset to the intersection of the bottom and right edges of this rectangle.
-     */
+    /** The offset to the intersection of the bottom and right edges of this rectangle. */
     val bottomRight: Offset
-        get() { return Offset(right, bottom) }
+        get() {
+            return Offset(right, bottom)
+        }
 
     /**
-     * Whether the point specified by the given offset (which is assumed to be
-     * relative to the origin) lies between the left and right and the top and
-     * bottom edges of this rectangle.
+     * Whether the point specified by the given offset (which is assumed to be relative to the
+     * origin) lies between the left and right and the top and bottom edges of this rectangle.
      *
-     * Rectangles include their top and left edges but exclude their bottom and
-     * right edges.
+     * Rectangles include their top and left edges but exclude their bottom and right edges.
      */
     operator fun contains(offset: Offset): Boolean {
         return offset.x >= left && offset.x < right && offset.y >= top && offset.y < bottom
     }
 
-    override fun toString() = "Rect.fromLTRB(" +
-        "${left.toStringAsFixed(1)}, " +
-        "${top.toStringAsFixed(1)}, " +
-        "${right.toStringAsFixed(1)}, " +
-        "${bottom.toStringAsFixed(1)})"
+    override fun toString() =
+        "Rect.fromLTRB(" +
+            "${left.toStringAsFixed(1)}, " +
+            "${top.toStringAsFixed(1)}, " +
+            "${right.toStringAsFixed(1)}, " +
+            "${bottom.toStringAsFixed(1)})"
 }
 
 /**
  * Construct a rectangle from its left and top edges as well as its width and height.
+ *
  * @param offset Offset to represent the top and left parameters of the Rect
  * @param size Size to determine the width and height of this [Rect].
  * @return Rect with [Rect.left] and [Rect.top] configured to [Offset.x] and [Offset.y] as
- * [Rect.right] and [Rect.bottom] to [Offset.x] + [Size.width] and [Offset.y] + [Size.height]
- * respectively
+ *   [Rect.right] and [Rect.bottom] to [Offset.x] + [Size.width] and [Offset.y] + [Size.height]
+ *   respectively
  */
 @Stable
 fun Rect(offset: Offset, size: Size): Rect =
-    Rect(
-        offset.x,
-        offset.y,
-        offset.x + size.width,
-        offset.y + size.height
-    )
+    Rect(offset.x, offset.y, offset.x + size.width, offset.y + size.height)
 
 /**
- * Construct the smallest rectangle that encloses the given offsets, treating
- * them as vectors from the origin.
+ * Construct the smallest rectangle that encloses the given offsets, treating them as vectors from
+ * the origin.
+ *
  * @param topLeft Offset representing the left and top edges of the rectangle
  * @param bottomRight Offset representing the bottom and right edges of the rectangle
  */
 @Stable
 fun Rect(topLeft: Offset, bottomRight: Offset): Rect =
-    Rect(
-        topLeft.x,
-        topLeft.y,
-        bottomRight.x,
-        bottomRight.y
-    )
+    Rect(topLeft.x, topLeft.y, bottomRight.x, bottomRight.y)
 
 /**
  * Construct a rectangle that bounds the given circle
+ *
  * @param center Offset that represents the center of the circle
  * @param radius Radius of the circle to enclose
  */
 @Stable
 fun Rect(center: Offset, radius: Float): Rect =
-    Rect(
-        center.x - radius,
-        center.y - radius,
-        center.x + radius,
-        center.y + radius
-    )
+    Rect(center.x - radius, center.y - radius, center.x + radius, center.y + radius)
 
 /**
  * Linearly interpolate between two rectangles.
  *
- * The [fraction] argument represents position on the timeline, with 0.0 meaning
- * that the interpolation has not started, returning [start] (or something
- * equivalent to [start]), 1.0 meaning that the interpolation has finished,
- * returning [stop] (or something equivalent to [stop]), and values in between
- * meaning that the interpolation is at the relevant point on the timeline
- * between [start] and [stop]. The interpolation can be extrapolated beyond 0.0 and
- * 1.0, so negative values and values greater than 1.0 are valid (and can
- * easily be generated by curves).
+ * The [fraction] argument represents position on the timeline, with 0.0 meaning that the
+ * interpolation has not started, returning [start] (or something equivalent to [start]), 1.0
+ * meaning that the interpolation has finished, returning [stop] (or something equivalent to
+ * [stop]), and values in between meaning that the interpolation is at the relevant point on the
+ * timeline between [start] and [stop]. The interpolation can be extrapolated beyond 0.0 and 1.0, so
+ * negative values and values greater than 1.0 are valid (and can easily be generated by curves).
  *
- * Values for [fraction] are usually obtained from an [Animation<Float>], such as
- * an `AnimationController`.
+ * Values for [fraction] are usually obtained from an [Animation<Float>], such as an
+ * `AnimationController`.
  */
 @Stable
 fun lerp(start: Rect, stop: Rect, fraction: Float): Rect {
diff --git a/compose/ui/ui-geometry/src/commonMain/kotlin/androidx/compose/ui/geometry/RoundRect.kt b/compose/ui/ui-geometry/src/commonMain/kotlin/androidx/compose/ui/geometry/RoundRect.kt
index 2ce06a3..c38b4353 100644
--- a/compose/ui/ui-geometry/src/commonMain/kotlin/androidx/compose/ui/geometry/RoundRect.kt
+++ b/compose/ui/ui-geometry/src/commonMain/kotlin/androidx/compose/ui/geometry/RoundRect.kt
@@ -22,9 +22,7 @@
 import kotlin.math.max
 import kotlin.math.min
 
-/**
- * An immutable rounded rectangle with custom radii for all four corners.
- */
+/** An immutable rounded rectangle with custom radii for all four corners. */
 @Immutable
 data class RoundRect(
     /** The offset of the left edge of this rectangle from the x axis */
@@ -57,52 +55,62 @@
 
     /**
      * Same RoundRect with scaled radii per side. If you need this call [scaledRadiiRect] instead.
-     * Not @Volatile since the computed result will always be the same even if we race
-     * and duplicate creation/computation in [scaledRadiiRect].
+     * Not @Volatile since the computed result will always be the same even if we race and duplicate
+     * creation/computation in [scaledRadiiRect].
      */
     private var _scaledRadiiRect: RoundRect? = null
 
     /**
-     * Scales all radii so that on each side their sum will not pass the size of
-     * the width/height.
+     * Scales all radii so that on each side their sum will not pass the size of the width/height.
      */
-    private fun scaledRadiiRect(): RoundRect = _scaledRadiiRect ?: run {
-        var scale = 1.0f
-        scale = minRadius(scale, bottomLeftCornerRadius.y, topLeftCornerRadius.y, height)
-        scale = minRadius(scale, topLeftCornerRadius.x, topRightCornerRadius.x, width)
-        scale = minRadius(scale, topRightCornerRadius.y, bottomRightCornerRadius.y, height)
-        scale = minRadius(scale, bottomRightCornerRadius.x, bottomLeftCornerRadius.x, width)
+    private fun scaledRadiiRect(): RoundRect =
+        _scaledRadiiRect
+            ?: run {
+                    var scale = 1.0f
+                    scale =
+                        minRadius(scale, bottomLeftCornerRadius.y, topLeftCornerRadius.y, height)
+                    scale = minRadius(scale, topLeftCornerRadius.x, topRightCornerRadius.x, width)
+                    scale =
+                        minRadius(scale, topRightCornerRadius.y, bottomRightCornerRadius.y, height)
+                    scale =
+                        minRadius(scale, bottomRightCornerRadius.x, bottomLeftCornerRadius.x, width)
 
-        RoundRect(
-            left = left * scale,
-            top = top * scale,
-            right = right * scale,
-            bottom = bottom * scale,
-            topLeftCornerRadius = CornerRadius(
-                topLeftCornerRadius.x * scale,
-                topLeftCornerRadius.y * scale
-            ),
-            topRightCornerRadius = CornerRadius(
-                topRightCornerRadius.x * scale,
-                topRightCornerRadius.y * scale
-            ),
-            bottomRightCornerRadius = CornerRadius(
-                bottomRightCornerRadius.x * scale,
-                bottomRightCornerRadius.y * scale
-            ),
-            bottomLeftCornerRadius = CornerRadius(
-                bottomLeftCornerRadius.x * scale,
-                bottomLeftCornerRadius.y * scale
-            )
-        )
-    }.also {
-        // This might happen racey on different threads, we don't care, it'll be the same results.
-        _scaledRadiiRect = it
-    }
+                    RoundRect(
+                        left = left * scale,
+                        top = top * scale,
+                        right = right * scale,
+                        bottom = bottom * scale,
+                        topLeftCornerRadius =
+                            CornerRadius(
+                                topLeftCornerRadius.x * scale,
+                                topLeftCornerRadius.y * scale
+                            ),
+                        topRightCornerRadius =
+                            CornerRadius(
+                                topRightCornerRadius.x * scale,
+                                topRightCornerRadius.y * scale
+                            ),
+                        bottomRightCornerRadius =
+                            CornerRadius(
+                                bottomRightCornerRadius.x * scale,
+                                bottomRightCornerRadius.y * scale
+                            ),
+                        bottomLeftCornerRadius =
+                            CornerRadius(
+                                bottomLeftCornerRadius.x * scale,
+                                bottomLeftCornerRadius.y * scale
+                            )
+                    )
+                }
+                .also {
+                    // This might happen racey on different threads, we don't care, it'll be the
+                    // same results.
+                    _scaledRadiiRect = it
+                }
 
     /**
-     * Returns the minimum between min and scale to which radius1 and radius2
-     * should be scaled with in order not to exceed the limit.
+     * Returns the minimum between min and scale to which radius1 and radius2 should be scaled with
+     * in order not to exceed the limit.
      */
     private fun minRadius(min: Float, radius1: Float, radius2: Float, limit: Float): Float {
         val sum = radius1 + radius2
@@ -114,17 +122,17 @@
     }
 
     /**
-     * Whether the point specified by the given offset (which is assumed to be
-     * relative to the origin) lies inside the rounded rectangle.
+     * Whether the point specified by the given offset (which is assumed to be relative to the
+     * origin) lies inside the rounded rectangle.
      *
-     * This method may allocate (and cache) a copy of the object with normalized
-     * radii the first time it is called on a particular [RoundRect] instance. When
-     * using this method, prefer to reuse existing [RoundRect]s rather than
-     * recreating the object each time.
+     * This method may allocate (and cache) a copy of the object with normalized radii the first
+     * time it is called on a particular [RoundRect] instance. When using this method, prefer to
+     * reuse existing [RoundRect]s rather than recreating the object each time.
      */
     operator fun contains(point: Offset): Boolean {
         if (point.x < left || point.x >= right || point.y < top || point.y >= bottom) {
-            return false; // outside bounding box
+            return false
+            // outside bounding box
         }
 
         val scaled = scaledRadiiRect()
@@ -135,36 +143,41 @@
         val radiusY: Float
         // check whether point is in one of the rounded corner areas
         // x, y -> translate to ellipse center
-        if (point.x < left + scaled.topLeftCornerRadius.x &&
-            point.y < top + scaled.topLeftCornerRadius.y
+        if (
+            point.x < left + scaled.topLeftCornerRadius.x &&
+                point.y < top + scaled.topLeftCornerRadius.y
         ) {
             x = point.x - left - scaled.topLeftCornerRadius.x
             y = point.y - top - scaled.topLeftCornerRadius.y
             radiusX = scaled.topLeftCornerRadius.x
             radiusY = scaled.topLeftCornerRadius.y
-        } else if (point.x > right - scaled.topRightCornerRadius.x &&
-            point.y < top + scaled.topRightCornerRadius.y
+        } else if (
+            point.x > right - scaled.topRightCornerRadius.x &&
+                point.y < top + scaled.topRightCornerRadius.y
         ) {
             x = point.x - right + scaled.topRightCornerRadius.x
             y = point.y - top - scaled.topRightCornerRadius.y
             radiusX = scaled.topRightCornerRadius.x
             radiusY = scaled.topRightCornerRadius.y
-        } else if (point.x > right - scaled.bottomRightCornerRadius.x &&
-            point.y > bottom - scaled.bottomRightCornerRadius.y
+        } else if (
+            point.x > right - scaled.bottomRightCornerRadius.x &&
+                point.y > bottom - scaled.bottomRightCornerRadius.y
         ) {
             x = point.x - right + scaled.bottomRightCornerRadius.x
             y = point.y - bottom + scaled.bottomRightCornerRadius.y
             radiusX = scaled.bottomRightCornerRadius.x
             radiusY = scaled.bottomRightCornerRadius.y
-        } else if (point.x < left + scaled.bottomLeftCornerRadius.x &&
-            point.y > bottom - scaled.bottomLeftCornerRadius.y
+        } else if (
+            point.x < left + scaled.bottomLeftCornerRadius.x &&
+                point.y > bottom - scaled.bottomLeftCornerRadius.y
         ) {
             x = point.x - left - scaled.bottomLeftCornerRadius.x
             y = point.y - bottom + scaled.bottomLeftCornerRadius.y
             radiusX = scaled.bottomLeftCornerRadius.x
             radiusY = scaled.bottomLeftCornerRadius.y
         } else {
-            return true; // inside and not within the rounded corner area
+            return true
+            // inside and not within the rounded corner area
         }
 
         val newX = x / radiusX
@@ -184,10 +197,7 @@
                 "${top.toStringAsFixed(1)}, " +
                 "${right.toStringAsFixed(1)}, " +
                 bottom.toStringAsFixed(1)
-        if (tlRadius == trRadius &&
-            trRadius == brRadius &&
-            brRadius == blRadius
-        ) {
+        if (tlRadius == trRadius && trRadius == brRadius && brRadius == blRadius) {
             if (tlRadius.x == tlRadius.y) {
                 return "RoundRect(rect=$rect, radius=${tlRadius.x.toStringAsFixed(1)})"
             }
@@ -204,14 +214,13 @@
 
     companion object {
         /** A rounded rectangle with all the values set to zero. */
-        @kotlin.jvm.JvmStatic
-        val Zero = RoundRect(0.0f, 0.0f, 0.0f, 0.0f, CornerRadius.Zero)
+        @kotlin.jvm.JvmStatic val Zero = RoundRect(0.0f, 0.0f, 0.0f, 0.0f, CornerRadius.Zero)
     }
 }
 
 /**
- * Construct a rounded rectangle from its left, top, right, and bottom edges,
- * and the same radii along its horizontal axis and its vertical axis.
+ * Construct a rounded rectangle from its left, top, right, and bottom edges, and the same radii
+ * along its horizontal axis and its vertical axis.
  */
 fun RoundRect(
     left: Float,
@@ -235,57 +244,35 @@
 }
 
 /**
- * Construct a rounded rectangle from its left, top, right, and bottom edges,
- * and the same radius in each corner.
+ * Construct a rounded rectangle from its left, top, right, and bottom edges, and the same radius in
+ * each corner.
  */
-fun RoundRect(
-    left: Float,
-    top: Float,
-    right: Float,
-    bottom: Float,
-    cornerRadius: CornerRadius
-) = RoundRect(
-    left,
-    top,
-    right,
-    bottom,
-    cornerRadius.x,
-    cornerRadius.y
-)
+fun RoundRect(left: Float, top: Float, right: Float, bottom: Float, cornerRadius: CornerRadius) =
+    RoundRect(left, top, right, bottom, cornerRadius.x, cornerRadius.y)
 
 /**
- * Construct a rounded rectangle from its bounding box and the same radii
- * along its horizontal axis and its vertical axis.
+ * Construct a rounded rectangle from its bounding box and the same radii along its horizontal axis
+ * and its vertical axis.
  */
-fun RoundRect(
-    rect: Rect,
-    radiusX: Float,
-    radiusY: Float
-): RoundRect = RoundRect(
-    left = rect.left,
-    top = rect.top,
-    right = rect.right,
-    bottom = rect.bottom,
-    radiusX = radiusX,
-    radiusY = radiusY
-)
+fun RoundRect(rect: Rect, radiusX: Float, radiusY: Float): RoundRect =
+    RoundRect(
+        left = rect.left,
+        top = rect.top,
+        right = rect.right,
+        bottom = rect.bottom,
+        radiusX = radiusX,
+        radiusY = radiusY
+    )
 
 /**
- * Construct a rounded rectangle from its bounding box and a radius that is
- * the same in each corner.
+ * Construct a rounded rectangle from its bounding box and a radius that is the same in each corner.
  */
-fun RoundRect(
-    rect: Rect,
-    cornerRadius: CornerRadius
-): RoundRect = RoundRect(
-    rect = rect,
-    radiusX = cornerRadius.x,
-    radiusY = cornerRadius.y
-)
+fun RoundRect(rect: Rect, cornerRadius: CornerRadius): RoundRect =
+    RoundRect(rect = rect, radiusX = cornerRadius.x, radiusY = cornerRadius.y)
 
 /**
- * Construct a rounded rectangle from its bounding box and topLeft,
- * topRight, bottomRight, and bottomLeft radii.
+ * Construct a rounded rectangle from its bounding box and topLeft, topRight, bottomRight, and
+ * bottomLeft radii.
  *
  * The corner radii default to [CornerRadius.Zero], i.e. right-angled corners
  */
@@ -295,37 +282,39 @@
     topRight: CornerRadius = CornerRadius.Zero,
     bottomRight: CornerRadius = CornerRadius.Zero,
     bottomLeft: CornerRadius = CornerRadius.Zero
-): RoundRect = RoundRect(
-    left = rect.left,
-    top = rect.top,
-    right = rect.right,
-    bottom = rect.bottom,
-    topLeftCornerRadius = topLeft,
-    topRightCornerRadius = topRight,
-    bottomRightCornerRadius = bottomRight,
-    bottomLeftCornerRadius = bottomLeft
-)
+): RoundRect =
+    RoundRect(
+        left = rect.left,
+        top = rect.top,
+        right = rect.right,
+        bottom = rect.bottom,
+        topLeftCornerRadius = topLeft,
+        topRightCornerRadius = topRight,
+        bottomRightCornerRadius = bottomRight,
+        bottomLeftCornerRadius = bottomLeft
+    )
 
 /** Returns a new [RoundRect] translated by the given offset. */
-fun RoundRect.translate(offset: Offset): RoundRect = RoundRect(
-    left = left + offset.x,
-    top = top + offset.y,
-    right = right + offset.x,
-    bottom = bottom + offset.y,
-    topLeftCornerRadius = topLeftCornerRadius,
-    topRightCornerRadius = topRightCornerRadius,
-    bottomRightCornerRadius = bottomRightCornerRadius,
-    bottomLeftCornerRadius = bottomLeftCornerRadius
-)
+fun RoundRect.translate(offset: Offset): RoundRect =
+    RoundRect(
+        left = left + offset.x,
+        top = top + offset.y,
+        right = right + offset.x,
+        bottom = bottom + offset.y,
+        topLeftCornerRadius = topLeftCornerRadius,
+        topRightCornerRadius = topRightCornerRadius,
+        bottomRightCornerRadius = bottomRightCornerRadius,
+        bottomLeftCornerRadius = bottomLeftCornerRadius
+    )
 
 /** The bounding box of this rounded rectangle (the rectangle with no rounded corners). */
-val RoundRect.boundingRect: Rect get() = Rect(left, top, right, bottom)
+val RoundRect.boundingRect: Rect
+    get() = Rect(left, top, right, bottom)
 
 /**
- * The non-rounded rectangle that is constrained by the smaller of the two
- * diagonals, with each diagonal traveling through the middle of the curve
- * corners. The middle of a corner is the intersection of the curve with its
- * respective quadrant bisector.
+ * The non-rounded rectangle that is constrained by the smaller of the two diagonals, with each
+ * diagonal traveling through the middle of the curve corners. The middle of a corner is the
+ * intersection of the curve with its respective quadrant bisector.
  */
 val RoundRect.safeInnerRect: Rect
     get() {
@@ -344,81 +333,81 @@
         )
     }
 
-/**
- * Whether this rounded rectangle encloses a non-zero area.
- * Negative areas are considered empty.
- */
-val RoundRect.isEmpty get() = left >= right || top >= bottom
+/** Whether this rounded rectangle encloses a non-zero area. Negative areas are considered empty. */
+val RoundRect.isEmpty
+    get() = left >= right || top >= bottom
 
 /** Whether all coordinates of this rounded rectangle are finite. */
-val RoundRect.isFinite get() =
-    left.isFinite() && top.isFinite() && right.isFinite() && bottom.isFinite()
+val RoundRect.isFinite
+    get() = left.isFinite() && top.isFinite() && right.isFinite() && bottom.isFinite()
 
-/**
- * Whether this rounded rectangle is a simple rectangle with zero
- * corner radii.
- */
-val RoundRect.isRect get(): Boolean =
-    (topLeftCornerRadius.x == 0.0f || topLeftCornerRadius.y == 0.0f) &&
-        (topRightCornerRadius.x == 0.0f || topRightCornerRadius.y == 0.0f) &&
-        (bottomLeftCornerRadius.x == 0.0f || bottomLeftCornerRadius.y == 0.0f) &&
-        (bottomRightCornerRadius.x == 0.0f || bottomRightCornerRadius.y == 0.0f)
+/** Whether this rounded rectangle is a simple rectangle with zero corner radii. */
+val RoundRect.isRect
+    get(): Boolean =
+        (topLeftCornerRadius.x == 0.0f || topLeftCornerRadius.y == 0.0f) &&
+            (topRightCornerRadius.x == 0.0f || topRightCornerRadius.y == 0.0f) &&
+            (bottomLeftCornerRadius.x == 0.0f || bottomLeftCornerRadius.y == 0.0f) &&
+            (bottomRightCornerRadius.x == 0.0f || bottomRightCornerRadius.y == 0.0f)
 
 /** Whether this rounded rectangle has no side with a straight section. */
-val RoundRect.isEllipse get(): Boolean =
-    topLeftCornerRadius.x == topRightCornerRadius.x &&
-        topLeftCornerRadius.y == topRightCornerRadius.y &&
-        topRightCornerRadius.x == bottomRightCornerRadius.x &&
-        topRightCornerRadius.y == bottomRightCornerRadius.y &&
-        bottomRightCornerRadius.x == bottomLeftCornerRadius.x &&
-        bottomRightCornerRadius.y == bottomLeftCornerRadius.y &&
-        width <= 2.0 * topLeftCornerRadius.x &&
-        height <= 2.0 * topLeftCornerRadius.y
+val RoundRect.isEllipse
+    get(): Boolean =
+        topLeftCornerRadius.x == topRightCornerRadius.x &&
+            topLeftCornerRadius.y == topRightCornerRadius.y &&
+            topRightCornerRadius.x == bottomRightCornerRadius.x &&
+            topRightCornerRadius.y == bottomRightCornerRadius.y &&
+            bottomRightCornerRadius.x == bottomLeftCornerRadius.x &&
+            bottomRightCornerRadius.y == bottomLeftCornerRadius.y &&
+            width <= 2.0 * topLeftCornerRadius.x &&
+            height <= 2.0 * topLeftCornerRadius.y
 
 /** Whether this rounded rectangle would draw as a circle. */
-val RoundRect.isCircle get() = width == height && isEllipse
+val RoundRect.isCircle
+    get() = width == height && isEllipse
 
 /**
- * The lesser of the magnitudes of the [RoundRect.width] and the [RoundRect.height] of this
- * rounded rectangle.
+ * The lesser of the magnitudes of the [RoundRect.width] and the [RoundRect.height] of this rounded
+ * rectangle.
  */
-val RoundRect.minDimension get(): Float = min(width.absoluteValue, height.absoluteValue)
+val RoundRect.minDimension
+    get(): Float = min(width.absoluteValue, height.absoluteValue)
 
-val RoundRect.maxDimension get(): Float = max(width.absoluteValue, height.absoluteValue)
+val RoundRect.maxDimension
+    get(): Float = max(width.absoluteValue, height.absoluteValue)
 
 /**
- * The offset to the point halfway between the left and right and the top and
- * bottom edges of this rectangle.
+ * The offset to the point halfway between the left and right and the top and bottom edges of this
+ * rectangle.
  */
-val RoundRect.center: Offset get() = Offset((left + width / 2.0f), (top + height / 2.0f))
+val RoundRect.center: Offset
+    get() = Offset((left + width / 2.0f), (top + height / 2.0f))
 
 /**
  * Returns `true` if the rounded rectangle have the same radii in both the horizontal and vertical
  * direction for all corners.
  */
 val RoundRect.isSimple: Boolean
-    get() = topLeftCornerRadius.x == topLeftCornerRadius.y &&
-        topLeftCornerRadius.x == topRightCornerRadius.x &&
-        topLeftCornerRadius.x == topRightCornerRadius.y &&
-        topLeftCornerRadius.x == bottomRightCornerRadius.x &&
-        topLeftCornerRadius.x == bottomRightCornerRadius.y &&
-        topLeftCornerRadius.x == bottomLeftCornerRadius.x &&
-        topLeftCornerRadius.x == bottomLeftCornerRadius.y
+    get() =
+        topLeftCornerRadius.x == topLeftCornerRadius.y &&
+            topLeftCornerRadius.x == topRightCornerRadius.x &&
+            topLeftCornerRadius.x == topRightCornerRadius.y &&
+            topLeftCornerRadius.x == bottomRightCornerRadius.x &&
+            topLeftCornerRadius.x == bottomRightCornerRadius.y &&
+            topLeftCornerRadius.x == bottomLeftCornerRadius.x &&
+            topLeftCornerRadius.x == bottomLeftCornerRadius.y
 
 /**
  * Linearly interpolate between two rounded rectangles.
  *
- * The [fraction] argument represents position on the timeline, with 0.0 meaning
- * that the interpolation has not started, returning [start] (or something
- * equivalent to [start]), 1.0 meaning that the interpolation has finished,
- * returning [stop] (or something equivalent to [stop]), and values in between
- * meaning that the interpolation is at the relevant point on the timeline
- * between [start] and [stop]. The interpolation can be extrapolated beyond 0.0 and
- * 1.0, so negative values and values greater than 1.0 are valid (and can
- * easily be generated by curves).
+ * The [fraction] argument represents position on the timeline, with 0.0 meaning that the
+ * interpolation has not started, returning [start] (or something equivalent to [start]), 1.0
+ * meaning that the interpolation has finished, returning [stop] (or something equivalent to
+ * [stop]), and values in between meaning that the interpolation is at the relevant point on the
+ * timeline between [start] and [stop]. The interpolation can be extrapolated beyond 0.0 and 1.0, so
+ * negative values and values greater than 1.0 are valid (and can easily be generated by curves).
  *
- * Values for [fraction] are usually obtained from an [Animation<Float>], such as
- * an `AnimationController`.
+ * Values for [fraction] are usually obtained from an [Animation<Float>], such as an
+ * `AnimationController`.
  */
 fun lerp(start: RoundRect, stop: RoundRect, fraction: Float): RoundRect =
     RoundRect(
@@ -426,24 +415,11 @@
         top = lerp(start.top, stop.top, fraction),
         right = lerp(start.right, stop.right, fraction),
         bottom = lerp(start.bottom, stop.bottom, fraction),
-        topLeftCornerRadius = lerp(
-            start.topLeftCornerRadius,
-            stop.topLeftCornerRadius,
-            fraction
-        ),
-        topRightCornerRadius = lerp(
-            start.topRightCornerRadius,
-            stop.topRightCornerRadius,
-            fraction
-        ),
-        bottomRightCornerRadius = lerp(
-            start.bottomRightCornerRadius,
-            stop.bottomRightCornerRadius,
-            fraction
-        ),
-        bottomLeftCornerRadius = lerp(
-            start.bottomLeftCornerRadius,
-            stop.bottomLeftCornerRadius,
-            fraction
-        )
+        topLeftCornerRadius = lerp(start.topLeftCornerRadius, stop.topLeftCornerRadius, fraction),
+        topRightCornerRadius =
+            lerp(start.topRightCornerRadius, stop.topRightCornerRadius, fraction),
+        bottomRightCornerRadius =
+            lerp(start.bottomRightCornerRadius, stop.bottomRightCornerRadius, fraction),
+        bottomLeftCornerRadius =
+            lerp(start.bottomLeftCornerRadius, stop.bottomLeftCornerRadius, fraction)
     )
diff --git a/compose/ui/ui-geometry/src/commonMain/kotlin/androidx/compose/ui/geometry/Size.kt b/compose/ui/ui-geometry/src/commonMain/kotlin/androidx/compose/ui/geometry/Size.kt
index df0c802..72157d0 100644
--- a/compose/ui/ui-geometry/src/commonMain/kotlin/androidx/compose/ui/geometry/Size.kt
+++ b/compose/ui/ui-geometry/src/commonMain/kotlin/androidx/compose/ui/geometry/Size.kt
@@ -27,11 +27,8 @@
 import kotlin.math.max
 import kotlin.math.min
 
-/**
- * Constructs a [Size] from the given width and height
- */
-@Stable
-fun Size(width: Float, height: Float) = Size(packFloats(width, height))
+/** Constructs a [Size] from the given width and height */
+@Stable fun Size(width: Float, height: Float) = Size(packFloats(width, height))
 
 /**
  * Holds a 2D floating-point size.
@@ -61,36 +58,25 @@
             return unpackFloat2(packedValue)
         }
 
-    @Suppress("NOTHING_TO_INLINE")
-    @Stable
-    inline operator fun component1(): Float = width
+    @Suppress("NOTHING_TO_INLINE") @Stable inline operator fun component1(): Float = width
 
-    @Suppress("NOTHING_TO_INLINE")
-    @Stable
-    inline operator fun component2(): Float = height
+    @Suppress("NOTHING_TO_INLINE") @Stable inline operator fun component2(): Float = height
 
-    /**
-     * Returns a copy of this Size instance optionally overriding the
-     * width or height parameter
-     */
+    /** Returns a copy of this Size instance optionally overriding the width or height parameter */
     fun copy(width: Float = unpackFloat1(packedValue), height: Float = unpackFloat2(packedValue)) =
         Size(packFloats(width, height))
 
     companion object {
 
-        /**
-         * An empty size, one with a zero width and a zero height.
-         */
-        @Stable
-        val Zero = Size(0x0L)
+        /** An empty size, one with a zero width and a zero height. */
+        @Stable val Zero = Size(0x0L)
 
         /**
-         * A size whose [width] and [height] are unspecified. This is a sentinel
-         * value used to initialize a non-null parameter.
-         * Access to width or height on an unspecified size is not allowed.
+         * A size whose [width] and [height] are unspecified. This is a sentinel value used to
+         * initialize a non-null parameter. Access to width or height on an unspecified size is not
+         * allowed.
          */
-        @Stable
-        val Unspecified = Size(UnspecifiedPackedFloats)
+        @Stable val Unspecified = Size(UnspecifiedPackedFloats)
     }
 
     /**
@@ -119,9 +105,8 @@
     /**
      * Multiplication operator.
      *
-     * Returns a [Size] whose dimensions are the dimensions of the left-hand-side
-     * operand (a [Size]) multiplied by the scalar right-hand-side operand (a
-     * [Float]).
+     * Returns a [Size] whose dimensions are the dimensions of the left-hand-side operand (a [Size])
+     * multiplied by the scalar right-hand-side operand (a [Float]).
      */
     @Stable
     operator fun times(operand: Float): Size {
@@ -129,19 +114,15 @@
             throwIllegalStateException("Size is unspecified")
         }
         return Size(
-            packFloats(
-                unpackFloat1(packedValue) * operand,
-                unpackFloat2(packedValue) * operand
-            )
+            packFloats(unpackFloat1(packedValue) * operand, unpackFloat2(packedValue) * operand)
         )
     }
 
     /**
      * Division operator.
      *
-     * Returns a [Size] whose dimensions are the dimensions of the left-hand-side
-     * operand (a [Size]) divided by the scalar right-hand-side operand (a
-     * [Float]).
+     * Returns a [Size] whose dimensions are the dimensions of the left-hand-side operand (a [Size])
+     * divided by the scalar right-hand-side operand (a [Float]).
      */
     @Stable
     operator fun div(operand: Float): Size {
@@ -149,16 +130,11 @@
             throwIllegalStateException("Size is unspecified")
         }
         return Size(
-            packFloats(
-                unpackFloat1(packedValue) / operand,
-                unpackFloat2(packedValue) / operand
-            )
+            packFloats(unpackFloat1(packedValue) / operand, unpackFloat2(packedValue) / operand)
         )
     }
 
-    /**
-     * The lesser of the magnitudes of the [width] and the [height].
-     */
+    /** The lesser of the magnitudes of the [width] and the [height]. */
     @Stable
     val minDimension: Float
         get() {
@@ -168,9 +144,7 @@
             return min(unpackAbsFloat1(packedValue), unpackAbsFloat2(packedValue))
         }
 
-    /**
-     * The greater of the magnitudes of the [width] and the [height].
-     */
+    /** The greater of the magnitudes of the [width] and the [height]. */
     @Stable
     val maxDimension: Float
         get() {
@@ -190,47 +164,39 @@
         }
 }
 
-/**
- * `false` when this is [Size.Unspecified].
- */
+/** `false` when this is [Size.Unspecified]. */
 @Stable
 inline val Size.isSpecified: Boolean
     get() = packedValue != 0x7fc00000_7fc00000L // NaN_NaN, see UnspecifiedPackedFloats
 
-/**
- * `true` when this is [Size.Unspecified].
- */
+/** `true` when this is [Size.Unspecified]. */
 @Stable
 inline val Size.isUnspecified: Boolean
     get() = packedValue == 0x7fc00000_7fc00000L // NaN_NaN, see UnspecifiedPackedFloats
 
 /**
- * If this [Size]&nbsp;[isSpecified] then this is returned, otherwise [block] is executed
- * and its result is returned.
+ * If this [Size]&nbsp;[isSpecified] then this is returned, otherwise [block] is executed and its
+ * result is returned.
  */
-inline fun Size.takeOrElse(block: () -> Size): Size =
-    if (isSpecified) this else block()
+inline fun Size.takeOrElse(block: () -> Size): Size = if (isSpecified) this else block()
 
 /**
  * Linearly interpolate between two sizes
  *
- * The [fraction] argument represents position on the timeline, with 0.0 meaning
- * that the interpolation has not started, returning [start] (or something
- * equivalent to [start]), 1.0 meaning that the interpolation has finished,
- * returning [stop] (or something equivalent to [stop]), and values in between
- * meaning that the interpolation is at the relevant point on the timeline
- * between [start] and [stop]. The interpolation can be extrapolated beyond 0.0 and
- * 1.0, so negative values and values greater than 1.0 are valid (and can
- * easily be generated by curves).
+ * The [fraction] argument represents position on the timeline, with 0.0 meaning that the
+ * interpolation has not started, returning [start] (or something equivalent to [start]), 1.0
+ * meaning that the interpolation has finished, returning [stop] (or something equivalent to
+ * [stop]), and values in between meaning that the interpolation is at the relevant point on the
+ * timeline between [start] and [stop]. The interpolation can be extrapolated beyond 0.0 and 1.0, so
+ * negative values and values greater than 1.0 are valid (and can easily be generated by curves).
  *
- * Values for [fraction] are usually obtained from an [Animation<Float>], such as
- * an `AnimationController`.
+ * Values for [fraction] are usually obtained from an [Animation<Float>], such as an
+ * `AnimationController`.
  */
 @Stable
 fun lerp(start: Size, stop: Size, fraction: Float): Size {
     if (
-        start.packedValue == UnspecifiedPackedFloats ||
-        stop.packedValue == UnspecifiedPackedFloats
+        start.packedValue == UnspecifiedPackedFloats || stop.packedValue == UnspecifiedPackedFloats
     ) {
         throwIllegalStateException("Offset is unspecified")
     }
@@ -242,43 +208,31 @@
     )
 }
 
-/**
- * Returns a [Size] with [size]'s [Size.width] and [Size.height] multiplied by [this]
- */
+/** Returns a [Size] with [size]'s [Size.width] and [Size.height] multiplied by [this] */
 @Suppress("NOTHING_TO_INLINE")
 @Stable
 inline operator fun Int.times(size: Size) = size * this.toFloat()
 
-/**
- * Returns a [Size] with [size]'s [Size.width] and [Size.height] multiplied by [this]
- */
+/** Returns a [Size] with [size]'s [Size.width] and [Size.height] multiplied by [this] */
 @Suppress("NOTHING_TO_INLINE")
 @Stable
 inline operator fun Double.times(size: Size) = size * this.toFloat()
 
-/**
- * Returns a [Size] with [size]'s [Size.width] and [Size.height] multiplied by [this]
- */
-@Suppress("NOTHING_TO_INLINE")
-@Stable
-inline operator fun Float.times(size: Size) = size * this
+/** Returns a [Size] with [size]'s [Size.width] and [Size.height] multiplied by [this] */
+@Suppress("NOTHING_TO_INLINE") @Stable inline operator fun Float.times(size: Size) = size * this
 
-/**
- * Convert a [Size] to a [Rect].
- */
+/** Convert a [Size] to a [Rect]. */
 @Stable
 fun Size.toRect(): Rect {
     return Rect(Offset.Zero, this)
 }
 
-/**
- * Returns the [Offset] of the center of the rect from the point of [0, 0]
- * with this [Size].
- */
+/** Returns the [Offset] of the center of the rect from the point of [0, 0] with this [Size]. */
 @Stable
-val Size.center: Offset get() {
-    if (packedValue == UnspecifiedPackedFloats) {
-        throwIllegalStateException("Size is unspecified")
+val Size.center: Offset
+    get() {
+        if (packedValue == UnspecifiedPackedFloats) {
+            throwIllegalStateException("Size is unspecified")
+        }
+        return Offset(unpackFloat1(packedValue) / 2f, unpackFloat2(packedValue) / 2f)
     }
-    return Offset(unpackFloat1(packedValue) / 2f, unpackFloat2(packedValue) / 2f)
-}
diff --git a/compose/ui/ui-graphics-lint/src/main/java/androidx/compose/ui/graphics/lint/ColorDetector.kt b/compose/ui/ui-graphics-lint/src/main/java/androidx/compose/ui/graphics/lint/ColorDetector.kt
index f4fb0e4..6484229 100644
--- a/compose/ui/ui-graphics-lint/src/main/java/androidx/compose/ui/graphics/lint/ColorDetector.kt
+++ b/compose/ui/ui-graphics-lint/src/main/java/androidx/compose/ui/graphics/lint/ColorDetector.kt
@@ -37,9 +37,9 @@
 
 /**
  * [Detector] that checks hex Color definitions to ensure that they provide values for all four
- * (ARGB) channels. Providing only three channels (such as 0xFF0000) will result in an empty
- * alpha channel, which is rarely intended - in cases where it is, it is typically more readable
- * to just explicitly define the alpha channel anyway.
+ * (ARGB) channels. Providing only three channels (such as 0xFF0000) will result in an empty alpha
+ * channel, which is rarely intended - in cases where it is, it is typically more readable to just
+ * explicitly define the alpha channel anyway.
  */
 class ColorDetector : Detector(), SourceCodeScanner {
     override fun getApplicableMethodNames(): List<String> = listOf(Names.UiGraphics.Color.shortName)
@@ -58,12 +58,13 @@
                 if (hexIndex != 0) return
                 val hexArgument = argumentText.substring(hexIndex + hexPrefix.length)
                 // The length of the actual hex value (without separators and suffix) should be 8
-                val hexLength = hexArgument
-                    // Trim any underscores that might be used to separate values
-                    .replace("_", "")
-                    // Remove the suffix `L` if present
-                    .replace("L", "")
-                    .length
+                val hexLength =
+                    hexArgument
+                        // Trim any underscores that might be used to separate values
+                        .replace("_", "")
+                        // Remove the suffix `L` if present
+                        .replace("L", "")
+                        .length
                 when (hexLength) {
                     // Expected length is 8: four 8-bit channels, e.g FF000000
                     8 -> return
@@ -74,10 +75,8 @@
                         // Try to be consistent with how the hex value is currently defined - if
                         // there are any lower case characters, suggest to add a lower case
                         // channel. Otherwise use upper case as the default.
-                        val isHexValueLowerCase = hexArgument
-                            .firstOrNull {
-                                !it.isDigit()
-                            }?.isLowerCase() == true
+                        val isHexValueLowerCase =
+                            hexArgument.firstOrNull { !it.isDigit() }?.isLowerCase() == true
 
                         val alphaChannel = if (isHexValueLowerCase) "ff" else "FF"
                         val replacement = hexPrefix + alphaChannel + hexArgument
@@ -112,32 +111,38 @@
     }
 
     companion object {
-        val MissingColorAlphaChannel = Issue.create(
-            "MissingColorAlphaChannel",
-            "Missing Color alpha channel",
-            "Creating a Color with a hex value requires a 32 bit value " +
-                "(such as 0xFF000000), with 8 bits being used per channel (ARGB). Not passing a " +
-                "full 32 bit value will result in channels being undefined. For example, passing " +
-                "0xFF0000 will result in a missing alpha channel, so the color will not appear " +
-                "visible.",
-            Category.CORRECTNESS, 3, Severity.WARNING,
-            Implementation(
-                ColorDetector::class.java,
-                EnumSet.of(Scope.JAVA_FILE, Scope.TEST_SOURCES)
+        val MissingColorAlphaChannel =
+            Issue.create(
+                "MissingColorAlphaChannel",
+                "Missing Color alpha channel",
+                "Creating a Color with a hex value requires a 32 bit value " +
+                    "(such as 0xFF000000), with 8 bits being used per channel (ARGB). Not passing a " +
+                    "full 32 bit value will result in channels being undefined. For example, passing " +
+                    "0xFF0000 will result in a missing alpha channel, so the color will not appear " +
+                    "visible.",
+                Category.CORRECTNESS,
+                3,
+                Severity.WARNING,
+                Implementation(
+                    ColorDetector::class.java,
+                    EnumSet.of(Scope.JAVA_FILE, Scope.TEST_SOURCES)
+                )
             )
-        )
 
-        val InvalidColorHexValue = Issue.create(
-            "InvalidColorHexValue",
-            "Invalid Color hex value",
-            "Creating a Color with a hex value requires a 32 bit value " +
-                "(such as 0xFF000000), with 8 bits being used per channel (ARGB). Not passing a " +
-                "full 32 bit value will result in channels being undefined / incorrect.",
-            Category.CORRECTNESS, 3, Severity.WARNING,
-            Implementation(
-                ColorDetector::class.java,
-                EnumSet.of(Scope.JAVA_FILE, Scope.TEST_SOURCES)
+        val InvalidColorHexValue =
+            Issue.create(
+                "InvalidColorHexValue",
+                "Invalid Color hex value",
+                "Creating a Color with a hex value requires a 32 bit value " +
+                    "(such as 0xFF000000), with 8 bits being used per channel (ARGB). Not passing a " +
+                    "full 32 bit value will result in channels being undefined / incorrect.",
+                Category.CORRECTNESS,
+                3,
+                Severity.WARNING,
+                Implementation(
+                    ColorDetector::class.java,
+                    EnumSet.of(Scope.JAVA_FILE, Scope.TEST_SOURCES)
+                )
             )
-        )
     }
 }
diff --git a/compose/ui/ui-graphics-lint/src/main/java/androidx/compose/ui/graphics/lint/UiGraphicsIssueRegistry.kt b/compose/ui/ui-graphics-lint/src/main/java/androidx/compose/ui/graphics/lint/UiGraphicsIssueRegistry.kt
index 065492c4..7d14531 100644
--- a/compose/ui/ui-graphics-lint/src/main/java/androidx/compose/ui/graphics/lint/UiGraphicsIssueRegistry.kt
+++ b/compose/ui/ui-graphics-lint/src/main/java/androidx/compose/ui/graphics/lint/UiGraphicsIssueRegistry.kt
@@ -20,20 +20,18 @@
 import com.android.tools.lint.client.api.Vendor
 import com.android.tools.lint.detector.api.CURRENT_API
 
-/**
- * [IssueRegistry] containing Compose UI graphics specific lint issues.
- */
+/** [IssueRegistry] containing Compose UI graphics specific lint issues. */
 class UiGraphicsIssueRegistry : IssueRegistry() {
     // Tests are run with this version. We ensure that with ApiLintVersionsTest
     override val api = 14
     override val minApi = CURRENT_API
-    override val issues get() = listOf(
-        ColorDetector.MissingColorAlphaChannel,
-        ColorDetector.InvalidColorHexValue
-    )
-    override val vendor = Vendor(
-        vendorName = "Jetpack Compose",
-        identifier = "androidx.compose.ui.graphics",
-        feedbackUrl = "https://issuetracker.google.com/issues/new?component=612128"
-    )
+    override val issues
+        get() = listOf(ColorDetector.MissingColorAlphaChannel, ColorDetector.InvalidColorHexValue)
+
+    override val vendor =
+        Vendor(
+            vendorName = "Jetpack Compose",
+            identifier = "androidx.compose.ui.graphics",
+            feedbackUrl = "https://issuetracker.google.com/issues/new?component=612128"
+        )
 }
diff --git a/compose/ui/ui-graphics-lint/src/test/java/androidx/compose/ui/graphics/lint/ColorDetectorTest.kt b/compose/ui/ui-graphics-lint/src/test/java/androidx/compose/ui/graphics/lint/ColorDetectorTest.kt
index c12d4b1..22a0e3e 100644
--- a/compose/ui/ui-graphics-lint/src/test/java/androidx/compose/ui/graphics/lint/ColorDetectorTest.kt
+++ b/compose/ui/ui-graphics-lint/src/test/java/androidx/compose/ui/graphics/lint/ColorDetectorTest.kt
@@ -28,24 +28,20 @@
 
 /* ktlint-disable max-line-length */
 
-/**
- * Test for [ColorDetector].
- */
+/** Test for [ColorDetector]. */
 @RunWith(JUnit4::class)
 class ColorDetectorTest : LintDetectorTest() {
     override fun getDetector(): Detector = ColorDetector()
 
     override fun getIssues(): MutableList<Issue> =
-        mutableListOf(
-            ColorDetector.MissingColorAlphaChannel,
-            ColorDetector.InvalidColorHexValue
-        )
+        mutableListOf(ColorDetector.MissingColorAlphaChannel, ColorDetector.InvalidColorHexValue)
 
     @Test
     fun MissingColorAlphaChannel() {
-        lint().files(
-            kotlin(
-                """
+        lint()
+            .files(
+                kotlin(
+                    """
                 package test
 
                 import androidx.compose.ui.graphics.*
@@ -60,9 +56,9 @@
                 // separators and L suffix
                 val color4 = Color(0x00_00_00L)
             """
-            ),
-            Stubs.Color
-        )
+                ),
+                Stubs.Color
+            )
             .run()
             .expect(
                 """
@@ -112,9 +108,10 @@
 
     @Test
     fun incorrectChannels() {
-        lint().files(
-            kotlin(
-                """
+        lint()
+            .files(
+                kotlin(
+                    """
                 package test
 
                 import androidx.compose.ui.graphics.*
@@ -123,9 +120,9 @@
                 val color2 = Color(0xEEEEE)
                 val color3 = Color(0x00_0_0_0L)
             """
-            ),
-            Stubs.Color
-        )
+                ),
+                Stubs.Color
+            )
             .run()
             .expect(
                 """
@@ -147,9 +144,10 @@
 
     @Test
     fun noErrors() {
-        lint().files(
-            kotlin(
-                """
+        lint()
+            .files(
+                kotlin(
+                    """
                 package test
 
                 import kotlin.random.Random
@@ -175,9 +173,9 @@
                 val color13 = Color(0xFFEEEEEE.toLong())
                 val color14 = Color(Random.nextLong())
             """
-            ),
-            Stubs.Color
-        )
+                ),
+                Stubs.Color
+            )
             .run()
             .expectClean()
     }
diff --git a/compose/ui/ui-graphics/benchmark/src/androidTest/java/androidx/compose/ui/graphics/benchmark/ColorBenchmark.kt b/compose/ui/ui-graphics/benchmark/src/androidTest/java/androidx/compose/ui/graphics/benchmark/ColorBenchmark.kt
index 84a8a27..409b486 100644
--- a/compose/ui/ui-graphics/benchmark/src/androidTest/java/androidx/compose/ui/graphics/benchmark/ColorBenchmark.kt
+++ b/compose/ui/ui-graphics/benchmark/src/androidTest/java/androidx/compose/ui/graphics/benchmark/ColorBenchmark.kt
@@ -30,8 +30,7 @@
 @LargeTest
 @RunWith(AndroidJUnit4::class)
 class ColorBenchmark {
-    @get:Rule
-    val benchmarkRule = BenchmarkRule()
+    @get:Rule val benchmarkRule = BenchmarkRule()
 
     @Test
     fun colorLerp() {
diff --git a/compose/ui/ui-graphics/benchmark/src/androidTest/java/androidx/compose/ui/graphics/benchmark/VectorBenchmark.kt b/compose/ui/ui-graphics/benchmark/src/androidTest/java/androidx/compose/ui/graphics/benchmark/VectorBenchmark.kt
index 875a295..8b334b5 100644
--- a/compose/ui/ui-graphics/benchmark/src/androidTest/java/androidx/compose/ui/graphics/benchmark/VectorBenchmark.kt
+++ b/compose/ui/ui-graphics/benchmark/src/androidTest/java/androidx/compose/ui/graphics/benchmark/VectorBenchmark.kt
@@ -34,8 +34,7 @@
 @LargeTest
 @RunWith(AndroidJUnit4::class)
 open class VectorBenchmark {
-    @get:Rule
-    val benchmarkRule = ComposeBenchmarkRule()
+    @get:Rule val benchmarkRule = ComposeBenchmarkRule()
 
     @Test
     fun xml_compose() {
diff --git a/compose/ui/ui-graphics/benchmark/src/main/java/androidx/compose/ui/graphics/benchmark/ImageVectorTestCase.kt b/compose/ui/ui-graphics/benchmark/src/main/java/androidx/compose/ui/graphics/benchmark/ImageVectorTestCase.kt
index f635bf3..3a2d1e1 100644
--- a/compose/ui/ui-graphics/benchmark/src/main/java/androidx/compose/ui/graphics/benchmark/ImageVectorTestCase.kt
+++ b/compose/ui/ui-graphics/benchmark/src/main/java/androidx/compose/ui/graphics/benchmark/ImageVectorTestCase.kt
@@ -44,87 +44,76 @@
 
     @Composable
     override fun MeasuredContent() {
-        Box(
-            Modifier.testTag(testTag)
-                .size(24.dp)
-                .paint(getPainter())
-        )
+        Box(Modifier.testTag(testTag).size(24.dp).paint(getPainter()))
     }
 
     @Composable
     override fun ContentWrappers(content: @Composable () -> Unit) {
-        Box {
-            content()
-        }
+        Box { content() }
     }
 
-    @Composable
-    abstract fun getPainter(): Painter
+    @Composable abstract fun getPainter(): Painter
 
     abstract val testTag: String
 }
 
-/**
- * Test case that loads and parses a vector asset from an XML file.
- */
+/** Test case that loads and parses a vector asset from an XML file. */
 class XmlVectorTestCase : ImageVectorTestCase() {
     // TODO: should switch to async loading here, and force that to be run synchronously
     @Composable
-    override fun getPainter() = painterResource(
-        androidx.compose.ui.graphics.benchmark.R.drawable.ic_baseline_menu_24
-    )
+    override fun getPainter() =
+        painterResource(androidx.compose.ui.graphics.benchmark.R.drawable.ic_baseline_menu_24)
 
     override val testTag = "Xml"
 }
 
-/**
- * Test case that creates a vector asset purely from code.
- */
+/** Test case that creates a vector asset purely from code. */
 class ProgrammaticVectorTestCase : ImageVectorTestCase() {
 
-    /**
-     * Returns a clone of ic_baseline_menu_24 built purely in code
-     */
+    /** Returns a clone of ic_baseline_menu_24 built purely in code */
     @Composable
-    override fun getPainter() = rememberVectorPainter(
-        ImageVector.Builder(
-            defaultWidth = 24.dp,
-            defaultHeight = 24.dp,
-            viewportWidth = 24f,
-            viewportHeight = 24f
-        ).apply {
-            addPath(
-                PathData {
-                    moveTo(3f, 18f)
-                    horizontalLineToRelative(18f)
-                    verticalLineToRelative(-2f)
-                    lineTo(3f, 16f)
-                    verticalLineToRelative(2f)
-                    close()
-                    moveTo(3f, 13f)
-                    horizontalLineToRelative(18f)
-                    verticalLineToRelative(-2f)
-                    lineTo(3f, 11f)
-                    verticalLineToRelative(2f)
-                    close()
-                    moveTo(3f, 6f)
-                    verticalLineToRelative(2f)
-                    horizontalLineToRelative(18f)
-                    lineTo(21f, 6f)
-                    lineTo(3f, 6f)
-                    close()
-                },
-                fill = SolidColor(Color.Black),
-                fillAlpha = 1f,
-                stroke = null,
-                strokeAlpha = 1f,
-                strokeLineWidth = 1f,
-                strokeLineCap = StrokeCap.Butt,
-                strokeLineJoin = StrokeJoin.Bevel,
-                strokeLineMiter = 1f
-            )
-        }.build()
-    )
+    override fun getPainter() =
+        rememberVectorPainter(
+            ImageVector.Builder(
+                    defaultWidth = 24.dp,
+                    defaultHeight = 24.dp,
+                    viewportWidth = 24f,
+                    viewportHeight = 24f
+                )
+                .apply {
+                    addPath(
+                        PathData {
+                            moveTo(3f, 18f)
+                            horizontalLineToRelative(18f)
+                            verticalLineToRelative(-2f)
+                            lineTo(3f, 16f)
+                            verticalLineToRelative(2f)
+                            close()
+                            moveTo(3f, 13f)
+                            horizontalLineToRelative(18f)
+                            verticalLineToRelative(-2f)
+                            lineTo(3f, 11f)
+                            verticalLineToRelative(2f)
+                            close()
+                            moveTo(3f, 6f)
+                            verticalLineToRelative(2f)
+                            horizontalLineToRelative(18f)
+                            lineTo(21f, 6f)
+                            lineTo(3f, 6f)
+                            close()
+                        },
+                        fill = SolidColor(Color.Black),
+                        fillAlpha = 1f,
+                        stroke = null,
+                        strokeAlpha = 1f,
+                        strokeLineWidth = 1f,
+                        strokeLineCap = StrokeCap.Butt,
+                        strokeLineJoin = StrokeJoin.Bevel,
+                        strokeLineMiter = 1f
+                    )
+                }
+                .build()
+        )
 
     override val testTag = "Vector"
 }
diff --git a/compose/ui/ui-graphics/benchmark/test/src/androidTest/java/androidx/compose/ui/graphics/benchmark/test/ImageVectorTest.kt b/compose/ui/ui-graphics/benchmark/test/src/androidTest/java/androidx/compose/ui/graphics/benchmark/test/ImageVectorTest.kt
index d6b4593..71f1639 100644
--- a/compose/ui/ui-graphics/benchmark/test/src/androidTest/java/androidx/compose/ui/graphics/benchmark/test/ImageVectorTest.kt
+++ b/compose/ui/ui-graphics/benchmark/test/src/androidTest/java/androidx/compose/ui/graphics/benchmark/test/ImageVectorTest.kt
@@ -56,8 +56,7 @@
 @SdkSuppress(minSdkVersion = Build.VERSION_CODES.O)
 @RunWith(AndroidJUnit4::class)
 class ImageVectorTest {
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
     @Test
     fun testProgrammaticAndXmlImageVectorsAreTheSame() {
@@ -81,23 +80,21 @@
 
         rule.waitForIdle()
 
-        val programmaticBitmap = rule.onNodeWithTag(programmaticTestCase.testTag).captureToImage()
-            .asAndroidBitmap()
+        val programmaticBitmap =
+            rule.onNodeWithTag(programmaticTestCase.testTag).captureToImage().asAndroidBitmap()
 
         assertEquals(xmlBitmap.width, programmaticBitmap.width)
         assertEquals(xmlBitmap.height, programmaticBitmap.height)
 
-        val xmlPixelArray = with(xmlBitmap) {
-            IntArray(width * height).apply {
-                getPixels(this, 0, width, 0, 0, width, height)
+        val xmlPixelArray =
+            with(xmlBitmap) {
+                IntArray(width * height).apply { getPixels(this, 0, width, 0, 0, width, height) }
             }
-        }
 
-        val programmaticBitmapArray = with(programmaticBitmap) {
-            IntArray(width * height).apply {
-                getPixels(this, 0, width, 0, 0, width, height)
+        val programmaticBitmapArray =
+            with(programmaticBitmap) {
+                IntArray(width * height).apply { getPixels(this, 0, width, 0, 0, width, height) }
             }
-        }
 
         Assert.assertArrayEquals(xmlPixelArray, programmaticBitmapArray)
     }
@@ -110,9 +107,10 @@
                 Box {
                     Image(
                         modifier = Modifier.testTag(testTag),
-                        painter = painterResource(
-                            androidx.compose.ui.graphics.benchmark.R.drawable.ic_auto_mirror
-                        ),
+                        painter =
+                            painterResource(
+                                androidx.compose.ui.graphics.benchmark.R.drawable.ic_auto_mirror
+                            ),
                         contentDescription = null
                     )
                 }
@@ -136,12 +134,11 @@
         val testTag = "testTag"
         var insetRectSize: Int = 0
         rule.setContent {
-            with(LocalDensity.current) {
-                insetRectSize = (10f * this.density).roundToInt()
-            }
-            val imageVector = painterResource(
-                androidx.compose.ui.graphics.benchmark.R.drawable.ic_pathfill_sample
-            )
+            with(LocalDensity.current) { insetRectSize = (10f * this.density).roundToInt() }
+            val imageVector =
+                painterResource(
+                    androidx.compose.ui.graphics.benchmark.R.drawable.ic_pathfill_sample
+                )
             Image(imageVector, null, modifier = Modifier.testTag(testTag))
         }
 
@@ -154,27 +151,14 @@
             assertEquals(Color.Blue.toArgb(), getPixel(width / 2, height / 2))
 
             assertEquals(Color.Red.toArgb(), getPixel(insetRectSize + 2, insetRectSize + 2))
+            assertEquals(Color.Red.toArgb(), getPixel(width - insetRectSize - 2, insetRectSize + 2))
             assertEquals(
                 Color.Red.toArgb(),
-                getPixel(
-                    width - insetRectSize - 2,
-                    insetRectSize + 2
-                )
+                getPixel(insetRectSize + 2, height - insetRectSize - 2)
             )
             assertEquals(
                 Color.Red.toArgb(),
-                getPixel(
-                    insetRectSize + 2,
-                    height - insetRectSize - 2
-                )
-            )
-            assertEquals(
-                Color.Red.toArgb(),
-                getPixel(
-                    width - insetRectSize - 2,
-                    height -
-                        insetRectSize - 2
-                )
+                getPixel(width - insetRectSize - 2, height - insetRectSize - 2)
             )
         }
     }
diff --git a/compose/ui/ui-graphics/samples/src/main/java/androidx/compose/ui/graphics/samples/BrushSamples.kt b/compose/ui/ui-graphics/samples/src/main/java/androidx/compose/ui/graphics/samples/BrushSamples.kt
index 45fd18c..8d048cc 100644
--- a/compose/ui/ui-graphics/samples/src/main/java/androidx/compose/ui/graphics/samples/BrushSamples.kt
+++ b/compose/ui/ui-graphics/samples/src/main/java/androidx/compose/ui/graphics/samples/BrushSamples.kt
@@ -113,11 +113,7 @@
 
 @Sampled
 fun VerticalGradientSample() {
-    Brush.verticalGradient(
-        listOf(Color.Red, Color.Green, Color.Blue),
-        startY = 0.0f,
-        endY = 100.0f
-    )
+    Brush.verticalGradient(listOf(Color.Red, Color.Green, Color.Blue), startY = 0.0f, endY = 100.0f)
 }
 
 @Sampled
@@ -158,8 +154,5 @@
 
 @Sampled
 fun SweepGradientSample() {
-    Brush.sweepGradient(
-        listOf(Color.Red, Color.Green, Color.Blue),
-        center = Offset(10.0f, 20.0f)
-    )
+    Brush.sweepGradient(listOf(Color.Red, Color.Green, Color.Blue), center = Offset(10.0f, 20.0f))
 }
diff --git a/compose/ui/ui-graphics/samples/src/main/java/androidx/compose/ui/graphics/samples/DrawScopeSample.kt b/compose/ui/ui-graphics/samples/src/main/java/androidx/compose/ui/graphics/samples/DrawScopeSample.kt
index 753f176..f896453 100644
--- a/compose/ui/ui-graphics/samples/src/main/java/androidx/compose/ui/graphics/samples/DrawScopeSample.kt
+++ b/compose/ui/ui-graphics/samples/src/main/java/androidx/compose/ui/graphics/samples/DrawScopeSample.kt
@@ -36,8 +36,8 @@
 import androidx.compose.ui.unit.dp
 
 /**
- * Sample showing how to use CanvasScope to issue drawing commands into
- * a given canvas as well as providing transformations to the drawing environment
+ * Sample showing how to use CanvasScope to issue drawing commands into a given canvas as well as
+ * providing transformations to the drawing environment
  */
 @Sampled
 @Composable
@@ -52,14 +52,9 @@
             val quadrantSize = size / 2.0f
 
             // Draw a rectangle within the inset bounds
-            drawRect(
-                size = quadrantSize,
-                color = Color.Red
-            )
+            drawRect(size = quadrantSize, color = Color.Red)
 
-            rotate(45.0f) {
-                drawRect(size = quadrantSize, color = Color.Blue)
-            }
+            rotate(45.0f) { drawRect(size = quadrantSize, color = Color.Blue) }
         }
     }
 }
@@ -114,26 +109,29 @@
 @Sampled
 @Composable
 fun DrawScopeRetargetingSample() {
-    Box(modifier = Modifier.size(120.dp)
-        .drawWithCache {
-            // Example that shows how to redirect rendering to an Android Picture and then
-            // draw the picture into the original destination
-            // Note:
-            // Canvas#drawPicture is supported with hardware acceleration on Android API 23+
-            // Check https://developer.android.com/topic/performance/hardware-accel#drawing-support
-            // for details of which drawing operations are supported with hardware acceleration
-            val picture = android.graphics.Picture()
-            val width = this.size.width.toInt()
-            val height = this.size.height.toInt()
-            onDrawWithContent {
-                val pictureCanvas =
-                    androidx.compose.ui.graphics.Canvas(picture.beginRecording(width, height))
-                draw(this, this.layoutDirection, pictureCanvas, this.size) {
-                    this@onDrawWithContent.drawContent()
-                }
-                picture.endRecording()
+    Box(
+        modifier =
+            Modifier.size(120.dp).drawWithCache {
+                // Example that shows how to redirect rendering to an Android Picture and then
+                // draw the picture into the original destination
+                // Note:
+                // Canvas#drawPicture is supported with hardware acceleration on Android API 23+
+                // Check
+                // https://developer.android.com/topic/performance/hardware-accel#drawing-support
+                // for details of which drawing operations are supported with hardware acceleration
+                val picture = android.graphics.Picture()
+                val width = this.size.width.toInt()
+                val height = this.size.height.toInt()
+                onDrawWithContent {
+                    val pictureCanvas =
+                        androidx.compose.ui.graphics.Canvas(picture.beginRecording(width, height))
+                    draw(this, this.layoutDirection, pictureCanvas, this.size) {
+                        this@onDrawWithContent.drawContent()
+                    }
+                    picture.endRecording()
 
-                drawIntoCanvas { canvas -> canvas.nativeCanvas.drawPicture(picture) }
+                    drawIntoCanvas { canvas -> canvas.nativeCanvas.drawPicture(picture) }
+                }
             }
-        })
+    )
 }
diff --git a/compose/ui/ui-graphics/samples/src/main/java/androidx/compose/ui/graphics/samples/GraphicsLayerSamples.kt b/compose/ui/ui-graphics/samples/src/main/java/androidx/compose/ui/graphics/samples/GraphicsLayerSamples.kt
index 800b9ab..8fe056f 100644
--- a/compose/ui/ui-graphics/samples/src/main/java/androidx/compose/ui/graphics/samples/GraphicsLayerSamples.kt
+++ b/compose/ui/ui-graphics/samples/src/main/java/androidx/compose/ui/graphics/samples/GraphicsLayerSamples.kt
@@ -49,9 +49,7 @@
     // and position the top left to be 20 pixels from the left and 30 pixels from the top.
     // This will the bounds of the layer with a red rectangle
     layer.apply {
-        record {
-            drawRect(Color.Red)
-        }
+        record { drawRect(Color.Red) }
         this.topLeft = IntOffset(20, 30)
     }
 
@@ -63,9 +61,7 @@
 fun DrawScope.GraphicsLayerSizeSample(layer: GraphicsLayer) {
     // Build the layer with the density, layout direction from the DrawScope that is
     // sized to 200 x 100 pixels and draw a red rectangle that occupies these bounds
-    layer.record(size = IntSize(200, 100)) {
-        drawRect(Color.Red)
-    }
+    layer.record(size = IntSize(200, 100)) { drawRect(Color.Red) }
 
     // Draw the layer into the provided DrawScope
     drawLayer(layer)
@@ -77,19 +73,13 @@
     // corner.
     layer.apply {
         record(size = IntSize(200, 200)) {
-            drawRect(
-                Color.Red,
-                topLeft = Offset(size.width / 2f, size.height / 2f)
-            )
+            drawRect(Color.Red, topLeft = Offset(size.width / 2f, size.height / 2f))
         }
         // Scale the layer by 1.5x in both the x and y axis relative to the bottom
         // right corner
         scaleX = 1.5f
         scaleY = 1.5f
-        pivotOffset = Offset(
-            this.size.width.toFloat(),
-            this.size.height.toFloat()
-        )
+        pivotOffset = Offset(this.size.width.toFloat(), this.size.height.toFloat())
     }
 
     // Draw the layer into the provided DrawScope
@@ -100,9 +90,7 @@
 fun DrawScope.GraphicsLayerTranslateSample(layer: GraphicsLayer) {
     // Create a 200 x 200 pixel layer that draws a red square
     layer.apply {
-        record(size = IntSize(200, 200)) {
-            drawRect(Color.Red)
-        }
+        record(size = IntSize(200, 200)) { drawRect(Color.Red) }
         // Configuring the translationX + Y will translate the red square
         // by 100 pixels to the right and 50 pixels from the top when drawn
         // into the destination DrawScope
@@ -118,9 +106,7 @@
 fun DrawScope.GraphicsLayerShadowSample(layer: GraphicsLayer) {
     // Create a 200 x 200 pixel layer that draws a red square
     layer.apply {
-        record(size = IntSize(200, 200)) {
-            drawRect(Color.Red)
-        }
+        record(size = IntSize(200, 200)) { drawRect(Color.Red) }
         // Apply a shadow with specified colors that has an elevation of 20f when this layer is
         // drawn into the destination DrawScope.
         shadowElevation = 20f
@@ -135,21 +121,13 @@
 @Sampled
 fun DrawScope.GraphicsLayerBlendModeSample(layer: GraphicsLayer) {
     val drawScopeSize = size
-    val topLeft = IntOffset(
-        (drawScopeSize.width / 4).toInt(),
-        (drawScopeSize.height / 4).toInt()
-    )
-    val layerSize = IntSize(
-        (drawScopeSize.width / 2).toInt(),
-        (drawScopeSize.height / 2).toInt()
-    )
+    val topLeft = IntOffset((drawScopeSize.width / 4).toInt(), (drawScopeSize.height / 4).toInt())
+    val layerSize = IntSize((drawScopeSize.width / 2).toInt(), (drawScopeSize.height / 2).toInt())
 
     // Build the GraphicsLayer with the specified offset and size that is filled
     // with a red rectangle.
     layer.apply {
-        record(size = layerSize) {
-            drawRect(Color.Red)
-        }
+        record(size = layerSize) { drawRect(Color.Red) }
         this.topLeft = topLeft
         // Specify the Xor blend mode here so that layer contents will be shown in the
         // destination only if it is transparent, otherwise the destination would be cleared
@@ -176,9 +154,7 @@
     // Create a layer with the same configuration as the destination DrawScope
     // and draw a red rectangle in the layer
     layer.apply {
-        record {
-            drawRect(Color.Red)
-        }
+        record { drawRect(Color.Red) }
         // Apply a ColorFilter that will tint the contents of the layer to blue
         // when it is drawn into the destination DrawScope
         colorFilter = ColorFilter.tint(Color.Blue)
@@ -193,11 +169,7 @@
     // Create a layer sized to the destination draw scope that is comprised
     // of an inset red rectangle
     layer.apply {
-        record {
-            inset(20f, 20f) {
-                drawRect(Color.Red)
-            }
-        }
+        record { inset(20f, 20f) { drawRect(Color.Red) } }
         // Configure a blur to the contents of the layer that is applied
         // when drawn to the destination DrawScope
         renderEffect = BlurEffect(20f, 20f, TileMode.Decal)
@@ -211,11 +183,7 @@
     // Create a layer sized to the destination draw scope that is comprised
     // of an inset red rectangle
     layer.apply {
-        record {
-            inset(20f, 20f) {
-                drawRect(Color.Red)
-            }
-        }
+        record { inset(20f, 20f) { drawRect(Color.Red) } }
         // Renders the content of the layer with 50% alpha when it is drawn
         // into the destination
         alpha = 0.5f
@@ -229,9 +197,7 @@
     // Create a layer sized to the destination draw scope that is comprised
     // of an inset red rectangle
     layer.apply {
-        record {
-            drawRect(Color.Red)
-        }
+        record { drawRect(Color.Red) }
         // Apply a shadow that is clipped to the specified round rect
         shadowElevation = 20f
         setRoundRectOutline(Offset.Zero, Size(300f, 180f), 30f)
@@ -245,9 +211,7 @@
     // Create a layer sized to the destination draw scope that is comprised
     // of an inset red rectangle
     layer.apply {
-        record {
-            drawRect(Color.Red)
-        }
+        record { drawRect(Color.Red) }
         // Apply a shadow and have the contents of the layer be clipped
         // to the size of the layer with a 20 pixel corner radius
         shadowElevation = 20f
@@ -262,9 +226,7 @@
     // Create a layer sized to the destination draw scope that is comprised
     // of an inset red rectangle
     layer.apply {
-        record {
-            drawRect(Color.Red)
-        }
+        record { drawRect(Color.Red) }
         // Apply a shadow and have the contents of the layer be clipped
         // to the size of the layer with a 20 pixel corner radius
         shadowElevation = 20f
@@ -277,9 +239,7 @@
 @Sampled
 fun DrawScope.GraphicsLayerRotationX(layer: GraphicsLayer) {
     layer.apply {
-        record {
-            drawRect(Color.Yellow)
-        }
+        record { drawRect(Color.Yellow) }
         // Rotates the yellow rect 45f clockwise relative to the x axis
         rotationX = 45f
     }
@@ -290,9 +250,7 @@
 @Sampled
 fun DrawScope.GraphicsLayerRotationYWithCameraDistance(layer: GraphicsLayer) {
     layer.apply {
-        record {
-            drawRect(Color.Yellow)
-        }
+        record { drawRect(Color.Yellow) }
         // Rotates the yellow rect 45f clockwise relative to the y axis
         rotationY = 45f
         cameraDistance = 5.0f
diff --git a/compose/ui/ui-graphics/samples/src/main/java/androidx/compose/ui/graphics/samples/ImageBitmapSample.kt b/compose/ui/ui-graphics/samples/src/main/java/androidx/compose/ui/graphics/samples/ImageBitmapSample.kt
index a5bd091..a1dfc93 100644
--- a/compose/ui/ui-graphics/samples/src/main/java/androidx/compose/ui/graphics/samples/ImageBitmapSample.kt
+++ b/compose/ui/ui-graphics/samples/src/main/java/androidx/compose/ui/graphics/samples/ImageBitmapSample.kt
@@ -26,8 +26,8 @@
 import androidx.compose.ui.graphics.toPixelMap
 
 /**
- * Sample showing how to obtain a [PixelMap] to query pixel information
- * from an underlying [ImageBitmap]
+ * Sample showing how to obtain a [PixelMap] to query pixel information from an underlying
+ * [ImageBitmap]
  */
 @Sampled
 fun ImageBitmapToPixelMapSample() {
@@ -35,12 +35,7 @@
 
     // Sample a 3 by 2 subsection of the given ImageBitmap
     // starting at the coordinate (48, 49)
-    val pixelmap = imageBitmap.toPixelMap(
-        startX = 48,
-        startY = 49,
-        width = 3,
-        height = 2
-    )
+    val pixelmap = imageBitmap.toPixelMap(startX = 48, startY = 49, width = 3, height = 2)
 
     // create a histogram to count the number of occurrences of a color within the specified
     // subsection of the provided ImageBitmap
@@ -55,30 +50,17 @@
 }
 
 /**
- * [ImageBitmap.readPixels] sample that shows how to create a consumer defined
- * IntArray to store pixel information and create a PixelMap for querying information
- * within the buffer
+ * [ImageBitmap.readPixels] sample that shows how to create a consumer defined IntArray to store
+ * pixel information and create a PixelMap for querying information within the buffer
  */
 @Sampled
 fun ImageBitmapReadPixelsSample() {
     val imageBitmap = createImageBitmap()
 
     val buffer = IntArray(20 * 10)
-    imageBitmap.readPixels(
-        buffer = buffer,
-        startX = 8,
-        startY = 9,
-        width = 20,
-        height = 10
-    )
+    imageBitmap.readPixels(buffer = buffer, startX = 8, startY = 9, width = 20, height = 10)
 
-    val pixelmap = PixelMap(
-        buffer = buffer,
-        width = 20,
-        height = 10,
-        stride = 20,
-        bufferOffset = 0
-    )
+    val pixelmap = PixelMap(buffer = buffer, width = 20, height = 10, stride = 20, bufferOffset = 0)
 
     // create a histogram to count the number of occurrences of a color within the specified
     // subsection of the provided ImageBitmap
diff --git a/compose/ui/ui-graphics/samples/src/main/java/androidx/compose/ui/graphics/samples/PathEffectSample.kt b/compose/ui/ui-graphics/samples/src/main/java/androidx/compose/ui/graphics/samples/PathEffectSample.kt
index 4d96fc6..f065614 100644
--- a/compose/ui/ui-graphics/samples/src/main/java/androidx/compose/ui/graphics/samples/PathEffectSample.kt
+++ b/compose/ui/ui-graphics/samples/src/main/java/androidx/compose/ui/graphics/samples/PathEffectSample.kt
@@ -37,12 +37,13 @@
 @Composable
 fun StampedPathEffectSample() {
     val size = 20f
-    val square = Path().apply {
-        lineTo(size, 0f)
-        lineTo(size, size)
-        lineTo(0f, size)
-        close()
-    }
+    val square =
+        Path().apply {
+            lineTo(size, 0f)
+            lineTo(size, size)
+            lineTo(0f, size)
+            close()
+        }
     Column(modifier = Modifier.fillMaxHeight().wrapContentSize(Alignment.Center)) {
         val canvasModifier = Modifier.requiredSize(80.dp).align(Alignment.CenterHorizontally)
 
@@ -53,14 +54,16 @@
             drawCircle(color = Color.Blue)
             drawCircle(
                 color = Color.Red,
-                style = Stroke(
-                    pathEffect = PathEffect.stampedPathEffect(
-                        shape = square,
-                        style = StampedPathEffectStyle.Morph,
-                        phase = 0f,
-                        advance = 30f
+                style =
+                    Stroke(
+                        pathEffect =
+                            PathEffect.stampedPathEffect(
+                                shape = square,
+                                style = StampedPathEffectStyle.Morph,
+                                phase = 0f,
+                                advance = 30f
+                            )
                     )
-                )
             )
         }
 
@@ -73,14 +76,16 @@
             drawCircle(color = Color.Blue)
             drawCircle(
                 color = Color.Red,
-                style = Stroke(
-                    pathEffect = PathEffect.stampedPathEffect(
-                        shape = square,
-                        style = StampedPathEffectStyle.Rotate,
-                        phase = 0f,
-                        advance = 30f
+                style =
+                    Stroke(
+                        pathEffect =
+                            PathEffect.stampedPathEffect(
+                                shape = square,
+                                style = StampedPathEffectStyle.Rotate,
+                                phase = 0f,
+                                advance = 30f
+                            )
                     )
-                )
             )
         }
 
@@ -92,14 +97,16 @@
             drawCircle(color = Color.Blue)
             drawCircle(
                 color = Color.Red,
-                style = Stroke(
-                    pathEffect = PathEffect.stampedPathEffect(
-                        shape = square,
-                        style = StampedPathEffectStyle.Translate,
-                        phase = 0f,
-                        advance = 30f
+                style =
+                    Stroke(
+                        pathEffect =
+                            PathEffect.stampedPathEffect(
+                                shape = square,
+                                style = StampedPathEffectStyle.Translate,
+                                phase = 0f,
+                                advance = 30f
+                            )
                     )
-                )
             )
         }
     }
diff --git a/compose/ui/ui-graphics/src/androidInstrumentedTest/kotlin/androidx/compose/ui/graphics/AndroidBlendModeTest.kt b/compose/ui/ui-graphics/src/androidInstrumentedTest/kotlin/androidx/compose/ui/graphics/AndroidBlendModeTest.kt
index 2da770d..089968c 100644
--- a/compose/ui/ui-graphics/src/androidInstrumentedTest/kotlin/androidx/compose/ui/graphics/AndroidBlendModeTest.kt
+++ b/compose/ui/ui-graphics/src/androidInstrumentedTest/kotlin/androidx/compose/ui/graphics/AndroidBlendModeTest.kt
@@ -435,26 +435,27 @@
     @Test
     @SdkSuppress(maxSdkVersion = Build.VERSION_CODES.P)
     fun testBlendModeToPorterDuffCompatibility() {
-        val supportedBlendModes = setOf(
-            BlendMode.Clear,
-            BlendMode.Src,
-            BlendMode.Dst,
-            BlendMode.SrcOver,
-            BlendMode.DstOver,
-            BlendMode.SrcIn,
-            BlendMode.DstIn,
-            BlendMode.SrcOut,
-            BlendMode.DstOut,
-            BlendMode.SrcAtop,
-            BlendMode.DstAtop,
-            BlendMode.Xor,
-            BlendMode.Plus,
-            BlendMode.Screen,
-            BlendMode.Overlay,
-            BlendMode.Darken,
-            BlendMode.Lighten,
-            BlendMode.Modulate
-        )
+        val supportedBlendModes =
+            setOf(
+                BlendMode.Clear,
+                BlendMode.Src,
+                BlendMode.Dst,
+                BlendMode.SrcOver,
+                BlendMode.DstOver,
+                BlendMode.SrcIn,
+                BlendMode.DstIn,
+                BlendMode.SrcOut,
+                BlendMode.DstOut,
+                BlendMode.SrcAtop,
+                BlendMode.DstAtop,
+                BlendMode.Xor,
+                BlendMode.Plus,
+                BlendMode.Screen,
+                BlendMode.Overlay,
+                BlendMode.Darken,
+                BlendMode.Lighten,
+                BlendMode.Modulate
+            )
         val blendModes = BlendMode.values()
         for (blendMode in blendModes) {
             if (supportedBlendModes.contains(blendMode)) {
diff --git a/compose/ui/ui-graphics/src/androidInstrumentedTest/kotlin/androidx/compose/ui/graphics/AndroidCanvasTest.kt b/compose/ui/ui-graphics/src/androidInstrumentedTest/kotlin/androidx/compose/ui/graphics/AndroidCanvasTest.kt
index b123f45..0a8459c 100644
--- a/compose/ui/ui-graphics/src/androidInstrumentedTest/kotlin/androidx/compose/ui/graphics/AndroidCanvasTest.kt
+++ b/compose/ui/ui-graphics/src/androidInstrumentedTest/kotlin/androidx/compose/ui/graphics/AndroidCanvasTest.kt
@@ -50,9 +50,8 @@
 class AndroidCanvasTest {
     @Suppress("DEPRECATION")
     @get:Rule
-    val activityTestRule = androidx.test.rule.ActivityTestRule<TestActivity>(
-        TestActivity::class.java
-    )
+    val activityTestRule =
+        androidx.test.rule.ActivityTestRule<TestActivity>(TestActivity::class.java)
 
     @SdkSuppress(minSdkVersion = Build.VERSION_CODES.O)
     @Test
@@ -80,7 +79,7 @@
         assertTrue(drawLatch.await(1, TimeUnit.SECONDS))
         // Not sure why this test is flaky, so this is just going to make sure that
         // the drawn content can get onto the screen before we capture the bitmap.
-        activityTestRule.runOnUiThread { }
+        activityTestRule.runOnUiThread {}
         val bitmap = groupView!!.captureToImage().asAndroidBitmap()
         assertEquals(android.graphics.Color.WHITE, bitmap.getPixel(0, 0))
         assertEquals(android.graphics.Color.WHITE, bitmap.getPixel(9, 9))
@@ -218,10 +217,7 @@
             withSave {
                 rotate(180.0f, 100.0f, 100.0f)
                 paint.color = fg
-                drawRect(
-                    Rect(100.0f, 100.0f, 200.0f, 200.0f),
-                    paint
-                )
+                drawRect(Rect(100.0f, 100.0f, 200.0f, 200.0f), paint)
             }
         }
 
@@ -253,10 +249,7 @@
             withSave {
                 rotate(-45.0f)
                 paint.color = fg
-                drawRect(
-                    Rect(0.0f, 0.0f, 100.0f, 100.0f),
-                    paint
-                )
+                drawRect(Rect(0.0f, 0.0f, 100.0f, 100.0f), paint)
             }
         }
 
@@ -623,7 +616,9 @@
                 android.graphics.Paint.FILTER_BITMAP_FLAG
         )
 
-    class EnableDisableZViewGroup @JvmOverloads constructor(
+    class EnableDisableZViewGroup
+    @JvmOverloads
+    constructor(
         val drawLatch: CountDownLatch,
         context: Context,
         attrs: AttributeSet? = null,
diff --git a/compose/ui/ui-graphics/src/androidInstrumentedTest/kotlin/androidx/compose/ui/graphics/AndroidColorFilterTest.kt b/compose/ui/ui-graphics/src/androidInstrumentedTest/kotlin/androidx/compose/ui/graphics/AndroidColorFilterTest.kt
index 4e57f96..49f87ad 100644
--- a/compose/ui/ui-graphics/src/androidInstrumentedTest/kotlin/androidx/compose/ui/graphics/AndroidColorFilterTest.kt
+++ b/compose/ui/ui-graphics/src/androidInstrumentedTest/kotlin/androidx/compose/ui/graphics/AndroidColorFilterTest.kt
@@ -63,10 +63,11 @@
     @SdkSuppress(minSdkVersion = Build.VERSION_CODES.Q)
     @Test
     fun testAndroidBlendModeColorFilterToCompose() {
-        val androidFilter = AndroidBlendModeColorFilter(
-            android.graphics.Color.RED,
-            android.graphics.BlendMode.COLOR_DODGE
-        )
+        val androidFilter =
+            AndroidBlendModeColorFilter(
+                android.graphics.Color.RED,
+                android.graphics.BlendMode.COLOR_DODGE
+            )
 
         val composeFilter = androidFilter.asComposeColorFilter()
         assertTrue(composeFilter is BlendModeColorFilter)
@@ -85,10 +86,8 @@
     @SdkSuppress(minSdkVersion = Build.VERSION_CODES.O)
     @Test
     fun testAndroidLightingColorFilterToCompose() {
-        val androidFilter = AndroidLightingColorFilter(
-            android.graphics.Color.RED,
-            android.graphics.Color.BLUE
-        )
+        val androidFilter =
+            AndroidLightingColorFilter(android.graphics.Color.RED, android.graphics.Color.BLUE)
 
         val composeFilter = androidFilter.asComposeColorFilter()
         assertTrue(composeFilter is LightingColorFilter)
@@ -129,9 +128,8 @@
     @SdkSuppress(minSdkVersion = Build.VERSION_CODES.O)
     @Test
     fun testAndroidColorMatrixColorFilterAsComposeColorFilterEquals() {
-        val androidColorMatrixFilter = android.graphics.ColorMatrixColorFilter(
-            FloatArray(20) { i -> i.toFloat() }
-        )
+        val androidColorMatrixFilter =
+            android.graphics.ColorMatrixColorFilter(FloatArray(20) { i -> i.toFloat() })
         assertEquals(
             ColorMatrixColorFilter(ColorMatrix(FloatArray(20) { i -> i.toFloat() })),
             androidColorMatrixFilter.asComposeColorFilter()
@@ -141,10 +139,8 @@
     @SdkSuppress(maxSdkVersion = Build.VERSION_CODES.N_MR1)
     @Test
     fun testAndroidLightingColorFilterToComposeFallback() {
-        val androidFilter = AndroidLightingColorFilter(
-            android.graphics.Color.RED,
-            android.graphics.Color.BLUE
-        )
+        val androidFilter =
+            AndroidLightingColorFilter(android.graphics.Color.RED, android.graphics.Color.BLUE)
 
         val composeFilter = androidFilter.asComposeColorFilter()
         // Returns an opaque ColorFilter instance as LightingColorFilter parameters
@@ -155,10 +151,8 @@
     @SdkSuppress(maxSdkVersion = Build.VERSION_CODES.Q)
     @Test
     fun testAndroidBlendModeColorFilterToComposeFallback() {
-        val androidFilter = AndroidPorterDuffColorFilter(
-            android.graphics.Color.RED,
-            PorterDuff.Mode.XOR
-        )
+        val androidFilter =
+            AndroidPorterDuffColorFilter(android.graphics.Color.RED, PorterDuff.Mode.XOR)
 
         val composeFilter = androidFilter.asComposeColorFilter()
         // Returns an opaque ColorFilter instance as PorterDuffColorFilter is not
@@ -169,9 +163,7 @@
     @SdkSuppress(maxSdkVersion = Build.VERSION_CODES.N_MR1)
     @Test
     fun testAndroidColorMatrixColorFilterToComposeFallback() {
-        val androidFilter = AndroidColorMatrixColorFilter(
-            FloatArray(20) { i -> i.toFloat() }
-        )
+        val androidFilter = AndroidColorMatrixColorFilter(FloatArray(20) { i -> i.toFloat() })
 
         val composeFilter = androidFilter.asComposeColorFilter()
         // Returns an opaque ColorFilter instance as ColorMatrixColorFilter is not
diff --git a/compose/ui/ui-graphics/src/androidInstrumentedTest/kotlin/androidx/compose/ui/graphics/AndroidColorSpaceTest.kt b/compose/ui/ui-graphics/src/androidInstrumentedTest/kotlin/androidx/compose/ui/graphics/AndroidColorSpaceTest.kt
index 40802bc..f0d9020 100644
--- a/compose/ui/ui-graphics/src/androidInstrumentedTest/kotlin/androidx/compose/ui/graphics/AndroidColorSpaceTest.kt
+++ b/compose/ui/ui-graphics/src/androidInstrumentedTest/kotlin/androidx/compose/ui/graphics/AndroidColorSpaceTest.kt
@@ -184,15 +184,16 @@
     fun testUnknownColorspace3WhitePointValues() {
         val name = "MyCustomColorSpace"
         val whitePoint = floatArrayOf(1.0f, 2.0f, 3.0f)
-        val transferParameters = ColorSpace.Rgb.TransferParameters(
-            0.1, // a
-            0.2, // b
-            0.3, // c
-            0.4, // d
-            0.5, // e
-            0.6, // f
-            0.7 // g
-        )
+        val transferParameters =
+            ColorSpace.Rgb.TransferParameters(
+                0.1, // a
+                0.2, // b
+                0.3, // c
+                0.4, // d
+                0.5, // e
+                0.6, // f
+                0.7 // g
+            )
         val primaries = floatArrayOf(1f, 2f, 3f, 4f, 5f, 6f)
         colorSpaceTestHelper(
             androidx.compose.ui.graphics.colorspace.Rgb(
@@ -201,12 +202,7 @@
                 WhitePoint(1.0f, 2.0f, 3.0f),
                 TransferParameters(0.7, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6)
             ),
-            ColorSpace.Rgb(
-                name,
-                primaries,
-                whitePoint,
-                transferParameters
-            )
+            ColorSpace.Rgb(name, primaries, whitePoint, transferParameters)
         )
     }
 
@@ -243,15 +239,16 @@
     fun testUnknownColorspace2WhitePointValues() {
         val name = "MyCustomColorSpace"
         val whitePoint = floatArrayOf(1.0f, 2.0f)
-        val transferParameters = ColorSpace.Rgb.TransferParameters(
-            0.1, // a
-            0.2, // b
-            0.3, // c
-            0.4, // d
-            0.5, // e
-            0.6, // f
-            0.7 // g
-        )
+        val transferParameters =
+            ColorSpace.Rgb.TransferParameters(
+                0.1, // a
+                0.2, // b
+                0.3, // c
+                0.4, // d
+                0.5, // e
+                0.6, // f
+                0.7 // g
+            )
         val primaries = floatArrayOf(1f, 2f, 3f, 4f, 5f, 6f)
 
         colorSpaceTestHelper(
@@ -261,12 +258,7 @@
                 WhitePoint(1.0f, 2.0f),
                 TransferParameters(0.7, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6)
             ),
-            ColorSpace.Rgb(
-                name,
-                primaries,
-                whitePoint,
-                transferParameters
-            )
+            ColorSpace.Rgb(name, primaries, whitePoint, transferParameters)
         )
     }
 
diff --git a/compose/ui/ui-graphics/src/androidInstrumentedTest/kotlin/androidx/compose/ui/graphics/ColorTest.kt b/compose/ui/ui-graphics/src/androidInstrumentedTest/kotlin/androidx/compose/ui/graphics/ColorTest.kt
index 9217737..61c2dec 100644
--- a/compose/ui/ui-graphics/src/androidInstrumentedTest/kotlin/androidx/compose/ui/graphics/ColorTest.kt
+++ b/compose/ui/ui-graphics/src/androidInstrumentedTest/kotlin/androidx/compose/ui/graphics/ColorTest.kt
@@ -31,10 +31,8 @@
 class ColorTest {
     private val adobeColorSpace = ColorSpaces.AdobeRgb
     private val srgbColor = Color(0xFFFF8000)
-    private val adobeColor = Color(
-        red = 0.8916f, green = 0.4980f, blue = 0.1168f,
-        colorSpace = ColorSpaces.AdobeRgb
-    )
+    private val adobeColor =
+        Color(red = 0.8916f, green = 0.4980f, blue = 0.1168f, colorSpace = ColorSpaces.AdobeRgb)
     private val epsilon = 0.0005f // Float16 squished into ColorLong isn't very accurate.
 
     @Test
@@ -113,25 +111,19 @@
         for (i in 0..255) {
             val t = i / 255f
             val color = lerp(red, green, t)
-            val expectedOklab = Color(
-                red = lerp(redOklab.red, greenOklab.red, t),
-                green = lerp(
-                    redOklab.green,
-                    greenOklab.green,
-                    t
-                ),
-                blue = lerp(
-                    redOklab.blue,
-                    greenOklab.blue,
-                    t
-                ),
-                colorSpace = ColorSpaces.Oklab
-            )
+            val expectedOklab =
+                Color(
+                    red = lerp(redOklab.red, greenOklab.red, t),
+                    green = lerp(redOklab.green, greenOklab.green, t),
+                    blue = lerp(redOklab.blue, greenOklab.blue, t),
+                    colorSpace = ColorSpaces.Oklab
+                )
             val expected = expectedOklab.convert(ColorSpaces.Srgb)
             val colorARGB = Color(color.toArgb())
             val expectedARGB = Color(expected.toArgb())
             assertEquals(
-                expectedARGB, colorARGB,
+                expectedARGB,
+                colorARGB,
                 "at t = $t[$i] was ${colorARGB.toArgb().toHexString()}, " +
                     "expecting ${expectedARGB.toArgb().toHexString()}"
             )
@@ -141,17 +133,12 @@
         for (i in 0..255) {
             val t = i / 255f
             val color = lerp(red, transparentRed, t)
-            val expected = Color.Red.copy(
-                alpha = lerp(
-                    1f,
-                    0f,
-                    t
-                )
-            )
+            val expected = Color.Red.copy(alpha = lerp(1f, 0f, t))
             val colorARGB = Color(color.toArgb())
             val expectedARGB = Color(expected.toArgb())
             assertEquals(
-                expectedARGB, colorARGB,
+                expectedARGB,
+                colorARGB,
                 "at t = $t[$i] was ${colorARGB.toArgb().toHexString()}, " +
                     "expecting ${expectedARGB.toArgb().toHexString()}",
             )
@@ -389,166 +376,1028 @@
     // hasn't changed any of the calculations.
     @Test
     fun lerpValues() {
-        val expected = longArrayOf(
-            0xffff0000, 0xffff0102, 0xfffe0203, 0xfffe0305, 0xfffe0507, 0xfffe0609, 0xfffe070a,
-            0xfffd080c, 0xfffd090d, 0xfffd0b0f, 0xfffd0b10, 0xfffc0d11, 0xfffc0e13, 0xfffc0e13,
-            0xfffc1015, 0xfffc1116, 0xfffb1117, 0xfffb1218, 0xfffb1319, 0xfffb1319, 0xfffa141a,
-            0xfffa151b, 0xfffa151c, 0xfffa161d, 0xfff9171d, 0xfff9181e, 0xfff9181f, 0xfff91920,
-            0xfff91920, 0xfff81a21, 0xfff81a22, 0xfff81b22, 0xfff81b23, 0xfff71c24, 0xfff71d24,
-            0xfff71d25, 0xfff71d26, 0xfff71e26, 0xfff61e27, 0xfff61f27, 0xfff61f28, 0xfff62028,
-            0xfff52029, 0xfff5212a, 0xfff5212a, 0xfff5222b, 0xfff4222b, 0xfff4222c, 0xfff4232c,
-            0xfff4232d, 0xfff4232d, 0xfff3242e, 0xfff3242e, 0xfff3252f, 0xfff3252f, 0xfff22530,
-            0xfff22630, 0xfff22631, 0xfff22631, 0xfff22732, 0xfff12732, 0xfff12833, 0xfff12833,
-            0xfff12833, 0xfff02934, 0xfff02935, 0xfff02935, 0xfff02935, 0xffef2a36, 0xffef2a36,
-            0xffef2b37, 0xffef2b37, 0xffef2b37, 0xffee2b38, 0xffee2c38, 0xffee2c39, 0xffee2c39,
-            0xffed2c3a, 0xffed2d3a, 0xffed2d3a, 0xffed2d3b, 0xffed2e3b, 0xffec2e3b, 0xffec2e3c,
-            0xffec2f3c, 0xffec2f3d, 0xffeb2f3d, 0xffeb2f3e, 0xffeb2f3e, 0xffeb303e, 0xffea303f,
-            0xffea303f, 0xffea313f, 0xffea3140, 0xffea3140, 0xffe93141, 0xffe93141, 0xffe93241,
-            0xffe93242, 0xffe83242, 0xffe83342, 0xffe83343, 0xffe83343, 0xffe73343, 0xffe73344,
-            0xffe73444, 0xffe73444, 0xffe63445, 0xffe63445, 0xffe63546, 0xffe63546, 0xffe63546,
-            0xffe53547, 0xffe53547, 0xffe53647, 0xffe53648, 0xffe43648, 0xffe43648, 0xffe43648,
-            0xffe43749, 0xffe43749, 0xffe33749, 0xffe3374a, 0xffe3384a, 0xffe3384a, 0xffe2384b,
-            0xffe2384b, 0xffe2384b, 0xffe2384c, 0xffe1394c, 0xffe1394c, 0xffe1394d, 0xffe1394d,
-            0xffe1394d, 0xffe03a4e, 0xffe03a4e, 0xffe03a4e, 0xffe03a4f, 0xffdf3a4f, 0xffdf3b4f,
-            0xffdf3b50, 0xffdf3b50, 0xffdf3b50, 0xffde3b50, 0xffde3b51, 0xffde3c51, 0xffde3c51,
-            0xffdd3c52, 0xffdd3c52, 0xffdd3c52, 0xffdd3c53, 0xffdd3d53, 0xffdc3d53, 0xffdc3d53,
-            0xffdc3d54, 0xffdc3d54, 0xffdb3d54, 0xffdb3d55, 0xffdb3e55, 0xffdb3e55, 0xffda3e55,
-            0xffda3e56, 0xffda3e56, 0xffda3e56, 0xffda3f57, 0xffd93f57, 0xffd93f57, 0xffd93f57,
-            0xffd93f58, 0xffd83f58, 0xffd84058, 0xffd84059, 0xffd84059, 0xffd84059, 0xffd74059,
-            0xffd7405a, 0xffd7405a, 0xffd7415a, 0xffd6415b, 0xffd6415b, 0xffd6415b, 0xffd6415b,
-            0xffd5415c, 0xffd5415c, 0xffd5425c, 0xffd5425c, 0xffd5425d, 0xffd4425d, 0xffd4425d,
-            0xffd4425e, 0xffd4425e, 0xffd3425e, 0xffd3435e, 0xffd3435f, 0xffd3435f, 0xffd2435f,
-            0xffd2435f, 0xffd24360, 0xffd24360, 0xffd24360, 0xffd14460, 0xffd14461, 0xffd14461,
-            0xffd14461, 0xffd04461, 0xffd04462, 0xffd04462, 0xffd04462, 0xffcf4562, 0xffcf4563,
-            0xffcf4563, 0xffcf4563, 0xffcf4564, 0xffce4564, 0xffce4564, 0xffce4564, 0xffce4565,
-            0xffcd4665, 0xffcd4665, 0xffcd4665, 0xffcd4666, 0xffcc4666, 0xffcc4666, 0xffcc4666,
-            0xffcc4667, 0xffcc4767, 0xffcb4767, 0xffcb4767, 0xffcb4768, 0xffcb4768, 0xffca4768,
-            0xffca4768, 0xffca4769, 0xffca4769, 0xffca4769, 0xffc94769, 0xffc9486a, 0xffc9486a,
-            0xffc9486a, 0xffc8486a, 0xffc8486a, 0xffc8486b, 0xffc8486b, 0xffc7486b, 0xffc7486c,
-            0xffc7496c, 0xffc7496c, 0xffc7496c, 0xffc6496d, 0xffc6496d, 0xffc6496d, 0xffc6496d,
-            0xffc5496d, 0xffc5496e, 0xffc5496e, 0xffc5496e, 0xffc54a6e, 0xffc44a6f, 0xffc44a6f,
-            0xffc44a6f, 0xffc44a6f, 0xffc34a70, 0xffc34a70, 0xffc34a70, 0xffc34a70, 0xffc24a70,
-            0xffc24a71, 0xffc24b71, 0xffc24b71, 0xffc24b71, 0xffc14b72, 0xffc14b72, 0xffc14b72,
-            0xffc14b72, 0xffc04b73, 0xffc04b73, 0xffc04b73, 0xffc04b73, 0xffc04b74, 0xffbf4b74,
-            0xffbf4c74, 0xffbf4c74, 0xffbf4c74, 0xffbe4c75, 0xffbe4c75, 0xffbe4c75, 0xffbe4c75,
-            0xffbd4c76, 0xffbd4c76, 0xffbd4c76, 0xffbd4c76, 0xffbc4c77, 0xffbc4c77, 0xffbc4c77,
-            0xffbc4d77, 0xffbc4d78, 0xffbb4d78, 0xffbb4d78, 0xffbb4d78, 0xffbb4d78, 0xffba4d79,
-            0xffba4d79, 0xffba4d79, 0xffba4d79, 0xffb94d79, 0xffb94d7a, 0xffb94d7a, 0xffb94d7a,
-            0xffb94e7a, 0xffb84e7b, 0xffb84e7b, 0xffb84e7b, 0xffb84e7b, 0xffb74e7b, 0xffb74e7c,
-            0xffb74e7c, 0xffb74e7c, 0xffb74e7c, 0xffb64e7d, 0xffb64e7d, 0xffb64e7d, 0xffb64e7d,
-            0xffb54e7e, 0xffb54f7e, 0xffb54e7e, 0xffb54f7e, 0xffb44f7e, 0xffb44f7f, 0xffb44f7f,
-            0xffb44f7f, 0xffb44f7f, 0xffb34f80, 0xffb34f80, 0xffb34f80, 0xffb34f80, 0xffb24f80,
-            0xffb24f81, 0xffb24f81, 0xffb24f81, 0xffb24f81, 0xffb14f81, 0xffb14f82, 0xffb15082,
-            0xffb15082, 0xffb05082, 0xffb05083, 0xffb05083, 0xffb05083, 0xffb05083, 0xffaf5083,
-            0xffaf5084, 0xffaf5084, 0xffae5084, 0xffae5084, 0xffae5084, 0xffae5085, 0xffae5085,
-            0xffad5085, 0xffad5085, 0xffad5086, 0xffad5086, 0xffac5086, 0xffac5086, 0xffac5086,
-            0xffac5187, 0xffab5087, 0xffab5187, 0xffab5187, 0xffab5187, 0xffab5188, 0xffaa5188,
-            0xffaa5188, 0xffaa5188, 0xffaa5189, 0xffa95189, 0xffa95189, 0xffa95189, 0xffa95189,
-            0xffa9518a, 0xffa8518a, 0xffa8518a, 0xffa8518a, 0xffa8518a, 0xffa7518b, 0xffa7518b,
-            0xffa7518b, 0xffa7518b, 0xffa6518b, 0xffa6518c, 0xffa6518c, 0xffa6518c, 0xffa6528c,
-            0xffa5528d, 0xffa5528d, 0xffa5528d, 0xffa5528d, 0xffa4528d, 0xffa4528e, 0xffa4528e,
-            0xffa4528e, 0xffa4528e, 0xffa3528e, 0xffa3528f, 0xffa3528f, 0xffa2528f, 0xffa2528f,
-            0xffa2528f, 0xffa25290, 0xffa25290, 0xffa15290, 0xffa15290, 0xffa15290, 0xffa15291,
-            0xffa05291, 0xffa05291, 0xffa05291, 0xffa05291, 0xffa05292, 0xff9f5292, 0xff9f5292,
-            0xff9f5292, 0xff9f5292, 0xff9e5293, 0xff9e5293, 0xff9e5293, 0xff9e5293, 0xff9d5293,
-            0xff9d5294, 0xff9d5394, 0xff9d5294, 0xff9d5394, 0xff9c5395, 0xff9c5395, 0xff9c5395,
-            0xff9c5395, 0xff9b5395, 0xff9b5396, 0xff9b5396, 0xff9b5396, 0xff9b5396, 0xff9a5396,
-            0xff9a5397, 0xff9a5397, 0xff9a5397, 0xff995397, 0xff995397, 0xff995398, 0xff995398,
-            0xff985398, 0xff985398, 0xff985398, 0xff985398, 0xff975399, 0xff975399, 0xff975399,
-            0xff975399, 0xff97539a, 0xff96539a, 0xff96539a, 0xff96539a, 0xff96539a, 0xff95539b,
-            0xff95539b, 0xff95539b, 0xff95539b, 0xff94539b, 0xff94539c, 0xff94539c, 0xff94539c,
-            0xff94539c, 0xff93539c, 0xff93539d, 0xff93539d, 0xff93539d, 0xff92539d, 0xff92539d,
-            0xff92539d, 0xff92539e, 0xff92539e, 0xff91539e, 0xff91539e, 0xff91539f, 0xff90539f,
-            0xff90539f, 0xff90539f, 0xff90539f, 0xff9053a0, 0xff8f53a0, 0xff8f53a0, 0xff8f53a0,
-            0xff8f53a0, 0xff8e53a1, 0xff8e53a1, 0xff8e53a1, 0xff8e53a1, 0xff8e53a1, 0xff8d53a1,
-            0xff8d53a2, 0xff8d53a2, 0xff8d53a2, 0xff8c53a2, 0xff8c53a2, 0xff8c53a3, 0xff8c53a3,
-            0xff8b53a3, 0xff8b53a3, 0xff8b53a4, 0xff8b53a4, 0xff8b53a4, 0xff8a53a4, 0xff8a53a4,
-            0xff8a53a4, 0xff8a53a5, 0xff8953a5, 0xff8953a5, 0xff8953a5, 0xff8953a5, 0xff8853a6,
-            0xff8853a6, 0xff8853a6, 0xff8853a6, 0xff8753a6, 0xff8753a7, 0xff8753a7, 0xff8753a7,
-            0xff8753a7, 0xff8653a7, 0xff8653a8, 0xff8653a8, 0xff8653a8, 0xff8553a8, 0xff8553a8,
-            0xff8553a8, 0xff8553a9, 0xff8453a9, 0xff8453a9, 0xff8453a9, 0xff8453a9, 0xff8353aa,
-            0xff8353aa, 0xff8353aa, 0xff8353aa, 0xff8353ab, 0xff8252ab, 0xff8253ab, 0xff8253ab,
-            0xff8252ab, 0xff8152ab, 0xff8152ac, 0xff8152ac, 0xff8152ac, 0xff8052ac, 0xff8052ac,
-            0xff8052ad, 0xff8052ad, 0xff8052ad, 0xff7f52ad, 0xff7f52ad, 0xff7f52ae, 0xff7f52ae,
-            0xff7e52ae, 0xff7e52ae, 0xff7e52ae, 0xff7e52ae, 0xff7d52af, 0xff7d52af, 0xff7d52af,
-            0xff7d52af, 0xff7c52af, 0xff7c52b0, 0xff7c52b0, 0xff7c52b0, 0xff7c52b0, 0xff7b52b0,
-            0xff7b52b1, 0xff7b52b1, 0xff7b52b1, 0xff7a52b1, 0xff7a52b1, 0xff7a52b2, 0xff7a52b2,
-            0xff7952b2, 0xff7952b2, 0xff7952b2, 0xff7951b2, 0xff7851b3, 0xff7851b3, 0xff7851b3,
-            0xff7851b3, 0xff7851b4, 0xff7751b4, 0xff7751b4, 0xff7751b4, 0xff7751b4, 0xff7651b4,
-            0xff7651b5, 0xff7651b5, 0xff7651b5, 0xff7551b5, 0xff7551b5, 0xff7551b6, 0xff7551b6,
-            0xff7451b6, 0xff7451b6, 0xff7451b6, 0xff7451b7, 0xff7451b7, 0xff7351b7, 0xff7351b7,
-            0xff7351b7, 0xff7351b7, 0xff7251b8, 0xff7250b8, 0xff7250b8, 0xff7250b8, 0xff7150b8,
-            0xff7150b9, 0xff7150b9, 0xff7150b9, 0xff7050b9, 0xff7050b9, 0xff7050b9, 0xff7050ba,
-            0xff6f50ba, 0xff6f50ba, 0xff6f50ba, 0xff6f50ba, 0xff6f50bb, 0xff6e50bb, 0xff6e50bb,
-            0xff6e50bb, 0xff6e50bb, 0xff6d50bc, 0xff6d50bc, 0xff6d4fbc, 0xff6d4fbc, 0xff6c4fbc,
-            0xff6c4fbc, 0xff6c4fbd, 0xff6c4fbd, 0xff6b4fbd, 0xff6b4fbd, 0xff6b4fbe, 0xff6b4fbe,
-            0xff6a4fbe, 0xff6a4fbe, 0xff6a4fbe, 0xff6a4fbe, 0xff694fbf, 0xff694fbf, 0xff694fbf,
-            0xff694fbf, 0xff694fbf, 0xff684fc0, 0xff684ec0, 0xff684ec0, 0xff684ec0, 0xff674ec0,
-            0xff674ec1, 0xff674ec1, 0xff674ec1, 0xff664ec1, 0xff664ec1, 0xff664ec1, 0xff664ec2,
-            0xff654ec2, 0xff654ec2, 0xff654ec2, 0xff654ec2, 0xff654ec3, 0xff644dc3, 0xff644dc3,
-            0xff644dc3, 0xff634dc3, 0xff634dc3, 0xff634dc4, 0xff634dc4, 0xff634dc4, 0xff624dc4,
-            0xff624dc4, 0xff624dc5, 0xff624dc5, 0xff614dc5, 0xff614dc5, 0xff614cc5, 0xff614cc6,
-            0xff604cc6, 0xff604cc6, 0xff604cc6, 0xff604cc6, 0xff5f4cc6, 0xff5f4cc7, 0xff5f4cc7,
-            0xff5f4cc7, 0xff5e4cc7, 0xff5e4cc7, 0xff5e4cc8, 0xff5e4cc8, 0xff5d4cc8, 0xff5d4bc8,
-            0xff5d4bc8, 0xff5d4bc8, 0xff5c4bc9, 0xff5c4bc9, 0xff5c4bc9, 0xff5c4bc9, 0xff5b4bc9,
-            0xff5b4bca, 0xff5b4bca, 0xff5b4bca, 0xff5b4bca, 0xff5a4bca, 0xff5a4aca, 0xff5a4acb,
-            0xff5a4acb, 0xff594acb, 0xff594acb, 0xff594acb, 0xff594acc, 0xff584acc, 0xff584acc,
-            0xff584acc, 0xff584acc, 0xff574acc, 0xff5749cd, 0xff5749cd, 0xff5749cd, 0xff5649cd,
-            0xff5649cd, 0xff5649ce, 0xff5649ce, 0xff5549ce, 0xff5549ce, 0xff5549ce, 0xff5549cf,
-            0xff5449cf, 0xff5448cf, 0xff5448cf, 0xff5448cf, 0xff5348cf, 0xff5348d0, 0xff5348d0,
-            0xff5348d0, 0xff5248d0, 0xff5248d0, 0xff5248d1, 0xff5247d1, 0xff5147d1, 0xff5147d1,
-            0xff5147d1, 0xff5147d1, 0xff5047d2, 0xff5047d2, 0xff5047d2, 0xff5047d2, 0xff4f47d2,
-            0xff4f46d3, 0xff4f46d3, 0xff4f46d3, 0xff4e46d3, 0xff4e46d3, 0xff4e46d4, 0xff4e46d4,
-            0xff4d46d4, 0xff4d46d4, 0xff4d46d4, 0xff4d45d4, 0xff4c45d5, 0xff4c45d5, 0xff4c45d5,
-            0xff4c45d5, 0xff4b45d5, 0xff4b45d5, 0xff4b45d6, 0xff4b45d6, 0xff4a44d6, 0xff4a44d6,
-            0xff4a44d6, 0xff4a44d7, 0xff4944d7, 0xff4944d7, 0xff4944d7, 0xff4944d7, 0xff4843d8,
-            0xff4843d8, 0xff4843d8, 0xff4843d8, 0xff4743d8, 0xff4743d9, 0xff4743d9, 0xff4743d9,
-            0xff4643d9, 0xff4642d9, 0xff4642d9, 0xff4642da, 0xff4542da, 0xff4542da, 0xff4542da,
-            0xff4542da, 0xff4442da, 0xff4441db, 0xff4441db, 0xff4341db, 0xff4341db, 0xff4341db,
-            0xff4341dc, 0xff4241dc, 0xff4241dc, 0xff4240dc, 0xff4240dc, 0xff4140dc, 0xff4140dd,
-            0xff4140dd, 0xff4140dd, 0xff4040dd, 0xff403fdd, 0xff403fde, 0xff403fde, 0xff3f3fde,
-            0xff3f3fde, 0xff3f3fde, 0xff3f3fdf, 0xff3e3edf, 0xff3e3edf, 0xff3e3edf, 0xff3d3edf,
-            0xff3d3edf, 0xff3d3ee0, 0xff3d3ee0, 0xff3c3de0, 0xff3c3de0, 0xff3c3de0, 0xff3c3de0,
-            0xff3b3de1, 0xff3b3de1, 0xff3b3de1, 0xff3b3ce1, 0xff3a3ce1, 0xff3a3ce2, 0xff3a3ce2,
-            0xff393ce2, 0xff393ce2, 0xff393be2, 0xff393be3, 0xff383be3, 0xff383be3, 0xff383be3,
-            0xff383be3, 0xff373ae3, 0xff373ae4, 0xff373ae4, 0xff363ae4, 0xff363ae4, 0xff363ae4,
-            0xff3639e4, 0xff3539e5, 0xff3539e5, 0xff3539e5, 0xff3539e5, 0xff3439e5, 0xff3438e6,
-            0xff3438e6, 0xff3338e6, 0xff3338e6, 0xff3338e6, 0xff3337e6, 0xff3237e7, 0xff3237e7,
-            0xff3237e7, 0xff3137e7, 0xff3137e7, 0xff3136e8, 0xff3136e8, 0xff3036e8, 0xff3036e8,
-            0xff3036e8, 0xff3035e8, 0xff2f35e9, 0xff2f35e9, 0xff2f35e9, 0xff2e35e9, 0xff2e34e9,
-            0xff2e34ea, 0xff2e34ea, 0xff2d34ea, 0xff2d34ea, 0xff2d33ea, 0xff2c33eb, 0xff2c33eb,
-            0xff2c33eb, 0xff2b32eb, 0xff2b32eb, 0xff2b32eb, 0xff2b32ec, 0xff2a32ec, 0xff2a31ec,
-            0xff2a31ec, 0xff2931ec, 0xff2931ec, 0xff2931ed, 0xff2930ed, 0xff2830ed, 0xff2830ed,
-            0xff2830ed, 0xff272fee, 0xff272fee, 0xff272fee, 0xff262fee, 0xff262eee, 0xff262eef,
-            0xff252eef, 0xff252def, 0xff252def, 0xff252def, 0xff242def, 0xff242cf0, 0xff242cf0,
-            0xff232cf0, 0xff232cf0, 0xff232bf0, 0xff222bf1, 0xff222bf1, 0xff222bf1, 0xff212af1,
-            0xff212af1, 0xff212af1, 0xff202af1, 0xff2029f2, 0xff2029f2, 0xff1f29f2, 0xff1f28f2,
-            0xff1f28f2, 0xff1e28f3, 0xff1e27f3, 0xff1e27f3, 0xff1d27f3, 0xff1d27f3, 0xff1d26f3,
-            0xff1c26f4, 0xff1c25f4, 0xff1c25f4, 0xff1b25f4, 0xff1b25f4, 0xff1b24f5, 0xff1a24f5,
-            0xff1a24f5, 0xff1923f5, 0xff1923f5, 0xff1922f6, 0xff1822f6, 0xff1822f6, 0xff1821f6,
-            0xff1721f6, 0xff1720f6, 0xff1620f7, 0xff1620f7, 0xff161ff7, 0xff151ff7, 0xff151ef7,
-            0xff141ef8, 0xff141ef8, 0xff141df8, 0xff131df8, 0xff131cf8, 0xff121cf8, 0xff121bf9,
-            0xff111bf9, 0xff111af9, 0xff111af9, 0xff1019f9, 0xff1019fa, 0xff0f18fa, 0xff0f18fa,
-            0xff0e17fa, 0xff0e17fa, 0xff0d16fa, 0xff0d15fb, 0xff0c15fb, 0xff0c14fb, 0xff0b14fb,
-            0xff0b13fb, 0xff0a12fc, 0xff0a11fc, 0xff0911fc, 0xff0810fc, 0xff080ffc, 0xff070efc,
-            0xff070dfd, 0xff060dfd, 0xff060cfd, 0xff050bfd, 0xff0509fd, 0xff0409fe, 0xff0308fe,
-            0xff0307fe, 0xff0206fe, 0xff0204fe, 0xff0103fe, 0xff0102fe, 0xff0001ff, 0xff0000ff,
-        )
+        val expected =
+            longArrayOf(
+                0xffff0000,
+                0xffff0102,
+                0xfffe0203,
+                0xfffe0305,
+                0xfffe0507,
+                0xfffe0609,
+                0xfffe070a,
+                0xfffd080c,
+                0xfffd090d,
+                0xfffd0b0f,
+                0xfffd0b10,
+                0xfffc0d11,
+                0xfffc0e13,
+                0xfffc0e13,
+                0xfffc1015,
+                0xfffc1116,
+                0xfffb1117,
+                0xfffb1218,
+                0xfffb1319,
+                0xfffb1319,
+                0xfffa141a,
+                0xfffa151b,
+                0xfffa151c,
+                0xfffa161d,
+                0xfff9171d,
+                0xfff9181e,
+                0xfff9181f,
+                0xfff91920,
+                0xfff91920,
+                0xfff81a21,
+                0xfff81a22,
+                0xfff81b22,
+                0xfff81b23,
+                0xfff71c24,
+                0xfff71d24,
+                0xfff71d25,
+                0xfff71d26,
+                0xfff71e26,
+                0xfff61e27,
+                0xfff61f27,
+                0xfff61f28,
+                0xfff62028,
+                0xfff52029,
+                0xfff5212a,
+                0xfff5212a,
+                0xfff5222b,
+                0xfff4222b,
+                0xfff4222c,
+                0xfff4232c,
+                0xfff4232d,
+                0xfff4232d,
+                0xfff3242e,
+                0xfff3242e,
+                0xfff3252f,
+                0xfff3252f,
+                0xfff22530,
+                0xfff22630,
+                0xfff22631,
+                0xfff22631,
+                0xfff22732,
+                0xfff12732,
+                0xfff12833,
+                0xfff12833,
+                0xfff12833,
+                0xfff02934,
+                0xfff02935,
+                0xfff02935,
+                0xfff02935,
+                0xffef2a36,
+                0xffef2a36,
+                0xffef2b37,
+                0xffef2b37,
+                0xffef2b37,
+                0xffee2b38,
+                0xffee2c38,
+                0xffee2c39,
+                0xffee2c39,
+                0xffed2c3a,
+                0xffed2d3a,
+                0xffed2d3a,
+                0xffed2d3b,
+                0xffed2e3b,
+                0xffec2e3b,
+                0xffec2e3c,
+                0xffec2f3c,
+                0xffec2f3d,
+                0xffeb2f3d,
+                0xffeb2f3e,
+                0xffeb2f3e,
+                0xffeb303e,
+                0xffea303f,
+                0xffea303f,
+                0xffea313f,
+                0xffea3140,
+                0xffea3140,
+                0xffe93141,
+                0xffe93141,
+                0xffe93241,
+                0xffe93242,
+                0xffe83242,
+                0xffe83342,
+                0xffe83343,
+                0xffe83343,
+                0xffe73343,
+                0xffe73344,
+                0xffe73444,
+                0xffe73444,
+                0xffe63445,
+                0xffe63445,
+                0xffe63546,
+                0xffe63546,
+                0xffe63546,
+                0xffe53547,
+                0xffe53547,
+                0xffe53647,
+                0xffe53648,
+                0xffe43648,
+                0xffe43648,
+                0xffe43648,
+                0xffe43749,
+                0xffe43749,
+                0xffe33749,
+                0xffe3374a,
+                0xffe3384a,
+                0xffe3384a,
+                0xffe2384b,
+                0xffe2384b,
+                0xffe2384b,
+                0xffe2384c,
+                0xffe1394c,
+                0xffe1394c,
+                0xffe1394d,
+                0xffe1394d,
+                0xffe1394d,
+                0xffe03a4e,
+                0xffe03a4e,
+                0xffe03a4e,
+                0xffe03a4f,
+                0xffdf3a4f,
+                0xffdf3b4f,
+                0xffdf3b50,
+                0xffdf3b50,
+                0xffdf3b50,
+                0xffde3b50,
+                0xffde3b51,
+                0xffde3c51,
+                0xffde3c51,
+                0xffdd3c52,
+                0xffdd3c52,
+                0xffdd3c52,
+                0xffdd3c53,
+                0xffdd3d53,
+                0xffdc3d53,
+                0xffdc3d53,
+                0xffdc3d54,
+                0xffdc3d54,
+                0xffdb3d54,
+                0xffdb3d55,
+                0xffdb3e55,
+                0xffdb3e55,
+                0xffda3e55,
+                0xffda3e56,
+                0xffda3e56,
+                0xffda3e56,
+                0xffda3f57,
+                0xffd93f57,
+                0xffd93f57,
+                0xffd93f57,
+                0xffd93f58,
+                0xffd83f58,
+                0xffd84058,
+                0xffd84059,
+                0xffd84059,
+                0xffd84059,
+                0xffd74059,
+                0xffd7405a,
+                0xffd7405a,
+                0xffd7415a,
+                0xffd6415b,
+                0xffd6415b,
+                0xffd6415b,
+                0xffd6415b,
+                0xffd5415c,
+                0xffd5415c,
+                0xffd5425c,
+                0xffd5425c,
+                0xffd5425d,
+                0xffd4425d,
+                0xffd4425d,
+                0xffd4425e,
+                0xffd4425e,
+                0xffd3425e,
+                0xffd3435e,
+                0xffd3435f,
+                0xffd3435f,
+                0xffd2435f,
+                0xffd2435f,
+                0xffd24360,
+                0xffd24360,
+                0xffd24360,
+                0xffd14460,
+                0xffd14461,
+                0xffd14461,
+                0xffd14461,
+                0xffd04461,
+                0xffd04462,
+                0xffd04462,
+                0xffd04462,
+                0xffcf4562,
+                0xffcf4563,
+                0xffcf4563,
+                0xffcf4563,
+                0xffcf4564,
+                0xffce4564,
+                0xffce4564,
+                0xffce4564,
+                0xffce4565,
+                0xffcd4665,
+                0xffcd4665,
+                0xffcd4665,
+                0xffcd4666,
+                0xffcc4666,
+                0xffcc4666,
+                0xffcc4666,
+                0xffcc4667,
+                0xffcc4767,
+                0xffcb4767,
+                0xffcb4767,
+                0xffcb4768,
+                0xffcb4768,
+                0xffca4768,
+                0xffca4768,
+                0xffca4769,
+                0xffca4769,
+                0xffca4769,
+                0xffc94769,
+                0xffc9486a,
+                0xffc9486a,
+                0xffc9486a,
+                0xffc8486a,
+                0xffc8486a,
+                0xffc8486b,
+                0xffc8486b,
+                0xffc7486b,
+                0xffc7486c,
+                0xffc7496c,
+                0xffc7496c,
+                0xffc7496c,
+                0xffc6496d,
+                0xffc6496d,
+                0xffc6496d,
+                0xffc6496d,
+                0xffc5496d,
+                0xffc5496e,
+                0xffc5496e,
+                0xffc5496e,
+                0xffc54a6e,
+                0xffc44a6f,
+                0xffc44a6f,
+                0xffc44a6f,
+                0xffc44a6f,
+                0xffc34a70,
+                0xffc34a70,
+                0xffc34a70,
+                0xffc34a70,
+                0xffc24a70,
+                0xffc24a71,
+                0xffc24b71,
+                0xffc24b71,
+                0xffc24b71,
+                0xffc14b72,
+                0xffc14b72,
+                0xffc14b72,
+                0xffc14b72,
+                0xffc04b73,
+                0xffc04b73,
+                0xffc04b73,
+                0xffc04b73,
+                0xffc04b74,
+                0xffbf4b74,
+                0xffbf4c74,
+                0xffbf4c74,
+                0xffbf4c74,
+                0xffbe4c75,
+                0xffbe4c75,
+                0xffbe4c75,
+                0xffbe4c75,
+                0xffbd4c76,
+                0xffbd4c76,
+                0xffbd4c76,
+                0xffbd4c76,
+                0xffbc4c77,
+                0xffbc4c77,
+                0xffbc4c77,
+                0xffbc4d77,
+                0xffbc4d78,
+                0xffbb4d78,
+                0xffbb4d78,
+                0xffbb4d78,
+                0xffbb4d78,
+                0xffba4d79,
+                0xffba4d79,
+                0xffba4d79,
+                0xffba4d79,
+                0xffb94d79,
+                0xffb94d7a,
+                0xffb94d7a,
+                0xffb94d7a,
+                0xffb94e7a,
+                0xffb84e7b,
+                0xffb84e7b,
+                0xffb84e7b,
+                0xffb84e7b,
+                0xffb74e7b,
+                0xffb74e7c,
+                0xffb74e7c,
+                0xffb74e7c,
+                0xffb74e7c,
+                0xffb64e7d,
+                0xffb64e7d,
+                0xffb64e7d,
+                0xffb64e7d,
+                0xffb54e7e,
+                0xffb54f7e,
+                0xffb54e7e,
+                0xffb54f7e,
+                0xffb44f7e,
+                0xffb44f7f,
+                0xffb44f7f,
+                0xffb44f7f,
+                0xffb44f7f,
+                0xffb34f80,
+                0xffb34f80,
+                0xffb34f80,
+                0xffb34f80,
+                0xffb24f80,
+                0xffb24f81,
+                0xffb24f81,
+                0xffb24f81,
+                0xffb24f81,
+                0xffb14f81,
+                0xffb14f82,
+                0xffb15082,
+                0xffb15082,
+                0xffb05082,
+                0xffb05083,
+                0xffb05083,
+                0xffb05083,
+                0xffb05083,
+                0xffaf5083,
+                0xffaf5084,
+                0xffaf5084,
+                0xffae5084,
+                0xffae5084,
+                0xffae5084,
+                0xffae5085,
+                0xffae5085,
+                0xffad5085,
+                0xffad5085,
+                0xffad5086,
+                0xffad5086,
+                0xffac5086,
+                0xffac5086,
+                0xffac5086,
+                0xffac5187,
+                0xffab5087,
+                0xffab5187,
+                0xffab5187,
+                0xffab5187,
+                0xffab5188,
+                0xffaa5188,
+                0xffaa5188,
+                0xffaa5188,
+                0xffaa5189,
+                0xffa95189,
+                0xffa95189,
+                0xffa95189,
+                0xffa95189,
+                0xffa9518a,
+                0xffa8518a,
+                0xffa8518a,
+                0xffa8518a,
+                0xffa8518a,
+                0xffa7518b,
+                0xffa7518b,
+                0xffa7518b,
+                0xffa7518b,
+                0xffa6518b,
+                0xffa6518c,
+                0xffa6518c,
+                0xffa6518c,
+                0xffa6528c,
+                0xffa5528d,
+                0xffa5528d,
+                0xffa5528d,
+                0xffa5528d,
+                0xffa4528d,
+                0xffa4528e,
+                0xffa4528e,
+                0xffa4528e,
+                0xffa4528e,
+                0xffa3528e,
+                0xffa3528f,
+                0xffa3528f,
+                0xffa2528f,
+                0xffa2528f,
+                0xffa2528f,
+                0xffa25290,
+                0xffa25290,
+                0xffa15290,
+                0xffa15290,
+                0xffa15290,
+                0xffa15291,
+                0xffa05291,
+                0xffa05291,
+                0xffa05291,
+                0xffa05291,
+                0xffa05292,
+                0xff9f5292,
+                0xff9f5292,
+                0xff9f5292,
+                0xff9f5292,
+                0xff9e5293,
+                0xff9e5293,
+                0xff9e5293,
+                0xff9e5293,
+                0xff9d5293,
+                0xff9d5294,
+                0xff9d5394,
+                0xff9d5294,
+                0xff9d5394,
+                0xff9c5395,
+                0xff9c5395,
+                0xff9c5395,
+                0xff9c5395,
+                0xff9b5395,
+                0xff9b5396,
+                0xff9b5396,
+                0xff9b5396,
+                0xff9b5396,
+                0xff9a5396,
+                0xff9a5397,
+                0xff9a5397,
+                0xff9a5397,
+                0xff995397,
+                0xff995397,
+                0xff995398,
+                0xff995398,
+                0xff985398,
+                0xff985398,
+                0xff985398,
+                0xff985398,
+                0xff975399,
+                0xff975399,
+                0xff975399,
+                0xff975399,
+                0xff97539a,
+                0xff96539a,
+                0xff96539a,
+                0xff96539a,
+                0xff96539a,
+                0xff95539b,
+                0xff95539b,
+                0xff95539b,
+                0xff95539b,
+                0xff94539b,
+                0xff94539c,
+                0xff94539c,
+                0xff94539c,
+                0xff94539c,
+                0xff93539c,
+                0xff93539d,
+                0xff93539d,
+                0xff93539d,
+                0xff92539d,
+                0xff92539d,
+                0xff92539d,
+                0xff92539e,
+                0xff92539e,
+                0xff91539e,
+                0xff91539e,
+                0xff91539f,
+                0xff90539f,
+                0xff90539f,
+                0xff90539f,
+                0xff90539f,
+                0xff9053a0,
+                0xff8f53a0,
+                0xff8f53a0,
+                0xff8f53a0,
+                0xff8f53a0,
+                0xff8e53a1,
+                0xff8e53a1,
+                0xff8e53a1,
+                0xff8e53a1,
+                0xff8e53a1,
+                0xff8d53a1,
+                0xff8d53a2,
+                0xff8d53a2,
+                0xff8d53a2,
+                0xff8c53a2,
+                0xff8c53a2,
+                0xff8c53a3,
+                0xff8c53a3,
+                0xff8b53a3,
+                0xff8b53a3,
+                0xff8b53a4,
+                0xff8b53a4,
+                0xff8b53a4,
+                0xff8a53a4,
+                0xff8a53a4,
+                0xff8a53a4,
+                0xff8a53a5,
+                0xff8953a5,
+                0xff8953a5,
+                0xff8953a5,
+                0xff8953a5,
+                0xff8853a6,
+                0xff8853a6,
+                0xff8853a6,
+                0xff8853a6,
+                0xff8753a6,
+                0xff8753a7,
+                0xff8753a7,
+                0xff8753a7,
+                0xff8753a7,
+                0xff8653a7,
+                0xff8653a8,
+                0xff8653a8,
+                0xff8653a8,
+                0xff8553a8,
+                0xff8553a8,
+                0xff8553a8,
+                0xff8553a9,
+                0xff8453a9,
+                0xff8453a9,
+                0xff8453a9,
+                0xff8453a9,
+                0xff8353aa,
+                0xff8353aa,
+                0xff8353aa,
+                0xff8353aa,
+                0xff8353ab,
+                0xff8252ab,
+                0xff8253ab,
+                0xff8253ab,
+                0xff8252ab,
+                0xff8152ab,
+                0xff8152ac,
+                0xff8152ac,
+                0xff8152ac,
+                0xff8052ac,
+                0xff8052ac,
+                0xff8052ad,
+                0xff8052ad,
+                0xff8052ad,
+                0xff7f52ad,
+                0xff7f52ad,
+                0xff7f52ae,
+                0xff7f52ae,
+                0xff7e52ae,
+                0xff7e52ae,
+                0xff7e52ae,
+                0xff7e52ae,
+                0xff7d52af,
+                0xff7d52af,
+                0xff7d52af,
+                0xff7d52af,
+                0xff7c52af,
+                0xff7c52b0,
+                0xff7c52b0,
+                0xff7c52b0,
+                0xff7c52b0,
+                0xff7b52b0,
+                0xff7b52b1,
+                0xff7b52b1,
+                0xff7b52b1,
+                0xff7a52b1,
+                0xff7a52b1,
+                0xff7a52b2,
+                0xff7a52b2,
+                0xff7952b2,
+                0xff7952b2,
+                0xff7952b2,
+                0xff7951b2,
+                0xff7851b3,
+                0xff7851b3,
+                0xff7851b3,
+                0xff7851b3,
+                0xff7851b4,
+                0xff7751b4,
+                0xff7751b4,
+                0xff7751b4,
+                0xff7751b4,
+                0xff7651b4,
+                0xff7651b5,
+                0xff7651b5,
+                0xff7651b5,
+                0xff7551b5,
+                0xff7551b5,
+                0xff7551b6,
+                0xff7551b6,
+                0xff7451b6,
+                0xff7451b6,
+                0xff7451b6,
+                0xff7451b7,
+                0xff7451b7,
+                0xff7351b7,
+                0xff7351b7,
+                0xff7351b7,
+                0xff7351b7,
+                0xff7251b8,
+                0xff7250b8,
+                0xff7250b8,
+                0xff7250b8,
+                0xff7150b8,
+                0xff7150b9,
+                0xff7150b9,
+                0xff7150b9,
+                0xff7050b9,
+                0xff7050b9,
+                0xff7050b9,
+                0xff7050ba,
+                0xff6f50ba,
+                0xff6f50ba,
+                0xff6f50ba,
+                0xff6f50ba,
+                0xff6f50bb,
+                0xff6e50bb,
+                0xff6e50bb,
+                0xff6e50bb,
+                0xff6e50bb,
+                0xff6d50bc,
+                0xff6d50bc,
+                0xff6d4fbc,
+                0xff6d4fbc,
+                0xff6c4fbc,
+                0xff6c4fbc,
+                0xff6c4fbd,
+                0xff6c4fbd,
+                0xff6b4fbd,
+                0xff6b4fbd,
+                0xff6b4fbe,
+                0xff6b4fbe,
+                0xff6a4fbe,
+                0xff6a4fbe,
+                0xff6a4fbe,
+                0xff6a4fbe,
+                0xff694fbf,
+                0xff694fbf,
+                0xff694fbf,
+                0xff694fbf,
+                0xff694fbf,
+                0xff684fc0,
+                0xff684ec0,
+                0xff684ec0,
+                0xff684ec0,
+                0xff674ec0,
+                0xff674ec1,
+                0xff674ec1,
+                0xff674ec1,
+                0xff664ec1,
+                0xff664ec1,
+                0xff664ec1,
+                0xff664ec2,
+                0xff654ec2,
+                0xff654ec2,
+                0xff654ec2,
+                0xff654ec2,
+                0xff654ec3,
+                0xff644dc3,
+                0xff644dc3,
+                0xff644dc3,
+                0xff634dc3,
+                0xff634dc3,
+                0xff634dc4,
+                0xff634dc4,
+                0xff634dc4,
+                0xff624dc4,
+                0xff624dc4,
+                0xff624dc5,
+                0xff624dc5,
+                0xff614dc5,
+                0xff614dc5,
+                0xff614cc5,
+                0xff614cc6,
+                0xff604cc6,
+                0xff604cc6,
+                0xff604cc6,
+                0xff604cc6,
+                0xff5f4cc6,
+                0xff5f4cc7,
+                0xff5f4cc7,
+                0xff5f4cc7,
+                0xff5e4cc7,
+                0xff5e4cc7,
+                0xff5e4cc8,
+                0xff5e4cc8,
+                0xff5d4cc8,
+                0xff5d4bc8,
+                0xff5d4bc8,
+                0xff5d4bc8,
+                0xff5c4bc9,
+                0xff5c4bc9,
+                0xff5c4bc9,
+                0xff5c4bc9,
+                0xff5b4bc9,
+                0xff5b4bca,
+                0xff5b4bca,
+                0xff5b4bca,
+                0xff5b4bca,
+                0xff5a4bca,
+                0xff5a4aca,
+                0xff5a4acb,
+                0xff5a4acb,
+                0xff594acb,
+                0xff594acb,
+                0xff594acb,
+                0xff594acc,
+                0xff584acc,
+                0xff584acc,
+                0xff584acc,
+                0xff584acc,
+                0xff574acc,
+                0xff5749cd,
+                0xff5749cd,
+                0xff5749cd,
+                0xff5649cd,
+                0xff5649cd,
+                0xff5649ce,
+                0xff5649ce,
+                0xff5549ce,
+                0xff5549ce,
+                0xff5549ce,
+                0xff5549cf,
+                0xff5449cf,
+                0xff5448cf,
+                0xff5448cf,
+                0xff5448cf,
+                0xff5348cf,
+                0xff5348d0,
+                0xff5348d0,
+                0xff5348d0,
+                0xff5248d0,
+                0xff5248d0,
+                0xff5248d1,
+                0xff5247d1,
+                0xff5147d1,
+                0xff5147d1,
+                0xff5147d1,
+                0xff5147d1,
+                0xff5047d2,
+                0xff5047d2,
+                0xff5047d2,
+                0xff5047d2,
+                0xff4f47d2,
+                0xff4f46d3,
+                0xff4f46d3,
+                0xff4f46d3,
+                0xff4e46d3,
+                0xff4e46d3,
+                0xff4e46d4,
+                0xff4e46d4,
+                0xff4d46d4,
+                0xff4d46d4,
+                0xff4d46d4,
+                0xff4d45d4,
+                0xff4c45d5,
+                0xff4c45d5,
+                0xff4c45d5,
+                0xff4c45d5,
+                0xff4b45d5,
+                0xff4b45d5,
+                0xff4b45d6,
+                0xff4b45d6,
+                0xff4a44d6,
+                0xff4a44d6,
+                0xff4a44d6,
+                0xff4a44d7,
+                0xff4944d7,
+                0xff4944d7,
+                0xff4944d7,
+                0xff4944d7,
+                0xff4843d8,
+                0xff4843d8,
+                0xff4843d8,
+                0xff4843d8,
+                0xff4743d8,
+                0xff4743d9,
+                0xff4743d9,
+                0xff4743d9,
+                0xff4643d9,
+                0xff4642d9,
+                0xff4642d9,
+                0xff4642da,
+                0xff4542da,
+                0xff4542da,
+                0xff4542da,
+                0xff4542da,
+                0xff4442da,
+                0xff4441db,
+                0xff4441db,
+                0xff4341db,
+                0xff4341db,
+                0xff4341db,
+                0xff4341dc,
+                0xff4241dc,
+                0xff4241dc,
+                0xff4240dc,
+                0xff4240dc,
+                0xff4140dc,
+                0xff4140dd,
+                0xff4140dd,
+                0xff4140dd,
+                0xff4040dd,
+                0xff403fdd,
+                0xff403fde,
+                0xff403fde,
+                0xff3f3fde,
+                0xff3f3fde,
+                0xff3f3fde,
+                0xff3f3fdf,
+                0xff3e3edf,
+                0xff3e3edf,
+                0xff3e3edf,
+                0xff3d3edf,
+                0xff3d3edf,
+                0xff3d3ee0,
+                0xff3d3ee0,
+                0xff3c3de0,
+                0xff3c3de0,
+                0xff3c3de0,
+                0xff3c3de0,
+                0xff3b3de1,
+                0xff3b3de1,
+                0xff3b3de1,
+                0xff3b3ce1,
+                0xff3a3ce1,
+                0xff3a3ce2,
+                0xff3a3ce2,
+                0xff393ce2,
+                0xff393ce2,
+                0xff393be2,
+                0xff393be3,
+                0xff383be3,
+                0xff383be3,
+                0xff383be3,
+                0xff383be3,
+                0xff373ae3,
+                0xff373ae4,
+                0xff373ae4,
+                0xff363ae4,
+                0xff363ae4,
+                0xff363ae4,
+                0xff3639e4,
+                0xff3539e5,
+                0xff3539e5,
+                0xff3539e5,
+                0xff3539e5,
+                0xff3439e5,
+                0xff3438e6,
+                0xff3438e6,
+                0xff3338e6,
+                0xff3338e6,
+                0xff3338e6,
+                0xff3337e6,
+                0xff3237e7,
+                0xff3237e7,
+                0xff3237e7,
+                0xff3137e7,
+                0xff3137e7,
+                0xff3136e8,
+                0xff3136e8,
+                0xff3036e8,
+                0xff3036e8,
+                0xff3036e8,
+                0xff3035e8,
+                0xff2f35e9,
+                0xff2f35e9,
+                0xff2f35e9,
+                0xff2e35e9,
+                0xff2e34e9,
+                0xff2e34ea,
+                0xff2e34ea,
+                0xff2d34ea,
+                0xff2d34ea,
+                0xff2d33ea,
+                0xff2c33eb,
+                0xff2c33eb,
+                0xff2c33eb,
+                0xff2b32eb,
+                0xff2b32eb,
+                0xff2b32eb,
+                0xff2b32ec,
+                0xff2a32ec,
+                0xff2a31ec,
+                0xff2a31ec,
+                0xff2931ec,
+                0xff2931ec,
+                0xff2931ed,
+                0xff2930ed,
+                0xff2830ed,
+                0xff2830ed,
+                0xff2830ed,
+                0xff272fee,
+                0xff272fee,
+                0xff272fee,
+                0xff262fee,
+                0xff262eee,
+                0xff262eef,
+                0xff252eef,
+                0xff252def,
+                0xff252def,
+                0xff252def,
+                0xff242def,
+                0xff242cf0,
+                0xff242cf0,
+                0xff232cf0,
+                0xff232cf0,
+                0xff232bf0,
+                0xff222bf1,
+                0xff222bf1,
+                0xff222bf1,
+                0xff212af1,
+                0xff212af1,
+                0xff212af1,
+                0xff202af1,
+                0xff2029f2,
+                0xff2029f2,
+                0xff1f29f2,
+                0xff1f28f2,
+                0xff1f28f2,
+                0xff1e28f3,
+                0xff1e27f3,
+                0xff1e27f3,
+                0xff1d27f3,
+                0xff1d27f3,
+                0xff1d26f3,
+                0xff1c26f4,
+                0xff1c25f4,
+                0xff1c25f4,
+                0xff1b25f4,
+                0xff1b25f4,
+                0xff1b24f5,
+                0xff1a24f5,
+                0xff1a24f5,
+                0xff1923f5,
+                0xff1923f5,
+                0xff1922f6,
+                0xff1822f6,
+                0xff1822f6,
+                0xff1821f6,
+                0xff1721f6,
+                0xff1720f6,
+                0xff1620f7,
+                0xff1620f7,
+                0xff161ff7,
+                0xff151ff7,
+                0xff151ef7,
+                0xff141ef8,
+                0xff141ef8,
+                0xff141df8,
+                0xff131df8,
+                0xff131cf8,
+                0xff121cf8,
+                0xff121bf9,
+                0xff111bf9,
+                0xff111af9,
+                0xff111af9,
+                0xff1019f9,
+                0xff1019fa,
+                0xff0f18fa,
+                0xff0f18fa,
+                0xff0e17fa,
+                0xff0e17fa,
+                0xff0d16fa,
+                0xff0d15fb,
+                0xff0c15fb,
+                0xff0c14fb,
+                0xff0b14fb,
+                0xff0b13fb,
+                0xff0a12fc,
+                0xff0a11fc,
+                0xff0911fc,
+                0xff0810fc,
+                0xff080ffc,
+                0xff070efc,
+                0xff070dfd,
+                0xff060dfd,
+                0xff060cfd,
+                0xff050bfd,
+                0xff0509fd,
+                0xff0409fe,
+                0xff0308fe,
+                0xff0307fe,
+                0xff0206fe,
+                0xff0204fe,
+                0xff0103fe,
+                0xff0102fe,
+                0xff0001ff,
+                0xff0000ff,
+            )
 
         repeat(1001) {
             val color = lerp(Color.Red, Color.Blue, it / 1000f)
             val colorLong = color.toArgb().toLong() and 0xFFFFFFFFL
             // Check individual color channels to account for possible float and half-float
             // precision issues across devices. We allow up to 1/255 of difference
-            assertTrue(abs(expected[it].toInt().red - color.toArgb().red) < 2,
+            assertTrue(
+                abs(expected[it].toInt().red - color.toArgb().red) < 2,
                 "Expected fraction $it/1000 to have color " +
                     "0x${expected[it].toString(16)}, but was 0x${colorLong.toString(16)}"
             )
-            assertTrue(abs(expected[it].toInt().green - color.toArgb().green) < 2,
+            assertTrue(
+                abs(expected[it].toInt().green - color.toArgb().green) < 2,
                 "Expected fraction $it/1000 to have color " +
                     "0x${expected[it].toString(16)}, but was 0x${colorLong.toString(16)}"
             )
-            assertTrue(abs(expected[it].toInt().blue - color.toArgb().blue) < 2,
+            assertTrue(
+                abs(expected[it].toInt().blue - color.toArgb().blue) < 2,
                 "Expected fraction $it/1000 to have color " +
                     "0x${expected[it].toString(16)}, but was 0x${colorLong.toString(16)}"
             )
@@ -565,7 +1414,8 @@
         assertEquals(50f / 255f, srgbGreen.blue, 0.01f)
     }
 
-    @Test fun unspecifiedConstantValue() {
+    @Test
+    fun unspecifiedConstantValue() {
         // See comments in Color.kt, we want to make sure Color.Unspecified doesn't change encoding
         assertEquals(0x10UL, Color.Unspecified.value)
     }
diff --git a/compose/ui/ui-graphics/src/androidInstrumentedTest/kotlin/androidx/compose/ui/graphics/GradientTest.kt b/compose/ui/ui-graphics/src/androidInstrumentedTest/kotlin/androidx/compose/ui/graphics/GradientTest.kt
index 08dfe0f..5d09b9f0 100644
--- a/compose/ui/ui-graphics/src/androidInstrumentedTest/kotlin/androidx/compose/ui/graphics/GradientTest.kt
+++ b/compose/ui/ui-graphics/src/androidInstrumentedTest/kotlin/androidx/compose/ui/graphics/GradientTest.kt
@@ -37,9 +37,7 @@
         assertEquals(1, countTransparentColors(listOf(Color.Red, Color.Transparent, Color.Blue)))
         assertEquals(
             1,
-            countTransparentColors(
-                listOf(Color.Red, Color.Blue.copy(alpha = 0f), Color.Blue)
-            )
+            countTransparentColors(listOf(Color.Red, Color.Blue.copy(alpha = 0f), Color.Blue))
         )
         assertEquals(0, countTransparentColors(listOf(Color.Transparent, Color.Green, Color.Blue)))
         assertEquals(0, countTransparentColors(listOf(Color.Red, Color.Green, Color.Transparent)))
@@ -52,9 +50,7 @@
         assertEquals(0, countTransparentColors(listOf(Color.Red, Color.Transparent, Color.Blue)))
         assertEquals(
             0,
-            countTransparentColors(
-                listOf(Color.Red, Color.Blue.copy(alpha = 0f), Color.Blue)
-            )
+            countTransparentColors(listOf(Color.Red, Color.Blue.copy(alpha = 0f), Color.Blue))
         )
         assertEquals(0, countTransparentColors(listOf(Color.Transparent, Color.Green, Color.Blue)))
         assertEquals(0, countTransparentColors(listOf(Color.Red, Color.Green, Color.Transparent)))
@@ -64,11 +60,8 @@
     fun testNoTransparentColorNoStopsReturnsNoStops() {
         // Regardless of OS level, all color values that are not Color.Transparent
         // should produce the same stops
-        val result = makeTransparentStops(
-            null,
-            listOf(Color.Red, Color.Green, Color.Blue, Color.Magenta),
-            0
-        )
+        val result =
+            makeTransparentStops(null, listOf(Color.Red, Color.Green, Color.Blue, Color.Magenta), 0)
         assertNull(result)
     }
 
@@ -77,11 +70,12 @@
         // Regardless of OS level, all color values that are not Color.Transparent
         // should produce the same stops
         val stops = listOf(0f, 0.25f, 0.3f, 1f)
-        val result = makeTransparentStops(
-            stops,
-            listOf(Color.Red, Color.Green, Color.Blue, Color.Magenta),
-            0
-        )
+        val result =
+            makeTransparentStops(
+                stops,
+                listOf(Color.Red, Color.Green, Color.Blue, Color.Magenta),
+                0
+            )
         assertSameStops(stops, result!!)
     }
 
@@ -89,11 +83,12 @@
     fun testTransparentColorsAtEndsAndNoStopsReturnsNoStops() {
         // Regardless of OS level, all color values that are not Color.Transparent
         // should produce the same stops
-        val result = makeTransparentStops(
-            null,
-            listOf(Color.Transparent, Color.Green, Color.Blue, Color.Transparent),
-            0
-        )
+        val result =
+            makeTransparentStops(
+                null,
+                listOf(Color.Transparent, Color.Green, Color.Blue, Color.Transparent),
+                0
+            )
         assertNull(result)
     }
 
@@ -102,11 +97,12 @@
         // Regardless of OS level, all color values that are not Color.Transparent
         // should produce the same stops
         val stops = listOf(0f, 0.25f, 0.3f, 1f)
-        val result = makeTransparentStops(
-            stops,
-            listOf(Color.Transparent, Color.Green, Color.Blue, Color.Transparent),
-            0
-        )
+        val result =
+            makeTransparentStops(
+                stops,
+                listOf(Color.Transparent, Color.Green, Color.Blue, Color.Transparent),
+                0
+            )
         assertSameStops(stops, result!!)
     }
 
@@ -114,62 +110,58 @@
     @SdkSuppress(minSdkVersion = Build.VERSION_CODES.O)
     fun testTransparentColorsInMiddleProducesNoStopsOnO() {
         // On O and later, no stops should be produced.
-        val result = makeTransparentStops(
-            null,
-            listOf(
-                Color.Red,
-                Color.Transparent,
-                Color.Green,
-                Color.Transparent,
-                Color.Blue,
-                Color.Magenta
-            ),
-            0 // O always counts 0
-        )
+        val result =
+            makeTransparentStops(
+                null,
+                listOf(
+                    Color.Red,
+                    Color.Transparent,
+                    Color.Green,
+                    Color.Transparent,
+                    Color.Blue,
+                    Color.Magenta
+                ),
+                0 // O always counts 0
+            )
         assertNull(result)
     }
 
     @Test
     @SdkSuppress(minSdkVersion = Build.VERSION_CODES.O)
     fun testTransparentColorsInMiddleAddsNoStopsOnO() {
-        val stops = listOf(
-            0f,
-            0.1f,
-            0.2f,
-            0.5f,
-            0.7f,
-            1f
-        )
-        val result = makeTransparentStops(
-            stops,
-            listOf(
-                Color.Red,
-                Color.Transparent,
-                Color.Green,
-                Color.Transparent,
-                Color.Blue,
-                Color.Magenta
-            ),
-            0 // O always counts 0
-        )
+        val stops = listOf(0f, 0.1f, 0.2f, 0.5f, 0.7f, 1f)
+        val result =
+            makeTransparentStops(
+                stops,
+                listOf(
+                    Color.Red,
+                    Color.Transparent,
+                    Color.Green,
+                    Color.Transparent,
+                    Color.Blue,
+                    Color.Magenta
+                ),
+                0 // O always counts 0
+            )
         assertSameStops(stops, result!!)
     }
 
     @Test
     @SdkSuppress(maxSdkVersion = Build.VERSION_CODES.N_MR1)
     fun testTransparentColorsInMiddleProducesStopsOnN() {
-        val result = makeTransparentStops(
-            null,
-            listOf(
-                Color.Red,
-                Color.Transparent,
-                Color.Green,
-                Color.Transparent,
-                Color.Blue,
-                Color.Magenta
-            ),
-            2
-        )
+        val result =
+            makeTransparentStops(
+                null,
+                listOf(
+                    Color.Red,
+                    Color.Transparent,
+                    Color.Green,
+                    Color.Transparent,
+                    Color.Blue,
+                    Color.Magenta
+                ),
+                2
+            )
         assertNotNull(result)
         assertSameStops(listOf(0f, 0.2f, 0.2f, 0.4f, 0.6f, 0.6f, 0.8f, 1f), result!!)
     }
@@ -177,25 +169,19 @@
     @Test
     @SdkSuppress(maxSdkVersion = Build.VERSION_CODES.N_MR1)
     fun testTransparentColorsInMiddleAddsStopsOnN() {
-        val result = makeTransparentStops(
-            listOf(
-                0.05f,
-                0.1f,
-                0.2f,
-                0.5f,
-                0.7f,
-                1f
-            ),
-            listOf(
-                Color.Red,
-                Color.Transparent,
-                Color.Green,
-                Color.Transparent,
-                Color.Blue,
-                Color.Magenta
-            ),
-            2
-        )
+        val result =
+            makeTransparentStops(
+                listOf(0.05f, 0.1f, 0.2f, 0.5f, 0.7f, 1f),
+                listOf(
+                    Color.Red,
+                    Color.Transparent,
+                    Color.Green,
+                    Color.Transparent,
+                    Color.Blue,
+                    Color.Magenta
+                ),
+                2
+            )
         assertNotNull(result)
         assertSameStops(listOf(0.05f, 0.1f, 0.1f, 0.2f, 0.5f, 0.5f, 0.7f, 1f), result!!)
     }
@@ -224,10 +210,11 @@
     fun testTransparencyOnNReturnsNewValues() {
         // All Android Versions N and below should modify the color values and add
         // one transparent value for the middle Transparent
-        val result = makeTransparentColors(
-            listOf(Color.Transparent, Color.Green, Color.Transparent, Color.Magenta),
-            1
-        )
+        val result =
+            makeTransparentColors(
+                listOf(Color.Transparent, Color.Green, Color.Transparent, Color.Magenta),
+                1
+            )
         assertSameColors(
             listOf(
                 Color.Green.copy(alpha = 0f),
@@ -243,10 +230,11 @@
     @Test
     @SdkSuppress(maxSdkVersion = Build.VERSION_CODES.N_MR1)
     fun testMultipleTrailingTransparentColorsOnN() {
-        val result = makeTransparentColors(
-            listOf(Color.Red, Color.Green, Color.Transparent, Color.Transparent),
-            1
-        )
+        val result =
+            makeTransparentColors(
+                listOf(Color.Red, Color.Green, Color.Transparent, Color.Transparent),
+                1
+            )
         assertSameColors(
             listOf(
                 Color.Red,
@@ -262,10 +250,11 @@
     @Test
     @SdkSuppress(maxSdkVersion = Build.VERSION_CODES.N_MR1)
     fun testMultipleLeadingTransparentColorsReturnsPreviousOnN() {
-        val result = makeTransparentColors(
-            listOf(Color.Transparent, Color.Transparent, Color.Blue, Color.Magenta),
-            1
-        )
+        val result =
+            makeTransparentColors(
+                listOf(Color.Transparent, Color.Transparent, Color.Blue, Color.Magenta),
+                1
+            )
         assertSameColors(
             listOf(
                 Color.Transparent,
@@ -281,16 +270,17 @@
     @Test
     @SdkSuppress(maxSdkVersion = Build.VERSION_CODES.N_MR1)
     fun testTransparentAlternatingColors() {
-        val result = makeTransparentColors(
-            listOf(
-                Color.Transparent,
-                Color.Red,
-                Color.Transparent,
-                Color.Blue,
-                Color.Transparent
-            ),
-            1
-        )
+        val result =
+            makeTransparentColors(
+                listOf(
+                    Color.Transparent,
+                    Color.Red,
+                    Color.Transparent,
+                    Color.Blue,
+                    Color.Transparent
+                ),
+                1
+            )
         assertSameColors(
             listOf(
                 Color.Red.copy(alpha = 0f),
@@ -307,21 +297,13 @@
     @Test
     @SdkSuppress(maxSdkVersion = Build.VERSION_CODES.N_MR1)
     fun testAllTransparentColorsProduceTransparentOnN() {
-        val result = makeTransparentColors(
-            listOf(
-                Color.Transparent,
-                Color.Transparent,
-                Color.Transparent
-            ),
-            1
-        )
+        val result =
+            makeTransparentColors(
+                listOf(Color.Transparent, Color.Transparent, Color.Transparent),
+                1
+            )
         assertSameColors(
-            listOf(
-                Color.Transparent,
-                Color.Transparent,
-                Color.Transparent,
-                Color.Transparent
-            ),
+            listOf(Color.Transparent, Color.Transparent, Color.Transparent, Color.Transparent),
             result
         )
     }
@@ -329,22 +311,12 @@
     @Test
     @SdkSuppress(minSdkVersion = Build.VERSION_CODES.O)
     fun testAllTransparentColorsProduceTransparentOnO() {
-        val result = makeTransparentColors(
-            listOf(
-                Color.Transparent,
-                Color.Transparent,
-                Color.Transparent
-            ),
-            0 // Always 0 on O+
-        )
-        assertSameColors(
-            listOf(
-                Color.Transparent,
-                Color.Transparent,
-                Color.Transparent
-            ),
-            result
-        )
+        val result =
+            makeTransparentColors(
+                listOf(Color.Transparent, Color.Transparent, Color.Transparent),
+                0 // Always 0 on O+
+            )
+        assertSameColors(listOf(Color.Transparent, Color.Transparent, Color.Transparent), result)
     }
 
     private fun assertSameStops(expected: List<Float>, actual: FloatArray) {
diff --git a/compose/ui/ui-graphics/src/androidInstrumentedTest/kotlin/androidx/compose/ui/graphics/ImageBitmapTest.kt b/compose/ui/ui-graphics/src/androidInstrumentedTest/kotlin/androidx/compose/ui/graphics/ImageBitmapTest.kt
index 13a71a7..56a474d 100644
--- a/compose/ui/ui-graphics/src/androidInstrumentedTest/kotlin/androidx/compose/ui/graphics/ImageBitmapTest.kt
+++ b/compose/ui/ui-graphics/src/androidInstrumentedTest/kotlin/androidx/compose/ui/graphics/ImageBitmapTest.kt
@@ -31,13 +31,14 @@
     @Test
     fun testCreatedImage() {
         val cs = ColorSpaces.Srgb
-        val image = ImageBitmap(
-            width = 10,
-            height = 20,
-            config = ImageBitmapConfig.Argb8888,
-            hasAlpha = false,
-            colorSpace = cs
-        )
+        val image =
+            ImageBitmap(
+                width = 10,
+                height = 20,
+                config = ImageBitmapConfig.Argb8888,
+                hasAlpha = false,
+                colorSpace = cs
+            )
 
         assertEquals(10, image.width)
         assertEquals(20, image.height)
diff --git a/compose/ui/ui-graphics/src/androidInstrumentedTest/kotlin/androidx/compose/ui/graphics/OutlineTest.kt b/compose/ui/ui-graphics/src/androidInstrumentedTest/kotlin/androidx/compose/ui/graphics/OutlineTest.kt
index c106240..2686d99 100644
--- a/compose/ui/ui-graphics/src/androidInstrumentedTest/kotlin/androidx/compose/ui/graphics/OutlineTest.kt
+++ b/compose/ui/ui-graphics/src/androidInstrumentedTest/kotlin/androidx/compose/ui/graphics/OutlineTest.kt
@@ -38,22 +38,21 @@
 
     @Test
     fun testRoundRectOutlineBounds() {
-        val roundRectOutline = Outline.Rounded(
-            RoundRect(5f, 10f, 15f, 20f, CornerRadius(7f))
-        )
+        val roundRectOutline = Outline.Rounded(RoundRect(5f, 10f, 15f, 20f, CornerRadius(7f)))
         assertEquals(Rect(5f, 10f, 15f, 20f), roundRectOutline.bounds)
     }
 
     @Test
     fun testPathOutlineBounds() {
-        val pathOutline = Outline.Generic(
-            Path().apply {
-                moveTo(5f, 15f)
-                lineTo(100f, 200f)
-                lineTo(0f, 200f)
-                close()
-            }
-        )
+        val pathOutline =
+            Outline.Generic(
+                Path().apply {
+                    moveTo(5f, 15f)
+                    lineTo(100f, 200f)
+                    lineTo(0f, 200f)
+                    close()
+                }
+            )
         assertEquals(Rect(0f, 15f, 100f, 200f), pathOutline.bounds)
     }
 
@@ -68,27 +67,23 @@
 
     @Test
     fun testRoundRectOutlineEquality() {
-        val roundRectOutline = Outline.Rounded(
-            RoundRect(5f, 10f, 15f, 20f, CornerRadius(7f))
-        )
-        val equalRoundRectOutline = Outline.Rounded(
-            RoundRect(5f, 10f, 15f, 20f, CornerRadius(7f))
-        )
-        val differentRoundRectOutline = Outline.Rounded(
-            RoundRect(20f, 15f, 10f, 5f, CornerRadius(3f))
-        )
+        val roundRectOutline = Outline.Rounded(RoundRect(5f, 10f, 15f, 20f, CornerRadius(7f)))
+        val equalRoundRectOutline = Outline.Rounded(RoundRect(5f, 10f, 15f, 20f, CornerRadius(7f)))
+        val differentRoundRectOutline =
+            Outline.Rounded(RoundRect(20f, 15f, 10f, 5f, CornerRadius(3f)))
         assertEquals(roundRectOutline, equalRoundRectOutline)
         assertNotEquals(roundRectOutline, differentRoundRectOutline)
     }
 
     @Test
     fun testPathOutlineEquality() {
-        val path = Path().apply {
-            moveTo(5f, 15f)
-            lineTo(100f, 200f)
-            lineTo(0f, 200f)
-            close()
-        }
+        val path =
+            Path().apply {
+                moveTo(5f, 15f)
+                lineTo(100f, 200f)
+                lineTo(0f, 200f)
+                close()
+            }
         val pathOutline = Outline.Generic(path)
         val pathOutline2 = Outline.Generic(path)
 
diff --git a/compose/ui/ui-graphics/src/androidInstrumentedTest/kotlin/androidx/compose/ui/graphics/PaintTest.kt b/compose/ui/ui-graphics/src/androidInstrumentedTest/kotlin/androidx/compose/ui/graphics/PaintTest.kt
index 8c2bab9..717ea76 100644
--- a/compose/ui/ui-graphics/src/androidInstrumentedTest/kotlin/androidx/compose/ui/graphics/PaintTest.kt
+++ b/compose/ui/ui-graphics/src/androidInstrumentedTest/kotlin/androidx/compose/ui/graphics/PaintTest.kt
@@ -77,15 +77,16 @@
         val composePaint = nativePaint.asComposePaint()
         val green = android.graphics.Color.GREEN
         val red = android.graphics.Color.RED
-        val shader = android.graphics.LinearGradient(
-            0f,
-            0f,
-            1f,
-            1f,
-            green,
-            red,
-            android.graphics.Shader.TileMode.MIRROR
-        )
+        val shader =
+            android.graphics.LinearGradient(
+                0f,
+                0f,
+                1f,
+                1f,
+                green,
+                red,
+                android.graphics.Shader.TileMode.MIRROR
+            )
         composePaint.shader = shader
         assertSame(composePaint.shader, nativePaint.shader)
     }
diff --git a/compose/ui/ui-graphics/src/androidInstrumentedTest/kotlin/androidx/compose/ui/graphics/PathDirectionTest.kt b/compose/ui/ui-graphics/src/androidInstrumentedTest/kotlin/androidx/compose/ui/graphics/PathDirectionTest.kt
index 9144fd9..ca1a45c 100644
--- a/compose/ui/ui-graphics/src/androidInstrumentedTest/kotlin/androidx/compose/ui/graphics/PathDirectionTest.kt
+++ b/compose/ui/ui-graphics/src/androidInstrumentedTest/kotlin/androidx/compose/ui/graphics/PathDirectionTest.kt
@@ -70,18 +70,12 @@
     @Test
     fun directionForClosedLines() {
         val path = Path()
-        path.addRect(
-            Rect(10.0f, 10.0f, 40.0f, 40.0f),
-            Path.Direction.Clockwise
-        )
+        path.addRect(Rect(10.0f, 10.0f, 40.0f, 40.0f), Path.Direction.Clockwise)
         assertEquals(Path.Direction.Clockwise, path.computeDirection())
 
         path.rewind()
 
-        path.addRect(
-            Rect(100.0f, 10.0f, 140.0f, 40.0f),
-            Path.Direction.CounterClockwise
-        )
+        path.addRect(Rect(100.0f, 10.0f, 140.0f, 40.0f), Path.Direction.CounterClockwise)
 
         assertEquals(Path.Direction.CounterClockwise, path.computeDirection())
     }
@@ -89,15 +83,9 @@
     @Test
     fun directionForMultipleContours() {
         val path = Path()
-        path.addRect(
-            Rect(10.0f, 10.0f, 40.0f, 40.0f),
-            Path.Direction.Clockwise
-        )
+        path.addRect(Rect(10.0f, 10.0f, 40.0f, 40.0f), Path.Direction.Clockwise)
 
-        path.addRect(
-            Rect(100.0f, 10.0f, 140.0f, 40.0f),
-            Path.Direction.CounterClockwise
-        )
+        path.addRect(Rect(100.0f, 10.0f, 140.0f, 40.0f), Path.Direction.CounterClockwise)
 
         assertEquals(Path.Direction.Clockwise, path.computeDirection())
     }
diff --git a/compose/ui/ui-graphics/src/androidInstrumentedTest/kotlin/androidx/compose/ui/graphics/PathDivisionTest.kt b/compose/ui/ui-graphics/src/androidInstrumentedTest/kotlin/androidx/compose/ui/graphics/PathDivisionTest.kt
index d9e509f..72fb064 100644
--- a/compose/ui/ui-graphics/src/androidInstrumentedTest/kotlin/androidx/compose/ui/graphics/PathDivisionTest.kt
+++ b/compose/ui/ui-graphics/src/androidInstrumentedTest/kotlin/androidx/compose/ui/graphics/PathDivisionTest.kt
@@ -40,21 +40,21 @@
 
     @Test
     fun divide() {
-        val paths = Path().apply {
-            addRect(Rect(0.0f, 0.0f, 10.0f, 10.0f), Path.Direction.Clockwise)
-            addRect(Rect(20.0f, 20.0f, 50.0f, 50.0f), Path.Direction.Clockwise)
-        }.divide()
+        val paths =
+            Path()
+                .apply {
+                    addRect(Rect(0.0f, 0.0f, 10.0f, 10.0f), Path.Direction.Clockwise)
+                    addRect(Rect(20.0f, 20.0f, 50.0f, 50.0f), Path.Direction.Clockwise)
+                }
+                .divide()
 
         assertEquals(2, paths.size)
 
-        val sourcePaths = listOf(
-            Path().apply {
-                addRect(Rect(0.0f, 0.0f, 10.0f, 10.0f), Path.Direction.Clockwise)
-            },
-            Path().apply {
-                addRect(Rect(20.0f, 20.0f, 50.0f, 50.0f), Path.Direction.Clockwise)
-            }
-        )
+        val sourcePaths =
+            listOf(
+                Path().apply { addRect(Rect(0.0f, 0.0f, 10.0f, 10.0f), Path.Direction.Clockwise) },
+                Path().apply { addRect(Rect(20.0f, 20.0f, 50.0f, 50.0f), Path.Direction.Clockwise) }
+            )
 
         val points1 = FloatArray(8)
         val points2 = FloatArray(8)
@@ -69,12 +69,15 @@
 
     @Test
     fun divideWithEmptyContour() {
-        val paths = Path().apply {
-            addRect(Rect(0.0f, 0.0f, 10.0f, 10.0f), Path.Direction.Clockwise)
-            moveTo(10.0f, 10.0f)
-            moveTo(100.0f, 100.0f)
-            addRect(Rect(20.0f, 20.0f, 50.0f, 50.0f), Path.Direction.Clockwise)
-        }.divide()
+        val paths =
+            Path()
+                .apply {
+                    addRect(Rect(0.0f, 0.0f, 10.0f, 10.0f), Path.Direction.Clockwise)
+                    moveTo(10.0f, 10.0f)
+                    moveTo(100.0f, 100.0f)
+                    addRect(Rect(20.0f, 20.0f, 50.0f, 50.0f), Path.Direction.Clockwise)
+                }
+                .divide()
 
         assertEquals(2, paths.size)
     }
diff --git a/compose/ui/ui-graphics/src/androidInstrumentedTest/kotlin/androidx/compose/ui/graphics/PathIteratorTest.kt b/compose/ui/ui-graphics/src/androidInstrumentedTest/kotlin/androidx/compose/ui/graphics/PathIteratorTest.kt
index 80ec203..66ffbd1 100644
--- a/compose/ui/ui-graphics/src/androidInstrumentedTest/kotlin/androidx/compose/ui/graphics/PathIteratorTest.kt
+++ b/compose/ui/ui-graphics/src/androidInstrumentedTest/kotlin/androidx/compose/ui/graphics/PathIteratorTest.kt
@@ -49,24 +49,18 @@
 
     @Test
     fun nonEmptyIterator() {
-        val path = Path().apply {
-            moveTo(1.0f, 1.0f)
-            lineTo(2.0f, 2.0f)
-            close()
-        }
+        val path =
+            Path().apply {
+                moveTo(1.0f, 1.0f)
+                lineTo(2.0f, 2.0f)
+                close()
+            }
 
         val iterator = path.iterator()
         assertTrue(iterator.hasNext())
 
-        val types = arrayOf(
-            PathSegment.Type.Move,
-            PathSegment.Type.Line,
-            PathSegment.Type.Close
-        )
-        val points = arrayOf(
-            Offset(1.0f, 1.0f),
-            Offset(2.0f, 2.0f)
-        )
+        val types = arrayOf(PathSegment.Type.Move, PathSegment.Type.Line, PathSegment.Type.Close)
+        val points = arrayOf(Offset(1.0f, 1.0f), Offset(2.0f, 2.0f))
 
         var count = 0
         for (segment in path) {
@@ -79,7 +73,7 @@
                     assertEquals(points[count - 1], Offset(segment.points[0], segment.points[1]))
                     assertEquals(points[count], Offset(segment.points[2], segment.points[3]))
                 }
-                else -> { }
+                else -> {}
             }
             count++
         }
@@ -89,18 +83,17 @@
 
     @Test
     fun iteratorStyles() {
-        val path = Path().apply {
-            moveTo(1.0f, 1.0f)
-            lineTo(2.0f, 2.0f)
-            cubicTo(3.0f, 3.0f, 4.0f, 4.0f, 5.0f, 5.0f)
-            quadraticTo(7.0f, 7.0f, 8.0f, 8.0f)
-            moveTo(10.0f, 10.0f)
-            // addRoundRect() will generate conic curves on certain API levels
-            addRoundRect(
-                RoundRect(12.0f, 12.0f, 36.0f, 36.0f, 8.0f, 8.0f)
-            )
-            close()
-        }
+        val path =
+            Path().apply {
+                moveTo(1.0f, 1.0f)
+                lineTo(2.0f, 2.0f)
+                cubicTo(3.0f, 3.0f, 4.0f, 4.0f, 5.0f, 5.0f)
+                quadraticTo(7.0f, 7.0f, 8.0f, 8.0f)
+                moveTo(10.0f, 10.0f)
+                // addRoundRect() will generate conic curves on certain API levels
+                addRoundRect(RoundRect(12.0f, 12.0f, 36.0f, 36.0f, 8.0f, 8.0f))
+                close()
+            }
 
         val iterator1 = path.iterator(PathIterator.ConicEvaluation.AsConic)
         val iterator2 = path.iterator(PathIterator.ConicEvaluation.AsConic)
@@ -159,17 +152,15 @@
                     assertPointEquals(Offset(p[4], p[5]), points2, 6)
                     assertPointEquals(Offset(p[6], p[7]), points2, 7)
                 }
-                PathSegment.Type.Close -> { }
-                PathSegment.Type.Done -> { }
+                PathSegment.Type.Close -> {}
+                PathSegment.Type.Done -> {}
             }
         }
     }
 
     @Test
     fun done() {
-        val path = Path().apply {
-            close()
-        }
+        val path = Path().apply { close() }
 
         val segment = path.iterator().next()
 
@@ -180,10 +171,11 @@
 
     @Test
     fun close() {
-        val path = Path().apply {
-            lineTo(10.0f, 12.0f)
-            close()
-        }
+        val path =
+            Path().apply {
+                lineTo(10.0f, 12.0f)
+                close()
+            }
 
         val iterator = path.iterator()
         // Swallow the move
@@ -200,9 +192,7 @@
 
     @Test
     fun moveTo() {
-        val path = Path().apply {
-            moveTo(10.0f, 12.0f)
-        }
+        val path = Path().apply { moveTo(10.0f, 12.0f) }
 
         val segment = path.iterator().next()
 
@@ -215,10 +205,11 @@
 
     @Test
     fun lineTo() {
-        val path = Path().apply {
-            moveTo(4.0f, 6.0f)
-            lineTo(10.0f, 12.0f)
-        }
+        val path =
+            Path().apply {
+                moveTo(4.0f, 6.0f)
+                lineTo(10.0f, 12.0f)
+            }
 
         val iterator = path.iterator()
         // Swallow the move
@@ -236,10 +227,11 @@
 
     @Test
     fun quadraticTo() {
-        val path = Path().apply {
-            moveTo(4.0f, 6.0f)
-            quadraticTo(10.0f, 12.0f, 20.0f, 24.0f)
-        }
+        val path =
+            Path().apply {
+                moveTo(4.0f, 6.0f)
+                quadraticTo(10.0f, 12.0f, 20.0f, 24.0f)
+            }
 
         val iterator = path.iterator()
         // Swallow the move
@@ -258,10 +250,11 @@
 
     @Test
     fun cubicTo() {
-        val path = Path().apply {
-            moveTo(4.0f, 6.0f)
-            cubicTo(10.0f, 12.0f, 20.0f, 24.0f, 30.0f, 36.0f)
-        }
+        val path =
+            Path().apply {
+                moveTo(4.0f, 6.0f)
+                cubicTo(10.0f, 12.0f, 20.0f, 24.0f, 30.0f, 36.0f)
+            }
 
         val iterator = path.iterator()
         // Swallow the move
@@ -282,9 +275,8 @@
     @Test
     fun conicTo() {
         if (Build.VERSION.SDK_INT >= 25) {
-            val path = Path().apply {
-                addRoundRect(RoundRect(12.0f, 12.0f, 24.0f, 24.0f, 8.0f, 8.0f))
-            }
+            val path =
+                Path().apply { addRoundRect(RoundRect(12.0f, 12.0f, 24.0f, 24.0f, 8.0f, 8.0f)) }
 
             val iterator = path.iterator(PathIterator.ConicEvaluation.AsConic)
             // Swallow the move
@@ -305,9 +297,7 @@
 
     @Test
     fun conicAsQuadratics() {
-        val path = Path().apply {
-            addRoundRect(RoundRect(12.0f, 12.0f, 24.0f, 24.0f, 8.0f, 8.0f))
-        }
+        val path = Path().apply { addRoundRect(RoundRect(12.0f, 12.0f, 24.0f, 24.0f, 8.0f, 8.0f)) }
 
         for (segment in path) {
             if (segment.type == PathSegment.Type.Conic) fail("Found conic, none expected: $segment")
diff --git a/compose/ui/ui-graphics/src/androidInstrumentedTest/kotlin/androidx/compose/ui/graphics/PathMeasureTest.kt b/compose/ui/ui-graphics/src/androidInstrumentedTest/kotlin/androidx/compose/ui/graphics/PathMeasureTest.kt
index e657bea..e201d7c 100644
--- a/compose/ui/ui-graphics/src/androidInstrumentedTest/kotlin/androidx/compose/ui/graphics/PathMeasureTest.kt
+++ b/compose/ui/ui-graphics/src/androidInstrumentedTest/kotlin/androidx/compose/ui/graphics/PathMeasureTest.kt
@@ -30,9 +30,7 @@
     fun testGetPositionAndTangent() {
         val width = 100f
         val height = 100f
-        val path = Path().apply {
-            lineTo(width, height)
-        }
+        val path = Path().apply { lineTo(width, height) }
         val pathMeasure = PathMeasure()
 
         pathMeasure.setPath(path, false)
diff --git a/compose/ui/ui-graphics/src/androidInstrumentedTest/kotlin/androidx/compose/ui/graphics/PathReversionTest.kt b/compose/ui/ui-graphics/src/androidInstrumentedTest/kotlin/androidx/compose/ui/graphics/PathReversionTest.kt
index dda072e..14bac1b 100644
--- a/compose/ui/ui-graphics/src/androidInstrumentedTest/kotlin/androidx/compose/ui/graphics/PathReversionTest.kt
+++ b/compose/ui/ui-graphics/src/androidInstrumentedTest/kotlin/androidx/compose/ui/graphics/PathReversionTest.kt
@@ -40,9 +40,7 @@
 
     @Test
     fun singleMove() {
-        val path = Path().apply {
-            moveTo(10.0f, 10.0f)
-        }.reverse()
+        val path = Path().apply { moveTo(10.0f, 10.0f) }.reverse()
 
         val iterator = path.iterator()
         assertTrue(iterator.hasNext())
@@ -54,10 +52,13 @@
 
     @Test
     fun lineTo() {
-        val path = Path().apply {
-            moveTo(10.0f, 10.0f)
-            lineTo(20.0f, 20.0f)
-        }.reverse()
+        val path =
+            Path()
+                .apply {
+                    moveTo(10.0f, 10.0f)
+                    lineTo(20.0f, 20.0f)
+                }
+                .reverse()
 
         val iterator = path.iterator()
         assertTrue(iterator.hasNext())
@@ -75,12 +76,15 @@
 
     @Test
     fun close() {
-        val path = Path().apply {
-            moveTo(10.0f, 10.0f)
-            lineTo(20.0f, 20.0f)
-            lineTo(10.0f, 30.0f)
-            close()
-        }.reverse()
+        val path =
+            Path()
+                .apply {
+                    moveTo(10.0f, 10.0f)
+                    lineTo(20.0f, 20.0f)
+                    lineTo(10.0f, 30.0f)
+                    close()
+                }
+                .reverse()
 
         val iterator = path.iterator()
         assertTrue(iterator.hasNext())
@@ -105,16 +109,19 @@
 
     @Test
     fun multipleContours() {
-        val path = Path().apply {
-            moveTo(10.0f, 10.0f)
-            lineTo(20.0f, 20.0f)
-            lineTo(10.0f, 30.0f)
-            close()
+        val path =
+            Path()
+                .apply {
+                    moveTo(10.0f, 10.0f)
+                    lineTo(20.0f, 20.0f)
+                    lineTo(10.0f, 30.0f)
+                    close()
 
-            moveTo(50.0f, 50.0f)
-            lineTo(70.0f, 70.0f)
-            lineTo(50.0f, 90.0f)
-        }.reverse()
+                    moveTo(50.0f, 50.0f)
+                    lineTo(70.0f, 70.0f)
+                    lineTo(50.0f, 90.0f)
+                }
+                .reverse()
 
         val iterator = path.iterator()
         assertTrue(iterator.hasNext())
@@ -164,26 +171,25 @@
         val reversed = path.reverse()
 
         assertTrue(
-            path.divide().zip(reversed.divide().reversed()) { a, b ->
-                a.computeDirection() != b.computeDirection()
-            }.all { it }
+            path
+                .divide()
+                .zip(reversed.divide().reversed()) { a, b ->
+                    a.computeDirection() != b.computeDirection()
+                }
+                .all { it }
         )
     }
 
     @Test
     fun pixelComparison() {
-        val paint = Paint().apply {
-            style = Paint.Style.FILL
-            color = Color.RED
-            isAntiAlias = false
-        }
+        val paint =
+            Paint().apply {
+                style = Paint.Style.FILL
+                color = Color.RED
+                isAntiAlias = false
+            }
 
-        for (svg in listOf(
-            SvgShape.Cubics,
-            SvgShape.Quads,
-            SvgShape.Heart,
-            SvgShape.Lines
-        )) {
+        for (svg in listOf(SvgShape.Cubics, SvgShape.Quads, SvgShape.Heart, SvgShape.Lines)) {
             val path = createSvgPath(svg)
             val reversed = path.reverse()
 
@@ -191,12 +197,14 @@
             val bounds2 = reversed.getBounds().roundToIntRect()
             assertEquals(bounds1, bounds2)
 
-            val reference = createBitmap(bounds1.width, bounds1.height).applyCanvas {
-                drawPath(path.asAndroidPath(), paint)
-            }
-            val result = createBitmap(bounds2.width, bounds2.height).applyCanvas {
-                drawPath(reversed.asAndroidPath(), paint)
-            }
+            val reference =
+                createBitmap(bounds1.width, bounds1.height).applyCanvas {
+                    drawPath(path.asAndroidPath(), paint)
+                }
+            val result =
+                createBitmap(bounds2.width, bounds2.height).applyCanvas {
+                    drawPath(reversed.asAndroidPath(), paint)
+                }
 
             compareBitmaps(reference, result, 0)
         }
diff --git a/compose/ui/ui-graphics/src/androidInstrumentedTest/kotlin/androidx/compose/ui/graphics/PathSvgTest.kt b/compose/ui/ui-graphics/src/androidInstrumentedTest/kotlin/androidx/compose/ui/graphics/PathSvgTest.kt
index c68723b..075eb2c 100644
--- a/compose/ui/ui-graphics/src/androidInstrumentedTest/kotlin/androidx/compose/ui/graphics/PathSvgTest.kt
+++ b/compose/ui/ui-graphics/src/androidInstrumentedTest/kotlin/androidx/compose/ui/graphics/PathSvgTest.kt
@@ -37,7 +37,8 @@
             <svg xmlns="http://www.w3.org/2000/svg" viewBox="0.0 0.0 0.0 0.0">
             </svg>
 
-            """.trimIndent(),
+            """
+                .trimIndent(),
             Path().toSvg(asDocument = true)
         )
 
@@ -55,17 +56,21 @@
               <path d="M10.0 10.0"/>
             </svg>
 
-            """.trimIndent(),
+            """
+                .trimIndent(),
             svg
         )
     }
 
     @Test
     fun twoPaths() {
-        val svg = Path().apply {
-            addRect(Rect(0.0f, 0.0f, 10.0f, 10.0f), Path.Direction.Clockwise)
-            addRect(Rect(20.0f, 20.0f, 50.0f, 50.0f), Path.Direction.Clockwise)
-        }.toSvg(asDocument = true)
+        val svg =
+            Path()
+                .apply {
+                    addRect(Rect(0.0f, 0.0f, 10.0f, 10.0f), Path.Direction.Clockwise)
+                    addRect(Rect(20.0f, 20.0f, 50.0f, 50.0f), Path.Direction.Clockwise)
+                }
+                .toSvg(asDocument = true)
 
         assertEquals(
             """
@@ -73,18 +78,22 @@
               <path d="M0.0 0.0L10.0 0.0 10.0 10.0 0.0 10.0ZM20.0 20.0L50.0 20.0 50.0 50.0 20.0 50.0Z"/>
             </svg>
 
-            """.trimIndent(),
+            """
+                .trimIndent(),
             svg
         )
     }
 
     @Test
     fun bezier() {
-        val svg = Path().apply {
-            moveTo(10.0f, 10.0f)
-            cubicTo(20.0f, 20.0f, 30.0f, 30.0f, 40.0f, 40.0f)
-            quadraticTo(50.0f, 50.0f, 60.0f, 60.0f)
-        }.toSvg(asDocument = true)
+        val svg =
+            Path()
+                .apply {
+                    moveTo(10.0f, 10.0f)
+                    cubicTo(20.0f, 20.0f, 30.0f, 30.0f, 40.0f, 40.0f)
+                    quadraticTo(50.0f, 50.0f, 60.0f, 60.0f)
+                }
+                .toSvg(asDocument = true)
 
         assertEquals(
             """
@@ -92,17 +101,21 @@
               <path d="M10.0 10.0C20.0 20.0 30.0 30.0 40.0 40.0Q50.0 50.0 60.0 60.0"/>
             </svg>
 
-            """.trimIndent(),
+            """
+                .trimIndent(),
             svg
         )
     }
 
     @Test
     fun dataOnly() {
-        val svg = Path().apply {
-            addRect(Rect(0.0f, 0.0f, 10.0f, 10.0f), Path.Direction.Clockwise)
-            addRect(Rect(20.0f, 20.0f, 50.0f, 50.0f), Path.Direction.Clockwise)
-        }.toSvg()
+        val svg =
+            Path()
+                .apply {
+                    addRect(Rect(0.0f, 0.0f, 10.0f, 10.0f), Path.Direction.Clockwise)
+                    addRect(Rect(20.0f, 20.0f, 50.0f, 50.0f), Path.Direction.Clockwise)
+                }
+                .toSvg()
 
         assertEquals(
             "M0.0 0.0L10.0 0.0 10.0 10.0 0.0 10.0ZM20.0 20.0L50.0 20.0 50.0 50.0 20.0 50.0Z",
@@ -112,10 +125,11 @@
 
     @Test
     fun hole() {
-        val hole = Path().apply {
-            addRect(Rect(0.0f, 0.0f, 80.0f, 80.0f), Path.Direction.Clockwise)
-            addRect(Rect(20.0f, 20.0f, 50.0f, 50.0f), Path.Direction.Clockwise)
-        }
+        val hole =
+            Path().apply {
+                addRect(Rect(0.0f, 0.0f, 80.0f, 80.0f), Path.Direction.Clockwise)
+                addRect(Rect(20.0f, 20.0f, 50.0f, 50.0f), Path.Direction.Clockwise)
+            }
 
         assertEquals(
             """
@@ -123,7 +137,8 @@
               <path d="M0.0 0.0L80.0 0.0 80.0 80.0 0.0 80.0ZM20.0 20.0L50.0 20.0 50.0 50.0 20.0 50.0Z"/>
             </svg>
 
-            """.trimIndent(),
+            """
+                .trimIndent(),
             hole.toSvg(asDocument = true)
         )
 
@@ -135,20 +150,25 @@
               <path fill-rule="evenodd" d="M0.0 0.0L80.0 0.0 80.0 80.0 0.0 80.0ZM20.0 20.0L50.0 20.0 50.0 50.0 20.0 50.0Z"/>
             </svg>
 
-            """.trimIndent(),
+            """
+                .trimIndent(),
             hole.toSvg(asDocument = true)
         )
     }
 
     @Test
     fun addSvg() {
-        val twoRects = Path().apply {
-            addSvg("M0.0 0.0L10.0 0.0 10.0 10.0 0.0 10.0ZM20.0 20.0L50.0 20.0 50.0 50.0 20.0 50.0Z")
-        }
-        val reference = Path().apply {
-            addRect(Rect(0.0f, 0.0f, 10.0f, 10.0f), Path.Direction.Clockwise)
-            addRect(Rect(20.0f, 20.0f, 50.0f, 50.0f), Path.Direction.Clockwise)
-        }
+        val twoRects =
+            Path().apply {
+                addSvg(
+                    "M0.0 0.0L10.0 0.0 10.0 10.0 0.0 10.0ZM20.0 20.0L50.0 20.0 50.0 50.0 20.0 50.0Z"
+                )
+            }
+        val reference =
+            Path().apply {
+                addRect(Rect(0.0f, 0.0f, 10.0f, 10.0f), Path.Direction.Clockwise)
+                addRect(Rect(20.0f, 20.0f, 50.0f, 50.0f), Path.Direction.Clockwise)
+            }
         assertPathEquals(reference, twoRects)
     }
 
@@ -162,16 +182,18 @@
 
     @Test
     fun roundTrip() {
-        val original = Path().apply {
-            addRect(Rect(0.0f, 0.0f, 10.0f, 10.0f), Path.Direction.Clockwise)
-            addRect(Rect(20.0f, 20.0f, 50.0f, 50.0f), Path.Direction.Clockwise)
-        }
+        val original =
+            Path().apply {
+                addRect(Rect(0.0f, 0.0f, 10.0f, 10.0f), Path.Direction.Clockwise)
+                addRect(Rect(20.0f, 20.0f, 50.0f, 50.0f), Path.Direction.Clockwise)
+            }
         val svg = original.toSvg()
         val path = Path().apply { addSvg(svg) }
 
         assertPathEquals(original, path)
     }
 }
+
 /* ktlint-enable max-line-length */
 
 private fun assertPathEquals(a: Path, b: Path) {
diff --git a/compose/ui/ui-graphics/src/androidInstrumentedTest/kotlin/androidx/compose/ui/graphics/PathTest.kt b/compose/ui/ui-graphics/src/androidInstrumentedTest/kotlin/androidx/compose/ui/graphics/PathTest.kt
index 80e84b9..04293e3 100644
--- a/compose/ui/ui-graphics/src/androidInstrumentedTest/kotlin/androidx/compose/ui/graphics/PathTest.kt
+++ b/compose/ui/ui-graphics/src/androidInstrumentedTest/kotlin/androidx/compose/ui/graphics/PathTest.kt
@@ -38,55 +38,43 @@
         val height = 100
         val image = ImageBitmap(width, height)
         val canvas = Canvas(image)
-        val path1 = Path().apply {
-            addArcRad(
-                Rect(Offset.Zero, Size(width.toFloat(), height.toFloat())),
-                0.0f,
-                PI.toFloat() / 2
-            )
-        }
+        val path1 =
+            Path().apply {
+                addArcRad(
+                    Rect(Offset.Zero, Size(width.toFloat(), height.toFloat())),
+                    0.0f,
+                    PI.toFloat() / 2
+                )
+            }
 
         val arcColor = Color.Cyan
         val arcPaint = Paint().apply { color = arcColor }
         canvas.drawPath(path1, arcPaint)
 
-        val path2 = Path().apply {
-            arcToRad(
-                Rect(Offset(0.0f, 0.0f), Size(width.toFloat(), height.toFloat())),
-                PI.toFloat(),
-                PI.toFloat() / 2,
-                false
-            )
-            close()
-        }
+        val path2 =
+            Path().apply {
+                arcToRad(
+                    Rect(Offset(0.0f, 0.0f), Size(width.toFloat(), height.toFloat())),
+                    PI.toFloat(),
+                    PI.toFloat() / 2,
+                    false
+                )
+                close()
+            }
 
         canvas.drawPath(path2, arcPaint)
 
         val pixelmap = image.toPixelMap()
         val x = (50.0 * Math.cos(PI / 4)).toInt()
-        assertEquals(
-            arcColor,
-            pixelmap[
-                width / 2 + x - 1,
-                height / 2 + x - 1
-            ]
-        )
+        assertEquals(arcColor, pixelmap[width / 2 + x - 1, height / 2 + x - 1])
 
-        assertEquals(
-            arcColor,
-            pixelmap[
-                width / 2 - x,
-                height / 2 - x
-            ]
-        )
+        assertEquals(arcColor, pixelmap[width / 2 - x, height / 2 - x])
     }
 
     @Test
     fun testRewindPath() {
         val androidPath = TestAndroidPath()
-        val path = androidPath.asComposePath().apply {
-            addRect(Rect(0f, 0f, 100f, 200f))
-        }
+        val path = androidPath.asComposePath().apply { addRect(Rect(0f, 0f, 100f, 200f)) }
         assertFalse(path.isEmpty)
 
         path.rewind()
@@ -104,12 +92,11 @@
         val image = ImageBitmap(width, height)
         val canvas = Canvas(image)
 
-        val path = Path().apply {
-            addRect(Rect(0f, 0f, 50f, 50f))
-            transform(
-                Matrix().apply { translate(50f, 50f) }
-            )
-        }
+        val path =
+            Path().apply {
+                addRect(Rect(0f, 0f, 50f, 50f))
+                transform(Matrix().apply { translate(50f, 50f) })
+            }
 
         val paint = Paint().apply { color = Color.Black }
         canvas.drawRect(0f, 0f, width.toFloat(), height.toFloat(), paint)
@@ -130,18 +117,9 @@
 
     @Test
     fun testPathCopy() {
-        val r1 = Path().apply {
-            addRect(
-                Rect(0.0f, 0.0f, 10.0f, 10.0f),
-                Path.Direction.Clockwise
-            )
-        }
-        val r2 = r1.copy().apply {
-            addRect(
-                Rect(5.0f, 5.0f, 15.0f, 15.0f),
-                Path.Direction.Clockwise
-            )
-        }
+        val r1 = Path().apply { addRect(Rect(0.0f, 0.0f, 10.0f, 10.0f), Path.Direction.Clockwise) }
+        val r2 =
+            r1.copy().apply { addRect(Rect(5.0f, 5.0f, 15.0f, 15.0f), Path.Direction.Clockwise) }
 
         val r1Bounds = r1.getBounds()
 
diff --git a/compose/ui/ui-graphics/src/androidInstrumentedTest/kotlin/androidx/compose/ui/graphics/PathTestUtilities.kt b/compose/ui/ui-graphics/src/androidInstrumentedTest/kotlin/androidx/compose/ui/graphics/PathTestUtilities.kt
index cb2152f..50fa1bb 100644
--- a/compose/ui/ui-graphics/src/androidInstrumentedTest/kotlin/androidx/compose/ui/graphics/PathTestUtilities.kt
+++ b/compose/ui/ui-graphics/src/androidInstrumentedTest/kotlin/androidx/compose/ui/graphics/PathTestUtilities.kt
@@ -28,15 +28,16 @@
 import org.junit.Assert.assertArrayEquals
 
 /**
- * Creates a path from the specified shape, using the EvenOdd fill type to match SVG.
- * The returned path has its origin set to 0,0 for convenience.
+ * Creates a path from the specified shape, using the EvenOdd fill type to match SVG. The returned
+ * path has its origin set to 0,0 for convenience.
  */
-internal fun createSvgPath(svgShape: SvgShape) = Path().apply {
-    addSvg(svgShape.pathData)
-    val bounds = getBounds()
-    translate(Offset(-bounds.left, -bounds.top))
-    fillType = PathFillType.EvenOdd
-}
+internal fun createSvgPath(svgShape: SvgShape) =
+    Path().apply {
+        addSvg(svgShape.pathData)
+        val bounds = getBounds()
+        translate(Offset(-bounds.left, -bounds.top))
+        fillType = PathFillType.EvenOdd
+    }
 
 /* ktlint-disable max-line-length */
 internal enum class SvgShape(val pathData: String) {
@@ -56,17 +57,19 @@
         "M648.094,783.362C721.785,623.533 869.168,623.533 942.86,703.447C1016.55,783.362 1016.55,943.19 942.86,1103.02C891.275,1222.89 758.631,1342.76 648.094,1422.68C537.557,1342.76 404.913,1222.89 353.329,1103.02C279.638,943.19 279.638,783.362 353.329,703.447C427.021,623.533 574.403,623.533 648.094,783.362Z"
     ),
 }
+
 /* ktlint-enable max-line-length */
 
-private fun valueCountForType(type: PathSegment.Type) = when (type) {
-    PathSegment.Type.Move -> 2
-    PathSegment.Type.Line -> 4
-    PathSegment.Type.Quadratic -> 6
-    PathSegment.Type.Conic -> 8
-    PathSegment.Type.Cubic -> 8
-    PathSegment.Type.Close -> 0
-    PathSegment.Type.Done -> 0
-}
+private fun valueCountForType(type: PathSegment.Type) =
+    when (type) {
+        PathSegment.Type.Move -> 2
+        PathSegment.Type.Line -> 4
+        PathSegment.Type.Quadratic -> 6
+        PathSegment.Type.Conic -> 8
+        PathSegment.Type.Cubic -> 8
+        PathSegment.Type.Close -> 0
+        PathSegment.Type.Done -> 0
+    }
 
 internal fun assertPathEquals(
     expected: Path,
@@ -103,9 +106,9 @@
 }
 
 /**
- * Compares two bitmaps and fails the test if they are different. The two bitmaps
- * are considered different if more than [errorCount] pixels differ by more than
- * [threshold] in any of the RGB channels.
+ * Compares two bitmaps and fails the test if they are different. The two bitmaps are considered
+ * different if more than [errorCount] pixels differ by more than [threshold] in any of the RGB
+ * channels.
  */
 internal fun compareBitmaps(bitmap1: Bitmap, bitmap2: Bitmap, errorCount: Int, threshold: Int = 1) {
     assertEquals(bitmap1.width, bitmap2.width)
@@ -125,10 +128,7 @@
             val (r1, g1, b1, _) = p1[index]
             val (r2, g2, b2, _) = p2[index]
 
-            if (abs(r1 - r2) > threshold ||
-                abs(g1 - g2) > threshold ||
-                abs(b1 - b2) > threshold
-            ) {
+            if (abs(r1 - r2) > threshold || abs(g1 - g2) > threshold || abs(b1 - b2) > threshold) {
                 count++
             }
         }
diff --git a/compose/ui/ui-graphics/src/androidInstrumentedTest/kotlin/androidx/compose/ui/graphics/PixelMapTest.kt b/compose/ui/ui-graphics/src/androidInstrumentedTest/kotlin/androidx/compose/ui/graphics/PixelMapTest.kt
index 19f3fd1..fb19c0e 100644
--- a/compose/ui/ui-graphics/src/androidInstrumentedTest/kotlin/androidx/compose/ui/graphics/PixelMapTest.kt
+++ b/compose/ui/ui-graphics/src/androidInstrumentedTest/kotlin/androidx/compose/ui/graphics/PixelMapTest.kt
@@ -77,15 +77,16 @@
         val subsectionWidth = 3
         val subsectionHeight = 2
         val bufferOffset = 3
-        val pixelmap = asset.toPixelMap(
-            startX = 48,
-            startY = 49,
-            stride = 3,
-            width = 3,
-            height = 2,
-            buffer = IntArray(subsectionWidth * subsectionHeight + bufferOffset),
-            bufferOffset = bufferOffset
-        )
+        val pixelmap =
+            asset.toPixelMap(
+                startX = 48,
+                startY = 49,
+                stride = 3,
+                width = 3,
+                height = 2,
+                buffer = IntArray(subsectionWidth * subsectionHeight + bufferOffset),
+                bufferOffset = bufferOffset
+            )
 
         Assert.assertEquals(Color.Red, pixelmap[1, 0])
         Assert.assertEquals(Color.Blue, pixelmap[2, 0])
diff --git a/compose/ui/ui-graphics/src/androidInstrumentedTest/kotlin/androidx/compose/ui/graphics/RectHelperTest.kt b/compose/ui/ui-graphics/src/androidInstrumentedTest/kotlin/androidx/compose/ui/graphics/RectHelperTest.kt
index a2939bc..541b6d0 100644
--- a/compose/ui/ui-graphics/src/androidInstrumentedTest/kotlin/androidx/compose/ui/graphics/RectHelperTest.kt
+++ b/compose/ui/ui-graphics/src/androidInstrumentedTest/kotlin/androidx/compose/ui/graphics/RectHelperTest.kt
@@ -31,109 +31,46 @@
     @Suppress("DEPRECATION")
     @Test
     fun rectToAndroidRectTruncates() {
-        assertEquals(
-            android.graphics.Rect(
-                2,
-                3,
-                4,
-                5
-            ),
-            Rect(
-                2f,
-                3.1f,
-                4.5f,
-                5.99f
-            ).toAndroidRect()
-        )
+        assertEquals(android.graphics.Rect(2, 3, 4, 5), Rect(2f, 3.1f, 4.5f, 5.99f).toAndroidRect())
     }
 
     @Test
     fun rectToAndroidRectFConverts() {
         assertEquals(
-            android.graphics.RectF(
-                2f,
-                3.1f,
-                4.5f,
-                5.99f
-            ),
-            Rect(
-                2f,
-                3.1f,
-                4.5f,
-                5.99f
-            ).toAndroidRectF()
+            android.graphics.RectF(2f, 3.1f, 4.5f, 5.99f),
+            Rect(2f, 3.1f, 4.5f, 5.99f).toAndroidRectF()
         )
     }
 
     @Test
     fun androidRectToRectConverts() {
         assertEquals(
-            Rect(
-                2f,
-                3f,
-                4f,
-                5f
-            ),
-            android.graphics.Rect(
-                2,
-                3,
-                4,
-                5
-            ).toComposeRect(),
+            Rect(2f, 3f, 4f, 5f),
+            android.graphics.Rect(2, 3, 4, 5).toComposeRect(),
         )
     }
 
     @Test
     fun intRectToAndroidRectConverts() {
         assertEquals(
-            android.graphics.Rect(
-                2,
-                3,
-                4,
-                5
-            ),
-            IntRect(
-                2,
-                3,
-                4,
-                5
-            ).toAndroidRect(),
+            android.graphics.Rect(2, 3, 4, 5),
+            IntRect(2, 3, 4, 5).toAndroidRect(),
         )
     }
 
     @Test
     fun androidRectToIntRectConverts() {
         assertEquals(
-            IntRect(
-                2,
-                3,
-                4,
-                5
-            ),
-            android.graphics.Rect(
-                2,
-                3,
-                4,
-                5
-            ).toComposeIntRect(),
+            IntRect(2, 3, 4, 5),
+            android.graphics.Rect(2, 3, 4, 5).toComposeIntRect(),
         )
     }
 
     @Test
     fun androidRectFToRectConverts() {
         assertEquals(
-            Rect(
-                2.1f,
-                3.2f,
-                4.3f,
-                5.4f
-            ),
-            android.graphics.RectF(
-                2.1f,
-                3.2f,
-                4.3f,
-                5.4f
-            ).toComposeRect(),
+            Rect(2.1f, 3.2f, 4.3f, 5.4f),
+            android.graphics.RectF(2.1f, 3.2f, 4.3f, 5.4f).toComposeRect(),
         )
     }
 }
diff --git a/compose/ui/ui-graphics/src/androidInstrumentedTest/kotlin/androidx/compose/ui/graphics/ShaderTest.kt b/compose/ui/ui-graphics/src/androidInstrumentedTest/kotlin/androidx/compose/ui/graphics/ShaderTest.kt
index 7e5437e..5f7dc09 100644
--- a/compose/ui/ui-graphics/src/androidInstrumentedTest/kotlin/androidx/compose/ui/graphics/ShaderTest.kt
+++ b/compose/ui/ui-graphics/src/androidInstrumentedTest/kotlin/androidx/compose/ui/graphics/ShaderTest.kt
@@ -40,15 +40,16 @@
         val imageBitmap = ImageBitmap(100, 100)
         imageBitmap.drawInto {
             drawRect(
-                brush = Brush.linearGradient(
-                    0.0f to Color.Red,
-                    0.5f to Color.Red,
-                    0.5f to Color.Blue,
-                    1.0f to Color.Blue,
-                    start = Offset.Zero,
-                    end = Offset(0.0f, 100f),
-                    tileMode = TileMode.Clamp
-                )
+                brush =
+                    Brush.linearGradient(
+                        0.0f to Color.Red,
+                        0.5f to Color.Red,
+                        0.5f to Color.Blue,
+                        1.0f to Color.Blue,
+                        start = Offset.Zero,
+                        end = Offset(0.0f, 100f),
+                        tileMode = TileMode.Clamp
+                    )
             )
         }
 
@@ -69,15 +70,16 @@
 
         imageBitmap.drawInto {
             drawCircle(
-                brush = Brush.radialGradient(
-                    0.0f to Color.Red,
-                    0.5f to Color.Red,
-                    0.5f to Color.Blue,
-                    1.0f to Color.Blue,
-                    center = Offset(50f, 50f),
-                    radius = 50f,
-                    tileMode = TileMode.Clamp
-                )
+                brush =
+                    Brush.radialGradient(
+                        0.0f to Color.Red,
+                        0.5f to Color.Red,
+                        0.5f to Color.Blue,
+                        1.0f to Color.Blue,
+                        center = Offset(50f, 50f),
+                        radius = 50f,
+                        tileMode = TileMode.Clamp
+                    )
             )
         }
 
@@ -101,13 +103,14 @@
         val center = Offset(50f, 50f)
         imageBitmap.drawInto {
             drawRect(
-                brush = Brush.sweepGradient(
-                    0.0f to Color.Red,
-                    0.5f to Color.Red,
-                    0.5f to Color.Blue,
-                    1.0f to Color.Blue,
-                    center = center
-                )
+                brush =
+                    Brush.sweepGradient(
+                        0.0f to Color.Red,
+                        0.5f to Color.Red,
+                        0.5f to Color.Blue,
+                        1.0f to Color.Blue,
+                        center = center
+                    )
             )
         }
 
@@ -127,10 +130,11 @@
         assertEquals(
             Size(100f, 200f),
             Brush.linearGradient(
-                listOf(Color.Red, Color.Blue),
-                start = Offset(200f, 100f),
-                end = Offset(300f, 300f)
-            ).intrinsicSize
+                    listOf(Color.Red, Color.Blue),
+                    start = Offset(200f, 100f),
+                    end = Offset(300f, 300f)
+                )
+                .intrinsicSize
         )
     }
 
@@ -139,10 +143,11 @@
         assertEquals(
             Size(100f, 200f),
             Brush.linearGradient(
-                listOf(Color.Red, Color.Blue),
-                start = Offset(200f, 100f),
-                end = Offset(100f, -100f)
-            ).intrinsicSize
+                    listOf(Color.Red, Color.Blue),
+                    start = Offset(200f, 100f),
+                    end = Offset(100f, -100f)
+                )
+                .intrinsicSize
         )
     }
 
@@ -151,10 +156,11 @@
         assertEquals(
             Size(Float.NaN, 200f),
             Brush.linearGradient(
-                listOf(Color.Red, Color.Blue),
-                start = Offset(Float.POSITIVE_INFINITY, 100f),
-                end = Offset(Float.POSITIVE_INFINITY, 300f)
-            ).intrinsicSize
+                    listOf(Color.Red, Color.Blue),
+                    start = Offset(Float.POSITIVE_INFINITY, 100f),
+                    end = Offset(Float.POSITIVE_INFINITY, 300f)
+                )
+                .intrinsicSize
         )
     }
 
@@ -163,10 +169,11 @@
         assertEquals(
             Size(100f, Float.NaN),
             Brush.linearGradient(
-                listOf(Color.Red, Color.Blue),
-                start = Offset(100f, 0f),
-                end = Offset(200f, Float.POSITIVE_INFINITY)
-            ).intrinsicSize
+                    listOf(Color.Red, Color.Blue),
+                    start = Offset(100f, 0f),
+                    end = Offset(200f, Float.POSITIVE_INFINITY)
+                )
+                .intrinsicSize
         )
     }
 
@@ -184,10 +191,7 @@
     fun testRadialGradientIntrinsicSize() {
         assertEquals(
             Size(100f, 100f),
-            Brush.radialGradient(
-                listOf(Color.Red, Color.Blue),
-                radius = 50f
-            ).intrinsicSize
+            Brush.radialGradient(listOf(Color.Red, Color.Blue), radius = 50f).intrinsicSize
         )
     }
 
@@ -246,13 +250,13 @@
         assertNull(paint.shader)
     }
 
-    private fun ImageBitmap.drawInto(
-        block: DrawScope.() -> Unit
-    ) = CanvasDrawScope().draw(
-        Density(1.0f),
-        LayoutDirection.Ltr,
-        Canvas(this),
-        Size(width.toFloat(), height.toFloat()),
-        block
-    )
+    private fun ImageBitmap.drawInto(block: DrawScope.() -> Unit) =
+        CanvasDrawScope()
+            .draw(
+                Density(1.0f),
+                LayoutDirection.Ltr,
+                Canvas(this),
+                Size(width.toFloat(), height.toFloat()),
+                block
+            )
 }
diff --git a/compose/ui/ui-graphics/src/androidInstrumentedTest/kotlin/androidx/compose/ui/graphics/drawscope/DrawScopeTest.kt b/compose/ui/ui-graphics/src/androidInstrumentedTest/kotlin/androidx/compose/ui/graphics/drawscope/DrawScopeTest.kt
index 7f26707..798a731 100644
--- a/compose/ui/ui-graphics/src/androidInstrumentedTest/kotlin/androidx/compose/ui/graphics/drawscope/DrawScopeTest.kt
+++ b/compose/ui/ui-graphics/src/androidInstrumentedTest/kotlin/androidx/compose/ui/graphics/drawscope/DrawScopeTest.kt
@@ -66,13 +66,8 @@
     private fun createTestDstImage(): ImageBitmap {
         val dst = ImageBitmap(width, height)
         val dstCanvas = Canvas(dst)
-        val dstPaint = Paint().apply {
-            this.color = Color.White
-        }
-        dstCanvas.drawRect(
-            Rect(Offset.Zero, Size(200.0f, 200.0f)),
-            dstPaint
-        )
+        val dstPaint = Paint().apply { this.color = Color.White }
+        dstCanvas.drawRect(Rect(Offset.Zero, Size(200.0f, 200.0f)), dstPaint)
         return dst
     }
 
@@ -182,12 +177,9 @@
             drawRect(color = Color.Red, alpha = 0.5f)
         }
 
-        val expected = Color(
-            alpha = 0.5f,
-            red = Color.Red.red,
-            green = Color.Red.green,
-            blue = Color.Red.blue
-        ).compositeOver(Color.White)
+        val expected =
+            Color(alpha = 0.5f, red = Color.Red.red, green = Color.Red.green, blue = Color.Red.blue)
+                .compositeOver(Color.White)
 
         val pixelMap = img.toPixelMap()
         for (i in 0 until pixelMap.width) {
@@ -210,12 +202,9 @@
             drawRect(brush = SolidColor(Color.Red), alpha = 0.5f)
         }
 
-        val expected = Color(
-            alpha = 0.5f,
-            red = Color.Red.red,
-            green = Color.Red.green,
-            blue = Color.Red.blue
-        ).compositeOver(Color.White)
+        val expected =
+            Color(alpha = 0.5f, red = Color.Red.red, green = Color.Red.green, blue = Color.Red.blue)
+                .compositeOver(Color.White)
 
         val pixelMap = img.toPixelMap()
         for (i in 0 until pixelMap.width) {
@@ -246,12 +235,9 @@
             )
         }
 
-        val expected = Color(
-            alpha = 0.5f,
-            red = Color.Red.red,
-            green = Color.Red.green,
-            blue = Color.Red.blue
-        ).compositeOver(Color.White)
+        val expected =
+            Color(alpha = 0.5f, red = Color.Red.red, green = Color.Red.green, blue = Color.Red.blue)
+                .compositeOver(Color.White)
 
         val pixelMap = img.toPixelMap()
         for (i in 0 until pixelMap.width) {
@@ -284,12 +270,9 @@
             )
         }
 
-        val expected = Color(
-            alpha = 0.5f,
-            red = Color.Red.red,
-            green = Color.Red.green,
-            blue = Color.Red.blue
-        ).compositeOver(Color.White)
+        val expected =
+            Color(alpha = 0.5f, red = Color.Red.red, green = Color.Red.green, blue = Color.Red.blue)
+                .compositeOver(Color.White)
 
         val pixelMap = img.toPixelMap()
         for (i in 0 until pixelMap.width) {
@@ -309,9 +292,7 @@
         val insetLeft = 10.0f
         val insetTop = 12.0f
         CanvasDrawScope().draw(Canvas(img), dstSize) {
-            translate(insetLeft, insetTop) {
-                drawRect(color = Color.Red)
-            }
+            translate(insetLeft, insetTop) { drawRect(color = Color.Red) }
         }
 
         val pixelMap = img.toPixelMap()
@@ -336,17 +317,18 @@
         val insetRight = 11.0f
         val insetBottom = 13.0f
         CanvasDrawScope().draw(Canvas(img), dstSize) {
-            inset(insetLeft, insetTop, insetRight, insetBottom) {
-                drawRect(color = Color.Red)
-            }
+            inset(insetLeft, insetTop, insetRight, insetBottom) { drawRect(color = Color.Red) }
         }
 
         val pixelMap = img.toPixelMap()
         for (i in 0 until pixelMap.width) {
             for (j in 0 until pixelMap.height) {
                 val expectedColor =
-                    if (i >= insetLeft && i < pixelMap.width - insetRight &&
-                        j >= insetTop && j < pixelMap.height - insetBottom
+                    if (
+                        i >= insetLeft &&
+                            i < pixelMap.width - insetRight &&
+                            j >= insetTop &&
+                            j < pixelMap.height - insetBottom
                     ) {
                         Color.Red
                     } else {
@@ -372,8 +354,11 @@
         for (i in 0 until pixelMap.width) {
             for (j in 0 until pixelMap.height) {
                 val expectedColor =
-                    if (i >= insetHorizontal && i < pixelMap.width - insetHorizontal &&
-                        j >= insetVertical && j < pixelMap.height - insetVertical
+                    if (
+                        i >= insetHorizontal &&
+                            i < pixelMap.width - insetHorizontal &&
+                            j >= insetVertical &&
+                            j < pixelMap.height - insetVertical
                     ) {
                         Color.Red
                     } else {
@@ -389,17 +374,18 @@
         val img = createTestDstImage()
         val insetAll = 10.0f
         CanvasDrawScope().draw(Canvas(img), dstSize) {
-            inset(insetAll) {
-                drawRect(color = Color.Red)
-            }
+            inset(insetAll) { drawRect(color = Color.Red) }
         }
 
         val pixelMap = img.toPixelMap()
         for (i in 0 until pixelMap.width) {
             for (j in 0 until pixelMap.height) {
                 val expectedColor =
-                    if (i >= insetAll && i < pixelMap.width - insetAll &&
-                        j >= insetAll && j < pixelMap.height - insetAll
+                    if (
+                        i >= insetAll &&
+                            i < pixelMap.width - insetAll &&
+                            j >= insetAll &&
+                            j < pixelMap.height - insetAll
                     ) {
                         Color.Red
                     } else {
@@ -479,9 +465,7 @@
 
         canvasScope.draw(Canvas(imageBitmap), size) {
             drawRect(color = Color.Red)
-            scale(0.5f, pivot = Offset.Zero) {
-                drawRect(color = Color.Blue)
-            }
+            scale(0.5f, pivot = Offset.Zero) { drawRect(color = Color.Blue) }
         }
 
         val pixelMap = imageBitmap.toPixelMap()
@@ -508,9 +492,7 @@
 
         canvasScope.draw(Canvas(imageBitmap), size) {
             drawRect(color = Color.Red)
-            scale(0.5f) {
-                drawRect(color = Color.Blue)
-            }
+            scale(0.5f) { drawRect(color = Color.Blue) }
         }
 
         val pixelMap = imageBitmap.toPixelMap()
@@ -551,9 +533,7 @@
 
         try {
             canvasScope.draw(Canvas(imageBitmap), size) {
-                inset(100.0f, 0.0f, 101.0f, 0.0f) {
-                    drawRect(color = Color.Red)
-                }
+                inset(100.0f, 0.0f, 101.0f, 0.0f) { drawRect(color = Color.Red) }
             }
             fail("Width must be greater than or equal to zero after applying inset")
         } catch (e: IllegalArgumentException) {
@@ -572,9 +552,7 @@
 
         try {
             canvasScope.draw(Canvas(imageBitmap), size) {
-                inset(0.0f, 100.0f, 0.0f, 101.0f) {
-                    drawRect(color = Color.Red)
-                }
+                inset(0.0f, 100.0f, 0.0f, 101.0f) { drawRect(color = Color.Red) }
             }
             fail("Height must be greater than or equal to zero after applying inset")
         } catch (e: IllegalArgumentException) {
@@ -598,9 +576,7 @@
 
         try {
             canvasScope.draw(Canvas(imageBitmap), size) {
-                inset(0.0f, 100.0f, 0.0f, 100.0f) {
-                    drawRect(color = Color.Red)
-                }
+                inset(0.0f, 100.0f, 0.0f, 100.0f) { drawRect(color = Color.Red) }
             }
         } catch (e: IllegalArgumentException) {
             fail("Zero height after applying inset is allowed")
@@ -623,9 +599,7 @@
 
         try {
             canvasScope.draw(Canvas(imageBitmap), size) {
-                inset(100.0f, 0.0f, 100.0f, 0.0f) {
-                    drawRect(color = Color.Red)
-                }
+                inset(100.0f, 0.0f, 100.0f, 0.0f) { drawRect(color = Color.Red) }
             }
         } catch (e: IllegalArgumentException) {
             fail("Zero width after applying inset is allowed")
@@ -736,10 +710,7 @@
         CanvasDrawScope().draw(Canvas(imageBitmap), size) {
             drawRect(color = Color.Red)
             rotate(-45.0f, Offset.Zero) {
-                drawRect(
-                    size = Size(100.0f, 100.0f),
-                    color = Color.Blue
-                )
+                drawRect(size = Size(100.0f, 100.0f), color = Color.Blue)
             }
         }
 
@@ -766,10 +737,7 @@
                 scale(2.0f, 0.5f) {
                     rotate(-45.0f, Offset.Zero) {
                         translate(7.0f, 9.0f) {
-                            drawRect(
-                                size = Size(100.0f, 100.0f),
-                                color = Color.Blue
-                            )
+                            drawRect(size = Size(100.0f, 100.0f), color = Color.Blue)
                         }
                     }
                 }
@@ -789,10 +757,7 @@
                 // 2 saves at this point, the initial draw call does a save
                 // as well as the withTransform call
                 assertEquals(2, saveCountCanvas.saveCount)
-                drawRect(
-                    size = Size(100.0f, 100.0f),
-                    color = Color.Blue
-                )
+                drawRect(size = Size(100.0f, 100.0f), color = Color.Blue)
             }
 
             // Restore to the save count of the initial CanvasScope.draw call
@@ -808,8 +773,14 @@
         for (x in 0 until pixelMap1.width) {
             for (y in 0 until pixelMap1.height) {
                 assertEquals(
-                    "coordinate: " + x + ", " + y + " expected: " +
-                        pixelMap1[x, y] + " actual: " + pixelMap2[x, y],
+                    "coordinate: " +
+                        x +
+                        ", " +
+                        y +
+                        " expected: " +
+                        pixelMap1[x, y] +
+                        " actual: " +
+                        pixelMap2[x, y],
                     pixelMap1[x, y],
                     pixelMap2[x, y]
                 )
@@ -829,18 +800,11 @@
         testDrawScopeAndCanvasAreEquivalent(
             width,
             height,
-            {
-                drawLine(
-                    Color.Cyan,
-                    start,
-                    end,
-                    strokeWidth,
-                    StrokeCap.Round
-                )
-            },
+            { drawLine(Color.Cyan, start, end, strokeWidth, StrokeCap.Round) },
             { canvas ->
                 canvas.drawLine(
-                    start, end,
+                    start,
+                    end,
                     Paint().apply {
                         this.color = Color.Cyan
                         this.strokeWidth = strokeWidth
@@ -854,18 +818,11 @@
         testDrawScopeAndCanvasAreEquivalent(
             width,
             height,
-            {
-                drawLine(
-                    SolidColor(Color.Cyan),
-                    start,
-                    end,
-                    strokeWidth,
-                    StrokeCap.Round
-                )
-            },
+            { drawLine(SolidColor(Color.Cyan), start, end, strokeWidth, StrokeCap.Round) },
             { canvas ->
                 canvas.drawLine(
-                    start, end,
+                    start,
+                    end,
                     Paint().apply {
                         this.color = Color.Cyan
                         this.strokeWidth = strokeWidth
@@ -881,15 +838,16 @@
     fun testDrawPointStrokeParametersAreApplied() {
         val width = 200
         val height = 200
-        val points = listOf(
-            Offset.Zero,
-            Offset(10f, 10f),
-            Offset(25f, 25f),
-            Offset(40f, 40f),
-            Offset(50f, 50f),
-            Offset(75f, 75f),
-            Offset(150f, 150f)
-        )
+        val points =
+            listOf(
+                Offset.Zero,
+                Offset(10f, 10f),
+                Offset(25f, 25f),
+                Offset(40f, 40f),
+                Offset(50f, 50f),
+                Offset(75f, 75f),
+                Offset(150f, 150f)
+            )
         // Test first that colors are rendered with the correct stroke parameters
         testDrawScopeAndCanvasAreEquivalent(
             width,
@@ -974,23 +932,13 @@
         val density2 = Density(5.0f, 7.0f)
 
         val canvasDrawScope = CanvasDrawScope()
-        canvasDrawScope.draw(
-            density1,
-            layoutDirection1,
-            canvas1,
-            size1
-        ) {
+        canvasDrawScope.draw(density1, layoutDirection1, canvas1, size1) {
             assertEquals(size1, size)
             assertEquals(density1, Density(density, fontScale))
             assertTrue(canvas1 === drawContext.canvas)
             assertEquals(LayoutDirection.Ltr, layoutDirection)
 
-            canvasDrawScope.draw(
-                density2,
-                layoutDirection2,
-                canvas2,
-                size2
-            ) {
+            canvasDrawScope.draw(density2, layoutDirection2, canvas2, size2) {
                 assertEquals(size2, size)
                 assertTrue(canvas2 === drawContext.canvas)
                 assertEquals(density2, Density(density, fontScale))
@@ -1054,17 +1002,17 @@
         testDrawScopeAndCanvasAreEquivalent(
             100,
             100,
-            {
-                drawRect(Brush.linearGradient(listOf(Color.Red, Color.Green, Color.Blue)))
-            },
+            { drawRect(Brush.linearGradient(listOf(Color.Red, Color.Green, Color.Blue))) },
             { canvas ->
-                val paint = Paint().apply {
-                    shader = LinearGradientShader(
-                        Offset.Zero,
-                        Offset(100f, 100f),
-                        listOf(Color.Red, Color.Green, Color.Blue)
-                    )
-                }
+                val paint =
+                    Paint().apply {
+                        shader =
+                            LinearGradientShader(
+                                Offset.Zero,
+                                Offset(100f, 100f),
+                                listOf(Color.Red, Color.Green, Color.Blue)
+                            )
+                    }
                 canvas.drawRect(0f, 0f, 100f, 100f, paint)
             }
         )
@@ -1084,13 +1032,15 @@
                 )
             },
             { canvas ->
-                val paint = Paint().apply {
-                    shader = LinearGradientShader(
-                        Offset.Zero,
-                        Offset(0f, 100f),
-                        listOf(Color.Red, Color.Green, Color.Blue)
-                    )
-                }
+                val paint =
+                    Paint().apply {
+                        shader =
+                            LinearGradientShader(
+                                Offset.Zero,
+                                Offset(0f, 100f),
+                                listOf(Color.Red, Color.Green, Color.Blue)
+                            )
+                    }
                 canvas.drawRect(0f, 0f, 100f, 100f, paint)
             }
         )
@@ -1110,13 +1060,15 @@
                 )
             },
             { canvas ->
-                val paint = Paint().apply {
-                    shader = LinearGradientShader(
-                        Offset.Zero,
-                        Offset(100f, 0f),
-                        listOf(Color.Red, Color.Green, Color.Blue)
-                    )
-                }
+                val paint =
+                    Paint().apply {
+                        shader =
+                            LinearGradientShader(
+                                Offset.Zero,
+                                Offset(100f, 0f),
+                                listOf(Color.Red, Color.Green, Color.Blue)
+                            )
+                    }
                 canvas.drawRect(0f, 0f, 100f, 100f, paint)
             }
         )
@@ -1136,13 +1088,15 @@
                 )
             },
             { canvas ->
-                val paint = Paint().apply {
-                    shader = LinearGradientShader(
-                        Offset(0f, 100f),
-                        Offset(100f, 100f),
-                        listOf(Color.Red, Color.Green, Color.Blue)
-                    )
-                }
+                val paint =
+                    Paint().apply {
+                        shader =
+                            LinearGradientShader(
+                                Offset(0f, 100f),
+                                Offset(100f, 100f),
+                                listOf(Color.Red, Color.Green, Color.Blue)
+                            )
+                    }
                 canvas.drawRect(0f, 0f, 100f, 100f, paint)
             }
         )
@@ -1162,13 +1116,15 @@
                 )
             },
             { canvas ->
-                val paint = Paint().apply {
-                    shader = LinearGradientShader(
-                        Offset(100f, 0f),
-                        Offset(100f, 100f),
-                        listOf(Color.Red, Color.Green, Color.Blue)
-                    )
-                }
+                val paint =
+                    Paint().apply {
+                        shader =
+                            LinearGradientShader(
+                                Offset(100f, 0f),
+                                Offset(100f, 100f),
+                                listOf(Color.Red, Color.Green, Color.Blue)
+                            )
+                    }
                 canvas.drawRect(0f, 0f, 100f, 100f, paint)
             }
         )
@@ -1191,15 +1147,17 @@
                 )
             },
             { canvas ->
-                val paint = Paint().apply {
-                    shader = LinearGradientShader(
-                        Offset(10f, 10f),
-                        Offset(100f, 100f),
-                        colors = listOf(Color.Red, Color.Green, Color.Blue),
-                        colorStops = listOf(0.0f, 0.1f, 0.8f),
-                        tileMode = TileMode.Repeated
-                    )
-                }
+                val paint =
+                    Paint().apply {
+                        shader =
+                            LinearGradientShader(
+                                Offset(10f, 10f),
+                                Offset(100f, 100f),
+                                colors = listOf(Color.Red, Color.Green, Color.Blue),
+                                colorStops = listOf(0.0f, 0.1f, 0.8f),
+                                tileMode = TileMode.Repeated
+                            )
+                    }
                 canvas.drawRect(0f, 0f, 100f, 100f, paint)
             }
         )
@@ -1210,17 +1168,17 @@
         testDrawScopeAndCanvasAreEquivalent(
             100,
             100,
-            {
-                drawRect(Brush.horizontalGradient(listOf(Color.Red, Color.Green, Color.Blue)))
-            },
+            { drawRect(Brush.horizontalGradient(listOf(Color.Red, Color.Green, Color.Blue))) },
             { canvas ->
-                val paint = Paint().apply {
-                    shader = LinearGradientShader(
-                        Offset.Zero,
-                        Offset(100f, 0f),
-                        listOf(Color.Red, Color.Green, Color.Blue)
-                    )
-                }
+                val paint =
+                    Paint().apply {
+                        shader =
+                            LinearGradientShader(
+                                Offset.Zero,
+                                Offset(100f, 0f),
+                                listOf(Color.Red, Color.Green, Color.Blue)
+                            )
+                    }
                 canvas.drawRect(0f, 0f, 100f, 100f, paint)
             }
         )
@@ -1243,15 +1201,17 @@
                 )
             },
             { canvas ->
-                val paint = Paint().apply {
-                    shader = LinearGradientShader(
-                        Offset(10f, 0f),
-                        Offset(100f, 0f),
-                        colors = listOf(Color.Red, Color.Green, Color.Blue),
-                        colorStops = listOf(0.0f, 0.1f, 0.8f),
-                        tileMode = TileMode.Repeated
-                    )
-                }
+                val paint =
+                    Paint().apply {
+                        shader =
+                            LinearGradientShader(
+                                Offset(10f, 0f),
+                                Offset(100f, 0f),
+                                colors = listOf(Color.Red, Color.Green, Color.Blue),
+                                colorStops = listOf(0.0f, 0.1f, 0.8f),
+                                tileMode = TileMode.Repeated
+                            )
+                    }
                 canvas.drawRect(0f, 0f, 100f, 100f, paint)
             }
         )
@@ -1262,17 +1222,17 @@
         testDrawScopeAndCanvasAreEquivalent(
             100,
             100,
-            {
-                drawRect(Brush.verticalGradient(listOf(Color.Red, Color.Green, Color.Blue)))
-            },
+            { drawRect(Brush.verticalGradient(listOf(Color.Red, Color.Green, Color.Blue))) },
             { canvas ->
-                val paint = Paint().apply {
-                    shader = LinearGradientShader(
-                        Offset.Zero,
-                        Offset(0f, 100f),
-                        listOf(Color.Red, Color.Green, Color.Blue)
-                    )
-                }
+                val paint =
+                    Paint().apply {
+                        shader =
+                            LinearGradientShader(
+                                Offset.Zero,
+                                Offset(0f, 100f),
+                                listOf(Color.Red, Color.Green, Color.Blue)
+                            )
+                    }
                 canvas.drawRect(0f, 0f, 100f, 100f, paint)
             }
         )
@@ -1295,15 +1255,17 @@
                 )
             },
             { canvas ->
-                val paint = Paint().apply {
-                    shader = LinearGradientShader(
-                        Offset(0f, 10f),
-                        Offset(0f, 100f),
-                        colors = listOf(Color.Red, Color.Green, Color.Blue),
-                        colorStops = listOf(0.0f, 0.1f, 0.8f),
-                        tileMode = TileMode.Repeated
-                    )
-                }
+                val paint =
+                    Paint().apply {
+                        shader =
+                            LinearGradientShader(
+                                Offset(0f, 10f),
+                                Offset(0f, 100f),
+                                colors = listOf(Color.Red, Color.Green, Color.Blue),
+                                colorStops = listOf(0.0f, 0.1f, 0.8f),
+                                tileMode = TileMode.Repeated
+                            )
+                    }
                 canvas.drawRect(0f, 0f, 100f, 100f, paint)
             }
         )
@@ -1314,19 +1276,17 @@
         testDrawScopeAndCanvasAreEquivalent(
             100,
             100,
-            {
-                drawRect(
-                    Brush.radialGradient(listOf(Color.Red, Color.Green, Color.Blue))
-                )
-            },
+            { drawRect(Brush.radialGradient(listOf(Color.Red, Color.Green, Color.Blue))) },
             { canvas ->
-                val paint = Paint().apply {
-                    shader = RadialGradientShader(
-                        Offset(50f, 50f),
-                        50f,
-                        colors = listOf(Color.Red, Color.Green, Color.Blue)
-                    )
-                }
+                val paint =
+                    Paint().apply {
+                        shader =
+                            RadialGradientShader(
+                                Offset(50f, 50f),
+                                50f,
+                                colors = listOf(Color.Red, Color.Green, Color.Blue)
+                            )
+                    }
                 canvas.drawRect(0f, 0f, 100f, 100f, paint)
             }
         )
@@ -1338,21 +1298,24 @@
             100,
             100,
             {
-                val offsetRadialGradient = Brush.radialGradient(
-                    listOf(Color.Red, Color.Blue),
-                    center = Offset(150f, 150f),
-                    radius = 50f
-                )
+                val offsetRadialGradient =
+                    Brush.radialGradient(
+                        listOf(Color.Red, Color.Blue),
+                        center = Offset(150f, 150f),
+                        radius = 50f
+                    )
                 drawRect(offsetRadialGradient)
             },
             { canvas ->
-                val paint = Paint().apply {
-                    shader = RadialGradientShader(
-                        Offset(150f, 150f),
-                        radius = 50f,
-                        colors = listOf(Color.Red, Color.Blue)
-                    )
-                }
+                val paint =
+                    Paint().apply {
+                        shader =
+                            RadialGradientShader(
+                                Offset(150f, 150f),
+                                radius = 50f,
+                                colors = listOf(Color.Red, Color.Blue)
+                            )
+                    }
                 canvas.drawRect(0f, 0f, 100f, 100f, paint)
             }
         )
@@ -1364,20 +1327,20 @@
             100,
             100,
             {
-                val offsetRadialGradient = Brush.radialGradient(
-                    listOf(Color.Red, Color.Blue),
-                    center = Offset.Infinite
-                )
+                val offsetRadialGradient =
+                    Brush.radialGradient(listOf(Color.Red, Color.Blue), center = Offset.Infinite)
                 drawRect(offsetRadialGradient)
             },
             { canvas ->
-                val paint = Paint().apply {
-                    shader = RadialGradientShader(
-                        Offset(100f, 100f),
-                        radius = 50f,
-                        colors = listOf(Color.Red, Color.Blue)
-                    )
-                }
+                val paint =
+                    Paint().apply {
+                        shader =
+                            RadialGradientShader(
+                                Offset(100f, 100f),
+                                radius = 50f,
+                                colors = listOf(Color.Red, Color.Blue)
+                            )
+                    }
                 canvas.drawRect(0f, 0f, 100f, 100f, paint)
             }
         )
@@ -1389,20 +1352,23 @@
             100,
             100,
             {
-                val offsetRadialGradient = Brush.radialGradient(
-                    listOf(Color.Red, Color.Blue),
-                    center = Offset(Float.POSITIVE_INFINITY, 0f)
-                )
+                val offsetRadialGradient =
+                    Brush.radialGradient(
+                        listOf(Color.Red, Color.Blue),
+                        center = Offset(Float.POSITIVE_INFINITY, 0f)
+                    )
                 drawRect(offsetRadialGradient)
             },
             { canvas ->
-                val paint = Paint().apply {
-                    shader = RadialGradientShader(
-                        Offset(100f, 0f),
-                        radius = 50f,
-                        colors = listOf(Color.Red, Color.Blue)
-                    )
-                }
+                val paint =
+                    Paint().apply {
+                        shader =
+                            RadialGradientShader(
+                                Offset(100f, 0f),
+                                radius = 50f,
+                                colors = listOf(Color.Red, Color.Blue)
+                            )
+                    }
                 canvas.drawRect(0f, 0f, 100f, 100f, paint)
             }
         )
@@ -1414,20 +1380,23 @@
             100,
             100,
             {
-                val offsetRadialGradient = Brush.radialGradient(
-                    listOf(Color.Red, Color.Blue),
-                    center = Offset(0f, Float.POSITIVE_INFINITY)
-                )
+                val offsetRadialGradient =
+                    Brush.radialGradient(
+                        listOf(Color.Red, Color.Blue),
+                        center = Offset(0f, Float.POSITIVE_INFINITY)
+                    )
                 drawRect(offsetRadialGradient)
             },
             { canvas ->
-                val paint = Paint().apply {
-                    shader = RadialGradientShader(
-                        Offset(0f, 100f),
-                        radius = 50f,
-                        colors = listOf(Color.Red, Color.Blue)
-                    )
-                }
+                val paint =
+                    Paint().apply {
+                        shader =
+                            RadialGradientShader(
+                                Offset(0f, 100f),
+                                radius = 50f,
+                                colors = listOf(Color.Red, Color.Blue)
+                            )
+                    }
                 canvas.drawRect(0f, 0f, 100f, 100f, paint)
             }
         )
@@ -1450,15 +1419,17 @@
                 )
             },
             { canvas ->
-                val paint = Paint().apply {
-                    shader = RadialGradientShader(
-                        Offset(50f, 50f),
-                        10f,
-                        colors = listOf(Color.Red, Color.Green, Color.Blue),
-                        colorStops = listOf(0.0f, 0.1f, 0.8f),
-                        tileMode = TileMode.Mirror
-                    )
-                }
+                val paint =
+                    Paint().apply {
+                        shader =
+                            RadialGradientShader(
+                                Offset(50f, 50f),
+                                10f,
+                                colors = listOf(Color.Red, Color.Green, Color.Blue),
+                                colorStops = listOf(0.0f, 0.1f, 0.8f),
+                                tileMode = TileMode.Mirror
+                            )
+                    }
                 canvas.drawRect(0f, 0f, 100f, 100f, paint)
             }
         )
@@ -1469,18 +1440,16 @@
         testDrawScopeAndCanvasAreEquivalent(
             100,
             100,
-            {
-                drawRect(
-                    Brush.sweepGradient(listOf(Color.Red, Color.Green, Color.Blue))
-                )
-            },
+            { drawRect(Brush.sweepGradient(listOf(Color.Red, Color.Green, Color.Blue))) },
             { canvas ->
-                val paint = Paint().apply {
-                    shader = SweepGradientShader(
-                        Offset(50f, 50f),
-                        colors = listOf(Color.Red, Color.Green, Color.Blue)
-                    )
-                }
+                val paint =
+                    Paint().apply {
+                        shader =
+                            SweepGradientShader(
+                                Offset(50f, 50f),
+                                colors = listOf(Color.Red, Color.Green, Color.Blue)
+                            )
+                    }
                 canvas.drawRect(0f, 0f, 100f, 100f, paint)
             }
         )
@@ -1500,12 +1469,14 @@
                 )
             },
             { canvas ->
-                val paint = Paint().apply {
-                    shader = SweepGradientShader(
-                        Offset(100f, 100f),
-                        colors = listOf(Color.Red, Color.Green, Color.Blue)
-                    )
-                }
+                val paint =
+                    Paint().apply {
+                        shader =
+                            SweepGradientShader(
+                                Offset(100f, 100f),
+                                colors = listOf(Color.Red, Color.Green, Color.Blue)
+                            )
+                    }
                 canvas.drawRect(0f, 0f, 100f, 100f, paint)
             }
         )
@@ -1525,12 +1496,14 @@
                 )
             },
             { canvas ->
-                val paint = Paint().apply {
-                    shader = SweepGradientShader(
-                        Offset(0f, 100f),
-                        colors = listOf(Color.Red, Color.Green, Color.Blue)
-                    )
-                }
+                val paint =
+                    Paint().apply {
+                        shader =
+                            SweepGradientShader(
+                                Offset(0f, 100f),
+                                colors = listOf(Color.Red, Color.Green, Color.Blue)
+                            )
+                    }
                 canvas.drawRect(0f, 0f, 100f, 100f, paint)
             }
         )
@@ -1550,12 +1523,14 @@
                 )
             },
             { canvas ->
-                val paint = Paint().apply {
-                    shader = SweepGradientShader(
-                        Offset(100f, 0f),
-                        colors = listOf(Color.Red, Color.Green, Color.Blue)
-                    )
-                }
+                val paint =
+                    Paint().apply {
+                        shader =
+                            SweepGradientShader(
+                                Offset(100f, 0f),
+                                colors = listOf(Color.Red, Color.Green, Color.Blue)
+                            )
+                    }
                 canvas.drawRect(0f, 0f, 100f, 100f, paint)
             }
         )
@@ -1568,21 +1543,19 @@
             100,
             {
                 drawRect(
-                    Brush.sweepGradient(
-                        0.0f to Color.Red,
-                        0.1f to Color.Green,
-                        0.8f to Color.Blue
-                    )
+                    Brush.sweepGradient(0.0f to Color.Red, 0.1f to Color.Green, 0.8f to Color.Blue)
                 )
             },
             { canvas ->
-                val paint = Paint().apply {
-                    shader = SweepGradientShader(
-                        Offset(50f, 50f),
-                        colors = listOf(Color.Red, Color.Green, Color.Blue),
-                        colorStops = listOf(0.0f, 0.1f, 0.8f)
-                    )
-                }
+                val paint =
+                    Paint().apply {
+                        shader =
+                            SweepGradientShader(
+                                Offset(50f, 50f),
+                                colors = listOf(Color.Red, Color.Green, Color.Blue),
+                                colorStops = listOf(0.0f, 0.1f, 0.8f)
+                            )
+                    }
                 canvas.drawRect(0f, 0f, 100f, 100f, paint)
             }
         )
@@ -1603,10 +1576,7 @@
             {
                 drawCircle(
                     strokeColor,
-                    style = Stroke(
-                        width = strokeWidth,
-                        pathEffect = pathEffect
-                    )
+                    style = Stroke(width = strokeWidth, pathEffect = pathEffect)
                 )
                 drawLine(
                     color = strokeColor,
@@ -1650,9 +1620,7 @@
         val height = 90f
         val sampleBitmap = ImageBitmap(3, 3)
         val canvas = androidx.compose.ui.graphics.Canvas(sampleBitmap)
-        val samplePaint = Paint().apply {
-            color = Color.White
-        }
+        val samplePaint = Paint().apply { color = Color.White }
 
         canvas.drawRect(0f, 0f, 3f, 3f, samplePaint)
 
@@ -1777,9 +1745,8 @@
     fun testBrushResetOnSubsequentDrawWithAlphaBitmap() {
         val width = 200
         val height = 200
-        val brush = Brush.horizontalGradient(
-            listOf(Color.Transparent, Color.Blue, Color.Transparent)
-        )
+        val brush =
+            Brush.horizontalGradient(listOf(Color.Transparent, Color.Blue, Color.Transparent))
         val maskBitmap = ImageBitmap(width / 2, height / 2, ImageBitmapConfig.Alpha8)
         val maskCanvas = Canvas(maskBitmap)
         maskCanvas.drawRect(
@@ -1794,14 +1761,13 @@
                 // Drawing an ImageBitmap after drawing a brush should unset the
                 // previously configured brush
                 drawRect(brush)
-                inset(width / 4f, height / 4f) {
-                    drawImage(maskBitmap, colorFilter = colorFilter)
-                }
+                inset(width / 4f, height / 4f) { drawImage(maskBitmap, colorFilter = colorFilter) }
             },
             { canvas ->
-                val paint = Paint().apply {
-                    brush.applyTo(Size(width.toFloat(), height.toFloat()), this, 1f)
-                }
+                val paint =
+                    Paint().apply {
+                        brush.applyTo(Size(width.toFloat(), height.toFloat()), this, 1f)
+                    }
                 canvas.drawRect(0f, 0f, width.toFloat(), height.toFloat(), paint)
                 canvas.save()
                 canvas.translate(width / 4f, height / 4f)
@@ -1811,9 +1777,8 @@
                     srcSize = IntSize(width, height),
                     dstOffset = IntOffset.Zero,
                     dstSize = IntSize(width, height),
-                    Paint().apply {
-                        this.colorFilter = colorFilter
-                    })
+                    Paint().apply { this.colorFilter = colorFilter }
+                )
                 canvas.restore()
             }
         )
@@ -1826,15 +1791,13 @@
             Canvas(ImageBitmap(width, height)),
             Size(width.toFloat(), height.toFloat())
         ) {
-            withWrappedTransform({
-                block(this)
-            }) { /* no-op */ }
+            withWrappedTransform({ block(this) }) { /* no-op */ }
         }
     }
 
     /**
-     * Helper method used  to confirm both DrawScope rendered content and Canvas drawn
-     * content are identical
+     * Helper method used to confirm both DrawScope rendered content and Canvas drawn content are
+     * identical
      */
     private fun testDrawScopeAndCanvasAreEquivalent(
         width: Int,
@@ -1844,9 +1807,7 @@
     ) {
         val size = Size(width.toFloat(), height.toFloat())
         val imageBitmap1 = ImageBitmap(width, height)
-        CanvasDrawScope().draw(Canvas(imageBitmap1), size) {
-            drawScopeBlock()
-        }
+        CanvasDrawScope().draw(Canvas(imageBitmap1), size) { drawScopeBlock() }
 
         val imageBitmap2 = ImageBitmap(width, height)
         canvasBlock(Canvas(imageBitmap2))
@@ -1860,8 +1821,14 @@
         for (x in 0 until pixelMap1.width) {
             for (y in 0 until pixelMap1.height) {
                 assertEquals(
-                    "coordinate: " + x + ", " + y + " expected: " +
-                        pixelMap1[x, y] + " actual: " + pixelMap2[x, y],
+                    "coordinate: " +
+                        x +
+                        ", " +
+                        y +
+                        " expected: " +
+                        pixelMap1[x, y] +
+                        " actual: " +
+                        pixelMap2[x, y],
                     pixelMap1[x, y],
                     pixelMap2[x, y]
                 )
@@ -1882,9 +1849,7 @@
         }
     }
 
-    /**
-     * Helper test method with defaults for density and layout direction
-     */
+    /** Helper test method with defaults for density and layout direction */
     private inline fun CanvasDrawScope.draw(
         canvas: Canvas,
         size: Size,
@@ -1895,54 +1860,52 @@
         transformBlock: WrappedDrawTransform.() -> Unit,
         drawBlock: DrawScope.() -> Unit
     ) {
-        withTransform(
-            { transformBlock((this as WrappedDrawTransform)) },
-            drawBlock
-        )
+        withTransform({ transformBlock((this as WrappedDrawTransform)) }, drawBlock)
     }
 
-    private class TestDrawScopeTransform(
-        val drawScope: CanvasDrawScope = CanvasDrawScope()
-    ) : DrawScope by drawScope {
+    private class TestDrawScopeTransform(val drawScope: CanvasDrawScope = CanvasDrawScope()) :
+        DrawScope by drawScope {
 
-        override val drawContext = object : DrawContext {
-            override var size: Size
-                get() = drawScope.drawContext.size
-                set(value) {
-                    drawScope.drawContext.size = value
-                }
-            override var canvas: Canvas
-                get() = drawScope.drawContext.canvas
-                set(value) {
-                    drawScope.drawContext.canvas = value
-                }
+        override val drawContext =
+            object : DrawContext {
+                override var size: Size
+                    get() = drawScope.drawContext.size
+                    set(value) {
+                        drawScope.drawContext.size = value
+                    }
 
-            override var layoutDirection: LayoutDirection
-                get() = drawScope.drawContext.layoutDirection
-                set(value) { drawScope.drawContext.layoutDirection = value }
-            override var density: Density
-                get() = drawScope.drawContext.density
-                set(value) { drawScope.drawContext.density = value }
+                override var canvas: Canvas
+                    get() = drawScope.drawContext.canvas
+                    set(value) {
+                        drawScope.drawContext.canvas = value
+                    }
 
-            override val transform: DrawTransform =
-                WrappedDrawTransform(drawScope.drawContext.transform)
-        }
+                override var layoutDirection: LayoutDirection
+                    get() = drawScope.drawContext.layoutDirection
+                    set(value) {
+                        drawScope.drawContext.layoutDirection = value
+                    }
+
+                override var density: Density
+                    get() = drawScope.drawContext.density
+                    set(value) {
+                        drawScope.drawContext.density = value
+                    }
+
+                override val transform: DrawTransform =
+                    WrappedDrawTransform(drawScope.drawContext.transform)
+            }
 
         inline fun draw(canvas: Canvas, size: Size, block: DrawScope.() -> Unit) {
-            drawScope.draw(
-                Density(1.0f, 1.0f),
-                LayoutDirection.Ltr,
-                canvas,
-                size
-            ) {
+            drawScope.draw(Density(1.0f, 1.0f), LayoutDirection.Ltr, canvas, size) {
                 this@TestDrawScopeTransform.block()
             }
         }
     }
 
     /**
-     * DrawTransform implementation that caches its parameter values to ensure proper defaults
-     * are being provided.
+     * DrawTransform implementation that caches its parameter values to ensure proper defaults are
+     * being provided.
      */
     class WrappedDrawTransform(val drawTransform: DrawTransform) : DrawTransform by drawTransform {
 
diff --git a/compose/ui/ui-graphics/src/androidInstrumentedTest/kotlin/androidx/compose/ui/graphics/layer/AndroidGraphicsLayerTest.kt b/compose/ui/ui-graphics/src/androidInstrumentedTest/kotlin/androidx/compose/ui/graphics/layer/AndroidGraphicsLayerTest.kt
index 28ea7fb..9e08e71 100644
--- a/compose/ui/ui-graphics/src/androidInstrumentedTest/kotlin/androidx/compose/ui/graphics/layer/AndroidGraphicsLayerTest.kt
+++ b/compose/ui/ui-graphics/src/androidInstrumentedTest/kotlin/androidx/compose/ui/graphics/layer/AndroidGraphicsLayerTest.kt
@@ -95,41 +95,34 @@
         lateinit var layer: GraphicsLayer
         graphicsLayerTest(
             block = { graphicsContext ->
-                layer = graphicsContext.createGraphicsLayer().apply {
-                    assertEquals(IntSize.Zero, this.size)
-                    record {
-                        drawRect(
-                            Color.Red,
-                            size = size / 2f
-                        )
-                        drawRect(
-                            Color.Blue,
-                            topLeft = Offset(size.width / 2f, 0f),
-                            size = size / 2f
-                        )
-                        drawRect(
-                            Color.Green,
-                            topLeft = Offset(0f, size.height / 2f),
-                            size = size / 2f
-                        )
-                        drawRect(
-                            Color.Black,
-                            topLeft = Offset(size.width / 2f, size.height / 2f),
-                            size = size / 2f
-                        )
+                layer =
+                    graphicsContext.createGraphicsLayer().apply {
+                        assertEquals(IntSize.Zero, this.size)
+                        record {
+                            drawRect(Color.Red, size = size / 2f)
+                            drawRect(
+                                Color.Blue,
+                                topLeft = Offset(size.width / 2f, 0f),
+                                size = size / 2f
+                            )
+                            drawRect(
+                                Color.Green,
+                                topLeft = Offset(0f, size.height / 2f),
+                                size = size / 2f
+                            )
+                            drawRect(
+                                Color.Black,
+                                topLeft = Offset(size.width / 2f, size.height / 2f),
+                                size = size / 2f
+                            )
+                        }
                     }
-                }
             },
             verify = {
                 val bitmap: ImageBitmap = layer.toImageBitmap()
                 assertNotNull(bitmap)
                 assertEquals(TEST_SIZE, IntSize(bitmap.width, bitmap.height))
-                bitmap.toPixelMap().verifyQuadrants(
-                    Color.Red,
-                    Color.Blue,
-                    Color.Green,
-                    Color.Black
-                )
+                bitmap.toPixelMap().verifyQuadrants(Color.Red, Color.Blue, Color.Green, Color.Black)
             }
         )
     }
@@ -146,21 +139,17 @@
                 graphicsContext.createGraphicsLayer().apply {
                     graphicsLayer = this
                     assertEquals(IntSize.Zero, this.size)
-                    record {
-                        drawRect(provider!!.color)
-                    }
+                    record { drawRect(provider!!.color) }
                 }
             },
             verify = {
                 // Nulling out the dependency here should be safe despite attempting to obtain an
                 // ImageBitmap afterwards
                 provider = null
-                graphicsLayer!!.toImageBitmap().toPixelMap().verifyQuadrants(
-                    Color.Red,
-                    Color.Red,
-                    Color.Red,
-                    Color.Red
-                )
+                graphicsLayer!!
+                    .toImageBitmap()
+                    .toPixelMap()
+                    .verifyQuadrants(Color.Red, Color.Red, Color.Red, Color.Red)
             },
             verifySoftwareRender = false // Only supported in hardware accelerated use cases
         )
@@ -171,12 +160,11 @@
         var layer: GraphicsLayer? = null
         graphicsLayerTest(
             block = { graphicsContext ->
-                layer = graphicsContext.createGraphicsLayer().apply {
-                    assertEquals(IntSize.Zero, this.size)
-                    record {
-                        drawRect(Color.Red)
+                layer =
+                    graphicsContext.createGraphicsLayer().apply {
+                        assertEquals(IntSize.Zero, this.size)
+                        record { drawRect(Color.Red) }
                     }
-                }
                 drawLayer(layer!!)
             },
             verify = {
@@ -192,13 +180,12 @@
         var layer: GraphicsLayer? = null
         graphicsLayerTest(
             block = { graphicsContext ->
-                layer = graphicsContext.createGraphicsLayer().apply {
-                    assertEquals(IntSize.Zero, this.size)
-                    record {
-                        drawRect(Color.Red)
+                layer =
+                    graphicsContext.createGraphicsLayer().apply {
+                        assertEquals(IntSize.Zero, this.size)
+                        record { drawRect(Color.Red) }
+                        discardDisplayList()
                     }
-                    discardDisplayList()
-                }
                 drawLayer(layer!!)
             },
             verify = {
@@ -217,18 +204,15 @@
         // without updating GraphicsLayer internal state
         graphicsLayerTest(
             block = { graphicsContext ->
-                val layer = graphicsContext.createGraphicsLayer().apply {
-                    assertEquals(IntSize.Zero, this.size)
-                    record {
-                        drawRect(Color.Red)
+                val layer =
+                    graphicsContext.createGraphicsLayer().apply {
+                        assertEquals(IntSize.Zero, this.size)
+                        record { drawRect(Color.Red) }
+                        this.impl.discardDisplayList()
                     }
-                    this.impl.discardDisplayList()
-                }
                 drawIntoCanvas { layer.drawForPersistence(it) }
             },
-            verify = {
-                it.verifyQuadrants(Color.Red, Color.Red, Color.Red, Color.Red)
-            },
+            verify = { it.verifyQuadrants(Color.Red, Color.Red, Color.Red, Color.Red) },
             verifySoftwareRender = false
         )
     }
@@ -237,16 +221,13 @@
     fun testRecordLayerWithSize() {
         graphicsLayerTest(
             block = { graphicsContext ->
-                val layer = graphicsContext.createGraphicsLayer().apply {
-                    record(IntSize(TEST_WIDTH / 2, TEST_HEIGHT / 2)) {
-                        drawRect(Color.Red)
+                val layer =
+                    graphicsContext.createGraphicsLayer().apply {
+                        record(IntSize(TEST_WIDTH / 2, TEST_HEIGHT / 2)) { drawRect(Color.Red) }
                     }
-                }
                 drawLayer(layer)
             },
-            verify = {
-                it.verifyQuadrants(Color.Red, Color.Black, Color.Black, Color.Black)
-            }
+            verify = { it.verifyQuadrants(Color.Red, Color.Black, Color.Black, Color.Black) }
         )
     }
 
@@ -257,12 +238,11 @@
         val size = IntSize(TEST_WIDTH, TEST_HEIGHT)
         graphicsLayerTest(
             block = { graphicsContext ->
-                layer = graphicsContext.createGraphicsLayer().apply {
-                    record {
-                        drawRect(Color.Red)
+                layer =
+                    graphicsContext.createGraphicsLayer().apply {
+                        record { drawRect(Color.Red) }
+                        this.topLeft = topLeft
                     }
-                    this.topLeft = topLeft
-                }
                 drawLayer(layer!!)
             },
             verify = {
@@ -280,14 +260,11 @@
         val size = IntSize(TEST_WIDTH, TEST_HEIGHT)
         graphicsLayerTest(
             block = { graphicsContext ->
-                layer = graphicsContext.createGraphicsLayer().apply {
-                    record {
-                        inset(0f, 0f, -4f, -4f) {
-                            drawRect(Color.Red)
-                        }
+                layer =
+                    graphicsContext.createGraphicsLayer().apply {
+                        record { inset(0f, 0f, -4f, -4f) { drawRect(Color.Red) } }
+                        this.topLeft = topLeft
                     }
-                    this.topLeft = topLeft
-                }
                 drawLayer(layer!!)
             },
             verify = {
@@ -308,12 +285,11 @@
         val size = TEST_SIZE
         graphicsLayerTest(
             block = { graphicsContext ->
-                layer = graphicsContext.createGraphicsLayer().apply {
-                    record {
-                        drawRect(Color.Red)
+                layer =
+                    graphicsContext.createGraphicsLayer().apply {
+                        record { drawRect(Color.Red) }
+                        alpha = 0.5f
                     }
-                    alpha = 0.5f
-                }
                 drawLayer(layer!!)
             },
             verify = {
@@ -337,16 +313,17 @@
         val size = TEST_SIZE
         graphicsLayerTest(
             block = { graphicsContext ->
-                layer = graphicsContext.createGraphicsLayer().apply {
-                    record {
-                        drawRect(
-                            Color.Red,
-                            size = Size(this.size.width / 2, this.size.height / 2)
-                        )
+                layer =
+                    graphicsContext.createGraphicsLayer().apply {
+                        record {
+                            drawRect(
+                                Color.Red,
+                                size = Size(this.size.width / 2, this.size.height / 2)
+                            )
+                        }
+                        scaleX = 2f
+                        pivotOffset = Offset.Zero
                     }
-                    scaleX = 2f
-                    pivotOffset = Offset.Zero
-                }
                 drawLayer(layer!!)
             },
             verify = {
@@ -364,16 +341,17 @@
         val size = TEST_SIZE
         graphicsLayerTest(
             block = { graphicsContext ->
-                layer = graphicsContext.createGraphicsLayer().apply {
-                    record {
-                        drawRect(
-                            Color.Red,
-                            size = Size(this.size.width / 2, this.size.height / 2)
-                        )
+                layer =
+                    graphicsContext.createGraphicsLayer().apply {
+                        record {
+                            drawRect(
+                                Color.Red,
+                                size = Size(this.size.width / 2, this.size.height / 2)
+                            )
+                        }
+                        scaleY = 2f
+                        pivotOffset = Offset.Zero
                     }
-                    scaleY = 2f
-                    pivotOffset = Offset.Zero
-                }
                 drawLayer(layer!!)
             },
             verify = {
@@ -391,15 +369,14 @@
         val size = TEST_SIZE
         graphicsLayerTest(
             block = { graphicsContext ->
-                layer = graphicsContext.createGraphicsLayer().apply {
-                    record {
-                        inset(this.size.width / 4, this.size.height / 4) {
-                            drawRect(Color.Red)
+                layer =
+                    graphicsContext.createGraphicsLayer().apply {
+                        record {
+                            inset(this.size.width / 4, this.size.height / 4) { drawRect(Color.Red) }
                         }
+                        scaleY = 2f
+                        scaleX = 2f
                     }
-                    scaleY = 2f
-                    scaleX = 2f
-                }
                 drawLayer(layer!!)
             },
             verify = {
@@ -417,14 +394,13 @@
         val size = TEST_SIZE
         graphicsLayerTest(
             block = { graphicsContext ->
-                layer = graphicsContext.createGraphicsLayer().apply {
-                    record {
-                        drawRect(Color.Red)
+                layer =
+                    graphicsContext.createGraphicsLayer().apply {
+                        record { drawRect(Color.Red) }
+                        scaleY = 0.5f
+                        scaleX = 0.5f
+                        pivotOffset = Offset(this.size.width.toFloat(), this.size.height.toFloat())
                     }
-                    scaleY = 0.5f
-                    scaleX = 0.5f
-                    pivotOffset = Offset(this.size.width.toFloat(), this.size.height.toFloat())
-                }
                 drawLayer(layer!!)
             },
             verify = {
@@ -442,19 +418,18 @@
         val size = TEST_SIZE
         graphicsLayerTest(
             block = { graphicsContext ->
-                layer = graphicsContext.createGraphicsLayer().apply {
-                    record {
-                        inset(this.size.width / 4, this.size.height / 4) {
-                            drawRect(Color.Red)
+                layer =
+                    graphicsContext.createGraphicsLayer().apply {
+                        record {
+                            inset(this.size.width / 4, this.size.height / 4) { drawRect(Color.Red) }
                         }
+                        scaleY = 2f
+                        scaleX = 2f
+                        // first set to some custom value
+                        pivotOffset = Offset(this.size.width.toFloat(), this.size.height.toFloat())
+                        // and then get back to the default
+                        pivotOffset = Offset.Unspecified
                     }
-                    scaleY = 2f
-                    scaleX = 2f
-                    // first set to some custom value
-                    pivotOffset = Offset(this.size.width.toFloat(), this.size.height.toFloat())
-                    // and then get back to the default
-                    pivotOffset = Offset.Unspecified
-                }
                 drawLayer(layer!!)
             },
             verify = {
@@ -472,12 +447,11 @@
         val size = TEST_SIZE
         graphicsLayerTest(
             block = { graphicsContext ->
-                layer = graphicsContext.createGraphicsLayer().apply {
-                    record {
-                        drawRect(Color.Red, size = this.size / 2f)
+                layer =
+                    graphicsContext.createGraphicsLayer().apply {
+                        record { drawRect(Color.Red, size = this.size / 2f) }
+                        translationX = this.size.width / 2f
                     }
-                    translationX = this.size.width / 2f
-                }
                 drawLayer(layer!!)
             },
             verify = {
@@ -493,14 +467,15 @@
         graphicsLayerTest(
             block = { graphicsContext ->
                 var layerSize = Size.Zero
-                val layer = graphicsContext.createGraphicsLayer().apply {
-                    record {
-                        layerSize = this.size
-                        drawRect(Color.Red, size = this.size / 2f)
+                val layer =
+                    graphicsContext.createGraphicsLayer().apply {
+                        record {
+                            layerSize = this.size
+                            drawRect(Color.Red, size = this.size / 2f)
+                        }
+                        topLeft = IntOffset(20, 30)
+                        setRectOutline()
                     }
-                    topLeft = IntOffset(20, 30)
-                    setRectOutline()
-                }
                 drawLayer(layer)
                 val outline = layer.outline
                 assertEquals(Rect(0f, 0f, layerSize.width, layerSize.height), outline.bounds)
@@ -513,14 +488,15 @@
         graphicsLayerTest(
             block = { graphicsContext ->
                 var layerSize = Size.Zero
-                val layer = graphicsContext.createGraphicsLayer().apply {
-                    record {
-                        layerSize = this.size
-                        drawRect(Color.Red, size = this.size / 2f)
+                val layer =
+                    graphicsContext.createGraphicsLayer().apply {
+                        record {
+                            layerSize = this.size
+                            drawRect(Color.Red, size = this.size / 2f)
+                        }
+                        topLeft = IntOffset(20, 30)
+                        setRoundRectOutline()
                     }
-                    topLeft = IntOffset(20, 30)
-                    setRoundRectOutline()
-                }
                 drawLayer(layer)
                 val outline = layer.outline
                 assertEquals(Rect(0f, 0f, layerSize.width, layerSize.height), outline.bounds)
@@ -532,19 +508,12 @@
     fun testRecordOverwritesPreviousRecord() {
         graphicsLayerTest(
             block = { graphicsContext ->
-                val layer = graphicsContext.createGraphicsLayer().apply {
-                    record {
-                        drawRect(Color.Red)
-                    }
-                }
-                layer.record {
-                    drawRect(Color.Blue)
-                }
+                val layer =
+                    graphicsContext.createGraphicsLayer().apply { record { drawRect(Color.Red) } }
+                layer.record { drawRect(Color.Blue) }
                 drawLayer(layer)
             },
-            verify = {
-                it.verifyQuadrants(Color.Blue, Color.Blue, Color.Blue, Color.Blue)
-            }
+            verify = { it.verifyQuadrants(Color.Blue, Color.Blue, Color.Blue, Color.Blue) }
         )
     }
 
@@ -555,12 +524,11 @@
         val size = TEST_SIZE
         graphicsLayerTest(
             block = { graphicsContext ->
-                layer = graphicsContext.createGraphicsLayer().apply {
-                    record {
-                        drawRect(Color.Red, size = this.size / 2f)
+                layer =
+                    graphicsContext.createGraphicsLayer().apply {
+                        record { drawRect(Color.Red, size = this.size / 2f) }
+                        translationY = this.size.height / 2f
                     }
-                    translationY = this.size.height / 2f
-                }
                 drawLayer(layer!!)
             },
             verify = {
@@ -578,15 +546,13 @@
         val size = TEST_SIZE
         graphicsLayerTest(
             block = { graphicsContext ->
-                layer = graphicsContext.createGraphicsLayer().apply {
-                    record {
-                        drawRect(
-                            Color.Red,
-                            size = Size(this.size.width, this.size.height / 2)
-                        )
+                layer =
+                    graphicsContext.createGraphicsLayer().apply {
+                        record {
+                            drawRect(Color.Red, size = Size(this.size.width, this.size.height / 2))
+                        }
+                        rotationX = 45f
                     }
-                    rotationX = 45f
-                }
                 drawLayer(layer!!)
             },
             verify = {
@@ -608,13 +574,12 @@
         val size = TEST_SIZE
         graphicsLayerTest(
             block = { graphicsContext ->
-                layer = graphicsContext.createGraphicsLayer().apply {
-                    record {
-                        drawRect(Color.Red)
+                layer =
+                    graphicsContext.createGraphicsLayer().apply {
+                        record { drawRect(Color.Red) }
+                        pivotOffset = Offset(0f, this.size.height / 2f)
+                        rotationY = 45f
                     }
-                    pivotOffset = Offset(0f, this.size.height / 2f)
-                    rotationY = 45f
-                }
                 drawLayer(layer!!)
             },
             verify = {
@@ -637,19 +602,21 @@
         val rectSize = 100
         graphicsLayerTest(
             block = { graphicsContext ->
-                layer = graphicsContext.createGraphicsLayer().apply {
-                    record {
-                        drawRect(
-                            Color.Red,
-                            topLeft = Offset(
-                                this.size.width / 2f - rectSize / 2f,
-                                this.size.height / 2 - rectSize / 2f
-                            ),
-                            Size(rectSize.toFloat(), rectSize.toFloat())
-                        )
+                layer =
+                    graphicsContext.createGraphicsLayer().apply {
+                        record {
+                            drawRect(
+                                Color.Red,
+                                topLeft =
+                                    Offset(
+                                        this.size.width / 2f - rectSize / 2f,
+                                        this.size.height / 2 - rectSize / 2f
+                                    ),
+                                Size(rectSize.toFloat(), rectSize.toFloat())
+                            )
+                        }
+                        rotationZ = 45f
                     }
-                    rotationZ = 45f
-                }
                 drawLayer(layer!!)
             },
             verify = {
@@ -686,15 +653,11 @@
         var layer: GraphicsLayer?
         graphicsLayerTest(
             block = { graphicsContext ->
-                layer = graphicsContext.createGraphicsLayer().apply {
-                    record {
-                        drawRect(
-                            Color.Red,
-                            size = Size(100000f, 100000f)
-                        )
+                layer =
+                    graphicsContext.createGraphicsLayer().apply {
+                        record { drawRect(Color.Red, size = Size(100000f, 100000f)) }
+                        // Layer clipping is disabled by default
                     }
-                    // Layer clipping is disabled by default
-                }
                 drawLayer(layer!!)
             },
             verify = {
@@ -713,15 +676,11 @@
         var layer: GraphicsLayer?
         graphicsLayerTest(
             block = { graphicsContext ->
-                layer = graphicsContext.createGraphicsLayer().apply {
-                    record {
-                        drawRect(
-                            Color.Red,
-                            size = Size(100000f, 100000f)
-                        )
+                layer =
+                    graphicsContext.createGraphicsLayer().apply {
+                        record { drawRect(Color.Red, size = Size(100000f, 100000f)) }
+                        clip = true
                     }
-                    clip = true
-                }
                 drawLayer(layer!!)
             },
             verify = {
@@ -753,26 +712,21 @@
         val targetColor = Color.White
         graphicsLayerTest(
             block = { graphicsContext ->
-                val halfSize = IntSize(
-                    (this.size.width / 2f).toInt(),
-                    (this.size.height / 2f).toInt()
-                )
+                val halfSize =
+                    IntSize((this.size.width / 2f).toInt(), (this.size.height / 2f).toInt())
 
-                layer = graphicsContext.createGraphicsLayer().apply {
-                    record(halfSize) {
-                        drawRect(targetColor)
+                layer =
+                    graphicsContext.createGraphicsLayer().apply {
+                        record(halfSize) { drawRect(targetColor) }
+                        shadowElevation = 10f
                     }
-                    shadowElevation = 10f
-                }
                 drawRect(targetColor)
 
                 left = (this.size.width / 4f).toInt()
                 top = (this.size.width / 4f).toInt()
                 right = left + halfSize.width
                 bottom = top + halfSize.height
-                translate(this.size.width / 4, this.size.height / 4) {
-                    drawLayer(layer!!)
-                }
+                translate(this.size.width / 4, this.size.height / 4) { drawLayer(layer!!) }
             },
             verify = { pixmap ->
                 var shadowPixelCount = 0
@@ -802,28 +756,23 @@
         val targetColor = Color.White
         graphicsLayerTest(
             block = { graphicsContext ->
-                val halfSize = IntSize(
-                    (this.size.width / 2f).toInt(),
-                    (this.size.height / 2f).toInt()
-                )
+                val halfSize =
+                    IntSize((this.size.width / 2f).toInt(), (this.size.height / 2f).toInt())
 
-                layer = graphicsContext.createGraphicsLayer().apply {
-                    record(halfSize) {
-                        drawRect(targetColor)
+                layer =
+                    graphicsContext.createGraphicsLayer().apply {
+                        record(halfSize) { drawRect(targetColor) }
+                        shadowElevation = 10f
+                        spotShadowColor = Color.Red
+                        ambientShadowColor = Color.Blue
                     }
-                    shadowElevation = 10f
-                    spotShadowColor = Color.Red
-                    ambientShadowColor = Color.Blue
-                }
                 drawRect(targetColor)
 
                 left = (this.size.width / 4f).toInt()
                 top = (this.size.width / 4f).toInt()
                 right = left + halfSize.width
                 bottom = top + halfSize.height
-                translate(this.size.width / 4, this.size.height / 4) {
-                    drawLayer(layer!!)
-                }
+                translate(this.size.width / 4, this.size.height / 4) { drawLayer(layer!!) }
             },
             verify = { pixmap ->
                 var shadowPixelCount = 0
@@ -887,38 +836,33 @@
         val targetColor = Color.White
         graphicsLayerTest(
             block = { graphicsContext ->
-                val halfSize = IntSize(
-                    (this.size.width / 2f).toInt(),
-                    (this.size.height / 2f).toInt()
-                )
+                val halfSize =
+                    IntSize((this.size.width / 2f).toInt(), (this.size.height / 2f).toInt())
 
-                layer = graphicsContext.createGraphicsLayer().apply {
-                    record(halfSize) {
-                        drawRect(targetColor)
-                    }
-                    setPathOutline(
-                        Path().apply {
-                            addRect(
-                                Rect(
-                                    0f,
-                                    0f,
-                                    halfSize.width.toFloat(),
-                                    halfSize.height.toFloat()
+                layer =
+                    graphicsContext.createGraphicsLayer().apply {
+                        record(halfSize) { drawRect(targetColor) }
+                        setPathOutline(
+                            Path().apply {
+                                addRect(
+                                    Rect(
+                                        0f,
+                                        0f,
+                                        halfSize.width.toFloat(),
+                                        halfSize.height.toFloat()
+                                    )
                                 )
-                            )
-                        }
-                    )
-                    shadowElevation = 10f
-                }
+                            }
+                        )
+                        shadowElevation = 10f
+                    }
                 drawRect(targetColor)
 
                 left = (this.size.width / 4f).toInt()
                 top = (this.size.width / 4f).toInt()
                 right = left + halfSize.width
                 bottom = top + halfSize.height
-                translate(this.size.width / 4, this.size.height / 4) {
-                    drawLayer(layer!!)
-                }
+                translate(this.size.width / 4, this.size.height / 4) { drawLayer(layer!!) }
             },
             verify = { pixmap ->
                 var shadowPixelCount = 0
@@ -952,28 +896,23 @@
         val radius = 50f
         graphicsLayerTest(
             block = { graphicsContext ->
-                val halfSize = IntSize(
-                    (this.size.width / 2f).toInt(),
-                    (this.size.height / 2f).toInt()
-                )
+                val halfSize =
+                    IntSize((this.size.width / 2f).toInt(), (this.size.height / 2f).toInt())
 
                 left = (this.size.width / 4f).toInt()
                 top = (this.size.width / 4f).toInt()
                 right = left + halfSize.width
                 bottom = top + halfSize.height
 
-                layer = graphicsContext.createGraphicsLayer().apply {
-                    record(halfSize) {
-                        drawRect(targetColor)
+                layer =
+                    graphicsContext.createGraphicsLayer().apply {
+                        record(halfSize) { drawRect(targetColor) }
+                        setRoundRectOutline(Offset.Zero, halfSize.toSize(), radius)
+                        shadowElevation = 20f
                     }
-                    setRoundRectOutline(Offset.Zero, halfSize.toSize(), radius)
-                    shadowElevation = 20f
-                }
 
                 drawRect(targetColor)
-                translate(left.toFloat(), top.toFloat()) {
-                    drawLayer(layer!!)
-                }
+                translate(left.toFloat(), top.toFloat()) { drawLayer(layer!!) }
             },
             verify = { pixmap ->
                 fun PixelMap.hasShadowPixels(
@@ -1044,12 +983,11 @@
         val blurRadius = 10f
         graphicsLayerTest(
             block = { graphicsContext ->
-                layer = graphicsContext.createGraphicsLayer().apply {
-                    record {
-                        drawRect(Color.Red)
+                layer =
+                    graphicsContext.createGraphicsLayer().apply {
+                        record { drawRect(Color.Red) }
+                        renderEffect = BlurEffect(blurRadius, blurRadius, TileMode.Decal)
                     }
-                    renderEffect = BlurEffect(blurRadius, blurRadius, TileMode.Decal)
-                }
                 drawRect(Color.Black)
                 drawLayer(layer!!)
             },
@@ -1081,18 +1019,19 @@
         val bgColor = Color.Black
         graphicsLayerTest(
             block = { graphicsContext ->
-                layer = graphicsContext.createGraphicsLayer().apply {
-                    record {
-                        inset(0f, 0f, size.width / 3, size.height / 3) {
-                            drawRect(color = Color.Red)
+                layer =
+                    graphicsContext.createGraphicsLayer().apply {
+                        record {
+                            inset(0f, 0f, size.width / 3, size.height / 3) {
+                                drawRect(color = Color.Red)
+                            }
+                            inset(size.width / 3, size.height / 3, 0f, 0f) {
+                                drawRect(color = Color.Blue)
+                            }
                         }
-                        inset(size.width / 3, size.height / 3, 0f, 0f) {
-                            drawRect(color = Color.Blue)
-                        }
+                        alpha = 0.5f
+                        compositingStrategy = CompositingStrategy.Auto
                     }
-                    alpha = 0.5f
-                    compositingStrategy = CompositingStrategy.Auto
-                }
                 drawRect(bgColor)
                 drawLayer(layer!!)
             },
@@ -1119,17 +1058,18 @@
         val bgColor = Color.LightGray
         graphicsLayerTest(
             block = { graphicsContext ->
-                layer = graphicsContext.createGraphicsLayer().apply {
-                    record {
-                        inset(0f, 0f, size.width / 3, size.height / 3) {
-                            drawRect(color = Color.Red)
+                layer =
+                    graphicsContext.createGraphicsLayer().apply {
+                        record {
+                            inset(0f, 0f, size.width / 3, size.height / 3) {
+                                drawRect(color = Color.Red)
+                            }
+                            inset(size.width / 3, size.height / 3, 0f, 0f) {
+                                drawRect(color = Color.Blue, blendMode = BlendMode.Xor)
+                            }
                         }
-                        inset(size.width / 3, size.height / 3, 0f, 0f) {
-                            drawRect(color = Color.Blue, blendMode = BlendMode.Xor)
-                        }
+                        compositingStrategy = CompositingStrategy.Offscreen
                     }
-                    compositingStrategy = CompositingStrategy.Offscreen
-                }
                 drawRect(bgColor)
                 drawLayer(layer!!)
             },
@@ -1152,18 +1092,19 @@
         val bgColor = Color.Black
         graphicsLayerTest(
             block = { graphicsContext ->
-                layer = graphicsContext.createGraphicsLayer().apply {
-                    record {
-                        inset(0f, 0f, size.width / 3, size.height / 3) {
-                            drawRect(color = Color.Red)
+                layer =
+                    graphicsContext.createGraphicsLayer().apply {
+                        record {
+                            inset(0f, 0f, size.width / 3, size.height / 3) {
+                                drawRect(color = Color.Red)
+                            }
+                            inset(size.width / 3, size.height / 3, 0f, 0f) {
+                                drawRect(color = Color.Blue)
+                            }
                         }
-                        inset(size.width / 3, size.height / 3, 0f, 0f) {
-                            drawRect(color = Color.Blue)
-                        }
+                        alpha = 0.5f
+                        compositingStrategy = CompositingStrategy.ModulateAlpha
                     }
-                    alpha = 0.5f
-                    compositingStrategy = CompositingStrategy.ModulateAlpha
-                }
                 drawRect(bgColor)
                 drawLayer(layer!!)
             },
@@ -1192,13 +1133,12 @@
         val bgColor = Color.Gray
         graphicsLayerTest(
             block = { graphicsContext ->
-                layer = graphicsContext.createGraphicsLayer().apply {
-                    record {
-                        drawRect(Color.Red)
+                layer =
+                    graphicsContext.createGraphicsLayer().apply {
+                        record { drawRect(Color.Red) }
+                        cameraDistance = 5.0f
+                        rotationY = 25f
                     }
-                    cameraDistance = 5.0f
-                    rotationY = 25f
-                }
                 drawRect(bgColor)
                 drawLayer(layer!!)
             },
@@ -1220,12 +1160,11 @@
         var layer: GraphicsLayer?
         graphicsLayerTest(
             block = { graphicsContext ->
-                layer = graphicsContext.createGraphicsLayer().apply {
-                    record {
-                        drawRect(Color.Red)
+                layer =
+                    graphicsContext.createGraphicsLayer().apply {
+                        record { drawRect(Color.Red) }
+                        colorFilter = tint(Color.Blue)
                     }
-                    colorFilter = tint(Color.Blue)
-                }
                 drawLayer(layer!!)
             },
             verify = { pixelMap ->
@@ -1246,21 +1185,22 @@
         graphicsLayerTest(
             block = { graphicsContext ->
                 val drawScopeSize = this.size
-                layer = graphicsContext.createGraphicsLayer().apply {
-                    val topLeft = IntOffset(
-                        (drawScopeSize.width / 4).toInt(),
-                        (drawScopeSize.height / 4).toInt()
-                    )
-                    val layerSize = IntSize(
-                        (drawScopeSize.width / 2).toInt(),
-                        (drawScopeSize.height / 2).toInt()
-                    )
-                    record(layerSize) {
-                        drawRect(Color.Red)
+                layer =
+                    graphicsContext.createGraphicsLayer().apply {
+                        val topLeft =
+                            IntOffset(
+                                (drawScopeSize.width / 4).toInt(),
+                                (drawScopeSize.height / 4).toInt()
+                            )
+                        val layerSize =
+                            IntSize(
+                                (drawScopeSize.width / 2).toInt(),
+                                (drawScopeSize.height / 2).toInt()
+                            )
+                        record(layerSize) { drawRect(Color.Red) }
+                        this.topLeft = topLeft
+                        this.blendMode = BlendMode.Xor
                     }
-                    this.topLeft = topLeft
-                    this.blendMode = BlendMode.Xor
-                }
                 drawRect(Color.Green)
                 drawLayer(layer!!)
                 // The layer should clear the original pixels in the destination rendered by the
@@ -1301,13 +1241,12 @@
         val targetColor = Color.Red
         graphicsLayerTest(
             block = { graphicsContext ->
-                layer = graphicsContext.createGraphicsLayer().apply {
-                    record {
-                        drawRect(targetColor)
+                layer =
+                    graphicsContext.createGraphicsLayer().apply {
+                        record { drawRect(targetColor) }
+                        setRectOutline(this.size.center.toOffset(), (this.size / 2).toSize())
+                        clip = true
                     }
-                    setRectOutline(this.size.center.toOffset(), (this.size / 2).toSize())
-                    clip = true
-                }
                 drawRect(bgColor)
 
                 left = this.size.center.x.toInt()
@@ -1321,12 +1260,12 @@
                 with(pixmap) {
                     for (x in 0 until width) {
                         for (y in 0 until height) {
-                            val expected = if (x in left until right &&
-                                y in top until bottom) {
-                                targetColor
-                            } else {
-                                bgColor
-                            }
+                            val expected =
+                                if (x in left until right && y in top until bottom) {
+                                    targetColor
+                                } else {
+                                    bgColor
+                                }
                             Assert.assertEquals(this[x, y], expected)
                         }
                     }
@@ -1346,22 +1285,23 @@
         val targetColor = Color.Red
         graphicsLayerTest(
             block = { graphicsContext ->
-                layer = graphicsContext.createGraphicsLayer().apply {
-                    record {
-                        drawRect(targetColor)
-                    }
-                    setPathOutline(Path().apply {
-                        addRect(
-                            Rect(
-                                size.center.x.toFloat(),
-                                size.center.y.toFloat(),
-                                size.center.x + size.width.toFloat(),
-                                size.center.y + size.height.toFloat()
-                            )
+                layer =
+                    graphicsContext.createGraphicsLayer().apply {
+                        record { drawRect(targetColor) }
+                        setPathOutline(
+                            Path().apply {
+                                addRect(
+                                    Rect(
+                                        size.center.x.toFloat(),
+                                        size.center.y.toFloat(),
+                                        size.center.x + size.width.toFloat(),
+                                        size.center.y + size.height.toFloat()
+                                    )
+                                )
+                            }
                         )
-                    })
-                    clip = true
-                }
+                        clip = true
+                    }
                 drawRect(bgColor)
 
                 left = this.size.center.x.toInt()
@@ -1375,12 +1315,12 @@
                 with(pixmap) {
                     for (x in 0 until width) {
                         for (y in 0 until height) {
-                            val expected = if (x in left until right &&
-                                y in top until bottom) {
-                                targetColor
-                            } else {
-                                bgColor
-                            }
+                            val expected =
+                                if (x in left until right && y in top until bottom) {
+                                    targetColor
+                                } else {
+                                    bgColor
+                                }
                             Assert.assertEquals(this[x, y], expected)
                         }
                     }
@@ -1401,17 +1341,16 @@
         val targetColor = Color.Red
         graphicsLayerTest(
             block = { graphicsContext ->
-                layer = graphicsContext.createGraphicsLayer().apply {
-                    record {
-                        drawRect(targetColor)
+                layer =
+                    graphicsContext.createGraphicsLayer().apply {
+                        record { drawRect(targetColor) }
+                        setRoundRectOutline(
+                            this.size.center.toOffset(),
+                            (this.size / 2).toSize(),
+                            radius.toFloat()
+                        )
+                        clip = true
                     }
-                    setRoundRectOutline(
-                        this.size.center.toOffset(),
-                        (this.size / 2).toSize(),
-                        radius.toFloat()
-                    )
-                    clip = true
-                }
                 drawRect(bgColor)
 
                 left = this.size.center.x.toInt()
@@ -1430,9 +1369,7 @@
                     val endY = bottom - radius - offset
                     for (x in 0 until width) {
                         for (y in 0 until height) {
-                            if (
-                                x in startX until endX &&
-                                y in startY until endY) {
+                            if (x in startX until endX && y in startY until endY) {
                                 assertEquals(targetColor, this[x, y])
                             }
                         }
@@ -1477,28 +1414,25 @@
         graphicsLayerTest(
             block = { graphicsContext ->
                 val fullSize = size
-                val layerSize = Size(
-                    fullSize.width.roundToInt() - inset * 2,
-                    fullSize.height.roundToInt() - inset * 2
-                ).toIntSize()
+                val layerSize =
+                    Size(
+                            fullSize.width.roundToInt() - inset * 2,
+                            fullSize.height.roundToInt() - inset * 2
+                        )
+                        .toIntSize()
 
-                val layer = graphicsContext.createGraphicsLayer().apply {
-                    record(size = layerSize) {
-                        inset(-inset) {
-                            drawRect(targetColor)
-                        }
+                val layer =
+                    graphicsContext.createGraphicsLayer().apply {
+                        record(size = layerSize) { inset(-inset) { drawRect(targetColor) } }
+                        // as no outline is provided yet, this command will enable clipToBounds
+                        clip = true
+                        // then with providing an outline we should disable clipToBounds and start
+                        // using clipToOutline instead
+                        setRectOutline(Offset(-inset, -inset), fullSize)
                     }
-                    // as no outline is provided yet, this command will enable clipToBounds
-                    clip = true
-                    // then with providing an outline we should disable clipToBounds and start
-                    // using clipToOutline instead
-                    setRectOutline(Offset(-inset, -inset), fullSize)
-                }
 
                 drawRect(Color.Black)
-                inset(inset) {
-                    drawLayer(layer)
-                }
+                inset(inset) { drawLayer(layer) }
             },
             verify = { pixmap ->
                 with(pixmap) {
@@ -1542,97 +1476,91 @@
             var contentView: View? = null
             var rootGraphicsLayer: GraphicsLayer? = null
             var density = Density(1f)
-            scenario = ActivityScenario.launch(TestActivity::class.java)
-                .moveToState(Lifecycle.State.CREATED)
-                .onActivity {
-                    // See b/167533582 In the API 30 platform release, there was a StrictMode
-                    // violation with SurfaceControl#readFromParcel that would cause the tests to
-                    // crash on an issue not related to this test suite. So skip StrictMode tests
-                    // for this platform version.
-                    // See ag/283838 as Surface also violated StrictMode policies
-                    val sdk = Build.VERSION.SDK_INT
-                    val supportsStrictMode = sdk != Build.VERSION_CODES.R &&
-                        sdk >= Build.VERSION_CODES.M
-                    if (supportsStrictMode) {
-                        StrictMode.setVmPolicy(
-                            StrictMode.VmPolicy.Builder()
-                                .detectLeakedClosableObjects()
-                                .penaltyLog()
-                                .penaltyDeath()
-                                .build()
-                        )
-                    }
-
-                    container = FrameLayout(it).apply {
-                        setBackgroundColor(Color.White.toArgb())
-                        clipToPadding = false
-                        clipChildren = false
-                    }
-                    val graphicsContext = GraphicsContext(container!!).also {
-                        androidGraphicsContext = it
-                    }
-                    rootGraphicsLayer = graphicsContext.createGraphicsLayer()
-                    density = Density(it)
-                    val content = FrameLayout(it).apply {
-                        setLayoutParams(
-                            FrameLayout.LayoutParams(
-                                TEST_WIDTH,
-                                TEST_HEIGHT
+            scenario =
+                ActivityScenario.launch(TestActivity::class.java)
+                    .moveToState(Lifecycle.State.CREATED)
+                    .onActivity {
+                        // See b/167533582 In the API 30 platform release, there was a StrictMode
+                        // violation with SurfaceControl#readFromParcel that would cause the tests
+                        // to
+                        // crash on an issue not related to this test suite. So skip StrictMode
+                        // tests
+                        // for this platform version.
+                        // See ag/283838 as Surface also violated StrictMode policies
+                        val sdk = Build.VERSION.SDK_INT
+                        val supportsStrictMode =
+                            sdk != Build.VERSION_CODES.R && sdk >= Build.VERSION_CODES.M
+                        if (supportsStrictMode) {
+                            StrictMode.setVmPolicy(
+                                StrictMode.VmPolicy.Builder()
+                                    .detectLeakedClosableObjects()
+                                    .penaltyLog()
+                                    .penaltyDeath()
+                                    .build()
                             )
-                        )
-                        setBackgroundColor(Color.Black.toArgb())
-                        foreground = GraphicsContextHostDrawable(graphicsContext, block)
+                        }
+
+                        container =
+                            FrameLayout(it).apply {
+                                setBackgroundColor(Color.White.toArgb())
+                                clipToPadding = false
+                                clipChildren = false
+                            }
+                        val graphicsContext =
+                            GraphicsContext(container!!).also { androidGraphicsContext = it }
+                        rootGraphicsLayer = graphicsContext.createGraphicsLayer()
+                        density = Density(it)
+                        val content =
+                            FrameLayout(it).apply {
+                                setLayoutParams(FrameLayout.LayoutParams(TEST_WIDTH, TEST_HEIGHT))
+                                setBackgroundColor(Color.Black.toArgb())
+                                foreground = GraphicsContextHostDrawable(graphicsContext, block)
+                            }
+                        container!!.addView(content)
+                        contentView = content
+                        it.setContentView(container)
                     }
-                    container!!.addView(content)
-                    contentView = content
-                    it.setContentView(container)
-                }
             val resumed = CountDownLatch(1)
             var testActivity: TestActivity? = null
-            scenario.moveToState(Lifecycle.State.RESUMED)
-                .onActivity { activity ->
-                    testActivity = activity
-                    activity.runOnUiThread {
-                        // Layer persistence is only required on M+
-                        if (Build.VERSION.SDK_INT > Build.VERSION_CODES.M) {
-                            assertTrue(androidGraphicsContext!!.isLayerManagerInitialized())
-                        }
-                        resumed.countDown()
+            scenario.moveToState(Lifecycle.State.RESUMED).onActivity { activity ->
+                testActivity = activity
+                activity.runOnUiThread {
+                    // Layer persistence is only required on M+
+                    if (Build.VERSION.SDK_INT > Build.VERSION_CODES.M) {
+                        assertTrue(androidGraphicsContext!!.isLayerManagerInitialized())
                     }
+                    resumed.countDown()
                 }
+            }
             assertTrue(resumed.await(3000, TimeUnit.MILLISECONDS))
 
             if (verify != null) {
-                val target = if (entireScene) {
-                    container!!
-                } else {
-                    contentView!!
-                }
-                val pixelMap = if (usePixelCopy && Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
-                    target.captureToImage().toPixelMap()
-                } else {
-                    val recordLatch = CountDownLatch(1)
-                    testActivity!!.runOnUiThread {
-                        rootGraphicsLayer!!.record(
-                            density,
-                            Ltr,
-                            IntSize(target.width, target.height)
-                        ) {
-                            drawIntoCanvas { canvas ->
-                                target.draw(canvas.nativeCanvas)
+                val target =
+                    if (entireScene) {
+                        container!!
+                    } else {
+                        contentView!!
+                    }
+                val pixelMap =
+                    if (usePixelCopy && Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
+                        target.captureToImage().toPixelMap()
+                    } else {
+                        val recordLatch = CountDownLatch(1)
+                        testActivity!!.runOnUiThread {
+                            rootGraphicsLayer!!.record(
+                                density,
+                                Ltr,
+                                IntSize(target.width, target.height)
+                            ) {
+                                drawIntoCanvas { canvas -> target.draw(canvas.nativeCanvas) }
                             }
+                            recordLatch.countDown()
                         }
-                        recordLatch.countDown()
+                        assertTrue(recordLatch.await(3000, TimeUnit.MILLISECONDS))
+                        val bitmap = runBlocking { rootGraphicsLayer!!.toImageBitmap() }
+                        bitmap.toPixelMap()
                     }
-                    assertTrue(recordLatch.await(3000, TimeUnit.MILLISECONDS))
-                    val bitmap = runBlocking {
-                        rootGraphicsLayer!!.toImageBitmap()
-                    }
-                    bitmap.toPixelMap()
-                }
-                runBlocking {
-                    verify(pixelMap)
-                }
+                runBlocking { verify(pixelMap) }
                 if (verifySoftwareRender) {
                     val softwareRenderLatch = CountDownLatch(1)
                     var softwareBitmap: Bitmap? = null
@@ -1641,9 +1569,7 @@
                         softwareRenderLatch.countDown()
                     }
                     assertTrue(softwareRenderLatch.await(300, TimeUnit.MILLISECONDS))
-                    runBlocking {
-                        verify(softwareBitmap!!.asImageBitmap().toPixelMap())
-                    }
+                    runBlocking { verify(softwareBitmap!!.asImageBitmap().toPixelMap()) }
                 }
             }
         } finally {
@@ -1666,11 +1592,7 @@
     }
 
     private fun doSoftwareRender(target: View): Bitmap {
-        val bitmap = Bitmap.createBitmap(
-            target.width,
-            target.height,
-            Bitmap.Config.ARGB_8888
-        )
+        val bitmap = Bitmap.createBitmap(target.width, target.height, Bitmap.Config.ARGB_8888)
         val softwareCanvas = Canvas(bitmap)
         target.draw(softwareCanvas)
         return bitmap
diff --git a/compose/ui/ui-graphics/src/androidInstrumentedTest/kotlin/androidx/compose/ui/graphics/painter/BitmapPainterTest.kt b/compose/ui/ui-graphics/src/androidInstrumentedTest/kotlin/androidx/compose/ui/graphics/painter/BitmapPainterTest.kt
index 4bf380b..089dac5 100644
--- a/compose/ui/ui-graphics/src/androidInstrumentedTest/kotlin/androidx/compose/ui/graphics/painter/BitmapPainterTest.kt
+++ b/compose/ui/ui-graphics/src/androidInstrumentedTest/kotlin/androidx/compose/ui/graphics/painter/BitmapPainterTest.kt
@@ -48,9 +48,7 @@
     private fun createTestSrcImage(): ImageBitmap {
         val src = ImageBitmap(100, 100)
         val canvas = Canvas(src)
-        val paint = Paint().apply {
-            this.color = Color.Blue
-        }
+        val paint = Paint().apply { this.color = Color.Blue }
 
         canvas.drawRect(Rect(Offset.Zero, Size(100.0f, 100.0f)), paint)
         paint.color = Color.Red
@@ -61,13 +59,8 @@
     private fun createTestDstImage(): ImageBitmap {
         val dst = ImageBitmap(200, 200)
         val dstCanvas = Canvas(dst)
-        val dstPaint = Paint().apply {
-            this.color = Color.White
-        }
-        dstCanvas.drawRect(
-            Rect(Offset.Zero, Size(200.0f, 200.0f)),
-            dstPaint
-        )
+        val dstPaint = Paint().apply { this.color = Color.White }
+        dstCanvas.drawRect(Rect(Offset.Zero, Size(200.0f, 200.0f)), dstPaint)
         return dst
     }
 
@@ -96,12 +89,9 @@
         // instead of Painter's default implementation that invokes Canvas.saveLayer
         assertFalse(flagCanvas.saveLayerCalled)
 
-        val expected = Color(
-            alpha = 0.5f,
-            red = Color.Red.red,
-            green = Color.Red.green,
-            blue = Color.Red.blue
-        ).compositeOver(Color.White)
+        val expected =
+            Color(alpha = 0.5f, red = Color.Red.red, green = Color.Red.green, blue = Color.Red.blue)
+                .compositeOver(Color.White)
 
         val result = dst.toPixelMap()[50, 50]
         assertEquals(expected.red, result.red, 0.01f)
@@ -135,11 +125,8 @@
         val dst = createTestDstImage()
         val canvas = Canvas(dst)
 
-        val topLeftPainter = BitmapPainter(
-            srcImage,
-            srcOffset = IntOffset.Zero,
-            srcSize = IntSize(50, 50)
-        )
+        val topLeftPainter =
+            BitmapPainter(srcImage, srcOffset = IntOffset.Zero, srcSize = IntSize(50, 50))
 
         val intrinsicSize = topLeftPainter.intrinsicSize
         assertEquals(50.0f, intrinsicSize.width)
@@ -152,11 +139,8 @@
         assertEquals(Color.Blue, topLeftMap[49, 0])
         assertEquals(Color.Red, topLeftMap[49, 49])
 
-        val topRightPainter = BitmapPainter(
-            srcImage,
-            srcOffset = IntOffset(50, 0),
-            srcSize = IntSize(50, 50)
-        )
+        val topRightPainter =
+            BitmapPainter(srcImage, srcOffset = IntOffset(50, 0), srcSize = IntSize(50, 50))
 
         val topRightDst = createTestDstImage()
         drawPainter(topRightPainter, Canvas(topRightDst), topRightPainter.intrinsicSize)
@@ -167,11 +151,8 @@
         assertEquals(Color.Blue, topRightMap[49, 0])
         assertEquals(Color.Blue, topRightMap[49, 49])
 
-        val bottomLeftPainter = BitmapPainter(
-            srcImage,
-            srcOffset = IntOffset(0, 50),
-            srcSize = IntSize(50, 50)
-        )
+        val bottomLeftPainter =
+            BitmapPainter(srcImage, srcOffset = IntOffset(0, 50), srcSize = IntSize(50, 50))
 
         drawPainter(bottomLeftPainter, canvas, bottomLeftPainter.intrinsicSize)
 
@@ -181,11 +162,8 @@
         assertEquals(Color.Blue, bottomLeftMap[0, 49])
         assertEquals(Color.Blue, bottomLeftMap[49, 49])
 
-        val bottomRightPainter = BitmapPainter(
-            srcImage,
-            srcOffset = IntOffset(50, 50),
-            srcSize = IntSize(50, 50)
-        )
+        val bottomRightPainter =
+            BitmapPainter(srcImage, srcOffset = IntOffset(50, 50), srcSize = IntSize(50, 50))
 
         drawPainter(bottomRightPainter, canvas, bottomRightPainter.intrinsicSize)
 
@@ -200,9 +178,7 @@
     fun testFilterQualityNone() {
         val sampleBitmap = ImageBitmap(3, 3)
         val canvas = androidx.compose.ui.graphics.Canvas(sampleBitmap)
-        val samplePaint = Paint().apply {
-            color = Color.White
-        }
+        val samplePaint = Paint().apply { color = Color.White }
 
         canvas.drawRect(0f, 0f, 3f, 3f, samplePaint)
 
@@ -245,11 +221,7 @@
     @Test
     fun testInvalidLeftBoundThrows() {
         try {
-            BitmapPainter(
-                createTestSrcImage(),
-                IntOffset(-1, 1),
-                IntSize(10, 10)
-            )
+            BitmapPainter(createTestSrcImage(), IntOffset(-1, 1), IntSize(10, 10))
             fail("Left bound must be greater than or equal to zero")
         } catch (e: IllegalArgumentException) {
             // no-op
@@ -259,11 +231,7 @@
     @Test
     fun testInvalidTopBoundThrows() {
         try {
-            BitmapPainter(
-                createTestSrcImage(),
-                IntOffset(0, -1),
-                IntSize(10, 10)
-            )
+            BitmapPainter(createTestSrcImage(), IntOffset(0, -1), IntSize(10, 10))
             fail("Top bound must be greater than or equal to zero")
         } catch (e: IllegalArgumentException) {
             // no-op
@@ -274,11 +242,7 @@
     fun testInvalidRightBoundThrows() {
         try {
             val image = createTestSrcImage()
-            BitmapPainter(
-                image,
-                IntOffset(0, 0),
-                IntSize(image.width + 1, 10)
-            )
+            BitmapPainter(image, IntOffset(0, 0), IntSize(image.width + 1, 10))
             fail("Right bound must be less than ImageBitmap width")
         } catch (e: IllegalArgumentException) {
             // no-op
@@ -289,11 +253,7 @@
     fun testInvalidBottomBoundThrows() {
         try {
             val image = createTestSrcImage()
-            BitmapPainter(
-                image,
-                IntOffset(0, 0),
-                IntSize(10, image.height + 1)
-            )
+            BitmapPainter(image, IntOffset(0, 0), IntSize(10, image.height + 1))
             fail("Bottom bound must be less than ImageBitmap height")
         } catch (e: IllegalArgumentException) {
             // no-op
@@ -303,11 +263,7 @@
     @Test
     fun testRightLessThanLeftThrows() {
         try {
-            BitmapPainter(
-                createTestSrcImage(),
-                IntOffset(50, 0),
-                IntSize(-40, 10)
-            )
+            BitmapPainter(createTestSrcImage(), IntOffset(50, 0), IntSize(-40, 10))
             fail("Right bound must be greater than left bound")
         } catch (e: IllegalArgumentException) {
             // no-op
@@ -317,11 +273,7 @@
     @Test
     fun testTopLessThanBottomThrows() {
         try {
-            BitmapPainter(
-                createTestSrcImage(),
-                IntOffset(0, 100),
-                IntSize(-90, -90)
-            )
+            BitmapPainter(createTestSrcImage(), IntOffset(0, 100), IntSize(-90, -90))
             fail("Bottom bound must be larger than top bound")
         } catch (e: IllegalArgumentException) {
             // no-op
diff --git a/compose/ui/ui-graphics/src/androidInstrumentedTest/kotlin/androidx/compose/ui/graphics/painter/BrushPainterTest.kt b/compose/ui/ui-graphics/src/androidInstrumentedTest/kotlin/androidx/compose/ui/graphics/painter/BrushPainterTest.kt
index 55036a7..886cd45 100644
--- a/compose/ui/ui-graphics/src/androidInstrumentedTest/kotlin/androidx/compose/ui/graphics/painter/BrushPainterTest.kt
+++ b/compose/ui/ui-graphics/src/androidInstrumentedTest/kotlin/androidx/compose/ui/graphics/painter/BrushPainterTest.kt
@@ -38,26 +38,21 @@
 
     private fun createImageBitmap(): ImageBitmap {
         val image = ImageBitmap(100, 100)
-        Canvas(image).drawRect(
-            0f,
-            0f,
-            100f,
-            100f,
-            Paint().apply { color = Color.White }
-        )
+        Canvas(image).drawRect(0f, 0f, 100f, 100f, Paint().apply { color = Color.White })
         return image
     }
 
     @Test
     fun testBrushPainter() {
-        val brushPainter = BrushPainter(
-            Brush.verticalGradient(
-                0.0f to Color.Red,
-                0.5f to Color.Red,
-                0.5f to Color.Blue,
-                1.0f to Color.Blue
+        val brushPainter =
+            BrushPainter(
+                Brush.verticalGradient(
+                    0.0f to Color.Red,
+                    0.5f to Color.Red,
+                    0.5f to Color.Blue,
+                    1.0f to Color.Blue
+                )
             )
-        )
         val image = createImageBitmap()
         drawPainter(brushPainter, Canvas(image), Size(100f, 100f))
         val pixelMap = image.toPixelMap()
@@ -74,30 +69,25 @@
 
     @Test
     fun testBrushPainterAlphaApplied() {
-        val brushPainter = BrushPainter(
-            Brush.verticalGradient(
-                0.0f to Color.Red,
-                0.5f to Color.Red,
-                0.5f to Color.Blue,
-                1.0f to Color.Blue
+        val brushPainter =
+            BrushPainter(
+                Brush.verticalGradient(
+                    0.0f to Color.Red,
+                    0.5f to Color.Red,
+                    0.5f to Color.Blue,
+                    1.0f to Color.Blue
+                )
             )
-        )
         val image = createImageBitmap()
         drawPainter(brushPainter, Canvas(image), Size(100f, 100f), alpha = 0.5f)
 
-        val expectedRed = Color(
-            alpha = 0.5f,
-            red = Color.Red.red,
-            green = 0f,
-            blue = 0f
-        ).compositeOver(Color.White)
+        val expectedRed =
+            Color(alpha = 0.5f, red = Color.Red.red, green = 0f, blue = 0f)
+                .compositeOver(Color.White)
 
-        val expectedBlue = Color(
-            alpha = 0.5f,
-            red = 0f,
-            green = 0f,
-            blue = Color.Blue.blue
-        ).compositeOver(Color.White)
+        val expectedBlue =
+            Color(alpha = 0.5f, red = 0f, green = 0f, blue = Color.Blue.blue)
+                .compositeOver(Color.White)
 
         val pixelMap = image.toPixelMap()
         assertEquals(expectedRed, pixelMap[0, 0])
@@ -113,14 +103,15 @@
 
     @Test
     fun testBrushPainterTint() {
-        val brushPainter = BrushPainter(
-            Brush.verticalGradient(
-                0.0f to Color.Red,
-                0.5f to Color.Red,
-                0.5f to Color.Blue,
-                1.0f to Color.Blue
+        val brushPainter =
+            BrushPainter(
+                Brush.verticalGradient(
+                    0.0f to Color.Red,
+                    0.5f to Color.Red,
+                    0.5f to Color.Blue,
+                    1.0f to Color.Blue
+                )
             )
-        )
         val image = createImageBitmap()
         drawPainter(
             brushPainter,
@@ -142,17 +133,11 @@
 
     @Test
     fun testBrushPainterEquals() {
-        val brush1 = Brush.verticalGradient(
-            0.0f to Color.Red,
-            0.3f to Color.Blue,
-            0.7f to Color.Green
-        )
+        val brush1 =
+            Brush.verticalGradient(0.0f to Color.Red, 0.3f to Color.Blue, 0.7f to Color.Green)
 
-        val brush2 = Brush.verticalGradient(
-            0.0f to Color.Red,
-            0.3f to Color.Blue,
-            0.7f to Color.Green
-        )
+        val brush2 =
+            Brush.verticalGradient(0.0f to Color.Red, 0.3f to Color.Blue, 0.7f to Color.Green)
 
         assertEquals(BrushPainter(brush1), BrushPainter(brush2))
     }
@@ -165,19 +150,15 @@
 
     @Test
     fun testBrushPainterToString() {
-        val brush = Brush.verticalGradient(
-            listOf(Color.White, Color.Black, Color.Gray, Color.LightGray)
-        )
+        val brush =
+            Brush.verticalGradient(listOf(Color.White, Color.Black, Color.Gray, Color.LightGray))
         assertEquals("BrushPainter(brush=$brush)", BrushPainter(brush).toString())
     }
 
     @Test
     fun testBrushPainterIntrinsicSize() {
-        val brush = Brush.verticalGradient(
-            listOf(Color.White, Color.Black),
-            startY = 0f,
-            endY = 100f
-        )
+        val brush =
+            Brush.verticalGradient(listOf(Color.White, Color.Black), startY = 0f, endY = 100f)
         assertEquals(Size(0.0f, 100f), BrushPainter(brush).intrinsicSize)
     }
 }
diff --git a/compose/ui/ui-graphics/src/androidInstrumentedTest/kotlin/androidx/compose/ui/graphics/painter/PainterTest.kt b/compose/ui/ui-graphics/src/androidInstrumentedTest/kotlin/androidx/compose/ui/graphics/painter/PainterTest.kt
index 66ce5e1..f77796d 100644
--- a/compose/ui/ui-graphics/src/androidInstrumentedTest/kotlin/androidx/compose/ui/graphics/painter/PainterTest.kt
+++ b/compose/ui/ui-graphics/src/androidInstrumentedTest/kotlin/androidx/compose/ui/graphics/painter/PainterTest.kt
@@ -45,71 +45,65 @@
 
     @Test
     fun testPainterDidDraw() {
-        val p = object : Painter() {
+        val p =
+            object : Painter() {
 
-            var didDraw: Boolean = false
+                var didDraw: Boolean = false
 
-            override val intrinsicSize: Size
-                get() = size
+                override val intrinsicSize: Size
+                    get() = size
 
-            override fun DrawScope.onDraw() {
-                didDraw = true
+                override fun DrawScope.onDraw() {
+                    didDraw = true
+                }
             }
-        }
 
         assertEquals(size, p.intrinsicSize)
         assertFalse(p.didDraw)
 
-        drawPainter(
-            p,
-            Canvas(ImageBitmap(100, 100)),
-            Size(100f, 100f)
-        )
+        drawPainter(p, Canvas(ImageBitmap(100, 100)), Size(100f, 100f))
         assertTrue(p.didDraw)
     }
 
     @Test
     fun testPainterRtl() {
-        val p = object : Painter() {
+        val p =
+            object : Painter() {
 
-            var color = Color.Black
+                var color = Color.Black
 
-            override val intrinsicSize: Size
-                get() = size
+                override val intrinsicSize: Size
+                    get() = size
 
-            override fun applyLayoutDirection(layoutDirection: LayoutDirection): Boolean {
-                color = if (layoutDirection == LayoutDirection.Rtl) Color.Red else Color.Cyan
-                return true
+                override fun applyLayoutDirection(layoutDirection: LayoutDirection): Boolean {
+                    color = if (layoutDirection == LayoutDirection.Rtl) Color.Red else Color.Cyan
+                    return true
+                }
+
+                override fun DrawScope.onDraw() {
+                    drawRect(color = color)
+                }
             }
 
-            override fun DrawScope.onDraw() {
-                drawRect(color = color)
-            }
-        }
-
         val image = ImageBitmap(100, 100)
 
-        drawPainter(
-            p,
-            Canvas(image),
-            Size(100f, 100f),
-            layoutDirection = LayoutDirection.Rtl
-        )
+        drawPainter(p, Canvas(image), Size(100f, 100f), layoutDirection = LayoutDirection.Rtl)
 
         assertEquals(Color.Red, image.toPixelMap()[50, 50])
     }
 
     @Test
     fun testPainterAlpha() {
-        val p = object : Painter() {
+        val p =
+            object : Painter() {
 
-            override val intrinsicSize: Size
-                get() = size
+                override val intrinsicSize: Size
+                    get() = size
 
-            override fun DrawScope.onDraw() {
-                drawRect(color = Color.Red)
+                override fun DrawScope.onDraw() {
+                    drawRect(color = Color.Red)
+                }
             }
-        }
 
         val image = ImageBitmap(100, 100)
         val canvas = Canvas(image)
@@ -117,19 +111,11 @@
         val paint = Paint().apply { this.color = Color.White }
         canvas.drawRect(Rect(Offset.Zero, Size(100.0f, 100.0f)), paint)
 
-        drawPainter(
-            p,
-            canvas,
-            size,
-            alpha = 0.5f
-        )
+        drawPainter(p, canvas, size, alpha = 0.5f)
 
-        val expected = Color(
-            alpha = 0.5f,
-            red = Color.Red.red,
-            green = Color.Red.green,
-            blue = Color.Red.blue
-        ).compositeOver(Color.White)
+        val expected =
+            Color(alpha = 0.5f, red = Color.Red.red, green = Color.Red.green, blue = Color.Red.blue)
+                .compositeOver(Color.White)
 
         val result = image.toPixelMap()[50, 50]
         assertEquals(expected.red, result.red, 0.01f)
@@ -140,29 +126,30 @@
 
     @Test
     fun testPainterCustomAlpha() {
-        val p = object : Painter() {
+        val p =
+            object : Painter() {
 
-            var color = Color.Red
+                var color = Color.Red
 
-            override fun applyAlpha(alpha: Float): Boolean {
-                color =
-                    Color(
-                        alpha = alpha,
-                        red = Color.Red.red,
-                        blue = Color.Red.blue,
-                        green = Color.Red.green
-                    )
-                return true
+                override fun applyAlpha(alpha: Float): Boolean {
+                    color =
+                        Color(
+                            alpha = alpha,
+                            red = Color.Red.red,
+                            blue = Color.Red.blue,
+                            green = Color.Red.green
+                        )
+                    return true
+                }
+
+                override val intrinsicSize: Size
+                    get() = size
+
+                override fun DrawScope.onDraw() {
+                    drawRect(color = color)
+                }
             }
 
-            override val intrinsicSize: Size
-                get() = size
-
-            override fun DrawScope.onDraw() {
-                drawRect(color = color)
-            }
-        }
-
         assertEquals(Color.Red, p.color)
         val image = ImageBitmap(100, 100)
         val canvas = Canvas(image)
@@ -170,19 +157,11 @@
         val paint = Paint().apply { this.color = Color.White }
         canvas.drawRect(Rect(Offset.Zero, Size(100.0f, 100.0f)), paint)
 
-        drawPainter(
-            p,
-            canvas,
-            size,
-            alpha = 0.5f
-        )
+        drawPainter(p, canvas, size, alpha = 0.5f)
 
-        val expected = Color(
-            alpha = 0.5f,
-            red = Color.Red.red,
-            green = Color.Red.green,
-            blue = Color.Red.blue
-        ).compositeOver(Color.White)
+        val expected =
+            Color(alpha = 0.5f, red = Color.Red.red, green = Color.Red.green, blue = Color.Red.blue)
+                .compositeOver(Color.White)
 
         val result = image.toPixelMap()[50, 50]
         assertEquals(expected.red, result.red, 0.01f)
@@ -193,23 +172,24 @@
 
     @Test
     fun testColorFilter() {
-        val p = object : Painter() {
+        val p =
+            object : Painter() {
 
-            var colorFilter: ColorFilter? = ColorFilter.tint(Color.Red, BlendMode.SrcIn)
+                var colorFilter: ColorFilter? = ColorFilter.tint(Color.Red, BlendMode.SrcIn)
 
-            override fun applyColorFilter(colorFilter: ColorFilter?): Boolean {
-                this.colorFilter = colorFilter
-                return true
+                override fun applyColorFilter(colorFilter: ColorFilter?): Boolean {
+                    this.colorFilter = colorFilter
+                    return true
+                }
+
+                override val intrinsicSize: Size
+                    get() = size
+
+                override fun DrawScope.onDraw() {
+                    drawRect(color = Color.Black, colorFilter = colorFilter)
+                }
             }
 
-            override val intrinsicSize: Size
-                get() = size
-
-            override fun DrawScope.onDraw() {
-                drawRect(color = Color.Black, colorFilter = colorFilter)
-            }
-        }
-
         val image = ImageBitmap(100, 100)
 
         drawPainter(
diff --git a/compose/ui/ui-graphics/src/androidInstrumentedTest/kotlin/androidx/compose/ui/graphics/painter/PainterTestHelper.kt b/compose/ui/ui-graphics/src/androidInstrumentedTest/kotlin/androidx/compose/ui/graphics/painter/PainterTestHelper.kt
index b940919..08f8ee6 100644
--- a/compose/ui/ui-graphics/src/androidInstrumentedTest/kotlin/androidx/compose/ui/graphics/painter/PainterTestHelper.kt
+++ b/compose/ui/ui-graphics/src/androidInstrumentedTest/kotlin/androidx/compose/ui/graphics/painter/PainterTestHelper.kt
@@ -24,8 +24,8 @@
 import androidx.compose.ui.unit.LayoutDirection
 
 /**
- * Helper method that draws a Painter into the given canvas, automatically creating a DrawScope
- * to do so with
+ * Helper method that draws a Painter into the given canvas, automatically creating a DrawScope to
+ * do so with
  */
 fun drawPainter(
     painter: Painter,
@@ -36,8 +36,6 @@
     layoutDirection: LayoutDirection = LayoutDirection.Ltr
 ) {
     CanvasDrawScope().draw(Density(1.0f, 1.0f), layoutDirection, canvas, size) {
-        with(painter) {
-            draw(size, alpha = alpha, colorFilter = colorFilter)
-        }
+        with(painter) { draw(size, alpha = alpha, colorFilter = colorFilter) }
     }
 }
diff --git a/compose/ui/ui-graphics/src/androidMain/kotlin/androidx/compose/ui/graphics/AndroidBlendMode.android.kt b/compose/ui/ui-graphics/src/androidMain/kotlin/androidx/compose/ui/graphics/AndroidBlendMode.android.kt
index ae5022f..c405ded 100644
--- a/compose/ui/ui-graphics/src/androidMain/kotlin/androidx/compose/ui/graphics/AndroidBlendMode.android.kt
+++ b/compose/ui/ui-graphics/src/androidMain/kotlin/androidx/compose/ui/graphics/AndroidBlendMode.android.kt
@@ -20,10 +20,10 @@
 import androidx.annotation.RequiresApi
 
 /**
- * Helper method to determine if the appropriate [BlendMode] is supported on the given Android
- * API level this provides an opportunity for consumers to fallback on an alternative user
- * experience for devices that do not support the corresponding blend mode. Usages of [BlendMode]
- * types that are not supported will fallback onto the default of [BlendMode.SrcOver]
+ * Helper method to determine if the appropriate [BlendMode] is supported on the given Android API
+ * level this provides an opportunity for consumers to fallback on an alternative user experience
+ * for devices that do not support the corresponding blend mode. Usages of [BlendMode] types that
+ * are not supported will fallback onto the default of [BlendMode.SrcOver]
  */
 actual fun BlendMode.isSupported(): Boolean {
     // All blend modes supported on Android Q /API level 29+
@@ -40,104 +40,107 @@
  * Convert the [BlendMode] to the corresponding [android.graphics.PorterDuff.Mode] if it exists,
  * falling back on the default of [android.graphics.PorterDuff.Mode.SRC_OVER] for unsupported types
  */
-internal fun BlendMode.toPorterDuffMode(): android.graphics.PorterDuff.Mode = when (this) {
-    BlendMode.Clear -> android.graphics.PorterDuff.Mode.CLEAR
-    BlendMode.Src -> android.graphics.PorterDuff.Mode.SRC
-    BlendMode.Dst -> android.graphics.PorterDuff.Mode.DST
-    BlendMode.SrcOver -> android.graphics.PorterDuff.Mode.SRC_OVER
-    BlendMode.DstOver -> android.graphics.PorterDuff.Mode.DST_OVER
-    BlendMode.SrcIn -> android.graphics.PorterDuff.Mode.SRC_IN
-    BlendMode.DstIn -> android.graphics.PorterDuff.Mode.DST_IN
-    BlendMode.SrcOut -> android.graphics.PorterDuff.Mode.SRC_OUT
-    BlendMode.DstOut -> android.graphics.PorterDuff.Mode.DST_OUT
-    BlendMode.SrcAtop -> android.graphics.PorterDuff.Mode.SRC_ATOP
-    BlendMode.DstAtop -> android.graphics.PorterDuff.Mode.DST_ATOP
-    BlendMode.Xor -> android.graphics.PorterDuff.Mode.XOR
-    BlendMode.Plus -> android.graphics.PorterDuff.Mode.ADD
-    BlendMode.Screen -> android.graphics.PorterDuff.Mode.SCREEN
-    BlendMode.Overlay -> android.graphics.PorterDuff.Mode.OVERLAY
-    BlendMode.Darken -> android.graphics.PorterDuff.Mode.DARKEN
-    BlendMode.Lighten -> android.graphics.PorterDuff.Mode.LIGHTEN
-    BlendMode.Modulate -> {
-        // b/73224934 Android PorterDuff Multiply maps to Skia Modulate
-        android.graphics.PorterDuff.Mode.MULTIPLY
+internal fun BlendMode.toPorterDuffMode(): android.graphics.PorterDuff.Mode =
+    when (this) {
+        BlendMode.Clear -> android.graphics.PorterDuff.Mode.CLEAR
+        BlendMode.Src -> android.graphics.PorterDuff.Mode.SRC
+        BlendMode.Dst -> android.graphics.PorterDuff.Mode.DST
+        BlendMode.SrcOver -> android.graphics.PorterDuff.Mode.SRC_OVER
+        BlendMode.DstOver -> android.graphics.PorterDuff.Mode.DST_OVER
+        BlendMode.SrcIn -> android.graphics.PorterDuff.Mode.SRC_IN
+        BlendMode.DstIn -> android.graphics.PorterDuff.Mode.DST_IN
+        BlendMode.SrcOut -> android.graphics.PorterDuff.Mode.SRC_OUT
+        BlendMode.DstOut -> android.graphics.PorterDuff.Mode.DST_OUT
+        BlendMode.SrcAtop -> android.graphics.PorterDuff.Mode.SRC_ATOP
+        BlendMode.DstAtop -> android.graphics.PorterDuff.Mode.DST_ATOP
+        BlendMode.Xor -> android.graphics.PorterDuff.Mode.XOR
+        BlendMode.Plus -> android.graphics.PorterDuff.Mode.ADD
+        BlendMode.Screen -> android.graphics.PorterDuff.Mode.SCREEN
+        BlendMode.Overlay -> android.graphics.PorterDuff.Mode.OVERLAY
+        BlendMode.Darken -> android.graphics.PorterDuff.Mode.DARKEN
+        BlendMode.Lighten -> android.graphics.PorterDuff.Mode.LIGHTEN
+        BlendMode.Modulate -> {
+            // b/73224934 Android PorterDuff Multiply maps to Skia Modulate
+            android.graphics.PorterDuff.Mode.MULTIPLY
+        }
+        // Always return SRC_OVER as the default if there is no valid alternative
+        else -> android.graphics.PorterDuff.Mode.SRC_OVER
     }
-    // Always return SRC_OVER as the default if there is no valid alternative
-    else -> android.graphics.PorterDuff.Mode.SRC_OVER
-}
 
 /**
  * Convert the compose [BlendMode] to the underlying Android platform [android.graphics.BlendMode]
  */
 @RequiresApi(Build.VERSION_CODES.Q)
-internal fun BlendMode.toAndroidBlendMode(): android.graphics.BlendMode = when (this) {
-    BlendMode.Clear -> android.graphics.BlendMode.CLEAR
-    BlendMode.Src -> android.graphics.BlendMode.SRC
-    BlendMode.Dst -> android.graphics.BlendMode.DST
-    BlendMode.SrcOver -> android.graphics.BlendMode.SRC_OVER
-    BlendMode.DstOver -> android.graphics.BlendMode.DST_OVER
-    BlendMode.SrcIn -> android.graphics.BlendMode.SRC_IN
-    BlendMode.DstIn -> android.graphics.BlendMode.DST_IN
-    BlendMode.SrcOut -> android.graphics.BlendMode.SRC_OUT
-    BlendMode.DstOut -> android.graphics.BlendMode.DST_OUT
-    BlendMode.SrcAtop -> android.graphics.BlendMode.SRC_ATOP
-    BlendMode.DstAtop -> android.graphics.BlendMode.DST_ATOP
-    BlendMode.Xor -> android.graphics.BlendMode.XOR
-    BlendMode.Plus -> android.graphics.BlendMode.PLUS
-    BlendMode.Modulate -> android.graphics.BlendMode.MODULATE
-    BlendMode.Screen -> android.graphics.BlendMode.SCREEN
-    BlendMode.Overlay -> android.graphics.BlendMode.OVERLAY
-    BlendMode.Darken -> android.graphics.BlendMode.DARKEN
-    BlendMode.Lighten -> android.graphics.BlendMode.LIGHTEN
-    BlendMode.ColorDodge -> android.graphics.BlendMode.COLOR_DODGE
-    BlendMode.ColorBurn -> android.graphics.BlendMode.COLOR_BURN
-    BlendMode.Hardlight -> android.graphics.BlendMode.HARD_LIGHT
-    BlendMode.Softlight -> android.graphics.BlendMode.SOFT_LIGHT
-    BlendMode.Difference -> android.graphics.BlendMode.DIFFERENCE
-    BlendMode.Exclusion -> android.graphics.BlendMode.EXCLUSION
-    BlendMode.Multiply -> android.graphics.BlendMode.MULTIPLY
-    BlendMode.Hue -> android.graphics.BlendMode.HUE
-    BlendMode.Saturation -> android.graphics.BlendMode.SATURATION
-    BlendMode.Color -> android.graphics.BlendMode.COLOR
-    BlendMode.Luminosity -> android.graphics.BlendMode.LUMINOSITY
-    // Always return SRC_OVER as the default if there is no valid alternative
-    else -> android.graphics.BlendMode.SRC_OVER
-}
+internal fun BlendMode.toAndroidBlendMode(): android.graphics.BlendMode =
+    when (this) {
+        BlendMode.Clear -> android.graphics.BlendMode.CLEAR
+        BlendMode.Src -> android.graphics.BlendMode.SRC
+        BlendMode.Dst -> android.graphics.BlendMode.DST
+        BlendMode.SrcOver -> android.graphics.BlendMode.SRC_OVER
+        BlendMode.DstOver -> android.graphics.BlendMode.DST_OVER
+        BlendMode.SrcIn -> android.graphics.BlendMode.SRC_IN
+        BlendMode.DstIn -> android.graphics.BlendMode.DST_IN
+        BlendMode.SrcOut -> android.graphics.BlendMode.SRC_OUT
+        BlendMode.DstOut -> android.graphics.BlendMode.DST_OUT
+        BlendMode.SrcAtop -> android.graphics.BlendMode.SRC_ATOP
+        BlendMode.DstAtop -> android.graphics.BlendMode.DST_ATOP
+        BlendMode.Xor -> android.graphics.BlendMode.XOR
+        BlendMode.Plus -> android.graphics.BlendMode.PLUS
+        BlendMode.Modulate -> android.graphics.BlendMode.MODULATE
+        BlendMode.Screen -> android.graphics.BlendMode.SCREEN
+        BlendMode.Overlay -> android.graphics.BlendMode.OVERLAY
+        BlendMode.Darken -> android.graphics.BlendMode.DARKEN
+        BlendMode.Lighten -> android.graphics.BlendMode.LIGHTEN
+        BlendMode.ColorDodge -> android.graphics.BlendMode.COLOR_DODGE
+        BlendMode.ColorBurn -> android.graphics.BlendMode.COLOR_BURN
+        BlendMode.Hardlight -> android.graphics.BlendMode.HARD_LIGHT
+        BlendMode.Softlight -> android.graphics.BlendMode.SOFT_LIGHT
+        BlendMode.Difference -> android.graphics.BlendMode.DIFFERENCE
+        BlendMode.Exclusion -> android.graphics.BlendMode.EXCLUSION
+        BlendMode.Multiply -> android.graphics.BlendMode.MULTIPLY
+        BlendMode.Hue -> android.graphics.BlendMode.HUE
+        BlendMode.Saturation -> android.graphics.BlendMode.SATURATION
+        BlendMode.Color -> android.graphics.BlendMode.COLOR
+        BlendMode.Luminosity -> android.graphics.BlendMode.LUMINOSITY
+        // Always return SRC_OVER as the default if there is no valid alternative
+        else -> android.graphics.BlendMode.SRC_OVER
+    }
 
 /**
  * Convert the compose [BlendMode] to the underlying Android platform [android.graphics.BlendMode]
  */
 @RequiresApi(Build.VERSION_CODES.Q)
-internal fun android.graphics.BlendMode.toComposeBlendMode(): BlendMode = when (this) {
-    android.graphics.BlendMode.CLEAR -> BlendMode.Clear
-    android.graphics.BlendMode.SRC -> BlendMode.Src
-    android.graphics.BlendMode.DST -> BlendMode.Dst
-    android.graphics.BlendMode.SRC_OVER -> BlendMode.SrcOver
-    android.graphics.BlendMode.DST_OVER -> BlendMode.DstOver
-    android.graphics.BlendMode.SRC_IN -> BlendMode.SrcIn
-    android.graphics.BlendMode.DST_IN -> BlendMode.DstIn
-    android.graphics.BlendMode.SRC_OUT -> BlendMode.SrcOut
-    android.graphics.BlendMode.DST_OUT -> BlendMode.DstOut
-    android.graphics.BlendMode.SRC_ATOP -> BlendMode.SrcAtop
-    android.graphics.BlendMode.DST_ATOP -> BlendMode.DstAtop
-    android.graphics.BlendMode.XOR -> BlendMode.Xor
-    android.graphics.BlendMode.PLUS -> BlendMode.Plus
-    android.graphics.BlendMode.MODULATE -> BlendMode.Modulate
-    android.graphics.BlendMode.SCREEN -> BlendMode.Screen
-    android.graphics.BlendMode.OVERLAY -> BlendMode.Overlay
-    android.graphics.BlendMode.DARKEN -> BlendMode.Darken
-    android.graphics.BlendMode.LIGHTEN -> BlendMode.Lighten
-    android.graphics.BlendMode.COLOR_DODGE -> BlendMode.ColorDodge
-    android.graphics.BlendMode.COLOR_BURN -> BlendMode.ColorBurn
-    android.graphics.BlendMode.HARD_LIGHT -> BlendMode.Hardlight
-    android.graphics.BlendMode.SOFT_LIGHT -> BlendMode.Softlight
-    android.graphics.BlendMode.DIFFERENCE -> BlendMode.Difference
-    android.graphics.BlendMode.EXCLUSION -> BlendMode.Exclusion
-    android.graphics.BlendMode.MULTIPLY -> BlendMode.Multiply
-    android.graphics.BlendMode.HUE -> BlendMode.Hue
-    android.graphics.BlendMode.SATURATION -> BlendMode.Saturation
-    android.graphics.BlendMode.COLOR -> BlendMode.Color
-    android.graphics.BlendMode.LUMINOSITY -> BlendMode.Luminosity
-    // Always return SrcOver as the default if there is no valid alternative
-    else -> BlendMode.SrcOver
-}
+internal fun android.graphics.BlendMode.toComposeBlendMode(): BlendMode =
+    when (this) {
+        android.graphics.BlendMode.CLEAR -> BlendMode.Clear
+        android.graphics.BlendMode.SRC -> BlendMode.Src
+        android.graphics.BlendMode.DST -> BlendMode.Dst
+        android.graphics.BlendMode.SRC_OVER -> BlendMode.SrcOver
+        android.graphics.BlendMode.DST_OVER -> BlendMode.DstOver
+        android.graphics.BlendMode.SRC_IN -> BlendMode.SrcIn
+        android.graphics.BlendMode.DST_IN -> BlendMode.DstIn
+        android.graphics.BlendMode.SRC_OUT -> BlendMode.SrcOut
+        android.graphics.BlendMode.DST_OUT -> BlendMode.DstOut
+        android.graphics.BlendMode.SRC_ATOP -> BlendMode.SrcAtop
+        android.graphics.BlendMode.DST_ATOP -> BlendMode.DstAtop
+        android.graphics.BlendMode.XOR -> BlendMode.Xor
+        android.graphics.BlendMode.PLUS -> BlendMode.Plus
+        android.graphics.BlendMode.MODULATE -> BlendMode.Modulate
+        android.graphics.BlendMode.SCREEN -> BlendMode.Screen
+        android.graphics.BlendMode.OVERLAY -> BlendMode.Overlay
+        android.graphics.BlendMode.DARKEN -> BlendMode.Darken
+        android.graphics.BlendMode.LIGHTEN -> BlendMode.Lighten
+        android.graphics.BlendMode.COLOR_DODGE -> BlendMode.ColorDodge
+        android.graphics.BlendMode.COLOR_BURN -> BlendMode.ColorBurn
+        android.graphics.BlendMode.HARD_LIGHT -> BlendMode.Hardlight
+        android.graphics.BlendMode.SOFT_LIGHT -> BlendMode.Softlight
+        android.graphics.BlendMode.DIFFERENCE -> BlendMode.Difference
+        android.graphics.BlendMode.EXCLUSION -> BlendMode.Exclusion
+        android.graphics.BlendMode.MULTIPLY -> BlendMode.Multiply
+        android.graphics.BlendMode.HUE -> BlendMode.Hue
+        android.graphics.BlendMode.SATURATION -> BlendMode.Saturation
+        android.graphics.BlendMode.COLOR -> BlendMode.Color
+        android.graphics.BlendMode.LUMINOSITY -> BlendMode.Luminosity
+        // Always return SrcOver as the default if there is no valid alternative
+        else -> BlendMode.SrcOver
+    }
diff --git a/compose/ui/ui-graphics/src/androidMain/kotlin/androidx/compose/ui/graphics/AndroidCanvas.android.kt b/compose/ui/ui-graphics/src/androidMain/kotlin/androidx/compose/ui/graphics/AndroidCanvas.android.kt
index b1e4057..b618795 100644
--- a/compose/ui/ui-graphics/src/androidMain/kotlin/androidx/compose/ui/graphics/AndroidCanvas.android.kt
+++ b/compose/ui/ui-graphics/src/androidMain/kotlin/androidx/compose/ui/graphics/AndroidCanvas.android.kt
@@ -24,21 +24,15 @@
 
 actual typealias NativeCanvas = android.graphics.Canvas
 
-/**
- * Create a new Canvas instance that targets its drawing commands
- * to the provided [ImageBitmap]
- */
+/** Create a new Canvas instance that targets its drawing commands to the provided [ImageBitmap] */
 internal actual fun ActualCanvas(image: ImageBitmap): Canvas =
-    AndroidCanvas().apply {
-        internalCanvas = android.graphics.Canvas(image.asAndroidBitmap())
-    }
+    AndroidCanvas().apply { internalCanvas = android.graphics.Canvas(image.asAndroidBitmap()) }
 
-fun Canvas(c: android.graphics.Canvas): Canvas =
-    AndroidCanvas().apply { internalCanvas = c }
+fun Canvas(c: android.graphics.Canvas): Canvas = AndroidCanvas().apply { internalCanvas = c }
 
 /**
- * Holder class that is used to issue scoped calls to a [Canvas] from the framework
- * equivalent canvas without having to allocate an object on each draw call
+ * Holder class that is used to issue scoped calls to a [Canvas] from the framework equivalent
+ * canvas without having to allocate an object on each draw call
  */
 class CanvasHolder {
     @PublishedApi internal val androidCanvas = AndroidCanvas()
@@ -51,9 +45,7 @@
     }
 }
 
-/**
- * Return an instance of the native primitive that implements the Canvas interface
- */
+/** Return an instance of the native primitive that implements the Canvas interface */
 actual val Canvas.nativeCanvas: NativeCanvas
     get() = (this as AndroidCanvas).internalCanvas
 
@@ -61,7 +53,8 @@
 // scoped usage and prevent unnecessary byte code null checks from being generated
 private val EmptyCanvas = android.graphics.Canvas()
 
-@PublishedApi internal class AndroidCanvas() : Canvas {
+@PublishedApi
+internal class AndroidCanvas() : Canvas {
 
     // Keep the internal canvas as a var prevent having to allocate an AndroidCanvas
     // instance on each draw call
@@ -71,23 +64,17 @@
 
     private var dstRect: android.graphics.Rect? = null
 
-    /**
-     * @see Canvas.save
-     */
+    /** @see Canvas.save */
     override fun save() {
         internalCanvas.save()
     }
 
-    /**
-     * @see Canvas.restore
-     */
+    /** @see Canvas.restore */
     override fun restore() {
         internalCanvas.restore()
     }
 
-    /**
-     * @see Canvas.saveLayer
-     */
+    /** @see Canvas.saveLayer */
     @SuppressWarnings("deprecation")
     override fun saveLayer(bounds: Rect, paint: Paint) {
         @Suppress("DEPRECATION")
@@ -101,37 +88,27 @@
         )
     }
 
-    /**
-     * @see Canvas.translate
-     */
+    /** @see Canvas.translate */
     override fun translate(dx: Float, dy: Float) {
         internalCanvas.translate(dx, dy)
     }
 
-    /**
-     * @see Canvas.scale
-     */
+    /** @see Canvas.scale */
     override fun scale(sx: Float, sy: Float) {
         internalCanvas.scale(sx, sy)
     }
 
-    /**
-     * @see Canvas.rotate
-     */
+    /** @see Canvas.rotate */
     override fun rotate(degrees: Float) {
         internalCanvas.rotate(degrees)
     }
 
-    /**
-     * @see Canvas.skew
-     */
+    /** @see Canvas.skew */
     override fun skew(sx: Float, sy: Float) {
         internalCanvas.skew(sx, sy)
     }
 
-    /**
-     * @throws IllegalStateException if an arbitrary transform is provided
-     */
+    /** @throws IllegalStateException if an arbitrary transform is provided */
     override fun concat(matrix: Matrix) {
         if (!matrix.isIdentity()) {
             val frameworkMatrix = android.graphics.Matrix()
@@ -146,12 +123,9 @@
         internalCanvas.clipRect(left, top, right, bottom, clipOp.toRegionOp())
     }
 
-    /**
-     * @see Canvas.clipPath
-     */
+    /** @see Canvas.clipPath */
     override fun clipPath(path: Path, clipOp: ClipOp) {
-        @Suppress("DEPRECATION")
-        internalCanvas.clipPath(path.asAndroidPath(), clipOp.toRegionOp())
+        @Suppress("DEPRECATION") internalCanvas.clipPath(path.asAndroidPath(), clipOp.toRegionOp())
     }
 
     fun ClipOp.toRegionOp(): android.graphics.Region.Op =
@@ -160,17 +134,9 @@
             else -> android.graphics.Region.Op.INTERSECT
         }
 
-    /**
-     * @see Canvas.drawLine
-     */
+    /** @see Canvas.drawLine */
     override fun drawLine(p1: Offset, p2: Offset, paint: Paint) {
-        internalCanvas.drawLine(
-            p1.x,
-            p1.y,
-            p2.x,
-            p2.y,
-            paint.asFrameworkPaint()
-        )
+        internalCanvas.drawLine(p1.x, p1.y, p2.x, p2.y, paint.asFrameworkPaint())
     }
 
     override fun drawRect(left: Float, top: Float, right: Float, bottom: Float, paint: Paint) {
@@ -201,16 +167,9 @@
         internalCanvas.drawOval(left, top, right, bottom, paint.asFrameworkPaint())
     }
 
-    /**
-     * @see Canvas.drawCircle
-     */
+    /** @see Canvas.drawCircle */
     override fun drawCircle(center: Offset, radius: Float, paint: Paint) {
-        internalCanvas.drawCircle(
-            center.x,
-            center.y,
-            radius,
-            paint.asFrameworkPaint()
-        )
+        internalCanvas.drawCircle(center.x, center.y, radius, paint.asFrameworkPaint())
     }
 
     override fun drawArc(
@@ -235,16 +194,12 @@
         )
     }
 
-    /**
-     * @see Canvas.drawPath
-     */
+    /** @see Canvas.drawPath */
     override fun drawPath(path: Path, paint: Paint) {
         internalCanvas.drawPath(path.asAndroidPath(), paint.asFrameworkPaint())
     }
 
-    /**
-     * @see Canvas.drawImage
-     */
+    /** @see Canvas.drawImage */
     override fun drawImage(image: ImageBitmap, topLeftOffset: Offset, paint: Paint) {
         internalCanvas.drawBitmap(
             image.asAndroidBitmap(),
@@ -254,9 +209,7 @@
         )
     }
 
-    /**
-     * @See Canvas.drawImageRect
-     */
+    /** @See Canvas.drawImageRect */
     override fun drawImageRect(
         image: ImageBitmap,
         srcOffset: IntOffset,
@@ -290,9 +243,7 @@
         )
     }
 
-    /**
-     * @see Canvas.drawPoints
-     */
+    /** @see Canvas.drawPoints */
     override fun drawPoints(pointMode: PointMode, points: List<Offset>, paint: Paint) {
         when (pointMode) {
             // Draw a line between each pair of points, each point has at most one line
@@ -317,23 +268,18 @@
 
     private fun drawPoints(points: List<Offset>, paint: Paint) {
         points.fastForEach { point ->
-            internalCanvas.drawPoint(
-                point.x,
-                point.y,
-                paint.asFrameworkPaint()
-            )
+            internalCanvas.drawPoint(point.x, point.y, paint.asFrameworkPaint())
         }
     }
 
     /**
      * Draw lines connecting points based on the corresponding step.
      *
-     * ex. 3 points with a step of 1 would draw 2 lines between the first and second points
-     * and another between the second and third
+     * ex. 3 points with a step of 1 would draw 2 lines between the first and second points and
+     * another between the second and third
      *
      * ex. 4 points with a step of 2 would draw 2 lines between the first and second and another
-     * between the third and fourth. If there is an odd number of points, the last point is
-     * ignored
+     * between the third and fourth. If there is an odd number of points, the last point is ignored
      *
      * @see drawRawLines
      */
@@ -344,21 +290,13 @@
             while (i < points.size - 1) {
                 val p1 = points[i]
                 val p2 = points[i + 1]
-                internalCanvas.drawLine(
-                    p1.x,
-                    p1.y,
-                    p2.x,
-                    p2.y,
-                    frameworkPaint
-                )
+                internalCanvas.drawLine(p1.x, p1.y, p2.x, p2.y, frameworkPaint)
                 i += stepBy
             }
         }
     }
 
-    /**
-     * @throws IllegalArgumentException if a non even number of points is provided
-     */
+    /** @throws IllegalArgumentException if a non even number of points is provided */
     override fun drawRawPoints(pointMode: PointMode, points: FloatArray, paint: Paint) {
         if (points.size % 2 != 0) {
             throw IllegalArgumentException("points must have an even number of values")
@@ -384,15 +322,14 @@
     }
 
     /**
-     * Draw lines connecting points based on the corresponding step. The points are interpreted
-     * as x, y coordinate pairs in alternating index positions
+     * Draw lines connecting points based on the corresponding step. The points are interpreted as
+     * x, y coordinate pairs in alternating index positions
      *
-     * ex. 3 points with a step of 1 would draw 2 lines between the first and second points
-     * and another between the second and third
+     * ex. 3 points with a step of 1 would draw 2 lines between the first and second points and
+     * another between the second and third
      *
      * ex. 4 points with a step of 2 would draw 2 lines between the first and second and another
-     * between the third and fourth. If there is an odd number of points, the last point is
-     * ignored
+     * between the third and fourth. If there is an odd number of points, the last point is ignored
      *
      * @see drawLines
      */
diff --git a/compose/ui/ui-graphics/src/androidMain/kotlin/androidx/compose/ui/graphics/AndroidColorFilter.android.kt b/compose/ui/ui-graphics/src/androidMain/kotlin/androidx/compose/ui/graphics/AndroidColorFilter.android.kt
index 2a8b676..d054f4e 100644
--- a/compose/ui/ui-graphics/src/androidMain/kotlin/androidx/compose/ui/graphics/AndroidColorFilter.android.kt
+++ b/compose/ui/ui-graphics/src/androidMain/kotlin/androidx/compose/ui/graphics/AndroidColorFilter.android.kt
@@ -28,17 +28,14 @@
 
 internal actual typealias NativeColorFilter = android.graphics.ColorFilter
 
-/**
- * Obtain a [android.graphics.ColorFilter] instance from this [ColorFilter]
- */
+/** Obtain a [android.graphics.ColorFilter] instance from this [ColorFilter] */
 fun ColorFilter.asAndroidColorFilter(): android.graphics.ColorFilter = nativeColorFilter
 
-/**
- * Create a [ColorFilter] from the given [android.graphics.ColorFilter] instance
- */
+/** Create a [ColorFilter] from the given [android.graphics.ColorFilter] instance */
 fun android.graphics.ColorFilter.asComposeColorFilter(): ColorFilter {
-    return if (Build.VERSION_CODES.Q <= Build.VERSION.SDK_INT &&
-        this is AndroidBlendModeColorFilter) {
+    return if (
+        Build.VERSION_CODES.Q <= Build.VERSION.SDK_INT && this is AndroidBlendModeColorFilter
+    ) {
         BlendModeColorFilterHelper.createBlendModeColorFilter(this)
     } else if (this is AndroidLightingColorFilter && supportsLightingColorFilterQuery()) {
         LightingColorFilter(Color(this.colorMultiply), Color(this.colorAdd), this)
@@ -58,11 +55,12 @@
 }
 
 internal actual fun actualTintColorFilter(color: Color, blendMode: BlendMode): NativeColorFilter {
-    val androidColorFilter = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
-        BlendModeColorFilterHelper.BlendModeColorFilter(color, blendMode)
-    } else {
-        AndroidPorterDuffColorFilter(color.toArgb(), blendMode.toPorterDuffMode())
-    }
+    val androidColorFilter =
+        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
+            BlendModeColorFilterHelper.BlendModeColorFilter(color, blendMode)
+        } else {
+            AndroidPorterDuffColorFilter(color.toArgb(), blendMode.toPorterDuffMode())
+        }
     return androidColorFilter
 }
 
@@ -97,14 +95,16 @@
     } else {
         // This method should not be invoked on API levels that do not support querying
         // the underlying ColorMatrix from the ColorMatrixColorFilter
-        throw IllegalArgumentException("Unable to obtain ColorMatrix from Android " +
-            "ColorMatrixColorFilter. This method was invoked on an unsupported Android version")
+        throw IllegalArgumentException(
+            "Unable to obtain ColorMatrix from Android " +
+                "ColorMatrixColorFilter. This method was invoked on an unsupported Android version"
+        )
     }
 }
 
 /**
- * Helper method to determine when the [AndroidColorMatrixColorFilter.getColorMatrix] was
- * available in the platform
+ * Helper method to determine when the [AndroidColorMatrixColorFilter.getColorMatrix] was available
+ * in the platform
  */
 internal fun supportsColorMatrixQuery() = Build.VERSION_CODES.O <= Build.VERSION.SDK_INT
 
diff --git a/compose/ui/ui-graphics/src/androidMain/kotlin/androidx/compose/ui/graphics/AndroidColorSpace.android.kt b/compose/ui/ui-graphics/src/androidMain/kotlin/androidx/compose/ui/graphics/AndroidColorSpace.android.kt
index 6ce4ba6..3f595d5 100644
--- a/compose/ui/ui-graphics/src/androidMain/kotlin/androidx/compose/ui/graphics/AndroidColorSpace.android.kt
+++ b/compose/ui/ui-graphics/src/androidMain/kotlin/androidx/compose/ui/graphics/AndroidColorSpace.android.kt
@@ -26,23 +26,15 @@
 import androidx.compose.ui.graphics.colorspace.TransferParameters
 import androidx.compose.ui.graphics.colorspace.WhitePoint
 
-/**
- * Convert the Compose [ColorSpace] into an Android framework [android.graphics.ColorSpace]
- */
+/** Convert the Compose [ColorSpace] into an Android framework [android.graphics.ColorSpace] */
 @RequiresApi(Build.VERSION_CODES.O)
 fun ColorSpace.toAndroidColorSpace(): android.graphics.ColorSpace =
-        with(ColorSpaceVerificationHelper) {
-            androidColorSpace()
-        }
+    with(ColorSpaceVerificationHelper) { androidColorSpace() }
 
-/**
- * Convert the [android.graphics.ColorSpace] into a Compose [ColorSpace]
- */
+/** Convert the [android.graphics.ColorSpace] into a Compose [ColorSpace] */
 @RequiresApi(Build.VERSION_CODES.O)
 fun android.graphics.ColorSpace.toComposeColorSpace() =
-    with(ColorSpaceVerificationHelper) {
-        composeColorSpace()
-    }
+    with(ColorSpaceVerificationHelper) { composeColorSpace() }
 
 @RequiresApi(Build.VERSION_CODES.O)
 private object ColorSpaceVerificationHelper {
@@ -73,19 +65,20 @@
                 if (this is Rgb) {
                     val whitePointArray = this.whitePoint.toXyz()
                     val transferParams = this.transferParameters
-                    val androidTransferParams = if (transferParams != null) {
-                        android.graphics.ColorSpace.Rgb.TransferParameters(
-                            transferParams.a,
-                            transferParams.b,
-                            transferParams.c,
-                            transferParams.d,
-                            transferParams.e,
-                            transferParams.f,
-                            transferParams.gamma
-                        )
-                    } else {
-                        null
-                    }
+                    val androidTransferParams =
+                        if (transferParams != null) {
+                            android.graphics.ColorSpace.Rgb.TransferParameters(
+                                transferParams.a,
+                                transferParams.b,
+                                transferParams.c,
+                                transferParams.d,
+                                transferParams.e,
+                                transferParams.f,
+                                transferParams.gamma
+                            )
+                        } else {
+                            null
+                        }
                     if (androidTransferParams != null) {
                         android.graphics.ColorSpace.Rgb(
                             this.name,
@@ -116,60 +109,47 @@
     @RequiresApi(Build.VERSION_CODES.O)
     fun android.graphics.ColorSpace.composeColorSpace(): ColorSpace {
         return when (this.id) {
-            android.graphics.ColorSpace.Named.SRGB.ordinal ->
-                ColorSpaces.Srgb
-            android.graphics.ColorSpace.Named.ACES.ordinal ->
-                ColorSpaces.Aces
-            android.graphics.ColorSpace.Named.ACESCG.ordinal ->
-                ColorSpaces.Acescg
-            android.graphics.ColorSpace.Named.ADOBE_RGB.ordinal ->
-                ColorSpaces.AdobeRgb
-            android.graphics.ColorSpace.Named.BT2020.ordinal ->
-                ColorSpaces.Bt2020
-            android.graphics.ColorSpace.Named.BT709.ordinal ->
-                ColorSpaces.Bt709
-            android.graphics.ColorSpace.Named.CIE_LAB.ordinal ->
-                ColorSpaces.CieLab
-            android.graphics.ColorSpace.Named.CIE_XYZ.ordinal ->
-                ColorSpaces.CieXyz
-            android.graphics.ColorSpace.Named.DCI_P3.ordinal ->
-                ColorSpaces.DciP3
-            android.graphics.ColorSpace.Named.DISPLAY_P3.ordinal ->
-                ColorSpaces.DisplayP3
-            android.graphics.ColorSpace.Named.EXTENDED_SRGB.ordinal ->
-                ColorSpaces.ExtendedSrgb
+            android.graphics.ColorSpace.Named.SRGB.ordinal -> ColorSpaces.Srgb
+            android.graphics.ColorSpace.Named.ACES.ordinal -> ColorSpaces.Aces
+            android.graphics.ColorSpace.Named.ACESCG.ordinal -> ColorSpaces.Acescg
+            android.graphics.ColorSpace.Named.ADOBE_RGB.ordinal -> ColorSpaces.AdobeRgb
+            android.graphics.ColorSpace.Named.BT2020.ordinal -> ColorSpaces.Bt2020
+            android.graphics.ColorSpace.Named.BT709.ordinal -> ColorSpaces.Bt709
+            android.graphics.ColorSpace.Named.CIE_LAB.ordinal -> ColorSpaces.CieLab
+            android.graphics.ColorSpace.Named.CIE_XYZ.ordinal -> ColorSpaces.CieXyz
+            android.graphics.ColorSpace.Named.DCI_P3.ordinal -> ColorSpaces.DciP3
+            android.graphics.ColorSpace.Named.DISPLAY_P3.ordinal -> ColorSpaces.DisplayP3
+            android.graphics.ColorSpace.Named.EXTENDED_SRGB.ordinal -> ColorSpaces.ExtendedSrgb
             android.graphics.ColorSpace.Named.LINEAR_EXTENDED_SRGB.ordinal ->
                 ColorSpaces.LinearExtendedSrgb
-            android.graphics.ColorSpace.Named.LINEAR_SRGB.ordinal ->
-                ColorSpaces.LinearSrgb
-            android.graphics.ColorSpace.Named.NTSC_1953.ordinal ->
-                ColorSpaces.Ntsc1953
-            android.graphics.ColorSpace.Named.PRO_PHOTO_RGB.ordinal ->
-                ColorSpaces.ProPhotoRgb
-            android.graphics.ColorSpace.Named.SMPTE_C.ordinal ->
-                ColorSpaces.SmpteC
+            android.graphics.ColorSpace.Named.LINEAR_SRGB.ordinal -> ColorSpaces.LinearSrgb
+            android.graphics.ColorSpace.Named.NTSC_1953.ordinal -> ColorSpaces.Ntsc1953
+            android.graphics.ColorSpace.Named.PRO_PHOTO_RGB.ordinal -> ColorSpaces.ProPhotoRgb
+            android.graphics.ColorSpace.Named.SMPTE_C.ordinal -> ColorSpaces.SmpteC
             else -> {
                 if (this is android.graphics.ColorSpace.Rgb) {
                     val transferParams = this.transferParameters
-                    val whitePoint = if (this.whitePoint.size == 3) {
-                        WhitePoint(this.whitePoint[0], this.whitePoint[1], this.whitePoint[2])
-                    } else {
-                        WhitePoint(this.whitePoint[0], this.whitePoint[1])
-                    }
+                    val whitePoint =
+                        if (this.whitePoint.size == 3) {
+                            WhitePoint(this.whitePoint[0], this.whitePoint[1], this.whitePoint[2])
+                        } else {
+                            WhitePoint(this.whitePoint[0], this.whitePoint[1])
+                        }
 
-                    val composeTransferParams = if (transferParams != null) {
-                        TransferParameters(
-                            gamma = transferParams.g,
-                            a = transferParams.a,
-                            b = transferParams.b,
-                            c = transferParams.c,
-                            d = transferParams.d,
-                            e = transferParams.e,
-                            f = transferParams.f
-                        )
-                    } else {
-                        null
-                    }
+                    val composeTransferParams =
+                        if (transferParams != null) {
+                            TransferParameters(
+                                gamma = transferParams.g,
+                                a = transferParams.a,
+                                b = transferParams.b,
+                                c = transferParams.c,
+                                d = transferParams.d,
+                                e = transferParams.e,
+                                f = transferParams.f
+                            )
+                        } else {
+                            null
+                        }
                     Rgb(
                         name = this.name,
                         primaries = this.primaries,
diff --git a/compose/ui/ui-graphics/src/androidMain/kotlin/androidx/compose/ui/graphics/AndroidGraphicsContext.android.kt b/compose/ui/ui-graphics/src/androidMain/kotlin/androidx/compose/ui/graphics/AndroidGraphicsContext.android.kt
index 3fe9bb2..dbe1c2f 100644
--- a/compose/ui/ui-graphics/src/androidMain/kotlin/androidx/compose/ui/graphics/AndroidGraphicsContext.android.kt
+++ b/compose/ui/ui-graphics/src/androidMain/kotlin/androidx/compose/ui/graphics/AndroidGraphicsContext.android.kt
@@ -37,7 +37,7 @@
  * Create a new [GraphicsContext] with the provided [ViewGroup] to contain [View] based layers.
  *
  * @param layerContainer [ViewGroup] used to contain [View] based layers that are created by the
- * returned [GraphicsContext]
+ *   returned [GraphicsContext]
  */
 fun GraphicsContext(layerContainer: ViewGroup): GraphicsContext =
     AndroidGraphicsContext(layerContainer)
@@ -50,62 +50,66 @@
     private var componentCallbackRegistered = false
     private var predrawListenerRegistered = false
 
-    private val componentCallback = object : ComponentCallbacks2 {
-        override fun onConfigurationChanged(newConfig: Configuration) {
-            // NO-OP
-        }
+    private val componentCallback =
+        object : ComponentCallbacks2 {
+            override fun onConfigurationChanged(newConfig: Configuration) {
+                // NO-OP
+            }
 
-        override fun onLowMemory() {
-            // NO-OP
-        }
+            override fun onLowMemory() {
+                // NO-OP
+            }
 
-        override fun onTrimMemory(level: Int) {
-            // See CacheManager.cpp. HWUI releases graphics resources whenever the trim memory
-            // callback exceed the level of TRIM_MEMORY_BACKGROUND so do the same here to
-            // release and recreate the internal ImageReader used to increment the ref count
-            // of internal RenderNodes
-            // Some devices skip straight to TRIM_COMPLETE so ensure we persist layers if
-            // we receive any trim memory callback that exceeds TRIM_MEMORY_BACKGROUND
-            if (level >= ComponentCallbacks2.TRIM_MEMORY_BACKGROUND) {
-                // HardwareRenderer instances would be discarded by HWUI so we need to discard
-                // the existing underlying ImageReader instance and do a placeholder render
-                // to increment the refcount of any outstanding layers again the next time the
-                // content is drawn
-                if (!predrawListenerRegistered) {
-                    layerManager.destroy()
-                    ownerView.viewTreeObserver.addOnPreDrawListener(
-                        object : ViewTreeObserver.OnPreDrawListener {
-                            override fun onPreDraw(): Boolean {
-                                layerManager.updateLayerPersistence()
-                                ownerView.viewTreeObserver.removeOnPreDrawListener(this)
-                                predrawListenerRegistered = false
-                                return true
+            override fun onTrimMemory(level: Int) {
+                // See CacheManager.cpp. HWUI releases graphics resources whenever the trim memory
+                // callback exceed the level of TRIM_MEMORY_BACKGROUND so do the same here to
+                // release and recreate the internal ImageReader used to increment the ref count
+                // of internal RenderNodes
+                // Some devices skip straight to TRIM_COMPLETE so ensure we persist layers if
+                // we receive any trim memory callback that exceeds TRIM_MEMORY_BACKGROUND
+                if (level >= ComponentCallbacks2.TRIM_MEMORY_BACKGROUND) {
+                    // HardwareRenderer instances would be discarded by HWUI so we need to discard
+                    // the existing underlying ImageReader instance and do a placeholder render
+                    // to increment the refcount of any outstanding layers again the next time the
+                    // content is drawn
+                    if (!predrawListenerRegistered) {
+                        layerManager.destroy()
+                        ownerView.viewTreeObserver.addOnPreDrawListener(
+                            object : ViewTreeObserver.OnPreDrawListener {
+                                override fun onPreDraw(): Boolean {
+                                    layerManager.updateLayerPersistence()
+                                    ownerView.viewTreeObserver.removeOnPreDrawListener(this)
+                                    predrawListenerRegistered = false
+                                    return true
+                                }
                             }
-                        })
-                    predrawListenerRegistered = true
+                        )
+                        predrawListenerRegistered = true
+                    }
                 }
             }
         }
-    }
 
     init {
         // Register the component callbacks when the GraphicsContext is created
         if (ownerView.isAttachedToWindow) {
             registerComponentCallback(ownerView.context)
         }
-        ownerView.addOnAttachStateChangeListener(object : OnAttachStateChangeListener {
-            override fun onViewAttachedToWindow(v: View) {
-                // If the View is attached to the window again, re-add the component callbacks
-                registerComponentCallback(v.context)
-            }
+        ownerView.addOnAttachStateChangeListener(
+            object : OnAttachStateChangeListener {
+                override fun onViewAttachedToWindow(v: View) {
+                    // If the View is attached to the window again, re-add the component callbacks
+                    registerComponentCallback(v.context)
+                }
 
-            override fun onViewDetachedFromWindow(v: View) {
-                // When the View is detached from the window, remove the component callbacks
-                // used to listen to trim memory signals
-                unregisterComponentCallback(v.context)
-                layerManager.destroy()
+                override fun onViewDetachedFromWindow(v: View) {
+                    // When the View is detached from the window, remove the component callbacks
+                    // used to listen to trim memory signals
+                    unregisterComponentCallback(v.context)
+                    layerManager.destroy()
+                }
             }
-        })
+        )
     }
 
     fun isLayerManagerInitialized(): Boolean = layerManager.hasImageReader()
@@ -128,38 +132,41 @@
         synchronized(lock) {
             val ownerId = getUniqueDrawingId(ownerView)
             val reusedLayer = layerManager.takeFromCache(ownerId)
-            val layer = if (reusedLayer != null) {
-                reusedLayer
-            } else {
-                val layerImpl = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
-                    GraphicsLayerV29()
-                } else if (isRenderNodeCompatible &&
-                    Build.VERSION.SDK_INT >= Build.VERSION_CODES.M
-                ) {
-                    try {
-                        GraphicsLayerV23(ownerView)
-                    } catch (_: Throwable) {
-                        // If we ever failed to create an instance of the RenderNode stub based
-                        // GraphicsLayer, always fallback to creation of View based layers as it is
-                        // unlikely that subsequent attempts to create a GraphicsLayer with RenderNode
-                        // stubs would be successful.
-                        isRenderNodeCompatible = false
-                        GraphicsViewLayer(obtainViewLayerContainer(ownerView))
-                    }
+            val layer =
+                if (reusedLayer != null) {
+                    reusedLayer
                 } else {
-                    GraphicsViewLayer(obtainViewLayerContainer(ownerView))
+                    val layerImpl =
+                        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
+                            GraphicsLayerV29()
+                        } else if (
+                            isRenderNodeCompatible && Build.VERSION.SDK_INT >= Build.VERSION_CODES.M
+                        ) {
+                            try {
+                                GraphicsLayerV23(ownerView)
+                            } catch (_: Throwable) {
+                                // If we ever failed to create an instance of the RenderNode stub
+                                // based
+                                // GraphicsLayer, always fallback to creation of View based layers
+                                // as it is
+                                // unlikely that subsequent attempts to create a GraphicsLayer with
+                                // RenderNode
+                                // stubs would be successful.
+                                isRenderNodeCompatible = false
+                                GraphicsViewLayer(obtainViewLayerContainer(ownerView))
+                            }
+                        } else {
+                            GraphicsViewLayer(obtainViewLayerContainer(ownerView))
+                        }
+                    GraphicsLayer(layerImpl, layerManager, ownerId)
                 }
-                GraphicsLayer(layerImpl, layerManager, ownerId)
-            }
             layerManager.persist(layer)
             return layer
         }
     }
 
     override fun releaseGraphicsLayer(layer: GraphicsLayer) {
-        synchronized(lock) {
-            layer.release()
-        }
+        synchronized(lock) { layer.release() }
     }
 
     private fun obtainViewLayerContainer(ownerView: ViewGroup): DrawChildContainer {
diff --git a/compose/ui/ui-graphics/src/androidMain/kotlin/androidx/compose/ui/graphics/AndroidImageBitmap.android.kt b/compose/ui/ui-graphics/src/androidMain/kotlin/androidx/compose/ui/graphics/AndroidImageBitmap.android.kt
index d4d66bf..1291e9c 100644
--- a/compose/ui/ui-graphics/src/androidMain/kotlin/androidx/compose/ui/graphics/AndroidImageBitmap.android.kt
+++ b/compose/ui/ui-graphics/src/androidMain/kotlin/androidx/compose/ui/graphics/AndroidImageBitmap.android.kt
@@ -25,9 +25,8 @@
 import androidx.compose.ui.graphics.colorspace.ColorSpaces
 
 /**
- * Create an [ImageBitmap] from the given [Bitmap]. Note this does
- * not create a copy of the original [Bitmap] and changes to it
- * will modify the returned [ImageBitmap]
+ * Create an [ImageBitmap] from the given [Bitmap]. Note this does not create a copy of the original
+ * [Bitmap] and changes to it will modify the returned [ImageBitmap]
  */
 fun Bitmap.asImageBitmap(): ImageBitmap = AndroidImageBitmap(this)
 
@@ -43,12 +42,7 @@
     if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
         bitmap = Api26Bitmap.createBitmap(width, height, config, hasAlpha, colorSpace)
     } else {
-        bitmap = Bitmap.createBitmap(
-            null as DisplayMetrics?,
-            width,
-            height,
-            bitmapConfig
-        )
+        bitmap = Bitmap.createBitmap(null as DisplayMetrics?, width, height, bitmapConfig)
         bitmap.setHasAlpha(hasAlpha)
     }
     return AndroidImageBitmap(bitmap)
@@ -56,7 +50,7 @@
 
 /**
  * @Throws UnsupportedOperationException if this [ImageBitmap] is not backed by an
- * android.graphics.Bitmap
+ *   android.graphics.Bitmap
  */
 fun ImageBitmap.asAndroidBitmap(): Bitmap =
     when (this) {
@@ -76,13 +70,12 @@
         get() = bitmap.config.toImageConfig()
 
     override val colorSpace: ColorSpace
-        get() = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
-            with(Api26Bitmap) {
-                bitmap.composeColorSpace()
+        get() =
+            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
+                with(Api26Bitmap) { bitmap.composeColorSpace() }
+            } else {
+                ColorSpaces.Srgb
             }
-        } else {
-            ColorSpaces.Srgb
-        }
 
     override fun readPixels(
         buffer: IntArray,
@@ -98,8 +91,9 @@
         val androidBitmap = asAndroidBitmap()
         var recycleTarget = false
         val targetBitmap =
-            if (Build.VERSION.SDK_INT < Build.VERSION_CODES.O ||
-                androidBitmap.config != Bitmap.Config.HARDWARE
+            if (
+                Build.VERSION.SDK_INT < Build.VERSION_CODES.O ||
+                    androidBitmap.config != Bitmap.Config.HARDWARE
             ) {
                 androidBitmap
             } else {
@@ -114,15 +108,7 @@
                 androidBitmap.copy(Bitmap.Config.ARGB_8888, false)
             }
 
-        targetBitmap.getPixels(
-            buffer,
-            bufferOffset,
-            stride,
-            startX,
-            startY,
-            width,
-            height
-        )
+        targetBitmap.getPixels(buffer, bufferOffset, stride, startX, startY, width, height)
         // Recycle the target if we are done with it
         if (recycleTarget) {
             targetBitmap.recycle()
@@ -179,9 +165,8 @@
 }
 
 /**
- * Make Lint happy
- * Separate class to contain all API calls that require API level 26 to assist in dead code
- * elimination during compilation time
+ * Make Lint happy Separate class to contain all API calls that require API level 26 to assist in
+ * dead code elimination during compilation time
  */
 @RequiresApi(Build.VERSION_CODES.O)
 internal object Api26Bitmap {
@@ -207,6 +192,5 @@
 
     @DoNotInline
     @JvmStatic
-    internal fun Bitmap.composeColorSpace() =
-        colorSpace?.toComposeColorSpace() ?: ColorSpaces.Srgb
+    internal fun Bitmap.composeColorSpace() = colorSpace?.toComposeColorSpace() ?: ColorSpaces.Srgb
 }
diff --git a/compose/ui/ui-graphics/src/androidMain/kotlin/androidx/compose/ui/graphics/AndroidMatrixConversions.android.kt b/compose/ui/ui-graphics/src/androidMain/kotlin/androidx/compose/ui/graphics/AndroidMatrixConversions.android.kt
index 8f40bc9..9b08a2b 100644
--- a/compose/ui/ui-graphics/src/androidMain/kotlin/androidx/compose/ui/graphics/AndroidMatrixConversions.android.kt
+++ b/compose/ui/ui-graphics/src/androidMain/kotlin/androidx/compose/ui/graphics/AndroidMatrixConversions.android.kt
@@ -16,9 +16,7 @@
 
 package androidx.compose.ui.graphics
 
-/**
- * Set the matrix values the native [android.graphics.Matrix].
- */
+/** Set the matrix values the native [android.graphics.Matrix]. */
 fun Matrix.setFrom(matrix: android.graphics.Matrix) {
     val v = values
     matrix.getValues(v)
@@ -50,9 +48,7 @@
     v[Matrix.Perspective2] = persp2 // 15
 }
 
-/**
- * Set the native [android.graphics.Matrix] from [matrix].
- */
+/** Set the native [android.graphics.Matrix] from [matrix]. */
 fun android.graphics.Matrix.setFrom(matrix: Matrix) {
     // We'll reuse the array used in Matrix to avoid allocation by temporarily
     // setting it to the 3x3 matrix used by android.graphics.Matrix
diff --git a/compose/ui/ui-graphics/src/androidMain/kotlin/androidx/compose/ui/graphics/AndroidPaint.android.kt b/compose/ui/ui-graphics/src/androidMain/kotlin/androidx/compose/ui/graphics/AndroidPaint.android.kt
index 7d50ef1..7b376a6 100644
--- a/compose/ui/ui-graphics/src/androidMain/kotlin/androidx/compose/ui/graphics/AndroidPaint.android.kt
+++ b/compose/ui/ui-graphics/src/androidMain/kotlin/androidx/compose/ui/graphics/AndroidPaint.android.kt
@@ -24,22 +24,18 @@
 
 actual fun Paint(): Paint = AndroidPaint()
 
-/**
- * Convert an [android.graphics.Paint] instance into a Compose-compatible Paint
- */
+/** Convert an [android.graphics.Paint] instance into a Compose-compatible Paint */
 fun android.graphics.Paint.asComposePaint(): Paint = AndroidPaint(this)
 
 /**
- * Create a Compose [Paint] instance backed by an [android.graphics.Paint] object to be
- * consumed by Compose applications running on the Android platform
+ * Create a Compose [Paint] instance backed by an [android.graphics.Paint] object to be consumed by
+ * Compose applications running on the Android platform
  *
  * @param internalPaint [android.graphics.Paint] to be wrapped by the [AndroidPaint] instance
  */
 class AndroidPaint(private var internalPaint: android.graphics.Paint) : Paint {
 
-    /**
-     * Create a new [AndroidPaint] instance backed by a newly created [android.graphics.Paint]
-     */
+    /** Create a new [AndroidPaint] instance backed by a newly created [android.graphics.Paint] */
     constructor() : this(makeNativePaint())
 
     private var _blendMode = BlendMode.SrcOver
@@ -174,38 +170,41 @@
 
 internal fun NativePaint.setNativeStyle(value: PaintingStyle) {
     // TODO(njawad): Platform also supports Paint.Style.FILL_AND_STROKE)
-    this.style = when (value) {
-        PaintingStyle.Stroke -> android.graphics.Paint.Style.STROKE
-        else -> android.graphics.Paint.Style.FILL
+    this.style =
+        when (value) {
+            PaintingStyle.Stroke -> android.graphics.Paint.Style.STROKE
+            else -> android.graphics.Paint.Style.FILL
+        }
+}
+
+internal fun NativePaint.getNativeStyle() =
+    when (this.style) {
+        android.graphics.Paint.Style.STROKE -> PaintingStyle.Stroke
+        else -> PaintingStyle.Fill
     }
-}
 
-internal fun NativePaint.getNativeStyle() = when (this.style) {
-    android.graphics.Paint.Style.STROKE -> PaintingStyle.Stroke
-    else -> PaintingStyle.Fill
-}
-
-internal fun NativePaint.getNativeStrokeWidth(): Float =
-    this.strokeWidth
+internal fun NativePaint.getNativeStrokeWidth(): Float = this.strokeWidth
 
 internal fun NativePaint.setNativeStrokeWidth(value: Float) {
     this.strokeWidth = value
 }
 
-internal fun NativePaint.getNativeStrokeCap(): StrokeCap = when (this.strokeCap) {
-    android.graphics.Paint.Cap.BUTT -> StrokeCap.Butt
-    android.graphics.Paint.Cap.ROUND -> StrokeCap.Round
-    android.graphics.Paint.Cap.SQUARE -> StrokeCap.Square
-    else -> StrokeCap.Butt
-}
+internal fun NativePaint.getNativeStrokeCap(): StrokeCap =
+    when (this.strokeCap) {
+        android.graphics.Paint.Cap.BUTT -> StrokeCap.Butt
+        android.graphics.Paint.Cap.ROUND -> StrokeCap.Round
+        android.graphics.Paint.Cap.SQUARE -> StrokeCap.Square
+        else -> StrokeCap.Butt
+    }
 
 internal fun NativePaint.setNativeStrokeCap(value: StrokeCap) {
-    this.strokeCap = when (value) {
-        StrokeCap.Square -> android.graphics.Paint.Cap.SQUARE
-        StrokeCap.Round -> android.graphics.Paint.Cap.ROUND
-        StrokeCap.Butt -> android.graphics.Paint.Cap.BUTT
-        else -> android.graphics.Paint.Cap.BUTT
-    }
+    this.strokeCap =
+        when (value) {
+            StrokeCap.Square -> android.graphics.Paint.Cap.SQUARE
+            StrokeCap.Round -> android.graphics.Paint.Cap.ROUND
+            StrokeCap.Butt -> android.graphics.Paint.Cap.BUTT
+            else -> android.graphics.Paint.Cap.BUTT
+        }
 }
 
 internal fun NativePaint.getNativeStrokeJoin(): StrokeJoin =
@@ -217,16 +216,16 @@
     }
 
 internal fun NativePaint.setNativeStrokeJoin(value: StrokeJoin) {
-    this.strokeJoin = when (value) {
-        StrokeJoin.Miter -> android.graphics.Paint.Join.MITER
-        StrokeJoin.Bevel -> android.graphics.Paint.Join.BEVEL
-        StrokeJoin.Round -> android.graphics.Paint.Join.ROUND
-        else -> android.graphics.Paint.Join.MITER
-    }
+    this.strokeJoin =
+        when (value) {
+            StrokeJoin.Miter -> android.graphics.Paint.Join.MITER
+            StrokeJoin.Bevel -> android.graphics.Paint.Join.BEVEL
+            StrokeJoin.Round -> android.graphics.Paint.Join.ROUND
+            else -> android.graphics.Paint.Join.MITER
+        }
 }
 
-internal fun NativePaint.getNativeStrokeMiterLimit(): Float =
-    this.strokeMiter
+internal fun NativePaint.getNativeStrokeMiterLimit(): Float = this.strokeMiter
 
 internal fun NativePaint.setNativeStrokeMiterLimit(value: Float) {
     this.strokeMiter = value
@@ -257,9 +256,9 @@
 }
 
 /**
- * This class is here to ensure that the classes that use this API will get verified and can be
- * AOT compiled. It is expected that this class will soft-fail verification, but the classes
- * which use this method will pass.
+ * This class is here to ensure that the classes that use this API will get verified and can be AOT
+ * compiled. It is expected that this class will soft-fail verification, but the classes which use
+ * this method will pass.
  */
 @RequiresApi(Build.VERSION_CODES.Q)
 internal object WrapperVerificationHelperMethods {
diff --git a/compose/ui/ui-graphics/src/androidMain/kotlin/androidx/compose/ui/graphics/AndroidPath.android.kt b/compose/ui/ui-graphics/src/androidMain/kotlin/androidx/compose/ui/graphics/AndroidPath.android.kt
index ecda354..33019de 100644
--- a/compose/ui/ui-graphics/src/androidMain/kotlin/androidx/compose/ui/graphics/AndroidPath.android.kt
+++ b/compose/ui/ui-graphics/src/androidMain/kotlin/androidx/compose/ui/graphics/AndroidPath.android.kt
@@ -25,9 +25,7 @@
 
 actual fun Path(): Path = AndroidPath()
 
-/**
- * Convert the [android.graphics.Path] instance into a Compose-compatible Path
- */
+/** Convert the [android.graphics.Path] instance into a Compose-compatible Path */
 fun PlatformPath.asComposePath(): Path = AndroidPath(this)
 
 /**
@@ -42,9 +40,7 @@
     }
 
 @Suppress("OVERRIDE_DEPRECATION")
-/* actual */ class AndroidPath(
-    val internalPath: PlatformPath = PlatformPath()
-) : Path {
+/* actual */ class AndroidPath(val internalPath: PlatformPath = PlatformPath()) : Path {
 
     // Temporary value holders to reuse an object (not part of a state):
     private var rectF: PlatformRectF? = null
@@ -59,7 +55,6 @@
                 PathFillType.NonZero
             }
         }
-
         set(value) {
             internalPath.fillType =
                 if (value == PathFillType.EvenOdd) {
@@ -102,11 +97,7 @@
     }
 
     override fun cubicTo(x1: Float, y1: Float, x2: Float, y2: Float, x3: Float, y3: Float) {
-        internalPath.cubicTo(
-            x1, y1,
-            x2, y2,
-            x3, y3
-        )
+        internalPath.cubicTo(x1, y1, x2, y2, x3, y3)
     }
 
     override fun relativeCubicTo(
@@ -117,11 +108,7 @@
         dx3: Float,
         dy3: Float
     ) {
-        internalPath.rCubicTo(
-            dx1, dy1,
-            dx2, dy2,
-            dx3, dy3
-        )
+        internalPath.rCubicTo(dx1, dy1, dx2, dy2, dx3, dy3)
     }
 
     override fun arcTo(
@@ -136,12 +123,7 @@
         val bottom = rect.bottom
         if (rectF == null) rectF = PlatformRectF()
         rectF!!.set(left, top, right, bottom)
-        internalPath.arcTo(
-            rectF!!,
-            startAngleDegrees,
-            sweepAngleDegrees,
-            forceMoveTo
-        )
+        internalPath.arcTo(rectF!!, startAngleDegrees, sweepAngleDegrees, forceMoveTo)
     }
 
     override fun addRect(rect: Rect) {
@@ -218,8 +200,7 @@
     }
 
     override fun translate(offset: Offset) {
-        if (mMatrix == null) mMatrix = PlatformMatrix()
-        else mMatrix!!.reset()
+        if (mMatrix == null) mMatrix = PlatformMatrix() else mMatrix!!.reset()
         mMatrix!!.setTranslate(offset.x, offset.y)
         internalPath.transform(mMatrix!!)
     }
@@ -234,42 +215,31 @@
         if (rectF == null) rectF = PlatformRectF()
         with(rectF!!) {
             internalPath.computeBounds(this, true)
-            return Rect(
-                this.left,
-                this.top,
-                this.right,
-                this.bottom
-            )
+            return Rect(this.left, this.top, this.right, this.bottom)
         }
     }
 
-    override fun op(
-        path1: Path,
-        path2: Path,
-        operation: PathOperation
-    ): Boolean {
-        val op = when (operation) {
-            PathOperation.Difference -> PlatformPath.Op.DIFFERENCE
-            PathOperation.Intersect -> PlatformPath.Op.INTERSECT
-            PathOperation.ReverseDifference -> PlatformPath.Op.REVERSE_DIFFERENCE
-            PathOperation.Union -> PlatformPath.Op.UNION
-            else -> PlatformPath.Op.XOR
-        }
+    override fun op(path1: Path, path2: Path, operation: PathOperation): Boolean {
+        val op =
+            when (operation) {
+                PathOperation.Difference -> PlatformPath.Op.DIFFERENCE
+                PathOperation.Intersect -> PlatformPath.Op.INTERSECT
+                PathOperation.ReverseDifference -> PlatformPath.Op.REVERSE_DIFFERENCE
+                PathOperation.Union -> PlatformPath.Op.UNION
+                else -> PlatformPath.Op.XOR
+            }
         return internalPath.op(path1.asAndroidPath(), path2.asAndroidPath(), op)
     }
 
     @Suppress("DEPRECATION") // Path.isConvex
-    override val isConvex: Boolean get() = internalPath.isConvex
+    override val isConvex: Boolean
+        get() = internalPath.isConvex
 
-    override val isEmpty: Boolean get() = internalPath.isEmpty
+    override val isEmpty: Boolean
+        get() = internalPath.isEmpty
 
     private fun validateRectangle(rect: Rect) {
-        if (
-            rect.left.isNaN() ||
-            rect.top.isNaN() ||
-            rect.right.isNaN() ||
-            rect.bottom.isNaN()
-        ) {
+        if (rect.left.isNaN() || rect.top.isNaN() || rect.right.isNaN() || rect.bottom.isNaN()) {
             throwIllegalStateException("Invalid rectangle, make sure no value is NaN")
         }
     }
@@ -279,7 +249,8 @@
     throw IllegalStateException(message)
 }
 
-private fun Path.Direction.toPlatformPathDirection() = when (this) {
-    Path.Direction.CounterClockwise -> PlatformPath.Direction.CCW
-    Path.Direction.Clockwise -> PlatformPath.Direction.CW
-}
+private fun Path.Direction.toPlatformPathDirection() =
+    when (this) {
+        Path.Direction.CounterClockwise -> PlatformPath.Direction.CCW
+        Path.Direction.Clockwise -> PlatformPath.Direction.CW
+    }
diff --git a/compose/ui/ui-graphics/src/androidMain/kotlin/androidx/compose/ui/graphics/AndroidPathEffect.android.kt b/compose/ui/ui-graphics/src/androidMain/kotlin/androidx/compose/ui/graphics/AndroidPathEffect.android.kt
index d1c062e..a488218 100644
--- a/compose/ui/ui-graphics/src/androidMain/kotlin/androidx/compose/ui/graphics/AndroidPathEffect.android.kt
+++ b/compose/ui/ui-graphics/src/androidMain/kotlin/androidx/compose/ui/graphics/AndroidPathEffect.android.kt
@@ -18,9 +18,7 @@
 
 import android.graphics.PathDashPathEffect
 
-/**
- * Obtain a reference to the Android PathEffect type
- */
+/** Obtain a reference to the Android PathEffect type */
 internal class AndroidPathEffect(val nativePathEffect: android.graphics.PathEffect) : PathEffect
 
 fun PathEffect.asAndroidPathEffect(): android.graphics.PathEffect =
diff --git a/compose/ui/ui-graphics/src/androidMain/kotlin/androidx/compose/ui/graphics/AndroidPathIterator.android.kt b/compose/ui/ui-graphics/src/androidMain/kotlin/androidx/compose/ui/graphics/AndroidPathIterator.android.kt
index d4689cb..930fac8 100644
--- a/compose/ui/ui-graphics/src/androidMain/kotlin/androidx/compose/ui/graphics/AndroidPathIterator.android.kt
+++ b/compose/ui/ui-graphics/src/androidMain/kotlin/androidx/compose/ui/graphics/AndroidPathIterator.android.kt
@@ -33,14 +33,15 @@
 ) : PathIterator {
     private val segmentPoints = FloatArray(8)
 
-    private val implementation = PlatformPathIterator(
-        path.asAndroidPath(),
-        when (conicEvaluation) {
-            PathIterator.ConicEvaluation.AsConic -> PlatformConicEvaluation.AsConic
-            PathIterator.ConicEvaluation.AsQuadratics -> PlatformConicEvaluation.AsQuadratics
-        },
-        tolerance
-    )
+    private val implementation =
+        PlatformPathIterator(
+            path.asAndroidPath(),
+            when (conicEvaluation) {
+                PathIterator.ConicEvaluation.AsConic -> PlatformConicEvaluation.AsConic
+                PathIterator.ConicEvaluation.AsQuadratics -> PlatformConicEvaluation.AsQuadratics
+            },
+            tolerance
+        )
 
     override fun calculateSize(includeConvertedConics: Boolean): Int =
         implementation.calculateSize(includeConvertedConics)
@@ -59,29 +60,28 @@
         if (type == PathSegment.Type.Done) return DoneSegment
         if (type == PathSegment.Type.Close) return CloseSegment
 
-        val points = when (type) {
-            PathSegment.Type.Move -> floatArrayOf(p[0], p[1])
-            PathSegment.Type.Line -> floatArrayOf(p[0], p[1], p[2], p[3])
-            PathSegment.Type.Quadratic -> floatArrayOf(p[0], p[1], p[2], p[3], p[4], p[5])
-            PathSegment.Type.Conic -> floatArrayOf(p[0], p[1], p[2], p[3], p[4], p[5])
-            PathSegment.Type.Cubic -> floatArrayOf(p[0], p[1], p[2], p[3], p[4], p[5], p[6], p[7])
-            else -> FloatArray(0) // Unreachable since we tested for Done and Close above
-        }
+        val points =
+            when (type) {
+                PathSegment.Type.Move -> floatArrayOf(p[0], p[1])
+                PathSegment.Type.Line -> floatArrayOf(p[0], p[1], p[2], p[3])
+                PathSegment.Type.Quadratic -> floatArrayOf(p[0], p[1], p[2], p[3], p[4], p[5])
+                PathSegment.Type.Conic -> floatArrayOf(p[0], p[1], p[2], p[3], p[4], p[5])
+                PathSegment.Type.Cubic ->
+                    floatArrayOf(p[0], p[1], p[2], p[3], p[4], p[5], p[6], p[7])
+                else -> FloatArray(0) // Unreachable since we tested for Done and Close above
+            }
 
-        return PathSegment(
-            type,
-            points,
-            if (type == PathSegment.Type.Conic) p[6] else 0.0f
-        )
+        return PathSegment(type, points, if (type == PathSegment.Type.Conic) p[6] else 0.0f)
     }
 }
 
-private fun PlatformPathSegmentType.toPathSegmentType() = when (this) {
-    PlatformPathSegmentType.Move -> PathSegment.Type.Move
-    PlatformPathSegmentType.Line -> PathSegment.Type.Line
-    PlatformPathSegmentType.Quadratic -> PathSegment.Type.Quadratic
-    PlatformPathSegmentType.Conic -> PathSegment.Type.Conic
-    PlatformPathSegmentType.Cubic -> PathSegment.Type.Cubic
-    PlatformPathSegmentType.Close -> PathSegment.Type.Close
-    PlatformPathSegmentType.Done -> PathSegment.Type.Done
-}
+private fun PlatformPathSegmentType.toPathSegmentType() =
+    when (this) {
+        PlatformPathSegmentType.Move -> PathSegment.Type.Move
+        PlatformPathSegmentType.Line -> PathSegment.Type.Line
+        PlatformPathSegmentType.Quadratic -> PathSegment.Type.Quadratic
+        PlatformPathSegmentType.Conic -> PathSegment.Type.Conic
+        PlatformPathSegmentType.Cubic -> PathSegment.Type.Cubic
+        PlatformPathSegmentType.Close -> PathSegment.Type.Close
+        PlatformPathSegmentType.Done -> PathSegment.Type.Done
+    }
diff --git a/compose/ui/ui-graphics/src/androidMain/kotlin/androidx/compose/ui/graphics/AndroidPathMeasure.android.kt b/compose/ui/ui-graphics/src/androidMain/kotlin/androidx/compose/ui/graphics/AndroidPathMeasure.android.kt
index 358b3af..33795b5 100644
--- a/compose/ui/ui-graphics/src/androidMain/kotlin/androidx/compose/ui/graphics/AndroidPathMeasure.android.kt
+++ b/compose/ui/ui-graphics/src/androidMain/kotlin/androidx/compose/ui/graphics/AndroidPathMeasure.android.kt
@@ -20,9 +20,8 @@
 
 actual fun PathMeasure(): PathMeasure = AndroidPathMeasure(android.graphics.PathMeasure())
 
-class AndroidPathMeasure internal constructor(
-    private val internalPathMeasure: android.graphics.PathMeasure
-) : PathMeasure {
+class AndroidPathMeasure
+internal constructor(private val internalPathMeasure: android.graphics.PathMeasure) : PathMeasure {
 
     override val length: Float
         get() = internalPathMeasure.length
@@ -49,9 +48,7 @@
         internalPathMeasure.setPath(path?.asAndroidPath(), forceClosed)
     }
 
-    override fun getPosition(
-        distance: Float
-    ): Offset {
+    override fun getPosition(distance: Float): Offset {
         if (positionArray == null) {
             positionArray = FloatArray(2)
         }
@@ -66,9 +63,7 @@
         }
     }
 
-    override fun getTangent(
-        distance: Float
-    ): Offset {
+    override fun getTangent(distance: Float): Offset {
         if (positionArray == null) {
             positionArray = FloatArray(2)
         }
diff --git a/compose/ui/ui-graphics/src/androidMain/kotlin/androidx/compose/ui/graphics/AndroidRenderEffect.android.kt b/compose/ui/ui-graphics/src/androidMain/kotlin/androidx/compose/ui/graphics/AndroidRenderEffect.android.kt
index efa9067..256e0d0 100644
--- a/compose/ui/ui-graphics/src/androidMain/kotlin/androidx/compose/ui/graphics/AndroidRenderEffect.android.kt
+++ b/compose/ui/ui-graphics/src/androidMain/kotlin/androidx/compose/ui/graphics/AndroidRenderEffect.android.kt
@@ -21,20 +21,15 @@
 import androidx.compose.runtime.Immutable
 import androidx.compose.ui.geometry.Offset
 
-/**
- * Convert the [android.graphics.RenderEffect] instance into a Compose-compatible [RenderEffect]
- */
-fun android.graphics.RenderEffect.asComposeRenderEffect(): RenderEffect =
-    AndroidRenderEffect(this)
+/** Convert the [android.graphics.RenderEffect] instance into a Compose-compatible [RenderEffect] */
+fun android.graphics.RenderEffect.asComposeRenderEffect(): RenderEffect = AndroidRenderEffect(this)
 
 @Immutable
 actual sealed class RenderEffect {
 
     private var internalRenderEffect: android.graphics.RenderEffect? = null
 
-    /**
-     * Obtain a [android.graphics.RenderEffect] from the compose [RenderEffect]
-     */
+    /** Obtain a [android.graphics.RenderEffect] from the compose [RenderEffect] */
     @RequiresApi(Build.VERSION_CODES.S)
     fun asAndroidRenderEffect(): android.graphics.RenderEffect =
         internalRenderEffect ?: createRenderEffect().also { internalRenderEffect = it }
@@ -46,14 +41,14 @@
 }
 
 @Immutable
-internal class AndroidRenderEffect(
-    val androidRenderEffect: android.graphics.RenderEffect
-) : RenderEffect() {
+internal class AndroidRenderEffect(val androidRenderEffect: android.graphics.RenderEffect) :
+    RenderEffect() {
     override fun createRenderEffect(): android.graphics.RenderEffect = androidRenderEffect
 }
 
 @Immutable
-actual class BlurEffect actual constructor(
+actual class BlurEffect
+actual constructor(
     private val renderEffect: RenderEffect?,
     private val radiusX: Float,
     private val radiusY: Float,
@@ -96,10 +91,9 @@
 }
 
 @Immutable
-actual class OffsetEffect actual constructor(
-    private val renderEffect: RenderEffect?,
-    private val offset: Offset
-) : RenderEffect() {
+actual class OffsetEffect
+actual constructor(private val renderEffect: RenderEffect?, private val offset: Offset) :
+    RenderEffect() {
 
     @RequiresApi(Build.VERSION_CODES.S)
     override fun createRenderEffect(): android.graphics.RenderEffect =
diff --git a/compose/ui/ui-graphics/src/androidMain/kotlin/androidx/compose/ui/graphics/AndroidShader.android.kt b/compose/ui/ui-graphics/src/androidMain/kotlin/androidx/compose/ui/graphics/AndroidShader.android.kt
index f90333b..95a0d91 100644
--- a/compose/ui/ui-graphics/src/androidMain/kotlin/androidx/compose/ui/graphics/AndroidShader.android.kt
+++ b/compose/ui/ui-graphics/src/androidMain/kotlin/androidx/compose/ui/graphics/AndroidShader.android.kt
@@ -94,9 +94,9 @@
 }
 
 /**
- * Returns the number of transparent (alpha = 0) values that aren't at the beginning or
- * end of the gradient so that the color stops can be added. On O and newer devices,
- * this always returns 0 because no stops need to be added.
+ * Returns the number of transparent (alpha = 0) values that aren't at the beginning or end of the
+ * gradient so that the color stops can be added. On O and newer devices, this always returns 0
+ * because no stops need to be added.
  */
 @VisibleForTesting
 internal fun countTransparentColors(colors: List<Color>): Int {
@@ -114,23 +114,18 @@
 }
 
 /**
- * There was a change in behavior between Android N and O with how
- * transparent colors are interpolated with skia gradients. More specifically
- * Android O treats all fully transparent colors the same regardless of the
- * rgb channels, however, Android N and older releases interpolated between
- * the color channels as well. Because Color.Transparent is transparent black,
- * this would introduce some muddy colors as part of gradients with transparency
- * for Android N and below.
- * In order to make gradient rendering consistent and match the behavior of Android O+,
- * detect whenever Color.Transparent is used and a stop matching the color of the previous
- * value, but alpha = 0 is added and another stop at the same point with the same color
- * as the following value, but with alpha = 0 is used.
+ * There was a change in behavior between Android N and O with how transparent colors are
+ * interpolated with skia gradients. More specifically Android O treats all fully transparent colors
+ * the same regardless of the rgb channels, however, Android N and older releases interpolated
+ * between the color channels as well. Because Color.Transparent is transparent black, this would
+ * introduce some muddy colors as part of gradients with transparency for Android N and below. In
+ * order to make gradient rendering consistent and match the behavior of Android O+, detect whenever
+ * Color.Transparent is used and a stop matching the color of the previous value, but alpha = 0 is
+ * added and another stop at the same point with the same color as the following value, but with
+ * alpha = 0 is used.
  */
 @VisibleForTesting
-internal fun makeTransparentColors(
-    colors: List<Color>,
-    numTransparentColors: Int
-): IntArray {
+internal fun makeTransparentColors(colors: List<Color>, numTransparentColors: Int): IntArray {
     if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
         // No change for Android O+, map the colors directly to their argb equivalent
         return IntArray(colors.size) { i -> colors[i].toArgb() }
@@ -192,14 +187,12 @@
     if (colorStops == null) {
         if (colors.size < 2) {
             throw IllegalArgumentException(
-                "colors must have length of at least 2 if colorStops " +
-                    "is omitted."
+                "colors must have length of at least 2 if colorStops " + "is omitted."
             )
         }
     } else if (colors.size != colorStops.size) {
         throw IllegalArgumentException(
-            "colors and colorStops arguments must have" +
-                " equal length."
+            "colors and colorStops arguments must have" + " equal length."
         )
     }
 }
diff --git a/compose/ui/ui-graphics/src/androidMain/kotlin/androidx/compose/ui/graphics/AndroidTileMode.android.kt b/compose/ui/ui-graphics/src/androidMain/kotlin/androidx/compose/ui/graphics/AndroidTileMode.android.kt
index 2ac1aa4..6ee59bf 100644
--- a/compose/ui/ui-graphics/src/androidMain/kotlin/androidx/compose/ui/graphics/AndroidTileMode.android.kt
+++ b/compose/ui/ui-graphics/src/androidMain/kotlin/androidx/compose/ui/graphics/AndroidTileMode.android.kt
@@ -22,10 +22,10 @@
 import androidx.annotation.RequiresApi
 
 /**
- * Helper method to determine if the appropriate [TileMode] is supported on the given Android
- * API level this provides an opportunity for consumers to fallback on an alternative user
- * experience for devices that do not support the corresponding blend mode. Usages of [TileMode]
- * types that are not supported will fallback onto the default of [TileMode.Clamp]
+ * Helper method to determine if the appropriate [TileMode] is supported on the given Android API
+ * level this provides an opportunity for consumers to fallback on an alternative user experience
+ * for devices that do not support the corresponding blend mode. Usages of [TileMode] types that are
+ * not supported will fallback onto the default of [TileMode.Clamp]
  */
 actual fun TileMode.isSupported(): Boolean =
     Build.VERSION.SDK_INT >= Build.VERSION_CODES.S || this != TileMode.Decal
@@ -62,9 +62,7 @@
 
 @RequiresApi(Build.VERSION_CODES.S)
 private object TileModeVerificationHelper {
-    @DoNotInline
-    fun getFrameworkTileModeDecal() = Shader.TileMode.DECAL
+    @DoNotInline fun getFrameworkTileModeDecal() = Shader.TileMode.DECAL
 
-    @DoNotInline
-    fun getComposeTileModeDecal() = TileMode.Decal
+    @DoNotInline fun getComposeTileModeDecal() = TileMode.Decal
 }
diff --git a/compose/ui/ui-graphics/src/androidMain/kotlin/androidx/compose/ui/graphics/AndroidVertexMode.android.kt b/compose/ui/ui-graphics/src/androidMain/kotlin/androidx/compose/ui/graphics/AndroidVertexMode.android.kt
index c8e779e..3520b9f 100644
--- a/compose/ui/ui-graphics/src/androidMain/kotlin/androidx/compose/ui/graphics/AndroidVertexMode.android.kt
+++ b/compose/ui/ui-graphics/src/androidMain/kotlin/androidx/compose/ui/graphics/AndroidVertexMode.android.kt
@@ -16,9 +16,10 @@
 
 package androidx.compose.ui.graphics
 
-fun VertexMode.toAndroidVertexMode() = when (this) {
-    VertexMode.Triangles -> android.graphics.Canvas.VertexMode.TRIANGLES
-    VertexMode.TriangleStrip -> android.graphics.Canvas.VertexMode.TRIANGLE_STRIP
-    VertexMode.TriangleFan -> android.graphics.Canvas.VertexMode.TRIANGLE_FAN
-    else -> android.graphics.Canvas.VertexMode.TRIANGLES
-}
+fun VertexMode.toAndroidVertexMode() =
+    when (this) {
+        VertexMode.Triangles -> android.graphics.Canvas.VertexMode.TRIANGLES
+        VertexMode.TriangleStrip -> android.graphics.Canvas.VertexMode.TRIANGLE_STRIP
+        VertexMode.TriangleFan -> android.graphics.Canvas.VertexMode.TRIANGLE_FAN
+        else -> android.graphics.Canvas.VertexMode.TRIANGLES
+    }
diff --git a/compose/ui/ui-graphics/src/androidMain/kotlin/androidx/compose/ui/graphics/CanvasUtils.android.kt b/compose/ui/ui-graphics/src/androidMain/kotlin/androidx/compose/ui/graphics/CanvasUtils.android.kt
index bcb4623..d583741 100644
--- a/compose/ui/ui-graphics/src/androidMain/kotlin/androidx/compose/ui/graphics/CanvasUtils.android.kt
+++ b/compose/ui/ui-graphics/src/androidMain/kotlin/androidx/compose/ui/graphics/CanvasUtils.android.kt
@@ -43,28 +43,31 @@
                 try {
                     if (Build.VERSION.SDK_INT == Build.VERSION_CODES.P) {
                         // use double reflection to avoid grey list on P
-                        val getDeclaredMethod = Class::class.java.getDeclaredMethod(
-                            "getDeclaredMethod",
-                            String::class.java,
-                            arrayOf<Class<*>>()::class.java
-                        )
-                        reorderBarrierMethod = getDeclaredMethod.invoke(
-                            Canvas::class.java,
-                            "insertReorderBarrier",
-                            emptyArray<Class<*>>()
-                        ) as Method?
-                        inorderBarrierMethod = getDeclaredMethod.invoke(
-                            Canvas::class.java,
-                            "insertInorderBarrier",
-                            emptyArray<Class<*>>()
-                        ) as Method?
+                        val getDeclaredMethod =
+                            Class::class
+                                .java
+                                .getDeclaredMethod(
+                                    "getDeclaredMethod",
+                                    String::class.java,
+                                    arrayOf<Class<*>>()::class.java
+                                )
+                        reorderBarrierMethod =
+                            getDeclaredMethod.invoke(
+                                Canvas::class.java,
+                                "insertReorderBarrier",
+                                emptyArray<Class<*>>()
+                            ) as Method?
+                        inorderBarrierMethod =
+                            getDeclaredMethod.invoke(
+                                Canvas::class.java,
+                                "insertInorderBarrier",
+                                emptyArray<Class<*>>()
+                            ) as Method?
                     } else {
-                        reorderBarrierMethod = Canvas::class.java.getDeclaredMethod(
-                            "insertReorderBarrier"
-                        )
-                        inorderBarrierMethod = Canvas::class.java.getDeclaredMethod(
-                            "insertInorderBarrier"
-                        )
+                        reorderBarrierMethod =
+                            Canvas::class.java.getDeclaredMethod("insertReorderBarrier")
+                        inorderBarrierMethod =
+                            Canvas::class.java.getDeclaredMethod("insertInorderBarrier")
                     }
                     reorderBarrierMethod?.isAccessible = true
                     inorderBarrierMethod?.isAccessible = true
diff --git a/compose/ui/ui-graphics/src/androidMain/kotlin/androidx/compose/ui/graphics/RectHelper.android.kt b/compose/ui/ui-graphics/src/androidMain/kotlin/androidx/compose/ui/graphics/RectHelper.android.kt
index faed539..21562a2 100644
--- a/compose/ui/ui-graphics/src/androidMain/kotlin/androidx/compose/ui/graphics/RectHelper.android.kt
+++ b/compose/ui/ui-graphics/src/androidMain/kotlin/androidx/compose/ui/graphics/RectHelper.android.kt
@@ -19,42 +19,33 @@
 import androidx.compose.ui.unit.IntRect
 
 /**
- * Creates a new instance of [android.graphics.Rect] with the same bounds
- * specified in the given [Rect]
+ * Creates a new instance of [android.graphics.Rect] with the same bounds specified in the given
+ * [Rect]
  */
 @Deprecated(
     "Converting Rect to android.graphics.Rect is lossy, and requires rounding. The " +
         "behavior of toAndroidRect() truncates to an integral Rect, but you should choose the " +
         "method of rounding most suitable for your use case.",
-    replaceWith = ReplaceWith(
-        "android.graphics.Rect(left.toInt(), top.toInt(), right.toInt(), bottom.toInt())"
-    )
+    replaceWith =
+        ReplaceWith(
+            "android.graphics.Rect(left.toInt(), top.toInt(), right.toInt(), bottom.toInt())"
+        )
 )
 fun Rect.toAndroidRect(): android.graphics.Rect {
-    return android.graphics.Rect(
-        left.toInt(),
-        top.toInt(),
-        right.toInt(),
-        bottom.toInt()
-    )
+    return android.graphics.Rect(left.toInt(), top.toInt(), right.toInt(), bottom.toInt())
 }
 
 /**
- * Creates a new instance of [android.graphics.RectF] with the same bounds
- * specified in the given [Rect]
+ * Creates a new instance of [android.graphics.RectF] with the same bounds specified in the given
+ * [Rect]
  */
 fun Rect.toAndroidRectF(): android.graphics.RectF {
-    return android.graphics.RectF(
-        left,
-        top,
-        right,
-        bottom
-    )
+    return android.graphics.RectF(left, top, right, bottom)
 }
 
 /**
- * Creates a new instance of [androidx.compose.ui.geometry.Rect] with the same bounds
- * specified in the given [android.graphics.Rect]
+ * Creates a new instance of [androidx.compose.ui.geometry.Rect] with the same bounds specified in
+ * the given [android.graphics.Rect]
  */
 fun android.graphics.Rect.toComposeRect(): androidx.compose.ui.geometry.Rect =
     androidx.compose.ui.geometry.Rect(
@@ -65,22 +56,20 @@
     )
 
 /**
- * Creates a new instance of [androidx.compose.ui.geometry.Rect] with the same bounds
- * specified in the given [android.graphics.RectF].
+ * Creates a new instance of [androidx.compose.ui.geometry.Rect] with the same bounds specified in
+ * the given [android.graphics.RectF].
  */
 fun android.graphics.RectF.toComposeRect(): Rect =
     Rect(this.left, this.top, this.right, this.bottom)
 
 /**
- * Creates a new instance of [android.graphics.Rect] with the same bounds
- * specified in the given [IntRect]
+ * Creates a new instance of [android.graphics.Rect] with the same bounds specified in the given
+ * [IntRect]
  */
-fun IntRect.toAndroidRect(): android.graphics.Rect =
-    android.graphics.Rect(left, top, right, bottom)
+fun IntRect.toAndroidRect(): android.graphics.Rect = android.graphics.Rect(left, top, right, bottom)
 
 /**
- * Creates a new instance of [androidx.compose.ui.unit.IntRect] with the same bounds
- * specified in the given [android.graphics.Rect]
+ * Creates a new instance of [androidx.compose.ui.unit.IntRect] with the same bounds specified in
+ * the given [android.graphics.Rect]
  */
-fun android.graphics.Rect.toComposeIntRect(): IntRect =
-    IntRect(left, top, right, bottom)
+fun android.graphics.Rect.toComposeIntRect(): IntRect = IntRect(left, top, right, bottom)
diff --git a/compose/ui/ui-graphics/src/androidMain/kotlin/androidx/compose/ui/graphics/layer/AndroidGraphicsLayer.android.kt b/compose/ui/ui-graphics/src/androidMain/kotlin/androidx/compose/ui/graphics/layer/AndroidGraphicsLayer.android.kt
index d5e3492..6473477 100644
--- a/compose/ui/ui-graphics/src/androidMain/kotlin/androidx/compose/ui/graphics/layer/AndroidGraphicsLayer.android.kt
+++ b/compose/ui/ui-graphics/src/androidMain/kotlin/androidx/compose/ui/graphics/layer/AndroidGraphicsLayer.android.kt
@@ -49,7 +49,8 @@
 import androidx.compose.ui.util.fastRoundToInt
 
 @Suppress("NotCloseable")
-actual class GraphicsLayer internal constructor(
+actual class GraphicsLayer
+internal constructor(
     internal val impl: GraphicsLayerImpl,
     private val layerManager: LayerManager,
     ownerViewId: Long
@@ -73,14 +74,10 @@
     // Paint used only in Software rendering scenarios for API 21 when rendering to a Bitmap
     private var softwareLayerPaint: Paint? = null
 
-    /**
-     * Tracks the amount of the parent layers currently drawing this layer as a child.
-     */
+    /** Tracks the amount of the parent layers currently drawing this layer as a child. */
     private var parentLayerUsages = 0
 
-    /**
-     * Keeps track of the child layers we currently draw into this layer.
-     */
+    /** Keeps track of the child layers we currently draw into this layer. */
     private val childDependenciesTracker = ChildLayerDependenciesTracker()
 
     init {
@@ -97,10 +94,11 @@
     /**
      * [CompositingStrategy] determines whether or not the contents of this layer are rendered into
      * an offscreen buffer. This is useful in order to optimize alpha usages with
-     * [CompositingStrategy.ModulateAlpha] which will skip the overhead of an offscreen buffer but can
-     * generate different rendering results depending on whether or not the contents of the layer are
-     * overlapping. Similarly leveraging [CompositingStrategy.Offscreen] is useful in situations where
-     * creating an offscreen buffer is preferred usually in conjunction with [BlendMode] usage.
+     * [CompositingStrategy.ModulateAlpha] which will skip the overhead of an offscreen buffer but
+     * can generate different rendering results depending on whether or not the contents of the
+     * layer are overlapping. Similarly leveraging [CompositingStrategy.Offscreen] is useful in
+     * situations where creating an offscreen buffer is preferred usually in conjunction with
+     * [BlendMode] usage.
      */
     actual var compositingStrategy: CompositingStrategy
         get() = impl.compositingStrategy
@@ -126,9 +124,9 @@
 
     /**
      * Size in pixels of the [GraphicsLayer]. By default [GraphicsLayer] contents can draw outside
-     * of the bounds specified by [topLeft] and [size], however, rasterization of this layer into
-     * an offscreen buffer will be sized according to the specified size. This is configured
-     * by calling [record]
+     * of the bounds specified by [topLeft] and [size], however, rasterization of this layer into an
+     * offscreen buffer will be sized according to the specified size. This is configured by calling
+     * [record]
      *
      * @sample androidx.compose.ui.graphics.samples.GraphicsLayerSizeSample
      */
@@ -160,10 +158,10 @@
         }
 
     /**
-     * BlendMode to use when drawing this layer to the destination in [drawLayer].
-     * The default is [BlendMode.SrcOver].
-     * Any value other than [BlendMode.SrcOver] will force this [GraphicsLayer] to use an offscreen
-     * compositing layer for rendering and is equivalent to using [CompositingStrategy.Offscreen].
+     * BlendMode to use when drawing this layer to the destination in [drawLayer]. The default is
+     * [BlendMode.SrcOver]. Any value other than [BlendMode.SrcOver] will force this [GraphicsLayer]
+     * to use an offscreen compositing layer for rendering and is equivalent to using
+     * [CompositingStrategy.Offscreen].
      *
      * @sample androidx.compose.ui.graphics.samples.GraphicsLayerBlendModeSample
      */
@@ -176,9 +174,9 @@
         }
 
     /**
-     * ColorFilter applied when drawing this layer to the destination in [drawLayer].
-     * Setting of this to any non-null will force this [GraphicsLayer] to use an offscreen
-     * compositing layer for rendering and is equivalent to using [CompositingStrategy.Offscreen]
+     * ColorFilter applied when drawing this layer to the destination in [drawLayer]. Setting of
+     * this to any non-null will force this [GraphicsLayer] to use an offscreen compositing layer
+     * for rendering and is equivalent to using [CompositingStrategy.Offscreen]
      *
      * @sample androidx.compose.ui.graphics.samples.GraphicsLayerColorFilterSample
      */
@@ -258,10 +256,9 @@
         }
 
     /**
-     * Sets the elevation for the shadow in pixels. With the [shadowElevation] > 0f and
-     * [Outline] set, a shadow is produced. Default value is `0` and the value must not be
-     * negative. Configuring a non-zero [shadowElevation] enables clipping of [GraphicsLayer]
-     * content.
+     * Sets the elevation for the shadow in pixels. With the [shadowElevation] > 0f and [Outline]
+     * set, a shadow is produced. Default value is `0` and the value must not be negative.
+     * Configuring a non-zero [shadowElevation] enables clipping of [GraphicsLayer] content.
      *
      * Note that if you provide a non-zero [shadowElevation] and if the passed [Outline] is concave
      * the shadow will not be drawn on Android versions less than 10.
@@ -294,8 +291,8 @@
         }
 
     /**
-     * The rotation, in degrees, of the contents around the vertical axis in degrees. Default
-     * value is `0`.
+     * The rotation, in degrees, of the contents around the vertical axis in degrees. Default value
+     * is `0`.
      *
      * @sample androidx.compose.ui.graphics.samples.GraphicsLayerRotationYWithCameraDistance
      */
@@ -308,8 +305,7 @@
         }
 
     /**
-     * The rotation, in degrees, of the contents around the Z axis in degrees. Default value is
-     * `0`.
+     * The rotation, in degrees, of the contents around the Z axis in degrees. Default value is `0`.
      */
     actual var rotationZ: Float
         get() = impl.rotationZ
@@ -320,25 +316,23 @@
         }
 
     /**
-     * Sets the distance along the Z axis (orthogonal to the X/Y plane on which
-     * layers are drawn) from the camera to this layer. The camera's distance
-     * affects 3D transformations, for instance rotations around the X and Y
-     * axis. If the rotationX or rotationY properties are changed and this view is
-     * large (more than half the size of the screen), it is recommended to always
-     * use a camera distance that's greater than the height (X axis rotation) or
-     * the width (Y axis rotation) of this view.
+     * Sets the distance along the Z axis (orthogonal to the X/Y plane on which layers are drawn)
+     * from the camera to this layer. The camera's distance affects 3D transformations, for instance
+     * rotations around the X and Y axis. If the rotationX or rotationY properties are changed and
+     * this view is large (more than half the size of the screen), it is recommended to always use a
+     * camera distance that's greater than the height (X axis rotation) or the width (Y axis
+     * rotation) of this view.
      *
-     * The distance of the camera from the drawing plane can have an affect on the
-     * perspective distortion of the layer when it is rotated around the x or y axis.
-     * For example, a large distance will result in a large viewing angle, and there
-     * will not be much perspective distortion of the view as it rotates. A short
-     * distance may cause much more perspective distortion upon rotation, and can
-     * also result in some drawing artifacts if the rotated view ends up partially
-     * behind the camera (which is why the recommendation is to use a distance at
+     * The distance of the camera from the drawing plane can have an affect on the perspective
+     * distortion of the layer when it is rotated around the x or y axis. For example, a large
+     * distance will result in a large viewing angle, and there will not be much perspective
+     * distortion of the view as it rotates. A short distance may cause much more perspective
+     * distortion upon rotation, and can also result in some drawing artifacts if the rotated view
+     * ends up partially behind the camera (which is why the recommendation is to use a distance at
      * least as far as the size of the view, if the view is to be rotated.)
      *
-     * The distance is expressed in pixels and must always be positive.
-     * Default value is [DefaultCameraDistance]
+     * The distance is expressed in pixels and must always be positive. Default value is
+     * [DefaultCameraDistance]
      *
      * @sample androidx.compose.ui.graphics.samples.GraphicsLayerRotationYWithCameraDistance
      */
@@ -352,8 +346,8 @@
 
     /**
      * Determines if the [GraphicsLayer] should be clipped to the rectangular bounds specified by
-     * [topLeft] and [size] or to the Outline if one is provided. The default is false.
-     * Note if elevation is provided then clipping will be enabled.
+     * [topLeft] and [size] or to the Outline if one is provided. The default is false. Note if
+     * elevation is provided then clipping will be enabled.
      */
     @Suppress("GetterSetterNames")
     @get:Suppress("GetterSetterNames")
@@ -368,13 +362,13 @@
         }
 
     /**
-     * Configure the [RenderEffect] to apply to this [GraphicsLayer].
-     * This will apply a visual effect to the results of the [GraphicsLayer] before it is
-     * drawn. For example if [BlurEffect] is provided, the contents will be drawn in a separate
-     * layer, then this layer will be blurred when this [GraphicsLayer] is drawn.
+     * Configure the [RenderEffect] to apply to this [GraphicsLayer]. This will apply a visual
+     * effect to the results of the [GraphicsLayer] before it is drawn. For example if [BlurEffect]
+     * is provided, the contents will be drawn in a separate layer, then this layer will be blurred
+     * when this [GraphicsLayer] is drawn.
      *
-     * Note this parameter is only supported on Android 12
-     * and above. Attempts to use this Modifier on older Android versions will be ignored.
+     * Note this parameter is only supported on Android 12 and above. Attempts to use this Modifier
+     * on older Android versions will be ignored.
      *
      * @sample androidx.compose.ui.graphics.samples.GraphicsLayerRenderEffectSample
      */
@@ -389,26 +383,29 @@
     /**
      * Configures the [topLeft] and [size] of this [GraphicsLayer]. For covenience in use cases
      *
-     * @param topLeft Offset of the [GraphicsLayer]. For convenience, this is set to [topLeft]
-     * for use cases where only the [size] is desired to be changed.
-     * @param size Size of the [GraphicsLayer]. For convenience, this is set to [size]
-     * for use cases where only the [topLeft] is desired to be changed
+     * @param topLeft Offset of the [GraphicsLayer]. For convenience, this is set to [topLeft] for
+     *   use cases where only the [size] is desired to be changed.
+     * @param size Size of the [GraphicsLayer]. For convenience, this is set to [size] for use cases
+     *   where only the [topLeft] is desired to be changed
      */
     private fun setPosition(topLeft: IntOffset, size: IntSize) {
         impl.setPosition(topLeft.x, topLeft.y, size)
     }
 
     /**
-     * Constructs the display list of drawing commands into this layer that will be rendered
-     * when this [GraphicsLayer] is drawn elsewhere with [drawLayer].
+     * Constructs the display list of drawing commands into this layer that will be rendered when
+     * this [GraphicsLayer] is drawn elsewhere with [drawLayer].
+     *
      * @param density [Density] used to assist in conversions of density independent pixels to raw
-     * pixels to draw.
+     *   pixels to draw.
      * @param layoutDirection [LayoutDirection] of the layout being drawn in.
      * @param size [Size] of the [GraphicsLayer]
      * @param block lambda that is called to issue drawing commands on this [DrawScope]
      *
      * @sample androidx.compose.ui.graphics.samples.GraphicsLayerTopLeftSample
+     *
      * @sample androidx.compose.ui.graphics.samples.GraphicsLayerBlendModeSample
+     *
      * @sample androidx.compose.ui.graphics.samples.GraphicsLayerTranslateSample
      */
     actual fun record(
@@ -449,24 +446,19 @@
         val layerAlpha = alpha
         val layerColorFilter = colorFilter
         val layerBlendMode = blendMode
-        val useSaveLayer = layerAlpha < 1.0f ||
-            layerBlendMode != BlendMode.SrcOver ||
-            layerColorFilter != null ||
-            compositingStrategy == CompositingStrategy.Offscreen
+        val useSaveLayer =
+            layerAlpha < 1.0f ||
+                layerBlendMode != BlendMode.SrcOver ||
+                layerColorFilter != null ||
+                compositingStrategy == CompositingStrategy.Offscreen
         if (useSaveLayer) {
-            val paint = (softwareLayerPaint ?: Paint().also { softwareLayerPaint = it })
-                .apply {
+            val paint =
+                (softwareLayerPaint ?: Paint().also { softwareLayerPaint = it }).apply {
                     alpha = layerAlpha
                     blendMode = layerBlendMode
                     colorFilter = layerColorFilter
                 }
-            androidCanvas.saveLayer(
-                left,
-                top,
-                right,
-                bottom,
-                paint.asFrameworkPaint()
-            )
+            androidCanvas.saveLayer(left, top, right, bottom, paint.asFrameworkPaint())
         } else {
             androidCanvas.save()
         }
@@ -504,9 +496,7 @@
         }
     }
 
-    /**
-     * Draw the contents of this [GraphicsLayer] into the specified [Canvas]
-     */
+    /** Draw the contents of this [GraphicsLayer] into the specified [Canvas] */
     internal actual fun draw(canvas: Canvas, parentLayer: GraphicsLayer?) {
         if (isReleased) {
             return
@@ -534,8 +524,9 @@
                     canvas.clipRect(tmpOutline.bounds)
                 }
                 is Outline.Rounded -> {
-                    val rRectPath = roundRectClipPath?.apply { rewind() }
-                        ?: Path().also { roundRectClipPath = it }
+                    val rRectPath =
+                        roundRectClipPath?.apply { rewind() }
+                            ?: Path().also { roundRectClipPath = it }
                     rRectPath.addRoundRect(tmpOutline.roundRect)
                     canvas.clipPath(rRectPath)
                 }
@@ -584,24 +575,24 @@
             } else {
                 val tmpPath = outlinePath
                 if (tmpPath != null) {
-                    val androidOutline = updatePathOutline(tmpPath).apply {
-                        alpha = this@GraphicsLayer.alpha
-                    }
+                    val androidOutline =
+                        updatePathOutline(tmpPath).apply { alpha = this@GraphicsLayer.alpha }
                     impl.setOutline(androidOutline)
                 } else {
-                    val roundRectOutline = obtainAndroidOutline().apply {
-                        resolveOutlinePosition { outlineTopLeft, outlineSize ->
-                            setRoundRect(
-                                outlineTopLeft.x.fastRoundToInt(),
-                                outlineTopLeft.y.fastRoundToInt(),
-                                (outlineTopLeft.x + outlineSize.width).fastRoundToInt(),
-                                (outlineTopLeft.y + outlineSize.height).fastRoundToInt(),
-                                roundRectCornerRadius
-                            )
-                        }
-                    }.apply {
-                        alpha = this@GraphicsLayer.alpha
-                    }
+                    val roundRectOutline =
+                        obtainAndroidOutline()
+                            .apply {
+                                resolveOutlinePosition { outlineTopLeft, outlineSize ->
+                                    setRoundRect(
+                                        outlineTopLeft.x.fastRoundToInt(),
+                                        outlineTopLeft.y.fastRoundToInt(),
+                                        (outlineTopLeft.x + outlineSize.width).fastRoundToInt(),
+                                        (outlineTopLeft.y + outlineSize.height).fastRoundToInt(),
+                                        roundRectCornerRadius
+                                    )
+                                }
+                            }
+                            .apply { alpha = this@GraphicsLayer.alpha }
                     impl.setOutline(roundRectOutline)
                 }
             }
@@ -614,11 +605,12 @@
         val rRectTopLeft = roundRectOutlineTopLeft
         val rRectSize = roundRectOutlineSize
 
-        val outlineSize = if (rRectSize.isUnspecified) {
-            layerSize
-        } else {
-            rRectSize
-        }
+        val outlineSize =
+            if (rRectSize.isUnspecified) {
+                layerSize
+            } else {
+                rRectSize
+            }
         return block(rRectTopLeft, outlineSize)
     }
 
@@ -668,27 +660,24 @@
     }
 
     /**
-     * Discards the displaylist of the GraphicsLayer. Used internally
-     * for management of GraphicsLayer resources
+     * Discards the displaylist of the GraphicsLayer. Used internally for management of
+     * GraphicsLayer resources
      */
     internal fun discardDisplayList() {
         // discarding means we don't draw children layer anymore and need to remove dependencies:
-        childDependenciesTracker.removeDependencies {
-            it.onRemovedFromParentLayer()
-        }
+        childDependenciesTracker.removeDependencies { it.onRemovedFromParentLayer() }
         impl.discardDisplayList()
     }
 
     /**
-     * The ID of the layer. This is used by tooling to match a layer to the associated
-     * LayoutNode.
+     * The ID of the layer. This is used by tooling to match a layer to the associated LayoutNode.
      */
     val layerId: Long
         get() = impl.layerId
 
     /**
-     * The uniqueDrawingId of the owner view of this graphics layer. This is used by
-     * tooling to match a layer to the associated owner View.
+     * The uniqueDrawingId of the owner view of this graphics layer. This is used by tooling to
+     * match a layer to the associated owner View.
      */
     var ownerViewId: Long = ownerViewId
         private set
@@ -703,19 +692,20 @@
                 Outline.Generic(tmpPath).also { internalOutline = it }
             } else {
                 resolveOutlinePosition { outlineTopLeft, outlineSize ->
-                    val left = outlineTopLeft.x
-                    val top = outlineTopLeft.y
-                    val right = left + outlineSize.width
-                    val bottom = top + outlineSize.height
-                    val cornerRadius = this.roundRectCornerRadius
-                    if (cornerRadius > 0f) {
-                        Outline.Rounded(
-                            RoundRect(left, top, right, bottom, CornerRadius(cornerRadius))
-                        )
-                    } else {
-                        Outline.Rectangle(Rect(left, top, right, bottom))
+                        val left = outlineTopLeft.x
+                        val top = outlineTopLeft.y
+                        val right = left + outlineSize.width
+                        val bottom = top + outlineSize.height
+                        val cornerRadius = this.roundRectCornerRadius
+                        if (cornerRadius > 0f) {
+                            Outline.Rounded(
+                                RoundRect(left, top, right, bottom, CornerRadius(cornerRadius))
+                            )
+                        } else {
+                            Outline.Rectangle(Rect(left, top, right, bottom))
+                        }
                     }
-                }.also { internalOutline = it }
+                    .also { internalOutline = it }
             }
         }
 
@@ -729,8 +719,8 @@
     }
 
     /**
-     * Specifies the given path to be configured as the outline for this [GraphicsLayer].
-     * When [shadowElevation] is non-zero a shadow is produced using this [Outline].
+     * Specifies the given path to be configured as the outline for this [GraphicsLayer]. When
+     * [shadowElevation] is non-zero a shadow is produced using this [Outline].
      *
      * @param path Path to be used as the Outline for the [GraphicsLayer]
      *
@@ -744,10 +734,10 @@
 
     /**
      * Configures a rounded rect outline for this [GraphicsLayer]. By default, [topLeft] is set to
-     * [Size.Zero] and [size] is set to [Size.Unspecified] indicating that the outline
-     * should match the size of the [GraphicsLayer]. When [shadowElevation] is non-zero a shadow
-     * is produced using an [Outline] created from the round rect parameters provided. Additionally
-     * if [clip] is true, the contents of this [GraphicsLayer] will be clipped to this geometry.
+     * [Size.Zero] and [size] is set to [Size.Unspecified] indicating that the outline should match
+     * the size of the [GraphicsLayer]. When [shadowElevation] is non-zero a shadow is produced
+     * using an [Outline] created from the round rect parameters provided. Additionally if [clip] is
+     * true, the contents of this [GraphicsLayer] will be clipped to this geometry.
      *
      * @param topLeft The top left of the rounded rect outline
      * @param size The size of the rounded rect outline
@@ -756,9 +746,10 @@
      * @sample androidx.compose.ui.graphics.samples.GraphicsLayerRoundRectOutline
      */
     actual fun setRoundRectOutline(topLeft: Offset, size: Size, cornerRadius: Float) {
-        if (this.roundRectOutlineTopLeft != topLeft ||
-            this.roundRectOutlineSize != size ||
-            this.roundRectCornerRadius != cornerRadius
+        if (
+            this.roundRectOutlineTopLeft != topLeft ||
+                this.roundRectOutlineSize != size ||
+                this.roundRectCornerRadius != cornerRadius
         ) {
             resetOutlineParams()
             this.roundRectOutlineTopLeft = topLeft
@@ -780,10 +771,7 @@
      *
      * @sample androidx.compose.ui.graphics.samples.GraphicsLayerRectOutline
      */
-    actual fun setRectOutline(
-        topLeft: Offset,
-        size: Size
-    ) {
+    actual fun setRectOutline(topLeft: Offset, size: Size) {
         setRoundRectOutline(topLeft, size, 0f)
     }
 
@@ -793,8 +781,8 @@
      * By default the shadow color is black. Generally, this color will be opaque so the intensity
      * of the shadow is consistent between different graphics layers with different colors.
      *
-     * The opacity of the final ambient shadow is a function of the shadow caster height, the
-     * alpha channel of the [ambientShadowColor] (typically opaque), and the
+     * The opacity of the final ambient shadow is a function of the shadow caster height, the alpha
+     * channel of the [ambientShadowColor] (typically opaque), and the
      * [android.R.attr.ambientShadowAlpha] theme attribute.
      *
      * Note that this parameter is only supported on Android 9 (Pie) and above. On older versions,
@@ -814,9 +802,9 @@
      * By default the shadow color is black. Generally, this color will be opaque so the intensity
      * of the shadow is consistent between different graphics layers with different colors.
      *
-     * The opacity of the final spot shadow is a function of the shadow caster height, the
-     * alpha channel of the [spotShadowColor] (typically opaque), and the
-     * [android.R.attr.spotShadowAlpha] theme attribute.
+     * The opacity of the final spot shadow is a function of the shadow caster height, the alpha
+     * channel of the [spotShadowColor] (typically opaque), and the [android.R.attr.spotShadowAlpha]
+     * theme attribute.
      *
      * Note that this parameter is only supported on Android 9 (Pie) and above. On older versions,
      * this property always returns [Color.Black] and setting new values is ignored.
@@ -836,8 +824,7 @@
      *
      * @sample androidx.compose.ui.graphics.samples.GraphicsLayerToImageBitmap
      */
-    actual suspend fun toImageBitmap(): ImageBitmap =
-        SnapshotImpl.toBitmap(this).asImageBitmap()
+    actual suspend fun toImageBitmap(): ImageBitmap = SnapshotImpl.toBitmap(this).asImageBitmap()
 
     internal fun reuse(ownerViewId: Long) {
         // apply new owner id
@@ -887,125 +874,87 @@
     companion object {
 
         // See b/340578758, fallback to software rendering for Robolectric tests
-        private val SnapshotImpl = if (isRobolectric) {
-            LayerSnapshotV21
-        } else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {
-            LayerSnapshotV28
-        } else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP_MR1 &&
-            SurfaceUtils.isLockHardwareCanvasAvailable()) {
-            LayerSnapshotV22
-        } else {
-            LayerSnapshotV21
-        }
+        private val SnapshotImpl =
+            if (isRobolectric) {
+                LayerSnapshotV21
+            } else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {
+                LayerSnapshotV28
+            } else if (
+                Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP_MR1 &&
+                    SurfaceUtils.isLockHardwareCanvasAvailable()
+            ) {
+                LayerSnapshotV22
+            } else {
+                LayerSnapshotV21
+            }
     }
 }
 
 internal interface GraphicsLayerImpl {
 
     /**
-     * The ID of the layer. This is used by tooling to match a layer to the associated
-     * LayoutNode.
+     * The ID of the layer. This is used by tooling to match a layer to the associated LayoutNode.
      */
     val layerId: Long
 
-    /**
-     * @see GraphicsLayer.compositingStrategy
-     */
+    /** @see GraphicsLayer.compositingStrategy */
     var compositingStrategy: CompositingStrategy
 
-    /**
-     * @see GraphicsLayer.pivotOffset
-     */
+    /** @see GraphicsLayer.pivotOffset */
     var pivotOffset: Offset
 
-    /**
-     * @see GraphicsLayer.alpha
-     */
+    /** @see GraphicsLayer.alpha */
     var alpha: Float
 
-    /**
-     * @see GraphicsLayer.blendMode
-     */
+    /** @see GraphicsLayer.blendMode */
     var blendMode: BlendMode
 
-    /**
-     * @see GraphicsLayer.colorFilter
-     */
+    /** @see GraphicsLayer.colorFilter */
     var colorFilter: ColorFilter?
 
-    /**
-     * @see GraphicsLayer.scaleX
-     */
+    /** @see GraphicsLayer.scaleX */
     var scaleX: Float
 
-    /**
-     * @see GraphicsLayer.scaleY
-     */
+    /** @see GraphicsLayer.scaleY */
     var scaleY: Float
 
-    /**
-     * @see GraphicsLayer.translationX
-     */
+    /** @see GraphicsLayer.translationX */
     var translationX: Float
 
-    /**
-     * @see GraphicsLayer.translationY
-     */
+    /** @see GraphicsLayer.translationY */
     var translationY: Float
 
-    /**
-     * @see GraphicsLayer.shadowElevation
-     */
+    /** @see GraphicsLayer.shadowElevation */
     var shadowElevation: Float
 
-    /**
-     * @see GraphicsLayer.ambientShadowColor
-     */
+    /** @see GraphicsLayer.ambientShadowColor */
     var ambientShadowColor: Color
 
-    /**
-     * @see GraphicsLayer.spotShadowColor
-     */
+    /** @see GraphicsLayer.spotShadowColor */
     var spotShadowColor: Color
 
-    /**
-     * @see GraphicsLayer.rotationX
-     */
+    /** @see GraphicsLayer.rotationX */
     var rotationX: Float
 
-    /**
-     * @see GraphicsLayer.rotationY
-     */
+    /** @see GraphicsLayer.rotationY */
     var rotationY: Float
 
-    /**
-     * @see GraphicsLayer.rotationZ
-     */
+    /** @see GraphicsLayer.rotationZ */
     var rotationZ: Float
 
-    /**
-     * @see GraphicsLayer.cameraDistance
-     */
+    /** @see GraphicsLayer.cameraDistance */
     var cameraDistance: Float
 
-    /**
-     * @see GraphicsLayer.clip
-     */
+    /** @see GraphicsLayer.clip */
     var clip: Boolean
 
-    /**
-     * @see GraphicsLayer.renderEffect
-     */
+    /** @see GraphicsLayer.renderEffect */
     var renderEffect: RenderEffect?
 
-    /**
-     * Determine whether the GraphicsLayer implementation should invalidate itself
-     */
+    /** Determine whether the GraphicsLayer implementation should invalidate itself */
     var isInvalidated: Boolean
 
-    /**
-     * @see GraphicsLayer.setPosition
-     */
+    /** @see GraphicsLayer.setPosition */
     fun setPosition(x: Int, y: Int, size: IntSize)
 
     /**
@@ -1015,21 +964,17 @@
     fun setOutline(outline: AndroidOutline?)
 
     /**
-     * Flag to determine if the layer implementation has a software backed implementation
-     * On Android L we conditionally also record drawing commands into a Picture as it does not
-     * natively support rendering into a Bitmap with hardware acceleration
+     * Flag to determine if the layer implementation has a software backed implementation On Android
+     * L we conditionally also record drawing commands into a Picture as it does not natively
+     * support rendering into a Bitmap with hardware acceleration
      */
     val supportsSoftwareRendering: Boolean
         get() = false
 
-    /**
-     * Draw the GraphicsLayer into the provided canvas
-     */
+    /** Draw the GraphicsLayer into the provided canvas */
     fun draw(canvas: Canvas)
 
-    /**
-     * @see GraphicsLayer.record
-     */
+    /** @see GraphicsLayer.record */
     fun record(
         density: Density,
         layoutDirection: LayoutDirection,
@@ -1040,14 +985,10 @@
     val hasDisplayList: Boolean
         get() = true
 
-    /**
-     * @see GraphicsLayer.discardDisplayList
-     */
+    /** @see GraphicsLayer.discardDisplayList */
     fun discardDisplayList()
 
-    /**
-     * Calculate the current transformation matrix for the layer implementation
-     */
+    /** Calculate the current transformation matrix for the layer implementation */
     fun calculateMatrix(): android.graphics.Matrix
 
     fun onReused() {}
diff --git a/compose/ui/ui-graphics/src/androidMain/kotlin/androidx/compose/ui/graphics/layer/GraphicsLayerV23.android.kt b/compose/ui/ui-graphics/src/androidMain/kotlin/androidx/compose/ui/graphics/layer/GraphicsLayerV23.android.kt
index 2b8f7e1..14d8af4 100644
--- a/compose/ui/ui-graphics/src/androidMain/kotlin/androidx/compose/ui/graphics/layer/GraphicsLayerV23.android.kt
+++ b/compose/ui/ui-graphics/src/androidMain/kotlin/androidx/compose/ui/graphics/layer/GraphicsLayerV23.android.kt
@@ -66,8 +66,7 @@
             // This is only to force loading the DisplayListCanvas class and causing the
             // MRenderNode to fail with a NoClassDefFoundError during construction instead of
             // later.
-            @Suppress("UNUSED_VARIABLE")
-            val displayListCanvas: DisplayListCanvas? = null
+            @Suppress("UNUSED_VARIABLE") val displayListCanvas: DisplayListCanvas? = null
 
             // Ensure that we can access properties of the RenderNode. We want to force an
             // exception here if there is a problem accessing any of these so that we can
@@ -158,9 +157,9 @@
             field = value
             if (value != null) {
                 applyCompositingStrategy(CompositingStrategy.Offscreen)
-                renderNode.setLayerPaint(obtainLayerPaint().apply {
-                    colorFilter = value.asAndroidColorFilter()
-                })
+                renderNode.setLayerPaint(
+                    obtainLayerPaint().apply { colorFilter = value.asAndroidColorFilter() }
+                )
             } else {
                 updateLayerProperties()
             }
@@ -193,11 +192,13 @@
             field = value
             renderNode.setScaleX(value)
         }
+
     override var scaleY: Float = 1f
         set(value) {
             field = value
             renderNode.setScaleY(value)
         }
+
     override var translationX: Float = 0f
         set(value) {
             field = value
@@ -209,11 +210,13 @@
             field = value
             renderNode.setTranslationY(value)
         }
+
     override var shadowElevation: Float = 0f
         set(value) {
             field = value
             renderNode.setElevation(value)
         }
+
     override var ambientShadowColor: Color = Color.Black
         set(value) {
             if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {
@@ -221,6 +224,7 @@
                 RenderNodeVerificationHelper28.setAmbientShadowColor(renderNode, value.toArgb())
             }
         }
+
     override var spotShadowColor: Color = Color.Black
         set(value) {
             if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {
@@ -228,21 +232,25 @@
                 RenderNodeVerificationHelper28.setSpotShadowColor(renderNode, value.toArgb())
             }
         }
+
     override var rotationX: Float = 0f
         set(value) {
             field = value
             renderNode.setRotationX(value)
         }
+
     override var rotationY: Float = 0f
         set(value) {
             field = value
             renderNode.setRotationY(value)
         }
+
     override var rotationZ: Float = 0f
         set(value) {
             field = value
             renderNode.setRotation(value)
         }
+
     override var cameraDistance: Float = DefaultCameraDistance
         set(value) {
             // Camera distance was negated in older API levels. Maintain the same input parameters
@@ -311,14 +319,7 @@
     ) {
         val recordingCanvas = renderNode.start(size.width, size.height)
         canvasHolder.drawInto(recordingCanvas) {
-            canvasDrawScope.draw(
-                density,
-                layoutDirection,
-                this,
-                size.toSize(),
-                layer,
-                block
-            )
+            canvasDrawScope.draw(density, layoutDirection, this, size.toSize(), layer, block)
         }
         renderNode.end(recordingCanvas)
         isInvalidated = false
diff --git a/compose/ui/ui-graphics/src/androidMain/kotlin/androidx/compose/ui/graphics/layer/GraphicsLayerV29.android.kt b/compose/ui/ui-graphics/src/androidMain/kotlin/androidx/compose/ui/graphics/layer/GraphicsLayerV29.android.kt
index 7a4e6b5..756bea0 100644
--- a/compose/ui/ui-graphics/src/androidMain/kotlin/androidx/compose/ui/graphics/layer/GraphicsLayerV29.android.kt
+++ b/compose/ui/ui-graphics/src/androidMain/kotlin/androidx/compose/ui/graphics/layer/GraphicsLayerV29.android.kt
@@ -41,9 +41,7 @@
 import androidx.compose.ui.unit.LayoutDirection
 import androidx.compose.ui.unit.toSize
 
-/**
- * GraphicsLayer implementation for Android Q+ that uses the public RenderNode API
- */
+/** GraphicsLayer implementation for Android Q+ that uses the public RenderNode API */
 @RequiresApi(Build.VERSION_CODES.Q)
 internal class GraphicsLayerV29(
     private val canvasHolder: CanvasHolder = CanvasHolder(),
@@ -91,6 +89,7 @@
                 renderNode.pivotY = value.y
             }
         }
+
     override var scaleX: Float = 1f
         set(value) {
             field = value
@@ -108,6 +107,7 @@
             field = value
             renderNode.translationX = value
         }
+
     override var translationY: Float = 0f
         set(value) {
             field = value
@@ -125,26 +125,31 @@
             field = value
             renderNode.ambientShadowColor = value.toArgb()
         }
+
     override var spotShadowColor: Color = Color.Black
         set(value) {
             field = value
             renderNode.spotShadowColor = value.toArgb()
         }
+
     override var rotationX: Float = 0f
         set(value) {
             field = value
             renderNode.rotationX = value
         }
+
     override var rotationY: Float = 0f
         set(value) {
             field = value
             renderNode.rotationY = value
         }
+
     override var rotationZ: Float = 0f
         set(value) {
             field = value
             renderNode.rotationZ = value
         }
+
     override var cameraDistance: Float = DefaultCameraDistance
         set(value) {
             field = value
diff --git a/compose/ui/ui-graphics/src/androidMain/kotlin/androidx/compose/ui/graphics/layer/GraphicsViewLayer.android.kt b/compose/ui/ui-graphics/src/androidMain/kotlin/androidx/compose/ui/graphics/layer/GraphicsViewLayer.android.kt
index 2675ea0..df2aafd 100644
--- a/compose/ui/ui-graphics/src/androidMain/kotlin/androidx/compose/ui/graphics/layer/GraphicsViewLayer.android.kt
+++ b/compose/ui/ui-graphics/src/androidMain/kotlin/androidx/compose/ui/graphics/layer/GraphicsViewLayer.android.kt
@@ -136,8 +136,7 @@
         isInvalidated = false
     }
 
-    override fun onLayout(changed: Boolean, l: Int, t: Int, r: Int, b: Int) {
-    }
+    override fun onLayout(changed: Boolean, l: Int, t: Int, r: Int, b: Int) {}
 
     override fun forceLayout() {
         // Don't do anything. These Views are treated as RenderNodes, so a forced layout
@@ -145,15 +144,14 @@
     }
 
     companion object {
-        internal val LayerOutlineProvider = object : ViewOutlineProvider() {
-            override fun getOutline(view: View?, outline: Outline) {
-                if (view is ViewLayer) {
-                    view.layerOutline?.let { layerOutline ->
-                        outline.set(layerOutline)
+        internal val LayerOutlineProvider =
+            object : ViewOutlineProvider() {
+                override fun getOutline(view: View?, outline: Outline) {
+                    if (view is ViewLayer) {
+                        view.layerOutline?.let { layerOutline -> outline.set(layerOutline) }
                     }
                 }
             }
-        }
     }
 }
 
@@ -168,17 +166,20 @@
     private val clipRect = android.graphics.Rect()
     private var layerPaint: android.graphics.Paint? = null
 
-    private val picture: Picture? = if (mayRenderInSoftware) {
+    private val picture: Picture? =
+        if (mayRenderInSoftware) {
             Picture()
         } else {
             null
         }
-    private val pictureDrawScope: CanvasDrawScope? = if (mayRenderInSoftware) {
+    private val pictureDrawScope: CanvasDrawScope? =
+        if (mayRenderInSoftware) {
             CanvasDrawScope()
         } else {
             null
         }
-    private val pictureCanvasHolder: CanvasHolder? = if (mayRenderInSoftware) {
+    private val pictureCanvasHolder: CanvasHolder? =
+        if (mayRenderInSoftware) {
             CanvasHolder()
         } else {
             null
@@ -205,12 +206,14 @@
             obtainLayerPaint().apply { xfermode = PorterDuffXfermode(value.toPorterDuffMode()) }
             updateLayerProperties()
         }
+
     override var colorFilter: ColorFilter? = null
         set(value) {
             field = value
             obtainLayerPaint().apply { this.colorFilter = value?.asAndroidColorFilter() }
             updateLayerProperties()
         }
+
     override var compositingStrategy: CompositingStrategy = CompositingStrategy.Auto
         set(value) {
             field = value
@@ -218,20 +221,21 @@
         }
 
     private fun applyCompositingLayer(compositingStrategy: CompositingStrategy) {
-        viewLayer.canUseCompositingLayer = when (compositingStrategy) {
-            CompositingStrategy.Offscreen -> {
-                viewLayer.setLayerType(LAYER_TYPE_HARDWARE, layerPaint)
-                true
+        viewLayer.canUseCompositingLayer =
+            when (compositingStrategy) {
+                CompositingStrategy.Offscreen -> {
+                    viewLayer.setLayerType(LAYER_TYPE_HARDWARE, layerPaint)
+                    true
+                }
+                CompositingStrategy.ModulateAlpha -> {
+                    viewLayer.setLayerType(LAYER_TYPE_NONE, layerPaint)
+                    false
+                }
+                else -> {
+                    viewLayer.setLayerType(LAYER_TYPE_NONE, layerPaint)
+                    true
+                }
             }
-            CompositingStrategy.ModulateAlpha -> {
-                viewLayer.setLayerType(LAYER_TYPE_NONE, layerPaint)
-                false
-            }
-            else -> {
-                viewLayer.setLayerType(LAYER_TYPE_NONE, layerPaint)
-                true
-            }
-        }
     }
 
     private fun updateLayerProperties() {
@@ -246,8 +250,7 @@
         layerPaint ?: android.graphics.Paint().also { layerPaint = it }
 
     private fun requiresCompositingLayer(): Boolean =
-        compositingStrategy == CompositingStrategy.Offscreen ||
-            requiresLayerPaint()
+        compositingStrategy == CompositingStrategy.Offscreen || requiresLayerPaint()
 
     private fun requiresLayerPaint(): Boolean =
         blendMode != BlendMode.SrcOver || colorFilter != null
@@ -277,11 +280,13 @@
                 viewLayer.pivotY = value.y
             }
         }
+
     override var scaleX: Float = 1f
         set(value) {
             field = value
             viewLayer.scaleX = value
         }
+
     override var scaleY: Float = 1f
         set(value) {
             field = value
@@ -293,6 +298,7 @@
             field = value
             viewLayer.translationX = value
         }
+
     override var translationY: Float = 0f
         set(value) {
             field = value
@@ -304,6 +310,7 @@
             field = value
             viewLayer.elevation = value
         }
+
     override var ambientShadowColor: Color = Color.Black
         set(value) {
             if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {
@@ -314,6 +321,7 @@
                 )
             }
         }
+
     override var spotShadowColor: Color = Color.Black
         set(value) {
             if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {
@@ -321,21 +329,25 @@
                 ViewLayerVerificationHelper28.setOutlineSpotShadowColor(viewLayer, value.toArgb())
             }
         }
+
     override var rotationX: Float = 0f
         set(value) {
             field = value
             viewLayer.rotationX = value
         }
+
     override var rotationY: Float = 0f
         set(value) {
             field = value
             viewLayer.rotationY = value
         }
+
     override var rotationZ: Float = 0f
         set(value) {
             field = value
             viewLayer.rotation = value
         }
+
     override var cameraDistance: Float
         get() {
             return viewLayer.getCameraDistance() / resources.displayMetrics.densityDpi
@@ -351,6 +363,7 @@
             clipBoundsInvalidated = true
             viewLayer.clipToOutline = value && outlineIsProvided
         }
+
     override var renderEffect: RenderEffect? = null
         set(value) {
             field = value
@@ -422,13 +435,7 @@
             picture?.let { p ->
                 val pictureCanvas = p.beginRecording(size.width, size.height)
                 pictureCanvasHolder?.drawInto(pictureCanvas) {
-                    pictureDrawScope?.draw(
-                        density,
-                        layoutDirection,
-                        this,
-                        size.toSize(),
-                        block
-                    )
+                    pictureDrawScope?.draw(density, layoutDirection, this, size.toSize(), block)
                 }
                 p.endRecording()
             }
@@ -462,18 +469,19 @@
     override fun calculateMatrix(): Matrix = viewLayer.matrix
 
     private fun updateClipBounds() {
-       if (clipBoundsInvalidated) {
-           viewLayer.clipBounds = if (clip && !outlineIsProvided) {
-               clipRect.apply {
-                   left = 0
-                   top = 0
-                   right = viewLayer.width
-                   bottom = viewLayer.height
-               }
-           } else {
-               null
-           }
-       }
+        if (clipBoundsInvalidated) {
+            viewLayer.clipBounds =
+                if (clip && !outlineIsProvided) {
+                    clipRect.apply {
+                        left = 0
+                        top = 0
+                        right = viewLayer.width
+                        bottom = viewLayer.height
+                    }
+                } else {
+                    null
+                }
+        }
     }
 
     override fun discardDisplayList() {
@@ -490,17 +498,18 @@
 
         val mayRenderInSoftware = !isLockHardwareCanvasAvailable()
 
-        val PlaceholderCanvas = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
-            // For Android M+ we just need a Canvas that returns true for isHardwareAccelerated
-            // in order to get the draw calls to update the displaylist of the backing View
-            object : Canvas() {
-                override fun isHardwareAccelerated(): Boolean = true
+        val PlaceholderCanvas =
+            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
+                // For Android M+ we just need a Canvas that returns true for isHardwareAccelerated
+                // in order to get the draw calls to update the displaylist of the backing View
+                object : Canvas() {
+                    override fun isHardwareAccelerated(): Boolean = true
+                }
+            } else {
+                // On Android L, there is an instanceof check that verify that the Canvas is a
+                // HardwareCanvas so return our subclass of the HardwareCanvas stub
+                PlaceholderHardwareCanvas()
             }
-        } else {
-            // On Android L, there is an instanceof check that verify that the Canvas is a
-            // HardwareCanvas so return our subclass of the HardwareCanvas stub
-            PlaceholderHardwareCanvas()
-        }
     }
 }
 
@@ -537,8 +546,8 @@
     private var hasRetrievedMethod = false
 
     /**
-     * Returns true if the outline was rebuilt successfully, false otherwise.
-     * This can only return false on API 21 if the reflective API call had failed
+     * Returns true if the outline was rebuilt successfully, false otherwise. This can only return
+     * false on API 21 if the reflective API call had failed
      */
     fun rebuildOutline(view: View): Boolean {
         if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP_MR1) {
diff --git a/compose/ui/ui-graphics/src/androidMain/kotlin/androidx/compose/ui/graphics/layer/LayerManager.android.kt b/compose/ui/ui-graphics/src/androidMain/kotlin/androidx/compose/ui/graphics/layer/LayerManager.android.kt
index ce7621e..e11287f 100644
--- a/compose/ui/ui-graphics/src/androidMain/kotlin/androidx/compose/ui/graphics/layer/LayerManager.android.kt
+++ b/compose/ui/ui-graphics/src/androidMain/kotlin/androidx/compose/ui/graphics/layer/LayerManager.android.kt
@@ -31,10 +31,9 @@
 import androidx.core.os.HandlerCompat
 
 /**
- * Class responsible for managing the layer lifecycle to support
- * persisting of displaylist content. HWUI aggressively releases resources
- * from a displaylist if it is not used to render a single frame from a HardwareRenderer
- * instance
+ * Class responsible for managing the layer lifecycle to support persisting of displaylist content.
+ * HWUI aggressively releases resources from a displaylist if it is not used to render a single
+ * frame from a HardwareRenderer instance
  */
 internal class LayerManager(val canvasHolder: CanvasHolder) {
 
@@ -42,22 +41,21 @@
     private val nonActiveLayerCache = WeakCache<GraphicsLayer>()
 
     /**
-     * Create a placeholder ImageReader instance that we will use to issue a single draw call
-     * for each GraphicsLayer. This placeholder draw will increase the ref count of each
-     * RenderNode instance within HWUI therefore persisting it across frames as there is
-     * another internal CanvasContext instance owned by the internal HwuiContext instance of
-     * a Surface
+     * Create a placeholder ImageReader instance that we will use to issue a single draw call for
+     * each GraphicsLayer. This placeholder draw will increase the ref count of each RenderNode
+     * instance within HWUI therefore persisting it across frames as there is another internal
+     * CanvasContext instance owned by the internal HwuiContext instance of a Surface
      */
     private var imageReader: ImageReader? = null
 
-    private val handler = HandlerCompat.createAsync(Looper.getMainLooper()) {
-        persistLayers(activeLayerSet)
-        true
-    }
+    private val handler =
+        HandlerCompat.createAsync(Looper.getMainLooper()) {
+            persistLayers(activeLayerSet)
+            true
+        }
 
-    fun takeFromCache(ownerId: Long): GraphicsLayer? = nonActiveLayerCache.pop()?.also {
-        it.reuse(ownerId)
-    }
+    fun takeFromCache(ownerId: Long): GraphicsLayer? =
+        nonActiveLayerCache.pop()?.also { it.reuse(ownerId) }
 
     fun persist(layer: GraphicsLayer) {
         activeLayerSet.add(layer)
@@ -85,9 +83,9 @@
         /**
          * Create a placeholder ImageReader instance that we will use to issue a single draw call
          * for each GraphicsLayer. This placeholder draw will increase the ref count of each
-         * RenderNode instance within HWUI therefore persisting it across frames as there is
-         * another internal CanvasContext instance owned by the internal HwuiContext instance of
-         * a Surface. This is only necessary for Android M and above.
+         * RenderNode instance within HWUI therefore persisting it across frames as there is another
+         * internal CanvasContext instance owned by the internal HwuiContext instance of a Surface.
+         * This is only necessary for Android M and above.
          */
         val requiredOsVersion = Build.VERSION.SDK_INT >= Build.VERSION_CODES.M
         // On Robolectric even Surface#lockHardwareCanvas is not hardware accelerated and
@@ -97,16 +95,20 @@
         // See b/340578758
         val shouldPersistLayers = requiredOsVersion && layers.isNotEmpty() && !isRobolectric
         if (shouldPersistLayers) {
-            val reader = imageReader ?: ImageReader.newInstance(
-                1,
-                1,
-                PixelFormat.RGBA_8888,
-                1
-            ).apply {
-                // We don't care about the result, but release the buffer back to the queue
-                // for subsequent renders to ensure the RenderThread is free as much as possible
-                setOnImageAvailableListener({ it?.acquireLatestImage()?.close() }, handler)
-            }.also { imageReader = it }
+            val reader =
+                imageReader
+                    ?: ImageReader.newInstance(1, 1, PixelFormat.RGBA_8888, 1)
+                        .apply {
+                            // We don't care about the result, but release the buffer back to the
+                            // queue
+                            // for subsequent renders to ensure the RenderThread is free as much as
+                            // possible
+                            setOnImageAvailableListener(
+                                { it?.acquireLatestImage()?.close() },
+                                handler
+                            )
+                        }
+                        .also { imageReader = it }
             val surface = reader.surface
             val canvas = LockHardwareCanvasHelper.lockHardwareCanvas(surface)
 
@@ -128,10 +130,10 @@
     fun hasImageReader(): Boolean = imageReader != null
 
     /**
-     * Discards the corresponding ImageReader used to increment the ref count of each layer
-     * and persists the current layer list creating a new ImageReader. This is useful in scenarios
-     * where HWUI releases graphics resources in response to onTrimMemory often when the application
-     * is backgrounded
+     * Discards the corresponding ImageReader used to increment the ref count of each layer and
+     * persists the current layer list creating a new ImageReader. This is useful in scenarios where
+     * HWUI releases graphics resources in response to onTrimMemory often when the application is
+     * backgrounded
      */
     fun updateLayerPersistence() {
         destroy()
@@ -147,6 +149,5 @@
 private object LockHardwareCanvasHelper {
 
     @androidx.annotation.DoNotInline
-    fun lockHardwareCanvas(surface: Surface): android.graphics.Canvas =
-        surface.lockHardwareCanvas()
+    fun lockHardwareCanvas(surface: Surface): android.graphics.Canvas = surface.lockHardwareCanvas()
 }
diff --git a/compose/ui/ui-graphics/src/androidMain/kotlin/androidx/compose/ui/graphics/layer/LayerSnapshot.android.kt b/compose/ui/ui-graphics/src/androidMain/kotlin/androidx/compose/ui/graphics/layer/LayerSnapshot.android.kt
index 349eccf..91fbf1a 100644
--- a/compose/ui/ui-graphics/src/androidMain/kotlin/androidx/compose/ui/graphics/layer/LayerSnapshot.android.kt
+++ b/compose/ui/ui-graphics/src/androidMain/kotlin/androidx/compose/ui/graphics/layer/LayerSnapshot.android.kt
@@ -46,9 +46,7 @@
     override suspend fun toBitmap(graphicsLayer: GraphicsLayer): Bitmap =
         Bitmap.createBitmap(GraphicsLayerPicture(graphicsLayer))
 
-    /**
-     * [Picture] class used to create a hardware bitmap through [Bitmap.createBitmap]
-     */
+    /** [Picture] class used to create a hardware bitmap through [Bitmap.createBitmap] */
     private class GraphicsLayerPicture(val graphicsLayer: GraphicsLayer) : Picture() {
         override fun beginRecording(width: Int, height: Int): Canvas {
             // Return placeholder canvas here as we are leveraging a graphicsLayer that is
@@ -82,37 +80,34 @@
         val size = graphicsLayer.size
         val looper = Looper.myLooper() ?: Looper.getMainLooper()
         ImageReader.newInstance(
-            size.width, /* pixel width */
-            size.height, /* pixel height */
-            PixelFormat.RGBA_8888, /* format */
-            1 /* maxImages */
-        ).use { reader ->
-            val image = suspendCancellableCoroutine { continuation ->
-                reader.setOnImageAvailableListener(
-                    {
-                        continuation.resume(it.acquireLatestImage())
-                    },
-                    HandlerCompat.createAsync(looper)
-                )
+                size.width, /* pixel width */
+                size.height, /* pixel height */
+                PixelFormat.RGBA_8888, /* format */
+                1 /* maxImages */
+            )
+            .use { reader ->
+                val image = suspendCancellableCoroutine { continuation ->
+                    reader.setOnImageAvailableListener(
+                        { continuation.resume(it.acquireLatestImage()) },
+                        HandlerCompat.createAsync(looper)
+                    )
 
-                val surface = reader.surface
-                val canvas = SurfaceUtils.lockCanvas(surface)
-                try {
-                    // Clear contents of the buffer before rendering
-                    canvas.drawColor(Color.Black.toArgb(), PorterDuff.Mode.CLEAR)
-                    graphicsLayer.draw(ComposeCanvas(canvas), null)
-                } finally {
-                    surface.unlockCanvasAndPost(canvas)
+                    val surface = reader.surface
+                    val canvas = SurfaceUtils.lockCanvas(surface)
+                    try {
+                        // Clear contents of the buffer before rendering
+                        canvas.drawColor(Color.Black.toArgb(), PorterDuff.Mode.CLEAR)
+                        graphicsLayer.draw(ComposeCanvas(canvas), null)
+                    } finally {
+                        surface.unlockCanvasAndPost(canvas)
+                    }
                 }
+                return image.toBitmap()
             }
-            return image.toBitmap()
-        }
     }
 }
 
-/**
- * Fallback implementation to render into a software bitmap
- */
+/** Fallback implementation to render into a software bitmap */
 internal object LayerSnapshotV21 : LayerSnapshotImpl {
     override suspend fun toBitmap(graphicsLayer: GraphicsLayer): Bitmap {
         val size = graphicsLayer.size
@@ -137,15 +132,15 @@
 
     /**
      * Attempts to obtain a hardware accelerated [android.graphics.Canvas] from the provided
-     * [Surface]. In certain scenarios it will fallback to returning a software backed [Canvas].
-     * For Android versions M (inclusive) and above this will always return a hardware accelerated
+     * [Surface]. In certain scenarios it will fallback to returning a software backed [Canvas]. For
+     * Android versions M (inclusive) and above this will always return a hardware accelerated
      * [Canvas].
      *
      * For Android L_MR1 (API 22) this will attempt to leverage reflection to obtain a hardware
      * accelerated [Canvas].
      *
-     * If the reflective call fails or this method is invoked on Android L (API 21) this will
-     * always return a software backed [Canvas]
+     * If the reflective call fails or this method is invoked on Android L (API 21) this will always
+     * return a software backed [Canvas]
      */
     @RequiresApi(Build.VERSION_CODES.LOLLIPOP_MR1)
     fun lockCanvas(surface: Surface): Canvas {
@@ -178,10 +173,11 @@
                     // method instance on success and throws on failure. Avoiding usage of the
                     // the safe call operator as it shows warnings in the IDE that it is not
                     // necessary as a result
-                    method = Surface::class.java.getDeclaredMethod("lockHardwareCanvas").also {
-                        it.isAccessible = true
-                        lockHardwareCanvasMethod = it
-                    }
+                    method =
+                        Surface::class.java.getDeclaredMethod("lockHardwareCanvas").also {
+                            it.isAccessible = true
+                            lockHardwareCanvasMethod = it
+                        }
                 }
                 method
             } catch (_: Throwable) {
@@ -219,11 +215,6 @@
             colors[i] = Color(red, green, blue, alpha).toArgb()
         }
 
-        return Bitmap.createBitmap(
-            colors,
-            width,
-            height,
-            android.graphics.Bitmap.Config.ARGB_8888
-        )
+        return Bitmap.createBitmap(colors, width, height, android.graphics.Bitmap.Config.ARGB_8888)
     }
 }
diff --git a/compose/ui/ui-graphics/src/androidMain/kotlin/androidx/compose/ui/graphics/layer/WeakCache.android.kt b/compose/ui/ui-graphics/src/androidMain/kotlin/androidx/compose/ui/graphics/layer/WeakCache.android.kt
index e6d27c8..807ae0d 100644
--- a/compose/ui/ui-graphics/src/androidMain/kotlin/androidx/compose/ui/graphics/layer/WeakCache.android.kt
+++ b/compose/ui/ui-graphics/src/androidMain/kotlin/androidx/compose/ui/graphics/layer/WeakCache.android.kt
@@ -23,16 +23,16 @@
 
 // It is a copy from androidx.compose.ui.platform
 /**
- * A simple collection that keeps values as [WeakReference]s.
- * Elements are added with [push] and removed with [pop].
+ * A simple collection that keeps values as [WeakReference]s. Elements are added with [push] and
+ * removed with [pop].
  */
 internal class WeakCache<T> {
     private val values = mutableVectorOf<Reference<T>>()
     private val referenceQueue = ReferenceQueue<T>()
 
     /**
-     * Add [element] to the collection as a [WeakReference]. It will be removed when
-     * garbage collected or from [pop].
+     * Add [element] to the collection as a [WeakReference]. It will be removed when garbage
+     * collected or from [pop].
      */
     fun push(element: T) {
         clearWeakReferences()
@@ -40,8 +40,8 @@
     }
 
     /**
-     * Remove an element from the collection and return it. If no element is
-     * available, `null` is returned.
+     * Remove an element from the collection and return it. If no element is available, `null` is
+     * returned.
      */
     fun pop(): T? {
         clearWeakReferences()
@@ -56,8 +56,8 @@
     }
 
     /**
-     * The number of elements currently in the collection. This may change between
-     * calls if the references have been garbage collected.
+     * The number of elements currently in the collection. This may change between calls if the
+     * references have been garbage collected.
      */
     val size: Int
         get() {
@@ -69,8 +69,7 @@
         do {
             val item: Reference<out T>? = referenceQueue.poll()
             if (item != null) {
-                @Suppress("UNCHECKED_CAST")
-                values.remove(item as Reference<T>)
+                @Suppress("UNCHECKED_CAST") values.remove(item as Reference<T>)
             }
         } while (item != null)
     }
diff --git a/compose/ui/ui-graphics/src/androidMain/kotlin/androidx/compose/ui/graphics/layer/view/PlaceholderHardwareCanvas.android.kt b/compose/ui/ui-graphics/src/androidMain/kotlin/androidx/compose/ui/graphics/layer/view/PlaceholderHardwareCanvas.android.kt
index a11c6b9..431ebda 100644
--- a/compose/ui/ui-graphics/src/androidMain/kotlin/androidx/compose/ui/graphics/layer/view/PlaceholderHardwareCanvas.android.kt
+++ b/compose/ui/ui-graphics/src/androidMain/kotlin/androidx/compose/ui/graphics/layer/view/PlaceholderHardwareCanvas.android.kt
@@ -21,8 +21,8 @@
 import android.view.RenderNode
 
 /**
- * Implementation of HardwareCanvas abstract class used to record a displaylist
- * on demand by passing directly to View#draw(canvas)
+ * Implementation of HardwareCanvas abstract class used to record a displaylist on demand by passing
+ * directly to View#draw(canvas)
  */
 internal class PlaceholderHardwareCanvas : HardwareCanvas() {
 
diff --git a/compose/ui/ui-graphics/src/androidMain/kotlin/androidx/compose/ui/graphics/layer/view/ViewLayerContainer.android.kt b/compose/ui/ui-graphics/src/androidMain/kotlin/androidx/compose/ui/graphics/layer/view/ViewLayerContainer.android.kt
index 541b29a..a7cc0cc 100644
--- a/compose/ui/ui-graphics/src/androidMain/kotlin/androidx/compose/ui/graphics/layer/view/ViewLayerContainer.android.kt
+++ b/compose/ui/ui-graphics/src/androidMain/kotlin/androidx/compose/ui/graphics/layer/view/ViewLayerContainer.android.kt
@@ -14,7 +14,7 @@
  * limitations under the License.
  */
 
-package androidx.compose.ui.graphics.layer.view;
+package androidx.compose.ui.graphics.layer.view
 
 import android.annotation.SuppressLint
 import android.content.Context
@@ -27,26 +27,20 @@
 import androidx.compose.ui.graphics.layer.ViewLayer
 import androidx.compose.ui.graphics.nativeCanvas
 
-/**
- * The container we will use for [GraphicsViewLayer]s.
- */
+/** The container we will use for [GraphicsViewLayer]s. */
 internal class ViewLayerContainer(context: Context) : DrawChildContainer(context) {
     override fun dispatchDraw(canvas: android.graphics.Canvas) {
         // we draw our children as part of AndroidComposeView.dispatchDraw
     }
 
     /**
-     * We control our own child Views and we don't want the View system to force updating
-     * the display lists.
-     * We override hidden protected method from ViewGroup
+     * We control our own child Views and we don't want the View system to force updating the
+     * display lists. We override hidden protected method from ViewGroup
      */
-    protected fun dispatchGetDisplayList() {
-    }
+    protected fun dispatchGetDisplayList() {}
 }
 
-/**
- * The container we will use for [ViewLayer]s when [ViewLayer.shouldUseDispatchDraw] is true.
- */
+/** The container we will use for [ViewLayer]s when [ViewLayer.shouldUseDispatchDraw] is true. */
 internal open class DrawChildContainer(context: Context) : ViewGroup(context) {
     private var isDrawing = false
 
@@ -68,8 +62,8 @@
     }
 
     /**
-     * We control our own child Views and we don't want the View system to inadvertently
-     * re-layout the hierarchy.
+     * We control our own child Views and we don't want the View system to inadvertently re-layout
+     * the hierarchy.
      */
     @SuppressLint("MissingSuperCall")
     override fun requestLayout() {
@@ -108,8 +102,8 @@
     }
 
     /**
-     * We don't want to advertise children to the transition system. ViewLayers shouldn't be
-     * watched for add/remove for transitions purposes.
+     * We don't want to advertise children to the transition system. ViewLayers shouldn't be watched
+     * for add/remove for transitions purposes.
      */
     override fun getChildCount(): Int = if (isDrawing) super.getChildCount() else 0
 
diff --git a/compose/ui/ui-graphics/src/androidUnitTest/kotlin/androidx/compose/ui/graphics/layer/RobolectricGraphicsLayerTest.kt b/compose/ui/ui-graphics/src/androidUnitTest/kotlin/androidx/compose/ui/graphics/layer/RobolectricGraphicsLayerTest.kt
index 6c0d123..8755ec4 100644
--- a/compose/ui/ui-graphics/src/androidUnitTest/kotlin/androidx/compose/ui/graphics/layer/RobolectricGraphicsLayerTest.kt
+++ b/compose/ui/ui-graphics/src/androidUnitTest/kotlin/androidx/compose/ui/graphics/layer/RobolectricGraphicsLayerTest.kt
@@ -87,41 +87,34 @@
         lateinit var layer: GraphicsLayer
         graphicsLayerTest(
             block = { graphicsContext ->
-                layer = graphicsContext.createGraphicsLayer().apply {
-                    assertEquals(IntSize.Zero, this.size)
-                    record {
-                        drawRect(
-                            Color.Red,
-                            size = size / 2f
-                        )
-                        drawRect(
-                            Color.Blue,
-                            topLeft = Offset(size.width / 2f, 0f),
-                            size = size / 2f
-                        )
-                        drawRect(
-                            Color.Green,
-                            topLeft = Offset(0f, size.height / 2f),
-                            size = size / 2f
-                        )
-                        drawRect(
-                            Color.Black,
-                            topLeft = Offset(size.width / 2f, size.height / 2f),
-                            size = size / 2f
-                        )
+                layer =
+                    graphicsContext.createGraphicsLayer().apply {
+                        assertEquals(IntSize.Zero, this.size)
+                        record {
+                            drawRect(Color.Red, size = size / 2f)
+                            drawRect(
+                                Color.Blue,
+                                topLeft = Offset(size.width / 2f, 0f),
+                                size = size / 2f
+                            )
+                            drawRect(
+                                Color.Green,
+                                topLeft = Offset(0f, size.height / 2f),
+                                size = size / 2f
+                            )
+                            drawRect(
+                                Color.Black,
+                                topLeft = Offset(size.width / 2f, size.height / 2f),
+                                size = size / 2f
+                            )
+                        }
                     }
-                }
             },
             verify = {
                 val bitmap: ImageBitmap = layer.toImageBitmap()
                 assertNotNull(bitmap)
                 assertEquals(TEST_SIZE, IntSize(bitmap.width, bitmap.height))
-                bitmap.toPixelMap().verifyQuadrants(
-                    Color.Red,
-                    Color.Blue,
-                    Color.Green,
-                    Color.Black
-                )
+                bitmap.toPixelMap().verifyQuadrants(Color.Red, Color.Blue, Color.Green, Color.Black)
             }
         )
     }
@@ -131,12 +124,11 @@
         var layer: GraphicsLayer? = null
         graphicsLayerTest(
             block = { graphicsContext ->
-                layer = graphicsContext.createGraphicsLayer().apply {
-                    assertEquals(IntSize.Zero, this.size)
-                    record {
-                        drawRect(Color.Red)
+                layer =
+                    graphicsContext.createGraphicsLayer().apply {
+                        assertEquals(IntSize.Zero, this.size)
+                        record { drawRect(Color.Red) }
                     }
-                }
                 drawLayer(layer!!)
             },
             verify = {
@@ -152,13 +144,12 @@
         var layer: GraphicsLayer? = null
         graphicsLayerTest(
             block = { graphicsContext ->
-                layer = graphicsContext.createGraphicsLayer().apply {
-                    assertEquals(IntSize.Zero, this.size)
-                    record {
-                        drawRect(Color.Red)
+                layer =
+                    graphicsContext.createGraphicsLayer().apply {
+                        assertEquals(IntSize.Zero, this.size)
+                        record { drawRect(Color.Red) }
+                        discardDisplayList()
                     }
-                    discardDisplayList()
-                }
                 drawLayer(layer!!)
             },
             verify = {
@@ -179,9 +170,7 @@
             block = { graphicsContext ->
                 graphicsContext.createGraphicsLayer().apply {
                     assertEquals(IntSize.Zero, this.size)
-                    record {
-                        drawRect(Color.Red)
-                    }
+                    record { drawRect(Color.Red) }
                     this.impl.discardDisplayList()
                 }
             }
@@ -192,16 +181,13 @@
     fun testRecordLayerWithSize() {
         graphicsLayerTest(
             block = { graphicsContext ->
-                val layer = graphicsContext.createGraphicsLayer().apply {
-                    record(IntSize(TEST_WIDTH / 2, TEST_HEIGHT / 2)) {
-                        drawRect(Color.Red)
+                val layer =
+                    graphicsContext.createGraphicsLayer().apply {
+                        record(IntSize(TEST_WIDTH / 2, TEST_HEIGHT / 2)) { drawRect(Color.Red) }
                     }
-                }
                 drawLayer(layer)
             },
-            verify = {
-                it.verifyQuadrants(Color.Red, Color.Black, Color.Black, Color.Black)
-            }
+            verify = { it.verifyQuadrants(Color.Red, Color.Black, Color.Black, Color.Black) }
         )
     }
 
@@ -212,12 +198,11 @@
         val size = IntSize(TEST_WIDTH, TEST_HEIGHT)
         graphicsLayerTest(
             block = { graphicsContext ->
-                layer = graphicsContext.createGraphicsLayer().apply {
-                    record {
-                        drawRect(Color.Red)
+                layer =
+                    graphicsContext.createGraphicsLayer().apply {
+                        record { drawRect(Color.Red) }
+                        this.topLeft = topLeft
                     }
-                    this.topLeft = topLeft
-                }
                 drawLayer(layer!!)
             },
             verify = {
@@ -235,14 +220,11 @@
         val size = IntSize(TEST_WIDTH, TEST_HEIGHT)
         graphicsLayerTest(
             block = { graphicsContext ->
-                layer = graphicsContext.createGraphicsLayer().apply {
-                    record {
-                        inset(0f, 0f, -4f, -4f) {
-                            drawRect(Color.Red)
-                        }
+                layer =
+                    graphicsContext.createGraphicsLayer().apply {
+                        record { inset(0f, 0f, -4f, -4f) { drawRect(Color.Red) } }
+                        this.topLeft = topLeft
                     }
-                    this.topLeft = topLeft
-                }
                 drawLayer(layer!!)
             },
             verify = {
@@ -263,12 +245,11 @@
         val size = TEST_SIZE
         graphicsLayerTest(
             block = { graphicsContext ->
-                layer = graphicsContext.createGraphicsLayer().apply {
-                    record {
-                        drawRect(Color.Red)
+                layer =
+                    graphicsContext.createGraphicsLayer().apply {
+                        record { drawRect(Color.Red) }
+                        alpha = 0.5f
                     }
-                    alpha = 0.5f
-                }
                 drawLayer(layer!!)
             },
             verify = {
@@ -292,16 +273,17 @@
         val size = TEST_SIZE
         graphicsLayerTest(
             block = { graphicsContext ->
-                layer = graphicsContext.createGraphicsLayer().apply {
-                    record {
-                        drawRect(
-                            Color.Red,
-                            size = Size(this.size.width / 2, this.size.height / 2)
-                        )
+                layer =
+                    graphicsContext.createGraphicsLayer().apply {
+                        record {
+                            drawRect(
+                                Color.Red,
+                                size = Size(this.size.width / 2, this.size.height / 2)
+                            )
+                        }
+                        scaleX = 2f
+                        pivotOffset = Offset.Zero
                     }
-                    scaleX = 2f
-                    pivotOffset = Offset.Zero
-                }
                 drawLayer(layer!!)
             },
             verify = {
@@ -319,16 +301,17 @@
         val size = TEST_SIZE
         graphicsLayerTest(
             block = { graphicsContext ->
-                layer = graphicsContext.createGraphicsLayer().apply {
-                    record {
-                        drawRect(
-                            Color.Red,
-                            size = Size(this.size.width / 2, this.size.height / 2)
-                        )
+                layer =
+                    graphicsContext.createGraphicsLayer().apply {
+                        record {
+                            drawRect(
+                                Color.Red,
+                                size = Size(this.size.width / 2, this.size.height / 2)
+                            )
+                        }
+                        scaleY = 2f
+                        pivotOffset = Offset.Zero
                     }
-                    scaleY = 2f
-                    pivotOffset = Offset.Zero
-                }
                 drawLayer(layer!!)
             },
             verify = {
@@ -346,15 +329,14 @@
         val size = TEST_SIZE
         graphicsLayerTest(
             block = { graphicsContext ->
-                layer = graphicsContext.createGraphicsLayer().apply {
-                    record {
-                        inset(this.size.width / 4, this.size.height / 4) {
-                            drawRect(Color.Red)
+                layer =
+                    graphicsContext.createGraphicsLayer().apply {
+                        record {
+                            inset(this.size.width / 4, this.size.height / 4) { drawRect(Color.Red) }
                         }
+                        scaleY = 2f
+                        scaleX = 2f
                     }
-                    scaleY = 2f
-                    scaleX = 2f
-                }
                 drawLayer(layer!!)
             },
             verify = {
@@ -372,14 +354,13 @@
         val size = TEST_SIZE
         graphicsLayerTest(
             block = { graphicsContext ->
-                layer = graphicsContext.createGraphicsLayer().apply {
-                    record {
-                        drawRect(Color.Red)
+                layer =
+                    graphicsContext.createGraphicsLayer().apply {
+                        record { drawRect(Color.Red) }
+                        scaleY = 0.5f
+                        scaleX = 0.5f
+                        pivotOffset = Offset(this.size.width.toFloat(), this.size.height.toFloat())
                     }
-                    scaleY = 0.5f
-                    scaleX = 0.5f
-                    pivotOffset = Offset(this.size.width.toFloat(), this.size.height.toFloat())
-                }
                 drawLayer(layer!!)
             },
             verify = {
@@ -397,12 +378,11 @@
         val size = TEST_SIZE
         graphicsLayerTest(
             block = { graphicsContext ->
-                layer = graphicsContext.createGraphicsLayer().apply {
-                    record {
-                        drawRect(Color.Red, size = this.size / 2f)
+                layer =
+                    graphicsContext.createGraphicsLayer().apply {
+                        record { drawRect(Color.Red, size = this.size / 2f) }
+                        translationX = this.size.width / 2f
                     }
-                    translationX = this.size.width / 2f
-                }
                 drawLayer(layer!!)
             },
             verify = {
@@ -418,14 +398,15 @@
         graphicsLayerTest(
             block = { graphicsContext ->
                 var layerSize = Size.Zero
-                val layer = graphicsContext.createGraphicsLayer().apply {
-                    record {
-                        layerSize = this.size
-                        drawRect(Color.Red, size = this.size / 2f)
+                val layer =
+                    graphicsContext.createGraphicsLayer().apply {
+                        record {
+                            layerSize = this.size
+                            drawRect(Color.Red, size = this.size / 2f)
+                        }
+                        topLeft = IntOffset(20, 30)
+                        setRectOutline()
                     }
-                    topLeft = IntOffset(20, 30)
-                    setRectOutline()
-                }
                 drawLayer(layer)
                 val outline = layer.outline
                 assertEquals(Rect(0f, 0f, layerSize.width, layerSize.height), outline.bounds)
@@ -438,14 +419,15 @@
         graphicsLayerTest(
             block = { graphicsContext ->
                 var layerSize = Size.Zero
-                val layer = graphicsContext.createGraphicsLayer().apply {
-                    record {
-                        layerSize = this.size
-                        drawRect(Color.Red, size = this.size / 2f)
+                val layer =
+                    graphicsContext.createGraphicsLayer().apply {
+                        record {
+                            layerSize = this.size
+                            drawRect(Color.Red, size = this.size / 2f)
+                        }
+                        topLeft = IntOffset(20, 30)
+                        setRoundRectOutline()
                     }
-                    topLeft = IntOffset(20, 30)
-                    setRoundRectOutline()
-                }
                 drawLayer(layer)
                 val outline = layer.outline
                 assertEquals(Rect(0f, 0f, layerSize.width, layerSize.height), outline.bounds)
@@ -457,19 +439,12 @@
     fun testRecordOverwritesPreviousRecord() {
         graphicsLayerTest(
             block = { graphicsContext ->
-                val layer = graphicsContext.createGraphicsLayer().apply {
-                    record {
-                        drawRect(Color.Red)
-                    }
-                }
-                layer.record {
-                    drawRect(Color.Blue)
-                }
+                val layer =
+                    graphicsContext.createGraphicsLayer().apply { record { drawRect(Color.Red) } }
+                layer.record { drawRect(Color.Blue) }
                 drawLayer(layer)
             },
-            verify = {
-                it.verifyQuadrants(Color.Blue, Color.Blue, Color.Blue, Color.Blue)
-            }
+            verify = { it.verifyQuadrants(Color.Blue, Color.Blue, Color.Blue, Color.Blue) }
         )
     }
 
@@ -480,12 +455,11 @@
         val size = TEST_SIZE
         graphicsLayerTest(
             block = { graphicsContext ->
-                layer = graphicsContext.createGraphicsLayer().apply {
-                    record {
-                        drawRect(Color.Red, size = this.size / 2f)
+                layer =
+                    graphicsContext.createGraphicsLayer().apply {
+                        record { drawRect(Color.Red, size = this.size / 2f) }
+                        translationY = this.size.height / 2f
                     }
-                    translationY = this.size.height / 2f
-                }
                 drawLayer(layer!!)
             },
             verify = {
@@ -503,15 +477,13 @@
         val size = TEST_SIZE
         graphicsLayerTest(
             block = { graphicsContext ->
-                layer = graphicsContext.createGraphicsLayer().apply {
-                    record {
-                        drawRect(
-                            Color.Red,
-                            size = Size(this.size.width, this.size.height / 2)
-                        )
+                layer =
+                    graphicsContext.createGraphicsLayer().apply {
+                        record {
+                            drawRect(Color.Red, size = Size(this.size.width, this.size.height / 2))
+                        }
+                        rotationX = 45f
                     }
-                    rotationX = 45f
-                }
                 drawLayer(layer!!)
             },
             verify = {
@@ -533,13 +505,12 @@
         val size = TEST_SIZE
         graphicsLayerTest(
             block = { graphicsContext ->
-                layer = graphicsContext.createGraphicsLayer().apply {
-                    record {
-                        drawRect(Color.Red)
+                layer =
+                    graphicsContext.createGraphicsLayer().apply {
+                        record { drawRect(Color.Red) }
+                        pivotOffset = Offset(0f, this.size.height / 2f)
+                        rotationY = 45f
                     }
-                    pivotOffset = Offset(0f, this.size.height / 2f)
-                    rotationY = 45f
-                }
                 drawLayer(layer!!)
             },
             verify = {
@@ -562,19 +533,21 @@
         val rectSize = 100
         graphicsLayerTest(
             block = { graphicsContext ->
-                layer = graphicsContext.createGraphicsLayer().apply {
-                    record {
-                        drawRect(
-                            Color.Red,
-                            topLeft = Offset(
-                                this.size.width / 2f - rectSize / 2f,
-                                this.size.height / 2 - rectSize / 2f
-                            ),
-                            Size(rectSize.toFloat(), rectSize.toFloat())
-                        )
+                layer =
+                    graphicsContext.createGraphicsLayer().apply {
+                        record {
+                            drawRect(
+                                Color.Red,
+                                topLeft =
+                                    Offset(
+                                        this.size.width / 2f - rectSize / 2f,
+                                        this.size.height / 2 - rectSize / 2f
+                                    ),
+                                Size(rectSize.toFloat(), rectSize.toFloat())
+                            )
+                        }
+                        rotationZ = 45f
                     }
-                    rotationZ = 45f
-                }
                 drawLayer(layer!!)
             },
             verify = {
@@ -611,16 +584,11 @@
         var layer: GraphicsLayer?
         graphicsLayerTest(
             block = { graphicsContext ->
-                layer = graphicsContext.createGraphicsLayer().apply {
-
-                    record {
-                        drawRect(
-                            Color.Red,
-                            size = Size(100000f, 100000f)
-                        )
+                layer =
+                    graphicsContext.createGraphicsLayer().apply {
+                        record { drawRect(Color.Red, size = Size(100000f, 100000f)) }
+                        // Layer clipping is disabled by default
                     }
-                    // Layer clipping is disabled by default
-                }
                 drawLayer(layer!!)
             },
             verify = {
@@ -639,15 +607,11 @@
         var layer: GraphicsLayer?
         graphicsLayerTest(
             block = { graphicsContext ->
-                layer = graphicsContext.createGraphicsLayer().apply {
-                    record {
-                        drawRect(
-                            Color.Red,
-                            size = Size(100000f, 100000f)
-                        )
+                layer =
+                    graphicsContext.createGraphicsLayer().apply {
+                        record { drawRect(Color.Red, size = Size(100000f, 100000f)) }
+                        clip = true
                     }
-                    clip = true
-                }
                 drawLayer(layer!!)
             },
             verify = {
@@ -674,18 +638,19 @@
         val bgColor = Color.Black
         graphicsLayerTest(
             block = { graphicsContext ->
-                layer = graphicsContext.createGraphicsLayer().apply {
-                    record {
-                        inset(0f, 0f, size.width / 3, size.height / 3) {
-                            drawRect(color = Color.Red)
+                layer =
+                    graphicsContext.createGraphicsLayer().apply {
+                        record {
+                            inset(0f, 0f, size.width / 3, size.height / 3) {
+                                drawRect(color = Color.Red)
+                            }
+                            inset(size.width / 3, size.height / 3, 0f, 0f) {
+                                drawRect(color = Color.Blue)
+                            }
                         }
-                        inset(size.width / 3, size.height / 3, 0f, 0f) {
-                            drawRect(color = Color.Blue)
-                        }
+                        alpha = 0.5f
+                        compositingStrategy = CompositingStrategy.Auto
                     }
-                    alpha = 0.5f
-                    compositingStrategy = CompositingStrategy.Auto
-                }
                 drawRect(bgColor)
                 drawLayer(layer!!)
             },
@@ -712,17 +677,18 @@
         val bgColor = Color.LightGray
         graphicsLayerTest(
             block = { graphicsContext ->
-                layer = graphicsContext.createGraphicsLayer().apply {
-                    record {
-                        inset(0f, 0f, size.width / 3, size.height / 3) {
-                            drawRect(color = Color.Red)
+                layer =
+                    graphicsContext.createGraphicsLayer().apply {
+                        record {
+                            inset(0f, 0f, size.width / 3, size.height / 3) {
+                                drawRect(color = Color.Red)
+                            }
+                            inset(size.width / 3, size.height / 3, 0f, 0f) {
+                                drawRect(color = Color.Blue, blendMode = BlendMode.Xor)
+                            }
                         }
-                        inset(size.width / 3, size.height / 3, 0f, 0f) {
-                            drawRect(color = Color.Blue, blendMode = BlendMode.Xor)
-                        }
+                        compositingStrategy = CompositingStrategy.Offscreen
                     }
-                    compositingStrategy = CompositingStrategy.Offscreen
-                }
                 drawRect(bgColor)
                 drawLayer(layer!!)
             },
@@ -744,13 +710,12 @@
         val bgColor = Color.Gray
         graphicsLayerTest(
             block = { graphicsContext ->
-                layer = graphicsContext.createGraphicsLayer().apply {
-                    record {
-                        drawRect(Color.Red)
+                layer =
+                    graphicsContext.createGraphicsLayer().apply {
+                        record { drawRect(Color.Red) }
+                        cameraDistance = 5.0f
+                        rotationY = 25f
                     }
-                    cameraDistance = 5.0f
-                    rotationY = 25f
-                }
                 drawRect(bgColor)
                 drawLayer(layer!!)
             },
@@ -772,12 +737,11 @@
         var layer: GraphicsLayer?
         graphicsLayerTest(
             block = { graphicsContext ->
-                layer = graphicsContext.createGraphicsLayer().apply {
-                    record {
-                        drawRect(Color.Red)
+                layer =
+                    graphicsContext.createGraphicsLayer().apply {
+                        record { drawRect(Color.Red) }
+                        colorFilter = tint(Color.Blue)
                     }
-                    colorFilter = tint(Color.Blue)
-                }
                 drawLayer(layer!!)
             },
             verify = { pixelMap ->
@@ -798,21 +762,22 @@
         graphicsLayerTest(
             block = { graphicsContext ->
                 val drawScopeSize = this.size
-                layer = graphicsContext.createGraphicsLayer().apply {
-                    val topLeft = IntOffset(
-                        (drawScopeSize.width / 4).toInt(),
-                        (drawScopeSize.height / 4).toInt()
-                    )
-                    val layerSize = IntSize(
-                        (drawScopeSize.width / 2).toInt(),
-                        (drawScopeSize.height / 2).toInt()
-                    )
-                    record(layerSize) {
-                        drawRect(Color.Red)
+                layer =
+                    graphicsContext.createGraphicsLayer().apply {
+                        val topLeft =
+                            IntOffset(
+                                (drawScopeSize.width / 4).toInt(),
+                                (drawScopeSize.height / 4).toInt()
+                            )
+                        val layerSize =
+                            IntSize(
+                                (drawScopeSize.width / 2).toInt(),
+                                (drawScopeSize.height / 2).toInt()
+                            )
+                        record(layerSize) { drawRect(Color.Red) }
+                        this.topLeft = topLeft
+                        this.blendMode = BlendMode.Xor
                     }
-                    this.topLeft = topLeft
-                    this.blendMode = BlendMode.Xor
-                }
                 drawRect(Color.Green)
                 drawLayer(layer!!)
                 // The layer should clear the original pixels in the destination rendered by the
@@ -853,13 +818,12 @@
         val targetColor = Color.Red
         graphicsLayerTest(
             block = { graphicsContext ->
-                layer = graphicsContext.createGraphicsLayer().apply {
-                    record {
-                        drawRect(targetColor)
+                layer =
+                    graphicsContext.createGraphicsLayer().apply {
+                        record { drawRect(targetColor) }
+                        setRectOutline(this.size.center.toOffset(), (this.size / 2).toSize())
+                        clip = true
                     }
-                    setRectOutline(this.size.center.toOffset(), (this.size / 2).toSize())
-                    clip = true
-                }
                 drawRect(bgColor)
 
                 left = this.size.center.x.toInt()
@@ -873,12 +837,12 @@
                 with(pixmap) {
                     for (x in 0 until width) {
                         for (y in 0 until height) {
-                            val expected = if (x in left until right &&
-                                y in top until bottom) {
-                                targetColor
-                            } else {
-                                bgColor
-                            }
+                            val expected =
+                                if (x in left until right && y in top until bottom) {
+                                    targetColor
+                                } else {
+                                    bgColor
+                                }
                             Assert.assertEquals(this[x, y], expected)
                         }
                     }
@@ -898,22 +862,23 @@
         val targetColor = Color.Red
         graphicsLayerTest(
             block = { graphicsContext ->
-                layer = graphicsContext.createGraphicsLayer().apply {
-                    record {
-                        drawRect(targetColor)
-                    }
-                    setPathOutline(Path().apply {
-                        addRect(
-                            Rect(
-                                size.center.x.toFloat(),
-                                size.center.y.toFloat(),
-                                size.center.x + size.width.toFloat(),
-                                size.center.y + size.height.toFloat()
-                            )
+                layer =
+                    graphicsContext.createGraphicsLayer().apply {
+                        record { drawRect(targetColor) }
+                        setPathOutline(
+                            Path().apply {
+                                addRect(
+                                    Rect(
+                                        size.center.x.toFloat(),
+                                        size.center.y.toFloat(),
+                                        size.center.x + size.width.toFloat(),
+                                        size.center.y + size.height.toFloat()
+                                    )
+                                )
+                            }
                         )
-                    })
-                    clip = true
-                }
+                        clip = true
+                    }
                 drawRect(bgColor)
 
                 left = this.size.center.x.toInt()
@@ -927,12 +892,12 @@
                 with(pixmap) {
                     for (x in 0 until width) {
                         for (y in 0 until height) {
-                            val expected = if (x in left until right &&
-                                y in top until bottom) {
-                                targetColor
-                            } else {
-                                bgColor
-                            }
+                            val expected =
+                                if (x in left until right && y in top until bottom) {
+                                    targetColor
+                                } else {
+                                    bgColor
+                                }
                             Assert.assertEquals(this[x, y], expected)
                         }
                     }
@@ -953,17 +918,16 @@
         val targetColor = Color.Red
         graphicsLayerTest(
             block = { graphicsContext ->
-                layer = graphicsContext.createGraphicsLayer().apply {
-                    record {
-                        drawRect(targetColor)
+                layer =
+                    graphicsContext.createGraphicsLayer().apply {
+                        record { drawRect(targetColor) }
+                        setRoundRectOutline(
+                            this.size.center.toOffset(),
+                            (this.size / 2).toSize(),
+                            radius.toFloat()
+                        )
+                        clip = true
                     }
-                    setRoundRectOutline(
-                        this.size.center.toOffset(),
-                        (this.size / 2).toSize(),
-                        radius.toFloat()
-                    )
-                    clip = true
-                }
                 drawRect(bgColor)
 
                 left = this.size.center.x.toInt()
@@ -982,9 +946,7 @@
                     val endY = bottom - radius - offset
                     for (x in 0 until width) {
                         for (y in 0 until height) {
-                            if (
-                                x in startX until endX &&
-                                y in startY until endY) {
+                            if (x in startX until endX && y in startY until endY) {
                                 assertEquals(targetColor, this[x, y])
                             }
                         }
@@ -1029,28 +991,25 @@
         graphicsLayerTest(
             block = { graphicsContext ->
                 val fullSize = size
-                val layerSize = Size(
-                    fullSize.width.roundToInt() - inset * 2,
-                    fullSize.height.roundToInt() - inset * 2
-                ).toIntSize()
+                val layerSize =
+                    Size(
+                            fullSize.width.roundToInt() - inset * 2,
+                            fullSize.height.roundToInt() - inset * 2
+                        )
+                        .toIntSize()
 
-                val layer = graphicsContext.createGraphicsLayer().apply {
-                    record(size = layerSize) {
-                        inset(-inset) {
-                            drawRect(targetColor)
-                        }
+                val layer =
+                    graphicsContext.createGraphicsLayer().apply {
+                        record(size = layerSize) { inset(-inset) { drawRect(targetColor) } }
+                        // as no outline is provided yet, this command will enable clipToBounds
+                        clip = true
+                        // then with providing an outline we should disable clipToBounds and start
+                        // using clipToOutline instead
+                        setRectOutline(Offset(-inset, -inset), fullSize)
                     }
-                    // as no outline is provided yet, this command will enable clipToBounds
-                    clip = true
-                    // then with providing an outline we should disable clipToBounds and start
-                    // using clipToOutline instead
-                    setRectOutline(Offset(-inset, -inset), fullSize)
-                }
 
                 drawRect(Color.Black)
-                inset(inset) {
-                    drawLayer(layer)
-                }
+                inset(inset) { drawLayer(layer) }
             },
             verify = { pixmap ->
                 with(pixmap) {
@@ -1089,49 +1048,45 @@
         try {
             var container: ViewGroup? = null
             var contentView: View? = null
-            scenario = ActivityScenario.launch(ComponentActivity::class.java)
-                .moveToState(Lifecycle.State.CREATED)
-                .onActivity {
-                    container = FrameLayout(it).apply {
-                        setBackgroundColor(Color.White.toArgb())
-                        clipToPadding = false
-                        clipChildren = false
-                    }
-                    val graphicsContext = GraphicsContext(container!!)
-                    val content = FrameLayout(it).apply {
-                        setLayoutParams(
-                            FrameLayout.LayoutParams(
-                                TEST_WIDTH,
-                                TEST_HEIGHT
-                            )
+            scenario =
+                ActivityScenario.launch(ComponentActivity::class.java)
+                    .moveToState(Lifecycle.State.CREATED)
+                    .onActivity {
+                        container =
+                            FrameLayout(it).apply {
+                                setBackgroundColor(Color.White.toArgb())
+                                clipToPadding = false
+                                clipChildren = false
+                            }
+                        val graphicsContext = GraphicsContext(container!!)
+                        val content =
+                            FrameLayout(it).apply {
+                                setLayoutParams(FrameLayout.LayoutParams(TEST_WIDTH, TEST_HEIGHT))
+                                setBackgroundColor(Color.Black.toArgb())
+                                foreground = GraphicsContextHostDrawable(graphicsContext, block)
+                            }
+                        container!!.addView(content)
+                        contentView = content
+                        it.setContentView(
+                            container,
+                            ViewGroup.LayoutParams(TEST_WIDTH * 2, TEST_HEIGHT * 2)
                         )
-                        setBackgroundColor(Color.Black.toArgb())
-                        foreground = GraphicsContextHostDrawable(graphicsContext, block)
                     }
-                    container!!.addView(content)
-                    contentView = content
-                    it.setContentView(
-                        container,
-                        ViewGroup.LayoutParams(TEST_WIDTH * 2, TEST_HEIGHT * 2)
-                    )
-                }
             val resumed = CountDownLatch(1)
             var testActivity: Activity? = null
-            scenario.moveToState(Lifecycle.State.RESUMED)
-                .onActivity { activity ->
-                    testActivity = activity
-                    activity.runOnUiThread {
-                        resumed.countDown()
-                    }
-                }
+            scenario.moveToState(Lifecycle.State.RESUMED).onActivity { activity ->
+                testActivity = activity
+                activity.runOnUiThread { resumed.countDown() }
+            }
             assertTrue(resumed.await(3000, TimeUnit.MILLISECONDS))
 
             if (verify != null) {
-                val target = if (entireScene) {
-                    container!!
-                } else {
-                    contentView!!
-                }
+                val target =
+                    if (entireScene) {
+                        container!!
+                    } else {
+                        contentView!!
+                    }
                 val softwareRenderLatch = CountDownLatch(1)
                 testActivity!!.runOnUiThread {
                     val softwareBitmap = doSoftwareRender(target)
@@ -1148,11 +1103,7 @@
     }
 
     private fun doSoftwareRender(target: View): Bitmap {
-        val bitmap = Bitmap.createBitmap(
-            target.width,
-            target.height,
-            Bitmap.Config.ARGB_8888
-        )
+        val bitmap = Bitmap.createBitmap(target.width, target.height, Bitmap.Config.ARGB_8888)
         val softwareCanvas = Canvas(bitmap)
         target.draw(softwareCanvas)
         return bitmap
diff --git a/compose/ui/ui-graphics/src/commonMain/kotlin/androidx/compose/ui/graphics/Bezier.kt b/compose/ui/ui-graphics/src/commonMain/kotlin/androidx/compose/ui/graphics/Bezier.kt
index 45b6ed7..0904ef1 100644
--- a/compose/ui/ui-graphics/src/commonMain/kotlin/androidx/compose/ui/graphics/Bezier.kt
+++ b/compose/ui/ui-graphics/src/commonMain/kotlin/androidx/compose/ui/graphics/Bezier.kt
@@ -39,126 +39,67 @@
 private const val FloatEpsilon = 8.3446500e-7f
 
 /**
- * Evaluate the specified [segment] at position [t] and returns the X
- * coordinate of the segment's curve at that position.
+ * Evaluate the specified [segment] at position [t] and returns the X coordinate of the segment's
+ * curve at that position.
  */
-private fun evaluateX(
-    segment: PathSegment,
-    t: Float
-): Float {
+private fun evaluateX(segment: PathSegment, t: Float): Float {
     val points = segment.points
 
     return when (segment.type) {
         PathSegment.Type.Move -> points[0]
-
         PathSegment.Type.Line -> {
-            evaluateLine(
-                points[0],
-                points[2],
-                t
-            )
+            evaluateLine(points[0], points[2], t)
         }
-
         PathSegment.Type.Quadratic -> {
-            evaluateQuadratic(
-                points[0],
-                points[2],
-                points[4],
-                t
-            )
+            evaluateQuadratic(points[0], points[2], points[4], t)
         }
 
         // We convert all conics to cubics, won't happen
         PathSegment.Type.Conic -> Float.NaN
-
         PathSegment.Type.Cubic -> {
-            evaluateCubic(
-                points[0],
-                points[2],
-                points[4],
-                points[6],
-                t
-            )
+            evaluateCubic(points[0], points[2], points[4], points[6], t)
         }
-
         PathSegment.Type.Close -> Float.NaN
         PathSegment.Type.Done -> Float.NaN
     }
 }
 
 /**
- * Evaluate the specified [segment] at position [t] and returns the Y
- * coordinate of the segment's curve at that position.
+ * Evaluate the specified [segment] at position [t] and returns the Y coordinate of the segment's
+ * curve at that position.
  */
 @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP_PREFIX)
-fun evaluateY(
-    segment: PathSegment,
-    t: Float
-): Float {
+fun evaluateY(segment: PathSegment, t: Float): Float {
     val points = segment.points
 
     return when (segment.type) {
         PathSegment.Type.Move -> points[1]
-
         PathSegment.Type.Line -> {
-            evaluateLine(
-                points[1],
-                points[3],
-                t
-            )
+            evaluateLine(points[1], points[3], t)
         }
-
         PathSegment.Type.Quadratic -> {
-            evaluateQuadratic(
-                points[1],
-                points[3],
-                points[5],
-                t
-            )
+            evaluateQuadratic(points[1], points[3], points[5], t)
         }
 
         // We convert all conics to cubics, won't happen
         PathSegment.Type.Conic -> Float.NaN
-
         PathSegment.Type.Cubic -> {
-            evaluateCubic(
-                points[1],
-                points[3],
-                points[5],
-                points[7],
-                t
-            )
+            evaluateCubic(points[1], points[3], points[5], points[7], t)
         }
-
         PathSegment.Type.Close -> Float.NaN
         PathSegment.Type.Done -> Float.NaN
     }
 }
 
-private fun evaluateLine(
-    p0y: Float,
-    p1y: Float,
-    t: Float
-) = (p1y - p0y) * t + p0y
+private fun evaluateLine(p0y: Float, p1y: Float, t: Float) = (p1y - p0y) * t + p0y
 
-private fun evaluateQuadratic(
-    p0: Float,
-    p1: Float,
-    p2: Float,
-    t: Float
-): Float {
+private fun evaluateQuadratic(p0: Float, p1: Float, p2: Float, t: Float): Float {
     val by = 2.0f * (p1 - p0)
     val ay = p2 - 2.0f * p1 + p0
     return (ay * t + by) * t + p0
 }
 
-private fun evaluateCubic(
-    p0: Float,
-    p1: Float,
-    p2: Float,
-    p3: Float,
-    t: Float
-): Float {
+private fun evaluateCubic(p0: Float, p1: Float, p2: Float, p3: Float, t: Float): Float {
     val a = p3 + 3.0f * (p1 - p2) - p0
     val b = 3.0f * (p2 - 2.0f * p1 + p0)
     val c = 3.0f * (p1 - p0)
@@ -166,17 +107,13 @@
 }
 
 /**
- * Evaluates a cubic Bézier curve at position [t] along the curve. The curve is
- * defined by the start point (0, 0), the end point (0, 0) and two control points
- * of respective coordinates [p1] and [p2].
+ * Evaluates a cubic Bézier curve at position [t] along the curve. The curve is defined by the start
+ * point (0, 0), the end point (0, 0) and two control points of respective coordinates [p1] and
+ * [p2].
  */
 @Suppress("UnnecessaryVariable")
 @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP_PREFIX)
-fun evaluateCubic(
-    p1: Float,
-    p2: Float,
-    t: Float
-): Float {
+fun evaluateCubic(p1: Float, p2: Float, t: Float): Float {
     val a = 1.0f / 3.0f + (p1 - p2)
     val b = (p2 - 2.0f * p1)
     val c = p1
@@ -184,41 +121,32 @@
 }
 
 /**
- * Finds the first real root of the specified [segment].
- * If no root can be found, this method returns [Float.NaN].
+ * Finds the first real root of the specified [segment]. If no root can be found, this method
+ * returns [Float.NaN].
  */
 @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP_PREFIX)
-fun findFirstRoot(
-    segment: PathSegment,
-    fraction: Float
-): Float {
+fun findFirstRoot(segment: PathSegment, fraction: Float): Float {
     val points = segment.points
     return when (segment.type) {
         PathSegment.Type.Move -> Float.NaN
-
         PathSegment.Type.Line -> {
             findFirstLineRoot(
                 points[0] - fraction,
                 points[2] - fraction,
             )
         }
-
-        PathSegment.Type.Quadratic -> findFirstQuadraticRoot(
-            points[0] - fraction,
-            points[2] - fraction,
-            points[4] - fraction
-        )
+        PathSegment.Type.Quadratic ->
+            findFirstQuadraticRoot(points[0] - fraction, points[2] - fraction, points[4] - fraction)
 
         // We convert all conics to cubics, won't happen
         PathSegment.Type.Conic -> Float.NaN
-
-        PathSegment.Type.Cubic -> findFirstCubicRoot(
-            points[0] - fraction,
-            points[2] - fraction,
-            points[4] - fraction,
-            points[6] - fraction
-        )
-
+        PathSegment.Type.Cubic ->
+            findFirstCubicRoot(
+                points[0] - fraction,
+                points[2] - fraction,
+                points[4] - fraction,
+                points[6] - fraction
+            )
         PathSegment.Type.Close -> Float.NaN
         PathSegment.Type.Done -> Float.NaN
     }
@@ -236,11 +164,7 @@
  *
  * If no root can be found, this method returns [Float.NaN].
  */
-private fun findFirstQuadraticRoot(
-    p0: Float,
-    p1: Float,
-    p2: Float
-): Float {
+private fun findFirstQuadraticRoot(p0: Float, p1: Float, p2: Float): Float {
     val a = p0.toDouble()
     val b = p1.toDouble()
     val c = p2.toDouble()
@@ -271,12 +195,7 @@
  * If no root can be found, this method returns [Float.NaN].
  */
 @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP_PREFIX)
-fun findFirstCubicRoot(
-    p0: Float,
-    p1: Float,
-    p2: Float,
-    p3: Float
-): Float {
+fun findFirstCubicRoot(p0: Float, p1: Float, p2: Float, p3: Float): Float {
     // This function implements Cardano's algorithm as described in "A Primer on Bézier Curves":
     // https://pomax.github.io/bezierinfo/#yforx
     //
@@ -349,23 +268,23 @@
 }
 
 /**
- * Finds the real root of a line defined by the X coordinates of its start ([p0])
- * and end ([p1]) points. The root, if any, is written in the [roots] array at
- * [index]. Returns 1 if a root was found, 0 otherwise.
+ * Finds the real root of a line defined by the X coordinates of its start ([p0]) and end ([p1])
+ * points. The root, if any, is written in the [roots] array at [index]. Returns 1 if a root was
+ * found, 0 otherwise.
  */
 @Suppress("NOTHING_TO_INLINE")
 private inline fun findLineRoot(p0: Float, p1: Float, roots: FloatArray, index: Int = 0) =
     writeValidRootInUnitRange(-p0 / (p1 - p0), roots, index)
 
 /**
- * Finds the real roots of a quadratic Bézier curve. To find the roots, only the X
- * coordinates of the four points are required:
+ * Finds the real roots of a quadratic Bézier curve. To find the roots, only the X coordinates of
+ * the four points are required:
  * - [p0]: x coordinate of the start point
  * - [p1]: x coordinate of the control point
  * - [p2]: x coordinate of the end point
  *
- * Any root found is written in the [roots] array, starting at [index]. The
- * function returns the number of roots found and written to the array.
+ * Any root found is written in the [roots] array, starting at [index]. The function returns the
+ * number of roots found and written to the array.
  */
 private fun findQuadraticRoots(
     p0: Float,
@@ -385,12 +304,8 @@
         val v1 = -sqrt(b * b - a * c)
         val v2 = -a + b
 
-        rootCount += writeValidRootInUnitRange(
-            (-(v1 + v2) / d).toFloat(), roots, index
-        )
-        rootCount += writeValidRootInUnitRange(
-            ((v1 - v2) / d).toFloat(), roots, index + rootCount
-        )
+        rootCount += writeValidRootInUnitRange((-(v1 + v2) / d).toFloat(), roots, index)
+        rootCount += writeValidRootInUnitRange(((v1 - v2) / d).toFloat(), roots, index + rootCount)
 
         // Returns the roots sorted
         if (rootCount > 1) {
@@ -405,19 +320,18 @@
             }
         }
     } else if (b != c) {
-        rootCount += writeValidRootInUnitRange(
-            ((2.0 * b - c) / (2.0 * b - 2.0 * c)).toFloat(), roots, index
-        )
+        rootCount +=
+            writeValidRootInUnitRange(((2.0 * b - c) / (2.0 * b - 2.0 * c)).toFloat(), roots, index)
     }
 
     return rootCount
 }
 
 /**
- * Finds the roots of the derivative of the curve described by [segment].
- * The roots, if any, are written in the [roots] array starting at [index].
- * The function returns the number of roots founds and written into the array.
- * The [roots] array must be able to hold at least 5 floats starting at [index].
+ * Finds the roots of the derivative of the curve described by [segment]. The roots, if any, are
+ * written in the [roots] array starting at [index]. The function returns the number of roots founds
+ * and written into the array. The [roots] array must be able to hold at least 5 floats starting at
+ * [index].
  */
 private fun findDerivativeRoots(
     segment: PathSegment,
@@ -429,9 +343,7 @@
     val points = segment.points
     return when (segment.type) {
         PathSegment.Type.Move -> 0
-
         PathSegment.Type.Line -> 0
-
         PathSegment.Type.Quadratic -> {
             // Line derivative of a quadratic function
             // We do the computation inline to avoid using arrays of other data
@@ -443,7 +355,6 @@
 
         // We convert all conics to cubics, won't happen
         PathSegment.Type.Conic -> 0
-
         PathSegment.Type.Cubic -> {
             // Quadratic derivative of a cubic function
             // We do the computation inline to avoid using arrays of other data
@@ -459,19 +370,16 @@
             // Return the sum of the roots count
             count + findLineRoot(dd0, dd1, roots, index + count)
         }
-
         PathSegment.Type.Close -> 0
         PathSegment.Type.Done -> 0
     }
 }
 
 /**
- * Computes the horizontal bounds of the specified [segment] and returns
- * a pair of floats containing the lowest bound as the first value, and
- * the highest bound as the second value.
+ * Computes the horizontal bounds of the specified [segment] and returns a pair of floats containing
+ * the lowest bound as the first value, and the highest bound as the second value.
  *
- * The [roots] array is used as a scratch array and must be able to hold
- * at least 5 floats.
+ * The [roots] array is used as a scratch array and must be able to hold at least 5 floats.
  */
 @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP_PREFIX)
 fun computeHorizontalBounds(
@@ -494,12 +402,10 @@
 }
 
 /**
- * Computes the vertical bounds of the specified [segment] and returns
- * a pair of floats containing the lowest bound as the first value, and
- * the highest bound as the second value.
+ * Computes the vertical bounds of the specified [segment] and returns a pair of floats containing
+ * the lowest bound as the first value, and the highest bound as the second value.
  *
- * The [roots] array is used as a scratch array and must be able to hold
- * at least 5 floats.
+ * The [roots] array is used as a scratch array and must be able to hold at least 5 floats.
  */
 internal fun computeVerticalBounds(
     segment: PathSegment,
@@ -562,24 +468,25 @@
 internal inline fun Float.closeTo(b: Float) = abs(this - b) < FloatEpsilon
 
 /**
- * Returns [r] if it's in the [0..1] range, and [Float.NaN] otherwise. To account
- * for numerical imprecision in computations, values in the [-FloatEpsilon..1+FloatEpsilon]
- * range are considered to be in the [0..1] range and clamped appropriately.
+ * Returns [r] if it's in the [0..1] range, and [Float.NaN] otherwise. To account for numerical
+ * imprecision in computations, values in the [-FloatEpsilon..1+FloatEpsilon] range are considered
+ * to be in the [0..1] range and clamped appropriately.
  */
 @Suppress("NOTHING_TO_INLINE")
-private inline fun clampValidRootInUnitRange(r: Float): Float = if (r < 0.0f) {
-    if (r >= -FloatEpsilon) 0.0f else Float.NaN
-} else if (r > 1.0f) {
-    if (r <= 1.0f + FloatEpsilon) 1.0f else Float.NaN
-} else {
-    r
-}
+private inline fun clampValidRootInUnitRange(r: Float): Float =
+    if (r < 0.0f) {
+        if (r >= -FloatEpsilon) 0.0f else Float.NaN
+    } else if (r > 1.0f) {
+        if (r <= 1.0f + FloatEpsilon) 1.0f else Float.NaN
+    } else {
+        r
+    }
 
 /**
- * Writes [r] in the [roots] array at [index], if it's in the [0..1] range. To account
- * for numerical imprecision in computations, values in the [-FloatEpsilon..1+FloatEpsilon]
- * range are considered to be in the [0..1] range and clamped appropriately. Returns 0 if
- * no value was written, 1 otherwise.
+ * Writes [r] in the [roots] array at [index], if it's in the [0..1] range. To account for numerical
+ * imprecision in computations, values in the [-FloatEpsilon..1+FloatEpsilon] range are considered
+ * to be in the [0..1] range and clamped appropriately. Returns 0 if no value was written, 1
+ * otherwise.
  */
 private fun writeValidRootInUnitRange(r: Float, roots: FloatArray, index: Int): Int {
     val v = clampValidRootInUnitRange(r)
@@ -588,9 +495,9 @@
 }
 
 /**
- * Computes the winding value for a position [x]/[y] and the line defined by the [points]
- * array. The array must contain at least 4 floats defining the start and end points of the
- * line as pairs of x/y coordinates.
+ * Computes the winding value for a position [x]/[y] and the line defined by the [points] array. The
+ * array must contain at least 4 floats defining the start and end points of the line as pairs of
+ * x/y coordinates.
  */
 internal fun lineWinding(points: FloatArray, x: Float, y: Float): Int {
     val x0 = points[0]
@@ -629,23 +536,22 @@
 }
 
 /**
- * Returns whether the quadratic Bézier curve defined the start, control, and points
- * [y0], [y1], and [y2] is monotonic on the Y axis.
+ * Returns whether the quadratic Bézier curve defined the start, control, and points [y0], [y1], and
+ * [y2] is monotonic on the Y axis.
  */
 private fun isQuadraticMonotonic(y0: Float, y1: Float, y2: Float): Boolean =
     (y0 - y1).sign + (y1 - y2).sign != 0.0f
 
 /**
- * Computes the winding value for a position [x]/[y] and the quadratic Bézier curve defined by
- * the [points] array. The array must contain at least 6 floats defining the start, control,
- * and end points of the curve as pairs of x/y coordinates.
+ * Computes the winding value for a position [x]/[y] and the quadratic Bézier curve defined by the
+ * [points] array. The array must contain at least 6 floats defining the start, control, and end
+ * points of the curve as pairs of x/y coordinates.
  *
- * The [tmpQuadratics] array is a scratch array used to hold temporary values and must
- * contain at least 10 floats. Its content can be ignored after calling this function.
+ * The [tmpQuadratics] array is a scratch array used to hold temporary values and must contain at
+ * least 10 floats. Its content can be ignored after calling this function.
  *
- * The [tmpRoots] array is a scratch array that must contain at least 2 values. It is
- * used to hold temporary values and its content can be ignored after calling this
- * function.
+ * The [tmpRoots] array is a scratch array that must contain at least 2 values. It is used to hold
+ * temporary values and its content can be ignored after calling this function.
  */
 internal fun quadraticWinding(
     points: FloatArray,
@@ -672,15 +578,13 @@
 }
 
 /**
- * Computes the winding value of a _monotonic_ quadratic Bézier curve for the given
- * [x] and [y] coordinates. The curve is defined as 6 floats in the [points] array
- * corresponding to the start, control, and end points. The floats are stored at
- * position [offset] in the array, meaning the array must hold at least [offset] + 6
- * values.
+ * Computes the winding value of a _monotonic_ quadratic Bézier curve for the given [x] and [y]
+ * coordinates. The curve is defined as 6 floats in the [points] array corresponding to the start,
+ * control, and end points. The floats are stored at position [offset] in the array, meaning the
+ * array must hold at least [offset] + 6 values.
  *
- * The [tmpRoots] array is a scratch array that must contain at least 2 values. It is
- * used to hold temporary values and its content can be ignored after calling this
- * function.
+ * The [tmpRoots] array is a scratch array that must contain at least 2 values. It is used to hold
+ * temporary values and its content can be ignored after calling this function.
  */
 private fun monotonicQuadraticWinding(
     points: FloatArray,
@@ -709,18 +613,14 @@
     val y1 = points[offset + 3]
     y2 = points[offset + 5]
 
-    val rootCount = findQuadraticRoots(
-        y0 - 2.0f * y1 + y2,
-        2.0f * (y1 - y0),
-        y0 - y,
-        tmpRoots
-    )
+    val rootCount = findQuadraticRoots(y0 - 2.0f * y1 + y2, 2.0f * (y1 - y0), y0 - y, tmpRoots)
 
-    val xt = if (rootCount == 0) {
-        points[(1 - direction) * 2]
-    } else {
-        evaluateQuadratic(points[0], points[2], points[4], tmpRoots[0])
-    }
+    val xt =
+        if (rootCount == 0) {
+            points[(1 - direction) * 2]
+        } else {
+            evaluateQuadratic(points[0], points[2], points[4], tmpRoots[0])
+        }
 
     if (xt.closeTo(x)) {
         if (x != points[4] || y != y2) {
@@ -733,17 +633,15 @@
 }
 
 /**
- * Splits the specified [quadratic] Bézier curve into 1 or 2 monotonic quadratic
- * Bézier curves. The results are stored in the [dst] array. Both the input
- * [quadratic] and the output [dst] arrays store the curves as 3 pairs of floats
- * defined by the start, control, and end points. In the [dst] array, successive curves
- * share a point: the end point of the first curve is the start point of the second
- * curve. As a result this function will output at most 10 values in the [dst] array
- * (6 floats per curve, minus 2 for a shared point).
+ * Splits the specified [quadratic] Bézier curve into 1 or 2 monotonic quadratic Bézier curves. The
+ * results are stored in the [dst] array. Both the input [quadratic] and the output [dst] arrays
+ * store the curves as 3 pairs of floats defined by the start, control, and end points. In the [dst]
+ * array, successive curves share a point: the end point of the first curve is the start point of
+ * the second curve. As a result this function will output at most 10 values in the [dst] array (6
+ * floats per curve, minus 2 for a shared point).
  *
- * The function returns the number of splits: if 0 is returned, the [dst] array contains
- * a single quadratic curve, if 1 is returned, the array contains 2 curves with a shared
- * point.
+ * The function returns the number of splits: if 0 is returned, the [dst] array contains a single
+ * quadratic curve, if 1 is returned, the array contains 2 curves with a shared point.
  */
 private fun quadraticToMonotonicQuadratics(quadratic: FloatArray, dst: FloatArray): Int {
     val y0 = quadratic[1]
@@ -767,10 +665,9 @@
 }
 
 /**
- * Splits the specified [src] quadratic Bézier curve into two quadratic Bézier curves
- * at position [t] (in the range 0..1), and stores the results in [dst]. The [dst]
- * array must hold at least 10 floats. See [quadraticToMonotonicQuadratics] for more
- * details.
+ * Splits the specified [src] quadratic Bézier curve into two quadratic Bézier curves at position
+ * [t] (in the range 0..1), and stores the results in [dst]. The [dst] array must hold at least 10
+ * floats. See [quadraticToMonotonicQuadratics] for more details.
  */
 private fun splitQuadraticAt(src: FloatArray, dst: FloatArray, t: Float) {
     val p0x = src[0]
@@ -803,9 +700,9 @@
 }
 
 /**
- * Performs the division [x]/[y] and returns the result. If the division is invalid,
- * for instance if it would leads to [Float.POSITIVE_INFINITY] or if it underflows,
- * this function returns [Float.NaN].
+ * Performs the division [x]/[y] and returns the result. If the division is invalid, for instance if
+ * it would leads to [Float.POSITIVE_INFINITY] or if it underflows, this function returns
+ * [Float.NaN].
  */
 private fun unitDivide(x: Float, y: Float): Float {
     var n = x
@@ -829,16 +726,15 @@
 }
 
 /**
- * Computes the winding value for a position [x]/[y] and the cubic Bézier curve defined by
- * the [points] array. The array must contain at least 8 floats defining the start, 2 control,
- * and end points of the curve as pairs of x/y coordinates.
+ * Computes the winding value for a position [x]/[y] and the cubic Bézier curve defined by the
+ * [points] array. The array must contain at least 8 floats defining the start, 2 control, and end
+ * points of the curve as pairs of x/y coordinates.
  *
- * The [tmpCubics] array is a scratch array used to hold temporary values and must
- * contain at least 20 floats. Its content can be ignored after calling this function.
+ * The [tmpCubics] array is a scratch array used to hold temporary values and must contain at least
+ * 20 floats. Its content can be ignored after calling this function.
  *
- * The [tmpRoots] array is a scratch array that must contain at least 2 values. It is
- * used to hold temporary values and its content can be ignored after calling this
- * function.
+ * The [tmpRoots] array is a scratch array that must contain at least 2 values. It is used to hold
+ * temporary values and its content can be ignored after calling this function.
  */
 internal fun cubicWinding(
     points: FloatArray,
@@ -857,10 +753,10 @@
 }
 
 /**
- * Computes the winding value for a position [x]/[y] and the cubic Bézier curve defined by
- * the [points] array, starting at the specified [offset]. The array must contain at least
- * 10 floats after [offset] defining the start, control, and end points of the curve as pairs
- * of x/y coordinates.
+ * Computes the winding value for a position [x]/[y] and the cubic Bézier curve defined by the
+ * [points] array, starting at the specified [offset]. The array must contain at least 10 floats
+ * after [offset] defining the start, control, and end points of the curve as pairs of x/y
+ * coordinates.
  */
 private fun monotonicCubicWinding(points: FloatArray, offset: Int, x: Float, y: Float): Int {
     var y0 = points[offset + 1]
@@ -897,12 +793,13 @@
     val y2 = points[offset + 5]
     y3 = points[offset + 7]
 
-    val root = findFirstCubicRoot(
-        y0 - y,
-        y1 - y,
-        y2 - y,
-        y3 - y,
-    )
+    val root =
+        findFirstCubicRoot(
+            y0 - y,
+            y1 - y,
+            y2 - y,
+            y3 - y,
+        )
     if (root.isNaN()) return 0
 
     val xt = evaluateCubic(x0, x1, x2, x3, root)
@@ -917,20 +814,19 @@
 }
 
 /**
- * Splits the specified [cubic] Bézier curve into 1, 2, or 3 monotonic cubic Bézier curves.
- * The results are stored in the [dst] array. Both the input [cubic] and the output [dst]
- * arrays store the curves as 4 pairs of floats defined by the start, 2 control, and end
- * points. In the [dst] array, successive curves share a point: the end point of the first
- * curve is the start point of the second curve. As a result this function will output at
- * most 20 values in the [dst] array (8 floats per curve, minus 2 for each shared point).
+ * Splits the specified [cubic] Bézier curve into 1, 2, or 3 monotonic cubic Bézier curves. The
+ * results are stored in the [dst] array. Both the input [cubic] and the output [dst] arrays store
+ * the curves as 4 pairs of floats defined by the start, 2 control, and end points. In the [dst]
+ * array, successive curves share a point: the end point of the first curve is the start point of
+ * the second curve. As a result this function will output at most 20 values in the [dst] array (8
+ * floats per curve, minus 2 for each shared point).
  *
- * The function returns the number of splits: if 0 is returned, the [dst] array contains
- * a single cubic curve, if 1 is returned, the array contains 2 curves with a shared
- * point, and if 2 is returned, the array contains 3 curves with 2 shared points.
+ * The function returns the number of splits: if 0 is returned, the [dst] array contains a single
+ * cubic curve, if 1 is returned, the array contains 2 curves with a shared point, and if 2 is
+ * returned, the array contains 3 curves with 2 shared points.
  *
- * The [tmpRoot] array is a scratch array that must contain at least 2 values. It is
- * used to hold temporary values and its content can be ignored after calling this
- * function.
+ * The [tmpRoot] array is a scratch array that must contain at least 2 values. It is used to hold
+ * temporary values and its content can be ignored after calling this function.
  */
 private fun cubicToMonotonicCubics(cubic: FloatArray, dst: FloatArray, tmpRoot: FloatArray): Int {
     val rootCount = findCubicExtremaY(cubic, tmpRoot)
@@ -960,10 +856,9 @@
 }
 
 /**
- * Finds the roots of the cubic function which coincide with the specified [cubic]
- * Bézier curve's extrema on the Y axis. The roots are written in the specified
- * [dstRoots] array which must hold at least 2 floats. This function returns the number
- * of roots found: 0, 1, or 2.
+ * Finds the roots of the cubic function which coincide with the specified [cubic] Bézier curve's
+ * extrema on the Y axis. The roots are written in the specified [dstRoots] array which must hold at
+ * least 2 floats. This function returns the number of roots found: 0, 1, or 2.
  */
 private fun findCubicExtremaY(cubic: FloatArray, dstRoots: FloatArray): Int {
     val a = cubic[1]
@@ -979,12 +874,11 @@
 }
 
 /**
- * Splits the cubic Bézier curve, specified by 4 pairs of floats (8 values) in the [src]
- * array starting at the index [srcOffset], at position [t] (in the 0..1 range). The
- * results are written in the [dst] array starting at index [dstOffset]. This function
- * always outputs 2 curves sharing a point in the [dst] array, for a total of 14 float
- * values: 8 for the first curve, 7 for the second curve (the end point of the first
- * curve is shared as the start point of the second curve).
+ * Splits the cubic Bézier curve, specified by 4 pairs of floats (8 values) in the [src] array
+ * starting at the index [srcOffset], at position [t] (in the 0..1 range). The results are written
+ * in the [dst] array starting at index [dstOffset]. This function always outputs 2 curves sharing a
+ * point in the [dst] array, for a total of 14 float values: 8 for the first curve, 7 for the second
+ * curve (the end point of the first curve is shared as the start point of the second curve).
  */
 private fun splitCubicAt(
     src: FloatArray,
@@ -1079,40 +973,38 @@
 ): Float {
     // See "Computing the area and winding number for a Bézier curve", Jackowski 2012
     // https://tug.org/TUGboat/tb33-1/tb103jackowski.pdf
-    return (
-        (y3 - y0) * (x1 + x2) -
-        (x3 - x0) * (y1 + y2) +
-        y1 * (x0 - x2) -
-        x1 * (y0 - y2) +
-        y3 * (x2 + x0 / 3.0f) -
-        x3 * (y2 + y0 / 3.0f)
-    ) * 3.0f / 20.0f
+    return ((y3 - y0) * (x1 + x2) - (x3 - x0) * (y1 + y2) + y1 * (x0 - x2) - x1 * (y0 - y2) +
+        y3 * (x2 + x0 / 3.0f) - x3 * (y2 + y0 / 3.0f)) * 3.0f / 20.0f
 }
 
 private inline val PathSegment.startX: Float
     get() = points[0]
 
 private val PathSegment.endX: Float
-    get() = points[when (type) {
-        PathSegment.Type.Move -> 0
-        PathSegment.Type.Line -> 2
-        PathSegment.Type.Quadratic -> 4
-        PathSegment.Type.Conic -> 4
-        PathSegment.Type.Cubic -> 6
-        PathSegment.Type.Close -> 0
-        PathSegment.Type.Done -> 0
-    }]
+    get() =
+        points[
+            when (type) {
+                PathSegment.Type.Move -> 0
+                PathSegment.Type.Line -> 2
+                PathSegment.Type.Quadratic -> 4
+                PathSegment.Type.Conic -> 4
+                PathSegment.Type.Cubic -> 6
+                PathSegment.Type.Close -> 0
+                PathSegment.Type.Done -> 0
+            }]
 
 private inline val PathSegment.startY: Float
     get() = points[1]
 
 private val PathSegment.endY: Float
-    get() = points[when (type) {
-        PathSegment.Type.Move -> 0
-        PathSegment.Type.Line -> 3
-        PathSegment.Type.Quadratic -> 5
-        PathSegment.Type.Conic -> 5
-        PathSegment.Type.Cubic -> 7
-        PathSegment.Type.Close -> 0
-        PathSegment.Type.Done -> 0
-    }]
+    get() =
+        points[
+            when (type) {
+                PathSegment.Type.Move -> 0
+                PathSegment.Type.Line -> 3
+                PathSegment.Type.Quadratic -> 5
+                PathSegment.Type.Conic -> 5
+                PathSegment.Type.Cubic -> 7
+                PathSegment.Type.Close -> 0
+                PathSegment.Type.Done -> 0
+            }]
diff --git a/compose/ui/ui-graphics/src/commonMain/kotlin/androidx/compose/ui/graphics/BlendMode.kt b/compose/ui/ui-graphics/src/commonMain/kotlin/androidx/compose/ui/graphics/BlendMode.kt
index f18f1d4..230efa8 100644
--- a/compose/ui/ui-graphics/src/commonMain/kotlin/androidx/compose/ui/graphics/BlendMode.kt
+++ b/compose/ui/ui-graphics/src/commonMain/kotlin/androidx/compose/ui/graphics/BlendMode.kt
@@ -21,33 +21,27 @@
 /**
  * Algorithms to use when painting on the canvas.
  *
- * When drawing a shape or image onto a canvas, different algorithms can be
- * used to blend the pixels. The different values of [BlendMode] specify
- * different such algorithms.
+ * When drawing a shape or image onto a canvas, different algorithms can be used to blend the
+ * pixels. The different values of [BlendMode] specify different such algorithms.
  *
- * Each algorithm has two inputs, the _source_, which is the image being drawn,
- * and the _destination_, which is the image into which the source image is
- * being composited. The destination is often thought of as the _background_.
- * The source and destination both have four color channels, the red, green,
- * blue, and alpha channels. These are typically represented as numbers in the
- * range 0.0 to 1.0. The output of the algorithm also has these same four
- * channels, with values computed from the source and destination.
+ * Each algorithm has two inputs, the _source_, which is the image being drawn, and the
+ * _destination_, which is the image into which the source image is being composited. The
+ * destination is often thought of as the _background_. The source and destination both have four
+ * color channels, the red, green, blue, and alpha channels. These are typically represented as
+ * numbers in the range 0.0 to 1.0. The output of the algorithm also has these same four channels,
+ * with values computed from the source and destination.
  *
  * ## Application to the [Canvas] API
  *
- * When using [Canvas.saveLayer] and [Canvas.restore], the blend mode of the
- * [Paint] given to the [Canvas.saveLayer] will be applied when
- * [Canvas.restore] is called. Each call to [Canvas.saveLayer] introduces a new
- * layer onto which shapes and images are painted; when [Canvas.restore] is
- * called, that layer is then composited onto the parent layer, with the source
- * being the most-recently-drawn shapes and images, and the destination being
- * the parent layer. (For the first [Canvas.saveLayer] call, the parent layer
- * is the canvas itself.)
+ * When using [Canvas.saveLayer] and [Canvas.restore], the blend mode of the [Paint] given to the
+ * [Canvas.saveLayer] will be applied when [Canvas.restore] is called. Each call to
+ * [Canvas.saveLayer] introduces a new layer onto which shapes and images are painted; when
+ * [Canvas.restore] is called, that layer is then composited onto the parent layer, with the source
+ * being the most-recently-drawn shapes and images, and the destination being the parent layer. (For
+ * the first [Canvas.saveLayer] call, the parent layer is the canvas itself.)
  *
  * See also:
- *
- *  * [Paint.blendMode], which uses [BlendMode] to define the compositing
- *    strategy.
+ * * [Paint.blendMode], which uses [BlendMode] to define the compositing strategy.
  */
 @Immutable
 @kotlin.jvm.JvmInline
@@ -55,33 +49,28 @@
 
     companion object {
 
-        /**
-         * Drop both the source and destination images, leaving nothing.
-         */
+        /** Drop both the source and destination images, leaving nothing. */
         val Clear = BlendMode(0)
 
         /**
          * Drop the destination image, only paint the source image.
          *
-         * Conceptually, the destination is first cleared, then the source image is
-         * painted.
+         * Conceptually, the destination is first cleared, then the source image is painted.
          */
         val Src = BlendMode(1)
 
         /**
          * Drop the source image, only paint the destination image.
          *
-         * Conceptually, the source image is discarded, leaving the destination
-         * untouched.
+         * Conceptually, the source image is discarded, leaving the destination untouched.
          */
         val Dst = BlendMode(2)
 
         /**
          * Composite the source image over the destination image.
          *
-         * This is the default value. It represents the most intuitive case, where
-         * shapes are painted on top of what is below, with transparent areas showing
-         * the destination layer.
+         * This is the default value. It represents the most intuitive case, where shapes are
+         * painted on top of what is below, with transparent areas showing the destination layer.
          */
         val SrcOver = BlendMode(3)
 
@@ -90,204 +79,186 @@
          *
          * This is the opposite of [SrcOver].
          *
-         * This is useful when the source image should have been painted before the
-         * destination image, but could not be.
+         * This is useful when the source image should have been painted before the destination
+         * image, but could not be.
          */
         val DstOver = BlendMode(4)
 
         /**
-         * Show the source image, but only where the two images overlap. The
-         * destination image is not rendered, it is treated merely as a mask. The
-         * color channels of the destination are ignored, only the opacity has an
-         * effect.
+         * Show the source image, but only where the two images overlap. The destination image is
+         * not rendered, it is treated merely as a mask. The color channels of the destination are
+         * ignored, only the opacity has an effect.
          *
          * To show the destination image instead, consider [DstIn].
          *
-         * To reverse the semantic of the mask (only showing the source where the
-         * destination is absent, rather than where it is present), consider
-         * [SrcOut].
+         * To reverse the semantic of the mask (only showing the source where the destination is
+         * absent, rather than where it is present), consider [SrcOut].
          */
         val SrcIn = BlendMode(5)
 
         /**
-         * Show the destination image, but only where the two images overlap. The
-         * source image is not rendered, it is treated merely as a mask. The color
-         * channels of the source are ignored, only the opacity has an effect.
+         * Show the destination image, but only where the two images overlap. The source image is
+         * not rendered, it is treated merely as a mask. The color channels of the source are
+         * ignored, only the opacity has an effect.
          *
          * To show the source image instead, consider [SrcIn].
          *
-         * To reverse the semantic of the mask (only showing the source where the
-         * destination is present, rather than where it is absent), consider [DstOut].
+         * To reverse the semantic of the mask (only showing the source where the destination is
+         * present, rather than where it is absent), consider [DstOut].
          */
         val DstIn = BlendMode(6)
 
         /**
-         * Show the source image, but only where the two images do not overlap. The
-         * destination image is not rendered, it is treated merely as a mask. The color
-         * channels of the destination are ignored, only the opacity has an effect.
+         * Show the source image, but only where the two images do not overlap. The destination
+         * image is not rendered, it is treated merely as a mask. The color channels of the
+         * destination are ignored, only the opacity has an effect.
          *
          * To show the destination image instead, consider [DstOut].
          *
-         * To reverse the semantic of the mask (only showing the source where the
-         * destination is present, rather than where it is absent), consider [SrcIn].
+         * To reverse the semantic of the mask (only showing the source where the destination is
+         * present, rather than where it is absent), consider [SrcIn].
          *
          * This corresponds to the "Source out Destination" Porter-Duff operator.
          */
         val SrcOut = BlendMode(7)
 
         /**
-         * Show the destination image, but only where the two images do not overlap. The
-         * source image is not rendered, it is treated merely as a mask. The color
-         * channels of the source are ignored, only the opacity has an effect.
+         * Show the destination image, but only where the two images do not overlap. The source
+         * image is not rendered, it is treated merely as a mask. The color channels of the source
+         * are ignored, only the opacity has an effect.
          *
          * To show the source image instead, consider [SrcOut].
          *
-         * To reverse the semantic of the mask (only showing the destination where the
-         * source is present, rather than where it is absent), consider [DstIn].
+         * To reverse the semantic of the mask (only showing the destination where the source is
+         * present, rather than where it is absent), consider [DstIn].
          *
          * This corresponds to the "Destination out Source" Porter-Duff operator.
          */
         val DstOut = BlendMode(8)
 
         /**
-         * Composite the source image over the destination image, but only where it
-         * overlaps the destination.
+         * Composite the source image over the destination image, but only where it overlaps the
+         * destination.
          *
-         * This is essentially the [SrcOver] operator, but with the output's opacity
-         * channel being set to that of the destination image instead of being a
-         * combination of both image's opacity channels.
+         * This is essentially the [SrcOver] operator, but with the output's opacity channel being
+         * set to that of the destination image instead of being a combination of both image's
+         * opacity channels.
          *
-         * For a variant with the destination on top instead of the source, see
-         * [DstAtop].
+         * For a variant with the destination on top instead of the source, see [DstAtop].
          */
         val SrcAtop = BlendMode(9)
 
         /**
-         * Composite the destination image over the source image, but only where it
-         * overlaps the source.
+         * Composite the destination image over the source image, but only where it overlaps the
+         * source.
          *
-         * This is essentially the [DstOver] operator, but with the output's opacity
-         * channel being set to that of the source image instead of being a
-         * combination of both image's opacity channels.
+         * This is essentially the [DstOver] operator, but with the output's opacity channel being
+         * set to that of the source image instead of being a combination of both image's opacity
+         * channels.
          *
-         * For a variant with the source on top instead of the destination, see
-         * [SrcAtop].
+         * For a variant with the source on top instead of the destination, see [SrcAtop].
          */
         val DstAtop = BlendMode(10)
 
         /**
-         * Apply a bitwise `xor` operator to the source and destination images. This
-         * leaves transparency where they would overlap.
+         * Apply a bitwise `xor` operator to the source and destination images. This leaves
+         * transparency where they would overlap.
          */
         val Xor = BlendMode(11)
 
         /**
          * Sum the components of the source and destination images.
          *
-         * Transparency in a pixel of one of the images reduces the contribution of
-         * that image to the corresponding output pixel, as if the color of that
-         * pixel in that image was darker.
-         *
+         * Transparency in a pixel of one of the images reduces the contribution of that image to
+         * the corresponding output pixel, as if the color of that pixel in that image was darker.
          */
         val Plus = BlendMode(12)
 
         /**
          * Multiply the color components of the source and destination images.
          *
-         * This can only result in the same or darker colors (multiplying by white,
-         * 1.0, results in no change; multiplying by black, 0.0, results in black).
+         * This can only result in the same or darker colors (multiplying by white, 1.0, results in
+         * no change; multiplying by black, 0.0, results in black).
          *
-         * When compositing two opaque images, this has similar effect to overlapping
-         * two transparencies on a projector.
+         * When compositing two opaque images, this has similar effect to overlapping two
+         * transparencies on a projector.
          *
          * For a variant that also multiplies the alpha channel, consider [Multiply].
          *
          * See also:
-         *
-         *  * [Screen], which does a similar computation but inverted.
-         *  * [Overlay], which combines [Modulate] and [Screen] to favor the
-         *    destination image.
-         *  * [Hardlight], which combines [Modulate] and [Screen] to favor the
-         *    source image.
+         * * [Screen], which does a similar computation but inverted.
+         * * [Overlay], which combines [Modulate] and [Screen] to favor the destination image.
+         * * [Hardlight], which combines [Modulate] and [Screen] to favor the source image.
          */
         val Modulate = BlendMode(13)
 
         /**
-         * Multiply the inverse of the components of the source and destination
-         * images, and inverse the result.
+         * Multiply the inverse of the components of the source and destination images, and inverse
+         * the result.
          *
-         * Inverting the components means that a fully saturated channel (opaque
-         * white) is treated as the value 0.0, and values normally treated as 0.0
-         * (black, transparent) are treated as 1.0.
+         * Inverting the components means that a fully saturated channel (opaque white) is treated
+         * as the value 0.0, and values normally treated as 0.0 (black, transparent) are treated as
+         * 1.0.
          *
-         * This is essentially the same as [Modulate] blend mode, but with the values
-         * of the colors inverted before the multiplication and the result being
-         * inverted back before rendering.
+         * This is essentially the same as [Modulate] blend mode, but with the values of the colors
+         * inverted before the multiplication and the result being inverted back before rendering.
          *
-         * This can only result in the same or lighter colors (multiplying by black,
-         * 1.0, results in no change; multiplying by white, 0.0, results in white).
-         * Similarly, in the alpha channel, it can only result in more opaque colors.
+         * This can only result in the same or lighter colors (multiplying by black, 1.0, results in
+         * no change; multiplying by white, 0.0, results in white). Similarly, in the alpha channel,
+         * it can only result in more opaque colors.
          *
-         * This has similar effect to two projectors displaying their images on the
-         * same screen simultaneously.
+         * This has similar effect to two projectors displaying their images on the same screen
+         * simultaneously.
          *
          * See also:
-         *
-         *  * [Modulate], which does a similar computation but without inverting the
-         *    values.
-         *  * [Overlay], which combines [Modulate] and [Screen] to favor the
-         *    destination image.
-         *  * [Hardlight], which combines [Modulate] and [Screen] to favor the
-         *    source image.
+         * * [Modulate], which does a similar computation but without inverting the values.
+         * * [Overlay], which combines [Modulate] and [Screen] to favor the destination image.
+         * * [Hardlight], which combines [Modulate] and [Screen] to favor the source image.
          */
         val Screen = BlendMode(14) // The last coeff mode.
 
         /**
-         * Multiply the components of the source and destination images after
-         * adjusting them to favor the destination.
+         * Multiply the components of the source and destination images after adjusting them to
+         * favor the destination.
          *
-         * Specifically, if the destination value is smaller, this multiplies it with
-         * the source value, whereas is the source value is smaller, it multiplies
-         * the inverse of the source value with the inverse of the destination value,
-         * then inverts the result.
+         * Specifically, if the destination value is smaller, this multiplies it with the source
+         * value, whereas is the source value is smaller, it multiplies the inverse of the source
+         * value with the inverse of the destination value, then inverts the result.
          *
-         * Inverting the components means that a fully saturated channel (opaque
-         * white) is treated as the value 0.0, and values normally treated as 0.0
-         * (black, transparent) are treated as 1.0.
+         * Inverting the components means that a fully saturated channel (opaque white) is treated
+         * as the value 0.0, and values normally treated as 0.0 (black, transparent) are treated as
+         * 1.0.
          *
          * See also:
-         *
-         *  * [Modulate], which always multiplies the values.
-         *  * [Screen], which always multiplies the inverses of the values.
-         *  * [Hardlight], which is similar to [Overlay] but favors the source image
-         *    instead of the destination image.
+         * * [Modulate], which always multiplies the values.
+         * * [Screen], which always multiplies the inverses of the values.
+         * * [Hardlight], which is similar to [Overlay] but favors the source image instead of the
+         *   destination image.
          */
         val Overlay = BlendMode(15)
 
         /**
-         * Composite the source and destination image by choosing the lowest value
-         * from each color channel.
+         * Composite the source and destination image by choosing the lowest value from each color
+         * channel.
          *
-         * The opacity of the output image is computed in the same way as for
-         * [SrcOver].
+         * The opacity of the output image is computed in the same way as for [SrcOver].
          */
         val Darken = BlendMode(16)
 
         /**
-         * Composite the source and destination image by choosing the highest value
-         * from each color channel.
+         * Composite the source and destination image by choosing the highest value from each color
+         * channel.
          *
-         * The opacity of the output image is computed in the same way as for
-         * [SrcOver].
+         * The opacity of the output image is computed in the same way as for [SrcOver].
          */
         val Lighten = BlendMode(17)
 
         /**
          * Divide the destination by the inverse of the source.
          *
-         * Inverting the components means that a fully saturated channel (opaque
-         * white) is treated as the value 0.0, and values normally treated as 0.0
-         * (black, transparent) are treated as 1.0.
+         * Inverting the components means that a fully saturated channel (opaque white) is treated
+         * as the value 0.0, and values normally treated as 0.0 (black, transparent) are treated as
+         * 1.0.
          *
          * **NOTE** This [BlendMode] can only be used on Android API level 29 and above
          */
@@ -296,60 +267,54 @@
         /**
          * Divide the inverse of the destination by the source, and inverse the result.
          *
-         * Inverting the components means that a fully saturated channel (opaque
-         * white) is treated as the value 0.0, and values normally treated as 0.0
-         * (black, transparent) are treated as 1.0.
+         * Inverting the components means that a fully saturated channel (opaque white) is treated
+         * as the value 0.0, and values normally treated as 0.0 (black, transparent) are treated as
+         * 1.0.
          *
          * **NOTE** This [BlendMode] can only be used on Android API level 29 and above
          */
         val ColorBurn = BlendMode(19)
 
         /**
-         * Multiply the components of the source and destination images after
-         * adjusting them to favor the source.
+         * Multiply the components of the source and destination images after adjusting them to
+         * favor the source.
          *
-         * Specifically, if the source value is smaller, this multiplies it with the
-         * destination value, whereas is the destination value is smaller, it
-         * multiplies the inverse of the destination value with the inverse of the
-         * source value, then inverts the result.
+         * Specifically, if the source value is smaller, this multiplies it with the destination
+         * value, whereas is the destination value is smaller, it multiplies the inverse of the
+         * destination value with the inverse of the source value, then inverts the result.
          *
-         * Inverting the components means that a fully saturated channel (opaque
-         * white) is treated as the value 0.0, and values normally treated as 0.0
-         * (black, transparent) are treated as 1.0.
+         * Inverting the components means that a fully saturated channel (opaque white) is treated
+         * as the value 0.0, and values normally treated as 0.0 (black, transparent) are treated as
+         * 1.0.
          *
          * **NOTE** This [BlendMode] can only be used on Android API level 29 and above
          *
          * See also:
-         *
-         *  * [Modulate], which always multiplies the values.
-         *  * [Screen], which always multiplies the inverses of the values.
-         *  * [Overlay], which is similar to [Hardlight] but favors the destination
-         *    image instead of the source image.
+         * * [Modulate], which always multiplies the values.
+         * * [Screen], which always multiplies the inverses of the values.
+         * * [Overlay], which is similar to [Hardlight] but favors the destination image instead of
+         *   the source image.
          */
         val Hardlight = BlendMode(20)
 
         /**
-         * Use [ColorDodge] for source values below 0.5 and [ColorBurn] for source
-         * values above 0.5.
+         * Use [ColorDodge] for source values below 0.5 and [ColorBurn] for source values above 0.5.
          *
          * This results in a similar but softer effect than [Overlay].
          *
          * **NOTE** This [BlendMode] can only be used on Android API level 29 and above
          *
          * See also:
-         *
-         *  * [Color], which is a more subtle tinting effect.
+         * * [Color], which is a more subtle tinting effect.
          */
         val Softlight = BlendMode(21)
 
         /**
          * Subtract the smaller value from the bigger value for each channel.
          *
-         * Compositing black has no effect; compositing white inverts the colors of
-         * the other image.
+         * Compositing black has no effect; compositing white inverts the colors of the other image.
          *
-         * The opacity of the output image is computed in the same way as for
-         * [SrcOver].
+         * The opacity of the output image is computed in the same way as for [SrcOver].
          *
          * **NOTE** This [BlendMode] can only be used on Android API level 29 and above
          *
@@ -358,14 +323,11 @@
         val Difference = BlendMode(22)
 
         /**
-         * Subtract double the product of the two images from the sum of the two
-         * images.
+         * Subtract double the product of the two images from the sum of the two images.
          *
-         * Compositing black has no effect; compositing white inverts the colors of
-         * the other image.
+         * Compositing black has no effect; compositing white inverts the colors of the other image.
          *
-         * The opacity of the output image is computed in the same way as for
-         * [SrcOver].
+         * The opacity of the output image is computed in the same way as for [SrcOver].
          *
          * **NOTE** This [BlendMode] can only be used on Android API level 29 and above
          *
@@ -374,131 +336,126 @@
         val Exclusion = BlendMode(23)
 
         /**
-         * Multiply the components of the source and destination images, including
-         * the alpha channel.
+         * Multiply the components of the source and destination images, including the alpha
+         * channel.
          *
-         * This can only result in the same or darker colors (multiplying by white,
-         * 1.0, results in no change; multiplying by black, 0.0, results in black).
+         * This can only result in the same or darker colors (multiplying by white, 1.0, results in
+         * no change; multiplying by black, 0.0, results in black).
          *
-         * Since the alpha channel is also multiplied, a fully-transparent pixel
-         * (opacity 0.0) in one image results in a fully transparent pixel in the
-         * output. This is similar to [DstIn], but with the colors combined.
+         * Since the alpha channel is also multiplied, a fully-transparent pixel (opacity 0.0) in
+         * one image results in a fully transparent pixel in the output. This is similar to [DstIn],
+         * but with the colors combined.
          *
-         * For a variant that multiplies the colors but does not multiply the alpha
-         * channel, consider [Modulate].
+         * For a variant that multiplies the colors but does not multiply the alpha channel,
+         * consider [Modulate].
          *
          * **NOTE** This [BlendMode] can only be used on Android API level 29 and above
          */
         val Multiply = BlendMode(24) // The last separable mode.
 
         /**
-         * Take the hue of the source image, and the saturation and luminosity of the
-         * destination image.
+         * Take the hue of the source image, and the saturation and luminosity of the destination
+         * image.
          *
          * The effect is to tint the destination image with the source image.
          *
-         * The opacity of the output image is computed in the same way as for
-         * [SrcOver]. Regions that are entirely transparent in the source image take
-         * their hue from the destination.
+         * The opacity of the output image is computed in the same way as for [SrcOver]. Regions
+         * that are entirely transparent in the source image take their hue from the destination.
          *
          * **NOTE** This [BlendMode] can only be used on Android API level 29 and above
          */
         val Hue = BlendMode(25)
 
         /**
-         * Take the saturation of the source image, and the hue and luminosity of the
-         * destination image.
+         * Take the saturation of the source image, and the hue and luminosity of the destination
+         * image.
          *
-         * The opacity of the output image is computed in the same way as for
-         * [SrcOver]. Regions that are entirely transparent in the source image take
-         * their saturation from the destination.
+         * The opacity of the output image is computed in the same way as for [SrcOver]. Regions
+         * that are entirely transparent in the source image take their saturation from the
+         * destination.
          *
          * **NOTE** This [BlendMode] can only be used on Android API level 29 and above
          *
          * See also:
-         *
-         *  * [Color], which also applies the hue of the source image.
-         *  * [Luminosity], which applies the luminosity of the source image to the
-         *    destination.
+         * * [Color], which also applies the hue of the source image.
+         * * [Luminosity], which applies the luminosity of the source image to the destination.
          */
         val Saturation = BlendMode(26)
 
         /**
-         * Take the hue and saturation of the source image, and the luminosity of the
-         * destination image.
+         * Take the hue and saturation of the source image, and the luminosity of the destination
+         * image.
          *
          * The effect is to tint the destination image with the source image.
          *
-         * The opacity of the output image is computed in the same way as for
-         * [SrcOver]. Regions that are entirely transparent in the source image take
-         * their hue and saturation from the destination.
+         * The opacity of the output image is computed in the same way as for [SrcOver]. Regions
+         * that are entirely transparent in the source image take their hue and saturation from the
+         * destination.
          *
          * **NOTE** This [BlendMode] can only be used on Android API level 29 and above
          *
          * See also:
-         *
-         *  * [Hue], which is a similar but weaker effect.
-         *  * [Softlight], which is a similar tinting effect but also tints white.
-         *  * [Saturation], which only applies the saturation of the source image.
+         * * [Hue], which is a similar but weaker effect.
+         * * [Softlight], which is a similar tinting effect but also tints white.
+         * * [Saturation], which only applies the saturation of the source image.
          */
         val Color = BlendMode(27)
 
         /**
-         * Take the luminosity of the source image, and the hue and saturation of the
-         * destination image.
+         * Take the luminosity of the source image, and the hue and saturation of the destination
+         * image.
          *
-         * The opacity of the output image is computed in the same way as for
-         * [SrcOver]. Regions that are entirely transparent in the source image take
-         * their luminosity from the destination.
+         * The opacity of the output image is computed in the same way as for [SrcOver]. Regions
+         * that are entirely transparent in the source image take their luminosity from the
+         * destination.
          *
          * **NOTE** This [BlendMode] can only be used on Android API level 29 and above
          *
          * See also:
-         *
-         *  * [Saturation], which applies the saturation of the source image to the
-         *    destination.
+         * * [Saturation], which applies the saturation of the source image to the destination.
          */
         val Luminosity = BlendMode(28)
     }
 
-    override fun toString() = when (this) {
-        Clear -> "Clear"
-        Src -> "Src"
-        Dst -> "Dst"
-        SrcOver -> "SrcOver"
-        DstOver -> "DstOver"
-        SrcIn -> "SrcIn"
-        DstIn -> "DstIn"
-        SrcOut -> "SrcOut"
-        DstOut -> "DstOut"
-        SrcAtop -> "SrcAtop"
-        DstAtop -> "DstAtop"
-        Xor -> "Xor"
-        Plus -> "Plus"
-        Modulate -> "Modulate"
-        Screen -> "Screen"
-        Overlay -> "Overlay"
-        Darken -> "Darken"
-        Lighten -> "Lighten"
-        ColorDodge -> "ColorDodge"
-        ColorBurn -> "ColorBurn"
-        Hardlight -> "HardLight"
-        Softlight -> "Softlight"
-        Difference -> "Difference"
-        Exclusion -> "Exclusion"
-        Multiply -> "Multiply"
-        Hue -> "Hue"
-        Saturation -> "Saturation"
-        Color -> "Color"
-        Luminosity -> "Luminosity"
-        else -> "Unknown" // Should not get here since we have an internal constructor
-    }
+    override fun toString() =
+        when (this) {
+            Clear -> "Clear"
+            Src -> "Src"
+            Dst -> "Dst"
+            SrcOver -> "SrcOver"
+            DstOver -> "DstOver"
+            SrcIn -> "SrcIn"
+            DstIn -> "DstIn"
+            SrcOut -> "SrcOut"
+            DstOut -> "DstOut"
+            SrcAtop -> "SrcAtop"
+            DstAtop -> "DstAtop"
+            Xor -> "Xor"
+            Plus -> "Plus"
+            Modulate -> "Modulate"
+            Screen -> "Screen"
+            Overlay -> "Overlay"
+            Darken -> "Darken"
+            Lighten -> "Lighten"
+            ColorDodge -> "ColorDodge"
+            ColorBurn -> "ColorBurn"
+            Hardlight -> "HardLight"
+            Softlight -> "Softlight"
+            Difference -> "Difference"
+            Exclusion -> "Exclusion"
+            Multiply -> "Multiply"
+            Hue -> "Hue"
+            Saturation -> "Saturation"
+            Color -> "Color"
+            Luminosity -> "Luminosity"
+            else -> "Unknown" // Should not get here since we have an internal constructor
+        }
 }
 
 /**
- * Capability query to determine if the particular platform supports the [BlendMode]. Not
- * all platforms support all blend mode algorithms, however, [BlendMode.SrcOver] is guaranteed
- * to be supported as it is the default drawing algorithm. If a [BlendMode] that is not supported
- * is used, the default of SrcOver is consumed instead.
+ * Capability query to determine if the particular platform supports the [BlendMode]. Not all
+ * platforms support all blend mode algorithms, however, [BlendMode.SrcOver] is guaranteed to be
+ * supported as it is the default drawing algorithm. If a [BlendMode] that is not supported is used,
+ * the default of SrcOver is consumed instead.
  */
 expect fun BlendMode.isSupported(): Boolean
diff --git a/compose/ui/ui-graphics/src/commonMain/kotlin/androidx/compose/ui/graphics/Brush.kt b/compose/ui/ui-graphics/src/commonMain/kotlin/androidx/compose/ui/graphics/Brush.kt
index f236731..963cea8 100644
--- a/compose/ui/ui-graphics/src/commonMain/kotlin/androidx/compose/ui/graphics/Brush.kt
+++ b/compose/ui/ui-graphics/src/commonMain/kotlin/androidx/compose/ui/graphics/Brush.kt
@@ -30,11 +30,9 @@
 sealed class Brush {
 
     /**
-     * Return the intrinsic size of the [Brush].
-     * If the there is no intrinsic size (i.e. filling bounds with an arbitrary color) return
-     * [Size.Unspecified].
-     * If there is no intrinsic size in a single dimension, return [Size] with
-     * [Float.NaN] in the desired dimension.
+     * Return the intrinsic size of the [Brush]. If the there is no intrinsic size (i.e. filling
+     * bounds with an arbitrary color) return [Size.Unspecified]. If there is no intrinsic size in a
+     * single dimension, return [Size] with [Float.NaN] in the desired dimension.
      */
     open val intrinsicSize: Size = Size.Unspecified
 
@@ -44,8 +42,8 @@
 
         /**
          * Creates a linear gradient with the provided colors along the given start and end
-         * coordinates. The colors are dispersed at the provided offset defined in the
-         * colorstop pair.
+         * coordinates. The colors are dispersed at the provided offset defined in the colorstop
+         * pair.
          *
          * ```
          *  Brush.linearGradient(
@@ -58,15 +56,16 @@
          * ```
          *
          * @sample androidx.compose.ui.graphics.samples.LinearGradientColorStopSample
+         *
          * @sample androidx.compose.ui.graphics.samples.GradientBrushSample
          *
          * @param colorStops Colors and their offset in the gradient area
-         * @param start Starting position of the linear gradient. This can be set to
-         * [Offset.Zero] to position at the far left and top of the drawing area
-         * @param end Ending position of the linear gradient. This can be set to
-         * [Offset.Infinite] to position at the far right and bottom of the drawing area
+         * @param start Starting position of the linear gradient. This can be set to [Offset.Zero]
+         *   to position at the far left and top of the drawing area
+         * @param end Ending position of the linear gradient. This can be set to [Offset.Infinite]
+         *   to position at the far right and bottom of the drawing area
          * @param tileMode Determines the behavior for how the shader is to fill a region outside
-         * its bounds. Defaults to [TileMode.Clamp] to repeat the edge pixels
+         *   its bounds. Defaults to [TileMode.Clamp] to repeat the edge pixels
          */
         @Stable
         fun linearGradient(
@@ -74,17 +73,18 @@
             start: Offset = Offset.Zero,
             end: Offset = Offset.Infinite,
             tileMode: TileMode = TileMode.Clamp
-        ): Brush = LinearGradient(
-            colors = List<Color>(colorStops.size) { i -> colorStops[i].second },
-            stops = List<Float>(colorStops.size) { i -> colorStops[i].first },
-            start = start,
-            end = end,
-            tileMode = tileMode
-        )
+        ): Brush =
+            LinearGradient(
+                colors = List<Color>(colorStops.size) { i -> colorStops[i].second },
+                stops = List<Float>(colorStops.size) { i -> colorStops[i].first },
+                start = start,
+                end = end,
+                tileMode = tileMode
+            )
 
         /**
-         * Creates a linear gradient with the provided colors along the given start and end coordinates.
-         * The colors are
+         * Creates a linear gradient with the provided colors along the given start and end
+         * coordinates. The colors are
          *
          * ```
          *  Brush.linearGradient(
@@ -95,15 +95,16 @@
          * ```
          *
          * @sample androidx.compose.ui.graphics.samples.LinearGradientSample
+         *
          * @sample androidx.compose.ui.graphics.samples.GradientBrushSample
          *
          * @param colors Colors to be rendered as part of the gradient
-         * @param start Starting position of the linear gradient. This can be set to
-         * [Offset.Zero] to position at the far left and top of the drawing area
-         * @param end Ending position of the linear gradient. This can be set to
-         * [Offset.Infinite] to position at the far right and bottom of the drawing area
+         * @param start Starting position of the linear gradient. This can be set to [Offset.Zero]
+         *   to position at the far left and top of the drawing area
+         * @param end Ending position of the linear gradient. This can be set to [Offset.Infinite]
+         *   to position at the far right and bottom of the drawing area
          * @param tileMode Determines the behavior for how the shader is to fill a region outside
-         * its bounds. Defaults to [TileMode.Clamp] to repeat the edge pixels
+         *   its bounds. Defaults to [TileMode.Clamp] to repeat the edge pixels
          */
         @Stable
         fun linearGradient(
@@ -111,13 +112,14 @@
             start: Offset = Offset.Zero,
             end: Offset = Offset.Infinite,
             tileMode: TileMode = TileMode.Clamp
-        ): Brush = LinearGradient(
-            colors = colors,
-            stops = null,
-            start = start,
-            end = end,
-            tileMode = tileMode
-        )
+        ): Brush =
+            LinearGradient(
+                colors = colors,
+                stops = null,
+                start = start,
+                end = end,
+                tileMode = tileMode
+            )
 
         /**
          * Creates a horizontal gradient with the given colors evenly dispersed within the gradient
@@ -132,16 +134,16 @@
          * ```
          *
          * @sample androidx.compose.ui.graphics.samples.HorizontalGradientSample
+         *
          * @sample androidx.compose.ui.graphics.samples.GradientBrushSample
          *
          * @param colors colors Colors to be rendered as part of the gradient
          * @param startX Starting x position of the horizontal gradient. Defaults to 0 which
-         * represents the left of the drawing area
-         * @param endX Ending x position of the horizontal gradient.
-         * Defaults to [Float.POSITIVE_INFINITY] which indicates the right of the specified
-         * drawing area
+         *   represents the left of the drawing area
+         * @param endX Ending x position of the horizontal gradient. Defaults to
+         *   [Float.POSITIVE_INFINITY] which indicates the right of the specified drawing area
          * @param tileMode Determines the behavior for how the shader is to fill a region outside
-         * its bounds. Defaults to [TileMode.Clamp] to repeat the edge pixels
+         *   its bounds. Defaults to [TileMode.Clamp] to repeat the edge pixels
          */
         @Stable
         fun horizontalGradient(
@@ -167,17 +169,17 @@
          * ```
          *
          * @sample androidx.compose.ui.graphics.samples.HorizontalGradientColorStopSample
+         *
          * @sample androidx.compose.ui.graphics.samples.GradientBrushSample
          *
          * @param colorStops Colors and offsets to determine how the colors are dispersed throughout
-         * the vertical gradient
+         *   the vertical gradient
          * @param startX Starting x position of the horizontal gradient. Defaults to 0 which
-         * represents the left of the drawing area
-         * @param endX Ending x position of the horizontal gradient.
-         * Defaults to [Float.POSITIVE_INFINITY] which indicates the right of the specified
-         * drawing area
+         *   represents the left of the drawing area
+         * @param endX Ending x position of the horizontal gradient. Defaults to
+         *   [Float.POSITIVE_INFINITY] which indicates the right of the specified drawing area
          * @param tileMode Determines the behavior for how the shader is to fill a region outside
-         * its bounds. Defaults to [TileMode.Clamp] to repeat the edge pixels
+         *   its bounds. Defaults to [TileMode.Clamp] to repeat the edge pixels
          */
         @Stable
         fun horizontalGradient(
@@ -185,12 +187,13 @@
             startX: Float = 0.0f,
             endX: Float = Float.POSITIVE_INFINITY,
             tileMode: TileMode = TileMode.Clamp
-        ): Brush = linearGradient(
-            *colorStops,
-            start = Offset(startX, 0.0f),
-            end = Offset(endX, 0.0f),
-            tileMode = tileMode
-        )
+        ): Brush =
+            linearGradient(
+                *colorStops,
+                start = Offset(startX, 0.0f),
+                end = Offset(endX, 0.0f),
+                tileMode = tileMode
+            )
 
         /**
          * Creates a vertical gradient with the given colors evenly dispersed within the gradient
@@ -204,16 +207,16 @@
          * ```
          *
          * @sample androidx.compose.ui.graphics.samples.VerticalGradientSample
+         *
          * @sample androidx.compose.ui.graphics.samples.GradientBrushSample
          *
          * @param colors colors Colors to be rendered as part of the gradient
          * @param startY Starting y position of the vertical gradient. Defaults to 0 which
-         * represents the top of the drawing area
-         * @param endY Ending y position of the vertical gradient.
-         * Defaults to [Float.POSITIVE_INFINITY] which indicates the bottom of the specified
-         * drawing area
+         *   represents the top of the drawing area
+         * @param endY Ending y position of the vertical gradient. Defaults to
+         *   [Float.POSITIVE_INFINITY] which indicates the bottom of the specified drawing area
          * @param tileMode Determines the behavior for how the shader is to fill a region outside
-         * its bounds. Defaults to [TileMode.Clamp] to repeat the edge pixels
+         *   its bounds. Defaults to [TileMode.Clamp] to repeat the edge pixels
          */
         @Stable
         fun verticalGradient(
@@ -224,8 +227,8 @@
         ): Brush = linearGradient(colors, Offset(0.0f, startY), Offset(0.0f, endY), tileMode)
 
         /**
-         * Creates a vertical gradient with the given colors at the provided offset defined
-         * in the [Pair<Float, Color>]
+         * Creates a vertical gradient with the given colors at the provided offset defined in the
+         * [Pair<Float, Color>]
          *
          * Ex:
          * ```
@@ -239,17 +242,17 @@
          * ```
          *
          * @sample androidx.compose.ui.graphics.samples.VerticalGradientColorStopSample
+         *
          * @sample androidx.compose.ui.graphics.samples.GradientBrushSample
          *
          * @param colorStops Colors and offsets to determine how the colors are dispersed throughout
-         * the vertical gradient
+         *   the vertical gradient
          * @param startY Starting y position of the vertical gradient. Defaults to 0 which
-         * represents the top of the drawing area
-         * @param endY Ending y position of the vertical gradient.
-         * Defaults to [Float.POSITIVE_INFINITY] which indicates the bottom of the specified
-         * drawing area
+         *   represents the top of the drawing area
+         * @param endY Ending y position of the vertical gradient. Defaults to
+         *   [Float.POSITIVE_INFINITY] which indicates the bottom of the specified drawing area
          * @param tileMode Determines the behavior for how the shader is to fill a region outside
-         * its bounds. Defaults to [TileMode.Clamp] to repeat the edge pixels
+         *   its bounds. Defaults to [TileMode.Clamp] to repeat the edge pixels
          */
         @Stable
         fun verticalGradient(
@@ -257,16 +260,18 @@
             startY: Float = 0f,
             endY: Float = Float.POSITIVE_INFINITY,
             tileMode: TileMode = TileMode.Clamp
-        ): Brush = linearGradient(
-            *colorStops,
-            start = Offset(0.0f, startY),
-            end = Offset(0.0f, endY),
-            tileMode = tileMode
-        )
+        ): Brush =
+            linearGradient(
+                *colorStops,
+                start = Offset(0.0f, startY),
+                end = Offset(0.0f, endY),
+                tileMode = tileMode
+            )
 
         /**
-         * Creates a radial gradient with the given colors at the provided offset
-         * defined in the colorstop pair.
+         * Creates a radial gradient with the given colors at the provided offset defined in the
+         * colorstop pair.
+         *
          * ```
          * Brush.radialGradient(
          *      0.0f to Color.Red,
@@ -279,18 +284,19 @@
          * ```
          *
          * @sample androidx.compose.ui.graphics.samples.RadialBrushColorStopSample
+         *
          * @sample androidx.compose.ui.graphics.samples.GradientBrushSample
          *
          * @param colorStops Colors and offsets to determine how the colors are dispersed throughout
-         * the radial gradient
+         *   the radial gradient
          * @param center Center position of the radial gradient circle. If this is set to
-         * [Offset.Unspecified] then the center of the drawing area is used as the center for
-         * the radial gradient. [Float.POSITIVE_INFINITY] can be used for either [Offset.x] or
-         * [Offset.y] to indicate the far right or far bottom of the drawing area respectively.
+         *   [Offset.Unspecified] then the center of the drawing area is used as the center for the
+         *   radial gradient. [Float.POSITIVE_INFINITY] can be used for either [Offset.x] or
+         *   [Offset.y] to indicate the far right or far bottom of the drawing area respectively.
          * @param radius Radius for the radial gradient. Defaults to positive infinity to indicate
-         * the largest radius that can fit within the bounds of the drawing area
+         *   the largest radius that can fit within the bounds of the drawing area
          * @param tileMode Determines the behavior for how the shader is to fill a region outside
-         * its bounds. Defaults to [TileMode.Clamp] to repeat the edge pixels
+         *   its bounds. Defaults to [TileMode.Clamp] to repeat the edge pixels
          */
         @Stable
         fun radialGradient(
@@ -298,16 +304,18 @@
             center: Offset = Offset.Unspecified,
             radius: Float = Float.POSITIVE_INFINITY,
             tileMode: TileMode = TileMode.Clamp
-        ): Brush = RadialGradient(
-            colors = List<Color>(colorStops.size) { i -> colorStops[i].second },
-            stops = List<Float>(colorStops.size) { i -> colorStops[i].first },
-            center = center,
-            radius = radius,
-            tileMode = tileMode
-        )
+        ): Brush =
+            RadialGradient(
+                colors = List<Color>(colorStops.size) { i -> colorStops[i].second },
+                stops = List<Float>(colorStops.size) { i -> colorStops[i].first },
+                center = center,
+                radius = radius,
+                tileMode = tileMode
+            )
 
         /**
          * Creates a radial gradient with the given colors evenly dispersed within the gradient
+         *
          * ```
          * Brush.radialGradient(
          *      listOf(Color.Red, Color.Green, Color.Blue),
@@ -318,17 +326,18 @@
          * ```
          *
          * @sample androidx.compose.ui.graphics.samples.RadialBrushSample
+         *
          * @sample androidx.compose.ui.graphics.samples.GradientBrushSample
          *
          * @param colors Colors to be rendered as part of the gradient
          * @param center Center position of the radial gradient circle. If this is set to
-         * [Offset.Unspecified] then the center of the drawing area is used as the center for
-         * the radial gradient. [Float.POSITIVE_INFINITY] can be used for either [Offset.x] or
-         * [Offset.y] to indicate the far right or far bottom of the drawing area respectively.
+         *   [Offset.Unspecified] then the center of the drawing area is used as the center for the
+         *   radial gradient. [Float.POSITIVE_INFINITY] can be used for either [Offset.x] or
+         *   [Offset.y] to indicate the far right or far bottom of the drawing area respectively.
          * @param radius Radius for the radial gradient. Defaults to positive infinity to indicate
-         * the largest radius that can fit within the bounds of the drawing area
+         *   the largest radius that can fit within the bounds of the drawing area
          * @param tileMode Determines the behavior for how the shader is to fill a region outside
-         * its bounds. Defaults to [TileMode.Clamp] to repeat the edge pixels
+         *   its bounds. Defaults to [TileMode.Clamp] to repeat the edge pixels
          */
         @Stable
         fun radialGradient(
@@ -336,17 +345,18 @@
             center: Offset = Offset.Unspecified,
             radius: Float = Float.POSITIVE_INFINITY,
             tileMode: TileMode = TileMode.Clamp
-        ): Brush = RadialGradient(
-            colors = colors,
-            stops = null,
-            center = center,
-            radius = radius,
-            tileMode = tileMode
-        )
+        ): Brush =
+            RadialGradient(
+                colors = colors,
+                stops = null,
+                center = center,
+                radius = radius,
+                tileMode = tileMode
+            )
 
         /**
-         * Creates a sweep gradient with the given colors dispersed around the center with
-         * offsets defined in each colorstop pair. The sweep begins relative to 3 o'clock and continues
+         * Creates a sweep gradient with the given colors dispersed around the center with offsets
+         * defined in each colorstop pair. The sweep begins relative to 3 o'clock and continues
          * clockwise until it reaches the starting position again.
          *
          * Ex:
@@ -360,28 +370,30 @@
          * ```
          *
          * @sample androidx.compose.ui.graphics.samples.SweepGradientColorStopSample
+         *
          * @sample androidx.compose.ui.graphics.samples.GradientBrushSample
          *
          * @param colorStops Colors and offsets to determine how the colors are dispersed throughout
-         * the sweep gradient
+         *   the sweep gradient
          * @param center Center position of the sweep gradient circle. If this is set to
-         * [Offset.Unspecified] then the center of the drawing area is used as the center for
-         * the sweep gradient
+         *   [Offset.Unspecified] then the center of the drawing area is used as the center for the
+         *   sweep gradient
          */
         @Stable
         fun sweepGradient(
             vararg colorStops: Pair<Float, Color>,
             center: Offset = Offset.Unspecified
-        ): Brush = SweepGradient(
-            colors = List<Color>(colorStops.size) { i -> colorStops[i].second },
-            stops = List<Float>(colorStops.size) { i -> colorStops[i].first },
-            center = center
-        )
+        ): Brush =
+            SweepGradient(
+                colors = List<Color>(colorStops.size) { i -> colorStops[i].second },
+                stops = List<Float>(colorStops.size) { i -> colorStops[i].first },
+                center = center
+            )
 
         /**
-         * Creates a sweep gradient with the given colors dispersed evenly around the center.
-         * The sweep begins relative to 3 o'clock and continues clockwise until it reaches the
-         * starting position again.
+         * Creates a sweep gradient with the given colors dispersed evenly around the center. The
+         * sweep begins relative to 3 o'clock and continues clockwise until it reaches the starting
+         * position again.
          *
          * Ex:
          * ```
@@ -392,22 +404,17 @@
          * ```
          *
          * @sample androidx.compose.ui.graphics.samples.SweepGradientSample
+         *
          * @sample androidx.compose.ui.graphics.samples.GradientBrushSample
          *
          * @param colors List of colors to fill the sweep gradient
          * @param center Center position of the sweep gradient circle. If this is set to
-         * [Offset.Unspecified] then the center of the drawing area is used as the center for
-         * the sweep gradient
+         *   [Offset.Unspecified] then the center of the drawing area is used as the center for the
+         *   sweep gradient
          */
         @Stable
-        fun sweepGradient(
-            colors: List<Color>,
-            center: Offset = Offset.Unspecified
-        ): Brush = SweepGradient(
-            colors = colors,
-            stops = null,
-            center = center
-        )
+        fun sweepGradient(colors: List<Color>, center: Offset = Offset.Unspecified): Brush =
+            SweepGradient(colors = colors, stops = null, center = center)
     }
 }
 
@@ -415,11 +422,12 @@
 class SolidColor(val value: Color) : Brush() {
     override fun applyTo(size: Size, p: Paint, alpha: Float) {
         p.alpha = DefaultAlpha
-        p.color = if (alpha != DefaultAlpha) {
-            value.copy(alpha = value.alpha * alpha)
-        } else {
-            value
-        }
+        p.color =
+            if (alpha != DefaultAlpha) {
+                value.copy(alpha = value.alpha * alpha)
+            } else {
+                value
+            }
         if (p.shader != null) p.shader = null
     }
 
@@ -440,11 +448,10 @@
     }
 }
 
-/**
- * Brush implementation used to apply a linear gradient on a given [Paint]
- */
+/** Brush implementation used to apply a linear gradient on a given [Paint] */
 @Immutable
-class LinearGradient internal constructor(
+class LinearGradient
+internal constructor(
     private val colors: List<Color>,
     private val stops: List<Float>? = null,
     private val start: Offset,
@@ -506,11 +513,10 @@
     }
 }
 
-/**
- * Brush implementation used to apply a radial gradient on a given [Paint]
- */
+/** Brush implementation used to apply a radial gradient on a given [Paint] */
 @Immutable
-class RadialGradient internal constructor(
+class RadialGradient
+internal constructor(
     private val colors: List<Color>,
     private val stops: List<Float>? = null,
     private val center: Offset,
@@ -576,11 +582,10 @@
     }
 }
 
-/**
- * Brush implementation used to apply a sweep gradient on a given [Paint]
- */
+/** Brush implementation used to apply a sweep gradient on a given [Paint] */
 @Immutable
-class SweepGradient internal constructor(
+class SweepGradient
+internal constructor(
     private val center: Offset,
     private val colors: List<Color>,
     private val stops: List<Float>? = null
@@ -620,9 +625,7 @@
 
     override fun toString(): String {
         val centerValue = if (center.isSpecified) "center=$center, " else ""
-        return "SweepGradient(" +
-            centerValue +
-            "colors=$colors, stops=$stops)"
+        return "SweepGradient(" + centerValue + "colors=$colors, stops=$stops)"
     }
 }
 
@@ -630,17 +633,16 @@
  * Convenience method to create a ShaderBrush that always returns the same shader instance
  * regardless of size
  */
-fun ShaderBrush(shader: Shader) = object : ShaderBrush() {
+fun ShaderBrush(shader: Shader) =
+    object : ShaderBrush() {
 
-    /**
-     * Create a shader based on the given size that represents the current drawing area
-     */
-    override fun createShader(size: Size): Shader = shader
-}
+        /** Create a shader based on the given size that represents the current drawing area */
+        override fun createShader(size: Size): Shader = shader
+    }
 
 /**
- * Brush implementation that wraps and applies a the provided shader to a [Paint]
- * The shader can be lazily created based on a given size, or provided directly as a parameter
+ * Brush implementation that wraps and applies a the provided shader to a [Paint] The shader can be
+ * lazily created based on a given size, or provided directly as a parameter
  */
 @Immutable
 abstract class ShaderBrush() : Brush() {
diff --git a/compose/ui/ui-graphics/src/commonMain/kotlin/androidx/compose/ui/graphics/Canvas.kt b/compose/ui/ui-graphics/src/commonMain/kotlin/androidx/compose/ui/graphics/Canvas.kt
index d9faada..ac5dc98 100644
--- a/compose/ui/ui-graphics/src/commonMain/kotlin/androidx/compose/ui/graphics/Canvas.kt
+++ b/compose/ui/ui-graphics/src/commonMain/kotlin/androidx/compose/ui/graphics/Canvas.kt
@@ -22,10 +22,7 @@
 import androidx.compose.ui.unit.IntOffset
 import androidx.compose.ui.unit.IntSize
 
-/**
- * Create a new Canvas instance that targets its drawing commands
- * to the provided [ImageBitmap]
- */
+/** Create a new Canvas instance that targets its drawing commands to the provided [ImageBitmap] */
 fun Canvas(image: ImageBitmap): Canvas = ActualCanvas(image)
 
 internal expect fun ActualCanvas(image: ImageBitmap): Canvas
@@ -33,15 +30,13 @@
 expect class NativeCanvas
 
 /**
- * Saves a copy of the current transform and clip on the save stack and executes the
- * provided lambda with the current transform applied. Once the lambda has been executed,
- * the transformation is popped from the stack, undoing the transformation.
- *
+ * Saves a copy of the current transform and clip on the save stack and executes the provided lambda
+ * with the current transform applied. Once the lambda has been executed, the transformation is
+ * popped from the stack, undoing the transformation.
  *
  * See also:
  *
- *  [Canvas.saveLayer], which does the same thing but additionally also groups the
- *    commands
+ * [Canvas.saveLayer], which does the same thing but additionally also groups the commands
  */
 /* expect */ inline fun Canvas.withSave(block: () -> Unit) {
     try {
@@ -53,58 +48,47 @@
 }
 
 /**
- * Saves a copy of the current transform and clip on the save stack, and then
- * creates a new group which subsequent calls will become a part of. When the
- * lambda is executed and the save stack is popped, the group will be flattened into
- * a layer and have the given `paint`'s [Paint.colorFilter] and [Paint.blendMode]
- * applied.
+ * Saves a copy of the current transform and clip on the save stack, and then creates a new group
+ * which subsequent calls will become a part of. When the lambda is executed and the save stack is
+ * popped, the group will be flattened into a layer and have the given `paint`'s [Paint.colorFilter]
+ * and [Paint.blendMode] applied.
  *
- * This lets you create composite effects, for example making a group of
- * drawing commands semi-transparent. Without using [Canvas.saveLayer], each part of
- * the group would be painted individually, so where they overlap would be
- * darker than where they do not. By using [Canvas.saveLayer] to group them
- * together, they can be drawn with an opaque color at first, and then the
- * entire group can be made transparent using the [Canvas.saveLayer]'s paint.
- *
+ * This lets you create composite effects, for example making a group of drawing commands
+ * semi-transparent. Without using [Canvas.saveLayer], each part of the group would be painted
+ * individually, so where they overlap would be darker than where they do not. By using
+ * [Canvas.saveLayer] to group them together, they can be drawn with an opaque color at first, and
+ * then the entire group can be made transparent using the [Canvas.saveLayer]'s paint.
  *
  * ## Using saveLayer with clips
  *
- * When a rectangular clip operation (from [Canvas.clipRect]) is not axis-aligned
- * with the raster buffer, or when the clip operation is not rectalinear (e.g.
- * because it is a rounded rectangle clip created by [Canvas.clipPath]), the edge of the
- * clip needs to be anti-aliased.
+ * When a rectangular clip operation (from [Canvas.clipRect]) is not axis-aligned with the raster
+ * buffer, or when the clip operation is not rectalinear (e.g. because it is a rounded rectangle
+ * clip created by [Canvas.clipPath]), the edge of the clip needs to be anti-aliased.
  *
- * If two draw calls overlap at the edge of such a clipped region, without
- * using [Canvas.saveLayer], the first drawing will be anti-aliased with the
- * background first, and then the second will be anti-aliased with the result
- * of blending the first drawing and the background. On the other hand, if
- * [Canvas.saveLayer] is used immediately after establishing the clip, the second
- * drawing will cover the first in the layer, and thus the second alone will
- * be anti-aliased with the background when the layer is clipped and
- * composited (when lambda is finished executing).
+ * If two draw calls overlap at the edge of such a clipped region, without using [Canvas.saveLayer],
+ * the first drawing will be anti-aliased with the background first, and then the second will be
+ * anti-aliased with the result of blending the first drawing and the background. On the other hand,
+ * if [Canvas.saveLayer] is used immediately after establishing the clip, the second drawing will
+ * cover the first in the layer, and thus the second alone will be anti-aliased with the background
+ * when the layer is clipped and composited (when lambda is finished executing).
  *
  * ## Performance considerations
  *
  * Generally speaking, [Canvas.saveLayer] is relatively expensive.
  *
- * There are a several different hardware architectures for GPUs (graphics
- * processing units, the hardware that handles graphics), but most of them
- * involve batching commands and reordering them for performance. When layers
- * are used, they cause the rendering pipeline to have to switch render
- * target (from one layer to another). Render target switches can flush the
- * GPU's command buffer, which typically means that optimizations that one
- * could get with larger batching are lost. Render target switches also
- * generate a lot of memory churn because the GPU needs to copy out the
- * current frame buffer contents from the part of memory that's optimized for
- * writing, and then needs to copy it back in once the previous render target
- * (layer) is restored.
+ * There are a several different hardware architectures for GPUs (graphics processing units, the
+ * hardware that handles graphics), but most of them involve batching commands and reordering them
+ * for performance. When layers are used, they cause the rendering pipeline to have to switch render
+ * target (from one layer to another). Render target switches can flush the GPU's command buffer,
+ * which typically means that optimizations that one could get with larger batching are lost. Render
+ * target switches also generate a lot of memory churn because the GPU needs to copy out the current
+ * frame buffer contents from the part of memory that's optimized for writing, and then needs to
+ * copy it back in once the previous render target (layer) is restored.
  *
  * See also:
- *
- *  * [Canvas.save], which saves the current state, but does not create a new layer
- *    for subsequent commands.
- *  * [BlendMode], which discusses the use of [Paint.blendMode] with
- *    [saveLayer].
+ * * [Canvas.save], which saves the current state, but does not create a new layer for subsequent
+ *   commands.
+ * * [BlendMode], which discusses the use of [Paint.blendMode] with [saveLayer].
  */
 @Suppress("DEPRECATION")
 inline fun Canvas.withSaveLayer(bounds: Rect, paint: Paint, block: () -> Unit) {
@@ -117,12 +101,12 @@
 }
 
 /**
- *  Add a rotation (in degrees clockwise) to the current transform at the given pivot point.
- *  The pivot coordinate remains unchanged by the rotation transformation
+ * Add a rotation (in degrees clockwise) to the current transform at the given pivot point. The
+ * pivot coordinate remains unchanged by the rotation transformation
  *
- *  @param degrees to rotate clockwise
- *  @param pivotX The x-coord for the pivot point
- *  @param pivotY The y-coord for the pivot point
+ * @param degrees to rotate clockwise
+ * @param pivotX The x-coord for the pivot point
+ * @param pivotY The y-coord for the pivot point
  */
 fun Canvas.rotate(degrees: Float, pivotX: Float, pivotY: Float) {
     if (degrees == 0.0f) return
@@ -132,8 +116,8 @@
 }
 
 /**
- * Add a rotation (in radians clockwise) to the current transform at the given pivot point.
- * The pivot coordinate remains unchanged by the rotation transformation
+ * Add a rotation (in radians clockwise) to the current transform at the given pivot point. The
+ * pivot coordinate remains unchanged by the rotation transformation
  *
  * @param radians Rotation transform to apply to the [Canvas]
  * @param pivotX The x-coord for the pivot point
@@ -144,13 +128,11 @@
 }
 
 /**
- * Add an axis-aligned scale to the current transform, scaling by the first
- * argument in the horizontal direction and the second in the vertical
- * direction at the given pivot coordinate. The pivot coordinate remains
- * unchanged by the scale transformation.
+ * Add an axis-aligned scale to the current transform, scaling by the first argument in the
+ * horizontal direction and the second in the vertical direction at the given pivot coordinate. The
+ * pivot coordinate remains unchanged by the scale transformation.
  *
- * If [sy] is unspecified, [sx] will be used for the scale in both
- * directions.
+ * If [sy] is unspecified, [sx] will be used for the scale in both directions.
  *
  * @param sx The amount to scale in X
  * @param sy The amount to scale in Y
@@ -164,9 +146,7 @@
     translate(-pivotX, -pivotY)
 }
 
-/**
- * Return an instance of the native primitive that implements the Canvas interface
- */
+/** Return an instance of the native primitive that implements the Canvas interface */
 expect val Canvas.nativeCanvas: NativeCanvas
 
 @JvmDefaultWithCompatibility
@@ -178,56 +158,47 @@
      * Call [restore] to pop the save stack.
      *
      * See also:
-     *
-     *  * [saveLayer], which does the same thing but additionally also groups the
-     *    commands done until the matching [restore].
+     * * [saveLayer], which does the same thing but additionally also groups the commands done until
+     *   the matching [restore].
      */
     fun save()
 
     /**
-     * Pops the current save stack, if there is anything to pop.
-     * Otherwise, does nothing.
+     * Pops the current save stack, if there is anything to pop. Otherwise, does nothing.
      *
      * Use [save] and [saveLayer] to push state onto the stack.
      *
-     * If the state was pushed with with [saveLayer], then this call will also
-     * cause the new layer to be composited into the previous layer.
+     * If the state was pushed with with [saveLayer], then this call will also cause the new layer
+     * to be composited into the previous layer.
      */
     fun restore()
 
     /**
-     * Saves a copy of the current transform and clip on the save stack, and then
-     * creates a new group which subsequent calls will become a part of. When the
-     * save stack is later popped, the group will be flattened into a layer and
-     * have the given `paint`'s [Paint.colorFilter] and [Paint.blendMode]
-     * applied.
+     * Saves a copy of the current transform and clip on the save stack, and then creates a new
+     * group which subsequent calls will become a part of. When the save stack is later popped, the
+     * group will be flattened into a layer and have the given `paint`'s [Paint.colorFilter] and
+     * [Paint.blendMode] applied.
      *
-     * This lets you create composite effects, for example making a group of
-     * drawing commands semi-transparent. Without using [saveLayer], each part of
-     * the group would be painted individually, so where they overlap would be
-     * darker than where they do not. By using [saveLayer] to group them
-     * together, they can be drawn with an opaque color at first, and then the
-     * entire group can be made transparent using the [saveLayer]'s paint.
+     * This lets you create composite effects, for example making a group of drawing commands
+     * semi-transparent. Without using [saveLayer], each part of the group would be painted
+     * individually, so where they overlap would be darker than where they do not. By using
+     * [saveLayer] to group them together, they can be drawn with an opaque color at first, and then
+     * the entire group can be made transparent using the [saveLayer]'s paint.
      *
      * Call [restore] to pop the save stack and apply the paint to the group.
      *
      * ## Using saveLayer with clips
      *
-     * When a rectangular clip operation (from [clipRect]) is not axis-aligned
-     * with the raster buffer, or when the clip operation is not rectalinear (e.g.
-     * because it is a rounded rectangle clip created by [clipPath], the edge of the
-     * clip needs to be anti-aliased.
+     * When a rectangular clip operation (from [clipRect]) is not axis-aligned with the raster
+     * buffer, or when the clip operation is not rectalinear (e.g. because it is a rounded rectangle
+     * clip created by [clipPath], the edge of the clip needs to be anti-aliased.
      *
-     * If two draw calls overlap at the edge of such a clipped region, without
-     * using [saveLayer], the first drawing will be anti-aliased with the
-     * background first, and then the second will be anti-aliased with the result
-     * of blending the first drawing and the background. On the other hand, if
-     * [saveLayer] is used immediately after establishing the clip, the second
-     * drawing will cover the first in the layer, and thus the second alone will
-     * be anti-aliased with the background when the layer is clipped and
-     * composited (when [restore] is called).
-     *
-
+     * If two draw calls overlap at the edge of such a clipped region, without using [saveLayer],
+     * the first drawing will be anti-aliased with the background first, and then the second will be
+     * anti-aliased with the result of blending the first drawing and the background. On the other
+     * hand, if [saveLayer] is used immediately after establishing the clip, the second drawing will
+     * cover the first in the layer, and thus the second alone will be anti-aliased with the
+     * background when the layer is clipped and composited (when [restore] is called).
      *
      * (Incidentally, rather than using [clipPath] with a rounded rectangle defined in a path to
      * draw rounded rectangles like this, prefer the [drawRoundRect] method.
@@ -236,40 +207,34 @@
      *
      * Generally speaking, [saveLayer] is relatively expensive.
      *
-     * There are a several different hardware architectures for GPUs (graphics
-     * processing units, the hardware that handles graphics), but most of them
-     * involve batching commands and reordering them for performance. When layers
-     * are used, they cause the rendering pipeline to have to switch render
-     * target (from one layer to another). Render target switches can flush the
-     * GPU's command buffer, which typically means that optimizations that one
-     * could get with larger batching are lost. Render target switches also
-     * generate a lot of memory churn because the GPU needs to copy out the
-     * current frame buffer contents from the part of memory that's optimized for
-     * writing, and then needs to copy it back in once the previous render target
-     * (layer) is restored.
+     * There are a several different hardware architectures for GPUs (graphics processing units, the
+     * hardware that handles graphics), but most of them involve batching commands and reordering
+     * them for performance. When layers are used, they cause the rendering pipeline to have to
+     * switch render target (from one layer to another). Render target switches can flush the GPU's
+     * command buffer, which typically means that optimizations that one could get with larger
+     * batching are lost. Render target switches also generate a lot of memory churn because the GPU
+     * needs to copy out the current frame buffer contents from the part of memory that's optimized
+     * for writing, and then needs to copy it back in once the previous render target (layer) is
+     * restored.
      *
      * See also:
-     *
-     *  * [save], which saves the current state, but does not create a new layer
-     *    for subsequent commands.
-     *  * [BlendMode], which discusses the use of [Paint.blendMode] with
-     *    [saveLayer].
+     * * [save], which saves the current state, but does not create a new layer for subsequent
+     *   commands.
+     * * [BlendMode], which discusses the use of [Paint.blendMode] with [saveLayer].
      */
     fun saveLayer(bounds: Rect, paint: Paint)
 
     /**
-     * Add a translation to the current transform, shifting the coordinate space
-     * horizontally by the first argument and vertically by the second argument.
+     * Add a translation to the current transform, shifting the coordinate space horizontally by the
+     * first argument and vertically by the second argument.
      */
     fun translate(dx: Float, dy: Float)
 
     /**
-     * Add an axis-aligned scale to the current transform, scaling by the first
-     * argument in the horizontal direction and the second in the vertical
-     * direction.
+     * Add an axis-aligned scale to the current transform, scaling by the first argument in the
+     * horizontal direction and the second in the vertical direction.
      *
-     * If [sy] is unspecified, [sx] will be used for the scale in both
-     * directions.
+     * If [sy] is unspecified, [sx] will be used for the scale in both directions.
      *
      * @param sx The amount to scale in X
      * @param sy The amount to scale in Y
@@ -277,59 +242,54 @@
     fun scale(sx: Float, sy: Float = sx)
 
     /**
-     *  Add a rotation (in degrees clockwise) to the current transform
+     * Add a rotation (in degrees clockwise) to the current transform
      *
-     *  @param degrees to rotate clockwise
+     * @param degrees to rotate clockwise
      */
     fun rotate(degrees: Float)
 
     /**
-     * Add an axis-aligned skew to the current transform, with the first argument
-     * being the horizontal skew in degrees clockwise around the origin, and the
-     * second argument being the vertical skew in degrees clockwise around the
-     * origin.
+     * Add an axis-aligned skew to the current transform, with the first argument being the
+     * horizontal skew in degrees clockwise around the origin, and the second argument being the
+     * vertical skew in degrees clockwise around the origin.
      */
     fun skew(sx: Float, sy: Float)
 
     /**
-     * Add an axis-aligned skew to the current transform, with the first argument
-     * being the horizontal skew in radians clockwise around the origin, and the
-     * second argument being the vertical skew in radians clockwise around the
-     * origin.
+     * Add an axis-aligned skew to the current transform, with the first argument being the
+     * horizontal skew in radians clockwise around the origin, and the second argument being the
+     * vertical skew in radians clockwise around the origin.
      */
     fun skewRad(sxRad: Float, syRad: Float) {
         skew(degrees(sxRad), degrees(syRad))
     }
 
     /**
-     * Multiply the current transform by the specified 4⨉4 transformation matrix
-     * specified as a list of values in column-major order.
+     * Multiply the current transform by the specified 4⨉4 transformation matrix specified as a list
+     * of values in column-major order.
      */
     fun concat(matrix: Matrix)
 
     /**
-     * Reduces the clip region to the intersection of the current clip and the
-     * given rectangle.
+     * Reduces the clip region to the intersection of the current clip and the given rectangle.
      *
-     * Use [ClipOp.Difference] to subtract the provided rectangle from the
-     * current clip.
+     * Use [ClipOp.Difference] to subtract the provided rectangle from the current clip.
      */
     @Suppress("DEPRECATION")
     fun clipRect(rect: Rect, clipOp: ClipOp = ClipOp.Intersect) =
         clipRect(rect.left, rect.top, rect.right, rect.bottom, clipOp)
 
     /**
-     * Reduces the clip region to the intersection of the current clip and the
-     * given bounds.
+     * Reduces the clip region to the intersection of the current clip and the given bounds.
      *
-     * Use [ClipOp.Difference] to subtract the provided rectangle from the
-     * current clip.
+     * Use [ClipOp.Difference] to subtract the provided rectangle from the current clip.
      *
      * @param left Left bound of the clip region
      * @param top Top bound of the clip region
      * @param right Right bound of the clip region
      * @param bottom Bottom bound of the clip region
-     * @param clipOp Clipping operation to conduct on the given bounds, defaults to [ClipOp.Intersect]
+     * @param clipOp Clipping operation to conduct on the given bounds, defaults to
+     *   [ClipOp.Intersect]
      */
     fun clipRect(
         left: Float,
@@ -339,35 +299,33 @@
         clipOp: ClipOp = ClipOp.Intersect
     )
 
-    /**
-     * Reduces the clip region to the intersection of the current clip and the
-     * given [Path].
-     */
+    /** Reduces the clip region to the intersection of the current clip and the given [Path]. */
     fun clipPath(path: Path, clipOp: ClipOp = ClipOp.Intersect)
 
     /**
-     * Draws a line between the given points using the given paint. The line is
-     * stroked, the value of the [Paint.style] is ignored for this call.
+     * Draws a line between the given points using the given paint. The line is stroked, the value
+     * of the [Paint.style] is ignored for this call.
      *
      * The `p1` and `p2` arguments are interpreted as offsets from the origin.
      */
     fun drawLine(p1: Offset, p2: Offset, paint: Paint)
 
     /**
-     * Draws a rectangle with the given [Paint]. Whether the rectangle is filled
-     * or stroked (or both) is controlled by [Paint.style].
+     * Draws a rectangle with the given [Paint]. Whether the rectangle is filled or stroked (or
+     * both) is controlled by [Paint.style].
      */
-    fun drawRect(rect: Rect, paint: Paint) = drawRect(
-        left = rect.left,
-        top = rect.top,
-        right = rect.right,
-        bottom = rect.bottom,
-        paint = paint
-    )
+    fun drawRect(rect: Rect, paint: Paint) =
+        drawRect(
+            left = rect.left,
+            top = rect.top,
+            right = rect.right,
+            bottom = rect.bottom,
+            paint = paint
+        )
 
     /**
-     * Draws a rectangle with the given [Paint]. Whether the rectangle is filled
-     * or stroked (or both) is controlled by [Paint.style].
+     * Draws a rectangle with the given [Paint]. Whether the rectangle is filled or stroked (or
+     * both) is controlled by [Paint.style].
      *
      * @param left The left bound of the rectangle
      * @param top The top bound of the rectangle
@@ -375,17 +333,11 @@
      * @param bottom The bottom bound of the rectangle
      * @param paint Paint used to color the rectangle with a fill or stroke
      */
-    fun drawRect(
-        left: Float,
-        top: Float,
-        right: Float,
-        bottom: Float,
-        paint: Paint
-    )
+    fun drawRect(left: Float, top: Float, right: Float, bottom: Float, paint: Paint)
 
     /**
-     * Draws a rounded rectangle with the given [Paint]. Whether the rectangle is
-     * filled or stroked (or both) is controlled by [Paint.style].
+     * Draws a rounded rectangle with the given [Paint]. Whether the rectangle is filled or stroked
+     * (or both) is controlled by [Paint.style].
      */
     fun drawRoundRect(
         left: Float,
@@ -398,22 +350,21 @@
     )
 
     /**
-     * Draws an axis-aligned oval that fills the given axis-aligned rectangle
-     * with the given [Paint]. Whether the oval is filled or stroked (or both) is
-     * controlled by [Paint.style].
+     * Draws an axis-aligned oval that fills the given axis-aligned rectangle with the given
+     * [Paint]. Whether the oval is filled or stroked (or both) is controlled by [Paint.style].
      */
-    fun drawOval(rect: Rect, paint: Paint) = drawOval(
-        left = rect.left,
-        top = rect.top,
-        right = rect.right,
-        bottom = rect.bottom,
-        paint = paint
-    )
+    fun drawOval(rect: Rect, paint: Paint) =
+        drawOval(
+            left = rect.left,
+            top = rect.top,
+            right = rect.right,
+            bottom = rect.bottom,
+            paint = paint
+        )
 
     /**
-     * Draws an axis-aligned oval that fills the given bounds provided with the given
-     * [Paint]. Whether the rectangle is filled
-     * or stroked (or both) is controlled by [Paint.style].
+     * Draws an axis-aligned oval that fills the given bounds provided with the given [Paint].
+     * Whether the rectangle is filled or stroked (or both) is controlled by [Paint.style].
      *
      * @param left The left bound of the rectangle
      * @param top The top bound of the rectangle
@@ -424,22 +375,19 @@
     fun drawOval(left: Float, top: Float, right: Float, bottom: Float, paint: Paint)
 
     /**
-     * Draws a circle centered at the point given by the first argument and
-     * that has the radius given by the second argument, with the [Paint] given in
-     * the third argument. Whether the circle is filled or stroked (or both) is
-     * controlled by [Paint.style].
+     * Draws a circle centered at the point given by the first argument and that has the radius
+     * given by the second argument, with the [Paint] given in the third argument. Whether the
+     * circle is filled or stroked (or both) is controlled by [Paint.style].
      */
     fun drawCircle(center: Offset, radius: Float, paint: Paint)
 
     /**
-     * Draw an arc scaled to fit inside the given rectangle. It starts from
-     * startAngle degrees around the oval up to startAngle + sweepAngle
-     * degrees around the oval, with zero degrees being the point on
-     * the right hand side of the oval that crosses the horizontal line
-     * that intersects the center of the rectangle and with positive
-     * angles going clockwise around the oval. If useCenter is true, the arc is
-     * closed back to the center, forming a circle sector. Otherwise, the arc is
-     * not closed, forming a circle segment.
+     * Draw an arc scaled to fit inside the given rectangle. It starts from startAngle degrees
+     * around the oval up to startAngle + sweepAngle degrees around the oval, with zero degrees
+     * being the point on the right hand side of the oval that crosses the horizontal line that
+     * intersects the center of the rectangle and with positive angles going clockwise around the
+     * oval. If useCenter is true, the arc is closed back to the center, forming a circle sector.
+     * Otherwise, the arc is not closed, forming a circle segment.
      *
      * This method is optimized for drawing arcs and should be faster than [Path.arcTo].
      */
@@ -449,26 +397,25 @@
         sweepAngle: Float,
         useCenter: Boolean,
         paint: Paint
-    ) = drawArc(
-        left = rect.left,
-        top = rect.top,
-        right = rect.right,
-        bottom = rect.bottom,
-        startAngle = startAngle,
-        sweepAngle = sweepAngle,
-        useCenter = useCenter,
-        paint = paint
-    )
+    ) =
+        drawArc(
+            left = rect.left,
+            top = rect.top,
+            right = rect.right,
+            bottom = rect.bottom,
+            startAngle = startAngle,
+            sweepAngle = sweepAngle,
+            useCenter = useCenter,
+            paint = paint
+        )
 
     /**
-     * Draw an arc scaled to fit inside the given rectangle. It starts from
-     * startAngle degrees around the oval up to startAngle + sweepAngle
-     * degrees around the oval, with zero degrees being the point on
-     * the right hand side of the oval that crosses the horizontal line
-     * that intersects the center of the rectangle and with positive
-     * angles going clockwise around the oval. If useCenter is true, the arc is
-     * closed back to the center, forming a circle sector. Otherwise, the arc is
-     * not closed, forming a circle segment.
+     * Draw an arc scaled to fit inside the given rectangle. It starts from startAngle degrees
+     * around the oval up to startAngle + sweepAngle degrees around the oval, with zero degrees
+     * being the point on the right hand side of the oval that crosses the horizontal line that
+     * intersects the center of the rectangle and with positive angles going clockwise around the
+     * oval. If useCenter is true, the arc is closed back to the center, forming a circle sector.
+     * Otherwise, the arc is not closed, forming a circle segment.
      *
      * This method is optimized for drawing arcs and should be faster than [Path.arcTo].
      *
@@ -479,8 +426,8 @@
      * @param startAngle Starting angle of the arc relative to 3 o'clock
      * @param sweepAngle Sweep angle in degrees clockwise
      * @param useCenter Flag indicating whether or not to include the center of the oval in the
-     * @param paint Paint used to draw the arc.
-     * arc, and close it if it is being stroked. This will draw a wedge.
+     * @param paint Paint used to draw the arc. arc, and close it if it is being stroked. This will
+     *   draw a wedge.
      */
     fun drawArc(
         left: Float,
@@ -494,14 +441,12 @@
     )
 
     /**
-     * Draw an arc scaled to fit inside the given rectangle. It starts from
-     * startAngle radians around the oval up to startAngle + sweepAngle
-     * radians around the oval, with zero radians being the point on
-     * the right hand side of the oval that crosses the horizontal line
-     * that intersects the center of the rectangle and with positive
-     * angles going clockwise around the oval. If useCenter is true, the arc is
-     * closed back to the center, forming a circle sector. Otherwise, the arc is
-     * not closed, forming a circle segment.
+     * Draw an arc scaled to fit inside the given rectangle. It starts from startAngle radians
+     * around the oval up to startAngle + sweepAngle radians around the oval, with zero radians
+     * being the point on the right hand side of the oval that crosses the horizontal line that
+     * intersects the center of the rectangle and with positive angles going clockwise around the
+     * oval. If useCenter is true, the arc is closed back to the center, forming a circle sector.
+     * Otherwise, the arc is not closed, forming a circle segment.
      *
      * This method is optimized for drawing arcs and should be faster than [Path.arcTo].
      */
@@ -516,32 +461,30 @@
     }
 
     /**
-     * Draws the given [Path] with the given [Paint]. Whether this shape is
-     * filled or stroked (or both) is controlled by [Paint.style]. If the path is
-     * filled, then subpaths within it are implicitly closed (see [Path.close]).
+     * Draws the given [Path] with the given [Paint]. Whether this shape is filled or stroked (or
+     * both) is controlled by [Paint.style]. If the path is filled, then subpaths within it are
+     * implicitly closed (see [Path.close]).
      */
     fun drawPath(path: Path, paint: Paint)
 
     /**
-     * Draws the given [ImageBitmap] into the canvas with its top-left corner at the
-     * given [Offset]. The image is composited into the canvas using the given [Paint].
+     * Draws the given [ImageBitmap] into the canvas with its top-left corner at the given [Offset].
+     * The image is composited into the canvas using the given [Paint].
      */
     fun drawImage(image: ImageBitmap, topLeftOffset: Offset, paint: Paint)
 
     /**
-     * Draws the subset of the given image described by the `src` argument into
-     * the canvas in the axis-aligned rectangle given by the `dst` argument.
+     * Draws the subset of the given image described by the `src` argument into the canvas in the
+     * axis-aligned rectangle given by the `dst` argument.
      *
-     * This might sample from outside the `src` rect by up to half the width of
-     * an applied filter.
+     * This might sample from outside the `src` rect by up to half the width of an applied filter.
      *
      * @param image ImageBitmap to draw
-     * @param srcOffset: Optional offset representing the top left offset of the source image
-     * to draw, this defaults to the origin of [image]
-     * @param srcSize: Optional dimensions of the source image to draw relative to [srcOffset],
-     * this defaults the width and height of [image]
-     * @param dstOffset: Offset representing the top left offset of the destination image
-     * to draw
+     * @param srcOffset: Optional offset representing the top left offset of the source image to
+     *   draw, this defaults to the origin of [image]
+     * @param srcSize: Optional dimensions of the source image to draw relative to [srcOffset], this
+     *   defaults the width and height of [image]
+     * @param dstOffset: Offset representing the top left offset of the destination image to draw
      * @param dstSize: Dimensions of the destination to draw
      * @param paint Paint used to composite the [ImageBitmap] pixels into the canvas
      */
@@ -560,39 +503,36 @@
      * The `points` argument is interpreted as offsets from the origin.
      *
      * See also:
-     *
-     *  * [drawRawPoints], which takes `points` as a [FloatArray] rather than a
-     *    [List<Offset>].
+     * * [drawRawPoints], which takes `points` as a [FloatArray] rather than a [List<Offset>].
      */
     fun drawPoints(pointMode: PointMode, points: List<Offset>, paint: Paint)
 
     /**
      * Draws a sequence of points according to the given [PointMode].
      *
-     * The `points` argument is interpreted  as a list of pairs of floating point
-     * numbers, where each pair represents an x and y offset from the origin.
+     * The `points` argument is interpreted as a list of pairs of floating point numbers, where each
+     * pair represents an x and y offset from the origin.
      *
      * See also:
-     *
-     *  * [drawPoints], which takes `points` as a [List<Offset>] rather than a
-     *    [List<Float32List>].
+     * * [drawPoints], which takes `points` as a [List<Offset>] rather than a [List<Float32List>].
      */
     fun drawRawPoints(pointMode: PointMode, points: FloatArray, paint: Paint)
 
     fun drawVertices(vertices: Vertices, blendMode: BlendMode, paint: Paint)
 
     /**
-     * Enables Z support which defaults to disabled. This allows layers drawn
-     * with different elevations to be rearranged based on their elevation. It
-     * also enables rendering of shadows.
+     * Enables Z support which defaults to disabled. This allows layers drawn with different
+     * elevations to be rearranged based on their elevation. It also enables rendering of shadows.
+     *
      * @see disableZ
      */
     fun enableZ()
 
     /**
      * Disables Z support, preventing any layers drawn after this point from being visually
-     * reordered or having shadows rendered. This is not impacted by any [save] or [restore]
-     * calls as it is not considered part of the matrix or clip.
+     * reordered or having shadows rendered. This is not impacted by any [save] or [restore] calls
+     * as it is not considered part of the matrix or clip.
+     *
      * @see enableZ
      */
     fun disableZ()
diff --git a/compose/ui/ui-graphics/src/commonMain/kotlin/androidx/compose/ui/graphics/ClipOp.kt b/compose/ui/ui-graphics/src/commonMain/kotlin/androidx/compose/ui/graphics/ClipOp.kt
index 56491b1..fe6bc08 100644
--- a/compose/ui/ui-graphics/src/commonMain/kotlin/androidx/compose/ui/graphics/ClipOp.kt
+++ b/compose/ui/ui-graphics/src/commonMain/kotlin/androidx/compose/ui/graphics/ClipOp.kt
@@ -19,8 +19,7 @@
 import androidx.compose.runtime.Immutable
 
 /**
- * Defines how a new clip region should be merged with the existing clip
- * region.
+ * Defines how a new clip region should be merged with the existing clip region.
  *
  * Used by [Canvas.clipRect].
  */
@@ -35,9 +34,10 @@
         val Intersect = ClipOp(1)
     }
 
-    override fun toString() = when (this) {
-        Difference -> "Difference"
-        Intersect -> "Intersect"
-        else -> "Unknown"
-    }
+    override fun toString() =
+        when (this) {
+            Difference -> "Difference"
+            Intersect -> "Intersect"
+            else -> "Unknown"
+        }
 }
diff --git a/compose/ui/ui-graphics/src/commonMain/kotlin/androidx/compose/ui/graphics/Color.kt b/compose/ui/ui-graphics/src/commonMain/kotlin/androidx/compose/ui/graphics/Color.kt
index 9a77328..c4a0356 100644
--- a/compose/ui/ui-graphics/src/commonMain/kotlin/androidx/compose/ui/graphics/Color.kt
+++ b/compose/ui/ui-graphics/src/commonMain/kotlin/androidx/compose/ui/graphics/Color.kt
@@ -33,9 +33,8 @@
 import kotlin.math.min
 
 /**
- * The `Color` class contains color information to be used while painting
- * in [Canvas]. `Color` supports [ColorSpace]s with 3 [components][ColorSpace.componentCount],
- * plus one for [alpha].
+ * The `Color` class contains color information to be used while painting in [Canvas]. `Color`
+ * supports [ColorSpace]s with 3 [components][ColorSpace.componentCount], plus one for [alpha].
  *
  * ### Creating
  *
@@ -44,36 +43,32 @@
  *     // from 4 separate [Float] components. Alpha and ColorSpace are optional
  *     val rgbaWhiteFloat = Color(red = 1f, green = 1f, blue = 1f, alpha = 1f,
  *         ColorSpace.get(ColorSpaces.Srgb))
- *
  *     // from a 32-bit SRGB color integer
  *     val fromIntWhite = Color(android.graphics.Color.WHITE)
  *     val fromLongBlue = Color(0xFF0000FF)
- *
  *     // from SRGB integer component values. Alpha is optional
  *     val rgbaWhiteInt = Color(red = 0xFF, green = 0xFF, blue = 0xFF, alpha = 0xFF)
  *
  * ### Representation
  *
- * A `Color` always defines a color using 4 components packed in a single
- * 64 bit long value. One of these components is always alpha while the other
- * three components depend on the color space's [color model][ColorModel].
- * The most common color model is the [RGB][ColorModel.Rgb] model in
+ * A `Color` always defines a color using 4 components packed in a single 64 bit long value. One of
+ * these components is always alpha while the other three components depend on the color space's
+ * [color model][ColorModel]. The most common color model is the [RGB][ColorModel.Rgb] model in
  * which the components represent red, green, and blue values.
  *
- * **Component ranges:** the ranges defined in the tables
- * below indicate the ranges that can be encoded in a color long. They do not
- * represent the actual ranges as they may differ per color space. For instance,
- * the RGB components of a color in the [Display P3][ColorSpaces.DisplayP3]
- * color space use the `[0..1]` range. Please refer to the documentation of the
- * various [color spaces][ColorSpaces] to find their respective ranges.
+ * **Component ranges:** the ranges defined in the tables below indicate the ranges that can be
+ * encoded in a color long. They do not represent the actual ranges as they may differ per color
+ * space. For instance, the RGB components of a color in the [Display P3][ColorSpaces.DisplayP3]
+ * color space use the `[0..1]` range. Please refer to the documentation of the various
+ * [color spaces][ColorSpaces] to find their respective ranges.
  *
- * **Alpha range:** while alpha is encoded in a color long using
- * a 10 bit integer (thus using a range of `[0..1023]`), it is converted to and
- * from `[0..1]` float values when decoding and encoding color longs.
+ * **Alpha range:** while alpha is encoded in a color long using a 10 bit integer (thus using a
+ * range of `[0..1023]`), it is converted to and from `[0..1]` float values when decoding and
+ * encoding color longs.
  *
- * **sRGB color space:** for compatibility reasons and ease of
- * use, `Color` encoded [sRGB][ColorSpaces.Srgb] colors do not
- * use the same encoding as other color longs.
+ * **sRGB color space:** for compatibility reasons and ease of use, `Color` encoded
+ * [sRGB][ColorSpaces.Srgb] colors do not use the same encoding as other color longs.
+ *
  * ```
  * | Component | Name        | Size    | Range                 |
  * |-----------|-------------|---------|-----------------------|
@@ -102,18 +97,18 @@
  * | A         | Alpha       | 10 bits | `[0..1023]`           |
  * |           | Color space | 6 bits  | `[0..63]`             |
  * ```
- * The components in this table are listed in encoding order,
- * which is why color longs in the RGB model are called RGBA colors (even if
- * this doesn't quite hold for the special case of sRGB colors).
  *
- * The color encoding relies on half-precision float values (fp16). If you
- * wish to know more about the limitations of half-precision float values, please
- * refer to the documentation of the [Float16] class.
+ * The components in this table are listed in encoding order, which is why color longs in the RGB
+ * model are called RGBA colors (even if this doesn't quite hold for the special case of sRGB
+ * colors).
  *
- * The values returned by these methods depend on the color space encoded
- * in the color long. The values are however typically in the `[0..1]` range
- * for RGB colors. Please refer to the documentation of the various
- * [color spaces][ColorSpaces] for the exact ranges.
+ * The color encoding relies on half-precision float values (fp16). If you wish to know more about
+ * the limitations of half-precision float values, please refer to the documentation of the
+ * [Float16] class.
+ *
+ * The values returned by these methods depend on the color space encoded in the color long. The
+ * values are however typically in the `[0..1]` range for RGB colors. Please refer to the
+ * documentation of the various [color spaces][ColorSpaces] for the exact ranges.
  */
 @Immutable
 @kotlin.jvm.JvmInline
@@ -128,12 +123,10 @@
         get() = ColorSpaces.getColorSpace((value and 0x3fUL).toInt())
 
     /**
-     * Converts this color from its color space to the specified color space.
-     * The conversion is done using the default rendering intent as specified
-     * by [ColorSpace.connect].
+     * Converts this color from its color space to the specified color space. The conversion is done
+     * using the default rendering intent as specified by [ColorSpace.connect].
      *
      * @param colorSpace The destination color space, cannot be null
-     *
      * @return A non-null color instance in the specified color space
      */
     fun convert(colorSpace: ColorSpace): Color {
@@ -144,12 +137,11 @@
     }
 
     /**
-     * Returns the value of the red component in the range defined by this
-     * color's color space (see [ColorSpace.getMinValue] and
-     * [ColorSpace.getMaxValue]).
+     * Returns the value of the red component in the range defined by this color's color space (see
+     * [ColorSpace.getMinValue] and [ColorSpace.getMaxValue]).
      *
-     * If this color's color model is not [RGB][ColorModel.Rgb],
-     * calling this is the first component of the ColorSpace.
+     * If this color's color model is not [RGB][ColorModel.Rgb], calling this is the first component
+     * of the ColorSpace.
      *
      * @see alpha
      * @see blue
@@ -166,12 +158,11 @@
         }
 
     /**
-     * Returns the value of the green component in the range defined by this
-     * color's color space (see [ColorSpace.getMinValue] and
-     * [ColorSpace.getMaxValue]).
+     * Returns the value of the green component in the range defined by this color's color space
+     * (see [ColorSpace.getMinValue] and [ColorSpace.getMaxValue]).
      *
-     * If this color's color model is not [RGB][ColorModel.Rgb],
-     * calling this is the second component of the ColorSpace.
+     * If this color's color model is not [RGB][ColorModel.Rgb], calling this is the second
+     * component of the ColorSpace.
      *
      * @see alpha
      * @see red
@@ -188,12 +179,11 @@
         }
 
     /**
-     * Returns the value of the blue component in the range defined by this
-     * color's color space (see [ColorSpace.getMinValue] and
-     * [ColorSpace.getMaxValue]).
+     * Returns the value of the blue component in the range defined by this color's color space (see
+     * [ColorSpace.getMinValue] and [ColorSpace.getMaxValue]).
      *
-     * If this color's color model is not [RGB][ColorModel.Rgb],
-     * calling this is the third component of the ColorSpace.
+     * If this color's color model is not [RGB][ColorModel.Rgb], calling this is the third component
+     * of the ColorSpace.
      *
      * @see alpha
      * @see red
@@ -226,29 +216,19 @@
             }
         }
 
-    @Suppress("NOTHING_TO_INLINE")
-    @Stable
-    inline operator fun component1(): Float = red
+    @Suppress("NOTHING_TO_INLINE") @Stable inline operator fun component1(): Float = red
 
-    @Suppress("NOTHING_TO_INLINE")
-    @Stable
-    inline operator fun component2(): Float = green
+    @Suppress("NOTHING_TO_INLINE") @Stable inline operator fun component2(): Float = green
 
-    @Suppress("NOTHING_TO_INLINE")
-    @Stable
-    inline operator fun component3(): Float = blue
+    @Suppress("NOTHING_TO_INLINE") @Stable inline operator fun component3(): Float = blue
 
-    @Suppress("NOTHING_TO_INLINE")
-    @Stable
-    inline operator fun component4(): Float = alpha
+    @Suppress("NOTHING_TO_INLINE") @Stable inline operator fun component4(): Float = alpha
 
-    @Suppress("NOTHING_TO_INLINE")
-    @Stable
-    inline operator fun component5(): ColorSpace = colorSpace
+    @Suppress("NOTHING_TO_INLINE") @Stable inline operator fun component5(): ColorSpace = colorSpace
 
     /**
-     * Copies the existing color, changing only the provided values. The [ColorSpace][colorSpace]
-     * of the returned [Color] is the same as this [colorSpace].
+     * Copies the existing color, changing only the provided values. The [ColorSpace][colorSpace] of
+     * the returned [Color] is the same as this [colorSpace].
      */
     @Stable
     fun copy(
@@ -256,22 +236,17 @@
         red: Float = this.red,
         green: Float = this.green,
         blue: Float = this.blue
-    ): Color = Color(
-        red = red,
-        green = green,
-        blue = blue,
-        alpha = alpha,
-        colorSpace = this.colorSpace
-    )
+    ): Color =
+        Color(red = red, green = green, blue = blue, alpha = alpha, colorSpace = this.colorSpace)
 
     /**
-     * Returns a string representation of the object. This method returns
-     * a string equal to the value of:
+     * Returns a string representation of the object. This method returns a string equal to the
+     * value of:
      *
      *     "Color($r, $g, $b, $a, ${colorSpace.name})"
      *
-     * For instance, the string representation of opaque black in the sRGB
-     * color space is equal to the following value:
+     * For instance, the string representation of opaque black in the sRGB color space is equal to
+     * the following value:
      *
      *     Color(0.0, 0.0, 0.0, 1.0, sRGB IEC61966-2.1)
      *
@@ -282,59 +257,45 @@
     }
 
     companion object {
-        @Stable
-        val Black = Color(0xFF000000)
+        @Stable val Black = Color(0xFF000000)
 
-        @Stable
-        val DarkGray = Color(0xFF444444)
+        @Stable val DarkGray = Color(0xFF444444)
 
-        @Stable
-        val Gray = Color(0xFF888888)
+        @Stable val Gray = Color(0xFF888888)
 
-        @Stable
-        val LightGray = Color(0xFFCCCCCC)
+        @Stable val LightGray = Color(0xFFCCCCCC)
 
-        @Stable
-        val White = Color(0xFFFFFFFF)
+        @Stable val White = Color(0xFFFFFFFF)
 
-        @Stable
-        val Red = Color(0xFFFF0000)
+        @Stable val Red = Color(0xFFFF0000)
 
-        @Stable
-        val Green = Color(0xFF00FF00)
+        @Stable val Green = Color(0xFF00FF00)
 
-        @Stable
-        val Blue = Color(0xFF0000FF)
+        @Stable val Blue = Color(0xFF0000FF)
 
-        @Stable
-        val Yellow = Color(0xFFFFFF00)
+        @Stable val Yellow = Color(0xFFFFFF00)
 
-        @Stable
-        val Cyan = Color(0xFF00FFFF)
+        @Stable val Cyan = Color(0xFF00FFFF)
 
-        @Stable
-        val Magenta = Color(0xFFFF00FF)
+        @Stable val Magenta = Color(0xFFFF00FF)
 
-        @Stable
-        val Transparent = Color(0x00000000)
+        @Stable val Transparent = Color(0x00000000)
 
         /**
-         * Because Color is an inline class, this represents an unset value
-         * without having to box the Color. It will be treated as [Transparent]
-         * when drawn. A Color can compare with [Unspecified] for equality or use
-         * [isUnspecified] to check for the unset value or [isSpecified] for any color that isn't
-         * [Unspecified].
+         * Because Color is an inline class, this represents an unset value without having to box
+         * the Color. It will be treated as [Transparent] when drawn. A Color can compare with
+         * [Unspecified] for equality or use [isUnspecified] to check for the unset value or
+         * [isSpecified] for any color that isn't [Unspecified].
          */
-        @Stable
-        val Unspecified = Color(0f, 0f, 0f, 0f, ColorSpaces.Unspecified)
+        @Stable val Unspecified = Color(0f, 0f, 0f, 0f, ColorSpaces.Unspecified)
 
         /**
          * Return a [Color] from [hue], [saturation], and [value] (HSV representation).
          *
-         * @param hue The color value in the range (0..360), where 0 is red, 120 is green, and
-         * 240 is blue
-         * @param saturation The amount of [hue] represented in the color in the range (0..1),
-         * where 0 has no color and 1 is fully saturated.
+         * @param hue The color value in the range (0..360), where 0 is red, 120 is green, and 240
+         *   is blue
+         * @param saturation The amount of [hue] represented in the color in the range (0..1), where
+         *   0 has no color and 1 is fully saturated.
          * @param alpha Alpha channel to apply to the computed color
          * @param value The strength of the color, where 0 is black.
          * @param colorSpace The RGB color space used to calculate the Color from the HSV values.
@@ -346,9 +307,7 @@
             alpha: Float = 1f,
             colorSpace: Rgb = ColorSpaces.Srgb
         ): Color {
-            requirePrecondition(
-                hue in 0f..360f && saturation in 0f..1f && value in 0f..1f
-            ) {
+            requirePrecondition(hue in 0f..360f && saturation in 0f..1f && value in 0f..1f) {
                 "HSV ($hue, $saturation, $value) must be in range (0..360, 0..1, 0..1)"
             }
             val red = hsvToRgbComponent(5, hue, saturation, value)
@@ -365,12 +324,12 @@
         /**
          * Return a [Color] from [hue], [saturation], and [lightness] (HSL representation).
          *
-         * @param hue The color value in the range (0..360), where 0 is red, 120 is green, and
-         * 240 is blue
-         * @param saturation The amount of [hue] represented in the color in the range (0..1),
-         * where 0 has no color and 1 is fully saturated.
+         * @param hue The color value in the range (0..360), where 0 is red, 120 is green, and 240
+         *   is blue
+         * @param saturation The amount of [hue] represented in the color in the range (0..1), where
+         *   0 has no color and 1 is fully saturated.
          * @param lightness A range of (0..1) where 0 is black, 0.5 is fully colored, and 1 is
-         * white.
+         *   white.
          * @param alpha Alpha channel to apply to the computed color
          * @param colorSpace The RGB color space used to calculate the Color from the HSL values.
          */
@@ -381,9 +340,7 @@
             alpha: Float = 1f,
             colorSpace: Rgb = ColorSpaces.Srgb
         ): Color {
-            requirePrecondition(
-                hue in 0f..360f && saturation in 0f..1f && lightness in 0f..1f
-            ) {
+            requirePrecondition(hue in 0f..360f && saturation in 0f..1f && lightness in 0f..1f) {
                 "HSL ($hue, $saturation, $lightness) must be in range (0..360, 0..1, 0..1)"
             }
             val red = hslToRgbComponent(0, hue, saturation, lightness)
@@ -401,23 +358,21 @@
 }
 
 // Same as Color.Unspecified.packedValue, but avoids a getstatic
-@PublishedApi
-internal const val UnspecifiedColor = 0x10UL
+@PublishedApi internal const val UnspecifiedColor = 0x10UL
 
 /**
- * Create a [Color] by passing individual [red], [green], [blue], [alpha],
- * and [colorSpace] components. The default [color space][ColorSpace]
- * is [sRGB][ColorSpaces.Srgb] and the default [alpha] is `1.0`
- * (opaque).
+ * Create a [Color] by passing individual [red], [green], [blue], [alpha], and [colorSpace]
+ * components. The default [color space][ColorSpace] is [sRGB][ColorSpaces.Srgb] and the default
+ * [alpha] is `1.0` (opaque).
  *
- * If the [red], [green], or [blue] values are outside of the range defined
- * by [colorSpace] (see [ColorSpace.getMinValue] and [ColorSpace.getMaxValue],
- * these values get clamped appropriately to be within range.
+ * If the [red], [green], or [blue] values are outside of the range defined by [colorSpace] (see
+ * [ColorSpace.getMinValue] and [ColorSpace.getMaxValue], these values get clamped appropriately to
+ * be within range.
  *
- * @throws IllegalArgumentException If [colorSpace] does not have
- * [ColorSpace.componentCount] equal to 3.
- * @throws IllegalArgumentException If [colorSpace] has an [ColorSpace.id]
- * set to [ColorSpace.MinId].
+ * @throws IllegalArgumentException If [colorSpace] does not have [ColorSpace.componentCount] equal
+ *   to 3.
+ * @throws IllegalArgumentException If [colorSpace] has an [ColorSpace.id] set to
+ *   [ColorSpace.MinId].
  */
 @Stable
 fun Color(
@@ -428,12 +383,11 @@
     colorSpace: ColorSpace = ColorSpaces.Srgb
 ): Color {
     if (colorSpace.isSrgb) {
-        val argb = (
-            ((alpha.fastCoerceIn(0.0f, 1.0f) * 255.0f + 0.5f).toInt() shl 24) or
-            ((red.fastCoerceIn(0.0f, 1.0f) * 255.0f + 0.5f).toInt() shl 16) or
-            ((green.fastCoerceIn(0.0f, 1.0f) * 255.0f + 0.5f).toInt() shl 8) or
-            (blue.fastCoerceIn(0.0f, 1.0f) * 255.0f + 0.5f).toInt()
-        )
+        val argb =
+            (((alpha.fastCoerceIn(0.0f, 1.0f) * 255.0f + 0.5f).toInt() shl 24) or
+                ((red.fastCoerceIn(0.0f, 1.0f) * 255.0f + 0.5f).toInt() shl 16) or
+                ((green.fastCoerceIn(0.0f, 1.0f) * 255.0f + 0.5f).toInt() shl 8) or
+                (blue.fastCoerceIn(0.0f, 1.0f) * 255.0f + 0.5f).toInt())
         return Color(argb.toULong() shl 32)
     }
 
@@ -452,21 +406,20 @@
     val a = (alpha.fastCoerceIn(0.0f, 1.0f) * 1023.0f + 0.5f).toInt()
 
     return Color(
-        (
-            ((r.toLong() and 0xffffL) shl 48) or
-            ((g.toLong() and 0xffffL) shl 32) or
-            ((b.toLong() and 0xffffL) shl 16) or
-            ((a.toLong() and 0x03ffL) shl 6) or
-            (id.toLong() and 0x003fL)
-        ).toULong()
+        (((r.toLong() and 0xffffL) shl 48) or
+                ((g.toLong() and 0xffffL) shl 32) or
+                ((b.toLong() and 0xffffL) shl 16) or
+                ((a.toLong() and 0x03ffL) shl 6) or
+                (id.toLong() and 0x003fL))
+            .toULong()
     )
 }
 
 /**
  * Create a [Color] by passing individual [red], [green], [blue], [alpha], and [colorSpace]
- * components. This function is equivalent to [Color] but doesn't perform any check/validation
- * of the parameters. It is meant to be used when the color space and values are known to
- * be valid by construction, for instance when lerping colors.
+ * components. This function is equivalent to [Color] but doesn't perform any check/validation of
+ * the parameters. It is meant to be used when the color space and values are known to be valid by
+ * construction, for instance when lerping colors.
  */
 @Stable
 internal fun UncheckedColor(
@@ -477,12 +430,11 @@
     colorSpace: ColorSpace = ColorSpaces.Srgb
 ): Color {
     if (colorSpace.isSrgb) {
-        val argb = (
-            ((alpha * 255.0f + 0.5f).toInt() shl 24) or
-            ((red * 255.0f + 0.5f).toInt() shl 16) or
-            ((green * 255.0f + 0.5f).toInt() shl 8) or
-            (blue * 255.0f + 0.5f).toInt()
-        )
+        val argb =
+            (((alpha * 255.0f + 0.5f).toInt() shl 24) or
+                ((red * 255.0f + 0.5f).toInt() shl 16) or
+                ((green * 255.0f + 0.5f).toInt() shl 8) or
+                (blue * 255.0f + 0.5f).toInt())
         return Color(argb.toULong() shl 32)
     }
 
@@ -495,20 +447,18 @@
     val id = colorSpace.id
 
     return Color(
-        (
-            ((r.toLong() and 0xffffL) shl 48) or
-            ((g.toLong() and 0xffffL) shl 32) or
-            ((b.toLong() and 0xffffL) shl 16) or
-            ((a.toLong() and 0x03ffL) shl 6) or
-            (id.toLong() and 0x003fL)
-        ).toULong()
+        (((r.toLong() and 0xffffL) shl 48) or
+                ((g.toLong() and 0xffffL) shl 32) or
+                ((b.toLong() and 0xffffL) shl 16) or
+                ((a.toLong() and 0x03ffL) shl 6) or
+                (id.toLong() and 0x003fL))
+            .toULong()
     )
 }
 
 /**
- * Creates a new [Color] instance from an ARGB color int.
- * The resulting color is in the [sRGB][ColorSpaces.Srgb]
- * color space.
+ * Creates a new [Color] instance from an ARGB color int. The resulting color is in the
+ * [sRGB][ColorSpaces.Srgb] color space.
  *
  * @param color The ARGB color int to create a <code>Color</code> from.
  * @return A non-null instance of {@link Color}
@@ -519,15 +469,13 @@
 }
 
 /**
- * Creates a new [Color] instance from an ARGB color int.
- * The resulting color is in the [sRGB][ColorSpaces.Srgb]
- * color space. This is useful for specifying colors with alpha
- * greater than 0x80 in numeric form without using [Long.toInt]:
+ * Creates a new [Color] instance from an ARGB color int. The resulting color is in the
+ * [sRGB][ColorSpaces.Srgb] color space. This is useful for specifying colors with alpha greater
+ * than 0x80 in numeric form without using [Long.toInt]:
  *
  *     val color = Color(0xFF000080)
  *
- * @param color The 32-bit ARGB color int to create a <code>Color</code>
- * from
+ * @param color The 32-bit ARGB color int to create a <code>Color</code> from
  * @return A non-null instance of {@link Color}
  */
 @Stable
@@ -536,15 +484,13 @@
 }
 
 /**
- * Creates a new [Color] instance from an ARGB color components.
- * The resulting color is in the [sRGB][ColorSpaces.Srgb]
- * color space. The default alpha value is `0xFF` (opaque).
+ * Creates a new [Color] instance from an ARGB color components. The resulting color is in the
+ * [sRGB][ColorSpaces.Srgb] color space. The default alpha value is `0xFF` (opaque).
  *
  * @param red The red component of the color, between 0 and 255.
  * @param green The green component of the color, between 0 and 255.
  * @param blue The blue component of the color, between 0 and 255.
  * @param alpha The alpha component of the color, between 0 and 255.
- *
  * @return A non-null instance of {@link Color}
  */
 @Stable
@@ -556,17 +502,17 @@
 ): Color {
     val color =
         ((alpha and 0xFF) shl 24) or
-        ((red and 0xFF) shl 16) or
-        ((green and 0xFF) shl 8) or
-        (blue and 0xFF)
+            ((red and 0xFF) shl 16) or
+            ((green and 0xFF) shl 8) or
+            (blue and 0xFF)
     return Color(color)
 }
 
 /**
  * Linear interpolate between two [Colors][Color], [start] and [stop] with [fraction] fraction
- * between the two. The [ColorSpace] of the result is always the [ColorSpace][Color.colorSpace]
- * of [stop]. [fraction] should be between 0 and 1, inclusive. Interpolation is done
- * in the [ColorSpaces.Oklab] color space.
+ * between the two. The [ColorSpace] of the result is always the [ColorSpace][Color.colorSpace] of
+ * [stop]. [fraction] should be between 0 and 1, inclusive. Interpolation is done in the
+ * [ColorSpaces.Oklab] color space.
  */
 @Stable
 fun lerp(start: Color, stop: Color, @FloatRange(from = 0.0, to = 1.0) fraction: Float): Color {
@@ -589,26 +535,27 @@
     // Lab/alpha values to be outside of the valid color range.
     // Clamping the fraction is cheaper than clamping all 4 components separately.
     val t = fraction.fastCoerceIn(0.0f, 1.0f)
-    val interpolated = UncheckedColor(
-        lerp(startL, endL, t),
-        lerp(startA, endA, t),
-        lerp(startB, endB, t),
-        lerp(startAlpha, endAlpha, t),
-        colorSpace
-    )
+    val interpolated =
+        UncheckedColor(
+            lerp(startL, endL, t),
+            lerp(startA, endA, t),
+            lerp(startB, endB, t),
+            lerp(startAlpha, endAlpha, t),
+            colorSpace
+        )
     return interpolated.convert(stop.colorSpace)
 }
 
 /**
  * Composites [this] color on top of [background] using the Porter-Duff 'source over' mode.
  *
- * Both [this] and [background] must not be pre-multiplied, and the resulting color will also
- * not be pre-multiplied.
+ * Both [this] and [background] must not be pre-multiplied, and the resulting color will also not be
+ * pre-multiplied.
  *
  * The [ColorSpace] of the result is always the [ColorSpace][Color.colorSpace] of [background].
  *
- * @return the [Color] representing [this] composited on top of [background], converted to the
- * color space of [background].
+ * @return the [Color] representing [this] composited on top of [background], converted to the color
+ *   space of [background].
  */
 @Stable
 fun Color.compositeOver(background: Color): Color {
@@ -632,17 +579,12 @@
  * This uses a pre-calculated composite destination alpha of [a] for efficiency.
  */
 @Suppress("NOTHING_TO_INLINE")
-private inline fun compositeComponent(
-    fgC: Float,
-    bgC: Float,
-    fgA: Float,
-    bgA: Float,
-    a: Float
-) = if (a == 0f) 0f else ((fgC * fgA) + ((bgC * bgA) * (1f - fgA))) / a
+private inline fun compositeComponent(fgC: Float, bgC: Float, fgA: Float, bgA: Float, a: Float) =
+    if (a == 0f) 0f else ((fgC * fgA) + ((bgC * bgA) * (1f - fgA))) / a
 
 /**
- * Returns this color's components as a new array. The last element of the
- * array is always the alpha component.
+ * Returns this color's components as a new array. The last element of the array is always the alpha
+ * component.
  *
  * @return A new, non-null array whose size is 4
  */
@@ -652,13 +594,12 @@
 /**
  * Returns the relative luminance of this color.
  *
- * Based on the formula for relative luminance defined in WCAG 2.0,
- * W3C Recommendation 11 December 2008.
+ * Based on the formula for relative luminance defined in WCAG 2.0, W3C Recommendation 11
+ * December 2008.
  *
  * @return A value between 0 (darkest black) and 1 (lightest white)
- *
- * @throws IllegalArgumentException If the this color's color space
- * does not use the [RGB][ColorModel.Rgb] color model
+ * @throws IllegalArgumentException If the this color's color space does not use the
+ *   [RGB][ColorModel.Rgb] color model
  */
 @Stable
 fun Color.luminance(): Float {
@@ -677,9 +618,8 @@
 }
 
 /**
- * Converts this color to an ARGB color int. A color int is always in
- * the [sRGB][ColorSpaces.Srgb] color space. This implies
- * a color space conversion is applied if needed.
+ * Converts this color to an ARGB color int. A color int is always in the [sRGB][ColorSpaces.Srgb]
+ * color space. This implies a color space conversion is applied if needed.
  *
  * @return An ARGB color in the sRGB color space
  */
@@ -689,17 +629,15 @@
     return (convert(ColorSpaces.Srgb).value shr 32).toInt()
 }
 
-/**
- * `false` when this is [Color.Unspecified].
- */
+/** `false` when this is [Color.Unspecified]. */
 @Stable
-inline val Color.isSpecified: Boolean get() = value != UnspecifiedColor
+inline val Color.isSpecified: Boolean
+    get() = value != UnspecifiedColor
 
-/**
- * `true` when this is [Color.Unspecified].
- */
+/** `true` when this is [Color.Unspecified]. */
 @Stable
-inline val Color.isUnspecified: Boolean get() = value == UnspecifiedColor
+inline val Color.isUnspecified: Boolean
+    get() = value == UnspecifiedColor
 
 /**
  * If this color [isSpecified] then this is returned, otherwise [block] is executed and its result
@@ -715,8 +653,6 @@
  * fun nonBoxedArgs(color: ColorProducer?)
  */
 fun interface ColorProducer {
-    /**
-     * Return the color
-     */
+    /** Return the color */
     operator fun invoke(): Color
 }
diff --git a/compose/ui/ui-graphics/src/commonMain/kotlin/androidx/compose/ui/graphics/ColorFilter.kt b/compose/ui/ui-graphics/src/commonMain/kotlin/androidx/compose/ui/graphics/ColorFilter.kt
index 95b3b55..e8c1632 100644
--- a/compose/ui/ui-graphics/src/commonMain/kotlin/androidx/compose/ui/graphics/ColorFilter.kt
+++ b/compose/ui/ui-graphics/src/commonMain/kotlin/androidx/compose/ui/graphics/ColorFilter.kt
@@ -22,21 +22,19 @@
 // TODO mark internal once https://youtrack.jetbrains.com/issue/KT-36695 is fixed
 /* internal */ expect class NativeColorFilter
 
-/**
- * Effect used to modify the color of each pixel drawn on a [Paint] that it is installed on
- */
+/** Effect used to modify the color of each pixel drawn on a [Paint] that it is installed on */
 @Immutable
 open class ColorFilter internal constructor(internal val nativeColorFilter: NativeColorFilter) {
 
     companion object {
         /**
-         * Creates a color filter that applies the blend mode given as the second
-         * argument. The source color is the one given as the first argument, and the
-         * destination color is the one from the layer being composited.
+         * Creates a color filter that applies the blend mode given as the second argument. The
+         * source color is the one given as the first argument, and the destination color is the one
+         * from the layer being composited.
          *
-         * The output of this filter is then composited into the background according
-         * to the [Paint.blendMode], using the output of this filter as the source
-         * and the background as the destination.
+         * The output of this filter is then composited into the background according to the
+         * [Paint.blendMode], using the output of this filter as the source and the background as
+         * the destination.
          *
          * @param color Color used to blend source content
          * @param blendMode BlendMode used when compositing the tint color to the destination
@@ -52,37 +50,36 @@
          * @param colorMatrix ColorMatrix used to transform pixel values when drawn
          */
         @Stable
-        fun colorMatrix(colorMatrix: ColorMatrix): ColorFilter =
-            ColorMatrixColorFilter(colorMatrix)
+        fun colorMatrix(colorMatrix: ColorMatrix): ColorFilter = ColorMatrixColorFilter(colorMatrix)
 
         /**
-         * Create a [ColorFilter] that can be used to simulate simple lighting effects.
-         * A lighting ColorFilter is defined by two parameters, one used to multiply the source
-         * color and one used to add to the source color
+         * Create a [ColorFilter] that can be used to simulate simple lighting effects. A lighting
+         * ColorFilter is defined by two parameters, one used to multiply the source color and one
+         * used to add to the source color
          *
          * @param multiply Color used to multiply the source color when the color filter is applied.
          * @param add Color that will be added to the source color when the color filter is applied.
          */
         @Stable
-        fun lighting(multiply: Color, add: Color): ColorFilter =
-            LightingColorFilter(multiply, add)
+        fun lighting(multiply: Color, add: Color): ColorFilter = LightingColorFilter(multiply, add)
     }
 }
 
 /**
- * Creates a color filter that applies the blend mode given as the second
- * argument. The source color is the one given as the first argument, and the
- * destination color is the one from the layer being composited.
+ * Creates a color filter that applies the blend mode given as the second argument. The source color
+ * is the one given as the first argument, and the destination color is the one from the layer being
+ * composited.
  *
- * The output of this filter is then composited into the background according
- * to the [Paint.blendMode], using the output of this filter as the source
- * and the background as the destination.
+ * The output of this filter is then composited into the background according to the
+ * [Paint.blendMode], using the output of this filter as the source and the background as the
+ * destination.
  *
  * @param color Color used to blend source content
  * @param blendMode BlendMode used when compositing the tint color to the destination
  */
 @Immutable
-class BlendModeColorFilter internal constructor(
+class BlendModeColorFilter
+internal constructor(
     val color: Color,
     val blendMode: BlendMode,
     nativeColorFilter: NativeColorFilter
@@ -115,24 +112,22 @@
 }
 
 /**
- * Create a [ColorFilter] that transforms colors through a 4x5 color matrix. This filter can
- * be used to change the saturation of pixels, convert from YUV to RGB, etc.
+ * Create a [ColorFilter] that transforms colors through a 4x5 color matrix. This filter can be used
+ * to change the saturation of pixels, convert from YUV to RGB, etc.
  */
 @Immutable
-class ColorMatrixColorFilter internal constructor(
-    private var colorMatrix: ColorMatrix?,
-    nativeColorFilter: NativeColorFilter
-) : ColorFilter(nativeColorFilter) {
+class ColorMatrixColorFilter
+internal constructor(private var colorMatrix: ColorMatrix?, nativeColorFilter: NativeColorFilter) :
+    ColorFilter(nativeColorFilter) {
 
     constructor(
         colorMatrix: ColorMatrix
     ) : this(colorMatrix, actualColorMatrixColorFilter(colorMatrix))
 
     /**
-     * Copy the internal [ColorMatrix] into the provided [ColorMatrix] instance. By default
-     * this creates a new [ColorMatrix] instance, however, consumers are encouraged to create
-     * and re-use instances of [ColorMatrix]. This method returns the copied result for
-     * convenience
+     * Copy the internal [ColorMatrix] into the provided [ColorMatrix] instance. By default this
+     * creates a new [ColorMatrix] instance, however, consumers are encouraged to create and re-use
+     * instances of [ColorMatrix]. This method returns the copied result for convenience
      *
      * @param targetColorMatrix Optional [ColorMatrix] to copy contents into
      * @return the copied [ColorMatrix] instance
@@ -158,9 +153,7 @@
         // In the event that this ColorMatrixFilter was instantiated from a conversion
         // from the NativeColorFilter, lazily query the ColorMatrix here to avoid doing
         // a copy of ColorMatrix instances until this method is invoked
-        colorMatrix ?: actualColorMatrixFromFilter(nativeColorFilter).also {
-            colorMatrix = it
-        }
+        colorMatrix ?: actualColorMatrixFromFilter(nativeColorFilter).also { colorMatrix = it }
 
     override fun hashCode(): Int {
         return colorMatrix?.hashCode() ?: 0
@@ -172,19 +165,17 @@
 }
 
 /**
- * Create a [ColorFilter] that can be used to simulate simple lighting effects.
- * A lighting ColorFilter is defined by two parameters, one used to multiply the source
- * color and one used to add to the source color
+ * Create a [ColorFilter] that can be used to simulate simple lighting effects. A lighting
+ * ColorFilter is defined by two parameters, one used to multiply the source color and one used to
+ * add to the source color
  *
  * @param multiply Color used to multiply the source color when the color filter is applied.
  * @param add Color that will be added to the source color when the color filter is applied.
  */
 @Immutable
-class LightingColorFilter internal constructor(
-    val multiply: Color,
-    val add: Color,
-    nativeColorFilter: NativeColorFilter
-) : ColorFilter(nativeColorFilter) {
+class LightingColorFilter
+internal constructor(val multiply: Color, val add: Color, nativeColorFilter: NativeColorFilter) :
+    ColorFilter(nativeColorFilter) {
 
     constructor(
         multiply: Color,
diff --git a/compose/ui/ui-graphics/src/commonMain/kotlin/androidx/compose/ui/graphics/ColorMatrix.kt b/compose/ui/ui-graphics/src/commonMain/kotlin/androidx/compose/ui/graphics/ColorMatrix.kt
index 70223b4..8681589 100644
--- a/compose/ui/ui-graphics/src/commonMain/kotlin/androidx/compose/ui/graphics/ColorMatrix.kt
+++ b/compose/ui/ui-graphics/src/commonMain/kotlin/androidx/compose/ui/graphics/ColorMatrix.kt
@@ -22,9 +22,8 @@
 import kotlin.math.sin
 
 /**
- * 4x5 matrix for transforming the color and alpha components of a source.
- * The matrix can be passed as single array, and is treated as follows:
- *
+ * 4x5 matrix for transforming the color and alpha components of a source. The matrix can be passed
+ * as single array, and is treated as follows:
  * ```
  *  [ a, b, c, d, e,
  *    f, g, h, i, j,
@@ -32,9 +31,7 @@
  *    p, q, r, s, t ]
  * ```
  *
- * When applied to a color <code>[[R, G, B, A]]</code>, the resulting color
- * is computed as:
- *
+ * When applied to a color <code>[[R, G, B, A]]</code>, the resulting color is computed as:
  * ```
  *   R' = a*R + b*G + c*B + d*A + e;
  *   G' = f*R + g*G + h*B + i*A + j;
@@ -42,13 +39,12 @@
  *   A' = p*R + q*G + r*B + s*A + t;</pre>
  *
  * ```
- * That resulting color <code>[[R', G', B', A']]</code>
- * then has each channel clamped to the <code>0</code> to <code>255</code>
- * range.
  *
- * The sample ColorMatrix below inverts incoming colors by scaling each
- * channel by <code>-1</code>, and then shifting the result up by
- * `255` to remain in the standard color space.
+ * That resulting color <code>[[R', G', B', A']]</code> then has each channel clamped to the
+ * <code>0</code> to <code>255</code> range.
+ *
+ * The sample ColorMatrix below inverts incoming colors by scaling each channel by <code>-1</code>,
+ * and then shifting the result up by `255` to remain in the standard color space.
  *
  * ```
  *   [ -1, 0, 0, 0, 255,
@@ -57,41 +53,37 @@
  *     0, 0, 0, 1, 0 ]
  * ```
  *
- * This is often used as input for [ColorFilter.colorMatrix] and applied at draw time
- * through [Paint.colorFilter]
+ * This is often used as input for [ColorFilter.colorMatrix] and applied at draw time through
+ * [Paint.colorFilter]
  */
 @kotlin.jvm.JvmInline
 value class ColorMatrix(
-    val values: FloatArray = floatArrayOf(
-        1f, 0f, 0f, 0f, 0f,
-        0f, 1f, 0f, 0f, 0f,
-        0f, 0f, 1f, 0f, 0f,
-        0f, 0f, 0f, 1f, 0f
-    )
+    val values: FloatArray =
+        floatArrayOf(1f, 0f, 0f, 0f, 0f, 0f, 1f, 0f, 0f, 0f, 0f, 0f, 1f, 0f, 0f, 0f, 0f, 0f, 1f, 0f)
 ) {
 
     /**
-     * Obtain an instance of the matrix value at the given [row] and [column].
-     * [ColorMatrix] follows row major order in regards to the
-     * positions of matrix values within the flattened array. That is, content order goes
-     * from left to right then top to bottom as opposed to column major order.
+     * Obtain an instance of the matrix value at the given [row] and [column]. [ColorMatrix] follows
+     * row major order in regards to the positions of matrix values within the flattened array. That
+     * is, content order goes from left to right then top to bottom as opposed to column major
+     * order.
      *
-     * @param row Row index to query the ColorMatrix value. Range is from 0 to 3 as [ColorMatrix]
-     * is represented as a 4 x 5 matrix
+     * @param row Row index to query the ColorMatrix value. Range is from 0 to 3 as [ColorMatrix] is
+     *   represented as a 4 x 5 matrix
      * @param column Column index to query the ColorMatrix value. Range is from 0 to 4 as
-     * [ColorMatrix] is represented as a 4 x 5 matrix
+     *   [ColorMatrix] is represented as a 4 x 5 matrix
      */
     inline operator fun get(row: Int, column: Int) = values[(row * 5) + column]
 
     /**
-     * Set the matrix value at the given [row] and [column]. [ColorMatrix] follows row major
-     * order in regards to the positions of matrix values within the flattened array. That is,
-     * content order goes from left to right then top to bottom as opposed to column major order.
+     * Set the matrix value at the given [row] and [column]. [ColorMatrix] follows row major order
+     * in regards to the positions of matrix values within the flattened array. That is, content
+     * order goes from left to right then top to bottom as opposed to column major order.
      *
-     * @param row Row index to query the ColorMatrix value. Range is from 0 to 3 as [ColorMatrix]
-     * is represented as a 4 x 5 matrix
+     * @param row Row index to query the ColorMatrix value. Range is from 0 to 3 as [ColorMatrix] is
+     *   represented as a 4 x 5 matrix
      * @param column Column index to query the ColorMatrix value. Range is from 0 to 4 as
-     * [ColorMatrix] is represented as a 4 x 5 matrix
+     *   [ColorMatrix] is represented as a 4 x 5 matrix
      * @param v value to update at the given [row] and [column]
      */
     inline operator fun set(row: Int, column: Int, v: Float) {
@@ -115,22 +107,16 @@
         this[3, 3] = 1f
     }
 
-    /**
-     * Assign the [src] colormatrix into this matrix, copying all of its values.
-     */
+    /** Assign the [src] colormatrix into this matrix, copying all of its values. */
     fun set(src: ColorMatrix) {
         src.values.copyInto(values)
     }
 
     /**
-     * Internal helper method to handle rotation computation
-     * and provides a callback used to apply the result to different
-     * color rotation axes
+     * Internal helper method to handle rotation computation and provides a callback used to apply
+     * the result to different color rotation axes
      */
-    private inline fun rotateInternal(
-        degrees: Float,
-        block: (cosine: Float, sine: Float) -> Unit
-    ) {
+    private inline fun rotateInternal(degrees: Float, block: (cosine: Float, sine: Float) -> Unit) {
         reset()
         val radians = degrees * PI / 180.0
         val cosine = cos(radians).toFloat()
@@ -138,49 +124,51 @@
         block(cosine, sine)
     }
 
-    /**
-     * Multiply this matrix by [colorMatrix] and assign the result to this matrix.
-     */
+    /** Multiply this matrix by [colorMatrix] and assign the result to this matrix. */
     operator fun timesAssign(colorMatrix: ColorMatrix) {
         val v00 = dot(this, 0, colorMatrix, 0)
         val v01 = dot(this, 0, colorMatrix, 1)
         val v02 = dot(this, 0, colorMatrix, 2)
         val v03 = dot(this, 0, colorMatrix, 3)
-        val v04 = this[0, 0] * colorMatrix[0, 4] +
-            this[0, 1] * colorMatrix[1, 4] +
-            this[0, 2] * colorMatrix[2, 4] +
-            this[0, 3] * colorMatrix[3, 4] +
-            this[0, 4]
+        val v04 =
+            this[0, 0] * colorMatrix[0, 4] +
+                this[0, 1] * colorMatrix[1, 4] +
+                this[0, 2] * colorMatrix[2, 4] +
+                this[0, 3] * colorMatrix[3, 4] +
+                this[0, 4]
 
         val v10 = dot(this, 1, colorMatrix, 0)
         val v11 = dot(this, 1, colorMatrix, 1)
         val v12 = dot(this, 1, colorMatrix, 2)
         val v13 = dot(this, 1, colorMatrix, 3)
-        val v14 = this[1, 0] * colorMatrix[0, 4] +
-            this[1, 1] * colorMatrix[1, 4] +
-            this[1, 2] * colorMatrix[2, 4] +
-            this[1, 3] * colorMatrix[3, 4] +
-            this[1, 4]
+        val v14 =
+            this[1, 0] * colorMatrix[0, 4] +
+                this[1, 1] * colorMatrix[1, 4] +
+                this[1, 2] * colorMatrix[2, 4] +
+                this[1, 3] * colorMatrix[3, 4] +
+                this[1, 4]
 
         val v20 = dot(this, 2, colorMatrix, 0)
         val v21 = dot(this, 2, colorMatrix, 1)
         val v22 = dot(this, 2, colorMatrix, 2)
         val v23 = dot(this, 2, colorMatrix, 3)
-        val v24 = this[2, 0] * colorMatrix[0, 4] +
-            this[2, 1] * colorMatrix[1, 4] +
-            this[2, 2] * colorMatrix[2, 4] +
-            this[2, 3] * colorMatrix[3, 4] +
-            this[2, 4]
+        val v24 =
+            this[2, 0] * colorMatrix[0, 4] +
+                this[2, 1] * colorMatrix[1, 4] +
+                this[2, 2] * colorMatrix[2, 4] +
+                this[2, 3] * colorMatrix[3, 4] +
+                this[2, 4]
 
         val v30 = dot(this, 3, colorMatrix, 0)
         val v31 = dot(this, 3, colorMatrix, 1)
         val v32 = dot(this, 3, colorMatrix, 2)
         val v33 = dot(this, 3, colorMatrix, 3)
-        val v34 = this[3, 0] * colorMatrix[0, 4] +
-            this[3, 1] * colorMatrix[1, 4] +
-            this[3, 2] * colorMatrix[2, 4] +
-            this[3, 3] * colorMatrix[3, 4] +
-            this[3, 4]
+        val v34 =
+            this[3, 0] * colorMatrix[0, 4] +
+                this[3, 1] * colorMatrix[1, 4] +
+                this[3, 2] * colorMatrix[2, 4] +
+                this[3, 3] * colorMatrix[3, 4] +
+                this[3, 4]
 
         this[0, 0] = v00
         this[0, 1] = v01
@@ -205,8 +193,8 @@
     }
 
     /**
-     * Helper method that returns the dot product of the top left 4 x 4 matrix
-     * of [ColorMatrix] used in [timesAssign]
+     * Helper method that returns the dot product of the top left 4 x 4 matrix of [ColorMatrix] used
+     * in [timesAssign]
      */
     private fun dot(m1: ColorMatrix, row: Int, m2: ColorMatrix, column: Int): Float {
         return m1[row, 0] * m2[0, column] +
@@ -238,20 +226,15 @@
     }
 
     /**
-     * Create a [ColorMatrix] with the corresponding scale parameters
-     * for the red, green, blue and alpha axes
+     * Create a [ColorMatrix] with the corresponding scale parameters for the red, green, blue and
+     * alpha axes
      *
      * @param redScale Desired scale parameter for the red channel
      * @param greenScale Desired scale parameter for the green channel
      * @param blueScale Desired scale parameter for the blue channel
      * @param alphaScale Desired scale parameter for the alpha channel
      */
-    fun setToScale(
-        redScale: Float,
-        greenScale: Float,
-        blueScale: Float,
-        alphaScale: Float
-    ) {
+    fun setToScale(redScale: Float, greenScale: Float, blueScale: Float, alphaScale: Float) {
         reset()
         this[0, 0] = redScale
         this[1, 1] = greenScale
@@ -259,9 +242,7 @@
         this[3, 3] = alphaScale
     }
 
-    /**
-     * Rotate by [degrees] along the red color axis
-     */
+    /** Rotate by [degrees] along the red color axis */
     fun setToRotateRed(degrees: Float) {
         rotateInternal(degrees) { cosine, sine ->
             this[2, 2] = cosine
@@ -271,9 +252,7 @@
         }
     }
 
-    /**
-     * Rotate by [degrees] along the green color axis
-     */
+    /** Rotate by [degrees] along the green color axis */
     fun setToRotateGreen(degrees: Float) {
         rotateInternal(degrees) { cosine, sine ->
             this[2, 2] = cosine
@@ -283,9 +262,7 @@
         }
     }
 
-    /**
-     * Rotate by [degrees] along the blue color axis
-     */
+    /** Rotate by [degrees] along the blue color axis */
     fun setToRotateBlue(degrees: Float) {
         rotateInternal(degrees) { cosine, sine ->
             this[1, 1] = cosine
@@ -295,9 +272,7 @@
         }
     }
 
-    /**
-     * Set the matrix to convert RGB to YUV
-     */
+    /** Set the matrix to convert RGB to YUV */
     fun convertRgbToYuv() {
         reset()
         // these coefficients match those in libjpeg
@@ -312,9 +287,7 @@
         this[2, 2] = -0.08131f
     }
 
-    /**
-     * Set the matrix to convert from YUV to RGB
-     */
+    /** Set the matrix to convert from YUV to RGB */
     fun convertYuvToRgb() {
         reset()
         // these coefficients match those in libjpeg
diff --git a/compose/ui/ui-graphics/src/commonMain/kotlin/androidx/compose/ui/graphics/Degrees.kt b/compose/ui/ui-graphics/src/commonMain/kotlin/androidx/compose/ui/graphics/Degrees.kt
index a03da8f..2158a04 100644
--- a/compose/ui/ui-graphics/src/commonMain/kotlin/androidx/compose/ui/graphics/Degrees.kt
+++ b/compose/ui/ui-graphics/src/commonMain/kotlin/androidx/compose/ui/graphics/Degrees.kt
@@ -20,8 +20,5 @@
 
 private const val RadiansToDegrees = (180.0 / PI).toFloat()
 
-/**
- * Converts [radians] to degrees.
- */
-@PublishedApi
-internal fun degrees(radians: Float): Float = RadiansToDegrees * radians
+/** Converts [radians] to degrees. */
+@PublishedApi internal fun degrees(radians: Float): Float = RadiansToDegrees * radians
diff --git a/compose/ui/ui-graphics/src/commonMain/kotlin/androidx/compose/ui/graphics/FilterQuality.kt b/compose/ui/ui-graphics/src/commonMain/kotlin/androidx/compose/ui/graphics/FilterQuality.kt
index 0329619..8847728 100644
--- a/compose/ui/ui-graphics/src/commonMain/kotlin/androidx/compose/ui/graphics/FilterQuality.kt
+++ b/compose/ui/ui-graphics/src/commonMain/kotlin/androidx/compose/ui/graphics/FilterQuality.kt
@@ -18,47 +18,45 @@
 
 import androidx.compose.runtime.Immutable
 
-/**
- * Quality levels for image filters.
- * See [Paint.filterQuality].
- */
+/** Quality levels for image filters. See [Paint.filterQuality]. */
 @Immutable
 @kotlin.jvm.JvmInline
 value class FilterQuality internal constructor(val value: Int) {
 
     companion object {
         /**
-         * Fastest possible filtering, albeit also the lowest quality
-         * Typically this implies nearest-neighbour filtering.
+         * Fastest possible filtering, albeit also the lowest quality Typically this implies
+         * nearest-neighbour filtering.
          */
         val None = FilterQuality(0)
 
         /**
-         * Better quality than [None], faster than [Medium].
-         * Typically this implies bilinear interpolation.
+         * Better quality than [None], faster than [Medium]. Typically this implies bilinear
+         * interpolation.
          */
         val Low = FilterQuality(1)
 
         /**
          * Better quality than [Low], faster than [High].
          *
-         * Typically this implies a combination of bilinear interpolation and
-         * pyramidal parametric prefiltering (mipmaps).
+         * Typically this implies a combination of bilinear interpolation and pyramidal parametric
+         * prefiltering (mipmaps).
          */
         val Medium = FilterQuality(2)
 
         /**
-         * Best possible quality filtering, albeit also the slowest.
-         * Typically this implies bicubic interpolation or better.
+         * Best possible quality filtering, albeit also the slowest. Typically this implies bicubic
+         * interpolation or better.
          */
         val High = FilterQuality(3)
     }
 
-    override fun toString() = when (this) {
-        None -> "None"
-        Low -> "Low"
-        Medium -> "Medium"
-        High -> "High"
-        else -> "Unknown"
-    }
+    override fun toString() =
+        when (this) {
+            None -> "None"
+            Low -> "Low"
+            Medium -> "Medium"
+            High -> "High"
+            else -> "Unknown"
+        }
 }
diff --git a/compose/ui/ui-graphics/src/commonMain/kotlin/androidx/compose/ui/graphics/Float16.kt b/compose/ui/ui-graphics/src/commonMain/kotlin/androidx/compose/ui/graphics/Float16.kt
index d04cfcd..1c87aef 100644
--- a/compose/ui/ui-graphics/src/commonMain/kotlin/androidx/compose/ui/graphics/Float16.kt
+++ b/compose/ui/ui-graphics/src/commonMain/kotlin/androidx/compose/ui/graphics/Float16.kt
@@ -19,17 +19,16 @@
 
 /**
  * The `Float16` class is a wrapper and a utility class to manipulate half-precision 16-bit
- * [IEEE 754](https://en.wikipedia.org/wiki/Half-precision_floating-point_format)
- * floating point data types (also called fp16 or binary16). A half-precision float can be
- * created from or converted to single-precision floats, and is stored in a short data type.
- * To distinguish short values holding half-precision floats from regular short values,
- * it is recommended to use the `@HalfFloat` annotation.
+ * [IEEE 754](https://en.wikipedia.org/wiki/Half-precision_floating-point_format) floating point
+ * data types (also called fp16 or binary16). A half-precision float can be created from or
+ * converted to single-precision floats, and is stored in a short data type. To distinguish short
+ * values holding half-precision floats from regular short values, it is recommended to use the
+ * `@HalfFloat` annotation.
  *
  * The IEEE 754 standard specifies an fp16 as having the following format:
- *
- *  - Sign bit: 1 bit
- *  - Exponent width: 5 bits
- *  - Significand: 10 bits
+ * - Sign bit: 1 bit
+ * - Exponent width: 5 bits
+ * - Significand: 10 bits
  *
  * The format is laid out as follows:
  * ```
@@ -40,15 +39,12 @@
  *     -- exponent
  * ```
  *
- * Half-precision floating points can be useful to save memory and/or
- * bandwidth at the expense of range and precision when compared to single-precision
- * floating points (fp32).
+ * Half-precision floating points can be useful to save memory and/or bandwidth at the expense of
+ * range and precision when compared to single-precision floating points (fp32).
  *
- * To help you decide whether fp16 is the right storage type for you need, please
- * refer to the table below that shows the available precision throughout the range of
- * possible values. The *precision* column indicates the step size between two
- * consecutive numbers in a specific part of the range.
- *
+ * To help you decide whether fp16 is the right storage type for you need, please refer to the table
+ * below that shows the available precision throughout the range of possible values. The *precision*
+ * column indicates the step size between two consecutive numbers in a specific part of the range.
  * <table summary="Precision of fp16 across the range">
  * <tr><th>Range start</th><th>Precision</th></tr>
  * <tr><td>0</td><td>1/16,777,216</td></tr>
@@ -81,131 +77,114 @@
  * <tr><td>4,096</td><td>4</td></tr>
  * <tr><td>8,192</td><td>8</td></tr>
  * <tr><td>16,384</td><td>16</td></tr>
- * <tr><td>32,768</td><td>32</td></tr>
- * </table>
+ * <tr><td>32,768</td><td>32</td></tr> </table>
  *
  * This table shows that numbers higher than 1024 lose all fractional precision.
  */
 @JvmInline
 internal value class Float16(val halfValue: Short) : Comparable<Float16> {
     /**
-     * Constructs a newly allocated `Float16` object that represents the
-     * argument converted to a half-precision float.
+     * Constructs a newly allocated `Float16` object that represents the argument converted to a
+     * half-precision float.
      *
      * @param value The value to be represented by the `Float16`
      */
     constructor(value: Float) : this(floatToHalf(value))
 
     /**
-     * Constructs a newly allocated `Float16` object that
-     * represents the argument converted to a half-precision float.
+     * Constructs a newly allocated `Float16` object that represents the argument converted to a
+     * half-precision float.
      *
      * @param value The value to be represented by the `Float16`
      */
     constructor(value: Double) : this(value.toFloat())
 
     /**
-     * Returns the value of this `Float16` as a `Byte` after
-     * a narrowing primitive conversion.
+     * Returns the value of this `Float16` as a `Byte` after a narrowing primitive conversion.
      *
-     * @return The half-precision float value represented by this object
-     * converted to type `Byte`
+     * @return The half-precision float value represented by this object converted to type `Byte`
      */
     fun toByte(): Byte = toFloat().toInt().toByte()
 
     /**
-     * Returns the value of this `Float16` as a `Short` after
-     * a narrowing primitive conversion.
+     * Returns the value of this `Float16` as a `Short` after a narrowing primitive conversion.
      *
-     * @return The half-precision float value represented by this object
-     * converted to type `Short`
+     * @return The half-precision float value represented by this object converted to type `Short`
      */
     fun toShort(): Short = toFloat().toInt().toShort()
 
     /**
-     * Returns the value of this `Float16` as a `Int` after
-     * a narrowing primitive conversion.
+     * Returns the value of this `Float16` as a `Int` after a narrowing primitive conversion.
      *
-     * @return The half-precision float value represented by this object
-     * converted to type `Int`
+     * @return The half-precision float value represented by this object converted to type `Int`
      */
     fun toInt(): Int = toFloat().toInt()
 
     /**
-     * Returns the value of this `Float16` as a `Long` after
-     * a narrowing primitive conversion.
+     * Returns the value of this `Float16` as a `Long` after a narrowing primitive conversion.
      *
-     * @return The half-precision float value represented by this object
-     * converted to type `Long`
+     * @return The half-precision float value represented by this object converted to type `Long`
      */
     fun toLong(): Long = toFloat().toLong()
 
     /**
-     * Returns the value of this `Float16` as a `Float` after
-     * a widening primitive conversion.
+     * Returns the value of this `Float16` as a `Float` after a widening primitive conversion.
      *
-     * @return The half-precision float value represented by this object
-     * converted to type `Float`
+     * @return The half-precision float value represented by this object converted to type `Float`
      */
     fun toFloat(): Float = halfToFloat(halfValue)
 
     /**
-     * Returns the value of this `Float16` as a `Double` after
-     * a widening primitive conversion.
+     * Returns the value of this `Float16` as a `Double` after a widening primitive conversion.
      *
-     * @return The half-precision float value represented by this object
-     * converted to type `Double`
+     * @return The half-precision float value represented by this object converted to type `Double`
      */
     fun toDouble(): Double = toFloat().toDouble()
 
     /**
-     * Returns a representation of the half-precision float value
-     * according to the bit layout described in [Float16].
+     * Returns a representation of the half-precision float value according to the bit layout
+     * described in [Float16].
      *
-     * Unlike [toRawBits], this method collapses all
-     * possible Not-a-Number values to a single canonical Not-a-Number value
-     * defined by [NaN].
+     * Unlike [toRawBits], this method collapses all possible Not-a-Number values to a single
+     * canonical Not-a-Number value defined by [NaN].
      *
      * @return The bits that represent the half-precision float value
      */
-    fun toBits(): Int = if (isNaN()) {
-        NaN.halfValue.toInt()
-    } else {
-        halfValue.toInt() and 0xffff
-    }
+    fun toBits(): Int =
+        if (isNaN()) {
+            NaN.halfValue.toInt()
+        } else {
+            halfValue.toInt() and 0xffff
+        }
 
     /**
-     * Returns a representation of the half-precision float value
-     * according to the bit layout described in [Float16].
+     * Returns a representation of the half-precision float value according to the bit layout
+     * described in [Float16].
      *
      * @return The bits that represent the half-precision float value
      */
     fun toRawBits(): Int = halfValue.toInt() and 0xffff
 
     /**
-     * Returns a string representation of the specified half-precision
-     * float value. See [toString] for more information.
+     * Returns a string representation of the specified half-precision float value. See [toString]
+     * for more information.
      *
      * @return A string representation of this `Float16` object
      */
     override fun toString(): String = toFloat().toString()
 
     /**
-     * Compares to another half-precision float value. The following
-     * conditions apply during the comparison:
-     *
-     *  * [NaN] is considered by this method to be equal to itself and greater
-     * than all other half-precision float values (including [PositiveInfinity])
-     *  * [PositiveZero] is considered by this method to be greater than
-     * [NegativeZero].
+     * Compares to another half-precision float value. The following conditions apply during the
+     * comparison:
+     * * [NaN] is considered by this method to be equal to itself and greater than all other
+     *   half-precision float values (including [PositiveInfinity])
+     * * [PositiveZero] is considered by this method to be greater than [NegativeZero].
      *
      * @param other The half-precision float value to compare to the half-precision value
-     * represented by this `Float16` object
-     *
-     * @return The value `0` if `this` is numerically equal to [other]; a
-     * value less than `0` if `this` is numerically less than [other];
-     * and a value greater than `0` if `this` is numerically greater
-     * than [other]
+     *   represented by this `Float16` object
+     * @return The value `0` if `this` is numerically equal to [other]; a value less than `0` if
+     *   `this` is numerically less than [other]; and a value greater than `0` if `this` is
+     *   numerically greater than [other]
      */
     override operator fun compareTo(other: Float16): Int {
         if (isNaN()) {
@@ -226,51 +205,45 @@
      * * `NaN.sign` is `NaN`
      */
     val sign: Float16
-        get() = when {
-            isNaN() -> NaN
-            this < NegativeZero -> NegativeOne
-            this > PositiveZero -> One
-            else -> this // this is zero, either positive or negative
-        }
+        get() =
+            when {
+                isNaN() -> NaN
+                this < NegativeZero -> NegativeOne
+                this > PositiveZero -> One
+                else -> this // this is zero, either positive or negative
+            }
 
-    /**
-     * Returns a [Float16] with the magnitude of this and the sign of [sign]
-     */
+    /** Returns a [Float16] with the magnitude of this and the sign of [sign] */
     fun withSign(sign: Float16): Float16 =
         Float16(
-            (
-                sign.halfValue.toInt() and Fp16SignMask or
-                    (halfValue.toInt() and Fp16Combined)
-            ).toShort()
+            (sign.halfValue.toInt() and Fp16SignMask or (halfValue.toInt() and Fp16Combined))
+                .toShort()
         )
 
     /**
-     * Returns the absolute value of the half-precision float.
-     * Special values are handled in the following ways:
-     *
-     *  * If the specified half-precision float is [NaN], the result is [NaN]
-     *  * If the specified half-precision float is zero (negative or positive),
-     * the result is positive zero (see [PositiveZero])
-     *  * If the specified half-precision float is infinity (negative or positive),
-     * the result is positive infinity (see [PositiveInfinity])
+     * Returns the absolute value of the half-precision float. Special values are handled in the
+     * following ways:
+     * * If the specified half-precision float is [NaN], the result is [NaN]
+     * * If the specified half-precision float is zero (negative or positive), the result is
+     *   positive zero (see [PositiveZero])
+     * * If the specified half-precision float is infinity (negative or positive), the result is
+     *   positive infinity (see [PositiveInfinity])
      */
     fun absoluteValue(): Float16 {
         return Float16((halfValue.toInt() and Fp16Combined).toShort())
     }
 
     /**
-     * Returns the closest integral half-precision float value to the this
-     * half-precision float value. Special values are handled in the
-     * following ways:
+     * Returns the closest integral half-precision float value to the this half-precision float
+     * value. Special values are handled in the following ways:
+     * * If the specified half-precision float is [NaN], the result is [NaN]
+     * * If the specified half-precision float is infinity (negative or positive), the result is
+     *   infinity (with the same sign)
+     * * If the specified half-precision float is zero (negative or positive), the result is zero
+     *   (with the same sign)
      *
-     *  * If the specified half-precision float is [NaN], the result is [NaN]
-     *  * If the specified half-precision float is infinity (negative or positive),
-     * the result is infinity (with the same sign)
-     *  * If the specified half-precision float is zero (negative or positive),
-     * the result is zero (with the same sign)
-     *
-     * @return The value of the specified half-precision float rounded to the nearest
-     * half-precision float value
+     * @return The value of the specified half-precision float rounded to the nearest half-precision
+     *   float value
      */
     fun round(): Float16 {
         val bits = halfValue.toInt() and 0xffff
@@ -291,18 +264,16 @@
     }
 
     /**
-     * Returns the smallest half-precision float value toward negative infinity
-     * greater than or equal to this half-precision float value.
-     * Special values are handled in the following ways:
+     * Returns the smallest half-precision float value toward negative infinity greater than or
+     * equal to this half-precision float value. Special values are handled in the following ways:
+     * * If the specified half-precision float is [NaN], the result is [NaN]
+     * * If the specified half-precision float is infinity (negative or positive), the result is
+     *   infinity (with the same sign)
+     * * If the specified half-precision float is zero (negative or positive), the result is zero
+     *   (with the same sign)
      *
-     *  * If the specified half-precision float is [NaN], the result is [NaN]
-     *  * If the specified half-precision float is infinity (negative or positive),
-     * the result is infinity (with the same sign)
-     *  * If the specified half-precision float is zero (negative or positive),
-     * the result is zero (with the same sign)
-     *
-     * @return The smallest half-precision float value toward negative infinity
-     * greater than or equal to the half-precision float value
+     * @return The smallest half-precision float value toward negative infinity greater than or
+     *   equal to the half-precision float value
      */
     fun ceil(): Float16 {
         val bits = halfValue.toInt() and 0xffff
@@ -323,18 +294,16 @@
     }
 
     /**
-     * Returns the largest half-precision float value toward positive infinity
-     * less than or equal to this half-precision float value.
-     * Special values are handled in the following ways:
+     * Returns the largest half-precision float value toward positive infinity less than or equal to
+     * this half-precision float value. Special values are handled in the following ways:
+     * * If the specified half-precision float is [NaN], the result is [NaN]
+     * * If the specified half-precision float is infinity (negative or positive), the result is
+     *   infinity (with the same sign)
+     * * If the specified half-precision float is zero (negative or positive), the result is zero
+     *   (with the same sign)
      *
-     *  * If the specified half-precision float is [NaN], the result is [NaN]
-     *  * If the specified half-precision float is infinity (negative or positive),
-     * the result is infinity (with the same sign)
-     *  * If the specified half-precision float is zero (negative or positive),
-     * the result is zero (with the same sign)
-     *
-     * @return The largest half-precision float value toward positive infinity
-     * less than or equal to the half-precision float value
+     * @return The largest half-precision float value toward positive infinity less than or equal to
+     *   the half-precision float value
      */
     fun floor(): Float16 {
         val bits = halfValue.toInt() and 0xffff
@@ -355,17 +324,15 @@
     }
 
     /**
-     * Returns the truncated half-precision float value of this
-     * half-precision float value. Special values are handled in the following ways:
+     * Returns the truncated half-precision float value of this half-precision float value. Special
+     * values are handled in the following ways:
+     * * If the specified half-precision float is NaN, the result is NaN
+     * * If the specified half-precision float is infinity (negative or positive), the result is
+     *   infinity (with the same sign)
+     * * If the specified half-precision float is zero (negative or positive), the result is zero
+     *   (with the same sign)
      *
-     *  * If the specified half-precision float is NaN, the result is NaN
-     *  * If the specified half-precision float is infinity (negative or positive),
-     * the result is infinity (with the same sign)
-     *  * If the specified half-precision float is zero (negative or positive),
-     * the result is zero (with the same sign)
-     *
-     * @return The truncated half-precision float value of the
-     * half-precision float value
+     * @return The truncated half-precision float value of the half-precision float value
      */
     fun trunc(): Float16 {
         val bits = halfValue.toInt() and 0xffff
@@ -384,55 +351,44 @@
     }
 
     /**
-     * The unbiased exponent used in the representation of
-     * the specified  half-precision float value. if the value is NaN
-     * or infinite, this* method returns [MaxExponent] + 1.
-     * If the argument is 0 or a subnormal representation, this method
-     * returns [MinExponent] - 1.
+     * The unbiased exponent used in the representation of the specified half-precision float value.
+     * if the value is NaN or infinite, this* method returns [MaxExponent] + 1. If the argument is 0
+     * or a subnormal representation, this method returns [MinExponent] - 1.
      */
     val exponent: Int
-        get() = (halfValue.toInt().ushr(Fp16ExponentShift) and Fp16ExponentMask) -
-            Fp16ExponentBias
+        get() = (halfValue.toInt().ushr(Fp16ExponentShift) and Fp16ExponentMask) - Fp16ExponentBias
 
     /**
-     * The significand, or mantissa, used in the representation
-     * of this half-precision float value.
+     * The significand, or mantissa, used in the representation of this half-precision float value.
      */
     val significand: Int
         get() = halfValue.toInt() and Fp16SignificandMask
 
     /**
-     * Returns true if this `Float16` value represents a Not-a-Number,
-     * false otherwise.
+     * Returns true if this `Float16` value represents a Not-a-Number, false otherwise.
      *
      * @return True if the value is a NaN, false otherwise
      */
     fun isNaN(): Boolean = halfValue.toInt() and Fp16Combined > Fp16ExponentMax
 
     /**
-     * Returns true if the half-precision float value represents
-     * infinity, false otherwise.
+     * Returns true if the half-precision float value represents infinity, false otherwise.
      *
-     * @return True if the value is positive infinity or negative infinity,
-     * false otherwise
+     * @return True if the value is positive infinity or negative infinity, false otherwise
      */
     fun isInfinite(): Boolean = halfValue.toInt() and Fp16Combined == Fp16ExponentMax
 
     /**
-     * Returns false if the half-precision float value represents
-     * infinity, true otherwise.
+     * Returns false if the half-precision float value represents infinity, true otherwise.
      *
-     * @return False if the value is positive infinity or negative infinity,
-     * true otherwise
+     * @return False if the value is positive infinity or negative infinity, true otherwise
      */
     fun isFinite(): Boolean = halfValue.toInt() and Fp16Combined != Fp16ExponentMax
 
     /**
-     * Returns true if the half-precision float value is normalized
-     * (does not have a subnormal representation). If the specified value is
-     * [PositiveInfinity], [NegativeInfinity],
-     * [PositiveZero], [NegativeZero], [NaN] or any subnormal
-     * number, this method returns false.
+     * Returns true if the half-precision float value is normalized (does not have a subnormal
+     * representation). If the specified value is [PositiveInfinity], [NegativeInfinity],
+     * [PositiveZero], [NegativeZero], [NaN] or any subnormal number, this method returns false.
      *
      * @return True if the value is normalized, false otherwise
      */
@@ -442,27 +398,21 @@
     }
 
     /**
-     *
-     * Returns a hexadecimal string representation of the half-precision
-     * float value. If the value is a NaN, the result is `"NaN"`,
-     * otherwise the result follows this format:
-     *
-     *  * If the sign is positive, no sign character appears in the result
-     *  * If the sign is negative, the first character is `'-'`
-     *  * If the value is inifinity, the string is `"Infinity"`
-     *  * If the value is 0, the string is `"0x0.0p0"`
-     *  * If the value has a normalized representation, the exponent and
-     * significand are represented in the string in two fields. The significand
-     * starts with `"0x1."` followed by its lowercase hexadecimal
-     * representation. Trailing zeroes are removed unless all digits are 0, then
-     * a single zero is used. The significand representation is followed by the
-     * exponent, represented by `"p"`, itself followed by a decimal
-     * string of the unbiased exponent
-     *  * If the value has a subnormal representation, the significand starts
-     * with `"0x0."` followed by its lowercase hexadecimal
-     * representation. Trailing zeroes are removed unless all digits are 0, then
-     * a single zero is used. The significand representation is followed by the
-     * exponent, represented by `"p-14"`
+     * Returns a hexadecimal string representation of the half-precision float value. If the value
+     * is a NaN, the result is `"NaN"`, otherwise the result follows this format:
+     * * If the sign is positive, no sign character appears in the result
+     * * If the sign is negative, the first character is `'-'`
+     * * If the value is inifinity, the string is `"Infinity"`
+     * * If the value is 0, the string is `"0x0.0p0"`
+     * * If the value has a normalized representation, the exponent and significand are represented
+     *   in the string in two fields. The significand starts with `"0x1."` followed by its lowercase
+     *   hexadecimal representation. Trailing zeroes are removed unless all digits are 0, then a
+     *   single zero is used. The significand representation is followed by the exponent,
+     *   represented by `"p"`, itself followed by a decimal string of the unbiased exponent
+     * * If the value has a subnormal representation, the significand starts with `"0x0."` followed
+     *   by its lowercase hexadecimal representation. Trailing zeroes are removed unless all digits
+     *   are 0, then a single zero is used. The significand representation is followed by the
+     *   exponent, represented by `"p-14"`
      *
      * @return A hexadecimal string representation of the specified value
      */
@@ -505,61 +455,37 @@
     }
 
     companion object {
-        /**
-         * The number of bits used to represent a half-precision float value.
-         */
+        /** The number of bits used to represent a half-precision float value. */
         const val Size = 16
 
         /**
-         * Epsilon is the difference between 1.0 and the next value representable
-         * by a half-precision floating-point.
+         * Epsilon is the difference between 1.0 and the next value representable by a
+         * half-precision floating-point.
          */
         val Epsilon = Float16(0x1400.toShort())
 
-        /**
-         * Maximum exponent a finite half-precision float may have.
-         */
+        /** Maximum exponent a finite half-precision float may have. */
         const val MaxExponent = 15
-        /**
-         * Minimum exponent a normalized half-precision float may have.
-         */
+        /** Minimum exponent a normalized half-precision float may have. */
         const val MinExponent = -14
 
-        /**
-         * Smallest negative value a half-precision float may have.
-         */
+        /** Smallest negative value a half-precision float may have. */
         val LowestValue = Float16(0xfbff.toShort())
-        /**
-         * Maximum positive finite value a half-precision float may have.
-         */
+        /** Maximum positive finite value a half-precision float may have. */
         val MaxValue = Float16(0x7bff.toShort())
-        /**
-         * Smallest positive normal value a half-precision float may have.
-         */
+        /** Smallest positive normal value a half-precision float may have. */
         val MinNormal = Float16(0x0400.toShort())
-        /**
-         * Smallest positive non-zero value a half-precision float may have.
-         */
+        /** Smallest positive non-zero value a half-precision float may have. */
         val MinValue = Float16(0x0001.toShort())
-        /**
-         * A Not-a-Number representation of a half-precision float.
-         */
+        /** A Not-a-Number representation of a half-precision float. */
         val NaN = Float16(0x7e00.toShort())
-        /**
-         * Negative infinity of type half-precision float.
-         */
+        /** Negative infinity of type half-precision float. */
         val NegativeInfinity = Float16(0xfc00.toShort())
-        /**
-         * Negative 0 of type half-precision float.
-         */
+        /** Negative 0 of type half-precision float. */
         val NegativeZero = Float16(0x8000.toShort())
-        /**
-         * Positive infinity of type half-precision float.
-         */
+        /** Positive infinity of type half-precision float. */
         val PositiveInfinity = Float16(0x7c00.toShort())
-        /**
-         * Positive 0 of type half-precision float.
-         */
+        /** Positive 0 of type half-precision float. */
         val PositiveZero = Float16(0x0000.toShort())
     }
 }
@@ -596,8 +522,8 @@
 }
 
 /**
- * Convert a single-precision float to a half-precision float, stored as
- * [Short] data type to hold its 16 bits.
+ * Convert a single-precision float to a half-precision float, stored as [Short] data type to hold
+ * its 16 bits.
  */
 @Suppress("NOTHING_TO_INLINE")
 internal inline fun floatToHalf(f: Float): Short {
@@ -641,9 +567,7 @@
     return (s shl Fp16SignShift or (outE shl Fp16ExponentShift) or outM).toShort()
 }
 
-/**
- * Convert a half-precision float to a single-precision float.
- */
+/** Convert a half-precision float to a single-precision float. */
 @Suppress("NOTHING_TO_INLINE")
 internal inline fun halfToFloat(h: Short): Float {
     val bits = h.toInt() and 0xffff
@@ -678,11 +602,10 @@
 }
 
 /**
- * Returns the smaller of two half-precision float values (the value closest
- * to negative infinity). Special values are handled in the following ways:
- *
- *  * If either value is [Float16.NaN], the result is [Float16.NaN]
- *  * [Float16.NegativeZero] is smaller than [Float16.PositiveZero]
+ * Returns the smaller of two half-precision float values (the value closest to negative infinity).
+ * Special values are handled in the following ways:
+ * * If either value is [Float16.NaN], the result is [Float16.NaN]
+ * * [Float16.NegativeZero] is smaller than [Float16.PositiveZero]
  *
  * @param x The first half-precision value
  * @param y The second half-precision value
@@ -696,15 +619,13 @@
 }
 
 /**
- * Returns the larger of two half-precision float values (the value closest
- * to positive infinity). Special values are handled in the following ways:
- *
- *  * If either value is [Float16.NaN], the result is [Float16.NaN]
- *  * [Float16.PositiveZero] is greater than [Float16.NegativeZero]
+ * Returns the larger of two half-precision float values (the value closest to positive infinity).
+ * Special values are handled in the following ways:
+ * * If either value is [Float16.NaN], the result is [Float16.NaN]
+ * * [Float16.PositiveZero] is greater than [Float16.NegativeZero]
  *
  * @param x The first half-precision value
  * @param y The second half-precision value
- *
  * @return The larger of the two specified half-precision values
  */
 internal fun max(x: Float16, y: Float16): Float16 {
diff --git a/compose/ui/ui-graphics/src/commonMain/kotlin/androidx/compose/ui/graphics/GraphicsContext.kt b/compose/ui/ui-graphics/src/commonMain/kotlin/androidx/compose/ui/graphics/GraphicsContext.kt
index 4873964..fd18e9f 100644
--- a/compose/ui/ui-graphics/src/commonMain/kotlin/androidx/compose/ui/graphics/GraphicsContext.kt
+++ b/compose/ui/ui-graphics/src/commonMain/kotlin/androidx/compose/ui/graphics/GraphicsContext.kt
@@ -25,15 +25,15 @@
 interface GraphicsContext {
 
     /**
-     * Create a [GraphicsLayer] instance. This may internally return a previously
-     * released [GraphicsLayer] instance passed to [releaseGraphicsLayer]
+     * Create a [GraphicsLayer] instance. This may internally return a previously released
+     * [GraphicsLayer] instance passed to [releaseGraphicsLayer]
      */
     fun createGraphicsLayer(): GraphicsLayer
 
     /**
-     * Releases a [GraphicsLayer] instance so it can be re-used. After this method is
-     * invoked, it is an error to use this [GraphicsLayer] instance again. The [GraphicsLayer]
-     * maybe reused internally and obtained again through a subsequent call to [createGraphicsLayer]
+     * Releases a [GraphicsLayer] instance so it can be re-used. After this method is invoked, it is
+     * an error to use this [GraphicsLayer] instance again. The [GraphicsLayer] maybe reused
+     * internally and obtained again through a subsequent call to [createGraphicsLayer]
      */
     fun releaseGraphicsLayer(layer: GraphicsLayer)
 }
diff --git a/compose/ui/ui-graphics/src/commonMain/kotlin/androidx/compose/ui/graphics/ImageBitmap.kt b/compose/ui/ui-graphics/src/commonMain/kotlin/androidx/compose/ui/graphics/ImageBitmap.kt
index 7ad7d5d..02e863c 100644
--- a/compose/ui/ui-graphics/src/commonMain/kotlin/androidx/compose/ui/graphics/ImageBitmap.kt
+++ b/compose/ui/ui-graphics/src/commonMain/kotlin/androidx/compose/ui/graphics/ImageBitmap.kt
@@ -22,8 +22,8 @@
 import androidx.compose.ui.graphics.internal.JvmDefaultWithCompatibility
 
 /**
- * Graphics object that represents a 2 dimensional array of pixel information represented
- * as ARGB values
+ * Graphics object that represents a 2 dimensional array of pixel information represented as ARGB
+ * values
  */
 @JvmDefaultWithCompatibility
 interface ImageBitmap {
@@ -42,6 +42,7 @@
 
     /**
      * Returns the current configuration of this Image, either:
+     *
      * @see ImageBitmapConfig.Argb8888
      * @see ImageBitmapConfig.Rgb565
      * @see ImageBitmapConfig.Alpha8
@@ -50,12 +51,11 @@
     val config: ImageBitmapConfig
 
     /**
-     * Copies the pixel data within the ImageBitmap into the given array. Each value is
-     * represented as ARGB values packed into an Int.
-     * The stride parameter allows the caller to allow for gaps in the returned pixels array
-     * between rows. For normal packed, results, the stride value is equivalent to the width of
-     * the [ImageBitmap]. The returned colors are non-premultiplied ARGB values in the
-     * [ColorSpaces.Srgb] color space.
+     * Copies the pixel data within the ImageBitmap into the given array. Each value is represented
+     * as ARGB values packed into an Int. The stride parameter allows the caller to allow for gaps
+     * in the returned pixels array between rows. For normal packed, results, the stride value is
+     * equivalent to the width of the [ImageBitmap]. The returned colors are non-premultiplied ARGB
+     * values in the [ColorSpaces.Srgb] color space.
      *
      * Note this method can block so it is recommended to not invoke this method in performance
      * critical code paths
@@ -63,10 +63,9 @@
      * @sample androidx.compose.ui.graphics.samples.ImageBitmapReadPixelsSample
      *
      * @param buffer The array to store the [ImageBitmap]'s colors. By default this allocates an
-     * [IntArray] large enough to store all the pixel information. Consumers of this API are
-     * advised to use the smallest [IntArray] necessary to extract relevant pixel information, that
-     * is the 2 dimensional area of the section of the [ImageBitmap] to be queried.
-     *
+     *   [IntArray] large enough to store all the pixel information. Consumers of this API are
+     *   advised to use the smallest [IntArray] necessary to extract relevant pixel information,
+     *   that is the 2 dimensional area of the section of the [ImageBitmap] to be queried.
      * @param startX The x-coordinate of the first pixel to read from the [ImageBitmap]
      * @param startY The y-coordinate of the first pixel to read from the [ImageBitmap]
      * @param width The number of pixels to read from each row
@@ -90,18 +89,16 @@
      */
     fun prepareToDraw()
 
-    /**
-     * Provide an empty companion object to hang platform-specific companion extensions onto.
-     */
-    companion object { } // ktlint-disable no-empty-class-body
+    /** Provide an empty companion object to hang platform-specific companion extensions onto. */
+    companion object {} // ktlint-disable no-empty-class-body
 }
 
 /**
- * Convenience method to extract pixel information from the given ImageBitmap into a [PixelMap]
- * that supports for querying pixel information based on
+ * Convenience method to extract pixel information from the given ImageBitmap into a [PixelMap] that
+ * supports for querying pixel information based on
  *
- * Note this method can block so it is recommended to not invoke this method in performance
- * critical code paths
+ * Note this method can block so it is recommended to not invoke this method in performance critical
+ * code paths
  *
  * @sample androidx.compose.ui.graphics.samples.ImageBitmapToPixelMapSample
  *
@@ -110,11 +107,10 @@
  * @param width The number of pixels to read from each row
  * @param height The number of rows to read
  * @param buffer The array to store the [ImageBitmap]'s colors. By default this allocates an
- * [IntArray] large enough to store all the pixel information. Consumers of this API are
- * advised to use the smallest [IntArray] necessary to extract relevant pixel information
+ *   [IntArray] large enough to store all the pixel information. Consumers of this API are advised
+ *   to use the smallest [IntArray] necessary to extract relevant pixel information
  * @param bufferOffset The first index to write into the buffer array, this defaults to 0
  * @param stride The number of entries in [buffer] to skip between rows (must be >= [width]
- *
  * @see ImageBitmap.readPixels
  */
 fun ImageBitmap.toPixelMap(
@@ -126,37 +122,27 @@
     bufferOffset: Int = 0,
     stride: Int = width
 ): PixelMap {
-    readPixels(
-        buffer,
-        startX,
-        startY,
-        width,
-        height,
-        bufferOffset,
-        stride
-    )
+    readPixels(buffer, startX, startY, width, height, bufferOffset, stride)
     return PixelMap(buffer, width, height, bufferOffset, stride)
 }
 
 /**
- * Possible ImageBitmap configurations. An ImageBitmap configuration describes
- * how pixels are stored. This affects the quality (color depth) as
- * well as the ability to display transparent/translucent colors.
+ * Possible ImageBitmap configurations. An ImageBitmap configuration describes how pixels are
+ * stored. This affects the quality (color depth) as well as the ability to display
+ * transparent/translucent colors.
  */
 @Immutable
 @kotlin.jvm.JvmInline
 value class ImageBitmapConfig internal constructor(val value: Int) {
     companion object {
         /**
-         * Each pixel is stored on 4 bytes. Each channel (RGB and alpha
-         * for translucency) is stored with 8 bits of precision (256
-         * possible values.)
+         * Each pixel is stored on 4 bytes. Each channel (RGB and alpha for translucency) is stored
+         * with 8 bits of precision (256 possible values.)
          *
-         * This configuration is very flexible and offers the best
-         * quality. It should be used whenever possible.
+         * This configuration is very flexible and offers the best quality. It should be used
+         * whenever possible.
          *
          *      Use this formula to pack into 32 bits:
-         *
          * ```
          * val color =
          *    ((A and 0xff) shl 24) or
@@ -168,26 +154,23 @@
         val Argb8888 = ImageBitmapConfig(0)
 
         /**
-         * Each pixel is stored as a single translucency (alpha) channel.
-         * This is very useful to efficiently store masks for instance.
-         * No color information is stored.
-         * With this configuration, each pixel requires 1 byte of memory.
+         * Each pixel is stored as a single translucency (alpha) channel. This is very useful to
+         * efficiently store masks for instance. No color information is stored. With this
+         * configuration, each pixel requires 1 byte of memory.
          */
         val Alpha8 = ImageBitmapConfig(1)
 
         /**
-         * Each pixel is stored on 2 bytes and only the RGB channels are
-         * encoded: red is stored with 5 bits of precision (32 possible
-         * values), green is stored with 6 bits of precision (64 possible
-         * values) and blue is stored with 5 bits of precision.
+         * Each pixel is stored on 2 bytes and only the RGB channels are encoded: red is stored with
+         * 5 bits of precision (32 possible values), green is stored with 6 bits of precision (64
+         * possible values) and blue is stored with 5 bits of precision.
          *
-         * This configuration can produce slight visual artifacts depending
-         * on the configuration of the source. For instance, without
-         * dithering, the result might show a greenish tint. To get better
-         * results dithering should be applied.
+         * This configuration can produce slight visual artifacts depending on the configuration of
+         * the source. For instance, without dithering, the result might show a greenish tint. To
+         * get better results dithering should be applied.
          *
-         * This configuration may be useful when using opaque bitmaps
-         * that do not require high color fidelity.
+         * This configuration may be useful when using opaque bitmaps that do not require high color
+         * fidelity.
          *
          *      Use this formula to pack into 16 bits:
          * ```
@@ -200,12 +183,10 @@
         val Rgb565 = ImageBitmapConfig(2)
 
         /**
-         * Each pixel is stored on 8 bytes. Each channel (RGB and alpha
-         * for translucency) is stored as a
-         * half-precision floating point value.
+         * Each pixel is stored on 8 bytes. Each channel (RGB and alpha for translucency) is stored
+         * as a half-precision floating point value.
          *
-         * This configuration is particularly suited for wide-gamut and
-         * HDR content.
+         * This configuration is particularly suited for wide-gamut and HDR content.
          *
          *      Use this formula to pack into 64 bits:
          * ```
@@ -219,8 +200,8 @@
         val F16 = ImageBitmapConfig(3)
 
         /**
-         * Special configuration, when an ImageBitmap is stored only in graphic memory.
-         * ImageBitmaps in this configuration are always immutable.
+         * Special configuration, when an ImageBitmap is stored only in graphic memory. ImageBitmaps
+         * in this configuration are always immutable.
          *
          * It is optimal for cases, when the only operation with the ImageBitmap is to draw it on a
          * screen.
@@ -228,14 +209,15 @@
         val Gpu = ImageBitmapConfig(4)
     }
 
-    override fun toString() = when (this) {
-        Argb8888 -> "Argb8888"
-        Alpha8 -> "Alpha8"
-        Rgb565 -> "Rgb565"
-        F16 -> "F16"
-        Gpu -> "Gpu"
-        else -> "Unknown"
-    }
+    override fun toString() =
+        when (this) {
+            Argb8888 -> "Argb8888"
+            Alpha8 -> "Alpha8"
+            Rgb565 -> "Rgb565"
+            F16 -> "F16"
+            Gpu -> "Gpu"
+            else -> "Unknown"
+        }
 }
 
 internal expect fun ActualImageBitmap(
@@ -252,10 +234,4 @@
     config: ImageBitmapConfig = ImageBitmapConfig.Argb8888,
     hasAlpha: Boolean = true,
     colorSpace: ColorSpace = ColorSpaces.Srgb
-): ImageBitmap = ActualImageBitmap(
-    width,
-    height,
-    config,
-    hasAlpha,
-    colorSpace
-)
+): ImageBitmap = ActualImageBitmap(width, height, config, hasAlpha, colorSpace)
diff --git a/compose/ui/ui-graphics/src/commonMain/kotlin/androidx/compose/ui/graphics/InlineClassHelper.kt b/compose/ui/ui-graphics/src/commonMain/kotlin/androidx/compose/ui/graphics/InlineClassHelper.kt
index 724538e..1a191a4 100644
--- a/compose/ui/ui-graphics/src/commonMain/kotlin/androidx/compose/ui/graphics/InlineClassHelper.kt
+++ b/compose/ui/ui-graphics/src/commonMain/kotlin/androidx/compose/ui/graphics/InlineClassHelper.kt
@@ -30,9 +30,7 @@
 @Suppress("BanInlineOptIn") // same opt-in as using Kotlin's require()
 @OptIn(ExperimentalContracts::class)
 internal inline fun requirePrecondition(value: Boolean, lazyMessage: () -> String) {
-    contract {
-        returns() implies value
-    }
+    contract { returns() implies value }
     if (!value) {
         throwIllegalArgumentException(lazyMessage())
     }
diff --git a/compose/ui/ui-graphics/src/commonMain/kotlin/androidx/compose/ui/graphics/IntervalTree.kt b/compose/ui/ui-graphics/src/commonMain/kotlin/androidx/compose/ui/graphics/IntervalTree.kt
index 04badc2..4c3e7ca 100644
--- a/compose/ui/ui-graphics/src/commonMain/kotlin/androidx/compose/ui/graphics/IntervalTree.kt
+++ b/compose/ui/ui-graphics/src/commonMain/kotlin/androidx/compose/ui/graphics/IntervalTree.kt
@@ -23,27 +23,22 @@
 // TODO: We should probably move this to androidx.collection
 
 /**
- * Interval in an [IntervalTree]. The interval is defined between a [start] and an [end]
- * coordinate, whose meanings are defined by the caller. An interval can also hold
- * arbitrary [data] to be used to looking at the result of queries with
- * [IntervalTree.findOverlaps].
+ * Interval in an [IntervalTree]. The interval is defined between a [start] and an [end] coordinate,
+ * whose meanings are defined by the caller. An interval can also hold arbitrary [data] to be used
+ * to looking at the result of queries with [IntervalTree.findOverlaps].
  */
 @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP_PREFIX)
 open class Interval<T>(val start: Float, val end: Float, val data: T? = null) {
-    /**
-     * Returns trues if this interval overlaps with another interval.
-     */
+    /** Returns trues if this interval overlaps with another interval. */
     fun overlaps(other: Interval<T>) = start <= other.end && end >= other.start
 
     /**
-     * Returns trues if this interval overlaps with the interval defined by [start]
-     * and [end]. [start] must be less than or equal to [end].
+     * Returns trues if this interval overlaps with the interval defined by [start] and [end].
+     * [start] must be less than or equal to [end].
      */
     fun overlaps(start: Float, end: Float) = this.start <= end && this.end >= start
 
-    /**
-     * Returns true if this interval contains [value].
-     */
+    /** Returns true if this interval contains [value]. */
     operator fun contains(value: Float) = value in start..end
 
     override fun equals(other: Any?): Boolean {
@@ -71,16 +66,13 @@
     }
 }
 
-/**
- * Represents an empty/invalid interval.
- */
+/** Represents an empty/invalid interval. */
 internal val EmptyInterval: Interval<Any?> = Interval(Float.MAX_VALUE, Float.MIN_VALUE, null)
 
 /**
- * An interval tree holds a list of intervals and allows for fast queries of intervals
- * that overlap any given interval. This can be used for instance to perform fast spatial
- * queries like finding all the segments in a path that overlap with a given vertical
- * interval.
+ * An interval tree holds a list of intervals and allows for fast queries of intervals that overlap
+ * any given interval. This can be used for instance to perform fast spatial queries like finding
+ * all the segments in a path that overlap with a given vertical interval.
  */
 @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP_PREFIX)
 class IntervalTree<T> {
@@ -94,41 +86,37 @@
     private val stack = ArrayList<Node>()
 
     /**
-     * Clears this tree and prepares it for reuse. After calling [clear], any call to
-     * [findOverlaps] returns false.
+     * Clears this tree and prepares it for reuse. After calling [clear], any call to [findOverlaps]
+     * returns false.
      */
     fun clear() {
         root = terminator
     }
 
     /**
-     * Finds the first interval that overlaps with the specified [interval]. If no overlap can
-     * be found, return [EmptyInterval].
+     * Finds the first interval that overlaps with the specified [interval]. If no overlap can be
+     * found, return [EmptyInterval].
      */
     fun findFirstOverlap(interval: ClosedFloatingPointRange<Float>) =
         findFirstOverlap(interval.start, interval.endInclusive)
 
     /**
-     * Finds the first interval that overlaps with the interval defined by [start] and [end].
-     * If no overlap can be found, return [EmptyInterval]. [start] *must* be lesser than or
-     * equal to [end].
+     * Finds the first interval that overlaps with the interval defined by [start] and [end]. If no
+     * overlap can be found, return [EmptyInterval]. [start] *must* be lesser than or equal to
+     * [end].
      */
-    fun findFirstOverlap(
-        start: Float,
-        end: Float = start
-    ): Interval<T> {
+    fun findFirstOverlap(start: Float, end: Float = start): Interval<T> {
         if (root !== terminator) {
             forEach(start, end) { interval ->
                 return interval
             }
         }
-        @Suppress("UNCHECKED_CAST")
-        return EmptyInterval as Interval<T>
+        @Suppress("UNCHECKED_CAST") return EmptyInterval as Interval<T>
     }
 
     /**
-     * Finds all the intervals that overlap with the specified [interval]. If [results]
-     * is specified, [results] is returned, otherwise a new [MutableList] is returned.
+     * Finds all the intervals that overlap with the specified [interval]. If [results] is
+     * specified, [results] is returned, otherwise a new [MutableList] is returned.
      */
     fun findOverlaps(
         interval: ClosedFloatingPointRange<Float>,
@@ -136,38 +124,30 @@
     ) = findOverlaps(interval.start, interval.endInclusive, results)
 
     /**
-     * Finds all the intervals that overlap with the interval defined by [start] and [end].
-     * [start] *must* be lesser than or equal to [end]. If [results] is specified, [results]
-     * is returned, otherwise a new [MutableList] is returned.
+     * Finds all the intervals that overlap with the interval defined by [start] and [end]. [start]
+     * *must* be lesser than or equal to [end]. If [results] is specified, [results] is returned,
+     * otherwise a new [MutableList] is returned.
      */
     fun findOverlaps(
         start: Float,
         end: Float = start,
         results: MutableList<Interval<T>> = mutableListOf()
     ): MutableList<Interval<T>> {
-        forEach(start, end) { interval ->
-            results.add(interval)
-        }
+        forEach(start, end) { interval -> results.add(interval) }
         return results
     }
 
-    /**
-     * Executes [block] for each interval that overlaps the specified [interval].
-     */
+    /** Executes [block] for each interval that overlaps the specified [interval]. */
     internal inline fun forEach(
         interval: ClosedFloatingPointRange<Float>,
         block: (Interval<T>) -> Unit
     ) = forEach(interval.start, interval.endInclusive, block)
 
     /**
-     * Executes [block] for each interval that overlaps with the interval defined by [start]
-     * and [end]. [start] *must* be lesser than or equal to [end].
+     * Executes [block] for each interval that overlaps with the interval defined by [start] and
+     * [end]. [start] *must* be lesser than or equal to [end].
      */
-    internal inline fun forEach(
-        start: Float,
-        end: Float = start,
-        block: (Interval<T>) -> Unit
-    ) {
+    internal inline fun forEach(start: Float, end: Float = start, block: (Interval<T>) -> Unit) {
         if (root !== terminator) {
             val s = stack
             s.add(root)
@@ -185,15 +165,10 @@
         }
     }
 
-    /**
-     * Returns true if [value] is inside any of the intervals in this tree.
-     */
+    /** Returns true if [value] is inside any of the intervals in this tree. */
     operator fun contains(value: Float) = findFirstOverlap(value, value) !== EmptyInterval
 
-    /**
-     * Returns true if the specified [interval] overlaps with any of the intervals
-     * in this tree.
-     */
+    /** Returns true if the specified [interval] overlaps with any of the intervals in this tree. */
     operator fun contains(interval: ClosedFloatingPointRange<Float>) =
         findFirstOverlap(interval.start, interval.endInclusive) !== EmptyInterval
 
@@ -213,9 +188,7 @@
         }
     }
 
-    /**
-     * Adds the specified [Interval] to the interval tree.
-     */
+    /** Adds the specified [Interval] to the interval tree. */
     operator fun plusAssign(interval: Interval<T>) {
         addInterval(interval.start, interval.end, interval.data)
     }
@@ -236,11 +209,12 @@
 
         while (current !== terminator) {
             parent = current
-            current = if (node.start <= current.start) {
-                current.left
-            } else {
-                current.right
-            }
+            current =
+                if (node.start <= current.start) {
+                    current.left
+                } else {
+                    current.right
+                }
         }
 
         node.parent = parent
@@ -365,15 +339,12 @@
     }
 
     internal enum class TreeColor {
-        Red, Black
+        Red,
+        Black
     }
 
-    internal inner class Node(
-        start: Float,
-        end: Float,
-        data: T?,
-        var color: TreeColor
-    ) : Interval<T>(start, end, data) {
+    internal inner class Node(start: Float, end: Float, data: T?, var color: TreeColor) :
+        Interval<T>(start, end, data) {
         var min: Float = start
         var max: Float = end
 
diff --git a/compose/ui/ui-graphics/src/commonMain/kotlin/androidx/compose/ui/graphics/Matrix.kt b/compose/ui/ui-graphics/src/commonMain/kotlin/androidx/compose/ui/graphics/Matrix.kt
index 3c9d0f2..42bcf20 100644
--- a/compose/ui/ui-graphics/src/commonMain/kotlin/androidx/compose/ui/graphics/Matrix.kt
+++ b/compose/ui/ui-graphics/src/commonMain/kotlin/androidx/compose/ui/graphics/Matrix.kt
@@ -41,12 +41,8 @@
 // DO NOT REMOVE THOSE TESTS.
 @kotlin.jvm.JvmInline
 value class Matrix(
-    val values: FloatArray = floatArrayOf(
-        1f, 0f, 0f, 0f,
-        0f, 1f, 0f, 0f,
-        0f, 0f, 1f, 0f,
-        0f, 0f, 0f, 1f
-    )
+    val values: FloatArray =
+        floatArrayOf(1f, 0f, 0f, 0f, 0f, 1f, 0f, 0f, 0f, 0f, 1f, 0f, 0f, 0f, 0f, 1f)
 ) {
     inline operator fun get(row: Int, column: Int) = values[(row * 4) + column]
 
@@ -54,9 +50,7 @@
         values[(row * 4) + column] = v
     }
 
-    /**
-     * Does the 3D transform on [point] and returns the `x` and `y` values in an [Offset].
-     */
+    /** Does the 3D transform on [point] and returns the `x` and `y` values in an [Offset]. */
     fun map(point: Offset): Offset {
         // See top-level comment
         if (values.size < 16) return point
@@ -73,9 +67,7 @@
         )
     }
 
-    /**
-     * Does a 3D transform on [rect] and returns its bounds after the transform.
-     */
+    /** Does a 3D transform on [rect] and returns its bounds after the transform. */
     fun map(rect: Rect): Rect {
         val p0 = map(Offset(rect.left, rect.top))
         val p1 = map(Offset(rect.left, rect.bottom))
@@ -89,9 +81,7 @@
         return Rect(left, top, right, bottom)
     }
 
-    /**
-     * Does a 3D transform on [rect], transforming [rect] with the results.
-     */
+    /** Does a 3D transform on [rect], transforming [rect] with the results. */
     fun map(rect: MutableRect) {
         val p0 = map(Offset(rect.left, rect.top))
         val p1 = map(Offset(rect.left, rect.bottom))
@@ -104,9 +94,7 @@
         rect.bottom = max(max(p0.y, p1.y), max(p3.y, p4.y))
     }
 
-    /**
-     * Multiply this matrix by [m] and assign the result to this matrix.
-     */
+    /** Multiply this matrix by [m] and assign the result to this matrix. */
     operator fun timesAssign(m: Matrix) {
         // See top-level comment
         val v = values
@@ -130,16 +118,16 @@
         val v32 = dot(this, 3, m, 2)
         val v33 = dot(this, 3, m, 3)
 
-        v[ 0] = v00
-        v[ 1] = v01
-        v[ 2] = v02
-        v[ 3] = v03
-        v[ 4] = v10
-        v[ 5] = v11
-        v[ 6] = v12
-        v[ 7] = v13
-        v[ 8] = v20
-        v[ 9] = v21
+        v[0] = v00
+        v[1] = v01
+        v[2] = v02
+        v[3] = v03
+        v[4] = v10
+        v[5] = v11
+        v[6] = v12
+        v[7] = v13
+        v[8] = v20
+        v[9] = v21
         v[10] = v22
         v[11] = v23
         v[12] = v30
@@ -154,12 +142,11 @@
             |${this[1, 0]} ${this[1, 1]} ${this[1, 2]} ${this[1, 3]}|
             |${this[2, 0]} ${this[2, 1]} ${this[2, 2]} ${this[2, 3]}|
             |${this[3, 0]} ${this[3, 1]} ${this[3, 2]} ${this[3, 3]}|
-        """.trimIndent()
+        """
+            .trimIndent()
     }
 
-    /**
-     * Invert `this` Matrix.
-     */
+    /** Invert `this` Matrix. */
     fun invert() {
         // See top-level comment
         if (values.size < 16) return
@@ -218,9 +205,7 @@
         this[3, 3] = ((a20 * b03 - a21 * b01 + a22 * b00) * invDet)
     }
 
-    /**
-     * Resets the `this` to the identity matrix.
-     */
+    /** Resets the `this` to the identity matrix. */
     fun reset() {
         // See top-level comment
         val v = values
@@ -252,16 +237,16 @@
         if (src.size < 16) return
         if (dst.size < 16) return
 
-        src[ 0] = dst[ 0]
-        src[ 1] = dst[ 1]
-        src[ 2] = dst[ 2]
-        src[ 3] = dst[ 3]
-        src[ 4] = dst[ 4]
-        src[ 5] = dst[ 5]
-        src[ 6] = dst[ 6]
-        src[ 7] = dst[ 7]
-        src[ 8] = dst[ 8]
-        src[ 9] = dst[ 9]
+        src[0] = dst[0]
+        src[1] = dst[1]
+        src[2] = dst[2]
+        src[3] = dst[3]
+        src[4] = dst[4]
+        src[5] = dst[5]
+        src[6] = dst[6]
+        src[7] = dst[7]
+        src[8] = dst[8]
+        src[9] = dst[9]
         src[10] = dst[10]
         src[11] = dst[11]
         src[12] = dst[12]
@@ -270,9 +255,7 @@
         src[15] = dst[15]
     }
 
-    /**
-     * Applies a [degrees] rotation around X to `this`.
-     */
+    /** Applies a [degrees] rotation around X to `this`. */
     fun rotateX(degrees: Float) {
         // See top-level comment
         if (values.size < 16) return
@@ -311,9 +294,7 @@
         this[3, 2] = v32
     }
 
-    /**
-     * Applies a [degrees] rotation around Y to `this`.
-     */
+    /** Applies a [degrees] rotation around Y to `this`. */
     fun rotateY(degrees: Float) {
         // See top-level comment
         if (values.size < 16) return
@@ -352,9 +333,7 @@
         this[3, 2] = v32
     }
 
-    /**
-     * Applies a [degrees] rotation around Z to `this`.
-     */
+    /** Applies a [degrees] rotation around Z to `this`. */
     fun rotateZ(degrees: Float) {
         // See top-level comment
         if (values.size < 16) return
@@ -415,22 +394,10 @@
     fun translate(x: Float = 0f, y: Float = 0f, z: Float = 0f) {
         // See top-level comment
         if (values.size < 16) return
-        val t1 = this[0, 0] * x +
-            this[1, 0] * y +
-            this[2, 0] * z +
-            this[3, 0]
-        val t2 = this[0, 1] * x +
-            this[1, 1] * y +
-            this[2, 1] * z +
-            this[3, 1]
-        val t3 = this[0, 2] * x +
-            this[1, 2] * y +
-            this[2, 2] * z +
-            this[3, 2]
-        val t4 = this[0, 3] * x +
-            this[1, 3] * y +
-            this[2, 3] * z +
-            this[3, 3]
+        val t1 = this[0, 0] * x + this[1, 0] * y + this[2, 0] * z + this[3, 0]
+        val t2 = this[0, 1] * x + this[1, 1] * y + this[2, 1] * z + this[3, 1]
+        val t3 = this[0, 2] * x + this[1, 2] * y + this[2, 2] * z + this[3, 2]
+        val t4 = this[0, 3] * x + this[1, 3] * y + this[2, 3] * z + this[3, 3]
         this[3, 0] = t1
         this[3, 1] = t2
         this[3, 2] = t3
@@ -438,9 +405,8 @@
     }
 
     /**
-     * Resets this matrix to a "TRS" (translation, rotation, scale) transform around a
-     * pivot point. The transform operations encoded in the matrix are the following,
-     * in this specific order:
+     * Resets this matrix to a "TRS" (translation, rotation, scale) transform around a pivot point.
+     * The transform operations encoded in the matrix are the following, in this specific order:
      * - A translation by -[pivotX], -[pivotY]
      * - A translation by [translationX], [translationY], and [translationZ]
      * - An X rotation by [rotationX]
@@ -556,59 +522,37 @@
     }
 
     companion object {
-        /**
-         * Index of the flattened array that represents the scale factor along the X axis
-         */
+        /** Index of the flattened array that represents the scale factor along the X axis */
         const val ScaleX = 0
 
-        /**
-         * Index of the flattened array that represents the skew factor along the Y axis
-         */
+        /** Index of the flattened array that represents the skew factor along the Y axis */
         const val SkewY = 1
 
-        /**
-         * Index of the flattened array that represents the perspective factor along the X axis
-         */
+        /** Index of the flattened array that represents the perspective factor along the X axis */
         const val Perspective0 = 3
 
-        /**
-         * Index of the flattened array that represents the skew factor along the X axis
-         */
+        /** Index of the flattened array that represents the skew factor along the X axis */
         const val SkewX = 4
 
-        /**
-         * Index of the flattened array that represents the scale factor along the Y axis
-         */
+        /** Index of the flattened array that represents the scale factor along the Y axis */
         const val ScaleY = 5
 
-        /**
-         * Index of the flattened array that represents the perspective factor along the Y axis
-         */
+        /** Index of the flattened array that represents the perspective factor along the Y axis */
         const val Perspective1 = 7
 
-        /**
-         * Index of the flattened array that represents the scale factor along the Z axis
-         */
+        /** Index of the flattened array that represents the scale factor along the Z axis */
         const val ScaleZ = 10
 
-        /**
-         * Index of the flattened array that represents the translation along the X axis
-         */
+        /** Index of the flattened array that represents the translation along the X axis */
         const val TranslateX = 12
 
-        /**
-         * Index of the flattened array that represents the translation along the Y axis
-         */
+        /** Index of the flattened array that represents the translation along the Y axis */
         const val TranslateY = 13
 
-        /**
-         * Index of the flattened array that represents the translation along the Z axis
-         */
+        /** Index of the flattened array that represents the translation along the Z axis */
         const val TranslateZ = 14
 
-        /**
-         * Index of the flattened array that represents the perspective factor along the Z axis
-         */
+        /** Index of the flattened array that represents the perspective factor along the Z axis */
         const val Perspective2 = 15
     }
 }
diff --git a/compose/ui/ui-graphics/src/commonMain/kotlin/androidx/compose/ui/graphics/Outline.kt b/compose/ui/ui-graphics/src/commonMain/kotlin/androidx/compose/ui/graphics/Outline.kt
index 0c20ed5..dd24fb0 100644
--- a/compose/ui/ui-graphics/src/commonMain/kotlin/androidx/compose/ui/graphics/Outline.kt
+++ b/compose/ui/ui-graphics/src/commonMain/kotlin/androidx/compose/ui/graphics/Outline.kt
@@ -32,13 +32,11 @@
 /**
  * Defines a simple shape, used for bounding graphical regions.
  *
- * Can be used for defining a shape of the component background, a shape of
- * shadows cast by the component, or to clip the contents.
+ * Can be used for defining a shape of the component background, a shape of shadows cast by the
+ * component, or to clip the contents.
  */
 sealed class Outline {
-    /**
-     * Rectangular area.
-     */
+    /** Rectangular area. */
     @Immutable
     class Rectangle(val rect: Rect) : Outline() {
 
@@ -58,26 +56,26 @@
             return rect.hashCode()
         }
     }
-    /**
-     * Rectangular area with rounded corners.
-     */
+
+    /** Rectangular area with rounded corners. */
     @Immutable
     class Rounded(val roundRect: RoundRect) : Outline() {
 
         /**
-         * Optional Path to be created for the RoundRect if the corner radii are not identical
-         * This is because Canvas has a built in API for drawing round rectangles with the
-         * same corner radii in all 4 corners. However, if each corner has a different
-         * corner radii, a path must be drawn instead
+         * Optional Path to be created for the RoundRect if the corner radii are not identical This
+         * is because Canvas has a built in API for drawing round rectangles with the same corner
+         * radii in all 4 corners. However, if each corner has a different corner radii, a path must
+         * be drawn instead
          */
         internal val roundRectPath: Path?
 
         init {
-            roundRectPath = if (!roundRect.isSimple) {
-                Path().apply { addRoundRect(roundRect) }
-            } else {
-                null
-            }
+            roundRectPath =
+                if (!roundRect.isSimple) {
+                    Path().apply { addRoundRect(roundRect) }
+                } else {
+                    null
+                }
         }
 
         override val bounds: Rect
@@ -96,6 +94,7 @@
             return roundRect.hashCode()
         }
     }
+
     /**
      * An area defined as a path.
      *
@@ -110,28 +109,25 @@
         // equal as the path may have changed since the previous outline was rendered
     }
 
-    /**
-     * Return the bounds of the outline
-     */
+    /** Return the bounds of the outline */
     abstract val bounds: Rect
 }
 
-/**
- * Adds the [outline] to the [Path].
- */
-fun Path.addOutline(outline: Outline) = when (outline) {
-    is Outline.Rectangle -> addRect(outline.rect)
-    is Outline.Rounded -> addRoundRect(outline.roundRect)
-    is Outline.Generic -> addPath(outline.path)
-}
+/** Adds the [outline] to the [Path]. */
+fun Path.addOutline(outline: Outline) =
+    when (outline) {
+        is Outline.Rectangle -> addRect(outline.rect)
+        is Outline.Rounded -> addRoundRect(outline.roundRect)
+        is Outline.Generic -> addPath(outline.path)
+    }
 
 /**
  * Draws the [Outline] on a [DrawScope].
  *
  * @param outline the outline to draw.
  * @param color Color applied to the outline when it is drawn
- * @param alpha Opacity to be applied to outline from 0.0f to 1.0f representing
- * fully transparent to fully opaque respectively
+ * @param alpha Opacity to be applied to outline from 0.0f to 1.0f representing fully transparent to
+ *   fully opaque respectively
  * @param style Specifies whether the outline is stroked or filled in
  * @param colorFilter: ColorFilter to apply to the [color] when drawn into the destination
  * @param blendMode: Blending algorithm to be applied to the outline
@@ -143,34 +139,35 @@
     style: DrawStyle = Fill,
     colorFilter: ColorFilter? = null,
     blendMode: BlendMode = DrawScope.DefaultBlendMode
-) = drawOutlineHelper(
-    outline,
-    { rect ->
-        drawRect(color, rect.topLeft(), rect.size(), alpha, style, colorFilter, blendMode)
-    },
-    { rrect ->
-        val radius = rrect.bottomLeftCornerRadius.x
-        drawRoundRect(
-            color = color,
-            topLeft = rrect.topLeft(),
-            size = rrect.size(),
-            cornerRadius = CornerRadius(radius),
-            alpha = alpha,
-            style = style,
-            colorFilter = colorFilter,
-            blendMode = blendMode
-        )
-    },
-    { path -> drawPath(path, color, alpha, style, colorFilter, blendMode) }
-)
+) =
+    drawOutlineHelper(
+        outline,
+        { rect ->
+            drawRect(color, rect.topLeft(), rect.size(), alpha, style, colorFilter, blendMode)
+        },
+        { rrect ->
+            val radius = rrect.bottomLeftCornerRadius.x
+            drawRoundRect(
+                color = color,
+                topLeft = rrect.topLeft(),
+                size = rrect.size(),
+                cornerRadius = CornerRadius(radius),
+                alpha = alpha,
+                style = style,
+                colorFilter = colorFilter,
+                blendMode = blendMode
+            )
+        },
+        { path -> drawPath(path, color, alpha, style, colorFilter, blendMode) }
+    )
 
 /**
  * Draws the [Outline] on a [DrawScope].
  *
  * @param outline the outline to draw.
  * @param brush Brush applied to the outline when it is drawn
- * @param alpha Opacity to be applied to outline from 0.0f to 1.0f representing
- * fully transparent to fully opaque respectively
+ * @param alpha Opacity to be applied to outline from 0.0f to 1.0f representing fully transparent to
+ *   fully opaque respectively
  * @param style Specifies whether the outline is stroked or filled in
  * @param colorFilter: ColorFilter to apply to the [Brush] when drawn into the destination
  * @param blendMode: Blending algorithm to be applied to the outline
@@ -182,72 +179,66 @@
     style: DrawStyle = Fill,
     colorFilter: ColorFilter? = null,
     blendMode: BlendMode = DrawScope.DefaultBlendMode
-) = drawOutlineHelper(
-    outline,
-    { rect ->
-        drawRect(brush, rect.topLeft(), rect.size(), alpha, style, colorFilter, blendMode)
-    },
-    { rrect ->
-        val radius = rrect.bottomLeftCornerRadius.x
-        drawRoundRect(
-            brush = brush,
-            topLeft = rrect.topLeft(),
-            size = rrect.size(),
-            cornerRadius = CornerRadius(radius),
-            alpha = alpha,
-            style = style,
-            colorFilter = colorFilter,
-            blendMode = blendMode
-        )
-    },
-    { path -> drawPath(path, brush, alpha, style, colorFilter, blendMode) }
-)
+) =
+    drawOutlineHelper(
+        outline,
+        { rect ->
+            drawRect(brush, rect.topLeft(), rect.size(), alpha, style, colorFilter, blendMode)
+        },
+        { rrect ->
+            val radius = rrect.bottomLeftCornerRadius.x
+            drawRoundRect(
+                brush = brush,
+                topLeft = rrect.topLeft(),
+                size = rrect.size(),
+                cornerRadius = CornerRadius(radius),
+                alpha = alpha,
+                style = style,
+                colorFilter = colorFilter,
+                blendMode = blendMode
+            )
+        },
+        { path -> drawPath(path, brush, alpha, style, colorFilter, blendMode) }
+    )
 
-/**
- * Convenience method to obtain an Offset from the Rect's top and left parameters
- */
+/** Convenience method to obtain an Offset from the Rect's top and left parameters */
 private fun Rect.topLeft(): Offset = Offset(left, top)
 
-/**
- * Convenience method to obtain a Size from the Rect's width and height
- */
+/** Convenience method to obtain a Size from the Rect's width and height */
 private fun Rect.size(): Size = Size(width, height)
 
-/**
- * Convenience method to obtain an Offset from the RoundRect's top and left parameters
- */
+/** Convenience method to obtain an Offset from the RoundRect's top and left parameters */
 private fun RoundRect.topLeft(): Offset = Offset(left, top)
 
-/**
- * Convenience method to obtain a Size from the RoundRect's width and height parameters
- */
+/** Convenience method to obtain a Size from the RoundRect's width and height parameters */
 private fun RoundRect.size(): Size = Size(width, height)
 
 /**
- * Helper method that allows for delegation of appropriate drawing call based on type of
- * underlying outline shape
+ * Helper method that allows for delegation of appropriate drawing call based on type of underlying
+ * outline shape
  */
 private inline fun DrawScope.drawOutlineHelper(
     outline: Outline,
     drawRectBlock: DrawScope.(rect: Rect) -> Unit,
     drawRoundedRectBlock: DrawScope.(rrect: RoundRect) -> Unit,
     drawPathBlock: DrawScope.(path: Path) -> Unit
-) = when (outline) {
-    is Outline.Rectangle -> drawRectBlock(outline.rect)
-    is Outline.Rounded -> {
-        val path = outline.roundRectPath
-        // If the rounded rect has a path, then the corner radii are not the same across
-        // each of the corners, so we draw the given path.
-        // If there is no path available, then the corner radii are identical so call the
-        // Canvas primitive for drawing a rounded rectangle
-        if (path != null) {
-            drawPathBlock(path)
-        } else {
-            drawRoundedRectBlock(outline.roundRect)
+) =
+    when (outline) {
+        is Outline.Rectangle -> drawRectBlock(outline.rect)
+        is Outline.Rounded -> {
+            val path = outline.roundRectPath
+            // If the rounded rect has a path, then the corner radii are not the same across
+            // each of the corners, so we draw the given path.
+            // If there is no path available, then the corner radii are identical so call the
+            // Canvas primitive for drawing a rounded rectangle
+            if (path != null) {
+                drawPathBlock(path)
+            } else {
+                drawRoundedRectBlock(outline.roundRect)
+            }
         }
+        is Outline.Generic -> drawPathBlock(outline.path)
     }
-    is Outline.Generic -> drawPathBlock(outline.path)
-}
 
 /**
  * Draws the [Outline] on a [Canvas].
@@ -255,42 +246,45 @@
  * @param outline the outline to draw.
  * @param paint the paint used for the drawing.
  */
-fun Canvas.drawOutline(outline: Outline, paint: Paint) = when (outline) {
-    is Outline.Rectangle -> drawRect(outline.rect, paint)
-    is Outline.Rounded -> {
-        val path = outline.roundRectPath
-        // If the rounded rect has a path, then the corner radii are not the same across
-        // each of the corners, so we draw the given path.
-        // If there is no path available, then the corner radii are identical so call the
-        // Canvas primitive for drawing a rounded rectangle
-        if (path != null) {
-            drawPath(path, paint)
-        } else {
-            drawRoundRect(
-                left = outline.roundRect.left,
-                top = outline.roundRect.top,
-                right = outline.roundRect.right,
-                bottom = outline.roundRect.bottom,
-                radiusX = outline.roundRect.bottomLeftCornerRadius.x,
-                radiusY = outline.roundRect.bottomLeftCornerRadius.y,
-                paint = paint
-            )
+fun Canvas.drawOutline(outline: Outline, paint: Paint) =
+    when (outline) {
+        is Outline.Rectangle -> drawRect(outline.rect, paint)
+        is Outline.Rounded -> {
+            val path = outline.roundRectPath
+            // If the rounded rect has a path, then the corner radii are not the same across
+            // each of the corners, so we draw the given path.
+            // If there is no path available, then the corner radii are identical so call the
+            // Canvas primitive for drawing a rounded rectangle
+            if (path != null) {
+                drawPath(path, paint)
+            } else {
+                drawRoundRect(
+                    left = outline.roundRect.left,
+                    top = outline.roundRect.top,
+                    right = outline.roundRect.right,
+                    bottom = outline.roundRect.bottom,
+                    radiusX = outline.roundRect.bottomLeftCornerRadius.x,
+                    radiusY = outline.roundRect.bottomLeftCornerRadius.y,
+                    paint = paint
+                )
+            }
         }
+        is Outline.Generic -> drawPath(outline.path, paint)
     }
-    is Outline.Generic -> drawPath(outline.path, paint)
-}
 
 /**
- * Convenience method to determine if the corner radii of the RoundRect are identical
- * in each of the corners. That is the x radius and the y radius are the same for each corner,
- * however, the x and y can be different
+ * Convenience method to determine if the corner radii of the RoundRect are identical in each of the
+ * corners. That is the x radius and the y radius are the same for each corner, however, the x and y
+ * can be different
  */
 private fun RoundRect.hasSameCornerRadius(): Boolean {
-    val sameRadiusX = bottomLeftCornerRadius.x == bottomRightCornerRadius.x &&
-        bottomRightCornerRadius.x == topRightCornerRadius.x &&
-        topRightCornerRadius.x == topLeftCornerRadius.x
-    val sameRadiusY = bottomLeftCornerRadius.y == bottomRightCornerRadius.y &&
-        bottomRightCornerRadius.y == topRightCornerRadius.y &&
-        topRightCornerRadius.y == topLeftCornerRadius.y
+    val sameRadiusX =
+        bottomLeftCornerRadius.x == bottomRightCornerRadius.x &&
+            bottomRightCornerRadius.x == topRightCornerRadius.x &&
+            topRightCornerRadius.x == topLeftCornerRadius.x
+    val sameRadiusY =
+        bottomLeftCornerRadius.y == bottomRightCornerRadius.y &&
+            bottomRightCornerRadius.y == topRightCornerRadius.y &&
+            topRightCornerRadius.y == topLeftCornerRadius.y
     return sameRadiusX && sameRadiusY
 }
diff --git a/compose/ui/ui-graphics/src/commonMain/kotlin/androidx/compose/ui/graphics/Paint.kt b/compose/ui/ui-graphics/src/commonMain/kotlin/androidx/compose/ui/graphics/Paint.kt
index 18455ca..357e9b6 100644
--- a/compose/ui/ui-graphics/src/commonMain/kotlin/androidx/compose/ui/graphics/Paint.kt
+++ b/compose/ui/ui-graphics/src/commonMain/kotlin/androidx/compose/ui/graphics/Paint.kt
@@ -16,9 +16,7 @@
 
 package androidx.compose.ui.graphics
 
-/**
- * Default alpha value used on [Paint]. This value will draw source content fully opaque.
- */
+/** Default alpha value used on [Paint]. This value will draw source content fully opaque. */
 const val DefaultAlpha: Float = 1.0f
 
 expect class NativePaint
@@ -29,91 +27,74 @@
     fun asFrameworkPaint(): NativePaint
 
     /**
-     * Configures the alpha value between 0f to 1f representing fully transparent to fully
-     * opaque for the color drawn with this Paint
+     * Configures the alpha value between 0f to 1f representing fully transparent to fully opaque
+     * for the color drawn with this Paint
      */
     var alpha: Float
 
-    /**
-     * Whether to apply anti-aliasing to lines and images drawn on the
-     * canvas.
-     * Defaults to true.
-     */
+    /** Whether to apply anti-aliasing to lines and images drawn on the canvas. Defaults to true. */
     var isAntiAlias: Boolean
 
     /**
-     * The color to use when stroking or filling a shape.
-     * Defaults to opaque black.
-     * See also:
-     * [style], which controls whether to stroke or fill (or both).
-     * [colorFilter], which overrides [color].
-     * [shader], which overrides [color] with more elaborate effects.
-     * This color is not used when compositing. To colorize a layer, use [colorFilter].
+     * The color to use when stroking or filling a shape. Defaults to opaque black. See also:
+     * [style], which controls whether to stroke or fill (or both). [colorFilter], which overrides
+     * [color]. [shader], which overrides [color] with more elaborate effects. This color is not
+     * used when compositing. To colorize a layer, use [colorFilter].
      */
     var color: Color
 
     /**
-     * A blend mode to apply when a shape is drawn or a layer is composited.
-     * The source colors are from the shape being drawn (e.g. from
-     * [Canvas.drawPath]) or layer being composited (the graphics that were drawn
-     * between the [Canvas.saveLayer] and [Canvas.restore] calls), after applying
-     * the [colorFilter], if any.
-     * The destination colors are from the background onto which the shape or
-     * layer is being composited.
-     * Defaults to [BlendMode.SrcOver].
-     * See also:
-     * [Canvas.saveLayer], which uses its [Paint]'s [blendMode] to composite
-     * the layer when [Canvas.restore] is called.
-     * [BlendMode], which discusses the user of [Canvas.saveLayer] with [blendMode].
+     * A blend mode to apply when a shape is drawn or a layer is composited. The source colors are
+     * from the shape being drawn (e.g. from [Canvas.drawPath]) or layer being composited (the
+     * graphics that were drawn between the [Canvas.saveLayer] and [Canvas.restore] calls), after
+     * applying the [colorFilter], if any. The destination colors are from the background onto which
+     * the shape or layer is being composited. Defaults to [BlendMode.SrcOver]. See also:
+     * [Canvas.saveLayer], which uses its [Paint]'s [blendMode] to composite the layer when
+     * [Canvas.restore] is called. [BlendMode], which discusses the user of [Canvas.saveLayer] with
+     * [blendMode].
      */
     var blendMode: BlendMode
 
     /**
-     * Whether to paint inside shapes, the edges of shapes, or both.
-     * Defaults to [PaintingStyle.Fill].
+     * Whether to paint inside shapes, the edges of shapes, or both. Defaults to
+     * [PaintingStyle.Fill].
      */
     var style: PaintingStyle
 
     /**
-     * How wide to make edges drawn when [style] is set to
-     * [PaintingStyle.Stroke]. The width is given in logical pixels measured in
-     * the direction orthogonal to the direction of the path.
+     * How wide to make edges drawn when [style] is set to [PaintingStyle.Stroke]. The width is
+     * given in logical pixels measured in the direction orthogonal to the direction of the path.
      * Defaults to 0.0, which correspond to a hairline width.
      */
     var strokeWidth: Float
 
     /**
-     * The kind of finish to place on the end of lines drawn when
-     * [style] is set to [PaintingStyle.Stroke].
-     * Defaults to [StrokeCap.Butt], i.e. no caps.
+     * The kind of finish to place on the end of lines drawn when [style] is set to
+     * [PaintingStyle.Stroke]. Defaults to [StrokeCap.Butt], i.e. no caps.
      */
     var strokeCap: StrokeCap
 
     /**
-     * The kind of finish to place on the joins between segments.
-     * This applies to paths drawn when [style] is set to [PaintingStyle.Stroke],
-     * It does not apply to points drawn as lines with [Canvas.drawPoints].
-     * Defaults to [StrokeJoin.Miter], i.e. sharp corners. See also
+     * The kind of finish to place on the joins between segments. This applies to paths drawn when
+     * [style] is set to [PaintingStyle.Stroke], It does not apply to points drawn as lines with
+     * [Canvas.drawPoints]. Defaults to [StrokeJoin.Miter], i.e. sharp corners. See also
      * [strokeMiterLimit] to control when miters are replaced by bevels.
      */
     var strokeJoin: StrokeJoin
 
     /**
-     * The limit for miters to be drawn on segments when the join is set to
-     * [StrokeJoin.Miter] and the [style] is set to [PaintingStyle.Stroke]. If
-     * this limit is exceeded, then a [StrokeJoin.Bevel] join will be drawn
-     * instead. This may cause some 'popping' of the corners of a path if the
-     * angle between line segments is animated.
-     * This limit is expressed as a limit on the length of the miter.
-     * Defaults to 4.0.  Using zero as a limit will cause a [StrokeJoin.Bevel]
-     * join to be used all the time.
+     * The limit for miters to be drawn on segments when the join is set to [StrokeJoin.Miter] and
+     * the [style] is set to [PaintingStyle.Stroke]. If this limit is exceeded, then a
+     * [StrokeJoin.Bevel] join will be drawn instead. This may cause some 'popping' of the corners
+     * of a path if the angle between line segments is animated. This limit is expressed as a limit
+     * on the length of the miter. Defaults to 4.0. Using zero as a limit will cause a
+     * [StrokeJoin.Bevel] join to be used all the time.
      */
     var strokeMiterLimit: Float
 
     /**
-     * Controls the performance vs quality trade-off to use when applying
-     * when drawing images, as with [Canvas.drawImageRect]
-     * Defaults to [FilterQuality.Low].
+     * Controls the performance vs quality trade-off to use when applying when drawing images, as
+     * with [Canvas.drawImageRect] Defaults to [FilterQuality.Low].
      */
     var filterQuality: FilterQuality
 
@@ -122,25 +103,20 @@
      *
      * When this is null, the [color] is used instead.
      *
-     * See also:
-     * [LinearGradientShader], [RadialGradientShader], or [SweepGradientShader] shaders that
-     * paint a color gradient.
-     * [ImageShader], a shader that tiles an [ImageBitmap].
-     * [colorFilter], which overrides [shader].
-     * [color], which is used if [shader] and [colorFilter] are null.
+     * See also: [LinearGradientShader], [RadialGradientShader], or [SweepGradientShader] shaders
+     * that paint a color gradient. [ImageShader], a shader that tiles an [ImageBitmap].
+     * [colorFilter], which overrides [shader]. [color], which is used if [shader] and [colorFilter]
+     * are null.
      */
     var shader: Shader?
 
     /**
-     *  A color filter to apply when a shape is drawn or when a layer is
-     *  composited.
-     *  See [ColorFilter] for details.
-     *  When a shape is being drawn, [colorFilter] overrides [color] and [shader].
+     * A color filter to apply when a shape is drawn or when a layer is composited. See
+     * [ColorFilter] for details. When a shape is being drawn, [colorFilter] overrides [color] and
+     * [shader].
      */
     var colorFilter: ColorFilter?
 
-    /**
-     * Specifies the [PathEffect] applied to the geometry of the shape that is drawn
-     */
+    /** Specifies the [PathEffect] applied to the geometry of the shape that is drawn */
     var pathEffect: PathEffect?
 }
diff --git a/compose/ui/ui-graphics/src/commonMain/kotlin/androidx/compose/ui/graphics/PaintingStyle.kt b/compose/ui/ui-graphics/src/commonMain/kotlin/androidx/compose/ui/graphics/PaintingStyle.kt
index 20787937..8d0d31a 100644
--- a/compose/ui/ui-graphics/src/commonMain/kotlin/androidx/compose/ui/graphics/PaintingStyle.kt
+++ b/compose/ui/ui-graphics/src/commonMain/kotlin/androidx/compose/ui/graphics/PaintingStyle.kt
@@ -30,24 +30,23 @@
     companion object {
 
         /**
-         * Apply the [Paint] to the inside of the shape. For example, when
-         * applied to the [Canvas.drawCircle] call, this results in a disc
-         * of the given size being painted.
+         * Apply the [Paint] to the inside of the shape. For example, when applied to the
+         * [Canvas.drawCircle] call, this results in a disc of the given size being painted.
          */
         val Fill = PaintingStyle(0)
 
         /**
-         * Apply the [Paint] to the edge of the shape. For example, when
-         * applied to the [Canvas.drawCircle] call, this results is a hoop
-         * of the given size being painted. The line drawn on the edge will
-         * be the width given by the [Paint.strokeWidth] property.
+         * Apply the [Paint] to the edge of the shape. For example, when applied to the
+         * [Canvas.drawCircle] call, this results is a hoop of the given size being painted. The
+         * line drawn on the edge will be the width given by the [Paint.strokeWidth] property.
          */
         val Stroke = PaintingStyle(1)
     }
 
-    override fun toString() = when (this) {
-        Fill -> "Fill"
-        Stroke -> "Stroke"
-        else -> "Unknown"
-    }
+    override fun toString() =
+        when (this) {
+            Fill -> "Fill"
+            Stroke -> "Stroke"
+            else -> "Unknown"
+        }
 }
diff --git a/compose/ui/ui-graphics/src/commonMain/kotlin/androidx/compose/ui/graphics/Path.kt b/compose/ui/ui-graphics/src/commonMain/kotlin/androidx/compose/ui/graphics/Path.kt
index bffc12d..deb3ff5 100644
--- a/compose/ui/ui-graphics/src/commonMain/kotlin/androidx/compose/ui/graphics/Path.kt
+++ b/compose/ui/ui-graphics/src/commonMain/kotlin/androidx/compose/ui/graphics/Path.kt
@@ -23,25 +23,19 @@
 
 expect fun Path(): Path
 
-/**
- * Create a new path, copying the contents from the src path.
- */
+/** Create a new path, copying the contents from the src path. */
 fun Path.copy(): Path = Path().apply { addPath(this@copy) }
 
 @JvmDefaultWithCompatibility
 /* expect class */ interface Path {
     /**
-     * Specifies how closed shapes (e.g. rectangles, ovals) are wound (oriented)
-     * when they are added to a path.
+     * Specifies how closed shapes (e.g. rectangles, ovals) are wound (oriented) when they are added
+     * to a path.
      */
     enum class Direction {
-        /**
-         * The shape is wound in counter-clockwise order.
-         */
+        /** The shape is wound in counter-clockwise order. */
         CounterClockwise,
-        /**
-         * The shape is wound in clockwise order.
-         */
+        /** The shape is wound in clockwise order. */
         Clockwise
     }
 
@@ -55,11 +49,10 @@
     /**
      * Returns the path's convexity, as defined by the content of the path.
      *
-     * A path is convex if it has a single contour, and only ever curves in a
-     * single direction.
+     * A path is convex if it has a single contour, and only ever curves in a single direction.
      *
-     * This function will calculate the convexity of the path from its control
-     * points, and cache the result.
+     * This function will calculate the convexity of the path from its control points, and cache the
+     * result.
      */
     val isConvex: Boolean
 
@@ -70,31 +63,24 @@
      */
     val isEmpty: Boolean
 
-    /**
-     * Starts a new subpath at the given coordinate
-     */
+    /** Starts a new subpath at the given coordinate */
     fun moveTo(x: Float, y: Float)
 
-    /**
-     * Starts a new subpath at the given offset from the current point
-     */
+    /** Starts a new subpath at the given offset from the current point */
     fun relativeMoveTo(dx: Float, dy: Float)
 
-    /**
-     * Adds a straight line segment from the current point to the given point
-     */
+    /** Adds a straight line segment from the current point to the given point */
     fun lineTo(x: Float, y: Float)
 
     /**
-     * Adds a straight line segment from the current point to the point
-     * at the given offset from the current point.
+     * Adds a straight line segment from the current point to the point at the given offset from the
+     * current point.
      */
     fun relativeLineTo(dx: Float, dy: Float)
 
     /**
-     * Adds a quadratic bezier segment that curves from the current
-     * point to the given point ([x2], [y2]), using the control point
-     * ([x1], [y1]).
+     * Adds a quadratic bezier segment that curves from the current point to the given point ([x2],
+     * [y2]), using the control point ([x1], [y1]).
      */
     @Deprecated(
         "Use quadraticTo() for consistency with cubicTo()",
@@ -104,20 +90,17 @@
     fun quadraticBezierTo(x1: Float, y1: Float, x2: Float, y2: Float)
 
     /**
-     * Adds a quadratic bezier segment that curves from the current
-     * point to the given point ([x2], [y2]), using the control point
-     * ([x1], [y1]).
+     * Adds a quadratic bezier segment that curves from the current point to the given point ([x2],
+     * [y2]), using the control point ([x1], [y1]).
      */
     fun quadraticTo(x1: Float, y1: Float, x2: Float, y2: Float) {
-        @Suppress("DEPRECATION")
-        quadraticBezierTo(x1, y1, x2, y2)
+        @Suppress("DEPRECATION") quadraticBezierTo(x1, y1, x2, y2)
     }
 
     /**
-     * Adds a quadratic bezier segment that curves from the current
-     * point to the point at the offset ([dx2], [dy2]) from the current point,
-     * using the control point at the offset ([dx1], [dy1]) from the current
-     * point.
+     * Adds a quadratic bezier segment that curves from the current point to the point at the offset
+     * ([dx2], [dy2]) from the current point, using the control point at the offset ([dx1], [dy1])
+     * from the current point.
      */
     @Deprecated(
         "Use relativeQuadraticTo() for consistency with relativeCubicTo()",
@@ -127,48 +110,40 @@
     fun relativeQuadraticBezierTo(dx1: Float, dy1: Float, dx2: Float, dy2: Float)
 
     /**
-     * Adds a quadratic bezier segment that curves from the current
-     * point to the point at the offset ([dx2], [dy2]) from the current point,
-     * using the control point at the offset ([dx1], [dy1]) from the current
-     * point.
+     * Adds a quadratic bezier segment that curves from the current point to the point at the offset
+     * ([dx2], [dy2]) from the current point, using the control point at the offset ([dx1], [dy1])
+     * from the current point.
      */
     fun relativeQuadraticTo(dx1: Float, dy1: Float, dx2: Float, dy2: Float) {
-        @Suppress("DEPRECATION")
-        relativeQuadraticBezierTo(dx1, dy1, dx2, dy2)
+        @Suppress("DEPRECATION") relativeQuadraticBezierTo(dx1, dy1, dx2, dy2)
     }
 
     /**
-     * Adds a cubic bezier segment that curves from the current point
-     * to the given point ([x3], [y3]), using the control points ([x1], [y1]) and
-     * ([x2], [y2]).
+     * Adds a cubic bezier segment that curves from the current point to the given point ([x3],
+     * [y3]), using the control points ([x1], [y1]) and ([x2], [y2]).
      */
     fun cubicTo(x1: Float, y1: Float, x2: Float, y2: Float, x3: Float, y3: Float)
 
     /**
-     * Adds a cubic bezier segment that curves from the current point
-     * to the point at the offset ([dx3], [dy3]) from the current point, using
-     * the control points at the offsets ([dx1], [dy1]) and ([dx2], [dy2]) from the
-     * current point.
+     * Adds a cubic bezier segment that curves from the current point to the point at the offset
+     * ([dx3], [dy3]) from the current point, using the control points at the offsets ([dx1], [dy1])
+     * and ([dx2], [dy2]) from the current point.
      */
     fun relativeCubicTo(dx1: Float, dy1: Float, dx2: Float, dy2: Float, dx3: Float, dy3: Float)
 
     /**
-     * If the [forceMoveTo] argument is false, adds a straight line
-     * segment and an arc segment.
+     * If the [forceMoveTo] argument is false, adds a straight line segment and an arc segment.
      *
-     * If the [forceMoveTo] argument is true, starts a new subpath
-     * consisting of an arc segment.
+     * If the [forceMoveTo] argument is true, starts a new subpath consisting of an arc segment.
      *
-     * In either case, the arc segment consists of the arc that follows
-     * the edge of the oval bounded by the given rectangle, from
-     * startAngle radians around the oval up to startAngle + sweepAngle
-     * radians around the oval, with zero radians being the point on
-     * the right hand side of the oval that crosses the horizontal line
-     * that intersects the center of the rectangle and with positive
-     * angles going clockwise around the oval.
+     * In either case, the arc segment consists of the arc that follows the edge of the oval bounded
+     * by the given rectangle, from startAngle radians around the oval up to startAngle + sweepAngle
+     * radians around the oval, with zero radians being the point on the right hand side of the oval
+     * that crosses the horizontal line that intersects the center of the rectangle and with
+     * positive angles going clockwise around the oval.
      *
-     * The line segment added if `forceMoveTo` is false starts at the
-     * current point and ends at the start of the arc.
+     * The line segment added if `forceMoveTo` is false starts at the current point and ends at the
+     * start of the arc.
      */
     fun arcToRad(
         rect: Rect,
@@ -180,33 +155,24 @@
     }
 
     /**
-     * If the [forceMoveTo] argument is false, adds a straight line
-     * segment and an arc segment.
+     * If the [forceMoveTo] argument is false, adds a straight line segment and an arc segment.
      *
-     * If the [forceMoveTo] argument is true, starts a new subpath
-     * consisting of an arc segment.
+     * If the [forceMoveTo] argument is true, starts a new subpath consisting of an arc segment.
      *
-     * In either case, the arc segment consists of the arc that follows
-     * the edge of the oval bounded by the given rectangle, from
-     * startAngle degrees around the oval up to startAngle + sweepAngle
-     * degrees around the oval, with zero degrees being the point on
-     * the right hand side of the oval that crosses the horizontal line
-     * that intersects the center of the rectangle and with positive
-     * angles going clockwise around the oval.
+     * In either case, the arc segment consists of the arc that follows the edge of the oval bounded
+     * by the given rectangle, from startAngle degrees around the oval up to startAngle + sweepAngle
+     * degrees around the oval, with zero degrees being the point on the right hand side of the oval
+     * that crosses the horizontal line that intersects the center of the rectangle and with
+     * positive angles going clockwise around the oval.
      *
-     * The line segment added if `forceMoveTo` is false starts at the
-     * current point and ends at the start of the arc.
+     * The line segment added if `forceMoveTo` is false starts at the current point and ends at the
+     * start of the arc.
      */
-    fun arcTo(
-        rect: Rect,
-        startAngleDegrees: Float,
-        sweepAngleDegrees: Float,
-        forceMoveTo: Boolean
-    )
+    fun arcTo(rect: Rect, startAngleDegrees: Float, sweepAngleDegrees: Float, forceMoveTo: Boolean)
 
     /**
-     * Adds a new subpath that consists of four lines that outline the
-     * given rectangle. The rectangle is wound counter-clockwise.
+     * Adds a new subpath that consists of four lines that outline the given rectangle. The
+     * rectangle is wound counter-clockwise.
      */
     @Deprecated(
         "Prefer usage of addRect() with a winding direction",
@@ -216,18 +182,17 @@
     fun addRect(rect: Rect)
 
     /**
-     * Adds a new subpath that consists of four lines that outline the
-     * given rectangle. The direction to wind the rectangle's contour
-     * is specified by [direction].
+     * Adds a new subpath that consists of four lines that outline the given rectangle. The
+     * direction to wind the rectangle's contour is specified by [direction].
      */
     fun addRect(rect: Rect, direction: Direction = Direction.CounterClockwise)
 
     /**
-     * Adds a new subpath that consists of a curve that forms the
-     * ellipse that fills the given rectangle.
+     * Adds a new subpath that consists of a curve that forms the ellipse that fills the given
+     * rectangle.
      *
-     * To add a circle, pass an appropriate rectangle as `oval`. [Rect]
-     * can be used to easily describe the circle's center [Offset] and radius.
+     * To add a circle, pass an appropriate rectangle as `oval`. [Rect] can be used to easily
+     * describe the circle's center [Offset] and radius.
      *
      * The oval is wound counter-clockwise.
      */
@@ -239,19 +204,19 @@
     fun addOval(oval: Rect)
 
     /**
-     * Adds a new subpath that consists of a curve that forms the
-     * ellipse that fills the given rectangle.
+     * Adds a new subpath that consists of a curve that forms the ellipse that fills the given
+     * rectangle.
      *
-     * To add a circle, pass an appropriate rectangle as `oval`. [Rect]
-     * can be used to easily describe the circle's center [Offset] and radius.
+     * To add a circle, pass an appropriate rectangle as `oval`. [Rect] can be used to easily
+     * describe the circle's center [Offset] and radius.
      *
      * The direction to wind the rectangle's contour is specified by [direction].
      */
     fun addOval(oval: Rect, direction: Direction = Direction.CounterClockwise)
 
     /**
-     * Add a round rectangle shape to the path from the given [RoundRect].
-     * The round rectangle is wound counter-clockwise.
+     * Add a round rectangle shape to the path from the given [RoundRect]. The round rectangle is
+     * wound counter-clockwise.
      */
     @Deprecated(
         "Prefer usage of addRoundRect() with a winding direction",
@@ -261,51 +226,42 @@
     fun addRoundRect(roundRect: RoundRect)
 
     /**
-     * Add a round rectangle shape to the path from the given [RoundRect].
-     * The direction to wind the rectangle's contour is specified by [direction].
+     * Add a round rectangle shape to the path from the given [RoundRect]. The direction to wind the
+     * rectangle's contour is specified by [direction].
      */
     fun addRoundRect(roundRect: RoundRect, direction: Direction = Direction.CounterClockwise)
 
     /**
-     * Adds a new subpath with one arc segment that consists of the arc
-     * that follows the edge of the oval bounded by the given
-     * rectangle, from startAngle radians around the oval up to
-     * startAngle + sweepAngle radians around the oval, with zero
-     * radians being the point on the right hand side of the oval that
-     * crosses the horizontal line that intersects the center of the
-     * rectangle and with positive angles going clockwise around the
-     * oval.
+     * Adds a new subpath with one arc segment that consists of the arc that follows the edge of the
+     * oval bounded by the given rectangle, from startAngle radians around the oval up to
+     * startAngle + sweepAngle radians around the oval, with zero radians being the point on the
+     * right hand side of the oval that crosses the horizontal line that intersects the center of
+     * the rectangle and with positive angles going clockwise around the oval.
      */
     fun addArcRad(oval: Rect, startAngleRadians: Float, sweepAngleRadians: Float)
 
     /**
-     * Adds a new subpath with one arc segment that consists of the arc
-     * that follows the edge of the oval bounded by the given
-     * rectangle, from startAngle degrees around the oval up to
-     * startAngle + sweepAngle degrees around the oval, with zero
-     * degrees being the point on the right hand side of the oval that
-     * crosses the horizontal line that intersects the center of the
-     * rectangle and with positive angles going clockwise around the
-     * oval.
+     * Adds a new subpath with one arc segment that consists of the arc that follows the edge of the
+     * oval bounded by the given rectangle, from startAngle degrees around the oval up to
+     * startAngle + sweepAngle degrees around the oval, with zero degrees being the point on the
+     * right hand side of the oval that crosses the horizontal line that intersects the center of
+     * the rectangle and with positive angles going clockwise around the oval.
      */
     fun addArc(oval: Rect, startAngleDegrees: Float, sweepAngleDegrees: Float)
 
-    /**
-     * Adds a new subpath that consists of the given `path` offset by the given
-     * `offset`.
-     */
+    /** Adds a new subpath that consists of the given `path` offset by the given `offset`. */
     fun addPath(path: Path, offset: Offset = Offset.Zero)
 
     /**
-     * Closes the last subpath, as if a straight line had been drawn
-     * from the current point to the first point of the subpath.
+     * Closes the last subpath, as if a straight line had been drawn from the current point to the
+     * first point of the subpath.
      */
     fun close()
 
     /**
-     * Clears the [Path] object of all subpaths, returning it to the
-     * same state it had when it was created. The _current point_ is
-     * reset to the origin. This does NOT change the fill-type setting.
+     * Clears the [Path] object of all subpaths, returning it to the same state it had when it was
+     * created. The _current point_ is reset to the origin. This does NOT change the fill-type
+     * setting.
      */
     fun reset()
 
@@ -319,114 +275,80 @@
         reset()
     }
 
-    /**
-     * Translates all the segments of every subpath by the given offset.
-     */
+    /** Translates all the segments of every subpath by the given offset. */
     fun translate(offset: Offset)
 
-    /**
-     * Transform the points in this path by the provided matrix
-     */
+    /** Transform the points in this path by the provided matrix */
     fun transform(matrix: Matrix) {
         // NO-OP to ensure runtime + compile time compatibility
     }
 
     /**
-     * Compute the bounds of the control points of the path, and write the
-     * answer into bounds. If the path contains 0 or 1 points, the bounds is
-     * set to (0,0,0,0)
+     * Compute the bounds of the control points of the path, and write the answer into bounds. If
+     * the path contains 0 or 1 points, the bounds is set to (0,0,0,0)
      */
     fun getBounds(): Rect
 
     /**
-     * Creates a new [PathIterator] for this [Path] that evaluates conics as quadratics.
-     * To preserve conics, use the [Path.iterator] function that takes a
-     * [PathIterator.ConicEvaluation] parameter.
+     * Creates a new [PathIterator] for this [Path] that evaluates conics as quadratics. To preserve
+     * conics, use the [Path.iterator] function that takes a [PathIterator.ConicEvaluation]
+     * parameter.
      */
     operator fun iterator() = PathIterator(this)
 
     /**
-     * Creates a new [PathIterator] for this [Path]. To preserve conics as conics (not
-     * convert them to quadratics), set [conicEvaluation] to [PathIterator.ConicEvaluation.AsConic].
+     * Creates a new [PathIterator] for this [Path]. To preserve conics as conics (not convert them
+     * to quadratics), set [conicEvaluation] to [PathIterator.ConicEvaluation.AsConic].
      *
      * @param conicEvaluation Indicates how to evaluate conic segments
      * @param tolerance When [conicEvaluation] is set to [PathIterator.ConicEvaluation.AsQuadratics]
-     *        defines the maximum distance between the original conic curve and its quadratic
-     *        approximations
+     *   defines the maximum distance between the original conic curve and its quadratic
+     *   approximations
      */
-    fun iterator(
-        conicEvaluation: PathIterator.ConicEvaluation,
-        tolerance: Float = 0.25f
-    ) = PathIterator(this, conicEvaluation, tolerance)
+    fun iterator(conicEvaluation: PathIterator.ConicEvaluation, tolerance: Float = 0.25f) =
+        PathIterator(this, conicEvaluation, tolerance)
 
     /**
-     * Set this path to the result of applying the Op to the two specified paths.
-     * The resulting path will be constructed from non-overlapping contours.
-     * The curve order is reduced where possible so that cubics may be turned
-     * into quadratics, and quadratics maybe turned into lines.
+     * Set this path to the result of applying the Op to the two specified paths. The resulting path
+     * will be constructed from non-overlapping contours. The curve order is reduced where possible
+     * so that cubics may be turned into quadratics, and quadratics maybe turned into lines.
      *
      * @param path1 The first operand (for difference, the minuend)
      * @param path2 The second operand (for difference, the subtrahend)
      * @param operation [PathOperation] to apply to the 2 specified paths
-     *
      * @return True if operation succeeded, false otherwise and this path remains unmodified.
      */
-    fun op(
-        path1: Path,
-        path2: Path,
-        operation: PathOperation
-    ): Boolean
+    fun op(path1: Path, path2: Path, operation: PathOperation): Boolean
 
-    /**
-     * Returns the union of two paths as a new [Path].
-     */
-    operator fun plus(path: Path) = Path().apply {
-        op(this@Path, path, PathOperation.Union)
-    }
+    /** Returns the union of two paths as a new [Path]. */
+    operator fun plus(path: Path) = Path().apply { op(this@Path, path, PathOperation.Union) }
 
-    /**
-     * Returns the difference of two paths as a new [Path].
-     */
-    operator fun minus(path: Path) = Path().apply {
-        op(this@Path, path, PathOperation.Difference)
-    }
+    /** Returns the difference of two paths as a new [Path]. */
+    operator fun minus(path: Path) = Path().apply { op(this@Path, path, PathOperation.Difference) }
 
-    /**
-     * Returns the union of two paths as a new [Path].
-     */
+    /** Returns the union of two paths as a new [Path]. */
     infix fun or(path: Path): Path = this + path
 
     /**
-     * Returns the intersection of two paths as a new [Path].
-     * If the paths do not intersect, returns an empty path.
+     * Returns the intersection of two paths as a new [Path]. If the paths do not intersect, returns
+     * an empty path.
      */
-    infix fun and(path: Path) = Path().apply {
-        op(this@Path, path, PathOperation.Intersect)
-    }
+    infix fun and(path: Path) = Path().apply { op(this@Path, path, PathOperation.Intersect) }
 
-    /**
-     * Returns the union minus the intersection of two paths as a new [Path].
-     */
-    infix fun xor(path: Path) = Path().apply {
-        op(this@Path, path, PathOperation.Xor)
-    }
+    /** Returns the union minus the intersection of two paths as a new [Path]. */
+    infix fun xor(path: Path) = Path().apply { op(this@Path, path, PathOperation.Xor) }
 
     companion object {
         /**
-         * Combines the two paths according to the manner specified by the given
-         * `operation`.
+         * Combines the two paths according to the manner specified by the given `operation`.
          *
-         * The resulting path will be constructed from non-overlapping contours. The
-         * curve order is reduced where possible so that cubics may be turned into
-         * quadratics, and quadratics maybe turned into lines.
+         * The resulting path will be constructed from non-overlapping contours. The curve order is
+         * reduced where possible so that cubics may be turned into quadratics, and quadratics maybe
+         * turned into lines.
          *
          * Throws [IllegalArgumentException] if the combining operation fails.
          */
-        fun combine(
-            operation: PathOperation,
-            path1: Path,
-            path2: Path
-        ): Path {
+        fun combine(operation: PathOperation, path1: Path, path2: Path): Path {
             val path = Path()
             if (path.op(path1, path2, operation)) {
                 return path
diff --git a/compose/ui/ui-graphics/src/commonMain/kotlin/androidx/compose/ui/graphics/PathEffect.kt b/compose/ui/ui-graphics/src/commonMain/kotlin/androidx/compose/ui/graphics/PathEffect.kt
index c70d534..41b57ec 100644
--- a/compose/ui/ui-graphics/src/commonMain/kotlin/androidx/compose/ui/graphics/PathEffect.kt
+++ b/compose/ui/ui-graphics/src/commonMain/kotlin/androidx/compose/ui/graphics/PathEffect.kt
@@ -19,9 +19,8 @@
 import androidx.compose.runtime.Immutable
 
 /**
- * Effect applied to the geometry of a drawing primitive. For example, this can be used
- * to draw shapes as a dashed or shaped pattern, or apply a treatment around line segment
- * intersections.
+ * Effect applied to the geometry of a drawing primitive. For example, this can be used to draw
+ * shapes as a dashed or shaped pattern, or apply a treatment around line segment intersections.
  */
 interface PathEffect {
     companion object {
@@ -34,18 +33,18 @@
         fun cornerPathEffect(radius: Float): PathEffect = actualCornerPathEffect(radius)
 
         /**
-         * Draws a shape as a series of dashes with the given intervals and offset into the specified
-         * interval array. The intervals must contain an even number of entries (>=2). The even indices
-         * specify "on" intervals and the odd indices represent "off" intervals. The phase parameter
-         * is the pixel offset into the intervals array (mod the sum of all of the intervals).
+         * Draws a shape as a series of dashes with the given intervals and offset into the
+         * specified interval array. The intervals must contain an even number of entries (>=2). The
+         * even indices specify "on" intervals and the odd indices represent "off" intervals. The
+         * phase parameter is the pixel offset into the intervals array (mod the sum of all of the
+         * intervals).
          *
-         * For example: if `intervals[] = {10, 20}`, and phase = 25, this will set up a dashed
-         * path like so: 5 pixels off 10 pixels on 20 pixels off 10 pixels on 20 pixels off
+         * For example: if `intervals[] = {10, 20}`, and phase = 25, this will set up a dashed path
+         * like so: 5 pixels off 10 pixels on 20 pixels off 10 pixels on 20 pixels off
          *
-         * The phase parameter is
-         * an offset into the intervals array. The intervals array
-         * controls the length of the dashes. This is only applied for stroked shapes
-         * (ex. [PaintingStyle.Stroke] and is ignored for filled in shapes (ex. [PaintingStyle.Fill]
+         * The phase parameter is an offset into the intervals array. The intervals array controls
+         * the length of the dashes. This is only applied for stroked shapes (ex.
+         * [PaintingStyle.Stroke] and is ignored for filled in shapes (ex. [PaintingStyle.Fill]
          *
          * @param intervals Array of "on" and "off" distances for the dashed line segments
          * @param phase Pixel offset into the intervals array
@@ -61,9 +60,9 @@
             actualChainPathEffect(outer, inner)
 
         /**
-         * Dash the drawn path by stamping it with the specified shape represented as a [Path].
-         * This is only applied to stroke shapes and will be ignored with filled shapes.
-         * The stroke width used with this [PathEffect] is ignored as well.
+         * Dash the drawn path by stamping it with the specified shape represented as a [Path]. This
+         * is only applied to stroke shapes and will be ignored with filled shapes. The stroke width
+         * used with this [PathEffect] is ignored as well.
          *
          * @param shape Path to stamp along
          * @param advance Spacing between each stamped shape
@@ -99,45 +98,46 @@
  */
 @Immutable
 @kotlin.jvm.JvmInline
-value class StampedPathEffectStyle internal constructor(
-    @Suppress("unused") private val value: Int
-) {
+value class StampedPathEffectStyle
+internal constructor(@Suppress("unused") private val value: Int) {
 
     companion object {
         /**
-         * Translate the path shape into the specified location aligning the top left of the path with
-         * the drawn geometry. This does not modify the path itself.
+         * Translate the path shape into the specified location aligning the top left of the path
+         * with the drawn geometry. This does not modify the path itself.
          *
          * For example, a circle drawn with a square path and [Translate] will draw the square path
-         * repeatedly with the top left corner of each stamped square along the curvature of the circle.
+         * repeatedly with the top left corner of each stamped square along the curvature of the
+         * circle.
          */
         val Translate = StampedPathEffectStyle(0)
 
         /**
-         * Rotates the path shape its center along the curvature of the drawn geometry. This does not
-         * modify the path itself.
+         * Rotates the path shape its center along the curvature of the drawn geometry. This does
+         * not modify the path itself.
          *
          * For example, a circle drawn with a square path and [Rotate] will draw the square path
-         * repeatedly with the center of each stamped square along the curvature of the circle as well
-         * as each square being rotated along the circumference.
+         * repeatedly with the center of each stamped square along the curvature of the circle as
+         * well as each square being rotated along the circumference.
          */
         val Rotate = StampedPathEffectStyle(1)
 
         /**
-         * Modifies the points within the path such that they fit within the drawn geometry. This will
-         * turn straight lines into curves.
+         * Modifies the points within the path such that they fit within the drawn geometry. This
+         * will turn straight lines into curves.
          *
          * For example, a circle drawn with a square path and [Morph] will modify the straight lines
-         * of the square paths to be curves such that each stamped square is rendered as an arc around
-         * the curvature of the circle.
+         * of the square paths to be curves such that each stamped square is rendered as an arc
+         * around the curvature of the circle.
          */
         val Morph = StampedPathEffectStyle(2)
     }
 
-    override fun toString() = when (this) {
-        Translate -> "Translate"
-        Rotate -> "Rotate"
-        Morph -> "Morph"
-        else -> "Unknown"
-    }
+    override fun toString() =
+        when (this) {
+            Translate -> "Translate"
+            Rotate -> "Rotate"
+            Morph -> "Morph"
+            else -> "Unknown"
+        }
 }
diff --git a/compose/ui/ui-graphics/src/commonMain/kotlin/androidx/compose/ui/graphics/PathFillType.kt b/compose/ui/ui-graphics/src/commonMain/kotlin/androidx/compose/ui/graphics/PathFillType.kt
index 495e199..883d578 100644
--- a/compose/ui/ui-graphics/src/commonMain/kotlin/androidx/compose/ui/graphics/PathFillType.kt
+++ b/compose/ui/ui-graphics/src/commonMain/kotlin/androidx/compose/ui/graphics/PathFillType.kt
@@ -19,8 +19,7 @@
 import androidx.compose.runtime.Immutable
 
 /**
- * Determines the winding rule that decides how the interior of a [Path] is
- * calculated.
+ * Determines the winding rule that decides how the interior of a [Path] is calculated.
  *
  * This enum is used by the [Path.fillType] property.
  */
@@ -31,10 +30,10 @@
         /**
          * The interior is defined by a non-zero sum of signed edge crossings.
          *
-         * For a given point, the point is considered to be on the inside of the path
-         * if a line drawn from the point to infinity crosses lines going clockwise
-         * around the point a different number of times than it crosses lines going
-         * counter-clockwise around that point.
+         * For a given point, the point is considered to be on the inside of the path if a line
+         * drawn from the point to infinity crosses lines going clockwise around the point a
+         * different number of times than it crosses lines going counter-clockwise around that
+         * point.
          *
          * See: <https://en.wikipedia.org/wiki/Nonzero-rule>
          */
@@ -43,17 +42,18 @@
         /**
          * The interior is defined by an odd number of edge crossings.
          *
-         * For a given point, the point is considered to be on the inside of the path
-         * if a line drawn from the point to infinity crosses an odd number of lines.
+         * For a given point, the point is considered to be on the inside of the path if a line
+         * drawn from the point to infinity crosses an odd number of lines.
          *
          * See: <https://en.wikipedia.org/wiki/Even-odd_rule>
          */
         val EvenOdd = PathFillType(1)
     }
 
-    override fun toString() = when (this) {
-        NonZero -> "NonZero"
-        EvenOdd -> "EvenOdd"
-        else -> "Unknown"
-    }
+    override fun toString() =
+        when (this) {
+            NonZero -> "NonZero"
+            EvenOdd -> "EvenOdd"
+            else -> "Unknown"
+        }
 }
diff --git a/compose/ui/ui-graphics/src/commonMain/kotlin/androidx/compose/ui/graphics/PathGeometry.kt b/compose/ui/ui-graphics/src/commonMain/kotlin/androidx/compose/ui/graphics/PathGeometry.kt
index a02386a..53b0d54 100644
--- a/compose/ui/ui-graphics/src/commonMain/kotlin/androidx/compose/ui/graphics/PathGeometry.kt
+++ b/compose/ui/ui-graphics/src/commonMain/kotlin/androidx/compose/ui/graphics/PathGeometry.kt
@@ -17,25 +17,21 @@
 package androidx.compose.ui.graphics
 
 /**
- * Computes this [Path]'s direction (or winding, or orientation), which can
- * be either [Path.Direction.Clockwise] or [Path.Direction.CounterClockwise].
+ * Computes this [Path]'s direction (or winding, or orientation), which can be either
+ * [Path.Direction.Clockwise] or [Path.Direction.CounterClockwise].
  *
- * If the path is made of multiple contours (the path contains multiple "move"
- * commands), the direction returned by this property is the direction of the
- * first contour.
+ * If the path is made of multiple contours (the path contains multiple "move" commands), the
+ * direction returned by this property is the direction of the first contour.
  *
- * If the path is empty (contains no lines/curves), the direction is
- * [Path.Direction.Clockwise].
+ * If the path is empty (contains no lines/curves), the direction is [Path.Direction.Clockwise].
  *
- * If the path has no area (single straight line), the direction is
- * [Path.Direction.Clockwise].
+ * If the path has no area (single straight line), the direction is [Path.Direction.Clockwise].
  *
- * Calling this property does not cache the result, the direction is computed
- * Calling this method does not cache the result, the direction is computed
- * every time the method is called.
+ * Calling this property does not cache the result, the direction is computed Calling this method
+ * does not cache the result, the direction is computed every time the method is called.
  *
- * If you need to query the direction of individual contours, you should
- * [divide][Path.divide] the path first.
+ * If you need to query the direction of individual contours, you should [divide][Path.divide] the
+ * path first.
  */
 fun Path.computeDirection(): Path.Direction {
     var first = true
@@ -84,16 +80,7 @@
                 // To compute the area, the placement of the control points does not
                 // matter as long as they are on the line. We set them to the start
                 // and end points to avoid extra computations.
-                area += cubicArea(
-                    x0,
-                    y0,
-                    x0,
-                    y0,
-                    x1,
-                    y1,
-                    x1,
-                    y1
-                )
+                area += cubicArea(x0, y0, x0, y0, x1, y1, x1, y1)
 
                 endX = x1
                 endY = y1
@@ -114,48 +101,31 @@
                 val c2x = x2 + 2.0f / 3.0f * (x1 - x2)
                 val c2y = y2 + 2.0f / 3.0f * (y1 - y2)
 
-                area += cubicArea(
-                    x0,
-                    y0,
-                    c1x,
-                    c1y,
-                    c2x,
-                    c2y,
-                    x2,
-                    y2
-                )
+                area += cubicArea(x0, y0, c1x, c1y, c2x, c2y, x2, y2)
 
                 endX = x2
                 endY = y2
             }
             PathSegment.Type.Conic -> continue // We convert conics to quadratics
             PathSegment.Type.Cubic -> {
-                area += cubicArea(
-                    points[0],
-                    points[1],
-                    points[2],
-                    points[3],
-                    points[4],
-                    points[5],
-                    points[6],
-                    points[7]
-                )
+                area +=
+                    cubicArea(
+                        points[0],
+                        points[1],
+                        points[2],
+                        points[3],
+                        points[4],
+                        points[5],
+                        points[6],
+                        points[7]
+                    )
 
                 endX = points[6]
                 endY = points[7]
             }
             PathSegment.Type.Close -> {
                 if (!endX.closeTo(startX) || !endY.closeTo(startY)) {
-                    area += cubicArea(
-                        endX,
-                        endY,
-                        endX,
-                        endY,
-                        startX,
-                        startY,
-                        startX,
-                        startY
-                    )
+                    area += cubicArea(endX, endY, endX, endY, startX, startY, startX, startY)
 
                     endX = startX
                     endY = startY
@@ -174,10 +144,8 @@
 }
 
 /**
- * Divides this path into a list of paths. Each contour inside this path is returned as
- * a separate [Path]. For instance the following code snippet creates two rectangular
- * contours:
- *
+ * Divides this path into a list of paths. Each contour inside this path is returned as a separate
+ * [Path]. For instance the following code snippet creates two rectangular contours:
  * ```
  * val p = Path()
  * p.addRect(...)
@@ -185,17 +153,16 @@
  *
  * val contours = p.divide()
  * ```
- * The list returned by calling `p.divide()` will contain two `Path` instances, each
- * representing one of the two rectangles.
+ *
+ * The list returned by calling `p.divide()` will contain two `Path` instances, each representing
+ * one of the two rectangles.
  *
  * Empty contours (contours with no lines/curves) are omitted from the resulting list.
  *
- * @param contours An optional mutable list of [Path] that will hold the result of the
- * division.
- *
- * @return A list of [Path] representing all the contours in this path. The returned list
- * is either a newly allocated list if the [contours] parameter was left unspecified, or
- * the [contours] parameter.
+ * @param contours An optional mutable list of [Path] that will hold the result of the division.
+ * @return A list of [Path] representing all the contours in this path. The returned list is either
+ *   a newly allocated list if the [contours] parameter was left unspecified, or the [contours]
+ *   parameter.
  */
 fun Path.divide(contours: MutableList<Path> = mutableListOf()): MutableList<Path> {
     var path = Path()
@@ -224,24 +191,12 @@
                 isEmpty = false
             }
             PathSegment.Type.Quadratic -> {
-                path.quadraticTo(
-                    points[2],
-                    points[3],
-                    points[4],
-                    points[5]
-                )
+                path.quadraticTo(points[2], points[3], points[4], points[5])
                 isEmpty = false
             }
             PathSegment.Type.Conic -> continue // We convert conics to quadratics
             PathSegment.Type.Cubic -> {
-                path.cubicTo(
-                    points[2],
-                    points[3],
-                    points[4],
-                    points[5],
-                    points[6],
-                    points[7]
-                )
+                path.cubicTo(points[2], points[3], points[4], points[5], points[6], points[7])
                 isEmpty = false
             }
             PathSegment.Type.Close -> path.close()
@@ -258,22 +213,20 @@
 }
 
 /**
- * Reverses the segments of this path into the specified [destination], turning
- * a clockwise path into a counter-clockwise path and vice-versa. Each contour
- * in the path is reversed independently, and the contours appear in the
- * [destination] in reverse order.
+ * Reverses the segments of this path into the specified [destination], turning a clockwise path
+ * into a counter-clockwise path and vice-versa. Each contour in the path is reversed independently,
+ * and the contours appear in the [destination] in reverse order.
  *
  * This method preserves the general structure of this path as much as possible:
- *
  * - Lines become lines
  * - Quadratic Bézier curves become quadratic Bézier curves
  * - Cubic Bézier curves become cubic Bézier curves
  * - Close and move commands remain close and move commands
  * - Conic segments become quadratic Bézier curves
  *
- * @return A [Path] containing the reverse of this [Path]. The returned path is
- * either a newly allocated [Path] if the [destination] parameter was left
- * unspecified, or the [destination] parameter.
+ * @return A [Path] containing the reverse of this [Path]. The returned path is either a newly
+ *   allocated [Path] if the [destination] parameter was left unspecified, or the [destination]
+ *   parameter.
  */
 fun Path.reverse(destination: Path = Path()): Path {
     val iterator = iterator()
@@ -323,23 +276,23 @@
                 dataIndex--
             }
             PathSegment.Type.Quadratic -> {
-                destination.quadraticTo(
-                    points[2], points[3],
-                    points[0], points[1]
-                )
+                destination.quadraticTo(points[2], points[3], points[0], points[1])
                 dataIndex--
             }
-            PathSegment.Type.Conic -> { } // won't happen, we convert to quadratics
+            PathSegment.Type.Conic -> {} // won't happen, we convert to quadratics
             PathSegment.Type.Cubic -> {
                 destination.cubicTo(
-                    points[4], points[5],
-                    points[2], points[3],
-                    points[0], points[1]
+                    points[4],
+                    points[5],
+                    points[2],
+                    points[3],
+                    points[0],
+                    points[1]
                 )
                 dataIndex--
             }
             PathSegment.Type.Close -> insertClose = true
-            PathSegment.Type.Done -> { } // won't happen, we filtered it out in the previous loop
+            PathSegment.Type.Done -> {} // won't happen, we filtered it out in the previous loop
         }
     }
 
@@ -350,12 +303,13 @@
     return destination
 }
 
-private fun floatCountForType(type: PathSegment.Type) = when (type) {
-    PathSegment.Type.Move -> 2
-    PathSegment.Type.Line -> 4
-    PathSegment.Type.Quadratic -> 6
-    PathSegment.Type.Conic -> 8 // won't happen
-    PathSegment.Type.Cubic -> 8
-    PathSegment.Type.Close -> 0
-    PathSegment.Type.Done -> 0
-}
+private fun floatCountForType(type: PathSegment.Type) =
+    when (type) {
+        PathSegment.Type.Move -> 2
+        PathSegment.Type.Line -> 4
+        PathSegment.Type.Quadratic -> 6
+        PathSegment.Type.Conic -> 8 // won't happen
+        PathSegment.Type.Cubic -> 8
+        PathSegment.Type.Close -> 0
+        PathSegment.Type.Done -> 0
+    }
diff --git a/compose/ui/ui-graphics/src/commonMain/kotlin/androidx/compose/ui/graphics/PathHitTester.kt b/compose/ui/ui-graphics/src/commonMain/kotlin/androidx/compose/ui/graphics/PathHitTester.kt
index 96df70f..f3fffc3 100644
--- a/compose/ui/ui-graphics/src/commonMain/kotlin/androidx/compose/ui/graphics/PathHitTester.kt
+++ b/compose/ui/ui-graphics/src/commonMain/kotlin/androidx/compose/ui/graphics/PathHitTester.kt
@@ -21,41 +21,33 @@
 import androidx.compose.ui.geometry.Rect
 
 /**
- * Creates a new [PathHitTester] to query whether certain x/y coordinates lie inside a
- * given [Path]. A [PathHitTester] is optimized to perform multiple queries against a
- * single path.
+ * Creates a new [PathHitTester] to query whether certain x/y coordinates lie inside a given [Path].
+ * A [PathHitTester] is optimized to perform multiple queries against a single path.
  *
  * The result of a query depends on the [fill type][Path.fillType] of the path.
  *
- * If the content of [path] changes, you must call [PathHitTester.updatePath] or create
- * a new [PathHitTester] as [PathHitTester] will cache precomputed values to speed up
- * queries.
+ * If the content of [path] changes, you must call [PathHitTester.updatePath] or create a new
+ * [PathHitTester] as [PathHitTester] will cache precomputed values to speed up queries.
  *
- * If [path] contains conic curves, they are converted to quadratic curves during the
- * query process. The tolerance of that conversion is defined by [tolerance]. The
- * tolerance should be appropriate to the coordinate systems used by the caller. For
- * instance if the path is defined in pixels, 0.5 (half a pixel) or 1.0 (a pixel) are
- * appropriate tolerances. If the path is normalized and defined in the domain 0..1,
- * the caller should choose a more appropriate tolerance close to or equal to one
- * "query unit". The tolerance must be >= 0.
+ * If [path] contains conic curves, they are converted to quadratic curves during the query process.
+ * The tolerance of that conversion is defined by [tolerance]. The tolerance should be appropriate
+ * to the coordinate systems used by the caller. For instance if the path is defined in pixels, 0.5
+ * (half a pixel) or 1.0 (a pixel) are appropriate tolerances. If the path is normalized and defined
+ * in the domain 0..1, the caller should choose a more appropriate tolerance close to or equal to
+ * one "query unit". The tolerance must be >= 0.
  *
  * @param path The [Path] to run queries against.
- * @param tolerance When [path] contains conic curves, defines the maximum distance between
- *        the original conic curve and its quadratic approximations. Set to 0.5 by default.
+ * @param tolerance When [path] contains conic curves, defines the maximum distance between the
+ *   original conic curve and its quadratic approximations. Set to 0.5 by default.
  */
-fun PathHitTester(
-    path: Path,
-    @FloatRange(from = 0.0) tolerance: Float = 0.5f
-) = PathHitTester().apply {
-    updatePath(path, tolerance)
-}
+fun PathHitTester(path: Path, @FloatRange(from = 0.0) tolerance: Float = 0.5f) =
+    PathHitTester().apply { updatePath(path, tolerance) }
 
 private val EmptyPath = Path()
 
 /**
- * A [PathHitTester] is used to query whether certain x/y coordinates lie inside a
- * given [Path]. A [PathHitTester] is optimized to perform multiple queries against a
- * single path.
+ * A [PathHitTester] is used to query whether certain x/y coordinates lie inside a given [Path]. A
+ * [PathHitTester] is optimized to perform multiple queries against a single path.
  */
 class PathHitTester {
     private var path = EmptyPath
@@ -76,18 +68,18 @@
     /**
      * Sets the [Path] to run queries against.
      *
-     * If [path] contains conic curves, they are converted to quadratic curves during the
-     * query process. This value defines the tolerance of that conversion.
+     * If [path] contains conic curves, they are converted to quadratic curves during the query
+     * process. This value defines the tolerance of that conversion.
      *
-     * The tolerance should be appropriate to the coordinate systems used by the caller.
-     * For instance if the path is defined in pixels, 0.5 (half a pixel) or 1.0 (a pixel)
-     * are appropriate tolerances. If the path is normalized and defined in the domain 0..1,
-     * the caller should choose a more appropriate tolerance close to or equal to one
-     * "query unit". The tolerance must be >= 0.
+     * The tolerance should be appropriate to the coordinate systems used by the caller. For
+     * instance if the path is defined in pixels, 0.5 (half a pixel) or 1.0 (a pixel) are
+     * appropriate tolerances. If the path is normalized and defined in the domain 0..1, the caller
+     * should choose a more appropriate tolerance close to or equal to one "query unit". The
+     * tolerance must be >= 0.
      *
      * @param path The [Path] to run queries against.
-     * @param tolerance When [path] contains conic curves, defines the maximum distance between
-     *        the original conic curve and its quadratic approximations. Set to 0.5 by default.
+     * @param tolerance When [path] contains conic curves, defines the maximum distance between the
+     *   original conic curve and its quadratic approximations. Set to 0.5 by default.
      */
     fun updatePath(path: Path, @FloatRange(from = 0.0) tolerance: Float = 0.5f) {
         this.path = path
@@ -116,8 +108,8 @@
 
     /**
      * Queries whether the specified [position] is inside this [Path]. The
-     * [path's fill type][Path.fillType] is taken into account to determine if the point lies
-     * inside this path or not.
+     * [path's fill type][Path.fillType] is taken into account to determine if the point lies inside
+     * this path or not.
      *
      * @param position The x/y coordinates of the point to test.
      * @return True if [position] is inside this path, false otherwise.
diff --git a/compose/ui/ui-graphics/src/commonMain/kotlin/androidx/compose/ui/graphics/PathIterator.kt b/compose/ui/ui-graphics/src/commonMain/kotlin/androidx/compose/ui/graphics/PathIterator.kt
index 1432405..7499075 100644
--- a/compose/ui/ui-graphics/src/commonMain/kotlin/androidx/compose/ui/graphics/PathIterator.kt
+++ b/compose/ui/ui-graphics/src/commonMain/kotlin/androidx/compose/ui/graphics/PathIterator.kt
@@ -19,20 +19,19 @@
 import androidx.compose.ui.graphics.PathIterator.ConicEvaluation
 
 /**
- * A path iterator can be used to iterate over all the [segments][PathSegment] that make up
- * a path. Those segments may in turn define multiple contours inside the path. Conic segments
- * are by default evaluated as approximated quadratic segments. To preserve conic segments as
- * conics, set [conicEvaluation] to [AsConic][ConicEvaluation.AsConic]. The error of the
- * approximation is controlled by [tolerance].
+ * A path iterator can be used to iterate over all the [segments][PathSegment] that make up a path.
+ * Those segments may in turn define multiple contours inside the path. Conic segments are by
+ * default evaluated as approximated quadratic segments. To preserve conic segments as conics, set
+ * [conicEvaluation] to [AsConic][ConicEvaluation.AsConic]. The error of the approximation is
+ * controlled by [tolerance].
  *
- * A [PathIterator] can be created implicitly through a given [Path] object: using one of the
- * two [Path.iterator] functions.
+ * A [PathIterator] can be created implicitly through a given [Path] object: using one of the two
+ * [Path.iterator] functions.
  *
  * @param path The [Path] to iterate over
  * @param conicEvaluation Indicates how to evaluate conic segments
  * @param tolerance When [conicEvaluation] is set to [PathIterator.ConicEvaluation.AsQuadratics]
- *        defines the maximum distance between the original conic curve and its quadratic
- *        approximations
+ *   defines the maximum distance between the original conic curve and its quadratic approximations
  */
 expect fun PathIterator(
     path: Path,
@@ -41,8 +40,8 @@
 ): PathIterator
 
 /**
- * A path iterator can be used to iterate over all the [segments][PathSegment] that make up
- * a path. Those segments may in turn define multiple contours inside the path.
+ * A path iterator can be used to iterate over all the [segments][PathSegment] that make up a path.
+ * Those segments may in turn define multiple contours inside the path.
  *
  * The handling of conic segments is defined by the [conicEvaluation] property. When set to
  * [AsConic][ConicEvaluation.AsConic], conic segments are preserved, but when set to
@@ -55,56 +54,50 @@
      * [PathIterator].
      */
     enum class ConicEvaluation {
-        /**
-         * Conic segments are returned as conic segments.
-         */
+        /** Conic segments are returned as conic segments. */
         AsConic,
 
         /**
-         * Conic segments are returned as quadratic approximations. The quality of the
-         * approximation is defined by a tolerance value.
+         * Conic segments are returned as quadratic approximations. The quality of the approximation
+         * is defined by a tolerance value.
          */
         AsQuadratics
     }
 
-    /**
-     * The [Path] this iterator iterates on.
-     */
+    /** The [Path] this iterator iterates on. */
     val path: Path
 
     /**
-     * Indicates whether conic segments, when present, are preserved as-is or converted to
-     * quadratic segments, using an approximation whose error is controlled by [tolerance].
+     * Indicates whether conic segments, when present, are preserved as-is or converted to quadratic
+     * segments, using an approximation whose error is controlled by [tolerance].
      */
     val conicEvaluation: ConicEvaluation
 
     /**
-     * Error of the approximation used to evaluate conic segments if they are converted
-     * to quadratics. The error is defined as the maximum distance between the original
-     * conic segment and its quadratic approximation. See [conicEvaluation].
+     * Error of the approximation used to evaluate conic segments if they are converted to
+     * quadratics. The error is defined as the maximum distance between the original conic segment
+     * and its quadratic approximation. See [conicEvaluation].
      */
     val tolerance: Float
 
     /**
-     * Returns the number of verbs present in this iterator, i.e. the number of calls to
-     * [next] required to complete the iteration.
+     * Returns the number of verbs present in this iterator, i.e. the number of calls to [next]
+     * required to complete the iteration.
      *
      * By default, [calculateSize] returns the true number of operations in the iterator. Deriving
-     * this result requires converting any conics to quadratics, if [conicEvaluation] is
-     * set to [ConicEvaluation.AsQuadratics], which takes extra processing time. Set
-     * [includeConvertedConics] to false if an approximate size, not including conic
-     * conversion, is sufficient.
+     * this result requires converting any conics to quadratics, if [conicEvaluation] is set to
+     * [ConicEvaluation.AsQuadratics], which takes extra processing time. Set
+     * [includeConvertedConics] to false if an approximate size, not including conic conversion, is
+     * sufficient.
      *
      * @param includeConvertedConics The returned size includes any required conic conversions.
-     * Default is true, so it will return the exact size, at the cost of iterating through
-     * all elements and converting any conics as appropriate. Set to false to save on processing,
-     * at the cost of a less exact result.
+     *   Default is true, so it will return the exact size, at the cost of iterating through all
+     *   elements and converting any conics as appropriate. Set to false to save on processing, at
+     *   the cost of a less exact result.
      */
     fun calculateSize(includeConvertedConics: Boolean = true): Int
 
-    /**
-     * Returns `true` if the iteration has more elements.
-     */
+    /** Returns `true` if the iteration has more elements. */
     override fun hasNext(): Boolean
 
     /**
@@ -112,28 +105,27 @@
      * and fills [outPoints] with the points specific to the segment type. Each pair of floats in
      * the [outPoints] array represents a point for the given segment. The number of pairs of floats
      * depends on the [PathSegment.Type]:
-     *
      * - [Move][PathSegment.Type.Move]: 1 pair (indices 0 to 1)
      * - [Line][PathSegment.Type.Line]: 2 pairs (indices 0 to 3)
      * - [Quadratic][PathSegment.Type.Quadratic]: 3 pairs (indices 0 to 5)
      * - [Conic][PathSegment.Type.Conic]: 3 pairs (indices 0 to 5), and the conic
-     *   [weight][PathSegment.weight] at index 6. The value of the last float is undefined.
-     *   See [PathSegment.Type.Conic] for more details
+     *   [weight][PathSegment.weight] at index 6. The value of the last float is undefined. See
+     *   [PathSegment.Type.Conic] for more details
      * - [Cubic][PathSegment.Type.Cubic]: 4 pairs (indices 0 to 7)
      * - [Close][PathSegment.Type.Close]: 0 pair
      * - [Done][PathSegment.Type.Done]: 0 pair
      *
      * This method does not allocate any memory.
      *
-     * @param outPoints A [FloatArray] large enough to hold 8 floats starting at [offset],
-     *               throws an [IllegalStateException] otherwise.
+     * @param outPoints A [FloatArray] large enough to hold 8 floats starting at [offset], throws an
+     *   [IllegalStateException] otherwise.
      * @param offset Offset in [outPoints] where to store the result
      */
     fun next(outPoints: FloatArray, offset: Int = 0): PathSegment.Type
 
     /**
-     * Returns the next [path segment][PathSegment] in the iteration, or [DoneSegment] if
-     * the iteration is finished. To save on allocations, use the alternative [next] function, which
+     * Returns the next [path segment][PathSegment] in the iteration, or [DoneSegment] if the
+     * iteration is finished. To save on allocations, use the alternative [next] function, which
      * takes a [FloatArray].
      */
     override fun next(): PathSegment
diff --git a/compose/ui/ui-graphics/src/commonMain/kotlin/androidx/compose/ui/graphics/PathMeasure.kt b/compose/ui/ui-graphics/src/commonMain/kotlin/androidx/compose/ui/graphics/PathMeasure.kt
index d2ee71f..2afa5c6 100644
--- a/compose/ui/ui-graphics/src/commonMain/kotlin/androidx/compose/ui/graphics/PathMeasure.kt
+++ b/compose/ui/ui-graphics/src/commonMain/kotlin/androidx/compose/ui/graphics/PathMeasure.kt
@@ -22,9 +22,9 @@
 /**
  * Create an empty [PathMeasure] object. To uses this to measure the length of a path, and/or to
  * find the position and tangent along it, call [PathMeasure.setPath]. Note that once a path is
- * associated with the measure object, it is undefined if the path is subsequently modified and
- * the measure object is used. If the path is modified, you must call [PathMeasure.setPath] with
- * the path.
+ * associated with the measure object, it is undefined if the path is subsequently modified and the
+ * measure object is used. If the path is modified, you must call [PathMeasure.setPath] with the
+ * path.
  */
 expect fun PathMeasure(): PathMeasure
 
@@ -38,10 +38,10 @@
     val length: Float
 
     /**
-     * Given a start and stop distance, return in dst the intervening segment(s). If the segment
-     * is zero-length, return false, else return true. startD and stopD are pinned to legal
-     * values (0..getLength()). If startD >= stopD then return false (and leave dst untouched).
-     * Begin the segment with a moveTo if startWithMoveTo is true.
+     * Given a start and stop distance, return in dst the intervening segment(s). If the segment is
+     * zero-length, return false, else return true. startD and stopD are pinned to legal values
+     * (0..getLength()). If startD >= stopD then return false (and leave dst untouched). Begin the
+     * segment with a moveTo if startWithMoveTo is true.
      */
     fun getSegment(
         startDistance: Float,
@@ -50,16 +50,13 @@
         startWithMoveTo: Boolean = true
     ): Boolean
 
-    /**
-     * Assign a new path, or null to have none.
-     */
+    /** Assign a new path, or null to have none. */
     fun setPath(path: Path?, forceClosed: Boolean)
 
     /**
      * Pins distance to 0 <= distance <= getLength(), and then computes the corresponding position
      *
      * @param distance The distance along the current contour to sample
-     *
      * @return [Offset.Unspecified] if there is no path set
      */
     fun getPosition(distance: Float): Offset
@@ -68,7 +65,6 @@
      * Pins distance to 0 <= distance <= getLength(), and then computes the corresponding tangent
      *
      * @param distance The distance along the current contour to sample
-     *
      * @return [Offset.Unspecified] if there is no path set
      */
     fun getTangent(distance: Float): Offset
diff --git a/compose/ui/ui-graphics/src/commonMain/kotlin/androidx/compose/ui/graphics/PathOperation.kt b/compose/ui/ui-graphics/src/commonMain/kotlin/androidx/compose/ui/graphics/PathOperation.kt
index 3dde746..0c621f6 100644
--- a/compose/ui/ui-graphics/src/commonMain/kotlin/androidx/compose/ui/graphics/PathOperation.kt
+++ b/compose/ui/ui-graphics/src/commonMain/kotlin/androidx/compose/ui/graphics/PathOperation.kt
@@ -22,7 +22,6 @@
  * Strategies for combining paths.
  *
  * See also:
- *
  * * [Path.combine], which uses this enum to decide how to combine two paths.
  */
 // Must be kept in sync with SkPathOp
@@ -33,101 +32,88 @@
         /**
          * Subtract the second path from the first path.
          *
-         * For example, if the two paths are overlapping circles of equal diameter
-         * but differing centers, the result would be a crescent portion of the
-         * first circle that was not overlapped by the second circle.
+         * For example, if the two paths are overlapping circles of equal diameter but differing
+         * centers, the result would be a crescent portion of the first circle that was not
+         * overlapped by the second circle.
          *
          * See also:
-         *
-         *  * [ReverseDifference], which is the same but subtracting the first path
-         *    from the second.
+         * * [ReverseDifference], which is the same but subtracting the first path from the second.
          */
         val Difference = PathOperation(0)
         /**
-         * Create a new path that is the intersection of the two paths, leaving the
-         * overlapping pieces of the path.
+         * Create a new path that is the intersection of the two paths, leaving the overlapping
+         * pieces of the path.
          *
-         * For example, if the two paths are overlapping circles of equal diameter
-         * but differing centers, the result would be only the overlapping portion
-         * of the two circles.
+         * For example, if the two paths are overlapping circles of equal diameter but differing
+         * centers, the result would be only the overlapping portion of the two circles.
          *
          * See also:
-         *  * [Xor], which is the inverse of this operation
+         * * [Xor], which is the inverse of this operation
          */
         val Intersect = PathOperation(1)
 
         /**
          * Create a new path that is the union (inclusive-or) of the two paths.
          *
-         * For example, if the two paths are overlapping circles of equal diameter
-         * but differing centers, the result would be a figure-eight like shape
-         * matching the outer boundaries of both circles.
+         * For example, if the two paths are overlapping circles of equal diameter but differing
+         * centers, the result would be a figure-eight like shape matching the outer boundaries of
+         * both circles.
          */
         val Union = PathOperation(2)
 
         /**
-         * Create a new path that is the exclusive-or of the two paths, leaving
-         * everything but the overlapping pieces of the path.
+         * Create a new path that is the exclusive-or of the two paths, leaving everything but the
+         * overlapping pieces of the path.
          *
-         * For example, if the two paths are overlapping circles of equal diameter
-         * but differing centers, the figure-eight like shape less the overlapping parts
+         * For example, if the two paths are overlapping circles of equal diameter but differing
+         * centers, the figure-eight like shape less the overlapping parts
          *
          * See also:
-         *  * [Intersect], which is the inverse of this operation
+         * * [Intersect], which is the inverse of this operation
          */
         val Xor = PathOperation(3)
 
         /**
          * Subtract the first path from the second path.
          *
-         * For example, if the two paths are overlapping circles of equal diameter
-         * but differing centers, the result would be a crescent portion of the
-         * second circle that was not overlapped by the first circle.
+         * For example, if the two paths are overlapping circles of equal diameter but differing
+         * centers, the result would be a crescent portion of the second circle that was not
+         * overlapped by the first circle.
          *
          * See also:
-         *
-         *  * [Difference], which is the same but subtracting the second path
-         *    from the first.
+         * * [Difference], which is the same but subtracting the second path from the first.
          */
         val ReverseDifference = PathOperation(4)
     }
 
-    override fun toString() = when (this) {
-        Difference -> "Difference"
-        Intersect -> "Intersect"
-        Union -> "Union"
-        Xor -> "Xor"
-        ReverseDifference -> "ReverseDifference"
-        else -> "Unknown"
-    }
+    override fun toString() =
+        when (this) {
+            Difference -> "Difference"
+            Intersect -> "Intersect"
+            Union -> "Union"
+            Xor -> "Xor"
+            ReverseDifference -> "ReverseDifference"
+            else -> "Unknown"
+        }
 }
 
 @Deprecated(
     message = "Use PathOperation.Difference instead",
-    ReplaceWith(
-        "PathOperation.Difference",
-        "androidx.compose.ui.graphics.PathOperation.Difference"
-    )
+    ReplaceWith("PathOperation.Difference", "androidx.compose.ui.graphics.PathOperation.Difference")
 )
 val PathOperation.Companion.difference: PathOperation
     get() = Difference
 
 @Deprecated(
     message = "Use PathOperation.Intersect instead",
-    ReplaceWith(
-        "PathOperation.Intersect",
-        "androidx.compose.ui.graphics.PathOperation.Intersect"
-    )
+    ReplaceWith("PathOperation.Intersect", "androidx.compose.ui.graphics.PathOperation.Intersect")
 )
 val PathOperation.Companion.intersect: PathOperation
     get() = Intersect
 
 @Deprecated(
     message = "Use PathOperation.Union instead",
-    ReplaceWith(
-        "PathOperation.Union",
-        "androidx.compose.ui.graphics.PathOperation.Union"
-    )
+    ReplaceWith("PathOperation.Union", "androidx.compose.ui.graphics.PathOperation.Union")
 )
 val PathOperation.Companion.union: PathOperation
     get() = Union
@@ -144,10 +130,7 @@
 
 @Deprecated(
     message = "Use PathOperation.Xor instead",
-    ReplaceWith(
-        "PathOperation.Xor",
-        "androidx.compose.ui.graphics.PathOperation.Xor"
-    )
+    ReplaceWith("PathOperation.Xor", "androidx.compose.ui.graphics.PathOperation.Xor")
 )
 val PathOperation.Companion.xor: PathOperation
     get() = Xor
diff --git a/compose/ui/ui-graphics/src/commonMain/kotlin/androidx/compose/ui/graphics/PathSegment.kt b/compose/ui/ui-graphics/src/commonMain/kotlin/androidx/compose/ui/graphics/PathSegment.kt
index 2dc028f..698581b 100644
--- a/compose/ui/ui-graphics/src/commonMain/kotlin/androidx/compose/ui/graphics/PathSegment.kt
+++ b/compose/ui/ui-graphics/src/commonMain/kotlin/androidx/compose/ui/graphics/PathSegment.kt
@@ -17,24 +17,25 @@
 package androidx.compose.ui.graphics
 
 /**
- * A path segment represents a curve (line, cubic, quadratic or conic) or a command inside
- * a fully formed [Path] object.
+ * A path segment represents a curve (line, cubic, quadratic or conic) or a command inside a fully
+ * formed [Path] object.
  *
- * A segment is identified by a [type][PathSegment.Type] which in turns defines how many
- * [points] are available (from 0 to 4 points, each point is represented by 2 floats) and
- * whether the [weight] is meaningful. Please refer to the documentation of each
- * [type][PathSegment.Type] for more information.
+ * A segment is identified by a [type][PathSegment.Type] which in turns defines how many [points]
+ * are available (from 0 to 4 points, each point is represented by 2 floats) and whether the
+ * [weight] is meaningful. Please refer to the documentation of each [type][PathSegment.Type] for
+ * more information.
  *
- * A segment with the [Move][Type.Move] or [Close][Type.Close] is usually represented by
- * the singletons [DoneSegment] and [CloseSegment] respectively.
+ * A segment with the [Move][Type.Move] or [Close][Type.Close] is usually represented by the
+ * singletons [DoneSegment] and [CloseSegment] respectively.
  *
  * @property type The type that identifies this segment and defines the number of points.
- * @property points An array of points (2 floats per point) describing this segment, whose
- *                  size depends on [type].
- * @property weight Conic weight, only valid if [type] is [Type.Conic]. See [Type.Conic]
- *                  for more information.
+ * @property points An array of points (2 floats per point) describing this segment, whose size
+ *   depends on [type].
+ * @property weight Conic weight, only valid if [type] is [Type.Conic]. See [Type.Conic] for more
+ *   information.
  */
-class PathSegment internal constructor(
+class PathSegment
+internal constructor(
     val type: Type,
     @get:Suppress("ArrayReturn") val points: FloatArray,
     val weight: Float
@@ -46,13 +47,13 @@
      */
     enum class Type {
         /**
-         * Move command, the path segment contains 1 point indicating the move destination.
-         * The weight is set 0.0f and not meaningful.
+         * Move command, the path segment contains 1 point indicating the move destination. The
+         * weight is set 0.0f and not meaningful.
          */
         Move,
         /**
-         * Line curve, the path segment contains 2 points indicating the two extremities of
-         * the line. The weight is set 0.0f and not meaningful.
+         * Line curve, the path segment contains 2 points indicating the two extremities of the
+         * line. The weight is set 0.0f and not meaningful.
          */
         Line,
         /**
@@ -73,9 +74,9 @@
          * The curve is weighted by the [weight][PathSegment.weight] property.
          *
          * The conic weight determines the amount of influence conic control point has on the curve.
-         * If the weight is less than one, the curve represents an elliptical section.
-         * If the weight is greater than one, the curve represents a hyperbolic section.
-         * If the weight equals one, the curve represents a parabolic section.
+         * If the weight is less than one, the curve represents an elliptical section. If the weight
+         * is greater than one, the curve represents a hyperbolic section. If the weight equals one,
+         * the curve represents a parabolic section.
          */
         Conic,
         /**
@@ -89,15 +90,14 @@
          */
         Cubic,
         /**
-         * Close command, close the current contour by joining the last point added to the
-         * path with the first point of the current contour. The segment does not contain
-         * any point. The weight is set 0.0f and not meaningful.
+         * Close command, close the current contour by joining the last point added to the path with
+         * the first point of the current contour. The segment does not contain any point. The
+         * weight is set 0.0f and not meaningful.
          */
         Close,
         /**
-         * Done command, which indicates that no further segment will be
-         * found in the path. It typically indicates the end of an iteration over a path
-         * and can be ignored.
+         * Done command, which indicates that no further segment will be found in the path. It
+         * typically indicates the end of an iteration over a path and can be ignored.
          */
         Done
     }
@@ -128,15 +128,15 @@
 }
 
 /**
- * A [PathSegment] containing the [Done][PathSegment.Type.Done] command.
- * This static object exists to avoid allocating a new segment when returning a
- * [Done][PathSegment.Type.Done] result from [PathIterator.next].
+ * A [PathSegment] containing the [Done][PathSegment.Type.Done] command. This static object exists
+ * to avoid allocating a new segment when returning a [Done][PathSegment.Type.Done] result from
+ * [PathIterator.next].
  */
 val DoneSegment = PathSegment(PathSegment.Type.Done, FloatArray(0), 0.0f)
 
 /**
- * A [PathSegment] containing the [Close][PathSegment.Type.Close] command.
- * This static object exists to avoid allocating a new segment when returning a
- * [Close][PathSegment.Type.Close] result from [PathIterator.next].
+ * A [PathSegment] containing the [Close][PathSegment.Type.Close] command. This static object exists
+ * to avoid allocating a new segment when returning a [Close][PathSegment.Type.Close] result from
+ * [PathIterator.next].
  */
 val CloseSegment = PathSegment(PathSegment.Type.Close, FloatArray(0), 0.0f)
diff --git a/compose/ui/ui-graphics/src/commonMain/kotlin/androidx/compose/ui/graphics/PathSvg.kt b/compose/ui/ui-graphics/src/commonMain/kotlin/androidx/compose/ui/graphics/PathSvg.kt
index f417220..822ed47 100644
--- a/compose/ui/ui-graphics/src/commonMain/kotlin/androidx/compose/ui/graphics/PathSvg.kt
+++ b/compose/ui/ui-graphics/src/commonMain/kotlin/androidx/compose/ui/graphics/PathSvg.kt
@@ -19,14 +19,13 @@
 import androidx.compose.ui.graphics.vector.PathParser
 
 /**
- * Adds the specified SVG [path data](https://www.w3.org/TR/SVG2/paths.html#PathData) to
- * this [Path]. The SVG path data encodes a series of instructions that will be applied
- * to this path. For instance, the following path data:
+ * Adds the specified SVG [path data](https://www.w3.org/TR/SVG2/paths.html#PathData) to this
+ * [Path]. The SVG path data encodes a series of instructions that will be applied to this path. For
+ * instance, the following path data:
  *
  * `M200,300 Q400,50 600,300 L1000,300`
  *
  * Will generate the following series of instructions for this path:
- *
  * ```
  * moveTo(200f, 300f)
  * quadraticTo(400f, 50f, 600f, 300f)
@@ -36,7 +35,6 @@
  * To convert a [Path] to its SVG path data representation, please refer to [Path.toSvg].
  *
  * @throws IllegalArgumentException if the path data contains an invalid instruction
- *
  * @see toSvg
  */
 fun Path.addSvg(pathData: String) {
@@ -47,15 +45,14 @@
 }
 
 /**
- * Returns an SVG representation of this path. The caller can choose whether the returned
- * SVG represents a fully-formed SVG document or only the
- * [path data](https://www.w3.org/TR/SVG2/paths.html#PathData). By default, only the path
- * data is returned which can be used either with [Path.addSvg] or
+ * Returns an SVG representation of this path. The caller can choose whether the returned SVG
+ * represents a fully-formed SVG document or only the
+ * [path data](https://www.w3.org/TR/SVG2/paths.html#PathData). By default, only the path data is
+ * returned which can be used either with [Path.addSvg] or
  * [androidx.compose.ui.graphics.vector.PathParser].
  *
- * @param asDocument When set to true, this function returns a fully-formed SVG document,
- *        otherwise returns only the path data.
- *
+ * @param asDocument When set to true, this function returns a fully-formed SVG document, otherwise
+ *   returns only the path data.
  * @see androidx.compose.ui.graphics.vector.PathParser
  * @see addSvg
  */
diff --git a/compose/ui/ui-graphics/src/commonMain/kotlin/androidx/compose/ui/graphics/PixelMap.kt b/compose/ui/ui-graphics/src/commonMain/kotlin/androidx/compose/ui/graphics/PixelMap.kt
index 9cd8e1a..35a9105 100644
--- a/compose/ui/ui-graphics/src/commonMain/kotlin/androidx/compose/ui/graphics/PixelMap.kt
+++ b/compose/ui/ui-graphics/src/commonMain/kotlin/androidx/compose/ui/graphics/PixelMap.kt
@@ -27,11 +27,10 @@
  *
  * @param buffer IntArray where pixel information is stored as an ARGB value packed into an Int
  * @param bufferOffset first index in the buffer where pixel information for the [ImageBitmap] is
- * stored
+ *   stored
  * @param width Width of the subsection of the [ImageBitmap] this buffer represents
  * @param height Height of the subsection of the [ImageBitmap] this buffer represents
  * @param stride Number of entries to skip between rows
- *
  * @see ImageBitmap.readPixels
  * @See ImageBitmap.toPixelMap
  */
@@ -44,11 +43,10 @@
 ) {
     /**
      * Obtain the color of the pixel at the given coordinate.
+     *
      * @param x the horizontal pixel coordinate, minimum 1
      * @param y the vertical pixel coordinate, minimum 1
      */
-    operator fun get(
-        @IntRange(from = 0) x: Int,
-        @IntRange(from = 0) y: Int
-    ): Color = Color(buffer[bufferOffset + y * stride + x])
+    operator fun get(@IntRange(from = 0) x: Int, @IntRange(from = 0) y: Int): Color =
+        Color(buffer[bufferOffset + y * stride + x])
 }
diff --git a/compose/ui/ui-graphics/src/commonMain/kotlin/androidx/compose/ui/graphics/PointMode.kt b/compose/ui/ui-graphics/src/commonMain/kotlin/androidx/compose/ui/graphics/PointMode.kt
index 78d3d51..5ce0acc 100644
--- a/compose/ui/ui-graphics/src/commonMain/kotlin/androidx/compose/ui/graphics/PointMode.kt
+++ b/compose/ui/ui-graphics/src/commonMain/kotlin/androidx/compose/ui/graphics/PointMode.kt
@@ -18,10 +18,7 @@
 
 import androidx.compose.runtime.Immutable
 
-/**
- * Defines how a list of points is interpreted when drawing a set of points.
- *
- */
+/** Defines how a list of points is interpreted when drawing a set of points. */
 // ignore: deprecated_member_use
 /** Used by [Canvas.drawPoints]. */
 // These enum values must be kept in sync with SkCanvas::PointMode.
@@ -32,13 +29,12 @@
         /**
          * Draw each point separately.
          *
-         * If the [Paint.strokeCap] is [StrokeCap.Round], then each point is drawn
-         * as a circle with the diameter of the [Paint.strokeWidth], filled as
-         * described by the [Paint] (ignoring [Paint.style]).
-         *
-         * Otherwise, each point is drawn as an axis-aligned square with sides of
-         * length [Paint.strokeWidth], filled as described by the [Paint] (ignoring
+         * If the [Paint.strokeCap] is [StrokeCap.Round], then each point is drawn as a circle with
+         * the diameter of the [Paint.strokeWidth], filled as described by the [Paint] (ignoring
          * [Paint.style]).
+         *
+         * Otherwise, each point is drawn as an axis-aligned square with sides of length
+         * [Paint.strokeWidth], filled as described by the [Paint] (ignoring [Paint.style]).
          */
         val Points = PointMode(0)
 
@@ -47,24 +43,23 @@
          *
          * If the number of points is odd, then the last point is ignored.
          *
-         * The lines are stroked as described by the [Paint] (ignoring
-         * [Paint.style]).
+         * The lines are stroked as described by the [Paint] (ignoring [Paint.style]).
          */
         val Lines = PointMode(1)
 
         /**
          * Draw the entire sequence of point as one line.
          *
-         * The lines are stroked as described by the [Paint] (ignoring
-         * [Paint.style]).
+         * The lines are stroked as described by the [Paint] (ignoring [Paint.style]).
          */
         val Polygon = PointMode(2)
     }
 
-    override fun toString() = when (this) {
-        Points -> "Points"
-        Lines -> "Lines"
-        Polygon -> "Polygon"
-        else -> "Unknown"
-    }
+    override fun toString() =
+        when (this) {
+            Points -> "Points"
+            Lines -> "Lines"
+            Polygon -> "Polygon"
+            else -> "Unknown"
+        }
 }
diff --git a/compose/ui/ui-graphics/src/commonMain/kotlin/androidx/compose/ui/graphics/RectangleShape.kt b/compose/ui/ui-graphics/src/commonMain/kotlin/androidx/compose/ui/graphics/RectangleShape.kt
index aed502b..ba1c4a4 100644
--- a/compose/ui/ui-graphics/src/commonMain/kotlin/androidx/compose/ui/graphics/RectangleShape.kt
+++ b/compose/ui/ui-graphics/src/commonMain/kotlin/androidx/compose/ui/graphics/RectangleShape.kt
@@ -22,13 +22,12 @@
 import androidx.compose.ui.unit.Density
 import androidx.compose.ui.unit.LayoutDirection
 
-/**
- * A shape describing the rectangle.
- */
+/** A shape describing the rectangle. */
 @Stable
-val RectangleShape: Shape = object : Shape {
-    override fun createOutline(size: Size, layoutDirection: LayoutDirection, density: Density) =
-        Outline.Rectangle(size.toRect())
+val RectangleShape: Shape =
+    object : Shape {
+        override fun createOutline(size: Size, layoutDirection: LayoutDirection, density: Density) =
+            Outline.Rectangle(size.toRect())
 
-    override fun toString(): String = "RectangleShape"
-}
+        override fun toString(): String = "RectangleShape"
+    }
diff --git a/compose/ui/ui-graphics/src/commonMain/kotlin/androidx/compose/ui/graphics/RenderEffect.kt b/compose/ui/ui-graphics/src/commonMain/kotlin/androidx/compose/ui/graphics/RenderEffect.kt
index 3e2848c..11c3c14 100644
--- a/compose/ui/ui-graphics/src/commonMain/kotlin/androidx/compose/ui/graphics/RenderEffect.kt
+++ b/compose/ui/ui-graphics/src/commonMain/kotlin/androidx/compose/ui/graphics/RenderEffect.kt
@@ -21,19 +21,18 @@
 import androidx.compose.ui.geometry.Offset
 
 /**
- * Intermediate rendering step used to render drawing commands with a corresponding
- * visual effect. A [RenderEffect] can be configured on a [GraphicsLayerScope]
- * and will be applied when drawn.
+ * Intermediate rendering step used to render drawing commands with a corresponding visual effect. A
+ * [RenderEffect] can be configured on a [GraphicsLayerScope] and will be applied when drawn.
  */
 @Immutable
 expect sealed class RenderEffect() {
 
     /**
-     * Capability query to determine if the particular platform supports the [RenderEffect]. Not
-     * all platforms support all render effects.
+     * Capability query to determine if the particular platform supports the [RenderEffect]. Not all
+     * platforms support all render effects.
      *
-     * Note RenderEffect is only supported on Android 12 and above.
-     * Attempts to use RenderEffect on older Android versions will be ignored.
+     * Note RenderEffect is only supported on Android 12 and above. Attempts to use RenderEffect on
+     * older Android versions will be ignored.
      */
     open fun isSupported(): Boolean
 }
@@ -47,9 +46,10 @@
     BlurEffect(null, radiusX, radiusY, edgeTreatment)
 
 /**
- * [RenderEffect] that will blur the contents of an optional input [RenderEffect]. If no
- * input [RenderEffect] is provided, the drawing commands on the [GraphicsLayerScope] this
- * [RenderEffect] is configured on will be blurred.
+ * [RenderEffect] that will blur the contents of an optional input [RenderEffect]. If no input
+ * [RenderEffect] is provided, the drawing commands on the [GraphicsLayerScope] this [RenderEffect]
+ * is configured on will be blurred.
+ *
  * @param renderEffect Optional input [RenderEffect] to be blurred
  * @param radiusX Blur radius in the horizontal direction
  * @param radiusY Blur radius in the vertical direction
@@ -71,11 +71,7 @@
 fun OffsetEffect(offsetX: Float, offsetY: Float) = OffsetEffect(null, Offset(offsetX, offsetY))
 
 /**
- * [RenderEffect] used to translate either the given [RenderEffect] or the content of
- * the [GraphicsLayerScope] it is configured on.
+ * [RenderEffect] used to translate either the given [RenderEffect] or the content of the
+ * [GraphicsLayerScope] it is configured on.
  */
-@Immutable
-expect class OffsetEffect(
-    renderEffect: RenderEffect?,
-    offset: Offset
-) : RenderEffect
+@Immutable expect class OffsetEffect(renderEffect: RenderEffect?, offset: Offset) : RenderEffect
diff --git a/compose/ui/ui-graphics/src/commonMain/kotlin/androidx/compose/ui/graphics/Shader.kt b/compose/ui/ui-graphics/src/commonMain/kotlin/androidx/compose/ui/graphics/Shader.kt
index 59fc72c..79b370a 100644
--- a/compose/ui/ui-graphics/src/commonMain/kotlin/androidx/compose/ui/graphics/Shader.kt
+++ b/compose/ui/ui-graphics/src/commonMain/kotlin/androidx/compose/ui/graphics/Shader.kt
@@ -19,21 +19,21 @@
 import androidx.compose.ui.geometry.Offset
 
 /**
- * Class that represents the corresponding Shader implementation on a platform. This maps
- * to Gradients or ImageShaders
+ * Class that represents the corresponding Shader implementation on a platform. This maps to
+ * Gradients or ImageShaders
  */
 expect class Shader
 
 /**
  * Creates a linear gradient from `from` to `to`.
  *
- * If `colorStops` is provided, each value is a number from 0.0 to 1.0
- * that specifies where the color at the corresponding index in [colors]
- * begins in the gradient. If `colorStops` is not provided, then the colors are dispersed evenly
+ * If `colorStops` is provided, each value is a number from 0.0 to 1.0 that specifies where the
+ * color at the corresponding index in [colors] begins in the gradient. If `colorStops` is not
+ * provided, then the colors are dispersed evenly
  *
- * The behavior before [from] and after [to] is described by the `tileMode`
- * argument. For details, see the [TileMode] enum. If no [TileMode] is provided
- * the default value of [TileMode.Clamp] is used
+ * The behavior before [from] and after [to] is described by the `tileMode` argument. For details,
+ * see the [TileMode] enum. If no [TileMode] is provided the default value of [TileMode.Clamp] is
+ * used
  */
 fun LinearGradientShader(
     from: Offset,
@@ -41,13 +41,7 @@
     colors: List<Color>,
     colorStops: List<Float>? = null,
     tileMode: TileMode = TileMode.Clamp
-): Shader = ActualLinearGradientShader(
-    from,
-    to,
-    colors,
-    colorStops,
-    tileMode
-)
+): Shader = ActualLinearGradientShader(from, to, colors, colorStops, tileMode)
 
 internal expect fun ActualLinearGradientShader(
     from: Offset,
@@ -58,19 +52,18 @@
 ): Shader
 
 /**
- * Creates a radial gradient centered at `center` that ends at `radius`
- * distance from the center.
+ * Creates a radial gradient centered at `center` that ends at `radius` distance from the center.
  *
- * If `colorStops` is provided, each value is a number from 0.0 to 1.0
- * that specifies where the color at the corresponding index in [colors]
- * begins in the gradient. If `colorStops` is not provided, then the colors are dispersed evenly
+ * If `colorStops` is provided, each value is a number from 0.0 to 1.0 that specifies where the
+ * color at the corresponding index in [colors] begins in the gradient. If `colorStops` is not
+ * provided, then the colors are dispersed evenly
  *
- * The behavior before and after the radius is described by the `tileMode`
- * argument. For details, see the [TileMode] enum.
+ * The behavior before and after the radius is described by the `tileMode` argument. For details,
+ * see the [TileMode] enum.
  *
  * The behavior outside of the bounds of [center] +/- [radius] is described by the `tileMode`
- * argument. For details, see the [TileMode] enum. If no [TileMode] is provided
- * the default value of [TileMode.Clamp] is used
+ * argument. For details, see the [TileMode] enum. If no [TileMode] is provided the default value of
+ * [TileMode.Clamp] is used
  */
 fun RadialGradientShader(
     center: Offset,
@@ -89,12 +82,12 @@
 ): Shader
 
 /**
- * Creates a circular gradient that sweeps around a provided center point. The sweep begins
- * relative to 3 o'clock and continues clockwise until it reaches the starting position again.
+ * Creates a circular gradient that sweeps around a provided center point. The sweep begins relative
+ * to 3 o'clock and continues clockwise until it reaches the starting position again.
  *
- * If `colorStops` is provided, each value is a number from 0.0 to 1.0
- * that specifies where the color at the corresponding index in [colors]
- * begins in the gradient. If `colorStops` is not provided, then the colors are dispersed evenly
+ * If `colorStops` is provided, each value is a number from 0.0 to 1.0 that specifies where the
+ * color at the corresponding index in [colors] begins in the gradient. If `colorStops` is not
+ * provided, then the colors are dispersed evenly
  *
  * @param center Position for the gradient to sweep around
  * @param colors Colors to be rendered as part of the gradient
@@ -113,9 +106,9 @@
 ): Shader
 
 /**
- * Creates a Shader using the given [ImageBitmap] as an input texture. If the shader is
- * to be drawn in an area larger than the size of the [ImageBitmap], the region is filled
- * in the horizontal and vertical directions based on the [tileModeX] and [tileModeY] parameters.
+ * Creates a Shader using the given [ImageBitmap] as an input texture. If the shader is to be drawn
+ * in an area larger than the size of the [ImageBitmap], the region is filled in the horizontal and
+ * vertical directions based on the [tileModeX] and [tileModeY] parameters.
  */
 fun ImageShader(
     image: ImageBitmap,
diff --git a/compose/ui/ui-graphics/src/commonMain/kotlin/androidx/compose/ui/graphics/Shadow.kt b/compose/ui/ui-graphics/src/commonMain/kotlin/androidx/compose/ui/graphics/Shadow.kt
index c628042..e8ace46 100644
--- a/compose/ui/ui-graphics/src/commonMain/kotlin/androidx/compose/ui/graphics/Shadow.kt
+++ b/compose/ui/ui-graphics/src/commonMain/kotlin/androidx/compose/ui/graphics/Shadow.kt
@@ -22,24 +22,16 @@
 import androidx.compose.ui.geometry.lerp
 import androidx.compose.ui.util.lerp
 
-/**
- * A single shadow.
- */
+/** A single shadow. */
 @Immutable
 class Shadow(
-    @Stable
-    val color: Color = Color(0xFF000000),
-    @Stable
-    val offset: Offset = Offset.Zero,
-    @Stable
-    val blurRadius: Float = 0.0f
+    @Stable val color: Color = Color(0xFF000000),
+    @Stable val offset: Offset = Offset.Zero,
+    @Stable val blurRadius: Float = 0.0f
 ) {
     companion object {
-        /**
-         * Constant for no shadow.
-         */
-        @Stable
-        val None = Shadow()
+        /** Constant for no shadow. */
+        @Stable val None = Shadow()
     }
 
     override fun equals(other: Any?): Boolean {
@@ -69,17 +61,11 @@
         offset: Offset = this.offset,
         blurRadius: Float = this.blurRadius
     ): Shadow {
-        return Shadow(
-            color = color,
-            offset = offset,
-            blurRadius = blurRadius
-        )
+        return Shadow(color = color, offset = offset, blurRadius = blurRadius)
     }
 }
 
-/**
- * Linearly interpolate two [Shadow]s.
- */
+/** Linearly interpolate two [Shadow]s. */
 @Stable
 fun lerp(start: Shadow, stop: Shadow, fraction: Float): Shadow {
     return Shadow(
diff --git a/compose/ui/ui-graphics/src/commonMain/kotlin/androidx/compose/ui/graphics/Shape.kt b/compose/ui/ui-graphics/src/commonMain/kotlin/androidx/compose/ui/graphics/Shape.kt
index 0ce177b..97e18f8 100644
--- a/compose/ui/ui-graphics/src/commonMain/kotlin/androidx/compose/ui/graphics/Shape.kt
+++ b/compose/ui/ui-graphics/src/commonMain/kotlin/androidx/compose/ui/graphics/Shape.kt
@@ -21,9 +21,7 @@
 import androidx.compose.ui.unit.Density
 import androidx.compose.ui.unit.LayoutDirection
 
-/**
- * Defines a generic shape.
- */
+/** Defines a generic shape. */
 @Stable
 interface Shape {
     /**
@@ -32,7 +30,6 @@
      * @param size the size of the shape boundary.
      * @param layoutDirection the current layout direction.
      * @param density the current density of the screen.
-     *
      * @return [Outline] of this shape for the given [size].
      */
     fun createOutline(size: Size, layoutDirection: LayoutDirection, density: Density): Outline
diff --git a/compose/ui/ui-graphics/src/commonMain/kotlin/androidx/compose/ui/graphics/StrokeCap.kt b/compose/ui/ui-graphics/src/commonMain/kotlin/androidx/compose/ui/graphics/StrokeCap.kt
index 6f34238..e3a919c 100644
--- a/compose/ui/ui-graphics/src/commonMain/kotlin/androidx/compose/ui/graphics/StrokeCap.kt
+++ b/compose/ui/ui-graphics/src/commonMain/kotlin/androidx/compose/ui/graphics/StrokeCap.kt
@@ -18,36 +18,29 @@
 
 import androidx.compose.runtime.Immutable
 
-/**
- * Styles to use for line endings.
- * See [Paint.strokeCap].
- */
+/** Styles to use for line endings. See [Paint.strokeCap]. */
 @Immutable
 @kotlin.jvm.JvmInline
 value class StrokeCap internal constructor(@Suppress("unused") private val value: Int) {
     companion object {
-        /**
-         * Begin and end contours with a flat edge and no extension.
-         */
+        /** Begin and end contours with a flat edge and no extension. */
         val Butt = StrokeCap(0)
 
-        /**
-         * Begin and end contours with a semi-circle extension.
-         */
+        /** Begin and end contours with a semi-circle extension. */
         val Round = StrokeCap(1)
 
         /**
-         * Begin and end contours with a half square extension. This is
-         * similar to extending each contour by half the stroke width (as
-         * given by [Paint.strokeWidth]).
+         * Begin and end contours with a half square extension. This is similar to extending each
+         * contour by half the stroke width (as given by [Paint.strokeWidth]).
          */
         val Square = StrokeCap(2)
     }
 
-    override fun toString() = when (this) {
-        Butt -> "Butt"
-        Round -> "Round"
-        Square -> "Square"
-        else -> "Unknown"
-    }
+    override fun toString() =
+        when (this) {
+            Butt -> "Butt"
+            Round -> "Round"
+            Square -> "Square"
+            else -> "Unknown"
+        }
 }
diff --git a/compose/ui/ui-graphics/src/commonMain/kotlin/androidx/compose/ui/graphics/StrokeJoin.kt b/compose/ui/ui-graphics/src/commonMain/kotlin/androidx/compose/ui/graphics/StrokeJoin.kt
index 5eb6122..743802f 100644
--- a/compose/ui/ui-graphics/src/commonMain/kotlin/androidx/compose/ui/graphics/StrokeJoin.kt
+++ b/compose/ui/ui-graphics/src/commonMain/kotlin/androidx/compose/ui/graphics/StrokeJoin.kt
@@ -21,35 +21,31 @@
 /**
  * Styles to use for line joins.
  *
- * This only affects line joins for polygons drawn by [Canvas.drawPath] and
- * rectangles, not points drawn as lines with [Canvas.drawPoints].
- * See [Paint.strokeJoin].
+ * This only affects line joins for polygons drawn by [Canvas.drawPath] and rectangles, not points
+ * drawn as lines with [Canvas.drawPoints]. See [Paint.strokeJoin].
  */
 @Immutable
 @kotlin.jvm.JvmInline
 value class StrokeJoin internal constructor(@Suppress("unused") private val value: Int) {
     companion object {
-        /**
-         * Joins between line segments form sharp corners.
-         */
+        /** Joins between line segments form sharp corners. */
         val Miter = StrokeJoin(0)
 
-        /**
-         * Joins between line segments are semi-circular.
-         */
+        /** Joins between line segments are semi-circular. */
         val Round = StrokeJoin(1)
 
         /**
-         * Joins between line segments connect the corners of the butt ends of the
-         * line segments to give a beveled appearance.
+         * Joins between line segments connect the corners of the butt ends of the line segments to
+         * give a beveled appearance.
          */
         val Bevel = StrokeJoin(2)
     }
 
-    override fun toString() = when (this) {
-        Miter -> "Miter"
-        Round -> "Round"
-        Bevel -> "Bevel"
-        else -> "Unknown"
-    }
+    override fun toString() =
+        when (this) {
+            Miter -> "Miter"
+            Round -> "Round"
+            Bevel -> "Bevel"
+            else -> "Unknown"
+        }
 }
diff --git a/compose/ui/ui-graphics/src/commonMain/kotlin/androidx/compose/ui/graphics/TileMode.kt b/compose/ui/ui-graphics/src/commonMain/kotlin/androidx/compose/ui/graphics/TileMode.kt
index b6cbeaa..f614478 100644
--- a/compose/ui/ui-graphics/src/commonMain/kotlin/androidx/compose/ui/graphics/TileMode.kt
+++ b/compose/ui/ui-graphics/src/commonMain/kotlin/androidx/compose/ui/graphics/TileMode.kt
@@ -19,19 +19,16 @@
 import androidx.compose.runtime.Immutable
 
 /**
- * Defines what happens at the edge of the gradient.
- * A gradient is defined along a finite inner area. In the case of a linear
- * gradient, it's between the parallel lines that are orthogonal to the line
- * drawn between two points. In the case of radial gradients, it's the disc
- * that covers the circle centered on a particular point up to a given radius.
+ * Defines what happens at the edge of the gradient. A gradient is defined along a finite inner
+ * area. In the case of a linear gradient, it's between the parallel lines that are orthogonal to
+ * the line drawn between two points. In the case of radial gradients, it's the disc that covers the
+ * circle centered on a particular point up to a given radius.
  *
- * This enum is used to define how the gradient should paint the regions
- * outside that defined inner area.
+ * This enum is used to define how the gradient should paint the regions outside that defined inner
+ * area.
  *
- * See also:
- * [LinearGradientShader], [RadialGradientShader] which works in
- * relative coordinates and can create a [Shader] representing the gradient
- * for a particular [Rect] on demand.
+ * See also: [LinearGradientShader], [RadialGradientShader] which works in relative coordinates and
+ * can create a [Shader] representing the gradient for a particular [Rect] on demand.
  */
 @Immutable
 @kotlin.jvm.JvmInline
@@ -40,8 +37,8 @@
         /**
          * Edge is clamped to the final color.
          *
-         * The gradient will paint the all the regions outside the inner area with
-         * the color of the point closest to that region.
+         * The gradient will paint the all the regions outside the inner area with the color of the
+         * point closest to that region.
          * ![TileMode.Clamp](https://developer.android.com/static/images/jetpack/compose/graphics/brush/tile_mode_clamp.png)
          */
         val Clamp = TileMode(0)
@@ -49,44 +46,44 @@
         /**
          * Edge is repeated from first color to last.
          *
-         * This is as if the stop points from 0.0 to 1.0 were then repeated from 1.0
-         * to 2.0, 2.0 to 3.0, and so forth (and for linear gradients, similarly from
-         * -1.0 to 0.0, -2.0 to -1.0, etc).
+         * This is as if the stop points from 0.0 to 1.0 were then repeated from 1.0 to 2.0, 2.0 to
+         * 3.0, and so forth (and for linear gradients, similarly from -1.0 to 0.0, -2.0 to -1.0,
+         * etc).
          * ![TileMode.Repeated](https://developer.android.com/static/images/jetpack/compose/graphics/brush/tile_mode_repeated.png)
          */
         val Repeated = TileMode(1)
 
         /**
-         * Edge is mirrored from last color to first.
-         * This is as if the stop points from 0.0 to 1.0 were then repeated backwards
-         * from 2.0 to 1.0, then forwards from 2.0 to 3.0, then backwards again from
-         * 4.0 to 3.0, and so forth (and for linear gradients, similarly from in the
-         * negative direction).
+         * Edge is mirrored from last color to first. This is as if the stop points from 0.0 to 1.0
+         * were then repeated backwards from 2.0 to 1.0, then forwards from 2.0 to 3.0, then
+         * backwards again from 4.0 to 3.0, and so forth (and for linear gradients, similarly from
+         * in the negative direction).
          * ![TileMode.Mirror](https://developer.android.com/static/images/jetpack/compose/graphics/brush/tile_mode_mirror.png)
          */
         val Mirror = TileMode(2)
 
         /**
-         * Render the shader's image pixels only within its original bounds. If the shader
-         * draws outside of its original bounds, transparent black is drawn instead.
+         * Render the shader's image pixels only within its original bounds. If the shader draws
+         * outside of its original bounds, transparent black is drawn instead.
          * ![TileMode.Decal](https://developer.android.com/static/images/jetpack/compose/graphics/brush/tile_mode_decal.png)
          */
         val Decal = TileMode(3)
     }
 
-    override fun toString() = when (this) {
-        Clamp -> "Clamp"
-        Repeated -> "Repeated"
-        Mirror -> "Mirror"
-        Decal -> "Decal"
-        else -> "Unknown"
-    }
+    override fun toString() =
+        when (this) {
+            Clamp -> "Clamp"
+            Repeated -> "Repeated"
+            Mirror -> "Mirror"
+            Decal -> "Decal"
+            else -> "Unknown"
+        }
 }
 
 /**
- * Capability query to determine if the particular platform supports the [TileMode]. Not
- * all platforms support all tile mode algorithms, however, [TileMode.Clamp], [TileMode.Repeated]
- * and [TileMode.Mirror] are guaranteed to be supported. If a [TileMode] that is not supported is
- * used, the default of [TileMode.Clamp] is consumed instead.
+ * Capability query to determine if the particular platform supports the [TileMode]. Not all
+ * platforms support all tile mode algorithms, however, [TileMode.Clamp], [TileMode.Repeated] and
+ * [TileMode.Mirror] are guaranteed to be supported. If a [TileMode] that is not supported is used,
+ * the default of [TileMode.Clamp] is consumed instead.
  */
 expect fun TileMode.isSupported(): Boolean
diff --git a/compose/ui/ui-graphics/src/commonMain/kotlin/androidx/compose/ui/graphics/VertexMode.kt b/compose/ui/ui-graphics/src/commonMain/kotlin/androidx/compose/ui/graphics/VertexMode.kt
index 6a3c3a4..164abc8 100644
--- a/compose/ui/ui-graphics/src/commonMain/kotlin/androidx/compose/ui/graphics/VertexMode.kt
+++ b/compose/ui/ui-graphics/src/commonMain/kotlin/androidx/compose/ui/graphics/VertexMode.kt
@@ -28,14 +28,10 @@
 value class VertexMode internal constructor(@Suppress("unused") private val value: Int) {
 
     companion object {
-        /**
-         * Draw each sequence of three points as the vertices of a triangle.
-         */
+        /** Draw each sequence of three points as the vertices of a triangle. */
         val Triangles = VertexMode(0)
 
-        /**
-         *  Draw each sliding window of three points as the vertices of a triangle.
-         */
+        /** Draw each sliding window of three points as the vertices of a triangle. */
         val TriangleStrip = VertexMode(1)
 
         /**
@@ -44,10 +40,11 @@
         val TriangleFan = VertexMode(2)
     }
 
-    override fun toString() = when (this) {
-        Triangles -> "Triangles"
-        TriangleStrip -> "TriangleStrip"
-        TriangleFan -> "TriangleFan"
-        else -> "Unknown"
-    }
+    override fun toString() =
+        when (this) {
+            Triangles -> "Triangles"
+            TriangleStrip -> "TriangleStrip"
+            TriangleFan -> "TriangleFan"
+            else -> "Unknown"
+        }
 }
diff --git a/compose/ui/ui-graphics/src/commonMain/kotlin/androidx/compose/ui/graphics/Vertices.kt b/compose/ui/ui-graphics/src/commonMain/kotlin/androidx/compose/ui/graphics/Vertices.kt
index 2938e56..39433aa 100644
--- a/compose/ui/ui-graphics/src/commonMain/kotlin/androidx/compose/ui/graphics/Vertices.kt
+++ b/compose/ui/ui-graphics/src/commonMain/kotlin/androidx/compose/ui/graphics/Vertices.kt
@@ -19,7 +19,7 @@
 import androidx.compose.ui.geometry.Offset
 import androidx.compose.ui.util.fastAny
 
-/**  A set of vertex data used by [Canvas.drawVertices]. */
+/** A set of vertex data used by [Canvas.drawVertices]. */
 class Vertices(
     val vertexMode: VertexMode,
     positions: List<Offset>,
@@ -41,24 +41,17 @@
             throw IllegalArgumentException("positions and colors lengths must match.")
         if (indices.fastAny(outOfBounds))
             throw IllegalArgumentException(
-                "indices values must be valid indices " +
-                    "in the positions list."
+                "indices values must be valid indices " + "in the positions list."
             )
 
         this.positions = encodePointList(positions)
         this.textureCoordinates = encodePointList(textureCoordinates)
         this.colors = encodeColorList(colors)
-        this.indices = ShortArray(indices.size) {
-            i ->
-            indices[i].toShort()
-        }
+        this.indices = ShortArray(indices.size) { i -> indices[i].toShort() }
     }
 
     private fun encodeColorList(colors: List<Color>): IntArray {
-        return IntArray(colors.size) {
-            i ->
-            colors[i].toArgb()
-        }
+        return IntArray(colors.size) { i -> colors[i].toArgb() }
     }
 
     private fun encodePointList(points: List<Offset>): FloatArray {
diff --git a/compose/ui/ui-graphics/src/commonMain/kotlin/androidx/compose/ui/graphics/colorspace/Adaptation.kt b/compose/ui/ui-graphics/src/commonMain/kotlin/androidx/compose/ui/graphics/colorspace/Adaptation.kt
index 2c8bd5a..d8f07e6 100644
--- a/compose/ui/ui-graphics/src/commonMain/kotlin/androidx/compose/ui/graphics/colorspace/Adaptation.kt
+++ b/compose/ui/ui-graphics/src/commonMain/kotlin/androidx/compose/ui/graphics/colorspace/Adaptation.kt
@@ -17,27 +17,27 @@
 package androidx.compose.ui.graphics.colorspace
 
 /**
- * List of adaptation matrices that can be used for chromatic adaptation
- * using the von Kries transform. These matrices are used to convert values
- * in the CIE XYZ space to values in the LMS space (Long Medium Short).
+ * List of adaptation matrices that can be used for chromatic adaptation using the von Kries
+ * transform. These matrices are used to convert values in the CIE XYZ space to values in the LMS
+ * space (Long Medium Short).
  *
- * Given an adaptation matrix `A`, the conversion from XYZ to
- * LMS is straightforward:
+ * Given an adaptation matrix `A`, the conversion from XYZ to LMS is straightforward:
  *
- * [See equation](https://developer.android.com/reference/android/graphics/ColorSpace.Adaptation.html)
+ * [See
+ * equation](https://developer.android.com/reference/android/graphics/ColorSpace.Adaptation.html)
  *
- * The complete von Kries transform `T` uses a diagonal matrix
- * noted `D` to perform the adaptation in LMS space. In addition
- * to `A` and `D`, the source white point `W1` and the destination
- * white point `W2` must be specified:
+ * The complete von Kries transform `T` uses a diagonal matrix noted `D` to perform the adaptation
+ * in LMS space. In addition to `A` and `D`, the source white point `W1` and the destination white
+ * point `W2` must be specified:
  *
- * [See equation](https://developer.android.com/reference/android/graphics/ColorSpace.Adaptation.html)
+ * [See
+ * equation](https://developer.android.com/reference/android/graphics/ColorSpace.Adaptation.html)
  *
- * As an example, the resulting matrix `T` can then be used to
- * perform the chromatic adaptation of sRGB XYZ transform from D65
- * to D50:
+ * As an example, the resulting matrix `T` can then be used to perform the chromatic adaptation of
+ * sRGB XYZ transform from D65 to D50:
  *
- * [See equation](https://developer.android.com/reference/android/graphics/ColorSpace.Adaptation.html)
+ * [See
+ * equation](https://developer.android.com/reference/android/graphics/ColorSpace.Adaptation.html)
  *
  * @see Connector
  * @see ColorSpace.connect
@@ -45,44 +45,65 @@
 abstract class Adaptation private constructor(internal val transform: FloatArray) {
     companion object {
         /**
-         * Bradford chromatic adaptation transform, as defined in the
-         * CIECAM97s color appearance model.
+         * Bradford chromatic adaptation transform, as defined in the CIECAM97s color appearance
+         * model.
          */
-        val Bradford = object : Adaptation(
-            floatArrayOf(
-                0.8951f, -0.7502f, 0.0389f,
-                0.2664f, 1.7135f, -0.0685f,
-                -0.1614f, 0.0367f, 1.0296f
-            )
-        ) {
-            override fun toString() = "Bradford"
-        }
+        val Bradford =
+            object :
+                Adaptation(
+                    floatArrayOf(
+                        0.8951f,
+                        -0.7502f,
+                        0.0389f,
+                        0.2664f,
+                        1.7135f,
+                        -0.0685f,
+                        -0.1614f,
+                        0.0367f,
+                        1.0296f
+                    )
+                ) {
+                override fun toString() = "Bradford"
+            }
+
+        /** von Kries chromatic adaptation transform. */
+        val VonKries =
+            object :
+                Adaptation(
+                    floatArrayOf(
+                        0.40024f,
+                        -0.22630f,
+                        0.00000f,
+                        0.70760f,
+                        1.16532f,
+                        0.00000f,
+                        -0.08081f,
+                        0.04570f,
+                        0.91822f
+                    )
+                ) {
+                override fun toString() = "VonKries"
+            }
 
         /**
-         * von Kries chromatic adaptation transform.
+         * CIECAT02 chromatic adaption transform, as defined in the CIECAM02 color appearance model.
          */
-        val VonKries = object : Adaptation(
-            floatArrayOf(
-                0.40024f, -0.22630f, 0.00000f,
-                0.70760f, 1.16532f, 0.00000f,
-                -0.08081f, 0.04570f, 0.91822f
-            )
-        ) {
-            override fun toString() = "VonKries"
-        }
-
-        /**
-         * CIECAT02 chromatic adaption transform, as defined in the
-         * CIECAM02 color appearance model.
-         */
-        val Ciecat02 = object : Adaptation(
-            floatArrayOf(
-                0.7328f, -0.7036f, 0.0030f,
-                0.4296f, 1.6975f, 0.0136f,
-                -0.1624f, 0.0061f, 0.9834f
-            )
-        ) {
-            override fun toString() = "Ciecat02"
-        }
+        val Ciecat02 =
+            object :
+                Adaptation(
+                    floatArrayOf(
+                        0.7328f,
+                        -0.7036f,
+                        0.0030f,
+                        0.4296f,
+                        1.6975f,
+                        0.0136f,
+                        -0.1624f,
+                        0.0061f,
+                        0.9834f
+                    )
+                ) {
+                override fun toString() = "Ciecat02"
+            }
     }
 }
diff --git a/compose/ui/ui-graphics/src/commonMain/kotlin/androidx/compose/ui/graphics/colorspace/ColorModel.kt b/compose/ui/ui-graphics/src/commonMain/kotlin/androidx/compose/ui/graphics/colorspace/ColorModel.kt
index eb65cf6..8943628 100644
--- a/compose/ui/ui-graphics/src/commonMain/kotlin/androidx/compose/ui/graphics/colorspace/ColorModel.kt
+++ b/compose/ui/ui-graphics/src/commonMain/kotlin/androidx/compose/ui/graphics/colorspace/ColorModel.kt
@@ -23,17 +23,17 @@
 import androidx.compose.ui.util.unpackInt1
 
 /**
- * A color model is required by a [ColorSpace] to describe the
- * way colors can be represented as tuples of numbers. A common color
- * model is the [RGB][Rgb] color model which defines a color
- * as represented by a tuple of 3 numbers (red, green and blue).
+ * A color model is required by a [ColorSpace] to describe the way colors can be represented as
+ * tuples of numbers. A common color model is the [RGB][Rgb] color model which defines a color as
+ * represented by a tuple of 3 numbers (red, green and blue).
  */
 @Immutable
 @kotlin.jvm.JvmInline
-value class ColorModel internal constructor(
+value class ColorModel
+internal constructor(
     /**
-     * pack both the number of components and an ordinal value to distinguish between
-     * different ColorModel types that have the same number of components
+     * pack both the number of components and an ordinal value to distinguish between different
+     * ColorModel types that have the same number of components
      */
     internal val packedValue: Long
 ) {
@@ -51,40 +51,36 @@
 
     companion object {
         /**
-         * The RGB model is a color model with 3 components that
-         * refer to the three additive primiaries: red, green
-         * and blue.
+         * The RGB model is a color model with 3 components that refer to the three additive
+         * primiaries: red, green and blue.
          */
         val Rgb = ColorModel(packInts(3, 0))
 
         /**
-         * The XYZ model is a color model with 3 components that
-         * are used to model human color vision on a basic sensory
-         * level.
+         * The XYZ model is a color model with 3 components that are used to model human color
+         * vision on a basic sensory level.
          */
         val Xyz = ColorModel(packInts(3, 1))
 
         /**
-         * The Lab model is a color model with 3 components used
-         * to describe a color space that is more perceptually
-         * uniform than XYZ.
+         * The Lab model is a color model with 3 components used to describe a color space that is
+         * more perceptually uniform than XYZ.
          */
         val Lab = ColorModel(packInts(3, 2))
 
         /**
-         * The CMYK model is a color model with 4 components that
-         * refer to four inks used in color printing: cyan, magenta,
-         * yellow and black (or key). CMYK is a subtractive color
-         * model.
+         * The CMYK model is a color model with 4 components that refer to four inks used in color
+         * printing: cyan, magenta, yellow and black (or key). CMYK is a subtractive color model.
          */
         val Cmyk = ColorModel(packInts(4, 3))
     }
 
-    override fun toString() = when (this) {
-        Rgb -> "Rgb"
-        Xyz -> "Xyz"
-        Lab -> "Lab"
-        Cmyk -> "Cmyk"
-        else -> "Unknown"
-    }
+    override fun toString() =
+        when (this) {
+            Rgb -> "Rgb"
+            Xyz -> "Xyz"
+            Lab -> "Lab"
+            Cmyk -> "Cmyk"
+            else -> "Unknown"
+        }
 }
diff --git a/compose/ui/ui-graphics/src/commonMain/kotlin/androidx/compose/ui/graphics/colorspace/ColorSpace.kt b/compose/ui/ui-graphics/src/commonMain/kotlin/androidx/compose/ui/graphics/colorspace/ColorSpace.kt
index c766788..3905cff 100644
--- a/compose/ui/ui-graphics/src/commonMain/kotlin/androidx/compose/ui/graphics/colorspace/ColorSpace.kt
+++ b/compose/ui/ui-graphics/src/commonMain/kotlin/androidx/compose/ui/graphics/colorspace/ColorSpace.kt
@@ -24,58 +24,48 @@
 import kotlin.math.withSign
 
 /**
- * A [ColorSpace] is used to identify a specific organization of colors.
- * Each color space is characterized by a [color model][ColorModel] that defines
- * how a color value is represented (for instance the [RGB][ColorModel.Rgb] color
- * model defines a color value as a triplet of numbers).
+ * A [ColorSpace] is used to identify a specific organization of colors. Each color space is
+ * characterized by a [color model][ColorModel] that defines how a color value is represented (for
+ * instance the [RGB][ColorModel.Rgb] color model defines a color value as a triplet of numbers).
  *
- * Each component of a color must fall within a valid range, specific to each
- * color space, defined by [getMinValue] and [getMaxValue]
- * This range is commonly `[0..1]`. While it is recommended to use values in the
- * valid range, a color space always clamps input and output values when performing
- * operations such as converting to a different color space.
+ * Each component of a color must fall within a valid range, specific to each color space, defined
+ * by [getMinValue] and [getMaxValue] This range is commonly `[0..1]`. While it is recommended to
+ * use values in the valid range, a color space always clamps input and output values when
+ * performing operations such as converting to a different color space.
  *
  * ### Using color spaces
  *
- * This implementation provides a pre-defined set of common color spaces
- * described in the [ColorSpaces] object.
+ * This implementation provides a pre-defined set of common color spaces described in the
+ * [ColorSpaces] object.
  *
- * The documentation of [ColorSpaces] provides a detailed description of the
- * various characteristics of each available color space.
+ * The documentation of [ColorSpaces] provides a detailed description of the various characteristics
+ * of each available color space.
  *
  * ### Color space conversions
  *
- * To allow conversion between color spaces, this implementation uses the CIE
- * XYZ profile connection space (PCS). Color values can be converted to and from
- * this PCS using [toXyz] and [fromXyz].
+ * To allow conversion between color spaces, this implementation uses the CIE XYZ profile connection
+ * space (PCS). Color values can be converted to and from this PCS using [toXyz] and [fromXyz].
  *
- * For color space with a non-RGB color model, the white point of the PCS
- * *must be* the CIE standard illuminant D50. RGB color spaces use their
- * native white point (D65 for [sRGB][ColorSpaces.Srgb] for instance and must
- * undergo [chromatic adaptation][Adaptation] as necessary.
+ * For color space with a non-RGB color model, the white point of the PCS *must be* the CIE standard
+ * illuminant D50. RGB color spaces use their native white point (D65 for [sRGB][ColorSpaces.Srgb]
+ * for instance and must undergo [chromatic adaptation][Adaptation] as necessary.
  *
- * Since the white point of the PCS is not defined for RGB color space, it is
- * highly recommended to use the [connect] method to perform conversions
- * between color spaces. A color space can be
- * manually adapted to a specific white point using [adapt].
- * Please refer to the documentation of [RGB color spaces][Rgb] for more
- * information. Several common CIE standard illuminants are provided in this
- * class as reference (see [Illuminant.D65] or [Illuminant.D50]
- * for instance).
+ * Since the white point of the PCS is not defined for RGB color space, it is highly recommended to
+ * use the [connect] method to perform conversions between color spaces. A color space can be
+ * manually adapted to a specific white point using [adapt]. Please refer to the documentation of
+ * [RGB color spaces][Rgb] for more information. Several common CIE standard illuminants are
+ * provided in this class as reference (see [Illuminant.D65] or [Illuminant.D50] for instance).
  *
  * Here is an example of how to convert from a color space to another:
  *
  *     // Convert from DCI-P3 to Rec.2020
  *     val connector = ColorSpaces.DciP3.connect(ColorSpaces.BT2020)
- *
  *     val bt2020Values = connector.transform(p3r, p3g, p3b);
  *
- * You can easily convert to [sRGB][ColorSpaces.Srgb] by omitting the color space
- * parameter:
+ * You can easily convert to [sRGB][ColorSpaces.Srgb] by omitting the color space parameter:
  *
  *     // Convert from DCI-P3 to sRGB
  *     val connector = ColorSpaces.DciP3.connect()
- *
  *     val sRGBValues = connector.transform(p3r, p3g, p3b);
  *
  * Conversions also work between color spaces with different color models:
@@ -85,42 +75,37 @@
  *
  * ### Color spaces and multi-threading
  *
- * Color spaces and other related classes ([Connector] for instance)
- * are immutable and stateless. They can be safely used from multiple concurrent
- * threads.
+ * Color spaces and other related classes ([Connector] for instance) are immutable and stateless.
+ * They can be safely used from multiple concurrent threads.
  *
  * @see ColorSpaces
  * @see ColorModel
  * @see Connector
  * @see Adaptation
  */
-abstract class ColorSpace internal constructor(
+abstract class ColorSpace
+internal constructor(
     /**
-     * Returns the name of this color space. The name is never null
-     * and contains always at least 1 character.
+     * Returns the name of this color space. The name is never null and contains always at least 1
+     * character.
      *
-     * Color space names are recommended to be unique but are not
-     * guaranteed to be. There is no defined format but the name usually
-     * falls in one of the following categories:
+     * Color space names are recommended to be unique but are not guaranteed to be. There is no
+     * defined format but the name usually falls in one of the following categories:
+     * * Generic names used to identify color spaces in non-RGB color models. For instance:
+     *   [Generic L*a*b*][ColorSpaces.CieLab].
+     * * Names tied to a particular specification. For instance:
+     *   [sRGB IEC61966-2.1][ColorSpaces.Srgb] or [SMPTE ST 2065-1:2012 ACES][ColorSpaces.Aces].
+     * * Ad-hoc names, often generated procedurally or by the user during a calibration workflow.
+     *   These names often contain the make and model of the display.
      *
-     *  * Generic names used to identify color spaces in non-RGB
-     * color models. For instance: [Generic L*a*b*][ColorSpaces.CieLab].
-     *  * Names tied to a particular specification. For instance:
-     * [sRGB IEC61966-2.1][ColorSpaces.Srgb] or
-     * [SMPTE ST 2065-1:2012 ACES][ColorSpaces.Aces].
-     *  * Ad-hoc names, often generated procedurally or by the user
-     * during a calibration workflow. These names often contain the
-     * make and model of the display.
+     * Because the format of color space names is not defined, it is not recommended to
+     * programmatically identify a color space by its name alone. Names can be used as a first
+     * approximation.
      *
-     * Because the format of color space names is not defined, it is
-     * not recommended to programmatically identify a color space by its
-     * name alone. Names can be used as a first approximation.
-     *
-     * It is however perfectly acceptable to display color space names to
-     * users in a UI, or in debuggers and logs. When displaying a color space
-     * name to the user, it is recommended to add extra information to avoid
-     * ambiguities: color model, a representation of the color space's gamut,
-     * white point, etc.
+     * It is however perfectly acceptable to display color space names to users in a UI, or in
+     * debuggers and logs. When displaying a color space name to the user, it is recommended to add
+     * extra information to avoid ambiguities: color model, a representation of the color space's
+     * gamut, white point, etc.
      *
      * @return A non-null String of length >= 1
      */
@@ -135,65 +120,50 @@
     val model: ColorModel,
 
     /**
-     * The ID of this color space. Positive IDs match the color
-     * spaces enumerated in [ColorSpaces]. A negative ID indicates a
-     * color space created by calling one of the public constructors.
+     * The ID of this color space. Positive IDs match the color spaces enumerated in [ColorSpaces].
+     * A negative ID indicates a color space created by calling one of the public constructors.
      */
     internal val id: Int
 ) {
     constructor(name: String, model: ColorModel) : this(name, model, MinId)
+
     /**
-     * Returns the number of components that form a color value according
-     * to this color space's color model.
+     * Returns the number of components that form a color value according to this color space's
+     * color model.
      *
      * @return An integer between 1 and 4
-     *
      * @see ColorModel
      * @see model
      */
     val componentCount: Int
-        @IntRange(from = 1, to = 4)
-        get() = model.componentCount
+        @IntRange(from = 1, to = 4) get() = model.componentCount
 
     /**
-     * Returns whether this color space is a wide-gamut color space.
-     * An RGB color space is wide-gamut if its gamut entirely contains
-     * the [sRGB][ColorSpaces.Srgb] gamut and if the area of its gamut is
-     * 90% of greater than the area of the [NTSC][ColorSpaces.Ntsc1953]
-     * gamut.
+     * Returns whether this color space is a wide-gamut color space. An RGB color space is
+     * wide-gamut if its gamut entirely contains the [sRGB][ColorSpaces.Srgb] gamut and if the area
+     * of its gamut is 90% of greater than the area of the [NTSC][ColorSpaces.Ntsc1953] gamut.
      *
-     * @return True if this color space is a wide-gamut color space,
-     * false otherwise
+     * @return True if this color space is a wide-gamut color space, false otherwise
      */
     abstract val isWideGamut: Boolean
 
     /**
+     * Indicates whether this color space is the sRGB color space or equivalent to the sRGB color
+     * space.
      *
-     * Indicates whether this color space is the sRGB color space or
-     * equivalent to the sRGB color space.
-     *
-     * A color space is considered sRGB if it meets all the following
-     * conditions:
-     *
-     *  * Its color model is [ColorModel.Rgb].
-     *  *
-     * Its primaries are within 1e-3 of the true
-     * [sRGB][ColorSpaces.Srgb] primaries.
-     *
-     *  *
-     * Its white point is within 1e-3 of the CIE standard
-     * illuminant [D65][Illuminant.D65].
-     *
-     *  * Its opto-electronic transfer function is not linear.
-     *  * Its electro-optical transfer function is not linear.
-     *  * Its transfer functions yield values within 1e-3 of [ColorSpaces.Srgb].
-     *  * Its range is `[0..1]`.
-     *
+     * A color space is considered sRGB if it meets all the following conditions:
+     * * Its color model is [ColorModel.Rgb]. * Its primaries are within 1e-3 of the true
+     *   [sRGB][ColorSpaces.Srgb] primaries.
+     *     * Its white point is within 1e-3 of the CIE standard illuminant [D65][Illuminant.D65].
+     * * Its opto-electronic transfer function is not linear.
+     * * Its electro-optical transfer function is not linear.
+     * * Its transfer functions yield values within 1e-3 of [ColorSpaces.Srgb].
+     * * Its range is `[0..1]`.
      *
      * This method always returns true for [ColorSpaces.Srgb].
      *
-     * @return True if this color space is the sRGB color space (or a
-     * close approximation), false otherwise
+     * @return True if this color space is the sRGB color space (or a close approximation), false
+     *   otherwise
      */
     open val isSrgb: Boolean
         get() = false
@@ -212,46 +182,40 @@
     }
 
     /**
-     * Returns the minimum valid value for the specified component of this
-     * color space's color model.
+     * Returns the minimum valid value for the specified component of this color space's color
+     * model.
      *
      * @param component The index of the component, from `0` to `3`, inclusive.
      * @return A floating point value less than [getMaxValue]
-     *
      * @see getMaxValue
      * @see ColorModel.componentCount
      */
     abstract fun getMinValue(@IntRange(from = 0, to = 3) component: Int): Float
 
     /**
-     * Returns the maximum valid value for the specified component of this
-     * color space's color model.
+     * Returns the maximum valid value for the specified component of this color space's color
+     * model.
      *
      * @param component The index of the component, from `0` to `3`, inclusive
      * @return A floating point value greater than [getMinValue]
-     *
      * @see getMinValue
      * @see ColorModel.componentCount
      */
     abstract fun getMaxValue(@IntRange(from = 0, to = 3) component: Int): Float
 
     /**
-     * Converts a color value from this color space's model to
-     * tristimulus CIE XYZ values. If the color model of this color
-     * space is not [RGB][ColorModel.Rgb], it is assumed that the
-     * target CIE XYZ space uses a [D50][Illuminant.D50]
-     * standard illuminant.
+     * Converts a color value from this color space's model to tristimulus CIE XYZ values. If the
+     * color model of this color space is not [RGB][ColorModel.Rgb], it is assumed that the target
+     * CIE XYZ space uses a [D50][Illuminant.D50] standard illuminant.
      *
-     * This method is a convenience for color spaces with a model
-     * of 3 components ([RGB][ColorModel.Rgb] or [ColorModel.Lab]
-     * for instance). With color spaces using fewer or more components,
-     * use [toXyz] instead.
+     * This method is a convenience for color spaces with a model of 3 components
+     * ([RGB][ColorModel.Rgb] or [ColorModel.Lab] for instance). With color spaces using fewer or
+     * more components, use [toXyz] instead.
      *
      * @param r The first component of the value to convert from (typically R in RGB)
      * @param g The second component of the value to convert from (typically G in RGB)
      * @param b The third component of the value to convert from (typically B in RGB)
      * @return A new array of 3 floats, containing tristimulus XYZ values
-     *
      * @see toXyz
      * @see fromXyz
      */
@@ -261,47 +225,36 @@
     }
 
     /**
-     * Converts a color value from this color space's model to
-     * tristimulus CIE XYZ values. If the color model of this color
-     * space is not [RGB][ColorModel.Rgb], it is assumed that the
-     * target CIE XYZ space uses a [D50][Illuminant.D50]
-     * standard illuminant.
+     * Converts a color value from this color space's model to tristimulus CIE XYZ values. If the
+     * color model of this color space is not [RGB][ColorModel.Rgb], it is assumed that the target
+     * CIE XYZ space uses a [D50][Illuminant.D50] standard illuminant.
      *
-     * The specified array's length  must be at least
-     * equal to to the number of color components as returned by
-     * [ColorModel.componentCount].
+     * The specified array's length must be at least equal to to the number of color components as
+     * returned by [ColorModel.componentCount].
      *
-     * @param v An array of color components containing the color space's
-     * color value to convert to XYZ, and large enough to hold
-     * the resulting tristimulus XYZ values, at least 3 values.
+     * @param v An array of color components containing the color space's color value to convert to
+     *   XYZ, and large enough to hold the resulting tristimulus XYZ values, at least 3 values.
      * @return The array passed in parameter [v].
-     *
      * @see toXyz
      * @see fromXyz
      */
-    @Size(min = 3)
-    abstract fun toXyz(@Size(min = 3) v: FloatArray): FloatArray
+    @Size(min = 3) abstract fun toXyz(@Size(min = 3) v: FloatArray): FloatArray
 
-    /**
-     * Same as [toXyz], but returns only the x and y components packed into a long.
-     */
+    /** Same as [toXyz], but returns only the x and y components packed into a long. */
     internal open fun toXy(v0: Float, v1: Float, v2: Float): Long {
         val xyz = toXyz(v0, v1, v2)
         return packFloats(xyz[0], xyz[1])
     }
 
-    /**
-     * Same as [toXyz], but returns only the z component.
-     */
+    /** Same as [toXyz], but returns only the z component. */
     internal open fun toZ(v0: Float, v1: Float, v2: Float): Float {
         val xyz = toXyz(v0, v1, v2)
         return xyz[2]
     }
 
     /**
-     * Converts [x], [y], [z] components to this ColorSpace and returns a color
-     * with the resulting values, using [a] for alpha, and [colorSpace] for the
-     * color space.
+     * Converts [x], [y], [z] components to this ColorSpace and returns a color with the resulting
+     * values, using [a] for alpha, and [colorSpace] for the color space.
      */
     internal open fun xyzaToColor(
         x: Float,
@@ -315,15 +268,13 @@
     }
 
     /**
-     * Converts tristimulus values from the CIE XYZ space to this
-     * color space's color model.
+     * Converts tristimulus values from the CIE XYZ space to this color space's color model.
      *
      * @param x The X component of the color value
      * @param y The Y component of the color value
      * @param z The Z component of the color value
-     * @return A new array whose size is equal to the number of color
-     * components as returned by [ColorModel.componentCount].
-     *
+     * @return A new array whose size is equal to the number of color components as returned by
+     *   [ColorModel.componentCount].
      * @see fromXyz
      * @see toXyz
      */
@@ -337,35 +288,30 @@
     }
 
     /**
-     * Converts tristimulus values from the CIE XYZ space to this color
-     * space's color model. The resulting value is passed back in the specified
-     * array.
+     * Converts tristimulus values from the CIE XYZ space to this color space's color model. The
+     * resulting value is passed back in the specified array.
      *
-     * The specified array's length  must be at least equal to
-     * to the number of color components as returned by
-     * [ColorModel.componentCount], and its first 3 values must
-     * be the XYZ components to convert from.
+     * The specified array's length must be at least equal to to the number of color components as
+     * returned by [ColorModel.componentCount], and its first 3 values must be the XYZ components to
+     * convert from.
      *
-     * @param v An array of color components containing the XYZ values
-     * to convert from, and large enough to hold the number
-     * of components of this color space's model. The minimum size is 3, but
-     * most color spaces have 4 components.
+     * @param v An array of color components containing the XYZ values to convert from, and large
+     *   enough to hold the number of components of this color space's model. The minimum size is 3,
+     *   but most color spaces have 4 components.
      * @return The array passed in parameter [v].
-     *
      * @see fromXyz
      * @see toXyz
      */
-    @Size(min = 3)
-    abstract fun fromXyz(@Size(min = 3) v: FloatArray): FloatArray
+    @Size(min = 3) abstract fun fromXyz(@Size(min = 3) v: FloatArray): FloatArray
 
     /**
-     * Returns a string representation of the object. This method returns
-     * a string equal to the value of:
+     * Returns a string representation of the object. This method returns a string equal to the
+     * value of:
      *
      *     "$name "(id=$id, model=$model)"
      *
-     * For instance, the string representation of the [sRGB][ColorSpaces.Srgb]
-     * color space is equal to the following value:
+     * For instance, the string representation of the [sRGB][ColorSpaces.Srgb] color space is equal
+     * to the following value:
      *
      *     sRGB IEC61966-2.1 (id=0, model=RGB)
      *
@@ -424,25 +370,20 @@
     return if (source === destination) {
         Connector.identity(source)
     } else if (source.model == ColorModel.Rgb && destination.model == ColorModel.Rgb) {
-        Connector.RgbConnector(
-            source as Rgb,
-            destination as Rgb,
-            intent
-        )
+        Connector.RgbConnector(source as Rgb, destination as Rgb, intent)
     } else {
         Connector(source, destination, intent)
     }
 }
 
 /**
- * Connects two color spaces to allow conversion from the source color
- * space to the destination color space. If the source and destination
- * color spaces do not have the same profile connection space (CIE XYZ
- * with the same white point), they are chromatically adapted to use the
- * CIE standard illuminant [D50][Illuminant.D50] as needed.
+ * Connects two color spaces to allow conversion from the source color space to the destination
+ * color space. If the source and destination color spaces do not have the same profile connection
+ * space (CIE XYZ with the same white point), they are chromatically adapted to use the CIE standard
+ * illuminant [D50][Illuminant.D50] as needed.
  *
- * If the source and destination are the same, an optimized connector
- * is returned to avoid unnecessary computations and loss of precision.
+ * If the source and destination are the same, an optimized connector is returned to avoid
+ * unnecessary computations and loss of precision.
  *
  * @param destination The color space to convert colors to
  * @param intent The render intent to map colors from the source to the destination
@@ -464,20 +405,17 @@
 }
 
 /**
- * Performs the chromatic adaptation of a color space from its native
- * white point to the specified white point. If the specified color space
- * does not have an [RGB][ColorModel.Rgb] color model, or if the color
- * space already has the target white point, the color space is returned
- * unmodified.
+ * Performs the chromatic adaptation of a color space from its native white point to the specified
+ * white point. If the specified color space does not have an [RGB][ColorModel.Rgb] color model, or
+ * if the color space already has the target white point, the color space is returned unmodified.
  *
- * The chromatic adaptation is performed using the von Kries method
- * described in the documentation of [Adaptation].
+ * The chromatic adaptation is performed using the von Kries method described in the documentation
+ * of [Adaptation].
  *
  * @param whitePoint The new white point
  * @param adaptation The adaptation matrix
- * @return A new color space if the specified color space has an RGB
- * model and a white point different from the specified white
- * point; the specified color space otherwise
+ * @return A new color space if the specified color space has an RGB model and a white point
+ *   different from the specified white point; the specified color space otherwise
  * @see Adaptation
  */
 @kotlin.jvm.JvmOverloads
@@ -493,15 +431,8 @@
 
         val xyz = whitePoint.toXyz()
         val adaptationTransform =
-            chromaticAdaptation(
-                adaptation.transform,
-                rgb.whitePoint.toXyz(),
-                xyz
-            )
-        val transform = mul3x3(
-            adaptationTransform,
-            rgb.transform
-        )
+            chromaticAdaptation(adaptation.transform, rgb.whitePoint.toXyz(), xyz)
+        val transform = mul3x3(adaptationTransform, rgb.transform)
 
         return Rgb(rgb, transform, whitePoint)
     }
@@ -509,16 +440,14 @@
 }
 
 // Reciprocal piecewise gamma response
-internal fun rcpResponse(x: Double, a: Double, b: Double, c: Double, d: Double, g: Double):
-    Double {
-        return if (x >= d * c) (x.pow(1.0 / g) - b) / a else x / c
-    }
+internal fun rcpResponse(x: Double, a: Double, b: Double, c: Double, d: Double, g: Double): Double {
+    return if (x >= d * c) (x.pow(1.0 / g) - b) / a else x / c
+}
 
 // Piecewise gamma response
-internal fun response(x: Double, a: Double, b: Double, c: Double, d: Double, g: Double):
-    Double {
-        return if (x >= d) (a * x + b).pow(g) else c * x
-    }
+internal fun response(x: Double, a: Double, b: Double, c: Double, d: Double, g: Double): Double {
+    return if (x >= d) (a * x + b).pow(g) else c * x
+}
 
 // Reciprocal piecewise gamma response
 internal fun rcpResponse(
@@ -563,10 +492,9 @@
 
 // Piecewise gamma response, encoded as sign(x).f(abs(x)) for color spaces that
 // allow negative values
-internal fun absResponse(x: Double, a: Double, b: Double, c: Double, d: Double, g: Double):
-    Double {
-        return response(if (x < 0.0) -x else x, a, b, c, d, g).withSign(x)
-    }
+internal fun absResponse(x: Double, a: Double, b: Double, c: Double, d: Double, g: Double): Double {
+    return response(if (x < 0.0) -x else x, a, b, c, d, g).withSign(x)
+}
 
 /**
  * Compares two sets of parametric transfer functions parameters with a precision of 1e-3.
@@ -576,17 +504,14 @@
  * @return True if the two sets are equal, false otherwise
  */
 internal fun compare(a: TransferParameters, b: TransferParameters?): Boolean {
-    return (
-        b != null &&
-            abs(a.a - b.a) < 1e-3 &&
-            abs(a.b - b.b) < 1e-3 &&
-            abs(a.c - b.c) < 1e-3 &&
-            abs(a.d - b.d) < 2e-3 && // Special case for variations in sRGB OETF/EOTF
-
-            abs(a.e - b.e) < 1e-3 &&
-            abs(a.f - b.f) < 1e-3 &&
-            abs(a.gamma - b.gamma) < 1e-3
-        )
+    return (b != null &&
+        abs(a.a - b.a) < 1e-3 &&
+        abs(a.b - b.b) < 1e-3 &&
+        abs(a.c - b.c) < 1e-3 &&
+        abs(a.d - b.d) < 2e-3 && // Special case for variations in sRGB OETF/EOTF
+        abs(a.e - b.e) < 1e-3 &&
+        abs(a.f - b.f) < 1e-3 &&
+        abs(a.gamma - b.gamma) < 1e-3)
 }
 
 /**
@@ -658,39 +583,33 @@
  *
  * @param lhs 3x3 matrix, as a non-null array of 9 floats
  * @param rhs 3x3 matrix, as a non-null array of 9 floats
- * @return A new array of 9 floats containing the result of the multiplication
- * of rhs by lhs
+ * @return A new array of 9 floats containing the result of the multiplication of rhs by lhs
  */
-internal fun mul3x3(lhs: FloatArray, rhs: FloatArray):
-    FloatArray {
-        val r = FloatArray(9)
-        // Compiler hint to bypass extra bound checks
-        if (lhs.size < 9) return r
-        if (rhs.size < 9) return r
-        r[0] = lhs[0] * rhs[0] + lhs[3] * rhs[1] + lhs[6] * rhs[2]
-        r[1] = lhs[1] * rhs[0] + lhs[4] * rhs[1] + lhs[7] * rhs[2]
-        r[2] = lhs[2] * rhs[0] + lhs[5] * rhs[1] + lhs[8] * rhs[2]
-        r[3] = lhs[0] * rhs[3] + lhs[3] * rhs[4] + lhs[6] * rhs[5]
-        r[4] = lhs[1] * rhs[3] + lhs[4] * rhs[4] + lhs[7] * rhs[5]
-        r[5] = lhs[2] * rhs[3] + lhs[5] * rhs[4] + lhs[8] * rhs[5]
-        r[6] = lhs[0] * rhs[6] + lhs[3] * rhs[7] + lhs[6] * rhs[8]
-        r[7] = lhs[1] * rhs[6] + lhs[4] * rhs[7] + lhs[7] * rhs[8]
-        r[8] = lhs[2] * rhs[6] + lhs[5] * rhs[7] + lhs[8] * rhs[8]
-        return r
-    }
+internal fun mul3x3(lhs: FloatArray, rhs: FloatArray): FloatArray {
+    val r = FloatArray(9)
+    // Compiler hint to bypass extra bound checks
+    if (lhs.size < 9) return r
+    if (rhs.size < 9) return r
+    r[0] = lhs[0] * rhs[0] + lhs[3] * rhs[1] + lhs[6] * rhs[2]
+    r[1] = lhs[1] * rhs[0] + lhs[4] * rhs[1] + lhs[7] * rhs[2]
+    r[2] = lhs[2] * rhs[0] + lhs[5] * rhs[1] + lhs[8] * rhs[2]
+    r[3] = lhs[0] * rhs[3] + lhs[3] * rhs[4] + lhs[6] * rhs[5]
+    r[4] = lhs[1] * rhs[3] + lhs[4] * rhs[4] + lhs[7] * rhs[5]
+    r[5] = lhs[2] * rhs[3] + lhs[5] * rhs[4] + lhs[8] * rhs[5]
+    r[6] = lhs[0] * rhs[6] + lhs[3] * rhs[7] + lhs[6] * rhs[8]
+    r[7] = lhs[1] * rhs[6] + lhs[4] * rhs[7] + lhs[7] * rhs[8]
+    r[8] = lhs[2] * rhs[6] + lhs[5] * rhs[7] + lhs[8] * rhs[8]
+    return r
+}
 
 /**
- * Multiplies a vector of 3 components by a 3x3 matrix and stores the
- * result in the input vector.
+ * Multiplies a vector of 3 components by a 3x3 matrix and stores the result in the input vector.
  *
  * @param lhs 3x3 matrix, as a non-null array of 9 floats
  * @param rhs Vector of 3 components, as a non-null array of 3 floats
  * @return The array of 3 passed as the [rhs] parameter
  */
-internal fun mul3x3Float3(
-    lhs: FloatArray,
-    rhs: FloatArray
-): FloatArray {
+internal fun mul3x3Float3(lhs: FloatArray, rhs: FloatArray): FloatArray {
     // Compiler hint to bypass extra bounds checks
     if (lhs.size < 9) return rhs
     if (rhs.size < 3) return rhs
@@ -705,8 +624,8 @@
 }
 
 /**
- * Multiplies a vector of 3 components by a 3x3 matrix and returns the first element.
- * If [lhs] does not contain at least 9 elements, returns [r0].
+ * Multiplies a vector of 3 components by a 3x3 matrix and returns the first element. If [lhs] does
+ * not contain at least 9 elements, returns [r0].
  *
  * @param lhs 3x3 matrix, as a non-null array of 9 floats
  * @param r0: The first element of the vector
@@ -715,18 +634,13 @@
  * @return The first element of the resulting multiplication.
  */
 @Suppress("NOTHING_TO_INLINE")
-internal inline fun mul3x3Float3_0(
-    lhs: FloatArray,
-    r0: Float,
-    r1: Float,
-    r2: Float
-): Float {
+internal inline fun mul3x3Float3_0(lhs: FloatArray, r0: Float, r1: Float, r2: Float): Float {
     return lhs[0] * r0 + lhs[3] * r1 + lhs[6] * r2
 }
 
 /**
- * Multiplies a vector of 3 components by a 3x3 matrix and returns the second element.
- * If [lhs] does not contain at least 9 elements, returns [r0].
+ * Multiplies a vector of 3 components by a 3x3 matrix and returns the second element. If [lhs] does
+ * not contain at least 9 elements, returns [r0].
  *
  * @param lhs 3x3 matrix, as a non-null array of 9 floats
  * @param r0: The first element of the vector
@@ -735,18 +649,13 @@
  * @return The second element of the resulting multiplication.
  */
 @Suppress("NOTHING_TO_INLINE")
-internal inline fun mul3x3Float3_1(
-    lhs: FloatArray,
-    r0: Float,
-    r1: Float,
-    r2: Float
-): Float {
+internal inline fun mul3x3Float3_1(lhs: FloatArray, r0: Float, r1: Float, r2: Float): Float {
     return lhs[1] * r0 + lhs[4] * r1 + lhs[7] * r2
 }
 
 /**
- * Multiplies a vector of 3 components by a 3x3 matrix and returns the third element.
- * If [lhs] does not contain at least 9 elements, returns [r0].
+ * Multiplies a vector of 3 components by a 3x3 matrix and returns the third element. If [lhs] does
+ * not contain at least 9 elements, returns [r0].
  *
  * @param lhs 3x3 matrix, as a non-null array of 9 floats
  * @param r0: The first element of the vector
@@ -755,43 +664,39 @@
  * @return The third element of the resulting multiplication.
  */
 @Suppress("NOTHING_TO_INLINE")
-internal inline fun mul3x3Float3_2(
-    lhs: FloatArray,
-    r0: Float,
-    r1: Float,
-    r2: Float
-): Float {
+internal inline fun mul3x3Float3_2(lhs: FloatArray, r0: Float, r1: Float, r2: Float): Float {
     return lhs[2] * r0 + lhs[5] * r1 + lhs[8] * r2
 }
 
 /**
- * Multiplies a diagonal 3x3 matrix lhs, represented as an array of 3 floats,
- * by a 3x3 matrix represented as an array of 9 floats.
+ * Multiplies a diagonal 3x3 matrix lhs, represented as an array of 3 floats, by a 3x3 matrix
+ * represented as an array of 9 floats.
  *
  * @param lhs Diagonal 3x3 matrix, as a non-null array of 3 floats
  * @param rhs 3x3 matrix, as a non-null array of 9 floats
- * @return A new array of 9 floats containing the result of the multiplication
- * of [rhs] by [lhs].
+ * @return A new array of 9 floats containing the result of the multiplication of [rhs] by [lhs].
  */
-internal fun mul3x3Diag(
-    lhs: FloatArray,
-    rhs: FloatArray
-): FloatArray {
+internal fun mul3x3Diag(lhs: FloatArray, rhs: FloatArray): FloatArray {
     return floatArrayOf(
-        lhs[0] * rhs[0], lhs[1] * rhs[1], lhs[2] * rhs[2],
-        lhs[0] * rhs[3], lhs[1] * rhs[4], lhs[2] * rhs[5],
-        lhs[0] * rhs[6], lhs[1] * rhs[7], lhs[2] * rhs[8]
+        lhs[0] * rhs[0],
+        lhs[1] * rhs[1],
+        lhs[2] * rhs[2],
+        lhs[0] * rhs[3],
+        lhs[1] * rhs[4],
+        lhs[2] * rhs[5],
+        lhs[0] * rhs[6],
+        lhs[1] * rhs[7],
+        lhs[2] * rhs[8]
     )
 }
 
 /**
- * Computes the chromatic adaptation transform from the specified
- * source white point to the specified destination white point.
+ * Computes the chromatic adaptation transform from the specified source white point to the
+ * specified destination white point.
  *
- * The transform is computed using the von Kries method, described
- * in more details in the documentation of [Adaptation]. The
- * [Adaptation] enum provides different matrices that can be
- * used to perform the adaptation.
+ * The transform is computed using the von Kries method, described in more details in the
+ * documentation of [Adaptation]. The [Adaptation] enum provides different matrices that can be used
+ * to perform the adaptation.
  *
  * @param matrix The adaptation matrix
  * @param srcWhitePoint The white point to adapt from, *will be modified*
diff --git a/compose/ui/ui-graphics/src/commonMain/kotlin/androidx/compose/ui/graphics/colorspace/ColorSpaces.kt b/compose/ui/ui-graphics/src/commonMain/kotlin/androidx/compose/ui/graphics/colorspace/ColorSpaces.kt
index 510faf4..a300845 100644
--- a/compose/ui/ui-graphics/src/commonMain/kotlin/androidx/compose/ui/graphics/colorspace/ColorSpaces.kt
+++ b/compose/ui/ui-graphics/src/commonMain/kotlin/androidx/compose/ui/graphics/colorspace/ColorSpaces.kt
@@ -32,199 +32,182 @@
      * [RGB][Rgb] color space sRGB standardized as IEC 61966-2.1:1999.
      * [See details on sRGB color space](https://d.android.com/reference/android/graphics/ColorSpace.Named.html#SRGB)
      */
-    val Srgb = Rgb(
-        "sRGB IEC61966-2.1",
-        SrgbPrimaries,
-        Illuminant.D65,
-        SrgbTransferParameters,
-        id = 0
-    )
+    val Srgb =
+        Rgb("sRGB IEC61966-2.1", SrgbPrimaries, Illuminant.D65, SrgbTransferParameters, id = 0)
 
     /**
      * [RGB][Rgb] color space sRGB standardized as IEC 61966-2.1:1999.
      * [See details on Linear sRGB color space](https://d.android.com/reference/android/graphics/ColorSpace.Named.html#LINEAR_SRGB)
      */
-    val LinearSrgb = Rgb(
-        "sRGB IEC61966-2.1 (Linear)",
-        SrgbPrimaries,
-        Illuminant.D65,
-        1.0,
-        0.0f, 1.0f,
-        id = 1
-    )
+    val LinearSrgb =
+        Rgb("sRGB IEC61966-2.1 (Linear)", SrgbPrimaries, Illuminant.D65, 1.0, 0.0f, 1.0f, id = 1)
 
     /**
      * [RGB][Rgb] color space scRGB-nl standardized as IEC 61966-2-2:2003.
      * [See details on Extended sRGB color space](https://d.android.com/reference/android/graphics/ColorSpace.Named.html#EXTENDED_SRGB)
      */
-    val ExtendedSrgb = Rgb(
-        "scRGB-nl IEC 61966-2-2:2003",
-        SrgbPrimaries,
-        Illuminant.D65, null,
-        { x ->
-            absRcpResponse(
-                x,
-                1 / 1.055,
-                0.055 / 1.055,
-                1 / 12.92,
-                0.04045,
-                2.4
-            )
-        },
-        { x ->
-            absResponse(
-                x,
-                1 / 1.055,
-                0.055 / 1.055,
-                1 / 12.92,
-                0.04045,
-                2.4
-            )
-        },
-        -0.799f, 2.399f, SrgbTransferParameters,
-        id = 2
-    )
+    val ExtendedSrgb =
+        Rgb(
+            "scRGB-nl IEC 61966-2-2:2003",
+            SrgbPrimaries,
+            Illuminant.D65,
+            null,
+            { x -> absRcpResponse(x, 1 / 1.055, 0.055 / 1.055, 1 / 12.92, 0.04045, 2.4) },
+            { x -> absResponse(x, 1 / 1.055, 0.055 / 1.055, 1 / 12.92, 0.04045, 2.4) },
+            -0.799f,
+            2.399f,
+            SrgbTransferParameters,
+            id = 2
+        )
 
     /**
      * [RGB][Rgb] color space scRGB standardized as IEC 61966-2-2:2003.
      * [See details on Linear Extended sRGB color space](https://d.android.com/reference/android/graphics/ColorSpace.Named.html#LINEAR_EXTENDED_SRGB)
      */
-    val LinearExtendedSrgb = Rgb(
-        "scRGB IEC 61966-2-2:2003",
-        SrgbPrimaries,
-        Illuminant.D65,
-        1.0,
-        -0.5f, 7.499f,
-        id = 3
-    )
+    val LinearExtendedSrgb =
+        Rgb("scRGB IEC 61966-2-2:2003", SrgbPrimaries, Illuminant.D65, 1.0, -0.5f, 7.499f, id = 3)
 
     /**
      * [RGB][Rgb] color space BT.709 standardized as Rec. ITU-R BT.709-5.
      * [See details on BT.709 color space](https://d.android.com/reference/android/graphics/ColorSpace.Named.html#BT_709)
      */
-    val Bt709 = Rgb(
-        "Rec. ITU-R BT.709-5",
-        floatArrayOf(0.640f, 0.330f, 0.300f, 0.600f, 0.150f, 0.060f),
-        Illuminant.D65,
-        TransferParameters(1 / 0.45, 1 / 1.099, 0.099 / 1.099, 1 / 4.5, 0.081),
-        id = 4
-    )
+    val Bt709 =
+        Rgb(
+            "Rec. ITU-R BT.709-5",
+            floatArrayOf(0.640f, 0.330f, 0.300f, 0.600f, 0.150f, 0.060f),
+            Illuminant.D65,
+            TransferParameters(1 / 0.45, 1 / 1.099, 0.099 / 1.099, 1 / 4.5, 0.081),
+            id = 4
+        )
 
     /**
      * [RGB][Rgb] color space BT.2020 standardized as Rec. ITU-R BT.2020-1.
      * [See details on BT.2020 color space](https://d.android.com/reference/android/graphics/ColorSpace.Named.html#BT_2020)
      */
-    val Bt2020 = Rgb(
-        "Rec. ITU-R BT.2020-1",
-        floatArrayOf(0.708f, 0.292f, 0.170f, 0.797f, 0.131f, 0.046f),
-        Illuminant.D65,
-        TransferParameters(1 / 0.45, 1 / 1.0993, 0.0993 / 1.0993, 1 / 4.5, 0.08145),
-        id = 5
-    )
+    val Bt2020 =
+        Rgb(
+            "Rec. ITU-R BT.2020-1",
+            floatArrayOf(0.708f, 0.292f, 0.170f, 0.797f, 0.131f, 0.046f),
+            Illuminant.D65,
+            TransferParameters(1 / 0.45, 1 / 1.0993, 0.0993 / 1.0993, 1 / 4.5, 0.08145),
+            id = 5
+        )
 
     /**
      * [RGB][Rgb] color space DCI-P3 standardized as SMPTE RP 431-2-2007.
      * [See details on DCI-P3 color space](https://d.android.com/reference/android/graphics/ColorSpace.Named.html#DCI_P3)
      */
-    val DciP3 = Rgb(
-        "SMPTE RP 431-2-2007 DCI (P3)",
-        floatArrayOf(0.680f, 0.320f, 0.265f, 0.690f, 0.150f, 0.060f),
-        WhitePoint(0.314f, 0.351f),
-        2.6,
-        0.0f, 1.0f,
-        id = 6
-    )
+    val DciP3 =
+        Rgb(
+            "SMPTE RP 431-2-2007 DCI (P3)",
+            floatArrayOf(0.680f, 0.320f, 0.265f, 0.690f, 0.150f, 0.060f),
+            WhitePoint(0.314f, 0.351f),
+            2.6,
+            0.0f,
+            1.0f,
+            id = 6
+        )
 
     /**
      * [RGB][Rgb] color space Display P3 based on SMPTE RP 431-2-2007 and IEC 61966-2.1:1999.
      * [See details on Display P3 color space](https://d.android.com/reference/android/graphics/ColorSpace.Named.html#DISPLAY_P3)
      */
-    val DisplayP3 = Rgb(
-        "Display P3",
-        floatArrayOf(0.680f, 0.320f, 0.265f, 0.690f, 0.150f, 0.060f),
-        Illuminant.D65,
-        SrgbTransferParameters,
-        id = 7
-    )
+    val DisplayP3 =
+        Rgb(
+            "Display P3",
+            floatArrayOf(0.680f, 0.320f, 0.265f, 0.690f, 0.150f, 0.060f),
+            Illuminant.D65,
+            SrgbTransferParameters,
+            id = 7
+        )
 
     /**
      * [RGB][Rgb] color space NTSC, 1953 standard.
      * [See details on NTSC 1953 color space](https://d.android.com/reference/android/graphics/ColorSpace.Named.html#NTSC_1953)
      */
-    val Ntsc1953 = Rgb(
-        "NTSC (1953)",
-        Ntsc1953Primaries,
-        Illuminant.C,
-        TransferParameters(1 / 0.45, 1 / 1.099, 0.099 / 1.099, 1 / 4.5, 0.081),
-        id = 8
-    )
+    val Ntsc1953 =
+        Rgb(
+            "NTSC (1953)",
+            Ntsc1953Primaries,
+            Illuminant.C,
+            TransferParameters(1 / 0.45, 1 / 1.099, 0.099 / 1.099, 1 / 4.5, 0.081),
+            id = 8
+        )
 
     /**
      * [RGB][Rgb] color space SMPTE C.
      * [See details on SMPTE C color space](https://d.android.com/reference/android/graphics/ColorSpace.Named.html#SMPTE_C)
      */
-    val SmpteC = Rgb(
-        "SMPTE-C RGB",
-        floatArrayOf(0.630f, 0.340f, 0.310f, 0.595f, 0.155f, 0.070f),
-        Illuminant.D65,
-        TransferParameters(1 / 0.45, 1 / 1.099, 0.099 / 1.099, 1 / 4.5, 0.081),
-        id = 9
-    )
+    val SmpteC =
+        Rgb(
+            "SMPTE-C RGB",
+            floatArrayOf(0.630f, 0.340f, 0.310f, 0.595f, 0.155f, 0.070f),
+            Illuminant.D65,
+            TransferParameters(1 / 0.45, 1 / 1.099, 0.099 / 1.099, 1 / 4.5, 0.081),
+            id = 9
+        )
 
     /**
      * [RGB][Rgb] color space Adobe RGB (1998).
      * [See details on Adobe RGB (1998) color space](https://d.android.com/reference/android/graphics/ColorSpace.Named.html#ADOBE_RGB)
      */
-    val AdobeRgb = Rgb(
-        "Adobe RGB (1998)",
-        floatArrayOf(0.64f, 0.33f, 0.21f, 0.71f, 0.15f, 0.06f),
-        Illuminant.D65,
-        2.2,
-        0.0f, 1.0f,
-        id = 10
-    )
+    val AdobeRgb =
+        Rgb(
+            "Adobe RGB (1998)",
+            floatArrayOf(0.64f, 0.33f, 0.21f, 0.71f, 0.15f, 0.06f),
+            Illuminant.D65,
+            2.2,
+            0.0f,
+            1.0f,
+            id = 10
+        )
 
     /**
      * [RGB][Rgb] color space ProPhoto RGB standardized as ROMM RGB ISO 22028-2:2013.
      * [See details on ProPhoto RGB color space](https://d.android.com/reference/android/graphics/ColorSpace.Named.html#PRO_PHOTO_RGB)
      */
-    val ProPhotoRgb = Rgb(
-        "ROMM RGB ISO 22028-2:2013",
-        floatArrayOf(0.7347f, 0.2653f, 0.1596f, 0.8404f, 0.0366f, 0.0001f),
-        Illuminant.D50,
-        TransferParameters(1.8, 1.0, 0.0, 1 / 16.0, 0.031248),
-        id = 11
-    )
+    val ProPhotoRgb =
+        Rgb(
+            "ROMM RGB ISO 22028-2:2013",
+            floatArrayOf(0.7347f, 0.2653f, 0.1596f, 0.8404f, 0.0366f, 0.0001f),
+            Illuminant.D50,
+            TransferParameters(1.8, 1.0, 0.0, 1 / 16.0, 0.031248),
+            id = 11
+        )
 
     /**
      * [RGB][Rgb] color space ACES standardized as SMPTE ST 2065-1:2012.
      * [See details on ACES color space](https://d.android.com/reference/android/graphics/ColorSpace.Named.html#ACES)
      */
-    val Aces = Rgb(
-        "SMPTE ST 2065-1:2012 ACES",
-        floatArrayOf(0.73470f, 0.26530f, 0.0f, 1.0f, 0.00010f, -0.0770f),
-        Illuminant.D60,
-        1.0,
-        -65504.0f, 65504.0f,
-        id = 12
-    )
+    val Aces =
+        Rgb(
+            "SMPTE ST 2065-1:2012 ACES",
+            floatArrayOf(0.73470f, 0.26530f, 0.0f, 1.0f, 0.00010f, -0.0770f),
+            Illuminant.D60,
+            1.0,
+            -65504.0f,
+            65504.0f,
+            id = 12
+        )
 
     /**
      * [RGB][Rgb] color space ACEScg standardized as Academy S-2014-004.
      * [See details on ACEScg color space](https://d.android.com/reference/android/graphics/ColorSpace.Named.html#ACES_CG)
      */
-    val Acescg = Rgb(
-        "Academy S-2014-004 ACEScg",
-        floatArrayOf(0.713f, 0.293f, 0.165f, 0.830f, 0.128f, 0.044f),
-        Illuminant.D60,
-        1.0,
-        -65504.0f, 65504.0f,
-        id = 13
-    )
+    val Acescg =
+        Rgb(
+            "Academy S-2014-004 ACEScg",
+            floatArrayOf(0.713f, 0.293f, 0.165f, 0.830f, 0.128f, 0.044f),
+            Illuminant.D60,
+            1.0,
+            -65504.0f,
+            65504.0f,
+            id = 13
+        )
 
     /**
-     * [XYZ][ColorModel.Xyz] color space CIE XYZ. This color space assumes standard
-     * illuminant D50 as its white point.
+     * [XYZ][ColorModel.Xyz] color space CIE XYZ. This color space assumes standard illuminant D50
+     * as its white point.
      *
      * ```
      * | Property                | Value                 |
@@ -234,14 +217,11 @@
      * | Range                   | `[-2.0, 2.0]`         |
      * ```
      */
-    val CieXyz: ColorSpace = Xyz(
-        "Generic XYZ",
-        id = 14
-    )
+    val CieXyz: ColorSpace = Xyz("Generic XYZ", id = 14)
 
     /**
-     * [Lab][ColorModel.Lab] color space CIE L*a*b*. This color space uses CIE XYZ D50
-     * as a profile conversion space.
+     * [Lab][ColorModel.Lab] color space CIE L*a*b*. This color space uses CIE XYZ D50 as a profile
+     * conversion space.
      *
      * ```
      * | Property                | Value                                                   |
@@ -251,25 +231,15 @@
      * | Range                   | (L: `[0.0, 100.0]`, a: `[-128, 128]`, b: `[-128, 128]`) |
      * ```
      */
-    val CieLab: ColorSpace = Lab(
-        "Generic L*a*b*",
-        id = 15
-    )
+    val CieLab: ColorSpace = Lab("Generic L*a*b*", id = 15)
+
+    /** This identifies the 'None' color. */
+    internal val Unspecified =
+        Rgb("None", SrgbPrimaries, Illuminant.D65, NoneTransferParameters, id = 16)
 
     /**
-     * This identifies the 'None' color.
-     */
-    internal val Unspecified = Rgb(
-        "None",
-        SrgbPrimaries,
-        Illuminant.D65,
-        NoneTransferParameters,
-        id = 16
-    )
-
-    /**
-     * [Lab][ColorModel.Lab] color space Oklab. This color space uses Oklab D65
-     * as a profile conversion space.
+     * [Lab][ColorModel.Lab] color space Oklab. This color space uses Oklab D65 as a profile
+     * conversion space.
      *
      * ```
      * | Property                | Value                                                   |
@@ -279,36 +249,26 @@
      * | Range                   | (L: `[0.0, 1.0]`, a: `[-2, 2]`, b: `[-2, 2]`)           |
      * ```
      */
-    val Oklab: ColorSpace = Oklab(
-        "Oklab",
-        id = 17
-    )
+    val Oklab: ColorSpace = Oklab("Oklab", id = 17)
 
     /**
-     * Returns a [ColorSpaces] instance of [ColorSpace] that matches
-     * the specified RGB to CIE XYZ transform and transfer functions. If no
-     * instance can be found, this method returns null.
+     * Returns a [ColorSpaces] instance of [ColorSpace] that matches the specified RGB to CIE XYZ
+     * transform and transfer functions. If no instance can be found, this method returns null.
      *
-     * The color transform matrix is assumed to target the CIE XYZ space
-     * a [D50][Illuminant.D50] standard illuminant.
+     * The color transform matrix is assumed to target the CIE XYZ space a [D50][Illuminant.D50]
+     * standard illuminant.
      *
-     * @param toXYZD50 3x3 column-major transform matrix from RGB to the profile
-     * connection space CIE XYZ as an array of 9 floats, cannot be null
+     * @param toXYZD50 3x3 column-major transform matrix from RGB to the profile connection space
+     *   CIE XYZ as an array of 9 floats, cannot be null
      * @param function Parameters for the transfer functions
      * @return A non-null [ColorSpace] if a match is found, null otherwise
      */
-    fun match(
-        @Size(9)
-        toXYZD50: FloatArray,
-        function: TransferParameters
-    ): ColorSpace? {
+    fun match(@Size(9) toXYZD50: FloatArray, function: TransferParameters): ColorSpace? {
         for (colorSpace in ColorSpacesArray) {
             if (colorSpace.model == ColorModel.Rgb) {
                 val rgb = colorSpace.adapt(Illuminant.D50) as Rgb
-                if ((
-                    compare(toXYZD50, rgb.transform) &&
-                        compare(function, rgb.transferParameters)
-                    )
+                if (
+                    (compare(toXYZD50, rgb.transform) && compare(function, rgb.transferParameters))
                 ) {
                     return colorSpace
                 }
@@ -318,30 +278,28 @@
         return null
     }
 
-    internal inline fun getColorSpace(id: Int): ColorSpace =
-        ColorSpacesArray[id]
+    internal inline fun getColorSpace(id: Int): ColorSpace = ColorSpacesArray[id]
 
-    /**
-     * These MUST be in the order of their IDs
-     */
-    internal val ColorSpacesArray = arrayOf(
-        Srgb,
-        LinearSrgb,
-        ExtendedSrgb,
-        LinearExtendedSrgb,
-        Bt709,
-        Bt2020,
-        DciP3,
-        DisplayP3,
-        Ntsc1953,
-        SmpteC,
-        AdobeRgb,
-        ProPhotoRgb,
-        Aces,
-        Acescg,
-        CieXyz,
-        CieLab,
-        Unspecified,
-        Oklab
-    )
+    /** These MUST be in the order of their IDs */
+    internal val ColorSpacesArray =
+        arrayOf(
+            Srgb,
+            LinearSrgb,
+            ExtendedSrgb,
+            LinearExtendedSrgb,
+            Bt709,
+            Bt2020,
+            DciP3,
+            DisplayP3,
+            Ntsc1953,
+            SmpteC,
+            AdobeRgb,
+            ProPhotoRgb,
+            Aces,
+            Acescg,
+            CieXyz,
+            CieLab,
+            Unspecified,
+            Oklab
+        )
 }
diff --git a/compose/ui/ui-graphics/src/commonMain/kotlin/androidx/compose/ui/graphics/colorspace/Connector.kt b/compose/ui/ui-graphics/src/commonMain/kotlin/androidx/compose/ui/graphics/colorspace/Connector.kt
index 919c420..7a47484 100644
--- a/compose/ui/ui-graphics/src/commonMain/kotlin/androidx/compose/ui/graphics/colorspace/Connector.kt
+++ b/compose/ui/ui-graphics/src/commonMain/kotlin/androidx/compose/ui/graphics/colorspace/Connector.kt
@@ -23,26 +23,21 @@
 import androidx.compose.ui.util.unpackFloat2
 
 /**
- * A connector transforms colors from a source color space to a destination
- * color space.
+ * A connector transforms colors from a source color space to a destination color space.
  *
- * A source color space is connected to a destination color space using the
- * color transform `C` computed from their respective transforms noted
- * `Tsrc` and `Tdst` in the following equation:
+ * A source color space is connected to a destination color space using the color transform `C`
+ * computed from their respective transforms noted `Tsrc` and `Tdst` in the following equation:
  *
  * [See equation](https://developer.android.com/reference/android/graphics/ColorSpace.Connector)
  *
- * The transform `C` shown above is only valid when the source and
- * destination color spaces have the same profile connection space (PCS).
- * We know that instances of [ColorSpace] always use CIE XYZ as their
- * PCS but their white points might differ. When they do, we must perform
- * a chromatic adaptation of the color spaces' transforms. To do so, we
- * use the von Kries method described in the documentation of [Adaptation],
- * using the CIE standard illuminant [D50][Illuminant.D50]
- * as the target white point.
+ * The transform `C` shown above is only valid when the source and destination color spaces have the
+ * same profile connection space (PCS). We know that instances of [ColorSpace] always use CIE XYZ as
+ * their PCS but their white points might differ. When they do, we must perform a chromatic
+ * adaptation of the color spaces' transforms. To do so, we use the von Kries method described in
+ * the documentation of [Adaptation], using the CIE standard illuminant [D50][Illuminant.D50] as the
+ * target white point.
  *
- * Example of conversion from [sRGB][ColorSpaces.Srgb] to
- * [DCI-P3][ColorSpaces.DciP3]:
+ * Example of conversion from [sRGB][ColorSpaces.Srgb] to [DCI-P3][ColorSpaces.DciP3]:
  *
  *     val connector = ColorSpaces.Srgb.connect(ColorSpaces.DciP3);
  *     val p3 = connector.transform(1.0f, 0.0f, 0.0f);
@@ -54,17 +49,15 @@
  */
 open class Connector
 /**
- * To connect between color spaces, we might need to use adapted transforms.
- * This should be transparent to the user so this constructor takes the
- * original source and destinations (returned by the getters), as well as
- * possibly adapted color spaces used by transform().
+ * To connect between color spaces, we might need to use adapted transforms. This should be
+ * transparent to the user so this constructor takes the original source and destinations (returned
+ * by the getters), as well as possibly adapted color spaces used by transform().
  */
 internal constructor(
     /**
      * Returns the source color space this connector will convert from.
      *
      * @return A non-null instance of [ColorSpace]
-     *
      * @see destination
      */
     val source: ColorSpace,
@@ -72,18 +65,16 @@
      * Returns the destination color space this connector will convert to.
      *
      * @return A non-null instance of [ColorSpace]
-     *
      * @see source
      */
     val destination: ColorSpace,
     private val transformSource: ColorSpace,
     private val transformDestination: ColorSpace,
     /**
-     * Returns the render intent this connector will use when mapping the
-     * source color space to the destination color space.
+     * Returns the render intent this connector will use when mapping the source color space to the
+     * destination color space.
      *
      * @return A non-null [RenderIntent]
-     *
      * @see RenderIntent
      */
     val renderIntent: RenderIntent,
@@ -101,7 +92,8 @@
         destination: ColorSpace,
         intent: RenderIntent
     ) : this(
-        source, destination,
+        source,
+        destination,
         if (source.model == ColorModel.Rgb) source.adapt(Illuminant.D50) else source,
         if (destination.model == ColorModel.Rgb) {
             destination.adapt(Illuminant.D50)
@@ -109,27 +101,20 @@
             destination
         },
         intent,
-        computeTransform(
-            source,
-            destination,
-            intent
-        )
+        computeTransform(source, destination, intent)
     )
 
     /**
-     * Transforms the specified color from the source color space
-     * to a color in the destination color space. This convenience
-     * method assumes a source color model with 3 components
-     * (typically RGB). To transform from color models with more than
-     * 3 components, such as [CMYK][ColorModel.Cmyk], use
-     * [transform] instead.
+     * Transforms the specified color from the source color space to a color in the destination
+     * color space. This convenience method assumes a source color model with 3 components
+     * (typically RGB). To transform from color models with more than 3 components, such as
+     * [CMYK][ColorModel.Cmyk], use [transform] instead.
      *
      * @param r The red component of the color to transform
      * @param g The green component of the color to transform
      * @param b The blue component of the color to transform
-     * @return A new array of 3 floats containing the specified color
-     * transformed from the source space to the destination space
-     *
+     * @return A new array of 3 floats containing the specified color transformed from the source
+     *   space to the destination space
      * @see transform
      */
     @Size(3)
@@ -138,14 +123,13 @@
     }
 
     /**
-     * Transforms the specified color from the source color space
-     * to a color in the destination color space.
+     * Transforms the specified color from the source color space to a color in the destination
+     * color space.
      *
-     * @param v A non-null array of 3 floats containing the value to transform
-     * and that will hold the result of the transform
-     * @return The [v] array passed as a parameter, containing the specified color
-     * transformed from the source space to the destination space
-     *
+     * @param v A non-null array of 3 floats containing the value to transform and that will hold
+     *   the result of the transform
+     * @return The [v] array passed as a parameter, containing the specified color transformed from
+     *   the source space to the destination space
      * @see transform
      */
     @Size(min = 3)
@@ -173,10 +157,9 @@
         return transformDestination.xyzaToColor(x, y, z, a, destination)
     }
 
-    /**
-     * Optimized connector for RGB->RGB conversions.
-     */
-    internal class RgbConnector internal constructor(
+    /** Optimized connector for RGB->RGB conversions. */
+    internal class RgbConnector
+    internal constructor(
         private val mSource: Rgb,
         private val mDestination: Rgb,
         intent: RenderIntent
@@ -215,13 +198,11 @@
         /**
          * Computes the color transform that connects two RGB color spaces.
          *
-         * We can only connect color spaces if they use the same profile
-         * connection space. We assume the connection space is always
-         * CIE XYZ but we maye need to perform a chromatic adaptation to
-         * match the white points. If an adaptation is needed, we use the
-         * CIE standard illuminant D50. The unmatched color space is adapted
-         * using the von Kries transform and the [Adaptation.Bradford]
-         * matrix.
+         * We can only connect color spaces if they use the same profile connection space. We assume
+         * the connection space is always CIE XYZ but we maye need to perform a chromatic adaptation
+         * to match the white points. If an adaptation is needed, we use the CIE standard illuminant
+         * D50. The unmatched color space is adapted using the von Kries transform and the
+         * [Adaptation.Bradford] matrix.
          *
          * @param source The source color space, cannot be null
          * @param destination The destination color space, cannot be null
@@ -245,37 +226,35 @@
                 val dstXYZ = destination.whitePoint.toXyz()
 
                 if (!compare(source.whitePoint, Illuminant.D50)) {
-                    val srcAdaptation = chromaticAdaptation(
-                        Adaptation.Bradford.transform,
-                        srcXYZ,
-                        Illuminant.D50Xyz.copyOf()
-                    )
+                    val srcAdaptation =
+                        chromaticAdaptation(
+                            Adaptation.Bradford.transform,
+                            srcXYZ,
+                            Illuminant.D50Xyz.copyOf()
+                        )
                     transform = mul3x3(srcAdaptation, source.transform)
                 }
 
                 if (!compare(destination.whitePoint, Illuminant.D50)) {
-                    val dstAdaptation = chromaticAdaptation(
-                        Adaptation.Bradford.transform,
-                        dstXYZ,
-                        Illuminant.D50Xyz.copyOf()
-                    )
-                    inverseTransform = inverse3x3(
-                        mul3x3(
-                            dstAdaptation,
-                            destination.transform
+                    val dstAdaptation =
+                        chromaticAdaptation(
+                            Adaptation.Bradford.transform,
+                            dstXYZ,
+                            Illuminant.D50Xyz.copyOf()
                         )
-                    )
+                    inverseTransform = inverse3x3(mul3x3(dstAdaptation, destination.transform))
                 }
 
                 if (intent == RenderIntent.Absolute) {
-                    transform = mul3x3Diag(
-                        floatArrayOf(
-                            srcXYZ[0] / dstXYZ[0],
-                            srcXYZ[1] / dstXYZ[1],
-                            srcXYZ[2] / dstXYZ[2]
-                        ),
-                        transform
-                    )
+                    transform =
+                        mul3x3Diag(
+                            floatArrayOf(
+                                srcXYZ[0] / dstXYZ[0],
+                                srcXYZ[1] / dstXYZ[1],
+                                srcXYZ[2] / dstXYZ[2]
+                            ),
+                            transform
+                        )
                 }
 
                 return mul3x3(inverseTransform, transform)
@@ -285,8 +264,8 @@
 
     internal companion object {
         /**
-         * Computes an extra transform to apply in XYZ space depending on the
-         * selected rendering intent.
+         * Computes an extra transform to apply in XYZ space depending on the selected rendering
+         * intent.
          */
         private fun computeTransform(
             source: ColorSpace,
@@ -319,7 +298,6 @@
          *
          * @param source The source and destination color space
          * @return A non-null connector that does not perform any transform
-         *
          * @see ColorSpace.connect
          */
         internal fun identity(source: ColorSpace): Connector {
@@ -332,14 +310,15 @@
     }
 }
 
-internal val Connectors = mutableIntObjectMapOf(
-    connectorKey(ColorSpaces.Srgb.id, ColorSpaces.Srgb.id, RenderIntent.Perceptual),
-    Connector.identity(ColorSpaces.Srgb),
-    connectorKey(ColorSpaces.Srgb.id, ColorSpaces.Oklab.id, RenderIntent.Perceptual),
-    Connector(ColorSpaces.Srgb, ColorSpaces.Oklab, RenderIntent.Perceptual),
-    connectorKey(ColorSpaces.Oklab.id, ColorSpaces.Srgb.id, RenderIntent.Perceptual),
-    Connector(ColorSpaces.Oklab, ColorSpaces.Srgb, RenderIntent.Perceptual)
-)
+internal val Connectors =
+    mutableIntObjectMapOf(
+        connectorKey(ColorSpaces.Srgb.id, ColorSpaces.Srgb.id, RenderIntent.Perceptual),
+        Connector.identity(ColorSpaces.Srgb),
+        connectorKey(ColorSpaces.Srgb.id, ColorSpaces.Oklab.id, RenderIntent.Perceptual),
+        Connector(ColorSpaces.Srgb, ColorSpaces.Oklab, RenderIntent.Perceptual),
+        connectorKey(ColorSpaces.Oklab.id, ColorSpaces.Srgb.id, RenderIntent.Perceptual),
+        Connector(ColorSpaces.Oklab, ColorSpaces.Srgb, RenderIntent.Perceptual)
+    )
 
 // See [ColorSpace.MaxId], the id is encoded on 6 bits
 @Suppress("NOTHING_TO_INLINE")
diff --git a/compose/ui/ui-graphics/src/commonMain/kotlin/androidx/compose/ui/graphics/colorspace/Illuminant.kt b/compose/ui/ui-graphics/src/commonMain/kotlin/androidx/compose/ui/graphics/colorspace/Illuminant.kt
index c644c9f..b3598c3 100644
--- a/compose/ui/ui-graphics/src/commonMain/kotlin/androidx/compose/ui/graphics/colorspace/Illuminant.kt
+++ b/compose/ui/ui-graphics/src/commonMain/kotlin/androidx/compose/ui/graphics/colorspace/Illuminant.kt
@@ -16,63 +16,59 @@
 
 package androidx.compose.ui.graphics.colorspace
 
-/**
- * Illuminant contains standard CIE [white points][WhitePoint].
- */
+/** Illuminant contains standard CIE [white points][WhitePoint]. */
 object Illuminant {
     /**
-     * Standard CIE 1931 2° illuminant A, encoded in xyY.
-     * This illuminant has a color temperature of 2856K.
+     * Standard CIE 1931 2° illuminant A, encoded in xyY. This illuminant has a color temperature of
+     * 2856K.
      */
     val A = WhitePoint(0.44757f, 0.40745f)
 
     /**
-     * Standard CIE 1931 2° illuminant B, encoded in xyY.
-     * This illuminant has a color temperature of 4874K.
+     * Standard CIE 1931 2° illuminant B, encoded in xyY. This illuminant has a color temperature of
+     * 4874K.
      */
     val B = WhitePoint(0.34842f, 0.35161f)
 
     /**
-     * Standard CIE 1931 2° illuminant C, encoded in xyY.
-     * This illuminant has a color temperature of 6774K.
+     * Standard CIE 1931 2° illuminant C, encoded in xyY. This illuminant has a color temperature of
+     * 6774K.
      */
     val C = WhitePoint(0.31006f, 0.31616f)
 
     /**
-     * Standard CIE 1931 2° illuminant D50, encoded in xyY.
-     * This illuminant has a color temperature of 5003K. This illuminant
-     * is used by the profile connection space in ICC profiles.
+     * Standard CIE 1931 2° illuminant D50, encoded in xyY. This illuminant has a color temperature
+     * of 5003K. This illuminant is used by the profile connection space in ICC profiles.
      */
     val D50 = WhitePoint(0.34567f, 0.35850f)
 
     /**
-     * Standard CIE 1931 2° illuminant D55, encoded in xyY.
-     * This illuminant has a color temperature of 5503K.
+     * Standard CIE 1931 2° illuminant D55, encoded in xyY. This illuminant has a color temperature
+     * of 5503K.
      */
     val D55 = WhitePoint(0.33242f, 0.34743f)
 
     /**
-     * Standard CIE 1931 2° illuminant D60, encoded in xyY.
-     * This illuminant has a color temperature of 6004K.
+     * Standard CIE 1931 2° illuminant D60, encoded in xyY. This illuminant has a color temperature
+     * of 6004K.
      */
     val D60 = WhitePoint(0.32168f, 0.33767f)
 
     /**
-     * Standard CIE 1931 2° illuminant D65, encoded in xyY.
-     * This illuminant has a color temperature of 6504K. This illuminant
-     * is commonly used in RGB color spaces such as sRGB, BT.209, etc.
+     * Standard CIE 1931 2° illuminant D65, encoded in xyY. This illuminant has a color temperature
+     * of 6504K. This illuminant is commonly used in RGB color spaces such as sRGB, BT.209, etc.
      */
     val D65 = WhitePoint(0.31271f, 0.32902f)
 
     /**
-     * Standard CIE 1931 2° illuminant D75, encoded in xyY.
-     * This illuminant has a color temperature of 7504K.
+     * Standard CIE 1931 2° illuminant D75, encoded in xyY. This illuminant has a color temperature
+     * of 7504K.
      */
     val D75 = WhitePoint(0.29902f, 0.31485f)
 
     /**
-     * Standard CIE 1931 2° illuminant E, encoded in xyY.
-     * This illuminant has a color temperature of 5454K.
+     * Standard CIE 1931 2° illuminant E, encoded in xyY. This illuminant has a color temperature of
+     * 5454K.
      */
     val E = WhitePoint(0.33333f, 0.33333f)
 
diff --git a/compose/ui/ui-graphics/src/commonMain/kotlin/androidx/compose/ui/graphics/colorspace/Lab.kt b/compose/ui/ui-graphics/src/commonMain/kotlin/androidx/compose/ui/graphics/colorspace/Lab.kt
index 92b92c6..ae2ef48 100644
--- a/compose/ui/ui-graphics/src/commonMain/kotlin/androidx/compose/ui/graphics/colorspace/Lab.kt
+++ b/compose/ui/ui-graphics/src/commonMain/kotlin/androidx/compose/ui/graphics/colorspace/Lab.kt
@@ -21,17 +21,8 @@
 import androidx.compose.ui.util.packFloats
 import kotlin.math.cbrt
 
-/**
- * Implementation of the CIE L*a*b* color space. Its PCS is CIE XYZ
- * with a white point of D50.
- */
-internal class Lab(
-    name: String,
-    id: Int
-) : ColorSpace(
-    name,
-    ColorModel.Lab, id
-) {
+/** Implementation of the CIE L*a*b* color space. Its PCS is CIE XYZ with a white point of D50. */
+internal class Lab(name: String, id: Int) : ColorSpace(name, ColorModel.Lab, id) {
 
     override val isWideGamut: Boolean
         get() = true
diff --git a/compose/ui/ui-graphics/src/commonMain/kotlin/androidx/compose/ui/graphics/colorspace/Oklab.kt b/compose/ui/ui-graphics/src/commonMain/kotlin/androidx/compose/ui/graphics/colorspace/Oklab.kt
index fc50825..97faa95 100644
--- a/compose/ui/ui-graphics/src/commonMain/kotlin/androidx/compose/ui/graphics/colorspace/Oklab.kt
+++ b/compose/ui/ui-graphics/src/commonMain/kotlin/androidx/compose/ui/graphics/colorspace/Oklab.kt
@@ -21,17 +21,8 @@
 import androidx.compose.ui.util.fastCoerceIn
 import androidx.compose.ui.util.packFloats
 
-/**
- * Implementation of the Oklab color space. Oklab uses
- * a D65 white point.
- */
-internal class Oklab(
-    name: String,
-    id: Int
-) : ColorSpace(
-    name,
-    ColorModel.Lab, id
-) {
+/** Implementation of the Oklab color space. Oklab uses a D65 white point. */
+internal class Oklab(name: String, id: Int) : ColorSpace(name, ColorModel.Lab, id) {
 
     override val isWideGamut: Boolean
         get() = true
@@ -130,40 +121,50 @@
 
     internal companion object {
         /**
-         * This is the matrix applied before the nonlinear transform for (D50) XYZ-to-Oklab.
-         * This combines the D50-to-D65 white point transform with the normal transform matrix
-         * because this is always done together in [fromXyz].
+         * This is the matrix applied before the nonlinear transform for (D50) XYZ-to-Oklab. This
+         * combines the D50-to-D65 white point transform with the normal transform matrix because
+         * this is always done together in [fromXyz].
          */
-        private val M1 = mul3x3(
-            floatArrayOf(
-                0.8189330101f, 0.0329845436f, 0.0482003018f,
-                0.3618667424f, 0.9293118715f, 0.2643662691f,
-                -0.1288597137f, 0.0361456387f, 0.6338517070f
-            ),
-            chromaticAdaptation(
-                matrix = Adaptation.Bradford.transform,
-                srcWhitePoint = Illuminant.D50.toXyz(),
-                dstWhitePoint = Illuminant.D65.toXyz()
+        private val M1 =
+            mul3x3(
+                floatArrayOf(
+                    0.8189330101f,
+                    0.0329845436f,
+                    0.0482003018f,
+                    0.3618667424f,
+                    0.9293118715f,
+                    0.2643662691f,
+                    -0.1288597137f,
+                    0.0361456387f,
+                    0.6338517070f
+                ),
+                chromaticAdaptation(
+                    matrix = Adaptation.Bradford.transform,
+                    srcWhitePoint = Illuminant.D50.toXyz(),
+                    dstWhitePoint = Illuminant.D65.toXyz()
+                )
             )
-        )
 
-        /**
-         * Matrix applied after the nonlinear transform.
-         */
-        private val M2 = floatArrayOf(
-            0.2104542553f, 1.9779984951f, 0.0259040371f,
-            0.7936177850f, -2.4285922050f, 0.7827717662f,
-            -0.0040720468f, 0.4505937099f, -0.8086757660f
-        )
+        /** Matrix applied after the nonlinear transform. */
+        private val M2 =
+            floatArrayOf(
+                0.2104542553f,
+                1.9779984951f,
+                0.0259040371f,
+                0.7936177850f,
+                -2.4285922050f,
+                0.7827717662f,
+                -0.0040720468f,
+                0.4505937099f,
+                -0.8086757660f
+            )
 
-        /**
-         * The inverse of the [M1] matrix, transforming back to XYZ (D50)
-         */
+        /** The inverse of the [M1] matrix, transforming back to XYZ (D50) */
         private val InverseM1 = inverse3x3(M1)
 
         /**
-         * The inverse of the [M2] matrix, doing the first linear transform in the
-         * Oklab-to-XYZ before doing the nonlinear transform.
+         * The inverse of the [M2] matrix, doing the first linear transform in the Oklab-to-XYZ
+         * before doing the nonlinear transform.
          */
         private val InverseM2 = inverse3x3(M2)
     }
diff --git a/compose/ui/ui-graphics/src/commonMain/kotlin/androidx/compose/ui/graphics/colorspace/RenderIntent.kt b/compose/ui/ui-graphics/src/commonMain/kotlin/androidx/compose/ui/graphics/colorspace/RenderIntent.kt
index 5aec8d3..63fc632 100644
--- a/compose/ui/ui-graphics/src/commonMain/kotlin/androidx/compose/ui/graphics/colorspace/RenderIntent.kt
+++ b/compose/ui/ui-graphics/src/commonMain/kotlin/androidx/compose/ui/graphics/colorspace/RenderIntent.kt
@@ -19,10 +19,9 @@
 import androidx.compose.runtime.Immutable
 
 /**
- * A render intent determines how a [connector][Connector]
- * maps colors from one color space to another. The choice of mapping is
- * important when the source color space has a larger color gamut than the
- * destination color space.
+ * A render intent determines how a [connector][Connector] maps colors from one color space to
+ * another. The choice of mapping is important when the source color space has a larger color gamut
+ * than the destination color space.
  *
  * @see ColorSpace.connect
  */
@@ -31,47 +30,42 @@
 value class RenderIntent internal constructor(@Suppress("unused") internal val value: Int) {
     companion object {
         /**
-         * Compresses the source gamut into the destination gamut.
-         * This render intent affects all colors, inside and outside
-         * of destination gamut. The goal of this render intent is
-         * to preserve the visual relationship between colors.
+         * Compresses the source gamut into the destination gamut. This render intent affects all
+         * colors, inside and outside of destination gamut. The goal of this render intent is to
+         * preserve the visual relationship between colors.
          *
-         * This render intent is currently not
-         * implemented and behaves like [Relative].
+         * This render intent is currently not implemented and behaves like [Relative].
          */
         val Perceptual = RenderIntent(0)
 
         /**
-         * Similar to the [Absolute] render intent, this render
-         * intent matches the closest color in the destination gamut
-         * but makes adjustments for the destination white point.
+         * Similar to the [Absolute] render intent, this render intent matches the closest color in
+         * the destination gamut but makes adjustments for the destination white point.
          */
         val Relative = RenderIntent(1)
 
         /**
-         * Attempts to maintain the relative saturation of colors
-         * from the source gamut to the destination gamut, to keep
-         * highly saturated colors as saturated as possible.
+         * Attempts to maintain the relative saturation of colors from the source gamut to the
+         * destination gamut, to keep highly saturated colors as saturated as possible.
          *
-         * This render intent is currently not
-         * implemented and behaves like [Relative].
+         * This render intent is currently not implemented and behaves like [Relative].
          */
         val Saturation = RenderIntent(2)
 
         /**
-         * Colors that are in the destination gamut are left unchanged.
-         * Colors that fall outside of the destination gamut are mapped
-         * to the closest possible color within the gamut of the destination
-         * color space (they are clipped).
+         * Colors that are in the destination gamut are left unchanged. Colors that fall outside of
+         * the destination gamut are mapped to the closest possible color within the gamut of the
+         * destination color space (they are clipped).
          */
         val Absolute = RenderIntent(3)
     }
 
-    override fun toString() = when (this) {
-        Perceptual -> "Perceptual"
-        Relative -> "Relative"
-        Saturation -> "Saturation"
-        Absolute -> "Absolute"
-        else -> "Unknown"
-    }
+    override fun toString() =
+        when (this) {
+            Perceptual -> "Perceptual"
+            Relative -> "Relative"
+            Saturation -> "Saturation"
+            Absolute -> "Absolute"
+            else -> "Unknown"
+        }
 }
diff --git a/compose/ui/ui-graphics/src/commonMain/kotlin/androidx/compose/ui/graphics/colorspace/Rgb.kt b/compose/ui/ui-graphics/src/commonMain/kotlin/androidx/compose/ui/graphics/colorspace/Rgb.kt
index 89ff67f..d7fcca5 100644
--- a/compose/ui/ui-graphics/src/commonMain/kotlin/androidx/compose/ui/graphics/colorspace/Rgb.kt
+++ b/compose/ui/ui-graphics/src/commonMain/kotlin/androidx/compose/ui/graphics/colorspace/Rgb.kt
@@ -25,134 +25,115 @@
 import kotlin.math.pow
 
 /**
- * An RGB color space is an additive color space using the
- * [RGB][ColorModel.Rgb] color model (a color is therefore represented
- * by a tuple of 3 numbers).
+ * An RGB color space is an additive color space using the [RGB][ColorModel.Rgb] color model (a
+ * color is therefore represented by a tuple of 3 numbers).
  *
  * A specific RGB color space is defined by the following properties:
- *
- *  * Three chromaticities of the red, green and blue primaries, which
- * define the gamut of the color space.
- *  * A white point chromaticity that defines the stimulus to which
- * color space values are normalized (also just called "white").
- *  * An opto-electronic transfer function, also called opto-electronic
- * conversion function or often, and approximately, gamma function.
- *  * An electro-optical transfer function, also called electo-optical
- * conversion function or often, and approximately, gamma function.
- *  * A range of valid RGB values (most commonly `[0..1]`).
+ * * Three chromaticities of the red, green and blue primaries, which define the gamut of the color
+ *   space.
+ * * A white point chromaticity that defines the stimulus to which color space values are normalized
+ *   (also just called "white").
+ * * An opto-electronic transfer function, also called opto-electronic conversion function or often,
+ *   and approximately, gamma function.
+ * * An electro-optical transfer function, also called electo-optical conversion function or often,
+ *   and approximately, gamma function.
+ * * A range of valid RGB values (most commonly `[0..1]`).
  *
  * The most commonly used RGB color space is [sRGB][ColorSpaces.Srgb].
  *
  * ### Primaries and white point chromaticities
  *
- * In this implementation, the chromaticity of the primaries and the white
- * point of an RGB color space is defined in the CIE xyY color space. This
- * color space separates the chromaticity of a color, the x and y components,
- * and its luminance, the Y component. Since the primaries and the white
- * point have full brightness, the Y component is assumed to be 1 and only
- * the x and y components are needed to encode them.
+ * In this implementation, the chromaticity of the primaries and the white point of an RGB color
+ * space is defined in the CIE xyY color space. This color space separates the chromaticity of a
+ * color, the x and y components, and its luminance, the Y component. Since the primaries and the
+ * white point have full brightness, the Y component is assumed to be 1 and only the x and y
+ * components are needed to encode them.
  *
- * For convenience, this implementation also allows to define the
- * primaries and white point in the CIE XYZ space. The tristimulus XYZ values
- * are internally converted to xyY.
+ * For convenience, this implementation also allows to define the primaries and white point in the
+ * CIE XYZ space. The tristimulus XYZ values are internally converted to xyY.
  *
- * [sRGB primaries and white point](https://developer.android.com/reference/android/images/graphics/colorspace_srgb.png)
+ * [sRGB primaries and white
+ * point](https://developer.android.com/reference/android/images/graphics/colorspace_srgb.png)
  *
  * ### Transfer functions
  *
- * A transfer function is a color component conversion function, defined as
- * a single variable, monotonic mathematical function. It is applied to each
- * individual component of a color. They are used to perform the mapping
- * between linear tristimulus values and non-linear electronic signal value.
+ * A transfer function is a color component conversion function, defined as a single variable,
+ * monotonic mathematical function. It is applied to each individual component of a color. They are
+ * used to perform the mapping between linear tristimulus values and non-linear electronic signal
+ * value.
  *
- * The *opto-electronic transfer function* (OETF or OECF) encodes
- * tristimulus values in a scene to a non-linear electronic signal value.
- * An OETF is often expressed as a power function with an exponent between
- * 0.38 and 0.55 (the reciprocal of 1.8 to 2.6).
+ * The *opto-electronic transfer function* (OETF or OECF) encodes tristimulus values in a scene to a
+ * non-linear electronic signal value. An OETF is often expressed as a power function with an
+ * exponent between 0.38 and 0.55 (the reciprocal of 1.8 to 2.6).
  *
- * The *electro-optical transfer function* (EOTF or EOCF) decodes
- * a non-linear electronic signal value to a tristimulus value at the display.
- * An EOTF is often expressed as a power function with an exponent between
- * 1.8 and 2.6.
+ * The *electro-optical transfer function* (EOTF or EOCF) decodes a non-linear electronic signal
+ * value to a tristimulus value at the display. An EOTF is often expressed as a power function with
+ * an exponent between 1.8 and 2.6.
  *
- * Transfer functions are used as a compression scheme. For instance,
- * linear sRGB values would normally require 11 to 12 bits of precision to
- * store all values that can be perceived by the human eye. When encoding
- * sRGB values using the appropriate OETF (see [sRGB][ColorSpaces.Srgb] for
- * an exact mathematical description of that OETF), the values can be
- * compressed to only 8 bits precision.
+ * Transfer functions are used as a compression scheme. For instance, linear sRGB values would
+ * normally require 11 to 12 bits of precision to store all values that can be perceived by the
+ * human eye. When encoding sRGB values using the appropriate OETF (see [sRGB][ColorSpaces.Srgb] for
+ * an exact mathematical description of that OETF), the values can be compressed to only 8 bits
+ * precision.
  *
- * When manipulating RGB values, particularly sRGB values, it is safe
- * to assume that these values have been encoded with the appropriate
- * OETF (unless noted otherwise). Encoded values are often said to be in
- * "gamma space". They are therefore defined in a non-linear space. This
- * in turns means that any linear operation applied to these values is
- * going to yield mathematically incorrect results (any linear interpolation
- * such as gradient generation for instance, most image processing functions
- * such as blurs, etc.).
+ * When manipulating RGB values, particularly sRGB values, it is safe to assume that these values
+ * have been encoded with the appropriate OETF (unless noted otherwise). Encoded values are often
+ * said to be in "gamma space". They are therefore defined in a non-linear space. This in turns
+ * means that any linear operation applied to these values is going to yield mathematically
+ * incorrect results (any linear interpolation such as gradient generation for instance, most image
+ * processing functions such as blurs, etc.).
  *
- * To properly process encoded RGB values you must first apply the
- * EOTF to decode the value into linear space. After processing, the RGB
- * value must be encoded back to non-linear ("gamma") space. Here is a
- * formal description of the process, where `f` is the processing
- * function to apply:
+ * To properly process encoded RGB values you must first apply the EOTF to decode the value into
+ * linear space. After processing, the RGB value must be encoded back to non-linear ("gamma") space.
+ * Here is a formal description of the process, where `f` is the processing function to apply:
  *
  * [See RGB equation](https://developer.android.com/reference/android/graphics/ColorSpace.Rgb)
  *
- * If the transfer functions of the color space can be expressed as an
- * ICC parametric curve as defined in ICC.1:2004-10, the numeric parameters
- * can be retrieved from [transferParameters]. This can
- * be useful to match color spaces for instance.
+ * If the transfer functions of the color space can be expressed as an ICC parametric curve as
+ * defined in ICC.1:2004-10, the numeric parameters can be retrieved from [transferParameters]. This
+ * can be useful to match color spaces for instance.
  *
- * Some RGB color spaces, such as [ColorSpaces.Aces] and
- * [scRGB][ColorSpaces.LinearExtendedSrgb], are said to be linear because
- * their transfer functions are the identity function: `f(x) = x`.
- * If the source and/or destination are known to be linear, it is not
- * necessary to invoke the transfer functions.
+ * Some RGB color spaces, such as [ColorSpaces.Aces] and [scRGB][ColorSpaces.LinearExtendedSrgb],
+ * are said to be linear because their transfer functions are the identity function: `f(x) = x`. If
+ * the source and/or destination are known to be linear, it is not necessary to invoke the transfer
+ * functions.
  *
  * ### Range
  *
- * Most RGB color spaces allow RGB values in the range `[0..1]`. There
- * are however a few RGB color spaces that allow much larger ranges. For
- * instance, [scRGB][ColorSpaces.ExtendedSrgb] is used to manipulate the
- * range `[-0.5..7.5]` while [ACES][ColorSpaces.Aces] can be used throughout
- * the range `[-65504, 65504]`.
+ * Most RGB color spaces allow RGB values in the range `[0..1]`. There are however a few RGB color
+ * spaces that allow much larger ranges. For instance, [scRGB][ColorSpaces.ExtendedSrgb] is used to
+ * manipulate the range `[-0.5..7.5]` while [ACES][ColorSpaces.Aces] can be used throughout the
+ * range `[-65504, 65504]`.
  *
- * [Extended sRGB and its large range](https://developer.android.com/reference/android/images/graphics/colorspace_scrgb.png)
+ * [Extended sRGB and its large
+ * range](https://developer.android.com/reference/android/images/graphics/colorspace_scrgb.png)
  *
  * ### Converting between RGB color spaces
  *
- * Conversion between two color spaces is achieved by using an intermediate
- * color space called the profile connection space (PCS). The PCS used by
- * this implementation is CIE XYZ. The conversion operation is defined
- * as such:
+ * Conversion between two color spaces is achieved by using an intermediate color space called the
+ * profile connection space (PCS). The PCS used by this implementation is CIE XYZ. The conversion
+ * operation is defined as such:
  *
  * [See RGB equation](https://developer.android.com/reference/android/graphics/ColorSpace.Rgb)
  *
- * Where `Tsrc` is the [RGB to XYZ transform][getTransform]
- * of the source color space and `Tdst^-1` the
- * [XYZ to RGB transform][getInverseTransform] of the destination color space.
+ * Where `Tsrc` is the [RGB to XYZ transform][getTransform] of the source color space and `Tdst^-1`
+ * the [XYZ to RGB transform][getInverseTransform] of the destination color space.
  *
- * Many RGB color spaces commonly used with electronic devices use the
- * standard illuminant [D65][Illuminant.D65]. Care must be take however
- * when converting between two RGB color spaces if their white points do not
- * match. This can be achieved by either calling
- * [adapt] to adapt one or both color spaces to
- * a single common white point. This can be achieved automatically by calling
- * [ColorSpace.connect], which also handles
- * non-RGB color spaces.
+ * Many RGB color spaces commonly used with electronic devices use the standard illuminant
+ * [D65][Illuminant.D65]. Care must be take however when converting between two RGB color spaces if
+ * their white points do not match. This can be achieved by either calling [adapt] to adapt one or
+ * both color spaces to a single common white point. This can be achieved automatically by calling
+ * [ColorSpace.connect], which also handles non-RGB color spaces.
  *
- * To learn more about the white point adaptation process, refer to the
- * documentation of [Adaptation].
+ * To learn more about the white point adaptation process, refer to the documentation of
+ * [Adaptation].
  */
 class Rgb
 /**
- * Creates a new RGB color space using a specified set of primaries
- * and a specified white point.
+ * Creates a new RGB color space using a specified set of primaries and a specified white point.
  *
- * The primaries and white point can be specified in the CIE xyY space
- * or in CIE XYZ. The length of the arrays depends on the chosen space:
- *
+ * The primaries and white point can be specified in the CIE xyY space or in CIE XYZ. The length of
+ * the arrays depends on the chosen space:
  * ```
  * | Spaces | Primaries length | White point length |
  * |--------|------------------|--------------------|
@@ -160,30 +141,27 @@
  * | XYZ    | 9                | 3                  |
  * ```
  *
- * When the primaries and/or white point are specified in xyY, the Y component
- * does not need to be specified and is assumed to be 1.0. Only the xy components
- * are required.
+ * When the primaries and/or white point are specified in xyY, the Y component does not need to be
+ * specified and is assumed to be 1.0. Only the xy components are required.
  *
  * @param name Name of the color space, cannot be null, its length must be >= 1
  * @param primaries RGB primaries as an array of 6 (xy) or 9 (XYZ) floats
  * @param whitePoint Reference white as a [WhitePoint]
- * @param transform Computed transform matrix that converts from RGB to XYZ, or
- * `null` to compute it from `primaries` and `whitePoint`.
+ * @param transform Computed transform matrix that converts from RGB to XYZ, or `null` to compute it
+ *   from `primaries` and `whitePoint`.
  * @param oetf Opto-electronic transfer function, cannot be null
  * @param eotf Electro-optical transfer function, cannot be null
  * @param min The minimum valid value in this color space's RGB range
  * @param max The maximum valid value in this color space's RGB range
  * @param transferParameters Parameters for the transfer functions
- * @param id ID of this color space as an integer between [ColorSpace.MinId] and
- * [ColorSpace.MaxId]
- *
+ * @param id ID of this color space as an integer between [ColorSpace.MinId] and [ColorSpace.MaxId]
  * @throws IllegalArgumentException If any of the following conditions is met:
- *  * The name is null or has a length of 0.
- *  * The primaries array is null or has a length that is neither 6 or 9.
- *  * The white point array is null or has a length that is neither 2 or 3.
- *  * The OETF is null or the EOTF is null.
- *  * The minimum valid value is >= the maximum valid value.
- *  * The ID is not between [ColorSpace.MinId] and [ColorSpace.MaxId].
+ *     * The name is null or has a length of 0.
+ *     * The primaries array is null or has a length that is neither 6 or 9.
+ *     * The white point array is null or has a length that is neither 2 or 3.
+ *     * The OETF is null or the EOTF is null.
+ *     * The minimum valid value is >= the maximum valid value.
+ *     * The ID is not between [ColorSpace.MinId] and [ColorSpace.MaxId].
  */
 internal constructor(
     name: String,
@@ -195,17 +173,14 @@
     private val min: Float,
     private val max: Float,
     /**
-     * Returns the parameters used by the [electro-optical][eotf]
-     * and [opto-electronic][oetf] transfer functions. If the transfer
-     * functions do not match the ICC parametric curves defined in ICC.1:2004-10
-     * (section 10.15), this method returns null.
+     * Returns the parameters used by the [electro-optical][eotf] and [opto-electronic][oetf]
+     * transfer functions. If the transfer functions do not match the ICC parametric curves defined
+     * in ICC.1:2004-10 (section 10.15), this method returns null.
      *
-     * See [TransferParameters] for a full description of the transfer
-     * functions.
+     * See [TransferParameters] for a full description of the transfer functions.
      *
-     * @return An instance of [TransferParameters] or null if this color
-     * space's transfer functions do not match the equation defined in
-     * [TransferParameters]
+     * @return An instance of [TransferParameters] or null if this color space's transfer functions
+     *   do not match the equation defined in [TransferParameters]
      */
     val transferParameters: TransferParameters?,
     id: Int
@@ -217,28 +192,22 @@
     internal val oetfOrig = oetf
 
     /**
-     * Returns the opto-electronic transfer function (OETF) of this color space.
-     * The inverse function is the electro-optical transfer function (EOTF) returned
-     * by [eotf]. These functions are defined to satisfy the following
-     * equality for x ∈ `[0..1]`:
+     * Returns the opto-electronic transfer function (OETF) of this color space. The inverse
+     * function is the electro-optical transfer function (EOTF) returned by [eotf]. These functions
+     * are defined to satisfy the following equality for x ∈ `[0..1]`:
      *
      *     OETF(EOTF(x) = EOTF(OETF(x)) = x
      *
-     * For RGB colors, this function can be used to convert from linear space
-     * to "gamma space" (gamma encoded). The terms gamma space and gamma encoded
-     * are frequently used because many OETFs can be closely approximated using
-     * a simple power function of the form x^γ (the
-     * approximation of the [sRGB][ColorSpaces.Srgb] OETF uses γ = 2.2
-     * for instance).
+     * For RGB colors, this function can be used to convert from linear space to "gamma space"
+     * (gamma encoded). The terms gamma space and gamma encoded are frequently used because many
+     * OETFs can be closely approximated using a simple power function of the form x^γ (the
+     * approximation of the [sRGB][ColorSpaces.Srgb] OETF uses γ = 2.2 for instance).
      *
      * @return A transfer function that converts from linear space to "gamma space"
-     *
      * @see eotf
      * @see Rgb.transferParameters
      */
-    val oetf: (Double) -> Double = { x ->
-        oetfOrig(x).coerceIn(min.toDouble(), max.toDouble())
-    }
+    val oetf: (Double) -> Double = { x -> oetfOrig(x).coerceIn(min.toDouble(), max.toDouble()) }
 
     internal val oetfFunc: DoubleFunction = DoubleFunction { x ->
         oetfOrig(x).coerceIn(min.toDouble(), max.toDouble())
@@ -247,27 +216,22 @@
     internal val eotfOrig = eotf
 
     /**
-     * Returns the electro-optical transfer function (EOTF) of this color space.
-     * The inverse function is the opto-electronic transfer function (OETF)
-     * returned by [oetf]. These functions are defined to satisfy the
-     * following equality for x in `[0..1]`:
+     * Returns the electro-optical transfer function (EOTF) of this color space. The inverse
+     * function is the opto-electronic transfer function (OETF) returned by [oetf]. These functions
+     * are defined to satisfy the following equality for x in `[0..1]`:
      *
      *     OETF(EOTF(x) = EOTF(OETF(x)) = x
      *
-     * For RGB colors, this function can be used to convert from "gamma space"
-     * (gamma encoded) to linear space. The terms gamma space and gamma encoded
-     * are frequently used because many EOTFs can be closely approximated using
-     * a simple power function of the form x^γ (the approximation of the
-     * [sRGB][ColorSpaces.Srgb] EOTF uses γ = 2.2 for instance).
+     * For RGB colors, this function can be used to convert from "gamma space" (gamma encoded) to
+     * linear space. The terms gamma space and gamma encoded are frequently used because many EOTFs
+     * can be closely approximated using a simple power function of the form x^γ (the approximation
+     * of the [sRGB][ColorSpaces.Srgb] EOTF uses γ = 2.2 for instance).
      *
      * @return A transfer function that converts from "gamma space" to linear space
-     *
      * @see oetf
      * @see Rgb.transferParameters
      */
-    val eotf: (Double) -> Double = { x ->
-        eotfOrig(x.coerceIn(min.toDouble(), max.toDouble()))
-    }
+    val eotf: (Double) -> Double = { x -> eotfOrig(x.coerceIn(min.toDouble(), max.toDouble())) }
 
     internal val eotfFunc = DoubleFunction { x ->
         eotfOrig(x.coerceIn(min.toDouble(), max.toDouble()))
@@ -279,10 +243,8 @@
     init {
         if (primaries.size != 6 && primaries.size != 9) {
             throw IllegalArgumentException(
-                (
-                    "The color space's primaries must be " +
-                        "defined as an array of 6 floats in xyY or 9 floats in XYZ"
-                    )
+                ("The color space's primaries must be " +
+                    "defined as an array of 6 floats in xyY or 9 floats in XYZ")
             )
         }
 
@@ -312,69 +274,54 @@
     }
 
     /**
-     * Returns the primaries of this color space as a new array of 6 floats.
-     * The Y component is assumed to be 1 and is therefore not copied into
-     * the destination. The x and y components of the first primary are
-     * written in the array at positions 0 and 1 respectively.
+     * Returns the primaries of this color space as a new array of 6 floats. The Y component is
+     * assumed to be 1 and is therefore not copied into the destination. The x and y components of
+     * the first primary are written in the array at positions 0 and 1 respectively.
      *
      * @return A new non-null array of 2 floats
-     *
      * @see whitePoint
      */
-    @Size(6)
-    fun getPrimaries(): FloatArray = primaries.copyOf()
+    @Size(6) fun getPrimaries(): FloatArray = primaries.copyOf()
 
     /**
-     * Returns the transform of this color space as a new array. The
-     * transform is used to convert from RGB to XYZ (with the same white
-     * point as this color space). To connect color spaces, you must first
-     * [adapt][ColorSpace.adapt] them to the
-     * same white point.
+     * Returns the transform of this color space as a new array. The transform is used to convert
+     * from RGB to XYZ (with the same white point as this color space). To connect color spaces, you
+     * must first [adapt][ColorSpace.adapt] them to the same white point.
      *
-     * It is recommended to use [ColorSpace.connect]
-     * to convert between color spaces.
+     * It is recommended to use [ColorSpace.connect] to convert between color spaces.
      *
      * @return A new array of 9 floats
-     *
      * @see getInverseTransform
      */
-    @Size(9)
-    fun getTransform(): FloatArray = transform.copyOf()
+    @Size(9) fun getTransform(): FloatArray = transform.copyOf()
 
     /**
-     * Returns the inverse transform of this color space as a new array.
-     * The inverse transform is used to convert from XYZ to RGB (with the
-     * same white point as this color space). To connect color spaces, you
-     * must first [adapt][ColorSpace.adapt] them
-     * to the same white point.
+     * Returns the inverse transform of this color space as a new array. The inverse transform is
+     * used to convert from XYZ to RGB (with the same white point as this color space). To connect
+     * color spaces, you must first [adapt][ColorSpace.adapt] them to the same white point.
      *
-     * It is recommended to use [ColorSpace.connect]
-     * to convert between color spaces.
+     * It is recommended to use [ColorSpace.connect] to convert between color spaces.
      *
      * @return A new array of 9 floats
-     *
      * @see getTransform
      */
-    @Size(9)
-    fun getInverseTransform(): FloatArray = inverseTransform.copyOf()
+    @Size(9) fun getInverseTransform(): FloatArray = inverseTransform.copyOf()
 
     /**
-     * Creates a new RGB color space using a 3x3 column-major transform matrix.
-     * The transform matrix must convert from the RGB space to the profile connection
-     * space CIE XYZ.
+     * Creates a new RGB color space using a 3x3 column-major transform matrix. The transform matrix
+     * must convert from the RGB space to the profile connection space CIE XYZ.
      *
      * The range of the color space is imposed to be `[0..1]`.
      *
      * @param name Name of the color space, cannot be null, its length must be >= 1
-     * @param toXYZ 3x3 column-major transform matrix from RGB to the profile
-     * connection space CIE XYZ as an array of 9 floats, cannot be null
+     * @param toXYZ 3x3 column-major transform matrix from RGB to the profile connection space CIE
+     *   XYZ as an array of 9 floats, cannot be null
      * @param oetf Opto-electronic transfer function, cannot be null
      * @param eotf Electro-optical transfer function, cannot be null
-     *
      * @throws IllegalArgumentException If any of the following conditions is met:
-     *  * The name is null or has a length of 0.
-     *  * The OETF is null or the EOTF is null.
-     *  * The minimum valid value is >= the maximum valid value.
+     *     * The name is null or has a length of 0.
+     *     * The OETF is null or the EOTF is null.
+     *     * The minimum valid value is >= the maximum valid value.
      */
     constructor(
         @Size(min = 1) name: String,
@@ -395,12 +342,10 @@
     )
 
     /**
-     * Creates a new RGB color space using a specified set of primaries
-     * and a specified white point.
+     * Creates a new RGB color space using a specified set of primaries and a specified white point.
      *
-     * The primaries and white point can be specified in the CIE xyY space
-     * or in CIE XYZ. The length of the arrays depends on the chosen space:
-     *
+     * The primaries and white point can be specified in the CIE xyY space or in CIE XYZ. The length
+     * of the arrays depends on the chosen space:
      * ```
      * | Spaces | Primaries length | White point length |
      * |--------|------------------|--------------------|
@@ -408,9 +353,8 @@
      * | XYZ    | 9                | 3                  |
      * ```
      *
-     * When the primaries and/or white point are specified in xyY, the Y component
-     * does not need to be specified and is assumed to be 1.0. Only the xy components
-     * are required.
+     * When the primaries and/or white point are specified in xyY, the Y component does not need to
+     * be specified and is assumed to be 1.0. Only the xy components are required.
      *
      * @param name Name of the color space, cannot be null, its length must be >= 1
      * @param primaries RGB primaries as an array of 6 (xy) or 9 (XYZ) floats
@@ -419,13 +363,12 @@
      * @param eotf Electro-optical transfer function, cannot be null
      * @param min The minimum valid value in this color space's RGB range
      * @param max The maximum valid value in this color space's RGB range
-     *
      * @throws IllegalArgumentException If any of the following conditions is met:
-     *  * The name is null or has a length of 0.
-     *  * The primaries array is null or has a length that is neither 6 or 9.
-     *  * The white point array is null or has a length that is neither 2 or 3.
-     *  * The OETF is null or the EOTF is null.
-     *  * The minimum valid value is >= the maximum valid value.
+     *     * The name is null or has a length of 0.
+     *     * The primaries array is null or has a length that is neither 6 or 9.
+     *     * The white point array is null or has a length that is neither 2 or 3.
+     *     * The OETF is null or the EOTF is null.
+     *     * The minimum valid value is >= the maximum valid value.
      */
     constructor(
         @Size(min = 1) name: String,
@@ -449,20 +392,18 @@
     )
 
     /**
-     * Creates a new RGB color space using a 3x3 column-major transform matrix.
-     * The transform matrix must convert from the RGB space to the profile connection
-     * space CIE XYZ.
+     * Creates a new RGB color space using a 3x3 column-major transform matrix. The transform matrix
+     * must convert from the RGB space to the profile connection space CIE XYZ.
      *
      * The range of the color space is imposed to be `[0..1]`.
      *
      * @param name Name of the color space, cannot be null, its length must be >= 1
-     * @param toXYZ 3x3 column-major transform matrix from RGB to the profile
-     * connection space CIE XYZ as an array of 9 floats, cannot be null
+     * @param toXYZ 3x3 column-major transform matrix from RGB to the profile connection space CIE
+     *   XYZ as an array of 9 floats, cannot be null
      * @param function Parameters for the transfer functions
-     *
      * @throws IllegalArgumentException If any of the following conditions is met:
-     *  * The name is null or has a length of 0.
-     *  * Gamma is negative.
+     *     * The name is null or has a length of 0.
+     *     * Gamma is negative.
      */
     constructor(
         @Size(min = 1) name: String,
@@ -471,12 +412,10 @@
     ) : this(name, computePrimaries(toXYZ), computeWhitePoint(toXYZ), function, MinId)
 
     /**
-     * Creates a new RGB color space using a specified set of primaries
-     * and a specified white point.
+     * Creates a new RGB color space using a specified set of primaries and a specified white point.
      *
-     * The primaries and white point can be specified in the CIE xyY space
-     * or in CIE XYZ. The length of the arrays depends on the chosen space:
-     *
+     * The primaries and white point can be specified in the CIE xyY space or in CIE XYZ. The length
+     * of the arrays depends on the chosen space:
      * ```
      * | Spaces | Primaries length | White point length |
      * |--------|------------------|--------------------|
@@ -484,20 +423,18 @@
      * | XYZ    | 9                | 3                  |
      * ```
      *
-     * When the primaries and/or white point are specified in xyY, the Y component
-     * does not need to be specified and is assumed to be 1.0. Only the xy components
-     * are required.
+     * When the primaries and/or white point are specified in xyY, the Y component does not need to
+     * be specified and is assumed to be 1.0. Only the xy components are required.
      *
      * @param name Name of the color space, cannot be null, its length must be >= 1
      * @param primaries RGB primaries as an array of 6 (xy) or 9 (XYZ) floats
      * @param whitePoint Reference white as an array of 2 (xy) or 3 (XYZ) floats
      * @param function Parameters for the transfer functions
-     *
      * @throws IllegalArgumentException If any of the following conditions is met:
-     *  * The name is null or has a length of 0.
-     *  * The primaries array is null or has a length that is neither 6 or 9.
-     *  * The white point array is null or has a length that is neither 2 or 3.
-     *  * The transfer parameters are invalid.
+     *     * The name is null or has a length of 0.
+     *     * The primaries array is null or has a length that is neither 6 or 9.
+     *     * The white point array is null or has a length that is neither 2 or 3.
+     *     * The transfer parameters are invalid.
      */
     constructor(
         @Size(min = 1) name: String,
@@ -507,12 +444,10 @@
     ) : this(name, primaries, whitePoint, function, MinId)
 
     /**
-     * Creates a new RGB color space using a specified set of primaries
-     * and a specified white point.
+     * Creates a new RGB color space using a specified set of primaries and a specified white point.
      *
-     * The primaries and white point can be specified in the CIE xyY space
-     * or in CIE XYZ. The length of the arrays depends on the chosen space:
-     *
+     * The primaries and white point can be specified in the CIE xyY space or in CIE XYZ. The length
+     * of the arrays depends on the chosen space:
      * ```
      * | Spaces | Primaries length | White point length |
      * |--------|------------------|--------------------|
@@ -520,23 +455,21 @@
      * | XYZ    | 9                | 3                  |
      * ```
      *
-     * When the primaries and/or white point are specified in xyY, the Y component
-     * does not need to be specified and is assumed to be 1.0. Only the xy components
-     * are required.
+     * When the primaries and/or white point are specified in xyY, the Y component does not need to
+     * be specified and is assumed to be 1.0. Only the xy components are required.
      *
      * @param name Name of the color space, cannot be null, its length must be >= 1
      * @param primaries RGB primaries as an array of 6 (xy) or 9 (XYZ) floats
      * @param whitePoint Reference white as an array of 2 (xy) or 3 (XYZ) floats
      * @param function Parameters for the transfer functions
      * @param id ID of this color space as an integer between [ColorSpace.MinId] and
-     * [ColorSpace.MaxId]
-     *
+     *   [ColorSpace.MaxId]
      * @throws IllegalArgumentException If any of the following conditions is met:
-     *  * The name is null or has a length of 0.
-     *  * The primaries array is null or has a length that is neither 6 or 9.
-     *  * The white point array is null or has a length that is neither 2 or 3.
-     *  * The ID is not between [ColorSpace.MinId] and [ColorSpace.MaxId].
-     *  * The transfer parameters are invalid.
+     *     * The name is null or has a length of 0.
+     *     * The primaries array is null or has a length that is neither 6 or 9.
+     *     * The white point array is null or has a length that is neither 2 or 3.
+     *     * The ID is not between [ColorSpace.MinId] and [ColorSpace.MaxId].
+     *     * The transfer parameters are invalid.
      *
      * @see get
      */
@@ -547,55 +480,63 @@
         function: TransferParameters,
         id: Int
     ) : this(
-        name, primaries, whitePoint, null,
-        if (function.e == 0.0 && function.f == 0.0) DoubleFunction { x ->
-            rcpResponse(
-                x,
-                function.a,
-                function.b,
-                function.c,
-                function.d,
-                function.gamma
-            )
-        } else DoubleFunction { x ->
-            rcpResponse(
-                x, function.a, function.b, function.c, function.d, function.e,
-                function.f, function.gamma
-            )
-        },
-        if (function.e == 0.0 && function.f == 0.0) DoubleFunction { x ->
-            response(
-                x,
-                function.a,
-                function.b,
-                function.c,
-                function.d,
-                function.gamma
-            )
-        } else DoubleFunction { x ->
-            response(
-                x, function.a, function.b, function.c, function.d, function.e,
-                function.f, function.gamma
-            )
-        },
-        0.0f, 1.0f, function, id
+        name,
+        primaries,
+        whitePoint,
+        null,
+        if (function.e == 0.0 && function.f == 0.0)
+            DoubleFunction { x ->
+                rcpResponse(x, function.a, function.b, function.c, function.d, function.gamma)
+            }
+        else
+            DoubleFunction { x ->
+                rcpResponse(
+                    x,
+                    function.a,
+                    function.b,
+                    function.c,
+                    function.d,
+                    function.e,
+                    function.f,
+                    function.gamma
+                )
+            },
+        if (function.e == 0.0 && function.f == 0.0)
+            DoubleFunction { x ->
+                response(x, function.a, function.b, function.c, function.d, function.gamma)
+            }
+        else
+            DoubleFunction { x ->
+                response(
+                    x,
+                    function.a,
+                    function.b,
+                    function.c,
+                    function.d,
+                    function.e,
+                    function.f,
+                    function.gamma
+                )
+            },
+        0.0f,
+        1.0f,
+        function,
+        id
     )
 
     /**
-     * Creates a new RGB color space using a 3x3 column-major transform matrix.
-     * The transform matrix must convert from the RGB space to the profile connection
-     * space CIE XYZ.
+     * Creates a new RGB color space using a 3x3 column-major transform matrix. The transform matrix
+     * must convert from the RGB space to the profile connection space CIE XYZ.
      *
      * The range of the color space is imposed to be `[0..1]`.
      *
      * @param name Name of the color space, cannot be null, its length must be >= 1
-     * @param toXYZ 3x3 column-major transform matrix from RGB to the profile
-     * connection space CIE XYZ as an array of 9 floats, cannot be null
+     * @param toXYZ 3x3 column-major transform matrix from RGB to the profile connection space CIE
+     *   XYZ as an array of 9 floats, cannot be null
      * @param gamma Gamma to use as the transfer function
-     *
      * @throws IllegalArgumentException If any of the following conditions is met:
-     *  * The name is null or has a length of 0.
-     *  * Gamma is negative.
+     *     * The name is null or has a length of 0.
+     *     * Gamma is negative.
      *
      * @see get
      */
@@ -603,18 +544,13 @@
         @Size(min = 1) name: String,
         @Size(9) toXYZ: FloatArray,
         gamma: Double
-    ) : this(
-        name, computePrimaries(toXYZ), computeWhitePoint(toXYZ), gamma, 0.0f, 1.0f,
-        MinId
-    )
+    ) : this(name, computePrimaries(toXYZ), computeWhitePoint(toXYZ), gamma, 0.0f, 1.0f, MinId)
 
     /**
-     * Creates a new RGB color space using a specified set of primaries
-     * and a specified white point.
+     * Creates a new RGB color space using a specified set of primaries and a specified white point.
      *
-     * The primaries and white point can be specified in the CIE xyY space
-     * or in CIE XYZ. The length of the arrays depends on the chosen space:
-     *
+     * The primaries and white point can be specified in the CIE xyY space or in CIE XYZ. The length
+     * of the arrays depends on the chosen space:
      * ```
      * | Spaces | Primaries length | White point length |
      * |--------|------------------|--------------------|
@@ -622,20 +558,18 @@
      * | XYZ    | 9                | 3                  |
      * ```
      *
-     * When the primaries and/or white point are specified in xyY, the Y component
-     * does not need to be specified and is assumed to be 1.0. Only the xy components
-     * are required.
+     * When the primaries and/or white point are specified in xyY, the Y component does not need to
+     * be specified and is assumed to be 1.0. Only the xy components are required.
      *
      * @param name Name of the color space, cannot be null, its length must be >= 1
      * @param primaries RGB primaries as an array of 6 (xy) or 9 (XYZ) floats
      * @param whitePoint Reference white as an array of 2 (xy) or 3 (XYZ) floats
      * @param gamma Gamma to use as the transfer function
-     *
      * @throws IllegalArgumentException If any of the following conditions is met:
-     *  * The name is null or has a length of 0.
-     *  * The primaries array is null or has a length that is neither 6 or 9.
-     *  * The white point array is null or has a length that is neither 2 or 3.
-     *  * Gamma is negative.
+     *     * The name is null or has a length of 0.
+     *     * The primaries array is null or has a length that is neither 6 or 9.
+     *     * The white point array is null or has a length that is neither 2 or 3.
+     *     * Gamma is negative.
      *
      * @see get
      */
@@ -647,12 +581,10 @@
     ) : this(name, primaries, whitePoint, gamma, 0.0f, 1.0f, MinId)
 
     /**
-     * Creates a new RGB color space using a specified set of primaries
-     * and a specified white point.
+     * Creates a new RGB color space using a specified set of primaries and a specified white point.
      *
-     * The primaries and white point can be specified in the CIE xyY space
-     * or in CIE XYZ. The length of the arrays depends on the chosen space:
-     *
+     * The primaries and white point can be specified in the CIE xyY space or in CIE XYZ. The length
+     * of the arrays depends on the chosen space:
      * ```
      * | Spaces | Primaries length | White point length |
      * |--------|------------------|--------------------|
@@ -660,9 +592,8 @@
      * | XYZ    | 9                | 3                  |
      * ```
      *
-     * When the primaries and/or white point are specified in xyY, the Y component
-     * does not need to be specified and is assumed to be 1.0. Only the xy components
-     * are required.
+     * When the primaries and/or white point are specified in xyY, the Y component does not need to
+     * be specified and is assumed to be 1.0. Only the xy components are required.
      *
      * @param name Name of the color space, cannot be null, its length must be >= 1
      * @param primaries RGB primaries as an array of 6 (xy) or 9 (XYZ) floats
@@ -671,15 +602,14 @@
      * @param min The minimum valid value in this color space's RGB range
      * @param max The maximum valid value in this color space's RGB range
      * @param id ID of this color space as an integer between [ColorSpace.MinId] and
-     * [ColorSpace.MaxId]
-     *
+     *   [ColorSpace.MaxId]
      * @throws IllegalArgumentException If any of the following conditions is met:
-     *  * The name is null or has a length of 0.
-     *  * The primaries array is null or has a length that is neither 6 or 9.
-     *  * The white point array is null or has a length that is neither 2 or 3.
-     *  * The minimum valid value is >= the maximum valid value.
-     *  * The ID is not between [ColorSpace.MinId] and [ColorSpace.MaxId].
-     *  * Gamma is negative.
+     *     * The name is null or has a length of 0.
+     *     * The primaries array is null or has a length that is neither 6 or 9.
+     *     * The white point array is null or has a length that is neither 2 or 3.
+     *     * The minimum valid value is >= the maximum valid value.
+     *     * The ID is not between [ColorSpace.MinId] and [ColorSpace.MaxId].
+     *     * Gamma is negative.
      *
      * @see get
      */
@@ -692,7 +622,10 @@
         max: Float,
         id: Int
     ) : this(
-        name, primaries, whitePoint, null,
+        name,
+        primaries,
+        whitePoint,
+        null,
         if (gamma == 1.0) DoubleIdentity
         else DoubleFunction { x -> (if (x < 0.0) 0.0 else x).pow(1.0 / gamma) },
         if (gamma == 1.0) DoubleIdentity
@@ -713,23 +646,25 @@
         transform: FloatArray,
         whitePoint: WhitePoint
     ) : this(
-        colorSpace.name, colorSpace.primaries, whitePoint, transform,
-        colorSpace.oetfOrig, colorSpace.eotfOrig, colorSpace.min, colorSpace.max,
+        colorSpace.name,
+        colorSpace.primaries,
+        whitePoint,
+        transform,
+        colorSpace.oetfOrig,
+        colorSpace.eotfOrig,
+        colorSpace.min,
+        colorSpace.max,
         colorSpace.transferParameters,
         MinId
     )
 
     /**
-     * Copies the primaries of this color space in specified array. The Y
-     * component is assumed to be 1 and is therefore not copied into the
-     * destination. The x and y components of the first primary are written
-     * in the array at positions 0 and 1 respectively.
+     * Copies the primaries of this color space in specified array. The Y component is assumed to be
+     * 1 and is therefore not copied into the destination. The x and y components of the first
+     * primary are written in the array at positions 0 and 1 respectively.
      *
-     * @param primaries The destination array, cannot be null, its length
-     * must be >= 6
-     *
+     * @param primaries The destination array, cannot be null, its length must be >= 6
      * @return [primaries] array, modified to contain the primaries of this color space.
-     *
      * @see getPrimaries
      */
     @Size(min = 6)
@@ -738,20 +673,14 @@
     }
 
     /**
-     * Copies the transform of this color space in specified array. The
-     * transform is used to convert from RGB to XYZ (with the same white
-     * point as this color space). To connect color spaces, you must first
-     * [adapt][ColorSpace.adapt] them to the
-     * same white point.
+     * Copies the transform of this color space in specified array. The transform is used to convert
+     * from RGB to XYZ (with the same white point as this color space). To connect color spaces, you
+     * must first [adapt][ColorSpace.adapt] them to the same white point.
      *
-     * It is recommended to use [ColorSpace.connect]
-     * to convert between color spaces.
+     * It is recommended to use [ColorSpace.connect] to convert between color spaces.
      *
-     * @param transform The destination array, cannot be null, its length
-     * must be >= 9
-     *
+     * @param transform The destination array, cannot be null, its length must be >= 9
      * @return [transform], modified to contain the transform for this color space.
-     *
      * @see getInverseTransform
      */
     @Size(min = 9)
@@ -760,21 +689,15 @@
     }
 
     /**
-     * Copies the inverse transform of this color space in specified array.
-     * The inverse transform is used to convert from XYZ to RGB (with the
-     * same white point as this color space). To connect color spaces, you
-     * must first [adapt][ColorSpace.adapt] them
-     * to the same white point.
+     * Copies the inverse transform of this color space in specified array. The inverse transform is
+     * used to convert from XYZ to RGB (with the same white point as this color space). To connect
+     * color spaces, you must first [adapt][ColorSpace.adapt] them to the same white point.
      *
-     * It is recommended to use [ColorSpace.connect]
-     * to convert between color spaces.
+     * It is recommended to use [ColorSpace.connect] to convert between color spaces.
      *
-     * @param inverseTransform The destination array, cannot be null, its length
-     * must be >= 9
-     *
-     * @return The [inverseTransform] array passed as a parameter, modified to contain the
-     * inverse transform of this color space.
-     *
+     * @param inverseTransform The destination array, cannot be null, its length must be >= 9
+     * @return The [inverseTransform] array passed as a parameter, modified to contain the inverse
+     *   transform of this color space.
      * @see getTransform
      */
     @Size(min = 9)
@@ -791,19 +714,16 @@
     }
 
     /**
-     * Decodes an RGB value to linear space. This is achieved by
-     * applying this color space's electro-optical transfer function
-     * to the supplied values.
+     * Decodes an RGB value to linear space. This is achieved by applying this color space's
+     * electro-optical transfer function to the supplied values.
      *
-     * Refer to the documentation of [Rgb] for
-     * more information about transfer functions and their use for
-     * encoding and decoding RGB values.
+     * Refer to the documentation of [Rgb] for more information about transfer functions and their
+     * use for encoding and decoding RGB values.
      *
      * @param r The red component to decode to linear space
      * @param g The green component to decode to linear space
      * @param b The blue component to decode to linear space
      * @return A new array of 3 floats containing linear RGB values
-     *
      * @see toLinear
      * @see fromLinear
      */
@@ -813,19 +733,15 @@
     }
 
     /**
-     * Decodes an RGB value to linear space. This is achieved by
-     * applying this color space's electro-optical transfer function
-     * to the first 3 values of the supplied array. The result is
+     * Decodes an RGB value to linear space. This is achieved by applying this color space's
+     * electro-optical transfer function to the first 3 values of the supplied array. The result is
      * stored back in the input array.
      *
-     * Refer to the documentation of [Rgb] for
-     * more information about transfer functions and their use for
-     * encoding and decoding RGB values.
+     * Refer to the documentation of [Rgb] for more information about transfer functions and their
+     * use for encoding and decoding RGB values.
      *
-     * @param v A non-null array of non-linear RGB values, its length
-     * must be at least 3
+     * @param v A non-null array of non-linear RGB values, its length must be at least 3
      * @return [v], containing linear RGB values
-     *
      * @see toLinear
      * @see fromLinear
      */
@@ -840,19 +756,16 @@
     }
 
     /**
-     * Encodes an RGB value from linear space to this color space's
-     * "gamma space". This is achieved by applying this color space's
-     * opto-electronic transfer function to the supplied values.
+     * Encodes an RGB value from linear space to this color space's "gamma space". This is achieved
+     * by applying this color space's opto-electronic transfer function to the supplied values.
      *
-     * Refer to the documentation of [Rgb] for
-     * more information about transfer functions and their use for
-     * encoding and decoding RGB values.
+     * Refer to the documentation of [Rgb] for more information about transfer functions and their
+     * use for encoding and decoding RGB values.
      *
      * @param r The red component to encode from linear space
      * @param g The green component to encode from linear space
      * @param b The blue component to encode from linear space
      * @return A new array of 3 floats containing non-linear RGB values
-     *
      * @see fromLinear
      * @see toLinear
      */
@@ -862,19 +775,15 @@
     }
 
     /**
-     * Encodes an RGB value from linear space to this color space's
-     * "gamma space". This is achieved by applying this color space's
-     * opto-electronic transfer function to the first 3 values of the
+     * Encodes an RGB value from linear space to this color space's "gamma space". This is achieved
+     * by applying this color space's opto-electronic transfer function to the first 3 values of the
      * supplied array. The result is stored back in the input array.
      *
-     * Refer to the documentation of [Rgb] for
-     * more information about transfer functions and their use for
-     * encoding and decoding RGB values.
+     * Refer to the documentation of [Rgb] for more information about transfer functions and their
+     * use for encoding and decoding RGB values.
      *
-     * @param v A non-null array of linear RGB values, its length
-     * must be at least 3
+     * @param v A non-null array of linear RGB values, its length must be at least 3
      * @return [v], containing non-linear RGB values
-     *
      * @see fromLinear
      * @see toLinear
      */
@@ -974,10 +883,8 @@
         result = 31 * result + primaries.contentHashCode()
         result = 31 * result + (if (min != +0.0f) min.toBits() else 0)
         result = 31 * result + (if (max != +0.0f) max.toBits() else 0)
-        result = (
-            31 * result +
-                if (transferParameters != null) transferParameters.hashCode() else 0
-            )
+        result =
+            (31 * result + if (transferParameters != null) transferParameters.hashCode() else 0)
         if (transferParameters == null) {
             result = 31 * result + oetfOrig.hashCode()
             result = 31 * result + eotfOrig.hashCode()
@@ -991,8 +898,7 @@
         private val DoubleIdentity = DoubleFunction { d -> d }
 
         /**
-         * Computes whether a color space is the sRGB color space or at least
-         * a close approximation.
+         * Computes whether a color space is the sRGB color space or at least a close approximation.
          *
          * @param primaries The set of RGB primaries in xyY as an array of 6 floats
          * @param whitePoint The white point in xyY as an array of 2 floats
@@ -1002,7 +908,6 @@
          * @param max The minimum value of the color space's range
          * @param id The ID of the color space
          * @return True if the color space can be considered as the sRGB color space
-         *
          * @see isSrgb
          */
         private fun isSrgb(
@@ -1031,77 +936,47 @@
 
             var x = 0.0
             while (x <= 1.0) {
-                if (!compare(
-                        x,
-                        OETF,
-                        srgb.oetfOrig
-                    )
-                ) return false
-                if (!compare(
-                        x,
-                        EOTF,
-                        srgb.eotfOrig
-                    )
-                ) return false
+                if (!compare(x, OETF, srgb.oetfOrig)) return false
+                if (!compare(x, EOTF, srgb.eotfOrig)) return false
                 x += 1 / 255.0
             }
 
             return true
         }
 
-        private fun compare(
-            point: Double,
-            a: DoubleFunction,
-            b: DoubleFunction
-        ): Boolean {
+        private fun compare(point: Double, a: DoubleFunction, b: DoubleFunction): Boolean {
             val rA = a(point)
             val rB = b(point)
             return abs(rA - rB) <= 1e-3
         }
 
         /**
-         * Computes whether the specified CIE xyY or XYZ primaries (with Y set to 1) form
-         * a wide color gamut. A color gamut is considered wide if its area is &gt; 90%
-         * of the area of NTSC 1953 and if it contains the sRGB color gamut entirely.
-         * If the conditions above are not met, the color space is considered as having
-         * a wide color gamut if its range is larger than [0..1].
+         * Computes whether the specified CIE xyY or XYZ primaries (with Y set to 1) form a wide
+         * color gamut. A color gamut is considered wide if its area is &gt; 90% of the area of NTSC
+         * 1953 and if it contains the sRGB color gamut entirely. If the conditions above are not
+         * met, the color space is considered as having a wide color gamut if its range is larger
+         * than [0..1].
          *
          * @param primaries RGB primaries in CIE xyY as an array of 6 floats
          * @param min The minimum value of the color space's range
          * @param max The minimum value of the color space's range
          * @return True if the color space has a wide gamut, false otherwise
-         *
          * @see isWideGamut
          * @see area
          */
-        private fun isWideGamut(
-            primaries: FloatArray,
-            min: Float,
-            max: Float
-        ): Boolean {
-            return (
-                (
-                    (
-                        area(primaries) / area(
-                            ColorSpaces.Ntsc1953Primaries
-                        ) > 0.9f && contains(
-                            primaries,
-                            ColorSpaces.SrgbPrimaries
-                        )
-                        )
-                    ) || (min < 0.0f && max > 1.0f)
-                )
+        private fun isWideGamut(primaries: FloatArray, min: Float, max: Float): Boolean {
+            return (((area(primaries) / area(ColorSpaces.Ntsc1953Primaries) > 0.9f &&
+                contains(primaries, ColorSpaces.SrgbPrimaries))) || (min < 0.0f && max > 1.0f))
         }
 
         /**
-         * Computes the area of the triangle represented by a set of RGB primaries
-         * in the CIE xyY space.
+         * Computes the area of the triangle represented by a set of RGB primaries in the CIE xyY
+         * space.
          *
          * If [primaries] does not contain at least 6 elements, returns 0.0.
          *
          * @param primaries The triangle's vertices, as RGB primaries in an array of 6 floats
          * @return The area of the triangle
-         *
          * @see isWideGamut
          */
         private fun area(primaries: FloatArray): Float {
@@ -1132,14 +1007,12 @@
         }
 
         /**
-         * Decides whether a 2D triangle, identified by the 6 coordinates of its
-         * 3 vertices, is contained within another 2D triangle, also identified
-         * by the 6 coordinates of its 3 vertices.
+         * Decides whether a 2D triangle, identified by the 6 coordinates of its 3 vertices, is
+         * contained within another 2D triangle, also identified by the 6 coordinates of its 3
+         * vertices.
          *
-         * In the illustration below, we want to test whether the RGB triangle
-         * is contained within the triangle XYZ formed by the 3 vertices at
-         * the "+" locations.
-         *
+         * In the illustration below, we want to test whether the RGB triangle is contained within
+         * the triangle XYZ formed by the 3 vertices at the "+" locations.
          *
          *                                     Y     .
          *                                 .   +    .
@@ -1169,143 +1042,100 @@
          *        +   .
          *      Z    .
          *
-         * RGB is contained within XYZ if all the following conditions are true
-         * (with "x" the cross product operator):
-         *
-         *   -->  -->
-         *   GR x RX >= 0
-         *   -->  -->
-         *   RX x BR >= 0
-         *   -->  -->
-         *   RG x GY >= 0
-         *   -->  -->
-         *   GY x RG >= 0
-         *   -->  -->
-         *   RB x BZ >= 0
-         *   -->  -->
-         *   BZ x GB >= 0
+         * RGB is contained within XYZ if all the following conditions are true (with "x" the cross
+         * product operator):
+         * -->  -->
+         * GR x RX >= 0
+         * -->  -->
+         * RX x BR >= 0
+         * -->  -->
+         * RG x GY >= 0
+         * -->  -->
+         * GY x RG >= 0
+         * -->  -->
+         * RB x BZ >= 0
+         * -->  -->
+         * BZ x GB >= 0
          *
          * @param p1 The enclosing triangle as 6 floats
          * @param p2 The enclosed triangle as 6 floats
          * @return True if the triangle p1 contains the triangle p2
-         *
          * @see isWideGamut
          */
         private fun contains(p1: FloatArray, p2: FloatArray): Boolean {
             // Translate the vertices p1 in the coordinates system
             // with the vertices p2 as the origin
-            val p0 = floatArrayOf(
-                p1[0] - p2[0], p1[1] - p2[1],
-                p1[2] - p2[2], p1[3] - p2[3],
-                p1[4] - p2[4], p1[5] - p2[5]
-            )
+            val p0 =
+                floatArrayOf(
+                    p1[0] - p2[0],
+                    p1[1] - p2[1],
+                    p1[2] - p2[2],
+                    p1[3] - p2[3],
+                    p1[4] - p2[4],
+                    p1[5] - p2[5]
+                )
             // Check the first vertex of p1
             if (
-                cross(
-                    p0[0],
-                    p0[1],
-                    p2[0] - p2[4],
-                    p2[1] - p2[5]
-                ) < 0 ||
-                cross(
-                    p2[0] - p2[2],
-                    p2[1] - p2[3],
-                    p0[0],
-                    p0[1]
-                ) < 0
+                cross(p0[0], p0[1], p2[0] - p2[4], p2[1] - p2[5]) < 0 ||
+                    cross(p2[0] - p2[2], p2[1] - p2[3], p0[0], p0[1]) < 0
             ) {
                 return false
             }
             // Check the second vertex of p1
             if (
-                cross(
-                    p0[2],
-                    p0[3],
-                    p2[2] - p2[0],
-                    p2[3] - p2[1]
-                ) < 0 ||
-                cross(
-                    p2[2] - p2[4],
-                    p2[3] - p2[5],
-                    p0[2],
-                    p0[3]
-                ) < 0
+                cross(p0[2], p0[3], p2[2] - p2[0], p2[3] - p2[1]) < 0 ||
+                    cross(p2[2] - p2[4], p2[3] - p2[5], p0[2], p0[3]) < 0
             ) {
                 return false
             }
             // Check the third vertex of p1
-            return !(
-                cross(
-                    p0[4],
-                    p0[5],
-                    p2[4] - p2[2],
-                    p2[5] - p2[3]
-                ) < 0 ||
-                cross(
-                    p2[4] - p2[0],
-                    p2[5] - p2[1],
-                    p0[4],
-                    p0[5]
-                ) < 0
-            )
+            return !(cross(p0[4], p0[5], p2[4] - p2[2], p2[5] - p2[3]) < 0 ||
+                cross(p2[4] - p2[0], p2[5] - p2[1], p0[4], p0[5]) < 0)
         }
 
         /**
-         * Computes the primaries  of a color space identified only by
-         * its RGB->XYZ transform matrix. This method assumes that the
-         * range of the color space is [0..1].
+         * Computes the primaries of a color space identified only by its RGB->XYZ transform matrix.
+         * This method assumes that the range of the color space is [0..1].
          *
          * @param toXYZ The color space's 3x3 transform matrix to XYZ
-         * @return A new array of 6 floats containing the color space's
-         * primaries in CIE xyY
+         * @return A new array of 6 floats containing the color space's primaries in CIE xyY
          */
         internal fun computePrimaries(toXYZ: FloatArray): FloatArray {
-            val r = mul3x3Float3(
-                toXYZ,
-                floatArrayOf(1.0f, 0.0f, 0.0f)
-            )
-            val g = mul3x3Float3(
-                toXYZ,
-                floatArrayOf(0.0f, 1.0f, 0.0f)
-            )
-            val b = mul3x3Float3(
-                toXYZ,
-                floatArrayOf(0.0f, 0.0f, 1.0f)
-            )
+            val r = mul3x3Float3(toXYZ, floatArrayOf(1.0f, 0.0f, 0.0f))
+            val g = mul3x3Float3(toXYZ, floatArrayOf(0.0f, 1.0f, 0.0f))
+            val b = mul3x3Float3(toXYZ, floatArrayOf(0.0f, 0.0f, 1.0f))
 
             val rSum = r[0] + r[1] + r[2]
             val gSum = g[0] + g[1] + g[2]
             val bSum = b[0] + b[1] + b[2]
 
             return floatArrayOf(
-                r[0] / rSum, r[1] / rSum,
-                g[0] / gSum, g[1] / gSum,
-                b[0] / bSum, b[1] / bSum
+                r[0] / rSum,
+                r[1] / rSum,
+                g[0] / gSum,
+                g[1] / gSum,
+                b[0] / bSum,
+                b[1] / bSum
             )
         }
 
         /**
-         * Computes the white point of a color space identified only by
-         * its RGB->XYZ transform matrix. This method assumes that the
-         * range of the color space is [0..1].
+         * Computes the white point of a color space identified only by its RGB->XYZ transform
+         * matrix. This method assumes that the range of the color space is [0..1].
          *
          * @param toXYZ The color space's 3x3 transform matrix to XYZ
-         * @return A new array of 2 floats containing the color space's
-         * white point in CIE xyY
+         * @return A new array of 2 floats containing the color space's white point in CIE xyY
          */
         private fun computeWhitePoint(toXYZ: FloatArray): WhitePoint {
-            val w = mul3x3Float3(
-                toXYZ,
-                floatArrayOf(1.0f, 1.0f, 1.0f)
-            )
+            val w = mul3x3Float3(toXYZ, floatArrayOf(1.0f, 1.0f, 1.0f))
             val sum = w[0] + w[1] + w[2]
             return WhitePoint(w[0] / sum, w[1] / sum)
         }
 
         /**
-         * Converts the specified RGB primaries point to xyY if needed. The primaries
-         * can be specified as an array of 6 floats (in CIE xyY) or 9 floats
-         * (in CIE XYZ). If no conversion is needed, the input array is copied.
+         * Converts the specified RGB primaries point to xyY if needed. The primaries can be
+         * specified as an array of 6 floats (in CIE xyY) or 9 floats (in CIE XYZ). If no conversion
+         * is needed, the input array is copied.
          *
          * @param primaries The primaries in xyY or XYZ, in an array of 6 floats.
          * @return A new array of 6 floats containing the primaries in xyY
@@ -1334,18 +1164,15 @@
         }
 
         /**
-         * Computes the matrix that converts from RGB to XYZ based on RGB
-         * primaries and a white point, both specified in the CIE xyY space.
-         * The Y component of the primaries and white point is implied to be 1.
+         * Computes the matrix that converts from RGB to XYZ based on RGB primaries and a white
+         * point, both specified in the CIE xyY space. The Y component of the primaries and white
+         * point is implied to be 1.
          *
          * @param primaries The RGB primaries in xyY, as an array of 6 floats
          * @param whitePoint The white point in xyY, as an array of 2 floats
          * @return A 3x3 matrix as a new array of 9 floats
          */
-        private fun computeXYZMatrix(
-            primaries: FloatArray,
-            whitePoint: WhitePoint
-        ): FloatArray {
+        private fun computeXYZMatrix(primaries: FloatArray, whitePoint: WhitePoint): FloatArray {
             val rx = primaries[0]
             val ry = primaries[1]
             val gx = primaries[2]
@@ -1378,17 +1205,23 @@
             val bYBy = bY / by
 
             return floatArrayOf(
-                rYRy * rx, rY, rYRy * (1f - rx - ry),
-                gYGy * gx, gY, gYGy * (1f - gx - gy),
-                bYBy * bx, bY, bYBy * (1f - bx - by)
+                rYRy * rx,
+                rY,
+                rYRy * (1f - rx - ry),
+                gYGy * gx,
+                gY,
+                gYGy * (1f - gx - gy),
+                bYBy * bx,
+                bY,
+                bYBy * (1f - bx - by)
             )
         }
     }
 }
 
 /**
- * Java's DoubleUnaryOperator isn't available until API 24, so we'll use a substitute.
- * When we bump minimum SDK versions, this should be removed and we should use Java's version.
+ * Java's DoubleUnaryOperator isn't available until API 24, so we'll use a substitute. When we bump
+ * minimum SDK versions, this should be removed and we should use Java's version.
  */
 internal fun interface DoubleFunction {
     operator fun invoke(double: Double): Double
diff --git a/compose/ui/ui-graphics/src/commonMain/kotlin/androidx/compose/ui/graphics/colorspace/TransferParameters.kt b/compose/ui/ui-graphics/src/commonMain/kotlin/androidx/compose/ui/graphics/colorspace/TransferParameters.kt
index c20f30a..ea4a900 100644
--- a/compose/ui/ui-graphics/src/commonMain/kotlin/androidx/compose/ui/graphics/colorspace/TransferParameters.kt
+++ b/compose/ui/ui-graphics/src/commonMain/kotlin/androidx/compose/ui/graphics/colorspace/TransferParameters.kt
@@ -17,40 +17,46 @@
 package androidx.compose.ui.graphics.colorspace
 
 /**
- * Defines the parameters for the ICC parametric curve type 4, as
- * defined in ICC.1:2004-10, section 10.15.
+ * Defines the parameters for the ICC parametric curve type 4, as defined in ICC.1:2004-10, section
+ * 10.15.
  *
- * [The EOTF is of the form linked here](https://d.android.com/reference/android/graphics/ColorSpace.Rgb.TransferParameters)
+ * [The EOTF is of the form linked
+ * here](https://d.android.com/reference/android/graphics/ColorSpace.Rgb.TransferParameters)
  *
  * The corresponding OETF is simply the inverse function.
  *
- * The parameters defined by this class form a valid transfer
- * function only if all the following conditions are met:
- *
- *  * No parameter is a [Not-a-Number][Double.isNaN]
- *  * `d` is in the range `[0..1]`
- *  * The function is not constant
- *  * The function is positive and increasing
+ * The parameters defined by this class form a valid transfer function only if all the following
+ * conditions are met:
+ * * No parameter is a [Not-a-Number][Double.isNaN]
+ * * `d` is in the range `[0..1]`
+ * * The function is not constant
+ * * The function is positive and increasing
  */
 data class TransferParameters(
-    /** Value g in the equation of the EOTF described above.  */
+    /** Value g in the equation of the EOTF described above. */
     val gamma: Double,
-    /** Value a in the equation of the EOTF described above.  */
+    /** Value a in the equation of the EOTF described above. */
     val a: Double,
-    /** Value b in the equation of the EOTF described above.  */
+    /** Value b in the equation of the EOTF described above. */
     val b: Double,
-    /** Value c in the equation of the EOTF described above.  */
+    /** Value c in the equation of the EOTF described above. */
     val c: Double,
-    /** Value d in the equation of the EOTF described above.  */
+    /** Value d in the equation of the EOTF described above. */
     val d: Double,
-    /** Value e in the equation of the EOTF described above.  */
+    /** Value e in the equation of the EOTF described above. */
     val e: Double = 0.0,
-    /** Value f in the equation of the EOTF described above.  */
+    /** Value f in the equation of the EOTF described above. */
     val f: Double = 0.0
 ) {
     init {
-        if (a.isNaN() || b.isNaN() || c.isNaN() || d.isNaN() || e.isNaN() || f.isNaN() ||
-            gamma.isNaN()
+        if (
+            a.isNaN() ||
+                b.isNaN() ||
+                c.isNaN() ||
+                d.isNaN() ||
+                e.isNaN() ||
+                f.isNaN() ||
+                gamma.isNaN()
         ) {
             throw IllegalArgumentException("Parameters cannot be NaN")
         }
@@ -58,10 +64,7 @@
         // Next representable float after 1.0
         // We use doubles here but the representation inside our native code is often floats
         if (!(d >= 0.0 && d <= 1.0)) {
-            throw IllegalArgumentException(
-                "Parameter d must be in the range [0..1], was " +
-                    "$d"
-            )
+            throw IllegalArgumentException("Parameter d must be in the range [0..1], was " + "$d")
         }
 
         if (d == 0.0 && (a == 0.0 || gamma == 0.0)) {
@@ -71,15 +74,12 @@
         }
 
         if (d >= 1.0 && c == 0.0) {
-            throw IllegalArgumentException(
-                "Parameter c is zero, the transfer function is constant"
-            )
+            throw IllegalArgumentException("Parameter c is zero, the transfer function is constant")
         }
 
         if ((a == 0.0 || gamma == 0.0) && c == 0.0) {
             throw IllegalArgumentException(
-                "Parameter a or g is zero," +
-                    " and c is zero, the transfer function is constant"
+                "Parameter a or g is zero," + " and c is zero, the transfer function is constant"
             )
         }
 
@@ -89,10 +89,7 @@
 
         if (a < 0.0 || gamma < 0.0) {
             throw IllegalArgumentException(
-                (
-                    "The transfer function must be " +
-                        "positive or increasing"
-                    )
+                ("The transfer function must be " + "positive or increasing")
             )
         }
     }
diff --git a/compose/ui/ui-graphics/src/commonMain/kotlin/androidx/compose/ui/graphics/colorspace/WhitePoint.kt b/compose/ui/ui-graphics/src/commonMain/kotlin/androidx/compose/ui/graphics/colorspace/WhitePoint.kt
index b6457ae..9754bc8 100644
--- a/compose/ui/ui-graphics/src/commonMain/kotlin/androidx/compose/ui/graphics/colorspace/WhitePoint.kt
+++ b/compose/ui/ui-graphics/src/commonMain/kotlin/androidx/compose/ui/graphics/colorspace/WhitePoint.kt
@@ -19,24 +19,21 @@
 import androidx.annotation.Size
 
 /**
- * Class for constructing white points used in [RGB][Rgb] color space. The value is
- * stored in the CIE xyY color space. The Y component of the white point is assumed
- * to be 1.
+ * Class for constructing white points used in [RGB][Rgb] color space. The value is stored in the
+ * CIE xyY color space. The Y component of the white point is assumed to be 1.
  *
  * @see Illuminant
  */
 data class WhitePoint(val x: Float, val y: Float) {
-    /**
-     * Illuminant for CIE XYZ white point
-     */
+    /** Illuminant for CIE XYZ white point */
     constructor(x: Float, y: Float, z: Float) : this(x, y, z, x + y + z)
 
     @Suppress("UNUSED_PARAMETER")
     private constructor(x: Float, y: Float, z: Float, sum: Float) : this(x / sum, y / sum)
 
     /**
-     * Converts a value from CIE xyY to CIE XYZ. Y is assumed to be 1 so the
-     * input xyY array only contains the x and y components.
+     * Converts a value from CIE xyY to CIE XYZ. Y is assumed to be 1 so the input xyY array only
+     * contains the x and y components.
      *
      * @return A new float array of length 3 containing XYZ values
      */
diff --git a/compose/ui/ui-graphics/src/commonMain/kotlin/androidx/compose/ui/graphics/colorspace/Xyz.kt b/compose/ui/ui-graphics/src/commonMain/kotlin/androidx/compose/ui/graphics/colorspace/Xyz.kt
index ae4d62a..ca81f35 100644
--- a/compose/ui/ui-graphics/src/commonMain/kotlin/androidx/compose/ui/graphics/colorspace/Xyz.kt
+++ b/compose/ui/ui-graphics/src/commonMain/kotlin/androidx/compose/ui/graphics/colorspace/Xyz.kt
@@ -20,16 +20,8 @@
 import androidx.compose.ui.util.fastCoerceIn
 import androidx.compose.ui.util.packFloats
 
-/**
- * Implementation of the CIE XYZ color space. Assumes the white point is D50.
- */
-internal class Xyz(
-    name: String,
-    id: Int
-) : ColorSpace(
-    name,
-    ColorModel.Xyz, id
-) {
+/** Implementation of the CIE XYZ color space. Assumes the white point is D50. */
+internal class Xyz(name: String, id: Int) : ColorSpace(name, ColorModel.Xyz, id) {
 
     override val isWideGamut: Boolean
         get() = true
diff --git a/compose/ui/ui-graphics/src/commonMain/kotlin/androidx/compose/ui/graphics/drawscope/CanvasDrawScope.kt b/compose/ui/ui-graphics/src/commonMain/kotlin/androidx/compose/ui/graphics/drawscope/CanvasDrawScope.kt
index 31d4545..a4936f1 100644
--- a/compose/ui/ui-graphics/src/commonMain/kotlin/androidx/compose/ui/graphics/drawscope/CanvasDrawScope.kt
+++ b/compose/ui/ui-graphics/src/commonMain/kotlin/androidx/compose/ui/graphics/drawscope/CanvasDrawScope.kt
@@ -46,8 +46,8 @@
 import androidx.compose.ui.unit.LayoutDirection
 
 /**
- * Implementation of [DrawScope] that issues drawing commands
- * into the specified canvas and bounds via [CanvasDrawScope.draw]
+ * Implementation of [DrawScope] that issues drawing commands into the specified canvas and bounds
+ * via [CanvasDrawScope.draw]
  */
 class CanvasDrawScope : DrawScope {
 
@@ -62,46 +62,52 @@
     override val fontScale: Float
         get() = drawParams.density.fontScale
 
-    override val drawContext = object : DrawContext {
-        override var canvas: Canvas
-            get() = drawParams.canvas
-            set(value) { drawParams.canvas = value }
+    override val drawContext =
+        object : DrawContext {
+            override var canvas: Canvas
+                get() = drawParams.canvas
+                set(value) {
+                    drawParams.canvas = value
+                }
 
-        override var size: Size
-            get() = drawParams.size
-            set(value) {
-                drawParams.size = value
-            }
+            override var size: Size
+                get() = drawParams.size
+                set(value) {
+                    drawParams.size = value
+                }
 
-        override val transform: DrawTransform = asDrawTransform()
+            override val transform: DrawTransform = asDrawTransform()
 
-        override var layoutDirection: LayoutDirection
-            get() = drawParams.layoutDirection
-            set(value) { drawParams.layoutDirection = value }
-        override var density: Density
-            get() = drawParams.density
-            set(value) { drawParams.density = value }
+            override var layoutDirection: LayoutDirection
+                get() = drawParams.layoutDirection
+                set(value) {
+                    drawParams.layoutDirection = value
+                }
 
-        override var graphicsLayer: GraphicsLayer? = null
-    }
+            override var density: Density
+                get() = drawParams.density
+                set(value) {
+                    drawParams.density = value
+                }
+
+            override var graphicsLayer: GraphicsLayer? = null
+        }
 
     /**
-     * Internal [Paint] used only for drawing filled in shapes with a color or gradient
-     * This is lazily allocated on the first drawing command that uses the [Fill] [DrawStyle]
-     * and re-used across subsequent calls
+     * Internal [Paint] used only for drawing filled in shapes with a color or gradient This is
+     * lazily allocated on the first drawing command that uses the [Fill] [DrawStyle] and re-used
+     * across subsequent calls
      */
     private var fillPaint: Paint? = null
 
     /**
-     * Internal [Paint] used only for drawing stroked shapes with a color or gradient
-     * This is lazily allocated on the first drawing command that uses the [Stroke] [DrawStyle]
-     * and re-used across subsequent calls
+     * Internal [Paint] used only for drawing stroked shapes with a color or gradient This is lazily
+     * allocated on the first drawing command that uses the [Stroke] [DrawStyle] and re-used across
+     * subsequent calls
      */
     private var strokePaint: Paint? = null
 
-    /**
-     * @see [DrawScope.drawLine]
-     */
+    /** @see [DrawScope.drawLine] */
     override fun drawLine(
         brush: Brush,
         start: Offset,
@@ -112,25 +118,24 @@
         @FloatRange(from = 0.0, to = 1.0) alpha: Float,
         colorFilter: ColorFilter?,
         blendMode: BlendMode
-    ) = drawParams.canvas.drawLine(
-        start,
-        end,
-        configureStrokePaint(
-            brush,
-            strokeWidth,
-            Stroke.DefaultMiter,
-            cap,
-            StrokeJoin.Miter,
-            pathEffect,
-            alpha,
-            colorFilter,
-            blendMode
+    ) =
+        drawParams.canvas.drawLine(
+            start,
+            end,
+            configureStrokePaint(
+                brush,
+                strokeWidth,
+                Stroke.DefaultMiter,
+                cap,
+                StrokeJoin.Miter,
+                pathEffect,
+                alpha,
+                colorFilter,
+                blendMode
+            )
         )
-    )
 
-    /**
-     * @see [DrawScope.drawLine]
-     */
+    /** @see [DrawScope.drawLine] */
     override fun drawLine(
         color: Color,
         start: Offset,
@@ -141,25 +146,24 @@
         @FloatRange(from = 0.0, to = 1.0) alpha: Float,
         colorFilter: ColorFilter?,
         blendMode: BlendMode
-    ) = drawParams.canvas.drawLine(
-        start,
-        end,
-        configureStrokePaint(
-            color,
-            strokeWidth,
-            Stroke.DefaultMiter,
-            cap,
-            StrokeJoin.Miter,
-            pathEffect,
-            alpha,
-            colorFilter,
-            blendMode
+    ) =
+        drawParams.canvas.drawLine(
+            start,
+            end,
+            configureStrokePaint(
+                color,
+                strokeWidth,
+                Stroke.DefaultMiter,
+                cap,
+                StrokeJoin.Miter,
+                pathEffect,
+                alpha,
+                colorFilter,
+                blendMode
+            )
         )
-    )
 
-    /**
-     * @see [DrawScope.drawRect]
-     */
+    /** @see [DrawScope.drawRect] */
     override fun drawRect(
         brush: Brush,
         topLeft: Offset,
@@ -168,17 +172,16 @@
         style: DrawStyle,
         colorFilter: ColorFilter?,
         blendMode: BlendMode
-    ) = drawParams.canvas.drawRect(
-        left = topLeft.x,
-        top = topLeft.y,
-        right = topLeft.x + size.width,
-        bottom = topLeft.y + size.height,
-        paint = configurePaint(brush, style, alpha, colorFilter, blendMode)
-    )
+    ) =
+        drawParams.canvas.drawRect(
+            left = topLeft.x,
+            top = topLeft.y,
+            right = topLeft.x + size.width,
+            bottom = topLeft.y + size.height,
+            paint = configurePaint(brush, style, alpha, colorFilter, blendMode)
+        )
 
-    /**
-     * @see [DrawScope.drawRect]
-     */
+    /** @see [DrawScope.drawRect] */
     override fun drawRect(
         color: Color,
         topLeft: Offset,
@@ -187,17 +190,16 @@
         style: DrawStyle,
         colorFilter: ColorFilter?,
         blendMode: BlendMode
-    ) = drawParams.canvas.drawRect(
-        left = topLeft.x,
-        top = topLeft.y,
-        right = topLeft.x + size.width,
-        bottom = topLeft.y + size.height,
-        paint = configurePaint(color, style, alpha, colorFilter, blendMode)
-    )
+    ) =
+        drawParams.canvas.drawRect(
+            left = topLeft.x,
+            top = topLeft.y,
+            right = topLeft.x + size.width,
+            bottom = topLeft.y + size.height,
+            paint = configurePaint(color, style, alpha, colorFilter, blendMode)
+        )
 
-    /**
-     * @see [DrawScope.drawImage]
-     */
+    /** @see [DrawScope.drawImage] */
     override fun drawImage(
         image: ImageBitmap,
         topLeft: Offset,
@@ -205,23 +207,23 @@
         style: DrawStyle,
         colorFilter: ColorFilter?,
         blendMode: BlendMode
-    ) = drawParams.canvas.drawImage(
-        image,
-        topLeft,
-        configurePaint(null, style, alpha, colorFilter, blendMode)
-    )
+    ) =
+        drawParams.canvas.drawImage(
+            image,
+            topLeft,
+            configurePaint(null, style, alpha, colorFilter, blendMode)
+        )
 
-    /**
-     * @see [DrawScope.drawImage]
-     */
+    /** @see [DrawScope.drawImage] */
     @Deprecated(
         "Prefer usage of drawImage that consumes an optional FilterQuality parameter",
-        replaceWith = ReplaceWith(
-            "drawImage(image, srcOffset, srcSize, dstOffset, dstSize, alpha, style," +
-                " colorFilter, blendMode, FilterQuality.Low)",
-            "androidx.compose.ui.graphics.drawscope",
-            "androidx.compose.ui.graphics.FilterQuality"
-        ),
+        replaceWith =
+            ReplaceWith(
+                "drawImage(image, srcOffset, srcSize, dstOffset, dstSize, alpha, style," +
+                    " colorFilter, blendMode, FilterQuality.Low)",
+                "androidx.compose.ui.graphics.drawscope",
+                "androidx.compose.ui.graphics.FilterQuality"
+            ),
         level = DeprecationLevel.HIDDEN
     )
     override fun drawImage(
@@ -234,18 +236,17 @@
         style: DrawStyle,
         colorFilter: ColorFilter?,
         blendMode: BlendMode
-    ) = drawParams.canvas.drawImageRect(
-        image,
-        srcOffset,
-        srcSize,
-        dstOffset,
-        dstSize,
-        configurePaint(null, style, alpha, colorFilter, blendMode)
-    )
+    ) =
+        drawParams.canvas.drawImageRect(
+            image,
+            srcOffset,
+            srcSize,
+            dstOffset,
+            dstSize,
+            configurePaint(null, style, alpha, colorFilter, blendMode)
+        )
 
-    /**
-     * @see [DrawScope.drawImage]
-     */
+    /** @see [DrawScope.drawImage] */
     override fun drawImage(
         image: ImageBitmap,
         srcOffset: IntOffset,
@@ -257,18 +258,17 @@
         colorFilter: ColorFilter?,
         blendMode: BlendMode,
         filterQuality: FilterQuality
-    ) = drawParams.canvas.drawImageRect(
-        image,
-        srcOffset,
-        srcSize,
-        dstOffset,
-        dstSize,
-        configurePaint(null, style, alpha, colorFilter, blendMode, filterQuality)
-    )
+    ) =
+        drawParams.canvas.drawImageRect(
+            image,
+            srcOffset,
+            srcSize,
+            dstOffset,
+            dstSize,
+            configurePaint(null, style, alpha, colorFilter, blendMode, filterQuality)
+        )
 
-    /**
-     * @see [DrawScope.drawRoundRect]
-     */
+    /** @see [DrawScope.drawRoundRect] */
     override fun drawRoundRect(
         brush: Brush,
         topLeft: Offset,
@@ -278,19 +278,18 @@
         style: DrawStyle,
         colorFilter: ColorFilter?,
         blendMode: BlendMode
-    ) = drawParams.canvas.drawRoundRect(
-        topLeft.x,
-        topLeft.y,
-        topLeft.x + size.width,
-        topLeft.y + size.height,
-        cornerRadius.x,
-        cornerRadius.y,
-        configurePaint(brush, style, alpha, colorFilter, blendMode)
-    )
+    ) =
+        drawParams.canvas.drawRoundRect(
+            topLeft.x,
+            topLeft.y,
+            topLeft.x + size.width,
+            topLeft.y + size.height,
+            cornerRadius.x,
+            cornerRadius.y,
+            configurePaint(brush, style, alpha, colorFilter, blendMode)
+        )
 
-    /**
-     * @see [DrawScope.drawRoundRect]
-     */
+    /** @see [DrawScope.drawRoundRect] */
     override fun drawRoundRect(
         color: Color,
         topLeft: Offset,
@@ -300,19 +299,18 @@
         @FloatRange(from = 0.0, to = 1.0) alpha: Float,
         colorFilter: ColorFilter?,
         blendMode: BlendMode
-    ) = drawParams.canvas.drawRoundRect(
-        topLeft.x,
-        topLeft.y,
-        topLeft.x + size.width,
-        topLeft.y + size.height,
-        cornerRadius.x,
-        cornerRadius.y,
-        configurePaint(color, style, alpha, colorFilter, blendMode)
-    )
+    ) =
+        drawParams.canvas.drawRoundRect(
+            topLeft.x,
+            topLeft.y,
+            topLeft.x + size.width,
+            topLeft.y + size.height,
+            cornerRadius.x,
+            cornerRadius.y,
+            configurePaint(color, style, alpha, colorFilter, blendMode)
+        )
 
-    /**
-     * @see [DrawScope.drawCircle]
-     */
+    /** @see [DrawScope.drawCircle] */
     override fun drawCircle(
         brush: Brush,
         radius: Float,
@@ -321,15 +319,14 @@
         style: DrawStyle,
         colorFilter: ColorFilter?,
         blendMode: BlendMode
-    ) = drawParams.canvas.drawCircle(
-        center,
-        radius,
-        configurePaint(brush, style, alpha, colorFilter, blendMode)
-    )
+    ) =
+        drawParams.canvas.drawCircle(
+            center,
+            radius,
+            configurePaint(brush, style, alpha, colorFilter, blendMode)
+        )
 
-    /**
-     * @see [DrawScope.drawCircle]
-     */
+    /** @see [DrawScope.drawCircle] */
     override fun drawCircle(
         color: Color,
         radius: Float,
@@ -338,15 +335,14 @@
         style: DrawStyle,
         colorFilter: ColorFilter?,
         blendMode: BlendMode
-    ) = drawParams.canvas.drawCircle(
-        center,
-        radius,
-        configurePaint(color, style, alpha, colorFilter, blendMode)
-    )
+    ) =
+        drawParams.canvas.drawCircle(
+            center,
+            radius,
+            configurePaint(color, style, alpha, colorFilter, blendMode)
+        )
 
-    /**
-     * @see [DrawScope.drawOval]
-     */
+    /** @see [DrawScope.drawOval] */
     override fun drawOval(
         brush: Brush,
         topLeft: Offset,
@@ -355,17 +351,16 @@
         style: DrawStyle,
         colorFilter: ColorFilter?,
         blendMode: BlendMode
-    ) = drawParams.canvas.drawOval(
-        left = topLeft.x,
-        top = topLeft.y,
-        right = topLeft.x + size.width,
-        bottom = topLeft.y + size.height,
-        paint = configurePaint(brush, style, alpha, colorFilter, blendMode)
-    )
+    ) =
+        drawParams.canvas.drawOval(
+            left = topLeft.x,
+            top = topLeft.y,
+            right = topLeft.x + size.width,
+            bottom = topLeft.y + size.height,
+            paint = configurePaint(brush, style, alpha, colorFilter, blendMode)
+        )
 
-    /**
-     * @see [DrawScope.drawOval]
-     */
+    /** @see [DrawScope.drawOval] */
     override fun drawOval(
         color: Color,
         topLeft: Offset,
@@ -374,17 +369,16 @@
         style: DrawStyle,
         colorFilter: ColorFilter?,
         blendMode: BlendMode
-    ) = drawParams.canvas.drawOval(
-        left = topLeft.x,
-        top = topLeft.y,
-        right = topLeft.x + size.width,
-        bottom = topLeft.y + size.height,
-        paint = configurePaint(color, style, alpha, colorFilter, blendMode)
-    )
+    ) =
+        drawParams.canvas.drawOval(
+            left = topLeft.x,
+            top = topLeft.y,
+            right = topLeft.x + size.width,
+            bottom = topLeft.y + size.height,
+            paint = configurePaint(color, style, alpha, colorFilter, blendMode)
+        )
 
-    /**
-     * @see [DrawScope.drawArc]
-     */
+    /** @see [DrawScope.drawArc] */
     override fun drawArc(
         brush: Brush,
         startAngle: Float,
@@ -396,20 +390,19 @@
         style: DrawStyle,
         colorFilter: ColorFilter?,
         blendMode: BlendMode
-    ) = drawParams.canvas.drawArc(
-        left = topLeft.x,
-        top = topLeft.y,
-        right = topLeft.x + size.width,
-        bottom = topLeft.y + size.height,
-        startAngle = startAngle,
-        sweepAngle = sweepAngle,
-        useCenter = useCenter,
-        paint = configurePaint(brush, style, alpha, colorFilter, blendMode)
-    )
+    ) =
+        drawParams.canvas.drawArc(
+            left = topLeft.x,
+            top = topLeft.y,
+            right = topLeft.x + size.width,
+            bottom = topLeft.y + size.height,
+            startAngle = startAngle,
+            sweepAngle = sweepAngle,
+            useCenter = useCenter,
+            paint = configurePaint(brush, style, alpha, colorFilter, blendMode)
+        )
 
-    /**
-     * @see [DrawScope.drawArc]
-     */
+    /** @see [DrawScope.drawArc] */
     override fun drawArc(
         color: Color,
         startAngle: Float,
@@ -421,20 +414,19 @@
         style: DrawStyle,
         colorFilter: ColorFilter?,
         blendMode: BlendMode
-    ) = drawParams.canvas.drawArc(
-        left = topLeft.x,
-        top = topLeft.y,
-        right = topLeft.x + size.width,
-        bottom = topLeft.y + size.height,
-        startAngle = startAngle,
-        sweepAngle = sweepAngle,
-        useCenter = useCenter,
-        paint = configurePaint(color, style, alpha, colorFilter, blendMode)
-    )
+    ) =
+        drawParams.canvas.drawArc(
+            left = topLeft.x,
+            top = topLeft.y,
+            right = topLeft.x + size.width,
+            bottom = topLeft.y + size.height,
+            startAngle = startAngle,
+            sweepAngle = sweepAngle,
+            useCenter = useCenter,
+            paint = configurePaint(color, style, alpha, colorFilter, blendMode)
+        )
 
-    /**
-     * @see [DrawScope.drawPath]
-     */
+    /** @see [DrawScope.drawPath] */
     override fun drawPath(
         path: Path,
         color: Color,
@@ -442,14 +434,13 @@
         style: DrawStyle,
         colorFilter: ColorFilter?,
         blendMode: BlendMode
-    ) = drawParams.canvas.drawPath(
-        path,
-        configurePaint(color, style, alpha, colorFilter, blendMode)
-    )
+    ) =
+        drawParams.canvas.drawPath(
+            path,
+            configurePaint(color, style, alpha, colorFilter, blendMode)
+        )
 
-    /**
-     * @see [DrawScope.drawPath]
-     */
+    /** @see [DrawScope.drawPath] */
     override fun drawPath(
         path: Path,
         brush: Brush,
@@ -457,14 +448,13 @@
         style: DrawStyle,
         colorFilter: ColorFilter?,
         blendMode: BlendMode
-    ) = drawParams.canvas.drawPath(
-        path,
-        configurePaint(brush, style, alpha, colorFilter, blendMode)
-    )
+    ) =
+        drawParams.canvas.drawPath(
+            path,
+            configurePaint(brush, style, alpha, colorFilter, blendMode)
+        )
 
-    /**
-     * @see [DrawScope.drawPoints]
-     */
+    /** @see [DrawScope.drawPoints] */
     override fun drawPoints(
         points: List<Offset>,
         pointMode: PointMode,
@@ -475,25 +465,24 @@
         @FloatRange(from = 0.0, to = 1.0) alpha: Float,
         colorFilter: ColorFilter?,
         blendMode: BlendMode
-    ) = drawParams.canvas.drawPoints(
-        pointMode,
-        points,
-        configureStrokePaint(
-            color,
-            strokeWidth,
-            Stroke.DefaultMiter,
-            cap,
-            StrokeJoin.Miter,
-            pathEffect,
-            alpha,
-            colorFilter,
-            blendMode
+    ) =
+        drawParams.canvas.drawPoints(
+            pointMode,
+            points,
+            configureStrokePaint(
+                color,
+                strokeWidth,
+                Stroke.DefaultMiter,
+                cap,
+                StrokeJoin.Miter,
+                pathEffect,
+                alpha,
+                colorFilter,
+                blendMode
+            )
         )
-    )
 
-    /**
-     * @see [DrawScope.drawPoints]
-     */
+    /** @see [DrawScope.drawPoints] */
     override fun drawPoints(
         points: List<Offset>,
         pointMode: PointMode,
@@ -504,32 +493,33 @@
         @FloatRange(from = 0.0, to = 1.0) alpha: Float,
         colorFilter: ColorFilter?,
         blendMode: BlendMode
-    ) = drawParams.canvas.drawPoints(
-        pointMode,
-        points,
-        configureStrokePaint(
-            brush,
-            strokeWidth,
-            Stroke.DefaultMiter,
-            cap,
-            StrokeJoin.Miter,
-            pathEffect,
-            alpha,
-            colorFilter,
-            blendMode
+    ) =
+        drawParams.canvas.drawPoints(
+            pointMode,
+            points,
+            configureStrokePaint(
+                brush,
+                strokeWidth,
+                Stroke.DefaultMiter,
+                cap,
+                StrokeJoin.Miter,
+                pathEffect,
+                alpha,
+                colorFilter,
+                blendMode
+            )
         )
-    )
 
     /**
      * Draws into the provided [Canvas] with the commands specified in the lambda with this
      * [DrawScope] as a receiver
      *
      * @param density [Density] used to assist in conversions of density independent pixels to raw
-     * pixels to draw
+     *   pixels to draw
      * @param layoutDirection [LayoutDirection] of the layout being drawn in.
      * @param canvas target canvas to render into
-     * @param size bounds relative to the current canvas translation in which the [DrawScope]
-     * should draw within
+     * @param size bounds relative to the current canvas translation in which the [DrawScope] should
+     *   draw within
      * @param block lambda that is called to issue drawing commands on this [DrawScope]
      */
     inline fun draw(
@@ -562,51 +552,45 @@
     }
 
     /**
-     * Internal published APIs used to support inline scoped extension methods
-     * on DrawScope directly, without exposing the underlying stateful APIs
-     * to conduct the transformations themselves as inline methods require
-     * all methods called within them to be public
+     * Internal published APIs used to support inline scoped extension methods on DrawScope
+     * directly, without exposing the underlying stateful APIs to conduct the transformations
+     * themselves as inline methods require all methods called within them to be public
      */
 
     /**
-     * Helper method to instantiate the paint object on first usage otherwise
-     * return the previously allocated Paint used for drawing filled regions
+     * Helper method to instantiate the paint object on first usage otherwise return the previously
+     * allocated Paint used for drawing filled regions
      */
     private fun obtainFillPaint(): Paint =
-        fillPaint ?: Paint().apply { style = PaintingStyle.Fill }.also {
-            fillPaint = it
-        }
+        fillPaint ?: Paint().apply { style = PaintingStyle.Fill }.also { fillPaint = it }
 
     /**
-     * Helper method to instantiate the paint object on first usage otherwise
-     * return the previously allocated Paint used for drawing strokes
+     * Helper method to instantiate the paint object on first usage otherwise return the previously
+     * allocated Paint used for drawing strokes
      */
     private fun obtainStrokePaint(): Paint =
-        strokePaint ?: Paint().apply { style = PaintingStyle.Stroke }.also {
-            strokePaint = it
-        }
+        strokePaint ?: Paint().apply { style = PaintingStyle.Stroke }.also { strokePaint = it }
 
     /**
-     * Selects the appropriate [Paint] object based on the style
-     * and applies the underlying [DrawStyle] parameters
+     * Selects the appropriate [Paint] object based on the style and applies the underlying
+     * [DrawStyle] parameters
      */
     private fun selectPaint(drawStyle: DrawStyle): Paint =
         when (drawStyle) {
             Fill -> obtainFillPaint()
             is Stroke ->
-                obtainStrokePaint()
-                    .apply {
-                        if (strokeWidth != drawStyle.width) strokeWidth = drawStyle.width
-                        if (strokeCap != drawStyle.cap) strokeCap = drawStyle.cap
-                        if (strokeMiterLimit != drawStyle.miter) strokeMiterLimit = drawStyle.miter
-                        if (strokeJoin != drawStyle.join) strokeJoin = drawStyle.join
-                        if (pathEffect != drawStyle.pathEffect) pathEffect = drawStyle.pathEffect
-                    }
+                obtainStrokePaint().apply {
+                    if (strokeWidth != drawStyle.width) strokeWidth = drawStyle.width
+                    if (strokeCap != drawStyle.cap) strokeCap = drawStyle.cap
+                    if (strokeMiterLimit != drawStyle.miter) strokeMiterLimit = drawStyle.miter
+                    if (strokeJoin != drawStyle.join) strokeJoin = drawStyle.join
+                    if (pathEffect != drawStyle.pathEffect) pathEffect = drawStyle.pathEffect
+                }
         }
 
     /**
-     * Helper method to configure the corresponding [Brush] along with other properties
-     * on the corresponding paint specified by [DrawStyle]
+     * Helper method to configure the corresponding [Brush] along with other properties on the
+     * corresponding paint specified by [DrawStyle]
      */
     private fun configurePaint(
         brush: Brush?,
@@ -615,22 +599,23 @@
         colorFilter: ColorFilter?,
         blendMode: BlendMode,
         filterQuality: FilterQuality = DefaultFilterQuality
-    ): Paint = selectPaint(style).apply {
-        if (brush != null) {
-            brush.applyTo(size, this, alpha)
-        } else {
-            if (this.shader != null) this.shader = null
-            if (this.color != Color.Black) this.color = Color.Black
-            if (this.alpha != alpha) this.alpha = alpha
+    ): Paint =
+        selectPaint(style).apply {
+            if (brush != null) {
+                brush.applyTo(size, this, alpha)
+            } else {
+                if (this.shader != null) this.shader = null
+                if (this.color != Color.Black) this.color = Color.Black
+                if (this.alpha != alpha) this.alpha = alpha
+            }
+            if (this.colorFilter != colorFilter) this.colorFilter = colorFilter
+            if (this.blendMode != blendMode) this.blendMode = blendMode
+            if (this.filterQuality != filterQuality) this.filterQuality = filterQuality
         }
-        if (this.colorFilter != colorFilter) this.colorFilter = colorFilter
-        if (this.blendMode != blendMode) this.blendMode = blendMode
-        if (this.filterQuality != filterQuality) this.filterQuality = filterQuality
-    }
 
     /**
-     * Helper method to configure the corresponding [Color] along with other properties
-     * on the corresponding paint specified by [DrawStyle]
+     * Helper method to configure the corresponding [Color] along with other properties on the
+     * corresponding paint specified by [DrawStyle]
      */
     private fun configurePaint(
         color: Color,
@@ -639,16 +624,17 @@
         colorFilter: ColorFilter?,
         blendMode: BlendMode,
         filterQuality: FilterQuality = DefaultFilterQuality
-    ): Paint = selectPaint(style).apply {
-        // Modulate the color alpha directly
-        // instead of configuring a separate alpha parameter
-        val targetColor = color.modulate(alpha)
-        if (this.color != targetColor) this.color = targetColor
-        if (this.shader != null) this.shader = null
-        if (this.colorFilter != colorFilter) this.colorFilter = colorFilter
-        if (this.blendMode != blendMode) this.blendMode = blendMode
-        if (this.filterQuality != filterQuality) this.filterQuality = filterQuality
-    }
+    ): Paint =
+        selectPaint(style).apply {
+            // Modulate the color alpha directly
+            // instead of configuring a separate alpha parameter
+            val targetColor = color.modulate(alpha)
+            if (this.color != targetColor) this.color = targetColor
+            if (this.shader != null) this.shader = null
+            if (this.colorFilter != colorFilter) this.colorFilter = colorFilter
+            if (this.blendMode != blendMode) this.blendMode = blendMode
+            if (this.filterQuality != filterQuality) this.filterQuality = filterQuality
+        }
 
     private fun configureStrokePaint(
         color: Color,
@@ -689,25 +675,24 @@
         colorFilter: ColorFilter?,
         blendMode: BlendMode,
         filterQuality: FilterQuality = DefaultFilterQuality
-    ) = obtainStrokePaint().apply {
-        if (brush != null) {
-            brush.applyTo(size, this, alpha)
-        } else if (this.alpha != alpha) {
-            this.alpha = alpha
+    ) =
+        obtainStrokePaint().apply {
+            if (brush != null) {
+                brush.applyTo(size, this, alpha)
+            } else if (this.alpha != alpha) {
+                this.alpha = alpha
+            }
+            if (this.colorFilter != colorFilter) this.colorFilter = colorFilter
+            if (this.blendMode != blendMode) this.blendMode = blendMode
+            if (this.strokeWidth != strokeWidth) this.strokeWidth = strokeWidth
+            if (this.strokeMiterLimit != miter) this.strokeMiterLimit = miter
+            if (this.strokeCap != cap) this.strokeCap = cap
+            if (this.strokeJoin != join) this.strokeJoin = join
+            if (this.pathEffect != pathEffect) this.pathEffect = pathEffect
+            if (this.filterQuality != filterQuality) this.filterQuality = filterQuality
         }
-        if (this.colorFilter != colorFilter) this.colorFilter = colorFilter
-        if (this.blendMode != blendMode) this.blendMode = blendMode
-        if (this.strokeWidth != strokeWidth) this.strokeWidth = strokeWidth
-        if (this.strokeMiterLimit != miter) this.strokeMiterLimit = miter
-        if (this.strokeCap != cap) this.strokeCap = cap
-        if (this.strokeJoin != join) this.strokeJoin = join
-        if (this.pathEffect != pathEffect) this.pathEffect = pathEffect
-        if (this.filterQuality != filterQuality) this.filterQuality = filterQuality
-    }
 
-    /**
-     * Returns a [Color] modulated with the given alpha value
-     */
+    /** Returns a [Color] modulated with the given alpha value */
     private fun Color.modulate(alpha: Float): Color =
         if (alpha != 1.0f) {
             copy(alpha = this.alpha * alpha)
@@ -716,12 +701,12 @@
         }
 
     /**
-     * Internal parameters to represent the current CanvasDrawScope
-     * used to reduce the size of the inline draw call to avoid
-     * bloat of additional assignment calls for each parameter
+     * Internal parameters to represent the current CanvasDrawScope used to reduce the size of the
+     * inline draw call to avoid bloat of additional assignment calls for each parameter
      * individually
      */
-    @PublishedApi internal data class DrawParams(
+    @PublishedApi
+    internal data class DrawParams(
         var density: Density = DefaultDensity,
         var layoutDirection: LayoutDirection = LayoutDirection.Ltr,
         var canvas: Canvas = EmptyCanvas(),
@@ -729,62 +714,61 @@
     )
 }
 
-/**
- * Convenience method for creating a [DrawTransform] from the current [DrawContext]
- */
-private fun DrawContext.asDrawTransform(): DrawTransform = object : DrawTransform {
-    override val size: Size
-        get() = this@asDrawTransform.size
+/** Convenience method for creating a [DrawTransform] from the current [DrawContext] */
+private fun DrawContext.asDrawTransform(): DrawTransform =
+    object : DrawTransform {
+        override val size: Size
+            get() = this@asDrawTransform.size
 
-    override val center: Offset
-        get() = size.center
+        override val center: Offset
+            get() = size.center
 
-    override fun inset(left: Float, top: Float, right: Float, bottom: Float) {
-        this@asDrawTransform.canvas.let {
-            val updatedSize = Size(size.width - (left + right), size.height - (top + bottom))
-            requirePrecondition(updatedSize.width >= 0 && updatedSize.height >= 0) {
-                "Width and height must be greater than or equal to zero"
+        override fun inset(left: Float, top: Float, right: Float, bottom: Float) {
+            this@asDrawTransform.canvas.let {
+                val updatedSize = Size(size.width - (left + right), size.height - (top + bottom))
+                requirePrecondition(updatedSize.width >= 0 && updatedSize.height >= 0) {
+                    "Width and height must be greater than or equal to zero"
+                }
+                this@asDrawTransform.size = updatedSize
+                it.translate(left, top)
             }
-            this@asDrawTransform.size = updatedSize
-            it.translate(left, top)
+        }
+
+        override fun clipRect(
+            left: Float,
+            top: Float,
+            right: Float,
+            bottom: Float,
+            clipOp: ClipOp
+        ) {
+            this@asDrawTransform.canvas.clipRect(left, top, right, bottom, clipOp)
+        }
+
+        override fun clipPath(path: Path, clipOp: ClipOp) {
+            this@asDrawTransform.canvas.clipPath(path, clipOp)
+        }
+
+        override fun translate(left: Float, top: Float) {
+            this@asDrawTransform.canvas.translate(left, top)
+        }
+
+        override fun rotate(degrees: Float, pivot: Offset) {
+            this@asDrawTransform.canvas.apply {
+                translate(pivot.x, pivot.y)
+                rotate(degrees)
+                translate(-pivot.x, -pivot.y)
+            }
+        }
+
+        override fun scale(scaleX: Float, scaleY: Float, pivot: Offset) {
+            this@asDrawTransform.canvas.apply {
+                translate(pivot.x, pivot.y)
+                scale(scaleX, scaleY)
+                translate(-pivot.x, -pivot.y)
+            }
+        }
+
+        override fun transform(matrix: Matrix) {
+            this@asDrawTransform.canvas.concat(matrix)
         }
     }
-
-    override fun clipRect(
-        left: Float,
-        top: Float,
-        right: Float,
-        bottom: Float,
-        clipOp: ClipOp
-    ) {
-        this@asDrawTransform.canvas.clipRect(left, top, right, bottom, clipOp)
-    }
-
-    override fun clipPath(path: Path, clipOp: ClipOp) {
-        this@asDrawTransform.canvas.clipPath(path, clipOp)
-    }
-
-    override fun translate(left: Float, top: Float) {
-        this@asDrawTransform.canvas.translate(left, top)
-    }
-
-    override fun rotate(degrees: Float, pivot: Offset) {
-        this@asDrawTransform.canvas.apply {
-            translate(pivot.x, pivot.y)
-            rotate(degrees)
-            translate(-pivot.x, -pivot.y)
-        }
-    }
-
-    override fun scale(scaleX: Float, scaleY: Float, pivot: Offset) {
-        this@asDrawTransform.canvas.apply {
-            translate(pivot.x, pivot.y)
-            scale(scaleX, scaleY)
-            translate(-pivot.x, -pivot.y)
-        }
-    }
-
-    override fun transform(matrix: Matrix) {
-        this@asDrawTransform.canvas.concat(matrix)
-    }
-}
diff --git a/compose/ui/ui-graphics/src/commonMain/kotlin/androidx/compose/ui/graphics/drawscope/ContentDrawScope.kt b/compose/ui/ui-graphics/src/commonMain/kotlin/androidx/compose/ui/graphics/drawscope/ContentDrawScope.kt
index 74438cc..fd70052 100644
--- a/compose/ui/ui-graphics/src/commonMain/kotlin/androidx/compose/ui/graphics/drawscope/ContentDrawScope.kt
+++ b/compose/ui/ui-graphics/src/commonMain/kotlin/androidx/compose/ui/graphics/drawscope/ContentDrawScope.kt
@@ -18,14 +18,11 @@
 import androidx.compose.ui.graphics.internal.JvmDefaultWithCompatibility
 
 /**
- * Receiver scope for drawing content into a layout, where the content can
- * be drawn between other canvas operations. If [drawContent] is not called,
- * the contents of the layout will not be drawn.
+ * Receiver scope for drawing content into a layout, where the content can be drawn between other
+ * canvas operations. If [drawContent] is not called, the contents of the layout will not be drawn.
  */
 @JvmDefaultWithCompatibility
 interface ContentDrawScope : DrawScope {
-    /**
-     * Causes child drawing operations to run during the `onPaint` lambda.
-     */
+    /** Causes child drawing operations to run during the `onPaint` lambda. */
     fun drawContent()
 }
diff --git a/compose/ui/ui-graphics/src/commonMain/kotlin/androidx/compose/ui/graphics/drawscope/DrawContext.kt b/compose/ui/ui-graphics/src/commonMain/kotlin/androidx/compose/ui/graphics/drawscope/DrawContext.kt
index 39b9f10..28dccc7 100644
--- a/compose/ui/ui-graphics/src/commonMain/kotlin/androidx/compose/ui/graphics/drawscope/DrawContext.kt
+++ b/compose/ui/ui-graphics/src/commonMain/kotlin/androidx/compose/ui/graphics/drawscope/DrawContext.kt
@@ -23,46 +23,37 @@
 import androidx.compose.ui.unit.LayoutDirection
 
 /**
- * Default density value that is used as a stub to provide a non-null
- * density parameter within CanvasDrawScope.
- * Density is provided as a parameter as part of the draw call to
- * issue drawing commands into a target canvas so this Density value is never consumed
+ * Default density value that is used as a stub to provide a non-null density parameter within
+ * CanvasDrawScope. Density is provided as a parameter as part of the draw call to issue drawing
+ * commands into a target canvas so this Density value is never consumed
  */
 internal val DefaultDensity = Density(1.0f, 1.0f)
 
 /**
- * Object that provides the dependencies to support a [DrawScope] drawing environment.
- * Namely this provides the drawing bounds represented as a size as well as the target
- * [Canvas] to issue drawing commands into. Additionally the [DrawContext] handles
- * updating [Canvas] state during transformations and updating the size of the drawing
- * bounds that may occur during these transformations.
+ * Object that provides the dependencies to support a [DrawScope] drawing environment. Namely this
+ * provides the drawing bounds represented as a size as well as the target [Canvas] to issue drawing
+ * commands into. Additionally the [DrawContext] handles updating [Canvas] state during
+ * transformations and updating the size of the drawing bounds that may occur during these
+ * transformations.
  *
- * This exposes necessary internal state to the implementation of the [DrawScope] in order
- * to support inline scoped transformation calls without allowing consumers of [DrawScope]
- * to modify state directly thus maintaining the stateless API surface
+ * This exposes necessary internal state to the implementation of the [DrawScope] in order to
+ * support inline scoped transformation calls without allowing consumers of [DrawScope] to modify
+ * state directly thus maintaining the stateless API surface
  */
 interface DrawContext {
 
-    /**
-     * The current size of the drawing environment
-     */
+    /** The current size of the drawing environment */
     var size: Size
 
-    /**
-     * The target canvas to issue drawing commands
-     */
+    /** The target canvas to issue drawing commands */
     var canvas: Canvas
         get() = EmptyCanvas()
         set(_) {}
 
-    /**
-     * The controller for issuing transformations to the drawing environment
-     */
+    /** The controller for issuing transformations to the drawing environment */
     val transform: DrawTransform
 
-    /**
-     * [LayoutDirection] of the layout being drawn in.
-    */
+    /** [LayoutDirection] of the layout being drawn in. */
     var layoutDirection: LayoutDirection
         get() = LayoutDirection.Ltr
         set(_) {}
@@ -75,8 +66,8 @@
         set(_) {}
 
     /**
-     * Current [GraphicsLayer] we are drawing into. Might be null if the [canvas] is not provided
-     * by a [GraphicsLayer], for example in the case of a software-accelerated drawing.
+     * Current [GraphicsLayer] we are drawing into. Might be null if the [canvas] is not provided by
+     * a [GraphicsLayer], for example in the case of a software-accelerated drawing.
      */
     var graphicsLayer: GraphicsLayer?
         get() = null
diff --git a/compose/ui/ui-graphics/src/commonMain/kotlin/androidx/compose/ui/graphics/drawscope/DrawScope.kt b/compose/ui/ui-graphics/src/commonMain/kotlin/androidx/compose/ui/graphics/drawscope/DrawScope.kt
index 5be8224..88eaa0a 100644
--- a/compose/ui/ui-graphics/src/commonMain/kotlin/androidx/compose/ui/graphics/drawscope/DrawScope.kt
+++ b/compose/ui/ui-graphics/src/commonMain/kotlin/androidx/compose/ui/graphics/drawscope/DrawScope.kt
@@ -46,11 +46,11 @@
 
 /**
  * Simultaneously translate the [DrawScope] coordinate space by [left] and [top] as well as modify
- * the dimensions of the current painting area. This provides a callback to issue more
- * drawing instructions within the modified coordinate space. This method
- * modifies the width of the [DrawScope] to be equivalent to width - (left + right) as well as
- * height to height - (top + bottom). After this method is invoked, the coordinate space is
- * returned to the state before the inset was applied.
+ * the dimensions of the current painting area. This provides a callback to issue more drawing
+ * instructions within the modified coordinate space. This method modifies the width of the
+ * [DrawScope] to be equivalent to width - (left + right) as well as height to height - (top +
+ * bottom). After this method is invoked, the coordinate space is returned to the state before the
+ * inset was applied.
  *
  * @param left number of pixels to inset the left drawing bound
  * @param top number of pixels to inset the top drawing bound
@@ -74,18 +74,15 @@
 }
 
 /**
- * Convenience method modifies the [DrawScope] bounds to inset both left, top, right and
- * bottom bounds by [inset]. After this method is invoked,
- * the coordinate space is returned to the state before this inset was applied.
+ * Convenience method modifies the [DrawScope] bounds to inset both left, top, right and bottom
+ * bounds by [inset]. After this method is invoked, the coordinate space is returned to the state
+ * before this inset was applied.
  *
  * @param inset number of pixels to inset left, top, right, and bottom bounds.
  * @param block lambda that is called to issue additional drawing commands within the modified
- * coordinate space
+ *   coordinate space
  */
-inline fun DrawScope.inset(
-    inset: Float,
-    block: DrawScope.() -> Unit
-) {
+inline fun DrawScope.inset(inset: Float, block: DrawScope.() -> Unit) {
     drawContext.transform.inset(inset, inset, inset, inset)
     try {
         block()
@@ -96,14 +93,13 @@
 
 /**
  * Convenience method modifies the [DrawScope] bounds to inset both left and right bounds by
- * [horizontal] as well as the top and bottom by [vertical]. After this method is invoked,
- * the coordinate space is returned to the state before this inset was applied.
+ * [horizontal] as well as the top and bottom by [vertical]. After this method is invoked, the
+ * coordinate space is returned to the state before this inset was applied.
  *
  * @param horizontal number of pixels to inset both left and right bounds. Zero by default
- * @param vertical Optional number of pixels to inset both top and bottom bounds. Zero by
- * default
+ * @param vertical Optional number of pixels to inset both top and bottom bounds. Zero by default
  * @param block lambda that is called to issue additional drawing commands within the modified
- * coordinate space
+ *   coordinate space
  */
 inline fun DrawScope.inset(
     horizontal: Float = 0.0f,
@@ -117,14 +113,10 @@
  *
  * @param left Pixels to translate the coordinate space in the x-axis
  * @param top Pixels to translate the coordinate space in the y-axis
- * @param block lambda that is called to issue drawing commands within the
- * translated coordinate space
+ * @param block lambda that is called to issue drawing commands within the translated coordinate
+ *   space
  */
-inline fun DrawScope.translate(
-    left: Float = 0.0f,
-    top: Float = 0.0f,
-    block: DrawScope.() -> Unit
-) {
+inline fun DrawScope.translate(left: Float = 0.0f, top: Float = 0.0f, block: DrawScope.() -> Unit) {
     drawContext.transform.translate(left, top)
     try {
         block()
@@ -134,31 +126,24 @@
 }
 
 /**
- *  Add a rotation (in degrees clockwise) to the current transform at the given pivot point.
- *  The pivot coordinate remains unchanged by the rotation transformation. After the provided
- *  lambda is invoked, the rotation transformation is undone.
+ * Add a rotation (in degrees clockwise) to the current transform at the given pivot point. The
+ * pivot coordinate remains unchanged by the rotation transformation. After the provided lambda is
+ * invoked, the rotation transformation is undone.
  *
- *  @param degrees to rotate clockwise
- *  @param pivot The coordinate for the pivot point, defaults to the center of the
- *  coordinate space
- *  @param block lambda that is called to issue drawing commands within the rotated
- *  coordinate space
+ * @param degrees to rotate clockwise
+ * @param pivot The coordinate for the pivot point, defaults to the center of the coordinate space
+ * @param block lambda that is called to issue drawing commands within the rotated coordinate space
  */
-inline fun DrawScope.rotate(
-    degrees: Float,
-    pivot: Offset = center,
-    block: DrawScope.() -> Unit
-) = withTransform({ rotate(degrees, pivot) }, block)
+inline fun DrawScope.rotate(degrees: Float, pivot: Offset = center, block: DrawScope.() -> Unit) =
+    withTransform({ rotate(degrees, pivot) }, block)
 
 /**
- * Add a rotation (in radians clockwise) to the current transform at the given pivot point.
- * The pivot coordinate remains unchanged by the rotation transformation
+ * Add a rotation (in radians clockwise) to the current transform at the given pivot point. The
+ * pivot coordinate remains unchanged by the rotation transformation
  *
  * @param radians to rotate clockwise
- * @param pivot The coordinate for the pivot point, defaults to the center of the
- *  coordinate space
- * @param block lambda that is called to issue drawing commands within the rotated
- * coordinate space
+ * @param pivot The coordinate for the pivot point, defaults to the center of the coordinate space
+ * @param block lambda that is called to issue drawing commands within the rotated coordinate space
  */
 inline fun DrawScope.rotateRad(
     radians: Float,
@@ -169,16 +154,14 @@
 }
 
 /**
- * Add an axis-aligned scale to the current transform, scaling by the first
- * argument in the horizontal direction and the second in the vertical
- * direction at the given pivot coordinate. The pivot coordinate remains
- * unchanged by the scale transformation. After this method is invoked, the
+ * Add an axis-aligned scale to the current transform, scaling by the first argument in the
+ * horizontal direction and the second in the vertical direction at the given pivot coordinate. The
+ * pivot coordinate remains unchanged by the scale transformation. After this method is invoked, the
  * coordinate space is returned to the state before the scale was applied.
  *
  * @param scaleX The amount to scale in X
  * @param scaleY The amount to scale in Y
- * @param pivot The coordinate for the pivot point, defaults to the center of the
- * coordinate space
+ * @param pivot The coordinate for the pivot point, defaults to the center of the coordinate space
  * @param block lambda used to issue drawing commands within the scaled coordinate space
  */
 inline fun DrawScope.scale(
@@ -189,30 +172,24 @@
 ) = withTransform({ scale(scaleX, scaleY, pivot) }, block)
 
 /**
- * Add an axis-aligned scale to the current transform, scaling both the horizontal direction and
- * the vertical direction at the given pivot coordinate. The pivot coordinate remains
- * unchanged by the scale transformation. After this method is invoked, the
- * coordinate space is returned to the state before the scale was applied.
+ * Add an axis-aligned scale to the current transform, scaling both the horizontal direction and the
+ * vertical direction at the given pivot coordinate. The pivot coordinate remains unchanged by the
+ * scale transformation. After this method is invoked, the coordinate space is returned to the state
+ * before the scale was applied.
  *
  * @param scale The amount to scale uniformly in both directions
- * @param pivot The coordinate for the pivot point, defaults to the center of the
- * coordinate space
+ * @param pivot The coordinate for the pivot point, defaults to the center of the coordinate space
  * @param block lambda used to issue drawing commands within the scaled coordinate space
  */
-inline fun DrawScope.scale(
-    scale: Float,
-    pivot: Offset = center,
-    block: DrawScope.() -> Unit
-) = withTransform({ scale(scale, scale, pivot) }, block)
+inline fun DrawScope.scale(scale: Float, pivot: Offset = center, block: DrawScope.() -> Unit) =
+    withTransform({ scale(scale, scale, pivot) }, block)
 
 /**
- * Reduces the clip region to the intersection of the current clip and the
- * given rectangle indicated by the given left, top, right and bottom bounds. This provides
- * a callback to issue drawing commands within the clipped region. After this method is invoked,
- * this clip is no longer applied.
+ * Reduces the clip region to the intersection of the current clip and the given rectangle indicated
+ * by the given left, top, right and bottom bounds. This provides a callback to issue drawing
+ * commands within the clipped region. After this method is invoked, this clip is no longer applied.
  *
- * Use [ClipOp.Difference] to subtract the provided rectangle from the
- * current clip.
+ * Use [ClipOp.Difference] to subtract the provided rectangle from the current clip.
  *
  * @param left Left bound of the rectangle to clip
  * @param top Top bound of the rectangle to clip
@@ -220,7 +197,7 @@
  * @param bottom Bottom bound of the rectangle to clip
  * @param clipOp Clipping operation to conduct on the given bounds, defaults to [ClipOp.Intersect]
  * @param block Lambda callback with this CanvasScope as a receiver scope to issue drawing commands
- * within the provided clip
+ *   within the provided clip
  */
 inline fun DrawScope.clipRect(
     left: Float = 0.0f,
@@ -232,14 +209,14 @@
 ) = withTransform({ clipRect(left, top, right, bottom, clipOp) }, block)
 
 /**
- * Reduces the clip region to the intersection of the current clip and the
- * given path. This method provides a callback to issue drawing commands within the region
- * defined by the clipped path. After this method is invoked, this clip is no longer applied.
+ * Reduces the clip region to the intersection of the current clip and the given path. This method
+ * provides a callback to issue drawing commands within the region defined by the clipped path.
+ * After this method is invoked, this clip is no longer applied.
  *
  * @param path Shape to clip drawing content within
  * @param clipOp Clipping operation to conduct on the given bounds, defaults to [ClipOp.Intersect]
  * @param block Lambda callback with this CanvasScope as a receiver scope to issue drawing commands
- * within the provided clip
+ *   within the provided clip
  */
 inline fun DrawScope.clipPath(
     path: Path,
@@ -248,8 +225,8 @@
 ) = withTransform({ clipPath(path, clipOp) }, block)
 
 /**
- * Provides access to draw directly with the underlying [Canvas]. This is helpful for situations
- * to re-use alternative drawing logic in combination with [DrawScope]
+ * Provides access to draw directly with the underlying [Canvas]. This is helpful for situations to
+ * re-use alternative drawing logic in combination with [DrawScope]
  *
  * @param block Lambda callback to issue drawing commands on the provided [Canvas]
  */
@@ -262,27 +239,28 @@
  * @sample androidx.compose.ui.graphics.samples.DrawScopeBatchedTransformSample
  *
  * @param transformBlock Callback invoked to issue transformations to be made before the drawing
- * operations are issued
+ *   operations are issued
  * @param drawBlock Callback invoked to issue drawing operations after the transformations are
- * applied
+ *   applied
  */
 inline fun DrawScope.withTransform(
     transformBlock: DrawTransform.() -> Unit,
     drawBlock: DrawScope.() -> Unit
-) = with(drawContext) {
-    // Transformation can include inset calls which change the drawing area
-    // so cache the previous size before the transformation is done
-    // and reset it afterwards
-    val previousSize = size
-    canvas.save()
-    try {
-        transformBlock(transform)
-        drawBlock()
-    } finally {
-        canvas.restore()
-        size = previousSize
+) =
+    with(drawContext) {
+        // Transformation can include inset calls which change the drawing area
+        // so cache the previous size before the transformation is done
+        // and reset it afterwards
+        val previousSize = size
+        canvas.save()
+        try {
+            transformBlock(transform)
+            drawBlock()
+        } finally {
+            canvas.restore()
+            size = previousSize
+        }
     }
-}
 
 @Deprecated(
     message = "Please use a new overload accepting nullable GraphicsLayer",
@@ -299,19 +277,19 @@
 }
 
 /**
- * Draws into the provided [Canvas] with the commands specified in the lambda with this
- * [DrawScope] as a receiver
+ * Draws into the provided [Canvas] with the commands specified in the lambda with this [DrawScope]
+ * as a receiver
  *
  * @sample androidx.compose.ui.graphics.samples.DrawScopeRetargetingSample
  *
  * @param density [Density] used to assist in conversions of density independent pixels to raw
- * pixels to draw
+ *   pixels to draw
  * @param layoutDirection [LayoutDirection] of the layout being drawn in.
  * @param canvas target canvas to render into
- * @param size bounds relative to the current canvas translation in which the [DrawScope]
- * should draw within
+ * @param size bounds relative to the current canvas translation in which the [DrawScope] should
+ *   draw within
  * @param graphicsLayer Current [GraphicsLayer] we are drawing into. Might be null if the [canvas]
- * is not provided by a [GraphicsLayer], for example in the case of a software-accelerated drawing
+ *   is not provided by a [GraphicsLayer], for example in the case of a software-accelerated drawing
  * @param block lambda that is called to issue drawing commands on this [DrawScope]
  */
 inline fun DrawScope.draw(
@@ -354,14 +332,13 @@
 }
 
 /**
- * Creates a scoped drawing environment with the provided [Canvas]. This provides a
- * declarative, stateless API to draw shapes and paths without requiring
- * consumers to maintain underlying [Canvas] state information.
- * [DrawScope] implementations are also provided sizing information and transformations
- * are done relative to the local translation. That is left and top coordinates are always the
- * origin and the right and bottom coordinates are always the specified width and height
- * respectively. Drawing content is not clipped, so it is possible to draw outside of the
- * specified bounds.
+ * Creates a scoped drawing environment with the provided [Canvas]. This provides a declarative,
+ * stateless API to draw shapes and paths without requiring consumers to maintain underlying
+ * [Canvas] state information. [DrawScope] implementations are also provided sizing information and
+ * transformations are done relative to the local translation. That is left and top coordinates are
+ * always the origin and the right and bottom coordinates are always the specified width and height
+ * respectively. Drawing content is not clipped, so it is possible to draw outside of the specified
+ * bounds.
  *
  * @sample androidx.compose.ui.graphics.samples.DrawScopeSample
  */
@@ -370,31 +347,24 @@
 interface DrawScope : Density {
 
     /**
-     * The current [DrawContext] that contains the dependencies
-     * needed to create the drawing environment
+     * The current [DrawContext] that contains the dependencies needed to create the drawing
+     * environment
      */
     val drawContext: DrawContext
 
-    /**
-     * Center of the current bounds of the drawing environment
-     */
+    /** Center of the current bounds of the drawing environment */
     val center: Offset
         get() = drawContext.size.center
 
-    /**
-     * Provides the dimensions of the current drawing environment
-     */
+    /** Provides the dimensions of the current drawing environment */
     val size: Size
         get() = drawContext.size
 
-    /**
-     * The layout direction of the layout being drawn in.
-     */
+    /** The layout direction of the layout being drawn in. */
     val layoutDirection: LayoutDirection
 
     /**
-     * Draws a line between the given points using the given paint. The line is
-     * stroked.
+     * Draws a line between the given points using the given paint. The line is stroked.
      *
      * @param brush the color or fill to be applied to the line
      * @param start first point of the line to be drawn
@@ -402,8 +372,8 @@
      * @param strokeWidth stroke width to apply to the line
      * @param cap treatment applied to the ends of the line segment
      * @param pathEffect optional effect or pattern to apply to the line
-     * @param alpha opacity to be applied to the [brush] from 0.0f to 1.0f representing
-     * fully transparent to fully opaque respectively
+     * @param alpha opacity to be applied to the [brush] from 0.0f to 1.0f representing fully
+     *   transparent to fully opaque respectively
      * @param colorFilter ColorFilter to apply to the [brush] when drawn into the destination
      * @param blendMode the blending algorithm to apply to the [brush]
      */
@@ -420,8 +390,7 @@
     )
 
     /**
-     * Draws a line between the given points using the given paint. The line is
-     * stroked.
+     * Draws a line between the given points using the given paint. The line is stroked.
      *
      * @param color the color to be applied to the line
      * @param start first point of the line to be drawn
@@ -429,8 +398,8 @@
      * @param strokeWidth The stroke width to apply to the line
      * @param cap treatment applied to the ends of the line segment
      * @param pathEffect optional effect or pattern to apply to the line
-     * @param alpha opacity to be applied to the [color] from 0.0f to 1.0f representing
-     * fully transparent to fully opaque respectively
+     * @param alpha opacity to be applied to the [color] from 0.0f to 1.0f representing fully
+     *   transparent to fully opaque respectively
      * @param colorFilter ColorFilter to apply to the [color] when drawn into the destination
      * @param blendMode the blending algorithm to apply to the [color]
      */
@@ -448,14 +417,14 @@
 
     /**
      * Draws a rectangle with the given offset and size. If no offset from the top left is provided,
-     * it is drawn starting from the origin of the current translation. If no size is provided,
-     * the size of the current environment is used.
+     * it is drawn starting from the origin of the current translation. If no size is provided, the
+     * size of the current environment is used.
      *
      * @param brush The color or fill to be applied to the rectangle
      * @param topLeft Offset from the local origin of 0, 0 relative to the current translation
      * @param size Dimensions of the rectangle to draw
-     * @param alpha Opacity to be applied to the [brush] from 0.0f to 1.0f representing
-     * fully transparent to fully opaque respectively
+     * @param alpha Opacity to be applied to the [brush] from 0.0f to 1.0f representing fully
+     *   transparent to fully opaque respectively
      * @param style Whether or not the rectangle is stroked or filled in
      * @param colorFilter ColorFilter to apply to the [brush] when drawn into the destination
      * @param blendMode Blending algorithm to apply to destination
@@ -472,14 +441,14 @@
 
     /**
      * Draws a rectangle with the given offset and size. If no offset from the top left is provided,
-     * it is drawn starting from the origin of the current translation. If no size is provided,
-     * the size of the current environment is used.
+     * it is drawn starting from the origin of the current translation. If no size is provided, the
+     * size of the current environment is used.
      *
      * @param color The color to be applied to the rectangle
      * @param topLeft Offset from the local origin of 0, 0 relative to the current translation
      * @param size Dimensions of the rectangle to draw
-     * @param alpha Opacity to be applied to the [color] from 0.0f to 1.0f representing
-     * fully transparent to fully opaque respectively
+     * @param alpha Opacity to be applied to the [color] from 0.0f to 1.0f representing fully
+     *   transparent to fully opaque respectively
      * @param style Whether or not the rectangle is stroked or filled in
      * @param colorFilter ColorFilter to apply to the [color] source pixels
      * @param blendMode Blending algorithm to apply to destination
@@ -495,13 +464,13 @@
     )
 
     /**
-     * Draws the given [ImageBitmap] into the canvas with its top-left corner at the
-     * given [Offset]. The image is composited into the canvas using the given [Paint].
+     * Draws the given [ImageBitmap] into the canvas with its top-left corner at the given [Offset].
+     * The image is composited into the canvas using the given [Paint].
      *
      * @param image The [ImageBitmap] to draw
      * @param topLeft Offset from the local origin of 0, 0 relative to the current translation
-     * @param alpha Opacity to be applied to [image] from 0.0f to 1.0f representing
-     * fully transparent to fully opaque respectively
+     * @param alpha Opacity to be applied to [image] from 0.0f to 1.0f representing fully
+     *   transparent to fully opaque respectively
      * @param style Specifies whether the image is to be drawn filled in or as a rectangular stroke
      * @param colorFilter ColorFilter to apply to the [image] when drawn into the destination
      * @param blendMode Blending algorithm to apply to destination
@@ -516,23 +485,23 @@
     )
 
     /**
-     * Draws the subset of the given image described by the `src` argument into
-     * the canvas in the axis-aligned rectangle given by the `dst` argument.
+     * Draws the subset of the given image described by the `src` argument into the canvas in the
+     * axis-aligned rectangle given by the `dst` argument.
      *
      * If no src rect is provided, the entire image is scaled into the corresponding destination
      * bounds
      *
      * @param image The source image to draw
-     * @param srcOffset Optional offset representing the top left offset of the source image
-     * to draw, this defaults to the origin of [image]
-     * @param srcSize Optional dimensions of the source image to draw relative to [srcOffset],
-     * this defaults the width and height of [image]
-     * @param dstOffset Optional offset representing the top left offset of the destination
-     * to draw the given image, this defaults to the origin of the current translation
-     * tarting top left offset in the destination to draw the image
+     * @param srcOffset Optional offset representing the top left offset of the source image to
+     *   draw, this defaults to the origin of [image]
+     * @param srcSize Optional dimensions of the source image to draw relative to [srcOffset], this
+     *   defaults the width and height of [image]
+     * @param dstOffset Optional offset representing the top left offset of the destination to draw
+     *   the given image, this defaults to the origin of the current translation tarting top left
+     *   offset in the destination to draw the image
      * @param dstSize Optional dimensions of the destination to draw, this defaults to [srcSize]
-     * @param alpha Opacity to be applied to [image] from 0.0f to 1.0f representing
-     * fully transparent to fully opaque respectively
+     * @param alpha Opacity to be applied to [image] from 0.0f to 1.0f representing fully
+     *   transparent to fully opaque respectively
      * @param style Specifies whether the image is to be drawn filled in or as a rectangular stroke
      * @param colorFilter ColorFilter to apply to the [image] when drawn into the destination
      * @param blendMode Blending algorithm to apply to destination
@@ -540,12 +509,13 @@
     @Deprecated(
         "Prefer usage of drawImage that consumes an optional FilterQuality parameter",
         level = DeprecationLevel.HIDDEN,
-        replaceWith = ReplaceWith(
-            "drawImage(image, srcOffset, srcSize, dstOffset, dstSize, alpha, style, " +
-                "colorFilter, blendMode, FilterQuality.Low)",
-            "androidx.compose.ui.graphics.drawscope",
-            "androidx.compose.ui.graphics.FilterQuality"
-        )
+        replaceWith =
+            ReplaceWith(
+                "drawImage(image, srcOffset, srcSize, dstOffset, dstSize, alpha, style, " +
+                    "colorFilter, blendMode, FilterQuality.Low)",
+                "androidx.compose.ui.graphics.drawscope",
+                "androidx.compose.ui.graphics.FilterQuality"
+            )
     ) // Binary API compatibility.
     fun drawImage(
         image: ImageBitmap,
@@ -560,29 +530,29 @@
     )
 
     /**
-     * Draws the subset of the given image described by the `src` argument into
-     * the canvas in the axis-aligned rectangle given by the `dst` argument.
+     * Draws the subset of the given image described by the `src` argument into the canvas in the
+     * axis-aligned rectangle given by the `dst` argument.
      *
      * If no src rect is provided, the entire image is scaled into the corresponding destination
      * bounds
      *
      * @param image The source image to draw
-     * @param srcOffset Optional offset representing the top left offset of the source image
-     * to draw, this defaults to the origin of [image]
-     * @param srcSize Optional dimensions of the source image to draw relative to [srcOffset],
-     * this defaults the width and height of [image]
-     * @param dstOffset Optional offset representing the top left offset of the destination
-     * to draw the given image, this defaults to the origin of the current translation
-     * tarting top left offset in the destination to draw the image
+     * @param srcOffset Optional offset representing the top left offset of the source image to
+     *   draw, this defaults to the origin of [image]
+     * @param srcSize Optional dimensions of the source image to draw relative to [srcOffset], this
+     *   defaults the width and height of [image]
+     * @param dstOffset Optional offset representing the top left offset of the destination to draw
+     *   the given image, this defaults to the origin of the current translation tarting top left
+     *   offset in the destination to draw the image
      * @param dstSize Optional dimensions of the destination to draw, this defaults to [srcSize]
-     * @param alpha Opacity to be applied to [image] from 0.0f to 1.0f representing
-     * fully transparent to fully opaque respectively
+     * @param alpha Opacity to be applied to [image] from 0.0f to 1.0f representing fully
+     *   transparent to fully opaque respectively
      * @param style Specifies whether the image is to be drawn filled in or as a rectangular stroke
      * @param colorFilter ColorFilter to apply to the [image] when drawn into the destination
      * @param blendMode Blending algorithm to apply to destination
      * @param filterQuality Sampling algorithm applied to the [image] when it is scaled and drawn
-     * into the destination. The default is [FilterQuality.Low] which scales using a bilinear
-     * sampling algorithm
+     *   into the destination. The default is [FilterQuality.Low] which scales using a bilinear
+     *   sampling algorithm
      */
     fun drawImage(
         image: ImageBitmap,
@@ -611,15 +581,16 @@
 
     /**
      * Draws a rounded rectangle with the provided size, offset and radii for the x and y axis
-     * respectively. This rectangle is drawn with the provided [Brush]
-     * parameter and is filled or stroked based on the given [DrawStyle]
+     * respectively. This rectangle is drawn with the provided [Brush] parameter and is filled or
+     * stroked based on the given [DrawStyle]
      *
      * @param brush The color or fill to be applied to the rounded rectangle
      * @param topLeft Offset from the local origin of 0, 0 relative to the current translation
      * @param size Dimensions of the rectangle to draw
-     * @param cornerRadius Corner radius of the rounded rectangle, negative radii values are clamped to 0
-     * @param alpha Opacity to be applied to rounded rectangle from 0.0f to 1.0f representing
-     * fully transparent to fully opaque respectively
+     * @param cornerRadius Corner radius of the rounded rectangle, negative radii values are clamped
+     *   to 0
+     * @param alpha Opacity to be applied to rounded rectangle from 0.0f to 1.0f representing fully
+     *   transparent to fully opaque respectively
      * @param style Specifies whether the rounded rectangle is stroked or filled in
      * @param colorFilter ColorFilter to apply to the [brush] when drawn into the destination
      * @param blendMode Blending algorithm to be applied to the brush
@@ -636,15 +607,16 @@
     )
 
     /**
-     * Draws a rounded rectangle with the given [Paint]. Whether the rectangle is
-     * filled or stroked (or both) is controlled by [Paint.style].
+     * Draws a rounded rectangle with the given [Paint]. Whether the rectangle is filled or stroked
+     * (or both) is controlled by [Paint.style].
      *
      * @param color The color to be applied to the rounded rectangle
      * @param topLeft Offset from the local origin of 0, 0 relative to the current translation
      * @param size Dimensions of the rectangle to draw
-     * @param cornerRadius Corner radius of the rounded rectangle, negative radii values are clamped to 0
-     * @param alpha Opacity to be applied to rounded rectangle from 0.0f to 1.0f representing
-     * fully transparent to fully opaque respectively
+     * @param cornerRadius Corner radius of the rounded rectangle, negative radii values are clamped
+     *   to 0
+     * @param alpha Opacity to be applied to rounded rectangle from 0.0f to 1.0f representing fully
+     *   transparent to fully opaque respectively
      * @param style Specifies whether the rounded rectangle is stroked or filled in
      * @param colorFilter ColorFilter to apply to the [color] when drawn into the destination
      * @param blendMode Blending algorithm to be applied to the color
@@ -667,8 +639,8 @@
      * @param brush The color or fill to be applied to the circle
      * @param radius The radius of the circle
      * @param center The center coordinate where the circle is to be drawn
-     * @param alpha Opacity to be applied to the circle from 0.0f to 1.0f representing
-     * fully transparent to fully opaque respectively
+     * @param alpha Opacity to be applied to the circle from 0.0f to 1.0f representing fully
+     *   transparent to fully opaque respectively
      * @param style Whether or not the circle is stroked or filled in
      * @param colorFilter ColorFilter to apply to the [brush] when drawn into the destination
      * @param blendMode Blending algorithm to be applied to the brush
@@ -690,8 +662,8 @@
      * @param color The color or fill to be applied to the circle
      * @param radius The radius of the circle
      * @param center The center coordinate where the circle is to be drawn
-     * @param alpha Opacity to be applied to the circle from 0.0f to 1.0f representing
-     * fully transparent to fully opaque respectively
+     * @param alpha Opacity to be applied to the circle from 0.0f to 1.0f representing fully
+     *   transparent to fully opaque respectively
      * @param style Whether or not the circle is stroked or filled in
      * @param colorFilter ColorFilter to apply to the [color] when drawn into the destination
      * @param blendMode Blending algorithm to be applied to the brush
@@ -707,15 +679,15 @@
     )
 
     /**
-     * Draws an oval with the given offset and size. If no offset from the top left is provided,
-     * it is drawn starting from the origin of the current translation. If no size is provided,
-     * the size of the current environment is used.
+     * Draws an oval with the given offset and size. If no offset from the top left is provided, it
+     * is drawn starting from the origin of the current translation. If no size is provided, the
+     * size of the current environment is used.
      *
      * @param brush Color or fill to be applied to the oval
      * @param topLeft Offset from the local origin of 0, 0 relative to the current translation
      * @param size Dimensions of the rectangle to draw
-     * @param alpha Opacity to be applied to the oval from 0.0f to 1.0f representing
-     * fully transparent to fully opaque respectively
+     * @param alpha Opacity to be applied to the oval from 0.0f to 1.0f representing fully
+     *   transparent to fully opaque respectively
      * @param style Whether or not the oval is stroked or filled in
      * @param colorFilter ColorFilter to apply to the [brush] when drawn into the destination
      * @param blendMode Blending algorithm to be applied to the brush
@@ -733,15 +705,15 @@
     )
 
     /**
-     * Draws an oval with the given offset and size. If no offset from the top left is provided,
-     * it is drawn starting from the origin of the current translation. If no size is provided,
-     * the size of the current environment is used.
+     * Draws an oval with the given offset and size. If no offset from the top left is provided, it
+     * is drawn starting from the origin of the current translation. If no size is provided, the
+     * size of the current environment is used.
      *
      * @param color Color to be applied to the oval
      * @param topLeft Offset from the local origin of 0, 0 relative to the current translation
      * @param size Dimensions of the rectangle to draw
-     * @param alpha Opacity to be applied to the oval from 0.0f to 1.0f representing
-     * fully transparent to fully opaque respectively
+     * @param alpha Opacity to be applied to the oval from 0.0f to 1.0f representing fully
+     *   transparent to fully opaque respectively
      * @param style Whether or not the oval is stroked or filled in
      * @param colorFilter ColorFilter to apply to the [color] when drawn into the destination
      * @param blendMode Blending algorithm to be applied to the brush
@@ -759,14 +731,12 @@
     )
 
     /**
-     * Draw an arc scaled to fit inside the given rectangle. It starts from
-     * startAngle degrees around the oval up to startAngle + sweepAngle
-     * degrees around the oval, with zero degrees being the point on
-     * the right hand side of the oval that crosses the horizontal line
-     * that intersects the center of the rectangle and with positive
-     * angles going clockwise around the oval. If useCenter is true, the arc is
-     * closed back to the center, forming a circle sector. Otherwise, the arc is
-     * not closed, forming a circle segment.
+     * Draw an arc scaled to fit inside the given rectangle. It starts from startAngle degrees
+     * around the oval up to startAngle + sweepAngle degrees around the oval, with zero degrees
+     * being the point on the right hand side of the oval that crosses the horizontal line that
+     * intersects the center of the rectangle and with positive angles going clockwise around the
+     * oval. If useCenter is true, the arc is closed back to the center, forming a circle sector.
+     * Otherwise, the arc is not closed, forming a circle segment.
      *
      * @param brush Color or fill to be applied to the arc
      * @param topLeft Offset from the local origin of 0, 0 relative to the current translation
@@ -774,8 +744,8 @@
      * @param startAngle Starting angle in degrees. 0 represents 3 o'clock
      * @param sweepAngle Size of the arc in degrees that is drawn clockwise relative to [startAngle]
      * @param useCenter Flag indicating if the arc is to close the center of the bounds
-     * @param alpha Opacity to be applied to the arc from 0.0f to 1.0f representing
-     * fully transparent to fully opaque respectively
+     * @param alpha Opacity to be applied to the arc from 0.0f to 1.0f representing fully
+     *   transparent to fully opaque respectively
      * @param style Whether or not the arc is stroked or filled in
      * @param colorFilter ColorFilter to apply to the [brush] when drawn into the destination
      * @param blendMode Blending algorithm to be applied to the arc when it is drawn
@@ -794,14 +764,12 @@
     )
 
     /**
-     * Draw an arc scaled to fit inside the given rectangle. It starts from
-     * startAngle degrees around the oval up to startAngle + sweepAngle
-     * degrees around the oval, with zero degrees being the point on
-     * the right hand side of the oval that crosses the horizontal line
-     * that intersects the center of the rectangle and with positive
-     * angles going clockwise around the oval. If useCenter is true, the arc is
-     * closed back to the center, forming a circle sector. Otherwise, the arc is
-     * not closed, forming a circle segment.
+     * Draw an arc scaled to fit inside the given rectangle. It starts from startAngle degrees
+     * around the oval up to startAngle + sweepAngle degrees around the oval, with zero degrees
+     * being the point on the right hand side of the oval that crosses the horizontal line that
+     * intersects the center of the rectangle and with positive angles going clockwise around the
+     * oval. If useCenter is true, the arc is closed back to the center, forming a circle sector.
+     * Otherwise, the arc is not closed, forming a circle segment.
      *
      * @param color Color to be applied to the arc
      * @param topLeft Offset from the local origin of 0, 0 relative to the current translation
@@ -809,8 +777,8 @@
      * @param startAngle Starting angle in degrees. 0 represents 3 o'clock
      * @param sweepAngle Size of the arc in degrees that is drawn clockwise relative to [startAngle]
      * @param useCenter Flag indicating if the arc is to close the center of the bounds
-     * @param alpha Opacity to be applied to the arc from 0.0f to 1.0f representing
-     * fully transparent to fully opaque respectively
+     * @param alpha Opacity to be applied to the arc from 0.0f to 1.0f representing fully
+     *   transparent to fully opaque respectively
      * @param style Whether or not the arc is stroked or filled in
      * @param colorFilter ColorFilter to apply to the [color] when drawn into the destination
      * @param blendMode Blending algorithm to be applied to the arc when it is drawn
@@ -829,15 +797,14 @@
     )
 
     /**
-     * Draws the given [Path] with the given [Color]. Whether this shape is
-     * filled or stroked (or both) is controlled by [DrawStyle]. If the path is
-     * filled, then subpaths within it are implicitly closed (see [Path.close]).
-     *
+     * Draws the given [Path] with the given [Color]. Whether this shape is filled or stroked (or
+     * both) is controlled by [DrawStyle]. If the path is filled, then subpaths within it are
+     * implicitly closed (see [Path.close]).
      *
      * @param path Path to draw
      * @param color Color to be applied to the path
-     * @param alpha Opacity to be applied to the path from 0.0f to 1.0f representing
-     * fully transparent to fully opaque respectively
+     * @param alpha Opacity to be applied to the path from 0.0f to 1.0f representing fully
+     *   transparent to fully opaque respectively
      * @param style Whether or not the path is stroked or filled in
      * @param colorFilter ColorFilter to apply to the [color] when drawn into the destination
      * @param blendMode Blending algorithm to be applied to the path when it is drawn
@@ -852,14 +819,14 @@
     )
 
     /**
-     * Draws the given [Path] with the given [Color]. Whether this shape is
-     * filled or stroked (or both) is controlled by [DrawStyle]. If the path is
-     * filled, then subpaths within it are implicitly closed (see [Path.close]).
+     * Draws the given [Path] with the given [Color]. Whether this shape is filled or stroked (or
+     * both) is controlled by [DrawStyle]. If the path is filled, then subpaths within it are
+     * implicitly closed (see [Path.close]).
      *
      * @param path Path to draw
      * @param brush Brush to be applied to the path
-     * @param alpha Opacity to be applied to the path from 0.0f to 1.0f representing
-     * fully transparent to fully opaque respectively
+     * @param alpha Opacity to be applied to the path from 0.0f to 1.0f representing fully
+     *   transparent to fully opaque respectively
      * @param style Whether or not the path is stroked or filled in
      * @param colorFilter ColorFilter to apply to the [brush] when drawn into the destination
      * @param blendMode Blending algorithm to be applied to the path when it is drawn
@@ -881,8 +848,8 @@
      * @param points List of points to draw with the specified [PointMode]
      * @param pointMode [PointMode] used to indicate how the points are to be drawn
      * @param color Color to be applied to the points
-     * @param alpha Opacity to be applied to the path from 0.0f to 1.0f representing
-     * fully transparent to fully opaque respectively
+     * @param alpha Opacity to be applied to the path from 0.0f to 1.0f representing fully
+     *   transparent to fully opaque respectively
      * @param strokeWidth The stroke width to apply to the line
      * @param cap Treatment applied to the ends of the line segment
      * @param pathEffect optional effect or pattern to apply to the point
@@ -912,8 +879,8 @@
      * @param strokeWidth The stroke width to apply to the line
      * @param cap Treatment applied to the ends of the line segment
      * @param pathEffect optional effect or pattern to apply to the points
-     * @param alpha Opacity to be applied to the path from 0.0f to 1.0f representing
-     * fully transparent to fully opaque respectively.
+     * @param alpha Opacity to be applied to the path from 0.0f to 1.0f representing fully
+     *   transparent to fully opaque respectively.
      * @param colorFilter ColorFilter to apply to the [brush] when drawn into the destination
      * @param blendMode Blending algorithm to be applied to the path when it is drawn
      */
@@ -931,62 +898,53 @@
 
     /**
      * Record the corresponding drawing commands for this [GraphicsLayer] instance using the
-     * [Density], [LayoutDirection] and [IntSize] from the provided [DrawScope] as defaults.
-     * This will retarget the underlying canvas of the provided DrawScope to draw within the layer
-     * itself and reset it to the original canvas on the conclusion of this method call.
+     * [Density], [LayoutDirection] and [IntSize] from the provided [DrawScope] as defaults. This
+     * will retarget the underlying canvas of the provided DrawScope to draw within the layer itself
+     * and reset it to the original canvas on the conclusion of this method call.
      */
     fun GraphicsLayer.record(
         size: IntSize = this@DrawScope.size.toIntSize(),
         block: DrawScope.() -> Unit
-    ) = record(
-        this@DrawScope,
-        this@DrawScope.layoutDirection,
-        size
-    ) {
-        this@DrawScope.draw(
-            // we can use this@record.drawContext directly as the values in this@DrawScope
-            // and this@record are the same
-            drawContext.density,
-            drawContext.layoutDirection,
-            drawContext.canvas,
-            drawContext.size,
-            drawContext.graphicsLayer,
-            block
-        )
-    }
+    ) =
+        record(this@DrawScope, this@DrawScope.layoutDirection, size) {
+            this@DrawScope.draw(
+                // we can use this@record.drawContext directly as the values in this@DrawScope
+                // and this@record are the same
+                drawContext.density,
+                drawContext.layoutDirection,
+                drawContext.canvas,
+                drawContext.size,
+                drawContext.graphicsLayer,
+                block
+            )
+        }
 
-    /**
-     * Helper method to offset the provided size with the offset in box width and height
-     */
+    /** Helper method to offset the provided size with the offset in box width and height */
     private fun Size.offsetSize(offset: Offset): Size =
         Size(this.width - offset.x, this.height - offset.y)
 
     companion object {
 
         /**
-         * Default blending mode used for each drawing operation.
-         * This ensures that content is drawn on top of the pixels
-         * in the destination
+         * Default blending mode used for each drawing operation. This ensures that content is drawn
+         * on top of the pixels in the destination
          */
         val DefaultBlendMode: BlendMode = BlendMode.SrcOver
 
         /**
-         * Default FilterQuality used for determining the filtering algorithm
-         * to apply when scaling [ImageBitmap] objects. Maps to the default
-         * behavior of bilinear filtering
+         * Default FilterQuality used for determining the filtering algorithm to apply when scaling
+         * [ImageBitmap] objects. Maps to the default behavior of bilinear filtering
          */
         val DefaultFilterQuality: FilterQuality = FilterQuality.Low
     }
 }
 
-/**
- * Represents how the shapes should be drawn within a [DrawScope]
- */
+/** Represents how the shapes should be drawn within a [DrawScope] */
 sealed class DrawStyle
 
 /**
- * Default [DrawStyle] indicating shapes should be drawn completely filled in with the
- * provided color or pattern
+ * Default [DrawStyle] indicating shapes should be drawn completely filled in with the provided
+ * color or pattern
  */
 object Fill : DrawStyle()
 
@@ -995,13 +953,13 @@
  *
  * @param width Configure the width of the stroke in pixels
  * @param miter Set the stroke miter value. This is used to control the behavior of miter joins when
- * the joins angle is sharp. This value must be >= 0
+ *   the joins angle is sharp. This value must be >= 0
  * @param cap Return the paint's Cap, controlling how the start and end of stroked lines and paths
- * are treated. The default is [StrokeCap.Butt]
+ *   are treated. The default is [StrokeCap.Butt]
  * @param join Set's the treatment where lines and curve segments join on a stroked path. The
- * default is [StrokeJoin.Miter]
+ *   default is [StrokeJoin.Miter]
  * @param pathEffect Effect to apply to the stroke, null indicates a solid stroke line is to be
- * drawn
+ *   drawn
  */
 class Stroke(
     val width: Float = 0.0f,
@@ -1012,24 +970,16 @@
 ) : DrawStyle() {
     companion object {
 
-        /**
-         * Width to indicate a hairline stroke of 1 pixel
-         */
+        /** Width to indicate a hairline stroke of 1 pixel */
         const val HairlineWidth = 0.0f
 
-        /**
-         * Default miter length used in combination with joins
-         */
+        /** Default miter length used in combination with joins */
         const val DefaultMiter: Float = 4.0f
 
-        /**
-         * Default cap used for line endings
-         */
+        /** Default cap used for line endings */
         val DefaultCap = StrokeCap.Butt
 
-        /**
-         * Default join style used for connections between line and curve segments
-         */
+        /** Default join style used for connections between line and curve segments */
         val DefaultJoin = StrokeJoin.Miter
     }
 
diff --git a/compose/ui/ui-graphics/src/commonMain/kotlin/androidx/compose/ui/graphics/drawscope/DrawScopeMarker.kt b/compose/ui/ui-graphics/src/commonMain/kotlin/androidx/compose/ui/graphics/drawscope/DrawScopeMarker.kt
index 6701060..bb58aba 100644
--- a/compose/ui/ui-graphics/src/commonMain/kotlin/androidx/compose/ui/graphics/drawscope/DrawScopeMarker.kt
+++ b/compose/ui/ui-graphics/src/commonMain/kotlin/androidx/compose/ui/graphics/drawscope/DrawScopeMarker.kt
@@ -16,8 +16,5 @@
 
 package androidx.compose.ui.graphics.drawscope
 
-/**
- * DSL marker used to distinguish between drawing operations and canvas transform operations
- */
-@DslMarker
-annotation class DrawScopeMarker
+/** DSL marker used to distinguish between drawing operations and canvas transform operations */
+@DslMarker annotation class DrawScopeMarker
diff --git a/compose/ui/ui-graphics/src/commonMain/kotlin/androidx/compose/ui/graphics/drawscope/DrawTransform.kt b/compose/ui/ui-graphics/src/commonMain/kotlin/androidx/compose/ui/graphics/drawscope/DrawTransform.kt
index 18e2fdf..16656c2 100644
--- a/compose/ui/ui-graphics/src/commonMain/kotlin/androidx/compose/ui/graphics/drawscope/DrawTransform.kt
+++ b/compose/ui/ui-graphics/src/commonMain/kotlin/androidx/compose/ui/graphics/drawscope/DrawTransform.kt
@@ -26,8 +26,8 @@
 
 /**
  * Convenience method modifies the [DrawTransform] bounds to inset both left and right bounds by
- * [horizontal] as well as the top and bottom by [vertical]. After this method is
- * invoked, the coordinate space is returned to the state before the inset was applied
+ * [horizontal] as well as the top and bottom by [vertical]. After this method is invoked, the
+ * coordinate space is returned to the state before the inset was applied
  *
  * @param horizontal number of pixels to inset both left and right bounds. Zero by default.
  * @param vertical number of pixels to inset both top and bottom bounds. Zero by default.
@@ -37,68 +37,53 @@
     inset(horizontal, vertical, horizontal, vertical)
 
 /**
- * Convenience method modifies the [DrawScope] bounds to inset both left, top, right and
- * bottom bounds by [inset]. After this method is invoked,
- * the coordinate space is returned to the state before this inset was applied.
+ * Convenience method modifies the [DrawScope] bounds to inset both left, top, right and bottom
+ * bounds by [inset]. After this method is invoked, the coordinate space is returned to the state
+ * before this inset was applied.
  *
  * @param inset number of pixels to inset left, top, right, and bottom bounds.
  */
-@Suppress("NOTHING_TO_INLINE")
-inline fun DrawTransform.inset(
-    inset: Float
-) = inset(inset, inset)
+@Suppress("NOTHING_TO_INLINE") inline fun DrawTransform.inset(inset: Float) = inset(inset, inset)
 
 /**
- * Add a rotation (in radians clockwise) to the current transform at the given pivot point.
- * The pivot coordinate remains unchanged by the rotation transformation
+ * Add a rotation (in radians clockwise) to the current transform at the given pivot point. The
+ * pivot coordinate remains unchanged by the rotation transformation
  *
  * @param radians to rotate clockwise
- * @param pivot The coordinate for the pivot point, defaults to the center of the
- * coordinate space
+ * @param pivot The coordinate for the pivot point, defaults to the center of the coordinate space
  */
 @Suppress("NOTHING_TO_INLINE")
-inline fun DrawTransform.rotateRad(
-    radians: Float,
-    pivot: Offset = center
-) = rotate(degrees(radians), pivot)
+inline fun DrawTransform.rotateRad(radians: Float, pivot: Offset = center) =
+    rotate(degrees(radians), pivot)
 
 /**
- * Add an axis-aligned scale to the current transform, scaling uniformly in both directions
- * by the provided scale factor at the pivot coordinate. The pivot coordinate remains
- * unchanged by the scale transformation.
+ * Add an axis-aligned scale to the current transform, scaling uniformly in both directions by the
+ * provided scale factor at the pivot coordinate. The pivot coordinate remains unchanged by the
+ * scale transformation.
  *
  * @param scale The amount to scale
- * @param pivot The coordinate for the pivot point, defaults to the center of the
- * coordinate space
+ * @param pivot The coordinate for the pivot point, defaults to the center of the coordinate space
  */
 @Suppress("NOTHING_TO_INLINE")
-inline fun DrawTransform.scale(scale: Float, pivot: Offset = center) =
-    scale(scale, scale, pivot)
+inline fun DrawTransform.scale(scale: Float, pivot: Offset = center) = scale(scale, scale, pivot)
 
-/**
- * Defines transformations that can be applied to a drawing environment
- */
+/** Defines transformations that can be applied to a drawing environment */
 @DrawScopeMarker
 @JvmDefaultWithCompatibility
 interface DrawTransform {
 
-    /**
-     * Get the current size of the CanvasTransform
-     */
+    /** Get the current size of the CanvasTransform */
     val size: Size
 
-    /**
-     * Convenience method to obtain the current position of the current transformation
-     */
+    /** Convenience method to obtain the current position of the current transformation */
     val center: Offset
         get() = Offset(size.width / 2, size.height / 2)
 
     /**
-     * Simultaneously translate the coordinate space by [left] and [top] as well
-     * as modify the dimensions of the current painting area. This provides a callback to issue more
-     * drawing instructions within the modified coordinate space. This method
-     * modifies the width to be equivalent to width - (left + right) as well as
-     * height to height - (top + bottom)
+     * Simultaneously translate the coordinate space by [left] and [top] as well as modify the
+     * dimensions of the current painting area. This provides a callback to issue more drawing
+     * instructions within the modified coordinate space. This method modifies the width to be
+     * equivalent to width - (left + right) as well as height to height - (top + bottom)
      *
      * @param left number of pixels to inset the left drawing bound
      * @param top number of pixels to inset the top drawing bound
@@ -108,12 +93,11 @@
     fun inset(left: Float, top: Float, right: Float, bottom: Float)
 
     /**
-     * Reduces the clip region to the intersection of the current clip and the
-     * given rectangle indicated by the given left, top, right and bottom bounds.
-     * After this method is invoked, this clip is no longer applied.
+     * Reduces the clip region to the intersection of the current clip and the given rectangle
+     * indicated by the given left, top, right and bottom bounds. After this method is invoked, this
+     * clip is no longer applied.
      *
-     * Use [ClipOp.Difference] to subtract the provided rectangle from the
-     * current clip.
+     * Use [ClipOp.Difference] to subtract the provided rectangle from the current clip.
      *
      * @param left Left bound of the rectangle to clip
      * @param top Top bound of the rectangle to clip
@@ -130,11 +114,12 @@
     )
 
     /**
-     * Reduces the clip region to the intersection of the current clip and the
-     * given rounded rectangle. After this method is invoked, this clip is no longer applied
+     * Reduces the clip region to the intersection of the current clip and the given rounded
+     * rectangle. After this method is invoked, this clip is no longer applied
      *
      * @param path Shape to clip drawing content within
-     * @param clipOp Clipping operation to conduct on the given bounds, defaults to [ClipOp.Intersect]
+     * @param clipOp Clipping operation to conduct on the given bounds, defaults to
+     *   [ClipOp.Intersect]
      */
     fun clipPath(path: Path, clipOp: ClipOp = ClipOp.Intersect)
 
@@ -148,30 +133,30 @@
     fun translate(left: Float = 0.0f, top: Float = 0.0f)
 
     /**
-     *  Add a rotation (in degrees clockwise) to the current transform at the given pivot point.
-     *  The pivot coordinate remains unchanged by the rotation transformation.
+     * Add a rotation (in degrees clockwise) to the current transform at the given pivot point. The
+     * pivot coordinate remains unchanged by the rotation transformation.
      *
-     *  @param degrees to rotate clockwise
-     *  @param pivot The coordinates for the pivot point, defaults to the center of the
-     *  coordinate space
+     * @param degrees to rotate clockwise
+     * @param pivot The coordinates for the pivot point, defaults to the center of the coordinate
+     *   space
      */
     fun rotate(degrees: Float, pivot: Offset = center)
 
     /**
-     * Add an axis-aligned scale to the current transform, scaling by the first
-     * argument in the horizontal direction and the second in the vertical
-     * direction at the given pivot coordinate. The pivot coordinate remains
-     * unchanged by the scale transformation.
+     * Add an axis-aligned scale to the current transform, scaling by the first argument in the
+     * horizontal direction and the second in the vertical direction at the given pivot coordinate.
+     * The pivot coordinate remains unchanged by the scale transformation.
      *
      * @param scaleX The amount to scale in X
      * @param scaleY The amount to scale in Y
-     * @param pivot The coordinate for the pivot point, defaults to the center of the
-     * coordinate space
+     * @param pivot The coordinate for the pivot point, defaults to the center of the coordinate
+     *   space
      */
     fun scale(scaleX: Float, scaleY: Float, pivot: Offset = center)
 
     /**
      * Transform the drawing environment by the given matrix
+     *
      * @param matrix transformation matrix used to transform the drawing environment
      */
     fun transform(matrix: Matrix)
diff --git a/compose/ui/ui-graphics/src/commonMain/kotlin/androidx/compose/ui/graphics/drawscope/EmptyCanvas.kt b/compose/ui/ui-graphics/src/commonMain/kotlin/androidx/compose/ui/graphics/drawscope/EmptyCanvas.kt
index cdebed0..8f41a31 100644
--- a/compose/ui/ui-graphics/src/commonMain/kotlin/androidx/compose/ui/graphics/drawscope/EmptyCanvas.kt
+++ b/compose/ui/ui-graphics/src/commonMain/kotlin/androidx/compose/ui/graphics/drawscope/EmptyCanvas.kt
@@ -31,13 +31,10 @@
 import androidx.compose.ui.unit.IntSize
 
 /**
- * Stub implementation of [Canvas] to be used to ensure
- * the internal canvas object within [DrawScope] is never
- * null. All methods here are no-ops to ensure no
- * null pointer exceptions are thrown at runtime. During
- * normal use, the canvas used within [DrawScope] is
- * consuming a valid Canvas that draws content
- * into a valid destination
+ * Stub implementation of [Canvas] to be used to ensure the internal canvas object within
+ * [DrawScope] is never null. All methods here are no-ops to ensure no null pointer exceptions are
+ * thrown at runtime. During normal use, the canvas used within [DrawScope] is consuming a valid
+ * Canvas that draws content into a valid destination
  */
 internal class EmptyCanvas : Canvas {
 
diff --git a/compose/ui/ui-graphics/src/commonMain/kotlin/androidx/compose/ui/graphics/layer/ChildLayerDependenciesTracker.kt b/compose/ui/ui-graphics/src/commonMain/kotlin/androidx/compose/ui/graphics/layer/ChildLayerDependenciesTracker.kt
index 17a601a..78a9779 100644
--- a/compose/ui/ui-graphics/src/commonMain/kotlin/androidx/compose/ui/graphics/layer/ChildLayerDependenciesTracker.kt
+++ b/compose/ui/ui-graphics/src/commonMain/kotlin/androidx/compose/ui/graphics/layer/ChildLayerDependenciesTracker.kt
@@ -35,18 +35,18 @@
     private var trackingInProgress = false
 
     /**
-     * Rerun the tracking. it will remember what dependencies we had during the previous run,
-     * then will track what dependencies are added via [onDependencyAdded] during this run,
-     * compare them and invoke [onDependencyRemoved] on dependencies which were removed.
+     * Rerun the tracking. it will remember what dependencies we had during the previous run, then
+     * will track what dependencies are added via [onDependencyAdded] during this run, compare them
+     * and invoke [onDependencyRemoved] on dependencies which were removed.
      */
     inline fun withTracking(onDependencyRemoved: (GraphicsLayer) -> Unit, block: () -> Unit) {
         // move current dependencies to old dependencies
         oldDependency = dependency
         dependenciesSet?.let { currentSet ->
             if (currentSet.isNotEmpty()) {
-                val oldSet = oldDependenciesSet ?: mutableScatterSetOf<GraphicsLayer>().also {
-                    oldDependenciesSet = it
-                }
+                val oldSet =
+                    oldDependenciesSet
+                        ?: mutableScatterSetOf<GraphicsLayer>().also { oldDependenciesSet = it }
                 oldSet.addAll(currentSet)
                 currentSet.clear()
             }
@@ -66,9 +66,7 @@
         }
     }
 
-    /**
-     * @return true if this dependency is new (wasn't added during the last tracking)
-     */
+    /** @return true if this dependency is new (wasn't added during the last tracking) */
     fun onDependencyAdded(graphicsLayer: GraphicsLayer): Boolean {
         requirePrecondition(trackingInProgress) { "Only add dependencies during a tracking" }
 
@@ -76,10 +74,11 @@
         if (dependenciesSet != null) {
             dependenciesSet!!.add(graphicsLayer)
         } else if (dependency != null) {
-            dependenciesSet = mutableScatterSetOf<GraphicsLayer>().also {
-                it.add(dependency!!)
-                it.add(graphicsLayer)
-            }
+            dependenciesSet =
+                mutableScatterSetOf<GraphicsLayer>().also {
+                    it.add(dependency!!)
+                    it.add(graphicsLayer)
+                }
             dependency = null
         } else {
             dependency = graphicsLayer
@@ -100,9 +99,7 @@
         }
     }
 
-    /**
-     * [block] will be executed for each dependency before removing it.
-     */
+    /** [block] will be executed for each dependency before removing it. */
     inline fun removeDependencies(block: (GraphicsLayer) -> Unit) {
         dependency?.let {
             block(it)
diff --git a/compose/ui/ui-graphics/src/commonMain/kotlin/androidx/compose/ui/graphics/layer/CompositingStrategy.kt b/compose/ui/ui-graphics/src/commonMain/kotlin/androidx/compose/ui/graphics/layer/CompositingStrategy.kt
index fa54398..a361f11 100644
--- a/compose/ui/ui-graphics/src/commonMain/kotlin/androidx/compose/ui/graphics/layer/CompositingStrategy.kt
+++ b/compose/ui/ui-graphics/src/commonMain/kotlin/androidx/compose/ui/graphics/layer/CompositingStrategy.kt
@@ -19,47 +19,45 @@
 import androidx.compose.runtime.Immutable
 
 /**
- * Determines when to render the contents of a layer into an offscreen buffer before
- * being drawn to the destination.
+ * Determines when to render the contents of a layer into an offscreen buffer before being drawn to
+ * the destination.
  */
 @Immutable
 @kotlin.jvm.JvmInline
-value class CompositingStrategy internal constructor(
-    @Suppress("unused") private val value: Int
-) {
+value class CompositingStrategy internal constructor(@Suppress("unused") private val value: Int) {
 
     companion object {
 
         /**
          * Rendering to an offscreen buffer will be determined automatically by the rest of the
-         * graphicsLayer parameters. This is the default behavior.
-         * For example, whenever an alpha value less than 1.0f is provided on [Modifier.graphicsLayer],
-         * a compositing layer is created automatically to first render the contents fully opaque,
-         * then draw this offscreen buffer to the destination with the corresponding alpha. This is
-         * necessary for correctness otherwise alpha applied to individual drawing instructions that
-         * overlap will have a different result than expected. Additionally usage of [RenderEffect]
-         * on the graphicsLayer will also render into an intermediate offscreen buffer before
-         * being drawn into the destination.
+         * graphicsLayer parameters. This is the default behavior. For example, whenever an alpha
+         * value less than 1.0f is provided on [Modifier.graphicsLayer], a compositing layer is
+         * created automatically to first render the contents fully opaque, then draw this offscreen
+         * buffer to the destination with the corresponding alpha. This is necessary for correctness
+         * otherwise alpha applied to individual drawing instructions that overlap will have a
+         * different result than expected. Additionally usage of [RenderEffect] on the graphicsLayer
+         * will also render into an intermediate offscreen buffer before being drawn into the
+         * destination.
          */
         val Auto = CompositingStrategy(0)
 
         /**
          * Rendering of content will always be rendered into an offscreen buffer first then drawn to
-         * the destination regardless of the other parameters configured on the graphics
-         * layer. This is useful for leveraging different blending algorithms for masking content.
-         * For example, the contents can be drawn into this graphics layer and masked out by drawing
-         * additional shapes with [BlendMode.Clear]
+         * the destination regardless of the other parameters configured on the graphics layer. This
+         * is useful for leveraging different blending algorithms for masking content. For example,
+         * the contents can be drawn into this graphics layer and masked out by drawing additional
+         * shapes with [BlendMode.Clear]
          */
         val Offscreen = CompositingStrategy(1)
 
         /**
          * Modulates alpha for each of the drawing instructions recorded within the graphicsLayer.
-         * This avoids usage of an offscreen buffer for purposes of alpha rendering.
-         * [ModulateAlpha] is more efficient than [Auto] in performance in scenarios where an alpha
-         * value less than 1.0f is provided. Otherwise the performance is similar to that of [Auto].
-         * However, this can provide different results than [Auto] if there is overlapping content
-         * within the layer and alpha is applied. This should only be used if the contents of the layer
-         * are known well in advance and are expected to not be overlapping.
+         * This avoids usage of an offscreen buffer for purposes of alpha rendering. [ModulateAlpha]
+         * is more efficient than [Auto] in performance in scenarios where an alpha value less than
+         * 1.0f is provided. Otherwise the performance is similar to that of [Auto]. However, this
+         * can provide different results than [Auto] if there is overlapping content within the
+         * layer and alpha is applied. This should only be used if the contents of the layer are
+         * known well in advance and are expected to not be overlapping.
          */
         val ModulateAlpha = CompositingStrategy(2)
     }
diff --git a/compose/ui/ui-graphics/src/commonMain/kotlin/androidx/compose/ui/graphics/layer/GraphicsLayer.kt b/compose/ui/ui-graphics/src/commonMain/kotlin/androidx/compose/ui/graphics/layer/GraphicsLayer.kt
index 23d13fa..ef3726e9 100644
--- a/compose/ui/ui-graphics/src/commonMain/kotlin/androidx/compose/ui/graphics/layer/GraphicsLayer.kt
+++ b/compose/ui/ui-graphics/src/commonMain/kotlin/androidx/compose/ui/graphics/layer/GraphicsLayer.kt
@@ -35,43 +35,43 @@
 import androidx.compose.ui.unit.LayoutDirection
 
 /**
- * Draw the provided [GraphicsLayer] into the current [DrawScope].
- * The [GraphicsLayer] provided must have [GraphicsLayer.record] invoked on it otherwise
- * no visual output will be seen in the rendered result.
+ * Draw the provided [GraphicsLayer] into the current [DrawScope]. The [GraphicsLayer] provided must
+ * have [GraphicsLayer.record] invoked on it otherwise no visual output will be seen in the rendered
+ * result.
  *
  * @sample androidx.compose.ui.graphics.samples.GraphicsLayerTopLeftSample
+ *
  * @sample androidx.compose.ui.graphics.samples.GraphicsLayerScaleAndPivotSample
+ *
  * @sample androidx.compose.ui.graphics.samples.GraphicsLayerColorFilterSample
+ *
  * @sample androidx.compose.ui.graphics.samples.GraphicsLayerRenderEffectSample
+ *
  * @sample androidx.compose.ui.graphics.samples.GraphicsLayerAlphaSample
+ *
  * @sample androidx.compose.ui.graphics.samples.GraphicsLayerRotationX
+ *
  * @sample androidx.compose.ui.graphics.samples.GraphicsLayerRotationYWithCameraDistance
  */
 fun DrawScope.drawLayer(graphicsLayer: GraphicsLayer) {
-    drawIntoCanvas { canvas ->
-        graphicsLayer.draw(canvas, drawContext.graphicsLayer)
-    }
+    drawIntoCanvas { canvas -> graphicsLayer.draw(canvas, drawContext.graphicsLayer) }
 }
 
-/**
- * Default camera distance for all layers
- */
+/** Default camera distance for all layers */
 const val DefaultCameraDistance = 8.0f
 
 /**
  * Drawing layer used to record drawing commands in a displaylist as well as additional properties
- * that affect the rendering of the display list. This provides an isolation boundary to divide
- * a complex scene into smaller pieces that can be updated individually of one another without
+ * that affect the rendering of the display list. This provides an isolation boundary to divide a
+ * complex scene into smaller pieces that can be updated individually of one another without
  * recreating the entire scene. Transformations made to a [GraphicsLayer] can be done without
  * re-recording the display list.
  *
  * Usage of a [GraphicsLayer] requires a minimum of 2 steps.
- *
- * 1) The [GraphicsLayer] must be built, which involves specifying the position alongside a list
- * of drawing commands using [GraphicsLayer.record]
- *
+ * 1) The [GraphicsLayer] must be built, which involves specifying the position alongside a list of
+ *    drawing commands using [GraphicsLayer.record]
  * 2) The [GraphicsLayer] is then drawn into another destination [Canvas] using
- * [GraphicsLayer.draw].
+ *    [GraphicsLayer.draw].
  *
  * Additionally the contents of the displaylist can be transformed when it is drawn into a
  * desintation [Canvas] by specifying either [scaleX], [scaleY], [translationX], [translationY],
@@ -86,10 +86,11 @@
     /**
      * [CompositingStrategy] determines whether or not the contents of this layer are rendered into
      * an offscreen buffer. This is useful in order to optimize alpha usages with
-     * [CompositingStrategy.ModulateAlpha] which will skip the overhead of an offscreen buffer but can
-     * generate different rendering results depending on whether or not the contents of the layer are
-     * overlapping. Similarly leveraging [CompositingStrategy.Offscreen] is useful in situations where
-     * creating an offscreen buffer is preferred usually in conjunction with [BlendMode] usage.
+     * [CompositingStrategy.ModulateAlpha] which will skip the overhead of an offscreen buffer but
+     * can generate different rendering results depending on whether or not the contents of the
+     * layer are overlapping. Similarly leveraging [CompositingStrategy.Offscreen] is useful in
+     * situations where creating an offscreen buffer is preferred usually in conjunction with
+     * [BlendMode] usage.
      */
     var compositingStrategy: CompositingStrategy
 
@@ -103,9 +104,9 @@
 
     /**
      * Size in pixels of the [GraphicsLayer]. By default [GraphicsLayer] contents can draw outside
-     * of the bounds specified by [topLeft] and [size], however, rasterization of this layer into
-     * an offscreen buffer will be sized according to the specified size. This is configured
-     * by calling [record]
+     * of the bounds specified by [topLeft] and [size], however, rasterization of this layer into an
+     * offscreen buffer will be sized according to the specified size. This is configured by calling
+     * [record]
      *
      * @sample androidx.compose.ui.graphics.samples.GraphicsLayerSizeSample
      */
@@ -159,10 +160,9 @@
     var translationY: Float
 
     /**
-     * Sets the elevation for the shadow in pixels. With the [shadowElevation] > 0f and
-     * [Outline] set, a shadow is produced. Default value is `0` and the value must not be
-     * negative. Configuring a non-zero [shadowElevation] enables clipping of [GraphicsLayer]
-     * content.
+     * Sets the elevation for the shadow in pixels. With the [shadowElevation] > 0f and [Outline]
+     * set, a shadow is produced. Default value is `0` and the value must not be negative.
+     * Configuring a non-zero [shadowElevation] enables clipping of [GraphicsLayer] content.
      *
      * Note that if you provide a non-zero [shadowElevation] and if the passed [Outline] is concave
      * the shadow will not be drawn on Android versions less than 10.
@@ -177,8 +177,8 @@
      * By default the shadow color is black. Generally, this color will be opaque so the intensity
      * of the shadow is consistent between different graphics layers with different colors.
      *
-     * The opacity of the final ambient shadow is a function of the shadow caster height, the
-     * alpha channel of the [ambientShadowColor] (typically opaque), and the
+     * The opacity of the final ambient shadow is a function of the shadow caster height, the alpha
+     * channel of the [ambientShadowColor] (typically opaque), and the
      * [android.R.attr.ambientShadowAlpha] theme attribute.
      *
      * Note that this parameter is only supported on Android 9 (Pie) and above. On older versions,
@@ -194,9 +194,9 @@
      * By default the shadow color is black. Generally, this color will be opaque so the intensity
      * of the shadow is consistent between different graphics layers with different colors.
      *
-     * The opacity of the final spot shadow is a function of the shadow caster height, the
-     * alpha channel of the [spotShadowColor] (typically opaque), and the
-     * [android.R.attr.spotShadowAlpha] theme attribute.
+     * The opacity of the final spot shadow is a function of the shadow caster height, the alpha
+     * channel of the [spotShadowColor] (typically opaque), and the [android.R.attr.spotShadowAlpha]
+     * theme attribute.
      *
      * Note that this parameter is only supported on Android 9 (Pie) and above. On older versions,
      * this property always returns [Color.Black] and setting new values is ignored.
@@ -206,36 +206,36 @@
     var spotShadowColor: Color
 
     /**
-     * BlendMode to use when drawing this layer to the destination in [drawLayer].
-     * The default is [BlendMode.SrcOver].
-     * Any value other than [BlendMode.SrcOver] will force this [GraphicsLayer] to use an offscreen
-     * compositing layer for rendering and is equivalent to using [CompositingStrategy.Offscreen].
+     * BlendMode to use when drawing this layer to the destination in [drawLayer]. The default is
+     * [BlendMode.SrcOver]. Any value other than [BlendMode.SrcOver] will force this [GraphicsLayer]
+     * to use an offscreen compositing layer for rendering and is equivalent to using
+     * [CompositingStrategy.Offscreen].
      *
      * @sample androidx.compose.ui.graphics.samples.GraphicsLayerBlendModeSample
      */
     var blendMode: BlendMode
 
     /**
-     * ColorFilter applied when drawing this layer to the destination in [drawLayer].
-     * Setting of this to any non-null will force this [GraphicsLayer] to use an offscreen
-     * compositing layer for rendering and is equivalent to using [CompositingStrategy.Offscreen]
+     * ColorFilter applied when drawing this layer to the destination in [drawLayer]. Setting of
+     * this to any non-null will force this [GraphicsLayer] to use an offscreen compositing layer
+     * for rendering and is equivalent to using [CompositingStrategy.Offscreen]
      *
      * @sample androidx.compose.ui.graphics.samples.GraphicsLayerColorFilterSample
      */
     var colorFilter: ColorFilter?
 
     /**
-     * Returns the outline specified by either [setPathOutline] or [setRoundRectOutline].
-     * By default this will return [Outline.Rectangle] with the size of the [GraphicsLayer]
-     * specified by [record] or [IntSize.Zero] if [record] was not previously invoked.
+     * Returns the outline specified by either [setPathOutline] or [setRoundRectOutline]. By default
+     * this will return [Outline.Rectangle] with the size of the [GraphicsLayer] specified by
+     * [record] or [IntSize.Zero] if [record] was not previously invoked.
      */
     val outline: Outline
 
     /**
-     * Specifies the given path to be configured as the outline for this [GraphicsLayer].
-     * When [shadowElevation] is non-zero a shadow is produced with an [Outline] created from
-     * the provided [path]. Additionally if [clip] is true, the contents of this [GraphicsLayer]
-     * will be clipped to this geometry.
+     * Specifies the given path to be configured as the outline for this [GraphicsLayer]. When
+     * [shadowElevation] is non-zero a shadow is produced with an [Outline] created from the
+     * provided [path]. Additionally if [clip] is true, the contents of this [GraphicsLayer] will be
+     * clipped to this geometry.
      *
      * @param path Path to be used as the Outline for the [GraphicsLayer]
      *
@@ -245,10 +245,10 @@
 
     /**
      * Configures a rounded rect outline for this [GraphicsLayer]. By default, [topLeft] is set to
-     * [Size.Zero] and [size] is set to [Size.Unspecified] indicating that the outline
-     * should match the size of the [GraphicsLayer]. When [shadowElevation] is non-zero a shadow
-     * is produced using an [Outline] created from the round rect parameters provided. Additionally
-     * if [clip] is true, the contents of this [GraphicsLayer] will be clipped to this geometry.
+     * [Size.Zero] and [size] is set to [Size.Unspecified] indicating that the outline should match
+     * the size of the [GraphicsLayer]. When [shadowElevation] is non-zero a shadow is produced
+     * using an [Outline] created from the round rect parameters provided. Additionally if [clip] is
+     * true, the contents of this [GraphicsLayer] will be clipped to this geometry.
      *
      * @param topLeft The top left of the rounded rect outline
      * @param size The size of the rounded rect outline
@@ -264,20 +264,17 @@
 
     /**
      * Configures a rectangular outline for this [GraphicsLayer]. By default, [topLeft] is set to
-     * [Size.Zero] and [size] is set to [Size.Unspecified] indicating that the outline
-     * should match the size of the [GraphicsLayer]. When [shadowElevation] is non-zero a shadow
-     * is produced using an [Outline] created from the round rect parameters provided. Additionally
-     * if [clip] is true, the contents of this [GraphicsLayer] will be clipped to this geometry.
+     * [Size.Zero] and [size] is set to [Size.Unspecified] indicating that the outline should match
+     * the size of the [GraphicsLayer]. When [shadowElevation] is non-zero a shadow is produced
+     * using an [Outline] created from the round rect parameters provided. Additionally if [clip] is
+     * true, the contents of this [GraphicsLayer] will be clipped to this geometry.
      *
      * @param topLeft The top left of the rounded rect outline
      * @param size The size of the rounded rect outline
      *
      * @sample androidx.compose.ui.graphics.samples.GraphicsLayerRectOutline
      */
-    fun setRectOutline(
-        topLeft: Offset = Offset.Zero,
-        size: Size = Size.Unspecified
-    )
+    fun setRectOutline(topLeft: Offset = Offset.Zero, size: Size = Size.Unspecified)
 
     /**
      * The rotation, in degrees, of the contents around the horizontal axis in degrees. Default
@@ -288,39 +285,36 @@
     var rotationX: Float
 
     /**
-     * The rotation, in degrees, of the contents around the vertical axis in degrees. Default
-     * value is `0`.
+     * The rotation, in degrees, of the contents around the vertical axis in degrees. Default value
+     * is `0`.
      *
      * @sample androidx.compose.ui.graphics.samples.GraphicsLayerRotationYWithCameraDistance
      */
     var rotationY: Float
 
     /**
-     * The rotation, in degrees, of the contents around the Z axis in degrees. Default value is
-     * `0`.
+     * The rotation, in degrees, of the contents around the Z axis in degrees. Default value is `0`.
      */
     var rotationZ: Float
 
     /**
-     * Sets the distance along the Z axis (orthogonal to the X/Y plane on which
-     * layers are drawn) from the camera to this layer. The camera's distance
-     * affects 3D transformations, for instance rotations around the X and Y
-     * axis. If the rotationX or rotationY properties are changed and this view is
-     * large (more than half the size of the screen), it is recommended to always
-     * use a camera distance that's greater than the height (X axis rotation) or
-     * the width (Y axis rotation) of this view.
+     * Sets the distance along the Z axis (orthogonal to the X/Y plane on which layers are drawn)
+     * from the camera to this layer. The camera's distance affects 3D transformations, for instance
+     * rotations around the X and Y axis. If the rotationX or rotationY properties are changed and
+     * this view is large (more than half the size of the screen), it is recommended to always use a
+     * camera distance that's greater than the height (X axis rotation) or the width (Y axis
+     * rotation) of this view.
      *
-     * The distance of the camera from the drawing plane can have an affect on the
-     * perspective distortion of the layer when it is rotated around the x or y axis.
-     * For example, a large distance will result in a large viewing angle, and there
-     * will not be much perspective distortion of the view as it rotates. A short
-     * distance may cause much more perspective distortion upon rotation, and can
-     * also result in some drawing artifacts if the rotated view ends up partially
-     * behind the camera (which is why the recommendation is to use a distance at
+     * The distance of the camera from the drawing plane can have an affect on the perspective
+     * distortion of the layer when it is rotated around the x or y axis. For example, a large
+     * distance will result in a large viewing angle, and there will not be much perspective
+     * distortion of the view as it rotates. A short distance may cause much more perspective
+     * distortion upon rotation, and can also result in some drawing artifacts if the rotated view
+     * ends up partially behind the camera (which is why the recommendation is to use a distance at
      * least as far as the size of the view, if the view is to be rotated.)
      *
-     * The distance is expressed in pixels and must always be positive.
-     * Default value is [DefaultCameraDistance]
+     * The distance is expressed in pixels and must always be positive. Default value is
+     * [DefaultCameraDistance]
      *
      * @sample androidx.compose.ui.graphics.samples.GraphicsLayerRotationYWithCameraDistance
      */
@@ -329,22 +323,20 @@
     /**
      * Determines if the [GraphicsLayer] should be clipped to the rectangular bounds specified by
      * [topLeft] and [size]. The default is false, however, contents will always be clipped to their
-     * bounds when the GraphicsLayer is promoted off an offscreen rendering buffer
-     * (i.e. CompositingStrategy.Offscreen is used, a non-null ColorFilter, RenderEffect is applied
-     * or if the BlendMode is not equivalent to BlendMode.SrcOver
+     * bounds when the GraphicsLayer is promoted off an offscreen rendering buffer (i.e.
+     * CompositingStrategy.Offscreen is used, a non-null ColorFilter, RenderEffect is applied or if
+     * the BlendMode is not equivalent to BlendMode.SrcOver
      */
-    @Suppress("GetterSetterNames")
-    @get:Suppress("GetterSetterNames")
-    var clip: Boolean
+    @Suppress("GetterSetterNames") @get:Suppress("GetterSetterNames") var clip: Boolean
 
     /**
-     * Configure the [RenderEffect] to apply to this [GraphicsLayer].
-     * This will apply a visual effect to the results of the [GraphicsLayer] before it is
-     * drawn. For example if [BlurEffect] is provided, the contents will be drawn in a separate
-     * layer, then this layer will be blurred when this [GraphicsLayer] is drawn.
+     * Configure the [RenderEffect] to apply to this [GraphicsLayer]. This will apply a visual
+     * effect to the results of the [GraphicsLayer] before it is drawn. For example if [BlurEffect]
+     * is provided, the contents will be drawn in a separate layer, then this layer will be blurred
+     * when this [GraphicsLayer] is drawn.
      *
-     * Note this parameter is only supported on Android 12
-     * and above. Attempts to use this Modifier on older Android versions will be ignored.
+     * Note this parameter is only supported on Android 12 and above. Attempts to use this Modifier
+     * on older Android versions will be ignored.
      *
      * @sample androidx.compose.ui.graphics.samples.GraphicsLayerRenderEffectSample
      */
@@ -358,16 +350,19 @@
         private set
 
     /**
-     * Constructs the display list of drawing commands into this layer that will be rendered
-     * when this [GraphicsLayer] is drawn elsewhere with [drawLayer].
+     * Constructs the display list of drawing commands into this layer that will be rendered when
+     * this [GraphicsLayer] is drawn elsewhere with [drawLayer].
+     *
      * @param density [Density] used to assist in conversions of density independent pixels to raw
-     * pixels to draw.
+     *   pixels to draw.
      * @param layoutDirection [LayoutDirection] of the layout being drawn in.
      * @param size [Size] of the [GraphicsLayer]
      * @param block lambda that is called to issue drawing commands on this [DrawScope]
      *
      * @sample androidx.compose.ui.graphics.samples.GraphicsLayerTopLeftSample
+     *
      * @sample androidx.compose.ui.graphics.samples.GraphicsLayerBlendModeSample
+     *
      * @sample androidx.compose.ui.graphics.samples.GraphicsLayerTranslateSample
      */
     fun record(
@@ -386,9 +381,7 @@
      */
     suspend fun toImageBitmap(): ImageBitmap
 
-    /**
-     * Draw the contents of this [GraphicsLayer] into the specified [Canvas]
-     */
+    /** Draw the contents of this [GraphicsLayer] into the specified [Canvas] */
     internal fun draw(canvas: Canvas, parentLayer: GraphicsLayer?)
 }
 
@@ -403,10 +396,11 @@
  */
 fun GraphicsLayer.setOutline(outline: Outline) {
     when (outline) {
-        is Outline.Rectangle -> setRectOutline(
-            Offset(outline.rect.left, outline.rect.top),
-            Size(outline.rect.width, outline.rect.height)
-        )
+        is Outline.Rectangle ->
+            setRectOutline(
+                Offset(outline.rect.left, outline.rect.top),
+                Size(outline.rect.width, outline.rect.height)
+            )
         is Outline.Generic -> setPathOutline(outline.path)
         is Outline.Rounded -> {
             // If the rounded rect has a path, then the corner radii are not the same across
diff --git a/compose/ui/ui-graphics/src/commonMain/kotlin/androidx/compose/ui/graphics/painter/BitmapPainter.kt b/compose/ui/ui-graphics/src/commonMain/kotlin/androidx/compose/ui/graphics/painter/BitmapPainter.kt
index 48b6984..843636f6 100644
--- a/compose/ui/ui-graphics/src/commonMain/kotlin/androidx/compose/ui/graphics/painter/BitmapPainter.kt
+++ b/compose/ui/ui-graphics/src/commonMain/kotlin/androidx/compose/ui/graphics/painter/BitmapPainter.kt
@@ -27,22 +27,21 @@
 import androidx.compose.ui.util.fastRoundToInt
 
 /**
- * [Painter] implementation used to draw an [ImageBitmap] into the provided canvas
- * This implementation can handle applying alpha and [ColorFilter] to it's drawn result
+ * [Painter] implementation used to draw an [ImageBitmap] into the provided canvas This
+ * implementation can handle applying alpha and [ColorFilter] to it's drawn result
  *
  * @param image The [ImageBitmap] to draw
  * @param srcOffset Optional offset relative to [image] used to draw a subsection of the
- * [ImageBitmap]. By default this uses the origin of [image]
- * @param srcSize Optional dimensions representing size of the subsection of [image] to draw
- * Both the offset and size must have the following requirements:
- *
+ *   [ImageBitmap]. By default this uses the origin of [image]
+ * @param srcSize Optional dimensions representing size of the subsection of [image] to draw Both
+ *   the offset and size must have the following requirements:
  * 1) Left and top bounds must be greater than or equal to zero
  * 2) Source size must be greater than zero
  * 3) Source size must be less than or equal to the dimensions of [image]
  *
- * @param filterQuality Sampling algorithm applied to the [image] when it is scaled and drawn
- * into the destination. The default is [FilterQuality.Low] which scales using a bilinear
- * sampling algorithm
+ * @param filterQuality Sampling algorithm applied to the [image] when it is scaled and drawn into
+ *   the destination. The default is [FilterQuality.Low] which scales using a bilinear sampling
+ *   algorithm
  */
 fun BitmapPainter(
     image: ImageBitmap,
@@ -50,20 +49,17 @@
     srcSize: IntSize = IntSize(image.width, image.height),
     filterQuality: FilterQuality = FilterQuality.Low
 ): BitmapPainter =
-    BitmapPainter(image, srcOffset, srcSize).apply {
-        this.filterQuality = filterQuality
-    }
+    BitmapPainter(image, srcOffset, srcSize).apply { this.filterQuality = filterQuality }
 
 /**
- * [Painter] implementation used to draw an [ImageBitmap] into the provided canvas
- * This implementation can handle applying alpha and [ColorFilter] to it's drawn result
+ * [Painter] implementation used to draw an [ImageBitmap] into the provided canvas This
+ * implementation can handle applying alpha and [ColorFilter] to it's drawn result
  *
  * @param image The [ImageBitmap] to draw
  * @param srcOffset Optional offset relative to [image] used to draw a subsection of the
- * [ImageBitmap]. By default this uses the origin of [image]
- * @param srcSize Optional dimensions representing size of the subsection of [image] to draw
- * Both the offset and size must have the following requirements:
- *
+ *   [ImageBitmap]. By default this uses the origin of [image]
+ * @param srcSize Optional dimensions representing size of the subsection of [image] to draw Both
+ *   the offset and size must have the following requirements:
  * 1) Left and top bounds must be greater than or equal to zero
  * 2) Source size must be greater than zero
  * 3) Source size must be less than or equal to the dimensions of [image]
@@ -94,20 +90,20 @@
             image,
             srcOffset,
             srcSize,
-            dstSize = IntSize(
-                this@onDraw.size.width.fastRoundToInt(),
-                this@onDraw.size.height.fastRoundToInt()
-            ),
+            dstSize =
+                IntSize(
+                    this@onDraw.size.width.fastRoundToInt(),
+                    this@onDraw.size.height.fastRoundToInt()
+                ),
             alpha = alpha,
             colorFilter = colorFilter,
             filterQuality = filterQuality
         )
     }
 
-    /**
-     * Return the dimension of the underlying [ImageBitmap] as it's intrinsic width and height
-     */
-    override val intrinsicSize: Size get() = size.toSize()
+    /** Return the dimension of the underlying [ImageBitmap] as it's intrinsic width and height */
+    override val intrinsicSize: Size
+        get() = size.toSize()
 
     override fun applyAlpha(alpha: Float): Boolean {
         this.alpha = alpha
diff --git a/compose/ui/ui-graphics/src/commonMain/kotlin/androidx/compose/ui/graphics/painter/BrushPainter.kt b/compose/ui/ui-graphics/src/commonMain/kotlin/androidx/compose/ui/graphics/painter/BrushPainter.kt
index 9aeb295..d98a5e9 100644
--- a/compose/ui/ui-graphics/src/commonMain/kotlin/androidx/compose/ui/graphics/painter/BrushPainter.kt
+++ b/compose/ui/ui-graphics/src/commonMain/kotlin/androidx/compose/ui/graphics/painter/BrushPainter.kt
@@ -22,8 +22,8 @@
 import androidx.compose.ui.graphics.drawscope.DrawScope
 
 /**
- * [Painter] implementation used to fill the provided bounds with the specified [Brush].
- * The intrinsic size of this [Painter] is determined by [Brush.intrinsicSize]
+ * [Painter] implementation used to fill the provided bounds with the specified [Brush]. The
+ * intrinsic size of this [Painter] is determined by [Brush.intrinsicSize]
  */
 class BrushPainter(
     val brush: Brush,
diff --git a/compose/ui/ui-graphics/src/commonMain/kotlin/androidx/compose/ui/graphics/painter/ColorPainter.kt b/compose/ui/ui-graphics/src/commonMain/kotlin/androidx/compose/ui/graphics/painter/ColorPainter.kt
index 63bc727..81a9d96 100644
--- a/compose/ui/ui-graphics/src/commonMain/kotlin/androidx/compose/ui/graphics/painter/ColorPainter.kt
+++ b/compose/ui/ui-graphics/src/commonMain/kotlin/androidx/compose/ui/graphics/painter/ColorPainter.kt
@@ -21,9 +21,7 @@
 import androidx.compose.ui.graphics.ColorFilter
 import androidx.compose.ui.graphics.drawscope.DrawScope
 
-/**
- * [Painter] implementation used to fill the provided bounds with the specified color
- */
+/** [Painter] implementation used to fill the provided bounds with the specified color */
 class ColorPainter(val color: Color) : Painter() {
     private var alpha: Float = 1.0f
 
@@ -60,8 +58,6 @@
         return "ColorPainter(color=$color)"
     }
 
-    /**
-     * Drawing a color does not have an intrinsic size, return [Size.Unspecified] here
-     */
+    /** Drawing a color does not have an intrinsic size, return [Size.Unspecified] here */
     override val intrinsicSize: Size = Size.Unspecified
 }
diff --git a/compose/ui/ui-graphics/src/commonMain/kotlin/androidx/compose/ui/graphics/painter/Painter.kt b/compose/ui/ui-graphics/src/commonMain/kotlin/androidx/compose/ui/graphics/painter/Painter.kt
index e95e4b8..8fa05b9 100644
--- a/compose/ui/ui-graphics/src/commonMain/kotlin/androidx/compose/ui/graphics/painter/Painter.kt
+++ b/compose/ui/ui-graphics/src/commonMain/kotlin/androidx/compose/ui/graphics/painter/Painter.kt
@@ -28,27 +28,24 @@
 import androidx.compose.ui.unit.LayoutDirection
 
 /**
- * Abstraction for something that can be drawn. In addition to providing the ability to draw
- * into a specified bounded area, [Painter] provides a few high level mechanisms
- * that consumers can use to configure how the content is drawn. These include alpha,
- * ColorFilter, and RTL
+ * Abstraction for something that can be drawn. In addition to providing the ability to draw into a
+ * specified bounded area, [Painter] provides a few high level mechanisms that consumers can use to
+ * configure how the content is drawn. These include alpha, ColorFilter, and RTL
  *
- * Implementations should provide a meaningful equals method that compares values of
- * different [Painter] subclasses and not rely on just referential equality
+ * Implementations should provide a meaningful equals method that compares values of different
+ * [Painter] subclasses and not rely on just referential equality
  */
 abstract class Painter {
 
     /**
-     * Optional [Paint] used to draw contents into an offscreen layer in order to apply
-     * alpha or [ColorFilter] parameters accordingly. If no alpha or [ColorFilter] is
-     * provided or the [Painter] implementation implements [applyAlpha] and
-     * [applyColorFilter] then this paint is not used
+     * Optional [Paint] used to draw contents into an offscreen layer in order to apply alpha or
+     * [ColorFilter] parameters accordingly. If no alpha or [ColorFilter] is provided or the
+     * [Painter] implementation implements [applyAlpha] and [applyColorFilter] then this paint is
+     * not used
      */
     private var layerPaint: Paint? = null
 
-    /**
-     * Lazily create a [Paint] object or return the existing instance if it is already allocated
-     */
+    /** Lazily create a [Paint] object or return the existing instance if it is already allocated */
     private fun obtainPaint(): Paint {
         var target = layerPaint
         if (target == null) {
@@ -59,25 +56,22 @@
     }
 
     /**
-     * Determine if an additional rasterization layer should be used in order to draw the
-     * [Painter]. This would be necessary if there is an alpha value between 0.0 and 1.0
-     * and the [Painter] implementation does not handle alpha internally. Similarly
-     * a layer would be used if a [ColorFilter] is provided and the implementation is not
-     * handled internally.
+     * Determine if an additional rasterization layer should be used in order to draw the [Painter].
+     * This would be necessary if there is an alpha value between 0.0 and 1.0 and the [Painter]
+     * implementation does not handle alpha internally. Similarly a layer would be used if a
+     * [ColorFilter] is provided and the implementation is not handled internally.
      */
     private var useLayer = false
 
-    /**
-     * Currently configured ColorFilter
-     */
+    /** Currently configured ColorFilter */
     private var colorFilter: ColorFilter? = null
 
     /**
-     * Optional [ColorFilter] used to modify the source pixels when drawn to the destination
-     * The default implementation of [Painter] will render it's contents into a separate
-     * layer then render that layer to the destination with the [ColorFilter] applied.
-     * Implementations that can handle applying a [ColorFilter] more directly should also
-     * implement the [applyColorFilter] method and return true
+     * Optional [ColorFilter] used to modify the source pixels when drawn to the destination The
+     * default implementation of [Painter] will render it's contents into a separate layer then
+     * render that layer to the destination with the [ColorFilter] applied. Implementations that can
+     * handle applying a [ColorFilter] more directly should also implement the [applyColorFilter]
+     * method and return true
      */
     private fun configureColorFilter(colorFilter: ColorFilter?) {
         if (this.colorFilter != colorFilter) {
@@ -95,23 +89,19 @@
         }
     }
 
-    /**
-     * Currently configured alpha/opacity value
-     */
+    /** Currently configured alpha/opacity value */
     private var alpha: Float = DefaultAlpha
 
     /**
-     * Specify the alpha transparency to apply to the [Painter] when it is drawn into
-     * the destination. The default implementation within [Painter] will render it's
-     * contents into an offscreen layer, then draw that layer into the destination with the
-     * alpha applied.
-     * Implementations of [Painter] that can handle alpha configuration more optimally
-     * should implement the [applyAlpha] interface and avoid intermediate layer rendering
-     * where ever possible. For example, [Painter] implementations that draw a Bitmap
-     * would be able to draw their contents to the destination with the alpha applied directly
-     * without needing an offscreen buffer. Additionally, drawing a shape with a color
-     * applied can modulate the alpha channel directly without requiring a layer to achieve
-     * the same visual effect
+     * Specify the alpha transparency to apply to the [Painter] when it is drawn into the
+     * destination. The default implementation within [Painter] will render it's contents into an
+     * offscreen layer, then draw that layer into the destination with the alpha applied.
+     * Implementations of [Painter] that can handle alpha configuration more optimally should
+     * implement the [applyAlpha] interface and avoid intermediate layer rendering where ever
+     * possible. For example, [Painter] implementations that draw a Bitmap would be able to draw
+     * their contents to the destination with the alpha applied directly without needing an
+     * offscreen buffer. Additionally, drawing a shape with a color applied can modulate the alpha
+     * channel directly without requiring a layer to achieve the same visual effect
      */
     private fun configureAlpha(alpha: Float) {
         if (this.alpha != alpha) {
@@ -133,10 +123,9 @@
     private var layoutDirection: LayoutDirection = LayoutDirection.Ltr
 
     /**
-     * Flag indicating that the contents of the [Painter] should be drawn with
-     * to support locales with right-to-left languages.
-     * Implementations of [Painter] that support right to left contents should implement
-     * the [applyLayoutDirection] method
+     * Flag indicating that the contents of the [Painter] should be drawn with to support locales
+     * with right-to-left languages. Implementations of [Painter] that support right to left
+     * contents should implement the [applyLayoutDirection] method
      */
     private fun configureLayoutDirection(rtl: LayoutDirection) {
         if (this.layoutDirection != rtl) {
@@ -148,45 +137,39 @@
     private val drawLambda: DrawScope.() -> Unit = { onDraw() }
 
     /**
-     * Return the intrinsic size of the [Painter].
-     * If the there is no intrinsic size (i.e. filling bounds with an arbitrary color) return
-     * [Size.Unspecified].
-     * If there is no intrinsic size in a single dimension, return [Size] with
-     * [Float.NaN] in the desired dimension.
-     * If a [Painter] does not have an intrinsic size, it will always draw within the full
-     * bounds of the destination
+     * Return the intrinsic size of the [Painter]. If the there is no intrinsic size (i.e. filling
+     * bounds with an arbitrary color) return [Size.Unspecified]. If there is no intrinsic size in a
+     * single dimension, return [Size] with [Float.NaN] in the desired dimension. If a [Painter]
+     * does not have an intrinsic size, it will always draw within the full bounds of the
+     * destination
      */
     abstract val intrinsicSize: Size
 
     /**
-     * Implementation of drawing logic for instances of [Painter]. This is invoked
-     * internally within [draw] after the positioning and configuring the [Painter]
+     * Implementation of drawing logic for instances of [Painter]. This is invoked internally within
+     * [draw] after the positioning and configuring the [Painter]
      */
     protected abstract fun DrawScope.onDraw()
 
     /**
-     * Apply the provided alpha value returning true if it was applied successfully,
-     * or false if it could not be applied
+     * Apply the provided alpha value returning true if it was applied successfully, or false if it
+     * could not be applied
      */
     protected open fun applyAlpha(alpha: Float): Boolean = false
 
     /**
-     * Apply the provided color filter returning true if it was applied successfully,
-     * or false if it could not be applied
+     * Apply the provided color filter returning true if it was applied successfully, or false if it
+     * could not be applied
      */
     protected open fun applyColorFilter(colorFilter: ColorFilter?): Boolean = false
 
     /**
-     * Apply the appropriate internal configuration to positioning content with the
-     * given [LayoutDirection]
+     * Apply the appropriate internal configuration to positioning content with the given
+     * [LayoutDirection]
      */
     protected open fun applyLayoutDirection(layoutDirection: LayoutDirection): Boolean = false
 
-    fun DrawScope.draw(
-        size: Size,
-        alpha: Float = DefaultAlpha,
-        colorFilter: ColorFilter? = null
-    ) {
+    fun DrawScope.draw(size: Size, alpha: Float = DefaultAlpha, colorFilter: ColorFilter? = null) {
         configureAlpha(alpha)
         configureColorFilter(colorFilter)
         configureLayoutDirection(layoutDirection)
@@ -198,15 +181,12 @@
             right = this.size.width - size.width,
             bottom = this.size.height - size.height
         ) {
-
             if (alpha > 0.0f && size.width > 0 && size.height > 0) {
                 if (useLayer) {
                     val layerRect = Rect(Offset.Zero, Size(size.width, size.height))
                     // TODO (b/154550724) njawad replace with RenderNode/Layer API usage
                     drawIntoCanvas { canvas ->
-                        canvas.withSaveLayer(layerRect, obtainPaint()) {
-                            onDraw()
-                        }
+                        canvas.withSaveLayer(layerRect, obtainPaint()) { onDraw() }
                     }
                 } else {
                     onDraw()
diff --git a/compose/ui/ui-graphics/src/commonMain/kotlin/androidx/compose/ui/graphics/vector/FastFloatParser.kt b/compose/ui/ui-graphics/src/commonMain/kotlin/androidx/compose/ui/graphics/vector/FastFloatParser.kt
index 74d2069..c06e711 100644
--- a/compose/ui/ui-graphics/src/commonMain/kotlin/androidx/compose/ui/graphics/vector/FastFloatParser.kt
+++ b/compose/ui/ui-graphics/src/commonMain/kotlin/androidx/compose/ui/graphics/vector/FastFloatParser.kt
@@ -23,12 +23,10 @@
 import androidx.compose.ui.util.floatFromBits
 
 /**
- * The code below is adapted from:
- *     https://github.com/fastfloat/fast_float
- *     https://github.com/lemire/fast_double_parser/
- * The original C++ implementations are licensed under Apache 2.0
+ * The code below is adapted from: https://github.com/fastfloat/fast_float
+ * https://github.com/lemire/fast_double_parser/ The original C++ implementations are licensed under
+ * Apache 2.0
  */
-
 private const val FloatMinExponent = -10
 private const val FloatMaxExponent = 10
 private const val FloatSmallestExponent = -325
@@ -36,19 +34,20 @@
 
 // internal to bypass synthetic accessor
 @Suppress("MemberVisibilityCanBePrivate")
-internal val PowersOfTen = floatArrayOf(
-    1e0f, 1e1f, 1e2f, 1e3f, 1e4f, 1e5f, 1e6f, 1e7f, 1e8f, 1e9f, 1e10f
-)
+internal val PowersOfTen =
+    floatArrayOf(1e0f, 1e1f, 1e2f, 1e3f, 1e4f, 1e5f, 1e6f, 1e7f, 1e8f, 1e9f, 1e10f)
 
-internal inline val Long.index get() = (this ushr 32).toInt()
-internal inline val Long.floatValue get() = floatFromBits((this and 0xFFFFFFFFL).toInt())
+internal inline val Long.index
+    get() = (this ushr 32).toInt()
+internal inline val Long.floatValue
+    get() = floatFromBits((this and 0xFFFFFFFFL).toInt())
 
 /**
- * Parses the next float in the char sequence [s], starting at offset [start], until at most
- * the end offset [end]. The result is returned as [Long] with the most significant 32 bits
- * encoding the index in the string [s] where parsing stop, and with the least significant
- * 32 bits encoding the parsed float value. To access these values easily, use [Long.index]
- * and [Long.floatValue]. When parsing is unsuccessful, [Long.floatValue] returns NaN.
+ * Parses the next float in the char sequence [s], starting at offset [start], until at most the end
+ * offset [end]. The result is returned as [Long] with the most significant 32 bits encoding the
+ * index in the string [s] where parsing stop, and with the least significant 32 bits encoding the
+ * parsed float value. To access these values easily, use [Long.index] and [Long.floatValue]. When
+ * parsing is unsuccessful, [Long.floatValue] returns NaN.
  */
 internal fun nextFloat(s: String, start: Int, end: Int): Long {
     // NOTE: It would be nice to encode invalid parsing with a NaN marker
@@ -163,8 +162,7 @@
             c = s[retryIndex]
 
             while (
-                retryIndex != significandEndIndex &&
-                significand.toULong() < 1000000000000000000UL
+                retryIndex != significandEndIndex && significand.toULong() < 1000000000000000000UL
             ) {
                 significand = 10L * significand + (c.code - '0'.code).toLong()
                 retryIndex++
@@ -178,8 +176,7 @@
                 c = s[retryIndex]
 
                 while (
-                    retryIndex != exponentEndIndex &&
-                    significand.toULong() < 1000000000000000000UL
+                    retryIndex != exponentEndIndex && significand.toULong() < 1000000000000000000UL
                 ) {
                     significand = 10L * significand + (c.code - '0'.code).toLong()
                     retryIndex++
@@ -191,9 +188,10 @@
     }
 
     // Fast path
-    if (exponent in FloatMinExponent..FloatMaxExponent &&
-        !tooManyDigits &&
-        significand.toULong() <= 1UL shl 24
+    if (
+        exponent in FloatMinExponent..FloatMaxExponent &&
+            !tooManyDigits &&
+            significand.toULong() <= 1UL shl 24
     ) {
         var f = significand.toFloat()
         if (exponent < 0) {
@@ -253,327 +251,646 @@
 
 // internal to bypass synthetic accessor
 @Suppress("MemberVisibilityCanBePrivate")
-internal val Mantissa64 = ulongArrayOf(
-    0xa5ced43b7e3e9188UL, 0xcf42894a5dce35eaUL,
-    0x818995ce7aa0e1b2UL, 0xa1ebfb4219491a1fUL,
-    0xca66fa129f9b60a6UL, 0xfd00b897478238d0UL,
-    0x9e20735e8cb16382UL, 0xc5a890362fddbc62UL,
-    0xf712b443bbd52b7bUL, 0x9a6bb0aa55653b2dUL,
-    0xc1069cd4eabe89f8UL, 0xf148440a256e2c76UL,
-    0x96cd2a865764dbcaUL, 0xbc807527ed3e12bcUL,
-    0xeba09271e88d976bUL, 0x93445b8731587ea3UL,
-    0xb8157268fdae9e4cUL, 0xe61acf033d1a45dfUL,
-    0x8fd0c16206306babUL, 0xb3c4f1ba87bc8696UL,
-    0xe0b62e2929aba83cUL, 0x8c71dcd9ba0b4925UL,
-    0xaf8e5410288e1b6fUL, 0xdb71e91432b1a24aUL,
-    0x892731ac9faf056eUL, 0xab70fe17c79ac6caUL,
-    0xd64d3d9db981787dUL, 0x85f0468293f0eb4eUL,
-    0xa76c582338ed2621UL, 0xd1476e2c07286faaUL,
-    0x82cca4db847945caUL, 0xa37fce126597973cUL,
-    0xcc5fc196fefd7d0cUL, 0xff77b1fcbebcdc4fUL,
-    0x9faacf3df73609b1UL, 0xc795830d75038c1dUL,
-    0xf97ae3d0d2446f25UL, 0x9becce62836ac577UL,
-    0xc2e801fb244576d5UL, 0xf3a20279ed56d48aUL,
-    0x9845418c345644d6UL, 0xbe5691ef416bd60cUL,
-    0xedec366b11c6cb8fUL, 0x94b3a202eb1c3f39UL,
-    0xb9e08a83a5e34f07UL, 0xe858ad248f5c22c9UL,
-    0x91376c36d99995beUL, 0xb58547448ffffb2dUL,
-    0xe2e69915b3fff9f9UL, 0x8dd01fad907ffc3bUL,
-    0xb1442798f49ffb4aUL, 0xdd95317f31c7fa1dUL,
-    0x8a7d3eef7f1cfc52UL, 0xad1c8eab5ee43b66UL,
-    0xd863b256369d4a40UL, 0x873e4f75e2224e68UL,
-    0xa90de3535aaae202UL, 0xd3515c2831559a83UL,
-    0x8412d9991ed58091UL, 0xa5178fff668ae0b6UL,
-    0xce5d73ff402d98e3UL, 0x80fa687f881c7f8eUL,
-    0xa139029f6a239f72UL, 0xc987434744ac874eUL,
-    0xfbe9141915d7a922UL, 0x9d71ac8fada6c9b5UL,
-    0xc4ce17b399107c22UL, 0xf6019da07f549b2bUL,
-    0x99c102844f94e0fbUL, 0xc0314325637a1939UL,
-    0xf03d93eebc589f88UL, 0x96267c7535b763b5UL,
-    0xbbb01b9283253ca2UL, 0xea9c227723ee8bcbUL,
-    0x92a1958a7675175fUL, 0xb749faed14125d36UL,
-    0xe51c79a85916f484UL, 0x8f31cc0937ae58d2UL,
-    0xb2fe3f0b8599ef07UL, 0xdfbdcece67006ac9UL,
-    0x8bd6a141006042bdUL, 0xaecc49914078536dUL,
-    0xda7f5bf590966848UL, 0x888f99797a5e012dUL,
-    0xaab37fd7d8f58178UL, 0xd5605fcdcf32e1d6UL,
-    0x855c3be0a17fcd26UL, 0xa6b34ad8c9dfc06fUL,
-    0xd0601d8efc57b08bUL, 0x823c12795db6ce57UL,
-    0xa2cb1717b52481edUL, 0xcb7ddcdda26da268UL,
-    0xfe5d54150b090b02UL, 0x9efa548d26e5a6e1UL,
-    0xc6b8e9b0709f109aUL, 0xf867241c8cc6d4c0UL,
-    0x9b407691d7fc44f8UL, 0xc21094364dfb5636UL,
-    0xf294b943e17a2bc4UL, 0x979cf3ca6cec5b5aUL,
-    0xbd8430bd08277231UL, 0xece53cec4a314ebdUL,
-    0x940f4613ae5ed136UL, 0xb913179899f68584UL,
-    0xe757dd7ec07426e5UL, 0x9096ea6f3848984fUL,
-    0xb4bca50b065abe63UL, 0xe1ebce4dc7f16dfbUL,
-    0x8d3360f09cf6e4bdUL, 0xb080392cc4349decUL,
-    0xdca04777f541c567UL, 0x89e42caaf9491b60UL,
-    0xac5d37d5b79b6239UL, 0xd77485cb25823ac7UL,
-    0x86a8d39ef77164bcUL, 0xa8530886b54dbdebUL,
-    0xd267caa862a12d66UL, 0x8380dea93da4bc60UL,
-    0xa46116538d0deb78UL, 0xcd795be870516656UL,
-    0x806bd9714632dff6UL, 0xa086cfcd97bf97f3UL,
-    0xc8a883c0fdaf7df0UL, 0xfad2a4b13d1b5d6cUL,
-    0x9cc3a6eec6311a63UL, 0xc3f490aa77bd60fcUL,
-    0xf4f1b4d515acb93bUL, 0x991711052d8bf3c5UL,
-    0xbf5cd54678eef0b6UL, 0xef340a98172aace4UL,
-    0x9580869f0e7aac0eUL, 0xbae0a846d2195712UL,
-    0xe998d258869facd7UL, 0x91ff83775423cc06UL,
-    0xb67f6455292cbf08UL, 0xe41f3d6a7377eecaUL,
-    0x8e938662882af53eUL, 0xb23867fb2a35b28dUL,
-    0xdec681f9f4c31f31UL, 0x8b3c113c38f9f37eUL,
-    0xae0b158b4738705eUL, 0xd98ddaee19068c76UL,
-    0x87f8a8d4cfa417c9UL, 0xa9f6d30a038d1dbcUL,
-    0xd47487cc8470652bUL, 0x84c8d4dfd2c63f3bUL,
-    0xa5fb0a17c777cf09UL, 0xcf79cc9db955c2ccUL,
-    0x81ac1fe293d599bfUL, 0xa21727db38cb002fUL,
-    0xca9cf1d206fdc03bUL, 0xfd442e4688bd304aUL,
-    0x9e4a9cec15763e2eUL, 0xc5dd44271ad3cdbaUL,
-    0xf7549530e188c128UL, 0x9a94dd3e8cf578b9UL,
-    0xc13a148e3032d6e7UL, 0xf18899b1bc3f8ca1UL,
-    0x96f5600f15a7b7e5UL, 0xbcb2b812db11a5deUL,
-    0xebdf661791d60f56UL, 0x936b9fcebb25c995UL,
-    0xb84687c269ef3bfbUL, 0xe65829b3046b0afaUL,
-    0x8ff71a0fe2c2e6dcUL, 0xb3f4e093db73a093UL,
-    0xe0f218b8d25088b8UL, 0x8c974f7383725573UL,
-    0xafbd2350644eeacfUL, 0xdbac6c247d62a583UL,
-    0x894bc396ce5da772UL, 0xab9eb47c81f5114fUL,
-    0xd686619ba27255a2UL, 0x8613fd0145877585UL,
-    0xa798fc4196e952e7UL, 0xd17f3b51fca3a7a0UL,
-    0x82ef85133de648c4UL, 0xa3ab66580d5fdaf5UL,
-    0xcc963fee10b7d1b3UL, 0xffbbcfe994e5c61fUL,
-    0x9fd561f1fd0f9bd3UL, 0xc7caba6e7c5382c8UL,
-    0xf9bd690a1b68637bUL, 0x9c1661a651213e2dUL,
-    0xc31bfa0fe5698db8UL, 0xf3e2f893dec3f126UL,
-    0x986ddb5c6b3a76b7UL, 0xbe89523386091465UL,
-    0xee2ba6c0678b597fUL, 0x94db483840b717efUL,
-    0xba121a4650e4ddebUL, 0xe896a0d7e51e1566UL,
-    0x915e2486ef32cd60UL, 0xb5b5ada8aaff80b8UL,
-    0xe3231912d5bf60e6UL, 0x8df5efabc5979c8fUL,
-    0xb1736b96b6fd83b3UL, 0xddd0467c64bce4a0UL,
-    0x8aa22c0dbef60ee4UL, 0xad4ab7112eb3929dUL,
-    0xd89d64d57a607744UL, 0x87625f056c7c4a8bUL,
-    0xa93af6c6c79b5d2dUL, 0xd389b47879823479UL,
-    0x843610cb4bf160cbUL, 0xa54394fe1eedb8feUL,
-    0xce947a3da6a9273eUL, 0x811ccc668829b887UL,
-    0xa163ff802a3426a8UL, 0xc9bcff6034c13052UL,
-    0xfc2c3f3841f17c67UL, 0x9d9ba7832936edc0UL,
-    0xc5029163f384a931UL, 0xf64335bcf065d37dUL,
-    0x99ea0196163fa42eUL, 0xc06481fb9bcf8d39UL,
-    0xf07da27a82c37088UL, 0x964e858c91ba2655UL,
-    0xbbe226efb628afeaUL, 0xeadab0aba3b2dbe5UL,
-    0x92c8ae6b464fc96fUL, 0xb77ada0617e3bbcbUL,
-    0xe55990879ddcaabdUL, 0x8f57fa54c2a9eab6UL,
-    0xb32df8e9f3546564UL, 0xdff9772470297ebdUL,
-    0x8bfbea76c619ef36UL, 0xaefae51477a06b03UL,
-    0xdab99e59958885c4UL, 0x88b402f7fd75539bUL,
-    0xaae103b5fcd2a881UL, 0xd59944a37c0752a2UL,
-    0x857fcae62d8493a5UL, 0xa6dfbd9fb8e5b88eUL,
-    0xd097ad07a71f26b2UL, 0x825ecc24c873782fUL,
-    0xa2f67f2dfa90563bUL, 0xcbb41ef979346bcaUL,
-    0xfea126b7d78186bcUL, 0x9f24b832e6b0f436UL,
-    0xc6ede63fa05d3143UL, 0xf8a95fcf88747d94UL,
-    0x9b69dbe1b548ce7cUL, 0xc24452da229b021bUL,
-    0xf2d56790ab41c2a2UL, 0x97c560ba6b0919a5UL,
-    0xbdb6b8e905cb600fUL, 0xed246723473e3813UL,
-    0x9436c0760c86e30bUL, 0xb94470938fa89bceUL,
-    0xe7958cb87392c2c2UL, 0x90bd77f3483bb9b9UL,
-    0xb4ecd5f01a4aa828UL, 0xe2280b6c20dd5232UL,
-    0x8d590723948a535fUL, 0xb0af48ec79ace837UL,
-    0xdcdb1b2798182244UL, 0x8a08f0f8bf0f156bUL,
-    0xac8b2d36eed2dac5UL, 0xd7adf884aa879177UL,
-    0x86ccbb52ea94baeaUL, 0xa87fea27a539e9a5UL,
-    0xd29fe4b18e88640eUL, 0x83a3eeeef9153e89UL,
-    0xa48ceaaab75a8e2bUL, 0xcdb02555653131b6UL,
-    0x808e17555f3ebf11UL, 0xa0b19d2ab70e6ed6UL,
-    0xc8de047564d20a8bUL, 0xfb158592be068d2eUL,
-    0x9ced737bb6c4183dUL, 0xc428d05aa4751e4cUL,
-    0xf53304714d9265dfUL, 0x993fe2c6d07b7fabUL,
-    0xbf8fdb78849a5f96UL, 0xef73d256a5c0f77cUL,
-    0x95a8637627989aadUL, 0xbb127c53b17ec159UL,
-    0xe9d71b689dde71afUL, 0x9226712162ab070dUL,
-    0xb6b00d69bb55c8d1UL, 0xe45c10c42a2b3b05UL,
-    0x8eb98a7a9a5b04e3UL, 0xb267ed1940f1c61cUL,
-    0xdf01e85f912e37a3UL, 0x8b61313bbabce2c6UL,
-    0xae397d8aa96c1b77UL, 0xd9c7dced53c72255UL,
-    0x881cea14545c7575UL, 0xaa242499697392d2UL,
-    0xd4ad2dbfc3d07787UL, 0x84ec3c97da624ab4UL,
-    0xa6274bbdd0fadd61UL, 0xcfb11ead453994baUL,
-    0x81ceb32c4b43fcf4UL, 0xa2425ff75e14fc31UL,
-    0xcad2f7f5359a3b3eUL, 0xfd87b5f28300ca0dUL,
-    0x9e74d1b791e07e48UL, 0xc612062576589ddaUL,
-    0xf79687aed3eec551UL, 0x9abe14cd44753b52UL,
-    0xc16d9a0095928a27UL, 0xf1c90080baf72cb1UL,
-    0x971da05074da7beeUL, 0xbce5086492111aeaUL,
-    0xec1e4a7db69561a5UL, 0x9392ee8e921d5d07UL,
-    0xb877aa3236a4b449UL, 0xe69594bec44de15bUL,
-    0x901d7cf73ab0acd9UL, 0xb424dc35095cd80fUL,
-    0xe12e13424bb40e13UL, 0x8cbccc096f5088cbUL,
-    0xafebff0bcb24aafeUL, 0xdbe6fecebdedd5beUL,
-    0x89705f4136b4a597UL, 0xabcc77118461cefcUL,
-    0xd6bf94d5e57a42bcUL, 0x8637bd05af6c69b5UL,
-    0xa7c5ac471b478423UL, 0xd1b71758e219652bUL,
-    0x83126e978d4fdf3bUL, 0xa3d70a3d70a3d70aUL,
-    0xccccccccccccccccUL, 0x8000000000000000UL,
-    0xa000000000000000UL, 0xc800000000000000UL,
-    0xfa00000000000000UL, 0x9c40000000000000UL,
-    0xc350000000000000UL, 0xf424000000000000UL,
-    0x9896800000000000UL, 0xbebc200000000000UL,
-    0xee6b280000000000UL, 0x9502f90000000000UL,
-    0xba43b74000000000UL, 0xe8d4a51000000000UL,
-    0x9184e72a00000000UL, 0xb5e620f480000000UL,
-    0xe35fa931a0000000UL, 0x8e1bc9bf04000000UL,
-    0xb1a2bc2ec5000000UL, 0xde0b6b3a76400000UL,
-    0x8ac7230489e80000UL, 0xad78ebc5ac620000UL,
-    0xd8d726b7177a8000UL, 0x878678326eac9000UL,
-    0xa968163f0a57b400UL, 0xd3c21bcecceda100UL,
-    0x84595161401484a0UL, 0xa56fa5b99019a5c8UL,
-    0xcecb8f27f4200f3aUL, 0x813f3978f8940984UL,
-    0xa18f07d736b90be5UL, 0xc9f2c9cd04674edeUL,
-    0xfc6f7c4045812296UL, 0x9dc5ada82b70b59dUL,
-    0xc5371912364ce305UL, 0xf684df56c3e01bc6UL,
-    0x9a130b963a6c115cUL, 0xc097ce7bc90715b3UL,
-    0xf0bdc21abb48db20UL, 0x96769950b50d88f4UL,
-    0xbc143fa4e250eb31UL, 0xeb194f8e1ae525fdUL,
-    0x92efd1b8d0cf37beUL, 0xb7abc627050305adUL,
-    0xe596b7b0c643c719UL, 0x8f7e32ce7bea5c6fUL,
-    0xb35dbf821ae4f38bUL, 0xe0352f62a19e306eUL,
-    0x8c213d9da502de45UL, 0xaf298d050e4395d6UL,
-    0xdaf3f04651d47b4cUL, 0x88d8762bf324cd0fUL,
-    0xab0e93b6efee0053UL, 0xd5d238a4abe98068UL,
-    0x85a36366eb71f041UL, 0xa70c3c40a64e6c51UL,
-    0xd0cf4b50cfe20765UL, 0x82818f1281ed449fUL,
-    0xa321f2d7226895c7UL, 0xcbea6f8ceb02bb39UL,
-    0xfee50b7025c36a08UL, 0x9f4f2726179a2245UL,
-    0xc722f0ef9d80aad6UL, 0xf8ebad2b84e0d58bUL,
-    0x9b934c3b330c8577UL, 0xc2781f49ffcfa6d5UL,
-    0xf316271c7fc3908aUL, 0x97edd871cfda3a56UL,
-    0xbde94e8e43d0c8ecUL, 0xed63a231d4c4fb27UL,
-    0x945e455f24fb1cf8UL, 0xb975d6b6ee39e436UL,
-    0xe7d34c64a9c85d44UL, 0x90e40fbeea1d3a4aUL,
-    0xb51d13aea4a488ddUL, 0xe264589a4dcdab14UL,
-    0x8d7eb76070a08aecUL, 0xb0de65388cc8ada8UL,
-    0xdd15fe86affad912UL, 0x8a2dbf142dfcc7abUL,
-    0xacb92ed9397bf996UL, 0xd7e77a8f87daf7fbUL,
-    0x86f0ac99b4e8dafdUL, 0xa8acd7c0222311bcUL,
-    0xd2d80db02aabd62bUL, 0x83c7088e1aab65dbUL,
-    0xa4b8cab1a1563f52UL, 0xcde6fd5e09abcf26UL,
-    0x80b05e5ac60b6178UL, 0xa0dc75f1778e39d6UL,
-    0xc913936dd571c84cUL, 0xfb5878494ace3a5fUL,
-    0x9d174b2dcec0e47bUL, 0xc45d1df942711d9aUL,
-    0xf5746577930d6500UL, 0x9968bf6abbe85f20UL,
-    0xbfc2ef456ae276e8UL, 0xefb3ab16c59b14a2UL,
-    0x95d04aee3b80ece5UL, 0xbb445da9ca61281fUL,
-    0xea1575143cf97226UL, 0x924d692ca61be758UL,
-    0xb6e0c377cfa2e12eUL, 0xe498f455c38b997aUL,
-    0x8edf98b59a373fecUL, 0xb2977ee300c50fe7UL,
-    0xdf3d5e9bc0f653e1UL, 0x8b865b215899f46cUL,
-    0xae67f1e9aec07187UL, 0xda01ee641a708de9UL,
-    0x884134fe908658b2UL, 0xaa51823e34a7eedeUL,
-    0xd4e5e2cdc1d1ea96UL, 0x850fadc09923329eUL,
-    0xa6539930bf6bff45UL, 0xcfe87f7cef46ff16UL,
-    0x81f14fae158c5f6eUL, 0xa26da3999aef7749UL,
-    0xcb090c8001ab551cUL, 0xfdcb4fa002162a63UL,
-    0x9e9f11c4014dda7eUL, 0xc646d63501a1511dUL,
-    0xf7d88bc24209a565UL, 0x9ae757596946075fUL,
-    0xc1a12d2fc3978937UL, 0xf209787bb47d6b84UL,
-    0x9745eb4d50ce6332UL, 0xbd176620a501fbffUL,
-    0xec5d3fa8ce427affUL, 0x93ba47c980e98cdfUL,
-    0xb8a8d9bbe123f017UL, 0xe6d3102ad96cec1dUL,
-    0x9043ea1ac7e41392UL, 0xb454e4a179dd1877UL,
-    0xe16a1dc9d8545e94UL, 0x8ce2529e2734bb1dUL,
-    0xb01ae745b101e9e4UL, 0xdc21a1171d42645dUL,
-    0x899504ae72497ebaUL, 0xabfa45da0edbde69UL,
-    0xd6f8d7509292d603UL, 0x865b86925b9bc5c2UL,
-    0xa7f26836f282b732UL, 0xd1ef0244af2364ffUL,
-    0x8335616aed761f1fUL, 0xa402b9c5a8d3a6e7UL,
-    0xcd036837130890a1UL, 0x802221226be55a64UL,
-    0xa02aa96b06deb0fdUL, 0xc83553c5c8965d3dUL,
-    0xfa42a8b73abbf48cUL, 0x9c69a97284b578d7UL,
-    0xc38413cf25e2d70dUL, 0xf46518c2ef5b8cd1UL,
-    0x98bf2f79d5993802UL, 0xbeeefb584aff8603UL,
-    0xeeaaba2e5dbf6784UL, 0x952ab45cfa97a0b2UL,
-    0xba756174393d88dfUL, 0xe912b9d1478ceb17UL,
-    0x91abb422ccb812eeUL, 0xb616a12b7fe617aaUL,
-    0xe39c49765fdf9d94UL, 0x8e41ade9fbebc27dUL,
-    0xb1d219647ae6b31cUL, 0xde469fbd99a05fe3UL,
-    0x8aec23d680043beeUL, 0xada72ccc20054ae9UL,
-    0xd910f7ff28069da4UL, 0x87aa9aff79042286UL,
-    0xa99541bf57452b28UL, 0xd3fa922f2d1675f2UL,
-    0x847c9b5d7c2e09b7UL, 0xa59bc234db398c25UL,
-    0xcf02b2c21207ef2eUL, 0x8161afb94b44f57dUL,
-    0xa1ba1ba79e1632dcUL, 0xca28a291859bbf93UL,
-    0xfcb2cb35e702af78UL, 0x9defbf01b061adabUL,
-    0xc56baec21c7a1916UL, 0xf6c69a72a3989f5bUL,
-    0x9a3c2087a63f6399UL, 0xc0cb28a98fcf3c7fUL,
-    0xf0fdf2d3f3c30b9fUL, 0x969eb7c47859e743UL,
-    0xbc4665b596706114UL, 0xeb57ff22fc0c7959UL,
-    0x9316ff75dd87cbd8UL, 0xb7dcbf5354e9beceUL,
-    0xe5d3ef282a242e81UL, 0x8fa475791a569d10UL,
-    0xb38d92d760ec4455UL, 0xe070f78d3927556aUL,
-    0x8c469ab843b89562UL, 0xaf58416654a6babbUL,
-    0xdb2e51bfe9d0696aUL, 0x88fcf317f22241e2UL,
-    0xab3c2fddeeaad25aUL, 0xd60b3bd56a5586f1UL,
-    0x85c7056562757456UL, 0xa738c6bebb12d16cUL,
-    0xd106f86e69d785c7UL, 0x82a45b450226b39cUL,
-    0xa34d721642b06084UL, 0xcc20ce9bd35c78a5UL,
-    0xff290242c83396ceUL, 0x9f79a169bd203e41UL,
-    0xc75809c42c684dd1UL, 0xf92e0c3537826145UL,
-    0x9bbcc7a142b17ccbUL, 0xc2abf989935ddbfeUL,
-    0xf356f7ebf83552feUL, 0x98165af37b2153deUL,
-    0xbe1bf1b059e9a8d6UL, 0xeda2ee1c7064130cUL,
-    0x9485d4d1c63e8be7UL, 0xb9a74a0637ce2ee1UL,
-    0xe8111c87c5c1ba99UL, 0x910ab1d4db9914a0UL,
-    0xb54d5e4a127f59c8UL, 0xe2a0b5dc971f303aUL,
-    0x8da471a9de737e24UL, 0xb10d8e1456105dadUL,
-    0xdd50f1996b947518UL, 0x8a5296ffe33cc92fUL,
-    0xace73cbfdc0bfb7bUL, 0xd8210befd30efa5aUL,
-    0x8714a775e3e95c78UL, 0xa8d9d1535ce3b396UL,
-    0xd31045a8341ca07cUL, 0x83ea2b892091e44dUL,
-    0xa4e4b66b68b65d60UL, 0xce1de40642e3f4b9UL,
-    0x80d2ae83e9ce78f3UL, 0xa1075a24e4421730UL,
-    0xc94930ae1d529cfcUL, 0xfb9b7cd9a4a7443cUL,
-    0x9d412e0806e88aa5UL, 0xc491798a08a2ad4eUL,
-    0xf5b5d7ec8acb58a2UL, 0x9991a6f3d6bf1765UL,
-    0xbff610b0cc6edd3fUL, 0xeff394dcff8a948eUL,
-    0x95f83d0a1fb69cd9UL, 0xbb764c4ca7a4440fUL,
-    0xea53df5fd18d5513UL, 0x92746b9be2f8552cUL,
-    0xb7118682dbb66a77UL, 0xe4d5e82392a40515UL,
-    0x8f05b1163ba6832dUL, 0xb2c71d5bca9023f8UL,
-    0xdf78e4b2bd342cf6UL, 0x8bab8eefb6409c1aUL,
-    0xae9672aba3d0c320UL, 0xda3c0f568cc4f3e8UL,
-    0x8865899617fb1871UL, 0xaa7eebfb9df9de8dUL,
-    0xd51ea6fa85785631UL, 0x8533285c936b35deUL,
-    0xa67ff273b8460356UL, 0xd01fef10a657842cUL,
-    0x8213f56a67f6b29bUL, 0xa298f2c501f45f42UL,
-    0xcb3f2f7642717713UL, 0xfe0efb53d30dd4d7UL,
-    0x9ec95d1463e8a506UL, 0xc67bb4597ce2ce48UL,
-    0xf81aa16fdc1b81daUL, 0x9b10a4e5e9913128UL,
-    0xc1d4ce1f63f57d72UL, 0xf24a01a73cf2dccfUL,
-    0x976e41088617ca01UL, 0xbd49d14aa79dbc82UL,
-    0xec9c459d51852ba2UL, 0x93e1ab8252f33b45UL,
-    0xb8da1662e7b00a17UL, 0xe7109bfba19c0c9dUL,
-    0x906a617d450187e2UL, 0xb484f9dc9641e9daUL,
-    0xe1a63853bbd26451UL, 0x8d07e33455637eb2UL,
-    0xb049dc016abc5e5fUL, 0xdc5c5301c56b75f7UL,
-    0x89b9b3e11b6329baUL, 0xac2820d9623bf429UL,
-    0xd732290fbacaf133UL, 0x867f59a9d4bed6c0UL,
-    0xa81f301449ee8c70UL, 0xd226fc195c6a2f8cUL,
-    0x83585d8fd9c25db7UL, 0xa42e74f3d032f525UL,
-    0xcd3a1230c43fb26fUL, 0x80444b5e7aa7cf85UL,
-    0xa0555e361951c366UL, 0xc86ab5c39fa63440UL,
-    0xfa856334878fc150UL, 0x9c935e00d4b9d8d2UL,
-    0xc3b8358109e84f07UL, 0xf4a642e14c6262c8UL,
-    0x98e7e9cccfbd7dbdUL, 0xbf21e44003acdd2cUL,
-    0xeeea5d5004981478UL, 0x95527a5202df0ccbUL,
-    0xbaa718e68396cffdUL, 0xe950df20247c83fdUL,
-    0x91d28b7416cdd27eUL, 0xb6472e511c81471dUL,
-    0xe3d8f9e563a198e5UL, 0x8e679c2f5e44ff8fUL
-)
+internal val Mantissa64 =
+    ulongArrayOf(
+        0xa5ced43b7e3e9188UL,
+        0xcf42894a5dce35eaUL,
+        0x818995ce7aa0e1b2UL,
+        0xa1ebfb4219491a1fUL,
+        0xca66fa129f9b60a6UL,
+        0xfd00b897478238d0UL,
+        0x9e20735e8cb16382UL,
+        0xc5a890362fddbc62UL,
+        0xf712b443bbd52b7bUL,
+        0x9a6bb0aa55653b2dUL,
+        0xc1069cd4eabe89f8UL,
+        0xf148440a256e2c76UL,
+        0x96cd2a865764dbcaUL,
+        0xbc807527ed3e12bcUL,
+        0xeba09271e88d976bUL,
+        0x93445b8731587ea3UL,
+        0xb8157268fdae9e4cUL,
+        0xe61acf033d1a45dfUL,
+        0x8fd0c16206306babUL,
+        0xb3c4f1ba87bc8696UL,
+        0xe0b62e2929aba83cUL,
+        0x8c71dcd9ba0b4925UL,
+        0xaf8e5410288e1b6fUL,
+        0xdb71e91432b1a24aUL,
+        0x892731ac9faf056eUL,
+        0xab70fe17c79ac6caUL,
+        0xd64d3d9db981787dUL,
+        0x85f0468293f0eb4eUL,
+        0xa76c582338ed2621UL,
+        0xd1476e2c07286faaUL,
+        0x82cca4db847945caUL,
+        0xa37fce126597973cUL,
+        0xcc5fc196fefd7d0cUL,
+        0xff77b1fcbebcdc4fUL,
+        0x9faacf3df73609b1UL,
+        0xc795830d75038c1dUL,
+        0xf97ae3d0d2446f25UL,
+        0x9becce62836ac577UL,
+        0xc2e801fb244576d5UL,
+        0xf3a20279ed56d48aUL,
+        0x9845418c345644d6UL,
+        0xbe5691ef416bd60cUL,
+        0xedec366b11c6cb8fUL,
+        0x94b3a202eb1c3f39UL,
+        0xb9e08a83a5e34f07UL,
+        0xe858ad248f5c22c9UL,
+        0x91376c36d99995beUL,
+        0xb58547448ffffb2dUL,
+        0xe2e69915b3fff9f9UL,
+        0x8dd01fad907ffc3bUL,
+        0xb1442798f49ffb4aUL,
+        0xdd95317f31c7fa1dUL,
+        0x8a7d3eef7f1cfc52UL,
+        0xad1c8eab5ee43b66UL,
+        0xd863b256369d4a40UL,
+        0x873e4f75e2224e68UL,
+        0xa90de3535aaae202UL,
+        0xd3515c2831559a83UL,
+        0x8412d9991ed58091UL,
+        0xa5178fff668ae0b6UL,
+        0xce5d73ff402d98e3UL,
+        0x80fa687f881c7f8eUL,
+        0xa139029f6a239f72UL,
+        0xc987434744ac874eUL,
+        0xfbe9141915d7a922UL,
+        0x9d71ac8fada6c9b5UL,
+        0xc4ce17b399107c22UL,
+        0xf6019da07f549b2bUL,
+        0x99c102844f94e0fbUL,
+        0xc0314325637a1939UL,
+        0xf03d93eebc589f88UL,
+        0x96267c7535b763b5UL,
+        0xbbb01b9283253ca2UL,
+        0xea9c227723ee8bcbUL,
+        0x92a1958a7675175fUL,
+        0xb749faed14125d36UL,
+        0xe51c79a85916f484UL,
+        0x8f31cc0937ae58d2UL,
+        0xb2fe3f0b8599ef07UL,
+        0xdfbdcece67006ac9UL,
+        0x8bd6a141006042bdUL,
+        0xaecc49914078536dUL,
+        0xda7f5bf590966848UL,
+        0x888f99797a5e012dUL,
+        0xaab37fd7d8f58178UL,
+        0xd5605fcdcf32e1d6UL,
+        0x855c3be0a17fcd26UL,
+        0xa6b34ad8c9dfc06fUL,
+        0xd0601d8efc57b08bUL,
+        0x823c12795db6ce57UL,
+        0xa2cb1717b52481edUL,
+        0xcb7ddcdda26da268UL,
+        0xfe5d54150b090b02UL,
+        0x9efa548d26e5a6e1UL,
+        0xc6b8e9b0709f109aUL,
+        0xf867241c8cc6d4c0UL,
+        0x9b407691d7fc44f8UL,
+        0xc21094364dfb5636UL,
+        0xf294b943e17a2bc4UL,
+        0x979cf3ca6cec5b5aUL,
+        0xbd8430bd08277231UL,
+        0xece53cec4a314ebdUL,
+        0x940f4613ae5ed136UL,
+        0xb913179899f68584UL,
+        0xe757dd7ec07426e5UL,
+        0x9096ea6f3848984fUL,
+        0xb4bca50b065abe63UL,
+        0xe1ebce4dc7f16dfbUL,
+        0x8d3360f09cf6e4bdUL,
+        0xb080392cc4349decUL,
+        0xdca04777f541c567UL,
+        0x89e42caaf9491b60UL,
+        0xac5d37d5b79b6239UL,
+        0xd77485cb25823ac7UL,
+        0x86a8d39ef77164bcUL,
+        0xa8530886b54dbdebUL,
+        0xd267caa862a12d66UL,
+        0x8380dea93da4bc60UL,
+        0xa46116538d0deb78UL,
+        0xcd795be870516656UL,
+        0x806bd9714632dff6UL,
+        0xa086cfcd97bf97f3UL,
+        0xc8a883c0fdaf7df0UL,
+        0xfad2a4b13d1b5d6cUL,
+        0x9cc3a6eec6311a63UL,
+        0xc3f490aa77bd60fcUL,
+        0xf4f1b4d515acb93bUL,
+        0x991711052d8bf3c5UL,
+        0xbf5cd54678eef0b6UL,
+        0xef340a98172aace4UL,
+        0x9580869f0e7aac0eUL,
+        0xbae0a846d2195712UL,
+        0xe998d258869facd7UL,
+        0x91ff83775423cc06UL,
+        0xb67f6455292cbf08UL,
+        0xe41f3d6a7377eecaUL,
+        0x8e938662882af53eUL,
+        0xb23867fb2a35b28dUL,
+        0xdec681f9f4c31f31UL,
+        0x8b3c113c38f9f37eUL,
+        0xae0b158b4738705eUL,
+        0xd98ddaee19068c76UL,
+        0x87f8a8d4cfa417c9UL,
+        0xa9f6d30a038d1dbcUL,
+        0xd47487cc8470652bUL,
+        0x84c8d4dfd2c63f3bUL,
+        0xa5fb0a17c777cf09UL,
+        0xcf79cc9db955c2ccUL,
+        0x81ac1fe293d599bfUL,
+        0xa21727db38cb002fUL,
+        0xca9cf1d206fdc03bUL,
+        0xfd442e4688bd304aUL,
+        0x9e4a9cec15763e2eUL,
+        0xc5dd44271ad3cdbaUL,
+        0xf7549530e188c128UL,
+        0x9a94dd3e8cf578b9UL,
+        0xc13a148e3032d6e7UL,
+        0xf18899b1bc3f8ca1UL,
+        0x96f5600f15a7b7e5UL,
+        0xbcb2b812db11a5deUL,
+        0xebdf661791d60f56UL,
+        0x936b9fcebb25c995UL,
+        0xb84687c269ef3bfbUL,
+        0xe65829b3046b0afaUL,
+        0x8ff71a0fe2c2e6dcUL,
+        0xb3f4e093db73a093UL,
+        0xe0f218b8d25088b8UL,
+        0x8c974f7383725573UL,
+        0xafbd2350644eeacfUL,
+        0xdbac6c247d62a583UL,
+        0x894bc396ce5da772UL,
+        0xab9eb47c81f5114fUL,
+        0xd686619ba27255a2UL,
+        0x8613fd0145877585UL,
+        0xa798fc4196e952e7UL,
+        0xd17f3b51fca3a7a0UL,
+        0x82ef85133de648c4UL,
+        0xa3ab66580d5fdaf5UL,
+        0xcc963fee10b7d1b3UL,
+        0xffbbcfe994e5c61fUL,
+        0x9fd561f1fd0f9bd3UL,
+        0xc7caba6e7c5382c8UL,
+        0xf9bd690a1b68637bUL,
+        0x9c1661a651213e2dUL,
+        0xc31bfa0fe5698db8UL,
+        0xf3e2f893dec3f126UL,
+        0x986ddb5c6b3a76b7UL,
+        0xbe89523386091465UL,
+        0xee2ba6c0678b597fUL,
+        0x94db483840b717efUL,
+        0xba121a4650e4ddebUL,
+        0xe896a0d7e51e1566UL,
+        0x915e2486ef32cd60UL,
+        0xb5b5ada8aaff80b8UL,
+        0xe3231912d5bf60e6UL,
+        0x8df5efabc5979c8fUL,
+        0xb1736b96b6fd83b3UL,
+        0xddd0467c64bce4a0UL,
+        0x8aa22c0dbef60ee4UL,
+        0xad4ab7112eb3929dUL,
+        0xd89d64d57a607744UL,
+        0x87625f056c7c4a8bUL,
+        0xa93af6c6c79b5d2dUL,
+        0xd389b47879823479UL,
+        0x843610cb4bf160cbUL,
+        0xa54394fe1eedb8feUL,
+        0xce947a3da6a9273eUL,
+        0x811ccc668829b887UL,
+        0xa163ff802a3426a8UL,
+        0xc9bcff6034c13052UL,
+        0xfc2c3f3841f17c67UL,
+        0x9d9ba7832936edc0UL,
+        0xc5029163f384a931UL,
+        0xf64335bcf065d37dUL,
+        0x99ea0196163fa42eUL,
+        0xc06481fb9bcf8d39UL,
+        0xf07da27a82c37088UL,
+        0x964e858c91ba2655UL,
+        0xbbe226efb628afeaUL,
+        0xeadab0aba3b2dbe5UL,
+        0x92c8ae6b464fc96fUL,
+        0xb77ada0617e3bbcbUL,
+        0xe55990879ddcaabdUL,
+        0x8f57fa54c2a9eab6UL,
+        0xb32df8e9f3546564UL,
+        0xdff9772470297ebdUL,
+        0x8bfbea76c619ef36UL,
+        0xaefae51477a06b03UL,
+        0xdab99e59958885c4UL,
+        0x88b402f7fd75539bUL,
+        0xaae103b5fcd2a881UL,
+        0xd59944a37c0752a2UL,
+        0x857fcae62d8493a5UL,
+        0xa6dfbd9fb8e5b88eUL,
+        0xd097ad07a71f26b2UL,
+        0x825ecc24c873782fUL,
+        0xa2f67f2dfa90563bUL,
+        0xcbb41ef979346bcaUL,
+        0xfea126b7d78186bcUL,
+        0x9f24b832e6b0f436UL,
+        0xc6ede63fa05d3143UL,
+        0xf8a95fcf88747d94UL,
+        0x9b69dbe1b548ce7cUL,
+        0xc24452da229b021bUL,
+        0xf2d56790ab41c2a2UL,
+        0x97c560ba6b0919a5UL,
+        0xbdb6b8e905cb600fUL,
+        0xed246723473e3813UL,
+        0x9436c0760c86e30bUL,
+        0xb94470938fa89bceUL,
+        0xe7958cb87392c2c2UL,
+        0x90bd77f3483bb9b9UL,
+        0xb4ecd5f01a4aa828UL,
+        0xe2280b6c20dd5232UL,
+        0x8d590723948a535fUL,
+        0xb0af48ec79ace837UL,
+        0xdcdb1b2798182244UL,
+        0x8a08f0f8bf0f156bUL,
+        0xac8b2d36eed2dac5UL,
+        0xd7adf884aa879177UL,
+        0x86ccbb52ea94baeaUL,
+        0xa87fea27a539e9a5UL,
+        0xd29fe4b18e88640eUL,
+        0x83a3eeeef9153e89UL,
+        0xa48ceaaab75a8e2bUL,
+        0xcdb02555653131b6UL,
+        0x808e17555f3ebf11UL,
+        0xa0b19d2ab70e6ed6UL,
+        0xc8de047564d20a8bUL,
+        0xfb158592be068d2eUL,
+        0x9ced737bb6c4183dUL,
+        0xc428d05aa4751e4cUL,
+        0xf53304714d9265dfUL,
+        0x993fe2c6d07b7fabUL,
+        0xbf8fdb78849a5f96UL,
+        0xef73d256a5c0f77cUL,
+        0x95a8637627989aadUL,
+        0xbb127c53b17ec159UL,
+        0xe9d71b689dde71afUL,
+        0x9226712162ab070dUL,
+        0xb6b00d69bb55c8d1UL,
+        0xe45c10c42a2b3b05UL,
+        0x8eb98a7a9a5b04e3UL,
+        0xb267ed1940f1c61cUL,
+        0xdf01e85f912e37a3UL,
+        0x8b61313bbabce2c6UL,
+        0xae397d8aa96c1b77UL,
+        0xd9c7dced53c72255UL,
+        0x881cea14545c7575UL,
+        0xaa242499697392d2UL,
+        0xd4ad2dbfc3d07787UL,
+        0x84ec3c97da624ab4UL,
+        0xa6274bbdd0fadd61UL,
+        0xcfb11ead453994baUL,
+        0x81ceb32c4b43fcf4UL,
+        0xa2425ff75e14fc31UL,
+        0xcad2f7f5359a3b3eUL,
+        0xfd87b5f28300ca0dUL,
+        0x9e74d1b791e07e48UL,
+        0xc612062576589ddaUL,
+        0xf79687aed3eec551UL,
+        0x9abe14cd44753b52UL,
+        0xc16d9a0095928a27UL,
+        0xf1c90080baf72cb1UL,
+        0x971da05074da7beeUL,
+        0xbce5086492111aeaUL,
+        0xec1e4a7db69561a5UL,
+        0x9392ee8e921d5d07UL,
+        0xb877aa3236a4b449UL,
+        0xe69594bec44de15bUL,
+        0x901d7cf73ab0acd9UL,
+        0xb424dc35095cd80fUL,
+        0xe12e13424bb40e13UL,
+        0x8cbccc096f5088cbUL,
+        0xafebff0bcb24aafeUL,
+        0xdbe6fecebdedd5beUL,
+        0x89705f4136b4a597UL,
+        0xabcc77118461cefcUL,
+        0xd6bf94d5e57a42bcUL,
+        0x8637bd05af6c69b5UL,
+        0xa7c5ac471b478423UL,
+        0xd1b71758e219652bUL,
+        0x83126e978d4fdf3bUL,
+        0xa3d70a3d70a3d70aUL,
+        0xccccccccccccccccUL,
+        0x8000000000000000UL,
+        0xa000000000000000UL,
+        0xc800000000000000UL,
+        0xfa00000000000000UL,
+        0x9c40000000000000UL,
+        0xc350000000000000UL,
+        0xf424000000000000UL,
+        0x9896800000000000UL,
+        0xbebc200000000000UL,
+        0xee6b280000000000UL,
+        0x9502f90000000000UL,
+        0xba43b74000000000UL,
+        0xe8d4a51000000000UL,
+        0x9184e72a00000000UL,
+        0xb5e620f480000000UL,
+        0xe35fa931a0000000UL,
+        0x8e1bc9bf04000000UL,
+        0xb1a2bc2ec5000000UL,
+        0xde0b6b3a76400000UL,
+        0x8ac7230489e80000UL,
+        0xad78ebc5ac620000UL,
+        0xd8d726b7177a8000UL,
+        0x878678326eac9000UL,
+        0xa968163f0a57b400UL,
+        0xd3c21bcecceda100UL,
+        0x84595161401484a0UL,
+        0xa56fa5b99019a5c8UL,
+        0xcecb8f27f4200f3aUL,
+        0x813f3978f8940984UL,
+        0xa18f07d736b90be5UL,
+        0xc9f2c9cd04674edeUL,
+        0xfc6f7c4045812296UL,
+        0x9dc5ada82b70b59dUL,
+        0xc5371912364ce305UL,
+        0xf684df56c3e01bc6UL,
+        0x9a130b963a6c115cUL,
+        0xc097ce7bc90715b3UL,
+        0xf0bdc21abb48db20UL,
+        0x96769950b50d88f4UL,
+        0xbc143fa4e250eb31UL,
+        0xeb194f8e1ae525fdUL,
+        0x92efd1b8d0cf37beUL,
+        0xb7abc627050305adUL,
+        0xe596b7b0c643c719UL,
+        0x8f7e32ce7bea5c6fUL,
+        0xb35dbf821ae4f38bUL,
+        0xe0352f62a19e306eUL,
+        0x8c213d9da502de45UL,
+        0xaf298d050e4395d6UL,
+        0xdaf3f04651d47b4cUL,
+        0x88d8762bf324cd0fUL,
+        0xab0e93b6efee0053UL,
+        0xd5d238a4abe98068UL,
+        0x85a36366eb71f041UL,
+        0xa70c3c40a64e6c51UL,
+        0xd0cf4b50cfe20765UL,
+        0x82818f1281ed449fUL,
+        0xa321f2d7226895c7UL,
+        0xcbea6f8ceb02bb39UL,
+        0xfee50b7025c36a08UL,
+        0x9f4f2726179a2245UL,
+        0xc722f0ef9d80aad6UL,
+        0xf8ebad2b84e0d58bUL,
+        0x9b934c3b330c8577UL,
+        0xc2781f49ffcfa6d5UL,
+        0xf316271c7fc3908aUL,
+        0x97edd871cfda3a56UL,
+        0xbde94e8e43d0c8ecUL,
+        0xed63a231d4c4fb27UL,
+        0x945e455f24fb1cf8UL,
+        0xb975d6b6ee39e436UL,
+        0xe7d34c64a9c85d44UL,
+        0x90e40fbeea1d3a4aUL,
+        0xb51d13aea4a488ddUL,
+        0xe264589a4dcdab14UL,
+        0x8d7eb76070a08aecUL,
+        0xb0de65388cc8ada8UL,
+        0xdd15fe86affad912UL,
+        0x8a2dbf142dfcc7abUL,
+        0xacb92ed9397bf996UL,
+        0xd7e77a8f87daf7fbUL,
+        0x86f0ac99b4e8dafdUL,
+        0xa8acd7c0222311bcUL,
+        0xd2d80db02aabd62bUL,
+        0x83c7088e1aab65dbUL,
+        0xa4b8cab1a1563f52UL,
+        0xcde6fd5e09abcf26UL,
+        0x80b05e5ac60b6178UL,
+        0xa0dc75f1778e39d6UL,
+        0xc913936dd571c84cUL,
+        0xfb5878494ace3a5fUL,
+        0x9d174b2dcec0e47bUL,
+        0xc45d1df942711d9aUL,
+        0xf5746577930d6500UL,
+        0x9968bf6abbe85f20UL,
+        0xbfc2ef456ae276e8UL,
+        0xefb3ab16c59b14a2UL,
+        0x95d04aee3b80ece5UL,
+        0xbb445da9ca61281fUL,
+        0xea1575143cf97226UL,
+        0x924d692ca61be758UL,
+        0xb6e0c377cfa2e12eUL,
+        0xe498f455c38b997aUL,
+        0x8edf98b59a373fecUL,
+        0xb2977ee300c50fe7UL,
+        0xdf3d5e9bc0f653e1UL,
+        0x8b865b215899f46cUL,
+        0xae67f1e9aec07187UL,
+        0xda01ee641a708de9UL,
+        0x884134fe908658b2UL,
+        0xaa51823e34a7eedeUL,
+        0xd4e5e2cdc1d1ea96UL,
+        0x850fadc09923329eUL,
+        0xa6539930bf6bff45UL,
+        0xcfe87f7cef46ff16UL,
+        0x81f14fae158c5f6eUL,
+        0xa26da3999aef7749UL,
+        0xcb090c8001ab551cUL,
+        0xfdcb4fa002162a63UL,
+        0x9e9f11c4014dda7eUL,
+        0xc646d63501a1511dUL,
+        0xf7d88bc24209a565UL,
+        0x9ae757596946075fUL,
+        0xc1a12d2fc3978937UL,
+        0xf209787bb47d6b84UL,
+        0x9745eb4d50ce6332UL,
+        0xbd176620a501fbffUL,
+        0xec5d3fa8ce427affUL,
+        0x93ba47c980e98cdfUL,
+        0xb8a8d9bbe123f017UL,
+        0xe6d3102ad96cec1dUL,
+        0x9043ea1ac7e41392UL,
+        0xb454e4a179dd1877UL,
+        0xe16a1dc9d8545e94UL,
+        0x8ce2529e2734bb1dUL,
+        0xb01ae745b101e9e4UL,
+        0xdc21a1171d42645dUL,
+        0x899504ae72497ebaUL,
+        0xabfa45da0edbde69UL,
+        0xd6f8d7509292d603UL,
+        0x865b86925b9bc5c2UL,
+        0xa7f26836f282b732UL,
+        0xd1ef0244af2364ffUL,
+        0x8335616aed761f1fUL,
+        0xa402b9c5a8d3a6e7UL,
+        0xcd036837130890a1UL,
+        0x802221226be55a64UL,
+        0xa02aa96b06deb0fdUL,
+        0xc83553c5c8965d3dUL,
+        0xfa42a8b73abbf48cUL,
+        0x9c69a97284b578d7UL,
+        0xc38413cf25e2d70dUL,
+        0xf46518c2ef5b8cd1UL,
+        0x98bf2f79d5993802UL,
+        0xbeeefb584aff8603UL,
+        0xeeaaba2e5dbf6784UL,
+        0x952ab45cfa97a0b2UL,
+        0xba756174393d88dfUL,
+        0xe912b9d1478ceb17UL,
+        0x91abb422ccb812eeUL,
+        0xb616a12b7fe617aaUL,
+        0xe39c49765fdf9d94UL,
+        0x8e41ade9fbebc27dUL,
+        0xb1d219647ae6b31cUL,
+        0xde469fbd99a05fe3UL,
+        0x8aec23d680043beeUL,
+        0xada72ccc20054ae9UL,
+        0xd910f7ff28069da4UL,
+        0x87aa9aff79042286UL,
+        0xa99541bf57452b28UL,
+        0xd3fa922f2d1675f2UL,
+        0x847c9b5d7c2e09b7UL,
+        0xa59bc234db398c25UL,
+        0xcf02b2c21207ef2eUL,
+        0x8161afb94b44f57dUL,
+        0xa1ba1ba79e1632dcUL,
+        0xca28a291859bbf93UL,
+        0xfcb2cb35e702af78UL,
+        0x9defbf01b061adabUL,
+        0xc56baec21c7a1916UL,
+        0xf6c69a72a3989f5bUL,
+        0x9a3c2087a63f6399UL,
+        0xc0cb28a98fcf3c7fUL,
+        0xf0fdf2d3f3c30b9fUL,
+        0x969eb7c47859e743UL,
+        0xbc4665b596706114UL,
+        0xeb57ff22fc0c7959UL,
+        0x9316ff75dd87cbd8UL,
+        0xb7dcbf5354e9beceUL,
+        0xe5d3ef282a242e81UL,
+        0x8fa475791a569d10UL,
+        0xb38d92d760ec4455UL,
+        0xe070f78d3927556aUL,
+        0x8c469ab843b89562UL,
+        0xaf58416654a6babbUL,
+        0xdb2e51bfe9d0696aUL,
+        0x88fcf317f22241e2UL,
+        0xab3c2fddeeaad25aUL,
+        0xd60b3bd56a5586f1UL,
+        0x85c7056562757456UL,
+        0xa738c6bebb12d16cUL,
+        0xd106f86e69d785c7UL,
+        0x82a45b450226b39cUL,
+        0xa34d721642b06084UL,
+        0xcc20ce9bd35c78a5UL,
+        0xff290242c83396ceUL,
+        0x9f79a169bd203e41UL,
+        0xc75809c42c684dd1UL,
+        0xf92e0c3537826145UL,
+        0x9bbcc7a142b17ccbUL,
+        0xc2abf989935ddbfeUL,
+        0xf356f7ebf83552feUL,
+        0x98165af37b2153deUL,
+        0xbe1bf1b059e9a8d6UL,
+        0xeda2ee1c7064130cUL,
+        0x9485d4d1c63e8be7UL,
+        0xb9a74a0637ce2ee1UL,
+        0xe8111c87c5c1ba99UL,
+        0x910ab1d4db9914a0UL,
+        0xb54d5e4a127f59c8UL,
+        0xe2a0b5dc971f303aUL,
+        0x8da471a9de737e24UL,
+        0xb10d8e1456105dadUL,
+        0xdd50f1996b947518UL,
+        0x8a5296ffe33cc92fUL,
+        0xace73cbfdc0bfb7bUL,
+        0xd8210befd30efa5aUL,
+        0x8714a775e3e95c78UL,
+        0xa8d9d1535ce3b396UL,
+        0xd31045a8341ca07cUL,
+        0x83ea2b892091e44dUL,
+        0xa4e4b66b68b65d60UL,
+        0xce1de40642e3f4b9UL,
+        0x80d2ae83e9ce78f3UL,
+        0xa1075a24e4421730UL,
+        0xc94930ae1d529cfcUL,
+        0xfb9b7cd9a4a7443cUL,
+        0x9d412e0806e88aa5UL,
+        0xc491798a08a2ad4eUL,
+        0xf5b5d7ec8acb58a2UL,
+        0x9991a6f3d6bf1765UL,
+        0xbff610b0cc6edd3fUL,
+        0xeff394dcff8a948eUL,
+        0x95f83d0a1fb69cd9UL,
+        0xbb764c4ca7a4440fUL,
+        0xea53df5fd18d5513UL,
+        0x92746b9be2f8552cUL,
+        0xb7118682dbb66a77UL,
+        0xe4d5e82392a40515UL,
+        0x8f05b1163ba6832dUL,
+        0xb2c71d5bca9023f8UL,
+        0xdf78e4b2bd342cf6UL,
+        0x8bab8eefb6409c1aUL,
+        0xae9672aba3d0c320UL,
+        0xda3c0f568cc4f3e8UL,
+        0x8865899617fb1871UL,
+        0xaa7eebfb9df9de8dUL,
+        0xd51ea6fa85785631UL,
+        0x8533285c936b35deUL,
+        0xa67ff273b8460356UL,
+        0xd01fef10a657842cUL,
+        0x8213f56a67f6b29bUL,
+        0xa298f2c501f45f42UL,
+        0xcb3f2f7642717713UL,
+        0xfe0efb53d30dd4d7UL,
+        0x9ec95d1463e8a506UL,
+        0xc67bb4597ce2ce48UL,
+        0xf81aa16fdc1b81daUL,
+        0x9b10a4e5e9913128UL,
+        0xc1d4ce1f63f57d72UL,
+        0xf24a01a73cf2dccfUL,
+        0x976e41088617ca01UL,
+        0xbd49d14aa79dbc82UL,
+        0xec9c459d51852ba2UL,
+        0x93e1ab8252f33b45UL,
+        0xb8da1662e7b00a17UL,
+        0xe7109bfba19c0c9dUL,
+        0x906a617d450187e2UL,
+        0xb484f9dc9641e9daUL,
+        0xe1a63853bbd26451UL,
+        0x8d07e33455637eb2UL,
+        0xb049dc016abc5e5fUL,
+        0xdc5c5301c56b75f7UL,
+        0x89b9b3e11b6329baUL,
+        0xac2820d9623bf429UL,
+        0xd732290fbacaf133UL,
+        0x867f59a9d4bed6c0UL,
+        0xa81f301449ee8c70UL,
+        0xd226fc195c6a2f8cUL,
+        0x83585d8fd9c25db7UL,
+        0xa42e74f3d032f525UL,
+        0xcd3a1230c43fb26fUL,
+        0x80444b5e7aa7cf85UL,
+        0xa0555e361951c366UL,
+        0xc86ab5c39fa63440UL,
+        0xfa856334878fc150UL,
+        0x9c935e00d4b9d8d2UL,
+        0xc3b8358109e84f07UL,
+        0xf4a642e14c6262c8UL,
+        0x98e7e9cccfbd7dbdUL,
+        0xbf21e44003acdd2cUL,
+        0xeeea5d5004981478UL,
+        0x95527a5202df0ccbUL,
+        0xbaa718e68396cffdUL,
+        0xe950df20247c83fdUL,
+        0x91d28b7416cdd27eUL,
+        0xb6472e511c81471dUL,
+        0xe3d8f9e563a198e5UL,
+        0x8e679c2f5e44ff8fUL
+    )
 
-internal inline val Char.isDigit get() = (this - '0').toChar().code < 10
+internal inline val Char.isDigit
+    get() = (this - '0').toChar().code < 10
 
 private inline fun pack(index: Int, value: Float): Long {
     return (index.toLong() shl 32) or (value.toRawBits().toLong() and 0xFFFFFFFFL)
@@ -590,19 +907,17 @@
     val yTimesXMid = xHi * yLo
     val xTimesYLo = xLo * yLo
 
-    val carry =
-        yTimesXMid +
-        (xTimesYLo ushr 32) +
-        (xTimesYMid and 0xffffffffL)
+    val carry = yTimesXMid + (xTimesYLo ushr 32) + (xTimesYMid and 0xffffffffL)
 
     return xTimesYHi + (carry ushr 32) + (xTimesYMid ushr 32)
 }
 
 private inline fun parseFourDigits(str: String, offset: Int): Int {
-    val v = (str[offset].code.toLong()
-        or (str[offset + 1].code.toLong() shl 16)
-        or (str[offset + 2].code.toLong() shl 32)
-        or (str[offset + 3].code.toLong() shl 48))
+    val v =
+        (str[offset].code.toLong() or
+            (str[offset + 1].code.toLong() shl 16) or
+            (str[offset + 2].code.toLong() shl 32) or
+            (str[offset + 3].code.toLong() shl 48))
 
     val base = v - 0x0030003000300030L
     val predicate = v + 0x0046004600460046L or base
diff --git a/compose/ui/ui-graphics/src/commonMain/kotlin/androidx/compose/ui/graphics/vector/PathBuilder.kt b/compose/ui/ui-graphics/src/commonMain/kotlin/androidx/compose/ui/graphics/vector/PathBuilder.kt
index f1781a5..5c44f4a 100644
--- a/compose/ui/ui-graphics/src/commonMain/kotlin/androidx/compose/ui/graphics/vector/PathBuilder.kt
+++ b/compose/ui/ui-graphics/src/commonMain/kotlin/androidx/compose/ui/graphics/vector/PathBuilder.kt
@@ -16,31 +16,23 @@
 
 package androidx.compose.ui.graphics.vector
 
-/**
- * [PathBuilder] provides a fluent API to creates a list of [PathNode], used to
- * describe a path.
- */
+/** [PathBuilder] provides a fluent API to creates a list of [PathNode], used to describe a path. */
 class PathBuilder {
     // 88% of Material icons use 32 or fewer path nodes
     private val _nodes = ArrayList<PathNode>(32)
 
-    /**
-     * Returns the list of [PathNode] currently held in this builder.
-     */
+    /** Returns the list of [PathNode] currently held in this builder. */
     val nodes: List<PathNode>
         get() = _nodes
 
-    /**
-     * Closes the current contour by adding a [PathNode.Close] to [nodes].
-     */
+    /** Closes the current contour by adding a [PathNode.Close] to [nodes]. */
     fun close(): PathBuilder {
         _nodes.add(PathNode.Close)
         return this
     }
 
     /**
-     * Start a new contour at position ([x], [y]) by adding a
-     * [PathNode.MoveTo] to [nodes].
+     * Start a new contour at position ([x], [y]) by adding a [PathNode.MoveTo] to [nodes].
      *
      * @param x The x coordinate of the start of the new contour
      * @param y The y coordinate of the start of the new contour
@@ -51,8 +43,8 @@
     }
 
     /**
-     * Start a new contour at the offset ([dx], [dy]) relative to the
-     * last path position by adding a [PathNode.RelativeMoveTo] to [nodes].
+     * Start a new contour at the offset ([dx], [dy]) relative to the last path position by adding a
+     * [PathNode.RelativeMoveTo] to [nodes].
      *
      * @param dx The x offset of the start of the new contour, relative to the last path position
      * @param dy The y offset of the start of the new contour, relative to the last path position
@@ -63,9 +55,9 @@
     }
 
     /**
-     * Add a line from the last point to the position ([x], [y]) by adding
-     * a [PathNode.LineTo] to [nodes]. If no contour has been created by calling
-     * [moveTo] first, the origin of the line is set to (0, 0).
+     * Add a line from the last point to the position ([x], [y]) by adding a [PathNode.LineTo] to
+     * [nodes]. If no contour has been created by calling [moveTo] first, the origin of the line is
+     * set to (0, 0).
      *
      * @param x The x coordinate of the end of the line
      * @param y The y coordinate of the end of the line
@@ -76,10 +68,9 @@
     }
 
     /**
-     * Add a line from the last point to the offset ([dx], [dy]) relative to the
-     * last point by adding a [PathNode.RelativeLineTo] to [nodes]. If no contour
-     * has been created by calling [moveTo] first, the origin of the line is set
-     * to (0, 0).
+     * Add a line from the last point to the offset ([dx], [dy]) relative to the last point by
+     * adding a [PathNode.RelativeLineTo] to [nodes]. If no contour has been created by calling
+     * [moveTo] first, the origin of the line is set to (0, 0).
      *
      * @param dx The x offset of the end of the line, relative to the last path position
      * @param dy The y offset of the end of the line, relative to the last path position
@@ -90,10 +81,9 @@
     }
 
     /**
-     * Add a line from the last point to the position ([x], `oy`), where `oy` is
-     * the y coordinate of the last point, by adding a [PathNode.HorizontalTo] to
-     * [nodes]. If no contour has been created by calling [moveTo] first, the
-     * origin of the line is set to (0, 0).
+     * Add a line from the last point to the position ([x], `oy`), where `oy` is the y coordinate of
+     * the last point, by adding a [PathNode.HorizontalTo] to [nodes]. If no contour has been
+     * created by calling [moveTo] first, the origin of the line is set to (0, 0).
      *
      * @param x The x coordinate of the end of the line
      */
@@ -103,10 +93,9 @@
     }
 
     /**
-     * Add a line from the last point to the position ([dx] `+ ox`, `oy`),
-     * where `ox` and `oy` are the x and y coordinates of the last point,
-     * by adding a [PathNode.RelativeHorizontalTo] to [nodes]. If no contour
-     * has been created by calling [moveTo] first, the origin of the line is
+     * Add a line from the last point to the position ([dx] `+ ox`, `oy`), where `ox` and `oy` are
+     * the x and y coordinates of the last point, by adding a [PathNode.RelativeHorizontalTo] to
+     * [nodes]. If no contour has been created by calling [moveTo] first, the origin of the line is
      * set to (0, 0).
      *
      * @param dx The x offset of the end of the line, relative to the last path position
@@ -117,10 +106,9 @@
     }
 
     /**
-     * Add a line from the last point to the position (`ox`, [y]), where `ox` is
-     * the x coordinate of the last point, by adding a [PathNode.VerticalTo] to
-     * [nodes]. If no contour has been created by calling [moveTo] first, the
-     * origin of the line is set to (0, 0).
+     * Add a line from the last point to the position (`ox`, [y]), where `ox` is the x coordinate of
+     * the last point, by adding a [PathNode.VerticalTo] to [nodes]. If no contour has been created
+     * by calling [moveTo] first, the origin of the line is set to (0, 0).
      *
      * @param y The y coordinate of the end of the line
      */
@@ -130,10 +118,9 @@
     }
 
     /**
-     * Add a line from the last point to the position (`ox`, [dy] `+ oy`),
-     * where `ox` and `oy` are the x and y coordinates of the last point,
-     * by adding a [PathNode.RelativeVerticalTo] to [nodes]. If no contour
-     * has been created by calling [moveTo] first, the origin of the line is
+     * Add a line from the last point to the position (`ox`, [dy] `+ oy`), where `ox` and `oy` are
+     * the x and y coordinates of the last point, by adding a [PathNode.RelativeVerticalTo] to
+     * [nodes]. If no contour has been created by calling [moveTo] first, the origin of the line is
      * set to (0, 0).
      *
      * @param dy The y offset of the end of the line, relative to the last path position
@@ -144,10 +131,9 @@
     }
 
     /**
-     * Add a cubic Bézier from the last point to the position ([x3], [y3]),
-     * approaching the control points ([x1], [y1]) and ([x2], [y2]), by adding a
-     * [PathNode.CurveTo] to [nodes]. If no contour has been created by calling
-     * [moveTo] first, the origin of the curve is set to (0, 0).
+     * Add a cubic Bézier from the last point to the position ([x3], [y3]), approaching the control
+     * points ([x1], [y1]) and ([x2], [y2]), by adding a [PathNode.CurveTo] to [nodes]. If no
+     * contour has been created by calling [moveTo] first, the origin of the curve is set to (0, 0).
      *
      * @param x1 The x coordinate of the first control point of the cubic curve
      * @param y1 The y coordinate of the first control point of the cubic curve
@@ -156,36 +142,28 @@
      * @param x3 The x coordinate of the end point of the cubic curve
      * @param y3 The y coordinate of the end point of the cubic curve
      */
-    fun curveTo(
-        x1: Float,
-        y1: Float,
-        x2: Float,
-        y2: Float,
-        x3: Float,
-        y3: Float
-    ): PathBuilder {
+    fun curveTo(x1: Float, y1: Float, x2: Float, y2: Float, x3: Float, y3: Float): PathBuilder {
         _nodes.add(PathNode.CurveTo(x1, y1, x2, y2, x3, y3))
         return this
     }
 
     /**
-     * Add a cubic Bézier by adding a [PathNode.CurveTo] to [nodes]. If no contour
-     * has been created by calling [moveTo] first, the origin of the curve is set to
-     * (0, 0). The cubic Bézier control and end points are defined by offsets relative
-     * to the last point.
+     * Add a cubic Bézier by adding a [PathNode.CurveTo] to [nodes]. If no contour has been created
+     * by calling [moveTo] first, the origin of the curve is set to (0, 0). The cubic Bézier control
+     * and end points are defined by offsets relative to the last point.
      *
-     * @param dx1 The x offset of the first control point of the cubic curve, relative
-     *            to the last path position
-     * @param dy1 The y offset of the first control point of the cubic curve, relative
-     *            to the last path position
-     * @param dx2 The x offset of the second control point of the cubic curve, relative
-     *            to the last path position
-     * @param dy2 The y offset of the second control point of the cubic curve, relative
-     *            to the last path position
-     * @param dx3 The x offset of the end point of the cubic curve, relative to the
-     *            last path position
-     * @param dy3 The y offset of the end point of the cubic curve, relative to the
-     *            last path position
+     * @param dx1 The x offset of the first control point of the cubic curve, relative to the last
+     *   path position
+     * @param dy1 The y offset of the first control point of the cubic curve, relative to the last
+     *   path position
+     * @param dx2 The x offset of the second control point of the cubic curve, relative to the last
+     *   path position
+     * @param dy2 The y offset of the second control point of the cubic curve, relative to the last
+     *   path position
+     * @param dx3 The x offset of the end point of the cubic curve, relative to the last path
+     *   position
+     * @param dy3 The y offset of the end point of the cubic curve, relative to the last path
+     *   position
      */
     fun curveToRelative(
         dx1: Float,
@@ -200,13 +178,12 @@
     }
 
     /**
-     * Add a cubic Bézier from the last point to the position ([x2], [y2]). The first
-     * control point is the reflection of the second control point of the previous
-     * command. If there is no previous command or the previous command is not a cubic
-     * Bézier, the first control point is set to the last path position. The second
-     * control point is defined by ([x1], [y1]). Calling this method adds a
-     * [PathNode.ReflectiveCurveTo] to [nodes]. If no contour has been created by calling
-     * [moveTo] first, the origin of the curve is set to (0, 0).
+     * Add a cubic Bézier from the last point to the position ([x2], [y2]). The first control point
+     * is the reflection of the second control point of the previous command. If there is no
+     * previous command or the previous command is not a cubic Bézier, the first control point is
+     * set to the last path position. The second control point is defined by ([x1], [y1]). Calling
+     * this method adds a [PathNode.ReflectiveCurveTo] to [nodes]. If no contour has been created by
+     * calling [moveTo] first, the origin of the curve is set to (0, 0).
      *
      * @param x1 The x coordinate of the second control point of the cubic curve
      * @param y1 The y coordinate of the second control point of the cubic curve
@@ -219,20 +196,19 @@
     }
 
     /**
-     * Add a cubic Bézier by adding a [PathNode.RelativeReflectiveCurveTo] to [nodes].
-     * If no contour has been created by calling [moveTo] first, the origin of the
-     * curve is set to (0, 0). The cubic Bézier second control point and end points
-     * are defined by offsets relative to the last point. The reflective nature of
-     * the curve is described in [reflectiveCurveTo].
+     * Add a cubic Bézier by adding a [PathNode.RelativeReflectiveCurveTo] to [nodes]. If no contour
+     * has been created by calling [moveTo] first, the origin of the curve is set to (0, 0). The
+     * cubic Bézier second control point and end points are defined by offsets relative to the last
+     * point. The reflective nature of the curve is described in [reflectiveCurveTo].
      *
-     * @param dx1 The x offset of the second control point of the cubic curve, relative
-     *            to the last path position
-     * @param dy1 The y offset of the second control point of the cubic curve, relative
-     *            to the last path position
-     * @param dx2 The x offset of the end point of the cubic curve, relative to the
-     *            last path position
-     * @param dy2 The y offset of the end point of the cubic curve, relative to the
-     *            last path position
+     * @param dx1 The x offset of the second control point of the cubic curve, relative to the last
+     *   path position
+     * @param dy1 The y offset of the second control point of the cubic curve, relative to the last
+     *   path position
+     * @param dx2 The x offset of the end point of the cubic curve, relative to the last path
+     *   position
+     * @param dy2 The y offset of the end point of the cubic curve, relative to the last path
+     *   position
      */
     fun reflectiveCurveToRelative(dx1: Float, dy1: Float, dx2: Float, dy2: Float): PathBuilder {
         _nodes.add(PathNode.RelativeReflectiveCurveTo(dx1, dy1, dx2, dy2))
@@ -240,10 +216,9 @@
     }
 
     /**
-     * Add a quadratic Bézier from the last point to the position ([x2], [y2]),
-     * approaching the control point ([x1], [y1]), by adding a [PathNode.QuadTo]
-     * to [nodes]. If no contour has been created by calling [moveTo] first, the
-     * origin of the curve is set to (0, 0).
+     * Add a quadratic Bézier from the last point to the position ([x2], [y2]), approaching the
+     * control point ([x1], [y1]), by adding a [PathNode.QuadTo] to [nodes]. If no contour has been
+     * created by calling [moveTo] first, the origin of the curve is set to (0, 0).
      *
      * @param x1 The x coordinate of the control point of the quadratic curve
      * @param y1 The y coordinate of the control point of the quadratic curve
@@ -256,19 +231,18 @@
     }
 
     /**
-     * Add a quadratic Bézier by adding a [PathNode.RelativeQuadTo] to [nodes].
-     * If no contour has been created by calling [moveTo] first, the origin of
-     * the curve is set to (0, 0). The control point and end point of the curve
-     * are defined by offsets relative to the last point.
+     * Add a quadratic Bézier by adding a [PathNode.RelativeQuadTo] to [nodes]. If no contour has
+     * been created by calling [moveTo] first, the origin of the curve is set to (0, 0). The control
+     * point and end point of the curve are defined by offsets relative to the last point.
      *
-     * @param dx1 The x offset of the control point of the quadratic curve, relative
-     *            to the last path position
-     * @param dy1 The y offset of the control point of the quadratic curve, relative
-     *            to the last path position
-     * @param dx2 The x offset of the end point of the quadratic curve, relative
-     *            to the last path position
-     * @param dy2 The y offset of the end point of the quadratic curve, relative
-     *            to the last path position
+     * @param dx1 The x offset of the control point of the quadratic curve, relative to the last
+     *   path position
+     * @param dy1 The y offset of the control point of the quadratic curve, relative to the last
+     *   path position
+     * @param dx2 The x offset of the end point of the quadratic curve, relative to the last path
+     *   position
+     * @param dy2 The y offset of the end point of the quadratic curve, relative to the last path
+     *   position
      */
     fun quadToRelative(dx1: Float, dy1: Float, dx2: Float, dy2: Float): PathBuilder {
         _nodes.add(PathNode.RelativeQuadTo(dx1, dy1, dx2, dy2))
@@ -276,12 +250,11 @@
     }
 
     /**
-     * Add a quadratic Bézier from the last point to the position ([x1], [y1]). The
-     * control point is the reflection of the control point of the previous command.
-     * If there is no previous command or the previous command is not a quadratic
-     * Bézier, the control point is set to the last path position. Calling this method
-     * adds a [PathNode.ReflectiveQuadTo] to [nodes]. If no contour has been created
-     * by calling [moveTo] first, the origin of the curve is set to (0, 0).
+     * Add a quadratic Bézier from the last point to the position ([x1], [y1]). The control point is
+     * the reflection of the control point of the previous command. If there is no previous command
+     * or the previous command is not a quadratic Bézier, the control point is set to the last path
+     * position. Calling this method adds a [PathNode.ReflectiveQuadTo] to [nodes]. If no contour
+     * has been created by calling [moveTo] first, the origin of the curve is set to (0, 0).
      *
      * @param x1 The x coordinate of the end point of the quadratic curve
      * @param y1 The y coordinate of the end point of the quadratic curve
@@ -292,16 +265,15 @@
     }
 
     /**
-     * Add a quadratic Bézier by adding a [PathNode.RelativeReflectiveQuadTo] to [nodes].
-     * If no contour has been created by calling [moveTo] first, the origin of the
-     * curve is set to (0, 0). The quadratic Bézier end point is defined by an offset
-     * relative to the last point. The reflective nature of the curve is described in
-     * [reflectiveQuadTo].
+     * Add a quadratic Bézier by adding a [PathNode.RelativeReflectiveQuadTo] to [nodes]. If no
+     * contour has been created by calling [moveTo] first, the origin of the curve is set to (0, 0).
+     * The quadratic Bézier end point is defined by an offset relative to the last point. The
+     * reflective nature of the curve is described in [reflectiveQuadTo].
      *
-     * @param dx1 The x offset of the end point of the quadratic curve, relative to the
-     *            last path position
-     * @param dy1 The y offset of the end point of the quadratic curve, relative to the
-     *            last path position
+     * @param dx1 The x offset of the end point of the quadratic curve, relative to the last path
+     *   position
+     * @param dy1 The y offset of the end point of the quadratic curve, relative to the last path
+     *   position
      */
     fun reflectiveQuadToRelative(dx1: Float, dy1: Float): PathBuilder {
         _nodes.add(PathNode.RelativeReflectiveQuadTo(dx1, dy1))
@@ -310,31 +282,28 @@
 
     /**
      * Add an elliptical arc from the last point to the position ([x1], [y1]) by adding
-     * [PathNode.ArcTo] to [nodes]. If no contour has been created by calling [moveTo]
-     * first, the origin of the arc is set to (0, 0).
+     * [PathNode.ArcTo] to [nodes]. If no contour has been created by calling [moveTo] first, the
+     * origin of the arc is set to (0, 0).
      *
      * The ellipse is defined by 3 parameters:
-     * - [horizontalEllipseRadius] and [verticalEllipseRadius] to define the size of the
-     *   ellipse
+     * - [horizontalEllipseRadius] and [verticalEllipseRadius] to define the size of the ellipse
      * - [theta] to define the orientation (as an X-axis rotation) of the ellipse
      *
-     * In most situations, there are four arc candidates that can be drawn from the origin
-     * to ([x1], [y1]). Which of the arcs is used is influenced by [isMoreThanHalf] and
-     * [isPositiveArc].
+     * In most situations, there are four arc candidates that can be drawn from the origin to ([x1],
+     * [y1]). Which of the arcs is used is influenced by [isMoreThanHalf] and [isPositiveArc].
      *
-     * When [isMoreThanHalf] is set to `true`, the added arc will be chosen amongst the
-     * two candidates that represent an arc sweep greater than or equal to 180 degrees.
+     * When [isMoreThanHalf] is set to `true`, the added arc will be chosen amongst the two
+     * candidates that represent an arc sweep greater than or equal to 180 degrees.
      *
-     * When [isPositiveArc] is set to `true`, the added arc will be chosen amongst the
-     * two candidates with a positive-angle direction (counter-clockwise)
+     * When [isPositiveArc] is set to `true`, the added arc will be chosen amongst the two
+     * candidates with a positive-angle direction (counter-clockwise)
      *
      * @param horizontalEllipseRadius The horizontal radius of the ellipse
      * @param verticalEllipseRadius The vertical radius of the ellipse
      * @param theta The rotation of the ellipse around the X-axis, in degrees
-     * @param isMoreThanHalf Defines whether to use an arc candidate with a sweep greater
-     *        than or equal to 180 degrees
-     * @param isPositiveArc Defines whether to use an arc candidate that's
-     *        counter-clockwise or not
+     * @param isMoreThanHalf Defines whether to use an arc candidate with a sweep greater than or
+     *   equal to 180 degrees
+     * @param isPositiveArc Defines whether to use an arc candidate that's counter-clockwise or not
      * @param x1 The x coordinate of the end point of the arc
      * @param y1 The y coordinate of the end point of the arc
      */
@@ -362,32 +331,29 @@
     }
 
     /**
-     * Add an elliptical arc by adding [PathNode.RelativeArcTo] to [nodes]. If no contour
-     * has been created by calling [moveTo] first, the origin of the arc is set to (0, 0).
-     * The arc Bézier end point is defined by an offset relative to the last point.
+     * Add an elliptical arc by adding [PathNode.RelativeArcTo] to [nodes]. If no contour has been
+     * created by calling [moveTo] first, the origin of the arc is set to (0, 0). The arc Bézier end
+     * point is defined by an offset relative to the last point.
      *
      * The ellipse is defined by 3 parameters:
-     * - [a] and [b] to define the size of the
-     *   ellipse
+     * - [a] and [b] to define the size of the ellipse
      * - [theta] to define the orientation (as an X-axis rotation) of the ellipse
      *
-     * In most situations, there are four arc candidates that can be drawn from the origin
-     * to the end point. Which of the arcs is used is influenced by [isMoreThanHalf] and
-     * [isPositiveArc].
+     * In most situations, there are four arc candidates that can be drawn from the origin to the
+     * end point. Which of the arcs is used is influenced by [isMoreThanHalf] and [isPositiveArc].
      *
-     * When [isMoreThanHalf] is set to `true`, the added arc will be chosen amongst the
-     * two candidates that represent an arc sweep greater than or equal to 180 degrees.
+     * When [isMoreThanHalf] is set to `true`, the added arc will be chosen amongst the two
+     * candidates that represent an arc sweep greater than or equal to 180 degrees.
      *
-     * When [isPositiveArc] is set to `true`, the added arc will be chosen amongst the
-     * two candidates with a positive-angle direction (counter-clockwise)
+     * When [isPositiveArc] is set to `true`, the added arc will be chosen amongst the two
+     * candidates with a positive-angle direction (counter-clockwise)
      *
      * @param a The horizontal radius of the ellipse
      * @param b The vertical radius of the ellipse
      * @param theta The rotation of the ellipse around the X-axis, in degrees
-     * @param isMoreThanHalf Defines whether to use an arc candidate with a sweep
-     *        greater than or equal to 180 degrees
-     * @param isPositiveArc Defines whether to use an arc candidate that's
-     *        counter-clockwise or not
+     * @param isMoreThanHalf Defines whether to use an arc candidate with a sweep greater than or
+     *   equal to 180 degrees
+     * @param isPositiveArc Defines whether to use an arc candidate that's counter-clockwise or not
      * @param dx1 The x offset of the end point of the arc, relative to the last path position
      * @param dy1 The y offset of the end point of the arc, relative to the last path position
      */
diff --git a/compose/ui/ui-graphics/src/commonMain/kotlin/androidx/compose/ui/graphics/vector/PathNode.kt b/compose/ui/ui-graphics/src/commonMain/kotlin/androidx/compose/ui/graphics/vector/PathNode.kt
index 5a6746d..163b8c5 100644
--- a/compose/ui/ui-graphics/src/commonMain/kotlin/androidx/compose/ui/graphics/vector/PathNode.kt
+++ b/compose/ui/ui-graphics/src/commonMain/kotlin/androidx/compose/ui/graphics/vector/PathNode.kt
@@ -28,32 +28,23 @@
 sealed class PathNode(val isCurve: Boolean = false, val isQuad: Boolean = false) {
     // RelativeClose and Close are considered the same internally, so we represent both with Close
     // for simplicity and to make equals comparisons robust.
-    @Immutable
-    object Close : PathNode()
+    @Immutable object Close : PathNode()
 
-    @Immutable
-    data class RelativeMoveTo(val dx: Float, val dy: Float) : PathNode()
+    @Immutable data class RelativeMoveTo(val dx: Float, val dy: Float) : PathNode()
 
-    @Immutable
-    data class MoveTo(val x: Float, val y: Float) : PathNode()
+    @Immutable data class MoveTo(val x: Float, val y: Float) : PathNode()
 
-    @Immutable
-    data class RelativeLineTo(val dx: Float, val dy: Float) : PathNode()
+    @Immutable data class RelativeLineTo(val dx: Float, val dy: Float) : PathNode()
 
-    @Immutable
-    data class LineTo(val x: Float, val y: Float) : PathNode()
+    @Immutable data class LineTo(val x: Float, val y: Float) : PathNode()
 
-    @Immutable
-    data class RelativeHorizontalTo(val dx: Float) : PathNode()
+    @Immutable data class RelativeHorizontalTo(val dx: Float) : PathNode()
 
-    @Immutable
-    data class HorizontalTo(val x: Float) : PathNode()
+    @Immutable data class HorizontalTo(val x: Float) : PathNode()
 
-    @Immutable
-    data class RelativeVerticalTo(val dy: Float) : PathNode()
+    @Immutable data class RelativeVerticalTo(val dy: Float) : PathNode()
 
-    @Immutable
-    data class VerticalTo(val y: Float) : PathNode()
+    @Immutable data class VerticalTo(val y: Float) : PathNode()
 
     @Immutable
     data class RelativeCurveTo(
@@ -84,40 +75,21 @@
     ) : PathNode(isCurve = true)
 
     @Immutable
-    data class ReflectiveCurveTo(
-        val x1: Float,
-        val y1: Float,
-        val x2: Float,
-        val y2: Float
-    ) : PathNode(isCurve = true)
+    data class ReflectiveCurveTo(val x1: Float, val y1: Float, val x2: Float, val y2: Float) :
+        PathNode(isCurve = true)
 
     @Immutable
-    data class RelativeQuadTo(
-        val dx1: Float,
-        val dy1: Float,
-        val dx2: Float,
-        val dy2: Float
-    ) : PathNode(isQuad = true)
+    data class RelativeQuadTo(val dx1: Float, val dy1: Float, val dx2: Float, val dy2: Float) :
+        PathNode(isQuad = true)
 
     @Immutable
-    data class QuadTo(
-        val x1: Float,
-        val y1: Float,
-        val x2: Float,
-        val y2: Float
-    ) : PathNode(isQuad = true)
+    data class QuadTo(val x1: Float, val y1: Float, val x2: Float, val y2: Float) :
+        PathNode(isQuad = true)
 
     @Immutable
-    data class RelativeReflectiveQuadTo(
-        val dx: Float,
-        val dy: Float
-    ) : PathNode(isQuad = true)
+    data class RelativeReflectiveQuadTo(val dx: Float, val dy: Float) : PathNode(isQuad = true)
 
-    @Immutable
-    data class ReflectiveQuadTo(
-        val x: Float,
-        val y: Float
-    ) : PathNode(isQuad = true)
+    @Immutable data class ReflectiveQuadTo(val x: Float, val y: Float) : PathNode(isQuad = true)
 
     @Immutable
     data class RelativeArcTo(
@@ -143,187 +115,131 @@
 }
 
 /**
- * Adds the corresponding [PathNode] for the given character key, if it exists, to [nodes].
- * If the key is unknown then [IllegalArgumentException] is thrown
+ * Adds the corresponding [PathNode] for the given character key, if it exists, to [nodes]. If the
+ * key is unknown then [IllegalArgumentException] is thrown
+ *
  * @throws IllegalArgumentException
  */
 internal fun Char.addPathNodes(nodes: ArrayList<PathNode>, args: FloatArray, count: Int) {
     when (this) {
-        RelativeCloseKey, CloseKey -> nodes.add(PathNode.Close)
-
+        RelativeCloseKey,
+        CloseKey -> nodes.add(PathNode.Close)
         RelativeMoveToKey -> pathRelativeMoveNodeFromArgs(nodes, args, count)
-
         MoveToKey -> pathMoveNodeFromArgs(nodes, args, count)
-
-        RelativeLineToKey -> pathNodesFromArgs(
-            nodes,
-            args,
-            count,
-            NUM_LINE_TO_ARGS
-        ) { array, start ->
-            PathNode.RelativeLineTo(dx = array[start], dy = array[start + 1])
-        }
-
-        LineToKey -> pathNodesFromArgs(nodes, args, count, NUM_LINE_TO_ARGS) { array, start ->
-            PathNode.LineTo(x = array[start], y = array[start + 1])
-        }
-
-        RelativeHorizontalToKey -> pathNodesFromArgs(
-            nodes,
-            args,
-            count,
-            NUM_HORIZONTAL_TO_ARGS
-        ) { array, start ->
-            PathNode.RelativeHorizontalTo(dx = array[start])
-        }
-
-        HorizontalToKey -> pathNodesFromArgs(
-            nodes,
-            args,
-            count,
-            NUM_HORIZONTAL_TO_ARGS
-        ) { array, start ->
-            PathNode.HorizontalTo(x = array[start])
-        }
-
-        RelativeVerticalToKey -> pathNodesFromArgs(
-            nodes,
-            args,
-            count,
-            NUM_VERTICAL_TO_ARGS
-        ) { array, start ->
-            PathNode.RelativeVerticalTo(dy = array[start])
-        }
-
-        VerticalToKey -> pathNodesFromArgs(
-            nodes,
-            args,
-            count,
-            NUM_VERTICAL_TO_ARGS
-        ) { array, start ->
-            PathNode.VerticalTo(y = array[start])
-        }
-
-        RelativeCurveToKey -> pathNodesFromArgs(
-            nodes,
-            args,
-            count,
-            NUM_CURVE_TO_ARGS
-        ) { array, start ->
-            PathNode.RelativeCurveTo(
-                dx1 = array[start],
-                dy1 = array[start + 1],
-                dx2 = array[start + 2],
-                dy2 = array[start + 3],
-                dx3 = array[start + 4],
-                dy3 = array[start + 5]
-            )
-        }
-
-        CurveToKey -> pathNodesFromArgs(nodes, args, count, NUM_CURVE_TO_ARGS) { array, start ->
-            PathNode.CurveTo(
-                x1 = array[start],
-                y1 = array[start + 1],
-                x2 = array[start + 2],
-                y2 = array[start + 3],
-                x3 = array[start + 4],
-                y3 = array[start + 5]
-            )
-        }
-
-        RelativeReflectiveCurveToKey -> pathNodesFromArgs(
-            nodes,
-            args,
-            count,
-            NUM_REFLECTIVE_CURVE_TO_ARGS
-        ) { array, start ->
-            PathNode.RelativeReflectiveCurveTo(
-                dx1 = array[start],
-                dy1 = array[start + 1],
-                dx2 = array[start + 2],
-                dy2 = array[start + 3]
-            )
-        }
-
-        ReflectiveCurveToKey -> pathNodesFromArgs(
-            nodes,
-            args,
-            count,
-            NUM_REFLECTIVE_CURVE_TO_ARGS
-        ) { array, start ->
-            PathNode.ReflectiveCurveTo(
-                x1 = array[start],
-                y1 = array[start + 1],
-                x2 = array[start + 2],
-                y2 = array[start + 3]
-            )
-        }
-
-        RelativeQuadToKey -> pathNodesFromArgs(
-            nodes,
-            args,
-            count,
-            NUM_QUAD_TO_ARGS
-        ) { array, start ->
-            PathNode.RelativeQuadTo(
-                dx1 = array[start],
-                dy1 = array[start + 1],
-                dx2 = array[start + 2],
-                dy2 = array[start + 3]
-            )
-        }
-
-        QuadToKey -> pathNodesFromArgs(nodes, args, count, NUM_QUAD_TO_ARGS) { array, start ->
-            PathNode.QuadTo(
-                x1 = array[start],
-                y1 = array[start + 1],
-                x2 = array[start + 2],
-                y2 = array[start + 3]
-            )
-        }
-
-        RelativeReflectiveQuadToKey -> pathNodesFromArgs(
-            nodes,
-            args,
-            count,
-            NUM_REFLECTIVE_QUAD_TO_ARGS
-        ) { array, start ->
-            PathNode.RelativeReflectiveQuadTo(dx = array[start], dy = array[start + 1])
-        }
-
-        ReflectiveQuadToKey -> pathNodesFromArgs(
-            nodes,
-            args,
-            count,
-            NUM_REFLECTIVE_QUAD_TO_ARGS
-        ) { array, start ->
-            PathNode.ReflectiveQuadTo(x = array[start], y = array[start + 1])
-        }
-
-        RelativeArcToKey -> pathNodesFromArgs(nodes, args, count, NUM_ARC_TO_ARGS) { array, start ->
-            PathNode.RelativeArcTo(
-                horizontalEllipseRadius = array[start],
-                verticalEllipseRadius = array[start + 1],
-                theta = array[start + 2],
-                isMoreThanHalf = array[start + 3].compareTo(0.0f) != 0,
-                isPositiveArc = array[start + 4].compareTo(0.0f) != 0,
-                arcStartDx = array[start + 5],
-                arcStartDy = array[start + 6]
-            )
-        }
-
-        ArcToKey -> pathNodesFromArgs(nodes, args, count, NUM_ARC_TO_ARGS) { array, start ->
-            PathNode.ArcTo(
-                horizontalEllipseRadius = array[start],
-                verticalEllipseRadius = array[start + 1],
-                theta = array[start + 2],
-                isMoreThanHalf = array[start + 3].compareTo(0.0f) != 0,
-                isPositiveArc = array[start + 4].compareTo(0.0f) != 0,
-                arcStartX = array[start + 5],
-                arcStartY = array[start + 6]
-            )
-        }
-
+        RelativeLineToKey ->
+            pathNodesFromArgs(nodes, args, count, NUM_LINE_TO_ARGS) { array, start ->
+                PathNode.RelativeLineTo(dx = array[start], dy = array[start + 1])
+            }
+        LineToKey ->
+            pathNodesFromArgs(nodes, args, count, NUM_LINE_TO_ARGS) { array, start ->
+                PathNode.LineTo(x = array[start], y = array[start + 1])
+            }
+        RelativeHorizontalToKey ->
+            pathNodesFromArgs(nodes, args, count, NUM_HORIZONTAL_TO_ARGS) { array, start ->
+                PathNode.RelativeHorizontalTo(dx = array[start])
+            }
+        HorizontalToKey ->
+            pathNodesFromArgs(nodes, args, count, NUM_HORIZONTAL_TO_ARGS) { array, start ->
+                PathNode.HorizontalTo(x = array[start])
+            }
+        RelativeVerticalToKey ->
+            pathNodesFromArgs(nodes, args, count, NUM_VERTICAL_TO_ARGS) { array, start ->
+                PathNode.RelativeVerticalTo(dy = array[start])
+            }
+        VerticalToKey ->
+            pathNodesFromArgs(nodes, args, count, NUM_VERTICAL_TO_ARGS) { array, start ->
+                PathNode.VerticalTo(y = array[start])
+            }
+        RelativeCurveToKey ->
+            pathNodesFromArgs(nodes, args, count, NUM_CURVE_TO_ARGS) { array, start ->
+                PathNode.RelativeCurveTo(
+                    dx1 = array[start],
+                    dy1 = array[start + 1],
+                    dx2 = array[start + 2],
+                    dy2 = array[start + 3],
+                    dx3 = array[start + 4],
+                    dy3 = array[start + 5]
+                )
+            }
+        CurveToKey ->
+            pathNodesFromArgs(nodes, args, count, NUM_CURVE_TO_ARGS) { array, start ->
+                PathNode.CurveTo(
+                    x1 = array[start],
+                    y1 = array[start + 1],
+                    x2 = array[start + 2],
+                    y2 = array[start + 3],
+                    x3 = array[start + 4],
+                    y3 = array[start + 5]
+                )
+            }
+        RelativeReflectiveCurveToKey ->
+            pathNodesFromArgs(nodes, args, count, NUM_REFLECTIVE_CURVE_TO_ARGS) { array, start ->
+                PathNode.RelativeReflectiveCurveTo(
+                    dx1 = array[start],
+                    dy1 = array[start + 1],
+                    dx2 = array[start + 2],
+                    dy2 = array[start + 3]
+                )
+            }
+        ReflectiveCurveToKey ->
+            pathNodesFromArgs(nodes, args, count, NUM_REFLECTIVE_CURVE_TO_ARGS) { array, start ->
+                PathNode.ReflectiveCurveTo(
+                    x1 = array[start],
+                    y1 = array[start + 1],
+                    x2 = array[start + 2],
+                    y2 = array[start + 3]
+                )
+            }
+        RelativeQuadToKey ->
+            pathNodesFromArgs(nodes, args, count, NUM_QUAD_TO_ARGS) { array, start ->
+                PathNode.RelativeQuadTo(
+                    dx1 = array[start],
+                    dy1 = array[start + 1],
+                    dx2 = array[start + 2],
+                    dy2 = array[start + 3]
+                )
+            }
+        QuadToKey ->
+            pathNodesFromArgs(nodes, args, count, NUM_QUAD_TO_ARGS) { array, start ->
+                PathNode.QuadTo(
+                    x1 = array[start],
+                    y1 = array[start + 1],
+                    x2 = array[start + 2],
+                    y2 = array[start + 3]
+                )
+            }
+        RelativeReflectiveQuadToKey ->
+            pathNodesFromArgs(nodes, args, count, NUM_REFLECTIVE_QUAD_TO_ARGS) { array, start ->
+                PathNode.RelativeReflectiveQuadTo(dx = array[start], dy = array[start + 1])
+            }
+        ReflectiveQuadToKey ->
+            pathNodesFromArgs(nodes, args, count, NUM_REFLECTIVE_QUAD_TO_ARGS) { array, start ->
+                PathNode.ReflectiveQuadTo(x = array[start], y = array[start + 1])
+            }
+        RelativeArcToKey ->
+            pathNodesFromArgs(nodes, args, count, NUM_ARC_TO_ARGS) { array, start ->
+                PathNode.RelativeArcTo(
+                    horizontalEllipseRadius = array[start],
+                    verticalEllipseRadius = array[start + 1],
+                    theta = array[start + 2],
+                    isMoreThanHalf = array[start + 3].compareTo(0.0f) != 0,
+                    isPositiveArc = array[start + 4].compareTo(0.0f) != 0,
+                    arcStartDx = array[start + 5],
+                    arcStartDy = array[start + 6]
+                )
+            }
+        ArcToKey ->
+            pathNodesFromArgs(nodes, args, count, NUM_ARC_TO_ARGS) { array, start ->
+                PathNode.ArcTo(
+                    horizontalEllipseRadius = array[start],
+                    verticalEllipseRadius = array[start + 1],
+                    theta = array[start + 2],
+                    isMoreThanHalf = array[start + 3].compareTo(0.0f) != 0,
+                    isPositiveArc = array[start + 4].compareTo(0.0f) != 0,
+                    arcStartX = array[start + 5],
+                    arcStartY = array[start + 6]
+                )
+            }
         else -> throw IllegalArgumentException("Unknown command for: $this")
     }
 }
@@ -345,11 +261,7 @@
 
 // According to the spec, if a MoveTo is followed by multiple pairs of coordinates,
 // the subsequent pairs are treated as implicit corresponding LineTo commands.
-private fun pathMoveNodeFromArgs(
-    nodes: MutableList<PathNode>,
-    args: FloatArray,
-    count: Int
-) {
+private fun pathMoveNodeFromArgs(nodes: MutableList<PathNode>, args: FloatArray, count: Int) {
     val end = count - NUM_MOVE_TO_ARGS
     if (end >= 0) {
         nodes.add(PathNode.MoveTo(args[0], args[1]))
@@ -379,9 +291,7 @@
     }
 }
 
-/**
- * Constants used by [Char.addPathNodes] for creating [PathNode]s from parsed paths.
- */
+/** Constants used by [Char.addPathNodes] for creating [PathNode]s from parsed paths. */
 private const val RelativeCloseKey = 'z'
 private const val CloseKey = 'Z'
 private const val RelativeMoveToKey = 'm'
diff --git a/compose/ui/ui-graphics/src/commonMain/kotlin/androidx/compose/ui/graphics/vector/PathParser.kt b/compose/ui/ui-graphics/src/commonMain/kotlin/androidx/compose/ui/graphics/vector/PathParser.kt
index 352bd15..8f0835c 100644
--- a/compose/ui/ui-graphics/src/commonMain/kotlin/androidx/compose/ui/graphics/vector/PathParser.kt
+++ b/compose/ui/ui-graphics/src/commonMain/kotlin/androidx/compose/ui/graphics/vector/PathParser.kt
@@ -52,18 +52,16 @@
     private var nodes: ArrayList<PathNode>? = null
     private var nodeData = FloatArray(64)
 
-    /**
-     * Clears the collection of [PathNode] stored in this parser and returned by [toNodes].
-     */
+    /** Clears the collection of [PathNode] stored in this parser and returned by [toNodes]. */
     fun clear() {
         nodes?.clear()
     }
 
     /**
      * Parses the SVG path string to extract [PathNode] instances for each path instruction
-     * (`lineTo`, `moveTo`, etc.). The [PathNode] are stored in this parser's internal list
-     * of nodes which can be queried by calling [toNodes]. Calling this method replaces any
-     * existing content in the current nodes list.
+     * (`lineTo`, `moveTo`, etc.). The [PathNode] are stored in this parser's internal list of nodes
+     * which can be queried by calling [toNodes]. Calling this method replaces any existing content
+     * in the current nodes list.
      */
     fun parsePathString(pathData: String): PathParser {
         var dstNodes = nodes
@@ -78,14 +76,13 @@
     }
 
     /**
-     * Parses the path string and adds the corresponding [PathNode] instances to the
-     * specified [nodes] collection. This method returns [nodes].
+     * Parses the path string and adds the corresponding [PathNode] instances to the specified
+     * [nodes] collection. This method returns [nodes].
      */
     @Suppress("ConcreteCollection")
     fun pathStringToNodes(
         pathData: String,
-        @Suppress("ConcreteCollection")
-        nodes: ArrayList<PathNode> = ArrayList()
+        @Suppress("ConcreteCollection") nodes: ArrayList<PathNode> = ArrayList()
     ): ArrayList<PathNode> {
         var start = 0
         var end = pathData.length
@@ -160,8 +157,8 @@
     }
 
     /**
-     * Adds the list of [PathNode] [nodes] to this parser's internal list of [PathNode].
-     * The resulting list can be obtained by calling [toNodes].
+     * Adds the list of [PathNode] [nodes] to this parser's internal list of [PathNode]. The
+     * resulting list can be obtained by calling [toNodes].
      */
     fun addPathNodes(nodes: List<PathNode>): PathParser {
         var dstNodes = this.nodes
@@ -174,23 +171,22 @@
     }
 
     /**
-     * Returns this parser's list of [PathNode]. Note: this function does not return
-     * a copy of the list. The caller should make a copy when appropriate.
+     * Returns this parser's list of [PathNode]. Note: this function does not return a copy of the
+     * list. The caller should make a copy when appropriate.
      */
     fun toNodes(): List<PathNode> = nodes ?: emptyList()
 
     /**
-     * Converts this parser's list of [PathNode] instances into a [Path]. A new
-     * [Path] is returned every time this method is invoked.
+     * Converts this parser's list of [PathNode] instances into a [Path]. A new [Path] is returned
+     * every time this method is invoked.
      */
     fun toPath(target: Path = Path()) = nodes?.toPath(target) ?: Path()
 }
 
 /**
- * Converts this list of [PathNode] into a [Path] by adding the appropriate
- * commands to the [target] path. If [target] is not specified, a new
- * [Path] instance is created. This method returns [target] or the newly
- * created [Path].
+ * Converts this list of [PathNode] into a [Path] by adding the appropriate commands to the [target]
+ * path. If [target] is not specified, a new [Path] instance is created. This method returns
+ * [target] or the newly created [Path].
  */
 fun List<PathNode>.toPath(target: Path = Path()): Path {
     // Rewind unsets the fill type so reset it here
@@ -217,7 +213,6 @@
                 ctrlY = segmentY
                 target.close()
             }
-
             is RelativeMoveTo -> {
                 currentX += node.dx
                 currentY += node.dy
@@ -225,7 +220,6 @@
                 segmentX = currentX
                 segmentY = currentY
             }
-
             is MoveTo -> {
                 currentX = node.x
                 currentY = node.y
@@ -233,63 +227,46 @@
                 segmentX = currentX
                 segmentY = currentY
             }
-
             is RelativeLineTo -> {
                 target.relativeLineTo(node.dx, node.dy)
                 currentX += node.dx
                 currentY += node.dy
             }
-
             is LineTo -> {
                 target.lineTo(node.x, node.y)
                 currentX = node.x
                 currentY = node.y
             }
-
             is RelativeHorizontalTo -> {
                 target.relativeLineTo(node.dx, 0.0f)
                 currentX += node.dx
             }
-
             is HorizontalTo -> {
                 target.lineTo(node.x, currentY)
                 currentX = node.x
             }
-
             is RelativeVerticalTo -> {
                 target.relativeLineTo(0.0f, node.dy)
                 currentY += node.dy
             }
-
             is VerticalTo -> {
                 target.lineTo(currentX, node.y)
                 currentY = node.y
             }
-
             is RelativeCurveTo -> {
-                target.relativeCubicTo(
-                    node.dx1, node.dy1,
-                    node.dx2, node.dy2,
-                    node.dx3, node.dy3
-                )
+                target.relativeCubicTo(node.dx1, node.dy1, node.dx2, node.dy2, node.dx3, node.dy3)
                 ctrlX = currentX + node.dx2
                 ctrlY = currentY + node.dy2
                 currentX += node.dx3
                 currentY += node.dy3
             }
-
             is CurveTo -> {
-                target.cubicTo(
-                    node.x1, node.y1,
-                    node.x2, node.y2,
-                    node.x3, node.y3
-                )
+                target.cubicTo(node.x1, node.y1, node.x2, node.y2, node.x3, node.y3)
                 ctrlX = node.x2
                 ctrlY = node.y2
                 currentX = node.x3
                 currentY = node.y3
             }
-
             is RelativeReflectiveCurveTo -> {
                 if (previousNode.isCurve) {
                     reflectiveCtrlX = currentX - ctrlX
@@ -299,16 +276,18 @@
                     reflectiveCtrlY = 0.0f
                 }
                 target.relativeCubicTo(
-                    reflectiveCtrlX, reflectiveCtrlY,
-                    node.dx1, node.dy1,
-                    node.dx2, node.dy2
+                    reflectiveCtrlX,
+                    reflectiveCtrlY,
+                    node.dx1,
+                    node.dy1,
+                    node.dx2,
+                    node.dy2
                 )
                 ctrlX = currentX + node.dx1
                 ctrlY = currentY + node.dy1
                 currentX += node.dx2
                 currentY += node.dy2
             }
-
             is ReflectiveCurveTo -> {
                 if (previousNode.isCurve) {
                     reflectiveCtrlX = 2 * currentX - ctrlX
@@ -317,16 +296,12 @@
                     reflectiveCtrlX = currentX
                     reflectiveCtrlY = currentY
                 }
-                target.cubicTo(
-                    reflectiveCtrlX, reflectiveCtrlY,
-                    node.x1, node.y1, node.x2, node.y2
-                )
+                target.cubicTo(reflectiveCtrlX, reflectiveCtrlY, node.x1, node.y1, node.x2, node.y2)
                 ctrlX = node.x1
                 ctrlY = node.y1
                 currentX = node.x2
                 currentY = node.y2
             }
-
             is RelativeQuadTo -> {
                 target.relativeQuadraticTo(node.dx1, node.dy1, node.dx2, node.dy2)
                 ctrlX = currentX + node.dx1
@@ -334,7 +309,6 @@
                 currentX += node.dx2
                 currentY += node.dy2
             }
-
             is QuadTo -> {
                 target.quadraticTo(node.x1, node.y1, node.x2, node.y2)
                 ctrlX = node.x1
@@ -342,7 +316,6 @@
                 currentX = node.x2
                 currentY = node.y2
             }
-
             is RelativeReflectiveQuadTo -> {
                 if (previousNode.isQuad) {
                     reflectiveCtrlX = currentX - ctrlX
@@ -351,16 +324,12 @@
                     reflectiveCtrlX = 0.0f
                     reflectiveCtrlY = 0.0f
                 }
-                target.relativeQuadraticTo(
-                    reflectiveCtrlX,
-                    reflectiveCtrlY, node.dx, node.dy
-                )
+                target.relativeQuadraticTo(reflectiveCtrlX, reflectiveCtrlY, node.dx, node.dy)
                 ctrlX = currentX + reflectiveCtrlX
                 ctrlY = currentY + reflectiveCtrlY
                 currentX += node.dx
                 currentY += node.dy
             }
-
             is ReflectiveQuadTo -> {
                 if (previousNode.isQuad) {
                     reflectiveCtrlX = 2 * currentX - ctrlX
@@ -369,16 +338,12 @@
                     reflectiveCtrlX = currentX
                     reflectiveCtrlY = currentY
                 }
-                target.quadraticTo(
-                    reflectiveCtrlX,
-                    reflectiveCtrlY, node.x, node.y
-                )
+                target.quadraticTo(reflectiveCtrlX, reflectiveCtrlY, node.x, node.y)
                 ctrlX = reflectiveCtrlX
                 ctrlY = reflectiveCtrlY
                 currentX = node.x
                 currentY = node.y
             }
-
             is RelativeArcTo -> {
                 val arcStartX = node.arcStartDx + currentX
                 val arcStartY = node.arcStartDy + currentY
@@ -399,7 +364,6 @@
                 ctrlX = currentX
                 ctrlY = currentY
             }
-
             is ArcTo -> {
                 drawArc(
                     target,
@@ -462,10 +426,7 @@
     val disc = 1.0 / dsq - 1.0 / 4.0
     if (disc < 0.0) {
         val adjust = (sqrt(dsq) / 1.99999).toFloat()
-        drawArc(
-            p, x0, y0, x1, y1, a * adjust,
-            b * adjust, theta, isMoreThanHalf, isPositiveArc
-        )
+        drawArc(p, x0, y0, x1, y1, a * adjust, b * adjust, theta, isMoreThanHalf, isPositiveArc)
         return /* Points are too far apart */
     }
     val s = sqrt(disc)
@@ -500,10 +461,7 @@
     cx = cx * cosTheta - cy * sinTheta
     cy = tcx * sinTheta + cy * cosTheta
 
-    arcToBezier(
-        p, cx, cy, a, b, x0, y0, thetaD,
-        eta0, sweep
-    )
+    arcToBezier(p, cx, cy, a, b, x0, y0, thetaD, eta0, sweep)
 }
 
 /**
@@ -584,5 +542,4 @@
     }
 }
 
-@Suppress("NOTHING_TO_INLINE")
-private inline fun Double.toRadians(): Double = this / 180 * PI
+@Suppress("NOTHING_TO_INLINE") private inline fun Double.toRadians(): Double = this / 180 * PI
diff --git a/compose/ui/ui-graphics/src/commonTest/kotlin/androidx/compose/ui/graphics/ColorMatrixTest.kt b/compose/ui/ui-graphics/src/commonTest/kotlin/androidx/compose/ui/graphics/ColorMatrixTest.kt
index 3b5cfcd..b44c975 100644
--- a/compose/ui/ui-graphics/src/commonTest/kotlin/androidx/compose/ui/graphics/ColorMatrixTest.kt
+++ b/compose/ui/ui-graphics/src/commonTest/kotlin/androidx/compose/ui/graphics/ColorMatrixTest.kt
@@ -25,28 +25,29 @@
 
     private val tolerance = 0.0000001f
 
-    private val source = floatArrayOf(
-        0f,
-        1f,
-        2f,
-        3f,
-        4f,
-        5f,
-        6f,
-        7f,
-        8f,
-        9f,
-        10f,
-        11f,
-        12f,
-        13f,
-        14f,
-        15f,
-        16f,
-        17f,
-        18f,
-        19f
-    )
+    private val source =
+        floatArrayOf(
+            0f,
+            1f,
+            2f,
+            3f,
+            4f,
+            5f,
+            6f,
+            7f,
+            8f,
+            9f,
+            10f,
+            11f,
+            12f,
+            13f,
+            14f,
+            15f,
+            16f,
+            17f,
+            18f,
+            19f
+        )
 
     private var colorMatrix = ColorMatrix(source)
 
@@ -109,28 +110,29 @@
     fun testSet1() {
         var ret: FloatArray = colorMatrix.values
         preCompare(ret)
-        val fArray = floatArrayOf(
-            19f,
-            18f,
-            17f,
-            16f,
-            15f,
-            14f,
-            13f,
-            12f,
-            11f,
-            10f,
-            9f,
-            8f,
-            7f,
-            6f,
-            5f,
-            4f,
-            3f,
-            2f,
-            1f,
-            0f
-        )
+        val fArray =
+            floatArrayOf(
+                19f,
+                18f,
+                17f,
+                16f,
+                15f,
+                14f,
+                13f,
+                12f,
+                11f,
+                10f,
+                9f,
+                8f,
+                7f,
+                6f,
+                5f,
+                4f,
+                3f,
+                2f,
+                1f,
+                0f
+            )
         colorMatrix.set(ColorMatrix(fArray))
         ret = colorMatrix.values
         assertTrue(fArray.contentEquals(ret))
@@ -140,28 +142,29 @@
     fun testSet2() {
         var ret: FloatArray = colorMatrix.values
         preCompare(ret)
-        val fArray = floatArrayOf(
-            19f,
-            18f,
-            17f,
-            16f,
-            15f,
-            14f,
-            13f,
-            12f,
-            11f,
-            10f,
-            9f,
-            8f,
-            7f,
-            6f,
-            5f,
-            4f,
-            3f,
-            2f,
-            1f,
-            0f
-        )
+        val fArray =
+            floatArrayOf(
+                19f,
+                18f,
+                17f,
+                16f,
+                15f,
+                14f,
+                13f,
+                12f,
+                11f,
+                10f,
+                9f,
+                8f,
+                7f,
+                6f,
+                5f,
+                4f,
+                3f,
+                2f,
+                1f,
+                0f
+            )
         colorMatrix.set(ColorMatrix(fArray))
         ret = colorMatrix.values
         assertTrue(fArray.contentEquals(ret))
@@ -190,12 +193,29 @@
     fun testSetSaturation() {
         colorMatrix.setToSaturation(0.5f)
         val ret: FloatArray = colorMatrix.values
-        val expected = floatArrayOf(
-            0.6065f, 0.3575f, 0.036f, 0.0f, 0.0f,
-            0.1065f, 0.85749996f, 0.036f, 0.0f, 0.0f,
-            0.1065f, 0.3575f, 0.536f, 0.0f, 0.0f,
-            0.0f, 0.0f, 0.0f, 1.0f, 0.0f
-        )
+        val expected =
+            floatArrayOf(
+                0.6065f,
+                0.3575f,
+                0.036f,
+                0.0f,
+                0.0f,
+                0.1065f,
+                0.85749996f,
+                0.036f,
+                0.0f,
+                0.0f,
+                0.1065f,
+                0.3575f,
+                0.536f,
+                0.0f,
+                0.0f,
+                0.0f,
+                0.0f,
+                0.0f,
+                1.0f,
+                0.0f
+            )
         for (i in ret.indices) {
             assertEquals(
                 expected[i],
@@ -207,14 +227,12 @@
 
     @Test
     fun testSetScale() {
-        val values = ColorMatrix().apply {
-            setToScale(
-                redScale = 2f,
-                greenScale = 3f,
-                blueScale = 4f,
-                alphaScale = 5f
-            )
-        }.values
+        val values =
+            ColorMatrix()
+                .apply {
+                    setToScale(redScale = 2f, greenScale = 3f, blueScale = 4f, alphaScale = 5f)
+                }
+                .values
         assertEquals(20, values.size)
         assertEquals(2.0f, values[0], 0.0f)
         assertEquals(3.0f, values[6], 0.0f)
@@ -233,11 +251,28 @@
         colorMatrix.convertRgbToYuv()
         assertTrue(
             floatArrayOf(
-                0.299f, 0.587f, 0.114f, 0.0f, 0.0f,
-                -0.16874f, -0.33126f, 0.5f, 0.0f, 0.0f,
-                0.5f, -0.41869f, -0.08131f, 0.0f, 0.0f,
-                0.0f, 0.0f, 0.0f, 1.0f, 0.0f
-            ).contentEquals(colorMatrix.values)
+                    0.299f,
+                    0.587f,
+                    0.114f,
+                    0.0f,
+                    0.0f,
+                    -0.16874f,
+                    -0.33126f,
+                    0.5f,
+                    0.0f,
+                    0.0f,
+                    0.5f,
+                    -0.41869f,
+                    -0.08131f,
+                    0.0f,
+                    0.0f,
+                    0.0f,
+                    0.0f,
+                    0.0f,
+                    1.0f,
+                    0.0f
+                )
+                .contentEquals(colorMatrix.values)
         )
     }
 
@@ -246,11 +281,28 @@
         colorMatrix.convertYuvToRgb()
         assertTrue(
             floatArrayOf(
-                1.0f, 0.0f, 1.402f, 0.0f, 0.0f,
-                1.0f, -0.34414f, -0.71414f, 0.0f, 0.0f,
-                1.0f, 1.772f, 0.0f, 0.0f, 0.0f,
-                0.0f, 0.0f, 0.0f, 1.0f, 0.0f
-            ).contentEquals(colorMatrix.values)
+                    1.0f,
+                    0.0f,
+                    1.402f,
+                    0.0f,
+                    0.0f,
+                    1.0f,
+                    -0.34414f,
+                    -0.71414f,
+                    0.0f,
+                    0.0f,
+                    1.0f,
+                    1.772f,
+                    0.0f,
+                    0.0f,
+                    0.0f,
+                    0.0f,
+                    0.0f,
+                    0.0f,
+                    1.0f,
+                    0.0f
+                )
+                .contentEquals(colorMatrix.values)
         )
     }
 
@@ -275,60 +327,79 @@
 
     @Test
     fun testTimesAssign() {
-        val floatA = floatArrayOf(
-            0f,
-            1f,
-            2f,
-            3f,
-            4f,
-            5f,
-            6f,
-            7f,
-            8f,
-            9f,
-            9f,
-            8f,
-            7f,
-            6f,
-            5f,
-            4f,
-            3f,
-            2f,
-            1f,
-            0f
-        )
-        val floatB = floatArrayOf(
-            1f,
-            1f,
-            1f,
-            1f,
-            1f,
-            1f,
-            1f,
-            1f,
-            1f,
-            1f,
-            1f,
-            1f,
-            1f,
-            1f,
-            1f,
-            1f,
-            1f,
-            1f,
-            1f,
-            1f
-        )
+        val floatA =
+            floatArrayOf(
+                0f,
+                1f,
+                2f,
+                3f,
+                4f,
+                5f,
+                6f,
+                7f,
+                8f,
+                9f,
+                9f,
+                8f,
+                7f,
+                6f,
+                5f,
+                4f,
+                3f,
+                2f,
+                1f,
+                0f
+            )
+        val floatB =
+            floatArrayOf(
+                1f,
+                1f,
+                1f,
+                1f,
+                1f,
+                1f,
+                1f,
+                1f,
+                1f,
+                1f,
+                1f,
+                1f,
+                1f,
+                1f,
+                1f,
+                1f,
+                1f,
+                1f,
+                1f,
+                1f
+            )
         val matrix = ColorMatrix(floatA)
         matrix *= ColorMatrix(floatB)
         val ret: FloatArray = matrix.values
         assertTrue(
             floatArrayOf(
-                6.0f, 6.0f, 6.0f, 6.0f, 10f,
-                26.0f, 26.0f, 26.0f, 26.0f, 35.0f,
-                30.0f, 30.0f, 30.0f, 30.0f, 35.0f,
-                10.0f, 10.0f, 10.0f, 10.0f, 10.0f
-            ).contentEquals(ret)
+                    6.0f,
+                    6.0f,
+                    6.0f,
+                    6.0f,
+                    10f,
+                    26.0f,
+                    26.0f,
+                    26.0f,
+                    26.0f,
+                    35.0f,
+                    30.0f,
+                    30.0f,
+                    30.0f,
+                    30.0f,
+                    35.0f,
+                    10.0f,
+                    10.0f,
+                    10.0f,
+                    10.0f,
+                    10.0f
+                )
+                .contentEquals(ret)
         )
     }
 
diff --git a/compose/ui/ui-graphics/src/commonTest/kotlin/androidx/compose/ui/graphics/ColorSpaceTest.kt b/compose/ui/ui-graphics/src/commonTest/kotlin/androidx/compose/ui/graphics/ColorSpaceTest.kt
index dff3303..5fdc7d8 100644
--- a/compose/ui/ui-graphics/src/commonTest/kotlin/androidx/compose/ui/graphics/ColorSpaceTest.kt
+++ b/compose/ui/ui-graphics/src/commonTest/kotlin/androidx/compose/ui/graphics/ColorSpaceTest.kt
@@ -58,74 +58,41 @@
     @Test
     fun testEmptyName() {
         assertFailsWith<IllegalArgumentException> {
-            Rgb(
-                "",
-                FloatArray(6),
-                WhitePoint(0f, 0f),
-                sIdentity,
-                sIdentity,
-                0.0f,
-                1.0f
-            )
+            Rgb("", FloatArray(6), WhitePoint(0f, 0f), sIdentity, sIdentity, 0.0f, 1.0f)
         }
     }
 
     @Test
     fun testName() {
-        val cs = Rgb(
-            "Test", FloatArray(6), WhitePoint(0f, 0f),
-            sIdentity, sIdentity, 0.0f, 1.0f
-        )
+        val cs = Rgb("Test", FloatArray(6), WhitePoint(0f, 0f), sIdentity, sIdentity, 0.0f, 1.0f)
         assertEquals("Test", cs.name)
     }
 
     @Test
     fun testPrimariesLength() {
         assertFailsWith<IllegalArgumentException> {
-            Rgb(
-                "Test",
-                FloatArray(7),
-                WhitePoint(0f, 0f),
-                sIdentity,
-                sIdentity,
-                0.0f,
-                1.0f
-            )
+            Rgb("Test", FloatArray(7), WhitePoint(0f, 0f), sIdentity, sIdentity, 0.0f, 1.0f)
         }
     }
 
     @Test
     fun testOETF() {
         val op: (Double) -> Double = { x -> sqrt(x) }
-        val cs = Rgb(
-            "Test", FloatArray(6), WhitePoint(0f, 0f),
-            op, sIdentity, 0.0f, 1.0f
-        )
+        val cs = Rgb("Test", FloatArray(6), WhitePoint(0f, 0f), op, sIdentity, 0.0f, 1.0f)
         assertEquals(0.5, cs.oetfFunc.invoke(0.25), 1e-5)
     }
 
     @Test
     fun testEOTF() {
         val op: (Double) -> Double = { x -> x * x }
-        val cs = Rgb(
-            "Test", FloatArray(6), WhitePoint(0f, 0f),
-            sIdentity, op, 0.0f, 1.0f
-        )
+        val cs = Rgb("Test", FloatArray(6), WhitePoint(0f, 0f), sIdentity, op, 0.0f, 1.0f)
         assertEquals(0.0625, cs.eotfFunc.invoke(0.25), 1e-5)
     }
 
     @Test
     fun testInvalidRange() {
         assertFailsWith<IllegalArgumentException> {
-            Rgb(
-                "Test",
-                FloatArray(6),
-                WhitePoint(0f, 0f),
-                sIdentity,
-                sIdentity,
-                2.0f,
-                1.0f
-            )
+            Rgb("Test", FloatArray(6), WhitePoint(0f, 0f), sIdentity, sIdentity, 2.0f, 1.0f)
         }
     }
 
@@ -237,10 +204,8 @@
 
     @Test
     fun testXYZFromPrimaries_xyY() {
-        val cs = Rgb(
-            "Test", SRGB_PRIMARIES_xyY, SRGB_WHITE_POINT_xyY,
-            sIdentity, sIdentity, 0.0f, 1.0f
-        )
+        val cs =
+            Rgb("Test", SRGB_PRIMARIES_xyY, SRGB_WHITE_POINT_xyY, sIdentity, sIdentity, 0.0f, 1.0f)
 
         val rgbToXYZ = cs.getTransform()
         for (i in 0..8) {
@@ -255,10 +220,8 @@
 
     @Test
     fun testXYZFromPrimaries_XYZ() {
-        val cs = Rgb(
-            "Test", SRGB_PRIMARIES_XYZ, SRGB_WHITE_POINT_XYZ,
-            sIdentity, sIdentity, 0.0f, 1.0f
-        )
+        val cs =
+            Rgb("Test", SRGB_PRIMARIES_XYZ, SRGB_WHITE_POINT_XYZ, sIdentity, sIdentity, 0.0f, 1.0f)
 
         val primaries = cs.getPrimaries()
 
@@ -297,10 +260,7 @@
         assertEquals(3, ColorSpaces.Srgb.componentCount.toLong())
         assertEquals(3, ColorSpaces.LinearSrgb.componentCount.toLong())
         assertEquals(3, ColorSpaces.ExtendedSrgb.componentCount.toLong())
-        assertEquals(
-            3,
-            ColorSpaces.LinearExtendedSrgb.componentCount.toLong()
-        )
+        assertEquals(3, ColorSpaces.LinearExtendedSrgb.componentCount.toLong())
         assertEquals(3, ColorSpaces.DisplayP3.componentCount.toLong())
         assertEquals(3, ColorSpaces.CieLab.componentCount.toLong())
         assertEquals(3, ColorSpaces.CieXyz.componentCount.toLong())
@@ -312,17 +272,11 @@
             if (colorSpace === ColorSpaces.Srgb) {
                 assertTrue(colorSpace.isSrgb)
             } else {
-                assertFalse(
-                    colorSpace.isSrgb,
-                    "Incorrectly treating $colorSpace as SRGB!"
-                )
+                assertFalse(colorSpace.isSrgb, "Incorrectly treating $colorSpace as SRGB!")
             }
         }
 
-        val cs = Rgb(
-            "Almost sRGB", SRGB_TO_XYZ,
-            { x -> x.pow(1.0 / 2.2) }, { x -> x.pow(2.2) }
-        )
+        val cs = Rgb("Almost sRGB", SRGB_TO_XYZ, { x -> x.pow(1.0 / 2.2) }, { x -> x.pow(2.2) })
         assertFalse(cs.isSrgb)
     }
 
@@ -507,10 +461,8 @@
     @Test
     fun testAdaptedConnectorWithRenderIntent() {
         // Connect a wider color space to a narrow color space
-        var connector: Connector = ColorSpaces.DciP3.connect(
-            ColorSpaces.Srgb,
-            RenderIntent.Relative
-        )
+        var connector: Connector =
+            ColorSpaces.DciP3.connect(ColorSpaces.Srgb, RenderIntent.Relative)
 
         val source = floatArrayOf(0.9f, 0.9f, 0.9f)
 
@@ -520,10 +472,7 @@
         assertArrayNotEquals(source, relative, 1e-5f)
         assertArrayEquals(floatArrayOf(0.8862f, 0.8862f, 0.8862f), relative, 1e-4f)
 
-        connector = ColorSpaces.DciP3.connect(
-            ColorSpaces.Srgb,
-            RenderIntent.Absolute
-        )
+        connector = ColorSpaces.DciP3.connect(ColorSpaces.Srgb, RenderIntent.Absolute)
 
         val absolute = connector.transform(source[0], source[1], source[2])
         assertNotNull(absolute)
@@ -568,28 +517,24 @@
 
     @Test
     fun testAdaptation() {
-        var adapted = ColorSpaces.Srgb.adapt(
-            Illuminant.D50
-        )
+        var adapted = ColorSpaces.Srgb.adapt(Illuminant.D50)
 
-        val sRGBD50 = floatArrayOf(
-            0.43602175f,
-            0.22247513f,
-            0.01392813f,
-            0.38510883f,
-            0.71690667f,
-            0.09710153f,
-            0.14308129f,
-            0.06061824f,
-            0.71415880f
-        )
+        val sRGBD50 =
+            floatArrayOf(
+                0.43602175f,
+                0.22247513f,
+                0.01392813f,
+                0.38510883f,
+                0.71690667f,
+                0.09710153f,
+                0.14308129f,
+                0.06061824f,
+                0.71415880f
+            )
 
         assertArrayEquals(sRGBD50, (adapted as Rgb).getTransform(), 1e-7f)
 
-        adapted = ColorSpaces.Srgb.adapt(
-            Illuminant.D50,
-            Adaptation.Bradford
-        )
+        adapted = ColorSpaces.Srgb.adapt(Illuminant.D50, Adaptation.Bradford)
         assertArrayEquals(sRGBD50, (adapted as Rgb).getTransform(), 1e-7f)
     }
 
@@ -599,14 +544,13 @@
 
         assertSame(ColorSpaces.Srgb, connector1.destination)
 
-        val connector2 = ColorSpaces.DciP3.connect(
-            ColorSpaces.Srgb
-        )
+        val connector2 = ColorSpaces.DciP3.connect(ColorSpaces.Srgb)
 
         val source = floatArrayOf(0.6f, 0.9f, 0.7f)
         assertArrayEquals(
             connector1.transform(source[0], source[1], source[2]),
-            connector2.transform(source[0], source[1], source[2]), 1e-7f
+            connector2.transform(source[0], source[1], source[2]),
+            1e-7f
         )
     }
 
@@ -770,8 +714,7 @@
 
     @Test
     fun testIdempotentTransferFunctions() {
-        ColorSpacesArray
-            .filter { cs -> cs.model == ColorModel.Rgb }
+        ColorSpacesArray.filter { cs -> cs.model == ColorModel.Rgb }
             .map { cs -> cs as Rgb }
             .forEach { cs ->
                 val source = floatArrayOf(0.0f, 0.5f, 1.0f)
@@ -789,10 +732,7 @@
                 if (rgb !== ColorSpaces.ExtendedSrgb && rgb !== ColorSpaces.LinearExtendedSrgb) {
                     // match() uses CIE XYZ D50
                     rgb = rgb.adapt(Illuminant.D50) as Rgb
-                    assertSame(
-                        cs,
-                        ColorSpaces.match(rgb.getTransform(), rgb.transferParameters!!)
-                    )
+                    assertSame(cs, ColorSpaces.match(rgb.getTransform(), rgb.transferParameters!!))
                 }
             }
         }
@@ -840,58 +780,62 @@
 
     companion object {
         // Column-major RGB->XYZ transform matrix for the sRGB color space
-        private val SRGB_TO_XYZ = floatArrayOf(
-            0.412391f,
-            0.212639f,
-            0.019331f,
-            0.357584f,
-            0.715169f,
-            0.119195f,
-            0.180481f,
-            0.072192f,
-            0.950532f
-        )
+        private val SRGB_TO_XYZ =
+            floatArrayOf(
+                0.412391f,
+                0.212639f,
+                0.019331f,
+                0.357584f,
+                0.715169f,
+                0.119195f,
+                0.180481f,
+                0.072192f,
+                0.950532f
+            )
         // Column-major XYZ->RGB transform matrix for the sRGB color space
-        private val XYZ_TO_SRGB = floatArrayOf(
-            3.240970f,
-            -0.969244f,
-            0.055630f,
-            -1.537383f,
-            1.875968f,
-            -0.203977f,
-            -0.498611f,
-            0.041555f,
-            1.056971f
-        )
+        private val XYZ_TO_SRGB =
+            floatArrayOf(
+                3.240970f,
+                -0.969244f,
+                0.055630f,
+                -1.537383f,
+                1.875968f,
+                -0.203977f,
+                -0.498611f,
+                0.041555f,
+                1.056971f
+            )
 
         // Column-major RGB->XYZ transform matrix for the sRGB color space and a D50 white point
-        private val SRGB_TO_XYZ_D50 = floatArrayOf(
-            0.4360747f,
-            0.2225045f,
-            0.0139322f,
-            0.3850649f,
-            0.7168786f,
-            0.0971045f,
-            0.1430804f,
-            0.0606169f,
-            0.7141733f
-        )
+        private val SRGB_TO_XYZ_D50 =
+            floatArrayOf(
+                0.4360747f,
+                0.2225045f,
+                0.0139322f,
+                0.3850649f,
+                0.7168786f,
+                0.0971045f,
+                0.1430804f,
+                0.0606169f,
+                0.7141733f
+            )
 
         private val SRGB_PRIMARIES_xyY =
             floatArrayOf(0.640f, 0.330f, 0.300f, 0.600f, 0.150f, 0.060f)
         private val SRGB_WHITE_POINT_xyY = WhitePoint(0.3127f, 0.3290f)
 
-        private val SRGB_PRIMARIES_XYZ = floatArrayOf(
-            1.939394f,
-            1.000000f,
-            0.090909f,
-            0.500000f,
-            1.000000f,
-            0.166667f,
-            2.500000f,
-            1.000000f,
-            13.166667f
-        )
+        private val SRGB_PRIMARIES_XYZ =
+            floatArrayOf(
+                1.939394f,
+                1.000000f,
+                0.090909f,
+                0.500000f,
+                1.000000f,
+                0.166667f,
+                2.500000f,
+                1.000000f,
+                13.166667f
+            )
         private val SRGB_WHITE_POINT_XYZ = WhitePoint(0.950456f, 1.000f, 1.089058f)
 
         private val sIdentity: (Double) -> Double = { x -> x }
diff --git a/compose/ui/ui-graphics/src/commonTest/kotlin/androidx/compose/ui/graphics/MatrixTest.kt b/compose/ui/ui-graphics/src/commonTest/kotlin/androidx/compose/ui/graphics/MatrixTest.kt
index a4ffa4f..e1185e5 100644
--- a/compose/ui/ui-graphics/src/commonTest/kotlin/androidx/compose/ui/graphics/MatrixTest.kt
+++ b/compose/ui/ui-graphics/src/commonTest/kotlin/androidx/compose/ui/graphics/MatrixTest.kt
@@ -75,25 +75,19 @@
         val sy = 1.4f
         val sz = 1.1f
 
-        matrix.resetToPivotedTransform(
-            px, py,
-            tx, ty, tz,
-            rx, ry, rz,
-            sx, sy, sz
-        )
+        matrix.resetToPivotedTransform(px, py, tx, ty, tz, rx, ry, rz, sx, sy, sz)
 
         val matrix2 = Matrix()
         matrix2.translate(-px, -py)
-        matrix2 *= Matrix().apply {
-            translate(tx, ty, tz)
-            rotateX(rx)
-            rotateY(ry)
-            rotateZ(rz)
-            scale(sx, sy, sz)
-        }
-        matrix2 *= Matrix().apply {
-            translate(px, py)
-        }
+        matrix2 *=
+            Matrix().apply {
+                translate(tx, ty, tz)
+                rotateX(rx)
+                rotateY(ry)
+                rotateZ(rz)
+                scale(sx, sy, sz)
+            }
+        matrix2 *= Matrix().apply { translate(px, py) }
 
         assertMatricesNearlyEqual(matrix, matrix2)
     }
diff --git a/compose/ui/ui-graphics/src/commonTest/kotlin/androidx/compose/ui/graphics/RenderEffectTest.kt b/compose/ui/ui-graphics/src/commonTest/kotlin/androidx/compose/ui/graphics/RenderEffectTest.kt
index 665f3b7..03f6c22ce 100644
--- a/compose/ui/ui-graphics/src/commonTest/kotlin/androidx/compose/ui/graphics/RenderEffectTest.kt
+++ b/compose/ui/ui-graphics/src/commonTest/kotlin/androidx/compose/ui/graphics/RenderEffectTest.kt
@@ -53,12 +53,8 @@
     fun testNestedRenderEffectEquality() {
         val innerBlur = BlurEffect(5.0f, 10.0f, TileMode.Mirror)
         val wrappedBlur = BlurEffect(innerBlur, 20.0f, 50.0f, TileMode.Clamp)
-        val wrappedBlur2 = BlurEffect(
-            BlurEffect(5.0f, 10.0f, TileMode.Mirror),
-            20.0f,
-            50.0f,
-            TileMode.Clamp
-        )
+        val wrappedBlur2 =
+            BlurEffect(BlurEffect(5.0f, 10.0f, TileMode.Mirror), 20.0f, 50.0f, TileMode.Clamp)
         assertEquals(wrappedBlur, wrappedBlur2)
     }
 
@@ -66,23 +62,20 @@
     fun testNestedRenderEffectHashcode() {
         val innerBlur = BlurEffect(5.0f, 10.0f, TileMode.Mirror)
         val wrappedBlur = BlurEffect(innerBlur, 20.0f, 50.0f, TileMode.Clamp)
-        val wrappedBlur2 = BlurEffect(
-            BlurEffect(5.0f, 10.0f, TileMode.Mirror),
-            20.0f,
-            50.0f,
-            TileMode.Clamp
-        )
+        val wrappedBlur2 =
+            BlurEffect(BlurEffect(5.0f, 10.0f, TileMode.Mirror), 20.0f, 50.0f, TileMode.Clamp)
         assertEquals(wrappedBlur.hashCode(), wrappedBlur2.hashCode())
     }
 
     @Test
     fun testNestedRenderEffectToString() {
-        val blur = BlurEffect(
-            BlurEffect(5.0f, 10.0f, TileMode.Clamp),
-            radiusX = 15.0f,
-            radiusY = 20.0f,
-            TileMode.Decal
-        )
+        val blur =
+            BlurEffect(
+                BlurEffect(5.0f, 10.0f, TileMode.Clamp),
+                radiusX = 15.0f,
+                radiusY = 20.0f,
+                TileMode.Decal
+            )
         assertEquals(
             "BlurEffect(" +
                 "renderEffect=" +
@@ -117,10 +110,7 @@
     @Test
     fun testOffsetEffectToString() {
         assertEquals(
-            "OffsetEffect(" +
-                "renderEffect=null, " +
-                "offset=Offset(5.0, 10.0)" +
-                ")",
+            "OffsetEffect(" + "renderEffect=null, " + "offset=Offset(5.0, 10.0)" + ")",
             OffsetEffect(5f, 10.0f).toString()
         )
     }
@@ -129,10 +119,7 @@
     fun testNestedOffsetEffectEquality() {
         val innerOffset = OffsetEffect(5.0f, 10.0f)
         val wrappedOffset = OffsetEffect(innerOffset, Offset(20.0f, 50.0f))
-        val wrappedOffset2 = OffsetEffect(
-            OffsetEffect(5.0f, 10.0f),
-            Offset(20.0f, 50.0f)
-        )
+        val wrappedOffset2 = OffsetEffect(OffsetEffect(5.0f, 10.0f), Offset(20.0f, 50.0f))
         assertEquals(wrappedOffset, wrappedOffset2)
     }
 
@@ -140,19 +127,14 @@
     fun testNestedOffsetEffectHashcode() {
         val innerOffset = OffsetEffect(5.0f, 10.0f)
         val wrappedOffset = OffsetEffect(innerOffset, Offset(20.0f, 50.0f))
-        val wrappedOffset2 = OffsetEffect(
-            OffsetEffect(5.0f, 10.0f),
-            Offset(20.0f, 50.0f)
-        )
+        val wrappedOffset2 = OffsetEffect(OffsetEffect(5.0f, 10.0f), Offset(20.0f, 50.0f))
         assertEquals(wrappedOffset.hashCode(), wrappedOffset2.hashCode())
     }
 
     @Test
     fun testNestedOffsetEffectToString() {
-        val renderEffect = OffsetEffect(
-            BlurEffect(5.0f, 10.0f, TileMode.Clamp),
-            Offset(15.0f, 20.0f)
-        )
+        val renderEffect =
+            OffsetEffect(BlurEffect(5.0f, 10.0f, TileMode.Clamp), Offset(15.0f, 20.0f))
         assertEquals(
             "OffsetEffect(" +
                 "renderEffect=" +
diff --git a/compose/ui/ui-graphics/src/commonTest/kotlin/androidx/compose/ui/graphics/vector/FastFloatParserTest.kt b/compose/ui/ui-graphics/src/commonTest/kotlin/androidx/compose/ui/graphics/vector/FastFloatParserTest.kt
index b72eccf..f5a0efe 100644
--- a/compose/ui/ui-graphics/src/commonTest/kotlin/androidx/compose/ui/graphics/vector/FastFloatParserTest.kt
+++ b/compose/ui/ui-graphics/src/commonTest/kotlin/androidx/compose/ui/graphics/vector/FastFloatParserTest.kt
@@ -36,8 +36,8 @@
 
             assert(abs(x.toBits() - bits) < 2) {
                 "Expected: 0x$bits\n" +
-                "Actual:   0x${x.toBits()}\n" +
-                "    in $line (toFloat() = ${number.toFloat()})"
+                    "Actual:   0x${x.toBits()}\n" +
+                    "    in $line (toFloat() = ${number.toFloat()})"
             }
         }
     }
@@ -45,3332 +45,3333 @@
 
 // Data from https://github.com/fastfloat/supplemental_test_files
 // Under Apache 2.0 license
-private val FloatData = arrayOf(
-    "00000000 .0",
-    "00000000 0",
-    "00000000 0.0",
-    "00000000 0.0000",
-    "00000000 0e1",
-    "00000000 0e2",
-    "00000000 0e3",
-    "00000000 0e4395",
-    "00000000 0e47",
-    "00000000 0e4851",
-    "00000000 0e5",
-    "00000000 0e7",
-    "00000000 0e785",
-    "00000000 0e93",
-    "00000000 0e9999999999999999999999999999",
-    "00000000 1e-324",
-    "00000000 1e-500",
-    "00000000 3e-324",
-    "00000000 4.9406564584124653e-324",
-    "00000000 4.9406564584124654e-324",
-    "00000000 1.00000000000000188558920870223463870174566020691753515394643550663070558368373221" +
-        "972569761144603605635692374830246134201063722058e-309",
-    "00000000 0.00000000000000000000000000000000000000000000000000000000000000000000000000000000" +
-        "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" +
-        "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" +
-        "000000000000000000000000000000000000000000000000000002225073858507200889024586876085859" +
-        "887650423112240959465493524802562440009228235695178775888803759155264230978095043431208" +
-        "587738715835729182199302029437922422355981982750124204178896957131179108226104397197960" +
-        "400045489739193807919893608152561311337614984204327175103362739154978273159414382813627" +
-        "511383860409424946494228631669542910508020181592664213499660651780309507591305871984642" +
-        "390606863710200510872328278467884363194451586613504122347901479236958520832159762106637" +
-        "540161373658304419360371477835530668283453563400507407304013560296804637591858316312422" +
-        "452159926254649430083685186171942241764645513713542013221703137049658321015465406803539" +
-        "741790602258950302350193751977303094576317321085250729930508976158251915",
-    "00000000 2.2250738585072009e-308",
-    "00000000 2.2250738585072013e-308",
-    "00000000 2.2250738585072014e-308",
-    "00000000 0.00000000000000000000000000000000000000000000000000000000000000000000000000000000" +
-        "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" +
-        "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" +
-        "000000000000000000000000000000000000000000000000000004450147717014402272114819593418263" +
-        "951869639092703291296046852219449644444042153891033059047816270175828298317826079242213" +
-        "740172877389189291055314414815641243486759976282126534658507104573762744298025962244902" +
-        "903779698114444614570510266311510031828794952795966823603998647925096578034214163701381" +
-        "261333311989876551545144031526125381326665295130600018491776632866075559583739224098994" +
-        "780755659409810102161219881460525874257917900007167599934414508608720568157791543592301" +
-        "891033496486942061405218289243144579760516365090360651414037721744226256159024466852576" +
-        "737244643007551333245007965068671949137768847800530996396770975896584413789443379662199" +
-        "396731693628045708486661320679701772891608002069867940855134372886767540",
-    "00000000 1.2e-307",
-    "00000000 1e-300",
-    "00000000 1e-256",
-    "00000000 9007199254740992.e-256",
-    "00000000 1e-128",
-    "00000000 42823146028335318693e-128",
-    "00000000 1e-64",
-    "00000000 7.0060e-46",
-    "00000001 7.0064923216240854e-46",
-    "00000001 1.1754943508e-45",
-    "00000001 1.4012984643e-45",
-    "00000001 0.00000000000000000000000000000000000000000000140129846432481707092372958328991613" +
-        "128026194187651577175706828388979108268586060148663818836212158203125",
-    "007FFFFF 0.00000000000000000000000000000000000001175494210692441075487029444849287348827052" +
-        "428745893333857174530571588870475618904265502351336181163787841796875",
-    "007FFFFF 1.1754942107e-38",
-    "00800000 1.1754943508e-38",
-    "00800000 0.00000000000000000000000000000000000001175494350822287507968736537222245677818665" +
-        "5567720875215087517062784172594547271728515625",
-    "00800003 1.1754947011469036e-38",
-    "00FFFFFF 0.00000000000000000000000000000000000002350988561514728583455765982071533026645717" +
-        "985517980855365926236850006129930346077117064851336181163787841796875",
-    "01000000 2.3509887016445750159374730744444913556373311135441750430175034126e-38",
-    "01800000 4.7019774032891500318749461488889827112746622270883500860350068251e-38",
-    "0A4FB11F 1e-32",
-    "24E69595 1e-16",
-    "29A2212D 7.2e-14",
-    "29E12E13 1e-13",
-    "39102534 0.00013746770127909258",
-    "39BECE41 0.00036393293703440577",
-    "3A6181A6 0.0008602388261351734",
-    "3AD0BAE5 0.0015924838953651488",
-    "3B0D2710 0.002153817447833717",
-    "3B8A536D 0.004221370676532388",
-    "3C467C71 0.012114629615098238",
-    "3CE5EF9A 0.028068351559340954",
-    "3D17CCF0 0.03706067614257336",
-    "3DBE3F17 0.09289376810193062",
-    "3DCCCCCD 0.1",
-    "3E200000 0.15625",
-    "3E200000 0.156250000000000000000000000000000000000000",
-    "3E345144 0.176091259055681",
-    "3E345144 0.1760912590558",
-    "3E5F23F5 0.21791061013936996",
-    "3E943D3B 0.289529654602168",
-    "3E9A209B 0.301029995663981",
-    "3E9A209B 0.30103",
-    "3E9C529D 0.30531780421733856",
-    "3EFFFFFD .4999999",
-    "3F000000 .5",
-    "3F000000 0.5",
-    "3F000002 .5000001",
-    "3F4322D6 0.7622503340244293",
-    "3F800000 1",
-    "3F800000 1e0",
-    "3F800032 1.000006",
-    "3F8147AE 1.01",
-    "3F91EB85 1.14",
-    "3F98089F 1.1877630352973938",
-    "3FA68B6E 1.30113",
-    "3FB0A3D7 1.38",
-    "3FB33333 1.4",
-    "3FC00000 1.5",
-    "3FD9999A 1.7",
-    "3FE66666 1.8",
-    "40000000 2",
-    "40000000 2.0",
-    "40000000 2e0",
-    "400646F1 2.09808",
-    "4019999A 2.4",
-    "402BFB5E 2.687217116355896",
-    "402DF854 2.718281828459045",
-    "402DF854 2.71828182845904523536028747135266249775724709369995",
-    "40400000 3",
-    "40470A3D 3.11",
-    "40490FDB 3.141592653589793",
-    "40490FDB 3.14159265358979323846264338327950288419716939937510",
-    "40490FDB 3.14159265358979323846264338327950288419716939937510582097494459230781640628620899" +
-        "86280348253421170679",
-    "40490FDB 3.14159265359",
-    "40490FF9 3.1416",
-    "404CCCCD 3.2",
-    "40733333 3.8",
-    "4079999A 3.9",
-    "40800000 4",
-    "4083D70A 4.12",
-    "40A00000 5",
-    "40C00000 6",
-    "40C00000 6e0",
-    "40E00000 7",
-    "40E00000 7e0",
-    "40F17C87 7.5464513301849365",
-    "41000000 8",
-    "41100000 9",
-    "41200000 10",
-    "41200000 1e0000001",
-    "41200000 1e01",
-    "41200000 1e1",
-    "41300000 11",
-    "41400000 12",
-    "41500000 13",
-    "415EADE2 13.91745138168335",
-    "41600000 14",
-    "41607AE1 14.03",
-    "41700000 15",
-    "41800000 16",
-    "41880000 17",
-    "418BE43C 17.486443519592285",
-    "41900000 18",
-    "419051EC 18.04",
-    "41980000 19",
-    "41A00000 20",
-    "41A051EC 20.04",
-    "41A80000 21",
-    "41B00000 22",
-    "41B80000 23",
-    "41C00000 24",
-    "41C00000 24e0",
-    "41C6E148 24.86",
-    "41C80000 25",
-    "41D00000 26",
-    "41D00000 26e0",
-    "41D80000 27",
-    "41E00000 28",
-    "41E80000 29",
-    "41F00000 30",
-    "41F00000 3e01",
-    "41F00000 3e1",
-    "41F80000 31",
-    "42000000 32",
-    "42040000 33",
-    "42080000 34",
-    "420C0000 35",
-    "42100000 36",
-    "42140000 37",
-    "42180000 38",
-    "421C0000 39",
-    "42200000 40",
-    "42200000 4e1",
-    "42240000 41",
-    "42280000 42",
-    "422C0000 43",
-    "42300000 44",
-    "42340000 45",
-    "42380000 46",
-    "423C0000 47",
-    "42400000 48",
-    "42440000 49",
-    "42480000 50",
-    "424A70A4 50.61",
-    "424B3F0E 50.811574935913086",
-    "424C0000 51",
-    "42500000 52",
-    "42540000 53",
-    "42580000 54",
-    "425C0000 55",
-    "42600000 56",
-    "42640000 57",
-    "42680000 58",
-    "426C0000 59",
-    "42700000 60",
-    "42700000 6e1",
-    "42740000 61",
-    "42780000 62",
-    "427C0000 63",
-    "42800000 64",
-    "42820000 65",
-    "42840000 66",
-    "42860000 67",
-    "42880000 68",
-    "42887333 68.225",
-    "428A0000 69",
-    "428C0000 70",
-    "428E0000 71",
-    "42900000 72",
-    "42920000 73",
-    "42940000 74",
-    "42960000 75",
-    "42980000 76",
-    "429A0000 77",
-    "429C0000 78",
-    "429E0000 79",
-    "429E0000 79e0",
-    "42A00000 80",
-    "42A00000 8e1",
-    "42A20000 81",
-    "42A40000 82",
-    "42A60000 83",
-    "42A80000 84",
-    "42A80000 84e0",
-    "42AA0000 85",
-    "42AC0000 86",
-    "42AD0F5C 86.53",
-    "42AE0000 87",
-    "42B00000 88",
-    "42B20000 89",
-    "42B40000 90",
-    "42B60000 91",
-    "42B80000 92",
-    "42B80000 92e0",
-    "42BA0000 93",
-    "42BC0000 94",
-    "42BC0000 94e0",
-    "42BE0000 95",
-    "42C00000 96",
-    "42C20000 97",
-    "42C40000 98",
-    "42C60000 99",
-    "42C80000 1.e2",
-    "42C80000 100",
-    "42C80000 10e1",
-    "42C80000 1e2",
-    "42CA0000 101",
-    "42CC0000 102",
-    "42CE0000 103",
-    "42D00000 104",
-    "42D20000 105",
-    "42D40000 106",
-    "42D60000 107",
-    "42D80000 108",
-    "42DA0000 109",
-    "42DC0000 110",
-    "42DE0000 111",
-    "42E00000 112",
-    "42E20000 113",
-    "42E40000 114",
-    "42E60000 115",
-    "42E80000 116",
-    "42EA0000 117",
-    "42EC0000 118",
-    "42EE0000 119",
-    "42F00000 120",
-    "42F20000 121",
-    "42F40000 122",
-    "42F60000 123",
-    "42F80000 124",
-    "42F8566C 124.16878890991211",
-    "42FA0000 125",
-    "42FC0000 126",
-    "42FE0000 127",
-    "43000000 128",
-    "43010000 129",
-    "43020000 130",
-    "43030000 131",
-    "43040000 132",
-    "43050000 133",
-    "43060000 134",
-    "43070000 135",
-    "43080000 136",
-    "43090000 137",
-    "430A0000 138",
-    "430B0000 139",
-    "430C0000 140",
-    "430D0000 141",
-    "430E0000 142",
-    "430F0000 143",
-    "43100000 144",
-    "43110000 145",
-    "43120000 146",
-    "43130000 147",
-    "43140000 148",
-    "43150000 149",
-    "43160000 150",
-    "43170000 151",
-    "43180000 152",
-    "43190000 153",
-    "431A0000 154",
-    "431B0000 155",
-    "431C0000 156",
-    "431D0000 157",
-    "431E0000 158",
-    "431F0000 159",
-    "43200000 160",
-    "43210000 161",
-    "43220000 162",
-    "43230000 163",
-    "43240000 164",
-    "43250000 165",
-    "43260000 166",
-    "43270000 167",
-    "43280000 168",
-    "43290000 169",
-    "432A0000 170",
-    "432B0000 171",
-    "432C0000 172",
-    "432D0000 173",
-    "432E0000 174",
-    "432F0000 175",
-    "43300000 176",
-    "43310000 177",
-    "43320000 178",
-    "43330000 179",
-    "43340000 180",
-    "43350000 181",
-    "43360000 182",
-    "43370000 183",
-    "43380000 184",
-    "43390000 185",
-    "433A0000 186",
-    "433B0000 187",
-    "433C0000 188",
-    "433D0000 189",
-    "433E0000 190",
-    "433F0000 191",
-    "43400000 192",
-    "43410000 193",
-    "43420000 194",
-    "43430000 195",
-    "43440000 196",
-    "43450000 197",
-    "43460000 198",
-    "43470000 199",
-    "43480000 200",
-    "43490000 201",
-    "434A0000 202",
-    "434B0000 203",
-    "434C0000 204",
-    "434D0000 205",
-    "434E0000 206",
-    "434E80CC 206.50310516357422",
-    "434F0000 207",
-    "43500000 208",
-    "43510000 209",
-    "43520000 210",
-    "43530000 211",
-    "43540000 212",
-    "43550000 213",
-    "43560000 214",
-    "43570000 215",
-    "43580000 216",
-    "43590000 217",
-    "435A0000 218",
-    "435B0000 219",
-    "435C0000 220",
-    "435D0000 221",
-    "435E0000 222",
-    "435F0000 223",
-    "43600000 224",
-    "43610000 225",
-    "43620000 226",
-    "43630000 227",
-    "43640000 228",
-    "43650000 229",
-    "43660000 230",
-    "43670000 231",
-    "43680000 232",
-    "43690000 233",
-    "436A0000 234",
-    "436B0000 235",
-    "436C0000 236",
-    "436D0000 237",
-    "436E0000 238",
-    "436F0000 239",
-    "43700000 240",
-    "43710000 241",
-    "43720000 242",
-    "43730000 243",
-    "43740000 244",
-    "43750000 245",
-    "43760000 246",
-    "43770000 247",
-    "43780000 248",
-    "43790000 249",
-    "437A0000 250",
-    "437B0000 251",
-    "437C0000 252",
-    "437D0000 253",
-    "437E0000 254",
-    "437F0000 255",
-    "43800000 256",
-    "43808000 257",
-    "43810000 258",
-    "43818000 259",
-    "43820000 260",
-    "43828000 261",
-    "43830000 262",
-    "43838000 263",
-    "43840000 264",
-    "43848000 265",
-    "43850000 266",
-    "43858000 267",
-    "43860000 268",
-    "43868000 269",
-    "43870000 270",
-    "43878000 271",
-    "43880000 272",
-    "43888000 273",
-    "43890000 274",
-    "43898000 275",
-    "438A0000 276",
-    "438A8000 277",
-    "438B0000 278",
-    "438B8000 279",
-    "438C0000 280",
-    "438C8000 281",
-    "438D0000 282",
-    "438D8000 283",
-    "438E0000 284",
-    "438E8000 285",
-    "438F0000 286",
-    "438F8000 287",
-    "43900000 288",
-    "43908000 289",
-    "43910000 290",
-    "43918000 291",
-    "43920000 292",
-    "43928000 293",
-    "43930000 294",
-    "43932A3D 294.33",
-    "43938000 295",
-    "43940000 296",
-    "43948000 297",
-    "43950000 298",
-    "43958000 299",
-    "43960000 300",
-    "43960000 3e2",
-    "43968000 301",
-    "43970000 302",
-    "43978000 303",
-    "43980000 304",
-    "43988000 305",
-    "43990000 306",
-    "43998000 307",
-    "439A0000 308",
-    "439A8000 309",
-    "439B0000 310",
-    "439B8000 311",
-    "439C0000 312",
-    "439C8000 313",
-    "439D0000 314",
-    "439D8000 315",
-    "439E0000 316",
-    "439E8000 317",
-    "439F0000 318",
-    "439F8000 319",
-    "43A00000 320",
-    "43A00000 32e1",
-    "43A08000 321",
-    "43A10000 322",
-    "43A18000 323",
-    "43A20000 324",
-    "43A28000 325",
-    "43A30000 326",
-    "43A38000 327",
-    "43A40000 328",
-    "43A48000 329",
-    "43A50000 330",
-    "43A58000 331",
-    "43A60000 332",
-    "43A68000 333",
-    "43A70000 334",
-    "43A78000 335",
-    "43A80000 336",
-    "43A88000 337",
-    "43A90000 338",
-    "43A98000 339",
-    "43AA0000 340",
-    "43AA8000 341",
-    "43AB0000 342",
-    "43AB8000 343",
-    "43AC0000 344",
-    "43AC8000 345",
-    "43AD0000 346",
-    "43AD8000 347",
-    "43AE0000 348",
-    "43AE8000 349",
-    "43AF0000 350",
-    "43AF8000 351",
-    "43B00000 352",
-    "43B08000 353",
-    "43B10000 354",
-    "43B18000 355",
-    "43B20000 356",
-    "43B28000 357",
-    "43B30000 358",
-    "43B38000 359",
-    "43B40000 360",
-    "43B48000 361",
-    "43B50000 362",
-    "43B58000 363",
-    "43B60000 364",
-    "43B68000 365",
-    "43B70000 366",
-    "43B78000 367",
-    "43B80000 368",
-    "43B88000 369",
-    "43B90000 370",
-    "43B98000 371",
-    "43BA0000 372",
-    "43BA8000 373",
-    "43BB0000 374",
-    "43BB8000 375",
-    "43BC0000 376",
-    "43BC8000 377",
-    "43BD0000 378",
-    "43BD8000 379",
-    "43BE0000 380",
-    "43BE8000 381",
-    "43BF0000 382",
-    "43BF8000 383",
-    "43C00000 384",
-    "43C08000 385",
-    "43C10000 386",
-    "43C18000 387",
-    "43C20000 388",
-    "43C28000 389",
-    "43C30000 390",
-    "43C38000 391",
-    "43C40000 392",
-    "43C48000 393",
-    "43C50000 394",
-    "43C58000 395",
-    "43C60000 396",
-    "43C68000 397",
-    "43C70000 398",
-    "43C78000 399",
-    "43C80000 400",
-    "43C88000 401",
-    "43C90000 402",
-    "43C98000 403",
-    "43CA0000 404",
-    "43CA8000 405",
-    "43CB0000 406",
-    "43CB8000 407",
-    "43CC0000 408",
-    "43CC8000 409",
-    "43CD0000 410",
-    "43CD8000 411",
-    "43CDF184 411.88682556152344",
-    "43CE0000 412",
-    "43CE8000 413",
-    "43CF0000 414",
-    "43CF8000 415",
-    "43D00000 416",
-    "43D08000 417",
-    "43D10000 418",
-    "43D18000 419",
-    "43D20000 420",
-    "43D28000 421",
-    "43D30000 422",
-    "43D38000 423",
-    "43D40000 424",
-    "43D48000 425",
-    "43D50000 426",
-    "43D58000 427",
-    "43D60000 428",
-    "43D68000 429",
-    "43D70000 430",
-    "43D78000 431",
-    "43D80000 432",
-    "43D88000 433",
-    "43D90000 434",
-    "43D98000 435",
-    "43DA0000 436",
-    "43DA8000 437",
-    "43DB0000 438",
-    "43DB8000 439",
-    "43DC0000 440",
-    "43DC8000 441",
-    "43DD0000 442",
-    "43DD8000 443",
-    "43DE0000 444",
-    "43DE8000 445",
-    "43DF0000 446",
-    "43DF8000 447",
-    "43E00000 448",
-    "43E08000 449",
-    "43E10000 450",
-    "43E18000 451",
-    "43E20000 452",
-    "43E28000 453",
-    "43E30000 454",
-    "43E38000 455",
-    "43E40000 456",
-    "43E48000 457",
-    "43E50000 458",
-    "43E58000 459",
-    "43E60000 460",
-    "43E68000 461",
-    "43E70000 462",
-    "43E78000 463",
-    "43E80000 464",
-    "43E88000 465",
-    "43E90000 466",
-    "43E98000 467",
-    "43EA0000 468",
-    "43EA8000 469",
-    "43EB0000 470",
-    "43EB8000 471",
-    "43EC0000 472",
-    "43EC8000 473",
-    "43ED0000 474",
-    "43ED8000 475",
-    "43EE0000 476",
-    "43EE8000 477",
-    "43EF0000 478",
-    "43EF8000 479",
-    "43F00000 480",
-    "43F08000 481",
-    "43F10000 482",
-    "43F18000 483",
-    "43F20000 484",
-    "43F28000 485",
-    "43F30000 486",
-    "43F38000 487",
-    "43F40000 488",
-    "43F48000 489",
-    "43F50000 490",
-    "43F58000 491",
-    "43F60000 492",
-    "43F68000 493",
-    "43F70000 494",
-    "43F78000 495",
-    "43F80000 496",
-    "43F88000 497",
-    "43F90000 498",
-    "43F98000 499",
-    "43FA0000 500",
-    "43FA8000 501",
-    "43FB0000 502",
-    "43FB8000 503",
-    "43FC0000 504",
-    "43FC8000 505",
-    "43FD0000 506",
-    "43FD8000 507",
-    "43FE0000 508",
-    "43FE8000 509",
-    "43FF0000 510",
-    "43FF8000 511",
-    "44000000 512",
-    "44004000 513",
-    "44008000 514",
-    "4400C000 515",
-    "44010000 516",
-    "44014000 517",
-    "44018000 518",
-    "4401C000 519",
-    "44020000 520",
-    "44024000 521",
-    "44026A3D 521.66",
-    "44028000 522",
-    "4402C000 523",
-    "44030000 524",
-    "44034000 525",
-    "44038000 526",
-    "4403C000 527",
-    "44040000 528",
-    "44044000 529",
-    "44048000 530",
-    "4404C000 531",
-    "44050000 532",
-    "44054000 533",
-    "44058000 534",
-    "4405C000 535",
-    "44060000 536",
-    "44064000 537",
-    "44068000 538",
-    "4406C000 539",
-    "44070000 540",
-    "44074000 541",
-    "44078000 542",
-    "4407C000 543",
-    "44080000 544",
-    "44084000 545",
-    "44088000 546",
-    "4408C000 547",
-    "44090000 548",
-    "44094000 549",
-    "44098000 550",
-    "4409C000 551",
-    "440A0000 552",
-    "440A4000 553",
-    "440A8000 554",
-    "440AC000 555",
-    "440B0000 556",
-    "440B4000 557",
-    "440B8000 558",
-    "440BC000 559",
-    "440C0000 560",
-    "440C4000 561",
-    "440C8000 562",
-    "440CC000 563",
-    "440D0000 564",
-    "440D4000 565",
-    "440D8000 566",
-    "440DC000 567",
-    "440E0000 568",
-    "440E4000 569",
-    "440E8000 570",
-    "440EC000 571",
-    "440F0000 572",
-    "440F4000 573",
-    "440F8000 574",
-    "440FC000 575",
-    "44100000 576",
-    "44104000 577",
-    "44108000 578",
-    "4410C000 579",
-    "44110000 580",
-    "44114000 581",
-    "44118000 582",
-    "4411C000 583",
-    "44120000 584",
-    "44124000 585",
-    "44128000 586",
-    "4412C000 587",
-    "44130000 588",
-    "44134000 589",
-    "44138000 590",
-    "4413C000 591",
-    "44140000 592",
-    "44144000 593",
-    "44148000 594",
-    "4414C000 595",
-    "44150000 596",
-    "44154000 597",
-    "44158000 598",
-    "4415C000 599",
-    "44160000 600",
-    "44160000 6e2",
-    "44164000 601",
-    "44168000 602",
-    "4416C000 603",
-    "44170000 604",
-    "44174000 605",
-    "44178000 606",
-    "4417C000 607",
-    "44180000 608",
-    "44184000 609",
-    "44188000 610",
-    "4418C000 611",
-    "44190000 612",
-    "44194000 613",
-    "44198000 614",
-    "4419C000 615",
-    "441A0000 616",
-    "441A4000 617",
-    "441A8000 618",
-    "441AC000 619",
-    "441B0000 620",
-    "441B4000 621",
-    "441B8000 622",
-    "441BC000 623",
-    "441C0000 624",
-    "441C4000 625",
-    "441C8000 626",
-    "441CC000 627",
-    "441D0000 628",
-    "441D4000 629",
-    "441D8000 630",
-    "441DC000 631",
-    "441E0000 632",
-    "441E4000 633",
-    "441E8000 634",
-    "441EC000 635",
-    "441F0000 636",
-    "441F4000 637",
-    "441F8000 638",
-    "441FC000 639",
-    "44200000 640",
-    "44204000 641",
-    "44208000 642",
-    "4420C000 643",
-    "44210000 644",
-    "44214000 645",
-    "44218000 646",
-    "4421C000 647",
-    "44220000 648",
-    "44224000 649",
-    "44228000 650",
-    "4422C000 651",
-    "44230000 652",
-    "44238000 654",
-    "4423C000 655",
-    "44240000 656",
-    "44244000 657",
-    "44248000 658",
-    "44250000 660",
-    "44254000 661",
-    "44258000 662",
-    "4425C000 663",
-    "44260000 664",
-    "44264000 665",
-    "44268000 666",
-    "4426C000 667",
-    "44270000 668",
-    "44278000 670",
-    "4427C000 671",
-    "44280000 672",
-    "44284000 673",
-    "44288000 674",
-    "4428C000 675",
-    "44294000 677",
-    "44298000 678",
-    "442A0000 680",
-    "442A4000 681",
-    "442B0000 684",
-    "442B4000 685",
-    "442BC000 687",
-    "442C0000 688",
-    "442C4000 689",
-    "442C8000 690",
-    "442CC000 691",
-    "442D0000 692",
-    "442D8000 694",
-    "442DC000 695",
-    "442E0000 696",
-    "442E4000 697",
-    "442E8000 698",
-    "442F0000 700",
-    "442F0000 7e2",
-    "442F4000 701",
-    "442F8000 702",
-    "44300000 704",
-    "44304000 705",
-    "44308000 706",
-    "4430C000 707",
-    "44310000 708",
-    "44314000 709",
-    "44318000 710",
-    "44318000 71e1",
-    "4431C000 711",
-    "44320000 712",
-    "44324000 713",
-    "44328000 714",
-    "4432C000 715",
-    "44330000 716",
-    "44334000 717",
-    "44338000 718",
-    "4433C000 719",
-    "44340000 720",
-    "44344000 721",
-    "44348000 722",
-    "4434C000 723",
-    "44350000 724",
-    "44354000 725",
-    "44358000 726",
-    "4435C000 727",
-    "44360000 728",
-    "44368000 730",
-    "4436C000 731",
-    "44370000 732",
-    "44374000 733",
-    "44378000 734",
-    "4437C000 735",
-    "44380000 736",
-    "44384000 737",
-    "44388000 738",
-    "44390000 740",
-    "44394000 741",
-    "44398000 742",
-    "443A0000 744",
-    "443A4000 745",
-    "443A8000 746",
-    "443AC000 747",
-    "443B0000 748",
-    "443B4000 749",
-    "443B8000 750",
-    "443B8000 75e01",
-    "443BC000 751",
-    "443C0000 752",
-    "443C8000 754",
-    "443CC000 755",
-    "443D0000 756",
-    "443D4000 757",
-    "443D8000 758",
-    "443E0000 760",
-    "443E4000 761",
-    "443EC000 763",
-    "443F0000 764",
-    "443F4000 765",
-    "443F8000 766",
-    "443FC000 767",
-    "44400000 768",
-    "44408000 770",
-    "4440C000 771",
-    "44410000 772",
-    "44414000 773",
-    "44418000 774",
-    "4441C000 775",
-    "44424000 777",
-    "44428000 778",
-    "44430000 780",
-    "44434000 781",
-    "44438000 782",
-    "4443C000 783",
-    "44440000 784",
-    "44444000 785",
-    "44448000 786",
-    "4444C000 787",
-    "44450000 788",
-    "44458000 790",
-    "4445C000 791",
-    "4445C000 791e0",
-    "44464000 793",
-    "44468000 794",
-    "4446C000 795",
-    "44470000 796",
-    "44474000 797",
-    "44478000 798",
-    "44480000 800",
-    "44480000 8e2",
-    "44484000 801",
-    "44488000 802",
-    "4448C000 803",
-    "44490000 804",
-    "44498000 806",
-    "4449C000 807",
-    "444A0000 808",
-    "444A8000 810",
-    "444AC000 811",
-    "444B0000 812",
-    "444B4000 813",
-    "444B8000 814",
-    "444C4000 817",
-    "444C8000 818",
-    "444D0000 820",
-    "444D4000 821",
-    "444DC000 823",
-    "444E0000 824",
-    "444E4000 825",
-    "444E8000 826",
-    "444EC000 827",
-    "444F0000 828",
-    "444F8000 830",
-    "444FC000 831",
-    "44500000 832",
-    "44504000 833",
-    "44508000 834",
-    "4450C000 835",
-    "44510000 836",
-    "44514000 837",
-    "44518000 838",
-    "44520000 840",
-    "44524000 841",
-    "44528000 842",
-    "4452C000 843",
-    "44530000 844",
-    "44538000 846",
-    "4453C000 847",
-    "44540000 848",
-    "44544000 849",
-    "44548000 850",
-    "4454C000 851",
-    "44554000 853",
-    "44558000 854",
-    "4455C000 855",
-    "44564000 857",
-    "44568000 858",
-    "4456C000 859",
-    "44570000 860",
-    "44574000 861",
-    "44578000 862",
-    "4457C000 863",
-    "44580000 864",
-    "44584000 865",
-    "44588000 866",
-    "4458C000 867",
-    "44590000 868",
-    "44594000 869",
-    "44598000 870",
-    "4459C000 871",
-    "445A0000 872",
-    "445A4000 873",
-    "445A8000 874",
-    "445B0000 876",
-    "445B4000 877",
-    "445B8000 878",
-    "445BC000 879",
-    "445C0000 880",
-    "445C4000 881",
-    "445C8000 882",
-    "445CC000 883",
-    "445D0000 884",
-    "445D8000 886",
-    "445DC000 887",
-    "445E0000 888",
-    "445E4000 889",
-    "445E8000 890",
-    "445EC000 891",
-    "445F0000 892",
-    "445F4000 893",
-    "445F8000 894",
-    "44600000 896",
-    "44604000 897",
-    "44608000 898",
-    "4460C000 899",
-    "44610000 900",
-    "44614000 901",
-    "4461C000 903",
-    "44620000 904",
-    "44624000 905",
-    "44628000 906",
-    "4462C000 907",
-    "44630000 908",
-    "44638000 910",
-    "4463C000 911",
-    "44640000 912",
-    "44644000 913",
-    "44648000 914",
-    "44650000 916",
-    "44654000 917",
-    "4465C000 919",
-    "44660000 920",
-    "44664000 921",
-    "44668000 922",
-    "4466C000 923",
-    "44670000 924",
-    "44678000 926",
-    "4467C000 927",
-    "44684000 929",
-    "44688000 930",
-    "44688000 93e1",
-    "4468C000 931",
-    "44694000 933",
-    "44698000 934",
-    "4469C000 935",
-    "4469C000 935e00",
-    "446A0000 936",
-    "446A17B2 936.3702087402344",
-    "446A4000 937",
-    "446B0000 940",
-    "446B4000 941",
-    "446B8000 942",
-    "446BC000 943",
-    "446C0000 944",
-    "446C4000 945",
-    "446C8000 946",
-    "446CC000 947",
-    "446D0000 948",
-    "446D4000 949",
-    "446D8000 950",
-    "446DC000 951",
-    "446E0000 952",
-    "446E4000 953",
-    "446E8000 954",
-    "446EC000 955",
-    "446F0000 956",
-    "446F4000 957",
-    "44700000 960",
-    "44704000 961",
-    "4470C000 963",
-    "44710000 964",
-    "44718000 966",
-    "4471C000 967",
-    "44724000 969",
-    "44728000 970",
-    "4472C000 971",
-    "44730000 972",
-    "44734000 973",
-    "44738000 974",
-    "4473C000 975",
-    "4473C000 975e0",
-    "44740000 976",
-    "44744000 977",
-    "4474C000 979",
-    "44750000 980",
-    "44754000 981",
-    "4475C000 983",
-    "44760000 984",
-    "44768000 986",
-    "4476C000 987",
-    "44774000 989",
-    "44778000 990",
-    "44784000 993",
-    "44788000 994",
-    "4478C000 995",
-    "44790000 996",
-    "44794000 997",
-    "44798000 998",
-    "4479C000 999",
-    "447A0000 1000",
-    "447A0000 1e3",
-    "447AC000 1003",
-    "447B0000 1004",
-    "447B8000 1006",
-    "447BC000 1007",
-    "447C4000 1009",
-    "447C8000 1010",
-    "447D4000 1013",
-    "447D8000 1014",
-    "447E0000 1016",
-    "447E4000 1017",
-    "447EC000 1019",
-    "447F0000 1020",
-    "447F8000 1022",
-    "447FC000 1023",
-    "44800000 1024",
-    "44804000 1026",
-    "44806000 1027",
-    "4480A000 1029",
-    "4480C000 1030",
-    "44812000 1033",
-    "44814000 1034",
-    "44818000 1036",
-    "4481A000 1037",
-    "4481E000 1039",
-    "44820000 1040",
-    "44826000 1043",
-    "44828000 1044",
-    "4482C000 1046",
-    "4482E000 1047",
-    "44832000 1049",
-    "44834000 1050",
-    "4483A000 1053",
-    "4483C000 1054",
-    "44840000 1056",
-    "44842000 1057",
-    "44846000 1059",
-    "44848000 1060",
-    "4484BB85 1061.86",
-    "4484E000 1063",
-    "44850000 1064",
-    "44854000 1066",
-    "44856000 1067",
-    "4485A000 1069",
-    "4485C000 1070",
-    "44860000 1072",
-    "44862000 1073",
-    "44864000 1074",
-    "44866000 1075",
-    "44868000 1076",
-    "4486A000 1077",
-    "4486E000 1079",
-    "44874000 1082",
-    "4487C000 1086",
-    "44882000 1089",
-    "44886000 1091",
-    "44888000 1092",
-    "44890000 1096",
-    "44896000 1099",
-    "4489C000 1102",
-    "448A4000 1106",
-    "448AA000 1109",
-    "448AC000 1110",
-    "448AE000 1111",
-    "448B0000 1112",
-    "448B8000 1116",
-    "448BE000 1119",
-    "448C4000 1122",
-    "448CC000 1126",
-    "448D2000 1129",
-    "448D8000 1132",
-    "448E0000 1136",
-    "44914000 1162",
-    "44916000 1163",
-    "44926000 1171",
-    "4496E000 1207",
-    "44986000 1219",
-    "4499C000 1230",
-    "449FE000 1279",
-    "44A02000 1281",
-    "44AB5DA6 1370.9265747070312",
-    "44ADA000 1389",
-    "44B12000 1417",
-    "44B84000 1474",
-    "44B8C000 1478",
-    "44BCE000 1511",
-    "44BFE000 1535",
-    "44C2C000 1558",
-    "44C36000 1563",
-    "44C3C000 1566",
-    "44C64000 1586",
-    "44C8E000 1607",
-    "44CD2000 1641",
-    "44CFA000 1661",
-    "44CFC000 1662",
-    "44D08000 1668",
-    "44D16000 1675",
-    "44D6A000 1717",
-    "44D90000 1736",
-    "44DCA000 1765",
-    "44DE6000 1779",
-    "44E02000 1793",
-    "44E28000 1812",
-    "44E32000 1817",
-    "44E5E000 1839",
-    "44E6A000 1845",
-    "44E84000 1858",
-    "44E9E000 1871",
-    "44EAA000 1877",
-    "44EF8000 1916",
-    "44F12000 1929",
-    "44F26000 1939",
-    "44F28000 1940",
-    "44F3E000 1951",
-    "44F42000 1953",
-    "44F4C000 1958",
-    "44F8E000 1991",
-    "44F98000 1996",
-    "44F9A000 1997",
-    "44F9C000 1998",
-    "44F9E000 1999",
-    "44FA0000 2000",
-    "44FA2000 2001",
-    "44FA8000 2004",
-    "44FC4148 2018.04",
-    "44FC6000 2019",
-    "44FC8000 2020",
-    "44FC8148 2020.04",
-    "44FD0000 2024",
-    "44FE2000 2033",
-    "44FEA000 2037",
-    "44FFE000 2047",
-    "45015000 2069",
-    "4501E000 2078",
-    "45027000 2087",
-    "45032000 2098",
-    "45069000 2153",
-    "45072000 2162",
-    "45077000 2167",
-    "4508D000 2189",
-    "450AE000 2222",
-    "450C5000 2245",
-    "450D6000 2262",
-    "450E5000 2277",
-    "450E8000 2280",
-    "45100000 2304",
-    "45113000 2323",
-    "4512E000 2350",
-    "4513C000 2364",
-    "45158000 2392",
-    "4515E000 2398",
-    "45171000 2417",
-    "45179000 2425",
-    "4518E000 2446",
-    "451A9000 2473",
-    "451AA000 2474",
-    "451C4000 25e2",
-    "451C7000 2503",
-    "451DD48C 2525.2840576171875",
-    "451E1000 2529",
-    "451FB000 2555",
-    "45201000 2561",
-    "45206000 2566",
-    "4520C000 2572",
-    "4523D000 2621",
-    "45242000 2626",
-    "4525F000 2655",
-    "4528C000 27e2",
-    "452A6000 2726",
-    "452AE000 2734",
-    "452B5000 2741",
-    "452DD000 2781",
-    "452EA000 2794",
-    "452F0000 2800",
-    "452F2000 2802",
-    "452FA000 281e1",
-    "45304000 2820",
-    "45310000 2832",
-    "4531D000 2845",
-    "4531E000 2846",
-    "45322000 2850",
-    "4532E000 2862",
-    "45331000 2865",
-    "4533B000 2875",
-    "45340000 288e1",
-    "4534F000 2895",
-    "4535A000 2906",
-    "45378000 2936",
-    "4537B000 2939",
-    "45392000 2962",
-    "45397000 2967",
-    "4539E000 2974",
-    "453A1000 2977",
-    "453C6000 3014",
-    "453D8000 3032",
-    "453E6000 3046",
-    "453EF000 3055",
-    "453FA000 3066",
-    "453FB000 3067",
-    "45400000 3072",
-    "45401000 3073",
-    "45408000 3080",
-    "4541E000 3102",
-    "45427000 3111",
-    "45428000 3112",
-    "45435000 3125",
-    "45447000 3143",
-    "45487000 3207",
-    "454A4000 3236",
-    "454DD000 3293",
-    "45505000 3333",
-    "45512000 3346",
-    "45520000 3360",
-    "45548000 3400",
-    "4555F000 3423",
-    "45562000 3426",
-    "45582000 3458",
-    "45588000 3464",
-    "4559B000 3483",
-    "455BB000 3515",
-    "455CC000 3532",
-    "455CF000 3535",
-    "45613000 3603",
-    "45618000 3608",
-    "45675000 3701",
-    "4568F000 3727",
-    "456D0000 3792",
-    "45701000 3841",
-    "45723000 3875",
-    "45744000 3908",
-    "45759000 3929",
-    "4578A000 3978",
-    "45795000 3989",
-    "4579F000 3999",
-    "457A0000 4000",
-    "457A0000 4e3",
-    "457AE000 4014",
-    "457BD000 4029",
-    "457E1000 4065",
-    "457E2000 4066",
-    "457F0000 4080",
-    "457FF000 4095",
-    "45800000 4096",
-    "4580E000 4124",
-    "45814000 4136",
-    "4582B800 4183",
-    "4582C000 4184",
-    "4582E800 4189",
-    "4582F800 4191",
-    "45834000 4200",
-    "45838800 4209",
-    "45841000 4226",
-    "4584B800 4247",
-    "45864000 4296",
-    "45875000 4330",
-    "4587E800 4349",
-    "45890000 4384",
-    "45898000 4400",
-    "458A5800 4427",
-    "458AC000 4440",
-    "458AE000 4444",
-    "458B3800 4455",
-    "458D7000 4526",
-    "458ED800 4571",
-    "458FA800 4597",
-    "458FB000 4598",
-    "45902800 4613",
-    "45904800 4617",
-    "4590C000 4632",
-    "45915800 4651",
-    "4591A800 4661",
-    "4591C800 4665",
-    "45921000 4674",
-    "45925000 4682",
-    "4592E000 4700",
-    "45934800 4713",
-    "45939800 4723",
-    "4593A000 4724",
-    "45948800 4753",
-    "45954800 4777",
-    "45965800 4811",
-    "4596A000 4820",
-    "45973000 4838",
-    "45993000 4902",
-    "45999800 4915",
-    "4599E800 4925",
-    "4599F000 4926",
-    "459A0800 4929",
-    "459B6000 4972",
-    "459B8000 4976",
-    "459BF800 4991",
-    "459CB000 5014",
-    "459CE800 5021",
-    "459E9000 5074",
-    "459F0000 5088",
-    "459FC000 5112",
-    "459FD000 5114",
-    "45A10800 5153",
-    "45A18800 5169",
-    "45A1D000 5178",
-    "45A1E000 5180",
-    "45A29000 5202",
-    "45A38000 5232",
-    "45A3A000 5236",
-    "45A58000 5296",
-    "45A5A800 5301",
-    "45A5E000 5308",
-    "45A66000 5324",
-    "45A6B000 5334",
-    "45A77800 5359",
-    "45A83000 5382",
-    "45A8C000 54e2",
-    "45A93800 5415",
-    "45A97800 5423",
-    "45AA0800 5441",
-    "45AC4800 5513",
-    "45ACF800 5535",
-    "45AD9800 5555",
-    "45ADC000 5560",
-    "45AE7800 5583",
-    "45AE9000 5586",
-    "45AF0000 5600",
-    "45AF0800 5601",
-    "45AF2800 5605",
-    "45B02000 5636",
-    "45B06800 5645",
-    "45B1D800 5691",
-    "45B21000 5698",
-    "45B42000 5764",
-    "45B5B000 5814",
-    "45B5F800 5823",
-    "45B6F000 5854",
-    "45B7C000 5880",
-    "45B85800 5899",
-    "45B8E000 5916",
-    "45BA4000 5960",
-    "45BAD800 5979",
-    "45BB7000 5998",
-    "45BBC800 6009",
-    "45BC1800 6019",
-    "45BC9000 6034",
-    "45BCD000 6042",
-    "45BD2800 6053",
-    "45BE2000 6084",
-    "45BF5000 6122",
-    "45C03000 6150",
-    "45C11000 6178",
-    "45C17800 6191",
-    "45C20800 6209",
-    "45C25000 6218",
-    "45C2F800 6239",
-    "45C3B000 6262",
-    "45C41000 6274",
-    "45C51000 6306",
-    "45C53800 6311",
-    "45C574A4 6318.580322265625",
-    "45C5C800 6329",
-    "45C5E000 6332",
-    "45C6C000 6360",
-    "45C7E800 6397",
-    "45C7F000 6398",
-    "45C7F800 6399",
-    "45C82800 6405",
-    "45C84800 6409",
-    "45C89800 6419",
-    "45C8A000 642e1",
-    "45C9B800 6455",
-    "45C9F000 6462",
-    "45CA8800 6481",
-    "45CAF000 6494",
-    "45CB2000 6500",
-    "45CBC800 6521",
-    "45CC1000 653e1",
-    "45CC5000 6538",
-    "45CD2800 6565",
-    "45CEC800 6617",
-    "45D01000 6658",
-    "45D05000 6666",
-    "45D10000 6688",
-    "45D20000 6720",
-    "45D2B000 6742",
-    "45D40000 6784",
-    "45D45000 6794",
-    "45D48000 6800",
-    "45D58000 6832",
-    "45D6C000 6872",
-    "45D85800 6923",
-    "45D97000 6958",
-    "45DAA800 6997",
-    "45DAC000 7e3",
-    "45DAF800 7007",
-    "45DB8800 7025",
-    "45DC6000 7052",
-    "45DC6800 7053",
-    "45DD8000 7088",
-    "45DE2800 7109",
-    "45DE4000 7112",
-    "45DF2800 7141",
-    "45E04800 7177",
-    "45E09800 7187",
-    "45E18000 7216",
-    "45E39000 7282",
-    "45E3B000 7286",
-    "45E57800 7343",
-    "45E5C000 7352",
-    "45E68800 7377",
-    "45E70000 7392",
-    "45E74000 7400",
-    "45E74800 7401",
-    "45E7B800 7415",
-    "45E7C000 7416",
-    "45E7F000 7422",
-    "45E80800 7425",
-    "45E89800 7443",
-    "45E8A000 7444",
-    "45E9B000 7478",
-    "45EA6800 7501",
-    "45EA7800 7503",
-    "45EB7800 7535",
-    "45EBE000 7548",
-    "45EC8800 7569",
-    "45ECB800 7575",
-    "45EDA000 7604",
-    "45EE2800 7621",
-    "45EE5000 7626",
-    "45EEC800 7641",
-    "45EEF800 7647",
-    "45EF0000 7648",
-    "45F0E800 7709",
-    "45F0F800 7711",
-    "45F20000 7744",
-    "45F22800 7749",
-    "45F2C000 7768",
-    "45F30800 7777",
-    "45F35800 7787",
-    "45F39800 7795",
-    "45F41000 7810",
-    "45F45000 7818",
-    "45F5C000 7864",
-    "45F64000 7880",
-    "45F8B000 7958",
-    "45F8B800 7959",
-    "45F96000 7980",
-    "45FA0000 8000",
-    "45FA0800 8001",
-    "45FB3000 8038",
-    "45FBC800 8057",
-    "45FC6800 8077",
-    "45FCB800 8087",
-    "45FD4800 8105",
-    "45FD7800 8111",
-    "45FE0000 8128",
-    "45FEF000 8158",
-    "45FF0800 8161",
-    "46004800 8210",
-    "46005400 8213",
-    "4600F000 8252",
-    "4601B000 8300",
-    "46021800 8326",
-    "46025400 8341",
-    "46026800 8346",
-    "46027400 8349",
-    "4602C800 8370",
-    "4602E400 8377",
-    "4602F000 8380",
-    "46032400 8393",
-    "46032800 8394",
-    "46033000 8396",
-    "46035800 8406",
-    "46037000 8412",
-    "4603B800 8430",
-    "46043400 8461",
-    "4604B400 8493",
-    "4604B800 8494",
-    "46050400 8513",
-    "4605A000 8552",
-    "46060400 8577",
-    "46065C00 8599",
-    "46066C00 8603",
-    "46069000 8612",
-    "46069400 8613",
-    "4606A400 8617",
-    "4606F400 8637",
-    "46071000 8644",
-    "4607D000 8692",
-    "4607E000 8696",
-    "46082800 8714",
-    "4608E800 8762",
-    "46092C00 8779",
-    "4609F400 8829",
-    "460AE000 8888",
-    "460AFC00 8895",
-    "460B6000 8920",
-    "460B6400 8921",
-    "460C1400 8965",
-    "460C2C00 8971",
-    "460CA000 9000",
-    "460CA000 9e3",
-    "460CEC00 9019",
-    "460CFC00 9023",
-    "460D4C00 9043",
-    "460E2000 9096",
-    "460F9000 9188",
-    "46107800 9246",
-    "4610C400 9265",
-    "4610DC00 9271",
-    "4610E400 9273",
-    "46113000 9292",
-    "46119000 9316",
-    "4612C000 9392",
-    "4612D400 9397",
-    "46135800 9430",
-    "46137000 9436",
-    "46140000 9472",
-    "46141400 9477",
-    "46142000 9480",
-    "46143400 9485",
-    "46143800 9486",
-    "46144C00 9491",
-    "46145C00 9495",
-    "46147800 9502",
-    "46148800 9506",
-    "46155800 9558",
-    "46165C00 9623",
-    "46166000 9624",
-    "46171800 9670",
-    "46172000 9672",
-    "46181000 9732",
-    "46184400 9745",
-    "4618F400 9789",
-    "461A9000 9892",
-    "461AE800 9914",
-    "461B5800 9942",
-    "461BC000 9968",
-    "461BEC00 9979",
-    "461C1C00 9991",
-    "461C3C00 9999",
-    "461C4000 10000",
-    "461C4000 1e4",
-    "461E6400 10137",
-    "4620B000 10284",
-    "46258800 10594",
-    "462D9C00 11111",
-    "46333C00 11471",
-    "4634FC00 11583",
-    "463F2000 12232",
-    "46426800 12442",
-    "4647EC00 12795",
-    "464BF000 13052",
-    "46506000 13336",
-    "46592000 13896",
-    "465CB400 14125",
-    "46634400 14545",
-    "4663F000 14588",
-    "466E9C00 15271",
-    "46722974 15498.36376953125",
-    "46742400 15625",
-    "4677D800 15862",
-    "467D3800 16206",
-    "467FF800 16382",
-    "46802FE4 16407.9462890625",
-    "46816200 16561",
-    "4681C200 16609",
-    "4684D000 17e3",
-    "4688174C 17419.6494140625",
-    "468AA400 17746",
-    "46912800 18580",
-    "4693A600 18899",
-    "4694F800 19068",
-    "4695B200 19161",
-    "46984600 19491",
-    "469C3E00 19999",
-    "469CAC00 20054",
-    "469CE400 20082",
-    "469E2E00 20247",
-    "469E6E00 20279",
-    "46A23A00 20765",
-    "46A5AE00 21207",
-    "46A9BE00 21727",
-    "46AB9800 21964",
-    "46AD9C00 22222",
-    "46BA7600 23867",
-    "46BD2200 24209",
-    "46BF0800 24452",
-    "46C40000 25088",
-    "46C80000 256e2",
-    "46C9BE00 25823",
-    "46CA1400 25866",
-    "46CAD200 25961",
-    "46CC8E00 26183",
-    "46CEA600 26451",
-    "46D15A00 26797",
-    "46D1A800 26836",
-    "46D4EE00 27255",
-    "46D54600 27299",
-    "46DAAA00 27989",
-    "46DB4A00 28069",
-    "46DD1800 28300",
-    "46E53600 29339",
-    "46EBA600 30163",
-    "46EBDC00 30190",
-    "46EC162A 30219.0830078125",
-    "46F28A00 31045",
-    "46F68E00 31559",
-    "46F6C600 31587",
-    "46F78000 31680",
-    "47010C00 33036",
-    "4701C500 33221",
-    "47023500 33333",
-    "4703B900 33721",
-    "4703D100 33745",
-    "47074300 34627",
-    "4707FA00 34810",
-    "47091700 35095",
-    "470A6B00 35435",
-    "470D1100 36113",
-    "470D8000 36224",
-    "470E0E00 36366",
-    "470E7F00 36479",
-    "470FE500 36837",
-    "47109600 37014",
-    "4710E000 37088",
-    "4713A900 37801",
-    "4713A900 37801e0",
-    "47160D00 38413",
-    "471ABD00 39613",
-    "471AF900 39673",
-    "471C4000 40000",
-    "471C4000 4e4",
-    "471C8200 40066",
-    "471E4300 40515",
-    "471F8000 40832",
-    "47218200 41346",
-    "4722D600 41686",
-    "47233300 41779",
-    "47241000 42e3",
-    "47269500 42645",
-    "4726D700 42711",
-    "47278900 42889",
-    "47278E00 42894",
-    "47291700 43287",
-    "47291E00 43294",
-    "472B330C 43827.048828125",
-    "472CEF00 44271",
-    "472D9C00 44444",
-    "472ED100 44753",
-    "4732F500 45813",
-    "4735B600 46518",
-    "47370B00 46859",
-    "47382A00 47146",
-    "47395500 47445",
-    "47397F00 47487",
-    "4739CC00 47564",
-    "4739DB00 47579",
-    "473F9500 49045",
-    "47426500 49765",
-    "47435000 5e4",
-    "47448100 50305",
-    "4746B000 50864",
-    "47484300 51267",
-    "4748B900 51385",
-    "47491500 51477",
-    "47495300 51539",
-    "474A6F00 51823",
-    "474A8C00 51852",
-    "474B6000 52064",
-    "474BE000 52192",
-    "474BF200 52210",
-    "474C8B00 52363",
-    "474D0100 52481",
-    "47538600 54150",
-    "47547A00 54394",
-    "47559600 54678",
-    "4755F000 54768",
-    "47571B00 55067",
-    "47583300 55347",
-    "47584800 55368",
-    "4758A800 55464",
-    "47590300 55555",
-    "47595500 55637",
-    "47596500 55653",
-    "475AC800 56008",
-    "475B2900 56105",
-    "475B9C00 56220",
-    "475D8800 56712",
-    "475DD600 56790",
-    "475F9C00 57244",
-    "475FF000 57328",
-    "47606C00 57452",
-    "47615F00 57695",
-    "4762EB00 58091",
-    "47634200 58178",
-    "47634400 58180",
-    "47635800 582e2",
-    "47652400 58660",
-    "476A2800 59944",
-    "476A6000 6e4",
-    "476C4F00 60495",
-    "476D1400 60692",
-    "476E4800 61E3",
-    "476F6100 61281",
-    "476F8100 61313",
-    "47735400 62292",
-    "47749800 62616",
-    "47757400 62836",
-    "4775AE00 62894",
-    "4777C100 63425",
-    "4777D000 63440",
-    "47780D00 63501",
-    "47796D00 63853",
-    "477AB100 64177",
-    "477AE600 6423e1",
-    "477B1B00 64283",
-    "477B4F00 64335",
-    "477CC800 64712",
-    "477D4800 64840",
-    "477F6C00 65388",
-    "47800000 65536",
-    "47809280 65829",
-    "47810E00 66076",
-    "47820A00 66580",
-    "47822500 66634",
-    "47823500 66666",
-    "4782DF00 67006",
-    "4785F400 68584",
-    "47860E80 68637",
-    "4787DC80 69561",
-    "4787ED00 69594",
-    "4788BE80 70013",
-    "47894C80 70297",
-    "4789D280 70565",
-    "478A6500 70858",
-    "478A7000 7088e1",
-    "478B8400 71432",
-    "478C2700 71758",
-    "478D1F80 72255",
-    "478D3800 72304",
-    "478D9880 72497",
-    "478DA200 72516",
-    "478FC480 73609",
-    "478FF400 73704",
-    "47903400 73832",
-    "4790F980 74227",
-    "47928F00 75038",
-    "47938980 75539",
-    "4793F780 75759",
-    "47941080 75809",
-    "47949300 76070",
-    "4794E900 76242",
-    "47959680 76589",
-    "4796B600 77164",
-    "47975680 77485",
-    "4797CB80 77719",
-    "4797E880 77777",
-    "47980600 77836",
-    "47989680 78125",
-    "4798B500 78186",
-    "479A0080 78849",
-    "479A6F80 79071",
-    "479AF900 79346",
-    "479BA380 79687",
-    "479BB400 79720",
-    "479C4000 80000",
-    "479C4000 8e4",
-    "479C5580 80043",
-    "479D0400 80392",
-    "479D1E00 80444",
-    "479D8E00 80668",
-    "479F1F80 81471",
-    "479FD900 81842",
-    "47A1C100 82818",
-    "47A20A00 82964",
-    "47A25B00 83126",
-    "47A29A80 83253",
-    "47A2E200 83396",
-    "47A33000 83552",
-    "47A33080 83553",
-    "47A33E80 83581",
-    "47A34080 83585",
-    "47A53000 84576",
-    "47A56780 84687",
-    "47A5FD80 84987",
-    "47A605A0 85003.24609375",
-    "47A64680 85133",
-    "47A7C900 85906",
-    "47A7CE00 85916",
-    "47A85680 86189",
-    "47A8B400 86376",
-    "47A9C680 86925",
-    "47AA4E00 87196",
-    "47AA7580 87275",
-    "47AAB000 87392",
-    "47AB2480 87625",
-    "47AD5580 88747",
-    "47AD7680 88813",
-    "47AD9C00 88888",
-    "47ADBF00 88958",
-    "47ADE600 89036",
-    "47AEED00 89562",
-    "47AF3480 89705",
-    "47AF7680 89837",
-    "47AFC800 9e4",
-    "47AFF000 90080",
-    "47B0E180 90563",
-    "47B12D80 90715",
-    "47B15D80 90811",
-    "47B18000 90880",
-    "47B18900 90898",
-    "47B27800 91376",
-    "47B28D80 91419",
-    "47B2B780 91503",
-    "47B3E780 92111",
-    "47B4A380 92487",
-    "47B52500 92746",
-    "47B68280 93445",
-    "47B78200 93956",
-    "47B8ED00 94682",
-    "47B96900 94930",
-    "47BA2200 953e2",
-    "47BA2A80 95317",
-    "47BA4200 95364",
-    "47BA9380 95527",
-    "47BB5C00 95928",
-    "47BC0580 96267",
-    "47BC0800 96272",
-    "47BDAB80 97111",
-    "47BDE500 97226",
-    "47BE0200 97284",
-    "47BEDD80 97723",
-    "47BEDE00 97724",
-    "47BEEF00 97758",
-    "47BF6800 98e3",
-    "47BF8A00 98068",
-    "47BFBA80 98165",
-    "47BFBE00 98172",
-    "47C0DD00 98746",
-    "47C16580 99019",
-    "47C19180 99107",
-    "47C26A80 99541",
-    "47C2EA80 99797",
-    "47C34D80 99995",
-    "47C34F80 99999",
-    "47C35000 100000",
-    "47C35000 1e5",
-    "47C65E00 101564",
-    "47C8DE00 102844",
-    "47D2E280 107973",
-    "47D90380 111111",
-    "47DEA800 114000",
-    "47FA0300 128006",
-    "47FFA500 130890",
-    "4807C540 139029",
-    "480F2B80 146606",
-    "48102400 1476e2",
-    "4810F600 148440",
-    "48149A80 152170",
-    "48191B84 156782.0703125",
-    "4819D280 157514",
-    "481AE000 158592",
-    "481B0100 158724",
-    "4825DC00 169840",
-    "482C7B00 176620",
-    "482C9C00 176752",
-    "482DC6C0 177947",
-    "482E3800 178400",
-    "483B2080 191618",
-    "483EC680 195354",
-    "483F90C0 196163",
-    "48435000 200000",
-    "48435000 20e04",
-    "48435000 2e5",
-    "48451A40 201833",
-    "48464BC0 203055",
-    "484CDEC0 209787",
-    "4852D6C0 215899",
-    "48567FC0 219647",
-    "48568100 219652",
-    "48590380 222222",
-    "485919C0 222311",
-    "485CED40 226229",
-    "485D93C0 226895",
-    "485E62C0 227723",
-    "486003C0 229391",
-    "486805C0 237591",
-    "486CD0C0 242499",
-    "486ED800 244576",
-    "48701040 245825",
-    "4870F0C0 246723",
-    "487319C0 248935",
-    "48796E00 255416",
-    "487A5C40 256369",
-    "487C9A40 258665",
-    "487CCD40 258869",
-    "488131A0 264589",
-    "48850A60 272467",
-    "48885FC0 279294",
-    "4888B800 280000",
-    "488D6300 289560",
-    "488DB840 290242",
-    "488E8260 291859",
-    "4891A980 298316",
-    "48927B60 299995",
-    "48933120 301449",
-    "4895D6A0 306869",
-    "4896C580 308780",
-    "48997AA0 314325",
-    "489A6DE0 316271",
-    "489E61A0 324365",
-    "489F7480 326564",
-    "48A057B0 328381.484375",
-    "48A0AE80 329076",
-    "48A269A0 332621",
-    "48A2C2A0 333333",
-    "48A60400 340000",
-    "48A8C580 345644",
-    "48BEBC20 390625",
-    "48C036C0 393654",
-    "48C1D5A0 396973",
-    "48C2E060 399107",
-    "48C35000 400000",
-    "48C35000 4e5",
-    "48C3A380 400668",
-    "48C40980 401484",
-    "48C71160 407691",
-    "48C83200 410000",
-    "48D00460 426019",
-    "48D228C0 430406",
-    "48D38360 433179",
-    "48D48960 435275",
-    "48D635E0 438703",
-    "48D90380 444444",
-    "48D948E0 444999",
-    "48D96B60 445275",
-    "48DBD640 450226",
-    "48DDAD40 453994",
-    "48E0D200 460432",
-    "48E4A8A0 468293",
-    "48E82E40 475506",
-    "48E851E0 475791",
-    "48E983C0 478238",
-    "48E99AE0 478423",
-    "48EAEE40 481138",
-    "48EBC260 482835",
-    "48EC4000 483840",
-    "48ED3860 485827",
-    "48F022C0 491798",
-    "48F42400 50e4",
-    "48F42400 5e5",
-    "48F98480 511012",
-    "48FA53C0 512670",
-    "49037740 538484",
-    "490433D0 541501",
-    "49056290 546345",
-    "49063B70 549815",
-    "4907A230 555555",
-    "490BF660 573286",
-    "490C0000 573440",
-    "490CDE90 577001",
-    "490E2C20 582338",
-    "490E9E60 584166",
-    "490EDB30 585139",
-    "490F8490 587849",
-    "490FDAE0 589230",
-    "49103830 590723",
-    "49115190 595225",
-    "49117750 595829",
-    "49131000 602368",
-    "49146000 607744",
-    "49159960 612758",
-    "491653C0 615740",
-    "4916A280 617e3",
-    "49175E00 620000",
-    "49181480 622920",
-    "491A9CD0 633293",
-    "491AB520 633682",
-    "491AEC40 634564",
-    "491B21E0 635422",
-    "491F74B0 653131",
-    "49209B20 657842",
-    "4920D8C0 658828",
-    "4920DCC0 658892",
-    "49215420 660802",
-    "492191F0 661791",
-    "4922AE70 666343",
-    "4922C2A0 666666",
-    "492349D0 668829",
-    "4925BD00 678864",
-    "492606B0 680043",
-    "4927A1B0 686619",
-    "4927F750 687989",
-    "49298D70 694487",
-    "492A0290 696361",
-    "492A1C60 696774",
-    "492A2830 696963",
-    "492A4300 697392",
-    "492AE600 700000",
-    "492AE600 7e5",
-    "492C5C80 705992",
-    "492DB5B0 711515",
-    "49302EA0 721642",
-    "4932C820 732290",
-    "493380C0 735244",
-    "4935A440 744004",
-    "4936FAD0 749485",
-    "49389CE0 756174",
-    "493A2360 762422",
-    "493AA4A0 764490",
-    "493B55F0 767327",
-    "493B8740 768116",
-    "493B8E20 768226",
-    "493C8F30 772339",
-    "493D3580 775e3",
-    "493DE310 777777",
-    "493E6E00 78e4",
-    "493EFB64 782262.28125",
-    "493F7D10 784337",
-    "493FEE70 786151",
-    "494185B0 792667",
-    "4941BD30 793555",
-    "49423260 795430",
-    "49424B60 795830",
-    "49435000 800000",
-    "49435000 8e5",
-    "4944DD50 806357",
-    "49452670 807527",
-    "4947F330 818995",
-    "49483180 819992",
-    "494A5030 828675",
-    "494AB4B0 830283",
-    "494AC540 830548",
-    "494CAD10 838353",
-    "494DF5A0 843610",
-    "494EDCB0 847307",
-    "494F0490 847945",
-    "495110E0 856334",
-    "4951AA60 858790",
-    "49531EE0 864750",
-    "49535E40 865764",
-    "4953BA90 867241",
-    "49552280 873e03",
-    "49555360 873782",
-    "4956A490 879177",
-    "4957DA60 884134",
-    "4958C540 887892",
-    "4958D480 888136",
-    "49590380 888888",
-    "49595FA0 890362",
-    "49596790 890489",
-    "4959F3B0 892731",
-    "495A9010 895233",
-    "495B05C0 897116",
-    "495B2FD0 897789",
-    "495B9B00 899504",
-    "495BBA00 9e5",
-    "495DD720 908658",
-    "495DE0A0 908810",
-    "495E7330 911155",
-    "495F2100 913936",
-    "495FE390 917049",
-    "4961CFB0 924923",
-    "4962A260 928294",
-    "49641970 934295",
-    "496491B0 936219",
-    "49649330 936243",
-    "49662770 942711",
-    "496719E0 946590",
-    "49672880 946824",
-    "496753E0 947518",
-    "4967A220 948770",
-    "496981F0 956447",
-    "496A1A50 958885",
-    "496B43E0 963646e0",
-    "496C5E30 968163",
-    "496D16F0 971119",
-    "496F1920 979346",
-    "496FB1B0 981787",
-    "49708740 985204",
-    "4970B3B0 985915",
-    "4971AEF0 989935",
-    "49733480 996168",
-    "4973EB20 999090",
-    "497423F0 999999",
-    "49742400 1000000",
-    "49742400 1e6",
-    "497484E0 1001550",
-    "49784FE0 1017086",
-    "49800000 1048576",
-    "49824680 1067216",
-    "49834C80 1075600",
-    "49849078 1085967",
-    "4987A238 1111111",
-    "498A6AB8 1133911",
-    "498AA678 1135823",
-    "49909E68 1184717",
-    "49918F98 1192435",
-    "49920760 1196268",
-    "4996AD40 1234344",
-    "49999C58 1258379",
-    "499B6E60 1273292",
-    "49AA9EF0 1397726",
-    "49ACE2E0 1416284",
-    "49AFEB48 1441129",
-    "49B01F70 1442798",
-    "49B87262 1510988.3125",
-    "49B95070 1518094",
-    "49BEC880 1562896",
-    "49C04738 1575143",
-    "49C06B60 15763e2",
-    "49C9B478 1652367",
-    "49D05330 1706598",
-    "49D17398 1715827",
-    "49E21D50 1852330",
-    "49E5E080 1883152",
-    "49E622C0 1885272",
-    "49E97628 1912517",
-    "49EB0F78 1925615",
-    "49ECF008 1940993",
-    "49EE6B28 1953125",
-    "49F07B58 1970027",
-    "49F42400 2000000",
-    "49F42400 2e6",
-    "49F83168 2033197",
-    "49F9A7F0 2045182",
-    "4A00BFF0 2109436",
-    "4A026540 2136400",
-    "4A033A6C 2150043",
-    "4A04B4A0 2174248",
-    "4A060400 2195712",
-    "4A07A238 2222222",
-    "4A07BF90 22241e2",
-    "4A07DC94 2225957",
-    "4A086E50 2235284",
-    "4A0BBCA0 2289448",
-    "4A0C6D5C 2300759",
-    "4A0C8A60 2302616",
-    "4A0CE124 2308169",
-    "4A0DFAA8 2326186",
-    "4A0EBF40 2338768",
-    "4A0F78D0 2350644",
-    "4A11B7F8 2387454",
-    "4A122A1C 2394759",
-    "4A133D40 2412368",
-    "4A1801B4 2490477",
-    "4A1847A8 2494954",
-    "4A1CBA34 2567821",
-    "4A1DF0A0 2587688",
-    "4A1E41C8 2592882",
-    "4A1EB100 26e5",
-    "4A205244 2626705",
-    "4A21E044 2652177",
-    "4A26648C 2726179",
-    "4A2AC054 2797589",
-    "4A2CB0BC 2829359",
-    "4A2CD31C 2831559",
-    "4A31197C 2901599",
-    "4A348270 2957468",
-    "4A34BF94 2961381",
-    "4A35E3BC 2980079",
-    "4A360ACC 2982579",
-    "4A371B00 3e6",
-    "4A3A8664 3056025",
-    "4A3A9FBC 3057647",
-    "4A3DC308 3109058",
-    "4A3FD4D8 3142966",
-    "4A4542A0 3231912",
-    "4A455580 3233120",
-    "4A4588C0 3236400",
-    "4A4789C8 3269234",
-    "4A4A4C30 3314444",
-    "4A4B7354 3333333",
-    "4A4E0AB0 3375788",
-    "4A4FB144 3402833",
-    "4A559F80 3500000",
-    "4A57F910 35385e2",
-    "4A587710 3546564",
-    "4A59A12C 3565643",
-    "4A5B02BC 3588271",
-    "4A5CA22C 3614859",
-    "4A61D204 3699841",
-    "4A643160 3738712",
-    "4A64E50C 3750211",
-    "4A69C664 3830169",
-    "4A6AEC60 3848984",
-    "4A6BC828 3863050",
-    "4A6C4990 3871332",
-    "4A6D1F44 3885009",
-    "4A6D446C 3887387",
-    "4A6E0D58 3900245.875",
-    "4A6E7C80 3907360",
-    "4A6EE6D0 3914164",
-    "4A6FB810 3927556",
-    "4A71C760 3961304",
-    "4A72DAE4 3978937",
-    "4A73BFD0 3993588",
-    "4A742400 4000000",
-    "4A742400 40e5",
-    "4A764350 4034772",
-    "4A76A054 4040725",
-    "4A76F100 4045888",
-    "4A77067C 4047263",
-    "4A78EF20 4078536",
-    "4A7977F0 4087292",
-    "4A7A4070 4100124",
-    "4A7D6CAC 4152107",
-    "4A7EA8E4 4172345",
-    "4A7F9270 4187292",
-    "4A7FA2A8 4188330",
-    "4A7FBBC0 4189936",
-    "4A809182 4212929",
-    "4A80C4C6 4219491",
-    "4A816500 4240000",
-    "4A81B3C2 4250081",
-    "4A83981E 4312079",
-    "4A83EE56 4323115",
-    "4A8475E6 4340467",
-    "4A852C38 4363804",
-    "4A8535E2 4365041",
-    "4A869D78 4411068",
-    "4A86F0C4 4421730",
-    "4A879868 4443188",
-    "4A87A238 4444444",
-    "4A87A5D4 4444906",
-    "4A8A8CC0 454e4",
-    "4A8AA648 4543268",
-    "4A8C4492 4596297",
-    "4A8C6180 46e5",
-    "4A8C7308 4602244",
-    "4A8CBC8A 4611653",
-    "4A8CE696 4617035",
-    "4A8EDADE 4681071",
-    "4A909D22 4738705",
-    "4A93186E 4820023",
-    "4A95AD2C 4904598",
-    "4A95C034 4907034",
-    "4A96488A 4924485",
-    "4A967D0A 4931205",
-    "4A96D020 4941840",
-    "4A97A78C 4969414",
-    "4A9805CC 4981478",
-    "4A989680 5000000",
-    "4A989680 5e6",
-    "4A98A126 5001363",
-    "4A997A56 5029163",
-    "4A9C0BE2 5113329",
-    "4A9C4A28 51213e2",
-    "4A9D2884 5149762",
-    "4A9D3C3E 5152287",
-    "4A9E6AC2 5191009",
-    "4A9EC846 5202979",
-    "4A9F9B60 523e4",
-    "4AA26E2E 5322519.25",
-    "4AA2AC4E 5330471",
-    "4AA3F010 5371912",
-    "4AA4342C 5380630",
-    "4AA47D50 5389992",
-    "4AA567C0 542e4",
-    "4AA5BE9A 5431117",
-    "4AA851B4 5515482",
-    "4AA98AC6 5555555",
-    "4AAA8446 5587491",
-    "4AAADEDE 5599087",
-    "4AAB717A 5617853",
-    "4AABA8FC 5624958",
-    "4AABAEB6 5625691",
-    "4AAC1C5C 5639726",
-    "4AAC5638 5647132",
-    "4AAC60CC 5648486",
-    "4AADA0CC 5689446",
-    "4AAEBEC2 5726049",
-    "4AAF5F22 5746577",
-    "4AB1200E 5804039",
-    "4AB2AC30 5854744",
-    "4AB365BC 5878494",
-    "4AB42BD6 5903851",
-    "4AB4AA00 592e4",
-    "4AB5D47A 5958205",
-    "4AB5F5C0 5962464",
-    "4AB624EA 5968501",
-    "4AB67498 59787e2",
-    "4AB67EC0 598e4",
-    "4AB6EA94 5993802",
-    "4AB72C96 6002251",
-    "4AB8778E 6044615",
-    "4AB8A82A 6050837",
-    "4AB8F47C 6060606",
-    "4ABAC962 6120625",
-    "4ABAF6A4 6126418",
-    "4ABE7654 6241066",
-    "4ABEED48 6256292",
-    "4AC0B474 6314554",
-    "4AC3864A 6406949",
-    "4AC4FFF8 6455292",
-    "4AC53036 6461467",
-    "4AC6ED2E 6518423",
-    "4AC79534 6539930",
-    "4AC7B6D8 6544236",
-    "4AC80002 6553601",
-    "4AC8C9A6 6579411",
-    "4AC95AAA 6597973",
-    "4ACAD5E2 6646513",
-    "4ACB7354 6666666",
-    "4ACD8D7A 6735549",
-    "4ACDB482 6740545",
-    "4ACE8B80 6768064",
-    "4ACECEAE 6776663",
-    "4ACF4680 6792e3",
-    "4AD21726 6884243",
-    "4AD35CA6 6925907",
-    "4AD391DA 6932717",
-    "4AD3FA36 6946075",
-    "4AD449CA 6956261",
-    "4AD4689E 6960207",
-    "4AD5562C 6990614",
-    "4AD59F80 7e6",
-    "4AD5AA46 7001379",
-    "4AD79484 7064130",
-    "4AD7F70C 7076742",
-    "4AD93EB4 7118682",
-    "4ADA6FE0 7157744",
-    "4ADAEC78 7173692",
-    "4ADB2E88 7182148",
-    "4ADC8C1E 7226895",
-    "4ADE9354 7293354",
-    "4ADEECEE 7304823",
-    "4ADF6380 7320000",
-    "4AE0F386 7371203",
-    "4AE13F14 7380874",
-    "4AE21AA8 7408980",
-    "4AE270D6 7420011",
-    "4AE35622 7449361",
-    "4AE3E6E2 7467889",
-    "4AE44FB4 7481306",
-    "4AE52A58 7509292",
-    "4AE58934 7521434",
-    "4AE664B4 7549530",
-    "4AE88AB0 7619928",
-    "4AE93032 7641113",
-    "4AEA3A4E 7675175",
-    "4AED5BE2 7777777",
-    "4AEE1C9E 7802447",
-    "4AEF0AD0 7832936",
-    "4AF1EA78 7927100",
-    "4AF1FA8C 7929158",
-    "4AF29330 7948696",
-    "4AF315B8 7965404",
-    "4AF3478A 7971781",
-    "4AF42400 8000000",
-    "4AF42400 80e5",
-    "4AF42400 8e6",
-    "4AF5FD28 8060564",
-    "4AF6C0A4 8085586",
-    "4AF6FB7E 8093119",
-    "4AF8F0A8 8157268",
-    "4AF8F8D6 8158315",
-    "4AF93C48 8166948",
-    "4AFC99DE 8277231",
-    "4AFD5B0C 8301958",
-    "4AFE6200 8335616",
-    "4AFFBF4A 8380325",
-    "4AFFEEB6 8386395",
-    "4B000006 8388614.5",
-    "4B00828C 8422028",
-    "4B011844 8460356",
-    "4B01407C 8470652",
-    "4B02273A 8529722",
-    "4B022BC6 8530886",
-    "4B023525 8533285",
-    "4B0250EA 8540394",
-    "4B031558 8590680",
-    "4B03AE76 8629878",
-    "4B045588 8672648",
-    "4B053590 873e4",
-    "4B053BC3 8731587",
-    "4B06CC74 8834164",
-    "4B0746D8 8865496",
-    "4B0767DC 8873948",
-    "4B07A238 8888888",
-    "4B07B00F 8892431",
-    "4B086DB8 8940984",
-    "4B089CC7 8953031",
-    "4B08C382 8962946",
-    "4B090452 8979538",
-    "4B092DFD 8990205",
-    "4B094C1B 8997915",
-    "4B095440 90e5",
-    "4B0A74EA 9073898",
-    "4B0AD089 9097353",
-    "4B0B24CD 9118925",
-    "4B0B5716 9131798",
-    "4B0B7E9B 9141915",
-    "4B0CE24D 9232973",
-    "4B0DA6B5 9283253",
-    "4B0F1B27 9378599",
-    "4B0F27F1 9381873",
-    "4B0F6EC0 94e5",
-    "4B1026B5 9447093",
-    "4B1039CC 9451980",
-    "4B10AECF 9481935",
-    "4B1122D6 9511638",
-    "4B116CC6 9530566",
-    "4B11B8B0 955e4",
-    "4B11F652 9565778",
-    "4B123145 9580869",
-    "4B138D70 967e4",
-    "4B139EFD 9674493",
-    "4B13F52A 9696554",
-    "4B143BC8 9714632",
-    "4B1454CF 9721039",
-    "4B14A8ED 9742573",
-    "4B1502F9 9765625",
-    "4B154D15 9784597",
-    "4B15A07C 9805948",
-    "4B15BCBA 9813178",
-    "4B15DE34 9821748",
-    "4B163AAA 9845418",
-    "4B16ABAB 9874347",
-    "4B16DE4B 9887307",
-    "4B16F230 9892400",
-    "4B1702D3 9896659",
-    "4B170F0D 9899789",
-    "4B174328 9913128",
-    "4B175BA0 9919392",
-    "4B1767F3 9922547",
-    "4B176B01 9923329",
-    "4B17EB48 9956168",
-    "4B1877F8 9992184",
-    "4B18967F 9999999",
-    "4B189680 1e7",
-    "4B1A1A17 10099223",
-    "4B24CA65 10799717",
-    "4B298AC7 11111111",
-    "4B30A3FF 11576319",
-    "4B317911 11630865",
-    "4B3840E2 12075234",
-    "4B40A3B2 12624818",
-    "4B40F04B 12644427",
-    "4B41CE98 12701336",
-    "4B437F39 12812089",
-    "4B4698B8 13015224",
-    "4B472556 13051222",
-    "4B47D6E3 13096675",
-    "4B4891A0 13144480",
-    "4B519C31 13737009",
-    "4B528654 13796948",
-    "4B59132F 14226223",
-    "4B7749E2 16206306",
-    "4B77FFFA 16252921.5",
-    "4B821910 17052193",
-    "4B868F0E 17636892",
-    "4B876520 17746497",
-    "4B87D6B8 17804655",
-    "4B8958EE 18002395",
-    "4B8C3138 18375281",
-    "4B8E6E42 18668677",
-    "4B90E1D8 1899e4",
-    "4B970FE0 198e5",
-    "4B998342 20121220",
-    "4B99AFB0 20143968",
-    "4B9EFAE6 20837836",
-    "4BA0EFEE 21094364",
-    "4BA17304 21161480",
-    "4BA4B683 21589254",
-    "4BA5C352 21726885",
-    "4BA98AC7 22222222",
-    "4BAA977F 22359806",
-    "4BAB74BB 22473078",
-    "4BAC9FDC 22626233",
-    "4BAFF5C0 23063423",
-    "4BB03EC4 23100809",
-    "4BB550B8 23765361",
-    "4BB809B4 24122215",
-    "4BBB7268 24569041",
-    "4BC360D5 25608618",
-    "4BC876A0 26275135",
-    "4BC8865D 26283194",
-    "4BD04730 27299423",
-    "4BD47306 27846156",
-    "4BDC7D50 289e5",
-    "4BDE68C9 29151634",
-    "4BE05D9F 29408062",
-    "4BE4E1C0 3e7",
-    "4BE6DDA7 30260046",
-    "4BE92801 30560258",
-    "4BE9EDCF 30661534",
-    "4BEDEB96 31184683",
-    "4BF36011 31899682",
-    "4BF36954 31904423",
-    "4BF6409F 32276798",
-    "4BF9A486 32721165",
-    "4BFD82E8 33228241",
-    "4BFD8644 33229960",
-    "4BFE502A 33333333",
-    "4C00A562 33723784",
-    "4C033DE4 34404238",
-    "4C051CFE 34894840",
-    "4C0583B0 35e6",
-    "4C083F9D 35716724",
-    "4C09AD09 36090916",
-    "4C09C2FF 36113404",
-    "4C0A499F 36251260",
-    "4C0A8C89 36319780",
-    "4C0DDCCB 37188395",
-    "4C104B98 37826145",
-    "4C111D1D 38040692",
-    "4C13092F 38544571",
-    "4C131A57 38562139",
-    "4C133DE1 38598533",
-    "4C140640 38803710",
-    "4C1421EA 38832042",
-    "4C1793D6 39735126",
-    "4C1798D1 39740229",
-    "4C188B06 39988247",
-    "4C189680 40000000",
-    "4C1930F7 40158172",
-    "4C19402C 40173744",
-    "4C1A22A3 40405643",
-    "4C1A49B5 40445652",
-    "4C1B0974 40642e3",
-    "4C1BA3C0 40800000",
-    "4C1C6710 41000000",
-    "4C1CB407 41078812",
-    "4C1E5D2F 41514172",
-    "4C208432 42078409",
-    "4C2091AA 42092201",
-    "4C21D52C 42423473",
-    "4C22C32A 42667174",
-    "4C22C502 42669063",
-    "4C22F484 42717713",
-    "4C2521EE 43288506",
-    "4C2554BF 43340539",
-    "4C260B66 43527578",
-    "4C267A3A 43641062",
-    "4C27D8C0 44e6",
-    "4C28F9C1 44295939",
-    "4C2974CC 44421934",
-    "4C298AC7 44444444",
-    "4C2BBB93 450187e2",
-    "4C2BCC77 45035996.273704985",
-    "4C2BCC77 45035996.273704995",
-    "4C2EC292 45812296",
-    "4C2F0254 45877585",
-    "4C2FEBAE 46116538",
-    "4C316228 4650e4",
-    "4C3241CA 46729e03",
-    "4C33B3D5 47107924",
-    "4C34C276 47385048",
-    "4C353C7C 4751e4",
-    "4C357ED7 47577948",
-    "4C36E03C 47939822",
-    "4C3776F1 48094147",
-    "4C37879A 48111209",
-    "4C378A28 48113823",
-    "4C38100C 48250926",
-    "4C387BA6 48361110",
-    "4C39852B 48633003",
-    "4C39C698 487e5",
-    "4C3A43B7 48828125",
-    "4C3BA935 49194195",
-    "4C3EBC20 50000000",
-    "4C3EBC20 5e7",
-    "4C3F64A7 50172572",
-    "4C42A86B 51028396",
-    "4C43B3EF 51302332",
-    "4C4ABCB6 53146328",
-    "4C4B5762 53304714",
-    "4C4DFE60 54e6",
-    "4C4FC6F4 54467535",
-    "4C502CDC 54571890",
-    "4C507F98 54656606",
-    "4C50F2F4 54774735",
-    "4C51CEF0 55e6",
-    "4C521B40 55078143",
-    "4C53ED79 55555555",
-    "4C546716 55680090",
-    "4C559698 55990879",
-    "4C559FBD 56000244",
-    "4C57B8EA 56550310",
-    "4C5A5FF1 57245637",
-    "4C5A9928 57304222",
-    "4C5C21BE 57706234",
-    "4C5C633E 57773302",
-    "4C5DE5AC 58169007",
-    "4C5DF914 58188878",
-    "4C5ED784 58416654",
-    "4C5F573E 58547448",
-    "4C614E78 59062754",
-    "4C632038 59539680",
-    "4C644B5C 59846e3",
-    "4C64E1C0 60e6",
-    "4C64E1C0 6e7",
-    "4C689082 60965384",
-    "4C6BDF8A 61832742",
-    "4C6E06FF 62397437",
-    "4C6F6694 62757456",
-    "4C6FCEA0 62864002",
-    "4C701CD2 62944073",
-    "4C705370 63e6",
-    "4C70F7D8 63168350",
-    "4C72CDD2 63649610",
-    "4C737ED7 63830875",
-    "4C742400 64e6",
-    "4C7574BD 64344821",
-    "4C75BDCE 64419642",
-    "4C75D374 64441808",
-    "4C760E08 64501793",
-    "4C77CB28 64957599",
-    "4C77F490 650e5",
-    "4C786B05 651213e2",
-    "4C7C0FBC 66076400",
-    "4C7E502A 66666666",
-    "4C7E94DA 66737e3",
-    "4C805E2A 67301713",
-    "4C81E6AE 68105580",
-    "4C820CD6 68183731",
-    "4C8245D1 68300424",
-    "4C82AFB9 68517318",
-    "4C835DDE 68873971",
-    "4C84774B 69450330",
-    "4C84AA79 69555144",
-    "4C84EA2D 69685606",
-    "4C84EAB0 69686659",
-    "4C8500B2 69731732",
-    "4C856E45 69956135",
-    "4C8583B0 70e6",
-    "4C867FF6 70516656",
-    "4C875EB4 70972830",
-    "4C876BF8 71e6",
-    "4C881818 71352512",
-    "4C8A0C4B 72376922",
-    "4C8B06DC 72890080",
-    "4C8B8DEE 73166703",
-    "4C8C1066 73433906",
-    "4C8D47E6 74071854",
-    "4C8D53A6 74095920",
-    "4C8DE669 74396490",
-    "4C8F7E94 75232413",
-    "4C9000C1 75499016",
-    "4C9086E4 75773725",
-    "4C909486 75801648",
-    "4C916E5A 76247763",
-    "4C91B8B0 76400000",
-    "4C924EDB 76707543",
-    "4C92560D 76722281",
-    "4C9266CE 76756590",
-    "4C931780 77118461",
-    "4C93E007 77529147",
-    "4C94596E 77777777",
-    "4C96C2DE 79042286",
-    "4C977803 79413272",
-    "4C983B64 79813406",
-    "4C98404F 79823479",
-    "4C989680 80000000",
-    "4C989680 80e6",
-    "4C989680 8e7",
-    "4C9902F5 80222122",
-    "4C9C7003 82018330",
-    "4C9DD0C9 82740809",
-    "4C9DD3A0 82746620",
-    "4C9E0069 82838342",
-    "4C9EC178 83233730",
-    "4C9FAA89 83711047",
-    "4C9FB1A1 83725573",
-    "4C9FC9F8 83775423",
-    "4CA049E9 84037448",
-    "4CA15A3B 84595161",
-    "4CA2494E 85084788",
-    "4CA2C726 85342511",
-    "4CA39B68 85777219",
-    "4CA39F84 85785631",
-    "4CA3D982 85904404",
-    "4CA434D9 86091465",
-    "4CA46494 86189216",
-    "4CA4F4BB 86484437",
-    "4CA583B6 86777268",
-    "4CA5DE2A 86962508",
-    "4CA75842 87736852",
-    "4CA772C7 87791158",
-    "4CA79837 87867832",
-    "4CA91A86 88658996",
-    "4CA98AC7 88888888",
-    "4CA9AE6E 88961903",
-    "4CAA0527 89139509",
-    "4CAAF463 89629465",
-    "4CAB2E71 89748360",
-    "4CABAFA0 90012929",
-    "4CAC5B2C 90364256",
-    "4CAD8168 90966848",
-    "4CAE418F 91360377",
-    "4CAE5E60 91419389",
-    "4CAF8C7D 92038121",
-    "4CAFB717 92125366",
-    "4CAFEEC6 92239407",
-    "4CAFFC4E 92267121",
-    "4CB2023C 93327838",
-    "4CB43063 94470938",
-    "4CB54CCD 95053418",
-    "4CB55FC0 95092224",
-    "4CB59EA6 95221044",
-    "4CB6083B 95437272",
-    "4CB6C1FD 95817703",
-    "4CB811DB 96505557",
-    "4CB873C8 96706114",
-    "4CB892F4 96769950",
-    "4CB8CA18 96882881",
-    "4CB8D1AB 96898389",
-    "4CB97520 97233152",
-    "4CBA389F 97633526",
-    "4CBB448C 98182244",
-    "4CBBE9B3 98520472",
-    "4CBCBE20 98955522",
-    "4CBCC438 98968000",
-    "4CBD2764 99171105",
-    "4CBD7B8E 99343471",
-    "4CBD9728 994e5",
-    "4CBEBC20 99999999",
-    "4CBEBC20 100000000",
-    "4CBEBC20 10e7",
-    "4CBEBC20 1e8",
-    "4CD3ED79 111111111",
-    "4CEB79A3 123456789",
-    "4CF1776B 126597973",
-    "4D06794E 141006042",
-    "4D0B1EA5 145877585",
-    "4D0B5A4E 146121952",
-    "4D4EB950 216765690",
-    "4D53ED79 222222222",
-    "4D68D4A5 244140625",
-    "4D81EC22 272467e3",
-    "4D8F0D18 3e8",
-    "4D95E1D4 314325637",
-    "4D9EF21B 333333333",
-    "4DB56464 380406926",
-    "4DBEBC20 4e8",
-    "4DD3ED79 444444444",
-    "4DE4E1C0 480000000",
-    "4DEE6B28 500000000",
-    "4E04746C 555555555",
-    "4E0CD6EE 590723948",
-    "4E0CE5C1 590966848",
-    "4E0E440D 596706114",
-    "4E104361 605083704",
-    "4E15801D 627050305",
-    "4E16FD29 633293366",
-    "4E1EF21B 666666666",
-    "4E26E49C 7e8",
-    "4E2B2F3E 718e6",
-    "4E2BA950 72e7",
-    "4E2DC893 728900802",
-    "4E310CB5 7426e5",
-    "4E344939 756174393",
-    "4E354C05 760414536",
-    "4E396FCA 777777777",
-    "4E3EBC20 800000000",
-    "4E3F43B3 802221226",
-    "4E401940 805720085",
-    "4E465D40 832e6",
-    "4E4A4690 848405530",
-    "4E4C2A88 856334878",
-    "4E4F8C1F 870516656",
-    "4E517E45 878678326",
-    "4E53ED79 888888888",
-    "4E5479AC 891185938",
-    "4E55F9B9 897478238",
-    "4E5693A4 9e08",
-    "4E5693A4 9e8",
-    "4E57C9B2 905079926",
-    "4E58F5FE 91e07",
-    "4E59B814 913179899",
-    "4E6313B1 952429603",
-    "4E64E1C0 96e7",
-    "4E69A674 98e7",
-    "4E6B6C3C 987434744",
-    "4E6C713D 991711052",
-    "4E6E6B28 999999999",
-    "4E6E6B28 1e9",
-    "4E6E6B29 1.00000006e+09",
-    "4E9184E7 1220703125",
-    "4E932C06 1234567890",
-    "4EEE6B28 2e09",
-    "4EFFFFFD 2147483314",
-    "4EFFFFFD 2147483315",
-    "4EFFFFFE 2147483351",
-    "4EFFFFFE 2147483352",
-    "4EFFFFFE 2147483388",
-    "4EFFFFFE 2147483389",
-    "4EFFFFFE 2147483425",
-    "4EFFFFFE 2147483426",
-    "4EFFFFFF 2147483462",
-    "4EFFFFFF 2147483463",
-    "4EFFFFFF 2147483499",
-    "4EFFFFFF 2147483500",
-    "4EFFFFFF 2147483536",
-    "4EFFFFFF 2147483537",
-    "4EFFFFFF 2147483573",
-    "4EFFFFFF 2147483574",
-    "4F000000 2147483610",
-    "4F000000 2147483611",
-    "4F000000 2147483647",
-    "4F000000 2147483648",
-    "4F1502F9 25e8",
-    "4F18542C 2555653131",
-    "4F26C8DF 2798182244",
-    "4F3EBD30 3200069671",
-    "4F41562C 3243650005",
-    "4F44EA11 3303674053",
-    "4F52DEF1 3537826145",
-    "4F6E6B28 4e9",
-    "4F712632 4045812296",
-    "4F820D2F 4363804324",
-    "4F920719 4899877186",
-    "4F9502F9 5e09",
-    "4F9502F9 5e9",
-    "4F9528FA 5004981478",
-    "4F9796DB 5086492111",
-    "4F9923CB 5138519684",
-    "4FA01870 5371912364",
-    "4FA7F185 5635246428",
-    "4FAB42E9 5746577930",
-    "4FB5E621 6103515625",
-    "4FBBC130 63e8",
-    "4FD09DC3 70e8",
-    "4FDC0D5B 7383725573",
-    "4FE3C54F 7642717713",
-    "4FEBBC83 791e07",
-    "4FEE6B28 80e8",
-    "4FEE6B28 8e9",
-    "5000B5F0 8637627989",
-    "50041CB9 8865899617",
-    "5005BC48 8974836059",
-    "50061C46 9e9",
-    "50097D1D 9226712162",
-    "500C1228 94e8",
-    "500C600D 942042e4",
-    "501022C7 9672793580",
-    "50119F04 9772470297",
-    "501502F9 1e10",
-    "5041B710 1.3e10",
-    "5077A845 1662e7",
-    "50B7BD75 24661173473",
-    "50CDA2D2 276e8",
-    "50D59BAF 2867e7",
-    "50E35FA9 30517578125",
-    "50E6F7CF 31e9",
-    "50F52E46 32907604691",
-    "51093AA0 36837130890",
-    "511502F9 40000000000",
-    "51197B62 412e08",
-    "51325DC2 47879823479",
-    "5139F1C6 49914078536",
-    "513DFD64 51000000000",
-    "51492A6A 54e9",
-    "51559F80 573440e5",
-    "515BCAC9 59e9",
-    "51861C46 72E9",
-    "5189D5F3 74000000000",
-    "519A997C 83e9",
-    "51A7A358 90000000000",
-    "51BA43B7 100000000000",
-    "51BA43B7 1e11",
-    "51BC208E 101e9",
-    "520840A3 1463e8",
-    "520E1BCA 152587890625",
-    "523A43B7 200000000000",
-    "5261D86F 242499697392",
-    "5282629A 280000000000",
-    "528BB2C9 3e11",
-    "52BA43B7 400000000000",
-    "52FAFDCF 539e9",
-    "530E81C6 612062576589",
-    "530EA44D 612641865679",
-    "5330644C 757596946075",
-    "5331A2BC 762939453125",
-    "533EEB57 819992132456",
-    "5368D4A5 1e12",
-    "53E8D4A5 2e12",
-    "542E9F7C 3e12",
-    "545E0B6B 3814697265625",
-    "549184E7 5e012",
-    "549BD269 5354e9",
-    "54AC2BC4 59157491e5",
-    "54CD5F7D 7056562757456",
-    "55024FFA 8955e9",
-    "550715AE 92829494e5",
-    "550C4B86 9641e9",
-    "551184E7 10000000000000",
-    "551184E7 1e13",
-    "558AC723 19073486328125",
-    "559184E7 20000000000000",
-    "55CBBA10 28000000000000",
-    "561184E7 40000000000000",
-    "561C4000 42949672960001",
-    "5699E0B1 84595161401484",
-    "56A2D793 89523386091465",
-    "56AD78EC 95367431640625",
-    "56B5E621 1e14",
-    "5783EEC3 290123e9",
-    "579F295D 350000000000000",
-    "57B5E621 400000000000000",
-    "57B5E621 40e13",
-    "57C0D019 424000000000000",
-    "57D4DED7 468107100525890",
-    "57D8D727 476837158203125",
-    "57E35FA9 5e14",
-    "5809CD5F 606060606060606",
-    "58267002 732000000000000",
-    "5835E621 800000000000000",
-    "5835E621 8e14",
-    "58635FA9 1000000000000000",
-    "58635FA9 1e15",
-    "58800000 1125899906842624.125",
-    "58800000 1125899906842901.875",
-    "58956F79 1314448000000000",
-    "59000000 2251799813685248.25",
-    "59000000 2251799813685803.75",
-    "59078678 2384185791015625",
-    "593D7A62 3333333333333333",
-    "59635FA9 4000000000000000",
-    "59800000 4503599627370496.5",
-    "59800000 4503599627370497.5",
-    "59800000 4503599627475352.5",
-    "59800000 4503599627475353.5",
-    "598E1BCA 5000000000000000",
-    "59D529AF 75e14",
-    "59E35FA9 8000000000000000",
-    "5A000000 9007199254740992",
-    "5A000000 9007199254740993",
-    "5A000000 9007199254740994",
-    "5A000000 9007199254740995",
-    "5A09D865 97e14",
-    "5A0CA459 9896800000000000",
-    "5A0E1BCA 1e16",
-    "5A296816 11920928955078125",
-    "5B53C21C 59604644775390625",
-    "5B64158F 642e14",
-    "5BB1A2BC 1e17",
-    "5C845951 298023223876953125",
-    "5CCE8061 465e15",
-    "5D5E0B6B 1e18",
-    "5DA56FA6 1490116119384765625",
-    "5E056279 2402844368454405395.2",
-    "5ECECB8F 7450580596923828125",
-    "5EF9CCD9 9e18",
-    "5F053A0D 96e017",
-    "5F08DFC5 9.862818194192001e18",
-    "5F0AC723 1e19",
-    "60805E9A 74e18",
-    "609C2007 9e19",
-    "60A3959D 943e17",
-    "60AD78EC 1e20",
-    "6258D727 1e21",
-    "64078678 1e22",
-    "657BBCFA 743e20",
-    "659CFBB2 92666518056446206563E3",
-    "65A96816 1e23",
-    "65A96816 9.999999999999999e22",
-    "6723E072 773886e18",
-    "6753C21C 1e24",
-    "6C186875 737e24",
-    "6D1B18AB 3e27",
-    "715C3BD0 1090544144181609348835077142190",
-    "717A6A7F 124e28",
-    "729C8290 62e29",
-    "73FC6F7C 4e31",
-    "745642CC 67902e27",
-    "7487AF20 86e30",
-    "749DC5AE 1e32",
-    "760A0CF8 7e32",
-    "771209B2 29620e29",
-    "777684DF 5e33",
-    "791A130C 5e34",
-    "7E967699 1e38",
-    "7F000000 1.7014118346046923e+38",
-    "7F7FFFFF 3.4028234664e38",
-    "7F7FFFFF 3.4028234665e38",
-    "7F7FFFFF 3.4028234666e38",
-    "7F800000 3.5028234666e38",
-    "7F800000 51823e34",
-    "7F800000 555e36",
-    "7F800000 912e37",
-    "7F800000 92487298e33",
-    "7F800000 778e39",
-    "7F800000 8e41",
-    "7F800000 81e40",
-    "7F800000 90e40",
-    "7F800000 1.7339253062092163730578609458683877051596800000000000000000000000e+42",
-    "7F800000 1778e39",
-    "7F800000 598e40",
-    "7F800000 808e40",
-    "7F800000 203e41",
-    "7F800000 89e42",
-    "7F800000 2e44",
-    "7F800000 5e44",
-    "7F800000 2.1470977154320536489471030463761883783915110400000000000000000000e+45",
-    "7F800000 6e45",
-    "7F800000 2091e44",
-    "7F800000 368e45",
-    "7F800000 967e45",
-    "7F800000 442e46",
-    "7F800000 7442e45",
-    "7F800000 4e49",
-    "7F800000 892091e44",
-    "7F800000 5e50",
-    "7F800000 7e50",
-    "7F800000 2e51",
-    "7F800000 3e51",
-    "7F800000 39e50",
-    "7F800000 7e51",
-    "7F800000 1.9189205311132686907264385602245237137907390376574976000000000000e+52",
-    "7F800000 2.0972622234386619214559824785284023792871122537545728000000000000e+52",
-    "7F800000 1e53",
-    "7F800000 1.7664960224650106892054063261344555646357024359107788800000000000e+53",
-    "7F800000 335e51",
-    "7F800000 2e54",
-    "7F800000 2.8184483231688951563253238886553506793085187889855201280000000000e+54",
-    "7F800000 6472e51",
-    "7F800000 2e55",
-    "7F800000 5e55",
-    "7F800000 5667844e49",
-    "7F800000 62e055",
-    "7F800000 8e056",
-    "7F800000 1.0001803374372191849407179462120053338028379051879898808320000000e+57",
-    "7F800000 5e57",
-    "7F800000 1.8607245283054342363818436991534856973992070520151142825984000000e+58",
-    "7F800000 7.0420557077594588669468784357561207962098443483187940792729600000e+59",
-    "7F800000 9e59",
-    "7F800000 99e59",
-    "7F800000 13e60",
-    "7F800000 4.4900312744003159009338275160799498340862630046359789166919680000e+61",
-    "7F800000 1e64",
-    "7F800000 88e65",
-    "7F800000 3e69",
-    "7F800000 59e68",
-    "7F800000 86e69",
-    "7F800000 2224e68",
-    "7F800000 9e74",
-    "7F800000 42e74",
-    "7F800000 7.2370055773322621e+75",
-    "7F800000 9184e72",
-    "7F800000 93e74",
-    "7F800000 40041e073",
-    "7F800000 7e77",
-    "7F800000 44e80",
-    "7F800000 9e82",
-    "7F800000 242e81",
-    "7F800000 527e81",
-    "7F800000 9e83",
-    "7F800000 9e84",
-    "7F800000 1e85",
-    "7F800000 7e85",
-    "7F800000 1e86",
-    "7F800000 503e085",
-    "7F800000 112e86",
-    "7F800000 6e88",
-    "7F800000 5e89",
-    "7F800000 8358109e84",
-    "7F800000 90054602635948575728E72",
-    "7F800000 9271e88",
-    "7F800000 9153e89",
-    "7F800000 4e093",
-    "7F800000 3e95",
-    "7F800000 3608e92",
-    "7F800000 791e093",
-    "7F800000 8545e94",
-    "7F800000 80e98",
-    "7F800000 980e98",
-    "7F800000 83126e97",
-    "7F800000 7e105",
-    "7F800000 538e122",
-    "7F800000 7e127",
-    "7F800000 1e128",
-    "7F800000 7795e136",
-    "7F800000 7549530e188",
-    "7F800000 71e223",
-    "7F800000 4e250",
-    "7F800000 1e256",
-    "7F800000 1.01e256",
-    "7F800000 67902e276",
-    "7F800000 9748e282",
-    "7F800000 1e300",
-    "7F800000 19e306",
-    "7F800000 1.797693134862315700000000000000001e308",
-    "7F800000 1.7976931348623157e308",
-    "7F800000 1.7976931348623158e308",
-    "7F800000 0.1e310",
-    "7F800000 1.832312213213213232132132143451234453123412321321312e308",
-    "7F800000 1.8e308",
-    "7F800000 1.9e308",
-    "7F800000 1234456789012345678901234567890e9999999999999999999999999999",
-    "7F800000 12e1342",
-    "7F800000 12e13424",
-    "7F800000 148e3032",
-    "7F800000 18e88640",
-    "7F800000 1e1000",
-    "7F800000 1e1853",
-    "7F800000 1e414218",
-    "7F800000 2139879401095466344511101915470454744.9813888656856943E+272",
-    "7F800000 21e440",
-    "7F800000 21e44003",
-    "7F800000 246723473e3813",
-    "7F800000 24e4421730",
-    "7F800000 2529e2734",
-    "7F800000 26e077774",
-    "7F800000 28e2557",
-    "7F800000 2e08987",
-    "7F800000 2e0898765",
-    "7F800000 2e3000",
-    "7F800000 2e30000000000000000",
-    "7F800000 2e69915",
-    "7F800000 2e801",
-    "7F800000 322e62600000",
-    "7F800000 35e702",
-    "7F800000 39e436",
-    "7F800000 3e60868",
-    "7F800000 3e84959",
-    "7F800000 3e8495912",
-    "7F800000 412e0806",
-    "7F800000 4196e952",
-    "7F800000 43e40076",
-    "7F800000 442e4688",
-    "7F800000 44e864",
-    "7F800000 464e3945",
-    "7F800000 473e3813",
-    "7F800000 47859e743",
-    "7F800000 486e494",
-    "7F800000 49e807",
-    "7F800000 50e4395",
-    "7F800000 51e1566",
-    "7F800000 5400e987",
-    "7F800000 549e57273",
-    "7F800000 555e361951",
-    "7F800000 5e330",
-    "7F800000 5e5728",
-    "7F800000 5e620",
-    "7F800000 5e7873",
-    "7F800000 5e823",
-    "7F800000 5e82392",
-    "7F800000 626e974",
-    "7F800000 62e2929",
-    "7F800000 6472e511",
-    "7F800000 696e840",
-    "7F800000 6e188853",
-    "7F800000 6e356932",
-    "7F800000 6e3569326",
-    "7F800000 6e804",
-    "7F800000 6e984",
-    "7F800000 71758e219652",
-    "7F800000 718e68396",
-    "7F800000 71e914",
-    "7F800000 71e91432",
-    "7F800000 7230489e80000",
-    "7F800000 74e608",
-    "7F800000 75e2224",
-    "7F800000 7859e743",
-    "7F800000 7868e94050",
-    "7F800000 788035e61382",
-    "7F800000 79e1632",
-    "7F800000 7e05401",
-    "7F800000 7e12780",
-    "7F800000 7e2000",
-    "7F800000 7e334",
-    "7F800000 7e33455637",
-    "7F800000 7e41392",
-    "7F800000 7e670471",
-    "7F800000 7e67047175",
-    "7F800000 7e998",
-    "7F800000 808e1755",
-    "7F800000 808e17555",
-    "7F800000 83126e978",
-    "7F800000 83e872",
-    "7F800000 8955e946",
-    "7F800000 89e80000",
-    "7F800000 8e1456105",
-    "7F800000 8e43145",
-    "7F800000 8e431456",
-    "7F800000 8e5087",
-    "7F800000 8e5410",
-    "7F800000 8e5410288",
-    "7F800000 8e679",
-    "7F800000 8e88640",
-    "7F800000 8e905",
-    "7F800000 8e921",
-    "7F800000 8e938662",
-    "7F800000 8e938662882",
-    "7F800000 8e952",
-    "7F800000 915e2486",
-    "7F800000 945e455",
-    "7F800000 953e862",
-    "7F800000 953e8624",
-    "7F800000 963e6685",
-    "7F800000 963e66858",
-    "7F800000 964e858",
-    "7F800000 96e952",
-    "7F800000 9748e2826",
-    "7F800000 976e4108",
-    "7F800000 976e41088617",
-    "7F800000 9837e699095",
-    "7F800000 98e94712",
-    "7F800000 98e947129",
-    "7F800000 99e59958885",
-    "7F800000 99e619",
-    "7F800000 9e1632",
-    "7F800000 9e20735",
-    "7F800000 9e40000000",
-    "7F800000 9e563",
-    "7F800000 9e795",
-    "7F800000 9e904"
-)
+private val FloatData =
+    arrayOf(
+        "00000000 .0",
+        "00000000 0",
+        "00000000 0.0",
+        "00000000 0.0000",
+        "00000000 0e1",
+        "00000000 0e2",
+        "00000000 0e3",
+        "00000000 0e4395",
+        "00000000 0e47",
+        "00000000 0e4851",
+        "00000000 0e5",
+        "00000000 0e7",
+        "00000000 0e785",
+        "00000000 0e93",
+        "00000000 0e9999999999999999999999999999",
+        "00000000 1e-324",
+        "00000000 1e-500",
+        "00000000 3e-324",
+        "00000000 4.9406564584124653e-324",
+        "00000000 4.9406564584124654e-324",
+        "00000000 1.00000000000000188558920870223463870174566020691753515394643550663070558368373221" +
+            "972569761144603605635692374830246134201063722058e-309",
+        "00000000 0.00000000000000000000000000000000000000000000000000000000000000000000000000000000" +
+            "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" +
+            "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" +
+            "000000000000000000000000000000000000000000000000000002225073858507200889024586876085859" +
+            "887650423112240959465493524802562440009228235695178775888803759155264230978095043431208" +
+            "587738715835729182199302029437922422355981982750124204178896957131179108226104397197960" +
+            "400045489739193807919893608152561311337614984204327175103362739154978273159414382813627" +
+            "511383860409424946494228631669542910508020181592664213499660651780309507591305871984642" +
+            "390606863710200510872328278467884363194451586613504122347901479236958520832159762106637" +
+            "540161373658304419360371477835530668283453563400507407304013560296804637591858316312422" +
+            "452159926254649430083685186171942241764645513713542013221703137049658321015465406803539" +
+            "741790602258950302350193751977303094576317321085250729930508976158251915",
+        "00000000 2.2250738585072009e-308",
+        "00000000 2.2250738585072013e-308",
+        "00000000 2.2250738585072014e-308",
+        "00000000 0.00000000000000000000000000000000000000000000000000000000000000000000000000000000" +
+            "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" +
+            "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" +
+            "000000000000000000000000000000000000000000000000000004450147717014402272114819593418263" +
+            "951869639092703291296046852219449644444042153891033059047816270175828298317826079242213" +
+            "740172877389189291055314414815641243486759976282126534658507104573762744298025962244902" +
+            "903779698114444614570510266311510031828794952795966823603998647925096578034214163701381" +
+            "261333311989876551545144031526125381326665295130600018491776632866075559583739224098994" +
+            "780755659409810102161219881460525874257917900007167599934414508608720568157791543592301" +
+            "891033496486942061405218289243144579760516365090360651414037721744226256159024466852576" +
+            "737244643007551333245007965068671949137768847800530996396770975896584413789443379662199" +
+            "396731693628045708486661320679701772891608002069867940855134372886767540",
+        "00000000 1.2e-307",
+        "00000000 1e-300",
+        "00000000 1e-256",
+        "00000000 9007199254740992.e-256",
+        "00000000 1e-128",
+        "00000000 42823146028335318693e-128",
+        "00000000 1e-64",
+        "00000000 7.0060e-46",
+        "00000001 7.0064923216240854e-46",
+        "00000001 1.1754943508e-45",
+        "00000001 1.4012984643e-45",
+        "00000001 0.00000000000000000000000000000000000000000000140129846432481707092372958328991613" +
+            "128026194187651577175706828388979108268586060148663818836212158203125",
+        "007FFFFF 0.00000000000000000000000000000000000001175494210692441075487029444849287348827052" +
+            "428745893333857174530571588870475618904265502351336181163787841796875",
+        "007FFFFF 1.1754942107e-38",
+        "00800000 1.1754943508e-38",
+        "00800000 0.00000000000000000000000000000000000001175494350822287507968736537222245677818665" +
+            "5567720875215087517062784172594547271728515625",
+        "00800003 1.1754947011469036e-38",
+        "00FFFFFF 0.00000000000000000000000000000000000002350988561514728583455765982071533026645717" +
+            "985517980855365926236850006129930346077117064851336181163787841796875",
+        "01000000 2.3509887016445750159374730744444913556373311135441750430175034126e-38",
+        "01800000 4.7019774032891500318749461488889827112746622270883500860350068251e-38",
+        "0A4FB11F 1e-32",
+        "24E69595 1e-16",
+        "29A2212D 7.2e-14",
+        "29E12E13 1e-13",
+        "39102534 0.00013746770127909258",
+        "39BECE41 0.00036393293703440577",
+        "3A6181A6 0.0008602388261351734",
+        "3AD0BAE5 0.0015924838953651488",
+        "3B0D2710 0.002153817447833717",
+        "3B8A536D 0.004221370676532388",
+        "3C467C71 0.012114629615098238",
+        "3CE5EF9A 0.028068351559340954",
+        "3D17CCF0 0.03706067614257336",
+        "3DBE3F17 0.09289376810193062",
+        "3DCCCCCD 0.1",
+        "3E200000 0.15625",
+        "3E200000 0.156250000000000000000000000000000000000000",
+        "3E345144 0.176091259055681",
+        "3E345144 0.1760912590558",
+        "3E5F23F5 0.21791061013936996",
+        "3E943D3B 0.289529654602168",
+        "3E9A209B 0.301029995663981",
+        "3E9A209B 0.30103",
+        "3E9C529D 0.30531780421733856",
+        "3EFFFFFD .4999999",
+        "3F000000 .5",
+        "3F000000 0.5",
+        "3F000002 .5000001",
+        "3F4322D6 0.7622503340244293",
+        "3F800000 1",
+        "3F800000 1e0",
+        "3F800032 1.000006",
+        "3F8147AE 1.01",
+        "3F91EB85 1.14",
+        "3F98089F 1.1877630352973938",
+        "3FA68B6E 1.30113",
+        "3FB0A3D7 1.38",
+        "3FB33333 1.4",
+        "3FC00000 1.5",
+        "3FD9999A 1.7",
+        "3FE66666 1.8",
+        "40000000 2",
+        "40000000 2.0",
+        "40000000 2e0",
+        "400646F1 2.09808",
+        "4019999A 2.4",
+        "402BFB5E 2.687217116355896",
+        "402DF854 2.718281828459045",
+        "402DF854 2.71828182845904523536028747135266249775724709369995",
+        "40400000 3",
+        "40470A3D 3.11",
+        "40490FDB 3.141592653589793",
+        "40490FDB 3.14159265358979323846264338327950288419716939937510",
+        "40490FDB 3.14159265358979323846264338327950288419716939937510582097494459230781640628620899" +
+            "86280348253421170679",
+        "40490FDB 3.14159265359",
+        "40490FF9 3.1416",
+        "404CCCCD 3.2",
+        "40733333 3.8",
+        "4079999A 3.9",
+        "40800000 4",
+        "4083D70A 4.12",
+        "40A00000 5",
+        "40C00000 6",
+        "40C00000 6e0",
+        "40E00000 7",
+        "40E00000 7e0",
+        "40F17C87 7.5464513301849365",
+        "41000000 8",
+        "41100000 9",
+        "41200000 10",
+        "41200000 1e0000001",
+        "41200000 1e01",
+        "41200000 1e1",
+        "41300000 11",
+        "41400000 12",
+        "41500000 13",
+        "415EADE2 13.91745138168335",
+        "41600000 14",
+        "41607AE1 14.03",
+        "41700000 15",
+        "41800000 16",
+        "41880000 17",
+        "418BE43C 17.486443519592285",
+        "41900000 18",
+        "419051EC 18.04",
+        "41980000 19",
+        "41A00000 20",
+        "41A051EC 20.04",
+        "41A80000 21",
+        "41B00000 22",
+        "41B80000 23",
+        "41C00000 24",
+        "41C00000 24e0",
+        "41C6E148 24.86",
+        "41C80000 25",
+        "41D00000 26",
+        "41D00000 26e0",
+        "41D80000 27",
+        "41E00000 28",
+        "41E80000 29",
+        "41F00000 30",
+        "41F00000 3e01",
+        "41F00000 3e1",
+        "41F80000 31",
+        "42000000 32",
+        "42040000 33",
+        "42080000 34",
+        "420C0000 35",
+        "42100000 36",
+        "42140000 37",
+        "42180000 38",
+        "421C0000 39",
+        "42200000 40",
+        "42200000 4e1",
+        "42240000 41",
+        "42280000 42",
+        "422C0000 43",
+        "42300000 44",
+        "42340000 45",
+        "42380000 46",
+        "423C0000 47",
+        "42400000 48",
+        "42440000 49",
+        "42480000 50",
+        "424A70A4 50.61",
+        "424B3F0E 50.811574935913086",
+        "424C0000 51",
+        "42500000 52",
+        "42540000 53",
+        "42580000 54",
+        "425C0000 55",
+        "42600000 56",
+        "42640000 57",
+        "42680000 58",
+        "426C0000 59",
+        "42700000 60",
+        "42700000 6e1",
+        "42740000 61",
+        "42780000 62",
+        "427C0000 63",
+        "42800000 64",
+        "42820000 65",
+        "42840000 66",
+        "42860000 67",
+        "42880000 68",
+        "42887333 68.225",
+        "428A0000 69",
+        "428C0000 70",
+        "428E0000 71",
+        "42900000 72",
+        "42920000 73",
+        "42940000 74",
+        "42960000 75",
+        "42980000 76",
+        "429A0000 77",
+        "429C0000 78",
+        "429E0000 79",
+        "429E0000 79e0",
+        "42A00000 80",
+        "42A00000 8e1",
+        "42A20000 81",
+        "42A40000 82",
+        "42A60000 83",
+        "42A80000 84",
+        "42A80000 84e0",
+        "42AA0000 85",
+        "42AC0000 86",
+        "42AD0F5C 86.53",
+        "42AE0000 87",
+        "42B00000 88",
+        "42B20000 89",
+        "42B40000 90",
+        "42B60000 91",
+        "42B80000 92",
+        "42B80000 92e0",
+        "42BA0000 93",
+        "42BC0000 94",
+        "42BC0000 94e0",
+        "42BE0000 95",
+        "42C00000 96",
+        "42C20000 97",
+        "42C40000 98",
+        "42C60000 99",
+        "42C80000 1.e2",
+        "42C80000 100",
+        "42C80000 10e1",
+        "42C80000 1e2",
+        "42CA0000 101",
+        "42CC0000 102",
+        "42CE0000 103",
+        "42D00000 104",
+        "42D20000 105",
+        "42D40000 106",
+        "42D60000 107",
+        "42D80000 108",
+        "42DA0000 109",
+        "42DC0000 110",
+        "42DE0000 111",
+        "42E00000 112",
+        "42E20000 113",
+        "42E40000 114",
+        "42E60000 115",
+        "42E80000 116",
+        "42EA0000 117",
+        "42EC0000 118",
+        "42EE0000 119",
+        "42F00000 120",
+        "42F20000 121",
+        "42F40000 122",
+        "42F60000 123",
+        "42F80000 124",
+        "42F8566C 124.16878890991211",
+        "42FA0000 125",
+        "42FC0000 126",
+        "42FE0000 127",
+        "43000000 128",
+        "43010000 129",
+        "43020000 130",
+        "43030000 131",
+        "43040000 132",
+        "43050000 133",
+        "43060000 134",
+        "43070000 135",
+        "43080000 136",
+        "43090000 137",
+        "430A0000 138",
+        "430B0000 139",
+        "430C0000 140",
+        "430D0000 141",
+        "430E0000 142",
+        "430F0000 143",
+        "43100000 144",
+        "43110000 145",
+        "43120000 146",
+        "43130000 147",
+        "43140000 148",
+        "43150000 149",
+        "43160000 150",
+        "43170000 151",
+        "43180000 152",
+        "43190000 153",
+        "431A0000 154",
+        "431B0000 155",
+        "431C0000 156",
+        "431D0000 157",
+        "431E0000 158",
+        "431F0000 159",
+        "43200000 160",
+        "43210000 161",
+        "43220000 162",
+        "43230000 163",
+        "43240000 164",
+        "43250000 165",
+        "43260000 166",
+        "43270000 167",
+        "43280000 168",
+        "43290000 169",
+        "432A0000 170",
+        "432B0000 171",
+        "432C0000 172",
+        "432D0000 173",
+        "432E0000 174",
+        "432F0000 175",
+        "43300000 176",
+        "43310000 177",
+        "43320000 178",
+        "43330000 179",
+        "43340000 180",
+        "43350000 181",
+        "43360000 182",
+        "43370000 183",
+        "43380000 184",
+        "43390000 185",
+        "433A0000 186",
+        "433B0000 187",
+        "433C0000 188",
+        "433D0000 189",
+        "433E0000 190",
+        "433F0000 191",
+        "43400000 192",
+        "43410000 193",
+        "43420000 194",
+        "43430000 195",
+        "43440000 196",
+        "43450000 197",
+        "43460000 198",
+        "43470000 199",
+        "43480000 200",
+        "43490000 201",
+        "434A0000 202",
+        "434B0000 203",
+        "434C0000 204",
+        "434D0000 205",
+        "434E0000 206",
+        "434E80CC 206.50310516357422",
+        "434F0000 207",
+        "43500000 208",
+        "43510000 209",
+        "43520000 210",
+        "43530000 211",
+        "43540000 212",
+        "43550000 213",
+        "43560000 214",
+        "43570000 215",
+        "43580000 216",
+        "43590000 217",
+        "435A0000 218",
+        "435B0000 219",
+        "435C0000 220",
+        "435D0000 221",
+        "435E0000 222",
+        "435F0000 223",
+        "43600000 224",
+        "43610000 225",
+        "43620000 226",
+        "43630000 227",
+        "43640000 228",
+        "43650000 229",
+        "43660000 230",
+        "43670000 231",
+        "43680000 232",
+        "43690000 233",
+        "436A0000 234",
+        "436B0000 235",
+        "436C0000 236",
+        "436D0000 237",
+        "436E0000 238",
+        "436F0000 239",
+        "43700000 240",
+        "43710000 241",
+        "43720000 242",
+        "43730000 243",
+        "43740000 244",
+        "43750000 245",
+        "43760000 246",
+        "43770000 247",
+        "43780000 248",
+        "43790000 249",
+        "437A0000 250",
+        "437B0000 251",
+        "437C0000 252",
+        "437D0000 253",
+        "437E0000 254",
+        "437F0000 255",
+        "43800000 256",
+        "43808000 257",
+        "43810000 258",
+        "43818000 259",
+        "43820000 260",
+        "43828000 261",
+        "43830000 262",
+        "43838000 263",
+        "43840000 264",
+        "43848000 265",
+        "43850000 266",
+        "43858000 267",
+        "43860000 268",
+        "43868000 269",
+        "43870000 270",
+        "43878000 271",
+        "43880000 272",
+        "43888000 273",
+        "43890000 274",
+        "43898000 275",
+        "438A0000 276",
+        "438A8000 277",
+        "438B0000 278",
+        "438B8000 279",
+        "438C0000 280",
+        "438C8000 281",
+        "438D0000 282",
+        "438D8000 283",
+        "438E0000 284",
+        "438E8000 285",
+        "438F0000 286",
+        "438F8000 287",
+        "43900000 288",
+        "43908000 289",
+        "43910000 290",
+        "43918000 291",
+        "43920000 292",
+        "43928000 293",
+        "43930000 294",
+        "43932A3D 294.33",
+        "43938000 295",
+        "43940000 296",
+        "43948000 297",
+        "43950000 298",
+        "43958000 299",
+        "43960000 300",
+        "43960000 3e2",
+        "43968000 301",
+        "43970000 302",
+        "43978000 303",
+        "43980000 304",
+        "43988000 305",
+        "43990000 306",
+        "43998000 307",
+        "439A0000 308",
+        "439A8000 309",
+        "439B0000 310",
+        "439B8000 311",
+        "439C0000 312",
+        "439C8000 313",
+        "439D0000 314",
+        "439D8000 315",
+        "439E0000 316",
+        "439E8000 317",
+        "439F0000 318",
+        "439F8000 319",
+        "43A00000 320",
+        "43A00000 32e1",
+        "43A08000 321",
+        "43A10000 322",
+        "43A18000 323",
+        "43A20000 324",
+        "43A28000 325",
+        "43A30000 326",
+        "43A38000 327",
+        "43A40000 328",
+        "43A48000 329",
+        "43A50000 330",
+        "43A58000 331",
+        "43A60000 332",
+        "43A68000 333",
+        "43A70000 334",
+        "43A78000 335",
+        "43A80000 336",
+        "43A88000 337",
+        "43A90000 338",
+        "43A98000 339",
+        "43AA0000 340",
+        "43AA8000 341",
+        "43AB0000 342",
+        "43AB8000 343",
+        "43AC0000 344",
+        "43AC8000 345",
+        "43AD0000 346",
+        "43AD8000 347",
+        "43AE0000 348",
+        "43AE8000 349",
+        "43AF0000 350",
+        "43AF8000 351",
+        "43B00000 352",
+        "43B08000 353",
+        "43B10000 354",
+        "43B18000 355",
+        "43B20000 356",
+        "43B28000 357",
+        "43B30000 358",
+        "43B38000 359",
+        "43B40000 360",
+        "43B48000 361",
+        "43B50000 362",
+        "43B58000 363",
+        "43B60000 364",
+        "43B68000 365",
+        "43B70000 366",
+        "43B78000 367",
+        "43B80000 368",
+        "43B88000 369",
+        "43B90000 370",
+        "43B98000 371",
+        "43BA0000 372",
+        "43BA8000 373",
+        "43BB0000 374",
+        "43BB8000 375",
+        "43BC0000 376",
+        "43BC8000 377",
+        "43BD0000 378",
+        "43BD8000 379",
+        "43BE0000 380",
+        "43BE8000 381",
+        "43BF0000 382",
+        "43BF8000 383",
+        "43C00000 384",
+        "43C08000 385",
+        "43C10000 386",
+        "43C18000 387",
+        "43C20000 388",
+        "43C28000 389",
+        "43C30000 390",
+        "43C38000 391",
+        "43C40000 392",
+        "43C48000 393",
+        "43C50000 394",
+        "43C58000 395",
+        "43C60000 396",
+        "43C68000 397",
+        "43C70000 398",
+        "43C78000 399",
+        "43C80000 400",
+        "43C88000 401",
+        "43C90000 402",
+        "43C98000 403",
+        "43CA0000 404",
+        "43CA8000 405",
+        "43CB0000 406",
+        "43CB8000 407",
+        "43CC0000 408",
+        "43CC8000 409",
+        "43CD0000 410",
+        "43CD8000 411",
+        "43CDF184 411.88682556152344",
+        "43CE0000 412",
+        "43CE8000 413",
+        "43CF0000 414",
+        "43CF8000 415",
+        "43D00000 416",
+        "43D08000 417",
+        "43D10000 418",
+        "43D18000 419",
+        "43D20000 420",
+        "43D28000 421",
+        "43D30000 422",
+        "43D38000 423",
+        "43D40000 424",
+        "43D48000 425",
+        "43D50000 426",
+        "43D58000 427",
+        "43D60000 428",
+        "43D68000 429",
+        "43D70000 430",
+        "43D78000 431",
+        "43D80000 432",
+        "43D88000 433",
+        "43D90000 434",
+        "43D98000 435",
+        "43DA0000 436",
+        "43DA8000 437",
+        "43DB0000 438",
+        "43DB8000 439",
+        "43DC0000 440",
+        "43DC8000 441",
+        "43DD0000 442",
+        "43DD8000 443",
+        "43DE0000 444",
+        "43DE8000 445",
+        "43DF0000 446",
+        "43DF8000 447",
+        "43E00000 448",
+        "43E08000 449",
+        "43E10000 450",
+        "43E18000 451",
+        "43E20000 452",
+        "43E28000 453",
+        "43E30000 454",
+        "43E38000 455",
+        "43E40000 456",
+        "43E48000 457",
+        "43E50000 458",
+        "43E58000 459",
+        "43E60000 460",
+        "43E68000 461",
+        "43E70000 462",
+        "43E78000 463",
+        "43E80000 464",
+        "43E88000 465",
+        "43E90000 466",
+        "43E98000 467",
+        "43EA0000 468",
+        "43EA8000 469",
+        "43EB0000 470",
+        "43EB8000 471",
+        "43EC0000 472",
+        "43EC8000 473",
+        "43ED0000 474",
+        "43ED8000 475",
+        "43EE0000 476",
+        "43EE8000 477",
+        "43EF0000 478",
+        "43EF8000 479",
+        "43F00000 480",
+        "43F08000 481",
+        "43F10000 482",
+        "43F18000 483",
+        "43F20000 484",
+        "43F28000 485",
+        "43F30000 486",
+        "43F38000 487",
+        "43F40000 488",
+        "43F48000 489",
+        "43F50000 490",
+        "43F58000 491",
+        "43F60000 492",
+        "43F68000 493",
+        "43F70000 494",
+        "43F78000 495",
+        "43F80000 496",
+        "43F88000 497",
+        "43F90000 498",
+        "43F98000 499",
+        "43FA0000 500",
+        "43FA8000 501",
+        "43FB0000 502",
+        "43FB8000 503",
+        "43FC0000 504",
+        "43FC8000 505",
+        "43FD0000 506",
+        "43FD8000 507",
+        "43FE0000 508",
+        "43FE8000 509",
+        "43FF0000 510",
+        "43FF8000 511",
+        "44000000 512",
+        "44004000 513",
+        "44008000 514",
+        "4400C000 515",
+        "44010000 516",
+        "44014000 517",
+        "44018000 518",
+        "4401C000 519",
+        "44020000 520",
+        "44024000 521",
+        "44026A3D 521.66",
+        "44028000 522",
+        "4402C000 523",
+        "44030000 524",
+        "44034000 525",
+        "44038000 526",
+        "4403C000 527",
+        "44040000 528",
+        "44044000 529",
+        "44048000 530",
+        "4404C000 531",
+        "44050000 532",
+        "44054000 533",
+        "44058000 534",
+        "4405C000 535",
+        "44060000 536",
+        "44064000 537",
+        "44068000 538",
+        "4406C000 539",
+        "44070000 540",
+        "44074000 541",
+        "44078000 542",
+        "4407C000 543",
+        "44080000 544",
+        "44084000 545",
+        "44088000 546",
+        "4408C000 547",
+        "44090000 548",
+        "44094000 549",
+        "44098000 550",
+        "4409C000 551",
+        "440A0000 552",
+        "440A4000 553",
+        "440A8000 554",
+        "440AC000 555",
+        "440B0000 556",
+        "440B4000 557",
+        "440B8000 558",
+        "440BC000 559",
+        "440C0000 560",
+        "440C4000 561",
+        "440C8000 562",
+        "440CC000 563",
+        "440D0000 564",
+        "440D4000 565",
+        "440D8000 566",
+        "440DC000 567",
+        "440E0000 568",
+        "440E4000 569",
+        "440E8000 570",
+        "440EC000 571",
+        "440F0000 572",
+        "440F4000 573",
+        "440F8000 574",
+        "440FC000 575",
+        "44100000 576",
+        "44104000 577",
+        "44108000 578",
+        "4410C000 579",
+        "44110000 580",
+        "44114000 581",
+        "44118000 582",
+        "4411C000 583",
+        "44120000 584",
+        "44124000 585",
+        "44128000 586",
+        "4412C000 587",
+        "44130000 588",
+        "44134000 589",
+        "44138000 590",
+        "4413C000 591",
+        "44140000 592",
+        "44144000 593",
+        "44148000 594",
+        "4414C000 595",
+        "44150000 596",
+        "44154000 597",
+        "44158000 598",
+        "4415C000 599",
+        "44160000 600",
+        "44160000 6e2",
+        "44164000 601",
+        "44168000 602",
+        "4416C000 603",
+        "44170000 604",
+        "44174000 605",
+        "44178000 606",
+        "4417C000 607",
+        "44180000 608",
+        "44184000 609",
+        "44188000 610",
+        "4418C000 611",
+        "44190000 612",
+        "44194000 613",
+        "44198000 614",
+        "4419C000 615",
+        "441A0000 616",
+        "441A4000 617",
+        "441A8000 618",
+        "441AC000 619",
+        "441B0000 620",
+        "441B4000 621",
+        "441B8000 622",
+        "441BC000 623",
+        "441C0000 624",
+        "441C4000 625",
+        "441C8000 626",
+        "441CC000 627",
+        "441D0000 628",
+        "441D4000 629",
+        "441D8000 630",
+        "441DC000 631",
+        "441E0000 632",
+        "441E4000 633",
+        "441E8000 634",
+        "441EC000 635",
+        "441F0000 636",
+        "441F4000 637",
+        "441F8000 638",
+        "441FC000 639",
+        "44200000 640",
+        "44204000 641",
+        "44208000 642",
+        "4420C000 643",
+        "44210000 644",
+        "44214000 645",
+        "44218000 646",
+        "4421C000 647",
+        "44220000 648",
+        "44224000 649",
+        "44228000 650",
+        "4422C000 651",
+        "44230000 652",
+        "44238000 654",
+        "4423C000 655",
+        "44240000 656",
+        "44244000 657",
+        "44248000 658",
+        "44250000 660",
+        "44254000 661",
+        "44258000 662",
+        "4425C000 663",
+        "44260000 664",
+        "44264000 665",
+        "44268000 666",
+        "4426C000 667",
+        "44270000 668",
+        "44278000 670",
+        "4427C000 671",
+        "44280000 672",
+        "44284000 673",
+        "44288000 674",
+        "4428C000 675",
+        "44294000 677",
+        "44298000 678",
+        "442A0000 680",
+        "442A4000 681",
+        "442B0000 684",
+        "442B4000 685",
+        "442BC000 687",
+        "442C0000 688",
+        "442C4000 689",
+        "442C8000 690",
+        "442CC000 691",
+        "442D0000 692",
+        "442D8000 694",
+        "442DC000 695",
+        "442E0000 696",
+        "442E4000 697",
+        "442E8000 698",
+        "442F0000 700",
+        "442F0000 7e2",
+        "442F4000 701",
+        "442F8000 702",
+        "44300000 704",
+        "44304000 705",
+        "44308000 706",
+        "4430C000 707",
+        "44310000 708",
+        "44314000 709",
+        "44318000 710",
+        "44318000 71e1",
+        "4431C000 711",
+        "44320000 712",
+        "44324000 713",
+        "44328000 714",
+        "4432C000 715",
+        "44330000 716",
+        "44334000 717",
+        "44338000 718",
+        "4433C000 719",
+        "44340000 720",
+        "44344000 721",
+        "44348000 722",
+        "4434C000 723",
+        "44350000 724",
+        "44354000 725",
+        "44358000 726",
+        "4435C000 727",
+        "44360000 728",
+        "44368000 730",
+        "4436C000 731",
+        "44370000 732",
+        "44374000 733",
+        "44378000 734",
+        "4437C000 735",
+        "44380000 736",
+        "44384000 737",
+        "44388000 738",
+        "44390000 740",
+        "44394000 741",
+        "44398000 742",
+        "443A0000 744",
+        "443A4000 745",
+        "443A8000 746",
+        "443AC000 747",
+        "443B0000 748",
+        "443B4000 749",
+        "443B8000 750",
+        "443B8000 75e01",
+        "443BC000 751",
+        "443C0000 752",
+        "443C8000 754",
+        "443CC000 755",
+        "443D0000 756",
+        "443D4000 757",
+        "443D8000 758",
+        "443E0000 760",
+        "443E4000 761",
+        "443EC000 763",
+        "443F0000 764",
+        "443F4000 765",
+        "443F8000 766",
+        "443FC000 767",
+        "44400000 768",
+        "44408000 770",
+        "4440C000 771",
+        "44410000 772",
+        "44414000 773",
+        "44418000 774",
+        "4441C000 775",
+        "44424000 777",
+        "44428000 778",
+        "44430000 780",
+        "44434000 781",
+        "44438000 782",
+        "4443C000 783",
+        "44440000 784",
+        "44444000 785",
+        "44448000 786",
+        "4444C000 787",
+        "44450000 788",
+        "44458000 790",
+        "4445C000 791",
+        "4445C000 791e0",
+        "44464000 793",
+        "44468000 794",
+        "4446C000 795",
+        "44470000 796",
+        "44474000 797",
+        "44478000 798",
+        "44480000 800",
+        "44480000 8e2",
+        "44484000 801",
+        "44488000 802",
+        "4448C000 803",
+        "44490000 804",
+        "44498000 806",
+        "4449C000 807",
+        "444A0000 808",
+        "444A8000 810",
+        "444AC000 811",
+        "444B0000 812",
+        "444B4000 813",
+        "444B8000 814",
+        "444C4000 817",
+        "444C8000 818",
+        "444D0000 820",
+        "444D4000 821",
+        "444DC000 823",
+        "444E0000 824",
+        "444E4000 825",
+        "444E8000 826",
+        "444EC000 827",
+        "444F0000 828",
+        "444F8000 830",
+        "444FC000 831",
+        "44500000 832",
+        "44504000 833",
+        "44508000 834",
+        "4450C000 835",
+        "44510000 836",
+        "44514000 837",
+        "44518000 838",
+        "44520000 840",
+        "44524000 841",
+        "44528000 842",
+        "4452C000 843",
+        "44530000 844",
+        "44538000 846",
+        "4453C000 847",
+        "44540000 848",
+        "44544000 849",
+        "44548000 850",
+        "4454C000 851",
+        "44554000 853",
+        "44558000 854",
+        "4455C000 855",
+        "44564000 857",
+        "44568000 858",
+        "4456C000 859",
+        "44570000 860",
+        "44574000 861",
+        "44578000 862",
+        "4457C000 863",
+        "44580000 864",
+        "44584000 865",
+        "44588000 866",
+        "4458C000 867",
+        "44590000 868",
+        "44594000 869",
+        "44598000 870",
+        "4459C000 871",
+        "445A0000 872",
+        "445A4000 873",
+        "445A8000 874",
+        "445B0000 876",
+        "445B4000 877",
+        "445B8000 878",
+        "445BC000 879",
+        "445C0000 880",
+        "445C4000 881",
+        "445C8000 882",
+        "445CC000 883",
+        "445D0000 884",
+        "445D8000 886",
+        "445DC000 887",
+        "445E0000 888",
+        "445E4000 889",
+        "445E8000 890",
+        "445EC000 891",
+        "445F0000 892",
+        "445F4000 893",
+        "445F8000 894",
+        "44600000 896",
+        "44604000 897",
+        "44608000 898",
+        "4460C000 899",
+        "44610000 900",
+        "44614000 901",
+        "4461C000 903",
+        "44620000 904",
+        "44624000 905",
+        "44628000 906",
+        "4462C000 907",
+        "44630000 908",
+        "44638000 910",
+        "4463C000 911",
+        "44640000 912",
+        "44644000 913",
+        "44648000 914",
+        "44650000 916",
+        "44654000 917",
+        "4465C000 919",
+        "44660000 920",
+        "44664000 921",
+        "44668000 922",
+        "4466C000 923",
+        "44670000 924",
+        "44678000 926",
+        "4467C000 927",
+        "44684000 929",
+        "44688000 930",
+        "44688000 93e1",
+        "4468C000 931",
+        "44694000 933",
+        "44698000 934",
+        "4469C000 935",
+        "4469C000 935e00",
+        "446A0000 936",
+        "446A17B2 936.3702087402344",
+        "446A4000 937",
+        "446B0000 940",
+        "446B4000 941",
+        "446B8000 942",
+        "446BC000 943",
+        "446C0000 944",
+        "446C4000 945",
+        "446C8000 946",
+        "446CC000 947",
+        "446D0000 948",
+        "446D4000 949",
+        "446D8000 950",
+        "446DC000 951",
+        "446E0000 952",
+        "446E4000 953",
+        "446E8000 954",
+        "446EC000 955",
+        "446F0000 956",
+        "446F4000 957",
+        "44700000 960",
+        "44704000 961",
+        "4470C000 963",
+        "44710000 964",
+        "44718000 966",
+        "4471C000 967",
+        "44724000 969",
+        "44728000 970",
+        "4472C000 971",
+        "44730000 972",
+        "44734000 973",
+        "44738000 974",
+        "4473C000 975",
+        "4473C000 975e0",
+        "44740000 976",
+        "44744000 977",
+        "4474C000 979",
+        "44750000 980",
+        "44754000 981",
+        "4475C000 983",
+        "44760000 984",
+        "44768000 986",
+        "4476C000 987",
+        "44774000 989",
+        "44778000 990",
+        "44784000 993",
+        "44788000 994",
+        "4478C000 995",
+        "44790000 996",
+        "44794000 997",
+        "44798000 998",
+        "4479C000 999",
+        "447A0000 1000",
+        "447A0000 1e3",
+        "447AC000 1003",
+        "447B0000 1004",
+        "447B8000 1006",
+        "447BC000 1007",
+        "447C4000 1009",
+        "447C8000 1010",
+        "447D4000 1013",
+        "447D8000 1014",
+        "447E0000 1016",
+        "447E4000 1017",
+        "447EC000 1019",
+        "447F0000 1020",
+        "447F8000 1022",
+        "447FC000 1023",
+        "44800000 1024",
+        "44804000 1026",
+        "44806000 1027",
+        "4480A000 1029",
+        "4480C000 1030",
+        "44812000 1033",
+        "44814000 1034",
+        "44818000 1036",
+        "4481A000 1037",
+        "4481E000 1039",
+        "44820000 1040",
+        "44826000 1043",
+        "44828000 1044",
+        "4482C000 1046",
+        "4482E000 1047",
+        "44832000 1049",
+        "44834000 1050",
+        "4483A000 1053",
+        "4483C000 1054",
+        "44840000 1056",
+        "44842000 1057",
+        "44846000 1059",
+        "44848000 1060",
+        "4484BB85 1061.86",
+        "4484E000 1063",
+        "44850000 1064",
+        "44854000 1066",
+        "44856000 1067",
+        "4485A000 1069",
+        "4485C000 1070",
+        "44860000 1072",
+        "44862000 1073",
+        "44864000 1074",
+        "44866000 1075",
+        "44868000 1076",
+        "4486A000 1077",
+        "4486E000 1079",
+        "44874000 1082",
+        "4487C000 1086",
+        "44882000 1089",
+        "44886000 1091",
+        "44888000 1092",
+        "44890000 1096",
+        "44896000 1099",
+        "4489C000 1102",
+        "448A4000 1106",
+        "448AA000 1109",
+        "448AC000 1110",
+        "448AE000 1111",
+        "448B0000 1112",
+        "448B8000 1116",
+        "448BE000 1119",
+        "448C4000 1122",
+        "448CC000 1126",
+        "448D2000 1129",
+        "448D8000 1132",
+        "448E0000 1136",
+        "44914000 1162",
+        "44916000 1163",
+        "44926000 1171",
+        "4496E000 1207",
+        "44986000 1219",
+        "4499C000 1230",
+        "449FE000 1279",
+        "44A02000 1281",
+        "44AB5DA6 1370.9265747070312",
+        "44ADA000 1389",
+        "44B12000 1417",
+        "44B84000 1474",
+        "44B8C000 1478",
+        "44BCE000 1511",
+        "44BFE000 1535",
+        "44C2C000 1558",
+        "44C36000 1563",
+        "44C3C000 1566",
+        "44C64000 1586",
+        "44C8E000 1607",
+        "44CD2000 1641",
+        "44CFA000 1661",
+        "44CFC000 1662",
+        "44D08000 1668",
+        "44D16000 1675",
+        "44D6A000 1717",
+        "44D90000 1736",
+        "44DCA000 1765",
+        "44DE6000 1779",
+        "44E02000 1793",
+        "44E28000 1812",
+        "44E32000 1817",
+        "44E5E000 1839",
+        "44E6A000 1845",
+        "44E84000 1858",
+        "44E9E000 1871",
+        "44EAA000 1877",
+        "44EF8000 1916",
+        "44F12000 1929",
+        "44F26000 1939",
+        "44F28000 1940",
+        "44F3E000 1951",
+        "44F42000 1953",
+        "44F4C000 1958",
+        "44F8E000 1991",
+        "44F98000 1996",
+        "44F9A000 1997",
+        "44F9C000 1998",
+        "44F9E000 1999",
+        "44FA0000 2000",
+        "44FA2000 2001",
+        "44FA8000 2004",
+        "44FC4148 2018.04",
+        "44FC6000 2019",
+        "44FC8000 2020",
+        "44FC8148 2020.04",
+        "44FD0000 2024",
+        "44FE2000 2033",
+        "44FEA000 2037",
+        "44FFE000 2047",
+        "45015000 2069",
+        "4501E000 2078",
+        "45027000 2087",
+        "45032000 2098",
+        "45069000 2153",
+        "45072000 2162",
+        "45077000 2167",
+        "4508D000 2189",
+        "450AE000 2222",
+        "450C5000 2245",
+        "450D6000 2262",
+        "450E5000 2277",
+        "450E8000 2280",
+        "45100000 2304",
+        "45113000 2323",
+        "4512E000 2350",
+        "4513C000 2364",
+        "45158000 2392",
+        "4515E000 2398",
+        "45171000 2417",
+        "45179000 2425",
+        "4518E000 2446",
+        "451A9000 2473",
+        "451AA000 2474",
+        "451C4000 25e2",
+        "451C7000 2503",
+        "451DD48C 2525.2840576171875",
+        "451E1000 2529",
+        "451FB000 2555",
+        "45201000 2561",
+        "45206000 2566",
+        "4520C000 2572",
+        "4523D000 2621",
+        "45242000 2626",
+        "4525F000 2655",
+        "4528C000 27e2",
+        "452A6000 2726",
+        "452AE000 2734",
+        "452B5000 2741",
+        "452DD000 2781",
+        "452EA000 2794",
+        "452F0000 2800",
+        "452F2000 2802",
+        "452FA000 281e1",
+        "45304000 2820",
+        "45310000 2832",
+        "4531D000 2845",
+        "4531E000 2846",
+        "45322000 2850",
+        "4532E000 2862",
+        "45331000 2865",
+        "4533B000 2875",
+        "45340000 288e1",
+        "4534F000 2895",
+        "4535A000 2906",
+        "45378000 2936",
+        "4537B000 2939",
+        "45392000 2962",
+        "45397000 2967",
+        "4539E000 2974",
+        "453A1000 2977",
+        "453C6000 3014",
+        "453D8000 3032",
+        "453E6000 3046",
+        "453EF000 3055",
+        "453FA000 3066",
+        "453FB000 3067",
+        "45400000 3072",
+        "45401000 3073",
+        "45408000 3080",
+        "4541E000 3102",
+        "45427000 3111",
+        "45428000 3112",
+        "45435000 3125",
+        "45447000 3143",
+        "45487000 3207",
+        "454A4000 3236",
+        "454DD000 3293",
+        "45505000 3333",
+        "45512000 3346",
+        "45520000 3360",
+        "45548000 3400",
+        "4555F000 3423",
+        "45562000 3426",
+        "45582000 3458",
+        "45588000 3464",
+        "4559B000 3483",
+        "455BB000 3515",
+        "455CC000 3532",
+        "455CF000 3535",
+        "45613000 3603",
+        "45618000 3608",
+        "45675000 3701",
+        "4568F000 3727",
+        "456D0000 3792",
+        "45701000 3841",
+        "45723000 3875",
+        "45744000 3908",
+        "45759000 3929",
+        "4578A000 3978",
+        "45795000 3989",
+        "4579F000 3999",
+        "457A0000 4000",
+        "457A0000 4e3",
+        "457AE000 4014",
+        "457BD000 4029",
+        "457E1000 4065",
+        "457E2000 4066",
+        "457F0000 4080",
+        "457FF000 4095",
+        "45800000 4096",
+        "4580E000 4124",
+        "45814000 4136",
+        "4582B800 4183",
+        "4582C000 4184",
+        "4582E800 4189",
+        "4582F800 4191",
+        "45834000 4200",
+        "45838800 4209",
+        "45841000 4226",
+        "4584B800 4247",
+        "45864000 4296",
+        "45875000 4330",
+        "4587E800 4349",
+        "45890000 4384",
+        "45898000 4400",
+        "458A5800 4427",
+        "458AC000 4440",
+        "458AE000 4444",
+        "458B3800 4455",
+        "458D7000 4526",
+        "458ED800 4571",
+        "458FA800 4597",
+        "458FB000 4598",
+        "45902800 4613",
+        "45904800 4617",
+        "4590C000 4632",
+        "45915800 4651",
+        "4591A800 4661",
+        "4591C800 4665",
+        "45921000 4674",
+        "45925000 4682",
+        "4592E000 4700",
+        "45934800 4713",
+        "45939800 4723",
+        "4593A000 4724",
+        "45948800 4753",
+        "45954800 4777",
+        "45965800 4811",
+        "4596A000 4820",
+        "45973000 4838",
+        "45993000 4902",
+        "45999800 4915",
+        "4599E800 4925",
+        "4599F000 4926",
+        "459A0800 4929",
+        "459B6000 4972",
+        "459B8000 4976",
+        "459BF800 4991",
+        "459CB000 5014",
+        "459CE800 5021",
+        "459E9000 5074",
+        "459F0000 5088",
+        "459FC000 5112",
+        "459FD000 5114",
+        "45A10800 5153",
+        "45A18800 5169",
+        "45A1D000 5178",
+        "45A1E000 5180",
+        "45A29000 5202",
+        "45A38000 5232",
+        "45A3A000 5236",
+        "45A58000 5296",
+        "45A5A800 5301",
+        "45A5E000 5308",
+        "45A66000 5324",
+        "45A6B000 5334",
+        "45A77800 5359",
+        "45A83000 5382",
+        "45A8C000 54e2",
+        "45A93800 5415",
+        "45A97800 5423",
+        "45AA0800 5441",
+        "45AC4800 5513",
+        "45ACF800 5535",
+        "45AD9800 5555",
+        "45ADC000 5560",
+        "45AE7800 5583",
+        "45AE9000 5586",
+        "45AF0000 5600",
+        "45AF0800 5601",
+        "45AF2800 5605",
+        "45B02000 5636",
+        "45B06800 5645",
+        "45B1D800 5691",
+        "45B21000 5698",
+        "45B42000 5764",
+        "45B5B000 5814",
+        "45B5F800 5823",
+        "45B6F000 5854",
+        "45B7C000 5880",
+        "45B85800 5899",
+        "45B8E000 5916",
+        "45BA4000 5960",
+        "45BAD800 5979",
+        "45BB7000 5998",
+        "45BBC800 6009",
+        "45BC1800 6019",
+        "45BC9000 6034",
+        "45BCD000 6042",
+        "45BD2800 6053",
+        "45BE2000 6084",
+        "45BF5000 6122",
+        "45C03000 6150",
+        "45C11000 6178",
+        "45C17800 6191",
+        "45C20800 6209",
+        "45C25000 6218",
+        "45C2F800 6239",
+        "45C3B000 6262",
+        "45C41000 6274",
+        "45C51000 6306",
+        "45C53800 6311",
+        "45C574A4 6318.580322265625",
+        "45C5C800 6329",
+        "45C5E000 6332",
+        "45C6C000 6360",
+        "45C7E800 6397",
+        "45C7F000 6398",
+        "45C7F800 6399",
+        "45C82800 6405",
+        "45C84800 6409",
+        "45C89800 6419",
+        "45C8A000 642e1",
+        "45C9B800 6455",
+        "45C9F000 6462",
+        "45CA8800 6481",
+        "45CAF000 6494",
+        "45CB2000 6500",
+        "45CBC800 6521",
+        "45CC1000 653e1",
+        "45CC5000 6538",
+        "45CD2800 6565",
+        "45CEC800 6617",
+        "45D01000 6658",
+        "45D05000 6666",
+        "45D10000 6688",
+        "45D20000 6720",
+        "45D2B000 6742",
+        "45D40000 6784",
+        "45D45000 6794",
+        "45D48000 6800",
+        "45D58000 6832",
+        "45D6C000 6872",
+        "45D85800 6923",
+        "45D97000 6958",
+        "45DAA800 6997",
+        "45DAC000 7e3",
+        "45DAF800 7007",
+        "45DB8800 7025",
+        "45DC6000 7052",
+        "45DC6800 7053",
+        "45DD8000 7088",
+        "45DE2800 7109",
+        "45DE4000 7112",
+        "45DF2800 7141",
+        "45E04800 7177",
+        "45E09800 7187",
+        "45E18000 7216",
+        "45E39000 7282",
+        "45E3B000 7286",
+        "45E57800 7343",
+        "45E5C000 7352",
+        "45E68800 7377",
+        "45E70000 7392",
+        "45E74000 7400",
+        "45E74800 7401",
+        "45E7B800 7415",
+        "45E7C000 7416",
+        "45E7F000 7422",
+        "45E80800 7425",
+        "45E89800 7443",
+        "45E8A000 7444",
+        "45E9B000 7478",
+        "45EA6800 7501",
+        "45EA7800 7503",
+        "45EB7800 7535",
+        "45EBE000 7548",
+        "45EC8800 7569",
+        "45ECB800 7575",
+        "45EDA000 7604",
+        "45EE2800 7621",
+        "45EE5000 7626",
+        "45EEC800 7641",
+        "45EEF800 7647",
+        "45EF0000 7648",
+        "45F0E800 7709",
+        "45F0F800 7711",
+        "45F20000 7744",
+        "45F22800 7749",
+        "45F2C000 7768",
+        "45F30800 7777",
+        "45F35800 7787",
+        "45F39800 7795",
+        "45F41000 7810",
+        "45F45000 7818",
+        "45F5C000 7864",
+        "45F64000 7880",
+        "45F8B000 7958",
+        "45F8B800 7959",
+        "45F96000 7980",
+        "45FA0000 8000",
+        "45FA0800 8001",
+        "45FB3000 8038",
+        "45FBC800 8057",
+        "45FC6800 8077",
+        "45FCB800 8087",
+        "45FD4800 8105",
+        "45FD7800 8111",
+        "45FE0000 8128",
+        "45FEF000 8158",
+        "45FF0800 8161",
+        "46004800 8210",
+        "46005400 8213",
+        "4600F000 8252",
+        "4601B000 8300",
+        "46021800 8326",
+        "46025400 8341",
+        "46026800 8346",
+        "46027400 8349",
+        "4602C800 8370",
+        "4602E400 8377",
+        "4602F000 8380",
+        "46032400 8393",
+        "46032800 8394",
+        "46033000 8396",
+        "46035800 8406",
+        "46037000 8412",
+        "4603B800 8430",
+        "46043400 8461",
+        "4604B400 8493",
+        "4604B800 8494",
+        "46050400 8513",
+        "4605A000 8552",
+        "46060400 8577",
+        "46065C00 8599",
+        "46066C00 8603",
+        "46069000 8612",
+        "46069400 8613",
+        "4606A400 8617",
+        "4606F400 8637",
+        "46071000 8644",
+        "4607D000 8692",
+        "4607E000 8696",
+        "46082800 8714",
+        "4608E800 8762",
+        "46092C00 8779",
+        "4609F400 8829",
+        "460AE000 8888",
+        "460AFC00 8895",
+        "460B6000 8920",
+        "460B6400 8921",
+        "460C1400 8965",
+        "460C2C00 8971",
+        "460CA000 9000",
+        "460CA000 9e3",
+        "460CEC00 9019",
+        "460CFC00 9023",
+        "460D4C00 9043",
+        "460E2000 9096",
+        "460F9000 9188",
+        "46107800 9246",
+        "4610C400 9265",
+        "4610DC00 9271",
+        "4610E400 9273",
+        "46113000 9292",
+        "46119000 9316",
+        "4612C000 9392",
+        "4612D400 9397",
+        "46135800 9430",
+        "46137000 9436",
+        "46140000 9472",
+        "46141400 9477",
+        "46142000 9480",
+        "46143400 9485",
+        "46143800 9486",
+        "46144C00 9491",
+        "46145C00 9495",
+        "46147800 9502",
+        "46148800 9506",
+        "46155800 9558",
+        "46165C00 9623",
+        "46166000 9624",
+        "46171800 9670",
+        "46172000 9672",
+        "46181000 9732",
+        "46184400 9745",
+        "4618F400 9789",
+        "461A9000 9892",
+        "461AE800 9914",
+        "461B5800 9942",
+        "461BC000 9968",
+        "461BEC00 9979",
+        "461C1C00 9991",
+        "461C3C00 9999",
+        "461C4000 10000",
+        "461C4000 1e4",
+        "461E6400 10137",
+        "4620B000 10284",
+        "46258800 10594",
+        "462D9C00 11111",
+        "46333C00 11471",
+        "4634FC00 11583",
+        "463F2000 12232",
+        "46426800 12442",
+        "4647EC00 12795",
+        "464BF000 13052",
+        "46506000 13336",
+        "46592000 13896",
+        "465CB400 14125",
+        "46634400 14545",
+        "4663F000 14588",
+        "466E9C00 15271",
+        "46722974 15498.36376953125",
+        "46742400 15625",
+        "4677D800 15862",
+        "467D3800 16206",
+        "467FF800 16382",
+        "46802FE4 16407.9462890625",
+        "46816200 16561",
+        "4681C200 16609",
+        "4684D000 17e3",
+        "4688174C 17419.6494140625",
+        "468AA400 17746",
+        "46912800 18580",
+        "4693A600 18899",
+        "4694F800 19068",
+        "4695B200 19161",
+        "46984600 19491",
+        "469C3E00 19999",
+        "469CAC00 20054",
+        "469CE400 20082",
+        "469E2E00 20247",
+        "469E6E00 20279",
+        "46A23A00 20765",
+        "46A5AE00 21207",
+        "46A9BE00 21727",
+        "46AB9800 21964",
+        "46AD9C00 22222",
+        "46BA7600 23867",
+        "46BD2200 24209",
+        "46BF0800 24452",
+        "46C40000 25088",
+        "46C80000 256e2",
+        "46C9BE00 25823",
+        "46CA1400 25866",
+        "46CAD200 25961",
+        "46CC8E00 26183",
+        "46CEA600 26451",
+        "46D15A00 26797",
+        "46D1A800 26836",
+        "46D4EE00 27255",
+        "46D54600 27299",
+        "46DAAA00 27989",
+        "46DB4A00 28069",
+        "46DD1800 28300",
+        "46E53600 29339",
+        "46EBA600 30163",
+        "46EBDC00 30190",
+        "46EC162A 30219.0830078125",
+        "46F28A00 31045",
+        "46F68E00 31559",
+        "46F6C600 31587",
+        "46F78000 31680",
+        "47010C00 33036",
+        "4701C500 33221",
+        "47023500 33333",
+        "4703B900 33721",
+        "4703D100 33745",
+        "47074300 34627",
+        "4707FA00 34810",
+        "47091700 35095",
+        "470A6B00 35435",
+        "470D1100 36113",
+        "470D8000 36224",
+        "470E0E00 36366",
+        "470E7F00 36479",
+        "470FE500 36837",
+        "47109600 37014",
+        "4710E000 37088",
+        "4713A900 37801",
+        "4713A900 37801e0",
+        "47160D00 38413",
+        "471ABD00 39613",
+        "471AF900 39673",
+        "471C4000 40000",
+        "471C4000 4e4",
+        "471C8200 40066",
+        "471E4300 40515",
+        "471F8000 40832",
+        "47218200 41346",
+        "4722D600 41686",
+        "47233300 41779",
+        "47241000 42e3",
+        "47269500 42645",
+        "4726D700 42711",
+        "47278900 42889",
+        "47278E00 42894",
+        "47291700 43287",
+        "47291E00 43294",
+        "472B330C 43827.048828125",
+        "472CEF00 44271",
+        "472D9C00 44444",
+        "472ED100 44753",
+        "4732F500 45813",
+        "4735B600 46518",
+        "47370B00 46859",
+        "47382A00 47146",
+        "47395500 47445",
+        "47397F00 47487",
+        "4739CC00 47564",
+        "4739DB00 47579",
+        "473F9500 49045",
+        "47426500 49765",
+        "47435000 5e4",
+        "47448100 50305",
+        "4746B000 50864",
+        "47484300 51267",
+        "4748B900 51385",
+        "47491500 51477",
+        "47495300 51539",
+        "474A6F00 51823",
+        "474A8C00 51852",
+        "474B6000 52064",
+        "474BE000 52192",
+        "474BF200 52210",
+        "474C8B00 52363",
+        "474D0100 52481",
+        "47538600 54150",
+        "47547A00 54394",
+        "47559600 54678",
+        "4755F000 54768",
+        "47571B00 55067",
+        "47583300 55347",
+        "47584800 55368",
+        "4758A800 55464",
+        "47590300 55555",
+        "47595500 55637",
+        "47596500 55653",
+        "475AC800 56008",
+        "475B2900 56105",
+        "475B9C00 56220",
+        "475D8800 56712",
+        "475DD600 56790",
+        "475F9C00 57244",
+        "475FF000 57328",
+        "47606C00 57452",
+        "47615F00 57695",
+        "4762EB00 58091",
+        "47634200 58178",
+        "47634400 58180",
+        "47635800 582e2",
+        "47652400 58660",
+        "476A2800 59944",
+        "476A6000 6e4",
+        "476C4F00 60495",
+        "476D1400 60692",
+        "476E4800 61E3",
+        "476F6100 61281",
+        "476F8100 61313",
+        "47735400 62292",
+        "47749800 62616",
+        "47757400 62836",
+        "4775AE00 62894",
+        "4777C100 63425",
+        "4777D000 63440",
+        "47780D00 63501",
+        "47796D00 63853",
+        "477AB100 64177",
+        "477AE600 6423e1",
+        "477B1B00 64283",
+        "477B4F00 64335",
+        "477CC800 64712",
+        "477D4800 64840",
+        "477F6C00 65388",
+        "47800000 65536",
+        "47809280 65829",
+        "47810E00 66076",
+        "47820A00 66580",
+        "47822500 66634",
+        "47823500 66666",
+        "4782DF00 67006",
+        "4785F400 68584",
+        "47860E80 68637",
+        "4787DC80 69561",
+        "4787ED00 69594",
+        "4788BE80 70013",
+        "47894C80 70297",
+        "4789D280 70565",
+        "478A6500 70858",
+        "478A7000 7088e1",
+        "478B8400 71432",
+        "478C2700 71758",
+        "478D1F80 72255",
+        "478D3800 72304",
+        "478D9880 72497",
+        "478DA200 72516",
+        "478FC480 73609",
+        "478FF400 73704",
+        "47903400 73832",
+        "4790F980 74227",
+        "47928F00 75038",
+        "47938980 75539",
+        "4793F780 75759",
+        "47941080 75809",
+        "47949300 76070",
+        "4794E900 76242",
+        "47959680 76589",
+        "4796B600 77164",
+        "47975680 77485",
+        "4797CB80 77719",
+        "4797E880 77777",
+        "47980600 77836",
+        "47989680 78125",
+        "4798B500 78186",
+        "479A0080 78849",
+        "479A6F80 79071",
+        "479AF900 79346",
+        "479BA380 79687",
+        "479BB400 79720",
+        "479C4000 80000",
+        "479C4000 8e4",
+        "479C5580 80043",
+        "479D0400 80392",
+        "479D1E00 80444",
+        "479D8E00 80668",
+        "479F1F80 81471",
+        "479FD900 81842",
+        "47A1C100 82818",
+        "47A20A00 82964",
+        "47A25B00 83126",
+        "47A29A80 83253",
+        "47A2E200 83396",
+        "47A33000 83552",
+        "47A33080 83553",
+        "47A33E80 83581",
+        "47A34080 83585",
+        "47A53000 84576",
+        "47A56780 84687",
+        "47A5FD80 84987",
+        "47A605A0 85003.24609375",
+        "47A64680 85133",
+        "47A7C900 85906",
+        "47A7CE00 85916",
+        "47A85680 86189",
+        "47A8B400 86376",
+        "47A9C680 86925",
+        "47AA4E00 87196",
+        "47AA7580 87275",
+        "47AAB000 87392",
+        "47AB2480 87625",
+        "47AD5580 88747",
+        "47AD7680 88813",
+        "47AD9C00 88888",
+        "47ADBF00 88958",
+        "47ADE600 89036",
+        "47AEED00 89562",
+        "47AF3480 89705",
+        "47AF7680 89837",
+        "47AFC800 9e4",
+        "47AFF000 90080",
+        "47B0E180 90563",
+        "47B12D80 90715",
+        "47B15D80 90811",
+        "47B18000 90880",
+        "47B18900 90898",
+        "47B27800 91376",
+        "47B28D80 91419",
+        "47B2B780 91503",
+        "47B3E780 92111",
+        "47B4A380 92487",
+        "47B52500 92746",
+        "47B68280 93445",
+        "47B78200 93956",
+        "47B8ED00 94682",
+        "47B96900 94930",
+        "47BA2200 953e2",
+        "47BA2A80 95317",
+        "47BA4200 95364",
+        "47BA9380 95527",
+        "47BB5C00 95928",
+        "47BC0580 96267",
+        "47BC0800 96272",
+        "47BDAB80 97111",
+        "47BDE500 97226",
+        "47BE0200 97284",
+        "47BEDD80 97723",
+        "47BEDE00 97724",
+        "47BEEF00 97758",
+        "47BF6800 98e3",
+        "47BF8A00 98068",
+        "47BFBA80 98165",
+        "47BFBE00 98172",
+        "47C0DD00 98746",
+        "47C16580 99019",
+        "47C19180 99107",
+        "47C26A80 99541",
+        "47C2EA80 99797",
+        "47C34D80 99995",
+        "47C34F80 99999",
+        "47C35000 100000",
+        "47C35000 1e5",
+        "47C65E00 101564",
+        "47C8DE00 102844",
+        "47D2E280 107973",
+        "47D90380 111111",
+        "47DEA800 114000",
+        "47FA0300 128006",
+        "47FFA500 130890",
+        "4807C540 139029",
+        "480F2B80 146606",
+        "48102400 1476e2",
+        "4810F600 148440",
+        "48149A80 152170",
+        "48191B84 156782.0703125",
+        "4819D280 157514",
+        "481AE000 158592",
+        "481B0100 158724",
+        "4825DC00 169840",
+        "482C7B00 176620",
+        "482C9C00 176752",
+        "482DC6C0 177947",
+        "482E3800 178400",
+        "483B2080 191618",
+        "483EC680 195354",
+        "483F90C0 196163",
+        "48435000 200000",
+        "48435000 20e04",
+        "48435000 2e5",
+        "48451A40 201833",
+        "48464BC0 203055",
+        "484CDEC0 209787",
+        "4852D6C0 215899",
+        "48567FC0 219647",
+        "48568100 219652",
+        "48590380 222222",
+        "485919C0 222311",
+        "485CED40 226229",
+        "485D93C0 226895",
+        "485E62C0 227723",
+        "486003C0 229391",
+        "486805C0 237591",
+        "486CD0C0 242499",
+        "486ED800 244576",
+        "48701040 245825",
+        "4870F0C0 246723",
+        "487319C0 248935",
+        "48796E00 255416",
+        "487A5C40 256369",
+        "487C9A40 258665",
+        "487CCD40 258869",
+        "488131A0 264589",
+        "48850A60 272467",
+        "48885FC0 279294",
+        "4888B800 280000",
+        "488D6300 289560",
+        "488DB840 290242",
+        "488E8260 291859",
+        "4891A980 298316",
+        "48927B60 299995",
+        "48933120 301449",
+        "4895D6A0 306869",
+        "4896C580 308780",
+        "48997AA0 314325",
+        "489A6DE0 316271",
+        "489E61A0 324365",
+        "489F7480 326564",
+        "48A057B0 328381.484375",
+        "48A0AE80 329076",
+        "48A269A0 332621",
+        "48A2C2A0 333333",
+        "48A60400 340000",
+        "48A8C580 345644",
+        "48BEBC20 390625",
+        "48C036C0 393654",
+        "48C1D5A0 396973",
+        "48C2E060 399107",
+        "48C35000 400000",
+        "48C35000 4e5",
+        "48C3A380 400668",
+        "48C40980 401484",
+        "48C71160 407691",
+        "48C83200 410000",
+        "48D00460 426019",
+        "48D228C0 430406",
+        "48D38360 433179",
+        "48D48960 435275",
+        "48D635E0 438703",
+        "48D90380 444444",
+        "48D948E0 444999",
+        "48D96B60 445275",
+        "48DBD640 450226",
+        "48DDAD40 453994",
+        "48E0D200 460432",
+        "48E4A8A0 468293",
+        "48E82E40 475506",
+        "48E851E0 475791",
+        "48E983C0 478238",
+        "48E99AE0 478423",
+        "48EAEE40 481138",
+        "48EBC260 482835",
+        "48EC4000 483840",
+        "48ED3860 485827",
+        "48F022C0 491798",
+        "48F42400 50e4",
+        "48F42400 5e5",
+        "48F98480 511012",
+        "48FA53C0 512670",
+        "49037740 538484",
+        "490433D0 541501",
+        "49056290 546345",
+        "49063B70 549815",
+        "4907A230 555555",
+        "490BF660 573286",
+        "490C0000 573440",
+        "490CDE90 577001",
+        "490E2C20 582338",
+        "490E9E60 584166",
+        "490EDB30 585139",
+        "490F8490 587849",
+        "490FDAE0 589230",
+        "49103830 590723",
+        "49115190 595225",
+        "49117750 595829",
+        "49131000 602368",
+        "49146000 607744",
+        "49159960 612758",
+        "491653C0 615740",
+        "4916A280 617e3",
+        "49175E00 620000",
+        "49181480 622920",
+        "491A9CD0 633293",
+        "491AB520 633682",
+        "491AEC40 634564",
+        "491B21E0 635422",
+        "491F74B0 653131",
+        "49209B20 657842",
+        "4920D8C0 658828",
+        "4920DCC0 658892",
+        "49215420 660802",
+        "492191F0 661791",
+        "4922AE70 666343",
+        "4922C2A0 666666",
+        "492349D0 668829",
+        "4925BD00 678864",
+        "492606B0 680043",
+        "4927A1B0 686619",
+        "4927F750 687989",
+        "49298D70 694487",
+        "492A0290 696361",
+        "492A1C60 696774",
+        "492A2830 696963",
+        "492A4300 697392",
+        "492AE600 700000",
+        "492AE600 7e5",
+        "492C5C80 705992",
+        "492DB5B0 711515",
+        "49302EA0 721642",
+        "4932C820 732290",
+        "493380C0 735244",
+        "4935A440 744004",
+        "4936FAD0 749485",
+        "49389CE0 756174",
+        "493A2360 762422",
+        "493AA4A0 764490",
+        "493B55F0 767327",
+        "493B8740 768116",
+        "493B8E20 768226",
+        "493C8F30 772339",
+        "493D3580 775e3",
+        "493DE310 777777",
+        "493E6E00 78e4",
+        "493EFB64 782262.28125",
+        "493F7D10 784337",
+        "493FEE70 786151",
+        "494185B0 792667",
+        "4941BD30 793555",
+        "49423260 795430",
+        "49424B60 795830",
+        "49435000 800000",
+        "49435000 8e5",
+        "4944DD50 806357",
+        "49452670 807527",
+        "4947F330 818995",
+        "49483180 819992",
+        "494A5030 828675",
+        "494AB4B0 830283",
+        "494AC540 830548",
+        "494CAD10 838353",
+        "494DF5A0 843610",
+        "494EDCB0 847307",
+        "494F0490 847945",
+        "495110E0 856334",
+        "4951AA60 858790",
+        "49531EE0 864750",
+        "49535E40 865764",
+        "4953BA90 867241",
+        "49552280 873e03",
+        "49555360 873782",
+        "4956A490 879177",
+        "4957DA60 884134",
+        "4958C540 887892",
+        "4958D480 888136",
+        "49590380 888888",
+        "49595FA0 890362",
+        "49596790 890489",
+        "4959F3B0 892731",
+        "495A9010 895233",
+        "495B05C0 897116",
+        "495B2FD0 897789",
+        "495B9B00 899504",
+        "495BBA00 9e5",
+        "495DD720 908658",
+        "495DE0A0 908810",
+        "495E7330 911155",
+        "495F2100 913936",
+        "495FE390 917049",
+        "4961CFB0 924923",
+        "4962A260 928294",
+        "49641970 934295",
+        "496491B0 936219",
+        "49649330 936243",
+        "49662770 942711",
+        "496719E0 946590",
+        "49672880 946824",
+        "496753E0 947518",
+        "4967A220 948770",
+        "496981F0 956447",
+        "496A1A50 958885",
+        "496B43E0 963646e0",
+        "496C5E30 968163",
+        "496D16F0 971119",
+        "496F1920 979346",
+        "496FB1B0 981787",
+        "49708740 985204",
+        "4970B3B0 985915",
+        "4971AEF0 989935",
+        "49733480 996168",
+        "4973EB20 999090",
+        "497423F0 999999",
+        "49742400 1000000",
+        "49742400 1e6",
+        "497484E0 1001550",
+        "49784FE0 1017086",
+        "49800000 1048576",
+        "49824680 1067216",
+        "49834C80 1075600",
+        "49849078 1085967",
+        "4987A238 1111111",
+        "498A6AB8 1133911",
+        "498AA678 1135823",
+        "49909E68 1184717",
+        "49918F98 1192435",
+        "49920760 1196268",
+        "4996AD40 1234344",
+        "49999C58 1258379",
+        "499B6E60 1273292",
+        "49AA9EF0 1397726",
+        "49ACE2E0 1416284",
+        "49AFEB48 1441129",
+        "49B01F70 1442798",
+        "49B87262 1510988.3125",
+        "49B95070 1518094",
+        "49BEC880 1562896",
+        "49C04738 1575143",
+        "49C06B60 15763e2",
+        "49C9B478 1652367",
+        "49D05330 1706598",
+        "49D17398 1715827",
+        "49E21D50 1852330",
+        "49E5E080 1883152",
+        "49E622C0 1885272",
+        "49E97628 1912517",
+        "49EB0F78 1925615",
+        "49ECF008 1940993",
+        "49EE6B28 1953125",
+        "49F07B58 1970027",
+        "49F42400 2000000",
+        "49F42400 2e6",
+        "49F83168 2033197",
+        "49F9A7F0 2045182",
+        "4A00BFF0 2109436",
+        "4A026540 2136400",
+        "4A033A6C 2150043",
+        "4A04B4A0 2174248",
+        "4A060400 2195712",
+        "4A07A238 2222222",
+        "4A07BF90 22241e2",
+        "4A07DC94 2225957",
+        "4A086E50 2235284",
+        "4A0BBCA0 2289448",
+        "4A0C6D5C 2300759",
+        "4A0C8A60 2302616",
+        "4A0CE124 2308169",
+        "4A0DFAA8 2326186",
+        "4A0EBF40 2338768",
+        "4A0F78D0 2350644",
+        "4A11B7F8 2387454",
+        "4A122A1C 2394759",
+        "4A133D40 2412368",
+        "4A1801B4 2490477",
+        "4A1847A8 2494954",
+        "4A1CBA34 2567821",
+        "4A1DF0A0 2587688",
+        "4A1E41C8 2592882",
+        "4A1EB100 26e5",
+        "4A205244 2626705",
+        "4A21E044 2652177",
+        "4A26648C 2726179",
+        "4A2AC054 2797589",
+        "4A2CB0BC 2829359",
+        "4A2CD31C 2831559",
+        "4A31197C 2901599",
+        "4A348270 2957468",
+        "4A34BF94 2961381",
+        "4A35E3BC 2980079",
+        "4A360ACC 2982579",
+        "4A371B00 3e6",
+        "4A3A8664 3056025",
+        "4A3A9FBC 3057647",
+        "4A3DC308 3109058",
+        "4A3FD4D8 3142966",
+        "4A4542A0 3231912",
+        "4A455580 3233120",
+        "4A4588C0 3236400",
+        "4A4789C8 3269234",
+        "4A4A4C30 3314444",
+        "4A4B7354 3333333",
+        "4A4E0AB0 3375788",
+        "4A4FB144 3402833",
+        "4A559F80 3500000",
+        "4A57F910 35385e2",
+        "4A587710 3546564",
+        "4A59A12C 3565643",
+        "4A5B02BC 3588271",
+        "4A5CA22C 3614859",
+        "4A61D204 3699841",
+        "4A643160 3738712",
+        "4A64E50C 3750211",
+        "4A69C664 3830169",
+        "4A6AEC60 3848984",
+        "4A6BC828 3863050",
+        "4A6C4990 3871332",
+        "4A6D1F44 3885009",
+        "4A6D446C 3887387",
+        "4A6E0D58 3900245.875",
+        "4A6E7C80 3907360",
+        "4A6EE6D0 3914164",
+        "4A6FB810 3927556",
+        "4A71C760 3961304",
+        "4A72DAE4 3978937",
+        "4A73BFD0 3993588",
+        "4A742400 4000000",
+        "4A742400 40e5",
+        "4A764350 4034772",
+        "4A76A054 4040725",
+        "4A76F100 4045888",
+        "4A77067C 4047263",
+        "4A78EF20 4078536",
+        "4A7977F0 4087292",
+        "4A7A4070 4100124",
+        "4A7D6CAC 4152107",
+        "4A7EA8E4 4172345",
+        "4A7F9270 4187292",
+        "4A7FA2A8 4188330",
+        "4A7FBBC0 4189936",
+        "4A809182 4212929",
+        "4A80C4C6 4219491",
+        "4A816500 4240000",
+        "4A81B3C2 4250081",
+        "4A83981E 4312079",
+        "4A83EE56 4323115",
+        "4A8475E6 4340467",
+        "4A852C38 4363804",
+        "4A8535E2 4365041",
+        "4A869D78 4411068",
+        "4A86F0C4 4421730",
+        "4A879868 4443188",
+        "4A87A238 4444444",
+        "4A87A5D4 4444906",
+        "4A8A8CC0 454e4",
+        "4A8AA648 4543268",
+        "4A8C4492 4596297",
+        "4A8C6180 46e5",
+        "4A8C7308 4602244",
+        "4A8CBC8A 4611653",
+        "4A8CE696 4617035",
+        "4A8EDADE 4681071",
+        "4A909D22 4738705",
+        "4A93186E 4820023",
+        "4A95AD2C 4904598",
+        "4A95C034 4907034",
+        "4A96488A 4924485",
+        "4A967D0A 4931205",
+        "4A96D020 4941840",
+        "4A97A78C 4969414",
+        "4A9805CC 4981478",
+        "4A989680 5000000",
+        "4A989680 5e6",
+        "4A98A126 5001363",
+        "4A997A56 5029163",
+        "4A9C0BE2 5113329",
+        "4A9C4A28 51213e2",
+        "4A9D2884 5149762",
+        "4A9D3C3E 5152287",
+        "4A9E6AC2 5191009",
+        "4A9EC846 5202979",
+        "4A9F9B60 523e4",
+        "4AA26E2E 5322519.25",
+        "4AA2AC4E 5330471",
+        "4AA3F010 5371912",
+        "4AA4342C 5380630",
+        "4AA47D50 5389992",
+        "4AA567C0 542e4",
+        "4AA5BE9A 5431117",
+        "4AA851B4 5515482",
+        "4AA98AC6 5555555",
+        "4AAA8446 5587491",
+        "4AAADEDE 5599087",
+        "4AAB717A 5617853",
+        "4AABA8FC 5624958",
+        "4AABAEB6 5625691",
+        "4AAC1C5C 5639726",
+        "4AAC5638 5647132",
+        "4AAC60CC 5648486",
+        "4AADA0CC 5689446",
+        "4AAEBEC2 5726049",
+        "4AAF5F22 5746577",
+        "4AB1200E 5804039",
+        "4AB2AC30 5854744",
+        "4AB365BC 5878494",
+        "4AB42BD6 5903851",
+        "4AB4AA00 592e4",
+        "4AB5D47A 5958205",
+        "4AB5F5C0 5962464",
+        "4AB624EA 5968501",
+        "4AB67498 59787e2",
+        "4AB67EC0 598e4",
+        "4AB6EA94 5993802",
+        "4AB72C96 6002251",
+        "4AB8778E 6044615",
+        "4AB8A82A 6050837",
+        "4AB8F47C 6060606",
+        "4ABAC962 6120625",
+        "4ABAF6A4 6126418",
+        "4ABE7654 6241066",
+        "4ABEED48 6256292",
+        "4AC0B474 6314554",
+        "4AC3864A 6406949",
+        "4AC4FFF8 6455292",
+        "4AC53036 6461467",
+        "4AC6ED2E 6518423",
+        "4AC79534 6539930",
+        "4AC7B6D8 6544236",
+        "4AC80002 6553601",
+        "4AC8C9A6 6579411",
+        "4AC95AAA 6597973",
+        "4ACAD5E2 6646513",
+        "4ACB7354 6666666",
+        "4ACD8D7A 6735549",
+        "4ACDB482 6740545",
+        "4ACE8B80 6768064",
+        "4ACECEAE 6776663",
+        "4ACF4680 6792e3",
+        "4AD21726 6884243",
+        "4AD35CA6 6925907",
+        "4AD391DA 6932717",
+        "4AD3FA36 6946075",
+        "4AD449CA 6956261",
+        "4AD4689E 6960207",
+        "4AD5562C 6990614",
+        "4AD59F80 7e6",
+        "4AD5AA46 7001379",
+        "4AD79484 7064130",
+        "4AD7F70C 7076742",
+        "4AD93EB4 7118682",
+        "4ADA6FE0 7157744",
+        "4ADAEC78 7173692",
+        "4ADB2E88 7182148",
+        "4ADC8C1E 7226895",
+        "4ADE9354 7293354",
+        "4ADEECEE 7304823",
+        "4ADF6380 7320000",
+        "4AE0F386 7371203",
+        "4AE13F14 7380874",
+        "4AE21AA8 7408980",
+        "4AE270D6 7420011",
+        "4AE35622 7449361",
+        "4AE3E6E2 7467889",
+        "4AE44FB4 7481306",
+        "4AE52A58 7509292",
+        "4AE58934 7521434",
+        "4AE664B4 7549530",
+        "4AE88AB0 7619928",
+        "4AE93032 7641113",
+        "4AEA3A4E 7675175",
+        "4AED5BE2 7777777",
+        "4AEE1C9E 7802447",
+        "4AEF0AD0 7832936",
+        "4AF1EA78 7927100",
+        "4AF1FA8C 7929158",
+        "4AF29330 7948696",
+        "4AF315B8 7965404",
+        "4AF3478A 7971781",
+        "4AF42400 8000000",
+        "4AF42400 80e5",
+        "4AF42400 8e6",
+        "4AF5FD28 8060564",
+        "4AF6C0A4 8085586",
+        "4AF6FB7E 8093119",
+        "4AF8F0A8 8157268",
+        "4AF8F8D6 8158315",
+        "4AF93C48 8166948",
+        "4AFC99DE 8277231",
+        "4AFD5B0C 8301958",
+        "4AFE6200 8335616",
+        "4AFFBF4A 8380325",
+        "4AFFEEB6 8386395",
+        "4B000006 8388614.5",
+        "4B00828C 8422028",
+        "4B011844 8460356",
+        "4B01407C 8470652",
+        "4B02273A 8529722",
+        "4B022BC6 8530886",
+        "4B023525 8533285",
+        "4B0250EA 8540394",
+        "4B031558 8590680",
+        "4B03AE76 8629878",
+        "4B045588 8672648",
+        "4B053590 873e4",
+        "4B053BC3 8731587",
+        "4B06CC74 8834164",
+        "4B0746D8 8865496",
+        "4B0767DC 8873948",
+        "4B07A238 8888888",
+        "4B07B00F 8892431",
+        "4B086DB8 8940984",
+        "4B089CC7 8953031",
+        "4B08C382 8962946",
+        "4B090452 8979538",
+        "4B092DFD 8990205",
+        "4B094C1B 8997915",
+        "4B095440 90e5",
+        "4B0A74EA 9073898",
+        "4B0AD089 9097353",
+        "4B0B24CD 9118925",
+        "4B0B5716 9131798",
+        "4B0B7E9B 9141915",
+        "4B0CE24D 9232973",
+        "4B0DA6B5 9283253",
+        "4B0F1B27 9378599",
+        "4B0F27F1 9381873",
+        "4B0F6EC0 94e5",
+        "4B1026B5 9447093",
+        "4B1039CC 9451980",
+        "4B10AECF 9481935",
+        "4B1122D6 9511638",
+        "4B116CC6 9530566",
+        "4B11B8B0 955e4",
+        "4B11F652 9565778",
+        "4B123145 9580869",
+        "4B138D70 967e4",
+        "4B139EFD 9674493",
+        "4B13F52A 9696554",
+        "4B143BC8 9714632",
+        "4B1454CF 9721039",
+        "4B14A8ED 9742573",
+        "4B1502F9 9765625",
+        "4B154D15 9784597",
+        "4B15A07C 9805948",
+        "4B15BCBA 9813178",
+        "4B15DE34 9821748",
+        "4B163AAA 9845418",
+        "4B16ABAB 9874347",
+        "4B16DE4B 9887307",
+        "4B16F230 9892400",
+        "4B1702D3 9896659",
+        "4B170F0D 9899789",
+        "4B174328 9913128",
+        "4B175BA0 9919392",
+        "4B1767F3 9922547",
+        "4B176B01 9923329",
+        "4B17EB48 9956168",
+        "4B1877F8 9992184",
+        "4B18967F 9999999",
+        "4B189680 1e7",
+        "4B1A1A17 10099223",
+        "4B24CA65 10799717",
+        "4B298AC7 11111111",
+        "4B30A3FF 11576319",
+        "4B317911 11630865",
+        "4B3840E2 12075234",
+        "4B40A3B2 12624818",
+        "4B40F04B 12644427",
+        "4B41CE98 12701336",
+        "4B437F39 12812089",
+        "4B4698B8 13015224",
+        "4B472556 13051222",
+        "4B47D6E3 13096675",
+        "4B4891A0 13144480",
+        "4B519C31 13737009",
+        "4B528654 13796948",
+        "4B59132F 14226223",
+        "4B7749E2 16206306",
+        "4B77FFFA 16252921.5",
+        "4B821910 17052193",
+        "4B868F0E 17636892",
+        "4B876520 17746497",
+        "4B87D6B8 17804655",
+        "4B8958EE 18002395",
+        "4B8C3138 18375281",
+        "4B8E6E42 18668677",
+        "4B90E1D8 1899e4",
+        "4B970FE0 198e5",
+        "4B998342 20121220",
+        "4B99AFB0 20143968",
+        "4B9EFAE6 20837836",
+        "4BA0EFEE 21094364",
+        "4BA17304 21161480",
+        "4BA4B683 21589254",
+        "4BA5C352 21726885",
+        "4BA98AC7 22222222",
+        "4BAA977F 22359806",
+        "4BAB74BB 22473078",
+        "4BAC9FDC 22626233",
+        "4BAFF5C0 23063423",
+        "4BB03EC4 23100809",
+        "4BB550B8 23765361",
+        "4BB809B4 24122215",
+        "4BBB7268 24569041",
+        "4BC360D5 25608618",
+        "4BC876A0 26275135",
+        "4BC8865D 26283194",
+        "4BD04730 27299423",
+        "4BD47306 27846156",
+        "4BDC7D50 289e5",
+        "4BDE68C9 29151634",
+        "4BE05D9F 29408062",
+        "4BE4E1C0 3e7",
+        "4BE6DDA7 30260046",
+        "4BE92801 30560258",
+        "4BE9EDCF 30661534",
+        "4BEDEB96 31184683",
+        "4BF36011 31899682",
+        "4BF36954 31904423",
+        "4BF6409F 32276798",
+        "4BF9A486 32721165",
+        "4BFD82E8 33228241",
+        "4BFD8644 33229960",
+        "4BFE502A 33333333",
+        "4C00A562 33723784",
+        "4C033DE4 34404238",
+        "4C051CFE 34894840",
+        "4C0583B0 35e6",
+        "4C083F9D 35716724",
+        "4C09AD09 36090916",
+        "4C09C2FF 36113404",
+        "4C0A499F 36251260",
+        "4C0A8C89 36319780",
+        "4C0DDCCB 37188395",
+        "4C104B98 37826145",
+        "4C111D1D 38040692",
+        "4C13092F 38544571",
+        "4C131A57 38562139",
+        "4C133DE1 38598533",
+        "4C140640 38803710",
+        "4C1421EA 38832042",
+        "4C1793D6 39735126",
+        "4C1798D1 39740229",
+        "4C188B06 39988247",
+        "4C189680 40000000",
+        "4C1930F7 40158172",
+        "4C19402C 40173744",
+        "4C1A22A3 40405643",
+        "4C1A49B5 40445652",
+        "4C1B0974 40642e3",
+        "4C1BA3C0 40800000",
+        "4C1C6710 41000000",
+        "4C1CB407 41078812",
+        "4C1E5D2F 41514172",
+        "4C208432 42078409",
+        "4C2091AA 42092201",
+        "4C21D52C 42423473",
+        "4C22C32A 42667174",
+        "4C22C502 42669063",
+        "4C22F484 42717713",
+        "4C2521EE 43288506",
+        "4C2554BF 43340539",
+        "4C260B66 43527578",
+        "4C267A3A 43641062",
+        "4C27D8C0 44e6",
+        "4C28F9C1 44295939",
+        "4C2974CC 44421934",
+        "4C298AC7 44444444",
+        "4C2BBB93 450187e2",
+        "4C2BCC77 45035996.273704985",
+        "4C2BCC77 45035996.273704995",
+        "4C2EC292 45812296",
+        "4C2F0254 45877585",
+        "4C2FEBAE 46116538",
+        "4C316228 4650e4",
+        "4C3241CA 46729e03",
+        "4C33B3D5 47107924",
+        "4C34C276 47385048",
+        "4C353C7C 4751e4",
+        "4C357ED7 47577948",
+        "4C36E03C 47939822",
+        "4C3776F1 48094147",
+        "4C37879A 48111209",
+        "4C378A28 48113823",
+        "4C38100C 48250926",
+        "4C387BA6 48361110",
+        "4C39852B 48633003",
+        "4C39C698 487e5",
+        "4C3A43B7 48828125",
+        "4C3BA935 49194195",
+        "4C3EBC20 50000000",
+        "4C3EBC20 5e7",
+        "4C3F64A7 50172572",
+        "4C42A86B 51028396",
+        "4C43B3EF 51302332",
+        "4C4ABCB6 53146328",
+        "4C4B5762 53304714",
+        "4C4DFE60 54e6",
+        "4C4FC6F4 54467535",
+        "4C502CDC 54571890",
+        "4C507F98 54656606",
+        "4C50F2F4 54774735",
+        "4C51CEF0 55e6",
+        "4C521B40 55078143",
+        "4C53ED79 55555555",
+        "4C546716 55680090",
+        "4C559698 55990879",
+        "4C559FBD 56000244",
+        "4C57B8EA 56550310",
+        "4C5A5FF1 57245637",
+        "4C5A9928 57304222",
+        "4C5C21BE 57706234",
+        "4C5C633E 57773302",
+        "4C5DE5AC 58169007",
+        "4C5DF914 58188878",
+        "4C5ED784 58416654",
+        "4C5F573E 58547448",
+        "4C614E78 59062754",
+        "4C632038 59539680",
+        "4C644B5C 59846e3",
+        "4C64E1C0 60e6",
+        "4C64E1C0 6e7",
+        "4C689082 60965384",
+        "4C6BDF8A 61832742",
+        "4C6E06FF 62397437",
+        "4C6F6694 62757456",
+        "4C6FCEA0 62864002",
+        "4C701CD2 62944073",
+        "4C705370 63e6",
+        "4C70F7D8 63168350",
+        "4C72CDD2 63649610",
+        "4C737ED7 63830875",
+        "4C742400 64e6",
+        "4C7574BD 64344821",
+        "4C75BDCE 64419642",
+        "4C75D374 64441808",
+        "4C760E08 64501793",
+        "4C77CB28 64957599",
+        "4C77F490 650e5",
+        "4C786B05 651213e2",
+        "4C7C0FBC 66076400",
+        "4C7E502A 66666666",
+        "4C7E94DA 66737e3",
+        "4C805E2A 67301713",
+        "4C81E6AE 68105580",
+        "4C820CD6 68183731",
+        "4C8245D1 68300424",
+        "4C82AFB9 68517318",
+        "4C835DDE 68873971",
+        "4C84774B 69450330",
+        "4C84AA79 69555144",
+        "4C84EA2D 69685606",
+        "4C84EAB0 69686659",
+        "4C8500B2 69731732",
+        "4C856E45 69956135",
+        "4C8583B0 70e6",
+        "4C867FF6 70516656",
+        "4C875EB4 70972830",
+        "4C876BF8 71e6",
+        "4C881818 71352512",
+        "4C8A0C4B 72376922",
+        "4C8B06DC 72890080",
+        "4C8B8DEE 73166703",
+        "4C8C1066 73433906",
+        "4C8D47E6 74071854",
+        "4C8D53A6 74095920",
+        "4C8DE669 74396490",
+        "4C8F7E94 75232413",
+        "4C9000C1 75499016",
+        "4C9086E4 75773725",
+        "4C909486 75801648",
+        "4C916E5A 76247763",
+        "4C91B8B0 76400000",
+        "4C924EDB 76707543",
+        "4C92560D 76722281",
+        "4C9266CE 76756590",
+        "4C931780 77118461",
+        "4C93E007 77529147",
+        "4C94596E 77777777",
+        "4C96C2DE 79042286",
+        "4C977803 79413272",
+        "4C983B64 79813406",
+        "4C98404F 79823479",
+        "4C989680 80000000",
+        "4C989680 80e6",
+        "4C989680 8e7",
+        "4C9902F5 80222122",
+        "4C9C7003 82018330",
+        "4C9DD0C9 82740809",
+        "4C9DD3A0 82746620",
+        "4C9E0069 82838342",
+        "4C9EC178 83233730",
+        "4C9FAA89 83711047",
+        "4C9FB1A1 83725573",
+        "4C9FC9F8 83775423",
+        "4CA049E9 84037448",
+        "4CA15A3B 84595161",
+        "4CA2494E 85084788",
+        "4CA2C726 85342511",
+        "4CA39B68 85777219",
+        "4CA39F84 85785631",
+        "4CA3D982 85904404",
+        "4CA434D9 86091465",
+        "4CA46494 86189216",
+        "4CA4F4BB 86484437",
+        "4CA583B6 86777268",
+        "4CA5DE2A 86962508",
+        "4CA75842 87736852",
+        "4CA772C7 87791158",
+        "4CA79837 87867832",
+        "4CA91A86 88658996",
+        "4CA98AC7 88888888",
+        "4CA9AE6E 88961903",
+        "4CAA0527 89139509",
+        "4CAAF463 89629465",
+        "4CAB2E71 89748360",
+        "4CABAFA0 90012929",
+        "4CAC5B2C 90364256",
+        "4CAD8168 90966848",
+        "4CAE418F 91360377",
+        "4CAE5E60 91419389",
+        "4CAF8C7D 92038121",
+        "4CAFB717 92125366",
+        "4CAFEEC6 92239407",
+        "4CAFFC4E 92267121",
+        "4CB2023C 93327838",
+        "4CB43063 94470938",
+        "4CB54CCD 95053418",
+        "4CB55FC0 95092224",
+        "4CB59EA6 95221044",
+        "4CB6083B 95437272",
+        "4CB6C1FD 95817703",
+        "4CB811DB 96505557",
+        "4CB873C8 96706114",
+        "4CB892F4 96769950",
+        "4CB8CA18 96882881",
+        "4CB8D1AB 96898389",
+        "4CB97520 97233152",
+        "4CBA389F 97633526",
+        "4CBB448C 98182244",
+        "4CBBE9B3 98520472",
+        "4CBCBE20 98955522",
+        "4CBCC438 98968000",
+        "4CBD2764 99171105",
+        "4CBD7B8E 99343471",
+        "4CBD9728 994e5",
+        "4CBEBC20 99999999",
+        "4CBEBC20 100000000",
+        "4CBEBC20 10e7",
+        "4CBEBC20 1e8",
+        "4CD3ED79 111111111",
+        "4CEB79A3 123456789",
+        "4CF1776B 126597973",
+        "4D06794E 141006042",
+        "4D0B1EA5 145877585",
+        "4D0B5A4E 146121952",
+        "4D4EB950 216765690",
+        "4D53ED79 222222222",
+        "4D68D4A5 244140625",
+        "4D81EC22 272467e3",
+        "4D8F0D18 3e8",
+        "4D95E1D4 314325637",
+        "4D9EF21B 333333333",
+        "4DB56464 380406926",
+        "4DBEBC20 4e8",
+        "4DD3ED79 444444444",
+        "4DE4E1C0 480000000",
+        "4DEE6B28 500000000",
+        "4E04746C 555555555",
+        "4E0CD6EE 590723948",
+        "4E0CE5C1 590966848",
+        "4E0E440D 596706114",
+        "4E104361 605083704",
+        "4E15801D 627050305",
+        "4E16FD29 633293366",
+        "4E1EF21B 666666666",
+        "4E26E49C 7e8",
+        "4E2B2F3E 718e6",
+        "4E2BA950 72e7",
+        "4E2DC893 728900802",
+        "4E310CB5 7426e5",
+        "4E344939 756174393",
+        "4E354C05 760414536",
+        "4E396FCA 777777777",
+        "4E3EBC20 800000000",
+        "4E3F43B3 802221226",
+        "4E401940 805720085",
+        "4E465D40 832e6",
+        "4E4A4690 848405530",
+        "4E4C2A88 856334878",
+        "4E4F8C1F 870516656",
+        "4E517E45 878678326",
+        "4E53ED79 888888888",
+        "4E5479AC 891185938",
+        "4E55F9B9 897478238",
+        "4E5693A4 9e08",
+        "4E5693A4 9e8",
+        "4E57C9B2 905079926",
+        "4E58F5FE 91e07",
+        "4E59B814 913179899",
+        "4E6313B1 952429603",
+        "4E64E1C0 96e7",
+        "4E69A674 98e7",
+        "4E6B6C3C 987434744",
+        "4E6C713D 991711052",
+        "4E6E6B28 999999999",
+        "4E6E6B28 1e9",
+        "4E6E6B29 1.00000006e+09",
+        "4E9184E7 1220703125",
+        "4E932C06 1234567890",
+        "4EEE6B28 2e09",
+        "4EFFFFFD 2147483314",
+        "4EFFFFFD 2147483315",
+        "4EFFFFFE 2147483351",
+        "4EFFFFFE 2147483352",
+        "4EFFFFFE 2147483388",
+        "4EFFFFFE 2147483389",
+        "4EFFFFFE 2147483425",
+        "4EFFFFFE 2147483426",
+        "4EFFFFFF 2147483462",
+        "4EFFFFFF 2147483463",
+        "4EFFFFFF 2147483499",
+        "4EFFFFFF 2147483500",
+        "4EFFFFFF 2147483536",
+        "4EFFFFFF 2147483537",
+        "4EFFFFFF 2147483573",
+        "4EFFFFFF 2147483574",
+        "4F000000 2147483610",
+        "4F000000 2147483611",
+        "4F000000 2147483647",
+        "4F000000 2147483648",
+        "4F1502F9 25e8",
+        "4F18542C 2555653131",
+        "4F26C8DF 2798182244",
+        "4F3EBD30 3200069671",
+        "4F41562C 3243650005",
+        "4F44EA11 3303674053",
+        "4F52DEF1 3537826145",
+        "4F6E6B28 4e9",
+        "4F712632 4045812296",
+        "4F820D2F 4363804324",
+        "4F920719 4899877186",
+        "4F9502F9 5e09",
+        "4F9502F9 5e9",
+        "4F9528FA 5004981478",
+        "4F9796DB 5086492111",
+        "4F9923CB 5138519684",
+        "4FA01870 5371912364",
+        "4FA7F185 5635246428",
+        "4FAB42E9 5746577930",
+        "4FB5E621 6103515625",
+        "4FBBC130 63e8",
+        "4FD09DC3 70e8",
+        "4FDC0D5B 7383725573",
+        "4FE3C54F 7642717713",
+        "4FEBBC83 791e07",
+        "4FEE6B28 80e8",
+        "4FEE6B28 8e9",
+        "5000B5F0 8637627989",
+        "50041CB9 8865899617",
+        "5005BC48 8974836059",
+        "50061C46 9e9",
+        "50097D1D 9226712162",
+        "500C1228 94e8",
+        "500C600D 942042e4",
+        "501022C7 9672793580",
+        "50119F04 9772470297",
+        "501502F9 1e10",
+        "5041B710 1.3e10",
+        "5077A845 1662e7",
+        "50B7BD75 24661173473",
+        "50CDA2D2 276e8",
+        "50D59BAF 2867e7",
+        "50E35FA9 30517578125",
+        "50E6F7CF 31e9",
+        "50F52E46 32907604691",
+        "51093AA0 36837130890",
+        "511502F9 40000000000",
+        "51197B62 412e08",
+        "51325DC2 47879823479",
+        "5139F1C6 49914078536",
+        "513DFD64 51000000000",
+        "51492A6A 54e9",
+        "51559F80 573440e5",
+        "515BCAC9 59e9",
+        "51861C46 72E9",
+        "5189D5F3 74000000000",
+        "519A997C 83e9",
+        "51A7A358 90000000000",
+        "51BA43B7 100000000000",
+        "51BA43B7 1e11",
+        "51BC208E 101e9",
+        "520840A3 1463e8",
+        "520E1BCA 152587890625",
+        "523A43B7 200000000000",
+        "5261D86F 242499697392",
+        "5282629A 280000000000",
+        "528BB2C9 3e11",
+        "52BA43B7 400000000000",
+        "52FAFDCF 539e9",
+        "530E81C6 612062576589",
+        "530EA44D 612641865679",
+        "5330644C 757596946075",
+        "5331A2BC 762939453125",
+        "533EEB57 819992132456",
+        "5368D4A5 1e12",
+        "53E8D4A5 2e12",
+        "542E9F7C 3e12",
+        "545E0B6B 3814697265625",
+        "549184E7 5e012",
+        "549BD269 5354e9",
+        "54AC2BC4 59157491e5",
+        "54CD5F7D 7056562757456",
+        "55024FFA 8955e9",
+        "550715AE 92829494e5",
+        "550C4B86 9641e9",
+        "551184E7 10000000000000",
+        "551184E7 1e13",
+        "558AC723 19073486328125",
+        "559184E7 20000000000000",
+        "55CBBA10 28000000000000",
+        "561184E7 40000000000000",
+        "561C4000 42949672960001",
+        "5699E0B1 84595161401484",
+        "56A2D793 89523386091465",
+        "56AD78EC 95367431640625",
+        "56B5E621 1e14",
+        "5783EEC3 290123e9",
+        "579F295D 350000000000000",
+        "57B5E621 400000000000000",
+        "57B5E621 40e13",
+        "57C0D019 424000000000000",
+        "57D4DED7 468107100525890",
+        "57D8D727 476837158203125",
+        "57E35FA9 5e14",
+        "5809CD5F 606060606060606",
+        "58267002 732000000000000",
+        "5835E621 800000000000000",
+        "5835E621 8e14",
+        "58635FA9 1000000000000000",
+        "58635FA9 1e15",
+        "58800000 1125899906842624.125",
+        "58800000 1125899906842901.875",
+        "58956F79 1314448000000000",
+        "59000000 2251799813685248.25",
+        "59000000 2251799813685803.75",
+        "59078678 2384185791015625",
+        "593D7A62 3333333333333333",
+        "59635FA9 4000000000000000",
+        "59800000 4503599627370496.5",
+        "59800000 4503599627370497.5",
+        "59800000 4503599627475352.5",
+        "59800000 4503599627475353.5",
+        "598E1BCA 5000000000000000",
+        "59D529AF 75e14",
+        "59E35FA9 8000000000000000",
+        "5A000000 9007199254740992",
+        "5A000000 9007199254740993",
+        "5A000000 9007199254740994",
+        "5A000000 9007199254740995",
+        "5A09D865 97e14",
+        "5A0CA459 9896800000000000",
+        "5A0E1BCA 1e16",
+        "5A296816 11920928955078125",
+        "5B53C21C 59604644775390625",
+        "5B64158F 642e14",
+        "5BB1A2BC 1e17",
+        "5C845951 298023223876953125",
+        "5CCE8061 465e15",
+        "5D5E0B6B 1e18",
+        "5DA56FA6 1490116119384765625",
+        "5E056279 2402844368454405395.2",
+        "5ECECB8F 7450580596923828125",
+        "5EF9CCD9 9e18",
+        "5F053A0D 96e017",
+        "5F08DFC5 9.862818194192001e18",
+        "5F0AC723 1e19",
+        "60805E9A 74e18",
+        "609C2007 9e19",
+        "60A3959D 943e17",
+        "60AD78EC 1e20",
+        "6258D727 1e21",
+        "64078678 1e22",
+        "657BBCFA 743e20",
+        "659CFBB2 92666518056446206563E3",
+        "65A96816 1e23",
+        "65A96816 9.999999999999999e22",
+        "6723E072 773886e18",
+        "6753C21C 1e24",
+        "6C186875 737e24",
+        "6D1B18AB 3e27",
+        "715C3BD0 1090544144181609348835077142190",
+        "717A6A7F 124e28",
+        "729C8290 62e29",
+        "73FC6F7C 4e31",
+        "745642CC 67902e27",
+        "7487AF20 86e30",
+        "749DC5AE 1e32",
+        "760A0CF8 7e32",
+        "771209B2 29620e29",
+        "777684DF 5e33",
+        "791A130C 5e34",
+        "7E967699 1e38",
+        "7F000000 1.7014118346046923e+38",
+        "7F7FFFFF 3.4028234664e38",
+        "7F7FFFFF 3.4028234665e38",
+        "7F7FFFFF 3.4028234666e38",
+        "7F800000 3.5028234666e38",
+        "7F800000 51823e34",
+        "7F800000 555e36",
+        "7F800000 912e37",
+        "7F800000 92487298e33",
+        "7F800000 778e39",
+        "7F800000 8e41",
+        "7F800000 81e40",
+        "7F800000 90e40",
+        "7F800000 1.7339253062092163730578609458683877051596800000000000000000000000e+42",
+        "7F800000 1778e39",
+        "7F800000 598e40",
+        "7F800000 808e40",
+        "7F800000 203e41",
+        "7F800000 89e42",
+        "7F800000 2e44",
+        "7F800000 5e44",
+        "7F800000 2.1470977154320536489471030463761883783915110400000000000000000000e+45",
+        "7F800000 6e45",
+        "7F800000 2091e44",
+        "7F800000 368e45",
+        "7F800000 967e45",
+        "7F800000 442e46",
+        "7F800000 7442e45",
+        "7F800000 4e49",
+        "7F800000 892091e44",
+        "7F800000 5e50",
+        "7F800000 7e50",
+        "7F800000 2e51",
+        "7F800000 3e51",
+        "7F800000 39e50",
+        "7F800000 7e51",
+        "7F800000 1.9189205311132686907264385602245237137907390376574976000000000000e+52",
+        "7F800000 2.0972622234386619214559824785284023792871122537545728000000000000e+52",
+        "7F800000 1e53",
+        "7F800000 1.7664960224650106892054063261344555646357024359107788800000000000e+53",
+        "7F800000 335e51",
+        "7F800000 2e54",
+        "7F800000 2.8184483231688951563253238886553506793085187889855201280000000000e+54",
+        "7F800000 6472e51",
+        "7F800000 2e55",
+        "7F800000 5e55",
+        "7F800000 5667844e49",
+        "7F800000 62e055",
+        "7F800000 8e056",
+        "7F800000 1.0001803374372191849407179462120053338028379051879898808320000000e+57",
+        "7F800000 5e57",
+        "7F800000 1.8607245283054342363818436991534856973992070520151142825984000000e+58",
+        "7F800000 7.0420557077594588669468784357561207962098443483187940792729600000e+59",
+        "7F800000 9e59",
+        "7F800000 99e59",
+        "7F800000 13e60",
+        "7F800000 4.4900312744003159009338275160799498340862630046359789166919680000e+61",
+        "7F800000 1e64",
+        "7F800000 88e65",
+        "7F800000 3e69",
+        "7F800000 59e68",
+        "7F800000 86e69",
+        "7F800000 2224e68",
+        "7F800000 9e74",
+        "7F800000 42e74",
+        "7F800000 7.2370055773322621e+75",
+        "7F800000 9184e72",
+        "7F800000 93e74",
+        "7F800000 40041e073",
+        "7F800000 7e77",
+        "7F800000 44e80",
+        "7F800000 9e82",
+        "7F800000 242e81",
+        "7F800000 527e81",
+        "7F800000 9e83",
+        "7F800000 9e84",
+        "7F800000 1e85",
+        "7F800000 7e85",
+        "7F800000 1e86",
+        "7F800000 503e085",
+        "7F800000 112e86",
+        "7F800000 6e88",
+        "7F800000 5e89",
+        "7F800000 8358109e84",
+        "7F800000 90054602635948575728E72",
+        "7F800000 9271e88",
+        "7F800000 9153e89",
+        "7F800000 4e093",
+        "7F800000 3e95",
+        "7F800000 3608e92",
+        "7F800000 791e093",
+        "7F800000 8545e94",
+        "7F800000 80e98",
+        "7F800000 980e98",
+        "7F800000 83126e97",
+        "7F800000 7e105",
+        "7F800000 538e122",
+        "7F800000 7e127",
+        "7F800000 1e128",
+        "7F800000 7795e136",
+        "7F800000 7549530e188",
+        "7F800000 71e223",
+        "7F800000 4e250",
+        "7F800000 1e256",
+        "7F800000 1.01e256",
+        "7F800000 67902e276",
+        "7F800000 9748e282",
+        "7F800000 1e300",
+        "7F800000 19e306",
+        "7F800000 1.797693134862315700000000000000001e308",
+        "7F800000 1.7976931348623157e308",
+        "7F800000 1.7976931348623158e308",
+        "7F800000 0.1e310",
+        "7F800000 1.832312213213213232132132143451234453123412321321312e308",
+        "7F800000 1.8e308",
+        "7F800000 1.9e308",
+        "7F800000 1234456789012345678901234567890e9999999999999999999999999999",
+        "7F800000 12e1342",
+        "7F800000 12e13424",
+        "7F800000 148e3032",
+        "7F800000 18e88640",
+        "7F800000 1e1000",
+        "7F800000 1e1853",
+        "7F800000 1e414218",
+        "7F800000 2139879401095466344511101915470454744.9813888656856943E+272",
+        "7F800000 21e440",
+        "7F800000 21e44003",
+        "7F800000 246723473e3813",
+        "7F800000 24e4421730",
+        "7F800000 2529e2734",
+        "7F800000 26e077774",
+        "7F800000 28e2557",
+        "7F800000 2e08987",
+        "7F800000 2e0898765",
+        "7F800000 2e3000",
+        "7F800000 2e30000000000000000",
+        "7F800000 2e69915",
+        "7F800000 2e801",
+        "7F800000 322e62600000",
+        "7F800000 35e702",
+        "7F800000 39e436",
+        "7F800000 3e60868",
+        "7F800000 3e84959",
+        "7F800000 3e8495912",
+        "7F800000 412e0806",
+        "7F800000 4196e952",
+        "7F800000 43e40076",
+        "7F800000 442e4688",
+        "7F800000 44e864",
+        "7F800000 464e3945",
+        "7F800000 473e3813",
+        "7F800000 47859e743",
+        "7F800000 486e494",
+        "7F800000 49e807",
+        "7F800000 50e4395",
+        "7F800000 51e1566",
+        "7F800000 5400e987",
+        "7F800000 549e57273",
+        "7F800000 555e361951",
+        "7F800000 5e330",
+        "7F800000 5e5728",
+        "7F800000 5e620",
+        "7F800000 5e7873",
+        "7F800000 5e823",
+        "7F800000 5e82392",
+        "7F800000 626e974",
+        "7F800000 62e2929",
+        "7F800000 6472e511",
+        "7F800000 696e840",
+        "7F800000 6e188853",
+        "7F800000 6e356932",
+        "7F800000 6e3569326",
+        "7F800000 6e804",
+        "7F800000 6e984",
+        "7F800000 71758e219652",
+        "7F800000 718e68396",
+        "7F800000 71e914",
+        "7F800000 71e91432",
+        "7F800000 7230489e80000",
+        "7F800000 74e608",
+        "7F800000 75e2224",
+        "7F800000 7859e743",
+        "7F800000 7868e94050",
+        "7F800000 788035e61382",
+        "7F800000 79e1632",
+        "7F800000 7e05401",
+        "7F800000 7e12780",
+        "7F800000 7e2000",
+        "7F800000 7e334",
+        "7F800000 7e33455637",
+        "7F800000 7e41392",
+        "7F800000 7e670471",
+        "7F800000 7e67047175",
+        "7F800000 7e998",
+        "7F800000 808e1755",
+        "7F800000 808e17555",
+        "7F800000 83126e978",
+        "7F800000 83e872",
+        "7F800000 8955e946",
+        "7F800000 89e80000",
+        "7F800000 8e1456105",
+        "7F800000 8e43145",
+        "7F800000 8e431456",
+        "7F800000 8e5087",
+        "7F800000 8e5410",
+        "7F800000 8e5410288",
+        "7F800000 8e679",
+        "7F800000 8e88640",
+        "7F800000 8e905",
+        "7F800000 8e921",
+        "7F800000 8e938662",
+        "7F800000 8e938662882",
+        "7F800000 8e952",
+        "7F800000 915e2486",
+        "7F800000 945e455",
+        "7F800000 953e862",
+        "7F800000 953e8624",
+        "7F800000 963e6685",
+        "7F800000 963e66858",
+        "7F800000 964e858",
+        "7F800000 96e952",
+        "7F800000 9748e2826",
+        "7F800000 976e4108",
+        "7F800000 976e41088617",
+        "7F800000 9837e699095",
+        "7F800000 98e94712",
+        "7F800000 98e947129",
+        "7F800000 99e59958885",
+        "7F800000 99e619",
+        "7F800000 9e1632",
+        "7F800000 9e20735",
+        "7F800000 9e40000000",
+        "7F800000 9e563",
+        "7F800000 9e795",
+        "7F800000 9e904"
+    )
diff --git a/compose/ui/ui-graphics/src/commonTest/kotlin/androidx/compose/ui/graphics/vector/PathParserTest.kt b/compose/ui/ui-graphics/src/commonTest/kotlin/androidx/compose/ui/graphics/vector/PathParserTest.kt
index 50af6c4..adf367e 100644
--- a/compose/ui/ui-graphics/src/commonTest/kotlin/androidx/compose/ui/graphics/vector/PathParserTest.kt
+++ b/compose/ui/ui-graphics/src/commonTest/kotlin/androidx/compose/ui/graphics/vector/PathParserTest.kt
@@ -29,13 +29,14 @@
 class PathParserTest {
     @Test
     fun negativeExponent() {
-        val linePath = object : TestPath() {
-            var lineToPoints = ArrayList<Offset>()
+        val linePath =
+            object : TestPath() {
+                var lineToPoints = ArrayList<Offset>()
 
-            override fun lineTo(x: Float, y: Float) {
-                lineToPoints.add(Offset(x, y))
+                override fun lineTo(x: Float, y: Float) {
+                    lineToPoints.add(Offset(x, y))
+                }
             }
-        }
 
         val parser = PathParser()
         parser.parsePathString("H1e-5").toPath(linePath)
@@ -46,13 +47,14 @@
 
     @Test
     fun dotDot() {
-        val linePath = object : TestPath() {
-            var lineToPoints = ArrayList<Offset>()
+        val linePath =
+            object : TestPath() {
+                var lineToPoints = ArrayList<Offset>()
 
-            override fun relativeLineTo(dx: Float, dy: Float) {
-                lineToPoints.add(Offset(dx, dy))
+                override fun relativeLineTo(dx: Float, dy: Float) {
+                    lineToPoints.add(Offset(dx, dy))
+                }
             }
-        }
 
         val parser = PathParser()
         parser.parsePathString("m0 0l2..5").toPath(linePath)
@@ -64,13 +66,14 @@
 
     @Test
     fun relativeMoveToBecomesRelativeLineTo() {
-        val linePath = object : TestPath() {
-            var lineToPoints = ArrayList<Offset>()
+        val linePath =
+            object : TestPath() {
+                var lineToPoints = ArrayList<Offset>()
 
-            override fun relativeLineTo(dx: Float, dy: Float) {
-                lineToPoints.add(Offset(dx, dy))
+                override fun relativeLineTo(dx: Float, dy: Float) {
+                    lineToPoints.add(Offset(dx, dy))
+                }
             }
-        }
 
         val parser = PathParser()
         parser.parsePathString("m0 0 2 5").toPath(linePath)
@@ -82,13 +85,14 @@
 
     @Test
     fun moveToBecomesLineTo() {
-        val linePath = object : TestPath() {
-            var lineToPoints = ArrayList<Offset>()
+        val linePath =
+            object : TestPath() {
+                var lineToPoints = ArrayList<Offset>()
 
-            override fun lineTo(x: Float, y: Float) {
-                lineToPoints.add(Offset(x, y))
+                override fun lineTo(x: Float, y: Float) {
+                    lineToPoints.add(Offset(x, y))
+                }
             }
-        }
 
         val parser = PathParser()
         parser.parsePathString("M0 0 2 5 6 7").toPath(linePath)
@@ -102,13 +106,14 @@
 
     @Test
     fun relativeQuadToTest() {
-        val quadPath = object : TestPath() {
-            var lineToPoints = ArrayList<Offset>()
+        val quadPath =
+            object : TestPath() {
+                var lineToPoints = ArrayList<Offset>()
 
-            override fun lineTo(x: Float, y: Float) {
-                lineToPoints.add(Offset(x, y))
+                override fun lineTo(x: Float, y: Float) {
+                    lineToPoints.add(Offset(x, y))
+                }
             }
-        }
 
         // After a relative quad operation, ensure that the currentPoint is updated
         // properly. In order to do so, verify that the y coordindate of an
@@ -129,8 +134,8 @@
     }
 
     /**
-     * Path that implements the Path interface with stubs to allow for simple implementations
-     * to override individual methods for testing
+     * Path that implements the Path interface with stubs to allow for simple implementations to
+     * override individual methods for testing
      */
     @Suppress("OVERRIDE_DEPRECATION")
     open class TestPath : Path {
diff --git a/compose/ui/ui-graphics/src/desktopMain/kotlin/androidx/compose/ui/graphics/DesktopColorFilter.desktop.kt b/compose/ui/ui-graphics/src/desktopMain/kotlin/androidx/compose/ui/graphics/DesktopColorFilter.desktop.kt
index e9591c3..d11a9a9 100644
--- a/compose/ui/ui-graphics/src/desktopMain/kotlin/androidx/compose/ui/graphics/DesktopColorFilter.desktop.kt
+++ b/compose/ui/ui-graphics/src/desktopMain/kotlin/androidx/compose/ui/graphics/DesktopColorFilter.desktop.kt
@@ -18,14 +18,10 @@
 
 import org.jetbrains.skia.ColorFilter as SkiaColorFilter
 
-/**
- * Obtain a reference to the desktop ColorFilter type
- */
+/** Obtain a reference to the desktop ColorFilter type */
 @Deprecated("Use asSkiaColorFilter()", replaceWith = ReplaceWith("asSkiaColorFilter()"))
 fun ColorFilter.asDesktopColorFilter(): SkiaColorFilter = nativeColorFilter
 
-/**
- * Obtain a [org.jetbrains.skia.ColorFilter] instance from this [ColorFilter]
- */
+/** Obtain a [org.jetbrains.skia.ColorFilter] instance from this [ColorFilter] */
 @Deprecated("Use asComposeColorFilter()", replaceWith = ReplaceWith("asComposeColorFilter()"))
 fun SkiaColorFilter.toComposeColorFilter(): ColorFilter = ColorFilter(this)
diff --git a/compose/ui/ui-graphics/src/desktopMain/kotlin/androidx/compose/ui/graphics/DesktopImageAsset.desktop.kt b/compose/ui/ui-graphics/src/desktopMain/kotlin/androidx/compose/ui/graphics/DesktopImageAsset.desktop.kt
index 96e7808..726d7e4 100644
--- a/compose/ui/ui-graphics/src/desktopMain/kotlin/androidx/compose/ui/graphics/DesktopImageAsset.desktop.kt
+++ b/compose/ui/ui-graphics/src/desktopMain/kotlin/androidx/compose/ui/graphics/DesktopImageAsset.desktop.kt
@@ -22,22 +22,19 @@
 import org.jetbrains.skia.Image
 
 /**
- * Create an [ImageBitmap] from the given [Bitmap]. Note this does
- * not create a copy of the original [Bitmap] and changes to it
- * will modify the returned [ImageBitmap]
+ * Create an [ImageBitmap] from the given [Bitmap]. Note this does not create a copy of the original
+ * [Bitmap] and changes to it will modify the returned [ImageBitmap]
  */
 @Deprecated("Use asComposeImageBitmap", replaceWith = ReplaceWith("asComposeImageBitmap()"))
 fun Bitmap.asImageBitmap(): ImageBitmap = asComposeImageBitmap()
 
-/**
- * Create an [ImageBitmap] from the given [Image].
- */
+/** Create an [ImageBitmap] from the given [Image]. */
 @Deprecated("Use toComposeImageBitmap", replaceWith = ReplaceWith("toComposeImageBitmap()"))
 fun Image.asImageBitmap(): ImageBitmap = toComposeImageBitmap()
 
 /**
  * @Throws UnsupportedOperationException if this [ImageBitmap] is not backed by an
- * org.jetbrains.skia.Image
+ *   org.jetbrains.skia.Image
  */
 @Deprecated("Use asSkiaBitmap()", replaceWith = ReplaceWith("asSkiaBitmap()"))
 fun ImageBitmap.asDesktopBitmap(): Bitmap = asSkiaBitmap()
diff --git a/compose/ui/ui-graphics/src/desktopMain/kotlin/androidx/compose/ui/graphics/DesktopImageConverters.desktop.kt b/compose/ui/ui-graphics/src/desktopMain/kotlin/androidx/compose/ui/graphics/DesktopImageConverters.desktop.kt
index dad395a..63f7bdd 100644
--- a/compose/ui/ui-graphics/src/desktopMain/kotlin/androidx/compose/ui/graphics/DesktopImageConverters.desktop.kt
+++ b/compose/ui/ui-graphics/src/desktopMain/kotlin/androidx/compose/ui/graphics/DesktopImageConverters.desktop.kt
@@ -53,8 +53,8 @@
 
 /**
  * Convert AWT [BufferedImage] to Compose [Painter], so it would be possible to pass it to Compose
- * functions. Don't mutate [BufferedImage] after converting it to [Painter], because
- * [BufferedImage] can be reused to avoid unnecessary conversions.
+ * functions. Don't mutate [BufferedImage] after converting it to [Painter], because [BufferedImage]
+ * can be reused to avoid unnecessary conversions.
  */
 fun BufferedImage.toPainter(): Painter = BufferedImagePainter(this)
 
@@ -70,18 +70,17 @@
 }
 
 /**
- * Convert Compose [Painter] to AWT [Image]. The result will not be rasterized right now, it
- * will be rasterized when AWT will request the image with needed width and height, by calling
+ * Convert Compose [Painter] to AWT [Image]. The result will not be rasterized right now, it will be
+ * rasterized when AWT will request the image with needed width and height, by calling
  * [AbstractMultiResolutionImage.getResolutionVariant] on Windows/Linux, or
  * [AbstractMultiResolutionImage.getResolutionVariants] on macOs.
  *
  * At the rasterization moment, [density] and [layoutDirection] will be passed to the painter.
- * Usually most painters don't use them. Like the painters for svg/xml/raster resources:
- * they don't use absolute '.dp' values to draw, they use values which are relative
- * to their viewport.
+ * Usually most painters don't use them. Like the painters for svg/xml/raster resources: they don't
+ * use absolute '.dp' values to draw, they use values which are relative to their viewport.
  *
- * [density] also will be used to rasterize the default image, which can be used by some implementations
- * (Tray icon on macOs, disabled icon for menu items)
+ * [density] also will be used to rasterize the default image, which can be used by some
+ * implementations (Tray icon on macOs, disabled icon for menu items)
  *
  * @param density density will be used to convert [dp] units
  * @param layoutDirection direction for layout when drawing
@@ -98,15 +97,14 @@
 ): Image = toAwtImage(density, layoutDirection, size)
 
 /**
- * Convert Compose [Painter] to AWT [Image]. The result will not be rasterized right now, it
- * will be rasterized when AWT will request the image with needed width and height, by calling
+ * Convert Compose [Painter] to AWT [Image]. The result will not be rasterized right now, it will be
+ * rasterized when AWT will request the image with needed width and height, by calling
  * [AbstractMultiResolutionImage.getResolutionVariant] on Windows/Linux, or
  * [AbstractMultiResolutionImage.getResolutionVariants] on macOs.
  *
  * At the rasterization moment, [density] and [layoutDirection] will be passed to the painter.
- * Usually most painters don't use them. Like the painters for svg/xml/raster resources:
- * they don't use absolute '.dp' values to draw, they use values which are relative
- * to their viewport.
+ * Usually most painters don't use them. Like the painters for svg/xml/raster resources: they don't
+ * use absolute '.dp' values to draw, they use values which are relative to their viewport.
  *
  * @param density density will be used to convert [dp] units when drawing
  * @param layoutDirection direction for layout when drawing
@@ -136,19 +134,18 @@
 ) : Image(), MultiResolutionImage {
     private val width = size.width.toInt()
     private val height = size.height.toInt()
+
     override fun getWidth(observer: ImageObserver?) = width
+
     override fun getHeight(observer: ImageObserver?) = height
 
-    override fun getResolutionVariant(
-        destImageWidth: Double,
-        destImageHeight: Double
-    ): Image {
+    override fun getResolutionVariant(destImageWidth: Double, destImageHeight: Double): Image {
         val width = destImageWidth.toInt()
         val height = destImageHeight.toInt()
         return if (
             painter is BufferedImagePainter &&
-            painter.image.width == width &&
-            painter.image.height == height
+                painter.image.width == width &&
+                painter.image.height == height
         ) {
             painter.image
         } else {
@@ -161,19 +158,17 @@
         val canvas = Canvas(bitmap)
         val floatSize = Size(width.toFloat(), height.toFloat())
 
-        CanvasDrawScope().draw(
-            density, layoutDirection, canvas, floatSize
-        ) {
-            with(painter) {
-                draw(floatSize)
-            }
+        CanvasDrawScope().draw(density, layoutDirection, canvas, floatSize) {
+            with(painter) { draw(floatSize) }
         }
 
         return bitmap
     }
 
     override fun getProperty(name: String, observer: ImageObserver?): Any = UndefinedProperty
+
     override fun getSource(): ImageProducer = defaultImage.source
+
     override fun getGraphics(): Graphics = defaultImage.graphics
 
     private val defaultImage by lazy {
@@ -181,10 +176,12 @@
         when (painter) {
             is BufferedImagePainter -> painter.image
             is BitmapPainter -> asBitmap(width, height).toAwtImage()
-            else -> asBitmap(
-                (width * density.density).roundToInt(),
-                (height * density.density).roundToInt()
-            ).toAwtImage()
+            else ->
+                asBitmap(
+                        (width * density.density).roundToInt(),
+                        (height * density.density).roundToInt()
+                    )
+                    .toAwtImage()
         }
     }
 
@@ -194,16 +191,11 @@
 // TODO(demin): should we optimize toAwtImage/toBitmap? Currently we convert colors according to the
 //  current colorModel. But we can get raw BufferedImage.getRaster() and set a different colorModel.
 
-/**
- * Convert Compose [ImageBitmap] to AWT [BufferedImage]
- */
-
+/** Convert Compose [ImageBitmap] to AWT [BufferedImage] */
 @Deprecated("use toAwtImage", replaceWith = ReplaceWith("toAwtImage"))
 fun ImageBitmap.asAwtImage(): BufferedImage = toAwtImage()
 
-/**
- * Convert Compose [ImageBitmap] to AWT [BufferedImage]
- */
+/** Convert Compose [ImageBitmap] to AWT [BufferedImage] */
 fun ImageBitmap.toAwtImage(): BufferedImage {
     // TODO(demin): use asDesktopBitmap().toBufferedImage() from skiko, when we fix it. Currently
     //  some images convert with graphical artifacts
@@ -222,15 +214,11 @@
     return BufferedImage(ColorModel.getRGBdefault(), wr, false, null)
 }
 
-/**
- * Convert AWT [BufferedImage] to Compose [ImageBitmap]
- */
+/** Convert AWT [BufferedImage] to Compose [ImageBitmap] */
 @Deprecated("use toComposeImageBitmap()", replaceWith = ReplaceWith("toComposeImageBitmap()"))
 fun BufferedImage.toComposeBitmap(): ImageBitmap = toComposeImageBitmap()
 
-/**
- * Convert AWT [BufferedImage] to Compose [ImageBitmap]
- */
+/** Convert AWT [BufferedImage] to Compose [ImageBitmap] */
 fun BufferedImage.toComposeImageBitmap(): ImageBitmap {
     // TODO(demin): use toBitmap().asImageBitmap() from skiko, when we fix its performance
     //  (it is 40x slower)
diff --git a/compose/ui/ui-graphics/src/desktopMain/kotlin/androidx/compose/ui/graphics/DesktopPathEffect.desktop.kt b/compose/ui/ui-graphics/src/desktopMain/kotlin/androidx/compose/ui/graphics/DesktopPathEffect.desktop.kt
index b2c0fac..5614e57 100644
--- a/compose/ui/ui-graphics/src/desktopMain/kotlin/androidx/compose/ui/graphics/DesktopPathEffect.desktop.kt
+++ b/compose/ui/ui-graphics/src/desktopMain/kotlin/androidx/compose/ui/graphics/DesktopPathEffect.desktop.kt
@@ -18,8 +18,6 @@
 
 import org.jetbrains.skia.PathEffect as SkPathEffect
 
-/**
- * Obtain a reference to the desktop PathEffect type
- */
+/** Obtain a reference to the desktop PathEffect type */
 @Deprecated("Use asSkiaPathEffect()", replaceWith = ReplaceWith("asSkiaPathEffect()"))
 fun PathEffect.asDesktopPathEffect(): SkPathEffect = asSkiaPathEffect()
diff --git a/compose/ui/ui-graphics/src/desktopMain/kotlin/androidx/compose/ui/graphics/layer/GraphicsLayer.desktop.kt b/compose/ui/ui-graphics/src/desktopMain/kotlin/androidx/compose/ui/graphics/layer/GraphicsLayer.desktop.kt
index 2626325..fd104c8 100644
--- a/compose/ui/ui-graphics/src/desktopMain/kotlin/androidx/compose/ui/graphics/layer/GraphicsLayer.desktop.kt
+++ b/compose/ui/ui-graphics/src/desktopMain/kotlin/androidx/compose/ui/graphics/layer/GraphicsLayer.desktop.kt
@@ -85,14 +85,10 @@
     private var roundRectCornerRadius: Float = 0f
     private var outlinePath: Path? = null
 
-    /**
-     * Tracks the amount of the parent layers currently drawing this layer as a child.
-     */
+    /** Tracks the amount of the parent layers currently drawing this layer as a child. */
     private var parentLayerUsages = 0
 
-    /**
-     * Keeps track of the child layers we currently draw into this layer.
-     */
+    /** Keeps track of the child layers we currently draw into this layer. */
     private val childDependenciesTracker = ChildLayerDependenciesTracker()
 
     actual var topLeft: IntOffset = IntOffset.Zero
@@ -113,32 +109,38 @@
             invalidateMatrix()
             field = value
         }
+
     actual var scaleY: Float = 1f
         set(value) {
             invalidateMatrix()
             field = value
         }
+
     actual var translationX: Float = 0f
         set(value) {
             invalidateMatrix()
             field = value
         }
+
     actual var translationY: Float = 0f
         set(value) {
             invalidateMatrix()
             field = value
         }
+
     actual var shadowElevation: Float = 0f
     actual var rotationX: Float = 0f
         set(value) {
             invalidateMatrix()
             field = value
         }
+
     actual var rotationY: Float = 0f
         set(value) {
             invalidateMatrix()
             field = value
         }
+
     actual var rotationZ: Float = 0f
         set(value) {
             invalidateMatrix()
@@ -175,30 +177,19 @@
         updateLayerConfiguration()
         val x = topLeft.x.toFloat()
         val y = topLeft.y.toFloat()
-        val bounds = SkiaRect(
-            x,
-            y,
-            x + size.width.toFloat(),
-            y + size.height.toFloat()
-        )
+        val bounds = SkiaRect(x, y, x + size.width.toFloat(), y + size.height.toFloat())
         val canvas = pictureRecorder.beginRecording(bounds)
         val skiaCanvas = canvas.asComposeCanvas() as SkiaBackedCanvas
-        skiaCanvas.alphaMultiplier = if (compositingStrategy == CompositingStrategy.ModulateAlpha) {
-            this@GraphicsLayer.alpha
-        } else {
-            1.0f
-        }
+        skiaCanvas.alphaMultiplier =
+            if (compositingStrategy == CompositingStrategy.ModulateAlpha) {
+                this@GraphicsLayer.alpha
+            } else {
+                1.0f
+            }
         childDependenciesTracker.withTracking(
             onDependencyRemoved = { it.onRemovedFromParentLayer() }
         ) {
-            pictureDrawScope.draw(
-                density,
-                layoutDirection,
-                skiaCanvas,
-                size.toSize(),
-                this,
-                block
-            )
+            pictureDrawScope.draw(density, layoutDirection, skiaCanvas, size.toSize(), this, block)
         }
         picture = pictureRecorder.finishRecordingAsPicture()
     }
@@ -216,11 +207,12 @@
         outlineSize: Size,
         block: (Offset, Size) -> Outline
     ): Outline {
-        val targetSize = if (outlineSize.isUnspecified) {
-            this.size.toSize()
-        } else {
-            outlineSize
-        }
+        val targetSize =
+            if (outlineSize.isUnspecified) {
+                this.size.toSize()
+            } else {
+                outlineSize
+            }
         return block(outlineTopLeft, targetSize)
     }
 
@@ -228,35 +220,35 @@
         var tmpOutline = internalOutline
         if (outlineDirty || tmpOutline == null) {
             val tmpPath = outlinePath
-            tmpOutline = if (tmpPath != null) {
-                Outline.Generic(tmpPath)
-            } else {
-                createOutlineWithPosition(
-                    roundRectOutlineTopLeft,
-                    roundRectOutlineSize
-                ) { outlineTopLeft, outlineSize ->
-                    if (roundRectCornerRadius > 0f) {
-                        Outline.Rounded(
-                            RoundRect(
-                                outlineTopLeft.x.toFloat(),
-                                outlineTopLeft.y.toFloat(),
-                                outlineTopLeft.x.toFloat() + outlineSize.width,
-                                outlineTopLeft.y.toFloat() + outlineSize.height,
-                                CornerRadius(roundRectCornerRadius)
+            tmpOutline =
+                if (tmpPath != null) {
+                    Outline.Generic(tmpPath)
+                } else {
+                    createOutlineWithPosition(roundRectOutlineTopLeft, roundRectOutlineSize) {
+                        outlineTopLeft,
+                        outlineSize ->
+                        if (roundRectCornerRadius > 0f) {
+                            Outline.Rounded(
+                                RoundRect(
+                                    outlineTopLeft.x.toFloat(),
+                                    outlineTopLeft.y.toFloat(),
+                                    outlineTopLeft.x.toFloat() + outlineSize.width,
+                                    outlineTopLeft.y.toFloat() + outlineSize.height,
+                                    CornerRadius(roundRectCornerRadius)
+                                )
                             )
-                        )
-                    } else {
-                        Outline.Rectangle(
-                            Rect(
-                                outlineTopLeft.x.toFloat(),
-                                outlineTopLeft.y.toFloat(),
-                                outlineTopLeft.x.toFloat() + outlineSize.width,
-                                outlineTopLeft.y.toFloat() + outlineSize.height
+                        } else {
+                            Outline.Rectangle(
+                                Rect(
+                                    outlineTopLeft.x.toFloat(),
+                                    outlineTopLeft.y.toFloat(),
+                                    outlineTopLeft.x.toFloat() + outlineSize.width,
+                                    outlineTopLeft.y.toFloat() + outlineSize.height
+                                )
                             )
-                        )
+                        }
                     }
                 }
-            }
             internalOutline = tmpOutline
             outlineDirty = false
         }
@@ -286,12 +278,10 @@
                 canvas.save()
 
                 when (val outline = internalOutline) {
-                    is Outline.Rectangle ->
-                        canvas.clipRect(outline.rect)
+                    is Outline.Rectangle -> canvas.clipRect(outline.rect)
                     is Outline.Rounded ->
                         (canvas as SkiaBackedCanvas).clipRoundRect(outline.roundRect)
-                    is Outline.Generic ->
-                        canvas.clipPath(outline.path)
+                    is Outline.Generic -> canvas.clipPath(outline.path)
                     null -> {
                         canvas.clipRect(0f, 0f, size.width.toFloat(), size.height.toFloat())
                     }
@@ -350,17 +340,16 @@
         }
 
     /**
-     * BlendMode to use when drawing this layer to the destination in [drawLayer].
-     * The default is [BlendMode.SrcOver].
-     * Any value other than [BlendMode.SrcOver] will force this [GraphicsLayer] to use an offscreen
-     * compositing layer for rendering.
+     * BlendMode to use when drawing this layer to the destination in [drawLayer]. The default is
+     * [BlendMode.SrcOver]. Any value other than [BlendMode.SrcOver] will force this [GraphicsLayer]
+     * to use an offscreen compositing layer for rendering.
      */
     actual var blendMode: BlendMode = BlendMode.SrcOver
 
     /**
-     * ColorFilter applied when drawing this layer to the destination in [drawLayer].
-     * Setting of this to any non-null will force this [GraphicsLayer] to use an offscreen
-     * compositing layer for rendering regardless of the value of [compositingStrategy]
+     * ColorFilter applied when drawing this layer to the destination in [drawLayer]. Setting of
+     * this to any non-null will force this [GraphicsLayer] to use an offscreen compositing layer
+     * for rendering regardless of the value of [compositingStrategy]
      */
     actual var colorFilter: ColorFilter? = null
 
@@ -375,10 +364,10 @@
 
     /**
      * Configures a rounded rect outline for this [GraphicsLayer]. By default, [topLeft] is set to
-     * [Size.Zero] and [size] is set to [Size.Unspecified] indicating that the outline
-     * should match the size of the [GraphicsLayer]. When [shadowElevation] is non-zero a shadow
-     * is produced using an [Outline] created from the round rect parameters provided. Additionally
-     * if [clip] is true, the contents of this [GraphicsLayer] will be clipped to this geometry.
+     * [Size.Zero] and [size] is set to [Size.Unspecified] indicating that the outline should match
+     * the size of the [GraphicsLayer]. When [shadowElevation] is non-zero a shadow is produced
+     * using an [Outline] created from the round rect parameters provided. Additionally if [clip] is
+     * true, the contents of this [GraphicsLayer] will be clipped to this geometry.
      *
      * @param topLeft The top left of the rounded rect outline
      * @param size The size of the rounded rect outline
@@ -386,11 +375,7 @@
      *
      * @sample androidx.compose.ui.graphics.samples.GraphicsLayerRoundRectOutline
      */
-    actual fun setRoundRectOutline(
-        topLeft: Offset,
-        size: Size,
-        cornerRadius: Float
-    ) {
+    actual fun setRoundRectOutline(topLeft: Offset, size: Size, cornerRadius: Float) {
         resetOutlineParams()
         this.roundRectOutlineTopLeft = topLeft
         this.roundRectOutlineSize = size
@@ -398,8 +383,8 @@
     }
 
     /**
-     * Specifies the given path to be configured as the outline for this [GraphicsLayer].
-     * When [shadowElevation] is non-zero a shadow is produced using this [Outline].
+     * Specifies the given path to be configured as the outline for this [GraphicsLayer]. When
+     * [shadowElevation] is non-zero a shadow is produced using this [Outline].
      *
      * @param path Path to be used as the Outline for the [GraphicsLayer]
      *
@@ -411,29 +396,26 @@
     }
 
     /**
-     * Returns the outline specified by either [setPathOutline] or [setRoundRectOutline].
-     * By default this will return [Outline.Rectangle] with the size of the [GraphicsLayer]
-     * specified by [record] or [IntSize.Zero] if [record] was not previously invoked.
+     * Returns the outline specified by either [setPathOutline] or [setRoundRectOutline]. By default
+     * this will return [Outline.Rectangle] with the size of the [GraphicsLayer] specified by
+     * [record] or [IntSize.Zero] if [record] was not previously invoked.
      */
     actual val outline: Outline
         get() = configureOutline()
 
     /**
      * Configures a rectangular outline for this [GraphicsLayer]. By default, [topLeft] is set to
-     * [Size.Zero] and [size] is set to [Size.Unspecified] indicating that the outline
-     * should match the size of the [GraphicsLayer]. When [shadowElevation] is non-zero a shadow
-     * is produced using an [Outline] created from the round rect parameters provided. Additionally
-     * if [clip] is true, the contents of this [GraphicsLayer] will be clipped to this geometry.
+     * [Size.Zero] and [size] is set to [Size.Unspecified] indicating that the outline should match
+     * the size of the [GraphicsLayer]. When [shadowElevation] is non-zero a shadow is produced
+     * using an [Outline] created from the round rect parameters provided. Additionally if [clip] is
+     * true, the contents of this [GraphicsLayer] will be clipped to this geometry.
      *
      * @param topLeft The top left of the rounded rect outline
      * @param size The size of the rounded rect outline
      *
      * @sample androidx.compose.ui.graphics.samples.GraphicsLayerRectOutline
      */
-    actual fun setRectOutline(
-        topLeft: Offset,
-        size: Size
-    ) {
+    actual fun setRectOutline(topLeft: Offset, size: Size) {
         setRoundRectOutline(topLeft, size, 0f)
     }
 
@@ -449,19 +431,16 @@
                 pivotY = pivotOffset.y
             }
             matrix.reset()
-            matrix *= Matrix().apply {
-                translate(x = -pivotX, y = -pivotY)
-            }
-            matrix *= Matrix().apply {
-                translate(translationX, translationY)
-                rotateX(rotationX)
-                rotateY(rotationY)
-                rotateZ(rotationZ)
-                scale(scaleX, scaleY)
-            }
-            matrix *= Matrix().apply {
-                translate(x = pivotX, y = pivotY)
-            }
+            matrix *= Matrix().apply { translate(x = -pivotX, y = -pivotY) }
+            matrix *=
+                Matrix().apply {
+                    translate(translationX, translationY)
+                    rotateX(rotationX)
+                    rotateY(rotationY)
+                    rotateZ(rotationZ)
+                    scale(scaleX, scaleY)
+                }
+            matrix *= Matrix().apply { translate(x = pivotX, y = pivotY) }
             matrixDirty = false
         }
     }
@@ -474,10 +453,9 @@
             picture?.close()
             pictureRecorder.close()
 
-            // discarding means we don't draw children layer anymore and need to remove dependencies:
-            childDependenciesTracker.removeDependencies {
-                it.onRemovedFromParentLayer()
-            }
+            // discarding means we don't draw children layer anymore and need to remove
+            // dependencies:
+            childDependenciesTracker.removeDependencies { it.onRemovedFromParentLayer() }
         }
     }
 
@@ -487,8 +465,8 @@
      * By default the shadow color is black. Generally, this color will be opaque so the intensity
      * of the shadow is consistent between different graphics layers with different colors.
      *
-     * The opacity of the final ambient shadow is a function of the shadow caster height, the
-     * alpha channel of the [ambientShadowColor] (typically opaque), and the
+     * The opacity of the final ambient shadow is a function of the shadow caster height, the alpha
+     * channel of the [ambientShadowColor] (typically opaque), and the
      * [android.R.attr.ambientShadowAlpha] theme attribute.
      *
      * Note that this parameter is only supported on Android 9 (Pie) and above. On older versions,
@@ -502,9 +480,9 @@
      * By default the shadow color is black. Generally, this color will be opaque so the intensity
      * of the shadow is consistent between different graphics layers with different colors.
      *
-     * The opacity of the final spot shadow is a function of the shadow caster height, the
-     * alpha channel of the [spotShadowColor] (typically opaque), and the
-     * [android.R.attr.spotShadowAlpha] theme attribute.
+     * The opacity of the final spot shadow is a function of the shadow caster height, the alpha
+     * channel of the [spotShadowColor] (typically opaque), and the [android.R.attr.spotShadowAlpha]
+     * theme attribute.
      *
      * Note that this parameter is only supported on Android 9 (Pie) and above. On older versions,
      * this property always returns [Color.Black] and setting new values is ignored.
@@ -517,36 +495,46 @@
         val hasBlendMode = blendMode != BlendMode.SrcOver
         val hasRenderEffect = renderEffect != null
         val offscreenBufferRequested = compositingStrategy == CompositingStrategy.Offscreen
-        return alphaNeedsLayer || hasColorFilter || hasBlendMode || hasRenderEffect ||
+        return alphaNeedsLayer ||
+            hasColorFilter ||
+            hasBlendMode ||
+            hasRenderEffect ||
             offscreenBufferRequested
     }
 
-    private fun drawShadow(canvas: Canvas) = with(density) {
-        val path = when (val tmpOutline = internalOutline) {
-            is Outline.Rectangle -> Path().apply { addRect(tmpOutline.rect) }
-            is Outline.Rounded -> Path().apply { addRoundRect(tmpOutline.roundRect) }
-            is Outline.Generic -> tmpOutline.path
-            else -> return
+    private fun drawShadow(canvas: Canvas) =
+        with(density) {
+            val path =
+                when (val tmpOutline = internalOutline) {
+                    is Outline.Rectangle -> Path().apply { addRect(tmpOutline.rect) }
+                    is Outline.Rounded -> Path().apply { addRoundRect(tmpOutline.roundRect) }
+                    is Outline.Generic -> tmpOutline.path
+                    else -> return
+                }
+
+            val zParams = Point3(0f, 0f, shadowElevation)
+
+            val lightPos = Point3(0f, -300.dp.toPx(), 600.dp.toPx())
+            val lightRad = 800.dp.toPx()
+
+            val ambientAlpha = 0.039f * alpha
+            val spotAlpha = 0.19f * alpha
+            val ambientColor = ambientShadowColor.copy(alpha = ambientAlpha)
+            val spotColor = spotShadowColor.copy(alpha = spotAlpha)
+
+            org.jetbrains.skia.ShadowUtils.drawShadow(
+                canvas.nativeCanvas,
+                path.asSkiaPath(),
+                zParams,
+                lightPos,
+                lightRad,
+                ambientColor.toArgb(),
+                spotColor.toArgb(),
+                alpha < 1f,
+                false
+            )
         }
 
-        val zParams = Point3(0f, 0f, shadowElevation)
-
-        val lightPos = Point3(0f, -300.dp.toPx(), 600.dp.toPx())
-        val lightRad = 800.dp.toPx()
-
-        val ambientAlpha = 0.039f * alpha
-        val spotAlpha = 0.19f * alpha
-        val ambientColor = ambientShadowColor.copy(alpha = ambientAlpha)
-        val spotColor = spotShadowColor.copy(alpha = spotAlpha)
-
-        org.jetbrains.skia.ShadowUtils.drawShadow(
-            canvas.nativeCanvas, path.asSkiaPath(), zParams, lightPos,
-            lightRad,
-            ambientColor.toArgb(),
-            spotColor.toArgb(), alpha < 1f, false
-        )
-    }
-
     /**
      * Create an [ImageBitmap] with the contents of this [GraphicsLayer] instance. Note that
      * [GraphicsLayer.record] must be invoked first to record drawing operations before invoking
diff --git a/compose/ui/ui-graphics/src/desktopTest/kotlin/androidx/compose/ui/graphics/DesktopGraphicsTest.kt b/compose/ui/ui-graphics/src/desktopTest/kotlin/androidx/compose/ui/graphics/DesktopGraphicsTest.kt
index 5be1b32..a8613f6 100644
--- a/compose/ui/ui-graphics/src/desktopTest/kotlin/androidx/compose/ui/graphics/DesktopGraphicsTest.kt
+++ b/compose/ui/ui-graphics/src/desktopTest/kotlin/androidx/compose/ui/graphics/DesktopGraphicsTest.kt
@@ -24,11 +24,11 @@
 
 @OptIn(InternalTestApi::class)
 abstract class DesktopGraphicsTest {
-    @get:Rule
-    val screenshotRule = DesktopScreenshotTestRule("compose/ui/ui-desktop/graphics")
+    @get:Rule val screenshotRule = DesktopScreenshotTestRule("compose/ui/ui-desktop/graphics")
 
     private var _surface: Surface? = null
-    protected val surface get() = _surface!!
+    protected val surface
+        get() = _surface!!
 
     protected val redPaint = Paint().apply { color = Color.Red }
     protected val bluePaint = Paint().apply { color = Color.Blue }
diff --git a/compose/ui/ui-graphics/src/desktopTest/kotlin/androidx/compose/ui/graphics/DesktopImageBitmapTest.kt b/compose/ui/ui-graphics/src/desktopTest/kotlin/androidx/compose/ui/graphics/DesktopImageBitmapTest.kt
index 22b40fb..0c4dbec 100644
--- a/compose/ui/ui-graphics/src/desktopTest/kotlin/androidx/compose/ui/graphics/DesktopImageBitmapTest.kt
+++ b/compose/ui/ui-graphics/src/desktopTest/kotlin/androidx/compose/ui/graphics/DesktopImageBitmapTest.kt
@@ -92,26 +92,12 @@
 
         val array = IntArray(5)
         asset.readPixels(array, startX = 0, startY = 0, width = 1, height = 1, bufferOffset = 0)
-        assertThat(array.map(::toHexString)).isEqualTo(
-            listOf(
-                "ffff0000",
-                "00000000",
-                "00000000",
-                "00000000",
-                "00000000"
-            )
-        )
+        assertThat(array.map(::toHexString))
+            .isEqualTo(listOf("ffff0000", "00000000", "00000000", "00000000", "00000000"))
 
         asset.readPixels(array, startX = 3, startY = 3, width = 2, height = 2, bufferOffset = 1)
-        assertThat(array.map(::toHexString)).isEqualTo(
-            listOf(
-                "ffff0000",
-                "ffff00ff",
-                "ffffff00",
-                "ff000000",
-                "80000000"
-            )
-        )
+        assertThat(array.map(::toHexString))
+            .isEqualTo(listOf("ffff0000", "ffff00ff", "ffffff00", "ff000000", "80000000"))
     }
 
     @Test
@@ -120,16 +106,10 @@
 
         val array = IntArray(6)
         asset.readPixels(array, startX = 3, startY = 3, width = 2, height = 2, stride = 3)
-        assertThat(array.map(::toHexString)).isEqualTo(
-            listOf(
-                "ffff00ff",
-                "ffffff00",
-                "00000000",
-                "ff000000",
-                "80000000",
-                "00000000"
+        assertThat(array.map(::toHexString))
+            .isEqualTo(
+                listOf("ffff00ff", "ffffff00", "00000000", "ff000000", "80000000", "00000000")
             )
-        )
     }
 
     private fun toHexString(num: Int) = "%08x".format(num)
diff --git a/compose/ui/ui-graphics/src/desktopTest/kotlin/androidx/compose/ui/graphics/DesktopPaintTest.kt b/compose/ui/ui-graphics/src/desktopTest/kotlin/androidx/compose/ui/graphics/DesktopPaintTest.kt
index 7a95a48..548aebc 100644
--- a/compose/ui/ui-graphics/src/desktopTest/kotlin/androidx/compose/ui/graphics/DesktopPaintTest.kt
+++ b/compose/ui/ui-graphics/src/desktopTest/kotlin/androidx/compose/ui/graphics/DesktopPaintTest.kt
@@ -50,11 +50,15 @@
     fun blendModePlus() {
         canvas.drawRect(left = 0f, top = 0f, right = 16f, bottom = 16f, paint = redPaint)
         canvas.drawRect(
-            left = 4f, top = 4f, right = 12f, bottom = 12f,
-            paint = Paint().apply {
-                color = Color.Blue
-                blendMode = BlendMode.Plus
-            }
+            left = 4f,
+            top = 4f,
+            right = 12f,
+            bottom = 12f,
+            paint =
+                Paint().apply {
+                    color = Color.Blue
+                    blendMode = BlendMode.Plus
+                }
         )
 
         screenshotRule.snap(surface)
@@ -64,11 +68,15 @@
     fun blendModeMultiply() {
         canvas.drawRect(left = 0f, top = 0f, right = 16f, bottom = 16f, paint = redPaint)
         canvas.drawRect(
-            left = 4f, top = 4f, right = 12f, bottom = 12f,
-            paint = Paint().apply {
-                color = Color.Gray
-                blendMode = BlendMode.Multiply
-            }
+            left = 4f,
+            top = 4f,
+            right = 12f,
+            bottom = 12f,
+            paint =
+                Paint().apply {
+                    color = Color.Gray
+                    blendMode = BlendMode.Multiply
+                }
         )
 
         screenshotRule.snap(surface)
@@ -81,9 +89,7 @@
         canvas.drawImage(
             image = loadResourceBitmap("androidx/compose/desktop/test.png"),
             topLeftOffset = Offset(2f, 4f),
-            paint = Paint().apply {
-                colorFilter = ColorFilter.tint(Color.Blue, BlendMode.Plus)
-            }
+            paint = Paint().apply { colorFilter = ColorFilter.tint(Color.Blue, BlendMode.Plus) }
         )
 
         screenshotRule.snap(surface)
@@ -99,9 +105,7 @@
             srcSize = IntSize(2, 4),
             dstOffset = IntOffset(0, 4),
             dstSize = IntSize(4, 12),
-            paint = redPaint.apply {
-                filterQuality = FilterQuality.None
-            }
+            paint = redPaint.apply { filterQuality = FilterQuality.None }
         )
         canvas.drawImageRect(
             image = loadResourceBitmap("androidx/compose/desktop/test.png"),
@@ -109,9 +113,7 @@
             srcSize = IntSize(2, 4),
             dstOffset = IntOffset(4, 4),
             dstSize = IntSize(4, 12),
-            paint = redPaint.apply {
-                filterQuality = FilterQuality.Low
-            }
+            paint = redPaint.apply { filterQuality = FilterQuality.Low }
         )
         canvas.drawImageRect(
             image = loadResourceBitmap("androidx/compose/desktop/test.png"),
@@ -119,9 +121,7 @@
             srcSize = IntSize(2, 4),
             dstOffset = IntOffset(8, 4),
             dstSize = IntSize(4, 12),
-            paint = redPaint.apply {
-                filterQuality = FilterQuality.High
-            }
+            paint = redPaint.apply { filterQuality = FilterQuality.High }
         )
 
         screenshotRule.snap(surface)
@@ -139,9 +139,7 @@
             srcSize = IntSize(2, 4),
             dstOffset = IntOffset(0, 2),
             dstSize = IntSize(2, 6),
-            paint = redPaint.apply {
-                filterQuality = FilterQuality.None
-            }
+            paint = redPaint.apply { filterQuality = FilterQuality.None }
         )
         canvas.drawImageRect(
             image = loadResourceBitmap("androidx/compose/desktop/test.png"),
@@ -149,9 +147,7 @@
             srcSize = IntSize(2, 4),
             dstOffset = IntOffset(2, 2),
             dstSize = IntSize(2, 6),
-            paint = redPaint.apply {
-                filterQuality = FilterQuality.Low
-            }
+            paint = redPaint.apply { filterQuality = FilterQuality.Low }
         )
         canvas.drawImageRect(
             image = loadResourceBitmap("androidx/compose/desktop/test.png"),
@@ -159,9 +155,7 @@
             srcSize = IntSize(2, 4),
             dstOffset = IntOffset(4, 2),
             dstSize = IntSize(2, 6),
-            paint = redPaint.apply {
-                filterQuality = FilterQuality.High
-            }
+            paint = redPaint.apply { filterQuality = FilterQuality.High }
         )
 
         screenshotRule.snap(surface)
@@ -172,15 +166,20 @@
         canvas.drawRect(left = 0f, top = 0f, right = 16f, bottom = 16f, paint = redPaint)
 
         canvas.drawRect(
-            left = 2f, top = 2f, right = 14f, bottom = 14f,
-            paint = Paint().apply {
-                shader = LinearGradientShader(
-                    from = Offset(0f, 0f),
-                    to = Offset(6f, 6f),
-                    colors = listOf(Color.Blue, Color.Green),
-                    tileMode = TileMode.Mirror
-                )
-            }
+            left = 2f,
+            top = 2f,
+            right = 14f,
+            bottom = 14f,
+            paint =
+                Paint().apply {
+                    shader =
+                        LinearGradientShader(
+                            from = Offset(0f, 0f),
+                            to = Offset(6f, 6f),
+                            colors = listOf(Color.Blue, Color.Green),
+                            tileMode = TileMode.Mirror
+                        )
+                }
         )
 
         screenshotRule.snap(surface)
@@ -191,16 +190,21 @@
         canvas.drawRect(left = 0f, top = 0f, right = 16f, bottom = 16f, paint = redPaint)
 
         canvas.drawRect(
-            left = 1f, top = 2f, right = 14f, bottom = 15f,
-            paint = Paint().apply {
-                shader = LinearGradientShader(
-                    from = Offset(0f, 0f),
-                    to = Offset(12f, 0f),
-                    colorStops = listOf(0f, 0.25f, 1f),
-                    colors = listOf(Color.Blue, Color.Green, Color.Yellow),
-                    tileMode = TileMode.Mirror
-                )
-            }
+            left = 1f,
+            top = 2f,
+            right = 14f,
+            bottom = 15f,
+            paint =
+                Paint().apply {
+                    shader =
+                        LinearGradientShader(
+                            from = Offset(0f, 0f),
+                            to = Offset(12f, 0f),
+                            colorStops = listOf(0f, 0.25f, 1f),
+                            colors = listOf(Color.Blue, Color.Green, Color.Yellow),
+                            tileMode = TileMode.Mirror
+                        )
+                }
         )
 
         screenshotRule.snap(surface)
@@ -211,15 +215,20 @@
         canvas.drawRect(left = 0f, top = 0f, right = 16f, bottom = 16f, paint = redPaint)
 
         canvas.drawRect(
-            left = 2f, top = 2f, right = 14f, bottom = 14f,
-            paint = Paint().apply {
-                shader = RadialGradientShader(
-                    center = Offset(4f, 8f),
-                    radius = 8f,
-                    colors = listOf(Color.Blue, Color.Green),
-                    tileMode = TileMode.Clamp
-                )
-            }
+            left = 2f,
+            top = 2f,
+            right = 14f,
+            bottom = 14f,
+            paint =
+                Paint().apply {
+                    shader =
+                        RadialGradientShader(
+                            center = Offset(4f, 8f),
+                            radius = 8f,
+                            colors = listOf(Color.Blue, Color.Green),
+                            tileMode = TileMode.Clamp
+                        )
+                }
         )
 
         screenshotRule.snap(surface)
@@ -230,13 +239,18 @@
         canvas.drawRect(left = 0f, top = 0f, right = 16f, bottom = 16f, paint = redPaint)
 
         canvas.drawRect(
-            left = 2f, top = 2f, right = 14f, bottom = 14f,
-            paint = Paint().apply {
-                shader = SweepGradientShader(
-                    center = Offset(4f, 8f),
-                    colors = listOf(Color.Blue, Color.Green)
-                )
-            }
+            left = 2f,
+            top = 2f,
+            right = 14f,
+            bottom = 14f,
+            paint =
+                Paint().apply {
+                    shader =
+                        SweepGradientShader(
+                            center = Offset(4f, 8f),
+                            colors = listOf(Color.Blue, Color.Green)
+                        )
+                }
         )
 
         screenshotRule.snap(surface)
@@ -247,14 +261,19 @@
         canvas.drawRect(left = 0f, top = 0f, right = 16f, bottom = 16f, paint = redPaint)
 
         canvas.drawRect(
-            left = 2f, top = 2f, right = 14f, bottom = 14f,
-            paint = Paint().apply {
-                shader = ImageShader(
-                    loadResourceBitmap("androidx/compose/desktop/test.png"),
-                    tileModeX = TileMode.Clamp,
-                    tileModeY = TileMode.Repeated
-                )
-            }
+            left = 2f,
+            top = 2f,
+            right = 14f,
+            bottom = 14f,
+            paint =
+                Paint().apply {
+                    shader =
+                        ImageShader(
+                            loadResourceBitmap("androidx/compose/desktop/test.png"),
+                            tileModeX = TileMode.Clamp,
+                            tileModeY = TileMode.Repeated
+                        )
+                }
         )
 
         screenshotRule.snap(surface)
diff --git a/compose/ui/ui-graphics/src/desktopTest/kotlin/androidx/compose/ui/graphics/DesktopPathTest.kt b/compose/ui/ui-graphics/src/desktopTest/kotlin/androidx/compose/ui/graphics/DesktopPathTest.kt
index 7ed3c7b..c2c1789 100644
--- a/compose/ui/ui-graphics/src/desktopTest/kotlin/androidx/compose/ui/graphics/DesktopPathTest.kt
+++ b/compose/ui/ui-graphics/src/desktopTest/kotlin/androidx/compose/ui/graphics/DesktopPathTest.kt
@@ -30,10 +30,11 @@
 
     @Test
     fun arc() {
-        val path = Path().apply {
-            addArc(Rect(0f, 0f, 16f, 16f), 0f, 90f)
-            arcTo(Rect(0f, 0f, 16f, 16f), 90f, 90f, true)
-        }
+        val path =
+            Path().apply {
+                addArc(Rect(0f, 0f, 16f, 16f), 0f, 90f)
+                arcTo(Rect(0f, 0f, 16f, 16f), 90f, 90f, true)
+            }
 
         canvas.drawPath(path, redPaint)
 
@@ -42,9 +43,7 @@
 
     @Test
     fun clipPath() {
-        val path = Path().apply {
-            addOval(Rect(0f, 0f, 16f, 8f))
-        }
+        val path = Path().apply { addOval(Rect(0f, 0f, 16f, 8f)) }
 
         canvas.withSave {
             canvas.clipPath(path, ClipOp.Intersect)
@@ -61,9 +60,7 @@
 
     @Test
     fun bezier() {
-        val path = Path().apply {
-            quadraticTo(0f, 16f, 16f, 16f)
-        }
+        val path = Path().apply { quadraticTo(0f, 16f, 16f, 16f) }
 
         canvas.drawPath(path, redPaint)
 
@@ -72,9 +69,7 @@
 
     @Test
     fun cubic() {
-        val path = Path().apply {
-            cubicTo(0f, 12f, 0f, 16f, 16f, 16f)
-        }
+        val path = Path().apply { cubicTo(0f, 12f, 0f, 16f, 16f, 16f) }
 
         canvas.drawPath(path, redPaint)
 
@@ -83,11 +78,12 @@
 
     @Test
     fun figures() {
-        val path = Path().apply {
-            addOval(Rect(0f, 0f, 8f, 4f))
-            addRect(Rect(12f, 0f, 16f, 8f))
-            addRoundRect(RoundRect(0f, 8f, 4f, 16f, 4f, 4f))
-        }
+        val path =
+            Path().apply {
+                addOval(Rect(0f, 0f, 8f, 4f))
+                addRect(Rect(12f, 0f, 16f, 8f))
+                addRoundRect(RoundRect(0f, 8f, 4f, 16f, 4f, 4f))
+            }
 
         canvas.drawPath(path, redPaint)
 
@@ -96,11 +92,12 @@
 
     @Test
     fun fillTypeEvenOdd() {
-        val path = Path().apply {
-            fillType = PathFillType.EvenOdd
-            addRect(Rect(0f, 0f, 8f, 8f))
-            addRect(Rect(4f, 4f, 12f, 12f))
-        }
+        val path =
+            Path().apply {
+                fillType = PathFillType.EvenOdd
+                addRect(Rect(0f, 0f, 8f, 8f))
+                addRect(Rect(4f, 4f, 12f, 12f))
+            }
 
         canvas.drawPath(path, redPaint)
 
@@ -109,10 +106,11 @@
 
     @Test
     fun fillTypeNonZero() {
-        val path = Path().apply {
-            addRect(Rect(0f, 0f, 8f, 8f))
-            addRect(Rect(4f, 4f, 12f, 12f))
-        }
+        val path =
+            Path().apply {
+                addRect(Rect(0f, 0f, 8f, 8f))
+                addRect(Rect(4f, 4f, 12f, 12f))
+            }
 
         assertEquals(PathFillType.NonZero, path.fillType)
         canvas.drawPath(path, redPaint)
@@ -122,16 +120,17 @@
 
     @Test
     fun linesFill() {
-        val path = Path().apply {
-            moveTo(0f, 0f)
-            lineTo(8f, 8f)
-            lineTo(0f, 8f)
+        val path =
+            Path().apply {
+                moveTo(0f, 0f)
+                lineTo(8f, 8f)
+                lineTo(0f, 8f)
 
-            moveTo(8f, 8f)
-            lineTo(8f, 16f)
-            lineTo(16f, 16f)
-            relativeLineTo(0f, -8f)
-        }
+                moveTo(8f, 8f)
+                lineTo(8f, 16f)
+                lineTo(16f, 16f)
+                relativeLineTo(0f, -8f)
+            }
 
         assertEquals(PaintingStyle.Fill, redPaint.style)
         canvas.drawPath(path, redPaint)
@@ -141,17 +140,18 @@
 
     @Test
     fun linesStroke() {
-        val path = Path().apply {
-            moveTo(0f, 0f)
-            lineTo(8f, 8f)
-            lineTo(0f, 8f)
-            close()
+        val path =
+            Path().apply {
+                moveTo(0f, 0f)
+                lineTo(8f, 8f)
+                lineTo(0f, 8f)
+                close()
 
-            moveTo(8f, 8f)
-            lineTo(8f, 16f)
-            lineTo(16f, 16f)
-            relativeLineTo(0f, -8f)
-        }
+                moveTo(8f, 8f)
+                lineTo(8f, 16f)
+                lineTo(16f, 16f)
+                relativeLineTo(0f, -8f)
+            }
 
         canvas.drawPath(
             path,
@@ -216,9 +216,7 @@
 
     @Test
     fun testRewind() {
-        val path = Path().apply {
-            addRect(Rect(0f, 0f, 100f, 200f))
-        }
+        val path = Path().apply { addRect(Rect(0f, 0f, 100f, 200f)) }
         assertFalse(path.isEmpty)
 
         path.rewind()
@@ -233,12 +231,11 @@
         val image = ImageBitmap(width, height)
         val canvas = Canvas(image)
 
-        val path = Path().apply {
-            addRect(Rect(0f, 0f, 50f, 50f))
-            transform(
-                Matrix().apply { translate(50f, 50f) }
-            )
-        }
+        val path =
+            Path().apply {
+                addRect(Rect(0f, 0f, 50f, 50f))
+                transform(Matrix().apply { translate(50f, 50f) })
+            }
 
         val paint = Paint().apply { color = Color.Black }
         canvas.drawRect(0f, 0f, width.toFloat(), height.toFloat(), paint)
diff --git a/compose/ui/ui-graphics/src/desktopTest/kotlin/androidx/compose/ui/graphics/canvas/DesktopCanvasPointsTest.kt b/compose/ui/ui-graphics/src/desktopTest/kotlin/androidx/compose/ui/graphics/canvas/DesktopCanvasPointsTest.kt
index c4c48e4..803f8a7 100644
--- a/compose/ui/ui-graphics/src/desktopTest/kotlin/androidx/compose/ui/graphics/canvas/DesktopCanvasPointsTest.kt
+++ b/compose/ui/ui-graphics/src/desktopTest/kotlin/androidx/compose/ui/graphics/canvas/DesktopCanvasPointsTest.kt
@@ -34,32 +34,24 @@
     fun drawLines() {
         canvas.drawPoints(
             pointMode = PointMode.Lines,
-            points = listOf(
-                Offset(0f, 8f),
-                Offset(8f, 0f),
-                Offset(8f, 8f),
-                Offset(0f, 8f)
-            ),
-            paint = Paint().apply {
-                color = Color.Red
-                strokeWidth = 2f
-            }
+            points = listOf(Offset(0f, 8f), Offset(8f, 0f), Offset(8f, 8f), Offset(0f, 8f)),
+            paint =
+                Paint().apply {
+                    color = Color.Red
+                    strokeWidth = 2f
+                }
         )
 
         canvas.translate(6f, 6f)
         canvas.drawPoints(
             pointMode = PointMode.Lines,
-            points = listOf(
-                Offset(0f, 8f),
-                Offset(8f, 0f),
-                Offset(8f, 8f),
-                Offset(0f, 8f)
-            ),
-            paint = Paint().apply {
-                color = Color.Green
-                strokeWidth = 2f
-                strokeCap = StrokeCap.Round
-            }
+            points = listOf(Offset(0f, 8f), Offset(8f, 0f), Offset(8f, 8f), Offset(0f, 8f)),
+            paint =
+                Paint().apply {
+                    color = Color.Green
+                    strokeWidth = 2f
+                    strokeCap = StrokeCap.Round
+                }
         )
 
         screenshotRule.snap(surface)
@@ -69,38 +61,33 @@
     fun drawPoints() {
         canvas.drawPoints(
             pointMode = PointMode.Points,
-            points = listOf(
-                Offset(0f, 2f),
-                Offset(2f, 0f)
-            ),
-            paint = Paint().apply {
-                color = Color.Red
-                strokeWidth = 2f
-                strokeCap = StrokeCap.Butt
-            }
+            points = listOf(Offset(0f, 2f), Offset(2f, 0f)),
+            paint =
+                Paint().apply {
+                    color = Color.Red
+                    strokeWidth = 2f
+                    strokeCap = StrokeCap.Butt
+                }
         )
         canvas.drawRawPoints(
             pointMode = PointMode.Points,
-            points = floatArrayOf(
-                4f, 4f,
-                8f, 8f
-            ),
-            paint = Paint().apply {
-                color = Color.Blue
-                strokeWidth = 4f
-                strokeCap = StrokeCap.Round
-            }
+            points = floatArrayOf(4f, 4f, 8f, 8f),
+            paint =
+                Paint().apply {
+                    color = Color.Blue
+                    strokeWidth = 4f
+                    strokeCap = StrokeCap.Round
+                }
         )
         canvas.drawPoints(
             pointMode = PointMode.Points,
-            points = listOf(
-                Offset(4f, 0f)
-            ),
-            paint = Paint().apply {
-                color = Color.Green
-                strokeWidth = 2f
-                strokeCap = StrokeCap.Square
-            }
+            points = listOf(Offset(4f, 0f)),
+            paint =
+                Paint().apply {
+                    color = Color.Green
+                    strokeWidth = 2f
+                    strokeCap = StrokeCap.Square
+                }
         )
 
         screenshotRule.snap(surface)
@@ -110,32 +97,24 @@
     fun drawPolygons() {
         canvas.drawPoints(
             pointMode = PointMode.Polygon,
-            points = listOf(
-                Offset(0f, 8f),
-                Offset(8f, 0f),
-                Offset(8f, 8f),
-                Offset(0f, 8f)
-            ),
-            paint = Paint().apply {
-                color = Color.Red
-                strokeWidth = 2f
-            }
+            points = listOf(Offset(0f, 8f), Offset(8f, 0f), Offset(8f, 8f), Offset(0f, 8f)),
+            paint =
+                Paint().apply {
+                    color = Color.Red
+                    strokeWidth = 2f
+                }
         )
 
         canvas.translate(6f, 6f)
         canvas.drawPoints(
             pointMode = PointMode.Polygon,
-            points = listOf(
-                Offset(0f, 8f),
-                Offset(8f, 0f),
-                Offset(8f, 8f),
-                Offset(0f, 8f)
-            ),
-            paint = Paint().apply {
-                color = Color.Green
-                strokeWidth = 2f
-                strokeCap = StrokeCap.Round
-            }
+            points = listOf(Offset(0f, 8f), Offset(8f, 0f), Offset(8f, 8f), Offset(0f, 8f)),
+            paint =
+                Paint().apply {
+                    color = Color.Green
+                    strokeWidth = 2f
+                    strokeCap = StrokeCap.Round
+                }
         )
 
         screenshotRule.snap(surface)
diff --git a/compose/ui/ui-graphics/src/desktopTest/kotlin/androidx/compose/ui/graphics/canvas/DesktopCanvasTest.kt b/compose/ui/ui-graphics/src/desktopTest/kotlin/androidx/compose/ui/graphics/canvas/DesktopCanvasTest.kt
index 4f6d984..4cc39f3 100644
--- a/compose/ui/ui-graphics/src/desktopTest/kotlin/androidx/compose/ui/graphics/canvas/DesktopCanvasTest.kt
+++ b/compose/ui/ui-graphics/src/desktopTest/kotlin/androidx/compose/ui/graphics/canvas/DesktopCanvasTest.kt
@@ -118,9 +118,7 @@
             srcSize = IntSize(2, 4),
             dstOffset = IntOffset(0, 4),
             dstSize = IntSize(4, 12),
-            paint = redPaint.apply {
-                filterQuality = FilterQuality.None
-            }
+            paint = redPaint.apply { filterQuality = FilterQuality.None }
         )
 
         screenshotRule.snap(surface)
@@ -129,7 +127,8 @@
     @Test
     fun drawLine() {
         canvas.drawLine(
-            Offset(-4f, -4f), Offset(4f, 4f),
+            Offset(-4f, -4f),
+            Offset(4f, 4f),
             Paint().apply {
                 color = Color.Red
                 strokeWidth = 1f
@@ -137,7 +136,8 @@
             }
         )
         canvas.drawLine(
-            Offset(8f, 4f), Offset(8f, 12f),
+            Offset(8f, 4f),
+            Offset(8f, 12f),
             Paint().apply {
                 color = Color.Blue
                 strokeWidth = 4f
@@ -145,7 +145,8 @@
             }
         )
         canvas.drawLine(
-            Offset(12f, 4f), Offset(12f, 12f),
+            Offset(12f, 4f),
+            Offset(12f, 12f),
             Paint().apply {
                 color = Color.Green
                 strokeWidth = 4f
@@ -153,7 +154,8 @@
             }
         )
         canvas.drawLine(
-            Offset(4f, 4f), Offset(4f, 12f),
+            Offset(4f, 4f),
+            Offset(4f, 12f),
             Paint().apply {
                 color = Color.Black.copy(alpha = 0.5f)
                 strokeWidth = 4f
@@ -163,7 +165,8 @@
 
         // should draw antialiased two-pixel line
         canvas.drawLine(
-            Offset(4f, 4f), Offset(4f, 12f),
+            Offset(4f, 4f),
+            Offset(4f, 12f),
             Paint().apply {
                 color = Color.Yellow
                 strokeWidth = 1f
@@ -173,7 +176,8 @@
 
         // should draw aliased one-pixel line
         canvas.drawLine(
-            Offset(4f, 4f), Offset(4f, 12f),
+            Offset(4f, 4f),
+            Offset(4f, 12f),
             Paint().apply {
                 color = Color.Yellow
                 strokeWidth = 1f
@@ -184,7 +188,8 @@
 
         // shouldn't draw any line
         canvas.drawLine(
-            Offset(4f, 4f), Offset(4f, 12f),
+            Offset(4f, 4f),
+            Offset(4f, 12f),
             Paint().apply {
                 color = Color.Yellow
                 strokeWidth = 0f
@@ -233,9 +238,7 @@
 
         canvas.withSaveLayer(
             Rect(left = 4f, top = 8f, right = 12f, bottom = 16f),
-            redPaint.apply {
-                blendMode = BlendMode.Plus
-            }
+            redPaint.apply { blendMode = BlendMode.Plus }
         ) {
             canvas.drawLine(Offset(4f, 0f), Offset(4f, 16f), bluePaint)
         }
@@ -272,11 +275,7 @@
         }
 
         canvas.withSave {
-            canvas.concat(
-                Matrix().apply {
-                    translate(12f, 2f)
-                }
-            )
+            canvas.concat(Matrix().apply { translate(12f, 2f) })
             canvas.drawRect(left = 0f, top = 0f, right = 4f, bottom = 4f, paint = cyanPaint)
         }
 
@@ -306,17 +305,17 @@
 
     @Test
     fun drawVertices() {
-        val positions = listOf(
-            Offset(0f, 0f),
-            Offset(16f, 0f),
-            Offset(8f, 8f),
-            Offset(16f, 8f),
-            Offset(0f, 16f),
-            Offset(16f, 16f),
-        )
-        val colors = listOf(
-            Color.Red, Color.Green, Color.Blue, Color.Cyan, Color.Magenta, Color.Yellow
-        )
+        val positions =
+            listOf(
+                Offset(0f, 0f),
+                Offset(16f, 0f),
+                Offset(8f, 8f),
+                Offset(16f, 8f),
+                Offset(0f, 16f),
+                Offset(16f, 16f),
+            )
+        val colors =
+            listOf(Color.Red, Color.Green, Color.Blue, Color.Cyan, Color.Magenta, Color.Yellow)
         val indices = listOf(0, 1, 2, 3, 4, 5)
 
         canvas.drawVertices(
diff --git a/compose/ui/ui-graphics/src/desktopTest/kotlin/androidx/compose/ui/graphics/layer/DesktopGraphicsLayerTest.kt b/compose/ui/ui-graphics/src/desktopTest/kotlin/androidx/compose/ui/graphics/layer/DesktopGraphicsLayerTest.kt
index bb71b0f..51dcc25 100644
--- a/compose/ui/ui-graphics/src/desktopTest/kotlin/androidx/compose/ui/graphics/layer/DesktopGraphicsLayerTest.kt
+++ b/compose/ui/ui-graphics/src/desktopTest/kotlin/androidx/compose/ui/graphics/layer/DesktopGraphicsLayerTest.kt
@@ -56,11 +56,8 @@
         var layer: GraphicsLayer? = null
         graphicsLayerTest(
             block = { graphicsContext ->
-                layer = graphicsContext.createGraphicsLayer().apply {
-                    record {
-                        drawRect(Color.Red)
-                    }
-                }
+                layer =
+                    graphicsContext.createGraphicsLayer().apply { record { drawRect(Color.Red) } }
                 drawLayer(layer!!)
             },
             verify = {
@@ -75,18 +72,15 @@
     fun testRecordWithSize() {
         graphicsLayerTest(
             block = { graphicsContext ->
-                val layer = graphicsContext.createGraphicsLayer().apply {
-                    record(
-                        size = IntSize(TEST_WIDTH / 2, TEST_HEIGHT / 2)
-                    ) {
-                        drawRect(Color.Red)
+                val layer =
+                    graphicsContext.createGraphicsLayer().apply {
+                        record(size = IntSize(TEST_WIDTH / 2, TEST_HEIGHT / 2)) {
+                            drawRect(Color.Red)
+                        }
                     }
-                }
                 drawLayer(layer)
             },
-            verify = {
-                it.verifyQuadrants(Color.Red, Color.Black, Color.Black, Color.Black)
-            }
+            verify = { it.verifyQuadrants(Color.Red, Color.Black, Color.Black, Color.Black) }
         )
     }
 
@@ -97,12 +91,11 @@
         val size = IntSize(TEST_WIDTH, TEST_HEIGHT)
         graphicsLayerTest(
             block = { graphicsContext ->
-                layer = graphicsContext.createGraphicsLayer().apply {
-                    record {
-                        drawRect(Color.Red)
+                layer =
+                    graphicsContext.createGraphicsLayer().apply {
+                        record { drawRect(Color.Red) }
+                        this.topLeft = topLeft
                     }
-                    this.topLeft = topLeft
-                }
                 drawLayer(layer!!)
             },
             verify = {
@@ -120,14 +113,11 @@
         val size = IntSize(TEST_WIDTH, TEST_HEIGHT)
         graphicsLayerTest(
             block = { graphicsContext ->
-                layer = graphicsContext.createGraphicsLayer().apply {
-                    record {
-                        inset(0f, 0f, -4f, -4f) {
-                            drawRect(Color.Red)
-                        }
+                layer =
+                    graphicsContext.createGraphicsLayer().apply {
+                        record { inset(0f, 0f, -4f, -4f) { drawRect(Color.Red) } }
+                        this.topLeft = topLeft
                     }
-                    this.topLeft = topLeft
-                }
                 drawLayer(layer!!)
             },
             verify = {
@@ -148,16 +138,17 @@
         val size = TEST_SIZE
         graphicsLayerTest(
             block = { graphicsContext ->
-                layer = graphicsContext.createGraphicsLayer().apply {
-                    record {
-                        drawRect(
-                            Color.Red,
-                            size = Size(this.size.width / 2, this.size.height / 2)
-                        )
+                layer =
+                    graphicsContext.createGraphicsLayer().apply {
+                        record {
+                            drawRect(
+                                Color.Red,
+                                size = Size(this.size.width / 2, this.size.height / 2)
+                            )
+                        }
+                        scaleX = 2f
+                        pivotOffset = Offset.Zero
                     }
-                    scaleX = 2f
-                    pivotOffset = Offset.Zero
-                }
                 drawLayer(layer!!)
             },
             verify = {
@@ -175,16 +166,17 @@
         val size = TEST_SIZE
         graphicsLayerTest(
             block = { graphicsContext ->
-                layer = graphicsContext.createGraphicsLayer().apply {
-                    record {
-                        drawRect(
-                            Color.Red,
-                            size = Size(this.size.width / 2, this.size.height / 2)
-                        )
+                layer =
+                    graphicsContext.createGraphicsLayer().apply {
+                        record {
+                            drawRect(
+                                Color.Red,
+                                size = Size(this.size.width / 2, this.size.height / 2)
+                            )
+                        }
+                        scaleY = 2f
+                        pivotOffset = Offset.Zero
                     }
-                    scaleY = 2f
-                    pivotOffset = Offset.Zero
-                }
                 drawLayer(layer!!)
             },
             verify = {
@@ -202,15 +194,14 @@
         val size = TEST_SIZE
         graphicsLayerTest(
             block = { graphicsContext ->
-                layer = graphicsContext.createGraphicsLayer().apply {
-                    record {
-                        inset(this.size.width / 4, this.size.height / 4) {
-                            drawRect(Color.Red)
+                layer =
+                    graphicsContext.createGraphicsLayer().apply {
+                        record {
+                            inset(this.size.width / 4, this.size.height / 4) { drawRect(Color.Red) }
                         }
+                        scaleY = 2f
+                        scaleX = 2f
                     }
-                    scaleY = 2f
-                    scaleX = 2f
-                }
                 drawLayer(layer!!)
             },
             verify = {
@@ -228,14 +219,13 @@
         val size = TEST_SIZE
         graphicsLayerTest(
             block = { graphicsContext ->
-                layer = graphicsContext.createGraphicsLayer().apply {
-                    record {
-                        drawRect(Color.Red)
+                layer =
+                    graphicsContext.createGraphicsLayer().apply {
+                        record { drawRect(Color.Red) }
+                        scaleY = 0.5f
+                        scaleX = 0.5f
+                        pivotOffset = Offset(this.size.width.toFloat(), this.size.height.toFloat())
                     }
-                    scaleY = 0.5f
-                    scaleX = 0.5f
-                    pivotOffset = Offset(this.size.width.toFloat(), this.size.height.toFloat())
-                }
                 drawLayer(layer!!)
             },
             verify = {
@@ -253,12 +243,11 @@
         val size = TEST_SIZE
         graphicsLayerTest(
             block = { graphicsContext ->
-                layer = graphicsContext.createGraphicsLayer().apply {
-                    record {
-                        drawRect(Color.Red, size = this.size / 2f)
+                layer =
+                    graphicsContext.createGraphicsLayer().apply {
+                        record { drawRect(Color.Red, size = this.size / 2f) }
+                        translationX = this.size.width / 2f
                     }
-                    translationX = this.size.width / 2f
-                }
                 drawLayer(layer!!)
             },
             verify = {
@@ -274,14 +263,15 @@
         graphicsLayerTest(
             block = { graphicsContext ->
                 var layerSize = Size.Zero
-                val layer = graphicsContext.createGraphicsLayer().apply {
-                    record {
-                        layerSize = this.size
-                        drawRect(Color.Red, size = this.size / 2f)
+                val layer =
+                    graphicsContext.createGraphicsLayer().apply {
+                        record {
+                            layerSize = this.size
+                            drawRect(Color.Red, size = this.size / 2f)
+                        }
+                        topLeft = IntOffset(20, 30)
+                        setRectOutline()
                     }
-                    topLeft = IntOffset(20, 30)
-                    setRectOutline()
-                }
                 drawLayer(layer)
                 val outline = layer.outline
                 assertEquals(Rect(0f, 0f, layerSize.width, layerSize.height), outline.bounds)
@@ -294,14 +284,15 @@
         graphicsLayerTest(
             block = { graphicsContext ->
                 var layerSize = Size.Zero
-                val layer = graphicsContext.createGraphicsLayer().apply {
-                    record {
-                        layerSize = this.size
-                        drawRect(Color.Red, size = this.size / 2f)
+                val layer =
+                    graphicsContext.createGraphicsLayer().apply {
+                        record {
+                            layerSize = this.size
+                            drawRect(Color.Red, size = this.size / 2f)
+                        }
+                        topLeft = IntOffset(20, 30)
+                        setRoundRectOutline()
                     }
-                    topLeft = IntOffset(20, 30)
-                    setRoundRectOutline()
-                }
                 drawLayer(layer)
                 val outline = layer.outline
                 assertEquals(Rect(0f, 0f, layerSize.width, layerSize.height), outline.bounds)
@@ -316,12 +307,11 @@
         val size = TEST_SIZE
         graphicsLayerTest(
             block = { graphicsContext ->
-                layer = graphicsContext.createGraphicsLayer().apply {
-                    record {
-                        drawRect(Color.Red, size = this.size / 2f)
+                layer =
+                    graphicsContext.createGraphicsLayer().apply {
+                        record { drawRect(Color.Red, size = this.size / 2f) }
+                        translationY = this.size.height / 2f
                     }
-                    translationY = this.size.height / 2f
-                }
                 drawLayer(layer!!)
             },
             verify = {
@@ -337,15 +327,11 @@
         var layer: GraphicsLayer?
         graphicsLayerTest(
             block = { graphicsContext ->
-                layer = graphicsContext.createGraphicsLayer().apply {
-                    record {
-                        drawRect(
-                            Color.Red,
-                            size = Size(100000f, 100000f)
-                        )
+                layer =
+                    graphicsContext.createGraphicsLayer().apply {
+                        record { drawRect(Color.Red, size = Size(100000f, 100000f)) }
+                        // Layer clipping is disabled by default
                     }
-                    // Layer clipping is disabled by default
-                }
                 drawLayer(layer!!)
             },
             verify = {
@@ -364,15 +350,11 @@
         var layer: GraphicsLayer?
         graphicsLayerTest(
             block = { graphicsContext ->
-                layer = graphicsContext.createGraphicsLayer().apply {
-                    record {
-                        drawRect(
-                            Color.Red,
-                            size = Size(100000f, 100000f)
-                        )
+                layer =
+                    graphicsContext.createGraphicsLayer().apply {
+                        record { drawRect(Color.Red, size = Size(100000f, 100000f)) }
+                        clip = true
                     }
-                    clip = true
-                }
                 drawLayer(layer!!)
             },
             verify = {
@@ -403,26 +385,21 @@
         val targetColor = Color.White
         graphicsLayerTest(
             block = { graphicsContext ->
-                val halfSize = IntSize(
-                    (this.size.width / 2f).toInt(),
-                    (this.size.height / 2f).toInt()
-                )
+                val halfSize =
+                    IntSize((this.size.width / 2f).toInt(), (this.size.height / 2f).toInt())
 
-                layer = graphicsContext.createGraphicsLayer().apply {
-                    record(halfSize) {
-                        drawRect(targetColor)
+                layer =
+                    graphicsContext.createGraphicsLayer().apply {
+                        record(halfSize) { drawRect(targetColor) }
+                        shadowElevation = 10f
                     }
-                    shadowElevation = 10f
-                }
                 drawRect(targetColor)
 
                 left = (this.size.width / 4f).toInt()
                 top = (this.size.width / 4f).toInt()
                 right = left + halfSize.width
                 bottom = top + halfSize.height
-                translate(this.size.width / 4, this.size.height / 4) {
-                    drawLayer(layer!!)
-                }
+                translate(this.size.width / 4, this.size.height / 4) { drawLayer(layer!!) }
             },
             verify = { pixmap ->
                 var shadowPixelCount = 0
@@ -450,38 +427,33 @@
         val targetColor = Color.White
         graphicsLayerTest(
             block = { graphicsContext ->
-                val halfSize = IntSize(
-                    (this.size.width / 2f).toInt(),
-                    (this.size.height / 2f).toInt()
-                )
+                val halfSize =
+                    IntSize((this.size.width / 2f).toInt(), (this.size.height / 2f).toInt())
 
-                layer = graphicsContext.createGraphicsLayer().apply {
-                    record(halfSize) {
-                        drawRect(targetColor)
-                    }
-                    setPathOutline(
-                        Path().apply {
-                            addRect(
-                                Rect(
-                                    0f,
-                                    0f,
-                                    halfSize.width.toFloat(),
-                                    halfSize.height.toFloat()
+                layer =
+                    graphicsContext.createGraphicsLayer().apply {
+                        record(halfSize) { drawRect(targetColor) }
+                        setPathOutline(
+                            Path().apply {
+                                addRect(
+                                    Rect(
+                                        0f,
+                                        0f,
+                                        halfSize.width.toFloat(),
+                                        halfSize.height.toFloat()
+                                    )
                                 )
-                            )
-                        }
-                    )
-                    shadowElevation = 10f
-                }
+                            }
+                        )
+                        shadowElevation = 10f
+                    }
                 drawRect(targetColor)
 
                 left = (this.size.width / 4f).toInt()
                 top = (this.size.width / 4f).toInt()
                 right = left + halfSize.width
                 bottom = top + halfSize.height
-                translate(this.size.width / 4, this.size.height / 4) {
-                    drawLayer(layer!!)
-                }
+                translate(this.size.width / 4, this.size.height / 4) { drawLayer(layer!!) }
             },
             verify = { pixmap ->
                 var shadowPixelCount = 0
@@ -510,28 +482,23 @@
         val radius = 50f
         graphicsLayerTest(
             block = { graphicsContext ->
-                val halfSize = IntSize(
-                    (this.size.width / 2f).toInt(),
-                    (this.size.height / 2f).toInt()
-                )
+                val halfSize =
+                    IntSize((this.size.width / 2f).toInt(), (this.size.height / 2f).toInt())
 
                 left = (this.size.width / 4f).toInt()
                 top = (this.size.width / 4f).toInt()
                 right = left + halfSize.width
                 bottom = top + halfSize.height
 
-                layer = graphicsContext.createGraphicsLayer().apply {
-                    record(halfSize) {
-                        drawRect(targetColor)
+                layer =
+                    graphicsContext.createGraphicsLayer().apply {
+                        record(halfSize) { drawRect(targetColor) }
+                        setRoundRectOutline(Offset.Zero, halfSize.toSize(), radius)
+                        shadowElevation = 20f
                     }
-                    setRoundRectOutline(Offset.Zero, halfSize.toSize(), radius)
-                    shadowElevation = 20f
-                }
 
                 drawRect(targetColor)
-                translate(left.toFloat(), top.toFloat()) {
-                    drawLayer(layer!!)
-                }
+                translate(left.toFloat(), top.toFloat()) { drawLayer(layer!!) }
             },
             verify = { pixmap ->
                 fun PixelMap.hasShadowPixels(
@@ -599,18 +566,19 @@
         val bgColor = Color.Black
         graphicsLayerTest(
             block = { graphicsContext ->
-                layer = graphicsContext.createGraphicsLayer().apply {
-                    compositingStrategy = CompositingStrategy.Auto
-                    alpha = 0.5f
-                    record {
-                        inset(0f, 0f, size.width / 3, size.height / 3) {
-                            drawRect(color = Color.Red)
-                        }
-                        inset(size.width / 3, size.height / 3, 0f, 0f) {
-                            drawRect(color = Color.Blue)
+                layer =
+                    graphicsContext.createGraphicsLayer().apply {
+                        compositingStrategy = CompositingStrategy.Auto
+                        alpha = 0.5f
+                        record {
+                            inset(0f, 0f, size.width / 3, size.height / 3) {
+                                drawRect(color = Color.Red)
+                            }
+                            inset(size.width / 3, size.height / 3, 0f, 0f) {
+                                drawRect(color = Color.Blue)
+                            }
                         }
                     }
-                }
                 drawRect(bgColor)
                 drawLayer(layer!!)
             },
@@ -637,17 +605,18 @@
         val bgColor = Color.LightGray
         graphicsLayerTest(
             block = { graphicsContext ->
-                layer = graphicsContext.createGraphicsLayer().apply {
-                    compositingStrategy = CompositingStrategy.Offscreen
-                    record {
-                        inset(0f, 0f, size.width / 3, size.height / 3) {
-                            drawRect(color = Color.Red)
-                        }
-                        inset(size.width / 3, size.height / 3, 0f, 0f) {
-                            drawRect(color = Color.Blue, blendMode = BlendMode.Xor)
+                layer =
+                    graphicsContext.createGraphicsLayer().apply {
+                        compositingStrategy = CompositingStrategy.Offscreen
+                        record {
+                            inset(0f, 0f, size.width / 3, size.height / 3) {
+                                drawRect(color = Color.Red)
+                            }
+                            inset(size.width / 3, size.height / 3, 0f, 0f) {
+                                drawRect(color = Color.Blue, blendMode = BlendMode.Xor)
+                            }
                         }
                     }
-                }
                 drawRect(bgColor)
                 drawLayer(layer!!)
             },
@@ -669,18 +638,19 @@
         val bgColor = Color.Black
         graphicsLayerTest(
             block = { graphicsContext ->
-                layer = graphicsContext.createGraphicsLayer().apply {
-                    compositingStrategy = CompositingStrategy.ModulateAlpha
-                    alpha = 0.5f
-                    record {
-                        inset(0f, 0f, size.width / 3, size.height / 3) {
-                            drawRect(color = Color.Red)
-                        }
-                        inset(size.width / 3, size.height / 3, 0f, 0f) {
-                            drawRect(color = Color.Blue)
+                layer =
+                    graphicsContext.createGraphicsLayer().apply {
+                        compositingStrategy = CompositingStrategy.ModulateAlpha
+                        alpha = 0.5f
+                        record {
+                            inset(0f, 0f, size.width / 3, size.height / 3) {
+                                drawRect(color = Color.Red)
+                            }
+                            inset(size.width / 3, size.height / 3, 0f, 0f) {
+                                drawRect(color = Color.Blue)
+                            }
                         }
                     }
-                }
                 drawRect(bgColor)
                 drawLayer(layer!!)
             },
@@ -708,13 +678,11 @@
         var layer: GraphicsLayer?
         graphicsLayerTest(
             block = { graphicsContext ->
-                layer = graphicsContext.createGraphicsLayer().apply {
-                    record {
-                        drawRect(Color.Red)
-                    }.apply {
-                        colorFilter = ColorFilter.tint(Color.Blue)
+                layer =
+                    graphicsContext.createGraphicsLayer().apply {
+                        record { drawRect(Color.Red) }
+                            .apply { colorFilter = ColorFilter.tint(Color.Blue) }
                     }
-                }
                 drawLayer(layer!!)
             },
             verify = { pixelMap ->
@@ -735,21 +703,22 @@
         graphicsLayerTest(
             block = { graphicsContext ->
                 val drawScopeSize = this.size
-                layer = graphicsContext.createGraphicsLayer().apply {
-                    val topLeft = IntOffset(
-                        (drawScopeSize.width / 4).toInt(),
-                        (drawScopeSize.height / 4).toInt()
-                    )
-                    val layerSize = IntSize(
-                        (drawScopeSize.width / 2).toInt(),
-                        (drawScopeSize.height / 2).toInt()
-                    )
-                    record(layerSize) {
-                        drawRect(Color.Red)
+                layer =
+                    graphicsContext.createGraphicsLayer().apply {
+                        val topLeft =
+                            IntOffset(
+                                (drawScopeSize.width / 4).toInt(),
+                                (drawScopeSize.height / 4).toInt()
+                            )
+                        val layerSize =
+                            IntSize(
+                                (drawScopeSize.width / 2).toInt(),
+                                (drawScopeSize.height / 2).toInt()
+                            )
+                        record(layerSize) { drawRect(Color.Red) }
+                        this.topLeft = topLeft
+                        this.blendMode = BlendMode.Xor
                     }
-                    this.topLeft = topLeft
-                    this.blendMode = BlendMode.Xor
-                }
                 drawRect(Color.Green)
                 drawLayer(layer!!)
                 // The layer should clear the original pixels in the destination rendered by the
@@ -790,13 +759,12 @@
         val targetColor = Color.Red
         graphicsLayerTest(
             block = { graphicsContext ->
-                layer = graphicsContext.createGraphicsLayer().apply {
-                    record {
-                        drawRect(targetColor)
+                layer =
+                    graphicsContext.createGraphicsLayer().apply {
+                        record { drawRect(targetColor) }
+                        setRectOutline(this.size.center.toOffset(), (this.size / 2).toSize())
+                        clip = true
                     }
-                    setRectOutline(this.size.center.toOffset(), (this.size / 2).toSize())
-                    clip = true
-                }
                 drawRect(bgColor)
 
                 left = this.size.center.x.toInt()
@@ -810,12 +778,12 @@
                 with(pixmap) {
                     for (x in 0 until width) {
                         for (y in 0 until height) {
-                            val expected = if (x in left until right &&
-                                y in top until bottom) {
-                                targetColor
-                            } else {
-                                bgColor
-                            }
+                            val expected =
+                                if (x in left until right && y in top until bottom) {
+                                    targetColor
+                                } else {
+                                    bgColor
+                                }
                             Assert.assertEquals(this[x, y], expected)
                         }
                     }
@@ -835,22 +803,23 @@
         val targetColor = Color.Red
         graphicsLayerTest(
             block = { graphicsContext ->
-                layer = graphicsContext.createGraphicsLayer().apply {
-                    record {
-                        drawRect(targetColor)
-                    }
-                    setPathOutline(Path().apply {
-                        addRect(
-                            Rect(
-                                size.center.x.toFloat(),
-                                size.center.y.toFloat(),
-                                size.center.x + size.width.toFloat(),
-                                size.center.y + size.height.toFloat()
-                            )
+                layer =
+                    graphicsContext.createGraphicsLayer().apply {
+                        record { drawRect(targetColor) }
+                        setPathOutline(
+                            Path().apply {
+                                addRect(
+                                    Rect(
+                                        size.center.x.toFloat(),
+                                        size.center.y.toFloat(),
+                                        size.center.x + size.width.toFloat(),
+                                        size.center.y + size.height.toFloat()
+                                    )
+                                )
+                            }
                         )
-                    })
-                    clip = true
-                }
+                        clip = true
+                    }
                 drawRect(bgColor)
 
                 left = this.size.center.x.toInt()
@@ -864,12 +833,12 @@
                 with(pixmap) {
                     for (x in 0 until width) {
                         for (y in 0 until height) {
-                            val expected = if (x in left until right &&
-                                y in top until bottom) {
-                                targetColor
-                            } else {
-                                bgColor
-                            }
+                            val expected =
+                                if (x in left until right && y in top until bottom) {
+                                    targetColor
+                                } else {
+                                    bgColor
+                                }
                             Assert.assertEquals(this[x, y], expected)
                         }
                     }
@@ -890,17 +859,16 @@
         val targetColor = Color.Red
         graphicsLayerTest(
             block = { graphicsContext ->
-                layer = graphicsContext.createGraphicsLayer().apply {
-                    record {
-                        drawRect(targetColor)
+                layer =
+                    graphicsContext.createGraphicsLayer().apply {
+                        record { drawRect(targetColor) }
+                        setRoundRectOutline(
+                            this.size.center.toOffset(),
+                            (this.size / 2).toSize(),
+                            radius.toFloat()
+                        )
+                        clip = true
                     }
-                    setRoundRectOutline(
-                        this.size.center.toOffset(),
-                        (this.size / 2).toSize(),
-                        radius.toFloat()
-                    )
-                    clip = true
-                }
                 drawRect(bgColor)
 
                 left = this.size.center.x.toInt()
@@ -919,9 +887,7 @@
                     val endY = bottom - radius - offset
                     for (x in 0 until width) {
                         for (y in 0 until height) {
-                            if (
-                                x in startX until endX &&
-                                y in startY until endY) {
+                            if (x in startX until endX && y in startY until endY) {
                                 Assert.assertEquals(targetColor, this[x, y])
                             }
                         }
@@ -942,28 +908,25 @@
         graphicsLayerTest(
             block = { graphicsContext ->
                 val fullSize = size
-                val layerSize = Size(
-                    fullSize.width.roundToInt() - inset * 2,
-                    fullSize.height.roundToInt() - inset * 2
-                ).toIntSize()
+                val layerSize =
+                    Size(
+                            fullSize.width.roundToInt() - inset * 2,
+                            fullSize.height.roundToInt() - inset * 2
+                        )
+                        .toIntSize()
 
-                val layer = graphicsContext.createGraphicsLayer().apply {
-                    record(size = layerSize) {
-                        inset(-inset) {
-                            drawRect(targetColor)
-                        }
+                val layer =
+                    graphicsContext.createGraphicsLayer().apply {
+                        record(size = layerSize) { inset(-inset) { drawRect(targetColor) } }
+                        // as no outline is provided yet, this command will enable clipToBounds
+                        clip = true
+                        // then with providing an outline we should disable clipToBounds and start
+                        // using clipToOutline instead
+                        setRectOutline(Offset(-inset, -inset), fullSize)
                     }
-                    // as no outline is provided yet, this command will enable clipToBounds
-                    clip = true
-                    // then with providing an outline we should disable clipToBounds and start
-                    // using clipToOutline instead
-                    setRectOutline(Offset(-inset, -inset), fullSize)
-                }
 
                 drawRect(Color.Black)
-                inset(inset) {
-                    drawLayer(layer)
-                }
+                inset(inset) { drawLayer(layer) }
             },
             verify = { pixmap ->
                 with(pixmap) {
@@ -1002,10 +965,11 @@
                 }
             }
             surface.flushAndSubmit(true)
-            val area = IRect.makeWH(
-                if (entireScene) TEST_WIDTH * 2 else TEST_WIDTH,
-                if (entireScene) TEST_HEIGHT * 2 else TEST_HEIGHT
-            )
+            val area =
+                IRect.makeWH(
+                    if (entireScene) TEST_WIDTH * 2 else TEST_WIDTH,
+                    if (entireScene) TEST_HEIGHT * 2 else TEST_HEIGHT
+                )
             val imageBitmap = surface.makeImageSnapshot(area)!!.toComposeImageBitmap()
             verify?.invoke(imageBitmap.toPixelMap())
         } finally {
@@ -1029,9 +993,7 @@
         assertPixelColor(bottomRight, right, bottom) { "$right, $bottom is incorrect color" }
     }
 
-    /**
-     * Asserts that the color at a specific pixel in the bitmap at ([x], [y]) is [expected].
-     */
+    /** Asserts that the color at a specific pixel in the bitmap at ([x], [y]) is [expected]. */
     private fun PixelMap.assertPixelColor(
         expected: Color,
         x: Int,
diff --git a/compose/ui/ui-graphics/src/skikoMain/kotlin/androidx/compose/ui/graphics/BlendMode.skiko.kt b/compose/ui/ui-graphics/src/skikoMain/kotlin/androidx/compose/ui/graphics/BlendMode.skiko.kt
index 9a56c52..a229000 100644
--- a/compose/ui/ui-graphics/src/skikoMain/kotlin/androidx/compose/ui/graphics/BlendMode.skiko.kt
+++ b/compose/ui/ui-graphics/src/skikoMain/kotlin/androidx/compose/ui/graphics/BlendMode.skiko.kt
@@ -16,36 +16,37 @@
 
 package androidx.compose.ui.graphics
 
-internal fun BlendMode.toSkia() = when (this) {
-    BlendMode.Clear -> org.jetbrains.skia.BlendMode.CLEAR
-    BlendMode.Src -> org.jetbrains.skia.BlendMode.SRC
-    BlendMode.Dst -> org.jetbrains.skia.BlendMode.DST
-    BlendMode.SrcOver -> org.jetbrains.skia.BlendMode.SRC_OVER
-    BlendMode.DstOver -> org.jetbrains.skia.BlendMode.DST_OVER
-    BlendMode.SrcIn -> org.jetbrains.skia.BlendMode.SRC_IN
-    BlendMode.DstIn -> org.jetbrains.skia.BlendMode.DST_IN
-    BlendMode.SrcOut -> org.jetbrains.skia.BlendMode.SRC_OUT
-    BlendMode.DstOut -> org.jetbrains.skia.BlendMode.DST_OUT
-    BlendMode.SrcAtop -> org.jetbrains.skia.BlendMode.SRC_ATOP
-    BlendMode.DstAtop -> org.jetbrains.skia.BlendMode.DST_ATOP
-    BlendMode.Xor -> org.jetbrains.skia.BlendMode.XOR
-    BlendMode.Plus -> org.jetbrains.skia.BlendMode.PLUS
-    BlendMode.Modulate -> org.jetbrains.skia.BlendMode.MODULATE
-    BlendMode.Screen -> org.jetbrains.skia.BlendMode.SCREEN
-    BlendMode.Overlay -> org.jetbrains.skia.BlendMode.OVERLAY
-    BlendMode.Darken -> org.jetbrains.skia.BlendMode.DARKEN
-    BlendMode.Lighten -> org.jetbrains.skia.BlendMode.LIGHTEN
-    BlendMode.ColorDodge -> org.jetbrains.skia.BlendMode.COLOR_DODGE
-    BlendMode.ColorBurn -> org.jetbrains.skia.BlendMode.COLOR_BURN
-    BlendMode.Hardlight -> org.jetbrains.skia.BlendMode.HARD_LIGHT
-    BlendMode.Softlight -> org.jetbrains.skia.BlendMode.SOFT_LIGHT
-    BlendMode.Difference -> org.jetbrains.skia.BlendMode.DIFFERENCE
-    BlendMode.Exclusion -> org.jetbrains.skia.BlendMode.EXCLUSION
-    BlendMode.Multiply -> org.jetbrains.skia.BlendMode.MULTIPLY
-    BlendMode.Hue -> org.jetbrains.skia.BlendMode.HUE
-    BlendMode.Saturation -> org.jetbrains.skia.BlendMode.SATURATION
-    BlendMode.Color -> org.jetbrains.skia.BlendMode.COLOR
-    BlendMode.Luminosity -> org.jetbrains.skia.BlendMode.LUMINOSITY
-    // Always fallback to default blendmode of src over
-    else -> org.jetbrains.skia.BlendMode.SRC_OVER
-}
+internal fun BlendMode.toSkia() =
+    when (this) {
+        BlendMode.Clear -> org.jetbrains.skia.BlendMode.CLEAR
+        BlendMode.Src -> org.jetbrains.skia.BlendMode.SRC
+        BlendMode.Dst -> org.jetbrains.skia.BlendMode.DST
+        BlendMode.SrcOver -> org.jetbrains.skia.BlendMode.SRC_OVER
+        BlendMode.DstOver -> org.jetbrains.skia.BlendMode.DST_OVER
+        BlendMode.SrcIn -> org.jetbrains.skia.BlendMode.SRC_IN
+        BlendMode.DstIn -> org.jetbrains.skia.BlendMode.DST_IN
+        BlendMode.SrcOut -> org.jetbrains.skia.BlendMode.SRC_OUT
+        BlendMode.DstOut -> org.jetbrains.skia.BlendMode.DST_OUT
+        BlendMode.SrcAtop -> org.jetbrains.skia.BlendMode.SRC_ATOP
+        BlendMode.DstAtop -> org.jetbrains.skia.BlendMode.DST_ATOP
+        BlendMode.Xor -> org.jetbrains.skia.BlendMode.XOR
+        BlendMode.Plus -> org.jetbrains.skia.BlendMode.PLUS
+        BlendMode.Modulate -> org.jetbrains.skia.BlendMode.MODULATE
+        BlendMode.Screen -> org.jetbrains.skia.BlendMode.SCREEN
+        BlendMode.Overlay -> org.jetbrains.skia.BlendMode.OVERLAY
+        BlendMode.Darken -> org.jetbrains.skia.BlendMode.DARKEN
+        BlendMode.Lighten -> org.jetbrains.skia.BlendMode.LIGHTEN
+        BlendMode.ColorDodge -> org.jetbrains.skia.BlendMode.COLOR_DODGE
+        BlendMode.ColorBurn -> org.jetbrains.skia.BlendMode.COLOR_BURN
+        BlendMode.Hardlight -> org.jetbrains.skia.BlendMode.HARD_LIGHT
+        BlendMode.Softlight -> org.jetbrains.skia.BlendMode.SOFT_LIGHT
+        BlendMode.Difference -> org.jetbrains.skia.BlendMode.DIFFERENCE
+        BlendMode.Exclusion -> org.jetbrains.skia.BlendMode.EXCLUSION
+        BlendMode.Multiply -> org.jetbrains.skia.BlendMode.MULTIPLY
+        BlendMode.Hue -> org.jetbrains.skia.BlendMode.HUE
+        BlendMode.Saturation -> org.jetbrains.skia.BlendMode.SATURATION
+        BlendMode.Color -> org.jetbrains.skia.BlendMode.COLOR
+        BlendMode.Luminosity -> org.jetbrains.skia.BlendMode.LUMINOSITY
+        // Always fallback to default blendmode of src over
+        else -> org.jetbrains.skia.BlendMode.SRC_OVER
+    }
diff --git a/compose/ui/ui-graphics/src/skikoMain/kotlin/androidx/compose/ui/graphics/Matrices.skiko.kt b/compose/ui/ui-graphics/src/skikoMain/kotlin/androidx/compose/ui/graphics/Matrices.skiko.kt
index 14fedd7..dbc65d8 100644
--- a/compose/ui/ui-graphics/src/skikoMain/kotlin/androidx/compose/ui/graphics/Matrices.skiko.kt
+++ b/compose/ui/ui-graphics/src/skikoMain/kotlin/androidx/compose/ui/graphics/Matrices.skiko.kt
@@ -18,8 +18,4 @@
 
 import org.jetbrains.skia.Matrix33
 
-internal fun identityMatrix33() = Matrix33(
-    1f, 0f, 0f,
-    0f, 1f, 0f,
-    0f, 0f, 1f
-)
+internal fun identityMatrix33() = Matrix33(1f, 0f, 0f, 0f, 1f, 0f, 0f, 0f, 1f)
diff --git a/compose/ui/ui-graphics/src/skikoMain/kotlin/androidx/compose/ui/graphics/Rects.skiko.kt b/compose/ui/ui-graphics/src/skikoMain/kotlin/androidx/compose/ui/graphics/Rects.skiko.kt
index 02b79b0..9212b99 100644
--- a/compose/ui/ui-graphics/src/skikoMain/kotlin/androidx/compose/ui/graphics/Rects.skiko.kt
+++ b/compose/ui/ui-graphics/src/skikoMain/kotlin/androidx/compose/ui/graphics/Rects.skiko.kt
@@ -19,12 +19,7 @@
 import androidx.compose.ui.geometry.RoundRect
 
 fun Rect.toSkiaRect(): org.jetbrains.skia.Rect {
-    return org.jetbrains.skia.Rect.makeLTRB(
-        left,
-        top,
-        right,
-        bottom
-    )
+    return org.jetbrains.skia.Rect.makeLTRB(left, top, right, bottom)
 }
 
 fun org.jetbrains.skia.Rect.toComposeRect() =
diff --git a/compose/ui/ui-graphics/src/skikoMain/kotlin/androidx/compose/ui/graphics/SkiaBackedCanvas.skiko.kt b/compose/ui/ui-graphics/src/skikoMain/kotlin/androidx/compose/ui/graphics/SkiaBackedCanvas.skiko.kt
index 0e9707e..8a0ce08 100644
--- a/compose/ui/ui-graphics/src/skikoMain/kotlin/androidx/compose/ui/graphics/SkiaBackedCanvas.skiko.kt
+++ b/compose/ui/ui-graphics/src/skikoMain/kotlin/androidx/compose/ui/graphics/SkiaBackedCanvas.skiko.kt
@@ -39,26 +39,25 @@
 
 internal actual fun ActualCanvas(image: ImageBitmap): Canvas {
     val skiaBitmap = image.asSkiaBitmap()
-    require(!skiaBitmap.isImmutable) {
-        "Cannot draw on immutable ImageBitmap"
-    }
+    require(!skiaBitmap.isImmutable) { "Cannot draw on immutable ImageBitmap" }
     return SkiaBackedCanvas(org.jetbrains.skia.Canvas(skiaBitmap))
 }
 
-/**
- * Convert the [org.jetbrains.skia.Canvas] instance into a Compose-compatible Canvas
- */
+/** Convert the [org.jetbrains.skia.Canvas] instance into a Compose-compatible Canvas */
 fun org.jetbrains.skia.Canvas.asComposeCanvas(): Canvas = SkiaBackedCanvas(this)
 
-actual val Canvas.nativeCanvas: NativeCanvas get() = (this as SkiaBackedCanvas).skia
+actual val Canvas.nativeCanvas: NativeCanvas
+    get() = (this as SkiaBackedCanvas).skia
 
 class SkiaBackedCanvas(val skia: org.jetbrains.skia.Canvas) : Canvas {
 
     var alphaMultiplier: Float = 1.0f
 
-    private val Paint.skia get() = (this as SkiaBackedPaint).apply {
-        this.alphaMultiplier = this@SkiaBackedCanvas.alphaMultiplier
-    }.skia
+    private val Paint.skia
+        get() =
+            (this as SkiaBackedPaint)
+                .apply { this.alphaMultiplier = this@SkiaBackedCanvas.alphaMultiplier }
+                .skia
 
     override fun save() {
         skia.save()
@@ -69,13 +68,7 @@
     }
 
     override fun saveLayer(bounds: Rect, paint: Paint) {
-        skia.saveLayer(
-            bounds.left,
-            bounds.top,
-            bounds.right,
-            bounds.bottom,
-            paint.skia
-        )
+        skia.saveLayer(bounds.left, bounds.top, bounds.right, bounds.bottom, paint.skia)
     }
 
     override fun translate(dx: Float, dy: Float) {
@@ -132,17 +125,7 @@
         radiusY: Float,
         paint: Paint
     ) {
-        skia.drawRRect(
-            SkRRect.makeLTRB(
-                left,
-                top,
-                right,
-                bottom,
-                radiusX,
-                radiusY
-            ),
-            paint.skia
-        )
+        skia.drawRRect(SkRRect.makeLTRB(left, top, right, bottom, radiusX, radiusY), paint.skia)
     }
 
     override fun drawOval(left: Float, top: Float, right: Float, bottom: Float, paint: Paint) {
@@ -163,16 +146,7 @@
         useCenter: Boolean,
         paint: Paint
     ) {
-        skia.drawArc(
-            left,
-            top,
-            right,
-            bottom,
-            startAngle,
-            sweepAngle,
-            useCenter,
-            paint.skia
-        )
+        skia.drawArc(left, top, right, bottom, startAngle, sweepAngle, useCenter, paint.skia)
     }
 
     override fun drawPath(path: Path, paint: Paint) {
@@ -220,18 +194,8 @@
         Image.makeFromBitmap(bitmap).use { skiaImage ->
             skia.drawImageRect(
                 skiaImage,
-                SkRect.makeXYWH(
-                    srcOffset.x,
-                    srcOffset.y,
-                    srcSize.width,
-                    srcSize.height
-                ),
-                SkRect.makeXYWH(
-                    dstOffset.x,
-                    dstOffset.y,
-                    dstSize.width,
-                    dstSize.height
-                ),
+                SkRect.makeXYWH(srcOffset.x, srcOffset.y, srcSize.width, srcSize.height),
+                SkRect.makeXYWH(dstOffset.x, dstOffset.y, dstSize.width, dstSize.height),
                 paint.filterQuality.toSkia(),
                 paint.skia,
                 true
@@ -258,24 +222,17 @@
     override fun disableZ() = Unit
 
     private fun drawPoints(points: List<Offset>, paint: Paint) {
-        points.fastForEach { point ->
-            skia.drawPoint(
-                point.x,
-                point.y,
-                paint.skia
-            )
-        }
+        points.fastForEach { point -> skia.drawPoint(point.x, point.y, paint.skia) }
     }
 
     /**
      * Draw lines connecting points based on the corresponding step.
      *
-     * ex. 3 points with a step of 1 would draw 2 lines between the first and second points
-     * and another between the second and third
+     * ex. 3 points with a step of 1 would draw 2 lines between the first and second points and
+     * another between the second and third
      *
      * ex. 4 points with a step of 2 would draw 2 lines between the first and second and another
-     * between the third and fourth. If there is an odd number of points, the last point is
-     * ignored
+     * between the third and fourth. If there is an odd number of points, the last point is ignored
      *
      * @see drawRawLines
      */
@@ -284,20 +241,12 @@
             for (i in 0 until points.size - 1 step stepBy) {
                 val p1 = points[i]
                 val p2 = points[i + 1]
-                skia.drawLine(
-                    p1.x,
-                    p1.y,
-                    p2.x,
-                    p2.y,
-                    paint.skia
-                )
+                skia.drawLine(p1.x, p1.y, p2.x, p2.y, paint.skia)
             }
         }
     }
 
-    /**
-     * @throws IllegalArgumentException if a non even number of points is provided
-     */
+    /** @throws IllegalArgumentException if a non even number of points is provided */
     override fun drawRawPoints(pointMode: PointMode, points: FloatArray, paint: Paint) {
         if (points.size % 2 != 0) {
             throw IllegalArgumentException("points must have an even number of values")
@@ -320,15 +269,14 @@
     }
 
     /**
-     * Draw lines connecting points based on the corresponding step. The points are interpreted
-     * as x, y coordinate pairs in alternating index positions
+     * Draw lines connecting points based on the corresponding step. The points are interpreted as
+     * x, y coordinate pairs in alternating index positions
      *
-     * ex. 3 points with a step of 1 would draw 2 lines between the first and second points
-     * and another between the second and third
+     * ex. 3 points with a step of 1 would draw 2 lines between the first and second points and
+     * another between the second and third
      *
      * ex. 4 points with a step of 2 would draw 2 lines between the first and second and another
-     * between the third and fourth. If there is an odd number of points, the last point is
-     * ignored
+     * between the third and fourth. If there is an odd number of points, the last point is ignored
      *
      * @see drawLines
      */
@@ -341,13 +289,7 @@
                 val y1 = points[i + 1]
                 val x2 = points[i + 2]
                 val y2 = points[i + 3]
-                skia.drawLine(
-                    x1,
-                    y1,
-                    x2,
-                    y2,
-                    paint.skia
-                )
+                skia.drawLine(x1, y1, x2, y2, paint.skia)
             }
         }
     }
@@ -364,41 +306,41 @@
         )
     }
 
-    private fun ClipOp.toSkia() = when (this) {
-        ClipOp.Difference -> SkClipMode.DIFFERENCE
-        ClipOp.Intersect -> SkClipMode.INTERSECT
-        else -> SkClipMode.INTERSECT
-    }
+    private fun ClipOp.toSkia() =
+        when (this) {
+            ClipOp.Difference -> SkClipMode.DIFFERENCE
+            ClipOp.Intersect -> SkClipMode.INTERSECT
+            else -> SkClipMode.INTERSECT
+        }
 
-    private fun Matrix.toSkia() = Matrix44(
-        this[0, 0],
-        this[1, 0],
-        this[2, 0],
-        this[3, 0],
-
-        this[0, 1],
-        this[1, 1],
-        this[2, 1],
-        this[3, 1],
-
-        this[0, 2],
-        this[1, 2],
-        this[2, 2],
-        this[3, 2],
-
-        this[0, 3],
-        this[1, 3],
-        this[2, 3],
-        this[3, 3]
-    )
+    private fun Matrix.toSkia() =
+        Matrix44(
+            this[0, 0],
+            this[1, 0],
+            this[2, 0],
+            this[3, 0],
+            this[0, 1],
+            this[1, 1],
+            this[2, 1],
+            this[3, 1],
+            this[0, 2],
+            this[1, 2],
+            this[2, 2],
+            this[3, 2],
+            this[0, 3],
+            this[1, 3],
+            this[2, 3],
+            this[3, 3]
+        )
 
     // These constants are chosen to correspond the old implementation of SkFilterQuality:
     // https://github.com/google/skia/blob/1f193df9b393d50da39570dab77a0bb5d28ec8ef/src/image/SkImage.cpp#L809
     // https://github.com/google/skia/blob/1f193df9b393d50da39570dab77a0bb5d28ec8ef/include/core/SkSamplingOptions.h#L86
-    private fun FilterQuality.toSkia(): SamplingMode = when (this) {
-        FilterQuality.Low -> FilterMipmap(FilterMode.LINEAR, MipmapMode.NONE)
-        FilterQuality.Medium -> FilterMipmap(FilterMode.LINEAR, MipmapMode.NEAREST)
-        FilterQuality.High -> CubicResampler(1 / 3.0f, 1 / 3.0f)
-        else -> FilterMipmap(FilterMode.NEAREST, MipmapMode.NONE)
-    }
+    private fun FilterQuality.toSkia(): SamplingMode =
+        when (this) {
+            FilterQuality.Low -> FilterMipmap(FilterMode.LINEAR, MipmapMode.NONE)
+            FilterQuality.Medium -> FilterMipmap(FilterMode.LINEAR, MipmapMode.NEAREST)
+            FilterQuality.High -> CubicResampler(1 / 3.0f, 1 / 3.0f)
+            else -> FilterMipmap(FilterMode.NEAREST, MipmapMode.NONE)
+        }
 }
diff --git a/compose/ui/ui-graphics/src/skikoMain/kotlin/androidx/compose/ui/graphics/SkiaBackedPaint.skiko.kt b/compose/ui/ui-graphics/src/skikoMain/kotlin/androidx/compose/ui/graphics/SkiaBackedPaint.skiko.kt
index 4bfc05f..de05605 100644
--- a/compose/ui/ui-graphics/src/skikoMain/kotlin/androidx/compose/ui/graphics/SkiaBackedPaint.skiko.kt
+++ b/compose/ui/ui-graphics/src/skikoMain/kotlin/androidx/compose/ui/graphics/SkiaBackedPaint.skiko.kt
@@ -24,14 +24,11 @@
 
 actual fun Paint(): Paint = SkiaBackedPaint()
 
-/**
- * Convert the [org.jetbrains.skia.Paint] instance into a Compose-compatible Paint
- */
+/** Convert the [org.jetbrains.skia.Paint] instance into a Compose-compatible Paint */
 fun org.jetbrains.skia.Paint.asComposePaint(): Paint = SkiaBackedPaint(this)
 
-internal class SkiaBackedPaint(
-    val skia: org.jetbrains.skia.Paint = org.jetbrains.skia.Paint()
-) : Paint {
+internal class SkiaBackedPaint(val skia: org.jetbrains.skia.Paint = org.jetbrains.skia.Paint()) :
+    Paint {
     override fun asFrameworkPaint(): NativePaint = skia
 
     private var mAlphaMultiplier = 1.0f
@@ -125,25 +122,28 @@
             field = value
         }
 
-    private fun PaintingStyle.toSkia() = when (this) {
-        PaintingStyle.Fill -> SkPaintMode.FILL
-        PaintingStyle.Stroke -> SkPaintMode.STROKE
-        else -> SkPaintMode.FILL
-    }
+    private fun PaintingStyle.toSkia() =
+        when (this) {
+            PaintingStyle.Fill -> SkPaintMode.FILL
+            PaintingStyle.Stroke -> SkPaintMode.STROKE
+            else -> SkPaintMode.FILL
+        }
 
-    private fun StrokeCap.toSkia() = when (this) {
-        StrokeCap.Butt -> SkPaintStrokeCap.BUTT
-        StrokeCap.Round -> SkPaintStrokeCap.ROUND
-        StrokeCap.Square -> SkPaintStrokeCap.SQUARE
-        else -> SkPaintStrokeCap.BUTT
-    }
+    private fun StrokeCap.toSkia() =
+        when (this) {
+            StrokeCap.Butt -> SkPaintStrokeCap.BUTT
+            StrokeCap.Round -> SkPaintStrokeCap.ROUND
+            StrokeCap.Square -> SkPaintStrokeCap.SQUARE
+            else -> SkPaintStrokeCap.BUTT
+        }
 
-    private fun StrokeJoin.toSkia() = when (this) {
-        StrokeJoin.Miter -> SkPaintStrokeJoin.MITER
-        StrokeJoin.Round -> SkPaintStrokeJoin.ROUND
-        StrokeJoin.Bevel -> SkPaintStrokeJoin.BEVEL
-        else -> SkPaintStrokeJoin.MITER
-    }
+    private fun StrokeJoin.toSkia() =
+        when (this) {
+            StrokeJoin.Miter -> SkPaintStrokeJoin.MITER
+            StrokeJoin.Round -> SkPaintStrokeJoin.ROUND
+            StrokeJoin.Bevel -> SkPaintStrokeJoin.BEVEL
+            else -> SkPaintStrokeJoin.MITER
+        }
 }
 
 actual fun BlendMode.isSupported(): Boolean = true
diff --git a/compose/ui/ui-graphics/src/skikoMain/kotlin/androidx/compose/ui/graphics/SkiaBackedPath.skiko.kt b/compose/ui/ui-graphics/src/skikoMain/kotlin/androidx/compose/ui/graphics/SkiaBackedPath.skiko.kt
index 11c65d0..15a40bb 100644
--- a/compose/ui/ui-graphics/src/skikoMain/kotlin/androidx/compose/ui/graphics/SkiaBackedPath.skiko.kt
+++ b/compose/ui/ui-graphics/src/skikoMain/kotlin/androidx/compose/ui/graphics/SkiaBackedPath.skiko.kt
@@ -26,9 +26,7 @@
 
 actual fun Path(): Path = SkiaBackedPath()
 
-/**
- * Convert the [org.jetbrains.skia.Path] instance into a Compose-compatible Path
- */
+/** Convert the [org.jetbrains.skia.Path] instance into a Compose-compatible Path */
 fun org.jetbrains.skia.Path.asComposePath(): Path = SkiaBackedPath(this)
 
 /**
@@ -44,9 +42,8 @@
     }
 
 @Suppress("OVERRIDE_DEPRECATION")
-internal class SkiaBackedPath(
-    internalPath: org.jetbrains.skia.Path = org.jetbrains.skia.Path()
-) : Path {
+internal class SkiaBackedPath(internalPath: org.jetbrains.skia.Path = org.jetbrains.skia.Path()) :
+    Path {
     var internalPath = internalPath
         private set
 
@@ -58,7 +55,6 @@
                 PathFillType.NonZero
             }
         }
-
         set(value) {
             internalPath.fillMode =
                 if (value == PathFillType.EvenOdd) {
@@ -101,11 +97,7 @@
     }
 
     override fun cubicTo(x1: Float, y1: Float, x2: Float, y2: Float, x3: Float, y3: Float) {
-        internalPath.cubicTo(
-            x1, y1,
-            x2, y2,
-            x3, y3
-        )
+        internalPath.cubicTo(x1, y1, x2, y2, x3, y3)
     }
 
     override fun relativeCubicTo(
@@ -116,11 +108,7 @@
         dx3: Float,
         dy3: Float
     ) {
-        internalPath.rCubicTo(
-            dx1, dy1,
-            dx2, dy2,
-            dx3, dy3
-        )
+        internalPath.rCubicTo(dx1, dy1, dx2, dy2, dx3, dy3)
     }
 
     override fun arcTo(
@@ -129,12 +117,7 @@
         sweepAngleDegrees: Float,
         forceMoveTo: Boolean
     ) {
-        internalPath.arcTo(
-            rect.toSkiaRect(),
-            startAngleDegrees,
-            sweepAngleDegrees,
-            forceMoveTo
-        )
+        internalPath.arcTo(rect.toSkiaRect(), startAngleDegrees, sweepAngleDegrees, forceMoveTo)
     }
 
     override fun addRect(rect: Rect) {
@@ -179,7 +162,8 @@
 
     override fun reset() {
         // preserve fillType to match the Android behavior
-        // see https://cs.android.com/android/_/android/platform/frameworks/base/+/d0f379c1976c600313f1f4c39f2587a649e3a4fc
+        // see
+        // https://cs.android.com/android/_/android/platform/frameworks/base/+/d0f379c1976c600313f1f4c39f2587a649e3a4fc
         val fillType = this.fillType
         internalPath.reset()
         this.fillType = fillType
@@ -199,41 +183,36 @@
 
     override fun getBounds(): Rect {
         val bounds = internalPath.bounds
-        return Rect(
-            bounds.left,
-            bounds.top,
-            bounds.right,
-            bounds.bottom
-        )
+        return Rect(bounds.left, bounds.top, bounds.right, bounds.bottom)
     }
 
-    override fun op(
-        path1: Path,
-        path2: Path,
-        operation: PathOperation
-    ): Boolean {
-        val path = org.jetbrains.skia.Path.makeCombining(
-            path1.asSkiaPath(),
-            path2.asSkiaPath(),
-            operation.toSkiaOperation()
-        )
+    override fun op(path1: Path, path2: Path, operation: PathOperation): Boolean {
+        val path =
+            org.jetbrains.skia.Path.makeCombining(
+                path1.asSkiaPath(),
+                path2.asSkiaPath(),
+                operation.toSkiaOperation()
+            )
 
         internalPath = path ?: internalPath
         return path != null
     }
 
-    private fun PathOperation.toSkiaOperation() = when (this) {
-        PathOperation.Difference -> PathOp.DIFFERENCE
-        PathOperation.Intersect -> PathOp.INTERSECT
-        PathOperation.Union -> PathOp.UNION
-        PathOperation.Xor -> PathOp.XOR
-        PathOperation.ReverseDifference -> PathOp.REVERSE_DIFFERENCE
-        else -> PathOp.XOR
-    }
+    private fun PathOperation.toSkiaOperation() =
+        when (this) {
+            PathOperation.Difference -> PathOp.DIFFERENCE
+            PathOperation.Intersect -> PathOp.INTERSECT
+            PathOperation.Union -> PathOp.UNION
+            PathOperation.Xor -> PathOp.XOR
+            PathOperation.ReverseDifference -> PathOp.REVERSE_DIFFERENCE
+            else -> PathOp.XOR
+        }
 
-    override val isConvex: Boolean get() = internalPath.isConvex
+    override val isConvex: Boolean
+        get() = internalPath.isConvex
 
-    override val isEmpty: Boolean get() = internalPath.isEmpty
+    override val isEmpty: Boolean
+        get() = internalPath.isEmpty
 
     private fun Matrix33.setFrom(matrix: Matrix) {
         require(
@@ -295,7 +274,8 @@
     }
 }
 
-private fun Path.Direction.toSkiaPathDirection() = when (this) {
-    Path.Direction.CounterClockwise -> PathDirection.COUNTER_CLOCKWISE
-    Path.Direction.Clockwise -> PathDirection.CLOCKWISE
-}
+private fun Path.Direction.toSkiaPathDirection() =
+    when (this) {
+        Path.Direction.CounterClockwise -> PathDirection.COUNTER_CLOCKWISE
+        Path.Direction.Clockwise -> PathDirection.CLOCKWISE
+    }
diff --git a/compose/ui/ui-graphics/src/skikoMain/kotlin/androidx/compose/ui/graphics/SkiaBackedPathEffect.skiko.kt b/compose/ui/ui-graphics/src/skikoMain/kotlin/androidx/compose/ui/graphics/SkiaBackedPathEffect.skiko.kt
index 619f7c2..8e795a3 100644
--- a/compose/ui/ui-graphics/src/skikoMain/kotlin/androidx/compose/ui/graphics/SkiaBackedPathEffect.skiko.kt
+++ b/compose/ui/ui-graphics/src/skikoMain/kotlin/androidx/compose/ui/graphics/SkiaBackedPathEffect.skiko.kt
@@ -20,24 +20,17 @@
 
 internal class SkiaBackedPathEffect(val nativePathEffect: SkPathEffect) : PathEffect
 
-/**
- * Convert the [org.jetbrains.skia.PathEffect] instance into a Compose-compatible PathEffect
- */
+/** Convert the [org.jetbrains.skia.PathEffect] instance into a Compose-compatible PathEffect */
 fun SkPathEffect.asComposePathEffect(): PathEffect = SkiaBackedPathEffect(this)
 
-/**
- * Obtain a reference to skia PathEffect type
- */
-fun PathEffect.asSkiaPathEffect(): SkPathEffect =
-    (this as SkiaBackedPathEffect).nativePathEffect
+/** Obtain a reference to skia PathEffect type */
+fun PathEffect.asSkiaPathEffect(): SkPathEffect = (this as SkiaBackedPathEffect).nativePathEffect
 
 internal actual fun actualCornerPathEffect(radius: Float): PathEffect =
     SkiaBackedPathEffect(SkPathEffect.makeCorner(radius))
 
-internal actual fun actualDashPathEffect(
-    intervals: FloatArray,
-    phase: Float
-): PathEffect = SkiaBackedPathEffect(SkPathEffect.makeDash(intervals, phase))
+internal actual fun actualDashPathEffect(intervals: FloatArray, phase: Float): PathEffect =
+    SkiaBackedPathEffect(SkPathEffect.makeDash(intervals, phase))
 
 internal actual fun actualChainPathEffect(outer: PathEffect, inner: PathEffect): PathEffect =
     SkiaBackedPathEffect(outer.asSkiaPathEffect().makeCompose(inner.asSkiaPathEffect()))
diff --git a/compose/ui/ui-graphics/src/skikoMain/kotlin/androidx/compose/ui/graphics/SkiaBackedPathMeasure.skiko.kt b/compose/ui/ui-graphics/src/skikoMain/kotlin/androidx/compose/ui/graphics/SkiaBackedPathMeasure.skiko.kt
index d1efe79..db23042 100644
--- a/compose/ui/ui-graphics/src/skikoMain/kotlin/androidx/compose/ui/graphics/SkiaBackedPathMeasure.skiko.kt
+++ b/compose/ui/ui-graphics/src/skikoMain/kotlin/androidx/compose/ui/graphics/SkiaBackedPathMeasure.skiko.kt
@@ -17,14 +17,11 @@
 package androidx.compose.ui.graphics
 
 import androidx.compose.ui.geometry.Offset
-/**
- * Convert the [org.jetbrains.skia.PathMeasure] instance into a Compose-compatible PathMeasure
- */
+
+/** Convert the [org.jetbrains.skia.PathMeasure] instance into a Compose-compatible PathMeasure */
 fun org.jetbrains.skia.PathMeasure.asComposePathEffect(): PathMeasure = SkiaBackedPathMeasure(this)
 
-/**
- * Obtain a reference to skia PathMeasure type
- */
+/** Obtain a reference to skia PathMeasure type */
 fun PathMeasure.asSkiaPathMeasure(): org.jetbrains.skia.PathMeasure =
     (this as SkiaBackedPathMeasure).skia
 
@@ -41,19 +38,12 @@
         stopDistance: Float,
         destination: Path,
         startWithMoveTo: Boolean
-    ) = skia.getSegment(
-        startDistance,
-        stopDistance,
-        destination.asSkiaPath(),
-        startWithMoveTo
-    )
+    ) = skia.getSegment(startDistance, stopDistance, destination.asSkiaPath(), startWithMoveTo)
 
     override val length: Float
         get() = skia.length
 
-    override fun getPosition(
-        distance: Float
-    ): Offset {
+    override fun getPosition(distance: Float): Offset {
         val result = skia.getPosition(distance)
         return if (result != null) {
             Offset(result.x, result.y)
@@ -62,9 +52,7 @@
         }
     }
 
-    override fun getTangent(
-        distance: Float
-    ): Offset {
+    override fun getTangent(distance: Float): Offset {
         val result = skia.getTangent(distance)
         return if (result != null) {
             Offset(result.x, result.y)
@@ -74,5 +62,4 @@
     }
 }
 
-actual fun PathMeasure(): PathMeasure =
-    SkiaBackedPathMeasure()
+actual fun PathMeasure(): PathMeasure = SkiaBackedPathMeasure()
diff --git a/compose/ui/ui-graphics/src/skikoMain/kotlin/androidx/compose/ui/graphics/SkiaBackedRenderEffect.skiko.kt b/compose/ui/ui-graphics/src/skikoMain/kotlin/androidx/compose/ui/graphics/SkiaBackedRenderEffect.skiko.kt
index cea1bb0..43c8e98 100644
--- a/compose/ui/ui-graphics/src/skikoMain/kotlin/androidx/compose/ui/graphics/SkiaBackedRenderEffect.skiko.kt
+++ b/compose/ui/ui-graphics/src/skikoMain/kotlin/androidx/compose/ui/graphics/SkiaBackedRenderEffect.skiko.kt
@@ -20,16 +20,12 @@
 import androidx.compose.ui.geometry.Offset
 import org.jetbrains.skia.ImageFilter
 
-/**
- * Convert the [ImageFilter] instance into a Compose-compatible [RenderEffect]
- */
-fun ImageFilter.asComposeRenderEffect(): RenderEffect =
-    SkiaBackedRenderEffect(this)
+/** Convert the [ImageFilter] instance into a Compose-compatible [RenderEffect] */
+fun ImageFilter.asComposeRenderEffect(): RenderEffect = SkiaBackedRenderEffect(this)
 
 /**
- * Intermediate rendering step used to render drawing commands with a corresponding
- * visual effect. A [RenderEffect] can be configured on a [GraphicsLayerScope]
- * and will be applied when drawn.
+ * Intermediate rendering step used to render drawing commands with a corresponding visual effect. A
+ * [RenderEffect] can be configured on a [GraphicsLayerScope] and will be applied when drawn.
  */
 @Immutable
 actual sealed class RenderEffect actual constructor() {
@@ -42,21 +38,20 @@
     protected abstract fun createImageFilter(): ImageFilter
 
     /**
-     * Capability query to determine if the particular platform supports the [RenderEffect]. Not
-     * all platforms support all render effects
+     * Capability query to determine if the particular platform supports the [RenderEffect]. Not all
+     * platforms support all render effects
      */
     actual open fun isSupported(): Boolean = true
 }
 
 @Immutable
-internal class SkiaBackedRenderEffect(
-    val imageFilter: ImageFilter
-) : RenderEffect() {
+internal class SkiaBackedRenderEffect(val imageFilter: ImageFilter) : RenderEffect() {
     override fun createImageFilter(): ImageFilter = imageFilter
 }
 
 @Immutable
-actual class BlurEffect actual constructor(
+actual class BlurEffect
+actual constructor(
     private val renderEffect: RenderEffect?,
     private val radiusX: Float,
     private val radiusY: Float,
@@ -123,10 +118,9 @@
 }
 
 @Immutable
-actual class OffsetEffect actual constructor(
-    private val renderEffect: RenderEffect?,
-    private val offset: Offset
-) : RenderEffect() {
+actual class OffsetEffect
+actual constructor(private val renderEffect: RenderEffect?, private val offset: Offset) :
+    RenderEffect() {
 
     override fun createImageFilter(): ImageFilter =
         ImageFilter.makeOffset(offset.x, offset.y, renderEffect?.asSkiaImageFilter(), null)
diff --git a/compose/ui/ui-graphics/src/skikoMain/kotlin/androidx/compose/ui/graphics/SkiaColorFilter.skiko.kt b/compose/ui/ui-graphics/src/skikoMain/kotlin/androidx/compose/ui/graphics/SkiaColorFilter.skiko.kt
index 7c1f68e..3860c40 100644
--- a/compose/ui/ui-graphics/src/skikoMain/kotlin/androidx/compose/ui/graphics/SkiaColorFilter.skiko.kt
+++ b/compose/ui/ui-graphics/src/skikoMain/kotlin/androidx/compose/ui/graphics/SkiaColorFilter.skiko.kt
@@ -20,23 +20,17 @@
 
 actual typealias NativeColorFilter = SkiaColorFilter
 
-/**
- * Obtain a [org.jetbrains.skia.ColorFilter] instance from this [ColorFilter]
- */
+/** Obtain a [org.jetbrains.skia.ColorFilter] instance from this [ColorFilter] */
 fun ColorFilter.asSkiaColorFilter(): SkiaColorFilter = nativeColorFilter
 
-/**
- * Create a [ColorFilter] from the given [org.jetbrains.skia.ColorFilter] instance
- */
+/** Create a [ColorFilter] from the given [org.jetbrains.skia.ColorFilter] instance */
 fun org.jetbrains.skia.ColorFilter.asComposeColorFilter(): ColorFilter = ColorFilter(this)
 
 internal actual fun actualTintColorFilter(color: Color, blendMode: BlendMode): NativeColorFilter =
     SkiaColorFilter.makeBlend(color.toArgb(), blendMode.toSkia())
 
 internal actual fun actualColorMatrixColorFilter(colorMatrix: ColorMatrix): NativeColorFilter =
-    SkiaColorFilter.makeMatrix(
-        org.jetbrains.skia.ColorMatrix(*colorMatrix.values)
-    )
+    SkiaColorFilter.makeMatrix(org.jetbrains.skia.ColorMatrix(*colorMatrix.values))
 
 internal actual fun actualLightingColorFilter(multiply: Color, add: Color): NativeColorFilter =
     SkiaColorFilter.makeLighting(multiply.toArgb(), add.toArgb())
diff --git a/compose/ui/ui-graphics/src/skikoMain/kotlin/androidx/compose/ui/graphics/SkiaImageAsset.skiko.kt b/compose/ui/ui-graphics/src/skikoMain/kotlin/androidx/compose/ui/graphics/SkiaImageAsset.skiko.kt
index afef2c7..4b6ef20 100644
--- a/compose/ui/ui-graphics/src/skikoMain/kotlin/androidx/compose/ui/graphics/SkiaImageAsset.skiko.kt
+++ b/compose/ui/ui-graphics/src/skikoMain/kotlin/androidx/compose/ui/graphics/SkiaImageAsset.skiko.kt
@@ -27,15 +27,12 @@
 import org.jetbrains.skia.ImageInfo
 
 /**
- * Create an [ImageBitmap] from the given [Bitmap]. Note this does
- * not create a copy of the original [Bitmap] and changes to it
- * will modify the returned [ImageBitmap]
+ * Create an [ImageBitmap] from the given [Bitmap]. Note this does not create a copy of the original
+ * [Bitmap] and changes to it will modify the returned [ImageBitmap]
  */
 fun Bitmap.asComposeImageBitmap(): ImageBitmap = SkiaBackedImageBitmap(this)
 
-/**
- * Create an [ImageBitmap] from the given [Image].
- */
+/** Create an [ImageBitmap] from the given [Image]. */
 fun Image.toComposeImageBitmap(): ImageBitmap = SkiaBackedImageBitmap(toBitmap())
 
 private fun Image.toBitmap(): Bitmap {
@@ -68,7 +65,7 @@
  * Obtain a reference to the [org.jetbrains.skia.Bitmap]
  *
  * @Throws UnsupportedOperationException if this [ImageBitmap] is not backed by an
- * org.jetbrains.skia.Image
+ *   org.jetbrains.skia.Image
  */
 fun ImageBitmap.asSkiaBitmap(): Bitmap =
     when (this) {
@@ -80,8 +77,12 @@
     override val colorSpace = bitmap.colorSpace.toComposeColorSpace()
     override val config = bitmap.colorType.toComposeConfig()
     override val hasAlpha = !bitmap.isOpaque
-    override val height get() = bitmap.height
-    override val width get() = bitmap.width
+    override val height
+        get() = bitmap.height
+
+    override val width
+        get() = bitmap.width
+
     override fun prepareToDraw() = Unit
 
     override fun readPixels(
@@ -93,7 +94,8 @@
         bufferOffset: Int,
         stride: Int
     ) {
-        // similar to https://cs.android.com/android/platform/superproject/+/42c50042d1f05d92ecc57baebe3326a57aeecf77:frameworks/base/graphics/java/android/graphics/Bitmap.java;l=2007
+        // similar to
+        // https://cs.android.com/android/platform/superproject/+/42c50042d1f05d92ecc57baebe3326a57aeecf77:frameworks/base/graphics/java/android/graphics/Bitmap.java;l=2007
         val lastScanline: Int = bufferOffset + (height - 1) * stride
         require(startX >= 0 && startY >= 0)
         require(width > 0 && startX + width <= this.width)
@@ -102,12 +104,14 @@
         require(bufferOffset >= 0 && bufferOffset + width <= buffer.size)
         require(lastScanline >= 0 && lastScanline + width <= buffer.size)
 
-        // similar to https://cs.android.com/android/platform/superproject/+/9054ca2b342b2ea902839f629e820546d8a2458b:frameworks/base/libs/hwui/jni/Bitmap.cpp;l=898;bpv=1
-        val colorInfo = ColorInfo(
-            ColorType.BGRA_8888,
-            ColorAlphaType.UNPREMUL,
-            org.jetbrains.skia.ColorSpace.sRGB
-        )
+        // similar to
+        // https://cs.android.com/android/platform/superproject/+/9054ca2b342b2ea902839f629e820546d8a2458b:frameworks/base/libs/hwui/jni/Bitmap.cpp;l=898;bpv=1
+        val colorInfo =
+            ColorInfo(
+                ColorType.BGRA_8888,
+                ColorAlphaType.UNPREMUL,
+                org.jetbrains.skia.ColorSpace.sRGB
+            )
         val imageInfo = ImageInfo(colorInfo, width, height)
         val bytesPerPixel = 4
         val bytes = bitmap.readPixels(imageInfo, stride * bytesPerPixel, startX, startY)!!
@@ -120,23 +124,26 @@
 // TODO(demin): [API] maybe we should use:
 //  `else -> throw UnsupportedOperationException()`
 //  in toSkiaColorType/toComposeConfig/toComposeColorSpace/toSkiaColorSpace
-//  see [https://android-review.googlesource.com/c/platform/frameworks/support/+/1429835/comment/c219501b_63c3d1fe/]
+//  see
+// [https://android-review.googlesource.com/c/platform/frameworks/support/+/1429835/comment/c219501b_63c3d1fe/]
 
-private fun ImageBitmapConfig.toSkiaColorType() = when (this) {
-    ImageBitmapConfig.Argb8888 -> ColorType.N32
-    ImageBitmapConfig.Alpha8 -> ColorType.ALPHA_8
-    ImageBitmapConfig.Rgb565 -> ColorType.RGB_565
-    ImageBitmapConfig.F16 -> ColorType.RGBA_F16
-    else -> ColorType.N32
-}
+private fun ImageBitmapConfig.toSkiaColorType() =
+    when (this) {
+        ImageBitmapConfig.Argb8888 -> ColorType.N32
+        ImageBitmapConfig.Alpha8 -> ColorType.ALPHA_8
+        ImageBitmapConfig.Rgb565 -> ColorType.RGB_565
+        ImageBitmapConfig.F16 -> ColorType.RGBA_F16
+        else -> ColorType.N32
+    }
 
-private fun ColorType.toComposeConfig() = when (this) {
-    ColorType.N32 -> ImageBitmapConfig.Argb8888
-    ColorType.ALPHA_8 -> ImageBitmapConfig.Alpha8
-    ColorType.RGB_565 -> ImageBitmapConfig.Rgb565
-    ColorType.RGBA_F16 -> ImageBitmapConfig.F16
-    else -> ImageBitmapConfig.Argb8888
-}
+private fun ColorType.toComposeConfig() =
+    when (this) {
+        ColorType.N32 -> ImageBitmapConfig.Argb8888
+        ColorType.ALPHA_8 -> ImageBitmapConfig.Alpha8
+        ColorType.RGB_565 -> ImageBitmapConfig.Rgb565
+        ColorType.RGBA_F16 -> ImageBitmapConfig.F16
+        else -> ImageBitmapConfig.Argb8888
+    }
 
 private fun org.jetbrains.skia.ColorSpace?.toComposeColorSpace(): ColorSpace {
     return when (this) {
diff --git a/compose/ui/ui-graphics/src/skikoMain/kotlin/androidx/compose/ui/graphics/SkiaPathIterator.skiko.kt b/compose/ui/ui-graphics/src/skikoMain/kotlin/androidx/compose/ui/graphics/SkiaPathIterator.skiko.kt
index 9c3bfa0..77c1e49 100644
--- a/compose/ui/ui-graphics/src/skikoMain/kotlin/androidx/compose/ui/graphics/SkiaPathIterator.skiko.kt
+++ b/compose/ui/ui-graphics/src/skikoMain/kotlin/androidx/compose/ui/graphics/SkiaPathIterator.skiko.kt
@@ -144,48 +144,65 @@
         requireNotNull(segment)
 
         return when (segment.verb) {
-            PathVerb.MOVE -> PathSegment(
-                PathSegment.Type.Move,
-                floatArrayOf(segment.p0!!.x, segment.p0!!.y),
-                0.0f
-            )
-            PathVerb.LINE -> PathSegment(
-                PathSegment.Type.Line,
-                floatArrayOf(
-                    segment.p0!!.x, segment.p0!!.y,
-                    segment.p1!!.x, segment.p1!!.y,
-                ),
-                0.0f
-            )
-            PathVerb.QUAD -> PathSegment(
-                PathSegment.Type.Quadratic,
-                floatArrayOf(
-                    segment.p0!!.x, segment.p0!!.y,
-                    segment.p1!!.x, segment.p1!!.y,
-                    segment.p2!!.x, segment.p2!!.y,
-                ),
-                0.0f
-            )
+            PathVerb.MOVE ->
+                PathSegment(
+                    PathSegment.Type.Move,
+                    floatArrayOf(segment.p0!!.x, segment.p0!!.y),
+                    0.0f
+                )
+            PathVerb.LINE ->
+                PathSegment(
+                    PathSegment.Type.Line,
+                    floatArrayOf(
+                        segment.p0!!.x,
+                        segment.p0!!.y,
+                        segment.p1!!.x,
+                        segment.p1!!.y,
+                    ),
+                    0.0f
+                )
+            PathVerb.QUAD ->
+                PathSegment(
+                    PathSegment.Type.Quadratic,
+                    floatArrayOf(
+                        segment.p0!!.x,
+                        segment.p0!!.y,
+                        segment.p1!!.x,
+                        segment.p1!!.y,
+                        segment.p2!!.x,
+                        segment.p2!!.y,
+                    ),
+                    0.0f
+                )
             // TODO: convert conics to quadratics when conicEvaluation is set to AsQuadratics
-            PathVerb.CONIC -> PathSegment(
-                PathSegment.Type.Quadratic,
-                floatArrayOf(
-                    segment.p0!!.x, segment.p0!!.y,
-                    segment.p1!!.x, segment.p1!!.y,
-                    segment.p2!!.x, segment.p2!!.y,
-                ),
-                segment.conicWeight
-            )
-            PathVerb.CUBIC -> PathSegment(
-                PathSegment.Type.Cubic,
-                floatArrayOf(
-                    segment.p0!!.x, segment.p0!!.y,
-                    segment.p1!!.x, segment.p1!!.y,
-                    segment.p2!!.x, segment.p2!!.y,
-                    segment.p3!!.x, segment.p3!!.y
-                ),
-                0.0f
-            )
+            PathVerb.CONIC ->
+                PathSegment(
+                    PathSegment.Type.Quadratic,
+                    floatArrayOf(
+                        segment.p0!!.x,
+                        segment.p0!!.y,
+                        segment.p1!!.x,
+                        segment.p1!!.y,
+                        segment.p2!!.x,
+                        segment.p2!!.y,
+                    ),
+                    segment.conicWeight
+                )
+            PathVerb.CUBIC ->
+                PathSegment(
+                    PathSegment.Type.Cubic,
+                    floatArrayOf(
+                        segment.p0!!.x,
+                        segment.p0!!.y,
+                        segment.p1!!.x,
+                        segment.p1!!.y,
+                        segment.p2!!.x,
+                        segment.p2!!.y,
+                        segment.p3!!.x,
+                        segment.p3!!.y
+                    ),
+                    0.0f
+                )
             PathVerb.CLOSE -> CloseSegment
             PathVerb.DONE -> DoneSegment
         }
diff --git a/compose/ui/ui-graphics/src/skikoMain/kotlin/androidx/compose/ui/graphics/SkiaShader.skiko.kt b/compose/ui/ui-graphics/src/skikoMain/kotlin/androidx/compose/ui/graphics/SkiaShader.skiko.kt
index 7ba6809..4f44cc1 100644
--- a/compose/ui/ui-graphics/src/skikoMain/kotlin/androidx/compose/ui/graphics/SkiaShader.skiko.kt
+++ b/compose/ui/ui-graphics/src/skikoMain/kotlin/androidx/compose/ui/graphics/SkiaShader.skiko.kt
@@ -30,7 +30,12 @@
 ): Shader {
     validateColorStops(colors, colorStops)
     return Shader.makeLinearGradient(
-        from.x, from.y, to.x, to.y, colors.toIntArray(), colorStops?.toFloatArray(),
+        from.x,
+        from.y,
+        to.x,
+        to.y,
+        colors.toIntArray(),
+        colorStops?.toFloatArray(),
         GradientStyle(tileMode.toSkiaTileMode(), true, identityMatrix33())
     )
 }
@@ -72,27 +77,21 @@
     tileModeX: TileMode,
     tileModeY: TileMode
 ): Shader {
-    return image.asSkiaBitmap().makeShader(
-        tileModeX.toSkiaTileMode(),
-        tileModeY.toSkiaTileMode()
-    )
+    return image.asSkiaBitmap().makeShader(tileModeX.toSkiaTileMode(), tileModeY.toSkiaTileMode())
 }
 
-private fun List<Color>.toIntArray(): IntArray =
-    IntArray(size) { i -> this[i].toArgb() }
+private fun List<Color>.toIntArray(): IntArray = IntArray(size) { i -> this[i].toArgb() }
 
 private fun validateColorStops(colors: List<Color>, colorStops: List<Float>?) {
     if (colorStops == null) {
         if (colors.size < 2) {
             throw IllegalArgumentException(
-                "colors must have length of at least 2 if colorStops " +
-                    "is omitted."
+                "colors must have length of at least 2 if colorStops " + "is omitted."
             )
         }
     } else if (colors.size != colorStops.size) {
         throw IllegalArgumentException(
-            "colors and colorStops arguments must have" +
-                " equal length."
+            "colors and colorStops arguments must have" + " equal length."
         )
     }
 }
diff --git a/compose/ui/ui-graphics/src/skikoMain/kotlin/androidx/compose/ui/graphics/SkiaTileMode.skiko.kt b/compose/ui/ui-graphics/src/skikoMain/kotlin/androidx/compose/ui/graphics/SkiaTileMode.skiko.kt
index af07c79..8c272cc 100644
--- a/compose/ui/ui-graphics/src/skikoMain/kotlin/androidx/compose/ui/graphics/SkiaTileMode.skiko.kt
+++ b/compose/ui/ui-graphics/src/skikoMain/kotlin/androidx/compose/ui/graphics/SkiaTileMode.skiko.kt
@@ -20,10 +20,11 @@
 
 actual fun TileMode.isSupported(): Boolean = true
 
-internal fun TileMode.toSkiaTileMode(): FilterTileMode = when (this) {
-    TileMode.Clamp -> FilterTileMode.CLAMP
-    TileMode.Repeated -> FilterTileMode.REPEAT
-    TileMode.Mirror -> FilterTileMode.MIRROR
-    TileMode.Decal -> FilterTileMode.DECAL
-    else -> FilterTileMode.CLAMP
-}
+internal fun TileMode.toSkiaTileMode(): FilterTileMode =
+    when (this) {
+        TileMode.Clamp -> FilterTileMode.CLAMP
+        TileMode.Repeated -> FilterTileMode.REPEAT
+        TileMode.Mirror -> FilterTileMode.MIRROR
+        TileMode.Decal -> FilterTileMode.DECAL
+        else -> FilterTileMode.CLAMP
+    }
diff --git a/compose/ui/ui-graphics/src/skikoMain/kotlin/androidx/compose/ui/graphics/SkiaVertexMode.skiko.kt b/compose/ui/ui-graphics/src/skikoMain/kotlin/androidx/compose/ui/graphics/SkiaVertexMode.skiko.kt
index 55d4c50..1397ac2 100644
--- a/compose/ui/ui-graphics/src/skikoMain/kotlin/androidx/compose/ui/graphics/SkiaVertexMode.skiko.kt
+++ b/compose/ui/ui-graphics/src/skikoMain/kotlin/androidx/compose/ui/graphics/SkiaVertexMode.skiko.kt
@@ -18,9 +18,10 @@
 
 import org.jetbrains.skia.VertexMode as SkVertexMode
 
-internal fun VertexMode.toSkiaVertexMode(): SkVertexMode = when (this) {
-    VertexMode.Triangles -> SkVertexMode.TRIANGLES
-    VertexMode.TriangleStrip -> SkVertexMode.TRIANGLE_STRIP
-    VertexMode.TriangleFan -> SkVertexMode.TRIANGLE_FAN
-    else -> SkVertexMode.TRIANGLES
-}
+internal fun VertexMode.toSkiaVertexMode(): SkVertexMode =
+    when (this) {
+        VertexMode.Triangles -> SkVertexMode.TRIANGLES
+        VertexMode.TriangleStrip -> SkVertexMode.TRIANGLE_STRIP
+        VertexMode.TriangleFan -> SkVertexMode.TRIANGLE_FAN
+        else -> SkVertexMode.TRIANGLES
+    }
diff --git a/compose/ui/ui-inspection/src/androidTest/java/androidx/compose/ui/inspection/AndroidViewTest.kt b/compose/ui/ui-inspection/src/androidTest/java/androidx/compose/ui/inspection/AndroidViewTest.kt
index 282b65d..bba9a58 100644
--- a/compose/ui/ui-inspection/src/androidTest/java/androidx/compose/ui/inspection/AndroidViewTest.kt
+++ b/compose/ui/ui-inspection/src/androidTest/java/androidx/compose/ui/inspection/AndroidViewTest.kt
@@ -32,24 +32,26 @@
 
 @LargeTest
 class AndroidViewTest {
-    @get:Rule
-    val rule = ComposeInspectionRule(AndroidViewTestActivity::class)
+    @get:Rule val rule = ComposeInspectionRule(AndroidViewTestActivity::class)
 
     @Test
     fun androidView(): Unit = runBlocking {
-        val app = rule.inspectorTester.sendCommand(
-            GetComposablesCommand(rule.rootId, skipSystemComposables = false)
-        ).getComposablesResponse
+        val app =
+            rule.inspectorTester
+                .sendCommand(GetComposablesCommand(rule.rootId, skipSystemComposables = false))
+                .getComposablesResponse
         val strings = app.stringsList.toMap()
-        val composeNode = app.rootsList.flatMap { it.nodesList }.flatMap { it.flatten() }.filter {
-            it.viewId != 0L
-        }.single()
+        val composeNode =
+            app.rootsList
+                .flatMap { it.nodesList }
+                .flatMap { it.flatten() }
+                .filter { it.viewId != 0L }
+                .single()
         assertThat(strings[composeNode.name]).isEqualTo("ComposeNode")
         val androidViewsHandler = rule.rootsForTest.single().view.childAt(0)
         val viewFactoryHolder = androidViewsHandler.childAt(0)
         assertThat(composeNode.viewId).isEqualTo(viewFactoryHolder.uniqueDrawingId)
     }
 
-    private fun View.childAt(index: Int): View =
-        (this as ViewGroup).getChildAt(index)
+    private fun View.childAt(index: Int): View = (this as ViewGroup).getChildAt(index)
 }
diff --git a/compose/ui/ui-inspection/src/androidTest/java/androidx/compose/ui/inspection/ComposeViewTest.kt b/compose/ui/ui-inspection/src/androidTest/java/androidx/compose/ui/inspection/ComposeViewTest.kt
index e93096e..14c73c3 100644
--- a/compose/ui/ui-inspection/src/androidTest/java/androidx/compose/ui/inspection/ComposeViewTest.kt
+++ b/compose/ui/ui-inspection/src/androidTest/java/androidx/compose/ui/inspection/ComposeViewTest.kt
@@ -33,18 +33,18 @@
 
 @LargeTest
 class ComposeViewTest {
-    @get:Rule
-    val rule = ComposeInspectionRule(ComposeViewTestActivity::class)
+    @get:Rule val rule = ComposeInspectionRule(ComposeViewTestActivity::class)
 
     @Test
     fun composeView(): Unit = runBlocking {
-        rule.inspectorTester.sendCommand(
-            GetUpdateSettingsCommand(reduceChildNesting = true)
-        ).updateSettingsResponse
+        rule.inspectorTester
+            .sendCommand(GetUpdateSettingsCommand(reduceChildNesting = true))
+            .updateSettingsResponse
 
-        val response = rule.inspectorTester.sendCommand(
-            GetComposablesCommand(rule.rootId, skipSystemComposables = false)
-        ).getComposablesResponse
+        val response =
+            rule.inspectorTester
+                .sendCommand(GetComposablesCommand(rule.rootId, skipSystemComposables = false))
+                .getComposablesResponse
         val strings = response.stringsList.toMap()
         val roots = response.rootsList
         assertThat(roots).hasSize(3)
@@ -74,13 +74,16 @@
 
     private val ComposableNode.textParameter: String?
         get() = runBlocking {
-            val params = rule.inspectorTester.sendCommand(
-                GetParametersByIdCommand(
-                    rule.rootId,
-                    skipSystemComposables = false,
-                    composableId = id
-                )
-            ).getParametersResponse
+            val params =
+                rule.inspectorTester
+                    .sendCommand(
+                        GetParametersByIdCommand(
+                            rule.rootId,
+                            skipSystemComposables = false,
+                            composableId = id
+                        )
+                    )
+                    .getParametersResponse
             val strings = params.stringsList.toMap()
             val param = params.parameterGroup.parameterList.single { strings[it.name] == "text" }
             strings[param.int32Value]
diff --git a/compose/ui/ui-inspection/src/androidTest/java/androidx/compose/ui/inspection/DialogTest.kt b/compose/ui/ui-inspection/src/androidTest/java/androidx/compose/ui/inspection/DialogTest.kt
index ac3bfe0..704a838 100644
--- a/compose/ui/ui-inspection/src/androidTest/java/androidx/compose/ui/inspection/DialogTest.kt
+++ b/compose/ui/ui-inspection/src/androidTest/java/androidx/compose/ui/inspection/DialogTest.kt
@@ -43,8 +43,7 @@
 class DialogTest {
     private val rule = createAndroidComposeRule<DialogTestActivity>()
 
-    @get:Rule
-    val chain = RuleChain.outerRule(JvmtiRule()).around(rule)!!
+    @get:Rule val chain = RuleChain.outerRule(JvmtiRule()).around(rule)!!
 
     private lateinit var inspectorTester: InspectorTester
 
@@ -62,18 +61,16 @@
 
     @Test
     fun dialogLocation(): Unit = runBlocking {
-        inspectorTester.sendCommand(
-            GetUpdateSettingsCommand()
-        ).updateSettingsResponse
+        inspectorTester.sendCommand(GetUpdateSettingsCommand()).updateSettingsResponse
 
         val roots = WindowInspector.getGlobalWindowViews()
         assertThat(roots).hasSize(2)
         val appViewId = roots.first().uniqueDrawingId
         val dialogViewId = roots.last().uniqueDrawingId
-        val app = inspectorTester.sendCommand(GetComposablesCommand(appViewId))
-            .getComposablesResponse
-        val dialog = inspectorTester.sendCommand(GetComposablesCommand(dialogViewId))
-            .getComposablesResponse
+        val app =
+            inspectorTester.sendCommand(GetComposablesCommand(appViewId)).getComposablesResponse
+        val dialog =
+            inspectorTester.sendCommand(GetComposablesCommand(dialogViewId)).getComposablesResponse
         val appRoots = app.roots()
         val dialogRoots = dialog.roots()
         val dialogViewRoot = roots.last()
@@ -96,18 +93,18 @@
         return rootsList.flatMap { it.nodesList.convert(strings) }
     }
 
-    private fun List<ComposableNode>.convert(strings: Map<Int, String>): List<InspectorNode> =
-        map {
-            val node = MutableInspectorNode()
-            node.name = strings[it.name] ?: ""
-            node.box = IntRect(
+    private fun List<ComposableNode>.convert(strings: Map<Int, String>): List<InspectorNode> = map {
+        val node = MutableInspectorNode()
+        node.name = strings[it.name] ?: ""
+        node.box =
+            IntRect(
                 it.bounds.layout.x,
                 it.bounds.layout.y,
                 it.bounds.layout.x + it.bounds.layout.w,
                 it.bounds.layout.y + it.bounds.layout.h
             )
-            node.children.addAll(it.childrenList.convert(strings))
-            node.inlined = (it.flags and ComposableNode.Flags.INLINED_VALUE) != 0
-            node.build()
-        }
+        node.children.addAll(it.childrenList.convert(strings))
+        node.inlined = (it.flags and ComposableNode.Flags.INLINED_VALUE) != 0
+        node.build()
+    }
 }
diff --git a/compose/ui/ui-inspection/src/androidTest/java/androidx/compose/ui/inspection/LambdaLocationTest.kt b/compose/ui/ui-inspection/src/androidTest/java/androidx/compose/ui/inspection/LambdaLocationTest.kt
index cd23a61..2e9a404 100644
--- a/compose/ui/ui-inspection/src/androidTest/java/androidx/compose/ui/inspection/LambdaLocationTest.kt
+++ b/compose/ui/ui-inspection/src/androidTest/java/androidx/compose/ui/inspection/LambdaLocationTest.kt
@@ -29,8 +29,7 @@
 @RunWith(AndroidJUnit4::class)
 class LambdaLocationTest {
 
-    @get:Rule
-    val rule = JvmtiRule()
+    @get:Rule val rule = JvmtiRule()
 
     @Test
     fun test() {
@@ -41,8 +40,8 @@
         assertThat(LambdaLocation.resolve(TestLambdas.inlined))
             .isEqualTo(LambdaLocation("TestLambdas.kt", 29, 30))
         assertThat(LambdaLocation.resolve(TestLambdas.inlinedParameter))
-            .isEqualTo(LambdaLocation("TestLambdas.kt", 33, 33))
+            .isEqualTo(LambdaLocation("TestLambdas.kt", 32, 32))
         assertThat(LambdaLocation.resolve(TestLambdas.unnamed))
-            .isEqualTo(LambdaLocation("TestLambdas.kt", 35, 35))
+            .isEqualTo(LambdaLocation("TestLambdas.kt", 33, 33))
     }
 }
diff --git a/compose/ui/ui-inspection/src/androidTest/java/androidx/compose/ui/inspection/ParametersTest.kt b/compose/ui/ui-inspection/src/androidTest/java/androidx/compose/ui/inspection/ParametersTest.kt
index 2e9c992..6ffb760 100644
--- a/compose/ui/ui-inspection/src/androidTest/java/androidx/compose/ui/inspection/ParametersTest.kt
+++ b/compose/ui/ui-inspection/src/androidTest/java/androidx/compose/ui/inspection/ParametersTest.kt
@@ -40,18 +40,20 @@
 
 @LargeTest
 class ParametersTest {
-    @get:Rule
-    val rule = ComposeInspectionRule(ParametersTestActivity::class)
+    @get:Rule val rule = ComposeInspectionRule(ParametersTestActivity::class)
 
     @Test
     fun resource(): Unit = runBlocking {
-        val composables = rule.inspectorTester.sendCommand(GetComposablesCommand(rule.rootId))
-            .getComposablesResponse
+        val composables =
+            rule.inspectorTester
+                .sendCommand(GetComposablesCommand(rule.rootId))
+                .getComposablesResponse
 
         val text = composables.filter("Text").first()
-        val params = rule.inspectorTester
-            .sendCommand(GetParametersByIdCommand(rule.rootId, text.id))
-            .getParametersResponse
+        val params =
+            rule.inspectorTester
+                .sendCommand(GetParametersByIdCommand(rule.rootId, text.id))
+                .getParametersResponse
 
         val resourceValue = params.find("fontFamily").resourceValue
         assertThat(resourceValue.type.resolve(params)).isEqualTo("font")
@@ -62,56 +64,66 @@
 
     @Test
     fun lambda(): Unit = runBlocking {
-        val composables = rule.inspectorTester.sendCommand(GetComposablesCommand(rule.rootId))
-            .getComposablesResponse
+        val composables =
+            rule.inspectorTester
+                .sendCommand(GetComposablesCommand(rule.rootId))
+                .getComposablesResponse
 
         val buttons = composables.filter("Button")
         val buttonId = buttons.first().id
-        val params = rule.inspectorTester
-            .sendCommand(GetParametersByIdCommand(rule.rootId, buttonId))
-            .getParametersResponse
+        val params =
+            rule.inspectorTester
+                .sendCommand(GetParametersByIdCommand(rule.rootId, buttonId))
+                .getParametersResponse
 
         val lambdaValue = params.find("onClick").lambdaValue
         assertThat(lambdaValue.fileName.resolve(params)).isEqualTo("ParametersTestActivity.kt")
-        assertThat(lambdaValue.startLineNumber).isEqualTo(53)
-        assertThat(lambdaValue.endLineNumber).isEqualTo(53)
+        assertThat(lambdaValue.startLineNumber).isEqualTo(46)
+        assertThat(lambdaValue.endLineNumber).isEqualTo(46)
         assertThat(lambdaValue.packageName.resolve(params))
             .isEqualTo("androidx.compose.ui.inspection.testdata")
     }
 
     @Test
     fun contentLambda(): Unit = runBlocking {
-        val composables = rule.inspectorTester.sendCommand(GetComposablesCommand(rule.rootId))
-            .getComposablesResponse
+        val composables =
+            rule.inspectorTester
+                .sendCommand(GetComposablesCommand(rule.rootId))
+                .getComposablesResponse
 
         val buttons = composables.filter("SomeContent")
         val someId = buttons.single().id
-        val params = rule.inspectorTester.sendCommand(GetParametersByIdCommand(rule.rootId, someId))
-            .getParametersResponse
+        val params =
+            rule.inspectorTester
+                .sendCommand(GetParametersByIdCommand(rule.rootId, someId))
+                .getParametersResponse
 
         val lambdaValue = params.find("content").lambdaValue
         assertThat(lambdaValue.fileName.resolve(params)).isEqualTo("ParametersTestActivity.kt")
-        assertThat(lambdaValue.startLineNumber).isEqualTo(62)
-        assertThat(lambdaValue.endLineNumber).isEqualTo(65)
+        assertThat(lambdaValue.startLineNumber).isEqualTo(50)
+        assertThat(lambdaValue.endLineNumber).isEqualTo(50)
         assertThat(lambdaValue.packageName.resolve(params))
             .isEqualTo("androidx.compose.ui.inspection.testdata")
     }
 
     @Test
     fun functionType(): Unit = runBlocking {
-        val composables = rule.inspectorTester.sendCommand(GetComposablesCommand(rule.rootId))
-            .getComposablesResponse
+        val composables =
+            rule.inspectorTester
+                .sendCommand(GetComposablesCommand(rule.rootId))
+                .getComposablesResponse
 
         val buttons = composables.filter("Button")
         val buttonId = buttons.last().id
-        val params = rule.inspectorTester
-            .sendCommand(GetParametersByIdCommand(rule.rootId, buttonId))
-            .getParametersResponse
+        val params =
+            rule.inspectorTester
+                .sendCommand(GetParametersByIdCommand(rule.rootId, buttonId))
+                .getParametersResponse
 
         val lambdaValue = params.find("onClick").lambdaValue
         assertThat(lambdaValue.fileName.resolve(params)).isEqualTo("ParametersTestActivity.kt")
-        assertThat(lambdaValue.startLineNumber).isEqualTo(56)
-        assertThat(lambdaValue.endLineNumber).isEqualTo(56)
+        assertThat(lambdaValue.startLineNumber).isEqualTo(47)
+        assertThat(lambdaValue.endLineNumber).isEqualTo(47)
         assertThat(lambdaValue.functionName.resolve(params)).isEqualTo("testClickHandler")
         assertThat(lambdaValue.packageName.resolve(params))
             .isEqualTo("androidx.compose.ui.inspection.testdata")
@@ -120,8 +132,7 @@
     @Test
     fun testIntArrayWithoutDelayedExtraction() = intArray(useDelayedParameterExtraction = false)
 
-    @Test
-    fun testIntArrayWithDelayedExtraction() = intArray(useDelayedParameterExtraction = true)
+    @Test fun testIntArrayWithDelayedExtraction() = intArray(useDelayedParameterExtraction = true)
 
     private fun intArray(useDelayedParameterExtraction: Boolean): Unit = runBlocking {
         setUpDelayedExtraction(useDelayedParameterExtraction)
@@ -130,9 +141,10 @@
         val nodes = tester.sendCommand(GetComposablesCommand(rule.rootId)).getComposablesResponse
 
         val function = nodes.filter("FunctionWithIntArray").single()
-        val paramResponse = tester.sendCommand(
-            GetParametersCommand(rule.rootId, function, useDelayedParameterExtraction)
-        )
+        val paramResponse =
+            tester.sendCommand(
+                GetParametersCommand(rule.rootId, function, useDelayedParameterExtraction)
+            )
         val params = paramResponse.getParametersResponse
 
         val intArray = params.find("intArray")
@@ -155,14 +167,16 @@
         }
 
         val expanded =
-            tester.sendCommand(
-                GetParameterDetailsCommand(
-                    rule.rootId,
-                    reference.build(),
-                    startIndex = 5,
-                    maxElements = 5
+            tester
+                .sendCommand(
+                    GetParameterDetailsCommand(
+                        rule.rootId,
+                        reference.build(),
+                        startIndex = 5,
+                        maxElements = 5
+                    )
                 )
-            ).getParameterDetailsResponse
+                .getParameterDetailsResponse
         val intArray2 = expanded.parameter
         strings = expanded.stringsList
         checkStringParam(strings, intArray2, "intArray", "IntArray[8]", 0)
@@ -183,14 +197,19 @@
     private fun unmergedSemantics(useDelayedParameterExtraction: Boolean): Unit = runBlocking {
         setUpDelayedExtraction(useDelayedParameterExtraction)
 
-        val composables = rule.inspectorTester.sendCommand(GetComposablesCommand(rule.rootId))
-            .getComposablesResponse
+        val composables =
+            rule.inspectorTester
+                .sendCommand(GetComposablesCommand(rule.rootId))
+                .getComposablesResponse
 
         val texts = composables.filter("Text")
         val textOne = texts.first()
-        val params = rule.inspectorTester.sendCommand(
-            GetParametersCommand(rule.rootId, textOne, useDelayedParameterExtraction)
-        ).getParametersResponse
+        val params =
+            rule.inspectorTester
+                .sendCommand(
+                    GetParametersCommand(rule.rootId, textOne, useDelayedParameterExtraction)
+                )
+                .getParametersResponse
 
         val text = params.findUnmerged("Text")
         assertThat(text.type).isEqualTo(Parameter.Type.ITERABLE)
@@ -213,13 +232,18 @@
     private fun mergedSemantics(useDelayedParameterExtraction: Boolean): Unit = runBlocking {
         setUpDelayedExtraction(useDelayedParameterExtraction)
 
-        val composables = rule.inspectorTester.sendCommand(GetComposablesCommand(rule.rootId))
-            .getComposablesResponse
+        val composables =
+            rule.inspectorTester
+                .sendCommand(GetComposablesCommand(rule.rootId))
+                .getComposablesResponse
 
         val textFirst = composables.filter("Column").first()
-        val params = rule.inspectorTester.sendCommand(
-            GetParametersCommand(rule.rootId, textFirst, useDelayedParameterExtraction)
-        ).getParametersResponse
+        val params =
+            rule.inspectorTester
+                .sendCommand(
+                    GetParametersCommand(rule.rootId, textFirst, useDelayedParameterExtraction)
+                )
+                .getParametersResponse
 
         val text = params.findMerged("Text")
         val strings = params.stringsList
@@ -236,9 +260,10 @@
         assertThat(text.elementsList.size).isEqualTo(3)
 
         val row = composables.filter("Row").single()
-        val params2 = rule.inspectorTester.sendCommand(
-            GetParametersCommand(rule.rootId, row, useDelayedParameterExtraction)
-        ).getParametersResponse
+        val params2 =
+            rule.inspectorTester
+                .sendCommand(GetParametersCommand(rule.rootId, row, useDelayedParameterExtraction))
+                .getParametersResponse
 
         val texts2 = params2.findMerged("Text")
         val strings2 = params2.stringsList
@@ -253,14 +278,16 @@
 
         val reference = texts2.reference.toBuilder()
         val expanded =
-            rule.inspectorTester.sendCommand(
-                GetParameterDetailsCommand(
-                    rule.rootId,
-                    reference.build(),
-                    startIndex = 5,
-                    maxElements = 5
+            rule.inspectorTester
+                .sendCommand(
+                    GetParameterDetailsCommand(
+                        rule.rootId,
+                        reference.build(),
+                        startIndex = 5,
+                        maxElements = 5
+                    )
                 )
-            ).getParameterDetailsResponse
+                .getParameterDetailsResponse
         val texts3 = expanded.parameter
         val strings3 = expanded.stringsList
         checkStringParam(strings3, texts3, "Text", "List[8]", 0)
@@ -274,16 +301,19 @@
     fun delayedExtraction(): Unit = runBlocking {
         setUpDelayedExtraction(true)
 
-        val composables = rule.inspectorTester.sendCommand(GetComposablesCommand(rule.rootId))
-            .getComposablesResponse
+        val composables =
+            rule.inspectorTester
+                .sendCommand(GetComposablesCommand(rule.rootId))
+                .getComposablesResponse
         var strings = composables.stringsList.toMap()
         var column = composables.filter("Column").first()
         var text = column.childrenList.single { strings[it.name] == "Text" }
 
         // Lookup by anchor will find the parameters
-        var paramsByAnchor = rule.inspectorTester.sendCommand(
-            GetParametersByAnchorIdCommand(rule.rootId, text.anchorHash, text.id)
-        ).getParametersResponse
+        var paramsByAnchor =
+            rule.inspectorTester
+                .sendCommand(GetParametersByAnchorIdCommand(rule.rootId, text.anchorHash, text.id))
+                .getParametersResponse
         strings = paramsByAnchor.stringsList.toMap()
         assertThat(paramsByAnchor.parameterGroup.parameterList).isNotEmpty()
         var textValue = paramsByAnchor.find("text")
@@ -291,25 +321,28 @@
 
         // Lookup parameters without anchor should fallback to the older approach and return
         // the same parameters:
-        var paramsById = rule.inspectorTester.sendCommand(
-            GetParametersByIdCommand(rule.rootId, text.id)
-        ).getParametersResponse
+        var paramsById =
+            rule.inspectorTester
+                .sendCommand(GetParametersByIdCommand(rule.rootId, text.id))
+                .getParametersResponse
         // We are using delayed parameter extractions so the cache does not have parameters
         // (The code should look for an anchor but the anchor is not specified.)
         assertThat(paramsById.parameterGroup.parameterList).isNotEmpty()
         textValue = paramsById.find("text")
         assertThat(strings[textValue.int32Value]).isEqualTo("four")
 
-        val snapshot = rule.inspectorTester.sendCommand(
-            GetComposablesCommand(rule.rootId, extractAllParameters = true)
-        ).getComposablesResponse
+        val snapshot =
+            rule.inspectorTester
+                .sendCommand(GetComposablesCommand(rule.rootId, extractAllParameters = true))
+                .getComposablesResponse
         strings = snapshot.stringsList.toMap()
         column = snapshot.filter("Column").first()
         text = column.childrenList.single { strings[it.name] == "Text" }
 
-        paramsById = rule.inspectorTester.sendCommand(
-            GetParametersByIdCommand(rule.rootId, text.id)
-        ).getParametersResponse
+        paramsById =
+            rule.inspectorTester
+                .sendCommand(GetParametersByIdCommand(rule.rootId, text.id))
+                .getParametersResponse
         // Even when using delayed parameter extractions, use the cache if it contains all params:
         strings = paramsById.stringsList.toMap()
         assertThat(paramsById.parameterGroup.parameterList).isNotEmpty()
@@ -318,17 +351,19 @@
 
         // Looking up by anchor should find the parameters
         // (The code should use the cached values.)
-        paramsByAnchor = rule.inspectorTester.sendCommand(
-            GetParametersByAnchorIdCommand(rule.rootId, text.anchorHash, text.id)
-        ).getParametersResponse
+        paramsByAnchor =
+            rule.inspectorTester
+                .sendCommand(GetParametersByAnchorIdCommand(rule.rootId, text.anchorHash, text.id))
+                .getParametersResponse
         assertThat(paramsByAnchor.parameterGroup.parameterList).isNotEmpty()
     }
 
     private suspend fun setUpDelayedExtraction(useDelayedParameterExtraction: Boolean) {
         if (useDelayedParameterExtraction) {
-            val updated = rule.inspectorTester.sendCommand(
-                GetUpdateSettingsCommand(delayParameterExtractions = true)
-            ).updateSettingsResponse
+            val updated =
+                rule.inspectorTester
+                    .sendCommand(GetUpdateSettingsCommand(delayParameterExtractions = true))
+                    .updateSettingsResponse
             assertThat(updated.canDelayParameterExtractions).isTrue()
         }
     }
@@ -361,9 +396,10 @@
 
 private fun GetComposablesResponse.filter(name: String): List<ComposableNode> {
     val strings = stringsList.toMap()
-    return rootsList.flatMap { it.nodesList }.flatMap { it.flatten() }.filter {
-        strings[it.name] == name
-    }
+    return rootsList
+        .flatMap { it.nodesList }
+        .flatMap { it.flatten() }
+        .filter { strings[it.name] == name }
 }
 
 @Suppress("SameParameterValue")
diff --git a/compose/ui/ui-inspection/src/androidTest/java/androidx/compose/ui/inspection/PreviewActivityTest.kt b/compose/ui/ui-inspection/src/androidTest/java/androidx/compose/ui/inspection/PreviewActivityTest.kt
index 0d53bfd..330ec14 100644
--- a/compose/ui/ui-inspection/src/androidTest/java/androidx/compose/ui/inspection/PreviewActivityTest.kt
+++ b/compose/ui/ui-inspection/src/androidTest/java/androidx/compose/ui/inspection/PreviewActivityTest.kt
@@ -43,18 +43,16 @@
 /**
  * Test composable from a Preview.
  *
- * A [PreviewActivity] loads the composable content via reflection.
- * Make sure that the top composable correspond to a CallGroup with an anchor,
- * such that the Layout Inspector can identify the composable by its id after
- * a recomposition.
+ * A [PreviewActivity] loads the composable content via reflection. Make sure that the top
+ * composable correspond to a CallGroup with an anchor, such that the Layout Inspector can identify
+ * the composable by its id after a recomposition.
  */
 class PreviewActivityTest {
 
     @Suppress("DEPRECATION")
     private val activityTestRule = androidx.test.rule.ActivityTestRule(PreviewActivity::class.java)
 
-    @get:Rule
-    val chain = RuleChain.outerRule(activityTestRule).around(JvmtiRule())!!
+    @get:Rule val chain = RuleChain.outerRule(activityTestRule).around(JvmtiRule())!!
 
     private lateinit var inspectorTester: InspectorTester
 
@@ -78,31 +76,29 @@
 
     @Ignore("b/295186037")
     @Test
-    fun testPreviewTopComposableHasAnAchor(): Unit = runBlocking() {
-        inspectorTester.sendCommand(
-            GetUpdateSettingsCommand()
-        ).updateSettingsResponse
+    fun testPreviewTopComposableHasAnAchor(): Unit =
+        runBlocking() {
+            inspectorTester.sendCommand(GetUpdateSettingsCommand()).updateSettingsResponse
 
-        val mainContent: View =
-            activityTestRule.activity.findViewById<ViewGroup>(android.R.id.content)
-        val root = mainContent.ancestors().lastOrNull()
-        val rootId = root!!.uniqueDrawingId
-        val composables = inspectorTester.sendCommand(
-            GetComposablesCommand(rootId, skipSystemComposables = false)
-        ).getComposablesResponse
+            val mainContent: View =
+                activityTestRule.activity.findViewById<ViewGroup>(android.R.id.content)
+            val root = mainContent.ancestors().lastOrNull()
+            val rootId = root!!.uniqueDrawingId
+            val composables =
+                inspectorTester
+                    .sendCommand(GetComposablesCommand(rootId, skipSystemComposables = false))
+                    .getComposablesResponse
 
-        assertThat(composables.rootsList).hasSize(1)
-        val strings = composables.stringsList.toMap()
-        val node = composables.rootsList.single().nodesList.first()
-        assertThat(strings[node.name]).isEqualTo("MainBlock")
-        assertThat(node.id).isLessThan(RESERVED_FOR_GENERATED_IDS)
-    }
+            assertThat(composables.rootsList).hasSize(1)
+            val strings = composables.stringsList.toMap()
+            val node = composables.rootsList.single().nodesList.first()
+            assertThat(strings[node.name]).isEqualTo("MainBlock")
+            assertThat(node.id).isLessThan(RESERVED_FOR_GENERATED_IDS)
+        }
 }
 
 @Suppress("unused")
 @Composable
 fun MainBlock() {
-    Button(onClick = {}) {
-        Text("Hello")
-    }
+    Button(onClick = {}) { Text("Hello") }
 }
diff --git a/compose/ui/ui-inspection/src/androidTest/java/androidx/compose/ui/inspection/RecompositionTest.kt b/compose/ui/ui-inspection/src/androidTest/java/androidx/compose/ui/inspection/RecompositionTest.kt
index b9d0d03..bf6de3b 100644
--- a/compose/ui/ui-inspection/src/androidTest/java/androidx/compose/ui/inspection/RecompositionTest.kt
+++ b/compose/ui/ui-inspection/src/androidTest/java/androidx/compose/ui/inspection/RecompositionTest.kt
@@ -46,8 +46,7 @@
 class RecompositionTest {
     private val rule = createAndroidComposeRule<RecompositionTestActivity>()
 
-    @get:Rule
-    val chain = RuleChain.outerRule(JvmtiRule()).around(rule)!!
+    @get:Rule val chain = RuleChain.outerRule(JvmtiRule()).around(rule)!!
 
     private lateinit var inspectorTester: InspectorTester
 
@@ -65,9 +64,9 @@
 
     @Test
     fun recomposing(): Unit = runBlocking {
-        inspectorTester.sendCommand(
-            GetUpdateSettingsCommand(includeRecomposeCounts = true)
-        ).updateSettingsResponse
+        inspectorTester
+            .sendCommand(GetUpdateSettingsCommand(includeRecomposeCounts = true))
+            .updateSettingsResponse
 
         rule.onNodeWithText("Click row 1").performClick()
         rule.onNodeWithText("Click row 1").performClick()
@@ -77,13 +76,15 @@
 
         val rootId =
             WindowInspector.getGlobalWindowViews().map { it.uniqueDrawingId }.single().toLong()
-        var composables = inspectorTester.sendCommand(
-            GetComposablesCommand(rootId, skipSystemComposables = false)
-        ).getComposablesResponse
+        var composables =
+            inspectorTester
+                .sendCommand(GetComposablesCommand(rootId, skipSystemComposables = false))
+                .getComposablesResponse
 
-        val parameters = inspectorTester.sendCommand(
-            GetAllParametersCommand(rootId, skipSystemComposables = false)
-        ).getAllParametersResponse
+        val parameters =
+            inspectorTester
+                .sendCommand(GetAllParametersCommand(rootId, skipSystemComposables = false))
+                .getAllParametersResponse
 
         if (composables.rootsList.single().nodesList.isEmpty()) {
             error("No nodes returned. Check that the compose inspector was successfully enabled.")
@@ -98,17 +99,20 @@
         assertThat(nodes.text2.recomposeCount).isEqualTo(1)
 
         // Stop counting but keep the current counts:
-        inspectorTester.sendCommand(
-            GetUpdateSettingsCommand(includeRecomposeCounts = false, keepRecomposeCounts = true)
-        ).updateSettingsResponse
+        inspectorTester
+            .sendCommand(
+                GetUpdateSettingsCommand(includeRecomposeCounts = false, keepRecomposeCounts = true)
+            )
+            .updateSettingsResponse
 
         rule.onNodeWithText("Click row 1").performClick()
         rule.onNodeWithText("Click row 2").performClick()
         rule.waitForIdle()
 
-        composables = inspectorTester.sendCommand(
-            GetComposablesCommand(rootId, skipSystemComposables = false)
-        ).getComposablesResponse
+        composables =
+            inspectorTester
+                .sendCommand(GetComposablesCommand(rootId, skipSystemComposables = false))
+                .getComposablesResponse
         nodes = Nodes(composables, parameters)
 
         assertThat(nodes.button1.recomposeCount).isEqualTo(6)
@@ -117,17 +121,20 @@
         assertThat(nodes.text2.recomposeCount).isEqualTo(1)
 
         // Continue counting:
-        inspectorTester.sendCommand(
-            GetUpdateSettingsCommand(includeRecomposeCounts = true, keepRecomposeCounts = true)
-        ).updateSettingsResponse
+        inspectorTester
+            .sendCommand(
+                GetUpdateSettingsCommand(includeRecomposeCounts = true, keepRecomposeCounts = true)
+            )
+            .updateSettingsResponse
 
         rule.onNodeWithText("Click row 1").performClick()
         rule.onNodeWithText("Click row 2").performClick()
         rule.waitForIdle()
 
-        composables = inspectorTester.sendCommand(
-            GetComposablesCommand(rootId, skipSystemComposables = false)
-        ).getComposablesResponse
+        composables =
+            inspectorTester
+                .sendCommand(GetComposablesCommand(rootId, skipSystemComposables = false))
+                .getComposablesResponse
         nodes = Nodes(composables, parameters)
 
         // Buttons have double recompose counts, as they are
@@ -138,17 +145,20 @@
         assertThat(nodes.text2.recomposeCount).isEqualTo(2)
 
         // Continue counting but reset the counts:
-        inspectorTester.sendCommand(
-            GetUpdateSettingsCommand(includeRecomposeCounts = true, keepRecomposeCounts = false)
-        ).updateSettingsResponse
+        inspectorTester
+            .sendCommand(
+                GetUpdateSettingsCommand(includeRecomposeCounts = true, keepRecomposeCounts = false)
+            )
+            .updateSettingsResponse
 
         rule.onNodeWithText("Click row 1").performClick()
         rule.onNodeWithText("Click row 2").performClick()
         rule.waitForIdle()
 
-        composables = inspectorTester.sendCommand(
-            GetComposablesCommand(rootId, skipSystemComposables = false)
-        ).getComposablesResponse
+        composables =
+            inspectorTester
+                .sendCommand(GetComposablesCommand(rootId, skipSystemComposables = false))
+                .getComposablesResponse
         nodes = Nodes(composables, parameters)
 
         // Buttons have double recompose counts, as they are
@@ -174,7 +184,9 @@
             predicate: (String) -> Boolean
         ): ComposableNode {
             val strings = composables.stringsList.toMap()
-            return composables.rootsList.single().nodesList
+            return composables.rootsList
+                .single()
+                .nodesList
                 .flatMap { it.flatten() }
                 .single { strings[it.name] == name && hasText(it, parameters, predicate) }
         }
@@ -186,11 +198,13 @@
         ): Boolean {
             val strings = parameters.stringsList.toMap()
             val group = parameters.parameterGroupsList.single { it.composableId == node.id }
-            if (group.parameterList.any {
+            if (
+                group.parameterList.any {
                     strings[it.name] == "text" &&
                         it.type == Parameter.Type.STRING &&
                         predicate(strings[it.int32Value]!!)
-                }) {
+                }
+            ) {
                 return true
             }
             return node.childrenList.any { hasText(it, parameters, predicate) }
diff --git a/compose/ui/ui-inspection/src/androidTest/java/androidx/compose/ui/inspection/RippleTest.kt b/compose/ui/ui-inspection/src/androidTest/java/androidx/compose/ui/inspection/RippleTest.kt
index 34efc1c..74aa3b9 100644
--- a/compose/ui/ui-inspection/src/androidTest/java/androidx/compose/ui/inspection/RippleTest.kt
+++ b/compose/ui/ui-inspection/src/androidTest/java/androidx/compose/ui/inspection/RippleTest.kt
@@ -31,17 +31,20 @@
 
 @LargeTest
 class RippleTest {
-    @get:Rule
-    val rule = ComposeInspectionRule(RippleTestActivity::class)
+    @get:Rule val rule = ComposeInspectionRule(RippleTestActivity::class)
 
     @Test
     fun rippleViewsAreMarked(): Unit = runBlocking {
-        val app = rule.inspectorTester.sendCommand(GetComposablesCommand(rule.rootId))
-            .getComposablesResponse
-        val composeViewChildren = ThreadUtils.runOnMainThread {
-            val composeView = rule.rootsForTest.single() as ViewGroup
-            composeView.getChildren().map { it.uniqueDrawingId }
-        }.get()
+        val app =
+            rule.inspectorTester
+                .sendCommand(GetComposablesCommand(rule.rootId))
+                .getComposablesResponse
+        val composeViewChildren =
+            ThreadUtils.runOnMainThread {
+                    val composeView = rule.rootsForTest.single() as ViewGroup
+                    composeView.getChildren().map { it.uniqueDrawingId }
+                }
+                .get()
         val toSkip = app.rootsList.single().viewsToSkipList
         assertThat(composeViewChildren).containsExactlyElementsIn(toSkip)
         assertThat(toSkip).hasSize(1)
diff --git a/compose/ui/ui-inspection/src/androidTest/java/androidx/compose/ui/inspection/UnknownResponseTest.kt b/compose/ui/ui-inspection/src/androidTest/java/androidx/compose/ui/inspection/UnknownResponseTest.kt
index d4df199..b8a4bd87 100644
--- a/compose/ui/ui-inspection/src/androidTest/java/androidx/compose/ui/inspection/UnknownResponseTest.kt
+++ b/compose/ui/ui-inspection/src/androidTest/java/androidx/compose/ui/inspection/UnknownResponseTest.kt
@@ -28,8 +28,7 @@
 
 @LargeTest
 class UnknownResponseTest {
-    @get:Rule
-    val rule = ComposeInspectionRule(TestActivity::class)
+    @get:Rule val rule = ComposeInspectionRule(TestActivity::class)
 
     @Test
     fun invalidBytesReturnedAsUnknownResponse(): Unit = runBlocking {
diff --git a/compose/ui/ui-inspection/src/androidTest/java/androidx/compose/ui/inspection/inspector/InlineClassConverterTest.kt b/compose/ui/ui-inspection/src/androidTest/java/androidx/compose/ui/inspection/inspector/InlineClassConverterTest.kt
index d7eba8b..cabb695 100644
--- a/compose/ui/ui-inspection/src/androidTest/java/androidx/compose/ui/inspection/inspector/InlineClassConverterTest.kt
+++ b/compose/ui/ui-inspection/src/androidTest/java/androidx/compose/ui/inspection/inspector/InlineClassConverterTest.kt
@@ -38,16 +38,11 @@
 @RunWith(AndroidJUnit4::class)
 @OptIn(UiToolingDataApi::class)
 class InlineClassConverterTest {
-    @get:Rule
-    val rule = ComposeInspectionRule(TestActivity::class, false)
+    @get:Rule val rule = ComposeInspectionRule(TestActivity::class, false)
 
     @Test
     fun parameterValueTest() {
-        rule.show {
-            Surface {
-                Text(text = "OK", fontSize = 12.sp)
-            }
-        }
+        rule.show { Surface { Text(text = "OK", fontSize = 12.sp) } }
 
         val tree = rule.compositionData.asTree()
         val groups = flatten(tree)
@@ -72,7 +67,5 @@
         sequenceOf(group).plus(group.children.asSequence().flatMap { flatten(it) })
 
     private fun find(groups: Sequence<Group>, calleeName: String) =
-        groups.first {
-            it.parameters.isNotEmpty() && it.name == calleeName
-        }
+        groups.first { it.parameters.isNotEmpty() && it.name == calleeName }
 }
diff --git a/compose/ui/ui-inspection/src/androidTest/java/androidx/compose/ui/inspection/inspector/LayoutInspectorTreeTest.kt b/compose/ui/ui-inspection/src/androidTest/java/androidx/compose/ui/inspection/inspector/LayoutInspectorTreeTest.kt
index 02021e6..5b2bda1 100644
--- a/compose/ui/ui-inspection/src/androidTest/java/androidx/compose/ui/inspection/inspector/LayoutInspectorTreeTest.kt
+++ b/compose/ui/ui-inspection/src/androidTest/java/androidx/compose/ui/inspection/inspector/LayoutInspectorTreeTest.kt
@@ -120,17 +120,13 @@
 class LayoutInspectorTreeTest {
     private lateinit var density: Density
 
-    @get:Rule
-    val composeTestRule = createAndroidComposeRule<TestActivity>()
+    @get:Rule val composeTestRule = createAndroidComposeRule<TestActivity>()
 
-    private val fontFamily = Font(androidx.testutils.fonts.R.font.sample_font)
-        .toFontFamily()
+    private val fontFamily = Font(androidx.testutils.fonts.R.font.sample_font).toFontFamily()
 
     @Before
     fun before() {
-        composeTestRule.activityRule.scenario.onActivity {
-            density = Density(it)
-        }
+        composeTestRule.activityRule.scenario.onActivity { density = Density(it) }
         isDebugInspectorInfoEnabled = true
     }
 
@@ -138,8 +134,7 @@
         return findAllAndroidComposeViews().single()
     }
 
-    private fun findAllAndroidComposeViews(): List<View> =
-        findAllViews("AndroidComposeView")
+    private fun findAllAndroidComposeViews(): List<View> = findAllViews("AndroidComposeView")
 
     private fun findAllViews(className: String): List<View> {
         val views = mutableListOf<View>()
@@ -218,7 +213,10 @@
             node(
                 name = "Column",
                 fileName = "LayoutInspectorTreeTest.kt",
-                left = 0.0.dp, top = 0.0.dp, width = 100.dp, height = 82.dp,
+                left = 0.0.dp,
+                top = 0.0.dp,
+                width = 100.dp,
+                height = 82.dp,
                 children = listOf("Text", "Icon", "Surface"),
                 inlined = true,
             )
@@ -226,33 +224,48 @@
                 name = "Text",
                 isRenderNode = true,
                 fileName = "LayoutInspectorTreeTest.kt",
-                left = 0.dp, top = 0.0.dp, width = 100.dp, height = 10.dp,
+                left = 0.dp,
+                top = 0.0.dp,
+                width = 100.dp,
+                height = 10.dp,
             )
             node(
                 name = "Icon",
                 isRenderNode = true,
                 fileName = "LayoutInspectorTreeTest.kt",
-                left = 0.dp, top = 10.dp, width = 24.dp, height = 24.dp,
+                left = 0.dp,
+                top = 10.dp,
+                width = 24.dp,
+                height = 24.dp,
             )
             node(
                 name = "Surface",
                 fileName = "LayoutInspectorTreeTest.kt",
                 isRenderNode = true,
-                left = 0.dp, top = 34.dp, width = 64.dp, height = 48.dp,
+                left = 0.dp,
+                top = 34.dp,
+                width = 64.dp,
+                height = 48.dp,
                 children = listOf("Button")
             )
             node(
                 name = "Button",
                 fileName = "LayoutInspectorTreeTest.kt",
                 isRenderNode = true,
-                left = 0.dp, top = 40.dp, width = 64.dp, height = 36.dp,
+                left = 0.dp,
+                top = 40.dp,
+                width = 64.dp,
+                height = 36.dp,
                 children = listOf("Text")
             )
             node(
                 name = "Text",
                 isRenderNode = true,
                 fileName = "LayoutInspectorTreeTest.kt",
-                left = 21.dp, top = 53.dp, width = 23.dp, height = 10.dp,
+                left = 21.dp,
+                top = 53.dp,
+                width = 23.dp,
+                height = 10.dp,
             )
         }
     }
@@ -288,7 +301,10 @@
                 name = "Column",
                 hasTransformations = false,
                 fileName = "LayoutInspectorTreeTest.kt",
-                left = 0.dp, top = 0.dp, width = 100.dp, height = 10.dp,
+                left = 0.dp,
+                top = 0.dp,
+                width = 100.dp,
+                height = 10.dp,
                 children = listOf("Text"),
                 inlined = true,
             )
@@ -297,7 +313,10 @@
                 isRenderNode = true,
                 hasTransformations = true,
                 fileName = "LayoutInspectorTreeTest.kt",
-                left = 45.dp, top = 55.dp, width = 100.dp, height = 10.dp,
+                left = 45.dp,
+                top = 55.dp,
+                width = 100.dp,
+                height = 10.dp,
             )
         }
     }
@@ -409,9 +428,7 @@
         val view = findAndroidComposeView()
         view.setTag(R.id.inspection_slot_table_set, slotTableRecord.store)
         val builder = LayoutInspectorTree()
-        val node = builder.convert(view)
-            .flatMap { flatten(it) }
-            .firstOrNull { it.name == "Spacer" }
+        val node = builder.convert(view).flatMap { flatten(it) }.firstOrNull { it.name == "Spacer" }
 
         // Spacer should show up in the Compose tree:
         assertThat(node).isNotNull()
@@ -436,18 +453,22 @@
         view.setTag(R.id.inspection_slot_table_set, slotTableRecord.store)
         val builder = LayoutInspectorTree()
         builder.includeAllParameters = false
-        val node = builder.convert(view)
-            .flatMap { flatten(it) }
-            .firstOrNull { it.name == "BasicText" }
+        val node =
+            builder.convert(view).flatMap { flatten(it) }.firstOrNull { it.name == "BasicText" }
 
         assertThat(node).isNotNull()
         assertThat(node?.parameters).isEmpty()
 
         // Get parameters for the Spacer after getting the tree without parameters:
         val paramsNode = builder.findParameters(view, node!!.anchorId)!!
-        val params = builder.convertParameters(
-            ROOT_ID, paramsNode, ParameterKind.Normal, MAX_RECURSIONS, MAX_ITERABLE_SIZE
-        )
+        val params =
+            builder.convertParameters(
+                ROOT_ID,
+                paramsNode,
+                ParameterKind.Normal,
+                MAX_RECURSIONS,
+                MAX_ITERABLE_SIZE
+            )
         assertThat(params).isNotEmpty()
         val text = params.find { it.name == "text" }
         assertThat(text?.value).isEqualTo("Some text")
@@ -457,18 +478,12 @@
     fun testTextId() {
         val slotTableRecord = CompositionDataRecord.create()
 
-        show {
-            Inspectable(slotTableRecord) {
-                Text(text = "Hello World")
-            }
-        }
+        show { Inspectable(slotTableRecord) { Text(text = "Hello World") } }
 
         val view = findAndroidComposeView()
         view.setTag(R.id.inspection_slot_table_set, slotTableRecord.store)
         val builder = LayoutInspectorTree()
-        val node = builder.convert(view)
-            .flatMap { flatten(it) }
-            .firstOrNull { it.name == "Text" }
+        val node = builder.convert(view).flatMap { flatten(it) }.firstOrNull { it.name == "Text" }
 
         // LayoutNode id should be captured by the Text node:
         assertThat(node?.id).isGreaterThan(0)
@@ -536,11 +551,7 @@
                     Text("Hello World!")
                     AlertDialog(
                         onDismissRequest = {},
-                        confirmButton = {
-                            Button({}) {
-                                Text("This is the Confirm Button")
-                            }
-                        }
+                        confirmButton = { Button({}) { Text("This is the Confirm Button") } }
                     )
                 }
             }
@@ -606,9 +617,7 @@
             Inspectable(slotTableRecord) {
                 Column(modifier = Modifier.fillMaxSize()) {
                     Text("Compose Text")
-                    Popup(alignment = Alignment.Center) {
-                        Text("This is a popup")
-                    }
+                    Popup(alignment = Alignment.Center) { Text("This is a popup") }
                 }
             }
         }
@@ -644,11 +653,7 @@
 
         // Verify that the Popup is captured with content
         validate(popupNodes, builder) {
-            node(
-                name = "Popup",
-                fileName = "LayoutInspectorTreeTest.kt",
-                children = listOf("Text")
-            )
+            node(name = "Popup", fileName = "LayoutInspectorTreeTest.kt", children = listOf("Text"))
             node(
                 name = "Text",
                 isRenderNode = true,
@@ -665,11 +670,7 @@
             Inspectable(slotTableRecord) {
                 Column {
                     Text("Compose Text")
-                    AndroidView({ context ->
-                        TextView(context).apply {
-                            text = "AndroidView"
-                        }
-                    })
+                    AndroidView({ context -> TextView(context).apply { text = "AndroidView" } })
                 }
             }
         }
@@ -711,11 +712,7 @@
                 Column {
                     Text("Compose Text")
                     AndroidView(
-                        factory = { context ->
-                            TextView(context).apply {
-                                text = "AndroidView"
-                            }
-                        },
+                        factory = { context -> TextView(context).apply { text = "AndroidView" } },
                         onReset = {
                             // Do nothing, just use the overload.
                         }
@@ -755,17 +752,9 @@
             Inspectable(slotTableRecord) {
                 Column {
                     Text("Compose Text1")
-                    AndroidView({ context ->
-                        TextView(context).apply {
-                            text = "first"
-                        }
-                    })
+                    AndroidView({ context -> TextView(context).apply { text = "first" } })
                     Text("Compose Text2")
-                    AndroidView({ context ->
-                        TextView(context).apply {
-                            text = "second"
-                        }
-                    })
+                    AndroidView({ context -> TextView(context).apply { text = "second" } })
                 }
             }
         }
@@ -777,12 +766,8 @@
         dumpSlotTableSet(slotTableRecord)
         dumpNodes(nodes, composeView, builder)
         val textViews = findAllViews("TextView")
-        val firstTextView = textViews
-            .filterIsInstance<TextView>()
-            .first { it.text == "first" }
-        val secondTextView = textViews
-            .filterIsInstance<TextView>()
-            .first { it.text == "second" }
+        val firstTextView = textViews.filterIsInstance<TextView>().first { it.text == "first" }
+        val secondTextView = textViews.filterIsInstance<TextView>().first { it.text == "second" }
         val composeNodes = nodes.flatMap { it.flatten() }.filter { it.name == "ComposeNode" }
         assertThat(composeNodes[0].viewId).isEqualTo(viewParent(secondTextView)?.uniqueDrawingId)
         assertThat(composeNodes[1].viewId).isEqualTo(viewParent(firstTextView)?.uniqueDrawingId)
@@ -798,10 +783,10 @@
         val offset = maxOffset.coerceAtLeast(minOffset)
         Column(
             verticalArrangement = Arrangement.Bottom,
-            modifier = Modifier
-                .heightIn(min = 128.dp)
-                .graphicsLayer { translationY = offset }
-                .background(color = MaterialTheme.colors.background)
+            modifier =
+                Modifier.heightIn(min = 128.dp)
+                    .graphicsLayer { translationY = offset }
+                    .background(color = MaterialTheme.colors.background)
         ) {
             Spacer(Modifier.height(16.dp))
             Text(
@@ -827,6 +812,7 @@
             Spacer(Modifier.height(8.dp))
         }
     }
+
     // WARNING: End formatted section
 
     @Test
@@ -835,13 +821,7 @@
         val testLine = Throwable().stackTrace[0].lineNumber
         val slotTableRecord = CompositionDataRecord.create()
 
-        show {
-            Inspectable(slotTableRecord) {
-                Column {
-                    Title()
-                }
-            }
-        }
+        show { Inspectable(slotTableRecord) { Column { Title() } } }
         // WARNING: End formatted section
 
         val androidComposeView = findAndroidComposeView()
@@ -851,8 +831,8 @@
         dumpNodes(nodes, androidComposeView, builder)
 
         validate(nodes, builder, checkLineNumbers = true, checkRenderNodes = false) {
-            node("Column", lineNumber = testLine + 5, children = listOf("Title"), inlined = true)
-            node("Title", lineNumber = testLine + 6, children = listOf("Column"))
+            node("Column", lineNumber = testLine + 3, children = listOf("Title"), inlined = true)
+            node("Title", lineNumber = testLine + 3, children = listOf("Column"))
             node(
                 name = "Column",
                 lineNumber = titleLine + 4,
@@ -888,9 +868,7 @@
             Inspectable(slotTableRecord) {
                 Column {
                     var showFirst by remember { mutableStateOf(true) }
-                    Button(onClick = { showFirst = !showFirst }) {
-                        Text("Button")
-                    }
+                    Button(onClick = { showFirst = !showFirst }) { Text("Button") }
                     Crossfade(showFirst) {
                         when (it) {
                             true -> First(p1 = 1)
@@ -940,19 +918,17 @@
     fun testInlineParameterTypes() {
         val slotTableRecord = CompositionDataRecord.create()
 
-        show {
-            Inspectable(slotTableRecord) {
-                InlineParameters(20.5.dp, 30.sp)
-            }
-        }
+        show { Inspectable(slotTableRecord) { InlineParameters(20.5.dp, 30.sp) } }
         val androidComposeView = findAndroidComposeView()
         androidComposeView.setTag(R.id.inspection_slot_table_set, slotTableRecord.store)
         val builder = LayoutInspectorTree()
         builder.hideSystemNodes = false
         builder.includeAllParameters = true
-        val inlineParameters = builder.convert(androidComposeView)
-            .flatMap { flatten(it) }
-            .first { it.name == "InlineParameters" }
+        val inlineParameters =
+            builder
+                .convert(androidComposeView)
+                .flatMap { flatten(it) }
+                .first { it.name == "InlineParameters" }
         assertThat(inlineParameters.parameters[0].name).isEqualTo("size")
         assertThat(inlineParameters.parameters[0].value?.javaClass).isEqualTo(Dp::class.java)
         assertThat(inlineParameters.parameters[1].name).isEqualTo("fontSize")
@@ -990,9 +966,7 @@
         show {
             Inspectable(slotTableRecord) {
                 LazyColumn(modifier = Modifier.testTag("LazyColumn")) {
-                    items(100) { index ->
-                        Text(text = "Item: $index")
-                    }
+                    items(100) { index -> Text(text = "Item: $index") }
                 }
             }
         }
@@ -1002,15 +976,11 @@
         val builder = LayoutInspectorTree()
         builder.hideSystemNodes = false
         builder.includeAllParameters = true
-        ThreadUtils.runOnMainThread {
-            builder.convert(androidComposeView)
-        }
+        ThreadUtils.runOnMainThread { builder.convert(androidComposeView) }
         for (index in 20..40) {
             composeTestRule.onNodeWithTag("LazyColumn").performScrollToIndex(index)
         }
-        ThreadUtils.runOnMainThread {
-            builder.convert(androidComposeView)
-        }
+        ThreadUtils.runOnMainThread { builder.convert(androidComposeView) }
     }
 
     @Test
@@ -1019,11 +989,7 @@
 
         show {
             Inspectable(slotTableRecord) {
-                Scaffold {
-                    Column {
-                        LinearProgressIndicator(progress = 0.3F)
-                    }
-                }
+                Scaffold { Column { LinearProgressIndicator(progress = 0.3F) } }
             }
         }
         val androidComposeView = findAndroidComposeView()
@@ -1031,9 +997,11 @@
         val builder = LayoutInspectorTree()
         builder.hideSystemNodes = false
         builder.includeAllParameters = true
-        val linearProgressIndicator = builder.convert(androidComposeView)
-            .flatMap { flatten(it) }
-            .firstOrNull { it.name == "LinearProgressIndicator" }
+        val linearProgressIndicator =
+            builder
+                .convert(androidComposeView)
+                .flatMap { flatten(it) }
+                .firstOrNull { it.name == "LinearProgressIndicator" }
         assertThat(linearProgressIndicator).isNotNull()
     }
 
@@ -1052,15 +1020,16 @@
             return
         }
         val nodes = result.flatMap { flatten(it) }.listIterator()
-        val tree = TreeValidationReceiver(
-            nodes,
-            density,
-            checkParameters,
-            checkSemantics,
-            checkLineNumbers,
-            checkRenderNodes,
-            builder
-        )
+        val tree =
+            TreeValidationReceiver(
+                nodes,
+                density,
+                checkParameters,
+                checkSemantics,
+                checkLineNumbers,
+                checkRenderNodes,
+                builder
+            )
         tree.block()
     }
 
@@ -1095,8 +1064,10 @@
             assertThat(node.name).isEqualTo(name)
             assertThat(node.anchorId).isNotEqualTo(UNDEFINED_ID)
             val message = "Node: $name"
-            assertWithMessage(message).that(node.children.map { it.name })
-                .containsExactlyElementsIn(children).inOrder()
+            assertWithMessage(message)
+                .that(node.children.map { it.name })
+                .containsExactlyElementsIn(children)
+                .inOrder()
             fileName?.let { assertWithMessage(message).that(node.fileName).isEqualTo(fileName) }
             if (lineNumber != -1) {
                 assertWithMessage(message).that(node.lineNumber).isEqualTo(lineNumber)
@@ -1122,14 +1093,22 @@
             }
             if (left != Dp.Unspecified) {
                 with(density) {
-                    assertWithMessage(message).that(node.left.toDp().value)
-                        .isWithin(2.0f).of(left.value)
-                    assertWithMessage(message).that(node.top.toDp().value)
-                        .isWithin(2.0f).of(top.value)
-                    assertWithMessage(message).that(node.width.toDp().value)
-                        .isWithin(2.0f).of(width.value)
-                    assertWithMessage(message).that(node.height.toDp().value)
-                        .isWithin(2.0f).of(height.value)
+                    assertWithMessage(message)
+                        .that(node.left.toDp().value)
+                        .isWithin(2.0f)
+                        .of(left.value)
+                    assertWithMessage(message)
+                        .that(node.top.toDp().value)
+                        .isWithin(2.0f)
+                        .of(top.value)
+                    assertWithMessage(message)
+                        .that(node.width.toDp().value)
+                        .isWithin(2.0f)
+                        .of(width.value)
+                    assertWithMessage(message)
+                        .that(node.height.toDp().value)
+                        .isWithin(2.0f)
+                        .of(height.value)
                 }
             }
 
@@ -1137,7 +1116,8 @@
                 val merged = node.mergedSemantics.singleOrNull { it.name == "Text" }?.value
                 assertWithMessage(message).that(merged?.toString() ?: "").isEqualTo(mergedSemantics)
                 val unmerged = node.unmergedSemantics.singleOrNull { it.name == "Text" }?.value
-                assertWithMessage(message).that(unmerged?.toString() ?: "")
+                assertWithMessage(message)
+                    .that(unmerged?.toString() ?: "")
                     .isEqualTo(unmergedSemantics)
             }
 
@@ -1146,9 +1126,14 @@
             }
 
             if (checkParameters) {
-                val params = builder.convertParameters(
-                    ROOT_ID, node, ParameterKind.Normal, MAX_RECURSIONS, MAX_ITERABLE_SIZE
-                )
+                val params =
+                    builder.convertParameters(
+                        ROOT_ID,
+                        node,
+                        ParameterKind.Normal,
+                        MAX_RECURSIONS,
+                        MAX_ITERABLE_SIZE
+                    )
                 val receiver = ParameterValidationReceiver(params.listIterator())
                 receiver.block()
                 receiver.checkFinished(name)
@@ -1174,11 +1159,9 @@
     private fun flatten(node: InspectorNode): List<InspectorNode> =
         listOf(node).plus(node.children.flatMap { flatten(it) })
 
-    private fun viewParent(view: View): View? =
-        view.parent as? View
+    private fun viewParent(view: View): View? = view.parent as? View
 
-    private fun show(composable: @Composable () -> Unit) =
-        composeTestRule.setContent(composable)
+    private fun show(composable: @Composable () -> Unit) = composeTestRule.setContent(composable)
 
     // region DEBUG print methods
     private fun dumpNodes(nodes: List<InspectorNode>, view: View, builder: LayoutInspectorTree) {
@@ -1221,7 +1204,8 @@
                       name = "${node.name}",
                       fileName = "${node.fileName}",
                       left = $left, top = $top, width = $width, height = $height
-                """.trimIndent()
+                """
+                    .trimIndent()
             )
         }
         if (node.id > 0L) {
@@ -1238,7 +1222,11 @@
         if (generateParameters && node.parameters.isNotEmpty()) {
             generateParameters(
                 builder.convertParameters(
-                    ROOT_ID, node, ParameterKind.Normal, MAX_RECURSIONS, MAX_ITERABLE_SIZE
+                    ROOT_ID,
+                    node,
+                    ParameterKind.Normal,
+                    MAX_RECURSIONS,
+                    MAX_ITERABLE_SIZE
                 ),
                 0
             )
@@ -1289,8 +1277,10 @@
         val location = group.location
         val position = group.position?.let { "\"$it\"" } ?: "null"
         val box = group.box
-        val id = group.modifierInfo.mapNotNull { (it.extra as? GraphicLayerInfo)?.layerId }
-            .singleOrNull() ?: 0
+        val id =
+            group.modifierInfo
+                .mapNotNull { (it.extra as? GraphicLayerInfo)?.layerId }
+                .singleOrNull() ?: 0
         println(
             "\"${"  ".repeat(indent)}\", ${group.javaClass.simpleName}, \"${group.name}\", " +
                 "file: ${location?.sourceFile}  hash: ${location?.packageHash}, " +
@@ -1306,12 +1296,10 @@
 
     private fun round(dp: Dp): Dp = Dp((dp.value * 10.0f).roundToInt() / 10.0f)
 
-    //endregion
+    // endregion
 }
 
-/**
- * Storage for the preview generated [CompositionData]s.
- */
+/** Storage for the preview generated [CompositionData]s. */
 internal interface CompositionDataRecord {
     val store: Set<CompositionData>
 
@@ -1322,8 +1310,7 @@
 
 private class CompositionDataRecordImpl : CompositionDataRecord {
     @OptIn(InternalComposeApi::class)
-    override val store: MutableSet<CompositionData> =
-        Collections.newSetFromMap(WeakHashMap())
+    override val store: MutableSet<CompositionData> = Collections.newSetFromMap(WeakHashMap())
 }
 
 /**
@@ -1331,7 +1318,7 @@
  * is in inspection mode.
  *
  * @param compositionDataRecord [CompositionDataRecord] to record the SlotTable used in the
- * composition of [content]
+ *   composition of [content]
  */
 @Composable
 @OptIn(InternalComposeApi::class)
diff --git a/compose/ui/ui-inspection/src/androidTest/java/androidx/compose/ui/inspection/inspector/ParameterFactoryTest.kt b/compose/ui/ui-inspection/src/androidTest/java/androidx/compose/ui/inspection/inspector/ParameterFactoryTest.kt
index d3375b6..9c54fbb 100644
--- a/compose/ui/ui-inspection/src/androidTest/java/androidx/compose/ui/inspection/inspector/ParameterFactoryTest.kt
+++ b/compose/ui/ui-inspection/src/androidTest/java/androidx/compose/ui/inspection/inspector/ParameterFactoryTest.kt
@@ -98,9 +98,7 @@
 private const val MAX_RECURSIONS = 2
 private const val MAX_ITERABLE_SIZE = 5
 
-@Suppress("unused")
-private fun topLevelFunction() {
-}
+@Suppress("unused") private fun topLevelFunction() {}
 
 @MediumTest
 @RunWith(AndroidJUnit4::class)
@@ -120,10 +118,8 @@
 
     @Test
     fun testAbsoluteAlignment() {
-        assertThat(lookup(AbsoluteAlignment.TopLeft))
-            .isEqualTo(ParameterType.String to "TopLeft")
-        assertThat(lookup(AbsoluteAlignment.TopRight))
-            .isEqualTo(ParameterType.String to "TopRight")
+        assertThat(lookup(AbsoluteAlignment.TopLeft)).isEqualTo(ParameterType.String to "TopLeft")
+        assertThat(lookup(AbsoluteAlignment.TopRight)).isEqualTo(ParameterType.String to "TopRight")
         assertThat(lookup(AbsoluteAlignment.CenterLeft))
             .isEqualTo(ParameterType.String to "CenterLeft")
         assertThat(lookup(AbsoluteAlignment.CenterRight))
@@ -132,10 +128,8 @@
             .isEqualTo(ParameterType.String to "BottomLeft")
         assertThat(lookup(AbsoluteAlignment.BottomRight))
             .isEqualTo(ParameterType.String to "BottomRight")
-        assertThat(lookup(AbsoluteAlignment.Left))
-            .isEqualTo(ParameterType.String to "Left")
-        assertThat(lookup(AbsoluteAlignment.Right))
-            .isEqualTo(ParameterType.String to "Right")
+        assertThat(lookup(AbsoluteAlignment.Left)).isEqualTo(ParameterType.String to "Left")
+        assertThat(lookup(AbsoluteAlignment.Right)).isEqualTo(ParameterType.String to "Right")
     }
 
     @Test
@@ -263,15 +257,13 @@
     fun testComposableLambda() = runBlocking {
         // capture here to force the lambda to not be created as a singleton.
         val capture = "Hello World"
-        @Suppress("COMPOSABLE_INVOCATION")
-        val c: @Composable () -> Unit = { Text(text = capture) }
+        @Suppress("COMPOSABLE_INVOCATION") val c: @Composable () -> Unit = { Text(text = capture) }
         val result = lookup(c as Any)
         val array = result.second as Array<*>
         assertThat(result.first).isEqualTo(ParameterType.Lambda)
         assertThat(array).hasLength(1)
-        assertThat(array[0]?.javaClass?.name).isEqualTo(
-            "${ParameterFactoryTest::class.java.name}\$testComposableLambda\$1\$c\$1"
-        )
+        assertThat(array[0]?.javaClass?.name)
+            .isEqualTo("${ParameterFactoryTest::class.java.name}\$testComposableLambda\$1\$c\$1")
     }
 
     @Test
@@ -347,14 +339,15 @@
 
     @Test
     fun testFontListFontFamily() {
-        val family = FontFamily(
-            listOf(
-                Font(1234, FontWeight.Normal, FontStyle.Italic),
-                Font(1235, FontWeight.Normal, FontStyle.Normal),
-                Font(1236, FontWeight.Bold, FontStyle.Italic),
-                Font(1237, FontWeight.Bold, FontStyle.Normal)
+        val family =
+            FontFamily(
+                listOf(
+                    Font(1234, FontWeight.Normal, FontStyle.Italic),
+                    Font(1235, FontWeight.Normal, FontStyle.Normal),
+                    Font(1236, FontWeight.Bold, FontStyle.Italic),
+                    Font(1237, FontWeight.Bold, FontStyle.Normal)
+                )
             )
-        )
         assertThat(lookup(family)).isEqualTo(ParameterType.Resource to 1235)
     }
 
@@ -397,11 +390,7 @@
     @Test
     fun testPaddingValues() {
         validate(create("padding", PaddingValues(2.0.dp, 0.5.dp, 2.5.dp, 0.7.dp))) {
-            parameter(
-                "padding",
-                ParameterType.String,
-                "PaddingValuesImpl"
-            ) {
+            parameter("padding", ParameterType.String, "PaddingValuesImpl") {
                 parameter("bottom", ParameterType.DimensionDp, 0.7f)
                 parameter("end", ParameterType.DimensionDp, 2.5f)
                 parameter("start", ParameterType.DimensionDp, 2.0f)
@@ -464,10 +453,11 @@
 
     @Test
     fun testMapEntry() {
-        val entry = object : Map.Entry<String, String> {
-            override val key = "Hello"
-            override val value = "World"
-        }
+        val entry =
+            object : Map.Entry<String, String> {
+                override val key = "Hello"
+                override val value = "World"
+            }
         validate(create("myEntry", entry)) {
             parameter("myEntry", ParameterType.String, "World") {
                 parameter("key", ParameterType.String, "Hello")
@@ -559,28 +549,29 @@
 
     @Test
     fun testListWithNullElement() {
-        val value = listOf(
-            "a",
-            null,
-            "b",
-            "c",
-            null,
-            null,
-            null,
-            null,
-            "d",
-            null,
-            "e",
-            null,
-            null,
-            null,
-            null,
-            null,
-            "f",
-            null,
-            "g",
-            null
-        )
+        val value =
+            listOf(
+                "a",
+                null,
+                "b",
+                "c",
+                null,
+                null,
+                null,
+                null,
+                "d",
+                null,
+                "e",
+                null,
+                null,
+                null,
+                null,
+                null,
+                "f",
+                null,
+                "g",
+                null
+            )
         val parameter = create("array", value)
         val refToSelf = ref()
         val display = "List[20]"
@@ -612,8 +603,7 @@
         validate(
             create(
                 "modifier",
-                Modifier
-                    .background(Color.Blue)
+                Modifier.background(Color.Blue)
                     .border(width = 5.dp, color = Color.Red)
                     .padding(2.0.dp)
                     .fillMaxWidth()
@@ -682,12 +672,7 @@
         validate(
             create(
                 "modifier",
-                Modifier.graphicsLayer(
-                    scaleX = 2f,
-                    scaleY = 1.5f,
-                    alpha = 0.5f,
-                    clip = true
-                )
+                Modifier.graphicsLayer(scaleX = 2f, scaleY = 1.5f, alpha = 0.5f, clip = true)
             )
         ) {
             parameter("modifier", ParameterType.String, "") {
@@ -718,14 +703,15 @@
     @Test
     fun testWrappedModifier() {
         @Suppress("DEPRECATION")
-        fun Modifier.frame(color: Color) = inspectable(
-            debugInspectorInfo {
-                name = "frame"
-                value = color
+        fun Modifier.frame(color: Color) =
+            inspectable(
+                debugInspectorInfo {
+                    name = "frame"
+                    value = color
+                }
+            ) {
+                background(color).border(width = 5.dp, color = color)
             }
-        ) {
-            background(color).border(width = 5.dp, color = color)
-        }
         validate(create("modifier", Modifier.width(40.dp).frame(Color.Green).height(50.dp))) {
             parameter("modifier", ParameterType.String, "") {
                 parameter("width", ParameterType.DimensionDp, 40.0f)
@@ -851,8 +837,7 @@
         runBlocking {
             assertThat(lookup(java.net.URL("http://domain.com")))
                 .isEqualTo(ParameterType.String to "")
-            assertThat(lookup(android.app.Notification()))
-                .isEqualTo(ParameterType.String to "")
+            assertThat(lookup(android.app.Notification())).isEqualTo(ParameterType.String to "")
         }
     }
 
@@ -893,8 +878,7 @@
         assertThat(lookup(TextDecoration.None)).isEqualTo(ParameterType.String to "None")
         assertThat(lookup(TextDecoration.LineThrough))
             .isEqualTo(ParameterType.String to "LineThrough")
-        assertThat(lookup(TextDecoration.Underline))
-            .isEqualTo(ParameterType.String to "Underline")
+        assertThat(lookup(TextDecoration.Underline)).isEqualTo(ParameterType.String to "Underline")
         assertThat(lookup(TextDecoration.LineThrough + TextDecoration.Underline))
             .isEqualTo(ParameterType.String to "LineThrough+Underline")
     }
@@ -903,7 +887,8 @@
     fun testTextGeometricTransform() {
         validate(create("transform", TextGeometricTransform(2.0f, 1.5f))) {
             parameter(
-                "transform", ParameterType.String,
+                "transform",
+                ParameterType.String,
                 TextGeometricTransform::class.java.simpleName
             ) {
                 parameter("scaleX", ParameterType.Float, 2.0f)
@@ -926,11 +911,12 @@
 
     @Test
     fun testTextStyle() {
-        val style = TextStyle(
-            color = Color.Red,
-            textDecoration = TextDecoration.Underline,
-            textDirection = TextDirection.Content
-        )
+        val style =
+            TextStyle(
+                color = Color.Red,
+                textDecoration = TextDecoration.Underline,
+                textDirection = TextDirection.Content
+            )
         validate(create("style", style)) {
             parameter("style", ParameterType.String, TextStyle::class.java.simpleName) {
                 parameter("color", ParameterType.Color, Color.Red.toArgb())
@@ -969,17 +955,18 @@
         maxRecursions: Int = MAX_RECURSIONS,
         maxInitialIterableSize: Int = MAX_ITERABLE_SIZE
     ): NodeParameter {
-        val parameter = factory.create(
-            ROOT_ID,
-            NODE_ID,
-            ANCHOR_HASH,
-            name,
-            value,
-            ParameterKind.Normal,
-            PARAM_INDEX,
-            maxRecursions,
-            maxInitialIterableSize
-        )
+        val parameter =
+            factory.create(
+                ROOT_ID,
+                NODE_ID,
+                ANCHOR_HASH,
+                name,
+                value,
+                ParameterKind.Normal,
+                PARAM_INDEX,
+                maxRecursions,
+                maxInitialIterableSize
+            )
 
         // Check that factory.expand will return the exact same information as factory.create
         // for each parameter and parameter child. Punt if there are references.
@@ -1025,7 +1012,11 @@
 
     private fun ref(vararg reference: Int): NodeParameterReference =
         NodeParameterReference(
-            NODE_ID, ANCHOR_HASH, ParameterKind.Normal, PARAM_INDEX, intListOf(*reference)
+            NODE_ID,
+            ANCHOR_HASH,
+            ParameterKind.Normal,
+            PARAM_INDEX,
+            intListOf(*reference)
         )
 
     private fun validate(
@@ -1048,13 +1039,14 @@
         factory.clearReferenceCache()
         val reference =
             NodeParameterReference(NODE_ID, ANCHOR_HASH, ParameterKind.Normal, PARAM_INDEX, indices)
-        val expanded = expand(
-            name,
-            value,
-            reference,
-            maxRecursions = maxRecursions,
-            maxInitialIterableSize = maxInitialIterableSize
-        )
+        val expanded =
+            expand(
+                name,
+                value,
+                reference,
+                maxRecursions = maxRecursions,
+                maxInitialIterableSize = maxInitialIterableSize
+            )
         if (parameter.value == null && indices.isNotEmpty()) {
             assertThat(expanded).isNull()
         } else {
@@ -1079,10 +1071,7 @@
     }
 }
 
-private class TestPainter(
-    val width: Float,
-    val height: Float
-) : Painter() {
+private class TestPainter(val width: Float, val height: Float) : Painter() {
 
     var color = Color.Red
 
@@ -1150,6 +1139,7 @@
     var third: MyClass? = null
 
     override fun hashCode(): Int = name.hashCode()
+
     override fun equals(other: Any?): Boolean = name == (other as? MyClass)?.name
 }
 
diff --git a/compose/ui/ui-inspection/src/androidTest/java/androidx/compose/ui/inspection/inspector/SynthesizedLambdaNameTest.kt b/compose/ui/ui-inspection/src/androidTest/java/androidx/compose/ui/inspection/inspector/SynthesizedLambdaNameTest.kt
index c7acb19..d398f3b 100644
--- a/compose/ui/ui-inspection/src/androidTest/java/androidx/compose/ui/inspection/inspector/SynthesizedLambdaNameTest.kt
+++ b/compose/ui/ui-inspection/src/androidTest/java/androidx/compose/ui/inspection/inspector/SynthesizedLambdaNameTest.kt
@@ -24,14 +24,15 @@
 private val topLambda3 = withArguments({}, {})
 
 private fun withArgument(a: (Int) -> Unit = {}): (Int) -> Unit = a
+
 private fun withArguments(a1: () -> Unit = {}, a2: () -> Unit = {}): List<() -> Unit> =
     listOf(a1, a2)
 
 /**
  * Test the compiler generated lambda names.
  *
- * There is code in Studio that relies on this format.
- * If this test should start to fail, please check the LambdaResolver in the Layout Inspector.
+ * There is code in Studio that relies on this format. If this test should start to fail, please
+ * check the LambdaResolver in the Layout Inspector.
  */
 @Suppress("JoinDeclarationAndAssignment")
 class SynthesizedLambdaNameTest {
diff --git a/compose/ui/ui-inspection/src/androidTest/java/androidx/compose/ui/inspection/proto/ComposeExtensionsTest.kt b/compose/ui/ui-inspection/src/androidTest/java/androidx/compose/ui/inspection/proto/ComposeExtensionsTest.kt
index c7fb0d1..cebfdec 100644
--- a/compose/ui/ui-inspection/src/androidTest/java/androidx/compose/ui/inspection/proto/ComposeExtensionsTest.kt
+++ b/compose/ui/ui-inspection/src/androidTest/java/androidx/compose/ui/inspection/proto/ComposeExtensionsTest.kt
@@ -24,7 +24,6 @@
     fun testLambdaSelector() {
         assertThat(findLambdaSelector("com.example.Compose\$MainActivityKt\$lambda-10\$1\$2\$2\$1"))
             .isEqualTo("lambda-10\$1\$2\$2\$1")
-        assertThat(findLambdaSelector("com.example.Class\$f1\$3\$2"))
-            .isEqualTo("3$2")
+        assertThat(findLambdaSelector("com.example.Class\$f1\$3\$2")).isEqualTo("3$2")
     }
 }
diff --git a/compose/ui/ui-inspection/src/androidTest/java/androidx/compose/ui/inspection/rules/ComposeInspectionRule.kt b/compose/ui/ui-inspection/src/androidTest/java/androidx/compose/ui/inspection/rules/ComposeInspectionRule.kt
index 83372bf..4f0b82f 100644
--- a/compose/ui/ui-inspection/src/androidTest/java/androidx/compose/ui/inspection/rules/ComposeInspectionRule.kt
+++ b/compose/ui/ui-inspection/src/androidTest/java/androidx/compose/ui/inspection/rules/ComposeInspectionRule.kt
@@ -48,9 +48,9 @@
  * - starts a compose inspector itself if [useInspector] is `true`
  *
  * @param clazz an activity to start for a test
- * @param useInspector parameter to enable / disable creation of inspector itself. By default,
- * it is true. However a test may not need an inspector because it works with underlying infra,
- * in such cases `false` can be passed to speed up test a bit.
+ * @param useInspector parameter to enable / disable creation of inspector itself. By default, it is
+ *   true. However a test may not need an inspector because it works with underlying infra, in such
+ *   cases `false` can be passed to speed up test a bit.
  */
 class ComposeInspectionRule(
     val clazz: KClass<out ComponentActivity>,
@@ -60,13 +60,15 @@
     val roots = mutableListOf<View>()
     val rootId: Long
         get() = roots.single().uniqueDrawingId
+
     lateinit var inspectorTester: InspectorTester
         private set
 
     @Suppress("UNCHECKED_CAST")
     private val compositionDataSet: Collection<CompositionData>
-        get() = rootsForTest.single().view.getTag(R.id.inspection_slot_table_set)
-            as Collection<CompositionData>
+        get() =
+            rootsForTest.single().view.getTag(R.id.inspection_slot_table_set)
+                as Collection<CompositionData>
 
     val compositionData: CompositionData
         get() = compositionDataSet.first()
@@ -85,13 +87,9 @@
         }
 
         activityScenario = ActivityScenario.launch(clazz.java)
-        activityScenario.onActivity {
-            roots.addAll(WindowInspector.getGlobalWindowViews())
-        }
+        activityScenario.onActivity { roots.addAll(WindowInspector.getGlobalWindowViews()) }
         if (!useInspector) return
-        runBlocking {
-            inspectorTester = InspectorTester("layoutinspector.compose.inspection")
-        }
+        runBlocking { inspectorTester = InspectorTester("layoutinspector.compose.inspection") }
     }
 
     fun show(composable: @Composable () -> Unit) = activityScenario.show(composable)
@@ -106,11 +104,7 @@
     val positionedLatch = CountDownLatch(1)
     onActivity {
         it.setContent {
-            Box(
-                Modifier
-                    .fillMaxSize()
-                    .onGloballyPositioned { positionedLatch.countDown() }
-            ) {
+            Box(Modifier.fillMaxSize().onGloballyPositioned { positionedLatch.countDown() }) {
                 composable()
             }
         }
@@ -119,7 +113,7 @@
     positionedLatch.await(1, TimeUnit.SECONDS)
 
     // Wait for the UI thread to complete its current work so we know that layout is done.
-    onActivity { }
+    onActivity {}
 }
 
 suspend fun InspectorTester.sendCommand(command: Command): Response {
diff --git a/compose/ui/ui-inspection/src/androidTest/java/androidx/compose/ui/inspection/rules/JvmtiRule.kt b/compose/ui/ui-inspection/src/androidTest/java/androidx/compose/ui/inspection/rules/JvmtiRule.kt
index 3cbe6bf..84dba99 100644
--- a/compose/ui/ui-inspection/src/androidTest/java/androidx/compose/ui/inspection/rules/JvmtiRule.kt
+++ b/compose/ui/ui-inspection/src/androidTest/java/androidx/compose/ui/inspection/rules/JvmtiRule.kt
@@ -31,6 +31,7 @@
                 // to make art to load JVMTI plugin.
             }
         }
+
         fun ensureInitialised() {
             // Calling this makes sure init {} block is triggered
         }
diff --git a/compose/ui/ui-inspection/src/androidTest/java/androidx/compose/ui/inspection/testdata/ComposeViewTestActivity.kt b/compose/ui/ui-inspection/src/androidTest/java/androidx/compose/ui/inspection/testdata/ComposeViewTestActivity.kt
index 8b9c648..3c47979 100644
--- a/compose/ui/ui-inspection/src/androidTest/java/androidx/compose/ui/inspection/testdata/ComposeViewTestActivity.kt
+++ b/compose/ui/ui-inspection/src/androidTest/java/androidx/compose/ui/inspection/testdata/ComposeViewTestActivity.kt
@@ -37,29 +37,29 @@
                     LinearLayout(context).apply {
                         orientation = LinearLayout.VERTICAL
                         addView(TextView(context).apply { text = "AndroidView" })
-                        addView(ComposeView(context).apply {
-                            setContent {
-                                Column {
-                                    Text("two")
-                                    AndroidView({ context ->
-                                        LinearLayout(context).apply {
-                                            orientation = LinearLayout.VERTICAL
-                                            addView(ComposeView(context).apply {
-                                                setContent {
-                                                    Nested {
-                                                        Nested {
+                        addView(
+                            ComposeView(context).apply {
+                                setContent {
+                                    Column {
+                                        Text("two")
+                                        AndroidView({ context ->
+                                            LinearLayout(context).apply {
+                                                orientation = LinearLayout.VERTICAL
+                                                addView(
+                                                    ComposeView(context).apply {
+                                                        setContent {
                                                             Nested {
-                                                                Text("three")
+                                                                Nested { Nested { Text("three") } }
                                                             }
                                                         }
                                                     }
-                                                }
-                                            })
-                                        }
-                                    })
+                                                )
+                                            }
+                                        })
+                                    }
                                 }
                             }
-                        })
+                        )
                     }
                 })
             }
diff --git a/compose/ui/ui-inspection/src/androidTest/java/androidx/compose/ui/inspection/testdata/DialogTestActivity.kt b/compose/ui/ui-inspection/src/androidTest/java/androidx/compose/ui/inspection/testdata/DialogTestActivity.kt
index 0bfa560..86c3043 100644
--- a/compose/ui/ui-inspection/src/androidTest/java/androidx/compose/ui/inspection/testdata/DialogTestActivity.kt
+++ b/compose/ui/ui-inspection/src/androidTest/java/androidx/compose/ui/inspection/testdata/DialogTestActivity.kt
@@ -32,11 +32,7 @@
                 Text("one")
                 AlertDialog(
                     onDismissRequest = {},
-                    confirmButton = {
-                        Button({}) {
-                            Text("Confirm Button")
-                        }
-                    }
+                    confirmButton = { Button({}) { Text("Confirm Button") } }
                 )
             }
         }
diff --git a/compose/ui/ui-inspection/src/androidTest/java/androidx/compose/ui/inspection/testdata/ParametersTestActivity.kt b/compose/ui/ui-inspection/src/androidTest/java/androidx/compose/ui/inspection/testdata/ParametersTestActivity.kt
index 1600fb3..d427c55 100644
--- a/compose/ui/ui-inspection/src/androidTest/java/androidx/compose/ui/inspection/testdata/ParametersTestActivity.kt
+++ b/compose/ui/ui-inspection/src/androidTest/java/androidx/compose/ui/inspection/testdata/ParametersTestActivity.kt
@@ -33,36 +33,21 @@
 import androidx.compose.ui.text.font.FontWeight
 
 class ParametersTestActivity : ComponentActivity() {
-    private val fontFamily = FontFamily(
-        Font(
-            resId = R.font.samplefont,
-            weight = FontWeight.W400,
-            style = FontStyle.Normal
-        ),
-        Font(
-            resId = R.font.samplefont,
-            weight = FontWeight.W400,
-            style = FontStyle.Italic
+    private val fontFamily =
+        FontFamily(
+            Font(resId = R.font.samplefont, weight = FontWeight.W400, style = FontStyle.Normal),
+            Font(resId = R.font.samplefont, weight = FontWeight.W400, style = FontStyle.Italic)
         )
-    )
 
     override fun onCreate(savedInstanceState: Bundle?) {
         super.onCreate(savedInstanceState)
         setContent {
             Column(modifier = Modifier.semantics(true) {}) {
-                Button(onClick = { println("smth") }) {
-                    Text("one", fontFamily = fontFamily)
-                }
-                Button(onClick = ::testClickHandler) {
-                    Text("two", fontFamily = fontFamily)
-                }
+                Button(onClick = { println("smth") }) { Text("one", fontFamily = fontFamily) }
+                Button(onClick = ::testClickHandler) { Text("two", fontFamily = fontFamily) }
                 FunctionWithIntArray(intArrayOf(10, 11, 12, 13, 14, 15, 16, 17))
                 Text("four")
-                SomeContent {
-                    Column {
-                        Text("five")
-                    }
-                }
+                SomeContent { Column { Text("five") } }
                 Row(modifier = Modifier.semantics(true) {}) {
                     Text("Text1")
                     Text("Text2")
@@ -84,7 +69,6 @@
     Text("three")
 }
 
-@Composable
-fun SomeContent(content: @Composable () -> Unit) = content()
+@Composable fun SomeContent(content: @Composable () -> Unit) = content()
 
 internal fun testClickHandler() {}
diff --git a/compose/ui/ui-inspection/src/androidTest/java/androidx/compose/ui/inspection/testdata/RippleTestActivity.kt b/compose/ui/ui-inspection/src/androidTest/java/androidx/compose/ui/inspection/testdata/RippleTestActivity.kt
index e89d8f6..648474a 100644
--- a/compose/ui/ui-inspection/src/androidTest/java/androidx/compose/ui/inspection/testdata/RippleTestActivity.kt
+++ b/compose/ui/ui-inspection/src/androidTest/java/androidx/compose/ui/inspection/testdata/RippleTestActivity.kt
@@ -47,26 +47,29 @@
                 val interactionSource = remember {
                     object : MutableInteractionSource {
                         override suspend fun emit(interaction: Interaction) {}
+
                         override fun tryEmit(interaction: Interaction) = true
+
                         override val interactions: Flow<Interaction>
                             get() = flowOf(PressInteraction.Press(Offset.Zero))
                     }
                 }
                 Text(
                     text = "Click me with indication",
-                    modifier = Modifier
-                        .clickable(
-                            interactionSource = interactionSource,
-                            indication = ripple()
-                        ) { /* do something */ }
-                        .padding(10.dp)
+                    modifier =
+                        Modifier.clickable(
+                                interactionSource = interactionSource,
+                                indication = ripple()
+                            ) { /* do something */
+                            }
+                            .padding(10.dp)
                 )
                 Spacer(Modifier.requiredHeight(10.dp))
                 Text(
                     text = "I show indication with clicking on other Text composable",
-                    modifier = Modifier
-                        .indication(interactionSource, LocalIndication.current)
-                        .padding(10.dp)
+                    modifier =
+                        Modifier.indication(interactionSource, LocalIndication.current)
+                            .padding(10.dp)
                 )
             }
         }
diff --git a/compose/ui/ui-inspection/src/androidTest/java/androidx/compose/ui/inspection/testdata/TestLambdas.kt b/compose/ui/ui-inspection/src/androidTest/java/androidx/compose/ui/inspection/testdata/TestLambdas.kt
index 5ff2b27..6dab8c7 100644
--- a/compose/ui/ui-inspection/src/androidTest/java/androidx/compose/ui/inspection/testdata/TestLambdas.kt
+++ b/compose/ui/ui-inspection/src/androidTest/java/androidx/compose/ui/inspection/testdata/TestLambdas.kt
@@ -29,15 +29,10 @@
         val sum = a + fct(b) { it * it }
         sum - a
     }
-    val inlinedParameter = { o: IntOffset ->
-        o.x * 2
-    }
+    val inlinedParameter = { o: IntOffset -> o.x * 2 }
     val unnamed: (Int, Int) -> Float = { _, _ -> 0f }
 
-    /**
-     * This inline function will appear at a line numbers
-     * past the end of this file for JVMTI.
-     */
+    /** This inline function will appear at a line numbers past the end of this file for JVMTI. */
     private inline fun fct(n: Int, op: (Int) -> Int): Int {
         val a = op(n)
         val b = n * a + 3
diff --git a/compose/ui/ui-inspection/src/androidTest/java/androidx/compose/ui/inspection/util/ProtoExtensions.kt b/compose/ui/ui-inspection/src/androidTest/java/androidx/compose/ui/inspection/util/ProtoExtensions.kt
index b709c53..ea26333 100644
--- a/compose/ui/ui-inspection/src/androidTest/java/androidx/compose/ui/inspection/util/ProtoExtensions.kt
+++ b/compose/ui/ui-inspection/src/androidTest/java/androidx/compose/ui/inspection/util/ProtoExtensions.kt
@@ -33,47 +33,63 @@
     node: ComposableNode,
     useDelayedParameterExtraction: Boolean,
     skipSystemComposables: Boolean = true
-): Command = if (useDelayedParameterExtraction) {
-    GetParametersByAnchorIdCommand(rootViewId, node.anchorHash, node.id, skipSystemComposables)
-} else {
-    GetParametersByIdCommand(rootViewId, node.id, skipSystemComposables)
-}
+): Command =
+    if (useDelayedParameterExtraction) {
+        GetParametersByAnchorIdCommand(rootViewId, node.anchorHash, node.id, skipSystemComposables)
+    } else {
+        GetParametersByIdCommand(rootViewId, node.id, skipSystemComposables)
+    }
 
 fun GetParametersByIdCommand(
     rootViewId: Long,
     composableId: Long,
     skipSystemComposables: Boolean = true
-): Command = Command.newBuilder().apply {
-    getParametersCommand = GetParametersCommand.newBuilder().apply {
-        this.rootViewId = rootViewId
-        this.composableId = composableId
-        this.skipSystemComposables = skipSystemComposables
-    }.build()
-}.build()
+): Command =
+    Command.newBuilder()
+        .apply {
+            getParametersCommand =
+                GetParametersCommand.newBuilder()
+                    .apply {
+                        this.rootViewId = rootViewId
+                        this.composableId = composableId
+                        this.skipSystemComposables = skipSystemComposables
+                    }
+                    .build()
+        }
+        .build()
 
 fun GetParametersByAnchorIdCommand(
     rootViewId: Long,
     anchorId: Int,
     composableId: Long,
     skipSystemComposables: Boolean = true
-): Command = Command.newBuilder().apply {
-    getParametersCommand = GetParametersCommand.newBuilder().apply {
-        this.rootViewId = rootViewId
-        this.anchorHash = anchorId
-        this.composableId = composableId
-        this.skipSystemComposables = skipSystemComposables
-    }.build()
-}.build()
+): Command =
+    Command.newBuilder()
+        .apply {
+            getParametersCommand =
+                GetParametersCommand.newBuilder()
+                    .apply {
+                        this.rootViewId = rootViewId
+                        this.anchorHash = anchorId
+                        this.composableId = composableId
+                        this.skipSystemComposables = skipSystemComposables
+                    }
+                    .build()
+        }
+        .build()
 
-fun GetAllParametersCommand(
-    rootViewId: Long,
-    skipSystemComposables: Boolean = true
-): Command = Command.newBuilder().apply {
-    getAllParametersCommand = GetAllParametersCommand.newBuilder().apply {
-        this.rootViewId = rootViewId
-        this.skipSystemComposables = skipSystemComposables
-    }.build()
-}.build()
+fun GetAllParametersCommand(rootViewId: Long, skipSystemComposables: Boolean = true): Command =
+    Command.newBuilder()
+        .apply {
+            getAllParametersCommand =
+                GetAllParametersCommand.newBuilder()
+                    .apply {
+                        this.rootViewId = rootViewId
+                        this.skipSystemComposables = skipSystemComposables
+                    }
+                    .build()
+        }
+        .build()
 
 fun GetParameterDetailsCommand(
     rootViewId: Long,
@@ -81,19 +97,25 @@
     startIndex: Int,
     maxElements: Int,
     skipSystemComposables: Boolean = true
-): Command = Command.newBuilder().apply {
-    getParameterDetailsCommand = GetParameterDetailsCommand.newBuilder().apply {
-        this.rootViewId = rootViewId
-        this.skipSystemComposables = skipSystemComposables
-        this.reference = reference
-        if (startIndex >= 0) {
-            this.startIndex = startIndex
+): Command =
+    Command.newBuilder()
+        .apply {
+            getParameterDetailsCommand =
+                GetParameterDetailsCommand.newBuilder()
+                    .apply {
+                        this.rootViewId = rootViewId
+                        this.skipSystemComposables = skipSystemComposables
+                        this.reference = reference
+                        if (startIndex >= 0) {
+                            this.startIndex = startIndex
+                        }
+                        if (maxElements >= 0) {
+                            this.maxElements = maxElements
+                        }
+                    }
+                    .build()
         }
-        if (maxElements >= 0) {
-            this.maxElements = maxElements
-        }
-    }.build()
-}.build()
+        .build()
 
 fun GetComposablesCommand(
     rootViewId: Long,
@@ -101,18 +123,22 @@
     generation: Int = 1,
     extractAllParameters: Boolean = false
 ): Command =
-    Command.newBuilder().apply {
-        getComposablesCommand = GetComposablesCommand.newBuilder().apply {
-            this.rootViewId = rootViewId
-            this.skipSystemComposables = skipSystemComposables
-            this.generation = generation
-            this.extractAllParameters = extractAllParameters
+    Command.newBuilder()
+        .apply {
+            getComposablesCommand =
+                GetComposablesCommand.newBuilder()
+                    .apply {
+                        this.rootViewId = rootViewId
+                        this.skipSystemComposables = skipSystemComposables
+                        this.generation = generation
+                        this.extractAllParameters = extractAllParameters
+                    }
+                    .setRootViewId(rootViewId)
+                    .setSkipSystemComposables(skipSystemComposables)
+                    .setGeneration(generation)
+                    .build()
         }
-            .setRootViewId(rootViewId)
-            .setSkipSystemComposables(skipSystemComposables)
-            .setGeneration(generation)
-            .build()
-    }.build()
+        .build()
 
 fun GetUpdateSettingsCommand(
     includeRecomposeCounts: Boolean = false,
@@ -120,14 +146,19 @@
     delayParameterExtractions: Boolean = false,
     reduceChildNesting: Boolean = false
 ): Command =
-    Command.newBuilder().apply {
-        updateSettingsCommand = UpdateSettingsCommand.newBuilder().apply {
-            this.includeRecomposeCounts = includeRecomposeCounts
-            this.keepRecomposeCounts = keepRecomposeCounts
-            this.delayParameterExtractions = delayParameterExtractions
-            this.reduceChildNesting = reduceChildNesting
-        }.build()
-    }.build()
+    Command.newBuilder()
+        .apply {
+            updateSettingsCommand =
+                UpdateSettingsCommand.newBuilder()
+                    .apply {
+                        this.includeRecomposeCounts = includeRecomposeCounts
+                        this.keepRecomposeCounts = keepRecomposeCounts
+                        this.delayParameterExtractions = delayParameterExtractions
+                        this.reduceChildNesting = reduceChildNesting
+                    }
+                    .build()
+        }
+        .build()
 
 fun ComposableNode.flatten(): List<ComposableNode> =
     listOf(this).plus(this.childrenList.flatMap { it.flatten() })
diff --git a/compose/ui/ui-inspection/src/main/java/androidx/compose/ui/inspection/ComposeLayoutInspector.kt b/compose/ui/ui-inspection/src/main/java/androidx/compose/ui/inspection/ComposeLayoutInspector.kt
index 490242b6..b38bed3 100644
--- a/compose/ui/ui-inspection/src/main/java/androidx/compose/ui/inspection/ComposeLayoutInspector.kt
+++ b/compose/ui/ui-inspection/src/main/java/androidx/compose/ui/inspection/ComposeLayoutInspector.kt
@@ -83,16 +83,11 @@
     }
 }
 
-class ComposeLayoutInspector(
-    connection: Connection,
-    environment: InspectorEnvironment
-) : Inspector(connection) {
+class ComposeLayoutInspector(connection: Connection, environment: InspectorEnvironment) :
+    Inspector(connection) {
 
     /** Cache data which allows us to reuse previously queried inspector nodes */
-    private class CacheData(
-        val rootView: View,
-        val trees: List<CacheTree>
-    ) {
+    private class CacheData(val rootView: View, val trees: List<CacheTree>) {
         /** The cached nodes as a map from node id to InspectorNode */
         val lookup: LongObjectMap<InspectorNode>
             get() = _lookup ?: createLookup()
@@ -146,12 +141,13 @@
     }
 
     override fun onReceiveCommand(data: ByteArray, callback: CommandCallback) {
-        val command = try {
-            Command.parseFrom(data)
-        } catch (ignored: InvalidProtocolBufferException) {
-            handleUnknownCommand(data, callback)
-            return
-        }
+        val command =
+            try {
+                Command.parseFrom(data)
+            } catch (ignored: InvalidProtocolBufferException) {
+                handleUnknownCommand(data, callback)
+                return
+            }
 
         when (command.specializedCase) {
             Command.SpecializedCase.GET_COMPOSABLES_COMMAND -> {
@@ -175,9 +171,10 @@
 
     private fun handleUnknownCommand(commandBytes: ByteArray, callback: CommandCallback) {
         callback.reply {
-            unknownCommandResponse = UnknownCommandResponse.newBuilder().apply {
-                this.commandBytes = ByteString.copyFrom(commandBytes)
-            }.build()
+            unknownCommandResponse =
+                UnknownCommandResponse.newBuilder()
+                    .apply { this.commandBytes = ByteString.copyFrom(commandBytes) }
+                    .build()
         }
     }
 
@@ -185,13 +182,14 @@
         getComposablesCommand: GetComposablesCommand,
         callback: CommandCallback
     ) {
-        val data = getComposableNodes(
-            getComposablesCommand.rootViewId,
-            getComposablesCommand.skipSystemComposables,
-            getComposablesCommand.extractAllParameters || !delayParameterExtractions,
-            getComposablesCommand.generation,
-            getComposablesCommand.generation == 0
-        )
+        val data =
+            getComposableNodes(
+                getComposablesCommand.rootViewId,
+                getComposablesCommand.skipSystemComposables,
+                getComposablesCommand.extractAllParameters || !delayParameterExtractions,
+                getComposablesCommand.generation,
+                getComposablesCommand.generation == 0
+            )
 
         val location = IntArray(2)
         data?.rootView?.getLocationOnScreen(location)
@@ -204,10 +202,13 @@
         val roots = trees.map { it.toComposableRoot(context) }
 
         callback.reply {
-            getComposablesResponse = GetComposablesResponse.newBuilder().apply {
-                addAllStrings(stringTable.toStringEntries())
-                addAllRoots(roots)
-            }.build()
+            getComposablesResponse =
+                GetComposablesResponse.newBuilder()
+                    .apply {
+                        addAllStrings(stringTable.toStringEntries())
+                        addAllRoots(roots)
+                    }
+                    .build()
         }
     }
 
@@ -216,39 +217,50 @@
         callback: CommandCallback
     ) {
         val foundComposable =
-            if (delayParameterExtractions && !cachedHasAllParameters &&
-                getParametersCommand.anchorHash != NO_ANCHOR_ID
+            if (
+                delayParameterExtractions &&
+                    !cachedHasAllParameters &&
+                    getParametersCommand.anchorHash != NO_ANCHOR_ID
             ) {
                 getComposableFromAnchor(getParametersCommand.anchorHash)
             } else {
                 getComposableNodes(
-                    getParametersCommand.rootViewId,
-                    getParametersCommand.skipSystemComposables,
-                    true,
-                    getParametersCommand.generation
-                )?.lookup?.get(getParametersCommand.composableId)
+                        getParametersCommand.rootViewId,
+                        getParametersCommand.skipSystemComposables,
+                        true,
+                        getParametersCommand.generation
+                    )
+                    ?.lookup
+                    ?.get(getParametersCommand.composableId)
             }
-        val semanticsNode = getCachedComposableNodes(
-            getParametersCommand.rootViewId
-        )?.lookup?.get(getParametersCommand.composableId)
+        val semanticsNode =
+            getCachedComposableNodes(getParametersCommand.rootViewId)
+                ?.lookup
+                ?.get(getParametersCommand.composableId)
 
         callback.reply {
-            getParametersResponse = if (foundComposable != null) {
-                val stringTable = StringTable()
-                GetParametersResponse.newBuilder().apply {
-                    parameterGroup = foundComposable.convertToParameterGroup(
-                        semanticsNode ?: foundComposable,
-                        layoutInspectorTree,
-                        getParametersCommand.rootViewId,
-                        getParametersCommand.maxRecursions.orElse(MAX_RECURSIONS),
-                        getParametersCommand.maxInitialIterableSize.orElse(MAX_ITERABLE_SIZE),
-                        stringTable
-                    )
-                    addAllStrings(stringTable.toStringEntries())
-                }.build()
-            } else {
-                GetParametersResponse.getDefaultInstance()
-            }
+            getParametersResponse =
+                if (foundComposable != null) {
+                    val stringTable = StringTable()
+                    GetParametersResponse.newBuilder()
+                        .apply {
+                            parameterGroup =
+                                foundComposable.convertToParameterGroup(
+                                    semanticsNode ?: foundComposable,
+                                    layoutInspectorTree,
+                                    getParametersCommand.rootViewId,
+                                    getParametersCommand.maxRecursions.orElse(MAX_RECURSIONS),
+                                    getParametersCommand.maxInitialIterableSize.orElse(
+                                        MAX_ITERABLE_SIZE
+                                    ),
+                                    stringTable
+                                )
+                            addAllStrings(stringTable.toStringEntries())
+                        }
+                        .build()
+                } else {
+                    GetParametersResponse.getDefaultInstance()
+                }
         }
     }
 
@@ -258,11 +270,12 @@
     ) {
         val allComposables =
             getComposableNodes(
-                getAllParametersCommand.rootViewId,
-                getAllParametersCommand.skipSystemComposables,
-                true,
-                getAllParametersCommand.generation
-            )?.lookup ?: longObjectMapOf()
+                    getAllParametersCommand.rootViewId,
+                    getAllParametersCommand.skipSystemComposables,
+                    true,
+                    getAllParametersCommand.generation
+                )
+                ?.lookup ?: longObjectMapOf()
 
         callback.reply {
             val stringTable = StringTable()
@@ -280,11 +293,14 @@
                 )
             }
 
-            getAllParametersResponse = GetAllParametersResponse.newBuilder().apply {
-                rootViewId = getAllParametersCommand.rootViewId
-                addAllParameterGroups(parameterGroups)
-                addAllStrings(stringTable.toStringEntries())
-            }.build()
+            getAllParametersResponse =
+                GetAllParametersResponse.newBuilder()
+                    .apply {
+                        rootViewId = getAllParametersCommand.rootViewId
+                        addAllParameterGroups(parameterGroups)
+                        addAllStrings(stringTable.toStringEntries())
+                    }
+                    .build()
         }
     }
 
@@ -294,52 +310,62 @@
     ) {
         val indices = mutableIntListOf()
         getParameterDetailsCommand.reference.compositeIndexList.forEach { indices.add(it) }
-        val reference = NodeParameterReference(
-            getParameterDetailsCommand.reference.composableId,
-            getParameterDetailsCommand.reference.anchorHash,
-            getParameterDetailsCommand.reference.kind.convert(),
-            getParameterDetailsCommand.reference.parameterIndex,
-            indices
-        )
+        val reference =
+            NodeParameterReference(
+                getParameterDetailsCommand.reference.composableId,
+                getParameterDetailsCommand.reference.anchorHash,
+                getParameterDetailsCommand.reference.kind.convert(),
+                getParameterDetailsCommand.reference.parameterIndex,
+                indices
+            )
         val foundComposable =
-            if (delayParameterExtractions && !cachedHasAllParameters &&
-                reference.anchorId != NO_ANCHOR_ID
+            if (
+                delayParameterExtractions &&
+                    !cachedHasAllParameters &&
+                    reference.anchorId != NO_ANCHOR_ID
             ) {
                 getComposableFromAnchor(reference.anchorId)
             } else {
                 getComposableNodes(
-                    getParameterDetailsCommand.rootViewId,
-                    getParameterDetailsCommand.skipSystemComposables,
-                    true,
-                    getParameterDetailsCommand.generation
-                )?.lookup?.get(reference.nodeId)
+                        getParameterDetailsCommand.rootViewId,
+                        getParameterDetailsCommand.skipSystemComposables,
+                        true,
+                        getParameterDetailsCommand.generation
+                    )
+                    ?.lookup
+                    ?.get(reference.nodeId)
             }
-        val semanticsNode = getCachedComposableNodes(
-            getParameterDetailsCommand.rootViewId
-        )?.lookup?.get(getParameterDetailsCommand.reference.composableId)
-        val expanded = foundComposable?.let { composable ->
-            layoutInspectorTree.expandParameter(
-                getParameterDetailsCommand.rootViewId,
-                semanticsNode ?: composable,
-                reference,
-                getParameterDetailsCommand.startIndex,
-                getParameterDetailsCommand.maxElements,
-                getParameterDetailsCommand.maxRecursions.orElse(MAX_RECURSIONS),
-                getParameterDetailsCommand.maxInitialIterableSize.orElse(MAX_ITERABLE_SIZE),
-            )
-        }
+        val semanticsNode =
+            getCachedComposableNodes(getParameterDetailsCommand.rootViewId)
+                ?.lookup
+                ?.get(getParameterDetailsCommand.reference.composableId)
+        val expanded =
+            foundComposable?.let { composable ->
+                layoutInspectorTree.expandParameter(
+                    getParameterDetailsCommand.rootViewId,
+                    semanticsNode ?: composable,
+                    reference,
+                    getParameterDetailsCommand.startIndex,
+                    getParameterDetailsCommand.maxElements,
+                    getParameterDetailsCommand.maxRecursions.orElse(MAX_RECURSIONS),
+                    getParameterDetailsCommand.maxInitialIterableSize.orElse(MAX_ITERABLE_SIZE),
+                )
+            }
 
         callback.reply {
-            getParameterDetailsResponse = if (expanded != null) {
-                val stringTable = StringTable()
-                GetParameterDetailsResponse.newBuilder().apply {
-                    rootViewId = getParameterDetailsCommand.rootViewId
-                    parameter = expanded.convert(stringTable)
-                    addAllStrings(stringTable.toStringEntries())
-                }.build()
-            } else {
-                GetParameterDetailsResponse.getDefaultInstance()
-            }
+            getParameterDetailsResponse =
+                if (expanded != null) {
+                    val stringTable = StringTable()
+                    GetParameterDetailsResponse.newBuilder()
+                        .apply {
+                            rootViewId = getParameterDetailsCommand.rootViewId
+                            parameter = expanded.convert(stringTable)
+                            addAllStrings(stringTable.toStringEntries())
+                        }
+                        .build()
+                } else {
+                    GetParameterDetailsResponse.getDefaultInstance()
+                }
         }
     }
 
@@ -354,9 +380,10 @@
         delayParameterExtractions = updateSettingsCommand.delayParameterExtractions
         reduceChildNesting = updateSettingsCommand.reduceChildNesting
         callback.reply {
-            updateSettingsResponse = UpdateSettingsResponse.newBuilder().apply {
-                canDelayParameterExtractions = true
-            }.build()
+            updateSettingsResponse =
+                UpdateSettingsResponse.newBuilder()
+                    .apply { canDelayParameterExtractions = true }
+                    .build()
         }
     }
 
@@ -374,34 +401,42 @@
         generation: Int,
         forceRegeneration: Boolean = false
     ): CacheData? {
-        if (!forceRegeneration && generation == cachedGeneration &&
-            skipSystemComposables == cachedSystemComposablesSkipped &&
-            (!includeAllParameters || cachedHasAllParameters)
+        if (
+            !forceRegeneration &&
+                generation == cachedGeneration &&
+                skipSystemComposables == cachedSystemComposablesSkipped &&
+                (!includeAllParameters || cachedHasAllParameters)
         ) {
             return cachedNodes[rootViewId]
         }
 
-        val data = ThreadUtils.runOnMainThread {
-            layoutInspectorTree.resetAccumulativeState()
-            layoutInspectorTree.includeAllParameters = includeAllParameters
-            val composeViews = getAndroidComposeViews(rootViewId, skipSystemComposables, generation)
-            val composeViewsByRoot =
-                mutableLongObjectMapOf<MutableList<AndroidComposeViewWrapper>>()
-            composeViews.groupByToLongObjectMap(composeViewsByRoot) { it.rootView.uniqueDrawingId }
-            val data = mutableLongObjectMapOf<CacheData>()
-            composeViewsByRoot.forEach { key, value ->
-                data.put(key,
-                    CacheData(
-                        value.first().rootView,
-                        value.map {
-                            CacheTree(it.viewParent, it.createNodes(), it.viewsToSkip)
-                        }
-                    )
-                )
-            }
-            layoutInspectorTree.resetAccumulativeState()
-            data
-        }.get()
+        val data =
+            ThreadUtils.runOnMainThread {
+                    layoutInspectorTree.resetAccumulativeState()
+                    layoutInspectorTree.includeAllParameters = includeAllParameters
+                    val composeViews =
+                        getAndroidComposeViews(rootViewId, skipSystemComposables, generation)
+                    val composeViewsByRoot =
+                        mutableLongObjectMapOf<MutableList<AndroidComposeViewWrapper>>()
+                    composeViews.groupByToLongObjectMap(composeViewsByRoot) {
+                        it.rootView.uniqueDrawingId
+                    }
+                    val data = mutableLongObjectMapOf<CacheData>()
+                    composeViewsByRoot.forEach { key, value ->
+                        data.put(
+                            key,
+                            CacheData(
+                                value.first().rootView,
+                                value.map {
+                                    CacheTree(it.viewParent, it.createNodes(), it.viewsToSkip)
+                                }
+                            )
+                        )
+                    }
+                    layoutInspectorTree.resetAccumulativeState()
+                    data
+                }
+                .get()
 
         cachedNodes.clear()
         cachedNodes.putAll(data)
@@ -411,11 +446,8 @@
         return cachedNodes[rootViewId]
     }
 
-    /**
-     * Return the cached [InspectorNode]s found under the layout tree rooted by [rootViewId].
-     */
-    private fun getCachedComposableNodes(rootViewId: Long): CacheData? =
-      cachedNodes[rootViewId]
+    /** Return the cached [InspectorNode]s found under the layout tree rooted by [rootViewId]. */
+    private fun getCachedComposableNodes(rootViewId: Long): CacheData? = cachedNodes[rootViewId]
 
     /**
      * Find an [InspectorNode] with extracted parameters that represent the composable with the
@@ -423,15 +455,14 @@
      */
     private fun getComposableFromAnchor(anchorId: Int): InspectorNode? =
         ThreadUtils.runOnMainThread {
-            layoutInspectorTree.resetAccumulativeState()
-            layoutInspectorTree.includeAllParameters = false
-            val composeViews = getAndroidComposeViews(-1L, false, 1)
-            composeViews.firstNotNullOfOrNull { it.findParameters(anchorId) }
-        }.get()
+                layoutInspectorTree.resetAccumulativeState()
+                layoutInspectorTree.includeAllParameters = false
+                val composeViews = getAndroidComposeViews(-1L, false, 1)
+                composeViews.firstNotNullOfOrNull { it.findParameters(anchorId) }
+            }
+            .get()
 
-    /**
-     * Get all AndroidComposeView instances found within the layout tree rooted by [rootViewId].
-     */
+    /** Get all AndroidComposeView instances found within the layout tree rooted by [rootViewId]. */
     private fun getAndroidComposeViews(
         rootViewId: Long,
         skipSystemComposables: Boolean,
@@ -439,10 +470,10 @@
     ): List<AndroidComposeViewWrapper> {
         ThreadUtils.assertOnMainThread()
 
-        val roots = WindowInspector.getGlobalWindowViews()
-            .asSequence()
-            .filter { root ->
-                root.visibility == View.VISIBLE && root.isAttachedToWindow &&
+        val roots =
+            WindowInspector.getGlobalWindowViews().asSequence().filter { root ->
+                root.visibility == View.VISIBLE &&
+                    root.isAttachedToWindow &&
                     (generation > 0 || root.uniqueDrawingId == rootViewId)
             }
 
@@ -460,9 +491,7 @@
         return wrappers
     }
 
-    /**
-     * Enable inspection in this app.
-     */
+    /** Enable inspection in this app. */
     @Suppress("BanUncheckedReflection")
     private fun enableInspection(artTooling: ArtTooling) {
         // Enable debug inspector information.
@@ -483,22 +512,24 @@
         addSlotTableToComposeViews()
     }
 
-    /**
-     * Add a slot table to all AndroidComposeViews that doesn't already have one.
-     */
-    private fun addSlotTableToComposeViews() = ThreadUtils.runOnMainThread {
-        val roots = WindowInspector.getGlobalWindowViews()
-        val composeViews = roots.flatMap { it.flatten() }.filter { it.isAndroidComposeView() }
+    /** Add a slot table to all AndroidComposeViews that doesn't already have one. */
+    private fun addSlotTableToComposeViews() =
+        ThreadUtils.runOnMainThread {
+                val roots = WindowInspector.getGlobalWindowViews()
+                val composeViews =
+                    roots.flatMap { it.flatten() }.filter { it.isAndroidComposeView() }
 
-        if (composeViews.any { !it.hasSlotTable }) {
-            val slotTablesAdded = composeViews.sumOf { it.addSlotTable() }
-            if (slotTablesAdded > 0) {
-                // The slot tables added to existing views will be empty until the composables
-                // are reloaded. Do that now:
-                hotReload()
+                if (composeViews.any { !it.hasSlotTable }) {
+                    val slotTablesAdded = composeViews.sumOf { it.addSlotTable() }
+                    if (slotTablesAdded > 0) {
+                        // The slot tables added to existing views will be empty until the
+                        // composables
+                        // are reloaded. Do that now:
+                        hotReload()
+                    }
+                }
             }
-        }
-    }.get()
+            .get()
 
     /**
      * Perform a hot reload after adding SlotTable storage.
@@ -515,8 +546,11 @@
         load.isAccessible = true
         // Add a context parameter even though it is not currently used.
         // (It was required in earlier versions of the Compose runtime.)
-        val context = Class.forName("android.app.ActivityThread")
-            .getDeclaredMethod("currentApplication").apply { isAccessible = true }.invoke(null)
+        val context =
+            Class.forName("android.app.ActivityThread")
+                .getDeclaredMethod("currentApplication")
+                .apply { isAccessible = true }
+                .invoke(null)
         val state = save(companion, context)
         load(companion, state)
     }
@@ -544,5 +578,4 @@
 }
 
 // Provide default for older version:
-private fun Int.orElse(defaultValue: Int): Int =
-    if (this == 0) defaultValue else this
+private fun Int.orElse(defaultValue: Int): Int = if (this == 0) defaultValue else this
diff --git a/compose/ui/ui-inspection/src/main/java/androidx/compose/ui/inspection/LambdaLocation.kt b/compose/ui/ui-inspection/src/main/java/androidx/compose/ui/inspection/LambdaLocation.kt
index d1c974e..ca5de43 100644
--- a/compose/ui/ui-inspection/src/main/java/androidx/compose/ui/inspection/LambdaLocation.kt
+++ b/compose/ui/ui-inspection/src/main/java/androidx/compose/ui/inspection/LambdaLocation.kt
@@ -39,7 +39,6 @@
             return resolve(o::class.java)
         }
 
-        @JvmStatic
-        private external fun resolve(clazz: Class<*>): LambdaLocation?
+        @JvmStatic private external fun resolve(clazz: Class<*>): LambdaLocation?
     }
 }
diff --git a/compose/ui/ui-inspection/src/main/java/androidx/compose/ui/inspection/RecompositionHandler.kt b/compose/ui/ui-inspection/src/main/java/androidx/compose/ui/inspection/RecompositionHandler.kt
index 4980e93..04920a2 100644
--- a/compose/ui/ui-inspection/src/main/java/androidx/compose/ui/inspection/RecompositionHandler.kt
+++ b/compose/ui/ui-inspection/src/main/java/androidx/compose/ui/inspection/RecompositionHandler.kt
@@ -24,33 +24,25 @@
 private const val START_RESTART_GROUP = "startRestartGroup(I)Landroidx/compose/runtime/Composer;"
 private const val SKIP_TO_GROUP_END = "skipToGroupEnd()V"
 
-/**
- * Detection of recompose counts and skips from installing runtime hooks.
- */
+/** Detection of recompose counts and skips from installing runtime hooks. */
 class RecompositionHandler(private val artTooling: ArtTooling) {
 
-    /**
-     * For each composable store the recomposition [count] and [skips].
-     */
+    /** For each composable store the recomposition [count] and [skips]. */
     class Data(var count: Int, var skips: Int)
 
     /**
      * Key of a Composable method.
      *
-     * The [key] identified the runtime method and the [anchorId] identified a
-     * specific compose node.
+     * The [key] identified the runtime method and the [anchorId] identified a specific compose
+     * node.
      */
     private data class MethodKey(val key: Int, val anchorId: Int)
 
     private val lock = Any()
-    @GuardedBy("lock")
-    private var currentlyCollecting = false
-    @GuardedBy("lock")
-    private var hooksInstalled = false
-    @GuardedBy("lock")
-    private val counts = mutableMapOf<MethodKey, Data>()
-    @GuardedBy("lock")
-    private var lastMethodKey: Int = 0
+    @GuardedBy("lock") private var currentlyCollecting = false
+    @GuardedBy("lock") private var hooksInstalled = false
+    @GuardedBy("lock") private val counts = mutableMapOf<MethodKey, Data>()
+    @GuardedBy("lock") private var lastMethodKey: Int = 0
 
     fun changeCollectionMode(startCollecting: Boolean, keepCounts: Boolean) {
         synchronized(lock) {
@@ -79,17 +71,16 @@
      * - entry hook for ComposerImpl.skipToGroupEnd converts a recompose count to a skip count.
      */
     private fun installHooks() {
-        val composerImpl = try {
-            Class.forName("${Composer::class.java.name}Impl")
-        } catch (ex: Throwable) {
-            Log.w("Compose", "Could not install recomposition hooks", ex)
-            return
-        }
+        val composerImpl =
+            try {
+                Class.forName("${Composer::class.java.name}Impl")
+            } catch (ex: Throwable) {
+                Log.w("Compose", "Could not install recomposition hooks", ex)
+                return
+            }
 
         artTooling.registerEntryHook(composerImpl, START_RESTART_GROUP) { _, args ->
-            synchronized(lock) {
-                lastMethodKey = args[0] as Int
-            }
+            synchronized(lock) { lastMethodKey = args[0] as Int }
         }
 
         artTooling.registerExitHook(composerImpl, START_RESTART_GROUP) { composer: Composer ->
diff --git a/compose/ui/ui-inspection/src/main/java/androidx/compose/ui/inspection/compose/AndroidComposeViewWrapper.kt b/compose/ui/ui-inspection/src/main/java/androidx/compose/ui/inspection/compose/AndroidComposeViewWrapper.kt
index a1a2615..b80b7a8 100644
--- a/compose/ui/ui-inspection/src/main/java/androidx/compose/ui/inspection/compose/AndroidComposeViewWrapper.kt
+++ b/compose/ui/ui-inspection/src/main/java/androidx/compose/ui/inspection/compose/AndroidComposeViewWrapper.kt
@@ -32,11 +32,10 @@
 
 /**
  * Returns true if the view is contained in a layout generated by the platform / system.
- *
  * <ul>
- *   <li>DecorView, ViewStub, AndroidComposeView, View will have a null layout
- *   <li>Layouts from the "android" namespace are from the platform
- *   <li>AppCompat will typically use an "abc_" prefix for their layout names
+ * <li>DecorView, ViewStub, AndroidComposeView, View will have a null layout
+ * <li>Layouts from the "android" namespace are from the platform
+ * <li>AppCompat will typically use an "abc_" prefix for their layout names
  * </ul>
  */
 private fun View.isSystemView(): Boolean {
@@ -100,9 +99,10 @@
 
     val viewsToSkip: LongList = createViewsToSkip(composeView)
 
-    private val inspectorNodes = layoutInspectorTree.apply {
-        this.hideSystemNodes = skipSystemComposables
-    }.convert(composeView)
+    private val inspectorNodes =
+        layoutInspectorTree
+            .apply { this.hideSystemNodes = skipSystemComposables }
+            .convert(composeView)
 
     fun createNodes(): List<InspectorNode> =
         layoutInspectorTree.addSubCompositionRoots(composeView, inspectorNodes)
diff --git a/compose/ui/ui-inspection/src/main/java/androidx/compose/ui/inspection/compose/ComposeExtensions.kt b/compose/ui/ui-inspection/src/main/java/androidx/compose/ui/inspection/compose/ComposeExtensions.kt
index 283952a..26bca16 100644
--- a/compose/ui/ui-inspection/src/main/java/androidx/compose/ui/inspection/compose/ComposeExtensions.kt
+++ b/compose/ui/ui-inspection/src/main/java/androidx/compose/ui/inspection/compose/ComposeExtensions.kt
@@ -28,9 +28,7 @@
 import androidx.compose.ui.inspection.util.ThreadUtils
 import layoutinspector.compose.inspection.LayoutInspectorComposeProtocol.ParameterGroup
 
-/**
- * Convert parameters and semantics from [InspectorNode] into a [ParameterGroup].
- */
+/** Convert parameters and semantics from [InspectorNode] into a [ParameterGroup]. */
 fun InspectorNode.convertToParameterGroup(
     semanticsNode: InspectorNode,
     layoutInspectorTree: LayoutInspectorTree,
@@ -38,24 +36,44 @@
     maxRecursions: Int,
     maxInitialIterableSize: Int,
     stringTable: StringTable
-): ParameterGroup = ParameterGroup.newBuilder().apply {
-    composableId = id
-    addAllParameter(
-        convertParameters(
-            layoutInspectorTree, Normal, rootId, maxRecursions, maxInitialIterableSize
-        ).convertAll(stringTable)
-    )
-    addAllMergedSemantics(
-        semanticsNode.convertParameters(
-            layoutInspectorTree, MergedSemantics, rootId, maxRecursions, maxInitialIterableSize
-        ).convertAll(stringTable)
-    )
-    addAllUnmergedSemantics(
-        semanticsNode.convertParameters(
-            layoutInspectorTree, UnmergedSemantics, rootId, maxRecursions, maxInitialIterableSize
-        ).convertAll(stringTable)
-    )
-}.build()
+): ParameterGroup =
+    ParameterGroup.newBuilder()
+        .apply {
+            composableId = id
+            addAllParameter(
+                convertParameters(
+                        layoutInspectorTree,
+                        Normal,
+                        rootId,
+                        maxRecursions,
+                        maxInitialIterableSize
+                    )
+                    .convertAll(stringTable)
+            )
+            addAllMergedSemantics(
+                semanticsNode
+                    .convertParameters(
+                        layoutInspectorTree,
+                        MergedSemantics,
+                        rootId,
+                        maxRecursions,
+                        maxInitialIterableSize
+                    )
+                    .convertAll(stringTable)
+            )
+            addAllUnmergedSemantics(
+                semanticsNode
+                    .convertParameters(
+                        layoutInspectorTree,
+                        UnmergedSemantics,
+                        rootId,
+                        maxRecursions,
+                        maxInitialIterableSize
+                    )
+                    .convertAll(stringTable)
+            )
+        }
+        .build()
 
 /**
  * Convert [InspectorNode] into [NodeParameter]s.
@@ -80,9 +98,7 @@
     )
 }
 
-/**
- * Flatten an inspector node into a list containing itself and all its children.
- */
+/** Flatten an inspector node into a list containing itself and all its children. */
 fun InspectorNode.flatten(): Sequence<InspectorNode> {
     val remaining = mutableListOf(this)
     return generateSequence {
diff --git a/compose/ui/ui-inspection/src/main/java/androidx/compose/ui/inspection/framework/JavaExtensions.kt b/compose/ui/ui-inspection/src/main/java/androidx/compose/ui/inspection/framework/JavaExtensions.kt
index 0091ac6..9a32c00 100644
--- a/compose/ui/ui-inspection/src/main/java/androidx/compose/ui/inspection/framework/JavaExtensions.kt
+++ b/compose/ui/ui-inspection/src/main/java/androidx/compose/ui/inspection/framework/JavaExtensions.kt
@@ -22,9 +22,7 @@
     get() {
         val sb = StringBuilder()
         sb.append(name).append('(')
-        parameterTypes.forEach {
-            sb.append(it.signature)
-        }
+        parameterTypes.forEach { sb.append(it.signature) }
         sb.append(')').append(returnType.signature)
         return sb.toString()
     }
diff --git a/compose/ui/ui-inspection/src/main/java/androidx/compose/ui/inspection/framework/ViewExtensions.kt b/compose/ui/ui-inspection/src/main/java/androidx/compose/ui/inspection/framework/ViewExtensions.kt
index d9e481d..447a9d3 100644
--- a/compose/ui/ui-inspection/src/main/java/androidx/compose/ui/inspection/framework/ViewExtensions.kt
+++ b/compose/ui/ui-inspection/src/main/java/androidx/compose/ui/inspection/framework/ViewExtensions.kt
@@ -29,15 +29,11 @@
     return (0 until childCount).map { i -> getChildAt(i) }
 }
 
-fun View.ancestors(): Sequence<View> =
-    generateSequence(this) { it.parent as? View }
+fun View.ancestors(): Sequence<View> = generateSequence(this) { it.parent as? View }
 
-fun View.isRoot(): Boolean =
-    parent as? View == null
+fun View.isRoot(): Boolean = parent as? View == null
 
-/**
- * Return a list of this view and all its children in depth-first order
- */
+/** Return a list of this view and all its children in depth-first order */
 fun View.flatten(): Sequence<View> {
     ThreadUtils.assertOnMainThread()
 
@@ -52,8 +48,8 @@
 }
 
 /**
- * Returns true if this view represents a special type that bridges between the legacy UI
- * framework and Jetpack Compose.
+ * Returns true if this view represents a special type that bridges between the legacy UI framework
+ * and Jetpack Compose.
  *
  * Note: AndroidComposeView lives in compose.ui but is internal, which is why we need to check
  * indirectly like this. TODO(b/177998085): Expose this class to our library.
@@ -62,15 +58,11 @@
     return javaClass.canonicalName == "androidx.compose.ui.platform.AndroidComposeView"
 }
 
-/**
- * Return true if this view already has a slot table.
- */
+/** Return true if this view already has a slot table. */
 val View.hasSlotTable: Boolean
     get() = getTag(R.id.inspection_slot_table_set) is Set<*>
 
-/**
- * Adds a slot table to this view. Return 1 if added, 0 if not.
- */
+/** Adds a slot table to this view. Return 1 if added, 0 if not. */
 fun View.addSlotTable(): Int {
     if (hasSlotTable) {
         return 0
diff --git a/compose/ui/ui-inspection/src/main/java/androidx/compose/ui/inspection/inspector/InlineClassConverter.kt b/compose/ui/ui-inspection/src/main/java/androidx/compose/ui/inspection/inspector/InlineClassConverter.kt
index 6776f19..87abf88 100644
--- a/compose/ui/ui-inspection/src/main/java/androidx/compose/ui/inspection/inspector/InlineClassConverter.kt
+++ b/compose/ui/ui-inspection/src/main/java/androidx/compose/ui/inspection/inspector/InlineClassConverter.kt
@@ -27,9 +27,7 @@
     // Return value used in functions
     private val notInlineType: (Any) -> Any = { it }
 
-    /**
-     * Clear any cached data.
-     */
+    /** Clear any cached data. */
     fun clear() {
         typeMap.clear()
     }
@@ -41,8 +39,8 @@
      * @param value the value to convert to an instance of [inlineClassName].
      */
     fun castParameterValue(inlineClassName: String?, value: Any?): Any? =
-        if (value != null && inlineClassName != null)
-            typeMapperFor(inlineClassName)(value) else value
+        if (value != null && inlineClassName != null) typeMapperFor(inlineClassName)(value)
+        else value
 
     private fun typeMapperFor(typeName: String): (Any) -> (Any) =
         typeMap.getOrPut(typeName) { loadTypeMapper(typeName.replace('.', '/')) }
diff --git a/compose/ui/ui-inspection/src/main/java/androidx/compose/ui/inspection/inspector/InspectorNode.kt b/compose/ui/ui-inspection/src/main/java/androidx/compose/ui/inspection/inspector/InspectorNode.kt
index 2dd9d34..cfd50d8 100644
--- a/compose/ui/ui-inspection/src/main/java/androidx/compose/ui/inspection/inspector/InspectorNode.kt
+++ b/compose/ui/ui-inspection/src/main/java/androidx/compose/ui/inspection/inspector/InspectorNode.kt
@@ -24,37 +24,28 @@
 internal val emptyBox = IntRect(0, 0, 0, 0)
 internal val outsideBox = IntRect(Int.MAX_VALUE, Int.MIN_VALUE, Int.MAX_VALUE, Int.MIN_VALUE)
 
-/**
- * Node representing a Composable for the Layout Inspector.
- */
-class InspectorNode internal constructor(
-    /**
-     * The associated render node id or 0.
-     */
+/** Node representing a Composable for the Layout Inspector. */
+class InspectorNode
+internal constructor(
+    /** The associated render node id or 0. */
     val id: Long,
 
-    /**
-     * The associated key for tracking recomposition counts.
-     */
+    /** The associated key for tracking recomposition counts. */
     val key: Int,
 
     /**
      * The id of the associated anchor for tracking recomposition counts.
      *
-     * An Anchor is a mechanism in the compose runtime that can identify a Group
-     * in the SlotTable that is invariant to SlotTable updates.
-     * See [androidx.compose.runtime.Anchor] for more information.
+     * An Anchor is a mechanism in the compose runtime that can identify a Group in the SlotTable
+     * that is invariant to SlotTable updates. See [androidx.compose.runtime.Anchor] for more
+     * information.
      */
     val anchorId: Int,
 
-    /**
-     * The name of the Composable.
-     */
+    /** The name of the Composable. */
     val name: String,
 
-    /**
-     * The fileName where the Composable was called.
-     */
+    /** The fileName where the Composable was called. */
     val fileName: String,
 
     /**
@@ -62,7 +53,7 @@
      *
      * This hash is calculated by,
      *
-     *   `packageName.fold(0) { hash, current -> hash * 31 + current.toInt() }?.absoluteValue`
+     * `packageName.fold(0) { hash, current -> hash * 31 + current.toInt() }?.absoluteValue`
      *
      * where the package name is the dotted name of the package. This can be used to disambiguate
      * which file is referenced by [fileName]. This number is -1 if there was no package hash
@@ -70,90 +61,61 @@
      */
     val packageHash: Int,
 
-    /**
-     * The line number where the Composable was called.
-     */
+    /** The line number where the Composable was called. */
     val lineNumber: Int,
 
-    /**
-     * The UTF-16 offset in the file where the Composable was called
-     */
+    /** The UTF-16 offset in the file where the Composable was called */
     val offset: Int,
 
-    /**
-     * The number of UTF-16 code point comprise the Composable call
-     */
+    /** The number of UTF-16 code point comprise the Composable call */
     val length: Int,
 
-    /**
-     * The bounding box of the Composable.
-     */
+    /** The bounding box of the Composable. */
     internal val box: IntRect,
 
-    /**
-     * The 4 corners of the polygon after transformations of the original rectangle.
-     */
+    /** The 4 corners of the polygon after transformations of the original rectangle. */
     val bounds: QuadBounds? = null,
 
-    /**
-     * True if the code for the Composable was inlined
-     */
+    /** True if the code for the Composable was inlined */
     val inlined: Boolean = false,
 
-    /**
-     * The parameters of this Composable.
-     */
+    /** The parameters of this Composable. */
     val parameters: List<RawParameter>,
 
-    /**
-     * The id of a android View embedded under this node.
-     */
+    /** The id of a android View embedded under this node. */
     val viewId: Long,
 
-    /**
-     * The merged semantics information of this Composable.
-     */
+    /** The merged semantics information of this Composable. */
     val mergedSemantics: List<RawParameter>,
 
-    /**
-     * The un-merged semantics information of this Composable.
-     */
+    /** The un-merged semantics information of this Composable. */
     val unmergedSemantics: List<RawParameter>,
 
-    /**
-     * The children nodes of this Composable.
-     */
+    /** The children nodes of this Composable. */
     val children: List<InspectorNode>
 ) {
-    /**
-     * Left side of the Composable in pixels.
-     */
+    /** Left side of the Composable in pixels. */
     val left: Int
-      get() = box.left
+        get() = box.left
 
-    /**
-     * Top of the Composable in pixels.
-     */
+    /** Top of the Composable in pixels. */
     val top: Int
-      get() = box.top
+        get() = box.top
 
-    /**
-     * Width of the Composable in pixels.
-     */
+    /** Width of the Composable in pixels. */
     val width: Int
-      get() = box.width
+        get() = box.width
 
-    /**
-     * Width of the Composable in pixels.
-     */
+    /** Width of the Composable in pixels. */
     val height: Int
-      get() = box.height
+        get() = box.height
 
-    fun parametersByKind(kind: ParameterKind): List<RawParameter> = when (kind) {
-        ParameterKind.Normal -> parameters
-        ParameterKind.MergedSemantics -> mergedSemantics
-        ParameterKind.UnmergedSemantics -> unmergedSemantics
-    }
+    fun parametersByKind(kind: ParameterKind): List<RawParameter> =
+        when (kind) {
+            ParameterKind.Normal -> parameters
+            ParameterKind.MergedSemantics -> mergedSemantics
+            ParameterKind.UnmergedSemantics -> unmergedSemantics
+        }
 }
 
 data class QuadBounds(
@@ -166,21 +128,26 @@
     val x3: Int,
     val y3: Int,
 ) {
-    val xMin: Int get() = sequenceOf(x0, x1, x2, x3).minOrNull()!!
-    val xMax: Int get() = sequenceOf(x0, x1, x2, x3).maxOrNull()!!
-    val yMin: Int get() = sequenceOf(y0, y1, y2, y3).minOrNull()!!
-    val yMax: Int get() = sequenceOf(y0, y1, y2, y3).maxOrNull()!!
-    val outerBox: IntRect get() = IntRect(xMin, yMin, xMax, yMax)
+    val xMin: Int
+        get() = sequenceOf(x0, x1, x2, x3).minOrNull()!!
+
+    val xMax: Int
+        get() = sequenceOf(x0, x1, x2, x3).maxOrNull()!!
+
+    val yMin: Int
+        get() = sequenceOf(y0, y1, y2, y3).minOrNull()!!
+
+    val yMax: Int
+        get() = sequenceOf(y0, y1, y2, y3).maxOrNull()!!
+
+    val outerBox: IntRect
+        get() = IntRect(xMin, yMin, xMax, yMax)
 }
 
-/**
- * Parameter definition with a raw value reference.
- */
+/** Parameter definition with a raw value reference. */
 class RawParameter(val name: String, val value: Any?)
 
-/**
- * Mutable version of [InspectorNode].
- */
+/** Mutable version of [InspectorNode]. */
 internal class MutableInspectorNode {
     var id = UNDEFINED_ID
     var key = 0
@@ -250,8 +217,20 @@
 
     fun build(withSemantics: Boolean = true): InspectorNode =
         InspectorNode(
-            id, key, anchorId, name, fileName, packageHash, lineNumber, offset, length,
-            box, bounds, inlined, parameters.toList(), viewId,
+            id,
+            key,
+            anchorId,
+            name,
+            fileName,
+            packageHash,
+            lineNumber,
+            offset,
+            length,
+            box,
+            bounds,
+            inlined,
+            parameters.toList(),
+            viewId,
             if (withSemantics) mergedSemantics.toList() else emptyList(),
             if (withSemantics) unmergedSemantics.toList() else emptyList(),
             children.toList()
diff --git a/compose/ui/ui-inspection/src/main/java/androidx/compose/ui/inspection/inspector/LayoutInspectorTree.kt b/compose/ui/ui-inspection/src/main/java/androidx/compose/ui/inspection/inspector/LayoutInspectorTree.kt
index bf4d9e9..de2aa05 100644
--- a/compose/ui/ui-inspection/src/main/java/androidx/compose/ui/inspection/inspector/LayoutInspectorTree.kt
+++ b/compose/ui/ui-inspection/src/main/java/androidx/compose/ui/inspection/inspector/LayoutInspectorTree.kt
@@ -63,27 +63,24 @@
  *
  * The interval -10000..-2 is reserved for the generated ids.
  */
-@VisibleForTesting
-const val RESERVED_FOR_GENERATED_IDS = -10000L
+@VisibleForTesting const val RESERVED_FOR_GENERATED_IDS = -10000L
 const val PLACEHOLDER_ID = Long.MAX_VALUE
 
 private val emptySize = IntSize(0, 0)
 
-private val unwantedCalls = setOf(
-    "CompositionLocalProvider",
-    "Content",
-    "Inspectable",
-    "ProvideAndroidCompositionLocals",
-    "ProvideCommonCompositionLocals",
-)
+private val unwantedCalls =
+    setOf(
+        "CompositionLocalProvider",
+        "Content",
+        "Inspectable",
+        "ProvideAndroidCompositionLocals",
+        "ProvideCommonCompositionLocals",
+    )
 
-/**
- * Generator of a tree for the Layout Inspector.
- */
+/** Generator of a tree for the Layout Inspector. */
 @OptIn(UiToolingDataApi::class)
 class LayoutInspectorTree {
-    @Suppress("MemberVisibilityCanBePrivate")
-    var hideSystemNodes = true
+    @Suppress("MemberVisibilityCanBePrivate") var hideSystemNodes = true
     var includeNodesOutsizeOfWindow = true
     var includeAllParameters = true
     private var foundNode: InspectorNode? = null
@@ -109,16 +106,14 @@
     private val contextCache = ContextCache()
     private val anchorMap = AnchorMap()
 
-    /**
-     * Converts the [CompositionData] set held by [view] into a list of root nodes.
-     */
+    /** Converts the [CompositionData] set held by [view] into a list of root nodes. */
     fun convert(view: View): List<InspectorNode> {
         windowSize = IntSize(view.width, view.height)
         parameterFactory.density = Density(view.context)
         @Suppress("UNCHECKED_CAST")
-        val tables = view.getTag(R.id.inspection_slot_table_set) as?
-            Set<CompositionData>
-            ?: return emptyList()
+        val tables =
+            view.getTag(R.id.inspection_slot_table_set) as? Set<CompositionData>
+                ?: return emptyList()
         clear()
         collectSemantics(view)
         val result = convert(tables, view)
@@ -132,9 +127,8 @@
         val identity = anchorMap[anchorId] ?: return null
 
         @Suppress("UNCHECKED_CAST")
-        val tables = view.getTag(R.id.inspection_slot_table_set) as?
-            Set<CompositionData>
-            ?: return null
+        val tables =
+            view.getTag(R.id.inspection_slot_table_set) as? Set<CompositionData> ?: return null
         val node = newNode().apply { this.anchorId = anchorId }
         val group = tables.firstNotNullOfOrNull { it.find(identity) } ?: return null
         group.findParameters(contextCache).forEach {
@@ -153,8 +147,8 @@
         subCompositions.addRoot(view, nodes)
 
     /**
-     * Extract the merged semantics for this semantics owner such that they can be added
-     * to compose nodes during the conversion of Group nodes.
+     * Extract the merged semantics for this semantics owner such that they can be added to compose
+     * nodes during the conversion of Group nodes.
      */
     private fun collectSemantics(view: View) {
         val root = view as? RootForTest ?: return
@@ -168,9 +162,7 @@
         }
     }
 
-    /**
-     * Converts the [RawParameter]s of the [node] into displayable parameters.
-     */
+    /** Converts the [RawParameter]s of the [node] into displayable parameters. */
     fun convertParameters(
         rootId: Long,
         node: InspectorNode,
@@ -195,9 +187,9 @@
     }
 
     /**
-     * Converts a part of the [RawParameter] identified by [reference] into a
-     * displayable parameter. If the parameter is some sort of a collection
-     * then [startIndex] and [maxElements] describes the scope of the data returned.
+     * Converts a part of the [RawParameter] identified by [reference] into a displayable parameter.
+     * If the parameter is some sort of a collection then [startIndex] and [maxElements] describes
+     * the scope of the data returned.
      */
     fun expandParameter(
         rootId: Long,
@@ -227,9 +219,7 @@
         )
     }
 
-    /**
-     * Reset any state accumulated between windows.
-     */
+    /** Reset any state accumulated between windows. */
     @Suppress("unused")
     fun resetAccumulativeState() {
         subCompositions.resetAccumulativeState()
@@ -263,9 +253,9 @@
     /**
      * Stitch separate trees together using the [LayoutInfo]s found in the [CompositionData]s.
      *
-     * Some constructs in Compose (e.g. ModalDrawer) will result is multiple
-     * [CompositionData]s. This code will attempt to stitch the resulting [InspectorNode] trees
-     * together by looking at the parent of each [LayoutInfo].
+     * Some constructs in Compose (e.g. ModalDrawer) will result is multiple [CompositionData]s.
+     * This code will attempt to stitch the resulting [InspectorNode] trees together by looking at
+     * the parent of each [LayoutInfo].
      *
      * If this algorithm is successful the result of this function will be a list with a single
      * tree.
@@ -275,10 +265,12 @@
         trees.forEach { tree -> tree.layoutNodes.forEach { layoutToTreeMap[it] = tree } }
         trees.forEach { tree ->
             val layout = tree.layoutNodes.lastOrNull()
-            val parentLayout = generateSequence(layout) { it.parentInfo }.firstOrNull {
-                val otherTree = layoutToTreeMap[it]
-                otherTree != null && otherTree != tree
-            }
+            val parentLayout =
+                generateSequence(layout) { it.parentInfo }
+                    .firstOrNull {
+                        val otherTree = layoutToTreeMap[it]
+                        otherTree != null && otherTree != tree
+                    }
             if (parentLayout != null) {
                 val ownerNode = claimedNodes[parentLayout]
                 val ownerTree = layoutToTreeMap[parentLayout]
@@ -300,13 +292,15 @@
     }
 
     /**
-     * Return a parent tree where the children trees (to be stitched under the parent) are not
-     * a parent themselves. Do this to avoid rebuilding the same tree more than once.
+     * Return a parent tree where the children trees (to be stitched under the parent) are not a
+     * parent themselves. Do this to avoid rebuilding the same tree more than once.
      */
     private fun findDeepParentTree(): MutableInspectorNode? =
-        treeMap.entries.asSequence()
+        treeMap.entries
+            .asSequence()
             .filter { (_, children) -> children.none { treeMap.containsKey(it) } }
-            .firstOrNull()?.key
+            .firstOrNull()
+            ?.key
 
     private fun addSubTrees(tree: MutableInspectorNode) {
         for ((index, child) in tree.children.withIndex()) {
@@ -315,9 +309,9 @@
     }
 
     /**
-     * Rebuild [node] with any possible sub trees added (stitched in).
-     * Return the rebuild node, or null if no changes were found in this node or its children.
-     * Lazily allocate the new node to avoid unnecessary allocations.
+     * Rebuild [node] with any possible sub trees added (stitched in). Return the rebuild node, or
+     * null if no changes were found in this node or its children. Lazily allocate the new node to
+     * avoid unnecessary allocations.
      */
     private fun addSubTrees(node: InspectorNode): InspectorNode? {
         var newNode: MutableInspectorNode? = null
@@ -342,8 +336,8 @@
     }
 
     /**
-     * Add [tree] to the end of the [out] list.
-     * The root nodes of [tree] may be a fake node that hold a list of [LayoutInfo].
+     * Add [tree] to the end of the [out] list. The root nodes of [tree] may be a fake node that
+     * hold a list of [LayoutInfo].
      */
     private fun addTree(
         out: MutableList<InspectorNode>,
@@ -378,9 +372,9 @@
     }
 
     /**
-     * Adds the nodes in [input] to the children of [parentNode].
-     * Nodes without a reference to a wanted Composable are skipped unless [buildFakeChildNodes].
-     * A single skipped render id and layoutNode will be added to [parentNode].
+     * Adds the nodes in [input] to the children of [parentNode]. Nodes without a reference to a
+     * wanted Composable are skipped unless [buildFakeChildNodes]. A single skipped render id and
+     * layoutNode will be added to [parentNode].
      */
     private fun addToParent(
         parentNode: MutableInspectorNode,
@@ -394,14 +388,13 @@
         // and the desired node that the View should be associated with in the inspector. If
         // there's more than one input node with a View ID, we skip this step since it's
         // unclear how these views would be related.
-        input.singleOrNull { it.viewId != UNDEFINED_ID }
+        input
+            .singleOrNull { it.viewId != UNDEFINED_ID }
             ?.takeIf { node ->
                 // Take if the node has been marked as unwanted
                 node.id == UNDEFINED_ID
             }
-            ?.let { nodeWithView ->
-                parentNode.viewId = nodeWithView.viewId
-            }
+            ?.let { nodeWithView -> parentNode.viewId = nodeWithView.viewId }
 
         var id: Long? = null
         input.forEach { node ->
@@ -453,9 +446,7 @@
         // will be the view itself, but we want to use the `AndroidViewHolder` that hosts the view
         // instead of the view directly.
         (group.node as? InteroperableComposeUiNode?)?.getInteropView()?.let { interopView ->
-            (interopView.parent as? View)?.uniqueDrawingId?.let { viewId ->
-                node.viewId = viewId
-            }
+            (interopView.parent as? View)?.uniqueDrawingId?.let { viewId -> node.viewId = viewId }
         }
 
         val layoutInfo = group.node as? LayoutInfo
@@ -514,17 +505,27 @@
                 toIntOffset(coordinates.localToWindow(Offset(size.width, size.height)))
             val bottomLeft = toIntOffset(coordinates.localToWindow(Offset(0f, size.height)))
 
-            if (topLeft.x != box.left || topLeft.y != box.top ||
-                topRight.x != box.right || topRight.y != box.top ||
-                bottomRight.x != box.right || bottomRight.y != box.bottom ||
-                bottomLeft.x != box.left || bottomLeft.y != box.bottom
+            if (
+                topLeft.x != box.left ||
+                    topLeft.y != box.top ||
+                    topRight.x != box.right ||
+                    topRight.y != box.top ||
+                    bottomRight.x != box.right ||
+                    bottomRight.y != box.bottom ||
+                    bottomLeft.x != box.left ||
+                    bottomLeft.y != box.bottom
             ) {
-                bounds = QuadBounds(
-                    topLeft.x, topLeft.y,
-                    topRight.x, topRight.y,
-                    bottomRight.x, bottomRight.y,
-                    bottomLeft.x, bottomLeft.y,
-                )
+                bounds =
+                    QuadBounds(
+                        topLeft.x,
+                        topLeft.y,
+                        topRight.x,
+                        topRight.y,
+                        bottomRight.x,
+                        bottomRight.y,
+                        bottomLeft.x,
+                        bottomLeft.y,
+                    )
             }
         }
         if (!includeNodesOutsizeOfWindow) {
@@ -550,11 +551,13 @@
             node.mergedSemantics.addAll(mergedSemantics)
         }
 
-        node.id = modifierInfo.asSequence()
-            .map { it.extra }
-            .filterIsInstance<GraphicLayerInfo>()
-            .map { it.layerId }
-            .firstOrNull() ?: UNDEFINED_ID
+        node.id =
+            modifierInfo
+                .asSequence()
+                .map { it.extra }
+                .filterIsInstance<GraphicLayerInfo>()
+                .map { it.layerId }
+                .firstOrNull() ?: UNDEFINED_ID
 
         return node
     }
@@ -570,9 +573,9 @@
     /**
      * Returns true if the [layoutNodes] belong under the specified [view].
      *
-     * For: popups & Dialogs we may encounter parts of a compose tree that belong under
-     * a different sub-composition. Consider these nodes to "belong" to the current sub-composition
-     * under [view] if the ownerViews contains [view] or doesn't contain any owner views at all.
+     * For: popups & Dialogs we may encounter parts of a compose tree that belong under a different
+     * sub-composition. Consider these nodes to "belong" to the current sub-composition under [view]
+     * if the ownerViews contains [view] or doesn't contain any owner views at all.
      */
     private fun belongsToView(layoutNodes: List<LayoutInfo>, view: View): Boolean {
         val ownerViewIds = ownerViews(layoutNodes)
@@ -605,8 +608,7 @@
         return inlineClassConverter.castParameterValue(parameter.inlineClass, value)
     }
 
-    private fun isPrimitive(cls: Class<*>): Boolean =
-        cls.kotlin.javaPrimitiveType != null
+    private fun isPrimitive(cls: Class<*>): Boolean = cls.kotlin.javaPrimitiveType != null
 
     private fun toIntOffset(offset: Offset): IntOffset =
         IntOffset(offset.x.roundToInt(), offset.y.roundToInt())
@@ -619,10 +621,8 @@
         when (node.name) {
             "rememberCompositionContext" ->
                 subCompositions.rememberCompositionContext(node, context)
-            "remember" ->
-                subCompositions.remember(node, group)
-            else ->
-                node.apply { markUnwanted() }
+            "remember" -> subCompositions.remember(node, group)
+            else -> node.apply { markUnwanted() }
         }
 
     private fun parseCallLocation(node: MutableInspectorNode, location: SourceLocation?) {
@@ -638,9 +638,7 @@
         node.packageHash in systemPackages && hideSystemNodes
 
     private fun unwantedName(name: String): Boolean =
-        name.isEmpty() ||
-            name.startsWith("remember") ||
-            name in unwantedCalls
+        name.isEmpty() || name.startsWith("remember") || name in unwantedCalls
 
     private fun unwantedOutsideWindow(
         node: MutableInspectorNode,
@@ -649,8 +647,9 @@
         if (includeNodesOutsizeOfWindow) {
             return false
         }
-        node.outerBox = if (children.isEmpty()) outsideBox else
-            children.map { g -> g.outerBox }.reduce { acc, box -> box.union(acc) }
+        node.outerBox =
+            if (children.isEmpty()) outsideBox
+            else children.map { g -> g.outerBox }.reduce { acc, box -> box.union(acc) }
         return !node.outerBox.inWindow()
     }
 
@@ -675,19 +674,17 @@
      * Keep track of sub-composition roots.
      *
      * Examples:
-     * - Popup, Dialog: When one of these is open an extra Android Window is created with
-     *   its own AndroidComposeView. The contents of the Composable is a sub-composition that
-     *   will be computed by calling convert.
+     * - Popup, Dialog: When one of these is open an extra Android Window is created with its own
+     *   AndroidComposeView. The contents of the Composable is a sub-composition that will be
+     *   computed by calling convert.
      *
-     *   The Popup/Dialog composable itself, and a few helping composables (the root) will
-     *   not be included in the SlotTree with the contents, instead these composables
-     *   will be found in the SlotTree for the main app and they all have empty sizes.
-     *   The aim is to collect these sub-composition roots such that they can be added to
-     *   the [InspectorNode]s of the contents.
-     *
-     * - AndroidView: When this is used in a compose app we will see a similar pattern in
-     *   the SlotTree except there isn't a sub-composition to stitch in. But we need to
-     *   collect the view id separately from the "AndroidView" node itself.
+     *   The Popup/Dialog composable itself, and a few helping composables (the root) will not be
+     *   included in the SlotTree with the contents, instead these composables will be found in the
+     *   SlotTree for the main app and they all have empty sizes. The aim is to collect these
+     *   sub-composition roots such that they can be added to the [InspectorNode]s of the contents.
+     * - AndroidView: When this is used in a compose app we will see a similar pattern in the
+     *   SlotTree except there isn't a sub-composition to stitch in. But we need to collect the view
+     *   id separately from the "AndroidView" node itself.
      */
     private inner class SubCompositionRoots {
         /** Set to true when the nodes found should be added to a sub-composition root */
@@ -709,8 +706,8 @@
         /**
          * The sub-composition roots found.
          *
-         * Map from View owner to a pair of [InspectorNode] indicating the actual root,
-         * and the node where the content should be stitched in.
+         * Map from View owner to a pair of [InspectorNode] indicating the actual root, and the node
+         * where the content should be stitched in.
          */
         private val found = mutableLongObjectMapOf<InspectorNode>()
 
@@ -730,9 +727,9 @@
         }
 
         /**
-         * When a "rememberCompositionContext" is found in the slot tree, it indicates
-         * that a sub-composition was started. We should capture all parent nodes with
-         * an empty size as the "root" of the sub-composition.
+         * When a "rememberCompositionContext" is found in the slot tree, it indicates that a
+         * sub-composition was started. We should capture all parent nodes with an empty size as the
+         * "root" of the sub-composition.
          */
         fun rememberCompositionContext(
             node: MutableInspectorNode,
@@ -749,8 +746,8 @@
         }
 
         /**
-         * When "remember" is found in the slot tree and we are currently capturing,
-         * the data of the [group] may contain the owner of the sub-composition.
+         * When "remember" is found in the slot tree and we are currently capturing, the data of the
+         * [group] may contain the owner of the sub-composition.
          */
         fun remember(node: MutableInspectorNode, group: CompositionGroup): MutableInspectorNode {
             node.markUnwanted()
@@ -774,14 +771,14 @@
         }
 
         private fun findSingleRootInGroupData(group: CompositionGroup): ViewRootForInspector? {
-            group.data.filterIsInstance<ViewRootForInspector>().singleOrNull()?.let { return it }
+            group.data.filterIsInstance<ViewRootForInspector>().singleOrNull()?.let {
+                return it
+            }
             val refs = group.data.filterIsInstance<Ref<*>>().map { it.value }
             return refs.filterIsInstance<ViewRootForInspector>().singleOrNull()
         }
 
-        /**
-         * Capture the top node of the sub-composition root until a non empty node is found.
-         */
+        /** Capture the top node of the sub-composition root until a non empty node is found. */
         fun captureNode(node: MutableInspectorNode, context: SourceContext) {
             if (!capturing) {
                 return
@@ -803,9 +800,7 @@
             return id
         }
 
-        /**
-         * If a sub-composition root has been captured, save it now.
-         */
+        /** If a sub-composition root has been captured, save it now. */
         private fun save() {
             val node = rootNode
             if (node != null && ownerView != UNDEFINED_ID) {
diff --git a/compose/ui/ui-inspection/src/main/java/androidx/compose/ui/inspection/inspector/NodeParameter.kt b/compose/ui/ui-inspection/src/main/java/androidx/compose/ui/inspection/inspector/NodeParameter.kt
index 5cee350..a2e6657 100644
--- a/compose/ui/ui-inspection/src/main/java/androidx/compose/ui/inspection/inspector/NodeParameter.kt
+++ b/compose/ui/ui-inspection/src/main/java/androidx/compose/ui/inspection/inspector/NodeParameter.kt
@@ -16,44 +16,29 @@
 
 package androidx.compose.ui.inspection.inspector
 
-/**
- * Holds data representing a Composable parameter for the Layout Inspector.
- */
-class NodeParameter internal constructor(
-    /**
-     * The name of the parameter.
-     */
+/** Holds data representing a Composable parameter for the Layout Inspector. */
+class NodeParameter
+internal constructor(
+    /** The name of the parameter. */
     val name: String,
 
-    /**
-     * The type of the parameter.
-     */
+    /** The type of the parameter. */
     val type: ParameterType,
 
-    /**
-     * The value of the parameter.
-     */
+    /** The value of the parameter. */
     val value: Any?
 ) {
-    /**
-     * Sub elements of the parameter.
-     */
+    /** Sub elements of the parameter. */
     val elements = mutableListOf<NodeParameter>()
 
-    /**
-     * Reference to value parameter.
-     */
+    /** Reference to value parameter. */
     var reference: NodeParameterReference? = null
 
-    /**
-     * The index into the composite parent parameter value.
-     */
+    /** The index into the composite parent parameter value. */
     var index = 0
 }
 
-/**
- * The type of a parameter.
- */
+/** The type of a parameter. */
 enum class ParameterType {
     String,
     Boolean,
diff --git a/compose/ui/ui-inspection/src/main/java/androidx/compose/ui/inspection/inspector/NodeParameterReference.kt b/compose/ui/ui-inspection/src/main/java/androidx/compose/ui/inspection/inspector/NodeParameterReference.kt
index 6644401..6caddf3 100644
--- a/compose/ui/ui-inspection/src/main/java/androidx/compose/ui/inspection/inspector/NodeParameterReference.kt
+++ b/compose/ui/ui-inspection/src/main/java/androidx/compose/ui/inspection/inspector/NodeParameterReference.kt
@@ -24,8 +24,8 @@
  * @param nodeId is the id of the node the parameter belongs to
  * @param anchorId is the anchor hash of the node the parameter belongs to
  * @param kind is this a reference to a normal, merged, or unmerged semantic parameter.
- * @param parameterIndex index into [InspectorNode.parameters], [InspectorNode.mergedSemantics],
- *        or [InspectorNode.unMergedSemantics]
+ * @param parameterIndex index into [InspectorNode.parameters], [InspectorNode.mergedSemantics], or
+ *   [InspectorNode.unMergedSemantics]
  * @param indices are indices into the composite parameter
  */
 class NodeParameterReference(
@@ -42,9 +42,7 @@
     }
 }
 
-/**
- * Identifies which kind of parameter the [NodeParameterReference] is a reference to.
- */
+/** Identifies which kind of parameter the [NodeParameterReference] is a reference to. */
 enum class ParameterKind {
     Normal,
     MergedSemantics,
diff --git a/compose/ui/ui-inspection/src/main/java/androidx/compose/ui/inspection/inspector/PackageHashes.kt b/compose/ui/ui-inspection/src/main/java/androidx/compose/ui/inspection/inspector/PackageHashes.kt
index 5f903e4..f1eff7c 100644
--- a/compose/ui/ui-inspection/src/main/java/androidx/compose/ui/inspection/inspector/PackageHashes.kt
+++ b/compose/ui/ui-inspection/src/main/java/androidx/compose/ui/inspection/inspector/PackageHashes.kt
@@ -10,65 +10,66 @@
 fun packageNameHash(packageName: String) =
     packageName.fold(0) { hash, char -> hash * 31 + char.code }.absoluteValue
 
-val systemPackages = intSetOf(
-    -1,
-    packageNameHash("androidx.compose.animation"),
-    packageNameHash("androidx.compose.animation.core"),
-    packageNameHash("androidx.compose.animation.graphics.vector"),
-    packageNameHash("androidx.compose.desktop"),
-    packageNameHash("androidx.compose.foundation"),
-    packageNameHash("androidx.compose.foundation.gestures"),
-    packageNameHash("androidx.compose.foundation.gestures.snapping"),
-    packageNameHash("androidx.compose.foundation.interaction"),
-    packageNameHash("androidx.compose.foundation.layout"),
-    packageNameHash("androidx.compose.foundation.lazy"),
-    packageNameHash("androidx.compose.foundation.lazy.grid"),
-    packageNameHash("androidx.compose.foundation.lazy.layout"),
-    packageNameHash("androidx.compose.foundation.lazy.staggeredgrid"),
-    packageNameHash("androidx.compose.foundation.pager"),
-    packageNameHash("androidx.compose.foundation.text"),
-    packageNameHash("androidx.compose.foundation.text.input"),
-    packageNameHash("androidx.compose.foundation.text.selection"),
-    packageNameHash("androidx.compose.foundation.window"),
-    packageNameHash("androidx.compose.material"),
-    packageNameHash("androidx.compose.material.internal"),
-    packageNameHash("androidx.compose.material.navigation"),
-    packageNameHash("androidx.compose.material.pullrefresh"),
-    packageNameHash("androidx.compose.material.ripple"),
-    packageNameHash("androidx.compose.material3"),
-    packageNameHash("androidx.compose.material3.adaptive"),
-    packageNameHash("androidx.compose.material3.adaptive.layout"),
-    packageNameHash("androidx.compose.material3.adaptive.navigation"),
-    packageNameHash("androidx.compose.material3.adaptive.navigationsuite"),
-    packageNameHash("androidx.compose.material3.carousel"),
-    packageNameHash("androidx.compose.material3.common"),
-    packageNameHash("androidx.compose.material3.internal"),
-    packageNameHash("androidx.compose.material3.pulltorefresh"),
-    packageNameHash("androidx.compose.material3.windowsizeclass"),
-    packageNameHash("androidx.compose.runtime"),
-    packageNameHash("androidx.compose.runtime.internal"),
-    packageNameHash("androidx.compose.runtime.livedata"),
-    packageNameHash("androidx.compose.runtime.mock"),
-    packageNameHash("androidx.compose.runtime.reflect"),
-    packageNameHash("androidx.compose.runtime.rxjava2"),
-    packageNameHash("androidx.compose.runtime.rxjava3"),
-    packageNameHash("androidx.compose.runtime.saveable"),
-    packageNameHash("androidx.compose.ui"),
-    packageNameHash("androidx.compose.ui.awt"),
-    packageNameHash("androidx.compose.ui.draw"),
-    packageNameHash("androidx.compose.ui.graphics"),
-    packageNameHash("androidx.compose.ui.graphics.benchmark"),
-    packageNameHash("androidx.compose.ui.graphics.vector"),
-    packageNameHash("androidx.compose.ui.layout"),
-    packageNameHash("androidx.compose.ui.platform"),
-    packageNameHash("androidx.compose.ui.text"),
-    packageNameHash("androidx.compose.ui.util"),
-    packageNameHash("androidx.compose.ui.viewinterop"),
-    packageNameHash("androidx.compose.ui.window"),
-    packageNameHash("androidx.navigation.compose"),
-    packageNameHash("androidx.wear.compose.foundation"),
-    packageNameHash("androidx.wear.compose.material"),
-    packageNameHash("androidx.wear.compose.material3"),
-    packageNameHash("androidx.wear.compose.materialcore"),
-    packageNameHash("androidx.wear.compose.navigation"),
-)
+val systemPackages =
+    intSetOf(
+        -1,
+        packageNameHash("androidx.compose.animation"),
+        packageNameHash("androidx.compose.animation.core"),
+        packageNameHash("androidx.compose.animation.graphics.vector"),
+        packageNameHash("androidx.compose.desktop"),
+        packageNameHash("androidx.compose.foundation"),
+        packageNameHash("androidx.compose.foundation.gestures"),
+        packageNameHash("androidx.compose.foundation.gestures.snapping"),
+        packageNameHash("androidx.compose.foundation.interaction"),
+        packageNameHash("androidx.compose.foundation.layout"),
+        packageNameHash("androidx.compose.foundation.lazy"),
+        packageNameHash("androidx.compose.foundation.lazy.grid"),
+        packageNameHash("androidx.compose.foundation.lazy.layout"),
+        packageNameHash("androidx.compose.foundation.lazy.staggeredgrid"),
+        packageNameHash("androidx.compose.foundation.pager"),
+        packageNameHash("androidx.compose.foundation.text"),
+        packageNameHash("androidx.compose.foundation.text.input"),
+        packageNameHash("androidx.compose.foundation.text.selection"),
+        packageNameHash("androidx.compose.foundation.window"),
+        packageNameHash("androidx.compose.material"),
+        packageNameHash("androidx.compose.material.internal"),
+        packageNameHash("androidx.compose.material.navigation"),
+        packageNameHash("androidx.compose.material.pullrefresh"),
+        packageNameHash("androidx.compose.material.ripple"),
+        packageNameHash("androidx.compose.material3"),
+        packageNameHash("androidx.compose.material3.adaptive"),
+        packageNameHash("androidx.compose.material3.adaptive.layout"),
+        packageNameHash("androidx.compose.material3.adaptive.navigation"),
+        packageNameHash("androidx.compose.material3.adaptive.navigationsuite"),
+        packageNameHash("androidx.compose.material3.carousel"),
+        packageNameHash("androidx.compose.material3.common"),
+        packageNameHash("androidx.compose.material3.internal"),
+        packageNameHash("androidx.compose.material3.pulltorefresh"),
+        packageNameHash("androidx.compose.material3.windowsizeclass"),
+        packageNameHash("androidx.compose.runtime"),
+        packageNameHash("androidx.compose.runtime.internal"),
+        packageNameHash("androidx.compose.runtime.livedata"),
+        packageNameHash("androidx.compose.runtime.mock"),
+        packageNameHash("androidx.compose.runtime.reflect"),
+        packageNameHash("androidx.compose.runtime.rxjava2"),
+        packageNameHash("androidx.compose.runtime.rxjava3"),
+        packageNameHash("androidx.compose.runtime.saveable"),
+        packageNameHash("androidx.compose.ui"),
+        packageNameHash("androidx.compose.ui.awt"),
+        packageNameHash("androidx.compose.ui.draw"),
+        packageNameHash("androidx.compose.ui.graphics"),
+        packageNameHash("androidx.compose.ui.graphics.benchmark"),
+        packageNameHash("androidx.compose.ui.graphics.vector"),
+        packageNameHash("androidx.compose.ui.layout"),
+        packageNameHash("androidx.compose.ui.platform"),
+        packageNameHash("androidx.compose.ui.text"),
+        packageNameHash("androidx.compose.ui.util"),
+        packageNameHash("androidx.compose.ui.viewinterop"),
+        packageNameHash("androidx.compose.ui.window"),
+        packageNameHash("androidx.navigation.compose"),
+        packageNameHash("androidx.wear.compose.foundation"),
+        packageNameHash("androidx.wear.compose.material"),
+        packageNameHash("androidx.wear.compose.material3"),
+        packageNameHash("androidx.wear.compose.materialcore"),
+        packageNameHash("androidx.wear.compose.navigation"),
+    )
diff --git a/compose/ui/ui-inspection/src/main/java/androidx/compose/ui/inspection/inspector/ParameterFactory.kt b/compose/ui/ui-inspection/src/main/java/androidx/compose/ui/inspection/inspector/ParameterFactory.kt
index 0e8eb42..7be09b9 100644
--- a/compose/ui/ui-inspection/src/main/java/androidx/compose/ui/inspection/inspector/ParameterFactory.kt
+++ b/compose/ui/ui-inspection/src/main/java/androidx/compose/ui/inspection/inspector/ParameterFactory.kt
@@ -71,19 +71,15 @@
  * Each parameter value is converted to a user readable value.
  */
 internal class ParameterFactory(private val inlineClassConverter: InlineClassConverter) {
-    /**
-     * A map from known values to a user readable string representation.
-     */
+    /** A map from known values to a user readable string representation. */
     private val valueLookup = mutableMapOf<Any, String>()
 
-    /**
-     * The classes we have loaded constants from.
-     */
+    /** The classes we have loaded constants from. */
     private val valuesLoaded = mutableSetOf<Class<*>>()
 
     /**
-     * Do not load constant names from instances of these classes.
-     * We prefer showing the raw values of Color and Dimensions.
+     * Do not load constant names from instances of these classes. We prefer showing the raw values
+     * of Color and Dimensions.
      */
     private val ignoredClasses = listOf(Color::class.java, Dp::class.java)
     private var creatorCache: ParameterCreator? = null
@@ -95,16 +91,14 @@
      * - kotlinx.coroutines.flow.StateFlowImpl
      * - androidx.compose.ui.node.LayoutNode
      */
-    private val ignoredPackagePrefixes = listOf(
-        "android.", "java.", "javax.", "kotlinx.", "androidx.compose.ui.node."
-    )
+    private val ignoredPackagePrefixes =
+        listOf("android.", "java.", "javax.", "kotlinx.", "androidx.compose.ui.node.")
 
     var density = Density(1.0f)
 
     init {
-        val textDecorationCombination = TextDecoration.combine(
-            listOf(TextDecoration.LineThrough, TextDecoration.Underline)
-        )
+        val textDecorationCombination =
+            TextDecoration.combine(listOf(TextDecoration.LineThrough, TextDecoration.Underline))
         valueLookup[textDecorationCombination] = "LineThrough+Underline"
         valueLookup[Color.Unspecified] = "Unspecified"
         valueLookup[RectangleShape] = "RectangleShape"
@@ -121,8 +115,8 @@
     /**
      * Create a [NodeParameter] from the specified parameter [name] and [value].
      *
-     * Attempt to convert the value to a user readable value.
-     * For now: return null when a conversion is not possible/found.
+     * Attempt to convert the value to a user readable value. For now: return null when a conversion
+     * is not possible/found.
      */
     fun create(
         rootId: Long,
@@ -207,8 +201,9 @@
     }
 
     private fun loadConstantsFrom(javaClass: Class<*>) {
-        if (valuesLoaded.contains(javaClass) ||
-            ignoredPackagePrefixes.any { javaClass.name.startsWith(it) }
+        if (
+            valuesLoaded.contains(javaClass) ||
+                ignoredPackagePrefixes.any { javaClass.name.startsWith(it) }
         ) {
             return
         }
@@ -220,19 +215,21 @@
         }
     }
 
-    private fun safeEnclosingClass(klass: Class<*>): Class<*>? = try {
-        klass.enclosingClass
-    } catch (_: Error) {
-        // Exceptions seen on API 23...
-        null
-    }
+    private fun safeEnclosingClass(klass: Class<*>): Class<*>? =
+        try {
+            klass.enclosingClass
+        } catch (_: Error) {
+            // Exceptions seen on API 23...
+            null
+        }
 
-    private fun findPackageLevelClass(javaClass: Class<*>): Class<*>? = try {
-        // Note: This doesn't work when @file.JvmName is specified
-        Class.forName("${javaClass.name}Kt")
-    } catch (ex: Throwable) {
-        null
-    }
+    private fun findPackageLevelClass(javaClass: Class<*>): Class<*>? =
+        try {
+            // Note: This doesn't work when @file.JvmName is specified
+            Class.forName("${javaClass.name}Kt")
+        } catch (ex: Throwable) {
+            null
+        }
 
     private fun loadConstantsFromEnclosedClasses(javaClass: Class<*>) {
         if (valuesLoaded.contains(javaClass)) {
@@ -252,7 +249,8 @@
     private fun loadConstantsFromObjectInstance(kClass: KClass<*>) {
         try {
             val instance = kClass.objectInstance ?: return
-            kClass.declaredMemberProperties.asSequence()
+            kClass.declaredMemberProperties
+                .asSequence()
                 .filter { it.isFinal && !it.isLateinit }
                 .mapNotNull { constantValueOf(it, instance)?.let { key -> Pair(key, it.name) } }
                 .filter { !ignoredValue(it.first) }
@@ -267,12 +265,13 @@
     /**
      * Load all constants from top level values from Java.
      *
-     * Exclude: primary types and types of ignoredClasses.
-     * Since this is Java, inline types will also (unfortunately) be excluded.
+     * Exclude: primary types and types of ignoredClasses. Since this is Java, inline types will
+     * also (unfortunately) be excluded.
      */
     private fun loadConstantsFromStaticFinal(javaClass: Class<*>) {
         try {
-            javaClass.declaredMethods.asSequence()
+            javaClass.declaredMethods
+                .asSequence()
                 .filter {
                     it.returnType != Void.TYPE &&
                         JavaModifier.isStatic(it.modifiers) &&
@@ -292,22 +291,27 @@
         }
     }
 
-    private fun constantValueOf(field: Field?): Any? = try {
-        field?.isAccessible = true
-        field?.get(null)
-    } catch (_: ReflectiveOperationException) {
-        // ignore reflection errors
-        null
-    }
+    private fun constantValueOf(field: Field?): Any? =
+        try {
+            field?.isAccessible = true
+            field?.get(null)
+        } catch (_: ReflectiveOperationException) {
+            // ignore reflection errors
+            null
+        }
 
-    private fun constantValueOf(property: KProperty1<out Any, *>, instance: Any): Any? = try {
-        val field = property.javaField
-        field?.isAccessible = true
-        inlineClassConverter.castParameterValue(inlineResultClass(property), field?.get(instance))
-    } catch (_: ReflectiveOperationException) {
-        // ignore reflection errors
-        null
-    }
+    private fun constantValueOf(property: KProperty1<out Any, *>, instance: Any): Any? =
+        try {
+            val field = property.javaField
+            field?.isAccessible = true
+            inlineClassConverter.castParameterValue(
+                inlineResultClass(property),
+                field?.get(instance)
+            )
+        } catch (_: ReflectiveOperationException) {
+            // ignore reflection errors
+            null
+        }
 
     private fun inlineResultClass(property: KProperty1<out Any, *>): String? {
         // The Java getter name will be mangled if it contains parameters of an inline class.
@@ -323,9 +327,7 @@
             ignoredClasses.any { ignored -> ignored.isInstance(value) } ||
             value::class.java.isPrimitive
 
-    /**
-     * Convenience class for building [NodeParameter]s.
-     */
+    /** Convenience class for building [NodeParameter]s. */
     private inner class ParameterCreator {
         private var rootId = 0L
         private var nodeId = 0L
@@ -354,7 +356,12 @@
         ): NodeParameter =
             try {
                 setup(
-                    rootId, nodeId, anchorId, kind, parameterIndex, maxRecursions,
+                    rootId,
+                    nodeId,
+                    anchorId,
+                    kind,
+                    parameterIndex,
+                    maxRecursions,
                     maxInitialIterableSize
                 )
                 create(name, value, null) ?: createEmptyParameter(name)
@@ -375,8 +382,13 @@
             maxInitialIterableSize: Int
         ): NodeParameter? {
             setup(
-                rootId, nodeId, anchorId, reference.kind, reference.parameterIndex,
-                maxRecursions, maxInitialIterableSize
+                rootId,
+                nodeId,
+                anchorId,
+                reference.kind,
+                reference.parameterIndex,
+                maxRecursions,
+                maxInitialIterableSize
             )
             var parent: Pair<String, Any?>? = null
             var new = Pair(name, value)
@@ -386,13 +398,18 @@
             }
             recursions = 0
             valueIndex.addAll(reference.indices)
-            val parameter = if (startIndex == 0) {
-                create(new.first, new.second, parent?.second)
-            } else {
-                createFromCompositeValue(
-                    new.first, new.second, parent?.second, startIndex, maxElements
-                )
-            }
+            val parameter =
+                if (startIndex == 0) {
+                    create(new.first, new.second, parent?.second)
+                } else {
+                    createFromCompositeValue(
+                        new.first,
+                        new.second,
+                        parent?.second,
+                        startIndex,
+                        maxElements
+                    )
+                }
             if (parameter == null && reference.indices.isEmpty()) {
                 return createEmptyParameter(name)
             }
@@ -422,16 +439,16 @@
             recursions = 0
             valueIndex.clear()
             valueLazyReferenceMap.clear()
-            valueIndexMap = rootValueIndexCache.getOrPut(newRootId) {
-                IdentityHashMap()
-            }
+            valueIndexMap = rootValueIndexCache.getOrPut(newRootId) { IdentityHashMap() }
         }
 
         private fun create(name: String, value: Any?, parentValue: Any?): NodeParameter? {
             if (value == null) {
                 return null
             }
-            createFromSimpleValue(name, value)?.let { return it }
+            createFromSimpleValue(name, value)?.let {
+                return it
+            }
 
             val existing =
                 valueIndexMap[value] ?: return createFromCompositeValue(name, value, parentValue)
@@ -446,14 +463,15 @@
             value: Any?,
             parentValue: Any?,
             specifiedIndex: Int = 0
-        ): NodeParameter? =
-            create(name, value, parentValue)?.apply { index = specifiedIndex }
+        ): NodeParameter? = create(name, value, parentValue)?.apply { index = specifiedIndex }
 
         private fun createFromSimpleValue(name: String, value: Any?): NodeParameter? {
             if (value == null) {
                 return null
             }
-            createFromConstant(name, value)?.let { return it }
+            createFromConstant(name, value)?.let {
+                return it
+            }
             return when (value) {
                 is AnnotatedString -> NodeParameter(name, ParameterType.String, value.text)
                 is BaselineShift -> createFromBaselineShift(name, value)
@@ -486,38 +504,40 @@
             parentValue: Any?,
             startIndex: Int = 0,
             maxElements: Int = maxInitialIterableSize
-        ): NodeParameter? = when {
-            value == null -> null
-            value is Modifier -> createFromModifier(name, value)
-            value is InspectableValue -> createFromInspectableValue(name, value)
-            value is Sequence<*> -> createFromSequence(name, value, value, startIndex, maxElements)
-            value is Map<*, *> ->
-                createFromSequence(name, value, value.asSequence(), startIndex, maxElements)
-            value is Map.Entry<*, *> ->
-                createFromMapEntry(name, value, parentValue)
-            value is Iterable<*> ->
-                createFromSequence(name, value, value.asSequence(), startIndex, maxElements)
-            value.javaClass.isArray -> createFromArray(name, value, startIndex, maxElements)
-            value is Offset -> createFromOffset(name, value)
-            value is Shadow -> createFromShadow(name, value)
-            value is TextStyle -> createFromTextStyle(name, value)
-            else -> createFromKotlinReflection(name, value)
-        }
+        ): NodeParameter? =
+            when {
+                value == null -> null
+                value is Modifier -> createFromModifier(name, value)
+                value is InspectableValue -> createFromInspectableValue(name, value)
+                value is Sequence<*> ->
+                    createFromSequence(name, value, value, startIndex, maxElements)
+                value is Map<*, *> ->
+                    createFromSequence(name, value, value.asSequence(), startIndex, maxElements)
+                value is Map.Entry<*, *> -> createFromMapEntry(name, value, parentValue)
+                value is Iterable<*> ->
+                    createFromSequence(name, value, value.asSequence(), startIndex, maxElements)
+                value.javaClass.isArray -> createFromArray(name, value, startIndex, maxElements)
+                value is Offset -> createFromOffset(name, value)
+                value is Shadow -> createFromShadow(name, value)
+                value is TextStyle -> createFromTextStyle(name, value)
+                else -> createFromKotlinReflection(name, value)
+            }
 
-        private fun find(name: String, value: Any?, index: Int): Pair<String, Any?>? = when {
-            value == null -> null
-            value is Modifier -> findFromModifier(name, value, index)
-            value is InspectableValue -> findFromInspectableValue(value, index)
-            value is Sequence<*> -> findFromSequence(value, index)
-            value is Map<*, *> -> findFromSequence(value.asSequence(), index)
-            value is Map.Entry<*, *> -> findFromMapEntry(value, index)
-            value is Iterable<*> -> findFromSequence(value.asSequence(), index)
-            value.javaClass.isArray -> findFromArray(value, index)
-            value is Offset -> findFromOffset(value, index)
-            value is Shadow -> findFromShadow(value, index)
-            value is TextStyle -> findFromTextStyle(value, index)
-            else -> findFromKotlinReflection(value, index)
-        }
+        private fun find(name: String, value: Any?, index: Int): Pair<String, Any?>? =
+            when {
+                value == null -> null
+                value is Modifier -> findFromModifier(name, value, index)
+                value is InspectableValue -> findFromInspectableValue(value, index)
+                value is Sequence<*> -> findFromSequence(value, index)
+                value is Map<*, *> -> findFromSequence(value.asSequence(), index)
+                value is Map.Entry<*, *> -> findFromMapEntry(value, index)
+                value is Iterable<*> -> findFromSequence(value.asSequence(), index)
+                value.javaClass.isArray -> findFromArray(value, index)
+                value is Offset -> findFromOffset(value, index)
+                value is Shadow -> findFromShadow(value, index)
+                value is TextStyle -> findFromTextStyle(value, index)
+                else -> findFromKotlinReflection(value, index)
+            }
 
         private fun createRecursively(
             name: String,
@@ -527,23 +547,20 @@
         ): NodeParameter? {
             valueIndex.add(index)
             recursions++
-            val parameter = create(name, value, parentValue)?.apply {
-                this.index = index
-            }
+            val parameter = create(name, value, parentValue)?.apply { this.index = index }
             recursions--
             valueIndex.removeLast()
             return parameter
         }
 
-        private fun shouldRecurseDeeper(): Boolean =
-            recursions < maxRecursions
+        private fun shouldRecurseDeeper(): Boolean = recursions < maxRecursions
 
         /**
          * Create a [NodeParameter] as a reference to a previously created parameter.
          *
-         * Use [createFromCompositeValue] to compute the data type and top value,
-         * however no children will be created. Instead a reference to the previously
-         * created parameter is specified.
+         * Use [createFromCompositeValue] to compute the data type and top value, however no
+         * children will be created. Instead a reference to the previously created parameter is
+         * specified.
          */
         private fun createReferenceToExistingValue(
             name: String,
@@ -553,9 +570,8 @@
         ): NodeParameter? {
             val remember = recursions
             recursions = maxRecursions
-            val parameter = createFromCompositeValue(name, value, parentValue)?.apply {
-                reference = ref
-            }
+            val parameter =
+                createFromCompositeValue(name, value, parentValue)?.apply { reference = ref }
             recursions = remember
             return parameter
         }
@@ -563,8 +579,8 @@
         /**
          * Returns `true` if the value can be mapped to a [NodeParameter].
          *
-         * Composite values should NOT be added to the [valueIndexMap] since we
-         * do not intend to include this parameter in the response.
+         * Composite values should NOT be added to the [valueIndexMap] since we do not intend to
+         * include this parameter in the response.
          */
         private fun hasMappableValue(value: Any?): Boolean {
             if (value == null) {
@@ -584,8 +600,8 @@
         /**
          * Store the reference of this [NodeParameter] by its [value]
          *
-         * If the value is seen in other parameter values again, there is
-         * no need to create child parameters a second time.
+         * If the value is seen in other parameter values again, there is no need to create child
+         * parameters a second time.
          */
         private fun NodeParameter.store(value: Any?): NodeParameter {
             if (value != null) {
@@ -595,9 +611,7 @@
             return this
         }
 
-        /**
-         * Remove the [value] of this [NodeParameter] if there are no child elements.
-         */
+        /** Remove the [value] of this [NodeParameter] if there are no child elements. */
         private fun NodeParameter.removeIfEmpty(value: Any?): NodeParameter {
             if (value != null) {
                 if (elements.isEmpty()) {
@@ -612,9 +626,9 @@
         /**
          * Delay the creation of all child parameters of this composite parameter.
          *
-         * If the child parameters are omitted because of [maxRecursions], store the
-         * parameter itself such that its reference can be updated if it turns out
-         * that child [NodeParameter]s need to be generated later.
+         * If the child parameters are omitted because of [maxRecursions], store the parameter
+         * itself such that its reference can be updated if it turns out that child [NodeParameter]s
+         * need to be generated later.
          */
         private fun NodeParameter.withChildReference(value: Any): NodeParameter {
             valueLazyReferenceMap.getOrPut(value, { mutableListOf() }).add(this)
@@ -643,36 +657,41 @@
             return findFromSequence(sequence, index)
         }
 
-        private fun arrayToSequence(value: Any): Sequence<*>? = when (value) {
-            is Array<*> -> value.asSequence()
-            is ByteArray -> value.asSequence()
-            is IntArray -> value.asSequence()
-            is LongArray -> value.asSequence()
-            is FloatArray -> value.asSequence()
-            is DoubleArray -> value.asSequence()
-            is BooleanArray -> value.asSequence()
-            is CharArray -> value.asSequence()
-            else -> null
-        }
+        private fun arrayToSequence(value: Any): Sequence<*>? =
+            when (value) {
+                is Array<*> -> value.asSequence()
+                is ByteArray -> value.asSequence()
+                is IntArray -> value.asSequence()
+                is LongArray -> value.asSequence()
+                is FloatArray -> value.asSequence()
+                is DoubleArray -> value.asSequence()
+                is BooleanArray -> value.asSequence()
+                is CharArray -> value.asSequence()
+                else -> null
+            }
 
         private fun createFromBaselineShift(name: String, value: BaselineShift): NodeParameter {
-            val converted = when (value.multiplier) {
-                BaselineShift.None.multiplier -> "None"
-                BaselineShift.Subscript.multiplier -> "Subscript"
-                BaselineShift.Superscript.multiplier -> "Superscript"
-                else -> return NodeParameter(name, ParameterType.Float, value.multiplier)
-            }
+            val converted =
+                when (value.multiplier) {
+                    BaselineShift.None.multiplier -> "None"
+                    BaselineShift.Subscript.multiplier -> "Subscript"
+                    BaselineShift.Superscript.multiplier -> "Superscript"
+                    else -> return NodeParameter(name, ParameterType.Float, value.multiplier)
+                }
             return NodeParameter(name, ParameterType.String, converted)
         }
 
-        private fun createFromCLambda(name: String, value: ComposableLambda): NodeParameter? = try {
-            val lambda = value.javaClass.getDeclaredField("_block")
-                .apply { isAccessible = true }
-                .get(value)
-            NodeParameter(name, ParameterType.Lambda, arrayOf<Any?>(lambda))
-        } catch (_: Throwable) {
-            null
-        }
+        private fun createFromCLambda(name: String, value: ComposableLambda): NodeParameter? =
+            try {
+                val lambda =
+                    value.javaClass
+                        .getDeclaredField("_block")
+                        .apply { isAccessible = true }
+                        .get(value)
+                NodeParameter(name, ParameterType.Lambda, arrayOf<Any?>(lambda))
+            } catch (_: Throwable) {
+                null
+            }
 
         private fun createFromConstant(name: String, value: Any): NodeParameter? {
             loadConstantsFrom(value.javaClass)
@@ -721,9 +740,10 @@
             val kClass = value::class
             val simpleName = kClass.simpleName
             val qualifiedName = kClass.qualifiedName
-            if (simpleName == null ||
-                qualifiedName == null ||
-                ignoredPackagePrefixes.any { qualifiedName.startsWith(it) }
+            if (
+                simpleName == null ||
+                    qualifiedName == null ||
+                    ignoredPackagePrefixes.any { qualifiedName.startsWith(it) }
             ) {
                 // Exit without creating a parameter for:
                 // - internal synthetic classes
@@ -731,7 +751,8 @@
                 return null
             }
             return try {
-                sequenceOf(kClass).plus(kClass.allSuperclasses.asSequence())
+                sequenceOf(kClass)
+                    .plus(kClass.allSuperclasses.asSequence())
                     .flatMap { it.declaredMemberProperties.asSequence() }
                     .associateBy { it.name }
             } catch (ex: Throwable) {
@@ -740,16 +761,17 @@
             }
         }
 
-        private fun valueOf(property: KProperty<*>, instance: Any): Any? = try {
-            property.isAccessible = true
-            // Bug in kotlin reflection API: if the type is a nullable inline type with a null
-            // value, we get an IllegalArgumentException in this line:
-            property.getter.call(instance)
-        } catch (ex: Throwable) {
-            // TODO: Remove this warning since this is expected with nullable inline types
-            Log.w("Compose", "Could not get value of ${property.name}")
-            null
-        }
+        private fun valueOf(property: KProperty<*>, instance: Any): Any? =
+            try {
+                property.isAccessible = true
+                // Bug in kotlin reflection API: if the type is a nullable inline type with a null
+                // value, we get an IllegalArgumentException in this line:
+                property.getter.call(instance)
+            } catch (ex: Throwable) {
+                // TODO: Remove this warning since this is expected with nullable inline types
+                Log.w("Compose", "Could not get value of ${property.name}")
+                null
+            }
 
         private fun createFromInspectableValue(
             name: String,
@@ -758,8 +780,9 @@
             val tempValue = value.valueOverride ?: ""
             val parameterName = name.ifEmpty { value.nameFallback } ?: "element"
             val parameterValue = if (tempValue is InspectableValue) "" else tempValue
-            val parameter = createFromSimpleValue(parameterName, parameterValue)
-                ?: NodeParameter(parameterName, ParameterType.String, "")
+            val parameter =
+                createFromSimpleValue(parameterName, parameterValue)
+                    ?: NodeParameter(parameterName, ParameterType.String, "")
             if (!shouldRecurseDeeper()) {
                 return parameter.withChildReference(value)
             }
@@ -842,45 +865,47 @@
             return Pair("[$index]", element)
         }
 
-        private fun sequenceName(value: Any): String = when (value) {
-            is Array<*> -> "Array[${value.size}]"
-            is ByteArray -> "ByteArray[${value.size}]"
-            is IntArray -> "IntArray[${value.size}]"
-            is LongArray -> "LongArray[${value.size}]"
-            is FloatArray -> "FloatArray[${value.size}]"
-            is DoubleArray -> "DoubleArray[${value.size}]"
-            is BooleanArray -> "BooleanArray[${value.size}]"
-            is CharArray -> "CharArray[${value.size}]"
-            is List<*> -> "List[${value.size}]"
-            is Set<*> -> "Set[${value.size}]"
-            is Map<*, *> -> "Map[${value.size}]"
-            is Collection<*> -> "Collection[${value.size}]"
-            is Iterable<*> -> "Iterable"
-            else -> "Sequence"
-        }
+        private fun sequenceName(value: Any): String =
+            when (value) {
+                is Array<*> -> "Array[${value.size}]"
+                is ByteArray -> "ByteArray[${value.size}]"
+                is IntArray -> "IntArray[${value.size}]"
+                is LongArray -> "LongArray[${value.size}]"
+                is FloatArray -> "FloatArray[${value.size}]"
+                is DoubleArray -> "DoubleArray[${value.size}]"
+                is BooleanArray -> "BooleanArray[${value.size}]"
+                is CharArray -> "CharArray[${value.size}]"
+                is List<*> -> "List[${value.size}]"
+                is Set<*> -> "Set[${value.size}]"
+                is Map<*, *> -> "Map[${value.size}]"
+                is Collection<*> -> "Collection[${value.size}]"
+                is Iterable<*> -> "Iterable"
+                else -> "Sequence"
+            }
 
         private fun createFromLambda(name: String, value: Lambda<*>): NodeParameter =
             NodeParameter(name, ParameterType.Lambda, arrayOf<Any>(value))
 
-        private fun createFromModifier(name: String, value: Modifier): NodeParameter? = when {
-            name.isNotEmpty() -> {
-                val parameter = NodeParameter(name, ParameterType.String, "")
-                val modifiers = unwrap(value)
-                when {
-                    modifiers.isEmpty() -> parameter
-                    !shouldRecurseDeeper() -> parameter.withChildReference(value)
-                    else -> {
-                        val elements = parameter.elements
-                        modifiers.mapIndexedNotNullTo(elements) { index, element ->
-                            createRecursively("", element, value, index)
+        private fun createFromModifier(name: String, value: Modifier): NodeParameter? =
+            when {
+                name.isNotEmpty() -> {
+                    val parameter = NodeParameter(name, ParameterType.String, "")
+                    val modifiers = unwrap(value)
+                    when {
+                        modifiers.isEmpty() -> parameter
+                        !shouldRecurseDeeper() -> parameter.withChildReference(value)
+                        else -> {
+                            val elements = parameter.elements
+                            modifiers.mapIndexedNotNullTo(elements) { index, element ->
+                                createRecursively("", element, value, index)
+                            }
+                            parameter.store(value).removeIfEmpty(value)
                         }
-                        parameter.store(value).removeIfEmpty(value)
                     }
                 }
+                value is InspectableValue -> createFromInspectableValue(name, value)
+                else -> null
             }
-            value is InspectableValue -> createFromInspectableValue(name, value)
-            else -> null
-        }
 
         private fun unwrap(value: Modifier): List<Modifier.Element> {
             val collector = ModifierCollector()
@@ -892,14 +917,15 @@
             name: String,
             value: Modifier,
             index: Int
-        ): Pair<String, Any?>? = when {
-            name.isNotEmpty() -> {
-                val modifiers = unwrap(value)
-                if (index in modifiers.indices) Pair("", modifiers[index]) else null
+        ): Pair<String, Any?>? =
+            when {
+                name.isNotEmpty() -> {
+                    val modifiers = unwrap(value)
+                    if (index in modifiers.indices) Pair("", modifiers[index]) else null
+                }
+                value is InspectableValue -> findFromInspectableValue(value, index)
+                else -> null
             }
-            value is InspectableValue -> findFromInspectableValue(value, index)
-            else -> null
-        }
 
         private fun createFromOffset(name: String, value: Offset): NodeParameter {
             val parameter = NodeParameter(name, ParameterType.String, Offset::class.java.simpleName)
@@ -1018,13 +1044,14 @@
         val modifiers = mutableListOf<Modifier.Element>()
         var start: InspectableModifier? = null
 
-        fun add(element: Modifier.Element) = when {
-            element == start?.end -> start = null
-            start != null -> {}
-            else -> {
-                modifiers.add(element)
-                start = element as? InspectableModifier
+        fun add(element: Modifier.Element) =
+            when {
+                element == start?.end -> start = null
+                start != null -> {}
+                else -> {
+                    modifiers.add(element)
+                    start = element as? InspectableModifier
+                }
             }
-        }
     }
 }
diff --git a/compose/ui/ui-inspection/src/main/java/androidx/compose/ui/inspection/inspector/ReflectionScope.kt b/compose/ui/ui-inspection/src/main/java/androidx/compose/ui/inspection/inspector/ReflectionScope.kt
index 4dd88eb..b8b3484 100644
--- a/compose/ui/ui-inspection/src/main/java/androidx/compose/ui/inspection/inspector/ReflectionScope.kt
+++ b/compose/ui/ui-inspection/src/main/java/androidx/compose/ui/inspection/inspector/ReflectionScope.kt
@@ -49,30 +49,29 @@
 /**
  * Scope that allows to use jarjar-ed kotlin-reflect artifact that is shipped with inspector itself.
  *
- * Issue with kotlin-reflect.
- * Many of reflective calls such as "foo::class" rely on static
- * functions defined in kotlin-stdlib's Reflection.java that delegate to ReflectionFactory.
- * In order to initialize that factory kotlin-stdlib statically detects presence or absence of
- * kotlin-reflect in classloader and chooses a factory accordingly. If there is no kotlin-reflect,
- * very limited version of ReflectionFactory is used.
+ * Issue with kotlin-reflect. Many of reflective calls such as "foo::class" rely on static functions
+ * defined in kotlin-stdlib's Reflection.java that delegate to ReflectionFactory. In order to
+ * initialize that factory kotlin-stdlib statically detects presence or absence of kotlin-reflect in
+ * classloader and chooses a factory accordingly. If there is no kotlin-reflect, very limited
+ * version of ReflectionFactory is used.
  *
- * It is an issue for inspectors because they could be loaded after that factory is initialised,
- * and even if they are loaded before, they live in a separate child classloader, thus
- * kotlin-reflect in inspector wouldn't exist for kotlin-stdlib in app.
+ * It is an issue for inspectors because they could be loaded after that factory is initialised, and
+ * even if they are loaded before, they live in a separate child classloader, thus kotlin-reflect in
+ * inspector wouldn't exist for kotlin-stdlib in app.
  *
- * First step to avoid the issue is using ReflectionFactoryImpl that is bundled with inspector.
- * Code for that would be fairly simple, for example instead of directly calling
+ * First step to avoid the issue is using ReflectionFactoryImpl that is bundled with inspector. Code
+ * for that would be fairly simple, for example instead of directly calling
  * `kClass.declaredMemberProperties`, correct instance of kClass should be obtained from factory:
  * `factory.getOrCreateKotlinClass(kClass.java).declaredMemberProperties`.
  *
  * That would work if code that works with correct KClass full implementation would never try to
- * access a default factory installed in Reflection.java. Unfortunately it is not true,
- * it eventually calls `CallableReference.getOwner()` in stdlib that uses default factory.
+ * access a default factory installed in Reflection.java. Unfortunately it is not true, it
+ * eventually calls `CallableReference.getOwner()` in stdlib that uses default factory.
  *
  * As a result we have to replace the factory in Reflection.java. To avoid issues with user's code
  * factory that we setup is smart, by default it simply delegates to a factory that was previously
- * installed. Only within `reflectionScope.withReflectiveAccess{ }` factory from kotlin-reflect
- * is used.
+ * installed. Only within `reflectionScope.withReflectiveAccess{ }` factory from kotlin-reflect is
+ * used.
  */
 @SuppressLint("BanUncheckedReflection")
 class ReflectionScope {
@@ -85,9 +84,7 @@
 
     private val scopedReflectionFactory = installScopedReflectionFactory()
 
-    /**
-     * Runs `block` with access to kotlin-reflect.
-     */
+    /** Runs `block` with access to kotlin-reflect. */
     fun <T> withReflectiveAccess(block: () -> T): T {
         return scopedReflectionFactory.withMainFactory(block)
     }
diff --git a/compose/ui/ui-inspection/src/main/java/androidx/compose/ui/inspection/proto/ComposeExtensions.kt b/compose/ui/ui-inspection/src/main/java/androidx/compose/ui/inspection/proto/ComposeExtensions.kt
index 01966b3..2ba469d 100644
--- a/compose/ui/ui-inspection/src/main/java/androidx/compose/ui/inspection/proto/ComposeExtensions.kt
+++ b/compose/ui/ui-inspection/src/main/java/androidx/compose/ui/inspection/proto/ComposeExtensions.kt
@@ -36,24 +36,20 @@
 import layoutinspector.compose.inspection.LayoutInspectorComposeProtocol.Rect
 
 internal fun InspectorNode.toComposableNode(context: ConversionContext): ComposableNode {
-    return toNodeBuilder(context)
-        .resetSystemFlag()
-        .build()
+    return toNodeBuilder(context).resetSystemFlag().build()
 }
 
 private val SELECTOR_EXPR = Regex("(\\\$(lambda-)?[0-9]+)+$")
 
 /**
- * Convert an [InspectorNode] to protobuf [ComposableNode].
- * If the reduceChildNesting option is set: store a subtree with single child nodes as children
- * of this node and mark the node with [ComposableNode.Flags.NESTED_SINGLE_CHILDREN].
+ * Convert an [InspectorNode] to protobuf [ComposableNode]. If the reduceChildNesting option is set:
+ * store a subtree with single child nodes as children of this node and mark the node with
+ * [ComposableNode.Flags.NESTED_SINGLE_CHILDREN].
  */
 private fun InspectorNode.toNodeBuilder(context: ConversionContext): ComposableNode.Builder {
     val builder = toFlatNode(context)
     if (!context.reduceChildNesting || children.size != 1) {
-        children.forEach { child ->
-            builder.addChildren(child.toNodeBuilder(context))
-        }
+        children.forEach { child -> builder.addChildren(child.toNodeBuilder(context)) }
     } else {
         var nested = children.single()
 
@@ -67,9 +63,7 @@
     return builder
 }
 
-/**
- * Convert an [InspectorNode] to protobuf [ComposableNode] without child nesting.
- */
+/** Convert an [InspectorNode] to protobuf [ComposableNode] without child nesting. */
 private fun InspectorNode.toFlatNode(context: ConversionContext): ComposableNode.Builder {
     val inspectorNode = this
     return ComposableNode.newBuilder().apply {
@@ -82,26 +76,35 @@
 
         name = context.stringTable.put(inspectorNode.name)
 
-        bounds = Bounds.newBuilder().apply {
-            layout = Rect.newBuilder().apply {
-                x = inspectorNode.left + context.windowPos.x
-                y = inspectorNode.top + context.windowPos.y
-                w = inspectorNode.width
-                h = inspectorNode.height
-            }.build()
-            if (inspectorNode.bounds != null) {
-                render = Quad.newBuilder().apply {
-                    x0 = inspectorNode.bounds.x0
-                    y0 = inspectorNode.bounds.y0
-                    x1 = inspectorNode.bounds.x1
-                    y1 = inspectorNode.bounds.y1
-                    x2 = inspectorNode.bounds.x2
-                    y2 = inspectorNode.bounds.y2
-                    x3 = inspectorNode.bounds.x3
-                    y3 = inspectorNode.bounds.y3
-                }.build()
-            }
-        }.build()
+        bounds =
+            Bounds.newBuilder()
+                .apply {
+                    layout =
+                        Rect.newBuilder()
+                            .apply {
+                                x = inspectorNode.left + context.windowPos.x
+                                y = inspectorNode.top + context.windowPos.y
+                                w = inspectorNode.width
+                                h = inspectorNode.height
+                            }
+                            .build()
+                    if (inspectorNode.bounds != null) {
+                        render =
+                            Quad.newBuilder()
+                                .apply {
+                                    x0 = inspectorNode.bounds.x0
+                                    y0 = inspectorNode.bounds.y0
+                                    x1 = inspectorNode.bounds.x1
+                                    y1 = inspectorNode.bounds.y1
+                                    x2 = inspectorNode.bounds.x2
+                                    y2 = inspectorNode.bounds.y2
+                                    x3 = inspectorNode.bounds.x3
+                                    y3 = inspectorNode.bounds.y3
+                                }
+                                .build()
+                    }
+                }
+                .build()
 
         flags = flags()
         viewId = inspectorNode.viewId
@@ -131,8 +134,9 @@
     return flags
 }
 
-private fun ComposableNode.Builder.resetSystemFlag(): ComposableNode.Builder =
-    apply { flags = flags and ComposableNode.Flags.SYSTEM_CREATED_VALUE.inv() }
+private fun ComposableNode.Builder.resetSystemFlag(): ComposableNode.Builder = apply {
+    flags = flags and ComposableNode.Flags.SYSTEM_CREATED_VALUE.inv()
+}
 
 fun ParameterType.convert(): Parameter.Type {
     return when (this) {
@@ -205,10 +209,10 @@
 private fun Parameter.Builder.setResourceType(value: Any?, stringTable: StringTable) {
     // A Resource is passed by resource id for Compose
     val resourceId = (value as? Int) ?: return
-    resourceValue = WindowInspector.getGlobalWindowViews()
-        .firstOrNull()
-        ?.createResource(stringTable, resourceId)
-        ?: return
+    resourceValue =
+        WindowInspector.getGlobalWindowViews()
+            .firstOrNull()
+            ?.createResource(stringTable, resourceId) ?: return
 }
 
 private fun Parameter.Builder.setFunctionType(value: Any?, stringTable: StringTable) {
@@ -219,15 +223,20 @@
     val location = LambdaLocation.resolve(lambdaInstance) ?: return
     val lambdaClass = lambdaInstance::class.java
     val lambdaClassName = lambdaClass.name
-    lambdaValue = LambdaValue.newBuilder().apply {
-        packageName = stringTable.put(lambdaClassName.substringBeforeLast("."))
-        functionName = if (value.size == 2 && value[1] != null && value[1] is String)
-            stringTable.put(value[1] as String) else 0
-        lambdaName = stringTable.put(findLambdaSelector(lambdaClassName))
-        fileName = stringTable.put(location.fileName)
-        startLineNumber = location.startLine
-        endLineNumber = location.endLine
-    }.build()
+    lambdaValue =
+        LambdaValue.newBuilder()
+            .apply {
+                packageName = stringTable.put(lambdaClassName.substringBeforeLast("."))
+                functionName =
+                    if (value.size == 2 && value[1] != null && value[1] is String)
+                        stringTable.put(value[1] as String)
+                    else 0
+                lambdaName = stringTable.put(findLambdaSelector(lambdaClassName))
+                fileName = stringTable.put(location.fileName)
+                startLineNumber = location.startLine
+                endLineNumber = location.endLine
+            }
+            .build()
 }
 
 /**
@@ -235,7 +244,7 @@
  *
  * Example:
  * - className: com.example.composealertdialog.ComposableSingletons$MainActivityKt$lambda-10$1$2$2$1
- * - selector:  lambda-10$1$2$2$1
+ * - selector: lambda-10$1$2$2$1
  */
 @VisibleForTesting
 fun findLambdaSelector(lambdaClassName: String): String =
@@ -243,37 +252,41 @@
 
 fun NodeParameter.convert(stringTable: StringTable): Parameter {
     val nodeParam = this
-    return Parameter.newBuilder().apply {
-        name = stringTable.put(nodeParam.name)
-        type = nodeParam.type.convert()
-        setValue(stringTable, nodeParam.value)
-        index = nodeParam.index
-        nodeParam.reference?.let { reference = it.convert() }
-        if (nodeParam.elements.isNotEmpty()) {
-            addAllElements(nodeParam.elements.map { it.convert(stringTable) })
+    return Parameter.newBuilder()
+        .apply {
+            name = stringTable.put(nodeParam.name)
+            type = nodeParam.type.convert()
+            setValue(stringTable, nodeParam.value)
+            index = nodeParam.index
+            nodeParam.reference?.let { reference = it.convert() }
+            if (nodeParam.elements.isNotEmpty()) {
+                addAllElements(nodeParam.elements.map { it.convert(stringTable) })
+            }
         }
-    }.build()
+        .build()
 }
 
 fun NodeParameterReference.convert(): ParameterReference {
     val reference = this
-    return ParameterReference.newBuilder().apply {
-        kind = reference.kind.convert()
-        composableId = reference.nodeId
-        anchorHash = reference.anchorId
-        parameterIndex = reference.parameterIndex
-        reference.indices.forEach { addCompositeIndex(it) }
-    }.build()
+    return ParameterReference.newBuilder()
+        .apply {
+            kind = reference.kind.convert()
+            composableId = reference.nodeId
+            anchorHash = reference.anchorId
+            parameterIndex = reference.parameterIndex
+            reference.indices.forEach { addCompositeIndex(it) }
+        }
+        .build()
 }
 
 internal fun CacheTree.toComposableRoot(context: ConversionContext): ComposableRoot =
-    ComposableRoot.newBuilder().also { root ->
-        root.viewId = viewParent.uniqueDrawingId
-        root.addAllNodes(nodes.map {
-            it.toComposableNode(context)
-        })
-        viewsToSkip.forEach { root.addViewsToSkip(it) }
-    }.build()
+    ComposableRoot.newBuilder()
+        .also { root ->
+            root.viewId = viewParent.uniqueDrawingId
+            root.addAllNodes(nodes.map { it.toComposableNode(context) })
+            viewsToSkip.forEach { root.addViewsToSkip(it) }
+        }
+        .build()
 
 fun Iterable<NodeParameter>.convertAll(stringTable: StringTable): List<Parameter> {
     return this.map { it.convert(stringTable) }
diff --git a/compose/ui/ui-inspection/src/main/java/androidx/compose/ui/inspection/proto/ConversionContext.kt b/compose/ui/ui-inspection/src/main/java/androidx/compose/ui/inspection/proto/ConversionContext.kt
index a60fc4d..6d4c105 100644
--- a/compose/ui/ui-inspection/src/main/java/androidx/compose/ui/inspection/proto/ConversionContext.kt
+++ b/compose/ui/ui-inspection/src/main/java/androidx/compose/ui/inspection/proto/ConversionContext.kt
@@ -19,9 +19,7 @@
 import androidx.compose.ui.inspection.RecompositionHandler
 import androidx.compose.ui.unit.IntOffset
 
-/**
- * Parameters for recursive protobuf constructor.
- */
+/** Parameters for recursive protobuf constructor. */
 internal class ConversionContext(
     val stringTable: StringTable,
     val windowPos: IntOffset,
diff --git a/compose/ui/ui-inspection/src/main/java/androidx/compose/ui/inspection/proto/StringTable.kt b/compose/ui/ui-inspection/src/main/java/androidx/compose/ui/inspection/proto/StringTable.kt
index 4af2c85..43f233d 100644
--- a/compose/ui/ui-inspection/src/main/java/androidx/compose/ui/inspection/proto/StringTable.kt
+++ b/compose/ui/ui-inspection/src/main/java/androidx/compose/ui/inspection/proto/StringTable.kt
@@ -37,10 +37,12 @@
         val result = mutableListOf<LayoutInspectorComposeProtocol.StringEntry>()
         innerMap.forEach { key, value ->
             result.add(
-                LayoutInspectorComposeProtocol.StringEntry.newBuilder().apply {
-                    str = key
-                    id = value
-                }.build()
+                LayoutInspectorComposeProtocol.StringEntry.newBuilder()
+                    .apply {
+                        str = key
+                        id = value
+                    }
+                    .build()
             )
         }
         return result
diff --git a/compose/ui/ui-inspection/src/main/java/androidx/compose/ui/inspection/proto/ViewExtensions.kt b/compose/ui/ui-inspection/src/main/java/androidx/compose/ui/inspection/proto/ViewExtensions.kt
index f6f5b96..38cf113 100644
--- a/compose/ui/ui-inspection/src/main/java/androidx/compose/ui/inspection/proto/ViewExtensions.kt
+++ b/compose/ui/ui-inspection/src/main/java/androidx/compose/ui/inspection/proto/ViewExtensions.kt
@@ -21,18 +21,20 @@
 import layoutinspector.compose.inspection.LayoutInspectorComposeProtocol.Resource
 
 /**
- * Search this view for a resource with matching [resourceId] and, if found, return its
- * proto representation.
+ * Search this view for a resource with matching [resourceId] and, if found, return its proto
+ * representation.
  */
 fun View.createResource(stringTable: StringTable, resourceId: Int): Resource? {
     if (resourceId <= 0) return null
 
     return try {
-        return Resource.newBuilder().apply {
-            type = stringTable.put(resources.getResourceTypeName(resourceId))
-            namespace = stringTable.put(resources.getResourcePackageName(resourceId))
-            name = stringTable.put(resources.getResourceEntryName(resourceId))
-        }.build()
+        return Resource.newBuilder()
+            .apply {
+                type = stringTable.put(resources.getResourceTypeName(resourceId))
+                namespace = stringTable.put(resources.getResourcePackageName(resourceId))
+                name = stringTable.put(resources.getResourceEntryName(resourceId))
+            }
+            .build()
     } catch (ex: Resources.NotFoundException) {
         null
     }
diff --git a/compose/ui/ui-inspection/src/main/java/androidx/compose/ui/inspection/util/AnchorMap.kt b/compose/ui/ui-inspection/src/main/java/androidx/compose/ui/inspection/util/AnchorMap.kt
index 70b52ab..5618360 100644
--- a/compose/ui/ui-inspection/src/main/java/androidx/compose/ui/inspection/util/AnchorMap.kt
+++ b/compose/ui/ui-inspection/src/main/java/androidx/compose/ui/inspection/util/AnchorMap.kt
@@ -18,22 +18,16 @@
 
 const val NO_ANCHOR_ID = 0
 
-/**
- * A map of anchors with a unique id generator.
- */
+/** A map of anchors with a unique id generator. */
 class AnchorMap {
     private val anchorLookup = mutableMapOf<Int, Any>()
     private val idLookup = mutableMapOf<Any, Int>()
 
-    /**
-     * Return a unique id for the specified [anchor] instance.
-     */
+    /** Return a unique id for the specified [anchor] instance. */
     operator fun get(anchor: Any?): Int =
         anchor?.let { idLookup.getOrPut(it) { generateUniqueId(it) } } ?: NO_ANCHOR_ID
 
-    /**
-     * Return the anchor associated with a given unique anchor [id].
-     */
+    /** Return the anchor associated with a given unique anchor [id]. */
     operator fun get(id: Int): Any? = anchorLookup[id]
 
     private fun generateUniqueId(anchor: Any): Int {
diff --git a/compose/ui/ui-inspection/src/main/java/androidx/compose/ui/inspection/util/ThreadUtils.kt b/compose/ui/ui-inspection/src/main/java/androidx/compose/ui/inspection/util/ThreadUtils.kt
index d088b13..a8d40af 100644
--- a/compose/ui/ui-inspection/src/main/java/androidx/compose/ui/inspection/util/ThreadUtils.kt
+++ b/compose/ui/ui-inspection/src/main/java/androidx/compose/ui/inspection/util/ThreadUtils.kt
@@ -35,17 +35,15 @@
     }
 
     /**
-     * Run some logic on the main thread, returning a future that will contain any data computed
-     * by and returned from the block.
+     * Run some logic on the main thread, returning a future that will contain any data computed by
+     * and returned from the block.
      *
      * If this method is called from the main thread, it will run immediately.
      */
     fun <T> runOnMainThread(block: () -> T): Future<T> {
         return if (!Looper.getMainLooper().isCurrentThread) {
             val future = CompletableFuture<T>()
-            Handler.createAsync(Looper.getMainLooper()).post {
-                future.complete(block())
-            }
+            Handler.createAsync(Looper.getMainLooper()).post { future.complete(block()) }
             future
         } else {
             CompletableFuture.completedFuture(block())
diff --git a/compose/ui/ui-lint/src/main/java/androidx/compose/ui/lint/ComposedModifierDetector.kt b/compose/ui/ui-lint/src/main/java/androidx/compose/ui/lint/ComposedModifierDetector.kt
index 1652ea2..1099a1b 100644
--- a/compose/ui/ui-lint/src/main/java/androidx/compose/ui/lint/ComposedModifierDetector.kt
+++ b/compose/ui/ui-lint/src/main/java/androidx/compose/ui/lint/ComposedModifierDetector.kt
@@ -39,8 +39,8 @@
 
 /**
  * [Detector] that checks calls to Modifier.composed to make sure they actually reference a
- * Composable function inside - otherwise there is no reason to use Modifier.composed, and since
- * the resulting Modifier is not skippable, it will cause worse performance.
+ * Composable function inside - otherwise there is no reason to use Modifier.composed, and since the
+ * resulting Modifier is not skippable, it will cause worse performance.
  */
 class ComposedModifierDetector : Detector(), SourceCodeScanner {
     override fun getApplicableMethodNames(): List<String> = listOf(Names.Ui.Composed.shortName)
@@ -48,35 +48,34 @@
     override fun visitMethodCall(context: JavaContext, node: UCallExpression, method: PsiMethod) {
         if (!method.isInPackageName(Names.Ui.PackageName)) return
 
-        val factoryLambda = node.valueArguments.find {
-            node.getParameterForArgument(it)?.name == "factory"
-        } ?: return
+        val factoryLambda =
+            node.valueArguments.find { node.getParameterForArgument(it)?.name == "factory" }
+                ?: return
 
         var hasComposableCall = false
-        factoryLambda.accept(object : AbstractUastVisitor() {
-            /**
-             * Visit function calls to see if the functions are composable
-             */
-            override fun visitCallExpression(
-                node: UCallExpression
-            ): Boolean = (node.tryResolve() as? PsiMethod).hasComposableCall()
+        factoryLambda.accept(
+            object : AbstractUastVisitor() {
+                /** Visit function calls to see if the functions are composable */
+                override fun visitCallExpression(node: UCallExpression): Boolean =
+                    (node.tryResolve() as? PsiMethod).hasComposableCall()
 
-            /**
-             * Visit any simple name reference expressions and see if they resolve to a
-             * composable function - for example if referencing a property with a composable
-             * getter, such as CompositionLocal.current.
-             */
-            override fun visitSimpleNameReferenceExpression(
-                node: USimpleNameReferenceExpression
-            ): Boolean = (node.tryResolve() as? PsiMethod).hasComposableCall()
+                /**
+                 * Visit any simple name reference expressions and see if they resolve to a
+                 * composable function - for example if referencing a property with a composable
+                 * getter, such as CompositionLocal.current.
+                 */
+                override fun visitSimpleNameReferenceExpression(
+                    node: USimpleNameReferenceExpression
+                ): Boolean = (node.tryResolve() as? PsiMethod).hasComposableCall()
 
-            private fun PsiMethod?.hasComposableCall(): Boolean {
-                if (this?.isComposable == true) {
-                    hasComposableCall = true
+                private fun PsiMethod?.hasComposableCall(): Boolean {
+                    if (this?.isComposable == true) {
+                        hasComposableCall = true
+                    }
+                    return hasComposableCall
                 }
-                return hasComposableCall
             }
-        })
+        )
 
         if (!hasComposableCall) {
             context.report(
@@ -89,20 +88,23 @@
     }
 
     companion object {
-        val UnnecessaryComposedModifier = Issue.create(
-            "UnnecessaryComposedModifier",
-            "Modifier.composed should only be used for modifiers that invoke @Composable functions",
-            "`Modifier.composed` allows invoking @Composable functions when creating a `Modifier`" +
-                " instance - for example, using `remember` to have instance-specific state, " +
-                "allowing the same `Modifier` object to be safely used in multiple places. Using " +
-                "`Modifier.composed` without calling any @Composable functions inside is " +
-                "unnecessary, and since the Modifier is no longer skippable, this can cause a lot" +
-                " of extra work inside the composed body, leading to worse performance.",
-            Category.CORRECTNESS, 3, Severity.WARNING,
-            Implementation(
-                ComposedModifierDetector::class.java,
-                EnumSet.of(Scope.JAVA_FILE, Scope.TEST_SOURCES)
+        val UnnecessaryComposedModifier =
+            Issue.create(
+                "UnnecessaryComposedModifier",
+                "Modifier.composed should only be used for modifiers that invoke @Composable functions",
+                "`Modifier.composed` allows invoking @Composable functions when creating a `Modifier`" +
+                    " instance - for example, using `remember` to have instance-specific state, " +
+                    "allowing the same `Modifier` object to be safely used in multiple places. Using " +
+                    "`Modifier.composed` without calling any @Composable functions inside is " +
+                    "unnecessary, and since the Modifier is no longer skippable, this can cause a lot" +
+                    " of extra work inside the composed body, leading to worse performance.",
+                Category.CORRECTNESS,
+                3,
+                Severity.WARNING,
+                Implementation(
+                    ComposedModifierDetector::class.java,
+                    EnumSet.of(Scope.JAVA_FILE, Scope.TEST_SOURCES)
+                )
             )
-        )
     }
 }
diff --git a/compose/ui/ui-lint/src/main/java/androidx/compose/ui/lint/ModifierDeclarationDetector.kt b/compose/ui/ui-lint/src/main/java/androidx/compose/ui/lint/ModifierDeclarationDetector.kt
index 8d2f30d..ff78070 100644
--- a/compose/ui/ui-lint/src/main/java/androidx/compose/ui/lint/ModifierDeclarationDetector.kt
+++ b/compose/ui/ui-lint/src/main/java/androidx/compose/ui/lint/ModifierDeclarationDetector.kt
@@ -62,105 +62,112 @@
 
 /**
  * [Detector] that checks functions returning Modifiers for consistency with guidelines.
- *
  * - Modifier factory functions should return Modifier as their type, and not a subclass of Modifier
  * - Modifier factory functions should be defined as an extension on Modifier to allow fluent
- * chaining
+ *   chaining
  * - Modifier factory functions should not be marked as @Composable, and should use `composed`
- * instead
+ *   instead
  * - Modifier factory functions should reference the receiver parameter inside their body to make
- * sure they don't drop old Modifiers in the chain
+ *   sure they don't drop old Modifiers in the chain
  */
 class ModifierDeclarationDetector : Detector(), SourceCodeScanner {
     override fun getApplicableUastTypes() = listOf(UMethod::class.java)
 
-    override fun createUastHandler(context: JavaContext) = object : UElementHandler() {
-        override fun visitMethod(node: UMethod) {
-            // Ignore functions that do not return
-            val returnType = node.returnType ?: return
+    override fun createUastHandler(context: JavaContext) =
+        object : UElementHandler() {
+            override fun visitMethod(node: UMethod) {
+                // Ignore functions that do not return
+                val returnType = node.returnType ?: return
 
-            // Ignore functions that do not return Modifier or something implementing Modifier
-            if (!returnType.inheritsFrom(Names.Ui.Modifier)) return
+                // Ignore functions that do not return Modifier or something implementing Modifier
+                if (!returnType.inheritsFrom(Names.Ui.Modifier)) return
 
-            // Ignore ParentDataModifiers - this is a special type of Modifier where the type is
-            // used to provide data for use in layout, so we don't want to warn here.
-            if (returnType.inheritsFrom(Names.Ui.Layout.ParentDataModifier)) return
+                // Ignore ParentDataModifiers - this is a special type of Modifier where the type is
+                // used to provide data for use in layout, so we don't want to warn here.
+                if (returnType.inheritsFrom(Names.Ui.Layout.ParentDataModifier)) return
 
-            val source = node.sourcePsi
+                val source = node.sourcePsi
 
-            // If this node is a property that is a constructor parameter, ignore it.
-            if (source is KtParameter) return
+                // If this node is a property that is a constructor parameter, ignore it.
+                if (source is KtParameter) return
 
-            // Ignore properties in some cases
-            if (source is KtProperty) {
-                // If this node is inside a class or object, ignore it.
-                if (source.containingClassOrObject != null) return
-                // If this node is a var, ignore it.
-                if (source.isVar) return
-                // If this node is a val with no getter, ignore it.
-                if (source.getter == null) return
+                // Ignore properties in some cases
+                if (source is KtProperty) {
+                    // If this node is inside a class or object, ignore it.
+                    if (source.containingClassOrObject != null) return
+                    // If this node is a var, ignore it.
+                    if (source.isVar) return
+                    // If this node is a val with no getter, ignore it.
+                    if (source.getter == null) return
+                }
+                if (source is KtPropertyAccessor) {
+                    // If this node is inside a class or object, ignore it.
+                    if (source.property.containingClassOrObject != null) return
+                    // If this node is a getter on a var, ignore it.
+                    if (source.property.isVar) return
+                }
+
+                node.checkReturnType(context, returnType)
+                node.checkReceiver(context)
             }
-            if (source is KtPropertyAccessor) {
-                // If this node is inside a class or object, ignore it.
-                if (source.property.containingClassOrObject != null) return
-                // If this node is a getter on a var, ignore it.
-                if (source.property.isVar) return
-            }
-
-            node.checkReturnType(context, returnType)
-            node.checkReceiver(context)
         }
-    }
 
     companion object {
-        val ModifierFactoryReturnType = Issue.create(
-            "ModifierFactoryReturnType",
-            "Modifier factory functions should return Modifier",
-            "Modifier factory functions should return Modifier as their type, and not a " +
-                "subtype of Modifier (such as Modifier.Element).",
-            Category.CORRECTNESS, 3, Severity.WARNING,
-            Implementation(
-                ModifierDeclarationDetector::class.java,
-                EnumSet.of(Scope.JAVA_FILE, Scope.TEST_SOURCES)
+        val ModifierFactoryReturnType =
+            Issue.create(
+                "ModifierFactoryReturnType",
+                "Modifier factory functions should return Modifier",
+                "Modifier factory functions should return Modifier as their type, and not a " +
+                    "subtype of Modifier (such as Modifier.Element).",
+                Category.CORRECTNESS,
+                3,
+                Severity.WARNING,
+                Implementation(
+                    ModifierDeclarationDetector::class.java,
+                    EnumSet.of(Scope.JAVA_FILE, Scope.TEST_SOURCES)
+                )
             )
-        )
 
-        val ModifierFactoryExtensionFunction = Issue.create(
-            "ModifierFactoryExtensionFunction",
-            "Modifier factory functions should be extensions on Modifier",
-            "Modifier factory functions should be defined as extension functions on" +
-                " Modifier to allow modifiers to be fluently chained.",
-            Category.CORRECTNESS, 3, Severity.WARNING,
-            Implementation(
-                ModifierDeclarationDetector::class.java,
-                EnumSet.of(Scope.JAVA_FILE, Scope.TEST_SOURCES)
+        val ModifierFactoryExtensionFunction =
+            Issue.create(
+                "ModifierFactoryExtensionFunction",
+                "Modifier factory functions should be extensions on Modifier",
+                "Modifier factory functions should be defined as extension functions on" +
+                    " Modifier to allow modifiers to be fluently chained.",
+                Category.CORRECTNESS,
+                3,
+                Severity.WARNING,
+                Implementation(
+                    ModifierDeclarationDetector::class.java,
+                    EnumSet.of(Scope.JAVA_FILE, Scope.TEST_SOURCES)
+                )
             )
-        )
 
-        val ModifierFactoryUnreferencedReceiver = Issue.create(
-            "ModifierFactoryUnreferencedReceiver",
-            "Modifier factory functions must use the receiver Modifier instance",
-            "Modifier factory functions are fluently chained to construct a chain of " +
-                "Modifier objects that will be applied to a layout. As a result, each factory " +
-                "function *must* use the receiver `Modifier` parameter, to ensure that the " +
-                "function is returning a chain that includes previous items in the chain. Make " +
-                "sure the returned chain either explicitly includes `this`, such as " +
-                "`return this.then(MyModifier)` or implicitly by returning a chain that starts " +
-                "with an implicit call to another factory function, such as " +
-                "`return myModifier()`, where `myModifier` is defined as " +
-                "`fun Modifier.myModifier(): Modifier`.",
-            Category.CORRECTNESS, 3, Severity.ERROR,
-            Implementation(
-                ModifierDeclarationDetector::class.java,
-                EnumSet.of(Scope.JAVA_FILE, Scope.TEST_SOURCES)
+        val ModifierFactoryUnreferencedReceiver =
+            Issue.create(
+                "ModifierFactoryUnreferencedReceiver",
+                "Modifier factory functions must use the receiver Modifier instance",
+                "Modifier factory functions are fluently chained to construct a chain of " +
+                    "Modifier objects that will be applied to a layout. As a result, each factory " +
+                    "function *must* use the receiver `Modifier` parameter, to ensure that the " +
+                    "function is returning a chain that includes previous items in the chain. Make " +
+                    "sure the returned chain either explicitly includes `this`, such as " +
+                    "`return this.then(MyModifier)` or implicitly by returning a chain that starts " +
+                    "with an implicit call to another factory function, such as " +
+                    "`return myModifier()`, where `myModifier` is defined as " +
+                    "`fun Modifier.myModifier(): Modifier`.",
+                Category.CORRECTNESS,
+                3,
+                Severity.ERROR,
+                Implementation(
+                    ModifierDeclarationDetector::class.java,
+                    EnumSet.of(Scope.JAVA_FILE, Scope.TEST_SOURCES)
+                )
             )
-        )
     }
 }
 
-/**
- * @see [ModifierDeclarationDetector.ModifierFactoryExtensionFunction]
- */
+/** @see [ModifierDeclarationDetector.ModifierFactoryExtensionFunction] */
 private fun UMethod.checkReceiver(context: JavaContext) {
     fun report(lintFix: LintFix? = null) {
         context.report(
@@ -172,11 +179,12 @@
         )
     }
 
-    val source = when (val source = sourcePsi) {
-        is KtFunction -> source
-        is KtPropertyAccessor -> source.property
-        else -> return
-    }
+    val source =
+        when (val source = sourcePsi) {
+            is KtFunction -> source
+            is KtPropertyAccessor -> source.property
+            else -> return
+        }
 
     val receiverTypeReference = source.receiverTypeReference
 
@@ -197,16 +205,17 @@
         val receiverType = (receiverTypeReference.typeElement as KtUserType)
         val receiverShortName = receiverType.referencedName
         // Try to resolve the class definition of the receiver
-        val receiverFqn = (
-            receiverType.referenceExpression.toUElement()?.tryResolve().toUElement() as? PsiClass
-            )?.qualifiedName
-        val hasModifierReceiver = if (receiverFqn != null) {
-            // If we could resolve the class, match fqn
-            receiverFqn == Names.Ui.Modifier.javaFqn
-        } else {
-            // Otherwise just try and match the short names
-            receiverShortName == Names.Ui.Modifier.shortName
-        }
+        val receiverFqn =
+            (receiverType.referenceExpression.toUElement()?.tryResolve().toUElement() as? PsiClass)
+                ?.qualifiedName
+        val hasModifierReceiver =
+            if (receiverFqn != null) {
+                // If we could resolve the class, match fqn
+                receiverFqn == Names.Ui.Modifier.javaFqn
+            } else {
+                // Otherwise just try and match the short names
+                receiverShortName == Names.Ui.Modifier.shortName
+            }
         if (!hasModifierReceiver) {
             report(
                 LintFix.create()
@@ -227,70 +236,75 @@
     }
 }
 
-/**
- * See [ModifierDeclarationDetector.ModifierFactoryUnreferencedReceiver]
- */
+/** See [ModifierDeclarationDetector.ModifierFactoryUnreferencedReceiver] */
 private fun UMethod.ensureReceiverIsReferenced(context: JavaContext) {
     val factoryMethod = this
     var isReceiverReferenced = false
-    accept(object : AbstractUastVisitor() {
-        /**
-         * Checks for calls to functions with an implicit receiver (member / extension function)
-         * that use the Modifier receiver from the outer factory function.
-         */
-        override fun visitCallExpression(node: UCallExpression): Boolean {
-            val ktCallExpression = node.sourcePsi as? KtCallExpression
-                ?: return isReceiverReferenced
-            analyze(ktCallExpression) {
-                val ktCall = ktCallExpression.resolveCall()?.singleCallOrNull<KtCall>()
-                val callee = (ktCall as? KtCallableMemberCall<*, *>)?.partiallyAppliedSymbol
-                val receiver = (callee?.extensionReceiver ?: callee?.dispatchReceiver)
-                    // Explicit receivers of `this` are handled separately in visitThisExpression -
-                    // that lets us be more defensive and avoid warning for cases like passing
-                    // `this` as a parameter to a function / class where we may run into false
-                    // positives if we only account for explicit receivers in a call expression.
-                    as? KtImplicitReceiverValue ?: return isReceiverReferenced
-                val symbol = receiver.symbol as? KtReceiverParameterSymbol
-                // The symbol of the enclosing factory method
-                val enclosingMethodSymbol = (factoryMethod.sourcePsi as? KtDeclaration)
-                    ?.getSymbol() as? KtFunctionSymbol
-                // If the receiver parameter symbol matches the outer modifier factory's
-                // symbol, then that means that the receiver for this call is the
-                // factory method, and not some other declaration that provides a modifier
-                // receiver.
-                if (symbol == enclosingMethodSymbol?.receiverParameter) {
-                    isReceiverReferenced = true
-                    // no further tree traversal, since we found receiver usage.
-                    return true
+    accept(
+        object : AbstractUastVisitor() {
+            /**
+             * Checks for calls to functions with an implicit receiver (member / extension function)
+             * that use the Modifier receiver from the outer factory function.
+             */
+            override fun visitCallExpression(node: UCallExpression): Boolean {
+                val ktCallExpression =
+                    node.sourcePsi as? KtCallExpression ?: return isReceiverReferenced
+                analyze(ktCallExpression) {
+                    val ktCall = ktCallExpression.resolveCall()?.singleCallOrNull<KtCall>()
+                    val callee = (ktCall as? KtCallableMemberCall<*, *>)?.partiallyAppliedSymbol
+                    val receiver =
+                        (callee?.extensionReceiver ?: callee?.dispatchReceiver)
+                        // Explicit receivers of `this` are handled separately in
+                        // visitThisExpression -
+                        // that lets us be more defensive and avoid warning for cases like passing
+                        // `this` as a parameter to a function / class where we may run into false
+                        // positives if we only account for explicit receivers in a call expression.
+                        as? KtImplicitReceiverValue ?: return isReceiverReferenced
+                    val symbol = receiver.symbol as? KtReceiverParameterSymbol
+                    // The symbol of the enclosing factory method
+                    val enclosingMethodSymbol =
+                        (factoryMethod.sourcePsi as? KtDeclaration)?.getSymbol()
+                            as? KtFunctionSymbol
+                    // If the receiver parameter symbol matches the outer modifier factory's
+                    // symbol, then that means that the receiver for this call is the
+                    // factory method, and not some other declaration that provides a modifier
+                    // receiver.
+                    if (symbol == enclosingMethodSymbol?.receiverParameter) {
+                        isReceiverReferenced = true
+                        // no further tree traversal, since we found receiver usage.
+                        return true
+                    }
                 }
+                return isReceiverReferenced
             }
-            return isReceiverReferenced
-        }
 
-        /**
-         * If `this` is explicitly referenced, and points to the receiver of the outer factory
-         * function, no error.
-         */
-        override fun visitThisExpression(node: UThisExpression): Boolean {
-            val ktThisExpression = node.sourcePsi as? KtThisExpression
-                ?: return isReceiverReferenced
-            analyze(ktThisExpression) {
-                val symbol = ktThisExpression.instanceReference.mainReference.resolveToSymbol()
-                // The symbol of the enclosing factory method
-                val enclosingMethodSymbol = (factoryMethod.sourcePsi as? KtDeclaration)
-                    ?.getSymbol() as? KtFunctionSymbol
-                // If the symbol `this` points to matches the enclosing factory method, then we
-                // consider the modifier receiver referenced. If the symbols do not match, `this`
-                // might point to an inner scope
-                if (symbol == enclosingMethodSymbol) {
-                    isReceiverReferenced = true
-                    // no further tree traversal, since we found receiver usage.
-                    return true
+            /**
+             * If `this` is explicitly referenced, and points to the receiver of the outer factory
+             * function, no error.
+             */
+            override fun visitThisExpression(node: UThisExpression): Boolean {
+                val ktThisExpression =
+                    node.sourcePsi as? KtThisExpression ?: return isReceiverReferenced
+                analyze(ktThisExpression) {
+                    val symbol = ktThisExpression.instanceReference.mainReference.resolveToSymbol()
+                    // The symbol of the enclosing factory method
+                    val enclosingMethodSymbol =
+                        (factoryMethod.sourcePsi as? KtDeclaration)?.getSymbol()
+                            as? KtFunctionSymbol
+                    // If the symbol `this` points to matches the enclosing factory method, then we
+                    // consider the modifier receiver referenced. If the symbols do not match,
+                    // `this`
+                    // might point to an inner scope
+                    if (symbol == enclosingMethodSymbol) {
+                        isReceiverReferenced = true
+                        // no further tree traversal, since we found receiver usage.
+                        return true
+                    }
                 }
+                return isReceiverReferenced
             }
-            return isReceiverReferenced
         }
-    })
+    )
     if (!isReceiverReferenced) {
         context.report(
             ModifierDeclarationDetector.ModifierFactoryUnreferencedReceiver,
@@ -301,9 +315,7 @@
     }
 }
 
-/**
- * @see [ModifierDeclarationDetector.ModifierFactoryReturnType]
- */
+/** @see [ModifierDeclarationDetector.ModifierFactoryReturnType] */
 private fun UMethod.checkReturnType(context: JavaContext, returnType: PsiType) {
     fun report(lintFix: LintFix? = null) {
         context.report(
@@ -389,9 +401,9 @@
 
 /**
  * TODO: UMethod.returnTypeReference is not available in LINT_API_MIN, so instead use this with a
- * [KtCallableDeclaration].
- * See [org.jetbrains.uast.kotlin.declarations.KotlinUMethod.returnTypeReference] on newer UAST
- * versions.
+ *   [KtCallableDeclaration]. See
+ *   [org.jetbrains.uast.kotlin.declarations.KotlinUMethod.returnTypeReference] on newer UAST
+ *   versions.
  */
 private val KtCallableDeclaration.returnTypeString: String?
     get() {
diff --git a/compose/ui/ui-lint/src/main/java/androidx/compose/ui/lint/ModifierNodeInspectablePropertiesDetector.kt b/compose/ui/ui-lint/src/main/java/androidx/compose/ui/lint/ModifierNodeInspectablePropertiesDetector.kt
index 7e6a349..a621fbf 100644
--- a/compose/ui/ui-lint/src/main/java/androidx/compose/ui/lint/ModifierNodeInspectablePropertiesDetector.kt
+++ b/compose/ui/ui-lint/src/main/java/androidx/compose/ui/lint/ModifierNodeInspectablePropertiesDetector.kt
@@ -38,10 +38,10 @@
  * function. Classes that extend from another class which overrides this function satisfy the
  * inspection.
  *
- * We suggest overriding this method to provide more accurate, complete, and consistent data in
- * the layout inspector. This check reports an error for AndroidX libraries, since we want to ensure
- * each modifier has full inspection support. Additionally, the base implementation can only work
- * if kotlin-reflect is in the classpath, which is avoided by having a custom implementation.
+ * We suggest overriding this method to provide more accurate, complete, and consistent data in the
+ * layout inspector. This check reports an error for AndroidX libraries, since we want to ensure
+ * each modifier has full inspection support. Additionally, the base implementation can only work if
+ * kotlin-reflect is in the classpath, which is avoided by having a custom implementation.
  */
 class ModifierNodeInspectablePropertiesDetector : Detector(), Detector.UastScanner {
 
@@ -73,9 +73,9 @@
             return null
         }
 
-        return uastDeclarations
-            .filterIsInstance<UMethod>()
-            .firstOrNull { it.hasInspectablePropertiesSignature() }
+        return uastDeclarations.filterIsInstance<UMethod>().firstOrNull {
+            it.hasInspectablePropertiesSignature()
+        }
             ?: UastFacade.convertWithParent<UClass>(javaPsi.superClass)
                 ?.getInspectablePropertiesFunctionOverride()
     }
@@ -97,18 +97,21 @@
         private const val InspectionFunName = "inspectableProperties"
         private const val InspectionFunFqReceiver = "androidx.compose.ui.platform.InspectorInfo"
 
-        val ModifierNodeInspectableProperties = Issue.create(
-            "ModifierNodeInspectableProperties",
-            "ModifierNodeElement missing inspectableProperties",
-            "ModifierNodeElements may override inspectableProperties() to provide information " +
-                "about the modifier in the layout inspector. The default implementation attempts " +
-                "to read all of the properties on the class reflectively, which may not " +
-                "comprehensively or effectively describe the modifier.",
-            Category.PRODUCTIVITY, 4, Severity.INFORMATIONAL,
-            Implementation(
-                ModifierNodeInspectablePropertiesDetector::class.java,
-                Scope.JAVA_FILE_SCOPE
+        val ModifierNodeInspectableProperties =
+            Issue.create(
+                "ModifierNodeInspectableProperties",
+                "ModifierNodeElement missing inspectableProperties",
+                "ModifierNodeElements may override inspectableProperties() to provide information " +
+                    "about the modifier in the layout inspector. The default implementation attempts " +
+                    "to read all of the properties on the class reflectively, which may not " +
+                    "comprehensively or effectively describe the modifier.",
+                Category.PRODUCTIVITY,
+                4,
+                Severity.INFORMATIONAL,
+                Implementation(
+                    ModifierNodeInspectablePropertiesDetector::class.java,
+                    Scope.JAVA_FILE_SCOPE
+                )
             )
-        )
     }
 }
diff --git a/compose/ui/ui-lint/src/main/java/androidx/compose/ui/lint/ModifierParameterDetector.kt b/compose/ui/ui-lint/src/main/java/androidx/compose/ui/lint/ModifierParameterDetector.kt
index 3577db2..40b3107 100644
--- a/compose/ui/ui-lint/src/main/java/androidx/compose/ui/lint/ModifierParameterDetector.kt
+++ b/compose/ui/ui-lint/src/main/java/androidx/compose/ui/lint/ModifierParameterDetector.kt
@@ -52,121 +52,125 @@
 class ModifierParameterDetector : Detector(), SourceCodeScanner {
     override fun getApplicableUastTypes() = listOf(UMethod::class.java)
 
-    override fun createUastHandler(context: JavaContext) = object : UElementHandler() {
-        override fun visitMethod(node: UMethod) {
-            // Ignore non-composable functions
-            if (!node.isComposable) return
+    override fun createUastHandler(context: JavaContext) =
+        object : UElementHandler() {
+            override fun visitMethod(node: UMethod) {
+                // Ignore non-composable functions
+                if (!node.isComposable) return
 
-            // Ignore non-unit composable functions
-            if (!node.returnsUnit) return
+                // Ignore non-unit composable functions
+                if (!node.returnsUnit) return
 
-            val modifierParameter = node.uastParameters.firstOrNull { parameter ->
-                parameter.sourcePsi is KtParameter && parameter.type.inheritsFrom(Names.Ui.Modifier)
-            } ?: return
+                val modifierParameter =
+                    node.uastParameters.firstOrNull { parameter ->
+                        parameter.sourcePsi is KtParameter &&
+                            parameter.type.inheritsFrom(Names.Ui.Modifier)
+                    } ?: return
 
-            // Need to strongly type this or else Kotlinc cannot resolve overloads for
-            // getNameLocation
-            val modifierParameterElement: UElement = modifierParameter
+                // Need to strongly type this or else Kotlinc cannot resolve overloads for
+                // getNameLocation
+                val modifierParameterElement: UElement = modifierParameter
 
-            val source = modifierParameter.sourcePsi as KtParameter
+                val source = modifierParameter.sourcePsi as KtParameter
 
-            val modifierName = Names.Ui.Modifier.shortName
+                val modifierName = Names.Ui.Modifier.shortName
 
-            if (modifierParameter.name != ModifierParameterName) {
-                context.report(
-                    ModifierParameter,
-                    modifierParameterElement,
-                    context.getNameLocation(modifierParameterElement),
-                    "$modifierName parameter should be named $ModifierParameterName",
-                    LintFix.create()
-                        .replace()
-                        .name("Change name to $ModifierParameterName")
-                        .text(modifierParameter.name)
-                        .with(ModifierParameterName)
-                        .autoFix()
-                        .build()
-                )
-            }
-
-            if (modifierParameter.type.canonicalText != Names.Ui.Modifier.javaFqn) {
-                context.report(
-                    ModifierParameter,
-                    modifierParameterElement,
-                    context.getNameLocation(modifierParameterElement),
-                    "$modifierName parameter should have a type of $modifierName",
-                    LintFix.create()
-                        .replace()
-                        .range(context.getLocation(modifierParameterElement))
-                        .name("Change type to $modifierName")
-                        .text(source.typeReference!!.text)
-                        .with(modifierName)
-                        .autoFix()
-                        .build()
-                )
-            }
-
-            if (source.hasDefaultValue()) {
-                val defaultValue = source.defaultValue!!
-                // If the default value is not a reference expression, then it isn't `Modifier`
-                // anyway and we can just report an error
-                val referenceExpression = source.defaultValue as? KtNameReferenceExpression
-                if (referenceExpression?.getReferencedName() != modifierName) {
+                if (modifierParameter.name != ModifierParameterName) {
                     context.report(
                         ModifierParameter,
                         modifierParameterElement,
                         context.getNameLocation(modifierParameterElement),
-                        "Optional $modifierName parameter should have a default value " +
-                            "of `$modifierName`",
+                        "$modifierName parameter should be named $ModifierParameterName",
+                        LintFix.create()
+                            .replace()
+                            .name("Change name to $ModifierParameterName")
+                            .text(modifierParameter.name)
+                            .with(ModifierParameterName)
+                            .autoFix()
+                            .build()
+                    )
+                }
+
+                if (modifierParameter.type.canonicalText != Names.Ui.Modifier.javaFqn) {
+                    context.report(
+                        ModifierParameter,
+                        modifierParameterElement,
+                        context.getNameLocation(modifierParameterElement),
+                        "$modifierName parameter should have a type of $modifierName",
                         LintFix.create()
                             .replace()
                             .range(context.getLocation(modifierParameterElement))
-                            .name("Change default value to $modifierName")
-                            .text(defaultValue.text)
+                            .name("Change type to $modifierName")
+                            .text(source.typeReference!!.text)
                             .with(modifierName)
                             .autoFix()
                             .build()
                     )
                 }
-                val index = node.uastParameters.indexOf(modifierParameter)
-                val optionalParameterIndex = node.uastParameters.indexOfFirst { parameter ->
-                    (parameter.sourcePsi as? KtParameter)?.hasDefaultValue() == true
-                }
-                if (index != optionalParameterIndex) {
-                    context.report(
-                        ModifierParameter,
-                        modifierParameterElement,
-                        context.getNameLocation(modifierParameterElement),
-                        "$modifierName parameter should be the first optional parameter",
-                        // Hard to make a lint fix for this and keep parameter formatting, so
-                        // ignore it
-                    )
+
+                if (source.hasDefaultValue()) {
+                    val defaultValue = source.defaultValue!!
+                    // If the default value is not a reference expression, then it isn't `Modifier`
+                    // anyway and we can just report an error
+                    val referenceExpression = source.defaultValue as? KtNameReferenceExpression
+                    if (referenceExpression?.getReferencedName() != modifierName) {
+                        context.report(
+                            ModifierParameter,
+                            modifierParameterElement,
+                            context.getNameLocation(modifierParameterElement),
+                            "Optional $modifierName parameter should have a default value " +
+                                "of `$modifierName`",
+                            LintFix.create()
+                                .replace()
+                                .range(context.getLocation(modifierParameterElement))
+                                .name("Change default value to $modifierName")
+                                .text(defaultValue.text)
+                                .with(modifierName)
+                                .autoFix()
+                                .build()
+                        )
+                    }
+                    val index = node.uastParameters.indexOf(modifierParameter)
+                    val optionalParameterIndex =
+                        node.uastParameters.indexOfFirst { parameter ->
+                            (parameter.sourcePsi as? KtParameter)?.hasDefaultValue() == true
+                        }
+                    if (index != optionalParameterIndex) {
+                        context.report(
+                            ModifierParameter,
+                            modifierParameterElement,
+                            context.getNameLocation(modifierParameterElement),
+                            "$modifierName parameter should be the first optional parameter",
+                            // Hard to make a lint fix for this and keep parameter formatting, so
+                            // ignore it
+                        )
+                    }
                 }
             }
         }
-    }
 
     companion object {
-        val ModifierParameter = Issue.create(
-            "ModifierParameter",
-            "Guidelines for Modifier parameters in a Composable function",
-            "The first (or only) Modifier parameter in a Composable function should follow the " +
-                "following rules:" +
-                "\n- Be named `$ModifierParameterName`" +
-                "\n- Have a type of `${Names.Ui.Modifier.shortName}`" +
-                "\n- Either have no default value, or have a default value of " +
-                "`${Names.Ui.Modifier.shortName}`" +
-                "\n- If optional, be the first optional parameter in the parameter list",
-            Category.CORRECTNESS, 3, Severity.WARNING,
-            Implementation(
-                ModifierParameterDetector::class.java,
-                EnumSet.of(Scope.JAVA_FILE, Scope.TEST_SOURCES)
+        val ModifierParameter =
+            Issue.create(
+                "ModifierParameter",
+                "Guidelines for Modifier parameters in a Composable function",
+                "The first (or only) Modifier parameter in a Composable function should follow the " +
+                    "following rules:" +
+                    "\n- Be named `$ModifierParameterName`" +
+                    "\n- Have a type of `${Names.Ui.Modifier.shortName}`" +
+                    "\n- Either have no default value, or have a default value of " +
+                    "`${Names.Ui.Modifier.shortName}`" +
+                    "\n- If optional, be the first optional parameter in the parameter list",
+                Category.CORRECTNESS,
+                3,
+                Severity.WARNING,
+                Implementation(
+                    ModifierParameterDetector::class.java,
+                    EnumSet.of(Scope.JAVA_FILE, Scope.TEST_SOURCES)
+                )
             )
-        )
     }
 }
 
-private val ModifierParameterName = Names.Ui.Modifier.shortName.replaceFirstChar {
-    it.lowercase(
-        Locale.ROOT
-    )
-}
+private val ModifierParameterName =
+    Names.Ui.Modifier.shortName.replaceFirstChar { it.lowercase(Locale.ROOT) }
diff --git a/compose/ui/ui-lint/src/main/java/androidx/compose/ui/lint/MultipleAwaitPointerEventScopesDetector.kt b/compose/ui/ui-lint/src/main/java/androidx/compose/ui/lint/MultipleAwaitPointerEventScopesDetector.kt
index 03959ae..db8170d 100644
--- a/compose/ui/ui-lint/src/main/java/androidx/compose/ui/lint/MultipleAwaitPointerEventScopesDetector.kt
+++ b/compose/ui/ui-lint/src/main/java/androidx/compose/ui/lint/MultipleAwaitPointerEventScopesDetector.kt
@@ -60,12 +60,14 @@
         val containingDeclaration = node.getContainingDeclaration()
 
         // The element we will look inside
-        val boundaryElement = node.withContainingElements.first {
-            // Reached the containing function / lambda
-            // or Found a modifier expression - don't look outside the scope of this modifier
-            it == containingDeclaration || (it is UExpression) && it.getExpressionType()
-                ?.inheritsFrom(Names.Ui.Modifier) == true
-        }
+        val boundaryElement =
+            node.withContainingElements.first {
+                // Reached the containing function / lambda
+                // or Found a modifier expression - don't look outside the scope of this modifier
+                it == containingDeclaration ||
+                    (it is UExpression) &&
+                        it.getExpressionType()?.inheritsFrom(Names.Ui.Modifier) == true
+            }
 
         val awaitPointerEventCalls = searchAwaitPointerScopeCalls(boundaryElement)
 
@@ -87,17 +89,19 @@
 
     private fun searchAwaitPointerScopeCalls(parent: UElement): Int {
         var awaitPointerEventCallsCount = 0
-        parent.accept(object : AbstractUastVisitor() {
-            override fun visitCallExpression(node: UCallExpression): Boolean {
-                val method = node.tryResolve() as? PsiMethod ?: return false
-                if (!method.isInPackageName(Names.Ui.Pointer.PackageName)) return false
+        parent.accept(
+            object : AbstractUastVisitor() {
+                override fun visitCallExpression(node: UCallExpression): Boolean {
+                    val method = node.tryResolve() as? PsiMethod ?: return false
+                    if (!method.isInPackageName(Names.Ui.Pointer.PackageName)) return false
 
-                if (method.name == Names.Ui.Pointer.AwaitPointerEventScope.shortName) {
-                    awaitPointerEventCallsCount++
+                    if (method.name == Names.Ui.Pointer.AwaitPointerEventScope.shortName) {
+                        awaitPointerEventCallsCount++
+                    }
+                    return false
                 }
-                return false
             }
-        })
+        )
 
         return awaitPointerEventCallsCount
     }
@@ -107,19 +111,22 @@
         const val ErrorMessage =
             "Suspicious use of multiple awaitPointerEventScope blocks. Using " +
                 "multiple awaitPointerEventScope blocks may cause some input events to be dropped."
-        val MultipleAwaitPointerEventScopes = Issue.create(
-            IssueId,
-            ErrorMessage,
-            "Pointer Input events are queued inside awaitPointerEventScope. Multiple " +
-                "calls to awaitPointerEventScope may exit the scope. During this time " +
-                "there is no guarantee that the events will be queued and some " +
-                "events may be dropped. It is recommended to use a single top-level block and " +
-                "perform the pointer events processing within such block.",
-            Category.CORRECTNESS, 3, Severity.WARNING,
-            Implementation(
-                MultipleAwaitPointerEventScopesDetector::class.java,
-                EnumSet.of(Scope.JAVA_FILE, Scope.TEST_SOURCES)
+        val MultipleAwaitPointerEventScopes =
+            Issue.create(
+                IssueId,
+                ErrorMessage,
+                "Pointer Input events are queued inside awaitPointerEventScope. Multiple " +
+                    "calls to awaitPointerEventScope may exit the scope. During this time " +
+                    "there is no guarantee that the events will be queued and some " +
+                    "events may be dropped. It is recommended to use a single top-level block and " +
+                    "perform the pointer events processing within such block.",
+                Category.CORRECTNESS,
+                3,
+                Severity.WARNING,
+                Implementation(
+                    MultipleAwaitPointerEventScopesDetector::class.java,
+                    EnumSet.of(Scope.JAVA_FILE, Scope.TEST_SOURCES)
+                )
             )
-        )
     }
 }
diff --git a/compose/ui/ui-lint/src/main/java/androidx/compose/ui/lint/ReturnFromAwaitPointerEventScopeDetector.kt b/compose/ui/ui-lint/src/main/java/androidx/compose/ui/lint/ReturnFromAwaitPointerEventScopeDetector.kt
index a563fca..1168ecf 100644
--- a/compose/ui/ui-lint/src/main/java/androidx/compose/ui/lint/ReturnFromAwaitPointerEventScopeDetector.kt
+++ b/compose/ui/ui-lint/src/main/java/androidx/compose/ui/lint/ReturnFromAwaitPointerEventScopeDetector.kt
@@ -45,8 +45,8 @@
         if (!method.isInPackageName(Names.Ui.Pointer.PackageName)) return
         val methodParent = skipParenthesizedExprUp(node.uastParent)
         val isAssignedToVariable = methodParent is ULocalVariable
-        val isReturnExpression = methodParent is UReturnExpression &&
-            !methodParent.isIncorrectImplicitReturnInLambda()
+        val isReturnExpression =
+            methodParent is UReturnExpression && !methodParent.isIncorrectImplicitReturnInLambda()
 
         if (isAssignedToVariable || isReturnExpression) {
             context.report(
@@ -60,21 +60,24 @@
 
     companion object {
         const val IssueId: String = "ReturnFromAwaitPointerEventScope"
-        const val ErrorMessage = "Returning from awaitPointerEventScope may cause some input " +
-            "events to be dropped"
-        val ExitAwaitPointerEventScope = Issue.create(
-            IssueId,
-            ErrorMessage,
-            "Pointer Input events are queued inside awaitPointerEventScope. " +
-                "By using the return value of awaitPointerEventScope one might unexpectedly lose " +
-                "events. If another awaitPointerEventScope is restarted " +
-                "there is no guarantee that the events will persist between those calls. In this " +
-                "case you should keep all events inside the awaitPointerEventScope block",
-            Category.CORRECTNESS, 3, Severity.WARNING,
-            Implementation(
-                ReturnFromAwaitPointerEventScopeDetector::class.java,
-                EnumSet.of(Scope.JAVA_FILE, Scope.TEST_SOURCES)
+        const val ErrorMessage =
+            "Returning from awaitPointerEventScope may cause some input " + "events to be dropped"
+        val ExitAwaitPointerEventScope =
+            Issue.create(
+                IssueId,
+                ErrorMessage,
+                "Pointer Input events are queued inside awaitPointerEventScope. " +
+                    "By using the return value of awaitPointerEventScope one might unexpectedly lose " +
+                    "events. If another awaitPointerEventScope is restarted " +
+                    "there is no guarantee that the events will persist between those calls. In this " +
+                    "case you should keep all events inside the awaitPointerEventScope block",
+                Category.CORRECTNESS,
+                3,
+                Severity.WARNING,
+                Implementation(
+                    ReturnFromAwaitPointerEventScopeDetector::class.java,
+                    EnumSet.of(Scope.JAVA_FILE, Scope.TEST_SOURCES)
+                )
             )
-        )
     }
 }
diff --git a/compose/ui/ui-lint/src/main/java/androidx/compose/ui/lint/SuspiciousCompositionLocalModifierReadDetector.kt b/compose/ui/ui-lint/src/main/java/androidx/compose/ui/lint/SuspiciousCompositionLocalModifierReadDetector.kt
index 4e4b0cd..34558be 100644
--- a/compose/ui/ui-lint/src/main/java/androidx/compose/ui/lint/SuspiciousCompositionLocalModifierReadDetector.kt
+++ b/compose/ui/ui-lint/src/main/java/androidx/compose/ui/lint/SuspiciousCompositionLocalModifierReadDetector.kt
@@ -61,8 +61,8 @@
             if (node.containingClass.isClConsumerNode()) {
                 if (node.name in NodeLifecycleCallbacks) {
                     report(context, usage) { localBeingRead ->
-                        val action = node.name.removePrefix("on")
-                            .replaceFirstChar { it.lowercase() }
+                        val action =
+                            node.name.removePrefix("on").replaceFirstChar { it.lowercase() }
 
                         "Reading $localBeingRead in ${node.name} will only access the " +
                             "CompositionLocal's value when the modifier is ${action}ed. " +
@@ -107,8 +107,8 @@
         usage: UCallExpression,
         message: (compositionLocalName: String) -> String
     ) {
-        val localBeingRead = usage.getArgumentForParameter(1)?.sourcePsi?.text
-            ?: "a composition local"
+        val localBeingRead =
+            usage.getArgumentForParameter(1)?.sourcePsi?.text ?: "a composition local"
 
         context.report(
             SuspiciousCompositionLocalModifierRead,
@@ -118,8 +118,7 @@
     }
 
     private fun PsiClass?.isClConsumerNode(): Boolean =
-        this?.implementsListTypes
-            ?.any { it.canonicalText == ClConsumerModifierNode } == true
+        this?.implementsListTypes?.any { it.canonicalText == ClConsumerModifierNode } == true
 
     private fun UCallExpression.isLazyDelegate(): Boolean =
         resolve()?.run { isInPackageName(Package("kotlin")) && name == "lazy" } == true
@@ -128,26 +127,29 @@
         private const val ClConsumerModifierNode =
             "androidx.compose.ui.node.CompositionLocalConsumerModifierNode"
 
-        val SuspiciousCompositionLocalModifierRead = Issue.create(
-            "SuspiciousCompositionLocalModifierRead",
-            "CompositionLocals should not be read in Modifier.onAttach() or Modifier.onDetach()",
-            "Jetpack Compose is unable to send updated values of a CompositionLocal when it's " +
-                "read in a Modifier.Node's initializer and onAttach() or onDetach() callbacks. " +
-                "Modifier.Node's callbacks are not aware of snapshot reads, and their lifecycle " +
-                "callbacks are not invoked on every recomposition. If you read a " +
-                "CompositionLocal in onAttach() or onDetach(), you will only get the " +
-                "CompositionLocal's value once at the moment of the read, which may lead to " +
-                "unexpected behaviors. We recommend instead reading CompositionLocals at " +
-                "time-of-use in callbacks that apply your Modifier's behavior, like measure() " +
-                "for LayoutModifierNode, draw() for DrawModifierNode, and so on. To observe the " +
-                "value of the CompositionLocal manually, extend from the ObserverNode interface " +
-                "and place the read inside an observeReads {} block within the " +
-                "onObservedReadsChanged() callback.",
-            Category.CORRECTNESS, 3, Severity.ERROR,
-            Implementation(
-                SuspiciousCompositionLocalModifierReadDetector::class.java,
-                EnumSet.of(Scope.JAVA_FILE, Scope.TEST_SOURCES)
+        val SuspiciousCompositionLocalModifierRead =
+            Issue.create(
+                "SuspiciousCompositionLocalModifierRead",
+                "CompositionLocals should not be read in Modifier.onAttach() or Modifier.onDetach()",
+                "Jetpack Compose is unable to send updated values of a CompositionLocal when it's " +
+                    "read in a Modifier.Node's initializer and onAttach() or onDetach() callbacks. " +
+                    "Modifier.Node's callbacks are not aware of snapshot reads, and their lifecycle " +
+                    "callbacks are not invoked on every recomposition. If you read a " +
+                    "CompositionLocal in onAttach() or onDetach(), you will only get the " +
+                    "CompositionLocal's value once at the moment of the read, which may lead to " +
+                    "unexpected behaviors. We recommend instead reading CompositionLocals at " +
+                    "time-of-use in callbacks that apply your Modifier's behavior, like measure() " +
+                    "for LayoutModifierNode, draw() for DrawModifierNode, and so on. To observe the " +
+                    "value of the CompositionLocal manually, extend from the ObserverNode interface " +
+                    "and place the read inside an observeReads {} block within the " +
+                    "onObservedReadsChanged() callback.",
+                Category.CORRECTNESS,
+                3,
+                Severity.ERROR,
+                Implementation(
+                    SuspiciousCompositionLocalModifierReadDetector::class.java,
+                    EnumSet.of(Scope.JAVA_FILE, Scope.TEST_SOURCES)
+                )
             )
-        )
     }
 }
diff --git a/compose/ui/ui-lint/src/main/java/androidx/compose/ui/lint/SuspiciousModifierThenDetector.kt b/compose/ui/ui-lint/src/main/java/androidx/compose/ui/lint/SuspiciousModifierThenDetector.kt
index c2d960b..8b35d23 100644
--- a/compose/ui/ui-lint/src/main/java/androidx/compose/ui/lint/SuspiciousModifierThenDetector.kt
+++ b/compose/ui/ui-lint/src/main/java/androidx/compose/ui/lint/SuspiciousModifierThenDetector.kt
@@ -62,69 +62,74 @@
         val otherModifierArgument = node.valueArguments.firstOrNull() ?: return
         val otherModifierArgumentSource = otherModifierArgument.sourcePsi ?: return
 
-        otherModifierArgument.accept(object : AbstractUastVisitor() {
-            /**
-             * Visit all calls to look for calls to a Modifier factory with implicit receiver
-             */
-            override fun visitCallExpression(node: UCallExpression): Boolean {
-                val hasModifierReceiverType =
-                    node.receiverType?.inheritsFrom(Names.Ui.Modifier) == true
-                val usesImplicitThis = node.receiver == null
+        otherModifierArgument.accept(
+            object : AbstractUastVisitor() {
+                /**
+                 * Visit all calls to look for calls to a Modifier factory with implicit receiver
+                 */
+                override fun visitCallExpression(node: UCallExpression): Boolean {
+                    val hasModifierReceiverType =
+                        node.receiverType?.inheritsFrom(Names.Ui.Modifier) == true
+                    val usesImplicitThis = node.receiver == null
 
-                if (!hasModifierReceiverType || !usesImplicitThis) {
+                    if (!hasModifierReceiverType || !usesImplicitThis) {
+                        return false
+                    }
+
+                    val ktCallExpression = node.sourcePsi as? KtCallExpression ?: return false
+                    // Resolve the implicit `this` to its source, if possible.
+                    val implicitReceiver =
+                        analyze(ktCallExpression) {
+                            getImplicitReceiverValue(ktCallExpression)?.getImplicitReceiverPsi()
+                        }
+
+                    // The receiver used by the modifier function is defined within the then() call,
+                    // such as then(Modifier.composed { otherModifierFactory() }). We don't know
+                    // what
+                    // the value of this receiver will be, so we ignore this case.
+                    if (implicitReceiver.isBelow(otherModifierArgumentSource)) {
+                        return false
+                    }
+
+                    context.report(
+                        SuspiciousModifierThen,
+                        node,
+                        context.getNameLocation(node),
+                        "Using Modifier.then with a Modifier factory function with an implicit receiver"
+                    )
+
+                    // Keep on searching for more errors
                     return false
                 }
-
-                val ktCallExpression = node.sourcePsi as? KtCallExpression ?: return false
-                // Resolve the implicit `this` to its source, if possible.
-                val implicitReceiver = analyze(ktCallExpression) {
-                    getImplicitReceiverValue(ktCallExpression)?.getImplicitReceiverPsi()
-                }
-
-                // The receiver used by the modifier function is defined within the then() call,
-                // such as then(Modifier.composed { otherModifierFactory() }). We don't know what
-                // the value of this receiver will be, so we ignore this case.
-                if (implicitReceiver.isBelow(otherModifierArgumentSource)) {
-                    return false
-                }
-
-                context.report(
-                    SuspiciousModifierThen,
-                    node,
-                    context.getNameLocation(node),
-                    "Using Modifier.then with a Modifier factory function with an implicit receiver"
-                )
-
-                // Keep on searching for more errors
-                return false
             }
-        })
+        )
     }
 
     companion object {
-        val SuspiciousModifierThen = Issue.create(
-            "SuspiciousModifierThen",
-            "Using Modifier.then with a Modifier factory function with an implicit receiver",
-            "Calling a Modifier factory function with an implicit receiver inside " +
-                "Modifier.then will result in the receiver (`this`) being added twice to the " +
-                "chain. For example, fun Modifier.myModifier() = this.then(otherModifier()) - " +
-                "the implementation of factory functions such as Modifier.otherModifier() will " +
-                "internally call this.then(...) to chain the provided modifier with their " +
-                "implementation. When you expand this.then(otherModifier()), it becomes: " +
-                "this.then(this.then(OtherModifierImplementation)) - so you can see that `this` " +
-                "is included twice in the chain, which results in modifiers such as padding " +
-                "being applied twice, for example. Instead, you should either remove the then() " +
-                "and directly chain the factory function on the receiver, this.otherModifier(), " +
-                "or add the empty Modifier as the receiver for the factory, such as " +
-                "this.then(Modifier.otherModifier())",
-            Category.CORRECTNESS,
-            3,
-            Severity.ERROR,
-            Implementation(
-                SuspiciousModifierThenDetector::class.java,
-                EnumSet.of(Scope.JAVA_FILE, Scope.TEST_SOURCES)
+        val SuspiciousModifierThen =
+            Issue.create(
+                "SuspiciousModifierThen",
+                "Using Modifier.then with a Modifier factory function with an implicit receiver",
+                "Calling a Modifier factory function with an implicit receiver inside " +
+                    "Modifier.then will result in the receiver (`this`) being added twice to the " +
+                    "chain. For example, fun Modifier.myModifier() = this.then(otherModifier()) - " +
+                    "the implementation of factory functions such as Modifier.otherModifier() will " +
+                    "internally call this.then(...) to chain the provided modifier with their " +
+                    "implementation. When you expand this.then(otherModifier()), it becomes: " +
+                    "this.then(this.then(OtherModifierImplementation)) - so you can see that `this` " +
+                    "is included twice in the chain, which results in modifiers such as padding " +
+                    "being applied twice, for example. Instead, you should either remove the then() " +
+                    "and directly chain the factory function on the receiver, this.otherModifier(), " +
+                    "or add the empty Modifier as the receiver for the factory, such as " +
+                    "this.then(Modifier.otherModifier())",
+                Category.CORRECTNESS,
+                3,
+                Severity.ERROR,
+                Implementation(
+                    SuspiciousModifierThenDetector::class.java,
+                    EnumSet.of(Scope.JAVA_FILE, Scope.TEST_SOURCES)
+                )
             )
-        )
     }
 }
 
diff --git a/compose/ui/ui-lint/src/main/java/androidx/compose/ui/lint/UiIssueRegistry.kt b/compose/ui/ui-lint/src/main/java/androidx/compose/ui/lint/UiIssueRegistry.kt
index 78e535b9..deb81a3 100644
--- a/compose/ui/ui-lint/src/main/java/androidx/compose/ui/lint/UiIssueRegistry.kt
+++ b/compose/ui/ui-lint/src/main/java/androidx/compose/ui/lint/UiIssueRegistry.kt
@@ -22,28 +22,31 @@
 import com.android.tools.lint.client.api.Vendor
 import com.android.tools.lint.detector.api.CURRENT_API
 
-/**
- * [IssueRegistry] containing Compose UI specific lint issues.
- */
+/** [IssueRegistry] containing Compose UI specific lint issues. */
 class UiIssueRegistry : IssueRegistry() {
     // Tests are run with this version. We ensure that with ApiLintVersionsTest
     override val api = 14
     override val minApi = CURRENT_API
-    override val issues get() = listOf(
-        ComposedModifierDetector.UnnecessaryComposedModifier,
-        ModifierDeclarationDetector.ModifierFactoryExtensionFunction,
-        ModifierDeclarationDetector.ModifierFactoryReturnType,
-        ModifierDeclarationDetector.ModifierFactoryUnreferencedReceiver,
-        ModifierNodeInspectablePropertiesDetector.ModifierNodeInspectableProperties,
-        ModifierParameterDetector.ModifierParameter,
-        MultipleAwaitPointerEventScopesDetector.MultipleAwaitPointerEventScopes,
-        ReturnFromAwaitPointerEventScopeDetector.ExitAwaitPointerEventScope,
-        SuspiciousCompositionLocalModifierReadDetector.SuspiciousCompositionLocalModifierRead,
-        SuspiciousModifierThenDetector.SuspiciousModifierThen
-    )
-    override val vendor = Vendor(
-        vendorName = "Jetpack Compose",
-        identifier = "androidx.compose.ui",
-        feedbackUrl = "https://issuetracker.google.com/issues/new?component=612128"
-    )
+    override val issues
+        get() =
+            listOf(
+                ComposedModifierDetector.UnnecessaryComposedModifier,
+                ModifierDeclarationDetector.ModifierFactoryExtensionFunction,
+                ModifierDeclarationDetector.ModifierFactoryReturnType,
+                ModifierDeclarationDetector.ModifierFactoryUnreferencedReceiver,
+                ModifierNodeInspectablePropertiesDetector.ModifierNodeInspectableProperties,
+                ModifierParameterDetector.ModifierParameter,
+                MultipleAwaitPointerEventScopesDetector.MultipleAwaitPointerEventScopes,
+                ReturnFromAwaitPointerEventScopeDetector.ExitAwaitPointerEventScope,
+                SuspiciousCompositionLocalModifierReadDetector
+                    .SuspiciousCompositionLocalModifierRead,
+                SuspiciousModifierThenDetector.SuspiciousModifierThen
+            )
+
+    override val vendor =
+        Vendor(
+            vendorName = "Jetpack Compose",
+            identifier = "androidx.compose.ui",
+            feedbackUrl = "https://issuetracker.google.com/issues/new?component=612128"
+        )
 }
diff --git a/compose/ui/ui-lint/src/test/java/androidx/compose/ui/lint/ComposedModifierDetectorTest.kt b/compose/ui/ui-lint/src/test/java/androidx/compose/ui/lint/ComposedModifierDetectorTest.kt
index 80b3d8d..22c0708 100644
--- a/compose/ui/ui-lint/src/test/java/androidx/compose/ui/lint/ComposedModifierDetectorTest.kt
+++ b/compose/ui/ui-lint/src/test/java/androidx/compose/ui/lint/ComposedModifierDetectorTest.kt
@@ -29,9 +29,7 @@
 
 /* ktlint-disable max-line-length */
 
-/**
- * Test for [ComposedModifierDetector].
- */
+/** Test for [ComposedModifierDetector]. */
 @RunWith(JUnit4::class)
 class ComposedModifierDetectorTest : LintDetectorTest() {
     override fun getDetector(): Detector = ComposedModifierDetector()
@@ -41,9 +39,10 @@
 
     @Test
     fun noComposableCalls() {
-        lint().files(
-            kotlin(
-                """
+        lint()
+            .files(
+                kotlin(
+                    """
                 package test
 
                 import androidx.compose.ui.Modifier
@@ -66,11 +65,11 @@
 
                 fun Modifier.test4(): Modifier = composed({}, { this@test4})
             """
-            ),
-            UiStubs.composed,
-            Stubs.Composable,
-            Stubs.Modifier
-        )
+                ),
+                UiStubs.composed,
+                Stubs.Composable,
+                Stubs.Modifier
+            )
             .skipTestModes(TestMode.WHITESPACE) // b/202187519, remove when upgrading to 7.1.0
             .run()
             .expect(
@@ -94,9 +93,10 @@
 
     @Test
     fun composableCalls() {
-        lint().files(
-            kotlin(
-                """
+        lint()
+            .files(
+                kotlin(
+                    """
                 package test
 
                 import androidx.compose.ui.Modifier
@@ -155,12 +155,12 @@
                     this@test6
                 }
             """
-            ),
-            UiStubs.composed,
-            Stubs.Composable,
-            Stubs.Modifier,
-            Stubs.Remember
-        )
+                ),
+                UiStubs.composed,
+                Stubs.Composable,
+                Stubs.Modifier,
+                Stubs.Remember
+            )
             .skipTestModes(TestMode.WHITESPACE) // b/202187519, remove when upgrading to 7.1.0
             .run()
             .expectClean()
diff --git a/compose/ui/ui-lint/src/test/java/androidx/compose/ui/lint/ModifierDeclarationDetectorTest.kt b/compose/ui/ui-lint/src/test/java/androidx/compose/ui/lint/ModifierDeclarationDetectorTest.kt
index 4eff543..dc79e40 100644
--- a/compose/ui/ui-lint/src/test/java/androidx/compose/ui/lint/ModifierDeclarationDetectorTest.kt
+++ b/compose/ui/ui-lint/src/test/java/androidx/compose/ui/lint/ModifierDeclarationDetectorTest.kt
@@ -29,9 +29,7 @@
 
 /* ktlint-disable max-line-length */
 
-/**
- * Test for [ModifierDeclarationDetector].
- */
+/** Test for [ModifierDeclarationDetector]. */
 @RunWith(JUnit4::class)
 class ModifierDeclarationDetectorTest : LintDetectorTest() {
     override fun getDetector(): Detector = ModifierDeclarationDetector()
@@ -44,21 +42,22 @@
         )
 
     // Simplified Density.kt stubs
-    private val DensityStub = bytecodeStub(
-        filename = "Density.kt",
-        filepath = "androidx/compose/ui/unit",
-        checksum = 0x3ceb3f57,
-        """
+    private val DensityStub =
+        bytecodeStub(
+            filename = "Density.kt",
+            filepath = "androidx/compose/ui/unit",
+            checksum = 0x3ceb3f57,
+            """
             package androidx.compose.ui.unit
 
             interface Density
         """,
-"""
+            """
         META-INF/main.kotlin_module:
         H4sIAAAAAAAA/2NgYGBmYGBgBGJOBijgUuEST8xLKcrPTKnQS87PLcgvTtUr
         zdRLy88X4nTLz3dJLEn0LlFi0GIAAHSOuCo+AAAA
         """,
-        """
+            """
         androidx/compose/ui/unit/Density.class:
         H4sIAAAAAAAA/4VOTUvDQBB9s9GmjV+pWqg38Qe4benNkyBCoCIoeMlpm6yy
         bbor3U2pt/4uD9KzP0qcqHdn4M17M/DefH69fwAYo0c4V7ZcOlOuZeEWr85r
@@ -67,14 +66,15 @@
         /KnLeWDx6OploW9NpQlnD7UNZqGfjDfTSl9b64IKxlnf4gzs4LcETn7wGKc8
         h2y5y93KEWWIM7QzdJAwxV6GfRzkII9DHOUQHqlH9xtDUhD7SQEAAA==
         """
-    )
+        )
 
     // Simplified ParentDataModifier.kt / Measurable.kt merged stubs
-    private val MeasurableAndParentDataModifierStub = bytecodeStub(
-        filename = "Measurable.kt",
-        filepath = "androidx/compose/ui/layout",
-        checksum = 0x1c810a26,
-        """
+    private val MeasurableAndParentDataModifierStub =
+        bytecodeStub(
+            filename = "Measurable.kt",
+            filepath = "androidx/compose/ui/layout",
+            checksum = 0x1c810a26,
+            """
             package androidx.compose.ui.layout
 
             import androidx.compose.ui.Modifier
@@ -88,12 +88,12 @@
                 val parentData: Any?
             }
         """,
-"""
+            """
         META-INF/main.kotlin_module:
         H4sIAAAAAAAA/2NgYGBmYGBgBGJOBijgUuEST8xLKcrPTKnQS87PLcgvTtUr
         zdRLy88X4nTLz3dJLEn0LlFi0GIAAHSOuCo+AAAA
         """,
-        """
+            """
         androidx/compose/ui/layout/Measurable.class:
         H4sIAAAAAAAA/41QwU7bQBB9YxsnMaQ1kNIQrkXApQ6IE5wqISRLgSKQEFJO
         m2QbbeLsIu86glu+hQMfwQFFOfajqo5RJRBcepl58+bNvpn9/efpGcAhWoRt
@@ -105,7 +105,7 @@
         hJBtv3JV5gpnD82XuIFNzkfMVllV68JPEaVYTrGCOkN8SvEZcRdksYq1LpYs
         1i0aFl9sicO/4SGINQgCAAA=
         """,
-        """
+            """
         androidx/compose/ui/layout/ParentDataModifier＄DefaultImpls.class:
         H4sIAAAAAAAA/6VSTU8TQRh+ZgvdthZKq6AI4gdVWhAWjCc5GVCzSVuNGC6e
         ptuhnXZ3hszONvivPBIPxrM/yvguNIiVoI2Hfb+fZ+f9+P7jy1cAz/GM4QVX
@@ -121,7 +121,7 @@
         WYI9JX/hvBy3ceeMroQcFol0k+wsaZf0Fn0zzsg5lxl4JO+SLqOKx9k8HVUZ
         TwjqoHamt89+WaeXAiuESmuXPiLjY9nHPZ9i9308wEMfj34CPA2YO9cEAAA=
         """,
-        """
+            """
         androidx/compose/ui/layout/ParentDataModifier.class:
         H4sIAAAAAAAA/5VS328SQRD+9oA7QNCrVoW2/moRfyR6SHyy6YMRTc9ANZr4
         wtMCS7Nwt0du90h54+/ywfDsH2Wcw5pWijU+7OzMd998Mzez3398/QbgJR4x
@@ -136,13 +136,14 @@
         QhnUyF4noo0d3LELuEf+fVTxkHALD1Cn+4DYV5BDqYuMj7KPqz6uwSUXGz5l
         3+iCaWziZhe2xi2N2xqORkWjqrH1E3XfjsnaAwAA
         """
-    )
+        )
 
     @Test
     fun functionReturnsModifierElement() {
-        lint().files(
-            kotlin(
-                """
+        lint()
+            .files(
+                kotlin(
+                    """
                 package androidx.compose.ui.foo
 
                 import androidx.compose.ui.Modifier
@@ -153,9 +154,9 @@
                     return TestModifier
                 }
             """
-            ),
-            Stubs.Modifier
-        )
+                ),
+                Stubs.Modifier
+            )
             .run()
             .expect(
                 """
@@ -180,9 +181,10 @@
 
     @Test
     fun getterReturnsModifierElement() {
-        lint().files(
-            kotlin(
-                """
+        lint()
+            .files(
+                kotlin(
+                    """
                 package androidx.compose.ui.foo
 
                 import androidx.compose.ui.Modifier
@@ -199,9 +201,9 @@
 
                 val Modifier.fooModifier3: Modifier.Element get() = TestModifier
             """
-            ),
-            Stubs.Modifier
-        )
+                ),
+                Stubs.Modifier
+            )
             .run()
             .expect(
                 """
@@ -246,9 +248,10 @@
 
     @Test
     fun functionImplicitlyReturnsModifierElement() {
-        lint().files(
-            kotlin(
-                """
+        lint()
+            .files(
+                kotlin(
+                    """
                 package androidx.compose.ui.foo
 
                 import androidx.compose.ui.Modifier
@@ -257,9 +260,9 @@
 
                 fun Modifier.fooModifier() = TestModifier
             """
-            ),
-            Stubs.Modifier
-        )
+                ),
+                Stubs.Modifier
+            )
             .run()
             .expect(
                 """
@@ -284,9 +287,10 @@
 
     @Test
     fun getterImplicitlyReturnsModifierElement() {
-        lint().files(
-            kotlin(
-                """
+        lint()
+            .files(
+                kotlin(
+                    """
                 package androidx.compose.ui.foo
 
                 import androidx.compose.ui.Modifier
@@ -295,9 +299,9 @@
 
                 val Modifier.fooModifier get() = TestModifier
             """
-            ),
-            Stubs.Modifier
-        )
+                ),
+                Stubs.Modifier
+            )
             .run()
             .expect(
                 """
@@ -322,9 +326,10 @@
 
     @Test
     fun returnsCustomModifierImplementation() {
-        lint().files(
-            kotlin(
-                """
+        lint()
+            .files(
+                kotlin(
+                    """
                 package androidx.compose.ui.foo
 
                 import androidx.compose.ui.Modifier
@@ -335,9 +340,9 @@
                     return TestModifier
                 }
             """
-            ),
-            Stubs.Modifier
-        )
+                ),
+                Stubs.Modifier
+            )
             .run()
             .expect(
                 """
@@ -362,9 +367,10 @@
 
     @Test
     fun modifierVariables_noErrors() {
-        lint().files(
-            kotlin(
-                """
+        lint()
+            .files(
+                kotlin(
+                    """
                 package androidx.compose.ui.foo
 
                 import androidx.compose.ui.Modifier
@@ -393,18 +399,19 @@
                         set(value) { field = TestModifier }
                 }
             """
-            ),
-            Stubs.Modifier
-        )
+                ),
+                Stubs.Modifier
+            )
             .run()
             .expectClean()
     }
 
     @Test
     fun modifierVals_noErrors() {
-        lint().files(
-            kotlin(
-                """
+        lint()
+            .files(
+                kotlin(
+                    """
                 package androidx.compose.ui.foo
 
                 import androidx.compose.ui.Modifier
@@ -444,18 +451,19 @@
                     val modifier5: TestModifier get() = TestModifier
                 }
             """
-            ),
-            Stubs.Modifier
-        )
+                ),
+                Stubs.Modifier
+            )
             .run()
             .expectClean()
     }
 
     @Test
     fun noModifierReceiver() {
-        lint().files(
-            kotlin(
-                """
+        lint()
+            .files(
+                kotlin(
+                    """
                 package androidx.compose.ui.foo
 
                 import androidx.compose.ui.Modifier
@@ -474,9 +482,9 @@
 
                 val fooModifier3: Modifier get() = Modifier
             """
-            ),
-            Stubs.Modifier
-        )
+                ),
+                Stubs.Modifier
+            )
             .run()
             .expect(
                 """
@@ -519,9 +527,10 @@
 
     @Test
     fun incorrectReceiver() {
-        lint().files(
-            kotlin(
-                """
+        lint()
+            .files(
+                kotlin(
+                    """
                 package androidx.compose.ui.foo
 
                 import androidx.compose.ui.Modifier
@@ -542,9 +551,9 @@
 
                 val TestModifier.fooModifier3: Modifier get() = this.then(TestModifier)
             """
-            ),
-            Stubs.Modifier
-        )
+                ),
+                Stubs.Modifier
+            )
             .run()
             .expect(
                 """
@@ -587,9 +596,10 @@
 
     @Test
     fun unreferencedReceiver() {
-        lint().files(
-            kotlin(
-                """
+        lint()
+            .files(
+                kotlin(
+                    """
                 package androidx.compose.ui.foo
 
                 import androidx.compose.ui.*
@@ -626,10 +636,10 @@
                     return Modifier.fooModifier()
                 }
             """
-            ),
-            Stubs.Modifier,
-            Stubs.Composable
-        )
+                ),
+                Stubs.Modifier,
+                Stubs.Composable
+            )
             .run()
             .expect(
                 """
@@ -664,9 +674,10 @@
 
     @Test
     fun ignoresParentDataModifiers() {
-        lint().files(
-            kotlin(
-                """
+        lint()
+            .files(
+                kotlin(
+                    """
                 package androidx.compose.ui.foo
 
                 import androidx.compose.ui.layout.Measurable
@@ -679,22 +690,23 @@
                     override fun Density.modifyParentData(parentData: Any?) = this
                 }
             """
-            ),
-            Stubs.Modifier,
-            DensityStub,
-            MeasurableAndParentDataModifierStub
-        )
+                ),
+                Stubs.Modifier,
+                DensityStub,
+                MeasurableAndParentDataModifierStub
+            )
             .run()
             .expectClean()
     }
 
     @Test
     fun noErrors_inlineAndValueClasses() {
-        val inlineAndValueClassStub = bytecodeStub(
-            filename = "InlineAndValueClassStub.kt",
-            filepath = "androidx/compose/ui/foo",
-            checksum = 0x402f4998,
-            """
+        val inlineAndValueClassStub =
+            bytecodeStub(
+                filename = "InlineAndValueClassStub.kt",
+                filepath = "androidx/compose/ui/foo",
+                checksum = 0x402f4998,
+                """
             package androidx.compose.ui.foo
 
             import androidx.compose.ui.Modifier
@@ -714,13 +726,13 @@
                 return this.then(TestModifier)
             }
         """,
-    """
+                """
             META-INF/main.kotlin_module:
             H4sIAAAAAAAA/2NgYGBmYGBgBGJOBijgsuEST8xLKcrPTKnQS87PLcgvTtUr
             zdRLy88XkvTMy8nMS3XMSwlLzClNdc5JLC4OLilN8i4RYgtJLS7xLlFi0GIA
             AA4XavBWAAAA
             """,
-            """
+                """
             androidx/compose/ui/foo/Inline.class:
             H4sIAAAAAAAA/4VU3VMbVRT/3ZuvzbKEhQKF2FYaapvw0QBVq1KQjzY2GFqF
             GqX4tUlWWEh2Y3bD8Mib/gXO2EdffJDp6IwCY2ccxDf/Jsfx3JsNYQJTZ3bu
@@ -749,7 +761,7 @@
             lObrMGi36fSI9sfk+sE6All8mMVKFqt4Qkd8lEUeH6+DufgEa+voc6G5eOoi
             ItdFF/ddhFyEXcxIzbSLKRd3XIxJMeki5eK6PHe6iP0HcneOKFoIAAA=
             """,
-            """
+                """
             androidx/compose/ui/foo/InlineAndValueClassStubKt.class:
             H4sIAAAAAAAA/4VUXVPbRhQ9K38JY4iBBAIBJy1uAm6NbJd+uk1KnThVMG4n
             ZnjhIbOWBSyWJUZaefLUYfov+tj+gk6faB86HvrWH9Xpla0CJhg/6O7eu0d3
@@ -772,7 +784,7 @@
             aAzf2SG++Qu+G+P5arfwLfX5bo7kO0PhV/3FCrZprFD0E1L8031EdHym43Md
             X+BLHWV8peNrPN0H8/AM3+xD9ZDxsOJhy0PMQ9zDhodvPeT+A2h8MqZHBwAA
             """,
-            """
+                """
             androidx/compose/ui/foo/TestModifier.class:
             H4sIAAAAAAAA/6VUW0/UQBT+pgvbbi1y8cJN8cKKXJQC6osQEkRImiyrEbKJ
             4Wl2O+BA2yHtlPBI/Cn+AokPGE0M0Td/lPG0LETkIokPM3Mu33dybu3PX1++
@@ -790,7 +802,7 @@
             7+WGAqbo7iJ3ESMYLZZotYsYo3Kf5Fk8on9W9t+ihaDMb6+i4GHAwx0Pd3GP
             RNz3MIjyKliCBxgifwInwcME1m+TOp2p9AQAAA==
             """,
-            """
+                """
             androidx/compose/ui/foo/Value.class:
             H4sIAAAAAAAA/31U3VMbVRT/3ZuvzbKETQqUxGLbUNvw1QBVq1IqH21sMLQK
             FaX4tUlWWEh2Y3bD8Mib/gXO2Edf+iDT0RkFxs44iG/+TY7juTcbYALDzM69
@@ -819,11 +831,12 @@
             hUG7TafHtD8h149WEcjj4zwW81jCUzrikzyW8ekqmIvPsLKKHheai2cuInKd
             c/HARchF2MWU1Ey6mHBxx8WIFDMuBl1cl+dOF7H/AVoTuh9WCAAA
             """
-        )
+            )
 
-        lint().files(
-            kotlin(
-                """
+        lint()
+            .files(
+                kotlin(
+                    """
                 package androidx.compose.ui.foo
 
                 import androidx.compose.ui.Modifier
@@ -832,19 +845,20 @@
 
                 fun Modifier.valueModifier(): Modifier = value()
             """
-            ),
-            Stubs.Modifier,
-            inlineAndValueClassStub
-        )
+                ),
+                Stubs.Modifier,
+                inlineAndValueClassStub
+            )
             .run()
             .expectClean()
     }
 
     @Test
     fun noErrors() {
-        lint().files(
-            kotlin(
-                """
+        lint()
+            .files(
+                kotlin(
+                    """
                 package androidx.compose.ui.foo
 
                 import androidx.compose.ui.Modifier
@@ -863,9 +877,9 @@
                     return fooModifier()
                 }
             """
-            ),
-            Stubs.Modifier
-        )
+                ),
+                Stubs.Modifier
+            )
             .run()
             .expectClean()
     }
@@ -873,9 +887,10 @@
     @Test
     fun composedNoErrors() {
         // Regression test from b/328119668
-        lint().files(
-            kotlin(
-                """
+        lint()
+            .files(
+                kotlin(
+                    """
                 package androidx.compose.ui.foo
 
                 import androidx.compose.ui.Modifier
@@ -885,10 +900,10 @@
                     object : Modifier {}
                 }
             """
-            ),
-            Stubs.Modifier,
-            UiStubs.composed,
-        )
+                ),
+                Stubs.Modifier,
+                UiStubs.composed,
+            )
             .run()
             .expectClean()
     }
@@ -896,9 +911,10 @@
     // Test for b/341056462
     @Test
     fun nestedReceivers() {
-        lint().files(
-            kotlin(
-                """
+        lint()
+            .files(
+                kotlin(
+                    """
                 package androidx.compose.ui.foo
 
                 import androidx.compose.ui.Modifier
@@ -930,13 +946,13 @@
                     this.fooModifier()
                 }
             """
-            ),
-            Stubs.Modifier,
-            UiStubs.composed,
-        )
+                ),
+                Stubs.Modifier,
+                UiStubs.composed,
+            )
             .run()
             .expect(
-"""
+                """
 src/androidx/compose/ui/foo/TestModifier.kt:19: Error: Modifier factory functions must use the receiver Modifier instance [ModifierFactoryUnreferencedReceiver]
                 fun Modifier.error_implicitReceiver(): Modifier = Modifier.composed {
                              ~~~~~~~~~~~~~~~~~~~~~~
diff --git a/compose/ui/ui-lint/src/test/java/androidx/compose/ui/lint/ModifierNodeInspectablePropertiesDetectorTest.kt b/compose/ui/ui-lint/src/test/java/androidx/compose/ui/lint/ModifierNodeInspectablePropertiesDetectorTest.kt
index d75769c..d1af119 100644
--- a/compose/ui/ui-lint/src/test/java/androidx/compose/ui/lint/ModifierNodeInspectablePropertiesDetectorTest.kt
+++ b/compose/ui/ui-lint/src/test/java/androidx/compose/ui/lint/ModifierNodeInspectablePropertiesDetectorTest.kt
@@ -25,15 +25,15 @@
 class ModifierNodeInspectablePropertiesDetectorTest : LintDetectorTest() {
     override fun getDetector(): Detector = ModifierNodeInspectablePropertiesDetector()
 
-    override fun getIssues(): MutableList<Issue> = mutableListOf(
-        ModifierNodeInspectablePropertiesDetector.ModifierNodeInspectableProperties
-    )
+    override fun getIssues(): MutableList<Issue> =
+        mutableListOf(ModifierNodeInspectablePropertiesDetector.ModifierNodeInspectableProperties)
 
     @Test
     fun testNodeElementWithNoInspectableValues_flagsError() {
-        lint().files(
-            kotlin(
-                """
+        lint()
+            .files(
+                kotlin(
+                    """
                 package test
 
                 import androidx.compose.ui.Modifier
@@ -45,9 +45,11 @@
                     override fun update(node: Modifier.Node) = node
                 }
                 """
-            ),
-            ModifierStub, InspectableValueStub, ModifierNodeElementStub
-        )
+                ),
+                ModifierStub,
+                InspectableValueStub,
+                ModifierNodeElementStub
+            )
             .run()
             .expect(
                 """
@@ -55,15 +57,17 @@
                 class Element : ModifierNodeElement<Modifier.Node>() {
                       ~~~~~~~
 0 errors, 0 warnings
-                """.trimIndent()
+                """
+                    .trimIndent()
             )
     }
 
     @Test
     fun testNodeElementWithAlmostInspectableValues_flagsError() {
-        lint().files(
-            kotlin(
-                """
+        lint()
+            .files(
+                kotlin(
+                    """
                 package test
 
                 import androidx.compose.ui.Modifier
@@ -81,9 +85,9 @@
                     }
                 }
                 """
-            ),
-            kotlin(
-                """
+                ),
+                kotlin(
+                    """
                 package test
 
                 import androidx.compose.ui.Modifier
@@ -98,9 +102,11 @@
                     fun inspectableProperties() { }
                 }
                 """
-            ),
-            ModifierStub, InspectableValueStub, ModifierNodeElementStub
-        )
+                ),
+                ModifierStub,
+                InspectableValueStub,
+                ModifierNodeElementStub
+            )
             .run()
             .expect(
                 """
@@ -111,15 +117,17 @@
                 class ElementWithoutReceiver : ModifierNodeElement<Modifier.Node>() {
                       ~~~~~~~~~~~~~~~~~~~~~~
 0 errors, 0 warnings
-                """.trimIndent()
+                """
+                    .trimIndent()
             )
     }
 
     @Test
     fun testNodeElementWithInspectableValues_doesNotFlagError() {
-        lint().files(
-            kotlin(
-                """
+        lint()
+            .files(
+                kotlin(
+                    """
                 package test
 
                 import androidx.compose.ui.Modifier
@@ -136,18 +144,21 @@
                     }
                 }
                 """
-            ),
-            ModifierStub, InspectableValueStub, ModifierNodeElementStub
-        )
+                ),
+                ModifierStub,
+                InspectableValueStub,
+                ModifierNodeElementStub
+            )
             .run()
             .expectClean()
     }
 
     @Test
     fun testNodeElementWithInheritedInspectableValues_doesNotFlagError() {
-        lint().files(
-            kotlin(
-                """
+        lint()
+            .files(
+                kotlin(
+                    """
                 package test
 
                 import androidx.compose.ui.Modifier
@@ -169,16 +180,19 @@
                     override fun update(node: Modifier.Node) = node
                 }
                 """
-            ),
-            ModifierStub, InspectableValueStub, ModifierNodeElementStub
-        )
+                ),
+                ModifierStub,
+                InspectableValueStub,
+                ModifierNodeElementStub
+            )
             .run()
             .expectClean()
     }
 
     companion object {
-        private val ModifierStub = kotlin(
-            """
+        private val ModifierStub =
+            kotlin(
+                """
             package androidx.compose.ui
 
             interface Modifier {
@@ -186,10 +200,11 @@
                 interface Element
             }
             """
-        )
+            )
 
-        private val InspectableValueStub = kotlin(
-            """
+        private val InspectableValueStub =
+            kotlin(
+                """
             package androidx.compose.ui.platform
 
             import androidx.compose.ui.Modifier
@@ -223,10 +238,11 @@
                 }
             }
             """
-        )
+            )
 
-        private val ModifierNodeElementStub = kotlin(
-            """
+        private val ModifierNodeElementStub =
+            kotlin(
+                """
             package androidx.compose.ui.node
 
             abstract class ModifierNodeElement<N : Modifier.Node> : Modifier.Element {
@@ -240,7 +256,7 @@
                 }
             }
             """
-        )
+            )
     }
 }
 /* ktlint-enable max-line-length */
diff --git a/compose/ui/ui-lint/src/test/java/androidx/compose/ui/lint/ModifierParameterDetectorTest.kt b/compose/ui/ui-lint/src/test/java/androidx/compose/ui/lint/ModifierParameterDetectorTest.kt
index f3aba8d..48200d4 100644
--- a/compose/ui/ui-lint/src/test/java/androidx/compose/ui/lint/ModifierParameterDetectorTest.kt
+++ b/compose/ui/ui-lint/src/test/java/androidx/compose/ui/lint/ModifierParameterDetectorTest.kt
@@ -28,23 +28,20 @@
 
 /* ktlint-disable max-line-length */
 
-/**
- * Test for [ModifierParameterDetector].
- */
+/** Test for [ModifierParameterDetector]. */
 @RunWith(JUnit4::class)
 class ModifierParameterDetectorTest : LintDetectorTest() {
     override fun getDetector(): Detector = ModifierParameterDetector()
 
     override fun getIssues(): MutableList<Issue> =
-        mutableListOf(
-            ModifierParameterDetector.ModifierParameter
-        )
+        mutableListOf(ModifierParameterDetector.ModifierParameter)
 
     @Test
     fun modifierParameterNaming() {
-        lint().files(
-            kotlin(
-                """
+        lint()
+            .files(
+                kotlin(
+                    """
                 package androidx.compose.ui.foo
 
                 import androidx.compose.ui.Modifier
@@ -58,10 +55,10 @@
                     content: @Composable () -> Unit
                 ) {}
             """
-            ),
-            Stubs.Composable,
-            Stubs.Modifier
-        )
+                ),
+                Stubs.Composable,
+                Stubs.Modifier
+            )
             .run()
             .expect(
                 """
@@ -83,9 +80,10 @@
 
     @Test
     fun modifierParameterType() {
-        lint().files(
-            kotlin(
-                """
+        lint()
+            .files(
+                kotlin(
+                    """
                 package androidx.compose.ui.foo
 
                 import androidx.compose.ui.Modifier
@@ -99,10 +97,10 @@
                     content: @Composable () -> Unit
                 ) {}
             """
-            ),
-            Stubs.Composable,
-            Stubs.Modifier
-        )
+                ),
+                Stubs.Composable,
+                Stubs.Modifier
+            )
             .run()
             .expect(
                 """
@@ -124,9 +122,10 @@
 
     @Test
     fun modifierParameterDefaultValue() {
-        lint().files(
-            kotlin(
-                """
+        lint()
+            .files(
+                kotlin(
+                    """
                 package androidx.compose.ui.foo
 
                 import androidx.compose.ui.Modifier
@@ -142,10 +141,10 @@
                     content: @Composable () -> Unit
                 ) {}
             """
-            ),
-            Stubs.Composable,
-            Stubs.Modifier
-        )
+                ),
+                Stubs.Composable,
+                Stubs.Modifier
+            )
             .run()
             .expect(
                 """
@@ -167,9 +166,10 @@
 
     @Test
     fun modifierParameterOrdering() {
-        lint().files(
-            kotlin(
-                """
+        lint()
+            .files(
+                kotlin(
+                    """
                 package androidx.compose.ui.foo
 
                 import androidx.compose.ui.Modifier
@@ -183,10 +183,10 @@
                     content: @Composable () -> Unit
                 ) {}
             """
-            ),
-            Stubs.Composable,
-            Stubs.Modifier
-        )
+                ),
+                Stubs.Composable,
+                Stubs.Modifier
+            )
             .run()
             .expect(
                 """
@@ -200,9 +200,10 @@
 
     @Test
     fun multipleErrors() {
-        lint().files(
-            kotlin(
-                """
+        lint()
+            .files(
+                kotlin(
+                    """
                 package androidx.compose.ui.foo
 
                 import androidx.compose.ui.Modifier
@@ -218,10 +219,10 @@
                     content: @Composable () -> Unit
                 ) {}
             """
-            ),
-            Stubs.Composable,
-            Stubs.Modifier
-        )
+                ),
+                Stubs.Composable,
+                Stubs.Modifier
+            )
             .run()
             .expect(
                 """
@@ -260,9 +261,10 @@
 
     @Test
     fun ignoreNonComposableFunctions() {
-        lint().files(
-            kotlin(
-                """
+        lint()
+            .files(
+                kotlin(
+                    """
                 package androidx.compose.ui.foo
 
                 import androidx.compose.ui.Modifier
@@ -273,10 +275,10 @@
                     buttonModifier: TestModifier = TestModifier,
                 ) {}
             """
-            ),
-            Stubs.Composable,
-            Stubs.Modifier
-        )
+                ),
+                Stubs.Composable,
+                Stubs.Modifier
+            )
             .run()
             .expectClean()
     }
@@ -287,9 +289,10 @@
      */
     @Test
     fun ignoreOrderingIfNoDefaultValue() {
-        lint().files(
-            kotlin(
-                """
+        lint()
+            .files(
+                kotlin(
+                    """
                 package androidx.compose.ui.foo
 
                 import androidx.compose.ui.Modifier
@@ -302,19 +305,20 @@
                     content: @Composable () -> Unit
                 ) {}
             """
-            ),
-            Stubs.Composable,
-            Stubs.Modifier
-        )
+                ),
+                Stubs.Composable,
+                Stubs.Modifier
+            )
             .run()
             .expectClean()
     }
 
     @Test
     fun noErrors() {
-        lint().files(
-            kotlin(
-                """
+        lint()
+            .files(
+                kotlin(
+                    """
                 package androidx.compose.ui.foo
 
                 import androidx.compose.ui.Modifier
@@ -336,10 +340,10 @@
                     content: @Composable () -> Unit
                 ) {}
             """
-            ),
-            Stubs.Composable,
-            Stubs.Modifier
-        )
+                ),
+                Stubs.Composable,
+                Stubs.Modifier
+            )
             .run()
             .expectClean()
     }
diff --git a/compose/ui/ui-lint/src/test/java/androidx/compose/ui/lint/MultipleAwaitPointerEventScopesDetectorTest.kt b/compose/ui/ui-lint/src/test/java/androidx/compose/ui/lint/MultipleAwaitPointerEventScopesDetectorTest.kt
index 9112ac4..1c56d4f 100644
--- a/compose/ui/ui-lint/src/test/java/androidx/compose/ui/lint/MultipleAwaitPointerEventScopesDetectorTest.kt
+++ b/compose/ui/ui-lint/src/test/java/androidx/compose/ui/lint/MultipleAwaitPointerEventScopesDetectorTest.kt
@@ -30,8 +30,8 @@
  * Detector for checking if we have multiple awaitPointerEventScope calls within the same block,
  * which is generally discouraged if we want to guarantee not losing touch events.
  *
- * For each awaitPointerEventScope we'll move to the closest boundary block (method call) and
- * search for the repeated calls inside that block.
+ * For each awaitPointerEventScope we'll move to the closest boundary block (method call) and search
+ * for the repeated calls inside that block.
  */
 @RunWith(JUnit4::class)
 class MultipleAwaitPointerEventScopesDetectorTest : LintDetectorTest() {
@@ -40,11 +40,12 @@
     override fun getIssues(): MutableList<Issue> =
         mutableListOf(MultipleAwaitPointerEventScopesDetector.MultipleAwaitPointerEventScopes)
 
-    private val ForEachGestureStub: TestFile = bytecodeStub(
-        filename = "ForEachGesture.kt",
-        filepath = "androidx/compose/foundation/gestures",
-        checksum = 0x1be9b2ef,
-        """
+    private val ForEachGestureStub: TestFile =
+        bytecodeStub(
+            filename = "ForEachGesture.kt",
+            filepath = "androidx/compose/foundation/gestures",
+            checksum = 0x1be9b2ef,
+            """
             package androidx.compose.foundation.gestures
             import androidx.compose.ui.input.pointer.PointerInputScope
 
@@ -52,14 +53,14 @@
                 block()
             }
             """,
-"""
+            """
         META-INF/main.kotlin_module:
         H4sIAAAAAAAA/2VMQQoCMRAbUQR7EOkDBMWThzl7F1dkL4J+oGzr7oDOlHYK
         Pt/KejOQEBISAJgCwKRyAT+Yg9k59knIv7GTV5Qc8CGFvVMSxj5kLSlku2ok
         nVw3nMegVXM0m79lISSORTEKsYZk17eSY2BP3F/H6PLtG3pWW0+WZqb10c7v
         VVvdwh4+IfeLY6cAAAA=
         """,
-        """
+            """
         androidx/compose/foundation/gestures/ForEachGestureKt.class:
         H4sIAAAAAAAA/7VUzU8bRxT/zdr4C0jMBlIgjUOK2/ARsoaGNq2jqBEx7aqO
         QTGkqjhU4/XiDLZnrN1Zi944Veq/0UPPUU9tDxXKsX9U1Te2IYBpkCL1sLO/
@@ -81,17 +82,18 @@
         Hwkp+j+i70aMhHSP09vVwhe9dRVf0n+TtB8R3/k9xFzkXXzs4hPcc7GARRdL
         WN4DC3EfK3tIhxgJ8SDE7RC5EE6Iuz2xECLxLyV8urHMBgAA
         """
-    )
+        )
 
-    private val stubs = arrayOf(
-        Stubs.Composable,
-        Stubs.Modifier,
-        UiStubs.Density,
-        UiStubs.PointerInputScope,
-        UiStubs.PointerEvent,
-        UiStubs.Alignment,
-        ForEachGestureStub
-    )
+    private val stubs =
+        arrayOf(
+            Stubs.Composable,
+            Stubs.Modifier,
+            UiStubs.Density,
+            UiStubs.PointerInputScope,
+            UiStubs.PointerEvent,
+            UiStubs.Alignment,
+            ForEachGestureStub
+        )
 
     @Test
     fun awaitPointerEventScope_standalone_shouldNotWarn() {
@@ -184,9 +186,10 @@
 
     @Test
     fun awaitPointerEventScope_withConditionalCalls_shouldWarn() {
-        lint().files(
-            kotlin(
-                """
+        lint()
+            .files(
+                kotlin(
+                    """
                 package test
 
                 import androidx.compose.runtime.Composable
@@ -208,9 +211,9 @@
                     }
                 }
                  """
-            ),
-            *stubs,
-        )
+                ),
+                *stubs,
+            )
             .run()
             .expect(
                 """
@@ -221,15 +224,17 @@
                             awaitPointerEventScope {
                             ~~~~~~~~~~~~~~~~~~~~~~
 0 errors, 2 warnings
-            """.trimIndent()
+            """
+                    .trimIndent()
             )
     }
 
     @Test
     fun awaitPointerEventScope_fromExtensionMethodAndConditionalCalls_shouldWarn() {
-        lint().files(
-            kotlin(
-                """
+        lint()
+            .files(
+                kotlin(
+                    """
                 package test
 
                 import androidx.compose.ui.input.pointer.PointerInputScope
@@ -248,9 +253,9 @@
                     }
                 }
                  """
-            ),
-            *stubs,
-        )
+                ),
+                *stubs,
+            )
             .run()
             .expect(
                 """
@@ -261,15 +266,17 @@
                         awaitPointerEventScope {
                         ~~~~~~~~~~~~~~~~~~~~~~
 0 errors, 2 warnings
-            """.trimIndent()
+            """
+                    .trimIndent()
             )
     }
 
     @Test
     fun multipleAwaitPointerEventScope_shouldWarn() {
-        lint().files(
-            kotlin(
-                """
+        lint()
+            .files(
+                kotlin(
+                    """
                 package test
                 import androidx.compose.foundation.gestures.forEachGesture
                 import androidx.compose.runtime.Composable
@@ -291,9 +298,9 @@
                     }
                 }
                  """
-            ),
-            *stubs,
-        )
+                ),
+                *stubs,
+            )
             .run()
             .expect(
                 """
@@ -304,15 +311,17 @@
                             awaitPointerEventScope {
                             ~~~~~~~~~~~~~~~~~~~~~~
 0 errors, 2 warnings
-            """.trimIndent()
+            """
+                    .trimIndent()
             )
     }
 
     @Test
     fun multipleAwaitPointerEventScope_withLambdaBlocks_shouldWarn() {
-        lint().files(
-            kotlin(
-                """
+        lint()
+            .files(
+                kotlin(
+                    """
                 package test
                 import androidx.compose.foundation.gestures.forEachGesture
                 import androidx.compose.runtime.Composable
@@ -334,9 +343,9 @@
                     }
                 }
                  """
-            ),
-            *stubs,
-        )
+                ),
+                *stubs,
+            )
             .run()
             .expect(
                 """
@@ -347,15 +356,17 @@
                             run { awaitPointerEventScope {
                                   ~~~~~~~~~~~~~~~~~~~~~~
 0 errors, 2 warnings
-            """.trimIndent()
+            """
+                    .trimIndent()
             )
     }
 
     @Test
     fun multipleAwaitPointerEventScope_insideExtensionMethod_shouldWarn() {
-        lint().files(
-            kotlin(
-                """
+        lint()
+            .files(
+                kotlin(
+                    """
                 package test
 
                 import androidx.compose.ui.input.pointer.PointerInputScope
@@ -371,9 +382,9 @@
                     }
                 }
                  """
-            ),
-            *stubs,
-        )
+                ),
+                *stubs,
+            )
             .run()
             .expect(
                 """
@@ -391,9 +402,10 @@
 
     @Test
     fun awaitPointerEventScope_multipleConditionalAndCalls_shouldWarn() {
-        lint().files(
-            kotlin(
-                """
+        lint()
+            .files(
+                kotlin(
+                    """
                 package test
                 import androidx.compose.runtime.Composable
                 import androidx.compose.ui.Modifier
@@ -418,9 +430,9 @@
                     }
                 }
                  """
-            ),
-            *stubs,
-        )
+                ),
+                *stubs,
+            )
             .run()
             .expect(
                 """
@@ -434,15 +446,17 @@
                             awaitPointerEventScope {
                             ~~~~~~~~~~~~~~~~~~~~~~
 0 errors, 3 warnings
-            """.trimIndent()
+            """
+                    .trimIndent()
             )
     }
 
     @Test
     fun awaitPointerEventScope_multipleConditionalAndCallsInsideCondition_shouldWarn() {
-        lint().files(
-            kotlin(
-                """
+        lint()
+            .files(
+                kotlin(
+                    """
                 package test
 
                 import androidx.compose.runtime.Composable
@@ -469,9 +483,9 @@
                     }
                 }
                  """
-            ),
-            *stubs,
-        )
+                ),
+                *stubs,
+            )
             .run()
             .expect(
                 """
@@ -485,15 +499,17 @@
                             awaitPointerEventScope {
                             ~~~~~~~~~~~~~~~~~~~~~~
 0 errors, 3 warnings
-            """.trimIndent()
+            """
+                    .trimIndent()
             )
     }
 
     @Test
     fun awaitPointerEventScope_repetitionWithinCustomModifier_shouldWarn() {
-        lint().files(
-            kotlin(
-                """
+        lint()
+            .files(
+                kotlin(
+                    """
                 package test
 
                 import androidx.compose.runtime.Composable
@@ -517,9 +533,9 @@
                         }
                 }
                  """
-            ),
-            *stubs,
-        )
+                ),
+                *stubs,
+            )
             .run()
             .expect(
                 """
@@ -530,15 +546,17 @@
                             awaitPointerEventScope {
                             ~~~~~~~~~~~~~~~~~~~~~~
 0 errors, 2 warnings
-            """.trimIndent()
+            """
+                    .trimIndent()
             )
     }
 
     @Test
     fun awaitPointerEventScope_nestedBlocks_shouldWarn() {
-        lint().files(
-            kotlin(
-                """
+        lint()
+            .files(
+                kotlin(
+                    """
                 package test
 
                 import androidx.compose.runtime.Composable
@@ -585,9 +603,9 @@
                         }
                 }
                  """
-            ),
-            *stubs,
-        )
+                ),
+                *stubs,
+            )
             .run()
             .expect(
                 """
@@ -598,7 +616,8 @@
                                             awaitPointerEventScope {
                                             ~~~~~~~~~~~~~~~~~~~~~~
 0 errors, 2 warnings
-            """.trimIndent()
+            """
+                    .trimIndent()
             )
     }
 
@@ -664,13 +683,11 @@
     }
 
     private fun expectClean(source: String) {
-        lint()
-            .files(kotlin(source), *stubs)
-            .run()
-            .expectClean()
+        lint().files(kotlin(source), *stubs).run().expectClean()
     }
 
     private val WarningMessage
-        get() = "Warning: ${MultipleAwaitPointerEventScopesDetector.ErrorMessage} " +
-            "[${MultipleAwaitPointerEventScopesDetector.IssueId}]"
+        get() =
+            "Warning: ${MultipleAwaitPointerEventScopesDetector.ErrorMessage} " +
+                "[${MultipleAwaitPointerEventScopesDetector.IssueId}]"
 }
diff --git a/compose/ui/ui-lint/src/test/java/androidx/compose/ui/lint/ReturnFromAwaitPointerEventScopeDetectorTest.kt b/compose/ui/ui-lint/src/test/java/androidx/compose/ui/lint/ReturnFromAwaitPointerEventScopeDetectorTest.kt
index 1bda222..a562f5f 100644
--- a/compose/ui/ui-lint/src/test/java/androidx/compose/ui/lint/ReturnFromAwaitPointerEventScopeDetectorTest.kt
+++ b/compose/ui/ui-lint/src/test/java/androidx/compose/ui/lint/ReturnFromAwaitPointerEventScopeDetectorTest.kt
@@ -34,11 +34,12 @@
     override fun getIssues(): MutableList<Issue> =
         mutableListOf(ReturnFromAwaitPointerEventScopeDetector.ExitAwaitPointerEventScope)
 
-    private val ForEachGestureStub: TestFile = bytecodeStub(
-        filename = "ForEachGesture.kt",
-        filepath = "androidx/compose/foundation/gestures",
-        checksum = 0x1be9b2ef,
-        """
+    private val ForEachGestureStub: TestFile =
+        bytecodeStub(
+            filename = "ForEachGesture.kt",
+            filepath = "androidx/compose/foundation/gestures",
+            checksum = 0x1be9b2ef,
+            """
             package androidx.compose.foundation.gestures
             import androidx.compose.ui.input.pointer.PointerInputScope
 
@@ -46,14 +47,14 @@
                 block()
             }
             """,
-"""
+            """
         META-INF/main.kotlin_module:
         H4sIAAAAAAAA/2VMQQoCMRAbUQR7EOkDBMWThzl7F1dkL4J+oGzr7oDOlHYK
         Pt/KejOQEBISAJgCwKRyAT+Yg9k59knIv7GTV5Qc8CGFvVMSxj5kLSlku2ok
         nVw3nMegVXM0m79lISSORTEKsYZk17eSY2BP3F/H6PLtG3pWW0+WZqb10c7v
         VVvdwh4+IfeLY6cAAAA=
         """,
-        """
+            """
         androidx/compose/foundation/gestures/ForEachGestureKt.class:
         H4sIAAAAAAAA/7VUzU8bRxT/zdr4C0jMBlIgjUOK2/ARsoaGNq2jqBEx7aqO
         QTGkqjhU4/XiDLZnrN1Zi944Veq/0UPPUU9tDxXKsX9U1Te2IYBpkCL1sLO/
@@ -75,17 +76,18 @@
         Hwkp+j+i70aMhHSP09vVwhe9dRVf0n+TtB8R3/k9xFzkXXzs4hPcc7GARRdL
         WN4DC3EfK3tIhxgJ8SDE7RC5EE6Iuz2xECLxLyV8urHMBgAA
         """
-    )
+        )
 
-    private val stubs = arrayOf(
-        Stubs.Composable,
-        Stubs.Modifier,
-        UiStubs.Density,
-        UiStubs.PointerInputScope,
-        UiStubs.PointerEvent,
-        ForEachGestureStub,
-        UiStubs.Alignment,
-    )
+    private val stubs =
+        arrayOf(
+            Stubs.Composable,
+            Stubs.Modifier,
+            UiStubs.Density,
+            UiStubs.PointerInputScope,
+            UiStubs.PointerEvent,
+            ForEachGestureStub,
+            UiStubs.Alignment,
+        )
 
     @Test
     fun awaitPointerEventScope_standalone_shouldNotWarn() {
@@ -153,9 +155,10 @@
 
     @Test
     fun awaitPointerEventScope_assignedToVariable_shouldWarn() {
-        lint().files(
-            kotlin(
-                """
+        lint()
+            .files(
+                kotlin(
+                    """
                 package test
 
                 import androidx.compose.runtime.Composable
@@ -173,9 +176,9 @@
                     }
                 }
             """
-            ),
-            *stubs,
-        )
+                ),
+                *stubs,
+            )
             .run()
             .expect(
                 """
@@ -190,9 +193,10 @@
 
     @Test
     fun awaitPointerEventScope_returnedFromMethod_shouldWarn() {
-        lint().files(
-            kotlin(
-                """
+        lint()
+            .files(
+                kotlin(
+                    """
                 package test
 
                 import androidx.compose.ui.input.pointer.PointerInputScope
@@ -203,9 +207,9 @@
                     }
                 }
             """
-            ),
-            *stubs,
-        )
+                ),
+                *stubs,
+            )
             .run()
             .expect(
                 """
@@ -220,9 +224,10 @@
 
     @Test
     fun awaitPointerEventScope_assignedFromLambdaMethod_shouldWarn() {
-        lint().files(
-            kotlin(
-                """
+        lint()
+            .files(
+                kotlin(
+                    """
                 package test
 
                 import androidx.compose.ui.input.pointer.PointerInputScope
@@ -247,9 +252,9 @@
                     return result
                 }
             """
-            ),
-            *stubs,
-        )
+                ),
+                *stubs,
+            )
             .run()
             .expect(
                 """
@@ -267,9 +272,10 @@
 
     @Test
     fun awaitPointerEventScope_returnedFromLambdaMethod_shouldWarn() {
-        lint().files(
-            kotlin(
-                """
+        lint()
+            .files(
+                kotlin(
+                    """
                 package test
 
                 import androidx.compose.ui.input.pointer.PointerInputScope
@@ -290,9 +296,9 @@
                     } ?: false
                 }
             """
-            ),
-            *stubs,
-        )
+                ),
+                *stubs,
+            )
             .skipTestModes(TestMode.BODY_REMOVAL)
             .run()
             .expect(
@@ -334,10 +340,7 @@
     }
 
     private fun expectClean(source: String) {
-        lint()
-            .files(kotlin(source), *stubs)
-            .run()
-            .expectClean()
+        lint().files(kotlin(source), *stubs).run().expectClean()
     }
 
     private val WarningMessage: String =
diff --git a/compose/ui/ui-lint/src/test/java/androidx/compose/ui/lint/SuspiciousCompositionLocalModifierReadDetectorTest.kt b/compose/ui/ui-lint/src/test/java/androidx/compose/ui/lint/SuspiciousCompositionLocalModifierReadDetectorTest.kt
index 6bd0907..3c4c994 100644
--- a/compose/ui/ui-lint/src/test/java/androidx/compose/ui/lint/SuspiciousCompositionLocalModifierReadDetectorTest.kt
+++ b/compose/ui/ui-lint/src/test/java/androidx/compose/ui/lint/SuspiciousCompositionLocalModifierReadDetectorTest.kt
@@ -30,12 +30,12 @@
 
     override fun getDetector(): Detector = SuspiciousCompositionLocalModifierReadDetector()
 
-    override fun getIssues(): MutableList<Issue> = mutableListOf(
-        SuspiciousCompositionLocalModifierRead
-    )
+    override fun getIssues(): MutableList<Issue> =
+        mutableListOf(SuspiciousCompositionLocalModifierRead)
 
-    private val CompositionLocalConsumerModifierStub = kotlin(
-        """
+    private val CompositionLocalConsumerModifierStub =
+        kotlin(
+            """
             package androidx.compose.ui.node
 
             import androidx.compose.runtime.CompositionLocal
@@ -49,10 +49,11 @@
                 throw RuntimeException("Not implemented in lint stubs.")
             }
         """
-    )
+        )
 
-    private val ModifierNodeStub = kotlin(
-        """
+    private val ModifierNodeStub =
+        kotlin(
+            """
         package androidx.compose.ui
 
         interface Modifier {
@@ -62,10 +63,11 @@
             }
         }
         """
-    )
+        )
 
-    private val CompositionLocalStub = kotlin(
-        """
+    private val CompositionLocalStub =
+        kotlin(
+            """
             package androidx.compose.runtime
 
             import java.lang.RuntimeException
@@ -84,13 +86,14 @@
             fun <T> staticCompositionLocalOf(defaultFactory: () -> T): CompositionLocal<T> =
                 throw RuntimeException("Not implemented in lint stubs.")
         """
-    )
+        )
 
     @Test
     fun testCompositionLocalReadInModifierAttachAndDetach() {
-        lint().files(
-            kotlin(
-                """
+        lint()
+            .files(
+                kotlin(
+                    """
                 package test
 
                 import androidx.compose.ui.Modifier
@@ -113,11 +116,11 @@
                     }
                 }
             """
-            ),
-            CompositionLocalStub,
-            CompositionLocalConsumerModifierStub,
-            ModifierNodeStub
-        )
+                ),
+                CompositionLocalStub,
+                CompositionLocalConsumerModifierStub,
+                ModifierNodeStub
+            )
             .run()
             .expect(
                 """
@@ -134,9 +137,10 @@
 
     @Test
     fun testCompositionLocalReadInAttachDetachLambdaNotReported() {
-        lint().files(
-            kotlin(
-                """
+        lint()
+            .files(
+                kotlin(
+                    """
                 package test
 
                 import androidx.compose.ui.Modifier
@@ -163,20 +167,21 @@
                     }
                 }
             """
-            ),
-            CompositionLocalStub,
-            CompositionLocalConsumerModifierStub,
-            ModifierNodeStub
-        )
+                ),
+                CompositionLocalStub,
+                CompositionLocalConsumerModifierStub,
+                ModifierNodeStub
+            )
             .run()
             .expectClean()
     }
 
     @Test
     fun testCompositionLocalReadInModifierInitializer() {
-        lint().files(
-            kotlin(
-                """
+        lint()
+            .files(
+                kotlin(
+                    """
                 package test
 
                 import androidx.compose.ui.Modifier
@@ -196,11 +201,11 @@
                     }
                 }
             """
-            ),
-            CompositionLocalStub,
-            CompositionLocalConsumerModifierStub,
-            ModifierNodeStub
-        )
+                ),
+                CompositionLocalStub,
+                CompositionLocalConsumerModifierStub,
+                ModifierNodeStub
+            )
             .run()
             .expect(
                 """
@@ -217,9 +222,10 @@
 
     @Test
     fun testCompositionLocalReadInModifierComputedProperty() {
-        lint().files(
-            kotlin(
-                """
+        lint()
+            .files(
+                kotlin(
+                    """
                 package test
 
                 import androidx.compose.ui.Modifier
@@ -237,20 +243,21 @@
                     val readValue: Int get() = currentValueOf(staticLocalInt)
                 }
             """
-            ),
-            CompositionLocalStub,
-            CompositionLocalConsumerModifierStub,
-            ModifierNodeStub
-        )
+                ),
+                CompositionLocalStub,
+                CompositionLocalConsumerModifierStub,
+                ModifierNodeStub
+            )
             .run()
             .expectClean()
     }
 
     @Test
     fun testCompositionLocalReadInLazyPropertyDelegate() {
-        lint().files(
-            kotlin(
-                """
+        lint()
+            .files(
+                kotlin(
+                    """
                 package test
 
                 import androidx.compose.ui.Modifier
@@ -268,11 +275,11 @@
                     val staticReadValue by lazy { currentValueOf(staticLocalInt) }
                 }
             """
-            ),
-            CompositionLocalStub,
-            CompositionLocalConsumerModifierStub,
-            ModifierNodeStub
-        )
+                ),
+                CompositionLocalStub,
+                CompositionLocalConsumerModifierStub,
+                ModifierNodeStub
+            )
             .run()
             .expect(
                 """
@@ -289,9 +296,10 @@
 
     @Test
     fun testCompositionLocalReadInArbitraryFunction() {
-        lint().files(
-            kotlin(
-                """
+        lint()
+            .files(
+                kotlin(
+                    """
                 package test
 
                 import androidx.compose.ui.Modifier
@@ -311,11 +319,11 @@
                     }
                 }
             """
-            ),
-            CompositionLocalStub,
-            CompositionLocalConsumerModifierStub,
-            ModifierNodeStub
-        )
+                ),
+                CompositionLocalStub,
+                CompositionLocalConsumerModifierStub,
+                ModifierNodeStub
+            )
             .run()
             .expectClean()
     }
diff --git a/compose/ui/ui-lint/src/test/java/androidx/compose/ui/lint/SuspiciousModifierThenDetectorTest.kt b/compose/ui/ui-lint/src/test/java/androidx/compose/ui/lint/SuspiciousModifierThenDetectorTest.kt
index cd8c963..98730fd 100644
--- a/compose/ui/ui-lint/src/test/java/androidx/compose/ui/lint/SuspiciousModifierThenDetectorTest.kt
+++ b/compose/ui/ui-lint/src/test/java/androidx/compose/ui/lint/SuspiciousModifierThenDetectorTest.kt
@@ -28,9 +28,7 @@
 
 /* ktlint-disable max-line-length */
 
-/**
- * Test for [SuspiciousModifierThenDetector].
- */
+/** Test for [SuspiciousModifierThenDetector]. */
 @RunWith(JUnit4::class)
 class SuspiciousModifierThenDetectorTest : LintDetectorTest() {
     override fun getDetector(): Detector = SuspiciousModifierThenDetector()
@@ -40,9 +38,10 @@
 
     @Test
     fun clean() {
-        lint().files(
-            kotlin(
-                """
+        lint()
+            .files(
+                kotlin(
+                    """
                 package test
 
                 import androidx.compose.ui.Modifier
@@ -74,18 +73,19 @@
                     return this.then(lambda())
                 }
 """
-            ),
-            Stubs.Modifier
-        )
+                ),
+                Stubs.Modifier
+            )
             .run()
             .expectClean()
     }
 
     @Test
     fun errors() {
-        lint().files(
-            kotlin(
-                """
+        lint()
+            .files(
+                kotlin(
+                    """
                 package test
 
                 import androidx.compose.ui.Modifier
@@ -100,9 +100,9 @@
 
                 fun Modifier.test4() = this.then(if (true) test() else TestModifier)
 """
-            ),
-            Stubs.Modifier
-        )
+                ),
+                Stubs.Modifier
+            )
             .run()
             .expect(
                 """
diff --git a/compose/ui/ui-lint/src/test/java/androidx/compose/ui/lint/UiStubs.kt b/compose/ui/ui-lint/src/test/java/androidx/compose/ui/lint/UiStubs.kt
index d233509..a3043ec 100644
--- a/compose/ui/ui-lint/src/test/java/androidx/compose/ui/lint/UiStubs.kt
+++ b/compose/ui/ui-lint/src/test/java/androidx/compose/ui/lint/UiStubs.kt
@@ -21,23 +21,24 @@
 
 object UiStubs {
 
-    val Density: TestFile = bytecodeStub(
-        filename = "Density.kt",
-        filepath = "androidx/compose/ui/unit",
-        checksum = 0xcc05f7d8,
-        """
+    val Density: TestFile =
+        bytecodeStub(
+            filename = "Density.kt",
+            filepath = "androidx/compose/ui/unit",
+            checksum = 0xcc05f7d8,
+            """
             package androidx.compose.ui.unit
 
             interface Density
         """,
-"""
+            """
         META-INF/main.kotlin_module:
         H4sIAAAAAAAA/2VMQQoCMRAbUQR7EOkDBMWThzl7F1dkL4J+oGzr7oDOlHYK
         Pt/KejOQEBISAJgCwKRyAT+Yg9k59knIv7GTV5Qc8CGFvVMSxj5kLSlku2ok
         nVw3nMegVXM0m79lISSORTEKsYZk17eSY2BP3F/H6PLtG3pWW0+WZqb10c7v
         VVvdwh4+IfeLY6cAAAA=
         """,
-        """
+            """
         androidx/compose/ui/unit/Density.class:
         H4sIAAAAAAAA/4VOTUvDQBB9s9GmjV+pWqg38Qe4benNkyBCoCIoeMlpm6yy
         bbor3U2pt/4uD9KzP0qcqHdn4M17M/DefH69fwAYo0c4V7ZcOlOuZeEWr85r
@@ -46,13 +47,14 @@
         /KnLeWDx6OploW9NpQlnD7UNZqGfjDfTSl9b64IKxlnf4gzs4LcETn7wGKc8
         h2y5y93KEWWIM7QzdJAwxV6GfRzkII9DHOUQHqlH9xtDUhD7SQEAAA==
         """
-    )
+        )
 
-    val PointerEvent: TestFile = bytecodeStub(
-        filename = "PointerEvent.kt",
-        filepath = "androidx/compose/ui/input/pointer",
-        checksum = 0x7fd06e9b,
-        """
+    val PointerEvent: TestFile =
+        bytecodeStub(
+            filename = "PointerEvent.kt",
+            filepath = "androidx/compose/ui/input/pointer",
+            checksum = 0x7fd06e9b,
+            """
             package androidx.compose.ui.input.pointer
 
             import androidx.compose.ui.unit.Density
@@ -65,14 +67,14 @@
                 val id: PointerId
             )
         """,
-"""
+            """
         META-INF/main.kotlin_module:
         H4sIAAAAAAAA/2VMQQoCMRAbUQR7EOkDBMWThzl7F1dkL4J+oGzr7oDOlHYK
         Pt/KejOQEBISAJgCwKRyAT+Yg9k59knIv7GTV5Qc8CGFvVMSxj5kLSlku2ok
         nVw3nMegVXM0m79lISSORTEKsYZk17eSY2BP3F/H6PLtG3pWW0+WZqb10c7v
         VVvdwh4+IfeLY6cAAAA=
         """,
-        """
+            """
         androidx/compose/ui/input/pointer/AwaitPointerEventScope.class:
         H4sIAAAAAAAA/51Qu04CQRQ9d1F5+AAUFTvjBzhALIxWJGqyCUYjiQ3VsDua
         gWVmw9xF7PguC0PtRxlntaGgspgz5965j3Pm6/vjE8AFjgmX0sRTq+O5iOwk
@@ -82,7 +84,7 @@
         zaaRutOJIpw8ZYb1RD1rp4eJ6hpjWbK2xm15idjwlrZyZ54f/mIDR/5u+7z/
         F5QGKIQoh6iE2MaOp9gNsYfqAORQQ32AwGHf4eAHKmYZqccBAAA=
         """,
-        """
+            """
         androidx/compose/ui/input/pointer/PointerId.class:
         H4sIAAAAAAAA/5VQTW8SQRh+ZpZdlhVkwS+KH9XWQ4vRpY03TaM2mkBQm2q4
         cBrYSZ0Cs4SdJT3yW7x7MNGYeDDEoz/K+M5CPHkxmXnmfd558rwfv35//wHg
@@ -96,7 +98,7 @@
         1o0WipDu2ivKvQG39QWVT/+0Ka8FGxuOnRzvYJfeZ3mTLq4M4HRwtYNrHSp7
         g0I0OthCcwCW4iZuDVBMUU1xO0WQo5ciTFH7Azsv3rCuAgAA
         """,
-        """
+            """
         androidx/compose/ui/input/pointer/PointerInputChange.class:
         H4sIAAAAAAAA/5VSXU8TURA9d7dfLAXaIlJA8QOUUoQthPiCMSrRZJO1EjC8
         8HTbvSm3H3fJ7m3DI7/FX6CJRuODIT76o4xz2w0IvkiymTNnMnNmdub++v39
@@ -113,13 +115,14 @@
         ooy5pI1rjkSYrn7GzMcL7cwwOD7UzI8SEs2rEz8Z2sdYJ3xB0XnKWziC7eGO
         h7seFnGPXNz38AAPj8BiLGH5CNkYszEexcjFmI6RiVGOMfcHIp5sr08EAAA=
         """
-    )
+        )
 
-    val PointerInputScope: TestFile = bytecodeStub(
-        filename = "SuspendingPointerInputFilter.kt",
-        filepath = "androidx/compose/ui/input/pointer",
-        checksum = 0xa05e1a0a,
-        """
+    val PointerInputScope: TestFile =
+        bytecodeStub(
+            filename = "SuspendingPointerInputFilter.kt",
+            filepath = "androidx/compose/ui/input/pointer",
+            checksum = 0xa05e1a0a,
+            """
             package androidx.compose.ui.input.pointer
             import androidx.compose.ui.unit.Density
             import androidx.compose.ui.Modifier
@@ -135,14 +138,14 @@
                 block: suspend PointerInputScope.() -> Unit
             ): Modifier = Modifier
         """,
-"""
+            """
         META-INF/main.kotlin_module:
         H4sIAAAAAAAA/2VMQQoCMRAbUQR7EOkDBMWThzl7F1dkL4J+oGzr7oDOlHYK
         Pt/KejOQEBISAJgCwKRyAT+Yg9k59knIv7GTV5Qc8CGFvVMSxj5kLSlku2ok
         nVw3nMegVXM0m79lISSORTEKsYZk17eSY2BP3F/H6PLtG3pWW0+WZqb10c7v
         VVvdwh4+IfeLY6cAAAA=
         """,
-        """
+            """
         androidx/compose/ui/input/pointer/PointerInputScope.class:
         H4sIAAAAAAAA/51Ty24TMRS9nsljklKYDlDSFtqSlpdQmRBg04SKClo1VYAq
         idh05UzcyOnEjsae0O7yLSz4CBYo6pIf4S8Qd/JQSxsRxML28fXx9T328Y9f
@@ -160,7 +163,7 @@
         EIfZQzBLcL0EN0pgwxxCcEpwE24dAlFwG+YPYUbBHQUZBUkFCwoWFSwpuKvg
         noJlBSsKrN90t5jzEwUAAA==
         """,
-        """
+            """
         androidx/compose/ui/input/pointer/SuspendingPointerInputFilterKt.class:
         H4sIAAAAAAAA/61VW28bRRT+Zu34VkPcDSmJE9KUmObSpusYym2jiBJRycIN
         BZe85Gm8nroTr2esnd0ofetv4RcgnhAPKOKR38JvQJzZOKnTBAehPuyZc/nm
@@ -182,13 +185,14 @@
         Az6dLdLfpmyXD5Bp4k4THzaxgloTH+FuE6tYOwAzWMfGAW4YTBksGCwa3DNw
         De4bbBo8SEXPIPcPJkHsLNsGAAA=
         """
-    )
+        )
 
-    val Alignment: TestFile = bytecodeStub(
-        filename = "Alignment.kt",
-        filepath = "androidx/compose/ui",
-        checksum = 0x72950571,
-        """
+    val Alignment: TestFile =
+        bytecodeStub(
+            filename = "Alignment.kt",
+            filepath = "androidx/compose/ui",
+            checksum = 0x72950571,
+            """
             package androidx.compose.ui
             class Alignment {
                 companion object {
@@ -196,14 +200,14 @@
                 }
             }
             """,
-"""
+            """
         META-INF/main.kotlin_module:
         H4sIAAAAAAAA/2VMQQoCMRAbUQR7EOkDBMWThzl7F1dkL4J+oGzr7oDOlHYK
         Pt/KejOQEBISAJgCwKRyAT+Yg9k59knIv7GTV5Qc8CGFvVMSxj5kLSlku2ok
         nVw3nMegVXM0m79lISSORTEKsYZk17eSY2BP3F/H6PLtG3pWW0+WZqb10c7v
         VVvdwh4+IfeLY6cAAAA=
         """,
-        """
+            """
         androidx/compose/ui/Alignment＄Companion.class:
         H4sIAAAAAAAA/5WTz08TQRTHv7PdtstSpeWH8kNFpEqL2gXiDWOEGpMmBRMg
         vXAw0+1Yp93Okp1pw7En/xD/AjlpPBjC0T/K+LasQDQRvbx57/ve583svJ3v
@@ -221,7 +225,7 @@
         9NtUO3uIVA1zNczXsIA75OJuDfeweAimcR9Lh8hquBoPNDIayxpFjXGN3E/q
         H9VdNgQAAA==
         """,
-        """
+            """
         androidx/compose/ui/Alignment.class:
         H4sIAAAAAAAA/4VSXU8TURA9d7ct7bJKqVIpHwJSpaCyQExMhJhgjUmTUhMh
         JISn2+213nZ7l+y9bXjkt/gLRB5IJDHER3+UcbYU8COBl5mdc+fMnJnZn7++
@@ -238,16 +242,15 @@
         doqxExTOYO2dYuIEI8d/cYepl43nFMXSc6QoT8Mt97WVSDDwkvApypreh13B
         wwpmKpjFHH3iUQXzKO6DaTzGk30kNByNBY2URv43qNs4vuQDAAA=
         """
-    )
+        )
 
-    /**
-     * Simplified Modifier.composed stub
-     */
-    val composed = bytecodeStub(
-        filename = "ComposedModifier.kt",
-        filepath = "androidx/compose/ui",
-        checksum = 0xc6ba0d09,
-        """
+    /** Simplified Modifier.composed stub */
+    val composed =
+        bytecodeStub(
+            filename = "ComposedModifier.kt",
+            filepath = "androidx/compose/ui",
+            checksum = 0xc6ba0d09,
+            """
             package androidx.compose.ui
 
             import androidx.compose.runtime.Composable
@@ -257,13 +260,13 @@
                 factory: @Composable Modifier.() -> Modifier
             ): Modifier = this
         """,
-"""
+            """
         META-INF/main.kotlin_module:
         H4sIAAAAAAAA/2NgYGBmYGBgBGJOBijgUuOSSMxLKcrPTKnQS87PLcgvTtUr
         Ks0rycxNFeIKSs1NzU1KLfIu4dLkEsZQV5opJOQMYaf45qdkpmWClfJxsZSk
         FpcIsYUASe8SJQYtBgBxwST5ewAAAA==
         """,
-        """
+            """
         androidx/compose/ui/ComposedModifierKt＄composed＄1.class:
         H4sIAAAAAAAA/5VU6U4TURT+7rR0GYoti7KIO2ILyrTg3oaENBAnFEwEmxh+
         3XYGuHR6x8xMG/zHK/gKPoFoIokmhvjThzKeO20NbqCTzJ2Tc77v7He+fvv4
@@ -282,7 +285,7 @@
         qP4HYZAIHobfAh6Ffym6/8S6soWIiasmrpm4jhsmNeOmiWnc2gLzkUWO7D5m
         fMz6SH8Hu1pp5uIEAAA=
         """,
-        """
+            """
         androidx/compose/ui/ComposedModifierKt.class:
         H4sIAAAAAAAA/7VUUU8bRxD+9mzss2OIsUlCHEJo4yRgSM4maZvWhAShIJ1q
         3CqmvPC0+NZk8XkP3Z0ReYn4C33sa39B1aeoDxXqY6X+paqz53MggHClqjrd
@@ -305,5 +308,5 @@
         mn9A8A93kLDxyMa8jQVUbCxiycZjPNkBC2ChuoNMgLEANwNMUuECLAcoBnga
         4FmAL/4BKp/c6X8HAAA=
         """
-    )
+        )
 }
diff --git a/compose/ui/ui-test-junit4/src/androidInstrumentedTest/kotlin/androidx/compose/ui/test/junit4/CustomEffectContextRuleTest.kt b/compose/ui/ui-test-junit4/src/androidInstrumentedTest/kotlin/androidx/compose/ui/test/junit4/CustomEffectContextRuleTest.kt
index 97f5c8e..cd10456 100644
--- a/compose/ui/ui-test-junit4/src/androidInstrumentedTest/kotlin/androidx/compose/ui/test/junit4/CustomEffectContextRuleTest.kt
+++ b/compose/ui/ui-test-junit4/src/androidInstrumentedTest/kotlin/androidx/compose/ui/test/junit4/CustomEffectContextRuleTest.kt
@@ -35,8 +35,8 @@
 import org.junit.runners.model.Statement
 
 /**
- * Tests for passing a custom CoroutineContext to one of [ComposeTestRule]s.
- * Similar tests are available for [runComposeUiTest] in compose:ui:ui-test
+ * Tests for passing a custom CoroutineContext to one of [ComposeTestRule]s. Similar tests are
+ * available for [runComposeUiTest] in compose:ui:ui-test
  */
 @LargeTest
 @RunWith(AndroidJUnit4::class)
@@ -50,30 +50,28 @@
      * [ComposeTestRule].
      */
     @get:Rule
-    val testWatcher = object : TestWatcher() {
-        override fun starting(description: Description) {
-            testDescription = description
+    val testWatcher =
+        object : TestWatcher() {
+            override fun starting(description: Description) {
+                testDescription = description
+            }
         }
-    }
 
     @Test
     fun effectContextPropagatedToComposition_createComposeRule() {
         val testElement = TestCoroutineContextElement()
         lateinit var compositionScope: CoroutineScope
         val rule = createComposeRule(testElement)
-        val baseStatement = object : Statement() {
-            override fun evaluate() {
-                rule.setContent {
-                    compositionScope = rememberCoroutineScope()
+        val baseStatement =
+            object : Statement() {
+                override fun evaluate() {
+                    rule.setContent { compositionScope = rememberCoroutineScope() }
+                    rule.waitForIdle()
                 }
-                rule.waitForIdle()
             }
-        }
-        rule.apply(baseStatement, testDescription)
-            .evaluate()
+        rule.apply(baseStatement, testDescription).evaluate()
 
-        val elementFromComposition =
-            compositionScope.coroutineContext[TestCoroutineContextElement]
+        val elementFromComposition = compositionScope.coroutineContext[TestCoroutineContextElement]
         Truth.assertThat(elementFromComposition).isSameInstanceAs(testElement)
     }
 
@@ -82,19 +80,16 @@
         val testElement = TestCoroutineContextElement()
         lateinit var compositionScope: CoroutineScope
         val rule = createAndroidComposeRule<ComponentActivity>(testElement)
-        val baseStatement = object : Statement() {
-            override fun evaluate() {
-                rule.setContent {
-                    compositionScope = rememberCoroutineScope()
+        val baseStatement =
+            object : Statement() {
+                override fun evaluate() {
+                    rule.setContent { compositionScope = rememberCoroutineScope() }
+                    rule.waitForIdle()
                 }
-                rule.waitForIdle()
             }
-        }
-        rule.apply(baseStatement, testDescription)
-            .evaluate()
+        rule.apply(baseStatement, testDescription).evaluate()
 
-        val elementFromComposition =
-            compositionScope.coroutineContext[TestCoroutineContextElement]
+        val elementFromComposition = compositionScope.coroutineContext[TestCoroutineContextElement]
         Truth.assertThat(elementFromComposition).isSameInstanceAs(testElement)
     }
 
@@ -104,26 +99,26 @@
         lateinit var compositionScope: CoroutineScope
         val composeRule = createEmptyComposeRule(testElement)
         val activityRule = ActivityScenarioRule(ComponentActivity::class.java)
-        val baseStatement = object : Statement() {
-            override fun evaluate() {
-                activityRule.scenario.onActivity {
-                    it.setContent {
-                        compositionScope = rememberCoroutineScope()
+        val baseStatement =
+            object : Statement() {
+                override fun evaluate() {
+                    activityRule.scenario.onActivity {
+                        it.setContent { compositionScope = rememberCoroutineScope() }
                     }
+                    composeRule.waitForIdle()
                 }
-                composeRule.waitForIdle()
             }
-        }
-        activityRule.apply(composeRule.apply(baseStatement, testDescription), testDescription)
+        activityRule
+            .apply(composeRule.apply(baseStatement, testDescription), testDescription)
             .evaluate()
 
-        val elementFromComposition =
-            compositionScope.coroutineContext[TestCoroutineContextElement]
+        val elementFromComposition = compositionScope.coroutineContext[TestCoroutineContextElement]
         Truth.assertThat(elementFromComposition).isSameInstanceAs(testElement)
     }
 
     private class TestCoroutineContextElement : CoroutineContext.Element {
-        override val key: CoroutineContext.Key<*> get() = Key
+        override val key: CoroutineContext.Key<*>
+            get() = Key
 
         companion object Key : CoroutineContext.Key<TestCoroutineContextElement>
     }
diff --git a/compose/ui/ui-test-junit4/src/androidMain/kotlin/androidx/compose/ui/test/junit4/AndroidComposeTestRule.android.kt b/compose/ui/ui-test-junit4/src/androidMain/kotlin/androidx/compose/ui/test/junit4/AndroidComposeTestRule.android.kt
index 832e271..4d70df8 100644
--- a/compose/ui/ui-test-junit4/src/androidMain/kotlin/androidx/compose/ui/test/junit4/AndroidComposeTestRule.android.kt
+++ b/compose/ui/ui-test-junit4/src/androidMain/kotlin/androidx/compose/ui/test/junit4/AndroidComposeTestRule.android.kt
@@ -54,8 +54,8 @@
  * into your app's manifest file (usually in main/AndroidManifest.xml).
  *
  * This creates a test rule that is using [ActivityScenarioRule] as the activity launcher. If you
- * would like to use a different one you can create [AndroidComposeTestRule] directly and supply
- * it with your own launcher.
+ * would like to use a different one you can create [AndroidComposeTestRule] directly and supply it
+ * with your own launcher.
  *
  * If your test doesn't require a specific Activity, use [createComposeRule] instead.
  */
@@ -78,8 +78,8 @@
  * into your app's manifest file (usually in main/AndroidManifest.xml).
  *
  * This creates a test rule that is using [ActivityScenarioRule] as the activity launcher. If you
- * would like to use a different one you can create [AndroidComposeTestRule] directly and supply
- * it with your own launcher.
+ * would like to use a different one you can create [AndroidComposeTestRule] directly and supply it
+ * with your own launcher.
  *
  * If your test doesn't require a specific Activity, use [createComposeRule] instead.
  */
@@ -104,17 +104,18 @@
  * into your app's manifest file (usually in main/AndroidManifest.xml).
  *
  * This creates a test rule that is using [ActivityScenarioRule] as the activity launcher. If you
- * would like to use a different one you can create [AndroidComposeTestRule] directly and supply
- * it with your own launcher.
+ * would like to use a different one you can create [AndroidComposeTestRule] directly and supply it
+ * with your own launcher.
  *
  * If your test doesn't require a specific Activity, use [createComposeRule] instead.
  */
 fun <A : ComponentActivity> createAndroidComposeRule(
     activityClass: Class<A>
-): AndroidComposeTestRule<ActivityScenarioRule<A>, A> = AndroidComposeTestRule(
-    activityRule = ActivityScenarioRule(activityClass),
-    activityProvider = ::getActivityFromTestRule
-)
+): AndroidComposeTestRule<ActivityScenarioRule<A>, A> =
+    AndroidComposeTestRule(
+        activityRule = ActivityScenarioRule(activityClass),
+        activityProvider = ::getActivityFromTestRule
+    )
 
 /**
  * Factory method to provide android specific implementation of [createComposeRule], for a given
@@ -126,8 +127,8 @@
  * into your app's manifest file (usually in main/AndroidManifest.xml).
  *
  * This creates a test rule that is using [ActivityScenarioRule] as the activity launcher. If you
- * would like to use a different one you can create [AndroidComposeTestRule] directly and supply
- * it with your own launcher.
+ * would like to use a different one you can create [AndroidComposeTestRule] directly and supply it
+ * with your own launcher.
  *
  * If your test doesn't require a specific Activity, use [createComposeRule] instead.
  */
@@ -135,20 +136,21 @@
 fun <A : ComponentActivity> createAndroidComposeRule(
     activityClass: Class<A>,
     effectContext: CoroutineContext = EmptyCoroutineContext
-): AndroidComposeTestRule<ActivityScenarioRule<A>, A> = AndroidComposeTestRule(
-    activityRule = ActivityScenarioRule(activityClass),
-    activityProvider = ::getActivityFromTestRule,
-    effectContext = effectContext
-)
+): AndroidComposeTestRule<ActivityScenarioRule<A>, A> =
+    AndroidComposeTestRule(
+        activityRule = ActivityScenarioRule(activityClass),
+        activityProvider = ::getActivityFromTestRule,
+        effectContext = effectContext
+    )
 
 /**
  * Factory method to provide an implementation of [ComposeTestRule] that doesn't create a compose
  * host for you in which you can set content.
  *
- * This method is useful for tests that need to create their own compose host during the test.
- * The returned test rule will not create a host, and consequently does not provide a
- * `setContent` method. To set content in tests using this rule, use the appropriate `setContent`
- * methods from your compose host.
+ * This method is useful for tests that need to create their own compose host during the test. The
+ * returned test rule will not create a host, and consequently does not provide a `setContent`
+ * method. To set content in tests using this rule, use the appropriate `setContent` methods from
+ * your compose host.
  *
  * A typical use case on Android is when the test needs to launch an Activity (the compose host)
  * after one or more dependencies have been injected.
@@ -168,33 +170,35 @@
  * Factory method to provide an implementation of [ComposeTestRule] that doesn't create a compose
  * host for you in which you can set content.
  *
- * This method is useful for tests that need to create their own compose host during the test.
- * The returned test rule will not create a host, and consequently does not provide a
- * `setContent` method. To set content in tests using this rule, use the appropriate `setContent`
- * methods from your compose host.
+ * This method is useful for tests that need to create their own compose host during the test. The
+ * returned test rule will not create a host, and consequently does not provide a `setContent`
+ * method. To set content in tests using this rule, use the appropriate `setContent` methods from
+ * your compose host.
  *
  * A typical use case on Android is when the test needs to launch an Activity (the compose host)
  * after one or more dependencies have been injected.
  *
  * @param effectContext The [CoroutineContext] used to run the composition. The context for
- * `LaunchedEffect`s and `rememberCoroutineScope` will be derived from this context.
+ *   `LaunchedEffect`s and `rememberCoroutineScope` will be derived from this context.
  */
 @ExperimentalTestApi
 fun createEmptyComposeRule(
     effectContext: CoroutineContext = EmptyCoroutineContext
-): ComposeTestRule = AndroidComposeTestRule<TestRule, ComponentActivity>(
-    activityRule = TestRule { base, _ -> base },
-    effectContext = effectContext,
-    activityProvider = {
-        error(
-            "createEmptyComposeRule() does not provide an Activity to set Compose content in." +
-                " Launch and use the Activity yourself, or use createAndroidComposeRule()."
-        )
-    }
-)
+): ComposeTestRule =
+    AndroidComposeTestRule<TestRule, ComponentActivity>(
+        activityRule = TestRule { base, _ -> base },
+        effectContext = effectContext,
+        activityProvider = {
+            error(
+                "createEmptyComposeRule() does not provide an Activity to set Compose content in." +
+                    " Launch and use the Activity yourself, or use createAndroidComposeRule()."
+            )
+        }
+    )
 
 @OptIn(ExperimentalTestApi::class)
-class AndroidComposeTestRule<R : TestRule, A : ComponentActivity> private constructor(
+class AndroidComposeTestRule<R : TestRule, A : ComponentActivity>
+private constructor(
     val activityRule: R,
     private val environment: AndroidComposeUiTestEnvironment<A>
 ) : ComposeContentTestRule {
@@ -206,10 +210,10 @@
      *
      * The Activity is normally launched by the given [activityRule] before the test starts, but it
      * is possible to pass a test rule that chooses to launch an Activity on a later time. The
-     * Activity is retrieved from the [activityRule] by means of the [activityProvider], which can be
-     * thought of as a getter for the Activity on the [activityRule]. If you use an [activityRule]
-     * that launches an Activity on a later time, you should make sure that the Activity is launched
-     * by the time or while the [activityProvider] is called.
+     * Activity is retrieved from the [activityRule] by means of the [activityProvider], which can
+     * be thought of as a getter for the Activity on the [activityRule]. If you use an
+     * [activityRule] that launches an Activity on a later time, you should make sure that the
+     * Activity is launched by the time or while the [activityProvider] is called.
      *
      * The [AndroidComposeTestRule] wraps around the given [activityRule] to make sure the Activity
      * is launched _after_ the [AndroidComposeTestRule] has completed all necessary steps to control
@@ -233,10 +237,10 @@
      *
      * The Activity is normally launched by the given [activityRule] before the test starts, but it
      * is possible to pass a test rule that chooses to launch an Activity on a later time. The
-     * Activity is retrieved from the [activityRule] by means of the [activityProvider], which can be
-     * thought of as a getter for the Activity on the [activityRule]. If you use an [activityRule]
-     * that launches an Activity on a later time, you should make sure that the Activity is launched
-     * by the time or while the [activityProvider] is called.
+     * Activity is retrieved from the [activityRule] by means of the [activityProvider], which can
+     * be thought of as a getter for the Activity on the [activityRule]. If you use an
+     * [activityRule] that launches an Activity on a later time, you should make sure that the
+     * Activity is launched by the time or while the [activityProvider] is called.
      *
      * The [AndroidComposeTestRule] wraps around the given [activityRule] to make sure the Activity
      * is launched _after_ the [AndroidComposeTestRule] has completed all necessary steps to control
@@ -244,7 +248,7 @@
      *
      * @param activityRule Test rule to use to launch the Activity.
      * @param effectContext The [CoroutineContext] used to run the composition. The context for
-     * `LaunchedEffect`s and `rememberCoroutineScope` will be derived from this context.
+     *   `LaunchedEffect`s and `rememberCoroutineScope` will be derived from this context.
      * @param activityProvider Function to retrieve the Activity from the given [activityRule].
      */
     @ExperimentalTestApi
@@ -262,15 +266,14 @@
      *
      * Avoid calling often as it can involve synchronization and can be slow.
      */
-    val activity: A get() = checkNotNull(composeTest.activity) { "Host activity not found" }
+    val activity: A
+        get() = checkNotNull(composeTest.activity) { "Host activity not found" }
 
     override fun apply(base: Statement, description: Description): Statement {
         val testStatement = activityRule.apply(base, description)
         return object : Statement() {
             override fun evaluate() {
-                environment.runTest {
-                    testStatement.evaluate()
-                }
+                environment.runTest { testStatement.evaluate() }
             }
         }
     }
@@ -290,9 +293,11 @@
      * REPLACE ALL OVERRIDES BELOW WITH DELEGATION: ComposeTest by composeTest
      */
 
-    override val density: Density get() = composeTest.density
+    override val density: Density
+        get() = composeTest.density
 
-    override val mainClock: MainTestClock get() = composeTest.mainClock
+    override val mainClock: MainTestClock
+        get() = composeTest.mainClock
 
     override fun <T> runOnUiThread(action: () -> T): T = composeTest.runOnUiThread(action)
 
@@ -350,11 +355,10 @@
     /**
      * Cancels AndroidComposeUiTestEnvironment's current Recomposer and creates a new one.
      *
-     * Recreates the CoroutineContext associated with Compose being cancelled. This happens
-     * when an app moves from a regular ("Full screen") view of the app to a "Pop up" view AND
-     * certain properties in the manifest's android:configChanges are set to prevent a
-     * full tear down of the app. This is a somewhat rare case (see
-     * [AndroidComposeUiTestEnvironment] for more details).
+     * Recreates the CoroutineContext associated with Compose being cancelled. This happens when an
+     * app moves from a regular ("Full screen") view of the app to a "Pop up" view AND certain
+     * properties in the manifest's android:configChanges are set to prevent a full tear down of the
+     * app. This is a somewhat rare case (see [AndroidComposeUiTestEnvironment] for more details).
      */
     fun cancelAndRecreateRecomposer() {
         environment.cancelAndRecreateRecomposer()
diff --git a/compose/ui/ui-test-junit4/src/androidMain/kotlin/androidx/compose/ui/test/junit4/StateRestorationTester.android.kt b/compose/ui/ui-test-junit4/src/androidMain/kotlin/androidx/compose/ui/test/junit4/StateRestorationTester.android.kt
index 5aef10f..c08c6ea 100644
--- a/compose/ui/ui-test-junit4/src/androidMain/kotlin/androidx/compose/ui/test/junit4/StateRestorationTester.android.kt
+++ b/compose/ui/ui-test-junit4/src/androidMain/kotlin/androidx/compose/ui/test/junit4/StateRestorationTester.android.kt
@@ -56,21 +56,15 @@
     }
 
     /**
-     * Saves all the state stored via [savedInstanceState] or [rememberSaveable],
-     * disposes current composition, and composes again the content passed to [setContent].
-     * Allows to test how your component behaves when the state restoration is happening.
-     * Note that the state stored via regular state() or remember() will be lost.
+     * Saves all the state stored via [savedInstanceState] or [rememberSaveable], disposes current
+     * composition, and composes again the content passed to [setContent]. Allows to test how your
+     * component behaves when the state restoration is happening. Note that the state stored via
+     * regular state() or remember() will be lost.
      */
     fun emulateSavedInstanceStateRestore() {
-        val registry = checkNotNull(registry) {
-            "setContent should be called first!"
-        }
-        composeTestRule.runOnIdle {
-            registry.saveStateAndDisposeChildren()
-        }
-        composeTestRule.runOnIdle {
-            registry.emitChildrenWithRestoredState()
-        }
+        val registry = checkNotNull(registry) { "setContent should be called first!" }
+        composeTestRule.runOnIdle { registry.saveStateAndDisposeChildren() }
+        composeTestRule.runOnIdle { registry.emitChildrenWithRestoredState() }
         composeTestRule.runOnIdle {
             // we just wait for the children to be emitted
         }
@@ -78,10 +72,11 @@
 
     @Composable
     private fun InjectRestorationRegistry(content: @Composable (RestorationRegistry) -> Unit) {
-        val original = requireNotNull(LocalSaveableStateRegistry.current) {
-            "StateRestorationTester requires composeTestRule.setContent() to provide " +
-                "a SaveableStateRegistry implementation via LocalSaveableStateRegistry"
-        }
+        val original =
+            requireNotNull(LocalSaveableStateRegistry.current) {
+                "StateRestorationTester requires composeTestRule.setContent() to provide " +
+                    "a SaveableStateRegistry implementation via LocalSaveableStateRegistry"
+            }
         val restorationRegistry = remember { RestorationRegistry(original) }
         CompositionLocalProvider(LocalSaveableStateRegistry provides restorationRegistry) {
             if (restorationRegistry.shouldEmitChildren) {
@@ -95,6 +90,7 @@
 
         var shouldEmitChildren by mutableStateOf(true)
             private set
+
         private var currentRegistry: SaveableStateRegistry = original
         private var savedMap: Map<String, List<Any?>> = emptyMap()
 
@@ -104,10 +100,11 @@
         }
 
         fun emitChildrenWithRestoredState() {
-            currentRegistry = SaveableStateRegistry(
-                restoredValues = savedMap,
-                canBeSaved = { original.canBeSaved(it) }
-            )
+            currentRegistry =
+                SaveableStateRegistry(
+                    restoredValues = savedMap,
+                    canBeSaved = { original.canBeSaved(it) }
+                )
             shouldEmitChildren = true
         }
 
diff --git a/compose/ui/ui-test-junit4/src/desktopMain/kotlin/androidx/compose/ui/test/junit4/DesktopComposeTestRule.desktop.kt b/compose/ui/ui-test-junit4/src/desktopMain/kotlin/androidx/compose/ui/test/junit4/DesktopComposeTestRule.desktop.kt
index 43987e6..9e1d744 100644
--- a/compose/ui/ui-test-junit4/src/desktopMain/kotlin/androidx/compose/ui/test/junit4/DesktopComposeTestRule.desktop.kt
+++ b/compose/ui/ui-test-junit4/src/desktopMain/kotlin/androidx/compose/ui/test/junit4/DesktopComposeTestRule.desktop.kt
@@ -46,9 +46,8 @@
 
 @InternalTestApi
 @OptIn(ExperimentalTestApi::class)
-class DesktopComposeTestRule private constructor(
-    private val composeTest: DesktopComposeUiTest
-) : ComposeContentTestRule {
+class DesktopComposeTestRule private constructor(private val composeTest: DesktopComposeUiTest) :
+    ComposeContentTestRule {
 
     constructor() : this(DesktopComposeUiTest())
 
@@ -66,9 +65,7 @@
     override fun apply(base: Statement, description: Description?): Statement {
         return object : Statement() {
             override fun evaluate() {
-                composeTest.runTest {
-                    base.evaluate()
-                }
+                composeTest.runTest { base.evaluate() }
             }
         }
     }
diff --git a/compose/ui/ui-test-junit4/src/desktopMain/kotlin/androidx/compose/ui/test/junit4/SkiaTest.desktop.kt b/compose/ui/ui-test-junit4/src/desktopMain/kotlin/androidx/compose/ui/test/junit4/SkiaTest.desktop.kt
index 2e6a994..494e4ef 100644
--- a/compose/ui/ui-test-junit4/src/desktopMain/kotlin/androidx/compose/ui/test/junit4/SkiaTest.desktop.kt
+++ b/compose/ui/ui-test-junit4/src/desktopMain/kotlin/androidx/compose/ui/test/junit4/SkiaTest.desktop.kt
@@ -60,6 +60,7 @@
 
     private val screenshots: MutableMap<String, ScreenshotResultProto> = mutableMapOf()
     private val report = Report(screenshots)
+
     fun snap(surface: Surface, id: String) {
         write(surface.makeImageSnapshot(), id)
     }
@@ -84,17 +85,14 @@
             return
         }
 
-        val status = if (compareImages(actual = actual, expected = expected)) {
-            ScreenshotResultProto.Status.PASSED
-        } else {
-            ScreenshotResultProto.Status.FAILED
-        }
+        val status =
+            if (compareImages(actual = actual, expected = expected)) {
+                ScreenshotResultProto.Status.PASSED
+            } else {
+                ScreenshotResultProto.Status.FAILED
+            }
 
-        reportResult(
-            status = status,
-            id = id,
-            actual = actual
-        )
+        reportResult(status = status, id = id, actual = actual)
     }
 
     fun check(): Report {
@@ -124,9 +122,7 @@
     }
 
     private fun calcHash(input: ByteArray): ByteArray {
-        return MessageDigest
-            .getInstance("SHA-256")
-            .digest(input)
+        return MessageDigest.getInstance("SHA-256").digest(input)
     }
 
     // TODO: switch to androidx.test.screenshot.matchers.BitmapMatcher#compareBitmaps
@@ -154,15 +150,16 @@
             currentScreenshotFileName = inModuleImagePath(id)
         }
 
-        screenshots[id] = ScreenshotResultProto(
-            result = status,
-            comparisonStatistics = comparisonStatistics.orEmpty(),
-            repoRootPath = config.repoGoldenPath,
-            locationOfGoldenInRepo = inModuleImagePath(id),
-            currentScreenshotFileName = currentScreenshotFileName,
-            expectedImageFileName = inModuleImagePath(id),
-            diffImageFileName = null
-        )
+        screenshots[id] =
+            ScreenshotResultProto(
+                result = status,
+                comparisonStatistics = comparisonStatistics.orEmpty(),
+                repoRootPath = config.repoGoldenPath,
+                locationOfGoldenInRepo = inModuleImagePath(id),
+                currentScreenshotFileName = currentScreenshotFileName,
+                expectedImageFileName = inModuleImagePath(id),
+                diffImageFileName = null
+            )
     }
 }
 
@@ -186,8 +183,12 @@
         return object : Statement() {
             override fun evaluate() {
                 album = SkiaTestAlbum(config)
-                testIdentifier = "${description!!.className}_${description.methodName}"
-                    .replace(".", "_").replace(",", "_").replace(" ", "_").replace("__", "_")
+                testIdentifier =
+                    "${description!!.className}_${description.methodName}"
+                        .replace(".", "_")
+                        .replace(",", "_")
+                        .replace(" ", "_")
+                        .replace("__", "_")
                 base.evaluate()
                 runExecutionQueue()
                 handleReport(album.check())
@@ -213,9 +214,7 @@
     private fun handleReport(report: SkiaTestAlbum.Report) {
         report.screenshots.forEach { (_, sReport) ->
             when (sReport.result) {
-                ScreenshotResultProto.Status.PASSED -> {
-                }
-
+                ScreenshotResultProto.Status.PASSED -> {}
                 ScreenshotResultProto.Status.MISSING_GOLDEN ->
                     throw AssertionError(
                         "Missing golden image " +
diff --git a/compose/ui/ui-test-junit4/src/desktopTest/kotlin/androidx/compose/ui/test/junit4/CustomEffectContextRuleTest.kt b/compose/ui/ui-test-junit4/src/desktopTest/kotlin/androidx/compose/ui/test/junit4/CustomEffectContextRuleTest.kt
index 2cd16fc..735f031 100644
--- a/compose/ui/ui-test-junit4/src/desktopTest/kotlin/androidx/compose/ui/test/junit4/CustomEffectContextRuleTest.kt
+++ b/compose/ui/ui-test-junit4/src/desktopTest/kotlin/androidx/compose/ui/test/junit4/CustomEffectContextRuleTest.kt
@@ -31,8 +31,8 @@
 import org.junit.runners.model.Statement
 
 /**
- * Tests for passing a custom CoroutineContext to one of [ComposeTestRule]s.
- * Similar tests are available for [runComposeUiTest] in compose:ui:ui-test
+ * Tests for passing a custom CoroutineContext to one of [ComposeTestRule]s. Similar tests are
+ * available for [runComposeUiTest] in compose:ui:ui-test
  */
 @RunWith(JUnit4::class)
 @OptIn(ExperimentalTestApi::class)
@@ -45,35 +45,34 @@
      * [ComposeTestRule].
      */
     @get:Rule
-    val testWatcher = object : TestWatcher() {
-        override fun starting(description: Description) {
-            testDescription = description
+    val testWatcher =
+        object : TestWatcher() {
+            override fun starting(description: Description) {
+                testDescription = description
+            }
         }
-    }
 
     @Test
     fun effectContextPropagatedToComposition_createComposeRule() {
         val testElement = TestCoroutineContextElement()
         lateinit var compositionScope: CoroutineScope
         val rule = createComposeRule(testElement)
-        val baseStatement = object : Statement() {
-            override fun evaluate() {
-                rule.setContent {
-                    compositionScope = rememberCoroutineScope()
+        val baseStatement =
+            object : Statement() {
+                override fun evaluate() {
+                    rule.setContent { compositionScope = rememberCoroutineScope() }
+                    rule.waitForIdle()
                 }
-                rule.waitForIdle()
             }
-        }
-        rule.apply(baseStatement, testDescription)
-            .evaluate()
+        rule.apply(baseStatement, testDescription).evaluate()
 
-        val elementFromComposition =
-            compositionScope.coroutineContext[TestCoroutineContextElement]
+        val elementFromComposition = compositionScope.coroutineContext[TestCoroutineContextElement]
         assertThat(elementFromComposition).isSameInstanceAs(testElement)
     }
 
     private class TestCoroutineContextElement : CoroutineContext.Element {
-        override val key: CoroutineContext.Key<*> get() = Key
+        override val key: CoroutineContext.Key<*>
+            get() = Key
 
         companion object Key : CoroutineContext.Key<TestCoroutineContextElement>
     }
diff --git a/compose/ui/ui-test-junit4/src/jvmMain/kotlin/androidx/compose/ui/test/junit4/ComposeTestRule.jvm.kt b/compose/ui/ui-test-junit4/src/jvmMain/kotlin/androidx/compose/ui/test/junit4/ComposeTestRule.jvm.kt
index 14c64be..921da47 100644
--- a/compose/ui/ui-test-junit4/src/jvmMain/kotlin/androidx/compose/ui/test/junit4/ComposeTestRule.jvm.kt
+++ b/compose/ui/ui-test-junit4/src/jvmMain/kotlin/androidx/compose/ui/test/junit4/ComposeTestRule.jvm.kt
@@ -28,40 +28,34 @@
 import org.junit.rules.TestRule
 
 /**
- * A [TestRule] that allows you to test and control composables and applications using Compose.
- * Most of the functionality in this interface provides some form of test synchronization: the
- * test will block until the app or composable is idle, to ensure the tests are deterministic.
+ * A [TestRule] that allows you to test and control composables and applications using Compose. Most
+ * of the functionality in this interface provides some form of test synchronization: the test will
+ * block until the app or composable is idle, to ensure the tests are deterministic.
  *
- * For example, if you would perform a click on the center of the screen while a button is
- * animation from left to right over the screen, without synchronization the test would sometimes
- * click when the button is in the middle of the screen (button is clicked), and sometimes when
- * the button is past the middle of the screen (button is not clicked). With synchronization, the
- * app would not be idle until the animation is over, so the test will always click when the
- * button is past the middle of the screen (and not click it). If you actually do want to click
- * the button when it's in the middle of the animation, you can do so by controlling the
- * [clock][mainClock]. You'll have to disable [automatic advancing][MainTestClock.autoAdvance],
- * and manually advance the clock by the time necessary to position the button in the middle of
- * the screen.
+ * For example, if you would perform a click on the center of the screen while a button is animation
+ * from left to right over the screen, without synchronization the test would sometimes click when
+ * the button is in the middle of the screen (button is clicked), and sometimes when the button is
+ * past the middle of the screen (button is not clicked). With synchronization, the app would not be
+ * idle until the animation is over, so the test will always click when the button is past the
+ * middle of the screen (and not click it). If you actually do want to click the button when it's in
+ * the middle of the animation, you can do so by controlling the [clock][mainClock]. You'll have to
+ * disable [automatic advancing][MainTestClock.autoAdvance], and manually advance the clock by the
+ * time necessary to position the button in the middle of the screen.
  *
- * An instance of [ComposeTestRule] can be created with [createComposeRule], which will also
- * create a host for the compose content for you (see [ComposeContentTestRule]). If you need to
- * specify which particular Activity is started on Android, you can use [createAndroidComposeRule].
+ * An instance of [ComposeTestRule] can be created with [createComposeRule], which will also create
+ * a host for the compose content for you (see [ComposeContentTestRule]). If you need to specify
+ * which particular Activity is started on Android, you can use [createAndroidComposeRule].
  *
- * If you don't want any Activity to be started automatically by the test rule on Android, you
- * can use [createEmptyComposeRule]. In such a case, you will have to set content using one of
- * Compose UI's setters (like [ComponentActivity.setContent][androidx.compose.ui.platform
- * .setContent]).
+ * If you don't want any Activity to be started automatically by the test rule on Android, you can
+ * use [createEmptyComposeRule]. In such a case, you will have to set content using one of Compose
+ * UI's setters (like [ComponentActivity.setContent][androidx.compose.ui.platform .setContent]).
  */
 @JvmDefaultWithCompatibility
 interface ComposeTestRule : TestRule, SemanticsNodeInteractionsProvider {
-    /**
-     * Current device screen's density.
-     */
+    /** Current device screen's density. */
     val density: Density
 
-    /**
-     * Clock that drives frames and recompositions in compose tests.
-     */
+    /** Clock that drives frames and recompositions in compose tests. */
     val mainClock: MainTestClock
 
     /**
@@ -72,9 +66,8 @@
     fun <T> runOnUiThread(action: () -> T): T
 
     /**
-     * Executes the given action in the same way as [runOnUiThread] but also makes sure Compose
-     * is idle before executing it. This is great place for doing your assertions on shared
-     * variables.
+     * Executes the given action in the same way as [runOnUiThread] but also makes sure Compose is
+     * idle before executing it. This is great place for doing your assertions on shared variables.
      *
      * This method is blocking until the action is complete.
      *
@@ -93,8 +86,8 @@
      * advancing the clock until it is idle (meaning there are no recompositions, animations, etc.
      * pending). If not, this will wait only for other idling resources.
      *
-     * Can crash in case there is a time out. This is not supposed to be handled as it
-     * surfaces only in incorrect tests.
+     * Can crash in case there is a time out. This is not supposed to be handled as it surfaces only
+     * in incorrect tests.
      */
     fun waitForIdle()
 
@@ -113,22 +106,20 @@
      *
      * In case the main clock auto advancement is enabled (by default is), this will also keep
      * advancing the clock on a frame by frame basis and yield for other async work at the end of
-     * each frame. If the advancement of the main clock is not enabled this will work as a
-     * countdown latch without any other advancements.
+     * each frame. If the advancement of the main clock is not enabled this will work as a countdown
+     * latch without any other advancements.
      *
-     * There is also [MainTestClock.advanceTimeUntil] which is faster as it does not yield back
-     * the UI thread.
+     * There is also [MainTestClock.advanceTimeUntil] which is faster as it does not yield back the
+     * UI thread.
      *
-     * This method should be used in cases where [MainTestClock.advanceTimeUntil]
-     * is not enough.
+     * This method should be used in cases where [MainTestClock.advanceTimeUntil] is not enough.
      *
      * @param timeoutMillis The time after which this method throws an exception if the given
-     * condition is not satisfied. This is the wall clock time not the main clock one.
+     *   condition is not satisfied. This is the wall clock time not the main clock one.
      * @param condition Condition that must be satisfied in order for this method to successfully
-     * finish.
-     *
+     *   finish.
      * @throws androidx.compose.ui.test.ComposeTimeoutException If the condition is not satisfied
-     * after [timeoutMillis].
+     *   after [timeoutMillis].
      */
     fun waitUntil(timeoutMillis: Long = 1_000, condition: () -> Boolean)
 
@@ -137,24 +128,22 @@
      *
      * In case the main clock auto advancement is enabled (by default is), this will also keep
      * advancing the clock on a frame by frame basis and yield for other async work at the end of
-     * each frame. If the advancement of the main clock is not enabled this will work as a
-     * countdown latch without any other advancements.
+     * each frame. If the advancement of the main clock is not enabled this will work as a countdown
+     * latch without any other advancements.
      *
-     * There is also [MainTestClock.advanceTimeUntil] which is faster as it does not yield back
-     * the UI thread.
+     * There is also [MainTestClock.advanceTimeUntil] which is faster as it does not yield back the
+     * UI thread.
      *
-     * This method should be used in cases where [MainTestClock.advanceTimeUntil]
-     * is not enough.
+     * This method should be used in cases where [MainTestClock.advanceTimeUntil] is not enough.
      *
      * @param timeoutMillis The time after which this method throws an exception if the given
-     * condition is not satisfied. This is the wall clock time not the main clock one.
+     *   condition is not satisfied. This is the wall clock time not the main clock one.
      * @param conditionDescription A human-readable description of [condition] that will be included
-     * in the timeout exception if thrown.
+     *   in the timeout exception if thrown.
      * @param condition Condition that must be satisfied in order for this method to successfully
-     * finish.
-     *
+     *   finish.
      * @throws androidx.compose.ui.test.ComposeTimeoutException If the condition is not satisfied
-     * after [timeoutMillis].
+     *   after [timeoutMillis].
      */
     fun waitUntil(
         conditionDescription: String,
@@ -167,15 +156,14 @@
     /**
      * Blocks until the number of nodes matching the given [matcher] is equal to the given [count].
      *
-     * @see ComposeTestRule.waitUntil
-     *
      * @param matcher The matcher that will be used to filter nodes.
      * @param count The number of nodes that are expected to
      * @param timeoutMillis The time after which this method throws an exception if the number of
-     * nodes that match the [matcher] is not [count]. This observes wall clock time, not frame time.
-     *
+     *   nodes that match the [matcher] is not [count]. This observes wall clock time, not frame
+     *   time.
      * @throws androidx.compose.ui.test.ComposeTimeoutException If the number of nodes that match
-     * the [matcher] is not [count] after [timeoutMillis] (in wall clock time).
+     *   the [matcher] is not [count] after [timeoutMillis] (in wall clock time).
+     * @see ComposeTestRule.waitUntil
      */
     @ExperimentalTestApi
     fun waitUntilNodeCount(matcher: SemanticsMatcher, count: Int, timeoutMillis: Long = 1_000L)
@@ -183,14 +171,12 @@
     /**
      * Blocks until at least one node matches the given [matcher].
      *
-     * @see ComposeTestRule.waitUntil
-     *
      * @param matcher The matcher that will be used to filter nodes.
      * @param timeoutMillis The time after which this method throws an exception if no nodes match
-     * the given [matcher]. This observes wall clock time, not frame time.
-     *
+     *   the given [matcher]. This observes wall clock time, not frame time.
      * @throws androidx.compose.ui.test.ComposeTimeoutException If no nodes match the given
-     * [matcher] after [timeoutMillis] (in wall clock time).
+     *   [matcher] after [timeoutMillis] (in wall clock time).
+     * @see ComposeTestRule.waitUntil
      */
     @ExperimentalTestApi
     fun waitUntilAtLeastOneExists(matcher: SemanticsMatcher, timeoutMillis: Long = 1_000L)
@@ -198,14 +184,12 @@
     /**
      * Blocks until exactly one node matches the given [matcher].
      *
-     * @see ComposeTestRule.waitUntil
-     *
      * @param matcher The matcher that will be used to filter nodes.
      * @param timeoutMillis The time after which this method throws an exception if exactly one node
-     * does not match the given [matcher]. This observes wall clock time, not frame time.
-     *
+     *   does not match the given [matcher]. This observes wall clock time, not frame time.
      * @throws androidx.compose.ui.test.ComposeTimeoutException If exactly one node does not match
-     * the given [matcher] after [timeoutMillis] (in wall clock time).
+     *   the given [matcher] after [timeoutMillis] (in wall clock time).
+     * @see ComposeTestRule.waitUntil
      */
     @ExperimentalTestApi
     fun waitUntilExactlyOneExists(matcher: SemanticsMatcher, timeoutMillis: Long = 1_000L)
@@ -213,26 +197,20 @@
     /**
      * Blocks until no nodes match the given [matcher].
      *
-     * @see ComposeTestRule.waitUntil
-     *
      * @param matcher The matcher that will be used to filter nodes.
      * @param timeoutMillis The time after which this method throws an exception if any nodes match
-     * the given [matcher]. This observes wall clock time, not frame time.
-     *
+     *   the given [matcher]. This observes wall clock time, not frame time.
      * @throws androidx.compose.ui.test.ComposeTimeoutException If any nodes match the given
-     * [matcher] after [timeoutMillis] (in wall clock time).
+     *   [matcher] after [timeoutMillis] (in wall clock time).
+     * @see ComposeTestRule.waitUntil
      */
     @ExperimentalTestApi
     fun waitUntilDoesNotExist(matcher: SemanticsMatcher, timeoutMillis: Long = 1_000L)
 
-    /**
-     * Registers an [IdlingResource] in this test.
-     */
+    /** Registers an [IdlingResource] in this test. */
     fun registerIdlingResource(idlingResource: IdlingResource)
 
-    /**
-     * Unregisters an [IdlingResource] from this test.
-     */
+    /** Unregisters an [IdlingResource] from this test. */
     fun unregisterIdlingResource(idlingResource: IdlingResource)
 }
 
@@ -243,10 +221,10 @@
  * An instance of [ComposeContentTestRule] can be created with [createComposeRule]. If you need to
  * specify which particular Activity is started on Android, you can use [createAndroidComposeRule].
  *
- * If you don't want any host to be started automatically by the test rule on Android, you
- * can use [createEmptyComposeRule]. In such a case, you will have to create a host in your test
- * and set the content using one of Compose UI's setters (like [ComponentActivity
- * .setContent][androidx.activity.compose.setContent]).
+ * If you don't want any host to be started automatically by the test rule on Android, you can use
+ * [createEmptyComposeRule]. In such a case, you will have to create a host in your test and set the
+ * content using one of Compose UI's setters (like
+ * [ComponentActivity .setContent][androidx.activity.compose.setContent]).
  */
 @JvmDefaultWithCompatibility
 interface ComposeContentTestRule : ComposeTestRule {
@@ -290,7 +268,7 @@
  * launched, see [createAndroidComposeRule].
  *
  * @param effectContext The [CoroutineContext] used to run the composition. The context for
- * `LaunchedEffect`s and `rememberCoroutineScope` will be derived from this context.
+ *   `LaunchedEffect`s and `rememberCoroutineScope` will be derived from this context.
  */
 @ExperimentalTestApi
 expect fun createComposeRule(
diff --git a/compose/ui/ui-test-manifest-lint/src/main/java/androidx/compose/ui/test/manifest/lint/GradleDebugConfigurationDetector.kt b/compose/ui/ui-test-manifest-lint/src/main/java/androidx/compose/ui/test/manifest/lint/GradleDebugConfigurationDetector.kt
index 2a56a77..88025d4 100644
--- a/compose/ui/ui-test-manifest-lint/src/main/java/androidx/compose/ui/test/manifest/lint/GradleDebugConfigurationDetector.kt
+++ b/compose/ui/ui-test-manifest-lint/src/main/java/androidx/compose/ui/test/manifest/lint/GradleDebugConfigurationDetector.kt
@@ -28,39 +28,44 @@
 
 @Suppress("UnstableApiUsage")
 class GradleDebugConfigurationDetector : Detector(), GradleScanner {
-    private val supportedConfigurations = setOf(
-        "implementation",
-        "api",
-        "compileOnly",
-        "runtimeOnly",
-        "annotationProcessor",
-        "lintChecks",
-        "lintPublish",
-    ).map { it.lowercase() }
+    private val supportedConfigurations =
+        setOf(
+                "implementation",
+                "api",
+                "compileOnly",
+                "runtimeOnly",
+                "annotationProcessor",
+                "lintChecks",
+                "lintPublish",
+            )
+            .map { it.lowercase() }
 
-    private val blockPrefixes = setOf(
-        "android",
-        "test"
-    )
+    private val blockPrefixes = setOf("android", "test")
 
     private val TargetConfigutation = "debugImplementation".lowercase()
 
     companion object {
-        val ISSUE = Issue.create(
-            id = "TestManifestGradleConfiguration",
-            briefDescription = "The ui-test-manifest library should be included using the " +
-                "debugImplementation configuration.",
-            explanation = "The androidx.compose.ui:ui-test-manifest dependency is needed for " +
-                "launching a Compose host, such as with createComposeRule. " +
-                "However, it only needs to be present in testing configurations " +
-                "therefore use this dependency with the debugImplementation configuration",
-            category = Category.CORRECTNESS,
-            severity = Severity.WARNING,
-            implementation = Implementation(
-                GradleDebugConfigurationDetector::class.java, Scope.GRADLE_SCOPE
-            ),
-            androidSpecific = true
-        ).addMoreInfo("https://developer.android.com/jetpack/compose/testing#setup")
+        val ISSUE =
+            Issue.create(
+                    id = "TestManifestGradleConfiguration",
+                    briefDescription =
+                        "The ui-test-manifest library should be included using the " +
+                            "debugImplementation configuration.",
+                    explanation =
+                        "The androidx.compose.ui:ui-test-manifest dependency is needed for " +
+                            "launching a Compose host, such as with createComposeRule. " +
+                            "However, it only needs to be present in testing configurations " +
+                            "therefore use this dependency with the debugImplementation configuration",
+                    category = Category.CORRECTNESS,
+                    severity = Severity.WARNING,
+                    implementation =
+                        Implementation(
+                            GradleDebugConfigurationDetector::class.java,
+                            Scope.GRADLE_SCOPE
+                        ),
+                    androidSpecific = true
+                )
+                .addMoreInfo("https://developer.android.com/jetpack/compose/testing#setup")
     }
 
     override fun checkDslPropertyAssignment(
@@ -86,30 +91,25 @@
         if (cleanedProperty.contains(TargetConfigutation)) return
 
         // 3) Only throw the error if we start with the blocked configs
-        if (blockPrefixes.any { cleanedProperty.startsWith(it) } || supportedConfigurations.any {
-                cleanedProperty.startsWith(
-                    it
-                )
-            }) {
-            val incident = Incident(context)
+        if (
+            blockPrefixes.any { cleanedProperty.startsWith(it) } ||
+                supportedConfigurations.any { cleanedProperty.startsWith(it) }
+        ) {
+            val incident =
+                Incident(context)
                     .issue(ISSUE)
                     .location(context.getLocation(statementCookie))
                     .message("Please use debugImplementation.")
-                    .fix(
-                        fix().replace()
-                            .text(property)
-                            .with("debugImplementation")
-                            .build()
-                    )
+                    .fix(fix().replace().text(property).with("debugImplementation").build())
             context.report(incident)
         }
     }
 
     private fun getStringLiteralValue(value: String): String {
-        if (value.length > 2 && (
-                value.startsWith("'") && value.endsWith("'") ||
-                    value.startsWith("\"") && value.endsWith("\"")
-                )
+        if (
+            value.length > 2 &&
+                (value.startsWith("'") && value.endsWith("'") ||
+                    value.startsWith("\"") && value.endsWith("\""))
         ) {
             return value.substring(1, value.length - 1)
         }
diff --git a/compose/ui/ui-test-manifest-lint/src/main/java/androidx/compose/ui/test/manifest/lint/TestManifestIssueRegistry.kt b/compose/ui/ui-test-manifest-lint/src/main/java/androidx/compose/ui/test/manifest/lint/TestManifestIssueRegistry.kt
index 4baeef0..638143d 100644
--- a/compose/ui/ui-test-manifest-lint/src/main/java/androidx/compose/ui/test/manifest/lint/TestManifestIssueRegistry.kt
+++ b/compose/ui/ui-test-manifest-lint/src/main/java/androidx/compose/ui/test/manifest/lint/TestManifestIssueRegistry.kt
@@ -23,10 +23,13 @@
 class TestManifestIssueRegistry : IssueRegistry() {
     override val api = 14
     override val minApi = CURRENT_API
-    override val issues get() = listOf(GradleDebugConfigurationDetector.ISSUE)
-    override val vendor = Vendor(
-        feedbackUrl = "https://issuetracker.google.com/issues/new?component=741505",
-        identifier = "androidx.compose.ui.test.manifest",
-        vendorName = "Android Open Source Project",
-    )
+    override val issues
+        get() = listOf(GradleDebugConfigurationDetector.ISSUE)
+
+    override val vendor =
+        Vendor(
+            feedbackUrl = "https://issuetracker.google.com/issues/new?component=741505",
+            identifier = "androidx.compose.ui.test.manifest",
+            vendorName = "Android Open Source Project",
+        )
 }
diff --git a/compose/ui/ui-test-manifest-lint/src/test/java/androix/compose/ui/test/manifest/lint/GradleDebugConfigurationDetectorTest.kt b/compose/ui/ui-test-manifest-lint/src/test/java/androix/compose/ui/test/manifest/lint/GradleDebugConfigurationDetectorTest.kt
index 1aa3977..5738bfc 100644
--- a/compose/ui/ui-test-manifest-lint/src/test/java/androix/compose/ui/test/manifest/lint/GradleDebugConfigurationDetectorTest.kt
+++ b/compose/ui/ui-test-manifest-lint/src/test/java/androix/compose/ui/test/manifest/lint/GradleDebugConfigurationDetectorTest.kt
@@ -36,9 +36,11 @@
 
     @Test
     fun kotlin_manifestDependencyInBlockedConfigs_shouldRaiseIssue() {
-            lint().files(
-                gradle("build.gradle",
-                    """
+        lint()
+            .files(
+                gradle(
+                        "build.gradle",
+                        """
                     dependencies {
                         implementation("androidx.compose.ui:ui-test-manifest:1.2.0-beta02")
                         api("androidx.compose.ui:ui-test-manifest:1.2.0-beta02")
@@ -48,11 +50,13 @@
                         lintChecks("androidx.compose.ui:ui-test-manifest:1.2.0-beta02")
                         lintPublish("androidx.compose.ui:ui-test-manifest:1.2.0-beta02")
                     }
-                """).indented()
+                """
+                    )
+                    .indented()
             )
-                .run()
-                .expect(
-                    """
+            .run()
+            .expect(
+                """
                 build.gradle:2: Warning: Please use debugImplementation. [TestManifestGradleConfiguration]
                     implementation("androidx.compose.ui:ui-test-manifest:1.2.0-beta02")
                     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
@@ -75,15 +79,18 @@
                     lintPublish("androidx.compose.ui:ui-test-manifest:1.2.0-beta02")
                     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
                 0 errors, 7 warnings
-                """.trimIndent()
-                )
+                """
+                    .trimIndent()
+            )
     }
 
     @Test
     fun groovy_manifestDependencyInBlockedConfigs_shouldRaiseIssue() {
-        lint().files(
-            gradle("build.gradle",
-                """
+        lint()
+            .files(
+                gradle(
+                        "build.gradle",
+                        """
                     dependencies {
                         implementation 'androidx.compose.ui:ui-test-manifest:1.2.0-beta02'
                         api 'androidx.compose.ui:ui-test-manifest:1.2.0-beta02'
@@ -93,8 +100,10 @@
                         lintChecks 'androidx.compose.ui:ui-test-manifest:1.2.0-beta02'
                         lintPublish 'androidx.compose.ui:ui-test-manifest:1.2.0-beta02'
                     }
-                """).indented()
-        )
+                """
+                    )
+                    .indented()
+            )
             .run()
             .expect(
                 """
@@ -120,83 +129,104 @@
                     lintPublish 'androidx.compose.ui:ui-test-manifest:1.2.0-beta02'
                     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
                 0 errors, 7 warnings
-                """.trimIndent()
+                """
+                    .trimIndent()
             )
     }
 
     @Test
     fun kotlin_manifestDependencyInCustomConfig_shouldNotRaiseIssue() {
-        lint().files(
-            gradle("build.gradle",
-                """
+        lint()
+            .files(
+                gradle(
+                        "build.gradle",
+                        """
                     dependencies {
                         customImplementation("androidx.compose.ui:ui-test-manifest:1.2.0-beta02")
                         anotherConfig("androidx.compose.ui:ui-test-manifest:1.2.0-beta02")
                         customApi("androidx.compose.ui:ui-test-manifest:1.2.0-beta02")
                     }
-                """).indented()
-        )
+                """
+                    )
+                    .indented()
+            )
             .run()
             .expectClean()
     }
 
     @Test
     fun groovy_manifestDependencyInCustomConfig_shouldNotRaiseIssue() {
-        lint().files(
-            gradle("build.gradle",
-                """
+        lint()
+            .files(
+                gradle(
+                        "build.gradle",
+                        """
                     dependencies {
                         customImplementation 'androidx.compose.ui:ui-test-manifest:1.2.0-beta02'
                         anotherConfig 'androidx.compose.ui:ui-test-manifest:1.2.0-beta02'
                         customApi 'androidx.compose.ui:ui-test-manifest:1.2.0-beta02'
                     }
-                """).indented()
-        )
+                """
+                    )
+                    .indented()
+            )
             .run()
             .expectClean()
     }
 
     @Test
     fun kotlin_manifestDependencyInDebugImplementation_shouldNotRaiseIssue() {
-        lint().files(
-            gradle("build.gradle",
-                """
+        lint()
+            .files(
+                gradle(
+                        "build.gradle",
+                        """
                     dependencies {
                         debugImplementation("androidx.compose.ui:ui-test-manifest:1.2.0-beta02")
                         debugFlavorImplementation("androidx.compose.ui:ui-test-manifest:1.2.0-beta02")
                     }
-                """).indented()
-        )
+                """
+                    )
+                    .indented()
+            )
             .run()
             .expectClean()
     }
 
     @Test
     fun groovy_manifestDependencyInDebugImplementation_shouldNotRaiseIssue() {
-        lint().files(
-            gradle("build.gradle",
-                """
+        lint()
+            .files(
+                gradle(
+                        "build.gradle",
+                        """
                     dependencies {
                         debugImplementation 'androidx.compose.ui:ui-test-manifest:1.2.0-beta02'
                         debugFlavorImplementation 'androidx.compose.ui:ui-test-manifest:1.2.0-beta02'
                     }
-                """).indented()
-        )
+                """
+                    )
+                    .indented()
+            )
             .run()
             .expectClean()
     }
 
     @Test
     fun manifestDependencyInAndroidTestImplementation_shouldRaiseIssue() {
-        lint().files(
-            gradle("build.gradle",
-                """
+        lint()
+            .files(
+                gradle(
+                        "build.gradle",
+                        """
                     dependencies {
                         androidTestImplementation("androidx.compose.ui:ui-test-manifest:1.2.0-beta02")
                         androidFlavorTestImplementation("androidx.compose.ui:ui-test-manifest:1.2.0-beta02")
                     }
-                """).indented()
-        )
+                """
+                    )
+                    .indented()
+            )
             .run()
             .expect(
                 """
@@ -207,21 +237,26 @@
                     androidFlavorTestImplementation("androidx.compose.ui:ui-test-manifest:1.2.0-beta02")
                     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
                 0 errors, 2 warnings
-                """.trimIndent()
+                """
+                    .trimIndent()
             )
     }
 
     @Test
     fun manifestDependencyInTestImplementation_shouldRaiseIssue() {
-        lint().files(
-            gradle("build.gradle",
-                """
+        lint()
+            .files(
+                gradle(
+                        "build.gradle",
+                        """
                     dependencies {
                         testImplementation("androidx.compose.ui:ui-test-manifest:1.2.0-beta02")
                         testFlavorImplementation("androidx.compose.ui:ui-test-manifest:1.2.0-beta02")
                     }
-                """).indented()
-        )
+                """
+                    )
+                    .indented()
+            )
             .run()
             .expect(
                 """
@@ -232,7 +267,8 @@
                     testFlavorImplementation("androidx.compose.ui:ui-test-manifest:1.2.0-beta02")
                     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
                 0 errors, 2 warnings
-                """.trimIndent()
+                """
+                    .trimIndent()
             )
     }
 }
diff --git a/compose/ui/ui-test-manifest/integration-tests/testapp/src/androidTest/java/androidx/compose/ui/test/manifest/integration/testapp/ComponentActivityLaunchesTest.kt b/compose/ui/ui-test-manifest/integration-tests/testapp/src/androidTest/java/androidx/compose/ui/test/manifest/integration/testapp/ComponentActivityLaunchesTest.kt
index a88b849..6895df0 100644
--- a/compose/ui/ui-test-manifest/integration-tests/testapp/src/androidTest/java/androidx/compose/ui/test/manifest/integration/testapp/ComponentActivityLaunchesTest.kt
+++ b/compose/ui/ui-test-manifest/integration-tests/testapp/src/androidTest/java/androidx/compose/ui/test/manifest/integration/testapp/ComponentActivityLaunchesTest.kt
@@ -26,8 +26,7 @@
 @LargeTest
 @RunWith(AndroidJUnit4::class)
 class ComponentActivityLaunchesTest {
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
     @Test
     fun test() {
diff --git a/compose/ui/ui-test/samples/src/main/java/androidx/compose/ui/test/samples/DeviceConfigurationOverrideSamples.kt b/compose/ui/ui-test/samples/src/main/java/androidx/compose/ui/test/samples/DeviceConfigurationOverrideSamples.kt
index 1ed3450..e616254 100644
--- a/compose/ui/ui-test/samples/src/main/java/androidx/compose/ui/test/samples/DeviceConfigurationOverrideSamples.kt
+++ b/compose/ui/ui-test/samples/src/main/java/androidx/compose/ui/test/samples/DeviceConfigurationOverrideSamples.kt
@@ -49,9 +49,7 @@
 @Sampled
 @Composable
 fun DeviceConfigurationOverrideFontScaleSample() {
-    DeviceConfigurationOverride(
-        DeviceConfigurationOverride.FontScale(1.5f)
-    ) {
+    DeviceConfigurationOverride(DeviceConfigurationOverride.FontScale(1.5f)) {
         MyScreen() // will be rendered with a larger than default font scale
     }
 }
@@ -59,9 +57,7 @@
 @Sampled
 @Composable
 fun DeviceConfigurationOverrideForcedSizeSample() {
-    DeviceConfigurationOverride(
-        DeviceConfigurationOverride.ForcedSize(DpSize(1280.dp, 800.dp))
-    ) {
+    DeviceConfigurationOverride(DeviceConfigurationOverride.ForcedSize(DpSize(1280.dp, 800.dp))) {
         MyScreen() // will be rendered in the space for 1280dp by 800dp without clipping
     }
 }
@@ -69,9 +65,7 @@
 @Sampled
 @Composable
 fun DeviceConfigurationOverrideLayoutDirectionSample() {
-    DeviceConfigurationOverride(
-        DeviceConfigurationOverride.LayoutDirection(LayoutDirection.Rtl)
-    ) {
+    DeviceConfigurationOverride(DeviceConfigurationOverride.LayoutDirection(LayoutDirection.Rtl)) {
         MyComponent() // will be rendered with a right-to-left layout direction
     }
 }
@@ -79,9 +73,7 @@
 @Sampled
 @Composable
 fun DeviceConfigurationOverrideLocalesSample() {
-    DeviceConfigurationOverride(
-        DeviceConfigurationOverride.Locales(LocaleList("es-ES"))
-    ) {
+    DeviceConfigurationOverride(DeviceConfigurationOverride.Locales(LocaleList("es-ES"))) {
         MyScreen() // will be rendered with overridden locale
     }
 }
@@ -89,9 +81,7 @@
 @Sampled
 @Composable
 fun DeviceConfigurationOverrideDarkModeSample() {
-    DeviceConfigurationOverride(
-        DeviceConfigurationOverride.DarkMode(true)
-    ) {
+    DeviceConfigurationOverride(DeviceConfigurationOverride.DarkMode(true)) {
         isSystemInDarkTheme() // will be true
     }
 }
@@ -99,9 +89,7 @@
 @Sampled
 @Composable
 fun DeviceConfigurationOverrideFontWeightAdjustmentSample() {
-    DeviceConfigurationOverride(
-        DeviceConfigurationOverride.FontWeightAdjustment(200)
-    ) {
+    DeviceConfigurationOverride(DeviceConfigurationOverride.FontWeightAdjustment(200)) {
         MyComponent() // will be rendered with adjusted font weight
     }
 }
@@ -110,15 +98,11 @@
 @Sampled
 @Composable
 fun DeviceConfigurationOverrideRoundScreenSample() {
-    DeviceConfigurationOverride(
-        DeviceConfigurationOverride.RoundScreen(true)
-    ) {
+    DeviceConfigurationOverride(DeviceConfigurationOverride.RoundScreen(true)) {
         LocalConfiguration.current.isScreenRound // will be true
     }
 }
 
-@Composable
-private fun MyScreen() = Unit
+@Composable private fun MyScreen() = Unit
 
-@Composable
-private fun MyComponent() = Unit
+@Composable private fun MyComponent() = Unit
diff --git a/compose/ui/ui-test/samples/src/main/java/androidx/compose/ui/test/samples/GestureScopeSamples.kt b/compose/ui/ui-test/samples/src/main/java/androidx/compose/ui/test/samples/GestureScopeSamples.kt
index d9207b1..d27e5b7 100644
--- a/compose/ui/ui-test/samples/src/main/java/androidx/compose/ui/test/samples/GestureScopeSamples.kt
+++ b/compose/ui/ui-test/samples/src/main/java/androidx/compose/ui/test/samples/GestureScopeSamples.kt
@@ -32,33 +32,30 @@
 @Suppress("DEPRECATION")
 @Sampled
 fun gestureClick() {
-    composeTestRule.onNodeWithTag("myComponent")
-        .performGesture { click() }
+    composeTestRule.onNodeWithTag("myComponent").performGesture { click() }
 }
 
 @Suppress("DEPRECATION")
 @Sampled
 fun gestureSwipeUp() {
-    composeTestRule.onNodeWithTag("myComponent")
-        .performGesture { swipeUp() }
+    composeTestRule.onNodeWithTag("myComponent").performGesture { swipeUp() }
 }
 
 @Suppress("DEPRECATION")
 @Sampled
 fun gestureLShape() {
-    composeTestRule.onNodeWithTag("myComponent")
-        .performGesture {
-            down(topLeft)
-            moveTo(topLeft + percentOffset(0f, .1f))
-            moveTo(topLeft + percentOffset(0f, .2f))
-            moveTo(topLeft + percentOffset(0f, .3f))
-            moveTo(topLeft + percentOffset(0f, .4f))
-            moveTo(centerLeft)
-            moveTo(centerLeft + percentOffset(.1f, 0f))
-            moveTo(centerLeft + percentOffset(.2f, 0f))
-            moveTo(centerLeft + percentOffset(.3f, 0f))
-            moveTo(centerLeft + percentOffset(.4f, 0f))
-            moveTo(center)
-            up()
-        }
+    composeTestRule.onNodeWithTag("myComponent").performGesture {
+        down(topLeft)
+        moveTo(topLeft + percentOffset(0f, .1f))
+        moveTo(topLeft + percentOffset(0f, .2f))
+        moveTo(topLeft + percentOffset(0f, .3f))
+        moveTo(topLeft + percentOffset(0f, .4f))
+        moveTo(centerLeft)
+        moveTo(centerLeft + percentOffset(.1f, 0f))
+        moveTo(centerLeft + percentOffset(.2f, 0f))
+        moveTo(centerLeft + percentOffset(.3f, 0f))
+        moveTo(centerLeft + percentOffset(.4f, 0f))
+        moveTo(center)
+        up()
+    }
 }
diff --git a/compose/ui/ui-test/samples/src/main/java/androidx/compose/ui/test/samples/MouseInjectionScopeSamples.kt b/compose/ui/ui-test/samples/src/main/java/androidx/compose/ui/test/samples/MouseInjectionScopeSamples.kt
index f162158..77c098b 100644
--- a/compose/ui/ui-test/samples/src/main/java/androidx/compose/ui/test/samples/MouseInjectionScopeSamples.kt
+++ b/compose/ui/ui-test/samples/src/main/java/androidx/compose/ui/test/samples/MouseInjectionScopeSamples.kt
@@ -33,49 +33,47 @@
 @OptIn(ExperimentalTestApi::class)
 @Sampled
 fun mouseInputClick() {
-    composeTestRule.onNodeWithTag("myComponent")
-        .performMouseInput {
-            // Click in the middle of the node
-            click(center)
-        }
+    composeTestRule.onNodeWithTag("myComponent").performMouseInput {
+        // Click in the middle of the node
+        click(center)
+    }
 }
 
 @OptIn(ExperimentalTestApi::class)
 @Sampled
 fun mouseInputAnimateTo() {
-    composeTestRule.onNodeWithTag("myComponent")
-        .performMouseInput {
-            // Hover over the node, making an X shape
-            moveTo(topLeft)
-            animateTo(bottomRight)
-            // Note that an actual user wouldn't be able to instantly
-            // move from the bottom right to the top right
-            moveTo(topRight)
-            animateTo(bottomLeft)
-        }
+    composeTestRule.onNodeWithTag("myComponent").performMouseInput {
+        // Hover over the node, making an X shape
+        moveTo(topLeft)
+        animateTo(bottomRight)
+        // Note that an actual user wouldn't be able to instantly
+        // move from the bottom right to the top right
+        moveTo(topRight)
+        animateTo(bottomLeft)
+    }
 }
 
 @OptIn(ExperimentalTestApi::class)
 @Sampled
 fun mouseInputAnimateAlong() {
-    composeTestRule.onNodeWithTag("myComponent")
-        .performMouseInput {
-            // Hover over the node, making a full circle with a radius of 100px
-            val r = 100f
-            animateAlong(
-                curve = {
-                    val angle = 2 * PI * it / 1000
-                    center + Offset(r * cos(angle).toFloat(), r * sin(angle).toFloat())
-                },
-                durationMillis = 1000L
-            )
-        }
+    composeTestRule.onNodeWithTag("myComponent").performMouseInput {
+        // Hover over the node, making a full circle with a radius of 100px
+        val r = 100f
+        animateAlong(
+            curve = {
+                val angle = 2 * PI * it / 1000
+                center + Offset(r * cos(angle).toFloat(), r * sin(angle).toFloat())
+            },
+            durationMillis = 1000L
+        )
+    }
 }
 
 @OptIn(ExperimentalTestApi::class)
 @Sampled
 fun mouseInputScrollWhileDown() {
-    composeTestRule.onNodeWithTag("verticalScrollable")
+    composeTestRule
+        .onNodeWithTag("verticalScrollable")
         // Scroll downwards while keeping a button pressed:
         .performMouseInput {
             // Presses the primary mouse button
@@ -94,13 +92,12 @@
 @OptIn(ExperimentalTestApi::class)
 @Sampled
 fun mouseInputSmoothScroll() {
-    composeTestRule.onNodeWithTag("horizontalScrollable")
-        .performMouseInput {
-            // Scroll forwards horizontally, which is rightwards
-            // unless scroll direction is reversed
-            smoothScroll(100f, durationMillis = 500L, ScrollWheel.Horizontal)
-            // The 100f scroll delta is equally divided into smaller scrolls,
-            // such that the time in between two scroll events is more or less
-            // equal to the default time between events, 16ms.
-        }
+    composeTestRule.onNodeWithTag("horizontalScrollable").performMouseInput {
+        // Scroll forwards horizontally, which is rightwards
+        // unless scroll direction is reversed
+        smoothScroll(100f, durationMillis = 500L, ScrollWheel.Horizontal)
+        // The 100f scroll delta is equally divided into smaller scrolls,
+        // such that the time in between two scroll events is more or less
+        // equal to the default time between events, 16ms.
+    }
 }
diff --git a/compose/ui/ui-test/samples/src/main/java/androidx/compose/ui/test/samples/MultiModalInjectionScopeSamples.kt b/compose/ui/ui-test/samples/src/main/java/androidx/compose/ui/test/samples/MultiModalInjectionScopeSamples.kt
index 7a47c06..0f91946 100644
--- a/compose/ui/ui-test/samples/src/main/java/androidx/compose/ui/test/samples/MultiModalInjectionScopeSamples.kt
+++ b/compose/ui/ui-test/samples/src/main/java/androidx/compose/ui/test/samples/MultiModalInjectionScopeSamples.kt
@@ -25,11 +25,9 @@
 
 @Sampled
 fun multiModalInputClickDragDrop() {
-    composeTestRule.onNodeWithTag("myComponent")
-        .performMultiModalInput {
-            touch { click(center) }
-            advanceEventTime(500)
-            @OptIn(ExperimentalTestApi::class)
-            mouse { dragAndDrop(topLeft, bottomRight) }
-        }
+    composeTestRule.onNodeWithTag("myComponent").performMultiModalInput {
+        touch { click(center) }
+        advanceEventTime(500)
+        @OptIn(ExperimentalTestApi::class) mouse { dragAndDrop(topLeft, bottomRight) }
+    }
 }
diff --git a/compose/ui/ui-test/samples/src/main/java/androidx/compose/ui/test/samples/RotaryInjectionScopeSamples.kt b/compose/ui/ui-test/samples/src/main/java/androidx/compose/ui/test/samples/RotaryInjectionScopeSamples.kt
index 3a6ef05..68eee4a 100644
--- a/compose/ui/ui-test/samples/src/main/java/androidx/compose/ui/test/samples/RotaryInjectionScopeSamples.kt
+++ b/compose/ui/ui-test/samples/src/main/java/androidx/compose/ui/test/samples/RotaryInjectionScopeSamples.kt
@@ -24,10 +24,9 @@
 @OptIn(ExperimentalTestApi::class)
 @Sampled
 fun rotaryInputScroll() {
-    composeTestRule.onNodeWithTag("myComponent")
-        .performRotaryScrollInput {
-            rotateToScrollVertically(3.0f)
-            rotateToScrollVertically(10.0f)
-            rotateToScrollVertically(2.0f)
-        }
+    composeTestRule.onNodeWithTag("myComponent").performRotaryScrollInput {
+        rotateToScrollVertically(3.0f)
+        rotateToScrollVertically(10.0f)
+        rotateToScrollVertically(2.0f)
+    }
 }
diff --git a/compose/ui/ui-test/samples/src/main/java/androidx/compose/ui/test/samples/SemanticsNodeInteractionSamples.kt b/compose/ui/ui-test/samples/src/main/java/androidx/compose/ui/test/samples/SemanticsNodeInteractionSamples.kt
index 09c0d62..22ec839 100644
--- a/compose/ui/ui-test/samples/src/main/java/androidx/compose/ui/test/samples/SemanticsNodeInteractionSamples.kt
+++ b/compose/ui/ui-test/samples/src/main/java/androidx/compose/ui/test/samples/SemanticsNodeInteractionSamples.kt
@@ -36,9 +36,7 @@
 
 @Sampled
 fun clickAndVerifyCheckbox() {
-    composeTestRule.onNode(isToggleable())
-        .performClick()
-        .assertIsOn()
+    composeTestRule.onNode(isToggleable()).performClick().assertIsOn()
 }
 
 @Sampled
@@ -46,23 +44,21 @@
     composeTestRule.setContent {
         // Box is a semantically merging composable. All testTags of its
         // children are merged up into it in the merged semantics tree.
-        Box(Modifier.testTag("box").padding(16.dp)) {
-            Box(Modifier.testTag("icon").size(48.dp))
-        }
+        Box(Modifier.testTag("box").padding(16.dp)) { Box(Modifier.testTag("icon").size(48.dp)) }
     }
 
     // Verify the position of the inner box. Without `useUnmergedTree`, the
     // test would check the position of the outer box (which is `(0, 0)`)
     // instead of the position of the inner box (which is `(16, 16)`).
-    composeTestRule.onNodeWithTag("icon", useUnmergedTree = true)
+    composeTestRule
+        .onNodeWithTag("icon", useUnmergedTree = true)
         .assertLeftPositionInRootIsEqualTo(16.dp)
         .assertTopPositionInRootIsEqualTo(16.dp)
 }
 
 @Sampled
 fun verifyTwoClickableNodes() {
-    composeTestRule.onAllNodes(hasClickAction())
-        .assertCountEquals(2)
+    composeTestRule.onAllNodes(hasClickAction()).assertCountEquals(2)
 }
 
 @Sampled
diff --git a/compose/ui/ui-test/samples/src/main/java/androidx/compose/ui/test/samples/TouchInjectionScopeSamples.kt b/compose/ui/ui-test/samples/src/main/java/androidx/compose/ui/test/samples/TouchInjectionScopeSamples.kt
index 29cd365..7028c07 100644
--- a/compose/ui/ui-test/samples/src/main/java/androidx/compose/ui/test/samples/TouchInjectionScopeSamples.kt
+++ b/compose/ui/ui-test/samples/src/main/java/androidx/compose/ui/test/samples/TouchInjectionScopeSamples.kt
@@ -27,25 +27,25 @@
 
 @Sampled
 fun touchInputClick() {
-    composeTestRule.onNodeWithTag("myComponent")
-        .performTouchInput { click() }
+    composeTestRule.onNodeWithTag("myComponent").performTouchInput { click() }
 }
 
 @Sampled
 fun touchInputSwipeUp() {
-    composeTestRule.onNodeWithTag("myComponent")
-        .performTouchInput { swipeUp() }
+    composeTestRule.onNodeWithTag("myComponent").performTouchInput { swipeUp() }
 }
 
 @Sampled
 fun touchInputClickOffCenter() {
-    composeTestRule.onNodeWithTag("myComponent")
-        .performTouchInput { click(percentOffset(.2f, .5f)) }
+    composeTestRule.onNodeWithTag("myComponent").performTouchInput {
+        click(percentOffset(.2f, .5f))
+    }
 }
 
 @Sampled
 fun touchInputAssertDuringClick() {
-    composeTestRule.onNodeWithTag("myComponent")
+    composeTestRule
+        .onNodeWithTag("myComponent")
         .performTouchInput { down(topLeft) }
         .assertHasClickAction()
         .performTouchInput { up() }
@@ -62,51 +62,50 @@
 
 @Sampled
 fun touchInputLShapedGesture() {
-    composeTestRule.onNodeWithTag("myComponent")
-        .performTouchInput {
-            down(topLeft)
-            moveTo(topLeft + percentOffset(0f, .1f))
-            moveTo(topLeft + percentOffset(0f, .2f))
-            moveTo(topLeft + percentOffset(0f, .3f))
-            moveTo(topLeft + percentOffset(0f, .4f))
-            moveTo(centerLeft)
-            moveTo(centerLeft + percentOffset(.1f, 0f))
-            moveTo(centerLeft + percentOffset(.2f, 0f))
-            moveTo(centerLeft + percentOffset(.3f, 0f))
-            moveTo(centerLeft + percentOffset(.4f, 0f))
-            moveTo(center)
-            up()
-        }
+    composeTestRule.onNodeWithTag("myComponent").performTouchInput {
+        down(topLeft)
+        moveTo(topLeft + percentOffset(0f, .1f))
+        moveTo(topLeft + percentOffset(0f, .2f))
+        moveTo(topLeft + percentOffset(0f, .3f))
+        moveTo(topLeft + percentOffset(0f, .4f))
+        moveTo(centerLeft)
+        moveTo(centerLeft + percentOffset(.1f, 0f))
+        moveTo(centerLeft + percentOffset(.2f, 0f))
+        moveTo(centerLeft + percentOffset(.3f, 0f))
+        moveTo(centerLeft + percentOffset(.4f, 0f))
+        moveTo(center)
+        up()
+    }
 }
 
 @Sampled
 fun touchInputMultiTouchWithHistory() {
     // Move two fingers in a horizontal line, one on y=100 and one on y=500
-    composeTestRule.onNodeWithTag("myComponent")
-        .performTouchInput {
-            // First, make contact with the screen with both pointers:
-            down(0, Offset(300f, 100f))
-            down(1, Offset(300f, 500f))
-            // Update the pointer locations for the next event
-            updatePointerTo(0, Offset(400f, 100f))
-            updatePointerTo(1, Offset(400f, 500f))
-            // And send the move event with historical data
-            @OptIn(ExperimentalTestApi::class)
-            moveWithHistoryMultiPointer(
-                // Let's add 3 historical events
-                relativeHistoricalTimes = listOf(-12, -8, -4),
-                // Now, for each pointer we supply the historical coordinates
-                historicalCoordinates = listOf(
+    composeTestRule.onNodeWithTag("myComponent").performTouchInput {
+        // First, make contact with the screen with both pointers:
+        down(0, Offset(300f, 100f))
+        down(1, Offset(300f, 500f))
+        // Update the pointer locations for the next event
+        updatePointerTo(0, Offset(400f, 100f))
+        updatePointerTo(1, Offset(400f, 500f))
+        // And send the move event with historical data
+        @OptIn(ExperimentalTestApi::class)
+        moveWithHistoryMultiPointer(
+            // Let's add 3 historical events
+            relativeHistoricalTimes = listOf(-12, -8, -4),
+            // Now, for each pointer we supply the historical coordinates
+            historicalCoordinates =
+                listOf(
                     // Pointer 0 moves along y=100
                     listOf(Offset(325f, 100f), Offset(350f, 100f), Offset(375f, 100f)),
                     // Pointer 1 moves along y=500
                     listOf(Offset(325f, 500f), Offset(350f, 500f), Offset(375f, 500f)),
                 ),
-                // The actual move event will be sent 16ms after the previous event
-                delayMillis = 16
-            )
-            // And finish the gesture by lifting both fingers. Can be done in any order
-            up(1)
-            up(0)
-        }
+            // The actual move event will be sent 16ms after the previous event
+            delayMillis = 16
+        )
+        // And finish the gesture by lifting both fingers. Can be done in any order
+        up(1)
+        up(0)
+    }
 }
diff --git a/compose/ui/ui-test/src/androidCommonTest/kotlin/androidx/compose/ui/test/util/InputEventRecorder.kt b/compose/ui/ui-test/src/androidCommonTest/kotlin/androidx/compose/ui/test/util/InputEventRecorder.kt
index fbbfd11..fcdb60d 100644
--- a/compose/ui/ui-test/src/androidCommonTest/kotlin/androidx/compose/ui/test/util/InputEventRecorder.kt
+++ b/compose/ui/ui-test/src/androidCommonTest/kotlin/androidx/compose/ui/test/util/InputEventRecorder.kt
@@ -23,21 +23,26 @@
 internal class InputEventRecorder {
 
     private val _events = mutableListOf<InputEvent>()
-    val events get() = _events as List<InputEvent>
+    val events
+        get() = _events as List<InputEvent>
 
     fun disposeEvents() {
-        _events.removeAll { if (it is MotionEvent) it.recycle(); true }
+        _events.removeAll {
+            if (it is MotionEvent) it.recycle()
+            true
+        }
     }
 
-    /**
-     * [InputEvent] recorder which can record events of type [MotionEvent] and [KeyEvent].
-     */
+    /** [InputEvent] recorder which can record events of type [MotionEvent] and [KeyEvent]. */
     fun recordEvent(event: InputEvent) {
         when (event) {
             is KeyEvent -> _events.add(KeyEvent(event))
             is MotionEvent -> _events.add(MotionEvent.obtain(event))
-            else -> IllegalArgumentException("Given InputEvent must be a MotionEvent or KeyEvent" +
-                " not ${event::class.simpleName}")
+            else ->
+                IllegalArgumentException(
+                    "Given InputEvent must be a MotionEvent or KeyEvent" +
+                        " not ${event::class.simpleName}"
+                )
         }
     }
 }
diff --git a/compose/ui/ui-test/src/androidCommonTest/kotlin/androidx/compose/ui/test/util/Verifications.kt b/compose/ui/ui-test/src/androidCommonTest/kotlin/androidx/compose/ui/test/util/Verifications.kt
index f0a814a..f2f0ddd 100644
--- a/compose/ui/ui-test/src/androidCommonTest/kotlin/androidx/compose/ui/test/util/Verifications.kt
+++ b/compose/ui/ui-test/src/androidCommonTest/kotlin/androidx/compose/ui/test/util/Verifications.kt
@@ -48,8 +48,8 @@
 }
 
 /**
- * Asserts that all event times are after their corresponding down time, and that the event
- * stream has increasing event times.
+ * Asserts that all event times are after their corresponding down time, and that the event stream
+ * has increasing event times.
  */
 internal fun InputEventRecorder.assertHasValidEventTimes() {
     events.fold(Pair(0L, 0L)) { (lastDownTime, lastEventTime), event ->
@@ -58,16 +58,20 @@
         when (event) {
             is MotionEvent -> downTime = event.downTime
             is KeyEvent -> downTime = event.downTime
-            else -> AssertionError("Given InputEvent must be a MotionEvent or KeyEvent" +
-                " not ${event::class.simpleName}")
+            else ->
+                AssertionError(
+                    "Given InputEvent must be a MotionEvent or KeyEvent" +
+                        " not ${event::class.simpleName}"
+                )
         }
 
         assertWithMessage("monotonically increasing downTime")
-            .that(downTime).isAtLeast(lastDownTime)
+            .that(downTime)
+            .isAtLeast(lastDownTime)
         assertWithMessage("monotonically increasing eventTime")
-            .that(event.eventTime).isAtLeast(lastEventTime)
-        assertWithMessage("downTime <= eventTime")
-            .that(downTime).isAtMost(event.eventTime)
+            .that(event.eventTime)
+            .isAtLeast(lastEventTime)
+        assertWithMessage("downTime <= eventTime").that(downTime).isAtMost(event.eventTime)
         Pair(downTime, event.eventTime)
     }
 }
@@ -85,15 +89,13 @@
         assertThat(relativeTime).isEqualTo(expectedRelativeTime)
         assertThat(source).isEqualTo(SourceTouchscreen)
     } else {
-        throw AssertionError("A touch event must be of type MotionEvent, " +
-            "not ${this::class.simpleName}")
+        throw AssertionError(
+            "A touch event must be of type MotionEvent, " + "not ${this::class.simpleName}"
+        )
     }
 }
 
-internal fun InputEvent.verifyTouchPointer(
-    expectedPointerId: Int,
-    expectedPosition: Offset
-) {
+internal fun InputEvent.verifyTouchPointer(expectedPointerId: Int, expectedPosition: Offset) {
     if (this is MotionEvent) {
         var index = -1
         for (i in 0 until pointerCount) {
@@ -107,8 +109,9 @@
         assertThat(getY(index)).isEqualTo(expectedPosition.y)
         assertThat(getToolType(index)).isEqualTo(TypeFinger)
     } else {
-        throw AssertionError("A touch event must be of type MotionEvent, " +
-            "not ${this::class.simpleName}")
+        throw AssertionError(
+            "A touch event must be of type MotionEvent, " + "not ${this::class.simpleName}"
+        )
     }
 }
 
@@ -136,8 +139,9 @@
             assertWithMessage("axisValue($axis)").that(getAxisValue(axis)).isEqualTo(expectedValue)
         }
     } else {
-        throw AssertionError("A mouse event must be of type MotionEvent, " +
-            "not ${this::class.simpleName}")
+        throw AssertionError(
+            "A mouse event must be of type MotionEvent, " + "not ${this::class.simpleName}"
+        )
     }
 }
 
@@ -157,30 +161,27 @@
         assertWithMessage("metaState").that(metaState).isEqualTo(expectedMetaState)
         assertWithMessage("repeat").that(repeatCount).isEqualTo(expectedRepeat)
     } else {
-        throw AssertionError("A keyboard event must be of type KeyEvent, " +
-            "not ${this::class.simpleName}")
+        throw AssertionError(
+            "A keyboard event must be of type KeyEvent, " + "not ${this::class.simpleName}"
+        )
     }
 }
 
-/**
- * Returns a list of all events between [t0] and [t1], excluding [t0] and including [t1].
- */
+/** Returns a list of all events between [t0] and [t1], excluding [t0] and including [t1]. */
 fun List<MotionEvent>.between(t0: Long, t1: Long): List<MotionEvent> {
     return dropWhile { it.relativeTime <= t0 }.takeWhile { it.relativeTime <= t1 }
 }
 
-/**
- * Checks that the coordinates are progressing in a monotonous direction
- */
+/** Checks that the coordinates are progressing in a monotonous direction */
 fun List<MotionEvent>.isMonotonicBetween(start: Offset, end: Offset) {
     map { it.x }.isMonotonicBetween(start.x, end.x, 1e-6f)
     map { it.y }.isMonotonicBetween(start.y, end.y, 1e-6f)
 }
 
 /**
- * Verifies that the MotionEvents in this list are equidistant from each other in time between
- * [t0] and [t1], with a duration between them that is as close to the [desiredDuration] as
- * possible, given that the sequence is splitting the total duration between [t0] and [t1].
+ * Verifies that the MotionEvents in this list are equidistant from each other in time between [t0]
+ * and [t1], with a duration between them that is as close to the [desiredDuration] as possible,
+ * given that the sequence is splitting the total duration between [t0] and [t1].
  */
 fun List<MotionEvent>.splitsDurationEquallyInto(t0: Long, t1: Long, desiredDuration: Long) {
     val totalDuration = t1 - t0
@@ -203,13 +204,14 @@
 
     // Check that the timestamps are within .5 of the unrounded splits
     forEachIndexed { i, event ->
-        assertThat((event.relativeTime - t0).toFloat()).isWithin(.5f).of(
-            ((i + 1) / size.toDouble() * totalDuration).toFloat()
-        )
+        assertThat((event.relativeTime - t0).toFloat())
+            .isWithin(.5f)
+            .of(((i + 1) / size.toDouble() * totalDuration).toFloat())
     }
 }
 
-private val MotionEvent.relativeTime get() = eventTime - downTime
+private val MotionEvent.relativeTime
+    get() = eventTime - downTime
 
 /**
  * Checks if the subject is within [tolerance] of [f]. Shorthand for
@@ -234,9 +236,9 @@
 }
 
 /**
- * Checks that the values are progressing in a monotonic direction between [a] and [b].
- * If [a] and [b] are equal, all values in the list should be that value too. The edges [a] and
- * [b] allow a [tolerance] for floating point imprecision, which is by default `0.001`.
+ * Checks that the values are progressing in a monotonic direction between [a] and [b]. If [a] and
+ * [b] are equal, all values in the list should be that value too. The edges [a] and [b] allow a
+ * [tolerance] for floating point imprecision, which is by default `0.001`.
  */
 fun List<Float>.isMonotonicBetween(a: Float, b: Float, tolerance: Float = 1e-3f) {
     val expectedSign = sign(b - a)
@@ -244,9 +246,8 @@
         forEach { assertThat(it).isAlmostEqualTo(a, tolerance) }
     } else {
         forEach { assertThat(it).isAlmostBetween(a, b, tolerance) }
-        zipWithNext { curr, next -> sign(next - curr) }.forEach {
-            if (it != 0f) assertThat(it).isEqualTo(expectedSign)
-        }
+        zipWithNext { curr, next -> sign(next - curr) }
+            .forEach { if (it != 0f) assertThat(it).isEqualTo(expectedSign) }
     }
 }
 
@@ -258,8 +259,8 @@
 }
 
 /**
- * Checks that the float value is between [a] and [b], allowing a [tolerance] on either side.
- * The order of [a] and [b] doesn't matter, the float value must be _between_ them. The default
+ * Checks that the float value is between [a] and [b], allowing a [tolerance] on either side. The
+ * order of [a] and [b] doesn't matter, the float value must be _between_ them. The default
  * tolerance is `0.001`.
  */
 fun FloatSubject.isAlmostBetween(a: Float, b: Float, tolerance: Float = 1e-3f) {
diff --git a/compose/ui/ui-test/src/androidInstrumentedTest/kotlin/androidx/compose/ui/test/ActivityWithActionBar.kt b/compose/ui/ui-test/src/androidInstrumentedTest/kotlin/androidx/compose/ui/test/ActivityWithActionBar.kt
index 2014657..4fc309f 100644
--- a/compose/ui/ui-test/src/androidInstrumentedTest/kotlin/androidx/compose/ui/test/ActivityWithActionBar.kt
+++ b/compose/ui/ui-test/src/androidInstrumentedTest/kotlin/androidx/compose/ui/test/ActivityWithActionBar.kt
@@ -31,13 +31,15 @@
     override fun onCreate(savedInstanceState: Bundle?) {
         super.onCreate(savedInstanceState)
         val root = FrameLayout(this)
-        composeHolder = ComposeView(this).apply {
-            layoutParams = FrameLayout.LayoutParams(WRAP_CONTENT, WRAP_CONTENT).apply {
-                gravity = Gravity.BOTTOM or Gravity.END
+        composeHolder =
+            ComposeView(this).apply {
+                layoutParams =
+                    FrameLayout.LayoutParams(WRAP_CONTENT, WRAP_CONTENT).apply {
+                        gravity = Gravity.BOTTOM or Gravity.END
+                    }
+                // Set background color for recognizability on screen / in screenshots
+                setBackgroundColor(android.graphics.Color.LTGRAY)
             }
-            // Set background color for recognizability on screen / in screenshots
-            setBackgroundColor(android.graphics.Color.LTGRAY)
-        }
         root.addView(composeHolder)
         setContentView(root)
     }
diff --git a/compose/ui/ui-test/src/androidInstrumentedTest/kotlin/androidx/compose/ui/test/AssertExistsTest.kt b/compose/ui/ui-test/src/androidInstrumentedTest/kotlin/androidx/compose/ui/test/AssertExistsTest.kt
index b18f876..69a321b 100644
--- a/compose/ui/ui-test/src/androidInstrumentedTest/kotlin/androidx/compose/ui/test/AssertExistsTest.kt
+++ b/compose/ui/ui-test/src/androidInstrumentedTest/kotlin/androidx/compose/ui/test/AssertExistsTest.kt
@@ -38,8 +38,7 @@
 @RunWith(AndroidJUnit4::class)
 class AssertExistsTest {
 
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
     @Test
     @FlakyTest
@@ -63,45 +62,28 @@
             }
         }
 
-        rule.onNodeWithText("Hello")
-            .assertExists()
+        rule.onNodeWithText("Hello").assertExists()
 
-        expectAssertionError {
-            rule.onNodeWithText("Hello")
-                .assertDoesNotExist()
-        }
+        expectAssertionError { rule.onNodeWithText("Hello").assertDoesNotExist() }
 
         val cachedResult = rule.onNodeWithText("Hello")
 
         // Hide
-        rule.onNodeWithTag("MyButton")
-            .performClick()
+        rule.onNodeWithTag("MyButton").performClick()
 
-        rule.onNodeWithText("Hello")
-            .assertDoesNotExist()
+        rule.onNodeWithText("Hello").assertDoesNotExist()
 
-        cachedResult
-            .assertDoesNotExist()
+        cachedResult.assertDoesNotExist()
 
-        expectAssertionError {
-            rule.onNodeWithText("Hello")
-                .assertExists()
-        }
+        expectAssertionError { rule.onNodeWithText("Hello").assertExists() }
 
-        expectAssertionError {
-            cachedResult.assertExists()
-        }
+        expectAssertionError { cachedResult.assertExists() }
 
         // Show
-        rule.onNodeWithTag("MyButton")
-            .performClick()
+        rule.onNodeWithTag("MyButton").performClick()
 
-        rule.onNodeWithText("Hello")
-            .assertExists()
+        rule.onNodeWithText("Hello").assertExists()
 
-        expectAssertionError {
-            rule.onNodeWithText("Hello")
-                .assertDoesNotExist()
-        }
+        expectAssertionError { rule.onNodeWithText("Hello").assertDoesNotExist() }
     }
 }
diff --git a/compose/ui/ui-test/src/androidInstrumentedTest/kotlin/androidx/compose/ui/test/AssertsTest.kt b/compose/ui/ui-test/src/androidInstrumentedTest/kotlin/androidx/compose/ui/test/AssertsTest.kt
index 8dc6de9..dc2bfa6 100644
--- a/compose/ui/ui-test/src/androidInstrumentedTest/kotlin/androidx/compose/ui/test/AssertsTest.kt
+++ b/compose/ui/ui-test/src/androidInstrumentedTest/kotlin/androidx/compose/ui/test/AssertsTest.kt
@@ -31,127 +31,130 @@
 
 class AssertsTest {
 
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
     @Test
     fun assertIsOn_forCheckedElement_isOk() {
         rule.setContent {
-            BoundaryNode { testTag = "test"; toggleableState = ToggleableState.On }
+            BoundaryNode {
+                testTag = "test"
+                toggleableState = ToggleableState.On
+            }
         }
 
-        rule.onNodeWithTag("test")
-            .assertIsOn()
+        rule.onNodeWithTag("test").assertIsOn()
     }
 
     @Test(expected = AssertionError::class)
     fun assertIsOn_forUncheckedElement_throwsError() {
         rule.setContent {
-            BoundaryNode { testTag = "test"; toggleableState = ToggleableState.Off }
+            BoundaryNode {
+                testTag = "test"
+                toggleableState = ToggleableState.Off
+            }
         }
 
-        rule.onNodeWithTag("test")
-            .assertIsOn()
+        rule.onNodeWithTag("test").assertIsOn()
     }
 
     @Test(expected = AssertionError::class)
     fun assertIsOn_forNotToggleableElement_throwsError() {
-        rule.setContent {
-            BoundaryNode { testTag = "test" }
-        }
+        rule.setContent { BoundaryNode { testTag = "test" } }
 
-        rule.onNodeWithTag("test")
-            .assertIsOn()
+        rule.onNodeWithTag("test").assertIsOn()
     }
 
     @Test(expected = AssertionError::class)
     fun assertIsOff_forCheckedElement_throwsError() {
         rule.setContent {
-            BoundaryNode { testTag = "test"; toggleableState = ToggleableState.On }
+            BoundaryNode {
+                testTag = "test"
+                toggleableState = ToggleableState.On
+            }
         }
 
-        rule.onNodeWithTag("test")
-            .assertIsOff()
+        rule.onNodeWithTag("test").assertIsOff()
     }
 
     @Test
     fun assertIsOff_forUncheckedElement_isOk() {
         rule.setContent {
-            BoundaryNode { testTag = "test"; toggleableState = ToggleableState.Off }
+            BoundaryNode {
+                testTag = "test"
+                toggleableState = ToggleableState.Off
+            }
         }
 
-        rule.onNodeWithTag("test")
-            .assertIsOff()
+        rule.onNodeWithTag("test").assertIsOff()
     }
 
     @Test(expected = AssertionError::class)
     fun assertIsOff_forNotToggleableElement_throwsError() {
-        rule.setContent {
-            BoundaryNode { testTag = "test"; }
-        }
+        rule.setContent { BoundaryNode { testTag = "test" } }
 
-        rule.onNodeWithTag("test")
-            .assertIsOff()
+        rule.onNodeWithTag("test").assertIsOff()
     }
 
     @Test(expected = AssertionError::class)
     fun assertIsSelected_forNotSelectedElement_throwsError() {
         rule.setContent {
-            BoundaryNode { testTag = "test"; selected = false }
+            BoundaryNode {
+                testTag = "test"
+                selected = false
+            }
         }
 
-        rule.onNodeWithTag("test")
-            .assertIsSelected()
+        rule.onNodeWithTag("test").assertIsSelected()
     }
 
     @Test
     fun assertIsSelected_forSelectedElement_isOk() {
         rule.setContent {
-            BoundaryNode { testTag = "test"; selected = true }
+            BoundaryNode {
+                testTag = "test"
+                selected = true
+            }
         }
 
-        rule.onNodeWithTag("test")
-            .assertIsSelected()
+        rule.onNodeWithTag("test").assertIsSelected()
     }
 
     @Test(expected = AssertionError::class)
     fun assertIsSelected_forNotSelectableElement_throwsError() {
-        rule.setContent {
-            BoundaryNode { testTag = "test"; }
-        }
+        rule.setContent { BoundaryNode { testTag = "test" } }
 
-        rule.onNodeWithTag("test")
-            .assertIsSelected()
+        rule.onNodeWithTag("test").assertIsSelected()
     }
 
     @Test(expected = AssertionError::class)
     fun assertIsNotSelected_forSelectedElement_throwsError() {
         rule.setContent {
-            BoundaryNode { testTag = "test"; selected = true }
+            BoundaryNode {
+                testTag = "test"
+                selected = true
+            }
         }
 
-        rule.onNodeWithTag("test")
-            .assertIsNotSelected()
+        rule.onNodeWithTag("test").assertIsNotSelected()
     }
 
     @Test
     fun assertIsNotSelected_forNotSelectedElement_isOk() {
         rule.setContent {
-            BoundaryNode { testTag = "test"; selected = false }
+            BoundaryNode {
+                testTag = "test"
+                selected = false
+            }
         }
 
-        rule.onNodeWithTag("test")
-            .assertIsNotSelected()
+        rule.onNodeWithTag("test").assertIsNotSelected()
     }
 
     @Test(expected = AssertionError::class)
     fun assertIsNotSelected_forNotSelectableElement_throwsError() {
-        rule.setContent {
-            BoundaryNode { testTag = "test"; }
-        }
+        rule.setContent { BoundaryNode { testTag = "test" } }
 
-        rule.onNodeWithTag("test")
-            .assertIsNotSelected()
+        rule.onNodeWithTag("test").assertIsNotSelected()
     }
 
     @Composable
diff --git a/compose/ui/ui-test/src/androidInstrumentedTest/kotlin/androidx/compose/ui/test/BitmapCapturingTest.kt b/compose/ui/ui-test/src/androidInstrumentedTest/kotlin/androidx/compose/ui/test/BitmapCapturingTest.kt
index 0b5c06c..2120a4c 100644
--- a/compose/ui/ui-test/src/androidInstrumentedTest/kotlin/androidx/compose/ui/test/BitmapCapturingTest.kt
+++ b/compose/ui/ui-test/src/androidInstrumentedTest/kotlin/androidx/compose/ui/test/BitmapCapturingTest.kt
@@ -55,21 +55,19 @@
 @RunWith(Parameterized::class)
 @SdkSuppress(minSdkVersion = Build.VERSION_CODES.O)
 class BitmapCapturingTest(val config: TestConfig) {
-    data class TestConfig(
-        val activityClass: Class<out ComponentActivity>
-    )
+    data class TestConfig(val activityClass: Class<out ComponentActivity>)
 
     companion object {
         @JvmStatic
         @Parameterized.Parameters(name = "{0}")
-        fun createTestSet(): List<TestConfig> = listOf(
-            TestConfig(ComponentActivity::class.java),
-            TestConfig(ActivityWithActionBar::class.java)
-        )
+        fun createTestSet(): List<TestConfig> =
+            listOf(
+                TestConfig(ComponentActivity::class.java),
+                TestConfig(ActivityWithActionBar::class.java)
+            )
     }
 
-    @get:Rule
-    val rule = createAndroidComposeRule(config.activityClass)
+    @get:Rule val rule = createAndroidComposeRule(config.activityClass)
 
     private val rootTag = "Root"
     private val tagTopLeft = "TopLeft"
@@ -88,40 +86,40 @@
         composeCheckerboard()
 
         var calledCount = 0
-        rule.onNodeWithTag(tagTopLeft)
-            .captureToImage()
-            .assertPixels(expectedSize = IntSize(100, 50)) {
-                calledCount++
-                colorTopLeft
-            }
+        rule.onNodeWithTag(tagTopLeft).captureToImage().assertPixels(
+            expectedSize = IntSize(100, 50)
+        ) {
+            calledCount++
+            colorTopLeft
+        }
         assertThat(calledCount).isEqualTo((100 * 50))
 
-        rule.onNodeWithTag(tagTopRight)
-            .captureToImage()
-            .assertPixels(expectedSize = IntSize(100, 50)) {
-                colorTopRight
-            }
-        rule.onNodeWithTag(tagBottomLeft)
-            .captureToImage()
-            .assertPixels(expectedSize = IntSize(100, 50)) {
-                colorBottomLeft
-            }
-        rule.onNodeWithTag(tagBottomRight)
-            .captureToImage()
-            .assertPixels(expectedSize = IntSize(100, 50)) {
-                colorBottomRight
-            }
+        rule.onNodeWithTag(tagTopRight).captureToImage().assertPixels(
+            expectedSize = IntSize(100, 50)
+        ) {
+            colorTopRight
+        }
+        rule.onNodeWithTag(tagBottomLeft).captureToImage().assertPixels(
+            expectedSize = IntSize(100, 50)
+        ) {
+            colorBottomLeft
+        }
+        rule.onNodeWithTag(tagBottomRight).captureToImage().assertPixels(
+            expectedSize = IntSize(100, 50)
+        ) {
+            colorBottomRight
+        }
     }
 
     @Test
     fun captureRootContainer_checkSizeAndColors() {
         composeCheckerboard()
 
-        rule.onNodeWithTag(rootTag)
-            .captureToImage()
-            .assertPixels(expectedSize = IntSize(200, 100)) {
-                expectedColorProvider(it)
-            }
+        rule.onNodeWithTag(rootTag).captureToImage().assertPixels(
+            expectedSize = IntSize(200, 100)
+        ) {
+            expectedColorProvider(it)
+        }
     }
 
     @Test
@@ -132,47 +130,27 @@
             AlertDialog(onDismissRequest = {}, confirmButton = {}, backgroundColor = Color.Red)
         }
 
-        rule.onNode(isDialog())
-            .captureToImage()
-            .assertContainsColor(Color.Red)
+        rule.onNode(isDialog()).captureToImage().assertContainsColor(Color.Red)
     }
 
     @Ignore // b/266737024
     @Test
     fun capturePopup_verifyBackground() {
-        setContent {
-            Box {
-                Popup {
-                    Box(Modifier.background(Color.Red)) {
-                        Text("Hello")
-                    }
-                }
-            }
-        }
+        setContent { Box { Popup { Box(Modifier.background(Color.Red)) { Text("Hello") } } } }
 
-        rule.onNode(isPopup())
-            .captureToImage()
-            .assertContainsColor(Color.Red)
+        rule.onNode(isPopup()).captureToImage().assertContainsColor(Color.Red)
     }
 
     @Test
     fun captureComposable_withPopUp_verifyBackground() {
         setContent {
-            Box(
-                Modifier
-                    .testTag(rootTag)
-                    .size(300.dp)
-                    .background(Color.Yellow)
-            ) {
-                Popup {
-                    Box(Modifier.background(Color.Red)) {
-                        Text("Hello")
-                    }
-                }
+            Box(Modifier.testTag(rootTag).size(300.dp).background(Color.Yellow)) {
+                Popup { Box(Modifier.background(Color.Red)) { Text("Hello") } }
             }
         }
 
-        rule.onNodeWithTag(rootTag)
+        rule
+            .onNodeWithTag(rootTag)
             .captureToImage()
             .assertContainsColor(Color.Yellow)
             .assertDoesNotContainColor(Color.Red)
@@ -181,23 +159,12 @@
     @Test
     fun captureComposable_withDialog_verifyBackground() {
         setContent {
-            Box(
-                Modifier
-                    .testTag(rootTag)
-                    .size(300.dp)
-                    .background(Color.Yellow)
-            ) {
-                Dialog({}) {
-                    Box(
-                        Modifier
-                            .size(300.dp)
-                            .background(Color.Red)) {
-                        Text("Hello")
-                    }
-                }
+            Box(Modifier.testTag(rootTag).size(300.dp).background(Color.Yellow)) {
+                Dialog({}) { Box(Modifier.size(300.dp).background(Color.Red)) { Text("Hello") } }
             }
         }
-        rule.onNodeWithTag(rootTag)
+        rule
+            .onNodeWithTag(rootTag)
             .captureToImage()
             .assertContainsColor(Color.Yellow)
             .assertDoesNotContainColor(Color.Red)
@@ -207,21 +174,11 @@
     fun capturePopup_verifySize() {
         val boxSize = 200.dp
         val boxSizePx = boxSize.toPixel(rule.density).roundToInt()
-        setContent {
-            Box {
-                Popup {
-                    Box(Modifier.size(boxSize)) {
-                        Text("Hello")
-                    }
-                }
-            }
-        }
+        setContent { Box { Popup { Box(Modifier.size(boxSize)) { Text("Hello") } } } }
 
-        rule.onNode(isPopup())
-            .captureToImage()
-            .let {
-                assertThat(IntSize(it.width, it.height)).isEqualTo(IntSize(boxSizePx, boxSizePx))
-            }
+        rule.onNode(isPopup()).captureToImage().let {
+            assertThat(IntSize(it.width, it.height)).isEqualTo(IntSize(boxSizePx, boxSizePx))
+        }
     }
 
     private fun Dp.toPixel(density: Density) = this.value * density.density
@@ -247,35 +204,28 @@
         with(rule.density) {
             setContent {
                 Box(Modifier.background(colorBg)) {
-                    Box(
-                        Modifier
-                            .padding(top = 20.toDp())
-                            .background(colorBg)) {
+                    Box(Modifier.padding(top = 20.toDp()).background(colorBg)) {
                         Column(Modifier.testTag(rootTag)) {
                             Row {
                                 Box(
-                                    Modifier
-                                        .testTag(tagTopLeft)
+                                    Modifier.testTag(tagTopLeft)
                                         .size(100.toDp(), 50.toDp())
                                         .background(color = colorTopLeft)
                                 )
                                 Box(
-                                    Modifier
-                                        .testTag(tagTopRight)
+                                    Modifier.testTag(tagTopRight)
                                         .size(100.toDp(), 50.toDp())
                                         .background(colorTopRight)
                                 )
                             }
                             Row {
                                 Box(
-                                    Modifier
-                                        .testTag(tagBottomLeft)
+                                    Modifier.testTag(tagBottomLeft)
                                         .size(100.toDp(), 50.toDp())
                                         .background(colorBottomLeft)
                                 )
                                 Box(
-                                    Modifier
-                                        .testTag(tagBottomRight)
+                                    Modifier.testTag(tagBottomRight)
                                         .size(100.toDp(), 50.toDp())
                                         .background(colorBottomRight)
                                 )
diff --git a/compose/ui/ui-test/src/androidInstrumentedTest/kotlin/androidx/compose/ui/test/CallSemanticsActionTest.kt b/compose/ui/ui-test/src/androidInstrumentedTest/kotlin/androidx/compose/ui/test/CallSemanticsActionTest.kt
index b977aee..2d955ba 100644
--- a/compose/ui/ui-test/src/androidInstrumentedTest/kotlin/androidx/compose/ui/test/CallSemanticsActionTest.kt
+++ b/compose/ui/ui-test/src/androidInstrumentedTest/kotlin/androidx/compose/ui/test/CallSemanticsActionTest.kt
@@ -37,26 +37,28 @@
 @RunWith(AndroidJUnit4::class)
 class CallSemanticsActionTest {
 
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
     @Test
     fun performSemanticsAction() {
         rule.setContent {
             val state = remember { mutableStateOf("Nothing") }
             BoundaryNode {
-                setString("SetString") { state.value = it; return@setString true }
+                setString("SetString") {
+                    state.value = it
+                    return@setString true
+                }
                 contentDescription = state.value
             }
         }
 
-        rule.onNodeWithContentDescription("Nothing")
+        rule
+            .onNodeWithContentDescription("Nothing")
             .assertExists()
             .performSemanticsAction(MyActions.SetString) { it("Hello") }
             .assertDoesNotExist()
 
-        rule.onNodeWithContentDescription("Hello")
-            .assertExists()
+        rule.onNodeWithContentDescription("Hello").assertExists()
     }
 
     object MyActions {
diff --git a/compose/ui/ui-test/src/androidInstrumentedTest/kotlin/androidx/compose/ui/test/ClickTestRuleTest.kt b/compose/ui/ui-test/src/androidInstrumentedTest/kotlin/androidx/compose/ui/test/ClickTestRuleTest.kt
index 8f986b2..c1524e8 100644
--- a/compose/ui/ui-test/src/androidInstrumentedTest/kotlin/androidx/compose/ui/test/ClickTestRuleTest.kt
+++ b/compose/ui/ui-test/src/androidInstrumentedTest/kotlin/androidx/compose/ui/test/ClickTestRuleTest.kt
@@ -37,9 +37,7 @@
 class ClickCounterActivity : ComponentActivity() {
     override fun onCreate(savedInstanceState: Bundle?) {
         super.onCreate(savedInstanceState)
-        setContent {
-            Counter()
-        }
+        setContent { Counter() }
     }
 }
 
@@ -49,9 +47,7 @@
 fun Counter() {
     var counter by remember { mutableStateOf(0) }
     Column {
-        Button(onClick = { counter++ }) {
-            Text("Increment counter")
-        }
+        Button(onClick = { counter++ }) { Text("Increment counter") }
         Text(text = "Clicks: $counter")
     }
 }
@@ -79,17 +75,16 @@
 
     @Suppress("DEPRECATION")
     @get:Rule
-    val composeTestRule = when (config.activityClass) {
-        null -> createComposeRule()
-        else -> createAndroidComposeRule(config.activityClass)
-    }
+    val composeTestRule =
+        when (config.activityClass) {
+            null -> createComposeRule()
+            else -> createAndroidComposeRule(config.activityClass)
+        }
 
     @Test
     fun testClick() {
         if (config.setContentInTest) {
-            composeTestRule.setContent {
-                Counter()
-            }
+            composeTestRule.setContent { Counter() }
         }
         composeTestRule.onNodeWithText("Increment counter").performClick()
         composeTestRule.onNodeWithText("Clicks: 1").assertExists()
diff --git a/compose/ui/ui-test/src/androidInstrumentedTest/kotlin/androidx/compose/ui/test/ComposeUiTestTest.kt b/compose/ui/ui-test/src/androidInstrumentedTest/kotlin/androidx/compose/ui/test/ComposeUiTestTest.kt
index 3d5ceef..eb84f11 100644
--- a/compose/ui/ui-test/src/androidInstrumentedTest/kotlin/androidx/compose/ui/test/ComposeUiTestTest.kt
+++ b/compose/ui/ui-test/src/androidInstrumentedTest/kotlin/androidx/compose/ui/test/ComposeUiTestTest.kt
@@ -58,9 +58,7 @@
 import org.junit.Test
 import org.junit.runner.RunWith
 
-/**
- * Smoke test to see if ComposeUiTest provides basic functionality.
- */
+/** Smoke test to see if ComposeUiTest provides basic functionality. */
 @LargeTest
 @RunWith(AndroidJUnit4::class)
 @OptIn(ExperimentalTestApi::class)
@@ -81,20 +79,14 @@
     }
 
     @Composable
-    private fun ClickCounter(
-        clicks: MutableState<Int> = remember { mutableStateOf(0) }
-    ) {
+    private fun ClickCounter(clicks: MutableState<Int> = remember { mutableStateOf(0) }) {
         Column {
-            Button(onClick = { clicks.value++ }) {
-                Text("Click me")
-            }
+            Button(onClick = { clicks.value++ }) { Text("Click me") }
             Text("Click count: ${clicks.value}")
         }
     }
 
-    /**
-     * Check that basic scenarios work: a composition that is recomposed due to a state change.
-     */
+    /** Check that basic scenarios work: a composition that is recomposed due to a state change. */
     @Test
     fun testStateChange() = runComposeUiTest {
         val clicks = mutableStateOf(0)
@@ -123,9 +115,9 @@
     }
 
     /**
-     * Check that animation scenarios work: a composition with an animation in its initial state
-     * is idle, stays non-idle while the animation animates to a new target and is idle again
-     * after that.
+     * Check that animation scenarios work: a composition with an animation in its initial state is
+     * idle, stays non-idle while the animation animates to a new target and is idle again after
+     * that.
      */
     @Test
     fun testAnimation() = runComposeUiTest {
@@ -133,12 +125,7 @@
         setContent {
             val offset = animateFloatAsState(target)
             Box(Modifier.fillMaxSize()) {
-                Box(
-                    Modifier
-                        .size(10.dp)
-                        .offset(x = offset.value.dp)
-                        .testTag("box")
-                )
+                Box(Modifier.size(10.dp).offset(x = offset.value.dp).testTag("box"))
             }
         }
         onNodeWithTag("box").assertLeftPositionInRootIsEqualTo(0.dp)
@@ -147,8 +134,8 @@
     }
 
     /**
-     * Check that scrolling and controlling the clock works: a scrollable receives a swipe while
-     * the clock is paused, when the clock is resumed it performs the fling.
+     * Check that scrolling and controlling the clock works: a scrollable receives a swipe while the
+     * clock is paused, when the clock is resumed it performs the fling.
      */
     @OptIn(ExperimentalFoundationApi::class)
     @Test
@@ -166,21 +153,11 @@
                 CompositionLocalProvider(LocalOverscrollConfiguration provides null) {
                     Box(Modifier.fillMaxSize()) {
                         Column(
-                            Modifier
-                                .requiredSize(200.dp)
-                                .verticalScroll(
-                                    scrollState,
-                                    flingBehavior = flingBehavior
-                                )
+                            Modifier.requiredSize(200.dp)
+                                .verticalScroll(scrollState, flingBehavior = flingBehavior)
                                 .testTag("list")
                         ) {
-                            repeat(n) {
-                                Spacer(
-                                    Modifier
-                                        .fillMaxWidth()
-                                        .height(30.dp)
-                                )
-                            }
+                            repeat(n) { Spacer(Modifier.fillMaxWidth().height(30.dp)) }
                         }
                     }
                 }
@@ -192,9 +169,7 @@
         mainClock.autoAdvance = false
         onNodeWithTag("list").performTouchInput {
             down(bottomCenter)
-            repeat(10) {
-                moveTo(bottomCenter - percentOffset(y = (it + 1) / 10f))
-            }
+            repeat(10) { moveTo(bottomCenter - percentOffset(y = (it + 1) / 10f)) }
             up()
         }
         waitForIdle()
@@ -220,16 +195,13 @@
 
         override suspend fun ScrollScope.performFling(initialVelocity: Float): Float {
             for (delta in deltas) {
-                withFrameNanos {
-                    scrollBy(delta.toFloat())
-                }
+                withFrameNanos { scrollBy(delta.toFloat()) }
             }
             return 0f
         }
     }
 
     @Test
-    fun getActivityTest() = runAndroidComposeUiTest<ComponentActivity> {
-        assertThat(activity).isNotNull()
-    }
+    fun getActivityTest() =
+        runAndroidComposeUiTest<ComponentActivity> { assertThat(activity).isNotNull() }
 }
diff --git a/compose/ui/ui-test/src/androidInstrumentedTest/kotlin/androidx/compose/ui/test/CustomEffectContextTest.kt b/compose/ui/ui-test/src/androidInstrumentedTest/kotlin/androidx/compose/ui/test/CustomEffectContextTest.kt
index 7e640f3..3da9085 100644
--- a/compose/ui/ui-test/src/androidInstrumentedTest/kotlin/androidx/compose/ui/test/CustomEffectContextTest.kt
+++ b/compose/ui/ui-test/src/androidInstrumentedTest/kotlin/androidx/compose/ui/test/CustomEffectContextTest.kt
@@ -45,9 +45,7 @@
         val testElement = TestCoroutineContextElement()
         runComposeUiTest(effectContext = testElement) {
             lateinit var compositionScope: CoroutineScope
-            setContent {
-                compositionScope = rememberCoroutineScope()
-            }
+            setContent { compositionScope = rememberCoroutineScope() }
 
             runOnIdle {
                 val elementFromComposition =
@@ -65,16 +63,16 @@
             lastRecordedMotionDurationScale = context[MotionDurationScale]?.scaleFactor
         }
 
-        runOnIdle {
-            Truth.assertThat(lastRecordedMotionDurationScale).isNull()
-        }
+        runOnIdle { Truth.assertThat(lastRecordedMotionDurationScale).isNull() }
     }
 
     @Test
     fun motionDurationScale_propagatedToCoroutines() {
-        val motionDurationScale = object : MotionDurationScale {
-            override val scaleFactor: Float get() = 0f
-        }
+        val motionDurationScale =
+            object : MotionDurationScale {
+                override val scaleFactor: Float
+                    get() = 0f
+            }
         runComposeUiTest(effectContext = motionDurationScale) {
             var lastRecordedMotionDurationScale: Float? = null
             setContent {
@@ -82,9 +80,7 @@
                 lastRecordedMotionDurationScale = context[MotionDurationScale]?.scaleFactor
             }
 
-            runOnIdle {
-                Truth.assertThat(lastRecordedMotionDurationScale).isEqualTo(0f)
-            }
+            runOnIdle { Truth.assertThat(lastRecordedMotionDurationScale).isEqualTo(0f) }
         }
     }
 
@@ -92,6 +88,7 @@
     fun customDispatcher_ignoredWhenNotSubclassOfTestDispatcher() {
         class CustomNonTestDispatcher : CoroutineDispatcher() {
             private var queuedTasks = mutableListOf<Runnable>()
+
             override fun dispatch(context: CoroutineContext, block: Runnable) {
                 queuedTasks.add(block)
             }
@@ -99,9 +96,7 @@
             fun runQueuedTasks() {
                 val tasksToRun = queuedTasks
                 queuedTasks = mutableListOf()
-                tasksToRun.forEach {
-                    it.run()
-                }
+                tasksToRun.forEach { it.run() }
             }
         }
 
@@ -109,9 +104,7 @@
 
         var expectCounter = 0
         fun expect(value: Int) {
-            Truth.assertWithMessage("Expected sequence")
-                .that(expectCounter)
-                .isEqualTo(value)
+            Truth.assertWithMessage("Expected sequence").that(expectCounter).isEqualTo(value)
             expectCounter++
         }
 
@@ -119,9 +112,7 @@
             setContent {
                 LaunchedEffect(Unit) {
                     expect(2)
-                    withFrameNanos {
-                        expect(4)
-                    }
+                    withFrameNanos { expect(4) }
                     expect(6)
                 }
             }
@@ -151,9 +142,7 @@
     fun customDispatcher_usedWhenSubclassesTestDispatcher() {
         var expectCounter = 0
         fun expect(value: Int) {
-            Truth.assertWithMessage("Expected sequence")
-                .that(expectCounter)
-                .isEqualTo(value)
+            Truth.assertWithMessage("Expected sequence").that(expectCounter).isEqualTo(value)
             expectCounter++
         }
 
@@ -168,9 +157,7 @@
             setContent {
                 LaunchedEffect(Unit) {
                     expect(2)
-                    withFrameNanos {
-                        expect(3)
-                    }
+                    withFrameNanos { expect(3) }
                     expect(4)
                 }
             }
@@ -188,7 +175,8 @@
     }
 
     private class TestCoroutineContextElement : CoroutineContext.Element {
-        override val key: CoroutineContext.Key<*> get() = Key
+        override val key: CoroutineContext.Key<*>
+            get() = Key
 
         companion object Key : CoroutineContext.Key<TestCoroutineContextElement>
     }
diff --git a/compose/ui/ui-test/src/androidInstrumentedTest/kotlin/androidx/compose/ui/test/DensityForcedSizeTest.kt b/compose/ui/ui-test/src/androidInstrumentedTest/kotlin/androidx/compose/ui/test/DensityForcedSizeTest.kt
index 68c00aa64..a11027a 100644
--- a/compose/ui/ui-test/src/androidInstrumentedTest/kotlin/androidx/compose/ui/test/DensityForcedSizeTest.kt
+++ b/compose/ui/ui-test/src/androidInstrumentedTest/kotlin/androidx/compose/ui/test/DensityForcedSizeTest.kt
@@ -32,8 +32,7 @@
 
 class DensityForcedSizeTest {
 
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
     @Test
     fun wrapsRequestedSize_smallPortraitAspectRatio() {
@@ -44,9 +43,7 @@
             density = LocalDensity.current
             DensityForcedSize(
                 size = DpSize(30.dp, 40.dp),
-                modifier = Modifier.onPlaced {
-                    layoutCoordinates = it
-                }
+                modifier = Modifier.onPlaced { layoutCoordinates = it }
             ) {
                 Spacer(modifier = Modifier.fillMaxSize())
             }
@@ -55,11 +52,7 @@
         // The size should be within 0.5 pixels of the specified size
         // Due to rounding, we can't expect to have the DensityForcedSize take exactly the requested
         // size which is true in normal Compose code as well
-        assertEquals(
-            with(density) { 30.dp.toPx() },
-            layoutCoordinates!!.size.width.toFloat(),
-            0.5f
-        )
+        assertEquals(with(density) { 30.dp.toPx() }, layoutCoordinates!!.size.width.toFloat(), 0.5f)
         assertEquals(
             with(density) { 40.dp.toPx() },
             layoutCoordinates!!.size.height.toFloat(),
@@ -76,9 +69,7 @@
             density = LocalDensity.current
             DensityForcedSize(
                 size = DpSize(40.dp, 30.dp),
-                modifier = Modifier.onPlaced {
-                    layoutCoordinates = it
-                }
+                modifier = Modifier.onPlaced { layoutCoordinates = it }
             ) {
                 Spacer(modifier = Modifier.fillMaxSize())
             }
@@ -87,11 +78,7 @@
         // The size should be within 0.5 pixels of the specified size
         // Due to rounding, we can't expect to have the DensityForcedSize take exactly the requested
         // size which is true in normal Compose code as well
-        assertEquals(
-            with(density) { 40.dp.toPx() },
-            layoutCoordinates!!.size.width.toFloat(),
-            0.5f
-        )
+        assertEquals(with(density) { 40.dp.toPx() }, layoutCoordinates!!.size.width.toFloat(), 0.5f)
         assertEquals(
             with(density) { 30.dp.toPx() },
             layoutCoordinates!!.size.height.toFloat(),
diff --git a/compose/ui/ui-test/src/androidInstrumentedTest/kotlin/androidx/compose/ui/test/DeviceConfigurationOverrideTest.kt b/compose/ui/ui-test/src/androidInstrumentedTest/kotlin/androidx/compose/ui/test/DeviceConfigurationOverrideTest.kt
index 18b77a1..f4ca4a9 100644
--- a/compose/ui/ui-test/src/androidInstrumentedTest/kotlin/androidx/compose/ui/test/DeviceConfigurationOverrideTest.kt
+++ b/compose/ui/ui-test/src/androidInstrumentedTest/kotlin/androidx/compose/ui/test/DeviceConfigurationOverrideTest.kt
@@ -53,8 +53,7 @@
 
 class DeviceConfigurationOverrideTest {
 
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
     @Test
     fun smallSizeOverride_onSmallerElements_isDisplayed() {
@@ -69,8 +68,7 @@
             }
         }
 
-        rule.onNodeWithTag("node")
-            .assertIsDisplayed()
+        rule.onNodeWithTag("node").assertIsDisplayed()
     }
 
     @Test
@@ -86,8 +84,7 @@
             }
         }
 
-        rule.onNodeWithTag("node")
-            .assertIsNotDisplayed()
+        rule.onNodeWithTag("node").assertIsNotDisplayed()
     }
 
     @Test
@@ -103,8 +100,7 @@
             }
         }
 
-        rule.onNodeWithTag("node")
-            .assertIsDisplayed()
+        rule.onNodeWithTag("node").assertIsDisplayed()
     }
 
     @Test
@@ -120,8 +116,7 @@
             }
         }
 
-        rule.onNodeWithTag("node")
-            .assertIsNotDisplayed()
+        rule.onNodeWithTag("node").assertIsNotDisplayed()
     }
 
     @Test
@@ -134,16 +129,17 @@
                 DeviceConfigurationOverride.ForcedSize(DpSize(30.dp, 40.dp))
             ) {
                 Spacer(
-                    modifier = Modifier.layout { measurable, constraints ->
-                        actualConstraints = constraints
-                        actualDensity = this
+                    modifier =
+                        Modifier.layout { measurable, constraints ->
+                            actualConstraints = constraints
+                            actualDensity = this
 
-                        val placeable = measurable.measure(constraints)
+                            val placeable = measurable.measure(constraints)
 
-                        layout(placeable.width, placeable.height) {
-                            placeable.placeRelative(0, 0)
+                            layout(placeable.width, placeable.height) {
+                                placeable.placeRelative(0, 0)
+                            }
                         }
-                    }
                 )
             }
         }
@@ -173,16 +169,17 @@
                 DeviceConfigurationOverride.ForcedSize(DpSize(40.dp, 30.dp))
             ) {
                 Spacer(
-                    modifier = Modifier.layout { measurable, constraints ->
-                        actualConstraints = constraints
-                        actualDensity = this
+                    modifier =
+                        Modifier.layout { measurable, constraints ->
+                            actualConstraints = constraints
+                            actualDensity = this
 
-                        val placeable = measurable.measure(constraints)
+                            val placeable = measurable.measure(constraints)
 
-                        layout(placeable.width, placeable.height) {
-                            placeable.placeRelative(0, 0)
+                            layout(placeable.width, placeable.height) {
+                                placeable.placeRelative(0, 0)
+                            }
                         }
-                    }
                 )
             }
         }
@@ -212,16 +209,17 @@
                 DeviceConfigurationOverride.ForcedSize(DpSize(3000.dp, 4000.dp))
             ) {
                 Spacer(
-                    modifier = Modifier.layout { measurable, constraints ->
-                        actualConstraints = constraints
-                        actualDensity = this
+                    modifier =
+                        Modifier.layout { measurable, constraints ->
+                            actualConstraints = constraints
+                            actualDensity = this
 
-                        val placeable = measurable.measure(constraints)
+                            val placeable = measurable.measure(constraints)
 
-                        layout(placeable.width, placeable.height) {
-                            placeable.placeRelative(0, 0)
+                            layout(placeable.width, placeable.height) {
+                                placeable.placeRelative(0, 0)
+                            }
                         }
-                    }
                 )
             }
         }
@@ -251,16 +249,17 @@
                 DeviceConfigurationOverride.ForcedSize(DpSize(4000.dp, 3000.dp))
             ) {
                 Spacer(
-                    modifier = Modifier.layout { measurable, constraints ->
-                        actualConstraints = constraints
-                        actualDensity = this
+                    modifier =
+                        Modifier.layout { measurable, constraints ->
+                            actualConstraints = constraints
+                            actualDensity = this
 
-                        val placeable = measurable.measure(constraints)
+                            val placeable = measurable.measure(constraints)
 
-                        layout(placeable.width, placeable.height) {
-                            placeable.placeRelative(0, 0)
+                            layout(placeable.width, placeable.height) {
+                                placeable.placeRelative(0, 0)
+                            }
                         }
-                    }
                 )
             }
         }
@@ -335,10 +334,7 @@
 
         // This is a strict equality for floating point values which is normally problematic, but
         // these should be precisely equal
-        assertEquals(
-            originalDensity.density,
-            overriddenDensity.density
-        )
+        assertEquals(originalDensity.density, overriddenDensity.density)
 
         // Convert the Configuration's density in DPI to the raw float multiplier
         val overriddenConfigurationDensityMultiplier =
@@ -374,10 +370,7 @@
 
         // This is a strict equality for floating point values which is normally problematic, but
         // these should be precisely equal
-        assertEquals(
-            originalDensity.density,
-            overriddenDensity.density
-        )
+        assertEquals(originalDensity.density, overriddenDensity.density)
 
         // Convert the Configuration's density in DPI to the raw float multiplier
         val overriddenConfigurationDensityMultiplier =
@@ -435,9 +428,7 @@
         lateinit var configuration: Configuration
 
         rule.setContent {
-            DeviceConfigurationOverride(
-                DeviceConfigurationOverride.FontScale(1.5f)
-            ) {
+            DeviceConfigurationOverride(DeviceConfigurationOverride.FontScale(1.5f)) {
                 density = LocalDensity.current
                 configuration = LocalConfiguration.current
             }
@@ -492,9 +483,7 @@
         lateinit var configuration: Configuration
 
         rule.setContent {
-            DeviceConfigurationOverride(
-                DeviceConfigurationOverride.DarkMode(true)
-            ) {
+            DeviceConfigurationOverride(DeviceConfigurationOverride.DarkMode(true)) {
                 configuration = LocalConfiguration.current
             }
         }
@@ -510,9 +499,7 @@
         lateinit var configuration: Configuration
 
         rule.setContent {
-            DeviceConfigurationOverride(
-                DeviceConfigurationOverride.DarkMode(false)
-            ) {
+            DeviceConfigurationOverride(DeviceConfigurationOverride.DarkMode(false)) {
                 configuration = LocalConfiguration.current
             }
         }
@@ -531,19 +518,15 @@
         lateinit var typefaceBold: android.graphics.Typeface
 
         rule.setContent {
-            DeviceConfigurationOverride(
-                DeviceConfigurationOverride.FontWeightAdjustment(500)
-            ) {
+            DeviceConfigurationOverride(DeviceConfigurationOverride.FontWeightAdjustment(500)) {
                 typefaceNormal =
-                    LocalFontFamilyResolver.current.resolveAsTypeface(
-                        FontFamily.SansSerif,
-                        FontWeight.Normal
-                    ).value
+                    LocalFontFamilyResolver.current
+                        .resolveAsTypeface(FontFamily.SansSerif, FontWeight.Normal)
+                        .value
                 typefaceBold =
-                    LocalFontFamilyResolver.current.resolveAsTypeface(
-                        FontFamily.SansSerif,
-                        FontWeight.Bold
-                    ).value
+                    LocalFontFamilyResolver.current
+                        .resolveAsTypeface(FontFamily.SansSerif, FontWeight.Bold)
+                        .value
                 configuration = LocalConfiguration.current
             }
         }
@@ -561,9 +544,7 @@
         lateinit var configuration: Configuration
 
         rule.setContent {
-            DeviceConfigurationOverride(
-                DeviceConfigurationOverride.RoundScreen(true)
-            ) {
+            DeviceConfigurationOverride(DeviceConfigurationOverride.RoundScreen(true)) {
                 configuration = LocalConfiguration.current
             }
         }
@@ -577,9 +558,7 @@
         lateinit var configuration: Configuration
 
         rule.setContent {
-            DeviceConfigurationOverride(
-                DeviceConfigurationOverride.RoundScreen(false)
-            ) {
+            DeviceConfigurationOverride(DeviceConfigurationOverride.RoundScreen(false)) {
                 configuration = LocalConfiguration.current
             }
         }
diff --git a/compose/ui/ui-test/src/androidInstrumentedTest/kotlin/androidx/compose/ui/test/ErrorMessagesTest.kt b/compose/ui/ui-test/src/androidInstrumentedTest/kotlin/androidx/compose/ui/test/ErrorMessagesTest.kt
index 53d6400..742a04c 100644
--- a/compose/ui/ui-test/src/androidInstrumentedTest/kotlin/androidx/compose/ui/test/ErrorMessagesTest.kt
+++ b/compose/ui/ui-test/src/androidInstrumentedTest/kotlin/androidx/compose/ui/test/ErrorMessagesTest.kt
@@ -49,76 +49,63 @@
 @RunWith(AndroidJUnit4::class)
 class ErrorMessagesTest {
 
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
     @Test
     fun findByTag_assertHasClickAction() {
-        rule.setContent {
-            ComposeSimpleCase()
-        }
+        rule.setContent { ComposeSimpleCase() }
 
-        rule.onNodeWithTag("MyButton")
-            .assertHasClickAction()
+        rule.onNodeWithTag("MyButton").assertHasClickAction()
     }
 
     @Test
     fun findByTag_assertExists_butNoElementFound() {
-        rule.setContent {
-            ComposeSimpleCase()
-        }
+        rule.setContent { ComposeSimpleCase() }
 
         expectErrorMessage(
             """
                 Failed: assertExists.
                 Reason: Expected exactly '1' node but could not find any node that satisfies: (TestTag = 'MyButton3')
-            """.trimIndent()
+            """
+                .trimIndent()
         ) {
-            rule.onNodeWithTag("MyButton3")
-                .assertExists()
+            rule.onNodeWithTag("MyButton3").assertExists()
         }
     }
 
     @Test
     fun findByTag_doClick_butNoElementFound() {
-        rule.setContent {
-            ComposeSimpleCase()
-        }
+        rule.setContent { ComposeSimpleCase() }
 
         expectErrorMessage(
             """
                 Failed to inject touch input.
                 Reason: Expected exactly '1' node but could not find any node that satisfies: (TestTag = 'MyButton3')
-            """.trimIndent()
-
+            """
+                .trimIndent()
         ) {
-            rule.onNodeWithTag("MyButton3")
-                .performClick()
+            rule.onNodeWithTag("MyButton3").performClick()
         }
     }
 
     @Test
     fun findByPredicate_doClick_butNoElementFound() {
-        rule.setContent {
-            ComposeSimpleCase()
-        }
+        rule.setContent { ComposeSimpleCase() }
 
         expectErrorMessage(
             """
                 Failed to inject touch input.
                 Reason: Expected exactly '1' node but could not find any node that satisfies: ((TestTag = 'MyButton3') && (OnClick is defined))
-            """.trimIndent()
+            """
+                .trimIndent()
         ) {
-            rule.onNode(hasTestTag("MyButton3") and hasClickAction())
-                .performClick()
+            rule.onNode(hasTestTag("MyButton3") and hasClickAction()).performClick()
         }
     }
 
     @Test
     fun findByText_doClick_butMoreThanOneElementFound() {
-        rule.setContentWithoutMinimumTouchTarget {
-            ComposeSimpleCase()
-        }
+        rule.setContentWithoutMinimumTouchTarget { ComposeSimpleCase() }
 
         expectErrorMessageStartsWith(
             """
@@ -126,35 +113,31 @@
                 Reason: Expected exactly '1' node but found '2' nodes that satisfy: (Text + EditableText contains 'Toggle' (ignoreCase: false))
                 Nodes found:
                 1) Node #X at (l=X, t=X, r=X, b=X)px, Tag: 'MyButton'
-            """.trimIndent()
+            """
+                .trimIndent()
         ) {
-            rule.onNodeWithText("Toggle")
-                .performClick()
+            rule.onNodeWithText("Toggle").performClick()
         }
     }
 
     @Test
     fun findByTag_callSemanticsAction_butElementDoesNotExist() {
-        rule.setContent {
-            ComposeSimpleCase()
-        }
+        rule.setContent { ComposeSimpleCase() }
 
         expectErrorMessageStartsWith(
             """
                 Failed to perform OnClick action.
                 Reason: Expected exactly '1' node but could not find any node that satisfies: (TestTag = 'MyButton3')
-            """.trimIndent()
+            """
+                .trimIndent()
         ) {
-            rule.onNodeWithTag("MyButton3")
-                .performSemanticsAction(SemanticsActions.OnClick)
+            rule.onNodeWithTag("MyButton3").performSemanticsAction(SemanticsActions.OnClick)
         }
     }
 
     @Test
     fun findByTag_assertDoesNotExist_butElementFound() {
-        rule.setContentWithoutMinimumTouchTarget {
-            ComposeSimpleCase()
-        }
+        rule.setContentWithoutMinimumTouchTarget { ComposeSimpleCase() }
 
         expectErrorMessageStartsWith(
             """
@@ -162,18 +145,16 @@
                 Reason: Did not expect any node but found '1' node that satisfies: (TestTag = 'MyButton')
                 Node found:
                 Node #X at (l=X, t=X, r=X, b=X)px, Tag: 'MyButton'
-            """.trimIndent()
+            """
+                .trimIndent()
         ) {
-            rule.onNodeWithTag("MyButton")
-                .assertDoesNotExist()
+            rule.onNodeWithTag("MyButton").assertDoesNotExist()
         }
     }
 
     @Test
     fun findAll_assertMultiple_butIsDifferentAmount() {
-        rule.setContentWithoutMinimumTouchTarget {
-            ComposeSimpleCase()
-        }
+        rule.setContentWithoutMinimumTouchTarget { ComposeSimpleCase() }
 
         expectErrorMessageStartsWith(
             """
@@ -181,41 +162,35 @@
                 Reason: Expected '3' nodes but found '2' nodes that satisfy: (Text + EditableText contains 'Toggle' (ignoreCase: false))
                 Nodes found:
                 1) Node #X at (l=X, t=X, r=X, b=X)px
-            """.trimIndent()
+            """
+                .trimIndent()
         ) {
-            rule.onAllNodesWithText("Toggle")
-                .assertCountEquals(3)
+            rule.onAllNodesWithText("Toggle").assertCountEquals(3)
         }
     }
 
     @Test
     fun findAll_assertMultiple_butIsZero() {
-        rule.setContent {
-            ComposeSimpleCase()
-        }
+        rule.setContent { ComposeSimpleCase() }
 
         expectErrorMessage(
             """
                 Failed to assert count of nodes.
                 Reason: Expected '3' nodes but could not find any node that satisfies: (Text + EditableText contains 'Toggle2' (ignoreCase: false))
-            """.trimIndent()
+            """
+                .trimIndent()
         ) {
-            rule.onAllNodesWithText("Toggle2")
-                .assertCountEquals(3)
+            rule.onAllNodesWithText("Toggle2").assertCountEquals(3)
         }
     }
 
     @Test
     fun findOne_hideIt_tryToClickIt_butDoesNotExist() {
-        rule.setContent {
-            ComposeTextToHideCase()
-        }
+        rule.setContent { ComposeTextToHideCase() }
 
-        val node = rule.onNodeWithText("Hello")
-            .assertExists()
+        val node = rule.onNodeWithText("Hello").assertExists()
 
-        rule.onNodeWithTag("MyButton")
-            .performClick()
+        rule.onNodeWithTag("MyButton").performClick()
 
         expectErrorMessage(
             """
@@ -226,7 +201,8 @@
                 Actions = [SetTextSubstitution, ShowTextSubstitution, ClearTextSubstitution, GetTextLayoutResult]
                 Has 1 sibling
                 Original selector: Text + EditableText contains 'Hello' (ignoreCase: false)
-            """.trimIndent()
+            """
+                .trimIndent()
         ) {
             node.performClick()
         }
@@ -234,16 +210,12 @@
 
     @Test
     fun findOne_removeIt_assertExists_butDoesNotExist() {
-        rule.setContent {
-            ComposeTextToHideCase()
-        }
+        rule.setContent { ComposeTextToHideCase() }
 
-        val node = rule.onNodeWithText("Hello")
-            .assertExists()
+        val node = rule.onNodeWithText("Hello").assertExists()
 
         // Hide text
-        rule.onNodeWithTag("MyButton")
-            .performClick()
+        rule.onNodeWithTag("MyButton").performClick()
 
         expectErrorMessage(
             """
@@ -254,7 +226,8 @@
                 Actions = [SetTextSubstitution, ShowTextSubstitution, ClearTextSubstitution, GetTextLayoutResult]
                 Has 1 sibling
                 Original selector: Text + EditableText contains 'Hello' (ignoreCase: false)
-            """.trimIndent()
+            """
+                .trimIndent()
         ) {
             node.assertExists()
         }
@@ -262,16 +235,12 @@
 
     @Test
     fun findOne_removeIt_assertHasClickAction_butDoesNotExist() {
-        rule.setContent {
-            ComposeTextToHideCase()
-        }
+        rule.setContent { ComposeTextToHideCase() }
 
-        val node = rule.onNodeWithText("Hello")
-            .assertExists()
+        val node = rule.onNodeWithText("Hello").assertExists()
 
         // Hide text
-        rule.onNodeWithTag("MyButton")
-            .performClick()
+        rule.onNodeWithTag("MyButton").performClick()
 
         expectErrorMessage(
             """
@@ -282,7 +251,8 @@
                 Actions = [SetTextSubstitution, ShowTextSubstitution, ClearTextSubstitution, GetTextLayoutResult]
                 Has 1 sibling
                 Original selector: Text + EditableText contains 'Hello' (ignoreCase: false)
-            """.trimIndent()
+            """
+                .trimIndent()
         ) {
             node.assertHasClickAction()
         }
@@ -290,54 +260,49 @@
 
     @Test
     fun findByTag_assertExists_noElementFoundButFoundInMerged() {
-        rule.setContent {
-            ComposeMerged()
-        }
+        rule.setContent { ComposeMerged() }
 
         expectErrorMessage(
             """
                 Failed: assertExists.
                 Reason: Expected exactly '1' node but could not find any node that satisfies: (Text + EditableText contains 'Banana' (ignoreCase: false))
                 However, the unmerged tree contains '1' node that matches. Are you missing `useUnmergedNode = true` in your finder?
-            """.trimIndent()
+            """
+                .trimIndent()
         ) {
-            rule.onNodeWithText("Banana")
-                .assertExists()
+            rule.onNodeWithText("Banana").assertExists()
         }
     }
+
     @Test
     fun findByTag_assertExists_NoElementFoundButMultipleFoundInMerged() {
-        rule.setContent {
-            ComposeMerged(5)
-        }
+        rule.setContent { ComposeMerged(5) }
 
         expectErrorMessage(
             """
                 Failed: assertExists.
                 Reason: Expected exactly '1' node but could not find any node that satisfies: (Text + EditableText contains 'Banana' (ignoreCase: false))
                 However, the unmerged tree contains '5' nodes that match. Are you missing `useUnmergedNode = true` in your finder?
-            """.trimIndent()
+            """
+                .trimIndent()
         ) {
-            rule.onNodeWithText("Banana")
-                .assertExists()
+            rule.onNodeWithText("Banana").assertExists()
         }
     }
 
     @Test
     fun findByTag_performAction_NoElementFoundButFoundInMerged() {
-        rule.setContent {
-            ComposeMerged()
-        }
+        rule.setContent { ComposeMerged() }
 
         expectErrorMessage(
             """
                 Failed to inject touch input.
                 Reason: Expected exactly '1' node but could not find any node that satisfies: (Text + EditableText contains 'Banana' (ignoreCase: false))
                 However, the unmerged tree contains '1' node that matches. Are you missing `useUnmergedNode = true` in your finder?
-            """.trimIndent()
+            """
+                .trimIndent()
         ) {
-            rule.onNodeWithText("Banana")
-                .performClick()
+            rule.onNodeWithText("Banana").performClick()
         }
     }
 
@@ -345,12 +310,8 @@
     fun ComposeSimpleCase() {
         MaterialTheme {
             Column {
-                TestButton(Modifier.testTag("MyButton")) {
-                    Text("Toggle")
-                }
-                TestButton(Modifier.testTag("MyButton2")) {
-                    Text("Toggle")
-                }
+                TestButton(Modifier.testTag("MyButton")) { Text("Toggle") }
+                TestButton(Modifier.testTag("MyButton2")) { Text("Toggle") }
             }
         }
     }
@@ -377,13 +338,12 @@
     fun ComposeMerged(numberOfTexts: Int = 1) {
         Column {
             TestButton(
-                modifier = Modifier
-                    .testTag("MyButton")
-                    .clearAndSetSemantics { text = AnnotatedString("Not Banana") }
+                modifier =
+                    Modifier.testTag("MyButton").clearAndSetSemantics {
+                        text = AnnotatedString("Not Banana")
+                    }
             ) {
-                repeat(numberOfTexts) {
-                    Text("Banana")
-                }
+                repeat(numberOfTexts) { Text("Banana") }
             }
         }
     }
@@ -402,18 +362,17 @@
     }
 }
 
-fun ComposeContentTestRule.setContentWithoutMinimumTouchTarget(
-    composable: @Composable () -> Unit
-) {
+fun ComposeContentTestRule.setContentWithoutMinimumTouchTarget(composable: @Composable () -> Unit) {
     setContent {
         val oldViewConfiguration = LocalViewConfiguration.current
-        val viewConfiguration = TestViewConfiguration(
-            longPressTimeoutMillis = oldViewConfiguration.longPressTimeoutMillis,
-            doubleTapTimeoutMillis = oldViewConfiguration.doubleTapTimeoutMillis,
-            doubleTapMinTimeMillis = oldViewConfiguration.doubleTapMinTimeMillis,
-            touchSlop = oldViewConfiguration.touchSlop,
-            minimumTouchTargetSize = DpSize.Zero
-        )
+        val viewConfiguration =
+            TestViewConfiguration(
+                longPressTimeoutMillis = oldViewConfiguration.longPressTimeoutMillis,
+                doubleTapTimeoutMillis = oldViewConfiguration.doubleTapTimeoutMillis,
+                doubleTapMinTimeMillis = oldViewConfiguration.doubleTapMinTimeMillis,
+                touchSlop = oldViewConfiguration.touchSlop,
+                minimumTouchTargetSize = DpSize.Zero
+            )
         CompositionLocalProvider(
             LocalViewConfiguration provides viewConfiguration,
             content = composable
diff --git a/compose/ui/ui-test/src/androidInstrumentedTest/kotlin/androidx/compose/ui/test/FindAllTest.kt b/compose/ui/ui-test/src/androidInstrumentedTest/kotlin/androidx/compose/ui/test/FindAllTest.kt
index 2479e17..c7797d9 100644
--- a/compose/ui/ui-test/src/androidInstrumentedTest/kotlin/androidx/compose/ui/test/FindAllTest.kt
+++ b/compose/ui/ui-test/src/androidInstrumentedTest/kotlin/androidx/compose/ui/test/FindAllTest.kt
@@ -33,8 +33,7 @@
 @RunWith(AndroidJUnit4::class)
 class FindAllTest {
 
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
     @Test
     fun findAllTest_twoComponents_areChecked() {
@@ -49,12 +48,10 @@
             }
         }
 
-        rule.onAllNodes(isOn())
-            .assertCountEquals(2)
-            .apply {
-                get(0).assertIsOn()
-                get(1).assertIsOn()
-            }
+        rule.onAllNodes(isOn()).assertCountEquals(2).apply {
+            get(0).assertIsOn()
+            get(1).assertIsOn()
+        }
     }
 
     @Test
@@ -65,29 +62,17 @@
             MaterialTheme {
                 Surface {
                     Column {
-                        Checkbox(
-                            checked = checked1,
-                            onCheckedChange = onCheckedChange1
-                        )
-                        Checkbox(
-                            checked = checked2,
-                            onCheckedChange = onCheckedChange2
-                        )
+                        Checkbox(checked = checked1, onCheckedChange = onCheckedChange1)
+                        Checkbox(checked = checked2, onCheckedChange = onCheckedChange2)
                     }
                 }
             }
         }
 
-        rule.onAllNodes(isToggleable())
-            .assertCountEquals(2)
-            .apply {
-                get(0)
-                    .performClick()
-                    .assertIsOn()
-                get(1)
-                    .performClick()
-                    .assertIsOn()
-            }
+        rule.onAllNodes(isToggleable()).assertCountEquals(2).apply {
+            get(0).performClick().assertIsOn()
+            get(1).performClick().assertIsOn()
+        }
     }
 
     @Test
@@ -103,8 +88,7 @@
             }
         }
 
-        rule.onAllNodes(isOff())
-            .assertCountEquals(0)
+        rule.onAllNodes(isOff()).assertCountEquals(0)
     }
 
     @Test
@@ -116,26 +100,20 @@
                     val (checked2, onCheckedChange2) = remember { mutableStateOf(false) }
 
                     Column {
-                        Checkbox(
-                            checked = checked1,
-                            onCheckedChange = onCheckedChange1
-                        )
-                        Checkbox(
-                            checked = checked2,
-                            onCheckedChange = onCheckedChange2
-                        )
+                        Checkbox(checked = checked1, onCheckedChange = onCheckedChange1)
+                        Checkbox(checked = checked2, onCheckedChange = onCheckedChange2)
                     }
                 }
             }
         }
 
-        rule.onAllNodes(isToggleable()).apply {
-            get(0)
-                .performClick()
-                .assertIsOn()
-            get(1)
-                .assertIsOff()
-        }.assertCountEquals(2)
+        rule
+            .onAllNodes(isToggleable())
+            .apply {
+                get(0).performClick().assertIsOn()
+                get(1).assertIsOff()
+            }
+            .assertCountEquals(2)
     }
 
     @Test
@@ -146,43 +124,22 @@
                     val (checked, onCheckedChange) = remember { mutableStateOf(false) }
 
                     Column {
-                        Checkbox(
-                            checked = checked,
-                            onCheckedChange = {
-                                onCheckedChange(it)
-                            }
-                        )
-                        Checkbox(
-                            checked = false,
-                            onCheckedChange = {},
-                            enabled = false
-                        )
+                        Checkbox(checked = checked, onCheckedChange = { onCheckedChange(it) })
+                        Checkbox(checked = false, onCheckedChange = {}, enabled = false)
 
                         if (checked) {
-                            Checkbox(
-                                checked = false,
-                                onCheckedChange = {},
-                                enabled = false
-                            )
+                            Checkbox(checked = false, onCheckedChange = {}, enabled = false)
                         }
                     }
                 }
             }
         }
 
-        rule.onAllNodes(isToggleable())
-            .assertCountEquals(2).apply {
-                get(0)
-                    .assertIsOff()
-                    .performClick()
-                    .assertIsOn()
-            }
+        rule.onAllNodes(isToggleable()).assertCountEquals(2).apply {
+            get(0).assertIsOff().performClick().assertIsOn()
+        }
 
-        rule.onAllNodes(isToggleable())
-            .assertCountEquals(3).apply {
-                get(2)
-                    .assertIsOff()
-            }
+        rule.onAllNodes(isToggleable()).assertCountEquals(3).apply { get(2).assertIsOff() }
     }
 
     @Test
@@ -193,33 +150,18 @@
                     val (checked, onCheckedChange) = remember { mutableStateOf(false) }
 
                     Column {
-                        Checkbox(
-                            checked = checked,
-                            onCheckedChange = {
-                                onCheckedChange(it)
-                            }
-                        )
+                        Checkbox(checked = checked, onCheckedChange = { onCheckedChange(it) })
                         if (!checked) {
-                            Checkbox(
-                                checked = false,
-                                onCheckedChange = {},
-                                enabled = false
-                            )
+                            Checkbox(checked = false, onCheckedChange = {}, enabled = false)
                         }
                     }
                 }
             }
         }
 
-        rule.onAllNodes(isToggleable())
-            .assertCountEquals(2)
-            .apply {
-                get(0)
-                    .assertIsOff()
-                    .performClick()
-                    .assertIsOn()
-                get(1)
-                    .assertDoesNotExist()
-            }
+        rule.onAllNodes(isToggleable()).assertCountEquals(2).apply {
+            get(0).assertIsOff().performClick().assertIsOn()
+            get(1).assertDoesNotExist()
+        }
     }
 }
diff --git a/compose/ui/ui-test/src/androidInstrumentedTest/kotlin/androidx/compose/ui/test/FindInPopupTest.kt b/compose/ui/ui-test/src/androidInstrumentedTest/kotlin/androidx/compose/ui/test/FindInPopupTest.kt
index 0ce4aaa..2e989a2 100644
--- a/compose/ui/ui-test/src/androidInstrumentedTest/kotlin/androidx/compose/ui/test/FindInPopupTest.kt
+++ b/compose/ui/ui-test/src/androidInstrumentedTest/kotlin/androidx/compose/ui/test/FindInPopupTest.kt
@@ -34,17 +34,14 @@
 @MediumTest
 @RunWith(AndroidJUnit4::class)
 class FindInPopupTest {
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
     @Test
     fun test() {
         rule.setContent {
             Box(Modifier.testTag(contentTag))
 
-            Popup(alignment = Alignment.Center) {
-                Box(Modifier.testTag(popupTag))
-            }
+            Popup(alignment = Alignment.Center) { Box(Modifier.testTag(popupTag)) }
         }
         rule.onNodeWithTag(contentTag).assertExists()
         rule.onNodeWithTag(popupTag).assertExists()
diff --git a/compose/ui/ui-test/src/androidInstrumentedTest/kotlin/androidx/compose/ui/test/FindersTest.kt b/compose/ui/ui-test/src/androidInstrumentedTest/kotlin/androidx/compose/ui/test/FindersTest.kt
index f27d346..fa66a20 100644
--- a/compose/ui/ui-test/src/androidInstrumentedTest/kotlin/androidx/compose/ui/test/FindersTest.kt
+++ b/compose/ui/ui-test/src/androidInstrumentedTest/kotlin/androidx/compose/ui/test/FindersTest.kt
@@ -40,14 +40,11 @@
 @RunWith(AndroidJUnit4::class)
 class FindersTest {
 
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
     @Test
     fun findAll_zeroOutOfOne_findsNone() {
-        rule.setContent {
-            BoundaryNode { testTag = "not_myTestTag" }
-        }
+        rule.setContent { BoundaryNode { testTag = "not_myTestTag" } }
 
         rule.onAllNodes(hasTestTag("myTestTag")).assertCountEquals(0)
     }
@@ -59,7 +56,8 @@
             BoundaryNode { testTag = "myTestTag2" }
         }
 
-        rule.onAllNodes(hasTestTag("myTestTag"))
+        rule
+            .onAllNodes(hasTestTag("myTestTag"))
             .assertCountEquals(1)
             .onFirst()
             .assert(hasTestTag("myTestTag"))
@@ -72,28 +70,22 @@
             BoundaryNode { testTag = "myTestTag" }
         }
 
-        rule.onAllNodes(hasTestTag("myTestTag"))
-            .assertCountEquals(2)
-            .apply {
-                get(0).assert(hasTestTag("myTestTag"))
-                get(1).assert(hasTestTag("myTestTag"))
-            }
+        rule.onAllNodes(hasTestTag("myTestTag")).assertCountEquals(2).apply {
+            get(0).assert(hasTestTag("myTestTag"))
+            get(1).assert(hasTestTag("myTestTag"))
+        }
     }
 
     @Test
     fun findByText_matches() {
-        rule.setContent {
-            BoundaryNode { text = AnnotatedString("Hello World") }
-        }
+        rule.setContent { BoundaryNode { text = AnnotatedString("Hello World") } }
 
         rule.onNodeWithText("Hello World").assertExists()
     }
 
     @Test
     fun findByText_withEditableText_matches() {
-        rule.setContent {
-            BoundaryNode { editableText = AnnotatedString("Hello World") }
-        }
+        rule.setContent { BoundaryNode { editableText = AnnotatedString("Hello World") } }
 
         rule.onNodeWithText("Hello World").assertExists()
     }
@@ -101,7 +93,7 @@
     @Test
     fun findByText_merged_matches() {
         rule.setContent {
-            Box(Modifier.semantics(mergeDescendants = true) { }) {
+            Box(Modifier.semantics(mergeDescendants = true) {}) {
                 Text("Hello")
                 Text("World")
             }
@@ -115,9 +107,7 @@
 
     @Test(expected = AssertionError::class)
     fun findByText_fails() {
-        rule.setContent {
-            BoundaryNode { text = AnnotatedString("Hello World") }
-        }
+        rule.setContent { BoundaryNode { text = AnnotatedString("Hello World") } }
 
         // Need to assert exists or it won't fail
         rule.onNodeWithText("World").assertExists()
@@ -126,7 +116,7 @@
     @Test(expected = AssertionError::class)
     fun findByText_merged_fails() {
         rule.setContent {
-            Box(Modifier.semantics(mergeDescendants = true) { }) {
+            Box(Modifier.semantics(mergeDescendants = true) {}) {
                 Text("Hello")
                 Text("World")
             }
@@ -137,9 +127,7 @@
 
     @Test
     fun findBySubstring_matches() {
-        rule.setContent {
-            BoundaryNode { text = AnnotatedString("Hello World") }
-        }
+        rule.setContent { BoundaryNode { text = AnnotatedString("Hello World") } }
 
         rule.onNodeWithText("World", substring = true).assertExists()
     }
@@ -147,7 +135,7 @@
     @Test
     fun findBySubstring_merged_matches() {
         rule.setContent {
-            Box(Modifier.semantics(mergeDescendants = true) { }) {
+            Box(Modifier.semantics(mergeDescendants = true) {}) {
                 Text("Hello")
                 Text("World")
             }
@@ -159,18 +147,14 @@
 
     @Test
     fun findBySubstring_ignoreCase_matches() {
-        rule.setContent {
-            BoundaryNode { text = AnnotatedString("Hello World") }
-        }
+        rule.setContent { BoundaryNode { text = AnnotatedString("Hello World") } }
 
         rule.onNodeWithText("world", substring = true, ignoreCase = true).assertExists()
     }
 
     @Test
     fun findBySubstring_wrongCase_fails() {
-        rule.setContent {
-            BoundaryNode { text = AnnotatedString("Hello World") }
-        }
+        rule.setContent { BoundaryNode { text = AnnotatedString("Hello World") } }
 
         expectError<AssertionError> {
             // Need to assert exists or it won't fetch nodes
@@ -193,9 +177,7 @@
 
     @Test
     fun findByContentDescription_matches() {
-        rule.setContent {
-            BoundaryNode { contentDescription = "Hello World" }
-        }
+        rule.setContent { BoundaryNode { contentDescription = "Hello World" } }
 
         rule.onNodeWithContentDescription("Hello World").assertExists()
     }
@@ -203,7 +185,7 @@
     @Test
     fun findByContentDescription_merged_matches() {
         rule.setContent {
-            Box(Modifier.semantics(mergeDescendants = true) { }) {
+            Box(Modifier.semantics(mergeDescendants = true) {}) {
                 Box(Modifier.semantics { contentDescription = "Hello" })
                 Box(Modifier.semantics { contentDescription = "World" })
             }
@@ -217,9 +199,7 @@
 
     @Test(expected = AssertionError::class)
     fun findByContentDescription_fails() {
-        rule.setContent {
-            BoundaryNode { contentDescription = "Hello World" }
-        }
+        rule.setContent { BoundaryNode { contentDescription = "Hello World" } }
 
         rule.onNodeWithContentDescription("Hello").assertExists()
     }
@@ -227,7 +207,7 @@
     @Test(expected = AssertionError::class)
     fun findByContentDescription_merged_fails() {
         rule.setContent {
-            Box(Modifier.semantics(mergeDescendants = true) { }) {
+            Box(Modifier.semantics(mergeDescendants = true) {}) {
                 Box(Modifier.semantics { contentDescription = "Hello" })
                 Box(Modifier.semantics { contentDescription = "World" })
             }
@@ -238,9 +218,7 @@
 
     @Test
     fun findByContentDescription_substring_matches() {
-        rule.setContent {
-            BoundaryNode { contentDescription = "Hello World" }
-        }
+        rule.setContent { BoundaryNode { contentDescription = "Hello World" } }
 
         rule.onNodeWithContentDescription("World", substring = true).assertExists()
     }
@@ -248,7 +226,7 @@
     @Test
     fun findByContentDescription_merged_substring_matches() {
         rule.setContent {
-            Box(Modifier.semantics(mergeDescendants = true) { }) {
+            Box(Modifier.semantics(mergeDescendants = true) {}) {
                 Box(Modifier.semantics { contentDescription = "Hello" })
                 Box(Modifier.semantics { contentDescription = "World" })
             }
@@ -259,21 +237,17 @@
     }
 
     fun findByContentDescription_substring_noResult() {
-        rule.setContent {
-            BoundaryNode { contentDescription = "Hello World" }
-        }
+        rule.setContent { BoundaryNode { contentDescription = "Hello World" } }
 
-        rule.onNodeWithContentDescription("world", substring = true)
-            .assertDoesNotExist()
+        rule.onNodeWithContentDescription("world", substring = true).assertDoesNotExist()
     }
 
     @Test
     fun findByContentDescription_substring_ignoreCase_matches() {
-        rule.setContent {
-            BoundaryNode { contentDescription = "Hello World" }
-        }
+        rule.setContent { BoundaryNode { contentDescription = "Hello World" } }
 
-        rule.onNodeWithContentDescription("world", substring = true, ignoreCase = true)
+        rule
+            .onNodeWithContentDescription("world", substring = true, ignoreCase = true)
             .assertExists()
     }
 
diff --git a/compose/ui/ui-test/src/androidInstrumentedTest/kotlin/androidx/compose/ui/test/FocusActionsTest.kt b/compose/ui/ui-test/src/androidInstrumentedTest/kotlin/androidx/compose/ui/test/FocusActionsTest.kt
index 9a98258..d3abd90 100644
--- a/compose/ui/ui-test/src/androidInstrumentedTest/kotlin/androidx/compose/ui/test/FocusActionsTest.kt
+++ b/compose/ui/ui-test/src/androidInstrumentedTest/kotlin/androidx/compose/ui/test/FocusActionsTest.kt
@@ -32,26 +32,15 @@
 @SmallTest
 @RunWith(AndroidJUnit4::class)
 class FocusActionsTest {
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
     private fun tag(index: Int): String = "tag_$index"
 
     @Test
     fun requestFocus_focuses() {
         rule.setContent {
-            Box(
-                Modifier
-                    .size(1.dp)
-                    .testTag(tag(0))
-                    .focusable()
-            )
-            Box(
-                Modifier
-                    .size(1.dp)
-                    .testTag(tag(1))
-                    .focusable()
-            )
+            Box(Modifier.size(1.dp).testTag(tag(0)).focusable())
+            Box(Modifier.size(1.dp).testTag(tag(1)).focusable())
         }
 
         rule.onNodeWithTag(tag(0)).assertIsNotFocused()
diff --git a/compose/ui/ui-test/src/androidInstrumentedTest/kotlin/androidx/compose/ui/test/GlobalAssertionsTest.kt b/compose/ui/ui-test/src/androidInstrumentedTest/kotlin/androidx/compose/ui/test/GlobalAssertionsTest.kt
index 6b00a30..4780982 100644
--- a/compose/ui/ui-test/src/androidInstrumentedTest/kotlin/androidx/compose/ui/test/GlobalAssertionsTest.kt
+++ b/compose/ui/ui-test/src/androidInstrumentedTest/kotlin/androidx/compose/ui/test/GlobalAssertionsTest.kt
@@ -37,12 +37,9 @@
 @RunWith(AndroidJUnit4::class)
 @OptIn(ExperimentalTestApi::class)
 class GlobalAssertionsTest {
-    @get:Rule
-    val composeTestRule = createComposeRule()
+    @get:Rule val composeTestRule = createComposeRule()
 
-    @Before
-    fun setUp() {
-    }
+    @Before fun setUp() {}
 
     @Test
     fun performClick_withGlobalAssertion_triggersGlobalAssertion() {
diff --git a/compose/ui/ui-test/src/androidInstrumentedTest/kotlin/androidx/compose/ui/test/InfiniteAnimationTest.kt b/compose/ui/ui-test/src/androidInstrumentedTest/kotlin/androidx/compose/ui/test/InfiniteAnimationTest.kt
index cfb8722..d579f7f 100644
--- a/compose/ui/ui-test/src/androidInstrumentedTest/kotlin/androidx/compose/ui/test/InfiniteAnimationTest.kt
+++ b/compose/ui/ui-test/src/androidInstrumentedTest/kotlin/androidx/compose/ui/test/InfiniteAnimationTest.kt
@@ -40,8 +40,7 @@
 @LargeTest
 @RunWith(AndroidJUnit4::class)
 class InfiniteAnimationTest {
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
     @Test
     fun testInfiniteTransition_finishes() {
@@ -88,10 +87,11 @@
         // If animating, animation moves by 8.dp per frame
         rule.setContent {
             val transition = rememberInfiniteTransition()
-            val animationSpec = infiniteRepeatable<Float>(
-                tween(durationMillis = 200, easing = LinearEasing),
-                RepeatMode.Reverse
-            )
+            val animationSpec =
+                infiniteRepeatable<Float>(
+                    tween(durationMillis = 200, easing = LinearEasing),
+                    RepeatMode.Reverse
+                )
             val offset = transition.animateFloat(0f, 100f, animationSpec)
             ClickableTestBox(Modifier.padding(start = offset.value.dp))
         }
@@ -103,8 +103,8 @@
         rule.onNodeWithTag(ClickableTestBox.defaultTag).assertLeftPositionInRootIsEqualTo(0.dp)
         rule.mainClock.advanceTimeByFrame()
         // 3rd composition: animation running, one frame done
-        rule.onNodeWithTag(ClickableTestBox.defaultTag).assertLeftPositionInRootIsEqualTo(
-            if (autoAdvance) 0.dp else 8.dp
-        )
+        rule
+            .onNodeWithTag(ClickableTestBox.defaultTag)
+            .assertLeftPositionInRootIsEqualTo(if (autoAdvance) 0.dp else 8.dp)
     }
 }
diff --git a/compose/ui/ui-test/src/androidInstrumentedTest/kotlin/androidx/compose/ui/test/IsDisplayedTest.kt b/compose/ui/ui-test/src/androidInstrumentedTest/kotlin/androidx/compose/ui/test/IsDisplayedTest.kt
index 45029f7..541555f 100644
--- a/compose/ui/ui-test/src/androidInstrumentedTest/kotlin/androidx/compose/ui/test/IsDisplayedTest.kt
+++ b/compose/ui/ui-test/src/androidInstrumentedTest/kotlin/androidx/compose/ui/test/IsDisplayedTest.kt
@@ -62,21 +62,19 @@
 @MediumTest
 @RunWith(Parameterized::class)
 class IsDisplayedTest(val config: TestConfig) {
-    data class TestConfig(
-        val activityClass: Class<out ComponentActivity>
-    )
+    data class TestConfig(val activityClass: Class<out ComponentActivity>)
 
     companion object {
         @JvmStatic
         @Parameterized.Parameters(name = "{0}")
-        fun createTestSet(): List<TestConfig> = listOf(
-            TestConfig(ComponentActivity::class.java),
-            TestConfig(ActivityWithActionBar::class.java)
-        )
+        fun createTestSet(): List<TestConfig> =
+            listOf(
+                TestConfig(ComponentActivity::class.java),
+                TestConfig(ActivityWithActionBar::class.java)
+            )
     }
 
-    @get:Rule
-    val rule = createAndroidComposeRule(config.activityClass)
+    @get:Rule val rule = createAndroidComposeRule(config.activityClass)
 
     private val colors = listOf(Color.Red, Color.Green, Color.Blue)
 
@@ -85,11 +83,11 @@
         BoundaryNode("item$i") {
             Box(
                 modifier =
-                with(Modifier) { width?.let { requiredWidth(it) } ?: fillMaxWidth() }
-                    .then(
-                        with(Modifier) { height?.let { requiredHeight(it) } ?: fillMaxHeight() }
-                    )
-                    .background(colors[i % colors.size])
+                    with(Modifier) { width?.let { requiredWidth(it) } ?: fillMaxWidth() }
+                        .then(
+                            with(Modifier) { height?.let { requiredHeight(it) } ?: fillMaxHeight() }
+                        )
+                        .background(colors[i % colors.size])
             )
         }
     }
@@ -99,9 +97,7 @@
         Layout(content = content) { measurables, constraints ->
             if (place) {
                 val placeable = measurables[0].measure(constraints)
-                layout(placeable.width, placeable.height) {
-                    placeable.placeRelative(0, 0)
-                }
+                layout(placeable.width, placeable.height) { placeable.placeRelative(0, 0) }
             } else {
                 layout(0, 0) {}
             }
@@ -111,33 +107,23 @@
     @Test
     fun componentInScrollable_isDisplayed() {
         setContent {
-            Column(
-                modifier = Modifier
-                    .requiredSize(100.dp)
-                    .verticalScroll(rememberScrollState())
-            ) {
+            Column(modifier = Modifier.requiredSize(100.dp).verticalScroll(rememberScrollState())) {
                 repeat(10) { Item(it, height = 30.dp) }
             }
         }
 
-        rule.onNodeWithTag("item0")
-            .assertIsDisplayed()
+        rule.onNodeWithTag("item0").assertIsDisplayed()
     }
 
     @Test
     fun componentInScrollable_isNotDisplayed() {
         setContent {
-            Column(
-                modifier = Modifier
-                    .requiredSize(100.dp)
-                    .verticalScroll(rememberScrollState())
-            ) {
+            Column(modifier = Modifier.requiredSize(100.dp).verticalScroll(rememberScrollState())) {
                 repeat(10) { Item(it, height = 30.dp) }
             }
         }
 
-        rule.onNodeWithTag("item4")
-            .assertIsNotDisplayed()
+        rule.onNodeWithTag("item4").assertIsNotDisplayed()
     }
 
     @Test
@@ -151,15 +137,11 @@
             }
         }
 
-        rule.onNodeWithTag("item0")
-            .assertIsDisplayed()
+        rule.onNodeWithTag("item0").assertIsDisplayed()
 
-        rule.runOnIdle {
-            place = false
-        }
+        rule.runOnIdle { place = false }
 
-        rule.onNodeWithTag("item0")
-            .assertIsNotDisplayed()
+        rule.onNodeWithTag("item0").assertIsNotDisplayed()
     }
 
     @Test
@@ -175,27 +157,20 @@
             }
         }
 
-        rule.onNodeWithTag("item0")
-            .assertIsDisplayed()
+        rule.onNodeWithTag("item0").assertIsDisplayed()
 
-        rule.runOnIdle {
-            place = false
-        }
+        rule.runOnIdle { place = false }
 
-        rule.onNodeWithTag("item0")
-            .assertIsNotDisplayed()
+        rule.onNodeWithTag("item0").assertIsNotDisplayed()
     }
 
     @Test
     fun rowTooSmall() {
         setContent {
-            Row(modifier = Modifier.requiredSize(100.dp)) {
-                repeat(10) { Item(it, width = 30.dp) }
-            }
+            Row(modifier = Modifier.requiredSize(100.dp)) { repeat(10) { Item(it, width = 30.dp) } }
         }
 
-        rule.onNodeWithTag("item9")
-            .assertIsNotDisplayed()
+        rule.onNodeWithTag("item9").assertIsNotDisplayed()
     }
 
     @Test
@@ -204,14 +179,15 @@
         rule.activityRule.scenario.onActivity { activity ->
             // FrameLayout(id=100, w=100, h=100)
             // '- AndroidComposeView
-            androidComposeView = ComposeView(activity).apply {
-                id = 100
-                layoutParams = ViewGroup.MarginLayoutParams(100, 100)
-                activity.setContentView(this)
-                setContent {
-                    Item(0)
-                }
-            }.getChildAt(0)
+            androidComposeView =
+                ComposeView(activity)
+                    .apply {
+                        id = 100
+                        layoutParams = ViewGroup.MarginLayoutParams(100, 100)
+                        activity.setContentView(this)
+                        setContent { Item(0) }
+                    }
+                    .getChildAt(0)
         }
 
         fun onComposeView(): ViewInteraction {
@@ -221,9 +197,7 @@
         onComposeView().check(matches(isDisplayed()))
         rule.onNodeWithTag("item0").assertIsDisplayed()
 
-        rule.runOnIdle {
-            androidComposeView.visibility = View.GONE
-        }
+        rule.runOnIdle { androidComposeView.visibility = View.GONE }
 
         onComposeView().check(matches(not(isDisplayed())))
         rule.onNodeWithTag("item0").assertIsNotDisplayed()
@@ -236,14 +210,13 @@
             // FrameLayout
             // '- FrameLayout(id=100, w=100, h=100) -> composeContainer
             //    '- AndroidComposeView
-            composeContainer = ComposeView(activity).apply {
-                id = 100
-                layoutParams = ViewGroup.MarginLayoutParams(100, 100)
-                activity.setContentView(FrameLayout(activity).also { it.addView(this) })
-                setContent {
-                    Item(0)
+            composeContainer =
+                ComposeView(activity).apply {
+                    id = 100
+                    layoutParams = ViewGroup.MarginLayoutParams(100, 100)
+                    activity.setContentView(FrameLayout(activity).also { it.addView(this) })
+                    setContent { Item(0) }
                 }
-            }
         }
 
         fun onComposeView(): ViewInteraction {
@@ -253,9 +226,7 @@
         onComposeView().check(matches(isDisplayed()))
         rule.onNodeWithTag("item0").assertIsDisplayed()
 
-        rule.runOnIdle {
-            composeContainer.visibility = View.GONE
-        }
+        rule.runOnIdle { composeContainer.visibility = View.GONE }
 
         onComposeView().check(matches(not(isDisplayed())))
         rule.onNodeWithTag("item0").assertIsNotDisplayed()
@@ -270,9 +241,7 @@
 
         val interaction = rule.onNodeWithTag("item0")
 
-        assertFailsWith<AssertionError> {
-            interaction.isDisplayed()
-        }
+        assertFailsWith<AssertionError> { interaction.isDisplayed() }
     }
 
     @Test
@@ -284,9 +253,7 @@
 
         val interaction = rule.onNodeWithTag("item0")
 
-        assertFailsWith<AssertionError> {
-            interaction.isNotDisplayed()
-        }
+        assertFailsWith<AssertionError> { interaction.isNotDisplayed() }
     }
 
     @Test
@@ -305,62 +272,42 @@
 
     @Test
     fun isDisplayed_returnsFalse_whenNodeIsFullyHidden() {
-        setContent {
-            Box(Modifier.requiredSize(0.dp)) {
-                Item(0, width = 10.dp, height = 10.dp)
-            }
-        }
+        setContent { Box(Modifier.requiredSize(0.dp)) { Item(0, width = 10.dp, height = 10.dp) } }
 
         assertThat(rule.onNodeWithTag("item0").isDisplayed()).isFalse()
     }
 
     @Test
     fun isNotDisplayed_returnsTrue_whenNodeIsFullyHidden() {
-        setContent {
-            Box(Modifier.requiredSize(0.dp)) {
-                Item(0, width = 10.dp, height = 10.dp)
-            }
-        }
+        setContent { Box(Modifier.requiredSize(0.dp)) { Item(0, width = 10.dp, height = 10.dp) } }
 
         assertThat(rule.onNodeWithTag("item0").isNotDisplayed()).isTrue()
     }
 
     @Test
     fun isDisplayed_returnsTrue_whenNodeIsPartiallyVisible() {
-        setContent {
-            Box(Modifier.requiredSize(5.dp)) {
-                Item(0, width = 10.dp, height = 10.dp)
-            }
-        }
+        setContent { Box(Modifier.requiredSize(5.dp)) { Item(0, width = 10.dp, height = 10.dp) } }
 
         assertThat(rule.onNodeWithTag("item0").isDisplayed()).isTrue()
     }
 
     @Test
     fun isNotDisplayed_returnsFalse_whenNodeIsPartiallyVisible() {
-        setContent {
-            Box(Modifier.requiredSize(5.dp)) {
-                Item(0, width = 10.dp, height = 10.dp)
-            }
-        }
+        setContent { Box(Modifier.requiredSize(5.dp)) { Item(0, width = 10.dp, height = 10.dp) } }
 
         assertThat(rule.onNodeWithTag("item0").isNotDisplayed()).isFalse()
     }
 
     @Test
     fun isDisplayed_returnsTrue_whenNodeIsFullyVisible() {
-        setContent {
-            Item(0)
-        }
+        setContent { Item(0) }
 
         assertThat(rule.onNodeWithTag("item0").isDisplayed()).isTrue()
     }
 
     @Test
     fun isNotDisplayed_returnsFalse_whenNodeIsFullyVisible() {
-        setContent {
-            Item(0)
-        }
+        setContent { Item(0) }
 
         assertThat(rule.onNodeWithTag("item0").isNotDisplayed()).isFalse()
     }
diff --git a/compose/ui/ui-test/src/androidInstrumentedTest/kotlin/androidx/compose/ui/test/LayoutCoordinatesHelperTest.kt b/compose/ui/ui-test/src/androidInstrumentedTest/kotlin/androidx/compose/ui/test/LayoutCoordinatesHelperTest.kt
index 2f729b2..fac5641 100644
--- a/compose/ui/ui-test/src/androidInstrumentedTest/kotlin/androidx/compose/ui/test/LayoutCoordinatesHelperTest.kt
+++ b/compose/ui/ui-test/src/androidInstrumentedTest/kotlin/androidx/compose/ui/test/LayoutCoordinatesHelperTest.kt
@@ -83,8 +83,7 @@
 @RunWith(AndroidJUnit4::class)
 class LayoutCoordinatesHelperTest {
 
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
     @Test
     fun positionInParent_noOffset() {
@@ -99,12 +98,11 @@
                 }
             ) {
                 Box(
-                    Modifier.size(10.dp)
-                        .align(Alignment.Start)
-                        .onGloballyPositioned { coordinates ->
-                            childCoordinates = coordinates
-                            latch.countDown()
-                        }
+                    Modifier.size(10.dp).align(Alignment.Start).onGloballyPositioned { coordinates
+                        ->
+                        childCoordinates = coordinates
+                        latch.countDown()
+                    }
                 )
             }
         }
@@ -125,11 +123,11 @@
             with(LocalDensity.current) {
                 Box(Modifier.width(40.toDp()), contentAlignment = Alignment.Center) {
                     Column(
-                        Modifier.width(20.toDp())
-                            .onGloballyPositioned { coordinates: LayoutCoordinates ->
-                                parentCoordinates = coordinates
-                                latch.countDown()
-                            }
+                        Modifier.width(20.toDp()).onGloballyPositioned {
+                            coordinates: LayoutCoordinates ->
+                            parentCoordinates = coordinates
+                            latch.countDown()
+                        }
                     ) {
                         Box(
                             Modifier.size(10.toDp())
@@ -159,10 +157,14 @@
         rule.setContent {
             CompositionLocalProvider(LocalDensity.provides(Density(1f))) {
                 Box(Modifier.offset(200.dp, 100.dp).size(300.dp)) {
-                    Box(Modifier.onPlaced {
-                        offset = it.placementInParent()
-                        positionInRoot = it.positionInRoot()
-                    }.align(alignment = alignment).size(100.dp))
+                    Box(
+                        Modifier.onPlaced {
+                                offset = it.placementInParent()
+                                positionInRoot = it.positionInRoot()
+                            }
+                            .align(alignment = alignment)
+                            .size(100.dp)
+                    )
                 }
             }
         }
@@ -192,18 +194,25 @@
         rule.setContent {
             CompositionLocalProvider(LocalDensity.provides(Density(1f))) {
                 Box(Modifier.offset(200.dp, 100.dp).size(300.dp)) {
-                    Box(Modifier.align(alignment = alignment)
-                        .offset { additionalOffset }.onPlaced {
-                            assertEquals(additionalOffset, it.placementInParent())
-                            invocations[0] = invocations[0] + 1
-                        }.clickable { }.onPlaced {
-                            assertEquals(additionalOffset, it.placementInParent())
-                            invocations[1] = invocations[1] + 1
-                        }.testTag("Test").onPlaced {
-                            assertEquals(additionalOffset, it.placementInParent())
-                            invocations[2] = invocations[2] + 1
-                        }
-                        .size(100.dp))
+                    Box(
+                        Modifier.align(alignment = alignment)
+                            .offset { additionalOffset }
+                            .onPlaced {
+                                assertEquals(additionalOffset, it.placementInParent())
+                                invocations[0] = invocations[0] + 1
+                            }
+                            .clickable {}
+                            .onPlaced {
+                                assertEquals(additionalOffset, it.placementInParent())
+                                invocations[1] = invocations[1] + 1
+                            }
+                            .testTag("Test")
+                            .onPlaced {
+                                assertEquals(additionalOffset, it.placementInParent())
+                                invocations[2] = invocations[2] + 1
+                            }
+                            .size(100.dp)
+                    )
                 }
             }
         }
@@ -215,9 +224,7 @@
             assertThat(invocations).containsExactlyElementsIn(listOf(2, 2, 2))
             additionalOffset = IntOffset(0, 10)
         }
-        rule.runOnIdle {
-            assertThat(invocations).containsExactlyElementsIn(listOf(3, 3, 3))
-        }
+        rule.runOnIdle { assertThat(invocations).containsExactlyElementsIn(listOf(3, 3, 3)) }
     }
 
     @Test
@@ -227,55 +234,35 @@
         val targetOffset = mutableStateOf(Offset.Zero)
         rule.setContent {
             CompositionLocalProvider(LocalDensity.provides(Density(1f))) {
-                Box(
-                    Modifier
-                        .size(200.dp)
-                ) {
+                Box(Modifier.size(200.dp)) {
                     Box(
-                        modifier = Modifier
-                            .animatePlacement(targetOffset) { alignment }
-                            .align(alignment)
-                            .size(20.dp)
-                            .background(Color.Red)
+                        modifier =
+                            Modifier.animatePlacement(targetOffset) { alignment }
+                                .align(alignment)
+                                .size(20.dp)
+                                .background(Color.Red)
                     )
                 }
             }
         }
 
         rule.runOnIdle {
-            assertEquals(
-                calculateExpectedIntOffset(alignment),
-                targetOffset.value
-            )
+            assertEquals(calculateExpectedIntOffset(alignment), targetOffset.value)
             alignment = Alignment.Center
         }
         rule.runOnIdle {
-            assertEquals(
-                calculateExpectedIntOffset(alignment),
-                targetOffset.value
-            )
+            assertEquals(calculateExpectedIntOffset(alignment), targetOffset.value)
             alignment = Alignment.BottomEnd
         }
         rule.runOnIdle {
-            assertEquals(
-                calculateExpectedIntOffset(alignment),
-                targetOffset.value
-            )
+            assertEquals(calculateExpectedIntOffset(alignment), targetOffset.value)
             alignment = Alignment.TopCenter
         }
         rule.runOnIdle {
-            assertEquals(
-                calculateExpectedIntOffset(alignment),
-                targetOffset.value
-            )
+            assertEquals(calculateExpectedIntOffset(alignment), targetOffset.value)
             alignment = Alignment.TopEnd
         }
-        rule.runOnIdle {
-            assertEquals(
-                calculateExpectedIntOffset(alignment),
-                targetOffset.value
-            )
-        }
+        rule.runOnIdle { assertEquals(calculateExpectedIntOffset(alignment), targetOffset.value) }
     }
 
     private fun Modifier.animatePlacement(
@@ -283,29 +270,20 @@
         alignment: () -> Alignment
     ): Modifier = composed {
         val scope = rememberCoroutineScope()
-        var animatable by remember {
-            mutableStateOf<Animatable<Offset, AnimationVector2D>?>(
-                null
-            )
-        }
-        this
-            .layout { measurable, constraints ->
+        var animatable by remember { mutableStateOf<Animatable<Offset, AnimationVector2D>?>(null) }
+        this.layout { measurable, constraints ->
                 val placeable = measurable.measure(constraints)
-                layout(placeable.width, placeable.height) {
-                    placeable.place(
-                        0, 0
-                    )
-                }
+                layout(placeable.width, placeable.height) { placeable.place(0, 0) }
             }
             .onPlaced { coordinates ->
                 targetOffset.value = coordinates.positionInParent()
                 assertEquals(calculateExpectedIntOffset(alignment()), targetOffset.value)
                 // Animate to the new target offset when alignment changes.
                 val anim =
-                    animatable ?: Animatable(
-                        targetOffset.value,
-                        Offset.VectorConverter
-                    ).also { animatable = it }
+                    animatable
+                        ?: Animatable(targetOffset.value, Offset.VectorConverter).also {
+                            animatable = it
+                        }
                 if (anim.targetValue != targetOffset.value) {
                     scope.launch {
                         anim.animateTo(
@@ -319,105 +297,100 @@
                 val placeable = measurable.measure(constraints)
                 layout(placeable.width, placeable.height) {
                     placeable.place(
-                        animatable?.let {
-                            (it.value - targetOffset.value).round()
-                        } ?: IntOffset.Zero
+                        animatable?.let { (it.value - targetOffset.value).round() }
+                            ?: IntOffset.Zero
                     )
                 }
             }
     }
 
     private fun calculateExpectedIntOffset(alignment: Alignment) =
-        alignment.align(
-            IntSize(20, 20), IntSize(200, 200), LayoutDirection.Ltr
-        ).toOffset()
+        alignment.align(IntSize(20, 20), IntSize(200, 200), LayoutDirection.Ltr).toOffset()
 
     @Test
     fun onPlacedModifierWithLayoutModifier() {
         lateinit var coords: LayoutCoordinates
 
-        val modifier = object : OnPlacedModifier, LayoutModifier {
-            override fun MeasureScope.measure(
-                measurable: Measurable,
-                constraints: Constraints
-            ): MeasureResult {
-                val p = measurable.measure(Constraints.fixed(50, 50))
-                return layout(50, 50) {
-                    // coords should already be set by the time we are running this.
-                    assertThat(coords.size).isEqualTo(IntSize(50, 50))
-                    p.place(0, 0)
+        val modifier =
+            object : OnPlacedModifier, LayoutModifier {
+                override fun MeasureScope.measure(
+                    measurable: Measurable,
+                    constraints: Constraints
+                ): MeasureResult {
+                    val p = measurable.measure(Constraints.fixed(50, 50))
+                    return layout(50, 50) {
+                        // coords should already be set by the time we are running this.
+                        assertThat(coords.size).isEqualTo(IntSize(50, 50))
+                        p.place(0, 0)
+                    }
+                }
+
+                override fun onPlaced(coordinates: LayoutCoordinates) {
+                    coords = coordinates
                 }
             }
 
-            override fun onPlaced(coordinates: LayoutCoordinates) {
-                coords = coordinates
-            }
-        }
+        rule.setContent { Box(Modifier.fillMaxSize().then(modifier)) }
 
-        rule.setContent {
-            Box(Modifier.fillMaxSize().then(modifier))
-        }
-
-        rule.runOnIdle {
-            assertThat(coords.size).isEqualTo(IntSize(50, 50))
-        }
+        rule.runOnIdle { assertThat(coords.size).isEqualTo(IntSize(50, 50)) }
     }
 
     @Test
     fun onBoxPlaced_failing() {
         var coordinates: LayoutCoordinates? = null
-        rule.setContent {
-            Box(Modifier.onPlaced { coordinates = it })
-        }
-        rule.runOnIdle {
-            assertThat(coordinates).isNotNull()
-        }
+        rule.setContent { Box(Modifier.onPlaced { coordinates = it }) }
+        rule.runOnIdle { assertThat(coordinates).isNotNull() }
     }
 
     @Test(expected = UnsupportedOperationException::class)
     fun defaultTransformFromThrows() {
-        val layoutCoordinates = object : LayoutCoordinates {
-            override val size: IntSize
-                get() = TODO("Not yet implemented")
-            override val providedAlignmentLines: Set<AlignmentLine>
-                get() = TODO("Not yet implemented")
-            override val parentLayoutCoordinates: LayoutCoordinates?
-                get() = TODO("Not yet implemented")
-            override val parentCoordinates: LayoutCoordinates?
-                get() = TODO("Not yet implemented")
-            override val isAttached: Boolean
-                get() = TODO("Not yet implemented")
+        val layoutCoordinates =
+            object : LayoutCoordinates {
+                override val size: IntSize
+                    get() = TODO("Not yet implemented")
 
-            override fun windowToLocal(relativeToWindow: Offset): Offset {
-                TODO("Not yet implemented")
-            }
+                override val providedAlignmentLines: Set<AlignmentLine>
+                    get() = TODO("Not yet implemented")
 
-            override fun localToWindow(relativeToLocal: Offset): Offset {
-                TODO("Not yet implemented")
-            }
+                override val parentLayoutCoordinates: LayoutCoordinates?
+                    get() = TODO("Not yet implemented")
 
-            override fun localToRoot(relativeToLocal: Offset): Offset {
-                TODO("Not yet implemented")
-            }
+                override val parentCoordinates: LayoutCoordinates?
+                    get() = TODO("Not yet implemented")
 
-            override fun localPositionOf(
-                sourceCoordinates: LayoutCoordinates,
-                relativeToSource: Offset
-            ): Offset {
-                TODO("Not yet implemented")
-            }
+                override val isAttached: Boolean
+                    get() = TODO("Not yet implemented")
 
-            override fun localBoundingBoxOf(
-                sourceCoordinates: LayoutCoordinates,
-                clipBounds: Boolean
-            ): Rect {
-                TODO("Not yet implemented")
-            }
+                override fun windowToLocal(relativeToWindow: Offset): Offset {
+                    TODO("Not yet implemented")
+                }
 
-            override fun get(alignmentLine: AlignmentLine): Int {
-                TODO("Not yet implemented")
+                override fun localToWindow(relativeToLocal: Offset): Offset {
+                    TODO("Not yet implemented")
+                }
+
+                override fun localToRoot(relativeToLocal: Offset): Offset {
+                    TODO("Not yet implemented")
+                }
+
+                override fun localPositionOf(
+                    sourceCoordinates: LayoutCoordinates,
+                    relativeToSource: Offset
+                ): Offset {
+                    TODO("Not yet implemented")
+                }
+
+                override fun localBoundingBoxOf(
+                    sourceCoordinates: LayoutCoordinates,
+                    clipBounds: Boolean
+                ): Rect {
+                    TODO("Not yet implemented")
+                }
+
+                override fun get(alignmentLine: AlignmentLine): Int {
+                    TODO("Not yet implemented")
+                }
             }
-        }
         val matrix = Matrix()
         // This should throw UnsupoportedOperationException
         layoutCoordinates.transformFrom(layoutCoordinates, matrix)
diff --git a/compose/ui/ui-test/src/androidInstrumentedTest/kotlin/androidx/compose/ui/test/PhaseOrderingTest.kt b/compose/ui/ui-test/src/androidInstrumentedTest/kotlin/androidx/compose/ui/test/PhaseOrderingTest.kt
index 85b1c0e..166a972 100644
--- a/compose/ui/ui-test/src/androidInstrumentedTest/kotlin/androidx/compose/ui/test/PhaseOrderingTest.kt
+++ b/compose/ui/ui-test/src/androidInstrumentedTest/kotlin/androidx/compose/ui/test/PhaseOrderingTest.kt
@@ -33,8 +33,7 @@
 @SmallTest
 class PhaseOrderingTest {
 
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
     @Test
     fun singlePass() {
@@ -59,9 +58,7 @@
 
             Layout(content = {}) { _, _ ->
                 counter.expect(3)
-                layout(1, 1) {
-                    counter.expect(4)
-                }
+                layout(1, 1) { counter.expect(4) }
             }
         }
     }
@@ -86,14 +83,10 @@
             Layout(content = {}) { _, _ ->
                 counter.expect(if (firstPass) 2 else 5)
                 layoutCount++
-                layout(1, 1) {
-                    counter.expect(if (firstPass) 3 else 6)
-                }
+                layout(1, 1) { counter.expect(if (firstPass) 3 else 6) }
             }
         }
 
-        rule.runOnIdle {
-            assertThat(layoutCount).isEqualTo(2)
-        }
+        rule.runOnIdle { assertThat(layoutCount).isEqualTo(2) }
     }
 }
diff --git a/compose/ui/ui-test/src/androidInstrumentedTest/kotlin/androidx/compose/ui/test/PrintToStringTest.kt b/compose/ui/ui-test/src/androidInstrumentedTest/kotlin/androidx/compose/ui/test/PrintToStringTest.kt
index 431eb9c..201df245 100644
--- a/compose/ui/ui-test/src/androidInstrumentedTest/kotlin/androidx/compose/ui/test/PrintToStringTest.kt
+++ b/compose/ui/ui-test/src/androidInstrumentedTest/kotlin/androidx/compose/ui/test/PrintToStringTest.kt
@@ -42,14 +42,11 @@
 @RunWith(AndroidJUnit4::class)
 class PrintToStringTest {
 
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
     @Test
     fun printToString_nothingFound() {
-        rule.setContent {
-            ComposeSimpleCase()
-        }
+        rule.setContent { ComposeSimpleCase() }
 
         expectErrorMessageStartsWith(
             "Failed: assertExists.\n" +
@@ -61,36 +58,32 @@
 
     @Test
     fun printToString_one() {
-        rule.setContent {
-            ComposeSimpleCase()
-        }
+        rule.setContent { ComposeSimpleCase() }
 
-        val result = rule.onNodeWithText("Hello")
-            .printToString(maxDepth = 0)
+        val result = rule.onNodeWithText("Hello").printToString(maxDepth = 0)
 
-        assertThat(obfuscateNodesInfo(result)).isEqualTo(
-            """
+        assertThat(obfuscateNodesInfo(result))
+            .isEqualTo(
+                """
                 Printing with useUnmergedTree = 'false'
                 Node #X at (l=X, t=X, r=X, b=X)px
                 Text = '[Hello]'
                 Actions = [SetTextSubstitution, ShowTextSubstitution, ClearTextSubstitution, GetTextLayoutResult]
                 Has 1 sibling
-            """.trimIndent()
-        )
+            """
+                    .trimIndent()
+            )
     }
 
     @Test
     fun printToString_many() {
-        rule.setContent {
-            ComposeSimpleCase()
-        }
+        rule.setContent { ComposeSimpleCase() }
 
-        val result = rule.onRoot()
-            .onChildren()
-            .printToString()
+        val result = rule.onRoot().onChildren().printToString()
 
-        assertThat(obfuscateNodesInfo(result)).isEqualTo(
-            """
+        assertThat(obfuscateNodesInfo(result))
+            .isEqualTo(
+                """
                 Printing with useUnmergedTree = 'false'
                 1) Node #X at (l=X, t=X, r=X, b=X)px
                 Text = '[Hello]'
@@ -100,28 +93,37 @@
                 Text = '[World]'
                 Actions = [SetTextSubstitution, ShowTextSubstitution, ClearTextSubstitution, GetTextLayoutResult]
                 Has 1 sibling
-            """.trimIndent()
-        )
+            """
+                    .trimIndent()
+            )
     }
 
     @Test
     fun printHierarchy() {
         rule.setContentWithoutMinimumTouchTarget {
-            Column(Modifier.semantics { this.disabled(); this.testTag = "column" }) {
-                Box(Modifier.semantics { this.disabled(); this.testTag = "box" }) {
-                    Button(onClick = {}) {
-                        Text("Button")
+            Column(
+                Modifier.semantics {
+                    this.disabled()
+                    this.testTag = "column"
+                }
+            ) {
+                Box(
+                    Modifier.semantics {
+                        this.disabled()
+                        this.testTag = "box"
                     }
+                ) {
+                    Button(onClick = {}) { Text("Button") }
                 }
                 Text("Hello")
             }
         }
 
-        val result = rule.onRoot()
-            .printToString()
+        val result = rule.onRoot().printToString()
 
-        assertThat(obfuscateNodesInfo(result)).isEqualTo(
-            """
+        assertThat(obfuscateNodesInfo(result))
+            .isEqualTo(
+                """
                 Printing with useUnmergedTree = 'false'
                 Node #X at (l=X, t=X, r=X, b=X)px
                  |-Node #X at (l=X, t=X, r=X, b=X)px, Tag: 'column'
@@ -137,31 +139,23 @@
                     |-Node #X at (l=X, t=X, r=X, b=X)px
                       Text = '[Hello]'
                       Actions = [SetTextSubstitution, ShowTextSubstitution, ClearTextSubstitution, GetTextLayoutResult]
-            """.trimIndent()
-        )
+            """
+                    .trimIndent()
+            )
     }
 
     @Test
     fun printMultiple_withDepth() {
         rule.setContent {
-            BoundaryNode("tag1") {
-                BoundaryNode("tag11") {
-                    BoundaryNode("tag111")
-                }
-            }
-            BoundaryNode("tag2") {
-                BoundaryNode("tag22") {
-                    BoundaryNode("tag222")
-                }
-            }
+            BoundaryNode("tag1") { BoundaryNode("tag11") { BoundaryNode("tag111") } }
+            BoundaryNode("tag2") { BoundaryNode("tag22") { BoundaryNode("tag222") } }
         }
 
-        val result = rule.onRoot()
-            .onChildren()
-            .printToString(maxDepth = 1)
+        val result = rule.onRoot().onChildren().printToString(maxDepth = 1)
 
-        assertThat(obfuscateNodesInfo(result)).isEqualTo(
-            """
+        assertThat(obfuscateNodesInfo(result))
+            .isEqualTo(
+                """
                 Printing with useUnmergedTree = 'false'
                 1) Node #X at (l=X, t=X, r=X, b=X)px, Tag: 'tag1'
                  |-Node #X at (l=X, t=X, r=X, b=X)px, Tag: 'tag11'
@@ -169,48 +163,48 @@
                 2) Node #X at (l=X, t=X, r=X, b=X)px, Tag: 'tag2'
                  |-Node #X at (l=X, t=X, r=X, b=X)px, Tag: 'tag22'
                    Has 1 child
-            """.trimIndent()
-        )
+            """
+                    .trimIndent()
+            )
     }
 
     @Test
     fun printMergedContentDescriptions() {
         rule.setContent {
-            Box(Modifier.semantics(mergeDescendants = true) { }) {
+            Box(Modifier.semantics(mergeDescendants = true) {}) {
                 Box(Modifier.semantics { contentDescription = "first" })
                 Box(Modifier.semantics { contentDescription = "second" })
             }
         }
 
-        val result = rule.onRoot()
-            .onChild()
-            .printToString()
+        val result = rule.onRoot().onChild().printToString()
 
-        assertThat(obfuscateNodesInfo(result)).isEqualTo(
-            """
+        assertThat(obfuscateNodesInfo(result))
+            .isEqualTo(
+                """
                 Printing with useUnmergedTree = 'false'
                 Node #X at (l=X, t=X, r=X, b=X)px
                 ContentDescription = '[first, second]'
                 MergeDescendants = 'true'
-            """.trimIndent()
-        )
+            """
+                    .trimIndent()
+            )
     }
 
     @Test
     fun printUnmergedContentDescriptions() {
         rule.setContent {
-            Box(Modifier.semantics(mergeDescendants = true) { }) {
+            Box(Modifier.semantics(mergeDescendants = true) {}) {
                 Box(Modifier.semantics { contentDescription = "first" })
                 Box(Modifier.semantics { contentDescription = "second" })
             }
         }
 
-        val result = rule.onRoot(useUnmergedTree = true)
-            .onChild()
-            .printToString()
+        val result = rule.onRoot(useUnmergedTree = true).onChild().printToString()
 
-        assertThat(obfuscateNodesInfo(result)).isEqualTo(
-            """
+        assertThat(obfuscateNodesInfo(result))
+            .isEqualTo(
+                """
                 Printing with useUnmergedTree = 'true'
                 Node #X at (l=X, t=X, r=X, b=X)px
                 MergeDescendants = 'true'
@@ -218,49 +212,49 @@
                  | ContentDescription = '[first]'
                  |-Node #X at (l=X, t=X, r=X, b=X)px
                    ContentDescription = '[second]'
-            """.trimIndent()
-        )
+            """
+                    .trimIndent()
+            )
     }
 
     @Test
     fun printMergedText() {
         rule.setContent {
-            Box(Modifier.semantics(mergeDescendants = true) { }) {
+            Box(Modifier.semantics(mergeDescendants = true) {}) {
                 Text("first")
                 Text("second")
             }
         }
 
-        val result = rule.onRoot()
-            .onChild()
-            .printToString()
+        val result = rule.onRoot().onChild().printToString()
 
-        assertThat(obfuscateNodesInfo(result)).isEqualTo(
-            """
+        assertThat(obfuscateNodesInfo(result))
+            .isEqualTo(
+                """
                 Printing with useUnmergedTree = 'false'
                 Node #X at (l=X, t=X, r=X, b=X)px
                 Text = '[first, second]'
                 Actions = [SetTextSubstitution, ShowTextSubstitution, ClearTextSubstitution, GetTextLayoutResult]
                 MergeDescendants = 'true'
-            """.trimIndent()
-        )
+            """
+                    .trimIndent()
+            )
     }
 
     @Test
     fun printUnmergedText() {
         rule.setContent {
-            Box(Modifier.semantics(mergeDescendants = true) { }) {
+            Box(Modifier.semantics(mergeDescendants = true) {}) {
                 Text("first")
                 Text("second")
             }
         }
 
-        val result = rule.onRoot(useUnmergedTree = true)
-            .onChild()
-            .printToString()
+        val result = rule.onRoot(useUnmergedTree = true).onChild().printToString()
 
-        assertThat(obfuscateNodesInfo(result)).isEqualTo(
-            """
+        assertThat(obfuscateNodesInfo(result))
+            .isEqualTo(
+                """
                 Printing with useUnmergedTree = 'true'
                 Node #X at (l=X, t=X, r=X, b=X)px
                 MergeDescendants = 'true'
@@ -270,8 +264,9 @@
                  |-Node #X at (l=X, t=X, r=X, b=X)px
                    Text = '[second]'
                    Actions = [SetTextSubstitution, ShowTextSubstitution, ClearTextSubstitution, GetTextLayoutResult]
-            """.trimIndent()
-        )
+            """
+                    .trimIndent()
+            )
     }
 
     @Composable
diff --git a/compose/ui/ui-test/src/androidInstrumentedTest/kotlin/androidx/compose/ui/test/RootExistenceAssertTest.kt b/compose/ui/ui-test/src/androidInstrumentedTest/kotlin/androidx/compose/ui/test/RootExistenceAssertTest.kt
index e6a6d74..e34c0cf4 100644
--- a/compose/ui/ui-test/src/androidInstrumentedTest/kotlin/androidx/compose/ui/test/RootExistenceAssertTest.kt
+++ b/compose/ui/ui-test/src/androidInstrumentedTest/kotlin/androidx/compose/ui/test/RootExistenceAssertTest.kt
@@ -33,34 +33,29 @@
                 ".*\\bsetContent was called before the ComposeTestRule ran\\..*"
     }
 
-    @get:Rule
-    val rule = createEmptyComposeRule()
+    @get:Rule val rule = createEmptyComposeRule()
 
     @Test
     fun noContent_assertExists() {
         expectError<IllegalStateException>(expectedMessage = NoComposeHierarchiesFound) {
-            rule.onNodeWithTag("item")
-                .assertExists()
+            rule.onNodeWithTag("item").assertExists()
         }
     }
 
     @Test
     fun noContent_assertDoesNotExist() {
-        rule.onNodeWithTag("item")
-            .assertDoesNotExist()
+        rule.onNodeWithTag("item").assertDoesNotExist()
     }
 
     @Test
     fun noContent_queryMultipleAssertZero() {
-        rule.onAllNodesWithTag("item")
-            .assertCountEquals(0)
+        rule.onAllNodesWithTag("item").assertCountEquals(0)
     }
 
     @Test
     fun noContent_queryMultipleAssertOne() {
         expectError<IllegalStateException>(expectedMessage = NoComposeHierarchiesFound) {
-            rule.onAllNodesWithTag("item")
-                .assertCountEquals(1)
+            rule.onAllNodesWithTag("item").assertCountEquals(1)
         }
     }
 }
diff --git a/compose/ui/ui-test/src/androidInstrumentedTest/kotlin/androidx/compose/ui/test/TestMonotonicFrameClockTest.kt b/compose/ui/ui-test/src/androidInstrumentedTest/kotlin/androidx/compose/ui/test/TestMonotonicFrameClockTest.kt
index 24a0b3db..12565217 100644
--- a/compose/ui/ui-test/src/androidInstrumentedTest/kotlin/androidx/compose/ui/test/TestMonotonicFrameClockTest.kt
+++ b/compose/ui/ui-test/src/androidInstrumentedTest/kotlin/androidx/compose/ui/test/TestMonotonicFrameClockTest.kt
@@ -52,38 +52,42 @@
     // TestMonotonicFrameClock machinery doesn't break the delay mechanism and end up using wall
     // clock time for delays.
     @Test
-    fun delaysAreSkipped_unconfinedDispatcher() = runTest(UnconfinedTestDispatcher()) {
-        val delayMillis = 999_999_999L
-        withTestClockContext {
-            val virtualStartTimeMillis = currentTime
-            val realStartTimeNanos = System.nanoTime()
-            delay(delayMillis)
-            val realDurationMillis = (System.nanoTime() - realStartTimeNanos) / 1_000_000
-            val virtualDurationMillis = currentTime - virtualStartTimeMillis
+    fun delaysAreSkipped_unconfinedDispatcher() =
+        runTest(UnconfinedTestDispatcher()) {
+            val delayMillis = 999_999_999L
+            withTestClockContext {
+                val virtualStartTimeMillis = currentTime
+                val realStartTimeNanos = System.nanoTime()
+                delay(delayMillis)
+                val realDurationMillis = (System.nanoTime() - realStartTimeNanos) / 1_000_000
+                val virtualDurationMillis = currentTime - virtualStartTimeMillis
 
-            assertThat(virtualDurationMillis).isEqualTo(delayMillis)
-            // This could theoretically fail if the test host is running _really_ slow, but 500ms
-            // should be more than enough.
-            assertThat(realDurationMillis).isLessThan(500)
+                assertThat(virtualDurationMillis).isEqualTo(delayMillis)
+                // This could theoretically fail if the test host is running _really_ slow, but
+                // 500ms
+                // should be more than enough.
+                assertThat(realDurationMillis).isLessThan(500)
+            }
         }
-    }
 
     @Test
-    fun delaysAreSkipped_standardDispatcher() = runTest(StandardTestDispatcher()) {
-        val delayMillis = 999_999_999L
-        withTestClockContext {
-            val virtualStartTimeMillis = currentTime
-            val realStartTimeNanos = System.nanoTime()
-            delay(delayMillis)
-            val realDurationMillis = (System.nanoTime() - realStartTimeNanos) / 1_000_000
-            val virtualDurationMillis = currentTime - virtualStartTimeMillis
+    fun delaysAreSkipped_standardDispatcher() =
+        runTest(StandardTestDispatcher()) {
+            val delayMillis = 999_999_999L
+            withTestClockContext {
+                val virtualStartTimeMillis = currentTime
+                val realStartTimeNanos = System.nanoTime()
+                delay(delayMillis)
+                val realDurationMillis = (System.nanoTime() - realStartTimeNanos) / 1_000_000
+                val virtualDurationMillis = currentTime - virtualStartTimeMillis
 
-            assertThat(virtualDurationMillis).isEqualTo(delayMillis)
-            // This could theoretically fail if the test host is running _really_ slow, but 500ms
-            // should be more than enough.
-            assertThat(realDurationMillis).isLessThan(500)
+                assertThat(virtualDurationMillis).isEqualTo(delayMillis)
+                // This could theoretically fail if the test host is running _really_ slow, but
+                // 500ms
+                // should be more than enough.
+                assertThat(realDurationMillis).isLessThan(500)
+            }
         }
-    }
 
     @Test
     fun testMonotonicFrameClockRunsFrame_unconfinedDispatcher() =
@@ -171,9 +175,7 @@
             val counter = TestCounter()
 
             withTestClockContext(
-                onPerformTraversals = {
-                    counter.expect(9, "perform traversals")
-                }
+                onPerformTraversals = { counter.expect(9, "perform traversals") }
             ) {
                 var continuation: Continuation<Unit>? = null
 
@@ -189,9 +191,7 @@
                         counter.expect(5, "in frame callback 1")
                         // Coroutines launched inside withFrameNanos shouldn't be dispatched until
                         // after all frame callbacks are complete.
-                        launch {
-                            counter.expect(10, "in \"effect\" coroutine")
-                        }
+                        launch { counter.expect(10, "in \"effect\" coroutine") }
                         counter.expect(6, "after launching \"effect\" coroutine")
                     }
                     counter.expect(11, "after resuming frame callback 1")
@@ -222,9 +222,7 @@
             val counter = TestCounter()
 
             withTestClockContext(
-                onPerformTraversals = {
-                    counter.expect(9, "perform traversals")
-                }
+                onPerformTraversals = { counter.expect(9, "perform traversals") }
             ) {
                 var continuation: Continuation<Unit>? = null
 
@@ -240,9 +238,7 @@
                         counter.expect(5, "in frame callback 1")
                         // Coroutines launched inside withFrameNanos shouldn't be dispatched until
                         // after all frame callbacks are complete.
-                        launch {
-                            counter.expect(10, "in \"effect\" coroutine")
-                        }
+                        launch { counter.expect(10, "in \"effect\" coroutine") }
                         counter.expect(6, "after launching \"effect\" coroutine")
                     }
                     counter.expect(11, "after resuming frame callback 1")
@@ -268,76 +264,74 @@
         }
 
     @Test
-    fun withFrameNanosThrows_unconfinedDispatcher() = runTest(UnconfinedTestDispatcher()) {
-        val message = "the frame threw an error"
-        var error: RuntimeException? = null
-        var firstCoroutineContinued = false
-        var secondFrameCallbackRan = false
-        var secondCoroutineContinued = false
+    fun withFrameNanosThrows_unconfinedDispatcher() =
+        runTest(UnconfinedTestDispatcher()) {
+            val message = "the frame threw an error"
+            var error: RuntimeException? = null
+            var firstCoroutineContinued = false
+            var secondFrameCallbackRan = false
+            var secondCoroutineContinued = false
 
-        withTestClockContext {
-            launch {
-                try {
-                    withFrameNanos {
-                        throw RuntimeException(message)
+            withTestClockContext {
+                launch {
+                    try {
+                        withFrameNanos { throw RuntimeException(message) }
+                    } catch (e: RuntimeException) {
+                        error = e
                     }
-                } catch (e: RuntimeException) {
-                    error = e
+                    firstCoroutineContinued = true
                 }
-                firstCoroutineContinued = true
-            }
 
-            launch {
-                withFrameNanos {
-                    // If one frame callback throws, other frame callbacks should still run.
-                    secondFrameCallbackRan = true
+                launch {
+                    withFrameNanos {
+                        // If one frame callback throws, other frame callbacks should still run.
+                        secondFrameCallbackRan = true
+                    }
+                    secondCoroutineContinued = true
                 }
-                secondCoroutineContinued = true
-            }
 
-            advanceUntilIdleWorkaround()
-            assertThat(error).hasMessageThat().isEqualTo(message)
-            assertThat(firstCoroutineContinued).isTrue()
-            assertThat(secondFrameCallbackRan).isTrue()
-            assertThat(secondCoroutineContinued).isTrue()
+                advanceUntilIdleWorkaround()
+                assertThat(error).hasMessageThat().isEqualTo(message)
+                assertThat(firstCoroutineContinued).isTrue()
+                assertThat(secondFrameCallbackRan).isTrue()
+                assertThat(secondCoroutineContinued).isTrue()
+            }
         }
-    }
 
     @Test
-    fun withFrameNanosThrows_standardDispatcher() = runTest(StandardTestDispatcher()) {
-        val message = "the frame threw an error"
-        var error: RuntimeException? = null
-        var firstCoroutineContinued = false
-        var secondFrameCallbackRan = false
-        var secondCoroutineContinued = false
+    fun withFrameNanosThrows_standardDispatcher() =
+        runTest(StandardTestDispatcher()) {
+            val message = "the frame threw an error"
+            var error: RuntimeException? = null
+            var firstCoroutineContinued = false
+            var secondFrameCallbackRan = false
+            var secondCoroutineContinued = false
 
-        withTestClockContext {
-            launch {
-                try {
-                    withFrameNanos {
-                        throw RuntimeException(message)
+            withTestClockContext {
+                launch {
+                    try {
+                        withFrameNanos { throw RuntimeException(message) }
+                    } catch (e: RuntimeException) {
+                        error = e
                     }
-                } catch (e: RuntimeException) {
-                    error = e
+                    firstCoroutineContinued = true
                 }
-                firstCoroutineContinued = true
-            }
 
-            launch {
-                withFrameNanos {
-                    // If one frame callback throws, other frame callbacks should still run.
-                    secondFrameCallbackRan = true
+                launch {
+                    withFrameNanos {
+                        // If one frame callback throws, other frame callbacks should still run.
+                        secondFrameCallbackRan = true
+                    }
+                    secondCoroutineContinued = true
                 }
-                secondCoroutineContinued = true
-            }
 
-            advanceUntilIdleWorkaround()
-            assertThat(error).hasMessageThat().isEqualTo(message)
-            assertThat(firstCoroutineContinued).isTrue()
-            assertThat(secondFrameCallbackRan).isTrue()
-            assertThat(secondCoroutineContinued).isTrue()
+                advanceUntilIdleWorkaround()
+                assertThat(error).hasMessageThat().isEqualTo(message)
+                assertThat(firstCoroutineContinued).isTrue()
+                assertThat(secondFrameCallbackRan).isTrue()
+                assertThat(secondCoroutineContinued).isTrue()
+            }
         }
-    }
 
     @Test
     fun performTraversalsThrows_cancelsClockScope_unconfinedDispatcher() {
@@ -354,22 +348,21 @@
         val traversalFailure = RuntimeException("traversal failure")
         val frameFailure = RuntimeException("frame failure")
 
-        val testFailure = assertFailsWith<RuntimeException> {
-            runTest(UnconfinedTestDispatcher()) {
-                // Need to override the exception handler installed by runTest so it won't fail the
-                // test unnecessarily.
-                val clock = TestMonotonicFrameClock(
-                    coroutineScope = this,
-                    onPerformTraversals = { throw traversalFailure }
-                )
+        val testFailure =
+            assertFailsWith<RuntimeException> {
+                runTest(UnconfinedTestDispatcher()) {
+                    // Need to override the exception handler installed by runTest so it won't fail
+                    // the
+                    // test unnecessarily.
+                    val clock =
+                        TestMonotonicFrameClock(
+                            coroutineScope = this,
+                            onPerformTraversals = { throw traversalFailure }
+                        )
 
-                withTestClockContext(clock) {
-                    launch {
-                        withFrameNanos { throw frameFailure }
-                    }
+                    withTestClockContext(clock) { launch { withFrameNanos { throw frameFailure } } }
                 }
             }
-        }
 
         assertThat(testFailure).isSameInstanceAs(frameFailure)
         assertThat(testFailure.suppressedExceptions).contains(traversalFailure)
@@ -380,22 +373,21 @@
         val traversalFailure = RuntimeException("traversal failure")
         val frameFailure = RuntimeException("frame failure")
 
-        val testFailure = assertFailsWith<RuntimeException> {
-            runTest(StandardTestDispatcher()) {
-                // Need to override the exception handler installed by runTest so it won't fail the
-                // test unnecessarily.
-                val clock = TestMonotonicFrameClock(
-                    coroutineScope = this,
-                    onPerformTraversals = { throw traversalFailure }
-                )
+        val testFailure =
+            assertFailsWith<RuntimeException> {
+                runTest(StandardTestDispatcher()) {
+                    // Need to override the exception handler installed by runTest so it won't fail
+                    // the
+                    // test unnecessarily.
+                    val clock =
+                        TestMonotonicFrameClock(
+                            coroutineScope = this,
+                            onPerformTraversals = { throw traversalFailure }
+                        )
 
-                withTestClockContext(clock) {
-                    launch {
-                        withFrameNanos { throw frameFailure }
-                    }
+                    withTestClockContext(clock) { launch { withFrameNanos { throw frameFailure } } }
                 }
             }
-        }
 
         assertThat(testFailure).isSameInstanceAs(traversalFailure)
         assertThat(testFailure.suppressedExceptions).contains(frameFailure)
@@ -425,13 +417,17 @@
         runTest(UnconfinedTestDispatcher()) {
             // Need to override the exception handler installed by runTest so it won't fail the
             // test unnecessarily.
-            val clockScope = this + clockJob + CoroutineExceptionHandler { _, _ ->
-                // Ignore
-            }
-            val clock = TestMonotonicFrameClock(
-                coroutineScope = clockScope,
-                onPerformTraversals = { throw traversalFailure }
-            )
+            val clockScope =
+                this +
+                    clockJob +
+                    CoroutineExceptionHandler { _, _ ->
+                        // Ignore
+                    }
+            val clock =
+                TestMonotonicFrameClock(
+                    coroutineScope = clockScope,
+                    onPerformTraversals = { throw traversalFailure }
+                )
 
             withTestClockContext(clock) {
                 launch {
@@ -439,14 +435,12 @@
                     frame1Resumed = true
                 }
                 launch {
-                    internalError1 = assertFailsWith<RuntimeException> {
-                        withFrameNanos { throw frameFailure1 }
-                    }
+                    internalError1 =
+                        assertFailsWith<RuntimeException> { withFrameNanos { throw frameFailure1 } }
                 }
                 launch {
-                    internalError2 = assertFailsWith<RuntimeException> {
-                        withFrameNanos { throw frameFailure2 }
-                    }
+                    internalError2 =
+                        assertFailsWith<RuntimeException> { withFrameNanos { throw frameFailure2 } }
                 }
             }
         }
@@ -475,13 +469,17 @@
         runTest(StandardTestDispatcher()) {
             // Need to override the exception handler installed by runTest so it won't fail the
             // test unnecessarily.
-            val clockScope = this + clockJob + CoroutineExceptionHandler { _, _ ->
-                // Ignore
-            }
-            val clock = TestMonotonicFrameClock(
-                coroutineScope = clockScope,
-                onPerformTraversals = { throw traversalFailure }
-            )
+            val clockScope =
+                this +
+                    clockJob +
+                    CoroutineExceptionHandler { _, _ ->
+                        // Ignore
+                    }
+            val clock =
+                TestMonotonicFrameClock(
+                    coroutineScope = clockScope,
+                    onPerformTraversals = { throw traversalFailure }
+                )
 
             withTestClockContext(clock) {
                 launch {
@@ -489,14 +487,12 @@
                     frame1Resumed = true
                 }
                 launch {
-                    internalError1 = assertFailsWith<RuntimeException> {
-                        withFrameNanos { throw frameFailure1 }
-                    }
+                    internalError1 =
+                        assertFailsWith<RuntimeException> { withFrameNanos { throw frameFailure1 } }
                 }
                 launch {
-                    internalError2 = assertFailsWith<RuntimeException> {
-                        withFrameNanos { throw frameFailure2 }
-                    }
+                    internalError2 =
+                        assertFailsWith<RuntimeException> { withFrameNanos { throw frameFailure2 } }
                 }
             }
         }
@@ -515,22 +511,21 @@
     private fun test_performTraversalsThrows_cancelsClockScope(dispatcher: TestDispatcher) {
         val traversalFailure = RuntimeException("traversal failure")
 
-        val testFailure = assertFailsWith<RuntimeException> {
-            runTest(dispatcher) {
-                // Need to override the exception handler installed by runTest so it won't fail the
-                // test unnecessarily.
-                val clock = TestMonotonicFrameClock(
-                    coroutineScope = this,
-                    onPerformTraversals = { throw traversalFailure }
-                )
+        val testFailure =
+            assertFailsWith<RuntimeException> {
+                runTest(dispatcher) {
+                    // Need to override the exception handler installed by runTest so it won't fail
+                    // the
+                    // test unnecessarily.
+                    val clock =
+                        TestMonotonicFrameClock(
+                            coroutineScope = this,
+                            onPerformTraversals = { throw traversalFailure }
+                        )
 
-                withTestClockContext(clock) {
-                    launch {
-                        withFrameNanos {}
-                    }
+                    withTestClockContext(clock) { launch { withFrameNanos {} } }
                 }
             }
-        }
 
         assertThat(testFailure).isSameInstanceAs(traversalFailure)
     }
@@ -544,13 +539,17 @@
         runTest(dispatcher) {
             // Need to override the exception handler installed by runTest so it won't fail the
             // test unnecessarily.
-            val clockScope = this + clockJob + CoroutineExceptionHandler { _, _ ->
-                // Ignore
-            }
-            val clock = TestMonotonicFrameClock(
-                coroutineScope = clockScope,
-                onPerformTraversals = { throw RuntimeException("traversal failed") }
-            )
+            val clockScope =
+                this +
+                    clockJob +
+                    CoroutineExceptionHandler { _, _ ->
+                        // Ignore
+                    }
+            val clock =
+                TestMonotonicFrameClock(
+                    coroutineScope = clockScope,
+                    onPerformTraversals = { throw RuntimeException("traversal failed") }
+                )
 
             // Run these with a separate job so they don't get cancelled by their parent.
             withTestClockContext(clock) {
diff --git a/compose/ui/ui-test/src/androidInstrumentedTest/kotlin/androidx/compose/ui/test/TextActionsTest.kt b/compose/ui/ui-test/src/androidInstrumentedTest/kotlin/androidx/compose/ui/test/TextActionsTest.kt
index 0eb1a24..06bc995 100644
--- a/compose/ui/ui-test/src/androidInstrumentedTest/kotlin/androidx/compose/ui/test/TextActionsTest.kt
+++ b/compose/ui/ui-test/src/androidInstrumentedTest/kotlin/androidx/compose/ui/test/TextActionsTest.kt
@@ -50,8 +50,7 @@
 
     private val fieldTag = "Field"
 
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
     @Composable
     fun TextFieldUi(
@@ -63,9 +62,7 @@
     ) {
         val state = remember { mutableStateOf("") }
         BasicTextField(
-            modifier = Modifier
-                .testTag(fieldTag)
-                .border(0.dp, Color.Black),
+            modifier = Modifier.testTag(fieldTag).border(0.dp, Color.Black),
             value = state.value,
             keyboardOptions = KeyboardOptions(imeAction = imeAction),
             keyboardActions = keyboardActions,
@@ -81,10 +78,13 @@
     @Test
     fun sendText_requestFocusNotSupported_shouldFail() {
         rule.setContent {
-            BoundaryNode(testTag = "node", Modifier.semantics {
-                isEditable = true
-                setText { true }
-            })
+            BoundaryNode(
+                testTag = "node",
+                Modifier.semantics {
+                    isEditable = true
+                    setText { true }
+                }
+            )
         }
 
         expectErrorMessageStartsWith(
@@ -92,18 +92,20 @@
                 "Failed to assert the following: (RequestFocus is defined)\n" +
                 "Semantics of the node:"
         ) {
-            rule.onNodeWithTag("node")
-                .performTextInput("hello")
+            rule.onNodeWithTag("node").performTextInput("hello")
         }
     }
 
     @Test
     fun performTextInput_setTextNotSupported_shouldFail() {
         rule.setContent {
-            BoundaryNode(fieldTag, Modifier.semantics {
-                isEditable = true
-                insertTextAtCursor { true }
-            })
+            BoundaryNode(
+                fieldTag,
+                Modifier.semantics {
+                    isEditable = true
+                    insertTextAtCursor { true }
+                }
+            )
         }
 
         expectErrorMessageStartsWith(
@@ -111,19 +113,21 @@
                 "Failed to assert the following: (SetText is defined)\n" +
                 "Semantics of the node:"
         ) {
-            rule.onNodeWithTag(fieldTag)
-                .performTextInput("")
+            rule.onNodeWithTag(fieldTag).performTextInput("")
         }
     }
 
     @Test
     fun performTextInput_insertTextAtCursorNotSupported_shouldFail() {
         rule.setContent {
-            BoundaryNode(fieldTag, Modifier.semantics {
-                isEditable = true
-                setText { true }
-                requestFocus { true }
-            })
+            BoundaryNode(
+                fieldTag,
+                Modifier.semantics {
+                    isEditable = true
+                    setText { true }
+                    requestFocus { true }
+                }
+            )
         }
 
         expectErrorMessageStartsWith(
@@ -131,63 +135,40 @@
                 "Failed to assert the following: (InsertTextAtCursor is defined)\n" +
                 "Semantics of the node:"
         ) {
-            rule.onNodeWithTag(fieldTag)
-                .performTextInput("")
+            rule.onNodeWithTag(fieldTag).performTextInput("")
         }
     }
 
     @Test
     fun sendText_clearText() {
         var lastSeenText = ""
-        rule.setContent {
-            TextFieldUi {
-                lastSeenText = it
-            }
-        }
+        rule.setContent { TextFieldUi { lastSeenText = it } }
 
-        rule.onNodeWithTag(fieldTag)
-            .performTextInput("Hello!")
+        rule.onNodeWithTag(fieldTag).performTextInput("Hello!")
 
-        rule.runOnIdle {
-            assertThat(lastSeenText).isEqualTo("Hello!")
-        }
+        rule.runOnIdle { assertThat(lastSeenText).isEqualTo("Hello!") }
 
-        rule.onNodeWithTag(fieldTag)
-            .performTextClearance()
+        rule.onNodeWithTag(fieldTag).performTextClearance()
 
-        rule.runOnIdle {
-            assertThat(lastSeenText).isEqualTo("")
-        }
+        rule.runOnIdle { assertThat(lastSeenText).isEqualTo("") }
     }
 
     @Test
     fun sendTextRepeatedly_shouldAppend() {
         var lastSeenText = ""
-        rule.setContent {
-            TextFieldUi {
-                lastSeenText = it
-            }
-        }
+        rule.setContent { TextFieldUi { lastSeenText = it } }
 
-        rule.onNodeWithTag(fieldTag)
-            .performTextInput("Hello")
+        rule.onNodeWithTag(fieldTag).performTextInput("Hello")
 
         // "Type" one character at a time.
-        " world!".forEach {
-            rule.onNodeWithTag(fieldTag)
-                .performTextInput(it.toString())
-        }
+        " world!".forEach { rule.onNodeWithTag(fieldTag).performTextInput(it.toString()) }
 
-        rule.runOnIdle {
-            assertThat(lastSeenText).isEqualTo("Hello world!")
-        }
+        rule.runOnIdle { assertThat(lastSeenText).isEqualTo("Hello world!") }
     }
 
     @Test
     fun sendText_whenDisabled_shouldFail() {
-        rule.setContent {
-            TextFieldUi(enabled = false)
-        }
+        rule.setContent { TextFieldUi(enabled = false) }
 
         expectErrorMessageStartsWith(
             "Failed to perform text input.\n" +
@@ -201,38 +182,24 @@
     @Test
     fun sendText_whenReadOnly_isNotAllowed() {
         var lastSeenText = ""
-        rule.setContent {
-            TextFieldUi(readOnly = true)
-        }
+        rule.setContent { TextFieldUi(readOnly = true) }
 
         rule.onNodeWithTag(fieldTag).performTextInput("hi")
-        rule.runOnIdle {
-            assertThat(lastSeenText).isEqualTo("")
-        }
+        rule.runOnIdle { assertThat(lastSeenText).isEqualTo("") }
     }
 
     @Test
     fun replaceText() {
         var lastSeenText = ""
-        rule.setContent {
-            TextFieldUi {
-                lastSeenText = it
-            }
-        }
+        rule.setContent { TextFieldUi { lastSeenText = it } }
 
-        rule.onNodeWithTag(fieldTag)
-            .performTextInput("Hello")
+        rule.onNodeWithTag(fieldTag).performTextInput("Hello")
 
-        rule.runOnIdle {
-            assertThat(lastSeenText).isEqualTo("Hello")
-        }
+        rule.runOnIdle { assertThat(lastSeenText).isEqualTo("Hello") }
 
-        rule.onNodeWithTag(fieldTag)
-            .performTextReplacement("world")
+        rule.onNodeWithTag(fieldTag).performTextReplacement("world")
 
-        rule.runOnIdle {
-            assertThat(lastSeenText).isEqualTo("world")
-        }
+        rule.runOnIdle { assertThat(lastSeenText).isEqualTo("world") }
     }
 
     @Test
@@ -259,12 +226,9 @@
         }
         assertThat(actionPerformed).isFalse()
 
-        rule.onNodeWithTag(fieldTag)
-            .performImeAction()
+        rule.onNodeWithTag(fieldTag).performImeAction()
 
-        rule.runOnIdle {
-            assertThat(actionPerformed).isTrue()
-        }
+        rule.runOnIdle { assertThat(actionPerformed).isTrue() }
     }
 
     @Test
@@ -306,56 +270,56 @@
                 "Failed to assert the following: (NOT (ImeAction = 'Default'))\n" +
                 "Semantics of the node:"
         ) {
-            rule.onNodeWithTag(fieldTag)
-                .performImeAction()
+            rule.onNodeWithTag(fieldTag).performImeAction()
         }
     }
 
     @Test
     fun performImeAction_actionReturnsFalse_shouldFail() {
         rule.setContent {
-            BoundaryNode(fieldTag, Modifier.semantics {
-                isEditable = true
-                setText { true }
-                requestFocus { true }
-                insertTextAtCursor { true }
-                onImeAction(ImeAction.Done) { false }
-            })
+            BoundaryNode(
+                fieldTag,
+                Modifier.semantics {
+                    isEditable = true
+                    setText { true }
+                    requestFocus { true }
+                    insertTextAtCursor { true }
+                    onImeAction(ImeAction.Done) { false }
+                }
+            )
         }
 
         expectErrorMessageStartsWith(
-            "Failed to perform IME action, handler returned false.\n" +
-                "Semantics of the node:"
+            "Failed to perform IME action, handler returned false.\n" + "Semantics of the node:"
         ) {
-            rule.onNodeWithTag(fieldTag)
-                .performImeAction()
+            rule.onNodeWithTag(fieldTag).performImeAction()
         }
     }
 
     @Test
     fun performImeAction_inputNotSupported_shouldFail() {
-        rule.setContent {
-            BoundaryNode(fieldTag)
-        }
+        rule.setContent { BoundaryNode(fieldTag) }
 
         expectErrorMessageStartsWith(
             "Failed to perform IME action.\n" +
                 "Failed to assert the following: (PerformImeAction is defined)\n" +
                 "Semantics of the node:"
         ) {
-            rule.onNodeWithTag(fieldTag)
-                .performImeAction()
+            rule.onNodeWithTag(fieldTag).performImeAction()
         }
     }
 
     @Test
     fun performImeAction_focusNotSupported_shouldFail() {
         rule.setContent {
-            BoundaryNode(testTag = "node", Modifier.semantics {
-                isEditable = true
-                setText { true }
-                onImeAction(ImeAction.Done) { true }
-            })
+            BoundaryNode(
+                testTag = "node",
+                Modifier.semantics {
+                    isEditable = true
+                    setText { true }
+                    onImeAction(ImeAction.Done) { true }
+                }
+            )
         }
 
         expectErrorMessageStartsWith(
@@ -363,19 +327,13 @@
                 "Failed to assert the following: (RequestFocus is defined)\n" +
                 "Semantics of the node:"
         ) {
-            rule.onNodeWithTag("node")
-                .performImeAction()
+            rule.onNodeWithTag("node").performImeAction()
         }
     }
 
     @Test
     fun performImeAction_whenDisabled_shouldFail() {
-        rule.setContent {
-            TextFieldUi(
-                imeAction = ImeAction.Done,
-                enabled = false
-            )
-        }
+        rule.setContent { TextFieldUi(imeAction = ImeAction.Done, enabled = false) }
 
         expectErrorMessageStartsWith(
             "Failed to perform IME action.\n" +
@@ -398,8 +356,6 @@
         }
 
         rule.onNodeWithTag(fieldTag).performImeAction()
-        rule.runOnIdle {
-            assertThat(actionPerformed).isTrue()
-        }
+        rule.runOnIdle { assertThat(actionPerformed).isTrue() }
     }
 }
diff --git a/compose/ui/ui-test/src/androidInstrumentedTest/kotlin/androidx/compose/ui/test/actions/CustomAccessibilityActionsTest.kt b/compose/ui/ui-test/src/androidInstrumentedTest/kotlin/androidx/compose/ui/test/actions/CustomAccessibilityActionsTest.kt
index 63cdb88..288d940 100644
--- a/compose/ui/ui-test/src/androidInstrumentedTest/kotlin/androidx/compose/ui/test/actions/CustomAccessibilityActionsTest.kt
+++ b/compose/ui/ui-test/src/androidInstrumentedTest/kotlin/androidx/compose/ui/test/actions/CustomAccessibilityActionsTest.kt
@@ -39,8 +39,7 @@
 @SmallTest
 @RunWith(AndroidJUnit4::class)
 class CustomAccessibilityActionsTest {
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
     private val tag = "tag"
 
@@ -55,9 +54,10 @@
         }
 
         val interaction = rule.onNodeWithTag(tag)
-        val error = assertFailsWith<AssertionError> {
-            interaction.performCustomAccessibilityActionWithLabel("action")
-        }
+        val error =
+            assertFailsWith<AssertionError> {
+                interaction.performCustomAccessibilityActionWithLabel("action")
+            }
         assertThat(error).hasMessageThat().contains("could not find any node that satisfies")
     }
 
@@ -65,44 +65,45 @@
     fun performCustomAccessibilityActionLabelled_failsWhenNoActionMatches() {
         rule.setContent {
             Box(
-                Modifier
-                    .testTag(tag)
-                    .semantics {
-                        customActions = listOf(CustomAccessibilityAction("action") { true })
-                    }
+                Modifier.testTag(tag).semantics {
+                    customActions = listOf(CustomAccessibilityAction("action") { true })
+                }
             )
         }
 
-        val error = assertFailsWith<AssertionError> {
-            rule.onNodeWithTag(tag).performCustomAccessibilityActionWithLabel("not action")
-        }
-        assertThat(error).hasMessageThat().startsWith(
-            "No custom accessibility actions matched [label is \"not action\"]"
-        )
+        val error =
+            assertFailsWith<AssertionError> {
+                rule.onNodeWithTag(tag).performCustomAccessibilityActionWithLabel("not action")
+            }
+        assertThat(error)
+            .hasMessageThat()
+            .startsWith("No custom accessibility actions matched [label is \"not action\"]")
     }
 
     @Test
     fun performCustomAccessibilityActionLabelled_failsWhenMultipleActionsMatch() {
         rule.setContent {
             Box(
-                Modifier
-                    .testTag(tag)
-                    .semantics {
-                        customActions = listOf(
+                Modifier.testTag(tag).semantics {
+                    customActions =
+                        listOf(
                             CustomAccessibilityAction("action") { true },
                             CustomAccessibilityAction("action") { true },
                         )
-                    }
+                }
             )
         }
 
-        val error = assertFailsWith<AssertionError> {
-            rule.onNodeWithTag(tag).performCustomAccessibilityActionWithLabel("action")
-        }
-        assertThat(error).hasMessageThat().startsWith(
-            "Expected exactly one custom accessibility action to match [label is \"action\"], " +
-                "but found 2."
-        )
+        val error =
+            assertFailsWith<AssertionError> {
+                rule.onNodeWithTag(tag).performCustomAccessibilityActionWithLabel("action")
+            }
+        assertThat(error)
+            .hasMessageThat()
+            .startsWith(
+                "Expected exactly one custom accessibility action to match [label is \"action\"], " +
+                    "but found 2."
+            )
     }
 
     @Test
@@ -111,14 +112,19 @@
         var barInvocationCount = 0
         rule.setContent {
             Box(
-                Modifier
-                    .testTag(tag)
-                    .semantics {
-                        customActions = listOf(
-                            CustomAccessibilityAction("foo") { fooInvocationCount++; true },
-                            CustomAccessibilityAction("bar") { barInvocationCount++; true },
+                Modifier.testTag(tag).semantics {
+                    customActions =
+                        listOf(
+                            CustomAccessibilityAction("foo") {
+                                fooInvocationCount++
+                                true
+                            },
+                            CustomAccessibilityAction("bar") {
+                                barInvocationCount++
+                                true
+                            },
                         )
-                    }
+                }
             )
         }
 
@@ -132,13 +138,12 @@
     fun performCustomAccessibilityActionLabelled_doesntFailWhenActionReturnsFalse() {
         rule.setContent {
             Box(
-                Modifier
-                    .testTag(tag)
-                    .semantics {
-                        customActions = listOf(
+                Modifier.testTag(tag).semantics {
+                    customActions =
+                        listOf(
                             CustomAccessibilityAction("action") { false },
                         )
-                    }
+                }
             )
         }
 
@@ -156,9 +161,12 @@
         }
 
         val interaction = rule.onNodeWithTag(tag)
-        val error = assertFailsWith<AssertionError> {
-            interaction.performCustomAccessibilityActionWithLabelMatching("description") { true }
-        }
+        val error =
+            assertFailsWith<AssertionError> {
+                interaction.performCustomAccessibilityActionWithLabelMatching("description") {
+                    true
+                }
+            }
         assertThat(error).hasMessageThat().contains("could not find any node that satisfies")
     }
 
@@ -166,46 +174,53 @@
     fun performCustomAccessibilityActionWhere_failsWhenNoActionMatches() {
         rule.setContent {
             Box(
-                Modifier
-                    .testTag(tag)
-                    .semantics {
-                        customActions = listOf(CustomAccessibilityAction("action") { true })
-                    }
+                Modifier.testTag(tag).semantics {
+                    customActions = listOf(CustomAccessibilityAction("action") { true })
+                }
             )
         }
 
-        val error = assertFailsWith<AssertionError> {
-            rule.onNodeWithTag(tag)
-                .performCustomAccessibilityActionWithLabelMatching("description") { false }
-        }
-        assertThat(error).hasMessageThat().startsWith(
-            "No custom accessibility actions matched [description]"
-        )
+        val error =
+            assertFailsWith<AssertionError> {
+                rule.onNodeWithTag(tag).performCustomAccessibilityActionWithLabelMatching(
+                    "description"
+                ) {
+                    false
+                }
+            }
+        assertThat(error)
+            .hasMessageThat()
+            .startsWith("No custom accessibility actions matched [description]")
     }
 
     @Test
     fun performCustomAccessibilityActionWhere_failsWhenMultipleActionsMatch() {
         rule.setContent {
             Box(
-                Modifier
-                    .testTag(tag)
-                    .semantics {
-                        customActions = listOf(
+                Modifier.testTag(tag).semantics {
+                    customActions =
+                        listOf(
                             CustomAccessibilityAction("action") { true },
                             CustomAccessibilityAction("action") { true },
                         )
-                    }
+                }
             )
         }
 
-        val error = assertFailsWith<AssertionError> {
-            rule.onNodeWithTag(tag)
-                .performCustomAccessibilityActionWithLabelMatching("description") { true }
-        }
-        assertThat(error).hasMessageThat().startsWith(
-            "Expected exactly one custom accessibility action to match [description], " +
-                "but found 2."
-        )
+        val error =
+            assertFailsWith<AssertionError> {
+                rule.onNodeWithTag(tag).performCustomAccessibilityActionWithLabelMatching(
+                    "description"
+                ) {
+                    true
+                }
+            }
+        assertThat(error)
+            .hasMessageThat()
+            .startsWith(
+                "Expected exactly one custom accessibility action to match [description], " +
+                    "but found 2."
+            )
     }
 
     @Test
@@ -214,19 +229,25 @@
         var barInvocationCount = 0
         rule.setContent {
             Box(
-                Modifier
-                    .testTag(tag)
-                    .semantics {
-                        customActions = listOf(
-                            CustomAccessibilityAction("foo") { fooInvocationCount++; true },
-                            CustomAccessibilityAction("bar") { barInvocationCount++; true },
+                Modifier.testTag(tag).semantics {
+                    customActions =
+                        listOf(
+                            CustomAccessibilityAction("foo") {
+                                fooInvocationCount++
+                                true
+                            },
+                            CustomAccessibilityAction("bar") {
+                                barInvocationCount++
+                                true
+                            },
                         )
-                    }
+                }
             )
         }
 
-        rule.onNodeWithTag(tag)
-            .performCustomAccessibilityActionWithLabelMatching("description") { it == "foo" }
+        rule.onNodeWithTag(tag).performCustomAccessibilityActionWithLabelMatching("description") {
+            it == "foo"
+        }
 
         assertThat(fooInvocationCount).isEqualTo(1)
         assertThat(barInvocationCount).isEqualTo(0)
@@ -236,17 +257,17 @@
     fun performCustomAccessibilityActionWhere_doesntFailWhenActionReturnsFalse() {
         rule.setContent {
             Box(
-                Modifier
-                    .testTag(tag)
-                    .semantics {
-                        customActions = listOf(
+                Modifier.testTag(tag).semantics {
+                    customActions =
+                        listOf(
                             CustomAccessibilityAction("action") { false },
                         )
-                    }
+                }
             )
         }
 
-        rule.onNodeWithTag(tag)
-            .performCustomAccessibilityActionWithLabelMatching("description") { true }
+        rule.onNodeWithTag(tag).performCustomAccessibilityActionWithLabelMatching("description") {
+            true
+        }
     }
 }
diff --git a/compose/ui/ui-test/src/androidInstrumentedTest/kotlin/androidx/compose/ui/test/actions/ScrollToIndexTest.kt b/compose/ui/ui-test/src/androidInstrumentedTest/kotlin/androidx/compose/ui/test/actions/ScrollToIndexTest.kt
index afb4ac8..e9742ce 100644
--- a/compose/ui/ui-test/src/androidInstrumentedTest/kotlin/androidx/compose/ui/test/actions/ScrollToIndexTest.kt
+++ b/compose/ui/ui-test/src/androidInstrumentedTest/kotlin/androidx/compose/ui/test/actions/ScrollToIndexTest.kt
@@ -44,8 +44,7 @@
 @MediumTest
 @RunWith(AndroidJUnit4::class)
 class ScrollToIndexTest {
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
     private fun tag(index: Int): String = "tag_$index"
 
@@ -107,8 +106,8 @@
         // Verify that it doesn't support performScrollToIndex
         rule.onNode(hasScrollToIndexAction()).assertDoesNotExist()
         expectError<AssertionError>(
-            expectedMessage = "Failed to scroll to index 1, " +
-                "the node is missing \\[ScrollToIndex\\].*"
+            expectedMessage =
+                "Failed to scroll to index 1, " + "the node is missing \\[ScrollToIndex\\].*"
         ) {
             rule.onNodeWithTag("tag").performScrollToIndex(1)
         }
diff --git a/compose/ui/ui-test/src/androidInstrumentedTest/kotlin/androidx/compose/ui/test/actions/ScrollToKeyTest.kt b/compose/ui/ui-test/src/androidInstrumentedTest/kotlin/androidx/compose/ui/test/actions/ScrollToKeyTest.kt
index 401dd94..04df356 100644
--- a/compose/ui/ui-test/src/androidInstrumentedTest/kotlin/androidx/compose/ui/test/actions/ScrollToKeyTest.kt
+++ b/compose/ui/ui-test/src/androidInstrumentedTest/kotlin/androidx/compose/ui/test/actions/ScrollToKeyTest.kt
@@ -47,10 +47,10 @@
 @MediumTest
 @RunWith(AndroidJUnit4::class)
 class ScrollToKeyTest {
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
     private fun key(index: Int): String = "key_$index"
+
     private fun tag(index: Int): String = "tag_$index"
 
     @Test
@@ -84,8 +84,8 @@
 
         // ScrollToKey "hello"
         expectError<IllegalArgumentException>(
-            expectedMessage = "Failed to scroll to the item identified by \"hello\", " +
-                "couldn't find the key."
+            expectedMessage =
+                "Failed to scroll to the item identified by \"hello\", " + "couldn't find the key."
         ) {
             rule.onNode(hasScrollToKeyAction()).performScrollToKey("hello")
         }
@@ -94,15 +94,14 @@
     @Test
     fun missingSemantics_ScrollToIndex() {
         // Setup a node without ScrollToIndex, but with IndexForKey
-        rule.setContent {
-            Spacer(Modifier.testTag("tag").semantics { indexForKey { 0 } })
-        }
+        rule.setContent { Spacer(Modifier.testTag("tag").semantics { indexForKey { 0 } }) }
 
         // Verify that it doesn't support performScrollToKey
         rule.onNode(hasScrollToKeyAction()).assertDoesNotExist()
         expectError<AssertionError>(
-            expectedMessage = "Failed to scroll to the item identified by \"1\", " +
-                "the node is missing \\[ScrollToIndex\\].*"
+            expectedMessage =
+                "Failed to scroll to the item identified by \"1\", " +
+                    "the node is missing \\[ScrollToIndex\\].*"
         ) {
             rule.onNodeWithTag("tag").performScrollToKey(1)
         }
@@ -111,15 +110,14 @@
     @Test
     fun missingSemantics_IndexForKey() {
         // Setup a node without IndexForKey, but with ScrollToIndex
-        rule.setContent {
-            Spacer(Modifier.testTag("tag").semantics { scrollToIndex { true } })
-        }
+        rule.setContent { Spacer(Modifier.testTag("tag").semantics { scrollToIndex { true } }) }
 
         // Verify that it doesn't support performScrollToKey
         rule.onNode(hasScrollToKeyAction()).assertDoesNotExist()
         expectError<AssertionError>(
-            expectedMessage = "Failed to scroll to the item identified by \"1\", " +
-                "the node is missing \\[IndexForKey\\].*"
+            expectedMessage =
+                "Failed to scroll to the item identified by \"1\", " +
+                    "the node is missing \\[IndexForKey\\].*"
         ) {
             rule.onNodeWithTag("tag").performScrollToKey(1)
         }
@@ -142,10 +140,7 @@
     @Composable
     fun LazyColumnContent() {
         LazyColumn(Modifier.requiredSize(100.dp)) {
-            items(
-                items = List(20) { it },
-                key = { key(it) }
-            ) {
+            items(items = List(20) { it }, key = { key(it) }) {
                 Spacer(Modifier.requiredHeight(30.dp).fillMaxWidth().testTag(tag(it)))
             }
         }
diff --git a/compose/ui/ui-test/src/androidInstrumentedTest/kotlin/androidx/compose/ui/test/actions/ScrollToNodeTest.kt b/compose/ui/ui-test/src/androidInstrumentedTest/kotlin/androidx/compose/ui/test/actions/ScrollToNodeTest.kt
index 3059df5..653217f 100644
--- a/compose/ui/ui-test/src/androidInstrumentedTest/kotlin/androidx/compose/ui/test/actions/ScrollToNodeTest.kt
+++ b/compose/ui/ui-test/src/androidInstrumentedTest/kotlin/androidx/compose/ui/test/actions/ScrollToNodeTest.kt
@@ -64,17 +64,20 @@
         val viewportSize: ViewportSize,
         val targetPosition: StartPosition
     ) {
-        val viewportSizePx: Int get() = viewportSize.sizePx
+        val viewportSizePx: Int
+            get() = viewportSize.sizePx
 
-        private val initialScrollIndexWithoutReverseLayout: Int = when (viewportSize) {
-            ViewportSize.SmallerThanItem -> targetPosition.indexForSmallViewport
-            ViewportSize.BiggerThenItem -> targetPosition.indexForBigViewport
-        }
+        private val initialScrollIndexWithoutReverseLayout: Int =
+            when (viewportSize) {
+                ViewportSize.SmallerThanItem -> targetPosition.indexForSmallViewport
+                ViewportSize.BiggerThenItem -> targetPosition.indexForBigViewport
+            }
 
-        private val initialScrollOffsetWithoutReverseLayout: Int = when (viewportSize) {
-            ViewportSize.SmallerThanItem -> targetPosition.offsetForSmallViewport
-            ViewportSize.BiggerThenItem -> targetPosition.offsetForBigViewport
-        }
+        private val initialScrollOffsetWithoutReverseLayout: Int =
+            when (viewportSize) {
+                ViewportSize.SmallerThanItem -> targetPosition.offsetForSmallViewport
+                ViewportSize.BiggerThenItem -> targetPosition.offsetForBigViewport
+            }
 
         val initialScrollIndex: Int
             get() {
@@ -102,14 +105,15 @@
                 return (range - totalOffset) % itemSizePx
             }
 
-        override fun toString(): String = "orientation=$orientation, " +
-            "reverseScrolling=$reverseLayout, " +
-            "viewport=$viewportSize, " +
-            "targetIs=" +
-            when (targetPosition) {
-                NotInList -> "$targetPosition"
-                else -> "${targetPosition}Viewport"
-            }
+        override fun toString(): String =
+            "orientation=$orientation, " +
+                "reverseScrolling=$reverseLayout, " +
+                "viewport=$viewportSize, " +
+                "targetIs=" +
+                when (targetPosition) {
+                    NotInList -> "$targetPosition"
+                    else -> "${targetPosition}Viewport"
+                }
     }
 
     companion object {
@@ -122,26 +126,27 @@
 
         @JvmStatic
         @Parameterized.Parameters(name = "{0}")
-        fun params() = mutableListOf<TestConfig>().apply {
-            for (orientation in Orientation.values()) {
-                for (reverseScrolling in listOf(false, true)) {
-                    for (viewportSize in ViewportSize.values()) {
-                        for (targetPosition in StartPosition.values()) {
-                            TestConfig(
-                                orientation = orientation,
-                                reverseLayout = reverseScrolling,
-                                viewportSize = viewportSize,
-                                targetPosition = targetPosition
-                            ).also { add(it) }
+        fun params() =
+            mutableListOf<TestConfig>().apply {
+                for (orientation in Orientation.values()) {
+                    for (reverseScrolling in listOf(false, true)) {
+                        for (viewportSize in ViewportSize.values()) {
+                            for (targetPosition in StartPosition.values()) {
+                                TestConfig(
+                                        orientation = orientation,
+                                        reverseLayout = reverseScrolling,
+                                        viewportSize = viewportSize,
+                                        targetPosition = targetPosition
+                                    )
+                                    .also { add(it) }
+                            }
                         }
                     }
                 }
             }
-        }
     }
 
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
     @Test
     fun scrollToTarget() {
@@ -160,9 +165,7 @@
                         Boxes()
                     }
                 } else {
-                    LazyRow(rowModifier(), state, reverseLayout = config.reverseLayout) {
-                        Boxes()
-                    }
+                    LazyRow(rowModifier(), state, reverseLayout = config.reverseLayout) { Boxes() }
                 }
             }
         }
@@ -177,8 +180,8 @@
         // that an exception is thrown, and stop the test after that
         expectError<AssertionError>(
             expectError = config.targetPosition == NotInList,
-            expectedMessage = "No node found that matches TestTag = 'target' in scrollable " +
-                "container.*"
+            expectedMessage =
+                "No node found that matches TestTag = 'target' in scrollable " + "container.*"
         ) {
             rule.onNodeWithTag(containerTag).performScrollToNode(hasTestTag(itemTag))
         }
@@ -193,14 +196,18 @@
 
         if (config.viewportSize == ViewportSize.SmallerThanItem) {
             assertWithMessage("item needs to cover the whole viewport")
-                .that(targetBounds.leftOrTop).isAtMost(viewportBounds.leftOrTop)
+                .that(targetBounds.leftOrTop)
+                .isAtMost(viewportBounds.leftOrTop)
             assertWithMessage("item needs to cover the whole viewport")
-                .that(targetBounds.rightOrBottom).isAtLeast(viewportBounds.rightOrBottom)
+                .that(targetBounds.rightOrBottom)
+                .isAtLeast(viewportBounds.rightOrBottom)
         } else {
             assertWithMessage("item needs to be fully inside the viewport")
-                .that(targetBounds.leftOrTop).isAtLeast(viewportBounds.leftOrTop)
+                .that(targetBounds.leftOrTop)
+                .isAtLeast(viewportBounds.leftOrTop)
             assertWithMessage("item needs to be fully inside the viewport")
-                .that(targetBounds.rightOrBottom).isAtMost(viewportBounds.rightOrBottom)
+                .that(targetBounds.rightOrBottom)
+                .isAtMost(viewportBounds.rightOrBottom)
         }
     }
 
@@ -225,9 +232,7 @@
                         Boxes()
                     }
                 } else {
-                    LazyRow(rowModifier(), state, reverseLayout = config.reverseLayout) {
-                        Boxes()
-                    }
+                    LazyRow(rowModifier(), state, reverseLayout = config.reverseLayout) { Boxes() }
                 }
             }
         }
@@ -242,31 +247,30 @@
 
     private val Rect.leftOrTop: Float
         get() = if (config.orientation == Vertical) top else left
+
     private val Rect.rightOrBottom: Float
         get() = if (config.orientation == Vertical) right else bottom
 
     private fun DpRect.toPx(): Rect = with(rule.density) { toRect() }
 
-    private fun rowModifier(): Modifier = Modifier.composed {
-        with(LocalDensity.current) {
-            Modifier
-                .testTag(containerTag)
-                .requiredSize(config.viewportSizePx.toDp(), itemSizePx.toDp())
+    private fun rowModifier(): Modifier =
+        Modifier.composed {
+            with(LocalDensity.current) {
+                Modifier.testTag(containerTag)
+                    .requiredSize(config.viewportSizePx.toDp(), itemSizePx.toDp())
+            }
         }
-    }
 
-    private fun columnModifier(): Modifier = Modifier.composed {
-        with(LocalDensity.current) {
-            Modifier
-                .testTag(containerTag)
-                .requiredSize(itemSizePx.toDp(), config.viewportSizePx.toDp())
+    private fun columnModifier(): Modifier =
+        Modifier.composed {
+            with(LocalDensity.current) {
+                Modifier.testTag(containerTag)
+                    .requiredSize(itemSizePx.toDp(), config.viewportSizePx.toDp())
+            }
         }
-    }
 
     private fun LazyListScope.Boxes() {
-        items(itemsAround) {
-            ClickableTestBox(color = if (it % 2 == 0) Color.Blue else Color.Red)
-        }
+        items(itemsAround) { ClickableTestBox(color = if (it % 2 == 0) Color.Blue else Color.Red) }
         item {
             ClickableTestBox(
                 color = Color.Yellow,
diff --git a/compose/ui/ui-test/src/androidInstrumentedTest/kotlin/androidx/compose/ui/test/actions/ScrollToTest.kt b/compose/ui/ui-test/src/androidInstrumentedTest/kotlin/androidx/compose/ui/test/actions/ScrollToTest.kt
index 9621cbe..d8e25b9 100644
--- a/compose/ui/ui-test/src/androidInstrumentedTest/kotlin/androidx/compose/ui/test/actions/ScrollToTest.kt
+++ b/compose/ui/ui-test/src/androidInstrumentedTest/kotlin/androidx/compose/ui/test/actions/ScrollToTest.kt
@@ -74,25 +74,29 @@
         val expectScrolling: Boolean,
         val expectedAlignment: ExpectedAlignment
     ) {
-        val viewportSizePx: Int get() = viewportSize.sizePx
+        val viewportSizePx: Int
+            get() = viewportSize.sizePx
 
-        val initialScrollOffset: Int get() {
-            val offset = when (viewportSize) {
-                ViewportSize.SmallerThanItem -> startPosition.smallViewportOffset
-                ViewportSize.BiggerThenItem -> startPosition.bigViewportOffset
+        val initialScrollOffset: Int
+            get() {
+                val offset =
+                    when (viewportSize) {
+                        ViewportSize.SmallerThanItem -> startPosition.smallViewportOffset
+                        ViewportSize.BiggerThenItem -> startPosition.bigViewportOffset
+                    }
+                val scrollRange = itemCount * itemSizePx - viewportSizePx
+                // Need to invert the scroll offset for reverseScrolling so the target is
+                // on the correct side of the viewport according to the [StartPosition]
+                return if (reverseScrolling) scrollRange - offset else offset
             }
-            val scrollRange = itemCount * itemSizePx - viewportSizePx
-            // Need to invert the scroll offset for reverseScrolling so the target is
-            // on the correct side of the viewport according to the [StartPosition]
-            return if (reverseScrolling) scrollRange - offset else offset
-        }
 
-        override fun toString(): String = "orientation=$orientation, " +
-            "reverseScrolling=$reverseScrolling, " +
-            "viewport=$viewportSize, " +
-            "targetStarts=${startPosition}Viewport, " +
-            "expectScrolling=$expectScrolling, " +
-            "expectedAlignment=$expectedAlignment"
+        override fun toString(): String =
+            "orientation=$orientation, " +
+                "reverseScrolling=$reverseScrolling, " +
+                "viewport=$viewportSize, " +
+                "targetStarts=${startPosition}Viewport, " +
+                "expectScrolling=$expectScrolling, " +
+                "expectedAlignment=$expectedAlignment"
     }
 
     companion object {
@@ -105,17 +109,23 @@
 
         @JvmStatic
         @Parameterized.Parameters(name = "{0}")
-        fun params() = mutableListOf<TestConfig>().apply {
-            for (orientation in Orientation.values()) {
-                for (reverseScrolling in listOf(false, true)) {
-                    for (viewportSize in ViewportSize.values()) {
-                        for (startPosition in StartPosition.values()) {
-                            addConfig(orientation, reverseScrolling, viewportSize, startPosition)
+        fun params() =
+            mutableListOf<TestConfig>().apply {
+                for (orientation in Orientation.values()) {
+                    for (reverseScrolling in listOf(false, true)) {
+                        for (viewportSize in ViewportSize.values()) {
+                            for (startPosition in StartPosition.values()) {
+                                addConfig(
+                                    orientation,
+                                    reverseScrolling,
+                                    viewportSize,
+                                    startPosition
+                                )
+                            }
                         }
                     }
                 }
             }
-        }
 
         private fun MutableList<TestConfig>.addConfig(
             orientation: Orientation,
@@ -127,11 +137,16 @@
             val expectScrolling = startPosition.expectScrolling
 
             // Start with simple expectation, factor in other parameters below
-            var expectedAlignment = when (startPosition) {
-                FullyAfter, PartiallyAfter, EndAlignedIn -> if (isVertical) Bottom else Right
-                FullyBefore, PartiallyBefore, StartAlignedIn -> if (isVertical) Top else Left
-                CenterAlignedIn -> Center
-            }
+            var expectedAlignment =
+                when (startPosition) {
+                    FullyAfter,
+                    PartiallyAfter,
+                    EndAlignedIn -> if (isVertical) Bottom else Right
+                    FullyBefore,
+                    PartiallyBefore,
+                    StartAlignedIn -> if (isVertical) Top else Left
+                    CenterAlignedIn -> Center
+                }
 
             // When scrolling into a small viewport, the opposite edge is found first
             if (expectScrolling && viewportSize == ViewportSize.SmallerThanItem) {
@@ -144,18 +159,18 @@
             }
 
             TestConfig(
-                orientation,
-                reverseScrolling,
-                viewportSize,
-                startPosition,
-                expectScrolling,
-                expectedAlignment
-            ).also { add(it) }
+                    orientation,
+                    reverseScrolling,
+                    viewportSize,
+                    startPosition,
+                    expectScrolling,
+                    expectedAlignment
+                )
+                .also { add(it) }
         }
     }
 
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
     @Test
     fun scrollToTarget() {
@@ -186,32 +201,39 @@
 
         if (config.expectScrolling) {
             assertWithMessage("target must have scrolled, it was not yet in the viewport")
-                .that(targetBoundsAfter).isNotEqualTo(targetBoundsBefore)
+                .that(targetBoundsAfter)
+                .isNotEqualTo(targetBoundsBefore)
         } else {
             assertWithMessage("target must not scroll, it was already in the viewport")
-                .that(targetBoundsAfter).isEqualTo(targetBoundsBefore)
+                .that(targetBoundsAfter)
+                .isEqualTo(targetBoundsBefore)
         }
 
         when (config.expectedAlignment) {
             Left -> {
                 assertWithMessage("target must be left-aligned in the viewport")
-                    .that(targetBoundsAfter.left).isEqualTo(viewportBounds.left)
+                    .that(targetBoundsAfter.left)
+                    .isEqualTo(viewportBounds.left)
             }
             Right -> {
                 assertWithMessage("target must be right-aligned in the viewport")
-                    .that(targetBoundsAfter.right).isEqualTo(viewportBounds.right)
+                    .that(targetBoundsAfter.right)
+                    .isEqualTo(viewportBounds.right)
             }
             Top -> {
                 assertWithMessage("target must be top-aligned in the viewport")
-                    .that(targetBoundsAfter.top).isEqualTo(viewportBounds.top)
+                    .that(targetBoundsAfter.top)
+                    .isEqualTo(viewportBounds.top)
             }
             Bottom -> {
                 assertWithMessage("target must be bottom-aligned in the viewport")
-                    .that(targetBoundsAfter.bottom).isEqualTo(viewportBounds.bottom)
+                    .that(targetBoundsAfter.bottom)
+                    .isEqualTo(viewportBounds.bottom)
             }
             Center -> {
                 assertWithMessage("target must be bottom-aligned in the viewport")
-                    .that(targetBoundsAfter.center).isEqualTo(viewportBounds.center)
+                    .that(targetBoundsAfter.center)
+                    .isEqualTo(viewportBounds.center)
             }
         }
     }
@@ -233,7 +255,6 @@
                 when (config.orientation) {
                     HorizontalLtr,
                     HorizontalRtl -> Row(rowModifier(scrollState)) { Boxes() }
-
                     Vertical -> Column(columnModifier(scrollState)) { Boxes() }
                 }
             }
@@ -246,23 +267,23 @@
 
     private fun DpRect.toPx(): Rect = with(rule.density) { toRect() }
 
-    private fun rowModifier(scrollState: ScrollState): Modifier = Modifier.composed {
-        with(LocalDensity.current) {
-            Modifier
-                .testTag(containerTag)
-                .requiredSize(config.viewportSizePx.toDp(), itemSizePx.toDp())
-                .horizontalScroll(scrollState, reverseScrolling = config.reverseScrolling)
+    private fun rowModifier(scrollState: ScrollState): Modifier =
+        Modifier.composed {
+            with(LocalDensity.current) {
+                Modifier.testTag(containerTag)
+                    .requiredSize(config.viewportSizePx.toDp(), itemSizePx.toDp())
+                    .horizontalScroll(scrollState, reverseScrolling = config.reverseScrolling)
+            }
         }
-    }
 
-    private fun columnModifier(scrollState: ScrollState): Modifier = Modifier.composed {
-        with(LocalDensity.current) {
-            Modifier
-                .testTag(containerTag)
-                .requiredSize(itemSizePx.toDp(), config.viewportSizePx.toDp())
-                .verticalScroll(scrollState, reverseScrolling = config.reverseScrolling)
+    private fun columnModifier(scrollState: ScrollState): Modifier =
+        Modifier.composed {
+            with(LocalDensity.current) {
+                Modifier.testTag(containerTag)
+                    .requiredSize(itemSizePx.toDp(), config.viewportSizePx.toDp())
+                    .verticalScroll(scrollState, reverseScrolling = config.reverseScrolling)
+            }
         }
-    }
 
     @Composable
     private fun Boxes() {
@@ -295,20 +316,31 @@
         PartiallyBefore(270, 250),
         FullyBefore(420, 350);
 
-        val expectScrolling get() = when (this) {
-            EndAlignedIn, CenterAlignedIn, StartAlignedIn -> false
-            else -> true
-        }
+        val expectScrolling
+            get() =
+                when (this) {
+                    EndAlignedIn,
+                    CenterAlignedIn,
+                    StartAlignedIn -> false
+                    else -> true
+                }
     }
 
     enum class ExpectedAlignment {
-        Left, Right, Top, Bottom, Center;
-        val reverse get() = when (this) {
-            Left -> Right
-            Right -> Left
-            Top -> Bottom
-            Bottom -> Top
-            Center -> Center
-        }
+        Left,
+        Right,
+        Top,
+        Bottom,
+        Center;
+
+        val reverse
+            get() =
+                when (this) {
+                    Left -> Right
+                    Right -> Left
+                    Top -> Bottom
+                    Bottom -> Top
+                    Center -> Center
+                }
     }
 }
diff --git a/compose/ui/ui-test/src/androidInstrumentedTest/kotlin/androidx/compose/ui/test/assertions/AssertAllTest.kt b/compose/ui/ui-test/src/androidInstrumentedTest/kotlin/androidx/compose/ui/test/assertions/AssertAllTest.kt
index 8b5f6d9..1dcbd57 100644
--- a/compose/ui/ui-test/src/androidInstrumentedTest/kotlin/androidx/compose/ui/test/assertions/AssertAllTest.kt
+++ b/compose/ui/ui-test/src/androidInstrumentedTest/kotlin/androidx/compose/ui/test/assertions/AssertAllTest.kt
@@ -34,8 +34,7 @@
 @RunWith(AndroidJUnit4::class)
 class AssertAllTest {
 
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
     @Test
     fun twoNodes_twoSatisfied() {
@@ -46,7 +45,8 @@
             }
         }
 
-        rule.onNodeWithTag("Parent")
+        rule
+            .onNodeWithTag("Parent")
             .onChildren()
             .assertAll(hasTestTag("Child1") or hasTestTag("Child2"))
     }
@@ -65,9 +65,7 @@
                 "Found '1' node not matching:\n" +
                 "Node #X"
         ) {
-            rule.onNodeWithTag("Parent")
-                .onChildren()
-                .assertAll(hasTestTag("Child1"))
+            rule.onNodeWithTag("Parent").onChildren().assertAll(hasTestTag("Child1"))
         }
     }
 
@@ -82,23 +80,18 @@
         }
 
         expectErrorMessageStartsWith(
-            "Failed to assertAll(TestTag = 'Child1')\n" +
-                "Found '2' nodes not matching:\n" +
-                "1) "
+            "Failed to assertAll(TestTag = 'Child1')\n" + "Found '2' nodes not matching:\n" + "1) "
         ) {
-            rule.onNodeWithTag("Parent")
-                .onChildren()
-                .assertAll(hasTestTag("Child1"))
+            rule.onNodeWithTag("Parent").onChildren().assertAll(hasTestTag("Child1"))
         }
     }
 
     @Test
     fun zeroNodes() {
-        rule.setContent {
-            BoundaryNode(testTag = "Parent")
-        }
+        rule.setContent { BoundaryNode(testTag = "Parent") }
 
-        rule.onNodeWithTag("Parent")
+        rule
+            .onNodeWithTag("Parent")
             .onChildren()
             .assertCountEquals(0)
             .assertAll(hasTestTag("Child"))
diff --git a/compose/ui/ui-test/src/androidInstrumentedTest/kotlin/androidx/compose/ui/test/assertions/AssertAnyTest.kt b/compose/ui/ui-test/src/androidInstrumentedTest/kotlin/androidx/compose/ui/test/assertions/AssertAnyTest.kt
index 27feb9b..4d36854 100644
--- a/compose/ui/ui-test/src/androidInstrumentedTest/kotlin/androidx/compose/ui/test/assertions/AssertAnyTest.kt
+++ b/compose/ui/ui-test/src/androidInstrumentedTest/kotlin/androidx/compose/ui/test/assertions/AssertAnyTest.kt
@@ -33,8 +33,7 @@
 @RunWith(AndroidJUnit4::class)
 class AssertAnyTest {
 
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
     @Test
     fun twoNodes_oneOrTwoSatisfied() {
@@ -45,11 +44,10 @@
             }
         }
 
-        rule.onNodeWithTag("Parent")
-            .onChildren()
-            .assertAny(hasTestTag("Child1"))
+        rule.onNodeWithTag("Parent").onChildren().assertAny(hasTestTag("Child1"))
 
-        rule.onNodeWithTag("Parent")
+        rule
+            .onNodeWithTag("Parent")
             .onChildren()
             .assertAny(hasTestTag("Child1") or hasTestTag("Child2"))
     }
@@ -69,17 +67,13 @@
                 "None of the following nodes match:\n" +
                 "1) "
         ) {
-            rule.onNodeWithTag("Parent")
-                .onChildren()
-                .assertAny(hasTestTag("Child3"))
+            rule.onNodeWithTag("Parent").onChildren().assertAny(hasTestTag("Child3"))
         }
     }
 
     @Test
     fun zeroNodes_noneSatisfied() {
-        rule.setContent {
-            BoundaryNode(testTag = "Parent")
-        }
+        rule.setContent { BoundaryNode(testTag = "Parent") }
 
         expectErrorMessageStartsWith(
             "" +
@@ -87,9 +81,7 @@
                 "Assert needs to receive at least 1 node but 0 nodes were found for selector: " +
                 "'(TestTag = 'Parent').children'"
         ) {
-            rule.onNodeWithTag("Parent")
-                .onChildren()
-                .assertAny(hasTestTag("Child"))
+            rule.onNodeWithTag("Parent").onChildren().assertAny(hasTestTag("Child"))
         }
     }
 }
diff --git a/compose/ui/ui-test/src/androidInstrumentedTest/kotlin/androidx/compose/ui/test/assertions/AssertContentDescription.kt b/compose/ui/ui-test/src/androidInstrumentedTest/kotlin/androidx/compose/ui/test/assertions/AssertContentDescription.kt
index 876c983..5b7e362 100644
--- a/compose/ui/ui-test/src/androidInstrumentedTest/kotlin/androidx/compose/ui/test/assertions/AssertContentDescription.kt
+++ b/compose/ui/ui-test/src/androidInstrumentedTest/kotlin/androidx/compose/ui/test/assertions/AssertContentDescription.kt
@@ -36,67 +36,45 @@
 @RunWith(AndroidJUnit4::class)
 class AssertContentDescription {
 
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
     @Test
     fun equals() {
-        rule.setContent {
-            TestContent()
-        }
-        rule.onNodeWithTag("test")
-            .assertContentDescriptionEquals("Hello", "World")
-        rule.onNodeWithTag("test")
-            .assertContentDescriptionEquals("World", "Hello")
+        rule.setContent { TestContent() }
+        rule.onNodeWithTag("test").assertContentDescriptionEquals("Hello", "World")
+        rule.onNodeWithTag("test").assertContentDescriptionEquals("World", "Hello")
     }
 
     @Test
     fun equals_empty() {
-        rule.setContent {
-            Box(Modifier.semantics { testTag = "test" })
-        }
-        rule.onNodeWithTag("test")
-            .assertContentDescriptionEquals()
+        rule.setContent { Box(Modifier.semantics { testTag = "test" }) }
+        rule.onNodeWithTag("test").assertContentDescriptionEquals()
     }
 
     @Test
     fun contains() {
-        rule.setContent {
-            TestContent()
-        }
-        rule.onNodeWithTag("test")
-            .assertContentDescriptionContains("Hello")
-        rule.onNodeWithTag("test")
-            .assertContentDescriptionContains("World")
+        rule.setContent { TestContent() }
+        rule.onNodeWithTag("test").assertContentDescriptionContains("Hello")
+        rule.onNodeWithTag("test").assertContentDescriptionContains("World")
     }
 
     @Test
     fun contains_substring() {
-        rule.setContent {
-            TestContent()
-        }
-        rule.onNodeWithTag("test")
-            .assertContentDescriptionContains("He", substring = true)
-        rule.onNodeWithTag("test")
-            .assertContentDescriptionContains("Wo", substring = true)
+        rule.setContent { TestContent() }
+        rule.onNodeWithTag("test").assertContentDescriptionContains("He", substring = true)
+        rule.onNodeWithTag("test").assertContentDescriptionContains("Wo", substring = true)
     }
 
     @Test(expected = AssertionError::class)
     fun equals_fails_notEnoughElements() {
-        rule.setContent {
-            TestContent()
-        }
-        rule.onNodeWithTag("test")
-            .assertContentDescriptionEquals("Hello")
+        rule.setContent { TestContent() }
+        rule.onNodeWithTag("test").assertContentDescriptionEquals("Hello")
     }
 
     @Test(expected = AssertionError::class)
     fun equals_fails_tooManyElements() {
-        rule.setContent {
-            TestContent()
-        }
-        rule.onNodeWithTag("test")
-            .assertContentDescriptionEquals("Hello", "World", "More")
+        rule.setContent { TestContent() }
+        rule.onNodeWithTag("test").assertContentDescriptionEquals("Hello", "World", "More")
     }
 
     @Composable
diff --git a/compose/ui/ui-test/src/androidInstrumentedTest/kotlin/androidx/compose/ui/test/assertions/AssertText.kt b/compose/ui/ui-test/src/androidInstrumentedTest/kotlin/androidx/compose/ui/test/assertions/AssertText.kt
index 2649649..8410a86 100644
--- a/compose/ui/ui-test/src/androidInstrumentedTest/kotlin/androidx/compose/ui/test/assertions/AssertText.kt
+++ b/compose/ui/ui-test/src/androidInstrumentedTest/kotlin/androidx/compose/ui/test/assertions/AssertText.kt
@@ -41,69 +41,46 @@
 @RunWith(AndroidJUnit4::class)
 class AssertText {
 
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
     @Test
     fun equals() {
-        rule.setContent {
-            TestContent()
-        }
-        rule.onNodeWithTag("test")
-            .assertTextEquals("Hello", "World")
-        rule.onNodeWithTag("test")
-            .assertTextEquals("World", "Hello")
+        rule.setContent { TestContent() }
+        rule.onNodeWithTag("test").assertTextEquals("Hello", "World")
+        rule.onNodeWithTag("test").assertTextEquals("World", "Hello")
     }
 
     @Test
     fun equals_empty() {
-        rule.setContent {
-            Box(Modifier.semantics { testTag = "test" })
-        }
-        rule.onNodeWithTag("test")
-            .assertTextEquals()
-        rule.onNodeWithTag("test")
-            .assertTextEquals(includeEditableText = false)
+        rule.setContent { Box(Modifier.semantics { testTag = "test" }) }
+        rule.onNodeWithTag("test").assertTextEquals()
+        rule.onNodeWithTag("test").assertTextEquals(includeEditableText = false)
     }
 
     @Test
     fun contains() {
-        rule.setContent {
-            TestContent()
-        }
-        rule.onNodeWithTag("test")
-            .assertTextContains("Hello")
-        rule.onNodeWithTag("test")
-            .assertTextContains("World")
+        rule.setContent { TestContent() }
+        rule.onNodeWithTag("test").assertTextContains("Hello")
+        rule.onNodeWithTag("test").assertTextContains("World")
     }
 
     @Test
     fun contains_substring() {
-        rule.setContent {
-            TestContent()
-        }
-        rule.onNodeWithTag("test")
-            .assertTextContains("He", substring = true)
-        rule.onNodeWithTag("test")
-            .assertTextContains("Wo", substring = true)
+        rule.setContent { TestContent() }
+        rule.onNodeWithTag("test").assertTextContains("He", substring = true)
+        rule.onNodeWithTag("test").assertTextContains("Wo", substring = true)
     }
 
     @Test(expected = AssertionError::class)
     fun equals_fails_notEnoughElements() {
-        rule.setContent {
-            TestContent()
-        }
-        rule.onNodeWithTag("test")
-            .assertTextEquals("Hello")
+        rule.setContent { TestContent() }
+        rule.onNodeWithTag("test").assertTextEquals("Hello")
     }
 
     @Test(expected = AssertionError::class)
     fun equals_fails_tooManyElements() {
-        rule.setContent {
-            TestContent()
-        }
-        rule.onNodeWithTag("test")
-            .assertTextEquals("Hello", "World", "More")
+        rule.setContent { TestContent() }
+        rule.onNodeWithTag("test").assertTextEquals("Hello", "World", "More")
     }
 
     @Test(expected = AssertionError::class)
@@ -115,62 +92,69 @@
                 TextField("TextField", onValueChange = {})
             }
         }
-        rule.onNodeWithTag("test")
-            .assertTextEquals("Hello", "World", "TextField")
-        rule.onNodeWithTag("test")
-            .assertTextEquals("Hello", "World", includeEditableText = false)
-        rule.onNodeWithTag("test")
-            .assertTextContains("TextField")
+        rule.onNodeWithTag("test").assertTextEquals("Hello", "World", "TextField")
+        rule.onNodeWithTag("test").assertTextEquals("Hello", "World", includeEditableText = false)
+        rule.onNodeWithTag("test").assertTextContains("TextField")
     }
 
     @Test
     fun assertTextFieldText_isOk() {
         rule.setContent {
-            BoundaryNode { testTag = "test"; editableText = AnnotatedString("Hello World") }
+            BoundaryNode {
+                testTag = "test"
+                editableText = AnnotatedString("Hello World")
+            }
         }
 
-        rule.onNodeWithTag("test")
-            .assertTextEquals("Hello World")
+        rule.onNodeWithTag("test").assertTextEquals("Hello World")
     }
 
     @Test(expected = AssertionError::class)
     fun assertTextFieldText_fails() {
         rule.setContent {
-            BoundaryNode { testTag = "test"; editableText = AnnotatedString("Hello World") }
+            BoundaryNode {
+                testTag = "test"
+                editableText = AnnotatedString("Hello World")
+            }
         }
 
-        rule.onNodeWithTag("test")
-            .assertTextEquals("Hello")
+        rule.onNodeWithTag("test").assertTextEquals("Hello")
     }
 
     @Test
     fun assertTextFieldText_substring_isOk() {
         rule.setContent {
-            BoundaryNode { testTag = "test"; editableText = AnnotatedString("Hello World") }
+            BoundaryNode {
+                testTag = "test"
+                editableText = AnnotatedString("Hello World")
+            }
         }
 
-        rule.onNodeWithTag("test")
-            .assertTextContains("Hello", substring = true)
+        rule.onNodeWithTag("test").assertTextContains("Hello", substring = true)
     }
 
     @Test(expected = AssertionError::class)
     fun assertTextFieldText_substring_fails() {
         rule.setContent {
-            BoundaryNode { testTag = "test"; editableText = AnnotatedString("Hello World") }
+            BoundaryNode {
+                testTag = "test"
+                editableText = AnnotatedString("Hello World")
+            }
         }
 
-        rule.onNodeWithTag("test")
-            .assertTextContains("hello")
+        rule.onNodeWithTag("test").assertTextContains("hello")
     }
 
     @Test
     fun assertTextFieldText_substring_ignoreCase_isOk() {
         rule.setContent {
-            BoundaryNode { testTag = "test"; editableText = AnnotatedString("Hello World") }
+            BoundaryNode {
+                testTag = "test"
+                editableText = AnnotatedString("Hello World")
+            }
         }
 
-        rule.onNodeWithTag("test")
-            .assertTextContains("hello", ignoreCase = true, substring = true)
+        rule.onNodeWithTag("test").assertTextContains("hello", ignoreCase = true, substring = true)
     }
 
     @Composable
diff --git a/compose/ui/ui-test/src/androidInstrumentedTest/kotlin/androidx/compose/ui/test/assertions/BoundsAssertionsTest.kt b/compose/ui/ui-test/src/androidInstrumentedTest/kotlin/androidx/compose/ui/test/assertions/BoundsAssertionsTest.kt
index a8d56b1..f033023 100644
--- a/compose/ui/ui-test/src/androidInstrumentedTest/kotlin/androidx/compose/ui/test/assertions/BoundsAssertionsTest.kt
+++ b/compose/ui/ui-test/src/androidInstrumentedTest/kotlin/androidx/compose/ui/test/assertions/BoundsAssertionsTest.kt
@@ -71,22 +71,17 @@
         private const val tag = "box"
     }
 
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
     private fun composeBox() {
         rule.setContent {
-            Box(
-                modifier = Modifier
-                    .fillMaxSize()
-                    .wrapContentSize(Alignment.TopStart)
-            ) {
+            Box(modifier = Modifier.fillMaxSize().wrapContentSize(Alignment.TopStart)) {
                 Box(modifier = Modifier.padding(start = 50.dp, top = 100.dp)) {
                     Box(
-                        modifier = Modifier
-                            .testTag(tag)
-                            .requiredSize(80.dp, 100.dp)
-                            .background(color = Color.Black)
+                        modifier =
+                            Modifier.testTag(tag)
+                                .requiredSize(80.dp, 100.dp)
+                                .background(color = Color.Black)
                     )
                 }
             }
@@ -94,15 +89,10 @@
     }
 
     @Composable
-    private fun SmallBox(
-        modifier: Modifier = Modifier,
-        tag: String = BoundsAssertionsTest.tag
-    ) {
+    private fun SmallBox(modifier: Modifier = Modifier, tag: String = BoundsAssertionsTest.tag) {
         Box(
-            modifier = modifier
-                .testTag(tag)
-                .requiredSize(10.dp, 10.dp)
-                .background(color = Color.Black)
+            modifier =
+                modifier.testTag(tag).requiredSize(10.dp, 10.dp).background(color = Color.Black)
         )
     }
 
@@ -110,16 +100,15 @@
     fun assertSizeEquals() {
         composeBox()
 
-        rule.onNodeWithTag(tag)
-            .assertWidthIsEqualTo(80.dp)
-            .assertHeightIsEqualTo(100.dp)
+        rule.onNodeWithTag(tag).assertWidthIsEqualTo(80.dp).assertHeightIsEqualTo(100.dp)
     }
 
     @Test
     fun assertSizeAtLeast() {
         composeBox()
 
-        rule.onNodeWithTag(tag)
+        rule
+            .onNodeWithTag(tag)
             .assertWidthIsAtLeast(80.dp)
             .assertWidthIsAtLeast(79.dp)
             .assertHeightIsAtLeast(100.dp)
@@ -130,69 +119,46 @@
     fun assertSizeEquals_fail() {
         composeBox()
 
-        expectError<AssertionError> {
-            rule.onNodeWithTag(tag)
-                .assertWidthIsEqualTo(70.dp)
-        }
+        expectError<AssertionError> { rule.onNodeWithTag(tag).assertWidthIsEqualTo(70.dp) }
 
-        expectError<AssertionError> {
-            rule.onNodeWithTag(tag)
-                .assertHeightIsEqualTo(90.dp)
-        }
+        expectError<AssertionError> { rule.onNodeWithTag(tag).assertHeightIsEqualTo(90.dp) }
     }
 
     @Test
     fun assertSizeAtLeast_fail() {
         composeBox()
 
-        expectError<AssertionError> {
-            rule.onNodeWithTag(tag)
-                .assertWidthIsAtLeast(81.dp)
-        }
+        expectError<AssertionError> { rule.onNodeWithTag(tag).assertWidthIsAtLeast(81.dp) }
 
-        expectError<AssertionError> {
-            rule.onNodeWithTag(tag)
-                .assertHeightIsAtLeast(101.dp)
-        }
+        expectError<AssertionError> { rule.onNodeWithTag(tag).assertHeightIsAtLeast(101.dp) }
     }
 
     @Test
     fun assertTouchSizeEquals() {
         rule.setContent {
-            WithMinimumTouchTargetSize(DpSize(20.dp, 20.dp)) {
-                SmallBox(Modifier.clickable {})
-            }
+            WithMinimumTouchTargetSize(DpSize(20.dp, 20.dp)) { SmallBox(Modifier.clickable {}) }
         }
 
-        rule.onNodeWithTag(tag)
-            .assertTouchWidthIsEqualTo(20.dp)
-            .assertTouchHeightIsEqualTo(20.dp)
+        rule.onNodeWithTag(tag).assertTouchWidthIsEqualTo(20.dp).assertTouchHeightIsEqualTo(20.dp)
     }
 
     @Test
     fun assertTouchSizeEquals_fail() {
         rule.setContent {
-            WithMinimumTouchTargetSize(DpSize(20.dp, 20.dp)) {
-                SmallBox(Modifier.clickable {})
-            }
+            WithMinimumTouchTargetSize(DpSize(20.dp, 20.dp)) { SmallBox(Modifier.clickable {}) }
         }
 
-        expectError<AssertionError> {
-            rule.onNodeWithTag(tag)
-                .assertTouchWidthIsEqualTo(19.dp)
-        }
+        expectError<AssertionError> { rule.onNodeWithTag(tag).assertTouchWidthIsEqualTo(19.dp) }
 
-        expectError<AssertionError> {
-            rule.onNodeWithTag(tag)
-                .assertTouchHeightIsEqualTo(21.dp)
-        }
+        expectError<AssertionError> { rule.onNodeWithTag(tag).assertTouchHeightIsEqualTo(21.dp) }
     }
 
     @Test
     fun assertPosition() {
         composeBox()
 
-        rule.onNodeWithTag(tag)
+        rule
+            .onNodeWithTag(tag)
             .assertPositionInRootIsEqualTo(expectedLeft = 50.dp, expectedTop = 100.dp)
             .assertLeftPositionInRootIsEqualTo(50.dp)
             .assertTopPositionInRootIsEqualTo(100.dp)
@@ -203,12 +169,14 @@
         composeBox()
 
         expectError<AssertionError> {
-            rule.onNodeWithTag(tag)
+            rule
+                .onNodeWithTag(tag)
                 .assertPositionInRootIsEqualTo(expectedLeft = 51.dp, expectedTop = 101.dp)
         }
 
         expectError<AssertionError> {
-            rule.onNodeWithTag(tag)
+            rule
+                .onNodeWithTag(tag)
                 .assertPositionInRootIsEqualTo(expectedLeft = 49.dp, expectedTop = 99.dp)
         }
     }
@@ -216,19 +184,16 @@
     private fun composeClippedBox() {
         rule.setContent {
             Box(
-                modifier = Modifier
-                    .fillMaxSize()
-                    .clipToBounds()
-                    .wrapContentSize(Alignment.TopStart)
+                modifier = Modifier.fillMaxSize().clipToBounds().wrapContentSize(Alignment.TopStart)
             ) {
                 // Box is shifted 30dp to the left and 10dp to the top,
                 // so it is clipped to a size of 50 x 90
                 Box(
-                    modifier = Modifier
-                        .offset((-30).dp, (-10).dp)
-                        .testTag(tag)
-                        .requiredSize(80.dp, 100.dp)
-                        .background(color = Color.Black)
+                    modifier =
+                        Modifier.offset((-30).dp, (-10).dp)
+                            .testTag(tag)
+                            .requiredSize(80.dp, 100.dp)
+                            .background(color = Color.Black)
                 )
             }
         }
@@ -239,7 +204,8 @@
         composeClippedBox()
 
         // Node is clipped, but position should be unaffected
-        rule.onNodeWithTag(tag)
+        rule
+            .onNodeWithTag(tag)
             .assertPositionInRootIsEqualTo(expectedLeft = (-30).dp, expectedTop = (-10).dp)
             .assertLeftPositionInRootIsEqualTo((-30).dp)
             .assertTopPositionInRootIsEqualTo((-10).dp)
@@ -250,19 +216,13 @@
         composeClippedBox()
 
         // Node is clipped, but width and height should be unaffected
-        rule.onNodeWithTag(tag)
-            .assertWidthIsEqualTo(80.dp)
-            .assertHeightIsEqualTo(100.dp)
+        rule.onNodeWithTag(tag).assertWidthIsEqualTo(80.dp).assertHeightIsEqualTo(100.dp)
     }
 
     @Test
     fun getPosition_measuredNotPlaced() {
         // When we have a node that is measure but not placed
-        getPositionTest {
-            DoNotPlace {
-                Box(Modifier.testTag(tag).requiredSize(10.dp))
-            }
-        }
+        getPositionTest { DoNotPlace { Box(Modifier.testTag(tag).requiredSize(10.dp)) } }
     }
 
     @Test
@@ -289,9 +249,7 @@
 
     @Composable
     private fun TouchTargetTestContent(tag: String) {
-        WithMinimumTouchTargetSize(DpSize(20.dp, 20.dp)) {
-            SmallBox(Modifier.clickable {}, tag)
-        }
+        WithMinimumTouchTargetSize(DpSize(20.dp, 20.dp)) { SmallBox(Modifier.clickable {}, tag) }
     }
 
     @Test
@@ -329,11 +287,10 @@
         }
 
         fun SemanticsNodeInteraction.verifyBoundsInRoot() {
-            getBoundsInRoot()
-                .let {
-                    it.left.assertIsEqualTo(20.dp)
-                    it.top.assertIsEqualTo(20.dp)
-                }
+            getBoundsInRoot().let {
+                it.left.assertIsEqualTo(20.dp)
+                it.top.assertIsEqualTo(20.dp)
+            }
         }
 
         rule.onNodeWithTag("default-density").verifyBoundsInRoot()
@@ -365,11 +322,7 @@
     @Test
     fun getPosition_notMeasuredNotPlaced() {
         // When we have a node that is not measure and not placed
-        getPositionTest {
-            DoNotMeasure {
-                Box(Modifier.testTag(tag).requiredSize(10.dp))
-            }
-        }
+        getPositionTest { DoNotMeasure { Box(Modifier.testTag(tag).requiredSize(10.dp)) } }
     }
 
     private fun getPositionTest(content: @Composable () -> Unit) {
@@ -404,21 +357,13 @@
     @Test
     fun getSize_measuredNotPlaced() {
         // When we have a node that is measure but not placed
-        getSizeTest {
-            DoNotPlace {
-                Box(Modifier.testTag(tag).requiredSize(10.dp))
-            }
-        }
+        getSizeTest { DoNotPlace { Box(Modifier.testTag(tag).requiredSize(10.dp)) } }
     }
 
     @Test
     fun getSize_notMeasuredNotPlaced() {
         // When we have a node that is not measure and not placed
-        getSizeTest {
-            DoNotMeasure {
-                Box(Modifier.testTag(tag).requiredSize(10.dp))
-            }
-        }
+        getSizeTest { DoNotMeasure { Box(Modifier.testTag(tag).requiredSize(10.dp)) } }
     }
 
     private fun getSizeTest(content: @Composable () -> Unit) {
@@ -432,8 +377,7 @@
         node.assertWidthIsAtLeast(Dp.Unspecified)
         node.assertHeightIsAtLeast(Dp.Unspecified)
 
-        fun notEqual(subject: String) =
-            "Actual $subject is Dp.Unspecified, expected 10.0.dp \\(.*"
+        fun notEqual(subject: String) = "Actual $subject is Dp.Unspecified, expected 10.0.dp \\(.*"
         fun notAtLeast(subject: String) =
             "Actual $subject is Dp.Unspecified, expected at least 10.0.dp \\(.*"
 
@@ -455,9 +399,7 @@
     fun getAlignmentLine_measuredNotPlaced() {
         // When we have a node with an alignment line that is measured but not placed
         getAlignmentLineTest(expectedPosition = TestLinePosition) {
-            DoNotPlace {
-                BoxWithAlignmentLine(Modifier.testTag(tag))
-            }
+            DoNotPlace { BoxWithAlignmentLine(Modifier.testTag(tag)) }
         }
     }
 
@@ -465,9 +407,7 @@
     fun getAlignmentLine_notMeasuredNotPlaced() {
         // When we have a node with an alignment line that is not measured and not placed
         getAlignmentLineTest(expectedPosition = Dp.Unspecified) {
-            DoNotMeasure {
-                BoxWithAlignmentLine(Modifier.testTag(tag))
-            }
+            DoNotMeasure { BoxWithAlignmentLine(Modifier.testTag(tag)) }
         }
     }
 
@@ -476,9 +416,7 @@
         rule.setContent(content)
 
         // Then we can still query the alignment line
-        rule.onNodeWithTag(tag)
-            .getAlignmentLinePosition(TestLine)
-            .assertIsEqualTo(expectedPosition)
+        rule.onNodeWithTag(tag).getAlignmentLinePosition(TestLine).assertIsEqualTo(expectedPosition)
     }
 
     @Composable
diff --git a/compose/ui/ui-test/src/androidInstrumentedTest/kotlin/androidx/compose/ui/test/gesturescope/LocalToRootTest.kt b/compose/ui/ui-test/src/androidInstrumentedTest/kotlin/androidx/compose/ui/test/gesturescope/LocalToRootTest.kt
index 5006131..004ea4a 100644
--- a/compose/ui/ui-test/src/androidInstrumentedTest/kotlin/androidx/compose/ui/test/gesturescope/LocalToRootTest.kt
+++ b/compose/ui/ui-test/src/androidInstrumentedTest/kotlin/androidx/compose/ui/test/gesturescope/LocalToRootTest.kt
@@ -37,8 +37,7 @@
 import org.junit.Test
 
 class LocalToRootTest {
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
     private val recorder = SinglePointerInputRecorder()
 
@@ -57,12 +56,9 @@
             }
         }
 
-        @Suppress("DEPRECATION")
-        rule.onNodeWithTag("viewport").performGesture { click(center) }
+        @Suppress("DEPRECATION") rule.onNodeWithTag("viewport").performGesture { click(center) }
 
         val expectedClickLocation = Offset(50f, 30f)
-        recorder.events.forEach {
-            assertThat(it.position).isEqualTo(expectedClickLocation)
-        }
+        recorder.events.forEach { assertThat(it.position).isEqualTo(expectedClickLocation) }
     }
 }
diff --git a/compose/ui/ui-test/src/androidInstrumentedTest/kotlin/androidx/compose/ui/test/gesturescope/PositionsTest.kt b/compose/ui/ui-test/src/androidInstrumentedTest/kotlin/androidx/compose/ui/test/gesturescope/PositionsTest.kt
index b6b6a59..dade9055 100644
--- a/compose/ui/ui-test/src/androidInstrumentedTest/kotlin/androidx/compose/ui/test/gesturescope/PositionsTest.kt
+++ b/compose/ui/ui-test/src/androidInstrumentedTest/kotlin/androidx/compose/ui/test/gesturescope/PositionsTest.kt
@@ -57,8 +57,7 @@
 @MediumTest
 class PositionsTest {
 
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
     @Test
     fun testCornersEdgesAndCenter() {
diff --git a/compose/ui/ui-test/src/androidInstrumentedTest/kotlin/androidx/compose/ui/test/gesturescope/SendClickTest.kt b/compose/ui/ui-test/src/androidInstrumentedTest/kotlin/androidx/compose/ui/test/gesturescope/SendClickTest.kt
index 45a48df..c38fbc1 100644
--- a/compose/ui/ui-test/src/androidInstrumentedTest/kotlin/androidx/compose/ui/test/gesturescope/SendClickTest.kt
+++ b/compose/ui/ui-test/src/androidInstrumentedTest/kotlin/androidx/compose/ui/test/gesturescope/SendClickTest.kt
@@ -42,10 +42,7 @@
 @MediumTest
 @RunWith(Parameterized::class)
 class SendClickTest(private val config: TestConfig) {
-    data class TestConfig(
-        val position: Offset?,
-        val activityClass: Class<out ComponentActivity>
-    )
+    data class TestConfig(val position: Offset?, val activityClass: Class<out ComponentActivity>)
 
     companion object {
         private const val squareSize = 10.0f
@@ -67,10 +64,7 @@
         }
     }
 
-    private data class ClickData(
-        val componentIndex: Int,
-        val position: Offset
-    )
+    private data class ClickData(val componentIndex: Int, val position: Offset)
 
     private class ClickRecorder(
         private val componentIndex: Int,
@@ -85,12 +79,10 @@
         }
     }
 
-    @get:Rule
-    val rule = createAndroidComposeRule(config.activityClass)
+    @get:Rule val rule = createAndroidComposeRule(config.activityClass)
 
     private val recordedClicks = mutableListOf<ClickData>()
-    private val expectedClickPosition =
-        config.position ?: Offset(squareSize / 2, squareSize / 2)
+    private val expectedClickPosition = config.position ?: Offset(squareSize / 2, squareSize / 2)
 
     @Test
     fun testClick() {
@@ -112,12 +104,10 @@
 
         // Then those components have registered a click
         rule.runOnIdle {
-            assertThat(recordedClicks).isEqualTo(
-                listOf(
-                    ClickData(0, expectedClickPosition),
-                    ClickData(4, expectedClickPosition)
+            assertThat(recordedClicks)
+                .isEqualTo(
+                    listOf(ClickData(0, expectedClickPosition), ClickData(4, expectedClickPosition))
                 )
-            )
         }
     }
 
diff --git a/compose/ui/ui-test/src/androidInstrumentedTest/kotlin/androidx/compose/ui/test/gesturescope/SendDoubleClickTest.kt b/compose/ui/ui-test/src/androidInstrumentedTest/kotlin/androidx/compose/ui/test/gesturescope/SendDoubleClickTest.kt
index f850352..c649fad 100644
--- a/compose/ui/ui-test/src/androidInstrumentedTest/kotlin/androidx/compose/ui/test/gesturescope/SendDoubleClickTest.kt
+++ b/compose/ui/ui-test/src/androidInstrumentedTest/kotlin/androidx/compose/ui/test/gesturescope/SendDoubleClickTest.kt
@@ -59,16 +59,13 @@
         }
     }
 
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
     private val recordedDoubleClicks = mutableListOf<Offset>()
-    private val expectedClickPosition =
-        config.position ?: Offset(defaultSize / 2, defaultSize / 2)
+    private val expectedClickPosition = config.position ?: Offset(defaultSize / 2, defaultSize / 2)
 
     // The delay plus 2 clicks
-    private val expectedDurationMillis =
-        (config.delayMillis ?: 145L) + (2 * eventPeriodMillis)
+    private val expectedDurationMillis = (config.delayMillis ?: 145L) + (2 * eventPeriodMillis)
 
     private fun recordDoubleClick(position: Offset) {
         recordedDoubleClicks.add(position)
@@ -80,8 +77,7 @@
         val recorder = SinglePointerInputRecorder()
         rule.setContent {
             ClickableTestBox(
-                Modifier
-                    .pointerInput(Unit) { detectTapGestures(onDoubleTap = ::recordDoubleClick) }
+                Modifier.pointerInput(Unit) { detectTapGestures(onDoubleTap = ::recordDoubleClick) }
                     .then(recorder)
             )
         }
diff --git a/compose/ui/ui-test/src/androidInstrumentedTest/kotlin/androidx/compose/ui/test/gesturescope/SendLongClickTest.kt b/compose/ui/ui-test/src/androidInstrumentedTest/kotlin/androidx/compose/ui/test/gesturescope/SendLongClickTest.kt
index e096c4f..02073bf 100644
--- a/compose/ui/ui-test/src/androidInstrumentedTest/kotlin/androidx/compose/ui/test/gesturescope/SendLongClickTest.kt
+++ b/compose/ui/ui-test/src/androidInstrumentedTest/kotlin/androidx/compose/ui/test/gesturescope/SendLongClickTest.kt
@@ -42,9 +42,9 @@
 import org.junit.runners.Parameterized
 
 /**
- * Tests [longClick] with arguments. Verifies that the click is in the middle
- * of the component, that the gesture has a duration of 600 milliseconds and that all input
- * events were on the same location.
+ * Tests [longClick] with arguments. Verifies that the click is in the middle of the component, that
+ * the gesture has a duration of 600 milliseconds and that all input events were on the same
+ * location.
  */
 @MediumTest
 @RunWith(Parameterized::class)
@@ -68,12 +68,10 @@
         }
     }
 
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
     private val recordedLongClicks = mutableListOf<Offset>()
-    private val expectedClickPosition =
-        config.position ?: Offset(defaultSize / 2, defaultSize / 2)
+    private val expectedClickPosition = config.position ?: Offset(defaultSize / 2, defaultSize / 2)
     private val expectedDuration = config.durationMillis ?: 600L
 
     private fun recordLongPress(position: Offset) {
@@ -87,8 +85,7 @@
         rule.setContent {
             Box(Modifier.fillMaxSize().wrapContentSize(Alignment.BottomEnd)) {
                 ClickableTestBox(
-                    Modifier
-                        .pointerInput(Unit) {
+                    Modifier.pointerInput(Unit) {
                             detectTapGestures(onLongPress = ::recordLongPress)
                         }
                         .then(recorder)
diff --git a/compose/ui/ui-test/src/androidInstrumentedTest/kotlin/androidx/compose/ui/test/gesturescope/SendPinchTest.kt b/compose/ui/ui-test/src/androidInstrumentedTest/kotlin/androidx/compose/ui/test/gesturescope/SendPinchTest.kt
index 4300cf0..098039e 100644
--- a/compose/ui/ui-test/src/androidInstrumentedTest/kotlin/androidx/compose/ui/test/gesturescope/SendPinchTest.kt
+++ b/compose/ui/ui-test/src/androidInstrumentedTest/kotlin/androidx/compose/ui/test/gesturescope/SendPinchTest.kt
@@ -43,17 +43,14 @@
         private const val TAG = "PINCH"
     }
 
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
     private val recorder = MultiPointerInputRecorder()
 
     @Test
     fun pinch() {
         rule.setContent {
-            Box(Modifier.fillMaxSize()) {
-                ClickableTestBox(modifier = recorder, tag = TAG)
-            }
+            Box(Modifier.fillMaxSize()) { ClickableTestBox(modifier = recorder, tag = TAG) }
         }
 
         val start0 = Offset(40f, 50f)
@@ -63,9 +60,7 @@
         val duration = 400L
 
         @Suppress("DEPRECATION")
-        rule.onNodeWithTag(TAG).performGesture {
-            pinch(start0, end0, start1, end1, duration)
-        }
+        rule.onNodeWithTag(TAG).performGesture { pinch(start0, end0, start1, end1, duration) }
 
         rule.runOnIdle {
             recorder.run {
diff --git a/compose/ui/ui-test/src/androidInstrumentedTest/kotlin/androidx/compose/ui/test/gesturescope/SendSwipeTest.kt b/compose/ui/ui-test/src/androidInstrumentedTest/kotlin/androidx/compose/ui/test/gesturescope/SendSwipeTest.kt
index e55845f..e012358 100644
--- a/compose/ui/ui-test/src/androidInstrumentedTest/kotlin/androidx/compose/ui/test/gesturescope/SendSwipeTest.kt
+++ b/compose/ui/ui-test/src/androidInstrumentedTest/kotlin/androidx/compose/ui/test/gesturescope/SendSwipeTest.kt
@@ -76,8 +76,7 @@
         private const val tag = "widget"
     }
 
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
     private val recorder = SinglePointerInputRecorder()
 
@@ -91,8 +90,7 @@
     @Test
     fun swipeUp() {
         rule.setContent { Ui(Alignment.TopStart) }
-        @Suppress("DEPRECATION")
-        rule.onNodeWithTag(tag).performGesture { swipeUp() }
+        @Suppress("DEPRECATION") rule.onNodeWithTag(tag).performGesture { swipeUp() }
         rule.runOnIdle {
             recorder.run {
                 assertTimestampsAreIncreasing()
@@ -105,8 +103,7 @@
     @Test
     fun swipeDown() {
         rule.setContent { Ui(Alignment.TopEnd) }
-        @Suppress("DEPRECATION")
-        rule.onNodeWithTag(tag).performGesture { swipeDown() }
+        @Suppress("DEPRECATION") rule.onNodeWithTag(tag).performGesture { swipeDown() }
         rule.runOnIdle {
             recorder.run {
                 assertTimestampsAreIncreasing()
@@ -119,8 +116,7 @@
     @Test
     fun swipeLeft() {
         rule.setContent { Ui(Alignment.BottomEnd) }
-        @Suppress("DEPRECATION")
-        rule.onNodeWithTag(tag).performGesture { swipeLeft() }
+        @Suppress("DEPRECATION") rule.onNodeWithTag(tag).performGesture { swipeLeft() }
         rule.runOnIdle {
             recorder.run {
                 assertTimestampsAreIncreasing()
@@ -133,8 +129,7 @@
     @Test
     fun swipeRight() {
         rule.setContent { Ui(Alignment.BottomStart) }
-        @Suppress("DEPRECATION")
-        rule.onNodeWithTag(tag).performGesture { swipeRight() }
+        @Suppress("DEPRECATION") rule.onNodeWithTag(tag).performGesture { swipeRight() }
         rule.runOnIdle {
             recorder.run {
                 assertTimestampsAreIncreasing()
@@ -147,8 +142,7 @@
     @Test
     fun swipeUp_withParameters() {
         rule.setContent { Ui(Alignment.TopStart) }
-        @Suppress("DEPRECATION")
-        @OptIn(ExperimentalTestApi::class)
+        @Suppress("DEPRECATION") @OptIn(ExperimentalTestApi::class)
         rule.onNodeWithTag(tag).performGesture { swipeUp(endY = centerY) }
         rule.runOnIdle {
             recorder.run {
@@ -162,8 +156,7 @@
     @Test
     fun swipeDown_withParameters() {
         rule.setContent { Ui(Alignment.TopEnd) }
-        @Suppress("DEPRECATION")
-        @OptIn(ExperimentalTestApi::class)
+        @Suppress("DEPRECATION") @OptIn(ExperimentalTestApi::class)
         rule.onNodeWithTag(tag).performGesture { swipeDown(endY = centerY) }
         rule.runOnIdle {
             recorder.run {
@@ -177,8 +170,7 @@
     @Test
     fun swipeLeft_withParameters() {
         rule.setContent { Ui(Alignment.BottomEnd) }
-        @Suppress("DEPRECATION")
-        @OptIn(ExperimentalTestApi::class)
+        @Suppress("DEPRECATION") @OptIn(ExperimentalTestApi::class)
         rule.onNodeWithTag(tag).performGesture { swipeLeft(endX = centerX) }
         rule.runOnIdle {
             recorder.run {
@@ -192,8 +184,7 @@
     @Test
     fun swipeRight_withParameters() {
         rule.setContent { Ui(Alignment.BottomStart) }
-        @Suppress("DEPRECATION")
-        @OptIn(ExperimentalTestApi::class)
+        @Suppress("DEPRECATION") @OptIn(ExperimentalTestApi::class)
         rule.onNodeWithTag(tag).performGesture { swipeRight(endX = centerX) }
         rule.runOnIdle {
             recorder.run {
@@ -210,8 +201,7 @@
         expectError<IllegalArgumentException>(
             expectedMessage = "startY=0.0 needs to be greater than or equal to endY=1.0"
         ) {
-            @Suppress("DEPRECATION")
-            @OptIn(ExperimentalTestApi::class)
+            @Suppress("DEPRECATION") @OptIn(ExperimentalTestApi::class)
             rule.onNodeWithTag(tag).performGesture { swipeUp(startY = 0f, endY = 1f) }
         }
     }
@@ -222,8 +212,7 @@
         expectError<IllegalArgumentException>(
             expectedMessage = "startY=1.0 needs to be less than or equal to endY=0.0"
         ) {
-            @Suppress("DEPRECATION")
-            @OptIn(ExperimentalTestApi::class)
+            @Suppress("DEPRECATION") @OptIn(ExperimentalTestApi::class)
             rule.onNodeWithTag(tag).performGesture { swipeDown(startY = 1f, endY = 0f) }
         }
     }
@@ -234,8 +223,7 @@
         expectError<IllegalArgumentException>(
             expectedMessage = "startX=0.0 needs to be greater than or equal to endX=1.0"
         ) {
-            @Suppress("DEPRECATION")
-            @OptIn(ExperimentalTestApi::class)
+            @Suppress("DEPRECATION") @OptIn(ExperimentalTestApi::class)
             rule.onNodeWithTag(tag).performGesture { swipeLeft(startX = 0f, endX = 1f) }
         }
     }
@@ -246,8 +234,7 @@
         expectError<IllegalArgumentException>(
             expectedMessage = "startX=1.0 needs to be less than or equal to endX=0.0"
         ) {
-            @Suppress("DEPRECATION")
-            @OptIn(ExperimentalTestApi::class)
+            @Suppress("DEPRECATION") @OptIn(ExperimentalTestApi::class)
             rule.onNodeWithTag(tag).performGesture { swipeRight(startX = 1f, endX = 0f) }
         }
     }
@@ -288,14 +275,11 @@
                 with(LocalDensity.current) {
                     // Scrollable with a viewport the size of 10 boxes
                     Column(
-                        Modifier
-                            .testTag("scrollable")
+                        Modifier.testTag("scrollable")
                             .requiredSize(100.toDp(), 1000.toDp())
                             .verticalScroll(scrollState)
                     ) {
-                        repeat(100) {
-                            ClickableTestBox()
-                        }
+                        repeat(100) { ClickableTestBox() }
                     }
                 }
             }
diff --git a/compose/ui/ui-test/src/androidInstrumentedTest/kotlin/androidx/compose/ui/test/gesturescope/SendSwipeVelocityTest.kt b/compose/ui/ui-test/src/androidInstrumentedTest/kotlin/androidx/compose/ui/test/gesturescope/SendSwipeVelocityTest.kt
index 95ff3c3..b74b796 100644
--- a/compose/ui/ui-test/src/androidInstrumentedTest/kotlin/androidx/compose/ui/test/gesturescope/SendSwipeVelocityTest.kt
+++ b/compose/ui/ui-test/src/androidInstrumentedTest/kotlin/androidx/compose/ui/test/gesturescope/SendSwipeVelocityTest.kt
@@ -45,17 +45,11 @@
 import org.junit.runner.RunWith
 import org.junit.runners.Parameterized
 
-/**
- * Tests if we can generate gestures that end with a specific velocity
- */
+/** Tests if we can generate gestures that end with a specific velocity */
 @MediumTest
 @RunWith(Parameterized::class)
 class SendSwipeVelocityTest(private val config: TestConfig) {
-    data class TestConfig(
-        val direction: Direction,
-        val durationMillis: Long,
-        val velocity: Float
-    )
+    data class TestConfig(val direction: Direction, val durationMillis: Long, val velocity: Float)
 
     enum class Direction(val from: Offset, val to: Offset) {
         LeftToRight(Offset(boxStart, boxMiddle), Offset(boxEnd, boxMiddle)),
@@ -87,25 +81,33 @@
         private val boxEnd = boxSize - 1.0f
     }
 
-    private val start get() = config.direction.from
-    private val end get() = config.direction.to
-    private val duration get() = config.durationMillis
-    private val velocity get() = config.velocity
+    private val start
+        get() = config.direction.from
 
-    private val expectedXVelocity = when (config.direction) {
-        Direction.LeftToRight -> velocity
-        Direction.RightToLeft -> -velocity
-        else -> 0f
-    }
+    private val end
+        get() = config.direction.to
 
-    private val expectedYVelocity = when (config.direction) {
-        Direction.TopToBottom -> velocity
-        Direction.BottomToTop -> -velocity
-        else -> 0f
-    }
+    private val duration
+        get() = config.durationMillis
 
-    @get:Rule
-    val rule = createComposeRule()
+    private val velocity
+        get() = config.velocity
+
+    private val expectedXVelocity =
+        when (config.direction) {
+            Direction.LeftToRight -> velocity
+            Direction.RightToLeft -> -velocity
+            else -> 0f
+        }
+
+    private val expectedYVelocity =
+        when (config.direction) {
+            Direction.TopToBottom -> velocity
+            Direction.BottomToTop -> -velocity
+            else -> 0f
+        }
+
+    @get:Rule val rule = createComposeRule()
 
     private val recorder = SinglePointerInputRecorder()
 
@@ -113,18 +115,13 @@
     @Test
     fun swipeWithVelocity() {
         rule.setContent {
-            Box(
-                Modifier
-                    .fillMaxSize()
-                    .wrapContentSize(Alignment.BottomEnd)) {
+            Box(Modifier.fillMaxSize().wrapContentSize(Alignment.BottomEnd)) {
                 ClickableTestBox(recorder, boxSize, boxSize, tag = tag)
             }
         }
 
         @Suppress("DEPRECATION")
-        rule.onNodeWithTag(tag).performGesture {
-            swipeWithVelocity(start, end, velocity, duration)
-        }
+        rule.onNodeWithTag(tag).performGesture { swipeWithVelocity(start, end, velocity, duration) }
 
         rule.runOnIdle {
             recorder.run {
diff --git a/compose/ui/ui-test/src/androidInstrumentedTest/kotlin/androidx/compose/ui/test/injectionscope/PositionsTest.kt b/compose/ui/ui-test/src/androidInstrumentedTest/kotlin/androidx/compose/ui/test/injectionscope/PositionsTest.kt
index 9c8a713..d343ded 100644
--- a/compose/ui/ui-test/src/androidInstrumentedTest/kotlin/androidx/compose/ui/test/injectionscope/PositionsTest.kt
+++ b/compose/ui/ui-test/src/androidInstrumentedTest/kotlin/androidx/compose/ui/test/injectionscope/PositionsTest.kt
@@ -46,8 +46,7 @@
 @MediumTest
 class PositionsTest {
 
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
     @Test
     fun testCornersEdgesAndCenter() {
@@ -94,9 +93,7 @@
     fun testDensity() {
         val expectedDensity = Density(0.8238974f, 0.923457f) // random value
         rule.setContent {
-            CompositionLocalProvider(
-                LocalDensity provides expectedDensity
-            ) {
+            CompositionLocalProvider(LocalDensity provides expectedDensity) {
                 ClickableTestBox(width = 3f, height = 100f)
             }
         }
diff --git a/compose/ui/ui-test/src/androidInstrumentedTest/kotlin/androidx/compose/ui/test/injectionscope/key/KeyDownTest.kt b/compose/ui/ui-test/src/androidInstrumentedTest/kotlin/androidx/compose/ui/test/injectionscope/key/KeyDownTest.kt
index 58471ca..661276c 100644
--- a/compose/ui/ui-test/src/androidInstrumentedTest/kotlin/androidx/compose/ui/test/injectionscope/key/KeyDownTest.kt
+++ b/compose/ui/ui-test/src/androidInstrumentedTest/kotlin/androidx/compose/ui/test/injectionscope/key/KeyDownTest.kt
@@ -32,21 +32,16 @@
 import org.junit.Rule
 import org.junit.Test
 
-/**
- * Tests if [KeyInjectionScope.keyDown] works
- */
+/** Tests if [KeyInjectionScope.keyDown] works */
 @MediumTest
 class KeyDownTest {
 
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
     @Before
     fun setUp() {
         // Set content to a simple text field.
-        rule.setContent {
-            TestTextField()
-        }
+        rule.setContent { TestTextField() }
         // Bring text field into focus by clicking on it.
         rule.onNodeWithTag(TestTextField.Tag).performClick()
     }
@@ -55,8 +50,8 @@
     fun doubleDown_throwsIllegalStateException() {
         rule.performKeyInput { keyDown(Key.Enter) }
         expectError<IllegalStateException>(
-            expectedMessage = "Cannot send key down event, " +
-                "Key\\(${Key.Enter}\\) is already pressed down."
+            expectedMessage =
+                "Cannot send key down event, " + "Key\\(${Key.Enter}\\) is already pressed down."
         ) {
             rule.performKeyInput { keyDown(Key.Enter) }
         }
diff --git a/compose/ui/ui-test/src/androidInstrumentedTest/kotlin/androidx/compose/ui/test/injectionscope/key/KeyPressTest.kt b/compose/ui/ui-test/src/androidInstrumentedTest/kotlin/androidx/compose/ui/test/injectionscope/key/KeyPressTest.kt
index 634bc27..936b2dd 100644
--- a/compose/ui/ui-test/src/androidInstrumentedTest/kotlin/androidx/compose/ui/test/injectionscope/key/KeyPressTest.kt
+++ b/compose/ui/ui-test/src/androidInstrumentedTest/kotlin/androidx/compose/ui/test/injectionscope/key/KeyPressTest.kt
@@ -32,21 +32,16 @@
 import org.junit.Rule
 import org.junit.Test
 
-/**
- * Tests if [KeyInjectionScope.pressKey] works.
- */
+/** Tests if [KeyInjectionScope.pressKey] works. */
 @LargeTest
 class KeyPressTest {
 
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
     @Before
     fun setUp() {
         // Set content to a simple text field.
-        rule.setContent {
-            TestTextField()
-        }
+        rule.setContent { TestTextField() }
         // Bring text field into focus by clicking on it.
         rule.onNodeWithTag(Tag).performClick()
     }
diff --git a/compose/ui/ui-test/src/androidInstrumentedTest/kotlin/androidx/compose/ui/test/injectionscope/key/KeyUpTest.kt b/compose/ui/ui-test/src/androidInstrumentedTest/kotlin/androidx/compose/ui/test/injectionscope/key/KeyUpTest.kt
index e83f1c5..6a8f882 100644
--- a/compose/ui/ui-test/src/androidInstrumentedTest/kotlin/androidx/compose/ui/test/injectionscope/key/KeyUpTest.kt
+++ b/compose/ui/ui-test/src/androidInstrumentedTest/kotlin/androidx/compose/ui/test/injectionscope/key/KeyUpTest.kt
@@ -31,21 +31,16 @@
 import org.junit.Rule
 import org.junit.Test
 
-/**
- * Tests if [KeyInjectionScope.keyUp] works
- */
+/** Tests if [KeyInjectionScope.keyUp] works */
 @MediumTest
 class KeyUpTest {
 
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
     @Before
     fun setUp() {
         // Set content to a simple text field.
-        rule.setContent {
-            TestTextField()
-        }
+        rule.setContent { TestTextField() }
     }
 
     @Test
diff --git a/compose/ui/ui-test/src/androidInstrumentedTest/kotlin/androidx/compose/ui/test/injectionscope/key/LockKeysTest.kt b/compose/ui/ui-test/src/androidInstrumentedTest/kotlin/androidx/compose/ui/test/injectionscope/key/LockKeysTest.kt
index c93ee2a..f19a1cb 100644
--- a/compose/ui/ui-test/src/androidInstrumentedTest/kotlin/androidx/compose/ui/test/injectionscope/key/LockKeysTest.kt
+++ b/compose/ui/ui-test/src/androidInstrumentedTest/kotlin/androidx/compose/ui/test/injectionscope/key/LockKeysTest.kt
@@ -41,21 +41,17 @@
 @MediumTest
 class LockKeysTest {
 
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
     @Before
     fun setUp() {
         // Set content to a simple text field.
-        rule.setContent {
-            TestTextField()
-        }
+        rule.setContent { TestTextField() }
         // Bring text field into focus by clicking on it.
         rule.onNodeWithTag(Tag).performClick()
     }
 
-    @Test
-    fun lockKeys_startOff() = rule.performKeyInput { assertAllLockKeysOff() }
+    @Test fun lockKeys_startOff() = rule.performKeyInput { assertAllLockKeysOff() }
 
     @Test
     fun lockKeys_areOn_afterToggle() {
@@ -73,9 +69,7 @@
     @Test
     fun allLockKeysOn_withKeysToggled() {
         rule.performKeyInput {
-            withKeysToggled(
-                listOf(Key.CapsLock, Key.NumLock, Key.ScrollLock)
-            ) {
+            withKeysToggled(listOf(Key.CapsLock, Key.NumLock, Key.ScrollLock)) {
                 assertTrue(isCapsLockOn)
                 assertTrue(isNumLockOn)
                 assertTrue(isScrollLockOn)
@@ -108,7 +102,8 @@
                 pressKey(Key.B)
             }
             pressKey(Key.A)
-            pressKey(Key.B) }
+            pressKey(Key.B)
+        }
 
         rule.assertTyped("ABabAB")
     }
@@ -133,9 +128,7 @@
             pressKey(Key.NumLock)
             pressKey(Key.NumPad0)
             pressKey(Key.NumPad1)
-            withKeyToggled(Key.NumLock) {
-                pressKey(Key.NumPad0)
-            }
+            withKeyToggled(Key.NumLock) { pressKey(Key.NumPad0) }
         }
 
         rule.assertTyped("01")
@@ -156,7 +149,9 @@
             try {
                 // When an exception is thrown during withKeyToggled
                 withKeyToggled(Key.CapsLock) { error("") }
-            } catch (e: Exception) { /* ignore */ }
+            } catch (e: Exception) {
+                /* ignore */
+            }
             // The key was restored to turned off
             assertFalse(isCapsLockOn)
         }
@@ -168,7 +163,9 @@
             try {
                 // When an exception is thrown during withKeyToggled
                 withKeysToggled(listOf(Key.CapsLock, Key.NumLock)) { error("") }
-            } catch (e: Exception) { /* ignore */ }
+            } catch (e: Exception) {
+                /* ignore */
+            }
             // The keys were restored to turned off
             assertFalse(isCapsLockOn)
             assertFalse(isNumLockOn)
diff --git a/compose/ui/ui-test/src/androidInstrumentedTest/kotlin/androidx/compose/ui/test/injectionscope/key/MetaKeysTest.kt b/compose/ui/ui-test/src/androidInstrumentedTest/kotlin/androidx/compose/ui/test/injectionscope/key/MetaKeysTest.kt
index 68e97e8..c75b5ba 100644
--- a/compose/ui/ui-test/src/androidInstrumentedTest/kotlin/androidx/compose/ui/test/injectionscope/key/MetaKeysTest.kt
+++ b/compose/ui/ui-test/src/androidInstrumentedTest/kotlin/androidx/compose/ui/test/injectionscope/key/MetaKeysTest.kt
@@ -41,27 +41,21 @@
 import org.junit.Rule
 import org.junit.Test
 
-/**
- * Tests if the meta key methods in [KeyInjectionScope] such as [isShiftDown] work.
- */
+/** Tests if the meta key methods in [KeyInjectionScope] such as [isShiftDown] work. */
 @MediumTest
 class MetaKeysTest {
 
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
     @Before
     fun setUp() {
         // Set content to a simple text field.
-        rule.setContent {
-            TestTextField()
-        }
+        rule.setContent { TestTextField() }
         // Bring text field into focus by clicking on it.
         rule.onNodeWithTag(Tag).performClick()
     }
 
-    @Test
-    fun metaKeys_startUp() = assertAllMetaKeysUp()
+    @Test fun metaKeys_startUp() = assertAllMetaKeysUp()
 
     @Test
     fun metaKeys_areDown_afterDown() {
@@ -76,20 +70,15 @@
         assertAllMetaKeysUp()
     }
 
-    @Test
-    fun functionKey_isDown_withFnDown() = assertKeyDownIsTrueWithKeyDown(Key.Function)
+    @Test fun functionKey_isDown_withFnDown() = assertKeyDownIsTrueWithKeyDown(Key.Function)
 
-    @Test
-    fun ctrl_isDown_withCtrlDown() = assertKeyDownIsTrueWithKeyDown(Key.CtrlLeft)
+    @Test fun ctrl_isDown_withCtrlDown() = assertKeyDownIsTrueWithKeyDown(Key.CtrlLeft)
 
-    @Test
-    fun alt_isDown_withAltDown() = assertKeyDownIsTrueWithKeyDown(Key.AltLeft)
+    @Test fun alt_isDown_withAltDown() = assertKeyDownIsTrueWithKeyDown(Key.AltLeft)
 
-    @Test
-    fun meta_isDown_withMetaDown() = assertKeyDownIsTrueWithKeyDown(Key.MetaLeft)
+    @Test fun meta_isDown_withMetaDown() = assertKeyDownIsTrueWithKeyDown(Key.MetaLeft)
 
-    @Test
-    fun shift_isDown_withShiftDown() = assertKeyDownIsTrueWithKeyDown(Key.ShiftLeft)
+    @Test fun shift_isDown_withShiftDown() = assertKeyDownIsTrueWithKeyDown(Key.ShiftLeft)
 
     @Test
     fun allMetaKeysDown_withKeysDown() {
@@ -122,8 +111,8 @@
     @Test
     fun fnDown_inWithFnDown_throwsIllegalStateException() {
         expectError<IllegalStateException>(
-            expectedMessage = "Cannot send key down event, " +
-                "Key\\(${Key.Function}\\) is already pressed down."
+            expectedMessage =
+                "Cannot send key down event, " + "Key\\(${Key.Function}\\) is already pressed down."
         ) {
             rule.performKeyInput {
                 withKeyDown(Key.Function) {
@@ -140,7 +129,9 @@
             try {
                 // When an exception is thrown during withKeyDown
                 withKeyDown(Key.ShiftLeft) { error("") }
-            } catch (e: Exception) { /* ignore */ }
+            } catch (e: Exception) {
+                /* ignore */
+            }
             // The key was restored to up
             assertFalse(isShiftDown)
         }
@@ -152,7 +143,9 @@
             try {
                 // When an exception is thrown during withKeysDown
                 withKeysDown(listOf(Key.ShiftLeft, Key.AltRight)) { error("") }
-            } catch (e: Exception) { /* ignore */ }
+            } catch (e: Exception) {
+                /* ignore */
+            }
             // The keys were restored to up
             assertFalse(isShiftDown)
             assertFalse(isAltDown)
diff --git a/compose/ui/ui-test/src/androidInstrumentedTest/kotlin/androidx/compose/ui/test/injectionscope/mouse/CancelTest.kt b/compose/ui/ui-test/src/androidInstrumentedTest/kotlin/androidx/compose/ui/test/injectionscope/mouse/CancelTest.kt
index c07fbeb..3071ed9 100644
--- a/compose/ui/ui-test/src/androidInstrumentedTest/kotlin/androidx/compose/ui/test/injectionscope/mouse/CancelTest.kt
+++ b/compose/ui/ui-test/src/androidInstrumentedTest/kotlin/androidx/compose/ui/test/injectionscope/mouse/CancelTest.kt
@@ -35,27 +35,30 @@
 @OptIn(ExperimentalTestApi::class)
 class CancelTest {
     @Test
-    fun cancel() = runMouseInputInjectionTest(
-        mouseInput = {
-            // press the primary button
-            press(MouseButton.Primary)
-            // cancel the gesture
-            cancel()
-        },
-        eventVerifiers = arrayOf(
-            { this.verifyMouseEvent(0, Enter, false, Offset.Zero) },
-            { this.verifyMouseEvent(0, Press, true, Offset.Zero, PrimaryButton) },
+    fun cancel() =
+        runMouseInputInjectionTest(
+            mouseInput = {
+                // press the primary button
+                press(MouseButton.Primary)
+                // cancel the gesture
+                cancel()
+            },
+            eventVerifiers =
+                arrayOf(
+                    { this.verifyMouseEvent(0, Enter, false, Offset.Zero) },
+                    { this.verifyMouseEvent(0, Press, true, Offset.Zero, PrimaryButton) },
+                )
         )
-    )
 
     @Test
-    fun cancel_withoutPress() = runMouseInputInjectionTest(
-        mouseInput = {
-            expectError<IllegalStateException>(
-                expectedMessage = "Cannot send mouse cancel event, no mouse buttons are pressed"
-            ) {
-                cancel()
+    fun cancel_withoutPress() =
+        runMouseInputInjectionTest(
+            mouseInput = {
+                expectError<IllegalStateException>(
+                    expectedMessage = "Cannot send mouse cancel event, no mouse buttons are pressed"
+                ) {
+                    cancel()
+                }
             }
-        }
-    )
+        )
 }
diff --git a/compose/ui/ui-test/src/androidInstrumentedTest/kotlin/androidx/compose/ui/test/injectionscope/mouse/ClickTest.kt b/compose/ui/ui-test/src/androidInstrumentedTest/kotlin/androidx/compose/ui/test/injectionscope/mouse/ClickTest.kt
index 2881f1e..b3151cc 100644
--- a/compose/ui/ui-test/src/androidInstrumentedTest/kotlin/androidx/compose/ui/test/injectionscope/mouse/ClickTest.kt
+++ b/compose/ui/ui-test/src/androidInstrumentedTest/kotlin/androidx/compose/ui/test/injectionscope/mouse/ClickTest.kt
@@ -81,174 +81,191 @@
     }
 
     @Test
-    fun click_pressIn_releaseIn() = runMouseInputInjectionTest(
-        mouseInput = {
-            // enter the box
-            moveTo(positionIn)
-            // press primary button
-            press(MouseButton.Primary)
-            // move around the box
-            moveTo(positionMove1)
-            // release primary button
-            release(MouseButton.Primary)
-        },
-        eventVerifiers = arrayOf(
-            { verifyMouseEvent(1 * T, Enter, false, positionIn) },
-            { verifyMouseEvent(1 * T, Press, true, positionIn, PrimaryButton) },
-            { verifyMouseEvent(2 * T, Move, true, positionMove1, PrimaryButton) },
-            { verifyMouseEvent(2 * T, Release, false, positionMove1) },
-        )
-    )
-
-    @Test
-    fun click_pressIn_moveOutIn_releaseIn() = runMouseInputInjectionTest(
-        mouseInput = {
-            // enter the box
-            moveTo(positionIn)
-            // press primary button
-            press(MouseButton.Primary)
-            // move out of the box
-            moveTo(positionOut)
-            // move back into the box
-            moveTo(positionMove1)
-            // release primary button in the box
-            release(MouseButton.Primary)
-        },
-        eventVerifiers = arrayOf(
-            { verifyMouseEvent(1 * T, Enter, false, positionIn) },
-            { verifyMouseEvent(1 * T, Press, true, positionIn, PrimaryButton) },
-            { verifyMouseEvent(2 * T, Exit, true, positionOut, PrimaryButton) },
-            { verifyMouseEvent(3 * T, Enter, true, positionMove1, PrimaryButton) },
-            { verifyMouseEvent(3 * T, Release, false, positionMove1) },
-        )
-    )
-
-    @Test
-    fun click_pressIn_releaseOut() = runMouseInputInjectionTest(
-        mouseInput = {
-            // enter the box
-            moveTo(positionIn)
-            // press primary button
-            press(MouseButton.Primary)
-            // move out of the box
-            moveTo(positionOut)
-            // release primary button
-            release(MouseButton.Primary)
-        },
-        eventVerifiers = arrayOf(
-            { verifyMouseEvent(1 * T, Enter, false, positionIn) },
-            { verifyMouseEvent(1 * T, Press, true, positionIn, PrimaryButton) },
-            { verifyMouseEvent(2 * T, Exit, true, positionOut, PrimaryButton) },
-            { verifyMouseEvent(2 * T, Release, false, positionOut) },
-        )
-    )
-
-    @Test
-    fun click_twoButtons_symmetric() = runMouseInputInjectionTest(
-        mouseInput = {
-            // enter the box
-            moveTo(positionIn)
-            // press primary button
-            press(MouseButton.Primary)
-            // move around the box
-            moveTo(positionMove1)
-            // press secondary button
-            press(MouseButton.Secondary)
-            // move around a bit more
-            moveTo(positionMove2)
-            // release secondary button
-            release(MouseButton.Secondary)
-            // release primary button
-            release(MouseButton.Primary)
-        },
-        eventVerifiers = arrayOf(
-            { verifyMouseEvent(1 * T, Enter, false, positionIn) },
-            { verifyMouseEvent(1 * T, Press, true, positionIn, PrimaryButton) },
-            { verifyMouseEvent(2 * T, Move, true, positionMove1, PrimaryButton) },
-            // TODO(b/234439423): Expect more events when b/234439423 is fixed
-//            { verifyMouseEvent(2 * T, Press, true, positionMove1, PrimarySecondaryButton) },
-            { verifyMouseEvent(3 * T, Move, true, positionMove2, PrimarySecondaryButton) },
-//            { verifyMouseEvent(3 * T, Release, true, positionMove2, PrimaryButton) },
-            { verifyMouseEvent(3 * T, Release, false, positionMove2) },
-        )
-    )
-
-    @Test
-    fun click_twoButtons_staggered() = runMouseInputInjectionTest(
-        mouseInput = {
-            // enter the box
-            moveTo(positionIn)
-            // press primary button
-            press(MouseButton.Primary)
-            // move around the box
-            moveTo(positionMove1)
-            // press secondary button
-            press(MouseButton.Secondary)
-            // move around a bit more
-            moveTo(positionMove2)
-            // release primary button
-            release(MouseButton.Primary)
-            // release secondary button
-            release(MouseButton.Secondary)
-        },
-        eventVerifiers = arrayOf(
-            { verifyMouseEvent(1 * T, Enter, false, positionIn) },
-            { verifyMouseEvent(1 * T, Press, true, positionIn, PrimaryButton) },
-            { verifyMouseEvent(2 * T, Move, true, positionMove1, PrimaryButton) },
-            // TODO(b/234439423): Expect more events when b/234439423 is fixed
-//            { verifyMouseEvent(2 * T, Press, true, positionMove1, PrimarySecondaryButton) },
-            { verifyMouseEvent(3 * T, Move, true, positionMove2, PrimarySecondaryButton) },
-//            { verifyMouseEvent(3 * T, Release, true, positionMove2, SecondaryButton) },
-            { verifyMouseEvent(3 * T, Release, false, positionMove2) },
-        )
-    )
-
-    @Test
-    fun press_alreadyPressed() = runMouseInputInjectionTest(
-        mouseInput = {
-            // enter the box
-            moveTo(positionIn)
-            // press primary button
-            press(MouseButton.Primary)
-            // press primary button again
-            expectError<IllegalStateException>(
-                expectedMessage = "Cannot send mouse button down event, " +
-                    "button ${MouseButton.Primary.buttonId} is already pressed"
-            ) {
+    fun click_pressIn_releaseIn() =
+        runMouseInputInjectionTest(
+            mouseInput = {
+                // enter the box
+                moveTo(positionIn)
+                // press primary button
                 press(MouseButton.Primary)
-            }
-        },
-        eventVerifiers = arrayOf(
-            { verifyMouseEvent(1 * T, Enter, false, positionIn) },
-            { verifyMouseEvent(1 * T, Press, true, positionIn, PrimaryButton) },
+                // move around the box
+                moveTo(positionMove1)
+                // release primary button
+                release(MouseButton.Primary)
+            },
+            eventVerifiers =
+                arrayOf(
+                    { verifyMouseEvent(1 * T, Enter, false, positionIn) },
+                    { verifyMouseEvent(1 * T, Press, true, positionIn, PrimaryButton) },
+                    { verifyMouseEvent(2 * T, Move, true, positionMove1, PrimaryButton) },
+                    { verifyMouseEvent(2 * T, Release, false, positionMove1) },
+                )
         )
-    )
 
     @Test
-    fun clickTest() = runMouseInputInjectionTest(
-        mouseInput = {
-            click()
-        },
-        eventVerifiers = arrayOf(
-            // t = 0, because click() presses immediately
-            { verifyMouseEvent(0, Enter, false, positionCenter) },
-            { verifyMouseEvent(0, Press, true, positionCenter, PrimaryButton) },
-            { verifyMouseEvent(ClickDuration, Release, false, positionCenter) },
+    fun click_pressIn_moveOutIn_releaseIn() =
+        runMouseInputInjectionTest(
+            mouseInput = {
+                // enter the box
+                moveTo(positionIn)
+                // press primary button
+                press(MouseButton.Primary)
+                // move out of the box
+                moveTo(positionOut)
+                // move back into the box
+                moveTo(positionMove1)
+                // release primary button in the box
+                release(MouseButton.Primary)
+            },
+            eventVerifiers =
+                arrayOf(
+                    { verifyMouseEvent(1 * T, Enter, false, positionIn) },
+                    { verifyMouseEvent(1 * T, Press, true, positionIn, PrimaryButton) },
+                    { verifyMouseEvent(2 * T, Exit, true, positionOut, PrimaryButton) },
+                    { verifyMouseEvent(3 * T, Enter, true, positionMove1, PrimaryButton) },
+                    { verifyMouseEvent(3 * T, Release, false, positionMove1) },
+                )
         )
-    )
 
     @Test
-    fun rightClickTest() = runMouseInputInjectionTest(
-        mouseInput = {
-            rightClick()
-        },
-        eventVerifiers = arrayOf(
-            // t = 0, because click() presses immediately
-            { verifyMouseEvent(0, Enter, false, positionCenter) },
-            { verifyMouseEvent(0, Press, true, positionCenter, SecondaryButton) },
-            { verifyMouseEvent(ClickDuration, Release, false, positionCenter) },
+    fun click_pressIn_releaseOut() =
+        runMouseInputInjectionTest(
+            mouseInput = {
+                // enter the box
+                moveTo(positionIn)
+                // press primary button
+                press(MouseButton.Primary)
+                // move out of the box
+                moveTo(positionOut)
+                // release primary button
+                release(MouseButton.Primary)
+            },
+            eventVerifiers =
+                arrayOf(
+                    { verifyMouseEvent(1 * T, Enter, false, positionIn) },
+                    { verifyMouseEvent(1 * T, Press, true, positionIn, PrimaryButton) },
+                    { verifyMouseEvent(2 * T, Exit, true, positionOut, PrimaryButton) },
+                    { verifyMouseEvent(2 * T, Release, false, positionOut) },
+                )
         )
-    )
+
+    @Test
+    fun click_twoButtons_symmetric() =
+        runMouseInputInjectionTest(
+            mouseInput = {
+                // enter the box
+                moveTo(positionIn)
+                // press primary button
+                press(MouseButton.Primary)
+                // move around the box
+                moveTo(positionMove1)
+                // press secondary button
+                press(MouseButton.Secondary)
+                // move around a bit more
+                moveTo(positionMove2)
+                // release secondary button
+                release(MouseButton.Secondary)
+                // release primary button
+                release(MouseButton.Primary)
+            },
+            eventVerifiers =
+                arrayOf(
+                    { verifyMouseEvent(1 * T, Enter, false, positionIn) },
+                    { verifyMouseEvent(1 * T, Press, true, positionIn, PrimaryButton) },
+                    { verifyMouseEvent(2 * T, Move, true, positionMove1, PrimaryButton) },
+                    // TODO(b/234439423): Expect more events when b/234439423 is fixed
+                    //            { verifyMouseEvent(2 * T, Press, true, positionMove1,
+                    // PrimarySecondaryButton) },
+                    { verifyMouseEvent(3 * T, Move, true, positionMove2, PrimarySecondaryButton) },
+                    //            { verifyMouseEvent(3 * T, Release, true, positionMove2,
+                    // PrimaryButton) },
+                    { verifyMouseEvent(3 * T, Release, false, positionMove2) },
+                )
+        )
+
+    @Test
+    fun click_twoButtons_staggered() =
+        runMouseInputInjectionTest(
+            mouseInput = {
+                // enter the box
+                moveTo(positionIn)
+                // press primary button
+                press(MouseButton.Primary)
+                // move around the box
+                moveTo(positionMove1)
+                // press secondary button
+                press(MouseButton.Secondary)
+                // move around a bit more
+                moveTo(positionMove2)
+                // release primary button
+                release(MouseButton.Primary)
+                // release secondary button
+                release(MouseButton.Secondary)
+            },
+            eventVerifiers =
+                arrayOf(
+                    { verifyMouseEvent(1 * T, Enter, false, positionIn) },
+                    { verifyMouseEvent(1 * T, Press, true, positionIn, PrimaryButton) },
+                    { verifyMouseEvent(2 * T, Move, true, positionMove1, PrimaryButton) },
+                    // TODO(b/234439423): Expect more events when b/234439423 is fixed
+                    //            { verifyMouseEvent(2 * T, Press, true, positionMove1,
+                    // PrimarySecondaryButton) },
+                    { verifyMouseEvent(3 * T, Move, true, positionMove2, PrimarySecondaryButton) },
+                    //            { verifyMouseEvent(3 * T, Release, true, positionMove2,
+                    // SecondaryButton) },
+                    { verifyMouseEvent(3 * T, Release, false, positionMove2) },
+                )
+        )
+
+    @Test
+    fun press_alreadyPressed() =
+        runMouseInputInjectionTest(
+            mouseInput = {
+                // enter the box
+                moveTo(positionIn)
+                // press primary button
+                press(MouseButton.Primary)
+                // press primary button again
+                expectError<IllegalStateException>(
+                    expectedMessage =
+                        "Cannot send mouse button down event, " +
+                            "button ${MouseButton.Primary.buttonId} is already pressed"
+                ) {
+                    press(MouseButton.Primary)
+                }
+            },
+            eventVerifiers =
+                arrayOf(
+                    { verifyMouseEvent(1 * T, Enter, false, positionIn) },
+                    { verifyMouseEvent(1 * T, Press, true, positionIn, PrimaryButton) },
+                )
+        )
+
+    @Test
+    fun clickTest() =
+        runMouseInputInjectionTest(
+            mouseInput = { click() },
+            eventVerifiers =
+                arrayOf(
+                    // t = 0, because click() presses immediately
+                    { verifyMouseEvent(0, Enter, false, positionCenter) },
+                    { verifyMouseEvent(0, Press, true, positionCenter, PrimaryButton) },
+                    { verifyMouseEvent(ClickDuration, Release, false, positionCenter) },
+                )
+        )
+
+    @Test
+    fun rightClickTest() =
+        runMouseInputInjectionTest(
+            mouseInput = { rightClick() },
+            eventVerifiers =
+                arrayOf(
+                    // t = 0, because click() presses immediately
+                    { verifyMouseEvent(0, Enter, false, positionCenter) },
+                    { verifyMouseEvent(0, Press, true, positionCenter, SecondaryButton) },
+                    { verifyMouseEvent(ClickDuration, Release, false, positionCenter) },
+                )
+        )
 
     @Test
     fun doubleClickTest() {
@@ -259,16 +276,15 @@
         val release2 = press2 + ClickDuration
 
         runMouseInputInjectionTest(
-            mouseInput = {
-                doubleClick()
-            },
-            eventVerifiers = arrayOf(
-                { verifyMouseEvent(press1, Enter, false, positionCenter) },
-                { verifyMouseEvent(press1, Press, true, positionCenter, PrimaryButton) },
-                { verifyMouseEvent(release1, Release, false, positionCenter) },
-                { verifyMouseEvent(press2, Press, true, positionCenter, PrimaryButton) },
-                { verifyMouseEvent(release2, Release, false, positionCenter) },
-            )
+            mouseInput = { doubleClick() },
+            eventVerifiers =
+                arrayOf(
+                    { verifyMouseEvent(press1, Enter, false, positionCenter) },
+                    { verifyMouseEvent(press1, Press, true, positionCenter, PrimaryButton) },
+                    { verifyMouseEvent(release1, Release, false, positionCenter) },
+                    { verifyMouseEvent(press2, Press, true, positionCenter, PrimaryButton) },
+                    { verifyMouseEvent(release2, Release, false, positionCenter) },
+                )
         )
     }
 
@@ -283,34 +299,40 @@
         val release3 = press3 + ClickDuration
 
         runMouseInputInjectionTest(
-            mouseInput = {
-                tripleClick()
-            },
-            eventVerifiers = arrayOf(
-                { verifyMouseEvent(press1, Enter, false, positionCenter) },
-                { verifyMouseEvent(press1, Press, true, positionCenter, PrimaryButton) },
-                { verifyMouseEvent(release1, Release, false, positionCenter) },
-                { verifyMouseEvent(press2, Press, true, positionCenter, PrimaryButton) },
-                { verifyMouseEvent(release2, Release, false, positionCenter) },
-                { verifyMouseEvent(press3, Press, true, positionCenter, PrimaryButton) },
-                { verifyMouseEvent(release3, Release, false, positionCenter) },
-            )
+            mouseInput = { tripleClick() },
+            eventVerifiers =
+                arrayOf(
+                    { verifyMouseEvent(press1, Enter, false, positionCenter) },
+                    { verifyMouseEvent(press1, Press, true, positionCenter, PrimaryButton) },
+                    { verifyMouseEvent(release1, Release, false, positionCenter) },
+                    { verifyMouseEvent(press2, Press, true, positionCenter, PrimaryButton) },
+                    { verifyMouseEvent(release2, Release, false, positionCenter) },
+                    { verifyMouseEvent(press3, Press, true, positionCenter, PrimaryButton) },
+                    { verifyMouseEvent(release3, Release, false, positionCenter) },
+                )
         )
     }
 
     @Test
-    fun longClickTest() = runMouseInputInjectionTest(
-        mouseInput = {
-            longClick()
-        },
-        eventVerifiers = arrayOf(
-            // t = 0, because longClick() presses immediately
-            { verifyMouseEvent(0L, Enter, false, positionCenter) },
-            { verifyMouseEvent(0L, Press, true, positionCenter, PrimaryButton) },
-            // longClick adds 100ms to the minimum required time, just to be sure
-            { verifyMouseEvent(DefaultLongClickTimeMillis + 100, Release, false, positionCenter) },
+    fun longClickTest() =
+        runMouseInputInjectionTest(
+            mouseInput = { longClick() },
+            eventVerifiers =
+                arrayOf(
+                    // t = 0, because longClick() presses immediately
+                    { verifyMouseEvent(0L, Enter, false, positionCenter) },
+                    { verifyMouseEvent(0L, Press, true, positionCenter, PrimaryButton) },
+                    // longClick adds 100ms to the minimum required time, just to be sure
+                    {
+                        verifyMouseEvent(
+                            DefaultLongClickTimeMillis + 100,
+                            Release,
+                            false,
+                            positionCenter
+                        )
+                    },
+                )
         )
-    )
 
     // Rather than checking the events sent on, for this more complex mouse gesture we
     // check if the events actually lead to the expected outcome.
@@ -327,8 +349,7 @@
             @OptIn(ExperimentalFoundationApi::class)
             Box(Modifier.padding(16.dp).fillMaxSize()) {
                 Box(
-                    Modifier
-                        .testTag("draggable-box")
+                    Modifier.testTag("draggable-box")
                         .offset { IntOffset(xOffsetPx.roundToInt(), yOffsetPx.roundToInt()) }
                         .size(sizeDp)
                         .background(Color.Red)
diff --git a/compose/ui/ui-test/src/androidInstrumentedTest/kotlin/androidx/compose/ui/test/injectionscope/mouse/Common.kt b/compose/ui/ui-test/src/androidInstrumentedTest/kotlin/androidx/compose/ui/test/injectionscope/mouse/Common.kt
index fa93172..e25e0fe 100644
--- a/compose/ui/ui-test/src/androidInstrumentedTest/kotlin/androidx/compose/ui/test/injectionscope/mouse/Common.kt
+++ b/compose/ui/ui-test/src/androidInstrumentedTest/kotlin/androidx/compose/ui/test/injectionscope/mouse/Common.kt
@@ -37,9 +37,8 @@
 @OptIn(ExperimentalTestApi::class)
 object Common {
     val PrimaryButton = PointerButtons(MouseButton.Primary.buttonId)
-    val PrimarySecondaryButton = PointerButtons(
-        MouseButton.Primary.buttonId or MouseButton.Secondary.buttonId
-    )
+    val PrimarySecondaryButton =
+        PointerButtons(MouseButton.Primary.buttonId or MouseButton.Secondary.buttonId)
     val SecondaryButton = PointerButtons(MouseButton.Secondary.buttonId)
 
     const val ClickDuration = 60L // MouseInjectionScope.SingleClickDelayMillis
@@ -47,11 +46,12 @@
     private const val DoubleClickMax = 200L
     const val DefaultDoubleClickTimeMillis = (DoubleClickMin + DoubleClickMax) / 2
     const val DefaultLongClickTimeMillis = 300L
-    private val testViewConfiguration = TestViewConfiguration(
-        doubleTapMinTimeMillis = DoubleClickMin,
-        doubleTapTimeoutMillis = DoubleClickMax,
-        longPressTimeoutMillis = DefaultLongClickTimeMillis
-    )
+    private val testViewConfiguration =
+        TestViewConfiguration(
+            doubleTapMinTimeMillis = DoubleClickMin,
+            doubleTapTimeoutMillis = DoubleClickMax,
+            longPressTimeoutMillis = DefaultLongClickTimeMillis
+        )
 
     fun runMouseInputInjectionTest(
         mouseInput: MouseInjectionScope.() -> Unit,
@@ -59,18 +59,12 @@
     ): Unit = runComposeUiTest {
         mainClock.autoAdvance = false
         val recorder = SinglePointerInputRecorder()
-        setContent {
-            WithViewConfiguration(testViewConfiguration) {
-                ClickableTestBox(recorder)
-            }
-        }
+        setContent { WithViewConfiguration(testViewConfiguration) { ClickableTestBox(recorder) } }
         onNodeWithTag(ClickableTestBox.defaultTag).performMouseInput(mouseInput)
         runOnIdle { recorder.verifyEvents(*eventVerifiers) }
     }
 
-    /**
-     * Verifies [DataPoint]s for events that are expected to come from a mouse
-     */
+    /** Verifies [DataPoint]s for events that are expected to come from a mouse */
     fun DataPoint.verifyMouseEvent(
         expectedTimestamp: Long,
         expectedEventType: PointerEventType,
@@ -89,9 +83,7 @@
         )
     }
 
-    /**
-     * Overload of [verifyMouseEvent] that takes a scroll delta too
-     */
+    /** Overload of [verifyMouseEvent] that takes a scroll delta too */
     fun DataPoint.verifyMouseEvent(
         expectedTimestamp: Long,
         expectedEventType: PointerEventType,
diff --git a/compose/ui/ui-test/src/androidInstrumentedTest/kotlin/androidx/compose/ui/test/injectionscope/mouse/MoveTest.kt b/compose/ui/ui-test/src/androidInstrumentedTest/kotlin/androidx/compose/ui/test/injectionscope/mouse/MoveTest.kt
index 3060cf4..28cd6f7 100644
--- a/compose/ui/ui-test/src/androidInstrumentedTest/kotlin/androidx/compose/ui/test/injectionscope/mouse/MoveTest.kt
+++ b/compose/ui/ui-test/src/androidInstrumentedTest/kotlin/androidx/compose/ui/test/injectionscope/mouse/MoveTest.kt
@@ -61,185 +61,203 @@
     }
 
     @Test
-    fun moveTo() = runMouseInputInjectionTest(
-        mouseInput = {
-            // enter the box
-            moveToAndCheck(positionIn, delayMillis = 0L)
-            // move around the box
-            moveToAndCheck(positionMove1)
-            // move around the box with long delay
-            moveToAndCheck(positionMove2, delayMillis = 2 * eventPeriodMillis)
-            // exit the box
-            moveToAndCheck(positionOut)
-            // move back in the box
-            moveToAndCheck(positionIn)
-        },
-        eventVerifiers = arrayOf(
-            { verifyMouseEvent(0 * T, Enter, false, positionIn) },
-            { verifyMouseEvent(1 * T, Move, false, positionMove1) },
-            { verifyMouseEvent(3 * T, Move, false, positionMove2) },
-            { verifyMouseEvent(4 * T, Exit, false, positionOut) },
-            { verifyMouseEvent(5 * T, Enter, false, positionIn) },
+    fun moveTo() =
+        runMouseInputInjectionTest(
+            mouseInput = {
+                // enter the box
+                moveToAndCheck(positionIn, delayMillis = 0L)
+                // move around the box
+                moveToAndCheck(positionMove1)
+                // move around the box with long delay
+                moveToAndCheck(positionMove2, delayMillis = 2 * eventPeriodMillis)
+                // exit the box
+                moveToAndCheck(positionOut)
+                // move back in the box
+                moveToAndCheck(positionIn)
+            },
+            eventVerifiers =
+                arrayOf(
+                    { verifyMouseEvent(0 * T, Enter, false, positionIn) },
+                    { verifyMouseEvent(1 * T, Move, false, positionMove1) },
+                    { verifyMouseEvent(3 * T, Move, false, positionMove2) },
+                    { verifyMouseEvent(4 * T, Exit, false, positionOut) },
+                    { verifyMouseEvent(5 * T, Enter, false, positionIn) },
+                )
         )
-    )
 
     @Test
-    fun moveBy() = runMouseInputInjectionTest(
-        mouseInput = {
-            // enter the box
-            moveByAndCheck(positionIn, delayMillis = 0L)
-            // move around the box
-            moveByAndCheck(positionMove1 - positionIn)
-            // move around the box with long delay
-            moveByAndCheck(positionMove2 - positionMove1, delayMillis = 2 * eventPeriodMillis)
-            // exit the box
-            moveByAndCheck(positionOut - positionMove2)
-            // move back in the box
-            moveByAndCheck(positionIn - positionOut)
-        },
-        eventVerifiers = arrayOf(
-            { verifyMouseEvent(0 * T, Enter, false, positionIn) },
-            { verifyMouseEvent(1 * T, Move, false, positionMove1) },
-            { verifyMouseEvent(3 * T, Move, false, positionMove2) },
-            { verifyMouseEvent(4 * T, Exit, false, positionOut) },
-            { verifyMouseEvent(5 * T, Enter, false, positionIn) },
+    fun moveBy() =
+        runMouseInputInjectionTest(
+            mouseInput = {
+                // enter the box
+                moveByAndCheck(positionIn, delayMillis = 0L)
+                // move around the box
+                moveByAndCheck(positionMove1 - positionIn)
+                // move around the box with long delay
+                moveByAndCheck(positionMove2 - positionMove1, delayMillis = 2 * eventPeriodMillis)
+                // exit the box
+                moveByAndCheck(positionOut - positionMove2)
+                // move back in the box
+                moveByAndCheck(positionIn - positionOut)
+            },
+            eventVerifiers =
+                arrayOf(
+                    { verifyMouseEvent(0 * T, Enter, false, positionIn) },
+                    { verifyMouseEvent(1 * T, Move, false, positionMove1) },
+                    { verifyMouseEvent(3 * T, Move, false, positionMove2) },
+                    { verifyMouseEvent(4 * T, Exit, false, positionOut) },
+                    { verifyMouseEvent(5 * T, Enter, false, positionIn) },
+                )
         )
-    )
 
     @Test
-    fun updatePointerTo() = runMouseInputInjectionTest(
-        mouseInput = {
-            // move around
-            updatePointerToAndCheck(positionIn)
-            updatePointerToAndCheck(positionMove1)
-            updatePointerToAndCheck(positionMove2)
-            // press primary button
-            press(MouseButton.Primary)
-        },
-        eventVerifiers = arrayOf(
-            { verifyMouseEvent(0, Enter, false, positionMove2) },
-            { verifyMouseEvent(0, Press, true, positionMove2, PrimaryButton) },
+    fun updatePointerTo() =
+        runMouseInputInjectionTest(
+            mouseInput = {
+                // move around
+                updatePointerToAndCheck(positionIn)
+                updatePointerToAndCheck(positionMove1)
+                updatePointerToAndCheck(positionMove2)
+                // press primary button
+                press(MouseButton.Primary)
+            },
+            eventVerifiers =
+                arrayOf(
+                    { verifyMouseEvent(0, Enter, false, positionMove2) },
+                    { verifyMouseEvent(0, Press, true, positionMove2, PrimaryButton) },
+                )
         )
-    )
 
     @Test
-    fun updatePointerBy() = runMouseInputInjectionTest(
-        mouseInput = {
-            // move around
-            updatePointerByAndCheck(positionIn)
-            updatePointerByAndCheck(positionMove1 - positionIn)
-            updatePointerByAndCheck(positionMove2 - positionMove1)
-            // press primary button
-            press(MouseButton.Primary)
-        },
-        eventVerifiers = arrayOf(
-            { verifyMouseEvent(0, Enter, false, positionMove2) },
-            { verifyMouseEvent(0, Press, true, positionMove2, PrimaryButton) },
+    fun updatePointerBy() =
+        runMouseInputInjectionTest(
+            mouseInput = {
+                // move around
+                updatePointerByAndCheck(positionIn)
+                updatePointerByAndCheck(positionMove1 - positionIn)
+                updatePointerByAndCheck(positionMove2 - positionMove1)
+                // press primary button
+                press(MouseButton.Primary)
+            },
+            eventVerifiers =
+                arrayOf(
+                    { verifyMouseEvent(0, Enter, false, positionMove2) },
+                    { verifyMouseEvent(0, Press, true, positionMove2, PrimaryButton) },
+                )
         )
-    )
 
     @Test
-    fun enter_exit() = runMouseInputInjectionTest(
-        mouseInput = {
-            // enter the box
-            enter(positionIn)
-            // move around the box
-            moveTo(positionMove1)
-            // exit the box
-            exit(positionOut)
-        },
-        eventVerifiers = arrayOf(
-            { verifyMouseEvent(1 * T, Enter, false, positionIn) },
-            { verifyMouseEvent(2 * T, Move, false, positionMove1) },
-            { verifyMouseEvent(3 * T, Exit, false, positionOut) },
-        )
-    )
-
-    @Test
-    fun enter_alreadyEntered() = runMouseInputInjectionTest(
-        mouseInput = {
-            // enter the box
-            enter(positionIn)
-            // enter again
-            expectError<IllegalStateException>(
-                expectedMessage = "Cannot send mouse hover enter event, mouse is already hovering"
-            ) {
-                enter(positionMove1)
-            }
-        },
-        eventVerifiers = arrayOf(
-            { verifyMouseEvent(1 * T, Enter, false, positionIn) },
-        )
-    )
-
-    @Test
-    fun exit_notEntered() = runMouseInputInjectionTest(
-        mouseInput = {
-            // exit the box
-            expectError<IllegalStateException>(
-                expectedMessage = "Cannot send mouse hover exit event, mouse is not hovering"
-            ) {
+    fun enter_exit() =
+        runMouseInputInjectionTest(
+            mouseInput = {
+                // enter the box
+                enter(positionIn)
+                // move around the box
+                moveTo(positionMove1)
+                // exit the box
                 exit(positionOut)
+            },
+            eventVerifiers =
+                arrayOf(
+                    { verifyMouseEvent(1 * T, Enter, false, positionIn) },
+                    { verifyMouseEvent(2 * T, Move, false, positionMove1) },
+                    { verifyMouseEvent(3 * T, Exit, false, positionOut) },
+                )
+        )
+
+    @Test
+    fun enter_alreadyEntered() =
+        runMouseInputInjectionTest(
+            mouseInput = {
+                // enter the box
+                enter(positionIn)
+                // enter again
+                expectError<IllegalStateException>(
+                    expectedMessage =
+                        "Cannot send mouse hover enter event, mouse is already hovering"
+                ) {
+                    enter(positionMove1)
+                }
+            },
+            eventVerifiers =
+                arrayOf(
+                    { verifyMouseEvent(1 * T, Enter, false, positionIn) },
+                )
+        )
+
+    @Test
+    fun exit_notEntered() =
+        runMouseInputInjectionTest(
+            mouseInput = {
+                // exit the box
+                expectError<IllegalStateException>(
+                    expectedMessage = "Cannot send mouse hover exit event, mouse is not hovering"
+                ) {
+                    exit(positionOut)
+                }
             }
-        }
-    )
+        )
 
     @Test
-    fun animatePointerTo() = runMouseInputInjectionTest(
-        mouseInput = {
-            animateTo(position1, durationMillis = steps * T)
-        },
-        eventVerifiers = arrayOf(
-            { verifyMouseEvent(1 * T, Enter, false, distancePerStep * 1f) },
-            { verifyMouseEvent(2 * T, Move, false, distancePerStep * 2f) },
-            { verifyMouseEvent(3 * T, Move, false, distancePerStep * 3f) },
-            { verifyMouseEvent(4 * T, Move, false, distancePerStep * 4f) },
+    fun animatePointerTo() =
+        runMouseInputInjectionTest(
+            mouseInput = { animateTo(position1, durationMillis = steps * T) },
+            eventVerifiers =
+                arrayOf(
+                    { verifyMouseEvent(1 * T, Enter, false, distancePerStep * 1f) },
+                    { verifyMouseEvent(2 * T, Move, false, distancePerStep * 2f) },
+                    { verifyMouseEvent(3 * T, Move, false, distancePerStep * 3f) },
+                    { verifyMouseEvent(4 * T, Move, false, distancePerStep * 4f) },
+                )
         )
-    )
 
     @Test
-    fun animatePointerBy() = runMouseInputInjectionTest(
-        mouseInput = {
-            moveTo(position2)
-            animateBy(distance, durationMillis = steps * T)
-        },
-        eventVerifiers = arrayOf(
-            { verifyMouseEvent(1 * T, Enter, false, position2) },
-            { verifyMouseEvent(2 * T, Move, false, position2 + (distancePerStep * 1f)) },
-            { verifyMouseEvent(3 * T, Move, false, position2 + (distancePerStep * 2f)) },
-            { verifyMouseEvent(4 * T, Move, false, position2 + (distancePerStep * 3f)) },
-            { verifyMouseEvent(5 * T, Move, false, position2 + (distancePerStep * 4f)) },
+    fun animatePointerBy() =
+        runMouseInputInjectionTest(
+            mouseInput = {
+                moveTo(position2)
+                animateBy(distance, durationMillis = steps * T)
+            },
+            eventVerifiers =
+                arrayOf(
+                    { verifyMouseEvent(1 * T, Enter, false, position2) },
+                    { verifyMouseEvent(2 * T, Move, false, position2 + (distancePerStep * 1f)) },
+                    { verifyMouseEvent(3 * T, Move, false, position2 + (distancePerStep * 2f)) },
+                    { verifyMouseEvent(4 * T, Move, false, position2 + (distancePerStep * 3f)) },
+                    { verifyMouseEvent(5 * T, Move, false, position2 + (distancePerStep * 4f)) },
+                )
         )
-    )
 
     @Test
-    fun animateAlong_fromCurrentPosition() = runMouseInputInjectionTest(
-        mouseInput = {
-            animateAlong(curveFromHere, durationMillis = steps * T)
-        },
-        eventVerifiers = arrayOf(
-            // The curve starts at the current position (0, 0) so we expect no initial event.
-            { verifyMouseEvent(1 * T, Enter, false, curveFromHere(1 * T)) },
-            { verifyMouseEvent(2 * T, Move, false, curveFromHere(2 * T)) },
-            { verifyMouseEvent(3 * T, Move, false, curveFromHere(3 * T)) },
-            { verifyMouseEvent(4 * T, Move, false, curveFromHere(4 * T)) },
+    fun animateAlong_fromCurrentPosition() =
+        runMouseInputInjectionTest(
+            mouseInput = { animateAlong(curveFromHere, durationMillis = steps * T) },
+            eventVerifiers =
+                arrayOf(
+                    // The curve starts at the current position (0, 0) so we expect no initial
+                    // event.
+                    { verifyMouseEvent(1 * T, Enter, false, curveFromHere(1 * T)) },
+                    { verifyMouseEvent(2 * T, Move, false, curveFromHere(2 * T)) },
+                    { verifyMouseEvent(3 * T, Move, false, curveFromHere(3 * T)) },
+                    { verifyMouseEvent(4 * T, Move, false, curveFromHere(4 * T)) },
+                )
         )
-    )
 
     @Test
-    fun animateAlong_fromOtherPosition() = runMouseInputInjectionTest(
-        mouseInput = {
-            animateAlong(curveFromElsewhere, durationMillis = steps * T)
-        },
-        eventVerifiers = arrayOf(
-            // The curve doesn't start at the current position (0, 0) so we expect an initial event
-            { verifyMouseEvent(0 * T, Enter, false, curveFromElsewhere(0 * T)) },
-            { verifyMouseEvent(1 * T, Move, false, curveFromElsewhere(1 * T)) },
-            { verifyMouseEvent(2 * T, Move, false, curveFromElsewhere(2 * T)) },
-            { verifyMouseEvent(3 * T, Move, false, curveFromElsewhere(3 * T)) },
-            { verifyMouseEvent(4 * T, Move, false, curveFromElsewhere(4 * T)) },
+    fun animateAlong_fromOtherPosition() =
+        runMouseInputInjectionTest(
+            mouseInput = { animateAlong(curveFromElsewhere, durationMillis = steps * T) },
+            eventVerifiers =
+                arrayOf(
+                    // The curve doesn't start at the current position (0, 0) so we expect an
+                    // initial event
+                    { verifyMouseEvent(0 * T, Enter, false, curveFromElsewhere(0 * T)) },
+                    { verifyMouseEvent(1 * T, Move, false, curveFromElsewhere(1 * T)) },
+                    { verifyMouseEvent(2 * T, Move, false, curveFromElsewhere(2 * T)) },
+                    { verifyMouseEvent(3 * T, Move, false, curveFromElsewhere(3 * T)) },
+                    { verifyMouseEvent(4 * T, Move, false, curveFromElsewhere(4 * T)) },
+                )
         )
-    )
 
     private fun MouseInjectionScope.moveToAndCheck(
         position: Offset,
diff --git a/compose/ui/ui-test/src/androidInstrumentedTest/kotlin/androidx/compose/ui/test/injectionscope/mouse/ScrollTest.kt b/compose/ui/ui-test/src/androidInstrumentedTest/kotlin/androidx/compose/ui/test/injectionscope/mouse/ScrollTest.kt
index 3715468..feddd02 100644
--- a/compose/ui/ui-test/src/androidInstrumentedTest/kotlin/androidx/compose/ui/test/injectionscope/mouse/ScrollTest.kt
+++ b/compose/ui/ui-test/src/androidInstrumentedTest/kotlin/androidx/compose/ui/test/injectionscope/mouse/ScrollTest.kt
@@ -70,71 +70,86 @@
     }
 
     @Test
-    fun scrollVertically() = runMouseInputInjectionTest(
-        mouseInput = {
-            // scroll vertically
-            scroll(10f, ScrollWheel.Vertical)
-        },
-        eventVerifiers = arrayOf(
-            { this.verifyMouseEvent(0, Enter, false, Offset.Zero) },
-            { this.verifyMouseEvent(0, Scroll, false, Offset.Zero, Offset(0f, 10f)) },
+    fun scrollVertically() =
+        runMouseInputInjectionTest(
+            mouseInput = {
+                // scroll vertically
+                scroll(10f, ScrollWheel.Vertical)
+            },
+            eventVerifiers =
+                arrayOf(
+                    { this.verifyMouseEvent(0, Enter, false, Offset.Zero) },
+                    { this.verifyMouseEvent(0, Scroll, false, Offset.Zero, Offset(0f, 10f)) },
+                )
         )
-    )
 
     @Test
-    fun scrollHorizontally() = runMouseInputInjectionTest(
-        mouseInput = {
-            // scroll horizontally
-            scroll(10f, ScrollWheel.Horizontal)
-        },
-        eventVerifiers = arrayOf(
-            { this.verifyMouseEvent(0, Enter, false, Offset.Zero) },
-            { this.verifyMouseEvent(0, Scroll, false, Offset.Zero, Offset(10f, 0f)) },
+    fun scrollHorizontally() =
+        runMouseInputInjectionTest(
+            mouseInput = {
+                // scroll horizontally
+                scroll(10f, ScrollWheel.Horizontal)
+            },
+            eventVerifiers =
+                arrayOf(
+                    { this.verifyMouseEvent(0, Enter, false, Offset.Zero) },
+                    { this.verifyMouseEvent(0, Scroll, false, Offset.Zero, Offset(10f, 0f)) },
+                )
         )
-    )
 
     @Test
-    fun scrollWithPrimaryDown() = runMouseInputInjectionTest(
-        mouseInput = {
-            // press primary button
-            press(MouseButton.Primary)
-            // scroll
-            scroll(10f)
-        },
-        eventVerifiers = arrayOf(
-            { this.verifyMouseEvent(0, Enter, false, Offset.Zero) },
-            { this.verifyMouseEvent(0, Press, true, Offset.Zero, PrimaryButton) },
-            { this.verifyMouseEvent(0, Scroll, true, Offset.Zero, Offset(0f, 10f), PrimaryButton) },
+    fun scrollWithPrimaryDown() =
+        runMouseInputInjectionTest(
+            mouseInput = {
+                // press primary button
+                press(MouseButton.Primary)
+                // scroll
+                scroll(10f)
+            },
+            eventVerifiers =
+                arrayOf(
+                    { this.verifyMouseEvent(0, Enter, false, Offset.Zero) },
+                    { this.verifyMouseEvent(0, Press, true, Offset.Zero, PrimaryButton) },
+                    {
+                        this.verifyMouseEvent(
+                            0,
+                            Scroll,
+                            true,
+                            Offset.Zero,
+                            Offset(0f, 10f),
+                            PrimaryButton
+                        )
+                    },
+                )
         )
-    )
 
     @Test
-    fun smoothScrollVertically() = runMouseInputInjectionTest(
-        mouseInput = {
-            smoothScroll(distance, steps * T, ScrollWheel.Vertical)
-        },
-        eventVerifiers = arrayOf(
-            { this.verifyMouseEvent(1 * T, Enter, false, Offset.Zero) },
-            { this.verifyMouseEvent(1 * T, Scroll, false, Offset.Zero, Offset(0f, delta)) },
-            { this.verifyMouseEvent(2 * T, Scroll, false, Offset.Zero, Offset(0f, delta)) },
-            { this.verifyMouseEvent(3 * T, Scroll, false, Offset.Zero, Offset(0f, delta)) },
-            { this.verifyMouseEvent(4 * T, Scroll, false, Offset.Zero, Offset(0f, delta)) },
+    fun smoothScrollVertically() =
+        runMouseInputInjectionTest(
+            mouseInput = { smoothScroll(distance, steps * T, ScrollWheel.Vertical) },
+            eventVerifiers =
+                arrayOf(
+                    { this.verifyMouseEvent(1 * T, Enter, false, Offset.Zero) },
+                    { this.verifyMouseEvent(1 * T, Scroll, false, Offset.Zero, Offset(0f, delta)) },
+                    { this.verifyMouseEvent(2 * T, Scroll, false, Offset.Zero, Offset(0f, delta)) },
+                    { this.verifyMouseEvent(3 * T, Scroll, false, Offset.Zero, Offset(0f, delta)) },
+                    { this.verifyMouseEvent(4 * T, Scroll, false, Offset.Zero, Offset(0f, delta)) },
+                )
         )
-    )
 
     @Test
-    fun smoothScrollHorizontally() = runMouseInputInjectionTest(
-        mouseInput = {
-            smoothScroll(distance, steps * T, ScrollWheel.Horizontal)
-        },
-        eventVerifiers = arrayOf(
-            { this.verifyMouseEvent(1 * T, Enter, false, Offset.Zero) },
-            { this.verifyMouseEvent(1 * T, Scroll, false, Offset.Zero, Offset(delta, 0f)) },
-            { this.verifyMouseEvent(2 * T, Scroll, false, Offset.Zero, Offset(delta, 0f)) },
-            { this.verifyMouseEvent(3 * T, Scroll, false, Offset.Zero, Offset(delta, 0f)) },
-            { this.verifyMouseEvent(4 * T, Scroll, false, Offset.Zero, Offset(delta, 0f)) },
+    fun smoothScrollHorizontally() =
+        runMouseInputInjectionTest(
+            mouseInput = { smoothScroll(distance, steps * T, ScrollWheel.Horizontal) },
+            eventVerifiers =
+                arrayOf(
+                    { this.verifyMouseEvent(1 * T, Enter, false, Offset.Zero) },
+                    { this.verifyMouseEvent(1 * T, Scroll, false, Offset.Zero, Offset(delta, 0f)) },
+                    { this.verifyMouseEvent(2 * T, Scroll, false, Offset.Zero, Offset(delta, 0f)) },
+                    { this.verifyMouseEvent(3 * T, Scroll, false, Offset.Zero, Offset(delta, 0f)) },
+                    { this.verifyMouseEvent(4 * T, Scroll, false, Offset.Zero, Offset(delta, 0f)) },
+                )
         )
-    )
 
     /**
      * Integration test: checks if we are actually seeing lazy column respond to vertical scroll.
@@ -144,15 +159,11 @@
         val items = 200
         setContent {
             LazyColumn(listModifier.width(50.dp)) {
-                items(items) {
-                    TestItem(it, items, Modifier.fillParentMaxWidth())
-                }
+                items(items) { TestItem(it, items, Modifier.fillParentMaxWidth()) }
             }
         }
 
-        onNodeWithTag("list").performMouseInput {
-            smoothScroll(100f, 500L, ScrollWheel.Vertical)
-        }
+        onNodeWithTag("list").performMouseInput { smoothScroll(100f, 500L, ScrollWheel.Vertical) }
         onNodeWithTag("item-${items - 1}").assertIsDisplayed()
     }
 
@@ -165,35 +176,25 @@
         val items = 200
         setContent {
             Column(listModifier.width(50.dp).verticalScroll(rememberScrollState())) {
-                repeat(items) {
-                    TestItem(it, items, Modifier.fillMaxWidth())
-                }
+                repeat(items) { TestItem(it, items, Modifier.fillMaxWidth()) }
             }
         }
 
-        onNodeWithTag("list").performMouseInput {
-            smoothScroll(100f, 500L, ScrollWheel.Vertical)
-        }
+        onNodeWithTag("list").performMouseInput { smoothScroll(100f, 500L, ScrollWheel.Vertical) }
         onNodeWithTag("item-${items - 1}").assertIsDisplayed()
     }
 
-    /**
-     * Integration test: checks if we are actually seeing lazy row respond to horizontal scroll.
-     */
+    /** Integration test: checks if we are actually seeing lazy row respond to horizontal scroll. */
     @Test
     fun smoothScrollLazyRow() = runComposeUiTest {
         val items = 200
         setContent {
             LazyRow(listModifier.height(50.dp)) {
-                items(items) {
-                    TestItem(it, items, Modifier.fillParentMaxHeight())
-                }
+                items(items) { TestItem(it, items, Modifier.fillParentMaxHeight()) }
             }
         }
 
-        onNodeWithTag("list").performMouseInput {
-            smoothScroll(100f, 500L, ScrollWheel.Horizontal)
-        }
+        onNodeWithTag("list").performMouseInput { smoothScroll(100f, 500L, ScrollWheel.Horizontal) }
         onNodeWithTag("item-${items - 1}").assertIsDisplayed()
     }
 
@@ -206,15 +207,11 @@
         val items = 200
         setContent {
             Row(listModifier.height(50.dp).horizontalScroll(rememberScrollState())) {
-                repeat(items) {
-                    TestItem(it, items, Modifier.fillMaxHeight())
-                }
+                repeat(items) { TestItem(it, items, Modifier.fillMaxHeight()) }
             }
         }
 
-        onNodeWithTag("list").performMouseInput {
-            smoothScroll(100f, 500L, ScrollWheel.Horizontal)
-        }
+        onNodeWithTag("list").performMouseInput { smoothScroll(100f, 500L, ScrollWheel.Horizontal) }
         onNodeWithTag("item-${items - 1}").assertIsDisplayed()
     }
 
diff --git a/compose/ui/ui-test/src/androidInstrumentedTest/kotlin/androidx/compose/ui/test/injectionscope/touch/CancelTest.kt b/compose/ui/ui-test/src/androidInstrumentedTest/kotlin/androidx/compose/ui/test/injectionscope/touch/CancelTest.kt
index c9023dd..6eb7c81 100644
--- a/compose/ui/ui-test/src/androidInstrumentedTest/kotlin/androidx/compose/ui/test/injectionscope/touch/CancelTest.kt
+++ b/compose/ui/ui-test/src/androidInstrumentedTest/kotlin/androidx/compose/ui/test/injectionscope/touch/CancelTest.kt
@@ -32,9 +32,7 @@
 import org.junit.Rule
 import org.junit.Test
 
-/**
- * Tests if [TouchInjectionScope.cancel] works
- */
+/** Tests if [TouchInjectionScope.cancel] works */
 @MediumTest
 class CancelTest {
     companion object {
@@ -42,17 +40,14 @@
         private val downPosition2 = Offset(20f, 20f)
     }
 
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
     private val recorder = MultiPointerInputRecorder()
 
     @Before
     fun setUp() {
         // Given some content
-        rule.setContent {
-            ClickableTestBox(recorder)
-        }
+        rule.setContent { ClickableTestBox(recorder) }
     }
 
     @Test
@@ -94,26 +89,20 @@
 
     @Test
     fun cancel_withoutDown() {
-        expectError<IllegalStateException> {
-            rule.performTouchInput { cancel() }
-        }
+        expectError<IllegalStateException> { rule.performTouchInput { cancel() } }
     }
 
     @Test
     fun cancel_afterUp() {
         rule.performTouchInput { down(downPosition1) }
         rule.performTouchInput { up() }
-        expectError<IllegalStateException> {
-            rule.performTouchInput { cancel() }
-        }
+        expectError<IllegalStateException> { rule.performTouchInput { cancel() } }
     }
 
     @Test
     fun cancel_afterCancel() {
         rule.performTouchInput { down(downPosition1) }
         rule.performTouchInput { cancel() }
-        expectError<IllegalStateException> {
-            rule.performTouchInput { cancel() }
-        }
+        expectError<IllegalStateException> { rule.performTouchInput { cancel() } }
     }
 }
diff --git a/compose/ui/ui-test/src/androidInstrumentedTest/kotlin/androidx/compose/ui/test/injectionscope/touch/ClickTest.kt b/compose/ui/ui-test/src/androidInstrumentedTest/kotlin/androidx/compose/ui/test/injectionscope/touch/ClickTest.kt
index 0bf88db..2581204 100644
--- a/compose/ui/ui-test/src/androidInstrumentedTest/kotlin/androidx/compose/ui/test/injectionscope/touch/ClickTest.kt
+++ b/compose/ui/ui-test/src/androidInstrumentedTest/kotlin/androidx/compose/ui/test/injectionscope/touch/ClickTest.kt
@@ -40,9 +40,7 @@
 import org.junit.runner.RunWith
 import org.junit.runners.Parameterized
 
-/**
- * Test for [TouchInjectionScope.click]
- */
+/** Test for [TouchInjectionScope.click] */
 @MediumTest
 @RunWith(Parameterized::class)
 class ClickTest(private val config: TestConfig) {
@@ -66,11 +64,9 @@
         }
     }
 
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
-    private val expectedClickPosition =
-        config.position ?: Offset(squareSize / 2, squareSize / 2)
+    private val expectedClickPosition = config.position ?: Offset(squareSize / 2, squareSize / 2)
 
     @Test
     fun click() {
diff --git a/compose/ui/ui-test/src/androidInstrumentedTest/kotlin/androidx/compose/ui/test/injectionscope/touch/CurrentPositionTest.kt b/compose/ui/ui-test/src/androidInstrumentedTest/kotlin/androidx/compose/ui/test/injectionscope/touch/CurrentPositionTest.kt
index f61c71d..3f2f683 100644
--- a/compose/ui/ui-test/src/androidInstrumentedTest/kotlin/androidx/compose/ui/test/injectionscope/touch/CurrentPositionTest.kt
+++ b/compose/ui/ui-test/src/androidInstrumentedTest/kotlin/androidx/compose/ui/test/injectionscope/touch/CurrentPositionTest.kt
@@ -32,17 +32,14 @@
 @RunWith(AndroidJUnit4::class)
 class CurrentPositionTest {
 
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
     private val recorder = MultiPointerInputRecorder()
 
     @Before
     fun setUp() {
         // Given some content
-        rule.setContent {
-            ClickableTestBox(recorder)
-        }
+        rule.setContent { ClickableTestBox(recorder) }
     }
 
     @Test
@@ -116,9 +113,7 @@
             assertThat(currentPosition(2)).isEqualTo(center)
         }
         // And this remains the same in the next invocation
-        rule.performTouchInput {
-            assertThat(currentPosition(2)).isEqualTo(center)
-        }
+        rule.performTouchInput { assertThat(currentPosition(2)).isEqualTo(center) }
     }
 
     @Test
@@ -132,9 +127,7 @@
             assertThat(currentPosition(3)).isNull()
         }
         // And this remains the same in the next invocation
-        rule.performTouchInput {
-            assertThat(currentPosition(3)).isNull()
-        }
+        rule.performTouchInput { assertThat(currentPosition(3)).isNull() }
     }
 
     @Test
@@ -148,8 +141,6 @@
             assertThat(currentPosition(4)).isNull()
         }
         // And this remains the same in the next invocation
-        rule.performTouchInput {
-            assertThat(currentPosition(4)).isNull()
-        }
+        rule.performTouchInput { assertThat(currentPosition(4)).isNull() }
     }
 }
diff --git a/compose/ui/ui-test/src/androidInstrumentedTest/kotlin/androidx/compose/ui/test/injectionscope/touch/DoubleClickTest.kt b/compose/ui/ui-test/src/androidInstrumentedTest/kotlin/androidx/compose/ui/test/injectionscope/touch/DoubleClickTest.kt
index 9aca1e3..62e98bf 100644
--- a/compose/ui/ui-test/src/androidInstrumentedTest/kotlin/androidx/compose/ui/test/injectionscope/touch/DoubleClickTest.kt
+++ b/compose/ui/ui-test/src/androidInstrumentedTest/kotlin/androidx/compose/ui/test/injectionscope/touch/DoubleClickTest.kt
@@ -43,9 +43,7 @@
 import org.junit.runner.RunWith
 import org.junit.runners.Parameterized
 
-/**
- * Test for [TouchInjectionScope.doubleClick]
- */
+/** Test for [TouchInjectionScope.doubleClick] */
 @MediumTest
 @RunWith(Parameterized::class)
 class DoubleClickTest(private val config: TestConfig) {
@@ -55,10 +53,11 @@
         private const val DoubleTapMin = 40L
         private const val DoubleTapMax = 200L
         private const val DefaultDoubleTapTimeMillis = (DoubleTapMin + DoubleTapMax) / 2
-        private val testViewConfiguration = TestViewConfiguration(
-            doubleTapMinTimeMillis = DoubleTapMin,
-            doubleTapTimeoutMillis = DoubleTapMax
-        )
+        private val testViewConfiguration =
+            TestViewConfiguration(
+                doubleTapMinTimeMillis = DoubleTapMin,
+                doubleTapTimeoutMillis = DoubleTapMax
+            )
 
         @JvmStatic
         @Parameterized.Parameters(name = "{0}")
@@ -72,13 +71,11 @@
         }
     }
 
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
     private val recordedDoubleClicks = mutableListOf<Offset>()
 
-    private val expectedClickPosition =
-        config.position ?: Offset(defaultSize / 2, defaultSize / 2)
+    private val expectedClickPosition = config.position ?: Offset(defaultSize / 2, defaultSize / 2)
     private val expectedDelay = config.delayMillis ?: DefaultDoubleTapTimeMillis
 
     private fun recordDoubleClick(position: Offset) {
@@ -92,8 +89,9 @@
         rule.setContent {
             WithViewConfiguration(testViewConfiguration) {
                 ClickableTestBox(
-                    Modifier
-                        .pointerInput(Unit) { detectTapGestures(onDoubleTap = ::recordDoubleClick) }
+                    Modifier.pointerInput(Unit) {
+                            detectTapGestures(onDoubleTap = ::recordDoubleClick)
+                        }
                         .then(recorder)
                 )
             }
diff --git a/compose/ui/ui-test/src/androidInstrumentedTest/kotlin/androidx/compose/ui/test/injectionscope/touch/DownTest.kt b/compose/ui/ui-test/src/androidInstrumentedTest/kotlin/androidx/compose/ui/test/injectionscope/touch/DownTest.kt
index 51dbaad..777335c 100644
--- a/compose/ui/ui-test/src/androidInstrumentedTest/kotlin/androidx/compose/ui/test/injectionscope/touch/DownTest.kt
+++ b/compose/ui/ui-test/src/androidInstrumentedTest/kotlin/androidx/compose/ui/test/injectionscope/touch/DownTest.kt
@@ -34,9 +34,7 @@
 import org.junit.Rule
 import org.junit.Test
 
-/**
- * Tests if [TouchInjectionScope.down] works
- */
+/** Tests if [TouchInjectionScope.down] works */
 @MediumTest
 class DownTest {
     companion object {
@@ -44,17 +42,14 @@
         private val position2 = Offset(7f, 7f)
     }
 
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
     private val recorder = MultiPointerInputRecorder()
 
     @Before
     fun setUp() {
         // Given some content
-        rule.setContent {
-            ClickableTestBox(recorder)
-        }
+        rule.setContent { ClickableTestBox(recorder) }
     }
 
     @Test
@@ -107,8 +102,6 @@
         // When we inject two down events with the same pointer id
         rule.performTouchInput { down(1, position1) }
         // Then the second throws an exception
-        expectError<IllegalArgumentException> {
-            rule.performTouchInput { down(1, position1) }
-        }
+        expectError<IllegalArgumentException> { rule.performTouchInput { down(1, position1) } }
     }
 }
diff --git a/compose/ui/ui-test/src/androidInstrumentedTest/kotlin/androidx/compose/ui/test/injectionscope/touch/LongClickTest.kt b/compose/ui/ui-test/src/androidInstrumentedTest/kotlin/androidx/compose/ui/test/injectionscope/touch/LongClickTest.kt
index 9a3f36c..ddf2ae9 100644
--- a/compose/ui/ui-test/src/androidInstrumentedTest/kotlin/androidx/compose/ui/test/injectionscope/touch/LongClickTest.kt
+++ b/compose/ui/ui-test/src/androidInstrumentedTest/kotlin/androidx/compose/ui/test/injectionscope/touch/LongClickTest.kt
@@ -53,9 +53,9 @@
 import org.junit.runners.Parameterized
 
 /**
- * Tests [TouchInjectionScope.longClick] with arguments. Verifies that the click is in the middle
- * of the component, that the gesture has a duration of 600 milliseconds and that all input
- * events were on the same location.
+ * Tests [TouchInjectionScope.longClick] with arguments. Verifies that the click is in the middle of
+ * the component, that the gesture has a duration of 600 milliseconds and that all input events were
+ * on the same location.
  */
 @MediumTest
 @RunWith(Parameterized::class)
@@ -64,9 +64,8 @@
 
     companion object {
         private const val LongPressTimeoutMillis = 300L
-        private val testViewConfiguration = TestViewConfiguration(
-            longPressTimeoutMillis = LongPressTimeoutMillis
-        )
+        private val testViewConfiguration =
+            TestViewConfiguration(longPressTimeoutMillis = LongPressTimeoutMillis)
 
         @JvmStatic
         @Parameterized.Parameters(name = "{0}")
@@ -80,12 +79,10 @@
         }
     }
 
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
     private val recordedLongClicks = mutableListOf<Offset>()
-    private val expectedClickPosition =
-        config.position ?: Offset(defaultSize / 2, defaultSize / 2)
+    private val expectedClickPosition = config.position ?: Offset(defaultSize / 2, defaultSize / 2)
     private val expectedDuration = config.durationMillis ?: LongPressTimeoutMillis + 100L
 
     private fun recordLongPress(position: Offset) {
@@ -100,8 +97,7 @@
             WithViewConfiguration(testViewConfiguration) {
                 Box(Modifier.fillMaxSize().wrapContentSize(Alignment.BottomEnd)) {
                     ClickableTestBox(
-                        Modifier
-                            .pointerInput(Unit) {
+                        Modifier.pointerInput(Unit) {
                                 detectTapGestures(onLongPress = ::recordLongPress)
                             }
                             .then(recorder)
diff --git a/compose/ui/ui-test/src/androidInstrumentedTest/kotlin/androidx/compose/ui/test/injectionscope/touch/MoveByTest.kt b/compose/ui/ui-test/src/androidInstrumentedTest/kotlin/androidx/compose/ui/test/injectionscope/touch/MoveByTest.kt
index c930148..65d4098 100644
--- a/compose/ui/ui-test/src/androidInstrumentedTest/kotlin/androidx/compose/ui/test/injectionscope/touch/MoveByTest.kt
+++ b/compose/ui/ui-test/src/androidInstrumentedTest/kotlin/androidx/compose/ui/test/injectionscope/touch/MoveByTest.kt
@@ -35,9 +35,7 @@
 import org.junit.Rule
 import org.junit.Test
 
-/**
- * Tests if [TouchInjectionScope.moveBy] and [TouchInjectionScope.updatePointerBy] work
- */
+/** Tests if [TouchInjectionScope.moveBy] and [TouchInjectionScope.updatePointerBy] work */
 @MediumTest
 class MoveByTest {
     companion object {
@@ -47,17 +45,14 @@
         private val delta2 = Offset(21f, 21f)
     }
 
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
     private val recorder = MultiPointerInputRecorder()
 
     @Before
     fun setUp() {
         // Given some content
-        rule.setContent {
-            ClickableTestBox(recorder)
-        }
+        rule.setContent { ClickableTestBox(recorder) }
     }
 
     @Test
@@ -78,7 +73,8 @@
 
                 t += eventPeriodMillis
                 assertThat(events[1].pointerCount).isEqualTo(1)
-                events[1].getPointer(0)
+                events[1]
+                    .getPointer(0)
                     .verify(t, pointerId, true, downPosition1 + delta1, Touch, Move)
             }
         }
@@ -104,16 +100,18 @@
 
                 t += eventPeriodMillis
                 assertThat(events[2].pointerCount).isEqualTo(2)
-                events[2].getPointer(0)
+                events[2]
+                    .getPointer(0)
                     .verify(t, pointerId1, true, downPosition1 + delta1, Touch, Move)
-                events[2].getPointer(1)
-                    .verify(t, pointerId2, true, downPosition2, Touch, Move)
+                events[2].getPointer(1).verify(t, pointerId2, true, downPosition2, Touch, Move)
 
                 t += eventPeriodMillis
                 assertThat(events[3].pointerCount).isEqualTo(2)
-                events[3].getPointer(0)
+                events[3]
+                    .getPointer(0)
                     .verify(t, pointerId1, true, downPosition1 + delta1, Touch, Move)
-                events[3].getPointer(1)
+                events[3]
+                    .getPointer(1)
                     .verify(t, pointerId2, true, downPosition2 + delta2, Touch, Move)
             }
         }
@@ -141,9 +139,11 @@
 
                 t += eventPeriodMillis
                 assertThat(events[2].pointerCount).isEqualTo(2)
-                events[2].getPointer(0)
+                events[2]
+                    .getPointer(0)
                     .verify(t, pointerId1, true, downPosition1 + delta1, Touch, Move)
-                events[2].getPointer(1)
+                events[2]
+                    .getPointer(1)
                     .verify(t, pointerId2, true, downPosition2 + delta2, Touch, Move)
             }
         }
@@ -151,42 +151,32 @@
 
     @Test
     fun moveBy_withoutDown() {
-        expectError<IllegalStateException> {
-            rule.performTouchInput { moveBy(delta1) }
-        }
+        expectError<IllegalStateException> { rule.performTouchInput { moveBy(delta1) } }
     }
 
     @Test
     fun moveBy_wrongPointerId() {
         rule.performTouchInput { down(1, downPosition1) }
-        expectError<IllegalArgumentException> {
-            rule.performTouchInput { moveBy(2, delta1) }
-        }
+        expectError<IllegalArgumentException> { rule.performTouchInput { moveBy(2, delta1) } }
     }
 
     @Test
     fun moveBy_afterUp() {
         rule.performTouchInput { down(downPosition1) }
         rule.performTouchInput { up() }
-        expectError<IllegalStateException> {
-            rule.performTouchInput { moveBy(delta1) }
-        }
+        expectError<IllegalStateException> { rule.performTouchInput { moveBy(delta1) } }
     }
 
     @Test
     fun moveBy_afterCancel() {
         rule.performTouchInput { down(downPosition1) }
         rule.performTouchInput { cancel() }
-        expectError<IllegalStateException> {
-            rule.performTouchInput { moveBy(delta1) }
-        }
+        expectError<IllegalStateException> { rule.performTouchInput { moveBy(delta1) } }
     }
 
     @Test
     fun updatePointerBy_withoutDown() {
-        expectError<IllegalStateException> {
-            rule.performTouchInput { updatePointerBy(1, delta1) }
-        }
+        expectError<IllegalStateException> { rule.performTouchInput { updatePointerBy(1, delta1) } }
     }
 
     @Test
@@ -201,17 +191,13 @@
     fun updatePointerBy_afterUp() {
         rule.performTouchInput { down(1, downPosition1) }
         rule.performTouchInput { up(1) }
-        expectError<IllegalStateException> {
-            rule.performTouchInput { updatePointerBy(1, delta1) }
-        }
+        expectError<IllegalStateException> { rule.performTouchInput { updatePointerBy(1, delta1) } }
     }
 
     @Test
     fun updatePointerBy_afterCancel() {
         rule.performTouchInput { down(1, downPosition1) }
         rule.performTouchInput { cancel() }
-        expectError<IllegalStateException> {
-            rule.performTouchInput { updatePointerBy(1, delta1) }
-        }
+        expectError<IllegalStateException> { rule.performTouchInput { updatePointerBy(1, delta1) } }
     }
 }
diff --git a/compose/ui/ui-test/src/androidInstrumentedTest/kotlin/androidx/compose/ui/test/injectionscope/touch/MoveTest.kt b/compose/ui/ui-test/src/androidInstrumentedTest/kotlin/androidx/compose/ui/test/injectionscope/touch/MoveTest.kt
index ed8b951..b6b521e 100644
--- a/compose/ui/ui-test/src/androidInstrumentedTest/kotlin/androidx/compose/ui/test/injectionscope/touch/MoveTest.kt
+++ b/compose/ui/ui-test/src/androidInstrumentedTest/kotlin/androidx/compose/ui/test/injectionscope/touch/MoveTest.kt
@@ -37,39 +37,30 @@
         private val downPosition1 = Offset(10f, 10f)
     }
 
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
     @Before
     fun setUp() {
         // Given some content
-        rule.setContent {
-            ClickableTestBox()
-        }
+        rule.setContent { ClickableTestBox() }
     }
 
     @Test
     fun move_withoutDown() {
-        expectError<IllegalStateException> {
-            rule.performTouchInput { move() }
-        }
+        expectError<IllegalStateException> { rule.performTouchInput { move() } }
     }
 
     @Test
     fun move_afterUp() {
         rule.performTouchInput { down(downPosition1) }
         rule.performTouchInput { up() }
-        expectError<IllegalStateException> {
-            rule.performTouchInput { move() }
-        }
+        expectError<IllegalStateException> { rule.performTouchInput { move() } }
     }
 
     @Test
     fun move_afterCancel() {
         rule.performTouchInput { down(downPosition1) }
         rule.performTouchInput { cancel() }
-        expectError<IllegalStateException> {
-            rule.performTouchInput { move() }
-        }
+        expectError<IllegalStateException> { rule.performTouchInput { move() } }
     }
 }
diff --git a/compose/ui/ui-test/src/androidInstrumentedTest/kotlin/androidx/compose/ui/test/injectionscope/touch/MoveToTest.kt b/compose/ui/ui-test/src/androidInstrumentedTest/kotlin/androidx/compose/ui/test/injectionscope/touch/MoveToTest.kt
index 442c435..20a7308 100644
--- a/compose/ui/ui-test/src/androidInstrumentedTest/kotlin/androidx/compose/ui/test/injectionscope/touch/MoveToTest.kt
+++ b/compose/ui/ui-test/src/androidInstrumentedTest/kotlin/androidx/compose/ui/test/injectionscope/touch/MoveToTest.kt
@@ -35,9 +35,7 @@
 import org.junit.Rule
 import org.junit.Test
 
-/**
- * Tests if [TouchInjectionScope.moveTo] and [TouchInjectionScope.updatePointerTo] work
- */
+/** Tests if [TouchInjectionScope.moveTo] and [TouchInjectionScope.updatePointerTo] work */
 @MediumTest
 class MoveToTest() {
     companion object {
@@ -47,17 +45,14 @@
         private val moveToPosition2 = Offset(21f, 21f)
     }
 
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
     private val recorder = MultiPointerInputRecorder()
 
     @Before
     fun setUp() {
         // Given some content
-        rule.setContent {
-            ClickableTestBox(recorder)
-        }
+        rule.setContent { ClickableTestBox(recorder) }
     }
 
     @Test
@@ -144,9 +139,7 @@
 
     @Test
     fun moveTo_withoutDown() {
-        expectError<IllegalStateException> {
-            rule.performTouchInput { moveTo(moveToPosition1) }
-        }
+        expectError<IllegalStateException> { rule.performTouchInput { moveTo(moveToPosition1) } }
     }
 
     @Test
@@ -161,18 +154,14 @@
     fun moveTo_afterUp() {
         rule.performTouchInput { down(downPosition1) }
         rule.performTouchInput { up() }
-        expectError<IllegalStateException> {
-            rule.performTouchInput { moveTo(moveToPosition1) }
-        }
+        expectError<IllegalStateException> { rule.performTouchInput { moveTo(moveToPosition1) } }
     }
 
     @Test
     fun moveTo_afterCancel() {
         rule.performTouchInput { down(downPosition1) }
         rule.performTouchInput { cancel() }
-        expectError<IllegalStateException> {
-            rule.performTouchInput { moveTo(moveToPosition1) }
-        }
+        expectError<IllegalStateException> { rule.performTouchInput { moveTo(moveToPosition1) } }
     }
 
     @Test
diff --git a/compose/ui/ui-test/src/androidInstrumentedTest/kotlin/androidx/compose/ui/test/injectionscope/touch/MoveWithHistoryTest.kt b/compose/ui/ui-test/src/androidInstrumentedTest/kotlin/androidx/compose/ui/test/injectionscope/touch/MoveWithHistoryTest.kt
index d6e45fb..19cd527 100644
--- a/compose/ui/ui-test/src/androidInstrumentedTest/kotlin/androidx/compose/ui/test/injectionscope/touch/MoveWithHistoryTest.kt
+++ b/compose/ui/ui-test/src/androidInstrumentedTest/kotlin/androidx/compose/ui/test/injectionscope/touch/MoveWithHistoryTest.kt
@@ -52,18 +52,13 @@
         private const val tag = "widget"
     }
 
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
     private val recorder = SinglePointerInputRecorder()
 
     @Composable
     fun Ui(alignment: Alignment) {
-        Box(
-            Modifier
-                .fillMaxSize()
-                .wrapContentSize(alignment)
-        ) {
+        Box(Modifier.fillMaxSize().wrapContentSize(alignment)) {
             ClickableTestBox(modifier = recorder, tag = tag)
         }
     }
@@ -99,14 +94,11 @@
                 with(LocalDensity.current) {
                     // Scrollable with a viewport the size of 10 boxes
                     Column(
-                        Modifier
-                            .testTag("scrollable")
+                        Modifier.testTag("scrollable")
                             .requiredSize(100.toDp(), 1000.toDp())
                             .verticalScroll(scrollState)
                     ) {
-                        repeat(100) {
-                            ClickableTestBox()
-                        }
+                        repeat(100) { ClickableTestBox() }
                     }
                 }
             }
diff --git a/compose/ui/ui-test/src/androidInstrumentedTest/kotlin/androidx/compose/ui/test/injectionscope/touch/PinchTest.kt b/compose/ui/ui-test/src/androidInstrumentedTest/kotlin/androidx/compose/ui/test/injectionscope/touch/PinchTest.kt
index cbdc699..aa0635b 100644
--- a/compose/ui/ui-test/src/androidInstrumentedTest/kotlin/androidx/compose/ui/test/injectionscope/touch/PinchTest.kt
+++ b/compose/ui/ui-test/src/androidInstrumentedTest/kotlin/androidx/compose/ui/test/injectionscope/touch/PinchTest.kt
@@ -37,9 +37,7 @@
 import org.junit.Test
 import org.junit.runner.RunWith
 
-/**
- * Test for [TouchInjectionScope.pinch]
- */
+/** Test for [TouchInjectionScope.pinch] */
 @MediumTest
 @RunWith(AndroidJUnit4::class)
 class PinchTest {
@@ -47,17 +45,14 @@
         private const val TAG = "PINCH"
     }
 
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
     private val recorder = MultiPointerInputRecorder()
 
     @Test
     fun pinch() {
         rule.setContent {
-            Box(Modifier.fillMaxSize()) {
-                ClickableTestBox(modifier = recorder, tag = TAG)
-            }
+            Box(Modifier.fillMaxSize()) { ClickableTestBox(modifier = recorder, tag = TAG) }
         }
 
         val start0 = Offset(40f, 50f)
@@ -66,9 +61,7 @@
         val end1 = Offset(92f, 50f)
         val duration = 400L
 
-        rule.onNodeWithTag(TAG).performTouchInput {
-            pinch(start0, end0, start1, end1, duration)
-        }
+        rule.onNodeWithTag(TAG).performTouchInput { pinch(start0, end0, start1, end1, duration) }
 
         rule.runOnIdle {
             recorder.run {
diff --git a/compose/ui/ui-test/src/androidInstrumentedTest/kotlin/androidx/compose/ui/test/injectionscope/touch/SwipeCurveTest.kt b/compose/ui/ui-test/src/androidInstrumentedTest/kotlin/androidx/compose/ui/test/injectionscope/touch/SwipeCurveTest.kt
index 4ac30ac..8b2f010 100644
--- a/compose/ui/ui-test/src/androidInstrumentedTest/kotlin/androidx/compose/ui/test/injectionscope/touch/SwipeCurveTest.kt
+++ b/compose/ui/ui-test/src/androidInstrumentedTest/kotlin/androidx/compose/ui/test/injectionscope/touch/SwipeCurveTest.kt
@@ -42,9 +42,7 @@
 import org.junit.runner.RunWith
 import org.junit.runners.Parameterized
 
-/**
- * Test for [TouchInjectionScope.swipe] along a curve without key times
- */
+/** Test for [TouchInjectionScope.swipe] along a curve without key times */
 @MediumTest
 @RunWith(Parameterized::class)
 class SwipeCurveTest(private val config: TestConfig) {
@@ -60,26 +58,22 @@
         }
     }
 
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
     private val recorder = SinglePointerInputRecorder()
+
     private fun curve(t: Long) = Offset(t + 10f, t + 10f)
 
     @Before
     fun setContent() {
         rule.setContent {
-            Box(Modifier.fillMaxSize()) {
-                ClickableTestBox(modifier = recorder, tag = tag)
-            }
+            Box(Modifier.fillMaxSize()) { ClickableTestBox(modifier = recorder, tag = tag) }
         }
     }
 
     @Test
     fun swipe() {
-        rule.onNodeWithTag(tag).performTouchInput {
-            swipe(curve = ::curve, config.duration)
-        }
+        rule.onNodeWithTag(tag).performTouchInput { swipe(curve = ::curve, config.duration) }
 
         rule.runOnIdle {
             recorder.apply {
diff --git a/compose/ui/ui-test/src/androidInstrumentedTest/kotlin/androidx/compose/ui/test/injectionscope/touch/SwipeCurveWithKeyTimesTest.kt b/compose/ui/ui-test/src/androidInstrumentedTest/kotlin/androidx/compose/ui/test/injectionscope/touch/SwipeCurveWithKeyTimesTest.kt
index 6c5334a..9dd94e1 100644
--- a/compose/ui/ui-test/src/androidInstrumentedTest/kotlin/androidx/compose/ui/test/injectionscope/touch/SwipeCurveWithKeyTimesTest.kt
+++ b/compose/ui/ui-test/src/androidInstrumentedTest/kotlin/androidx/compose/ui/test/injectionscope/touch/SwipeCurveWithKeyTimesTest.kt
@@ -42,9 +42,7 @@
 import org.junit.runner.RunWith
 import org.junit.runners.Parameterized
 
-/**
- * Test for [TouchInjectionScope.swipe] along a curve with key times
- */
+/** Test for [TouchInjectionScope.swipe] along a curve with key times */
 @MediumTest
 @RunWith(Parameterized::class)
 class SwipeCurveWithKeyTimesTest(private val config: TestConfig) {
@@ -56,32 +54,31 @@
 
         @JvmStatic
         @Parameterized.Parameters(name = "{0}")
-        fun createTestSet(): List<TestConfig> = listOf(
-            TestConfig(emptyList()),
-            TestConfig(listOf(0)),
-            TestConfig(listOf(1)),
-            TestConfig(listOf(50)),
-            TestConfig(listOf(51)),
-            TestConfig(listOf(duration - 1)),
-            TestConfig(listOf(duration)),
-            TestConfig(listOf(33, 66)),
-            TestConfig(listOf(45, 46, 47)),
-            TestConfig(listOf(45, 55, 65)),
-        )
+        fun createTestSet(): List<TestConfig> =
+            listOf(
+                TestConfig(emptyList()),
+                TestConfig(listOf(0)),
+                TestConfig(listOf(1)),
+                TestConfig(listOf(50)),
+                TestConfig(listOf(51)),
+                TestConfig(listOf(duration - 1)),
+                TestConfig(listOf(duration)),
+                TestConfig(listOf(33, 66)),
+                TestConfig(listOf(45, 46, 47)),
+                TestConfig(listOf(45, 55, 65)),
+            )
     }
 
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
     private val recorder = SinglePointerInputRecorder()
+
     private fun curve(t: Long) = Offset(t + 10f, t + 10f)
 
     @Before
     fun setContent() {
         rule.setContent {
-            Box(Modifier.fillMaxSize()) {
-                ClickableTestBox(modifier = recorder, tag = tag)
-            }
+            Box(Modifier.fillMaxSize()) { ClickableTestBox(modifier = recorder, tag = tag) }
         }
     }
 
@@ -110,12 +107,10 @@
                 downEvents.areSampledFromCurve(::curve)
 
                 // All events between two key times are evenly spaced in time
-                (listOf(0L) + config.keyTimes + listOf(duration)).distinct()
-                    .zipWithNext { a, b ->
-                        downEvents.filter { (it.timestamp - t0) in a..b }
-                    }.forEach {
-                        it.hasSameTimeBetweenEvents()
-                    }
+                (listOf(0L) + config.keyTimes + listOf(duration))
+                    .distinct()
+                    .zipWithNext { a, b -> downEvents.filter { (it.timestamp - t0) in a..b } }
+                    .forEach { it.hasSameTimeBetweenEvents() }
             }
         }
     }
diff --git a/compose/ui/ui-test/src/androidInstrumentedTest/kotlin/androidx/compose/ui/test/injectionscope/touch/SwipeDirectionTest.kt b/compose/ui/ui-test/src/androidInstrumentedTest/kotlin/androidx/compose/ui/test/injectionscope/touch/SwipeDirectionTest.kt
index 509b72f..3bdc97a 100644
--- a/compose/ui/ui-test/src/androidInstrumentedTest/kotlin/androidx/compose/ui/test/injectionscope/touch/SwipeDirectionTest.kt
+++ b/compose/ui/ui-test/src/androidInstrumentedTest/kotlin/androidx/compose/ui/test/injectionscope/touch/SwipeDirectionTest.kt
@@ -58,8 +58,7 @@
         private const val tag = "widget"
     }
 
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
     private val recorder = SinglePointerInputRecorder()
 
diff --git a/compose/ui/ui-test/src/androidInstrumentedTest/kotlin/androidx/compose/ui/test/injectionscope/touch/SwipeMultiTouchTest.kt b/compose/ui/ui-test/src/androidInstrumentedTest/kotlin/androidx/compose/ui/test/injectionscope/touch/SwipeMultiTouchTest.kt
index 3b0a4b8..83d217f 100644
--- a/compose/ui/ui-test/src/androidInstrumentedTest/kotlin/androidx/compose/ui/test/injectionscope/touch/SwipeMultiTouchTest.kt
+++ b/compose/ui/ui-test/src/androidInstrumentedTest/kotlin/androidx/compose/ui/test/injectionscope/touch/SwipeMultiTouchTest.kt
@@ -51,9 +51,7 @@
     @Test
     fun test() = runComposeUiTest {
         setContent {
-            Box(Modifier.fillMaxSize()) {
-                ClickableTestBox(modifier = recorder, tag = TAG)
-            }
+            Box(Modifier.fillMaxSize()) { ClickableTestBox(modifier = recorder, tag = TAG) }
         }
 
         // Move three fingers over the box from left to right simultaneously
@@ -65,10 +63,7 @@
         val curve3 = line(fromX = 10f, toX = 90f, y = 80f, DURATION)
 
         onNodeWithTag(TAG).performTouchInput {
-            multiTouchSwipe(
-                curves = listOf(curve1, curve2, curve3),
-                durationMillis = DURATION
-            )
+            multiTouchSwipe(curves = listOf(curve1, curve2, curve3), durationMillis = DURATION)
         }
 
         val pointer1 = PointerId(0)
diff --git a/compose/ui/ui-test/src/androidInstrumentedTest/kotlin/androidx/compose/ui/test/injectionscope/touch/SwipeStartEndTest.kt b/compose/ui/ui-test/src/androidInstrumentedTest/kotlin/androidx/compose/ui/test/injectionscope/touch/SwipeStartEndTest.kt
index 0f8f0b6..19faaaf 100644
--- a/compose/ui/ui-test/src/androidInstrumentedTest/kotlin/androidx/compose/ui/test/injectionscope/touch/SwipeStartEndTest.kt
+++ b/compose/ui/ui-test/src/androidInstrumentedTest/kotlin/androidx/compose/ui/test/injectionscope/touch/SwipeStartEndTest.kt
@@ -44,9 +44,7 @@
 import org.junit.runner.RunWith
 import org.junit.runners.Parameterized
 
-/**
- * Test for [TouchInjectionScope.swipe] between two [positions][Offset]
- */
+/** Test for [TouchInjectionScope.swipe] between two [positions][Offset] */
 @MediumTest
 @RunWith(Parameterized::class)
 class SwipeStartEndTest(private val config: TestConfig) {
@@ -64,25 +62,20 @@
         }
     }
 
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
     private val recorder = SinglePointerInputRecorder()
 
     @Before
     fun setContent() {
         rule.setContent {
-            Box(Modifier.fillMaxSize()) {
-                ClickableTestBox(modifier = recorder, tag = tag)
-            }
+            Box(Modifier.fillMaxSize()) { ClickableTestBox(modifier = recorder, tag = tag) }
         }
     }
 
     @Test
     fun swipe() {
-        rule.onNodeWithTag(tag).performTouchInput {
-            swipe(start, end, config.duration)
-        }
+        rule.onNodeWithTag(tag).performTouchInput { swipe(start, end, config.duration) }
         rule.runOnIdle {
             recorder.apply {
                 assertThat(events.size).isAtLeast(3)
@@ -100,11 +93,12 @@
                 // All events are evenly spaced in time
                 downEvents.hasSameTimeBetweenEvents()
                 // And the distance between each event is the same
-                downEvents.zipWithNext { a, b ->
-                    (b.position - a.position).getDistance() / (b.timestamp - a.timestamp)
-                }.sorted().apply {
-                    assertThat(last() - first()).isAtMost(1e-3f)
-                }
+                downEvents
+                    .zipWithNext { a, b ->
+                        (b.position - a.position).getDistance() / (b.timestamp - a.timestamp)
+                    }
+                    .sorted()
+                    .apply { assertThat(last() - first()).isAtMost(1e-3f) }
             }
         }
     }
diff --git a/compose/ui/ui-test/src/androidInstrumentedTest/kotlin/androidx/compose/ui/test/injectionscope/touch/SwipeWithTouchSlopTest.kt b/compose/ui/ui-test/src/androidInstrumentedTest/kotlin/androidx/compose/ui/test/injectionscope/touch/SwipeWithTouchSlopTest.kt
index c1cdadc..75eaca2 100644
--- a/compose/ui/ui-test/src/androidInstrumentedTest/kotlin/androidx/compose/ui/test/injectionscope/touch/SwipeWithTouchSlopTest.kt
+++ b/compose/ui/ui-test/src/androidInstrumentedTest/kotlin/androidx/compose/ui/test/injectionscope/touch/SwipeWithTouchSlopTest.kt
@@ -38,14 +38,13 @@
 import org.junit.runner.RunWith
 
 /**
- * Test to see if we can achieve precise scroll motion when injecting touch events in the
- * presence of touch slop.
+ * Test to see if we can achieve precise scroll motion when injecting touch events in the presence
+ * of touch slop.
  */
 @MediumTest
 @RunWith(AndroidJUnit4::class)
 class SwipeWithTouchSlopTest {
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
     @Test
     fun swipeScrollable_accountForTouchSlop() {
@@ -56,14 +55,11 @@
                 with(LocalDensity.current) {
                     // Scrollable with a viewport the size of 10 boxes
                     Column(
-                        Modifier
-                            .testTag("scrollable")
+                        Modifier.testTag("scrollable")
                             .requiredSize(100.toDp(), 1000.toDp())
                             .verticalScroll(scrollState)
                     ) {
-                        repeat(100) {
-                            ClickableTestBox()
-                        }
+                        repeat(100) { ClickableTestBox() }
                     }
                 }
             }
diff --git a/compose/ui/ui-test/src/androidInstrumentedTest/kotlin/androidx/compose/ui/test/injectionscope/touch/SwipeWithVelocityTest.kt b/compose/ui/ui-test/src/androidInstrumentedTest/kotlin/androidx/compose/ui/test/injectionscope/touch/SwipeWithVelocityTest.kt
index 09f0cca..6c3c11e 100644
--- a/compose/ui/ui-test/src/androidInstrumentedTest/kotlin/androidx/compose/ui/test/injectionscope/touch/SwipeWithVelocityTest.kt
+++ b/compose/ui/ui-test/src/androidInstrumentedTest/kotlin/androidx/compose/ui/test/injectionscope/touch/SwipeWithVelocityTest.kt
@@ -49,17 +49,14 @@
 import org.junit.runners.Parameterized
 
 /**
- * Test for [TouchInjectionScope.swipeWithVelocity] to see if we can generate gestures that end
- * with a specific velocity. Note that the "engine" is already extensively tested in
+ * Test for [TouchInjectionScope.swipeWithVelocity] to see if we can generate gestures that end with
+ * a specific velocity. Note that the "engine" is already extensively tested in
  * [VelocityPathFinderTest], so all we need to do here is verify a few swipes.
  */
 @MediumTest
 @RunWith(Parameterized::class)
 class SwipeWithVelocityTest(private val config: TestConfig) {
-    data class TestConfig(
-        val durationMillis: Long,
-        val velocity: Float
-    )
+    data class TestConfig(val durationMillis: Long, val velocity: Float)
 
     companion object {
         @JvmStatic
@@ -85,8 +82,7 @@
         private val end = Offset(boxEnd, boxMiddle)
     }
 
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
     private val recorder = SinglePointerInputRecorder()
 
@@ -94,10 +90,7 @@
     @Test
     fun swipeWithVelocity() {
         rule.setContent {
-            Box(
-                Modifier
-                    .fillMaxSize()
-                    .wrapContentSize(Alignment.BottomEnd)) {
+            Box(Modifier.fillMaxSize().wrapContentSize(Alignment.BottomEnd)) {
                 ClickableTestBox(recorder, boxSize, boxSize, tag = tag)
             }
         }
@@ -127,7 +120,8 @@
                 if (VelocityTrackerStrategyUseImpulse) {
                     // Check velocity
                     // Swipe goes from left to right, so vx = velocity (within 5%) and vy = 0
-                    assertThat(recordedVelocity.x).isWithin(0.05f * config.velocity)
+                    assertThat(recordedVelocity.x)
+                        .isWithin(0.05f * config.velocity)
                         .of(config.velocity)
                     assertThat(recordedVelocity.y).isWithin(.1f).of(0f)
                 } else {
diff --git a/compose/ui/ui-test/src/androidInstrumentedTest/kotlin/androidx/compose/ui/test/injectionscope/touch/SynchronizedWithMainClockTest.kt b/compose/ui/ui-test/src/androidInstrumentedTest/kotlin/androidx/compose/ui/test/injectionscope/touch/SynchronizedWithMainClockTest.kt
index 55ba8b4..2749a81 100644
--- a/compose/ui/ui-test/src/androidInstrumentedTest/kotlin/androidx/compose/ui/test/injectionscope/touch/SynchronizedWithMainClockTest.kt
+++ b/compose/ui/ui-test/src/androidInstrumentedTest/kotlin/androidx/compose/ui/test/injectionscope/touch/SynchronizedWithMainClockTest.kt
@@ -29,31 +29,23 @@
 import org.junit.Test
 import org.junit.runner.RunWith
 
-/**
- * Tests if the current time of gestures is aligned with the main test clock
- */
+/** Tests if the current time of gestures is aligned with the main test clock */
 @LargeTest
 @RunWith(AndroidJUnit4::class)
 class SynchronizedWithMainClockTest {
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
     private val recorder = SinglePointerInputRecorder()
 
     @Before
     fun setUp() {
         // Given some content
-        rule.setContent {
-            ClickableTestBox(recorder)
-        }
+        rule.setContent { ClickableTestBox(recorder) }
     }
 
     @Test
     fun zeroTimeBetween_performTouchInput() {
-        testWithTwoGestures(
-            expectedDifference = 0,
-            betweenGesturesBlock = {}
-        )
+        testWithTwoGestures(expectedDifference = 0, betweenGesturesBlock = {})
     }
 
     @Test
@@ -66,10 +58,7 @@
         )
     }
 
-    private fun testWithTwoGestures(
-        expectedDifference: Long,
-        betweenGesturesBlock: () -> Unit
-    ) {
+    private fun testWithTwoGestures(expectedDifference: Long, betweenGesturesBlock: () -> Unit) {
         rule.performTouchInput { click() }
         betweenGesturesBlock.invoke()
         rule.performTouchInput { click() }
diff --git a/compose/ui/ui-test/src/androidInstrumentedTest/kotlin/androidx/compose/ui/test/injectionscope/touch/UpTest.kt b/compose/ui/ui-test/src/androidInstrumentedTest/kotlin/androidx/compose/ui/test/injectionscope/touch/UpTest.kt
index 3d686c0..716197d 100644
--- a/compose/ui/ui-test/src/androidInstrumentedTest/kotlin/androidx/compose/ui/test/injectionscope/touch/UpTest.kt
+++ b/compose/ui/ui-test/src/androidInstrumentedTest/kotlin/androidx/compose/ui/test/injectionscope/touch/UpTest.kt
@@ -36,9 +36,7 @@
 import org.junit.Rule
 import org.junit.Test
 
-/**
- * Tests if [TouchInjectionScope.up] works
- */
+/** Tests if [TouchInjectionScope.up] works */
 @MediumTest
 class UpTest {
     companion object {
@@ -46,17 +44,14 @@
         private val downPosition2 = Offset(20f, 20f)
     }
 
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
     private val recorder = MultiPointerInputRecorder()
 
     @Before
     fun setUp() {
         // Given some content
-        rule.setContent {
-            ClickableTestBox(recorder)
-        }
+        rule.setContent { ClickableTestBox(recorder) }
     }
 
     @Test
@@ -117,34 +112,26 @@
 
     @Test
     fun up_withoutDown() {
-        expectError<IllegalStateException> {
-            rule.performTouchInput { up() }
-        }
+        expectError<IllegalStateException> { rule.performTouchInput { up() } }
     }
 
     @Test
     fun up_wrongPointerId() {
         rule.performTouchInput { down(1, downPosition1) }
-        expectError<IllegalArgumentException> {
-            rule.performTouchInput { up(2) }
-        }
+        expectError<IllegalArgumentException> { rule.performTouchInput { up(2) } }
     }
 
     @Test
     fun up_afterUp() {
         rule.performTouchInput { down(downPosition1) }
         rule.performTouchInput { up() }
-        expectError<IllegalStateException> {
-            rule.performTouchInput { up() }
-        }
+        expectError<IllegalStateException> { rule.performTouchInput { up() } }
     }
 
     @Test
     fun up_afterCancel() {
         rule.performTouchInput { down(downPosition1) }
         rule.performTouchInput { cancel() }
-        expectError<IllegalStateException> {
-            rule.performTouchInput { up() }
-        }
+        expectError<IllegalStateException> { rule.performTouchInput { up() } }
     }
 }
diff --git a/compose/ui/ui-test/src/androidInstrumentedTest/kotlin/androidx/compose/ui/test/injectionscope/touch/VelocityPathFinderCalculateDurationTest.kt b/compose/ui/ui-test/src/androidInstrumentedTest/kotlin/androidx/compose/ui/test/injectionscope/touch/VelocityPathFinderCalculateDurationTest.kt
index dc0a2d9..f46eba8 100644
--- a/compose/ui/ui-test/src/androidInstrumentedTest/kotlin/androidx/compose/ui/test/injectionscope/touch/VelocityPathFinderCalculateDurationTest.kt
+++ b/compose/ui/ui-test/src/androidInstrumentedTest/kotlin/androidx/compose/ui/test/injectionscope/touch/VelocityPathFinderCalculateDurationTest.kt
@@ -37,8 +37,8 @@
 import org.junit.runners.Parameterized
 
 /**
- * Test to check if [VelocityPathFinder.calculateDefaultDuration] calculates a duration for
- * which it is possible to generate a swipe from start to end with a certain endVelocity.
+ * Test to check if [VelocityPathFinder.calculateDefaultDuration] calculates a duration for which it
+ * is possible to generate a swipe from start to end with a certain endVelocity.
  */
 @RunWith(Parameterized::class)
 class VelocityPathFinderCalculateDurationTest(private val config: TestConfig) {
@@ -58,119 +58,132 @@
         private val errorNegativeVelocity = Regex("Velocity cannot be .*, it must be positive")
         private val errorPositiveVelocity =
             Regex("When start == end; velocity cannot be .*, it must be 0f")
-        private val errorWithSuggestions = Regex(
-            "Unable to generate a swipe gesture between .* and .* that ends with " +
-                "velocity of .* px/s, without going outside of the range " +
-                "\\[start\\.\\.end]\\. Suggested fixes: .*"
-        )
-        private val suggestedFixesRegex = Regex(
-            "1\\. set velocity to (.*) px/s or lower; or " +
-                "2\\. increase the distance between the start and end to (.*) or higher"
-        )
+        private val errorWithSuggestions =
+            Regex(
+                "Unable to generate a swipe gesture between .* and .* that ends with " +
+                    "velocity of .* px/s, without going outside of the range " +
+                    "\\[start\\.\\.end]\\. Suggested fixes: .*"
+            )
+        private val suggestedFixesRegex =
+            Regex(
+                "1\\. set velocity to (.*) px/s or lower; or " +
+                    "2\\. increase the distance between the start and end to (.*) or higher"
+            )
 
         @OptIn(ExperimentalComposeUiApi::class)
         @JvmStatic
         @Parameterized.Parameters(name = "{0}")
-        fun params() = if (VelocityTrackerStrategyUseImpulse) {
-            mutableListOf(
-                // An essential value in the VelocityPathFinder is `d`, calculated as
-                // `d = 2 / velocity * (end - start)`, and represents the maximum time over which
-                // we can spread out a gesture going from start to end while still following a
-                // polynomial that has v=velocity at the end. (Note that this necessarily has v=0
-                // at the start: if v<0 at the start, the path would go out of the range
-                // [start, end], and if v>0 we would arrive at the end faster.)
-                //
-                // Without going into details as to why, there are basically 3 different ranges
-                // of d to test for:
-                //
-                // 1. d < 40
-                //    The requested velocity is so high that the "slowest" polynomial to reach it
-                //    still takes less than 40ms, which is the minimum duration. We expect the
-                //    duration suggestion to throw an IllegalArgumentException, and suggest changes
-                //    to the input that would _just_ take us to that 40ms minimum.
-                // 2. d >= 100
-                //    We can make a valid path with any desired duration. The suggestion picks a
-                //    default of 200ms.
-                // 3. 40 <= d < 100
-                //    The entire gesture must follow an exact polynomial, which is only possible if
-                //    the suggested duration < d. We expect the suggestion to be floor(d).
-                //
-                // A few other scenarios to test for are:
-                // - start == end
-                //   Gesture can't move at all, so velocity _must_ be 0. Expect an error otherwise.
-                // - velocity < 0
-                //   Simply not possible. Expect an error always.
+        fun params() =
+            if (VelocityTrackerStrategyUseImpulse) {
+                mutableListOf(
+                    // An essential value in the VelocityPathFinder is `d`, calculated as
+                    // `d = 2 / velocity * (end - start)`, and represents the maximum time over
+                    // which
+                    // we can spread out a gesture going from start to end while still following a
+                    // polynomial that has v=velocity at the end. (Note that this necessarily has
+                    // v=0
+                    // at the start: if v<0 at the start, the path would go out of the range
+                    // [start, end], and if v>0 we would arrive at the end faster.)
+                    //
+                    // Without going into details as to why, there are basically 3 different ranges
+                    // of d to test for:
+                    //
+                    // 1. d < 40
+                    //    The requested velocity is so high that the "slowest" polynomial to reach
+                    // it
+                    //    still takes less than 40ms, which is the minimum duration. We expect the
+                    //    duration suggestion to throw an IllegalArgumentException, and suggest
+                    // changes
+                    //    to the input that would _just_ take us to that 40ms minimum.
+                    // 2. d >= 100
+                    //    We can make a valid path with any desired duration. The suggestion picks a
+                    //    default of 200ms.
+                    // 3. 40 <= d < 100
+                    //    The entire gesture must follow an exact polynomial, which is only possible
+                    // if
+                    //    the suggested duration < d. We expect the suggestion to be floor(d).
+                    //
+                    // A few other scenarios to test for are:
+                    // - start == end
+                    //   Gesture can't move at all, so velocity _must_ be 0. Expect an error
+                    // otherwise.
+                    // - velocity < 0
+                    //   Simply not possible. Expect an error always.
 
-                TestConfig(DistanceZero, -1f, expectedError = errorNegativeVelocity),
-                TestConfig(DistanceZero, 0f, expectedDurationMillis = 200L),
-                TestConfig(DistanceZero, 1f, expectedError = errorPositiveVelocity),
-                TestConfig(Distance100, -1f, expectedError = errorNegativeVelocity),
-                TestConfig(Distance100, 0f, expectedDurationMillis = 200L),
-                TestConfig(Distance100, 1f, expectedDurationMillis = 200L),
+                    TestConfig(DistanceZero, -1f, expectedError = errorNegativeVelocity),
+                    TestConfig(DistanceZero, 0f, expectedDurationMillis = 200L),
+                    TestConfig(DistanceZero, 1f, expectedError = errorPositiveVelocity),
+                    TestConfig(Distance100, -1f, expectedError = errorNegativeVelocity),
+                    TestConfig(Distance100, 0f, expectedDurationMillis = 200L),
+                    TestConfig(Distance100, 1f, expectedDurationMillis = 200L),
 
-                // d > 100
-                TestConfig(
-                    Distance100, 1999f, expectedDurationMillis = 200L,
-                    tolerance = 1f
-                ),
-                // d = 100
-                TestConfig(Distance100, 2000f, expectedDurationMillis = 100L),
-                TestConfig(
-                    Distance100, 2480f, expectedDurationMillis = 80L,
-                    tolerance = 1f
-                ), // d ≈ 80.65
+                    // d > 100
+                    TestConfig(Distance100, 1999f, expectedDurationMillis = 200L, tolerance = 1f),
+                    // d = 100
+                    TestConfig(Distance100, 2000f, expectedDurationMillis = 100L),
+                    TestConfig(
+                        Distance100,
+                        2480f,
+                        expectedDurationMillis = 80L,
+                        tolerance = 1f
+                    ), // d ≈ 80.65
 
-                /*
-                (b/316099844) Readd this test case.
-                 TestConfig(Distance100, 5000f, expectedError = errorWithSuggestions), // d = 40
-                 */
-                // d < 40
-                TestConfig(Distance100, 5001f, expectedError = errorWithSuggestions),
-            )
-        } else {
-            mutableListOf(
-                // An essential value in the VelocityPathFinder is `d`, calculated as
-                // `d = 2 / velocity * (end - start)`, and represents the maximum time over which
-                // we can spread out a gesture going from start to end while still following a
-                // polynomial that has v=velocity at the end. (Note that this necessarily has
-                // v=0 at the start: if v<0 at the start, the path would go out of the range
-                // [start, end], and if v>0 we would arrive at the end faster.)
-                //
-                // Without going into details as to why, there are basically 3 different ranges of
-                // d to test for:
-                //
-                // 1. d < 40
-                //    The requested velocity is so high that the "slowest" polynomial to reach it
-                //    still takes less than 40ms, which is the minimum duration. We expect the
-                //    duration suggestion to throw an IllegalArgumentException, and suggest changes
-                //    to the input that would _just_ take us to that 40ms minimum.
-                // 2. d >= 100
-                //    We can make a valid path with any desired duration. The suggestion picks a
-                //    default of 200ms.
-                // 3. 40 <= d < 100
-                //    The entire gesture must follow an exact polynomial, which is only possible if
-                //    the suggested duration < d. We expect the suggestion to be floor(d).
-                //
-                // A few other scenarios to test for are:
-                // - start == end
-                //   Gesture can't move at all, so velocity _must_ be 0. Expect an error otherwise.
-                // - velocity < 0
-                //   Simply not possible. Expect an error always.
+                    /*
+                    (b/316099844) Readd this test case.
+                     TestConfig(Distance100, 5000f, expectedError = errorWithSuggestions), // d = 40
+                     */
+                    // d < 40
+                    TestConfig(Distance100, 5001f, expectedError = errorWithSuggestions),
+                )
+            } else {
+                mutableListOf(
+                    // An essential value in the VelocityPathFinder is `d`, calculated as
+                    // `d = 2 / velocity * (end - start)`, and represents the maximum time over
+                    // which
+                    // we can spread out a gesture going from start to end while still following a
+                    // polynomial that has v=velocity at the end. (Note that this necessarily has
+                    // v=0 at the start: if v<0 at the start, the path would go out of the range
+                    // [start, end], and if v>0 we would arrive at the end faster.)
+                    //
+                    // Without going into details as to why, there are basically 3 different ranges
+                    // of
+                    // d to test for:
+                    //
+                    // 1. d < 40
+                    //    The requested velocity is so high that the "slowest" polynomial to reach
+                    // it
+                    //    still takes less than 40ms, which is the minimum duration. We expect the
+                    //    duration suggestion to throw an IllegalArgumentException, and suggest
+                    // changes
+                    //    to the input that would _just_ take us to that 40ms minimum.
+                    // 2. d >= 100
+                    //    We can make a valid path with any desired duration. The suggestion picks a
+                    //    default of 200ms.
+                    // 3. 40 <= d < 100
+                    //    The entire gesture must follow an exact polynomial, which is only possible
+                    // if
+                    //    the suggested duration < d. We expect the suggestion to be floor(d).
+                    //
+                    // A few other scenarios to test for are:
+                    // - start == end
+                    //   Gesture can't move at all, so velocity _must_ be 0. Expect an error
+                    // otherwise.
+                    // - velocity < 0
+                    //   Simply not possible. Expect an error always.
 
-                TestConfig(DistanceZero, -1f, expectedError = errorNegativeVelocity),
-                TestConfig(DistanceZero, 0f, expectedDurationMillis = 200L),
-                TestConfig(DistanceZero, 1f, expectedError = errorPositiveVelocity),
-                TestConfig(Distance100, -1f, expectedError = errorNegativeVelocity),
-                TestConfig(Distance100, 0f, expectedDurationMillis = 200L),
-                TestConfig(Distance100, 1f, expectedDurationMillis = 200L),
-
-                TestConfig(Distance100, 1999f, expectedDurationMillis = 200L), // d > 100
-                TestConfig(Distance100, 2000f, expectedDurationMillis = 100L), // d = 100
-                TestConfig(Distance100, 2480f, expectedDurationMillis = 80L), // d ≈ 80.65
-                TestConfig(Distance100, 5000f, expectedDurationMillis = 40L), // d = 40
-                TestConfig(Distance100, 5001f, expectSuggestions = true) // d < 40
-            )
-        }
+                    TestConfig(DistanceZero, -1f, expectedError = errorNegativeVelocity),
+                    TestConfig(DistanceZero, 0f, expectedDurationMillis = 200L),
+                    TestConfig(DistanceZero, 1f, expectedError = errorPositiveVelocity),
+                    TestConfig(Distance100, -1f, expectedError = errorNegativeVelocity),
+                    TestConfig(Distance100, 0f, expectedDurationMillis = 200L),
+                    TestConfig(Distance100, 1f, expectedDurationMillis = 200L),
+                    TestConfig(Distance100, 1999f, expectedDurationMillis = 200L), // d > 100
+                    TestConfig(Distance100, 2000f, expectedDurationMillis = 100L), // d = 100
+                    TestConfig(Distance100, 2480f, expectedDurationMillis = 80L), // d ≈ 80.65
+                    TestConfig(Distance100, 5000f, expectedDurationMillis = 40L), // d = 40
+                    TestConfig(Distance100, 5001f, expectSuggestions = true) // d < 40
+                )
+            }
     }
 
     @Test
@@ -184,19 +197,21 @@
 
     @OptIn(ExperimentalComposeUiApi::class)
     private fun testWithoutExpectedError(config: TestConfig) {
-        val actualDuration = VelocityPathFinder.calculateDefaultDuration(
-            start = Offset.Zero,
-            end = config.end,
-            endVelocity = config.requestedVelocity
-        )
+        val actualDuration =
+            VelocityPathFinder.calculateDefaultDuration(
+                start = Offset.Zero,
+                end = config.end,
+                endVelocity = config.requestedVelocity
+            )
         assertThat(actualDuration).isEqualTo(config.expectedDurationMillis)
 
-        val pathFinder = VelocityPathFinder(
-            startPosition = Offset.Zero,
-            endPosition = config.end,
-            endVelocity = config.requestedVelocity,
-            durationMillis = actualDuration
-        )
+        val pathFinder =
+            VelocityPathFinder(
+                startPosition = Offset.Zero,
+                endPosition = config.end,
+                endVelocity = config.requestedVelocity,
+                durationMillis = actualDuration
+            )
 
         val f: (Long) -> Offset = { pathFinder.calculateOffsetForTime(it) }
         val velocityTracker = simulateSwipe(f, actualDuration)
@@ -286,5 +301,6 @@
         if (isFinite && this != Offset.Zero) this / getDistance() else this
 
     private fun Velocity.toOffset(): Offset = Offset(x, y)
+
     private fun Velocity.sum(): Float = sqrt(x * x + y * y)
 }
diff --git a/compose/ui/ui-test/src/androidInstrumentedTest/kotlin/androidx/compose/ui/test/injectionscope/touch/VelocityPathFinderTest.kt b/compose/ui/ui-test/src/androidInstrumentedTest/kotlin/androidx/compose/ui/test/injectionscope/touch/VelocityPathFinderTest.kt
index 76a0885..502f831 100644
--- a/compose/ui/ui-test/src/androidInstrumentedTest/kotlin/androidx/compose/ui/test/injectionscope/touch/VelocityPathFinderTest.kt
+++ b/compose/ui/ui-test/src/androidInstrumentedTest/kotlin/androidx/compose/ui/test/injectionscope/touch/VelocityPathFinderTest.kt
@@ -37,9 +37,7 @@
 import org.junit.runner.RunWith
 import org.junit.runners.Parameterized
 
-/**
- * Tests of [VelocityPathFinder] creates paths that will lead to the desired velocity.
- */
+/** Tests of [VelocityPathFinder] creates paths that will lead to the desired velocity. */
 @RunWith(Parameterized::class)
 class VelocityPathFinderTest(private val config: TestConfig) {
     data class TestConfig(
@@ -53,59 +51,62 @@
         @OptIn(ExperimentalComposeUiApi::class)
         @JvmStatic
         @Parameterized.Parameters(name = "{0}")
-        fun params() = if (VelocityTrackerStrategyUseImpulse) {
-            mutableListOf<TestConfig>().apply {
-                for (direction in Direction.values()) {
-                    // An essential value in the VelocityPathFinder is `d`, calculated as
-                    // `d = min(T.toDouble(), 2 / velocity * (end - start))`, and represents the
-                    // duration of the polynomial that will result in the correct velocity, from the
-                    // start to the end position. T is the duration of the swipe.
+        fun params() =
+            if (VelocityTrackerStrategyUseImpulse) {
+                mutableListOf<TestConfig>().apply {
+                    for (direction in Direction.values()) {
+                        // An essential value in the VelocityPathFinder is `d`, calculated as
+                        // `d = min(T.toDouble(), 2 / velocity * (end - start))`, and represents the
+                        // duration of the polynomial that will result in the correct velocity, from
+                        // the
+                        // start to the end position. T is the duration of the swipe.
 
-                    // Different scenarios to test are:
-                    // - d < 100 (because VelocityTracker uses the last 100ms of the polynomial)
-                    // - 100 < d < T (swipe must wait at start until d ms left)
-                    // - d > T (swipe can start immediately)
-                    // - v == 0
+                        // Different scenarios to test are:
+                        // - d < 100 (because VelocityTracker uses the last 100ms of the polynomial)
+                        // - 100 < d < T (swipe must wait at start until d ms left)
+                        // - d > T (swipe can start immediately)
+                        // - v == 0
 
-                    add(TestConfig(direction.offset, 0f, 100L, false)) // v == 0, small T
-                    add(TestConfig(direction.offset, 0f, 500L, false)) // v == 0, medium T
-                    add(TestConfig(direction.offset, 0f, 1500L, false)) // v == 0, large T
-                    add(TestConfig(direction.offset, 500f, 500L, false)) // T < d
-                    add(TestConfig(direction.offset, 1500f, 500L, false)) // 100 < d < T
-                    add(TestConfig(direction.offset, 6000f, 500L, false)) // d < 100 && T > d
-                    add(TestConfig(direction.offset, 6000f, 66L, false)) // d < 100 && T < d
+                        add(TestConfig(direction.offset, 0f, 100L, false)) // v == 0, small T
+                        add(TestConfig(direction.offset, 0f, 500L, false)) // v == 0, medium T
+                        add(TestConfig(direction.offset, 0f, 1500L, false)) // v == 0, large T
+                        add(TestConfig(direction.offset, 500f, 500L, false)) // T < d
+                        add(TestConfig(direction.offset, 1500f, 500L, false)) // 100 < d < T
+                        add(TestConfig(direction.offset, 6000f, 500L, false)) // d < 100 && T > d
+                        add(TestConfig(direction.offset, 6000f, 66L, false)) // d < 100 && T < d
+                    }
+                    // Regression for b/182477143
+                    add(TestConfig(Offset(424.8f, 0f) - Offset(295.2f, 0f), 2000f, 3000L, false))
+                    // Same as above, but for T = 100
+                    add(TestConfig(Offset(129.6f, 0f), 2000f, 100L, false))
                 }
-                // Regression for b/182477143
-                add(TestConfig(Offset(424.8f, 0f) - Offset(295.2f, 0f), 2000f, 3000L, false))
-                // Same as above, but for T = 100
-                add(TestConfig(Offset(129.6f, 0f), 2000f, 100L, false))
-            }
-        } else {
-            mutableListOf<TestConfig>().apply {
-                for (direction in Direction.values()) {
-                    // An essential value in the VelocityPathFinder is `d`, calculated as
-                    // `d = min(T.toDouble(), 2 / velocity * (end - start))`, and represents the
-                    // duration of the polynomial that will result in the correct velocity, from the
-                    // start to the end position. T is the duration of the swipe.
+            } else {
+                mutableListOf<TestConfig>().apply {
+                    for (direction in Direction.values()) {
+                        // An essential value in the VelocityPathFinder is `d`, calculated as
+                        // `d = min(T.toDouble(), 2 / velocity * (end - start))`, and represents the
+                        // duration of the polynomial that will result in the correct velocity, from
+                        // the
+                        // start to the end position. T is the duration of the swipe.
 
-                    // Different scenarios to test are:
-                    // - d < 100 (because VelocityTracker uses the last 100ms of the polynomial)
-                    // - 100 < d < T (swipe must wait at start until d ms left)
-                    // - d > T (swipe can start immediately)
-                    // - v == 0
+                        // Different scenarios to test are:
+                        // - d < 100 (because VelocityTracker uses the last 100ms of the polynomial)
+                        // - 100 < d < T (swipe must wait at start until d ms left)
+                        // - d > T (swipe can start immediately)
+                        // - v == 0
 
-                    add(TestConfig(direction.offset, 0f, 100L, false)) // v == 0, small T
-                    add(TestConfig(direction.offset, 0f, 500L, false)) // v == 0, medium T
-                    add(TestConfig(direction.offset, 0f, 1500L, false)) // v == 0, large T
-                    add(TestConfig(direction.offset, 500f, 500L, false)) // T < d
-                    add(TestConfig(direction.offset, 1500f, 500L, false)) // 100 < d < T
-                    add(TestConfig(direction.offset, 6000f, 500L, true)) // d < 100 && T > d
-                    add(TestConfig(direction.offset, 6000f, 66L, false)) // d < 100 && T < d
+                        add(TestConfig(direction.offset, 0f, 100L, false)) // v == 0, small T
+                        add(TestConfig(direction.offset, 0f, 500L, false)) // v == 0, medium T
+                        add(TestConfig(direction.offset, 0f, 1500L, false)) // v == 0, large T
+                        add(TestConfig(direction.offset, 500f, 500L, false)) // T < d
+                        add(TestConfig(direction.offset, 1500f, 500L, false)) // 100 < d < T
+                        add(TestConfig(direction.offset, 6000f, 500L, true)) // d < 100 && T > d
+                        add(TestConfig(direction.offset, 6000f, 66L, false)) // d < 100 && T < d
+                    }
+                    // Regression for b/182477143
+                    add(TestConfig(Offset(424.8f, 0f) - Offset(295.2f, 0f), 2000f, 3000L, false))
                 }
-                // Regression for b/182477143
-                add(TestConfig(Offset(424.8f, 0f) - Offset(295.2f, 0f), 2000f, 3000L, false))
             }
-        }
     }
 
     @Test
@@ -119,12 +120,13 @@
 
     @OptIn(ExperimentalComposeUiApi::class)
     private fun testWithoutExpectedError(config: TestConfig) {
-        val pathFinder = VelocityPathFinder(
-            startPosition = Offset.Zero,
-            endPosition = config.end,
-            endVelocity = config.requestedVelocity,
-            durationMillis = config.durationMillis
-        )
+        val pathFinder =
+            VelocityPathFinder(
+                startPosition = Offset.Zero,
+                endPosition = config.end,
+                endVelocity = config.requestedVelocity,
+                durationMillis = config.durationMillis
+            )
 
         val f: (Long) -> Offset = { pathFinder.calculateOffsetForTime(it) }
         val velocityTracker = simulateSwipe(config, f)
@@ -157,19 +159,21 @@
     private fun testWithExpectedError(config: TestConfig, testSuggestions: Boolean = false) {
         try {
             VelocityPathFinder(
-                startPosition = Offset.Zero,
-                endPosition = config.end,
-                endVelocity = config.requestedVelocity,
-                durationMillis = config.durationMillis
-            ).calculateOffsetForTime(0L)
+                    startPosition = Offset.Zero,
+                    endPosition = config.end,
+                    endVelocity = config.requestedVelocity,
+                    durationMillis = config.durationMillis
+                )
+                .calculateOffsetForTime(0L)
             fail("Expected an IllegalArgumentException")
         } catch (e: IllegalArgumentException) {
-            assertThat(e.message).startsWith(
-                "Unable to generate a swipe gesture between ${Offset.Zero} and ${config.end} " +
-                    "with duration ${config.durationMillis} that ends with velocity of " +
-                    "${config.requestedVelocity} px/s, without going outside of the range " +
-                    "[start..end]. Suggested fixes: "
-            )
+            assertThat(e.message)
+                .startsWith(
+                    "Unable to generate a swipe gesture between ${Offset.Zero} and ${config.end} " +
+                        "with duration ${config.durationMillis} that ends with velocity of " +
+                        "${config.requestedVelocity} px/s, without going outside of the range " +
+                        "[start..end]. Suggested fixes: "
+                )
 
             val suggestedFixes = e.message!!.substringAfter("Suggested fixes: ")
             val (maxDuration, maxVelocity, minDistance) = getSuggestions(suggestedFixes)
@@ -195,11 +199,12 @@
         }
     }
 
-    private val suggestedFixesRegex = Regex(
-        "1\\. set duration to (.*) or lower; " +
-            "2\\. set velocity to (.*) px/s or lower; or " +
-            "3\\. increase the distance between the start and end to (.*) or higher"
-    )
+    private val suggestedFixesRegex =
+        Regex(
+            "1\\. set duration to (.*) or lower; " +
+                "2\\. set velocity to (.*) px/s or lower; or " +
+                "3\\. increase the distance between the start and end to (.*) or higher"
+        )
 
     private fun getSuggestions(suggestedFixes: String): List<Float> {
         val match = suggestedFixesRegex.matchEntire(suggestedFixes)
@@ -223,11 +228,12 @@
         if (isFinite && this != Offset.Zero) this / getDistance() else this
 
     private fun Velocity.toOffset(): Offset = Offset(x, y)
+
     private fun Velocity.sum(): Float = sqrt(x * x + y * y)
 
     /**
-     * Direction of the swipe, when starting from [Offset.Zero].
-     * N/W/S/E are straight lines, NW/SW/SE/NE are at a 60º angle.
+     * Direction of the swipe, when starting from [Offset.Zero]. N/W/S/E are straight lines,
+     * NW/SW/SE/NE are at a 60º angle.
      */
     enum class Direction(val offset: Offset) {
         N(Offset(0f, -200f)),
diff --git a/compose/ui/ui-test/src/androidInstrumentedTest/kotlin/androidx/compose/ui/test/junit4/ApplySnapshotImmediatelyTest.kt b/compose/ui/ui-test/src/androidInstrumentedTest/kotlin/androidx/compose/ui/test/junit4/ApplySnapshotImmediatelyTest.kt
index 241f990..a67bbfd 100644
--- a/compose/ui/ui-test/src/androidInstrumentedTest/kotlin/androidx/compose/ui/test/junit4/ApplySnapshotImmediatelyTest.kt
+++ b/compose/ui/ui-test/src/androidInstrumentedTest/kotlin/androidx/compose/ui/test/junit4/ApplySnapshotImmediatelyTest.kt
@@ -31,8 +31,7 @@
 import org.junit.Test
 
 class ApplySnapshotImmediatelyTest {
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
     @Test
     fun test() {
diff --git a/compose/ui/ui-test/src/androidInstrumentedTest/kotlin/androidx/compose/ui/test/junit4/ComposeIdlingResourceTest.kt b/compose/ui/ui-test/src/androidInstrumentedTest/kotlin/androidx/compose/ui/test/junit4/ComposeIdlingResourceTest.kt
index 4101860..3dabe1c 100644
--- a/compose/ui/ui-test/src/androidInstrumentedTest/kotlin/androidx/compose/ui/test/junit4/ComposeIdlingResourceTest.kt
+++ b/compose/ui/ui-test/src/androidInstrumentedTest/kotlin/androidx/compose/ui/test/junit4/ComposeIdlingResourceTest.kt
@@ -59,9 +59,7 @@
     private var animationRunning = false
     private val recordedAnimatedValues = mutableListOf<Float>()
 
-    /**
-     * High level test to only verify that [ComposeUiTest.runOnIdle] awaits animations.
-     */
+    /** High level test to only verify that [ComposeUiTest.runOnIdle] awaits animations. */
     @Test
     fun testRunOnIdle() = runComposeUiTest {
         val animationState = mutableStateOf(AnimationStates.From)
@@ -82,9 +80,7 @@
         }
     }
 
-    /**
-     * High level test to only verify that [Espresso.onIdle] awaits animations.
-     */
+    /** High level test to only verify that [Espresso.onIdle] awaits animations. */
     @Test
     fun testAnimationIdle_simple() = runComposeUiTest {
         val animationState = mutableStateOf(AnimationStates.From)
@@ -106,26 +102,27 @@
 
     @Test
     fun testIdlingResourcesAreQueried() = runComposeUiTest {
-        val idlingResource = object : IdlingResource {
-            var readCount = MutableStateFlow(0)
+        val idlingResource =
+            object : IdlingResource {
+                var readCount = MutableStateFlow(0)
 
-            override var isIdleNow: Boolean = false
-                get() {
-                    readCount.value++
-                    return field
-                }
+                override var isIdleNow: Boolean = false
+                    get() {
+                        readCount.value++
+                        return field
+                    }
 
-            // Returns a lambda that suspends until isIdleNow is queried 10 more times
-            fun delayedTransitionToIdle(): () -> Unit {
-                return {
-                    runBlocking {
-                        val start = readCount.value
-                        readCount.first { it == start + 10 }
-                        isIdleNow = true
+                // Returns a lambda that suspends until isIdleNow is queried 10 more times
+                fun delayedTransitionToIdle(): () -> Unit {
+                    return {
+                        runBlocking {
+                            val start = readCount.value
+                            readCount.first { it == start + 10 }
+                            isIdleNow = true
+                        }
                     }
                 }
             }
-        }
 
         registerIdlingResource(idlingResource)
         Executors.newSingleThreadExecutor().execute(idlingResource.delayedTransitionToIdle())
@@ -143,24 +140,22 @@
         Box(modifier = Modifier.background(color = Color.Yellow).fillMaxSize()) {
             val transition = updateTransition(animationState.value)
             animationRunning = transition.currentState != transition.targetState
-            val x by transition.animateFloat(
-                transitionSpec = {
-                    if (AnimationStates.From isTransitioningTo AnimationStates.To) {
-                        tween(
-                            easing = LinearEasing,
-                            durationMillis = nonIdleDuration.toInt()
-                        )
+            val x by
+                transition.animateFloat(
+                    transitionSpec = {
+                        if (AnimationStates.From isTransitioningTo AnimationStates.To) {
+                            tween(easing = LinearEasing, durationMillis = nonIdleDuration.toInt())
+                        } else {
+                            snap()
+                        }
+                    }
+                ) {
+                    if (it == AnimationStates.From) {
+                        animateFromX
                     } else {
-                        snap()
+                        animateToX
                     }
                 }
-            ) {
-                if (it == AnimationStates.From) {
-                    animateFromX
-                } else {
-                    animateToX
-                }
-            }
             Canvas(modifier = Modifier.fillMaxSize()) {
                 recordedAnimatedValues.add(x)
                 drawRect(Color.Cyan, Offset(x, 0f), rectSize)
diff --git a/compose/ui/ui-test/src/androidInstrumentedTest/kotlin/androidx/compose/ui/test/junit4/ComposeInFragmentTest.kt b/compose/ui/ui-test/src/androidInstrumentedTest/kotlin/androidx/compose/ui/test/junit4/ComposeInFragmentTest.kt
index 11c4f0e..e05db87 100644
--- a/compose/ui/ui-test/src/androidInstrumentedTest/kotlin/androidx/compose/ui/test/junit4/ComposeInFragmentTest.kt
+++ b/compose/ui/ui-test/src/androidInstrumentedTest/kotlin/androidx/compose/ui/test/junit4/ComposeInFragmentTest.kt
@@ -57,9 +57,7 @@
         }
 
         override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
-            (view as ComposeView).setContent {
-                Text("Hello Compose")
-            }
+            (view as ComposeView).setContent { Text("Hello Compose") }
         }
     }
 }
diff --git a/compose/ui/ui-test/src/androidInstrumentedTest/kotlin/androidx/compose/ui/test/junit4/ComposeRootRegistryTest.kt b/compose/ui/ui-test/src/androidInstrumentedTest/kotlin/androidx/compose/ui/test/junit4/ComposeRootRegistryTest.kt
index 8add055..29cd87b 100644
--- a/compose/ui/ui-test/src/androidInstrumentedTest/kotlin/androidx/compose/ui/test/junit4/ComposeRootRegistryTest.kt
+++ b/compose/ui/ui-test/src/androidInstrumentedTest/kotlin/androidx/compose/ui/test/junit4/ComposeRootRegistryTest.kt
@@ -39,21 +39,20 @@
     private val composeRootRegistry = ComposeRootRegistry()
 
     @get:Rule
-    val testRule: RuleChain = RuleChain
-        .outerRule { base, _ ->
-            object : Statement() {
-                override fun evaluate() {
-                    composeRootRegistry.withRegistry {
-                        base.evaluate()
+    val testRule: RuleChain =
+        RuleChain.outerRule { base, _ ->
+                object : Statement() {
+                    override fun evaluate() {
+                        composeRootRegistry.withRegistry { base.evaluate() }
                     }
                 }
             }
-        }
-        .around(activityRule)
+            .around(activityRule)
 
     private val onRegistrationChangedListener =
         object : ComposeRootRegistry.OnRegistrationChangedListener {
             val recordedChanges = mutableListOf<Pair<ViewRootForTest, Boolean>>()
+
             override fun onRegistrationChanged(composeRoot: ViewRootForTest, registered: Boolean) {
                 recordedChanges.add(Pair(composeRoot, registered))
             }
@@ -75,18 +74,16 @@
     fun registerComposeRoot() {
         activityRule.scenario.onActivity { activity ->
             // set the composable content and find a compose root
-            activity.setContent { }
+            activity.setContent {}
             val composeRoot = activity.findRootForTest()
 
             // Then it is registered
-            assertThat(composeRootRegistry.getCreatedComposeRoots())
-                .isEqualTo(setOf(composeRoot))
+            assertThat(composeRootRegistry.getCreatedComposeRoots()).isEqualTo(setOf(composeRoot))
             assertThat(composeRootRegistry.getRegisteredComposeRoots())
                 .isEqualTo(setOf(composeRoot))
             // And our listener was notified
-            assertThat(onRegistrationChangedListener.recordedChanges).isEqualTo(
-                listOf(Pair(composeRoot, true))
-            )
+            assertThat(onRegistrationChangedListener.recordedChanges)
+                .isEqualTo(listOf(Pair(composeRoot, true)))
         }
     }
 
@@ -94,7 +91,7 @@
     fun unregisterViewRoot() {
         activityRule.scenario.onActivity { activity ->
             // set the composable content and find a compose root
-            activity.setContent { }
+            activity.setContent {}
             val composeRoot = activity.findRootForTest()
 
             // And remove it from the hierarchy
@@ -103,12 +100,8 @@
             // Then it is not registered now
             assertThat(composeRootRegistry.getRegisteredComposeRoots()).isEmpty()
             // But our listener was notified of addition and removal
-            assertThat(onRegistrationChangedListener.recordedChanges).isEqualTo(
-                listOf(
-                    Pair(composeRoot, true),
-                    Pair(composeRoot, false)
-                )
-            )
+            assertThat(onRegistrationChangedListener.recordedChanges)
+                .isEqualTo(listOf(Pair(composeRoot, true), Pair(composeRoot, false)))
         }
     }
 
@@ -116,7 +109,7 @@
     fun tearDownRegistry() {
         activityRule.scenario.onActivity { activity ->
             // set the composable content and find a compose root
-            activity.setContent { }
+            activity.setContent {}
             val composeRoot = activity.findRootForTest()
 
             // When we tear down the registry
@@ -126,12 +119,8 @@
             assertThat(composeRootRegistry.getCreatedComposeRoots()).isEmpty()
             assertThat(composeRootRegistry.getRegisteredComposeRoots()).isEmpty()
             // And our listener was notified of addition and removal
-            assertThat(onRegistrationChangedListener.recordedChanges).isEqualTo(
-                listOf(
-                    Pair(composeRoot, true),
-                    Pair(composeRoot, false)
-                )
-            )
+            assertThat(onRegistrationChangedListener.recordedChanges)
+                .isEqualTo(listOf(Pair(composeRoot, true), Pair(composeRoot, false)))
         }
     }
 }
diff --git a/compose/ui/ui-test/src/androidInstrumentedTest/kotlin/androidx/compose/ui/test/junit4/ComposeTestRuleWaitUntilTest.kt b/compose/ui/ui-test/src/androidInstrumentedTest/kotlin/androidx/compose/ui/test/junit4/ComposeTestRuleWaitUntilTest.kt
index 12f2c73..07a0836 100644
--- a/compose/ui/ui-test/src/androidInstrumentedTest/kotlin/androidx/compose/ui/test/junit4/ComposeTestRuleWaitUntilTest.kt
+++ b/compose/ui/ui-test/src/androidInstrumentedTest/kotlin/androidx/compose/ui/test/junit4/ComposeTestRuleWaitUntilTest.kt
@@ -37,34 +37,24 @@
 @OptIn(ExperimentalTestApi::class)
 class ComposeTestRuleWaitUntilTest {
 
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
     companion object {
         private const val TestTag = "TestTag"
         private const val Timeout = 500L
     }
 
-    @Composable
-    private fun TaggedBox() = Box(
-        Modifier
-            .size(10.dp, 10.dp)
-            .testTag(TestTag)
-    )
+    @Composable private fun TaggedBox() = Box(Modifier.size(10.dp, 10.dp).testTag(TestTag))
 
     @Test
     fun waitUntil_includesConditionDescription_whenSpecified() {
-        rule.setContent {
-            TaggedBox()
-        }
+        rule.setContent { TaggedBox() }
 
         expectError<ComposeTimeoutException>(
             // This is actually regex, so special characters need to be escaped.
             expectedMessage = "Condition \\(foo\\) still not satisfied after $Timeout ms"
         ) {
-            rule.waitUntil("foo", timeoutMillis = Timeout) {
-                false
-            }
+            rule.waitUntil("foo", timeoutMillis = Timeout) { false }
         }
     }
 
@@ -88,8 +78,9 @@
         }
 
         expectError<ComposeTimeoutException>(
-            expectedMessage = "Condition \\(exactly 2 nodes match \\(TestTag = 'TestTag'\\)\\) " +
-                "still not satisfied after $Timeout ms"
+            expectedMessage =
+                "Condition \\(exactly 2 nodes match \\(TestTag = 'TestTag'\\)\\) " +
+                    "still not satisfied after $Timeout ms"
         ) {
             rule.waitUntilNodeCount(hasTestTag(TestTag), 2, Timeout)
         }
@@ -107,13 +98,12 @@
 
     @Test
     fun waitUntilAtLeastOneExists_throwsWhen_nodesDoNotExist() {
-        rule.setContent {
-            Box(Modifier.size(10.dp))
-        }
+        rule.setContent { Box(Modifier.size(10.dp)) }
 
         expectError<ComposeTimeoutException>(
-            expectedMessage = "Condition \\(at least one node matches " +
-                "\\(TestTag = 'TestTag'\\)\\) still not satisfied after $Timeout ms"
+            expectedMessage =
+                "Condition \\(at least one node matches " +
+                    "\\(TestTag = 'TestTag'\\)\\) still not satisfied after $Timeout ms"
         ) {
             rule.waitUntilAtLeastOneExists(hasTestTag(TestTag), Timeout)
         }
@@ -121,9 +111,7 @@
 
     @Test
     fun waitUntilExactlyOneExists_succeedsWhen_oneNodeExists() {
-        rule.setContent {
-            TaggedBox()
-        }
+        rule.setContent { TaggedBox() }
 
         rule.waitUntilExactlyOneExists(hasTestTag(TestTag))
     }
@@ -136,8 +124,9 @@
         }
 
         expectError<ComposeTimeoutException>(
-            expectedMessage = "Condition \\(exactly 1 nodes match \\(TestTag = 'TestTag'\\)\\) " +
-                "still not satisfied after $Timeout ms"
+            expectedMessage =
+                "Condition \\(exactly 1 nodes match \\(TestTag = 'TestTag'\\)\\) " +
+                    "still not satisfied after $Timeout ms"
         ) {
             rule.waitUntilExactlyOneExists(hasTestTag(TestTag), Timeout)
         }
@@ -145,22 +134,19 @@
 
     @Test
     fun waitUntilDoesNotExists_succeedsWhen_nodeDoesNotExist() {
-        rule.setContent {
-            Box(Modifier.size(10.dp))
-        }
+        rule.setContent { Box(Modifier.size(10.dp)) }
 
         rule.waitUntilDoesNotExist(hasTestTag(TestTag), timeoutMillis = Timeout)
     }
 
     @Test
     fun waitUntilDoesNotExists_throwsWhen_nodeExistsUntilTimeout() {
-        rule.setContent {
-            TaggedBox()
-        }
+        rule.setContent { TaggedBox() }
 
         expectError<ComposeTimeoutException>(
-            expectedMessage = "Condition \\(exactly 0 nodes match \\(TestTag = 'TestTag'\\)\\) " +
-                "still not satisfied after $Timeout ms"
+            expectedMessage =
+                "Condition \\(exactly 0 nodes match \\(TestTag = 'TestTag'\\)\\) " +
+                    "still not satisfied after $Timeout ms"
         ) {
             rule.waitUntilDoesNotExist(hasTestTag(TestTag), timeoutMillis = Timeout)
         }
diff --git a/compose/ui/ui-test/src/androidInstrumentedTest/kotlin/androidx/compose/ui/test/junit4/CustomActivityTest.kt b/compose/ui/ui-test/src/androidInstrumentedTest/kotlin/androidx/compose/ui/test/junit4/CustomActivityTest.kt
index 9ed2aae..8b6c48e 100644
--- a/compose/ui/ui-test/src/androidInstrumentedTest/kotlin/androidx/compose/ui/test/junit4/CustomActivityTest.kt
+++ b/compose/ui/ui-test/src/androidInstrumentedTest/kotlin/androidx/compose/ui/test/junit4/CustomActivityTest.kt
@@ -37,42 +37,33 @@
     override fun onCreate(savedInstanceState: Bundle?) {
         super.onCreate(savedInstanceState)
 
-        setContent {
-            MaterialTheme {
-                Box {
-                    Button(onClick = {}) {
-                        Text("Hello")
-                    }
-                }
-            }
-        }
+        setContent { MaterialTheme { Box { Button(onClick = {}) { Text("Hello") } } } }
     }
 }
 
-/**
- * Tests that we can launch custom activities via [createAndroidComposeRule].
- */
+/** Tests that we can launch custom activities via [createAndroidComposeRule]. */
 @LargeTest
 @RunWith(AndroidJUnit4::class)
 @OptIn(ExperimentalTestApi::class)
 class CustomActivityTest {
     private companion object {
-        const val ContentAlreadySetError = "androidx\\.compose\\.ui\\.test\\.junit4\\." +
-            "CustomActivity@[0-9A-Fa-f]* has already set content\\. If you have populated the " +
-            "Activity with a ComposeView, make sure to call setContent on that ComposeView " +
-            "instead of on the test rule; and make sure that that call to `setContent \\{\\}` " +
-            "is done after the ComposeTestRule has run"
+        const val ContentAlreadySetError =
+            "androidx\\.compose\\.ui\\.test\\.junit4\\." +
+                "CustomActivity@[0-9A-Fa-f]* has already set content\\. If you have populated the " +
+                "Activity with a ComposeView, make sure to call setContent on that ComposeView " +
+                "instead of on the test rule; and make sure that that call to `setContent \\{\\}` " +
+                "is done after the ComposeTestRule has run"
     }
 
     @Test
-    fun launchCustomActivity() = runAndroidComposeUiTest<CustomActivity> {
-        onNodeWithText("Hello").assertExists()
-    }
+    fun launchCustomActivity() =
+        runAndroidComposeUiTest<CustomActivity> { onNodeWithText("Hello").assertExists() }
 
     @Test
-    fun setContentOnActivityWithContent() = runAndroidComposeUiTest<CustomActivity> {
-        expectError<IllegalStateException>(expectedMessage = ContentAlreadySetError) {
-            setContent { Text("Hello") }
+    fun setContentOnActivityWithContent() =
+        runAndroidComposeUiTest<CustomActivity> {
+            expectError<IllegalStateException>(expectedMessage = ContentAlreadySetError) {
+                setContent { Text("Hello") }
+            }
         }
-    }
 }
diff --git a/compose/ui/ui-test/src/androidInstrumentedTest/kotlin/androidx/compose/ui/test/junit4/EspressoLinkTest.kt b/compose/ui/ui-test/src/androidInstrumentedTest/kotlin/androidx/compose/ui/test/junit4/EspressoLinkTest.kt
index 15fb33b..ef51833 100644
--- a/compose/ui/ui-test/src/androidInstrumentedTest/kotlin/androidx/compose/ui/test/junit4/EspressoLinkTest.kt
+++ b/compose/ui/ui-test/src/androidInstrumentedTest/kotlin/androidx/compose/ui/test/junit4/EspressoLinkTest.kt
@@ -30,9 +30,8 @@
 
 class EspressoLinkTest {
     @OptIn(InternalTestApi::class, ExperimentalCoroutinesApi::class)
-    private val espressoLink = EspressoLink(
-        IdlingResourceRegistry(TestScope(UnconfinedTestDispatcher()))
-    )
+    private val espressoLink =
+        EspressoLink(IdlingResourceRegistry(TestScope(UnconfinedTestDispatcher())))
 
     @After
     fun tearDown() {
@@ -46,8 +45,8 @@
     /**
      * Tests that EspressoLink registers and unregisters itself synchronously to both the public
      * registry (IdlingRegistry) and the private registry (IdlingResourceRegistry). When the
-     * unregistration doesn't unregister itself synchronously anymore, we might have a memory
-     * leak (see b/202190483).
+     * unregistration doesn't unregister itself synchronously anymore, we might have a memory leak
+     * (see b/202190483).
      *
      * Also see b/205550018 for context.
      */
diff --git a/compose/ui/ui-test/src/androidInstrumentedTest/kotlin/androidx/compose/ui/test/junit4/FirstDrawTest.kt b/compose/ui/ui-test/src/androidInstrumentedTest/kotlin/androidx/compose/ui/test/junit4/FirstDrawTest.kt
index a683209..130b5c7 100644
--- a/compose/ui/ui-test/src/androidInstrumentedTest/kotlin/androidx/compose/ui/test/junit4/FirstDrawTest.kt
+++ b/compose/ui/ui-test/src/androidInstrumentedTest/kotlin/androidx/compose/ui/test/junit4/FirstDrawTest.kt
@@ -38,63 +38,69 @@
 class FirstDrawTest {
 
     /**
-     * Tests that the compose tree has been drawn at least once when
-     * [ComposeUiTest.setContent] finishes.
+     * Tests that the compose tree has been drawn at least once when [ComposeUiTest.setContent]
+     * finishes.
      */
     @LargeTest
     @Test
     fun waitsForFirstDraw_withoutOnIdle() = runComposeUiTest {
         var drawn = false
-        setContent {
-            Canvas(Modifier.fillMaxSize()) {
-                drawn = true
-            }
-        }
+        setContent { Canvas(Modifier.fillMaxSize()) { drawn = true } }
         // waitForIdle() shouldn't be necessary
         assertThat(drawn).isTrue()
     }
 
     /**
-     * Tests that [ComposeUiTest.waitForIdle] doesn't timeout when the compose tree is
-     * completely off-screen and will hence not be drawn.
+     * Tests that [ComposeUiTest.waitForIdle] doesn't timeout when the compose tree is completely
+     * off-screen and will hence not be drawn.
      */
     @Test
-    fun waitsForOutOfBoundsComposeView() = runAndroidComposeUiTest<ComponentActivity> {
-        var drawn = false
+    fun waitsForOutOfBoundsComposeView() =
+        runAndroidComposeUiTest<ComponentActivity> {
+            var drawn = false
 
-        runOnUiThread {
-            // Set the compose content in a FrameLayout that is completely placed out of the
-            // screen, and set clipToPadding to make sure the content won't be drawn.
+            runOnUiThread {
+                // Set the compose content in a FrameLayout that is completely placed out of the
+                // screen, and set clipToPadding to make sure the content won't be drawn.
 
-            val root = object : FrameLayout(activity!!) {
-                override fun onLayout(changed: Boolean, l: Int, t: Int, r: Int, b: Int) {
-                    // Place our child out of bounds
-                    getChildAt(0).layout(-200, 0, -100, 100)
-                }
-            }.apply {
-                // Enforce clipping:
-                setPadding(1, 1, 1, 1)
-                clipToPadding = true
-            }
+                val root =
+                    object : FrameLayout(activity!!) {
+                            override fun onLayout(
+                                changed: Boolean,
+                                l: Int,
+                                t: Int,
+                                r: Int,
+                                b: Int
+                            ) {
+                                // Place our child out of bounds
+                                getChildAt(0).layout(-200, 0, -100, 100)
+                            }
+                        }
+                        .apply {
+                            // Enforce clipping:
+                            setPadding(1, 1, 1, 1)
+                            clipToPadding = true
+                        }
 
-            val outOfBoundsView = ComposeView(activity!!).apply {
-                layoutParams = ViewGroup.MarginLayoutParams(100, 100)
-            }
+                val outOfBoundsView =
+                    ComposeView(activity!!).apply {
+                        layoutParams = ViewGroup.MarginLayoutParams(100, 100)
+                    }
 
-            root.addView(outOfBoundsView)
-            activity!!.setContentView(root)
-            outOfBoundsView.setContent {
-                // If you see this box when running the test, the test is setup incorrectly
-                Canvas(Modifier.fillMaxSize()) {
-                    drawRect(Color.Yellow)
-                    drawn = true
+                root.addView(outOfBoundsView)
+                activity!!.setContentView(root)
+                outOfBoundsView.setContent {
+                    // If you see this box when running the test, the test is setup incorrectly
+                    Canvas(Modifier.fillMaxSize()) {
+                        drawRect(Color.Yellow)
+                        drawn = true
+                    }
                 }
             }
+
+            // onIdle shouldn't timeout
+            waitForIdle()
+            // The compose view was off-screen, so it hasn't drawn yet
+            assertThat(drawn).isFalse()
         }
-
-        // onIdle shouldn't timeout
-        waitForIdle()
-        // The compose view was off-screen, so it hasn't drawn yet
-        assertThat(drawn).isFalse()
-    }
 }
diff --git a/compose/ui/ui-test/src/androidInstrumentedTest/kotlin/androidx/compose/ui/test/junit4/IdlingResourceRegistryTest.kt b/compose/ui/ui-test/src/androidInstrumentedTest/kotlin/androidx/compose/ui/test/junit4/IdlingResourceRegistryTest.kt
index 9d4133e..b18471f 100644
--- a/compose/ui/ui-test/src/androidInstrumentedTest/kotlin/androidx/compose/ui/test/junit4/IdlingResourceRegistryTest.kt
+++ b/compose/ui/ui-test/src/androidInstrumentedTest/kotlin/androidx/compose/ui/test/junit4/IdlingResourceRegistryTest.kt
@@ -46,9 +46,8 @@
     @OptIn(ExperimentalCoroutinesApi::class)
     private val scope = TestScope(UnconfinedTestDispatcher())
     @OptIn(InternalTestApi::class)
-    private val registry = IdlingResourceRegistry(scope).apply {
-        setOnIdleCallback { onIdleCalled = true }
-    }
+    private val registry =
+        IdlingResourceRegistry(scope).apply { setOnIdleCallback { onIdleCalled = true } }
 
     @After
     fun verifyRegistryStoppedPolling() {
@@ -73,16 +72,12 @@
         resource.isIdleNow = false
         assertThat(registry.isIdleNow).isFalse()
 
-        assertThatPollingStartsAndEnds {
-            resource.isIdleNow = true
-        }
+        assertThatPollingStartsAndEnds { resource.isIdleNow = true }
 
         resource.isIdleNow = false
         assertThat(registry.isIdleNow).isFalse()
 
-        assertThatPollingStartsAndEnds {
-            resource.isIdleNow = true
-        }
+        assertThatPollingStartsAndEnds { resource.isIdleNow = true }
     }
 
     @Test
@@ -153,9 +148,7 @@
         val resource = TestIdlingResource(false)
         registry.registerIdlingResource(resource)
 
-        assertThatPollingStartsAndEnds {
-            resource.isIdleNow = true
-        }
+        assertThatPollingStartsAndEnds { resource.isIdleNow = true }
     }
 
     private fun assertThatPollingStartsAndEnds(makeIdle: () -> Unit) {
diff --git a/compose/ui/ui-test/src/androidInstrumentedTest/kotlin/androidx/compose/ui/test/junit4/LateActivityLaunchTest.kt b/compose/ui/ui-test/src/androidInstrumentedTest/kotlin/androidx/compose/ui/test/junit4/LateActivityLaunchTest.kt
index b4fe7d8..e6a963f 100644
--- a/compose/ui/ui-test/src/androidInstrumentedTest/kotlin/androidx/compose/ui/test/junit4/LateActivityLaunchTest.kt
+++ b/compose/ui/ui-test/src/androidInstrumentedTest/kotlin/androidx/compose/ui/test/junit4/LateActivityLaunchTest.kt
@@ -34,9 +34,8 @@
     @Test
     fun test() = runEmptyComposeUiTest {
         ActivityScenario.launch<CustomActivity>(
-            Intent(ApplicationProvider.getApplicationContext(), CustomActivity::class.java)
-        ).use {
-            onNode(hasText("Hello")).assertExists()
-        }
+                Intent(ApplicationProvider.getApplicationContext(), CustomActivity::class.java)
+            )
+            .use { onNode(hasText("Hello")).assertExists() }
     }
 }
diff --git a/compose/ui/ui-test/src/androidInstrumentedTest/kotlin/androidx/compose/ui/test/junit4/LateSetContentTest.kt b/compose/ui/ui-test/src/androidInstrumentedTest/kotlin/androidx/compose/ui/test/junit4/LateSetContentTest.kt
index 461e776..0bfeac1 100644
--- a/compose/ui/ui-test/src/androidInstrumentedTest/kotlin/androidx/compose/ui/test/junit4/LateSetContentTest.kt
+++ b/compose/ui/ui-test/src/androidInstrumentedTest/kotlin/androidx/compose/ui/test/junit4/LateSetContentTest.kt
@@ -32,21 +32,14 @@
 @OptIn(ExperimentalTestApi::class)
 class LateSetContentTest {
 
-    @Test
-    fun test() = runAndroidComposeUiTest<Activity> {
-        onNodeWithTag("Node").assertExists()
-    }
+    @Test fun test() = runAndroidComposeUiTest<Activity> { onNodeWithTag("Node").assertExists() }
 
     class Activity : ComponentActivity() {
         private val handler = Handler(Looper.getMainLooper())
+
         override fun onCreate(savedInstanceState: Bundle?) {
             super.onCreate(savedInstanceState)
-            handler.postDelayed(
-                {
-                    setContent { BoundaryNode("Node") }
-                },
-                500
-            )
+            handler.postDelayed({ setContent { BoundaryNode("Node") } }, 500)
         }
     }
 }
diff --git a/compose/ui/ui-test/src/androidInstrumentedTest/kotlin/androidx/compose/ui/test/junit4/LaunchActivityTooEarlyTest.kt b/compose/ui/ui-test/src/androidInstrumentedTest/kotlin/androidx/compose/ui/test/junit4/LaunchActivityTooEarlyTest.kt
index 5bb16ab..38c8a28 100644
--- a/compose/ui/ui-test/src/androidInstrumentedTest/kotlin/androidx/compose/ui/test/junit4/LaunchActivityTooEarlyTest.kt
+++ b/compose/ui/ui-test/src/androidInstrumentedTest/kotlin/androidx/compose/ui/test/junit4/LaunchActivityTooEarlyTest.kt
@@ -37,8 +37,9 @@
         @OptIn(ExperimentalTestApi::class)
         runEmptyComposeUiTest {
             expectError<IllegalStateException>(
-                expectedMessage = "No compose hierarchies found in the app\\. Possible reasons " +
-                    "include:.*\\bsetContent was called before the ComposeTestRule ran\\..*"
+                expectedMessage =
+                    "No compose hierarchies found in the app\\. Possible reasons " +
+                        "include:.*\\bsetContent was called before the ComposeTestRule ran\\..*"
             ) {
                 onNodeWithText("Hello").assertExists()
             }
diff --git a/compose/ui/ui-test/src/androidInstrumentedTest/kotlin/androidx/compose/ui/test/junit4/MultipleActivitiesClickTest.kt b/compose/ui/ui-test/src/androidInstrumentedTest/kotlin/androidx/compose/ui/test/junit4/MultipleActivitiesClickTest.kt
index bbe7e65e..819d690 100644
--- a/compose/ui/ui-test/src/androidInstrumentedTest/kotlin/androidx/compose/ui/test/junit4/MultipleActivitiesClickTest.kt
+++ b/compose/ui/ui-test/src/androidInstrumentedTest/kotlin/androidx/compose/ui/test/junit4/MultipleActivitiesClickTest.kt
@@ -42,23 +42,22 @@
 class MultipleActivitiesClickTest {
 
     @Test
-    fun test() = runAndroidComposeUiTest<Activity1> {
-        val activity1 = activity!!
+    fun test() =
+        runAndroidComposeUiTest<Activity1> {
+            val activity1 = activity!!
 
-        activity1.startNewActivity()
-        waitUntil {
-            onAllNodesWithTag("activity2").isNotEmpty()
+            activity1.startNewActivity()
+            waitUntil { onAllNodesWithTag("activity2").isNotEmpty() }
+
+            onNodeWithTag("activity2").performTouchInput { click() }
+            val activity2 = getCurrentActivity() as Activity2
+
+            runOnIdle {
+                assertThat(activity1.clickCounter).isEqualTo(0)
+                assertThat(activity2.clickCounter).isEqualTo(1)
+            }
         }
 
-        onNodeWithTag("activity2").performTouchInput { click() }
-        val activity2 = getCurrentActivity() as Activity2
-
-        runOnIdle {
-            assertThat(activity1.clickCounter).isEqualTo(0)
-            assertThat(activity2.clickCounter).isEqualTo(1)
-        }
-    }
-
     private fun SemanticsNodeInteractionCollection.isNotEmpty(): Boolean {
         return fetchSemanticsNodes(atLeastOneRootRequired = false).isNotEmpty()
     }
@@ -69,13 +68,16 @@
     private fun ComposeUiTest.getCurrentActivity(): Activity {
         var currentActivity: Activity? = null
         runOnUiThread {
-            currentActivity = ActivityLifecycleMonitorRegistry.getInstance()
-                .getActivitiesInStage(Stage.RESUMED).first()
+            currentActivity =
+                ActivityLifecycleMonitorRegistry.getInstance()
+                    .getActivitiesInStage(Stage.RESUMED)
+                    .first()
         }
         return currentActivity!!
     }
 
     class Activity1 : ClickRecordingActivity("activity1")
+
     class Activity2 : ClickRecordingActivity("activity2")
 
     open class ClickRecordingActivity(private val tag: String) : ComponentActivity() {
diff --git a/compose/ui/ui-test/src/androidInstrumentedTest/kotlin/androidx/compose/ui/test/junit4/MultipleActivitiesFindTest.kt b/compose/ui/ui-test/src/androidInstrumentedTest/kotlin/androidx/compose/ui/test/junit4/MultipleActivitiesFindTest.kt
index 127ad8c..7974635 100644
--- a/compose/ui/ui-test/src/androidInstrumentedTest/kotlin/androidx/compose/ui/test/junit4/MultipleActivitiesFindTest.kt
+++ b/compose/ui/ui-test/src/androidInstrumentedTest/kotlin/androidx/compose/ui/test/junit4/MultipleActivitiesFindTest.kt
@@ -34,29 +34,27 @@
 class MultipleActivitiesFindTest {
 
     @Test
-    fun test() = runAndroidComposeUiTest<Activity1> {
-        activity!!.startNewActivity()
-        waitUntil {
-            onAllNodesWithTag("activity2").isNotEmpty()
-        }
+    fun test() =
+        runAndroidComposeUiTest<Activity1> {
+            activity!!.startNewActivity()
+            waitUntil { onAllNodesWithTag("activity2").isNotEmpty() }
 
-        onNodeWithTag("activity1").assertDoesNotExist()
-        onNodeWithTag("activity2").assertExists()
-    }
+            onNodeWithTag("activity1").assertDoesNotExist()
+            onNodeWithTag("activity2").assertExists()
+        }
 
     private fun SemanticsNodeInteractionCollection.isNotEmpty(): Boolean {
         return fetchSemanticsNodes(atLeastOneRootRequired = false).isNotEmpty()
     }
 
     class Activity1 : TaggedActivity("activity1")
+
     class Activity2 : TaggedActivity("activity2")
 
     open class TaggedActivity(private val tag: String) : ComponentActivity() {
         override fun onCreate(savedInstanceState: Bundle?) {
             super.onCreate(savedInstanceState)
-            setContent {
-                Box(Modifier.testTag(tag))
-            }
+            setContent { Box(Modifier.testTag(tag)) }
         }
 
         fun startNewActivity() {
diff --git a/compose/ui/ui-test/src/androidInstrumentedTest/kotlin/androidx/compose/ui/test/junit4/MultipleActivitiesFirstDrawTest.kt b/compose/ui/ui-test/src/androidInstrumentedTest/kotlin/androidx/compose/ui/test/junit4/MultipleActivitiesFirstDrawTest.kt
index f02aaf7..583bef7 100644
--- a/compose/ui/ui-test/src/androidInstrumentedTest/kotlin/androidx/compose/ui/test/junit4/MultipleActivitiesFirstDrawTest.kt
+++ b/compose/ui/ui-test/src/androidInstrumentedTest/kotlin/androidx/compose/ui/test/junit4/MultipleActivitiesFirstDrawTest.kt
@@ -33,10 +33,11 @@
 class MultipleActivitiesFirstDrawTest {
 
     @Test
-    fun test() = runAndroidComposeUiTest<Activity1> {
-        Espresso.onIdle()
-        // doesn't timeout
-    }
+    fun test() =
+        runAndroidComposeUiTest<Activity1> {
+            Espresso.onIdle()
+            // doesn't timeout
+        }
 
     class Activity1 : ComponentActivity() {
         override fun onCreate(savedInstanceState: Bundle?) {
diff --git a/compose/ui/ui-test/src/androidInstrumentedTest/kotlin/androidx/compose/ui/test/junit4/MultipleActivitiesWithoutComposeTest.kt b/compose/ui/ui-test/src/androidInstrumentedTest/kotlin/androidx/compose/ui/test/junit4/MultipleActivitiesWithoutComposeTest.kt
index c51599a..3906690 100644
--- a/compose/ui/ui-test/src/androidInstrumentedTest/kotlin/androidx/compose/ui/test/junit4/MultipleActivitiesWithoutComposeTest.kt
+++ b/compose/ui/ui-test/src/androidInstrumentedTest/kotlin/androidx/compose/ui/test/junit4/MultipleActivitiesWithoutComposeTest.kt
@@ -43,14 +43,14 @@
 import org.junit.Test
 
 /**
- * This test shows how you can test an application where the Activity that is launched from the
- * test does not contain any Compose content, but an Activity to which the test eventually
- * navigates does contain Compose content.
+ * This test shows how you can test an application where the Activity that is launched from the test
+ * does not contain any Compose content, but an Activity to which the test eventually navigates does
+ * contain Compose content.
  *
- * In the test, Activity1 is launched, which contains an android.widget.Button.
- * When clicked, Activity2 is launched, which contains another android.widget.Button.
- * When that button is clicked, Activity3 is launched, which contains Compose content.
- * The Compose content is finally asserted to exist.
+ * In the test, Activity1 is launched, which contains an android.widget.Button. When clicked,
+ * Activity2 is launched, which contains another android.widget.Button. When that button is clicked,
+ * Activity3 is launched, which contains Compose content. The Compose content is finally asserted to
+ * exist.
  */
 @OptIn(ExperimentalTestApi::class)
 class MultipleActivitiesWithoutComposeTest {
@@ -58,8 +58,7 @@
     // Because Activity1 does not use Compose, we do not have to guarantee that the
     // ComposeTestRule performs setup before the ActivityScenarioRule, so we can just define the
     // scenario rule as a sibling rule.
-    @get:Rule
-    val activityScenarioRule = ActivityScenarioRule(Activity1::class.java)
+    @get:Rule val activityScenarioRule = ActivityScenarioRule(Activity1::class.java)
 
     @Test
     fun test() = runEmptyComposeUiTest {
@@ -97,9 +96,7 @@
     class Activity3 : ComponentActivity() {
         override fun onCreate(savedInstanceState: Bundle?) {
             super.onCreate(savedInstanceState)
-            setContent {
-                Box(Modifier.testTag("compose-box"))
-            }
+            setContent { Box(Modifier.testTag("compose-box")) }
         }
     }
 }
diff --git a/compose/ui/ui-test/src/androidInstrumentedTest/kotlin/androidx/compose/ui/test/junit4/MultipleComposeRootsTest.kt b/compose/ui/ui-test/src/androidInstrumentedTest/kotlin/androidx/compose/ui/test/junit4/MultipleComposeRootsTest.kt
index 8e6152e..aa7c889 100644
--- a/compose/ui/ui-test/src/androidInstrumentedTest/kotlin/androidx/compose/ui/test/junit4/MultipleComposeRootsTest.kt
+++ b/compose/ui/ui-test/src/androidInstrumentedTest/kotlin/androidx/compose/ui/test/junit4/MultipleComposeRootsTest.kt
@@ -63,10 +63,8 @@
     /**
      * In this setup we have the following configuration:
      *
-     * Title 1            < Android TextView
-     * [ ] Checkbox 1     < Compose root
-     * Title 2            < Android TextView
-     * [ ] Checkbox 2     < Compose root
+     * Title 1 < Android TextView [ ] Checkbox 1 < Compose root Title 2 < Android TextView [ ]
+     * Checkbox 2 < Compose root
      *
      * Both checkboxes and titles share the same data model. However the titles are regular Android
      * Text Views updated imperatively via listeners on the checkboxes. This test seamlessly
@@ -74,91 +72,86 @@
      * testing APIs.
      */
     @Test
-    fun twoHierarchiesSharingTheSameModel() = runAndroidComposeUiTest<ComponentActivity> {
-        runOnUiThread {
-            val activity = activity!!
-            val state1 = mutableStateOf(value = ToggleableState.Off)
-            val state2 = mutableStateOf(value = ToggleableState.On)
+    fun twoHierarchiesSharingTheSameModel() =
+        runAndroidComposeUiTest<ComponentActivity> {
+            runOnUiThread {
+                val activity = activity!!
+                val state1 = mutableStateOf(value = ToggleableState.Off)
+                val state2 = mutableStateOf(value = ToggleableState.On)
 
-            val linearLayout = LinearLayout(activity)
-                .apply { orientation = LinearLayout.VERTICAL }
+                val linearLayout =
+                    LinearLayout(activity).apply { orientation = LinearLayout.VERTICAL }
 
-            val textView1 = TextView(activity).apply { text = "Compose 1" }
-            val composeView1 = ComposeView(activity)
+                val textView1 = TextView(activity).apply { text = "Compose 1" }
+                val composeView1 = ComposeView(activity)
 
-            val textView2 = TextView(activity).apply { text = "Compose 2" }
-            val composeView2 = ComposeView(activity)
+                val textView2 = TextView(activity).apply { text = "Compose 2" }
+                val composeView2 = ComposeView(activity)
 
-            activity.setContentView(linearLayout)
-            linearLayout.addView(textView1)
-            linearLayout.addView(composeView1)
-            linearLayout.addView(textView2)
-            linearLayout.addView(composeView2)
+                activity.setContentView(linearLayout)
+                linearLayout.addView(textView1)
+                linearLayout.addView(composeView1)
+                linearLayout.addView(textView2)
+                linearLayout.addView(composeView2)
 
-            fun updateTitle1() {
-                textView1.text = "Compose 1 - ${state1.value}"
-            }
+                fun updateTitle1() {
+                    textView1.text = "Compose 1 - ${state1.value}"
+                }
 
-            fun updateTitle2() {
-                textView2.text = "Compose 2 - ${state2.value}"
-            }
+                fun updateTitle2() {
+                    textView2.text = "Compose 2 - ${state2.value}"
+                }
 
-            composeView1.setContent {
-                MaterialTheme {
-                    Surface {
-                        TriStateCheckbox(
-                            modifier = Modifier.testTag("checkbox1"),
-                            state = state1.value,
-                            onClick = {
-                                state1.toggle()
-                                state2.toggle()
-                                updateTitle1()
-                                updateTitle2()
-                            }
-                        )
+                composeView1.setContent {
+                    MaterialTheme {
+                        Surface {
+                            TriStateCheckbox(
+                                modifier = Modifier.testTag("checkbox1"),
+                                state = state1.value,
+                                onClick = {
+                                    state1.toggle()
+                                    state2.toggle()
+                                    updateTitle1()
+                                    updateTitle2()
+                                }
+                            )
+                        }
+                    }
+                }
+
+                composeView2.setContent {
+                    MaterialTheme {
+                        Surface {
+                            TriStateCheckbox(
+                                modifier = Modifier.testTag("checkbox2"),
+                                state = state2.value,
+                                onClick = {
+                                    state1.toggle()
+                                    state2.toggle()
+                                    updateTitle1()
+                                    updateTitle2()
+                                }
+                            )
+                        }
                     }
                 }
             }
 
-            composeView2.setContent {
-                MaterialTheme {
-                    Surface {
-                        TriStateCheckbox(
-                            modifier = Modifier.testTag("checkbox2"),
-                            state = state2.value,
-                            onClick = {
-                                state1.toggle()
-                                state2.toggle()
-                                updateTitle1()
-                                updateTitle2()
-                            }
-                        )
-                    }
-                }
-            }
+            Espresso.onView(withText("Compose 1")).check(matches(isDisplayed()))
+            Espresso.onView(withText("Compose 2")).check(matches(isDisplayed()))
+
+            onNodeWithTag("checkbox1").performClick().assertIsOn()
+
+            onNodeWithTag("checkbox2").assertIsOff()
+
+            Espresso.onView(withText("Compose 1 - On")).check(matches(isDisplayed()))
+            Espresso.onView(withText("Compose 2 - Off")).check(matches(isDisplayed()))
+
+            onNodeWithTag("checkbox2").performClick().assertIsOn()
+
+            onNodeWithTag("checkbox1").assertIsOff()
+
+            Espresso.onView(withText("Compose 1 - Off")).check(matches(isDisplayed()))
+            Espresso.onView(withText("Compose 2 - On")).check(matches(isDisplayed()))
         }
-
-        Espresso.onView(withText("Compose 1")).check(matches(isDisplayed()))
-        Espresso.onView(withText("Compose 2")).check(matches(isDisplayed()))
-
-        onNodeWithTag("checkbox1")
-            .performClick()
-            .assertIsOn()
-
-        onNodeWithTag("checkbox2")
-            .assertIsOff()
-
-        Espresso.onView(withText("Compose 1 - On")).check(matches(isDisplayed()))
-        Espresso.onView(withText("Compose 2 - Off")).check(matches(isDisplayed()))
-
-        onNodeWithTag("checkbox2")
-            .performClick()
-            .assertIsOn()
-
-        onNodeWithTag("checkbox1")
-            .assertIsOff()
-
-        Espresso.onView(withText("Compose 1 - Off")).check(matches(isDisplayed()))
-        Espresso.onView(withText("Compose 2 - On")).check(matches(isDisplayed()))
-    }
 }
diff --git a/compose/ui/ui-test/src/androidInstrumentedTest/kotlin/androidx/compose/ui/test/junit4/SynchronizationMethodsTest.kt b/compose/ui/ui-test/src/androidInstrumentedTest/kotlin/androidx/compose/ui/test/junit4/SynchronizationMethodsTest.kt
index ca74cd1..b4080bd 100644
--- a/compose/ui/ui-test/src/androidInstrumentedTest/kotlin/androidx/compose/ui/test/junit4/SynchronizationMethodsTest.kt
+++ b/compose/ui/ui-test/src/androidInstrumentedTest/kotlin/androidx/compose/ui/test/junit4/SynchronizationMethodsTest.kt
@@ -40,9 +40,10 @@
 @OptIn(ExperimentalTestApi::class)
 class SynchronizationMethodsTest {
 
-    private val environment = AndroidComposeUiTestEnvironment<ComponentActivity> {
-        throw NotImplementedError("This test shouldn't use the Activity")
-    }
+    private val environment =
+        AndroidComposeUiTestEnvironment<ComponentActivity> {
+            throw NotImplementedError("This test shouldn't use the Activity")
+        }
     private val composeRootRegistry = environment.composeRootRegistry
     private val test = environment.test
 
@@ -50,9 +51,7 @@
     val registryRule: TestRule = TestRule { base, _ ->
         object : Statement() {
             override fun evaluate() {
-                composeRootRegistry.withRegistry {
-                    base.evaluate()
-                }
+                composeRootRegistry.withRegistry { base.evaluate() }
             }
         }
     }
@@ -111,20 +110,12 @@
 
     @Test
     fun runOnIdle_waitForIdle_fails() {
-        test.runOnIdle {
-            expectError<IllegalStateException> {
-                test.waitForIdle()
-            }
-        }
+        test.runOnIdle { expectError<IllegalStateException> { test.waitForIdle() } }
     }
 
     @Test
     fun runOnIdle_runOnIdle_fails() {
-        test.runOnIdle {
-            expectError<IllegalStateException> {
-                test.runOnIdle {}
-            }
-        }
+        test.runOnIdle { expectError<IllegalStateException> { test.runOnIdle {} } }
     }
 
     private fun mockResumedComposeRoot(): ViewRootForTest {
diff --git a/compose/ui/ui-test/src/androidInstrumentedTest/kotlin/androidx/compose/ui/test/junit4/TimeOutTest.kt b/compose/ui/ui-test/src/androidInstrumentedTest/kotlin/androidx/compose/ui/test/junit4/TimeOutTest.kt
index 46788f9..b51df06 100644
--- a/compose/ui/ui-test/src/androidInstrumentedTest/kotlin/androidx/compose/ui/test/junit4/TimeOutTest.kt
+++ b/compose/ui/ui-test/src/androidInstrumentedTest/kotlin/androidx/compose/ui/test/junit4/TimeOutTest.kt
@@ -65,10 +65,12 @@
     fun restoreTimeOutPolicies() {
         IdlingRegistry.getInstance().unregister(InfiniteResource)
         IdlingPolicies.setIdlingResourceTimeout(
-            idlingResourcePolicy!!.idleTimeout, idlingResourcePolicy!!.idleTimeoutUnit
+            idlingResourcePolicy!!.idleTimeout,
+            idlingResourcePolicy!!.idleTimeoutUnit
         )
         IdlingPolicies.setMasterPolicyTimeout(
-            masterPolicy!!.idleTimeout, masterPolicy!!.idleTimeoutUnit
+            masterPolicy!!.idleTimeout,
+            masterPolicy!!.idleTimeoutUnit
         )
     }
 
@@ -77,9 +79,7 @@
         Box {
             val infiniteCounter = remember { mutableStateOf(0) }
             Text("Hello ${infiniteCounter.value}")
-            SideEffect {
-                infiniteCounter.value += 1
-            }
+            SideEffect { infiniteCounter.value += 1 }
         }
     }
 
@@ -88,9 +88,7 @@
         IdlingPolicies.setIdlingResourceTimeout(300, TimeUnit.MILLISECONDS)
 
         expectError<ComposeNotIdleException>(expectedMessage = idlingResourceTimeOut) {
-            setContent {
-                InfiniteRecompositionCase()
-            }
+            setContent { InfiniteRecompositionCase() }
         }
     }
 
@@ -99,9 +97,7 @@
         IdlingPolicies.setMasterPolicyTimeout(300, TimeUnit.MILLISECONDS)
 
         expectError<ComposeNotIdleException>(expectedMessage = globalTimeOut) {
-            setContent {
-                InfiniteRecompositionCase()
-            }
+            setContent { InfiniteRecompositionCase() }
         }
     }
 
@@ -135,9 +131,7 @@
         IdlingPolicies.setMasterPolicyTimeout(300, TimeUnit.MILLISECONDS)
         IdlingRegistry.getInstance().register(InfiniteResource)
 
-        expectError<AppNotIdleException> {
-            setContent { }
-        }
+        expectError<AppNotIdleException> { setContent {} }
     }
 
     @Test(timeout = 10_000)
@@ -146,6 +140,7 @@
         registerIdlingResource(
             object : androidx.compose.ui.test.IdlingResource {
                 override val isIdleNow: Boolean = false
+
                 override fun getDiagnosticMessageIfBusy(): String {
                     return "Never IDLE"
                 }
@@ -161,8 +156,8 @@
 
     /**
      * This test is here to guarantee that even if we crash on infinite recompositions during
-     * setContent, the composition is disposed and won't keep running in the background.
-     * This verifies that our tests run in isolation.
+     * setContent, the composition is disposed and won't keep running in the background. This
+     * verifies that our tests run in isolation.
      */
     @Test(timeout = 10_000)
     fun timeout_testIsolation_check() {
@@ -170,18 +165,12 @@
 
         // Test 1: set an infinite composition and expect it to crash
         expectError<ComposeNotIdleException> {
-            runComposeUiTest {
-                setContent {
-                    InfiniteRecompositionCase()
-                }
-            }
+            runComposeUiTest { setContent { InfiniteRecompositionCase() } }
         }
 
         // Test 2: normal composition, should not time out
         runComposeUiTest {
-            setContent {
-                Text("Hello")
-            }
+            setContent { Text("Hello") }
             // No timeout should happen this time
             onNodeWithText("Hello").assertExists()
         }
diff --git a/compose/ui/ui-test/src/androidInstrumentedTest/kotlin/androidx/compose/ui/test/junit4/UncaughtExceptionsInCoroutinesTest.kt b/compose/ui/ui-test/src/androidInstrumentedTest/kotlin/androidx/compose/ui/test/junit4/UncaughtExceptionsInCoroutinesTest.kt
index 06bfcda..f94b273 100644
--- a/compose/ui/ui-test/src/androidInstrumentedTest/kotlin/androidx/compose/ui/test/junit4/UncaughtExceptionsInCoroutinesTest.kt
+++ b/compose/ui/ui-test/src/androidInstrumentedTest/kotlin/androidx/compose/ui/test/junit4/UncaughtExceptionsInCoroutinesTest.kt
@@ -40,19 +40,9 @@
     // - Results have 2 failed tests:
     //   exception handler is installed correctly, but verifying thrown error is wrong
 
-    @Test
-    fun test1() = runComposeUiTest {
-        expectError<TestException> {
-            throwInLaunchedEffect()
-        }
-    }
+    @Test fun test1() = runComposeUiTest { expectError<TestException> { throwInLaunchedEffect() } }
 
-    @Test
-    fun test2() = runComposeUiTest {
-        expectError<TestException> {
-            throwInLaunchedEffect()
-        }
-    }
+    @Test fun test2() = runComposeUiTest { expectError<TestException> { throwInLaunchedEffect() } }
 
     private fun ComposeUiTest.throwInLaunchedEffect() {
         setContent {
diff --git a/compose/ui/ui-test/src/androidInstrumentedTest/kotlin/androidx/compose/ui/test/junit4/ViewVisibilityTest.kt b/compose/ui/ui-test/src/androidInstrumentedTest/kotlin/androidx/compose/ui/test/junit4/ViewVisibilityTest.kt
index 0f227a7..38d33a0 100644
--- a/compose/ui/ui-test/src/androidInstrumentedTest/kotlin/androidx/compose/ui/test/junit4/ViewVisibilityTest.kt
+++ b/compose/ui/ui-test/src/androidInstrumentedTest/kotlin/androidx/compose/ui/test/junit4/ViewVisibilityTest.kt
@@ -54,11 +54,7 @@
     companion object {
         @JvmStatic
         @Parameters(name = "visibility={0}")
-        fun params() = listOf(
-            View.VISIBLE,
-            View.INVISIBLE,
-            View.GONE
-        )
+        fun params() = listOf(View.VISIBLE, View.INVISIBLE, View.GONE)
     }
 
     private var offset by mutableStateOf(0)
@@ -72,9 +68,7 @@
         runComposeUiTest {
             setContent {
                 val hostView = LocalView.current
-                SideEffect {
-                    hostView.visibility = visibility
-                }
+                SideEffect { hostView.visibility = visibility }
                 TestContent()
             }
 
@@ -93,9 +87,7 @@
                 val composeView = ComposeView(activity)
                 composeView.layoutParams = ViewGroup.LayoutParams(MATCH_PARENT, MATCH_PARENT)
                 composeView.visibility = visibility
-                composeView.setContent {
-                    TestContent()
-                }
+                composeView.setContent { TestContent() }
                 activity.setContentView(composeView)
             }
 
@@ -112,13 +104,11 @@
         // not measure. Because measure is not affected, the containing View doesn't need to be
         // remeasured and Compose will do its measure/layout pass in the draw pass, meaning the
         // View will be invalidated but no layout will be requested.
-        Layout({
-            Box(Modifier.size(10.dp))
-        }, Modifier.fillMaxSize().testTag("box")) { measurables, constraints ->
+        Layout({ Box(Modifier.size(10.dp)) }, Modifier.fillMaxSize().testTag("box")) {
+            measurables,
+            constraints ->
             val placeable = measurables.first().measure(constraints)
-            layout(constraints.maxWidth, constraints.maxHeight) {
-                placeable.place(offset, 0)
-            }
+            layout(constraints.maxWidth, constraints.maxHeight) { placeable.place(offset, 0) }
         }
     }
 
diff --git a/compose/ui/ui-test/src/androidInstrumentedTest/kotlin/androidx/compose/ui/test/junit4/WaitUntilNodeCountTest.kt b/compose/ui/ui-test/src/androidInstrumentedTest/kotlin/androidx/compose/ui/test/junit4/WaitUntilNodeCountTest.kt
index bf923fd..f9c09ef 100644
--- a/compose/ui/ui-test/src/androidInstrumentedTest/kotlin/androidx/compose/ui/test/junit4/WaitUntilNodeCountTest.kt
+++ b/compose/ui/ui-test/src/androidInstrumentedTest/kotlin/androidx/compose/ui/test/junit4/WaitUntilNodeCountTest.kt
@@ -45,12 +45,7 @@
         private const val Timeout = 500L
     }
 
-    @Composable
-    private fun TaggedBox() = Box(
-        Modifier
-            .size(10.dp, 10.dp)
-            .testTag(TestTag)
-    )
+    @Composable private fun TaggedBox() = Box(Modifier.size(10.dp, 10.dp).testTag(TestTag))
 
     @Test
     fun waitUntilNodeCount_succeedsWhen_nodeCountCorrect() = runComposeUiTest {
@@ -72,8 +67,9 @@
         }
 
         expectError<ComposeTimeoutException>(
-            expectedMessage = "Condition \\(exactly 2 nodes match \\(TestTag = 'TestTag'\\)\\) " +
-                "still not satisfied after $Timeout ms"
+            expectedMessage =
+                "Condition \\(exactly 2 nodes match \\(TestTag = 'TestTag'\\)\\) " +
+                    "still not satisfied after $Timeout ms"
         ) {
             waitUntilNodeCount(hasTestTag(TestTag), 2, Timeout)
         }
@@ -91,13 +87,12 @@
 
     @Test
     fun waitUntilAtLeastOneExists_throwsWhen_nodesDoNotExist() = runComposeUiTest {
-        setContent {
-            Box(Modifier.size(10.dp))
-        }
+        setContent { Box(Modifier.size(10.dp)) }
 
         expectError<ComposeTimeoutException>(
-            expectedMessage = "Condition \\(at least one node matches " +
-                "\\(TestTag = 'TestTag'\\)\\) still not satisfied after $Timeout ms"
+            expectedMessage =
+                "Condition \\(at least one node matches " +
+                    "\\(TestTag = 'TestTag'\\)\\) still not satisfied after $Timeout ms"
         ) {
             waitUntilAtLeastOneExists(hasTestTag(TestTag), Timeout)
         }
@@ -105,9 +100,7 @@
 
     @Test
     fun waitUntilExactlyOneExists_succeedsWhen_oneNodeExists() = runComposeUiTest {
-        setContent {
-            TaggedBox()
-        }
+        setContent { TaggedBox() }
 
         waitUntilExactlyOneExists(hasTestTag(TestTag))
     }
@@ -120,8 +113,9 @@
         }
 
         expectError<ComposeTimeoutException>(
-            expectedMessage = "Condition \\(exactly 1 nodes match \\(TestTag = 'TestTag'\\)\\) " +
-                "still not satisfied after $Timeout ms"
+            expectedMessage =
+                "Condition \\(exactly 1 nodes match \\(TestTag = 'TestTag'\\)\\) " +
+                    "still not satisfied after $Timeout ms"
         ) {
             waitUntilExactlyOneExists(hasTestTag(TestTag), Timeout)
         }
@@ -129,22 +123,19 @@
 
     @Test
     fun waitUntilDoesNotExists_succeedsWhen_nodeDoesNotExist() = runComposeUiTest {
-        setContent {
-            Box(Modifier.size(10.dp))
-        }
+        setContent { Box(Modifier.size(10.dp)) }
 
         waitUntilDoesNotExist(hasTestTag(TestTag), timeoutMillis = Timeout)
     }
 
     @Test
     fun waitUntilDoesNotExists_throwsWhen_nodeExistsUntilTimeout() = runComposeUiTest {
-        setContent {
-            TaggedBox()
-        }
+        setContent { TaggedBox() }
 
         expectError<ComposeTimeoutException>(
-            expectedMessage = "Condition \\(exactly 0 nodes match \\(TestTag = 'TestTag'\\)\\) " +
-                "still not satisfied after $Timeout ms"
+            expectedMessage =
+                "Condition \\(exactly 0 nodes match \\(TestTag = 'TestTag'\\)\\) " +
+                    "still not satisfied after $Timeout ms"
         ) {
             waitUntilDoesNotExist(hasTestTag(TestTag), timeoutMillis = Timeout)
         }
diff --git a/compose/ui/ui-test/src/androidInstrumentedTest/kotlin/androidx/compose/ui/test/junit4/WaitingForOnCommitCallbackTest.kt b/compose/ui/ui-test/src/androidInstrumentedTest/kotlin/androidx/compose/ui/test/junit4/WaitingForOnCommitCallbackTest.kt
index b6d5b74..f99f602 100644
--- a/compose/ui/ui-test/src/androidInstrumentedTest/kotlin/androidx/compose/ui/test/junit4/WaitingForOnCommitCallbackTest.kt
+++ b/compose/ui/ui-test/src/androidInstrumentedTest/kotlin/androidx/compose/ui/test/junit4/WaitingForOnCommitCallbackTest.kt
@@ -46,15 +46,13 @@
         setContent {
             DisposableEffect(switch) {
                 atomicBoolean.set(switch)
-                onDispose { }
+                onDispose {}
             }
         }
 
         assertThat(atomicBoolean.get()).isTrue()
 
-        runOnIdle {
-            switch = false
-        }
+        runOnIdle { switch = false }
         waitForIdle()
 
         assertThat(atomicBoolean.get()).isFalse()
@@ -80,22 +78,22 @@
             DisposableEffect(switch1) {
                 values.add(2)
                 switch2 = switch1
-                onDispose { }
+                onDispose {}
             }
             DisposableEffect(switch2) {
                 values.add(3)
                 switch3 = switch2
-                onDispose { }
+                onDispose {}
             }
             DisposableEffect(switch3) {
                 values.add(4)
                 switch4 = switch3
-                onDispose { }
+                onDispose {}
             }
             DisposableEffect(switch4) {
                 values.add(5)
                 latch.countDown()
-                onDispose { }
+                onDispose {}
             }
         }
 
@@ -140,22 +138,22 @@
                 DisposableEffect(switch1) {
                     values.add(2)
                     switch2 = switch1
-                    onDispose { }
+                    onDispose {}
                 }
                 DisposableEffect(switch2) {
                     values.add(3)
                     switch3 = switch2
-                    onDispose { }
+                    onDispose {}
                 }
                 DisposableEffect(switch3) {
                     values.add(4)
                     switch4 = switch3
-                    onDispose { }
+                    onDispose {}
                 }
                 DisposableEffect(switch4) {
                     values.add(5)
                     mutex.unlock()
-                    onDispose { }
+                    onDispose {}
                 }
             }
 
diff --git a/compose/ui/ui-test/src/androidInstrumentedTest/kotlin/androidx/compose/ui/test/junit4/WaitingForPopupTest.kt b/compose/ui/ui-test/src/androidInstrumentedTest/kotlin/androidx/compose/ui/test/junit4/WaitingForPopupTest.kt
index 91a175d..25b1141 100644
--- a/compose/ui/ui-test/src/androidInstrumentedTest/kotlin/androidx/compose/ui/test/junit4/WaitingForPopupTest.kt
+++ b/compose/ui/ui-test/src/androidInstrumentedTest/kotlin/androidx/compose/ui/test/junit4/WaitingForPopupTest.kt
@@ -37,16 +37,12 @@
 class WaitingForPopupTest {
     @Composable
     private fun ShowPopup() {
-        Popup {
-            Box(Modifier.size(10.dp, 10.dp))
-        }
+        Popup { Box(Modifier.size(10.dp, 10.dp)) }
     }
 
     @Test
     fun popupInFirstComposition() = runComposeUiTest {
-        setContent {
-            ShowPopup()
-        }
+        setContent { ShowPopup() }
         onNode(isPopup()).assertExists()
     }
 
diff --git a/compose/ui/ui-test/src/androidInstrumentedTest/kotlin/androidx/compose/ui/test/junit4/util/BoundaryNodes.kt b/compose/ui/ui-test/src/androidInstrumentedTest/kotlin/androidx/compose/ui/test/junit4/util/BoundaryNodes.kt
index e5d04e7..abdd25b 100644
--- a/compose/ui/ui-test/src/androidInstrumentedTest/kotlin/androidx/compose/ui/test/junit4/util/BoundaryNodes.kt
+++ b/compose/ui/ui-test/src/androidInstrumentedTest/kotlin/androidx/compose/ui/test/junit4/util/BoundaryNodes.kt
@@ -22,16 +22,11 @@
 import androidx.compose.ui.platform.testTag
 
 @Composable
-fun BoundaryNode(
-    testTag: String,
-    content: @Composable () -> Unit
-) {
+fun BoundaryNode(testTag: String, content: @Composable () -> Unit) {
     Column(Modifier.testTag(testTag)) { content() }
 }
 
 @Composable
-fun BoundaryNode(
-    testTag: String
-) {
+fun BoundaryNode(testTag: String) {
     Column(Modifier.testTag(testTag)) {}
 }
diff --git a/compose/ui/ui-test/src/androidInstrumentedTest/kotlin/androidx/compose/ui/test/partialgesturescope/SendCancelTest.kt b/compose/ui/ui-test/src/androidInstrumentedTest/kotlin/androidx/compose/ui/test/partialgesturescope/SendCancelTest.kt
index d571f6e..77cd5ba 100644
--- a/compose/ui/ui-test/src/androidInstrumentedTest/kotlin/androidx/compose/ui/test/partialgesturescope/SendCancelTest.kt
+++ b/compose/ui/ui-test/src/androidInstrumentedTest/kotlin/androidx/compose/ui/test/partialgesturescope/SendCancelTest.kt
@@ -35,9 +35,7 @@
 import org.junit.Rule
 import org.junit.Test
 
-/**
- * Tests if [cancel] works
- */
+/** Tests if [cancel] works */
 @MediumTest
 class SendCancelTest {
     companion object {
@@ -45,17 +43,14 @@
         private val downPosition2 = Offset(20f, 20f)
     }
 
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
     private val recorder = MultiPointerInputRecorder()
 
     @Before
     fun setUp() {
         // Given some content
-        rule.setContent {
-            ClickableTestBox(recorder)
-        }
+        rule.setContent { ClickableTestBox(recorder) }
     }
 
     @Suppress("DEPRECATION")
@@ -100,9 +95,7 @@
     @Suppress("DEPRECATION")
     @Test
     fun cancelWithoutDown() {
-        expectError<IllegalStateException> {
-            rule.partialGesture { cancel() }
-        }
+        expectError<IllegalStateException> { rule.partialGesture { cancel() } }
     }
 
     @Suppress("DEPRECATION")
@@ -110,9 +103,7 @@
     fun cancelAfterUp() {
         rule.partialGesture { down(downPosition1) }
         rule.partialGesture { up() }
-        expectError<IllegalStateException> {
-            rule.partialGesture { cancel() }
-        }
+        expectError<IllegalStateException> { rule.partialGesture { cancel() } }
     }
 
     @Suppress("DEPRECATION")
@@ -120,8 +111,6 @@
     fun cancelAfterCancel() {
         rule.partialGesture { down(downPosition1) }
         rule.partialGesture { cancel() }
-        expectError<IllegalStateException> {
-            rule.partialGesture { cancel() }
-        }
+        expectError<IllegalStateException> { rule.partialGesture { cancel() } }
     }
 }
diff --git a/compose/ui/ui-test/src/androidInstrumentedTest/kotlin/androidx/compose/ui/test/partialgesturescope/SendDownTest.kt b/compose/ui/ui-test/src/androidInstrumentedTest/kotlin/androidx/compose/ui/test/partialgesturescope/SendDownTest.kt
index e370a28..aa9cbb6 100644
--- a/compose/ui/ui-test/src/androidInstrumentedTest/kotlin/androidx/compose/ui/test/partialgesturescope/SendDownTest.kt
+++ b/compose/ui/ui-test/src/androidInstrumentedTest/kotlin/androidx/compose/ui/test/partialgesturescope/SendDownTest.kt
@@ -34,9 +34,7 @@
 import org.junit.Rule
 import org.junit.Test
 
-/**
- * Tests if [down] works
- */
+/** Tests if [down] works */
 @MediumTest
 class SendDownTest {
     companion object {
@@ -44,17 +42,14 @@
         private val position2 = Offset(7f, 7f)
     }
 
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
     private val recorder = MultiPointerInputRecorder()
 
     @Before
     fun setUp() {
         // Given some content
-        rule.setContent {
-            ClickableTestBox(recorder)
-        }
+        rule.setContent { ClickableTestBox(recorder) }
     }
 
     @Suppress("DEPRECATION")
@@ -110,8 +105,6 @@
         // When we inject two down events with the same pointer id
         rule.partialGesture { down(1, position1) }
         // Then the second throws an exception
-        expectError<IllegalArgumentException> {
-            rule.partialGesture { down(1, position1) }
-        }
+        expectError<IllegalArgumentException> { rule.partialGesture { down(1, position1) } }
     }
 }
diff --git a/compose/ui/ui-test/src/androidInstrumentedTest/kotlin/androidx/compose/ui/test/partialgesturescope/SendMoveByTest.kt b/compose/ui/ui-test/src/androidInstrumentedTest/kotlin/androidx/compose/ui/test/partialgesturescope/SendMoveByTest.kt
index 782acf1..3311da5 100644
--- a/compose/ui/ui-test/src/androidInstrumentedTest/kotlin/androidx/compose/ui/test/partialgesturescope/SendMoveByTest.kt
+++ b/compose/ui/ui-test/src/androidInstrumentedTest/kotlin/androidx/compose/ui/test/partialgesturescope/SendMoveByTest.kt
@@ -40,9 +40,7 @@
 import org.junit.Rule
 import org.junit.Test
 
-/**
- * Tests if [moveBy] and [movePointerBy] work
- */
+/** Tests if [moveBy] and [movePointerBy] work */
 @MediumTest
 class SendMoveByTest {
     companion object {
@@ -52,17 +50,14 @@
         private val delta2 = Offset(21f, 21f)
     }
 
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
     private val recorder = MultiPointerInputRecorder()
 
     @Before
     fun setUp() {
         // Given some content
-        rule.setContent {
-            ClickableTestBox(recorder)
-        }
+        rule.setContent { ClickableTestBox(recorder) }
     }
 
     @Suppress("DEPRECATION")
@@ -84,7 +79,8 @@
 
                 t += eventPeriodMillis
                 assertThat(events[1].pointerCount).isEqualTo(1)
-                events[1].getPointer(0)
+                events[1]
+                    .getPointer(0)
                     .verify(t, pointerId, true, downPosition1 + delta1, Touch, Move)
             }
         }
@@ -111,16 +107,18 @@
 
                 t += eventPeriodMillis
                 assertThat(events[2].pointerCount).isEqualTo(2)
-                events[2].getPointer(0)
+                events[2]
+                    .getPointer(0)
                     .verify(t, pointerId1, true, downPosition1 + delta1, Touch, Move)
-                events[2].getPointer(1)
-                    .verify(t, pointerId2, true, downPosition2, Touch, Move)
+                events[2].getPointer(1).verify(t, pointerId2, true, downPosition2, Touch, Move)
 
                 t += eventPeriodMillis
                 assertThat(events[3].pointerCount).isEqualTo(2)
-                events[3].getPointer(0)
+                events[3]
+                    .getPointer(0)
                     .verify(t, pointerId1, true, downPosition1 + delta1, Touch, Move)
-                events[3].getPointer(1)
+                events[3]
+                    .getPointer(1)
                     .verify(t, pointerId2, true, downPosition2 + delta2, Touch, Move)
             }
         }
@@ -149,9 +147,11 @@
 
                 t += eventPeriodMillis
                 assertThat(events[2].pointerCount).isEqualTo(2)
-                events[2].getPointer(0)
+                events[2]
+                    .getPointer(0)
                     .verify(t, pointerId1, true, downPosition1 + delta1, Touch, Move)
-                events[2].getPointer(1)
+                events[2]
+                    .getPointer(1)
                     .verify(t, pointerId2, true, downPosition2 + delta2, Touch, Move)
             }
         }
@@ -160,18 +160,14 @@
     @Suppress("DEPRECATION")
     @Test
     fun moveByWithoutDown() {
-        expectError<IllegalStateException> {
-            rule.partialGesture { moveBy(delta1) }
-        }
+        expectError<IllegalStateException> { rule.partialGesture { moveBy(delta1) } }
     }
 
     @Suppress("DEPRECATION")
     @Test
     fun moveByWrongPointerId() {
         rule.partialGesture { down(1, downPosition1) }
-        expectError<IllegalArgumentException> {
-            rule.partialGesture { moveBy(2, delta1) }
-        }
+        expectError<IllegalArgumentException> { rule.partialGesture { moveBy(2, delta1) } }
     }
 
     @Suppress("DEPRECATION")
@@ -179,9 +175,7 @@
     fun moveByAfterUp() {
         rule.partialGesture { down(downPosition1) }
         rule.partialGesture { up() }
-        expectError<IllegalStateException> {
-            rule.partialGesture { moveBy(delta1) }
-        }
+        expectError<IllegalStateException> { rule.partialGesture { moveBy(delta1) } }
     }
 
     @Suppress("DEPRECATION")
@@ -189,26 +183,20 @@
     fun moveByAfterCancel() {
         rule.partialGesture { down(downPosition1) }
         rule.partialGesture { cancel() }
-        expectError<IllegalStateException> {
-            rule.partialGesture { moveBy(delta1) }
-        }
+        expectError<IllegalStateException> { rule.partialGesture { moveBy(delta1) } }
     }
 
     @Suppress("DEPRECATION")
     @Test
     fun movePointerByWithoutDown() {
-        expectError<IllegalStateException> {
-            rule.partialGesture { movePointerBy(1, delta1) }
-        }
+        expectError<IllegalStateException> { rule.partialGesture { movePointerBy(1, delta1) } }
     }
 
     @Suppress("DEPRECATION")
     @Test
     fun movePointerByWrongPointerId() {
         rule.partialGesture { down(1, downPosition1) }
-        expectError<IllegalArgumentException> {
-            rule.partialGesture { movePointerBy(2, delta1) }
-        }
+        expectError<IllegalArgumentException> { rule.partialGesture { movePointerBy(2, delta1) } }
     }
 
     @Suppress("DEPRECATION")
@@ -216,9 +204,7 @@
     fun movePointerByAfterUp() {
         rule.partialGesture { down(1, downPosition1) }
         rule.partialGesture { up(1) }
-        expectError<IllegalStateException> {
-            rule.partialGesture { movePointerBy(1, delta1) }
-        }
+        expectError<IllegalStateException> { rule.partialGesture { movePointerBy(1, delta1) } }
     }
 
     @Suppress("DEPRECATION")
@@ -226,8 +212,6 @@
     fun movePointerByAfterCancel() {
         rule.partialGesture { down(1, downPosition1) }
         rule.partialGesture { cancel() }
-        expectError<IllegalStateException> {
-            rule.partialGesture { movePointerBy(1, delta1) }
-        }
+        expectError<IllegalStateException> { rule.partialGesture { movePointerBy(1, delta1) } }
     }
 }
diff --git a/compose/ui/ui-test/src/androidInstrumentedTest/kotlin/androidx/compose/ui/test/partialgesturescope/SendMoveTest.kt b/compose/ui/ui-test/src/androidInstrumentedTest/kotlin/androidx/compose/ui/test/partialgesturescope/SendMoveTest.kt
index 75e0900..7d767c6 100644
--- a/compose/ui/ui-test/src/androidInstrumentedTest/kotlin/androidx/compose/ui/test/partialgesturescope/SendMoveTest.kt
+++ b/compose/ui/ui-test/src/androidInstrumentedTest/kotlin/androidx/compose/ui/test/partialgesturescope/SendMoveTest.kt
@@ -30,32 +30,25 @@
 import org.junit.Rule
 import org.junit.Test
 
-/**
- * Tests the error states of [move] that are not tested in [SendMoveToTest] and [SendMoveByTest]
- */
+/** Tests the error states of [move] that are not tested in [SendMoveToTest] and [SendMoveByTest] */
 @MediumTest
 class SendMoveTest() {
     companion object {
         private val downPosition1 = Offset(10f, 10f)
     }
 
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
     @Before
     fun setUp() {
         // Given some content
-        rule.setContent {
-            ClickableTestBox()
-        }
+        rule.setContent { ClickableTestBox() }
     }
 
     @Suppress("DEPRECATION")
     @Test
     fun moveWithoutDown() {
-        expectError<IllegalStateException> {
-            rule.partialGesture { move() }
-        }
+        expectError<IllegalStateException> { rule.partialGesture { move() } }
     }
 
     @Suppress("DEPRECATION")
@@ -63,9 +56,7 @@
     fun moveAfterUp() {
         rule.partialGesture { down(downPosition1) }
         rule.partialGesture { up() }
-        expectError<IllegalStateException> {
-            rule.partialGesture { move() }
-        }
+        expectError<IllegalStateException> { rule.partialGesture { move() } }
     }
 
     @Suppress("DEPRECATION")
@@ -73,8 +64,6 @@
     fun moveAfterCancel() {
         rule.partialGesture { down(downPosition1) }
         rule.partialGesture { cancel() }
-        expectError<IllegalStateException> {
-            rule.partialGesture { move() }
-        }
+        expectError<IllegalStateException> { rule.partialGesture { move() } }
     }
 }
diff --git a/compose/ui/ui-test/src/androidInstrumentedTest/kotlin/androidx/compose/ui/test/partialgesturescope/SendMoveToTest.kt b/compose/ui/ui-test/src/androidInstrumentedTest/kotlin/androidx/compose/ui/test/partialgesturescope/SendMoveToTest.kt
index 0cdeec6..5abb76f 100644
--- a/compose/ui/ui-test/src/androidInstrumentedTest/kotlin/androidx/compose/ui/test/partialgesturescope/SendMoveToTest.kt
+++ b/compose/ui/ui-test/src/androidInstrumentedTest/kotlin/androidx/compose/ui/test/partialgesturescope/SendMoveToTest.kt
@@ -40,9 +40,7 @@
 import org.junit.Rule
 import org.junit.Test
 
-/**
- * Tests if [moveTo] and [movePointerTo] work
- */
+/** Tests if [moveTo] and [movePointerTo] work */
 @MediumTest
 class SendMoveToTest {
     companion object {
@@ -52,17 +50,14 @@
         private val moveToPosition2 = Offset(21f, 21f)
     }
 
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
     private val recorder = MultiPointerInputRecorder()
 
     @Before
     fun setUp() {
         // Given some content
-        rule.setContent {
-            ClickableTestBox(recorder)
-        }
+        rule.setContent { ClickableTestBox(recorder) }
     }
 
     @Suppress("DEPRECATION")
@@ -153,18 +148,14 @@
     @Suppress("DEPRECATION")
     @Test
     fun moveToWithoutDown() {
-        expectError<IllegalStateException> {
-            rule.partialGesture { moveTo(moveToPosition1) }
-        }
+        expectError<IllegalStateException> { rule.partialGesture { moveTo(moveToPosition1) } }
     }
 
     @Suppress("DEPRECATION")
     @Test
     fun moveToWrongPointerId() {
         rule.partialGesture { down(1, downPosition1) }
-        expectError<IllegalArgumentException> {
-            rule.partialGesture { moveTo(2, moveToPosition1) }
-        }
+        expectError<IllegalArgumentException> { rule.partialGesture { moveTo(2, moveToPosition1) } }
     }
 
     @Suppress("DEPRECATION")
@@ -172,9 +163,7 @@
     fun moveToAfterUp() {
         rule.partialGesture { down(downPosition1) }
         rule.partialGesture { up() }
-        expectError<IllegalStateException> {
-            rule.partialGesture { moveTo(moveToPosition1) }
-        }
+        expectError<IllegalStateException> { rule.partialGesture { moveTo(moveToPosition1) } }
     }
 
     @Suppress("DEPRECATION")
@@ -182,9 +171,7 @@
     fun moveToAfterCancel() {
         rule.partialGesture { down(downPosition1) }
         rule.partialGesture { cancel() }
-        expectError<IllegalStateException> {
-            rule.partialGesture { moveTo(moveToPosition1) }
-        }
+        expectError<IllegalStateException> { rule.partialGesture { moveTo(moveToPosition1) } }
     }
 
     @Suppress("DEPRECATION")
diff --git a/compose/ui/ui-test/src/androidInstrumentedTest/kotlin/androidx/compose/ui/test/partialgesturescope/SendMultipleGesturesTest.kt b/compose/ui/ui-test/src/androidInstrumentedTest/kotlin/androidx/compose/ui/test/partialgesturescope/SendMultipleGesturesTest.kt
index 80f1401..2c903a3 100644
--- a/compose/ui/ui-test/src/androidInstrumentedTest/kotlin/androidx/compose/ui/test/partialgesturescope/SendMultipleGesturesTest.kt
+++ b/compose/ui/ui-test/src/androidInstrumentedTest/kotlin/androidx/compose/ui/test/partialgesturescope/SendMultipleGesturesTest.kt
@@ -32,25 +32,19 @@
 @LargeTest
 @RunWith(AndroidJUnit4::class)
 class SendMultipleGesturesTest {
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
     private val recorder = SinglePointerInputRecorder()
 
     @Before
     fun setUp() {
         // Given some content
-        rule.setContent {
-            ClickableTestBox(recorder)
-        }
+        rule.setContent { ClickableTestBox(recorder) }
     }
 
     @Test
     fun test_noTimeInBetween() {
-        testWithTwoGestures(
-            expectedDifference = 0,
-            betweenGesturesBlock = {}
-        )
+        testWithTwoGestures(expectedDifference = 0, betweenGesturesBlock = {})
     }
 
     @Test
@@ -63,15 +57,10 @@
         )
     }
 
-    private fun testWithTwoGestures(
-        expectedDifference: Long,
-        betweenGesturesBlock: () -> Unit
-    ) {
-        @Suppress("DEPRECATION")
-        rule.partialGesture { click() }
+    private fun testWithTwoGestures(expectedDifference: Long, betweenGesturesBlock: () -> Unit) {
+        @Suppress("DEPRECATION") rule.partialGesture { click() }
         betweenGesturesBlock.invoke()
-        @Suppress("DEPRECATION")
-        rule.partialGesture { click() }
+        @Suppress("DEPRECATION") rule.partialGesture { click() }
 
         rule.runOnIdle {
             recorder.run {
diff --git a/compose/ui/ui-test/src/androidInstrumentedTest/kotlin/androidx/compose/ui/test/partialgesturescope/SendUpTest.kt b/compose/ui/ui-test/src/androidInstrumentedTest/kotlin/androidx/compose/ui/test/partialgesturescope/SendUpTest.kt
index 8329781..d078e14 100644
--- a/compose/ui/ui-test/src/androidInstrumentedTest/kotlin/androidx/compose/ui/test/partialgesturescope/SendUpTest.kt
+++ b/compose/ui/ui-test/src/androidInstrumentedTest/kotlin/androidx/compose/ui/test/partialgesturescope/SendUpTest.kt
@@ -39,9 +39,7 @@
 import org.junit.Rule
 import org.junit.Test
 
-/**
- * Tests if [up] works
- */
+/** Tests if [up] works */
 @Suppress("DEPRECATION")
 @MediumTest
 class SendUpTest {
@@ -50,17 +48,14 @@
         private val downPosition2 = Offset(20f, 20f)
     }
 
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
     private val recorder = MultiPointerInputRecorder()
 
     @Before
     fun setUp() {
         // Given some content
-        rule.setContent {
-            ClickableTestBox(recorder)
-        }
+        rule.setContent { ClickableTestBox(recorder) }
     }
 
     @Test
@@ -121,34 +116,26 @@
 
     @Test
     fun upWithoutDown() {
-        expectError<IllegalStateException> {
-            rule.partialGesture { up() }
-        }
+        expectError<IllegalStateException> { rule.partialGesture { up() } }
     }
 
     @Test
     fun upWrongPointerId() {
         rule.partialGesture { down(1, downPosition1) }
-        expectError<IllegalArgumentException> {
-            rule.partialGesture { up(2) }
-        }
+        expectError<IllegalArgumentException> { rule.partialGesture { up(2) } }
     }
 
     @Test
     fun upAfterUp() {
         rule.partialGesture { down(downPosition1) }
         rule.partialGesture { up() }
-        expectError<IllegalStateException> {
-            rule.partialGesture { up() }
-        }
+        expectError<IllegalStateException> { rule.partialGesture { up() } }
     }
 
     @Test
     fun upAfterCancel() {
         rule.partialGesture { down(downPosition1) }
         rule.partialGesture { cancel() }
-        expectError<IllegalStateException> {
-            rule.partialGesture { up() }
-        }
+        expectError<IllegalStateException> { rule.partialGesture { up() } }
     }
 }
diff --git a/compose/ui/ui-test/src/androidInstrumentedTest/kotlin/androidx/compose/ui/test/predicates/HasAnyAncestorTest.kt b/compose/ui/ui-test/src/androidInstrumentedTest/kotlin/androidx/compose/ui/test/predicates/HasAnyAncestorTest.kt
index 585fbae..8d3b5f3 100644
--- a/compose/ui/ui-test/src/androidInstrumentedTest/kotlin/androidx/compose/ui/test/predicates/HasAnyAncestorTest.kt
+++ b/compose/ui/ui-test/src/androidInstrumentedTest/kotlin/androidx/compose/ui/test/predicates/HasAnyAncestorTest.kt
@@ -32,20 +32,16 @@
 @RunWith(AndroidJUnit4::class)
 class HasAnyAncestorTest {
 
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
     @Test
     fun findByAncestor_oneAncestor_oneMatch() {
         rule.setContent {
             BoundaryNode(testTag = "Node")
-            BoundaryNode(testTag = "Parent") {
-                BoundaryNode(testTag = "Child")
-            }
+            BoundaryNode(testTag = "Parent") { BoundaryNode(testTag = "Child") }
         }
 
-        rule.onNode(hasAnyAncestor(hasTestTag("Parent")))
-            .assert(hasTestTag("Child"))
+        rule.onNode(hasAnyAncestor(hasTestTag("Parent"))).assert(hasTestTag("Child"))
     }
 
     @Test
@@ -60,8 +56,7 @@
             }
         }
 
-        rule.onAllNodes(hasAnyAncestor(hasTestTag("Parent")))
-            .assertCountEquals(2)
+        rule.onAllNodes(hasAnyAncestor(hasTestTag("Parent"))).assertCountEquals(2)
     }
 
     @Test
@@ -69,16 +64,12 @@
         rule.setContent {
             BoundaryNode(testTag = "Node")
             BoundaryNode(testTag = "Grandparent") {
-                BoundaryNode(testTag = "Parent") {
-                    BoundaryNode(testTag = "Child")
-                }
+                BoundaryNode(testTag = "Parent") { BoundaryNode(testTag = "Child") }
             }
         }
 
-        rule.onNode(
-            hasAnyAncestor(hasTestTag("Grandparent"))
-                and !hasTestTag("Parent")
-        )
+        rule
+            .onNode(hasAnyAncestor(hasTestTag("Grandparent")) and !hasTestTag("Parent"))
             .assert(hasTestTag("Child"))
     }
 
@@ -87,35 +78,26 @@
         rule.setContent {
             BoundaryNode(testTag = "Node")
             BoundaryNode(testTag = "Grandparent") {
-                BoundaryNode(testTag = "Parent") {
-                    BoundaryNode(testTag = "Child")
-                }
+                BoundaryNode(testTag = "Parent") { BoundaryNode(testTag = "Child") }
             }
         }
 
-        rule.onAllNodes(hasAnyAncestor(hasTestTag("Parent") or hasTestTag("Grandparent")))
+        rule
+            .onAllNodes(hasAnyAncestor(hasTestTag("Parent") or hasTestTag("Grandparent")))
             .assertCountEquals(2)
     }
 
     @Test
     fun findByAncestor_justSelf_noMatch() {
-        rule.setContent {
-            BoundaryNode(testTag = "Node")
-        }
+        rule.setContent { BoundaryNode(testTag = "Node") }
 
-        rule.onNode(hasAnyAncestor(hasTestTag("Node")))
-            .assertDoesNotExist()
+        rule.onNode(hasAnyAncestor(hasTestTag("Node"))).assertDoesNotExist()
     }
 
     @Test
     fun findByAncestor_oneAncestor_noMatch() {
-        rule.setContent {
-            BoundaryNode(testTag = "Parent") {
-                BoundaryNode(testTag = "Child")
-            }
-        }
+        rule.setContent { BoundaryNode(testTag = "Parent") { BoundaryNode(testTag = "Child") } }
 
-        rule.onNode(hasAnyAncestor(hasTestTag("Child")))
-            .assertDoesNotExist()
+        rule.onNode(hasAnyAncestor(hasTestTag("Child"))).assertDoesNotExist()
     }
 }
diff --git a/compose/ui/ui-test/src/androidInstrumentedTest/kotlin/androidx/compose/ui/test/predicates/HasAnyChildTest.kt b/compose/ui/ui-test/src/androidInstrumentedTest/kotlin/androidx/compose/ui/test/predicates/HasAnyChildTest.kt
index 5a415b8..04dea27 100644
--- a/compose/ui/ui-test/src/androidInstrumentedTest/kotlin/androidx/compose/ui/test/predicates/HasAnyChildTest.kt
+++ b/compose/ui/ui-test/src/androidInstrumentedTest/kotlin/androidx/compose/ui/test/predicates/HasAnyChildTest.kt
@@ -32,20 +32,16 @@
 @RunWith(AndroidJUnit4::class)
 class HasAnyChildTest {
 
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
     @Test
     fun findByChild_oneSubtree_oneChild_matches() {
         rule.setContent {
             BoundaryNode(testTag = "Node")
-            BoundaryNode(testTag = "Parent") {
-                BoundaryNode(testTag = "Child")
-            }
+            BoundaryNode(testTag = "Parent") { BoundaryNode(testTag = "Child") }
         }
 
-        rule.onNode(hasAnyChild(hasTestTag("Child")))
-            .assert(hasTestTag("Parent"))
+        rule.onNode(hasAnyChild(hasTestTag("Child"))).assert(hasTestTag("Parent"))
     }
 
     @Test
@@ -66,52 +62,37 @@
             }
         }
 
-        rule.onAllNodes(hasAnyChild(hasTestTag("Child1")))
-            .assertCountEquals(2)
-        rule.onAllNodes(hasAnyChild(hasTestTag("Child2")))
-            .assertCountEquals(3)
-        rule.onAllNodes(hasAnyChild(hasTestTag("Child3")))
-            .assertCountEquals(1)
+        rule.onAllNodes(hasAnyChild(hasTestTag("Child1"))).assertCountEquals(2)
+        rule.onAllNodes(hasAnyChild(hasTestTag("Child2"))).assertCountEquals(3)
+        rule.onAllNodes(hasAnyChild(hasTestTag("Child3"))).assertCountEquals(1)
     }
 
     @Test
     fun findByChild_justSelf_oneFound() {
-        rule.setContent {
-            BoundaryNode(testTag = "Child")
-        }
+        rule.setContent { BoundaryNode(testTag = "Child") }
 
-        rule.onNode(hasAnyChild(hasTestTag("Child")))
-            .assertExists() // The root node
+        rule.onNode(hasAnyChild(hasTestTag("Child"))).assertExists() // The root node
     }
 
     @Test
     fun findByChild_nothingFound() {
         rule.setContent {
             BoundaryNode(testTag = "Parent") {
-                BoundaryNode(testTag = "ExtraNode") {
-                    BoundaryNode(testTag = "Child")
-                }
+                BoundaryNode(testTag = "ExtraNode") { BoundaryNode(testTag = "Child") }
             }
         }
 
-        rule.onNode(
-            hasAnyChild(hasTestTag("Child"))
-                and hasTestTag("Parent")
-        )
-            .assertDoesNotExist()
+        rule.onNode(hasAnyChild(hasTestTag("Child")) and hasTestTag("Parent")).assertDoesNotExist()
     }
 
     @Test
     fun findByGrandChild_oneFound() {
         rule.setContent {
             BoundaryNode(testTag = "Parent") {
-                BoundaryNode(testTag = "ExtraNode") {
-                    BoundaryNode(testTag = "Child")
-                }
+                BoundaryNode(testTag = "ExtraNode") { BoundaryNode(testTag = "Child") }
             }
         }
 
-        rule.onNode(hasAnyChild(hasAnyChild(hasTestTag("Child"))))
-            .assert(hasTestTag("Parent"))
+        rule.onNode(hasAnyChild(hasAnyChild(hasTestTag("Child")))).assert(hasTestTag("Parent"))
     }
 }
diff --git a/compose/ui/ui-test/src/androidInstrumentedTest/kotlin/androidx/compose/ui/test/predicates/HasAnyDescendantTest.kt b/compose/ui/ui-test/src/androidInstrumentedTest/kotlin/androidx/compose/ui/test/predicates/HasAnyDescendantTest.kt
index 70f1988..70fdb50 100644
--- a/compose/ui/ui-test/src/androidInstrumentedTest/kotlin/androidx/compose/ui/test/predicates/HasAnyDescendantTest.kt
+++ b/compose/ui/ui-test/src/androidInstrumentedTest/kotlin/androidx/compose/ui/test/predicates/HasAnyDescendantTest.kt
@@ -32,19 +32,17 @@
 @RunWith(AndroidJUnit4::class)
 class HasAnyDescendantTest {
 
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
     @Test
     fun findByDescendant_directDescendant_matches() {
         rule.setContent {
             BoundaryNode(testTag = "Node")
-            BoundaryNode(testTag = "Parent") {
-                BoundaryNode(testTag = "Child")
-            }
+            BoundaryNode(testTag = "Parent") { BoundaryNode(testTag = "Child") }
         }
 
-        rule.onNode(hasAnyDescendant(hasTestTag("Child")) and hasTestTag("Parent"))
+        rule
+            .onNode(hasAnyDescendant(hasTestTag("Child")) and hasTestTag("Parent"))
             .assert(hasTestTag("Parent"))
     }
 
@@ -53,42 +51,36 @@
         rule.setContent {
             BoundaryNode(testTag = "Node")
             BoundaryNode(testTag = "Grandparent") {
-                BoundaryNode(testTag = "Parent") {
-                    BoundaryNode(testTag = "Child")
-                }
+                BoundaryNode(testTag = "Parent") { BoundaryNode(testTag = "Child") }
             }
         }
 
-        rule.onNode(
-            hasAnyDescendant(hasTestTag("Child")) and !hasTestTag("Parent")
-                and hasTestTag("Grandparent")
-        )
+        rule
+            .onNode(
+                hasAnyDescendant(hasTestTag("Child")) and
+                    !hasTestTag("Parent") and
+                    hasTestTag("Grandparent")
+            )
             .assert(hasTestTag("Grandparent"))
     }
 
     @Test
     fun findByDescendant_justSelf_oneMatch() {
-        rule.setContent {
-            BoundaryNode(testTag = "Node")
-        }
+        rule.setContent { BoundaryNode(testTag = "Node") }
 
-        rule.onNode(hasAnyDescendant(hasTestTag("Node")))
-            .assertExists() // Root node
+        rule.onNode(hasAnyDescendant(hasTestTag("Node"))).assertExists() // Root node
     }
 
     @Test
     fun findByDescendant_twoSubtrees_threeMatches() {
         rule.setContent {
             BoundaryNode(testTag = "Node")
-            BoundaryNode(testTag = "Parent") {
-                BoundaryNode(testTag = "Child")
-            }
-            BoundaryNode(testTag = "Parent2") {
-                BoundaryNode(testTag = "Child")
-            }
+            BoundaryNode(testTag = "Parent") { BoundaryNode(testTag = "Child") }
+            BoundaryNode(testTag = "Parent2") { BoundaryNode(testTag = "Child") }
         }
 
-        rule.onAllNodes(hasAnyDescendant(hasTestTag("Child")))
+        rule
+            .onAllNodes(hasAnyDescendant(hasTestTag("Child")))
             .assertCountEquals(3) // Parent, Parent2 and root
     }
 }
diff --git a/compose/ui/ui-test/src/androidInstrumentedTest/kotlin/androidx/compose/ui/test/predicates/HasAnySiblingTest.kt b/compose/ui/ui-test/src/androidInstrumentedTest/kotlin/androidx/compose/ui/test/predicates/HasAnySiblingTest.kt
index 1975f2c..7a3f6a5 100644
--- a/compose/ui/ui-test/src/androidInstrumentedTest/kotlin/androidx/compose/ui/test/predicates/HasAnySiblingTest.kt
+++ b/compose/ui/ui-test/src/androidInstrumentedTest/kotlin/androidx/compose/ui/test/predicates/HasAnySiblingTest.kt
@@ -33,8 +33,7 @@
 @RunWith(AndroidJUnit4::class)
 class HasAnySiblingTest {
 
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
     @Test
     fun findBySibling_oneSubtree_oneSibling_matches() {
@@ -46,8 +45,7 @@
             }
         }
 
-        rule.onNode(hasAnySibling(hasTestTag("Sibling")))
-            .assert(hasTestTag("Me"))
+        rule.onNode(hasAnySibling(hasTestTag("Sibling"))).assert(hasTestTag("Me"))
     }
 
     @Test
@@ -61,8 +59,7 @@
             }
         }
 
-        rule.onAllNodes(hasAnySibling(hasTestTag("Sibling")))
-            .assertCountEquals(2)
+        rule.onAllNodes(hasAnySibling(hasTestTag("Sibling"))).assertCountEquals(2)
     }
 
     @Test
@@ -75,8 +72,7 @@
             }
         }
 
-        rule.onAllNodes(hasAnySibling(hasTestTag("Sibling")))
-            .assertCountEquals(2)
+        rule.onAllNodes(hasAnySibling(hasTestTag("Sibling"))).assertCountEquals(2)
     }
 
     @Test
@@ -93,20 +89,14 @@
             }
         }
 
-        rule.onAllNodes(hasAnySibling(hasTestTag("Sibling")))
-            .assertCountEquals(2)
+        rule.onAllNodes(hasAnySibling(hasTestTag("Sibling"))).assertCountEquals(2)
     }
 
     @Test
     fun findBySibling_noSiblings_nothingFound() {
-        rule.setContent {
-            BoundaryNode(testTag = "Parent") {
-                BoundaryNode(testTag = "Me")
-            }
-        }
+        rule.setContent { BoundaryNode(testTag = "Parent") { BoundaryNode(testTag = "Me") } }
 
-        rule.onNode(hasAnySibling(hasTestTag("Me")))
-            .assertDoesNotExist()
+        rule.onNode(hasAnySibling(hasTestTag("Me"))).assertDoesNotExist()
     }
 
     @Test
@@ -118,40 +108,31 @@
             }
         }
 
-        rule.onNode(hasAnySibling(hasTestTag("Sibling2")))
-            .assertDoesNotExist()
+        rule.onNode(hasAnySibling(hasTestTag("Sibling2"))).assertDoesNotExist()
     }
 
     @Test
     fun findBySibling_oneSiblings_notMySibling_nothingFound() {
         rule.setContent {
-            BoundaryNode(testTag = "Parent") {
-                BoundaryNode(testTag = "Me")
-            }
+            BoundaryNode(testTag = "Parent") { BoundaryNode(testTag = "Me") }
             BoundaryNode(testTag = "Parent") {
                 BoundaryNode(testTag = "SomeoneElse")
                 BoundaryNode(testTag = "Sibling")
             }
         }
 
-        rule.onNode(hasAnySibling(hasTestTag("Sibling")) and hasTestTag("Me"))
-            .assertDoesNotExist()
+        rule.onNode(hasAnySibling(hasTestTag("Sibling")) and hasTestTag("Me")).assertDoesNotExist()
     }
 
     @Test
     fun findByParentSibling_oneFound() {
         rule.setContent {
             BoundaryNode(testTag = "Grandparent") {
-                BoundaryNode(testTag = "Parent") {
-                    BoundaryNode(testTag = "Me")
-                }
-                BoundaryNode(testTag = "ParentSibling") {
-                    BoundaryNode(testTag = "SomeoneElse")
-                }
+                BoundaryNode(testTag = "Parent") { BoundaryNode(testTag = "Me") }
+                BoundaryNode(testTag = "ParentSibling") { BoundaryNode(testTag = "SomeoneElse") }
             }
         }
 
-        rule.onNode(hasParent(hasAnySibling(hasTestTag("ParentSibling"))))
-            .assert(hasTestTag("Me"))
+        rule.onNode(hasParent(hasAnySibling(hasTestTag("ParentSibling")))).assert(hasTestTag("Me"))
     }
 }
diff --git a/compose/ui/ui-test/src/androidInstrumentedTest/kotlin/androidx/compose/ui/test/predicates/HasParentTest.kt b/compose/ui/ui-test/src/androidInstrumentedTest/kotlin/androidx/compose/ui/test/predicates/HasParentTest.kt
index 6855853..0bdb007 100644
--- a/compose/ui/ui-test/src/androidInstrumentedTest/kotlin/androidx/compose/ui/test/predicates/HasParentTest.kt
+++ b/compose/ui/ui-test/src/androidInstrumentedTest/kotlin/androidx/compose/ui/test/predicates/HasParentTest.kt
@@ -32,20 +32,16 @@
 @RunWith(AndroidJUnit4::class)
 class HasParentTest {
 
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
     @Test
     fun findByParent_oneSubtree_oneChild_matches() {
         rule.setContent {
             BoundaryNode(testTag = "Node")
-            BoundaryNode(testTag = "Parent") {
-                BoundaryNode(testTag = "Child")
-            }
+            BoundaryNode(testTag = "Parent") { BoundaryNode(testTag = "Child") }
         }
 
-        rule.onNode(hasParent(hasTestTag("Parent")))
-            .assert(hasTestTag("Child"))
+        rule.onNode(hasParent(hasTestTag("Parent"))).assert(hasTestTag("Child"))
     }
 
     @Test
@@ -58,8 +54,7 @@
             }
         }
 
-        rule.onAllNodes(hasParent(hasTestTag("Parent")))
-            .assertCountEquals(2)
+        rule.onAllNodes(hasParent(hasTestTag("Parent"))).assertCountEquals(2)
     }
 
     @Test
@@ -76,38 +71,28 @@
             }
         }
 
-        rule.onAllNodes(hasParent(hasTestTag("Parent")))
-            .assertCountEquals(4)
+        rule.onAllNodes(hasParent(hasTestTag("Parent"))).assertCountEquals(4)
     }
 
     @Test
     fun findByParent_nothingFound() {
         rule.setContent {
             BoundaryNode(testTag = "Parent") {
-                BoundaryNode(testTag = "ExtraNode") {
-                    BoundaryNode(testTag = "Child")
-                }
+                BoundaryNode(testTag = "ExtraNode") { BoundaryNode(testTag = "Child") }
             }
         }
 
-        rule.onNode(
-            hasParent(hasTestTag("Parent"))
-                and hasTestTag("Child")
-        )
-            .assertDoesNotExist()
+        rule.onNode(hasParent(hasTestTag("Parent")) and hasTestTag("Child")).assertDoesNotExist()
     }
 
     @Test
     fun findByGrandParent_oneFound() {
         rule.setContent {
             BoundaryNode(testTag = "Parent") {
-                BoundaryNode(testTag = "ExtraNode") {
-                    BoundaryNode(testTag = "Child")
-                }
+                BoundaryNode(testTag = "ExtraNode") { BoundaryNode(testTag = "Child") }
             }
         }
 
-        rule.onNode(hasParent(hasParent(hasTestTag("Parent"))))
-            .assert(hasTestTag("Child"))
+        rule.onNode(hasParent(hasParent(hasTestTag("Parent")))).assert(hasTestTag("Child"))
     }
 }
diff --git a/compose/ui/ui-test/src/androidInstrumentedTest/kotlin/androidx/compose/ui/test/selectors/AddIndexSelectorTest.kt b/compose/ui/ui-test/src/androidInstrumentedTest/kotlin/androidx/compose/ui/test/selectors/AddIndexSelectorTest.kt
index 742ee99..be30a44 100644
--- a/compose/ui/ui-test/src/androidInstrumentedTest/kotlin/androidx/compose/ui/test/selectors/AddIndexSelectorTest.kt
+++ b/compose/ui/ui-test/src/androidInstrumentedTest/kotlin/androidx/compose/ui/test/selectors/AddIndexSelectorTest.kt
@@ -35,8 +35,7 @@
 @RunWith(AndroidJUnit4::class)
 class AddIndexSelectorTest {
 
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
     @Test
     fun getFirst() {
@@ -47,10 +46,7 @@
             }
         }
 
-        rule.onNodeWithTag("Parent")
-            .onChildren()
-            .onFirst()
-            .assert(hasTestTag("Child1"))
+        rule.onNodeWithTag("Parent").onChildren().onFirst().assert(hasTestTag("Child1"))
     }
 
     @Test
@@ -62,9 +58,7 @@
             }
         }
 
-        rule.onNodeWithTag("Parent")
-            .onChildAt(1)
-            .assert(hasTestTag("Child2"))
+        rule.onNodeWithTag("Parent").onChildAt(1).assert(hasTestTag("Child2"))
     }
 
     @Test
@@ -82,28 +76,20 @@
                 "Can't retrieve node at index '2' of '(TestTag = 'Parent').children'\n" +
                 "There are '2' nodes only:"
         ) {
-            rule.onNodeWithTag("Parent")
-                .onChildAt(2)
-                .assertExists()
+            rule.onNodeWithTag("Parent").onChildAt(2).assertExists()
         }
     }
 
     @Test
     fun getAtIndex_noItems() {
-        rule.setContent {
-            BoundaryNode(testTag = "Parent")
-        }
+        rule.setContent { BoundaryNode(testTag = "Parent") }
 
-        rule.onNodeWithTag("Parent")
-            .onChildAt(2)
-            .assertDoesNotExist()
+        rule.onNodeWithTag("Parent").onChildAt(2).assertDoesNotExist()
     }
 
     @Test
     fun getAtIndex_noItems_fail() {
-        rule.setContent {
-            BoundaryNode(testTag = "Parent")
-        }
+        rule.setContent { BoundaryNode(testTag = "Parent") }
 
         expectErrorMessageStartsWith(
             "" +
@@ -111,9 +97,7 @@
                 "Can't retrieve node at index '2' of '(TestTag = 'Parent').children'\n" +
                 "There are no existing nodes for that selector."
         ) {
-            rule.onNodeWithTag("Parent")
-                .onChildAt(2)
-                .assertExists()
+            rule.onNodeWithTag("Parent").onChildAt(2).assertExists()
         }
     }
 }
diff --git a/compose/ui/ui-test/src/androidInstrumentedTest/kotlin/androidx/compose/ui/test/selectors/AncestorsSelectorTest.kt b/compose/ui/ui-test/src/androidInstrumentedTest/kotlin/androidx/compose/ui/test/selectors/AncestorsSelectorTest.kt
index ab51b59..a044a0d 100644
--- a/compose/ui/ui-test/src/androidInstrumentedTest/kotlin/androidx/compose/ui/test/selectors/AncestorsSelectorTest.kt
+++ b/compose/ui/ui-test/src/androidInstrumentedTest/kotlin/androidx/compose/ui/test/selectors/AncestorsSelectorTest.kt
@@ -35,29 +35,23 @@
 @RunWith(AndroidJUnit4::class)
 class AncestorsSelectorTest {
 
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
     @Test
     fun threeAncestors() {
         rule.setContent {
             BoundaryNode(testTag = "NodeA") {
                 BoundaryNode(testTag = "NodeB") {
-                    BoundaryNode(testTag = "NodeC") {
-                        BoundaryNode(testTag = "NodeD")
-                    }
+                    BoundaryNode(testTag = "NodeC") { BoundaryNode(testTag = "NodeD") }
                 }
             }
         }
 
-        rule.onNodeWithTag("NodeD")
-            .onAncestors()
-            .assertCountEquals(4)
-            .apply {
-                get(0).assert(hasTestTag("NodeC"))
-                get(1).assert(hasTestTag("NodeB"))
-                get(2).assert(hasTestTag("NodeA"))
-            }
+        rule.onNodeWithTag("NodeD").onAncestors().assertCountEquals(4).apply {
+            get(0).assert(hasTestTag("NodeC"))
+            get(1).assert(hasTestTag("NodeB"))
+            get(2).assert(hasTestTag("NodeA"))
+        }
     }
 
     @Test
@@ -65,14 +59,13 @@
         rule.setContent {
             BoundaryNode(testTag = "NodeA") {
                 BoundaryNode(testTag = "NodeB") {
-                    BoundaryNode(testTag = "NodeC") {
-                        BoundaryNode(testTag = "NodeD")
-                    }
+                    BoundaryNode(testTag = "NodeC") { BoundaryNode(testTag = "NodeD") }
                 }
             }
         }
 
-        rule.onNodeWithTag("NodeD")
+        rule
+            .onNodeWithTag("NodeD")
             .onAncestors()
             .onFirst()
             .onAncestors()
@@ -85,13 +78,8 @@
 
     @Test
     fun noAncestors() {
-        rule.setContent {
-            BoundaryNode(testTag = "Node")
-        }
+        rule.setContent { BoundaryNode(testTag = "Node") }
 
-        rule.onNodeWithTag("Node")
-            .onParent()
-            .onAncestors()
-            .assertCountEquals(0)
+        rule.onNodeWithTag("Node").onParent().onAncestors().assertCountEquals(0)
     }
 }
diff --git a/compose/ui/ui-test/src/androidInstrumentedTest/kotlin/androidx/compose/ui/test/selectors/ChildSelectorTest.kt b/compose/ui/ui-test/src/androidInstrumentedTest/kotlin/androidx/compose/ui/test/selectors/ChildSelectorTest.kt
index 40979dd..1fd00c2 100644
--- a/compose/ui/ui-test/src/androidInstrumentedTest/kotlin/androidx/compose/ui/test/selectors/ChildSelectorTest.kt
+++ b/compose/ui/ui-test/src/androidInstrumentedTest/kotlin/androidx/compose/ui/test/selectors/ChildSelectorTest.kt
@@ -33,42 +33,27 @@
 @RunWith(AndroidJUnit4::class)
 class ChildSelectorTest {
 
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
     @Test
     fun oneChild() {
-        rule.setContent {
-            BoundaryNode(testTag = "Parent") {
-                BoundaryNode(testTag = "Child")
-            }
-        }
+        rule.setContent { BoundaryNode(testTag = "Parent") { BoundaryNode(testTag = "Child") } }
 
-        rule.onNodeWithTag("Parent")
-            .onChild()
-            .assert(hasTestTag("Child"))
+        rule.onNodeWithTag("Parent").onChild().assert(hasTestTag("Child"))
     }
 
     @Test
     fun noChild() {
-        rule.setContent {
-            BoundaryNode(testTag = "Parent")
-        }
+        rule.setContent { BoundaryNode(testTag = "Parent") }
 
-        rule.onNodeWithTag("Parent")
-            .onChild()
-            .assertDoesNotExist()
+        rule.onNodeWithTag("Parent").onChild().assertDoesNotExist()
     }
 
     @Test(expected = AssertionError::class)
     fun noChild_fail() {
-        rule.setContent {
-            BoundaryNode(testTag = "Parent")
-        }
+        rule.setContent { BoundaryNode(testTag = "Parent") }
 
-        rule.onNodeWithTag("Parent")
-            .onChild()
-            .assertExists()
+        rule.onNodeWithTag("Parent").onChild().assertExists()
     }
 
     @Test
@@ -87,9 +72,7 @@
                 "((TestTag = 'Parent').child)\n" +
                 "Nodes found:"
         ) {
-            rule.onNodeWithTag("Parent")
-                .onChild()
-                .assertExists()
+            rule.onNodeWithTag("Parent").onChild().assertExists()
         }
     }
 }
diff --git a/compose/ui/ui-test/src/androidInstrumentedTest/kotlin/androidx/compose/ui/test/selectors/ChildrenSelectorTest.kt b/compose/ui/ui-test/src/androidInstrumentedTest/kotlin/androidx/compose/ui/test/selectors/ChildrenSelectorTest.kt
index 673125d..30ea155 100644
--- a/compose/ui/ui-test/src/androidInstrumentedTest/kotlin/androidx/compose/ui/test/selectors/ChildrenSelectorTest.kt
+++ b/compose/ui/ui-test/src/androidInstrumentedTest/kotlin/androidx/compose/ui/test/selectors/ChildrenSelectorTest.kt
@@ -33,8 +33,7 @@
 @RunWith(AndroidJUnit4::class)
 class ChildrenSelectorTest {
 
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
     @Test
     fun twoChildren() {
@@ -45,23 +44,16 @@
             }
         }
 
-        rule.onNodeWithTag("Parent")
-            .onChildren()
-            .assertCountEquals(2)
-            .apply {
-                get(0).assert(hasTestTag("Child1"))
-                get(1).assert(hasTestTag("Child2"))
-            }
+        rule.onNodeWithTag("Parent").onChildren().assertCountEquals(2).apply {
+            get(0).assert(hasTestTag("Child1"))
+            get(1).assert(hasTestTag("Child2"))
+        }
     }
 
     @Test
     fun noChildren() {
-        rule.setContent {
-            BoundaryNode(testTag = "Parent")
-        }
+        rule.setContent { BoundaryNode(testTag = "Parent") }
 
-        rule.onNodeWithTag("Parent")
-            .onChildren()
-            .assertCountEquals(0)
+        rule.onNodeWithTag("Parent").onChildren().assertCountEquals(0)
     }
 }
diff --git a/compose/ui/ui-test/src/androidInstrumentedTest/kotlin/androidx/compose/ui/test/selectors/FilterSelectorTest.kt b/compose/ui/ui-test/src/androidInstrumentedTest/kotlin/androidx/compose/ui/test/selectors/FilterSelectorTest.kt
index 4769eba..6b35c47 100644
--- a/compose/ui/ui-test/src/androidInstrumentedTest/kotlin/androidx/compose/ui/test/selectors/FilterSelectorTest.kt
+++ b/compose/ui/ui-test/src/androidInstrumentedTest/kotlin/androidx/compose/ui/test/selectors/FilterSelectorTest.kt
@@ -34,8 +34,7 @@
 @RunWith(AndroidJUnit4::class)
 class FilterSelectorTest {
 
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
     @Test
     fun twoNodes_filterOne() {
@@ -46,13 +45,12 @@
             }
         }
 
-        rule.onNodeWithTag("Parent")
+        rule
+            .onNodeWithTag("Parent")
             .onChildren()
             .filter(hasTestTag("Child1"))
             .assertCountEquals(1)
-            .apply {
-                get(0).assert(hasTestTag("Child1"))
-            }
+            .apply { get(0).assert(hasTestTag("Child1")) }
     }
 
     @Test
@@ -64,7 +62,8 @@
             }
         }
 
-        rule.onNodeWithTag("Parent")
+        rule
+            .onNodeWithTag("Parent")
             .onChildren()
             .filter(hasTestTag("Child1") or hasTestTag("Child2"))
             .assertCountEquals(2)
@@ -83,9 +82,6 @@
             }
         }
 
-        rule.onNodeWithTag("Parent")
-            .onChildren()
-            .filter(hasTestTag("Child"))
-            .assertCountEquals(0)
+        rule.onNodeWithTag("Parent").onChildren().filter(hasTestTag("Child")).assertCountEquals(0)
     }
 }
diff --git a/compose/ui/ui-test/src/androidInstrumentedTest/kotlin/androidx/compose/ui/test/selectors/FilterToOneSelectorTest.kt b/compose/ui/ui-test/src/androidInstrumentedTest/kotlin/androidx/compose/ui/test/selectors/FilterToOneSelectorTest.kt
index 0349ed9..f3cd6df 100644
--- a/compose/ui/ui-test/src/androidInstrumentedTest/kotlin/androidx/compose/ui/test/selectors/FilterToOneSelectorTest.kt
+++ b/compose/ui/ui-test/src/androidInstrumentedTest/kotlin/androidx/compose/ui/test/selectors/FilterToOneSelectorTest.kt
@@ -34,8 +34,7 @@
 @RunWith(AndroidJUnit4::class)
 class FilterToOneSelectorTest {
 
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
     @Test
     fun twoNodes_filterToOne() {
@@ -46,7 +45,8 @@
             }
         }
 
-        rule.onNodeWithTag("Parent")
+        rule
+            .onNodeWithTag("Parent")
             .onChildren()
             .filterToOne(hasTestTag("Child1"))
             .assert(hasTestTag("Child1"))
@@ -70,7 +70,8 @@
                 "Nodes found:\n" +
                 "1) "
         ) {
-            rule.onNodeWithTag("Parent")
+            rule
+                .onNodeWithTag("Parent")
                 .onChildren()
                 .filterToOne(hasTestTag("Child1") or hasTestTag("Child2"))
                 .assertExists()
@@ -86,7 +87,8 @@
             }
         }
 
-        rule.onNodeWithTag("Parent")
+        rule
+            .onNodeWithTag("Parent")
             .onChildren()
             .filterToOne(hasTestTag("Child"))
             .assertDoesNotExist()
@@ -107,7 +109,8 @@
                 "Reason: Expected exactly '1' node but could not find any node that satisfies: " +
                 "(((TestTag = 'Parent').children).filterToOne(TestTag = 'Child'))"
         ) {
-            rule.onNodeWithTag("Parent")
+            rule
+                .onNodeWithTag("Parent")
                 .onChildren()
                 .filterToOne(hasTestTag("Child"))
                 .assertExists()
diff --git a/compose/ui/ui-test/src/androidInstrumentedTest/kotlin/androidx/compose/ui/test/selectors/LastNodeSelectorTest.kt b/compose/ui/ui-test/src/androidInstrumentedTest/kotlin/androidx/compose/ui/test/selectors/LastNodeSelectorTest.kt
index 7947e42..88a1696 100644
--- a/compose/ui/ui-test/src/androidInstrumentedTest/kotlin/androidx/compose/ui/test/selectors/LastNodeSelectorTest.kt
+++ b/compose/ui/ui-test/src/androidInstrumentedTest/kotlin/androidx/compose/ui/test/selectors/LastNodeSelectorTest.kt
@@ -34,8 +34,7 @@
 @RunWith(AndroidJUnit4::class)
 class LastNodeSelectorTest {
 
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
     @Test
     fun twoNodes_getLast() {
@@ -46,29 +45,19 @@
             }
         }
 
-        rule.onNodeWithTag("Parent")
-            .onChildren()
-            .onLast()
-            .assert(hasTestTag("Child2"))
+        rule.onNodeWithTag("Parent").onChildren().onLast().assert(hasTestTag("Child2"))
     }
 
     @Test
     fun zeroNodes_getLast() {
-        rule.setContent {
-            BoundaryNode(testTag = "Parent")
-        }
+        rule.setContent { BoundaryNode(testTag = "Parent") }
 
-        rule.onNodeWithTag("Parent")
-            .onChildren()
-            .onLast()
-            .assertDoesNotExist()
+        rule.onNodeWithTag("Parent").onChildren().onLast().assertDoesNotExist()
     }
 
     @Test
     fun zeroNodes_getLast_fail() {
-        rule.setContent {
-            BoundaryNode(testTag = "Parent")
-        }
+        rule.setContent { BoundaryNode(testTag = "Parent") }
 
         expectErrorMessageStartsWith(
             "" +
@@ -76,10 +65,7 @@
                 "Reason: Expected exactly '1' node but could not find any node that satisfies: " +
                 "(((TestTag = 'Parent').children).last)"
         ) {
-            rule.onNodeWithTag("Parent")
-                .onChildren()
-                .onLast()
-                .assertExists()
+            rule.onNodeWithTag("Parent").onChildren().onLast().assertExists()
         }
     }
 }
diff --git a/compose/ui/ui-test/src/androidInstrumentedTest/kotlin/androidx/compose/ui/test/selectors/ParentSelectorTest.kt b/compose/ui/ui-test/src/androidInstrumentedTest/kotlin/androidx/compose/ui/test/selectors/ParentSelectorTest.kt
index e6cbd90..c0eb816 100644
--- a/compose/ui/ui-test/src/androidInstrumentedTest/kotlin/androidx/compose/ui/test/selectors/ParentSelectorTest.kt
+++ b/compose/ui/ui-test/src/androidInstrumentedTest/kotlin/androidx/compose/ui/test/selectors/ParentSelectorTest.kt
@@ -33,39 +33,25 @@
 @RunWith(AndroidJUnit4::class)
 class ParentSelectorTest {
 
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
     @Test
     fun oneParent() {
-        rule.setContent {
-            BoundaryNode(testTag = "Parent") {
-                BoundaryNode(testTag = "Child")
-            }
-        }
+        rule.setContent { BoundaryNode(testTag = "Parent") { BoundaryNode(testTag = "Child") } }
 
-        rule.onNodeWithTag("Child")
-            .onParent()
-            .assert(hasTestTag("Parent"))
+        rule.onNodeWithTag("Child").onParent().assert(hasTestTag("Parent"))
     }
 
     @Test()
     fun noParent() {
-        rule.setContent {
-            BoundaryNode(testTag = "Node")
-        }
+        rule.setContent { BoundaryNode(testTag = "Node") }
 
-        rule.onNodeWithTag("Node")
-            .onParent()
-            .onParent()
-            .assertDoesNotExist()
+        rule.onNodeWithTag("Node").onParent().onParent().assertDoesNotExist()
     }
 
     @Test
     fun noParent_fail() {
-        rule.setContent {
-            BoundaryNode(testTag = "Node")
-        }
+        rule.setContent { BoundaryNode(testTag = "Node") }
 
         expectErrorMessage(
             "" +
@@ -73,10 +59,7 @@
                 "Reason: Expected exactly '1' node but could not find any node that satisfies: " +
                 "(((TestTag = 'Node').parent).parent)"
         ) {
-            rule.onNodeWithTag("Node")
-                .onParent()
-                .onParent()
-                .assertExists()
+            rule.onNodeWithTag("Node").onParent().onParent().assertExists()
         }
     }
 }
diff --git a/compose/ui/ui-test/src/androidInstrumentedTest/kotlin/androidx/compose/ui/test/selectors/SiblingSelectorTest.kt b/compose/ui/ui-test/src/androidInstrumentedTest/kotlin/androidx/compose/ui/test/selectors/SiblingSelectorTest.kt
index 0524551..3954e8a 100644
--- a/compose/ui/ui-test/src/androidInstrumentedTest/kotlin/androidx/compose/ui/test/selectors/SiblingSelectorTest.kt
+++ b/compose/ui/ui-test/src/androidInstrumentedTest/kotlin/androidx/compose/ui/test/selectors/SiblingSelectorTest.kt
@@ -33,8 +33,7 @@
 @RunWith(AndroidJUnit4::class)
 class SiblingSelectorTest {
 
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
     @Test
     fun oneSibling() {
@@ -45,9 +44,7 @@
             }
         }
 
-        rule.onNodeWithTag("Child1")
-            .onSibling()
-            .assert(hasTestTag("Child2"))
+        rule.onNodeWithTag("Child1").onSibling().assert(hasTestTag("Child2"))
     }
 
     @Test
@@ -66,37 +63,22 @@
                 "Reason: Expected exactly '1' node but found '2' nodes that satisfy: " +
                 "((TestTag = 'Child1').sibling)\n" +
                 "Nodes found:"
-
         ) {
-            rule.onNodeWithTag("Child1")
-                .onSibling()
-                .assert(hasTestTag("Child2"))
+            rule.onNodeWithTag("Child1").onSibling().assert(hasTestTag("Child2"))
         }
     }
 
     @Test
     fun noSibling() {
-        rule.setContent {
-            BoundaryNode(testTag = "Parent") {
-                BoundaryNode(testTag = "Child")
-            }
-        }
+        rule.setContent { BoundaryNode(testTag = "Parent") { BoundaryNode(testTag = "Child") } }
 
-        rule.onNodeWithTag("Child")
-            .onSibling()
-            .assertDoesNotExist()
+        rule.onNodeWithTag("Child").onSibling().assertDoesNotExist()
     }
 
     @Test(expected = AssertionError::class)
     fun noSibling_fail() {
-        rule.setContent {
-            BoundaryNode(testTag = "Parent") {
-                BoundaryNode(testTag = "Child")
-            }
-        }
+        rule.setContent { BoundaryNode(testTag = "Parent") { BoundaryNode(testTag = "Child") } }
 
-        rule.onNodeWithTag("Child")
-            .onSibling()
-            .assertExists()
+        rule.onNodeWithTag("Child").onSibling().assertExists()
     }
 }
diff --git a/compose/ui/ui-test/src/androidInstrumentedTest/kotlin/androidx/compose/ui/test/selectors/SiblingsSelectorTest.kt b/compose/ui/ui-test/src/androidInstrumentedTest/kotlin/androidx/compose/ui/test/selectors/SiblingsSelectorTest.kt
index 2bbd799..e912ee1 100644
--- a/compose/ui/ui-test/src/androidInstrumentedTest/kotlin/androidx/compose/ui/test/selectors/SiblingsSelectorTest.kt
+++ b/compose/ui/ui-test/src/androidInstrumentedTest/kotlin/androidx/compose/ui/test/selectors/SiblingsSelectorTest.kt
@@ -33,20 +33,13 @@
 @RunWith(AndroidJUnit4::class)
 class SiblingsSelectorTest {
 
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
     @Test
     fun siblings_noSibling() {
-        rule.setContent {
-            BoundaryNode(testTag = "Parent") {
-                BoundaryNode(testTag = "Child")
-            }
-        }
+        rule.setContent { BoundaryNode(testTag = "Parent") { BoundaryNode(testTag = "Child") } }
 
-        rule.onNodeWithTag("Child")
-            .onSiblings()
-            .assertCountEquals(0)
+        rule.onNodeWithTag("Child").onSiblings().assertCountEquals(0)
     }
 
     @Test
@@ -58,9 +51,7 @@
             }
         }
 
-        rule.onNodeWithTag("Child1")
-            .onSiblings()
-            .assertCountEquals(1)
+        rule.onNodeWithTag("Child1").onSiblings().assertCountEquals(1)
     }
 
     @Test
@@ -73,12 +64,9 @@
             }
         }
 
-        rule.onNodeWithTag("Child2")
-            .onSiblings()
-            .assertCountEquals(2)
-            .apply {
-                get(0).assert(hasTestTag("Child1"))
-                get(1).assert(hasTestTag("Child3"))
-            }
+        rule.onNodeWithTag("Child2").onSiblings().assertCountEquals(2).apply {
+            get(0).assert(hasTestTag("Child1"))
+            get(1).assert(hasTestTag("Child3"))
+        }
     }
 }
diff --git a/compose/ui/ui-test/src/androidInstrumentedTest/kotlin/androidx/compose/ui/test/util/BoundaryNodes.kt b/compose/ui/ui-test/src/androidInstrumentedTest/kotlin/androidx/compose/ui/test/util/BoundaryNodes.kt
index 4cdc70f..1f64429 100644
--- a/compose/ui/ui-test/src/androidInstrumentedTest/kotlin/androidx/compose/ui/test/util/BoundaryNodes.kt
+++ b/compose/ui/ui-test/src/androidInstrumentedTest/kotlin/androidx/compose/ui/test/util/BoundaryNodes.kt
@@ -22,17 +22,11 @@
 import androidx.compose.ui.platform.testTag
 
 @Composable
-fun BoundaryNode(
-    testTag: String,
-    content: @Composable () -> Unit
-) {
+fun BoundaryNode(testTag: String, content: @Composable () -> Unit) {
     Column(Modifier.testTag(testTag)) { content() }
 }
 
 @Composable
-fun BoundaryNode(
-    testTag: String,
-    modifier: Modifier = Modifier
-) {
+fun BoundaryNode(testTag: String, modifier: Modifier = Modifier) {
     Column(modifier.testTag(testTag)) {}
 }
diff --git a/compose/ui/ui-test/src/androidInstrumentedTest/kotlin/androidx/compose/ui/test/util/ClickableTestBox.kt b/compose/ui/ui-test/src/androidInstrumentedTest/kotlin/androidx/compose/ui/test/util/ClickableTestBox.kt
index 69d84dc..dbed0d4 100644
--- a/compose/ui/ui-test/src/androidInstrumentedTest/kotlin/androidx/compose/ui/test/util/ClickableTestBox.kt
+++ b/compose/ui/ui-test/src/androidInstrumentedTest/kotlin/androidx/compose/ui/test/util/ClickableTestBox.kt
@@ -44,9 +44,8 @@
 ) {
     with(LocalDensity.current) {
         Box(
-            modifier = modifier.testTag(tag)
-                .requiredSize(width.toDp(), height.toDp())
-                .background(color)
+            modifier =
+                modifier.testTag(tag).requiredSize(width.toDp(), height.toDp()).background(color)
         )
     }
 }
diff --git a/compose/ui/ui-test/src/androidInstrumentedTest/kotlin/androidx/compose/ui/test/util/PointerInputs.kt b/compose/ui/ui-test/src/androidInstrumentedTest/kotlin/androidx/compose/ui/test/util/PointerInputs.kt
index 9e47232..c1db682 100644
--- a/compose/ui/ui-test/src/androidInstrumentedTest/kotlin/androidx/compose/ui/test/util/PointerInputs.kt
+++ b/compose/ui/ui-test/src/androidInstrumentedTest/kotlin/androidx/compose/ui/test/util/PointerInputs.kt
@@ -45,7 +45,10 @@
     val buttons: PointerButtons,
     val keyboardModifiers: PointerKeyboardModifiers,
 ) {
-    constructor(change: PointerInputChange, event: PointerEvent) : this(
+    constructor(
+        change: PointerInputChange,
+        event: PointerEvent
+    ) : this(
         change.id,
         change.uptimeMillis,
         change.position,
@@ -57,8 +60,11 @@
         event.keyboardModifiers,
     )
 
-    val x get() = position.x
-    val y get() = position.y
+    val x
+        get() = position.x
+
+    val y
+        get() = position.y
 }
 
 /**
@@ -66,15 +72,16 @@
  * [PointerEventPass.Initial] phase, without consuming anything. This modifier is supposed to be
  * completely transparent to the rest of the system.
  *
- * Does not support multiple pointers: all [PointerInputChange]s are flattened in the recorded
- * list.
+ * Does not support multiple pointers: all [PointerInputChange]s are flattened in the recorded list.
  */
 class SinglePointerInputRecorder : PointerInputModifier {
     private val _events = mutableListOf<DataPoint>()
-    val events get() = _events as List<DataPoint>
+    val events
+        get() = _events as List<DataPoint>
 
     private val velocityTracker = VelocityTracker()
-    val recordedVelocity get() = velocityTracker.calculateVelocity()
+    val recordedVelocity
+        get() = velocityTracker.calculateVelocity()
 
     override val pointerInputFilter = RecordingFilter { event ->
         event.changes.forEach {
@@ -89,17 +96,20 @@
  * [PointerEventPass.Initial] phase, without consuming anything. This modifier is supposed to be
  * completely transparent to the rest of the system.
  *
- * Supports multiple pointers: the set of [PointerInputChange]s from each event is kept together
- * in the recorded list.
+ * Supports multiple pointers: the set of [PointerInputChange]s from each event is kept together in
+ * the recorded list.
  */
 class MultiPointerInputRecorder : PointerInputModifier {
     data class Event(val pointers: List<DataPoint>) {
-        val pointerCount: Int get() = pointers.size
+        val pointerCount: Int
+            get() = pointers.size
+
         fun getPointer(index: Int) = pointers[index]
     }
 
     private val _events = mutableListOf<Event>()
-    val events get() = _events as List<Event>
+    val events
+        get() = _events as List<Event>
 
     override val pointerInputFilter = RecordingFilter { event ->
         _events.add(Event(event.changes.map { DataPoint(it, event) }))
@@ -111,9 +121,7 @@
  * [PointerEventPass.Initial] pass. Does not consume anything itself, although implementation can
  * (but really shouldn't).
  */
-class RecordingFilter(
-    private val record: (PointerEvent) -> Unit
-) : PointerInputFilter() {
+class RecordingFilter(private val record: (PointerEvent) -> Unit) : PointerInputFilter() {
     override fun onPointerEvent(
         pointerEvent: PointerEvent,
         pass: PointerEventPass,
@@ -129,7 +137,8 @@
     }
 }
 
-val SinglePointerInputRecorder.downEvents get() = events.filter { it.down }
+val SinglePointerInputRecorder.downEvents
+    get() = events.filter { it.down }
 
 val SinglePointerInputRecorder.recordedDurationMillis: Long
     get() {
@@ -181,9 +190,7 @@
     assertThat(events).hasSize(verifiers.size)
     if (events.isNotEmpty()) {
         assertTimestampsAreIncreasing()
-        events.zip(verifiers) { event, verification ->
-            verification.invoke(event)
-        }
+        events.zip(verifiers) { event, verification -> verification.invoke(event) }
     }
 }
 
@@ -214,23 +221,19 @@
     assertWithMessage("keyModifiers$s").that(keyboardModifiers).isEqualTo(expectedKeyboardModifiers)
 }
 
-/**
- * Checks that the coordinates are progressing in a monotonous direction
- */
+/** Checks that the coordinates are progressing in a monotonous direction */
 fun List<DataPoint>.isMonotonicBetween(start: Offset, end: Offset) {
     map { it.x }.isMonotonicBetween(start.x, end.x, 1e-3f)
     map { it.y }.isMonotonicBetween(start.y, end.y, 1e-3f)
 }
 
 fun List<DataPoint>.hasSameTimeBetweenEvents() {
-    zipWithNext { a, b -> b.timestamp - a.timestamp }.sorted().apply {
-        assertThat(last() - first()).isAtMost(1L)
-    }
+    zipWithNext { a, b -> b.timestamp - a.timestamp }
+        .sorted()
+        .apply { assertThat(last() - first()).isAtMost(1L) }
 }
 
 fun List<DataPoint>.areSampledFromCurve(curve: (Long) -> Offset) {
     val t0 = first().timestamp
-    forEach {
-        it.position.isAlmostEqualTo(curve(it.timestamp - t0))
-    }
+    forEach { it.position.isAlmostEqualTo(curve(it.timestamp - t0)) }
 }
diff --git a/compose/ui/ui-test/src/androidMain/kotlin/androidx/compose/ui/test/Actions.android.kt b/compose/ui/ui-test/src/androidMain/kotlin/androidx/compose/ui/test/Actions.android.kt
index 9f93810..acfbe9f 100644
--- a/compose/ui/ui-test/src/androidMain/kotlin/androidx/compose/ui/test/Actions.android.kt
+++ b/compose/ui/ui-test/src/androidMain/kotlin/androidx/compose/ui/test/Actions.android.kt
@@ -17,7 +17,5 @@
 package androidx.compose.ui.test
 
 internal actual fun SemanticsNodeInteraction.performClickImpl(): SemanticsNodeInteraction {
-    return performTouchInput {
-        click()
-    }
+    return performTouchInput { click() }
 }
diff --git a/compose/ui/ui-test/src/androidMain/kotlin/androidx/compose/ui/test/AndroidAssertions.android.kt b/compose/ui/ui-test/src/androidMain/kotlin/androidx/compose/ui/test/AndroidAssertions.android.kt
index 4e2edc9..354c2c1 100644
--- a/compose/ui/ui-test/src/androidMain/kotlin/androidx/compose/ui/test/AndroidAssertions.android.kt
+++ b/compose/ui/ui-test/src/androidMain/kotlin/androidx/compose/ui/test/AndroidAssertions.android.kt
@@ -65,10 +65,11 @@
 
 internal actual fun SemanticsNode.clippedNodeBoundsInWindow(): Rect {
     val composeView = (root as ViewRootForTest).view
-    val rootLocationInWindow = intArrayOf(0, 0).let {
-        composeView.getLocationInWindow(it)
-        Offset(it[0].toFloat(), it[1].toFloat())
-    }
+    val rootLocationInWindow =
+        intArrayOf(0, 0).let {
+            composeView.getLocationInWindow(it)
+            Offset(it[0].toFloat(), it[1].toFloat())
+        }
     return boundsInRoot.translate(rootLocationInWindow)
 }
 
@@ -95,25 +96,24 @@
             nodeBoundsInWindow.bottom <= globalRootRect.bottom
     } else {
         // assertIsDisplayed only throws if the element is fully offscreen
-        !nodeBoundsInWindow.intersect(
-            Rect(
-                globalRootRect.left.toFloat(),
-                globalRootRect.top.toFloat(),
-                globalRootRect.right.toFloat(),
-                globalRootRect.bottom.toFloat()
+        !nodeBoundsInWindow
+            .intersect(
+                Rect(
+                    globalRootRect.left.toFloat(),
+                    globalRootRect.top.toFloat(),
+                    globalRootRect.right.toFloat(),
+                    globalRootRect.bottom.toFloat()
+                )
             )
-        ).isEmpty
+            .isEmpty
     }
 }
 
 /**
- * Executes [selector] on every parent of this [LayoutInfo] and returns the closest
- * [LayoutInfo] to return `true` from [selector] or null if [selector] returns false
- * for all ancestors.
+ * Executes [selector] on every parent of this [LayoutInfo] and returns the closest [LayoutInfo] to
+ * return `true` from [selector] or null if [selector] returns false for all ancestors.
  */
-private fun LayoutInfo.findClosestParentNode(
-    selector: (LayoutInfo) -> Boolean
-): LayoutInfo? {
+private fun LayoutInfo.findClosestParentNode(selector: (LayoutInfo) -> Boolean): LayoutInfo? {
     var currentParent = this.parentInfo
     while (currentParent != null) {
         if (selector(currentParent)) {
diff --git a/compose/ui/ui-test/src/androidMain/kotlin/androidx/compose/ui/test/AndroidImageHelpers.android.kt b/compose/ui/ui-test/src/androidMain/kotlin/androidx/compose/ui/test/AndroidImageHelpers.android.kt
index d6a5d94..8e3aa90 100644
--- a/compose/ui/ui-test/src/androidMain/kotlin/androidx/compose/ui/test/AndroidImageHelpers.android.kt
+++ b/compose/ui/ui-test/src/androidMain/kotlin/androidx/compose/ui/test/AndroidImageHelpers.android.kt
@@ -38,10 +38,10 @@
 import kotlin.math.roundToInt
 
 /**
- * Captures the underlying semantics node's surface into bitmap. This can be used to capture
- * nodes in a normal composable, a dialog if API >=28 and in a Popup. Note that the mechanism
- * used to capture the bitmap from a Popup is not the same as from a normal composable, since
- * a PopUp is in a different window.
+ * Captures the underlying semantics node's surface into bitmap. This can be used to capture nodes
+ * in a normal composable, a dialog if API >=28 and in a Popup. Note that the mechanism used to
+ * capture the bitmap from a Popup is not the same as from a normal composable, since a PopUp is in
+ * a different window.
  *
  * @throws IllegalArgumentException if we attempt to capture a bitmap of a dialog before API 28.
  */
@@ -50,9 +50,10 @@
 fun SemanticsNodeInteraction.captureToImage(): ImageBitmap {
     val node = fetchSemanticsNode("Failed to capture a node to bitmap.")
     // Validate we are in popup
-    val popupParentMaybe = node.findClosestParentNode(includeSelf = true) {
-        it.config.contains(SemanticsProperties.IsPopup)
-    }
+    val popupParentMaybe =
+        node.findClosestParentNode(includeSelf = true) {
+            it.config.contains(SemanticsProperties.IsPopup)
+        }
     if (popupParentMaybe != null) {
         return processMultiWindowScreenshot(node, testContext)
     }
@@ -60,9 +61,10 @@
     val view = (node.root as ViewRootForTest).view
 
     // If we are in dialog use its window to capture the bitmap
-    val dialogParentNodeMaybe = node.findClosestParentNode(includeSelf = true) {
-        it.config.contains(SemanticsProperties.IsDialog)
-    }
+    val dialogParentNodeMaybe =
+        node.findClosestParentNode(includeSelf = true) {
+            it.config.contains(SemanticsProperties.IsDialog)
+        }
     var dialogWindow: Window? = null
     if (dialogParentNodeMaybe != null) {
         if (Build.VERSION.SDK_INT < Build.VERSION_CODES.P) {
@@ -70,21 +72,23 @@
             throw IllegalArgumentException("Cannot currently capture dialogs on API lower than 28!")
         }
 
-        dialogWindow = findDialogWindowProviderInParent(view)?.window
-            ?: throw IllegalArgumentException(
-                "Could not find a dialog window provider to capture its bitmap"
-            )
+        dialogWindow =
+            findDialogWindowProviderInParent(view)?.window
+                ?: throw IllegalArgumentException(
+                    "Could not find a dialog window provider to capture its bitmap"
+                )
     }
 
     val windowToUse = dialogWindow ?: view.context.getActivityWindow()
 
     val nodeBounds = node.boundsInRoot
-    val nodeBoundsRect = Rect(
-        nodeBounds.left.roundToInt(),
-        nodeBounds.top.roundToInt(),
-        nodeBounds.right.roundToInt(),
-        nodeBounds.bottom.roundToInt()
-    )
+    val nodeBoundsRect =
+        Rect(
+            nodeBounds.left.roundToInt(),
+            nodeBounds.top.roundToInt(),
+            nodeBounds.right.roundToInt(),
+            nodeBounds.bottom.roundToInt()
+        )
 
     val locationInWindow = intArrayOf(0, 0)
     view.getLocationInWindow(locationInWindow)
@@ -111,19 +115,18 @@
 
     val combinedBitmap = InstrumentationRegistry.getInstrumentation().uiAutomation.takeScreenshot()
 
-    val finalBitmap = Bitmap.createBitmap(
-        combinedBitmap,
-        (nodePositionInScreen.x + nodeBoundsInRoot.left).roundToInt(),
-        (nodePositionInScreen.y + nodeBoundsInRoot.top).roundToInt(),
-        nodeBoundsInRoot.width.roundToInt(),
-        nodeBoundsInRoot.height.roundToInt()
-    )
+    val finalBitmap =
+        Bitmap.createBitmap(
+            combinedBitmap,
+            (nodePositionInScreen.x + nodeBoundsInRoot.left).roundToInt(),
+            (nodePositionInScreen.y + nodeBoundsInRoot.top).roundToInt(),
+            nodeBoundsInRoot.width.roundToInt(),
+            nodeBoundsInRoot.height.roundToInt()
+        )
     return finalBitmap.asImageBitmap()
 }
 
-private fun findNodePosition(
-    node: SemanticsNode
-): Offset {
+private fun findNodePosition(node: SemanticsNode): Offset {
     val view = (node.root as ViewRootForTest).view
     val locationOnScreen = intArrayOf(0, 0)
     view.getLocationOnScreen(locationOnScreen)
@@ -149,10 +152,11 @@
         return when (this) {
             is Activity -> this
             is ContextWrapper -> this.baseContext.getActivity()
-            else -> throw IllegalStateException(
-                "Context is not an Activity context, but a ${javaClass.simpleName} context. " +
-                    "An Activity context is required to get a Window instance"
-            )
+            else ->
+                throw IllegalStateException(
+                    "Context is not an Activity context, but a ${javaClass.simpleName} context. " +
+                        "An Activity context is required to get a Window instance"
+                )
         }
     }
     return getActivity().window
diff --git a/compose/ui/ui-test/src/androidMain/kotlin/androidx/compose/ui/test/AndroidInputDispatcher.android.kt b/compose/ui/ui-test/src/androidMain/kotlin/androidx/compose/ui/test/AndroidInputDispatcher.android.kt
index 1f4cee0..926a031 100644
--- a/compose/ui/ui-test/src/androidMain/kotlin/androidx/compose/ui/test/AndroidInputDispatcher.android.kt
+++ b/compose/ui/ui-test/src/androidMain/kotlin/androidx/compose/ui/test/AndroidInputDispatcher.android.kt
@@ -67,13 +67,15 @@
                 when (it.source) {
                     SOURCE_TOUCHSCREEN -> view.dispatchTouchEvent(it)
                     SOURCE_ROTARY_ENCODER -> view.dispatchGenericMotionEvent(it)
-                    SOURCE_MOUSE -> when (it.action) {
-                        in MouseAsTouchEvents -> view.dispatchTouchEvent(it)
-                        else -> view.dispatchGenericMotionEvent(it)
-                    }
-                    else -> throw IllegalArgumentException(
-                        "Can't dispatch MotionEvents with source ${it.source}"
-                    )
+                    SOURCE_MOUSE ->
+                        when (it.action) {
+                            in MouseAsTouchEvents -> view.dispatchTouchEvent(it)
+                            else -> view.dispatchGenericMotionEvent(it)
+                        }
+                    else ->
+                        throw IllegalArgumentException(
+                            "Can't dispatch MotionEvents with source ${it.source}"
+                        )
                 }
             }
         }
@@ -127,9 +129,8 @@
             actionIndex = 0,
             pointerIds = List(entries.size) { entries[it].key },
             eventTimes = absoluteHistoricalTimes + listOf(currentTime),
-            coordinates = List(entries.size) {
-                historicalCoordinates[it] + listOf(entries[it].value)
-            }
+            coordinates =
+                List(entries.size) { historicalCoordinates[it] + listOf(entries[it].value) }
         )
     }
 
@@ -238,9 +239,7 @@
         )
     }
 
-    /**
-     * Generates an event with the given parameters.
-     */
+    /** Generates an event with the given parameters. */
     private fun enqueueTouchEvent(
         downTime: Long,
         action: Int,
@@ -275,79 +274,90 @@
                 root.view.getLocationOnScreen(array)
                 Offset(array[0].toFloat(), array[1].toFloat())
             }
-            val motionEvent = MotionEvent.obtain(
-                /* downTime = */ downTime,
-                /* eventTime = */ eventTimes[0],
-                /* action = */ action + (actionIndex shl ACTION_POINTER_INDEX_SHIFT),
-                /* pointerCount = */ coordinates.size,
-                /* pointerProperties = */ Array(coordinates.size) { pointerIndex ->
-                    PointerProperties().apply {
-                        id = pointerIds[pointerIndex]
-                        toolType = MotionEvent.TOOL_TYPE_FINGER
-                    }
-                },
-                /* pointerCoords = */ Array(coordinates.size) { pointerIndex ->
-                    PointerCoords().apply {
-
-                        val startOffset = coordinates[pointerIndex][0]
-
-                        // Allows for non-valid numbers/Offsets to be passed along to Compose to
-                        // test if it handles them properly (versus breaking here and we not knowing
-                        // if Compose properly handles these values).
-                        x = if (startOffset.isValid()) {
-                            positionInScreen.x + startOffset.x
-                        } else {
-                            Float.NaN
-                        }
-
-                        y = if (startOffset.isValid()) {
-                            positionInScreen.y + startOffset.y
-                        } else {
-                            Float.NaN
-                        }
-                    }
-                },
-                /* metaState = */ 0,
-                /* buttonState = */ 0,
-                /* xPrecision = */ 1f,
-                /* yPrecision = */ 1f,
-                /* deviceId = */ 0,
-                /* edgeFlags = */ 0,
-                /* source = */ SOURCE_TOUCHSCREEN,
-                /* flags = */ 0
-            ).apply {
-                // The current time & coordinates are the last element in the lists, and need to
-                // be passed into the final addBatch call. If there are no historical events,
-                // the list sizes are 1 and we don't need to call addBatch at all.
-                for (timeIndex in 1 until eventTimes.size) {
-                    addBatch(
-                        /* eventTime = */ eventTimes[timeIndex],
-                        /* pointerCoords = */ Array(coordinates.size) { pointerIndex ->
-                            PointerCoords().apply {
-                                val currentOffset = coordinates[pointerIndex][timeIndex]
-
-                                // Allows for non-valid numbers/Offsets to be passed along to
-                                // Compose to test if it handles them properly (versus breaking
-                                // here and we not knowing if Compose properly handles these
-                                // values).
-                                x = if (currentOffset.isValid()) {
-                                    positionInScreen.x + currentOffset.x
-                                } else {
-                                    Float.NaN
-                                }
-
-                                y = if (currentOffset.isValid()) {
-                                    positionInScreen.y + currentOffset.y
-                                } else {
-                                    Float.NaN
-                                }
+            val motionEvent =
+                MotionEvent.obtain(
+                        /* downTime = */ downTime,
+                        /* eventTime = */ eventTimes[0],
+                        /* action = */ action + (actionIndex shl ACTION_POINTER_INDEX_SHIFT),
+                        /* pointerCount = */ coordinates.size,
+                        /* pointerProperties = */ Array(coordinates.size) { pointerIndex ->
+                            PointerProperties().apply {
+                                id = pointerIds[pointerIndex]
+                                toolType = MotionEvent.TOOL_TYPE_FINGER
                             }
                         },
-                        /* metaState = */ 0
+                        /* pointerCoords = */ Array(coordinates.size) { pointerIndex ->
+                            PointerCoords().apply {
+                                val startOffset = coordinates[pointerIndex][0]
+
+                                // Allows for non-valid numbers/Offsets to be passed along to
+                                // Compose to
+                                // test if it handles them properly (versus breaking here and we not
+                                // knowing
+                                // if Compose properly handles these values).
+                                x =
+                                    if (startOffset.isValid()) {
+                                        positionInScreen.x + startOffset.x
+                                    } else {
+                                        Float.NaN
+                                    }
+
+                                y =
+                                    if (startOffset.isValid()) {
+                                        positionInScreen.y + startOffset.y
+                                    } else {
+                                        Float.NaN
+                                    }
+                            }
+                        },
+                        /* metaState = */ 0,
+                        /* buttonState = */ 0,
+                        /* xPrecision = */ 1f,
+                        /* yPrecision = */ 1f,
+                        /* deviceId = */ 0,
+                        /* edgeFlags = */ 0,
+                        /* source = */ SOURCE_TOUCHSCREEN,
+                        /* flags = */ 0
                     )
-                }
-                offsetLocation(-positionInScreen.x, -positionInScreen.y)
-            }
+                    .apply {
+                        // The current time & coordinates are the last element in the lists, and
+                        // need to
+                        // be passed into the final addBatch call. If there are no historical
+                        // events,
+                        // the list sizes are 1 and we don't need to call addBatch at all.
+                        for (timeIndex in 1 until eventTimes.size) {
+                            addBatch(
+                                /* eventTime = */ eventTimes[timeIndex],
+                                /* pointerCoords = */ Array(coordinates.size) { pointerIndex ->
+                                    PointerCoords().apply {
+                                        val currentOffset = coordinates[pointerIndex][timeIndex]
+
+                                        // Allows for non-valid numbers/Offsets to be passed along
+                                        // to
+                                        // Compose to test if it handles them properly (versus
+                                        // breaking
+                                        // here and we not knowing if Compose properly handles these
+                                        // values).
+                                        x =
+                                            if (currentOffset.isValid()) {
+                                                positionInScreen.x + currentOffset.x
+                                            } else {
+                                                Float.NaN
+                                            }
+
+                                        y =
+                                            if (currentOffset.isValid()) {
+                                                positionInScreen.y + currentOffset.y
+                                            } else {
+                                                Float.NaN
+                                            }
+                                    }
+                                },
+                                /* metaState = */ 0
+                            )
+                        }
+                        offsetLocation(-positionInScreen.x, -positionInScreen.y)
+                    }
 
             batchedEvents.add(motionEvent)
         }
@@ -395,36 +405,35 @@
             }
             batchedEvents.add(
                 MotionEvent.obtain(
-                    /* downTime = */ downTime,
-                    /* eventTime = */ eventTime,
-                    /* action = */ action,
-                    /* pointerCount = */ 1,
-                    /* pointerProperties = */ arrayOf(
-                        PointerProperties().apply {
-                            id = 0
-                            toolType = MotionEvent.TOOL_TYPE_MOUSE
-                        }
-                    ),
-                    /* pointerCoords = */ arrayOf(
-                        PointerCoords().apply {
-                            x = positionInScreen.x + coordinate.x
-                            y = positionInScreen.y + coordinate.y
-                            if (axis != -1) {
-                                setAxisValue(axis, axisDelta)
+                        /* downTime = */ downTime,
+                        /* eventTime = */ eventTime,
+                        /* action = */ action,
+                        /* pointerCount = */ 1,
+                        /* pointerProperties = */ arrayOf(
+                            PointerProperties().apply {
+                                id = 0
+                                toolType = MotionEvent.TOOL_TYPE_MOUSE
                             }
-                        }
-                    ),
-                    /* metaState = */ metaState,
-                    /* buttonState = */ buttonState,
-                    /* xPrecision = */ 1f,
-                    /* yPrecision = */ 1f,
-                    /* deviceId = */ 0,
-                    /* edgeFlags = */ 0,
-                    /* source = */ SOURCE_MOUSE,
-                    /* flags = */ 0
-                ).apply {
-                    offsetLocation(-positionInScreen.x, -positionInScreen.y)
-                }
+                        ),
+                        /* pointerCoords = */ arrayOf(
+                            PointerCoords().apply {
+                                x = positionInScreen.x + coordinate.x
+                                y = positionInScreen.y + coordinate.y
+                                if (axis != -1) {
+                                    setAxisValue(axis, axisDelta)
+                                }
+                            }
+                        ),
+                        /* metaState = */ metaState,
+                        /* buttonState = */ buttonState,
+                        /* xPrecision = */ 1f,
+                        /* yPrecision = */ 1f,
+                        /* deviceId = */ 0,
+                        /* edgeFlags = */ 0,
+                        /* source = */ SOURCE_MOUSE,
+                        /* flags = */ 0
+                    )
+                    .apply { offsetLocation(-positionInScreen.x, -positionInScreen.y) }
             )
         }
     }
@@ -443,10 +452,7 @@
         )
     }
 
-    private fun enqueueRotaryScrollEvent(
-        eventTime: Long,
-        scrollPixels: Float
-    ) {
+    private fun enqueueRotaryScrollEvent(eventTime: Long, scrollPixels: Float) {
         synchronized(batchLock) {
             ensureNotDisposed {
                 "Can't enqueue rotary scroll event (" +
@@ -466,9 +472,7 @@
                         }
                     ),
                     /* pointerCoords = */ arrayOf(
-                        PointerCoords().apply {
-                            setAxisValue(AXIS_SCROLL, scrollPixels)
-                        }
+                        PointerCoords().apply { setAxisValue(AXIS_SCROLL, scrollPixels) }
                     ),
                     /* metaState = */ 0,
                     /* buttonState = */ 0,
@@ -484,17 +488,13 @@
     }
 
     /**
-     * Generates a KeyEvent with the given [action] and [keyCode] and adds the KeyEvent to
-     * the batch.
+     * Generates a KeyEvent with the given [action] and [keyCode] and adds the KeyEvent to the
+     * batch.
      *
      * @see KeyEvent.getAction
      * @see KeyEvent.getKeyCode
      */
-    private fun KeyInputState.enqueueKeyEvent(
-        action: Int,
-        keyCode: Int,
-        metaState: Int
-    ) {
+    private fun KeyInputState.enqueueKeyEvent(action: Int, keyCode: Int, metaState: Int) {
         enqueueKeyEvent(
             downTime = downTime,
             eventTime = currentTime,
@@ -505,9 +505,7 @@
         )
     }
 
-    /**
-     * Generates a key event with the given parameters.
-     */
+    /** Generates a key event with the given parameters. */
     private fun enqueueKeyEvent(
         downTime: Long,
         eventTime: Long,
@@ -527,18 +525,19 @@
                     "metaState=$metaState)"
             }
 
-            val keyEvent = KeyEvent(
-                /* downTime = */ downTime,
-                /* eventTime = */ eventTime,
-                /* action = */ action,
-                /* code = */ code,
-                /* repeat = */ repeat,
-                /* metaState = */ metaState,
-                /* deviceId = */ KeyCharacterMap.VIRTUAL_KEYBOARD,
-                /* scancode = */ 0
-            )
+            val keyEvent =
+                KeyEvent(
+                    /* downTime = */ downTime,
+                    /* eventTime = */ eventTime,
+                    /* action = */ action,
+                    /* code = */ code,
+                    /* repeat = */ repeat,
+                    /* metaState = */ metaState,
+                    /* deviceId = */ KeyCharacterMap.VIRTUAL_KEYBOARD,
+                    /* scancode = */ 0
+                )
 
-             batchedEvents.add(keyEvent)
+            batchedEvents.add(keyEvent)
         }
     }
 
@@ -546,13 +545,14 @@
         // Must inject on the main thread, because it might modify View properties
         @OptIn(InternalTestApi::class)
         testContext.testOwner.runOnUiThread {
-            val events = synchronized(batchLock) {
-                ensureNotDisposed { "Can't flush events" }
-                mutableListOf<InputEvent>().apply {
-                    addAll(batchedEvents)
-                    batchedEvents.clear()
+            val events =
+                synchronized(batchLock) {
+                    ensureNotDisposed { "Can't flush events" }
+                    mutableListOf<InputEvent>().apply {
+                        addAll(batchedEvents)
+                        batchedEvents.clear()
+                    }
                 }
-            }
 
             events.forEach { event ->
                 // Before injecting the next event, pump the clock
@@ -573,25 +573,19 @@
     }
 
     private fun ensureNotDisposed(lazyMessage: () -> String) {
-        check(!disposed) {
-            "${lazyMessage()}, AndroidInputDispatcher has already been disposed"
-        }
+        check(!disposed) { "${lazyMessage()}, AndroidInputDispatcher has already been disposed" }
     }
 
     override fun onDispose() {
         synchronized(batchLock) {
             if (!disposed) {
                 disposed = true
-                batchedEvents.forEach {
-                    recycleEventIfPossible(it)
-                }
+                batchedEvents.forEach { recycleEventIfPossible(it) }
             }
         }
     }
 
-    /**
-     * Sends and recycles the given [event].
-     */
+    /** Sends and recycles the given [event]. */
     private fun sendAndRecycleEvent(event: InputEvent) {
         try {
             sendEvent(event)
diff --git a/compose/ui/ui-test/src/androidMain/kotlin/androidx/compose/ui/test/AndroidSynchronization.android.kt b/compose/ui/ui-test/src/androidMain/kotlin/androidx/compose/ui/test/AndroidSynchronization.android.kt
index 2981532..af204e4 100644
--- a/compose/ui/ui-test/src/androidMain/kotlin/androidx/compose/ui/test/AndroidSynchronization.android.kt
+++ b/compose/ui/ui-test/src/androidMain/kotlin/androidx/compose/ui/test/AndroidSynchronization.android.kt
@@ -43,9 +43,7 @@
     }
 }
 
-/**
- * Returns if the call is made on the main thread.
- */
+/** Returns if the call is made on the main thread. */
 internal fun isOnUiThread(): Boolean {
     return Looper.myLooper() == Looper.getMainLooper()
 }
diff --git a/compose/ui/ui-test/src/androidMain/kotlin/androidx/compose/ui/test/ComposeIdlingResource.android.kt b/compose/ui/ui-test/src/androidMain/kotlin/androidx/compose/ui/test/ComposeIdlingResource.android.kt
index bab56602..1f2f0d4 100644
--- a/compose/ui/ui-test/src/androidMain/kotlin/androidx/compose/ui/test/ComposeIdlingResource.android.kt
+++ b/compose/ui/ui-test/src/androidMain/kotlin/androidx/compose/ui/test/ComposeIdlingResource.android.kt
@@ -25,8 +25,8 @@
 /**
  * Provides an idle check to be registered into Espresso.
  *
- * This makes sure that Espresso is able to wait for any pending changes in Compose. This
- * resource is automatically registered when any compose testing APIs are used including
+ * This makes sure that Espresso is able to wait for any pending changes in Compose. This resource
+ * is automatically registered when any compose testing APIs are used including
  * [createAndroidComposeRule].
  */
 internal class ComposeIdlingResource(
@@ -63,8 +63,8 @@
                 hadSnapshotChanges = Snapshot.current.hasPendingChanges()
                 hadRecomposerChanges = mainRecomposer.hasPendingWork
 
-                val needsRecompose = hadAwaitersOnMainClock || hadSnapshotChanges ||
-                    hadRecomposerChanges
+                val needsRecompose =
+                    hadAwaitersOnMainClock || hadSnapshotChanges || hadRecomposerChanges
                 return clock.autoAdvance && needsRecompose
             }
 
@@ -83,14 +83,16 @@
             val composeRoots = composeRootRegistry.getRegisteredComposeRoots()
             hadPendingMeasureLayout = composeRoots.any { it.shouldWaitForMeasureAndLayout }
 
-            return !composeDidWork &&
-                !hadPendingSetContent &&
-                !hadPendingMeasureLayout
+            return !composeDidWork && !hadPendingSetContent && !hadPendingMeasureLayout
         }
 
     override fun getDiagnosticMessageIfBusy(): String? {
-        val wasBusy = hadSnapshotChanges || hadRecomposerChanges || hadAwaitersOnMainClock ||
-            hadPendingSetContent || hadPendingMeasureLayout
+        val wasBusy =
+            hadSnapshotChanges ||
+                hadRecomposerChanges ||
+                hadAwaitersOnMainClock ||
+                hadPendingSetContent ||
+                hadPendingMeasureLayout
 
         if (!wasBusy) {
             return null
@@ -110,8 +112,9 @@
 
         var message = "${javaClass.simpleName} is busy due to ${busyReasons.joinToString(", ")}.\n"
         if (busyRecomposing) {
-            message += "- Note: Timeout on pending recomposition means that there are most likely" +
-                " infinite re-compositions happening in the tested code.\n"
+            message +=
+                "- Note: Timeout on pending recomposition means that there are most likely" +
+                    " infinite re-compositions happening in the tested code.\n"
             message += "- Debug: hadRecomposerChanges = $hadRecomposerChanges, "
             message += "hadSnapshotChanges = $hadSnapshotChanges, "
             message += "hadAwaitersOnMainClock = $hadAwaitersOnMainClock"
@@ -129,9 +132,9 @@
     }
 
 /**
- * Whether or not we should wait until this root has done a measure/layout pass. Not necessarily
- * the same as if the root has a pending measure/layout pass, e.g. if the pending measure/layout
- * pass will never happen because the containing View is GONE anyway.
+ * Whether or not we should wait until this root has done a measure/layout pass. Not necessarily the
+ * same as if the root has a pending measure/layout pass, e.g. if the pending measure/layout pass
+ * will never happen because the containing View is GONE anyway.
  */
 internal val ViewRootForTest.shouldWaitForMeasureAndLayout: Boolean
     get() {
@@ -155,9 +158,9 @@
     }
 
 /**
- * Return the effective visibility of the View, which accounts for the visibility of ancestors.
- * If the view or any of its ancestors is GONE, this view is GONE. Otherwise, if this view or any
- * of its ancestors is INVISIBLE, this view is INVISIBLE. Otherwise, this view is VISIBLE.
+ * Return the effective visibility of the View, which accounts for the visibility of ancestors. If
+ * the view or any of its ancestors is GONE, this view is GONE. Otherwise, if this view or any of
+ * its ancestors is INVISIBLE, this view is INVISIBLE. Otherwise, this view is VISIBLE.
  */
 private val View.effectiveVisibility: Int
     get() {
diff --git a/compose/ui/ui-test/src/androidMain/kotlin/androidx/compose/ui/test/ComposeRootRegistry.android.kt b/compose/ui/ui-test/src/androidMain/kotlin/androidx/compose/ui/test/ComposeRootRegistry.android.kt
index cc24adc..d176fc5 100644
--- a/compose/ui/ui-test/src/androidMain/kotlin/androidx/compose/ui/test/ComposeRootRegistry.android.kt
+++ b/compose/ui/ui-test/src/androidMain/kotlin/androidx/compose/ui/test/ComposeRootRegistry.android.kt
@@ -34,9 +34,8 @@
 import kotlinx.coroutines.suspendCancellableCoroutine
 
 /**
- * Registry where all views implementing [ViewRootForTest] should be registered while they
- * are attached to the window. This registry is used by the testing library to query the roots'
- * state.
+ * Registry where all views implementing [ViewRootForTest] should be registered while they are
+ * attached to the window. This registry is used by the testing library to query the roots' state.
  */
 internal class ComposeRootRegistry {
 
@@ -45,31 +44,23 @@
     private val resumedRoots = mutableSetOf<ViewRootForTest>()
     private val registryListeners = mutableSetOf<OnRegistrationChangedListener>()
 
-    /**
-     * Returns if the registry is setup to receive registrations from [ViewRootForTest]s
-     */
+    /** Returns if the registry is setup to receive registrations from [ViewRootForTest]s */
     val isSetUp: Boolean
         get() = ViewRootForTest.onViewCreatedCallback == ::onViewRootCreated
 
-    /**
-     * Sets up this registry to be notified of any [ViewRootForTest] created
-     */
+    /** Sets up this registry to be notified of any [ViewRootForTest] created */
     private fun setupRegistry() {
         ViewRootForTest.onViewCreatedCallback = ::onViewRootCreated
     }
 
-    /**
-     * Cleans up the changes made by [setupRegistry]. Call this after your test has run.
-     */
+    /** Cleans up the changes made by [setupRegistry]. Call this after your test has run. */
     @VisibleForTesting
     internal fun tearDownRegistry() {
         synchronized(lock) {
             // Stop accepting new roots
             ViewRootForTest.onViewCreatedCallback = null
             // Unregister the world
-            getCreatedComposeRoots().forEach {
-                unregisterComposeRoot(it)
-            }
+            getCreatedComposeRoots().forEach { unregisterComposeRoot(it) }
             // Clear all references
             allRoots.clear()
             resumedRoots.clear()
@@ -89,8 +80,8 @@
     }
 
     /**
-     * Returns a copy of the set of all created [ViewRootForTest]s, including ones that are
-     * normally not relevant (like those whose lifecycle state is not RESUMED). You probably need
+     * Returns a copy of the set of all created [ViewRootForTest]s, including ones that are normally
+     * not relevant (like those whose lifecycle state is not RESUMED). You probably need
      * [getRegisteredComposeRoots] though. Do not store any of these results, always call this
      * method again if you need access to anything in this set.
      */
@@ -164,22 +155,18 @@
         synchronized(lock) { registryListeners.add(listener) }
     }
 
-    /**
-     * Removes the given [listener].
-     */
+    /** Removes the given [listener]. */
     fun removeOnRegistrationChangedListener(listener: OnRegistrationChangedListener) {
         synchronized(lock) { registryListeners.remove(listener) }
     }
 
     private fun dispatchOnRegistrationChanged(composeRoot: ViewRootForTest, isRegistered: Boolean) {
-        synchronized(lock) { registryListeners.toList() }.forEach {
-            it.onRegistrationChanged(composeRoot, isRegistered)
-        }
+        synchronized(lock) { registryListeners.toList() }
+            .forEach { it.onRegistrationChanged(composeRoot, isRegistered) }
     }
 
-    private inner class StateChangeHandler(
-        private val composeRoot: ViewRootForTest
-    ) : View.OnAttachStateChangeListener, LifecycleEventObserver, OnRegistrationChangedListener {
+    private inner class StateChangeHandler(private val composeRoot: ViewRootForTest) :
+        View.OnAttachStateChangeListener, LifecycleEventObserver, OnRegistrationChangedListener {
         private var removeObserver: (() -> Unit)? = null
 
         override fun onViewAttachedToWindow(view: View) {
@@ -191,9 +178,7 @@
             lifecycle.addObserver(this)
             // Setup a lambda to remove the observer when we're detached from the window. When
             // that happens, we won't have access to the lifecycle anymore.
-            removeObserver = {
-                lifecycle.removeObserver(this)
-            }
+            removeObserver = { lifecycle.removeObserver(this) }
         }
 
         override fun onViewDetachedFromWindow(view: View) {
@@ -240,9 +225,7 @@
         }
 
         private fun removeLifecycleObserverMainThread() {
-            removeObserver?.invoke()?.also {
-                removeObserver = null
-            }
+            removeObserver?.invoke()?.also { removeObserver = null }
         }
     }
 }
@@ -262,13 +245,17 @@
 
     if (!hasComposeRoots) {
         val latch = CountDownLatch(1)
-        val listener = object : ComposeRootRegistry.OnRegistrationChangedListener {
-            override fun onRegistrationChanged(composeRoot: ViewRootForTest, registered: Boolean) {
-                if (hasComposeRoots) {
-                    latch.countDown()
+        val listener =
+            object : ComposeRootRegistry.OnRegistrationChangedListener {
+                override fun onRegistrationChanged(
+                    composeRoot: ViewRootForTest,
+                    registered: Boolean
+                ) {
+                    if (hasComposeRoots) {
+                        latch.countDown()
+                    }
                 }
             }
-        }
         try {
             addOnRegistrationChangedListener(listener)
             if (!hasComposeRoots) {
@@ -299,21 +286,20 @@
             }
 
             // Usually we resume if a compose root is registered while the listener is added
-            val listener = object : ComposeRootRegistry.OnRegistrationChangedListener {
-                override fun onRegistrationChanged(
-                    composeRoot: ViewRootForTest,
-                    registered: Boolean
-                ) {
-                    if (hasComposeRoots) {
-                        resume(this)
+            val listener =
+                object : ComposeRootRegistry.OnRegistrationChangedListener {
+                    override fun onRegistrationChanged(
+                        composeRoot: ViewRootForTest,
+                        registered: Boolean
+                    ) {
+                        if (hasComposeRoots) {
+                            resume(this)
+                        }
                     }
                 }
-            }
 
             addOnRegistrationChangedListener(listener)
-            continuation.invokeOnCancellation {
-                removeOnRegistrationChangedListener(listener)
-            }
+            continuation.invokeOnCancellation { removeOnRegistrationChangedListener(listener) }
 
             // But sometimes the compose root was registered before we added
             // the listener, in which case we missed our signal
diff --git a/compose/ui/ui-test/src/androidMain/kotlin/androidx/compose/ui/test/ComposeUiTest.android.kt b/compose/ui/ui-test/src/androidMain/kotlin/androidx/compose/ui/test/ComposeUiTest.android.kt
index 5544dd2..2d957b5 100644
--- a/compose/ui/ui-test/src/androidMain/kotlin/androidx/compose/ui/test/ComposeUiTest.android.kt
+++ b/compose/ui/ui-test/src/androidMain/kotlin/androidx/compose/ui/test/ComposeUiTest.android.kt
@@ -57,9 +57,9 @@
  * this would override the content and can lead to subtle bugs.
  *
  * @param A The Activity type to be launched, which typically (but not necessarily) hosts the
- * Compose content
+ *   Compose content
  * @param effectContext The [CoroutineContext] used to run the composition. The context for
- * `LaunchedEffect`s and `rememberCoroutineScope` will be derived from this context.
+ *   `LaunchedEffect`s and `rememberCoroutineScope` will be derived from this context.
  * @param block The test function.
  */
 @ExperimentalTestApi
@@ -77,10 +77,10 @@
  * this would override the content and can lead to subtle bugs.
  *
  * @param A The Activity type to be launched, which typically (but not necessarily) hosts the
- * Compose content
+ *   Compose content
  * @param activityClass The [Class] of the Activity type to be launched, corresponding to [A].
  * @param effectContext The [CoroutineContext] used to run the composition. The context for
- * `LaunchedEffect`s and `rememberCoroutineScope` will be derived from this context.
+ *   `LaunchedEffect`s and `rememberCoroutineScope` will be derived from this context.
  * @param block The test function.
  */
 @ExperimentalTestApi
@@ -92,13 +92,15 @@
     // Don't start the scenario now, wait until we're inside runTest { },
     // in case the Activity's onCreate/Start/Resume calls setContent
     var scenario: ActivityScenario<A>? = null
-    val environment = AndroidComposeUiTestEnvironment(effectContext) {
-        requireNotNull(scenario) {
-            "ActivityScenario has not yet been launched, or has already finished. Make sure that " +
-                "any call to ComposeUiTest.setContent() and AndroidComposeUiTest.getActivity() " +
-                "is made within the lambda passed to AndroidComposeUiTestEnvironment.runTest()"
-        }.getActivity()
-    }
+    val environment =
+        AndroidComposeUiTestEnvironment(effectContext) {
+            requireNotNull(scenario) {
+                    "ActivityScenario has not yet been launched, or has already finished. Make sure that " +
+                        "any call to ComposeUiTest.setContent() and AndroidComposeUiTest.getActivity() " +
+                        "is made within the lambda passed to AndroidComposeUiTestEnvironment.runTest()"
+                }
+                .getActivity()
+        }
     try {
         environment.runTest {
             scenario = ActivityScenario.launch(activityClass)
@@ -119,25 +121,26 @@
 
 /**
  * Variant of [runComposeUiTest] that does not launch an Activity to host Compose content in and
- * thus acts as an "empty shell". Use this if you need to have control over the timing and method
- * of launching the Activity, for example when you want to launch it with a custom Intent, or if
- * you have a complex test setup.
+ * thus acts as an "empty shell". Use this if you need to have control over the timing and method of
+ * launching the Activity, for example when you want to launch it with a custom Intent, or if you
+ * have a complex test setup.
  *
  * When using this method, calling [ComposeUiTest.setContent] will throw an IllegalStateException.
- * Instead, you'll have to set the content in the Activity that you have launched yourself,
- * either directly on the Activity or on an [androidx.compose.ui.platform.AbstractComposeView].
- * You will need to do this from within the [test lambda][block], or the test framework will not
- * be able to find the content.
+ * Instead, you'll have to set the content in the Activity that you have launched yourself, either
+ * directly on the Activity or on an [androidx.compose.ui.platform.AbstractComposeView]. You will
+ * need to do this from within the [test lambda][block], or the test framework will not be able to
+ * find the content.
  */
 @ExperimentalTestApi
 fun runEmptyComposeUiTest(block: ComposeUiTest.() -> Unit) {
     AndroidComposeUiTestEnvironment {
-        error(
-            "runEmptyComposeUiTest {} does not provide an Activity to set Compose content in. " +
-                "Launch and use the Activity yourself within the lambda passed to " +
-                "runEmptyComposeUiTest {}, or use runAndroidComposeUiTest {}"
-        )
-    }.runTest(block)
+            error(
+                "runEmptyComposeUiTest {} does not provide an Activity to set Compose content in. " +
+                    "Launch and use the Activity yourself within the lambda passed to " +
+                    "runEmptyComposeUiTest {}, or use runAndroidComposeUiTest {}"
+            )
+        }
+        .runTest(block)
 }
 
 /**
@@ -154,46 +157,45 @@
  * hosting the Compose content is in resumed state.
  *
  * @param A The Activity type to be interacted with, which typically (but not necessarily) is the
- * activity that was launched and hosts the Compose content
+ *   activity that was launched and hosts the Compose content
  */
 @ExperimentalTestApi
 sealed interface AndroidComposeUiTest<A : ComponentActivity> : ComposeUiTest {
     /**
-     * Returns the current activity of type [A] used in this [ComposeUiTest]. If no such activity
-     * is available, for example if you've navigated to a different activity and the original host
-     * has now been destroyed, this will return `null`.
+     * Returns the current activity of type [A] used in this [ComposeUiTest]. If no such activity is
+     * available, for example if you've navigated to a different activity and the original host has
+     * now been destroyed, this will return `null`.
      *
-     * Note that you should never hold on to a reference to the Activity, always use [activity]
-     * to interact with the Activity.
+     * Note that you should never hold on to a reference to the Activity, always use [activity] to
+     * interact with the Activity.
      */
     val activity: A?
 }
 
 /**
  * Creates an [AndroidComposeUiTestEnvironment] that retrieves the
- * [host Activity][AndroidComposeUiTest.activity] by delegating to the given [activityProvider].
- * Use this if you need to launch an Activity in a way that is not compatible with any of the
- * existing [runComposeUiTest], [runAndroidComposeUiTest], or [runEmptyComposeUiTest]
- * methods.
+ * [host Activity][AndroidComposeUiTest.activity] by delegating to the given [activityProvider]. Use
+ * this if you need to launch an Activity in a way that is not compatible with any of the existing
+ * [runComposeUiTest], [runAndroidComposeUiTest], or [runEmptyComposeUiTest] methods.
  *
  * Valid use cases include, but are not limited to, creating your own JUnit test rule that
- * implements [AndroidComposeUiTest] by delegating to [AndroidComposeUiTestEnvironment.test].
- * See [AndroidComposeTestRule][androidx.compose.ui.test.junit4.AndroidComposeTestRule] for a
- * reference implementation.
+ * implements [AndroidComposeUiTest] by delegating to [AndroidComposeUiTestEnvironment.test]. See
+ * [AndroidComposeTestRule][androidx.compose.ui.test.junit4.AndroidComposeTestRule] for a reference
+ * implementation.
  *
- * The [activityProvider] is called every time [activity][AndroidComposeUiTest.activity] is
- * called, which in turn is called when [setContent][ComposeUiTest.setContent] is called.
+ * The [activityProvider] is called every time [activity][AndroidComposeUiTest.activity] is called,
+ * which in turn is called when [setContent][ComposeUiTest.setContent] is called.
  *
  * The most common implementation of an [activityProvider] retrieves the activity from a backing
- * [ActivityScenario] (that the caller launches _within_ the lambda passed to [runTest]), but
- * one is not limited to this pattern.
+ * [ActivityScenario] (that the caller launches _within_ the lambda passed to [runTest]), but one is
+ * not limited to this pattern.
  *
- * @param activityProvider A lambda that should return the current Activity instance of type [A],
- * if it is available. If it is not available, it should return `null`.
+ * @param activityProvider A lambda that should return the current Activity instance of type [A], if
+ *   it is available. If it is not available, it should return `null`.
  * @param A The Activity type to be interacted with, which typically (but not necessarily) is the
- * activity that was launched and hosts the Compose content.
+ *   activity that was launched and hosts the Compose content.
  * @param effectContext The [CoroutineContext] used to run the composition. The context for
- * `LaunchedEffect`s and `rememberCoroutineScope` will be derived from this context.
+ *   `LaunchedEffect`s and `rememberCoroutineScope` will be derived from this context.
  */
 @ExperimentalTestApi
 inline fun <A : ComponentActivity> AndroidComposeUiTestEnvironment(
@@ -207,14 +209,14 @@
 }
 
 /**
- * A test environment that can [run tests][runTest] using the [test receiver scope][test]. Note
- * that some of the properties and methods on [test] will only work during the call to [runTest],
- * as they require that the environment has been set up.
+ * A test environment that can [run tests][runTest] using the [test receiver scope][test]. Note that
+ * some of the properties and methods on [test] will only work during the call to [runTest], as they
+ * require that the environment has been set up.
  *
  * @param A The Activity type to be interacted with, which typically (but not necessarily) is the
- * activity that was launched and hosts the Compose content.
+ *   activity that was launched and hosts the Compose content.
  * @param effectContext The [CoroutineContext] used to run the composition. The context for
- * `LaunchedEffect`s and `rememberCoroutineScope` will be derived from this context.
+ *   `LaunchedEffect`s and `rememberCoroutineScope` will be derived from this context.
  */
 @ExperimentalTestApi
 @OptIn(InternalTestApi::class, ExperimentalCoroutinesApi::class, ExperimentalComposeUiApi::class)
@@ -231,8 +233,8 @@
 
     private lateinit var recomposer: Recomposer
     // We can only accept a TestDispatcher here because we need to access its scheduler.
-    private val testCoroutineDispatcher = effectContext[ContinuationInterceptor] as? TestDispatcher
-        ?: UnconfinedTestDispatcher()
+    private val testCoroutineDispatcher =
+        effectContext[ContinuationInterceptor] as? TestDispatcher ?: UnconfinedTestDispatcher()
     private val testCoroutineScope = TestScope(testCoroutineDispatcher)
     private lateinit var recomposerCoroutineScope: CoroutineScope
     private val coroutineExceptionHandler = UncaughtExceptionHandler()
@@ -242,18 +244,21 @@
     private val infiniteAnimationPolicy: InfiniteAnimationPolicy
 
     init {
-        frameClock = TestMonotonicFrameClock(
-            testCoroutineScope,
-            // This callback will get run at the same time, relative to frame callbacks and
-            // coroutine resumptions, as the Choreographer's perform traversal frame, where it runs
-            // layout and draw passes. We use it to run layout passes manually when executing frames
-            // during a waitForIdle, during which the Choreographer isn't in control.
-            onPerformTraversals = {
-                composeRootRegistry.getRegisteredComposeRoots().forEach {
-                    it.measureAndLayoutForTest()
+        frameClock =
+            TestMonotonicFrameClock(
+                testCoroutineScope,
+                // This callback will get run at the same time, relative to frame callbacks and
+                // coroutine resumptions, as the Choreographer's perform traversal frame, where it
+                // runs
+                // layout and draw passes. We use it to run layout passes manually when executing
+                // frames
+                // during a waitForIdle, during which the Choreographer isn't in control.
+                onPerformTraversals = {
+                    composeRootRegistry.getRegisteredComposeRoots().forEach {
+                        it.measureAndLayoutForTest()
+                    }
                 }
-            }
-        )
+            )
         // The applying interceptor needs to be the outermost wrapper since TestMonotonicFrameClock
         // will not delegate if the dispatcher dispatch is not needed at the time of intercept.
         recomposerContinuationInterceptor =
@@ -261,40 +266,41 @@
 
         mainClockImpl = MainTestClockImpl(testCoroutineDispatcher.scheduler, frameClock)
 
-        infiniteAnimationPolicy = object : InfiniteAnimationPolicy {
-            override suspend fun <R> onInfiniteOperation(block: suspend () -> R): R {
-                if (mainClockImpl.autoAdvance) {
-                    throw CancellationException("Infinite animations are disabled on tests")
+        infiniteAnimationPolicy =
+            object : InfiniteAnimationPolicy {
+                override suspend fun <R> onInfiniteOperation(block: suspend () -> R): R {
+                    if (mainClockImpl.autoAdvance) {
+                        throw CancellationException("Infinite animations are disabled on tests")
+                    }
+                    return block()
                 }
-                return block()
             }
-        }
 
         createRecomposer()
     }
 
     private fun createRecomposer() {
-        recomposerCoroutineScope = CoroutineScope(
-            effectContext +
-                recomposerContinuationInterceptor +
-                frameClock +
-                infiniteAnimationPolicy +
-                coroutineExceptionHandler +
-                Job()
-        )
+        recomposerCoroutineScope =
+            CoroutineScope(
+                effectContext +
+                    recomposerContinuationInterceptor +
+                    frameClock +
+                    infiniteAnimationPolicy +
+                    coroutineExceptionHandler +
+                    Job()
+            )
         recomposer = Recomposer(recomposerCoroutineScope.coroutineContext)
 
-        composeIdlingResource = ComposeIdlingResource(
-            composeRootRegistry, mainClockImpl, recomposer
-        )
+        composeIdlingResource =
+            ComposeIdlingResource(composeRootRegistry, mainClockImpl, recomposer)
     }
 
     /**
-     * Recreates the CoroutineContext associated with Compose being cancelled. This happens
-     * when an app moves from a regular ("Full screen") view of the app to a "Pop up" view AND
-     * certain properties in the manifest's android:configChanges are set to prevent a
-     * full tear down of the app. This is a somewhat rare case (see
-     * issuetracker.google.com/issues/309326720 for more details).
+     * Recreates the CoroutineContext associated with Compose being cancelled. This happens when an
+     * app moves from a regular ("Full screen") view of the app to a "Pop up" view AND certain
+     * properties in the manifest's android:configChanges are set to prevent a full tear down of the
+     * app. This is a somewhat rare case (see issuetracker.google.com/issues/309326720 for more
+     * details).
      *
      * It does this by canceling the existing Recomposer and creates a new Recomposer (including a
      * new recomposer coroutine scope for that new Recomposer) and a new ComposeIdlingResource.
@@ -312,16 +318,16 @@
     private val testContext = createTestContext(testOwner)
 
     /**
-     * Returns the current host activity of type [A]. If no such activity is available, for
-     * example if you've navigated to a different activity and the original host has now been
-     * destroyed, this will return `null`.
+     * Returns the current host activity of type [A]. If no such activity is available, for example
+     * if you've navigated to a different activity and the original host has now been destroyed,
+     * this will return `null`.
      */
     protected abstract val activity: A?
 
     /**
      * The receiver scope of the test passed to [runTest]. Note that some of the properties and
-     * methods will only work during the call to [runTest], as they require that the environment
-     * has been set up.
+     * methods will only work during the call to [runTest], as they require that the environment has
+     * been set up.
      */
     val test: AndroidComposeUiTest<A> = testReceiverScope
 
@@ -366,9 +372,7 @@
         return WindowRecomposerPolicy.withFactory({ recomposer }) {
             try {
                 // Start the recomposer:
-                recomposerCoroutineScope.launch {
-                    recomposer.runRecomposeAndApplyChanges()
-                }
+                recomposerCoroutineScope.launch { recomposer.runRecomposeAndApplyChanges() }
                 block()
             } finally {
                 // Stop the recomposer:
@@ -481,14 +485,11 @@
         }
 
         override fun setContent(composable: @Composable () -> Unit) {
-            check(disposeContentHook == null) {
-                "Cannot call setContent twice per test!"
-            }
+            check(disposeContentHook == null) { "Cannot call setContent twice per test!" }
 
             // We always make sure we have the latest activity when setting a content
-            val currentActivity = checkNotNull(activity) {
-                "Cannot set content, host activity not found"
-            }
+            val currentActivity =
+                checkNotNull(activity) { "Cannot set content, host activity not found" }
             // Check if the current activity hasn't already called setContent itself
             val root = currentActivity.findViewById<ViewGroup>(android.R.id.content)
             check(root == null || root.childCount == 0) {
@@ -569,16 +570,24 @@
 actual sealed interface ComposeUiTest : SemanticsNodeInteractionsProvider {
     actual val density: Density
     actual val mainClock: MainTestClock
+
     actual fun <T> runOnUiThread(action: () -> T): T
+
     actual fun <T> runOnIdle(action: () -> T): T
+
     actual fun waitForIdle()
+
     actual suspend fun awaitIdle()
+
     actual fun waitUntil(
         conditionDescription: String?,
         timeoutMillis: Long,
         condition: () -> Boolean
     )
+
     actual fun registerIdlingResource(idlingResource: IdlingResource)
+
     actual fun unregisterIdlingResource(idlingResource: IdlingResource)
+
     actual fun setContent(composable: @Composable () -> Unit)
 }
diff --git a/compose/ui/ui-test/src/androidMain/kotlin/androidx/compose/ui/test/DeviceConfigurationOverride.android.kt b/compose/ui/ui-test/src/androidMain/kotlin/androidx/compose/ui/test/DeviceConfigurationOverride.android.kt
index 9d3a7fd..ad4dac1 100644
--- a/compose/ui/ui-test/src/androidMain/kotlin/androidx/compose/ui/test/DeviceConfigurationOverride.android.kt
+++ b/compose/ui/ui-test/src/androidMain/kotlin/androidx/compose/ui/test/DeviceConfigurationOverride.android.kt
@@ -48,14 +48,15 @@
         // Second, override the configuration, with the current configuration modified by the
         // resulting density
         OverriddenConfiguration(
-            configuration = Configuration().apply {
-                // Initialize from the current configuration
-                updateFrom(LocalConfiguration.current)
+            configuration =
+                Configuration().apply {
+                    // Initialize from the current configuration
+                    updateFrom(LocalConfiguration.current)
 
-                // Override densityDpi
-                densityDpi =
-                    floor(LocalDensity.current.density * DisplayMetrics.DENSITY_DEFAULT).toInt()
-            },
+                    // Override densityDpi
+                    densityDpi =
+                        floor(LocalDensity.current.density * DisplayMetrics.DENSITY_DEFAULT).toInt()
+                },
             content = contentUnderTest
         )
     }
@@ -65,13 +66,14 @@
     fontScale: Float
 ): DeviceConfigurationOverride = DeviceConfigurationOverride { contentUnderTest ->
     OverriddenConfiguration(
-        configuration = Configuration().apply {
-            // Initialize from the current configuration
-            updateFrom(LocalConfiguration.current)
+        configuration =
+            Configuration().apply {
+                // Initialize from the current configuration
+                updateFrom(LocalConfiguration.current)
 
-            // Override font scale
-            this.fontScale = fontScale
-        },
+                // Override font scale
+                this.fontScale = fontScale
+            },
         content = contentUnderTest
     )
 }
@@ -80,17 +82,20 @@
     layoutDirection: LayoutDirection
 ): DeviceConfigurationOverride = DeviceConfigurationOverride { contentUnderTest ->
     OverriddenConfiguration(
-        configuration = Configuration().apply {
-            // Initialize from the current configuration
-            updateFrom(LocalConfiguration.current)
+        configuration =
+            Configuration().apply {
+                // Initialize from the current configuration
+                updateFrom(LocalConfiguration.current)
 
-            // Override screen layout for layout direction
-            screenLayout = screenLayout and Configuration.SCREENLAYOUT_LAYOUTDIR_MASK.inv() or
-                when (layoutDirection) {
-                    LayoutDirection.Ltr -> Configuration.SCREENLAYOUT_LAYOUTDIR_LTR
-                    LayoutDirection.Rtl -> Configuration.SCREENLAYOUT_LAYOUTDIR_RTL
-                }
-        },
+                // Override screen layout for layout direction
+                screenLayout =
+                    screenLayout and
+                        Configuration.SCREENLAYOUT_LAYOUTDIR_MASK.inv() or
+                        when (layoutDirection) {
+                            LayoutDirection.Ltr -> Configuration.SCREENLAYOUT_LAYOUTDIR_LTR
+                            LayoutDirection.Rtl -> Configuration.SCREENLAYOUT_LAYOUTDIR_RTL
+                        }
+            },
         content = contentUnderTest
     )
 }
@@ -107,21 +112,19 @@
     locales: LocaleList,
 ): DeviceConfigurationOverride = DeviceConfigurationOverride { contentUnderTest ->
     OverriddenConfiguration(
-        configuration = Configuration().apply {
-            // Initialize from the current configuration
-            updateFrom(LocalConfiguration.current)
+        configuration =
+            Configuration().apply {
+                // Initialize from the current configuration
+                updateFrom(LocalConfiguration.current)
 
-            // Update the locale list
-            ConfigurationCompat.setLocales(
-                this,
-                LocaleListCompat.forLanguageTags(
-                    locales.localeList.fastJoinToString(
-                        ",",
-                        transform = Locale::toLanguageTag
+                // Update the locale list
+                ConfigurationCompat.setLocales(
+                    this,
+                    LocaleListCompat.forLanguageTags(
+                        locales.localeList.fastJoinToString(",", transform = Locale::toLanguageTag)
                     )
                 )
-            )
-        },
+            },
         content = contentUnderTest
     )
 }
@@ -137,17 +140,21 @@
     isDarkMode: Boolean,
 ): DeviceConfigurationOverride = DeviceConfigurationOverride { contentUnderTest ->
     OverriddenConfiguration(
-        configuration = Configuration().apply {
-            // Initialize from the current configuration
-            updateFrom(LocalConfiguration.current)
+        configuration =
+            Configuration().apply {
+                // Initialize from the current configuration
+                updateFrom(LocalConfiguration.current)
 
-            // Override dark mode
-            uiMode = uiMode and Configuration.UI_MODE_NIGHT_MASK.inv() or if (isDarkMode) {
-                Configuration.UI_MODE_NIGHT_YES
-            } else {
-                Configuration.UI_MODE_NIGHT_NO
-            }
-        },
+                // Override dark mode
+                uiMode =
+                    uiMode and
+                        Configuration.UI_MODE_NIGHT_MASK.inv() or
+                        if (isDarkMode) {
+                            Configuration.UI_MODE_NIGHT_YES
+                        } else {
+                            Configuration.UI_MODE_NIGHT_NO
+                        }
+            },
         content = contentUnderTest
     )
 }
@@ -163,13 +170,14 @@
     fontWeightAdjustment: Int,
 ): DeviceConfigurationOverride = DeviceConfigurationOverride { contentUnderTest ->
     OverriddenConfiguration(
-        configuration = Configuration().apply {
-            // Initialize from the current configuration
-            updateFrom(LocalConfiguration.current)
+        configuration =
+            Configuration().apply {
+                // Initialize from the current configuration
+                updateFrom(LocalConfiguration.current)
 
-            // Override fontWeightAdjustment
-            this.fontWeightAdjustment = fontWeightAdjustment
-        },
+                // Override fontWeightAdjustment
+                this.fontWeightAdjustment = fontWeightAdjustment
+            },
         content = contentUnderTest
     )
 }
@@ -185,18 +193,22 @@
     isScreenRound: Boolean,
 ): DeviceConfigurationOverride = DeviceConfigurationOverride { contentUnderTest ->
     OverriddenConfiguration(
-        configuration = Configuration().apply {
-            // Initialize from the current configuration
-            updateFrom(LocalConfiguration.current)
+        configuration =
+            Configuration().apply {
+                // Initialize from the current configuration
+                updateFrom(LocalConfiguration.current)
 
-            // Override isRound in screenLayout
-            screenLayout = when (isScreenRound) {
-                true -> (screenLayout and Configuration.SCREENLAYOUT_ROUND_MASK.inv()) or
-                    Configuration.SCREENLAYOUT_ROUND_YES
-                false -> (screenLayout and Configuration.SCREENLAYOUT_ROUND_MASK.inv()) or
-                    Configuration.SCREENLAYOUT_ROUND_NO
-            }
-        },
+                // Override isRound in screenLayout
+                screenLayout =
+                    when (isScreenRound) {
+                        true ->
+                            (screenLayout and Configuration.SCREENLAYOUT_ROUND_MASK.inv()) or
+                                Configuration.SCREENLAYOUT_ROUND_YES
+                        false ->
+                            (screenLayout and Configuration.SCREENLAYOUT_ROUND_MASK.inv()) or
+                                Configuration.SCREENLAYOUT_ROUND_NO
+                    }
+            },
         content = contentUnderTest
     )
 }
@@ -204,19 +216,17 @@
 /**
  * Overrides the compositions locals related to the given [configuration].
  *
- * There currently isn't a single source of truth for these values, so we update them all
- * according to the given [configuration].
+ * There currently isn't a single source of truth for these values, so we update them all according
+ * to the given [configuration].
  */
 @Composable
-private fun OverriddenConfiguration(
-    configuration: Configuration,
-    content: @Composable () -> Unit
-) {
+private fun OverriddenConfiguration(configuration: Configuration, content: @Composable () -> Unit) {
     // We don't override the theme, but we do want to override the configuration and this seems
     // convenient to do so
-    val newContext = ContextThemeWrapper(LocalContext.current, 0).apply {
-        applyOverrideConfiguration(configuration)
-    }
+    val newContext =
+        ContextThemeWrapper(LocalContext.current, 0).apply {
+            applyOverrideConfiguration(configuration)
+        }
 
     CompositionLocalProvider(
         LocalContext provides newContext,
@@ -227,10 +237,11 @@
             } else {
                 LayoutDirection.Rtl
             },
-        LocalDensity provides Density(
-            configuration.densityDpi.toFloat() / DisplayMetrics.DENSITY_DEFAULT,
-            configuration.fontScale
-        ),
+        LocalDensity provides
+            Density(
+                configuration.densityDpi.toFloat() / DisplayMetrics.DENSITY_DEFAULT,
+                configuration.fontScale
+            ),
         LocalFontFamilyResolver provides createFontFamilyResolver(newContext),
         content = content
     )
diff --git a/compose/ui/ui-test/src/androidMain/kotlin/androidx/compose/ui/test/EspressoLink.android.kt b/compose/ui/ui-test/src/androidMain/kotlin/androidx/compose/ui/test/EspressoLink.android.kt
index 0bd0a70..386d53b 100644
--- a/compose/ui/ui-test/src/androidMain/kotlin/androidx/compose/ui/test/EspressoLink.android.kt
+++ b/compose/ui/ui-test/src/androidMain/kotlin/androidx/compose/ui/test/EspressoLink.android.kt
@@ -28,13 +28,11 @@
 /**
  * Idling strategy for regular Android Instrumented tests, built on Espresso.
  *
- * This installs the [IdlingResourceRegistry] as an [IdlingResource] into Espresso and delegates
- * all the work to Espresso. We wrap [Espresso.onIdle] so we can print more informative error
- * messages.
+ * This installs the [IdlingResourceRegistry] as an [IdlingResource] into Espresso and delegates all
+ * the work to Espresso. We wrap [Espresso.onIdle] so we can print more informative error messages.
  */
-internal class EspressoLink(
-    private val registry: IdlingResourceRegistry
-) : IdlingResource, IdlingStrategy {
+internal class EspressoLink(private val registry: IdlingResourceRegistry) :
+    IdlingResource, IdlingStrategy {
 
     override val canSynchronizeOnUiThread: Boolean = false
 
@@ -45,9 +43,7 @@
     }
 
     override fun registerIdleTransitionCallback(callback: IdlingResource.ResourceCallback?) {
-        registry.setOnIdleCallback {
-            callback?.onTransitionToIdle()
-        }
+        registry.setOnIdleCallback { callback?.onTransitionToIdle() }
     }
 
     fun getDiagnosticMessageIfBusy(): String? = registry.getDiagnosticMessageIfBusy()
@@ -81,9 +77,7 @@
 
     override suspend fun awaitIdle() {
         // Espresso.onIdle() must be called from a non-ui thread; so use Dispatchers.IO
-        withContext(Dispatchers.IO) {
-            runUntilIdle()
-        }
+        withContext(Dispatchers.IO) { runUntilIdle() }
     }
 }
 
@@ -128,11 +122,12 @@
         listOfIdlingResources.add(resource.name)
     }
     if (diagnosticInfo.isNotEmpty()) {
-        val prefix = if (wasGlobalTimeout) {
-            "Global time out"
-        } else {
-            "Idling resource timed out"
-        }
+        val prefix =
+            if (wasGlobalTimeout) {
+                "Global time out"
+            } else {
+                "Idling resource timed out"
+            }
         throw ComposeNotIdleException(
             "$prefix: possibly due to compose being busy.\n" +
                 diagnosticInfo +
@@ -146,9 +141,9 @@
 }
 
 /**
- * Tries to find if the given exception or any of its cause is of the type of the provided
- * throwable T. Returns null if there is no match. This is required as some exceptions end up
- * wrapped in Runtime or Concurrent exceptions.
+ * Tries to find if the given exception or any of its cause is of the type of the provided throwable
+ * T. Returns null if there is no match. This is required as some exceptions end up wrapped in
+ * Runtime or Concurrent exceptions.
  */
 private inline fun <reified T : Throwable> tryToFindCause(e: Throwable): Throwable? {
     var causeToCheck: Throwable? = e
diff --git a/compose/ui/ui-test/src/androidMain/kotlin/androidx/compose/ui/test/IdlingStrategy.android.kt b/compose/ui/ui-test/src/androidMain/kotlin/androidx/compose/ui/test/IdlingStrategy.android.kt
index 385cdd4..ab2bae9 100644
--- a/compose/ui/ui-test/src/androidMain/kotlin/androidx/compose/ui/test/IdlingStrategy.android.kt
+++ b/compose/ui/ui-test/src/androidMain/kotlin/androidx/compose/ui/test/IdlingStrategy.android.kt
@@ -17,10 +17,10 @@
 package androidx.compose.ui.test
 
 /**
- * A strategy to wait for idleness. This is typically implemented by different test frameworks,
- * to allow each framework to await idleness in their own unique way. For example, a framework
- * could sleep until the system is idle, or a framework could take control of the system and
- * execute all pending work immediately.
+ * A strategy to wait for idleness. This is typically implemented by different test frameworks, to
+ * allow each framework to await idleness in their own unique way. For example, a framework could
+ * sleep until the system is idle, or a framework could take control of the system and execute all
+ * pending work immediately.
  *
  * Normally one does not need to touch this, ever.
  */
@@ -39,15 +39,14 @@
     fun runUntilIdle()
 
     /**
-     * Should suspend until the system is idle. A strategy may actively push the system towards
-     * an idle state, but doesn't necessarily have to do that. Default implementation calls
+     * Should suspend until the system is idle. A strategy may actively push the system towards an
+     * idle state, but doesn't necessarily have to do that. Default implementation calls
      * [runUntilIdle] without suspending.
      */
     suspend fun awaitIdle() = runUntilIdle()
 
     /**
-     * Runs the [block] while giving implementations the option to perform setup and
-     * tear down work.
+     * Runs the [block] while giving implementations the option to perform setup and tear down work.
      */
     fun <R> withStrategy(block: () -> R): R = block()
 }
diff --git a/compose/ui/ui-test/src/androidMain/kotlin/androidx/compose/ui/test/MainTestClockImpl.android.kt b/compose/ui/ui-test/src/androidMain/kotlin/androidx/compose/ui/test/MainTestClockImpl.android.kt
index 412a0cd..6b2b2ac 100644
--- a/compose/ui/ui-test/src/androidMain/kotlin/androidx/compose/ui/test/MainTestClockImpl.android.kt
+++ b/compose/ui/ui-test/src/androidMain/kotlin/androidx/compose/ui/test/MainTestClockImpl.android.kt
@@ -23,10 +23,6 @@
 internal class MainTestClockImpl(
     testScheduler: TestCoroutineScheduler,
     frameClock: TestMonotonicFrameClock
-) : AbstractMainTestClock(
-    testScheduler,
-    frameClock.frameDelayMillis,
-    ::runOnUiThread
-) {
+) : AbstractMainTestClock(testScheduler, frameClock.frameDelayMillis, ::runOnUiThread) {
     internal val hasAwaiters = frameClock.hasAwaiters
 }
diff --git a/compose/ui/ui-test/src/androidMain/kotlin/androidx/compose/ui/test/Mouse.android.kt b/compose/ui/ui-test/src/androidMain/kotlin/androidx/compose/ui/test/Mouse.android.kt
index ceac3b4..c18b6c5 100644
--- a/compose/ui/ui-test/src/androidMain/kotlin/androidx/compose/ui/test/Mouse.android.kt
+++ b/compose/ui/ui-test/src/androidMain/kotlin/androidx/compose/ui/test/Mouse.android.kt
@@ -25,19 +25,13 @@
 actual value class MouseButton(val buttonId: Int) {
     @ExperimentalTestApi
     actual companion object {
-        /**
-         * The left mouse button
-         */
+        /** The left mouse button */
         actual val Primary = MouseButton(MotionEvent.BUTTON_PRIMARY)
 
-        /**
-         * The right mouse button
-         */
+        /** The right mouse button */
         actual val Secondary = MouseButton(MotionEvent.BUTTON_SECONDARY)
 
-        /**
-         * The middle mouse button
-         */
+        /** The middle mouse button */
         actual val Tertiary = MouseButton(MotionEvent.BUTTON_TERTIARY)
     }
 }
diff --git a/compose/ui/ui-test/src/androidMain/kotlin/androidx/compose/ui/test/RobolectricIdlingStrategy.android.kt b/compose/ui/ui-test/src/androidMain/kotlin/androidx/compose/ui/test/RobolectricIdlingStrategy.android.kt
index adbe96e..f1aeade 100644
--- a/compose/ui/ui-test/src/androidMain/kotlin/androidx/compose/ui/test/RobolectricIdlingStrategy.android.kt
+++ b/compose/ui/ui-test/src/androidMain/kotlin/androidx/compose/ui/test/RobolectricIdlingStrategy.android.kt
@@ -25,16 +25,16 @@
  * Idling strategy for use with Robolectric.
  *
  * When running on Robolectric, the following things are different:
- * 1. IdlingResources are not queried. We drive Compose from the ComposeIdlingResource, so we
- * need to do that manually here.
+ * 1. IdlingResources are not queried. We drive Compose from the ComposeIdlingResource, so we need
+ *    to do that manually here.
  * 2. Draw passes don't happen. Compose performs most measure and layout passes during the draw
- * pass, so we need to manually trigger an actual measure/layout pass when needed.
+ *    pass, so we need to manually trigger an actual measure/layout pass when needed.
  * 3. Awaiting idleness must happen on the main thread. On Espresso it's exactly the other way
- * around, so we need to invert our thread checks.
+ *    around, so we need to invert our thread checks.
  *
- * Note that we explicitly don't install our [IdlingResourceRegistry] into Espresso even though
- * it would be a noop anyway: if at some point in the future they will be supported, our behavior
- * would silently change (potentially leading to breakages).
+ * Note that we explicitly don't install our [IdlingResourceRegistry] into Espresso even though it
+ * would be a noop anyway: if at some point in the future they will be supported, our behavior would
+ * silently change (potentially leading to breakages).
  */
 internal class RobolectricIdlingStrategy(
     private val composeRootRegistry: ComposeRootRegistry,
@@ -76,19 +76,18 @@
     override suspend fun awaitIdle() {
         // On Robolectric, Espresso.onIdle() must be called from the main thread; so use
         // Dispatchers.Main. Use `.immediate` in case we're already on the main thread.
-        withContext(Dispatchers.Main.immediate) {
-            runUntilIdle()
-        }
+        withContext(Dispatchers.Main.immediate) { runUntilIdle() }
     }
 
     /**
-     * Calls [requestLayout][android.view.View.requestLayout] on all compose hosts that are
-     * awaiting a measure/layout pass, because the draw pass that it is normally awaiting never
-     * happens on Robolectric.
+     * Calls [requestLayout][android.view.View.requestLayout] on all compose hosts that are awaiting
+     * a measure/layout pass, because the draw pass that it is normally awaiting never happens on
+     * Robolectric.
      */
     private fun requestLayoutIfNeeded(): Boolean {
         val composeRoots = composeRootRegistry.getRegisteredComposeRoots()
-        return composeRoots.filter { it.shouldWaitForMeasureAndLayout }
+        return composeRoots
+            .filter { it.shouldWaitForMeasureAndLayout }
             .onEach { it.view.requestLayout() }
             .isNotEmpty()
     }
diff --git a/compose/ui/ui-test/src/androidMain/kotlin/androidx/compose/ui/test/android/WindowCapture.android.kt b/compose/ui/ui-test/src/androidMain/kotlin/androidx/compose/ui/test/android/WindowCapture.android.kt
index 524d18f..b7d1a3e 100644
--- a/compose/ui/ui-test/src/androidMain/kotlin/androidx/compose/ui/test/android/WindowCapture.android.kt
+++ b/compose/ui/ui-test/src/androidMain/kotlin/androidx/compose/ui/test/android/WindowCapture.android.kt
@@ -104,18 +104,21 @@
                 drawDone = true
             }
         } else {
-            viewTreeObserver.addOnDrawListener(object : ViewTreeObserver.OnDrawListener {
-                var handled = false
-                override fun onDraw() {
-                    if (!handled) {
-                        handled = true
-                        handler.postAtFrontOfQueue {
-                            drawDone = true
-                            viewTreeObserver.removeOnDrawListener(this)
+            viewTreeObserver.addOnDrawListener(
+                object : ViewTreeObserver.OnDrawListener {
+                    var handled = false
+
+                    override fun onDraw() {
+                        if (!handled) {
+                            handled = true
+                            handler.postAtFrontOfQueue {
+                                drawDone = true
+                                viewTreeObserver.removeOnDrawListener(this)
+                            }
                         }
                     }
                 }
-            })
+            )
         }
         invalidate()
     }
@@ -140,10 +143,11 @@
 private fun Window.generateBitmapFromPixelCopy(boundsInWindow: Rect, destBitmap: Bitmap) {
     val latch = CountDownLatch(1)
     var copyResult = 0
-    val onCopyFinished = PixelCopy.OnPixelCopyFinishedListener { result ->
-        copyResult = result
-        latch.countDown()
-    }
+    val onCopyFinished =
+        PixelCopy.OnPixelCopyFinishedListener { result ->
+            copyResult = result
+            latch.countDown()
+        }
     PixelCopyHelper.request(
         this,
         boundsInWindow,
@@ -160,12 +164,8 @@
     }
 }
 
-internal class PixelCopyException(
-    val copyResultStatus: Int,
-    message: String? = null
-) : RuntimeException(
-    message ?: "PixelCopy failed with result $copyResultStatus!"
-)
+internal class PixelCopyException(val copyResultStatus: Int, message: String? = null) :
+    RuntimeException(message ?: "PixelCopy failed with result $copyResultStatus!")
 
 // Unfortunately this is a copy paste from AndroidComposeTestRule. At this moment it is a bit
 // tricky to share this method. We can expose it on TestOwner in theory.
@@ -178,9 +178,7 @@
         // Let Android run measure, draw and in general any other async operations.
         Thread.sleep(10)
         if (System.nanoTime() - startTime > timeoutMillis * 1_000_000) {
-            throw ComposeTimeoutException(
-                "Condition still not satisfied after $timeoutMillis ms"
-            )
+            throw ComposeTimeoutException("Condition still not satisfied after $timeoutMillis ms")
         }
     }
 }
diff --git a/compose/ui/ui-test/src/androidMain/kotlin/androidx/compose/ui/test/junit4/android/ComposeNotIdleException.android.kt b/compose/ui/ui-test/src/androidMain/kotlin/androidx/compose/ui/test/junit4/android/ComposeNotIdleException.android.kt
index 815c8d6..288d2c9 100644
--- a/compose/ui/ui-test/src/androidMain/kotlin/androidx/compose/ui/test/junit4/android/ComposeNotIdleException.android.kt
+++ b/compose/ui/ui-test/src/androidMain/kotlin/androidx/compose/ui/test/junit4/android/ComposeNotIdleException.android.kt
@@ -16,7 +16,5 @@
 
 package androidx.compose.ui.test.junit4.android
 
-/**
- * Thrown in cases where Compose can't get idle in Espresso's defined time limit.
- */
+/** Thrown in cases where Compose can't get idle in Espresso's defined time limit. */
 class ComposeNotIdleException(message: String?, cause: Throwable?) : Exception(message, cause)
diff --git a/compose/ui/ui-test/src/androidUnitTest/kotlin/androidx/compose/ui/test/BitmapCapturingRetryLogicTest.kt b/compose/ui/ui-test/src/androidUnitTest/kotlin/androidx/compose/ui/test/BitmapCapturingRetryLogicTest.kt
index 31cbcc4..0a866d8 100644
--- a/compose/ui/ui-test/src/androidUnitTest/kotlin/androidx/compose/ui/test/BitmapCapturingRetryLogicTest.kt
+++ b/compose/ui/ui-test/src/androidUnitTest/kotlin/androidx/compose/ui/test/BitmapCapturingRetryLogicTest.kt
@@ -30,8 +30,7 @@
 @RunWith(AndroidJUnit4::class)
 class BitmapCapturingRetryLogicTest {
 
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
     @Test
     fun pixelCopyRequest_succeeded_noRetries() {
@@ -88,9 +87,7 @@
     @Test
     fun pixelCopyRequest_error_rethrow() {
         expectError<PixelCopyException> {
-            runWithRetryWhenNoData {
-                throw PixelCopyException(PixelCopy.ERROR_UNKNOWN)
-            }
+            runWithRetryWhenNoData { throw PixelCopyException(PixelCopy.ERROR_UNKNOWN) }
         }
     }
 
diff --git a/compose/ui/ui-test/src/androidUnitTest/kotlin/androidx/compose/ui/test/InfiniteAnimationPolicyTest.kt b/compose/ui/ui-test/src/androidUnitTest/kotlin/androidx/compose/ui/test/InfiniteAnimationPolicyTest.kt
index bf7de9e..fbc2a72 100644
--- a/compose/ui/ui-test/src/androidUnitTest/kotlin/androidx/compose/ui/test/InfiniteAnimationPolicyTest.kt
+++ b/compose/ui/ui-test/src/androidUnitTest/kotlin/androidx/compose/ui/test/InfiniteAnimationPolicyTest.kt
@@ -31,39 +31,32 @@
 
     @Test
     fun withInfiniteAnimationFrameNanos_policyIsApplied() {
-        withInfiniteAnimationFrame_policyIsApplied {
-            withInfiniteAnimationFrameNanos {}
-        }
+        withInfiniteAnimationFrame_policyIsApplied { withInfiniteAnimationFrameNanos {} }
     }
 
     @Test
     fun withInfiniteAnimationFrameMillis_policyIsApplied() {
-        withInfiniteAnimationFrame_policyIsApplied {
-            withInfiniteAnimationFrameMillis {}
-        }
+        withInfiniteAnimationFrame_policyIsApplied { withInfiniteAnimationFrameMillis {} }
     }
 
     private fun <R> withInfiniteAnimationFrame_policyIsApplied(block: suspend () -> R) {
         var applied = false
-        val policy = object : InfiniteAnimationPolicy {
-            override suspend fun <R> onInfiniteOperation(block: suspend () -> R): R {
-                applied = true
-                // We don't need to run the `block()` in our test, but we do need a return value
-                // of R. Throw a CancellationException to cancel the coroutine instead.
-                throw CancellationException()
+        val policy =
+            object : InfiniteAnimationPolicy {
+                override suspend fun <R> onInfiniteOperation(block: suspend () -> R): R {
+                    applied = true
+                    // We don't need to run the `block()` in our test, but we do need a return value
+                    // of R. Throw a CancellationException to cancel the coroutine instead.
+                    throw CancellationException()
 
-                // The reason why we can't run block() here, is because block() calls through to
-                // `DefaultMonotonicFrameClock.withFrameNanos`, which in host side tests
-                // dispatches on the main thread. But we're already blocking the main thread, so
-                // that would deadlock.
+                    // The reason why we can't run block() here, is because block() calls through to
+                    // `DefaultMonotonicFrameClock.withFrameNanos`, which in host side tests
+                    // dispatches on the main thread. But we're already blocking the main thread, so
+                    // that would deadlock.
+                }
             }
-        }
 
-        val caught = runCatching {
-            runBlocking(policy) {
-                block()
-            }
-        }
+        val caught = runCatching { runBlocking(policy) { block() } }
 
         assertThat(applied).isTrue()
         assertThat(caught.exceptionOrNull()).isInstanceOf(CancellationException::class.java)
diff --git a/compose/ui/ui-test/src/androidUnitTest/kotlin/androidx/compose/ui/test/RobolectricComposeTest.kt b/compose/ui/ui-test/src/androidUnitTest/kotlin/androidx/compose/ui/test/RobolectricComposeTest.kt
index 374844d..b5253dd 100644
--- a/compose/ui/ui-test/src/androidUnitTest/kotlin/androidx/compose/ui/test/RobolectricComposeTest.kt
+++ b/compose/ui/ui-test/src/androidUnitTest/kotlin/androidx/compose/ui/test/RobolectricComposeTest.kt
@@ -101,20 +101,14 @@
     }
 
     @Composable
-    private fun ClickCounter(
-        clicks: MutableState<Int> = remember { mutableStateOf(0) }
-    ) {
+    private fun ClickCounter(clicks: MutableState<Int> = remember { mutableStateOf(0) }) {
         Column {
-            Button(onClick = { clicks.value++ }) {
-                Text("Click me")
-            }
+            Button(onClick = { clicks.value++ }) { Text("Click me") }
             Text("Click count: ${clicks.value}")
         }
     }
 
-    /**
-     * Check that basic scenarios work: a composition that is recomposed due to a state change.
-     */
+    /** Check that basic scenarios work: a composition that is recomposed due to a state change. */
     @Test
     fun testStateChange() = runComposeUiTest {
         val clicks = mutableStateOf(0)
@@ -145,9 +139,9 @@
     }
 
     /**
-     * Check that animation scenarios work: a composition with an animation in its initial state
-     * is idle, stays non-idle while the animation animates to a new target and is idle again
-     * after that.
+     * Check that animation scenarios work: a composition with an animation in its initial state is
+     * idle, stays non-idle while the animation animates to a new target and is idle again after
+     * that.
      */
     @Test
     fun testAnimation() = runComposeUiTest {
@@ -155,12 +149,7 @@
         setContent {
             val offset = animateFloatAsState(target)
             Box(Modifier.fillMaxSize()) {
-                Box(
-                    Modifier
-                        .size(10.dp)
-                        .offset(x = offset.value.dp)
-                        .testTag("box")
-                )
+                Box(Modifier.size(10.dp).offset(x = offset.value.dp).testTag("box"))
             }
         }
         onNodeWithTag("box").assertLeftPositionInRootIsEqualTo(0.dp)
@@ -192,9 +181,7 @@
                         // woops, we're always changing x during layout!
                         x = if (x == 0) 1 else 0
 
-                        layout(width, height) {
-                            placeables.forEach { it.place(0, 0) }
-                        }
+                        layout(width, height) { placeables.forEach { it.place(0, 0) } }
                     }
                 }
             }
@@ -202,8 +189,8 @@
     }
 
     /**
-     * Check that scrolling and controlling the clock works: a scrollable receives a swipe while
-     * the clock is paused, when the clock is resumed it performs the fling.
+     * Check that scrolling and controlling the clock works: a scrollable receives a swipe while the
+     * clock is paused, when the clock is resumed it performs the fling.
      */
     @OptIn(ExperimentalFoundationApi::class)
     @Test
@@ -221,21 +208,11 @@
                 CompositionLocalProvider(LocalOverscrollConfiguration provides null) {
                     Box(Modifier.fillMaxSize()) {
                         Column(
-                            Modifier
-                                .requiredSize(200.dp)
-                                .verticalScroll(
-                                    scrollState,
-                                    flingBehavior = flingBehavior
-                                )
+                            Modifier.requiredSize(200.dp)
+                                .verticalScroll(scrollState, flingBehavior = flingBehavior)
                                 .testTag("list")
                         ) {
-                            repeat(n) {
-                                Spacer(
-                                    Modifier
-                                        .fillMaxWidth()
-                                        .height(30.dp)
-                                )
-                            }
+                            repeat(n) { Spacer(Modifier.fillMaxWidth().height(30.dp)) }
                         }
                     }
                 }
@@ -247,9 +224,7 @@
         mainClock.autoAdvance = false
         onNodeWithTag("list").performTouchInput {
             down(bottomCenter)
-            repeat(10) {
-                moveTo(bottomCenter - percentOffset(y = (it + 1) / 10f))
-            }
+            repeat(10) { moveTo(bottomCenter - percentOffset(y = (it + 1) / 10f)) }
             up()
         }
         waitForIdle()
@@ -272,16 +247,12 @@
     fun testTextFieldInteraction() = runComposeUiTest {
         val text = "a"
         var updatedText = ""
-        setContent {
-            TextField(value = text, onValueChange = { updatedText = it })
-        }
+        setContent { TextField(value = text, onValueChange = { updatedText = it }) }
         onNodeWithText(text).assertIsDisplayed()
         // If selection isn't set on initial state, it will be 0.
         onNodeWithText(text).performTextInputSelection(TextRange(1))
         onNodeWithText(text).performTextInput("b")
-        runOnIdle {
-            assertThat(updatedText).isEqualTo("ab")
-        }
+        runOnIdle { assertThat(updatedText).isEqualTo("ab") }
     }
 
     /**
@@ -292,9 +263,7 @@
 
         override suspend fun ScrollScope.performFling(initialVelocity: Float): Float {
             for (delta in deltas) {
-                withFrameNanos {
-                    scrollBy(delta.toFloat())
-                }
+                withFrameNanos { scrollBy(delta.toFloat()) }
             }
             return 0f
         }
@@ -381,34 +350,23 @@
 
             setContent {
                 Box(
-                    modifier = Modifier
-                        .testTag("mainBox")
-                        .fillMaxSize()
-                        .pointerInput(Unit) {
-                            detectTapGestures(
-                                onPress = {
-                                    ++composableTouchCount
-                                },
-                                onTap = {
-                                    tapLatch.countDown()
-                                    ++composableTapCount
-                                },
-                                onDoubleTap = {
-                                    ++composableDoubleTapCount
-                                },
-                                onLongPress = {
-                                    ++composableLongTapCount
-                                }
-                            )
-                        }
-                        .onGloballyPositioned {
-                            setupLatch.countDown()
-                        }
-                ) {
-                    Box(
-                        modifier = Modifier
+                    modifier =
+                        Modifier.testTag("mainBox")
                             .fillMaxSize()
-                    )
+                            .pointerInput(Unit) {
+                                detectTapGestures(
+                                    onPress = { ++composableTouchCount },
+                                    onTap = {
+                                        tapLatch.countDown()
+                                        ++composableTapCount
+                                    },
+                                    onDoubleTap = { ++composableDoubleTapCount },
+                                    onLongPress = { ++composableLongTapCount }
+                                )
+                            }
+                            .onGloballyPositioned { setupLatch.countDown() }
+                ) {
+                    Box(modifier = Modifier.fillMaxSize())
                 }
             }
             assertTrue(setupLatch.await(10, TimeUnit.SECONDS))
@@ -457,34 +415,23 @@
 
         setContent {
             Box(
-                modifier = Modifier
-                    .testTag("mainBox")
-                    .fillMaxSize()
-                    .pointerInput(Unit) {
-                        detectTapGestures(
-                            onPress = {
-                                ++composableTouchCount
-                            },
-                            onTap = {
-                                ++composableTapCount
-                            },
-                            onDoubleTap = {
-                                doubleTapLatch.countDown()
-                                ++composableDoubleTapCount
-                            },
-                            onLongPress = {
-                                ++composableLongTapCount
-                            }
-                        )
-                    }
-                    .onGloballyPositioned {
-                        setupLatch.countDown()
-                    }
-            ) {
-                Box(
-                    modifier = Modifier
+                modifier =
+                    Modifier.testTag("mainBox")
                         .fillMaxSize()
-                )
+                        .pointerInput(Unit) {
+                            detectTapGestures(
+                                onPress = { ++composableTouchCount },
+                                onTap = { ++composableTapCount },
+                                onDoubleTap = {
+                                    doubleTapLatch.countDown()
+                                    ++composableDoubleTapCount
+                                },
+                                onLongPress = { ++composableLongTapCount }
+                            )
+                        }
+                        .onGloballyPositioned { setupLatch.countDown() }
+            ) {
+                Box(modifier = Modifier.fillMaxSize())
             }
         }
         assertTrue(setupLatch.await(10, TimeUnit.SECONDS))
@@ -540,35 +487,26 @@
             topLevelContainerView = LocalView.current
 
             Box(
-                modifier = Modifier
-                    .testTag("mainBox")
-                    .fillMaxSize()
-                    .pointerInput(Unit) {
-                        detectTapGestures(
-                            onPress = {
-                                ++composableTouchCount
-                            },
-                            onTap = {
-                                tapLatch.countDown()
-                                ++composableTapCount
-                            },
-                            onDoubleTap = {
-                                ++composableDoubleTapCount
-                            },
-                            onLongPress = {
-                                ++composableLongTapCount
-                            }
-                        )
-                    }
-                    .onGloballyPositioned {
-                        setupLatch.countDown()
-                        bottomBoxInnerCoordinates = it
-                    }
-            ) {
-                Box(
-                    modifier = Modifier
+                modifier =
+                    Modifier.testTag("mainBox")
                         .fillMaxSize()
-                )
+                        .pointerInput(Unit) {
+                            detectTapGestures(
+                                onPress = { ++composableTouchCount },
+                                onTap = {
+                                    tapLatch.countDown()
+                                    ++composableTapCount
+                                },
+                                onDoubleTap = { ++composableDoubleTapCount },
+                                onLongPress = { ++composableLongTapCount }
+                            )
+                        }
+                        .onGloballyPositioned {
+                            setupLatch.countDown()
+                            bottomBoxInnerCoordinates = it
+                        }
+            ) {
+                Box(modifier = Modifier.fillMaxSize())
             }
         }
         assertTrue(setupLatch.await(10, TimeUnit.SECONDS))
@@ -587,19 +525,21 @@
         coords.x = topBoxOffset.x
         coords.y = topBoxOffset.y
 
-        val motionEventDown = MotionEventBuilder.newBuilder()
-            .setEventTime(0)
-            .setAction(MotionEvent.ACTION_DOWN)
-            .setActionIndex(0)
-            .setPointer(topBoxPointerProperties, coords)
-            .build()
+        val motionEventDown =
+            MotionEventBuilder.newBuilder()
+                .setEventTime(0)
+                .setAction(MotionEvent.ACTION_DOWN)
+                .setActionIndex(0)
+                .setPointer(topBoxPointerProperties, coords)
+                .build()
 
-        val motionEventUp = MotionEventBuilder.newBuilder()
-            .setEventTime(100)
-            .setAction(MotionEvent.ACTION_UP)
-            .setActionIndex(0)
-            .setPointer(topBoxPointerProperties, coords)
-            .build()
+        val motionEventUp =
+            MotionEventBuilder.newBuilder()
+                .setEventTime(100)
+                .setAction(MotionEvent.ACTION_UP)
+                .setActionIndex(0)
+                .setPointer(topBoxPointerProperties, coords)
+                .build()
 
         topLevelContainerView?.dispatchTouchEvent(motionEventDown)
         topLevelContainerView?.dispatchTouchEvent(motionEventUp)
@@ -634,35 +574,26 @@
             topLevelContainerView = LocalView.current
 
             Box(
-                modifier = Modifier
-                    .testTag("mainBox")
-                    .fillMaxSize()
-                    .pointerInput(Unit) {
-                        detectTapGestures(
-                            onPress = {
-                                ++composableTouchCount
-                            },
-                            onTap = {
-                                ++composableTapCount
-                            },
-                            onDoubleTap = {
-                                doubleTapLatch.countDown()
-                                ++composableDoubleTapCount
-                            },
-                            onLongPress = {
-                                ++composableLongTapCount
-                            }
-                        )
-                    }
-                    .onGloballyPositioned {
-                        setupLatch.countDown()
-                        bottomBoxInnerCoordinates = it
-                    }
-            ) {
-                Box(
-                    modifier = Modifier
+                modifier =
+                    Modifier.testTag("mainBox")
                         .fillMaxSize()
-                )
+                        .pointerInput(Unit) {
+                            detectTapGestures(
+                                onPress = { ++composableTouchCount },
+                                onTap = { ++composableTapCount },
+                                onDoubleTap = {
+                                    doubleTapLatch.countDown()
+                                    ++composableDoubleTapCount
+                                },
+                                onLongPress = { ++composableLongTapCount }
+                            )
+                        }
+                        .onGloballyPositioned {
+                            setupLatch.countDown()
+                            bottomBoxInnerCoordinates = it
+                        }
+            ) {
+                Box(modifier = Modifier.fillMaxSize())
             }
         }
         assertTrue(setupLatch.await(10, TimeUnit.SECONDS))
@@ -679,19 +610,21 @@
         coords.x = topBoxOffset.x
         coords.y = topBoxOffset.y
 
-        val motionEventDown1 = MotionEventBuilder.newBuilder()
-            .setEventTime(0)
-            .setAction(MotionEvent.ACTION_DOWN)
-            .setActionIndex(0)
-            .setPointer(topBoxPointerProperties, coords)
-            .build()
+        val motionEventDown1 =
+            MotionEventBuilder.newBuilder()
+                .setEventTime(0)
+                .setAction(MotionEvent.ACTION_DOWN)
+                .setActionIndex(0)
+                .setPointer(topBoxPointerProperties, coords)
+                .build()
 
-        val motionEventUp1 = MotionEventBuilder.newBuilder()
-            .setEventTime(50)
-            .setAction(MotionEvent.ACTION_UP)
-            .setActionIndex(0)
-            .setPointer(topBoxPointerProperties, coords)
-            .build()
+        val motionEventUp1 =
+            MotionEventBuilder.newBuilder()
+                .setEventTime(50)
+                .setAction(MotionEvent.ACTION_UP)
+                .setActionIndex(0)
+                .setPointer(topBoxPointerProperties, coords)
+                .build()
 
         topLevelContainerView?.dispatchTouchEvent(motionEventDown1)
         topLevelContainerView?.dispatchTouchEvent(motionEventUp1)
@@ -700,19 +633,21 @@
         // using detectTapGestures {} as parts of it rely on changes in the clock (double tap, etc.)
         mainClock.advanceTimeBy(100)
 
-        val motionEventDown2 = MotionEventBuilder.newBuilder()
-            .setEventTime(100)
-            .setAction(MotionEvent.ACTION_DOWN)
-            .setActionIndex(0)
-            .setPointer(topBoxPointerProperties, coords)
-            .build()
+        val motionEventDown2 =
+            MotionEventBuilder.newBuilder()
+                .setEventTime(100)
+                .setAction(MotionEvent.ACTION_DOWN)
+                .setActionIndex(0)
+                .setPointer(topBoxPointerProperties, coords)
+                .build()
 
-        val motionEventUp2 = MotionEventBuilder.newBuilder()
-            .setEventTime(150)
-            .setAction(MotionEvent.ACTION_UP)
-            .setActionIndex(0)
-            .setPointer(topBoxPointerProperties, coords)
-            .build()
+        val motionEventUp2 =
+            MotionEventBuilder.newBuilder()
+                .setEventTime(150)
+                .setAction(MotionEvent.ACTION_UP)
+                .setActionIndex(0)
+                .setPointer(topBoxPointerProperties, coords)
+                .build()
 
         topLevelContainerView?.dispatchTouchEvent(motionEventDown2)
         topLevelContainerView?.dispatchTouchEvent(motionEventUp2)
@@ -735,8 +670,7 @@
         setContent {
             Column {
                 Box(
-                    Modifier
-                        .clipToBounds()
+                    Modifier.clipToBounds()
                         .size(size)
                         .testTag("tag")
                         .clickable(onClick = { clicks++ })
@@ -744,14 +678,10 @@
             }
         }
 
-        runOnIdle {
-            size = 200.dp
-        }
+        runOnIdle { size = 200.dp }
 
         onNodeWithTag("tag").performClick()
 
-        runOnIdle {
-            assertThat(clicks).isEqualTo(1)
-        }
+        runOnIdle { assertThat(clicks).isEqualTo(1) }
     }
 }
diff --git a/compose/ui/ui-test/src/androidUnitTest/kotlin/androidx/compose/ui/test/ViewVisibilityRobolectricTest.kt b/compose/ui/ui-test/src/androidUnitTest/kotlin/androidx/compose/ui/test/ViewVisibilityRobolectricTest.kt
index cdc490b..8f578f4 100644
--- a/compose/ui/ui-test/src/androidUnitTest/kotlin/androidx/compose/ui/test/ViewVisibilityRobolectricTest.kt
+++ b/compose/ui/ui-test/src/androidUnitTest/kotlin/androidx/compose/ui/test/ViewVisibilityRobolectricTest.kt
@@ -47,11 +47,7 @@
     companion object {
         @JvmStatic
         @Parameters(name = "visibility={0}")
-        fun params() = listOf(
-            View.VISIBLE,
-            View.INVISIBLE,
-            View.GONE
-        )
+        fun params() = listOf(View.VISIBLE, View.INVISIBLE, View.GONE)
     }
 
     private var offset by mutableStateOf(0)
@@ -65,9 +61,7 @@
         runComposeUiTest {
             setContent {
                 val hostView = LocalView.current
-                SideEffect {
-                    hostView.visibility = visibility
-                }
+                SideEffect { hostView.visibility = visibility }
                 TestContent()
             }
 
@@ -86,9 +80,7 @@
                 val composeView = ComposeView(activity)
                 composeView.layoutParams = ViewGroup.LayoutParams(MATCH_PARENT, MATCH_PARENT)
                 composeView.visibility = visibility
-                composeView.setContent {
-                    TestContent()
-                }
+                composeView.setContent { TestContent() }
                 activity.setContentView(composeView)
             }
 
@@ -105,13 +97,11 @@
         // not measure. Because measure is not affected, the containing View doesn't need to be
         // remeasured and Compose will do its measure/layout pass in the draw pass, meaning the
         // View will be invalidated but no layout will be requested.
-        Layout({
-            Box(Modifier.size(10.dp))
-        }, Modifier.fillMaxSize().testTag("box")) { measurables, constraints ->
+        Layout({ Box(Modifier.size(10.dp)) }, Modifier.fillMaxSize().testTag("box")) {
+            measurables,
+            constraints ->
             val placeable = measurables.first().measure(constraints)
-            layout(constraints.maxWidth, constraints.maxHeight) {
-                placeable.place(offset, 0)
-            }
+            layout(constraints.maxWidth, constraints.maxHeight) { placeable.place(offset, 0) }
         }
     }
 
diff --git a/compose/ui/ui-test/src/androidUnitTest/kotlin/androidx/compose/ui/test/inputdispatcher/AdvanceEventTimeTest.kt b/compose/ui/ui-test/src/androidUnitTest/kotlin/androidx/compose/ui/test/inputdispatcher/AdvanceEventTimeTest.kt
index ca53f9d..f2466e2 100644
--- a/compose/ui/ui-test/src/androidUnitTest/kotlin/androidx/compose/ui/test/inputdispatcher/AdvanceEventTimeTest.kt
+++ b/compose/ui/ui-test/src/androidUnitTest/kotlin/androidx/compose/ui/test/inputdispatcher/AdvanceEventTimeTest.kt
@@ -27,8 +27,8 @@
 import org.robolectric.annotation.Config
 
 /**
- * Tests if [AndroidInputDispatcher.advanceEventTime] works by sending three events with a
- * delay in between them.
+ * Tests if [AndroidInputDispatcher.advanceEventTime] works by sending three events with a delay in
+ * between them.
  */
 @SmallTest
 @RunWith(ParameterizedRobolectricTestRunner::class)
@@ -73,10 +73,9 @@
         // Check if the time between the events was exactly the delay
         val expectedFirstDelay = config.firstDelayMillis
         val expectedSecondDelay = config.secondDelayMillis
-        recorder.events.apply {
-            assertThat(this).hasSize(3)
-        }.zipWithNext { a, b -> b.eventTime - a.eventTime }.apply {
-            assertThat(this).isEqualTo(listOf(expectedFirstDelay, expectedSecondDelay))
-        }
+        recorder.events
+            .apply { assertThat(this).hasSize(3) }
+            .zipWithNext { a, b -> b.eventTime - a.eventTime }
+            .apply { assertThat(this).isEqualTo(listOf(expectedFirstDelay, expectedSecondDelay)) }
     }
 }
diff --git a/compose/ui/ui-test/src/androidUnitTest/kotlin/androidx/compose/ui/test/inputdispatcher/BatchingTest.kt b/compose/ui/ui-test/src/androidUnitTest/kotlin/androidx/compose/ui/test/inputdispatcher/BatchingTest.kt
index e915cf4..a642cdd 100644
--- a/compose/ui/ui-test/src/androidUnitTest/kotlin/androidx/compose/ui/test/inputdispatcher/BatchingTest.kt
+++ b/compose/ui/ui-test/src/androidUnitTest/kotlin/androidx/compose/ui/test/inputdispatcher/BatchingTest.kt
@@ -30,8 +30,9 @@
 class BatchingTest : InputDispatcherTest() {
 
     companion object {
-        private const val cannotEnqueueError = "Can't enqueue touch event \\(.*\\), " +
-            "AndroidInputDispatcher has already been disposed"
+        private const val cannotEnqueueError =
+            "Can't enqueue touch event \\(.*\\), " +
+                "AndroidInputDispatcher has already been disposed"
         private const val cannotFlushError =
             "Can't flush events, AndroidInputDispatcher has already been disposed"
     }
@@ -198,9 +199,7 @@
         assertThat(recorder.events).isEmpty()
 
         // 3. subsequent flush fails
-        expectError<IllegalStateException>(expectedMessage = cannotFlushError) {
-            subject.flush()
-        }
+        expectError<IllegalStateException>(expectedMessage = cannotFlushError) { subject.flush() }
         assertThat(recorder.events).isEmpty()
 
         // 4. subsequent dispose succeeds and doesn't send more
diff --git a/compose/ui/ui-test/src/androidUnitTest/kotlin/androidx/compose/ui/test/inputdispatcher/InputDispatcherTest.kt b/compose/ui/ui-test/src/androidUnitTest/kotlin/androidx/compose/ui/test/inputdispatcher/InputDispatcherTest.kt
index 30174dd..bc5247c 100644
--- a/compose/ui/ui-test/src/androidUnitTest/kotlin/androidx/compose/ui/test/inputdispatcher/InputDispatcherTest.kt
+++ b/compose/ui/ui-test/src/androidUnitTest/kotlin/androidx/compose/ui/test/inputdispatcher/InputDispatcherTest.kt
@@ -44,19 +44,18 @@
     private val testOwner: TestOwner = mock {
         val testClock: MainTestClock = mock()
         on { mainClock } doReturn testClock
-        on { runOnUiThread(any<() -> Any>()) }.then {
-            it.getArgument<() -> Any>(0).invoke()
-        }
+        on { runOnUiThread(any<() -> Any>()) }.then { it.getArgument<() -> Any>(0).invoke() }
     }
 
     private val testContext = createTestContext(testOwner)
 
     private val viewRootForTest: ViewRootForTest = mock {
         val mockView: View = mock {
-            on { getLocationOnScreen(any()) }.then {
-                it.getArgument<IntArray>(0).fill(0)
-                null
-            }
+            on { getLocationOnScreen(any()) }
+                .then {
+                    it.getArgument<IntArray>(0).fill(0)
+                    null
+                }
         }
         on { view } doReturn mockView
 
@@ -70,11 +69,8 @@
         on { semanticsOwner } doReturn mockSemanticsOwner
     }
 
-    internal val subject = AndroidInputDispatcher(
-        testContext,
-        viewRootForTest,
-        recorder::recordEvent
-    )
+    internal val subject =
+        AndroidInputDispatcher(testContext, viewRootForTest, recorder::recordEvent)
 
     @After
     fun tearDown() {
diff --git a/compose/ui/ui-test/src/androidUnitTest/kotlin/androidx/compose/ui/test/inputdispatcher/KeyAndMouseEventsTest.kt b/compose/ui/ui-test/src/androidUnitTest/kotlin/androidx/compose/ui/test/inputdispatcher/KeyAndMouseEventsTest.kt
index 2f412d9..4b0ea36 100644
--- a/compose/ui/ui-test/src/androidUnitTest/kotlin/androidx/compose/ui/test/inputdispatcher/KeyAndMouseEventsTest.kt
+++ b/compose/ui/ui-test/src/androidUnitTest/kotlin/androidx/compose/ui/test/inputdispatcher/KeyAndMouseEventsTest.kt
@@ -38,7 +38,7 @@
 import org.robolectric.annotation.Config
 
 /**
- * Tests if [AndroidInputDispatcher.enqueueKeyDown], [AndroidInputDispatcher.enqueueKeyUp]  and
+ * Tests if [AndroidInputDispatcher.enqueueKeyDown], [AndroidInputDispatcher.enqueueKeyUp] and
  * friends work.
  */
 @RunWith(AndroidJUnit4::class)
@@ -87,9 +87,16 @@
 
         private const val allLockMasks = capsLockMask or numLockMask or scrollLockMask
 
-        private const val allMetaMasks = functionKeyMetaMask or leftCtrlMask or rightCtrlMask or
-            leftAltMask or rightAltMask or leftMetaMask or rightMetaMask or
-            leftShiftMask or rightShiftMask
+        private const val allMetaMasks =
+            functionKeyMetaMask or
+                leftCtrlMask or
+                rightCtrlMask or
+                leftAltMask or
+                rightAltMask or
+                leftMetaMask or
+                rightMetaMask or
+                leftShiftMask or
+                rightShiftMask
 
         private const val allMasks = allLockMasks or allMetaMasks
     }
@@ -99,44 +106,33 @@
         verifyMetaKeyClickState(functionKey, functionKeyMetaMask)
 
     @Test
-    fun leftCtrl_metaState_generatedCorrectly() =
-        verifyMetaKeyClickState(leftCtrl, leftCtrlMask)
+    fun leftCtrl_metaState_generatedCorrectly() = verifyMetaKeyClickState(leftCtrl, leftCtrlMask)
 
     @Test
-    fun rightCtrl_metaState_generatedCorrectly() =
-        verifyMetaKeyClickState(rightCtrl, rightCtrlMask)
+    fun rightCtrl_metaState_generatedCorrectly() = verifyMetaKeyClickState(rightCtrl, rightCtrlMask)
+
+    @Test fun leftAlt_metaState_generatedCorrectly() = verifyMetaKeyClickState(leftAlt, leftAltMask)
 
     @Test
-    fun leftAlt_metaState_generatedCorrectly() =
-        verifyMetaKeyClickState(leftAlt, leftAltMask)
+    fun rightAlt_metaState_generatedCorrectly() = verifyMetaKeyClickState(rightAlt, rightAltMask)
 
     @Test
-    fun rightAlt_metaState_generatedCorrectly() =
-        verifyMetaKeyClickState(rightAlt, rightAltMask)
+    fun leftMeta_metaState_generatedCorrectly() = verifyMetaKeyClickState(leftMeta, leftMetaMask)
 
     @Test
-    fun leftMeta_metaState_generatedCorrectly() =
-        verifyMetaKeyClickState(leftMeta, leftMetaMask)
+    fun rightMeta_metaState_generatedCorrectly() = verifyMetaKeyClickState(rightMeta, rightMetaMask)
 
     @Test
-    fun rightMeta_metaState_generatedCorrectly() =
-        verifyMetaKeyClickState(rightMeta, rightMetaMask)
-
-    @Test
-    fun leftShift_metaState_generatedCorrectly() =
-        verifyMetaKeyClickState(leftShift, leftShiftMask)
+    fun leftShift_metaState_generatedCorrectly() = verifyMetaKeyClickState(leftShift, leftShiftMask)
 
     @Test
     fun rightShift_metaState_generatedCorrectly() =
         verifyMetaKeyClickState(rightShift, rightShiftMask)
 
     @Test
-    fun capsLock_metaState_generatedCorrectly() =
-        verifyLockKeyClickState(capsLock, capsLockMask)
+    fun capsLock_metaState_generatedCorrectly() = verifyLockKeyClickState(capsLock, capsLockMask)
 
-    @Test
-    fun numLock_metaState_generatedCorrectly() =
-        verifyLockKeyClickState(numLock, numLockMask)
+    @Test fun numLock_metaState_generatedCorrectly() = verifyLockKeyClickState(numLock, numLockMask)
 
     @Test
     fun scrollLock_metaState_generatedCorrectly() =
@@ -152,12 +148,25 @@
         subject.flush()
 
         assertEquals(8, recorder.events.size)
-        recorder.events[5].verifyKeyEvent(keyUp, scrollLock.nativeKeyCode,
-            expectedMetaState = allLockMasks)
-        recorder.events[6].verifyMouseEvent(MotionEvent.ACTION_DOWN, 0L,
-            Offset.Zero, MotionEvent.BUTTON_PRIMARY, expectedMetaState = allLockMasks)
-        recorder.events[7].verifyMouseEvent(MotionEvent.ACTION_BUTTON_PRESS, 0L,
-            Offset.Zero, MotionEvent.BUTTON_PRIMARY, expectedMetaState = allLockMasks)
+        recorder.events[5].verifyKeyEvent(
+            keyUp,
+            scrollLock.nativeKeyCode,
+            expectedMetaState = allLockMasks
+        )
+        recorder.events[6].verifyMouseEvent(
+            MotionEvent.ACTION_DOWN,
+            0L,
+            Offset.Zero,
+            MotionEvent.BUTTON_PRIMARY,
+            expectedMetaState = allLockMasks
+        )
+        recorder.events[7].verifyMouseEvent(
+            MotionEvent.ACTION_BUTTON_PRESS,
+            0L,
+            Offset.Zero,
+            MotionEvent.BUTTON_PRIMARY,
+            expectedMetaState = allLockMasks
+        )
     }
 
     @Test
@@ -176,12 +185,25 @@
         subject.flush()
 
         assertEquals(11, recorder.events.size)
-        recorder.events[8].verifyKeyEvent(keyDown, rightShift.nativeKeyCode,
-            expectedMetaState = allMetaMasks)
-        recorder.events[9].verifyMouseEvent(MotionEvent.ACTION_DOWN, 0L,
-            Offset.Zero, MotionEvent.BUTTON_PRIMARY, expectedMetaState = allMetaMasks)
-        recorder.events[10].verifyMouseEvent(MotionEvent.ACTION_BUTTON_PRESS, 0L,
-            Offset.Zero, MotionEvent.BUTTON_PRIMARY, expectedMetaState = allMetaMasks)
+        recorder.events[8].verifyKeyEvent(
+            keyDown,
+            rightShift.nativeKeyCode,
+            expectedMetaState = allMetaMasks
+        )
+        recorder.events[9].verifyMouseEvent(
+            MotionEvent.ACTION_DOWN,
+            0L,
+            Offset.Zero,
+            MotionEvent.BUTTON_PRIMARY,
+            expectedMetaState = allMetaMasks
+        )
+        recorder.events[10].verifyMouseEvent(
+            MotionEvent.ACTION_BUTTON_PRESS,
+            0L,
+            Offset.Zero,
+            MotionEvent.BUTTON_PRIMARY,
+            expectedMetaState = allMetaMasks
+        )
     }
 
     @Test
@@ -203,12 +225,25 @@
         subject.flush()
 
         assertEquals(17, recorder.events.size)
-        recorder.events[14].verifyKeyEvent(keyDown, rightShift.nativeKeyCode,
-            expectedMetaState = allMasks)
-        recorder.events[15].verifyMouseEvent(MotionEvent.ACTION_DOWN, 0L,
-            Offset.Zero, MotionEvent.BUTTON_PRIMARY, expectedMetaState = allMasks)
-        recorder.events[16].verifyMouseEvent(MotionEvent.ACTION_BUTTON_PRESS, 0L,
-            Offset.Zero, MotionEvent.BUTTON_PRIMARY, expectedMetaState = allMasks)
+        recorder.events[14].verifyKeyEvent(
+            keyDown,
+            rightShift.nativeKeyCode,
+            expectedMetaState = allMasks
+        )
+        recorder.events[15].verifyMouseEvent(
+            MotionEvent.ACTION_DOWN,
+            0L,
+            Offset.Zero,
+            MotionEvent.BUTTON_PRIMARY,
+            expectedMetaState = allMasks
+        )
+        recorder.events[16].verifyMouseEvent(
+            MotionEvent.ACTION_BUTTON_PRESS,
+            0L,
+            Offset.Zero,
+            MotionEvent.BUTTON_PRIMARY,
+            expectedMetaState = allMasks
+        )
     }
 
     @Test
@@ -270,22 +305,39 @@
         var buttonState = 0
         events.removeFirst(2).let { (enterEvent, hoverEvent) ->
             enterEvent.verifyMouseEvent(
-                MotionEvent.ACTION_HOVER_ENTER, t,
-                position1, buttonState, expectedMetaState = allMasks)
+                MotionEvent.ACTION_HOVER_ENTER,
+                t,
+                position1,
+                buttonState,
+                expectedMetaState = allMasks
+            )
             hoverEvent.verifyMouseEvent(
-                MotionEvent.ACTION_HOVER_MOVE, t,
-                position1, buttonState, expectedMetaState = allMasks)
+                MotionEvent.ACTION_HOVER_MOVE,
+                t,
+                position1,
+                buttonState,
+                expectedMetaState = allMasks
+            )
         }
 
         // hover + scroll
         t += InputDispatcher.eventPeriodMillis
         events.removeFirst(2).let { (hoverEvent, scrollEvent) ->
             hoverEvent.verifyMouseEvent(
-                MotionEvent.ACTION_HOVER_MOVE, t,
-                position1, buttonState, expectedMetaState = allMasks)
+                MotionEvent.ACTION_HOVER_MOVE,
+                t,
+                position1,
+                buttonState,
+                expectedMetaState = allMasks
+            )
             scrollEvent.verifyMouseEvent(
-                MotionEvent.ACTION_SCROLL, t,
-                position1, buttonState, scrollAxis(1f), expectedMetaState = allMasks)
+                MotionEvent.ACTION_SCROLL,
+                t,
+                position1,
+                buttonState,
+                scrollAxis(1f),
+                expectedMetaState = allMasks
+            )
         }
 
         // exit + down + press
@@ -293,25 +345,46 @@
         buttonState = MotionEvent.BUTTON_PRIMARY
         events.removeFirst(3).let { (exitEvent, downEvent, pressEvent) ->
             exitEvent.verifyMouseEvent(
-                MotionEvent.ACTION_HOVER_EXIT, t,
-                position1, buttonState, expectedMetaState = allMasks)
+                MotionEvent.ACTION_HOVER_EXIT,
+                t,
+                position1,
+                buttonState,
+                expectedMetaState = allMasks
+            )
             downEvent.verifyMouseEvent(
-                MotionEvent.ACTION_DOWN, t,
-                position1, buttonState, expectedMetaState = allMasks)
+                MotionEvent.ACTION_DOWN,
+                t,
+                position1,
+                buttonState,
+                expectedMetaState = allMasks
+            )
             pressEvent.verifyMouseEvent(
-                MotionEvent.ACTION_BUTTON_PRESS, t,
-                position1, buttonState, expectedMetaState = allMasks)
+                MotionEvent.ACTION_BUTTON_PRESS,
+                t,
+                position1,
+                buttonState,
+                expectedMetaState = allMasks
+            )
         }
 
         // move + scroll
         t += InputDispatcher.eventPeriodMillis
         events.removeFirst(2).let { (moveEvent, scrollEvent) ->
             moveEvent.verifyMouseEvent(
-                MotionEvent.ACTION_MOVE, t,
-                position1, buttonState, expectedMetaState = allMasks)
+                MotionEvent.ACTION_MOVE,
+                t,
+                position1,
+                buttonState,
+                expectedMetaState = allMasks
+            )
             scrollEvent.verifyMouseEvent(
-                MotionEvent.ACTION_SCROLL, t,
-                position1, buttonState, scrollAxis(2f), expectedMetaState = allMasks)
+                MotionEvent.ACTION_SCROLL,
+                t,
+                position1,
+                buttonState,
+                scrollAxis(2f),
+                expectedMetaState = allMasks
+            )
         }
 
         // release + up + enter + hover
@@ -319,40 +392,64 @@
         buttonState = 0
         events.removeFirst(4).let { (releaseEvent, upEvent, enterEvent, hoverEvent) ->
             releaseEvent.verifyMouseEvent(
-                MotionEvent.ACTION_BUTTON_RELEASE, t,
-                position1, buttonState, expectedMetaState = allMasks)
+                MotionEvent.ACTION_BUTTON_RELEASE,
+                t,
+                position1,
+                buttonState,
+                expectedMetaState = allMasks
+            )
             upEvent.verifyMouseEvent(
-                MotionEvent.ACTION_UP, t,
-                position1, buttonState, expectedMetaState = allMasks)
+                MotionEvent.ACTION_UP,
+                t,
+                position1,
+                buttonState,
+                expectedMetaState = allMasks
+            )
             enterEvent.verifyMouseEvent(
-                MotionEvent.ACTION_HOVER_ENTER, t,
-                position1, buttonState, expectedMetaState = allMasks)
+                MotionEvent.ACTION_HOVER_ENTER,
+                t,
+                position1,
+                buttonState,
+                expectedMetaState = allMasks
+            )
             hoverEvent.verifyMouseEvent(
-                MotionEvent.ACTION_HOVER_MOVE, t,
-                position1, buttonState, expectedMetaState = allMasks)
+                MotionEvent.ACTION_HOVER_MOVE,
+                t,
+                position1,
+                buttonState,
+                expectedMetaState = allMasks
+            )
         }
 
         // hover + scroll
         t += InputDispatcher.eventPeriodMillis
         events.removeFirst(2).let { (hoverEvent, scrollEvent) ->
             hoverEvent.verifyMouseEvent(
-                MotionEvent.ACTION_HOVER_MOVE, t,
-                position1, buttonState, expectedMetaState = allMasks)
+                MotionEvent.ACTION_HOVER_MOVE,
+                t,
+                position1,
+                buttonState,
+                expectedMetaState = allMasks
+            )
             scrollEvent.verifyMouseEvent(
-                MotionEvent.ACTION_SCROLL, t,
-                position1, buttonState, scrollAxis(3f), expectedMetaState = allMasks)
+                MotionEvent.ACTION_SCROLL,
+                t,
+                position1,
+                buttonState,
+                scrollAxis(3f),
+                expectedMetaState = allMasks
+            )
         }
     }
 
     private fun AndroidInputDispatcher.verifyMousePosition(expectedPosition: Offset) {
         Truth.assertWithMessage("currentMousePosition")
-            .that(currentMousePosition).isEqualTo(expectedPosition)
+            .that(currentMousePosition)
+            .isEqualTo(expectedPosition)
     }
 
     private fun <E> MutableList<E>.removeFirst(n: Int): List<E> {
-        return mutableListOf<E>().also { result ->
-            repeat(n) { result.add(removeFirst()) }
-        }
+        return mutableListOf<E>().also { result -> repeat(n) { result.add(removeFirst()) } }
     }
 
     private fun enqueueKeyPress(key: Key) {
@@ -372,35 +469,80 @@
         Truth.assertThat(recorder.events).hasSize(11)
 
         // Key Down
-        recorder.events[0].verifyKeyEvent(keyDown, key.nativeKeyCode,
-            expectedMetaState = expectedMetaState)
+        recorder.events[0].verifyKeyEvent(
+            keyDown,
+            key.nativeKeyCode,
+            expectedMetaState = expectedMetaState
+        )
 
         // Mouse Press
-        recorder.events[1].verifyMouseEvent(MotionEvent.ACTION_DOWN, 0L,
-            Offset.Zero, MotionEvent.BUTTON_PRIMARY, expectedMetaState = expectedMetaState)
-        recorder.events[2].verifyMouseEvent(MotionEvent.ACTION_BUTTON_PRESS, 0L,
-            Offset.Zero, MotionEvent.BUTTON_PRIMARY, expectedMetaState = expectedMetaState)
+        recorder.events[1].verifyMouseEvent(
+            MotionEvent.ACTION_DOWN,
+            0L,
+            Offset.Zero,
+            MotionEvent.BUTTON_PRIMARY,
+            expectedMetaState = expectedMetaState
+        )
+        recorder.events[2].verifyMouseEvent(
+            MotionEvent.ACTION_BUTTON_PRESS,
+            0L,
+            Offset.Zero,
+            MotionEvent.BUTTON_PRIMARY,
+            expectedMetaState = expectedMetaState
+        )
 
         // Mouse Release
-        recorder.events[3].verifyMouseEvent(MotionEvent.ACTION_BUTTON_RELEASE, 0L,
-            Offset.Zero, 0, expectedMetaState = expectedMetaState)
-        recorder.events[4].verifyMouseEvent(MotionEvent.ACTION_UP, 0L,
-            Offset.Zero, 0, expectedMetaState = expectedMetaState)
-        recorder.events[5].verifyMouseEvent(MotionEvent.ACTION_HOVER_ENTER, 0L,
-            Offset.Zero, 0, expectedMetaState = expectedMetaState)
-        recorder.events[6].verifyMouseEvent(MotionEvent.ACTION_HOVER_MOVE, 0L,
-            Offset.Zero, 0, expectedMetaState = expectedMetaState)
+        recorder.events[3].verifyMouseEvent(
+            MotionEvent.ACTION_BUTTON_RELEASE,
+            0L,
+            Offset.Zero,
+            0,
+            expectedMetaState = expectedMetaState
+        )
+        recorder.events[4].verifyMouseEvent(
+            MotionEvent.ACTION_UP,
+            0L,
+            Offset.Zero,
+            0,
+            expectedMetaState = expectedMetaState
+        )
+        recorder.events[5].verifyMouseEvent(
+            MotionEvent.ACTION_HOVER_ENTER,
+            0L,
+            Offset.Zero,
+            0,
+            expectedMetaState = expectedMetaState
+        )
+        recorder.events[6].verifyMouseEvent(
+            MotionEvent.ACTION_HOVER_MOVE,
+            0L,
+            Offset.Zero,
+            0,
+            expectedMetaState = expectedMetaState
+        )
 
         // Key Release
         recorder.events[7].verifyKeyEvent(keyUp, key.nativeKeyCode)
 
         // Mouse Press
-        recorder.events[8].verifyMouseEvent(MotionEvent.ACTION_HOVER_EXIT, 0L,
-            Offset.Zero, MotionEvent.BUTTON_PRIMARY)
-        recorder.events[9].verifyMouseEvent(MotionEvent.ACTION_DOWN, 0L,
-            Offset.Zero, MotionEvent.BUTTON_PRIMARY)
-        recorder.events[10].verifyMouseEvent(MotionEvent.ACTION_BUTTON_PRESS, 0L,
-            Offset.Zero, MotionEvent.BUTTON_PRIMARY)
+        recorder.events[8].verifyMouseEvent(
+            MotionEvent.ACTION_HOVER_EXIT,
+            0L,
+            Offset.Zero,
+            MotionEvent.BUTTON_PRIMARY
+        )
+        recorder.events[9].verifyMouseEvent(
+            MotionEvent.ACTION_DOWN,
+            0L,
+            Offset.Zero,
+            MotionEvent.BUTTON_PRIMARY
+        )
+        recorder.events[10].verifyMouseEvent(
+            MotionEvent.ACTION_BUTTON_PRESS,
+            0L,
+            Offset.Zero,
+            MotionEvent.BUTTON_PRIMARY
+        )
     }
 
     private fun verifyLockKeyClickState(key: Key, expectedMetaState: Int = 0) {
@@ -416,38 +558,89 @@
         Truth.assertThat(recorder.events).hasSize(13)
 
         // Key Toggle On
-        recorder.events[0].verifyKeyEvent(keyDown, key.nativeKeyCode,
-            expectedMetaState = expectedMetaState)
-        recorder.events[1].verifyKeyEvent(keyUp, key.nativeKeyCode,
-            expectedMetaState = expectedMetaState)
+        recorder.events[0].verifyKeyEvent(
+            keyDown,
+            key.nativeKeyCode,
+            expectedMetaState = expectedMetaState
+        )
+        recorder.events[1].verifyKeyEvent(
+            keyUp,
+            key.nativeKeyCode,
+            expectedMetaState = expectedMetaState
+        )
 
         // Mouse Press
-        recorder.events[2].verifyMouseEvent(MotionEvent.ACTION_DOWN, 0L,
-            Offset.Zero, MotionEvent.BUTTON_PRIMARY, expectedMetaState = expectedMetaState)
-        recorder.events[3].verifyMouseEvent(MotionEvent.ACTION_BUTTON_PRESS, 0L,
-            Offset.Zero, MotionEvent.BUTTON_PRIMARY, expectedMetaState = expectedMetaState)
+        recorder.events[2].verifyMouseEvent(
+            MotionEvent.ACTION_DOWN,
+            0L,
+            Offset.Zero,
+            MotionEvent.BUTTON_PRIMARY,
+            expectedMetaState = expectedMetaState
+        )
+        recorder.events[3].verifyMouseEvent(
+            MotionEvent.ACTION_BUTTON_PRESS,
+            0L,
+            Offset.Zero,
+            MotionEvent.BUTTON_PRIMARY,
+            expectedMetaState = expectedMetaState
+        )
 
         // Mouse Release
-        recorder.events[4].verifyMouseEvent(MotionEvent.ACTION_BUTTON_RELEASE, 0L,
-            Offset.Zero, 0, expectedMetaState = expectedMetaState)
-        recorder.events[5].verifyMouseEvent(MotionEvent.ACTION_UP, 0L,
-            Offset.Zero, 0, expectedMetaState = expectedMetaState)
-        recorder.events[6].verifyMouseEvent(MotionEvent.ACTION_HOVER_ENTER, 0L,
-            Offset.Zero, 0, expectedMetaState = expectedMetaState)
-        recorder.events[7].verifyMouseEvent(MotionEvent.ACTION_HOVER_MOVE, 0L,
-            Offset.Zero, 0, expectedMetaState = expectedMetaState)
+        recorder.events[4].verifyMouseEvent(
+            MotionEvent.ACTION_BUTTON_RELEASE,
+            0L,
+            Offset.Zero,
+            0,
+            expectedMetaState = expectedMetaState
+        )
+        recorder.events[5].verifyMouseEvent(
+            MotionEvent.ACTION_UP,
+            0L,
+            Offset.Zero,
+            0,
+            expectedMetaState = expectedMetaState
+        )
+        recorder.events[6].verifyMouseEvent(
+            MotionEvent.ACTION_HOVER_ENTER,
+            0L,
+            Offset.Zero,
+            0,
+            expectedMetaState = expectedMetaState
+        )
+        recorder.events[7].verifyMouseEvent(
+            MotionEvent.ACTION_HOVER_MOVE,
+            0L,
+            Offset.Zero,
+            0,
+            expectedMetaState = expectedMetaState
+        )
 
         // Key Toggle Off
-        recorder.events[8].verifyKeyEvent(keyDown, key.nativeKeyCode,
-            expectedMetaState = expectedMetaState)
+        recorder.events[8].verifyKeyEvent(
+            keyDown,
+            key.nativeKeyCode,
+            expectedMetaState = expectedMetaState
+        )
         recorder.events[9].verifyKeyEvent(keyUp, key.nativeKeyCode)
 
         // Mouse Press
-        recorder.events[10].verifyMouseEvent(MotionEvent.ACTION_HOVER_EXIT, 0L,
-            Offset.Zero, MotionEvent.BUTTON_PRIMARY)
-        recorder.events[11].verifyMouseEvent(MotionEvent.ACTION_DOWN, 0L,
-            Offset.Zero, MotionEvent.BUTTON_PRIMARY)
-        recorder.events[12].verifyMouseEvent(MotionEvent.ACTION_BUTTON_PRESS, 0L,
-            Offset.Zero, MotionEvent.BUTTON_PRIMARY)
+        recorder.events[10].verifyMouseEvent(
+            MotionEvent.ACTION_HOVER_EXIT,
+            0L,
+            Offset.Zero,
+            MotionEvent.BUTTON_PRIMARY
+        )
+        recorder.events[11].verifyMouseEvent(
+            MotionEvent.ACTION_DOWN,
+            0L,
+            Offset.Zero,
+            MotionEvent.BUTTON_PRIMARY
+        )
+        recorder.events[12].verifyMouseEvent(
+            MotionEvent.ACTION_BUTTON_PRESS,
+            0L,
+            Offset.Zero,
+            MotionEvent.BUTTON_PRIMARY
+        )
     }
 }
diff --git a/compose/ui/ui-test/src/androidUnitTest/kotlin/androidx/compose/ui/test/inputdispatcher/KeyEventsTest.kt b/compose/ui/ui-test/src/androidUnitTest/kotlin/androidx/compose/ui/test/inputdispatcher/KeyEventsTest.kt
index 4d1f794..4a00fa1 100644
--- a/compose/ui/ui-test/src/androidUnitTest/kotlin/androidx/compose/ui/test/inputdispatcher/KeyEventsTest.kt
+++ b/compose/ui/ui-test/src/androidUnitTest/kotlin/androidx/compose/ui/test/inputdispatcher/KeyEventsTest.kt
@@ -34,7 +34,7 @@
 import org.robolectric.annotation.Config
 
 /**
- * Tests if [AndroidInputDispatcher.enqueueKeyDown], [AndroidInputDispatcher.enqueueKeyUp]  and
+ * Tests if [AndroidInputDispatcher.enqueueKeyDown], [AndroidInputDispatcher.enqueueKeyUp] and
  * friends work.
  */
 @RunWith(AndroidJUnit4::class)
@@ -82,9 +82,16 @@
 
         private const val allLockMasks = capsLockMask or numLockMask or scrollLockMask
 
-        private const val allMetaMasks = functionKeyMetaMask or leftCtrlMask or rightCtrlMask or
-            leftAltMask or rightAltMask or leftMetaMask or rightMetaMask or
-            leftShiftMask or rightShiftMask
+        private const val allMetaMasks =
+            functionKeyMetaMask or
+                leftCtrlMask or
+                rightCtrlMask or
+                leftAltMask or
+                rightAltMask or
+                leftMetaMask or
+                rightMetaMask or
+                leftShiftMask or
+                rightShiftMask
 
         private const val allMasks = allLockMasks or allMetaMasks
 
@@ -137,15 +144,14 @@
         subject.flush()
 
         assertTrue(subject.isCapsLockOn)
-        recorder.events.last().verifyKeyEvent(
-            keyDown, aKey.nativeKeyCode, 0, 0, capsLockMask or leftShiftMask
-        )
+        recorder.events
+            .last()
+            .verifyKeyEvent(keyDown, aKey.nativeKeyCode, 0, 0, capsLockMask or leftShiftMask)
     }
 
     /* Lock key state tests. */
 
-    @Test
-    fun capsLock_startsOff() = assertFalse(subject.isCapsLockOn)
+    @Test fun capsLock_startsOff() = assertFalse(subject.isCapsLockOn)
 
     @Test
     fun capsLockOn_afterDown() {
@@ -166,8 +172,7 @@
         assertFalse(subject.isCapsLockOn)
     }
 
-    @Test
-    fun numLock_startsOff() = assertFalse(subject.isNumLockOn)
+    @Test fun numLock_startsOff() = assertFalse(subject.isNumLockOn)
 
     @Test
     fun numLockOn_afterDown() {
@@ -188,8 +193,7 @@
         assertFalse(subject.isNumLockOn)
     }
 
-    @Test
-    fun scrollLock_startsOff() = assertFalse(subject.isScrollLockOn)
+    @Test fun scrollLock_startsOff() = assertFalse(subject.isScrollLockOn)
 
     @Test
     fun scrollLockOn_afterDown() {
@@ -217,44 +221,33 @@
         verifyMetaKeyMetaState(functionKey, functionKeyMetaMask)
 
     @Test
-    fun leftCtrl_metaState_generatedCorrectly() =
-        verifyMetaKeyMetaState(leftCtrl, leftCtrlMask)
+    fun leftCtrl_metaState_generatedCorrectly() = verifyMetaKeyMetaState(leftCtrl, leftCtrlMask)
 
     @Test
-    fun rightCtrl_metaState_generatedCorrectly() =
-        verifyMetaKeyMetaState(rightCtrl, rightCtrlMask)
+    fun rightCtrl_metaState_generatedCorrectly() = verifyMetaKeyMetaState(rightCtrl, rightCtrlMask)
+
+    @Test fun leftAlt_metaState_generatedCorrectly() = verifyMetaKeyMetaState(leftAlt, leftAltMask)
 
     @Test
-    fun leftAlt_metaState_generatedCorrectly() =
-        verifyMetaKeyMetaState(leftAlt, leftAltMask)
+    fun rightAlt_metaState_generatedCorrectly() = verifyMetaKeyMetaState(rightAlt, rightAltMask)
 
     @Test
-    fun rightAlt_metaState_generatedCorrectly() =
-        verifyMetaKeyMetaState(rightAlt, rightAltMask)
+    fun leftMeta_metaState_generatedCorrectly() = verifyMetaKeyMetaState(leftMeta, leftMetaMask)
 
     @Test
-    fun leftMeta_metaState_generatedCorrectly() =
-        verifyMetaKeyMetaState(leftMeta, leftMetaMask)
+    fun rightMeta_metaState_generatedCorrectly() = verifyMetaKeyMetaState(rightMeta, rightMetaMask)
 
     @Test
-    fun rightMeta_metaState_generatedCorrectly() =
-        verifyMetaKeyMetaState(rightMeta, rightMetaMask)
-
-    @Test
-    fun leftShift_metaState_generatedCorrectly() =
-        verifyMetaKeyMetaState(leftShift, leftShiftMask)
+    fun leftShift_metaState_generatedCorrectly() = verifyMetaKeyMetaState(leftShift, leftShiftMask)
 
     @Test
     fun rightShift_metaState_generatedCorrectly() =
         verifyMetaKeyMetaState(rightShift, rightShiftMask)
 
     @Test
-    fun capsLock_metaState_generatedCorrectly() =
-        verifyLockKeyMetaState(capsLock, capsLockMask)
+    fun capsLock_metaState_generatedCorrectly() = verifyLockKeyMetaState(capsLock, capsLockMask)
 
-    @Test
-    fun numLock_metaState_generatedCorrectly() =
-        verifyLockKeyMetaState(numLock, numLockMask)
+    @Test fun numLock_metaState_generatedCorrectly() = verifyLockKeyMetaState(numLock, numLockMask)
 
     @Test
     fun scrollLock_metaState_generatedCorrectly() =
@@ -269,11 +262,9 @@
 
         recorder.assertHasValidEventTimes()
         assertEquals(6, recorder.events.size)
-        recorder.events.last().verifyKeyEvent(
-            keyUp,
-            scrollLock.nativeKeyCode,
-            expectedMetaState = allLockMasks
-        )
+        recorder.events
+            .last()
+            .verifyKeyEvent(keyUp, scrollLock.nativeKeyCode, expectedMetaState = allLockMasks)
     }
 
     @Test
@@ -291,9 +282,9 @@
 
         recorder.assertHasValidEventTimes()
         assertEquals(9, recorder.events.size)
-        recorder.events.last().verifyKeyEvent(
-            keyDown, rightShift.nativeKeyCode, expectedMetaState = allMetaMasks
-        )
+        recorder.events
+            .last()
+            .verifyKeyEvent(keyDown, rightShift.nativeKeyCode, expectedMetaState = allMetaMasks)
     }
 
     @Test
@@ -314,9 +305,9 @@
 
         recorder.assertHasValidEventTimes()
         assertEquals(15, recorder.events.size)
-        recorder.events.last().verifyKeyEvent(
-            keyDown, rightShift.nativeKeyCode, expectedMetaState = allMasks
-        )
+        recorder.events
+            .last()
+            .verifyKeyEvent(keyDown, rightShift.nativeKeyCode, expectedMetaState = allMasks)
     }
 
     /* Repeat key tests */
@@ -331,10 +322,9 @@
         recorder.assertHasValidEventTimes()
         assertEquals(2, recorder.events.size)
         recorder.events.first().verifyKeyEvent(keyDown, aKey.nativeKeyCode)
-        recorder.events.last().verifyKeyEvent(
-            keyUp, aKey.nativeKeyCode,
-            expectedEventTime = initialRepeatDelay - 1
-        )
+        recorder.events
+            .last()
+            .verifyKeyEvent(keyUp, aKey.nativeKeyCode, expectedEventTime = initialRepeatDelay - 1)
     }
 
     @Test
@@ -347,10 +337,17 @@
         recorder.assertHasValidEventTimes()
         assertEquals(3, recorder.events.size)
         recorder.events[0].verifyKeyEvent(keyDown, aKey.nativeKeyCode)
-        recorder.events[1].verifyKeyEvent(keyDown, aKey.nativeKeyCode,
-            expectedEventTime = initialRepeatDelay, expectedRepeat = 1)
-        recorder.events[2].verifyKeyEvent(keyUp, aKey.nativeKeyCode,
-            expectedEventTime = initialRepeatDelay)
+        recorder.events[1].verifyKeyEvent(
+            keyDown,
+            aKey.nativeKeyCode,
+            expectedEventTime = initialRepeatDelay,
+            expectedRepeat = 1
+        )
+        recorder.events[2].verifyKeyEvent(
+            keyUp,
+            aKey.nativeKeyCode,
+            expectedEventTime = initialRepeatDelay
+        )
     }
 
     @Test
@@ -364,8 +361,12 @@
         recorder.assertHasValidEventTimes()
         assertEquals(2, recorder.events.size)
         recorder.events[0].verifyKeyEvent(keyDown, aKey.nativeKeyCode)
-        recorder.events[1].verifyKeyEvent(keyDown, oneKey.nativeKeyCode,
-            expectedEventTime = initialRepeatDelay - 1, expectedDownTime = initialRepeatDelay - 1)
+        recorder.events[1].verifyKeyEvent(
+            keyDown,
+            oneKey.nativeKeyCode,
+            expectedEventTime = initialRepeatDelay - 1,
+            expectedDownTime = initialRepeatDelay - 1
+        )
     }
 
     @Test
@@ -380,8 +381,12 @@
         assertEquals(3, recorder.events.size)
 
         recorder.events[0].verifyKeyEvent(keyDown, aKey.nativeKeyCode)
-        recorder.events[1].verifyKeyEvent(keyDown, oneKey.nativeKeyCode,
-            expectedEventTime = initialRepeatDelay - 1, expectedDownTime = initialRepeatDelay - 1)
+        recorder.events[1].verifyKeyEvent(
+            keyDown,
+            oneKey.nativeKeyCode,
+            expectedEventTime = initialRepeatDelay - 1,
+            expectedDownTime = initialRepeatDelay - 1
+        )
         recorder.events[2].verifyKeyEvent(
             keyDown,
             oneKey.nativeKeyCode,
@@ -405,8 +410,12 @@
         assertEquals(4, recorder.events.size)
 
         recorder.events[0].verifyKeyEvent(keyDown, aKey.nativeKeyCode)
-        recorder.events[1].verifyKeyEvent(keyDown, oneKey.nativeKeyCode,
-            expectedEventTime = initialRepeatDelay - 1, expectedDownTime = initialRepeatDelay - 1)
+        recorder.events[1].verifyKeyEvent(
+            keyDown,
+            oneKey.nativeKeyCode,
+            expectedEventTime = initialRepeatDelay - 1,
+            expectedDownTime = initialRepeatDelay - 1
+        )
         recorder.events[2].verifyKeyEvent(
             keyDown,
             oneKey.nativeKeyCode,
@@ -435,8 +444,14 @@
         subject.flush()
 
         assertEquals(2, recorder.events.size)
-        recorder.events.last().verifyKeyEvent(keyDown, aKey.nativeKeyCode,
-            expectedEventTime = initialRepeatDelay, expectedRepeat = 1)
+        recorder.events
+            .last()
+            .verifyKeyEvent(
+                keyDown,
+                aKey.nativeKeyCode,
+                expectedEventTime = initialRepeatDelay,
+                expectedRepeat = 1
+            )
 
         subject.advanceEventTime(subsequentRepeatDelay - 1) // t = 549
         subject.flush()
@@ -446,8 +461,14 @@
         subject.flush()
 
         assertEquals(3, recorder.events.size)
-        recorder.events.last().verifyKeyEvent(keyDown, aKey.nativeKeyCode,
-            expectedEventTime = initialRepeatDelay + subsequentRepeatDelay, expectedRepeat = 2)
+        recorder.events
+            .last()
+            .verifyKeyEvent(
+                keyDown,
+                aKey.nativeKeyCode,
+                expectedEventTime = initialRepeatDelay + subsequentRepeatDelay,
+                expectedRepeat = 2
+            )
 
         subject.advanceEventTime(subsequentRepeatDelay * 10) // t = 1050
         subject.flush()
@@ -456,9 +477,12 @@
         assertEquals(13, recorder.events.size)
 
         recorder.events.drop(3).forEachIndexed { i, event ->
-            event.verifyKeyEvent(keyDown, aKey.nativeKeyCode,
+            event.verifyKeyEvent(
+                keyDown,
+                aKey.nativeKeyCode,
                 expectedEventTime = (initialRepeatDelay + subsequentRepeatDelay * (i + 2)),
-                expectedRepeat = 3 + i)
+                expectedRepeat = 3 + i
+            )
         }
     }
 
@@ -469,7 +493,7 @@
         subject.enqueueKeyDown(oneKey)
         expectError<IllegalStateException>(
             expectedMessage =
-            "Cannot send key down event, Key\\($oneKey\\) is already pressed down."
+                "Cannot send key down event, Key\\($oneKey\\) is already pressed down."
         ) {
             subject.enqueueKeyDown(oneKey)
         }
@@ -496,7 +520,9 @@
         recorder.assertHasValidEventTimes()
         assertEquals(2, recorder.events.size)
         recorder.events[0].verifyKeyEvent(
-            keyDown, key.nativeKeyCode, expectedMetaState = expectedMetaState
+            keyDown,
+            key.nativeKeyCode,
+            expectedMetaState = expectedMetaState
         )
         recorder.events[1].verifyKeyEvent(keyUp, key.nativeKeyCode)
     }
@@ -509,13 +535,20 @@
         recorder.assertHasValidEventTimes()
         assertEquals(4, recorder.events.size)
         recorder.events[0].verifyKeyEvent(
-            keyDown, key.nativeKeyCode, expectedMetaState = expectedMetaState
+            keyDown,
+            key.nativeKeyCode,
+            expectedMetaState = expectedMetaState
         )
         recorder.events[1].verifyKeyEvent(
-            keyUp, key.nativeKeyCode, expectedMetaState = expectedMetaState
+            keyUp,
+            key.nativeKeyCode,
+            expectedMetaState = expectedMetaState
         )
-        recorder.events[2].verifyKeyEvent(keyDown, key.nativeKeyCode,
-            expectedMetaState = expectedMetaState)
+        recorder.events[2].verifyKeyEvent(
+            keyDown,
+            key.nativeKeyCode,
+            expectedMetaState = expectedMetaState
+        )
         recorder.events[3].verifyKeyEvent(keyUp, key.nativeKeyCode)
     }
 }
diff --git a/compose/ui/ui-test/src/androidUnitTest/kotlin/androidx/compose/ui/test/inputdispatcher/MouseEventsTest.kt b/compose/ui/ui-test/src/androidUnitTest/kotlin/androidx/compose/ui/test/inputdispatcher/MouseEventsTest.kt
index d5558ec..666dd7d 100644
--- a/compose/ui/ui-test/src/androidUnitTest/kotlin/androidx/compose/ui/test/inputdispatcher/MouseEventsTest.kt
+++ b/compose/ui/ui-test/src/androidUnitTest/kotlin/androidx/compose/ui/test/inputdispatcher/MouseEventsTest.kt
@@ -50,9 +50,7 @@
 import org.junit.runner.RunWith
 import org.robolectric.annotation.Config
 
-/**
- * Tests if [AndroidInputDispatcher.enqueueMousePress] and friends work.
- */
+/** Tests if [AndroidInputDispatcher.enqueueMousePress] and friends work. */
 @RunWith(AndroidJUnit4::class)
 @Config(minSdk = RobolectricMinSdk)
 @OptIn(ExperimentalTestApi::class)
@@ -746,8 +744,9 @@
     fun enqueueMouseDown_outOfBounds() {
         subject.updateMousePosition(positionMin1)
         expectError<IllegalStateException>(
-            expectedMessage = "Cannot start a mouse gesture outside the Compose root bounds, " +
-                "mouse position is .* and bounds are .*"
+            expectedMessage =
+                "Cannot start a mouse gesture outside the Compose root bounds, " +
+                    "mouse position is .* and bounds are .*"
         ) {
             subject.enqueueMousePress(1)
         }
@@ -785,8 +784,9 @@
     @Test
     fun enqueueMouseEnter_outOfBounds() {
         expectError<IllegalStateException>(
-            expectedMessage = "Cannot send mouse hover enter event, " +
-                "Offset\\(-1\\.0, -1\\.0\\) is out of bounds"
+            expectedMessage =
+                "Cannot send mouse hover enter event, " +
+                    "Offset\\(-1\\.0, -1\\.0\\) is out of bounds"
         ) {
             subject.enqueueMouseEnter(positionMin1)
         }
@@ -812,12 +812,11 @@
 
     private fun AndroidInputDispatcher.verifyMousePosition(expectedPosition: Offset) {
         assertWithMessage("currentMousePosition")
-            .that(currentMousePosition).isEqualTo(expectedPosition)
+            .that(currentMousePosition)
+            .isEqualTo(expectedPosition)
     }
 
     private fun <E> MutableList<E>.removeFirst(n: Int): List<E> {
-        return mutableListOf<E>().also { result ->
-            repeat(n) { result.add(removeFirst()) }
-        }
+        return mutableListOf<E>().also { result -> repeat(n) { result.add(removeFirst()) } }
     }
 }
diff --git a/compose/ui/ui-test/src/androidUnitTest/kotlin/androidx/compose/ui/test/inputdispatcher/TouchEventsTest.kt b/compose/ui/ui-test/src/androidUnitTest/kotlin/androidx/compose/ui/test/inputdispatcher/TouchEventsTest.kt
index 23b6a7e..02338e3 100644
--- a/compose/ui/ui-test/src/androidUnitTest/kotlin/androidx/compose/ui/test/inputdispatcher/TouchEventsTest.kt
+++ b/compose/ui/ui-test/src/androidUnitTest/kotlin/androidx/compose/ui/test/inputdispatcher/TouchEventsTest.kt
@@ -37,9 +37,7 @@
 import org.junit.runner.RunWith
 import org.robolectric.annotation.Config
 
-/**
- * Tests if [AndroidInputDispatcher.enqueueTouchDown] and friends work.
- */
+/** Tests if [AndroidInputDispatcher.enqueueTouchDown] and friends work. */
 @RunWith(AndroidJUnit4::class)
 @Config(minSdk = RobolectricMinSdk)
 class TouchEventsTest : InputDispatcherTest() {
@@ -634,124 +632,94 @@
     @Test
     fun enqueueTouchDown_afterDown() {
         subject.enqueueTouchDown(pointer1, position1)
-        expectError<IllegalArgumentException> {
-            subject.enqueueTouchDown(pointer1, position2)
-        }
+        expectError<IllegalArgumentException> { subject.enqueueTouchDown(pointer1, position2) }
     }
 
     @Test
     fun updateTouchPointer_withoutDown() {
-        expectError<IllegalStateException> {
-            subject.updateTouchPointer(pointer1, position1_1)
-        }
+        expectError<IllegalStateException> { subject.updateTouchPointer(pointer1, position1_1) }
     }
 
     @Test
     fun updateTouchPointer_wrongPointerId() {
         subject.enqueueTouchDown(pointer1, position1_1)
-        expectError<IllegalArgumentException> {
-            subject.updateTouchPointer(pointer2, position1_2)
-        }
+        expectError<IllegalArgumentException> { subject.updateTouchPointer(pointer2, position1_2) }
     }
 
     @Test
     fun updateTouchPointer_afterUp() {
         subject.enqueueTouchDown(pointer1, position1_1)
         subject.enqueueTouchUp(pointer1)
-        expectError<IllegalStateException> {
-            subject.updateTouchPointer(pointer1, position1_2)
-        }
+        expectError<IllegalStateException> { subject.updateTouchPointer(pointer1, position1_2) }
     }
 
     @Test
     fun updateTouchPointer_afterCancel() {
         subject.enqueueTouchDown(pointer1, position1_1)
         subject.enqueueTouchCancel()
-        expectError<IllegalStateException> {
-            subject.updateTouchPointer(pointer1, position1_2)
-        }
+        expectError<IllegalStateException> { subject.updateTouchPointer(pointer1, position1_2) }
     }
 
     @Test
     fun enqueueTouchMove_withoutDown() {
-        expectError<IllegalStateException> {
-            subject.enqueueTouchMove()
-        }
+        expectError<IllegalStateException> { subject.enqueueTouchMove() }
     }
 
     @Test
     fun enqueueTouchMove_afterUp() {
         subject.enqueueTouchDown(pointer1, position1_1)
         subject.enqueueTouchUp(pointer1)
-        expectError<IllegalStateException> {
-            subject.enqueueTouchMove()
-        }
+        expectError<IllegalStateException> { subject.enqueueTouchMove() }
     }
 
     @Test
     fun enqueueTouchMove_afterCancel() {
         subject.enqueueTouchDown(pointer1, position1_1)
         subject.enqueueTouchCancel()
-        expectError<IllegalStateException> {
-            subject.enqueueTouchMove()
-        }
+        expectError<IllegalStateException> { subject.enqueueTouchMove() }
     }
 
     @Test
     fun enqueueTouchUp_withoutDown() {
-        expectError<IllegalStateException> {
-            subject.enqueueTouchUp(pointer1)
-        }
+        expectError<IllegalStateException> { subject.enqueueTouchUp(pointer1) }
     }
 
     @Test
     fun enqueueTouchUp_wrongPointerId() {
         subject.enqueueTouchDown(pointer1, position1_1)
-        expectError<IllegalArgumentException> {
-            subject.enqueueTouchUp(pointer2)
-        }
+        expectError<IllegalArgumentException> { subject.enqueueTouchUp(pointer2) }
     }
 
     @Test
     fun enqueueTouchUp_afterUp() {
         subject.enqueueTouchDown(pointer1, position1_1)
         subject.enqueueTouchUp(pointer1)
-        expectError<IllegalStateException> {
-            subject.enqueueTouchUp(pointer1)
-        }
+        expectError<IllegalStateException> { subject.enqueueTouchUp(pointer1) }
     }
 
     @Test
     fun enqueueTouchUp_afterCancel() {
         subject.enqueueTouchDown(pointer1, position1_1)
         subject.enqueueTouchCancel()
-        expectError<IllegalStateException> {
-            subject.enqueueTouchUp(pointer1)
-        }
+        expectError<IllegalStateException> { subject.enqueueTouchUp(pointer1) }
     }
 
     @Test
     fun enqueueTouchCancel_withoutDown() {
-        expectError<IllegalStateException> {
-            subject.enqueueTouchCancel()
-        }
+        expectError<IllegalStateException> { subject.enqueueTouchCancel() }
     }
 
     @Test
     fun enqueueTouchCancel_afterUp() {
         subject.enqueueTouchDown(pointer1, position1_1)
         subject.enqueueTouchUp(pointer1)
-        expectError<IllegalStateException> {
-            subject.enqueueTouchCancel()
-        }
+        expectError<IllegalStateException> { subject.enqueueTouchCancel() }
     }
 
     @Test
     fun enqueueTouchCancel_afterCancel() {
         subject.enqueueTouchDown(pointer1, position1_1)
         subject.enqueueTouchCancel()
-        expectError<IllegalStateException> {
-            subject.enqueueTouchCancel()
-        }
+        expectError<IllegalStateException> { subject.enqueueTouchCancel() }
     }
 }
diff --git a/compose/ui/ui-test/src/androidUnitTest/kotlin/androidx/compose/ui/test/util/IsMonotonicBetweenTest.kt b/compose/ui/ui-test/src/androidUnitTest/kotlin/androidx/compose/ui/test/util/IsMonotonicBetweenTest.kt
index 4d2b5ae..ccc2544 100644
--- a/compose/ui/ui-test/src/androidUnitTest/kotlin/androidx/compose/ui/test/util/IsMonotonicBetweenTest.kt
+++ b/compose/ui/ui-test/src/androidUnitTest/kotlin/androidx/compose/ui/test/util/IsMonotonicBetweenTest.kt
@@ -83,9 +83,7 @@
     @Test
     fun testIsMonotonicBetween() {
         config.apply {
-            expectAssertionError(expectError) {
-                values.isMonotonicBetween(a, b, tolerance)
-            }
+            expectAssertionError(expectError) { values.isMonotonicBetween(a, b, tolerance) }
         }
     }
 }
diff --git a/compose/ui/ui-test/src/androidUnitTest/kotlin/androidx/compose/ui/test/util/SplitsDurationEquallyIntoTest.kt b/compose/ui/ui-test/src/androidUnitTest/kotlin/androidx/compose/ui/test/util/SplitsDurationEquallyIntoTest.kt
index 6c22ff7..2d937e2 100644
--- a/compose/ui/ui-test/src/androidUnitTest/kotlin/androidx/compose/ui/test/util/SplitsDurationEquallyIntoTest.kt
+++ b/compose/ui/ui-test/src/androidUnitTest/kotlin/androidx/compose/ui/test/util/SplitsDurationEquallyIntoTest.kt
@@ -27,8 +27,8 @@
 import org.robolectric.annotation.Config
 
 /**
- * Tests for `List<MotionEvent>.`[splitsDurationEquallyInto]. See documentation of that method
- * for expected results.
+ * Tests for `List<MotionEvent>.`[splitsDurationEquallyInto]. See documentation of that method for
+ * expected results.
  */
 @RunWith(ParameterizedRobolectricTestRunner::class)
 @Config(minSdk = RobolectricMinSdk)
@@ -87,9 +87,7 @@
 
     @Before
     fun setUp() {
-        motionEvents = config.timestamps.map { time ->
-            MotionEvent.obtain(0L, time, 0, 0f, 0f, 0)
-        }
+        motionEvents = config.timestamps.map { time -> MotionEvent.obtain(0L, time, 0, 0f, 0f, 0) }
     }
 
     @After
diff --git a/compose/ui/ui-test/src/commonMain/kotlin/androidx/compose/ui/test/Actions.kt b/compose/ui/ui-test/src/commonMain/kotlin/androidx/compose/ui/test/Actions.kt
index 9f7e62c..92bbd1d 100644
--- a/compose/ui/ui-test/src/commonMain/kotlin/androidx/compose/ui/test/Actions.kt
+++ b/compose/ui/ui-test/src/commonMain/kotlin/androidx/compose/ui/test/Actions.kt
@@ -42,23 +42,22 @@
 internal expect fun SemanticsNodeInteraction.performClickImpl(): SemanticsNodeInteraction
 
 /**
- * Performs a click action on the element represented by the given semantics node. Depending on
- * the platform this may be implemented by a touch click (tap), a mouse click, or another more
+ * Performs a click action on the element represented by the given semantics node. Depending on the
+ * platform this may be implemented by a touch click (tap), a mouse click, or another more
  * appropriate method for that platform.
  *
  * @return The [SemanticsNodeInteraction] that is the receiver of this method
  */
 fun SemanticsNodeInteraction.performClick(): SemanticsNodeInteraction {
-    @OptIn(ExperimentalTestApi::class)
-    return this.invokeGlobalAssertions().performClickImpl()
+    @OptIn(ExperimentalTestApi::class) return this.invokeGlobalAssertions().performClickImpl()
 }
 
 /**
  * Scrolls the closest enclosing scroll parent by the smallest amount such that this node is fully
- * visible in its viewport. If this node is larger than the viewport, scrolls the scroll parent
- * by the smallest amount such that this node fills the entire viewport. A scroll parent is a
- * parent node that has the semantics action [SemanticsActions.ScrollBy] (usually implemented by
- * defining [scrollBy][androidx.compose.ui.semantics.scrollBy]).
+ * visible in its viewport. If this node is larger than the viewport, scrolls the scroll parent by
+ * the smallest amount such that this node fills the entire viewport. A scroll parent is a parent
+ * node that has the semantics action [SemanticsActions.ScrollBy] (usually implemented by defining
+ * [scrollBy][androidx.compose.ui.semantics.scrollBy]).
  *
  * This action should be performed on the [node][SemanticsNodeInteraction] that is part of the
  * scrollable content, not on the scrollable container.
@@ -68,28 +67,28 @@
  * @return The [SemanticsNodeInteraction] that is the receiver of this method
  */
 fun SemanticsNodeInteraction.performScrollTo(): SemanticsNodeInteraction {
-    @OptIn(ExperimentalTestApi::class)
-    invokeGlobalAssertions()
+    @OptIn(ExperimentalTestApi::class) invokeGlobalAssertions()
     @OptIn(InternalTestApi::class)
     fetchSemanticsNode("Action performScrollTo() failed.").scrollToNode(testContext.testOwner)
     return this
 }
 
-/**
- * Implementation of [performScrollTo]
- */
+/** Implementation of [performScrollTo] */
 @OptIn(InternalTestApi::class)
 private fun SemanticsNode.scrollToNode(testOwner: TestOwner) {
-    val scrollableNode = findClosestParentNode {
-        hasScrollAction().matches(it)
-    } ?: throw AssertionError("Semantic Node has no parent layout with a Scroll SemanticsAction")
+    val scrollableNode =
+        findClosestParentNode { hasScrollAction().matches(it) }
+            ?: throw AssertionError(
+                "Semantic Node has no parent layout with a Scroll SemanticsAction"
+            )
 
     // Figure out the (clipped) bounds of the viewPort in its direct parent's content area, in
     // root coordinates. We only want the clipping from the direct parent on the scrollable, not
     // from any other ancestors.
     val viewportInParent = scrollableNode.layoutInfo.coordinates.boundsInParent()
-    val parentInRoot = scrollableNode.layoutInfo.coordinates.parentLayoutCoordinates
-        ?.positionInRoot() ?: Offset.Zero
+    val parentInRoot =
+        scrollableNode.layoutInfo.coordinates.parentLayoutCoordinates?.positionInRoot()
+            ?: Offset.Zero
     val viewport = viewportInParent.translate(parentInRoot)
     val target = Rect(positionInRoot, size.toSize())
 
@@ -111,17 +110,15 @@
     // And adjust for reversing properties
     if (scrollableNode.isReversedVertically) dy = -dy
 
-    testOwner.runOnUiThread {
-        scrollableNode.config[ScrollBy].action?.invoke(dx, dy)
-    }
+    testOwner.runOnUiThread { scrollableNode.config[ScrollBy].action?.invoke(dx, dy) }
 }
 
 /**
  * Scrolls a scrollable container with items to the item with the given [index].
  *
  * Note that not all scrollable containers have item indices. For example, a
- * [scrollable][androidx.compose.foundation.gestures.scrollable] doesn't have items with an
- * index, while [LazyColumn][androidx.compose.foundation.lazy.LazyColumn] does.
+ * [scrollable][androidx.compose.foundation.gestures.scrollable] doesn't have items with an index,
+ * while [LazyColumn][androidx.compose.foundation.lazy.LazyColumn] does.
  *
  * This action should be performed on a [node][SemanticsNodeInteraction] that is a scrollable
  * container, not on a node that is part of the content of that container.
@@ -130,23 +127,17 @@
  *
  * @param index The index of the item to scroll to
  * @return The [SemanticsNodeInteraction] that is the receiver of this method
- *
  * @see hasScrollToIndexAction
  */
 fun SemanticsNodeInteraction.performScrollToIndex(index: Int): SemanticsNodeInteraction {
-    @OptIn(ExperimentalTestApi::class)
-    invokeGlobalAssertions()
+    @OptIn(ExperimentalTestApi::class) invokeGlobalAssertions()
     fetchSemanticsNode("Failed: performScrollToIndex($index)").scrollToIndex(index, this)
     return this
 }
 
-/**
- * Implementation of [performScrollToIndex]
- */
+/** Implementation of [performScrollToIndex] */
 private fun SemanticsNode.scrollToIndex(index: Int, nodeInteraction: SemanticsNodeInteraction) {
-    nodeInteraction.requireSemantics(this, ScrollToIndex) {
-        "Failed to scroll to index $index"
-    }
+    nodeInteraction.requireSemantics(this, ScrollToIndex) { "Failed to scroll to index $index" }
 
     @OptIn(InternalTestApi::class)
     nodeInteraction.testContext.testOwner.runOnUiThread {
@@ -166,12 +157,10 @@
  *
  * @param key The key of the item to scroll to
  * @return The [SemanticsNodeInteraction] that is the receiver of this method
- *
  * @see hasScrollToKeyAction
  */
 fun SemanticsNodeInteraction.performScrollToKey(key: Any): SemanticsNodeInteraction {
-    @OptIn(ExperimentalTestApi::class)
-    invokeGlobalAssertions()
+    @OptIn(ExperimentalTestApi::class) invokeGlobalAssertions()
     val node = fetchSemanticsNode("Failed: performScrollToKey(\"$key\")")
     requireSemantics(node, IndexForKey, ScrollToIndex) {
         "Failed to scroll to the item identified by \"$key\""
@@ -183,21 +172,19 @@
     }
 
     @OptIn(InternalTestApi::class)
-    testContext.testOwner.runOnUiThread {
-        node.config[ScrollToIndex].action!!.invoke(index)
-    }
+    testContext.testOwner.runOnUiThread { node.config[ScrollToIndex].action!!.invoke(index) }
 
     return this
 }
 
 /**
  * Scrolls a scrollable container to the content that matches the given [matcher]. If the content
- * isn't yet visible, the scrollable container will be scrolled from the start till the end till
- * it finds the content we're looking for. It is not defined where in the viewport the content
- * will be on success of this function, but it will be either fully within the viewport if it is
- * smaller than the viewport, or it will cover the whole viewport if it is larger than the
- * viewport. If it doesn't find the content, the scrollable will be left at the end of the
- * content and an [AssertionError] is thrown.
+ * isn't yet visible, the scrollable container will be scrolled from the start till the end till it
+ * finds the content we're looking for. It is not defined where in the viewport the content will be
+ * on success of this function, but it will be either fully within the viewport if it is smaller
+ * than the viewport, or it will cover the whole viewport if it is larger than the viewport. If it
+ * doesn't find the content, the scrollable will be left at the end of the content and an
+ * [AssertionError] is thrown.
  *
  * This action should be performed on a [node][SemanticsNodeInteraction] that is a scrollable
  * container, not on a node that is part of the content of that container. If the container is a
@@ -213,21 +200,18 @@
  * actions.
  *
  * @param matcher A matcher that identifies the content where the scrollable container needs to
- * scroll to
+ *   scroll to
  * @return The [SemanticsNodeInteraction] that is the receiver of this method. Note that this is
- * _not_ an interaction for the node that is identified by the [matcher].
- *
+ *   _not_ an interaction for the node that is identified by the [matcher].
  * @see hasScrollToNodeAction
  */
 fun SemanticsNodeInteraction.performScrollToNode(
     matcher: SemanticsMatcher
 ): SemanticsNodeInteraction {
-    @OptIn(ExperimentalTestApi::class)
-    invokeGlobalAssertions()
+    @OptIn(ExperimentalTestApi::class) invokeGlobalAssertions()
     var node = fetchSemanticsNode("Failed: performScrollToNode(${matcher.description})")
     matcher.findMatchInDescendants(node)?.also {
-        @OptIn(InternalTestApi::class)
-        it.scrollToNode(testContext.testOwner)
+        @OptIn(InternalTestApi::class) it.scrollToNode(testContext.testOwner)
         return this
     }
 
@@ -247,8 +231,7 @@
         // Fetch the node again
         node = fetchSemanticsNode("Failed: performScrollToNode(${matcher.description})")
         matcher.findMatchInDescendants(node)?.also {
-            @OptIn(InternalTestApi::class)
-            it.scrollToNode(testContext.testOwner)
+            @OptIn(InternalTestApi::class) it.scrollToNode(testContext.testOwner)
             return this
         }
 
@@ -265,9 +248,7 @@
 
         // Scroll one screen
         @OptIn(InternalTestApi::class)
-        testContext.testOwner.runOnUiThread {
-            node.config[ScrollBy].action?.invoke(dx, dy)
-        }
+        testContext.testOwner.runOnUiThread { node.config[ScrollBy].action?.invoke(dx, dy) }
     }
 }
 
@@ -281,31 +262,30 @@
  * touching the screen).
  *
  * All events that are injected from the [block] are batched together and sent after [block] is
- * complete. This method blocks while the events are injected. If an error occurs during
- * execution of [block] or injection of the events, all (subsequent) events are dropped and the
- * error is thrown here.
+ * complete. This method blocks while the events are injected. If an error occurs during execution
+ * of [block] or injection of the events, all (subsequent) events are dropped and the error is
+ * thrown here.
  *
  * Due to the batching of events, all events in a block are sent together and no recomposition will
  * take place in between events. Additionally all events will be generated before any of the events
- * take effect. This means that the screen coordinates of all events are resolved before any of
- * the events can cause the position of the node being injected into to change. This has certain
+ * take effect. This means that the screen coordinates of all events are resolved before any of the
+ * events can cause the position of the node being injected into to change. This has certain
  * advantages, for example, in the cases of nested scrolling or dragging an element around, it
- * prevents the injection of events into a moving target since all events are enqueued before any
- * of them has taken effect.
+ * prevents the injection of events into a moving target since all events are enqueued before any of
+ * them has taken effect.
  *
  * Example of performing a click:
+ *
  * @sample androidx.compose.ui.test.samples.gestureClick
  *
- * @param block A lambda with [GestureScope] as receiver that describes the gesture by
- * sending all touch events.
+ * @param block A lambda with [GestureScope] as receiver that describes the gesture by sending all
+ *   touch events.
  * @return The [SemanticsNodeInteraction] that is the receiver of this method
  */
 @Deprecated(
     message = "Replaced by performTouchInput",
-    replaceWith = ReplaceWith(
-        "performTouchInput(block)",
-        "import androidx.compose.ui.test.performGesture"
-    )
+    replaceWith =
+        ReplaceWith("performTouchInput(block)", "import androidx.compose.ui.test.performGesture")
 )
 @Suppress("DEPRECATION")
 fun SemanticsNodeInteraction.performGesture(
@@ -332,41 +312,43 @@
  * touching the screen).
  *
  * All events that are injected from the [block] are batched together and sent after [block] is
- * complete. This method blocks while the events are injected. If an error occurs during
- * execution of [block] or injection of the events, all (subsequent) events are dropped and the
- * error is thrown here.
+ * complete. This method blocks while the events are injected. If an error occurs during execution
+ * of [block] or injection of the events, all (subsequent) events are dropped and the error is
+ * thrown here.
  *
  * Due to the batching of events, all events in a block are sent together and no recomposition will
  * take place in between events. Additionally all events will be generated before any of the events
- * take effect. This means that the screen coordinates of all events are resolved before any of
- * the events can cause the position of the node being injected into to change. This has certain
+ * take effect. This means that the screen coordinates of all events are resolved before any of the
+ * events can cause the position of the node being injected into to change. This has certain
  * advantages, for example, in the cases of nested scrolling or dragging an element around, it
- * prevents the injection of events into a moving target since all events are enqueued before any
- * of them has taken effect.
+ * prevents the injection of events into a moving target since all events are enqueued before any of
+ * them has taken effect.
  *
  * Example of performing a swipe up:
+ *
  * @sample androidx.compose.ui.test.samples.touchInputSwipeUp
  *
  * Example of performing an off-center click:
+ *
  * @sample androidx.compose.ui.test.samples.touchInputClickOffCenter
  *
  * Example of doing an assertion during a click:
+ *
  * @sample androidx.compose.ui.test.samples.touchInputAssertDuringClick
  *
  * Example of performing a click-and-drag:
+ *
  * @sample androidx.compose.ui.test.samples.touchInputClickAndDrag
  *
  * @param block A lambda with [TouchInjectionScope] as receiver that describes the gesture by
- * sending all touch events.
+ *   sending all touch events.
  * @return The [SemanticsNodeInteraction] that is the receiver of this method
- *
  * @see TouchInjectionScope
  */
 fun SemanticsNodeInteraction.performTouchInput(
     block: TouchInjectionScope.() -> Unit
 ): SemanticsNodeInteraction {
-    @OptIn(ExperimentalTestApi::class)
-    invokeGlobalAssertions()
+    @OptIn(ExperimentalTestApi::class) invokeGlobalAssertions()
     val node = fetchSemanticsNode("Failed to inject touch input.")
     with(MultiModalInjectionScopeImpl(node, testContext)) {
         try {
@@ -384,40 +366,40 @@
  * event time is initialized to the current time of the [MainTestClock].
  *
  * Be aware that if you split a gesture over multiple invocations of `perform.*Input`, everything
- * that happens in between will run as if the gesture is still ongoing (imagine a mouse button
- * still being pressed).
+ * that happens in between will run as if the gesture is still ongoing (imagine a mouse button still
+ * being pressed).
  *
  * All events that are injected from the [block] are batched together and sent after [block] is
- * complete. This method blocks while the events are injected. If an error occurs during
- * execution of [block] or injection of the events, all (subsequent) events are dropped and the
- * error is thrown here.
+ * complete. This method blocks while the events are injected. If an error occurs during execution
+ * of [block] or injection of the events, all (subsequent) events are dropped and the error is
+ * thrown here.
  *
  * Due to the batching of events, all events in a block are sent together and no recomposition will
  * take place in between events. Additionally all events will be generated before any of the events
- * take effect. This means that the screen coordinates of all events are resolved before any of
- * the events can cause the position of the node being injected into to change. This has certain
+ * take effect. This means that the screen coordinates of all events are resolved before any of the
+ * events can cause the position of the node being injected into to change. This has certain
  * advantages, for example, in the cases of nested scrolling or dragging an element around, it
- * prevents the injection of events into a moving target since all events are enqueued before any
- * of them has taken effect.
+ * prevents the injection of events into a moving target since all events are enqueued before any of
+ * them has taken effect.
  *
  * Example of performing a mouse click:
+ *
  * @sample androidx.compose.ui.test.samples.mouseInputClick
  *
  * Example of scrolling the mouse wheel while the mouse button is pressed:
+ *
  * @sample androidx.compose.ui.test.samples.mouseInputScrollWhileDown
  *
  * @param block A lambda with [MouseInjectionScope] as receiver that describes the gesture by
- * sending all mouse events.
+ *   sending all mouse events.
  * @return The [SemanticsNodeInteraction] that is the receiver of this method
- *
  * @see MouseInjectionScope
  */
 @ExperimentalTestApi
 fun SemanticsNodeInteraction.performMouseInput(
     block: MouseInjectionScope.() -> Unit
 ): SemanticsNodeInteraction {
-    @OptIn(ExperimentalTestApi::class)
-    invokeGlobalAssertions()
+    @OptIn(ExperimentalTestApi::class) invokeGlobalAssertions()
     val node = fetchSemanticsNode("Failed to inject mouse input.")
     with(MultiModalInjectionScopeImpl(node, testContext)) {
         try {
@@ -435,30 +417,28 @@
  * event time is initialized to the current time of the [MainTestClock].
  *
  * All events that are injected from the [block] are batched together and sent after [block] is
- * complete. This method blocks while the events are injected. If an error occurs during
- * execution of [block] or injection of the events, all (subsequent) events are dropped and the
- * error is thrown here.
+ * complete. This method blocks while the events are injected. If an error occurs during execution
+ * of [block] or injection of the events, all (subsequent) events are dropped and the error is
+ * thrown here.
  *
  * Due to the batching of events, all events in a block are sent together and no recomposition will
  * take place in between events. Additionally all events will be generated before any of the events
- * take effect. This means that the screen coordinates of all events are resolved before any of
- * the events can cause the position of the node being injected into to change. This has certain
+ * take effect. This means that the screen coordinates of all events are resolved before any of the
+ * events can cause the position of the node being injected into to change. This has certain
  * advantages, for example, in the cases of nested scrolling or dragging an element around, it
- * prevents the injection of events into a moving target since all events are enqueued before any
- * of them has taken effect.
+ * prevents the injection of events into a moving target since all events are enqueued before any of
+ * them has taken effect.
  *
- * @param block A lambda with [KeyInjectionScope] as receiver that describes the gesture by
- * sending all key press events.
+ * @param block A lambda with [KeyInjectionScope] as receiver that describes the gesture by sending
+ *   all key press events.
  * @return The [SemanticsNodeInteraction] that is the receiver of this method
- *
  * @see KeyInjectionScope
  */
 @ExperimentalTestApi
 fun SemanticsNodeInteraction.performKeyInput(
     block: KeyInjectionScope.() -> Unit
 ): SemanticsNodeInteraction {
-    @OptIn(ExperimentalTestApi::class)
-    invokeGlobalAssertions()
+    @OptIn(ExperimentalTestApi::class) invokeGlobalAssertions()
     val node = fetchSemanticsNode("Failed to inject key input.")
     with(MultiModalInjectionScopeImpl(node, testContext)) {
         try {
@@ -473,35 +453,34 @@
 /**
  * Executes the multi-modal gesture specified in the given [block]. The gesture doesn't need to be
  * complete and can be resumed in a later invocation of one of the `perform.*Input` methods. The
- * event time is initialized to the current time of the [MainTestClock]. If only a single
- * modality is needed (e.g. touch, mouse, stylus, keyboard, etc), you should use the
- * `perform.*Input` of that modality instead.
+ * event time is initialized to the current time of the [MainTestClock]. If only a single modality
+ * is needed (e.g. touch, mouse, stylus, keyboard, etc), you should use the `perform.*Input` of that
+ * modality instead.
  *
  * Functions for each modality can be called by invoking that modality's function, like
- * [touch][MultiModalInjectionScope.touch] to inject touch events. This allows you to
- * inject events for each modality.
+ * [touch][MultiModalInjectionScope.touch] to inject touch events. This allows you to inject events
+ * for each modality.
  *
  * Be aware that if you split a gesture over multiple invocations of `perform.*Input`, everything
  * that happens in between will run as if the gesture is still ongoing (imagine a finger still
  * touching the screen).
  *
  * All events that are injected from the [block] are batched together and sent after [block] is
- * complete. This method blocks while the events are injected. If an error occurs during
- * execution of [block] or injection of the events, all (subsequent) events are dropped and the
- * error is thrown here.
+ * complete. This method blocks while the events are injected. If an error occurs during execution
+ * of [block] or injection of the events, all (subsequent) events are dropped and the error is
+ * thrown here.
  *
  * Due to the batching of events, all events in a block are sent together and no recomposition will
  * take place in between events. Additionally all events will be generated before any of the events
- * take effect. This means that the screen coordinates of all events are resolved before any of
- * the events can cause the position of the node being injected into to change. This has certain
+ * take effect. This means that the screen coordinates of all events are resolved before any of the
+ * events can cause the position of the node being injected into to change. This has certain
  * advantages, for example, in the cases of nested scrolling or dragging an element around, it
- * prevents the injection of events into a moving target since all events are enqueued before any
- * of them has taken effect.
+ * prevents the injection of events into a moving target since all events are enqueued before any of
+ * them has taken effect.
  *
- * @param block A lambda with [MultiModalInjectionScope] as receiver that describes the gesture
- * by sending all multi modal events.
+ * @param block A lambda with [MultiModalInjectionScope] as receiver that describes the gesture by
+ *   sending all multi modal events.
  * @return The [SemanticsNodeInteraction] that is the receiver of this method
- *
  * @see MultiModalInjectionScope
  */
 // TODO(fresen): add example of multi-modal input when key input is added (touch and mouse
@@ -545,15 +524,14 @@
  *
  * This method is supposed to be used for actions with parameters.
  *
- * This will properly verify that the actions exists and provide clear error message in case it
- * does not. It also handle synchronization and performing the action on the UI thread. This call
- * is blocking until the action is performed
+ * This will properly verify that the actions exists and provide clear error message in case it does
+ * not. It also handle synchronization and performing the action on the UI thread. This call is
+ * blocking until the action is performed
  *
  * @param key Key of the action to be performed.
  * @param invocation Place where you call your action. In the argument is provided the underlying
- * action from the given Semantics action.
+ *   action from the given Semantics action.
  * @return The [SemanticsNodeInteraction] that is the receiver of this method
- *
  * @throws AssertionError If the semantics action is not defined on this node.
  */
 fun <T : Function<Boolean>> SemanticsNodeInteraction.performSemanticsAction(
@@ -561,14 +539,10 @@
     invocation: (T) -> Unit
 ): SemanticsNodeInteraction {
     val node = fetchSemanticsNode("Failed to perform ${key.name} action.")
-    requireSemantics(node, key) {
-        "Failed to perform action ${key.name}"
-    }
+    requireSemantics(node, key) { "Failed to perform action ${key.name}" }
 
     @OptIn(InternalTestApi::class)
-    testContext.testOwner.runOnUiThread {
-        node.config[key].action?.let(invocation)
-    }
+    testContext.testOwner.runOnUiThread { node.config[key].action?.let(invocation) }
 
     return this
 }
@@ -590,13 +564,12 @@
  *
  * This method is for calling actions that have no parameters.
  *
- * This will properly verify that the actions exists and provide clear error message in case it
- * does not. It also handle synchronization and performing the action on the UI thread. This call
- * is blocking until the action is performed
+ * This will properly verify that the actions exists and provide clear error message in case it does
+ * not. It also handle synchronization and performing the action on the UI thread. This call is
+ * blocking until the action is performed
  *
  * @param key Key of the action to be performed.
  * @return The [SemanticsNodeInteraction] that is the receiver of this method
- *
  * @throws AssertionError If the semantics action is not defined on this node.
  */
 fun SemanticsNodeInteraction.performSemanticsAction(
@@ -614,8 +587,7 @@
 fun SemanticsNodeInteraction.performRotaryScrollInput(
     block: RotaryInjectionScope.() -> Unit
 ): SemanticsNodeInteraction {
-    @OptIn(ExperimentalTestApi::class)
-    invokeGlobalAssertions()
+    @OptIn(ExperimentalTestApi::class) invokeGlobalAssertions()
     val node = fetchSemanticsNode("Failed to send rotary Event")
     with(MultiModalInjectionScopeImpl(node, testContext)) {
         try {
@@ -628,17 +600,15 @@
 }
 
 /**
- * Finds the [CustomAccessibilityAction] in the node's [CustomActions] list whose label is equal
- * to [label] and then invokes it.
+ * Finds the [CustomAccessibilityAction] in the node's [CustomActions] list whose label is equal to
+ * [label] and then invokes it.
  *
  * To use your own logic to find the action to perform instead of matching on the full label, use
  * [performCustomAccessibilityActionWithLabelMatching].
  *
  * @param label The exact label of the [CustomAccessibilityAction] to perform.
- *
  * @throws AssertionError If no [SemanticsNode] is found, or no [CustomAccessibilityAction] has
- * [label], or more than one [CustomAccessibilityAction] has [label].
- *
+ *   [label], or more than one [CustomAccessibilityAction] has [label].
  * @see performCustomAccessibilityActionWithLabelMatching
  */
 @ExperimentalTestApi
@@ -652,13 +622,11 @@
  * predicate function and then invokes it.
  *
  * @param predicateDescription A description of [labelPredicate] that will be included in the error
- * message if zero or >1 actions match.
+ *   message if zero or >1 actions match.
  * @param labelPredicate A predicate function used to select the [CustomAccessibilityAction] to
- * perform.
- *
+ *   perform.
  * @throws AssertionError If no [SemanticsNode] is found, or no [CustomAccessibilityAction] matches
- * [labelPredicate], or more than one [CustomAccessibilityAction] matches [labelPredicate].
- *
+ *   [labelPredicate], or more than one [CustomAccessibilityAction] matches [labelPredicate].
  * @see performCustomAccessibilityActionWithLabel
  */
 @ExperimentalTestApi
@@ -723,7 +691,8 @@
 ) {
     val missingProperties = properties.filter { it !in node.config }
     if (missingProperties.isNotEmpty()) {
-        val msg = "${errorMessage()}, the node is missing [${
+        val msg =
+            "${errorMessage()}, the node is missing [${
             missingProperties.joinToString { it.name }
         }]"
         throw AssertionError(buildGeneralErrorMessage(msg, selector, node))
diff --git a/compose/ui/ui-test/src/commonMain/kotlin/androidx/compose/ui/test/ApplyingContinuationInterceptor.kt b/compose/ui/ui-test/src/commonMain/kotlin/androidx/compose/ui/test/ApplyingContinuationInterceptor.kt
index 0b192e0..473ffec 100644
--- a/compose/ui/ui-test/src/commonMain/kotlin/androidx/compose/ui/test/ApplyingContinuationInterceptor.kt
+++ b/compose/ui/ui-test/src/commonMain/kotlin/androidx/compose/ui/test/ApplyingContinuationInterceptor.kt
@@ -29,35 +29,32 @@
  * has [resumed][Continuation.resumeWith].
  *
  * This means that all snapshot backed state changes that were made in coroutines intercepted by
- * this class will be advertised to any observers after each individual coroutine rather than
- * after a set of coroutines.
+ * this class will be advertised to any observers after each individual coroutine rather than after
+ * a set of coroutines.
  *
  * For the testing framework specifically, this enables calls to [MainTestClock.advanceTimeBy] to
  * recompose during the same call to `advanceTimeBy`, if state was changed by coroutines that were
  * dispatched more than a frame before the end of that advancement.
  */
 @OptIn(ExperimentalStdlibApi::class, InternalTestApi::class)
-internal class ApplyingContinuationInterceptor(
-    private val delegate: ContinuationInterceptor
-) : DelayPropagatingContinuationInterceptorWrapper(delegate) {
+internal class ApplyingContinuationInterceptor(private val delegate: ContinuationInterceptor) :
+    DelayPropagatingContinuationInterceptorWrapper(delegate) {
 
-    companion object Key : AbstractCoroutineContextKey<
-        ContinuationInterceptor,
-        ApplyingContinuationInterceptor
-        >(
-        ContinuationInterceptor,
-        { it as? ApplyingContinuationInterceptor }
-    )
+    companion object Key :
+        AbstractCoroutineContextKey<ContinuationInterceptor, ApplyingContinuationInterceptor>(
+            ContinuationInterceptor,
+            { it as? ApplyingContinuationInterceptor }
+        )
 
-    override val key: CoroutineContext.Key<*> get() = Key
+    override val key: CoroutineContext.Key<*>
+        get() = Key
 
     override fun <T> interceptContinuation(continuation: Continuation<T>): Continuation<T> {
         return delegate.interceptContinuation(SendApplyContinuation(continuation))
     }
 
-    private class SendApplyContinuation<T>(
-        private val continuation: Continuation<T>
-    ) : Continuation<T> {
+    private class SendApplyContinuation<T>(private val continuation: Continuation<T>) :
+        Continuation<T> {
         override val context: CoroutineContext
             get() = continuation.context
 
diff --git a/compose/ui/ui-test/src/commonMain/kotlin/androidx/compose/ui/test/Assertions.kt b/compose/ui/ui-test/src/commonMain/kotlin/androidx/compose/ui/test/Assertions.kt
index ca75826..bf050e5 100644
--- a/compose/ui/ui-test/src/commonMain/kotlin/androidx/compose/ui/test/Assertions.kt
+++ b/compose/ui/ui-test/src/commonMain/kotlin/androidx/compose/ui/test/Assertions.kt
@@ -96,32 +96,28 @@
  *
  * Throws [AssertionError] if the node is not toggleable.
  */
-fun SemanticsNodeInteraction.assertIsToggleable(): SemanticsNodeInteraction =
-    assert(isToggleable())
+fun SemanticsNodeInteraction.assertIsToggleable(): SemanticsNodeInteraction = assert(isToggleable())
 
 /**
  * Asserts that the current semantics node is selectable.
  *
  * Throws [AssertionError] if the node is not selectable.
  */
-fun SemanticsNodeInteraction.assertIsSelectable(): SemanticsNodeInteraction =
-    assert(isSelectable())
+fun SemanticsNodeInteraction.assertIsSelectable(): SemanticsNodeInteraction = assert(isSelectable())
 
 /**
  * Asserts that the current semantics node has a focus.
  *
  * Throws [AssertionError] if the node is not in the focus or does not defined the property at all.
  */
-fun SemanticsNodeInteraction.assertIsFocused(): SemanticsNodeInteraction =
-    assert(isFocused())
+fun SemanticsNodeInteraction.assertIsFocused(): SemanticsNodeInteraction = assert(isFocused())
 
 /**
  * Asserts that the current semantics node does not have a focus.
  *
  * Throws [AssertionError] if the node is in the focus or does not defined the property at all.
  */
-fun SemanticsNodeInteraction.assertIsNotFocused(): SemanticsNodeInteraction =
-    assert(isNotFocused())
+fun SemanticsNodeInteraction.assertIsNotFocused(): SemanticsNodeInteraction = assert(isNotFocused())
 
 /**
  * Asserts that the node's content description contains exactly the given [values] and nothing else.
@@ -130,8 +126,8 @@
  * from the child nodes. Typically an accessibility tooling will decide based on its heuristics
  * which ones to announce.
  *
- * Throws [AssertionError] if the node's descriptions don't contain all items from [values], or
- * if the descriptions contain extra items that are not in [values].
+ * Throws [AssertionError] if the node's descriptions don't contain all items from [values], or if
+ * the descriptions contain extra items that are not in [values].
  *
  * @param values List of values to match (the order does not matter)
  * @see SemanticsProperties.ContentDescription
@@ -151,7 +147,7 @@
  *
  * @param value Value to match as one of the items in the list of content descriptions.
  * @param substring Whether this can be satisfied as a substring match of an item in the list of
- * descriptions.
+ *   descriptions.
  * @param ignoreCase Whether case should be ignored.
  * @see SemanticsProperties.ContentDescription
  */
@@ -167,12 +163,12 @@
  *
  * This will also search in [SemanticsProperties.EditableText] by default.
  *
- * Note that in merged semantics tree there can be a list of text items that got merged from
- * the child nodes. Typically an accessibility tooling will decide based on its heuristics which
- * ones to use.
+ * Note that in merged semantics tree there can be a list of text items that got merged from the
+ * child nodes. Typically an accessibility tooling will decide based on its heuristics which ones to
+ * use.
  *
- * Throws [AssertionError] if the node's text values don't contain all items from [values], or
- * if the text values contain extra items that are not in [values].
+ * Throws [AssertionError] if the node's text values don't contain all items from [values], or if
+ * the text values contain extra items that are not in [values].
  *
  * @param values List of values to match (the order does not matter)
  * @param includeEditableText Whether to also assert against the editable text.
@@ -189,15 +185,15 @@
  *
  * This will also search in [SemanticsProperties.EditableText].
  *
- * Note that in merged semantics tree there can be a list of text items that got merged from
- * the child nodes. Typically an accessibility tooling will decide based on its heuristics which
- * ones to use.
+ * Note that in merged semantics tree there can be a list of text items that got merged from the
+ * child nodes. Typically an accessibility tooling will decide based on its heuristics which ones to
+ * use.
  *
  * Throws [AssertionError] if the node's value does not contain `value`, or if the node has no value
  *
  * @param value Value to match as one of the items in the list of text values.
  * @param substring Whether this can be satisfied as a substring match of an item in the list of
- * text.
+ *   text.
  * @param ignoreCase Whether case should be ignored.
  * @see SemanticsProperties.Text
  */
@@ -205,14 +201,13 @@
     value: String,
     substring: Boolean = false,
     ignoreCase: Boolean = false
-): SemanticsNodeInteraction =
-    assert(hasText(value, substring = substring, ignoreCase = ignoreCase))
+): SemanticsNodeInteraction = assert(hasText(value, substring = substring, ignoreCase = ignoreCase))
 
 /**
  * Asserts the node's value equals the given value.
  *
- * For further details please check [SemanticsProperties.StateDescription].
- * Throws [AssertionError] if the node's value is not equal to `value`, or if the node has no value
+ * For further details please check [SemanticsProperties.StateDescription]. Throws [AssertionError]
+ * if the node's value is not equal to `value`, or if the node has no value
  */
 fun SemanticsNodeInteraction.assertValueEquals(value: String): SemanticsNodeInteraction =
     assert(hasStateDescription(value))
@@ -220,11 +215,12 @@
 /**
  * Asserts the node's range info equals the given value.
  *
- * For further details please check [SemanticsProperties.ProgressBarRangeInfo].
- * Throws [AssertionError] if the node's value is not equal to `value`, or if the node has no value
+ * For further details please check [SemanticsProperties.ProgressBarRangeInfo]. Throws
+ * [AssertionError] if the node's value is not equal to `value`, or if the node has no value
  */
-fun SemanticsNodeInteraction.assertRangeInfoEquals(value: ProgressBarRangeInfo):
-    SemanticsNodeInteraction = assert(hasProgressBarRangeInfo(value))
+fun SemanticsNodeInteraction.assertRangeInfoEquals(
+    value: ProgressBarRangeInfo
+): SemanticsNodeInteraction = assert(hasProgressBarRangeInfo(value))
 
 /**
  * Asserts that the current semantics node has a click action.
@@ -247,9 +243,8 @@
  *
  * @param matcher Matcher to verify.
  * @param messagePrefixOnError Prefix to be put in front of an error that gets thrown in case this
- * assert fails. This can be helpful in situations where this assert fails as part of a bigger
- * operation that used this assert as a precondition check.
- *
+ *   assert fails. This can be helpful in situations where this assert fails as part of a bigger
+ *   operation that used this assert as a precondition check.
  * @throws AssertionError if the matcher does not match or the node can no longer be found.
  */
 fun SemanticsNodeInteraction.assert(
@@ -278,10 +273,7 @@
     expectedSize: Int
 ): SemanticsNodeInteractionCollection {
     val errorOnFail = "Failed to assert count of nodes."
-    val matchedNodes = fetchSemanticsNodes(
-        atLeastOneRootRequired = expectedSize > 0,
-        errorOnFail
-    )
+    val matchedNodes = fetchSemanticsNodes(atLeastOneRootRequired = expectedSize > 0, errorOnFail)
     if (matchedNodes.size != expectedSize) {
         throw AssertionError(
             buildErrorMessageForCountMismatch(
@@ -299,7 +291,6 @@
  * Asserts that this collection contains at least one element that satisfies the given [matcher].
  *
  * @param matcher Matcher that has to be satisfied by at least one of the nodes in the collection.
- *
  * @throws AssertionError if not at least one matching node was node.
  */
 fun SemanticsNodeInteractionCollection.assertAny(
@@ -322,9 +313,8 @@
  * This passes also for empty collections.
  *
  * @param matcher Matcher that has to be satisfied by all the nodes in the collection.
- *
- * @throws AssertionError if the collection contains at least one element that does not satisfy
- * the given matcher.
+ * @throws AssertionError if the collection contains at least one element that does not satisfy the
+ *   given matcher.
  */
 fun SemanticsNodeInteractionCollection.assertAll(
     matcher: SemanticsMatcher
@@ -348,15 +338,14 @@
  * Returns true if the matched node is displayed on screen.
  *
  * Specifically, the node must be composed, placed and at least a portion of its bounds must be
- * visible on screen after clipping is applied. If no matching node is found, returns false.
- * If multiple nodes match, throws an [AssertionError].
+ * visible on screen after clipping is applied. If no matching node is found, returns false. If
+ * multiple nodes match, throws an [AssertionError].
  *
  * @sample androidx.compose.ui.test.samples.waitForDisplayed
  *
  * @throws AssertionError If multiple nodes match this [SemanticsNodeInteraction].
  */
-fun SemanticsNodeInteraction.isDisplayed(): Boolean =
-    checkIsDisplayed(assertIsFullyVisible = false)
+fun SemanticsNodeInteraction.isDisplayed(): Boolean = checkIsDisplayed(assertIsFullyVisible = false)
 
 /**
  * Asserts that the current semantics node is not displayed on screen.
diff --git a/compose/ui/ui-test/src/commonMain/kotlin/androidx/compose/ui/test/BoundsAssertions.kt b/compose/ui/ui-test/src/commonMain/kotlin/androidx/compose/ui/test/BoundsAssertions.kt
index a39e576..8efa945 100644
--- a/compose/ui/ui-test/src/commonMain/kotlin/androidx/compose/ui/test/BoundsAssertions.kt
+++ b/compose/ui/ui-test/src/commonMain/kotlin/androidx/compose/ui/test/BoundsAssertions.kt
@@ -34,9 +34,7 @@
  * @throws AssertionError if comparison fails.
  */
 fun SemanticsNodeInteraction.assertWidthIsEqualTo(expectedWidth: Dp): SemanticsNodeInteraction {
-    return withUnclippedBoundsInRoot {
-        it.width.assertIsEqualTo(expectedWidth, "width")
-    }
+    return withUnclippedBoundsInRoot { it.width.assertIsEqualTo(expectedWidth, "width") }
 }
 
 /**
@@ -45,9 +43,7 @@
  * @throws AssertionError if comparison fails.
  */
 fun SemanticsNodeInteraction.assertHeightIsEqualTo(expectedHeight: Dp): SemanticsNodeInteraction {
-    return withUnclippedBoundsInRoot {
-        it.height.assertIsEqualTo(expectedHeight, "height")
-    }
+    return withUnclippedBoundsInRoot { it.height.assertIsEqualTo(expectedHeight, "height") }
 }
 
 /**
@@ -58,9 +54,7 @@
 fun SemanticsNodeInteraction.assertTouchWidthIsEqualTo(
     expectedWidth: Dp
 ): SemanticsNodeInteraction {
-    return withTouchBoundsInRoot {
-        it.width.assertIsEqualTo(expectedWidth, "width")
-    }
+    return withTouchBoundsInRoot { it.width.assertIsEqualTo(expectedWidth, "width") }
 }
 
 /**
@@ -71,10 +65,9 @@
 fun SemanticsNodeInteraction.assertTouchHeightIsEqualTo(
     expectedHeight: Dp
 ): SemanticsNodeInteraction {
-    return withTouchBoundsInRoot {
-        it.height.assertIsEqualTo(expectedHeight, "height")
-    }
+    return withTouchBoundsInRoot { it.height.assertIsEqualTo(expectedHeight, "height") }
 }
+
 /**
  * Asserts that the layout of this node has width that is greater than or equal to
  * [expectedMinWidth].
@@ -82,9 +75,7 @@
  * @throws AssertionError if comparison fails.
  */
 fun SemanticsNodeInteraction.assertWidthIsAtLeast(expectedMinWidth: Dp): SemanticsNodeInteraction {
-    return withUnclippedBoundsInRoot {
-        it.width.assertIsAtLeast(expectedMinWidth, "width")
-    }
+    return withUnclippedBoundsInRoot { it.width.assertIsAtLeast(expectedMinWidth, "width") }
 }
 
 /**
@@ -96,9 +87,7 @@
 fun SemanticsNodeInteraction.assertHeightIsAtLeast(
     expectedMinHeight: Dp
 ): SemanticsNodeInteraction {
-    return withUnclippedBoundsInRoot {
-        it.height.assertIsAtLeast(expectedMinHeight, "height")
-    }
+    return withUnclippedBoundsInRoot { it.height.assertIsAtLeast(expectedMinHeight, "height") }
 }
 
 /**
@@ -107,7 +96,6 @@
  *
  * @param expectedLeft The left (x) position to assert.
  * @param expectedTop The top (y) position to assert.
- *
  * @throws AssertionError if comparison fails.
  */
 fun SemanticsNodeInteraction.assertPositionInRootIsEqualTo(
@@ -125,31 +113,25 @@
  * the given position.
  *
  * @param expectedTop The top (y) position to assert.
- *
  * @throws AssertionError if comparison fails.
  */
 fun SemanticsNodeInteraction.assertTopPositionInRootIsEqualTo(
     expectedTop: Dp
 ): SemanticsNodeInteraction {
-    return withUnclippedBoundsInRoot {
-        it.top.assertIsEqualTo(expectedTop, "top")
-    }
+    return withUnclippedBoundsInRoot { it.top.assertIsEqualTo(expectedTop, "top") }
 }
 
 /**
- * Asserts that the layout of this node has the left position in the root composable that is
- * equal to the given position.
+ * Asserts that the layout of this node has the left position in the root composable that is equal
+ * to the given position.
  *
  * @param expectedLeft The left (x) position to assert.
- *
  * @throws AssertionError if comparison fails.
  */
 fun SemanticsNodeInteraction.assertLeftPositionInRootIsEqualTo(
     expectedLeft: Dp
 ): SemanticsNodeInteraction {
-    return withUnclippedBoundsInRoot {
-        it.left.assertIsEqualTo(expectedLeft, "left")
-    }
+    return withUnclippedBoundsInRoot { it.left.assertIsEqualTo(expectedLeft, "left") }
 }
 
 /**
@@ -157,9 +139,7 @@
  */
 fun SemanticsNodeInteraction.getUnclippedBoundsInRoot(): DpRect {
     lateinit var bounds: DpRect
-    withUnclippedBoundsInRoot {
-        bounds = it
-    }
+    withUnclippedBoundsInRoot { bounds = it }
     return bounds
 }
 
@@ -191,9 +171,7 @@
     }
 }
 
-private fun <R> SemanticsNodeInteraction.withDensity(
-    operation: Density.(SemanticsNode) -> R
-): R {
+private fun <R> SemanticsNodeInteraction.withDensity(operation: Density.(SemanticsNode) -> R): R {
     val node = fetchSemanticsNode("Failed to retrieve density for the node.")
     val density = node.layoutInfo.density
     return operation.invoke(density, node)
@@ -203,11 +181,12 @@
     assertion: (DpRect) -> Unit
 ): SemanticsNodeInteraction {
     val node = fetchSemanticsNode("Failed to retrieve bounds of the node.")
-    val bounds = with(node.layoutInfo.density) {
-        node.unclippedBoundsInRoot.let {
-            DpRect(it.left.toDp(), it.top.toDp(), it.right.toDp(), it.bottom.toDp())
+    val bounds =
+        with(node.layoutInfo.density) {
+            node.unclippedBoundsInRoot.let {
+                DpRect(it.left.toDp(), it.top.toDp(), it.right.toDp(), it.bottom.toDp())
+            }
         }
-    }
     assertion.invoke(bounds)
     return this
 }
@@ -216,11 +195,12 @@
     assertion: (DpRect) -> Unit
 ): SemanticsNodeInteraction {
     val node = fetchSemanticsNode("Failed to retrieve bounds of the node.")
-    val bounds = with(node.layoutInfo.density) {
-        node.touchBoundsInRoot.let {
-            DpRect(it.left.toDp(), it.top.toDp(), it.right.toDp(), it.bottom.toDp())
+    val bounds =
+        with(node.layoutInfo.density) {
+            node.touchBoundsInRoot.let {
+                DpRect(it.left.toDp(), it.top.toDp(), it.right.toDp(), it.bottom.toDp())
+            }
         }
-    }
     assertion.invoke(bounds)
     return this
 }
@@ -235,9 +215,9 @@
     }
 
 /**
- * Returns if this value is equal to the [reference], within a given [tolerance]. If the
- * reference value is [Float.NaN], [Float.POSITIVE_INFINITY] or [Float.NEGATIVE_INFINITY], this
- * only returns true if this value is exactly the same (tolerance is disregarded).
+ * Returns if this value is equal to the [reference], within a given [tolerance]. If the reference
+ * value is [Float.NaN], [Float.POSITIVE_INFINITY] or [Float.NEGATIVE_INFINITY], this only returns
+ * true if this value is exactly the same (tolerance is disregarded).
  */
 private fun Dp.isWithinTolerance(reference: Dp, tolerance: Dp): Boolean {
     return when {
@@ -258,15 +238,12 @@
  * @param expected The expected value to which this one should be equal to.
  * @param subject Used in the error message to identify which item this assertion failed on.
  * @param tolerance The tolerance within which the values should be treated as equal.
- *
  * @throws AssertionError if comparison fails.
  */
 fun Dp.assertIsEqualTo(expected: Dp, subject: String, tolerance: Dp = Dp(.5f)) {
     if (!isWithinTolerance(expected, tolerance)) {
         // Comparison failed, report the error in DPs
-        throw AssertionError(
-            "Actual $subject is $this, expected $expected (tolerance: $tolerance)"
-        )
+        throw AssertionError("Actual $subject is $this, expected $expected (tolerance: $tolerance)")
     }
 }
 
@@ -281,7 +258,6 @@
  * @param expected The expected value to which this one should be greater than or equal to.
  * @param subject Used in the error message to identify which item this assertion failed on.
  * @param tolerance The tolerance within which the values should be treated as equal.
- *
  * @throws AssertionError if comparison fails.
  */
 private fun Dp.assertIsAtLeast(expected: Dp, subject: String, tolerance: Dp = Dp(.5f)) {
diff --git a/compose/ui/ui-test/src/commonMain/kotlin/androidx/compose/ui/test/ComposeUiTest.kt b/compose/ui/ui-test/src/commonMain/kotlin/androidx/compose/ui/test/ComposeUiTest.kt
index 52c4acc..4fd724e 100644
--- a/compose/ui/ui-test/src/commonMain/kotlin/androidx/compose/ui/test/ComposeUiTest.kt
+++ b/compose/ui/ui-test/src/commonMain/kotlin/androidx/compose/ui/test/ComposeUiTest.kt
@@ -28,17 +28,17 @@
  * Android), use one of the platform specific variants of this method, e.g.
  * [runAndroidComposeUiTest] on Android.
  *
- * Implementations of this method will launch a Compose host (such as an Activity on Android)
- * for you. If your test needs to launch its own host, use a platform specific variant that
- * doesn't launch anything for you (if available), e.g. [runEmptyComposeUiTest] on
- * Android. Always make sure that the Compose content is set during execution of the
- * [test lambda][block] so the test framework is aware of the content. Whether you need to
- * launch the host from within the test lambda as well depends on the platform.
+ * Implementations of this method will launch a Compose host (such as an Activity on Android) for
+ * you. If your test needs to launch its own host, use a platform specific variant that doesn't
+ * launch anything for you (if available), e.g. [runEmptyComposeUiTest] on Android. Always make sure
+ * that the Compose content is set during execution of the [test lambda][block] so the test
+ * framework is aware of the content. Whether you need to launch the host from within the test
+ * lambda as well depends on the platform.
  *
  * Keeping a reference to the [ComposeUiTest] outside of this function is an error.
  *
  * @param effectContext The [CoroutineContext] used to run the composition. The context for
- * `LaunchedEffect`s and `rememberCoroutineScope` will be derived from this context.
+ *   `LaunchedEffect`s and `rememberCoroutineScope` will be derived from this context.
  * @param block The test function.
  */
 @ExperimentalTestApi
@@ -50,27 +50,26 @@
 /**
  * A test environment that allows you to test and control composables, either in isolation or in
  * applications. Most of the functionality in this interface provides some form of test
- * synchronization: the test will block until the app or composable is idle, to ensure the tests
- * are deterministic.
+ * synchronization: the test will block until the app or composable is idle, to ensure the tests are
+ * deterministic.
  *
- * For example, if you would perform a click on the center of the screen while a button is
- * animating from left to right over the screen, without synchronization the test would sometimes
- * click when the button is in the middle of the screen (button is clicked), and sometimes when
- * the button is past the middle of the screen (button is not clicked). With synchronization, the
- * app would not be idle until the animation is over, so the test will always click when the
- * button is past the middle of the screen (and not click it). If you actually do want to click
- * the button when it's in the middle of the animation, you can do so by controlling the
- * [clock][mainClock]. You'll have to disable [automatic advancing][MainTestClock.autoAdvance],
- * and manually advance the clock by the time necessary to position the button in the middle of
- * the screen.
+ * For example, if you would perform a click on the center of the screen while a button is animating
+ * from left to right over the screen, without synchronization the test would sometimes click when
+ * the button is in the middle of the screen (button is clicked), and sometimes when the button is
+ * past the middle of the screen (button is not clicked). With synchronization, the app would not be
+ * idle until the animation is over, so the test will always click when the button is past the
+ * middle of the screen (and not click it). If you actually do want to click the button when it's in
+ * the middle of the animation, you can do so by controlling the [clock][mainClock]. You'll have to
+ * disable [automatic advancing][MainTestClock.autoAdvance], and manually advance the clock by the
+ * time necessary to position the button in the middle of the screen.
  *
  * To test a composable in isolation, use [setContent] to set the composable in a host. On Android,
  * a host will mostly be an Activity. When using [runComposeUiTest] or any of its platform specific
  * friends, the host will be started for you automatically, unless otherwise specified. To test an
  * application, use the platform specific variant of [runComposeUiTest] that launches the app.
  *
- * An instance of [ComposeUiTest] can be obtained through [runComposeUiTest] or any of its
- * platform specific variants, the argument to which will have it as the receiver scope.
+ * An instance of [ComposeUiTest] can be obtained through [runComposeUiTest] or any of its platform
+ * specific variants, the argument to which will have it as the receiver scope.
  */
 // Use an `expect sealed interface` with an actual copy for each platform to allow implementations
 // per platform. Each platform is considered a separate compilation unit, which means that when
@@ -79,17 +78,15 @@
 @ExperimentalTestApi
 expect sealed interface ComposeUiTest : SemanticsNodeInteractionsProvider {
     /**
-     * Current device screen's density. Note that it is technically possible for a Compose
-     * hierarchy to define a different density for a certain subtree. Try to use
-     * [LayoutInfo.density][androidx.compose.ui.layout.LayoutInfo.density]
-     * where possible, which can be obtained from
+     * Current device screen's density. Note that it is technically possible for a Compose hierarchy
+     * to define a different density for a certain subtree. Try to use
+     * [LayoutInfo.density][androidx.compose.ui.layout.LayoutInfo.density] where possible, which can
+     * be obtained from
      * [SemanticsNode.layoutInfo][androidx.compose.ui.semantics.SemanticsNode.layoutInfo].
      */
     val density: Density
 
-    /**
-     * Clock that drives frames and recompositions in compose tests.
-     */
+    /** Clock that drives frames and recompositions in compose tests. */
     val mainClock: MainTestClock
 
     /**
@@ -100,21 +97,21 @@
     fun <T> runOnUiThread(action: () -> T): T
 
     /**
-     * Executes the given [action] in the same way as [runOnUiThread] but [waits][waitForIdle]
-     * until the app is idle before executing the action. This is the recommended way of doing
-     * your assertions on shared variables.
+     * Executes the given [action] in the same way as [runOnUiThread] but [waits][waitForIdle] until
+     * the app is idle before executing the action. This is the recommended way of doing your
+     * assertions on shared variables.
      *
      * This method blocks until the action is complete.
      */
     fun <T> runOnIdle(action: () -> T): T
 
     /**
-     * Waits for compose to be idle. If [auto advancement][MainTestClock.autoAdvance] is enabled
-     * on the [mainClock], this method will actively advance the clock to process any pending
+     * Waits for compose to be idle. If [auto advancement][MainTestClock.autoAdvance] is enabled on
+     * the [mainClock], this method will actively advance the clock to process any pending
      * composition, invalidation and animation. If auto advancement is not enabled, the clock will
      * not be advanced actively which usually means that the Compose UI appears to be frozen. This
-     * is ideal for testing animations in a deterministic way. In either case, this method will
-     * wait for all [IdlingResource]s to become idle.
+     * is ideal for testing animations in a deterministic way. In either case, this method will wait
+     * for all [IdlingResource]s to become idle.
      *
      * Note that some processes are driven by the host operating system and will therefore still
      * execute when auto advancement is disabled. For example, on Android measure, layout and draw
@@ -127,8 +124,8 @@
      * on the [mainClock], this method will actively advance the clock to process any pending
      * composition, invalidation and animation. If auto advancement is not enabled, the clock will
      * not be advanced actively which usually means that the Compose UI appears to be frozen. This
-     * is ideal for testing animations in a deterministic way. In either case, this method will
-     * wait for all [IdlingResource]s to become idle.
+     * is ideal for testing animations in a deterministic way. In either case, this method will wait
+     * for all [IdlingResource]s to become idle.
      *
      * Note that some processes are driven by the host operating system and will therefore still
      * execute when auto advancement is disabled. For example, on Android measure, layout and draw
@@ -141,10 +138,10 @@
      *
      * If [auto advancement][MainTestClock.autoAdvance] is enabled on the [mainClock], this method
      * will actively advance the clock to process any pending composition, invalidation and
-     * animation. If auto advancement is not enabled, the clock will not be advanced actively
-     * which usually means that the Compose UI appears to be frozen. This is ideal for testing
-     * animations in a deterministic way. In either case, this method will wait for all
-     * [IdlingResource]s to become idle.
+     * animation. If auto advancement is not enabled, the clock will not be advanced actively which
+     * usually means that the Compose UI appears to be frozen. This is ideal for testing animations
+     * in a deterministic way. In either case, this method will wait for all [IdlingResource]s to
+     * become idle.
      *
      * Note that some processes are driven by the host operating system and will therefore still
      * execute when auto advancement is disabled. For example, on Android measure, layout and draw
@@ -153,18 +150,17 @@
      * Compared to [MainTestClock.advanceTimeUntil], [waitUntil] sleeps after every iteration to
      * give the host operating system the opportunity to do measure/layout/draw passes. This gives
      * [waitUntil] a better integration with the host, but it is less preferred from a performance
-     * viewpoint. Therefore, we recommend that you try using [MainTestClock.advanceTimeUntil]
-     * before resorting to [waitUntil].
+     * viewpoint. Therefore, we recommend that you try using [MainTestClock.advanceTimeUntil] before
+     * resorting to [waitUntil].
      *
      * @param timeoutMillis The time after which this method throws an exception if the given
-     * condition is not satisfied. This observes wall clock time, not [frame time][mainClock].
+     *   condition is not satisfied. This observes wall clock time, not [frame time][mainClock].
      * @param conditionDescription An optional human-readable description of [condition] that will
-     * be included in the timeout exception if thrown.
+     *   be included in the timeout exception if thrown.
      * @param condition Condition that must be satisfied in order for this method to successfully
-     * finish.
-     *
+     *   finish.
      * @throws androidx.compose.ui.test.ComposeTimeoutException If the condition is not satisfied
-     * after [timeoutMillis] (in wall clock time).
+     *   after [timeoutMillis] (in wall clock time).
      */
     fun waitUntil(
         conditionDescription: String? = null,
@@ -172,22 +168,18 @@
         condition: () -> Boolean
     )
 
-    /**
-     * Registers an [IdlingResource] in this test.
-     */
+    /** Registers an [IdlingResource] in this test. */
     fun registerIdlingResource(idlingResource: IdlingResource)
 
-    /**
-     * Unregisters an [IdlingResource] from this test.
-     */
+    /** Unregisters an [IdlingResource] from this test. */
     fun unregisterIdlingResource(idlingResource: IdlingResource)
 
     /**
-     * Sets the given [composable] as the content to be tested. This should be called exactly
-     * once per test.
+     * Sets the given [composable] as the content to be tested. This should be called exactly once
+     * per test.
      *
      * @throws IllegalStateException if called more than once per test, or if the implementation
-     * doesn't have access to a host to set content in.
+     *   doesn't have access to a host to set content in.
      */
     fun setContent(composable: @Composable () -> Unit)
 }
@@ -195,15 +187,13 @@
 /**
  * Blocks until the number of nodes matching the given [matcher] is equal to the given [count].
  *
- * @see ComposeUiTest.waitUntil
- *
  * @param matcher The matcher that will be used to filter nodes.
  * @param count The number of nodes that are expected to be matched.
  * @param timeoutMillis The time after which this method throws an exception if the number of nodes
- * that match the [matcher] is not [count]. This observes wall clock time, not frame time.
- *
+ *   that match the [matcher] is not [count]. This observes wall clock time, not frame time.
  * @throws androidx.compose.ui.test.ComposeTimeoutException If the number of nodes that match the
- * [matcher] is not [count] after [timeoutMillis] (in wall clock time).
+ *   [matcher] is not [count] after [timeoutMillis] (in wall clock time).
+ * @see ComposeUiTest.waitUntil
  */
 @ExperimentalTestApi
 fun ComposeUiTest.waitUntilNodeCount(
@@ -219,14 +209,12 @@
 /**
  * Blocks until at least one node matches the given [matcher].
  *
- * @see ComposeUiTest.waitUntil
- *
  * @param matcher The matcher that will be used to filter nodes.
  * @param timeoutMillis The time after which this method throws an exception if no nodes match the
- * given [matcher]. This observes wall clock time, not frame time.
- *
+ *   given [matcher]. This observes wall clock time, not frame time.
  * @throws androidx.compose.ui.test.ComposeTimeoutException If no nodes match the given [matcher]
- * after [timeoutMillis] (in wall clock time).
+ *   after [timeoutMillis] (in wall clock time).
+ * @see ComposeUiTest.waitUntil
  */
 @ExperimentalTestApi
 fun ComposeUiTest.waitUntilAtLeastOneExists(
@@ -241,14 +229,12 @@
 /**
  * Blocks until exactly one node matches the given [matcher].
  *
- * @see ComposeUiTest.waitUntil
- *
  * @param matcher The matcher that will be used to filter nodes.
  * @param timeoutMillis The time after which this method throws an exception if exactly one node
- * does not match the given [matcher]. This observes wall clock time, not frame time.
- *
+ *   does not match the given [matcher]. This observes wall clock time, not frame time.
  * @throws androidx.compose.ui.test.ComposeTimeoutException If exactly one node does not match the
- * given [matcher] after [timeoutMillis] (in wall clock time).
+ *   given [matcher] after [timeoutMillis] (in wall clock time).
+ * @see ComposeUiTest.waitUntil
  */
 @ExperimentalTestApi
 fun ComposeUiTest.waitUntilExactlyOneExists(
@@ -259,20 +245,16 @@
 /**
  * Blocks until no nodes match the given [matcher].
  *
- * @see ComposeUiTest.waitUntil
- *
  * @param matcher The matcher that will be used to filter nodes.
- * @param timeoutMillis The time after which this method throws an exception if any nodes match
- * the given [matcher]. This observes wall clock time, not frame time.
- *
+ * @param timeoutMillis The time after which this method throws an exception if any nodes match the
+ *   given [matcher]. This observes wall clock time, not frame time.
  * @throws androidx.compose.ui.test.ComposeTimeoutException If any nodes match the given [matcher]
- * after [timeoutMillis] (in wall clock time).
+ *   after [timeoutMillis] (in wall clock time).
+ * @see ComposeUiTest.waitUntil
  */
 @ExperimentalTestApi
-fun ComposeUiTest.waitUntilDoesNotExist(
-    matcher: SemanticsMatcher,
-    timeoutMillis: Long = 1_000L
-) = waitUntilNodeCount(matcher, 0, timeoutMillis)
+fun ComposeUiTest.waitUntilDoesNotExist(matcher: SemanticsMatcher, timeoutMillis: Long = 1_000L) =
+    waitUntilNodeCount(matcher, 0, timeoutMillis)
 
 internal const val NanoSecondsPerMilliSecond = 1_000_000L
 
diff --git a/compose/ui/ui-test/src/commonMain/kotlin/androidx/compose/ui/test/DensityForcedSize.kt b/compose/ui/ui-test/src/commonMain/kotlin/androidx/compose/ui/test/DensityForcedSize.kt
index a7231b8..f99bc4a 100644
--- a/compose/ui/ui-test/src/commonMain/kotlin/androidx/compose/ui/test/DensityForcedSize.kt
+++ b/compose/ui/ui-test/src/commonMain/kotlin/androidx/compose/ui/test/DensityForcedSize.kt
@@ -45,66 +45,68 @@
     modifier: Modifier = Modifier,
     content: @Composable () -> Unit
 ) {
-    SubcomposeLayout(
-        modifier = modifier
-    ) { constraints ->
-        val measurables = subcompose(Unit) {
-            val maxWidth = constraints.maxWidth.toDp()
-            val maxHeight = constraints.maxHeight.toDp()
-            val requiredWidth = if (size.isSpecified) {
-                max(maxWidth, size.width)
-            } else {
-                maxWidth
-            }
-            val requiredHeight = if (size.isSpecified) {
-                max(maxHeight, size.height)
-            } else {
-                maxHeight
-            }
-            // Compute the minimum density required so that both the requested width and height both
-            // fit
-            val density = LocalDensity.current.density * min(
-                maxWidth / requiredWidth,
-                maxHeight / requiredHeight,
-            )
-
-            CompositionLocalProvider(
-                LocalDensity provides Density(
-                    // Override the density with the factor needed to meet both the minimum width and
-                    // height requirements, and the platform density requirements.
-                    density = coerceDensity(density),
-                    // Pass through the font scale
-                    fontScale = LocalDensity.current.fontScale
-                )
-            ) {
-                Layout(
-                    content = content,
-                    // This size will now be guaranteed to be able to match the constraints
-                    modifier = Modifier
-                        .then(
-                            if (size.isSpecified) {
-                                Modifier.size(size)
-                            } else {
-                                Modifier
-                            }
+    SubcomposeLayout(modifier = modifier) { constraints ->
+        val measurables =
+            subcompose(Unit) {
+                val maxWidth = constraints.maxWidth.toDp()
+                val maxHeight = constraints.maxHeight.toDp()
+                val requiredWidth =
+                    if (size.isSpecified) {
+                        max(maxWidth, size.width)
+                    } else {
+                        maxWidth
+                    }
+                val requiredHeight =
+                    if (size.isSpecified) {
+                        max(maxHeight, size.height)
+                    } else {
+                        maxHeight
+                    }
+                // Compute the minimum density required so that both the requested width and height
+                // both
+                // fit
+                val density =
+                    LocalDensity.current.density *
+                        min(
+                            maxWidth / requiredWidth,
+                            maxHeight / requiredHeight,
                         )
-                ) { measurables, constraints ->
-                    val placeables = measurables.map { it.measure(constraints) }
-                    layout(constraints.maxWidth, constraints.maxHeight) {
-                        placeables.forEach {
-                            it.placeRelative(0, 0)
+
+                CompositionLocalProvider(
+                    LocalDensity provides
+                        Density(
+                            // Override the density with the factor needed to meet both the minimum
+                            // width and
+                            // height requirements, and the platform density requirements.
+                            density = coerceDensity(density),
+                            // Pass through the font scale
+                            fontScale = LocalDensity.current.fontScale
+                        )
+                ) {
+                    Layout(
+                        content = content,
+                        // This size will now be guaranteed to be able to match the constraints
+                        modifier =
+                            Modifier.then(
+                                if (size.isSpecified) {
+                                    Modifier.size(size)
+                                } else {
+                                    Modifier
+                                }
+                            )
+                    ) { measurables, constraints ->
+                        val placeables = measurables.map { it.measure(constraints) }
+                        layout(constraints.maxWidth, constraints.maxHeight) {
+                            placeables.forEach { it.placeRelative(0, 0) }
                         }
                     }
                 }
             }
-        }
 
         val placeables = measurables.map { it.measure(constraints) }
 
         layout(placeables.maxOf(Placeable::width), placeables.maxOf(Placeable::height)) {
-            placeables.forEach {
-                it.placeRelative(0, 0)
-            }
+            placeables.forEach { it.placeRelative(0, 0) }
         }
     }
 }
@@ -118,21 +120,15 @@
  */
 internal expect fun coerceDensity(density: Float): Float
 
-/**
- * A very simplified size [Modifier].
- */
+/** A very simplified size [Modifier]. */
 @Stable
 private fun Modifier.size(size: DpSize) = layout { measurable, constraints ->
-    val placeable = measurable.measure(
-        constraints.constrain(
-            Constraints.fixed(
-                size.width.roundToPx(),
-                size.height.roundToPx()
+    val placeable =
+        measurable.measure(
+            constraints.constrain(
+                Constraints.fixed(size.width.roundToPx(), size.height.roundToPx())
             )
         )
-    )
 
-    layout(placeable.width, placeable.height) {
-        placeable.placeRelative(0, 0)
-    }
+    layout(placeable.width, placeable.height) { placeable.placeRelative(0, 0) }
 }
diff --git a/compose/ui/ui-test/src/commonMain/kotlin/androidx/compose/ui/test/DeviceConfigurationOverride.kt b/compose/ui/ui-test/src/commonMain/kotlin/androidx/compose/ui/test/DeviceConfigurationOverride.kt
index 10042c4..c39d6e6 100644
--- a/compose/ui/ui-test/src/commonMain/kotlin/androidx/compose/ui/test/DeviceConfigurationOverride.kt
+++ b/compose/ui/ui-test/src/commonMain/kotlin/androidx/compose/ui/test/DeviceConfigurationOverride.kt
@@ -31,7 +31,9 @@
  * [layout direction][DeviceConfigurationOverride.Companion.LayoutDirection].
  *
  * @sample androidx.compose.ui.test.samples.DeviceConfigurationOverrideFontScaleSample
+ *
  * @sample androidx.compose.ui.test.samples.DeviceConfigurationOverrideForcedSizeSample
+ *
  * @sample androidx.compose.ui.test.samples.DeviceConfigurationOverrideLayoutDirectionSample
  */
 @Composable
@@ -43,9 +45,9 @@
 /**
  * The specification for an override applied to some piece of content.
  *
- * When wrapping content in [Override], some particular override will be locally applied to
- * the wrapped in order to test that content in isolation, without needing to configure the
- * entire device.
+ * When wrapping content in [Override], some particular override will be locally applied to the
+ * wrapped in order to test that content in isolation, without needing to configure the entire
+ * device.
  */
 fun interface DeviceConfigurationOverride {
 
@@ -65,22 +67,17 @@
 }
 
 /**
- * Combines this override with the [other] override into a single override, by
- * applying this override as the outer override first, then the [other] override as
- * an inner override, and then the content.
+ * Combines this override with the [other] override into a single override, by applying this
+ * override as the outer override first, then the [other] override as an inner override, and then
+ * the content.
  *
  * @sample androidx.compose.ui.test.samples.DeviceConfigurationOverrideThenSample
  */
 infix fun DeviceConfigurationOverride.then(
     other: DeviceConfigurationOverride
-): DeviceConfigurationOverride =
-    DeviceConfigurationOverride { contentUnderTest ->
-        this.Override {
-            other.Override {
-                contentUnderTest()
-            }
-        }
-    }
+): DeviceConfigurationOverride = DeviceConfigurationOverride { contentUnderTest ->
+    this.Override { other.Override { contentUnderTest() } }
+}
 
 /**
  * A [DeviceConfigurationOverride] that overrides the available size for the contained content.
diff --git a/compose/ui/ui-test/src/commonMain/kotlin/androidx/compose/ui/test/ErrorMessages.kt b/compose/ui/ui-test/src/commonMain/kotlin/androidx/compose/ui/test/ErrorMessages.kt
index b81ba2f..49e2504 100644
--- a/compose/ui/ui-test/src/commonMain/kotlin/androidx/compose/ui/test/ErrorMessages.kt
+++ b/compose/ui/ui-test/src/commonMain/kotlin/androidx/compose/ui/test/ErrorMessages.kt
@@ -21,8 +21,8 @@
 /**
  * Builds error message for case where expected amount of nodes does not match reality.
  *
- * Provide [errorMessage] to explain which operation you were about to perform. This makes it
- * easier for developer to find where the failure happened.
+ * Provide [errorMessage] to explain which operation you were about to perform. This makes it easier
+ * for developer to find where the failure happened.
  *
  * In case of only one node that went missing (was seen before) use
  * [buildErrorMessageForNodeMissingInTree] for better clarity.
@@ -95,8 +95,8 @@
 /**
  * Builds error message for case where node is no longer in the tree but is expected to be.
  *
- * Provide [errorMessage] to explain which operation you were about to perform. This makes it
- * easier for developer to find where the failure happened.
+ * Provide [errorMessage] to explain which operation you were about to perform. This makes it easier
+ * for developer to find where the failure happened.
  *
  * Note that [lastSeenSemantics] is the last semantics we have seen before we couldn't find the node
  * anymore. This can provide more info to the developer on what could have happened.
diff --git a/compose/ui/ui-test/src/commonMain/kotlin/androidx/compose/ui/test/Expect.kt b/compose/ui/ui-test/src/commonMain/kotlin/androidx/compose/ui/test/Expect.kt
index 02a2ef6..0ceedc22 100644
--- a/compose/ui/ui-test/src/commonMain/kotlin/androidx/compose/ui/test/Expect.kt
+++ b/compose/ui/ui-test/src/commonMain/kotlin/androidx/compose/ui/test/Expect.kt
@@ -20,12 +20,13 @@
  * Returns the hash code for the given object that is unique across all currently allocated objects.
  * The hash code for the null reference is zero.
  *
- * Can be negative, and near Int.MAX_VALUE, so it can overflow if used as part of calculations.
- * For example, don't use this:
+ * Can be negative, and near Int.MAX_VALUE, so it can overflow if used as part of calculations. For
+ * example, don't use this:
  * ```
  * val comparison = identityHashCode(midVal) - identityHashCode(leftVal)
  * if (comparison < 0) ...
  * ```
+ *
  * Use this instead:
  * ```
  * if (identityHashCode(midVal) < identityHashCode(leftVal)) ...
diff --git a/compose/ui/ui-test/src/commonMain/kotlin/androidx/compose/ui/test/Filters.kt b/compose/ui/ui-test/src/commonMain/kotlin/androidx/compose/ui/test/Filters.kt
index 3225110..1b64450 100644
--- a/compose/ui/ui-test/src/commonMain/kotlin/androidx/compose/ui/test/Filters.kt
+++ b/compose/ui/ui-test/src/commonMain/kotlin/androidx/compose/ui/test/Filters.kt
@@ -47,34 +47,30 @@
  *
  * @see SemanticsProperties.ToggleableState
  */
-fun isToggleable(): SemanticsMatcher =
-    hasKey(SemanticsProperties.ToggleableState)
+fun isToggleable(): SemanticsMatcher = hasKey(SemanticsProperties.ToggleableState)
 
 /**
  * Returns whether the node is toggled.
  *
  * @see SemanticsProperties.ToggleableState
  */
-fun isOn(): SemanticsMatcher = SemanticsMatcher.expectValue(
-    SemanticsProperties.ToggleableState, ToggleableState.On
-)
+fun isOn(): SemanticsMatcher =
+    SemanticsMatcher.expectValue(SemanticsProperties.ToggleableState, ToggleableState.On)
 
 /**
  * Returns whether the node is not toggled.
  *
  * @see SemanticsProperties.ToggleableState
  */
-fun isOff(): SemanticsMatcher = SemanticsMatcher.expectValue(
-    SemanticsProperties.ToggleableState, ToggleableState.Off
-)
+fun isOff(): SemanticsMatcher =
+    SemanticsMatcher.expectValue(SemanticsProperties.ToggleableState, ToggleableState.Off)
 
 /**
  * Return whether the node is selectable.
  *
  * @see SemanticsProperties.Selected
  */
-fun isSelectable(): SemanticsMatcher =
-    hasKey(SemanticsProperties.Selected)
+fun isSelectable(): SemanticsMatcher = hasKey(SemanticsProperties.Selected)
 
 /**
  * Returns whether the node is selected.
@@ -97,24 +93,21 @@
  *
  * @see SemanticsProperties.Focused
  */
-fun isFocusable(): SemanticsMatcher =
-    hasKey(SemanticsProperties.Focused)
+fun isFocusable(): SemanticsMatcher = hasKey(SemanticsProperties.Focused)
 
 /**
  * Return whether the node is not able to receive focus.
  *
  * @see SemanticsProperties.Focused
  */
-fun isNotFocusable(): SemanticsMatcher =
-    SemanticsMatcher.keyNotDefined(SemanticsProperties.Focused)
+fun isNotFocusable(): SemanticsMatcher = SemanticsMatcher.keyNotDefined(SemanticsProperties.Focused)
 
 /**
  * Returns whether the node is focused.
  *
  * @see SemanticsProperties.Focused
  */
-fun isFocused(): SemanticsMatcher =
-    SemanticsMatcher.expectValue(SemanticsProperties.Focused, true)
+fun isFocused(): SemanticsMatcher = SemanticsMatcher.expectValue(SemanticsProperties.Focused, true)
 
 /**
  * Returns whether the node is not focused.
@@ -129,24 +122,21 @@
  *
  * @see SemanticsActions.OnClick
  */
-fun hasClickAction(): SemanticsMatcher =
-    hasKey(SemanticsActions.OnClick)
+fun hasClickAction(): SemanticsMatcher = hasKey(SemanticsActions.OnClick)
 
 /**
  * Return whether the node has no semantics click action defined.
  *
  * @see SemanticsActions.OnClick
  */
-fun hasNoClickAction(): SemanticsMatcher =
-    SemanticsMatcher.keyNotDefined(SemanticsActions.OnClick)
+fun hasNoClickAction(): SemanticsMatcher = SemanticsMatcher.keyNotDefined(SemanticsActions.OnClick)
 
 /**
  * Return whether the node has a semantics scrollable action defined.
  *
  * @see SemanticsActions.ScrollBy
  */
-fun hasScrollAction(): SemanticsMatcher =
-    hasKey(SemanticsActions.ScrollBy)
+fun hasScrollAction(): SemanticsMatcher = hasKey(SemanticsActions.ScrollBy)
 
 /**
  * Return whether the node has no semantics scrollable action defined.
@@ -166,7 +156,6 @@
  * @param value Value to match as one of the items in the list of content descriptions.
  * @param substring Whether to use substring matching.
  * @param ignoreCase Whether case should be ignored.
- *
  * @see SemanticsProperties.ContentDescription
  */
 fun hasContentDescription(
@@ -179,15 +168,17 @@
             "${SemanticsProperties.ContentDescription.name} contains '$value' " +
                 "(ignoreCase: $ignoreCase)"
         ) {
-            it.config.getOrNull(SemanticsProperties.ContentDescription)
-                ?.any { item -> item.contains(value, ignoreCase) } ?: false
+            it.config.getOrNull(SemanticsProperties.ContentDescription)?.any { item ->
+                item.contains(value, ignoreCase)
+            } ?: false
         }
     } else {
         SemanticsMatcher(
             "${SemanticsProperties.ContentDescription.name} = '$value' (ignoreCase: $ignoreCase)"
         ) {
-            it.config.getOrNull(SemanticsProperties.ContentDescription)
-                ?.any { item -> item.equals(value, ignoreCase) } ?: false
+            it.config.getOrNull(SemanticsProperties.ContentDescription)?.any { item ->
+                item.equals(value, ignoreCase)
+            } ?: false
         }
     }
 }
@@ -201,22 +192,18 @@
  * which ones to announce.
  *
  * @param values List of values to match (the order does not matter)
- *
  * @see SemanticsProperties.ContentDescription
  */
-fun hasContentDescriptionExactly(
-    vararg values: String
-): SemanticsMatcher {
+fun hasContentDescriptionExactly(vararg values: String): SemanticsMatcher {
     val expected = values.toList()
     return SemanticsMatcher(
-        "${SemanticsProperties.ContentDescription.name} = " +
-            "[${values.joinToString(",")}]"
+        "${SemanticsProperties.ContentDescription.name} = " + "[${values.joinToString(",")}]"
     ) { node ->
-        node.config.getOrNull(SemanticsProperties.ContentDescription)
-            ?.let { given ->
-                given.size == expected.size &&
-                    given.containsAll(expected) && expected.containsAll(given)
-            } ?: values.isEmpty()
+        node.config.getOrNull(SemanticsProperties.ContentDescription)?.let { given ->
+            given.size == expected.size &&
+                given.containsAll(expected) &&
+                expected.containsAll(given)
+        } ?: values.isEmpty()
     }
 }
 
@@ -225,14 +212,13 @@
  *
  * This will also search in [SemanticsProperties.EditableText].
  *
- * Note that in merged semantics tree there can be a list of text items that got merged from
- * the child nodes. Typically an accessibility tooling will decide based on its heuristics which
- * ones to use.
+ * Note that in merged semantics tree there can be a list of text items that got merged from the
+ * child nodes. Typically an accessibility tooling will decide based on its heuristics which ones to
+ * use.
  *
  * @param text Value to match as one of the items in the list of text values.
  * @param substring Whether to use substring matching.
  * @param ignoreCase Whether case should be ignored.
- *
  * @see SemanticsProperties.Text
  * @see SemanticsProperties.EditableText
  */
@@ -243,23 +229,29 @@
 ): SemanticsMatcher {
     val propertyName = "${SemanticsProperties.Text.name} + ${SemanticsProperties.EditableText.name}"
     return if (substring) {
-        SemanticsMatcher(
-            "$propertyName contains '$text' (ignoreCase: $ignoreCase) as substring"
-        ) {
-            val isInEditableTextValue = it.config.getOrNull(SemanticsProperties.EditableText)
-                ?.text?.contains(text, ignoreCase) ?: false
-            val isInTextValue = it.config.getOrNull(SemanticsProperties.Text)
-                ?.any { item -> item.text.contains(text, ignoreCase) } ?: false
+        SemanticsMatcher("$propertyName contains '$text' (ignoreCase: $ignoreCase) as substring") {
+            val isInEditableTextValue =
+                it.config
+                    .getOrNull(SemanticsProperties.EditableText)
+                    ?.text
+                    ?.contains(text, ignoreCase) ?: false
+            val isInTextValue =
+                it.config.getOrNull(SemanticsProperties.Text)?.any { item ->
+                    item.text.contains(text, ignoreCase)
+                } ?: false
             isInEditableTextValue || isInTextValue
         }
     } else {
-        SemanticsMatcher(
-            "$propertyName contains '$text' (ignoreCase: $ignoreCase)"
-        ) {
-            val isInEditableTextValue = it.config.getOrNull(SemanticsProperties.EditableText)
-                ?.text?.equals(text, ignoreCase) ?: false
-            val isInTextValue = it.config.getOrNull(SemanticsProperties.Text)
-                ?.any { item -> item.text.equals(text, ignoreCase) } ?: false
+        SemanticsMatcher("$propertyName contains '$text' (ignoreCase: $ignoreCase)") {
+            val isInEditableTextValue =
+                it.config
+                    .getOrNull(SemanticsProperties.EditableText)
+                    ?.text
+                    ?.equals(text, ignoreCase) ?: false
+            val isInTextValue =
+                it.config.getOrNull(SemanticsProperties.Text)?.any { item ->
+                    item.text.equals(text, ignoreCase)
+                } ?: false
             isInEditableTextValue || isInTextValue
         }
     }
@@ -270,13 +262,12 @@
  *
  * This will also search in [SemanticsProperties.EditableText] by default.
  *
- * Note that in merged semantics tree there can be a list of text items that got merged from
- * the child nodes. Typically an accessibility tooling will decide based on its heuristics which
- * ones to use.
+ * Note that in merged semantics tree there can be a list of text items that got merged from the
+ * child nodes. Typically an accessibility tooling will decide based on its heuristics which ones to
+ * use.
  *
  * @param textValues List of values to match (the order does not matter)
  * @param includeEditableText Whether to also assert against the editable text
- *
  * @see SemanticsProperties.Text
  * @see SemanticsProperties.EditableText
  */
@@ -285,21 +276,20 @@
     includeEditableText: Boolean = true
 ): SemanticsMatcher {
     val expected = textValues.toList()
-    val propertyName = if (includeEditableText) {
-        "${SemanticsProperties.Text.name} + ${SemanticsProperties.EditableText.name}"
-    } else {
-        SemanticsProperties.Text.name
-    }
-    return SemanticsMatcher(
-        "$propertyName = [${textValues.joinToString(",")}]"
-    ) { node ->
+    val propertyName =
+        if (includeEditableText) {
+            "${SemanticsProperties.Text.name} + ${SemanticsProperties.EditableText.name}"
+        } else {
+            SemanticsProperties.Text.name
+        }
+    return SemanticsMatcher("$propertyName = [${textValues.joinToString(",")}]") { node ->
         val actual = mutableListOf<String>()
         if (includeEditableText) {
-            node.config.getOrNull(SemanticsProperties.EditableText)
-                ?.let { actual.add(it.text) }
+            node.config.getOrNull(SemanticsProperties.EditableText)?.let { actual.add(it.text) }
         }
-        node.config.getOrNull(SemanticsProperties.Text)
-            ?.let { actual.addAll(it.map { anStr -> anStr.text }) }
+        node.config.getOrNull(SemanticsProperties.Text)?.let {
+            actual.addAll(it.map { anStr -> anStr.text })
+        }
         actual.containsAll(expected) && expected.containsAll(actual)
     }
 }
@@ -308,36 +298,31 @@
  * Returns whether the node's value matches exactly to the given accessibility value.
  *
  * @param value Value to match.
- *
  * @see SemanticsProperties.StateDescription
  */
-fun hasStateDescription(value: String): SemanticsMatcher = SemanticsMatcher.expectValue(
-    SemanticsProperties.StateDescription, value
-)
+fun hasStateDescription(value: String): SemanticsMatcher =
+    SemanticsMatcher.expectValue(SemanticsProperties.StateDescription, value)
 
 /**
  * Returns whether the node is marked as an accessibility header.
  *
  * @see SemanticsProperties.Heading
  */
-fun isHeading(): SemanticsMatcher =
-    hasKey(SemanticsProperties.Heading)
+fun isHeading(): SemanticsMatcher = hasKey(SemanticsProperties.Heading)
 
 /**
  * Returns whether the node's range info matches exactly to the given accessibility range info.
  *
  * @param rangeInfo range info to match.
- *
  * @see SemanticsProperties.ProgressBarRangeInfo
  */
-fun hasProgressBarRangeInfo(rangeInfo: ProgressBarRangeInfo): SemanticsMatcher = SemanticsMatcher
-    .expectValue(SemanticsProperties.ProgressBarRangeInfo, rangeInfo)
+fun hasProgressBarRangeInfo(rangeInfo: ProgressBarRangeInfo): SemanticsMatcher =
+    SemanticsMatcher.expectValue(SemanticsProperties.ProgressBarRangeInfo, rangeInfo)
 
 /**
  * Returns whether the node is annotated by the given test tag.
  *
  * @param testTag Value to match.
- *
  * @see SemanticsProperties.TestTag
  */
 fun hasTestTag(testTag: String): SemanticsMatcher =
@@ -351,8 +336,7 @@
  *
  * @see SemanticsProperties.IsDialog
  */
-fun isDialog(): SemanticsMatcher =
-    hasKey(SemanticsProperties.IsDialog)
+fun isDialog(): SemanticsMatcher = hasKey(SemanticsProperties.IsDialog)
 
 /**
  * Returns whether the node is a popup.
@@ -362,8 +346,7 @@
  *
  * @see SemanticsProperties.IsPopup
  */
-fun isPopup(): SemanticsMatcher =
-    hasKey(SemanticsProperties.IsPopup)
+fun isPopup(): SemanticsMatcher = hasKey(SemanticsProperties.IsPopup)
 
 /**
  * Returns whether the node defines the given IME action.
@@ -380,8 +363,7 @@
  *
  * @see SemanticsActions.SetText
  */
-fun hasSetTextAction() =
-    hasKey(SemanticsActions.SetText)
+fun hasSetTextAction() = hasKey(SemanticsActions.SetText)
 
 /**
  * Returns whether the node defines a semantics action to insert text on it.
@@ -390,8 +372,7 @@
  *
  * @see SemanticsActions.InsertTextAtCursor
  */
-fun hasInsertTextAtCursorAction() =
-    hasKey(SemanticsActions.InsertTextAtCursor)
+fun hasInsertTextAtCursorAction() = hasKey(SemanticsActions.InsertTextAtCursor)
 
 /**
  * Returns whether the node defines a semantics action to perform the
@@ -412,11 +393,10 @@
  * Returns whether the node defines the ability to scroll to an item index.
  *
  * Note that not all scrollable containers have item indices. For example, a
- * [scrollable][androidx.compose.foundation.gestures.scrollable] doesn't have items with an
- * index, while [LazyColumn][androidx.compose.foundation.lazy.LazyColumn] does.
+ * [scrollable][androidx.compose.foundation.gestures.scrollable] doesn't have items with an index,
+ * while [LazyColumn][androidx.compose.foundation.lazy.LazyColumn] does.
  */
-fun hasScrollToIndexAction() =
-    hasKey(SemanticsActions.ScrollToIndex)
+fun hasScrollToIndexAction() = hasKey(SemanticsActions.ScrollToIndex)
 
 /**
  * Returns whether the node defines the ability to scroll to an item identified by a key, such as
@@ -424,12 +404,9 @@
  * [LazyRow][androidx.compose.foundation.lazy.LazyRow].
  */
 fun hasScrollToKeyAction() =
-    hasKey(SemanticsActions.ScrollToIndex)
-        .and(hasKey(SemanticsProperties.IndexForKey))
+    hasKey(SemanticsActions.ScrollToIndex).and(hasKey(SemanticsProperties.IndexForKey))
 
-/**
- * Returns whether the node defines the ability to scroll to content identified by a matcher.
- */
+/** Returns whether the node defines the ability to scroll to content identified by a matcher. */
 fun hasScrollToNodeAction() =
     hasKey(SemanticsActions.ScrollToIndex)
         .and(hasKey(SemanticsActions.ScrollBy))
@@ -443,16 +420,14 @@
  *
  * @see SemanticsProperties.IsEditable
  */
-fun isEditable() =
-    SemanticsMatcher.expectValue(SemanticsProperties.IsEditable, true)
+fun isEditable() = SemanticsMatcher.expectValue(SemanticsProperties.IsEditable, true)
 
 /**
  * Return whether the node is the root semantics node.
  *
  * There is always one root in every node tree, added implicitly by Compose.
  */
-fun isRoot() =
-    SemanticsMatcher("isRoot") { it.isRoot }
+fun isRoot() = SemanticsMatcher("isRoot") { it.isRoot }
 
 /**
  * Returns whether the node's parent satisfies the given matcher.
@@ -467,9 +442,7 @@
     }
 }
 
-/**
- * Returns whether the node has at least one child that satisfies the given matcher.
- */
+/** Returns whether the node has at least one child that satisfies the given matcher. */
 fun hasAnyChild(matcher: SemanticsMatcher): SemanticsMatcher {
     // TODO(b/150292800): If this is used in assert we should print the children nodes semantics
     //  in the error message or say that no children were found.
@@ -486,9 +459,7 @@
 fun hasAnySibling(matcher: SemanticsMatcher): SemanticsMatcher {
     // TODO(b/150292800): If this is used in assert we should print the sibling nodes semantics
     //  in the error message or say that no siblings were found.
-    return SemanticsMatcher(
-        "hasAnySiblingThat(${matcher.description})"
-    ) {
+    return SemanticsMatcher("hasAnySiblingThat(${matcher.description})") {
         val node = it
         it.parent?.run { matcher.matchesAny(this.children.filter { child -> child.id != node.id }) }
             ?: false
@@ -499,6 +470,7 @@
  * Returns whether the node has at least one ancestor that satisfies the given matcher.
  *
  * Example: For the following tree
+ *
  * ```
  * |-X
  * |-A
@@ -506,6 +478,7 @@
  *     |-C1
  *     |-C2
  * ```
+ *
  * In case of C1, we would check the matcher against A and B
  */
 fun hasAnyAncestor(matcher: SemanticsMatcher): SemanticsMatcher {
@@ -520,6 +493,7 @@
  * Returns whether the node has at least one descendant that satisfies the given matcher.
  *
  * Example: For the following tree
+ *
  * ```
  * |-X
  * |-A
@@ -527,6 +501,7 @@
  *     |-C1
  *     |-C2
  * ```
+ *
  * In case of A, we would check the matcher against B,C1 and C2
  */
 fun hasAnyDescendant(matcher: SemanticsMatcher): SemanticsMatcher {
@@ -546,20 +521,22 @@
 }
 
 internal val SemanticsNode.ancestors: Iterable<SemanticsNode>
-    get() = object : Iterable<SemanticsNode> {
-        override fun iterator(): Iterator<SemanticsNode> {
-            return object : Iterator<SemanticsNode> {
-                var next = parent
-                override fun hasNext(): Boolean {
-                    return next != null
-                }
+    get() =
+        object : Iterable<SemanticsNode> {
+            override fun iterator(): Iterator<SemanticsNode> {
+                return object : Iterator<SemanticsNode> {
+                    var next = parent
 
-                override fun next(): SemanticsNode {
-                    return next!!.also { next = it.parent }
+                    override fun hasNext(): Boolean {
+                        return next != null
+                    }
+
+                    override fun next(): SemanticsNode {
+                        return next!!.also { next = it.parent }
+                    }
                 }
             }
         }
-    }
 
 private fun hasKey(key: SemanticsPropertyKey<*>): SemanticsMatcher =
     SemanticsMatcher.keyIsDefined(key)
diff --git a/compose/ui/ui-test/src/commonMain/kotlin/androidx/compose/ui/test/Finders.kt b/compose/ui/ui-test/src/commonMain/kotlin/androidx/compose/ui/test/Finders.kt
index e7aad19..b0f8b92 100644
--- a/compose/ui/ui-test/src/commonMain/kotlin/androidx/compose/ui/test/Finders.kt
+++ b/compose/ui/ui-test/src/commonMain/kotlin/androidx/compose/ui/test/Finders.kt
@@ -22,7 +22,6 @@
  * For usage patterns and semantics concepts see [SemanticsNodeInteraction]
  *
  * @param useUnmergedTree Find within merged composables like Buttons.
- *
  * @see SemanticsNodeInteractionsProvider.onNode for general find method.
  */
 fun SemanticsNodeInteractionsProvider.onNodeWithTag(
@@ -36,7 +35,6 @@
  * For usage patterns and semantics concepts see [SemanticsNodeInteraction]
  *
  * @param useUnmergedTree Find within merged composables like Buttons.
- *
  * @see SemanticsNodeInteractionsProvider.onAllNodes for general find method.
  */
 fun SemanticsNodeInteractionsProvider.onAllNodesWithTag(
@@ -52,7 +50,6 @@
  * @param substring Whether to use substring matching.
  * @param ignoreCase Whether case should be ignored.
  * @param useUnmergedTree Find within merged composables like Buttons.
- *
  * @see SemanticsNodeInteractionsProvider.onNode for general find method.
  */
 fun SemanticsNodeInteractionsProvider.onNodeWithContentDescription(
diff --git a/compose/ui/ui-test/src/commonMain/kotlin/androidx/compose/ui/test/GestureScope.kt b/compose/ui/ui-test/src/commonMain/kotlin/androidx/compose/ui/test/GestureScope.kt
index b410ea5..f5367e7 100644
--- a/compose/ui/ui-test/src/commonMain/kotlin/androidx/compose/ui/test/GestureScope.kt
+++ b/compose/ui/ui-test/src/commonMain/kotlin/androidx/compose/ui/test/GestureScope.kt
@@ -24,15 +24,15 @@
 import kotlin.math.roundToInt
 
 /**
- * The distance of a swipe's start position from the node's edge, in terms of the node's length.
- * We do not start the swipe exactly on the node's edge, but somewhat more inward, since swiping
- * from the exact edge may behave in an unexpected way (e.g. may open a navigation drawer).
+ * The distance of a swipe's start position from the node's edge, in terms of the node's length. We
+ * do not start the swipe exactly on the node's edge, but somewhat more inward, since swiping from
+ * the exact edge may behave in an unexpected way (e.g. may open a navigation drawer).
  */
 private const val edgeFuzzFactor = 0.083f
 
 /**
- * The time between the last event of the first click and the first event of the second click in
- * a double click gesture. 145 milliseconds: both median and average of empirical data (33 samples)
+ * The time between the last event of the first click and the first event of the second click in a
+ * double click gesture. 145 milliseconds: both median and average of empirical data (33 samples)
  */
 private const val doubleClickDelayMillis = 145L
 
@@ -40,10 +40,10 @@
 private const val LongPressTimeoutMillis: Long = 500L
 
 /**
- * The receiver scope for injecting gestures on the SemanticsNode identified by the
- * corresponding [SemanticsNodeInteraction]. Gestures can be injected by calling methods defined
- * on [GestureScope], such as [click] or [swipe]. The [SemanticsNodeInteraction] can be found by
- * one of the finder methods such as
+ * The receiver scope for injecting gestures on the SemanticsNode identified by the corresponding
+ * [SemanticsNodeInteraction]. Gestures can be injected by calling methods defined on
+ * [GestureScope], such as [click] or [swipe]. The [SemanticsNodeInteraction] can be found by one of
+ * the finder methods such as
  * [onNode][androidx.compose.ui.test.SemanticsNodeInteractionsProvider.onNode].
  *
  * The functions in [GestureScope] can roughly be divided into two groups: full gestures and
@@ -59,29 +59,29 @@
  * after [performGesture] has executed its code block.
  *
  * Next to the functions, [GestureScope] also exposes several properties that allow you to get
- * [coordinates][Offset] within a node, like the [top left corner][topLeft], its [center], or
- * some percentage of the size ([percentOffset]).
+ * [coordinates][Offset] within a node, like the [top left corner][topLeft], its [center], or some
+ * percentage of the size ([percentOffset]).
  *
  * Example of performing a click:
+ *
  * @sample androidx.compose.ui.test.samples.gestureClick
  *
  * Example of performing a swipe up:
+ *
  * @sample androidx.compose.ui.test.samples.gestureSwipeUp
  *
  * Example of performing an L-shaped gesture:
+ *
  * @sample androidx.compose.ui.test.samples.gestureLShape
  */
-@Deprecated(
-    message = "Replaced by TouchInjectionScope"
-)
+@Deprecated(message = "Replaced by TouchInjectionScope")
 class GestureScope(node: SemanticsNode, testContext: TestContext) {
     private val delegateScopeImpl = MultiModalInjectionScopeImpl(node, testContext)
-    @PublishedApi
-    internal val delegateScope: MultiModalInjectionScope = delegateScopeImpl
+    @PublishedApi internal val delegateScope: MultiModalInjectionScope = delegateScopeImpl
 
     /**
-     * Returns the size of the visible part of the node we're interacting with. This is contrary
-     * to [SemanticsNode.size], which returns the unclipped size of the node.
+     * Returns the size of the visible part of the node we're interacting with. This is contrary to
+     * [SemanticsNode.size], which returns the unclipped size of the node.
      */
     val visibleSize: IntSize = delegateScope.visibleSize
 
@@ -90,18 +90,14 @@
     }
 }
 
-/**
- * Shorthand for `size.width`
- */
+/** Shorthand for `size.width` */
 @Deprecated(
     message = "Replaced by TouchInjectionScope. Use `performTouchInput` instead of `performGesture`"
 )
 inline val GestureScope.width: Int
     get() = delegateScope.width
 
-/**
- * Shorthand for `size.height`
- */
+/** Shorthand for `size.height` */
 @Deprecated(
     message = "Replaced by TouchInjectionScope. Use `performTouchInput` instead of `performGesture`"
 )
@@ -109,8 +105,8 @@
     get() = delegateScope.height
 
 /**
- * Returns the x-coordinate for the left edge of the node we're interacting with, in the
- * node's local coordinate system, where (0, 0) is the top left corner of the node.
+ * Returns the x-coordinate for the left edge of the node we're interacting with, in the node's
+ * local coordinate system, where (0, 0) is the top left corner of the node.
  */
 @Deprecated(
     message = "Replaced by TouchInjectionScope. Use `performTouchInput` instead of `performGesture`"
@@ -119,8 +115,8 @@
     get() = delegateScope.left
 
 /**
- * Returns the y-coordinate for the bottom of the node we're interacting with, in the
- * node's local coordinate system, where (0, 0) is the top left corner of the node.
+ * Returns the y-coordinate for the bottom of the node we're interacting with, in the node's local
+ * coordinate system, where (0, 0) is the top left corner of the node.
  */
 @Deprecated(
     message = "Replaced by TouchInjectionScope. Use `performTouchInput` instead of `performGesture`"
@@ -129,8 +125,8 @@
     get() = delegateScope.top
 
 /**
- * Returns the x-coordinate for the center of the node we're interacting with, in the
- * node's local coordinate system, where (0, 0) is the top left corner of the node.
+ * Returns the x-coordinate for the center of the node we're interacting with, in the node's local
+ * coordinate system, where (0, 0) is the top left corner of the node.
  */
 @Deprecated(
     message = "Replaced by TouchInjectionScope. Use `performTouchInput` instead of `performGesture`"
@@ -139,8 +135,8 @@
     get() = delegateScope.centerX
 
 /**
- * Returns the y-coordinate for the center of the node we're interacting with, in the
- * node's local coordinate system, where (0, 0) is the top left corner of the node.
+ * Returns the y-coordinate for the center of the node we're interacting with, in the node's local
+ * coordinate system, where (0, 0) is the top left corner of the node.
  */
 @Deprecated(
     message = "Replaced by TouchInjectionScope. Use `performTouchInput` instead of `performGesture`"
@@ -149,10 +145,10 @@
     get() = delegateScope.centerY
 
 /**
- * Returns the x-coordinate for the right edge of the node we're interacting with, in the
- * node's local coordinate system, where (0, 0) is the top left corner of the node.
- * Note that, unless `width == 0`, `right != width`. In particular, `right == width - 1f`, because
- * pixels are 0-based. If `width == 0`, `right == 0` too.
+ * Returns the x-coordinate for the right edge of the node we're interacting with, in the node's
+ * local coordinate system, where (0, 0) is the top left corner of the node. Note that, unless
+ * `width == 0`, `right != width`. In particular, `right == width - 1f`, because pixels are 0-based.
+ * If `width == 0`, `right == 0` too.
  */
 @Deprecated(
     message = "Replaced by TouchInjectionScope. Use `performTouchInput` instead of `performGesture`"
@@ -161,10 +157,10 @@
     get() = delegateScope.right
 
 /**
- * Returns the y-coordinate for the bottom of the node we're interacting with, in the
- * node's local coordinate system, where (0, 0) is the top left corner of the node.
- * Note that, unless `height == 0`, `bottom != height`. In particular, `bottom == height - 1f`,
- * because pixels are 0-based. If `height == 0`, `bottom == 0` too.
+ * Returns the y-coordinate for the bottom of the node we're interacting with, in the node's local
+ * coordinate system, where (0, 0) is the top left corner of the node. Note that, unless `height ==
+ * 0`, `bottom != height`. In particular, `bottom == height - 1f`, because pixels are 0-based. If
+ * `height == 0`, `bottom == 0` too.
  */
 @Deprecated(
     message = "Replaced by TouchInjectionScope. Use `performTouchInput` instead of `performGesture`"
@@ -173,8 +169,8 @@
     get() = delegateScope.bottom
 
 /**
- * Returns the top left corner of the node we're interacting with, in the node's
- * local coordinate system, where (0, 0) is the top left corner of the node.
+ * Returns the top left corner of the node we're interacting with, in the node's local coordinate
+ * system, where (0, 0) is the top left corner of the node.
  */
 @Deprecated(
     message = "Replaced by TouchInjectionScope. Use `performTouchInput` instead of `performGesture`"
@@ -183,8 +179,8 @@
     get() = delegateScope.topLeft
 
 /**
- * Returns the center of the top edge of the node we're interacting with, in the node's
- * local coordinate system, where (0, 0) is the top left corner of the node.
+ * Returns the center of the top edge of the node we're interacting with, in the node's local
+ * coordinate system, where (0, 0) is the top left corner of the node.
  */
 @Deprecated(
     message = "Replaced by TouchInjectionScope. Use `performTouchInput` instead of `performGesture`"
@@ -193,9 +189,9 @@
     get() = delegateScope.topCenter
 
 /**
- * Returns the top right corner of the node we're interacting with, in the node's
- * local coordinate system, where (0, 0) is the top left corner of the node. Note that
- * `topRight.x != width`, see [right].
+ * Returns the top right corner of the node we're interacting with, in the node's local coordinate
+ * system, where (0, 0) is the top left corner of the node. Note that `topRight.x != width`, see
+ * [right].
  */
 @Deprecated(
     message = "Replaced by TouchInjectionScope. Use `performTouchInput` instead of `performGesture`"
@@ -204,8 +200,8 @@
     get() = delegateScope.topRight
 
 /**
- * Returns the center of the left edge of the node we're interacting with, in the
- * node's local coordinate system, where (0, 0) is the top left corner of the node.
+ * Returns the center of the left edge of the node we're interacting with, in the node's local
+ * coordinate system, where (0, 0) is the top left corner of the node.
  */
 @Deprecated(
     message = "Replaced by TouchInjectionScope. Use `performTouchInput` instead of `performGesture`"
@@ -214,8 +210,8 @@
     get() = delegateScope.centerLeft
 
 /**
- * Returns the center of the node we're interacting with, in the node's
- * local coordinate system, where (0, 0) is the top left corner of the node.
+ * Returns the center of the node we're interacting with, in the node's local coordinate system,
+ * where (0, 0) is the top left corner of the node.
  */
 @Deprecated(
     message = "Replaced by TouchInjectionScope. Use `performTouchInput` instead of `performGesture`"
@@ -224,9 +220,9 @@
     get() = delegateScope.center
 
 /**
- * Returns the center of the right edge of the node we're interacting with, in the
- * node's local coordinate system, where (0, 0) is the top left corner of the node.
- * Note that `centerRight.x != width`, see [right].
+ * Returns the center of the right edge of the node we're interacting with, in the node's local
+ * coordinate system, where (0, 0) is the top left corner of the node. Note that `centerRight.x !=
+ * width`, see [right].
  */
 @Deprecated(
     message = "Replaced by TouchInjectionScope. Use `performTouchInput` instead of `performGesture`"
@@ -235,9 +231,9 @@
     get() = delegateScope.centerRight
 
 /**
- * Returns the bottom left corner of the node we're interacting with, in the node's
- * local coordinate system, where (0, 0) is the top left corner of the node. Note that
- * `bottomLeft.y != height`, see [bottom].
+ * Returns the bottom left corner of the node we're interacting with, in the node's local coordinate
+ * system, where (0, 0) is the top left corner of the node. Note that `bottomLeft.y != height`, see
+ * [bottom].
  */
 @Deprecated(
     message = "Replaced by TouchInjectionScope. Use `performTouchInput` instead of `performGesture`"
@@ -246,9 +242,9 @@
     get() = delegateScope.bottomLeft
 
 /**
- * Returns the center of the bottom edge of the node we're interacting with, in the node's
- * local coordinate system, where (0, 0) is the top left corner of the node. Note that
- * `bottomCenter.y != height`, see [bottom].
+ * Returns the center of the bottom edge of the node we're interacting with, in the node's local
+ * coordinate system, where (0, 0) is the top left corner of the node. Note that `bottomCenter.y !=
+ * height`, see [bottom].
  */
 @Deprecated(
     message = "Replaced by TouchInjectionScope. Use `performTouchInput` instead of `performGesture`"
@@ -257,9 +253,9 @@
     get() = delegateScope.bottomCenter
 
 /**
- * Returns the bottom right corner of the node we're interacting with, in the node's
- * local coordinate system, where (0, 0) is the top left corner of the node. Note that
- * `bottomRight.x != width` and `bottomRight.y != height`, see [right] and [bottom].
+ * Returns the bottom right corner of the node we're interacting with, in the node's local
+ * coordinate system, where (0, 0) is the top left corner of the node. Note that `bottomRight.x !=
+ * width` and `bottomRight.y != height`, see [right] and [bottom].
  */
 @Deprecated(
     message = "Replaced by TouchInjectionScope. Use `performTouchInput` instead of `performGesture`"
@@ -268,9 +264,9 @@
     get() = delegateScope.bottomRight
 
 /**
- * Creates an [Offset] relative to the size of the node we're interacting with. [x] and [y]
- * are fractions of the [width] and [height], between `-1` and `1`.
- * Note that `percentOffset(1f, 1f) != bottomRight`, see [right] and [bottom].
+ * Creates an [Offset] relative to the size of the node we're interacting with. [x] and [y] are
+ * fractions of the [width] and [height], between `-1` and `1`. Note that `percentOffset(1f, 1f) !=
+ * bottomRight`, see [right] and [bottom].
  *
  * For example: `percentOffset(.5f, .5f)` is the same as the [center]; `centerLeft +
  * percentOffset(.1f, 0f)` is a point 10% inward from the middle of the left edge; and
@@ -288,13 +284,12 @@
 ): Offset = delegateScope.percentOffset(x, y)
 
 /**
- * Performs a click gesture at the given [position] on the associated node, or in the center
- * if the [position] is omitted. The [position] is in the node's local coordinate system,
- * where (0, 0) is the top left corner of the node. The default [position] is the
- * center of the node.
+ * Performs a click gesture at the given [position] on the associated node, or in the center if the
+ * [position] is omitted. The [position] is in the node's local coordinate system, where (0, 0) is
+ * the top left corner of the node. The default [position] is the center of the node.
  *
- * @param position The position where to click, in the node's local coordinate system. If
- * omitted, the center position will be used.
+ * @param position The position where to click, in the node's local coordinate system. If omitted,
+ *   the center position will be used.
  */
 @Deprecated(
     message = "Replaced by TouchInjectionScope. Use `performTouchInput` instead of `performGesture`"
@@ -302,13 +297,13 @@
 fun GestureScope.click(position: Offset = center) = delegateScope.touch { click(position) }
 
 /**
- * Performs a long click gesture at the given [position] on the associated node, or in the
- * center if the [position] is omitted. By default, the [durationMillis] of the press is
+ * Performs a long click gesture at the given [position] on the associated node, or in the center if
+ * the [position] is omitted. By default, the [durationMillis] of the press is
  * [LongPressTimeoutMillis] + 100 milliseconds. The [position] is in the node's local coordinate
  * system, where (0, 0) is the top left corner of the node.
  *
  * @param position The position of the long click, in the node's local coordinate system. If
- * omitted, the center position will be used.
+ *   omitted, the center position will be used.
  * @param durationMillis The time between the down and the up event
  */
 @Deprecated(
@@ -320,15 +315,15 @@
 ) = delegateScope.touch { longClick(position, durationMillis) }
 
 /**
- * Performs a double click gesture at the given [position] on the associated node, or in the
- * center if the [position] is omitted. By default, the [delayMillis] between the first and the
- * second click is 145 milliseconds (empirically established). The [position] is in the node's
- * local coordinate system, where (0, 0) is the top left corner of the node.
+ * Performs a double click gesture at the given [position] on the associated node, or in the center
+ * if the [position] is omitted. By default, the [delayMillis] between the first and the second
+ * click is 145 milliseconds (empirically established). The [position] is in the node's local
+ * coordinate system, where (0, 0) is the top left corner of the node.
  *
- * @param position The position of the double click, in the node's local coordinate system.
- * If omitted, the center position will be used.
+ * @param position The position of the double click, in the node's local coordinate system. If
+ *   omitted, the center position will be used.
  * @param delayMillis The time between the up event of the first click and the down event of the
- * second click
+ *   second click
  */
 @Deprecated(
     message = "Replaced by TouchInjectionScope. Use `performTouchInput` instead of `performGesture`"
@@ -339,10 +334,9 @@
 ) = delegateScope.touch { doubleClick(position, delayMillis) }
 
 /**
- * Performs the swipe gesture on the associated node. The motion events are linearly
- * interpolated between [start] and [end]. The coordinates are in the node's local
- * coordinate system, where (0, 0) is the top left corner of the node. The default
- * duration is 200 milliseconds.
+ * Performs the swipe gesture on the associated node. The motion events are linearly interpolated
+ * between [start] and [end]. The coordinates are in the node's local coordinate system, where
+ * (0, 0) is the top left corner of the node. The default duration is 200 milliseconds.
  *
  * @param start The start position of the gesture, in the node's local coordinate system
  * @param end The end position of the gesture, in the node's local coordinate system
@@ -351,18 +345,15 @@
 @Deprecated(
     message = "Replaced by TouchInjectionScope. Use `performTouchInput` instead of `performGesture`"
 )
-fun GestureScope.swipe(
-    start: Offset,
-    end: Offset,
-    durationMillis: Long = 200
-) = delegateScope.touch { swipe(start, end, durationMillis) }
+fun GestureScope.swipe(start: Offset, end: Offset, durationMillis: Long = 200) =
+    delegateScope.touch { swipe(start, end, durationMillis) }
 
 /**
  * Performs a pinch gesture on the associated node.
  *
  * For each pair of start and end [Offset]s, the motion events are linearly interpolated. The
- * coordinates are in the node's local coordinate system where (0, 0) is the top left
- * corner of the node. The default duration is 400 milliseconds.
+ * coordinates are in the node's local coordinate system where (0, 0) is the top left corner of the
+ * node. The default duration is 400 milliseconds.
  *
  * @param start0 The start position of the first gesture in the node's local coordinate system
  * @param end0 The end position of the first gesture in the node's local coordinate system
@@ -382,20 +373,19 @@
 ) = delegateScope.touch { pinch(start0, end0, start1, end1, durationMillis) }
 
 /**
- * Performs the swipe gesture on the associated node, such that the velocity when the
- * gesture is finished is roughly equal to [endVelocity]. The MotionEvents are linearly
- * interpolated between [start] and [end]. The coordinates are in the node's
- * local coordinate system, where (0, 0) is the top left corner of the node. The
- * default duration is 200 milliseconds.
+ * Performs the swipe gesture on the associated node, such that the velocity when the gesture is
+ * finished is roughly equal to [endVelocity]. The MotionEvents are linearly interpolated between
+ * [start] and [end]. The coordinates are in the node's local coordinate system, where (0, 0) is the
+ * top left corner of the node. The default duration is 200 milliseconds.
  *
- * Note that due to imprecisions, no guarantees can be made on the precision of the actual
- * velocity at the end of the gesture, but generally it is within 0.1% of the desired velocity.
+ * Note that due to imprecisions, no guarantees can be made on the precision of the actual velocity
+ * at the end of the gesture, but generally it is within 0.1% of the desired velocity.
  *
  * @param start The start position of the gesture, in the node's local coordinate system
  * @param end The end position of the gesture, in the node's local coordinate system
  * @param endVelocity The velocity of the gesture at the moment it ends. Must be positive.
  * @param durationMillis The duration of the gesture in milliseconds. Must be long enough that at
- * least 3 input events are generated, which happens with a duration of 25ms or more.
+ *   least 3 input events are generated, which happens with a duration of 25ms or more.
  */
 @Deprecated(
     message = "Replaced by TouchInjectionScope. Use `performTouchInput` instead of `performGesture`"
@@ -422,9 +412,9 @@
  * [endY], taking [durationMillis] milliseconds.
  *
  * @param startY The y-coordinate of the start of the swipe. Must be greater than or equal to the
- * [endY]. By default slightly above the [bottom] of the node.
- * @param endY The y-coordinate of the end of the swipe. Must be less than or equal to the
- * [startY]. By default the [top] of the node.
+ *   [endY]. By default slightly above the [bottom] of the node.
+ * @param endY The y-coordinate of the end of the swipe. Must be less than or equal to the [startY].
+ *   By default the [top] of the node.
  * @param durationMillis The duration of the swipe. By default 200 milliseconds.
  */
 @Deprecated(
@@ -451,9 +441,9 @@
  * [endY], taking [durationMillis] milliseconds.
  *
  * @param startY The y-coordinate of the start of the swipe. Must be less than or equal to the
- * [endY]. By default slightly below the [top] of the node.
+ *   [endY]. By default slightly below the [top] of the node.
  * @param endY The y-coordinate of the end of the swipe. Must be greater than or equal to the
- * [startY]. By default the [bottom] of the node.
+ *   [startY]. By default the [bottom] of the node.
  * @param durationMillis The duration of the swipe. By default 200 milliseconds.
  */
 @Deprecated(
@@ -480,9 +470,9 @@
  * [endX], taking [durationMillis] milliseconds.
  *
  * @param startX The x-coordinate of the start of the swipe. Must be greater than or equal to the
- * [endX]. By default slightly left of the [right] of the node.
- * @param endX The x-coordinate of the end of the swipe. Must be less than or equal to the
- * [startX]. By default the [left] of the node.
+ *   [endX]. By default slightly left of the [right] of the node.
+ * @param endX The x-coordinate of the end of the swipe. Must be less than or equal to the [startX].
+ *   By default the [left] of the node.
  * @param durationMillis The duration of the swipe. By default 200 milliseconds.
  */
 @Deprecated(
@@ -509,9 +499,9 @@
  * [endX], taking [durationMillis] milliseconds.
  *
  * @param startX The x-coordinate of the start of the swipe. Must be less than or equal to the
- * [endX]. By default slightly right of the [left] of the node.
+ *   [endX]. By default slightly right of the [left] of the node.
  * @param endX The x-coordinate of the end of the swipe. Must be greater than or equal to the
- * [startX]. By default the [right] of the node.
+ *   [startX]. By default the [right] of the node.
  * @param durationMillis The duration of the swipe. By default 200 milliseconds.
  */
 @Deprecated(
@@ -524,45 +514,50 @@
     durationMillis: Long = 200
 ) = delegateScope.touch { swipeRight(startX, endX, durationMillis) }
 
-private val Int.startFuzzed: Float get() = (this * edgeFuzzFactor).roundToInt().toFloat()
-private val Int.endFuzzed: Float get() = (this * (1 - edgeFuzzFactor)).roundToInt().toFloat()
+private val Int.startFuzzed: Float
+    get() = (this * edgeFuzzFactor).roundToInt().toFloat()
+private val Int.endFuzzed: Float
+    get() = (this * (1 - edgeFuzzFactor)).roundToInt().toFloat()
 
-private val GestureScope.leftFuzzed: Float get() = width.startFuzzed
-private val GestureScope.topFuzzed: Float get() = height.startFuzzed
-private val GestureScope.rightFuzzed: Float get() = width.endFuzzed
-private val GestureScope.bottomFuzzed: Float get() = height.endFuzzed
+private val GestureScope.leftFuzzed: Float
+    get() = width.startFuzzed
+private val GestureScope.topFuzzed: Float
+    get() = height.startFuzzed
+private val GestureScope.rightFuzzed: Float
+    get() = width.endFuzzed
+private val GestureScope.bottomFuzzed: Float
+    get() = height.endFuzzed
 
 /**
  * Sends a down event for the pointer with the given [pointerId] at [position] on the associated
- * node. The [position] is in the node's local coordinate system, where (0, 0) is
- * the top left corner of the node.
+ * node. The [position] is in the node's local coordinate system, where (0, 0) is the top left
+ * corner of the node.
  *
- * If no pointers are down yet, this will start a new gesture. If a gesture is
- * already in progress, this event is sent with at the same timestamp as the last event. If the
- * given pointer is already down, an [IllegalArgumentException] will be thrown.
+ * If no pointers are down yet, this will start a new gesture. If a gesture is already in progress,
+ * this event is sent with at the same timestamp as the last event. If the given pointer is already
+ * down, an [IllegalArgumentException] will be thrown.
  *
  * Subsequent events for this or other gestures can be spread out over both this and future
- * invocations of [performGesture]. An entire gesture starts with a [down][down] event,
- * followed by several down, move or up events, and ends with an [up][up] or a
- * [cancel][cancel] event. Movement can be expressed with [moveTo] and [moveBy] to
- * move a single pointer at a time, or [movePointerTo] and [movePointerBy] to move multiple
- * pointers at a time. The `movePointer[To|By]` methods do not send the move event directly, use
- * [move] to send the move event. Some other methods can send a move event as well. All
- * events, regardless the method used, will always contain the current position of _all_ pointers.
+ * invocations of [performGesture]. An entire gesture starts with a [down][down] event, followed by
+ * several down, move or up events, and ends with an [up][up] or a [cancel][cancel] event. Movement
+ * can be expressed with [moveTo] and [moveBy] to move a single pointer at a time, or
+ * [movePointerTo] and [movePointerBy] to move multiple pointers at a time. The `movePointer[To|By]`
+ * methods do not send the move event directly, use [move] to send the move event. Some other
+ * methods can send a move event as well. All events, regardless the method used, will always
+ * contain the current position of _all_ pointers.
  *
- * Down and up events are sent at the same time as the previous event, but will send an extra
- * move event just before the down or up event if [movePointerTo] or [movePointerBy] has been
- * called and no move event has been sent yet. This does not happen for cancel events, but the
- * cancel event will contain the up to date position of all pointers. Move and cancel events will
- * advance the event time by 16 milliseconds.
+ * Down and up events are sent at the same time as the previous event, but will send an extra move
+ * event just before the down or up event if [movePointerTo] or [movePointerBy] has been called and
+ * no move event has been sent yet. This does not happen for cancel events, but the cancel event
+ * will contain the up to date position of all pointers. Move and cancel events will advance the
+ * event time by 16 milliseconds.
  *
- * Because gestures don't have to be defined all in the same [performGesture] block,
- * keep in mind that while the gesture is not complete, all code you execute in between
- * blocks that progress the gesture, will be executed while imaginary fingers are actively
- * touching the screen.
+ * Because gestures don't have to be defined all in the same [performGesture] block, keep in mind
+ * that while the gesture is not complete, all code you execute in between blocks that progress the
+ * gesture, will be executed while imaginary fingers are actively touching the screen.
  *
- * In the context of testing, it is not necessary to complete a gesture with an up or cancel
- * event, if the test ends before it expects the finger to be lifted from the screen.
+ * In the context of testing, it is not necessary to complete a gesture with an up or cancel event,
+ * if the test ends before it expects the finger to be lifted from the screen.
  *
  * @param pointerId The id of the pointer, can be any number not yet in use by another pointer
  * @param position The position of the down event, in the node's local coordinate system
@@ -574,13 +569,13 @@
     delegateScope.touch { down(pointerId, position) }
 
 /**
- * Sends a down event for the default pointer at [position] on the associated node. The
- * [position] is in the node's local coordinate system, where (0, 0) is the top left
- * corner of the node. The default pointer has `pointerId = 0`.
+ * Sends a down event for the default pointer at [position] on the associated node. The [position]
+ * is in the node's local coordinate system, where (0, 0) is the top left corner of the node. The
+ * default pointer has `pointerId = 0`.
  *
- * If no pointers are down yet, this will start a new gesture. If a gesture is
- * already in progress, this event is sent with at the same timestamp as the last event. If the
- * default pointer is already down, an [IllegalArgumentException] will be thrown.
+ * If no pointers are down yet, this will start a new gesture. If a gesture is already in progress,
+ * this event is sent with at the same timestamp as the last event. If the default pointer is
+ * already down, an [IllegalArgumentException] will be thrown.
  *
  * @param position The position of the down event, in the node's local coordinate system
  */
@@ -590,9 +585,9 @@
 fun GestureScope.down(position: Offset) = delegateScope.touch { down(position) }
 
 /**
- * Sends a move event on the associated node, with the position of the pointer with the
- * given [pointerId] updated to [position]. The [position] is in the node's local coordinate
- * system, where (0, 0) is the top left corner of the node.
+ * Sends a move event on the associated node, with the position of the pointer with the given
+ * [pointerId] updated to [position]. The [position] is in the node's local coordinate system, where
+ * (0, 0) is the top left corner of the node.
  *
  * If the pointer is not yet down, an [IllegalArgumentException] will be thrown.
  *
@@ -606,9 +601,9 @@
     delegateScope.touch { moveTo(pointerId, position) }
 
 /**
- * Sends a move event on the associated node, with the position of the default pointer
- * updated to [position]. The [position] is in the node's local coordinate system, where
- * (0, 0) is the top left corner of the node. The default pointer has `pointerId = 0`.
+ * Sends a move event on the associated node, with the position of the default pointer updated to
+ * [position]. The [position] is in the node's local coordinate system, where (0, 0) is the top left
+ * corner of the node. The default pointer has `pointerId = 0`.
  *
  * If the default pointer is not yet down, an [IllegalArgumentException] will be thrown.
  *
@@ -620,10 +615,9 @@
 fun GestureScope.moveTo(position: Offset) = delegateScope.touch { moveTo(position) }
 
 /**
- * Updates the position of the pointer with the given [pointerId] to the given [position], but
- * does not send a move event. The move event can be sent with [move]. The [position] is in
- * the node's local coordinate system, where (0.px, 0.px) is the top left corner of the
- * node.
+ * Updates the position of the pointer with the given [pointerId] to the given [position], but does
+ * not send a move event. The move event can be sent with [move]. The [position] is in the node's
+ * local coordinate system, where (0.px, 0.px) is the top left corner of the node.
  *
  * If the pointer is not yet down, an [IllegalArgumentException] will be thrown.
  *
@@ -631,23 +625,23 @@
  * @param position The new position of the pointer, in the node's local coordinate system
  */
 @Deprecated(
-    message = "Replaced by TouchInjectionScope. Use `performTouchInput` instead of " +
-        "`performGesture`",
+    message =
+        "Replaced by TouchInjectionScope. Use `performTouchInput` instead of " + "`performGesture`",
     replaceWith = ReplaceWith("updatePointerTo(pointerId, position)")
 )
 fun GestureScope.movePointerTo(pointerId: Int, position: Offset) =
     delegateScope.touch { updatePointerTo(pointerId, position) }
 
 /**
- * Sends a move event on the associated node, with the position of the pointer with the
- * given [pointerId] moved by the given [delta].
+ * Sends a move event on the associated node, with the position of the pointer with the given
+ * [pointerId] moved by the given [delta].
  *
  * If the pointer is not yet down, an [IllegalArgumentException] will be thrown.
  *
  * @param pointerId The id of the pointer to move, as supplied in [down]
- * @param delta The position for this move event, relative to the last sent position of the
- * pointer. For example, `delta = Offset(10.px, -10.px) will add 10.px to the pointer's last
- * x-position, and subtract 10.px from the pointer's last y-position.
+ * @param delta The position for this move event, relative to the last sent position of the pointer.
+ *   For example, `delta = Offset(10.px, -10.px) will add 10.px to the pointer's last x-position,
+ *   and subtract 10.px from the pointer's last y-position.
  */
 @Deprecated(
     message = "Replaced by TouchInjectionScope. Use `performTouchInput` instead of `performGesture`"
@@ -656,14 +650,14 @@
     delegateScope.touch { moveBy(pointerId, delta) }
 
 /**
- * Sends a move event on the associated node, with the position of the default pointer
- * moved by the given [delta]. The default pointer has `pointerId = 0`.
+ * Sends a move event on the associated node, with the position of the default pointer moved by the
+ * given [delta]. The default pointer has `pointerId = 0`.
  *
  * If the pointer is not yet down, an [IllegalArgumentException] will be thrown.
  *
- * @param delta The position for this move event, relative to the last sent position of the
- * pointer. For example, `delta = Offset(10.px, -10.px) will add 10.px to the pointer's last
- * x-position, and subtract 10.px from the pointer's last y-position.
+ * @param delta The position for this move event, relative to the last sent position of the pointer.
+ *   For example, `delta = Offset(10.px, -10.px) will add 10.px to the pointer's last x-position,
+ *   and subtract 10.px from the pointer's last y-position.
  */
 @Deprecated(
     message = "Replaced by TouchInjectionScope. Use `performTouchInput` instead of `performGesture`"
@@ -671,19 +665,19 @@
 fun GestureScope.moveBy(delta: Offset) = delegateScope.touch { moveBy(delta) }
 
 /**
- * Moves the position of the pointer with the given [pointerId] by the given [delta], but does
- * not send a move event. The move event can be sent with [move].
+ * Moves the position of the pointer with the given [pointerId] by the given [delta], but does not
+ * send a move event. The move event can be sent with [move].
  *
  * If the pointer is not yet down, an [IllegalArgumentException] will be thrown.
  *
  * @param pointerId The id of the pointer to move, as supplied in [down]
- * @param delta The position for this move event, relative to the last sent position of the
- * pointer. For example, `delta = Offset(10.px, -10.px) will add 10.px to the pointer's last
- * x-position, and subtract 10.px from the pointer's last y-position.
+ * @param delta The position for this move event, relative to the last sent position of the pointer.
+ *   For example, `delta = Offset(10.px, -10.px) will add 10.px to the pointer's last x-position,
+ *   and subtract 10.px from the pointer's last y-position.
  */
 @Deprecated(
-    message = "Replaced by TouchInjectionScope. Use `performTouchInput` instead of " +
-        "`performGesture`",
+    message =
+        "Replaced by TouchInjectionScope. Use `performTouchInput` instead of " + "`performGesture`",
     replaceWith = ReplaceWith("updatePointerBy(pointerId, delta)")
 )
 fun GestureScope.movePointerBy(pointerId: Int, delta: Offset) =
@@ -702,8 +696,8 @@
 /**
  * Sends an up event for the pointer with the given [pointerId], or the default pointer if
  * [pointerId] is omitted, on the associated node. If any pointers have been moved with
- * [movePointerTo] or [movePointerBy] and no move event has been sent yet, a move event will be
- * sent right before the up event.
+ * [movePointerTo] or [movePointerBy] and no move event has been sent yet, a move event will be sent
+ * right before the up event.
  *
  * @param pointerId The id of the pointer to lift up, as supplied in [down]
  */
@@ -713,8 +707,8 @@
 fun GestureScope.up(pointerId: Int = 0) = delegateScope.touch { up(pointerId) }
 
 /**
- * Sends a cancel event to cancel the current gesture. The cancel event contains the
- * current position of all active pointers.
+ * Sends a cancel event to cancel the current gesture. The cancel event contains the current
+ * position of all active pointers.
  */
 @Deprecated(
     message = "Replaced by TouchInjectionScope. Use `performTouchInput` instead of `performGesture`"
@@ -722,8 +716,8 @@
 fun GestureScope.cancel() = delegateScope.touch { cancel() }
 
 /**
- * Adds the given [durationMillis] to the current event time, delaying the next event by that
- * time. Only valid when a gesture has already been started, or when a finished gesture is resumed.
+ * Adds the given [durationMillis] to the current event time, delaying the next event by that time.
+ * Only valid when a gesture has already been started, or when a finished gesture is resumed.
  */
 @Deprecated(
     message = "Replaced by TouchInjectionScope. Use `performTouchInput` instead of `performGesture`"
diff --git a/compose/ui/ui-test/src/commonMain/kotlin/androidx/compose/ui/test/GlobalAssertions.kt b/compose/ui/ui-test/src/commonMain/kotlin/androidx/compose/ui/test/GlobalAssertions.kt
index 18ebb02..be74a60 100644
--- a/compose/ui/ui-test/src/commonMain/kotlin/androidx/compose/ui/test/GlobalAssertions.kt
+++ b/compose/ui/ui-test/src/commonMain/kotlin/androidx/compose/ui/test/GlobalAssertions.kt
@@ -20,14 +20,13 @@
 /**
  * Adds a named assertion to the collection of assertions to be executed before test actions.
  *
- * This API is intended to be invoked by assertion frameworks to register assertions
- * that must hold on the entire application whenever it's fully loaded and ready to
- * interact with. They will be invoked upon common actions such as `performClick`, and
- * they always verify every element on the screen, not just the element the action is
- * performed on.
+ * This API is intended to be invoked by assertion frameworks to register assertions that must hold
+ * on the entire application whenever it's fully loaded and ready to interact with. They will be
+ * invoked upon common actions such as `performClick`, and they always verify every element on the
+ * screen, not just the element the action is performed on.
  *
- * This is particularly useful to automatically catch accessibility problems such
- * as contrast ratio, minimum touch-target size, etc.
+ * This is particularly useful to automatically catch accessibility problems such as contrast ratio,
+ * minimum touch-target size, etc.
  *
  * @param name An identifier for the assertion. It can subsequently be used to deactivate the
  *   assertion with [removeGlobalAssertion].
diff --git a/compose/ui/ui-test/src/commonMain/kotlin/androidx/compose/ui/test/IdlingResource.kt b/compose/ui/ui-test/src/commonMain/kotlin/androidx/compose/ui/test/IdlingResource.kt
index 106ed52..8379757 100644
--- a/compose/ui/ui-test/src/commonMain/kotlin/androidx/compose/ui/test/IdlingResource.kt
+++ b/compose/ui/ui-test/src/commonMain/kotlin/androidx/compose/ui/test/IdlingResource.kt
@@ -19,19 +19,19 @@
 import androidx.compose.ui.test.internal.JvmDefaultWithCompatibility
 
 /**
- * Represents a resource of an application under test which can cause asynchronous background
- * work to happen during test execution (e.g. an http request in response to a button click).
+ * Represents a resource of an application under test which can cause asynchronous background work
+ * to happen during test execution (e.g. an http request in response to a button click).
  *
  * By default, all interactions from the test with the compose tree (finding nodes, performing
- * gestures, making assertions) will be synchronized with pending work in Compose's internals
- * (such as applying state changes, recomposing, measuring, etc). This ensures that the UI is in
- * a stable state when the interactions are performed, so that e.g. no pending recompositions are
- * still scheduled that could potentially change the UI. However, any asynchronous work that is
- * not done through one of Compose's mechanisms won't be included in the default synchronization.
- * For such work, test authors can create an [IdlingResource] and register it into the test with
+ * gestures, making assertions) will be synchronized with pending work in Compose's internals (such
+ * as applying state changes, recomposing, measuring, etc). This ensures that the UI is in a stable
+ * state when the interactions are performed, so that e.g. no pending recompositions are still
+ * scheduled that could potentially change the UI. However, any asynchronous work that is not done
+ * through one of Compose's mechanisms won't be included in the default synchronization. For such
+ * work, test authors can create an [IdlingResource] and register it into the test with
  * [registerIdlingResource][androidx.compose.ui.test.junit4.ComposeTestRule
- * .registerIdlingResource], and the interaction will wait for that resource to become idle prior
- * to performing it.
+ * .registerIdlingResource], and the interaction will wait for that resource to become idle prior to
+ * performing it.
  */
 @JvmDefaultWithCompatibility
 interface IdlingResource {
@@ -45,8 +45,8 @@
     val isIdleNow: Boolean
 
     /**
-     * Returns diagnostics that explain why the idling resource is busy, or `null` if the
-     * resource is not busy. Default implementation returns `null`.
+     * Returns diagnostics that explain why the idling resource is busy, or `null` if the resource
+     * is not busy. Default implementation returns `null`.
      */
     fun getDiagnosticMessageIfBusy(): String? = null
 }
diff --git a/compose/ui/ui-test/src/commonMain/kotlin/androidx/compose/ui/test/InjectionScope.kt b/compose/ui/ui-test/src/commonMain/kotlin/androidx/compose/ui/test/InjectionScope.kt
index 86b9c7c..1fe0548 100644
--- a/compose/ui/ui-test/src/commonMain/kotlin/androidx/compose/ui/test/InjectionScope.kt
+++ b/compose/ui/ui-test/src/commonMain/kotlin/androidx/compose/ui/test/InjectionScope.kt
@@ -26,21 +26,20 @@
  * The receiver scope of all input injection lambdas offered in `ui-test`, such as
  * [performTouchInput] and [performMouseInput].
  *
- * This scope offers several properties that allow you to get [coordinates][Offset] within the
- * node you're interacting on, like the [topLeft] corner, its [center], or some percentage of the
- * size ([percentOffset]).
+ * This scope offers several properties that allow you to get [coordinates][Offset] within the node
+ * you're interacting on, like the [topLeft] corner, its [center], or some percentage of the size
+ * ([percentOffset]).
  *
- * All positional properties are expressed in pixels. [InjectionScope] implements [Density] so
- * you can convert between px and dp as you wish. The density used is taken from the
- * [SemanticsNode][androidx.compose.ui.semantics.SemanticsNode] from the
- * [SemanticsNodeInteraction] on which the input injection method is called.
+ * All positional properties are expressed in pixels. [InjectionScope] implements [Density] so you
+ * can convert between px and dp as you wish. The density used is taken from the
+ * [SemanticsNode][androidx.compose.ui.semantics.SemanticsNode] from the [SemanticsNodeInteraction]
+ * on which the input injection method is called.
  */
 @JvmDefaultWithCompatibility
 interface InjectionScope : Density {
-    /**
-     * The default time between two successive events.
-     */
-    val eventPeriodMillis get() = InputDispatcher.eventPeriodMillis
+    /** The default time between two successive events. */
+    val eventPeriodMillis
+        get() = InputDispatcher.eventPeriodMillis
 
     /**
      * Adds the given [durationMillis] to the current event time, delaying the next event by that
@@ -61,125 +60,138 @@
      */
     val viewConfiguration: ViewConfiguration
 
-    /**
-     * The width of the node in px. Shorthand for [visibleSize.width][visibleSize].
-     */
-    val width: Int get() = visibleSize.width
+    /** The width of the node in px. Shorthand for [visibleSize.width][visibleSize]. */
+    val width: Int
+        get() = visibleSize.width
+
+    /** The height of the node in px. Shorthand for [visibleSize.height][visibleSize]. */
+    val height: Int
+        get() = visibleSize.height
 
     /**
-     * The height of the node in px. Shorthand for [visibleSize.height][visibleSize].
+     * The x-coordinate for the left edge of the node we're interacting with in px, in the node's
+     * local coordinate system, where (0, 0) is the top left corner of the node.
      */
-    val height: Int get() = visibleSize.height
+    val left: Float
+        get() = 0f
 
     /**
-     * The x-coordinate for the left edge of the node we're interacting with in px, in the
-     * node's local coordinate system, where (0, 0) is the top left corner of the node.
+     * The y-coordinate for the bottom of the node we're interacting with in px, in the node's local
+     * coordinate system, where (0, 0) is the top left corner of the node.
      */
-    val left: Float get() = 0f
+    val top: Float
+        get() = 0f
 
     /**
-     * The y-coordinate for the bottom of the node we're interacting with in px, in the
-     * node's local coordinate system, where (0, 0) is the top left corner of the node.
+     * The x-coordinate for the center of the node we're interacting with in px, in the node's local
+     * coordinate system, where (0, 0) is the top left corner of the node.
      */
-    val top: Float get() = 0f
+    val centerX: Float
+        get() = width / 2f
 
     /**
-     * The x-coordinate for the center of the node we're interacting with in px, in the
-     * node's local coordinate system, where (0, 0) is the top left corner of the node.
+     * The y-coordinate for the center of the node we're interacting with in px, in the node's local
+     * coordinate system, where (0, 0) is the top left corner of the node.
      */
-    val centerX: Float get() = width / 2f
+    val centerY: Float
+        get() = height / 2f
 
     /**
-     * The y-coordinate for the center of the node we're interacting with in px, in the
-     * node's local coordinate system, where (0, 0) is the top left corner of the node.
-     */
-    val centerY: Float get() = height / 2f
-
-    /**
-     * The x-coordinate for the right edge of the node we're interacting with in px, in the
-     * node's local coordinate system, where (0, 0) is the top left corner of the node.
+     * The x-coordinate for the right edge of the node we're interacting with in px, in the node's
+     * local coordinate system, where (0, 0) is the top left corner of the node.
      *
      * Note that, unless `width == 0`, `right != width`. In particular, `right == width - 1f`,
      * because pixels are 0-based. If `width == 0`, `right == 0` too.
      */
-    val right: Float get() = width.let { if (it == 0) 0f else it - 1f }
+    val right: Float
+        get() = width.let { if (it == 0) 0f else it - 1f }
 
     /**
-     * The y-coordinate for the bottom of the node we're interacting with in px, in the
-     * node's local coordinate system, where (0, 0) is the top left corner of the node.
+     * The y-coordinate for the bottom of the node we're interacting with in px, in the node's local
+     * coordinate system, where (0, 0) is the top left corner of the node.
      *
      * Note that, unless `height == 0`, `bottom != height`. In particular, `bottom == height - 1f`,
      * because pixels are 0-based. If `height == 0`, `bottom == 0` too.
      */
-    val bottom: Float get() = height.let { if (it == 0) 0f else it - 1f }
+    val bottom: Float
+        get() = height.let { if (it == 0) 0f else it - 1f }
 
     /**
-     * The top left corner of the node we're interacting with, in the node's
-     * local coordinate system, where (0, 0) is the top left corner of the node.
+     * The top left corner of the node we're interacting with, in the node's local coordinate
+     * system, where (0, 0) is the top left corner of the node.
      */
-    val topLeft: Offset get() = Offset(left, top)
+    val topLeft: Offset
+        get() = Offset(left, top)
 
     /**
-     * The center of the top edge of the node we're interacting with, in the node's
-     * local coordinate system, where (0, 0) is the top left corner of the node.
+     * The center of the top edge of the node we're interacting with, in the node's local coordinate
+     * system, where (0, 0) is the top left corner of the node.
      */
-    val topCenter: Offset get() = Offset(centerX, top)
+    val topCenter: Offset
+        get() = Offset(centerX, top)
 
     /**
-     * The top right corner of the node we're interacting with, in the node's
-     * local coordinate system, where (0, 0) is the top left corner of the node.
+     * The top right corner of the node we're interacting with, in the node's local coordinate
+     * system, where (0, 0) is the top left corner of the node.
      *
      * Note that `topRight.x != width`, see [right].
      */
-    val topRight: Offset get() = Offset(right, top)
+    val topRight: Offset
+        get() = Offset(right, top)
 
     /**
-     * The center of the left edge of the node we're interacting with, in the
-     * node's local coordinate system, where (0, 0) is the top left corner of the node.
+     * The center of the left edge of the node we're interacting with, in the node's local
+     * coordinate system, where (0, 0) is the top left corner of the node.
      */
-    val centerLeft: Offset get() = Offset(left, centerY)
+    val centerLeft: Offset
+        get() = Offset(left, centerY)
 
     /**
-     * The center of the node we're interacting with, in the node's
-     * local coordinate system, where (0, 0) is the top left corner of the node.
+     * The center of the node we're interacting with, in the node's local coordinate system, where
+     * (0, 0) is the top left corner of the node.
      */
-    val center: Offset get() = Offset(centerX, centerY)
+    val center: Offset
+        get() = Offset(centerX, centerY)
 
     /**
-     * The center of the right edge of the node we're interacting with, in the
-     * node's local coordinate system, where (0, 0) is the top left corner of the node.
+     * The center of the right edge of the node we're interacting with, in the node's local
+     * coordinate system, where (0, 0) is the top left corner of the node.
      *
      * Note that `centerRight.x != width`, see [right].
      */
-    val centerRight: Offset get() = Offset(right, centerY)
+    val centerRight: Offset
+        get() = Offset(right, centerY)
 
     /**
-     * The bottom left corner of the node we're interacting with, in the node's
-     * local coordinate system, where (0, 0) is the top left corner of the node.
+     * The bottom left corner of the node we're interacting with, in the node's local coordinate
+     * system, where (0, 0) is the top left corner of the node.
      *
      * Note that `bottomLeft.y != height`, see [bottom].
      */
-    val bottomLeft: Offset get() = Offset(left, bottom)
+    val bottomLeft: Offset
+        get() = Offset(left, bottom)
 
     /**
-     * The center of the bottom edge of the node we're interacting with, in the node's
-     * local coordinate system, where (0, 0) is the top left corner of the node.
+     * The center of the bottom edge of the node we're interacting with, in the node's local
+     * coordinate system, where (0, 0) is the top left corner of the node.
      *
      * Note that `bottomCenter.y != height`, see [bottom].
      */
-    val bottomCenter: Offset get() = Offset(centerX, bottom)
+    val bottomCenter: Offset
+        get() = Offset(centerX, bottom)
 
     /**
-     * The bottom right corner of the node we're interacting with, in the node's
-     * local coordinate system, where (0, 0) is the top left corner of the node.
+     * The bottom right corner of the node we're interacting with, in the node's local coordinate
+     * system, where (0, 0) is the top left corner of the node.
      *
      * Note that `bottomRight.x != width` and `bottomRight.y != height`, see [right] and [bottom].
      */
-    val bottomRight: Offset get() = Offset(right, bottom)
+    val bottomRight: Offset
+        get() = Offset(right, bottom)
 
     /**
-     * Creates an [Offset] relative to the size of the node we're interacting with. [x] and [y]
-     * are fractions of the [width] and [height], between `-1` and `1`.
+     * Creates an [Offset] relative to the size of the node we're interacting with. [x] and [y] are
+     * fractions of the [width] and [height], between `-1` and `1`.
      *
      * Note that `percentOffset(1f, 1f) != bottomRight`, see [right] and [bottom].
      *
diff --git a/compose/ui/ui-test/src/commonMain/kotlin/androidx/compose/ui/test/InputDispatcher.kt b/compose/ui/ui-test/src/commonMain/kotlin/androidx/compose/ui/test/InputDispatcher.kt
index e6a42c2..3e973df 100644
--- a/compose/ui/ui-test/src/commonMain/kotlin/androidx/compose/ui/test/InputDispatcher.kt
+++ b/compose/ui/ui-test/src/commonMain/kotlin/androidx/compose/ui/test/InputDispatcher.kt
@@ -25,15 +25,15 @@
 ): InputDispatcher
 
 /**
- * Dispatcher to inject any kind of input. An [InputDispatcher] is created at the
- * beginning of [performMultiModalInput] or the single modality alternatives, and disposed at the
- * end of that method. The state of all input modalities is persisted and restored on the next
- * invocation of [performMultiModalInput] (or an alternative).
+ * Dispatcher to inject any kind of input. An [InputDispatcher] is created at the beginning of
+ * [performMultiModalInput] or the single modality alternatives, and disposed at the end of that
+ * method. The state of all input modalities is persisted and restored on the next invocation of
+ * [performMultiModalInput] (or an alternative).
  *
- * Dispatching input happens in two stages. In the first stage, all events are generated
- * (enqueued), using the `enqueue*` methods, and in the second stage all events are injected.
- * Clients of [InputDispatcher] should only call methods for the first stage listed below, the
- * second stage is handled by [performMultiModalInput] and friends.
+ * Dispatching input happens in two stages. In the first stage, all events are generated (enqueued),
+ * using the `enqueue*` methods, and in the second stage all events are injected. Clients of
+ * [InputDispatcher] should only call methods for the first stage listed below, the second stage is
+ * handled by [performMultiModalInput] and friends.
  *
  * Touch input:
  * * [getCurrentTouchPosition]
@@ -88,14 +88,10 @@
         const val SubsequentRepeatDelay = 50L
     }
 
-    /**
-     * The eventTime of the next event.
-     */
+    /** The eventTime of the next event. */
     protected var currentTime = testContext.currentTime
 
-    /**
-     * The state of the current touch gesture. If `null`, no touch gesture is in progress.
-     */
+    /** The state of the current touch gesture. If `null`, no touch gesture is in progress. */
     protected var partialGesture: PartialGesture? = null
 
     /**
@@ -105,37 +101,32 @@
     protected var mouseInputState: MouseInputState = MouseInputState()
 
     /**
-     * The state of the keyboard keys. The key input state is always available.
-     * It starts with no keys pressed down and the [KeyInputState.downTime] set to zero.
+     * The state of the keyboard keys. The key input state is always available. It starts with no
+     * keys pressed down and the [KeyInputState.downTime] set to zero.
      */
     protected var keyInputState: KeyInputState = KeyInputState()
 
-    /**
-     * The state of the rotary button.
-     */
+    /** The state of the rotary button. */
     protected var rotaryInputState: RotaryInputState = RotaryInputState()
 
     /**
-     * Indicates if a gesture is in progress or not. A gesture is in progress if at least one
-     * finger is (still) touching the screen.
+     * Indicates if a gesture is in progress or not. A gesture is in progress if at least one finger
+     * is (still) touching the screen.
      */
     val isTouchInProgress: Boolean
         get() = partialGesture != null
 
-    /**
-     * Indicates whether caps lock is on or not.
-     */
-    val isCapsLockOn: Boolean get() = keyInputState.capsLockOn
+    /** Indicates whether caps lock is on or not. */
+    val isCapsLockOn: Boolean
+        get() = keyInputState.capsLockOn
 
-    /**
-     * Indicates whether num lock is on or not.
-     */
-    val isNumLockOn: Boolean get() = keyInputState.numLockOn
+    /** Indicates whether num lock is on or not. */
+    val isNumLockOn: Boolean
+        get() = keyInputState.numLockOn
 
-    /**
-     * Indicates whether scroll lock is on or not.
-     */
-    val isScrollLockOn: Boolean get() = keyInputState.scrollLockOn
+    /** Indicates whether scroll lock is on or not. */
+    val isScrollLockOn: Boolean
+        get() = keyInputState.scrollLockOn
 
     init {
         val rootHash = identityHashCode(root)
@@ -151,11 +142,7 @@
         if (root != null) {
             val rootHash = identityHashCode(root)
             testContext.states[rootHash] =
-                InputDispatcherState(
-                    partialGesture,
-                    mouseInputState,
-                    keyInputState
-                )
+                InputDispatcherState(partialGesture, mouseInputState, keyInputState)
         }
     }
 
@@ -163,7 +150,8 @@
     private val TestContext.currentTime
         get() = testOwner.mainClock.currentTime
 
-    private val RootForTest.bounds get() = semanticsOwner.rootSemanticsNode.boundsInRoot
+    private val RootForTest.bounds
+        get() = semanticsOwner.rootSemanticsNode.boundsInRoot
 
     protected fun isWithinRootBounds(position: Offset): Boolean = root.bounds.contains(position)
 
@@ -193,7 +181,7 @@
      *
      * @param pointerId The id of the pointer for which to return the current position
      * @return The current position of the pointer with the given [pointerId], or `null` if the
-     * pointer is not currently in use
+     *   pointer is not currently in use
      */
     fun getCurrentTouchPosition(pointerId: Int): Offset? {
         return partialGesture?.lastPositions?.get(pointerId)
@@ -203,7 +191,8 @@
      * The current position of the mouse. If no mouse event has been sent yet, will be
      * [Offset.Zero].
      */
-    val currentMousePosition: Offset get() = mouseInputState.lastPosition
+    val currentMousePosition: Offset
+        get() = mouseInputState.lastPosition
 
     /**
      * Indicates if the given [key] is pressed down or not.
@@ -214,14 +203,12 @@
     fun isKeyDown(key: Key): Boolean = keyInputState.isKeyDown(key)
 
     /**
-     * Generates a down touch event at [position] for the pointer with the given [pointerId].
-     * Starts a new touch gesture if no other [pointerId]s are down. Only possible if the
-     * [pointerId] is not currently being used, although pointer ids may be reused during a touch
-     * gesture.
+     * Generates a down touch event at [position] for the pointer with the given [pointerId]. Starts
+     * a new touch gesture if no other [pointerId]s are down. Only possible if the [pointerId] is
+     * not currently being used, although pointer ids may be reused during a touch gesture.
      *
      * @param pointerId The id of the pointer, can be any number not yet in use by another pointer
      * @param position The coordinate of the down event
-     *
      * @see enqueueTouchMove
      * @see updateTouchPointer
      * @see enqueueTouchUp
@@ -270,9 +257,8 @@
      * @see enqueueTouchMoves
      */
     fun enqueueTouchMove() {
-        val gesture = checkNotNull(partialGesture) {
-            "Cannot send MOVE event, no gesture is in progress"
-        }
+        val gesture =
+            checkNotNull(partialGesture) { "Cannot send MOVE event, no gesture is in progress" }
         gesture.enqueueMove()
         gesture.hasPointerUpdates = false
     }
@@ -289,24 +275,22 @@
         relativeHistoricalTimes: List<Long>,
         historicalCoordinates: List<List<Offset>>
     ) {
-        val gesture = checkNotNull(partialGesture) {
-            "Cannot send MOVE event, no gesture is in progress"
-        }
+        val gesture =
+            checkNotNull(partialGesture) { "Cannot send MOVE event, no gesture is in progress" }
         gesture.enqueueMoves(relativeHistoricalTimes, historicalCoordinates)
         gesture.hasPointerUpdates = false
     }
 
     /**
-     * Updates the position of the touch pointer with the given [pointerId] to the given
-     * [position], but does not generate a move touch event. Use this to move multiple pointers
-     * simultaneously. To generate the next move touch event, which will contain the current
-     * position of _all_ pointers (not just the moved ones), call [enqueueTouchMove]. If you move
-     * one or more pointers and then call [enqueueTouchDown], without calling [enqueueTouchMove]
-     * first, a move event will be generated right before that down event.
+     * Updates the position of the touch pointer with the given [pointerId] to the given [position],
+     * but does not generate a move touch event. Use this to move multiple pointers simultaneously.
+     * To generate the next move touch event, which will contain the current position of _all_
+     * pointers (not just the moved ones), call [enqueueTouchMove]. If you move one or more pointers
+     * and then call [enqueueTouchDown], without calling [enqueueTouchMove] first, a move event will
+     * be generated right before that down event.
      *
      * @param pointerId The id of the pointer to move, as supplied in [enqueueTouchDown]
      * @param position The position to move the pointer to
-     *
      * @see enqueueTouchDown
      * @see enqueueTouchMove
      * @see enqueueTouchUp
@@ -316,9 +300,7 @@
         val gesture = partialGesture
 
         // Check if this pointer is in the gesture
-        check(gesture != null) {
-            "Cannot move pointers, no gesture is in progress"
-        }
+        check(gesture != null) { "Cannot move pointers, no gesture is in progress" }
         require(gesture.lastPositions.containsKey(pointerId)) {
             "Cannot move pointer $pointerId, it is not active in the current gesture"
         }
@@ -332,7 +314,6 @@
      * pointer.
      *
      * @param pointerId The id of the pointer to lift up, as supplied in [enqueueTouchDown]
-     *
      * @see enqueueTouchDown
      * @see updateTouchPointer
      * @see enqueueTouchMove
@@ -342,9 +323,7 @@
         val gesture = partialGesture
 
         // Check if this pointer is in the gesture
-        check(gesture != null) {
-            "Cannot send UP event, no gesture is in progress"
-        }
+        check(gesture != null) { "Cannot send UP event, no gesture is in progress" }
         require(gesture.lastPositions.containsKey(pointerId)) {
             "Cannot send UP event for pointer $pointerId, it is not active in the current gesture"
         }
@@ -360,8 +339,8 @@
     }
 
     /**
-     * Generates a cancel touch event for the current touch gesture. Sent automatically when
-     * mouse events are sent while a touch gesture is in progress.
+     * Generates a cancel touch event for the current touch gesture. Sent automatically when mouse
+     * events are sent while a touch gesture is in progress.
      *
      * @see enqueueTouchDown
      * @see updateTouchPointer
@@ -369,9 +348,8 @@
      * @see enqueueTouchUp
      */
     fun enqueueTouchCancel() {
-        val gesture = checkNotNull(partialGesture) {
-            "Cannot send CANCEL event, no gesture is in progress"
-        }
+        val gesture =
+            checkNotNull(partialGesture) { "Cannot send CANCEL event, no gesture is in progress" }
         gesture.enqueueCancel()
         partialGesture = null
     }
@@ -392,7 +370,7 @@
      * pressed and an optional hover exit event.
      *
      * @param buttonId The id of the mouse button. This is platform dependent, use the values
-     * defined by [MouseButton.buttonId].
+     *   defined by [MouseButton.buttonId].
      */
     fun enqueueMousePress(buttonId: Int) {
         val mouse = mouseInputState
@@ -423,8 +401,8 @@
     }
 
     /**
-     * Generates a mouse move or hover event to the given [position]. If buttons are pressed, a
-     * move event is generated, otherwise generates a hover event.
+     * Generates a mouse move or hover event to the given [position]. If buttons are pressed, a move
+     * event is generated, otherwise generates a hover event.
      *
      * @param position The new mouse position
      */
@@ -450,8 +428,8 @@
     }
 
     /**
-     * Updates the mouse position without sending an event. Useful if down, up or scroll events
-     * need to be injected on a different location than the preceding move event.
+     * Updates the mouse position without sending an event. Useful if down, up or scroll events need
+     * to be injected on a different location than the preceding move event.
      *
      * @param position The new mouse position
      */
@@ -467,7 +445,7 @@
      * button being released.
      *
      * @param buttonId The id of the mouse button. This is platform dependent, use the values
-     * defined by [MouseButton.buttonId].
+     *   defined by [MouseButton.buttonId].
      */
     fun enqueueMouseRelease(buttonId: Int) {
         val mouse = mouseInputState
@@ -497,9 +475,7 @@
     fun enqueueMouseEnter(position: Offset) {
         val mouse = mouseInputState
 
-        check(!mouse.isEntered) {
-            "Cannot send mouse hover enter event, mouse is already hovering"
-        }
+        check(!mouse.isEntered) { "Cannot send mouse hover enter event, mouse is already hovering" }
         check(mouse.hasNoButtonsPressed) {
             "Cannot send mouse hover enter event, mouse buttons are down"
         }
@@ -519,17 +495,15 @@
     fun enqueueMouseExit(position: Offset) {
         val mouse = mouseInputState
 
-        check(mouse.isEntered) {
-            "Cannot send mouse hover exit event, mouse is not hovering"
-        }
+        check(mouse.isEntered) { "Cannot send mouse hover exit event, mouse is not hovering" }
 
         updateMousePosition(position)
         mouse.exitHover()
     }
 
     /**
-     * Generates a mouse cancel event. Can only be done if no mouse buttons are currently
-     * pressed. Sent automatically if a touch event is sent while mouse buttons are down.
+     * Generates a mouse cancel event. Can only be done if no mouse buttons are currently pressed.
+     * Sent automatically if a touch event is sent while mouse buttons are down.
      */
     fun enqueueMouseCancel() {
         val mouse = mouseInputState
@@ -543,9 +517,9 @@
     /**
      * Generates a scroll event on [scrollWheel] by [delta].
      *
-     * Positive [delta] values correspond to scrolling forward (new content appears at the bottom
-     * of a column, or at the end of a row), negative values correspond to scrolling backward
-     * (new content appears at the top of a column, or at the start of a row).
+     * Positive [delta] values correspond to scrolling forward (new content appears at the bottom of
+     * a column, or at the end of a row), negative values correspond to scrolling backward (new
+     * content appears at the top of a column, or at the start of a row).
      */
     @OptIn(ExperimentalTestApi::class)
     fun enqueueMouseScroll(delta: Float, scrollWheel: ScrollWheel) {
@@ -637,9 +611,7 @@
         // Initial repeat
         if (lastRepeatTime <= downTime) {
             // Not yet had a repeat on this key, but it needs at least the initial one.
-            check(repeatCount == 0) {
-                "repeatCount should be reset to 0 when downTime updates"
-            }
+            check(repeatCount == 0) { "repeatCount should be reset to 0 when downTime updates" }
             repeatCount = 1
 
             lastRepeatTime = downTime + InitialRepeatDelay
@@ -660,19 +632,20 @@
     }
 
     /**
-     * Enqueues a key down event on the repeat key, if there is one. If the repeat key is null,
-     * an [IllegalStateException] is thrown.
+     * Enqueues a key down event on the repeat key, if there is one. If the repeat key is null, an
+     * [IllegalStateException] is thrown.
      */
     private fun KeyInputState.enqueueRepeat() {
-        val repKey = checkNotNull(repeatKey) {
-            "A repeat key event cannot be sent if the repeat key is null."
-        }
+        val repKey =
+            checkNotNull(repeatKey) {
+                "A repeat key event cannot be sent if the repeat key is null."
+            }
         keyInputState.enqueueDown(repKey)
     }
 
     /**
-     * Sends all enqueued events and blocks while they are dispatched. If an exception is
-     * thrown during the process, all events that haven't yet been dispatched will be dropped.
+     * Sends all enqueued events and blocks while they are dispatched. If an exception is thrown
+     * during the process, all events that haven't yet been dispatched will be dropped.
      */
     abstract fun flush()
 
@@ -750,15 +723,15 @@
     }
 
     /**
-     * Override this method to take platform specific action when this dispatcher is disposed.
-     * E.g. to recycle event objects that the dispatcher still holds on to.
+     * Override this method to take platform specific action when this dispatcher is disposed. E.g.
+     * to recycle event objects that the dispatcher still holds on to.
      */
     protected open fun onDispose() {}
 }
 
 /**
- * The state of the current gesture. Contains the current position of all pointers and the
- * down time (start time) of the gesture. For the current time, see [InputDispatcher.currentTime].
+ * The state of the current gesture. Contains the current position of all pointers and the down time
+ * (start time) of the gesture. For the current time, see [InputDispatcher.currentTime].
  *
  * @param downTime The time of the first down event of this gesture
  * @param startPosition The position of the first down event of this gesture
@@ -770,9 +743,9 @@
 }
 
 /**
- * The current mouse state. Contains the current mouse position, which buttons are pressed, if it
- * is hovering over the current node and the down time of the mouse (which is the time of the
- * last mouse down event).
+ * The current mouse state. Contains the current mouse position, which buttons are pressed, if it is
+ * hovering over the current node and the down time of the mouse (which is the time of the last
+ * mouse down event).
  */
 internal class MouseInputState {
     var downTime: Long = 0
@@ -780,9 +753,14 @@
     var lastPosition: Offset = Offset.Zero
     var isEntered: Boolean = false
 
-    val hasAnyButtonPressed get() = pressedButtons.isNotEmpty()
-    val hasOneButtonPressed get() = pressedButtons.size == 1
-    val hasNoButtonsPressed get() = pressedButtons.isEmpty()
+    val hasAnyButtonPressed
+        get() = pressedButtons.isNotEmpty()
+
+    val hasOneButtonPressed
+        get() = pressedButtons.size == 1
+
+    val hasNoButtonsPressed
+        get() = pressedButtons.isEmpty()
 
     fun isButtonPressed(buttonId: Int): Boolean {
         return pressedButtons.contains(buttonId)
@@ -806,17 +784,16 @@
  *
  * Note that lock keys may not be toggled in the same way across all platforms.
  *
- * Take caps lock as an example; consistently, all platforms turn caps lock on upon the first
- * key down event, and it stays on after the subsequent key up. However, on some platforms caps
- * lock will turn off immediately upon the next key down event (MacOS for example), whereas
- * other platforms (e.g. Linux, Android) wait for the next key up event before turning caps
- * lock off.
+ * Take caps lock as an example; consistently, all platforms turn caps lock on upon the first key
+ * down event, and it stays on after the subsequent key up. However, on some platforms caps lock
+ * will turn off immediately upon the next key down event (MacOS for example), whereas other
+ * platforms (e.g. Linux, Android) wait for the next key up event before turning caps lock off.
  *
  * This enum breaks the lock key state down into four possible options - depending upon the
  * interpretation of these four states, Android-like or MacOS-like behaviour can both be achieved.
  *
- * To get Android-like behaviour, use [isLockKeyOnIncludingOffPress],
- * whereas for MacOS-style behaviour, use [isLockKeyOnExcludingOffPress].
+ * To get Android-like behaviour, use [isLockKeyOnIncludingOffPress], whereas for MacOS-style
+ * behaviour, use [isLockKeyOnExcludingOffPress].
  */
 internal enum class LockKeyState(val state: Int) {
     UP_AND_OFF(0),
@@ -825,22 +802,22 @@
     DOWN_AND_OPTIONAL(3);
 
     /**
-     * Whether or not the lock key is on. The lock key is considered on from the start of the
-     * "on press" until the end of the "off press", i.e. from the first key down event to the
-     * second key up event of the corresponding lock key.
+     * Whether or not the lock key is on. The lock key is considered on from the start of the "on
+     * press" until the end of the "off press", i.e. from the first key down event to the second key
+     * up event of the corresponding lock key.
      */
-    val isLockKeyOnIncludingOffPress get() = state > 0
+    val isLockKeyOnIncludingOffPress
+        get() = state > 0
 
     /**
-     * Whether or not the lock key is on. The lock key is considered on from the start of the
-     * "on press" until the start of the "off press", i.e. from the first key down event to the
-     * second key down event of the corresponding lock key.
+     * Whether or not the lock key is on. The lock key is considered on from the start of the "on
+     * press" until the start of the "off press", i.e. from the first key down event to the second
+     * key down event of the corresponding lock key.
      */
-    val isLockKeyOnExcludingOffPress get() = this == DOWN_AND_ON || this == UP_AND_ON
+    val isLockKeyOnExcludingOffPress
+        get() = this == DOWN_AND_ON || this == UP_AND_ON
 
-    /**
-     * Returns the next state in the cycle of lock key states.
-     */
+    /** Returns the next state in the cycle of lock key states. */
     fun next(): LockKeyState {
         return when (this) {
             UP_AND_OFF -> DOWN_AND_ON
@@ -852,9 +829,8 @@
 }
 
 /**
- * The current key input state. Contains the keys that are pressed, the down time of the
- * keyboard (which is the time of the last key down event), the state of the lock keys and
- * the device ID.
+ * The current key input state. Contains the keys that are pressed, the down time of the keyboard
+ * (which is the time of the last key down event), the state of the lock keys and the device ID.
  */
 internal class KeyInputState {
     private val downKeys: HashSet<Key> = hashSetOf()
@@ -885,9 +861,7 @@
         updateLockKeys(key)
     }
 
-    /**
-     * Updates lock key state values.
-     */
+    /** Updates lock key state values. */
     private fun updateLockKeys(key: Key) {
         when (key) {
             Key.CapsLock -> capsLockState = capsLockState.next()
@@ -904,11 +878,11 @@
 internal class RotaryInputState
 
 /**
- * The state of an [InputDispatcher], saved when the [GestureScope] is disposed and restored
- * when the [GestureScope] is recreated.
+ * The state of an [InputDispatcher], saved when the [GestureScope] is disposed and restored when
+ * the [GestureScope] is recreated.
  *
- * @param partialGesture The state of an incomplete gesture. If no gesture was in progress
- * when the state of the [InputDispatcher] was saved, this will be `null`.
+ * @param partialGesture The state of an incomplete gesture. If no gesture was in progress when the
+ *   state of the [InputDispatcher] was saved, this will be `null`.
  * @param mouseInputState The state of the mouse.
  * @param keyInputState The state of the keyboard.
  */
diff --git a/compose/ui/ui-test/src/commonMain/kotlin/androidx/compose/ui/test/KeyInjectionScope.kt b/compose/ui/ui-test/src/commonMain/kotlin/androidx/compose/ui/test/KeyInjectionScope.kt
index 02efdb9..09b5aad 100644
--- a/compose/ui/ui-test/src/commonMain/kotlin/androidx/compose/ui/test/KeyInjectionScope.kt
+++ b/compose/ui/ui-test/src/commonMain/kotlin/androidx/compose/ui/test/KeyInjectionScope.kt
@@ -19,14 +19,10 @@
 import androidx.compose.ui.input.key.Key
 import androidx.compose.ui.test.internal.JvmDefaultWithCompatibility
 
-/**
- * Default duration of a key press in milliseconds (duration between key down and key up).
- */
+/** Default duration of a key press in milliseconds (duration between key down and key up). */
 private const val DefaultKeyPressDurationMillis = 50L
 
-/**
- * Default duration of the pause between sequential key presses in milliseconds.
- */
+/** Default duration of the pause between sequential key presses in milliseconds. */
 private const val DefaultPauseDurationBetweenKeyPressesMillis = 50L
 
 /**
@@ -37,12 +33,12 @@
  * built on top of these two methods in order to improve test code readability/maintainability and
  * decrease development time.
  *
- * The entire event injection state is shared between all `perform.*Input` methods, meaning you
- * can continue an unfinished key input sequence in a subsequent invocation of [performKeyInput]
- * or [performMultiModalInput].
+ * The entire event injection state is shared between all `perform.*Input` methods, meaning you can
+ * continue an unfinished key input sequence in a subsequent invocation of [performKeyInput] or
+ * [performMultiModalInput].
  *
- * All events sent by these methods are batched together and sent as a whole after
- * [performKeyInput] has executed its code block.
+ * All events sent by these methods are batched together and sent as a whole after [performKeyInput]
+ * has executed its code block.
  *
  * When a key is held down - i.e. the virtual clock is forwarded whilst the key is pressed down,
  * repeat key down events will be sent. In a fashion consistent with Android's implementation, the
@@ -109,14 +105,19 @@
     fun isKeyDown(key: Key): Boolean
 }
 
-internal class KeyInjectionScopeImpl(
-    private val baseScope: MultiModalInjectionScopeImpl
-) : KeyInjectionScope, InjectionScope by baseScope {
-    private val inputDispatcher get() = baseScope.inputDispatcher
+internal class KeyInjectionScopeImpl(private val baseScope: MultiModalInjectionScopeImpl) :
+    KeyInjectionScope, InjectionScope by baseScope {
+    private val inputDispatcher
+        get() = baseScope.inputDispatcher
 
-    override val isCapsLockOn: Boolean get() = inputDispatcher.isCapsLockOn
-    override val isNumLockOn: Boolean get() = inputDispatcher.isNumLockOn
-    override val isScrollLockOn: Boolean get() = inputDispatcher.isScrollLockOn
+    override val isCapsLockOn: Boolean
+        get() = inputDispatcher.isCapsLockOn
+
+    override val isNumLockOn: Boolean
+        get() = inputDispatcher.isNumLockOn
+
+    override val isScrollLockOn: Boolean
+        get() = inputDispatcher.isScrollLockOn
 
     // TODO(b/233186704) Find out why KeyEvents not registered when injected together in batches.
     override fun keyDown(key: Key) {
@@ -151,8 +152,8 @@
 }
 
 /**
- * Executes the keyboard sequence specified in the given [block], whilst holding down the
- * given [key]. This key must not be used within the [block].
+ * Executes the keyboard sequence specified in the given [block], whilst holding down the given
+ * [key]. This key must not be used within the [block].
  *
  * If the given [key] is already down, an [IllegalStateException] will be thrown.
  *
@@ -170,8 +171,8 @@
 
 /**
  * Executes the keyboard sequence specified in the given [block], whilst holding down the each of
- * the given [keys]. Each of the [keys] will be pressed down and released simultaneously.
- * These keys must not be used within the [block].
+ * the given [keys]. Each of the [keys] will be pressed down and released simultaneously. These keys
+ * must not be used within the [block].
  *
  * If any of the given [keys] are already down, an [IllegalStateException] will be thrown.
  *
@@ -189,9 +190,9 @@
 }
 
 /**
- * Executes the keyboard sequence specified in the given [block], in between presses to the
- * given [key]. This key can also be used within the [block], as long as it is not down at the end
- * of the block.
+ * Executes the keyboard sequence specified in the given [block], in between presses to the given
+ * [key]. This key can also be used within the [block], as long as it is not down at the end of the
+ * block.
  *
  * If the given [key] is already down, an [IllegalStateException] will be thrown.
  *
@@ -208,9 +209,9 @@
 }
 
 /**
- * Executes the keyboard sequence specified in the given [block], in between presses to the
- * given [keys]. Each of the [keys] will be toggled simultaneously.These keys can also be used
- * within the [block], as long as they are not down at the end of the block.
+ * Executes the keyboard sequence specified in the given [block], in between presses to the given
+ * [keys]. Each of the [keys] will be toggled simultaneously.These keys can also be used within the
+ * [block], as long as they are not down at the end of the block.
  *
  * If any of the given [keys] are already down, an [IllegalStateException] will be thrown.
  *
diff --git a/compose/ui/ui-test/src/commonMain/kotlin/androidx/compose/ui/test/MainTestClock.kt b/compose/ui/ui-test/src/commonMain/kotlin/androidx/compose/ui/test/MainTestClock.kt
index 8e8f17d..7b1de3e 100644
--- a/compose/ui/ui-test/src/commonMain/kotlin/androidx/compose/ui/test/MainTestClock.kt
+++ b/compose/ui/ui-test/src/commonMain/kotlin/androidx/compose/ui/test/MainTestClock.kt
@@ -23,18 +23,18 @@
 import androidx.compose.ui.test.internal.JvmDefaultWithCompatibility
 
 /**
- * The clock that drives [frames][MonotonicFrameClock.withFrameNanos],
- * [recompositions][Recomposer] and [launched effects][LaunchedEffect] in compose tests.
+ * The clock that drives [frames][MonotonicFrameClock.withFrameNanos], [recompositions][Recomposer]
+ * and [launched effects][LaunchedEffect] in compose tests.
  *
  * This clock is ultimately responsible for driving all recompositions, all subscribers to
- * [withFrameNanos][MonotonicFrameClock.withFrameNanos] (all compose animations) and all
- * coroutines launched with [LaunchedEffect][LaunchedEffect] (for example gesture detection). It
- * is important to realize that if this clock does not tick, recomposition will not happen and
- * animations are frozen. Equally important to realize is that measure, layout and draw passes are
- * _not_ driven by this clock. Instead, they are driven by the event loop of the platform, for
- * example the Choreographer on Android. That means that forwarding this clock will _not_
- * perform a measure, layout or draw pass, and vice versa, when this clock is paused measure,
- * layout and draw passes can still occur.
+ * [withFrameNanos][MonotonicFrameClock.withFrameNanos] (all compose animations) and all coroutines
+ * launched with [LaunchedEffect][LaunchedEffect] (for example gesture detection). It is important
+ * to realize that if this clock does not tick, recomposition will not happen and animations are
+ * frozen. Equally important to realize is that measure, layout and draw passes are _not_ driven by
+ * this clock. Instead, they are driven by the event loop of the platform, for example the
+ * Choreographer on Android. That means that forwarding this clock will _not_ perform a measure,
+ * layout or draw pass, and vice versa, when this clock is paused measure, layout and draw passes
+ * can still occur.
  *
  * Therefore, when setting [autoAdvance] to `false` and taking control over this clock, there are
  * several things to realize:
@@ -43,108 +43,101 @@
  * * Callers of [withFrameNanos][MonotonicFrameClock.withFrameNanos] can only get a frame time when
  *   a frame is produced by this clock.
  * * If there is both a pending recomposition and an animation awaiting a
- *   [frame time][MonotonicFrameClock.withFrameNanos], ticking this clock will _first_ send the
- *   new frame time to the animation, and _then_ perform recomposition. Any state changes made by
- *   the animation will be seen by the recomposition.
+ *   [frame time][MonotonicFrameClock.withFrameNanos], ticking this clock will _first_ send the new
+ *   frame time to the animation, and _then_ perform recomposition. Any state changes made by the
+ *   animation will be seen by the recomposition.
  * * Because animations receive their [frame time][MonotonicFrameClock.withFrameNanos] _before_
- *   recomposition, an animation will not get its start time in the first frame after kicking it
- *   off by toggling a state variable. For example, with a frame time of 16ms; when you call
- *   [advanceTimeBy(32)][advanceTimeBy] after you toggled a state variable to kick off an
- *   animation, the animation's play time will still be at 0ms.
- *   The first frame is produced when the clock has advanced 16ms and will run a recomposition.
- *   During that recomposition the animation will be scheduled to start. When the clock has
- *   advanced another 16ms, the animation gets its first frame time and initialize the play time
- *   to `t=0`.
+ *   recomposition, an animation will not get its start time in the first frame after kicking it off
+ *   by toggling a state variable. For example, with a frame time of 16ms; when you call
+ *   [advanceTimeBy(32)][advanceTimeBy] after you toggled a state variable to kick off an animation,
+ *   the animation's play time will still be at 0ms. The first frame is produced when the clock has
+ *   advanced 16ms and will run a recomposition. During that recomposition the animation will be
+ *   scheduled to start. When the clock has advanced another 16ms, the animation gets its first
+ *   frame time and initialize the play time to `t=0`.
  * * Because animations request the next [frame][MonotonicFrameClock.withFrameNanos] during the
  *   current frame, calling [advanceTimeBy(160)][advanceTimeBy] while an animation is running will
  *   produce 10 frames of 16ms rather than 1 frame of 160ms (assuming a frame time of 16ms).
  *   Measure, layout and draw will not happen in between these frames. Be aware that some
- *   animations, like a slideIn or slideOut animation, are set up during a layout pass. If you
- *   start such an animation and advance time by two frames or more without allowing for a layout
- *   pass to happen, it will end immediately because it will be started before it is set up. For
- *   example, here you see how you can control a slide out animation:
+ *   animations, like a slideIn or slideOut animation, are set up during a layout pass. If you start
+ *   such an animation and advance time by two frames or more without allowing for a layout pass to
+ *   happen, it will end immediately because it will be started before it is set up. For example,
+ *   here you see how you can control a slide out animation:
  *
  * @sample androidx.compose.ui.test.samples.testSlideOut
- *
- * * After modifying a state variable, recomposition needs to happen to reflect the new state in
- *   the UI. Advancing the clock by [one frame][advanceTimeByFrame] will commit the changes and
- *   run exactly one recomposition.
- * * If, after any call to [advanceTimeBy], you want to assert anything related to layout
- *   positions (e.g. [assertWidthIsEqualTo]) or rendering (e.g. [captureToImage]), you will need a
- *   call to [waitForIdle][androidx.compose.ui.test.junit4.ComposeTestRule.waitForIdle] or
+ * * After modifying a state variable, recomposition needs to happen to reflect the new state in the
+ *   UI. Advancing the clock by [one frame][advanceTimeByFrame] will commit the changes and run
+ *   exactly one recomposition.
+ * * If, after any call to [advanceTimeBy], you want to assert anything related to layout positions
+ *   (e.g. [assertWidthIsEqualTo]) or rendering (e.g. [captureToImage]), you will need a call to
+ *   [waitForIdle][androidx.compose.ui.test.junit4.ComposeTestRule.waitForIdle] or
  *   [runOnIdle][androidx.compose.ui.test.junit4.ComposeTestRule.runOnIdle] to make sure that any
  *   triggered measure, layout or draw pass has been completed.
  * * If you change a state variable that is not read during composition, but for example during
  *   layout or draw, calling [advanceTimeBy] will not produce the desired update to the UI. Use
  *   [waitForIdle][androidx.compose.ui.test.junit4.ComposeTestRule.waitForIdle] for such cases.
- * * [delayed][kotlinx.coroutines.delay] [LaunchedEffect]s are resumed on their scheduled time.
- *   That means that code like `repeat(2) { delay(1000) }` will complete with a single call to
+ * * [delayed][kotlinx.coroutines.delay] [LaunchedEffect]s are resumed on their scheduled time. That
+ *   means that code like `repeat(2) { delay(1000) }` will complete with a single call to
  *   [advanceTimeBy(2000)][advanceTimeBy].
  * * After modifying a state variable, the modified [snapshot][Snapshot] must be
  *   [committed][Snapshot.sendApplyNotifications] before the compositions that read that variable
  *   are invalidated. This is currently not done by the test harness, but by a platform dependent
  *   implementation. On Android, for example, a message is posted on the main thread to call
  *   `sendApplyNotifications` when a state variable is written (which conveniently runs before
- *   `advanceTimeByFrame` on Android), which means that if the variable is written during a call
- *   to [advanceTimeBy], the composition will only be invalidated after `advanceTimeBy` has
- *   finished, regardless of the time by which you advanced the clock. You may call
- *   `sendApplyNotifications` manually after modifying a state variable to invalidate the
- *   composition and force a recomposition within 16ms of the current clock time. For example,
- *   here you see how to use `sendApplyNotifications` and `advanceTimeBy`:
+ *   `advanceTimeByFrame` on Android), which means that if the variable is written during a call to
+ *   [advanceTimeBy], the composition will only be invalidated after `advanceTimeBy` has finished,
+ *   regardless of the time by which you advanced the clock. You may call `sendApplyNotifications`
+ *   manually after modifying a state variable to invalidate the composition and force a
+ *   recomposition within 16ms of the current clock time. For example, here you see how to use
+ *   `sendApplyNotifications` and `advanceTimeBy`:
  *
  * @sample androidx.compose.ui.test.samples.testControlClock
  */
 @JvmDefaultWithCompatibility
 interface MainTestClock {
-    /**
-     * The current time of this clock in milliseconds.
-     */
+    /** The current time of this clock in milliseconds. */
     val currentTime: Long
 
     /**
      * Whether the clock should be advanced by the testing framework while awaiting idleness in
      * order to process any pending work that is driven by this clock. This ensures that when the
-     * app is [idle][androidx.compose.ui.test.junit4.ComposeTestRule.waitForIdle], there are no
-     * more pending recompositions or ongoing animations.
+     * app is [idle][androidx.compose.ui.test.junit4.ComposeTestRule.waitForIdle], there are no more
+     * pending recompositions or ongoing animations.
      *
      * If [autoAdvance] is false, the clock is not advanced while awaiting idleness. Moreover,
      * having pending recompositions or animations is not taken as a sign of pending work
      * (non-idleness) when awaiting idleness, as waiting for a longer time will not make them
-     * happen. Note that pending measure, layout or draw passes will still be awaited when
-     * awaiting idleness and having [autoAdvance] set to false, as those passes are not driven
-     * by this clock.
+     * happen. Note that pending measure, layout or draw passes will still be awaited when awaiting
+     * idleness and having [autoAdvance] set to false, as those passes are not driven by this clock.
      *
      * By default this is true.
      */
     var autoAdvance: Boolean
 
-    /**
-     * [Advances][advanceTimeBy] the main clock by the duration of one frame.
-     */
+    /** [Advances][advanceTimeBy] the main clock by the duration of one frame. */
     fun advanceTimeByFrame()
 
     /**
      * Advances the clock by the given [duration][milliseconds]. The duration is rounded up to the
-     * nearest multiple of the frame duration by default to always produce the same number of
-     * frames regardless of the current time of the clock. Use [ignoreFrameDuration] to disable
-     * this behavior. The frame duration is platform dependent. For example, on a JVM (Android and
+     * nearest multiple of the frame duration by default to always produce the same number of frames
+     * regardless of the current time of the clock. Use [ignoreFrameDuration] to disable this
+     * behavior. The frame duration is platform dependent. For example, on a JVM (Android and
      * Desktop) it is 16ms. Note that if [ignoreFrameDuration] is true, the last few milliseconds
      * that are advanced might not be observed by anyone, since most processes are only triggered
      * when a frame is produced.
      *
      * When using this method to advance the time by several frames in one invocation, measure,
-     * layout and draw passes will not happen in between the produced frames. Multiple frames are
-     * in general only produced when an animation is running. See [MainTestClock] for a more in
-     * depth explanation of the behavior of your test when controlling the clock.
+     * layout and draw passes will not happen in between the produced frames. Multiple frames are in
+     * general only produced when an animation is running. See [MainTestClock] for a more in depth
+     * explanation of the behavior of your test when controlling the clock.
      *
      * It is recommended to set [autoAdvance] to false when using this method, but it is not
      * strictly necessary. When [autoAdvance] is true, using this method may or may not speed up
      * your test.
      *
-     * @param milliseconds The minimal duration to advance the main clock by. Will be rounded up
-     * to the nearest frame duration, unless [ignoreFrameDuration] is `true`.
+     * @param milliseconds The minimal duration to advance the main clock by. Will be rounded up to
+     *   the nearest frame duration, unless [ignoreFrameDuration] is `true`.
      * @param ignoreFrameDuration Whether to avoid rounding up the [milliseconds] to the nearest
-     * multiple of the frame duration. `false` by default.
+     *   multiple of the frame duration. `false` by default.
      */
     fun advanceTimeBy(milliseconds: Long, ignoreFrameDuration: Boolean = false)
 
@@ -153,22 +146,19 @@
      * [condition] is satisfied.
      *
      * Note that the condition should only rely on things that are driven by this clock. Measure,
-     * layout and draw passes will not happen in between advancements of the clock while waiting
-     * for the condition to become true. If your condition relies on the result of measure, layout
-     * or draw, use [waitUntil][androidx.compose.ui.test.junit4.ComposeTestRule.waitUntil] instead.
+     * layout and draw passes will not happen in between advancements of the clock while waiting for
+     * the condition to become true. If your condition relies on the result of measure, layout or
+     * draw, use [waitUntil][androidx.compose.ui.test.junit4.ComposeTestRule.waitUntil] instead.
      *
-     * See [MainTestClock] for a thorough explanation of what is and what isn't going to happen as
-     * a result of a call to `advanceTimeBy`.
+     * See [MainTestClock] for a thorough explanation of what is and what isn't going to happen as a
+     * result of a call to `advanceTimeBy`.
      *
      * @param timeoutMillis The time after which this method throws an exception if the given
-     * condition is not satisfied. This is the simulated time not the wall clock or cpu time.
-     *
+     *   condition is not satisfied. This is the simulated time not the wall clock or cpu time.
      * @throws ComposeTimeoutException the condition is not satisfied after [timeoutMillis].
      */
     fun advanceTimeUntil(timeoutMillis: Long = 1_000, condition: () -> Boolean)
 }
 
-/**
- * Thrown in cases where Compose test can't satisfy a condition in a defined time limit.
- */
+/** Thrown in cases where Compose test can't satisfy a condition in a defined time limit. */
 class ComposeTimeoutException(message: String?) : Throwable(message)
diff --git a/compose/ui/ui-test/src/commonMain/kotlin/androidx/compose/ui/test/Mouse.kt b/compose/ui/ui-test/src/commonMain/kotlin/androidx/compose/ui/test/Mouse.kt
index 7047c35..3315932 100644
--- a/compose/ui/ui-test/src/commonMain/kotlin/androidx/compose/ui/test/Mouse.kt
+++ b/compose/ui/ui-test/src/commonMain/kotlin/androidx/compose/ui/test/Mouse.kt
@@ -17,9 +17,9 @@
 package androidx.compose.ui.test
 
 /**
- * Representation of a mouse scroll wheel axis. Only [Horizontal] and [Vertical] are supported.
- * All methods that accept a scroll axis use [Vertical] as the default, since most mice only have
- * a vertical scroll wheel.
+ * Representation of a mouse scroll wheel axis. Only [Horizontal] and [Vertical] are supported. All
+ * methods that accept a scroll axis use [Vertical] as the default, since most mice only have a
+ * vertical scroll wheel.
  */
 @ExperimentalTestApi
 @kotlin.jvm.JvmInline
@@ -31,27 +31,19 @@
     }
 }
 
-/**
- * Representation of a mouse button with its associated [ID][buttonId] for the current platform.
- */
+/** Representation of a mouse button with its associated [ID][buttonId] for the current platform. */
 @ExperimentalTestApi
 @kotlin.jvm.JvmInline
 expect value class MouseButton(val buttonId: Int) {
     @ExperimentalTestApi
     companion object {
-        /**
-         * The primary mouse button. Typically the left mouse button.
-         */
+        /** The primary mouse button. Typically the left mouse button. */
         val Primary: MouseButton
 
-        /**
-         * The secondary mouse button. Typically the right mouse button.
-         */
+        /** The secondary mouse button. Typically the right mouse button. */
         val Secondary: MouseButton
 
-        /**
-         * The tertiary mouse button. Typically the middle mouse button.
-         */
+        /** The tertiary mouse button. Typically the middle mouse button. */
         val Tertiary: MouseButton
     }
 }
diff --git a/compose/ui/ui-test/src/commonMain/kotlin/androidx/compose/ui/test/MouseInjectionScope.kt b/compose/ui/ui-test/src/commonMain/kotlin/androidx/compose/ui/test/MouseInjectionScope.kt
index 5261179..079c385 100644
--- a/compose/ui/ui-test/src/commonMain/kotlin/androidx/compose/ui/test/MouseInjectionScope.kt
+++ b/compose/ui/ui-test/src/commonMain/kotlin/androidx/compose/ui/test/MouseInjectionScope.kt
@@ -30,45 +30,45 @@
  */
 private const val SingleClickDelayMillis = 60L
 
-/**
- * The default duration of mouse gestures with configurable time (e.g. [animateTo]).
- */
+/** The default duration of mouse gestures with configurable time (e.g. [animateTo]). */
 private const val DefaultMouseGestureDurationMillis: Long = 300L
 
 /**
  * The receiver scope of the mouse input injection lambda from [performMouseInput].
  *
- * The functions in [MouseInjectionScope] can roughly be divided into two groups: full gestures
- * and individual mouse events. The individual mouse events are: [press], [moveTo] and friends,
- * [release], [cancel], [scroll] and [advanceEventTime]. Full gestures are all the other
- * functions, like [MouseInjectionScope.click], [MouseInjectionScope.doubleClick],
- * [MouseInjectionScope.animateTo], etc. These are built on top of the individual events and
- * serve as a good example on how you can build your own full gesture functions.
+ * The functions in [MouseInjectionScope] can roughly be divided into two groups: full gestures and
+ * individual mouse events. The individual mouse events are: [press], [moveTo] and friends,
+ * [release], [cancel], [scroll] and [advanceEventTime]. Full gestures are all the other functions,
+ * like [MouseInjectionScope.click], [MouseInjectionScope.doubleClick],
+ * [MouseInjectionScope.animateTo], etc. These are built on top of the individual events and serve
+ * as a good example on how you can build your own full gesture functions.
  *
- * A mouse move event can be sent with [moveTo] and [moveBy]. The mouse position can be updated
- * with [updatePointerTo] and [updatePointerBy], which will not send an event and only update the
+ * A mouse move event can be sent with [moveTo] and [moveBy]. The mouse position can be updated with
+ * [updatePointerTo] and [updatePointerBy], which will not send an event and only update the
  * position internally. This can be useful if you want to send an event that is not a move event
- * with a location other then the current location, but without sending a preceding move event.
- * Use [press] and [release] to send button pressed and button released events. This will also
- * send all other necessary events that keep the stream of mouse events consistent with actual
- * mouse input, such as a hover exit event. A [cancel] event can be sent at any time when at
- * least one button is pressed. Use [scroll] to send a mouse scroll event.
+ * with a location other then the current location, but without sending a preceding move event. Use
+ * [press] and [release] to send button pressed and button released events. This will also send all
+ * other necessary events that keep the stream of mouse events consistent with actual mouse input,
+ * such as a hover exit event. A [cancel] event can be sent at any time when at least one button is
+ * pressed. Use [scroll] to send a mouse scroll event.
  *
- * The entire event injection state is shared between all `perform.*Input` methods, meaning you
- * can continue an unfinished mouse gesture in a subsequent invocation of [performMouseInput] or
+ * The entire event injection state is shared between all `perform.*Input` methods, meaning you can
+ * continue an unfinished mouse gesture in a subsequent invocation of [performMouseInput] or
  * [performMultiModalInput]. Note however that while the mouse's position is retained across
  * invocation of `perform.*Input` methods, it is always manipulated in the current node's local
- * coordinate system. That means that two subsequent invocations of [performMouseInput] on
- * different nodes will report a different [currentPosition], even though it is actually the same
- * position on the screen.
+ * coordinate system. That means that two subsequent invocations of [performMouseInput] on different
+ * nodes will report a different [currentPosition], even though it is actually the same position on
+ * the screen.
  *
  * All events sent by these methods are batched together and sent as a whole after
  * [performMouseInput] has executed its code block.
  *
  * Example of performing a mouse click:
+ *
  * @sample androidx.compose.ui.test.samples.mouseInputClick
  *
  * Example of scrolling the mouse wheel while the mouse button is pressed:
+ *
  * @sample androidx.compose.ui.test.samples.mouseInputScrollWhileDown
  *
  * @see InjectionScope
@@ -77,50 +77,50 @@
 @ExperimentalTestApi
 interface MouseInjectionScope : InjectionScope {
     /**
-     * Returns the current position of the mouse. The position is returned in the local
-     * coordinate system of the node with which we're interacting. (0, 0) is the top left corner
-     * of the node. If none of the move or updatePointer methods have been used yet, the mouse's
-     * position will be (0, 0) in the Compose host's coordinate system, which will be
-     * `-[topLeft]` in the node's local coordinate system.
+     * Returns the current position of the mouse. The position is returned in the local coordinate
+     * system of the node with which we're interacting. (0, 0) is the top left corner of the node.
+     * If none of the move or updatePointer methods have been used yet, the mouse's position will be
+     * (0, 0) in the Compose host's coordinate system, which will be `-[topLeft]` in the node's
+     * local coordinate system.
      */
     val currentPosition: Offset
 
     /**
-     * Sends a move event [delayMillis] after the last sent event on the associated node, with
-     * the position of the mouse updated to [position]. The [position] is in the node's local
-     * coordinate system, where (0, 0) is the top left corner of the node.
+     * Sends a move event [delayMillis] after the last sent event on the associated node, with the
+     * position of the mouse updated to [position]. The [position] is in the node's local coordinate
+     * system, where (0, 0) is the top left corner of the node.
      *
-     * If no mouse buttons are pressed, a hover event will be sent instead of a move event. If
-     * the mouse wasn't hovering yet, a hover enter event is sent as well.
+     * If no mouse buttons are pressed, a hover event will be sent instead of a move event. If the
+     * mouse wasn't hovering yet, a hover enter event is sent as well.
      *
      * @param position The new position of the mouse, in the node's local coordinate system
-     * @param delayMillis The time between the last sent event and this event.
-     * [eventPeriodMillis] by default.
+     * @param delayMillis The time between the last sent event and this event. [eventPeriodMillis]
+     *   by default.
      */
     fun moveTo(position: Offset, delayMillis: Long = eventPeriodMillis)
 
     /**
-     * Sends a move event [delayMillis] after the last sent event on the associated node, with
-     * the position of the mouse moved by the given [delta].
+     * Sends a move event [delayMillis] after the last sent event on the associated node, with the
+     * position of the mouse moved by the given [delta].
      *
-     * If no mouse buttons are pressed, a hover event will be sent instead of a move event. If
-     * the mouse wasn't hovering yet, a hover enter event is sent as well.
+     * If no mouse buttons are pressed, a hover event will be sent instead of a move event. If the
+     * mouse wasn't hovering yet, a hover enter event is sent as well.
      *
-     * @param delta The position for this move event, relative to the current position of the
-     * mouse. For example, `delta = Offset(10.px, -10.px) will add 10.px to the mouse's
-     * x-position, and subtract 10.px from the mouse's y-position.
-     * @param delayMillis The time between the last sent event and this event.
-     * [eventPeriodMillis] by default.
+     * @param delta The position for this move event, relative to the current position of the mouse.
+     *   For example, `delta = Offset(10.px, -10.px) will add 10.px to the mouse's x-position, and
+     *   subtract 10.px from the mouse's y-position.
+     * @param delayMillis The time between the last sent event and this event. [eventPeriodMillis]
+     *   by default.
      */
     fun moveBy(delta: Offset, delayMillis: Long = eventPeriodMillis) {
         moveTo(currentPosition + delta, delayMillis)
     }
 
     /**
-     * Updates the position of the mouse to the given [position], but does not send a move or
-     * hover event. This can be useful to adjust the mouse position before sending for example a
-     * [press] event. The [position] is in the node's local coordinate system, where (0.px, 0.px)
-     * is the top left corner of the node.
+     * Updates the position of the mouse to the given [position], but does not send a move or hover
+     * event. This can be useful to adjust the mouse position before sending for example a [press]
+     * event. The [position] is in the node's local coordinate system, where (0.px, 0.px) is the top
+     * left corner of the node.
      *
      * @param position The new position of the mouse, in the node's local coordinate system
      */
@@ -128,21 +128,21 @@
 
     /**
      * Updates the position of the mouse by the given [delta], but does not send a move or hover
-     * event. This can be useful to adjust the mouse position before sending for example a
-     * [press] event.
+     * event. This can be useful to adjust the mouse position before sending for example a [press]
+     * event.
      *
-     * @param delta The position for this move event, relative to the current position of the
-     * mouse. For example, `delta = Offset(10.px, -10.px) will add 10.px to the mouse's
-     * x-position, and subtract 10.px from the mouse's y-position.
+     * @param delta The position for this move event, relative to the current position of the mouse.
+     *   For example, `delta = Offset(10.px, -10.px) will add 10.px to the mouse's x-position, and
+     *   subtract 10.px from the mouse's y-position.
      */
     fun updatePointerBy(delta: Offset) {
         updatePointerTo(currentPosition + delta)
     }
 
     /**
-     * Sends a down and button pressed event for the given [button] on the associated node. When
-     * no buttons were down yet, this will exit hovering mode before the button is pressed. All
-     * events will be sent at the current event time.
+     * Sends a down and button pressed event for the given [button] on the associated node. When no
+     * buttons were down yet, this will exit hovering mode before the button is pressed. All events
+     * will be sent at the current event time.
      *
      * Throws an [IllegalStateException] if the [button] is already pressed.
      *
@@ -151,10 +151,10 @@
     fun press(button: MouseButton = MouseButton.Primary)
 
     /**
-     * Sends a button released and up event for the given [button] on the associated node. If
-     * this was the last button to be released, the mouse will enter hovering mode and send an
-     * accompanying mouse move event after the button has been released. All events will be sent
-     * at the current event time.
+     * Sends a button released and up event for the given [button] on the associated node. If this
+     * was the last button to be released, the mouse will enter hovering mode and send an
+     * accompanying mouse move event after the button has been released. All events will be sent at
+     * the current event time.
      *
      * Throws an [IllegalStateException] if the [button] is not pressed.
      *
@@ -164,11 +164,11 @@
 
     /**
      * Sends a cancel event [delayMillis] after the last sent event to cancel a stream of mouse
-     * events with pressed mouse buttons. All buttons will be released as a result. A mouse
-     * cancel event can only be sent when mouse buttons are pressed.
+     * events with pressed mouse buttons. All buttons will be released as a result. A mouse cancel
+     * event can only be sent when mouse buttons are pressed.
      *
-     * @param delayMillis The time between the last sent event and this event.
-     * [eventPeriodMillis] by default.
+     * @param delayMillis The time between the last sent event and this event. [eventPeriodMillis]
+     *   by default.
      */
     fun cancel(delayMillis: Long = eventPeriodMillis)
 
@@ -179,19 +179,19 @@
      * An [IllegalStateException] will be thrown when mouse buttons are down, or if the mouse is
      * already hovering.
      *
-     * The [position] is in the node's local coordinate system, where (0, 0) is the top left
-     * corner of the node.
+     * The [position] is in the node's local coordinate system, where (0, 0) is the top left corner
+     * of the node.
      *
-     * __Note__: enter and exit events are already sent as a side effect of [movement][moveTo]
-     * when necessary. Whether or not this is part of the contract of mouse events is platform
-     * dependent, so it is highly discouraged to manually send enter or exit events.
-     * Only use this method for tests that need to make assertions about a component's state
-     * _in between_ the enter/exit and move event.
+     * __Note__: enter and exit events are already sent as a side effect of [movement][moveTo] when
+     * necessary. Whether or not this is part of the contract of mouse events is platform dependent,
+     * so it is highly discouraged to manually send enter or exit events. Only use this method for
+     * tests that need to make assertions about a component's state _in between_ the enter/exit and
+     * move event.
      *
      * @param position The new position of the mouse, in the node's local coordinate system.
-     * [currentPosition] by default.
-     * @param delayMillis The time between the last sent event and this event.
-     * [eventPeriodMillis] by default.
+     *   [currentPosition] by default.
+     * @param delayMillis The time between the last sent event and this event. [eventPeriodMillis]
+     *   by default.
      */
     fun enter(position: Offset = currentPosition, delayMillis: Long = eventPeriodMillis)
 
@@ -201,19 +201,19 @@
      *
      * An [IllegalStateException] will be thrown if the mouse was not hovering.
      *
-     * The [position] is in the node's local coordinate system, where (0, 0) is the top left
-     * corner of the node.
+     * The [position] is in the node's local coordinate system, where (0, 0) is the top left corner
+     * of the node.
      *
-     * __Note__: enter and exit events are already sent as a side effect of [movement][moveTo]
-     * when necessary. Whether or not this is part of the contract of mouse events is platform
-     * dependent, so it is highly discouraged to manually send enter or exit events.
-     * Only use this method for tests that need to make assertions about a component's state
-     * _in between_ the enter/exit and move event.
+     * __Note__: enter and exit events are already sent as a side effect of [movement][moveTo] when
+     * necessary. Whether or not this is part of the contract of mouse events is platform dependent,
+     * so it is highly discouraged to manually send enter or exit events. Only use this method for
+     * tests that need to make assertions about a component's state _in between_ the enter/exit and
+     * move event.
      *
      * @param position The new position of the mouse, in the node's local coordinate system
-     * [currentPosition] by default.
-     * @param delayMillis The time between the last sent event and this event.
-     * [eventPeriodMillis] by default.
+     *   [currentPosition] by default.
+     * @param delayMillis The time between the last sent event and this event. [eventPeriodMillis]
+     *   by default.
      */
     fun exit(position: Offset = currentPosition, delayMillis: Long = eventPeriodMillis)
 
@@ -221,30 +221,32 @@
      * Sends a scroll event with the given [delta] on the given [scrollWheel]. The event will be
      * sent at the current event time.
      *
-     * Positive [delta] values correspond to scrolling forward (new content appears at the bottom
-     * of a column, or at the end of a row), negative values correspond to scrolling backward
-     * (new content appears at the top of a column, or at the start of a row).
+     * Positive [delta] values correspond to scrolling forward (new content appears at the bottom of
+     * a column, or at the end of a row), negative values correspond to scrolling backward (new
+     * content appears at the top of a column, or at the start of a row).
      *
-     * Note that the correlation between scroll [delta] and pixels scrolled is platform
-     * specific. For example, on Android a scroll delta of `1f` corresponds to a scroll
-     * of `64.dp`. However, on any platform, this conversion factor could change in the
-     * future to improve the mouse scroll experience.
+     * Note that the correlation between scroll [delta] and pixels scrolled is platform specific.
+     * For example, on Android a scroll delta of `1f` corresponds to a scroll of `64.dp`. However,
+     * on any platform, this conversion factor could change in the future to improve the mouse
+     * scroll experience.
      *
      * Example of how scroll could be used:
+     *
      * @sample androidx.compose.ui.test.samples.mouseInputScrollWhileDown
      *
      * @param delta The amount of scroll
      * @param scrollWheel Which scroll wheel to rotate. Can be either [ScrollWheel.Vertical] (the
-     * default) or [ScrollWheel.Horizontal].
+     *   default) or [ScrollWheel.Horizontal].
      */
     fun scroll(delta: Float, scrollWheel: ScrollWheel = ScrollWheel.Vertical)
 }
 
 @ExperimentalTestApi
-internal class MouseInjectionScopeImpl(
-    private val baseScope: MultiModalInjectionScopeImpl
-) : MouseInjectionScope, InjectionScope by baseScope {
-    private val inputDispatcher get() = baseScope.inputDispatcher
+internal class MouseInjectionScopeImpl(private val baseScope: MultiModalInjectionScopeImpl) :
+    MouseInjectionScope, InjectionScope by baseScope {
+    private val inputDispatcher
+        get() = baseScope.inputDispatcher
+
     private fun localToRoot(position: Offset) = baseScope.localToRoot(position)
 
     override val currentPosition: Offset
@@ -301,14 +303,14 @@
 
 /**
  * Use [button] to click on [position], or on the current mouse position if [position] is
- * [unspecified][Offset.Unspecified]. The [position] is in the node's local coordinate system,
- * where (0, 0) is the top left corner of the node. The default [button] is the
- * [primary][MouseButton.Primary] button. There is a small 60ms delay between the press and
- * release events to have a realistic simulation.
+ * [unspecified][Offset.Unspecified]. The [position] is in the node's local coordinate system, where
+ * (0, 0) is the top left corner of the node. The default [button] is the
+ * [primary][MouseButton.Primary] button. There is a small 60ms delay between the press and release
+ * events to have a realistic simulation.
  *
- * @param position The position where to click, in the node's local coordinate system. If
- * omitted, the [center] of the node will be used. If [unspecified][Offset.Unspecified], clicks
- * on the current mouse position.
+ * @param position The position where to click, in the node's local coordinate system. If omitted,
+ *   the [center] of the node will be used. If [unspecified][Offset.Unspecified], clicks on the
+ *   current mouse position.
  * @param button The button to click with. Uses the [primary][MouseButton.Primary] by default.
  */
 @ExperimentalTestApi
@@ -326,14 +328,14 @@
 
 /**
  * Secondary-click on [position], or on the current mouse position if [position] is
- * [unspecified][Offset.Unspecified]. While the secondary mouse button is not necessarily the
- * right mouse button (e.g. on left-handed mice), this method is still called `rightClick` for
- * it's widespread use. The [position] is in the node's local coordinate system, where (0, 0) is
- * the top left corner of the node.
+ * [unspecified][Offset.Unspecified]. While the secondary mouse button is not necessarily the right
+ * mouse button (e.g. on left-handed mice), this method is still called `rightClick` for it's
+ * widespread use. The [position] is in the node's local coordinate system, where (0, 0) is the top
+ * left corner of the node.
  *
- * @param position The position where to click, in the node's local coordinate system. If
- * omitted, the [center] of the node will be used. If [unspecified][Offset.Unspecified], clicks
- * on the current mouse position.
+ * @param position The position where to click, in the node's local coordinate system. If omitted,
+ *   the [center] of the node will be used. If [unspecified][Offset.Unspecified], clicks on the
+ *   current mouse position.
  */
 @ExperimentalTestApi
 fun MouseInjectionScope.rightClick(position: Offset = center) =
@@ -353,13 +355,13 @@
 
 /**
  * Use [button] to double-click on [position], or on the current mouse position if [position] is
- * [unspecified][Offset.Unspecified]. The [position] is in the node's local coordinate system,
- * where (0, 0) is the top left corner of the node. The default [button] is the
+ * [unspecified][Offset.Unspecified]. The [position] is in the node's local coordinate system, where
+ * (0, 0) is the top left corner of the node. The default [button] is the
  * [primary][MouseButton.Primary] button.
  *
- * @param position The position where to click, in the node's local coordinate system. If
- * omitted, the [center] of the node will be used. If [unspecified][Offset.Unspecified], clicks
- * on the current mouse position.
+ * @param position The position where to click, in the node's local coordinate system. If omitted,
+ *   the [center] of the node will be used. If [unspecified][Offset.Unspecified], clicks on the
+ *   current mouse position.
  * @param button The button to click with. Uses the [primary][MouseButton.Primary] by default.
  */
 @ExperimentalTestApi
@@ -382,13 +384,13 @@
 
 /**
  * Use [button] to triple-click on [position], or on the current mouse position if [position] is
- * [unspecified][Offset.Unspecified]. The [position] is in the node's local coordinate system,
- * where (0, 0) is the top left corner of the node. The default [button] is the
+ * [unspecified][Offset.Unspecified]. The [position] is in the node's local coordinate system, where
+ * (0, 0) is the top left corner of the node. The default [button] is the
  * [primary][MouseButton.Primary] button.
  *
- * @param position The position where to click, in the node's local coordinate system. If
- * omitted, the [center] of the node will be used. If [unspecified][Offset.Unspecified], clicks
- * on the current mouse position.
+ * @param position The position where to click, in the node's local coordinate system. If omitted,
+ *   the [center] of the node will be used. If [unspecified][Offset.Unspecified], clicks on the
+ *   current mouse position.
  * @param button The button to click with. Uses the [primary][MouseButton.Primary] by default.
  */
 @ExperimentalTestApi
@@ -413,13 +415,13 @@
 
 /**
  * Use [button] to long-click on [position], or on the current mouse position if [position] is
- * [unspecified][Offset.Unspecified]. The [position] is in the node's local coordinate system,
- * where (0, 0) is the top left corner of the node. The default [button] is the
+ * [unspecified][Offset.Unspecified]. The [position] is in the node's local coordinate system, where
+ * (0, 0) is the top left corner of the node. The default [button] is the
  * [primary][MouseButton.Primary] button.
  *
- * @param position The position where to click, in the node's local coordinate system. If
- * omitted, the [center] of the node will be used. If [unspecified][Offset.Unspecified], clicks
- * on the current mouse position.
+ * @param position The position where to click, in the node's local coordinate system. If omitted,
+ *   the [center] of the node will be used. If [unspecified][Offset.Unspecified], clicks on the
+ *   current mouse position.
  * @param button The button to click with. Uses the [primary][MouseButton.Primary] by default.
  */
 @ExperimentalTestApi
@@ -438,11 +440,12 @@
 /**
  * Move the mouse from the [current position][MouseInjectionScope.currentPosition] to the given
  * [position], sending a stream of move events to get an animated path of [durationMillis]
- * milliseconds. [Move][moveTo] the mouse to the desired start position if you want to start from
- * a different position. The [position] is in the node's local coordinate system, where (0, 0) is
- * the top left corner of the node.
+ * milliseconds. [Move][moveTo] the mouse to the desired start position if you want to start from a
+ * different position. The [position] is in the node's local coordinate system, where (0, 0) is the
+ * top left corner of the node.
  *
  * Example of moving the mouse along a line:
+ *
  * @sample androidx.compose.ui.test.samples.mouseInputAnimateTo
  *
  * @param position The position where to move the mouse to, in the node's local coordinate system
@@ -467,8 +470,8 @@
  * milliseconds.
  *
  * @param delta The position where to move the mouse to, relative to the current position of the
- * mouse. For example, `delta = Offset(100.px, -100.px) will move the mouse 100 pixels to the
- * right and 100 pixels upwards.
+ *   mouse. For example, `delta = Offset(100.px, -100.px) will move the mouse 100 pixels to the
+ *   right and 100 pixels upwards.
  * @param durationMillis The duration of the gesture. By default 300 milliseconds.
  */
 @ExperimentalTestApi
@@ -480,16 +483,17 @@
 }
 
 /**
- * Move the mouse along the given [curve], sending a stream of move events to get an animated
- * path of [durationMillis] milliseconds. The mouse will initially be moved to the start of the
- * path, `curve(0)`, if it is not already there. The positions defined by the [curve] are in the
- * node's local coordinate system, where (0, 0) is the top left corner of the node.
+ * Move the mouse along the given [curve], sending a stream of move events to get an animated path
+ * of [durationMillis] milliseconds. The mouse will initially be moved to the start of the path,
+ * `curve(0)`, if it is not already there. The positions defined by the [curve] are in the node's
+ * local coordinate system, where (0, 0) is the top left corner of the node.
  *
  * Example of moving the mouse along a curve:
+ *
  * @sample androidx.compose.ui.test.samples.mouseInputAnimateAlong
  *
- * @param curve The function that defines the position of the mouse over time for this gesture,
- * in the node's local coordinate system.
+ * @param curve The function that defines the position of the mouse over time for this gesture, in
+ *   the node's local coordinate system.
  * @param durationMillis The duration of the gesture. By default 300 milliseconds.
  */
 @ExperimentalTestApi
@@ -497,9 +501,7 @@
     curve: (Long) -> Offset,
     durationMillis: Long = DefaultMouseGestureDurationMillis
 ) {
-    require(durationMillis > 0) {
-        "Duration is 0"
-    }
+    require(durationMillis > 0) { "Duration is 0" }
     val start = curve(0)
     if (start != currentPosition) {
         // Instantly move to the start position to maintain the total durationMillis
@@ -534,14 +536,14 @@
 
 /**
  * Use [button] to drag and drop something from [start] to [end] in [durationMillis] milliseconds.
- * The mouse position is [updated][MouseInjectionScope.updatePointerTo] to the start position
- * before starting the gesture. The positions defined by the [start] and [end] are in the node's
- * local coordinate system, where (0, 0) is the top left corner of the node.
+ * The mouse position is [updated][MouseInjectionScope.updatePointerTo] to the start position before
+ * starting the gesture. The positions defined by the [start] and [end] are in the node's local
+ * coordinate system, where (0, 0) is the top left corner of the node.
  *
- * @param start The position where to press the primary mouse button and initiate the drag, in
- * the node's local coordinate system.
- * @param end The position where to release the primary mouse button and end the drag, in the
- * node's local coordinate system.
+ * @param start The position where to press the primary mouse button and initiate the drag, in the
+ *   node's local coordinate system.
+ * @param end The position where to release the primary mouse button and end the drag, in the node's
+ *   local coordinate system.
  * @param button The button to drag with. Uses the [primary][MouseButton.Primary] by default.
  * @param durationMillis The duration of the gesture. By default 300 milliseconds.
  */
@@ -559,20 +561,20 @@
 }
 
 /**
- * Rotate the mouse's [scrollWheel] by the given [scrollAmount]. The total scroll delta is
- * linearly smoothed out over a stream of scroll events between each scroll event.
+ * Rotate the mouse's [scrollWheel] by the given [scrollAmount]. The total scroll delta is linearly
+ * smoothed out over a stream of scroll events between each scroll event.
  *
- * Positive [scrollAmount] values correspond to scrolling forward (new content appears at the
- * bottom of a column, or at the end of a row), negative values correspond to scrolling backward
- * (new content appears at the top of a column, or at the start of a row).
+ * Positive [scrollAmount] values correspond to scrolling forward (new content appears at the bottom
+ * of a column, or at the end of a row), negative values correspond to scrolling backward (new
+ * content appears at the top of a column, or at the start of a row).
  *
  * Example of a horizontal smooth scroll:
+ *
  * @sample androidx.compose.ui.test.samples.mouseInputSmoothScroll
  *
  * @param scrollAmount The total delta to scroll the [scrollWheel] by
  * @param durationMillis The duration of the gesture. By default 300 milliseconds.
  * @param scrollWheel Which scroll wheel will be rotated. By default [ScrollWheel.Vertical].
- *
  * @see MouseInjectionScope.scroll
  */
 @ExperimentalTestApi
diff --git a/compose/ui/ui-test/src/commonMain/kotlin/androidx/compose/ui/test/MultiModalInjectionScope.kt b/compose/ui/ui-test/src/commonMain/kotlin/androidx/compose/ui/test/MultiModalInjectionScope.kt
index 68fb132..5b1a5b7 100644
--- a/compose/ui/ui-test/src/commonMain/kotlin/androidx/compose/ui/test/MultiModalInjectionScope.kt
+++ b/compose/ui/ui-test/src/commonMain/kotlin/androidx/compose/ui/test/MultiModalInjectionScope.kt
@@ -28,15 +28,16 @@
  * The receiver scope of the multi-modal input injection lambda from [performMultiModalInput].
  *
  * [MultiModalInjectionScope] brings together the receiver scopes of all individual modalities,
- * allowing you to inject gestures that consist of events from different modalities, like touch
- * and mouse. For each modality, there is a function to which you pass a lambda in which you can
- * inject events for that modality: currently, we have [touch], [mouse] and [key] functions.
- * See their respective docs for more information.
+ * allowing you to inject gestures that consist of events from different modalities, like touch and
+ * mouse. For each modality, there is a function to which you pass a lambda in which you can inject
+ * events for that modality: currently, we have [touch], [mouse] and [key] functions. See their
+ * respective docs for more information.
  *
  * Note that all events generated by the gesture methods are batched together and sent as a whole
  * after [performMultiModalInput] has executed its code block.
  *
  * Example of performing a click via touch input followed by drag and drop via mouse input:
+ *
  * @sample androidx.compose.ui.test.samples.multiModalInputClickDragDrop
  *
  * @see InjectionScope
@@ -47,28 +48,17 @@
  */
 // TODO(fresen): add better multi modal example when we have key input support
 sealed interface MultiModalInjectionScope : InjectionScope {
-    /**
-     * Injects all touch events sent by the given [block]
-     */
+    /** Injects all touch events sent by the given [block] */
     fun touch(block: TouchInjectionScope.() -> Unit)
 
-    /**
-     * Injects all mouse events sent by the given [block]
-     */
-    @ExperimentalTestApi
-    fun mouse(block: MouseInjectionScope.() -> Unit)
+    /** Injects all mouse events sent by the given [block] */
+    @ExperimentalTestApi fun mouse(block: MouseInjectionScope.() -> Unit)
 
-    /**
-     * Injects all key events sent by the given [block]
-     */
-    @ExperimentalTestApi
-    fun key(block: KeyInjectionScope.() -> Unit)
+    /** Injects all key events sent by the given [block] */
+    @ExperimentalTestApi fun key(block: KeyInjectionScope.() -> Unit)
 
-    /**
-     * Injects all rotary events sent by the given [block]
-     */
-    @ExperimentalTestApi
-    fun rotary(block: RotaryInjectionScope.() -> Unit)
+    /** Injects all rotary events sent by the given [block] */
+    @ExperimentalTestApi fun rotary(block: RotaryInjectionScope.() -> Unit)
 }
 
 internal class MultiModalInjectionScopeImpl(node: SemanticsNode, testContext: TestContext) :
@@ -76,9 +66,10 @@
     // TODO(b/133217292): Better error: explain which gesture couldn't be performed
     private var _semanticsNode: SemanticsNode? = node
     private val semanticsNode
-        get() = checkNotNull(_semanticsNode) {
-            "Can't query SemanticsNode, InjectionScope has already been disposed"
-        }
+        get() =
+            checkNotNull(_semanticsNode) {
+                "Can't query SemanticsNode, InjectionScope has already been disposed"
+            }
 
     // TODO(b/133217292): Better error: explain which gesture couldn't be performed
     private var _inputDispatcher: InputDispatcher? =
@@ -87,20 +78,21 @@
             checkNotNull(semanticsNode.root) { "null semantics root" }
         )
     internal val inputDispatcher
-        get() = checkNotNull(_inputDispatcher) {
-            "Can't send gesture, InjectionScope has already been disposed"
-        }
+        get() =
+            checkNotNull(_inputDispatcher) {
+                "Can't send gesture, InjectionScope has already been disposed"
+            }
 
     /**
      * Returns and stores the visible bounds of the [semanticsNode] we're interacting with. This
-     * applies clipping, which is almost always the correct thing to do when injecting gestures,
-     * as gestures operate on visible UI.
+     * applies clipping, which is almost always the correct thing to do when injecting gestures, as
+     * gestures operate on visible UI.
      */
     private val boundsInRoot: Rect by lazy { semanticsNode.boundsInRoot }
 
     /**
-     * Returns the size of the visible part of the node we're interacting with. This is contrary
-     * to [SemanticsNode.size], which returns the unclipped size of the node.
+     * Returns the size of the visible part of the node we're interacting with. This is contrary to
+     * [SemanticsNode.size], which returns the unclipped size of the node.
      */
     override val visibleSize: IntSize by lazy {
         IntSize(boundsInRoot.width.roundToInt(), boundsInRoot.height.roundToInt())
@@ -156,11 +148,9 @@
 
     private val touchScope: TouchInjectionScope = TouchInjectionScopeImpl(this)
 
-    @ExperimentalTestApi
-    private val mouseScope: MouseInjectionScope = MouseInjectionScopeImpl(this)
+    @ExperimentalTestApi private val mouseScope: MouseInjectionScope = MouseInjectionScopeImpl(this)
 
-    @ExperimentalTestApi
-    private val keyScope: KeyInjectionScope = KeyInjectionScopeImpl(this)
+    @ExperimentalTestApi private val keyScope: KeyInjectionScope = KeyInjectionScopeImpl(this)
 
     @ExperimentalTestApi
     private val rotaryScope: RotaryInjectionScope = RotaryInjectionScopeImpl(this)
diff --git a/compose/ui/ui-test/src/commonMain/kotlin/androidx/compose/ui/test/Output.kt b/compose/ui/ui-test/src/commonMain/kotlin/androidx/compose/ui/test/Output.kt
index 09466a2..b7a672c 100644
--- a/compose/ui/ui-test/src/commonMain/kotlin/androidx/compose/ui/test/Output.kt
+++ b/compose/ui/ui-test/src/commonMain/kotlin/androidx/compose/ui/test/Output.kt
@@ -36,15 +36,14 @@
  * collected before. So the output can change over time if the tree changes.
  *
  * @param maxDepth Max depth of the nodes in hierarchy to print. Zero will print just this node.
- * Must not be negative.
+ *   Must not be negative.
  */
 fun SemanticsNodeInteraction.printToString(
     /*@IntRange(from = 0)*/
     maxDepth: Int = Int.MAX_VALUE
 ): String {
     val result = fetchSemanticsNode()
-    return "Printing with useUnmergedTree = '$useUnmergedTree'\n" +
-        result.printToString(maxDepth)
+    return "Printing with useUnmergedTree = '$useUnmergedTree'\n" + result.printToString(maxDepth)
 }
 
 /**
@@ -58,7 +57,7 @@
  *
  * @param tag The tag to be used in the log messages.
  * @param maxDepth Max depth of the nodes in hierarchy to print. Zero will print just this node.
- * Must not be negative.
+ *   Must not be negative.
  */
 fun SemanticsNodeInteraction.printToLog(
     tag: String,
@@ -79,7 +78,7 @@
  * collected before. So the output can change over time if the tree changes.
  *
  * @param maxDepth Max depth of the nodes in hierarchy to print. Zero will print nodes in this
- * collection only. Must not be negative.
+ *   collection only. Must not be negative.
  */
 fun SemanticsNodeInteractionCollection.printToString(
     /*@IntRange(from = 0)*/
@@ -105,7 +104,7 @@
  *
  * @param tag The tag to be used in the log messages. Must not be negative.
  * @param maxDepth Max depth of the nodes in hierarchy to print. Zero will print nodes in this
- * collection only.
+ *   collection only.
  */
 fun SemanticsNodeInteractionCollection.printToLog(
     tag: String,
@@ -152,13 +151,14 @@
     nestingIndent: String,
     isFollowedBySibling: Boolean
 ) {
-    val newIndent = if (nestingLevel == 0) {
-        ""
-    } else if (isFollowedBySibling) {
-        "$nestingIndent | "
-    } else {
-        "$nestingIndent   "
-    }
+    val newIndent =
+        if (nestingLevel == 0) {
+            ""
+        } else if (isFollowedBySibling) {
+            "$nestingIndent | "
+        } else {
+            "$nestingIndent   "
+        }
 
     if (nestingLevel > 0) {
         sb.append("$nestingIndent |-")
@@ -246,8 +246,10 @@
         append(" = '")
 
         if (value is AnnotatedString) {
-            if (value.paragraphStyles.isEmpty() && value.spanStyles.isEmpty() && value
-                .getStringAnnotations(0, value.text.length).isEmpty()
+            if (
+                value.paragraphStyles.isEmpty() &&
+                    value.spanStyles.isEmpty() &&
+                    value.getStringAnnotations(0, value.text.length).isEmpty()
             ) {
                 append(value.text)
             } else {
diff --git a/compose/ui/ui-test/src/commonMain/kotlin/androidx/compose/ui/test/PlatformTextInputMethodOverride.kt b/compose/ui/ui-test/src/commonMain/kotlin/androidx/compose/ui/test/PlatformTextInputMethodOverride.kt
index 9983f07..673a0ae 100644
--- a/compose/ui/ui-test/src/commonMain/kotlin/androidx/compose/ui/test/PlatformTextInputMethodOverride.kt
+++ b/compose/ui/ui-test/src/commonMain/kotlin/androidx/compose/ui/test/PlatformTextInputMethodOverride.kt
@@ -25,10 +25,10 @@
  * Installs a custom [PlatformTextInputSession] implementation to run when
  * [PlatformTextInputSession.startInputMethod] is called by text editors inside [content].
  *
- * @param sessionHandler The [PlatformTextInputSession] to use to handle input method requests.
- * This object does _not_ need to worry about synchronizing calls to
- * [PlatformTextInputSession.startInputMethod] – this composable will handle the session management
- * the same way as in production.
+ * @param sessionHandler The [PlatformTextInputSession] to use to handle input method requests. This
+ *   object does _not_ need to worry about synchronizing calls to
+ *   [PlatformTextInputSession.startInputMethod] – this composable will handle the session
+ *   management the same way as in production.
  * @param content The composable content for which to override the input method handler.
  */
 @OptIn(ExperimentalComposeUiApi::class)
diff --git a/compose/ui/ui-test/src/commonMain/kotlin/androidx/compose/ui/test/RotaryInjectionScope.kt b/compose/ui/ui-test/src/commonMain/kotlin/androidx/compose/ui/test/RotaryInjectionScope.kt
index 24c7fd2..a661ddb 100644
--- a/compose/ui/ui-test/src/commonMain/kotlin/androidx/compose/ui/test/RotaryInjectionScope.kt
+++ b/compose/ui/ui-test/src/commonMain/kotlin/androidx/compose/ui/test/RotaryInjectionScope.kt
@@ -19,11 +19,12 @@
 /**
  * The receiver scope of rotary input injection lambda from [performRotaryScrollInput].
  *
- * A rotary event can be sent with [rotateToScrollVertically] or [rotateToScrollHorizontally].
- * All events sent by these methods are batched together and sent as a whole after
+ * A rotary event can be sent with [rotateToScrollVertically] or [rotateToScrollHorizontally]. All
+ * events sent by these methods are batched together and sent as a whole after
  * [performRotaryScrollInput] has executed its code block.
  *
  * Example of performing a scroll with three events:
+ *
  * @sample androidx.compose.ui.test.samples.rotaryInputScroll
  */
 @ExperimentalTestApi
@@ -50,10 +51,10 @@
 }
 
 @ExperimentalTestApi
-internal class RotaryInjectionScopeImpl(
-    private val baseScope: MultiModalInjectionScopeImpl
-) : RotaryInjectionScope, InjectionScope by baseScope {
-    private val inputDispatcher get() = baseScope.inputDispatcher
+internal class RotaryInjectionScopeImpl(private val baseScope: MultiModalInjectionScopeImpl) :
+    RotaryInjectionScope, InjectionScope by baseScope {
+    private val inputDispatcher
+        get() = baseScope.inputDispatcher
 
     override fun rotateToScrollHorizontally(horizontalScrollPixels: Float) {
         inputDispatcher.enqueueRotaryScrollHorizontally(horizontalScrollPixels)
diff --git a/compose/ui/ui-test/src/commonMain/kotlin/androidx/compose/ui/test/Selectors.kt b/compose/ui/ui-test/src/commonMain/kotlin/androidx/compose/ui/test/Selectors.kt
index d6d6fd3..f635977 100644
--- a/compose/ui/ui-test/src/commonMain/kotlin/androidx/compose/ui/test/Selectors.kt
+++ b/compose/ui/ui-test/src/commonMain/kotlin/androidx/compose/ui/test/Selectors.kt
@@ -28,8 +28,8 @@
  * Returns a parent of this node.
  *
  * Any subsequent operation on its result will expect exactly one element found (unless
- * [SemanticsNodeInteraction.assertDoesNotExist] is used) and will throw [AssertionError] if
- * none or more than one element is found.
+ * [SemanticsNodeInteraction.assertDoesNotExist] is used) and will throw [AssertionError] if none or
+ * more than one element is found.
  */
 fun SemanticsNodeInteraction.onParent(): SemanticsNodeInteraction {
     return SemanticsNodeInteraction(
@@ -39,9 +39,7 @@
     )
 }
 
-/**
- * Returns children of this node.
- */
+/** Returns children of this node. */
 fun SemanticsNodeInteraction.onChildren(): SemanticsNodeInteractionCollection {
     return SemanticsNodeInteractionCollection(
         testContext,
@@ -56,8 +54,8 @@
  * Use this only if this node has exactly one child.
  *
  * Any subsequent operation on its result will expect exactly one element found (unless
- * [SemanticsNodeInteraction.assertDoesNotExist] is used) and will throw [AssertionError] if
- * none or more than one element is found.
+ * [SemanticsNodeInteraction.assertDoesNotExist] is used) and will throw [AssertionError] if none or
+ * more than one element is found.
  */
 fun SemanticsNodeInteraction.onChild(): SemanticsNodeInteraction {
     return SemanticsNodeInteraction(
@@ -78,6 +76,7 @@
  * Returns all siblings of this node.
  *
  * Example: For the following tree
+ *
  * ```
  * |-A
  *   |-B1
@@ -100,8 +99,8 @@
  * Use this only if this node has exactly one sibling.
  *
  * Any subsequent operation on its result will expect exactly one element found (unless
- * [SemanticsNodeInteraction.assertDoesNotExist] is used) and will throw [AssertionError] if
- * none or more than one element is found.
+ * [SemanticsNodeInteraction.assertDoesNotExist] is used) and will throw [AssertionError] if none or
+ * more than one element is found.
  */
 fun SemanticsNodeInteraction.onSibling(): SemanticsNodeInteraction {
     return SemanticsNodeInteraction(
@@ -115,6 +114,7 @@
  * Returns all the ancestors of this node.
  *
  * Example: For the following tree
+ *
  * ```
  * |-A
  *   |-B
@@ -134,8 +134,8 @@
  * Returns the first node in this collection.
  *
  * Any subsequent operation on its result will expect exactly one element found (unless
- * [SemanticsNodeInteraction.assertDoesNotExist] is used) and will throw [AssertionError] if
- * no element is found.
+ * [SemanticsNodeInteraction.assertDoesNotExist] is used) and will throw [AssertionError] if no
+ * element is found.
  */
 fun SemanticsNodeInteractionCollection.onFirst(): SemanticsNodeInteraction {
     return get(0)
@@ -145,15 +145,11 @@
  * Returns the last node in this collection.
  *
  * Any subsequent operation on its result will expect exactly one element found (unless
- * [SemanticsNodeInteraction.assertDoesNotExist] is used) and will throw [AssertionError] if
- * no element is found.
+ * [SemanticsNodeInteraction.assertDoesNotExist] is used) and will throw [AssertionError] if no
+ * element is found.
  */
 fun SemanticsNodeInteractionCollection.onLast(): SemanticsNodeInteraction {
-    return SemanticsNodeInteraction(
-        testContext,
-        useUnmergedTree,
-        selector.addLastNodeSelector()
-    )
+    return SemanticsNodeInteraction(testContext, useUnmergedTree, selector.addLastNodeSelector())
 }
 
 /**
@@ -175,8 +171,8 @@
  * Expects to return exactly one node matching the given [matcher].
  *
  * Any subsequent operation on its result will expect exactly one element found (unless
- * [SemanticsNodeInteraction.assertDoesNotExist] is used) and will throw [AssertionError] if
- * no element is found.
+ * [SemanticsNodeInteraction.assertDoesNotExist] is used) and will throw [AssertionError] if no
+ * element is found.
  *
  * @param matcher Matcher to use for the filtering.
  */
diff --git a/compose/ui/ui-test/src/commonMain/kotlin/androidx/compose/ui/test/SemanticsMatcher.kt b/compose/ui/ui-test/src/commonMain/kotlin/androidx/compose/ui/test/SemanticsMatcher.kt
index 6f02c1b..45058fe 100644
--- a/compose/ui/ui-test/src/commonMain/kotlin/androidx/compose/ui/test/SemanticsMatcher.kt
+++ b/compose/ui/ui-test/src/commonMain/kotlin/androidx/compose/ui/test/SemanticsMatcher.kt
@@ -23,10 +23,7 @@
  * Wrapper for semantics matcher lambdas that allows to build string explaining to the developer
  * what conditions were being tested.
  */
-class SemanticsMatcher(
-    val description: String,
-    private val matcher: (SemanticsNode) -> Boolean
-) {
+class SemanticsMatcher(val description: String, private val matcher: (SemanticsNode) -> Boolean) {
 
     companion object {
         /**
@@ -39,35 +36,23 @@
             }
         }
 
-        /**
-         * Builds a predicate that tests whether the given [key] is defined in semantics.
-         */
+        /** Builds a predicate that tests whether the given [key] is defined in semantics. */
         fun <T> keyIsDefined(key: SemanticsPropertyKey<T>): SemanticsMatcher {
-            return SemanticsMatcher("${key.name} is defined") {
-                key in it.config
-            }
+            return SemanticsMatcher("${key.name} is defined") { key in it.config }
         }
 
-        /**
-         * Builds a predicate that tests whether the given [key] is NOT defined in semantics.
-         */
+        /** Builds a predicate that tests whether the given [key] is NOT defined in semantics. */
         fun <T> keyNotDefined(key: SemanticsPropertyKey<T>): SemanticsMatcher {
-            return SemanticsMatcher("${key.name} is NOT defined") {
-                key !in it.config
-            }
+            return SemanticsMatcher("${key.name} is NOT defined") { key !in it.config }
         }
     }
 
-    /**
-     * Returns whether the given node is matched by this matcher.
-     */
+    /** Returns whether the given node is matched by this matcher. */
     fun matches(node: SemanticsNode): Boolean {
         return matcher(node)
     }
 
-    /**
-     * Returns whether at least one of the given nodes is matched by this matcher.
-     */
+    /** Returns whether at least one of the given nodes is matched by this matcher. */
     fun matchesAny(nodes: Iterable<SemanticsNode>): Boolean {
         return nodes.any(matcher)
     }
@@ -85,8 +70,6 @@
     }
 
     operator fun not(): SemanticsMatcher {
-        return SemanticsMatcher("NOT ($description)") {
-            !matcher(it)
-        }
+        return SemanticsMatcher("NOT ($description)") { !matcher(it) }
     }
 }
diff --git a/compose/ui/ui-test/src/commonMain/kotlin/androidx/compose/ui/test/SemanticsNodeInteraction.kt b/compose/ui/ui-test/src/commonMain/kotlin/androidx/compose/ui/test/SemanticsNodeInteraction.kt
index f500d6a..dc3e83c 100644
--- a/compose/ui/ui-test/src/commonMain/kotlin/androidx/compose/ui/test/SemanticsNodeInteraction.kt
+++ b/compose/ui/ui-test/src/commonMain/kotlin/androidx/compose/ui/test/SemanticsNodeInteraction.kt
@@ -24,17 +24,20 @@
  * [assertHasClickAction], or navigate to other nodes such as [onChildren].
  *
  * An instance of [SemanticsNodeInteraction] can be obtained from
- * [onNode][SemanticsNodeInteractionsProvider.onNode] and convenience
- * methods that use a specific filter, such as [onNodeWithText].
+ * [onNode][SemanticsNodeInteractionsProvider.onNode] and convenience methods that use a specific
+ * filter, such as [onNodeWithText].
  *
  * Here you can see how you can locate a checkbox, click it and verify that it's checked:
+ *
  * @sample androidx.compose.ui.test.samples.clickAndVerifyCheckbox
  *
  * [useUnmergedTree] is for tests with a special need to inspect implementation detail within
  * children. For example:
+ *
  * @sample androidx.compose.ui.test.samples.useUnmergedTree
  */
-class SemanticsNodeInteraction constructor(
+class SemanticsNodeInteraction
+constructor(
     internal val testContext: TestContext,
     internal val useUnmergedTree: Boolean,
     internal val selector: SemanticsSelector
@@ -58,15 +61,14 @@
         errorMessageOnFail: String? = null,
         skipDeactivatedNodes: Boolean = true
     ): SelectionResult {
-        return selector
-            .map(
-                testContext.getAllSemanticsNodes(
-                    atLeastOneRootRequired = atLeastOneRootRequired,
-                    useUnmergedTree = useUnmergedTree,
-                    skipDeactivatedNodes = skipDeactivatedNodes
-                ),
-                errorMessageOnFail.orEmpty()
-            )
+        return selector.map(
+            testContext.getAllSemanticsNodes(
+                atLeastOneRootRequired = atLeastOneRootRequired,
+                useUnmergedTree = useUnmergedTree,
+                skipDeactivatedNodes = skipDeactivatedNodes
+            ),
+            errorMessageOnFail.orEmpty()
+        )
     }
 
     /**
@@ -92,10 +94,11 @@
      * @throws [AssertionError] if the assert fails.
      */
     fun assertDoesNotExist() {
-        val result = fetchSemanticsNodes(
-            atLeastOneRootRequired = false,
-            errorMessageOnFail = "Failed: assertDoesNotExist."
-        )
+        val result =
+            fetchSemanticsNodes(
+                atLeastOneRootRequired = false,
+                errorMessageOnFail = "Failed: assertDoesNotExist."
+            )
         if (result.selectedNodes.isNotEmpty()) {
             throw AssertionError(
                 buildErrorMessageForCountMismatch(
@@ -116,9 +119,8 @@
      * introduce additional overhead.
      *
      * @param errorMessageOnFail Error message prefix to be added to the message in case this
-     * asserts fails. This is typically used by operations that rely on this assert. Example prefix
-     * could be: "Failed to perform doOnClick.".
-     *
+     *   asserts fails. This is typically used by operations that rely on this assert. Example
+     *   prefix could be: "Failed to perform doOnClick.".
      * @throws [AssertionError] if the assert fails.
      */
     fun assertExists(errorMessageOnFail: String? = null): SemanticsNodeInteraction {
@@ -129,8 +131,8 @@
     /**
      * Asserts that the component was found and it is deactivated.
      *
-     * For example, the children of [androidx.compose.ui.layout.SubcomposeLayout] which are
-     * retained to be reused in future are considered deactivated.
+     * For example, the children of [androidx.compose.ui.layout.SubcomposeLayout] which are retained
+     * to be reused in future are considered deactivated.
      *
      * @throws [AssertionError] if the assert fails.
      */
@@ -151,14 +153,14 @@
         errorMessageOnFail: String? = null,
         skipDeactivatedNodes: Boolean = true
     ): SemanticsNode {
-        val finalErrorMessage = errorMessageOnFail
-            ?: "Failed: assertExists."
+        val finalErrorMessage = errorMessageOnFail ?: "Failed: assertExists."
 
-        val result = fetchSemanticsNodes(
-            atLeastOneRootRequired = true,
-            errorMessageOnFail = finalErrorMessage,
-            skipDeactivatedNodes = skipDeactivatedNodes
-        )
+        val result =
+            fetchSemanticsNodes(
+                atLeastOneRootRequired = true,
+                errorMessageOnFail = finalErrorMessage,
+                skipDeactivatedNodes = skipDeactivatedNodes
+            )
         if (result.selectedNodes.count() != 1) {
             if (result.selectedNodes.isEmpty() && lastSeenSemantics != null) {
                 // This means that node we used to have is no longer in the tree.
@@ -190,9 +192,7 @@
         return result.selectedNodes.first()
     }
 
-    /**
-     * If using the merged tree, performs the same search in the unmerged tree.
-     */
+    /** If using the merged tree, performs the same search in the unmerged tree. */
     private fun getNodesInUnmergedTree(errorMessageOnFail: String?): List<SemanticsNode> {
         return if (!useUnmergedTree) {
             selector
@@ -202,7 +202,8 @@
                         useUnmergedTree = true
                     ),
                     errorMessageOnFail.orEmpty()
-                ).selectedNodes
+                )
+                .selectedNodes
         } else {
             emptyList()
         }
@@ -215,13 +216,15 @@
  * navigate to other nodes such as [get].
  *
  * An instance of [SemanticsNodeInteractionCollection] can be obtained from
- * [onAllNodes][SemanticsNodeInteractionsProvider.onAllNodes] and convenience
- * methods that use a specific filter, such as [onAllNodesWithText].
+ * [onAllNodes][SemanticsNodeInteractionsProvider.onAllNodes] and convenience methods that use a
+ * specific filter, such as [onAllNodesWithText].
  *
  * For example, here is how you verify that there are exactly two clickable items:
+ *
  * @sample androidx.compose.ui.test.samples.verifyTwoClickableNodes
  */
-class SemanticsNodeInteractionCollection constructor(
+class SemanticsNodeInteractionCollection
+constructor(
     internal val testContext: TestContext,
     internal val useUnmergedTree: Boolean,
     internal val selector: SemanticsSelector
@@ -241,10 +244,10 @@
      * multiple times in one atomic operation, it is better to cache the result instead of calling
      * this API multiple times.
      *
-     * @param atLeastOneRootRequired Whether to throw an error in case there is no compose
-     * content in the current test app.
+     * @param atLeastOneRootRequired Whether to throw an error in case there is no compose content
+     *   in the current test app.
      * @param errorMessageOnFail Custom error message to append when this fails to retrieve the
-     * nodes.
+     *   nodes.
      */
     fun fetchSemanticsNodes(
         atLeastOneRootRequired: Boolean = true,
@@ -260,8 +263,9 @@
                 .selectedNodes
         }
 
-        return testContext.getAllSemanticsNodes(atLeastOneRootRequired, useUnmergedTree)
-            .filter { it.id in nodeIds!! }
+        return testContext.getAllSemanticsNodes(atLeastOneRootRequired, useUnmergedTree).filter {
+            it.id in nodeIds!!
+        }
     }
 
     /**
diff --git a/compose/ui/ui-test/src/commonMain/kotlin/androidx/compose/ui/test/SemanticsSelector.kt b/compose/ui/ui-test/src/commonMain/kotlin/androidx/compose/ui/test/SemanticsSelector.kt
index 95d44b4..4c55136 100644
--- a/compose/ui/ui-test/src/commonMain/kotlin/androidx/compose/ui/test/SemanticsSelector.kt
+++ b/compose/ui/ui-test/src/commonMain/kotlin/androidx/compose/ui/test/SemanticsSelector.kt
@@ -43,28 +43,26 @@
         val inputNodes = chainedResult?.selectedNodes ?: nodes
         if (requiresExactlyOneNode && inputNodes.count() != 1) {
             throw AssertionError(
-                chainedResult?.customErrorOnNoMatch ?: buildErrorMessageForCountMismatch(
-                    errorMessage = errorOnFail,
-                    foundNodes = inputNodes.toList(),
-                    expectedCount = 1,
-                    selector = chainedInputSelector ?: this
-                )
+                chainedResult?.customErrorOnNoMatch
+                    ?: buildErrorMessageForCountMismatch(
+                        errorMessage = errorOnFail,
+                        foundNodes = inputNodes.toList(),
+                        expectedCount = 1,
+                        selector = chainedInputSelector ?: this
+                    )
             )
         }
         return selector(inputNodes)
     }
 }
 
-/**
- * Creates a new [SemanticsSelector] based on the given [SemanticsMatcher].
- */
+/** Creates a new [SemanticsSelector] based on the given [SemanticsMatcher]. */
 internal fun SemanticsSelector(matcher: SemanticsMatcher): SemanticsSelector {
     return SemanticsSelector(
         matcher.description,
         requiresExactlyOneNode = false,
         chainedInputSelector = null
-    ) {
-        nodes ->
+    ) { nodes ->
         SelectionResult(nodes.filter { matcher.matches(it) })
     }
 }
@@ -74,8 +72,8 @@
  *
  * @param selectedNodes The result nodes found.
  * @param customErrorOnNoMatch If the projection failed to map nodes due to wrong input (e.g.
- * selector expected only 1 node but got multiple) it will provide a custom error exactly explaining
- * what selection was performed and what nodes it received.
+ *   selector expected only 1 node but got multiple) it will provide a custom error exactly
+ *   explaining what selection was performed and what nodes it received.
  */
 class SelectionResult(
     val selectedNodes: List<SemanticsNode>,
@@ -95,18 +93,13 @@
         "(${this.description}).$description",
         requiresExactlyOneNode = true,
         chainedInputSelector = this
-    ) {
-        nodes ->
+    ) { nodes ->
         SelectionResult(selector(nodes.first()))
     }
 }
 
-/**
- * Chains a new selector that retrieves node from this selector at the given [index].
- */
-internal fun SemanticsSelector.addIndexSelector(
-    index: Int
-): SemanticsSelector {
+/** Chains a new selector that retrieves node from this selector at the given [index]. */
+internal fun SemanticsSelector.addIndexSelector(index: Int): SemanticsSelector {
     return SemanticsSelector(
         "(${this.description})[$index]",
         requiresExactlyOneNode = false,
@@ -122,9 +115,7 @@
     }
 }
 
-/**
- * Chains a new selector that retrieves the last node returned from this selector.
- */
+/** Chains a new selector that retrieves the last node returned from this selector. */
 internal fun SemanticsSelector.addLastNodeSelector(): SemanticsSelector {
     return SemanticsSelector(
         "(${this.description}).last",
diff --git a/compose/ui/ui-test/src/commonMain/kotlin/androidx/compose/ui/test/StateRestorationTester.kt b/compose/ui/ui-test/src/commonMain/kotlin/androidx/compose/ui/test/StateRestorationTester.kt
index 87ba736..12e5e64 100644
--- a/compose/ui/ui-test/src/commonMain/kotlin/androidx/compose/ui/test/StateRestorationTester.kt
+++ b/compose/ui/ui-test/src/commonMain/kotlin/androidx/compose/ui/test/StateRestorationTester.kt
@@ -28,9 +28,9 @@
 /**
  * Helps to test the state restoration for your Composable component.
  *
- * Instead of calling [ComposeUiTest.setContent] you need to use [setContent] on this
- * object, then change your state so there is some change to be restored, then execute
- * [emulateSaveAndRestore] and assert your state is restored properly.
+ * Instead of calling [ComposeUiTest.setContent] you need to use [setContent] on this object, then
+ * change your state so there is some change to be restored, then execute [emulateSaveAndRestore]
+ * and assert your state is restored properly.
  *
  * Note that this only tests the restoration of the local state of the composable you passed to
  * [setContent] and it is useful for testing uses of
@@ -43,8 +43,8 @@
     private var registry: RestorationRegistry? = null
 
     /**
-     * This functions is a direct replacement for [ComposeUiTest.setContent] if you are
-     * going to use [emulateSaveAndRestore] in the test.
+     * This functions is a direct replacement for [ComposeUiTest.setContent] if you are going to use
+     * [emulateSaveAndRestore] in the test.
      *
      * @see ComposeUiTest.setContent
      */
@@ -59,21 +59,15 @@
 
     /**
      * Emulates a save and restore cycle of the current composition. First all state that is
-     * remembered with [rememberSaveable][androidx.compose.runtime.saveable.rememberSaveable]
-     * is stored, then the current composition is disposed, and finally the composition is
-     * composed again. This allows you to test how your component behaves when state
-     * restoration is happening. Note that state stored via [remember] will be lost.
+     * remembered with [rememberSaveable][androidx.compose.runtime.saveable.rememberSaveable] is
+     * stored, then the current composition is disposed, and finally the composition is composed
+     * again. This allows you to test how your component behaves when state restoration is
+     * happening. Note that state stored via [remember] will be lost.
      */
     fun emulateSaveAndRestore() {
-        val registry = checkNotNull(registry) {
-            "setContent should be called first!"
-        }
-        composeTest.runOnIdle {
-            registry.saveStateAndDisposeChildren()
-        }
-        composeTest.runOnIdle {
-            registry.emitChildrenWithRestoredState()
-        }
+        val registry = checkNotNull(registry) { "setContent should be called first!" }
+        composeTest.runOnIdle { registry.saveStateAndDisposeChildren() }
+        composeTest.runOnIdle { registry.emitChildrenWithRestoredState() }
         composeTest.runOnIdle {
             // we just wait for the children to be emitted
         }
@@ -81,10 +75,11 @@
 
     @Composable
     private fun InjectRestorationRegistry(content: @Composable (RestorationRegistry) -> Unit) {
-        val original = requireNotNull(LocalSaveableStateRegistry.current) {
-            "StateRestorationTester requires composeTestRule.setContent() to provide " +
-                "a SaveableStateRegistry implementation via LocalSaveableStateRegistry"
-        }
+        val original =
+            requireNotNull(LocalSaveableStateRegistry.current) {
+                "StateRestorationTester requires composeTestRule.setContent() to provide " +
+                    "a SaveableStateRegistry implementation via LocalSaveableStateRegistry"
+            }
         val restorationRegistry = remember { RestorationRegistry(original) }
         CompositionLocalProvider(LocalSaveableStateRegistry provides restorationRegistry) {
             if (restorationRegistry.shouldEmitChildren) {
@@ -98,6 +93,7 @@
 
         var shouldEmitChildren by mutableStateOf(true)
             private set
+
         private var currentRegistry: SaveableStateRegistry = original
         private var savedMap: Map<String, List<Any?>> = emptyMap()
 
@@ -107,10 +103,11 @@
         }
 
         fun emitChildrenWithRestoredState() {
-            currentRegistry = SaveableStateRegistry(
-                restoredValues = savedMap,
-                canBeSaved = { original.canBeSaved(it) }
-            )
+            currentRegistry =
+                SaveableStateRegistry(
+                    restoredValues = savedMap,
+                    canBeSaved = { original.canBeSaved(it) }
+                )
             shouldEmitChildren = true
         }
 
diff --git a/compose/ui/ui-test/src/commonMain/kotlin/androidx/compose/ui/test/TestOwner.kt b/compose/ui/ui-test/src/commonMain/kotlin/androidx/compose/ui/test/TestOwner.kt
index 681388a..f0af7c6 100644
--- a/compose/ui/ui-test/src/commonMain/kotlin/androidx/compose/ui/test/TestOwner.kt
+++ b/compose/ui/ui-test/src/commonMain/kotlin/androidx/compose/ui/test/TestOwner.kt
@@ -27,9 +27,7 @@
  */
 @InternalTestApi
 interface TestOwner {
-    /**
-     * Clock that drives frames and recompositions in compose tests.
-     */
+    /** Clock that drives frames and recompositions in compose tests. */
     val mainClock: MainTestClock
 
     /**
@@ -45,11 +43,11 @@
      *
      * This is a blocking call. Returns only after compose is idle.
      *
-     * Can crash in case it hits time out. This is not supposed to be handled as it
-     * surfaces only in incorrect tests.
+     * Can crash in case it hits time out. This is not supposed to be handled as it surfaces only in
+     * incorrect tests.
      *
      * @param atLeastOneRootExpected Whether the caller expects that at least one compose root is
-     * present in the tested app. This affects synchronization efforts / timeouts of this API.
+     *   present in the tested app. This affects synchronization efforts / timeouts of this API.
      */
     fun getRoots(atLeastOneRootExpected: Boolean): Set<RootForTest>
 }
@@ -75,24 +73,25 @@
      *
      * This is a blocking call. Returns only after compose is idle.
      *
-     * Can crash in case it hits time out. This is not supposed to be handled as it
-     * surfaces only in incorrect tests.
+     * Can crash in case it hits time out. This is not supposed to be handled as it surfaces only in
+     * incorrect tests.
      */
     internal fun getAllSemanticsNodes(
         atLeastOneRootRequired: Boolean,
         useUnmergedTree: Boolean,
         skipDeactivatedNodes: Boolean = true
     ): Iterable<SemanticsNode> {
-        val roots = testOwner.getRoots(atLeastOneRootRequired).also {
-            check(!atLeastOneRootRequired || it.isNotEmpty()) {
-                "No compose hierarchies found in the app. Possible reasons include: " +
-                    "(1) the Activity that calls setContent did not launch; " +
-                    "(2) setContent was not called; " +
-                    "(3) setContent was called before the ComposeTestRule ran. " +
-                    "If setContent is called by the Activity, make sure the Activity is " +
-                    "launched after the ComposeTestRule runs"
+        val roots =
+            testOwner.getRoots(atLeastOneRootRequired).also {
+                check(!atLeastOneRootRequired || it.isNotEmpty()) {
+                    "No compose hierarchies found in the app. Possible reasons include: " +
+                        "(1) the Activity that calls setContent did not launch; " +
+                        "(2) setContent was not called; " +
+                        "(3) setContent was called before the ComposeTestRule ran. " +
+                        "If setContent is called by the Activity, make sure the Activity is " +
+                        "launched after the ComposeTestRule runs"
+                }
             }
-        }
 
         return testOwner.runOnUiThread {
             roots.flatMap {
diff --git a/compose/ui/ui-test/src/commonMain/kotlin/androidx/compose/ui/test/TextActions.kt b/compose/ui/ui-test/src/commonMain/kotlin/androidx/compose/ui/test/TextActions.kt
index 6ab70729..29afc16 100644
--- a/compose/ui/ui-test/src/commonMain/kotlin/androidx/compose/ui/test/TextActions.kt
+++ b/compose/ui/ui-test/src/commonMain/kotlin/androidx/compose/ui/test/TextActions.kt
@@ -21,14 +21,11 @@
 import androidx.compose.ui.semantics.SemanticsNode
 import androidx.compose.ui.semantics.SemanticsProperties
 import androidx.compose.ui.semantics.SemanticsPropertyReceiver
-import androidx.compose.ui.semantics.onImeAction
 import androidx.compose.ui.text.AnnotatedString
 import androidx.compose.ui.text.TextRange
 import androidx.compose.ui.text.input.ImeAction
 
-/**
- * Clears the text in this node in similar way to IME.
- */
+/** Clears the text in this node in similar way to IME. */
 fun SemanticsNodeInteraction.performTextClearance() {
     performTextReplacement("")
 }
@@ -39,12 +36,9 @@
  * @param text Text to send.
  */
 fun SemanticsNodeInteraction.performTextInput(text: String) {
-    @OptIn(ExperimentalTestApi::class)
-    invokeGlobalAssertions()
+    @OptIn(ExperimentalTestApi::class) invokeGlobalAssertions()
     getNodeAndFocus()
-    performSemanticsAction(SemanticsActions.InsertTextAtCursor) {
-        it(AnnotatedString(text))
-    }
+    performSemanticsAction(SemanticsActions.InsertTextAtCursor) { it(AnnotatedString(text)) }
 }
 
 /**
@@ -77,20 +71,18 @@
 /**
  * Sends to this node the IME action associated with it in a similar way to the IME.
  *
- * The node needs to define its IME action in semantics via
- * [SemanticsPropertyReceiver.onImeAction].
+ * The node needs to define its IME action in semantics via [SemanticsPropertyReceiver.onImeAction].
  *
  * @throws AssertionError if the node does not support input or does not define IME action.
  * @throws IllegalStateException if the node did is not an editor or would not be able to establish
- * an input connection (e.g. does not define [ImeAction][SemanticsProperties.ImeAction] or
- * [OnImeAction] or is not focused).
+ *   an input connection (e.g. does not define [ImeAction][SemanticsProperties.ImeAction] or
+ *   [OnImeAction] or is not focused).
  */
 fun SemanticsNodeInteraction.performImeAction() {
     val errorOnFail = "Failed to perform IME action."
     assert(hasPerformImeAction()) { errorOnFail }
     assert(!hasImeAction(ImeAction.Default)) { errorOnFail }
-    @OptIn(ExperimentalTestApi::class)
-    invokeGlobalAssertions()
+    @OptIn(ExperimentalTestApi::class) invokeGlobalAssertions()
     val node = getNodeAndFocus(errorOnFail)
 
     wrapAssertionErrorsWithNodeInfo(selector, node) {
@@ -109,8 +101,7 @@
 private fun SemanticsNodeInteraction.getNodeAndFocus(
     errorOnFail: String = "Failed to perform text input."
 ): SemanticsNode {
-    @OptIn(ExperimentalTestApi::class)
-    invokeGlobalAssertions()
+    @OptIn(ExperimentalTestApi::class) invokeGlobalAssertions()
     val node = fetchSemanticsNode(errorOnFail)
     assert(isEnabled()) { errorOnFail }
     assert(hasSetTextAction()) { errorOnFail }
diff --git a/compose/ui/ui-test/src/commonMain/kotlin/androidx/compose/ui/test/TouchInjectionScope.kt b/compose/ui/ui-test/src/commonMain/kotlin/androidx/compose/ui/test/TouchInjectionScope.kt
index 5992018..19ae176 100644
--- a/compose/ui/ui-test/src/commonMain/kotlin/androidx/compose/ui/test/TouchInjectionScope.kt
+++ b/compose/ui/ui-test/src/commonMain/kotlin/androidx/compose/ui/test/TouchInjectionScope.kt
@@ -29,8 +29,8 @@
 /**
  * The receiver scope of the touch input injection lambda from [performTouchInput].
  *
- * The functions in [TouchInjectionScope] can roughly be divided into two groups: full gestures
- * and individual touch events. The individual touch events are: [down], [move] and friends, [up],
+ * The functions in [TouchInjectionScope] can roughly be divided into two groups: full gestures and
+ * individual touch events. The individual touch events are: [down], [move] and friends, [up],
  * [cancel] and [advanceEventTime]. Full gestures are all the other functions, like
  * [click][TouchInjectionScope.click], [doubleClick][TouchInjectionScope.doubleClick],
  * [swipe][TouchInjectionScope.swipe], etc. These are built on top of the individual events and
@@ -38,41 +38,43 @@
  *
  * A touch gesture is started with a [down] event, followed by a sequence of [move] events and
  * finally an [up] event, optionally combined with more sets of [down] and [up] events for
- * multi-touch gestures. Most methods accept a pointerId to specify which pointer (finger) the
- * event applies to. Movement can be expressed absolutely with [moveTo] and [updatePointerTo], or
- * relative to the current pointer position with [moveBy] and [updatePointerBy]. The `moveTo/By`
- * methods enqueue an event immediately, while the `updatePointerTo/By` methods don't. This
- * allows you to update the position of multiple pointers in a single [move] event for
- * multi-touch gestures. Touch gestures can be cancelled with [cancel]. All events, regardless
- * the method used, will always contain the current position of _all_ pointers.
+ * multi-touch gestures. Most methods accept a pointerId to specify which pointer (finger) the event
+ * applies to. Movement can be expressed absolutely with [moveTo] and [updatePointerTo], or relative
+ * to the current pointer position with [moveBy] and [updatePointerBy]. The `moveTo/By` methods
+ * enqueue an event immediately, while the `updatePointerTo/By` methods don't. This allows you to
+ * update the position of multiple pointers in a single [move] event for multi-touch gestures. Touch
+ * gestures can be cancelled with [cancel]. All events, regardless the method used, will always
+ * contain the current position of _all_ pointers.
  *
- * The entire event injection state is shared between all `perform.*Input` methods, meaning you
- * can continue an unfinished touch gesture in a subsequent invocation of [performTouchInput] or
+ * The entire event injection state is shared between all `perform.*Input` methods, meaning you can
+ * continue an unfinished touch gesture in a subsequent invocation of [performTouchInput] or
  * [performMultiModalInput]. Note however that while the pointer positions are retained across
- * invocation of `perform.*Input` methods, they are always manipulated in the current node's
- * local coordinate system. That means that two subsequent invocations of [performTouchInput] on
- * different nodes will report a different [currentPosition], even though it is actually the same
- * position on the screen.
+ * invocation of `perform.*Input` methods, they are always manipulated in the current node's local
+ * coordinate system. That means that two subsequent invocations of [performTouchInput] on different
+ * nodes will report a different [currentPosition], even though it is actually the same position on
+ * the screen.
  *
  * All events sent by these methods are batched together and sent as a whole after
- * [performTouchInput] has executed its code block. Because gestures don't have to be defined all
- * in the same [performTouchInput] block, keep in mind that while the gesture is not complete,
- * all code you execute in between these blocks will be executed while imaginary fingers are
- * actively touching the screen. The events sent as part of the same batch will not be interrupted
- * by recomposition, however, if a gesture spans multiple [performTouchInput] blocks it is
- * important to remember that recomposition, layout and drawing could take place during the
- * gesture, which may lead to events being injected into a moving target. As pointer positions are
- * manipulated in the current node's local coordinate system, this could lead to issues caused by
- * the fact that part of the gesture will take effect before the rest of the events have been
- * enqueued.
+ * [performTouchInput] has executed its code block. Because gestures don't have to be defined all in
+ * the same [performTouchInput] block, keep in mind that while the gesture is not complete, all code
+ * you execute in between these blocks will be executed while imaginary fingers are actively
+ * touching the screen. The events sent as part of the same batch will not be interrupted by
+ * recomposition, however, if a gesture spans multiple [performTouchInput] blocks it is important to
+ * remember that recomposition, layout and drawing could take place during the gesture, which may
+ * lead to events being injected into a moving target. As pointer positions are manipulated in the
+ * current node's local coordinate system, this could lead to issues caused by the fact that part of
+ * the gesture will take effect before the rest of the events have been enqueued.
  *
  * Example of performing a click:
+ *
  * @sample androidx.compose.ui.test.samples.touchInputClick
  *
  * Example of performing a swipe up:
+ *
  * @sample androidx.compose.ui.test.samples.touchInputSwipeUp
  *
  * Example of performing an L-shaped gesture:
+ *
  * @sample androidx.compose.ui.test.samples.touchInputLShapedGesture
  *
  * @see InjectionScope
@@ -81,19 +83,19 @@
 interface TouchInjectionScope : InjectionScope {
     /**
      * Returns the current position of the given [pointerId]. The default [pointerId] is 0. The
-     * position is returned in the local coordinate system of the node with which we're
-     * interacting. (0, 0) is the top left corner of the node.
+     * position is returned in the local coordinate system of the node with which we're interacting.
+     * (0, 0) is the top left corner of the node.
      */
     fun currentPosition(pointerId: Int = 0): Offset?
 
     /**
-     * Sends a down event for the pointer with the given [pointerId] at [position] on the
-     * associated node. The [position] is in the node's local coordinate system, where (0, 0) is
-     * the top left corner of the node.
+     * Sends a down event for the pointer with the given [pointerId] at [position] on the associated
+     * node. The [position] is in the node's local coordinate system, where (0, 0) is the top left
+     * corner of the node.
      *
-     * If no pointers are down yet, this will start a new touch gesture. If a gesture is already
-     * in progress, this event is sent at the same timestamp as the last event. If the given
-     * pointer is already down, an [IllegalArgumentException] will be thrown.
+     * If no pointers are down yet, this will start a new touch gesture. If a gesture is already in
+     * progress, this event is sent at the same timestamp as the last event. If the given pointer is
+     * already down, an [IllegalArgumentException] will be thrown.
      *
      * @param pointerId The id of the pointer, can be any number not yet in use by another pointer
      * @param position The position of the down event, in the node's local coordinate system
@@ -102,12 +104,12 @@
 
     /**
      * Sends a down event for the default pointer at [position] on the associated node. The
-     * [position] is in the node's local coordinate system, where (0, 0) is the top left corner
-     * of the node. The default pointer has `pointerId = 0`.
+     * [position] is in the node's local coordinate system, where (0, 0) is the top left corner of
+     * the node. The default pointer has `pointerId = 0`.
      *
-     * If no pointers are down yet, this will start a new touch gesture. If a gesture is already
-     * in progress, this event is sent at the same timestamp as the last event. If the default
-     * pointer is already down, an [IllegalArgumentException] will be thrown.
+     * If no pointers are down yet, this will start a new touch gesture. If a gesture is already in
+     * progress, this event is sent at the same timestamp as the last event. If the default pointer
+     * is already down, an [IllegalArgumentException] will be thrown.
      *
      * @param position The position of the down event, in the node's local coordinate system
      */
@@ -116,17 +118,16 @@
     }
 
     /**
-     * Sends a move event [delayMillis] after the last sent event on the associated node, with
-     * the position of the pointer with the given [pointerId] updated to [position]. The
-     * [position] is in the node's local coordinate system, where (0, 0) is the top left corner
-     * of the node.
+     * Sends a move event [delayMillis] after the last sent event on the associated node, with the
+     * position of the pointer with the given [pointerId] updated to [position]. The [position] is
+     * in the node's local coordinate system, where (0, 0) is the top left corner of the node.
      *
      * If the pointer is not yet down, an [IllegalArgumentException] will be thrown.
      *
      * @param pointerId The id of the pointer to move, as supplied in [down]
      * @param position The new position of the pointer, in the node's local coordinate system
-     * @param delayMillis The time between the last sent event and this event.
-     * [eventPeriodMillis] by default.
+     * @param delayMillis The time between the last sent event and this event. [eventPeriodMillis]
+     *   by default.
      */
     fun moveTo(pointerId: Int, position: Offset, delayMillis: Long = eventPeriodMillis) {
         updatePointerTo(pointerId, position)
@@ -134,16 +135,16 @@
     }
 
     /**
-     * Sends a move event [delayMillis] after the last sent event on the associated node, with
-     * the position of the default pointer updated to [position]. The [position] is in the node's
-     * local coordinate system, where (0, 0) is the top left corner of the node. The default
-     * pointer has `pointerId = 0`.
+     * Sends a move event [delayMillis] after the last sent event on the associated node, with the
+     * position of the default pointer updated to [position]. The [position] is in the node's local
+     * coordinate system, where (0, 0) is the top left corner of the node. The default pointer has
+     * `pointerId = 0`.
      *
      * If the default pointer is not yet down, an [IllegalArgumentException] will be thrown.
      *
      * @param position The new position of the pointer, in the node's local coordinate system
-     * @param delayMillis The time between the last sent event and this event.
-     * [eventPeriodMillis] by default.
+     * @param delayMillis The time between the last sent event and this event. [eventPeriodMillis]
+     *   by default.
      */
     fun moveTo(position: Offset, delayMillis: Long = eventPeriodMillis) {
         moveTo(0, position, delayMillis)
@@ -151,9 +152,8 @@
 
     /**
      * Updates the position of the pointer with the given [pointerId] to the given [position], but
-     * does not send a move event. The move event can be sent with [move]. The [position] is in
-     * the node's local coordinate system, where (0.px, 0.px) is the top left corner of the
-     * node.
+     * does not send a move event. The move event can be sent with [move]. The [position] is in the
+     * node's local coordinate system, where (0.px, 0.px) is the top left corner of the node.
      *
      * If the pointer is not yet down, an [IllegalArgumentException] will be thrown.
      *
@@ -163,17 +163,17 @@
     fun updatePointerTo(pointerId: Int, position: Offset)
 
     /**
-     * Sends a move event [delayMillis] after the last sent event on the associated node, with
-     * the position of the pointer with the given [pointerId] moved by the given [delta].
+     * Sends a move event [delayMillis] after the last sent event on the associated node, with the
+     * position of the pointer with the given [pointerId] moved by the given [delta].
      *
      * If the pointer is not yet down, an [IllegalArgumentException] will be thrown.
      *
      * @param pointerId The id of the pointer to move, as supplied in [down]
      * @param delta The position for this move event, relative to the current position of the
-     * pointer. For example, `delta = Offset(10.px, -10.px) will add 10.px to the pointer's
-     * x-position, and subtract 10.px from the pointer's y-position.
-     * @param delayMillis The time between the last sent event and this event.
-     * [eventPeriodMillis] by default.
+     *   pointer. For example, `delta = Offset(10.px, -10.px) will add 10.px to the pointer's
+     *   x-position, and subtract 10.px from the pointer's y-position.
+     * @param delayMillis The time between the last sent event and this event. [eventPeriodMillis]
+     *   by default.
      */
     fun moveBy(pointerId: Int, delta: Offset, delayMillis: Long = eventPeriodMillis) {
         updatePointerBy(pointerId, delta)
@@ -181,54 +181,55 @@
     }
 
     /**
-     * Sends a move event [delayMillis] after the last sent event on the associated node, with
-     * the position of the default pointer moved by the given [delta]. The default pointer has
+     * Sends a move event [delayMillis] after the last sent event on the associated node, with the
+     * position of the default pointer moved by the given [delta]. The default pointer has
      * `pointerId = 0`.
      *
      * If the pointer is not yet down, an [IllegalArgumentException] will be thrown.
      *
      * @param delta The position for this move event, relative to the current position of the
-     * pointer. For example, `delta = Offset(10.px, -10.px) will add 10.px to the pointer's
-     * x-position, and subtract 10.px from the pointer's y-position.
-     * @param delayMillis The time between the last sent event and this event.
-     * [eventPeriodMillis] by default.
+     *   pointer. For example, `delta = Offset(10.px, -10.px) will add 10.px to the pointer's
+     *   x-position, and subtract 10.px from the pointer's y-position.
+     * @param delayMillis The time between the last sent event and this event. [eventPeriodMillis]
+     *   by default.
      */
     fun moveBy(delta: Offset, delayMillis: Long = eventPeriodMillis) {
         moveBy(0, delta, delayMillis)
     }
 
     /**
-     * Updates the position of the pointer with the given [pointerId] by the given [delta], but
-     * does not send a move event. The move event can be sent with [move].
+     * Updates the position of the pointer with the given [pointerId] by the given [delta], but does
+     * not send a move event. The move event can be sent with [move].
      *
      * If the pointer is not yet down, an [IllegalArgumentException] will be thrown.
      *
      * @param pointerId The id of the pointer to move, as supplied in [down]
      * @param delta The position for this move event, relative to the last sent position of the
-     * pointer. For example, `delta = Offset(10.px, -10.px) will add 10.px to the pointer's
-     * x-position, and subtract 10.px from the pointer's y-position.
+     *   pointer. For example, `delta = Offset(10.px, -10.px) will add 10.px to the pointer's
+     *   x-position, and subtract 10.px from the pointer's y-position.
      */
     fun updatePointerBy(pointerId: Int, delta: Offset) {
         // Ignore currentPosition of null here, let updatePointerTo generate the error
         val currentPosition = currentPosition(pointerId) ?: Offset.Zero
 
-        val position = if (currentPosition.isValid() && delta.isValid()) {
-            currentPosition + delta
-        } else {
-            // Allows invalid position to still pass back through Compose (for testing)
-            Offset.Unspecified
-        }
+        val position =
+            if (currentPosition.isValid() && delta.isValid()) {
+                currentPosition + delta
+            } else {
+                // Allows invalid position to still pass back through Compose (for testing)
+                Offset.Unspecified
+            }
 
         updatePointerTo(pointerId, position)
     }
 
     /**
      * Sends a move event [delayMillis] after the last sent event without updating any of the
-     * pointer positions. This can be useful when batching movement of multiple pointers
-     * together, which can be done with [updatePointerTo] and [updatePointerBy].
+     * pointer positions. This can be useful when batching movement of multiple pointers together,
+     * which can be done with [updatePointerTo] and [updatePointerBy].
      *
-     * @param delayMillis The time between the last sent event and this event.
-     * [eventPeriodMillis] by default.
+     * @param delayMillis The time between the last sent event and this event. [eventPeriodMillis]
+     *   by default.
      */
     fun move(delayMillis: Long = eventPeriodMillis)
 
@@ -241,13 +242,13 @@
      * @sample androidx.compose.ui.test.samples.touchInputMultiTouchWithHistory
      *
      * @param relativeHistoricalTimes Time of each historical event, as a millisecond relative to
-     * the time the actual event is sent. For example, -10L means 10ms earlier.
+     *   the time the actual event is sent. For example, -10L means 10ms earlier.
      * @param historicalCoordinates Coordinates of each historical event, in the same coordinate
-     * space as [moveTo]. The outer list must have the same size as the number of pointers in the
-     * event, and each inner list must have the same size as [relativeHistoricalTimes]. The `i`th
-     * pointer is assigned the `i`th history, with the pointers sorted on ascending pointerId.
-     * @param delayMillis The time between the last sent event and this event.
-     * [eventPeriodMillis] by default.
+     *   space as [moveTo]. The outer list must have the same size as the number of pointers in the
+     *   event, and each inner list must have the same size as [relativeHistoricalTimes]. The `i`th
+     *   pointer is assigned the `i`th history, with the pointers sorted on ascending pointerId.
+     * @param delayMillis The time between the last sent event and this event. [eventPeriodMillis]
+     *   by default.
      */
     @ExperimentalTestApi
     fun moveWithHistoryMultiPointer(
@@ -266,22 +267,23 @@
      * pointer.
      *
      * @param relativeHistoricalTimes Time of each historical event, as a millisecond relative to
-     * the time the actual event is sent. For example, -10L means 10ms earlier.
+     *   the time the actual event is sent. For example, -10L means 10ms earlier.
      * @param historicalCoordinates Coordinates of each historical event, in the same coordinate
-     * space as [moveTo]. The list must have the same size as [relativeHistoricalTimes].
-     * @param delayMillis The time between the last sent event and this event.
-     * [eventPeriodMillis] by default.
+     *   space as [moveTo]. The list must have the same size as [relativeHistoricalTimes].
+     * @param delayMillis The time between the last sent event and this event. [eventPeriodMillis]
+     *   by default.
      */
     @ExperimentalTestApi
     fun moveWithHistory(
         relativeHistoricalTimes: List<Long>,
         historicalCoordinates: List<Offset>,
         delayMillis: Long = eventPeriodMillis
-    ) = moveWithHistoryMultiPointer(
-        relativeHistoricalTimes,
-        listOf(historicalCoordinates),
-        delayMillis
-    )
+    ) =
+        moveWithHistoryMultiPointer(
+            relativeHistoricalTimes,
+            listOf(historicalCoordinates),
+            delayMillis
+        )
 
     /**
      * Sends an up event for the pointer with the given [pointerId], or the default pointer if
@@ -292,19 +294,20 @@
     fun up(pointerId: Int = 0)
 
     /**
-     * Sends a cancel event [delayMillis] after the last sent event to cancel the current
-     * gesture. The cancel event contains the current position of all active pointers.
+     * Sends a cancel event [delayMillis] after the last sent event to cancel the current gesture.
+     * The cancel event contains the current position of all active pointers.
      *
-     * @param delayMillis The time between the last sent event and this event.
-     * [eventPeriodMillis] by default.
+     * @param delayMillis The time between the last sent event and this event. [eventPeriodMillis]
+     *   by default.
      */
     fun cancel(delayMillis: Long = eventPeriodMillis)
 }
 
-internal class TouchInjectionScopeImpl(
-    private val baseScope: MultiModalInjectionScopeImpl
-) : TouchInjectionScope, InjectionScope by baseScope {
-    private val inputDispatcher get() = baseScope.inputDispatcher
+internal class TouchInjectionScopeImpl(private val baseScope: MultiModalInjectionScopeImpl) :
+    TouchInjectionScope, InjectionScope by baseScope {
+    private val inputDispatcher
+        get() = baseScope.inputDispatcher
+
     private fun localToRoot(position: Offset) = baseScope.localToRoot(position)
 
     override fun currentPosition(pointerId: Int): Offset? {
@@ -361,12 +364,12 @@
 /**
  * Performs a click gesture (aka a tap) on the associated node.
  *
- * The click is done at the given [position], or in the [center] if the [position] is omitted.
- * The [position] is in the node's local coordinate system, where (0, 0) is the top left corner
- * of the node.
+ * The click is done at the given [position], or in the [center] if the [position] is omitted. The
+ * [position] is in the node's local coordinate system, where (0, 0) is the top left corner of the
+ * node.
  *
- * @param position The position where to click, in the node's local coordinate system. If
- * omitted, the [center] of the node will be used.
+ * @param position The position where to click, in the node's local coordinate system. If omitted,
+ *   the [center] of the node will be used.
  */
 fun TouchInjectionScope.click(position: Offset = center) {
     down(position)
@@ -377,13 +380,13 @@
 /**
  * Performs a long click gesture (aka a long press) on the associated node.
  *
- * The long click is done at the given [position], or in the [center] if the [position] is
- * omitted. By default, the [durationMillis] of the press is 100ms longer than the minimum
- * required duration for a long press. The [position] is in the node's local coordinate system,
- * where (0, 0) is the top left corner of the node.
+ * The long click is done at the given [position], or in the [center] if the [position] is omitted.
+ * By default, the [durationMillis] of the press is 100ms longer than the minimum required duration
+ * for a long press. The [position] is in the node's local coordinate system, where (0, 0) is the
+ * top left corner of the node.
  *
  * @param position The position of the long click, in the node's local coordinate system. If
- * omitted, the [center] of the node will be used.
+ *   omitted, the [center] of the node will be used.
  * @param durationMillis The time between the down and the up event
  */
 fun TouchInjectionScope.longClick(
@@ -403,15 +406,15 @@
 /**
  * Performs a double click gesture (aka a double tap) on the associated node.
  *
- * The double click is done at the given [position] or in the [center] if the [position] is
- * omitted. By default, the [delayMillis] between the first and the second click is half way in
- * between the minimum and maximum required delay for a double click. The [position] is in the
- * node's local coordinate system, where (0, 0) is the top left corner of the node.
+ * The double click is done at the given [position] or in the [center] if the [position] is omitted.
+ * By default, the [delayMillis] between the first and the second click is half way in between the
+ * minimum and maximum required delay for a double click. The [position] is in the node's local
+ * coordinate system, where (0, 0) is the top left corner of the node.
  *
- * @param position The position of the double click, in the node's local coordinate system.
- * If omitted, the [center] position will be used.
+ * @param position The position of the double click, in the node's local coordinate system. If
+ *   omitted, the [center] position will be used.
  * @param delayMillis The time between the up event of the first click and the down event of the
- * second click
+ *   second click
  */
 fun TouchInjectionScope.doubleClick(
     position: Offset = center,
@@ -433,24 +436,17 @@
 /**
  * Performs a swipe gesture on the associated node.
  *
- * The motion events are linearly interpolated between [start] and [end]. The coordinates are in
- * the node's local coordinate system, where (0, 0) is the top left corner of the node. The
- * default duration is 200 milliseconds.
+ * The motion events are linearly interpolated between [start] and [end]. The coordinates are in the
+ * node's local coordinate system, where (0, 0) is the top left corner of the node. The default
+ * duration is 200 milliseconds.
  *
  * @param start The start position of the gesture, in the node's local coordinate system
  * @param end The end position of the gesture, in the node's local coordinate system
  * @param durationMillis The duration of the gesture
  */
-fun TouchInjectionScope.swipe(
-    start: Offset,
-    end: Offset,
-    durationMillis: Long = 200
-) {
+fun TouchInjectionScope.swipe(start: Offset, end: Offset, durationMillis: Long = 200) {
     val durationFloat = durationMillis.toFloat()
-    swipe(
-        curve = { lerp(start, end, it / durationFloat) },
-        durationMillis = durationMillis
-    )
+    swipe(curve = { lerp(start, end, it / durationFloat) }, durationMillis = durationMillis)
 }
 
 /**
@@ -459,39 +455,38 @@
  * The swipe follows the [curve] from 0 till [durationMillis]. Will force sampling of an event at
  * all times defined in [keyTimes]. The time between events is kept as close to
  * [eventPeriodMillis][InjectionScope.eventPeriodMillis] as possible, given the constraints. The
- * coordinates are in the node's local coordinate system, where (0, 0) is the top left corner of
- * the node. The default duration is 200 milliseconds.
+ * coordinates are in the node's local coordinate system, where (0, 0) is the top left corner of the
+ * node. The default duration is 200 milliseconds.
  *
  * @param curve The function that defines the position of the gesture over time
  * @param durationMillis The duration of the gesture
- * @param keyTimes An optional list of timestamps in milliseconds at which a move event must
- * be sampled
+ * @param keyTimes An optional list of timestamps in milliseconds at which a move event must be
+ *   sampled
  */
 fun TouchInjectionScope.swipe(
     curve: (Long) -> Offset,
     durationMillis: Long = 200,
     keyTimes: List<Long> = emptyList()
 ) {
-    @OptIn(ExperimentalTestApi::class)
-    multiTouchSwipe(listOf(curve), durationMillis, keyTimes)
+    @OptIn(ExperimentalTestApi::class) multiTouchSwipe(listOf(curve), durationMillis, keyTimes)
 }
 
 /**
  * Performs a multi touch swipe gesture on the associated node.
  *
- * Each pointer follows [curves]&#91;i] from 0 till [durationMillis]. Sampling of an event is
- * forced at all times defined in [keyTimes]. The time between events is kept as close to
+ * Each pointer follows [curves]&#91;i] from 0 till [durationMillis]. Sampling of an event is forced
+ * at all times defined in [keyTimes]. The time between events is kept as close to
  * [eventPeriodMillis][InjectionScope.eventPeriodMillis] as possible, given the constraints. The
- * coordinates are in the node's local coordinate system, where (0, 0) is the top left corner of
- * the node. The default duration is 200 milliseconds.
+ * coordinates are in the node's local coordinate system, where (0, 0) is the top left corner of the
+ * node. The default duration is 200 milliseconds.
  *
- * Will stay experimental until support has been added to start and end each pointer at
- * different times.
+ * Will stay experimental until support has been added to start and end each pointer at different
+ * times.
  *
  * @param curves The functions that define the position of the gesture over time
  * @param durationMillis The duration of the gesture
- * @param keyTimes An optional list of timestamps in milliseconds at which a move event must
- * be sampled
+ * @param keyTimes An optional list of timestamps in milliseconds at which a move event must be
+ *   sampled
  */
 @ExperimentalTestApi
 fun TouchInjectionScope.multiTouchSwipe(
@@ -503,9 +498,7 @@
     val endTime = durationMillis
 
     // Validate input
-    require(durationMillis >= 1) {
-        "duration must be at least 1 millisecond, not $durationMillis"
-    }
+    require(durationMillis >= 1) { "duration must be at least 1 millisecond, not $durationMillis" }
     val validRange = startTime..endTime
     require(keyTimes.all { it in validRange }) {
         "keyTimes contains timestamps out of range [$startTime..$endTime]: $keyTimes"
@@ -515,9 +508,7 @@
     }
 
     // Send down events
-    curves.forEachIndexed { i, curve ->
-        down(i, curve(startTime))
-    }
+    curves.forEachIndexed { i, curve -> down(i, curve(startTime)) }
 
     // Send move events between each consecutive pair in [t0, ..keyTimes, tN]
     var currTime = startTime
@@ -534,15 +525,13 @@
     }
 
     // And end with up events
-    repeat(curves.size) {
-        up(it)
-    }
+    repeat(curves.size) { up(it) }
 }
 
 /**
- * Generates move events between `f([t0])` and `f([tN])` during the time window `(t0, tN]`, for
- * each `f` in [fs], following the curves defined by each `f`. The number of events sent
- * (#numEvents) is such that the time between each event is as close to
+ * Generates move events between `f([t0])` and `f([tN])` during the time window `(t0, tN]`, for each
+ * `f` in [fs], following the curves defined by each `f`. The number of events sent (#numEvents) is
+ * such that the time between each event is as close to
  * [eventPeriodMillis][InputDispatcher.eventPeriodMillis] as possible, but at least 1. The first
  * event is sent at time `downTime + (tN - t0) / #numEvents`, the last event is sent at time tN.
  *
@@ -564,9 +553,7 @@
     while (step++ < steps) {
         val progress = step / steps.toFloat()
         val t = lerp(t0, tN, progress)
-        fs.forEachIndexed { i, f ->
-            updatePointerTo(i, f(t))
-        }
+        fs.forEachIndexed { i, f -> updatePointerTo(i, f(t)) }
         move(t - tPrev)
         tPrev = t
     }
@@ -576,8 +563,8 @@
  * Performs a pinch gesture on the associated node.
  *
  * For each pair of start and end [Offset]s, the motion events are linearly interpolated. The
- * coordinates are in the node's local coordinate system where (0, 0) is the top left corner of
- * the node. The default duration is 400 milliseconds.
+ * coordinates are in the node's local coordinate system where (0, 0) is the top left corner of the
+ * node. The default duration is 400 milliseconds.
  *
  * @param start0 The start position of the first gesture in the node's local coordinate system
  * @param end0 The end position of the first gesture in the node's local coordinate system
@@ -606,29 +593,28 @@
 /**
  * Performs a swipe gesture on the associated node such that it ends with the given [endVelocity].
  *
- * The swipe will go through [start] at t=0 and through [end] at t=[durationMillis]. In between,
- * the swipe will go monotonically from [start] and [end], but not strictly. Due to imprecision,
- * no guarantees can be made for the actual velocity at the end of the gesture, but generally it
- * is within 0.1 of the desired velocity.
+ * The swipe will go through [start] at t=0 and through [end] at t=[durationMillis]. In between, the
+ * swipe will go monotonically from [start] and [end], but not strictly. Due to imprecision, no
+ * guarantees can be made for the actual velocity at the end of the gesture, but generally it is
+ * within 0.1 of the desired velocity.
  *
  * When a swipe cannot be created that results in the desired velocity (because the input is too
  * restrictive), an exception will be thrown with suggestions to fix the input.
  *
- * The coordinates are in the node's local coordinate system, where (0, 0) is the top left corner
- * of the node. The default duration is calculated such that a feasible swipe can be created that
- * ends in the given velocity.
+ * The coordinates are in the node's local coordinate system, where (0, 0) is the top left corner of
+ * the node. The default duration is calculated such that a feasible swipe can be created that ends
+ * in the given velocity.
  *
  * @param start The start position of the gesture, in the node's local coordinate system
  * @param end The end position of the gesture, in the node's local coordinate system
  * @param endVelocity The velocity of the gesture at the moment it ends in px/second. Must be
- * positive.
+ *   positive.
  * @param durationMillis The duration of the gesture in milliseconds. Must be long enough that at
- * least 3 input events are generated, which happens with a duration of 40ms or more. If omitted,
- * a duration is calculated such that a valid swipe with velocity can be created.
- *
+ *   least 3 input events are generated, which happens with a duration of 40ms or more. If omitted,
+ *   a duration is calculated such that a valid swipe with velocity can be created.
  * @throws IllegalArgumentException When no swipe can be generated that will result in the desired
- * velocity. The error message will suggest changes to the input parameters such that a swipe
- * will become feasible.
+ *   velocity. The error message will suggest changes to the input parameters such that a swipe will
+ *   become feasible.
  */
 fun TouchInjectionScope.swipeWithVelocity(
     start: Offset,
@@ -637,9 +623,7 @@
     endVelocity: Float,
     durationMillis: Long = VelocityPathFinder.calculateDefaultDuration(start, end, endVelocity)
 ) {
-    require(endVelocity >= 0f) {
-        "Velocity cannot be $endVelocity, it must be positive"
-    }
+    require(endVelocity >= 0f) { "Velocity cannot be $endVelocity, it must be positive" }
     require(eventPeriodMillis < 40) {
         "InputDispatcher.eventPeriod must be smaller than 40ms in order to generate velocities"
     }
@@ -650,9 +634,7 @@
     }
 
     val pathFinder = VelocityPathFinder(start, end, endVelocity, durationMillis)
-    val swipeFunction: (Long) -> Offset = {
-        pathFinder.calculateOffsetForTime(it)
-    }
+    val swipeFunction: (Long) -> Offset = { pathFinder.calculateOffsetForTime(it) }
     swipe(swipeFunction, durationMillis)
 }
 
@@ -661,9 +643,9 @@
  * [endY], taking [durationMillis] milliseconds.
  *
  * @param startY The y-coordinate of the start of the swipe. Must be greater than or equal to the
- * [endY]. By default the [bottom] of the node.
- * @param endY The y-coordinate of the end of the swipe. Must be less than or equal to the
- * [startY]. By default the [top] of the node.
+ *   [endY]. By default the [bottom] of the node.
+ * @param endY The y-coordinate of the end of the swipe. Must be less than or equal to the [startY].
+ *   By default the [top] of the node.
  * @param durationMillis The duration of the swipe. By default 200 milliseconds.
  */
 fun TouchInjectionScope.swipeUp(
@@ -671,9 +653,7 @@
     endY: Float = top,
     durationMillis: Long = 200
 ) {
-    require(startY >= endY) {
-        "startY=$startY needs to be greater than or equal to endY=$endY"
-    }
+    require(startY >= endY) { "startY=$startY needs to be greater than or equal to endY=$endY" }
     val start = Offset(centerX, startY)
     val end = Offset(centerX, endY)
     swipe(start, end, durationMillis)
@@ -684,9 +664,9 @@
  * [endY], taking [durationMillis] milliseconds.
  *
  * @param startY The y-coordinate of the start of the swipe. Must be less than or equal to the
- * [endY]. By default the [top] of the node.
+ *   [endY]. By default the [top] of the node.
  * @param endY The y-coordinate of the end of the swipe. Must be greater than or equal to the
- * [startY]. By default the [bottom] of the node.
+ *   [startY]. By default the [bottom] of the node.
  * @param durationMillis The duration of the swipe. By default 200 milliseconds.
  */
 fun TouchInjectionScope.swipeDown(
@@ -694,9 +674,7 @@
     endY: Float = bottom,
     durationMillis: Long = 200
 ) {
-    require(startY <= endY) {
-        "startY=$startY needs to be less than or equal to endY=$endY"
-    }
+    require(startY <= endY) { "startY=$startY needs to be less than or equal to endY=$endY" }
     val start = Offset(centerX, startY)
     val end = Offset(centerX, endY)
     swipe(start, end, durationMillis)
@@ -707,9 +685,9 @@
  * [endX], taking [durationMillis] milliseconds.
  *
  * @param startX The x-coordinate of the start of the swipe. Must be greater than or equal to the
- * [endX]. By default the [right] of the node.
- * @param endX The x-coordinate of the end of the swipe. Must be less than or equal to the
- * [startX]. By default the [left] of the node.
+ *   [endX]. By default the [right] of the node.
+ * @param endX The x-coordinate of the end of the swipe. Must be less than or equal to the [startX].
+ *   By default the [left] of the node.
  * @param durationMillis The duration of the swipe. By default 200 milliseconds.
  */
 fun TouchInjectionScope.swipeLeft(
@@ -717,22 +695,20 @@
     endX: Float = left,
     durationMillis: Long = 200
 ) {
-    require(startX >= endX) {
-        "startX=$startX needs to be greater than or equal to endX=$endX"
-    }
+    require(startX >= endX) { "startX=$startX needs to be greater than or equal to endX=$endX" }
     val start = Offset(startX, centerY)
     val end = Offset(endX, centerY)
     swipe(start, end, durationMillis)
 }
 
 /**
- * Performs a swipe right gesture along `y = [centerY]` of the associated node, from [startX]
- * till [endX], taking [durationMillis] milliseconds.
+ * Performs a swipe right gesture along `y = [centerY]` of the associated node, from [startX] till
+ * [endX], taking [durationMillis] milliseconds.
  *
  * @param startX The x-coordinate of the start of the swipe. Must be less than or equal to the
- * [endX]. By default the [left] of the node.
+ *   [endX]. By default the [left] of the node.
  * @param endX The x-coordinate of the end of the swipe. Must be greater than or equal to the
- * [startX]. By default the [right] of the node.
+ *   [startX]. By default the [right] of the node.
  * @param durationMillis The duration of the swipe. By default 200 milliseconds.
  */
 fun TouchInjectionScope.swipeRight(
@@ -740,9 +716,7 @@
     endX: Float = right,
     durationMillis: Long = 200
 ) {
-    require(startX <= endX) {
-        "startX=$startX needs to be less than or equal to endX=$endX"
-    }
+    require(startX <= endX) { "startX=$startX needs to be less than or equal to endX=$endX" }
     val start = Offset(startX, centerY)
     val end = Offset(endX, centerY)
     swipe(start, end, durationMillis)
diff --git a/compose/ui/ui-test/src/commonMain/kotlin/androidx/compose/ui/test/Utils.kt b/compose/ui/ui-test/src/commonMain/kotlin/androidx/compose/ui/test/Utils.kt
index 90535cb..1bf1ff4 100644
--- a/compose/ui/ui-test/src/commonMain/kotlin/androidx/compose/ui/test/Utils.kt
+++ b/compose/ui/ui-test/src/commonMain/kotlin/androidx/compose/ui/test/Utils.kt
@@ -20,8 +20,8 @@
 
 /**
  * Executes [selector] on every parent of this [SemanticsNode] and returns the closest
- * [SemanticsNode] to return `true` from [selector] or null if [selector] returns false
- * for all ancestors.
+ * [SemanticsNode] to return `true` from [selector] or null if [selector] returns false for all
+ * ancestors.
  *
  * @param includeSelf Whether it should include self into the search.
  */
diff --git a/compose/ui/ui-test/src/commonMain/kotlin/androidx/compose/ui/test/VelocityPathFinder.kt b/compose/ui/ui-test/src/commonMain/kotlin/androidx/compose/ui/test/VelocityPathFinder.kt
index 4f2e2da..7bf3dfa 100644
--- a/compose/ui/ui-test/src/commonMain/kotlin/androidx/compose/ui/test/VelocityPathFinder.kt
+++ b/compose/ui/ui-test/src/commonMain/kotlin/androidx/compose/ui/test/VelocityPathFinder.kt
@@ -46,9 +46,7 @@
          * requirements, and [IllegalArgumentException] is thrown.
          */
         fun calculateDefaultDuration(start: Offset, end: Offset, endVelocity: Float): Long {
-            require(endVelocity >= 0f) {
-                "Velocity cannot be $endVelocity, it must be positive"
-            }
+            require(endVelocity >= 0f) { "Velocity cannot be $endVelocity, it must be positive" }
             require(start != end || endVelocity == 0f) {
                 "When start == end; velocity cannot be $endVelocity, it must be 0f"
             }
@@ -145,9 +143,7 @@
         val T = durationMillis
 
         if (start == end) {
-            require(abs(velocity) < 0.1) {
-                "Can't have matching positions, but nonzero velocity"
-            }
+            require(abs(velocity) < 0.1) { "Can't have matching positions, but nonzero velocity" }
             return start
         }
 
@@ -169,9 +165,7 @@
                 time == 0L -> start
                 time < (T - HorizonMilliseconds) ->
                     start + (positionAtHorizonStart - start) / (T - HorizonMilliseconds) * time
-
-                else ->
-                    end - (T - time) * velocity.toFloat()
+                else -> end - (T - time) * velocity.toFloat()
             }
         }
 
@@ -191,10 +185,10 @@
                 return when {
                     time < T - HorizonMilliseconds ->
                         start + (xHorizon - start) / (T - HorizonMilliseconds) * time
-
                     else ->
-                        xHorizon + (end - xHorizon) / (HorizonMilliseconds) *
-                            (time - (T - HorizonMilliseconds))
+                        xHorizon +
+                            (end - xHorizon) / (HorizonMilliseconds) *
+                                (time - (T - HorizonMilliseconds))
                 }
             }
             // Move the 'start' coordinate to a time of 'T-HorizonMilliseconds'. Therefore, we will
@@ -207,7 +201,11 @@
                     time < T - HorizonMilliseconds -> start
                     else ->
                         computePosition(
-                            start, end, HorizonMilliseconds, d, x,
+                            start,
+                            end,
+                            HorizonMilliseconds,
+                            d,
+                            x,
                             time - (T - HorizonMilliseconds)
                         )
                 }
@@ -222,33 +220,40 @@
     }
 
     /**
-     * Compute the position at time t when the path is piecewise defined as 2 lines:
-     * one from (0, start) -> (d, x)
-     * and another from (d, x) -> (T, end)
+     * Compute the position at time t when the path is piecewise defined as 2 lines: one from (0,
+     * start) -> (d, x) and another from (d, x) -> (T, end)
+     *
      * @param start Position where the curve starts.
      * @param end Position where the curve ends.
      * @param T Time at end position.
      * @param d Time at the end of the first piecewise line (and start of the second line).
      * @param x Position at the end of the first piecewise line (and start of the second line).
      * @param t The time in which we're interested to calculate this position at, given a time based
-     * curve, one of the point in this curve.
+     *   curve, one of the point in this curve.
      */
-    private fun computePosition(start: Float, end: Float, T: Long, d: Long, x: Float, t: Long):
-        Float {
-        require(t in 0L..T) {
-            "You must provide 0 <= t <= $T, but received t=$t instead"
-        }
+    private fun computePosition(
+        start: Float,
+        end: Float,
+        T: Long,
+        d: Long,
+        x: Float,
+        t: Long
+    ): Float {
+        require(t in 0L..T) { "You must provide 0 <= t <= $T, but received t=$t instead" }
         if (t < d) {
             return start + (x - start) / d * t
         }
         return end - (end - x) / (T - d) * (T - t)
     }
 
-    /**
-     * Inject a 2-line path into VelocityTracker and find the resulting velocity.
-     */
-    private fun calculateVelocityFullPath(start: Float, end: Float, T: Long, d: Long, x: Float):
-        Float {
+    /** Inject a 2-line path into VelocityTracker and find the resulting velocity. */
+    private fun calculateVelocityFullPath(
+        start: Float,
+        end: Float,
+        T: Long,
+        d: Long,
+        x: Float
+    ): Float {
         val vt = VelocityTracker()
 
         vt.addPosition(0, Offset(start, 0f))
@@ -269,8 +274,12 @@
      * Numerically find a path that best provides a motion that results in the velocity of
      * targetVelocity.
      */
-    private fun searchPath(start: Float, end: Float, T: Long, targetVelocity: Float):
-        FittingResult? {
+    private fun searchPath(
+        start: Float,
+        end: Float,
+        T: Long,
+        targetVelocity: Float
+    ): FittingResult? {
         val TOLERANCE = 1f
         val step = (max(end, start) - min(end, start)) / 1000f
         for (d in 1 until T) {
@@ -319,30 +328,24 @@
     }
 
     /**
-     * Generates a function f(t) where `f(0) = start`, `f(T) = end`, and the polynomial fit over
-     * the last 100ms is of the form `f(t) = a*(t-T)^2 + b*(t-T) + c`, with
-     * `start = [startPosition]`, `end = [endPosition])`,
-     * `b = [velocity]` and `T = [durationMillis]`. Note that this implies `f'(T) = [velocity]`.
+     * Generates a function f(t) where `f(0) = start`, `f(T) = end`, and the polynomial fit over the
+     * last 100ms is of the form `f(t) = a*(t-T)^2 + b*(t-T) + c`, with `start = [startPosition]`,
+     * `end = [endPosition])`, `b = [velocity]` and `T = [durationMillis]`. Note that this implies
+     * `f'(T) = [velocity]`.
      *
      * There are three different shapes that the function can take: a flat line, a flat line
-     * followed by a parabola that starts with `f'(t) = 0`, or a parabola that starts with
-     * `f'(0) > 0`.
-     *
-     * 1. Flat line:
-     * This happens when start == end and requires that the requested velocity is 0.
-     *
-     * 2. Flat line followed by a parabola:
-     * This happens when there is a parabola that satisfies `f(t_d) = start`, `f'(t_d) = 0`,
-     * `f'(T) = velocity` and `t_d >= 0`. The gesture will wait at the start location until t_d
-     * and then follow that parabola till `f(T) = end`.
-     *
-     * 3. Parabola that starts with `f'(0) > 0`:
-     * If there is a parabola that satisfies `f(t_d) = start`, `f'(t_d) = 0`, `f'(T) = velocity`,
-     * but `t_d < 0`; or if `velocity = 0` (in which case the previously mentioned parabola
-     * doesn't exist); we can't follow that parabola because we'd have to start following it in
-     * the past (`t_d < 0`). Instead, it can be shown that in this case we can always create a
-     * parabola that satisfies `f(0) = start`, `f(T) = end` and `f'(T) = velocity`. This parabola
-     * will have `f'(0) > 0`.
+     * followed by a parabola that starts with `f'(t) = 0`, or a parabola that starts with `f'(0) >
+     * 0`.
+     * 1. Flat line: This happens when start == end and requires that the requested velocity is 0.
+     * 2. Flat line followed by a parabola: This happens when there is a parabola that satisfies
+     *    `f(t_d) = start`, `f'(t_d) = 0`, `f'(T) = velocity` and `t_d >= 0`. The gesture will wait
+     *    at the start location until t_d and then follow that parabola till `f(T) = end`.
+     * 3. Parabola that starts with `f'(0) > 0`: If there is a parabola that satisfies `f(t_d) =
+     *    start`, `f'(t_d) = 0`, `f'(T) = velocity`, but `t_d < 0`; or if `velocity = 0` (in which
+     *    case the previously mentioned parabola doesn't exist); we can't follow that parabola
+     *    because we'd have to start following it in the past (`t_d < 0`). Instead, it can be shown
+     *    that in this case we can always create a parabola that satisfies `f(0) = start`, `f(T) =
+     *    end` and `f'(T) = velocity`. This parabola will have `f'(0) > 0`.
      *
      * In the calculations below, instead of calculating t_d, we calculate `d = T - t_d`, and
      * immediately cap it to T.
@@ -358,11 +361,12 @@
         val T = durationMillis
         // `d = T - t_d` in scenario 2 (see documentation above)
         // `d = T` in scenario 1 and 3 (see documentation above)
-        val d = if (start == end) {
-            T.toDouble()
-        } else {
-            min(T.toDouble(), 2 / velocity * (end - start))
-        }
+        val d =
+            if (start == end) {
+                T.toDouble()
+            } else {
+                min(T.toDouble(), 2 / velocity * (end - start))
+            }
         val a = (start + velocity * d - end) / (d * d)
 
         require(d >= min(T, HorizonMilliseconds)) {
diff --git a/compose/ui/ui-test/src/commonMain/kotlin/androidx/compose/ui/test/internal/DelayPropagatingContinuationInterceptorWrapper.kt b/compose/ui/ui-test/src/commonMain/kotlin/androidx/compose/ui/test/internal/DelayPropagatingContinuationInterceptorWrapper.kt
index 04e18b5..50c0cb7 100644
--- a/compose/ui/ui-test/src/commonMain/kotlin/androidx/compose/ui/test/internal/DelayPropagatingContinuationInterceptorWrapper.kt
+++ b/compose/ui/ui-test/src/commonMain/kotlin/androidx/compose/ui/test/internal/DelayPropagatingContinuationInterceptorWrapper.kt
@@ -39,7 +39,8 @@
 @InternalTestApi
 abstract class DelayPropagatingContinuationInterceptorWrapper(
     wrappedInterceptor: ContinuationInterceptor?
-) : AbstractCoroutineContextElement(ContinuationInterceptor),
+) :
+    AbstractCoroutineContextElement(ContinuationInterceptor),
     ContinuationInterceptor,
     // Coroutines will internally use the Default dispatcher as the delay if the
     // ContinuationInterceptor does not implement Delay.
diff --git a/compose/ui/ui-test/src/desktopMain/kotlin/androidx/compose/ui/test/Actions.desktop.kt b/compose/ui/ui-test/src/desktopMain/kotlin/androidx/compose/ui/test/Actions.desktop.kt
index 0de0dbb..cdf96b4 100644
--- a/compose/ui/ui-test/src/desktopMain/kotlin/androidx/compose/ui/test/Actions.desktop.kt
+++ b/compose/ui/ui-test/src/desktopMain/kotlin/androidx/compose/ui/test/Actions.desktop.kt
@@ -18,7 +18,5 @@
 
 internal actual fun SemanticsNodeInteraction.performClickImpl(): SemanticsNodeInteraction {
     // TODO: Replace with performMouseInput when desktop has a mouse implementation
-    return performTouchInput {
-        click()
-    }
+    return performTouchInput { click() }
 }
diff --git a/compose/ui/ui-test/src/desktopMain/kotlin/androidx/compose/ui/test/ComposeUiTest.desktop.kt b/compose/ui/ui-test/src/desktopMain/kotlin/androidx/compose/ui/test/ComposeUiTest.desktop.kt
index 5ee58ae..ef37467 100644
--- a/compose/ui/ui-test/src/desktopMain/kotlin/androidx/compose/ui/test/ComposeUiTest.desktop.kt
+++ b/compose/ui/ui-test/src/desktopMain/kotlin/androidx/compose/ui/test/ComposeUiTest.desktop.kt
@@ -41,14 +41,13 @@
 
 /**
  * @param effectContext The [CoroutineContext] used to run the composition. The context for
- * `LaunchedEffect`s and `rememberCoroutineScope` will be derived from this context.
+ *   `LaunchedEffect`s and `rememberCoroutineScope` will be derived from this context.
  */
 @InternalTestApi
 @ExperimentalTestApi
 @OptIn(ExperimentalCoroutinesApi::class)
-class DesktopComposeUiTest(
-    effectContext: CoroutineContext = EmptyCoroutineContext
-) : ComposeUiTest {
+class DesktopComposeUiTest(effectContext: CoroutineContext = EmptyCoroutineContext) :
+    ComposeUiTest {
 
     override val density = Density(1f, 1f)
 
@@ -57,19 +56,17 @@
     override val mainClock: MainTestClock =
         MainTestClockImpl(coroutineDispatcher.scheduler, frameDelayMillis = 16L)
     private val uncaughtExceptionHandler = UncaughtExceptionHandler()
-    private val infiniteAnimationPolicy = object : InfiniteAnimationPolicy {
-        override suspend fun <R> onInfiniteOperation(block: suspend () -> R): R {
-            if (mainClock.autoAdvance) {
-                throw CancellationException("Infinite animations are disabled on tests")
+    private val infiniteAnimationPolicy =
+        object : InfiniteAnimationPolicy {
+            override suspend fun <R> onInfiniteOperation(block: suspend () -> R): R {
+                if (mainClock.autoAdvance) {
+                    throw CancellationException("Infinite animations are disabled on tests")
+                }
+                return block()
             }
-            return block()
         }
-    }
     private val coroutineContext =
-        effectContext +
-            coroutineDispatcher +
-            uncaughtExceptionHandler +
-            infiniteAnimationPolicy
+        effectContext + coroutineDispatcher + uncaughtExceptionHandler + infiniteAnimationPolicy
 
     private val surface = Surface.makeRasterN32Premul(1024, 768)
 
@@ -84,33 +81,26 @@
             return block()
         } finally {
             // call runTest instead of deprecated cleanupTestCoroutines()
-            testScope.runTest { }
+            testScope.runTest {}
             runOnUiThread(scene::close)
             uncaughtExceptionHandler.throwUncaught()
         }
     }
 
     private fun renderNextFrame() = runOnUiThread {
-        scene.render(
-            surface.canvas,
-            mainClock.currentTime * 1_000_000
-        )
+        scene.render(surface.canvas, mainClock.currentTime * 1_000_000)
         if (mainClock.autoAdvance) {
             mainClock.advanceTimeByFrame()
         }
     }
 
-    private fun createUi() = ComposeScene(
-        density = density,
-        coroutineContext = coroutineContext,
-        invalidate = { }
-    ).apply {
-        constraints = Constraints(maxWidth = surface.width, maxHeight = surface.height)
-    }
+    private fun createUi() =
+        ComposeScene(density = density, coroutineContext = coroutineContext, invalidate = {})
+            .apply {
+                constraints = Constraints(maxWidth = surface.width, maxHeight = surface.height)
+            }
 
-    private fun isIdle() =
-        !Snapshot.current.hasPendingChanges() &&
-            !scene.hasInvalidations()
+    private fun isIdle() = !Snapshot.current.hasPendingChanges() && !scene.hasInvalidations()
 
     override fun waitForIdle() {
         // always check even if we are idle
@@ -171,9 +161,7 @@
         if (isOnUiThread()) {
             scene.setContent(content = composable)
         } else {
-            runOnUiThread {
-                scene.setContent(content = composable)
-            }
+            runOnUiThread { scene.setContent(content = composable) }
 
             // Only wait for idleness if not on the UI thread. If we are on the UI thread, the
             // caller clearly wants to keep tight control over execution order, so don't go
@@ -213,8 +201,8 @@
             return this@DesktopComposeUiTest.scene.roots
         }
 
-        override val mainClock get() =
-            this@DesktopComposeUiTest.mainClock
+        override val mainClock
+            get() = this@DesktopComposeUiTest.mainClock
     }
 }
 
@@ -222,16 +210,24 @@
 actual sealed interface ComposeUiTest : SemanticsNodeInteractionsProvider {
     actual val density: Density
     actual val mainClock: MainTestClock
+
     actual fun <T> runOnUiThread(action: () -> T): T
+
     actual fun <T> runOnIdle(action: () -> T): T
+
     actual fun waitForIdle()
+
     actual suspend fun awaitIdle()
+
     actual fun waitUntil(
         conditionDescription: String?,
         timeoutMillis: Long,
         condition: () -> Boolean
     )
+
     actual fun registerIdlingResource(idlingResource: IdlingResource)
+
     actual fun unregisterIdlingResource(idlingResource: IdlingResource)
+
     actual fun setContent(composable: @Composable () -> Unit)
 }
diff --git a/compose/ui/ui-test/src/desktopMain/kotlin/androidx/compose/ui/test/DesktopInputDispatcher.desktop.kt b/compose/ui/ui-test/src/desktopMain/kotlin/androidx/compose/ui/test/DesktopInputDispatcher.desktop.kt
index 9514264..eb4ede5 100644
--- a/compose/ui/ui-test/src/desktopMain/kotlin/androidx/compose/ui/test/DesktopInputDispatcher.desktop.kt
+++ b/compose/ui/ui-test/src/desktopMain/kotlin/androidx/compose/ui/test/DesktopInputDispatcher.desktop.kt
@@ -33,10 +33,8 @@
     return DesktopInputDispatcher(testContext, root as SkiaRootForTest)
 }
 
-internal class DesktopInputDispatcher(
-    testContext: TestContext,
-    val root: SkiaRootForTest
-) : InputDispatcher(testContext, root) {
+internal class DesktopInputDispatcher(testContext: TestContext, val root: SkiaRootForTest) :
+    InputDispatcher(testContext, root) {
     companion object {
         var gesturePointerId = 0L
     }
@@ -49,6 +47,7 @@
         isMousePressed = true
         enqueueEvent(pointerInputEvent(isMousePressed))
     }
+
     override fun PartialGesture.enqueueMove() {
         enqueueEvent(pointerInputEvent(isMousePressed))
     }
@@ -121,14 +120,8 @@
     private fun PartialGesture.pointerInputEvent(down: Boolean): List<TestPointerInputEventData> {
         val time = currentTime
         val offset = lastPositions[lastPositions.keys.sorted()[0]]!!
-        val event = listOf(
-            TestPointerInputEventData(
-                PointerId(gesturePointerId),
-                time,
-                offset,
-                down
-            )
-        )
+        val event =
+            listOf(TestPointerInputEventData(PointerId(gesturePointerId), time, offset, down))
         return event
     }
 
diff --git a/compose/ui/ui-test/src/desktopMain/kotlin/androidx/compose/ui/test/DesktopSynchronization.desktop.kt b/compose/ui/ui-test/src/desktopMain/kotlin/androidx/compose/ui/test/DesktopSynchronization.desktop.kt
index 333d62d..740437a 100644
--- a/compose/ui/ui-test/src/desktopMain/kotlin/androidx/compose/ui/test/DesktopSynchronization.desktop.kt
+++ b/compose/ui/ui-test/src/desktopMain/kotlin/androidx/compose/ui/test/DesktopSynchronization.desktop.kt
@@ -39,9 +39,7 @@
     }
 }
 
-/**
- * Returns if the call is made on the main thread.
- */
+/** Returns if the call is made on the main thread. */
 internal fun isOnUiThread(): Boolean {
     return SwingUtilities.isEventDispatchThread()
 }
diff --git a/compose/ui/ui-test/src/desktopMain/kotlin/androidx/compose/ui/test/DeviceConfigurationOverride.desktop.kt b/compose/ui/ui-test/src/desktopMain/kotlin/androidx/compose/ui/test/DeviceConfigurationOverride.desktop.kt
index 1548900..b2fbbac 100644
--- a/compose/ui/ui-test/src/desktopMain/kotlin/androidx/compose/ui/test/DeviceConfigurationOverride.desktop.kt
+++ b/compose/ui/ui-test/src/desktopMain/kotlin/androidx/compose/ui/test/DeviceConfigurationOverride.desktop.kt
@@ -26,10 +26,7 @@
 actual fun DeviceConfigurationOverride.Companion.ForcedSize(
     size: DpSize
 ): DeviceConfigurationOverride = DeviceConfigurationOverride { contentUnderTest ->
-    DensityForcedSize(
-        size = size,
-        content = contentUnderTest
-    )
+    DensityForcedSize(size = size, content = contentUnderTest)
 }
 
 actual fun DeviceConfigurationOverride.Companion.FontScale(
diff --git a/compose/ui/ui-test/src/desktopMain/kotlin/androidx/compose/ui/test/MainTestClockImpl.desktop.kt b/compose/ui/ui-test/src/desktopMain/kotlin/androidx/compose/ui/test/MainTestClockImpl.desktop.kt
index 9f217ef..4139dca 100644
--- a/compose/ui/ui-test/src/desktopMain/kotlin/androidx/compose/ui/test/MainTestClockImpl.desktop.kt
+++ b/compose/ui/ui-test/src/desktopMain/kotlin/androidx/compose/ui/test/MainTestClockImpl.desktop.kt
@@ -18,11 +18,5 @@
 
 import kotlinx.coroutines.test.TestCoroutineScheduler
 
-internal class MainTestClockImpl(
-    testScheduler: TestCoroutineScheduler,
-    frameDelayMillis: Long
-) : AbstractMainTestClock(
-    testScheduler,
-    frameDelayMillis,
-    ::runOnUiThread
-)
+internal class MainTestClockImpl(testScheduler: TestCoroutineScheduler, frameDelayMillis: Long) :
+    AbstractMainTestClock(testScheduler, frameDelayMillis, ::runOnUiThread)
diff --git a/compose/ui/ui-test/src/desktopMain/kotlin/androidx/compose/ui/test/Mouse.desktop.kt b/compose/ui/ui-test/src/desktopMain/kotlin/androidx/compose/ui/test/Mouse.desktop.kt
index 6e8f67b..40a8298 100644
--- a/compose/ui/ui-test/src/desktopMain/kotlin/androidx/compose/ui/test/Mouse.desktop.kt
+++ b/compose/ui/ui-test/src/desktopMain/kotlin/androidx/compose/ui/test/Mouse.desktop.kt
@@ -25,19 +25,13 @@
 actual value class MouseButton(val buttonId: Int) {
     @ExperimentalTestApi
     actual companion object {
-        /**
-         * The left mouse button
-         */
+        /** The left mouse button */
         actual val Primary = MouseButton(1)
 
-        /**
-         * The right mouse button
-         */
+        /** The right mouse button */
         actual val Secondary = MouseButton(2)
 
-        /**
-         * The middle mouse button
-         */
+        /** The middle mouse button */
         actual val Tertiary = MouseButton(4)
     }
 }
diff --git a/compose/ui/ui-test/src/desktopTest/kotlin/androidx/compose/ui/test/CustomEffectContextTest.kt b/compose/ui/ui-test/src/desktopTest/kotlin/androidx/compose/ui/test/CustomEffectContextTest.kt
index f6e5cb9..29d942c 100644
--- a/compose/ui/ui-test/src/desktopTest/kotlin/androidx/compose/ui/test/CustomEffectContextTest.kt
+++ b/compose/ui/ui-test/src/desktopTest/kotlin/androidx/compose/ui/test/CustomEffectContextTest.kt
@@ -38,9 +38,7 @@
         val testElement = TestCoroutineContextElement()
         runComposeUiTest(effectContext = testElement) {
             lateinit var compositionScope: CoroutineScope
-            setContent {
-                compositionScope = rememberCoroutineScope()
-            }
+            setContent { compositionScope = rememberCoroutineScope() }
 
             runOnIdle {
                 val elementFromComposition =
@@ -58,16 +56,16 @@
             lastRecordedMotionDurationScale = context[MotionDurationScale]?.scaleFactor
         }
 
-        runOnIdle {
-            assertThat(lastRecordedMotionDurationScale).isNull()
-        }
+        runOnIdle { assertThat(lastRecordedMotionDurationScale).isNull() }
     }
 
     @Test
     fun motionDurationScale_propagatedToCoroutines() {
-        val motionDurationScale = object : MotionDurationScale {
-            override val scaleFactor: Float get() = 0f
-        }
+        val motionDurationScale =
+            object : MotionDurationScale {
+                override val scaleFactor: Float
+                    get() = 0f
+            }
         runComposeUiTest(effectContext = motionDurationScale) {
             var lastRecordedMotionDurationScale: Float? = null
             setContent {
@@ -75,14 +73,13 @@
                 lastRecordedMotionDurationScale = context[MotionDurationScale]?.scaleFactor
             }
 
-            runOnIdle {
-                assertThat(lastRecordedMotionDurationScale).isEqualTo(0f)
-            }
+            runOnIdle { assertThat(lastRecordedMotionDurationScale).isEqualTo(0f) }
         }
     }
 
     private class TestCoroutineContextElement : CoroutineContext.Element {
-        override val key: CoroutineContext.Key<*> get() = Key
+        override val key: CoroutineContext.Key<*>
+            get() = Key
 
         companion object Key : CoroutineContext.Key<TestCoroutineContextElement>
     }
diff --git a/compose/ui/ui-test/src/jvmMain/kotlin/androidx/compose/ui/test/AbstractMainTestClock.jvm.kt b/compose/ui/ui-test/src/jvmMain/kotlin/androidx/compose/ui/test/AbstractMainTestClock.jvm.kt
index 6e4013c..4832abb 100644
--- a/compose/ui/ui-test/src/jvmMain/kotlin/androidx/compose/ui/test/AbstractMainTestClock.jvm.kt
+++ b/compose/ui/ui-test/src/jvmMain/kotlin/androidx/compose/ui/test/AbstractMainTestClock.jvm.kt
@@ -37,13 +37,12 @@
     }
 
     override fun advanceTimeBy(milliseconds: Long, ignoreFrameDuration: Boolean) {
-        val actualDelay = if (ignoreFrameDuration) {
-            milliseconds
-        } else {
-            ceil(
-                milliseconds.toDouble() / frameDelayMillis
-            ).toLong() * frameDelayMillis
-        }
+        val actualDelay =
+            if (ignoreFrameDuration) {
+                milliseconds
+            } else {
+                ceil(milliseconds.toDouble() / frameDelayMillis).toLong() * frameDelayMillis
+            }
         advanceDispatcher(actualDelay)
     }
 
diff --git a/compose/ui/ui-test/src/jvmMain/kotlin/androidx/compose/ui/test/FrameDeferringContinuationInterceptor.jvm.kt b/compose/ui/ui-test/src/jvmMain/kotlin/androidx/compose/ui/test/FrameDeferringContinuationInterceptor.jvm.kt
index 7613ca4..d77b90b 100644
--- a/compose/ui/ui-test/src/jvmMain/kotlin/androidx/compose/ui/test/FrameDeferringContinuationInterceptor.jvm.kt
+++ b/compose/ui/ui-test/src/jvmMain/kotlin/androidx/compose/ui/test/FrameDeferringContinuationInterceptor.jvm.kt
@@ -24,30 +24,27 @@
 import kotlinx.coroutines.CoroutineDispatcher
 
 /**
- * A [ContinuationInterceptor] that wraps continuations in a [FrameDeferredContinuation] to
- * defer dispatching while frame callbacks are being ran by [TestMonotonicFrameClock.performFrame].
+ * A [ContinuationInterceptor] that wraps continuations in a [FrameDeferredContinuation] to defer
+ * dispatching while frame callbacks are being ran by [TestMonotonicFrameClock.performFrame].
  *
- * Only delegates to the parent/wrapped interceptor if it is a [CoroutineDispatcher] that says
- * the continuation needs to be dispatched.
+ * Only delegates to the parent/wrapped interceptor if it is a [CoroutineDispatcher] that says the
+ * continuation needs to be dispatched.
  */
 @OptIn(InternalTestApi::class)
-internal class FrameDeferringContinuationInterceptor(
-    parentInterceptor: ContinuationInterceptor?
-) : DelayPropagatingContinuationInterceptorWrapper(parentInterceptor) {
+internal class FrameDeferringContinuationInterceptor(parentInterceptor: ContinuationInterceptor?) :
+    DelayPropagatingContinuationInterceptorWrapper(parentInterceptor) {
     private val parentDispatcher = parentInterceptor as? CoroutineDispatcher
     private val toRunTrampolined = ArrayDeque<TrampolinedTask<*>>()
     private val lock = Any()
     private var isDeferringContinuations = false
 
     val hasTrampolinedTasks: Boolean
-        get() = synchronized(lock) {
-            toRunTrampolined.isNotEmpty()
-        }
+        get() = synchronized(lock) { toRunTrampolined.isNotEmpty() }
 
     /**
      * Runs [block] so that any continuations that are resumed on this dispatcher will not be
-     * dispatched until after [block] returns. All such continuations will be dispatched before
-     * this function returns.
+     * dispatched until after [block] returns. All such continuations will be dispatched before this
+     * function returns.
      */
     fun runWithoutResumingCoroutines(block: () -> Unit) {
         synchronized(lock) {
@@ -63,17 +60,13 @@
             // individual failures need to also report the traversal failure in case they win the
             // race to cancel the test job. See the kdoc on resumeWithSuppressed for more
             // information.
-            finishFrameTasks {
-                it.resumeWithSuppressed(e)
-            }
+            finishFrameTasks { it.resumeWithSuppressed(e) }
             throw e
         }
 
         // Resume any continuations that were dispatched inside the frame callbacks, as well as the
         // coroutines that called withFrameNanos.
-        finishFrameTasks {
-            it.resume()
-        }
+        finishFrameTasks { it.resume() }
     }
 
     override fun <T> interceptContinuation(continuation: Continuation<T>): Continuation<T> {
@@ -111,10 +104,10 @@
                 task = nextTrampolinedTask()
             }
         } while (
-        // We don't dispatch holding the lock so that other tasks can get in on our
-        // trampolining time slice, but once we're done, make sure nothing added a new task
-        // before we set runningFrameCallbacks = false, which would prevent the next dispatch
-        // from being correctly scheduled. Loop to run these stragglers now.
+            // We don't dispatch holding the lock so that other tasks can get in on our
+            // trampolining time slice, but once we're done, make sure nothing added a new task
+            // before we set runningFrameCallbacks = false, which would prevent the next dispatch
+            // from being correctly scheduled. Loop to run these stragglers now.
             synchronized(lock) {
                 if (toRunTrampolined.isEmpty()) {
                     // Setting this to false means that once the lock is released, any dispatches
@@ -126,9 +119,8 @@
         )
     }
 
-    private fun nextTrampolinedTask(): TrampolinedTask<*>? = synchronized(lock) {
-        toRunTrampolined.removeFirstOrNull()
-    }
+    private fun nextTrampolinedTask(): TrampolinedTask<*>? =
+        synchronized(lock) { toRunTrampolined.removeFirstOrNull() }
 
     private class TrampolinedTask<T>(
         private val continuation: Continuation<T>,
@@ -143,19 +135,18 @@
          * If this method is being called, it means the [runWithoutResumingCoroutines]' block failed
          * somehow after executing individual `withFrameNanos` callbacks. That failure is
          * significant and should be reported as at least part of the test failure, by cancelling
-         * the root test job.
-         * If all the frame callbacks have a success result, then [performFrame] will throw its
-         * exception and cancel the test job, failing the test.
-         * However, if a `withFrameNanos` callback failed, and the underlying dispatcher is
-         * unconfined and the coroutine call stack doesn't block the exception, resuming the
-         * continuation with the exception result may end up bubbling up to the test job first
-         * and cancelling it and failing the test before the more general frame failure has a
-         * chance to. If that happens, we still want to report the frame failure somewhere, so
-         * we add it to the suppressed list of the individual failure's exception.
+         * the root test job. If all the frame callbacks have a success result, then [performFrame]
+         * will throw its exception and cancel the test job, failing the test. However, if a
+         * `withFrameNanos` callback failed, and the underlying dispatcher is unconfined and the
+         * coroutine call stack doesn't block the exception, resuming the continuation with the
+         * exception result may end up bubbling up to the test job first and cancelling it and
+         * failing the test before the more general frame failure has a chance to. If that happens,
+         * we still want to report the frame failure somewhere, so we add it to the suppressed list
+         * of the individual failure's exception.
          *
          * TODO(b/255802670): It's still possible for a coroutine that is resumed successfully and
-         *  dispatched synchronously to immediately throw _after_ returning, and thus still beat us
-         *  to failing the test.
+         *   dispatched synchronously to immediately throw _after_ returning, and thus still beat us
+         *   to failing the test.
          */
         fun resumeWithSuppressed(cause: Throwable) {
             result.exceptionOrNull()?.addSuppressed(cause)
@@ -168,25 +159,25 @@
      * [TestMonotonicFrameClock.performFrame] is running frame callbacks. Such continuations are
      * instead dispatched after all the frame callbacks have finished executing.
      */
-    private inner class FrameDeferredContinuation<T>(
-        private val continuation: Continuation<T>
-    ) : Continuation<T> {
+    private inner class FrameDeferredContinuation<T>(private val continuation: Continuation<T>) :
+        Continuation<T> {
         override val context: CoroutineContext
             get() = continuation.context
 
         override fun resumeWith(result: Result<T>) {
-            val defer = synchronized(lock) {
-                if (isDeferringContinuations) {
-                    // Defer all continuations resumed while running frame callbacks until
-                    // after the frame callbacks have finished running. This needs to be
-                    // done while holding the lock to ensure the task actually gets executed
-                    // by the current performFrame.
-                    toRunTrampolined.addLast(TrampolinedTask(continuation, result))
-                    true
-                } else {
-                    false
+            val defer =
+                synchronized(lock) {
+                    if (isDeferringContinuations) {
+                        // Defer all continuations resumed while running frame callbacks until
+                        // after the frame callbacks have finished running. This needs to be
+                        // done while holding the lock to ensure the task actually gets executed
+                        // by the current performFrame.
+                        toRunTrampolined.addLast(TrampolinedTask(continuation, result))
+                        true
+                    } else {
+                        false
+                    }
                 }
-            }
 
             // If resuming immediately, do so outside the critical section above to avoid
             // deadlocking if the continuation tries to resume another continuation.
diff --git a/compose/ui/ui-test/src/jvmMain/kotlin/androidx/compose/ui/test/IdlingResourceRegistry.jvm.kt b/compose/ui/ui-test/src/jvmMain/kotlin/androidx/compose/ui/test/IdlingResourceRegistry.jvm.kt
index 4cc556b..e8d1d1a 100644
--- a/compose/ui/ui-test/src/jvmMain/kotlin/androidx/compose/ui/test/IdlingResourceRegistry.jvm.kt
+++ b/compose/ui/ui-test/src/jvmMain/kotlin/androidx/compose/ui/test/IdlingResourceRegistry.jvm.kt
@@ -27,12 +27,9 @@
 internal class IdlingResourceRegistry
 @VisibleForTesting
 @InternalTestApi
-internal constructor(
-    private val pollScopeOverride: CoroutineScope?
-) : IdlingResource {
+internal constructor(private val pollScopeOverride: CoroutineScope?) : IdlingResource {
     // Publicly facing constructor, that doesn't override the poll scope
-    @OptIn(InternalTestApi::class)
-    constructor() : this(null)
+    @OptIn(InternalTestApi::class) constructor() : this(null)
 
     private val lock = Any()
 
@@ -51,16 +48,15 @@
     // Callback to be called every time when the last busy resource becomes idle
     private var onIdle: (() -> Unit)? = null
 
-    /**
-     * Returns if all resources are idle
-     */
-    override val isIdleNow: Boolean get() {
-        @Suppress("DEPRECATION_ERROR")
-        return synchronized(lock) {
-            // If a poll job is running, we're not idle now. Let the job do its job.
-            !isPolling && areAllResourcesIdle()
+    /** Returns if all resources are idle */
+    override val isIdleNow: Boolean
+        get() {
+            @Suppress("DEPRECATION_ERROR")
+            return synchronized(lock) {
+                // If a poll job is running, we're not idle now. Let the job do its job.
+                !isPolling && areAllResourcesIdle()
+            }
         }
-    }
 
     /**
      * Installs a callback that will be called when the registry transitions from busy to idle.
@@ -70,19 +66,12 @@
         onIdle = callback
     }
 
-    /**
-     * Registers the [idlingResource] into the registry
-     */
+    /** Registers the [idlingResource] into the registry */
     fun registerIdlingResource(idlingResource: IdlingResource) {
-        @Suppress("DEPRECATION_ERROR")
-        synchronized(lock) {
-            idlingResources.add(idlingResource)
-        }
+        @Suppress("DEPRECATION_ERROR") synchronized(lock) { idlingResources.add(idlingResource) }
     }
 
-    /**
-     * Unregisters the [idlingResource] from the registry
-     */
+    /** Unregisters the [idlingResource] from the registry */
     fun unregisterIdlingResource(idlingResource: IdlingResource) {
         @Suppress("DEPRECATION_ERROR")
         synchronized(lock) {
@@ -98,16 +87,18 @@
     internal fun isIdleOrEnsurePolling(): Boolean {
         @Suppress("DEPRECATION_ERROR")
         return synchronized(lock) {
-            !isPolling && areAllResourcesIdle().also { isIdle ->
-                if (!isIdle) {
-                    pollJob = pollScope.launch {
-                        do {
-                            delay(20)
-                        } while (!areAllResourcesIdle())
-                        onIdle?.invoke()
+            !isPolling &&
+                areAllResourcesIdle().also { isIdle ->
+                    if (!isIdle) {
+                        pollJob =
+                            pollScope.launch {
+                                do {
+                                    delay(20)
+                                } while (!areAllResourcesIdle())
+                                onIdle?.invoke()
+                            }
                     }
                 }
-            }
         }
     }
 
diff --git a/compose/ui/ui-test/src/jvmMain/kotlin/androidx/compose/ui/test/TestMonotonicFrameClock.jvm.kt b/compose/ui/ui-test/src/jvmMain/kotlin/androidx/compose/ui/test/TestMonotonicFrameClock.jvm.kt
index 275d234..6e84196 100644
--- a/compose/ui/ui-test/src/jvmMain/kotlin/androidx/compose/ui/test/TestMonotonicFrameClock.jvm.kt
+++ b/compose/ui/ui-test/src/jvmMain/kotlin/androidx/compose/ui/test/TestMonotonicFrameClock.jvm.kt
@@ -34,18 +34,18 @@
  * controlled tests.
  *
  * Calls to [withFrameNanos] will schedule an upcoming frame [frameDelayNanos] nanoseconds in the
- * future by launching into [coroutineScope] if such a frame has not yet been scheduled. The
- * current frame time for [withFrameNanos] is provided by [delayController]. It is strongly
- * suggested that [coroutineScope] contain the test dispatcher controlled by [delayController].
+ * future by launching into [coroutineScope] if such a frame has not yet been scheduled. The current
+ * frame time for [withFrameNanos] is provided by [delayController]. It is strongly suggested that
+ * [coroutineScope] contain the test dispatcher controlled by [delayController].
  *
  * @param coroutineScope The [CoroutineScope] used to simulate the main thread and schedule frames
- * on. It must contain a [TestCoroutineScheduler].
+ *   on. It must contain a [TestCoroutineScheduler].
  * @param frameDelayNanos The number of nanoseconds to [delay] between executing frames.
- * @param onPerformTraversals Called with the frame time of the frame that was just executed,
- * after running all `withFrameNanos` callbacks, but before resuming their callers' continuations.
- * Any continuations resumed while running frame callbacks or [onPerformTraversals] will not be
- * dispatched until after [onPerformTraversals] finishes. If [onPerformTraversals] throws, all
- * `withFrameNanos` callers will be cancelled.
+ * @param onPerformTraversals Called with the frame time of the frame that was just executed, after
+ *   running all `withFrameNanos` callbacks, but before resuming their callers' continuations. Any
+ *   continuations resumed while running frame callbacks or [onPerformTraversals] will not be
+ *   dispatched until after [onPerformTraversals] finishes. If [onPerformTraversals] throws, all
+ *   `withFrameNanos` callers will be cancelled.
  */
 // This is intentionally not OptIn, because we want to communicate to consumers that by using this
 // API, they're also transitively getting all the experimental risk of using the experimental API
@@ -69,13 +69,11 @@
     private var scheduledFrameDispatch = false
     private val frameDeferringInterceptor = FrameDeferringContinuationInterceptor(parentInterceptor)
 
-    /**
-     * Returns whether there are any awaiters on this clock.
-     */
+    /** Returns whether there are any awaiters on this clock. */
     val hasAwaiters: Boolean
-        get() = frameDeferringInterceptor.hasTrampolinedTasks || synchronized(lock) {
-            awaiters.isNotEmpty()
-        }
+        get() =
+            frameDeferringInterceptor.hasTrampolinedTasks ||
+                synchronized(lock) { awaiters.isNotEmpty() }
 
     /**
      * A [CoroutineDispatcher] that will defer continuation resumptions requested within
@@ -86,7 +84,8 @@
     @Suppress("OPT_IN_MARKER_ON_WRONG_TARGET")
     @get:ExperimentalTestApi
     @ExperimentalTestApi
-    val continuationInterceptor: ContinuationInterceptor get() = frameDeferringInterceptor
+    val continuationInterceptor: ContinuationInterceptor
+        get() = frameDeferringInterceptor
 
     /**
      * Schedules [onFrame] to be ran on the next "fake" frame, and schedules the task to actually
@@ -100,9 +99,7 @@
     override suspend fun <R> withFrameNanos(onFrame: (frameTimeNanos: Long) -> R): R =
         suspendCancellableCoroutine { co ->
             synchronized(lock) {
-                awaiters.add { frameTime ->
-                    co.resumeWith(runCatching { onFrame(frameTime) })
-                }
+                awaiters.add { frameTime -> co.resumeWith(runCatching { onFrame(frameTime) }) }
                 if (!scheduledFrameDispatch) {
                     scheduledFrameDispatch = true
                     coroutineScope.launch {
@@ -117,11 +114,11 @@
      * Executes all scheduled frame callbacks, and then dispatches any continuations that were
      * resumed by the callbacks and deferred by [continuationInterceptor].
      *
-     * This method performs a subset of the responsibilities of `Choreographer.doFrame` on
-     * Android, which is usually responsible for executing animation frames and coroutines, and also
+     * This method performs a subset of the responsibilities of `Choreographer.doFrame` on Android,
+     * which is usually responsible for executing animation frames and coroutines, and also
      * "performing traversals", which practically just means doing the layout pass on the view tree.
-     * Since this method replaces `doFrame`, it also needs to trigger the compose layout pass
-     * (see b/222093277).
+     * Since this method replaces `doFrame`, it also needs to trigger the compose layout pass (see
+     * b/222093277).
      *
      * Typically, the only task that will have been enqueued will be the `Recomposer`'s
      * `runRecomposeAndApplyChanges`' call to [withFrameNanos] – any app coroutines waiting for the
@@ -133,16 +130,17 @@
             // This is set after acquiring the lock in case the virtual time was advanced while
             // waiting for it.
             val frameTime: Long
-            val toRun = synchronized(lock) {
-                check(scheduledFrameDispatch) { "frame dispatch not scheduled" }
+            val toRun =
+                synchronized(lock) {
+                    check(scheduledFrameDispatch) { "frame dispatch not scheduled" }
 
-                frameTime = delayController.currentTime * 1_000_000
-                scheduledFrameDispatch = false
-                awaiters.also {
-                    awaiters = spareAwaiters
-                    spareAwaiters = it
+                    frameTime = delayController.currentTime * 1_000_000
+                    scheduledFrameDispatch = false
+                    awaiters.also {
+                        awaiters = spareAwaiters
+                        spareAwaiters = it
+                    }
                 }
-            }
 
             // Because runningFrameCallbacks is still true, all these resumptions will be queued to
             // toRunTrampolined.
@@ -154,9 +152,7 @@
     }
 }
 
-/**
- * The frame delay time for the [TestMonotonicFrameClock] in milliseconds.
- */
+/** The frame delay time for the [TestMonotonicFrameClock] in milliseconds. */
 @OptIn(ExperimentalCoroutinesApi::class)
 @Suppress("OPT_IN_MARKER_ON_WRONG_TARGET")
 @get:ExperimentalTestApi // Required to annotate Java-facing APIs
diff --git a/compose/ui/ui-test/src/jvmMain/kotlin/androidx/compose/ui/test/UncaughtExceptionHandler.jvm.kt b/compose/ui/ui-test/src/jvmMain/kotlin/androidx/compose/ui/test/UncaughtExceptionHandler.jvm.kt
index 7504672..7c1675c 100644
--- a/compose/ui/ui-test/src/jvmMain/kotlin/androidx/compose/ui/test/UncaughtExceptionHandler.jvm.kt
+++ b/compose/ui/ui-test/src/jvmMain/kotlin/androidx/compose/ui/test/UncaughtExceptionHandler.jvm.kt
@@ -23,8 +23,8 @@
 /**
  * Similar to [TestCoroutineExceptionHandler], but with clearing all thrown exceptions
  *
- * If we don't clear exceptions they will be thrown twice in this example
- * (the exception will be thrown inside awaitIdle and after the test):
+ * If we don't clear exceptions they will be thrown twice in this example (the exception will be
+ * thrown inside awaitIdle and after the test):
  * ```
  * @Test
  * fun test() {
@@ -40,8 +40,7 @@
  */
 // TODO(b/200151447): When this moves over to ui-test, move the code sample above to ui-test:samples
 internal class UncaughtExceptionHandler :
-    AbstractCoroutineContextElement(CoroutineExceptionHandler),
-    CoroutineExceptionHandler {
+    AbstractCoroutineContextElement(CoroutineExceptionHandler), CoroutineExceptionHandler {
     private var exception: Throwable? = null
 
     override fun handleException(context: CoroutineContext, exception: Throwable) {
@@ -55,16 +54,15 @@
     }
 
     /**
-     * Checks if the [UncaughtExceptionHandler] has caught uncaught exceptions. If so, will
-     * rethrow the first to fail the test. The rest exceptions will be added to the first and
-     * marked as `suppressed`.
+     * Checks if the [UncaughtExceptionHandler] has caught uncaught exceptions. If so, will rethrow
+     * the first to fail the test. The rest exceptions will be added to the first and marked as
+     * `suppressed`.
      *
      * The next call of this method will not throw already thrown exception.
      *
      * Rather than only calling this only at the end of the test, as recommended by
-     * [UncaughtExceptionCaptor.cleanupTestCoroutines],
-     * try calling this at a few strategic
-     * points to fail the test asap after the exception was caught.
+     * [UncaughtExceptionCaptor.cleanupTestCoroutines], try calling this at a few strategic points
+     * to fail the test asap after the exception was caught.
      */
     fun throwUncaught() {
         synchronized(this) {
diff --git a/compose/ui/ui-text-google-fonts/src/androidTest/java/androidx/compose/ui/text/googlefonts/GoogleFontTest.kt b/compose/ui/ui-text-google-fonts/src/androidTest/java/androidx/compose/ui/text/googlefonts/GoogleFontTest.kt
index dff7ae0..e24fe29 100644
--- a/compose/ui/ui-text-google-fonts/src/androidTest/java/androidx/compose/ui/text/googlefonts/GoogleFontTest.kt
+++ b/compose/ui/ui-text-google-fonts/src/androidTest/java/androidx/compose/ui/text/googlefonts/GoogleFontTest.kt
@@ -53,11 +53,12 @@
 
     val context = InstrumentationRegistry.getInstrumentation().context
 
-    private val TestProvider = GoogleFont.Provider(
-        "providerAuthority",
-        "providerPackage",
-        listOf(listOf(ByteArray(100) { it.toByte() }))
-    )
+    private val TestProvider =
+        GoogleFont.Provider(
+            "providerAuthority",
+            "providerPackage",
+            listOf(listOf(ByteArray(100) { it.toByte() }))
+        )
 
     @Test
     fun GoogleFont_create_ComposeFont() {
@@ -92,7 +93,7 @@
 
     @Test(expected = IllegalArgumentException::class)
     fun GoogleFont_throwsOn_emptyName() {
-       Font(GoogleFont(""), TestProvider)
+        Font(GoogleFont(""), TestProvider)
     }
 
     @Test
@@ -183,12 +184,9 @@
 
     @Test
     fun GoogleFontImpl_TypefaceStyle_BoldItalic() {
-        val font = Font(
-            GoogleFont("a"),
-            TestProvider,
-            weight = FontWeight.Bold,
-            style = FontStyle.Italic
-        ) as GoogleFontImpl
+        val font =
+            Font(GoogleFont("a"), TestProvider, weight = FontWeight.Bold, style = FontStyle.Italic)
+                as GoogleFontImpl
         assertThat(font.toTypefaceStyle()).isEqualTo(Typeface.BOLD_ITALIC)
     }
 
@@ -200,7 +198,7 @@
             val deferred = async {
                 GoogleFontTypefaceLoader.awaitLoad(
                     context,
-                   Font(GoogleFont("Foo"), TestProvider) as AndroidFont,
+                    Font(GoogleFont("Foo"), TestProvider) as AndroidFont,
                     compatLoader
                 )
             }
@@ -214,13 +212,14 @@
     fun GoogleFont_TypefaceLoader_throwsOnError() {
         val compatLoader = CapturingFontsContractCompatLoader()
         runTest(UnconfinedTestDispatcher()) {
-            val deferred = async(Job()) {
-                GoogleFontTypefaceLoader.awaitLoad(
-                    context,
-                   Font(GoogleFont("Foo"), TestProvider) as AndroidFont,
-                    compatLoader
-                )
-            }
+            val deferred =
+                async(Job()) {
+                    GoogleFontTypefaceLoader.awaitLoad(
+                        context,
+                        Font(GoogleFont("Foo"), TestProvider) as AndroidFont,
+                        compatLoader
+                    )
+                }
             compatLoader.callback?.onTypefaceRequestFailed(42)
             var exception: IllegalStateException? = null
             try {
@@ -238,13 +237,14 @@
     fun GoogleFont_TypefaceLoader_throwsOnError_withFullListUrl() {
         val compatLoader = CapturingFontsContractCompatLoader()
         runTest(UnconfinedTestDispatcher()) {
-            val deferred = async(Job()) {
-                GoogleFontTypefaceLoader.awaitLoad(
-                    context,
-                    Font(GoogleFont("Foo"), TestProvider) as AndroidFont,
-                    compatLoader
-                )
-            }
+            val deferred =
+                async(Job()) {
+                    GoogleFontTypefaceLoader.awaitLoad(
+                        context,
+                        Font(GoogleFont("Foo"), TestProvider) as AndroidFont,
+                        compatLoader
+                    )
+                }
             compatLoader.callback?.onTypefaceRequestFailed(FAIL_REASON_FONT_NOT_FOUND)
             var exception: IllegalStateException? = null
             try {
@@ -252,18 +252,22 @@
             } catch (ex: IllegalStateException) {
                 exception = ex
             }
-            assertThat(exception?.message).contains("Font not found, please check availability " +
-                "on GoogleFont.Provider.AllFontsList: https://fonts.gstatic.com/s/a/directory.xml")
+            assertThat(exception?.message)
+                .contains(
+                    "Font not found, please check availability " +
+                        "on GoogleFont.Provider.AllFontsList: https://fonts.gstatic.com/s/a/directory.xml"
+                )
         }
     }
 
     @Test
     fun GoogleFont_toString() {
         val font = Font(GoogleFont("Font Family"), TestProvider)
-        assertThat(font.toString()).isEqualTo(
-            "Font(GoogleFont(\"Font Family\", bestEffort=true), weight=FontWeight(weight=400), " +
-                "style=Normal)"
-        )
+        assertThat(font.toString())
+            .isEqualTo(
+                "Font(GoogleFont(\"Font Family\", bestEffort=true), weight=FontWeight(weight=400), " +
+                    "style=Normal)"
+            )
     }
 
     @Test
@@ -275,11 +279,12 @@
 
     @Test
     fun GoogleFont_Provider_withCertsArray() {
-        val provider = GoogleFont.Provider(
-            "provider",
-            "package",
-            listOf(listOf(ByteArray(100) { it.toByte() }))
-        )
+        val provider =
+            GoogleFont.Provider(
+                "provider",
+                "package",
+                listOf(listOf(ByteArray(100) { it.toByte() }))
+            )
         assertThat(provider.certificatesRes).isEqualTo(0)
         assertThat(provider.certificates).isNotNull()
     }
@@ -294,11 +299,12 @@
         val packageInfo = getComAndroidGmsOrNull()
         assumeTrue(packageInfo != null)
 
-        val provider = GoogleFont.Provider(
-            "com.google.android.gms.fonts",
-            "com.google.android.gms",
-            listOf() /* this is never a valid cert */
-        )
+        val provider =
+            GoogleFont.Provider(
+                "com.google.android.gms.fonts",
+                "com.google.android.gms",
+                listOf() /* this is never a valid cert */
+            )
         provider.isAvailableOnDevice(context)
     }
 
@@ -310,14 +316,15 @@
         val packageInfo = getComAndroidGmsOrNull()
         assumeTrue(packageInfo != null)
 
-        val provider = GoogleFont.Provider(
-            "com.google.android.gms.fonts",
-            "com.google.android.gms",
-            listOf(
-                listOf(loadComGoogleAndroidGmsProdCertificateByteArray(context.assets)),
-                listOf(loadComGoogleAndroidGmsDevCertificateByteArray(context.assets))
+        val provider =
+            GoogleFont.Provider(
+                "com.google.android.gms.fonts",
+                "com.google.android.gms",
+                listOf(
+                    listOf(loadComGoogleAndroidGmsProdCertificateByteArray(context.assets)),
+                    listOf(loadComGoogleAndroidGmsDevCertificateByteArray(context.assets))
+                )
             )
-        )
 
         assertThat(provider.isAvailableOnDevice(context)).isTrue()
     }
@@ -330,11 +337,12 @@
         val packageInfo = getComAndroidGmsOrNull()
         assumeTrue(packageInfo != null)
 
-        val provider = GoogleFont.Provider(
-            "com.google.android.gms.fonts",
-            "com.google.android.gms",
-            R.array.com_google_android_gms_fonts_certs
-        )
+        val provider =
+            GoogleFont.Provider(
+                "com.google.android.gms.fonts",
+                "com.google.android.gms",
+                R.array.com_google_android_gms_fonts_certs
+            )
         assertThat(provider.isAvailableOnDevice(context)).isTrue()
     }
 
@@ -344,11 +352,12 @@
         val packageInfo = getComAndroidGmsOrNull()
         assumeTrue(packageInfo == null)
 
-        val provider = GoogleFont.Provider(
-            "com.google.android.gms.fonts",
-            "com.google.android.gms",
-            listOf() /* this is never a valid cert */
-        )
+        val provider =
+            GoogleFont.Provider(
+                "com.google.android.gms.fonts",
+                "com.google.android.gms",
+                listOf() /* this is never a valid cert */
+            )
         assertThat(provider.isAvailableOnDevice(context)).isFalse()
     }
 
@@ -378,14 +387,10 @@
 
 @WorkerThread
 private fun loadComGoogleAndroidGmsProdCertificateByteArray(assetManager: AssetManager): ByteArray {
-    return assetManager.open("ComGoogleAndroidGmsCertificate.prod").use {
-        it.readBytes()
-    }
+    return assetManager.open("ComGoogleAndroidGmsCertificate.prod").use { it.readBytes() }
 }
 
 @WorkerThread
 private fun loadComGoogleAndroidGmsDevCertificateByteArray(assetManager: AssetManager): ByteArray {
-    return assetManager.open("ComGoogleAndroidGmsCertificate.dev").use {
-        it.readBytes()
-    }
+    return assetManager.open("ComGoogleAndroidGmsCertificate.dev").use { it.readBytes() }
 }
diff --git a/compose/ui/ui-text-google-fonts/src/main/java/androidx/compose/ui/text/googlefonts/FontProviderHelper.kt b/compose/ui/ui-text-google-fonts/src/main/java/androidx/compose/ui/text/googlefonts/FontProviderHelper.kt
index 5c4739f..9789e31 100644
--- a/compose/ui/ui-text-google-fonts/src/main/java/androidx/compose/ui/text/googlefonts/FontProviderHelper.kt
+++ b/compose/ui/ui-text-google-fonts/src/main/java/androidx/compose/ui/text/googlefonts/FontProviderHelper.kt
@@ -40,14 +40,15 @@
     val signatures = packageManager.getSignatures(providerInfo.packageName)
     val sortedSignatures = signatures.sortedWith(ByteArrayComparator)
     val allExpectedCerts = loadCertsIfNeeded(resources)
-    val certsMatched = allExpectedCerts.any { certList ->
-        val expected = certList?.sortedWith(ByteArrayComparator)
-        if (expected?.size != sortedSignatures.size) return@any false
-        for (i in expected.indices) {
-            if (!Arrays.equals(expected[i], sortedSignatures[i])) return@any false
+    val certsMatched =
+        allExpectedCerts.any { certList ->
+            val expected = certList?.sortedWith(ByteArrayComparator)
+            if (expected?.size != sortedSignatures.size) return@any false
+            for (i in expected.indices) {
+                if (!Arrays.equals(expected[i], sortedSignatures[i])) return@any false
+            }
+            true
         }
-        true
-    }
     return if (certsMatched) {
         true
     } else {
@@ -57,11 +58,8 @@
 
 @SuppressLint("ListIterator") // not a hot code path, not optimized
 private fun throwFormattedCertsMissError(signatures: List<ByteArray>): Nothing {
-    val fullDescription = signatures.joinToString(
-        ",",
-        prefix = "listOf(listOf(",
-        postfix = "))"
-    ) { repr(it) }
+    val fullDescription =
+        signatures.joinToString(",", prefix = "listOf(listOf(", postfix = "))") { repr(it) }
     throw IllegalStateException(
         "Provided signatures did not match. Actual signatures of package are:\n\n$fullDescription"
     )
@@ -83,8 +81,7 @@
     @Suppress("DEPRECATION")
     @SuppressLint("PackageManagerGetSignatures")
     val packageInfo: PackageInfo = getPackageInfo(packageName, PackageManager.GET_SIGNATURES)
-    @Suppress("DEPRECATION")
-    return convertToByteArrayList(packageInfo.signatures)
+    @Suppress("DEPRECATION") return convertToByteArrayList(packageInfo.signatures)
 }
 
 private val ByteArrayComparator = Comparator { l: ByteArray, r: ByteArray ->
diff --git a/compose/ui/ui-text-google-fonts/src/main/java/androidx/compose/ui/text/googlefonts/GoogleFont.kt b/compose/ui/ui-text-google-fonts/src/main/java/androidx/compose/ui/text/googlefonts/GoogleFont.kt
index 97ee309..7ed6829 100644
--- a/compose/ui/ui-text-google-fonts/src/main/java/androidx/compose/ui/text/googlefonts/GoogleFont.kt
+++ b/compose/ui/ui-text-google-fonts/src/main/java/androidx/compose/ui/text/googlefonts/GoogleFont.kt
@@ -85,9 +85,8 @@
  *
  * @param name Name of a font on Google fonts, such as "Roboto" or "Open Sans"
  * @param bestEffort If besteffort is true and your query specifies a valid family name but the
- * requested width/weight/italic value is not supported Google Fonts will return the best match it
- * can find within the family. If false, exact matches will be returned only.
- *
+ *   requested width/weight/italic value is not supported Google Fonts will return the best match it
+ *   can find within the family. If false, exact matches will be returned only.
  * @throws IllegalArgumentException if name is empty
  */
 // contains Google in name because this function provides integration with fonts.google.com
@@ -104,7 +103,8 @@
      */
     // contains Google in name because this function provides integration with fonts.google.com
     @Suppress("MentionsGoogle")
-    class Provider private constructor(
+    class Provider
+    private constructor(
         internal val providerAuthority: String,
         internal val providerPackage: String,
         internal val certificates: List<List<ByteArray>>?,
@@ -124,11 +124,11 @@
          *
          * @param providerAuthority The authority of the Font Provider to be used for the request.
          * @param providerPackage The package for the Font Provider to be used for the request. This
-         * is used to verify the identity of the provider.
+         *   is used to verify the identity of the provider.
          * @param certificates The list of sets of hashes for the certificates the provider should
-         * be signed with. This is used to verify the identity of the provider. Each set in the
-         * list represents one collection of signature hashes. Refer to your font provider's
-         * documentation for these values.
+         *   be signed with. This is used to verify the identity of the provider. Each set in the
+         *   list represents one collection of signature hashes. Refer to your font provider's
+         *   documentation for these values.
          */
         constructor(
             providerAuthority: String,
@@ -149,11 +149,11 @@
          *
          * @param providerAuthority The authority of the Font Provider to be used for the request.
          * @param providerPackage The package for the Font Provider to be used for the request. This
-         * is used to verify the identity of the provider.
+         *   is used to verify the identity of the provider.
          * @param certificates A resource array with the list of sets of hashes for the certificates
-         * the provider should be signed with. This is used to verify the identity of the provider.
-         * Each set in the list represents one collection of signature hashes. Refer to your
-         * font provider's documentation for these values.
+         *   the provider should be signed with. This is used to verify the identity of the
+         *   provider. Each set in the list represents one collection of signature hashes. Refer to
+         *   your font provider's documentation for these values.
          */
         constructor(
             providerAuthority: String,
@@ -198,7 +198,8 @@
     @Suppress("ContextFirst") context: Context, // extension function
 ): Boolean = checkAvailable(context.packageManager, context.resources)
 
-internal data class GoogleFontImpl constructor(
+internal data class GoogleFontImpl
+constructor(
     val name: String,
     private val fontProvider: GoogleFont.Provider,
     override val weight: FontWeight,
@@ -207,17 +208,13 @@
 ) : AndroidFont(FontLoadingStrategy.Async, GoogleFontTypefaceLoader, FontVariation.Settings()) {
     fun toFontRequest(): FontRequest {
         // note: name is not encoded or quoted per spec
-        val query = "name=$name&weight=${weight.weight}" +
-            "&italic=${style.toQueryParam()}&besteffort=${bestEffortQueryParam()}"
+        val query =
+            "name=$name&weight=${weight.weight}" +
+                "&italic=${style.toQueryParam()}&besteffort=${bestEffortQueryParam()}"
 
         val certs = fontProvider.certificates
         return if (certs != null) {
-            FontRequest(
-                fontProvider.providerAuthority,
-                fontProvider.providerPackage,
-                query,
-                certs
-            )
+            FontRequest(fontProvider.providerAuthority, fontProvider.providerPackage, query, certs)
         } else {
             FontRequest(
                 fontProvider.providerAuthority,
@@ -231,7 +228,9 @@
     private fun bestEffortQueryParam() = if (bestEffort) "true" else "false"
 
     private fun FontStyle.toQueryParam(): Int = if (this == FontStyle.Italic) 1 else 0
+
     private fun String.encode() = URLEncoder.encode(this, "UTF-8")
+
     fun toTypefaceStyle(): Int {
         val isItalic = style == FontStyle.Italic
         val isBold = weight >= FontWeight.Bold
@@ -275,6 +274,7 @@
     override fun loadBlocking(context: Context, font: AndroidFont): Typeface? {
         error("GoogleFont only support async loading: $font")
     }
+
     override suspend fun awaitLoad(context: Context, font: AndroidFont): Typeface? {
         return awaitLoad(context, font, DefaultFontsContractCompatLoader)
     }
@@ -289,20 +289,23 @@
         val typefaceStyle = font.toTypefaceStyle()
 
         return suspendCancellableCoroutine { continuation ->
-            val callback = object : FontRequestCallback() {
-                override fun onTypefaceRetrieved(typeface: Typeface?) {
-                    // this is entered from any thread
-                    continuation.resume(typeface)
-                }
+            val callback =
+                object : FontRequestCallback() {
+                    override fun onTypefaceRetrieved(typeface: Typeface?) {
+                        // this is entered from any thread
+                        continuation.resume(typeface)
+                    }
 
-                override fun onTypefaceRequestFailed(reason: Int) {
-                    // this is entered from any thread
-                    continuation.cancel(
-                        IllegalStateException("Failed to load $font (reason=$reason, " +
-                            "${reasonToString(reason)})")
-                    )
+                    override fun onTypefaceRequestFailed(reason: Int) {
+                        // this is entered from any thread
+                        continuation.cancel(
+                            IllegalStateException(
+                                "Failed to load $font (reason=$reason, " +
+                                    "${reasonToString(reason)})"
+                            )
+                        )
+                    }
                 }
-            }
 
             loader.requestFont(
                 context = context,
@@ -320,9 +323,7 @@
     }
 }
 
-/**
- * To allow mocking for tests
- */
+/** To allow mocking for tests */
 internal interface FontsContractCompatLoader {
     fun requestFont(
         context: Context,
@@ -333,9 +334,7 @@
     )
 }
 
-/**
- * Actual implementation of requestFont using androidx.core
- */
+/** Actual implementation of requestFont using androidx.core */
 private object DefaultFontsContractCompatLoader : FontsContractCompatLoader {
     override fun requestFont(
         context: Context,
@@ -359,17 +358,19 @@
 private fun reasonToString(@FontRequestFailReason reasonCode: Int): String {
     return when (reasonCode) {
         FAIL_REASON_PROVIDER_NOT_FOUND -> "The requested provider was not found on this device."
-        FAIL_REASON_WRONG_CERTIFICATES -> "The given provider cannot be authenticated with the " +
-            "certificates given."
-        FAIL_REASON_FONT_LOAD_ERROR -> "Generic error loading font, for example variation " +
-            "settings were not parsable"
-        FAIL_REASON_FONT_NOT_FOUND -> "Font not found, please check availability on " +
-            "GoogleFont.Provider.AllFontsList: https://fonts.gstatic.com/s/a/directory.xml"
-        FAIL_REASON_FONT_UNAVAILABLE -> "The provider found the queried font, but it is " +
-            "currently unavailable."
+        FAIL_REASON_WRONG_CERTIFICATES ->
+            "The given provider cannot be authenticated with the " + "certificates given."
+        FAIL_REASON_FONT_LOAD_ERROR ->
+            "Generic error loading font, for example variation " + "settings were not parsable"
+        FAIL_REASON_FONT_NOT_FOUND ->
+            "Font not found, please check availability on " +
+                "GoogleFont.Provider.AllFontsList: https://fonts.gstatic.com/s/a/directory.xml"
+        FAIL_REASON_FONT_UNAVAILABLE ->
+            "The provider found the queried font, but it is " + "currently unavailable."
         FAIL_REASON_MALFORMED_QUERY -> "The given query was not supported by this provider."
-        FAIL_REASON_SECURITY_VIOLATION -> "Font was not loaded due to security issues. This " +
-            "usually means the font was attempted to load in a restricted context"
+        FAIL_REASON_SECURITY_VIOLATION ->
+            "Font was not loaded due to security issues. This " +
+                "usually means the font was attempted to load in a restricted context"
         else -> "Unknown error code"
     }
 }
diff --git a/compose/ui/ui-text-google-fonts/src/main/java/androidx/compose/ui/text/googlefonts/HandlerHelper.kt b/compose/ui/ui-text-google-fonts/src/main/java/androidx/compose/ui/text/googlefonts/HandlerHelper.kt
index 782d2d4..cf9e811 100644
--- a/compose/ui/ui-text-google-fonts/src/main/java/androidx/compose/ui/text/googlefonts/HandlerHelper.kt
+++ b/compose/ui/ui-text-google-fonts/src/main/java/androidx/compose/ui/text/googlefonts/HandlerHelper.kt
@@ -29,9 +29,7 @@
  */
 internal object HandlerHelper {
 
-    /**
-     * @return handler, with createAsync if API level supports it.
-     */
+    /** @return handler, with createAsync if API level supports it. */
     fun createAsync(looper: Looper): Handler {
         return if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {
             Handler28Impl.createAsync(looper)
diff --git a/compose/ui/ui-text-google-fonts/src/main/java/androidx/compose/ui/text/googlefonts/XmlLoader.kt b/compose/ui/ui-text-google-fonts/src/main/java/androidx/compose/ui/text/googlefonts/XmlLoader.kt
index c9e60e6..82248a8 100644
--- a/compose/ui/ui-text-google-fonts/src/main/java/androidx/compose/ui/text/googlefonts/XmlLoader.kt
+++ b/compose/ui/ui-text-google-fonts/src/main/java/androidx/compose/ui/text/googlefonts/XmlLoader.kt
@@ -33,7 +33,6 @@
  *
  * @param context to load font from
  * @param fontXml fontRes to load
- *
  * @throws IllegalArgumentException if the fontRes does not exist or is not an xml GoogleFont
  */
 // This is an API for accessing Google Fonts at fonts.google.com
@@ -42,22 +41,24 @@
 fun GoogleFont(context: Context, @FontRes fontXml: Int): GoogleFont {
     val resources = context.resources
     val xml = resources.getXml(fontXml)
-    val loaded = try {
-        FontResourcesParserCompat.parse(xml, resources)
-            as? FontResourcesParserCompat.ProviderResourceEntry
-    } catch (cause: Exception) {
-        val resName = resources.getResourceName(fontXml)
-        throw IllegalArgumentException("Unable to load XML fontRes $resName", cause)
-    }
+    val loaded =
+        try {
+            FontResourcesParserCompat.parse(xml, resources)
+                as? FontResourcesParserCompat.ProviderResourceEntry
+        } catch (cause: Exception) {
+            val resName = resources.getResourceName(fontXml)
+            throw IllegalArgumentException("Unable to load XML fontRes $resName", cause)
+        }
 
-    requireNotNull(loaded) {
-        "Unable to load XML fontRes ${resources.getResourceName(fontXml)}"
-    }
+    requireNotNull(loaded) { "Unable to load XML fontRes ${resources.getResourceName(fontXml)}" }
 
     val query = Uri.parse("?" + loaded.request.query)
-    val name = query.getQueryParameter("name")
-        ?: throw IllegalArgumentException("No google font name provided in fontRes:" +
-            " ${resources.getResourceName(fontXml)}")
+    val name =
+        query.getQueryParameter("name")
+            ?: throw IllegalArgumentException(
+                "No google font name provided in fontRes:" +
+                    " ${resources.getResourceName(fontXml)}"
+            )
     val bestEffort = query.getQueryParameter("besteffort") ?: "true"
     return GoogleFont(name, bestEffort == "true")
 }
diff --git a/compose/ui/ui-text-lint/src/main/java/androidx/compose/ui/text/lint/LocaleInvalidLanguageTagDetector.kt b/compose/ui/ui-text-lint/src/main/java/androidx/compose/ui/text/lint/LocaleInvalidLanguageTagDetector.kt
index 14edcfd..851e4c8 100644
--- a/compose/ui/ui-text-lint/src/main/java/androidx/compose/ui/text/lint/LocaleInvalidLanguageTagDetector.kt
+++ b/compose/ui/ui-text-lint/src/main/java/androidx/compose/ui/text/lint/LocaleInvalidLanguageTagDetector.kt
@@ -32,19 +32,21 @@
 import org.jetbrains.uast.skipParenthesizedExprDown
 
 class LocaleInvalidLanguageTagDetector : Detector(), SourceCodeScanner {
-    override fun getApplicableConstructorTypes() = listOf(
-        "androidx.compose.ui.text.intl.LocaleList",
-        "androidx.compose.ui.text.intl.Locale"
-    )
+    override fun getApplicableConstructorTypes() =
+        listOf("androidx.compose.ui.text.intl.LocaleList", "androidx.compose.ui.text.intl.Locale")
+
     override fun visitConstructor(
         context: JavaContext,
         node: UCallExpression,
         constructor: PsiMethod
     ) {
-        val languageTag = node.valueArguments.find {
-            val name = node.getParameterForArgument(it)?.name
-            name == "languageTag" || name == "languageTags"
-        }?.skipParenthesizedExprDown()
+        val languageTag =
+            node.valueArguments
+                .find {
+                    val name = node.getParameterForArgument(it)?.name
+                    name == "languageTag" || name == "languageTags"
+                }
+                ?.skipParenthesizedExprDown()
 
         val localeValue = languageTag?.evaluate() as? String ?: return
         val localeInvalid = localeValue.contains('_')
@@ -67,18 +69,21 @@
     }
 
     companion object {
-        val InvalidLanguageTagDelimiter = Issue.create(
-            id = "InvalidLanguageTagDelimiter",
-            briefDescription = "Undercore (_) is an unsupported delimiter for subtags",
-            explanation = "A language tag must be compliant with IETF BCP47, specifically a " +
-                "sequence of subtags must be separated by hyphens (-) instead of underscores (_)",
-            category = Category.CORRECTNESS,
-            priority = 3,
-            severity = Severity.ERROR,
-            implementation = Implementation(
-                LocaleInvalidLanguageTagDetector::class.java,
-                EnumSet.of(Scope.JAVA_FILE, Scope.TEST_SOURCES)
+        val InvalidLanguageTagDelimiter =
+            Issue.create(
+                id = "InvalidLanguageTagDelimiter",
+                briefDescription = "Undercore (_) is an unsupported delimiter for subtags",
+                explanation =
+                    "A language tag must be compliant with IETF BCP47, specifically a " +
+                        "sequence of subtags must be separated by hyphens (-) instead of underscores (_)",
+                category = Category.CORRECTNESS,
+                priority = 3,
+                severity = Severity.ERROR,
+                implementation =
+                    Implementation(
+                        LocaleInvalidLanguageTagDetector::class.java,
+                        EnumSet.of(Scope.JAVA_FILE, Scope.TEST_SOURCES)
+                    )
             )
-        )
     }
 }
diff --git a/compose/ui/ui-text-lint/src/main/java/androidx/compose/ui/text/lint/UiTextIssueRegistry.kt b/compose/ui/ui-text-lint/src/main/java/androidx/compose/ui/text/lint/UiTextIssueRegistry.kt
index 8d778f6..f1e728d 100644
--- a/compose/ui/ui-text-lint/src/main/java/androidx/compose/ui/text/lint/UiTextIssueRegistry.kt
+++ b/compose/ui/ui-text-lint/src/main/java/androidx/compose/ui/text/lint/UiTextIssueRegistry.kt
@@ -20,17 +20,17 @@
 import com.android.tools.lint.client.api.Vendor
 import com.android.tools.lint.detector.api.CURRENT_API
 
-/**
- * [IssueRegistry] containing Compose ui-text specific lint issues.
- */
-
+/** [IssueRegistry] containing Compose ui-text specific lint issues. */
 class UiTextIssueRegistry : IssueRegistry() {
     override val api = 14
     override val minApi = CURRENT_API
-    override val issues get() = listOf(LocaleInvalidLanguageTagDetector.InvalidLanguageTagDelimiter)
-    override val vendor = Vendor(
+    override val issues
+        get() = listOf(LocaleInvalidLanguageTagDetector.InvalidLanguageTagDelimiter)
+
+    override val vendor =
+        Vendor(
             vendorName = "Jetpack Compose",
             identifier = "androidx.compose.ui.text",
             feedbackUrl = "https://issuetracker.google.com/issues/new?component=779818"
-    )
+        )
 }
diff --git a/compose/ui/ui-text-lint/src/test/java/androidx/compose/ui/text/lint/LocaleInvalidLanguageTagDetectorTest.kt b/compose/ui/ui-text-lint/src/test/java/androidx/compose/ui/text/lint/LocaleInvalidLanguageTagDetectorTest.kt
index 635db54..7878412 100644
--- a/compose/ui/ui-text-lint/src/test/java/androidx/compose/ui/text/lint/LocaleInvalidLanguageTagDetectorTest.kt
+++ b/compose/ui/ui-text-lint/src/test/java/androidx/compose/ui/text/lint/LocaleInvalidLanguageTagDetectorTest.kt
@@ -25,11 +25,12 @@
 
 @RunWith(JUnit4::class)
 class LocaleInvalidLanguageTagDetectorTest : LintDetectorTest() {
-    private val LocaleStub: TestFile = bytecodeStub(
-        filename = "Locale.kt",
-        filepath = "androidx/compose/ui/text/intl",
-        checksum = 0xddb66f8c,
-        """
+    private val LocaleStub: TestFile =
+        bytecodeStub(
+            filename = "Locale.kt",
+            filepath = "androidx/compose/ui/text/intl",
+            checksum = 0xddb66f8c,
+            """
             package androidx.compose.ui.text.intl
             
             class Locale internal constructor(val value: Int) {
@@ -37,12 +38,12 @@
             }
             
         """,
-        """
+            """
                 META-INF/main.kotlin_module:
                 H4sIAAAAAAAA/2NgYGBmYGBgBGJOBijg4uNiKUktLhFiCwGS3iVKDFoMALlw
                 FOQoAAAA
                 """,
-        """
+            """
                 androidx/compose/ui/text/intl/Locale.class:
                 H4sIAAAAAAAA/41SS08TURT+7kwf02GgQwWEovgAoRRlCnGHIT4Sk0lqNUC6
                 YeNte1NuO50xM7cNy/4W125MNBgXpnHpjzKe2zaAkYXJzLnnfPOdx3zn/vr9
@@ -60,25 +61,26 @@
                 GWJfjeJcjuJgAWv03SM/qye4NU6rjO0OKQD4hN6j9PunMH088PHQxzo2yMUj
                 H5vYOgVLUML2KewE+QTlBAtjW0g0Qk4mgZtg/g+5KP69IAQAAA==
                 """
-    )
+        )
 
-    private val LocaleListStub: TestFile = bytecodeStub(
-        filename = "LocaleList.kt",
-        filepath = "androidx/compose/ui/text/intl",
-        checksum = 0x843815c8,
-        """
+    private val LocaleListStub: TestFile =
+        bytecodeStub(
+            filename = "LocaleList.kt",
+            filepath = "androidx/compose/ui/text/intl",
+            checksum = 0x843815c8,
+            """
             package androidx.compose.ui.text.intl
             
             class LocaleList(val localeList: Int) {
                 constructor(languageTags: String) : this(5)
             }
         """,
-        """
+            """
                 META-INF/main.kotlin_module:
                 H4sIAAAAAAAA/2NgYGBmYGBgBGJOBijg4uNiKUktLhFiCwGS3iVKDFoMALlw
                 FOQoAAAA
                 """,
-        """
+            """
                 androidx/compose/ui/text/intl/LocaleList.class:
                 H4sIAAAAAAAA/41STW/TQBB9a6eJYxzihra0KZSPFpqmUKcVt6IKioRkyRTU
                 VrlUHDbJKt3EsZG9iXrsb+HMBQlUxAFVHPlRiNkkSoroAcmenRnPvHl+s79+
@@ -96,18 +98,19 @@
                 U8lS9ZSKM6HiYA4r9N0jP6cZ3Bq21YZ2kxQAfMreo/b7JzB9PPDx0Mcq1sjF
                 Ix+PsX4ClqKCjRPYKYopqinmhraU6gw52RRuitk/ysbdOTQEAAA=
                 """
-    )
+        )
 
     override fun getDetector() = LocaleInvalidLanguageTagDetector()
 
-    override fun getIssues() = mutableListOf(
-        LocaleInvalidLanguageTagDetector.InvalidLanguageTagDelimiter
-    )
+    override fun getIssues() =
+        mutableListOf(LocaleInvalidLanguageTagDetector.InvalidLanguageTagDelimiter)
 
     @Test
     fun hyphensDelimiter_locale_shouldNotWarn() {
-        lint().files(
-            kotlin("""
+        lint()
+            .files(
+                kotlin(
+                    """
                     package test
 
                     import androidx.compose.ui.text.intl.Locale
@@ -116,17 +119,19 @@
                         val locale = Locale("en-UK")
                     }
                 """
-            ),
-            LocaleStub
-        )
+                ),
+                LocaleStub
+            )
             .run()
             .expectClean()
     }
 
     @Test
     fun hyphensDelimiter_localeList_single_shouldNotWarn() {
-        lint().files(
-            kotlin("""
+        lint()
+            .files(
+                kotlin(
+                    """
                     package test
 
                     import androidx.compose.ui.text.intl.LocaleList
@@ -135,18 +140,20 @@
                         val locale = LocaleList("en-UK")
                     }
                 """
-            ),
-            LocaleStub,
-            LocaleListStub
-        )
+                ),
+                LocaleStub,
+                LocaleListStub
+            )
             .run()
             .expectClean()
     }
 
     @Test
     fun hyphensDelimiter_localeList_multiple_shouldNotWarn() {
-        lint().files(
-            kotlin("""
+        lint()
+            .files(
+                kotlin(
+                    """
                     package test
 
                     import androidx.compose.ui.text.intl.LocaleList
@@ -155,18 +162,20 @@
                         val locale = LocaleList("en-UK,en-US")
                     }
                 """
-            ),
-            LocaleStub,
-            LocaleListStub
-        )
+                ),
+                LocaleStub,
+                LocaleListStub
+            )
             .run()
             .expectClean()
     }
 
     @Test
     fun underscoreDelimiter_locale_shouldWarn() {
-        lint().files(
-            kotlin("""
+        lint()
+            .files(
+                kotlin(
+                    """
                     package test
 
                     import androidx.compose.ui.text.intl.Locale
@@ -176,9 +185,9 @@
                         bar(Locale("en_UK"))
                     }
                 """
-            ),
-            LocaleStub
-        )
+                ),
+                LocaleStub
+            )
             .run()
             .expect(
                 """
@@ -192,8 +201,10 @@
 
     @Test
     fun underscoreDelimiter_localeList_single_shouldWarn() {
-        lint().files(
-            kotlin("""
+        lint()
+            .files(
+                kotlin(
+                    """
                     package test
 
                     import androidx.compose.ui.text.intl.LocaleList
@@ -202,10 +213,10 @@
                         val locale = LocaleList("en_UK")
                     }
                 """
-            ),
-            LocaleStub,
-            LocaleListStub
-        )
+                ),
+                LocaleStub,
+                LocaleListStub
+            )
             .run()
             .expect(
                 """
@@ -219,8 +230,10 @@
 
     @Test
     fun underscoreDelimiter_localeList_multiple_shouldWarn() {
-        lint().files(
-            kotlin("""
+        lint()
+            .files(
+                kotlin(
+                    """
                     package test
 
                     import androidx.compose.ui.text.intl.LocaleList
@@ -229,10 +242,10 @@
                         val locale = LocaleList("en_UK,en-US")
                     }
                 """
-            ),
-            LocaleStub,
-            LocaleListStub
-        )
+                ),
+                LocaleStub,
+                LocaleListStub
+            )
             .run()
             .expect(
                 """
diff --git a/compose/ui/ui-text/benchmark/src/androidTest/java/androidx/compose/ui/text/benchmark/FrameworkTextLayoutBenchmark.kt b/compose/ui/ui-text/benchmark/src/androidTest/java/androidx/compose/ui/text/benchmark/FrameworkTextLayoutBenchmark.kt
index 2d3c075..2e510f5 100644
--- a/compose/ui/ui-text/benchmark/src/androidTest/java/androidx/compose/ui/text/benchmark/FrameworkTextLayoutBenchmark.kt
+++ b/compose/ui/ui-text/benchmark/src/androidTest/java/androidx/compose/ui/text/benchmark/FrameworkTextLayoutBenchmark.kt
@@ -45,11 +45,9 @@
         fun initParameters() = arrayOf(32, 512)
     }
 
-    @get:Rule
-    val benchmarkRule = BenchmarkRule()
+    @get:Rule val benchmarkRule = BenchmarkRule()
 
-    @get:Rule
-    val textBenchmarkRule = TextBenchmarkTestRule(Alphabet.Latin)
+    @get:Rule val textBenchmarkRule = TextBenchmarkTestRule(Alphabet.Latin)
 
     private lateinit var instrumentationContext: Context
     // Width and fontSize initialized in setup().
@@ -59,31 +57,36 @@
     @Before
     fun setup() {
         instrumentationContext = InstrumentationRegistry.getInstrumentation().context
-        width = TypedValue.applyDimension(
-            TypedValue.COMPLEX_UNIT_DIP,
-            textBenchmarkRule.widthDp,
-            instrumentationContext.resources.displayMetrics
-        ).roundToInt()
-        fontSize = TypedValue.applyDimension(
-            TypedValue.COMPLEX_UNIT_SP,
-            textBenchmarkRule.fontSizeSp,
-            instrumentationContext.resources.displayMetrics
-        )
+        width =
+            TypedValue.applyDimension(
+                    TypedValue.COMPLEX_UNIT_DIP,
+                    textBenchmarkRule.widthDp,
+                    instrumentationContext.resources.displayMetrics
+                )
+                .roundToInt()
+        fontSize =
+            TypedValue.applyDimension(
+                TypedValue.COMPLEX_UNIT_SP,
+                textBenchmarkRule.fontSizeSp,
+                instrumentationContext.resources.displayMetrics
+            )
     }
 
     @Test
     fun staticLayoutCreation() {
         textBenchmarkRule.generator { textGenerator ->
             benchmarkRule.measureRepeated {
-                val (text, paint) = runWithTimingDisabled {
-                    val text = textGenerator.nextParagraph(textLength)
-                    val paint = TextPaint().apply {
-                        this.typeface = Typeface.DEFAULT
-                        this.color = Color.BLACK
-                        this.textSize = fontSize
+                val (text, paint) =
+                    runWithTimingDisabled {
+                        val text = textGenerator.nextParagraph(textLength)
+                        val paint =
+                            TextPaint().apply {
+                                this.typeface = Typeface.DEFAULT
+                                this.color = Color.BLACK
+                                this.textSize = fontSize
+                            }
+                        Pair(text, paint)
                     }
-                    Pair(text, paint)
-                }
                 if (Build.VERSION.SDK_INT >= 23) {
                     StaticLayout.Builder.obtain(text, 0, text.length, paint, width).build()
                 } else {
@@ -106,14 +109,16 @@
     fun boringLayoutCreation() {
         textBenchmarkRule.generator { textGenerator ->
             benchmarkRule.measureRepeated {
-                val (text, paint) = runWithTimingDisabled {
-                    val text = textGenerator.nextParagraph(textLength)
-                    val paint = TextPaint().apply {
-                        this.typeface = Typeface.DEFAULT
-                        this.textSize = fontSize
+                val (text, paint) =
+                    runWithTimingDisabled {
+                        val text = textGenerator.nextParagraph(textLength)
+                        val paint =
+                            TextPaint().apply {
+                                this.typeface = Typeface.DEFAULT
+                                this.textSize = fontSize
+                            }
+                        Pair(text, paint)
                     }
-                    Pair(text, paint)
-                }
                 val metrics = BoringLayout.isBoring(text, paint)
                 BoringLayout(
                     text,
diff --git a/compose/ui/ui-text/benchmark/src/androidTest/java/androidx/compose/ui/text/benchmark/NonLinearFontScalingBenchmark.kt b/compose/ui/ui-text/benchmark/src/androidTest/java/androidx/compose/ui/text/benchmark/NonLinearFontScalingBenchmark.kt
index 79bac98..967b8cc 100644
--- a/compose/ui/ui-text/benchmark/src/androidTest/java/androidx/compose/ui/text/benchmark/NonLinearFontScalingBenchmark.kt
+++ b/compose/ui/ui-text/benchmark/src/androidTest/java/androidx/compose/ui/text/benchmark/NonLinearFontScalingBenchmark.kt
@@ -53,24 +53,21 @@
 ) {
     companion object {
         @JvmStatic
-        @Parameterized.Parameters(
-            name = "length={0} fontSize={1} isLineHeightSp={2}"
-        )
-        fun initParameters(): List<Array<Any?>> = cartesian(
-            arrayOf(512),
-            // font size
-            arrayOf(8, 30),
-            // isLineHeightSp. This helps us verify that the calculation to keep line heights
-            // proportional doesn't affect performance too much. (see b/273326061)
-            arrayOf(false, true)
-        )
+        @Parameterized.Parameters(name = "length={0} fontSize={1} isLineHeightSp={2}")
+        fun initParameters(): List<Array<Any?>> =
+            cartesian(
+                arrayOf(512),
+                // font size
+                arrayOf(8, 30),
+                // isLineHeightSp. This helps us verify that the calculation to keep line heights
+                // proportional doesn't affect performance too much. (see b/273326061)
+                arrayOf(false, true)
+            )
     }
 
-    @get:Rule
-    val benchmarkRule = BenchmarkRule()
+    @get:Rule val benchmarkRule = BenchmarkRule()
 
-    @get:Rule
-    val textBenchmarkRule = TextBenchmarkTestRule(Alphabet.Latin)
+    @get:Rule val textBenchmarkRule = TextBenchmarkTestRule(Alphabet.Latin)
 
     private lateinit var instrumentationContext: Context
 
@@ -81,22 +78,19 @@
     @Before
     fun setup() {
         instrumentationContext = InstrumentationRegistry.getInstrumentation().context
-        width = TypedValue.applyDimension(
-            TypedValue.COMPLEX_UNIT_DIP,
-            textBenchmarkRule.widthDp,
-            instrumentationContext.resources.displayMetrics
-        )
+        width =
+            TypedValue.applyDimension(
+                TypedValue.COMPLEX_UNIT_DIP,
+                textBenchmarkRule.widthDp,
+                instrumentationContext.resources.displayMetrics
+            )
     }
 
     private fun text(textGenerator: RandomTextGenerator): String {
         return textGenerator.nextParagraph(textLength) + "\n"
     }
 
-    private fun paragraph(
-        text: String,
-        width: Float,
-        density: Density
-    ): Paragraph {
+    private fun paragraph(text: String, width: Float, density: Density): Paragraph {
         return Paragraph(
             paragraphIntrinsics = paragraphIntrinsics(text, density),
             constraints = Constraints(maxWidth = ceil(width).toInt())
@@ -107,21 +101,22 @@
         assertThat(fontSize.isSp).isTrue()
 
         @Suppress("DEPRECATION")
-        val style = if (isLineHeightSp) {
-            TextStyle(
-                fontSize = fontSize,
-                lineHeight = fontSize * 2,
-                lineHeightStyle = LineHeightStyle.Default,
-                platformStyle = PlatformTextStyle(includeFontPadding = false)
-            )
-        } else {
-            TextStyle(
-                fontSize = fontSize,
-                lineHeight = 2.em,
-                lineHeightStyle = LineHeightStyle.Default,
-                platformStyle = PlatformTextStyle(includeFontPadding = false)
-            )
-        }
+        val style =
+            if (isLineHeightSp) {
+                TextStyle(
+                    fontSize = fontSize,
+                    lineHeight = fontSize * 2,
+                    lineHeightStyle = LineHeightStyle.Default,
+                    platformStyle = PlatformTextStyle(includeFontPadding = false)
+                )
+            } else {
+                TextStyle(
+                    fontSize = fontSize,
+                    lineHeight = 2.em,
+                    lineHeightStyle = LineHeightStyle.Default,
+                    platformStyle = PlatformTextStyle(includeFontPadding = false)
+                )
+            }
 
         return ParagraphIntrinsics(
             text = text,
@@ -133,10 +128,8 @@
 
     @Test
     fun nonLinearfontScaling1x_construct() {
-        val density = Density(
-            instrumentationContext.resources.displayMetrics.density,
-            fontScale = 1f
-        )
+        val density =
+            Density(instrumentationContext.resources.displayMetrics.density, fontScale = 1f)
 
         textBenchmarkRule.generator { textGenerator ->
             benchmarkRule.measureRepeated {
@@ -153,10 +146,8 @@
 
     @Test
     fun nonLinearfontScaling2x_construct() {
-        val density = Density(
-            instrumentationContext.resources.displayMetrics.density,
-            fontScale = 2f
-        )
+        val density =
+            Density(instrumentationContext.resources.displayMetrics.density, fontScale = 2f)
 
         textBenchmarkRule.generator { textGenerator ->
             benchmarkRule.measureRepeated {
diff --git a/compose/ui/ui-text/benchmark/src/androidTest/java/androidx/compose/ui/text/benchmark/ParagraphBenchmark.kt b/compose/ui/ui-text/benchmark/src/androidTest/java/androidx/compose/ui/text/benchmark/ParagraphBenchmark.kt
index efd0149..b0fbaea 100644
--- a/compose/ui/ui-text/benchmark/src/androidTest/java/androidx/compose/ui/text/benchmark/ParagraphBenchmark.kt
+++ b/compose/ui/ui-text/benchmark/src/androidTest/java/androidx/compose/ui/text/benchmark/ParagraphBenchmark.kt
@@ -51,18 +51,17 @@
     companion object {
         @JvmStatic
         @Parameterized.Parameters(name = "length={0} type={1} alphabet={2}")
-        fun initParameters(): List<Array<Any?>> = cartesian(
-            arrayOf(512),
-            arrayOf(TextType.PlainText),
-            arrayOf(Alphabet.Latin, Alphabet.Cjk)
-        )
+        fun initParameters(): List<Array<Any?>> =
+            cartesian(
+                arrayOf(512),
+                arrayOf(TextType.PlainText),
+                arrayOf(Alphabet.Latin, Alphabet.Cjk)
+            )
     }
 
-    @get:Rule
-    val benchmarkRule = BenchmarkRule()
+    @get:Rule val benchmarkRule = BenchmarkRule()
 
-    @get:Rule
-    val textBenchmarkRule = TextBenchmarkTestRule(alphabet)
+    @get:Rule val textBenchmarkRule = TextBenchmarkTestRule(alphabet)
 
     private lateinit var instrumentationContext: Context
     // Width initialized in setup().
@@ -72,20 +71,22 @@
     @Before
     fun setup() {
         instrumentationContext = InstrumentationRegistry.getInstrumentation().context
-        width = TypedValue.applyDimension(
-            TypedValue.COMPLEX_UNIT_DIP,
-            textBenchmarkRule.widthDp,
-            instrumentationContext.resources.displayMetrics
-        )
+        width =
+            TypedValue.applyDimension(
+                TypedValue.COMPLEX_UNIT_DIP,
+                textBenchmarkRule.widthDp,
+                instrumentationContext.resources.displayMetrics
+            )
     }
 
     private fun text(textGenerator: RandomTextGenerator): AnnotatedString {
         val text = textGenerator.nextParagraph(textLength)
-        val spanStyles = if (textType == TextType.StyledText) {
-            textGenerator.createStyles(text)
-        } else {
-            listOf()
-        }
+        val spanStyles =
+            if (textType == TextType.StyledText) {
+                textGenerator.createStyles(text)
+            } else {
+                listOf()
+            }
         return AnnotatedString(text = text, spanStyles = spanStyles)
     }
 
@@ -100,9 +101,7 @@
         )
     }
 
-    private fun paragraphIntrinsics(
-        textGenerator: RandomTextGenerator
-    ): ParagraphIntrinsics {
+    private fun paragraphIntrinsics(textGenerator: RandomTextGenerator): ParagraphIntrinsics {
         val annotatedString = text(textGenerator)
         return paragraphIntrinsics(
             text = annotatedString.text,
@@ -127,9 +126,7 @@
     fun minIntrinsicWidth() {
         textBenchmarkRule.generator { textGenerator ->
             benchmarkRule.measureRepeated {
-                val intrinsics = runWithTimingDisabled {
-                    paragraphIntrinsics(textGenerator)
-                }
+                val intrinsics = runWithTimingDisabled { paragraphIntrinsics(textGenerator) }
 
                 intrinsics.minIntrinsicWidth
             }
@@ -140,9 +137,7 @@
     fun maxIntrinsicWidth() {
         textBenchmarkRule.generator { textGenerator ->
             benchmarkRule.measureRepeated {
-                val intrinsics = runWithTimingDisabled {
-                    paragraphIntrinsics(textGenerator)
-                }
+                val intrinsics = runWithTimingDisabled { paragraphIntrinsics(textGenerator) }
 
                 intrinsics.maxIntrinsicWidth
             }
@@ -168,33 +163,31 @@
         }
     }
 
-    /**
-     * The time taken to paint the [Paragraph] on [Canvas] for the first time.
-     */
+    /** The time taken to paint the [Paragraph] on [Canvas] for the first time. */
     @Test
     fun first_paint() {
         textBenchmarkRule.generator { textGenerator ->
             benchmarkRule.measureRepeated {
-                val (paragraph, canvas) = runWithTimingDisabled {
-                    val annotatedString = text(textGenerator)
-                    val paragraph = paragraph(
-                        annotatedString.text,
-                        annotatedString.spanStyles,
-                        width
-                    )
-                    val canvas = Canvas(
-                        ImageBitmap(paragraph.width.roundToInt(), paragraph.height.roundToInt())
-                    )
-                    Pair(paragraph, canvas)
-                }
+                val (paragraph, canvas) =
+                    runWithTimingDisabled {
+                        val annotatedString = text(textGenerator)
+                        val paragraph =
+                            paragraph(annotatedString.text, annotatedString.spanStyles, width)
+                        val canvas =
+                            Canvas(
+                                ImageBitmap(
+                                    paragraph.width.roundToInt(),
+                                    paragraph.height.roundToInt()
+                                )
+                            )
+                        Pair(paragraph, canvas)
+                    }
                 paragraph.paint(canvas)
             }
         }
     }
 
-    /**
-     * The time taken to repaint the [Paragraph] on [Canvas].
-     */
+    /** The time taken to repaint the [Paragraph] on [Canvas]. */
     @Test
     fun paint() {
         textBenchmarkRule.generator { textGenerator ->
@@ -202,14 +195,11 @@
             // create a new paragraph and use a smaller width to get
             // some line breaking in the result
             val paragraph = paragraph(annotatedString.text, annotatedString.spanStyles, width)
-            val canvas = Canvas(
-                ImageBitmap(paragraph.width.roundToInt(), paragraph.height.roundToInt())
-            )
+            val canvas =
+                Canvas(ImageBitmap(paragraph.width.roundToInt(), paragraph.height.roundToInt()))
             // Paint for the first time, so that we only benchmark repaint.
             paragraph.paint(canvas)
-            benchmarkRule.measureRepeated {
-                paragraph.paint(canvas)
-            }
+            benchmarkRule.measureRepeated { paragraph.paint(canvas) }
         }
     }
 }
diff --git a/compose/ui/ui-text/benchmark/src/androidTest/java/androidx/compose/ui/text/benchmark/ParagraphMethodBenchmark.kt b/compose/ui/ui-text/benchmark/src/androidTest/java/androidx/compose/ui/text/benchmark/ParagraphMethodBenchmark.kt
index 1078156..e06b9f6 100644
--- a/compose/ui/ui-text/benchmark/src/androidTest/java/androidx/compose/ui/text/benchmark/ParagraphMethodBenchmark.kt
+++ b/compose/ui/ui-text/benchmark/src/androidTest/java/androidx/compose/ui/text/benchmark/ParagraphMethodBenchmark.kt
@@ -35,25 +35,19 @@
 import org.junit.runner.RunWith
 import org.junit.runners.Parameterized
 
-/**
- * The benchmark for methods of [Paragraph].
- */
+/** The benchmark for methods of [Paragraph]. */
 @LargeTest
 @RunWith(Parameterized::class)
 class ParagraphMethodBenchmark(private val textType: TextType, private val textLength: Int) {
-    @get:Rule
-    val benchmarkRule = BenchmarkRule()
+    @get:Rule val benchmarkRule = BenchmarkRule()
 
-    @get:Rule
-    val textBenchmarkRule = TextBenchmarkTestRule()
+    @get:Rule val textBenchmarkRule = TextBenchmarkTestRule()
 
     companion object {
         @JvmStatic
         @Parameterized.Parameters(name = "type={0} length={1}")
-        fun initParameters() = cartesian(
-            arrayOf(TextType.PlainText, TextType.StyledText),
-            arrayOf(512)
-        )
+        fun initParameters() =
+            cartesian(arrayOf(TextType.PlainText, TextType.StyledText), arrayOf(512))
     }
 
     private val context: Context = InstrumentationRegistry.getInstrumentation().context
@@ -66,11 +60,12 @@
         textLength: Int
     ): ParagraphIntrinsics {
         val text = textGenerator.nextParagraph(textLength)
-        val spanStyles = if (textType == TextType.StyledText) {
-            textGenerator.createStyles(text)
-        } else {
-            listOf()
-        }
+        val spanStyles =
+            if (textType == TextType.StyledText) {
+                textGenerator.createStyles(text)
+            } else {
+                listOf()
+            }
         return ParagraphIntrinsics(
             text = text,
             density = Density(density = 1f),
@@ -88,9 +83,11 @@
         val paragraphIntrinsics = paragraphIntrinsics(textGenerator, textLength)
         return Paragraph(
             paragraphIntrinsics = paragraphIntrinsics,
-            constraints = Constraints(
-                maxWidth = ceil(paragraphIntrinsics.maxIntrinsicWidth / preferredLineCount).toInt()
-            )
+            constraints =
+                Constraints(
+                    maxWidth =
+                        ceil(paragraphIntrinsics.maxIntrinsicWidth / preferredLineCount).toInt()
+                )
         )
     }
 
@@ -98,9 +95,7 @@
     fun getPathForRange() {
         textBenchmarkRule.generator { generator ->
             val paragraph = paragraph(generator)
-            benchmarkRule.measureRepeated {
-                paragraph.getPathForRange(0, textLength / 2)
-            }
+            benchmarkRule.measureRepeated { paragraph.getPathForRange(0, textLength / 2) }
         }
     }
 
@@ -108,9 +103,7 @@
     fun getCursorRect() {
         textBenchmarkRule.generator { generator ->
             val paragraph = paragraph(generator)
-            benchmarkRule.measureRepeated {
-                paragraph.getCursorRect(textLength / 2)
-            }
+            benchmarkRule.measureRepeated { paragraph.getCursorRect(textLength / 2) }
         }
     }
 
@@ -119,9 +112,7 @@
         textBenchmarkRule.generator { generator ->
             val paragraph = paragraph(generator)
             val line = paragraph.lineCount / 2
-            benchmarkRule.measureRepeated {
-                paragraph.getLineLeft(line)
-            }
+            benchmarkRule.measureRepeated { paragraph.getLineLeft(line) }
         }
     }
 
@@ -130,9 +121,7 @@
         textBenchmarkRule.generator { generator ->
             val paragraph = paragraph(generator)
             val line = paragraph.lineCount / 2
-            benchmarkRule.measureRepeated {
-                paragraph.getLineRight(line)
-            }
+            benchmarkRule.measureRepeated { paragraph.getLineRight(line) }
         }
     }
 
@@ -141,9 +130,7 @@
         textBenchmarkRule.generator { generator ->
             val paragraph = paragraph(generator)
             val line = paragraph.lineCount / 2
-            benchmarkRule.measureRepeated {
-                paragraph.getLineWidth(line / 2)
-            }
+            benchmarkRule.measureRepeated { paragraph.getLineWidth(line / 2) }
         }
     }
 
@@ -151,9 +138,7 @@
     fun getHorizontalPosition() {
         textBenchmarkRule.generator { generator ->
             val paragraph = paragraph(generator)
-            benchmarkRule.measureRepeated {
-                paragraph.getHorizontalPosition(textLength / 2, true)
-            }
+            benchmarkRule.measureRepeated { paragraph.getHorizontalPosition(textLength / 2, true) }
         }
     }
 
@@ -162,9 +147,7 @@
         textBenchmarkRule.generator { generator ->
             val paragraph = paragraph(generator)
             val centerPosition = Offset(paragraph.width / 2, paragraph.height / 2)
-            benchmarkRule.measureRepeated {
-                paragraph.getOffsetForPosition(centerPosition)
-            }
+            benchmarkRule.measureRepeated { paragraph.getOffsetForPosition(centerPosition) }
         }
     }
 
@@ -172,9 +155,7 @@
     fun getBoundingBox() {
         textBenchmarkRule.generator { generator ->
             val paragraph = paragraph(generator)
-            benchmarkRule.measureRepeated {
-                paragraph.getBoundingBox(textLength / 2)
-            }
+            benchmarkRule.measureRepeated { paragraph.getBoundingBox(textLength / 2) }
         }
     }
 }
diff --git a/compose/ui/ui-text/benchmark/src/androidTest/java/androidx/compose/ui/text/benchmark/ParagraphWithLineHeightBenchmark.kt b/compose/ui/ui-text/benchmark/src/androidTest/java/androidx/compose/ui/text/benchmark/ParagraphWithLineHeightBenchmark.kt
index 9bda1d2..d480613 100644
--- a/compose/ui/ui-text/benchmark/src/androidTest/java/androidx/compose/ui/text/benchmark/ParagraphWithLineHeightBenchmark.kt
+++ b/compose/ui/ui-text/benchmark/src/androidTest/java/androidx/compose/ui/text/benchmark/ParagraphWithLineHeightBenchmark.kt
@@ -47,23 +47,20 @@
 ) {
     companion object {
         @JvmStatic
-        @Parameterized.Parameters(
-            name = "length={0} newLine={1} applyLineHeight={2}"
-        )
-        fun initParameters(): List<Array<Any?>> = cartesian(
-            arrayOf(16),
-            // add new line
-            arrayOf(true),
-            // apply line height
-            arrayOf(false, true)
-        )
+        @Parameterized.Parameters(name = "length={0} newLine={1} applyLineHeight={2}")
+        fun initParameters(): List<Array<Any?>> =
+            cartesian(
+                arrayOf(16),
+                // add new line
+                arrayOf(true),
+                // apply line height
+                arrayOf(false, true)
+            )
     }
 
-    @get:Rule
-    val benchmarkRule = BenchmarkRule()
+    @get:Rule val benchmarkRule = BenchmarkRule()
 
-    @get:Rule
-    val textBenchmarkRule = TextBenchmarkTestRule(Alphabet.Latin)
+    @get:Rule val textBenchmarkRule = TextBenchmarkTestRule(Alphabet.Latin)
 
     private lateinit var instrumentationContext: Context
 
@@ -74,21 +71,19 @@
     @Before
     fun setup() {
         instrumentationContext = InstrumentationRegistry.getInstrumentation().context
-        width = TypedValue.applyDimension(
-            TypedValue.COMPLEX_UNIT_DIP,
-            textBenchmarkRule.widthDp,
-            instrumentationContext.resources.displayMetrics
-        )
+        width =
+            TypedValue.applyDimension(
+                TypedValue.COMPLEX_UNIT_DIP,
+                textBenchmarkRule.widthDp,
+                instrumentationContext.resources.displayMetrics
+            )
     }
 
     private fun text(textGenerator: RandomTextGenerator): String {
         return textGenerator.nextParagraph(textLength) + if (addNewLine) "\n" else ""
     }
 
-    private fun paragraph(
-        text: String,
-        width: Float
-    ): Paragraph {
+    private fun paragraph(text: String, width: Float): Paragraph {
         return Paragraph(
             paragraphIntrinsics = paragraphIntrinsics(text),
             constraints = Constraints(maxWidth = ceil(width).toInt())
@@ -97,20 +92,21 @@
 
     private fun paragraphIntrinsics(text: String): ParagraphIntrinsics {
         @Suppress("DEPRECATION")
-        val style = if (applyLineHeight) {
-            TextStyle(
-                fontSize = fontSize,
-                lineHeight = fontSize * 2,
-                lineHeightStyle = LineHeightStyle.Default,
-                platformStyle = PlatformTextStyle(includeFontPadding = false)
-            )
-        } else {
-            TextStyle(
-                fontSize = fontSize,
-                lineHeightStyle = LineHeightStyle.Default,
-                platformStyle = PlatformTextStyle(includeFontPadding = false)
-            )
-        }
+        val style =
+            if (applyLineHeight) {
+                TextStyle(
+                    fontSize = fontSize,
+                    lineHeight = fontSize * 2,
+                    lineHeightStyle = LineHeightStyle.Default,
+                    platformStyle = PlatformTextStyle(includeFontPadding = false)
+                )
+            } else {
+                TextStyle(
+                    fontSize = fontSize,
+                    lineHeightStyle = LineHeightStyle.Default,
+                    platformStyle = PlatformTextStyle(includeFontPadding = false)
+                )
+            }
 
         return ParagraphIntrinsics(
             text = text,
diff --git a/compose/ui/ui-text/benchmark/src/androidTest/java/androidx/compose/ui/text/benchmark/TextMeasurerBenchmark.kt b/compose/ui/ui-text/benchmark/src/androidTest/java/androidx/compose/ui/text/benchmark/TextMeasurerBenchmark.kt
index 07b7d03..75d82a4 100644
--- a/compose/ui/ui-text/benchmark/src/androidTest/java/androidx/compose/ui/text/benchmark/TextMeasurerBenchmark.kt
+++ b/compose/ui/ui-text/benchmark/src/androidTest/java/androidx/compose/ui/text/benchmark/TextMeasurerBenchmark.kt
@@ -53,18 +53,17 @@
     companion object {
         @JvmStatic
         @Parameterized.Parameters(name = "length={0} type={1} alphabet={2}")
-        fun initParameters(): List<Array<Any?>> = cartesian(
-            arrayOf(8, 32, 128, 512),
-            arrayOf(TextType.PlainText, TextType.StyledText),
-            arrayOf(Alphabet.Latin, Alphabet.Cjk)
-        )
+        fun initParameters(): List<Array<Any?>> =
+            cartesian(
+                arrayOf(8, 32, 128, 512),
+                arrayOf(TextType.PlainText, TextType.StyledText),
+                arrayOf(Alphabet.Latin, Alphabet.Cjk)
+            )
     }
 
-    @get:Rule
-    val benchmarkRule = BenchmarkRule()
+    @get:Rule val benchmarkRule = BenchmarkRule()
 
-    @get:Rule
-    val textBenchmarkRule = TextBenchmarkTestRule(alphabet)
+    @get:Rule val textBenchmarkRule = TextBenchmarkTestRule(alphabet)
 
     private lateinit var instrumentationContext: Context
 
@@ -75,32 +74,36 @@
     @Before
     fun setup() {
         instrumentationContext = InstrumentationRegistry.getInstrumentation().context
-        width = TypedValue.applyDimension(
-            TypedValue.COMPLEX_UNIT_DIP,
-            textBenchmarkRule.widthDp,
-            instrumentationContext.resources.displayMetrics
-        ).roundToInt()
+        width =
+            TypedValue.applyDimension(
+                    TypedValue.COMPLEX_UNIT_DIP,
+                    textBenchmarkRule.widthDp,
+                    instrumentationContext.resources.displayMetrics
+                )
+                .roundToInt()
     }
 
     private fun text(textGenerator: RandomTextGenerator): AnnotatedString {
         val text = textGenerator.nextParagraph(textLength)
-        val spanStyles = if (textType == TextType.StyledText) {
-            textGenerator.createStyles(text)
-        } else {
-            listOf()
-        }
+        val spanStyles =
+            if (textType == TextType.StyledText) {
+                textGenerator.createStyles(text)
+            } else {
+                listOf()
+            }
         return AnnotatedString(text = text, spanStyles = spanStyles)
     }
 
     @Test
     fun text_measurer_no_cache() {
         textBenchmarkRule.generator { textGenerator ->
-            val textMeasurer = TextMeasurer(
-                defaultFontFamilyResolver = createFontFamilyResolver(instrumentationContext),
-                defaultDensity = Density(instrumentationContext),
-                defaultLayoutDirection = LayoutDirection.Ltr,
-                cacheSize = 0
-            )
+            val textMeasurer =
+                TextMeasurer(
+                    defaultFontFamilyResolver = createFontFamilyResolver(instrumentationContext),
+                    defaultDensity = Density(instrumentationContext),
+                    defaultLayoutDirection = LayoutDirection.Ltr,
+                    cacheSize = 0
+                )
             val text = text(textGenerator)
             benchmarkRule.measureRepeated {
                 textMeasurer.measure(
@@ -115,12 +118,13 @@
     @Test
     fun text_measurer_cached() {
         textBenchmarkRule.generator { textGenerator ->
-            val textMeasurer = TextMeasurer(
-                defaultFontFamilyResolver = createFontFamilyResolver(instrumentationContext),
-                defaultDensity = Density(instrumentationContext),
-                defaultLayoutDirection = LayoutDirection.Ltr,
-                cacheSize = 16
-            )
+            val textMeasurer =
+                TextMeasurer(
+                    defaultFontFamilyResolver = createFontFamilyResolver(instrumentationContext),
+                    defaultDensity = Density(instrumentationContext),
+                    defaultLayoutDirection = LayoutDirection.Ltr,
+                    cacheSize = 16
+                )
             val text = text(textGenerator)
             benchmarkRule.measureRepeated {
                 textMeasurer.measure(
@@ -135,21 +139,22 @@
     @Test
     fun drawText_TextLayoutResult_no_change() {
         textBenchmarkRule.generator { textGenerator ->
-            val textMeasurer = TextMeasurer(
-                defaultFontFamilyResolver = createFontFamilyResolver(instrumentationContext),
-                defaultDensity = Density(instrumentationContext),
-                defaultLayoutDirection = LayoutDirection.Ltr,
-                cacheSize = 16
-            )
-            val textLayoutResult = textMeasurer.measure(
-                text(textGenerator),
-                style = TextStyle(color = Color.Red, fontSize = fontSize),
-                constraints = Constraints.fixedWidth(width)
-            )
+            val textMeasurer =
+                TextMeasurer(
+                    defaultFontFamilyResolver = createFontFamilyResolver(instrumentationContext),
+                    defaultDensity = Density(instrumentationContext),
+                    defaultLayoutDirection = LayoutDirection.Ltr,
+                    cacheSize = 16
+                )
+            val textLayoutResult =
+                textMeasurer.measure(
+                    text(textGenerator),
+                    style = TextStyle(color = Color.Red, fontSize = fontSize),
+                    constraints = Constraints.fixedWidth(width)
+                )
             val drawScope = CanvasDrawScope()
-            val canvas = Canvas(
-                ImageBitmap(textLayoutResult.size.width, textLayoutResult.size.height)
-            )
+            val canvas =
+                Canvas(ImageBitmap(textLayoutResult.size.width, textLayoutResult.size.height))
             benchmarkRule.measureRepeated {
                 drawScope.draw(
                     Density(instrumentationContext),
@@ -166,21 +171,22 @@
     @Test
     fun drawText_TextLayoutResult_color_override() {
         textBenchmarkRule.generator { textGenerator ->
-            val textMeasurer = TextMeasurer(
-                defaultFontFamilyResolver = createFontFamilyResolver(instrumentationContext),
-                defaultDensity = Density(instrumentationContext),
-                defaultLayoutDirection = LayoutDirection.Ltr,
-                cacheSize = 16
-            )
-            val textLayoutResult = textMeasurer.measure(
-                text(textGenerator),
-                style = TextStyle(color = Color.Red, fontSize = fontSize),
-                constraints = Constraints.fixedWidth(width)
-            )
+            val textMeasurer =
+                TextMeasurer(
+                    defaultFontFamilyResolver = createFontFamilyResolver(instrumentationContext),
+                    defaultDensity = Density(instrumentationContext),
+                    defaultLayoutDirection = LayoutDirection.Ltr,
+                    cacheSize = 16
+                )
+            val textLayoutResult =
+                textMeasurer.measure(
+                    text(textGenerator),
+                    style = TextStyle(color = Color.Red, fontSize = fontSize),
+                    constraints = Constraints.fixedWidth(width)
+                )
             val drawScope = CanvasDrawScope()
-            val canvas = Canvas(
-                ImageBitmap(textLayoutResult.size.width, textLayoutResult.size.height)
-            )
+            val canvas =
+                Canvas(ImageBitmap(textLayoutResult.size.width, textLayoutResult.size.height))
             benchmarkRule.measureRepeated {
                 drawScope.draw(
                     Density(instrumentationContext),
diff --git a/compose/ui/ui-text/benchmark/src/androidTest/java/androidx/compose/ui/text/benchmark/font/PlatformFontLookup.kt b/compose/ui/ui-text/benchmark/src/androidTest/java/androidx/compose/ui/text/benchmark/font/PlatformFontLookup.kt
index 5de37b2..b1a0dbc 100644
--- a/compose/ui/ui-text/benchmark/src/androidTest/java/androidx/compose/ui/text/benchmark/font/PlatformFontLookup.kt
+++ b/compose/ui/ui-text/benchmark/src/androidTest/java/androidx/compose/ui/text/benchmark/font/PlatformFontLookup.kt
@@ -39,24 +39,20 @@
     companion object {
         @JvmStatic
         @Parameterized.Parameters(name = "fontFamily={0} fontWeight={1}")
-        fun initParameters() = cartesian(
-            arrayOf(
-                FontFamily.Default,
-                FontFamily.SansSerif,
-                FontFamily.Serif,
-                FontFamily.Cursive,
-                FontFamily.Monospace
-            ),
-            arrayOf(
-                100,
-                400,
-                700
-            ).map { FontWeight(it) }.toTypedArray()
-        )
+        fun initParameters() =
+            cartesian(
+                arrayOf(
+                    FontFamily.Default,
+                    FontFamily.SansSerif,
+                    FontFamily.Serif,
+                    FontFamily.Cursive,
+                    FontFamily.Monospace
+                ),
+                arrayOf(100, 400, 700).map { FontWeight(it) }.toTypedArray()
+            )
     }
 
-    @get:Rule
-    val benchmarkRule = BenchmarkRule()
+    @get:Rule val benchmarkRule = BenchmarkRule()
 
     private val context: Context = InstrumentationRegistry.getInstrumentation().context
 
@@ -64,9 +60,7 @@
     @Test
     fun forceUncached() {
         benchmarkRule.measureRepeated {
-            val fontFamilyResolver = runWithTimingDisabled {
-                emptyCacheFontFamilyResolver(context)
-            }
+            val fontFamilyResolver = runWithTimingDisabled { emptyCacheFontFamilyResolver(context) }
             fontFamilyResolver.resolve(fontFamily, fontWeight)
         }
     }
@@ -74,9 +68,7 @@
     @Test
     fun cached() {
         benchmarkRule.measureRepeated {
-            val fontFamilyResolver = runWithTimingDisabled {
-                createFontFamilyResolver(context)
-            }
+            val fontFamilyResolver = runWithTimingDisabled { createFontFamilyResolver(context) }
             fontFamilyResolver.resolve(fontFamily, fontWeight)
         }
     }
diff --git a/compose/ui/ui-text/benchmark/src/androidTest/java/androidx/compose/ui/text/benchmark/input/EditProcessorBenchmark.kt b/compose/ui/ui-text/benchmark/src/androidTest/java/androidx/compose/ui/text/benchmark/input/EditProcessorBenchmark.kt
index 14de92a..5bdd091 100644
--- a/compose/ui/ui-text/benchmark/src/androidTest/java/androidx/compose/ui/text/benchmark/input/EditProcessorBenchmark.kt
+++ b/compose/ui/ui-text/benchmark/src/androidTest/java/androidx/compose/ui/text/benchmark/input/EditProcessorBenchmark.kt
@@ -43,9 +43,7 @@
 class EditProcessorBenchmark(val initText: InitialText, val scenario: TestScenario) {
     companion object {
 
-        /**
-         * Helper class for describing the parameter in test result
-         */
+        /** Helper class for describing the parameter in test result */
         data class InitialText(val text: String, val name: String) {
             override fun toString(): String = name
         }
@@ -53,38 +51,36 @@
         private val longText = RandomTextGenerator().nextParagraph(500)
         private val shortText = RandomTextGenerator().nextParagraph(50)
 
-        /**
-         * Helper class for describing the parameter in test result
-         */
+        /** Helper class for describing the parameter in test result */
         data class TestScenario(val ops: List<EditCommand>, val name: String) {
             override fun toString(): String = name
         }
 
         @JvmStatic
         @Parameterized.Parameters(name = "initText={0}, senario={1}")
-        fun initParameters(): List<Array<Any?>> = cartesian(
-            arrayOf(
-                InitialText(longText, "Long Text"),
-                InitialText(shortText, "Short Text")
-            ),
-            arrayOf(
-                TestScenario(listOf(CommitTextCommand("Android", 1)), "Insert a text"),
-                TestScenario(listOf(SetComposingTextCommand("Android", 1)), "Insert composition"),
-                TestScenario(listOf(SetComposingRegionCommand(0, 1)), "Set composition"),
-                TestScenario(listOf(DeleteSurroundingTextCommand(0, 1)), "Delete text"),
-                TestScenario(
-                    listOf(DeleteSurroundingTextInCodePointsCommand(0, 1)),
-                    "Delete text in code points"
-                ),
-                TestScenario(listOf(SetSelectionCommand(0, 1)), "Set selection"),
-                TestScenario(listOf(BackspaceCommand()), "Backspace"),
-                TestScenario(listOf(MoveCursorCommand(1)), "Cursor movement")
+        fun initParameters(): List<Array<Any?>> =
+            cartesian(
+                arrayOf(InitialText(longText, "Long Text"), InitialText(shortText, "Short Text")),
+                arrayOf(
+                    TestScenario(listOf(CommitTextCommand("Android", 1)), "Insert a text"),
+                    TestScenario(
+                        listOf(SetComposingTextCommand("Android", 1)),
+                        "Insert composition"
+                    ),
+                    TestScenario(listOf(SetComposingRegionCommand(0, 1)), "Set composition"),
+                    TestScenario(listOf(DeleteSurroundingTextCommand(0, 1)), "Delete text"),
+                    TestScenario(
+                        listOf(DeleteSurroundingTextInCodePointsCommand(0, 1)),
+                        "Delete text in code points"
+                    ),
+                    TestScenario(listOf(SetSelectionCommand(0, 1)), "Set selection"),
+                    TestScenario(listOf(BackspaceCommand()), "Backspace"),
+                    TestScenario(listOf(MoveCursorCommand(1)), "Cursor movement")
+                )
             )
-        )
     }
 
-    @get:Rule
-    val benchmarkRule = BenchmarkRule()
+    @get:Rule val benchmarkRule = BenchmarkRule()
 
     @Test
     fun scenarioTest() {
@@ -92,10 +88,7 @@
             val ep = runWithTimingDisabled {
                 EditProcessor().apply {
                     reset(
-                        TextFieldValue(
-                            text = initText.text,
-                            selection = TextRange(5)
-                        ),
+                        TextFieldValue(text = initText.text, selection = TextRange(5)),
                         null // text input service, not used.
                     )
                 }
diff --git a/compose/ui/ui-text/benchmark/src/androidTest/java/androidx/compose/ui/text/benchmark/input/GapBufferBenchmark.kt b/compose/ui/ui-text/benchmark/src/androidTest/java/androidx/compose/ui/text/benchmark/input/GapBufferBenchmark.kt
index 1c0e20d..eafdd16 100644
--- a/compose/ui/ui-text/benchmark/src/androidTest/java/androidx/compose/ui/text/benchmark/input/GapBufferBenchmark.kt
+++ b/compose/ui/ui-text/benchmark/src/androidTest/java/androidx/compose/ui/text/benchmark/input/GapBufferBenchmark.kt
@@ -33,9 +33,7 @@
 class GapBufferBenchmark(val initText: InitialText) {
     companion object {
 
-        /**
-         * Helper class for describing the parameter in test result
-         */
+        /** Helper class for describing the parameter in test result */
         data class InitialText(val text: String, val name: String) {
             override fun toString(): String = name
         }
@@ -45,21 +43,16 @@
 
         @JvmStatic
         @Parameterized.Parameters(name = "initText={0}")
-        fun initParameters(): List<InitialText> = listOf(
-            InitialText(longText, "Long Text"),
-            InitialText(shortText, "Short Text")
-        )
+        fun initParameters(): List<InitialText> =
+            listOf(InitialText(longText, "Long Text"), InitialText(shortText, "Short Text"))
     }
 
-    @get:Rule
-    val benchmarkRule = BenchmarkRule()
+    @get:Rule val benchmarkRule = BenchmarkRule()
 
     @Test
     fun singleReplace() {
         benchmarkRule.measureRepeated {
-            val buffer = runWithTimingDisabled {
-                PartialGapBuffer(initText.text)
-            }
+            val buffer = runWithTimingDisabled { PartialGapBuffer(initText.text) }
 
             buffer.replace(5, 10, "Android")
         }
@@ -68,9 +61,7 @@
     @Test
     fun replace10timesContinued() {
         benchmarkRule.measureRepeated {
-            val buffer = runWithTimingDisabled {
-                PartialGapBuffer(initText.text)
-            }
+            val buffer = runWithTimingDisabled { PartialGapBuffer(initText.text) }
 
             for (i in 0 until 10) {
                 buffer.replace(5 + i, 10 + i, "Android")
@@ -81,9 +72,7 @@
     @Test
     fun replace10timesDiscontinued() {
         benchmarkRule.measureRepeated {
-            val buffer = runWithTimingDisabled {
-                PartialGapBuffer(initText.text)
-            }
+            val buffer = runWithTimingDisabled { PartialGapBuffer(initText.text) }
 
             for (i in 0 until 10) {
                 if (i % 2 == 0) {
@@ -99,9 +88,7 @@
     fun toStringAfterReplace() {
         benchmarkRule.measureRepeated {
             val buffer = runWithTimingDisabled {
-                PartialGapBuffer(initText.text).apply {
-                    replace(5, 10, "Android")
-                }
+                PartialGapBuffer(initText.text).apply { replace(5, 10, "Android") }
             }
 
             buffer.toString()
diff --git a/compose/ui/ui-text/benchmark/src/androidTest/java/androidx/compose/ui/text/benchmark/intl/LocaleListBenchmark.kt b/compose/ui/ui-text/benchmark/src/androidTest/java/androidx/compose/ui/text/benchmark/intl/LocaleListBenchmark.kt
index 04625f6..f5f3bb5 100644
--- a/compose/ui/ui-text/benchmark/src/androidTest/java/androidx/compose/ui/text/benchmark/intl/LocaleListBenchmark.kt
+++ b/compose/ui/ui-text/benchmark/src/androidTest/java/androidx/compose/ui/text/benchmark/intl/LocaleListBenchmark.kt
@@ -36,13 +36,13 @@
         fun initParameters(): Array<Any> =
             // Generates the comma separated language tags from the sliced langTagPresets array.
             // e.g. this generates, "en-US", "en-US,ja-JP", "en-US,ja-JP,zh-CH", ...
-            langTagPresets.mapIndexed { index, _ -> langTagPresets.sliceArray(0..index) }
+            langTagPresets
+                .mapIndexed { index, _ -> langTagPresets.sliceArray(0..index) }
                 .map { it.joinToString(",") }
                 .toTypedArray()
     }
 
-    @get:Rule
-    val benchmarkRule = BenchmarkRule()
+    @get:Rule val benchmarkRule = BenchmarkRule()
 
     @Test
     fun create() {
diff --git a/compose/ui/ui-text/benchmark/src/main/java/androidx/compose/ui/text/benchmark/TextBenchmarkHelper.kt b/compose/ui/ui-text/benchmark/src/main/java/androidx/compose/ui/text/benchmark/TextBenchmarkHelper.kt
index 707ffb3..b5e572d 100644
--- a/compose/ui/ui-text/benchmark/src/main/java/androidx/compose/ui/text/benchmark/TextBenchmarkHelper.kt
+++ b/compose/ui/ui-text/benchmark/src/main/java/androidx/compose/ui/text/benchmark/TextBenchmarkHelper.kt
@@ -37,65 +37,67 @@
     private val random: Random = Random(0)
 ) {
     // a set of predefined TextStyle's to add to styled text
-    private val nonMetricAffectingTextStyles = arrayOf(
-        SpanStyle(color = Color.Blue),
-        SpanStyle(background = Color.Cyan),
-        SpanStyle(textDecoration = TextDecoration.Underline),
-        SpanStyle(shadow = Shadow(Color.Black, Offset(3f, 3f), 2.0f))
-    )
+    private val nonMetricAffectingTextStyles =
+        arrayOf(
+            SpanStyle(color = Color.Blue),
+            SpanStyle(background = Color.Cyan),
+            SpanStyle(textDecoration = TextDecoration.Underline),
+            SpanStyle(shadow = Shadow(Color.Black, Offset(3f, 3f), 2.0f))
+        )
 
-    private val metricAffectingTextStyles = arrayOf(
-        SpanStyle(fontSize = 18.sp),
-        SpanStyle(fontSize = 2.em),
-        SpanStyle(fontWeight = FontWeight.Bold),
-        SpanStyle(fontStyle = FontStyle.Italic),
-        SpanStyle(letterSpacing = 0.2.em),
-        SpanStyle(baselineShift = BaselineShift.Subscript),
-        SpanStyle(textGeometricTransform = TextGeometricTransform(0.5f, 0.5f)),
-        SpanStyle(localeList = LocaleList("it"))
-    )
+    private val metricAffectingTextStyles =
+        arrayOf(
+            SpanStyle(fontSize = 18.sp),
+            SpanStyle(fontSize = 2.em),
+            SpanStyle(fontWeight = FontWeight.Bold),
+            SpanStyle(fontStyle = FontStyle.Italic),
+            SpanStyle(letterSpacing = 0.2.em),
+            SpanStyle(baselineShift = BaselineShift.Subscript),
+            SpanStyle(textGeometricTransform = TextGeometricTransform(0.5f, 0.5f)),
+            SpanStyle(localeList = LocaleList("it"))
+        )
 
     private fun getSpanStyleList(hasMetricAffectingStyle: Boolean) =
-        nonMetricAffectingTextStyles + if (hasMetricAffectingStyle) {
-            metricAffectingTextStyles
-        } else {
-            arrayOf()
-        }
+        nonMetricAffectingTextStyles +
+            if (hasMetricAffectingStyle) {
+                metricAffectingTextStyles
+            } else {
+                arrayOf()
+            }
+
+    /** Creates a sequence of characters group of length [length]. */
+    private fun nextWord(length: Int): String =
+        List(length) { alphabet.charRanges.random(random).random(random).toChar() }
+            .joinToString(separator = "")
 
     /**
-     * Creates a sequence of characters group of length [length].
+     * Create a sequence of character groups separated by the [Alphabet.space]. Each character group
+     * consists of [wordLength] characters. The total length of the returned string is [length].
      */
-    private fun nextWord(length: Int): String = List(length) {
-        alphabet.charRanges.random(random).random(random).toChar()
-    }.joinToString(separator = "")
-
-    /**
-     * Create a sequence of character groups separated by the [Alphabet.space]. Each character group consists of
-     * [wordLength] characters. The total length of the returned string is [length].
-     */
-    fun nextParagraph(
-        length: Int,
-        wordLength: Int = 9
-    ): String {
+    fun nextParagraph(length: Int, wordLength: Int = 9): String {
         return if (length == 0) {
             ""
         } else {
-            StringBuilder().apply {
-                while (this.length < length) {
-                    append(nextWord(wordLength))
-                    append(alphabet.space)
+            StringBuilder()
+                .apply {
+                    while (this.length < length) {
+                        append(nextWord(wordLength))
+                        append(alphabet.space)
+                    }
                 }
-            }.substring(0, length)
+                .substring(0, length)
         }
     }
 
     /**
-     * Given a [text] mark each character group with a predefined TextStyle. The order of TextStyles is predefined,
-     * and not randomized on purpose in order to get a consistent result in our benchmarks.
+     * Given a [text] mark each character group with a predefined TextStyle. The order of TextStyles
+     * is predefined, and not randomized on purpose in order to get a consistent result in our
+     * benchmarks.
+     *
      * @param text The text on which the markup is applied.
      * @param styleCount The number of the text styles applied on the [text].
      * @param hasMetricAffectingStyle Whether to apply metric affecting [TextStyle]s text, which
-     *  increases the difficulty to measure text.
+     *   increases the difficulty to measure text.
      */
     fun createStyles(
         text: String,
@@ -130,6 +132,7 @@
 
     /**
      * Create an [AnnotatedString] with randomly generated text but predefined TextStyles.
+     *
      * @see nextParagraph
      * @see createStyles
      */
@@ -165,59 +168,47 @@
     }
 }
 
-/**
- * Defines the character ranges to be picked randomly for a script.
- */
-class Alphabet(
-    val charRanges: List<IntRange>,
-    val space: Char,
-    val name: String
-) {
+/** Defines the character ranges to be picked randomly for a script. */
+class Alphabet(val charRanges: List<IntRange>, val space: Char, val name: String) {
 
     override fun toString(): String {
         return name
     }
 
     companion object {
-        val Latin = Alphabet(
-            charRanges = listOf(
-                IntRange('a'.code, 'z'.code),
-                IntRange('A'.code, 'Z'.code)
-            ),
-            space = ' ',
-            name = "Latin"
-        )
+        val Latin =
+            Alphabet(
+                charRanges = listOf(IntRange('a'.code, 'z'.code), IntRange('A'.code, 'Z'.code)),
+                space = ' ',
+                name = "Latin"
+            )
 
-        val Cjk = Alphabet(
-            charRanges = listOf(
-                IntRange(0x4E00, 0x62FF),
-                IntRange(0x6300, 0x77FF),
-                IntRange(0x7800, 0x8CFF)
-            ),
-            space = 0x3000.toChar(),
-            name = "CJK"
-        )
+        val Cjk =
+            Alphabet(
+                charRanges =
+                    listOf(
+                        IntRange(0x4E00, 0x62FF),
+                        IntRange(0x6300, 0x77FF),
+                        IntRange(0x7800, 0x8CFF)
+                    ),
+                space = 0x3000.toChar(),
+                name = "CJK"
+            )
     }
 }
 
-/**
- * Used by [RandomTextGenerator] in order to create plain text or multi-styled text.
- */
+/** Used by [RandomTextGenerator] in order to create plain text or multi-styled text. */
 enum class TextType {
     PlainText,
     StyledText
 }
 
-/**
- * Given a list of Arrays and make cartesian product each of them with the [array].
- */
+/** Given a list of Arrays and make cartesian product each of them with the [array]. */
 fun List<Array<Any>>.cartesian(vararg array: Any): List<Array<Any>> {
     return flatMap { row -> array.map { row + it } }
 }
 
-/**
- * Creates a cartesian product of the given arrays.
- */
+/** Creates a cartesian product of the given arrays. */
 fun cartesian(vararg arrays: Array<Any?>): List<Array<Any?>> {
     return arrays.fold(listOf(arrayOf())) { acc, list ->
         // add items from the current list
diff --git a/compose/ui/ui-text/benchmark/src/main/java/androidx/compose/ui/text/benchmark/TextBenchmarkTestRule.kt b/compose/ui/ui-text/benchmark/src/main/java/androidx/compose/ui/text/benchmark/TextBenchmarkTestRule.kt
index d6d5f13..4bbf72d 100644
--- a/compose/ui/ui-text/benchmark/src/main/java/androidx/compose/ui/text/benchmark/TextBenchmarkTestRule.kt
+++ b/compose/ui/ui-text/benchmark/src/main/java/androidx/compose/ui/text/benchmark/TextBenchmarkTestRule.kt
@@ -26,18 +26,15 @@
 /**
  * Collection of text benchmark utilities. It tries to
  * - trigger garbage collection
- * - free text layout caches
- * before each test run.
+ * - free text layout caches before each test run.
  *
  * It also provides random text generation capabilities.
- *
  */
 class TextBenchmarkTestRule(alphabet: Alphabet = Alphabet.Latin) : TestRule {
     private val textGeneratorTestRule = RandomTextGeneratorTestRule(alphabet)
 
     override fun apply(base: Statement, description: Description): Statement {
-        return RuleChain
-            .outerRule(GarbageCollectTestRule())
+        return RuleChain.outerRule(GarbageCollectTestRule())
             .around(TextLayoutCacheTestRule())
             .around(textGeneratorTestRule)
             .apply(base, description)
@@ -60,8 +57,8 @@
 }
 
 /**
- * At the beginning of each test calls Canvas.freeTextLayoutCaches in order to clear the native
- * text layout cache.
+ * At the beginning of each test calls Canvas.freeTextLayoutCaches in order to clear the native text
+ * layout cache.
  */
 private class TextLayoutCacheTestRule : TestRule {
     private val TAG = "TextLayoutCacheTestRule"
@@ -102,15 +99,14 @@
 
 /**
  * Test rule that initiates a [RandomTextGenerator] using a different seed based on the class and
- * function name. This way each function will have a different text generated, but at each run
- * the same function will get the same text.
+ * function name. This way each function will have a different text generated, but at each run the
+ * same function will get the same text.
  *
- * This will ensure that the execution order of a test class or functions in a test class does
- * not affect others because of the native text layout cache.
+ * This will ensure that the execution order of a test class or functions in a test class does not
+ * affect others because of the native text layout cache.
  */
-private class RandomTextGeneratorTestRule(
-    private val alphabet: Alphabet = Alphabet.Latin
-) : TestRule {
+private class RandomTextGeneratorTestRule(private val alphabet: Alphabet = Alphabet.Latin) :
+    TestRule {
     private lateinit var textGenerator: RandomTextGenerator
 
     override fun apply(base: Statement, description: Description): Statement =
diff --git a/compose/ui/ui-text/samples/src/main/java/androidx/compose/ui/text/samples/AnnotatedStringBuilderSamples.kt b/compose/ui/ui-text/samples/src/main/java/androidx/compose/ui/text/samples/AnnotatedStringBuilderSamples.kt
index 3088ab3..08354d2 100644
--- a/compose/ui/ui-text/samples/src/main/java/androidx/compose/ui/text/samples/AnnotatedStringBuilderSamples.kt
+++ b/compose/ui/ui-text/samples/src/main/java/androidx/compose/ui/text/samples/AnnotatedStringBuilderSamples.kt
@@ -40,14 +40,13 @@
     AnnotatedString(
         text = "Hello World",
         // make "Hello" italic.
-        spanStyles = listOf(
-            AnnotatedString.Range(SpanStyle(fontStyle = FontStyle.Italic), 0, 5)
-        ),
+        spanStyles = listOf(AnnotatedString.Range(SpanStyle(fontStyle = FontStyle.Italic), 0, 5)),
         // create two paragraphs with different alignment and indent settings.
-        paragraphStyles = listOf(
-            AnnotatedString.Range(ParagraphStyle(textAlign = TextAlign.Center), 0, 6),
-            AnnotatedString.Range(ParagraphStyle(textIndent = TextIndent(5.sp)), 6, 11)
-        )
+        paragraphStyles =
+            listOf(
+                AnnotatedString.Range(ParagraphStyle(textAlign = TextAlign.Center), 0, 6),
+                AnnotatedString.Range(ParagraphStyle(textIndent = TextIndent(5.sp)), 6, 11)
+            )
     )
 }
 
@@ -145,14 +144,10 @@
     // create an AnnotatedString using the lambda builder
     buildAnnotatedString {
         // append "Hello" with red text color
-        withStyle(SpanStyle(color = Color.Red)) {
-            append("Hello")
-        }
+        withStyle(SpanStyle(color = Color.Red)) { append("Hello") }
         append(" ")
         // append "Hello" with blue text color
-        withStyle(SpanStyle(color = Color.Blue)) {
-            append("World!")
-        }
+        withStyle(SpanStyle(color = Color.Blue)) { append("World!") }
     }
 }
 
@@ -196,13 +191,14 @@
     BasicText(
         buildAnnotatedString {
             append("Build better apps faster with ")
-            val link = LinkAnnotation.Url(
-                "https://developer.android.com/jetpack/compose",
-                TextLinkStyles(
-                    style = SpanStyle(color = Color.Blue),
-                    hoveredStyle = SpanStyle(textDecoration = TextDecoration.Underline)
+            val link =
+                LinkAnnotation.Url(
+                    "https://developer.android.com/jetpack/compose",
+                    TextLinkStyles(
+                        style = SpanStyle(color = Color.Blue),
+                        hoveredStyle = SpanStyle(textDecoration = TextDecoration.Underline)
+                    )
                 )
-            )
             withLink(link) { append("Jetpack Compose") }
         }
     )
@@ -217,14 +213,15 @@
     BasicText(
         buildAnnotatedString {
             append("Build better apps faster with ")
-            val link = LinkAnnotation.Url(
-                "https://developer.android.com/jetpack/compose",
-                TextLinkStyles(SpanStyle(color = Color.Blue))
-            ) {
-                val url = (it as LinkAnnotation.Url).url
-                // log some metrics
-                uriHandler.openUri(url)
-            }
+            val link =
+                LinkAnnotation.Url(
+                    "https://developer.android.com/jetpack/compose",
+                    TextLinkStyles(SpanStyle(color = Color.Blue))
+                ) {
+                    val url = (it as LinkAnnotation.Url).url
+                    // log some metrics
+                    uriHandler.openUri(url)
+                }
             withLink(link) { append("Jetpack Compose") }
         }
     )
diff --git a/compose/ui/ui-text/samples/src/main/java/androidx/compose/ui/text/samples/BaselineShiftSamples.kt b/compose/ui/ui-text/samples/src/main/java/androidx/compose/ui/text/samples/BaselineShiftSamples.kt
index 17c7b19..03749a6 100644
--- a/compose/ui/ui-text/samples/src/main/java/androidx/compose/ui/text/samples/BaselineShiftSamples.kt
+++ b/compose/ui/ui-text/samples/src/main/java/androidx/compose/ui/text/samples/BaselineShiftSamples.kt
@@ -30,15 +30,16 @@
 fun BaselineShiftSample() {
     Text(
         fontSize = 20.sp,
-        text = buildAnnotatedString {
-            append(text = "Hello")
-            withStyle(SpanStyle(baselineShift = BaselineShift.Superscript, fontSize = 16.sp)) {
-                append("superscript")
-                withStyle(SpanStyle(baselineShift = BaselineShift.Subscript)) {
-                    append("subscript")
+        text =
+            buildAnnotatedString {
+                append(text = "Hello")
+                withStyle(SpanStyle(baselineShift = BaselineShift.Superscript, fontSize = 16.sp)) {
+                    append("superscript")
+                    withStyle(SpanStyle(baselineShift = BaselineShift.Subscript)) {
+                        append("subscript")
+                    }
                 }
             }
-        }
     )
 }
 
@@ -47,9 +48,7 @@
 fun BaselineShiftAnnotatedStringSample() {
     val annotatedString = buildAnnotatedString {
         append("Text ")
-        withStyle(SpanStyle(baselineShift = BaselineShift.Superscript)) {
-            append("Demo")
-        }
+        withStyle(SpanStyle(baselineShift = BaselineShift.Superscript)) { append("Demo") }
     }
     Text(text = annotatedString)
 }
diff --git a/compose/ui/ui-text/samples/src/main/java/androidx/compose/ui/text/samples/DrawTextSamples.kt b/compose/ui/ui-text/samples/src/main/java/androidx/compose/ui/text/samples/DrawTextSamples.kt
index 231274c..ea52358 100644
--- a/compose/ui/ui-text/samples/src/main/java/androidx/compose/ui/text/samples/DrawTextSamples.kt
+++ b/compose/ui/ui-text/samples/src/main/java/androidx/compose/ui/text/samples/DrawTextSamples.kt
@@ -57,9 +57,7 @@
 fun DrawTextSample() {
     val textMeasurer = rememberTextMeasurer()
 
-    Canvas(Modifier.fillMaxSize()) {
-        drawText(textMeasurer, "Hello, World!")
-    }
+    Canvas(Modifier.fillMaxSize()) { drawText(textMeasurer, "Hello, World!") }
 }
 
 @Sampled
@@ -71,11 +69,12 @@
         drawText(
             textMeasurer = textMeasurer,
             text = "Hello, World!",
-            style = TextStyle(
-                fontSize = 24.sp,
-                fontWeight = FontWeight.Bold,
-                textDecoration = TextDecoration.Underline
-            )
+            style =
+                TextStyle(
+                    fontSize = 24.sp,
+                    fontWeight = FontWeight.Bold,
+                    textDecoration = TextDecoration.Underline
+                )
         )
     }
 }
@@ -88,14 +87,11 @@
     Canvas(Modifier.fillMaxSize()) {
         drawText(
             textMeasurer = textMeasurer,
-            text = buildAnnotatedString {
-                withStyle(ParagraphStyle(textAlign = TextAlign.Start)) {
-                    append("Hello")
+            text =
+                buildAnnotatedString {
+                    withStyle(ParagraphStyle(textAlign = TextAlign.Start)) { append("Hello") }
+                    withStyle(ParagraphStyle(textAlign = TextAlign.End)) { append("World") }
                 }
-                withStyle(ParagraphStyle(textAlign = TextAlign.End)) {
-                    append("World")
-                }
-            }
         )
     }
 }
@@ -110,28 +106,21 @@
 @Composable
 fun DrawTextMeasureInLayoutSample() {
     val textMeasurer = rememberTextMeasurer()
-    var textLayoutResult by remember {
-        mutableStateOf<TextLayoutResult?>(null)
-    }
+    var textLayoutResult by remember { mutableStateOf<TextLayoutResult?>(null) }
 
     Canvas(
-        Modifier
-            .fillMaxSize()
-            .layout { measurable, constraints ->
-                val placeable = measurable.measure(constraints)
-                // TextLayout can be done any time prior to its use in draw, including in a
-                // background thread.
-                // In this sample, text layout is measured in layout modifier. This way the layout
-                // call can be restarted when async font loading completes due to the fact that
-                // `.measure` call is executed in `.layout`.
-                textLayoutResult = textMeasurer.measure(
-                    text = "Hello, World!",
-                    style = TextStyle(fontSize = 24.sp)
-                )
-                layout(placeable.width, placeable.height) {
-                    placeable.placeRelative(0, 0)
-                }
-            }) {
+        Modifier.fillMaxSize().layout { measurable, constraints ->
+            val placeable = measurable.measure(constraints)
+            // TextLayout can be done any time prior to its use in draw, including in a
+            // background thread.
+            // In this sample, text layout is measured in layout modifier. This way the layout
+            // call can be restarted when async font loading completes due to the fact that
+            // `.measure` call is executed in `.layout`.
+            textLayoutResult =
+                textMeasurer.measure(text = "Hello, World!", style = TextStyle(fontSize = 24.sp))
+            layout(placeable.width, placeable.height) { placeable.placeRelative(0, 0) }
+        }
+    ) {
         // This happens during draw phase.
         textLayoutResult?.let { drawText(it) }
     }
@@ -155,38 +144,41 @@
 
     // Animate color repeatedly
     val infiniteTransition = rememberInfiniteTransition()
-    val color by infiniteTransition.animateColor(
-        initialValue = Color.Red,
-        targetValue = Color.Blue,
-        animationSpec = infiniteRepeatable(tween(1000))
-    )
+    val color by
+        infiniteTransition.animateColor(
+            initialValue = Color.Red,
+            targetValue = Color.Blue,
+            animationSpec = infiniteRepeatable(tween(1000))
+        )
 
     Box(
-        Modifier
-            .fillMaxSize()
-            .drawWithCache {
-                // Text layout will be measured just once until the size of the drawing area or
-                // materialTextStyle changes.
-                val textLayoutResult = textMeasurer.measure(
+        Modifier.fillMaxSize().drawWithCache {
+            // Text layout will be measured just once until the size of the drawing area or
+            // materialTextStyle changes.
+            val textLayoutResult =
+                textMeasurer.measure(
                     text = "Hello, World!",
                     style = materialTextStyle,
-                    constraints = Constraints.fixed(
-                        width = (size.width / 2).roundToInt(),
-                        height = (size.height / 2).roundToInt()
-                    ),
+                    constraints =
+                        Constraints.fixed(
+                            width = (size.width / 2).roundToInt(),
+                            height = (size.height / 2).roundToInt()
+                        ),
                     overflow = TextOverflow.Ellipsis
                 )
-                // color changes will only invalidate draw phase
-                onDrawWithContent {
-                    drawContent()
-                    drawText(
-                        textLayoutResult,
-                        color = color,
-                        topLeft = Offset(
+            // color changes will only invalidate draw phase
+            onDrawWithContent {
+                drawContent()
+                drawText(
+                    textLayoutResult,
+                    color = color,
+                    topLeft =
+                        Offset(
                             (size.width - textLayoutResult.size.width) / 2,
                             (size.height - textLayoutResult.size.height) / 2,
                         )
-                    )
-                }
-            })
+                )
+            }
+        }
+    )
 }
diff --git a/compose/ui/ui-text/samples/src/main/java/androidx/compose/ui/text/samples/FontFamilySamples.kt b/compose/ui/ui-text/samples/src/main/java/androidx/compose/ui/text/samples/FontFamilySamples.kt
index 2e64b09..683f760 100644
--- a/compose/ui/ui-text/samples/src/main/java/androidx/compose/ui/text/samples/FontFamilySamples.kt
+++ b/compose/ui/ui-text/samples/src/main/java/androidx/compose/ui/text/samples/FontFamilySamples.kt
@@ -29,54 +29,43 @@
 @Sampled
 @Composable
 fun FontFamilySansSerifSample() {
-    Text(
-        text = "Demo Text sans-serif",
-        fontFamily = FontFamily.SansSerif
-    )
+    Text(text = "Demo Text sans-serif", fontFamily = FontFamily.SansSerif)
 }
 
 @Sampled
 @Composable
 fun FontFamilySerifSample() {
-    Text(
-        text = "Demo Text serif",
-        fontFamily = FontFamily.Serif
-    )
+    Text(text = "Demo Text serif", fontFamily = FontFamily.Serif)
 }
 
 @Sampled
 @Composable
 fun FontFamilyMonospaceSample() {
-    Text(
-        text = "Demo Text monospace",
-        fontFamily = FontFamily.Monospace
-    )
+    Text(text = "Demo Text monospace", fontFamily = FontFamily.Monospace)
 }
 
 @Sampled
 @Composable
 fun FontFamilyCursiveSample() {
-    Text(
-        text = "Demo Text cursive",
-        fontFamily = FontFamily.Cursive
-    )
+    Text(text = "Demo Text cursive", fontFamily = FontFamily.Cursive)
 }
 
 @Sampled
 @Composable
 fun CustomFontFamilySample() {
-    val fontFamily = FontFamily(
-        Font(
-            resId = R.font.my_font_400_regular,
-            weight = FontWeight.W400,
-            style = FontStyle.Normal
-        ),
-        Font(
-            resId = R.font.my_font_400_italic,
-            weight = FontWeight.W400,
-            style = FontStyle.Italic
+    val fontFamily =
+        FontFamily(
+            Font(
+                resId = R.font.my_font_400_regular,
+                weight = FontWeight.W400,
+                style = FontStyle.Normal
+            ),
+            Font(
+                resId = R.font.my_font_400_italic,
+                weight = FontWeight.W400,
+                style = FontStyle.Italic
+            )
         )
-    )
     Text(text = "Demo Text", fontFamily = fontFamily)
 }
 
@@ -84,18 +73,17 @@
 @Composable
 fun FontFamilySynthesisSample() {
     // The font family contains a single font, with normal weight
-    val fontFamily = FontFamily(
-        Font(resId = R.font.myfont, weight = FontWeight.Normal)
-    )
+    val fontFamily = FontFamily(Font(resId = R.font.myfont, weight = FontWeight.Normal))
     // Configuring the Text composable to be bold
     // Using FontSynthesis.Weight to have the system render the font bold my making the glyphs
     // thicker
     Text(
         text = "Demo Text",
-        style = TextStyle(
-            fontFamily = fontFamily,
-            fontWeight = FontWeight.Bold,
-            fontSynthesis = FontSynthesis.Weight
-        )
+        style =
+            TextStyle(
+                fontFamily = fontFamily,
+                fontWeight = FontWeight.Bold,
+                fontSynthesis = FontSynthesis.Weight
+            )
     )
 }
diff --git a/compose/ui/ui-text/samples/src/main/java/androidx/compose/ui/text/samples/LineBreakSamples.kt b/compose/ui/ui-text/samples/src/main/java/androidx/compose/ui/text/samples/LineBreakSamples.kt
index ed6b96a..2e2b708 100644
--- a/compose/ui/ui-text/samples/src/main/java/androidx/compose/ui/text/samples/LineBreakSamples.kt
+++ b/compose/ui/ui-text/samples/src/main/java/androidx/compose/ui/text/samples/LineBreakSamples.kt
@@ -28,35 +28,28 @@
 fun LineBreakSample() {
     Text(
         text = "Title of an article",
-        style = TextStyle(
-            fontSize = 20.sp,
-            lineBreak = LineBreak.Heading
-        )
+        style = TextStyle(fontSize = 20.sp, lineBreak = LineBreak.Heading)
     )
 
     Text(
         text = "A long paragraph in an article",
-        style = TextStyle(
-            lineBreak = LineBreak.Paragraph
-        )
+        style = TextStyle(lineBreak = LineBreak.Paragraph)
     )
 }
 
 @Sampled
 @Composable
 fun AndroidLineBreakSample() {
-    val customTitleLineBreak = LineBreak(
-        strategy = LineBreak.Strategy.Simple,
-        strictness = LineBreak.Strictness.Loose,
-        wordBreak = LineBreak.WordBreak.Default
-    )
+    val customTitleLineBreak =
+        LineBreak(
+            strategy = LineBreak.Strategy.Simple,
+            strictness = LineBreak.Strictness.Loose,
+            wordBreak = LineBreak.WordBreak.Default
+        )
 
     Text(
         text = "Title of an article",
-        style = TextStyle(
-            fontSize = 20.sp,
-            lineBreak = customTitleLineBreak
-        )
+        style = TextStyle(fontSize = 20.sp, lineBreak = customTitleLineBreak)
     )
 
     val defaultStrictnessParagraphLineBreak =
@@ -64,8 +57,6 @@
 
     Text(
         text = "A long paragraph in an article",
-        style = TextStyle(
-            lineBreak = defaultStrictnessParagraphLineBreak
-        )
+        style = TextStyle(lineBreak = defaultStrictnessParagraphLineBreak)
     )
 }
diff --git a/compose/ui/ui-text/samples/src/main/java/androidx/compose/ui/text/samples/ParagraphStyleSamples.kt b/compose/ui/ui-text/samples/src/main/java/androidx/compose/ui/text/samples/ParagraphStyleSamples.kt
index 51f383c..4bc00aa 100644
--- a/compose/ui/ui-text/samples/src/main/java/androidx/compose/ui/text/samples/ParagraphStyleSamples.kt
+++ b/compose/ui/ui-text/samples/src/main/java/androidx/compose/ui/text/samples/ParagraphStyleSamples.kt
@@ -29,15 +29,17 @@
 @Sampled
 @Composable
 fun ParagraphStyleSample() {
-    val textStyle = TextStyle(
-        textAlign = TextAlign.Justify,
-        lineHeight = 20.sp,
-        textIndent = TextIndent(firstLine = 14.sp, restLine = 3.sp)
-    )
+    val textStyle =
+        TextStyle(
+            textAlign = TextAlign.Justify,
+            lineHeight = 20.sp,
+            textIndent = TextIndent(firstLine = 14.sp, restLine = 3.sp)
+        )
     Text(
-        text = "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor " +
-            "incididunt ut labore et dolore magna aliqua.\nUt enim ad minim veniam, quis " +
-            "nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.",
+        text =
+            "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor " +
+                "incididunt ut labore et dolore magna aliqua.\nUt enim ad minim veniam, quis " +
+                "nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.",
         style = textStyle
     )
 }
@@ -45,22 +47,20 @@
 @Sampled
 @Composable
 fun ParagraphStyleAnnotatedStringsSample() {
-    val text = "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor " +
-        "incididunt ut labore et dolore magna aliqua.\nUt enim ad minim veniam, quis " +
-        "nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat."
+    val text =
+        "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor " +
+            "incididunt ut labore et dolore magna aliqua.\nUt enim ad minim veniam, quis " +
+            "nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat."
 
-    val paragraphStyle1 = ParagraphStyle(
-        textIndent = TextIndent(firstLine = 14.sp)
-    )
-    val paragraphStyle2 = ParagraphStyle(
-        lineHeight = 30.sp
-    )
+    val paragraphStyle1 = ParagraphStyle(textIndent = TextIndent(firstLine = 14.sp))
+    val paragraphStyle2 = ParagraphStyle(lineHeight = 30.sp)
 
     Text(
-        text = buildAnnotatedString {
-            append(text)
-            addStyle(paragraphStyle1, 0, text.indexOf('\n') + 1)
-            addStyle(paragraphStyle2, text.indexOf('\n') + 1, text.length)
-        }
+        text =
+            buildAnnotatedString {
+                append(text)
+                addStyle(paragraphStyle1, 0, text.indexOf('\n') + 1)
+                addStyle(paragraphStyle2, text.indexOf('\n') + 1, text.length)
+            }
     )
 }
diff --git a/compose/ui/ui-text/samples/src/main/java/androidx/compose/ui/text/samples/SpanStyleSamples.kt b/compose/ui/ui-text/samples/src/main/java/androidx/compose/ui/text/samples/SpanStyleSamples.kt
index 15918fb..4cebc51 100644
--- a/compose/ui/ui-text/samples/src/main/java/androidx/compose/ui/text/samples/SpanStyleSamples.kt
+++ b/compose/ui/ui-text/samples/src/main/java/androidx/compose/ui/text/samples/SpanStyleSamples.kt
@@ -31,14 +31,11 @@
 fun SpanStyleSample() {
     Text(
         fontSize = 16.sp,
-        text = buildAnnotatedString {
-            withStyle(style = SpanStyle(color = Color.Red)) {
-                append("Hello")
+        text =
+            buildAnnotatedString {
+                withStyle(style = SpanStyle(color = Color.Red)) { append("Hello") }
+                withStyle(SpanStyle(color = Color.Blue)) { append(" World") }
             }
-            withStyle(SpanStyle(color = Color.Blue)) {
-                append(" World")
-            }
-        }
     )
 }
 
@@ -48,17 +45,12 @@
     val brushColors = listOf(Color.Red, Color.Blue, Color.Green, Color.Yellow)
     Text(
         fontSize = 16.sp,
-        text = buildAnnotatedString {
-            withStyle(SpanStyle(
-                brush = Brush.radialGradient(brushColors)
-            )) {
-                append("Hello")
+        text =
+            buildAnnotatedString {
+                withStyle(SpanStyle(brush = Brush.radialGradient(brushColors))) { append("Hello") }
+                withStyle(SpanStyle(brush = Brush.radialGradient(brushColors.asReversed()))) {
+                    append(" World")
+                }
             }
-            withStyle(SpanStyle(
-                brush = Brush.radialGradient(brushColors.asReversed())
-            )) {
-                append(" World")
-            }
-        }
     )
 }
diff --git a/compose/ui/ui-text/samples/src/main/java/androidx/compose/ui/text/samples/TextDecorationSamples.kt b/compose/ui/ui-text/samples/src/main/java/androidx/compose/ui/text/samples/TextDecorationSamples.kt
index f00410f..496cad4 100644
--- a/compose/ui/ui-text/samples/src/main/java/androidx/compose/ui/text/samples/TextDecorationSamples.kt
+++ b/compose/ui/ui-text/samples/src/main/java/androidx/compose/ui/text/samples/TextDecorationSamples.kt
@@ -24,26 +24,17 @@
 @Sampled
 @Composable
 fun TextDecorationLineThroughSample() {
-    Text(
-        text = "Demo Text",
-        textDecoration = TextDecoration.LineThrough
-    )
+    Text(text = "Demo Text", textDecoration = TextDecoration.LineThrough)
 }
 
 @Sampled
 @Composable
 fun TextDecorationUnderlineSample() {
-    Text(
-        text = "Demo Text",
-        textDecoration = TextDecoration.Underline
-    )
+    Text(text = "Demo Text", textDecoration = TextDecoration.Underline)
 }
 
 @Sampled
 @Composable
 fun TextDecorationCombinedSample() {
-    Text(
-        text = "Demo Text",
-        textDecoration = TextDecoration.Underline + TextDecoration.LineThrough
-    )
+    Text(text = "Demo Text", textDecoration = TextDecoration.Underline + TextDecoration.LineThrough)
 }
diff --git a/compose/ui/ui-text/samples/src/main/java/androidx/compose/ui/text/samples/TextMeasurerSamples.kt b/compose/ui/ui-text/samples/src/main/java/androidx/compose/ui/text/samples/TextMeasurerSamples.kt
index 9cbe75f..b8a86bd 100644
--- a/compose/ui/ui-text/samples/src/main/java/androidx/compose/ui/text/samples/TextMeasurerSamples.kt
+++ b/compose/ui/ui-text/samples/src/main/java/androidx/compose/ui/text/samples/TextMeasurerSamples.kt
@@ -34,36 +34,23 @@
 fun measureTextStringWithConstraints(textMeasurer: TextMeasurer) {
     textMeasurer.measure(
         text = "Hello, World",
-        style = TextStyle(
-            color = Color.Red,
-            fontSize = 16.sp,
-            fontFamily = FontFamily.Cursive
-        ),
-        constraints = Constraints(
-            minWidth = 400,
-            maxWidth = 400,
-            minHeight = 200,
-            maxHeight = 400
-        )
+        style = TextStyle(color = Color.Red, fontSize = 16.sp, fontFamily = FontFamily.Cursive),
+        constraints = Constraints(minWidth = 400, maxWidth = 400, minHeight = 200, maxHeight = 400)
     )
 }
 
 /**
- * Sample showing how to use TextMeasurer in a non-composable function with an AnnotatedString
- * for text.
+ * Sample showing how to use TextMeasurer in a non-composable function with an AnnotatedString for
+ * text.
  */
 @Sampled
 fun measureTextAnnotatedString(textMeasurer: TextMeasurer) {
     textMeasurer.measure(
-        text = buildAnnotatedString {
-            append("Hello, ")
-            withStyle(SpanStyle(color = Color.Blue)) {
-                append("World!")
-            }
-        },
-        style = TextStyle(
-            fontSize = 16.sp,
-            fontFamily = FontFamily.Monospace
-        )
+        text =
+            buildAnnotatedString {
+                append("Hello, ")
+                withStyle(SpanStyle(color = Color.Blue)) { append("World!") }
+            },
+        style = TextStyle(fontSize = 16.sp, fontFamily = FontFamily.Monospace)
     )
 }
diff --git a/compose/ui/ui-text/samples/src/main/java/androidx/compose/ui/text/samples/TextMotionSamples.kt b/compose/ui/ui-text/samples/src/main/java/androidx/compose/ui/text/samples/TextMotionSamples.kt
index 4e67915..670134b 100644
--- a/compose/ui/ui-text/samples/src/main/java/androidx/compose/ui/text/samples/TextMotionSamples.kt
+++ b/compose/ui/ui-text/samples/src/main/java/androidx/compose/ui/text/samples/TextMotionSamples.kt
@@ -39,16 +39,17 @@
 @Composable
 fun TextMotionSample() {
     val infiniteTransition = rememberInfiniteTransition()
-    val scale by infiniteTransition.animateFloat(
-        initialValue = 1f,
-        targetValue = 8f,
-        animationSpec = infiniteRepeatable(tween(1000), RepeatMode.Reverse)
-    )
+    val scale by
+        infiniteTransition.animateFloat(
+            initialValue = 1f,
+            targetValue = 8f,
+            animationSpec = infiniteRepeatable(tween(1000), RepeatMode.Reverse)
+        )
 
     Text(
         text = "Hello",
-        modifier = Modifier
-            .graphicsLayer {
+        modifier =
+            Modifier.graphicsLayer {
                 scaleX = scale
                 scaleY = scale
                 transformOrigin = TransformOrigin.Center
diff --git a/compose/ui/ui-text/samples/src/main/java/androidx/compose/ui/text/samples/TextOverflowSamples.kt b/compose/ui/ui-text/samples/src/main/java/androidx/compose/ui/text/samples/TextOverflowSamples.kt
index da91000..fa461df 100644
--- a/compose/ui/ui-text/samples/src/main/java/androidx/compose/ui/text/samples/TextOverflowSamples.kt
+++ b/compose/ui/ui-text/samples/src/main/java/androidx/compose/ui/text/samples/TextOverflowSamples.kt
@@ -63,14 +63,14 @@
     Box(modifier = Modifier.size(100.dp, 100.dp)) {
         Text(
             text = "Hello ".repeat(2),
-            modifier = Modifier.size(100.dp, 70.dp)
-                .background(background.value)
-                .clickable {
-                    background.value = if (background.value == Color.Cyan) {
-                        Color.Gray
-                    } else {
-                        Color.Cyan
-                    }
+            modifier =
+                Modifier.size(100.dp, 70.dp).background(background.value).clickable {
+                    background.value =
+                        if (background.value == Color.Cyan) {
+                            Color.Gray
+                        } else {
+                            Color.Cyan
+                        }
                 },
             fontSize = 35.sp,
             overflow = TextOverflow.Visible
@@ -86,13 +86,15 @@
     Box(modifier = Modifier.size(100.dp, 100.dp)) {
         Text(
             text = "Hello".repeat(count.value),
-            modifier = Modifier.width(100.dp).heightIn(min = 70.dp)
-                .background(background.value)
-                .clickable {
-                    background.value =
-                        if (background.value == Color.Cyan) Color.Gray else Color.Cyan
-                    count.value = if (count.value == 1) 2 else 1
-                },
+            modifier =
+                Modifier.width(100.dp)
+                    .heightIn(min = 70.dp)
+                    .background(background.value)
+                    .clickable {
+                        background.value =
+                            if (background.value == Color.Cyan) Color.Gray else Color.Cyan
+                        count.value = if (count.value == 1) 2 else 1
+                    },
             fontSize = 35.sp,
             overflow = TextOverflow.Visible
         )
diff --git a/compose/ui/ui-text/samples/src/main/java/androidx/compose/ui/text/samples/TextStyleSamples.kt b/compose/ui/ui-text/samples/src/main/java/androidx/compose/ui/text/samples/TextStyleSamples.kt
index 2950317..3718cb2 100644
--- a/compose/ui/ui-text/samples/src/main/java/androidx/compose/ui/text/samples/TextStyleSamples.kt
+++ b/compose/ui/ui-text/samples/src/main/java/androidx/compose/ui/text/samples/TextStyleSamples.kt
@@ -34,16 +34,17 @@
 fun TextStyleSample() {
     Text(
         text = "Demo Text",
-        style = TextStyle(
-            color = Color.Red,
-            fontSize = 16.sp,
-            fontFamily = FontFamily.Monospace,
-            fontWeight = FontWeight.W800,
-            fontStyle = FontStyle.Italic,
-            letterSpacing = 0.5.em,
-            background = Color.LightGray,
-            textDecoration = TextDecoration.Underline
-        )
+        style =
+            TextStyle(
+                color = Color.Red,
+                fontSize = 16.sp,
+                fontFamily = FontFamily.Monospace,
+                fontWeight = FontWeight.W800,
+                fontStyle = FontStyle.Italic,
+                letterSpacing = 0.5.em,
+                background = Color.LightGray,
+                textDecoration = TextDecoration.Underline
+            )
     )
 }
 
@@ -52,15 +53,16 @@
 fun TextStyleBrushSample() {
     Text(
         text = "Demo Text",
-        style = TextStyle(
-            brush = Brush.linearGradient(listOf(Color.Red, Color.Blue, Color.Green)),
-            alpha = 0.8f,
-            fontSize = 16.sp,
-            fontFamily = FontFamily.Monospace,
-            fontWeight = FontWeight.W800,
-            fontStyle = FontStyle.Italic,
-            letterSpacing = 0.5.em,
-            textDecoration = TextDecoration.Underline
-        )
+        style =
+            TextStyle(
+                brush = Brush.linearGradient(listOf(Color.Red, Color.Blue, Color.Green)),
+                alpha = 0.8f,
+                fontSize = 16.sp,
+                fontFamily = FontFamily.Monospace,
+                fontWeight = FontWeight.W800,
+                fontStyle = FontStyle.Italic,
+                letterSpacing = 0.5.em,
+                textDecoration = TextDecoration.Underline
+            )
     )
 }
diff --git a/compose/ui/ui-text/samples/src/main/java/androidx/compose/ui/text/samples/VisualTransformationSamples.kt b/compose/ui/ui-text/samples/src/main/java/androidx/compose/ui/text/samples/VisualTransformationSamples.kt
index edbd256..40c9f17 100644
--- a/compose/ui/ui-text/samples/src/main/java/androidx/compose/ui/text/samples/VisualTransformationSamples.kt
+++ b/compose/ui/ui-text/samples/src/main/java/androidx/compose/ui/text/samples/VisualTransformationSamples.kt
@@ -46,31 +46,32 @@
     }
 
     /**
-     * The offset translator should ignore the hyphen characters, so conversion from
-     *  original offset to transformed text works like
-     *  - The 4th char of the original text is 5th char in the transformed text.
-     *  - The 13th char of the original text is 15th char in the transformed text.
-     *  Similarly, the reverse conversion works like
-     *  - The 5th char of the transformed text is 4th char in the original text.
-     *  - The 12th char of the transformed text is 10th char in the original text.
+     * The offset translator should ignore the hyphen characters, so conversion from original offset
+     * to transformed text works like
+     * - The 4th char of the original text is 5th char in the transformed text.
+     * - The 13th char of the original text is 15th char in the transformed text. Similarly, the
+     *   reverse conversion works like
+     * - The 5th char of the transformed text is 4th char in the original text.
+     * - The 12th char of the transformed text is 10th char in the original text.
      */
-    val creditCardOffsetTranslator = object : OffsetMapping {
-        override fun originalToTransformed(offset: Int): Int {
-            if (offset <= 3) return offset
-            if (offset <= 7) return offset + 1
-            if (offset <= 11) return offset + 2
-            if (offset <= 16) return offset + 3
-            return 19
-        }
+    val creditCardOffsetTranslator =
+        object : OffsetMapping {
+            override fun originalToTransformed(offset: Int): Int {
+                if (offset <= 3) return offset
+                if (offset <= 7) return offset + 1
+                if (offset <= 11) return offset + 2
+                if (offset <= 16) return offset + 3
+                return 19
+            }
 
-        override fun transformedToOriginal(offset: Int): Int {
-            if (offset <= 4) return offset
-            if (offset <= 9) return offset - 1
-            if (offset <= 14) return offset - 2
-            if (offset <= 19) return offset - 3
-            return 16
+            override fun transformedToOriginal(offset: Int): Int {
+                if (offset <= 4) return offset
+                if (offset <= 9) return offset - 1
+                if (offset <= 14) return offset - 2
+                if (offset <= 19) return offset - 3
+                return 16
+            }
         }
-    }
 
     return TransformedText(AnnotatedString(out), creditCardOffsetTranslator)
 }
diff --git a/compose/ui/ui-text/src/androidInstrumentedTest/kotlin/androidx/compose/ui/text/AndroidParagraphExt.kt b/compose/ui/ui-text/src/androidInstrumentedTest/kotlin/androidx/compose/ui/text/AndroidParagraphExt.kt
index a76fc2b..49a6dad 100644
--- a/compose/ui/ui-text/src/androidInstrumentedTest/kotlin/androidx/compose/ui/text/AndroidParagraphExt.kt
+++ b/compose/ui/ui-text/src/androidInstrumentedTest/kotlin/androidx/compose/ui/text/AndroidParagraphExt.kt
@@ -21,11 +21,12 @@
 import kotlin.math.ceil
 
 internal fun AndroidParagraph.bitmap(): Bitmap {
-    val bitmap = Bitmap.createBitmap(
-        ceil(this.width).toInt(),
-        ceil(this.height).toInt(),
-        Bitmap.Config.ARGB_8888
-    )
+    val bitmap =
+        Bitmap.createBitmap(
+            ceil(this.width).toInt(),
+            ceil(this.height).toInt(),
+            Bitmap.Config.ARGB_8888
+        )
     this.paint(androidx.compose.ui.graphics.Canvas(Canvas(bitmap)))
     return bitmap
 }
diff --git a/compose/ui/ui-text/src/androidInstrumentedTest/kotlin/androidx/compose/ui/text/AndroidParagraphTest.kt b/compose/ui/ui-text/src/androidInstrumentedTest/kotlin/androidx/compose/ui/text/AndroidParagraphTest.kt
index f715019..83bbc1b 100644
--- a/compose/ui/ui-text/src/androidInstrumentedTest/kotlin/androidx/compose/ui/text/AndroidParagraphTest.kt
+++ b/compose/ui/ui-text/src/androidInstrumentedTest/kotlin/androidx/compose/ui/text/AndroidParagraphTest.kt
@@ -86,8 +86,7 @@
 @OptIn(InternalPlatformTextApi::class)
 @RunWith(AndroidJUnit4::class)
 @SmallTest
-class
-AndroidParagraphTest {
+class AndroidParagraphTest {
     // This sample font provides the following features:
     // 1. The width of most of visible characters equals to font size.
     // 2. The LTR/RTL characters are rendered as ▶/◀.
@@ -101,26 +100,27 @@
         with(defaultDensity) {
             val fontSize = 50.sp
             for (text in arrayOf("abc\ndef", "\u05D0\u05D1\u05D2\n\u05D3\u05D4\u05D5")) {
-                val paragraphAndroid = simpleParagraph(
-                    text = text,
-                    style = TextStyle(
-                        fontSize = fontSize,
-                        fontFamily = basicFontFamily
-                    ),
-                    // 2 chars width
-                    width = 2 * fontSize.toPx()
-                )
+                val paragraphAndroid =
+                    simpleParagraph(
+                        text = text,
+                        style = TextStyle(fontSize = fontSize, fontFamily = basicFontFamily),
+                        // 2 chars width
+                        width = 2 * fontSize.toPx()
+                    )
 
                 val textPaint = TextPaint(Paint.ANTI_ALIAS_FLAG)
                 textPaint.textSize = fontSize.toPx()
-                textPaint.typeface = UncachedFontFamilyResolver(context)
-                    .resolve(BASIC_MEASURE_FONT.toFontFamily()).value as Typeface
+                textPaint.typeface =
+                    UncachedFontFamilyResolver(context)
+                        .resolve(BASIC_MEASURE_FONT.toFontFamily())
+                        .value as Typeface
 
-                val layout = TextLayout(
-                    charSequence = text,
-                    width = ceil(paragraphAndroid.width),
-                    textPaint = textPaint
-                )
+                val layout =
+                    TextLayout(
+                        charSequence = text,
+                        width = ceil(paragraphAndroid.width),
+                        textPaint = textPaint
+                    )
 
                 assertThat(paragraphAndroid.bitmap()).isEqualToBitmap(layout.bitmap())
             }
@@ -132,11 +132,12 @@
         val text = "abcde"
         val spanStyle = SpanStyle(color = Color(0xFF0000FF))
 
-        val paragraph = simpleParagraph(
-            text = text,
-            spanStyles = listOf(AnnotatedString.Range(spanStyle, 0, text.length)),
-            width = 100.0f
-        )
+        val paragraph =
+            simpleParagraph(
+                text = text,
+                spanStyles = listOf(AnnotatedString.Range(spanStyle, 0, text.length)),
+                width = 100.0f
+            )
 
         assertThat(paragraph.charSequence).hasSpan(ForegroundColorSpan::class, 0, text.length)
     }
@@ -146,11 +147,12 @@
         val text = "abcde"
         val spanStyle = SpanStyle(color = Color(0xFF0000FF))
 
-        val paragraph = simpleParagraph(
-            text = text,
-            spanStyles = listOf(AnnotatedString.Range(spanStyle, 0, "abc".length)),
-            width = 100.0f
-        )
+        val paragraph =
+            simpleParagraph(
+                text = text,
+                spanStyles = listOf(AnnotatedString.Range(spanStyle, 0, "abc".length)),
+                width = 100.0f
+            )
 
         assertThat(paragraph.charSequence).hasSpan(ForegroundColorSpan::class, 0, "abc".length)
     }
@@ -161,14 +163,16 @@
         val spanStyle = SpanStyle(color = Color(0xFF0000FF))
         val spanStyleOverwrite = SpanStyle(color = Color(0xFF00FF00))
 
-        val paragraph = simpleParagraph(
-            text = text,
-            spanStyles = listOf(
-                AnnotatedString.Range(spanStyle, 0, text.length),
-                AnnotatedString.Range(spanStyleOverwrite, 0, "abc".length)
-            ),
-            width = 100.0f
-        )
+        val paragraph =
+            simpleParagraph(
+                text = text,
+                spanStyles =
+                    listOf(
+                        AnnotatedString.Range(spanStyle, 0, text.length),
+                        AnnotatedString.Range(spanStyleOverwrite, 0, "abc".length)
+                    ),
+                width = 100.0f
+            )
 
         assertThat(paragraph.charSequence).hasSpan(ForegroundColorSpan::class, 0, text.length)
         assertThat(paragraph.charSequence).hasSpan(ForegroundColorSpan::class, 0, "abc".length)
@@ -181,11 +185,12 @@
         val brush = Brush.linearGradient(listOf(Color.Black, Color.White))
         val spanStyle = SpanStyle(brush = brush)
 
-        val paragraph = simpleParagraph(
-            text = text,
-            spanStyles = listOf(AnnotatedString.Range(spanStyle, 0, text.length)),
-            width = 100.0f
-        )
+        val paragraph =
+            simpleParagraph(
+                text = text,
+                spanStyles = listOf(AnnotatedString.Range(spanStyle, 0, text.length)),
+                width = 100.0f
+            )
 
         assertThat(paragraph.charSequence).hasSpan(ShaderBrushSpan::class, 0, text.length) {
             it.shaderBrush == brush
@@ -198,11 +203,12 @@
         val brush = SolidColor(Color.Red)
         val spanStyle = SpanStyle(brush = brush)
 
-        val paragraph = simpleParagraph(
-            text = text,
-            spanStyles = listOf(AnnotatedString.Range(spanStyle, 0, text.length)),
-            width = 100.0f
-        )
+        val paragraph =
+            simpleParagraph(
+                text = text,
+                spanStyles = listOf(AnnotatedString.Range(spanStyle, 0, text.length)),
+                width = 100.0f
+            )
 
         assertThat(paragraph.charSequence).hasSpan(ForegroundColorSpan::class, 0, text.length)
     }
@@ -213,11 +219,12 @@
         val brush = Brush.linearGradient(listOf(Color.Black, Color.White))
         val spanStyle = SpanStyle(brush = brush)
 
-        val paragraph = simpleParagraph(
-            text = text,
-            spanStyles = listOf(AnnotatedString.Range(spanStyle, 0, "abc".length)),
-            width = 100.0f
-        )
+        val paragraph =
+            simpleParagraph(
+                text = text,
+                spanStyles = listOf(AnnotatedString.Range(spanStyle, 0, "abc".length)),
+                width = 100.0f
+            )
 
         assertThat(paragraph.charSequence).hasSpan(ShaderBrushSpan::class, 0, "abc".length) {
             it.shaderBrush == brush
@@ -232,12 +239,13 @@
             val spanStyle = SpanStyle(brush = brush)
             val fontSize = 10.sp
 
-            val paragraph = simpleParagraph(
-                text = text,
-                spanStyles = listOf(AnnotatedString.Range(spanStyle, 0, "abc".length)),
-                width = 100.0f,
-                style = TextStyle(fontSize = fontSize, fontFamily = basicFontFamily)
-            )
+            val paragraph =
+                simpleParagraph(
+                    text = text,
+                    spanStyles = listOf(AnnotatedString.Range(spanStyle, 0, "abc".length)),
+                    width = 100.0f,
+                    style = TextStyle(fontSize = fontSize, fontFamily = basicFontFamily)
+                )
 
             assertThat(paragraph.charSequence).hasSpan(ShaderBrushSpan::class, 0, "abc".length) {
                 it.size == Size(100.0f, fontSize.toPx())
@@ -250,11 +258,12 @@
         val text = "abcde"
         val spanStyle = SpanStyle(textDecoration = TextDecoration.LineThrough)
 
-        val paragraph = simpleParagraph(
-            text = text,
-            spanStyles = listOf(AnnotatedString.Range(spanStyle, 0, text.length)),
-            width = 100.0f
-        )
+        val paragraph =
+            simpleParagraph(
+                text = text,
+                spanStyles = listOf(AnnotatedString.Range(spanStyle, 0, text.length)),
+                width = 100.0f
+            )
 
         assertThat(paragraph.charSequence.toString()).isEqualTo(text)
         assertThat(paragraph.charSequence).hasSpan(
@@ -271,11 +280,12 @@
         val text = "abcde"
         val spanStyle = SpanStyle(textDecoration = TextDecoration.Underline)
 
-        val paragraph = simpleParagraph(
-            text = text,
-            spanStyles = listOf(AnnotatedString.Range(spanStyle, 0, text.length)),
-            width = 100.0f
-        )
+        val paragraph =
+            simpleParagraph(
+                text = text,
+                spanStyles = listOf(AnnotatedString.Range(spanStyle, 0, text.length)),
+                width = 100.0f
+            )
 
         assertThat(paragraph.charSequence.toString()).isEqualTo(text)
         assertThat(paragraph.charSequence).hasSpan(
@@ -292,11 +302,12 @@
         val text = "abcde"
         val spanStyle = SpanStyle(textDecoration = TextDecoration.LineThrough)
 
-        val paragraph = simpleParagraph(
-            text = text,
-            spanStyles = listOf(AnnotatedString.Range(spanStyle, 0, "abc".length)),
-            width = 100.0f
-        )
+        val paragraph =
+            simpleParagraph(
+                text = text,
+                spanStyles = listOf(AnnotatedString.Range(spanStyle, 0, "abc".length)),
+                width = 100.0f
+            )
 
         assertThat(paragraph.charSequence.toString()).isEqualTo(text)
         assertThat(paragraph.charSequence).hasSpan(
@@ -313,11 +324,12 @@
         val text = "abcde"
         val spanStyle = SpanStyle(textDecoration = TextDecoration.Underline)
 
-        val paragraph = simpleParagraph(
-            text = text,
-            spanStyles = listOf(AnnotatedString.Range(spanStyle, 0, "abc".length)),
-            width = 100.0f
-        )
+        val paragraph =
+            simpleParagraph(
+                text = text,
+                spanStyles = listOf(AnnotatedString.Range(spanStyle, 0, "abc".length)),
+                width = 100.0f
+            )
 
         assertThat(paragraph.charSequence.toString()).isEqualTo(text)
         assertThat(paragraph.charSequence).hasSpan(
@@ -332,15 +344,15 @@
     @Test
     fun testStyle_setTextDecoration_withLineThroughAndUnderline() {
         val text = "abcde"
-        val spanStyle = SpanStyle(
-            textDecoration = TextDecoration.LineThrough + TextDecoration.Underline
-        )
+        val spanStyle =
+            SpanStyle(textDecoration = TextDecoration.LineThrough + TextDecoration.Underline)
 
-        val paragraph = simpleParagraph(
-            text = text,
-            spanStyles = listOf(AnnotatedString.Range(spanStyle, 0, "abc".length)),
-            width = 100.0f
-        )
+        val paragraph =
+            simpleParagraph(
+                text = text,
+                spanStyles = listOf(AnnotatedString.Range(spanStyle, 0, "abc".length)),
+                width = 100.0f
+            )
 
         assertThat(paragraph.charSequence.toString()).isEqualTo(text)
         assertThat(paragraph.charSequence).hasSpan(
@@ -360,11 +372,12 @@
             val paragraphWidth = text.length * fontSize.toPx()
             val spanStyle = SpanStyle(fontSize = fontSize)
 
-            val paragraph = simpleParagraph(
-                text = text,
-                spanStyles = listOf(AnnotatedString.Range(spanStyle, 0, text.length)),
-                width = paragraphWidth
-            )
+            val paragraph =
+                simpleParagraph(
+                    text = text,
+                    spanStyles = listOf(AnnotatedString.Range(spanStyle, 0, text.length)),
+                    width = paragraphWidth
+                )
 
             assertThat(paragraph.charSequence).hasSpan(AbsoluteSizeSpan::class, 0, text.length) {
                 it.size == fontSize.toPx().roundToInt() && !it.dip
@@ -380,11 +393,12 @@
             val paragraphWidth = text.length * fontSize.toPx()
             val spanStyle = SpanStyle(fontSize = fontSize)
 
-            val paragraph = simpleParagraph(
-                text = text,
-                spanStyles = listOf(AnnotatedString.Range(spanStyle, 0, "abc".length)),
-                width = paragraphWidth
-            )
+            val paragraph =
+                simpleParagraph(
+                    text = text,
+                    spanStyles = listOf(AnnotatedString.Range(spanStyle, 0, "abc".length)),
+                    width = paragraphWidth
+                )
 
             assertThat(paragraph.charSequence).hasSpan(AbsoluteSizeSpan::class, 0, "abc".length)
         }
@@ -400,14 +414,16 @@
             val spanStyle = SpanStyle(fontSize = fontSize)
             val spanStyleOverwrite = SpanStyle(fontSize = fontSizeOverwrite)
 
-            val paragraph = simpleParagraph(
-                text = text,
-                spanStyles = listOf(
-                    AnnotatedString.Range(spanStyle, 0, text.length),
-                    AnnotatedString.Range(spanStyleOverwrite, 0, "abc".length)
-                ),
-                width = paragraphWidth
-            )
+            val paragraph =
+                simpleParagraph(
+                    text = text,
+                    spanStyles =
+                        listOf(
+                            AnnotatedString.Range(spanStyle, 0, text.length),
+                            AnnotatedString.Range(spanStyleOverwrite, 0, "abc".length)
+                        ),
+                    width = paragraphWidth
+                )
 
             assertThat(paragraph.charSequence).hasSpan(AbsoluteSizeSpan::class, 0, text.length)
             assertThat(paragraph.charSequence).hasSpan(AbsoluteSizeSpan::class, 0, "abc".length)
@@ -422,11 +438,12 @@
         val fontSizeScale = 2.0.em
         val spanStyle = SpanStyle(fontSize = fontSizeScale)
 
-        val paragraph = simpleParagraph(
-            text = text,
-            spanStyles = listOf(AnnotatedString.Range(spanStyle, 0, text.length)),
-            width = 100.0f
-        )
+        val paragraph =
+            simpleParagraph(
+                text = text,
+                spanStyles = listOf(AnnotatedString.Range(spanStyle, 0, text.length)),
+                width = 100.0f
+            )
 
         assertThat(paragraph.charSequence).hasSpan(RelativeSizeSpan::class, 0, text.length) {
             it.sizeChange == fontSizeScale.value
@@ -439,11 +456,12 @@
         val fontSizeScale = 2.0f.em
         val spanStyle = SpanStyle(fontSize = fontSizeScale)
 
-        val paragraph = simpleParagraph(
-            text = text,
-            spanStyles = listOf(AnnotatedString.Range(spanStyle, 0, "abc".length)),
-            width = 100.0f
-        )
+        val paragraph =
+            simpleParagraph(
+                text = text,
+                spanStyles = listOf(AnnotatedString.Range(spanStyle, 0, "abc".length)),
+                width = 100.0f
+            )
 
         assertThat(paragraph.charSequence).hasSpan(RelativeSizeSpan::class, 0, "abc".length) {
             it.sizeChange == fontSizeScale.value
@@ -456,11 +474,12 @@
         val letterSpacing = 2.0f
         val spanStyle = SpanStyle(letterSpacing = letterSpacing.em)
 
-        val paragraph = simpleParagraph(
-            text = text,
-            spanStyles = listOf(AnnotatedString.Range(spanStyle, 0, text.length)),
-            width = 100.0f
-        )
+        val paragraph =
+            simpleParagraph(
+                text = text,
+                spanStyles = listOf(AnnotatedString.Range(spanStyle, 0, text.length)),
+                width = 100.0f
+            )
 
         assertThat(paragraph.charSequence.toString()).isEqualTo(text)
         assertThat(paragraph.charSequence).hasSpan(LetterSpacingSpanEm::class, 0, text.length)
@@ -471,11 +490,12 @@
         val text = "abcde"
         val spanStyle = SpanStyle(letterSpacing = 2.em)
 
-        val paragraph = simpleParagraph(
-            text = text,
-            spanStyles = listOf(AnnotatedString.Range(spanStyle, 0, "abc".length)),
-            width = 100.0f
-        )
+        val paragraph =
+            simpleParagraph(
+                text = text,
+                spanStyles = listOf(AnnotatedString.Range(spanStyle, 0, "abc".length)),
+                width = 100.0f
+            )
 
         assertThat(paragraph.charSequence.toString()).isEqualTo(text)
         assertThat(paragraph.charSequence).hasSpan(LetterSpacingSpanEm::class, 0, "abc".length)
@@ -487,14 +507,16 @@
         val spanStyle = SpanStyle(letterSpacing = 2.em)
         val spanStyleOverwrite = SpanStyle(letterSpacing = 3.em)
 
-        val paragraph = simpleParagraph(
-            text = text,
-            spanStyles = listOf(
-                AnnotatedString.Range(spanStyle, 0, text.length),
-                AnnotatedString.Range(spanStyleOverwrite, 0, "abc".length)
-            ),
-            width = 100.0f
-        )
+        val paragraph =
+            simpleParagraph(
+                text = text,
+                spanStyles =
+                    listOf(
+                        AnnotatedString.Range(spanStyle, 0, text.length),
+                        AnnotatedString.Range(spanStyleOverwrite, 0, "abc".length)
+                    ),
+                width = 100.0f
+            )
 
         assertThat(paragraph.charSequence.toString()).isEqualTo(text)
         assertThat(paragraph.charSequence).hasSpan(LetterSpacingSpanEm::class, 0, text.length)
@@ -508,17 +530,18 @@
         val color = Color(0xFF0000FF)
         val spanStyle = SpanStyle(background = color)
 
-        val paragraph = simpleParagraph(
-            text = text,
-            spanStyles = listOf(AnnotatedString.Range(spanStyle, 0, text.length)),
-            width = 100.0f
-        )
+        val paragraph =
+            simpleParagraph(
+                text = text,
+                spanStyles = listOf(AnnotatedString.Range(spanStyle, 0, text.length)),
+                width = 100.0f
+            )
 
         assertThat(paragraph.charSequence.toString()).isEqualTo(text)
-        assertThat(paragraph.charSequence)
-            .hasSpan(BackgroundColorSpan::class, 0, text.length) { span ->
-                span.backgroundColor == color.toArgb()
-            }
+        assertThat(paragraph.charSequence).hasSpan(BackgroundColorSpan::class, 0, text.length) {
+            span ->
+            span.backgroundColor == color.toArgb()
+        }
     }
 
     @Test
@@ -527,17 +550,18 @@
         val color = Color(0xFF0000FF)
         val spanStyle = SpanStyle(background = color)
 
-        val paragraph = simpleParagraph(
-            text = text,
-            spanStyles = listOf(AnnotatedString.Range(spanStyle, 0, "abc".length)),
-            width = 100.0f
-        )
+        val paragraph =
+            simpleParagraph(
+                text = text,
+                spanStyles = listOf(AnnotatedString.Range(spanStyle, 0, "abc".length)),
+                width = 100.0f
+            )
 
         assertThat(paragraph.charSequence.toString()).isEqualTo(text)
-        assertThat(paragraph.charSequence)
-            .hasSpan(BackgroundColorSpan::class, 0, "abc".length) { span ->
-                span.backgroundColor == color.toArgb()
-            }
+        assertThat(paragraph.charSequence).hasSpan(BackgroundColorSpan::class, 0, "abc".length) {
+            span ->
+            span.backgroundColor == color.toArgb()
+        }
     }
 
     @Test
@@ -548,28 +572,33 @@
         val colorOverwrite = Color(0xFF00FF00)
         val spanStyleOverwrite = SpanStyle(background = colorOverwrite)
 
-        val paragraph = simpleParagraph(
-            text = text,
-            spanStyles = listOf(
-                AnnotatedString.Range(spanStyle, 0, text.length),
-                AnnotatedString.Range(spanStyleOverwrite, 0, "abc".length)
-            ),
-            width = 100.0f
-        )
+        val paragraph =
+            simpleParagraph(
+                text = text,
+                spanStyles =
+                    listOf(
+                        AnnotatedString.Range(spanStyle, 0, text.length),
+                        AnnotatedString.Range(spanStyleOverwrite, 0, "abc".length)
+                    ),
+                width = 100.0f
+            )
 
         assertThat(paragraph.charSequence.toString()).isEqualTo(text)
-        assertThat(paragraph.charSequence)
-            .hasSpan(BackgroundColorSpan::class, 0, text.length) { span ->
-                span.backgroundColor == color.toArgb()
-            }
-        assertThat(paragraph.charSequence)
-            .hasSpan(BackgroundColorSpan::class, 0, "abc".length) { span ->
-                span.backgroundColor == colorOverwrite.toArgb()
-            }
-        assertThat(paragraph.charSequence)
-            .hasSpanOnTop(BackgroundColorSpan::class, 0, "abc".length) { span ->
-                span.backgroundColor == colorOverwrite.toArgb()
-            }
+        assertThat(paragraph.charSequence).hasSpan(BackgroundColorSpan::class, 0, text.length) {
+            span ->
+            span.backgroundColor == color.toArgb()
+        }
+        assertThat(paragraph.charSequence).hasSpan(BackgroundColorSpan::class, 0, "abc".length) {
+            span ->
+            span.backgroundColor == colorOverwrite.toArgb()
+        }
+        assertThat(paragraph.charSequence).hasSpanOnTop(
+            BackgroundColorSpan::class,
+            0,
+            "abc".length
+        ) { span ->
+            span.backgroundColor == colorOverwrite.toArgb()
+        }
     }
 
     @Test
@@ -578,11 +607,12 @@
         val localeList = LocaleList("en-US")
         val spanStyle = SpanStyle(localeList = localeList)
 
-        val paragraph = simpleParagraph(
-            text = text,
-            spanStyles = listOf(AnnotatedString.Range(spanStyle, 0, text.length)),
-            width = 100.0f
-        )
+        val paragraph =
+            simpleParagraph(
+                text = text,
+                spanStyles = listOf(AnnotatedString.Range(spanStyle, 0, text.length)),
+                width = 100.0f
+            )
 
         assertThat(paragraph.charSequence).hasSpan(LocaleSpan::class, 0, text.length)
     }
@@ -593,11 +623,12 @@
         val localeList = LocaleList("en-US")
         val spanStyle = SpanStyle(localeList = localeList)
 
-        val paragraph = simpleParagraph(
-            text = text,
-            spanStyles = listOf(AnnotatedString.Range(spanStyle, 0, "abc".length)),
-            width = 100.0f
-        )
+        val paragraph =
+            simpleParagraph(
+                text = text,
+                spanStyles = listOf(AnnotatedString.Range(spanStyle, 0, "abc".length)),
+                width = 100.0f
+            )
 
         assertThat(paragraph.charSequence).hasSpan(LocaleSpan::class, 0, "abc".length)
     }
@@ -608,14 +639,16 @@
         val spanStyle = SpanStyle(localeList = LocaleList("en-US"))
         val spanStyleOverwrite = SpanStyle(localeList = LocaleList("ja-JP"))
 
-        val paragraph = simpleParagraph(
-            text = text,
-            spanStyles = listOf(
-                AnnotatedString.Range(spanStyle, 0, text.length),
-                AnnotatedString.Range(spanStyleOverwrite, 0, "abc".length)
-            ),
-            width = 100.0f
-        )
+        val paragraph =
+            simpleParagraph(
+                text = text,
+                spanStyles =
+                    listOf(
+                        AnnotatedString.Range(spanStyle, 0, text.length),
+                        AnnotatedString.Range(spanStyleOverwrite, 0, "abc".length)
+                    ),
+                width = 100.0f
+            )
 
         assertThat(paragraph.charSequence).hasSpan(LocaleSpan::class, 0, text.length)
         assertThat(paragraph.charSequence).hasSpan(LocaleSpan::class, 0, "abc".length)
@@ -627,11 +660,12 @@
         val text = "abcde"
         val spanStyle = SpanStyle(baselineShift = BaselineShift.Subscript)
 
-        val paragraph = simpleParagraph(
-            text = text,
-            spanStyles = listOf(AnnotatedString.Range(spanStyle, 0, text.length)),
-            width = 100.0f // width is not important
-        )
+        val paragraph =
+            simpleParagraph(
+                text = text,
+                spanStyles = listOf(AnnotatedString.Range(spanStyle, 0, text.length)),
+                width = 100.0f // width is not important
+            )
 
         assertThat(paragraph.charSequence).hasSpan(BaselineShiftSpan::class, 0, text.length)
     }
@@ -641,11 +675,12 @@
         val text = "abcde"
         val spanStyle = SpanStyle(baselineShift = BaselineShift.Superscript)
 
-        val paragraph = simpleParagraph(
-            text = text,
-            spanStyles = listOf(AnnotatedString.Range(spanStyle, 0, "abc".length)),
-            width = 100.0f // width is not important
-        )
+        val paragraph =
+            simpleParagraph(
+                text = text,
+                spanStyles = listOf(AnnotatedString.Range(spanStyle, 0, "abc".length)),
+                width = 100.0f // width is not important
+            )
 
         assertThat(paragraph.charSequence).hasSpan(BaselineShiftSpan::class, 0, "abc".length)
     }
@@ -654,17 +689,18 @@
     fun testAnnotatedString_setBaselineShiftTwice_LastOneOnTop() {
         val text = "abcde"
         val spanStyle = SpanStyle(baselineShift = BaselineShift.Subscript)
-        val spanStyleOverwrite =
-            SpanStyle(baselineShift = BaselineShift.Superscript)
+        val spanStyleOverwrite = SpanStyle(baselineShift = BaselineShift.Superscript)
 
-        val paragraph = simpleParagraph(
-            text = text,
-            spanStyles = listOf(
-                AnnotatedString.Range(spanStyle, 0, text.length),
-                AnnotatedString.Range(spanStyleOverwrite, 0, "abc".length)
-            ),
-            width = 100.0f // width is not important
-        )
+        val paragraph =
+            simpleParagraph(
+                text = text,
+                spanStyles =
+                    listOf(
+                        AnnotatedString.Range(spanStyle, 0, text.length),
+                        AnnotatedString.Range(spanStyleOverwrite, 0, "abc".length)
+                    ),
+                width = 100.0f // width is not important
+            )
 
         assertThat(paragraph.charSequence).hasSpan(BaselineShiftSpan::class, 0, text.length)
         assertThat(paragraph.charSequence).hasSpan(BaselineShiftSpan::class, 0, "abc".length)
@@ -676,11 +712,12 @@
         val text = "abcde"
         val spanStyle = SpanStyle(textGeometricTransform = TextGeometricTransform())
 
-        val paragraph = simpleParagraph(
-            text = text,
-            spanStyles = listOf(AnnotatedString.Range(spanStyle, 0, text.length)),
-            width = 100.0f // width is not important
-        )
+        val paragraph =
+            simpleParagraph(
+                text = text,
+                spanStyles = listOf(AnnotatedString.Range(spanStyle, 0, text.length)),
+                width = 100.0f // width is not important
+            )
 
         assertThat(paragraph.charSequence).hasSpan(ScaleXSpan::class, 0, text.length) {
             it.scaleX == 1.0f
@@ -698,17 +735,14 @@
     fun testAnnotatedString_setTextGeometricTransformWithScaleX() {
         val text = "abcde"
         val scaleX = 0.5f
-        val spanStyle = SpanStyle(
-            textGeometricTransform = TextGeometricTransform(
-                scaleX = scaleX
-            )
-        )
+        val spanStyle = SpanStyle(textGeometricTransform = TextGeometricTransform(scaleX = scaleX))
 
-        val paragraph = simpleParagraph(
-            text = text,
-            spanStyles = listOf(AnnotatedString.Range(spanStyle, 0, text.length)),
-            width = 100.0f // width is not important
-        )
+        val paragraph =
+            simpleParagraph(
+                text = text,
+                spanStyles = listOf(AnnotatedString.Range(spanStyle, 0, text.length)),
+                width = 100.0f // width is not important
+            )
 
         assertThat(paragraph.charSequence).hasSpan(ScaleXSpan::class, 0, text.length) {
             it.scaleX == scaleX
@@ -724,11 +758,12 @@
         val skewX = 1f
         val spanStyle = SpanStyle(textGeometricTransform = TextGeometricTransform(skewX = skewX))
 
-        val paragraph = simpleParagraph(
-            text = text,
-            spanStyles = listOf(AnnotatedString.Range(spanStyle, 0, text.length)),
-            width = 100.0f // width is not important
-        )
+        val paragraph =
+            simpleParagraph(
+                text = text,
+                spanStyles = listOf(AnnotatedString.Range(spanStyle, 0, text.length)),
+                width = 100.0f // width is not important
+            )
 
         assertThat(paragraph.charSequence).hasSpan(SkewXSpan::class, 0, text.length) {
             it.skewX == skewX
@@ -744,16 +779,20 @@
         val firstLine = 40
         val restLine = 20
 
-        val paragraph = simpleParagraph(
-            text = text,
-            textIndent = TextIndent(firstLine.sp, restLine.sp),
-            width = 100.0f // width is not important
-        )
+        val paragraph =
+            simpleParagraph(
+                text = text,
+                textIndent = TextIndent(firstLine.sp, restLine.sp),
+                width = 100.0f // width is not important
+            )
 
-        assertThat(paragraph.charSequence)
-            .hasSpan(LeadingMarginSpan.Standard::class, 0, text.length) {
-                it.getLeadingMargin(true) == firstLine && it.getLeadingMargin(false) == restLine
-            }
+        assertThat(paragraph.charSequence).hasSpan(
+            LeadingMarginSpan.Standard::class,
+            0,
+            text.length
+        ) {
+            it.getLeadingMargin(true) == firstLine && it.getLeadingMargin(false) == restLine
+        }
     }
 
     @Test
@@ -764,45 +803,46 @@
         val radius = 3.0f
         val spanStyle = SpanStyle(shadow = Shadow(color, offset, radius))
 
-        val paragraph = simpleParagraph(
-            text = text,
-            spanStyles = listOf(
-                AnnotatedString.Range(spanStyle, start = 0, end = text.length)
-            ),
-            width = 100.0f // width is not important
-        )
+        val paragraph =
+            simpleParagraph(
+                text = text,
+                spanStyles = listOf(AnnotatedString.Range(spanStyle, start = 0, end = text.length)),
+                width = 100.0f // width is not important
+            )
 
-        assertThat(paragraph.charSequence)
-            .hasSpan(ShadowSpan::class, start = 0, end = text.length) {
-                return@hasSpan it.color == color.toArgb() &&
-                    it.offsetX == offset.x &&
-                    it.offsetY == offset.y &&
-                    it.radius == radius
-            }
+        assertThat(paragraph.charSequence).hasSpan(
+            ShadowSpan::class,
+            start = 0,
+            end = text.length
+        ) {
+            return@hasSpan it.color == color.toArgb() &&
+                it.offsetX == offset.x &&
+                it.offsetY == offset.y &&
+                it.radius == radius
+        }
     }
 
     @Test
     fun testAnnotatedString_setShadow_withZeroBlur() {
         val text = "abcde"
-        val spanStyle = SpanStyle(
-            shadow = Shadow(
-                color = Color(0xFF00FF00),
-                offset = Offset(1f, 2f),
-                blurRadius = 0f
+        val spanStyle =
+            SpanStyle(
+                shadow = Shadow(color = Color(0xFF00FF00), offset = Offset(1f, 2f), blurRadius = 0f)
             )
-        )
-        val paragraph = simpleParagraph(
-            text = text,
-            spanStyles = listOf(
-                AnnotatedString.Range(spanStyle, start = 0, end = text.length)
-            ),
-            width = 100.0f // width is not important
-        )
+        val paragraph =
+            simpleParagraph(
+                text = text,
+                spanStyles = listOf(AnnotatedString.Range(spanStyle, start = 0, end = text.length)),
+                width = 100.0f // width is not important
+            )
 
-        assertThat(paragraph.charSequence)
-            .hasSpan(ShadowSpan::class, start = 0, end = text.length) {
-                return@hasSpan it.radius == Float.MIN_VALUE
-            }
+        assertThat(paragraph.charSequence).hasSpan(
+            ShadowSpan::class,
+            start = 0,
+            end = text.length
+        ) {
+            return@hasSpan it.radius == Float.MIN_VALUE
+        }
     }
 
     @Test
@@ -810,55 +850,57 @@
         val text = "abcde"
         val width = 100.0f // width is not important
 
-        val shadow = Shadow(
-            color = Color(0xFF00FF00),
-            offset = Offset(1f, 2f),
-            blurRadius = 0f
-        )
+        val shadow = Shadow(color = Color(0xFF00FF00), offset = Offset(1f, 2f), blurRadius = 0f)
 
         val textStyle = TextStyle(fontSize = 8.sp)
 
-        val paragraphNoShadow = simpleParagraph(
-            text = text,
-            style = textStyle,
-            spanStyles = listOf(),
-            width = width
-        )
+        val paragraphNoShadow =
+            simpleParagraph(text = text, style = textStyle, spanStyles = listOf(), width = width)
 
-        val paragraphZeroBlur = simpleParagraph(
-            text = text,
-            style = textStyle,
-            spanStyles = listOf(
-                AnnotatedString.Range(SpanStyle(shadow = shadow), start = 0, end = text.length)
-            ),
-            width = width
-        )
+        val paragraphZeroBlur =
+            simpleParagraph(
+                text = text,
+                style = textStyle,
+                spanStyles =
+                    listOf(
+                        AnnotatedString.Range(
+                            SpanStyle(shadow = shadow),
+                            start = 0,
+                            end = text.length
+                        )
+                    ),
+                width = width
+            )
 
-        val paragraphFloatMinBlur = simpleParagraph(
-            text = text,
-            style = textStyle,
-            spanStyles = listOf(
-                AnnotatedString.Range(
-                    SpanStyle(shadow = shadow.copy(blurRadius = Float.MIN_VALUE)),
-                    start = 0,
-                    end = text.length
-                )
-            ),
-            width = width
-        )
+        val paragraphFloatMinBlur =
+            simpleParagraph(
+                text = text,
+                style = textStyle,
+                spanStyles =
+                    listOf(
+                        AnnotatedString.Range(
+                            SpanStyle(shadow = shadow.copy(blurRadius = Float.MIN_VALUE)),
+                            start = 0,
+                            end = text.length
+                        )
+                    ),
+                width = width
+            )
 
-        val paragraphOneBlur = simpleParagraph(
-            text = text,
-            style = textStyle,
-            spanStyles = listOf(
-                AnnotatedString.Range(
-                    SpanStyle(shadow = shadow.copy(blurRadius = 1f)),
-                    start = 0,
-                    end = text.length
-                )
-            ),
-            width = width
-        )
+        val paragraphOneBlur =
+            simpleParagraph(
+                text = text,
+                style = textStyle,
+                spanStyles =
+                    listOf(
+                        AnnotatedString.Range(
+                            SpanStyle(shadow = shadow.copy(blurRadius = 1f)),
+                            start = 0,
+                            end = text.length
+                        )
+                    ),
+                width = width
+            )
 
         assertThat(paragraphZeroBlur.bitmap()).isNotEqualToBitmap(paragraphNoShadow.bitmap())
         assertThat(paragraphZeroBlur.bitmap()).isEqualToBitmap(paragraphFloatMinBlur.bitmap())
@@ -876,33 +918,40 @@
         val colorOverwrite = Color(0xFF0000FF)
         val offsetOverwrite = Offset(3f, 2f)
         val radiusOverwrite = 1.0f
-        val spanStyleOverwrite = SpanStyle(
-            shadow = Shadow(colorOverwrite, offsetOverwrite, radiusOverwrite)
-        )
+        val spanStyleOverwrite =
+            SpanStyle(shadow = Shadow(colorOverwrite, offsetOverwrite, radiusOverwrite))
 
-        val paragraph = simpleParagraph(
-            text = text,
-            spanStyles = listOf(
-                AnnotatedString.Range(spanStyle, start = 0, end = text.length),
-                AnnotatedString.Range(spanStyleOverwrite, start = 0, end = "abc".length)
-            ),
-            width = 100.0f // width is not important
-        )
+        val paragraph =
+            simpleParagraph(
+                text = text,
+                spanStyles =
+                    listOf(
+                        AnnotatedString.Range(spanStyle, start = 0, end = text.length),
+                        AnnotatedString.Range(spanStyleOverwrite, start = 0, end = "abc".length)
+                    ),
+                width = 100.0f // width is not important
+            )
 
-        assertThat(paragraph.charSequence)
-            .hasSpan(ShadowSpan::class, start = 0, end = text.length) {
-                return@hasSpan it.color == color.toArgb() &&
-                    it.offsetX == offset.x &&
-                    it.offsetY == offset.y &&
-                    it.radius == radius
-            }
-        assertThat(paragraph.charSequence)
-            .hasSpanOnTop(ShadowSpan::class, start = 0, end = "abc".length) {
-                return@hasSpanOnTop it.color == colorOverwrite.toArgb() &&
-                    it.offsetX == offsetOverwrite.x &&
-                    it.offsetY == offsetOverwrite.y &&
-                    it.radius == radiusOverwrite
-            }
+        assertThat(paragraph.charSequence).hasSpan(
+            ShadowSpan::class,
+            start = 0,
+            end = text.length
+        ) {
+            return@hasSpan it.color == color.toArgb() &&
+                it.offsetX == offset.x &&
+                it.offsetY == offset.y &&
+                it.radius == radius
+        }
+        assertThat(paragraph.charSequence).hasSpanOnTop(
+            ShadowSpan::class,
+            start = 0,
+            end = "abc".length
+        ) {
+            return@hasSpanOnTop it.color == colorOverwrite.toArgb() &&
+                it.offsetX == offsetOverwrite.x &&
+                it.offsetY == offsetOverwrite.y &&
+                it.radius == radiusOverwrite
+        }
     }
 
     @Test
@@ -912,30 +961,23 @@
         val strokeMiter = 4f
         val strokeCap = StrokeCap.Round
         val strokeJoin = StrokeJoin.Bevel
-        val spanStyle = SpanStyle(drawStyle = Stroke(
-            strokeWidth,
-            strokeMiter,
-            strokeCap,
-            strokeJoin
-        ))
+        val spanStyle =
+            SpanStyle(drawStyle = Stroke(strokeWidth, strokeMiter, strokeCap, strokeJoin))
 
-        val paragraph = simpleParagraph(
-            text = text,
-            spanStyles = listOf(
-                AnnotatedString.Range(spanStyle, start = 0, end = text.length)
-            ),
-            width = 0.0f
-        )
+        val paragraph =
+            simpleParagraph(
+                text = text,
+                spanStyles = listOf(AnnotatedString.Range(spanStyle, start = 0, end = text.length)),
+                width = 0.0f
+            )
 
-        assertThat(paragraph.charSequence)
-            .hasSpan(DrawStyleSpan::class, start = 0, end = text.length) {
-                return@hasSpan it.drawStyle == Stroke(
-                    strokeWidth,
-                    strokeMiter,
-                    strokeCap,
-                    strokeJoin
-                )
-            }
+        assertThat(paragraph.charSequence).hasSpan(
+            DrawStyleSpan::class,
+            start = 0,
+            end = text.length
+        ) {
+            return@hasSpan it.drawStyle == Stroke(strokeWidth, strokeMiter, strokeCap, strokeJoin)
+        }
     }
 
     @Test
@@ -945,36 +987,31 @@
         val strokeMiter = 4f
         val strokeCap = StrokeCap.Round
         val strokeJoin = StrokeJoin.Bevel
-        val strokeSpanStyle = SpanStyle(drawStyle = Stroke(
-            strokeWidth,
-            strokeMiter,
-            strokeCap,
-            strokeJoin
-        ))
+        val strokeSpanStyle =
+            SpanStyle(drawStyle = Stroke(strokeWidth, strokeMiter, strokeCap, strokeJoin))
         val fillSpanStyle = SpanStyle(drawStyle = Fill)
 
-        val paragraph = simpleParagraph(
-            text = text,
-            spanStyles = listOf(
-                AnnotatedString.Range(strokeSpanStyle, start = 0, end = text.length),
-                AnnotatedString.Range(fillSpanStyle, start = 1, end = 3)
-            ),
-            width = 0.0f
-        )
+        val paragraph =
+            simpleParagraph(
+                text = text,
+                spanStyles =
+                    listOf(
+                        AnnotatedString.Range(strokeSpanStyle, start = 0, end = text.length),
+                        AnnotatedString.Range(fillSpanStyle, start = 1, end = 3)
+                    ),
+                width = 0.0f
+            )
 
-        assertThat(paragraph.charSequence)
-            .hasSpan(DrawStyleSpan::class, start = 0, end = text.length) {
-                return@hasSpan it.drawStyle == Stroke(
-                    strokeWidth,
-                    strokeMiter,
-                    strokeCap,
-                    strokeJoin
-                )
-            }
-        assertThat(paragraph.charSequence)
-            .hasSpanOnTop(DrawStyleSpan::class, start = 1, end = 3) {
-                return@hasSpanOnTop it.drawStyle == Fill
-            }
+        assertThat(paragraph.charSequence).hasSpan(
+            DrawStyleSpan::class,
+            start = 0,
+            end = text.length
+        ) {
+            return@hasSpan it.drawStyle == Stroke(strokeWidth, strokeMiter, strokeCap, strokeJoin)
+        }
+        assertThat(paragraph.charSequence).hasSpanOnTop(DrawStyleSpan::class, start = 1, end = 3) {
+            return@hasSpanOnTop it.drawStyle == Fill
+        }
     }
 
     @Test
@@ -983,11 +1020,12 @@
         val fontFeatureSettings = "\"kern\" 0"
         val spanStyle = SpanStyle(fontFeatureSettings = fontFeatureSettings)
 
-        val paragraph = simpleParagraph(
-            text = text,
-            spanStyles = listOf(AnnotatedString.Range(spanStyle, 0, "abc".length)),
-            width = 100.0f // width is not important
-        )
+        val paragraph =
+            simpleParagraph(
+                text = text,
+                spanStyles = listOf(AnnotatedString.Range(spanStyle, 0, "abc".length)),
+                width = 100.0f // width is not important
+            )
 
         assertThat(paragraph.charSequence).hasSpan(FontFeatureSpan::class, 0, "abc".length) {
             it.fontFeatureSettings == fontFeatureSettings
@@ -997,10 +1035,7 @@
     @Test
     @MediumTest
     fun testEmptyFontFamily() {
-        val paragraph = simpleParagraph(
-            text = "abc",
-            width = Float.MAX_VALUE
-        )
+        val paragraph = simpleParagraph(text = "abc", width = Float.MAX_VALUE)
 
         assertThat(paragraph.textPaint.typeface).isNull()
     }
@@ -1008,14 +1043,12 @@
     @Test
     @MediumTest
     fun testEmptyFontFamily_withBoldFontWeightSelection() {
-        val paragraph = simpleParagraph(
-            text = "abc",
-            style = TextStyle(
-                fontFamily = null,
-                fontWeight = FontWeight.Bold
-            ),
-            width = Float.MAX_VALUE
-        )
+        val paragraph =
+            simpleParagraph(
+                text = "abc",
+                style = TextStyle(fontFamily = null, fontWeight = FontWeight.Bold),
+                width = Float.MAX_VALUE
+            )
         val typeface = paragraph.textPaint.typeface
         assertThat(typeface).isNotNull()
         assertThat(typeface.isBold).isTrue()
@@ -1025,14 +1058,12 @@
     @Test
     @MediumTest
     fun testEmptyFontFamily_withFontStyleSelection() {
-        val paragraph = simpleParagraph(
-            text = "abc",
-            style = TextStyle(
-                fontFamily = null,
-                fontStyle = FontStyle.Italic
-            ),
-            width = Float.MAX_VALUE
-        )
+        val paragraph =
+            simpleParagraph(
+                text = "abc",
+                style = TextStyle(fontFamily = null, fontStyle = FontStyle.Italic),
+                width = Float.MAX_VALUE
+            )
 
         val typeface = paragraph.textPaint.typeface
         assertThat(typeface).isNotNull()
@@ -1045,13 +1076,12 @@
     fun testFontFamily_withGenericFamilyName() {
         val fontFamily = FontFamily.SansSerif
 
-        val paragraph = simpleParagraph(
-            text = "abc",
-            style = TextStyle(
-                fontFamily = fontFamily
-            ),
-            width = Float.MAX_VALUE
-        )
+        val paragraph =
+            simpleParagraph(
+                text = "abc",
+                style = TextStyle(fontFamily = fontFamily),
+                width = Float.MAX_VALUE
+            )
 
         val typeface = paragraph.textPaint.typeface
         assertThat(typeface).isNotNull()
@@ -1063,16 +1093,16 @@
     @MediumTest
     fun testFontFamily_withCustomFont() {
         val typefaceLoader = AsyncTestTypefaceLoader()
-        val expectedTypeface: Typeface = UncachedFontFamilyResolver(context)
-            .resolve(BASIC_MEASURE_FONT.toFontFamily()).value as Typeface
+        val expectedTypeface: Typeface =
+            UncachedFontFamilyResolver(context).resolve(BASIC_MEASURE_FONT.toFontFamily()).value
+                as Typeface
         val font = BlockingFauxFont(typefaceLoader, expectedTypeface)
-        val paragraph = simpleParagraph(
-            text = "abc",
-            style = TextStyle(
-                fontFamily = font.toFontFamily()
-            ),
-            width = Float.MAX_VALUE
-        )
+        val paragraph =
+            simpleParagraph(
+                text = "abc",
+                style = TextStyle(fontFamily = font.toFontFamily()),
+                width = Float.MAX_VALUE
+            )
 
         val typeface: Typeface = paragraph.textPaint.typeface
 
@@ -1085,15 +1115,13 @@
             val text = "abc"
             val fontSize = 20.sp
             val paragraphWidth = (text.length - 1) * fontSize.toPx()
-            val paragraph = simpleParagraph(
-                text = text,
-                style = TextStyle(
-                    fontFamily = basicFontFamily,
-                    fontSize = fontSize
-                ),
-                ellipsis = true,
-                width = paragraphWidth
-            )
+            val paragraph =
+                simpleParagraph(
+                    text = text,
+                    style = TextStyle(fontFamily = basicFontFamily, fontSize = fontSize),
+                    ellipsis = true,
+                    width = paragraphWidth
+                )
 
             for (i in 0 until paragraph.lineCount) {
                 assertThat(paragraph.isLineEllipsized(i)).isFalse()
@@ -1108,16 +1136,14 @@
             val fontSize = 100.sp
             // Note that on API 21, if the next line only contains 1 character, ellipsis won't work
             val paragraphWidth = (text.length - 1.5f) * fontSize.toPx()
-            val paragraph = simpleParagraph(
-                text = text,
-                ellipsis = true,
-                maxLines = 1,
-                style = TextStyle(
-                    fontFamily = basicFontFamily,
-                    fontSize = fontSize
-                ),
-                width = paragraphWidth
-            )
+            val paragraph =
+                simpleParagraph(
+                    text = text,
+                    ellipsis = true,
+                    maxLines = 1,
+                    style = TextStyle(fontFamily = basicFontFamily, fontSize = fontSize),
+                    width = paragraphWidth
+                )
 
             assertThat(paragraph.isLineEllipsized(0)).isTrue()
         }
@@ -1130,16 +1156,14 @@
             val fontSize = 100.sp
             val paragraphWidth = (text.length - 1) * fontSize.toPx()
             val maxLines = ceil(text.length * fontSize.toPx() / paragraphWidth).toInt()
-            val paragraph = simpleParagraph(
-                text = text,
-                ellipsis = true,
-                maxLines = maxLines,
-                style = TextStyle(
-                    fontFamily = basicFontFamily,
-                    fontSize = fontSize
-                ),
-                width = paragraphWidth
-            )
+            val paragraph =
+                simpleParagraph(
+                    text = text,
+                    ellipsis = true,
+                    maxLines = maxLines,
+                    style = TextStyle(fontFamily = basicFontFamily, fontSize = fontSize),
+                    width = paragraphWidth
+                )
 
             for (i in 0 until paragraph.lineCount) {
                 assertThat(paragraph.isLineEllipsized(i)).isFalse()
@@ -1152,16 +1176,14 @@
         with(defaultDensity) {
             val text = "This is a text"
             val fontSize = 30.sp
-            val paragraph = simpleParagraph(
-                text = text,
-                ellipsis = true,
-                style = TextStyle(
-                    fontFamily = basicFontFamily,
-                    fontSize = fontSize
-                ),
-                width = 4 * fontSize.toPx(),
-                height = 6 * fontSize.toPx(),
-            )
+            val paragraph =
+                simpleParagraph(
+                    text = text,
+                    ellipsis = true,
+                    style = TextStyle(fontFamily = basicFontFamily, fontSize = fontSize),
+                    width = 4 * fontSize.toPx(),
+                    height = 6 * fontSize.toPx(),
+                )
 
             for (i in 0 until paragraph.lineCount) {
                 assertThat(paragraph.isLineEllipsized(i)).isFalse()
@@ -1174,16 +1196,14 @@
         with(defaultDensity) {
             val text = "This is a text"
             val fontSize = 30.sp
-            val paragraph = simpleParagraph(
-                text = text,
-                ellipsis = true,
-                style = TextStyle(
-                    fontFamily = basicFontFamily,
-                    fontSize = fontSize
-                ),
-                width = 4 * fontSize.toPx(),
-                height = 2.2f * fontSize.toPx(), // fits 2 lines
-            )
+            val paragraph =
+                simpleParagraph(
+                    text = text,
+                    ellipsis = true,
+                    style = TextStyle(fontFamily = basicFontFamily, fontSize = fontSize),
+                    width = 4 * fontSize.toPx(),
+                    height = 2.2f * fontSize.toPx(), // fits 2 lines
+                )
 
             assertThat(paragraph.lineCount).isEqualTo(2)
             assertThat(paragraph.isLineEllipsized(paragraph.lineCount - 1)).isTrue()
@@ -1195,16 +1215,14 @@
         with(defaultDensity) {
             val text = "This is a text"
             val fontSize = 30.sp
-            val paragraph = simpleParagraph(
-                text = text,
-                ellipsis = false,
-                style = TextStyle(
-                    fontFamily = basicFontFamily,
-                    fontSize = fontSize
-                ),
-                width = 4 * fontSize.toPx(),
-                height = 2.2f * fontSize.toPx(), // fits 2 lines
-            )
+            val paragraph =
+                simpleParagraph(
+                    text = text,
+                    ellipsis = false,
+                    style = TextStyle(fontFamily = basicFontFamily, fontSize = fontSize),
+                    width = 4 * fontSize.toPx(),
+                    height = 2.2f * fontSize.toPx(), // fits 2 lines
+                )
 
             for (i in 0 until paragraph.lineCount) {
                 assertThat(paragraph.isLineEllipsized(i)).isFalse()
@@ -1217,17 +1235,15 @@
         with(defaultDensity) {
             val text = "This is a text"
             val fontSize = 30.sp
-            val paragraph = simpleParagraph(
-                text = text,
-                ellipsis = true,
-                style = TextStyle(
-                    fontFamily = basicFontFamily,
-                    fontSize = fontSize
-                ),
-                width = 4 * fontSize.toPx(),
-                height = 2.2f * fontSize.toPx(), // fits 2 lines
-                maxLines = 5
-            )
+            val paragraph =
+                simpleParagraph(
+                    text = text,
+                    ellipsis = true,
+                    style = TextStyle(fontFamily = basicFontFamily, fontSize = fontSize),
+                    width = 4 * fontSize.toPx(),
+                    height = 2.2f * fontSize.toPx(), // fits 2 lines
+                    maxLines = 5
+                )
 
             assertThat(paragraph.lineCount).isEqualTo(2)
             assertThat(paragraph.isLineEllipsized(paragraph.lineCount - 1)).isTrue()
@@ -1239,17 +1255,15 @@
         with(defaultDensity) {
             val text = "This is a text"
             val fontSize = 30.sp
-            val paragraph = simpleParagraph(
-                text = text,
-                ellipsis = true,
-                style = TextStyle(
-                    fontFamily = basicFontFamily,
-                    fontSize = fontSize
-                ),
-                width = 4 * fontSize.toPx(),
-                height = 4 * fontSize.toPx(),
-                maxLines = 2
-            )
+            val paragraph =
+                simpleParagraph(
+                    text = text,
+                    ellipsis = true,
+                    style = TextStyle(fontFamily = basicFontFamily, fontSize = fontSize),
+                    width = 4 * fontSize.toPx(),
+                    height = 4 * fontSize.toPx(),
+                    maxLines = 2
+                )
 
             assertThat(paragraph.lineCount).isEqualTo(2)
             assertThat(paragraph.isLineEllipsized(paragraph.lineCount - 1)).isTrue()
@@ -1261,16 +1275,14 @@
         with(defaultDensity) {
             val text = "This is a text"
             val fontSize = 30.sp
-            val paragraph = simpleParagraph(
-                text = text,
-                ellipsis = true,
-                style = TextStyle(
-                    fontFamily = basicFontFamily,
-                    fontSize = fontSize
-                ),
-                width = 4 * fontSize.toPx(),
-                height = fontSize.toPx() / 4
-            )
+            val paragraph =
+                simpleParagraph(
+                    text = text,
+                    ellipsis = true,
+                    style = TextStyle(fontFamily = basicFontFamily, fontSize = fontSize),
+                    width = 4 * fontSize.toPx(),
+                    height = fontSize.toPx() / 4
+                )
 
             assertThat(paragraph.didExceedMaxLines).isTrue()
             assertThat(paragraph.lineCount).isEqualTo(1)
@@ -1283,33 +1295,28 @@
         with(defaultDensity) {
             val text = "This is a text"
             val fontSize = 30.sp
-            val paragraph = simpleParagraph(
-                text = text,
-                spanStyles = listOf(
-                    AnnotatedString.Range(SpanStyle(fontSize = fontSize * 2), 0, 2)
-                ),
-                ellipsis = true,
-                style = TextStyle(
-                    fontFamily = basicFontFamily,
-                    fontSize = fontSize
-                ),
-                width = 4 * fontSize.toPx(),
-                height = 2.2f * fontSize.toPx() // fits 2 lines
-            )
+            val paragraph =
+                simpleParagraph(
+                    text = text,
+                    spanStyles =
+                        listOf(AnnotatedString.Range(SpanStyle(fontSize = fontSize * 2), 0, 2)),
+                    ellipsis = true,
+                    style = TextStyle(fontFamily = basicFontFamily, fontSize = fontSize),
+                    width = 4 * fontSize.toPx(),
+                    height = 2.2f * fontSize.toPx() // fits 2 lines
+                )
 
             assertThat(paragraph.lineCount).isEqualTo(1)
             assertThat(paragraph.isLineEllipsized(paragraph.lineCount - 1)).isTrue()
         }
     }
+
     @Test
     fun testSpanStyle_fontSize_appliedOnTextPaint() {
         with(defaultDensity) {
             val fontSize = 100.sp
-            val paragraph = simpleParagraph(
-                text = "",
-                style = TextStyle(fontSize = fontSize),
-                width = 0.0f
-            )
+            val paragraph =
+                simpleParagraph(text = "", style = TextStyle(fontSize = fontSize), width = 0.0f)
 
             assertThat(paragraph.textPaint.textSize).isEqualTo(fontSize.toPx())
         }
@@ -1320,11 +1327,8 @@
         val platformLocale = java.util.Locale.JAPANESE
         val localeList = LocaleList(platformLocale.toLanguageTag())
 
-        val paragraph = simpleParagraph(
-            text = "",
-            style = TextStyle(localeList = localeList),
-            width = 0.0f
-        )
+        val paragraph =
+            simpleParagraph(text = "", style = TextStyle(localeList = localeList), width = 0.0f)
 
         assertThat(paragraph.textPaint.textLocale.language).isEqualTo(platformLocale.language)
         assertThat(paragraph.textPaint.textLocale.country).isEqualTo(platformLocale.country)
@@ -1333,11 +1337,7 @@
     @Test
     fun testSpanStyle_color_appliedOnTextPaint() {
         val color = Color(0x12345678)
-        val paragraph = simpleParagraph(
-            text = "",
-            style = TextStyle(color = color),
-            width = 0.0f
-        )
+        val paragraph = simpleParagraph(text = "", style = TextStyle(color = color), width = 0.0f)
 
         assertThat(paragraph.textPaint.color).isEqualTo(color.toArgb())
     }
@@ -1345,11 +1345,7 @@
     @Test
     fun testSpanStyle_brush_appliedOnTextPaint() {
         val brush = Brush.horizontalGradient(listOf(Color.Red, Color.Blue)) as ShaderBrush
-        val paragraph = simpleParagraph(
-            text = "",
-            style = TextStyle(brush = brush),
-            width = 1.0f
-        )
+        val paragraph = simpleParagraph(text = "", style = TextStyle(brush = brush), width = 1.0f)
 
         assertThat(paragraph.textPaint.shader).isNotNull()
     }
@@ -1357,11 +1353,12 @@
     @Test
     fun testTextStyle_letterSpacingInEm_appliedOnTextPaint() {
         val letterSpacing = 2
-        val paragraph = simpleParagraph(
-            text = "",
-            style = TextStyle(letterSpacing = letterSpacing.em),
-            width = 0.0f
-        )
+        val paragraph =
+            simpleParagraph(
+                text = "",
+                style = TextStyle(letterSpacing = letterSpacing.em),
+                width = 0.0f
+            )
 
         assertThat(paragraph.textPaint.letterSpacing).isEqualTo((letterSpacing))
     }
@@ -1374,28 +1371,33 @@
             append("abc")
             pop()
         }
-        val paragraph = simpleParagraph(
-            text = annotatedText.text,
-            spanStyles = annotatedText.spanStyles,
-            style = TextStyle(letterSpacing = letterSpacing.sp),
-            width = 0.0f
-        )
+        val paragraph =
+            simpleParagraph(
+                text = annotatedText.text,
+                spanStyles = annotatedText.spanStyles,
+                style = TextStyle(letterSpacing = letterSpacing.sp),
+                width = 0.0f
+            )
 
-        assertThat(paragraph.charSequence)
-            .hasSpan(LetterSpacingSpanPx::class, 0, annotatedText.length) {
-                it.letterSpacing == letterSpacing
-            }
+        assertThat(paragraph.charSequence).hasSpan(
+            LetterSpacingSpanPx::class,
+            0,
+            annotatedText.length
+        ) {
+            it.letterSpacing == letterSpacing
+        }
     }
 
     @Test
     fun testTextStyle_letterSpacingInSp_noSpan_whenNoAnnoattions() {
         val letterSpacing = 5f
         val annotatedText = "abc"
-        val paragraph = simpleParagraph(
-            text = annotatedText,
-            style = TextStyle(letterSpacing = letterSpacing.sp),
-            width = 0.0f
-        )
+        val paragraph =
+            simpleParagraph(
+                text = annotatedText,
+                style = TextStyle(letterSpacing = letterSpacing.sp),
+                width = 0.0f
+            )
 
         assertThat(paragraph.charSequence).doesNotHaveSpan(LetterSpacingSpanPx::class)
     }
@@ -1403,11 +1405,12 @@
     @Test
     fun testSpanStyle_fontFeatureSettings_appliedOnTextPaint() {
         val fontFeatureSettings = "\"kern\" 0"
-        val paragraph = simpleParagraph(
-            text = "",
-            style = TextStyle(fontFeatureSettings = fontFeatureSettings),
-            width = 0.0f
-        )
+        val paragraph =
+            simpleParagraph(
+                text = "",
+                style = TextStyle(fontFeatureSettings = fontFeatureSettings),
+                width = 0.0f
+            )
 
         assertThat(paragraph.textPaint.fontFeatureSettings).isEqualTo(fontFeatureSettings)
     }
@@ -1415,15 +1418,12 @@
     @Test
     fun testSpanStyle_scaleX_appliedOnTextPaint() {
         val scaleX = 0.5f
-        val paragraph = simpleParagraph(
-            text = "",
-            style = TextStyle(
-                textGeometricTransform = TextGeometricTransform(
-                    scaleX = scaleX
-                )
-            ),
-            width = 0.0f
-        )
+        val paragraph =
+            simpleParagraph(
+                text = "",
+                style = TextStyle(textGeometricTransform = TextGeometricTransform(scaleX = scaleX)),
+                width = 0.0f
+            )
 
         assertThat(paragraph.textPaint.textScaleX).isEqualTo(scaleX)
     }
@@ -1431,26 +1431,24 @@
     @Test
     fun testSpanStyle_skewX_appliedOnTextPaint() {
         val skewX = 0.5f
-        val paragraph = simpleParagraph(
-            text = "",
-            style = TextStyle(
-                textGeometricTransform = TextGeometricTransform(
-                    skewX = skewX
-                )
-            ),
-            width = 0.0f
-        )
+        val paragraph =
+            simpleParagraph(
+                text = "",
+                style = TextStyle(textGeometricTransform = TextGeometricTransform(skewX = skewX)),
+                width = 0.0f
+            )
 
         assertThat(paragraph.textPaint.textSkewX).isEqualTo(skewX)
     }
 
     @Test
     fun testSpanStyle_textDecoration_underline_appliedOnTextPaint() {
-        val paragraph = simpleParagraph(
-            text = "",
-            style = TextStyle(textDecoration = TextDecoration.Underline),
-            width = 0.0f
-        )
+        val paragraph =
+            simpleParagraph(
+                text = "",
+                style = TextStyle(textDecoration = TextDecoration.Underline),
+                width = 0.0f
+            )
 
         assertThat(paragraph.textPaint.isUnderlineText).isTrue()
     }
@@ -1458,38 +1456,45 @@
     @Test
     fun testSpanStyle_textDecoration_underline_appliedAsSpan() {
         val text = "abc"
-        val paragraph = simpleParagraph(
-            text = text,
-            style = TextStyle(textDecoration = TextDecoration.Underline),
-            width = 0.0f
-        )
+        val paragraph =
+            simpleParagraph(
+                text = text,
+                style = TextStyle(textDecoration = TextDecoration.Underline),
+                width = 0.0f
+            )
 
         assertThat(paragraph.charSequence).hasSpan(CharacterStyle::class, 0, text.length)
     }
 
     @Test
     fun testSpanStyle_textDecoration_lineThrough_appliedOnTextPaint() {
-        val paragraph = simpleParagraph(
-            text = "",
-            style = TextStyle(textDecoration = TextDecoration.LineThrough),
-            width = 0.0f
-        )
+        val paragraph =
+            simpleParagraph(
+                text = "",
+                style = TextStyle(textDecoration = TextDecoration.LineThrough),
+                width = 0.0f
+            )
 
         assertThat(paragraph.textPaint.isStrikeThruText).isTrue()
     }
 
     @Test
     fun testSpanStyle_drawStyle_stroke_appliedOnTextPaint() {
-        val paragraph = simpleParagraph(
-            text = "",
-            style = TextStyle(drawStyle = Stroke(
-                width = 8f,
-                miter = 6f,
-                cap = StrokeCap.Round,
-                join = StrokeJoin.Bevel
-            )),
-            width = 0.0f
-        )
+        val paragraph =
+            simpleParagraph(
+                text = "",
+                style =
+                    TextStyle(
+                        drawStyle =
+                            Stroke(
+                                width = 8f,
+                                miter = 6f,
+                                cap = StrokeCap.Round,
+                                join = StrokeJoin.Bevel
+                            )
+                    ),
+                width = 0.0f
+            )
 
         assertThat(paragraph.textPaint.style).isEqualTo(Paint.Style.STROKE)
         assertThat(paragraph.textPaint.strokeWidth).isEqualTo(8f)
@@ -1500,11 +1505,8 @@
 
     @Test
     fun testSpanStyle_drawStyle_fill_appliedOnTextPaint() {
-        val paragraph = simpleParagraph(
-            text = "",
-            style = TextStyle(drawStyle = Fill),
-            width = 0.0f
-        )
+        val paragraph =
+            simpleParagraph(text = "", style = TextStyle(drawStyle = Fill), width = 0.0f)
 
         assertThat(paragraph.textPaint.style).isEqualTo(Paint.Style.FILL)
     }
@@ -1515,25 +1517,19 @@
         // therefore we cannot apply them on paint, have to use spans.
         val text = "abc"
         val color = Color(0x12345678)
-        val paragraph = simpleParagraph(
-            text = text,
-            style = TextStyle(background = color),
-            width = 0.0f
-        )
+        val paragraph =
+            simpleParagraph(text = text, style = TextStyle(background = color), width = 0.0f)
 
-        assertThat(paragraph.charSequence)
-            .hasSpan(BackgroundColorSpan::class, 0, text.length) { span ->
-                span.backgroundColor == color.toArgb()
-            }
+        assertThat(paragraph.charSequence).hasSpan(BackgroundColorSpan::class, 0, text.length) {
+            span ->
+            span.backgroundColor == color.toArgb()
+        }
     }
 
     @Test
     fun testPaint_can_change_TextDecoration_to_Underline() {
-        val paragraph = simpleParagraph(
-            text = "",
-            style = TextStyle(textDecoration = null),
-            width = 0.0f
-        )
+        val paragraph =
+            simpleParagraph(text = "", style = TextStyle(textDecoration = null), width = 0.0f)
         assertThat(paragraph.textPaint.isUnderlineText).isFalse()
 
         val canvas = Canvas(android.graphics.Canvas())
@@ -1543,13 +1539,12 @@
 
     @Test
     fun testPaint_can_change_TextDecoration_to_None() {
-        val paragraph = simpleParagraph(
-            text = "",
-            style = TextStyle(
-                textDecoration = TextDecoration.Underline
-            ),
-            width = 0.0f
-        )
+        val paragraph =
+            simpleParagraph(
+                text = "",
+                style = TextStyle(textDecoration = TextDecoration.Underline),
+                width = 0.0f
+            )
         assertThat(paragraph.textPaint.isUnderlineText).isTrue()
 
         val canvas = Canvas(android.graphics.Canvas())
@@ -1559,13 +1554,12 @@
 
     @Test
     fun testPaint_TextDecoration_null_should_have_no_effect() {
-        val paragraph = simpleParagraph(
-            text = "",
-            style = TextStyle(
-                textDecoration = TextDecoration.Underline
-            ),
-            width = 0.0f
-        )
+        val paragraph =
+            simpleParagraph(
+                text = "",
+                style = TextStyle(textDecoration = TextDecoration.Underline),
+                width = 0.0f
+            )
         assertThat(paragraph.textPaint.isUnderlineText).isTrue()
 
         val canvas = Canvas(android.graphics.Canvas())
@@ -1575,11 +1569,8 @@
 
     @Test
     fun testPaint_can_change_DrawStyle_to_Stroke() {
-        val paragraph = simpleParagraph(
-            text = "",
-            style = TextStyle(drawStyle = null),
-            width = 0.0f
-        )
+        val paragraph =
+            simpleParagraph(text = "", style = TextStyle(drawStyle = null), width = 0.0f)
         assertThat(paragraph.textPaint.style).isEqualTo(Paint.Style.FILL)
 
         val stroke = Stroke(width = 4f, miter = 2f, cap = StrokeCap.Square, join = StrokeJoin.Bevel)
@@ -1595,11 +1586,8 @@
 
     @Test
     fun testPaint_can_change_DrawStyle_to_Fill() {
-        val paragraph = simpleParagraph(
-            text = "",
-            style = TextStyle(drawStyle = Stroke(8f)),
-            width = 0.0f
-        )
+        val paragraph =
+            simpleParagraph(text = "", style = TextStyle(drawStyle = Stroke(8f)), width = 0.0f)
         assertThat(paragraph.textPaint.style).isEqualTo(Paint.Style.STROKE)
         assertThat(paragraph.textPaint.strokeWidth).isEqualTo(8f)
 
@@ -1610,11 +1598,8 @@
 
     @Test
     fun testPaint_null_drawStyle_should_be_noop() {
-        val paragraph = simpleParagraph(
-            text = "",
-            style = TextStyle(drawStyle = Stroke(8f)),
-            width = 0.0f
-        )
+        val paragraph =
+            simpleParagraph(text = "", style = TextStyle(drawStyle = Stroke(8f)), width = 0.0f)
         assertThat(paragraph.textPaint.style).isEqualTo(Paint.Style.STROKE)
         assertThat(paragraph.textPaint.strokeWidth).isEqualTo(8f)
 
@@ -1626,10 +1611,7 @@
 
     @Test
     fun testPaint_cannot_change_blendMode_permanently() {
-        val paragraph = simpleParagraph(
-            text = "",
-            width = 0.0f
-        )
+        val paragraph = simpleParagraph(text = "", width = 0.0f)
         assertThat(paragraph.textPaint.blendMode).isEqualTo(BlendMode.SrcOver)
 
         val canvas = Canvas(android.graphics.Canvas())
@@ -1640,11 +1622,7 @@
     @SdkSuppress(minSdkVersion = 29)
     @Test
     fun testPaint_can_change_Shadow() {
-        val paragraph = simpleParagraph(
-            text = "",
-            style = TextStyle(shadow = null),
-            width = 0.0f
-        )
+        val paragraph = simpleParagraph(text = "", style = TextStyle(shadow = null), width = 0.0f)
 
         assertThat(paragraph.textPaint.shadowLayerColor).isEqualTo(0)
         assertThat(paragraph.textPaint.shadowLayerDx).isEqualTo(0f)
@@ -1675,13 +1653,12 @@
         val radius = 3f
         val color = Color.Red
 
-        val paragraph = simpleParagraph(
-            text = "",
-            style = TextStyle(
-                shadow = Shadow(color, Offset(dx, dy), radius)
-            ),
-            width = 0.0f
-        )
+        val paragraph =
+            simpleParagraph(
+                text = "",
+                style = TextStyle(shadow = Shadow(color, Offset(dx, dy), radius)),
+                width = 0.0f
+            )
 
         assertThat(paragraph.textPaint.shadowLayerDx).isEqualTo(dx)
         assertThat(paragraph.textPaint.shadowLayerDy).isEqualTo(dy)
@@ -1704,13 +1681,12 @@
         val radius = 3f
         val color = Color.Red
 
-        val paragraph = simpleParagraph(
-            text = "",
-            style = TextStyle(
-                shadow = Shadow(color, Offset(dx, dy), radius)
-            ),
-            width = 0.0f
-        )
+        val paragraph =
+            simpleParagraph(
+                text = "",
+                style = TextStyle(shadow = Shadow(color, Offset(dx, dy), radius)),
+                width = 0.0f
+            )
 
         assertThat(paragraph.textPaint.shadowLayerDx).isEqualTo(dx)
         assertThat(paragraph.textPaint.shadowLayerDy).isEqualTo(dy)
@@ -1728,11 +1704,7 @@
     @SdkSuppress(minSdkVersion = 29)
     @Test
     fun testPaint_shadow_blur_with_zero_resets_to_float_min() {
-        val paragraph = simpleParagraph(
-            text = "",
-            style = TextStyle(shadow = null),
-            width = 0.0f
-        )
+        val paragraph = simpleParagraph(text = "", style = TextStyle(shadow = null), width = 0.0f)
 
         assertThat(paragraph.textPaint.shadowLayerRadius).isEqualTo(0f)
 
@@ -1756,38 +1728,35 @@
         val width = 100f
         val fontSize = 8.sp
 
-        val shadow = Shadow(
-            color = Color(0xFF00FF00),
-            offset = Offset(1f, 2f),
-            blurRadius = 0f
-        )
+        val shadow = Shadow(color = Color(0xFF00FF00), offset = Offset(1f, 2f), blurRadius = 0f)
 
-        val paragraphNoShadow = simpleParagraph(
-            text = text,
-            style = TextStyle(fontSize = fontSize),
-            width = width
-        )
+        val paragraphNoShadow =
+            simpleParagraph(text = text, style = TextStyle(fontSize = fontSize), width = width)
 
-        val paragraphZeroBlur = simpleParagraph(
-            text = text,
-            style = TextStyle(fontSize = fontSize, shadow = shadow),
-            width = width
-        )
+        val paragraphZeroBlur =
+            simpleParagraph(
+                text = text,
+                style = TextStyle(fontSize = fontSize, shadow = shadow),
+                width = width
+            )
 
-        val paragraphFloatMinBlur = simpleParagraph(
-            text = text,
-            style = TextStyle(
-                fontSize = fontSize,
-                shadow = shadow.copy(blurRadius = Float.MIN_VALUE)
-            ),
-            width = width
-        )
+        val paragraphFloatMinBlur =
+            simpleParagraph(
+                text = text,
+                style =
+                    TextStyle(
+                        fontSize = fontSize,
+                        shadow = shadow.copy(blurRadius = Float.MIN_VALUE)
+                    ),
+                width = width
+            )
 
-        val paragraphOneBlur = simpleParagraph(
-            text = text,
-            style = TextStyle(fontSize = fontSize, shadow = shadow.copy(blurRadius = 1f)),
-            width = width
-        )
+        val paragraphOneBlur =
+            simpleParagraph(
+                text = text,
+                style = TextStyle(fontSize = fontSize, shadow = shadow.copy(blurRadius = 1f)),
+                width = width
+            )
 
         assertThat(paragraphZeroBlur.bitmap()).isNotEqualToBitmap(paragraphNoShadow.bitmap())
         assertThat(paragraphZeroBlur.bitmap()).isEqualToBitmap(paragraphFloatMinBlur.bitmap())
@@ -1798,11 +1767,8 @@
     fun testPaint_can_change_Color() {
         val color1 = Color.Red
 
-        val paragraph = simpleParagraph(
-            text = "",
-            style = TextStyle(color = Color.Red),
-            width = 0.0f
-        )
+        val paragraph =
+            simpleParagraph(text = "", style = TextStyle(color = Color.Red), width = 0.0f)
         assertThat(paragraph.textPaint.color).isEqualTo(color1.toArgb())
 
         val color2 = Color.Yellow
@@ -1815,11 +1781,8 @@
     fun testPaint_cannot_change_Color_to_Unspecified() {
         val color1 = Color.Red
 
-        val paragraph = simpleParagraph(
-            text = "",
-            style = TextStyle(color = Color.Red),
-            width = 0.0f
-        )
+        val paragraph =
+            simpleParagraph(text = "", style = TextStyle(color = Color.Red), width = 0.0f)
         assertThat(paragraph.textPaint.color).isEqualTo(color1.toArgb())
 
         val color2 = Color.Unspecified
@@ -1832,11 +1795,8 @@
     fun testPaint_can_change_Color_to_Transparent() {
         val color1 = Color.Red
 
-        val paragraph = simpleParagraph(
-            text = "",
-            style = TextStyle(color = Color.Red),
-            width = 0.0f
-        )
+        val paragraph =
+            simpleParagraph(text = "", style = TextStyle(color = Color.Red), width = 0.0f)
         assertThat(paragraph.textPaint.color).isEqualTo(color1.toArgb())
 
         val color2 = Color.Transparent
@@ -1851,25 +1811,23 @@
         // therefore we cannot apply them on paint, have to use spans.
         val text = "abc"
         val baselineShift = BaselineShift.Subscript
-        val paragraph = simpleParagraph(
-            text = text,
-            style = TextStyle(baselineShift = baselineShift),
-            width = 0.0f
-        )
+        val paragraph =
+            simpleParagraph(
+                text = text,
+                style = TextStyle(baselineShift = baselineShift),
+                width = 0.0f
+            )
 
-        assertThat(paragraph.charSequence)
-            .hasSpan(BaselineShiftSpan::class, 0, text.length) { span ->
-                span.multiplier == BaselineShift.Subscript.multiplier
-            }
+        assertThat(paragraph.charSequence).hasSpan(BaselineShiftSpan::class, 0, text.length) { span
+            ->
+            span.multiplier == BaselineShift.Subscript.multiplier
+        }
     }
 
     @Test
     fun locale_isDefaultLocaleIfNotProvided() {
         val text = "abc"
-        val paragraph = simpleParagraph(
-            text = text,
-            width = Float.MAX_VALUE
-        )
+        val paragraph = simpleParagraph(text = text, width = Float.MAX_VALUE)
 
         assertThat(paragraph.textLocale.toLanguageTag())
             .isEqualTo(java.util.Locale.getDefault().toLanguageTag())
@@ -1879,11 +1837,12 @@
     fun locale_isSetOnParagraphImpl_enUS() {
         val localeList = LocaleList("en-US")
         val text = "abc"
-        val paragraph = simpleParagraph(
-            text = text,
-            style = TextStyle(localeList = localeList),
-            width = Float.MAX_VALUE
-        )
+        val paragraph =
+            simpleParagraph(
+                text = text,
+                style = TextStyle(localeList = localeList),
+                width = Float.MAX_VALUE
+            )
 
         assertThat(paragraph.textLocale.toLanguageTag()).isEqualTo("en-US")
     }
@@ -1892,11 +1851,12 @@
     fun locale_isSetOnParagraphImpl_jpJP() {
         val localeList = LocaleList("ja-JP")
         val text = "abc"
-        val paragraph = simpleParagraph(
-            text = text,
-            style = TextStyle(localeList = localeList),
-            width = Float.MAX_VALUE
-        )
+        val paragraph =
+            simpleParagraph(
+                text = text,
+                style = TextStyle(localeList = localeList),
+                width = Float.MAX_VALUE
+            )
 
         assertThat(paragraph.textLocale.toLanguageTag()).isEqualTo("ja-JP")
     }
@@ -1905,11 +1865,12 @@
     fun locale_noCountryCode_isSetOnParagraphImpl() {
         val localeList = LocaleList("ja")
         val text = "abc"
-        val paragraph = simpleParagraph(
-            text = text,
-            style = TextStyle(localeList = localeList),
-            width = Float.MAX_VALUE
-        )
+        val paragraph =
+            simpleParagraph(
+                text = text,
+                style = TextStyle(localeList = localeList),
+                width = Float.MAX_VALUE
+            )
 
         assertThat(paragraph.textLocale.toLanguageTag()).isEqualTo("ja")
     }
@@ -1919,23 +1880,22 @@
         val text = "A"
 
         @Suppress("DEPRECATION")
-        val style = TextStyle(
-            fontSize = 20.sp,
-            platformStyle = PlatformTextStyle(includeFontPadding = true)
-        )
+        val style =
+            TextStyle(
+                fontSize = 20.sp,
+                platformStyle = PlatformTextStyle(includeFontPadding = true)
+            )
 
-        val paragraphPaddingTrue = simpleParagraph(
-            text = text,
-            style = style,
-            width = Float.MAX_VALUE
-        )
+        val paragraphPaddingTrue =
+            simpleParagraph(text = text, style = style, width = Float.MAX_VALUE)
 
         @Suppress("DEPRECATION")
-        val paragraphPaddingFalse = simpleParagraph(
-            text = text,
-            style = style.copy(platformStyle = PlatformTextStyle(includeFontPadding = false)),
-            width = Float.MAX_VALUE
-        )
+        val paragraphPaddingFalse =
+            simpleParagraph(
+                text = text,
+                style = style.copy(platformStyle = PlatformTextStyle(includeFontPadding = false)),
+                width = Float.MAX_VALUE
+            )
 
         assertThat(paragraphPaddingTrue.height).isNotEqualTo(paragraphPaddingFalse.height)
     }
@@ -1976,21 +1936,25 @@
     fun shaderBrushSpan_createsShaderOnlyOnce() {
         val fontSize = 20
         val text = "abcdef"
-        val shaderBrush = object : ShaderBrush() {
-            var callCount = 0
-            private val brush = Brush.linearGradient(listOf(Color.Red, Color.Blue)) as ShaderBrush
-            override fun createShader(size: Size): android.graphics.Shader {
-                callCount++
-                return brush.createShader(size)
+        val shaderBrush =
+            object : ShaderBrush() {
+                var callCount = 0
+                private val brush =
+                    Brush.linearGradient(listOf(Color.Red, Color.Blue)) as ShaderBrush
+
+                override fun createShader(size: Size): android.graphics.Shader {
+                    callCount++
+                    return brush.createShader(size)
+                }
             }
-        }
         val spanStyle = SpanStyle(brush = shaderBrush)
-        val paragraph = simpleParagraph(
-            text = "abcdef",
-            width = 2f * fontSize * text.length,
-            style = TextStyle(fontSize = fontSize.sp),
-            spanStyles = listOf(AnnotatedString.Range(spanStyle, 0, 2))
-        )
+        val paragraph =
+            simpleParagraph(
+                text = "abcdef",
+                width = 2f * fontSize * text.length,
+                style = TextStyle(fontSize = fontSize.sp),
+                spanStyles = listOf(AnnotatedString.Range(spanStyle, 0, 2))
+            )
 
         // Call paint on paragraph multiple times
         repeat(5) { paragraph.bitmap() }
@@ -1998,46 +1962,50 @@
     }
 
     @Test
-    fun drawText_withUnderlineStyle_equalToUnderlinePaint() = with(defaultDensity) {
-        val fontSize = 30.sp
-        val fontSizeInPx = fontSize.toPx()
-        val text = "レンズ(単焦点)"
-        val spanStyle = SpanStyle(textDecoration = TextDecoration.Underline)
-        val paragraph = simpleParagraph(
-            text = text,
-            style = TextStyle(fontSize = fontSize),
-            spanStyles = listOf(AnnotatedString.Range(spanStyle, 0, text.length)),
-            width = fontSizeInPx * 20
-        )
+    fun drawText_withUnderlineStyle_equalToUnderlinePaint() =
+        with(defaultDensity) {
+            val fontSize = 30.sp
+            val fontSizeInPx = fontSize.toPx()
+            val text = "レンズ(単焦点)"
+            val spanStyle = SpanStyle(textDecoration = TextDecoration.Underline)
+            val paragraph =
+                simpleParagraph(
+                    text = text,
+                    style = TextStyle(fontSize = fontSize),
+                    spanStyles = listOf(AnnotatedString.Range(spanStyle, 0, text.length)),
+                    width = fontSizeInPx * 20
+                )
 
-        val paragraph2 = simpleParagraph(
-            text = text,
-            style = TextStyle(
-                fontSize = fontSize,
-                textDecoration = TextDecoration.Underline
-            ),
-            width = fontSizeInPx * 20
-        )
+            val paragraph2 =
+                simpleParagraph(
+                    text = text,
+                    style =
+                        TextStyle(fontSize = fontSize, textDecoration = TextDecoration.Underline),
+                    width = fontSizeInPx * 20
+                )
 
-        val bitmapWithSpan = paragraph.bitmap()
-        // Our text rendering stack relies on the fact that given textstyle is also passed to draw
-        // functions of TextLayoutResult, MultiParagraph, Paragraph. If Underline is not specified
-        // here, it would be removed while drawing the MultiParagraph. We are simply mimicking
-        // what TextPainter does.
-        val bitmapNoSpan = paragraph2.bitmap(textDecoration = TextDecoration.Underline)
+            val bitmapWithSpan = paragraph.bitmap()
+            // Our text rendering stack relies on the fact that given textstyle is also passed to
+            // draw
+            // functions of TextLayoutResult, MultiParagraph, Paragraph. If Underline is not
+            // specified
+            // here, it would be removed while drawing the MultiParagraph. We are simply mimicking
+            // what TextPainter does.
+            val bitmapNoSpan = paragraph2.bitmap(textDecoration = TextDecoration.Underline)
 
-        assertThat(bitmapWithSpan).isEqualToBitmap(bitmapNoSpan)
-    }
+            assertThat(bitmapWithSpan).isEqualToBitmap(bitmapNoSpan)
+        }
 
     @Test
     fun textMotionStatic_setsCorrectFlagsOnTextPaint() {
         val textMotion = TextMotion.Static
         val text = "abc"
-        val paragraph = simpleParagraph(
-            text = text,
-            style = TextStyle(textMotion = textMotion),
-            width = Float.MAX_VALUE
-        )
+        val paragraph =
+            simpleParagraph(
+                text = text,
+                style = TextStyle(textMotion = textMotion),
+                width = Float.MAX_VALUE
+            )
 
         assertThat(paragraph.textPaint.flags and TextPaint.LINEAR_TEXT_FLAG).isEqualTo(0)
         assertThat(paragraph.textPaint.flags and TextPaint.SUBPIXEL_TEXT_FLAG).isEqualTo(0)
@@ -2048,11 +2016,12 @@
     fun textMotionAnimated_setsCorrectFlagsOnTextPaint() {
         val textMotion = TextMotion.Animated
         val text = "abc"
-        val paragraph = simpleParagraph(
-            text = text,
-            style = TextStyle(textMotion = textMotion),
-            width = Float.MAX_VALUE
-        )
+        val paragraph =
+            simpleParagraph(
+                text = text,
+                style = TextStyle(textMotion = textMotion),
+                width = Float.MAX_VALUE
+            )
 
         assertThat(paragraph.textPaint.flags and TextPaint.LINEAR_TEXT_FLAG)
             .isEqualTo(TextPaint.LINEAR_TEXT_FLAG)
@@ -2077,16 +2046,10 @@
             text = text,
             spanStyles = spanStyles,
             placeholders = listOf(),
-            style = TextStyle(
-                textAlign = textAlign,
-                textIndent = textIndent
-            ).merge(style),
+            style = TextStyle(textAlign = textAlign, textIndent = textIndent).merge(style),
             maxLines = maxLines,
             ellipsis = ellipsis,
-            constraints = Constraints(
-                maxWidth = width.ceilToInt(),
-                maxHeight = height.ceilToInt()
-            ),
+            constraints = Constraints(maxWidth = width.ceilToInt(), maxHeight = height.ceilToInt()),
             density = Density(density = 1f),
             fontFamilyResolver = fontFamilyResolver
         )
diff --git a/compose/ui/ui-text/src/androidInstrumentedTest/kotlin/androidx/compose/ui/text/AndroidParagraphTextDirectionTest.kt b/compose/ui/ui-text/src/androidInstrumentedTest/kotlin/androidx/compose/ui/text/AndroidParagraphTextDirectionTest.kt
index 4356938..a76d81a 100644
--- a/compose/ui/ui-text/src/androidInstrumentedTest/kotlin/androidx/compose/ui/text/AndroidParagraphTextDirectionTest.kt
+++ b/compose/ui/ui-text/src/androidInstrumentedTest/kotlin/androidx/compose/ui/text/AndroidParagraphTextDirectionTest.kt
@@ -56,11 +56,12 @@
         Locale.setDefault(ltrLocale)
 
         assertThat(
-            resolveTextDirectionHeuristics(
-                textDirection = TextDirection.Unspecified,
-                localeList = null
+                resolveTextDirectionHeuristics(
+                    textDirection = TextDirection.Unspecified,
+                    localeList = null
+                )
             )
-        ).isEqualTo(LayoutCompat.TEXT_DIRECTION_FIRST_STRONG_LTR)
+            .isEqualTo(LayoutCompat.TEXT_DIRECTION_FIRST_STRONG_LTR)
     }
 
     @Test
@@ -68,31 +69,34 @@
         Locale.setDefault(rtlLocale)
 
         assertThat(
-            resolveTextDirectionHeuristics(
-                textDirection = TextDirection.Unspecified,
-                localeList = null
+                resolveTextDirectionHeuristics(
+                    textDirection = TextDirection.Unspecified,
+                    localeList = null
+                )
             )
-        ).isEqualTo(LayoutCompat.TEXT_DIRECTION_FIRST_STRONG_RTL)
+            .isEqualTo(LayoutCompat.TEXT_DIRECTION_FIRST_STRONG_RTL)
     }
 
     @Test
     fun resolveTextDirectionHeuristics_unspecifiedTextDirection_ltrLocaleList() {
         assertThat(
-            resolveTextDirectionHeuristics(
-                textDirection = TextDirection.Unspecified,
-                localeList = ltrLocaleList
+                resolveTextDirectionHeuristics(
+                    textDirection = TextDirection.Unspecified,
+                    localeList = ltrLocaleList
+                )
             )
-        ).isEqualTo(LayoutCompat.TEXT_DIRECTION_FIRST_STRONG_LTR)
+            .isEqualTo(LayoutCompat.TEXT_DIRECTION_FIRST_STRONG_LTR)
     }
 
     @Test
     fun resolveTextDirectionHeuristics_unspecifiedTextDirection_RtlLocaleList() {
         assertThat(
-            resolveTextDirectionHeuristics(
-                textDirection = TextDirection.Unspecified,
-                localeList = rtlLocaleList
+                resolveTextDirectionHeuristics(
+                    textDirection = TextDirection.Unspecified,
+                    localeList = rtlLocaleList
+                )
             )
-        ).isEqualTo(LayoutCompat.TEXT_DIRECTION_FIRST_STRONG_RTL)
+            .isEqualTo(LayoutCompat.TEXT_DIRECTION_FIRST_STRONG_RTL)
     }
 
     @Test
@@ -100,8 +104,12 @@
         Locale.setDefault(ltrLocale)
 
         assertThat(
-            resolveTextDirectionHeuristics(textDirection = TextDirection.Content, localeList = null)
-        ).isEqualTo(LayoutCompat.TEXT_DIRECTION_FIRST_STRONG_LTR)
+                resolveTextDirectionHeuristics(
+                    textDirection = TextDirection.Content,
+                    localeList = null
+                )
+            )
+            .isEqualTo(LayoutCompat.TEXT_DIRECTION_FIRST_STRONG_LTR)
     }
 
     @Test
@@ -109,55 +117,61 @@
         Locale.setDefault(rtlLocale)
 
         assertThat(
-            resolveTextDirectionHeuristics(textDirection = TextDirection.Content, localeList = null)
-        ).isEqualTo(LayoutCompat.TEXT_DIRECTION_FIRST_STRONG_RTL)
+                resolveTextDirectionHeuristics(
+                    textDirection = TextDirection.Content,
+                    localeList = null
+                )
+            )
+            .isEqualTo(LayoutCompat.TEXT_DIRECTION_FIRST_STRONG_RTL)
     }
 
     @Test
     fun resolveTextDirectionHeuristics_contentTextDirection_LtrLocaleList() {
         assertThat(
-            resolveTextDirectionHeuristics(
-                textDirection = TextDirection.Content,
-                localeList = ltrLocaleList
+                resolveTextDirectionHeuristics(
+                    textDirection = TextDirection.Content,
+                    localeList = ltrLocaleList
+                )
             )
-        ).isEqualTo(LayoutCompat.TEXT_DIRECTION_FIRST_STRONG_LTR)
+            .isEqualTo(LayoutCompat.TEXT_DIRECTION_FIRST_STRONG_LTR)
     }
 
     @Test
     fun resolveTextDirectionHeuristics_contentTextDirection_RtlLocaleList() {
         assertThat(
-            resolveTextDirectionHeuristics(
-                textDirection = TextDirection.Content,
-                localeList = rtlLocaleList
+                resolveTextDirectionHeuristics(
+                    textDirection = TextDirection.Content,
+                    localeList = rtlLocaleList
+                )
             )
-        ).isEqualTo(LayoutCompat.TEXT_DIRECTION_FIRST_STRONG_RTL)
+            .isEqualTo(LayoutCompat.TEXT_DIRECTION_FIRST_STRONG_RTL)
     }
 
     @Test
     fun resolveTextDirectionHeuristics_ltrTextDirection_nullLocaleList() {
         assertThat(
-            resolveTextDirectionHeuristics(textDirection = TextDirection.Ltr, localeList = null)
-        ).isEqualTo(LayoutCompat.TEXT_DIRECTION_LTR)
+                resolveTextDirectionHeuristics(textDirection = TextDirection.Ltr, localeList = null)
+            )
+            .isEqualTo(LayoutCompat.TEXT_DIRECTION_LTR)
     }
 
     @Test
     fun resolveTextDirectionHeuristics_rtlTextDirection_nullLocaleList() {
         assertThat(
-            resolveTextDirectionHeuristics(textDirection = TextDirection.Rtl, localeList = null)
-        ).isEqualTo(LayoutCompat.TEXT_DIRECTION_RTL)
+                resolveTextDirectionHeuristics(textDirection = TextDirection.Rtl, localeList = null)
+            )
+            .isEqualTo(LayoutCompat.TEXT_DIRECTION_RTL)
     }
 
     @Test
     fun resolveTextDirectionHeuristics_ContentOrLtr() {
-        assertThat(
-            resolveTextDirectionHeuristics(textDirection = TextDirection.ContentOrLtr)
-        ).isEqualTo(LayoutCompat.TEXT_DIRECTION_FIRST_STRONG_LTR)
+        assertThat(resolveTextDirectionHeuristics(textDirection = TextDirection.ContentOrLtr))
+            .isEqualTo(LayoutCompat.TEXT_DIRECTION_FIRST_STRONG_LTR)
     }
 
     @Test
     fun resolveTextDirectionHeuristics_ContentOrRtl() {
-        assertThat(
-            resolveTextDirectionHeuristics(textDirection = TextDirection.ContentOrRtl)
-        ).isEqualTo(LayoutCompat.TEXT_DIRECTION_FIRST_STRONG_RTL)
+        assertThat(resolveTextDirectionHeuristics(textDirection = TextDirection.ContentOrRtl))
+            .isEqualTo(LayoutCompat.TEXT_DIRECTION_FIRST_STRONG_RTL)
     }
 }
diff --git a/compose/ui/ui-text/src/androidInstrumentedTest/kotlin/androidx/compose/ui/text/AnnotatedStringFromHtmlTest.kt b/compose/ui/ui-text/src/androidInstrumentedTest/kotlin/androidx/compose/ui/text/AnnotatedStringFromHtmlTest.kt
index 09dd85a..1722723 100644
--- a/compose/ui/ui-text/src/androidInstrumentedTest/kotlin/androidx/compose/ui/text/AnnotatedStringFromHtmlTest.kt
+++ b/compose/ui/ui-text/src/androidInstrumentedTest/kotlin/androidx/compose/ui/text/AnnotatedStringFromHtmlTest.kt
@@ -60,8 +60,7 @@
 @RunWith(AndroidJUnit4::class)
 class AnnotatedStringFromHtmlTest {
 
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
     @Test
     // pre-N block-level elements were separated with two new lines
@@ -97,9 +96,10 @@
                 addStyle(SpanStyle(textDecoration = TextDecoration.Underline))
             }
 
-            val actual = AnnotatedString.fromHtml(
-                stringResource(androidx.compose.ui.text.test.R.string.html)
-            )
+            val actual =
+                AnnotatedString.fromHtml(
+                    stringResource(androidx.compose.ui.text.test.R.string.html)
+                )
 
             assertThat(actual.text).isEqualTo(expected.text)
             assertThat(actual.spanStyles).containsExactlyElementsIn(expected.spanStyles).inOrder()
@@ -118,14 +118,15 @@
     @Test
     fun formattedString_withStyling() {
         rule.setContent {
-            val actual = AnnotatedString.fromHtml(stringResource(
-                androidx.compose.ui.text.test.R.string.formatting,
-                "computer"
-            ))
+            val actual =
+                AnnotatedString.fromHtml(
+                    stringResource(androidx.compose.ui.text.test.R.string.formatting, "computer")
+                )
             assertThat(actual.text).isEqualTo("Hello, computer!")
-            assertThat(actual.spanStyles).containsExactly(
-                AnnotatedString.Range(SpanStyle(fontWeight = FontWeight.Bold), 7, 15)
-            )
+            assertThat(actual.spanStyles)
+                .containsExactly(
+                    AnnotatedString.Range(SpanStyle(fontWeight = FontWeight.Bold), 7, 15)
+                )
         }
     }
 
@@ -155,74 +156,81 @@
             val actual = AnnotatedString.fromHtml("<annotation key1=value1>a</annotation>")
 
             assertThat(actual.text).isEqualTo("a")
-            assertThat(actual.getStringAnnotations(0, actual.length)).containsExactly(
-                AnnotatedString.Range("value1", 0, 1, "key1")
-            )
+            assertThat(actual.getStringAnnotations(0, actual.length))
+                .containsExactly(AnnotatedString.Range("value1", 0, 1, "key1"))
         }
     }
 
     @Test
     fun annotationTag_withMultipleAttributes_multipleStringAnnotations() {
         rule.setContent {
-            val actual = AnnotatedString.fromHtml("""
+            val actual =
+                AnnotatedString.fromHtml(
+                    """
                 <annotation key1="value1" key2=value2 keyThree="valueThree">a</annotation>
-            """.trimIndent())
+            """
+                        .trimIndent()
+                )
 
             assertThat(actual.text).isEqualTo("a")
-            assertThat(actual.getStringAnnotations(0, actual.length)).containsExactly(
-                AnnotatedString.Range("value1", 0, 1, "key1"),
-                AnnotatedString.Range("value2", 0, 1, "key2"),
-                AnnotatedString.Range("valueThree", 0, 1, "keythree")
-            )
+            assertThat(actual.getStringAnnotations(0, actual.length))
+                .containsExactly(
+                    AnnotatedString.Range("value1", 0, 1, "key1"),
+                    AnnotatedString.Range("value2", 0, 1, "key2"),
+                    AnnotatedString.Range("valueThree", 0, 1, "keythree")
+                )
         }
     }
 
     @Test
     fun annotationTag_withMultipleAnnotations_multipleStringAnnotations() {
         rule.setContent {
-            val actual = AnnotatedString.fromHtml("""
+            val actual =
+                AnnotatedString.fromHtml(
+                    """
                 <annotation key1=val1>a</annotation>a<annotation key2="val2">a</annotation>
-                """.trimIndent())
+                """
+                        .trimIndent()
+                )
 
             assertThat(actual.text).isEqualTo("aaa")
-            assertThat(actual.getStringAnnotations(0, actual.length)).containsExactly(
-                AnnotatedString.Range("val1", 0, 1, "key1"),
-                AnnotatedString.Range("val2", 2, 3, "key2")
-            )
+            assertThat(actual.getStringAnnotations(0, actual.length))
+                .containsExactly(
+                    AnnotatedString.Range("val1", 0, 1, "key1"),
+                    AnnotatedString.Range("val2", 2, 3, "key2")
+                )
         }
     }
 
     @Test
     fun annotationTag_withOtherTag() {
         rule.setContent {
-            val actual = AnnotatedString.fromHtml(
-                "<annotation key1=\"value1\">a</annotation><b>a</b>"
-            )
+            val actual =
+                AnnotatedString.fromHtml("<annotation key1=\"value1\">a</annotation><b>a</b>")
 
             assertThat(actual.text).isEqualTo("aa")
-            assertThat(actual.spanStyles).containsExactly(
-                AnnotatedString.Range(SpanStyle(fontWeight = FontWeight.Bold), 1, 2),
-            )
-            assertThat(actual.getStringAnnotations(0, actual.length)).containsExactly(
-                AnnotatedString.Range("value1", 0, 1, "key1")
-            )
+            assertThat(actual.spanStyles)
+                .containsExactly(
+                    AnnotatedString.Range(SpanStyle(fontWeight = FontWeight.Bold), 1, 2),
+                )
+            assertThat(actual.getStringAnnotations(0, actual.length))
+                .containsExactly(AnnotatedString.Range("value1", 0, 1, "key1"))
         }
     }
 
     @Test
     fun annotationTag_wrappedByOtherTag() {
         rule.setContent {
-            val actual = AnnotatedString.fromHtml(
-                "<b><annotation key1=\"value1\">a</annotation></b>"
-            )
+            val actual =
+                AnnotatedString.fromHtml("<b><annotation key1=\"value1\">a</annotation></b>")
 
             assertThat(actual.text).isEqualTo("a")
-            assertThat(actual.spanStyles).containsExactly(
-                AnnotatedString.Range(SpanStyle(fontWeight = FontWeight.Bold), 0, 1)
-            )
-            assertThat(actual.getStringAnnotations(0, actual.length)).containsExactly(
-                AnnotatedString.Range("value1", 0, 1, "key1")
-            )
+            assertThat(actual.spanStyles)
+                .containsExactly(
+                    AnnotatedString.Range(SpanStyle(fontWeight = FontWeight.Bold), 0, 1)
+                )
+            assertThat(actual.getStringAnnotations(0, actual.length))
+                .containsExactly(AnnotatedString.Range("value1", 0, 1, "key1"))
         }
     }
 
@@ -230,14 +238,12 @@
         val expected = buildAnnotatedString {
             withStyle(ParagraphStyle(textAlign = TextAlign.Center)) { append("a") }
         }
-        val actual = buildSpannableString(
-            AlignmentSpan.Standard(Layout.Alignment.ALIGN_CENTER)
-        ).toAnnotatedString()
+        val actual =
+            buildSpannableString(AlignmentSpan.Standard(Layout.Alignment.ALIGN_CENTER))
+                .toAnnotatedString()
 
         assertThat(actual.text).isEqualTo(expected.text)
-        assertThat(actual.paragraphStyles).containsExactlyElementsIn(
-            expected.paragraphStyles
-        )
+        assertThat(actual.paragraphStyles).containsExactlyElementsIn(expected.paragraphStyles)
     }
 
     fun verify_backgroundColorSpan() {
@@ -360,11 +366,10 @@
         val stringWithColoredLink = "<span style=\"color:blue\"><a href=\"url\">link</a></span>"
         val annotatedString = AnnotatedString.fromHtml(stringWithColoredLink)
 
-        rule.setContent {
-            BasicText(text = annotatedString)
-        }
+        rule.setContent { BasicText(text = annotatedString) }
 
-        rule.onNode(hasClickAction(), useUnmergedTree = true)
+        rule
+            .onNode(hasClickAction(), useUnmergedTree = true)
             .captureToImage()
             .assertContainsColor(Color.Blue)
     }
@@ -373,16 +378,16 @@
     @SdkSuppress(minSdkVersion = Build.VERSION_CODES.O)
     fun link_appliesColorFromMethod() {
         val stringWithColoredLink = "<span style=\"color:blue\"><a href=\"url\">link</a></span>"
-        val annotatedString = AnnotatedString.fromHtml(
-            stringWithColoredLink,
-            TextLinkStyles(SpanStyle(color = Color.Green))
-        )
+        val annotatedString =
+            AnnotatedString.fromHtml(
+                stringWithColoredLink,
+                TextLinkStyles(SpanStyle(color = Color.Green))
+            )
 
-        rule.setContent {
-            BasicText(text = annotatedString)
-        }
+        rule.setContent { BasicText(text = annotatedString) }
 
-        rule.onNode(hasClickAction(), useUnmergedTree = true)
+        rule
+            .onNode(hasClickAction(), useUnmergedTree = true)
             .captureToImage()
             .assertContainsColor(Color.Green)
             .assertDoesNotContainColor(Color.Blue)
@@ -392,16 +397,16 @@
     @SdkSuppress(minSdkVersion = Build.VERSION_CODES.O)
     fun link_mergesDecorationFromMethod() {
         val stringWithColoredLink = "<span style=\"color:blue\"><a href=\"url\">link</a></span>"
-        val annotatedString = AnnotatedString.fromHtml(
-            stringWithColoredLink,
-            TextLinkStyles(SpanStyle(background = Color.Red))
-        )
+        val annotatedString =
+            AnnotatedString.fromHtml(
+                stringWithColoredLink,
+                TextLinkStyles(SpanStyle(background = Color.Red))
+            )
 
-        rule.setContent {
-            BasicText(text = annotatedString)
-        }
+        rule.setContent { BasicText(text = annotatedString) }
 
-        rule.onNode(hasClickAction(), useUnmergedTree = true)
+        rule
+            .onNode(hasClickAction(), useUnmergedTree = true)
             .captureToImage()
             .assertContainsColor(Color.Blue)
             .assertContainsColor(Color.Red)
@@ -411,16 +416,17 @@
     @SdkSuppress(minSdkVersion = Build.VERSION_CODES.O)
     fun linkAnnotation_constructedFromMethodArguments() {
         val stringWithLink = "<a href=\"url\">link</a>"
-        val annotatedString = AnnotatedString.fromHtml(
-            stringWithLink,
-            TextLinkStyles(
-                style = SpanStyle(color = Color.Red),
-                focusedStyle = SpanStyle(color = Color.Green),
-                hoveredStyle = SpanStyle(color = Color.Blue),
-                pressedStyle = SpanStyle(color = Color.Gray),
-            ),
-            linkInteractionListener = {}
-        )
+        val annotatedString =
+            AnnotatedString.fromHtml(
+                stringWithLink,
+                TextLinkStyles(
+                    style = SpanStyle(color = Color.Red),
+                    focusedStyle = SpanStyle(color = Color.Green),
+                    hoveredStyle = SpanStyle(color = Color.Blue),
+                    pressedStyle = SpanStyle(color = Color.Gray),
+                ),
+                linkInteractionListener = {}
+            )
 
         val link = annotatedString.getLinkAnnotations(0, 4).first().item as LinkAnnotation.Url
         assertThat(link.url).isEqualTo("url")
@@ -431,7 +437,6 @@
         assertThat(link.linkInteractionListener).isNotNull()
     }
 
-    private fun buildSpannableString(span: Any) = SpannableStringBuilder().also {
-        it.append("a", span, Spanned.SPAN_INCLUSIVE_INCLUSIVE)
-    }
+    private fun buildSpannableString(span: Any) =
+        SpannableStringBuilder().also { it.append("a", span, Spanned.SPAN_INCLUSIVE_INCLUSIVE) }
 }
diff --git a/compose/ui/ui-text/src/androidInstrumentedTest/kotlin/androidx/compose/ui/text/CacheTextLayoutInputTest.kt b/compose/ui/ui-text/src/androidInstrumentedTest/kotlin/androidx/compose/ui/text/CacheTextLayoutInputTest.kt
index 8efe719..cbd6e80 100644
--- a/compose/ui/ui-text/src/androidInstrumentedTest/kotlin/androidx/compose/ui/text/CacheTextLayoutInputTest.kt
+++ b/compose/ui/ui-text/src/androidInstrumentedTest/kotlin/androidx/compose/ui/text/CacheTextLayoutInputTest.kt
@@ -61,12 +61,28 @@
 
     @Test
     fun placeholders_should_differ() {
-        val input1 = cacheTextLayoutInput(placeholders = listOf(AnnotatedString.Range(
-            Placeholder(20.sp, 20.sp, PlaceholderVerticalAlign.AboveBaseline), 0, 1
-        )))
-        val input2 = cacheTextLayoutInput(placeholders = listOf(AnnotatedString.Range(
-            Placeholder(20.sp, 20.sp, PlaceholderVerticalAlign.AboveBaseline), 1, 2
-        )))
+        val input1 =
+            cacheTextLayoutInput(
+                placeholders =
+                    listOf(
+                        AnnotatedString.Range(
+                            Placeholder(20.sp, 20.sp, PlaceholderVerticalAlign.AboveBaseline),
+                            0,
+                            1
+                        )
+                    )
+            )
+        val input2 =
+            cacheTextLayoutInput(
+                placeholders =
+                    listOf(
+                        AnnotatedString.Range(
+                            Placeholder(20.sp, 20.sp, PlaceholderVerticalAlign.AboveBaseline),
+                            1,
+                            2
+                        )
+                    )
+            )
 
         assertThat(input1.hashCode()).isNotEqualTo(input2.hashCode())
         assertThat(input1).isNotEqualTo(input2)
@@ -165,12 +181,10 @@
 
     @Test
     fun shadow_should_not_differ() {
-        val input1 = cacheTextLayoutInput(
-            style = TextStyle(shadow = Shadow(Color.Red, Offset(10f, 10f)))
-        )
-        val input2 = cacheTextLayoutInput(
-            style = TextStyle(shadow = Shadow(Color.Red, Offset(12f, 12f)))
-        )
+        val input1 =
+            cacheTextLayoutInput(style = TextStyle(shadow = Shadow(Color.Red, Offset(10f, 10f))))
+        val input2 =
+            cacheTextLayoutInput(style = TextStyle(shadow = Shadow(Color.Red, Offset(12f, 12f))))
 
         assertThat(input1.hashCode()).isEqualTo(input2.hashCode())
         assertThat(input1).isEqualTo(input2)
@@ -178,12 +192,10 @@
 
     @Test
     fun textDecoration_should_not_differ() {
-        val input1 = cacheTextLayoutInput(
-            style = TextStyle(textDecoration = TextDecoration.Underline)
-        )
-        val input2 = cacheTextLayoutInput(
-            style = TextStyle(textDecoration = TextDecoration.LineThrough)
-        )
+        val input1 =
+            cacheTextLayoutInput(style = TextStyle(textDecoration = TextDecoration.Underline))
+        val input2 =
+            cacheTextLayoutInput(style = TextStyle(textDecoration = TextDecoration.LineThrough))
 
         assertThat(input1.hashCode()).isEqualTo(input2.hashCode())
         assertThat(input1).isEqualTo(input2)
diff --git a/compose/ui/ui-text/src/androidInstrumentedTest/kotlin/androidx/compose/ui/text/FontTestData.kt b/compose/ui/ui-text/src/androidInstrumentedTest/kotlin/androidx/compose/ui/text/FontTestData.kt
index 5e4966f..711dcd3 100644
--- a/compose/ui/ui-text/src/androidInstrumentedTest/kotlin/androidx/compose/ui/text/FontTestData.kt
+++ b/compose/ui/ui-text/src/androidInstrumentedTest/kotlin/androidx/compose/ui/text/FontTestData.kt
@@ -27,140 +27,110 @@
         // 1. The width of most of visible characters equals to font size.
         // 2. The LTR/RTL characters are rendered as ▶/◀.
         // 3. The fontMetrics passed to TextPaint has descend - ascend equal to 1.2 * fontSize.
-        val BASIC_MEASURE_FONT = Font(
-            resId = R.font.sample_font,
-            weight = FontWeight.Normal,
-            style = FontStyle.Normal
-        )
+        val BASIC_MEASURE_FONT =
+            Font(resId = R.font.sample_font, weight = FontWeight.Normal, style = FontStyle.Normal)
 
         // The kern_font provides the following features:
         // 1. Characters from A to Z are rendered as ▲ while a to z are rendered as ▼.
         // 2. When kerning is off, the width of each character is equal to font size.
         // 3. When kerning is on, it will reduce the space between two characters by 0.4 * width.
-        val BASIC_KERN_FONT = Font(
-            resId = R.font.kern_font,
-            weight = FontWeight.Normal,
-            style = FontStyle.Normal
-        )
+        val BASIC_KERN_FONT =
+            Font(resId = R.font.kern_font, weight = FontWeight.Normal, style = FontStyle.Normal)
 
-        val FONT_100_REGULAR = Font(
-            resId = R.font.test_100_regular,
-            weight = FontWeight.W100,
-            style = FontStyle.Normal
-        )
+        val FONT_100_REGULAR =
+            Font(
+                resId = R.font.test_100_regular,
+                weight = FontWeight.W100,
+                style = FontStyle.Normal
+            )
 
-        val FONT_100_ITALIC = Font(
-            resId = R.font.test_100_italic,
-            weight = FontWeight.W100,
-            style = FontStyle.Italic
-        )
+        val FONT_100_ITALIC =
+            Font(resId = R.font.test_100_italic, weight = FontWeight.W100, style = FontStyle.Italic)
 
-        val FONT_200_REGULAR = Font(
-            resId = R.font.test_200_regular,
-            weight = FontWeight.W200,
-            style = FontStyle.Normal
-        )
+        val FONT_200_REGULAR =
+            Font(
+                resId = R.font.test_200_regular,
+                weight = FontWeight.W200,
+                style = FontStyle.Normal
+            )
 
-        val FONT_200_ITALIC = Font(
-            resId = R.font.test_200_italic,
-            weight = FontWeight.W200,
-            style = FontStyle.Italic
-        )
+        val FONT_200_ITALIC =
+            Font(resId = R.font.test_200_italic, weight = FontWeight.W200, style = FontStyle.Italic)
 
-        val FONT_200_ITALIC_FALLBACK = Font(
-            resId = R.font.test_200_italic,
-            weight = FontWeight.W200,
-            style = FontStyle.Italic
-        )
+        val FONT_200_ITALIC_FALLBACK =
+            Font(resId = R.font.test_200_italic, weight = FontWeight.W200, style = FontStyle.Italic)
 
-        val FONT_300_REGULAR = Font(
-            resId = R.font.test_300_regular,
-            weight = FontWeight.W300,
-            style = FontStyle.Normal
-        )
+        val FONT_300_REGULAR =
+            Font(
+                resId = R.font.test_300_regular,
+                weight = FontWeight.W300,
+                style = FontStyle.Normal
+            )
 
-        val FONT_300_ITALIC = Font(
-            resId = R.font.test_300_italic,
-            weight = FontWeight.W300,
-            style = FontStyle.Italic
-        )
+        val FONT_300_ITALIC =
+            Font(resId = R.font.test_300_italic, weight = FontWeight.W300, style = FontStyle.Italic)
 
-        val FONT_400_REGULAR = Font(
-            resId = R.font.test_400_regular,
-            weight = FontWeight.W400,
-            style = FontStyle.Normal
-        )
+        val FONT_400_REGULAR =
+            Font(
+                resId = R.font.test_400_regular,
+                weight = FontWeight.W400,
+                style = FontStyle.Normal
+            )
 
-        val FONT_400_ITALIC = Font(
-            resId = R.font.test_400_italic,
-            weight = FontWeight.W400,
-            style = FontStyle.Italic
-        )
+        val FONT_400_ITALIC =
+            Font(resId = R.font.test_400_italic, weight = FontWeight.W400, style = FontStyle.Italic)
 
-        val FONT_500_REGULAR = Font(
-            resId = R.font.test_500_regular,
-            weight = FontWeight.W500,
-            style = FontStyle.Normal
-        )
+        val FONT_500_REGULAR =
+            Font(
+                resId = R.font.test_500_regular,
+                weight = FontWeight.W500,
+                style = FontStyle.Normal
+            )
 
-        val FONT_500_ITALIC = Font(
-            resId = R.font.test_500_italic,
-            weight = FontWeight.W500,
-            style = FontStyle.Italic
-        )
+        val FONT_500_ITALIC =
+            Font(resId = R.font.test_500_italic, weight = FontWeight.W500, style = FontStyle.Italic)
 
-        val FONT_600_REGULAR = Font(
-            resId = R.font.test_600_regular,
-            weight = FontWeight.W600,
-            style = FontStyle.Normal
-        )
+        val FONT_600_REGULAR =
+            Font(
+                resId = R.font.test_600_regular,
+                weight = FontWeight.W600,
+                style = FontStyle.Normal
+            )
 
-        val FONT_600_ITALIC = Font(
-            resId = R.font.test_600_italic,
-            weight = FontWeight.W600,
-            style = FontStyle.Italic
-        )
+        val FONT_600_ITALIC =
+            Font(resId = R.font.test_600_italic, weight = FontWeight.W600, style = FontStyle.Italic)
 
-        val FONT_700_REGULAR = Font(
-            resId = R.font.test_700_regular,
-            weight = FontWeight.W700,
-            style = FontStyle.Normal
-        )
+        val FONT_700_REGULAR =
+            Font(
+                resId = R.font.test_700_regular,
+                weight = FontWeight.W700,
+                style = FontStyle.Normal
+            )
 
-        val FONT_700_ITALIC = Font(
-            resId = R.font.test_700_italic,
-            weight = FontWeight.W700,
-            style = FontStyle.Italic
-        )
+        val FONT_700_ITALIC =
+            Font(resId = R.font.test_700_italic, weight = FontWeight.W700, style = FontStyle.Italic)
 
-        val FONT_800_REGULAR = Font(
-            resId = R.font.test_800_regular,
-            weight = FontWeight.W800,
-            style = FontStyle.Normal
-        )
+        val FONT_800_REGULAR =
+            Font(
+                resId = R.font.test_800_regular,
+                weight = FontWeight.W800,
+                style = FontStyle.Normal
+            )
 
-        val FONT_800_ITALIC = Font(
-            resId = R.font.test_800_italic,
-            weight = FontWeight.W800,
-            style = FontStyle.Italic
-        )
+        val FONT_800_ITALIC =
+            Font(resId = R.font.test_800_italic, weight = FontWeight.W800, style = FontStyle.Italic)
 
-        val FONT_900_REGULAR = Font(
-            resId = R.font.test_900_regular,
-            weight = FontWeight.W900,
-            style = FontStyle.Normal
-        )
+        val FONT_900_REGULAR =
+            Font(
+                resId = R.font.test_900_regular,
+                weight = FontWeight.W900,
+                style = FontStyle.Normal
+            )
 
-        val FONT_900_ITALIC = Font(
-            resId = R.font.test_900_italic,
-            weight = FontWeight.W900,
-            style = FontStyle.Italic
-        )
+        val FONT_900_ITALIC =
+            Font(resId = R.font.test_900_italic, weight = FontWeight.W900, style = FontStyle.Italic)
 
-        val FONT_INVALID = Font(
-            resId = R.font.invalid_font,
-            weight = FontWeight.W900,
-            style = FontStyle.Italic
-        )
+        val FONT_INVALID =
+            Font(resId = R.font.invalid_font, weight = FontWeight.W900, style = FontStyle.Italic)
     }
 }
diff --git a/compose/ui/ui-text/src/androidInstrumentedTest/kotlin/androidx/compose/ui/text/MultiParagraphFillBoundingBoxesTest.kt b/compose/ui/ui-text/src/androidInstrumentedTest/kotlin/androidx/compose/ui/text/MultiParagraphFillBoundingBoxesTest.kt
index 8e10bd4..39311f4 100644
--- a/compose/ui/ui-text/src/androidInstrumentedTest/kotlin/androidx/compose/ui/text/MultiParagraphFillBoundingBoxesTest.kt
+++ b/compose/ui/ui-text/src/androidInstrumentedTest/kotlin/androidx/compose/ui/text/MultiParagraphFillBoundingBoxesTest.kt
@@ -33,9 +33,8 @@
 @SmallTest
 class MultiParagraphFillBoundingBoxesTest {
     private val fontFamilyMeasureFont = BASIC_MEASURE_FONT.toFontFamily()
-    val fontFamilyResolver = createFontFamilyResolver(
-        InstrumentationRegistry.getInstrumentation().context
-    )
+    val fontFamilyResolver =
+        createFontFamilyResolver(InstrumentationRegistry.getInstrumentation().context)
     private val defaultDensity = Density(density = 1f)
     private val fontSize = 10.sp
     private val fontSizeInPx = with(defaultDensity) { fontSize.toPx() }
@@ -47,9 +46,7 @@
 
         val result = paragraph.getBoundingBoxes(TextRange(0, text.length))
 
-        assertThat(result).isEqualToWithTolerance(
-            ltrCharacterBoundariesForTestFont(text.text)
-        )
+        assertThat(result).isEqualToWithTolerance(ltrCharacterBoundariesForTestFont(text.text))
     }
 
     @Test
@@ -60,9 +57,8 @@
 
         val result = paragraph.getBoundingBoxes(TextRange(0, text.length))
 
-        assertThat(result).isEqualToWithTolerance(
-            rtlCharacterBoundariesForTestFont(text.text, width)
-        )
+        assertThat(result)
+            .isEqualToWithTolerance(rtlCharacterBoundariesForTestFont(text.text, width))
     }
 
     @Test
@@ -76,9 +72,8 @@
 
         val paragraph1Rects = ltrCharacterBoundariesForTestFont(paragraph1)
         val paragraph2Rects = ltrCharacterBoundariesForTestFont(paragraph2)
-        assertThat(result).isEqualToWithTolerance(
-            paragraph1Rects.offsetVerticalAndAppend(paragraph2Rects)
-        )
+        assertThat(result)
+            .isEqualToWithTolerance(paragraph1Rects.offsetVerticalAndAppend(paragraph2Rects))
     }
 
     @Test
@@ -93,9 +88,8 @@
 
         val paragraph1Rects = rtlCharacterBoundariesForTestFont(paragraph1, width)
         val paragraph2Rects = rtlCharacterBoundariesForTestFont(paragraph2, width)
-        assertThat(result).isEqualToWithTolerance(
-            paragraph1Rects.offsetVerticalAndAppend(paragraph2Rects)
-        )
+        assertThat(result)
+            .isEqualToWithTolerance(paragraph1Rects.offsetVerticalAndAppend(paragraph2Rects))
     }
 
     @Test
@@ -109,9 +103,8 @@
 
         val paragraph1Rects = ltrCharacterBoundariesForTestFont(paragraph1)
         val paragraph2Rects = ltrCharacterBoundariesForTestFont(paragraph2)
-        assertThat(result).isEqualToWithTolerance(
-            paragraph1Rects.offsetVerticalAndAppend(paragraph2Rects)
-        )
+        assertThat(result)
+            .isEqualToWithTolerance(paragraph1Rects.offsetVerticalAndAppend(paragraph2Rects))
     }
 
     @Test
@@ -126,9 +119,8 @@
 
         val paragraph1Rects = rtlCharacterBoundariesForTestFont(paragraph1, width)
         val paragraph2Rects = rtlCharacterBoundariesForTestFont(paragraph2, width)
-        assertThat(result).isEqualToWithTolerance(
-            paragraph1Rects.offsetVerticalAndAppend(paragraph2Rects)
-        )
+        assertThat(result)
+            .isEqualToWithTolerance(paragraph1Rects.offsetVerticalAndAppend(paragraph2Rects))
     }
 
     @Test
@@ -143,9 +135,7 @@
 
         val paragraph1Rects = ltrCharacterBoundariesForTestFont(paragraph1)
         val paragraph2Rects = rtlCharacterBoundariesForTestFont(paragraph2, width)
-        assertThat(result).isEqualTo(
-            paragraph1Rects.offsetVerticalAndAppend(paragraph2Rects)
-        )
+        assertThat(result).isEqualTo(paragraph1Rects.offsetVerticalAndAppend(paragraph2Rects))
     }
 
     private fun MultiParagraph.getBoundingBoxes(range: TextRange): Array<Rect> {
@@ -163,13 +153,10 @@
         return this + other.offsetVerticalBy(this.last().bottom)
     }
 
-    /**
-     * Offsets top and bottom positions of rectangles in this array with [value].
-     */
+    /** Offsets top and bottom positions of rectangles in this array with [value]. */
     private fun Array<Rect>.offsetVerticalBy(value: Float): Array<Rect> {
-        return this.map {
-            Rect(it.left, it.top + value, it.right, it.bottom + value)
-        }.toTypedArray()
+        return this.map { Rect(it.left, it.top + value, it.right, it.bottom + value) }
+            .toTypedArray()
     }
 
     private fun ltrCharacterBoundariesForTestFont(text: String): Array<Rect> =
@@ -197,10 +184,7 @@
     ): MultiParagraph {
         return MultiParagraph(
             annotatedString = text,
-            style = TextStyle(
-                fontFamily = fontFamilyMeasureFont,
-                fontSize = fontSize
-            ),
+            style = TextStyle(fontFamily = fontFamilyMeasureFont, fontSize = fontSize),
             constraints = Constraints(maxWidth = width.ceilToInt()),
             density = defaultDensity,
             fontFamilyResolver = fontFamilyResolver
diff --git a/compose/ui/ui-text/src/androidInstrumentedTest/kotlin/androidx/compose/ui/text/MultiParagraphGetRangeForRectTest.kt b/compose/ui/ui-text/src/androidInstrumentedTest/kotlin/androidx/compose/ui/text/MultiParagraphGetRangeForRectTest.kt
index 9681bf8..6b6835d 100644
--- a/compose/ui/ui-text/src/androidInstrumentedTest/kotlin/androidx/compose/ui/text/MultiParagraphGetRangeForRectTest.kt
+++ b/compose/ui/ui-text/src/androidInstrumentedTest/kotlin/androidx/compose/ui/text/MultiParagraphGetRangeForRectTest.kt
@@ -41,6 +41,7 @@
     private val basicFontFamily = FontTestData.BASIC_MEASURE_FONT.toFontFamily()
     private val defaultDensity = Density(density = 1f)
     private val context = InstrumentationRegistry.getInstrumentation().context
+
     @Test
     fun getRangeForRect_characterGranularity_rectCoversAllParagraphs() {
         val fontSize = 10f
@@ -50,10 +51,7 @@
         //   abc
         //   def
         //   ghi
-        val paragraph = simpleMultiParagraph(
-            text = text,
-            style = TextStyle(fontSize = fontSize.sp)
-        )
+        val paragraph = simpleMultiParagraph(text = text, style = TextStyle(fontSize = fontSize.sp))
 
         // Precondition check: there 3 lines each corresponding to a paragraph
         assertThat(paragraph.lineCount).isEqualTo(3)
@@ -65,11 +63,12 @@
         // The rect covers character 'b' and 'h'.
         val rect = Rect(left, top, right, bottom)
 
-        val range = paragraph.getRangeForRect(
-            rect,
-            TextGranularity.Character,
-            TextInclusionStrategy.ContainsCenter
-        )
+        val range =
+            paragraph.getRangeForRect(
+                rect,
+                TextGranularity.Character,
+                TextInclusionStrategy.ContainsCenter
+            )
         assertThat(range).isEqualTo(text.rangeOf('b', 'h'))
     }
 
@@ -81,10 +80,7 @@
         // This paragraph is rendered as:
         //   abc
         //   def
-        val paragraph = simpleMultiParagraph(
-            text = text,
-            style = TextStyle(fontSize = fontSize.sp)
-        )
+        val paragraph = simpleMultiParagraph(text = text, style = TextStyle(fontSize = fontSize.sp))
 
         // Precondition check: there 2 lines each corresponding to a paragraph
         assertThat(paragraph.lineCount).isEqualTo(2)
@@ -96,11 +92,12 @@
         // This rectangle doesn't cover any character's center point, return null.
         val rect = Rect(left, top, right, bottom)
 
-        val range = paragraph.getRangeForRect(
-            rect,
-            TextGranularity.Character,
-            TextInclusionStrategy.ContainsCenter
-        )
+        val range =
+            paragraph.getRangeForRect(
+                rect,
+                TextGranularity.Character,
+                TextInclusionStrategy.ContainsCenter
+            )
         assertThat(range).isEqualTo(TextRange.Zero)
     }
 
@@ -110,11 +107,12 @@
         val text = createAnnotatedString("abcd", "efg")
         val charPerLine = 3
 
-        val paragraph = simpleMultiParagraph(
-            text = text,
-            style = TextStyle(fontSize = fontSize.sp),
-            width = charPerLine * fontSize
-        )
+        val paragraph =
+            simpleMultiParagraph(
+                text = text,
+                style = TextStyle(fontSize = fontSize.sp),
+                width = charPerLine * fontSize
+            )
 
         // The input text is rendered as following:
         //   abc
@@ -132,11 +130,12 @@
         // And it covers character 'f' in the second paragraph, the result is [5, 6).
         val rect = Rect(left, top, right, bottom)
 
-        val range = paragraph.getRangeForRect(
-            rect,
-            TextGranularity.Character,
-            TextInclusionStrategy.ContainsCenter
-        )
+        val range =
+            paragraph.getRangeForRect(
+                rect,
+                TextGranularity.Character,
+                TextInclusionStrategy.ContainsCenter
+            )
         assertThat(range).isEqualTo(text.rangeOf('f'))
     }
 
@@ -145,10 +144,7 @@
         val fontSize = 10f
         val text = createAnnotatedString("ab cd", "ef", "gh ij")
 
-        val paragraph = simpleMultiParagraph(
-            text = text,
-            style = TextStyle(fontSize = fontSize.sp)
-        )
+        val paragraph = simpleMultiParagraph(text = text, style = TextStyle(fontSize = fontSize.sp))
 
         // The input text is rendered as following:
         //   ab cd
@@ -164,11 +160,12 @@
         // The rect covers character 'cd' and 'ij'.
         val rect = Rect(left, top, right, bottom)
 
-        val range = paragraph.getRangeForRect(
-            rect,
-            TextGranularity.Word,
-            TextInclusionStrategy.ContainsCenter
-        )
+        val range =
+            paragraph.getRangeForRect(
+                rect,
+                TextGranularity.Word,
+                TextInclusionStrategy.ContainsCenter
+            )
         assertThat(range).isEqualTo(text.rangeOf('c', 'j'))
     }
 
@@ -177,10 +174,7 @@
         val fontSize = 10f
         val text = createAnnotatedString("ab cd", "ef gh", "ij kl")
 
-        val paragraph = simpleMultiParagraph(
-            text = text,
-            style = TextStyle(fontSize = fontSize.sp)
-        )
+        val paragraph = simpleMultiParagraph(text = text, style = TextStyle(fontSize = fontSize.sp))
 
         // The input text is rendered as following:
         //   ab cd
@@ -196,14 +190,16 @@
         // The rect covers only the spaces. It should return null.
         val rect = Rect(left, top, right, bottom)
 
-        val range = paragraph.getRangeForRect(
-            rect,
-            TextGranularity.Word,
-            TextInclusionStrategy.ContainsCenter
-        )
+        val range =
+            paragraph.getRangeForRect(
+                rect,
+                TextGranularity.Word,
+                TextInclusionStrategy.ContainsCenter
+            )
 
         assertThat(range).isEqualTo(TextRange.Zero)
     }
+
     private fun simpleMultiParagraph(
         text: AnnotatedString,
         style: TextStyle? = null,
@@ -214,11 +210,13 @@
     ): MultiParagraph {
         return MultiParagraph(
             annotatedString = text,
-            style = TextStyle(
-                fontFamily = basicFontFamily,
-                fontSize = fontSize,
-                localeList = localeList
-            ).merge(style),
+            style =
+                TextStyle(
+                        fontFamily = basicFontFamily,
+                        fontSize = fontSize,
+                        localeList = localeList
+                    )
+                    .merge(style),
             maxLines = maxLines,
             constraints = Constraints(maxWidth = width.ceilToInt()),
             density = defaultDensity,
diff --git a/compose/ui/ui-text/src/androidInstrumentedTest/kotlin/androidx/compose/ui/text/MultiParagraphIntegrationTest.kt b/compose/ui/ui-text/src/androidInstrumentedTest/kotlin/androidx/compose/ui/text/MultiParagraphIntegrationTest.kt
index 6d0a09c..1490cd4 100644
--- a/compose/ui/ui-text/src/androidInstrumentedTest/kotlin/androidx/compose/ui/text/MultiParagraphIntegrationTest.kt
+++ b/compose/ui/ui-text/src/androidInstrumentedTest/kotlin/androidx/compose/ui/text/MultiParagraphIntegrationTest.kt
@@ -68,22 +68,18 @@
         val text = createAnnotatedString("a\nb", "c")
         // maxLines be 1 or 2, smaller than the line count 3
         for (i in 1..2) {
-            val paragraph = simpleMultiParagraph(
-                text = text,
-                maxLines = i
-            )
+            val paragraph = simpleMultiParagraph(text = text, maxLines = i)
             assertWithMessage("text has 3 lines, maxLines = $i")
-                .that(paragraph.didExceedMaxLines).isTrue()
+                .that(paragraph.didExceedMaxLines)
+                .isTrue()
         }
 
         // maxLines be 3, 4, 5 larger than the line count 3
         for (i in 3..5) {
-            val paragraph = simpleMultiParagraph(
-                text = text,
-                maxLines = i
-            )
+            val paragraph = simpleMultiParagraph(text = text, maxLines = i)
             assertWithMessage("text has 3 lines, maxLines = $i")
-                .that(paragraph.didExceedMaxLines).isFalse()
+                .that(paragraph.didExceedMaxLines)
+                .isFalse()
         }
     }
 
@@ -100,24 +96,23 @@
             val text = createAnnotatedString("ab", "c")
 
             for (i in 1..2) {
-                val paragraph = simpleMultiParagraph(
-                    text = text,
-                    fontSize = fontSize,
-                    maxLines = i,
-                    width = width
-                )
+                val paragraph =
+                    simpleMultiParagraph(
+                        text = text,
+                        fontSize = fontSize,
+                        maxLines = i,
+                        width = width
+                    )
                 assertWithMessage("text has 3 lines, maxLines = $i")
-                    .that(paragraph.didExceedMaxLines).isTrue()
+                    .that(paragraph.didExceedMaxLines)
+                    .isTrue()
             }
 
             for (i in 3..5) {
-                val paragraph = simpleMultiParagraph(
-                    text = text,
-                    fontSize = fontSize,
-                    maxLines = i
-                )
+                val paragraph = simpleMultiParagraph(text = text, fontSize = fontSize, maxLines = i)
                 assertWithMessage("text has 3 lines, maxLines = $i")
-                    .that(paragraph.didExceedMaxLines).isFalse()
+                    .that(paragraph.didExceedMaxLines)
+                    .isFalse()
             }
         }
     }
@@ -152,27 +147,18 @@
             val text = createAnnotatedString("ab", "c", "de")
             val fontSize = 20.sp
             val fontSizeInPx = fontSize.toPx()
-            val paragraph = simpleMultiParagraph(
-                text = text,
-                fontSize = fontSize
-            )
+            val paragraph = simpleMultiParagraph(text = text, fontSize = fontSize)
 
             // Select "bcd"
             val actualPath = paragraph.getPathForRange(1, 4)
 
             val expectedPath = Path()
             // path covering "b"
-            expectedPath.addRect(
-                Rect(fontSizeInPx, 0f, fontSizeInPx * 2, fontSizeInPx)
-            )
+            expectedPath.addRect(Rect(fontSizeInPx, 0f, fontSizeInPx * 2, fontSizeInPx))
             // path covering "c"
-            expectedPath.addRect(
-                Rect(0f, fontSizeInPx, fontSizeInPx, fontSizeInPx * 2)
-            )
+            expectedPath.addRect(Rect(0f, fontSizeInPx, fontSizeInPx, fontSizeInPx * 2))
             // path covering "d"
-            expectedPath.addRect(
-                Rect(0f, fontSizeInPx * 2, fontSizeInPx, fontSizeInPx * 3)
-            )
+            expectedPath.addRect(Rect(0f, fontSizeInPx * 2, fontSizeInPx, fontSizeInPx * 3))
 
             val diff = Path.combine(PathOperation.Difference, expectedPath, actualPath).getBounds()
             assertThat(diff).isEqualTo(Rect.Zero)
@@ -220,11 +206,8 @@
             // each line contains 2 character
             val width = 2 * fontSizeInPx
 
-            val paragraph = simpleMultiParagraph(
-                text = text,
-                fontSize = fontSize,
-                width = width.toFloat()
-            )
+            val paragraph =
+                simpleMultiParagraph(text = text, fontSize = fontSize, width = width.toFloat())
             // The text should be rendered as:
             //     aa
             //     aa
@@ -235,149 +218,143 @@
                 val col = i % lineLength
                 val x = fontSizeInPx * col
 
-                val actualOffset = paragraph.getOffsetForPosition(
-                    Offset(x.toFloat(), y.toFloat())
-                )
+                val actualOffset = paragraph.getOffsetForPosition(Offset(x.toFloat(), y.toFloat()))
                 assertWithMessage("getOffsetForPosition($x, $y) failed")
-                    .that(actualOffset).isEqualTo(i)
+                    .that(actualOffset)
+                    .isEqualTo(i)
             }
         }
     }
 
     @Test
-    fun getOffsetForPosition_emptyLine() = with(defaultDensity) {
-        val lineLength = 2
-        val text = createAnnotatedString(mutableListOf("a".repeat(lineLength), ""))
+    fun getOffsetForPosition_emptyLine() =
+        with(defaultDensity) {
+            val lineLength = 2
+            val text = createAnnotatedString(mutableListOf("a".repeat(lineLength), ""))
 
-        val fontSize = 50.sp
-        val fontSizeInPx = fontSize.roundToPx()
-        // each line contains max 2 character
-        val width = lineLength * fontSizeInPx
+            val fontSize = 50.sp
+            val fontSizeInPx = fontSize.roundToPx()
+            // each line contains max 2 character
+            val width = lineLength * fontSizeInPx
 
-        val paragraph = simpleMultiParagraph(
-            text = text,
-            fontSize = fontSize,
-            width = width.toFloat()
-        )
+            val paragraph =
+                simpleMultiParagraph(text = text, fontSize = fontSize, width = width.toFloat())
 
-        // The text should be rendered as:
-        //     aa
-        //     <blank line>
+            // The text should be rendered as:
+            //     aa
+            //     <blank line>
 
-        val position = Offset(
-            x = (lineLength * fontSizeInPx) / 2f, // center of lines horizontally
-            y = fontSizeInPx * 1.5f // center of second line vertically
-        )
+            val position =
+                Offset(
+                    x = (lineLength * fontSizeInPx) / 2f, // center of lines horizontally
+                    y = fontSizeInPx * 1.5f // center of second line vertically
+                )
 
-        assertThat(paragraph.getOffsetForPosition(position)).isEqualTo(2)
-    }
+            assertThat(paragraph.getOffsetForPosition(position)).isEqualTo(2)
+        }
 
     @Test
-    fun getOffsetForPosition_emptyLines() = with(defaultDensity) {
-        val lineLength = 2
-        val text = createAnnotatedString(mutableListOf("a".repeat(lineLength), "", ""))
+    fun getOffsetForPosition_emptyLines() =
+        with(defaultDensity) {
+            val lineLength = 2
+            val text = createAnnotatedString(mutableListOf("a".repeat(lineLength), "", ""))
 
-        val fontSize = 50.sp
-        val fontSizeInPx = fontSize.roundToPx()
-        val width = lineLength * fontSizeInPx
+            val fontSize = 50.sp
+            val fontSizeInPx = fontSize.roundToPx()
+            val width = lineLength * fontSizeInPx
 
-        val paragraph = simpleMultiParagraph(
-            text = text,
-            fontSize = fontSize,
-            width = width.toFloat()
-        )
+            val paragraph =
+                simpleMultiParagraph(text = text, fontSize = fontSize, width = width.toFloat())
 
-        // The text should be rendered as:
-        //     aa
-        //     <blank line>
-        //     <blank line>
+            // The text should be rendered as:
+            //     aa
+            //     <blank line>
+            //     <blank line>
 
-        val position = Offset(
-            x = (lineLength * fontSizeInPx) / 2f, // center of lines horizontally
-            y = fontSizeInPx * 1.5f // center of second line vertically
-        )
+            val position =
+                Offset(
+                    x = (lineLength * fontSizeInPx) / 2f, // center of lines horizontally
+                    y = fontSizeInPx * 1.5f // center of second line vertically
+                )
 
-        assertThat(paragraph.getOffsetForPosition(position)).isEqualTo(2)
-    }
+            assertThat(paragraph.getOffsetForPosition(position)).isEqualTo(2)
+        }
 
     @Test
-    fun getLineForVerticalPosition() = with(defaultDensity) {
-        val lineLength = 4
-        val text = createAnnotatedString(List(2) { "a".repeat(lineLength) })
+    fun getLineForVerticalPosition() =
+        with(defaultDensity) {
+            val lineLength = 4
+            val text = createAnnotatedString(List(2) { "a".repeat(lineLength) })
 
-        val fontSize = 50.sp
-        val fontSizeInPx = fontSize.roundToPx()
-        val width = lineLength * fontSizeInPx
+            val fontSize = 50.sp
+            val fontSizeInPx = fontSize.roundToPx()
+            val width = lineLength * fontSizeInPx
 
-        val paragraph = simpleMultiParagraph(
-            text = text,
-            fontSize = fontSize,
-            width = width.toFloat()
-        )
+            val paragraph =
+                simpleMultiParagraph(text = text, fontSize = fontSize, width = width.toFloat())
 
-        // The text should be rendered as:
-        //     aaaa
-        //     aaaa
+            // The text should be rendered as:
+            //     aaaa
+            //     aaaa
 
-        val lineHeight = fontSizeInPx.toFloat()
-        generateSequence(-0.5f) { it + 0.5f }
-            .takeWhile { it <= 3f }
-            .forEach {
-                val expected = it.toInt().coerceIn(0..1)
-                val actual = paragraph.getLineForVerticalPosition(lineHeight * it)
-                assertWithMessage("paragraph.getLineForVerticalPosition(lineHeight * $it) failed")
-                    .that(actual).isEqualTo(expected)
-            }
-    }
+            val lineHeight = fontSizeInPx.toFloat()
+            generateSequence(-0.5f) { it + 0.5f }
+                .takeWhile { it <= 3f }
+                .forEach {
+                    val expected = it.toInt().coerceIn(0..1)
+                    val actual = paragraph.getLineForVerticalPosition(lineHeight * it)
+                    assertWithMessage(
+                            "paragraph.getLineForVerticalPosition(lineHeight * $it) failed"
+                        )
+                        .that(actual)
+                        .isEqualTo(expected)
+                }
+        }
 
     @Test
-    fun getLineForVerticalPosition_emptyLine() = with(defaultDensity) {
-        val lineLength = 4
-        val text = createAnnotatedString(mutableListOf("a".repeat(lineLength), ""))
+    fun getLineForVerticalPosition_emptyLine() =
+        with(defaultDensity) {
+            val lineLength = 4
+            val text = createAnnotatedString(mutableListOf("a".repeat(lineLength), ""))
 
-        val fontSize = 50.sp
-        val fontSizeInPx = fontSize.roundToPx()
-        val width = lineLength * fontSizeInPx
+            val fontSize = 50.sp
+            val fontSizeInPx = fontSize.roundToPx()
+            val width = lineLength * fontSizeInPx
 
-        val paragraph = simpleMultiParagraph(
-            text = text,
-            fontSize = fontSize,
-            width = width.toFloat()
-        )
+            val paragraph =
+                simpleMultiParagraph(text = text, fontSize = fontSize, width = width.toFloat())
 
-        // The text should be rendered as:
-        //     aaaa
-        //     <blank line>
+            // The text should be rendered as:
+            //     aaaa
+            //     <blank line>
 
-        val y = fontSizeInPx * 1.5f // center of second line vertically
-        val actual = paragraph.getLineForVerticalPosition(y)
-        assertThat(actual).isEqualTo(1)
-    }
+            val y = fontSizeInPx * 1.5f // center of second line vertically
+            val actual = paragraph.getLineForVerticalPosition(y)
+            assertThat(actual).isEqualTo(1)
+        }
 
     @Test
-    fun getLineForVerticalPosition_emptyLines() = with(defaultDensity) {
-        val lineLength = 4
-        val text = createAnnotatedString(mutableListOf("a".repeat(lineLength), "", ""))
+    fun getLineForVerticalPosition_emptyLines() =
+        with(defaultDensity) {
+            val lineLength = 4
+            val text = createAnnotatedString(mutableListOf("a".repeat(lineLength), "", ""))
 
-        val fontSize = 50.sp
-        val fontSizeInPx = fontSize.roundToPx()
-        val width = lineLength * fontSizeInPx
+            val fontSize = 50.sp
+            val fontSizeInPx = fontSize.roundToPx()
+            val width = lineLength * fontSizeInPx
 
-        val paragraph = simpleMultiParagraph(
-            text = text,
-            fontSize = fontSize,
-            width = width.toFloat()
-        )
+            val paragraph =
+                simpleMultiParagraph(text = text, fontSize = fontSize, width = width.toFloat())
 
-        // The text should be rendered as:
-        //     aaaa
-        //     <blank line>
-        //     <blank line>
+            // The text should be rendered as:
+            //     aaaa
+            //     <blank line>
+            //     <blank line>
 
-        val y = fontSizeInPx * 1.5f // center of second line vertically
-        val actual = paragraph.getLineForVerticalPosition(y)
-        assertThat(actual).isEqualTo(1)
-    }
+            val y = fontSizeInPx * 1.5f // center of second line vertically
+            val actual = paragraph.getLineForVerticalPosition(y)
+            assertThat(actual).isEqualTo(1)
+        }
 
     @Test
     fun getBoundingBox() {
@@ -387,11 +364,12 @@
 
             val fontSize = 50.sp
             val fontSizeInPx = fontSize.toPx()
-            val paragraph = simpleMultiParagraph(
-                text = text,
-                fontSize = fontSize,
-                width = text.length * fontSizeInPx
-            )
+            val paragraph =
+                simpleMultiParagraph(
+                    text = text,
+                    fontSize = fontSize,
+                    width = text.length * fontSizeInPx
+                )
             // The text should be rendered as:
             //     aa
             //     aa
@@ -400,16 +378,18 @@
                 val row = i / lineLength
                 val col = i % lineLength
 
-                val expectedBox = Rect(
-                    left = col * fontSizeInPx,
-                    right = (col + 1) * fontSizeInPx,
-                    top = row * fontSizeInPx,
-                    bottom = (row + 1) * fontSizeInPx
-                )
+                val expectedBox =
+                    Rect(
+                        left = col * fontSizeInPx,
+                        right = (col + 1) * fontSizeInPx,
+                        top = row * fontSizeInPx,
+                        bottom = (row + 1) * fontSizeInPx
+                    )
                 val actualBox = paragraph.getBoundingBox(i)
 
                 assertWithMessage("getBoundingBox($i) failed")
-                    .that(actualBox).isEqualTo(expectedBox)
+                    .that(actualBox)
+                    .isEqualTo(expectedBox)
             }
         }
     }
@@ -438,23 +418,22 @@
 
             val fontSize = 50.sp
             val fontSizeInPx = fontSize.toPx()
-            val paragraph = simpleMultiParagraph(
-                text = text,
-                fontSize = fontSize
-            )
+            val paragraph = simpleMultiParagraph(text = text, fontSize = fontSize)
 
             for (i in 0 until text.length) {
                 val col = i % lineLength
                 val expectPos = fontSizeInPx * col
                 val actualPos = paragraph.getHorizontalPosition(i, true)
                 assertWithMessage("getHorizontalPosition($i) failed")
-                    .that(actualPos).isEqualTo(expectPos)
+                    .that(actualPos)
+                    .isEqualTo(expectPos)
             }
 
             val expectPos = fontSizeInPx * lineLength
             val actualPos = paragraph.getHorizontalPosition(text.length, true)
             assertWithMessage("getHorizontalPosition(${text.length}) failed")
-                .that(actualPos).isEqualTo(expectPos)
+                .that(actualPos)
+                .isEqualTo(expectPos)
         }
     }
 
@@ -488,13 +467,11 @@
     @Test
     fun getParagraphDirection_textDirection_Content_withLtrLocale() {
         val text = createAnnotatedString("a", "\u05D0", " ")
-        val paragraph = simpleMultiParagraph(
-            text = text,
-            style = TextStyle(
-                textDirection = TextDirection.Content,
-                localeList = ltrLocaleList
+        val paragraph =
+            simpleMultiParagraph(
+                text = text,
+                style = TextStyle(textDirection = TextDirection.Content, localeList = ltrLocaleList)
             )
-        )
         assertThat(paragraph.getParagraphDirection(0)).isEqualTo(ResolvedTextDirection.Ltr)
         assertThat(paragraph.getParagraphDirection(1)).isEqualTo(ResolvedTextDirection.Rtl)
         assertThat(paragraph.getParagraphDirection(2)).isEqualTo(ResolvedTextDirection.Ltr)
@@ -504,13 +481,11 @@
     @Test
     fun getParagraphDirection_textDirection_Content_withRtlLocale() {
         val text = createAnnotatedString("a", "\u05D0", " ")
-        val paragraph = simpleMultiParagraph(
-            text = text,
-            style = TextStyle(
-                textDirection = TextDirection.Content,
-                localeList = rtlLocaleList
+        val paragraph =
+            simpleMultiParagraph(
+                text = text,
+                style = TextStyle(textDirection = TextDirection.Content, localeList = rtlLocaleList)
             )
-        )
         assertThat(paragraph.getParagraphDirection(0)).isEqualTo(ResolvedTextDirection.Ltr)
         assertThat(paragraph.getParagraphDirection(1)).isEqualTo(ResolvedTextDirection.Rtl)
         assertThat(paragraph.getParagraphDirection(2)).isEqualTo(ResolvedTextDirection.Rtl)
@@ -520,32 +495,26 @@
     @Test
     fun getParagraphDirection_textDirection_ForceLtr() {
         val text = createAnnotatedString("a", "\u05D0", " ")
-        val paragraph = simpleMultiParagraph(
-            text = text,
-            style = TextStyle(
-                textDirection = TextDirection.Ltr
-            )
-        )
+        val paragraph =
+            simpleMultiParagraph(text = text, style = TextStyle(textDirection = TextDirection.Ltr))
 
         for (i in 0..text.length) {
             assertWithMessage("getParagraphDirection($i) failed")
-                .that(paragraph.getParagraphDirection(i)).isEqualTo(ResolvedTextDirection.Ltr)
+                .that(paragraph.getParagraphDirection(i))
+                .isEqualTo(ResolvedTextDirection.Ltr)
         }
     }
 
     @Test
     fun getParagraphDirection_textDirection_ForceRtl() {
         val text = createAnnotatedString("a", "\u05D0", " ")
-        val paragraph = simpleMultiParagraph(
-            text = text,
-            style = TextStyle(
-                textDirection = TextDirection.Rtl
-            )
-        )
+        val paragraph =
+            simpleMultiParagraph(text = text, style = TextStyle(textDirection = TextDirection.Rtl))
 
         for (i in 0..text.length) {
             assertWithMessage("getParagraphDirection($i) failed")
-                .that(paragraph.getParagraphDirection(i)).isEqualTo(ResolvedTextDirection.Rtl)
+                .that(paragraph.getParagraphDirection(i))
+                .isEqualTo(ResolvedTextDirection.Rtl)
         }
     }
 
@@ -600,36 +569,16 @@
 
         val textString = text.text
         assertThat(paragraph.getWordBoundary(textString.indexOf('a')))
-            .isEqualTo(
-                TextRange(
-                    textString.indexOf('a'),
-                    textString.indexOf('b') + 1
-                )
-            )
+            .isEqualTo(TextRange(textString.indexOf('a'), textString.indexOf('b') + 1))
 
         assertThat(paragraph.getWordBoundary(textString.indexOf('d')))
-            .isEqualTo(
-                TextRange(
-                    textString.indexOf('c'),
-                    textString.indexOf('d') + 1
-                )
-            )
+            .isEqualTo(TextRange(textString.indexOf('c'), textString.indexOf('d') + 1))
 
         assertThat(paragraph.getWordBoundary(textString.indexOf('e')))
-            .isEqualTo(
-                TextRange(
-                    textString.indexOf('e'),
-                    textString.indexOf('e') + 1
-                )
-            )
+            .isEqualTo(TextRange(textString.indexOf('e'), textString.indexOf('e') + 1))
 
         assertThat(paragraph.getWordBoundary(textString.indexOf('f')))
-            .isEqualTo(
-                TextRange(
-                    textString.indexOf('f'),
-                    textString.indexOf('f') + 1
-                )
-            )
+            .isEqualTo(TextRange(textString.indexOf('f'), textString.indexOf('f') + 1))
     }
 
     @Test(expected = java.lang.IllegalArgumentException::class)
@@ -659,11 +608,7 @@
             val fontSize = 10.sp
             val fontSizeInPx = fontSize.toPx()
             val width = 2 * fontSizeInPx
-            val paragraph = simpleMultiParagraph(
-                text = text,
-                fontSize = fontSize,
-                width = width
-            )
+            val paragraph = simpleMultiParagraph(text = text, fontSize = fontSize, width = width)
 
             for (i in 0 until text.length) {
                 val row = i / lineLength
@@ -671,16 +616,16 @@
                 val top = row * fontSizeInPx
                 val cursorXOffset = col * fontSizeInPx
 
-                val expectRect = Rect(
-                    left = cursorXOffset,
-                    top = top,
-                    right = cursorXOffset,
-                    bottom = top + fontSizeInPx
-                )
+                val expectRect =
+                    Rect(
+                        left = cursorXOffset,
+                        top = top,
+                        right = cursorXOffset,
+                        bottom = top + fontSizeInPx
+                    )
                 val actualRect = paragraph.getCursorRect(i)
 
-                assertWithMessage("getCursorRect($i) failed")
-                    .that(actualRect).isEqualTo(expectRect)
+                assertWithMessage("getCursorRect($i) failed").that(actualRect).isEqualTo(expectRect)
             }
 
             // Last cursor position is the end of the last line.
@@ -689,15 +634,17 @@
             val top = row * fontSizeInPx
             val cursorXOffset = col * fontSizeInPx
 
-            val expectRect = Rect(
-                left = cursorXOffset,
-                top = top,
-                right = cursorXOffset,
-                bottom = top + fontSizeInPx
-            )
+            val expectRect =
+                Rect(
+                    left = cursorXOffset,
+                    top = top,
+                    right = cursorXOffset,
+                    bottom = top + fontSizeInPx
+                )
             val actualRect = paragraph.getCursorRect(text.length)
             assertWithMessage("getCursorRect(${text.length}) failed")
-                .that(actualRect).isEqualTo(expectRect)
+                .that(actualRect)
+                .isEqualTo(expectRect)
         }
     }
 
@@ -741,8 +688,7 @@
         val text = "abc\ndef"
         val paragraph = simpleMultiParagraph(text = text)
 
-        assertThat(paragraph.getLineForOffset(text.length + 1))
-            .isEqualTo(1)
+        assertThat(paragraph.getLineForOffset(text.length + 1)).isEqualTo(1)
     }
 
     @Test
@@ -755,11 +701,7 @@
 
             val width = simpleMultiParagraphIntrinsics(text, fontSize).maxIntrinsicWidth * 2
 
-            val paragraph = simpleMultiParagraph(
-                text = text,
-                fontSize = fontSize,
-                width = width
-            )
+            val paragraph = simpleMultiParagraph(text = text, fontSize = fontSize, width = width)
 
             assertThat(paragraph.getLineLeft(0)).isEqualTo(0)
             assertThat(paragraph.getLineLeft(1)).isEqualTo(width - 2 * fontSizeInPx)
@@ -807,11 +749,7 @@
 
             val width = simpleMultiParagraphIntrinsics(text, fontSize).maxIntrinsicWidth * 2
 
-            val paragraph = simpleMultiParagraph(
-                text = text,
-                fontSize = fontSize,
-                width = width
-            )
+            val paragraph = simpleMultiParagraph(text = text, fontSize = fontSize, width = width)
 
             assertThat(paragraph.getLineRight(0)).isEqualTo(2 * fontSizeInPx)
             assertThat(paragraph.getLineRight(1)).isEqualTo(width)
@@ -842,10 +780,7 @@
             val fontSize = 50.sp
             val fontSizeInPx = fontSize.toPx()
 
-            val paragraph = simpleMultiParagraph(
-                text = text,
-                fontSize = fontSize
-            )
+            val paragraph = simpleMultiParagraph(text = text, fontSize = fontSize)
 
             for (i in 0 until paragraph.lineCount) {
                 assertWithMessage("bottom of line $i doesn't match")
@@ -879,10 +814,7 @@
             val fontSize = 50.sp
             val fontSizeInPx = fontSize.toPx()
 
-            val paragraph = simpleMultiParagraph(
-                text = text,
-                fontSize = fontSize
-            )
+            val paragraph = simpleMultiParagraph(text = text, fontSize = fontSize)
 
             for (i in 0 until paragraph.lineCount) {
                 assertWithMessage("baseline of line $i doesn't match")
@@ -936,10 +868,7 @@
             val fontSize = 50.sp
             val fontSizeInPx = fontSize.toPx()
 
-            val paragraph = simpleMultiParagraph(
-                text = text,
-                fontSize = fontSize
-            )
+            val paragraph = simpleMultiParagraph(text = text, fontSize = fontSize)
 
             for (i in 0 until paragraph.lineCount) {
                 assertWithMessage("bottom of line $i doesn't match")
@@ -973,14 +902,12 @@
             val fontSize = 50.sp
             val fontSizeInPx = fontSize.toPx()
 
-            val paragraph = simpleMultiParagraph(
-                text = text,
-                fontSize = fontSize
-            )
+            val paragraph = simpleMultiParagraph(text = text, fontSize = fontSize)
 
             for (i in 0 until paragraph.lineCount) {
                 assertWithMessage("getLineHeight($i) failed")
-                    .that(paragraph.getLineHeight(i)).isEqualTo(fontSizeInPx)
+                    .that(paragraph.getLineHeight(i))
+                    .isEqualTo(fontSizeInPx)
             }
         }
     }
@@ -1026,11 +953,12 @@
         // Width should be sufficient to make each paragraph one line.
         val width = 2 * simpleMultiParagraphIntrinsics(text).maxIntrinsicWidth
 
-        val paragraph = simpleMultiParagraph(
-            text = text,
-            width = width,
-            style = TextStyle(textAlign = TextAlign.Left)
-        )
+        val paragraph =
+            simpleMultiParagraph(
+                text = text,
+                width = width,
+                style = TextStyle(textAlign = TextAlign.Left)
+            )
 
         // When text align to left, line left should be 0 for both Ltr and Rtl text.
         assertThat(paragraph.getLineLeft(0)).isZero()
@@ -1046,11 +974,12 @@
         // Width should be sufficient to make each paragraph one line.
         val width = 2 * simpleMultiParagraphIntrinsics(text).maxIntrinsicWidth
 
-        val paragraph = simpleMultiParagraph(
-            text = text,
-            width = width,
-            style = TextStyle(textAlign = TextAlign.Right)
-        )
+        val paragraph =
+            simpleMultiParagraph(
+                text = text,
+                width = width,
+                style = TextStyle(textAlign = TextAlign.Right)
+            )
 
         // When text align to right, line right should be width for both Ltr and Rtl text.
         assertThat(paragraph.getLineRight(0)).isEqualTo(width)
@@ -1070,12 +999,13 @@
             // Width should be sufficient to make each paragraph one line.
             val width = 2 * simpleMultiParagraphIntrinsics(text, fontSize).maxIntrinsicWidth
 
-            val paragraph = simpleMultiParagraph(
-                text = text,
-                fontSize = fontSize,
-                width = width,
-                style = TextStyle(textAlign = TextAlign.Center)
-            )
+            val paragraph =
+                simpleMultiParagraph(
+                    text = text,
+                    fontSize = fontSize,
+                    width = width,
+                    style = TextStyle(textAlign = TextAlign.Center)
+                )
 
             val expectedLineLeft = width / 2 - (fontSizeInPx * textLtr.length) / 2
             val expectedLineRight = width / 2 + (fontSizeInPx * textLtr.length) / 2
@@ -1099,11 +1029,12 @@
         // Justify only works for soft wrapped lines, so width is made insufficient.
         val width = simpleMultiParagraphIntrinsics(text).maxIntrinsicWidth - 1f
 
-        val paragraph = simpleMultiParagraph(
-            text = text,
-            style = TextStyle(textAlign = TextAlign.Justify),
-            width = width
-        )
+        val paragraph =
+            simpleMultiParagraph(
+                text = text,
+                style = TextStyle(textAlign = TextAlign.Justify),
+                width = width
+            )
 
         // When text is justified, line left is 0 while line right is width
         assertThat(paragraph.getLineLeft(0)).isZero()
@@ -1126,20 +1057,20 @@
             // Justify only works for soft wrapped lines, so width is made insufficient.
             val width = simpleMultiParagraphIntrinsics(text, fontSize).maxIntrinsicWidth - 1f
 
-            val paragraph = simpleMultiParagraph(
-                text = text,
-                fontSize = fontSize,
-                style = TextStyle(textAlign = TextAlign.Justify),
-                width = width
-            )
+            val paragraph =
+                simpleMultiParagraph(
+                    text = text,
+                    fontSize = fontSize,
+                    style = TextStyle(textAlign = TextAlign.Justify),
+                    width = width
+                )
 
             // When Ltr text is justified, line left is 0.
             assertThat(paragraph.getLineLeft(0)).isZero()
             // When Ltr text is justified, line right is greater than when it's align left. We
             // can only assert a weaker condition due to bug b/68009059, where extra space is
             // added at the end of the line.
-            assertThat(paragraph.getLineRight(0))
-                .isGreaterThan("a a".length * fontSizeInPx)
+            assertThat(paragraph.getLineRight(0)).isGreaterThan("a a".length * fontSizeInPx)
             // When Rtl text is justified, line right is width.
             assertThat(paragraph.getLineRight(2)).isEqualTo(width)
             // Similar to Ltr text, when Rtl text is justified, line left is less than when it's
@@ -1158,11 +1089,12 @@
         // Width should be sufficient to make each paragraph one line.
         val width = 2 * simpleMultiParagraphIntrinsics(text).maxIntrinsicWidth
 
-        val paragraph = simpleMultiParagraph(
-            text = text,
-            style = TextStyle(textAlign = TextAlign.Start),
-            width = width
-        )
+        val paragraph =
+            simpleMultiParagraph(
+                text = text,
+                style = TextStyle(textAlign = TextAlign.Start),
+                width = width
+            )
         // When text align to start, Ltr text aligns to left, line left should be 0.
         assertThat(paragraph.getLineLeft(0)).isZero()
         // When text align to start, Rtl text aligns to right, line right should be width.
@@ -1178,11 +1110,12 @@
         // Width should be sufficient to make each paragraph one line.
         val width = 2 * simpleMultiParagraphIntrinsics(text).maxIntrinsicWidth
 
-        val paragraph = simpleMultiParagraph(
-            text = text,
-            style = TextStyle(textAlign = TextAlign.End),
-            width = width
-        )
+        val paragraph =
+            simpleMultiParagraph(
+                text = text,
+                style = TextStyle(textAlign = TextAlign.End),
+                width = width
+            )
         // When text align to start, Ltr text aligns to right, line right should be width.
         assertThat(paragraph.getLineRight(0)).isEqualTo(width)
         // When text align to start, Rtl text aligns to left, line left should 0.
@@ -1202,15 +1135,17 @@
 
             val width = simpleMultiParagraphIntrinsics(text, fontSize).maxIntrinsicWidth
 
-            val paragraph = simpleMultiParagraph(
-                text = text,
-                fontSize = fontSize,
-                style = TextStyle(
-                    textDirection = TextDirection.Content,
-                    localeList = ltrLocaleList
-                ),
-                width = width
-            )
+            val paragraph =
+                simpleMultiParagraph(
+                    text = text,
+                    fontSize = fontSize,
+                    style =
+                        TextStyle(
+                            textDirection = TextDirection.Content,
+                            localeList = ltrLocaleList
+                        ),
+                    width = width
+                )
 
             // First paragraph should be rendered as: "a .", dot is visually after "a ".
             assertThat(paragraph.getHorizontalPosition(2, true))
@@ -1237,15 +1172,17 @@
 
             val width = simpleMultiParagraphIntrinsics(text, fontSize).maxIntrinsicWidth
 
-            val paragraph = simpleMultiParagraph(
-                text = text,
-                fontSize = fontSize,
-                style = TextStyle(
-                    textDirection = TextDirection.Content,
-                    localeList = rtlLocaleList
-                ),
-                width = width
-            )
+            val paragraph =
+                simpleMultiParagraph(
+                    text = text,
+                    fontSize = fontSize,
+                    style =
+                        TextStyle(
+                            textDirection = TextDirection.Content,
+                            localeList = rtlLocaleList
+                        ),
+                    width = width
+                )
 
             // First paragraph should be rendered as: "a .", dot is visually after "a ".
             assertThat(paragraph.getHorizontalPosition(2, true))
@@ -1272,12 +1209,13 @@
 
             val width = simpleMultiParagraphIntrinsics(text, fontSize).maxIntrinsicWidth
 
-            val paragraph = simpleMultiParagraph(
-                text = text,
-                fontSize = fontSize,
-                style = TextStyle(textDirection = TextDirection.Ltr),
-                width = width
-            )
+            val paragraph =
+                simpleMultiParagraph(
+                    text = text,
+                    fontSize = fontSize,
+                    style = TextStyle(textDirection = TextDirection.Ltr),
+                    width = width
+                )
 
             // First paragraph should be rendered as: "a .", dot is visually after "a ".
             assertThat(paragraph.getHorizontalPosition(2, true))
@@ -1304,12 +1242,13 @@
 
             val width = simpleMultiParagraphIntrinsics(text, fontSize).maxIntrinsicWidth
 
-            val paragraph = simpleMultiParagraph(
-                text = text,
-                fontSize = fontSize,
-                style = TextStyle(textDirection = TextDirection.Rtl),
-                width = width
-            )
+            val paragraph =
+                simpleMultiParagraph(
+                    text = text,
+                    fontSize = fontSize,
+                    style = TextStyle(textDirection = TextDirection.Rtl),
+                    width = width
+                )
 
             // First paragraph should be rendered as: ". a", dot is visually before " a".
             assertThat(paragraph.getHorizontalPosition(2, true))
@@ -1334,11 +1273,12 @@
             val lineHeight = 80.sp
             val lineHeightInPx = lineHeight.toPx()
 
-            val paragraph = simpleMultiParagraph(
-                text = text,
-                fontSize = fontSize,
-                style = TextStyle(lineHeight = lineHeight)
-            )
+            val paragraph =
+                simpleMultiParagraph(
+                    text = text,
+                    fontSize = fontSize,
+                    style = TextStyle(lineHeight = lineHeight)
+                )
 
             // Height of first and last line in each paragraph is influenced by includePadding.
             // So we only assert the inner paragraph lines' height.
@@ -1348,37 +1288,41 @@
     }
 
     @Test
-    fun drawText_withUnderlineStyle_equalToUnderlinePaint() = with(defaultDensity) {
-        val fontSize = 30.sp
-        val fontSizeInPx = fontSize.toPx()
-        val multiParagraph = simpleMultiParagraph(
-            text = buildAnnotatedString {
-                withStyle(SpanStyle(textDecoration = TextDecoration.Underline)) {
-                    append("レンズ(単焦点)")
-                }
-            },
-            style = TextStyle(fontSize = fontSize),
-            width = fontSizeInPx * 20
-        )
+    fun drawText_withUnderlineStyle_equalToUnderlinePaint() =
+        with(defaultDensity) {
+            val fontSize = 30.sp
+            val fontSizeInPx = fontSize.toPx()
+            val multiParagraph =
+                simpleMultiParagraph(
+                    text =
+                        buildAnnotatedString {
+                            withStyle(SpanStyle(textDecoration = TextDecoration.Underline)) {
+                                append("レンズ(単焦点)")
+                            }
+                        },
+                    style = TextStyle(fontSize = fontSize),
+                    width = fontSizeInPx * 20
+                )
 
-        val multiParagraph2 = simpleMultiParagraph(
-            text = AnnotatedString("レンズ(単焦点)"),
-            style = TextStyle(
-                fontSize = fontSize,
-                textDecoration = TextDecoration.Underline
-            ),
-            width = fontSizeInPx * 20
-        )
+            val multiParagraph2 =
+                simpleMultiParagraph(
+                    text = AnnotatedString("レンズ(単焦点)"),
+                    style =
+                        TextStyle(fontSize = fontSize, textDecoration = TextDecoration.Underline),
+                    width = fontSizeInPx * 20
+                )
 
-        val bitmapWithSpan = multiParagraph.bitmap()
-        // Our text rendering stack relies on the fact that given textstyle is also passed to draw
-        // functions of TextLayoutResult, MultiParagraph, Paragraph. If Underline is not specified
-        // here, it would be removed while drawing the MultiParagraph. We are simply mimicking
-        // what TextPainter does.
-        val bitmapNoSpan = multiParagraph2.bitmap(textDecoration = TextDecoration.Underline)
+            val bitmapWithSpan = multiParagraph.bitmap()
+            // Our text rendering stack relies on the fact that given textstyle is also passed to
+            // draw
+            // functions of TextLayoutResult, MultiParagraph, Paragraph. If Underline is not
+            // specified
+            // here, it would be removed while drawing the MultiParagraph. We are simply mimicking
+            // what TextPainter does.
+            val bitmapNoSpan = multiParagraph2.bitmap(textDecoration = TextDecoration.Underline)
 
-        assertThat(bitmapWithSpan).isEqualToBitmap(bitmapNoSpan)
-    }
+            assertThat(bitmapWithSpan).isEqualToBitmap(bitmapNoSpan)
+        }
 
     @Test
     fun textIndent_onFirstLine() {
@@ -1392,12 +1336,13 @@
 
             // Width is the space needed by 2 characters
             val width = 2 * fontSizeInPx
-            val paragraph = simpleMultiParagraph(
-                text = text,
-                style = TextStyle(textIndent = TextIndent(firstLine = indent)),
-                fontSize = fontSize,
-                width = width
-            )
+            val paragraph =
+                simpleMultiParagraph(
+                    text = text,
+                    style = TextStyle(textIndent = TextIndent(firstLine = indent)),
+                    fontSize = fontSize,
+                    width = width
+                )
             // The paragraph should be rendered as:
             //   a
             //  aa
@@ -1423,12 +1368,13 @@
 
             // Width is the space needed by 2 characters
             val width = 2 * fontSizeInPx
-            val paragraph = simpleMultiParagraph(
-                text = text,
-                fontSize = fontSize,
-                style = TextStyle(textIndent = TextIndent(restLine = indent)),
-                width = width
-            )
+            val paragraph =
+                simpleMultiParagraph(
+                    text = text,
+                    fontSize = fontSize,
+                    style = TextStyle(textIndent = TextIndent(restLine = indent)),
+                    width = width
+                )
             // The paragraph should be rendered as:
             //  aa
             //   a
@@ -1444,31 +1390,34 @@
     @Test
     fun annotatedString_haveParagraphStyle_withoutTextDirection() {
         // Provide an LTR text
-        val text = AnnotatedString(
-            text = "ab",
-            paragraphStyles = listOf(
-                Range(
-                    item = ParagraphStyle(textDirection = TextDirection.Content),
-                    start = 0,
-                    end = "a".length
-                ),
-                Range(
-                    // skip setting [TextDirection] on purpose, should inherit from the
-                    // main [ParagraphStyle]
-                    item = ParagraphStyle(),
-                    start = "a".length,
-                    end = "ab".length
-                )
+        val text =
+            AnnotatedString(
+                text = "ab",
+                paragraphStyles =
+                    listOf(
+                        Range(
+                            item = ParagraphStyle(textDirection = TextDirection.Content),
+                            start = 0,
+                            end = "a".length
+                        ),
+                        Range(
+                            // skip setting [TextDirection] on purpose, should inherit from the
+                            // main [ParagraphStyle]
+                            item = ParagraphStyle(),
+                            start = "a".length,
+                            end = "ab".length
+                        )
+                    )
             )
-        )
 
-        val paragraph = MultiParagraph(
-            annotatedString = text,
-            style = TextStyle(textDirection = TextDirection.Rtl),
-            constraints = Constraints(),
-            density = defaultDensity,
-            fontFamilyResolver = UncachedFontFamilyResolver(context)
-        )
+        val paragraph =
+            MultiParagraph(
+                annotatedString = text,
+                style = TextStyle(textDirection = TextDirection.Rtl),
+                constraints = Constraints(),
+                density = defaultDensity,
+                fontFamilyResolver = UncachedFontFamilyResolver(context)
+            )
 
         // the first character uses TextDirection.Content, text is Ltr
         assertThat(paragraph.getParagraphDirection(0)).isEqualTo(ResolvedTextDirection.Ltr)
@@ -1482,25 +1431,18 @@
         val text = AnnotatedString(text = "ab")
         val fontSize = 20
         val width = 2.em
-        val placeholders = listOf(
-            Range(
-                Placeholder(width, 1.em, PlaceholderVerticalAlign.AboveBaseline),
-                0,
-                1
-            )
-        )
+        val placeholders =
+            listOf(Range(Placeholder(width, 1.em, PlaceholderVerticalAlign.AboveBaseline), 0, 1))
 
-        val paragraph = MultiParagraph(
-            annotatedString = text,
-            style = TextStyle(
-                fontSize = fontSize.sp,
-                fontFamily = fontFamilyMeasureFont
-            ),
-            placeholders = placeholders,
-            constraints = Constraints(),
-            density = defaultDensity,
-            fontFamilyResolver = UncachedFontFamilyResolver(context)
-        )
+        val paragraph =
+            MultiParagraph(
+                annotatedString = text,
+                style = TextStyle(fontSize = fontSize.sp, fontFamily = fontFamilyMeasureFont),
+                placeholders = placeholders,
+                constraints = Constraints(),
+                density = defaultDensity,
+                fontFamilyResolver = UncachedFontFamilyResolver(context)
+            )
 
         // Rendered as below:
         //   |  |b
@@ -1513,25 +1455,18 @@
         val text = AnnotatedString(text = "ab")
         val fontSize = 20
         val width = 30.sp
-        val placeholders = listOf(
-            Range(
-                Placeholder(width, 1.em, PlaceholderVerticalAlign.AboveBaseline),
-                0,
-                1
-            )
-        )
+        val placeholders =
+            listOf(Range(Placeholder(width, 1.em, PlaceholderVerticalAlign.AboveBaseline), 0, 1))
 
-        val paragraph = MultiParagraph(
-            annotatedString = text,
-            style = TextStyle(
-                fontSize = fontSize.sp,
-                fontFamily = fontFamilyMeasureFont
-            ),
-            placeholders = placeholders,
-            constraints = Constraints(),
-            density = defaultDensity,
-            fontFamilyResolver = UncachedFontFamilyResolver(context)
-        )
+        val paragraph =
+            MultiParagraph(
+                annotatedString = text,
+                style = TextStyle(fontSize = fontSize.sp, fontFamily = fontFamilyMeasureFont),
+                placeholders = placeholders,
+                constraints = Constraints(),
+                density = defaultDensity,
+                fontFamilyResolver = UncachedFontFamilyResolver(context)
+            )
 
         // Rendered as below:
         //   |  |b
@@ -1545,35 +1480,29 @@
         val fontSize = 20
         val width = 2.em
         val height = 1.em
-        val placeholders = listOf(
-            Range(
-                Placeholder(width, height, PlaceholderVerticalAlign.AboveBaseline),
-                0,
-                1
-            )
-        )
+        val placeholders =
+            listOf(Range(Placeholder(width, height, PlaceholderVerticalAlign.AboveBaseline), 0, 1))
 
-        val paragraph = MultiParagraph(
-            annotatedString = text,
-            style = TextStyle(
-                fontSize = fontSize.sp,
-                fontFamily = fontFamilyMeasureFont
-            ),
-            placeholders = placeholders,
-            constraints = Constraints(),
-            density = defaultDensity,
-            fontFamilyResolver = UncachedFontFamilyResolver(context)
-        )
+        val paragraph =
+            MultiParagraph(
+                annotatedString = text,
+                style = TextStyle(fontSize = fontSize.sp, fontFamily = fontFamilyMeasureFont),
+                placeholders = placeholders,
+                constraints = Constraints(),
+                density = defaultDensity,
+                fontFamilyResolver = UncachedFontFamilyResolver(context)
+            )
 
         assertThat(paragraph.placeholderRects).hasSize(1)
-        assertThat(paragraph.placeholderRects[0]).isEqualTo(
-            Rect(
-                left = 0f,
-                top = paragraph.firstBaseline - height.value * fontSize,
-                right = width.value * fontSize,
-                bottom = paragraph.firstBaseline
+        assertThat(paragraph.placeholderRects[0])
+            .isEqualTo(
+                Rect(
+                    left = 0f,
+                    top = paragraph.firstBaseline - height.value * fontSize,
+                    right = width.value * fontSize,
+                    bottom = paragraph.firstBaseline
+                )
             )
-        )
     }
 
     @Test
@@ -1582,48 +1511,41 @@
         val fontSize = 20
         val width = 2.em
         val height = 1.em
-        val placeholders = listOf(
-            Range(
-                Placeholder(width, height, PlaceholderVerticalAlign.AboveBaseline),
-                0,
-                1
-            ),
-            Range(
-                Placeholder(width, height, PlaceholderVerticalAlign.AboveBaseline),
-                2,
-                3
+        val placeholders =
+            listOf(
+                Range(Placeholder(width, height, PlaceholderVerticalAlign.AboveBaseline), 0, 1),
+                Range(Placeholder(width, height, PlaceholderVerticalAlign.AboveBaseline), 2, 3)
             )
-        )
 
-        val paragraph = MultiParagraph(
-            annotatedString = text,
-            style = TextStyle(
-                fontSize = fontSize.sp,
-                fontFamily = fontFamilyMeasureFont
-            ),
-            placeholders = placeholders,
-            constraints = Constraints(),
-            density = defaultDensity,
-            fontFamilyResolver = UncachedFontFamilyResolver(context)
-        )
+        val paragraph =
+            MultiParagraph(
+                annotatedString = text,
+                style = TextStyle(fontSize = fontSize.sp, fontFamily = fontFamilyMeasureFont),
+                placeholders = placeholders,
+                constraints = Constraints(),
+                density = defaultDensity,
+                fontFamilyResolver = UncachedFontFamilyResolver(context)
+            )
 
         assertThat(paragraph.placeholderRects).hasSize(2)
-        assertThat(paragraph.placeholderRects[0]).isEqualTo(
-            Rect(
-                left = 0f,
-                top = paragraph.firstBaseline - height.value * fontSize,
-                right = width.value * fontSize,
-                bottom = paragraph.firstBaseline
+        assertThat(paragraph.placeholderRects[0])
+            .isEqualTo(
+                Rect(
+                    left = 0f,
+                    top = paragraph.firstBaseline - height.value * fontSize,
+                    right = width.value * fontSize,
+                    bottom = paragraph.firstBaseline
+                )
             )
-        )
-        assertThat(paragraph.placeholderRects[1]).isEqualTo(
-            Rect(
-                left = 0f,
-                top = paragraph.lastBaseline - height.value * fontSize,
-                right = width.value * fontSize,
-                bottom = paragraph.lastBaseline
+        assertThat(paragraph.placeholderRects[1])
+            .isEqualTo(
+                Rect(
+                    left = 0f,
+                    top = paragraph.lastBaseline - height.value * fontSize,
+                    right = width.value * fontSize,
+                    bottom = paragraph.lastBaseline
+                )
             )
-        )
     }
 
     @Test(expected = IllegalArgumentException::class)
@@ -1632,20 +1554,12 @@
         val fontSize = 20
         val width = 2.em
         val height = 1.em
-        val placeholders = listOf(
-            Range(
-                Placeholder(width, height, PlaceholderVerticalAlign.AboveBaseline),
-                1,
-                3
-            )
-        )
+        val placeholders =
+            listOf(Range(Placeholder(width, height, PlaceholderVerticalAlign.AboveBaseline), 1, 3))
 
         MultiParagraph(
             annotatedString = text,
-            style = TextStyle(
-                fontSize = fontSize.sp,
-                fontFamily = fontFamilyMeasureFont
-            ),
+            style = TextStyle(fontSize = fontSize.sp, fontFamily = fontFamilyMeasureFont),
             placeholders = placeholders,
             constraints = Constraints(),
             density = defaultDensity,
@@ -1681,17 +1595,14 @@
     fun multiParagraphConstruction_doesNotThrow_ifNotAllParagraghsFitVertically() {
         with(defaultDensity) {
             val fontSize = 20.sp
-            val constraints = Constraints(
-                maxWidth = 10 * fontSize.roundToPx(),
-                maxHeight = fontSize.roundToPx() / 2
-            )
+            val constraints =
+                Constraints(
+                    maxWidth = 10 * fontSize.roundToPx(),
+                    maxHeight = fontSize.roundToPx() / 2
+                )
             val text = buildAnnotatedString {
-                withStyle(ParagraphStyle(textAlign = TextAlign.Center)) {
-                    append("Lorem")
-                }
-                withStyle(ParagraphStyle()) {
-                    append("Ipsum")
-                }
+                withStyle(ParagraphStyle(textAlign = TextAlign.Center)) { append("Lorem") }
+                withStyle(ParagraphStyle()) { append("Ipsum") }
             }
 
             MultiParagraph(
@@ -1705,113 +1616,111 @@
     }
 
     @Test
-    fun multiParagraph_appliesBrush_toTheWholeText() = with(defaultDensity) {
-        val fontSize = 20.sp
-        val fontSizeInPx = fontSize.toPx()
-        val brush = Brush.verticalGradient(listOf(Color.Blue, Color.Red))
-        val multiParagraph = simpleMultiParagraph(
-            text = buildAnnotatedString {
-                withStyle(ParagraphStyle(textAlign = TextAlign.Right)) {
-                    append("Lorem")
-                }
-                withStyle(ParagraphStyle()) {
-                    append("Ipsum")
-                }
-            },
-            style = TextStyle(
-                brush = brush,
-                fontSize = fontSize
-            ),
-            width = fontSizeInPx * 5
-        ).apply { disableAntialias() }
+    fun multiParagraph_appliesBrush_toTheWholeText() =
+        with(defaultDensity) {
+            val fontSize = 20.sp
+            val fontSizeInPx = fontSize.toPx()
+            val brush = Brush.verticalGradient(listOf(Color.Blue, Color.Red))
+            val multiParagraph =
+                simpleMultiParagraph(
+                        text =
+                            buildAnnotatedString {
+                                withStyle(ParagraphStyle(textAlign = TextAlign.Right)) {
+                                    append("Lorem")
+                                }
+                                withStyle(ParagraphStyle()) { append("Ipsum") }
+                            },
+                        style = TextStyle(brush = brush, fontSize = fontSize),
+                        width = fontSizeInPx * 5
+                    )
+                    .apply { disableAntialias() }
 
-        val multiParagraph2 = simpleMultiParagraph(
-            text = buildAnnotatedString {
-                append("Lorem\n")
-                append("Ipsum")
-            },
-            style = TextStyle(
-                brush = brush,
-                fontSize = fontSize
-            ),
-            width = fontSizeInPx * 5
-        ).apply { disableAntialias() }
+            val multiParagraph2 =
+                simpleMultiParagraph(
+                        text =
+                            buildAnnotatedString {
+                                append("Lorem\n")
+                                append("Ipsum")
+                            },
+                        style = TextStyle(brush = brush, fontSize = fontSize),
+                        width = fontSizeInPx * 5
+                    )
+                    .apply { disableAntialias() }
 
-        assertThat(multiParagraph.bitmap(brush))
-            .isEqualToBitmap(multiParagraph2.bitmap(brush))
-    }
-
-    @Test
-    fun multiParagraph_overridesAlphaDuringDraw() = with(defaultDensity) {
-        val fontSize = 20.sp
-        val fontSizeInPx = fontSize.toPx()
-        val brush = Brush.verticalGradient(listOf(Color.Blue, Color.Red))
-        val multiParagraph = simpleMultiParagraph(
-            text = buildAnnotatedString {
-                withStyle(ParagraphStyle(textAlign = TextAlign.Right)) {
-                    append("Lorem")
-                }
-                withStyle(ParagraphStyle()) {
-                    append("Ipsum")
-                }
-            },
-            style = TextStyle(
-                brush = brush,
-                alpha = 0.5f,
-                fontSize = fontSize
-            ),
-            width = fontSizeInPx * 5
-        ).apply { disableAntialias() }
-
-        val multiParagraph2 = simpleMultiParagraph(
-            text = buildAnnotatedString {
-                append("Lorem\n")
-                append("Ipsum")
-            },
-            style = TextStyle(
-                brush = brush,
-                fontSize = fontSize
-            ),
-            width = fontSizeInPx * 5
-        ).apply { disableAntialias() }
-
-        assertThat(multiParagraph.bitmap(brush))
-            .isEqualToBitmap(multiParagraph2.bitmap(brush, 0.5f))
-    }
-
-    @Test
-    fun multiParagraph_appliesDrawStyle_toAllParagraphs() = with(defaultDensity) {
-        val fontSize = 20.sp
-        val fontSizeInPx = fontSize.toPx()
-        val multiParagraph = simpleMultiParagraph(
-            text = buildAnnotatedString {
-                withStyle(ParagraphStyle(textAlign = TextAlign.Right)) {
-                    append("Lorem")
-                }
-                withStyle(ParagraphStyle()) {
-                    append("Ipsum")
-                }
-            },
-            style = TextStyle(fontSize = fontSize),
-            width = fontSizeInPx * 5
-        )
-
-        multiParagraph.bitmap(drawStyle = Stroke())
-
-        multiParagraph.paragraphInfoList.map { it.paragraph }.forEach {
-            assertThat((it as AndroidParagraph).textPaint.style).isEqualTo(Paint.Style.STROKE)
+            assertThat(multiParagraph.bitmap(brush)).isEqualToBitmap(multiParagraph2.bitmap(brush))
         }
-    }
+
+    @Test
+    fun multiParagraph_overridesAlphaDuringDraw() =
+        with(defaultDensity) {
+            val fontSize = 20.sp
+            val fontSizeInPx = fontSize.toPx()
+            val brush = Brush.verticalGradient(listOf(Color.Blue, Color.Red))
+            val multiParagraph =
+                simpleMultiParagraph(
+                        text =
+                            buildAnnotatedString {
+                                withStyle(ParagraphStyle(textAlign = TextAlign.Right)) {
+                                    append("Lorem")
+                                }
+                                withStyle(ParagraphStyle()) { append("Ipsum") }
+                            },
+                        style = TextStyle(brush = brush, alpha = 0.5f, fontSize = fontSize),
+                        width = fontSizeInPx * 5
+                    )
+                    .apply { disableAntialias() }
+
+            val multiParagraph2 =
+                simpleMultiParagraph(
+                        text =
+                            buildAnnotatedString {
+                                append("Lorem\n")
+                                append("Ipsum")
+                            },
+                        style = TextStyle(brush = brush, fontSize = fontSize),
+                        width = fontSizeInPx * 5
+                    )
+                    .apply { disableAntialias() }
+
+            assertThat(multiParagraph.bitmap(brush))
+                .isEqualToBitmap(multiParagraph2.bitmap(brush, 0.5f))
+        }
+
+    @Test
+    fun multiParagraph_appliesDrawStyle_toAllParagraphs() =
+        with(defaultDensity) {
+            val fontSize = 20.sp
+            val fontSizeInPx = fontSize.toPx()
+            val multiParagraph =
+                simpleMultiParagraph(
+                    text =
+                        buildAnnotatedString {
+                            withStyle(ParagraphStyle(textAlign = TextAlign.Right)) {
+                                append("Lorem")
+                            }
+                            withStyle(ParagraphStyle()) { append("Ipsum") }
+                        },
+                    style = TextStyle(fontSize = fontSize),
+                    width = fontSizeInPx * 5
+                )
+
+            multiParagraph.bitmap(drawStyle = Stroke())
+
+            multiParagraph.paragraphInfoList
+                .map { it.paragraph }
+                .forEach {
+                    assertThat((it as AndroidParagraph).textPaint.style)
+                        .isEqualTo(Paint.Style.STROKE)
+                }
+        }
 
     @Test
     fun minInstrinsicWidth_includes_white_space() {
         with(defaultDensity) {
             val fontSize = 12.sp
             val text = "b "
-            val paragraph = simpleMultiParagraph(
-                text = text,
-                style = TextStyle(fontSize = fontSize)
-            )
+            val paragraph =
+                simpleMultiParagraph(text = text, style = TextStyle(fontSize = fontSize))
 
             val expectedWidth = text.length * fontSize.toPx()
             assertThat(paragraph.minIntrinsicWidth).isEqualTo(expectedWidth)
@@ -1823,14 +1732,11 @@
         with(defaultDensity) {
             // create words with length 1, 2, 3... 50; and append all with space.
             val maxWordLength = 50
-            val text = (1..maxWordLength).fold("") { string, next ->
-                string + "a".repeat(next) + " "
-            }
+            val text =
+                (1..maxWordLength).fold("") { string, next -> string + "a".repeat(next) + " " }
             val fontSize = 12.sp
-            val paragraph = simpleMultiParagraph(
-                text = text,
-                style = TextStyle(fontSize = fontSize)
-            )
+            val paragraph =
+                simpleMultiParagraph(text = text, style = TextStyle(fontSize = fontSize))
 
             // +1 is for the white space
             val expectedWidth = (maxWordLength + 1) * fontSize.toPx()
@@ -1844,13 +1750,19 @@
             val text = "a bb ccc"
             val fontSize = 12.sp
             val styledFontSize = fontSize * 2
-            val paragraph = simpleMultiParagraph(
-                text = buildAnnotatedString {
-                    append(text)
-                    addStyle(SpanStyle(fontSize = styledFontSize), "a".length, "a bb ".length)
-                },
-                style = TextStyle(fontSize = fontSize),
-            )
+            val paragraph =
+                simpleMultiParagraph(
+                    text =
+                        buildAnnotatedString {
+                            append(text)
+                            addStyle(
+                                SpanStyle(fontSize = styledFontSize),
+                                "a".length,
+                                "a bb ".length
+                            )
+                        },
+                    style = TextStyle(fontSize = fontSize),
+                )
 
             val expectedWidth = "bb ".length * styledFontSize.toPx()
             assertThat(paragraph.minIntrinsicWidth).isEqualTo(expectedWidth)
@@ -1889,10 +1801,7 @@
     ): MultiParagraphIntrinsics {
         return MultiParagraphIntrinsics(
             text,
-            style = TextStyle(
-                fontFamily = fontFamilyMeasureFont,
-                fontSize = fontSize
-            ),
+            style = TextStyle(fontFamily = fontFamilyMeasureFont, fontSize = fontSize),
             placeholders = placeholders,
             density = defaultDensity,
             fontFamilyResolver = UncachedFontFamilyResolver(context)
@@ -1908,10 +1817,7 @@
     ): MultiParagraph {
         return MultiParagraph(
             annotatedString = createAnnotatedString(text),
-            style = TextStyle(
-                fontFamily = fontFamilyMeasureFont,
-                fontSize = fontSize
-            ).merge(style),
+            style = TextStyle(fontFamily = fontFamilyMeasureFont, fontSize = fontSize).merge(style),
             maxLines = maxLines,
             constraints = Constraints(maxWidth = width.ceilToInt()),
             density = defaultDensity,
@@ -1929,11 +1835,13 @@
     ): MultiParagraph {
         return MultiParagraph(
             annotatedString = text,
-            style = TextStyle(
-                fontFamily = fontFamilyMeasureFont,
-                fontSize = fontSize,
-                localeList = localeList
-            ).merge(style),
+            style =
+                TextStyle(
+                        fontFamily = fontFamilyMeasureFont,
+                        fontSize = fontSize,
+                        localeList = localeList
+                    )
+                    .merge(style),
             maxLines = maxLines,
             constraints = Constraints(maxWidth = width.ceilToInt()),
             density = defaultDensity,
diff --git a/compose/ui/ui-text/src/androidInstrumentedTest/kotlin/androidx/compose/ui/text/MultiParagraphIntegrationTextDirectionTest.kt b/compose/ui/ui-text/src/androidInstrumentedTest/kotlin/androidx/compose/ui/text/MultiParagraphIntegrationTextDirectionTest.kt
index 1b95fdb..f7dc800 100644
--- a/compose/ui/ui-text/src/androidInstrumentedTest/kotlin/androidx/compose/ui/text/MultiParagraphIntegrationTextDirectionTest.kt
+++ b/compose/ui/ui-text/src/androidInstrumentedTest/kotlin/androidx/compose/ui/text/MultiParagraphIntegrationTextDirectionTest.kt
@@ -61,10 +61,8 @@
     fun unspecifiedTextDirection_withLtrLocale_resolvesToLtr() {
         Locale.setDefault(ltrLocale)
 
-        val paragraph = multiParagraph(
-            text = AnnotatedString(""),
-            textDirection = TextDirection.Unspecified
-        )
+        val paragraph =
+            multiParagraph(text = AnnotatedString(""), textDirection = TextDirection.Unspecified)
 
         assertThat(paragraph.getParagraphDirection(0)).isEqualTo(ResolvedTextDirection.Ltr)
     }
@@ -73,32 +71,32 @@
     fun unspecifiedTextDirection_withRtlLocale_resolvesToRtl() {
         Locale.setDefault(rtlLocale)
 
-        val paragraph = multiParagraph(
-            text = AnnotatedString(""),
-            textDirection = TextDirection.Unspecified
-        )
+        val paragraph =
+            multiParagraph(text = AnnotatedString(""), textDirection = TextDirection.Unspecified)
 
         assertThat(paragraph.getParagraphDirection(0)).isEqualTo(ResolvedTextDirection.Rtl)
     }
 
     @Test
     fun unspecifiedTextDirection_withLtrLocaleList_resolvesToLtr() {
-        val paragraph = multiParagraph(
-            text = AnnotatedString(""),
-            textDirection = TextDirection.Unspecified,
-            localeList = ltrLocaleList
-        )
+        val paragraph =
+            multiParagraph(
+                text = AnnotatedString(""),
+                textDirection = TextDirection.Unspecified,
+                localeList = ltrLocaleList
+            )
 
         assertThat(paragraph.getParagraphDirection(0)).isEqualTo(ResolvedTextDirection.Ltr)
     }
 
     @Test
     fun unspecifiedTextDirection_withRtlLocaleList_resolvesToRtl() {
-        val paragraph = multiParagraph(
-            text = AnnotatedString(""),
-            textDirection = TextDirection.Unspecified,
-            localeList = rtlLocaleList
-        )
+        val paragraph =
+            multiParagraph(
+                text = AnnotatedString(""),
+                textDirection = TextDirection.Unspecified,
+                localeList = rtlLocaleList
+            )
 
         assertThat(paragraph.getParagraphDirection(0)).isEqualTo(ResolvedTextDirection.Rtl)
     }
@@ -116,13 +114,14 @@
 
             val width = multiParagraphIntrinsics(text, fontSize).maxIntrinsicWidth
 
-            val paragraph = multiParagraph(
-                text = text,
-                fontSize = fontSize,
-                textDirection = TextDirection.Content,
-                localeList = ltrLocaleList,
-                width = width
-            )
+            val paragraph =
+                multiParagraph(
+                    text = text,
+                    fontSize = fontSize,
+                    textDirection = TextDirection.Content,
+                    localeList = ltrLocaleList,
+                    width = width
+                )
 
             // First paragraph should be rendered as: "a .", dot is visually after "a ".
             assertThat(paragraph.getHorizontalPosition(2, true))
@@ -149,13 +148,14 @@
 
             val width = multiParagraphIntrinsics(text, fontSize).maxIntrinsicWidth
             assertThat(width).isLessThan(Int.MAX_VALUE)
-            val paragraph = multiParagraph(
-                text = text,
-                fontSize = fontSize,
-                textDirection = TextDirection.Content,
-                localeList = rtlLocaleList,
-                width = width
-            )
+            val paragraph =
+                multiParagraph(
+                    text = text,
+                    fontSize = fontSize,
+                    textDirection = TextDirection.Content,
+                    localeList = rtlLocaleList,
+                    width = width
+                )
 
             // First paragraph should be rendered as: "a .", dot is visually after "a ".
             assertThat(paragraph.getHorizontalPosition(2, true))
@@ -182,12 +182,13 @@
 
             val width = multiParagraphIntrinsics(text, fontSize).maxIntrinsicWidth
 
-            val paragraph = multiParagraph(
-                text = text,
-                fontSize = fontSize,
-                textDirection = TextDirection.Ltr,
-                width = width
-            )
+            val paragraph =
+                multiParagraph(
+                    text = text,
+                    fontSize = fontSize,
+                    textDirection = TextDirection.Ltr,
+                    width = width
+                )
 
             // First paragraph should be rendered as: "a .", dot is visually after "a ".
             assertThat(paragraph.getHorizontalPosition(2, true))
@@ -214,12 +215,13 @@
 
             val width = multiParagraphIntrinsics(text, fontSize).maxIntrinsicWidth
 
-            val paragraph = multiParagraph(
-                text = text,
-                fontSize = fontSize,
-                textDirection = TextDirection.Rtl,
-                width = width
-            )
+            val paragraph =
+                multiParagraph(
+                    text = text,
+                    fontSize = fontSize,
+                    textDirection = TextDirection.Rtl,
+                    width = width
+                )
 
             // First paragraph should be rendered as: ". a", dot is visually before " a".
             assertThat(paragraph.getHorizontalPosition(2, true))
@@ -259,10 +261,7 @@
     ): MultiParagraphIntrinsics {
         return MultiParagraphIntrinsics(
             text,
-            style = TextStyle(
-                fontFamily = fontFamilyMeasureFont,
-                fontSize = fontSize
-            ),
+            style = TextStyle(fontFamily = fontFamilyMeasureFont, fontSize = fontSize),
             placeholders = placeholders,
             density = defaultDensity,
             fontFamilyResolver = UncachedFontFamilyResolver(context)
@@ -278,12 +277,13 @@
     ): MultiParagraph {
         return MultiParagraph(
             annotatedString = text,
-            style = TextStyle(
-                fontFamily = fontFamilyMeasureFont,
-                fontSize = fontSize,
-                localeList = localeList,
-                textDirection = textDirection
-            ),
+            style =
+                TextStyle(
+                    fontFamily = fontFamilyMeasureFont,
+                    fontSize = fontSize,
+                    localeList = localeList,
+                    textDirection = textDirection
+                ),
             constraints = Constraints(maxWidth = width.ceilToInt()),
             density = defaultDensity,
             fontFamilyResolver = UncachedFontFamilyResolver(context)
diff --git a/compose/ui/ui-text/src/androidInstrumentedTest/kotlin/androidx/compose/ui/text/ParagraphFillBoundingBoxesTest.kt b/compose/ui/ui-text/src/androidInstrumentedTest/kotlin/androidx/compose/ui/text/ParagraphFillBoundingBoxesTest.kt
index 77f04e8..341c972 100644
--- a/compose/ui/ui-text/src/androidInstrumentedTest/kotlin/androidx/compose/ui/text/ParagraphFillBoundingBoxesTest.kt
+++ b/compose/ui/ui-text/src/androidInstrumentedTest/kotlin/androidx/compose/ui/text/ParagraphFillBoundingBoxesTest.kt
@@ -44,9 +44,8 @@
 @SmallTest
 class ParagraphFillBoundingBoxesTest {
     private val fontFamilyMeasureFont = FontTestData.BASIC_MEASURE_FONT.toFontFamily()
-    private val fontFamilyResolver = createFontFamilyResolver(
-        InstrumentationRegistry.getInstrumentation().context
-    )
+    private val fontFamilyResolver =
+        createFontFamilyResolver(InstrumentationRegistry.getInstrumentation().context)
     private val defaultDensity = Density(density = 1f)
     private val fontSize = 10.sp
     private val fontSizeInPx = with(defaultDensity) { fontSize.toPx() }
@@ -54,15 +53,15 @@
     private fun hasEdgeLetterSpacingBugFix(): Boolean {
         val text = "a"
         val fontSize = 10.sp
-        val singleLetterLetterSpacing = Paragraph(
-            text = text,
-            style = TextStyle(fontSize = fontSize, letterSpacing = 10.sp),
-            width = Float.MAX_VALUE)
+        val singleLetterLetterSpacing =
+            Paragraph(
+                text = text,
+                style = TextStyle(fontSize = fontSize, letterSpacing = 10.sp),
+                width = Float.MAX_VALUE
+            )
 
-        val singleLetterWithoutLetterSpacing = Paragraph(
-            text = text,
-            style = TextStyle(fontSize = fontSize),
-            width = Float.MAX_VALUE)
+        val singleLetterWithoutLetterSpacing =
+            Paragraph(text = text, style = TextStyle(fontSize = fontSize), width = Float.MAX_VALUE)
 
         // If the platform has a letter spacing fix, the letter spacing will not be added before and
         // after the visually left most letter and visually right most letter. Therefore, if the fix
@@ -129,9 +128,8 @@
         val text = "a"
         val paragraph = Paragraph(text)
 
-        assertThat(
-            paragraph.getBoundingBoxes(TextRange(0, text.length))
-        ).isEqualToWithTolerance(ltrCharacterBoundariesForTestFont(text))
+        assertThat(paragraph.getBoundingBoxes(TextRange(0, text.length)))
+            .isEqualToWithTolerance(ltrCharacterBoundariesForTestFont(text))
     }
 
     @Test
@@ -171,17 +169,15 @@
         val paragraph1 = Paragraph(text, style = TextStyle(fontSize = fontSize))
         paragraph1.fillBoundingBoxes(range, array, 0)
 
-        assertThat(array.asRectArray()).isEqualToWithTolerance(
-            ltrCharacterBoundariesForTestFont(text, fontSizeInPx)
-        )
+        assertThat(array.asRectArray())
+            .isEqualToWithTolerance(ltrCharacterBoundariesForTestFont(text, fontSizeInPx))
 
         val paragraph2 = Paragraph(text, style = TextStyle(fontSize = (fontSize * 2)))
         paragraph2.fillBoundingBoxes(range, array, 0)
 
         // the same array is overridden with new and different values
-        assertThat(array.asRectArray()).isEqualToWithTolerance(
-            ltrCharacterBoundariesForTestFont(text, fontSizeInPx * 2)
-        )
+        assertThat(array.asRectArray())
+            .isEqualToWithTolerance(ltrCharacterBoundariesForTestFont(text, fontSizeInPx * 2))
     }
 
     @Test
@@ -192,9 +188,8 @@
 
         // first line line height is ignored, therefore the result is the same as without line
         // height
-        assertThat(
-            paragraph.getBoundingBoxes(TextRange(0, text.length))
-        ).isEqualToWithTolerance(ltrCharacterBoundariesForTestFont(text))
+        assertThat(paragraph.getBoundingBoxes(TextRange(0, text.length)))
+            .isEqualToWithTolerance(ltrCharacterBoundariesForTestFont(text))
     }
 
     @Test
@@ -202,29 +197,27 @@
         val lineHeight = fontSize * 2
         val lineHeightInPx = with(defaultDensity) { lineHeight.toPx() }
         val text = "a"
-        val paragraph = Paragraph(
-            text,
-            style = TextStyle(
-                lineHeight = lineHeight,
-                platformStyle = @Suppress("DEPRECATION") PlatformTextStyle(
-                    includeFontPadding = false
-                ),
-                lineHeightStyle = LineHeightStyle(
-                    alignment = Alignment.Proportional,
-                    trim = Trim.None
-                )
-            ),
-        )
-
-        assertThat(
-            paragraph.getBoundingBoxes(TextRange(0, text.length))
-        ).isEqualToWithTolerance(
-            ltrCharacterBoundariesForTestFont(
-                text = text,
-                fontSizeInPx = fontSizeInPx,
-                lineHeightInPx = lineHeightInPx
+        val paragraph =
+            Paragraph(
+                text,
+                style =
+                    TextStyle(
+                        lineHeight = lineHeight,
+                        platformStyle =
+                            @Suppress("DEPRECATION") PlatformTextStyle(includeFontPadding = false),
+                        lineHeightStyle =
+                            LineHeightStyle(alignment = Alignment.Proportional, trim = Trim.None)
+                    ),
             )
-        )
+
+        assertThat(paragraph.getBoundingBoxes(TextRange(0, text.length)))
+            .isEqualToWithTolerance(
+                ltrCharacterBoundariesForTestFont(
+                    text = text,
+                    fontSizeInPx = fontSizeInPx,
+                    lineHeightInPx = lineHeightInPx
+                )
+            )
     }
 
     @Test
@@ -233,44 +226,42 @@
         val lineHeightInPx = with(defaultDensity) { lineHeight.toPx() }
         val text = "a\na\na"
         @Suppress("DEPRECATION")
-        val paragraph = Paragraph(
-            text,
-            style = TextStyle(
-                lineHeight = lineHeight,
-                lineHeightStyle = LineHeightStyle(
-                    alignment = Alignment.Proportional,
-                    trim = Trim.None
-                ),
-                platformStyle = @Suppress("DEPRECATION") PlatformTextStyle(
-                    includeFontPadding = false
+        val paragraph =
+            Paragraph(
+                text,
+                style =
+                    TextStyle(
+                        lineHeight = lineHeight,
+                        lineHeightStyle =
+                            LineHeightStyle(alignment = Alignment.Proportional, trim = Trim.None),
+                        platformStyle =
+                            @Suppress("DEPRECATION") PlatformTextStyle(includeFontPadding = false)
+                    )
+            )
+
+        assertThat(paragraph.getBoundingBoxes(TextRange(0, text.length)))
+            .isEqualToWithTolerance(
+                ltrCharacterBoundariesForTestFont(
+                    text = text,
+                    fontSizeInPx = fontSizeInPx,
+                    lineHeightInPx = lineHeightInPx
                 )
             )
-        )
-
-        assertThat(
-            paragraph.getBoundingBoxes(TextRange(0, text.length))
-        ).isEqualToWithTolerance(
-            ltrCharacterBoundariesForTestFont(
-                text = text,
-                fontSizeInPx = fontSizeInPx,
-                lineHeightInPx = lineHeightInPx
-            )
-        )
     }
 
     @Test
     fun singleCharacterRtl() {
         val text = "\u05D0"
         val width = text.length * 2 * fontSizeInPx // a width wider than text
-        val paragraph = Paragraph(
-            text = text,
-            width = width,
-            style = TextStyle(textDirection = TextDirection.Content)
-        )
+        val paragraph =
+            Paragraph(
+                text = text,
+                width = width,
+                style = TextStyle(textDirection = TextDirection.Content)
+            )
 
-        assertThat(
-            paragraph.getBoundingBoxes(TextRange(0, text.length))
-        ).isEqualToWithTolerance(rtlCharacterBoundariesForTestFont(text, width))
+        assertThat(paragraph.getBoundingBoxes(TextRange(0, text.length)))
+            .isEqualToWithTolerance(rtlCharacterBoundariesForTestFont(text, width))
     }
 
     @Test
@@ -278,9 +269,8 @@
         val text = "abc"
         val paragraph = Paragraph(text)
 
-        assertThat(
-            paragraph.getBoundingBoxes(TextRange(0, text.length))
-        ).isEqualToWithTolerance(ltrCharacterBoundariesForTestFont(text))
+        assertThat(paragraph.getBoundingBoxes(TextRange(0, text.length)))
+            .isEqualToWithTolerance(ltrCharacterBoundariesForTestFont(text))
     }
 
     @Test
@@ -289,9 +279,8 @@
         val width = text.length * 2 * fontSizeInPx // a width wider than text
         val paragraph = Paragraph(text, width = width)
 
-        assertThat(
-            paragraph.getBoundingBoxes(TextRange(0, text.length))
-        ).isEqualToWithTolerance(rtlCharacterBoundariesForTestFont(text, width))
+        assertThat(paragraph.getBoundingBoxes(TextRange(0, text.length)))
+            .isEqualToWithTolerance(rtlCharacterBoundariesForTestFont(text, width))
     }
 
     @Test
@@ -301,9 +290,8 @@
 
         val expected = ltrCharacterBoundariesForTestFont(text)
         // text with indices 0123 is rendered as 0213
-        assertThat(
-            paragraph.getBoundingBoxes(TextRange(0, text.length))
-        ).isEqualToWithTolerance(arrayOf(expected[0], expected[2], expected[1], expected[3]))
+        assertThat(paragraph.getBoundingBoxes(TextRange(0, text.length)))
+            .isEqualToWithTolerance(arrayOf(expected[0], expected[2], expected[1], expected[3]))
     }
 
     @Test
@@ -314,9 +302,8 @@
 
         val expected = rtlCharacterBoundariesForTestFont(text, width)
         // text with indices 0123 is rendered as 3120
-        assertThat(
-            paragraph.getBoundingBoxes(TextRange(0, text.length))
-        ).isEqualToWithTolerance(arrayOf(expected[0], expected[2], expected[1], expected[3]))
+        assertThat(paragraph.getBoundingBoxes(TextRange(0, text.length)))
+            .isEqualToWithTolerance(arrayOf(expected[0], expected[2], expected[1], expected[3]))
     }
 
     @Test
@@ -324,9 +311,8 @@
         val text = "a\nb\nc"
         val paragraph = Paragraph(text)
 
-        assertThat(
-            paragraph.getBoundingBoxes(TextRange(0, text.length))
-        ).isEqualToWithTolerance(ltrCharacterBoundariesForTestFont(text))
+        assertThat(paragraph.getBoundingBoxes(TextRange(0, text.length)))
+            .isEqualToWithTolerance(ltrCharacterBoundariesForTestFont(text))
     }
 
     @Test
@@ -335,9 +321,8 @@
         val width = 3 * fontSizeInPx // a width wider than paragraph
         val paragraph = Paragraph(width = width, text = text)
 
-        assertThat(
-            paragraph.getBoundingBoxes(TextRange(0, text.length))
-        ).isEqualToWithTolerance(rtlCharacterBoundariesForTestFont(text, width))
+        assertThat(paragraph.getBoundingBoxes(TextRange(0, text.length)))
+            .isEqualToWithTolerance(rtlCharacterBoundariesForTestFont(text, width))
     }
 
     @Test
@@ -356,9 +341,10 @@
         val initialRect = expected[0]
         assertThat(initialRect.width).isNonZero()
         for (index in 1 until expected.size) {
-            assertThat(expected[index]).isEqualToWithTolerance(
-                Rect(initialRect.right, initialRect.top, initialRect.right, initialRect.bottom)
-            )
+            assertThat(expected[index])
+                .isEqualToWithTolerance(
+                    Rect(initialRect.right, initialRect.top, initialRect.right, initialRect.bottom)
+                )
         }
     }
 
@@ -373,13 +359,15 @@
         val firstIndentInPx = with(defaultDensity) { firstIndent.toPx() }
         val restIndentInPx = with(defaultDensity) { restIndent.toPx() }
         val text = "abcd\ne"
-        val paragraph = Paragraph(
-            width = 3f * fontSizeInPx, // first indent is 2 char + 1 char will reach line break
-            text = text,
-            style = TextStyle(
-                textIndent = TextIndent(firstLine = firstIndent, restLine = restIndent)
+        val paragraph =
+            Paragraph(
+                width = 3f * fontSizeInPx, // first indent is 2 char + 1 char will reach line break
+                text = text,
+                style =
+                    TextStyle(
+                        textIndent = TextIndent(firstLine = firstIndent, restLine = restIndent)
+                    )
             )
-        )
 
         // will be rendered as
         // _ _ a
@@ -389,34 +377,33 @@
         val firstLeft = firstIndentInPx
         val restLeft = restIndentInPx
 
-        assertThat(
-            paragraph.getBoundingBoxes(TextRange(0, text.length))
-        ).isEqualToWithTolerance(
-            arrayOf(
-                // a
-                Rect(firstLeft, 0f, firstLeft + fontSizeInPx, fontSizeInPx),
-                // b
-                Rect(restLeft, fontSizeInPx, restLeft + fontSizeInPx, 2 * fontSizeInPx),
-                // c
-                Rect(
-                    restLeft + fontSizeInPx,
-                    fontSizeInPx,
-                    restLeft + 2 * fontSizeInPx,
-                    2 * fontSizeInPx
-                ),
-                // d
-                Rect(restLeft, 2 * fontSizeInPx, restLeft + fontSizeInPx, 3 * fontSizeInPx),
-                // \n
-                Rect(
-                    restLeft + fontSizeInPx,
-                    2 * fontSizeInPx,
-                    restLeft + fontSizeInPx,
-                    3 * fontSizeInPx
-                ),
-                // e
-                Rect(firstLeft, 3 * fontSizeInPx, firstLeft + fontSizeInPx, 4 * fontSizeInPx),
+        assertThat(paragraph.getBoundingBoxes(TextRange(0, text.length)))
+            .isEqualToWithTolerance(
+                arrayOf(
+                    // a
+                    Rect(firstLeft, 0f, firstLeft + fontSizeInPx, fontSizeInPx),
+                    // b
+                    Rect(restLeft, fontSizeInPx, restLeft + fontSizeInPx, 2 * fontSizeInPx),
+                    // c
+                    Rect(
+                        restLeft + fontSizeInPx,
+                        fontSizeInPx,
+                        restLeft + 2 * fontSizeInPx,
+                        2 * fontSizeInPx
+                    ),
+                    // d
+                    Rect(restLeft, 2 * fontSizeInPx, restLeft + fontSizeInPx, 3 * fontSizeInPx),
+                    // \n
+                    Rect(
+                        restLeft + fontSizeInPx,
+                        2 * fontSizeInPx,
+                        restLeft + fontSizeInPx,
+                        3 * fontSizeInPx
+                    ),
+                    // e
+                    Rect(firstLeft, 3 * fontSizeInPx, firstLeft + fontSizeInPx, 4 * fontSizeInPx),
+                )
             )
-        )
     }
 
     @Test
@@ -425,170 +412,177 @@
         val doubleFontSizeInPx = with(defaultDensity) { doubleFontSize.toPx() }
         val text = buildAnnotatedString {
             append("a")
-            withStyle(SpanStyle(fontSize = doubleFontSize)) {
-                append("b")
-            }
+            withStyle(SpanStyle(fontSize = doubleFontSize)) { append("b") }
             append("c")
             toAnnotatedString()
         }
         val paragraph = Paragraph(text)
 
-        assertThat(
-            paragraph.getBoundingBoxes(TextRange(0, text.length))
-        ).isEqualToWithTolerance(
-            arrayOf(
-                // 1 width for a, height is doubleFontSize since line metrics change
-                Rect(0f, 0f, fontSizeInPx, doubleFontSizeInPx),
-                // 2 width for b
-                Rect(fontSizeInPx, 0f, 3 * fontSizeInPx, doubleFontSizeInPx),
-                // 1 width for c
-                Rect(3 * fontSizeInPx, 0f, 4 * fontSizeInPx, doubleFontSizeInPx)
+        assertThat(paragraph.getBoundingBoxes(TextRange(0, text.length)))
+            .isEqualToWithTolerance(
+                arrayOf(
+                    // 1 width for a, height is doubleFontSize since line metrics change
+                    Rect(0f, 0f, fontSizeInPx, doubleFontSizeInPx),
+                    // 2 width for b
+                    Rect(fontSizeInPx, 0f, 3 * fontSizeInPx, doubleFontSizeInPx),
+                    // 1 width for c
+                    Rect(3 * fontSizeInPx, 0f, 4 * fontSizeInPx, doubleFontSizeInPx)
+                )
             )
-        )
     }
 
     @Test
     fun letterSpacing() {
         val text = "abc\nde"
-        val paragraph = Paragraph(
-            text = text,
-            style = TextStyle(letterSpacing = 1.em)
-        )
+        val paragraph = Paragraph(text = text, style = TextStyle(letterSpacing = 1.em))
 
-        assertThat(
-            paragraph.getBoundingBoxes(TextRange(0, text.length))
-        ).isEqualToWithTolerance(
-            if (hasEdgeLetterSpacingBugFix()) {
-                // If the letter spacing bugfix is included, the first and last letters in a line
-                // will not have leading and trailing letter spacing.
-                val letterSpaceHalf = fontSizeInPx / 2
-                arrayOf(
-                    // a
-                    Rect(0f,
-                        0f,
-                        2 * fontSizeInPx - letterSpaceHalf, // left letter spacing is not added.
-                        fontSizeInPx),
-                    // b
-                    Rect(2 * fontSizeInPx - letterSpaceHalf, // the prev letter width is half letter
-                                                             // spacing smaller because there is no
-                                                             // left letter spacing.
-                        0f,
-                        4 * fontSizeInPx - letterSpaceHalf,
-                        fontSizeInPx),
-                    // c
-                    Rect(4 * fontSizeInPx - letterSpaceHalf,
-                        0f,
-                        6 * fontSizeInPx - letterSpaceHalf * 2, // right letter spacing is not
-                                                                // added.
-                        fontSizeInPx),
-                    // \n
-                    Rect(6 * fontSizeInPx - letterSpaceHalf * 2,
-                        0f,
-                        6 * fontSizeInPx - letterSpaceHalf * 2,
-                        fontSizeInPx),
-                    // c
-                    Rect(0f,
-                        fontSizeInPx,
-                        2 * fontSizeInPx - letterSpaceHalf, // left letter spacing is not added.
-                        2 * fontSizeInPx),
-                    // d
-                    Rect(2 * fontSizeInPx - letterSpaceHalf,
-                        fontSizeInPx,
-                        4 * fontSizeInPx - letterSpaceHalf * 2,
-                        2 * fontSizeInPx)
-                )
-            } else {
-                arrayOf(
-                    // a
-                    Rect(0f, 0f, 2 * fontSizeInPx, fontSizeInPx),
-                    // b
-                    Rect(2 * fontSizeInPx, 0f, 4 * fontSizeInPx, fontSizeInPx),
-                    // c
-                    Rect(4 * fontSizeInPx, 0f, 6 * fontSizeInPx, fontSizeInPx),
-                    // \n
-                    Rect(6 * fontSizeInPx, 0f, 6 * fontSizeInPx, fontSizeInPx),
-                    // c
-                    Rect(0f, fontSizeInPx, 2 * fontSizeInPx, 2 * fontSizeInPx),
-                    // d
-                    Rect(2 * fontSizeInPx, fontSizeInPx, 4 * fontSizeInPx, 2 * fontSizeInPx)
-                )
-            }
-        )
+        assertThat(paragraph.getBoundingBoxes(TextRange(0, text.length)))
+            .isEqualToWithTolerance(
+                if (hasEdgeLetterSpacingBugFix()) {
+                    // If the letter spacing bugfix is included, the first and last letters in a
+                    // line
+                    // will not have leading and trailing letter spacing.
+                    val letterSpaceHalf = fontSizeInPx / 2
+                    arrayOf(
+                        // a
+                        Rect(
+                            0f,
+                            0f,
+                            2 * fontSizeInPx - letterSpaceHalf, // left letter spacing is not added.
+                            fontSizeInPx
+                        ),
+                        // b
+                        Rect(
+                            2 * fontSizeInPx -
+                                letterSpaceHalf, // the prev letter width is half letter
+                            // spacing smaller because there is no
+                            // left letter spacing.
+                            0f,
+                            4 * fontSizeInPx - letterSpaceHalf,
+                            fontSizeInPx
+                        ),
+                        // c
+                        Rect(
+                            4 * fontSizeInPx - letterSpaceHalf,
+                            0f,
+                            6 * fontSizeInPx - letterSpaceHalf * 2, // right letter spacing is not
+                            // added.
+                            fontSizeInPx
+                        ),
+                        // \n
+                        Rect(
+                            6 * fontSizeInPx - letterSpaceHalf * 2,
+                            0f,
+                            6 * fontSizeInPx - letterSpaceHalf * 2,
+                            fontSizeInPx
+                        ),
+                        // c
+                        Rect(
+                            0f,
+                            fontSizeInPx,
+                            2 * fontSizeInPx - letterSpaceHalf, // left letter spacing is not added.
+                            2 * fontSizeInPx
+                        ),
+                        // d
+                        Rect(
+                            2 * fontSizeInPx - letterSpaceHalf,
+                            fontSizeInPx,
+                            4 * fontSizeInPx - letterSpaceHalf * 2,
+                            2 * fontSizeInPx
+                        )
+                    )
+                } else {
+                    arrayOf(
+                        // a
+                        Rect(0f, 0f, 2 * fontSizeInPx, fontSizeInPx),
+                        // b
+                        Rect(2 * fontSizeInPx, 0f, 4 * fontSizeInPx, fontSizeInPx),
+                        // c
+                        Rect(4 * fontSizeInPx, 0f, 6 * fontSizeInPx, fontSizeInPx),
+                        // \n
+                        Rect(6 * fontSizeInPx, 0f, 6 * fontSizeInPx, fontSizeInPx),
+                        // c
+                        Rect(0f, fontSizeInPx, 2 * fontSizeInPx, 2 * fontSizeInPx),
+                        // d
+                        Rect(2 * fontSizeInPx, fontSizeInPx, 4 * fontSizeInPx, 2 * fontSizeInPx)
+                    )
+                }
+            )
     }
 
     @Test
     fun textAlignCenter() {
         val text = "ab"
-        val paragraph = Paragraph(
-            width = text.length * fontSizeInPx * 2,
-            text = text,
-            style = TextStyle(textAlign = TextAlign.Center)
-        )
-
-        assertThat(
-            paragraph.getBoundingBoxes(TextRange(0, text.length))
-        ).isEqualToWithTolerance(
-            arrayOf(
-                Rect(fontSizeInPx, 0f, 2 * fontSizeInPx, fontSizeInPx),
-                Rect(2 * fontSizeInPx, 0f, 3 * fontSizeInPx, fontSizeInPx),
+        val paragraph =
+            Paragraph(
+                width = text.length * fontSizeInPx * 2,
+                text = text,
+                style = TextStyle(textAlign = TextAlign.Center)
             )
-        )
+
+        assertThat(paragraph.getBoundingBoxes(TextRange(0, text.length)))
+            .isEqualToWithTolerance(
+                arrayOf(
+                    Rect(fontSizeInPx, 0f, 2 * fontSizeInPx, fontSizeInPx),
+                    Rect(2 * fontSizeInPx, 0f, 3 * fontSizeInPx, fontSizeInPx),
+                )
+            )
     }
 
     @Test
     fun textAlignEnd() {
         val text = "ab"
-        val paragraph = Paragraph(
-            width = text.length * fontSizeInPx * 2,
-            text = text,
-            style = TextStyle(textAlign = TextAlign.End)
-        )
-
-        assertThat(
-            paragraph.getBoundingBoxes(TextRange(0, text.length))
-        ).isEqualToWithTolerance(
-            arrayOf(
-                Rect(2 * fontSizeInPx, 0f, 3 * fontSizeInPx, fontSizeInPx),
-                Rect(3 * fontSizeInPx, 0f, 4 * fontSizeInPx, fontSizeInPx),
+        val paragraph =
+            Paragraph(
+                width = text.length * fontSizeInPx * 2,
+                text = text,
+                style = TextStyle(textAlign = TextAlign.End)
             )
-        )
+
+        assertThat(paragraph.getBoundingBoxes(TextRange(0, text.length)))
+            .isEqualToWithTolerance(
+                arrayOf(
+                    Rect(2 * fontSizeInPx, 0f, 3 * fontSizeInPx, fontSizeInPx),
+                    Rect(3 * fontSizeInPx, 0f, 4 * fontSizeInPx, fontSizeInPx),
+                )
+            )
     }
 
     @Test
     fun withTextGeometricTransformScaleX() {
         val text = "ab"
-        val paragraph = Paragraph(
-            text = text,
-            style = TextStyle(textGeometricTransform = TextGeometricTransform(scaleX = 2.0f))
-        )
-
-        assertThat(
-            paragraph.getBoundingBoxes(TextRange(0, text.length))
-        ).isEqualToWithTolerance(
-            arrayOf(
-                Rect(0f, 0f, 2 * fontSizeInPx, fontSizeInPx),
-                Rect(2 * fontSizeInPx, 0f, 4 * fontSizeInPx, fontSizeInPx)
+        val paragraph =
+            Paragraph(
+                text = text,
+                style = TextStyle(textGeometricTransform = TextGeometricTransform(scaleX = 2.0f))
             )
-        )
+
+        assertThat(paragraph.getBoundingBoxes(TextRange(0, text.length)))
+            .isEqualToWithTolerance(
+                arrayOf(
+                    Rect(0f, 0f, 2 * fontSizeInPx, fontSizeInPx),
+                    Rect(2 * fontSizeInPx, 0f, 4 * fontSizeInPx, fontSizeInPx)
+                )
+            )
     }
 
     @Test
     fun textGeometricTransformSkewX() {
         val text = "ab"
-        val paragraph = Paragraph(
-            text = text,
-            style = TextStyle(textGeometricTransform = TextGeometricTransform(skewX = -1f))
-        )
+        val paragraph =
+            Paragraph(
+                text = text,
+                style = TextStyle(textGeometricTransform = TextGeometricTransform(skewX = -1f))
+            )
 
         // skew does not change the boundary, character glyph goes outside of boundary
-        assertThat(
-            paragraph.getBoundingBoxes(TextRange(0, text.length))
-        ).isEqualToWithTolerance(
-            arrayOf(
-                Rect(0f, 0f, fontSizeInPx, fontSizeInPx),
-                Rect(fontSizeInPx, 0f, 2 * fontSizeInPx, fontSizeInPx)
+        assertThat(paragraph.getBoundingBoxes(TextRange(0, text.length)))
+            .isEqualToWithTolerance(
+                arrayOf(
+                    Rect(0f, 0f, fontSizeInPx, fontSizeInPx),
+                    Rect(fontSizeInPx, 0f, 2 * fontSizeInPx, fontSizeInPx)
+                )
             )
-        )
     }
 
     @Test
@@ -598,10 +592,7 @@
         val text = buildAnnotatedString {
             append("a")
             withStyle(
-                SpanStyle(
-                    baselineShift = BaselineShift.Superscript,
-                    fontSize = shiftedFontSize
-                )
+                SpanStyle(baselineShift = BaselineShift.Superscript, fontSize = shiftedFontSize)
             ) {
                 append("b")
             }
@@ -613,18 +604,17 @@
         val shiftedStart = fontSizeInPx
         val shiftedEnd = shiftedStart + shiftedFontSizeInPx
         // shifted bottom and top still points to line bottom and top
-        assertThat(
-            paragraph.getBoundingBoxes(TextRange(0, text.length))
-        ).isEqualToWithTolerance(
-            arrayOf(
-                // a
-                Rect(0f, 0f, fontSizeInPx, fontSizeInPx),
-                // b
-                Rect(shiftedStart, 0f, shiftedEnd, fontSizeInPx),
-                // c
-                Rect(shiftedEnd, 0f, shiftedEnd + fontSizeInPx, fontSizeInPx)
+        assertThat(paragraph.getBoundingBoxes(TextRange(0, text.length)))
+            .isEqualToWithTolerance(
+                arrayOf(
+                    // a
+                    Rect(0f, 0f, fontSizeInPx, fontSizeInPx),
+                    // b
+                    Rect(shiftedStart, 0f, shiftedEnd, fontSizeInPx),
+                    // c
+                    Rect(shiftedEnd, 0f, shiftedEnd + fontSizeInPx, fontSizeInPx)
+                )
             )
-        )
     }
 
     @Test
@@ -632,30 +622,32 @@
         val doubleFontSize = fontSize * 2
         val doubleFontSizeInPx = with(defaultDensity) { doubleFontSize.toPx() }
         val text = "abc"
-        val paragraph = Paragraph(
-            text = text,
-            placeholders = listOf(
-                AnnotatedString.Range(
-                    item = Placeholder(
-                        width = doubleFontSize,
-                        height = doubleFontSize,
-                        placeholderVerticalAlign = PlaceholderVerticalAlign.Top
-                    ),
-                    start = 1,
-                    end = 2
+        val paragraph =
+            Paragraph(
+                text = text,
+                placeholders =
+                    listOf(
+                        AnnotatedString.Range(
+                            item =
+                                Placeholder(
+                                    width = doubleFontSize,
+                                    height = doubleFontSize,
+                                    placeholderVerticalAlign = PlaceholderVerticalAlign.Top
+                                ),
+                            start = 1,
+                            end = 2
+                        )
+                    )
+            )
+
+        assertThat(paragraph.getBoundingBoxes(TextRange(0, text.length)))
+            .isEqualToWithTolerance(
+                arrayOf(
+                    Rect(0f, 0f, fontSizeInPx, doubleFontSizeInPx),
+                    Rect(fontSizeInPx, 0f, 3 * fontSizeInPx, doubleFontSizeInPx),
+                    Rect(3 * fontSizeInPx, 0f, 4 * fontSizeInPx, doubleFontSizeInPx)
                 )
             )
-        )
-
-        assertThat(
-            paragraph.getBoundingBoxes(TextRange(0, text.length))
-        ).isEqualToWithTolerance(
-            arrayOf(
-                Rect(0f, 0f, fontSizeInPx, doubleFontSizeInPx),
-                Rect(fontSizeInPx, 0f, 3 * fontSizeInPx, doubleFontSizeInPx),
-                Rect(3 * fontSizeInPx, 0f, 4 * fontSizeInPx, doubleFontSizeInPx)
-            )
-        )
     }
 
     private fun AndroidParagraph.getBoundingBoxes(range: TextRange): Array<Rect> {
@@ -692,11 +684,13 @@
     ): AndroidParagraph {
         return Paragraph(
             text = text.text,
-            style = TextStyle(
-                fontSize = fontSize,
-                fontFamily = fontFamilyMeasureFont,
-                textDirection = TextDirection.Content
-            ).merge(style),
+            style =
+                TextStyle(
+                        fontSize = fontSize,
+                        fontFamily = fontFamilyMeasureFont,
+                        textDirection = TextDirection.Content
+                    )
+                    .merge(style),
             spanStyles = text.spanStyles,
             placeholders = placeholders,
             maxLines = Int.MAX_VALUE,
@@ -704,6 +698,7 @@
             constraints = Constraints(maxWidth = width.ceilToInt()),
             density = defaultDensity,
             fontFamilyResolver = fontFamilyResolver
-        ) as AndroidParagraph
+        )
+            as AndroidParagraph
     }
 }
diff --git a/compose/ui/ui-text/src/androidInstrumentedTest/kotlin/androidx/compose/ui/text/ParagraphIntegrationBoundingBoxTest.kt b/compose/ui/ui-text/src/androidInstrumentedTest/kotlin/androidx/compose/ui/text/ParagraphIntegrationBoundingBoxTest.kt
index 4bcf7d6..7c2fa58 100644
--- a/compose/ui/ui-text/src/androidInstrumentedTest/kotlin/androidx/compose/ui/text/ParagraphIntegrationBoundingBoxTest.kt
+++ b/compose/ui/ui-text/src/androidInstrumentedTest/kotlin/androidx/compose/ui/text/ParagraphIntegrationBoundingBoxTest.kt
@@ -55,11 +55,12 @@
     @Test
     fun ltr_noBreak_noMaxLines_smallWidth_smallHeight() {
         testParagraph(
-            textDirection = TextDirection.Ltr,
-            lineBreakFrom = LineBreakFrom.No,
-            widthInFontSize = 3,
-            heightIntFontSize = 1
-        ).assertBoxLRTB(
+                textDirection = TextDirection.Ltr,
+                lineBreakFrom = LineBreakFrom.No,
+                widthInFontSize = 3,
+                heightIntFontSize = 1
+            )
+            .assertBoxLRTB(
                 offset = 5,
                 left = fontSizeInPx * 3,
                 right = fontSizeInPx * 3,
@@ -95,12 +96,12 @@
     @Test
     fun ltr_noBreak_1MaxLines_smallWidth_smallHeight() {
         testParagraph(
-            TextDirection.Ltr,
-            LineBreakFrom.No,
-            widthInFontSize = 3,
-            heightIntFontSize = 1,
-            maxLines = 1
-        )
+                TextDirection.Ltr,
+                LineBreakFrom.No,
+                widthInFontSize = 3,
+                heightIntFontSize = 1,
+                maxLines = 1
+            )
             .assertBoxLRTB(
                 offset = 5,
                 left = fontSizeInPx * 3,
@@ -125,11 +126,11 @@
     @Test
     fun ltr_firstBreak_noMaxLines_smallWidth_smallHeight() {
         testParagraph(
-            TextDirection.Ltr,
-            LineBreakFrom.First,
-            widthInFontSize = 3,
-            heightIntFontSize = 1
-        )
+                TextDirection.Ltr,
+                LineBreakFrom.First,
+                widthInFontSize = 3,
+                heightIntFontSize = 1
+            )
             .assertBoxLRTB(
                 offset = 5,
                 left = fontSizeInPx * 3,
@@ -166,12 +167,12 @@
     @Test
     fun ltr_firstBreak_1MaxLines_smallWidth_smallHeight() {
         testParagraph(
-            TextDirection.Ltr,
-            LineBreakFrom.First,
-            widthInFontSize = 3,
-            heightIntFontSize = 1,
-            maxLines = 1
-        )
+                TextDirection.Ltr,
+                LineBreakFrom.First,
+                widthInFontSize = 3,
+                heightIntFontSize = 1,
+                maxLines = 1
+            )
             .assertBoxLRTB(
                 offset = 5,
                 left = fontSizeInPx * 3,
@@ -184,11 +185,11 @@
     @Test
     fun ltr_secondBreak_noMaxLines_smallWidth_smallHeight() {
         testParagraph(
-            TextDirection.Ltr,
-            LineBreakFrom.Second,
-            widthInFontSize = 3,
-            heightIntFontSize = 1
-        )
+                TextDirection.Ltr,
+                LineBreakFrom.Second,
+                widthInFontSize = 3,
+                heightIntFontSize = 1
+            )
             .assertBoxLRTB(
                 offset = 9,
                 left = fontSizeInPx * 3,
@@ -225,12 +226,12 @@
     @Test
     fun ltr_secondBreak_1MaxLines_smallWidth_smallHeight() {
         testParagraph(
-            TextDirection.Ltr,
-            LineBreakFrom.Second,
-            widthInFontSize = 3,
-            heightIntFontSize = 1,
-            maxLines = 1
-        )
+                TextDirection.Ltr,
+                LineBreakFrom.Second,
+                widthInFontSize = 3,
+                heightIntFontSize = 1,
+                maxLines = 1
+            )
             .assertBoxLRTB(
                 offset = 9,
                 left = fontSizeInPx * 3,
@@ -255,18 +256,12 @@
     @Test
     fun rtl_noBreak_noMaxLines_smallWidth_smallHeight() {
         testParagraph(
-            textDirection = TextDirection.Rtl,
-            lineBreakFrom = LineBreakFrom.No,
-            widthInFontSize = 3,
-            heightIntFontSize = 1
-        )
-            .assertBoxLRTB(
-                offset = 5,
-                left = 0,
-                right = 0,
-                top = 0,
-                bottom = fontSizeInPx
+                textDirection = TextDirection.Rtl,
+                lineBreakFrom = LineBreakFrom.No,
+                widthInFontSize = 3,
+                heightIntFontSize = 1
             )
+            .assertBoxLRTB(offset = 5, left = 0, right = 0, top = 0, bottom = fontSizeInPx)
     }
 
     @Test
@@ -284,31 +279,19 @@
     @Test
     fun rtl_noBreak_1MaxLines_smallWidth_noHeight() {
         testParagraph(TextDirection.Rtl, LineBreakFrom.No, widthInFontSize = 3, maxLines = 1)
-            .assertBoxLRTB(
-                offset = 5,
-                left = 0,
-                right = 0,
-                top = 0,
-                bottom = fontSizeInPx
-            )
+            .assertBoxLRTB(offset = 5, left = 0, right = 0, top = 0, bottom = fontSizeInPx)
     }
 
     @Test
     fun rtl_noBreak_1MaxLines_smallWidth_smallHeight() {
         testParagraph(
-            TextDirection.Rtl,
-            LineBreakFrom.No,
-            widthInFontSize = 3,
-            heightIntFontSize = 1,
-            maxLines = 1
-        )
-            .assertBoxLRTB(
-                offset = 5,
-                left = 0,
-                right = 0,
-                top = 0,
-                bottom = fontSizeInPx
+                TextDirection.Rtl,
+                LineBreakFrom.No,
+                widthInFontSize = 3,
+                heightIntFontSize = 1,
+                maxLines = 1
             )
+            .assertBoxLRTB(offset = 5, left = 0, right = 0, top = 0, bottom = fontSizeInPx)
     }
 
     @Test
@@ -326,18 +309,12 @@
     @Test
     fun rtl_firstBreak_noMaxLines_smallWidth_smallHeight() {
         testParagraph(
-            TextDirection.Rtl,
-            LineBreakFrom.First,
-            widthInFontSize = 3,
-            heightIntFontSize = 1
-        )
-            .assertBoxLRTB(
-                offset = 5,
-                left = 0,
-                right = 0,
-                top = 0,
-                bottom = fontSizeInPx
+                TextDirection.Rtl,
+                LineBreakFrom.First,
+                widthInFontSize = 3,
+                heightIntFontSize = 1
             )
+            .assertBoxLRTB(offset = 5, left = 0, right = 0, top = 0, bottom = fontSizeInPx)
     }
 
     @Test
@@ -355,31 +332,19 @@
     @Test
     fun rtl_firstBreak_1MaxLines_smallWidth_noHeight() {
         testParagraph(TextDirection.Rtl, LineBreakFrom.First, widthInFontSize = 3, maxLines = 1)
-            .assertBoxLRTB(
-                offset = 5,
-                left = 0,
-                right = 0,
-                top = 0,
-                bottom = fontSizeInPx
-            )
+            .assertBoxLRTB(offset = 5, left = 0, right = 0, top = 0, bottom = fontSizeInPx)
     }
 
     @Test
     fun rtl_firstBreak_1MaxLines_smallWidth_smallHeight() {
         testParagraph(
-            TextDirection.Rtl,
-            LineBreakFrom.First,
-            widthInFontSize = 3,
-            heightIntFontSize = 1,
-            maxLines = 1
-        )
-            .assertBoxLRTB(
-                offset = 5,
-                left = 0,
-                right = 0,
-                top = 0,
-                bottom = fontSizeInPx
+                TextDirection.Rtl,
+                LineBreakFrom.First,
+                widthInFontSize = 3,
+                heightIntFontSize = 1,
+                maxLines = 1
             )
+            .assertBoxLRTB(offset = 5, left = 0, right = 0, top = 0, bottom = fontSizeInPx)
     }
 
     private fun testParagraph(
@@ -388,26 +353,22 @@
         widthInFontSize: Int,
         heightIntFontSize: Int? = null,
         maxLines: Int = Int.MAX_VALUE
-    ) = Paragraph(
-        text = TEST_CONTENT_MAP[textDirection]!![lineBreakFrom]!!,
-        style = TextStyle(fontFamily = fontFamilyMeasureFont, fontSize = fontSize),
-        maxLines = maxLines,
-        ellipsis = true,
-        constraints = Constraints(
-            maxWidth = (widthInFontSize * fontSizeInPx),
-            maxHeight = (heightIntFontSize?.times(fontSizeInPx)) ?: Constraints.Infinity,
-        ),
-        density = defaultDensity,
-        fontFamilyResolver = fontFamilyResolver
-    )
+    ) =
+        Paragraph(
+            text = TEST_CONTENT_MAP[textDirection]!![lineBreakFrom]!!,
+            style = TextStyle(fontFamily = fontFamilyMeasureFont, fontSize = fontSize),
+            maxLines = maxLines,
+            ellipsis = true,
+            constraints =
+                Constraints(
+                    maxWidth = (widthInFontSize * fontSizeInPx),
+                    maxHeight = (heightIntFontSize?.times(fontSizeInPx)) ?: Constraints.Infinity,
+                ),
+            density = defaultDensity,
+            fontFamilyResolver = fontFamilyResolver
+        )
 
-    private fun Paragraph.assertBoxLRTB(
-        offset: Int,
-        left: Int,
-        right: Int,
-        top: Int,
-        bottom: Int
-    ) {
+    private fun Paragraph.assertBoxLRTB(offset: Int, left: Int, right: Int, top: Int, bottom: Int) {
         val box = getBoundingBox(offset)
         assertThat(box.left).isEqualTo(left)
         assertThat(box.right).isEqualTo(right)
@@ -422,15 +383,18 @@
     Second
 }
 
-private val TEST_CONTENT_MAP = mapOf(
-    TextDirection.Ltr to mapOf(
-        LineBreakFrom.No to "abc def abc",
-        LineBreakFrom.First to "abc\ndef abc",
-        LineBreakFrom.Second to "abc def\nabc",
-    ),
-    TextDirection.Rtl to mapOf(
-        LineBreakFrom.No to "\u05D0\u05D2\u05D2 \u05D3\u05D4\u05D5 \u05D0\u05D2\u05D2",
-        LineBreakFrom.First to "\u05D0\u05D2\u05D2\n\u05D3\u05D4\u05D5 \u05D0\u05D2\u05D2",
-        LineBreakFrom.Second to "\u05D0\u05D2\u05D2 \u05D3\u05D4\u05D5\n\u05D0\u05D2\u05D2",
+private val TEST_CONTENT_MAP =
+    mapOf(
+        TextDirection.Ltr to
+            mapOf(
+                LineBreakFrom.No to "abc def abc",
+                LineBreakFrom.First to "abc\ndef abc",
+                LineBreakFrom.Second to "abc def\nabc",
+            ),
+        TextDirection.Rtl to
+            mapOf(
+                LineBreakFrom.No to "\u05D0\u05D2\u05D2 \u05D3\u05D4\u05D5 \u05D0\u05D2\u05D2",
+                LineBreakFrom.First to "\u05D0\u05D2\u05D2\n\u05D3\u05D4\u05D5 \u05D0\u05D2\u05D2",
+                LineBreakFrom.Second to "\u05D0\u05D2\u05D2 \u05D3\u05D4\u05D5\n\u05D0\u05D2\u05D2",
+            )
     )
-)
diff --git a/compose/ui/ui-text/src/androidInstrumentedTest/kotlin/androidx/compose/ui/text/ParagraphIntegrationIndentationFixTest.kt b/compose/ui/ui-text/src/androidInstrumentedTest/kotlin/androidx/compose/ui/text/ParagraphIntegrationIndentationFixTest.kt
index 817ecec..e01f03d 100644
--- a/compose/ui/ui-text/src/androidInstrumentedTest/kotlin/androidx/compose/ui/text/ParagraphIntegrationIndentationFixTest.kt
+++ b/compose/ui/ui-text/src/androidInstrumentedTest/kotlin/androidx/compose/ui/text/ParagraphIntegrationIndentationFixTest.kt
@@ -49,13 +49,9 @@
 
     private fun hasEdgeLetterSpacingBugFix(): Boolean {
         val text = "a"
-        val singleLetterLetterSpacing = paragraph(
-            text = text,
-            letterSpacing = 10.sp)
+        val singleLetterLetterSpacing = paragraph(text = text, letterSpacing = 10.sp)
 
-        val singleLetterWithoutLetterSpacing = paragraph(
-            text = text,
-            letterSpacing = 0.sp)
+        val singleLetterWithoutLetterSpacing = paragraph(text = text, letterSpacing = 0.sp)
 
         // If the platform has a letter spacing fix, the letter spacing will not be added before and
         // after the visually left most letter and visually right most letter. Therefore, if the fix
@@ -96,10 +92,11 @@
     @SdkSuppress(minSdkVersion = 23) // b/266743243
     @Test
     fun getLineLeftAndGetLineRight_Ltr_TextIndent() {
-        val paragraph = paragraph(
-            text = ltrChar.repeat(repeatCount),
-            textIndent = TextIndent(firstLine = charWidth.sp, restLine = charWidth.sp)
-        )
+        val paragraph =
+            paragraph(
+                text = ltrChar.repeat(repeatCount),
+                textIndent = TextIndent(firstLine = charWidth.sp, restLine = charWidth.sp)
+            )
         for (line in 0 until paragraph.lineCount) {
             if (hasEdgeLetterSpacingBugFix()) {
                 assertThat(paragraph.getLineRight(line)).isEqualTo(paragraph.width)
@@ -127,23 +124,19 @@
                 // right most letters are omitted. Therefore the total line lengths becomes shorter
                 // and line starting positions becomes right because the paragraph is end (right)
                 // aligned.
-                assertThat(
-                    paragraph.getHorizontalPosition(offset, usePrimaryDirection = true)
-                ).isEqualTo(letterSpacing.toFloat())
+                assertThat(paragraph.getHorizontalPosition(offset, usePrimaryDirection = true))
+                    .isEqualTo(letterSpacing.toFloat())
 
-                assertThat(
-                    paragraph.getHorizontalPosition(offset, usePrimaryDirection = false)
-                ).isEqualTo(letterSpacing.toFloat())
+                assertThat(paragraph.getHorizontalPosition(offset, usePrimaryDirection = false))
+                    .isEqualTo(letterSpacing.toFloat())
             }
         } else {
             lineStartOffsets.forEach { offset ->
-                assertThat(
-                    paragraph.getHorizontalPosition(offset, usePrimaryDirection = true)
-                ).isEqualTo(0f)
+                assertThat(paragraph.getHorizontalPosition(offset, usePrimaryDirection = true))
+                    .isEqualTo(0f)
 
-                assertThat(
-                    paragraph.getHorizontalPosition(offset, usePrimaryDirection = false)
-                ).isEqualTo(0f)
+                assertThat(paragraph.getHorizontalPosition(offset, usePrimaryDirection = false))
+                    .isEqualTo(0f)
             }
         }
     }
@@ -157,23 +150,19 @@
                 // right most letters are omitted. Therefore the total line lengths becomes shorter
                 // and line starting positions becomes left because the paragraph is end (left)
                 // aligned.
-                assertThat(
-                    paragraph.getHorizontalPosition(offset, usePrimaryDirection = true)
-                ).isEqualTo(paragraph.width - letterSpacing.toFloat())
+                assertThat(paragraph.getHorizontalPosition(offset, usePrimaryDirection = true))
+                    .isEqualTo(paragraph.width - letterSpacing.toFloat())
 
-                assertThat(
-                    paragraph.getHorizontalPosition(offset, usePrimaryDirection = false)
-                ).isEqualTo(paragraph.width - letterSpacing.toFloat())
+                assertThat(paragraph.getHorizontalPosition(offset, usePrimaryDirection = false))
+                    .isEqualTo(paragraph.width - letterSpacing.toFloat())
             }
         } else {
             lineStartOffsets.forEach { offset ->
-                assertThat(
-                    paragraph.getHorizontalPosition(offset, usePrimaryDirection = true)
-                ).isEqualTo(paragraph.width)
+                assertThat(paragraph.getHorizontalPosition(offset, usePrimaryDirection = true))
+                    .isEqualTo(paragraph.width)
 
-                assertThat(
-                    paragraph.getHorizontalPosition(offset, usePrimaryDirection = false)
-                ).isEqualTo(paragraph.width)
+                assertThat(paragraph.getHorizontalPosition(offset, usePrimaryDirection = false))
+                    .isEqualTo(paragraph.width)
             }
         }
     }
@@ -182,9 +171,8 @@
     fun getOffsetForPosition_Ltr() {
         val paragraph = paragraph(ltrChar.repeat(repeatCount))
         for (line in 0 until paragraph.lineCount) {
-            assertThat(
-                paragraph.getOffsetForPosition(Offset(1f, line * fontSize + 1f))
-            ).isEqualTo(lineStartOffsets[line])
+            assertThat(paragraph.getOffsetForPosition(Offset(1f, line * fontSize + 1f)))
+                .isEqualTo(lineStartOffsets[line])
         }
     }
 
@@ -193,8 +181,11 @@
         val paragraph = paragraph(rtlChar.repeat(repeatCount))
         for (line in 0 until paragraph.lineCount) {
             assertThat(
-                paragraph.getOffsetForPosition(Offset(paragraph.width - 1f, line * fontSize + 1f))
-            ).isEqualTo(lineStartOffsets[line])
+                    paragraph.getOffsetForPosition(
+                        Offset(paragraph.width - 1f, line * fontSize + 1f)
+                    )
+                )
+                .isEqualTo(lineStartOffsets[line])
         }
     }
 
@@ -240,27 +231,29 @@
     @SdkSuppress(minSdkVersion = 23) // b/266743243
     @Test
     fun getLineLeftAndGetLineRight_Ltr_TextIndent_sp_letterspacing() {
-        val paragraph = paragraph(
-            text = ltrChar.repeat(repeatCount),
-            textIndent = TextIndent(firstLine = charWidth.sp, restLine = charWidth.sp),
-            letterSpacing = letterSpacing.sp
-        )
+        val paragraph =
+            paragraph(
+                text = ltrChar.repeat(repeatCount),
+                textIndent = TextIndent(firstLine = charWidth.sp, restLine = charWidth.sp),
+                letterSpacing = letterSpacing.sp
+            )
         for (line in 0 until paragraph.lineCount) {
             assertThat(paragraph.getLineRight(line)).isEqualTo(paragraph.width)
 
-            val expectedLeft = if (hasEdgeLetterSpacingBugFix()) {
-                 if (line == paragraph.lineCount - 1) {
-                    -fontSize + letterSpacing.toFloat() / 2
+            val expectedLeft =
+                if (hasEdgeLetterSpacingBugFix()) {
+                    if (line == paragraph.lineCount - 1) {
+                        -fontSize + letterSpacing.toFloat() / 2
+                    } else {
+                        letterSpacing
+                    }
                 } else {
-                    letterSpacing
+                    if (line == paragraph.lineCount - 1) {
+                        -fontSize - letterSpacing
+                    } else {
+                        0f
+                    }
                 }
-            } else {
-                if (line == paragraph.lineCount - 1) {
-                    -fontSize - letterSpacing
-                } else {
-                    0f
-                }
-            }
             assertThat(paragraph.getLineLeft(line)).isEqualTo(expectedLeft)
         }
     }
@@ -270,21 +263,17 @@
         val paragraph = paragraph(ltrChar.repeat(repeatCount), letterSpacing = letterSpacing.sp)
         lineStartOffsets.forEach { offset ->
             if (hasEdgeLetterSpacingBugFix()) {
-                assertThat(
-                    paragraph.getHorizontalPosition(offset, usePrimaryDirection = true)
-                ).isEqualTo(letterSpacing.toFloat())
+                assertThat(paragraph.getHorizontalPosition(offset, usePrimaryDirection = true))
+                    .isEqualTo(letterSpacing.toFloat())
 
-                assertThat(
-                    paragraph.getHorizontalPosition(offset, usePrimaryDirection = false)
-                ).isEqualTo(letterSpacing.toFloat())
+                assertThat(paragraph.getHorizontalPosition(offset, usePrimaryDirection = false))
+                    .isEqualTo(letterSpacing.toFloat())
             } else {
-                assertThat(
-                    paragraph.getHorizontalPosition(offset, usePrimaryDirection = true)
-                ).isEqualTo(0f)
+                assertThat(paragraph.getHorizontalPosition(offset, usePrimaryDirection = true))
+                    .isEqualTo(0f)
 
-                assertThat(
-                    paragraph.getHorizontalPosition(offset, usePrimaryDirection = false)
-                ).isEqualTo(0f)
+                assertThat(paragraph.getHorizontalPosition(offset, usePrimaryDirection = false))
+                    .isEqualTo(0f)
             }
         }
     }
@@ -294,21 +283,17 @@
         val paragraph = paragraph(rtlChar.repeat(repeatCount), letterSpacing = letterSpacing.sp)
         lineStartOffsets.forEach { offset ->
             if (hasEdgeLetterSpacingBugFix()) {
-                assertThat(
-                    paragraph.getHorizontalPosition(offset, usePrimaryDirection = true)
-                ).isEqualTo(paragraph.width - letterSpacing.toFloat())
+                assertThat(paragraph.getHorizontalPosition(offset, usePrimaryDirection = true))
+                    .isEqualTo(paragraph.width - letterSpacing.toFloat())
 
-                assertThat(
-                    paragraph.getHorizontalPosition(offset, usePrimaryDirection = false)
-                ).isEqualTo(paragraph.width - letterSpacing.toFloat())
+                assertThat(paragraph.getHorizontalPosition(offset, usePrimaryDirection = false))
+                    .isEqualTo(paragraph.width - letterSpacing.toFloat())
             } else {
-                assertThat(
-                    paragraph.getHorizontalPosition(offset, usePrimaryDirection = true)
-                ).isEqualTo(paragraph.width)
+                assertThat(paragraph.getHorizontalPosition(offset, usePrimaryDirection = true))
+                    .isEqualTo(paragraph.width)
 
-                assertThat(
-                    paragraph.getHorizontalPosition(offset, usePrimaryDirection = false)
-                ).isEqualTo(paragraph.width)
+                assertThat(paragraph.getHorizontalPosition(offset, usePrimaryDirection = false))
+                    .isEqualTo(paragraph.width)
             }
         }
     }
@@ -317,9 +302,8 @@
     fun getOffsetForPosition_Ltr_sp_letterspacing() {
         val paragraph = paragraph(ltrChar.repeat(repeatCount), letterSpacing = letterSpacing.sp)
         for (line in 0 until paragraph.lineCount) {
-            assertThat(
-                paragraph.getOffsetForPosition(Offset(1f, line * fontSize + 1f))
-            ).isEqualTo(lineStartOffsets[line])
+            assertThat(paragraph.getOffsetForPosition(Offset(1f, line * fontSize + 1f)))
+                .isEqualTo(lineStartOffsets[line])
         }
     }
 
@@ -328,8 +312,11 @@
         val paragraph = paragraph(rtlChar.repeat(repeatCount), letterSpacing = letterSpacing.sp)
         for (line in 0 until paragraph.lineCount) {
             assertThat(
-                paragraph.getOffsetForPosition(Offset(paragraph.width - 1f, line * fontSize + 1f))
-            ).isEqualTo(lineStartOffsets[line])
+                    paragraph.getOffsetForPosition(
+                        Offset(paragraph.width - 1f, line * fontSize + 1f)
+                    )
+                )
+                .isEqualTo(lineStartOffsets[line])
         }
     }
 
@@ -349,20 +336,20 @@
 
         return Paragraph(
             text = text,
-            style = TextStyle(
-                fontFamily = fontFamilyMeasureFont,
-                fontSize = fontSize.sp,
-                textAlign = TextAlign.End,
-                letterSpacing = letterSpacing,
-                textIndent = textIndent
-            ),
+            style =
+                TextStyle(
+                    fontFamily = fontFamilyMeasureFont,
+                    fontSize = fontSize.sp,
+                    textAlign = TextAlign.End,
+                    letterSpacing = letterSpacing,
+                    textIndent = textIndent
+                ),
             maxLines = lastLine + 1,
             ellipsis = true,
             constraints = Constraints(maxWidth = width),
             density = Density(density = 1f),
-            fontFamilyResolver = UncachedFontFamilyResolver(
-                InstrumentationRegistry.getInstrumentation().context
-            )
+            fontFamilyResolver =
+                UncachedFontFamilyResolver(InstrumentationRegistry.getInstrumentation().context)
         )
     }
 }
diff --git a/compose/ui/ui-text/src/androidInstrumentedTest/kotlin/androidx/compose/ui/text/ParagraphIntegrationLineHeightStyleTest.kt b/compose/ui/ui-text/src/androidInstrumentedTest/kotlin/androidx/compose/ui/text/ParagraphIntegrationLineHeightStyleTest.kt
index 8a16caf..07e2092 100644
--- a/compose/ui/ui-text/src/androidInstrumentedTest/kotlin/androidx/compose/ui/text/ParagraphIntegrationLineHeightStyleTest.kt
+++ b/compose/ui/ui-text/src/androidInstrumentedTest/kotlin/androidx/compose/ui/text/ParagraphIntegrationLineHeightStyleTest.kt
@@ -49,10 +49,8 @@
 
     @Test
     fun singleLine_even_trim_None() {
-        val paragraph = singleLineParagraph(
-            lineHeightTrim = Trim.None,
-            lineHeightAlignment = Alignment.Center
-        )
+        val paragraph =
+            singleLineParagraph(lineHeightTrim = Trim.None, lineHeightAlignment = Alignment.Center)
 
         val defaultFontMetrics = defaultFontMetrics()
         val diff = (lineHeightInPx - defaultFontMetrics.lineHeight()) / 2
@@ -68,10 +66,11 @@
 
     @Test
     fun singleLine_even_trim_LastLineBottom() {
-        val paragraph = singleLineParagraph(
-            lineHeightTrim = Trim.LastLineBottom,
-            lineHeightAlignment = Alignment.Center
-        )
+        val paragraph =
+            singleLineParagraph(
+                lineHeightTrim = Trim.LastLineBottom,
+                lineHeightAlignment = Alignment.Center
+            )
 
         val defaultFontMetrics = defaultFontMetrics()
         val diff = (lineHeightInPx - defaultFontMetrics.lineHeight()) / 2
@@ -87,10 +86,11 @@
 
     @Test
     fun singleLine_even_trim_FirstLineTop() {
-        val paragraph = singleLineParagraph(
-            lineHeightTrim = Trim.FirstLineTop,
-            lineHeightAlignment = Alignment.Center
-        )
+        val paragraph =
+            singleLineParagraph(
+                lineHeightTrim = Trim.FirstLineTop,
+                lineHeightAlignment = Alignment.Center
+            )
 
         val defaultFontMetrics = defaultFontMetrics()
         val diff = (lineHeightInPx - defaultFontMetrics.lineHeight()) / 2
@@ -106,10 +106,8 @@
 
     @Test
     fun singleLine_even_trim_Both() {
-        val paragraph = singleLineParagraph(
-            lineHeightTrim = Trim.Both,
-            lineHeightAlignment = Alignment.Center
-        )
+        val paragraph =
+            singleLineParagraph(lineHeightTrim = Trim.Both, lineHeightAlignment = Alignment.Center)
 
         val defaultFontMetrics = defaultFontMetrics()
         val expectedAscent = defaultFontMetrics.ascent
@@ -126,10 +124,8 @@
 
     @Test
     fun singleLine_top_trim_None() {
-        val paragraph = singleLineParagraph(
-            lineHeightTrim = Trim.None,
-            lineHeightAlignment = Alignment.Top
-        )
+        val paragraph =
+            singleLineParagraph(lineHeightTrim = Trim.None, lineHeightAlignment = Alignment.Top)
 
         val defaultFontMetrics = defaultFontMetrics()
         val diff = lineHeightInPx - defaultFontMetrics.lineHeight()
@@ -145,10 +141,11 @@
 
     @Test
     fun singleLine_top_trim_LastLineBottom() {
-        val paragraph = singleLineParagraph(
-            lineHeightTrim = Trim.LastLineBottom,
-            lineHeightAlignment = Alignment.Top
-        )
+        val paragraph =
+            singleLineParagraph(
+                lineHeightTrim = Trim.LastLineBottom,
+                lineHeightAlignment = Alignment.Top
+            )
 
         val defaultFontMetrics = defaultFontMetrics()
         val diff = lineHeightInPx - defaultFontMetrics.lineHeight()
@@ -162,10 +159,11 @@
 
     @Test
     fun singleLine_top_trim_FirstLineTop() {
-        val paragraph = singleLineParagraph(
-            lineHeightTrim = Trim.FirstLineTop,
-            lineHeightAlignment = Alignment.Top
-        )
+        val paragraph =
+            singleLineParagraph(
+                lineHeightTrim = Trim.FirstLineTop,
+                lineHeightAlignment = Alignment.Top
+            )
 
         val defaultFontMetrics = defaultFontMetrics()
         val diff = lineHeightInPx - defaultFontMetrics.lineHeight()
@@ -181,10 +179,8 @@
 
     @Test
     fun singleLine_top_trim_Both() {
-        val paragraph = singleLineParagraph(
-            lineHeightTrim = Trim.Both,
-            lineHeightAlignment = Alignment.Top
-        )
+        val paragraph =
+            singleLineParagraph(lineHeightTrim = Trim.Both, lineHeightAlignment = Alignment.Top)
 
         val defaultFontMetrics = defaultFontMetrics()
         val expectedAscent = defaultFontMetrics.ascent
@@ -201,10 +197,8 @@
 
     @Test
     fun singleLine_bottom_trim_None() {
-        val paragraph = singleLineParagraph(
-            lineHeightTrim = Trim.None,
-            lineHeightAlignment = Alignment.Bottom
-        )
+        val paragraph =
+            singleLineParagraph(lineHeightTrim = Trim.None, lineHeightAlignment = Alignment.Bottom)
 
         val defaultFontMetrics = defaultFontMetrics()
         val diff = lineHeightInPx - defaultFontMetrics.lineHeight()
@@ -220,10 +214,11 @@
 
     @Test
     fun singleLine_bottom_trim_LastLineBottom() {
-        val paragraph = singleLineParagraph(
-            lineHeightTrim = Trim.LastLineBottom,
-            lineHeightAlignment = Alignment.Bottom
-        )
+        val paragraph =
+            singleLineParagraph(
+                lineHeightTrim = Trim.LastLineBottom,
+                lineHeightAlignment = Alignment.Bottom
+            )
 
         val defaultFontMetrics = defaultFontMetrics()
         val diff = lineHeightInPx - defaultFontMetrics.lineHeight()
@@ -237,10 +232,11 @@
 
     @Test
     fun singleLine_bottom_trim_FirstLineTop() {
-        val paragraph = singleLineParagraph(
-            lineHeightTrim = Trim.FirstLineTop,
-            lineHeightAlignment = Alignment.Bottom
-        )
+        val paragraph =
+            singleLineParagraph(
+                lineHeightTrim = Trim.FirstLineTop,
+                lineHeightAlignment = Alignment.Bottom
+            )
 
         val defaultFontMetrics = defaultFontMetrics()
         val diff = lineHeightInPx - defaultFontMetrics.lineHeight()
@@ -256,10 +252,8 @@
 
     @Test
     fun singleLine_bottom_trim_Both() {
-        val paragraph = singleLineParagraph(
-            lineHeightTrim = Trim.Both,
-            lineHeightAlignment = Alignment.Bottom
-        )
+        val paragraph =
+            singleLineParagraph(lineHeightTrim = Trim.Both, lineHeightAlignment = Alignment.Bottom)
 
         val defaultFontMetrics = defaultFontMetrics()
         val expectedAscent = defaultFontMetrics.ascent
@@ -276,10 +270,11 @@
 
     @Test
     fun singleLine_proportional_trim_None() {
-        val paragraph = singleLineParagraph(
-            lineHeightTrim = Trim.None,
-            lineHeightAlignment = Alignment.Proportional
-        )
+        val paragraph =
+            singleLineParagraph(
+                lineHeightTrim = Trim.None,
+                lineHeightAlignment = Alignment.Proportional
+            )
 
         val defaultFontMetrics = defaultFontMetrics()
         val descentDiff = proportionalDescentDiff(defaultFontMetrics)
@@ -296,10 +291,11 @@
 
     @Test
     fun singleLine_proportional_trim_LastLineBottom() {
-        val paragraph = singleLineParagraph(
-            lineHeightTrim = Trim.LastLineBottom,
-            lineHeightAlignment = Alignment.Proportional
-        )
+        val paragraph =
+            singleLineParagraph(
+                lineHeightTrim = Trim.LastLineBottom,
+                lineHeightAlignment = Alignment.Proportional
+            )
 
         val defaultFontMetrics = defaultFontMetrics()
         val descentDiff = proportionalDescentDiff(defaultFontMetrics)
@@ -316,10 +312,11 @@
 
     @Test
     fun singleLine_proportional_trim_FirstLineTop() {
-        val paragraph = singleLineParagraph(
-            lineHeightTrim = Trim.FirstLineTop,
-            lineHeightAlignment = Alignment.Proportional
-        )
+        val paragraph =
+            singleLineParagraph(
+                lineHeightTrim = Trim.FirstLineTop,
+                lineHeightAlignment = Alignment.Proportional
+            )
 
         val defaultFontMetrics = defaultFontMetrics()
         val descentDiff = proportionalDescentDiff(defaultFontMetrics)
@@ -336,10 +333,11 @@
 
     @Test
     fun singleLine_proportional_trim_Both() {
-        val paragraph = singleLineParagraph(
-            lineHeightTrim = Trim.Both,
-            lineHeightAlignment = Alignment.Proportional
-        )
+        val paragraph =
+            singleLineParagraph(
+                lineHeightTrim = Trim.Both,
+                lineHeightAlignment = Alignment.Proportional
+            )
 
         val defaultFontMetrics = defaultFontMetrics()
         val expectedAscent = defaultFontMetrics.ascent
@@ -356,10 +354,8 @@
 
     @Test
     fun multiLine_even_trim_None() {
-        val paragraph = multiLineParagraph(
-            lineHeightTrim = Trim.None,
-            lineHeightAlignment = Alignment.Center
-        )
+        val paragraph =
+            multiLineParagraph(lineHeightTrim = Trim.None, lineHeightAlignment = Alignment.Center)
 
         val defaultFontMetrics = defaultFontMetrics()
         val diff = (lineHeightInPx - defaultFontMetrics.lineHeight()) / 2
@@ -380,10 +376,11 @@
 
     @Test
     fun multiLine_even_trim_LastLineBottom() {
-        val paragraph = multiLineParagraph(
-            lineHeightTrim = Trim.LastLineBottom,
-            lineHeightAlignment = Alignment.Center
-        )
+        val paragraph =
+            multiLineParagraph(
+                lineHeightTrim = Trim.LastLineBottom,
+                lineHeightAlignment = Alignment.Center
+            )
 
         val defaultFontMetrics = defaultFontMetrics()
         val diff = (lineHeightInPx - defaultFontMetrics.lineHeight()) / 2
@@ -410,10 +407,11 @@
 
     @Test
     fun multiLine_even_trim_FirstLineTop() {
-        val paragraph = multiLineParagraph(
-            lineHeightTrim = Trim.FirstLineTop,
-            lineHeightAlignment = Alignment.Center
-        )
+        val paragraph =
+            multiLineParagraph(
+                lineHeightTrim = Trim.FirstLineTop,
+                lineHeightAlignment = Alignment.Center
+            )
 
         val defaultFontMetrics = defaultFontMetrics()
         val diff = (lineHeightInPx - defaultFontMetrics.lineHeight()) / 2
@@ -440,10 +438,8 @@
 
     @Test
     fun multiLine_even_trim_Both() {
-        val paragraph = multiLineParagraph(
-            lineHeightTrim = Trim.Both,
-            lineHeightAlignment = Alignment.Center
-        )
+        val paragraph =
+            multiLineParagraph(lineHeightTrim = Trim.Both, lineHeightAlignment = Alignment.Center)
 
         val defaultFontMetrics = defaultFontMetrics()
         val diff = (lineHeightInPx - defaultFontMetrics.lineHeight()) / 2
@@ -472,10 +468,8 @@
 
     @Test
     fun multiLine_top_trim_None() {
-        val paragraph = multiLineParagraph(
-            lineHeightTrim = Trim.None,
-            lineHeightAlignment = Alignment.Top
-        )
+        val paragraph =
+            multiLineParagraph(lineHeightTrim = Trim.None, lineHeightAlignment = Alignment.Top)
 
         val defaultFontMetrics = defaultFontMetrics()
         val diff = lineHeightInPx - defaultFontMetrics.lineHeight()
@@ -502,10 +496,11 @@
 
     @Test
     fun multiLine_top_trim_LastLineBottom() {
-        val paragraph = multiLineParagraph(
-            lineHeightTrim = Trim.LastLineBottom,
-            lineHeightAlignment = Alignment.Top
-        )
+        val paragraph =
+            multiLineParagraph(
+                lineHeightTrim = Trim.LastLineBottom,
+                lineHeightAlignment = Alignment.Top
+            )
 
         val defaultFontMetrics = defaultFontMetrics()
         val diff = lineHeightInPx - defaultFontMetrics.lineHeight()
@@ -532,10 +527,11 @@
 
     @Test
     fun multiLine_top_trim_FirstLineTop() {
-        val paragraph = multiLineParagraph(
-            lineHeightTrim = Trim.FirstLineTop,
-            lineHeightAlignment = Alignment.Top
-        )
+        val paragraph =
+            multiLineParagraph(
+                lineHeightTrim = Trim.FirstLineTop,
+                lineHeightAlignment = Alignment.Top
+            )
 
         val defaultFontMetrics = defaultFontMetrics()
         val diff = lineHeightInPx - defaultFontMetrics.lineHeight()
@@ -562,10 +558,8 @@
 
     @Test
     fun multiLine_top_trim_Both() {
-        val paragraph = multiLineParagraph(
-            lineHeightTrim = Trim.Both,
-            lineHeightAlignment = Alignment.Top
-        )
+        val paragraph =
+            multiLineParagraph(lineHeightTrim = Trim.Both, lineHeightAlignment = Alignment.Top)
 
         val defaultFontMetrics = defaultFontMetrics()
         val diff = lineHeightInPx - defaultFontMetrics.lineHeight()
@@ -594,10 +588,8 @@
 
     @Test
     fun multiLine_bottom_trim_None() {
-        val paragraph = multiLineParagraph(
-            lineHeightTrim = Trim.None,
-            lineHeightAlignment = Alignment.Bottom
-        )
+        val paragraph =
+            multiLineParagraph(lineHeightTrim = Trim.None, lineHeightAlignment = Alignment.Bottom)
 
         val defaultFontMetrics = defaultFontMetrics()
         val diff = lineHeightInPx - defaultFontMetrics.lineHeight()
@@ -624,10 +616,11 @@
 
     @Test
     fun multiLine_bottom_trim_LastLineBottom() {
-        val paragraph = multiLineParagraph(
-            lineHeightTrim = Trim.LastLineBottom,
-            lineHeightAlignment = Alignment.Bottom
-        )
+        val paragraph =
+            multiLineParagraph(
+                lineHeightTrim = Trim.LastLineBottom,
+                lineHeightAlignment = Alignment.Bottom
+            )
 
         val defaultFontMetrics = defaultFontMetrics()
         val diff = lineHeightInPx - defaultFontMetrics.lineHeight()
@@ -654,10 +647,11 @@
 
     @Test
     fun multiLine_bottom_trim_FirstLineTop() {
-        val paragraph = multiLineParagraph(
-            lineHeightTrim = Trim.FirstLineTop,
-            lineHeightAlignment = Alignment.Bottom
-        )
+        val paragraph =
+            multiLineParagraph(
+                lineHeightTrim = Trim.FirstLineTop,
+                lineHeightAlignment = Alignment.Bottom
+            )
 
         val defaultFontMetrics = defaultFontMetrics()
         val diff = lineHeightInPx - defaultFontMetrics.lineHeight()
@@ -684,10 +678,8 @@
 
     @Test
     fun multiLine_bottom_trim_Both() {
-        val paragraph = multiLineParagraph(
-            lineHeightTrim = Trim.Both,
-            lineHeightAlignment = Alignment.Bottom
-        )
+        val paragraph =
+            multiLineParagraph(lineHeightTrim = Trim.Both, lineHeightAlignment = Alignment.Bottom)
 
         val defaultFontMetrics = defaultFontMetrics()
         val diff = lineHeightInPx - defaultFontMetrics.lineHeight()
@@ -716,10 +708,11 @@
 
     @Test
     fun multiLine_proportional_trim_None() {
-        val paragraph = multiLineParagraph(
-            lineHeightTrim = Trim.None,
-            lineHeightAlignment = Alignment.Proportional
-        )
+        val paragraph =
+            multiLineParagraph(
+                lineHeightTrim = Trim.None,
+                lineHeightAlignment = Alignment.Proportional
+            )
 
         val defaultFontMetrics = defaultFontMetrics()
         val descentDiff = proportionalDescentDiff(defaultFontMetrics)
@@ -747,10 +740,11 @@
 
     @Test
     fun multiLine_proportional_trim_LastLineBottom() {
-        val paragraph = multiLineParagraph(
-            lineHeightTrim = Trim.LastLineBottom,
-            lineHeightAlignment = Alignment.Proportional
-        )
+        val paragraph =
+            multiLineParagraph(
+                lineHeightTrim = Trim.LastLineBottom,
+                lineHeightAlignment = Alignment.Proportional
+            )
 
         val defaultFontMetrics = defaultFontMetrics()
         val descentDiff = proportionalDescentDiff(defaultFontMetrics)
@@ -778,10 +772,11 @@
 
     @Test
     fun multiLine_proportional_trim_FirstLineTop() {
-        val paragraph = multiLineParagraph(
-            lineHeightTrim = Trim.FirstLineTop,
-            lineHeightAlignment = Alignment.Proportional
-        )
+        val paragraph =
+            multiLineParagraph(
+                lineHeightTrim = Trim.FirstLineTop,
+                lineHeightAlignment = Alignment.Proportional
+            )
 
         val defaultFontMetrics = defaultFontMetrics()
         val descentDiff = proportionalDescentDiff(defaultFontMetrics)
@@ -809,10 +804,11 @@
 
     @Test
     fun multiLine_proportional_trim_Both() {
-        val paragraph = multiLineParagraph(
-            lineHeightTrim = Trim.Both,
-            lineHeightAlignment = Alignment.Proportional
-        )
+        val paragraph =
+            multiLineParagraph(
+                lineHeightTrim = Trim.Both,
+                lineHeightAlignment = Alignment.Proportional
+            )
 
         val defaultFontMetrics = defaultFontMetrics()
         val descentDiff = proportionalDescentDiff(defaultFontMetrics)
@@ -849,25 +845,19 @@
     }
 
     private fun assertEmptyLineMetrics(textWithEmptyLine: String, textWithoutEmptyLine: String) {
-        val textStyle = TextStyle(
-            lineHeightStyle = LineHeightStyle(
-                trim = Trim.None,
-                alignment = Alignment.Proportional
-            ),
-            platformStyle = @Suppress("DEPRECATION") PlatformTextStyle(
-                includeFontPadding = false
+        val textStyle =
+            TextStyle(
+                lineHeightStyle =
+                    LineHeightStyle(trim = Trim.None, alignment = Alignment.Proportional),
+                platformStyle =
+                    @Suppress("DEPRECATION") PlatformTextStyle(includeFontPadding = false)
             )
-        )
 
-        val paragraphWithEmptyLastLine = simpleParagraph(
-            text = textWithEmptyLine,
-            style = textStyle
-        ) as AndroidParagraph
+        val paragraphWithEmptyLastLine =
+            simpleParagraph(text = textWithEmptyLine, style = textStyle) as AndroidParagraph
 
-        val otherParagraph = simpleParagraph(
-            text = textWithoutEmptyLine,
-            style = textStyle
-        ) as AndroidParagraph
+        val otherParagraph =
+            simpleParagraph(text = textWithoutEmptyLine, style = textStyle) as AndroidParagraph
 
         with(paragraphWithEmptyLastLine) {
             for (line in 0 until lineCount) {
@@ -887,18 +877,15 @@
         lineHeightAlignment: Alignment,
         text: String = "AAA"
     ): AndroidParagraph {
-        val textStyle = TextStyle(
-            lineHeightStyle = LineHeightStyle(
-                trim = lineHeightTrim,
-                alignment = lineHeightAlignment
+        val textStyle =
+            TextStyle(
+                lineHeightStyle =
+                    LineHeightStyle(trim = lineHeightTrim, alignment = lineHeightAlignment)
             )
-        )
 
-        val paragraph = simpleParagraph(
-            text = text,
-            style = textStyle,
-            width = text.length * fontSizeInPx
-        ) as AndroidParagraph
+        val paragraph =
+            simpleParagraph(text = text, style = textStyle, width = text.length * fontSizeInPx)
+                as AndroidParagraph
 
         assertThat(paragraph.lineCount).isEqualTo(1)
 
@@ -914,21 +901,17 @@
         val word = "AAA"
         val text = "AAA".repeat(lineCount)
 
-        val textStyle = TextStyle(
-            lineHeightStyle = LineHeightStyle(
-                trim = lineHeightTrim,
-                alignment = lineHeightAlignment
-            ),
-            platformStyle = @Suppress("DEPRECATION") PlatformTextStyle(
-                includeFontPadding = false
+        val textStyle =
+            TextStyle(
+                lineHeightStyle =
+                    LineHeightStyle(trim = lineHeightTrim, alignment = lineHeightAlignment),
+                platformStyle =
+                    @Suppress("DEPRECATION") PlatformTextStyle(includeFontPadding = false)
             )
-        )
 
-        val paragraph = simpleParagraph(
-            text = text,
-            style = textStyle,
-            width = word.length * fontSizeInPx
-        ) as AndroidParagraph
+        val paragraph =
+            simpleParagraph(text = text, style = textStyle, width = word.length * fontSizeInPx)
+                as AndroidParagraph
 
         assertThat(paragraph.lineCount).isEqualTo(lineCount)
 
@@ -946,14 +929,15 @@
         return Paragraph(
             text = text,
             spanStyles = spanStyles,
-            style = TextStyle(
-                fontFamily = fontFamilyMeasureFont,
-                fontSize = fontSize,
-                lineHeight = lineHeight,
-                platformStyle = @Suppress("DEPRECATION") PlatformTextStyle(
-                    includeFontPadding = false
-                )
-            ).merge(style),
+            style =
+                TextStyle(
+                        fontFamily = fontFamilyMeasureFont,
+                        fontSize = fontSize,
+                        lineHeight = lineHeight,
+                        platformStyle =
+                            @Suppress("DEPRECATION") PlatformTextStyle(includeFontPadding = false)
+                    )
+                    .merge(style),
             maxLines = maxLines,
             ellipsis = ellipsis,
             constraints = Constraints(maxWidth = width.ceilToInt()),
diff --git a/compose/ui/ui-text/src/androidInstrumentedTest/kotlin/androidx/compose/ui/text/ParagraphIntegrationTest.kt b/compose/ui/ui-text/src/androidInstrumentedTest/kotlin/androidx/compose/ui/text/ParagraphIntegrationTest.kt
index 9a40fca..363b55a 100644
--- a/compose/ui/ui-text/src/androidInstrumentedTest/kotlin/androidx/compose/ui/text/ParagraphIntegrationTest.kt
+++ b/compose/ui/ui-text/src/androidInstrumentedTest/kotlin/androidx/compose/ui/text/ParagraphIntegrationTest.kt
@@ -78,15 +78,19 @@
     private fun hasEdgeLetterSpacingBugFix(): Boolean {
         val text = "a"
         val fontSize = 10.sp
-        val singleLetterLetterSpacing = simpleParagraph(
-            text = text,
-            style = TextStyle(fontSize = fontSize, letterSpacing = 10.sp),
-            width = Float.MAX_VALUE)
+        val singleLetterLetterSpacing =
+            simpleParagraph(
+                text = text,
+                style = TextStyle(fontSize = fontSize, letterSpacing = 10.sp),
+                width = Float.MAX_VALUE
+            )
 
-        val singleLetterWithoutLetterSpacing = simpleParagraph(
-            text = text,
-            style = TextStyle(fontSize = fontSize),
-            width = Float.MAX_VALUE)
+        val singleLetterWithoutLetterSpacing =
+            simpleParagraph(
+                text = text,
+                style = TextStyle(fontSize = fontSize),
+                width = Float.MAX_VALUE
+            )
 
         // If the platform has a letter spacing fix, the letter spacing will not be added before and
         // after the visually left most letter and visually right most letter. Therefore, if the fix
@@ -101,11 +105,8 @@
             val fontSize = 50.sp
             val fontSizeInPx = fontSize.toPx()
             val text = ""
-            val paragraph = simpleParagraph(
-                text = text,
-                style = TextStyle(fontSize = fontSize),
-                width = 100.0f
-            )
+            val paragraph =
+                simpleParagraph(text = text, style = TextStyle(fontSize = fontSize), width = 100.0f)
 
             assertThat(paragraph.width).isEqualTo(100.0f)
 
@@ -125,21 +126,24 @@
             val fontSizeInPx = fontSize.toPx()
 
             for (text in arrayOf("xyz", "\u05D0\u05D1\u05D2")) {
-                val paragraph = simpleParagraph(
-                    text = text,
-                    style = TextStyle(fontSize = fontSize),
-                    // width greater than text width - 150
-                    width = 200.0f
-                )
+                val paragraph =
+                    simpleParagraph(
+                        text = text,
+                        style = TextStyle(fontSize = fontSize),
+                        // width greater than text width - 150
+                        width = 200.0f
+                    )
 
                 assertWithMessage(text).that(paragraph.width).isEqualTo(200.0f)
                 assertWithMessage(text).that(paragraph.height).isEqualTo(fontSizeInPx)
                 // defined in sample_font
                 assertWithMessage(text).that(paragraph.firstBaseline).isEqualTo(fontSizeInPx * 0.8f)
                 assertWithMessage(text).that(paragraph.lastBaseline).isEqualTo(fontSizeInPx * 0.8f)
-                assertWithMessage(text).that(paragraph.maxIntrinsicWidth)
+                assertWithMessage(text)
+                    .that(paragraph.maxIntrinsicWidth)
                     .isEqualTo(fontSizeInPx * text.length)
-                assertWithMessage(text).that(paragraph.minIntrinsicWidth)
+                assertWithMessage(text)
+                    .that(paragraph.minIntrinsicWidth)
                     .isEqualTo(text.length * fontSizeInPx)
             }
         }
@@ -152,27 +156,28 @@
             val fontSizeInPx = fontSize.toPx()
 
             for (text in arrayOf("abcdef", "\u05D0\u05D1\u05D2\u05D3\u05D4\u05D5")) {
-                val paragraph = simpleParagraph(
-                    text = text,
-                    style = TextStyle(fontSize = fontSize),
-                    // 3 chars width
-                    width = 3 * fontSizeInPx
-                )
+                val paragraph =
+                    simpleParagraph(
+                        text = text,
+                        style = TextStyle(fontSize = fontSize),
+                        // 3 chars width
+                        width = 3 * fontSizeInPx
+                    )
 
                 // 3 chars
-                assertWithMessage(text).that(paragraph.width)
-                    .isEqualTo(3 * fontSizeInPx)
+                assertWithMessage(text).that(paragraph.width).isEqualTo(3 * fontSizeInPx)
                 // 2 lines, 1 line gap
-                assertWithMessage(text).that(paragraph.height)
-                    .isEqualTo(2 * fontSizeInPx)
+                assertWithMessage(text).that(paragraph.height).isEqualTo(2 * fontSizeInPx)
                 // defined in sample_font
-                assertWithMessage(text).that(paragraph.firstBaseline)
-                    .isEqualTo(fontSizeInPx * 0.8f)
-                assertWithMessage(text).that(paragraph.lastBaseline)
+                assertWithMessage(text).that(paragraph.firstBaseline).isEqualTo(fontSizeInPx * 0.8f)
+                assertWithMessage(text)
+                    .that(paragraph.lastBaseline)
                     .isEqualTo(fontSizeInPx + fontSizeInPx * 0.8f)
-                assertWithMessage(text).that(paragraph.maxIntrinsicWidth)
+                assertWithMessage(text)
+                    .that(paragraph.maxIntrinsicWidth)
                     .isEqualTo(fontSizeInPx * text.length)
-                assertWithMessage(text).that(paragraph.minIntrinsicWidth)
+                assertWithMessage(text)
+                    .that(paragraph.minIntrinsicWidth)
                     .isEqualTo(text.length * fontSizeInPx)
             }
         }
@@ -185,25 +190,28 @@
             val fontSizeInPx = fontSize.toPx()
 
             for (text in arrayOf("abc\ndef", "\u05D0\u05D1\u05D2\n\u05D3\u05D4\u05D5")) {
-                val paragraph = simpleParagraph(
-                    text = text,
-                    style = TextStyle(fontSize = fontSize),
-                    // 3 chars width
-                    width = 3 * fontSizeInPx
-                )
+                val paragraph =
+                    simpleParagraph(
+                        text = text,
+                        style = TextStyle(fontSize = fontSize),
+                        // 3 chars width
+                        width = 3 * fontSizeInPx
+                    )
 
                 // 3 chars
                 assertWithMessage(text).that(paragraph.width).isEqualTo(3 * fontSizeInPx)
                 // 2 lines, 1 line gap
-                assertWithMessage(text).that(paragraph.height)
-                    .isEqualTo(2 * fontSizeInPx)
+                assertWithMessage(text).that(paragraph.height).isEqualTo(2 * fontSizeInPx)
                 // defined in sample_font
                 assertWithMessage(text).that(paragraph.firstBaseline).isEqualTo(fontSizeInPx * 0.8f)
-                assertWithMessage(text).that(paragraph.lastBaseline)
+                assertWithMessage(text)
+                    .that(paragraph.lastBaseline)
                     .isEqualTo(fontSizeInPx + fontSizeInPx * 0.8f)
-                assertWithMessage(text).that(paragraph.maxIntrinsicWidth)
+                assertWithMessage(text)
+                    .that(paragraph.maxIntrinsicWidth)
                     .isEqualTo(fontSizeInPx * text.indexOf("\n"))
-                assertWithMessage(text).that(paragraph.minIntrinsicWidth)
+                assertWithMessage(text)
+                    .that(paragraph.minIntrinsicWidth)
                     .isEqualTo(fontSizeInPx * text.indexOf("\n"))
             }
         }
@@ -216,26 +224,28 @@
             val fontSizeInPx = fontSize.toPx()
 
             for (text in arrayOf("abc\ndef", "\u05D0\u05D1\u05D2\n\u05D3\u05D4\u05D5")) {
-                val paragraph = simpleParagraph(
-                    text = text,
-                    style = TextStyle(fontSize = fontSize),
-                    // 2 chars width
-                    width = 2 * fontSizeInPx
-                )
+                val paragraph =
+                    simpleParagraph(
+                        text = text,
+                        style = TextStyle(fontSize = fontSize),
+                        // 2 chars width
+                        width = 2 * fontSizeInPx
+                    )
 
                 // 2 chars
                 assertWithMessage(text).that(paragraph.width).isEqualTo(2 * fontSizeInPx)
                 // 4 lines, 3 line gaps
-                assertWithMessage(text).that(paragraph.height)
-                    .isEqualTo(4 * fontSizeInPx)
+                assertWithMessage(text).that(paragraph.height).isEqualTo(4 * fontSizeInPx)
                 // defined in sample_font
-                assertWithMessage(text).that(paragraph.firstBaseline)
-                    .isEqualTo(fontSizeInPx * 0.8f)
-                assertWithMessage(text).that(paragraph.lastBaseline)
+                assertWithMessage(text).that(paragraph.firstBaseline).isEqualTo(fontSizeInPx * 0.8f)
+                assertWithMessage(text)
+                    .that(paragraph.lastBaseline)
                     .isEqualTo(3 * fontSizeInPx + fontSizeInPx * 0.8f)
-                assertWithMessage(text).that(paragraph.maxIntrinsicWidth)
+                assertWithMessage(text)
+                    .that(paragraph.maxIntrinsicWidth)
                     .isEqualTo(fontSizeInPx * text.indexOf("\n"))
-                assertWithMessage(text).that(paragraph.minIntrinsicWidth)
+                assertWithMessage(text)
+                    .that(paragraph.minIntrinsicWidth)
                     .isEqualTo(fontSizeInPx * text.indexOf("\n"))
             }
         }
@@ -247,18 +257,20 @@
             val text = "abc"
             val fontSize = 50.sp
             val fontSizeInPx = fontSize.toPx()
-            val paragraph = simpleParagraph(
-                text = text,
-                style = TextStyle(fontSize = fontSize),
-                width = text.length * fontSizeInPx
-            )
+            val paragraph =
+                simpleParagraph(
+                    text = text,
+                    style = TextStyle(fontSize = fontSize),
+                    width = text.length * fontSizeInPx
+                )
 
             // test positions that are 1, fontSize+1, 2fontSize+1 which maps to chars 0, 1, 2 ...
             for (i in 0..text.length) {
                 val position = Offset((i * fontSizeInPx + 1), (fontSizeInPx / 2))
                 val offset = paragraph.getOffsetForPosition(position)
                 assertWithMessage("offset at index $i, position $position does not match")
-                    .that(offset).isEqualTo(i)
+                    .that(offset)
+                    .isEqualTo(i)
             }
         }
     }
@@ -269,18 +281,20 @@
             val text = "\u05D0\u05D1\u05D2"
             val fontSize = 50.sp
             val fontSizeInPx = fontSize.toPx()
-            val paragraph = simpleParagraph(
-                text = text,
-                style = TextStyle(fontSize = fontSize),
-                width = text.length * fontSizeInPx
-            )
+            val paragraph =
+                simpleParagraph(
+                    text = text,
+                    style = TextStyle(fontSize = fontSize),
+                    width = text.length * fontSizeInPx
+                )
 
             // test positions that are 1, fontSize+1, 2fontSize+1 which maps to chars .., 2, 1, 0
             for (i in 0..text.length) {
                 val position = Offset((i * fontSizeInPx + 1), (fontSizeInPx / 2))
                 val offset = paragraph.getOffsetForPosition(position)
                 assertWithMessage("offset at index $i, position $position does not match")
-                    .that(offset).isEqualTo(text.length - i)
+                    .that(offset)
+                    .isEqualTo(text.length - i)
             }
         }
     }
@@ -293,11 +307,12 @@
             val text = firstLine + secondLine
             val fontSize = 50.sp
             val fontSizeInPx = fontSize.toPx()
-            val paragraph = simpleParagraph(
-                text = text,
-                style = TextStyle(fontSize = fontSize),
-                width = firstLine.length * fontSizeInPx
-            )
+            val paragraph =
+                simpleParagraph(
+                    text = text,
+                    style = TextStyle(fontSize = fontSize),
+                    width = firstLine.length * fontSizeInPx
+                )
 
             // test positions are 1, fontSize+1, 2fontSize+1 and always on the second line
             // which maps to chars 3, 4, 5
@@ -305,8 +320,10 @@
                 val position = Offset((i * fontSizeInPx + 1), (fontSizeInPx * 1.5f))
                 val offset = paragraph.getOffsetForPosition(position)
                 assertWithMessage(
-                    "offset at index $i, position $position, second line does not match"
-                ).that(offset).isEqualTo(i + firstLine.length)
+                        "offset at index $i, position $position, second line does not match"
+                    )
+                    .that(offset)
+                    .isEqualTo(i + firstLine.length)
             }
         }
     }
@@ -319,11 +336,12 @@
             val text = firstLine + secondLine
             val fontSize = 50.sp
             val fontSizeInPx = fontSize.toPx()
-            val paragraph = simpleParagraph(
-                text = text,
-                style = TextStyle(fontSize = fontSize),
-                width = firstLine.length * fontSizeInPx
-            )
+            val paragraph =
+                simpleParagraph(
+                    text = text,
+                    style = TextStyle(fontSize = fontSize),
+                    width = firstLine.length * fontSizeInPx
+                )
 
             // test positions are 1, fontSize+1, 2fontSize+1 and always on the second line
             // which maps to chars 5, 4, 3
@@ -331,8 +349,10 @@
                 val position = Offset((i * fontSizeInPx + 1), (fontSizeInPx * 1.5f))
                 val offset = paragraph.getOffsetForPosition(position)
                 assertWithMessage(
-                    "offset at index $i, position $position, second line does not match"
-                ).that(offset).isEqualTo(text.length - i)
+                        "offset at index $i, position $position, second line does not match"
+                    )
+                    .that(offset)
+                    .isEqualTo(text.length - i)
             }
         }
     }
@@ -343,11 +363,12 @@
             val text = "abc"
             val fontSize = 50.sp
             val fontSizeInPx = fontSize.toPx()
-            val paragraph = simpleParagraph(
-                text = text,
-                style = TextStyle(fontSize = fontSize),
-                width = text.length * fontSizeInPx
-            )
+            val paragraph =
+                simpleParagraph(
+                    text = text,
+                    style = TextStyle(fontSize = fontSize),
+                    width = text.length * fontSizeInPx
+                )
 
             // greater than width
             var position = Offset((fontSizeInPx * text.length * 2), (fontSizeInPx / 2))
@@ -367,11 +388,12 @@
             val text = "abc"
             val fontSize = 50.sp
             val fontSizeInPx = fontSize.toPx()
-            val paragraph = simpleParagraph(
-                text = text,
-                style = TextStyle(fontSize = fontSize),
-                width = text.length * fontSizeInPx
-            )
+            val paragraph =
+                simpleParagraph(
+                    text = text,
+                    style = TextStyle(fontSize = fontSize),
+                    width = text.length * fontSizeInPx
+                )
 
             // greater than height
             var position = Offset((fontSizeInPx / 2), (fontSizeInPx * text.length * 2))
@@ -394,14 +416,12 @@
             val layoutWidth = text.length * fontSize / 4
             val lineHeight = 30f
 
-            val paragraph = simpleParagraph(
-                text = text,
-                style = TextStyle(
-                    fontSize = fontSize.sp,
-                    lineHeight = lineHeight.sp
-                ),
-                width = layoutWidth
-            )
+            val paragraph =
+                simpleParagraph(
+                    text = text,
+                    style = TextStyle(fontSize = fontSize.sp, lineHeight = lineHeight.sp),
+                    width = layoutWidth
+                )
 
             assertThat(paragraph.lineCount).isEqualTo(4)
             // test positions are 1, lineHeight+1, 2lineHeight+1, 3lineHeight + 1 which map to line
@@ -409,9 +429,9 @@
             for (i in 0 until paragraph.lineCount) {
                 val position = i * lineHeight.sp.toPx() + 1
                 val line = paragraph.getLineForVerticalPosition(position)
-                assertWithMessage(
-                    "Line at line index $i, position $position does not match"
-                ).that(line).isEqualTo(i)
+                assertWithMessage("Line at line index $i, position $position does not match")
+                    .that(line)
+                    .isEqualTo(i)
             }
         }
     }
@@ -425,14 +445,12 @@
             val layoutWidth = text.length * fontSize / 4
             val lineHeight = 30f
 
-            val paragraph = simpleParagraph(
-                text = text,
-                style = TextStyle(
-                    fontSize = fontSize.sp,
-                    lineHeight = lineHeight.sp
-                ),
-                width = layoutWidth
-            )
+            val paragraph =
+                simpleParagraph(
+                    text = text,
+                    style = TextStyle(fontSize = fontSize.sp, lineHeight = lineHeight.sp),
+                    width = layoutWidth
+                )
 
             assertThat(paragraph.lineCount).isEqualTo(4)
             // test positions are 1, lineHeight+1, 2lineHeight+1, 3lineHeight + 1 which map to line
@@ -440,9 +458,9 @@
             for (i in 0 until paragraph.lineCount) {
                 val position = i * lineHeight.sp.toPx() + 1
                 val line = paragraph.getLineForVerticalPosition(position)
-                assertWithMessage(
-                    "Line at line index $i, position $position does not match"
-                ).that(line).isEqualTo(i)
+                assertWithMessage("Line at line index $i, position $position does not match")
+                    .that(line)
+                    .isEqualTo(i)
             }
         }
     }
@@ -456,14 +474,12 @@
             val layoutWidth = text.length * fontSize / 4
             val lineHeight = 30f
 
-            val paragraph = simpleParagraph(
-                text = text,
-                style = TextStyle(
-                    fontSize = fontSize.sp,
-                    lineHeight = lineHeight.sp
-                ),
-                width = layoutWidth
-            )
+            val paragraph =
+                simpleParagraph(
+                    text = text,
+                    style = TextStyle(fontSize = fontSize.sp, lineHeight = lineHeight.sp),
+                    width = layoutWidth
+                )
 
             assertThat(paragraph.lineCount).isEqualTo(4)
             // greater than height
@@ -486,31 +502,33 @@
         // font size where test fails
         val fontSize = 14.sp
 
-        @Suppress("DEPRECATION") val paragraph = simpleParagraph(
-            text = text,
-            style = TextStyle(
-                fontSize = fontSize,
-                platformStyle = PlatformTextStyle(includeFontPadding = false)
-            ),
-            density = density
-        )
+        @Suppress("DEPRECATION")
+        val paragraph =
+            simpleParagraph(
+                text = text,
+                style =
+                    TextStyle(
+                        fontSize = fontSize,
+                        platformStyle = PlatformTextStyle(includeFontPadding = false)
+                    ),
+                density = density
+            )
 
         assertThat(paragraph.lineCount).isEqualTo(4)
 
         for (index in 0 until paragraph.lineCount) {
-            assertThat(
-                paragraph.getLineForVerticalPosition(paragraph.getLineTop(index))
-            ).isEqualTo(index)
+            assertThat(paragraph.getLineForVerticalPosition(paragraph.getLineTop(index)))
+                .isEqualTo(index)
 
             assertThat(
-                paragraph.getLineForVerticalPosition(
-                    (paragraph.getLineTop(index) + paragraph.getLineBottom(index)) / 2f
+                    paragraph.getLineForVerticalPosition(
+                        (paragraph.getLineTop(index) + paragraph.getLineBottom(index)) / 2f
+                    )
                 )
-            ).isEqualTo(index)
+                .isEqualTo(index)
 
-            assertThat(
-                paragraph.getLineForVerticalPosition(paragraph.getLineBottom(index) - 1f)
-            ).isEqualTo(index)
+            assertThat(paragraph.getLineForVerticalPosition(paragraph.getLineBottom(index) - 1f))
+                .isEqualTo(index)
         }
     }
 
@@ -522,31 +540,33 @@
         // font size where test fails
         val fontSize = 14.sp
 
-        @Suppress("DEPRECATION") val paragraph = simpleParagraph(
-            text = text,
-            style = TextStyle(
-                fontSize = fontSize,
-                platformStyle = PlatformTextStyle(includeFontPadding = true)
-            ),
-            density = density
-        )
+        @Suppress("DEPRECATION")
+        val paragraph =
+            simpleParagraph(
+                text = text,
+                style =
+                    TextStyle(
+                        fontSize = fontSize,
+                        platformStyle = PlatformTextStyle(includeFontPadding = true)
+                    ),
+                density = density
+            )
 
         assertThat(paragraph.lineCount).isEqualTo(4)
 
         for (index in 0 until paragraph.lineCount) {
-            assertThat(
-                paragraph.getLineForVerticalPosition(paragraph.getLineTop(index))
-            ).isEqualTo(index)
+            assertThat(paragraph.getLineForVerticalPosition(paragraph.getLineTop(index)))
+                .isEqualTo(index)
 
             assertThat(
-                paragraph.getLineForVerticalPosition(
-                    (paragraph.getLineTop(index) + paragraph.getLineBottom(index)) / 2f
+                    paragraph.getLineForVerticalPosition(
+                        (paragraph.getLineTop(index) + paragraph.getLineBottom(index)) / 2f
+                    )
                 )
-            ).isEqualTo(index)
+                .isEqualTo(index)
 
-            assertThat(
-                paragraph.getLineForVerticalPosition(paragraph.getLineBottom(index) - 1f)
-            ).isEqualTo(index)
+            assertThat(paragraph.getLineForVerticalPosition(paragraph.getLineBottom(index) - 1f))
+                .isEqualTo(index)
         }
     }
 
@@ -556,11 +576,12 @@
             val text = "abc"
             val fontSize = 50.sp
             val fontSizeInPx = fontSize.toPx()
-            val paragraph = simpleParagraph(
-                text = text,
-                style = TextStyle(fontSize = fontSize),
-                width = text.length * fontSizeInPx
-            )
+            val paragraph =
+                simpleParagraph(
+                    text = text,
+                    style = TextStyle(fontSize = fontSize),
+                    width = text.length * fontSizeInPx
+                )
 
             // test positions that are 0, 1, 2 ... which maps to chars 0, 1, 2 ...
             for (i in 0..text.length - 1) {
@@ -579,11 +600,12 @@
             val text = "\u05D0\u05D1\u05D2"
             val fontSize = 50.sp
             val fontSizeInPx = fontSize.toPx()
-            val paragraph = simpleParagraph(
-                text = text,
-                style = TextStyle(fontSize = fontSize),
-                width = text.length * fontSizeInPx
-            )
+            val paragraph =
+                simpleParagraph(
+                    text = text,
+                    style = TextStyle(fontSize = fontSize),
+                    width = text.length * fontSizeInPx
+                )
 
             // test positions that are 0, 1, 2 ... which maps to chars 0, 1, 2 ...
             for (c in 0 until text.length) {
@@ -605,11 +627,12 @@
             val text = firstLine + secondLine
             val fontSize = 50.sp
             val fontSizeInPx = fontSize.toPx()
-            val paragraph = simpleParagraph(
-                text = text,
-                style = TextStyle(fontSize = fontSize),
-                width = firstLine.length * fontSizeInPx
-            )
+            val paragraph =
+                simpleParagraph(
+                    text = text,
+                    style = TextStyle(fontSize = fontSize),
+                    width = firstLine.length * fontSizeInPx
+                )
 
             // test positions are 3, 4, 5 and always on the second line
             // which maps to chars 3, 4, 5
@@ -632,11 +655,12 @@
             val text = firstLine + secondLine
             val fontSize = 50.sp
             val fontSizeInPx = fontSize.toPx()
-            val paragraph = simpleParagraph(
-                text = text,
-                style = TextStyle(fontSize = fontSize),
-                width = firstLine.length * fontSizeInPx
-            )
+            val paragraph =
+                simpleParagraph(
+                    text = text,
+                    style = TextStyle(fontSize = fontSize),
+                    width = firstLine.length * fontSizeInPx
+                )
 
             // test positions are 3, 4, 5 and always on the second line
             // which maps to chars 3, 4, 5
@@ -660,11 +684,12 @@
             val text = firstLine + secondLine
             val fontSize = 50.sp
             val fontSizeInPx = fontSize.toPx()
-            val paragraph = simpleParagraph(
-                text = text,
-                style = TextStyle(fontSize = fontSize),
-                width = firstLine.length * fontSizeInPx
-            )
+            val paragraph =
+                simpleParagraph(
+                    text = text,
+                    style = TextStyle(fontSize = fontSize),
+                    width = firstLine.length * fontSizeInPx
+                )
 
             val box = paragraph.getBoundingBox(3)
             assertThat(box.left).isEqualTo(3 * fontSizeInPx)
@@ -682,11 +707,12 @@
             val text = firstLine + secondLine
             val fontSize = 50.sp
             val fontSizeInPx = fontSize.toPx()
-            val paragraph = simpleParagraph(
-                text = text,
-                style = TextStyle(fontSize = fontSize),
-                width = firstLine.length * fontSizeInPx
-            )
+            val paragraph =
+                simpleParagraph(
+                    text = text,
+                    style = TextStyle(fontSize = fontSize),
+                    width = firstLine.length * fontSizeInPx
+                )
 
             val box = paragraph.getBoundingBox(3)
             assertThat(box.left).isEqualTo(50)
@@ -702,13 +728,14 @@
             val text = "abc def\ndef"
             val fontSize = 50.sp
             val fontSizeInPx = fontSize.toPx()
-            val paragraph = simpleParagraph(
-                text = text,
-                style = TextStyle(fontSize = fontSize),
-                width = 3 * fontSizeInPx,
-                ellipsis = true,
-                maxLines = 1
-            )
+            val paragraph =
+                simpleParagraph(
+                    text = text,
+                    style = TextStyle(fontSize = fontSize),
+                    width = 3 * fontSizeInPx,
+                    ellipsis = true,
+                    maxLines = 1
+                )
 
             val box = paragraph.getBoundingBox(9)
             assertThat(box.left).isEqualTo(3 * fontSizeInPx)
@@ -724,13 +751,14 @@
             val text = "abc \u05D0\u05D1\u05D2"
             val fontSize = 50.sp
             val fontSizeInPx = fontSize.toPx()
-            val paragraph = simpleParagraph(
-                text = text,
-                style = TextStyle(fontSize = fontSize),
-                width = 3 * fontSizeInPx,
-                height = fontSizeInPx,
-                ellipsis = true
-            )
+            val paragraph =
+                simpleParagraph(
+                    text = text,
+                    style = TextStyle(fontSize = fontSize),
+                    width = 3 * fontSizeInPx,
+                    height = fontSizeInPx,
+                    ellipsis = true
+                )
 
             val box = paragraph.getBoundingBox(5)
             assertThat(box.left).isEqualTo(3 * fontSizeInPx)
@@ -746,13 +774,14 @@
             val text = "abc \u05D0\n\u05D1\u05D2"
             val fontSize = 50.sp
             val fontSizeInPx = fontSize.toPx()
-            val paragraph = simpleParagraph(
-                text = text,
-                style = TextStyle(fontSize = fontSize),
-                width = 3 * fontSizeInPx,
-                height = fontSizeInPx,
-                ellipsis = true
-            )
+            val paragraph =
+                simpleParagraph(
+                    text = text,
+                    style = TextStyle(fontSize = fontSize),
+                    width = 3 * fontSizeInPx,
+                    height = fontSizeInPx,
+                    ellipsis = true
+                )
 
             val box = paragraph.getBoundingBox(4)
             assertThat(box.left).isEqualTo(3 * fontSizeInPx)
@@ -768,13 +797,14 @@
             val text = "\u05D0\u05D1\u05D2 \u05D3\u05D4\u05D5\n\u05D0\u05D1\u05D2"
             val fontSize = 50.sp
             val fontSizeInPx = fontSize.toPx()
-            val paragraph = simpleParagraph(
-                text = text,
-                style = TextStyle(fontSize = fontSize),
-                width = 3 * fontSizeInPx,
-                ellipsis = true,
-                maxLines = 1
-            )
+            val paragraph =
+                simpleParagraph(
+                    text = text,
+                    style = TextStyle(fontSize = fontSize),
+                    width = 3 * fontSizeInPx,
+                    ellipsis = true,
+                    maxLines = 1
+                )
 
             val box = paragraph.getBoundingBox(9)
             assertThat(box.left).isEqualTo(0)
@@ -790,13 +820,14 @@
             val text = "abc def\ndef"
             val fontSize = 50.sp
             val fontSizeInPx = fontSize.toPx()
-            val paragraph = simpleParagraph(
-                text = text,
-                style = TextStyle(fontSize = fontSize),
-                width = 3 * fontSizeInPx,
-                ellipsis = true,
-                height = fontSizeInPx
-            )
+            val paragraph =
+                simpleParagraph(
+                    text = text,
+                    style = TextStyle(fontSize = fontSize),
+                    width = 3 * fontSizeInPx,
+                    ellipsis = true,
+                    height = fontSizeInPx
+                )
 
             val box = paragraph.getBoundingBox(9)
             assertThat(box.left).isEqualTo(3 * fontSizeInPx)
@@ -812,13 +843,14 @@
             val text = "\u05D0\u05D1\u05D2 \u05D3\u05D4\u05D5\n\u05D0\u05D1\u05D2"
             val fontSize = 50.sp
             val fontSizeInPx = fontSize.toPx()
-            val paragraph = simpleParagraph(
-                text = text,
-                style = TextStyle(fontSize = fontSize),
-                width = 3 * fontSizeInPx,
-                ellipsis = true,
-                height = fontSizeInPx
-            )
+            val paragraph =
+                simpleParagraph(
+                    text = text,
+                    style = TextStyle(fontSize = fontSize),
+                    width = 3 * fontSizeInPx,
+                    ellipsis = true,
+                    height = fontSizeInPx
+                )
 
             val box = paragraph.getBoundingBox(9)
             assertThat(box.left).isEqualTo(0)
@@ -834,11 +866,12 @@
             val text = "abc"
             val fontSize = 50.sp
             val fontSizeInPx = fontSize.toPx()
-            val paragraph = simpleParagraph(
-                text = text,
-                style = TextStyle(fontSize = fontSize),
-                width = text.length * fontSizeInPx
-            )
+            val paragraph =
+                simpleParagraph(
+                    text = text,
+                    style = TextStyle(fontSize = fontSize),
+                    width = text.length * fontSizeInPx
+                )
 
             val textPosition = -1
             val box = paragraph.getBoundingBox(textPosition)
@@ -855,11 +888,12 @@
             val text = "abc"
             val fontSize = 50.sp
             val fontSizeInPx = fontSize.toPx()
-            val paragraph = simpleParagraph(
-                text = text,
-                style = TextStyle(fontSize = fontSize),
-                width = text.length * fontSizeInPx
-            )
+            val paragraph =
+                simpleParagraph(
+                    text = text,
+                    style = TextStyle(fontSize = fontSize),
+                    width = text.length * fontSizeInPx
+                )
 
             val textPosition = text.length + 1
             paragraph.getBoundingBox(textPosition)
@@ -872,11 +906,12 @@
             val text = "abc"
             val fontSize = 50.sp
             val fontSizeInPx = fontSize.toPx()
-            val paragraph = simpleParagraph(
-                text = text,
-                style = TextStyle(fontSize = fontSize),
-                width = text.length * fontSizeInPx
-            )
+            val paragraph =
+                simpleParagraph(
+                    text = text,
+                    style = TextStyle(fontSize = fontSize),
+                    width = text.length * fontSizeInPx
+                )
 
             paragraph.getCursorRect(text.length + 1)
         }
@@ -888,11 +923,12 @@
             val text = "abc"
             val fontSize = 50.sp
             val fontSizeInPx = fontSize.toPx()
-            val paragraph = simpleParagraph(
-                text = text,
-                style = TextStyle(fontSize = fontSize),
-                width = text.length * fontSizeInPx
-            )
+            val paragraph =
+                simpleParagraph(
+                    text = text,
+                    style = TextStyle(fontSize = fontSize),
+                    width = text.length * fontSizeInPx
+                )
 
             paragraph.getCursorRect(-1)
         }
@@ -904,23 +940,25 @@
             val text = "abc"
             val fontSize = 50.sp
             val fontSizeInPx = fontSize.toPx()
-            val paragraph = simpleParagraph(
-                text = text,
-                style = TextStyle(fontSize = fontSize),
-                width = text.length * fontSizeInPx
-            )
+            val paragraph =
+                simpleParagraph(
+                    text = text,
+                    style = TextStyle(fontSize = fontSize),
+                    width = text.length * fontSizeInPx
+                )
 
             for (i in text.indices) {
                 val cursorRect = paragraph.getCursorRect(i)
                 val cursorXOffset = i * fontSizeInPx
-                assertThat(cursorRect).isEqualTo(
-                    Rect(
-                        left = cursorXOffset,
-                        top = 0f,
-                        right = cursorXOffset,
-                        bottom = fontSizeInPx
+                assertThat(cursorRect)
+                    .isEqualTo(
+                        Rect(
+                            left = cursorXOffset,
+                            top = 0f,
+                            right = cursorXOffset,
+                            bottom = fontSizeInPx
+                        )
                     )
-                )
             }
         }
     }
@@ -932,34 +970,37 @@
             val fontSize = 50.sp
             val fontSizeInPx = fontSize.toPx()
             val charsPerLine = 3
-            val paragraph = simpleParagraph(
-                text = text,
-                style = TextStyle(fontSize = fontSize),
-                width = charsPerLine * fontSizeInPx
-            )
+            val paragraph =
+                simpleParagraph(
+                    text = text,
+                    style = TextStyle(fontSize = fontSize),
+                    width = charsPerLine * fontSizeInPx
+                )
 
             for (i in 0 until charsPerLine) {
                 val cursorXOffset = i * fontSizeInPx
-                assertThat(paragraph.getCursorRect(i)).isEqualTo(
-                    Rect(
-                        left = cursorXOffset,
-                        top = 0f,
-                        right = cursorXOffset,
-                        bottom = fontSizeInPx
+                assertThat(paragraph.getCursorRect(i))
+                    .isEqualTo(
+                        Rect(
+                            left = cursorXOffset,
+                            top = 0f,
+                            right = cursorXOffset,
+                            bottom = fontSizeInPx
+                        )
                     )
-                )
             }
 
             for (i in charsPerLine until text.length) {
                 val cursorXOffset = (i % charsPerLine) * fontSizeInPx
-                assertThat(paragraph.getCursorRect(i)).isEqualTo(
-                    Rect(
-                        left = cursorXOffset,
-                        top = fontSizeInPx,
-                        right = cursorXOffset,
-                        bottom = fontSizeInPx * 2f
+                assertThat(paragraph.getCursorRect(i))
+                    .isEqualTo(
+                        Rect(
+                            left = cursorXOffset,
+                            top = fontSizeInPx,
+                            right = cursorXOffset,
+                            bottom = fontSizeInPx * 2f
+                        )
                     )
-                )
             }
         }
     }
@@ -970,30 +1011,24 @@
             val text = "abc\ndef"
             val fontSize = 50.sp
             val fontSizeInPx = fontSize.toPx()
-            val paragraph = simpleParagraph(
-                text = text,
-                style = TextStyle(fontSize = fontSize)
-            )
+            val paragraph = simpleParagraph(text = text, style = TextStyle(fontSize = fontSize))
 
             // Cursor before '\n'
-            assertThat(paragraph.getCursorRect(3)).isEqualTo(
-                Rect(
-                    left = 3 * fontSizeInPx,
-                    top = 0f,
-                    right = 3 * fontSizeInPx,
-                    bottom = fontSizeInPx
+            assertThat(paragraph.getCursorRect(3))
+                .isEqualTo(
+                    Rect(
+                        left = 3 * fontSizeInPx,
+                        top = 0f,
+                        right = 3 * fontSizeInPx,
+                        bottom = fontSizeInPx
+                    )
                 )
-            )
 
             // Cursor after '\n'
-            assertThat(paragraph.getCursorRect(4)).isEqualTo(
-                Rect(
-                    left = 0f,
-                    top = fontSizeInPx,
-                    right = 0f,
-                    bottom = fontSizeInPx * 2f
+            assertThat(paragraph.getCursorRect(4))
+                .isEqualTo(
+                    Rect(left = 0f, top = fontSizeInPx, right = 0f, bottom = fontSizeInPx * 2f)
                 )
-            )
         }
     }
 
@@ -1003,30 +1038,28 @@
             val text = "abc\n"
             val fontSize = 50.sp
             val fontSizeInPx = fontSize.toPx()
-            val paragraph = simpleParagraph(
-                text = text,
-                style = TextStyle(fontSize = fontSize, localeList = ltrLocaleList)
-            )
+            val paragraph =
+                simpleParagraph(
+                    text = text,
+                    style = TextStyle(fontSize = fontSize, localeList = ltrLocaleList)
+                )
 
             // Cursor before '\n'
-            assertThat(paragraph.getCursorRect(3)).isEqualTo(
-                Rect(
-                    left = 3 * fontSizeInPx,
-                    top = 0f,
-                    right = 3 * fontSizeInPx,
-                    bottom = fontSizeInPx
+            assertThat(paragraph.getCursorRect(3))
+                .isEqualTo(
+                    Rect(
+                        left = 3 * fontSizeInPx,
+                        top = 0f,
+                        right = 3 * fontSizeInPx,
+                        bottom = fontSizeInPx
+                    )
                 )
-            )
 
             // Cursor after '\n'
-            assertThat(paragraph.getCursorRect(4)).isEqualTo(
-                Rect(
-                    left = 0f,
-                    top = fontSizeInPx,
-                    right = 0f,
-                    bottom = fontSizeInPx * 2f
+            assertThat(paragraph.getCursorRect(4))
+                .isEqualTo(
+                    Rect(left = 0f, top = fontSizeInPx, right = 0f, bottom = fontSizeInPx * 2f)
                 )
-            )
         }
     }
 
@@ -1036,22 +1069,24 @@
             val text = "\u05D0\u05D1\u05D2"
             val fontSize = 50.sp
             val fontSizeInPx = fontSize.toPx()
-            val paragraph = simpleParagraph(
-                text = text,
-                style = TextStyle(fontSize = fontSize),
-                width = text.length * fontSizeInPx
-            )
+            val paragraph =
+                simpleParagraph(
+                    text = text,
+                    style = TextStyle(fontSize = fontSize),
+                    width = text.length * fontSizeInPx
+                )
 
             for (i in text.indices) {
                 val cursorXOffset = (text.length - i) * fontSizeInPx
-                assertThat(paragraph.getCursorRect(i)).isEqualTo(
-                    Rect(
-                        left = cursorXOffset,
-                        top = 0f,
-                        right = cursorXOffset,
-                        bottom = fontSizeInPx
+                assertThat(paragraph.getCursorRect(i))
+                    .isEqualTo(
+                        Rect(
+                            left = cursorXOffset,
+                            top = 0f,
+                            right = cursorXOffset,
+                            bottom = fontSizeInPx
+                        )
                     )
-                )
             }
         }
     }
@@ -1063,34 +1098,37 @@
             val fontSize = 50.sp
             val fontSizeInPx = fontSize.toPx()
             val charsPerLine = 3
-            val paragraph = simpleParagraph(
-                text = text,
-                style = TextStyle(fontSize = fontSize),
-                width = charsPerLine * fontSizeInPx
-            )
+            val paragraph =
+                simpleParagraph(
+                    text = text,
+                    style = TextStyle(fontSize = fontSize),
+                    width = charsPerLine * fontSizeInPx
+                )
 
             for (i in 0 until charsPerLine) {
                 val cursorXOffset = (charsPerLine - i) * fontSizeInPx
-                assertThat(paragraph.getCursorRect(i)).isEqualTo(
-                    Rect(
-                        left = cursorXOffset,
-                        top = 0f,
-                        right = cursorXOffset,
-                        bottom = fontSizeInPx
+                assertThat(paragraph.getCursorRect(i))
+                    .isEqualTo(
+                        Rect(
+                            left = cursorXOffset,
+                            top = 0f,
+                            right = cursorXOffset,
+                            bottom = fontSizeInPx
+                        )
                     )
-                )
             }
 
             for (i in charsPerLine until text.length) {
                 val cursorXOffset = (charsPerLine - i % charsPerLine) * fontSizeInPx
-                assertThat(paragraph.getCursorRect(i)).isEqualTo(
-                    Rect(
-                        left = cursorXOffset,
-                        top = fontSizeInPx,
-                        right = cursorXOffset,
-                        bottom = fontSizeInPx * 2f
+                assertThat(paragraph.getCursorRect(i))
+                    .isEqualTo(
+                        Rect(
+                            left = cursorXOffset,
+                            top = fontSizeInPx,
+                            right = cursorXOffset,
+                            bottom = fontSizeInPx * 2f
+                        )
                     )
-                )
             }
         }
     }
@@ -1101,31 +1139,27 @@
             val text = "\u05D0\u05D1\u05D2\n\u05D0\u05D1\u05D2"
             val fontSize = 50.sp
             val fontSizeInPx = fontSize.toPx()
-            val paragraph = simpleParagraph(
-                text = text,
-                style = TextStyle(fontSize = fontSize),
-                width = 3 * fontSizeInPx
-            )
+            val paragraph =
+                simpleParagraph(
+                    text = text,
+                    style = TextStyle(fontSize = fontSize),
+                    width = 3 * fontSizeInPx
+                )
 
             // Cursor before '\n'
-            assertThat(paragraph.getCursorRect(3)).isEqualTo(
-                Rect(
-                    left = 0f,
-                    top = 0f,
-                    right = 0f,
-                    bottom = fontSizeInPx
-                )
-            )
+            assertThat(paragraph.getCursorRect(3))
+                .isEqualTo(Rect(left = 0f, top = 0f, right = 0f, bottom = fontSizeInPx))
 
             // Cursor after '\n'
-            assertThat(paragraph.getCursorRect(4)).isEqualTo(
-                Rect(
-                    left = 3 * fontSizeInPx,
-                    top = fontSizeInPx,
-                    right = 3 * fontSizeInPx,
-                    bottom = fontSizeInPx * 2f
+            assertThat(paragraph.getCursorRect(4))
+                .isEqualTo(
+                    Rect(
+                        left = 3 * fontSizeInPx,
+                        top = fontSizeInPx,
+                        right = 3 * fontSizeInPx,
+                        bottom = fontSizeInPx * 2f
+                    )
                 )
-            )
         }
     }
 
@@ -1136,31 +1170,22 @@
             val text = "\u05D0\u05D1\u05D2\n"
             val fontSize = 50.sp
             val fontSizeInPx = fontSize.toPx()
-            val paragraph = simpleParagraph(
-                text = text,
-                style = TextStyle(fontSize = fontSize, localeList = ltrLocaleList),
-                width = 3 * fontSizeInPx
-            )
+            val paragraph =
+                simpleParagraph(
+                    text = text,
+                    style = TextStyle(fontSize = fontSize, localeList = ltrLocaleList),
+                    width = 3 * fontSizeInPx
+                )
 
             // Cursor before '\n'
-            assertThat(paragraph.getCursorRect(3)).isEqualTo(
-                Rect(
-                    left = 0f,
-                    top = 0f,
-                    right = 0f,
-                    bottom = fontSizeInPx
-                )
-            )
+            assertThat(paragraph.getCursorRect(3))
+                .isEqualTo(Rect(left = 0f, top = 0f, right = 0f, bottom = fontSizeInPx))
 
             // Cursor after '\n'
-            assertThat(paragraph.getCursorRect(4)).isEqualTo(
-                Rect(
-                    left = 0f,
-                    top = fontSizeInPx,
-                    right = 0f,
-                    bottom = fontSizeInPx * 2f
+            assertThat(paragraph.getCursorRect(4))
+                .isEqualTo(
+                    Rect(left = 0f, top = fontSizeInPx, right = 0f, bottom = fontSizeInPx * 2f)
                 )
-            )
         }
     }
 
@@ -1170,15 +1195,15 @@
             val text = "abc"
             val fontSize = 50.sp
             val fontSizeInPx = fontSize.toPx()
-            val paragraph = simpleParagraph(
-                text = text,
-                style = TextStyle(fontSize = fontSize),
-                width = text.length * fontSizeInPx
-            )
+            val paragraph =
+                simpleParagraph(
+                    text = text,
+                    style = TextStyle(fontSize = fontSize),
+                    width = text.length * fontSizeInPx
+                )
 
             for (i in 0..text.length) {
-                assertThat(paragraph.getHorizontalPosition(i, true))
-                    .isEqualTo(fontSizeInPx * i)
+                assertThat(paragraph.getHorizontalPosition(i, true)).isEqualTo(fontSizeInPx * i)
             }
         }
     }
@@ -1190,11 +1215,8 @@
             val fontSize = 50.sp
             val fontSizeInPx = fontSize.toPx()
             val width = text.length * fontSizeInPx
-            val paragraph = simpleParagraph(
-                text = text,
-                style = TextStyle(fontSize = fontSize),
-                width = width
-            )
+            val paragraph =
+                simpleParagraph(text = text, style = TextStyle(fontSize = fontSize), width = width)
 
             for (i in 0..text.length) {
                 assertThat(paragraph.getHorizontalPosition(i, true))
@@ -1212,15 +1234,11 @@
             val fontSize = 50.sp
             val fontSizeInPx = fontSize.toPx()
             val width = text.length * fontSizeInPx
-            val paragraph = simpleParagraph(
-                text = text,
-                style = TextStyle(fontSize = fontSize),
-                width = width
-            )
+            val paragraph =
+                simpleParagraph(text = text, style = TextStyle(fontSize = fontSize), width = width)
 
             for (i in 0..ltrText.length) {
-                assertThat(paragraph.getHorizontalPosition(i, true))
-                    .isEqualTo(fontSizeInPx * i)
+                assertThat(paragraph.getHorizontalPosition(i, true)).isEqualTo(fontSizeInPx * i)
             }
 
             for (i in 1 until rtlText.length) {
@@ -1228,8 +1246,7 @@
                     .isEqualTo(width - fontSizeInPx * i)
             }
 
-            assertThat(paragraph.getHorizontalPosition(text.length, true))
-                .isEqualTo(width)
+            assertThat(paragraph.getHorizontalPosition(text.length, true)).isEqualTo(width)
         }
     }
 
@@ -1240,20 +1257,17 @@
             val fontSize = 50.sp
             val fontSizeInPx = fontSize.toPx()
             val width = text.length * fontSizeInPx
-            val paragraph = simpleParagraph(
-                text = text,
-                style = TextStyle(
-                    fontSize = fontSize,
-                    textDirection = TextDirection.Rtl
-                ),
-                width = width
-            )
+            val paragraph =
+                simpleParagraph(
+                    text = text,
+                    style = TextStyle(fontSize = fontSize, textDirection = TextDirection.Rtl),
+                    width = width
+                )
 
             assertThat(paragraph.getHorizontalPosition(0, true)).isEqualTo(width)
 
             for (i in 1 until text.length) {
-                assertThat(paragraph.getHorizontalPosition(i, true))
-                    .isEqualTo(fontSizeInPx * i)
+                assertThat(paragraph.getHorizontalPosition(i, true)).isEqualTo(fontSizeInPx * i)
             }
 
             assertThat(paragraph.getHorizontalPosition(text.length, true)).isZero()
@@ -1267,14 +1281,12 @@
             val fontSize = 50.sp
             val fontSizeInPx = fontSize.toPx()
             val width = text.length * fontSizeInPx
-            val paragraph = simpleParagraph(
-                text = text,
-                style = TextStyle(
-                    fontSize = fontSize,
-                    textDirection = TextDirection.Ltr
-                ),
-                width = width
-            )
+            val paragraph =
+                simpleParagraph(
+                    text = text,
+                    style = TextStyle(fontSize = fontSize, textDirection = TextDirection.Ltr),
+                    width = width
+                )
 
             assertThat(paragraph.getHorizontalPosition(0, true)).isZero()
 
@@ -1283,8 +1295,7 @@
                     .isEqualTo(width - fontSizeInPx * i)
             }
 
-            assertThat(paragraph.getHorizontalPosition(text.length, true))
-                .isEqualTo(width)
+            assertThat(paragraph.getHorizontalPosition(text.length, true)).isEqualTo(width)
         }
     }
 
@@ -1297,18 +1308,15 @@
             val fontSize = 50.sp
             val fontSizeInPx = fontSize.toPx()
             val width = text.length * fontSizeInPx
-            val paragraph = simpleParagraph(
-                text = text,
-                style = TextStyle(
-                    fontSize = fontSize,
-                    textDirection = TextDirection.Ltr
-                ),
-                width = width
-            )
+            val paragraph =
+                simpleParagraph(
+                    text = text,
+                    style = TextStyle(fontSize = fontSize, textDirection = TextDirection.Ltr),
+                    width = width
+                )
 
             for (i in 0..ltrText.length) {
-                assertThat(paragraph.getHorizontalPosition(i, true))
-                    .isEqualTo(fontSizeInPx * i)
+                assertThat(paragraph.getHorizontalPosition(i, true)).isEqualTo(fontSizeInPx * i)
             }
 
             for (i in 1 until rtlText.length) {
@@ -1316,8 +1324,7 @@
                     .isEqualTo(width - fontSizeInPx * i)
             }
 
-            assertThat(paragraph.getHorizontalPosition(text.length, true))
-                .isEqualTo(width)
+            assertThat(paragraph.getHorizontalPosition(text.length, true)).isEqualTo(width)
         }
     }
 
@@ -1330,14 +1337,12 @@
             val fontSize = 50.sp
             val fontSizeInPx = fontSize.toPx()
             val width = text.length * fontSizeInPx
-            val paragraph = simpleParagraph(
-                text = text,
-                style = TextStyle(
-                    fontSize = fontSize,
-                    textDirection = TextDirection.Rtl
-                ),
-                width = width
-            )
+            val paragraph =
+                simpleParagraph(
+                    text = text,
+                    style = TextStyle(fontSize = fontSize, textDirection = TextDirection.Rtl),
+                    width = width
+                )
 
             assertThat(paragraph.getHorizontalPosition(0, true)).isEqualTo(width)
 
@@ -1360,11 +1365,12 @@
             val fontSize = 50.sp
             val fontSizeInPx = fontSize.toPx()
             val width = text.length * fontSizeInPx
-            val paragraph = simpleParagraph(
-                text = text,
-                style = TextStyle(fontSize = fontSize, localeList = ltrLocaleList),
-                width = width
-            )
+            val paragraph =
+                simpleParagraph(
+                    text = text,
+                    style = TextStyle(fontSize = fontSize, localeList = ltrLocaleList),
+                    width = width
+                )
 
             assertThat(paragraph.getHorizontalPosition(text.length, true)).isZero()
         }
@@ -1379,11 +1385,12 @@
             val fontSize = 50.sp
             val fontSizeInPx = fontSize.toPx()
             val width = text.length * fontSizeInPx
-            val paragraph = simpleParagraph(
-                text = text,
-                style = TextStyle(fontSize = fontSize, localeList = ltrLocaleList),
-                width = width
-            )
+            val paragraph =
+                simpleParagraph(
+                    text = text,
+                    style = TextStyle(fontSize = fontSize, localeList = ltrLocaleList),
+                    width = width
+                )
 
             assertThat(paragraph.getHorizontalPosition(text.length, true)).isZero()
         }
@@ -1396,17 +1403,14 @@
             val fontSize = 50.sp
             val fontSizeInPx = fontSize.toPx()
             val width = text.length * fontSizeInPx
-            val paragraph = simpleParagraph(
-                text = text,
-                style = TextStyle(
-                    fontSize = fontSize,
-                    textDirection = TextDirection.Rtl
-                ),
-                width = width
-            )
+            val paragraph =
+                simpleParagraph(
+                    text = text,
+                    style = TextStyle(fontSize = fontSize, textDirection = TextDirection.Rtl),
+                    width = width
+                )
 
-            assertThat(paragraph.getHorizontalPosition(text.length, true))
-                .isEqualTo(width)
+            assertThat(paragraph.getHorizontalPosition(text.length, true)).isEqualTo(width)
         }
     }
 
@@ -1417,14 +1421,12 @@
             val fontSize = 50.sp
             val fontSizeInPx = fontSize.toPx()
             val width = text.length * fontSizeInPx
-            val paragraph = simpleParagraph(
-                text = text,
-                style = TextStyle(
-                    fontSize = fontSize,
-                    textDirection = TextDirection.Ltr
-                ),
-                width = width
-            )
+            val paragraph =
+                simpleParagraph(
+                    text = text,
+                    style = TextStyle(fontSize = fontSize, textDirection = TextDirection.Ltr),
+                    width = width
+                )
 
             assertThat(paragraph.getHorizontalPosition(text.length, true)).isZero()
         }
@@ -1436,15 +1438,15 @@
             val text = "abc"
             val fontSize = 50.sp
             val fontSizeInPx = fontSize.toPx()
-            val paragraph = simpleParagraph(
-                text = text,
-                style = TextStyle(fontSize = fontSize),
-                width = text.length * fontSizeInPx
-            )
+            val paragraph =
+                simpleParagraph(
+                    text = text,
+                    style = TextStyle(fontSize = fontSize),
+                    width = text.length * fontSizeInPx
+                )
 
             for (i in 0..text.length) {
-                assertThat(paragraph.getHorizontalPosition(i, false))
-                    .isEqualTo(fontSizeInPx * i)
+                assertThat(paragraph.getHorizontalPosition(i, false)).isEqualTo(fontSizeInPx * i)
             }
         }
     }
@@ -1456,11 +1458,8 @@
             val fontSize = 50.sp
             val fontSizeInPx = fontSize.toPx()
             val width = text.length * fontSizeInPx
-            val paragraph = simpleParagraph(
-                text = text,
-                style = TextStyle(fontSize = fontSize),
-                width = width
-            )
+            val paragraph =
+                simpleParagraph(text = text, style = TextStyle(fontSize = fontSize), width = width)
 
             for (i in 0..text.length) {
                 assertThat(paragraph.getHorizontalPosition(i, false))
@@ -1478,15 +1477,11 @@
             val fontSize = 50.sp
             val fontSizeInPx = fontSize.toPx()
             val width = text.length * fontSizeInPx
-            val paragraph = simpleParagraph(
-                text = text,
-                style = TextStyle(fontSize = fontSize),
-                width = width
-            )
+            val paragraph =
+                simpleParagraph(text = text, style = TextStyle(fontSize = fontSize), width = width)
 
             for (i in ltrText.indices) {
-                assertThat(paragraph.getHorizontalPosition(i, false))
-                    .isEqualTo(fontSizeInPx * i)
+                assertThat(paragraph.getHorizontalPosition(i, false)).isEqualTo(fontSizeInPx * i)
             }
 
             for (i in 0..rtlText.length) {
@@ -1503,24 +1498,20 @@
             val fontSize = 50.sp
             val fontSizeInPx = fontSize.toPx()
             val width = text.length * fontSizeInPx
-            val paragraph = simpleParagraph(
-                text = text,
-                style = TextStyle(
-                    fontSize = fontSize,
-                    textDirection = TextDirection.Rtl
-                ),
-                width = width
-            )
+            val paragraph =
+                simpleParagraph(
+                    text = text,
+                    style = TextStyle(fontSize = fontSize, textDirection = TextDirection.Rtl),
+                    width = width
+                )
 
             assertThat(paragraph.getHorizontalPosition(0, false)).isZero()
 
             for (i in 1 until text.length) {
-                assertThat(paragraph.getHorizontalPosition(i, false))
-                    .isEqualTo(fontSizeInPx * i)
+                assertThat(paragraph.getHorizontalPosition(i, false)).isEqualTo(fontSizeInPx * i)
             }
 
-            assertThat(paragraph.getHorizontalPosition(text.length, false))
-                .isEqualTo(width)
+            assertThat(paragraph.getHorizontalPosition(text.length, false)).isEqualTo(width)
         }
     }
 
@@ -1531,14 +1522,12 @@
             val fontSize = 50.sp
             val fontSizeInPx = fontSize.toPx()
             val width = text.length * fontSizeInPx
-            val paragraph = simpleParagraph(
-                text = text,
-                style = TextStyle(
-                    fontSize = fontSize,
-                    textDirection = TextDirection.Ltr
-                ),
-                width = width
-            )
+            val paragraph =
+                simpleParagraph(
+                    text = text,
+                    style = TextStyle(fontSize = fontSize, textDirection = TextDirection.Ltr),
+                    width = width
+                )
 
             assertThat(paragraph.getHorizontalPosition(0, false)).isEqualTo(width)
 
@@ -1560,18 +1549,15 @@
             val fontSize = 50.sp
             val fontSizeInPx = fontSize.toPx()
             val width = text.length * fontSizeInPx
-            val paragraph = simpleParagraph(
-                text = text,
-                style = TextStyle(
-                    fontSize = fontSize,
-                    textDirection = TextDirection.Ltr
-                ),
-                width = width
-            )
+            val paragraph =
+                simpleParagraph(
+                    text = text,
+                    style = TextStyle(fontSize = fontSize, textDirection = TextDirection.Ltr),
+                    width = width
+                )
 
             for (i in ltrText.indices) {
-                assertThat(paragraph.getHorizontalPosition(i, false))
-                    .isEqualTo(fontSizeInPx * i)
+                assertThat(paragraph.getHorizontalPosition(i, false)).isEqualTo(fontSizeInPx * i)
             }
 
             for (i in rtlText.indices) {
@@ -1593,14 +1579,12 @@
             val fontSize = 50.sp
             val fontSizeInPx = fontSize.toPx()
             val width = text.length * fontSizeInPx
-            val paragraph = simpleParagraph(
-                text = text,
-                style = TextStyle(
-                    fontSize = fontSize,
-                    textDirection = TextDirection.Rtl
-                ),
-                width = width
-            )
+            val paragraph =
+                simpleParagraph(
+                    text = text,
+                    style = TextStyle(fontSize = fontSize, textDirection = TextDirection.Rtl),
+                    width = width
+                )
 
             assertThat(paragraph.getHorizontalPosition(0, false))
                 .isEqualTo(width - ltrText.length * fontSizeInPx)
@@ -1624,11 +1608,12 @@
             val fontSize = 50.sp
             val fontSizeInPx = fontSize.toPx()
             val width = text.length * fontSizeInPx
-            val paragraph = simpleParagraph(
-                text = text,
-                style = TextStyle(fontSize = fontSize, localeList = ltrLocaleList),
-                width = width
-            )
+            val paragraph =
+                simpleParagraph(
+                    text = text,
+                    style = TextStyle(fontSize = fontSize, localeList = ltrLocaleList),
+                    width = width
+                )
 
             assertThat(paragraph.getHorizontalPosition(text.length, false)).isZero()
         }
@@ -1643,11 +1628,12 @@
             val fontSize = 50.sp
             val fontSizeInPx = fontSize.toPx()
             val width = text.length * fontSizeInPx
-            val paragraph = simpleParagraph(
-                text = text,
-                style = TextStyle(fontSize = fontSize, localeList = ltrLocaleList),
-                width = width
-            )
+            val paragraph =
+                simpleParagraph(
+                    text = text,
+                    style = TextStyle(fontSize = fontSize, localeList = ltrLocaleList),
+                    width = width
+                )
 
             assertThat(paragraph.getHorizontalPosition(text.length, false)).isZero()
         }
@@ -1660,17 +1646,14 @@
             val fontSize = 50.sp
             val fontSizeInPx = fontSize.toPx()
             val width = text.length * fontSizeInPx
-            val paragraph = simpleParagraph(
-                text = text,
-                style = TextStyle(
-                    fontSize = fontSize,
-                    textDirection = TextDirection.Rtl
-                ),
-                width = width
-            )
+            val paragraph =
+                simpleParagraph(
+                    text = text,
+                    style = TextStyle(fontSize = fontSize, textDirection = TextDirection.Rtl),
+                    width = width
+                )
 
-            assertThat(paragraph.getHorizontalPosition(text.length, false))
-                .isEqualTo(width)
+            assertThat(paragraph.getHorizontalPosition(text.length, false)).isEqualTo(width)
         }
     }
 
@@ -1681,14 +1664,12 @@
             val fontSize = 50.sp
             val fontSizeInPx = fontSize.toPx()
             val width = text.length * fontSizeInPx
-            val paragraph = simpleParagraph(
-                text = text,
-                style = TextStyle(
-                    fontSize = fontSize,
-                    textDirection = TextDirection.Ltr
-                ),
-                width = width
-            )
+            val paragraph =
+                simpleParagraph(
+                    text = text,
+                    style = TextStyle(fontSize = fontSize, textDirection = TextDirection.Ltr),
+                    width = width
+                )
 
             assertThat(paragraph.getHorizontalPosition(text.length, false)).isZero()
         }
@@ -1701,11 +1682,8 @@
             val fontSize = 50.sp
             val fontSizeInPx = fontSize.toPx()
             val width = text.length * fontSizeInPx
-            val paragraph = simpleParagraph(
-                text = text,
-                style = TextStyle(fontSize = fontSize),
-                width = width
-            )
+            val paragraph =
+                simpleParagraph(text = text, style = TextStyle(fontSize = fontSize), width = width)
 
             for (i in 0..text.length) {
                 assertThat(paragraph.getParagraphDirection(i)).isEqualTo(ResolvedTextDirection.Ltr)
@@ -1720,14 +1698,12 @@
             val fontSize = 50.sp
             val fontSizeInPx = fontSize.toPx()
             val width = text.length * fontSizeInPx
-            val paragraph = simpleParagraph(
-                text = text,
-                style = TextStyle(
-                    fontSize = fontSize,
-                    textDirection = TextDirection.Rtl
-                ),
-                width = width
-            )
+            val paragraph =
+                simpleParagraph(
+                    text = text,
+                    style = TextStyle(fontSize = fontSize, textDirection = TextDirection.Rtl),
+                    width = width
+                )
 
             for (i in 0..text.length) {
                 assertThat(paragraph.getParagraphDirection(i)).isEqualTo(ResolvedTextDirection.Rtl)
@@ -1742,11 +1718,8 @@
             val fontSize = 50.sp
             val fontSizeInPx = fontSize.toPx()
             val width = text.length * fontSizeInPx
-            val paragraph = simpleParagraph(
-                text = text,
-                style = TextStyle(fontSize = fontSize),
-                width = width
-            )
+            val paragraph =
+                simpleParagraph(text = text, style = TextStyle(fontSize = fontSize), width = width)
 
             for (i in text.indices) {
                 assertThat(paragraph.getParagraphDirection(i)).isEqualTo(ResolvedTextDirection.Rtl)
@@ -1761,14 +1734,12 @@
             val fontSize = 50.sp
             val fontSizeInPx = fontSize.toPx()
             val width = text.length * fontSizeInPx
-            val paragraph = simpleParagraph(
-                text = text,
-                style = TextStyle(
-                    fontSize = fontSize,
-                    textDirection = TextDirection.Ltr
-                ),
-                width = width
-            )
+            val paragraph =
+                simpleParagraph(
+                    text = text,
+                    style = TextStyle(fontSize = fontSize, textDirection = TextDirection.Ltr),
+                    width = width
+                )
 
             for (i in 0..text.length) {
                 assertThat(paragraph.getParagraphDirection(i)).isEqualTo(ResolvedTextDirection.Ltr)
@@ -1785,11 +1756,8 @@
             val fontSize = 50.sp
             val fontSizeInPx = fontSize.toPx()
             val width = text.length * fontSizeInPx
-            val paragraph = simpleParagraph(
-                text = text,
-                style = TextStyle(fontSize = fontSize),
-                width = width
-            )
+            val paragraph =
+                simpleParagraph(text = text, style = TextStyle(fontSize = fontSize), width = width)
 
             for (i in 0..text.length) {
                 assertThat(paragraph.getParagraphDirection(i)).isEqualTo(ResolvedTextDirection.Ltr)
@@ -1806,14 +1774,12 @@
             val fontSize = 50.sp
             val fontSizeInPx = fontSize.toPx()
             val width = text.length * fontSizeInPx
-            val paragraph = simpleParagraph(
-                text = text,
-                style = TextStyle(
-                    fontSize = fontSize,
-                    textDirection = TextDirection.Ltr
-                ),
-                width = width
-            )
+            val paragraph =
+                simpleParagraph(
+                    text = text,
+                    style = TextStyle(fontSize = fontSize, textDirection = TextDirection.Ltr),
+                    width = width
+                )
 
             for (i in 0..text.length) {
                 assertThat(paragraph.getParagraphDirection(i)).isEqualTo(ResolvedTextDirection.Ltr)
@@ -1830,14 +1796,12 @@
             val fontSize = 50.sp
             val fontSizeInPx = fontSize.toPx()
             val width = text.length * fontSizeInPx
-            val paragraph = simpleParagraph(
-                text = text,
-                style = TextStyle(
-                    fontSize = fontSize,
-                    textDirection = TextDirection.Rtl
-                ),
-                width = width
-            )
+            val paragraph =
+                simpleParagraph(
+                    text = text,
+                    style = TextStyle(fontSize = fontSize, textDirection = TextDirection.Rtl),
+                    width = width
+                )
 
             for (i in 0..text.length) {
                 assertThat(paragraph.getParagraphDirection(i)).isEqualTo(ResolvedTextDirection.Rtl)
@@ -1852,11 +1816,8 @@
             val fontSize = 50.sp
             val fontSizeInPx = fontSize.toPx()
             val width = text.length * fontSizeInPx
-            val paragraph = simpleParagraph(
-                text = text,
-                style = TextStyle(fontSize = fontSize),
-                width = width
-            )
+            val paragraph =
+                simpleParagraph(text = text, style = TextStyle(fontSize = fontSize), width = width)
 
             for (i in 0..text.length) {
                 assertThat(paragraph.getBidiRunDirection(i)).isEqualTo(ResolvedTextDirection.Ltr)
@@ -1871,14 +1832,12 @@
             val fontSize = 50.sp
             val fontSizeInPx = fontSize.toPx()
             val width = text.length * fontSizeInPx
-            val paragraph = simpleParagraph(
-                text = text,
-                style = TextStyle(
-                    fontSize = fontSize,
-                    textDirection = TextDirection.Rtl
-                ),
-                width = width
-            )
+            val paragraph =
+                simpleParagraph(
+                    text = text,
+                    style = TextStyle(fontSize = fontSize, textDirection = TextDirection.Rtl),
+                    width = width
+                )
 
             for (i in 0..text.length) {
                 assertThat(paragraph.getBidiRunDirection(i)).isEqualTo(ResolvedTextDirection.Ltr)
@@ -1893,11 +1852,8 @@
             val fontSize = 50.sp
             val fontSizeInPx = fontSize.toPx()
             val width = text.length * fontSizeInPx
-            val paragraph = simpleParagraph(
-                text = text,
-                style = TextStyle(fontSize = fontSize),
-                width = width
-            )
+            val paragraph =
+                simpleParagraph(text = text, style = TextStyle(fontSize = fontSize), width = width)
 
             for (i in text.indices) {
                 assertThat(paragraph.getBidiRunDirection(i)).isEqualTo(ResolvedTextDirection.Rtl)
@@ -1912,21 +1868,18 @@
             val fontSize = 50.sp
             val fontSizeInPx = fontSize.toPx()
             val width = text.length * fontSizeInPx
-            val paragraph = simpleParagraph(
-                text = text,
-                style = TextStyle(
-                    fontSize = fontSize,
-                    textDirection = TextDirection.Ltr
-                ),
-                width = width
-            )
+            val paragraph =
+                simpleParagraph(
+                    text = text,
+                    style = TextStyle(fontSize = fontSize, textDirection = TextDirection.Ltr),
+                    width = width
+                )
 
             for (i in 0 until text.length - 1) {
                 assertThat(paragraph.getBidiRunDirection(i)).isEqualTo(ResolvedTextDirection.Rtl)
             }
-            assertThat(
-                paragraph.getBidiRunDirection(text.length - 1)
-            ).isEqualTo(ResolvedTextDirection.Ltr)
+            assertThat(paragraph.getBidiRunDirection(text.length - 1))
+                .isEqualTo(ResolvedTextDirection.Ltr)
         }
     }
 
@@ -1939,11 +1892,8 @@
             val fontSize = 50.sp
             val fontSizeInPx = fontSize.toPx()
             val width = text.length * fontSizeInPx
-            val paragraph = simpleParagraph(
-                text = text,
-                style = TextStyle(fontSize = fontSize),
-                width = width
-            )
+            val paragraph =
+                simpleParagraph(text = text, style = TextStyle(fontSize = fontSize), width = width)
 
             for (i in ltrText.indices) {
                 assertThat(paragraph.getBidiRunDirection(i)).isEqualTo(ResolvedTextDirection.Ltr)
@@ -1964,14 +1914,12 @@
             val fontSize = 50.sp
             val fontSizeInPx = fontSize.toPx()
             val width = text.length * fontSizeInPx
-            val paragraph = simpleParagraph(
-                text = text,
-                style = TextStyle(
-                    fontSize = fontSize,
-                    textDirection = TextDirection.Ltr
-                ),
-                width = width
-            )
+            val paragraph =
+                simpleParagraph(
+                    text = text,
+                    style = TextStyle(fontSize = fontSize, textDirection = TextDirection.Ltr),
+                    width = width
+                )
 
             for (i in ltrText.indices) {
                 assertThat(paragraph.getBidiRunDirection(i)).isEqualTo(ResolvedTextDirection.Ltr)
@@ -1992,14 +1940,12 @@
             val fontSize = 50.sp
             val fontSizeInPx = fontSize.toPx()
             val width = text.length * fontSizeInPx
-            val paragraph = simpleParagraph(
-                text = text,
-                style = TextStyle(
-                    fontSize = fontSize,
-                    textDirection = TextDirection.Rtl
-                ),
-                width = width
-            )
+            val paragraph =
+                simpleParagraph(
+                    text = text,
+                    style = TextStyle(fontSize = fontSize, textDirection = TextDirection.Rtl),
+                    width = width
+                )
 
             for (i in ltrText.indices) {
                 assertThat(paragraph.getBidiRunDirection(i)).isEqualTo(ResolvedTextDirection.Ltr)
@@ -2017,30 +1963,30 @@
             val text = "\u82B1"
             val fontSize = 10.sp
             val fontSizeInPx = fontSize.toPx()
-            val locales = arrayOf(
-                // duplicate ja is on purpose
-                LocaleList("ja"),
-                LocaleList("ja"),
-                LocaleList("zh-CN"),
-                LocaleList("zh-TW")
-            )
-
-            val bitmaps = locales.map { localeList ->
-                val paragraph = Paragraph(
-                    text = text,
-                    spanStyles = listOf(),
-                    style = TextStyle(
-                        fontSize = fontSize,
-                        localeList = localeList
-                    ),
-                    density = defaultDensity,
-                    fontFamilyResolver = resourceLoader,
-                    // just have 10x font size to have a bitmap
-                    constraints = Constraints(maxWidth = (fontSizeInPx * 10).ceilToInt())
+            val locales =
+                arrayOf(
+                    // duplicate ja is on purpose
+                    LocaleList("ja"),
+                    LocaleList("ja"),
+                    LocaleList("zh-CN"),
+                    LocaleList("zh-TW")
                 )
 
-                paragraph.bitmap()
-            }
+            val bitmaps =
+                locales.map { localeList ->
+                    val paragraph =
+                        Paragraph(
+                            text = text,
+                            spanStyles = listOf(),
+                            style = TextStyle(fontSize = fontSize, localeList = localeList),
+                            density = defaultDensity,
+                            fontFamilyResolver = resourceLoader,
+                            // just have 10x font size to have a bitmap
+                            constraints = Constraints(maxWidth = (fontSizeInPx * 10).ceilToInt())
+                        )
+
+                    paragraph.bitmap()
+                }
 
             assertThat(bitmaps[0]).isEqualToBitmap(bitmaps[1])
             assertThat(bitmaps[1]).isNotEqualToBitmap(bitmaps[2])
@@ -2056,11 +2002,12 @@
         val fontSize = 100.sp
         val lineCount = text.lines().size
         val maxLines = lineCount - 1
-        val paragraph = simpleParagraph(
-            text = text,
-            style = TextStyle(fontSize = fontSize),
-            maxLines = maxLines
-        )
+        val paragraph =
+            simpleParagraph(
+                text = text,
+                style = TextStyle(fontSize = fontSize),
+                maxLines = maxLines
+            )
 
         assertThat(paragraph.lineCount).isEqualTo(maxLines)
     }
@@ -2071,29 +2018,24 @@
         val fontSize = 100.sp
         val lineCount = text.lines().size
         val maxLines = lineCount + 1
-        val paragraph = simpleParagraph(
-            text = text,
-            style = TextStyle(fontSize = fontSize),
-            maxLines = maxLines
-        )
+        val paragraph =
+            simpleParagraph(
+                text = text,
+                style = TextStyle(fontSize = fontSize),
+                maxLines = maxLines
+            )
 
         assertThat(paragraph.lineCount).isEqualTo(lineCount)
     }
 
     @Test(expected = java.lang.IllegalArgumentException::class)
     fun maxLines_withMaxLineEqualsZero_throwsException() {
-        simpleParagraph(
-            text = "",
-            maxLines = 0
-        )
+        simpleParagraph(text = "", maxLines = 0)
     }
 
     @Test(expected = java.lang.IllegalArgumentException::class)
     fun maxLines_withMaxLineNegative_throwsException() {
-        simpleParagraph(
-            text = "",
-            maxLines = -1
-        )
+        simpleParagraph(text = "", maxLines = -1)
     }
 
     @Test
@@ -2104,11 +2046,12 @@
             val fontSizeInPx = fontSize.toPx()
             val lineCount = text.lines().size
             val maxLines = lineCount - 1
-            val paragraph = simpleParagraph(
-                text = text,
-                style = TextStyle(fontSize = fontSize),
-                maxLines = maxLines
-            )
+            val paragraph =
+                simpleParagraph(
+                    text = text,
+                    style = TextStyle(fontSize = fontSize),
+                    maxLines = maxLines
+                )
 
             val expectHeight = maxLines * fontSizeInPx
             assertThat(paragraph.height).isEqualTo(expectHeight)
@@ -2123,11 +2066,12 @@
             val fontSizeInPx = fontSize.toPx()
             val lineCount = text.lines().size
             val maxLines = lineCount - 1
-            val paragraph = simpleParagraph(
-                text = text,
-                style = TextStyle(fontSize = fontSize),
-                maxLines = maxLines
-            )
+            val paragraph =
+                simpleParagraph(
+                    text = text,
+                    style = TextStyle(fontSize = fontSize),
+                    maxLines = maxLines
+                )
 
             assertThat(paragraph.lineCount).isEqualTo(maxLines)
             val expectFirstBaseline = 0.8f * fontSizeInPx
@@ -2144,11 +2088,12 @@
             val fontSize = 100.sp
             val fontSizeInPx = fontSize.toPx()
             val maxLines = text.lines().size
-            val paragraph = simpleParagraph(
-                text = text,
-                style = TextStyle(fontSize = fontSize),
-                maxLines = maxLines
-            )
+            val paragraph =
+                simpleParagraph(
+                    text = text,
+                    style = TextStyle(fontSize = fontSize),
+                    maxLines = maxLines
+                )
 
             val expectHeight = maxLines * fontSizeInPx
             assertThat(paragraph.height).isEqualTo(expectHeight)
@@ -2163,17 +2108,19 @@
             val fontSizeInPx = fontSize.toPx()
             val lineCount = text.lines().size
             val maxLines = lineCount + 1
-            val paragraph = simpleParagraph(
-                text = text,
-                style = TextStyle(fontSize = fontSize),
-                maxLines = maxLines,
-                width = 200f
-            )
+            val paragraph =
+                simpleParagraph(
+                    text = text,
+                    style = TextStyle(fontSize = fontSize),
+                    maxLines = maxLines,
+                    width = 200f
+                )
 
             val expectHeight = lineCount * fontSizeInPx
             assertThat(paragraph.height).isEqualTo(expectHeight)
         }
     }
+
     @Test
     fun maxLines_withMaxLineGreaterThanTextLines_haveCorrectBaselines() {
         with(defaultDensity) {
@@ -2182,11 +2129,12 @@
             val fontSizeInPx = fontSize.toPx()
             val lineCount = text.lines().size
             val maxLines = lineCount + 1
-            val paragraph = simpleParagraph(
-                text = text,
-                style = TextStyle(fontSize = fontSize),
-                maxLines = maxLines
-            )
+            val paragraph =
+                simpleParagraph(
+                    text = text,
+                    style = TextStyle(fontSize = fontSize),
+                    maxLines = maxLines
+                )
 
             assertThat(paragraph.lineCount).isEqualTo(lineCount)
             val expectFirstBaseline = 0.8f * fontSizeInPx
@@ -2204,40 +2152,42 @@
             val fontSizeInPx = fontSize.toPx()
             val maxLines = 1
 
-            val paragraphWithMaxLine = simpleParagraph(
-                text = text,
-                style = TextStyle(fontSize = fontSize),
-                maxLines = maxLines,
-                width = fontSizeInPx
-            )
+            val paragraphWithMaxLine =
+                simpleParagraph(
+                    text = text,
+                    style = TextStyle(fontSize = fontSize),
+                    maxLines = maxLines,
+                    width = fontSizeInPx
+                )
 
-            val paragraphNoMaxLine = simpleParagraph(
-                text = text,
-                style = TextStyle(fontSize = fontSize),
-                width = fontSizeInPx
-            )
+            val paragraphNoMaxLine =
+                simpleParagraph(
+                    text = text,
+                    style = TextStyle(fontSize = fontSize),
+                    width = fontSizeInPx
+                )
 
             // Make sure the maxLine is applied correctly
             assertThat(paragraphNoMaxLine.height).isGreaterThan(paragraphWithMaxLine.height)
 
-            val imageNoMaxLine = ImageBitmap(
-                paragraphNoMaxLine.width.roundToInt(),
-                paragraphNoMaxLine.height.roundToInt(),
-                ImageBitmapConfig.Argb8888
-            )
+            val imageNoMaxLine =
+                ImageBitmap(
+                    paragraphNoMaxLine.width.roundToInt(),
+                    paragraphNoMaxLine.height.roundToInt(),
+                    ImageBitmapConfig.Argb8888
+                )
             // Same size with imageNoMaxLine for comparison
-            val imageWithMaxLine = ImageBitmap(
-                paragraphNoMaxLine.width.roundToInt(),
-                paragraphNoMaxLine.height.roundToInt(),
-                ImageBitmapConfig.Argb8888
-            )
+            val imageWithMaxLine =
+                ImageBitmap(
+                    paragraphNoMaxLine.width.roundToInt(),
+                    paragraphNoMaxLine.height.roundToInt(),
+                    ImageBitmapConfig.Argb8888
+                )
 
             paragraphNoMaxLine.paint(Canvas(imageNoMaxLine))
             paragraphWithMaxLine.paint(Canvas(imageWithMaxLine))
-            assertThat(imageNoMaxLine.asAndroidBitmap()).isNotEqualToBitmap(
-                imageWithMaxLine
-                    .asAndroidBitmap()
-            )
+            assertThat(imageNoMaxLine.asAndroidBitmap())
+                .isNotEqualToBitmap(imageWithMaxLine.asAndroidBitmap())
         }
     }
 
@@ -2245,10 +2195,7 @@
     fun didExceedMaxLines_withMaxLinesSmallerThanTextLines_returnsTrue() {
         val text = "aaa\naa"
         val maxLines = text.lines().size - 1
-        val paragraph = simpleParagraph(
-            text = text,
-            maxLines = maxLines
-        )
+        val paragraph = simpleParagraph(text = text, maxLines = maxLines)
 
         assertThat(paragraph.didExceedMaxLines).isTrue()
     }
@@ -2257,10 +2204,7 @@
     fun didExceedMaxLines_withMaxLinesEqualToTextLines_returnsFalse() {
         val text = "aaa\naa"
         val maxLines = text.lines().size
-        val paragraph = simpleParagraph(
-            text = text,
-            maxLines = maxLines
-        )
+        val paragraph = simpleParagraph(text = text, maxLines = maxLines)
 
         assertThat(paragraph.didExceedMaxLines).isFalse()
     }
@@ -2269,10 +2213,7 @@
     fun didExceedMaxLines_withMaxLinesGreaterThanTextLines_returnsFalse() {
         val text = "aaa\naa"
         val maxLines = text.lines().size + 1
-        val paragraph = simpleParagraph(
-            text = text,
-            maxLines = maxLines
-        )
+        val paragraph = simpleParagraph(text = text, maxLines = maxLines)
 
         assertThat(paragraph.didExceedMaxLines).isFalse()
     }
@@ -2284,13 +2225,14 @@
             val fontSize = 50.sp
             val fontSizeInPx = fontSize.toPx()
             val maxLines = 1
-            val paragraph = simpleParagraph(
-                text = text,
-                style = TextStyle(fontSize = fontSize),
-                maxLines = maxLines,
-                // One line can only contain 1 character
-                width = fontSizeInPx
-            )
+            val paragraph =
+                simpleParagraph(
+                    text = text,
+                    style = TextStyle(fontSize = fontSize),
+                    maxLines = maxLines,
+                    // One line can only contain 1 character
+                    width = fontSizeInPx
+                )
 
             assertThat(paragraph.didExceedMaxLines).isTrue()
         }
@@ -2300,10 +2242,7 @@
     fun didExceedMaxLines_withMaxLinesEqualToTextLines_withLineWrap_returnsFalse() {
         val text = "a"
         val maxLines = text.lines().size
-        val paragraph = simpleParagraph(
-            text = text,
-            maxLines = maxLines
-        )
+        val paragraph = simpleParagraph(text = text, maxLines = maxLines)
 
         assertThat(paragraph.didExceedMaxLines).isFalse()
     }
@@ -2315,13 +2254,14 @@
             val maxLines = 3
             val fontSize = 50.sp
             val fontSizeInPx = fontSize.toPx()
-            val paragraph = simpleParagraph(
-                text = text,
-                style = TextStyle(fontSize = fontSize),
-                maxLines = maxLines,
-                // One line can only contain 1 character
-                width = fontSizeInPx
-            )
+            val paragraph =
+                simpleParagraph(
+                    text = text,
+                    style = TextStyle(fontSize = fontSize),
+                    maxLines = maxLines,
+                    // One line can only contain 1 character
+                    width = fontSizeInPx
+                )
 
             assertThat(paragraph.didExceedMaxLines).isFalse()
         }
@@ -2331,11 +2271,7 @@
     fun didExceedMaxLines_ellipsis_withMaxLinesSmallerThanTextLines_returnsTrue() {
         val text = "aaa\naa"
         val maxLines = text.lines().size - 1
-        val paragraph = simpleParagraph(
-            text = text,
-            maxLines = maxLines,
-            ellipsis = true
-        )
+        val paragraph = simpleParagraph(text = text, maxLines = maxLines, ellipsis = true)
 
         assertThat(paragraph.didExceedMaxLines).isTrue()
     }
@@ -2344,11 +2280,7 @@
     fun didExceedMaxLines_ellipsis_withMaxLinesEqualToTextLines_returnsFalse() {
         val text = "aaa\naa"
         val maxLines = text.lines().size
-        val paragraph = simpleParagraph(
-            text = text,
-            maxLines = maxLines,
-            ellipsis = true
-        )
+        val paragraph = simpleParagraph(text = text, maxLines = maxLines, ellipsis = true)
 
         assertThat(paragraph.didExceedMaxLines).isFalse()
     }
@@ -2357,11 +2289,7 @@
     fun didExceedMaxLines_ellipsis_withMaxLinesGreaterThanTextLines_returnsFalse() {
         val text = "aaa\naa"
         val maxLines = text.lines().size + 1
-        val paragraph = simpleParagraph(
-            text = text,
-            maxLines = maxLines,
-            ellipsis = true
-        )
+        val paragraph = simpleParagraph(text = text, maxLines = maxLines, ellipsis = true)
 
         assertThat(paragraph.didExceedMaxLines).isFalse()
     }
@@ -2373,14 +2301,15 @@
             val fontSize = 50.sp
             val fontSizeInPx = fontSize.toPx()
             val maxLines = 1
-            val paragraph = simpleParagraph(
-                text = text,
-                style = TextStyle(fontSize = fontSize),
-                maxLines = maxLines,
-                ellipsis = true,
-                // One line can only contain 1 character
-                width = fontSizeInPx
-            )
+            val paragraph =
+                simpleParagraph(
+                    text = text,
+                    style = TextStyle(fontSize = fontSize),
+                    maxLines = maxLines,
+                    ellipsis = true,
+                    // One line can only contain 1 character
+                    width = fontSizeInPx
+                )
 
             assertThat(paragraph.didExceedMaxLines).isTrue()
         }
@@ -2390,11 +2319,7 @@
     fun didExceedMaxLines_ellipsis_withMaxLinesEqualToTextLines_withLineWrap_returnsFalse() {
         val text = "a"
         val maxLines = text.lines().size
-        val paragraph = simpleParagraph(
-            text = text,
-            maxLines = maxLines,
-            ellipsis = true
-        )
+        val paragraph = simpleParagraph(text = text, maxLines = maxLines, ellipsis = true)
 
         assertThat(paragraph.didExceedMaxLines).isFalse()
     }
@@ -2406,14 +2331,15 @@
             val maxLines = 3
             val fontSize = 50.sp
             val fontSizeInPx = fontSize.toPx()
-            val paragraph = simpleParagraph(
-                text = text,
-                style = TextStyle(fontSize = fontSize),
-                maxLines = maxLines,
-                ellipsis = true,
-                // One line can only contain 1 character
-                width = fontSizeInPx
-            )
+            val paragraph =
+                simpleParagraph(
+                    text = text,
+                    style = TextStyle(fontSize = fontSize),
+                    maxLines = maxLines,
+                    ellipsis = true,
+                    // One line can only contain 1 character
+                    width = fontSizeInPx
+                )
 
             assertThat(paragraph.didExceedMaxLines).isFalse()
         }
@@ -2428,18 +2354,20 @@
             val fontSizeInPx = fontSize.toPx()
 
             val layoutLTRWidth = (textLTR.length + 2) * fontSizeInPx
-            val paragraphLTR = simpleParagraph(
-                text = textLTR,
-                style = TextStyle(fontSize = fontSize),
-                width = layoutLTRWidth
-            )
+            val paragraphLTR =
+                simpleParagraph(
+                    text = textLTR,
+                    style = TextStyle(fontSize = fontSize),
+                    width = layoutLTRWidth
+                )
 
             val layoutRTLWidth = (textRTL.length + 2) * fontSizeInPx
-            val paragraphRTL = simpleParagraph(
-                text = textRTL,
-                style = TextStyle(fontSize = fontSize),
-                width = layoutRTLWidth
-            )
+            val paragraphRTL =
+                simpleParagraph(
+                    text = textRTL,
+                    style = TextStyle(fontSize = fontSize),
+                    width = layoutRTLWidth
+                )
 
             // When textAlign is TextAlign.start, LTR aligns to left, RTL aligns to right.
             assertThat(paragraphLTR.getLineLeft(0)).isZero()
@@ -2456,14 +2384,12 @@
 
             texts.map { text ->
                 val layoutWidth = (text.length + 2) * fontSizeInPx
-                val paragraph = simpleParagraph(
-                    text = text,
-                    style = TextStyle(
-                        fontSize = fontSize,
-                        textAlign = TextAlign.Left
-                    ),
-                    width = layoutWidth
-                )
+                val paragraph =
+                    simpleParagraph(
+                        text = text,
+                        style = TextStyle(fontSize = fontSize, textAlign = TextAlign.Left),
+                        width = layoutWidth
+                    )
 
                 assertThat(paragraph.getLineLeft(0)).isZero()
             }
@@ -2479,15 +2405,12 @@
 
             texts.map { text ->
                 val layoutWidth = (text.length + 2) * fontSizeInPx
-                val paragraph = simpleParagraph(
-                    text = text,
-                    style = TextStyle(
-                        fontSize = fontSize,
-                        textAlign = TextAlign.Right
-                    ),
-
-                    width = layoutWidth
-                )
+                val paragraph =
+                    simpleParagraph(
+                        text = text,
+                        style = TextStyle(fontSize = fontSize, textAlign = TextAlign.Right),
+                        width = layoutWidth
+                    )
 
                 assertThat(paragraph.getLineRight(0)).isEqualTo(layoutWidth)
             }
@@ -2503,14 +2426,12 @@
 
             texts.map { text ->
                 val layoutWidth = (text.length + 2) * fontSizeInPx
-                val paragraph = simpleParagraph(
-                    text = text,
-                    style = TextStyle(
-                        fontSize = fontSize,
-                        textAlign = TextAlign.Center
-                    ),
-                    width = layoutWidth
-                )
+                val paragraph =
+                    simpleParagraph(
+                        text = text,
+                        style = TextStyle(fontSize = fontSize, textAlign = TextAlign.Center),
+                        width = layoutWidth
+                    )
 
                 val textWidth = text.length * fontSizeInPx
                 assertThat(paragraph.getLineLeft(0)).isEqualTo(layoutWidth / 2 - textWidth / 2)
@@ -2527,14 +2448,12 @@
             val fontSizeInPx = fontSize.toPx()
             val layoutWidth = (text.length + 2) * fontSizeInPx
 
-            val paragraph = simpleParagraph(
-                text = text,
-                style = TextStyle(
-                    fontSize = fontSize,
-                    textAlign = TextAlign.Start
-                ),
-                width = layoutWidth
-            )
+            val paragraph =
+                simpleParagraph(
+                    text = text,
+                    style = TextStyle(fontSize = fontSize, textAlign = TextAlign.Start),
+                    width = layoutWidth
+                )
 
             assertThat(paragraph.getLineLeft(0)).isZero()
         }
@@ -2548,14 +2467,12 @@
             val fontSizeInPx = fontSize.toPx()
             val layoutWidth = (text.length + 2) * fontSizeInPx
 
-            val paragraph = simpleParagraph(
-                text = text,
-                style = TextStyle(
-                    fontSize = fontSize,
-                    textAlign = TextAlign.End
-                ),
-                width = layoutWidth
-            )
+            val paragraph =
+                simpleParagraph(
+                    text = text,
+                    style = TextStyle(fontSize = fontSize, textAlign = TextAlign.End),
+                    width = layoutWidth
+                )
 
             assertThat(paragraph.getLineRight(0)).isEqualTo(layoutWidth)
         }
@@ -2569,14 +2486,12 @@
             val fontSizeInPx = fontSize.toPx()
             val layoutWidth = (text.length + 2) * fontSizeInPx
 
-            val paragraph = simpleParagraph(
-                text = text,
-                style = TextStyle(
-                    fontSize = fontSize,
-                    textAlign = TextAlign.Start
-                ),
-                width = layoutWidth
-            )
+            val paragraph =
+                simpleParagraph(
+                    text = text,
+                    style = TextStyle(fontSize = fontSize, textAlign = TextAlign.Start),
+                    width = layoutWidth
+                )
 
             assertThat(paragraph.getLineRight(0)).isEqualTo(layoutWidth)
         }
@@ -2590,15 +2505,12 @@
             val fontSizeInPx = fontSize.toPx()
             val layoutWidth = (text.length + 2) * fontSizeInPx
 
-            val paragraph = simpleParagraph(
-                text = text,
-
-                style = TextStyle(
-                    fontSize = fontSize,
-                    textAlign = TextAlign.End
-                ),
-                width = layoutWidth
-            )
+            val paragraph =
+                simpleParagraph(
+                    text = text,
+                    style = TextStyle(fontSize = fontSize, textAlign = TextAlign.End),
+                    width = layoutWidth
+                )
 
             assertThat(paragraph.getLineLeft(0)).isZero()
         }
@@ -2615,14 +2527,12 @@
             val fontSizeInPx = fontSize.toPx()
             val layoutWidth = ("a a".length + 1) * fontSizeInPx
 
-            val paragraph = simpleParagraph(
-                text = text,
-                style = TextStyle(
-                    fontSize = fontSize,
-                    textAlign = TextAlign.Justify
-                ),
-                width = layoutWidth
-            )
+            val paragraph =
+                simpleParagraph(
+                    text = text,
+                    style = TextStyle(fontSize = fontSize, textAlign = TextAlign.Justify),
+                    width = layoutWidth
+                )
 
             assertThat(paragraph.getLineLeft(0)).isZero()
             assertThat(paragraph.getLineRight(0)).isEqualTo(layoutWidth)
@@ -2639,14 +2549,12 @@
             val fontSizeInPx = fontSize.toPx()
             val layoutWidth = text.length * fontSizeInPx
 
-            val paragraph = simpleParagraph(
-                text = text,
-                style = TextStyle(
-                    fontSize = fontSize,
-                    textDirection = TextDirection.Ltr
-                ),
-                width = layoutWidth
-            )
+            val paragraph =
+                simpleParagraph(
+                    text = text,
+                    style = TextStyle(fontSize = fontSize, textDirection = TextDirection.Ltr),
+                    width = layoutWidth
+                )
 
             // The position of the last character in display order.
             val position = Offset(("a.".length * fontSizeInPx + 1), (fontSizeInPx / 2))
@@ -2663,14 +2571,12 @@
             val fontSizeInPx = fontSize.toPx()
             val layoutWidth = text.length * fontSizeInPx
 
-            val paragraph = simpleParagraph(
-                text = text,
-                style = TextStyle(
-                    fontSize = fontSize,
-                    textDirection = TextDirection.Rtl
-                ),
-                width = layoutWidth
-            )
+            val paragraph =
+                simpleParagraph(
+                    text = text,
+                    style = TextStyle(fontSize = fontSize, textDirection = TextDirection.Rtl),
+                    width = layoutWidth
+                )
 
             // The position of the first character in display order.
             val position = Offset((fontSizeInPx / 2 + 1), (fontSizeInPx / 2))
@@ -2687,11 +2593,12 @@
             val fontSizeInPx = fontSize.toPx()
             val layoutWidth = text.length * fontSizeInPx
 
-            val paragraph = simpleParagraph(
-                text = text,
-                style = TextStyle(fontSize = fontSize, localeList = ltrLocaleList),
-                width = layoutWidth
-            )
+            val paragraph =
+                simpleParagraph(
+                    text = text,
+                    style = TextStyle(fontSize = fontSize, localeList = ltrLocaleList),
+                    width = layoutWidth
+                )
 
             for (i in 0..text.length) {
                 // The position of the i-th character in display order.
@@ -2710,11 +2617,12 @@
             val fontSizeInPx = fontSize.toPx()
             val layoutWidth = text.length * fontSizeInPx
 
-            val paragraph = simpleParagraph(
-                text = text,
-                style = TextStyle(fontSize = fontSize),
-                width = layoutWidth
-            )
+            val paragraph =
+                simpleParagraph(
+                    text = text,
+                    style = TextStyle(fontSize = fontSize),
+                    width = layoutWidth
+                )
 
             for (i in text.indices) {
                 // The position of the i-th character in display order.
@@ -2733,11 +2641,12 @@
             val fontSizeInPx = fontSize.toPx()
             val layoutWidth = text.length * fontSizeInPx
 
-            val paragraph = simpleParagraph(
-                text = text,
-                style = TextStyle(fontSize = fontSize),
-                width = layoutWidth
-            )
+            val paragraph =
+                simpleParagraph(
+                    text = text,
+                    style = TextStyle(fontSize = fontSize),
+                    width = layoutWidth
+                )
 
             // The first character in display order should be '.'
             val position = Offset((fontSizeInPx / 2 + 1), (fontSizeInPx / 2))
@@ -2754,10 +2663,7 @@
             val fontSize = 50.sp
             val fontSizeInPx = fontSize.toPx()
 
-            val paragraph = simpleParagraph(
-                text = text,
-                style = TextStyle(fontSize = fontSize)
-            )
+            val paragraph = simpleParagraph(text = text, style = TextStyle(fontSize = fontSize))
             assertThat(paragraph.getLineTop(0)).isZero()
             assertThat(paragraph.getLineTop(1)).isEqualTo(fontSizeInPx)
         }
@@ -2771,16 +2677,12 @@
             val fontSize = 50.sp
             val fontSizeInPx = fontSize.toPx()
 
-            val paragraph = simpleParagraph(
-                text = text,
-                style = TextStyle(fontSize = fontSize)
-            )
+            val paragraph = simpleParagraph(text = text, style = TextStyle(fontSize = fontSize))
             // 1st
             assertThat(paragraph.getLineBaseline(0)).isEqualTo(fontSizeInPx * 0.8f)
             assertThat(paragraph.getLineBaseline(0)).isEqualTo(paragraph.firstBaseline)
             // 2nd
-            assertThat(paragraph.getLineBaseline(1))
-                .isEqualTo(fontSizeInPx + fontSizeInPx * 0.8f)
+            assertThat(paragraph.getLineBaseline(1)).isEqualTo(fontSizeInPx + fontSizeInPx * 0.8f)
             // last
             assertThat(paragraph.getLineBaseline(2))
                 .isEqualTo(fontSizeInPx * 2 + fontSizeInPx * 0.8f)
@@ -2796,10 +2698,7 @@
             val fontSize = 50.sp
             val fontSizeInPx = fontSize.toPx()
 
-            val paragraph = simpleParagraph(
-                text = text,
-                style = TextStyle(fontSize = fontSize)
-            )
+            val paragraph = simpleParagraph(text = text, style = TextStyle(fontSize = fontSize))
             assertThat(paragraph.getLineBottom(0)).isEqualTo(fontSizeInPx)
             assertThat(paragraph.getLineBottom(1)).isEqualTo(fontSize.value * 2f)
         }
@@ -2809,10 +2708,7 @@
     fun getLineForOffset_withNewline() {
         val text = "aaa\nbbb"
 
-        val paragraph = simpleParagraph(
-            text = text,
-            width = Float.MAX_VALUE
-        )
+        val paragraph = simpleParagraph(text = text, width = Float.MAX_VALUE)
         for (i in 0..2) {
             assertThat(paragraph.getLineForOffset(i)).isEqualTo(0)
         }
@@ -2825,10 +2721,7 @@
     fun getLineForOffset_newline_belongsToPreviousLine() {
         val text = "aaa\nbbb\n"
 
-        val paragraph = simpleParagraph(
-            text = text,
-            width = Float.MAX_VALUE
-        )
+        val paragraph = simpleParagraph(text = text, width = Float.MAX_VALUE)
         assertThat(paragraph.getLineForOffset(3)).isEqualTo(0)
         assertThat(paragraph.getLineForOffset(7)).isEqualTo(1)
     }
@@ -2837,10 +2730,7 @@
     fun getLineForOffset_outOfBoundary() {
         val text = "aaa\nbbb"
 
-        val paragraph = simpleParagraph(
-            text = text,
-            width = Float.MAX_VALUE
-        )
+        val paragraph = simpleParagraph(text = text, width = Float.MAX_VALUE)
         assertThat(paragraph.getLineForOffset(-1)).isEqualTo(0)
         assertThat(paragraph.getLineForOffset(-2)).isEqualTo(0)
 
@@ -2852,13 +2742,14 @@
     fun getLineForOffset_ellipsisApplied() {
         val text = "aaa\nbbb"
 
-        val paragraph = simpleParagraph(
-            text = text,
-            maxLines = 1,
-            ellipsis = true,
-            style = TextStyle(),
-            width = Float.MAX_VALUE
-        )
+        val paragraph =
+            simpleParagraph(
+                text = text,
+                maxLines = 1,
+                ellipsis = true,
+                style = TextStyle(),
+                width = Float.MAX_VALUE
+            )
 
         for (i in 0..2) {
             assertThat(paragraph.getLineForOffset(i)).isEqualTo(0)
@@ -2880,14 +2771,12 @@
         val text = "aaabbb"
         val fontSize = 50f
 
-        val paragraph = simpleParagraph(
-            text = text,
-            style = TextStyle(
-                fontFamily = fontFamilyMeasureFont,
-                fontSize = fontSize.sp
-            ),
-            width = fontSize * 3
-        )
+        val paragraph =
+            simpleParagraph(
+                text = text,
+                style = TextStyle(fontFamily = fontFamilyMeasureFont, fontSize = fontSize.sp),
+                width = fontSize * 3
+            )
 
         // Prerequisite check for the this test.
         assertThat(paragraph.lineCount).isEqualTo(2)
@@ -2899,27 +2788,20 @@
     fun getLineStart_newline() {
         val text = "aaa\nbbb"
 
-        val paragraph = simpleParagraph(
-            text = text,
-            width = Float.MAX_VALUE
-        )
+        val paragraph = simpleParagraph(text = text, width = Float.MAX_VALUE)
 
         // Prerequisite check for the this test.
         assertThat(paragraph.lineCount).isEqualTo(text.lines().size)
         assertThat(paragraph.getLineStart(0)).isEqualTo(0)
         // First char after '\n'
-        assertThat(paragraph.getLineStart(1))
-            .isEqualTo(text.indexOfFirst { ch -> ch == '\n' } + 1)
+        assertThat(paragraph.getLineStart(1)).isEqualTo(text.indexOfFirst { ch -> ch == '\n' } + 1)
     }
 
     @Test
     fun getLineStart_emptyLine() {
         val text = "aaa\n"
 
-        val paragraph = simpleParagraph(
-            text = text,
-            width = Float.MAX_VALUE
-        )
+        val paragraph = simpleParagraph(text = text, width = Float.MAX_VALUE)
 
         // Prerequisite check for the this test.
         assertThat(paragraph.lineCount).isEqualTo(2)
@@ -2932,15 +2814,13 @@
         val text = "aaabbb"
         val fontSize = 50f
 
-        val paragraph = simpleParagraph(
-            text = text,
-            style = TextStyle(
-                fontFamily = fontFamilyMeasureFont,
-                fontSize = fontSize.sp
-            ),
-            width = fontSize * 3,
-            density = defaultDensity
-        )
+        val paragraph =
+            simpleParagraph(
+                text = text,
+                style = TextStyle(fontFamily = fontFamilyMeasureFont, fontSize = fontSize.sp),
+                width = fontSize * 3,
+                density = defaultDensity
+            )
 
         // Prerequisite check for the this test.
         assertThat(paragraph.lineCount).isEqualTo(2)
@@ -2952,10 +2832,7 @@
     fun getLineEnd_newline() {
         val text = "aaa\nbbb"
 
-        val paragraph = simpleParagraph(
-            text = text,
-            width = Float.MAX_VALUE
-        )
+        val paragraph = simpleParagraph(text = text, width = Float.MAX_VALUE)
 
         // Prerequisite check for the this test.
         assertThat(paragraph.lineCount).isEqualTo(text.lines().size)
@@ -2967,10 +2844,7 @@
     fun getLineEnd_emptyLine() {
         val text = "aaa\n"
 
-        val paragraph = simpleParagraph(
-            text = text,
-            width = Float.MAX_VALUE
-        )
+        val paragraph = simpleParagraph(text = text, width = Float.MAX_VALUE)
 
         // Prerequisite check for the this test.
         assertThat(paragraph.lineCount).isEqualTo(2)
@@ -2982,12 +2856,8 @@
     fun getLineEllipsisOffset() {
         val text = "aaa\nbbb\nccc"
 
-        val paragraph = simpleParagraph(
-            text = text,
-            maxLines = 2,
-            ellipsis = true,
-            width = Float.MAX_VALUE
-        )
+        val paragraph =
+            simpleParagraph(text = text, maxLines = 2, ellipsis = true, width = Float.MAX_VALUE)
 
         assertThat(paragraph.lineCount).isEqualTo(2)
         assertThat(paragraph.getLineEnd(0)).isEqualTo(4)
@@ -3002,16 +2872,14 @@
     @Test
     fun getLineEllipsisCount() {
         val text = "aaaaabbbbbccccc"
-        val paragraph = simpleParagraph(
-            text = text,
-            style = TextStyle(
-                fontFamily = fontFamilyMeasureFont,
-                fontSize = 10.sp
-            ),
-            maxLines = 2,
-            ellipsis = true,
-            width = 50f
-        )
+        val paragraph =
+            simpleParagraph(
+                text = text,
+                style = TextStyle(fontFamily = fontFamilyMeasureFont, fontSize = 10.sp),
+                maxLines = 2,
+                ellipsis = true,
+                width = 50f
+            )
 
         // Prerequisite check for the this test.
         assertThat(paragraph.lineCount).isEqualTo(2)
@@ -3037,14 +2905,12 @@
         val layoutWidth = text.length * fontSize / 4
         val lineHeight = 30f
 
-        val paragraph = simpleParagraph(
-            text = text,
-            style = TextStyle(
-                fontSize = fontSize.sp,
-                lineHeight = lineHeight.sp
-            ),
-            width = layoutWidth
-        )
+        val paragraph =
+            simpleParagraph(
+                text = text,
+                style = TextStyle(fontSize = fontSize.sp, lineHeight = lineHeight.sp),
+                width = layoutWidth
+            )
 
         assertThat(paragraph.lineCount).isEqualTo(4)
         // First/last line is influenced by top/bottom padding
@@ -3064,11 +2930,12 @@
         val layoutWidth = text.length * fontSize / 4
         val lineHeight = 1.5f
 
-        val paragraph = simpleParagraph(
-            text = text,
-            style = TextStyle(fontSize = fontSize.sp, lineHeight = lineHeight.em),
-            width = layoutWidth
-        )
+        val paragraph =
+            simpleParagraph(
+                text = text,
+                style = TextStyle(fontSize = fontSize.sp, lineHeight = lineHeight.em),
+                width = layoutWidth
+            )
 
         assertThat(paragraph.lineCount).isEqualTo(4)
         // First/last line is influenced by top/bottom padding
@@ -3076,8 +2943,7 @@
             val actualHeight = paragraph.getLineHeight(i)
             // In the sample_font.ttf, the height of the line should be
             // fontSize + 0.2f * fontSize(line gap)
-            assertWithMessage("line number $i")
-                .that(actualHeight).isEqualTo(lineHeight * fontSize)
+            assertWithMessage("line number $i").that(actualHeight).isEqualTo(lineHeight * fontSize)
         }
     }
 
@@ -3090,15 +2956,18 @@
         val lineHeight = 2f
 
         @Suppress("DEPRECATION")
-        val paragraph = simpleParagraph(
-            text = text,
-            style = TextStyle(
-                fontSize = fontSize.sp,
-                lineHeight = lineHeight.em,
-                platformStyle = PlatformTextStyle(includeFontPadding = false)
-            ),
-            width = layoutWidth
-        ) as AndroidParagraph
+        val paragraph =
+            simpleParagraph(
+                text = text,
+                style =
+                    TextStyle(
+                        fontSize = fontSize.sp,
+                        lineHeight = lineHeight.em,
+                        platformStyle = PlatformTextStyle(includeFontPadding = false)
+                    ),
+                width = layoutWidth
+            )
+                as AndroidParagraph
 
         val fontMetrics = paragraph.paragraphIntrinsics.textPaint.fontMetricsInt
         val ascentToLineHeightRatio = abs(fontMetrics.ascent.toFloat()) / fontMetrics.lineHeight()
@@ -3121,19 +2990,22 @@
         val fontSize = 12.sp
         val lineHeight = 16.052.sp
         val maxLines = 4
-        val textStyle = TextStyle(
-            fontSize = fontSize,
-            lineHeight = lineHeight,
-            platformStyle = PlatformTextStyle(includeFontPadding = true)
-        )
+        val textStyle =
+            TextStyle(
+                fontSize = fontSize,
+                lineHeight = lineHeight,
+                platformStyle = PlatformTextStyle(includeFontPadding = true)
+            )
 
-        val paragraph = simpleParagraph(
-            text = text,
-            style = textStyle,
-            maxLines = maxLines,
-            ellipsis = true,
-            width = 480f // px
-        ) as AndroidParagraph
+        val paragraph =
+            simpleParagraph(
+                text = text,
+                style = textStyle,
+                maxLines = maxLines,
+                ellipsis = true,
+                width = 480f // px
+            )
+                as AndroidParagraph
 
         // In LineHeightSpan line height is being ceiled and ratio calculated accordingly.
         // Then LineHeightSpan changes the descent and ascent, but Android ignores the ascent
@@ -3163,11 +3035,12 @@
             val spanStyle = SpanStyle(fontSize = fontSize)
             val paragraphWidth = fontSizeInPx * text.length
 
-            val paragraph = simpleParagraph(
-                text = text,
-                spanStyles = listOf(AnnotatedString.Range(spanStyle, 0, text.length)),
-                width = paragraphWidth
-            )
+            val paragraph =
+                simpleParagraph(
+                    text = text,
+                    spanStyles = listOf(AnnotatedString.Range(spanStyle, 0, text.length)),
+                    width = paragraphWidth
+                )
 
             // Make sure there is only one line, so that we can use getLineRight to test fontSize.
             assertThat(paragraph.lineCount).isEqualTo(1)
@@ -3187,18 +3060,19 @@
             val spanStyle = SpanStyle(fontSize = spanStyleFontSize)
             val paragraphWidth = spanStyleFontSizeInPx * text.length
 
-            val paragraph = simpleParagraph(
-                text = text,
-                spanStyles = listOf(AnnotatedString.Range(spanStyle, 0, "abc".length)),
-                style = TextStyle(fontSize = fontSize),
-                width = paragraphWidth
-            )
+            val paragraph =
+                simpleParagraph(
+                    text = text,
+                    spanStyles = listOf(AnnotatedString.Range(spanStyle, 0, "abc".length)),
+                    style = TextStyle(fontSize = fontSize),
+                    width = paragraphWidth
+                )
 
             // Make sure there is only one line, so that we can use getLineRight to test fontSize.
             assertThat(paragraph.lineCount).isEqualTo(1)
             // Notice that in this test font, the width of character equals to fontSize.
-            val expectedLineRight = "abc".length * spanStyleFontSizeInPx +
-                "de".length * fontSizeInPx
+            val expectedLineRight =
+                "abc".length * spanStyleFontSizeInPx + "de".length * fontSizeInPx
             assertThat(paragraph.getLineWidth(0)).isEqualTo(expectedLineRight)
         }
     }
@@ -3216,14 +3090,16 @@
             val spanStyleOverwrite = SpanStyle(fontSize = fontSizeOverwrite)
             val paragraphWidth = fontSizeOverwriteInPx * text.length
 
-            val paragraph = simpleParagraph(
-                text = text,
-                spanStyles = listOf(
-                    AnnotatedString.Range(spanStyle, 0, text.length),
-                    AnnotatedString.Range(spanStyleOverwrite, 0, "abc".length)
-                ),
-                width = paragraphWidth
-            )
+            val paragraph =
+                simpleParagraph(
+                    text = text,
+                    spanStyles =
+                        listOf(
+                            AnnotatedString.Range(spanStyle, 0, text.length),
+                            AnnotatedString.Range(spanStyleOverwrite, 0, "abc".length)
+                        ),
+                    width = paragraphWidth
+                )
 
             // Make sure there is only one line, so that we can use getLineRight to test fontSize.
             assertThat(paragraph.lineCount).isEqualTo(1)
@@ -3242,14 +3118,14 @@
             val em = 0.5.em
             val spanStyle = SpanStyle(fontSize = em)
 
-            val paragraph = simpleParagraph(
-                text = text,
-                spanStyles = listOf(AnnotatedString.Range(spanStyle, 0, text.length)),
-                style = TextStyle(fontSize = fontSize)
-            )
+            val paragraph =
+                simpleParagraph(
+                    text = text,
+                    spanStyles = listOf(AnnotatedString.Range(spanStyle, 0, text.length)),
+                    style = TextStyle(fontSize = fontSize)
+                )
 
-            assertThat(paragraph.getLineRight(0))
-                .isEqualTo(text.length * fontSizeInPx * em.value)
+            assertThat(paragraph.getLineRight(0)).isEqualTo(text.length * fontSizeInPx * em.value)
         }
     }
 
@@ -3265,14 +3141,16 @@
             val emNested = 2f.em
             val spanStyleNested = SpanStyle(fontSize = emNested)
 
-            val paragraph = simpleParagraph(
-                text = text,
-                spanStyles = listOf(
-                    AnnotatedString.Range(spanStyle, 0, text.length),
-                    AnnotatedString.Range(spanStyleNested, 0, text.length)
-                ),
-                style = TextStyle(fontSize = fontSize)
-            )
+            val paragraph =
+                simpleParagraph(
+                    text = text,
+                    spanStyles =
+                        listOf(
+                            AnnotatedString.Range(spanStyle, 0, text.length),
+                            AnnotatedString.Range(spanStyleNested, 0, text.length)
+                        ),
+                    style = TextStyle(fontSize = fontSize)
+                )
 
             assertThat(paragraph.getLineRight(0))
                 .isEqualTo(text.length * fontSizeInPx * em.value * emNested.value)
@@ -3292,17 +3170,18 @@
             val em = 0.5f.em
             val fontSizeScaleStyle = SpanStyle(fontSize = em)
 
-            val paragraph = simpleParagraph(
-                text = text,
-                spanStyles = listOf(
-                    AnnotatedString.Range(fontSizeStyle, 0, text.length),
-                    AnnotatedString.Range(fontSizeScaleStyle, 0, text.length)
-                ),
-                style = TextStyle(fontSize = paragraphFontSize)
-            )
+            val paragraph =
+                simpleParagraph(
+                    text = text,
+                    spanStyles =
+                        listOf(
+                            AnnotatedString.Range(fontSizeStyle, 0, text.length),
+                            AnnotatedString.Range(fontSizeScaleStyle, 0, text.length)
+                        ),
+                    style = TextStyle(fontSize = paragraphFontSize)
+                )
 
-            assertThat(paragraph.getLineRight(0))
-                .isEqualTo(text.length * fontSizeInPx * em.value)
+            assertThat(paragraph.getLineRight(0)).isEqualTo(text.length * fontSizeInPx * em.value)
         }
     }
 
@@ -3319,14 +3198,16 @@
             val em = 0.5f.em
             val fontSizeScaleStyle = SpanStyle(fontSize = em)
 
-            val paragraph = simpleParagraph(
-                text = text,
-                spanStyles = listOf(
-                    AnnotatedString.Range(fontSizeScaleStyle, 0, text.length),
-                    AnnotatedString.Range(fontSizeStyle, 0, text.length)
-                ),
-                style = TextStyle(fontSize = paragraphFontSize)
-            )
+            val paragraph =
+                simpleParagraph(
+                    text = text,
+                    spanStyles =
+                        listOf(
+                            AnnotatedString.Range(fontSizeScaleStyle, 0, text.length),
+                            AnnotatedString.Range(fontSizeStyle, 0, text.length)
+                        ),
+                    style = TextStyle(fontSize = paragraphFontSize)
+                )
 
             assertThat(paragraph.getLineRight(0)).isEqualTo(text.length * fontSizeInPx)
         }
@@ -3348,18 +3229,19 @@
             val em2 = 2f.em
             val fontSizeScaleStyle2 = SpanStyle(fontSize = em2)
 
-            val paragraph = simpleParagraph(
-                text = text,
-                spanStyles = listOf(
-                    AnnotatedString.Range(fontSizeScaleStyle1, 0, text.length),
-                    AnnotatedString.Range(fontSizeStyle, 0, text.length),
-                    AnnotatedString.Range(fontSizeScaleStyle2, 0, text.length)
-                ),
-                style = TextStyle(fontSize = paragraphFontSize)
-            )
+            val paragraph =
+                simpleParagraph(
+                    text = text,
+                    spanStyles =
+                        listOf(
+                            AnnotatedString.Range(fontSizeScaleStyle1, 0, text.length),
+                            AnnotatedString.Range(fontSizeStyle, 0, text.length),
+                            AnnotatedString.Range(fontSizeScaleStyle2, 0, text.length)
+                        ),
+                    style = TextStyle(fontSize = paragraphFontSize)
+                )
 
-            assertThat(paragraph.getLineRight(0))
-                .isEqualTo(text.length * fontSizeInPx * em2.value)
+            assertThat(paragraph.getLineRight(0)).isEqualTo(text.length * fontSizeInPx * em2.value)
         }
     }
 
@@ -3372,20 +3254,22 @@
             val letterSpacing = 5.0f
             val spanStyle = SpanStyle(letterSpacing = letterSpacing.em)
 
-            val paragraph = simpleParagraph(
-                text = text,
-                style = TextStyle(fontSize = fontSize),
-                spanStyles = listOf(AnnotatedString.Range(spanStyle, 0, text.length)),
-                width = Float.MAX_VALUE
-            )
+            val paragraph =
+                simpleParagraph(
+                    text = text,
+                    style = TextStyle(fontSize = fontSize),
+                    spanStyles = listOf(AnnotatedString.Range(spanStyle, 0, text.length)),
+                    width = Float.MAX_VALUE
+                )
 
             assertThat(paragraph.lineCount).isEqualTo(1)
             // Notice that in this test font, the width of character equals to fontSize.
             if (hasEdgeLetterSpacingBugFix()) {
                 assertThat(paragraph.getLineWidth(0))
-                    .isEqualTo(fontSizeInPx * text.length * (1 + letterSpacing) -
-                        fontSizeInPx * letterSpacing * 0.5f - // left edge letter spacing
-                        fontSizeInPx * letterSpacing * 0.5f // right edge letter spacing
+                    .isEqualTo(
+                        fontSizeInPx * text.length * (1 + letterSpacing) -
+                            fontSizeInPx * letterSpacing * 0.5f - // left edge letter spacing
+                            fontSizeInPx * letterSpacing * 0.5f // right edge letter spacing
                     )
             } else {
                 assertThat(paragraph.getLineWidth(0))
@@ -3403,20 +3287,23 @@
             val letterSpacing = 5.0f
             val spanStyle = SpanStyle(letterSpacing = letterSpacing.sp)
 
-            val paragraph = simpleParagraph(
-                text = text,
-                style = TextStyle(fontSize = fontSize),
-                spanStyles = listOf(AnnotatedString.Range(spanStyle, 0, text.length)),
-                width = Float.MAX_VALUE
-            )
+            val paragraph =
+                simpleParagraph(
+                    text = text,
+                    style = TextStyle(fontSize = fontSize),
+                    spanStyles = listOf(AnnotatedString.Range(spanStyle, 0, text.length)),
+                    width = Float.MAX_VALUE
+                )
 
             assertThat(paragraph.lineCount).isEqualTo(1)
             // Notice that in this test font, the width of character equals to fontSize.
             if (hasEdgeLetterSpacingBugFix()) {
                 assertThat(paragraph.getLineWidth(0))
-                    .isEqualTo((fontSizeInPx + letterSpacing) * text.length -
-                        letterSpacing * 0.5f - // left edge letter spacing
-                        letterSpacing * 0.5f) // right edge letter spacing
+                    .isEqualTo(
+                        (fontSizeInPx + letterSpacing) * text.length -
+                            letterSpacing * 0.5f - // left edge letter spacing
+                            letterSpacing * 0.5f
+                    ) // right edge letter spacing
             } else {
                 assertThat(paragraph.getLineWidth(0))
                     .isEqualTo((fontSizeInPx + letterSpacing) * text.length)
@@ -3433,21 +3320,24 @@
             val letterSpacing = 5.0f
             val spanStyle = SpanStyle(letterSpacing = letterSpacing.em)
 
-            val paragraph = simpleParagraph(
-                text = text,
-                style = TextStyle(fontSize = fontSize),
-                spanStyles = listOf(AnnotatedString.Range(spanStyle, 0, "abc".length)),
-                width = Float.MAX_VALUE
-            )
+            val paragraph =
+                simpleParagraph(
+                    text = text,
+                    style = TextStyle(fontSize = fontSize),
+                    spanStyles = listOf(AnnotatedString.Range(spanStyle, 0, "abc".length)),
+                    width = Float.MAX_VALUE
+                )
 
             assertThat(paragraph.lineCount).isEqualTo(1)
             // Notice that in this test font, the width of character equals to fontSize.
             val expectedWidth = ("abc".length * letterSpacing + text.length) * fontSizeInPx
             if (hasEdgeLetterSpacingBugFix()) {
                 assertThat(paragraph.getLineWidth(0))
-                    .isEqualTo(expectedWidth -
-                        letterSpacing * fontSizeInPx * 0.5f - // left edge letter spacing
-                        0f) // right edge letter spacing
+                    .isEqualTo(
+                        expectedWidth -
+                            letterSpacing * fontSizeInPx * 0.5f - // left edge letter spacing
+                            0f
+                    ) // right edge letter spacing
             } else {
                 assertThat(paragraph.getLineWidth(0)).isEqualTo(expectedWidth)
             }
@@ -3466,25 +3356,32 @@
             val letterSpacingOverwrite = 10.0f
             val spanStyleOverwrite = SpanStyle(letterSpacing = letterSpacingOverwrite.em)
 
-            val paragraph = simpleParagraph(
-                text = text,
-                style = TextStyle(fontSize = fontSize),
-                spanStyles = listOf(
-                    AnnotatedString.Range(spanStyle, 0, text.length),
-                    AnnotatedString.Range(spanStyleOverwrite, 0, "abc".length)
-                ),
-                width = Float.MAX_VALUE
-            )
+            val paragraph =
+                simpleParagraph(
+                    text = text,
+                    style = TextStyle(fontSize = fontSize),
+                    spanStyles =
+                        listOf(
+                            AnnotatedString.Range(spanStyle, 0, text.length),
+                            AnnotatedString.Range(spanStyleOverwrite, 0, "abc".length)
+                        ),
+                    width = Float.MAX_VALUE
+                )
 
             assertThat(paragraph.lineCount).isEqualTo(1)
             // Notice that in this test font, the width of character equals to fontSize.
-            val expectedWidth = "abc".length * (1 + letterSpacingOverwrite) * fontSizeInPx +
-                "de".length * (1 + letterSpacing) * fontSizeInPx
+            val expectedWidth =
+                "abc".length * (1 + letterSpacingOverwrite) * fontSizeInPx +
+                    "de".length * (1 + letterSpacing) * fontSizeInPx
             if (hasEdgeLetterSpacingBugFix()) {
                 assertThat(paragraph.getLineWidth(0))
-                    .isEqualTo(expectedWidth -
-                        fontSizeInPx * letterSpacingOverwrite * 0.5f - // left edge letter spacing
-                        fontSizeInPx * letterSpacing * 0.5f) // right edge letter spacing
+                    .isEqualTo(
+                        expectedWidth -
+                            fontSizeInPx *
+                                letterSpacingOverwrite *
+                                0.5f - // left edge letter spacing
+                            fontSizeInPx * letterSpacing * 0.5f
+                    ) // right edge letter spacing
             } else {
                 assertThat(paragraph.getLineWidth(0)).isEqualTo(expectedWidth)
             }
@@ -3505,25 +3402,32 @@
             val fontSizeOverwriteInPx = fontSizeOverwrite.toPx()
             val fontSizeStyle = SpanStyle(fontSize = fontSizeOverwrite)
 
-            val paragraph = simpleParagraph(
-                text = text,
-                style = TextStyle(fontSize = fontSize),
-                spanStyles = listOf(
-                    AnnotatedString.Range(letterSpacingStyle, 0, text.length),
-                    AnnotatedString.Range(fontSizeStyle, 0, "abc".length)
-                ),
-                width = Float.MAX_VALUE
-            )
+            val paragraph =
+                simpleParagraph(
+                    text = text,
+                    style = TextStyle(fontSize = fontSize),
+                    spanStyles =
+                        listOf(
+                            AnnotatedString.Range(letterSpacingStyle, 0, text.length),
+                            AnnotatedString.Range(fontSizeStyle, 0, "abc".length)
+                        ),
+                    width = Float.MAX_VALUE
+                )
 
             assertThat(paragraph.lineCount).isEqualTo(1)
             // Notice that in this test font, the width of character equals to fontSize.
-            val expectedWidth = (1 + letterSpacing) *
-                ("abc".length * fontSizeOverwriteInPx + "de".length * fontSizeInPx)
+            val expectedWidth =
+                (1 + letterSpacing) *
+                    ("abc".length * fontSizeOverwriteInPx + "de".length * fontSizeInPx)
             if (hasEdgeLetterSpacingBugFix()) {
                 assertThat(paragraph.getLineWidth(0))
-                    .isEqualTo(expectedWidth -
-                        letterSpacing * fontSizeOverwriteInPx * 0.5f - // left edge letter spacing
-                        letterSpacing * fontSizeInPx * 0.5f) // right edge letter spacing
+                    .isEqualTo(
+                        expectedWidth -
+                            letterSpacing *
+                                fontSizeOverwriteInPx *
+                                0.5f - // left edge letter spacing
+                            letterSpacing * fontSizeInPx * 0.5f
+                    ) // right edge letter spacing
             } else {
                 assertThat(paragraph.getLineWidth(0)).isEqualTo(expectedWidth)
             }
@@ -3543,25 +3447,33 @@
             val scaleX = 1.5f
             val scaleXStyle = SpanStyle(textGeometricTransform = TextGeometricTransform(scaleX))
 
-            val paragraph = simpleParagraph(
-                text = text,
-                style = TextStyle(fontSize = fontSize),
-                spanStyles = listOf(
-                    AnnotatedString.Range(letterSpacingStyle, 0, text.length),
-                    AnnotatedString.Range(scaleXStyle, 0, "abc".length)
-                ),
-                width = Float.MAX_VALUE
-            )
+            val paragraph =
+                simpleParagraph(
+                    text = text,
+                    style = TextStyle(fontSize = fontSize),
+                    spanStyles =
+                        listOf(
+                            AnnotatedString.Range(letterSpacingStyle, 0, text.length),
+                            AnnotatedString.Range(scaleXStyle, 0, "abc".length)
+                        ),
+                    width = Float.MAX_VALUE
+                )
 
             assertThat(paragraph.lineCount).isEqualTo(1)
             // Notice that in this test font, the width of character equals to fontSize.
-            val expectedWidth = (1 + letterSpacing) *
-                ("abc".length * fontSizeInPx * scaleX + "de".length * fontSizeInPx)
+            val expectedWidth =
+                (1 + letterSpacing) *
+                    ("abc".length * fontSizeInPx * scaleX + "de".length * fontSizeInPx)
             if (hasEdgeLetterSpacingBugFix()) {
                 assertThat(paragraph.getLineWidth(0))
-                    .isEqualTo(expectedWidth -
-                        letterSpacing * fontSizeInPx * scaleX * 0.5f - // left edge letter spacing
-                        letterSpacing * fontSizeInPx * 0.5f) // right edge letter spacing
+                    .isEqualTo(
+                        expectedWidth -
+                            letterSpacing *
+                                fontSizeInPx *
+                                scaleX *
+                                0.5f - // left edge letter spacing
+                            letterSpacing * fontSizeInPx * 0.5f
+                    ) // right edge letter spacing
             } else {
                 assertThat(paragraph.getLineWidth(0)).isEqualTo(expectedWidth)
             }
@@ -3583,25 +3495,30 @@
             val fontSizeOverwriteInPx = fontSizeOverwrite.toPx()
             val fontSizeStyle = SpanStyle(fontSize = fontSizeOverwrite)
 
-            val paragraph = simpleParagraph(
-                text = text,
-                style = TextStyle(fontSize = fontSize),
-                spanStyles = listOf(
-                    AnnotatedString.Range(letterSpacingStyle, 0, text.length),
-                    AnnotatedString.Range(fontSizeStyle, 0, "abc".length)
-                ),
-                width = Float.MAX_VALUE
-            )
+            val paragraph =
+                simpleParagraph(
+                    text = text,
+                    style = TextStyle(fontSize = fontSize),
+                    spanStyles =
+                        listOf(
+                            AnnotatedString.Range(letterSpacingStyle, 0, text.length),
+                            AnnotatedString.Range(fontSizeStyle, 0, "abc".length)
+                        ),
+                    width = Float.MAX_VALUE
+                )
 
             assertThat(paragraph.lineCount).isEqualTo(1)
             // Notice that in this test font, the width of character equals to fontSize.
-            val expectedWidth = text.length * letterSpacingInPx +
-                ("abc".length * fontSizeOverwriteInPx + "de".length * fontSizeInPx)
+            val expectedWidth =
+                text.length * letterSpacingInPx +
+                    ("abc".length * fontSizeOverwriteInPx + "de".length * fontSizeInPx)
             if (hasEdgeLetterSpacingBugFix()) {
                 assertThat(paragraph.getLineWidth(0))
-                    .isEqualTo(expectedWidth -
-                        letterSpacingInPx * 0.5f - // left edge letter spacing
-                        letterSpacingInPx * 0.5f) // right edge letter spacing
+                    .isEqualTo(
+                        expectedWidth -
+                            letterSpacingInPx * 0.5f - // left edge letter spacing
+                            letterSpacingInPx * 0.5f
+                    ) // right edge letter spacing
             } else {
                 assertThat(paragraph.getLineWidth(0)).isEqualTo(expectedWidth)
             }
@@ -3622,25 +3539,30 @@
             val scaleX = 1.5f
             val scaleXStyle = SpanStyle(textGeometricTransform = TextGeometricTransform(scaleX))
 
-            val paragraph = simpleParagraph(
-                text = text,
-                style = TextStyle(fontSize = fontSize),
-                spanStyles = listOf(
-                    AnnotatedString.Range(letterSpacingStyle, 0, text.length),
-                    AnnotatedString.Range(scaleXStyle, 0, "abc".length)
-                ),
-                width = Float.MAX_VALUE
-            )
+            val paragraph =
+                simpleParagraph(
+                    text = text,
+                    style = TextStyle(fontSize = fontSize),
+                    spanStyles =
+                        listOf(
+                            AnnotatedString.Range(letterSpacingStyle, 0, text.length),
+                            AnnotatedString.Range(scaleXStyle, 0, "abc".length)
+                        ),
+                    width = Float.MAX_VALUE
+                )
 
             assertThat(paragraph.lineCount).isEqualTo(1)
             // Notice that in this test font, the width of character equals to fontSize.
-            val expectedWidth = text.length * letterSpacingInPx +
-                ("abc".length * fontSizeInPx * scaleX + "de".length * fontSizeInPx)
+            val expectedWidth =
+                text.length * letterSpacingInPx +
+                    ("abc".length * fontSizeInPx * scaleX + "de".length * fontSizeInPx)
             if (hasEdgeLetterSpacingBugFix()) {
                 assertThat(paragraph.getLineWidth(0))
-                    .isEqualTo(expectedWidth -
-                        letterSpacingInPx * 0.5f - // left edge letter spacing
-                        letterSpacingInPx * 0.5f) // right edge letter spacing
+                    .isEqualTo(
+                        expectedWidth -
+                            letterSpacingInPx * 0.5f - // left edge letter spacing
+                            letterSpacingInPx * 0.5f
+                    ) // right edge letter spacing
             } else {
                 assertThat(paragraph.getLineWidth(0)).isEqualTo(expectedWidth)
             }
@@ -3658,25 +3580,31 @@
         val letterSpacingSp = 10f
         val letterSpacingSpStyle = SpanStyle(letterSpacing = letterSpacingSp.sp)
 
-        val paragraph = simpleParagraph(
-            text = text,
-            style = TextStyle(fontSize = fontSize.sp),
-            spanStyles = listOf(
-                AnnotatedString.Range(letterSpacingEmStyle, 0, text.length),
-                AnnotatedString.Range(letterSpacingSpStyle, 0, "abc".length)
-            ),
-            width = Float.MAX_VALUE
-        )
+        val paragraph =
+            simpleParagraph(
+                text = text,
+                style = TextStyle(fontSize = fontSize.sp),
+                spanStyles =
+                    listOf(
+                        AnnotatedString.Range(letterSpacingEmStyle, 0, text.length),
+                        AnnotatedString.Range(letterSpacingSpStyle, 0, "abc".length)
+                    ),
+                width = Float.MAX_VALUE
+            )
 
         assertThat(paragraph.lineCount).isEqualTo(1)
         // Notice that in this test font, the width of character equals to fontSize.
-        val expectedWidth = fontSize * text.length + "abc".length * letterSpacingSp +
-            "de".length * fontSize * letterSpacingEm
+        val expectedWidth =
+            fontSize * text.length +
+                "abc".length * letterSpacingSp +
+                "de".length * fontSize * letterSpacingEm
         if (hasEdgeLetterSpacingBugFix()) {
             assertThat(paragraph.getLineWidth(0))
-                .isEqualTo(expectedWidth -
-                    letterSpacingSp * 0.5f - // left edge letter spacing
-                    fontSize * letterSpacingEm * 0.5f) // right edge letter spacing
+                .isEqualTo(
+                    expectedWidth -
+                        letterSpacingSp * 0.5f - // left edge letter spacing
+                        fontSize * letterSpacingEm * 0.5f
+                ) // right edge letter spacing
         } else {
             assertThat(paragraph.getLineWidth(0)).isEqualTo(expectedWidth)
         }
@@ -3693,24 +3621,28 @@
         val letterSpacingSp = 10f
         val letterSpacingSpStyle = SpanStyle(letterSpacing = letterSpacingSp.sp)
 
-        val paragraph = simpleParagraph(
-            text = text,
-            style = TextStyle(fontSize = fontSize.sp),
-            spanStyles = listOf(
-                AnnotatedString.Range(letterSpacingSpStyle, 0, "abc".length),
-                AnnotatedString.Range(letterSpacingEmStyle, 0, text.length)
-            ),
-            width = 500f
-        )
+        val paragraph =
+            simpleParagraph(
+                text = text,
+                style = TextStyle(fontSize = fontSize.sp),
+                spanStyles =
+                    listOf(
+                        AnnotatedString.Range(letterSpacingSpStyle, 0, "abc".length),
+                        AnnotatedString.Range(letterSpacingEmStyle, 0, text.length)
+                    ),
+                width = 500f
+            )
 
         assertThat(paragraph.lineCount).isEqualTo(1)
         // Notice that in this test font, the width of character equals to fontSize.
         val expectedWidth = fontSize * text.length * (1 + letterSpacingEm)
         if (hasEdgeLetterSpacingBugFix()) {
             assertThat(paragraph.getLineWidth(0))
-                .isEqualTo(expectedWidth -
-                    letterSpacingEm * fontSize * 0.5f - // left edge letter spacing
-                    letterSpacingEm * fontSize * 0.5f) // right edge letter spacing
+                .isEqualTo(
+                    expectedWidth -
+                        letterSpacingEm * fontSize * 0.5f - // left edge letter spacing
+                        letterSpacingEm * fontSize * 0.5f
+                ) // right edge letter spacing
         } else {
             assertThat(paragraph.getLineWidth(0)).isEqualTo(expectedWidth)
         }
@@ -3725,14 +3657,16 @@
             val indent = 20.sp
             val indentInPx = indent.toPx()
 
-            val paragraph = simpleParagraph(
-                text = text,
-                style = TextStyle(
-                    fontSize = fontSize,
-                    textIndent = TextIndent(firstLine = indent),
-                    fontFamily = fontFamilyMeasureFont
+            val paragraph =
+                simpleParagraph(
+                    text = text,
+                    style =
+                        TextStyle(
+                            fontSize = fontSize,
+                            textIndent = TextIndent(firstLine = indent),
+                            fontFamily = fontFamilyMeasureFont
+                        )
                 )
-            )
 
             // This position should point to the first character 'a' if indent is applied.
             // Otherwise this position will point to the second character 'b'.
@@ -3749,15 +3683,17 @@
         val indent = 15f
         val paragraphWidth = "abcd".length * fontSize
 
-        val paragraph = simpleParagraph(
-            text = text,
-            style = TextStyle(
-                fontSize = fontSize.sp,
-                textIndent = TextIndent(firstLine = indent.sp),
-                fontFamily = fontFamilyMeasureFont
-            ),
-            width = paragraphWidth
-        )
+        val paragraph =
+            simpleParagraph(
+                text = text,
+                style =
+                    TextStyle(
+                        fontSize = fontSize.sp,
+                        textIndent = TextIndent(firstLine = indent.sp),
+                        fontFamily = fontFamilyMeasureFont
+                    ),
+                width = paragraphWidth
+            )
 
         assertThat(paragraph.lineCount).isEqualTo(2)
         assertThat(paragraph.getHorizontalPosition(0, true)).isEqualTo(indent)
@@ -3770,15 +3706,17 @@
         val indent = 20f
         val paragraphWidth = "abc".length * fontSize
 
-        val paragraph = simpleParagraph(
-            text = text,
-            style = TextStyle(
-                textIndent = TextIndent(restLine = indent.sp),
-                fontSize = fontSize.sp,
-                fontFamily = fontFamilyMeasureFont
-            ),
-            width = paragraphWidth
-        )
+        val paragraph =
+            simpleParagraph(
+                text = text,
+                style =
+                    TextStyle(
+                        textIndent = TextIndent(restLine = indent.sp),
+                        fontSize = fontSize.sp,
+                        fontFamily = fontFamilyMeasureFont
+                    ),
+                width = paragraphWidth
+            )
 
         // check the position of the first character in second line: "d" should be indented
         assertThat(paragraph.getHorizontalPosition(3, true)).isEqualTo(indent)
@@ -3790,14 +3728,16 @@
         val fontSize = 20f
         val indent = 1.5f
 
-        val paragraph = simpleParagraph(
-            text = text,
-            style = TextStyle(
-                textIndent = TextIndent(firstLine = indent.em),
-                fontSize = fontSize.sp,
-                fontFamily = fontFamilyMeasureFont
+        val paragraph =
+            simpleParagraph(
+                text = text,
+                style =
+                    TextStyle(
+                        textIndent = TextIndent(firstLine = indent.em),
+                        fontSize = fontSize.sp,
+                        fontFamily = fontFamilyMeasureFont
+                    )
             )
-        )
 
         assertThat(paragraph.getHorizontalPosition(0, true)).isEqualTo(indent * fontSize)
     }
@@ -3810,15 +3750,17 @@
 
         val paragraphWidth = "abcd".length * fontSize
 
-        val paragraph = simpleParagraph(
-            text = text,
-            style = TextStyle(
-                textIndent = TextIndent(firstLine = indent.em),
-                fontSize = fontSize.sp,
-                fontFamily = fontFamilyMeasureFont
-            ),
-            width = paragraphWidth
-        )
+        val paragraph =
+            simpleParagraph(
+                text = text,
+                style =
+                    TextStyle(
+                        textIndent = TextIndent(firstLine = indent.em),
+                        fontSize = fontSize.sp,
+                        fontFamily = fontFamilyMeasureFont
+                    ),
+                width = paragraphWidth
+            )
 
         assertThat(paragraph.lineCount).isEqualTo(2)
         assertThat(paragraph.getHorizontalPosition(0, true)).isEqualTo(indent * fontSize)
@@ -3832,15 +3774,17 @@
 
         val paragraphWidth = "abcd".length * fontSize
 
-        val paragraph = simpleParagraph(
-            text = text,
-            style = TextStyle(
-                textIndent = TextIndent(restLine = indent.em),
-                fontSize = fontSize.sp,
-                fontFamily = fontFamilyMeasureFont
-            ),
-            width = paragraphWidth
-        )
+        val paragraph =
+            simpleParagraph(
+                text = text,
+                style =
+                    TextStyle(
+                        textIndent = TextIndent(restLine = indent.em),
+                        fontSize = fontSize.sp,
+                        fontFamily = fontFamilyMeasureFont
+                    ),
+                width = paragraphWidth
+            )
 
         assertThat(paragraph.lineCount).isEqualTo(2)
         // check the position of the first character in second line: "e" should be indented
@@ -3860,16 +3804,12 @@
             // d is rendered in defaultSpanStyle font (custom 200), and it will be wide glyph
             val expectedWidth = fontSizeInPx + fontSizeInPx * 3
 
-            val paragraph = simpleParagraph(
-                text = text,
-                spanStyles = listOf(
-                    AnnotatedString.Range(spanStyle, "a".length, text.length)
-                ),
-                style = TextStyle(
-                    fontSize = fontSize,
-                    fontFamily = fontFamilyCustom100
+            val paragraph =
+                simpleParagraph(
+                    text = text,
+                    spanStyles = listOf(AnnotatedString.Range(spanStyle, "a".length, text.length)),
+                    style = TextStyle(fontSize = fontSize, fontFamily = fontFamilyCustom100)
                 )
-            )
 
             assertThat(paragraph.lineCount).isEqualTo(1)
             assertThat(paragraph.getLineWidth(0)).isEqualTo(expectedWidth)
@@ -3885,16 +3825,12 @@
             // This fontFeatureSetting turns off the kerning
             val spanStyle = SpanStyle(fontFeatureSettings = "\"kern\" 0")
 
-            val paragraph = simpleParagraph(
-                text = text,
-                spanStyles = listOf(
-                    AnnotatedString.Range(spanStyle, 0, "aA".length)
-                ),
-                style = TextStyle(
-                    fontSize = fontSize,
-                    fontFamily = fontFamilyKernFont
+            val paragraph =
+                simpleParagraph(
+                    text = text,
+                    spanStyles = listOf(AnnotatedString.Range(spanStyle, 0, "aA".length)),
+                    style = TextStyle(fontSize = fontSize, fontFamily = fontFamilyKernFont)
                 )
-            )
 
             // Two characters are kerning, so minus 0.4 * fontSize
             val expectedWidth = text.length * fontSizeInPx - 0.4f * fontSizeInPx
@@ -3911,26 +3847,16 @@
             val fontSizeInPx = fontSize.toPx()
             val paragraphWidth = fontSizeInPx * text.length
 
-            val spanStyle = SpanStyle(
-                shadow = Shadow(
-                    Color(0xFF00FF00),
-                    Offset(1f, 2f),
-                    3.0f
+            val spanStyle = SpanStyle(shadow = Shadow(Color(0xFF00FF00), Offset(1f, 2f), 3.0f))
+
+            val paragraphShadow =
+                simpleParagraph(
+                    text = text,
+                    spanStyles = listOf(AnnotatedString.Range(spanStyle, 0, text.length)),
+                    width = paragraphWidth
                 )
-            )
 
-            val paragraphShadow = simpleParagraph(
-                text = text,
-                spanStyles = listOf(
-                    AnnotatedString.Range(spanStyle, 0, text.length)
-                ),
-                width = paragraphWidth
-            )
-
-            val paragraph = simpleParagraph(
-                text = text,
-                width = paragraphWidth
-            )
+            val paragraph = simpleParagraph(text = text, width = paragraphWidth)
 
             assertThat(paragraphShadow.bitmap()).isNotEqualToBitmap(paragraph.bitmap())
         }
@@ -3945,20 +3871,19 @@
             val fontSizeInPx = fontSize.toPx()
             val paragraphWidth = fontSizeInPx * text.length
 
-            val paragraphWithoutColor = simpleParagraph(
-                text = text,
-                style = TextStyle(fontSize = fontSize),
-                width = paragraphWidth
-            )
+            val paragraphWithoutColor =
+                simpleParagraph(
+                    text = text,
+                    style = TextStyle(fontSize = fontSize),
+                    width = paragraphWidth
+                )
 
-            val paragraphWithColor = simpleParagraph(
-                text = text,
-                style = TextStyle(
-                    color = Color.Red,
-                    fontSize = fontSize
-                ),
-                width = paragraphWidth
-            )
+            val paragraphWithColor =
+                simpleParagraph(
+                    text = text,
+                    style = TextStyle(color = Color.Red, fontSize = fontSize),
+                    width = paragraphWidth
+                )
 
             assertThat(paragraphWithColor.bitmap())
                 .isNotEqualToBitmap(paragraphWithoutColor.bitmap())
@@ -3974,19 +3899,19 @@
             val fontSizeInPx = fontSize.toPx()
             val letterSpacing = 1f
 
-            val paragraph = simpleParagraph(
-                text = text,
-                style = TextStyle(
-                    letterSpacing = letterSpacing.em,
-                    fontSize = fontSize
+            val paragraph =
+                simpleParagraph(
+                    text = text,
+                    style = TextStyle(letterSpacing = letterSpacing.em, fontSize = fontSize)
                 )
-            )
 
             if (hasEdgeLetterSpacingBugFix()) {
                 assertThat(paragraph.getLineRight(0))
-                    .isEqualTo(fontSizeInPx * (1 + letterSpacing) * text.length -
-                        fontSizeInPx * 0.5f - // left edge letter spacing
-                        fontSizeInPx * 0.5f) // right edge letter spacing
+                    .isEqualTo(
+                        fontSizeInPx * (1 + letterSpacing) * text.length -
+                            fontSizeInPx * 0.5f - // left edge letter spacing
+                            fontSizeInPx * 0.5f
+                    ) // right edge letter spacing
             } else {
                 assertThat(paragraph.getLineRight(0))
                     .isEqualTo(fontSizeInPx * (1 + letterSpacing) * text.length)
@@ -4003,20 +3928,23 @@
             val fontSizeInPx = fontSize.toPx()
             val paragraphWidth = fontSizeInPx * text.length
 
-            val paragraphWithoutBrush = simpleParagraph(
-                text = text,
-                style = TextStyle(fontSize = fontSize),
-                width = paragraphWidth
-            )
+            val paragraphWithoutBrush =
+                simpleParagraph(
+                    text = text,
+                    style = TextStyle(fontSize = fontSize),
+                    width = paragraphWidth
+                )
 
-            val paragraphWithBrush = simpleParagraph(
-                text = text,
-                style = TextStyle(
-                    fontSize = fontSize,
-                    brush = Brush.linearGradient(listOf(Color.Red, Color.Blue))
-                ),
-                width = paragraphWidth
-            )
+            val paragraphWithBrush =
+                simpleParagraph(
+                    text = text,
+                    style =
+                        TextStyle(
+                            fontSize = fontSize,
+                            brush = Brush.linearGradient(listOf(Color.Red, Color.Blue))
+                        ),
+                    width = paragraphWidth
+                )
 
             assertThat(paragraphWithBrush.bitmap())
                 .isNotEqualToBitmap(paragraphWithoutBrush.bitmap())
@@ -4033,21 +3961,19 @@
             val paragraphWidth = fontSizeInPx * text.length
             val brush = Brush.linearGradient(listOf(Color.Red, Color.Blue))
 
-            val paragraphWithoutAlpha = simpleParagraph(
-                text = text,
-                style = TextStyle(fontSize = fontSize, brush = brush),
-                width = paragraphWidth
-            )
+            val paragraphWithoutAlpha =
+                simpleParagraph(
+                    text = text,
+                    style = TextStyle(fontSize = fontSize, brush = brush),
+                    width = paragraphWidth
+                )
 
-            val paragraphWithAlpha = simpleParagraph(
-                text = text,
-                style = TextStyle(
-                    fontSize = fontSize,
-                    brush = brush,
-                    alpha = 0.5f
-                ),
-                width = paragraphWidth
-            )
+            val paragraphWithAlpha =
+                simpleParagraph(
+                    text = text,
+                    style = TextStyle(fontSize = fontSize, brush = brush, alpha = 0.5f),
+                    width = paragraphWidth
+                )
 
             assertThat(paragraphWithoutAlpha.bitmap())
                 .isNotEqualToBitmap(paragraphWithAlpha.bitmap())
@@ -4064,21 +3990,19 @@
             val paragraphWidth = fontSizeInPx * text.length
             val brush = Brush.linearGradient(listOf(Color.Red, Color.Blue))
 
-            val paragraphWithoutAlpha = simpleParagraph(
-                text = text,
-                style = TextStyle(fontSize = fontSize, brush = brush),
-                width = paragraphWidth
-            )
+            val paragraphWithoutAlpha =
+                simpleParagraph(
+                    text = text,
+                    style = TextStyle(fontSize = fontSize, brush = brush),
+                    width = paragraphWidth
+                )
 
-            val paragraphWithAlpha = simpleParagraph(
-                text = text,
-                style = TextStyle(
-                    fontSize = fontSize,
-                    brush = brush,
-                    alpha = 0.5f
-                ),
-                width = paragraphWidth
-            )
+            val paragraphWithAlpha =
+                simpleParagraph(
+                    text = text,
+                    style = TextStyle(fontSize = fontSize, brush = brush, alpha = 0.5f),
+                    width = paragraphWidth
+                )
 
             val firstBitmap = paragraphWithoutAlpha.bitmap(brush, 0.5f)
             val secondBitmap = paragraphWithAlpha.bitmap()
@@ -4093,25 +4017,16 @@
             val text = "abc"
             val fontSize = 20.sp
             val fontSizeInPx = fontSize.toPx()
-            val paragraph = simpleParagraph(
-                text = text,
-                style = TextStyle(
-                    fontFamily = fontFamilyMeasureFont,
-                    fontSize = fontSize
+            val paragraph =
+                simpleParagraph(
+                    text = text,
+                    style = TextStyle(fontFamily = fontFamilyMeasureFont, fontSize = fontSize)
                 )
-            )
 
             val expectedPath = Path()
             val lineLeft = paragraph.getLineLeft(0)
             val lineRight = paragraph.getLineRight(0)
-            expectedPath.addRect(
-                Rect(
-                    lineLeft,
-                    0f,
-                    lineRight - fontSizeInPx,
-                    fontSizeInPx
-                )
-            )
+            expectedPath.addRect(Rect(lineLeft, 0f, lineRight - fontSizeInPx, fontSizeInPx))
 
             // Select "ab"
             val actualPath = paragraph.getPathForRange(0, 2)
@@ -4127,13 +4042,11 @@
             val text = "abc\nabc"
             val fontSize = 20.sp
             val fontSizeInPx = fontSize.toPx()
-            val paragraph = simpleParagraph(
-                text = text,
-                style = TextStyle(
-                    fontFamily = fontFamilyMeasureFont,
-                    fontSize = fontSize
+            val paragraph =
+                simpleParagraph(
+                    text = text,
+                    style = TextStyle(fontFamily = fontFamilyMeasureFont, fontSize = fontSize)
                 )
-            )
 
             val expectedPath = Path()
             val firstLineLeft = paragraph.getLineLeft(0)
@@ -4141,20 +4054,10 @@
             val firstLineRight = paragraph.getLineRight(0)
             val secondLineRight = paragraph.getLineRight(1)
             expectedPath.addRect(
-                Rect(
-                    firstLineLeft + fontSizeInPx,
-                    0f,
-                    firstLineRight,
-                    fontSizeInPx
-                )
+                Rect(firstLineLeft + fontSizeInPx, 0f, firstLineRight, fontSizeInPx)
             )
             expectedPath.addRect(
-                Rect(
-                    secondLineLeft,
-                    fontSizeInPx,
-                    secondLineRight - fontSizeInPx,
-                    paragraph.height
-                )
+                Rect(secondLineLeft, fontSizeInPx, secondLineRight - fontSizeInPx, paragraph.height)
             )
 
             // Select "bc\nab"
@@ -4175,13 +4078,11 @@
             val selectionRTLEnd = 2
             val fontSize = 20.sp
             val fontSizeInPx = fontSize.toPx()
-            val paragraph = simpleParagraph(
-                text = text,
-                style = TextStyle(
-                    fontFamily = fontFamilyMeasureFont,
-                    fontSize = fontSize
+            val paragraph =
+                simpleParagraph(
+                    text = text,
+                    style = TextStyle(fontFamily = fontFamilyMeasureFont, fontSize = fontSize)
                 )
-            )
 
             val expectedPath = Path()
             val lineLeft = paragraph.getLineLeft(0)
@@ -4195,12 +4096,7 @@
                 )
             )
             expectedPath.addRect(
-                Rect(
-                    lineRight - selectionRTLEnd * fontSizeInPx,
-                    0f,
-                    lineRight,
-                    fontSizeInPx
-                )
+                Rect(lineRight - selectionRTLEnd * fontSizeInPx, 0f, lineRight, fontSizeInPx)
             )
 
             // Select "llo..של"
@@ -4215,13 +4111,11 @@
     @Test
     fun testGetPathForRange_Start_Equals_End_Returns_Empty_Path() {
         val text = "abc"
-        val paragraph = simpleParagraph(
-            text = text,
-            style = TextStyle(
-                fontFamily = fontFamilyMeasureFont,
-                fontSize = 20.sp
+        val paragraph =
+            simpleParagraph(
+                text = text,
+                style = TextStyle(fontFamily = fontFamilyMeasureFont, fontSize = 20.sp)
             )
-        )
 
         val actualPath = paragraph.getPathForRange(1, 1)
 
@@ -4231,13 +4125,11 @@
     @Test
     fun testGetPathForRange_Empty_Text() {
         val text = ""
-        val paragraph = simpleParagraph(
-            text = text,
-            style = TextStyle(
-                fontFamily = fontFamilyMeasureFont,
-                fontSize = 20.sp
+        val paragraph =
+            simpleParagraph(
+                text = text,
+                style = TextStyle(fontFamily = fontFamilyMeasureFont, fontSize = 20.sp)
             )
-        )
 
         val actualPath = paragraph.getPathForRange(0, 0)
 
@@ -4250,13 +4142,11 @@
             val text = "\uD834\uDD1E\uD834\uDD1F"
             val fontSize = 20.sp
             val fontSizeInPx = fontSize.toPx()
-            val paragraph = simpleParagraph(
-                text = text,
-                style = TextStyle(
-                    fontFamily = fontFamilyMeasureFont,
-                    fontSize = fontSize
+            val paragraph =
+                simpleParagraph(
+                    text = text,
+                    style = TextStyle(fontFamily = fontFamilyMeasureFont, fontSize = fontSize)
                 )
-            )
 
             // Try to select "\uDD1E\uD834\uDD1F", only "\uD834\uDD1F" is selected.
             val actualPath = paragraph.getPathForRange(1, text.length)
@@ -4275,13 +4165,11 @@
             val text = "\uD834\uDD1E\uD834\uDD1F"
             val fontSize = 20.sp
             val fontSizeInPx = fontSize.toPx()
-            val paragraph = simpleParagraph(
-                text = text,
-                style = TextStyle(
-                    fontFamily = fontFamilyMeasureFont,
-                    fontSize = fontSize
+            val paragraph =
+                simpleParagraph(
+                    text = text,
+                    style = TextStyle(fontFamily = fontFamilyMeasureFont, fontSize = fontSize)
                 )
-            )
 
             // Try to select "\uDD1E\uD834", actually "\uD834\uDD1F" is selected.
             val actualPath = paragraph.getPathForRange(1, text.length - 1)
@@ -4300,13 +4188,11 @@
             val text = "\uD834\uDD1E\uD834\uDD1F"
             val fontSize = 20.sp
             val fontSizeInPx = fontSize.toPx()
-            val paragraph = simpleParagraph(
-                text = text,
-                style = TextStyle(
-                    fontFamily = fontFamilyMeasureFont,
-                    fontSize = fontSize
+            val paragraph =
+                simpleParagraph(
+                    text = text,
+                    style = TextStyle(fontFamily = fontFamilyMeasureFont, fontSize = fontSize)
                 )
-            )
 
             // Try to select "\uDD1E", get vertical line segment after this character.
             val actualPath = paragraph.getPathForRange(1, 2)
@@ -4325,13 +4211,11 @@
             val text = "\uD83D\uDE00\uD83D\uDE03\uD83D\uDE04\uD83D\uDE06"
             val fontSize = 20.sp
             val fontSizeInPx = fontSize.toPx()
-            val paragraph = simpleParagraph(
-                text = text,
-                style = TextStyle(
-                    fontFamily = fontFamilyMeasureFont,
-                    fontSize = fontSize
+            val paragraph =
+                simpleParagraph(
+                    text = text,
+                    style = TextStyle(fontFamily = fontFamilyMeasureFont, fontSize = fontSize)
                 )
-            )
 
             // Select "\u1F603\u1F604"
             val actualPath = paragraph.getPathForRange(1, text.length - 1)
@@ -4350,13 +4234,11 @@
             val text = "\u200D"
             val fontSize = 20.sp
             val fontSizeInPx = fontSize.toPx()
-            val paragraph = simpleParagraph(
-                text = text,
-                style = TextStyle(
-                    fontFamily = fontFamilyMeasureFont,
-                    fontSize = fontSize
+            val paragraph =
+                simpleParagraph(
+                    text = text,
+                    style = TextStyle(fontFamily = fontFamilyMeasureFont, fontSize = fontSize)
                 )
-            )
 
             val expectedPath = Path()
             val lineLeft = paragraph.getLineLeft(0)
@@ -4377,13 +4259,11 @@
             val text = "\u2066"
             val fontSize = 20f.sp
             val fontSizeInPx = fontSize.toPx()
-            val paragraph = simpleParagraph(
-                text = text,
-                style = TextStyle(
-                    fontFamily = fontFamilyMeasureFont,
-                    fontSize = fontSize
+            val paragraph =
+                simpleParagraph(
+                    text = text,
+                    style = TextStyle(fontFamily = fontFamilyMeasureFont, fontSize = fontSize)
                 )
-            )
 
             val expectedPath = Path()
             val lineLeft = paragraph.getLineLeft(0)
@@ -4401,13 +4281,11 @@
     @Test
     fun testGetWordBoundary() {
         val text = "abc def"
-        val paragraph = simpleParagraph(
-            text = text,
-            style = TextStyle(
-                fontFamily = fontFamilyMeasureFont,
-                fontSize = 20.sp
+        val paragraph =
+            simpleParagraph(
+                text = text,
+                style = TextStyle(fontFamily = fontFamilyMeasureFont, fontSize = 20.sp)
             )
-        )
 
         val result = paragraph.getWordBoundary(text.indexOf('a'))
 
@@ -4418,13 +4296,11 @@
     @Test
     fun testGetWordBoundary_spaces() {
         val text = "ab cd  e"
-        val paragraph = simpleParagraph(
-            text = text,
-            style = TextStyle(
-                fontFamily = fontFamilyMeasureFont,
-                fontSize = 20.sp
+        val paragraph =
+            simpleParagraph(
+                text = text,
+                style = TextStyle(fontFamily = fontFamilyMeasureFont, fontSize = 20.sp)
             )
-        )
 
         // end of word (length+1) will select word
         val singleSpaceStartResult = paragraph.getWordBoundary(text.indexOf('b') + 1)
@@ -4446,13 +4322,11 @@
     @Test
     fun testGetWordBoundary_Bidi() {
         val text = "abc \u05d0\u05d1\u05d2 def"
-        val paragraph = simpleParagraph(
-            text = text,
-            style = TextStyle(
-                fontFamily = fontFamilyMeasureFont,
-                fontSize = 20.sp
+        val paragraph =
+            simpleParagraph(
+                text = text,
+                style = TextStyle(fontFamily = fontFamilyMeasureFont, fontSize = 20.sp)
             )
-        )
 
         val resultEnglish = paragraph.getWordBoundary(text.indexOf('a'))
         val resultHebrew = paragraph.getWordBoundary(text.indexOf('\u05d1'))
@@ -4469,17 +4343,19 @@
         val fontSize = 20.sp
         val densityMultiplier = 2f
 
-        val paragraph = simpleParagraph(
-            text = text,
-            style = TextStyle(fontSize = fontSize),
-            density = Density(density = 1f, fontScale = 1f)
-        )
+        val paragraph =
+            simpleParagraph(
+                text = text,
+                style = TextStyle(fontSize = fontSize),
+                density = Density(density = 1f, fontScale = 1f)
+            )
 
-        val doubleFontSizeParagraph = simpleParagraph(
-            text = text,
-            style = TextStyle(fontSize = fontSize),
-            density = Density(density = 1f, fontScale = densityMultiplier)
-        )
+        val doubleFontSizeParagraph =
+            simpleParagraph(
+                text = text,
+                style = TextStyle(fontSize = fontSize),
+                density = Density(density = 1f, fontScale = densityMultiplier)
+            )
 
         // Since Android uses non-linear font scaling, best we can do is check that the size fits a
         // range.
@@ -4497,10 +4373,7 @@
         with(defaultDensity) {
             val fontSize = 12.sp
             val text = "b "
-            val paragraph = simpleParagraph(
-                text = text,
-                style = TextStyle(fontSize = fontSize)
-            )
+            val paragraph = simpleParagraph(text = text, style = TextStyle(fontSize = fontSize))
 
             val expectedWidth = text.length * fontSize.toPx()
             assertThat(paragraph.minIntrinsicWidth).isEqualTo(expectedWidth)
@@ -4512,14 +4385,10 @@
         with(defaultDensity) {
             // create words with length 1, 2, 3... 50; and append all with space.
             val maxWordLength = 50
-            val text = (1..maxWordLength).fold("") { string, next ->
-                string + "a".repeat(next) + " "
-            }
+            val text =
+                (1..maxWordLength).fold("") { string, next -> string + "a".repeat(next) + " " }
             val fontSize = 12.sp
-            val paragraph = simpleParagraph(
-                text = text,
-                style = TextStyle(fontSize = fontSize)
-            )
+            val paragraph = simpleParagraph(text = text, style = TextStyle(fontSize = fontSize))
 
             // +1 is for the white space
             val expectedWidth = (maxWordLength + 1) * fontSize.toPx()
@@ -4533,15 +4402,19 @@
             val text = "a bb ccc"
             val fontSize = 12.sp
             val styledFontSize = fontSize * 2
-            val paragraph = simpleParagraph(
-                text = text,
-                style = TextStyle(fontSize = fontSize),
-                spanStyles = listOf(
-                    AnnotatedString.Range(
-                        SpanStyle(fontSize = styledFontSize), "a".length, "a bb ".length
-                    )
+            val paragraph =
+                simpleParagraph(
+                    text = text,
+                    style = TextStyle(fontSize = fontSize),
+                    spanStyles =
+                        listOf(
+                            AnnotatedString.Range(
+                                SpanStyle(fontSize = styledFontSize),
+                                "a".length,
+                                "a bb ".length
+                            )
+                        )
                 )
-            )
 
             val expectedWidth = "bb ".length * styledFontSize.toPx()
             assertThat(paragraph.minIntrinsicWidth).isEqualTo(expectedWidth)
@@ -4585,21 +4458,20 @@
             val fontSize = 14.sp
             val fontSizeInPx = fontSize.toPx()
 
-            val paragraphIntrinsics = ParagraphIntrinsics(
-                text = text,
-                style = TextStyle(
-                    fontSize = fontSize,
-                    fontFamily = fontFamilyMeasureFont
-                ),
-                spanStyles = listOf(),
-                density = defaultDensity,
-                fontFamilyResolver = UncachedFontFamilyResolver(context)
-            )
+            val paragraphIntrinsics =
+                ParagraphIntrinsics(
+                    text = text,
+                    style = TextStyle(fontSize = fontSize, fontFamily = fontFamilyMeasureFont),
+                    spanStyles = listOf(),
+                    density = defaultDensity,
+                    fontFamilyResolver = UncachedFontFamilyResolver(context)
+                )
 
-            val paragraph = Paragraph(
-                paragraphIntrinsics = paragraphIntrinsics,
-                constraints = Constraints(maxWidth = (fontSizeInPx * text.length).ceilToInt())
-            )
+            val paragraph =
+                Paragraph(
+                    paragraphIntrinsics = paragraphIntrinsics,
+                    constraints = Constraints(maxWidth = (fontSizeInPx * text.length).ceilToInt())
+                )
 
             assertThat(paragraph.maxIntrinsicWidth).isEqualTo(paragraphIntrinsics.maxIntrinsicWidth)
             assertThat(paragraph.width).isEqualTo(fontSizeInPx * text.length)
@@ -4608,19 +4480,12 @@
 
     @Test(expected = IllegalArgumentException::class)
     fun negativeMaxLines_throwsException() {
-        simpleParagraph(
-            text = "",
-            maxLines = -1,
-            width = Float.MAX_VALUE
-        )
+        simpleParagraph(text = "", maxLines = -1, width = Float.MAX_VALUE)
     }
 
     @Test(expected = IllegalArgumentException::class)
     fun negativeWidth_throwsException() {
-        simpleParagraph(
-            text = "",
-            width = -1f
-        )
+        simpleParagraph(text = "", width = -1f)
     }
 
     @Test
@@ -4632,17 +4497,19 @@
             val fontSizeInPx = fontSize.toPx()
             val paragraphWidth = fontSizeInPx * text.length
 
-            val paragraphWithColor = simpleParagraph(
-                text = text,
-                style = TextStyle(color = Color.Red, fontSize = fontSize),
-                width = paragraphWidth
-            )
+            val paragraphWithColor =
+                simpleParagraph(
+                    text = text,
+                    style = TextStyle(color = Color.Red, fontSize = fontSize),
+                    width = paragraphWidth
+                )
 
-            val paragraphWithSolidColor = simpleParagraph(
-                text = text,
-                style = TextStyle(brush = SolidColor(Color.Red), fontSize = fontSize),
-                width = paragraphWidth
-            )
+            val paragraphWithSolidColor =
+                simpleParagraph(
+                    text = text,
+                    style = TextStyle(brush = SolidColor(Color.Red), fontSize = fontSize),
+                    width = paragraphWidth
+                )
 
             assertThat(paragraphWithColor.bitmap())
                 .isEqualToBitmap(paragraphWithSolidColor.bitmap())
@@ -4658,35 +4525,41 @@
             val fontSizeInPx = fontSize.toPx()
             val paragraphWidth = fontSizeInPx * text.length
 
-            val paragraph = simpleParagraph(
-                text = text,
-                style = TextStyle(
-                    fontSize = fontSize,
-                    brush = Brush.linearGradient(listOf(Color.Red, Color.Blue))
-                ),
-                width = paragraphWidth
-            )
-
-            val paragraphWithSpan = simpleParagraph(
-                text = text,
-                style = TextStyle(
-                    fontSize = fontSize,
-                    brush = Brush.linearGradient(listOf(Color.Red, Color.Blue))
-                ),
-                spanStyles = listOf(
-                    AnnotatedString.Range(
-                        item = SpanStyle(
-                            brush = Brush.linearGradient(listOf(Color.Yellow, Color.Green))
+            val paragraph =
+                simpleParagraph(
+                    text = text,
+                    style =
+                        TextStyle(
+                            fontSize = fontSize,
+                            brush = Brush.linearGradient(listOf(Color.Red, Color.Blue))
                         ),
-                        start = 0,
-                        end = text.length
-                    )
-                ),
-                width = paragraphWidth
-            )
+                    width = paragraphWidth
+                )
 
-            assertThat(paragraph.bitmap())
-                .isNotEqualToBitmap(paragraphWithSpan.bitmap())
+            val paragraphWithSpan =
+                simpleParagraph(
+                    text = text,
+                    style =
+                        TextStyle(
+                            fontSize = fontSize,
+                            brush = Brush.linearGradient(listOf(Color.Red, Color.Blue))
+                        ),
+                    spanStyles =
+                        listOf(
+                            AnnotatedString.Range(
+                                item =
+                                    SpanStyle(
+                                        brush =
+                                            Brush.linearGradient(listOf(Color.Yellow, Color.Green))
+                                    ),
+                                start = 0,
+                                end = text.length
+                            )
+                        ),
+                    width = paragraphWidth
+                )
+
+            assertThat(paragraph.bitmap()).isNotEqualToBitmap(paragraphWithSpan.bitmap())
         }
     }
 
@@ -4700,26 +4573,29 @@
             val fontSizeInPx = fontSize.toPx()
             val paragraphWidth = fontSizeInPx * ltrText.length
 
-            val ltrParagraph = simpleParagraph(
-                text = ltrText,
-                style = TextStyle(
-                    fontSize = fontSize,
-                    brush = Brush.linearGradient(listOf(Color.Red, Color.Blue))
-                ),
-                width = paragraphWidth
-            )
+            val ltrParagraph =
+                simpleParagraph(
+                    text = ltrText,
+                    style =
+                        TextStyle(
+                            fontSize = fontSize,
+                            brush = Brush.linearGradient(listOf(Color.Red, Color.Blue))
+                        ),
+                    width = paragraphWidth
+                )
 
-            val rtlParagraph = simpleParagraph(
-                text = rtlText,
-                style = TextStyle(
-                    fontSize = fontSize,
-                    brush = Brush.linearGradient(listOf(Color.Red, Color.Blue))
-                ),
-                width = paragraphWidth
-            )
+            val rtlParagraph =
+                simpleParagraph(
+                    text = rtlText,
+                    style =
+                        TextStyle(
+                            fontSize = fontSize,
+                            brush = Brush.linearGradient(listOf(Color.Red, Color.Blue))
+                        ),
+                    width = paragraphWidth
+                )
 
-            assertThat(ltrParagraph.bitmap())
-                .isNotEqualToBitmap(rtlParagraph.bitmap())
+            assertThat(ltrParagraph.bitmap()).isNotEqualToBitmap(rtlParagraph.bitmap())
 
             // Color on the same pixel should be the same since they used the same brush.
             assertThat(ltrParagraph.bitmap().getPixel(50, 50))
@@ -4736,11 +4612,12 @@
             val fontSizeInPx = fontSize.toPx()
             val paragraphWidth = fontSizeInPx * text.length
 
-            val baseParagraph = simpleParagraph(
-                text = text,
-                style = TextStyle(fontSize = fontSize, color = Color.Red),
-                width = paragraphWidth
-            )
+            val baseParagraph =
+                simpleParagraph(
+                    text = text,
+                    style = TextStyle(fontSize = fontSize, color = Color.Red),
+                    width = paragraphWidth
+                )
 
             assertThat(baseParagraph.bitmap())
                 .isNotEqualToBitmap(baseParagraph.bitmap(drawStyle = Stroke()))
@@ -4756,14 +4633,12 @@
             val fontSizeInPx = fontSize.toPx()
             val paragraphWidth = fontSizeInPx * text.length
 
-            val baseParagraph = simpleParagraph(
-                text = text,
-                style = TextStyle(
-                    fontSize = fontSize,
-                    color = Color.Red
-                ),
-                width = paragraphWidth
-            )
+            val baseParagraph =
+                simpleParagraph(
+                    text = text,
+                    style = TextStyle(fontSize = fontSize, color = Color.Red),
+                    width = paragraphWidth
+                )
 
             val firstBitmap = baseParagraph.bitmap(drawStyle = Stroke(4f))
             val secondBitmap = baseParagraph.bitmap(drawStyle = null)
@@ -4781,27 +4656,30 @@
             val fontSizeInPx = fontSize.toPx()
             val paragraphWidth = fontSizeInPx * text.length
 
-            val baseParagraph = simpleParagraph(
-                text = text,
-                style = TextStyle(fontSize = fontSize, color = Color.Green),
-                width = paragraphWidth
-            )
+            val baseParagraph =
+                simpleParagraph(
+                    text = text,
+                    style = TextStyle(fontSize = fontSize, color = Color.Green),
+                    width = paragraphWidth
+                )
 
-            val bitmapDefault = baseParagraph.onCanvas { canvas ->
-                // first draw a Red background
-                val paint = Paint().apply { color = Color.Red }
-                canvas.drawRect(Rect(Offset.Zero, Size(width, height)), paint)
-                // draw the paragraph as usual
-                baseParagraph.paint(canvas)
-            }
+            val bitmapDefault =
+                baseParagraph.onCanvas { canvas ->
+                    // first draw a Red background
+                    val paint = Paint().apply { color = Color.Red }
+                    canvas.drawRect(Rect(Offset.Zero, Size(width, height)), paint)
+                    // draw the paragraph as usual
+                    baseParagraph.paint(canvas)
+                }
 
-            val bitmapPlus = baseParagraph.onCanvas { canvas ->
-                // first draw a Red background
-                val paint = Paint().apply { color = Color.Red }
-                canvas.drawRect(Rect(Offset.Zero, Size(width, height)), paint)
-                // draw the paragraph as usual
-                this.paint(canvas, blendMode = BlendMode.Plus)
-            }
+            val bitmapPlus =
+                baseParagraph.onCanvas { canvas ->
+                    // first draw a Red background
+                    val paint = Paint().apply { color = Color.Red }
+                    canvas.drawRect(Rect(Offset.Zero, Size(width, height)), paint)
+                    // draw the paragraph as usual
+                    this.paint(canvas, blendMode = BlendMode.Plus)
+                }
 
             assertThat(bitmapDefault).isNotEqualToBitmap(bitmapPlus)
         }
@@ -4816,27 +4694,30 @@
             val fontSizeInPx = fontSize.toPx()
             val paragraphWidth = fontSizeInPx * text.length
 
-            val baseParagraph = simpleParagraph(
-                text = text,
-                style = TextStyle(fontSize = fontSize),
-                width = paragraphWidth
-            )
+            val baseParagraph =
+                simpleParagraph(
+                    text = text,
+                    style = TextStyle(fontSize = fontSize),
+                    width = paragraphWidth
+                )
 
-            val bitmapSrc = baseParagraph.onCanvas { canvas ->
-                // first draw a Red background
-                val paint = Paint().apply { color = Color.Red }
-                canvas.drawRect(Rect(Offset.Zero, Size(width, height)), paint)
-                // draw the paragraph as usual
-                baseParagraph.paint(canvas, blendMode = BlendMode.Src)
-            }
+            val bitmapSrc =
+                baseParagraph.onCanvas { canvas ->
+                    // first draw a Red background
+                    val paint = Paint().apply { color = Color.Red }
+                    canvas.drawRect(Rect(Offset.Zero, Size(width, height)), paint)
+                    // draw the paragraph as usual
+                    baseParagraph.paint(canvas, blendMode = BlendMode.Src)
+                }
 
-            val bitmapSrcOver = baseParagraph.onCanvas { canvas ->
-                // first draw a Red background
-                val paint = Paint().apply { color = Color.Red }
-                canvas.drawRect(Rect(Offset.Zero, Size(width, height)), paint)
-                // draw the paragraph as usual
-                this.paint(canvas, blendMode = BlendMode.SrcOver)
-            }
+            val bitmapSrcOver =
+                baseParagraph.onCanvas { canvas ->
+                    // first draw a Red background
+                    val paint = Paint().apply { color = Color.Red }
+                    canvas.drawRect(Rect(Offset.Zero, Size(width, height)), paint)
+                    // draw the paragraph as usual
+                    this.paint(canvas, blendMode = BlendMode.SrcOver)
+                }
 
             assertThat(bitmapSrc).isEqualToBitmap(bitmapSrcOver)
         }
@@ -4855,9 +4736,7 @@
         return Paragraph(
             text = text,
             spanStyles = spanStyles,
-            style = TextStyle(
-                fontFamily = fontFamilyMeasureFont
-            ).merge(style),
+            style = TextStyle(fontFamily = fontFamilyMeasureFont).merge(style),
             maxLines = maxLines,
             ellipsis = ellipsis,
             constraints = Constraints(maxWidth = width.ceilToInt(), maxHeight = height.ceilToInt()),
diff --git a/compose/ui/ui-text/src/androidInstrumentedTest/kotlin/androidx/compose/ui/text/ParagraphIntegrationTextDirectionTest.kt b/compose/ui/ui-text/src/androidInstrumentedTest/kotlin/androidx/compose/ui/text/ParagraphIntegrationTextDirectionTest.kt
index 2902fa8..db2bd03 100644
--- a/compose/ui/ui-text/src/androidInstrumentedTest/kotlin/androidx/compose/ui/text/ParagraphIntegrationTextDirectionTest.kt
+++ b/compose/ui/ui-text/src/androidInstrumentedTest/kotlin/androidx/compose/ui/text/ParagraphIntegrationTextDirectionTest.kt
@@ -58,13 +58,14 @@
     fun unspecifiedTextDirection_withLtrLocale_resolvesToLtr() {
         Locale.setDefault(ltrLocale)
 
-        val paragraph = Paragraph(
-            text = "",
-            style = TextStyle(textDirection = TextDirection.Unspecified),
-            constraints = Constraints(),
-            density = defaultDensity,
-            fontFamilyResolver = resourceLoader
-        )
+        val paragraph =
+            Paragraph(
+                text = "",
+                style = TextStyle(textDirection = TextDirection.Unspecified),
+                constraints = Constraints(),
+                density = defaultDensity,
+                fontFamilyResolver = resourceLoader
+            )
 
         assertThat(paragraph.getParagraphDirection(0)).isEqualTo(ResolvedTextDirection.Ltr)
     }
@@ -73,45 +74,50 @@
     fun unspecifiedTextDirection_withRtlLocale_resolvesToRtl() {
         Locale.setDefault(rtlLocale)
 
-        val paragraph = Paragraph(
-            text = "",
-            style = TextStyle(textDirection = TextDirection.Unspecified),
-            constraints = Constraints(),
-            density = defaultDensity,
-            fontFamilyResolver = resourceLoader
-        )
+        val paragraph =
+            Paragraph(
+                text = "",
+                style = TextStyle(textDirection = TextDirection.Unspecified),
+                constraints = Constraints(),
+                density = defaultDensity,
+                fontFamilyResolver = resourceLoader
+            )
 
         assertThat(paragraph.getParagraphDirection(0)).isEqualTo(ResolvedTextDirection.Rtl)
     }
 
     @Test
     fun unspecifiedTextDirection_withLtrLocaleList_resolvesToLtr() {
-        val paragraph = Paragraph(
-            text = "",
-            style = TextStyle(
-                textDirection = TextDirection.Unspecified,
-                localeList = ltrLocaleList
-            ),
-            constraints = Constraints(),
-            density = defaultDensity,
-            fontFamilyResolver = resourceLoader
-        )
+        val paragraph =
+            Paragraph(
+                text = "",
+                style =
+                    TextStyle(
+                        textDirection = TextDirection.Unspecified,
+                        localeList = ltrLocaleList
+                    ),
+                constraints = Constraints(),
+                density = defaultDensity,
+                fontFamilyResolver = resourceLoader
+            )
 
         assertThat(paragraph.getParagraphDirection(0)).isEqualTo(ResolvedTextDirection.Ltr)
     }
 
     @Test
     fun unspecifiedTextDirection_withRtlLocaleList_resolvesToRtl() {
-        val paragraph = Paragraph(
-            text = "",
-            style = TextStyle(
-                textDirection = TextDirection.Unspecified,
-                localeList = rtlLocaleList
-            ),
-            constraints = Constraints(),
-            density = defaultDensity,
-            fontFamilyResolver = resourceLoader
-        )
+        val paragraph =
+            Paragraph(
+                text = "",
+                style =
+                    TextStyle(
+                        textDirection = TextDirection.Unspecified,
+                        localeList = rtlLocaleList
+                    ),
+                constraints = Constraints(),
+                density = defaultDensity,
+                fontFamilyResolver = resourceLoader
+            )
 
         assertThat(paragraph.getParagraphDirection(0)).isEqualTo(ResolvedTextDirection.Rtl)
     }
diff --git a/compose/ui/ui-text/src/androidInstrumentedTest/kotlin/androidx/compose/ui/text/ParagraphIntrinsicIntegrationTest.kt b/compose/ui/ui-text/src/androidInstrumentedTest/kotlin/androidx/compose/ui/text/ParagraphIntrinsicIntegrationTest.kt
index c01f046..4ea9c2b 100644
--- a/compose/ui/ui-text/src/androidInstrumentedTest/kotlin/androidx/compose/ui/text/ParagraphIntrinsicIntegrationTest.kt
+++ b/compose/ui/ui-text/src/androidInstrumentedTest/kotlin/androidx/compose/ui/text/ParagraphIntrinsicIntegrationTest.kt
@@ -48,10 +48,7 @@
             val text = "\u05D0\u05D1\u05D2"
             val fontSize = 50.sp
 
-            val paragraphIntrinsics = paragraphIntrinsics(
-                text = text,
-                fontSize = fontSize
-            )
+            val paragraphIntrinsics = paragraphIntrinsics(text = text, fontSize = fontSize)
 
             assertThat(paragraphIntrinsics.maxIntrinsicWidth)
                 .isEqualTo(text.length * fontSize.toPx())
@@ -64,10 +61,7 @@
             val text = "abc"
             val fontSize = 50.sp
 
-            val paragraphIntrinsics = paragraphIntrinsics(
-                text = text,
-                fontSize = fontSize
-            )
+            val paragraphIntrinsics = paragraphIntrinsics(text = text, fontSize = fontSize)
 
             assertThat(paragraphIntrinsics.maxIntrinsicWidth)
                 .isEqualTo(text.length * fontSize.toPx())
@@ -79,10 +73,7 @@
         with(defaultDensity) {
             val text = "abc\nabc"
             val fontSize = 50.sp
-            val paragraphIntrinsics = paragraphIntrinsics(
-                text = text,
-                fontSize = fontSize
-            )
+            val paragraphIntrinsics = paragraphIntrinsics(text = text, fontSize = fontSize)
 
             assertThat(paragraphIntrinsics.maxIntrinsicWidth)
                 .isEqualTo(text.indexOf('\n') * fontSize.toPx())
@@ -95,17 +86,19 @@
             val text = "a bb ccc"
             val fontSize = 12.sp
             val styledFontSize = 24.sp
-            val paragraph = paragraphIntrinsics(
-                text = text,
-                fontSize = fontSize,
-                spanStyles = listOf(
-                    Range(
-                        item = SpanStyle(fontSize = styledFontSize),
-                        start = "a ".length,
-                        end = "a bb ".length
-                    )
+            val paragraph =
+                paragraphIntrinsics(
+                    text = text,
+                    fontSize = fontSize,
+                    spanStyles =
+                        listOf(
+                            Range(
+                                item = SpanStyle(fontSize = styledFontSize),
+                                start = "a ".length,
+                                end = "a bb ".length
+                            )
+                        )
                 )
-            )
 
             // since "bb " is double font size, the whole width should be the text size, and the
             // additional width resulting from the "bb " length.
@@ -127,10 +120,7 @@
             val text = "\u05D0\u05D1\u05D2"
             val fontSize = 50.sp
 
-            val paragraphIntrinsics = paragraphIntrinsics(
-                text = text,
-                fontSize = fontSize
-            )
+            val paragraphIntrinsics = paragraphIntrinsics(text = text, fontSize = fontSize)
 
             assertThat(paragraphIntrinsics.minIntrinsicWidth)
                 .isEqualTo(text.length * fontSize.toPx())
@@ -143,10 +133,7 @@
             val text = "abc"
             val fontSize = 50.sp
 
-            val paragraphIntrinsics = paragraphIntrinsics(
-                text = text,
-                fontSize = fontSize
-            )
+            val paragraphIntrinsics = paragraphIntrinsics(text = text, fontSize = fontSize)
 
             assertThat(paragraphIntrinsics.minIntrinsicWidth)
                 .isEqualTo(text.length * fontSize.toPx())
@@ -158,14 +145,10 @@
         with(defaultDensity) {
             // create words with length 1, 2, 3... 50; and append all with space.
             val maxWordLength = 50
-            val text = (1..maxWordLength).fold("") { string, next ->
-                string + "a".repeat(next) + " "
-            }
+            val text =
+                (1..maxWordLength).fold("") { string, next -> string + "a".repeat(next) + " " }
             val fontSize = 12.sp
-            val paragraph = paragraphIntrinsics(
-                text = text,
-                fontSize = fontSize
-            )
+            val paragraph = paragraphIntrinsics(text = text, fontSize = fontSize)
 
             // +1 is for the white space
             val expectedWidth = (maxWordLength + 1) * fontSize.toPx()
@@ -179,17 +162,19 @@
             val text = "a bb ccc"
             val fontSize = 12.sp
             val styledFontSize = 24.sp
-            val paragraph = paragraphIntrinsics(
-                text = text,
-                fontSize = fontSize,
-                spanStyles = listOf(
-                    Range(
-                        item = SpanStyle(fontSize = styledFontSize),
-                        start = "a".length,
-                        end = "a bb ".length
-                    )
+            val paragraph =
+                paragraphIntrinsics(
+                    text = text,
+                    fontSize = fontSize,
+                    spanStyles =
+                        listOf(
+                            Range(
+                                item = SpanStyle(fontSize = styledFontSize),
+                                start = "a".length,
+                                end = "a bb ".length
+                            )
+                        )
                 )
-            )
 
             val expectedWidth = "bb ".length * styledFontSize.toPx()
             assertThat(paragraph.minIntrinsicWidth).isEqualTo(expectedWidth)
@@ -206,10 +191,7 @@
             text = text,
             spanStyles = spanStyles,
             placeholders = listOf(),
-            style = TextStyle(
-                fontFamily = fontFamilyMeasureFont,
-                fontSize = fontSize
-            ).merge(style),
+            style = TextStyle(fontFamily = fontFamilyMeasureFont, fontSize = fontSize).merge(style),
             density = defaultDensity,
             fontFamilyResolver = UncachedFontFamilyResolver(context)
         )
diff --git a/compose/ui/ui-text/src/androidInstrumentedTest/kotlin/androidx/compose/ui/text/ParagraphIntrinsicsAsyncTypefaceTest.kt b/compose/ui/ui-text/src/androidInstrumentedTest/kotlin/androidx/compose/ui/text/ParagraphIntrinsicsAsyncTypefaceTest.kt
index 0aa49d2..ba2d38b 100644
--- a/compose/ui/ui-text/src/androidInstrumentedTest/kotlin/androidx/compose/ui/text/ParagraphIntrinsicsAsyncTypefaceTest.kt
+++ b/compose/ui/ui-text/src/androidInstrumentedTest/kotlin/androidx/compose/ui/text/ParagraphIntrinsicsAsyncTypefaceTest.kt
@@ -48,14 +48,8 @@
 
     @Test
     fun hasStaleResolvedFonts_falseByDefault() {
-        val subject = paragraphIntrinsics(
-            "Text",
-            createFontFamilyResolver(context),
-            null
-        )
-        Snapshot.withMutableSnapshot {
-            assertThat(subject.hasStaleResolvedFonts).isFalse()
-        }
+        val subject = paragraphIntrinsics("Text", createFontFamilyResolver(context), null)
+        Snapshot.withMutableSnapshot { assertThat(subject.hasStaleResolvedFonts).isFalse() }
     }
 
     @OptIn(ExperimentalCoroutinesApi::class)
@@ -69,21 +63,11 @@
             val resolverJob = Job(coroutineContext[Job])
             val resolverContext = coroutineContext + resolverJob
             val fontFamilyResolver = createFontFamilyResolver(context, resolverContext)
-            val subject = paragraphIntrinsics(
-                "Text",
-                fontFamilyResolver,
-                fontFamily
-            )
+            val subject = paragraphIntrinsics("Text", fontFamilyResolver, fontFamily)
 
-            val result = async {
-                snapshotFlow { subject.hasStaleResolvedFonts }
-                    .take(2)
-                    .toList()
-            }
+            val result = async { snapshotFlow { subject.hasStaleResolvedFonts }.take(2).toList() }
 
-            Snapshot.withMutableSnapshot {
-                loader.completeOne(asyncFauxFont, Typeface.MONOSPACE)
-            }
+            Snapshot.withMutableSnapshot { loader.completeOne(asyncFauxFont, Typeface.MONOSPACE) }
 
             assertThat(result.await()).isEqualTo(listOf(false, true))
             resolverJob.cancel()
@@ -104,22 +88,11 @@
 
             val spanStyle = SpanStyle(fontFamily = fontFamily)
             val styles = listOf(AnnotatedString.Range(spanStyle, 0, 1))
-            val subject = paragraphIntrinsics(
-                "Text",
-                fontFamilyResolver,
-                null,
-                styles
-            )
+            val subject = paragraphIntrinsics("Text", fontFamilyResolver, null, styles)
 
-            val result = async {
-                snapshotFlow { subject.hasStaleResolvedFonts }
-                    .take(2)
-                    .toList()
-            }
+            val result = async { snapshotFlow { subject.hasStaleResolvedFonts }.take(2).toList() }
 
-            Snapshot.withMutableSnapshot {
-                loader.completeOne(asyncFauxFont, Typeface.MONOSPACE)
-            }
+            Snapshot.withMutableSnapshot { loader.completeOne(asyncFauxFont, Typeface.MONOSPACE) }
 
             assertThat(result.await()).isEqualTo(listOf(false, true))
             resolverJob.cancel()
diff --git a/compose/ui/ui-text/src/androidInstrumentedTest/kotlin/androidx/compose/ui/text/ParagraphPlaceholderIntegrationTest.kt b/compose/ui/ui-text/src/androidInstrumentedTest/kotlin/androidx/compose/ui/text/ParagraphPlaceholderIntegrationTest.kt
index 7164432..6fad0af 100644
--- a/compose/ui/ui-text/src/androidInstrumentedTest/kotlin/androidx/compose/ui/text/ParagraphPlaceholderIntegrationTest.kt
+++ b/compose/ui/ui-text/src/androidInstrumentedTest/kotlin/androidx/compose/ui/text/ParagraphPlaceholderIntegrationTest.kt
@@ -40,12 +40,13 @@
         val width = 1.em
         val placeholder = Placeholder(width, height, PlaceholderVerticalAlign.AboveBaseline)
 
-        val paragraph = simpleParagraph(
-            text = text,
-            fontSize = fontSize.sp,
-            placeholders = listOf(AnnotatedString.Range(placeholder, 1, 2)),
-            width = Float.MAX_VALUE
-        )
+        val paragraph =
+            simpleParagraph(
+                text = text,
+                fontSize = fontSize.sp,
+                placeholders = listOf(AnnotatedString.Range(placeholder, 1, 2)),
+                width = Float.MAX_VALUE
+            )
         val placeholderRects = paragraph.placeholderRects
         assertThat(placeholderRects.size).isEqualTo(1)
         // Height won't be increased. Notice: in fontFamilyMeasureFont lineHeight = 1.2 * fontSize
@@ -67,20 +68,20 @@
         val width = 1.em
         val placeholder = Placeholder(width, height, PlaceholderVerticalAlign.AboveBaseline)
 
-        val paragraph = simpleParagraph(
-            text = text,
-            fontSize = fontSize.sp,
-            placeholders = listOf(AnnotatedString.Range(placeholder, 1, 2)),
-            width = Float.MAX_VALUE
-        )
+        val paragraph =
+            simpleParagraph(
+                text = text,
+                fontSize = fontSize.sp,
+                placeholders = listOf(AnnotatedString.Range(placeholder, 1, 2)),
+                width = Float.MAX_VALUE
+            )
         val placeholderRects = paragraph.placeholderRects
         assertThat(placeholderRects.size).isEqualTo(1)
 
         // In the measure font, descent = 0.2 * fontSize, ascent = 1 * fontSize.
         // In this case, ascent is pushed by placeholder to 2 * fontSize, so that
         // lineHeight  = 0.2 * fontSize + 2 * fontSize.
-        assertThat(paragraph.getLineHeight(0))
-            .isEqualTo(0.2f * fontSize + fontSize * height.value)
+        assertThat(paragraph.getLineHeight(0)).isEqualTo(0.2f * fontSize + fontSize * height.value)
 
         val bound = placeholderRects[0]!!
         assertThat(bound.bottom).isEqualTo(paragraph.firstBaseline)
@@ -98,12 +99,13 @@
         val width = 1.em
         val placeholder = Placeholder(width, height, PlaceholderVerticalAlign.Bottom)
 
-        val paragraph = simpleParagraph(
-            text = text,
-            fontSize = fontSize.sp,
-            placeholders = listOf(AnnotatedString.Range(placeholder, 1, 2)),
-            width = Float.MAX_VALUE
-        )
+        val paragraph =
+            simpleParagraph(
+                text = text,
+                fontSize = fontSize.sp,
+                placeholders = listOf(AnnotatedString.Range(placeholder, 1, 2)),
+                width = Float.MAX_VALUE
+            )
         val placeholderRects = paragraph.placeholderRects
         assertThat(placeholderRects.size).isEqualTo(1)
 
@@ -111,8 +113,7 @@
 
         val bound = placeholderRects[0]!!
         assertThat(bound.bottom).isEqualTo(paragraph.getLineBottom(0))
-        assertThat(bound.top)
-            .isEqualTo(paragraph.getLineBottom(0) - height.value * fontSize)
+        assertThat(bound.top).isEqualTo(paragraph.getLineBottom(0) - height.value * fontSize)
         // There is one character to the left of this placeholder.
         assertThat(bound.left).isEqualTo(fontSize.toFloat())
         assertThat(bound.right).isEqualTo(fontSize + fontSize * width.value)
@@ -126,12 +127,13 @@
         val width = 1.em
         val placeholder = Placeholder(width, height, PlaceholderVerticalAlign.Bottom)
 
-        val paragraph = simpleParagraph(
-            text = text,
-            fontSize = fontSize.sp,
-            placeholders = listOf(AnnotatedString.Range(placeholder, 1, 2)),
-            width = Float.MAX_VALUE
-        )
+        val paragraph =
+            simpleParagraph(
+                text = text,
+                fontSize = fontSize.sp,
+                placeholders = listOf(AnnotatedString.Range(placeholder, 1, 2)),
+                width = Float.MAX_VALUE
+            )
         val placeholderRects = paragraph.placeholderRects
         assertThat(placeholderRects.size).isEqualTo(1)
 
@@ -139,8 +141,7 @@
 
         val bound = placeholderRects[0]!!
         assertThat(bound.bottom).isEqualTo(paragraph.getLineBottom(0))
-        assertThat(bound.top)
-            .isEqualTo(paragraph.getLineBottom(0) - height.value * fontSize)
+        assertThat(bound.top).isEqualTo(paragraph.getLineBottom(0) - height.value * fontSize)
         // There is one character to the left of this placeholder.
         assertThat(bound.left).isEqualTo(fontSize.toFloat())
         assertThat(bound.right).isEqualTo(fontSize + fontSize * width.value)
@@ -154,12 +155,13 @@
         val width = 1.em
         val placeholder = Placeholder(width, height, PlaceholderVerticalAlign.Top)
 
-        val paragraph = simpleParagraph(
-            text = text,
-            fontSize = fontSize.sp,
-            placeholders = listOf(AnnotatedString.Range(placeholder, 1, 2)),
-            width = Float.MAX_VALUE
-        )
+        val paragraph =
+            simpleParagraph(
+                text = text,
+                fontSize = fontSize.sp,
+                placeholders = listOf(AnnotatedString.Range(placeholder, 1, 2)),
+                width = Float.MAX_VALUE
+            )
         val placeholderRects = paragraph.placeholderRects
         assertThat(placeholderRects.size).isEqualTo(1)
 
@@ -168,8 +170,7 @@
         val bound = placeholderRects[0]!!
         // TODO(haoyuchang): use getLineTop instead
         assertThat(bound.top).isEqualTo(paragraph.getLineBottom(-1))
-        assertThat(bound.bottom)
-            .isEqualTo(paragraph.getLineBottom(-1) + height.value * fontSize)
+        assertThat(bound.bottom).isEqualTo(paragraph.getLineBottom(-1) + height.value * fontSize)
         // There is one character to the left of this placeholder.
         assertThat(bound.left).isEqualTo(fontSize.toFloat())
         assertThat(bound.right).isEqualTo(fontSize + fontSize * width.value)
@@ -183,12 +184,13 @@
         val width = 1.em
         val placeholder = Placeholder(width, height, PlaceholderVerticalAlign.Top)
 
-        val paragraph = simpleParagraph(
-            text = text,
-            fontSize = fontSize.sp,
-            placeholders = listOf(AnnotatedString.Range(placeholder, 1, 2)),
-            width = Float.MAX_VALUE
-        )
+        val paragraph =
+            simpleParagraph(
+                text = text,
+                fontSize = fontSize.sp,
+                placeholders = listOf(AnnotatedString.Range(placeholder, 1, 2)),
+                width = Float.MAX_VALUE
+            )
         val placeholderRects = paragraph.placeholderRects
         assertThat(placeholderRects.size).isEqualTo(1)
 
@@ -197,8 +199,7 @@
         val bound = placeholderRects[0]!!
         // TODO(haoyuchang): use getLineTop instead
         assertThat(bound.top).isEqualTo(paragraph.getLineBottom(-1))
-        assertThat(bound.bottom)
-            .isEqualTo(paragraph.getLineBottom(-1) + height.value * fontSize)
+        assertThat(bound.bottom).isEqualTo(paragraph.getLineBottom(-1) + height.value * fontSize)
         // There is one character to the left of this placeholder.
         assertThat(bound.left).isEqualTo(fontSize.toFloat())
         assertThat(bound.right).isEqualTo(fontSize + fontSize * width.value)
@@ -212,12 +213,13 @@
         val width = 1.em
         val placeholder = Placeholder(width, height, PlaceholderVerticalAlign.Center)
 
-        val paragraph = simpleParagraph(
-            text = text,
-            fontSize = fontSize.sp,
-            placeholders = listOf(AnnotatedString.Range(placeholder, 1, 2)),
-            width = Float.MAX_VALUE
-        )
+        val paragraph =
+            simpleParagraph(
+                text = text,
+                fontSize = fontSize.sp,
+                placeholders = listOf(AnnotatedString.Range(placeholder, 1, 2)),
+                width = Float.MAX_VALUE
+            )
         val placeholderRects = paragraph.placeholderRects
         assertThat(placeholderRects.size).isEqualTo(1)
 
@@ -243,12 +245,13 @@
         val width = 1.em
         val placeholder = Placeholder(width, height, PlaceholderVerticalAlign.Center)
 
-        val paragraph = simpleParagraph(
-            text = text,
-            fontSize = fontSize.sp,
-            placeholders = listOf(AnnotatedString.Range(placeholder, 1, 2)),
-            width = Float.MAX_VALUE
-        )
+        val paragraph =
+            simpleParagraph(
+                text = text,
+                fontSize = fontSize.sp,
+                placeholders = listOf(AnnotatedString.Range(placeholder, 1, 2)),
+                width = Float.MAX_VALUE
+            )
         val placeholderRects = paragraph.placeholderRects
         assertThat(placeholderRects.size).isEqualTo(1)
 
@@ -275,15 +278,15 @@
         val height = 0.5.em
         val width = 1.em
         val placeholder = Placeholder(width, height, PlaceholderVerticalAlign.TextTop)
-        val paragraph = simpleParagraph(
-            text = text,
-            spanStyles = listOf(
-                AnnotatedString.Range(SpanStyle(fontSize = fontSizeSpan.sp), 2, 3)
-            ),
-            placeholders = listOf(AnnotatedString.Range(placeholder, 1, 2)),
-            fontSize = fontSize.sp,
-            width = Float.MAX_VALUE
-        )
+        val paragraph =
+            simpleParagraph(
+                text = text,
+                spanStyles =
+                    listOf(AnnotatedString.Range(SpanStyle(fontSize = fontSizeSpan.sp), 2, 3)),
+                placeholders = listOf(AnnotatedString.Range(placeholder, 1, 2)),
+                fontSize = fontSize.sp,
+                width = Float.MAX_VALUE
+            )
         val placeholderRects = paragraph.placeholderRects
         assertThat(placeholderRects.size).isEqualTo(1)
 
@@ -307,15 +310,15 @@
         val height = 0.5.em
         val width = 1.em
         val placeholder = Placeholder(width, height, PlaceholderVerticalAlign.TextBottom)
-        val paragraph = simpleParagraph(
-            text = text,
-            spanStyles = listOf(
-                AnnotatedString.Range(SpanStyle(fontSize = fontSizeSpan.sp), 2, 3)
-            ),
-            placeholders = listOf(AnnotatedString.Range(placeholder, 1, 2)),
-            fontSize = fontSize.sp,
-            width = Float.MAX_VALUE
-        )
+        val paragraph =
+            simpleParagraph(
+                text = text,
+                spanStyles =
+                    listOf(AnnotatedString.Range(SpanStyle(fontSize = fontSizeSpan.sp), 2, 3)),
+                placeholders = listOf(AnnotatedString.Range(placeholder, 1, 2)),
+                fontSize = fontSize.sp,
+                width = Float.MAX_VALUE
+            )
         val placeholderRects = paragraph.placeholderRects
         assertThat(placeholderRects.size).isEqualTo(1)
 
@@ -339,15 +342,15 @@
         val height = 0.5.em
         val width = 1.em
         val placeholder = Placeholder(width, height, PlaceholderVerticalAlign.TextCenter)
-        val paragraph = simpleParagraph(
-            text = text,
-            spanStyles = listOf(
-                AnnotatedString.Range(SpanStyle(fontSize = fontSizeSpan.sp), 2, 3)
-            ),
-            placeholders = listOf(AnnotatedString.Range(placeholder, 1, 2)),
-            fontSize = fontSize.sp,
-            width = Float.MAX_VALUE
-        )
+        val paragraph =
+            simpleParagraph(
+                text = text,
+                spanStyles =
+                    listOf(AnnotatedString.Range(SpanStyle(fontSize = fontSizeSpan.sp), 2, 3)),
+                placeholders = listOf(AnnotatedString.Range(placeholder, 1, 2)),
+                fontSize = fontSize.sp,
+                width = Float.MAX_VALUE
+            )
         val placeholderRects = paragraph.placeholderRects
         assertThat(placeholderRects.size).isEqualTo(1)
 
@@ -372,12 +375,13 @@
         val height = 1.em
         val width = 1.em
         val placeholder = Placeholder(width, height, PlaceholderVerticalAlign.AboveBaseline)
-        val paragraph = simpleParagraph(
-            text = text,
-            placeholders = listOf(AnnotatedString.Range(placeholder, 1, 2)),
-            fontSize = fontSize.sp,
-            width = paragraphWidth
-        )
+        val paragraph =
+            simpleParagraph(
+                text = text,
+                placeholders = listOf(AnnotatedString.Range(placeholder, 1, 2)),
+                fontSize = fontSize.sp,
+                width = paragraphWidth
+            )
         val placeholderRects = paragraph.placeholderRects
         assertThat(placeholderRects.size).isEqualTo(1)
         assertThat(paragraph.lineCount).isEqualTo(1)
@@ -401,12 +405,13 @@
         val height = 1.em
         val width = 1.em
         val placeholder = Placeholder(width, height, PlaceholderVerticalAlign.AboveBaseline)
-        val paragraph = simpleParagraph(
-            text = text,
-            placeholders = listOf(AnnotatedString.Range(placeholder, 1, 2)),
-            fontSize = fontSize.sp,
-            width = paragraphWidth
-        )
+        val paragraph =
+            simpleParagraph(
+                text = text,
+                placeholders = listOf(AnnotatedString.Range(placeholder, 1, 2)),
+                fontSize = fontSize.sp,
+                width = paragraphWidth
+            )
         val placeholderRects = paragraph.placeholderRects
         assertThat(placeholderRects.size).isEqualTo(1)
         assertThat(paragraph.lineCount).isEqualTo(1)
@@ -430,12 +435,13 @@
         val height = 1.em
         val width = 1.em
         val placeholder = Placeholder(width, height, PlaceholderVerticalAlign.AboveBaseline)
-        val paragraph = simpleParagraph(
-            text = text,
-            placeholders = listOf(AnnotatedString.Range(placeholder, 2, 3)),
-            fontSize = fontSize.sp,
-            width = paragraphWidth
-        )
+        val paragraph =
+            simpleParagraph(
+                text = text,
+                placeholders = listOf(AnnotatedString.Range(placeholder, 2, 3)),
+                fontSize = fontSize.sp,
+                width = paragraphWidth
+            )
         val placeholderRects = paragraph.placeholderRects
         assertThat(placeholderRects.size).isEqualTo(1)
         assertThat(paragraph.lineCount).isEqualTo(1)
@@ -459,12 +465,13 @@
         val height = 1.em
         val width = 1.em
         val placeholder = Placeholder(width, height, PlaceholderVerticalAlign.AboveBaseline)
-        val paragraph = simpleParagraph(
-            text = text,
-            placeholders = listOf(AnnotatedString.Range(placeholder, 1, 3)),
-            fontSize = fontSize.sp,
-            width = paragraphWidth
-        )
+        val paragraph =
+            simpleParagraph(
+                text = text,
+                placeholders = listOf(AnnotatedString.Range(placeholder, 1, 3)),
+                fontSize = fontSize.sp,
+                width = paragraphWidth
+            )
         val placeholderRects = paragraph.placeholderRects
         assertThat(placeholderRects.size).isEqualTo(1)
         assertThat(paragraph.lineCount).isEqualTo(1)
@@ -485,18 +492,20 @@
         val fontSize = 20f
 
         val placeholder = Placeholder(1.em, 1.em, PlaceholderVerticalAlign.TextCenter)
-        val placeholders = listOf(
-            AnnotatedString.Range(placeholder, 0, 1),
-            AnnotatedString.Range(placeholder, 2, 3)
-        )
-        val paragraph = simpleParagraph(
-            text = text,
-            placeholders = placeholders,
-            fontSize = fontSize.sp,
-            width = 2 * fontSize,
-            maxLines = 1,
-            ellipsis = true
-        )
+        val placeholders =
+            listOf(
+                AnnotatedString.Range(placeholder, 0, 1),
+                AnnotatedString.Range(placeholder, 2, 3)
+            )
+        val paragraph =
+            simpleParagraph(
+                text = text,
+                placeholders = placeholders,
+                fontSize = fontSize.sp,
+                width = 2 * fontSize,
+                maxLines = 1,
+                ellipsis = true
+            )
         val placeholderRects = paragraph.placeholderRects
         assertThat(placeholderRects.size).isEqualTo(placeholders.size)
         assertThat(placeholderRects[0]).isNotNull()
@@ -510,18 +519,20 @@
         val fontSize = 20f
 
         val placeholder = Placeholder(1.em, 1.em, PlaceholderVerticalAlign.TextCenter)
-        val placeholders = listOf(
-            AnnotatedString.Range(placeholder, 0, 1),
-            AnnotatedString.Range(placeholder, 2, 3)
-        )
-        val paragraph = simpleParagraph(
-            text = text,
-            placeholders = placeholders,
-            fontSize = fontSize.sp,
-            width = 2 * fontSize,
-            height = 1.3f * fontSize,
-            ellipsis = true
-        )
+        val placeholders =
+            listOf(
+                AnnotatedString.Range(placeholder, 0, 1),
+                AnnotatedString.Range(placeholder, 2, 3)
+            )
+        val paragraph =
+            simpleParagraph(
+                text = text,
+                placeholders = placeholders,
+                fontSize = fontSize.sp,
+                width = 2 * fontSize,
+                height = 1.3f * fontSize,
+                ellipsis = true
+            )
         val placeholderRects = paragraph.placeholderRects
         assertThat(placeholderRects.size).isEqualTo(placeholders.size)
         assertThat(placeholderRects[0]).isNotNull()
@@ -535,19 +546,21 @@
         val fontSize = 20f
 
         val placeholder = Placeholder(1.em, 1.em, PlaceholderVerticalAlign.TextCenter)
-        val placeholders = listOf(
-            AnnotatedString.Range(placeholder, 0, 1),
-            AnnotatedString.Range(placeholder, 2, 3)
-        )
-        val paragraph = simpleParagraph(
-            text = text,
-            placeholders = placeholders,
-            fontSize = fontSize.sp,
-            width = 2 * fontSize,
-            height = fontSize,
-            maxLines = 1,
-            ellipsis = false
-        )
+        val placeholders =
+            listOf(
+                AnnotatedString.Range(placeholder, 0, 1),
+                AnnotatedString.Range(placeholder, 2, 3)
+            )
+        val paragraph =
+            simpleParagraph(
+                text = text,
+                placeholders = placeholders,
+                fontSize = fontSize.sp,
+                width = 2 * fontSize,
+                height = fontSize,
+                maxLines = 1,
+                ellipsis = false
+            )
         val placeholderRects = paragraph.placeholderRects
         assertThat(placeholderRects.size).isEqualTo(placeholders.size)
         assertThat(placeholderRects[0]).isNotNull()
@@ -567,10 +580,7 @@
     ): Paragraph {
         return Paragraph(
             text = text,
-            style = TextStyle(
-                fontSize = fontSize,
-                fontFamily = fontFamilyMeasureFont
-            ),
+            style = TextStyle(fontSize = fontSize, fontFamily = fontFamilyMeasureFont),
             spanStyles = spanStyles,
             placeholders = placeholders,
             maxLines = maxLines,
diff --git a/compose/ui/ui-text/src/androidInstrumentedTest/kotlin/androidx/compose/ui/text/PlatformParagraphStyleTest.kt b/compose/ui/ui-text/src/androidInstrumentedTest/kotlin/androidx/compose/ui/text/PlatformParagraphStyleTest.kt
index ed011c4..0199a0f 100644
--- a/compose/ui/ui-text/src/androidInstrumentedTest/kotlin/androidx/compose/ui/text/PlatformParagraphStyleTest.kt
+++ b/compose/ui/ui-text/src/androidInstrumentedTest/kotlin/androidx/compose/ui/text/PlatformParagraphStyleTest.kt
@@ -49,39 +49,36 @@
 
     @Test
     fun paragraphStyle_merge_with_null_platformStyle() {
-        val style = ParagraphStyle(
-            platformStyle = PlatformParagraphStyle(includeFontPadding = true)
-        )
+        val style =
+            ParagraphStyle(platformStyle = PlatformParagraphStyle(includeFontPadding = true))
 
         assertThat(style.merge(null).platformStyle).isEqualTo(style.platformStyle)
 
-        val otherStyle = ParagraphStyle(
-            platformStyle = PlatformParagraphStyle(includeFontPadding = false)
-        )
+        val otherStyle =
+            ParagraphStyle(platformStyle = PlatformParagraphStyle(includeFontPadding = false))
 
         assertThat(otherStyle.merge(null).platformStyle).isEqualTo(otherStyle.platformStyle)
     }
 
     @Test
     fun paragraphStyle_merge_platformStyles() {
-        val style = ParagraphStyle(
-            platformStyle = PlatformParagraphStyle(includeFontPadding = true)
-        )
+        val style =
+            ParagraphStyle(platformStyle = PlatformParagraphStyle(includeFontPadding = true))
 
-        val otherStyle = ParagraphStyle(
-            platformStyle = PlatformParagraphStyle(
-                emojiSupportMatch = EmojiSupportMatch.None,
-                includeFontPadding = false
+        val otherStyle =
+            ParagraphStyle(
+                platformStyle =
+                    PlatformParagraphStyle(
+                        emojiSupportMatch = EmojiSupportMatch.None,
+                        includeFontPadding = false
+                    )
             )
-        )
 
         val mergedStyle = style.merge(otherStyle)
 
         assertThat(mergedStyle.platformStyle).isNotNull()
 
-        assertThat(
-            mergedStyle.platformStyle?.includeFontPadding
-        ).isFalse()
+        assertThat(mergedStyle.platformStyle?.includeFontPadding).isFalse()
         assertThat(mergedStyle.platformStyle?.emojiSupportMatch).isEqualTo(EmojiSupportMatch.None)
 
         val mergedStyle2 = otherStyle.merge(style)
@@ -94,19 +91,23 @@
 
     @Test
     fun paragraphStyle_lerp_platformStyles_fraction_start() {
-        val style = ParagraphStyle(
-            platformStyle = PlatformParagraphStyle(
-                emojiSupportMatch = EmojiSupportMatch.None,
-                includeFontPadding = true
+        val style =
+            ParagraphStyle(
+                platformStyle =
+                    PlatformParagraphStyle(
+                        emojiSupportMatch = EmojiSupportMatch.None,
+                        includeFontPadding = true
+                    )
             )
-        )
 
-        val otherStyle = ParagraphStyle(
-            platformStyle = PlatformParagraphStyle(
-                emojiSupportMatch = EmojiSupportMatch.Default,
-                includeFontPadding = false
+        val otherStyle =
+            ParagraphStyle(
+                platformStyle =
+                    PlatformParagraphStyle(
+                        emojiSupportMatch = EmojiSupportMatch.Default,
+                        includeFontPadding = false
+                    )
             )
-        )
 
         val lerpedStyle = lerp(style, otherStyle, 0f)
 
@@ -117,48 +118,51 @@
 
     @Test
     fun paragraphStyle_lerp_platformStyles_fraction_end() {
-        val style = ParagraphStyle(
-            platformStyle = PlatformParagraphStyle(
-                emojiSupportMatch = EmojiSupportMatch.None,
-                includeFontPadding = true
+        val style =
+            ParagraphStyle(
+                platformStyle =
+                    PlatformParagraphStyle(
+                        emojiSupportMatch = EmojiSupportMatch.None,
+                        includeFontPadding = true
+                    )
             )
-        )
 
-        val otherStyle = ParagraphStyle(
-            platformStyle = PlatformParagraphStyle(
-                emojiSupportMatch = EmojiSupportMatch.Default,
-                includeFontPadding = false
+        val otherStyle =
+            ParagraphStyle(
+                platformStyle =
+                    PlatformParagraphStyle(
+                        emojiSupportMatch = EmojiSupportMatch.Default,
+                        includeFontPadding = false
+                    )
             )
-        )
         val lerpedStyle = lerp(style, otherStyle, 1f)
 
         assertThat(lerpedStyle.platformStyle).isNotNull()
         assertThat(lerpedStyle.platformStyle?.includeFontPadding).isFalse()
-        assertThat(lerpedStyle.platformStyle?.emojiSupportMatch).isEqualTo(
-            EmojiSupportMatch.Default
-        )
+        assertThat(lerpedStyle.platformStyle?.emojiSupportMatch)
+            .isEqualTo(EmojiSupportMatch.Default)
     }
 
     @Test
     fun paragraphStyle_lerp_with_null_returns_default() {
         val defaultParagraphStyle = PlatformParagraphStyle.Default
 
-        val style = ParagraphStyle(
-            platformStyle = PlatformParagraphStyle(
-                includeFontPadding = !defaultParagraphStyle.includeFontPadding
+        val style =
+            ParagraphStyle(
+                platformStyle =
+                    PlatformParagraphStyle(
+                        includeFontPadding = !defaultParagraphStyle.includeFontPadding
+                    )
             )
-        )
 
         val otherStyle = ParagraphStyle(platformStyle = null)
 
         val lerpedStyle = lerp(style, otherStyle, 1f)
 
         assertThat(lerpedStyle.platformStyle).isNotNull()
-        assertThat(lerpedStyle.platformStyle?.includeFontPadding).isEqualTo(
-            defaultParagraphStyle.includeFontPadding
-        )
-        assertThat(lerpedStyle.platformStyle?.emojiSupportMatch).isEqualTo(
-            EmojiSupportMatch.Default
-        )
+        assertThat(lerpedStyle.platformStyle?.includeFontPadding)
+            .isEqualTo(defaultParagraphStyle.includeFontPadding)
+        assertThat(lerpedStyle.platformStyle?.emojiSupportMatch)
+            .isEqualTo(EmojiSupportMatch.Default)
     }
 }
diff --git a/compose/ui/ui-text/src/androidInstrumentedTest/kotlin/androidx/compose/ui/text/PlatformSpanStyleTest.kt b/compose/ui/ui-text/src/androidInstrumentedTest/kotlin/androidx/compose/ui/text/PlatformSpanStyleTest.kt
index db6d77d..caf2d05 100644
--- a/compose/ui/ui-text/src/androidInstrumentedTest/kotlin/androidx/compose/ui/text/PlatformSpanStyleTest.kt
+++ b/compose/ui/ui-text/src/androidInstrumentedTest/kotlin/androidx/compose/ui/text/PlatformSpanStyleTest.kt
@@ -85,9 +85,8 @@
         val style = SpanStyle(platformStyle = null)
 
         val platformStyle = PlatformSpanStyle()
-        assertThat(
-            style.copy(platformStyle = platformStyle).platformStyle
-        ).isSameInstanceAs(platformStyle)
+        assertThat(style.copy(platformStyle = platformStyle).platformStyle)
+            .isSameInstanceAs(platformStyle)
     }
 
     @Test
diff --git a/compose/ui/ui-text/src/androidInstrumentedTest/kotlin/androidx/compose/ui/text/PlatformTextStyleTest.kt b/compose/ui/ui-text/src/androidInstrumentedTest/kotlin/androidx/compose/ui/text/PlatformTextStyleTest.kt
index a398665..3d5034b 100644
--- a/compose/ui/ui-text/src/androidInstrumentedTest/kotlin/androidx/compose/ui/text/PlatformTextStyleTest.kt
+++ b/compose/ui/ui-text/src/androidInstrumentedTest/kotlin/androidx/compose/ui/text/PlatformTextStyleTest.kt
@@ -27,34 +27,21 @@
     @Test
     fun toParagraphStyle_returnsNullPlatformStyle_ifNull() {
         val style = TextStyle(platformStyle = null)
-        assertThat(style.toParagraphStyle()).isEqualTo(
-            ParagraphStyle(platformStyle = null)
-        )
+        assertThat(style.toParagraphStyle()).isEqualTo(ParagraphStyle(platformStyle = null))
     }
 
     @Test
     fun toParagraphStyle_returnsCorrectPlatformTextConfig_if_nonNull() {
-        val style = TextStyle(
-            platformStyle = PlatformTextStyle(
-                includeFontPadding = true
+        val style = TextStyle(platformStyle = PlatformTextStyle(includeFontPadding = true))
+        assertThat(style.toParagraphStyle())
+            .isEqualTo(
+                ParagraphStyle(platformStyle = PlatformParagraphStyle(includeFontPadding = true))
             )
-        )
-        assertThat(style.toParagraphStyle()).isEqualTo(
-            ParagraphStyle(
-                platformStyle = PlatformParagraphStyle(
-                    includeFontPadding = true
-                )
-            )
-        )
     }
 
     @Test
     fun merge_platformStyle_null_on_nonNull() {
-        val style = TextStyle(
-            platformStyle = PlatformTextStyle(
-                includeFontPadding = true
-            )
-        )
+        val style = TextStyle(platformStyle = PlatformTextStyle(includeFontPadding = true))
         val otherStyle = TextStyle(platformStyle = null)
 
         val mergedStyle = style.merge(otherStyle)
@@ -65,11 +52,7 @@
     @Test
     fun merge_platformStyle_nonNull_on_null() {
         val style = TextStyle(platformStyle = null)
-        val otherStyle = TextStyle(
-            platformStyle = PlatformTextStyle(
-                includeFontPadding = true
-            )
-        )
+        val otherStyle = TextStyle(platformStyle = PlatformTextStyle(includeFontPadding = true))
 
         val mergedStyle = style.merge(otherStyle)
 
@@ -78,16 +61,8 @@
 
     @Test
     fun merge_platformStyle_false_on_true() {
-        val style = TextStyle(
-            platformStyle = PlatformTextStyle(
-                includeFontPadding = true
-            )
-        )
-        val otherStyle = TextStyle(
-            platformStyle = PlatformTextStyle(
-                includeFontPadding = false
-            )
-        )
+        val style = TextStyle(platformStyle = PlatformTextStyle(includeFontPadding = true))
+        val otherStyle = TextStyle(platformStyle = PlatformTextStyle(includeFontPadding = false))
 
         val mergedStyle = style.merge(otherStyle)
 
@@ -96,36 +71,23 @@
 
     @Test
     fun merge_platformStyle_handlesEmoji() {
-        val style = TextStyle(
-            platformStyle = PlatformTextStyle(
-                emojiSupportMatch = EmojiSupportMatch.None
+        val style =
+            TextStyle(platformStyle = PlatformTextStyle(emojiSupportMatch = EmojiSupportMatch.None))
+        val otherStyle =
+            TextStyle(
+                platformStyle = PlatformTextStyle(emojiSupportMatch = EmojiSupportMatch.Default)
             )
-        )
-        val otherStyle = TextStyle(
-            platformStyle = PlatformTextStyle(
-                emojiSupportMatch = EmojiSupportMatch.Default
-            )
-        )
 
         val mergedStyle = style.merge(otherStyle)
 
-        assertThat(mergedStyle.platformStyle?.paragraphStyle?.emojiSupportMatch).isEqualTo(
-            EmojiSupportMatch.Default
-        )
+        assertThat(mergedStyle.platformStyle?.paragraphStyle?.emojiSupportMatch)
+            .isEqualTo(EmojiSupportMatch.Default)
     }
 
     @Test
     fun merge_platformStyle_true_on_false_on() {
-        val style = TextStyle(
-            platformStyle = PlatformTextStyle(
-                includeFontPadding = false
-            )
-        )
-        val otherStyle = TextStyle(
-            platformStyle = PlatformTextStyle(
-                includeFontPadding = true
-            )
-        )
+        val style = TextStyle(platformStyle = PlatformTextStyle(includeFontPadding = false))
+        val otherStyle = TextStyle(platformStyle = PlatformTextStyle(includeFontPadding = true))
 
         val mergedStyle = style.merge(otherStyle)
 
diff --git a/compose/ui/ui-text/src/androidInstrumentedTest/kotlin/androidx/compose/ui/text/StringTest.kt b/compose/ui/ui-text/src/androidInstrumentedTest/kotlin/androidx/compose/ui/text/StringTest.kt
index 87f155b..8f0ae13 100644
--- a/compose/ui/ui-text/src/androidInstrumentedTest/kotlin/androidx/compose/ui/text/StringTest.kt
+++ b/compose/ui/ui-text/src/androidInstrumentedTest/kotlin/androidx/compose/ui/text/StringTest.kt
@@ -30,39 +30,33 @@
 
     @Test
     fun English_uppercase() {
-        assertThat("aBcDe".toUpperCase(LocaleList("en-US")))
-            .isEqualTo("ABCDE")
+        assertThat("aBcDe".toUpperCase(LocaleList("en-US"))).isEqualTo("ABCDE")
     }
 
     @Test
     fun English_lowercase() {
-        assertThat("aBcDe".toLowerCase(LocaleList("en-US")))
-            .isEqualTo("abcde")
+        assertThat("aBcDe".toLowerCase(LocaleList("en-US"))).isEqualTo("abcde")
     }
 
     @Test
     fun English_capitalize() {
-        assertThat("abcde".capitalize(LocaleList("en-US")))
-            .isEqualTo("Abcde")
+        assertThat("abcde".capitalize(LocaleList("en-US"))).isEqualTo("Abcde")
     }
 
     @Test
     fun English_decapitalize() {
-        assertThat("Abcde".decapitalize(LocaleList("en-US")))
-            .isEqualTo("abcde")
+        assertThat("Abcde".decapitalize(LocaleList("en-US"))).isEqualTo("abcde")
     }
 
     @Test
     fun LocaleDependent_uppercase() {
         val upperI = "i".uppercase(Locale.forLanguageTag("tr"))
-        assertThat("hijkl".toUpperCase(LocaleList("tr")))
-            .isEqualTo("H${upperI}JKL")
+        assertThat("hijkl".toUpperCase(LocaleList("tr"))).isEqualTo("H${upperI}JKL")
     }
 
     @Test
     fun LocaleDependent_lowercase() {
         val upperI = "i".uppercase(Locale.forLanguageTag("tr"))
-        assertThat("h${upperI}jkl".toLowerCase(LocaleList("tr")))
-            .isEqualTo("hijkl")
+        assertThat("h${upperI}jkl".toLowerCase(LocaleList("tr"))).isEqualTo("hijkl")
     }
 }
diff --git a/compose/ui/ui-text/src/androidInstrumentedTest/kotlin/androidx/compose/ui/text/TextLayoutCacheTest.kt b/compose/ui/ui-text/src/androidInstrumentedTest/kotlin/androidx/compose/ui/text/TextLayoutCacheTest.kt
index bbd9b52..ea391f4 100644
--- a/compose/ui/ui-text/src/androidInstrumentedTest/kotlin/androidx/compose/ui/text/TextLayoutCacheTest.kt
+++ b/compose/ui/ui-text/src/androidInstrumentedTest/kotlin/androidx/compose/ui/text/TextLayoutCacheTest.kt
@@ -56,10 +56,8 @@
     @Test
     fun exactInput_shouldReturnTheSameResult() {
         val textLayoutCache = TextLayoutCache(16)
-        val textLayoutInput = textLayoutInput(
-            text = AnnotatedString("Hello"),
-            style = TextStyle(color = Color.Red)
-        )
+        val textLayoutInput =
+            textLayoutInput(text = AnnotatedString("Hello"), style = TextStyle(color = Color.Red))
 
         val textLayoutResult = layoutText(textLayoutInput)
         textLayoutCache.put(textLayoutInput, textLayoutResult)
@@ -70,15 +68,11 @@
     @Test
     fun colorChange_shouldReturnFromCache() {
         val textLayoutCache = TextLayoutCache(16)
-        val firstInput = textLayoutInput(
-            text = AnnotatedString("Hello"),
-            style = TextStyle(color = Color.Red)
-        )
+        val firstInput =
+            textLayoutInput(text = AnnotatedString("Hello"), style = TextStyle(color = Color.Red))
 
-        val secondInput = textLayoutInput(
-            text = AnnotatedString("Hello"),
-            style = TextStyle(color = Color.Blue)
-        )
+        val secondInput =
+            textLayoutInput(text = AnnotatedString("Hello"), style = TextStyle(color = Color.Blue))
 
         val textLayoutResult = layoutText(firstInput)
         textLayoutCache.put(firstInput, textLayoutResult)
@@ -89,15 +83,14 @@
     @Test
     fun brushChange_shouldReturnFromCache() {
         val textLayoutCache = TextLayoutCache(16)
-        val firstInput = textLayoutInput(
-            text = AnnotatedString("Hello"),
-            style = TextStyle(color = Color.Red)
-        )
+        val firstInput =
+            textLayoutInput(text = AnnotatedString("Hello"), style = TextStyle(color = Color.Red))
 
-        val secondInput = textLayoutInput(
-            text = AnnotatedString("Hello"),
-            style = TextStyle(brush = Brush.linearGradient(listOf(Color.Blue, Color.Red)))
-        )
+        val secondInput =
+            textLayoutInput(
+                text = AnnotatedString("Hello"),
+                style = TextStyle(brush = Brush.linearGradient(listOf(Color.Blue, Color.Red)))
+            )
 
         val textLayoutResult = layoutText(firstInput)
         textLayoutCache.put(firstInput, textLayoutResult)
@@ -108,15 +101,17 @@
     @Test
     fun shadowChange_shouldReturnFromCache() {
         val textLayoutCache = TextLayoutCache(16)
-        val firstInput = textLayoutInput(
-            text = AnnotatedString("Hello"),
-            style = TextStyle(shadow = Shadow(color = Color.Red))
-        )
+        val firstInput =
+            textLayoutInput(
+                text = AnnotatedString("Hello"),
+                style = TextStyle(shadow = Shadow(color = Color.Red))
+            )
 
-        val secondInput = textLayoutInput(
-            text = AnnotatedString("Hello"),
-            style = TextStyle(shadow = Shadow(color = Color.Blue))
-        )
+        val secondInput =
+            textLayoutInput(
+                text = AnnotatedString("Hello"),
+                style = TextStyle(shadow = Shadow(color = Color.Blue))
+            )
 
         val textLayoutResult = layoutText(firstInput)
         textLayoutCache.put(firstInput, textLayoutResult)
@@ -127,15 +122,17 @@
     @Test
     fun textDecorationChange_shouldReturnFromCache() {
         val textLayoutCache = TextLayoutCache(16)
-        val firstInput = textLayoutInput(
-            text = AnnotatedString("Hello"),
-            style = TextStyle(textDecoration = TextDecoration.LineThrough)
-        )
+        val firstInput =
+            textLayoutInput(
+                text = AnnotatedString("Hello"),
+                style = TextStyle(textDecoration = TextDecoration.LineThrough)
+            )
 
-        val secondInput = textLayoutInput(
-            text = AnnotatedString("Hello"),
-            style = TextStyle(textDecoration = TextDecoration.Underline)
-        )
+        val secondInput =
+            textLayoutInput(
+                text = AnnotatedString("Hello"),
+                style = TextStyle(textDecoration = TextDecoration.Underline)
+            )
 
         val textLayoutResult = layoutText(firstInput)
         textLayoutCache.put(firstInput, textLayoutResult)
@@ -146,17 +143,19 @@
     @Test
     fun constraintsMinChanges_shouldReturnFromCache() {
         val textLayoutCache = TextLayoutCache(16)
-        val firstInput = textLayoutInput(
-            text = AnnotatedString("Hello"),
-            style = TextStyle(color = Color.Red),
-            constraints = Constraints(minWidth = 20, maxWidth = 200)
-        )
+        val firstInput =
+            textLayoutInput(
+                text = AnnotatedString("Hello"),
+                style = TextStyle(color = Color.Red),
+                constraints = Constraints(minWidth = 20, maxWidth = 200)
+            )
 
-        val secondInput = textLayoutInput(
-            text = AnnotatedString("Hello"),
-            style = TextStyle(color = Color.Red),
-            constraints = Constraints(minWidth = 60, maxWidth = 200)
-        )
+        val secondInput =
+            textLayoutInput(
+                text = AnnotatedString("Hello"),
+                style = TextStyle(color = Color.Red),
+                constraints = Constraints(minWidth = 60, maxWidth = 200)
+            )
 
         val textLayoutResult = layoutText(firstInput)
         textLayoutCache.put(firstInput, textLayoutResult)
@@ -180,15 +179,17 @@
     @Test
     fun fontSizeChange_shouldReturnNull() {
         val textLayoutCache = TextLayoutCache(16)
-        val firstInput = textLayoutInput(
-            text = AnnotatedString("Hello"),
-            style = TextStyle(color = Color.Red, fontSize = 14.sp)
-        )
+        val firstInput =
+            textLayoutInput(
+                text = AnnotatedString("Hello"),
+                style = TextStyle(color = Color.Red, fontSize = 14.sp)
+            )
 
-        val secondInput = textLayoutInput(
-            text = AnnotatedString("Hello"),
-            style = TextStyle(color = Color.Red, fontSize = 18.sp)
-        )
+        val secondInput =
+            textLayoutInput(
+                text = AnnotatedString("Hello"),
+                style = TextStyle(color = Color.Red, fontSize = 18.sp)
+            )
 
         val textLayoutResult = layoutText(firstInput)
         textLayoutCache.put(firstInput, textLayoutResult)
@@ -199,14 +200,9 @@
     @Test
     fun densityChange_shouldReturnNull() {
         val textLayoutCache = TextLayoutCache(16)
-        val firstInput = textLayoutInput(
-            text = AnnotatedString("Hello")
-        )
+        val firstInput = textLayoutInput(text = AnnotatedString("Hello"))
 
-        val secondInput = textLayoutInput(
-            text = AnnotatedString("Hello"),
-            density = Density(2f)
-        )
+        val secondInput = textLayoutInput(text = AnnotatedString("Hello"), density = Density(2f))
 
         val textLayoutResult = layoutText(firstInput)
         textLayoutCache.put(firstInput, textLayoutResult)
@@ -217,15 +213,11 @@
     @Test
     fun layoutDirectionChange_shouldReturnNull() {
         val textLayoutCache = TextLayoutCache(16)
-        val firstInput = textLayoutInput(
-            text = AnnotatedString("Hello"),
-            layoutDirection = LayoutDirection.Ltr
-        )
+        val firstInput =
+            textLayoutInput(text = AnnotatedString("Hello"), layoutDirection = LayoutDirection.Ltr)
 
-        val secondInput = textLayoutInput(
-            text = AnnotatedString("Hello"),
-            layoutDirection = LayoutDirection.Rtl
-        )
+        val secondInput =
+            textLayoutInput(text = AnnotatedString("Hello"), layoutDirection = LayoutDirection.Rtl)
 
         val textLayoutResult = layoutText(firstInput)
         textLayoutCache.put(firstInput, textLayoutResult)
@@ -236,17 +228,19 @@
     @Test
     fun constraintsMaxChanges_shouldReturnNull() {
         val textLayoutCache = TextLayoutCache(16)
-        val firstInput = textLayoutInput(
-            text = AnnotatedString("Hello"),
-            style = TextStyle(color = Color.Red),
-            constraints = Constraints(minWidth = 20, maxWidth = 200)
-        )
+        val firstInput =
+            textLayoutInput(
+                text = AnnotatedString("Hello"),
+                style = TextStyle(color = Color.Red),
+                constraints = Constraints(minWidth = 20, maxWidth = 200)
+            )
 
-        val secondInput = textLayoutInput(
-            text = AnnotatedString("Hello"),
-            style = TextStyle(color = Color.Red),
-            constraints = Constraints(minWidth = 20, maxWidth = 250)
-        )
+        val secondInput =
+            textLayoutInput(
+                text = AnnotatedString("Hello"),
+                style = TextStyle(color = Color.Red),
+                constraints = Constraints(minWidth = 20, maxWidth = 250)
+            )
 
         val textLayoutResult = layoutText(firstInput)
         textLayoutCache.put(firstInput, textLayoutResult)
@@ -301,21 +295,17 @@
         )
     }
 
-    private fun layoutText(textLayoutInput: TextLayoutInput) = with(textLayoutInput) {
-        val measurer = TextMeasurer(
-            fontFamilyResolver,
-            density,
-            layoutDirection,
-            0
-        )
-        measurer.measure(
-            text = text,
-            style = style,
-            overflow = overflow,
-            softWrap = softWrap,
-            maxLines = maxLines,
-            placeholders = placeholders,
-            constraints = constraints
-        )
-    }
+    private fun layoutText(textLayoutInput: TextLayoutInput) =
+        with(textLayoutInput) {
+            val measurer = TextMeasurer(fontFamilyResolver, density, layoutDirection, 0)
+            measurer.measure(
+                text = text,
+                style = style,
+                overflow = overflow,
+                softWrap = softWrap,
+                maxLines = maxLines,
+                placeholders = placeholders,
+                constraints = constraints
+            )
+        }
 }
diff --git a/compose/ui/ui-text/src/androidInstrumentedTest/kotlin/androidx/compose/ui/text/TextMeasurerTest.kt b/compose/ui/ui-text/src/androidInstrumentedTest/kotlin/androidx/compose/ui/text/TextMeasurerTest.kt
index 404da84..aa33218 100644
--- a/compose/ui/ui-text/src/androidInstrumentedTest/kotlin/androidx/compose/ui/text/TextMeasurerTest.kt
+++ b/compose/ui/ui-text/src/androidInstrumentedTest/kotlin/androidx/compose/ui/text/TextMeasurerTest.kt
@@ -46,12 +46,13 @@
     private val defaultDensity = Density(density = 1f)
     private val layoutDirection = LayoutDirection.Ltr
 
-    private val longText = AnnotatedString(
-        "Lorem ipsum dolor sit amet, consectetur " +
-            "adipiscing elit. Curabitur augue leo, finibus vitae felis ac, pretium condimentum " +
-            "augue. Nullam non libero sed lectus aliquet venenatis non at purus. Fusce id arcu " +
-            "eu mauris pulvinar laoreet."
-    )
+    private val longText =
+        AnnotatedString(
+            "Lorem ipsum dolor sit amet, consectetur " +
+                "adipiscing elit. Curabitur augue leo, finibus vitae felis ac, pretium condimentum " +
+                "augue. Nullam non libero sed lectus aliquet venenatis non at purus. Fusce id arcu " +
+                "eu mauris pulvinar laoreet."
+        )
 
     private val multiLineText = AnnotatedString("Lorem\nipsum\ndolor\nsit\namet")
 
@@ -67,41 +68,44 @@
 
     @Test
     fun width_shouldMatter_ifSoftwrapIsEnabled() {
-        val textLayoutResult = layoutText(
-            textLayoutInput(
-                text = longText,
-                softWrap = true,
-                constraints = Constraints(maxWidth = 200)
+        val textLayoutResult =
+            layoutText(
+                textLayoutInput(
+                    text = longText,
+                    softWrap = true,
+                    constraints = Constraints(maxWidth = 200)
+                )
             )
-        )
 
         assertThat(textLayoutResult.multiParagraph.width).isEqualTo(200)
     }
 
     @Test
     fun width_shouldMatter_ifSoftwrapIsDisabled_butOverflowIsEllipsis() {
-        val textLayoutResult = layoutText(
-            textLayoutInput(
-                text = longText,
-                softWrap = false,
-                overflow = TextOverflow.Ellipsis,
-                constraints = Constraints(maxWidth = 200)
+        val textLayoutResult =
+            layoutText(
+                textLayoutInput(
+                    text = longText,
+                    softWrap = false,
+                    overflow = TextOverflow.Ellipsis,
+                    constraints = Constraints(maxWidth = 200)
+                )
             )
-        )
 
         assertThat(textLayoutResult.multiParagraph.width).isEqualTo(200)
     }
 
     @Test
     fun width_shouldBeMaxIntrinsicWidth_ifSoftwrapIsDisabled_andOverflowIsClip() {
-        val textLayoutResult = layoutText(
-            textLayoutInput(
-                text = longText,
-                softWrap = false,
-                overflow = TextOverflow.Clip,
-                constraints = Constraints(maxWidth = 200)
+        val textLayoutResult =
+            layoutText(
+                textLayoutInput(
+                    text = longText,
+                    softWrap = false,
+                    overflow = TextOverflow.Clip,
+                    constraints = Constraints(maxWidth = 200)
+                )
             )
-        )
 
         val intrinsics = multiParagraphIntrinsics(text = longText)
 
@@ -110,14 +114,15 @@
 
     @Test
     fun width_shouldBeMaxIntrinsicWidth_ifSoftwrapIsDisabled_andOverflowIsVisible() {
-        val textLayoutResult = layoutText(
-            textLayoutInput(
-                text = longText,
-                softWrap = false,
-                overflow = TextOverflow.Clip,
-                constraints = Constraints(maxWidth = 200)
+        val textLayoutResult =
+            layoutText(
+                textLayoutInput(
+                    text = longText,
+                    softWrap = false,
+                    overflow = TextOverflow.Clip,
+                    constraints = Constraints(maxWidth = 200)
+                )
             )
-        )
 
         val intrinsics = multiParagraphIntrinsics(text = longText)
 
@@ -126,40 +131,43 @@
 
     @Test
     fun overwriteMaxLines_ifSoftwrapIsDisabled_andTextOverflowIsEllipsis() {
-        val textLayoutResult = layoutText(
-            textLayoutInput(
-                text = multiLineText,
-                softWrap = false,
-                overflow = TextOverflow.Ellipsis
+        val textLayoutResult =
+            layoutText(
+                textLayoutInput(
+                    text = multiLineText,
+                    softWrap = false,
+                    overflow = TextOverflow.Ellipsis
+                )
             )
-        )
 
         assertThat(textLayoutResult.multiParagraph.lineCount).isEqualTo(1)
     }
 
     @Test
     fun dontOverwriteMaxLines_ifSoftwrapIsEnabled() {
-        val textLayoutResult = layoutText(
-            textLayoutInput(
-                text = multiLineText,
-                softWrap = true,
-                overflow = TextOverflow.Ellipsis
+        val textLayoutResult =
+            layoutText(
+                textLayoutInput(
+                    text = multiLineText,
+                    softWrap = true,
+                    overflow = TextOverflow.Ellipsis
+                )
             )
-        )
 
         assertThat(textLayoutResult.multiParagraph.lineCount).isEqualTo(5)
     }
 
     @Test
     fun disabledSoftwrap_andOverflowClip_shouldConstrainLayoutSize() {
-        val textLayoutResult = layoutText(
-            textLayoutInput(
-                text = longText,
-                softWrap = false,
-                overflow = TextOverflow.Clip,
-                constraints = Constraints(maxWidth = 200)
+        val textLayoutResult =
+            layoutText(
+                textLayoutInput(
+                    text = longText,
+                    softWrap = false,
+                    overflow = TextOverflow.Clip,
+                    constraints = Constraints(maxWidth = 200)
+                )
             )
-        )
 
         assertThat(textLayoutResult.multiParagraph.width).isNotEqualTo(200f)
         assertThat(textLayoutResult.size.width).isEqualTo(200)
@@ -167,14 +175,15 @@
 
     @Test
     fun disabledSoftwrap_andOverflowVisible_shouldConstrainLayoutSize() {
-        val textLayoutResult = layoutText(
-            textLayoutInput(
-                text = longText,
-                softWrap = false,
-                overflow = TextOverflow.Clip,
-                constraints = Constraints(maxWidth = 200)
+        val textLayoutResult =
+            layoutText(
+                textLayoutInput(
+                    text = longText,
+                    softWrap = false,
+                    overflow = TextOverflow.Clip,
+                    constraints = Constraints(maxWidth = 200)
+                )
             )
-        )
 
         assertThat(textLayoutResult.multiParagraph.width).isNotEqualTo(200f)
         assertThat(textLayoutResult.size.width).isEqualTo(200)
@@ -182,14 +191,15 @@
 
     @Test
     fun textLayout_cannotBeSmallerThan_minWidth() {
-        val textLayoutResult = layoutText(
-            textLayoutInput(
-                text = AnnotatedString("A"),
-                softWrap = false,
-                overflow = TextOverflow.Clip,
-                constraints = Constraints.fixedWidth(400)
+        val textLayoutResult =
+            layoutText(
+                textLayoutInput(
+                    text = AnnotatedString("A"),
+                    softWrap = false,
+                    overflow = TextOverflow.Clip,
+                    constraints = Constraints.fixedWidth(400)
+                )
             )
-        )
 
         assertThat(textLayoutResult.size.width).isEqualTo(400)
     }
@@ -197,29 +207,31 @@
     @Test
     fun textLayout_canBeSmallerThan_maxWidth() {
         val fontSize = 10
-        val textLayoutResult = layoutText(
-            textLayoutInput(
-                text = AnnotatedString("A"),
-                style = TextStyle(fontSize = fontSize.sp),
-                softWrap = false,
-                overflow = TextOverflow.Clip,
-                constraints = Constraints(maxWidth = 400)
+        val textLayoutResult =
+            layoutText(
+                textLayoutInput(
+                    text = AnnotatedString("A"),
+                    style = TextStyle(fontSize = fontSize.sp),
+                    softWrap = false,
+                    overflow = TextOverflow.Clip,
+                    constraints = Constraints(maxWidth = 400)
+                )
             )
-        )
 
         assertThat(textLayoutResult.size.width).isEqualTo(fontSize)
     }
 
     @Test
     fun textLayout_cannotBeSmallerThan_minHeight() {
-        val textLayoutResult = layoutText(
-            textLayoutInput(
-                text = AnnotatedString("A"),
-                softWrap = false,
-                overflow = TextOverflow.Clip,
-                constraints = Constraints.fixedHeight(400)
+        val textLayoutResult =
+            layoutText(
+                textLayoutInput(
+                    text = AnnotatedString("A"),
+                    softWrap = false,
+                    overflow = TextOverflow.Clip,
+                    constraints = Constraints.fixedHeight(400)
+                )
             )
-        )
 
         assertThat(textLayoutResult.size.height).isEqualTo(400)
     }
@@ -227,30 +239,32 @@
     @Test
     fun textLayout_canBeSmallerThan_maxHeight() {
         val fontSize = 10.sp
-        val textLayoutResult = layoutText(
-            textLayoutInput(
-                text = AnnotatedString("A"),
-                style = TextStyle(fontSize = fontSize),
-                softWrap = false,
-                overflow = TextOverflow.Clip,
-                constraints = Constraints(maxHeight = 400)
+        val textLayoutResult =
+            layoutText(
+                textLayoutInput(
+                    text = AnnotatedString("A"),
+                    style = TextStyle(fontSize = fontSize),
+                    softWrap = false,
+                    overflow = TextOverflow.Clip,
+                    constraints = Constraints(maxHeight = 400)
+                )
             )
-        )
 
         assertThat(textLayoutResult.size.height).isEqualTo(10)
     }
 
     @Test
     fun layoutDirection_shouldDictate_textDirection() {
-        val textLayoutResult1 = layoutText(textLayoutInput(
-            text = multiLineText,
-            layoutDirection = LayoutDirection.Rtl
-        ))
+        val textLayoutResult1 =
+            layoutText(textLayoutInput(text = multiLineText, layoutDirection = LayoutDirection.Rtl))
 
-        val textLayoutResult2 = layoutText(textLayoutInput(
-            text = multiLineText,
-            style = TextStyle(textDirection = TextDirection.Rtl)
-        ))
+        val textLayoutResult2 =
+            layoutText(
+                textLayoutInput(
+                    text = multiLineText,
+                    style = TextStyle(textDirection = TextDirection.Rtl)
+                )
+            )
 
         assertThat(textLayoutResult1.multiParagraph.bitmap())
             .isEqualToBitmap(textLayoutResult2.multiParagraph.bitmap())
@@ -259,19 +273,17 @@
     @Test
     fun colorShouldChangeInResult_whenCacheIsActive() {
         val textMeasurer = textMeasurer(cacheSize = 8)
-        val firstTextLayout = layoutText(
-            textLayoutInput(
-                text = longText,
-                style = TextStyle(color = Color.Red)
-            ), textMeasurer
-        )
+        val firstTextLayout =
+            layoutText(
+                textLayoutInput(text = longText, style = TextStyle(color = Color.Red)),
+                textMeasurer
+            )
 
-        val secondTextLayout = layoutText(
-            textLayoutInput(
-                text = longText,
-                style = TextStyle(color = Color.Blue)
-            ), textMeasurer
-        )
+        val secondTextLayout =
+            layoutText(
+                textLayoutInput(text = longText, style = TextStyle(color = Color.Blue)),
+                textMeasurer
+            )
 
         assertThat(firstTextLayout.multiParagraph).isSameInstanceAs(secondTextLayout.multiParagraph)
         assertThat(firstTextLayout.layoutInput.style.color).isEqualTo(Color.Red)
@@ -281,19 +293,24 @@
     @Test
     fun brushShouldChangeInResult_whenCacheIsActive() {
         val textMeasurer = textMeasurer(cacheSize = 8)
-        val firstTextLayout = layoutText(
-            textLayoutInput(
-                text = longText,
-                style = TextStyle(brush = Brush.linearGradient(listOf(Color.Red, Color.Blue)))
-            ), textMeasurer
-        )
+        val firstTextLayout =
+            layoutText(
+                textLayoutInput(
+                    text = longText,
+                    style = TextStyle(brush = Brush.linearGradient(listOf(Color.Red, Color.Blue)))
+                ),
+                textMeasurer
+            )
 
-        val secondTextLayout = layoutText(
-            textLayoutInput(
-                text = longText,
-                style = TextStyle(brush = Brush.linearGradient(listOf(Color.Green, Color.Yellow)))
-            ), textMeasurer
-        )
+        val secondTextLayout =
+            layoutText(
+                textLayoutInput(
+                    text = longText,
+                    style =
+                        TextStyle(brush = Brush.linearGradient(listOf(Color.Green, Color.Yellow)))
+                ),
+                textMeasurer
+            )
 
         assertThat(firstTextLayout.multiParagraph).isSameInstanceAs(secondTextLayout.multiParagraph)
         assertThat(firstTextLayout.layoutInput.style.brush)
@@ -305,19 +322,17 @@
     @Test
     fun shadowShouldChangeInResult_whenCacheIsActive() {
         val textMeasurer = textMeasurer(cacheSize = 8)
-        val firstTextLayout = layoutText(
-            textLayoutInput(
-                text = longText,
-                style = TextStyle(shadow = Shadow(Color.Red))
-            ), textMeasurer
-        )
+        val firstTextLayout =
+            layoutText(
+                textLayoutInput(text = longText, style = TextStyle(shadow = Shadow(Color.Red))),
+                textMeasurer
+            )
 
-        val secondTextLayout = layoutText(
-            textLayoutInput(
-                text = longText,
-                style = TextStyle(shadow = Shadow(Color.Blue))
-            ), textMeasurer
-        )
+        val secondTextLayout =
+            layoutText(
+                textLayoutInput(text = longText, style = TextStyle(shadow = Shadow(Color.Blue))),
+                textMeasurer
+            )
 
         assertThat(firstTextLayout.multiParagraph).isSameInstanceAs(secondTextLayout.multiParagraph)
         assertThat(firstTextLayout.layoutInput.style.shadow).isEqualTo(Shadow(Color.Red))
@@ -327,19 +342,23 @@
     @Test
     fun textDecorationShouldChangeInResult_whenCacheIsActive() {
         val textMeasurer = textMeasurer(cacheSize = 8)
-        val firstTextLayout = layoutText(
-            textLayoutInput(
-                text = longText,
-                style = TextStyle(textDecoration = TextDecoration.Underline)
-            ), textMeasurer
-        )
+        val firstTextLayout =
+            layoutText(
+                textLayoutInput(
+                    text = longText,
+                    style = TextStyle(textDecoration = TextDecoration.Underline)
+                ),
+                textMeasurer
+            )
 
-        val secondTextLayout = layoutText(
-            textLayoutInput(
-                text = longText,
-                style = TextStyle(textDecoration = TextDecoration.LineThrough)
-            ), textMeasurer
-        )
+        val secondTextLayout =
+            layoutText(
+                textLayoutInput(
+                    text = longText,
+                    style = TextStyle(textDecoration = TextDecoration.LineThrough)
+                ),
+                textMeasurer
+            )
 
         assertThat(firstTextLayout.multiParagraph).isSameInstanceAs(secondTextLayout.multiParagraph)
         assertThat(firstTextLayout.layoutInput.style.textDecoration)
@@ -384,10 +403,11 @@
     ): MultiParagraphIntrinsics {
         return MultiParagraphIntrinsics(
             annotatedString = text,
-            style = resolveDefaults(
-                style.merge(TextStyle(fontFamily = fontFamilyMeasureFont)),
-                layoutDirection
-            ),
+            style =
+                resolveDefaults(
+                    style.merge(TextStyle(fontFamily = fontFamilyMeasureFont)),
+                    layoutDirection
+                ),
             placeholders = placeholders,
             density = density,
             fontFamilyResolver = fontFamilyResolver
@@ -399,30 +419,26 @@
         density: Density = this.defaultDensity,
         layoutDirection: LayoutDirection = this.layoutDirection,
         cacheSize: Int = 0
-    ): TextMeasurer = TextMeasurer(
-        fontFamilyResolver,
-        density,
-        layoutDirection,
-        cacheSize
-    )
+    ): TextMeasurer = TextMeasurer(fontFamilyResolver, density, layoutDirection, cacheSize)
 
     private fun layoutText(
         textLayoutInput: TextLayoutInput,
         textMeasurer: TextMeasurer? = null,
         skipCache: Boolean = false
-    ) = with(textLayoutInput) {
-        (textMeasurer ?: textMeasurer()).measure(
-            text = text,
-            style = style,
-            overflow = overflow,
-            softWrap = softWrap,
-            maxLines = maxLines,
-            placeholders = placeholders,
-            constraints = constraints,
-            layoutDirection = layoutDirection,
-            density = density,
-            fontFamilyResolver = fontFamilyResolver,
-            skipCache = skipCache
-        )
-    }
+    ) =
+        with(textLayoutInput) {
+            (textMeasurer ?: textMeasurer()).measure(
+                text = text,
+                style = style,
+                overflow = overflow,
+                softWrap = softWrap,
+                maxLines = maxLines,
+                placeholders = placeholders,
+                constraints = constraints,
+                layoutDirection = layoutDirection,
+                density = density,
+                fontFamilyResolver = fontFamilyResolver,
+                skipCache = skipCache
+            )
+        }
 }
diff --git a/compose/ui/ui-text/src/androidInstrumentedTest/kotlin/androidx/compose/ui/text/TextPainterTest.kt b/compose/ui/ui-text/src/androidInstrumentedTest/kotlin/androidx/compose/ui/text/TextPainterTest.kt
index 36f3cd5..092e550 100644
--- a/compose/ui/ui-text/src/androidInstrumentedTest/kotlin/androidx/compose/ui/text/TextPainterTest.kt
+++ b/compose/ui/ui-text/src/androidInstrumentedTest/kotlin/androidx/compose/ui/text/TextPainterTest.kt
@@ -53,25 +53,25 @@
     private var defaultDensity = Density(density = 1f)
     private var layoutDirection = LayoutDirection.Ltr
 
-    private val longString = "Lorem ipsum dolor sit amet, consectetur " +
-        "adipiscing elit. Curabitur augue leo, finibus vitae felis ac, pretium condimentum " +
-        "augue. Nullam non libero sed lectus aliquet venenatis non at purus. Fusce id arcu " +
-        "eu mauris pulvinar laoreet."
+    private val longString =
+        "Lorem ipsum dolor sit amet, consectetur " +
+            "adipiscing elit. Curabitur augue leo, finibus vitae felis ac, pretium condimentum " +
+            "augue. Nullam non libero sed lectus aliquet venenatis non at purus. Fusce id arcu " +
+            "eu mauris pulvinar laoreet."
 
     private val longText = AnnotatedString(longString)
 
     @Test
     fun drawTextWithMeasurer_shouldBeEqualTo_drawTextLayoutResult() {
         val measurer = textMeasurer()
-        val textLayoutResult = measurer.measure(
-            text = longText,
-            style = TextStyle(fontFamily = fontFamilyMeasureFont, fontSize = 20.sp),
-            constraints = Constraints(maxWidth = 400, maxHeight = 400)
-        )
+        val textLayoutResult =
+            measurer.measure(
+                text = longText,
+                style = TextStyle(fontFamily = fontFamilyMeasureFont, fontSize = 20.sp),
+                constraints = Constraints(maxWidth = 400, maxHeight = 400)
+            )
 
-        val bitmap = draw {
-            drawText(textLayoutResult)
-        }
+        val bitmap = draw { drawText(textLayoutResult) }
         val bitmap2 = draw {
             drawText(
                 measurer,
@@ -91,36 +91,39 @@
         val measurer = textMeasurer()
 
         // No size constrained
-        val bitmap = draw(300f, 300f, 200f, 200f) {
-            drawText(
-                measurer,
-                text = longString,
-                style = TextStyle(fontFamily = fontFamilyMeasureFont, fontSize = 12.sp),
-                topLeft = Offset(100f, 100f)
-            )
-        }
+        val bitmap =
+            draw(300f, 300f, 200f, 200f) {
+                drawText(
+                    measurer,
+                    text = longString,
+                    style = TextStyle(fontFamily = fontFamilyMeasureFont, fontSize = 12.sp),
+                    topLeft = Offset(100f, 100f)
+                )
+            }
 
         // size constrained but larger than drawing area
-        val bitmap2 = draw(300f, 300f, 200f, 200f) {
-            drawText(
-                measurer,
-                text = longString,
-                style = TextStyle(fontFamily = fontFamilyMeasureFont, fontSize = 12.sp),
-                topLeft = Offset(100f, 100f),
-                size = Size(200f, 200f)
-            )
-        }
+        val bitmap2 =
+            draw(300f, 300f, 200f, 200f) {
+                drawText(
+                    measurer,
+                    text = longString,
+                    style = TextStyle(fontFamily = fontFamilyMeasureFont, fontSize = 12.sp),
+                    topLeft = Offset(100f, 100f),
+                    size = Size(200f, 200f)
+                )
+            }
 
         // size constrained to drawing area
-        val bitmap3 = draw(300f, 300f, 200f, 200f) {
-            drawText(
-                measurer,
-                text = longString,
-                style = TextStyle(fontFamily = fontFamilyMeasureFont, fontSize = 12.sp),
-                topLeft = Offset(100f, 100f),
-                size = Size(100f, 100f)
-            )
-        }
+        val bitmap3 =
+            draw(300f, 300f, 200f, 200f) {
+                drawText(
+                    measurer,
+                    text = longString,
+                    style = TextStyle(fontFamily = fontFamilyMeasureFont, fontSize = 12.sp),
+                    topLeft = Offset(100f, 100f),
+                    size = Size(100f, 100f)
+                )
+            }
 
         // when size is not constrained by Size.Unspecified, default behavior should limit size to
         // drawing area. Hence bitmap != bitmap2, bitmap == bitmap3
@@ -133,37 +136,40 @@
         val measurer = textMeasurer()
 
         // No width constrained
-        val bitmap = draw(300f, 300f, 200f, 200f) {
-            drawText(
-                measurer,
-                text = longString,
-                style = TextStyle(fontFamily = fontFamilyMeasureFont, fontSize = 12.sp),
-                topLeft = Offset(100f, 100f),
-                size = Size(Float.NaN, 200f)
-            )
-        }
+        val bitmap =
+            draw(300f, 300f, 200f, 200f) {
+                drawText(
+                    measurer,
+                    text = longString,
+                    style = TextStyle(fontFamily = fontFamilyMeasureFont, fontSize = 12.sp),
+                    topLeft = Offset(100f, 100f),
+                    size = Size(Float.NaN, 200f)
+                )
+            }
 
         // width constrained but larger than drawing area
-        val bitmap2 = draw(300f, 300f, 200f, 200f) {
-            drawText(
-                measurer,
-                text = longString,
-                style = TextStyle(fontFamily = fontFamilyMeasureFont, fontSize = 12.sp),
-                topLeft = Offset(100f, 100f),
-                size = Size(200f, 200f)
-            )
-        }
+        val bitmap2 =
+            draw(300f, 300f, 200f, 200f) {
+                drawText(
+                    measurer,
+                    text = longString,
+                    style = TextStyle(fontFamily = fontFamilyMeasureFont, fontSize = 12.sp),
+                    topLeft = Offset(100f, 100f),
+                    size = Size(200f, 200f)
+                )
+            }
 
         // width constrained to drawing area
-        val bitmap3 = draw(300f, 300f, 200f, 200f) {
-            drawText(
-                measurer,
-                text = longString,
-                style = TextStyle(fontFamily = fontFamilyMeasureFont, fontSize = 12.sp),
-                topLeft = Offset(100f, 100f),
-                size = Size(100f, 200f)
-            )
-        }
+        val bitmap3 =
+            draw(300f, 300f, 200f, 200f) {
+                drawText(
+                    measurer,
+                    text = longString,
+                    style = TextStyle(fontFamily = fontFamilyMeasureFont, fontSize = 12.sp),
+                    topLeft = Offset(100f, 100f),
+                    size = Size(100f, 200f)
+                )
+            }
 
         // when width is not constrained by Float.NaN, default behavior should limit width to
         // drawing area. Hence bitmap != bitmap2, bitmap == bitmap3
@@ -176,37 +182,40 @@
         val measurer = textMeasurer()
 
         // No height constrained
-        val bitmap = draw(300f, 300f, 200f, 200f) {
-            drawText(
-                measurer,
-                text = longString,
-                style = TextStyle(fontFamily = fontFamilyMeasureFont, fontSize = 12.sp),
-                topLeft = Offset(100f, 100f),
-                size = Size(200f, Float.NaN)
-            )
-        }
+        val bitmap =
+            draw(300f, 300f, 200f, 200f) {
+                drawText(
+                    measurer,
+                    text = longString,
+                    style = TextStyle(fontFamily = fontFamilyMeasureFont, fontSize = 12.sp),
+                    topLeft = Offset(100f, 100f),
+                    size = Size(200f, Float.NaN)
+                )
+            }
 
         // height constrained but larger than drawing area
-        val bitmap2 = draw(300f, 300f, 200f, 200f) {
-            drawText(
-                measurer,
-                text = longString,
-                style = TextStyle(fontFamily = fontFamilyMeasureFont, fontSize = 12.sp),
-                topLeft = Offset(100f, 100f),
-                size = Size(200f, 200f)
-            )
-        }
+        val bitmap2 =
+            draw(300f, 300f, 200f, 200f) {
+                drawText(
+                    measurer,
+                    text = longString,
+                    style = TextStyle(fontFamily = fontFamilyMeasureFont, fontSize = 12.sp),
+                    topLeft = Offset(100f, 100f),
+                    size = Size(200f, 200f)
+                )
+            }
 
         // height constrained to drawing area
-        val bitmap3 = draw(300f, 300f, 200f, 200f) {
-            drawText(
-                measurer,
-                text = longString,
-                style = TextStyle(fontFamily = fontFamilyMeasureFont, fontSize = 12.sp),
-                topLeft = Offset(100f, 100f),
-                size = Size(200f, 100f)
-            )
-        }
+        val bitmap3 =
+            draw(300f, 300f, 200f, 200f) {
+                drawText(
+                    measurer,
+                    text = longString,
+                    style = TextStyle(fontFamily = fontFamilyMeasureFont, fontSize = 12.sp),
+                    topLeft = Offset(100f, 100f),
+                    size = Size(200f, 100f)
+                )
+            }
 
         // when height is not constrained by Float.NaN, default behavior should limit height to
         // drawing area. Hence bitmap != bitmap2, bitmap == bitmap3
@@ -220,24 +229,26 @@
         // canvas area.
         val measurer = textMeasurer()
 
-        val bitmap = draw(300f, 300f, 200f, 200f) {
-            drawText(
-                measurer,
-                text = longText,
-                style = TextStyle(fontFamily = fontFamilyMeasureFont, fontSize = 12.sp),
-                topLeft = Offset(100f, 100f)
-            )
-        }
+        val bitmap =
+            draw(300f, 300f, 200f, 200f) {
+                drawText(
+                    measurer,
+                    text = longText,
+                    style = TextStyle(fontFamily = fontFamilyMeasureFont, fontSize = 12.sp),
+                    topLeft = Offset(100f, 100f)
+                )
+            }
 
-        val bitmap2 = draw(300f, 300f, 200f, 200f) {
-            drawText(
-                measurer,
-                text = longText,
-                style = TextStyle(fontFamily = fontFamilyMeasureFont, fontSize = 12.sp),
-                topLeft = Offset(100f, 100f),
-                size = Size(200f, 200f)
-            )
-        }
+        val bitmap2 =
+            draw(300f, 300f, 200f, 200f) {
+                drawText(
+                    measurer,
+                    text = longText,
+                    style = TextStyle(fontFamily = fontFamilyMeasureFont, fontSize = 12.sp),
+                    topLeft = Offset(100f, 100f),
+                    size = Size(200f, 200f)
+                )
+            }
 
         assertThat(bitmap).isNotEqualToBitmap(bitmap2)
     }
@@ -250,11 +261,12 @@
             drawText(
                 textMeasurer = measurer,
                 text = longText,
-                style = TextStyle(
-                    color = Color.Red,
-                    fontFamily = fontFamilyMeasureFont,
-                    fontSize = 20.sp
-                ),
+                style =
+                    TextStyle(
+                        color = Color.Red,
+                        fontFamily = fontFamilyMeasureFont,
+                        fontSize = 20.sp
+                    ),
                 size = Size(400f, 400f)
             )
         }
@@ -262,11 +274,12 @@
             drawText(
                 textMeasurer = measurer,
                 text = longText,
-                style = TextStyle(
-                    color = Color.Blue,
-                    fontFamily = fontFamilyMeasureFont,
-                    fontSize = 20.sp
-                ),
+                style =
+                    TextStyle(
+                        color = Color.Blue,
+                        fontFamily = fontFamilyMeasureFont,
+                        fontSize = 20.sp
+                    ),
                 size = Size(400f, 400f)
             )
         }
@@ -301,32 +314,32 @@
     @Test
     fun drawTextLayout_shouldChangeColor() {
         val measurer = textMeasurer()
-        val textLayoutResultRed = measurer.measure(
-            text = longText,
-            style = TextStyle(
-                color = Color.Red,
-                fontFamily = fontFamilyMeasureFont,
-                fontSize = 20.sp
-            ),
-            constraints = Constraints.fixed(400, 400)
-        )
+        val textLayoutResultRed =
+            measurer.measure(
+                text = longText,
+                style =
+                    TextStyle(
+                        color = Color.Red,
+                        fontFamily = fontFamilyMeasureFont,
+                        fontSize = 20.sp
+                    ),
+                constraints = Constraints.fixed(400, 400)
+            )
 
-        val textLayoutResultBlue = measurer.measure(
-            text = longText,
-            style = TextStyle(
-                color = Color.Blue,
-                fontFamily = fontFamilyMeasureFont,
-                fontSize = 20.sp
-            ),
-            constraints = Constraints.fixed(400, 400)
-        )
+        val textLayoutResultBlue =
+            measurer.measure(
+                text = longText,
+                style =
+                    TextStyle(
+                        color = Color.Blue,
+                        fontFamily = fontFamilyMeasureFont,
+                        fontSize = 20.sp
+                    ),
+                constraints = Constraints.fixed(400, 400)
+            )
 
-        val bitmap = draw {
-            drawText(textLayoutResultRed, color = Color.Blue)
-        }
-        val bitmap2 = draw {
-            drawText(textLayoutResultBlue)
-        }
+        val bitmap = draw { drawText(textLayoutResultRed, color = Color.Blue) }
+        val bitmap2 = draw { drawText(textLayoutResultBlue) }
 
         assertThat(bitmap).isEqualToBitmap(bitmap2)
     }
@@ -334,32 +347,32 @@
     @Test
     fun drawTextLayout_shouldChangeAlphaColor() {
         val measurer = textMeasurer()
-        val textLayoutResultOpaque = measurer.measure(
-            text = longText,
-            style = TextStyle(
-                color = Color.Red,
-                fontFamily = fontFamilyMeasureFont,
-                fontSize = 20.sp
-            ),
-            constraints = Constraints.fixed(400, 400)
-        )
+        val textLayoutResultOpaque =
+            measurer.measure(
+                text = longText,
+                style =
+                    TextStyle(
+                        color = Color.Red,
+                        fontFamily = fontFamilyMeasureFont,
+                        fontSize = 20.sp
+                    ),
+                constraints = Constraints.fixed(400, 400)
+            )
 
-        val textLayoutResultHalfOpaque = measurer.measure(
-            text = longText,
-            style = TextStyle(
-                color = Color.Red.copy(alpha = 0.5f),
-                fontFamily = fontFamilyMeasureFont,
-                fontSize = 20.sp
-            ),
-            constraints = Constraints.fixed(400, 400)
-        )
+        val textLayoutResultHalfOpaque =
+            measurer.measure(
+                text = longText,
+                style =
+                    TextStyle(
+                        color = Color.Red.copy(alpha = 0.5f),
+                        fontFamily = fontFamilyMeasureFont,
+                        fontSize = 20.sp
+                    ),
+                constraints = Constraints.fixed(400, 400)
+            )
 
-        val bitmap = draw {
-            drawText(textLayoutResultOpaque, alpha = 0.5f)
-        }
-        val bitmap2 = draw {
-            drawText(textLayoutResultHalfOpaque)
-        }
+        val bitmap = draw { drawText(textLayoutResultOpaque, alpha = 0.5f) }
+        val bitmap2 = draw { drawText(textLayoutResultHalfOpaque) }
 
         assertThat(bitmap).isEqualToBitmap(bitmap2)
     }
@@ -369,32 +382,32 @@
         val rbBrush = Brush.radialGradient(listOf(Color.Red, Color.Blue))
         val gyBrush = Brush.radialGradient(listOf(Color.Green, Color.Yellow))
         val measurer = textMeasurer()
-        val textLayoutResultRB = measurer.measure(
-            text = longText,
-            style = TextStyle(
-                brush = rbBrush,
-                fontFamily = fontFamilyMeasureFont,
-                fontSize = 20.sp
-            ),
-            constraints = Constraints.fixed(400, 400)
-        )
+        val textLayoutResultRB =
+            measurer.measure(
+                text = longText,
+                style =
+                    TextStyle(
+                        brush = rbBrush,
+                        fontFamily = fontFamilyMeasureFont,
+                        fontSize = 20.sp
+                    ),
+                constraints = Constraints.fixed(400, 400)
+            )
 
-        val textLayoutResultGY = measurer.measure(
-            text = longText,
-            style = TextStyle(
-                brush = gyBrush,
-                fontFamily = fontFamilyMeasureFont,
-                fontSize = 20.sp
-            ),
-            constraints = Constraints.fixed(400, 400)
-        )
+        val textLayoutResultGY =
+            measurer.measure(
+                text = longText,
+                style =
+                    TextStyle(
+                        brush = gyBrush,
+                        fontFamily = fontFamilyMeasureFont,
+                        fontSize = 20.sp
+                    ),
+                constraints = Constraints.fixed(400, 400)
+            )
 
-        val bitmap = draw {
-            drawText(textLayoutResultRB, brush = gyBrush)
-        }
-        val bitmap2 = draw {
-            drawText(textLayoutResultGY)
-        }
+        val bitmap = draw { drawText(textLayoutResultRB, brush = gyBrush) }
+        val bitmap2 = draw { drawText(textLayoutResultGY) }
 
         assertThat(bitmap).isEqualToBitmap(bitmap2)
     }
@@ -403,34 +416,34 @@
     fun drawTextLayout_shouldChangeAlphaForBrush() {
         val rbBrush = Brush.radialGradient(listOf(Color.Red, Color.Blue))
         val measurer = textMeasurer()
-        val textLayoutResultOpaque = measurer.measure(
-            text = longText,
-            style = TextStyle(
-                brush = rbBrush,
-                alpha = 1f,
-                fontFamily = fontFamilyMeasureFont,
-                fontSize = 20.sp
-            ),
-            constraints = Constraints.fixed(400, 400)
-        )
+        val textLayoutResultOpaque =
+            measurer.measure(
+                text = longText,
+                style =
+                    TextStyle(
+                        brush = rbBrush,
+                        alpha = 1f,
+                        fontFamily = fontFamilyMeasureFont,
+                        fontSize = 20.sp
+                    ),
+                constraints = Constraints.fixed(400, 400)
+            )
 
-        val textLayoutResultHalfOpaque = measurer.measure(
-            text = longText,
-            style = TextStyle(
-                brush = rbBrush,
-                alpha = 0.5f,
-                fontFamily = fontFamilyMeasureFont,
-                fontSize = 20.sp
-            ),
-            constraints = Constraints.fixed(400, 400)
-        )
+        val textLayoutResultHalfOpaque =
+            measurer.measure(
+                text = longText,
+                style =
+                    TextStyle(
+                        brush = rbBrush,
+                        alpha = 0.5f,
+                        fontFamily = fontFamilyMeasureFont,
+                        fontSize = 20.sp
+                    ),
+                constraints = Constraints.fixed(400, 400)
+            )
 
-        val bitmap = draw {
-            drawText(textLayoutResultOpaque, alpha = 0.5f)
-        }
-        val bitmap2 = draw {
-            drawText(textLayoutResultHalfOpaque)
-        }
+        val bitmap = draw { drawText(textLayoutResultOpaque, alpha = 0.5f) }
+        val bitmap2 = draw { drawText(textLayoutResultHalfOpaque) }
 
         assertThat(bitmap).isEqualToBitmap(bitmap2)
     }
@@ -440,32 +453,32 @@
         val fillDrawStyle = Fill
         val strokeDrawStyle = Stroke(8f, cap = StrokeCap.Round)
         val measurer = textMeasurer()
-        val textLayoutResultFill = measurer.measure(
-            text = longText,
-            style = TextStyle(
-                drawStyle = fillDrawStyle,
-                fontFamily = fontFamilyMeasureFont,
-                fontSize = 20.sp
-            ),
-            constraints = Constraints(maxWidth = 400, maxHeight = 400)
-        )
+        val textLayoutResultFill =
+            measurer.measure(
+                text = longText,
+                style =
+                    TextStyle(
+                        drawStyle = fillDrawStyle,
+                        fontFamily = fontFamilyMeasureFont,
+                        fontSize = 20.sp
+                    ),
+                constraints = Constraints(maxWidth = 400, maxHeight = 400)
+            )
 
-        val textLayoutResultStroke = measurer.measure(
-            text = longText,
-            style = TextStyle(
-                drawStyle = strokeDrawStyle,
-                fontFamily = fontFamilyMeasureFont,
-                fontSize = 20.sp
-            ),
-            constraints = Constraints(maxWidth = 400, maxHeight = 400)
-        )
+        val textLayoutResultStroke =
+            measurer.measure(
+                text = longText,
+                style =
+                    TextStyle(
+                        drawStyle = strokeDrawStyle,
+                        fontFamily = fontFamilyMeasureFont,
+                        fontSize = 20.sp
+                    ),
+                constraints = Constraints(maxWidth = 400, maxHeight = 400)
+            )
 
-        val bitmap = draw {
-            drawText(textLayoutResultFill, drawStyle = strokeDrawStyle)
-        }
-        val bitmap2 = draw {
-            drawText(textLayoutResultStroke)
-        }
+        val bitmap = draw { drawText(textLayoutResultFill, drawStyle = strokeDrawStyle) }
+        val bitmap2 = draw { drawText(textLayoutResultStroke) }
 
         assertThat(bitmap).isEqualToBitmap(bitmap2)
     }
@@ -474,24 +487,22 @@
     fun textMeasurerDraw_isConstrainedTo_canvasSizeByDefault() {
         val measurer = textMeasurer()
         // coerceIn the width, height is ignored
-        val textLayoutResult = measurer.measure(
-            text = longText,
-            style = TextStyle(
-                fontFamily = fontFamilyMeasureFont,
-                fontSize = 20.sp
-            ),
-            constraints = Constraints.fixed(200, 4000)
-        )
+        val textLayoutResult =
+            measurer.measure(
+                text = longText,
+                style = TextStyle(fontFamily = fontFamilyMeasureFont, fontSize = 20.sp),
+                constraints = Constraints.fixed(200, 4000)
+            )
 
-        val bitmap = draw(200f, 4000f) {
-            drawText(textLayoutResult)
-        }
-        val bitmap2 = draw(200f, 4000f) {
-            drawText(measurer, longText, style = TextStyle(
-                fontFamily = fontFamilyMeasureFont,
-                fontSize = 20.sp
-            ))
-        }
+        val bitmap = draw(200f, 4000f) { drawText(textLayoutResult) }
+        val bitmap2 =
+            draw(200f, 4000f) {
+                drawText(
+                    measurer,
+                    longText,
+                    style = TextStyle(fontFamily = fontFamilyMeasureFont, fontSize = 20.sp)
+                )
+            }
 
         assertThat(bitmap).isEqualToBitmap(bitmap2)
     }
@@ -500,26 +511,23 @@
     fun textMeasurerDraw_usesCanvasDensity_ByDefault() {
         val measurer = textMeasurer()
         // coerceIn the width, height is ignored
-        val textLayoutResult = measurer.measure(
-            text = longText,
-            style = TextStyle(
-                fontFamily = fontFamilyMeasureFont,
-                fontSize = 20.sp
-            ),
-            density = Density(4f),
-            constraints = Constraints.fixed(1000, 1000)
-        )
+        val textLayoutResult =
+            measurer.measure(
+                text = longText,
+                style = TextStyle(fontFamily = fontFamilyMeasureFont, fontSize = 20.sp),
+                density = Density(4f),
+                constraints = Constraints.fixed(1000, 1000)
+            )
 
-        val bitmap = draw {
-            drawText(textLayoutResult)
-        }
+        val bitmap = draw { drawText(textLayoutResult) }
 
         defaultDensity = Density(4f)
         val bitmap2 = draw {
-            drawText(measurer, longText, style = TextStyle(
-                fontFamily = fontFamilyMeasureFont,
-                fontSize = 20.sp
-            ))
+            drawText(
+                measurer,
+                longText,
+                style = TextStyle(fontFamily = fontFamilyMeasureFont, fontSize = 20.sp)
+            )
         }
 
         assertThat(bitmap).isEqualToBitmap(bitmap2)
@@ -529,27 +537,21 @@
     fun drawTextClipsTheContent_ifOverflowIsClip() {
         val measurer = textMeasurer()
         // coerceIn the width, height is ignored
-        val textLayoutResult = measurer.measure(
-            text = longText,
-            style = TextStyle(
-                fontFamily = fontFamilyMeasureFont,
-                fontSize = 14.sp
-            ),
-            softWrap = false,
-            overflow = TextOverflow.Clip,
-            constraints = Constraints.fixed(200, 200)
-        )
+        val textLayoutResult =
+            measurer.measure(
+                text = longText,
+                style = TextStyle(fontFamily = fontFamilyMeasureFont, fontSize = 14.sp),
+                softWrap = false,
+                overflow = TextOverflow.Clip,
+                constraints = Constraints.fixed(200, 200)
+            )
 
-        val bitmap = draw(400f, 200f) {
-            drawText(textLayoutResult)
-        }
+        val bitmap = draw(400f, 200f) { drawText(textLayoutResult) }
         val croppedBitmap = Bitmap.createBitmap(bitmap, 200, 0, 200, 200)
 
         // cropped part should be empty
-        assertThat(croppedBitmap).isEqualToBitmap(Bitmap.createBitmap(
-            200,
-            200,
-            Bitmap.Config.ARGB_8888))
+        assertThat(croppedBitmap)
+            .isEqualToBitmap(Bitmap.createBitmap(200, 200, Bitmap.Config.ARGB_8888))
     }
 
     @Test
@@ -558,30 +560,21 @@
         with(defaultDensity) {
             val fontSize = 20.sp
             val height = fontSize.toPx().ceilToInt() / 2
-            val textLayoutResult = measurer.measure(
-                text = longText,
-                style = TextStyle(
-                    fontFamily = fontFamilyMeasureFont,
-                    fontSize = fontSize
-                ),
-                softWrap = false,
-                overflow = TextOverflow.Ellipsis,
-                constraints = Constraints.fixed(200, height)
-            )
+            val textLayoutResult =
+                measurer.measure(
+                    text = longText,
+                    style = TextStyle(fontFamily = fontFamilyMeasureFont, fontSize = fontSize),
+                    softWrap = false,
+                    overflow = TextOverflow.Ellipsis,
+                    constraints = Constraints.fixed(200, height)
+                )
 
-            val bitmap = draw(200f, 200f) {
-                drawText(textLayoutResult)
-            }
+            val bitmap = draw(200f, 200f) { drawText(textLayoutResult) }
             val croppedBitmap = Bitmap.createBitmap(bitmap, 0, height, 200, 200 - height)
 
             // cropped part should be empty
-            assertThat(croppedBitmap).isEqualToBitmap(
-                Bitmap.createBitmap(
-                    200,
-                    200 - height,
-                    Bitmap.Config.ARGB_8888
-                )
-            )
+            assertThat(croppedBitmap)
+                .isEqualToBitmap(Bitmap.createBitmap(200, 200 - height, Bitmap.Config.ARGB_8888))
         }
     }
 
@@ -589,35 +582,27 @@
     fun drawTextDoesNotClipTheContent_ifOverflowIsVisible() {
         val measurer = textMeasurer()
         // coerceIn the width, height is ignored
-        val textLayoutResult = measurer.measure(
-            text = longText,
-            style = TextStyle(
-                fontFamily = fontFamilyMeasureFont,
-                fontSize = 14.sp
-            ),
-            softWrap = false,
-            overflow = TextOverflow.Clip,
-            constraints = Constraints.fixed(400, 200)
-        )
+        val textLayoutResult =
+            measurer.measure(
+                text = longText,
+                style = TextStyle(fontFamily = fontFamilyMeasureFont, fontSize = 14.sp),
+                softWrap = false,
+                overflow = TextOverflow.Clip,
+                constraints = Constraints.fixed(400, 200)
+            )
 
-        val textLayoutResultNoClip = measurer.measure(
-            text = longText,
-            style = TextStyle(
-                fontFamily = fontFamilyMeasureFont,
-                fontSize = 14.sp
-            ),
-            softWrap = false,
-            overflow = TextOverflow.Visible,
-            constraints = Constraints.fixed(200, 200)
-        )
+        val textLayoutResultNoClip =
+            measurer.measure(
+                text = longText,
+                style = TextStyle(fontFamily = fontFamilyMeasureFont, fontSize = 14.sp),
+                softWrap = false,
+                overflow = TextOverflow.Visible,
+                constraints = Constraints.fixed(200, 200)
+            )
 
-        val bitmap = draw(400f, 200f) {
-            drawText(textLayoutResult)
-        }
+        val bitmap = draw(400f, 200f) { drawText(textLayoutResult) }
 
-        val bitmapNoClip = draw(400f, 200f) {
-            drawText(textLayoutResultNoClip)
-        }
+        val bitmapNoClip = draw(400f, 200f) { drawText(textLayoutResultNoClip) }
 
         // cropped part should be empty
         assertThat(bitmap).isEqualToBitmap(bitmapNoClip)
@@ -628,12 +613,7 @@
         density: Density = this.defaultDensity,
         layoutDirection: LayoutDirection = this.layoutDirection,
         cacheSize: Int = 0
-    ): TextMeasurer = TextMeasurer(
-        fontFamilyResolver,
-        density,
-        layoutDirection,
-        cacheSize
-    )
+    ): TextMeasurer = TextMeasurer(fontFamilyResolver, density, layoutDirection, cacheSize)
 
     fun draw(
         bitmapWidth: Float = 1000f,
@@ -643,11 +623,12 @@
         block: DrawScope.() -> Unit
     ): Bitmap {
         val size = Size(bitmapWidth, bitmapHeight)
-        val bitmap = Bitmap.createBitmap(
-            size.width.toIntPx(),
-            size.height.toIntPx(),
-            Bitmap.Config.ARGB_8888
-        )
+        val bitmap =
+            Bitmap.createBitmap(
+                size.width.toIntPx(),
+                size.height.toIntPx(),
+                Bitmap.Config.ARGB_8888
+            )
         val canvas = Canvas(bitmap.asImageBitmap())
         val drawScope = CanvasDrawScope()
         drawScope.draw(
diff --git a/compose/ui/ui-text/src/androidInstrumentedTest/kotlin/androidx/compose/ui/text/TextTestExtensions.kt b/compose/ui/ui-text/src/androidInstrumentedTest/kotlin/androidx/compose/ui/text/TextTestExtensions.kt
index 7e82a30..bbeb0aa 100644
--- a/compose/ui/ui-text/src/androidInstrumentedTest/kotlin/androidx/compose/ui/text/TextTestExtensions.kt
+++ b/compose/ui/ui-text/src/androidInstrumentedTest/kotlin/androidx/compose/ui/text/TextTestExtensions.kt
@@ -45,11 +45,7 @@
 fun Paragraph.onCanvas(
     block: Paragraph.(androidx.compose.ui.graphics.Canvas) -> Unit = {}
 ): Bitmap {
-    val bitmap = Bitmap.createBitmap(
-        width.toIntPx(),
-        height.toIntPx(),
-        Bitmap.Config.ARGB_8888
-    )
+    val bitmap = Bitmap.createBitmap(width.toIntPx(), height.toIntPx(), Bitmap.Config.ARGB_8888)
     val canvas = androidx.compose.ui.graphics.Canvas(Canvas(bitmap))
     block(canvas)
     return bitmap
@@ -63,11 +59,7 @@
     block: MultiParagraph.(androidx.compose.ui.graphics.Canvas) -> Unit = {}
 ): Bitmap {
     val width = paragraphInfoList.maxByOrNull { it.paragraph.width }?.paragraph?.width ?: 0f
-    val bitmap = Bitmap.createBitmap(
-        width.toIntPx(),
-        height.toIntPx(),
-        Bitmap.Config.ARGB_8888
-    )
+    val bitmap = Bitmap.createBitmap(width.toIntPx(), height.toIntPx(), Bitmap.Config.ARGB_8888)
     val canvas = androidx.compose.ui.graphics.Canvas(Canvas(bitmap))
     block(canvas)
     return bitmap
@@ -149,30 +141,23 @@
     }
 }
 
-internal fun UncachedFontFamilyResolver(
-    context: Context
-): FontFamily.Resolver = UncachedFontFamilyResolver(
-    AndroidFontLoader(context),
-    AndroidFontResolveInterceptor(context)
-)
+internal fun UncachedFontFamilyResolver(context: Context): FontFamily.Resolver =
+    UncachedFontFamilyResolver(AndroidFontLoader(context), AndroidFontResolveInterceptor(context))
 
 internal fun UncachedFontFamilyResolver(
     platformFontLoader: PlatformFontLoader,
     platformResolveInterceptor: PlatformResolveInterceptor
-): FontFamily.Resolver = FontFamilyResolverImpl(
-    platformFontLoader,
-    platformResolveInterceptor,
-    TypefaceRequestCache(),
-    FontListFontFamilyTypefaceAdapter(AsyncTypefaceCache()),
-    PlatformFontFamilyTypefaceAdapter()
-)
+): FontFamily.Resolver =
+    FontFamilyResolverImpl(
+        platformFontLoader,
+        platformResolveInterceptor,
+        TypefaceRequestCache(),
+        FontListFontFamilyTypefaceAdapter(AsyncTypefaceCache()),
+        PlatformFontFamilyTypefaceAdapter()
+    )
 
 fun MultiParagraph.bitmap(): Bitmap {
-    val bitmap = Bitmap.createBitmap(
-        width.toIntPx(),
-        height.toIntPx(),
-        Bitmap.Config.ARGB_8888
-    )
+    val bitmap = Bitmap.createBitmap(width.toIntPx(), height.toIntPx(), Bitmap.Config.ARGB_8888)
     val canvas = androidx.compose.ui.graphics.Canvas(Canvas(bitmap))
     this.paint(canvas)
     return bitmap
@@ -182,12 +167,7 @@
 
 internal fun FloatArray.asRectArray(): Array<Rect> {
     return Array((size) / 4) { index ->
-        Rect(
-            this[4 * index],
-            this[4 * index + 1],
-            this[4 * index + 2],
-            this[4 * index + 3]
-        )
+        Rect(this[4 * index], this[4 * index + 1], this[4 * index + 2], this[4 * index + 3])
     }
 }
 
@@ -200,27 +180,24 @@
 ): Array<Rect> {
     var top = initialTop
     var left = 0f
-    return text.indices.map { index ->
-        // if \n, no position update, same as before
-        val right = if (text[index] == '\n') left else left + fontSize
-        val bottom = top + lineHeight
-        Rect(
-            left = left,
-            top = top,
-            right = right,
-            bottom = bottom
-        ).also {
-            if (text[index] == '\n') {
-                // left resets to line start
-                left = 0f
-                // top will go to next line
-                top = bottom
-            } else {
-                // else move to right with one char
-                left = right
+    return text.indices
+        .map { index ->
+            // if \n, no position update, same as before
+            val right = if (text[index] == '\n') left else left + fontSize
+            val bottom = top + lineHeight
+            Rect(left = left, top = top, right = right, bottom = bottom).also {
+                if (text[index] == '\n') {
+                    // left resets to line start
+                    left = 0f
+                    // top will go to next line
+                    top = bottom
+                } else {
+                    // else move to right with one char
+                    left = right
+                }
             }
         }
-    }.toTypedArray()
+        .toTypedArray()
 }
 
 internal fun getRtlCharacterBoundariesForTestFont(
@@ -231,28 +208,25 @@
 ): Array<Rect> {
     var top = 0f
     var right = width
-    return text.indices.map { index ->
-        // if \n, position doesn't update, same as before (right)
-        // else left is 1 char left
-        val left = if (text[index] == '\n') right else right - fontSize
-        val bottom = top + lineHeight
-        Rect(
-            left = left,
-            top = top,
-            right = right,
-            bottom = bottom
-        ).also {
-            if (text[index] == '\n') {
-                // right resets to line start
-                right = width
-                // top will go to next line
-                top = bottom
-            } else {
-                // else move to left with one char
-                right = left
+    return text.indices
+        .map { index ->
+            // if \n, position doesn't update, same as before (right)
+            // else left is 1 char left
+            val left = if (text[index] == '\n') right else right - fontSize
+            val bottom = top + lineHeight
+            Rect(left = left, top = top, right = right, bottom = bottom).also {
+                if (text[index] == '\n') {
+                    // right resets to line start
+                    right = width
+                    // top will go to next line
+                    top = bottom
+                } else {
+                    // else move to left with one char
+                    right = left
+                }
             }
         }
-    }.toTypedArray()
+        .toTypedArray()
 }
 
 internal fun CharSequence.rangeOf(ch: Char): TextRange {
diff --git a/compose/ui/ui-text/src/androidInstrumentedTest/kotlin/androidx/compose/ui/text/font/AndroidFontTest.kt b/compose/ui/ui-text/src/androidInstrumentedTest/kotlin/androidx/compose/ui/text/font/AndroidFontTest.kt
index 940c489..2a341ba 100644
--- a/compose/ui/ui-text/src/androidInstrumentedTest/kotlin/androidx/compose/ui/text/font/AndroidFontTest.kt
+++ b/compose/ui/ui-text/src/androidInstrumentedTest/kotlin/androidx/compose/ui/text/font/AndroidFontTest.kt
@@ -15,6 +15,7 @@
  */
 
 package androidx.compose.ui.text.font
+
 import android.content.Context
 import android.os.Build
 import android.os.ParcelFileDescriptor
diff --git a/compose/ui/ui-text/src/androidInstrumentedTest/kotlin/androidx/compose/ui/text/font/AndroidVariableFontTest.kt b/compose/ui/ui-text/src/androidInstrumentedTest/kotlin/androidx/compose/ui/text/font/AndroidVariableFontTest.kt
index a7abc96..a7e93e2 100644
--- a/compose/ui/ui-text/src/androidInstrumentedTest/kotlin/androidx/compose/ui/text/font/AndroidVariableFontTest.kt
+++ b/compose/ui/ui-text/src/androidInstrumentedTest/kotlin/androidx/compose/ui/text/font/AndroidVariableFontTest.kt
@@ -15,6 +15,7 @@
  */
 
 package androidx.compose.ui.text.font
+
 import android.content.Context
 import android.graphics.Bitmap
 import android.graphics.Canvas
@@ -70,14 +71,18 @@
     @Test
     @SdkSuppress(minSdkVersion = 26)
     fun fileFont_differentFontVariationSettings_differentResults() {
-        val font1 = Font(
-            file = tempFile!!,
-            variationSettings = FontVariation.Settings(FontVariation.weight(1))
-        ) as AndroidFont
-        val font1000 = Font(
-            file = tempFile!!,
-            variationSettings = FontVariation.Settings(FontVariation.weight(1000))
-        ) as AndroidFont
+        val font1 =
+            Font(
+                file = tempFile!!,
+                variationSettings = FontVariation.Settings(FontVariation.weight(1))
+            )
+                as AndroidFont
+        val font1000 =
+            Font(
+                file = tempFile!!,
+                variationSettings = FontVariation.Settings(FontVariation.weight(1000))
+            )
+                as AndroidFont
 
         val bitmap1 = font1.typefaceLoader.loadBlocking(context, font1)!!.drawToBitmap("A")
         val bitmap2 = font1000.typefaceLoader.loadBlocking(context, font1000)!!.drawToBitmap("A")
@@ -87,14 +92,8 @@
     @Test
     @SdkSuppress(minSdkVersion = 26)
     fun fontFile_defaultsWeight_whenWeightSet() {
-        val font1 = Font(
-            file = tempFile!!,
-            weight = FontWeight(1)
-        ) as AndroidFont
-        val font1000 = Font(
-            file = tempFile!!,
-            weight = FontWeight(1000)
-        ) as AndroidFont
+        val font1 = Font(file = tempFile!!, weight = FontWeight(1)) as AndroidFont
+        val font1000 = Font(file = tempFile!!, weight = FontWeight(1000)) as AndroidFont
 
         val bitmap1 = font1.typefaceLoader.loadBlocking(context, font1)!!.drawToBitmap("A")
         val bitmap2 = font1000.typefaceLoader.loadBlocking(context, font1000)!!.drawToBitmap("A")
@@ -104,16 +103,20 @@
     @Test
     @SdkSuppress(minSdkVersion = 26)
     fun assetFont_differentFontVariationSettings_differentResults() {
-        val font1 = Font(
-            path = assetFontPath,
-            context.assets,
-            variationSettings = FontVariation.Settings(FontVariation.weight(1))
-        ) as AndroidFont
-        val font1000 = Font(
-            path = assetFontPath,
-            context.assets,
-            variationSettings = FontVariation.Settings(FontVariation.weight(1000))
-        ) as AndroidFont
+        val font1 =
+            Font(
+                path = assetFontPath,
+                context.assets,
+                variationSettings = FontVariation.Settings(FontVariation.weight(1))
+            )
+                as AndroidFont
+        val font1000 =
+            Font(
+                path = assetFontPath,
+                context.assets,
+                variationSettings = FontVariation.Settings(FontVariation.weight(1000))
+            )
+                as AndroidFont
 
         val bitmap1 = font1.typefaceLoader.loadBlocking(context, font1)!!.drawToBitmap("A")
         val bitmap2 = font1000.typefaceLoader.loadBlocking(context, font1000)!!.drawToBitmap("A")
@@ -123,16 +126,10 @@
     @Test
     @SdkSuppress(minSdkVersion = 26)
     fun assetFile_defaultsWeight_whenWeightSet() {
-        val font1 = Font(
-            path = assetFontPath,
-            context.assets,
-            weight = FontWeight(1)
-        ) as AndroidFont
-        val font1000 = Font(
-            path = assetFontPath,
-            context.assets,
-            weight = FontWeight(1000)
-        ) as AndroidFont
+        val font1 =
+            Font(path = assetFontPath, context.assets, weight = FontWeight(1)) as AndroidFont
+        val font1000 =
+            Font(path = assetFontPath, context.assets, weight = FontWeight(1000)) as AndroidFont
 
         val bitmap1 = font1.typefaceLoader.loadBlocking(context, font1)!!.drawToBitmap("A")
         val bitmap2 = font1000.typefaceLoader.loadBlocking(context, font1000)!!.drawToBitmap("A")
@@ -142,18 +139,22 @@
     @Test
     @SdkSuppress(minSdkVersion = 26)
     fun parcelFont_differentFontVariationSettings_differentResults() {
-        val font1 = context.openFileInput(tempFile?.name).use { inputStream ->
-            Font(
-                ParcelFileDescriptor.dup(inputStream.fd),
-                variationSettings = FontVariation.Settings(FontVariation.weight(1))
-            ) as AndroidFont
-        }
-        val font1000 = context.openFileInput(tempFile?.name).use { inputStream ->
-            Font(
-                ParcelFileDescriptor.dup(inputStream.fd),
-                variationSettings = FontVariation.Settings(FontVariation.weight(1000))
-            ) as AndroidFont
-        }
+        val font1 =
+            context.openFileInput(tempFile?.name).use { inputStream ->
+                Font(
+                    ParcelFileDescriptor.dup(inputStream.fd),
+                    variationSettings = FontVariation.Settings(FontVariation.weight(1))
+                )
+                    as AndroidFont
+            }
+        val font1000 =
+            context.openFileInput(tempFile?.name).use { inputStream ->
+                Font(
+                    ParcelFileDescriptor.dup(inputStream.fd),
+                    variationSettings = FontVariation.Settings(FontVariation.weight(1000))
+                )
+                    as AndroidFont
+            }
 
         val bitmap1 = font1.typefaceLoader.loadBlocking(context, font1)!!.drawToBitmap("A")
         val bitmap2 = font1000.typefaceLoader.loadBlocking(context, font1000)!!.drawToBitmap("A")
@@ -163,18 +164,22 @@
     @Test
     @SdkSuppress(minSdkVersion = 26)
     fun parcelFile_defaultsWeight_whenWeightSet() {
-        val font1 = context.openFileInput(tempFile?.name).use { inputStream ->
-            Font(
-                ParcelFileDescriptor.dup(inputStream.fd),
-                variationSettings = FontVariation.Settings(FontVariation.weight(1))
-            ) as AndroidFont
-        }
-        val font1000 = context.openFileInput(tempFile?.name).use { inputStream ->
-            Font(
-                ParcelFileDescriptor.dup(inputStream.fd),
-                variationSettings = FontVariation.Settings(FontVariation.weight(1000))
-            ) as AndroidFont
-        }
+        val font1 =
+            context.openFileInput(tempFile?.name).use { inputStream ->
+                Font(
+                    ParcelFileDescriptor.dup(inputStream.fd),
+                    variationSettings = FontVariation.Settings(FontVariation.weight(1))
+                )
+                    as AndroidFont
+            }
+        val font1000 =
+            context.openFileInput(tempFile?.name).use { inputStream ->
+                Font(
+                    ParcelFileDescriptor.dup(inputStream.fd),
+                    variationSettings = FontVariation.Settings(FontVariation.weight(1000))
+                )
+                    as AndroidFont
+            }
 
         val bitmap1 = font1.typefaceLoader.loadBlocking(context, font1)!!.drawToBitmap("A")
         val bitmap2 = font1000.typefaceLoader.loadBlocking(context, font1000)!!.drawToBitmap("A")
diff --git a/compose/ui/ui-text/src/androidInstrumentedTest/kotlin/androidx/compose/ui/text/font/DelegatingFontLoaderForDeprecatedUsageTest.kt b/compose/ui/ui-text/src/androidInstrumentedTest/kotlin/androidx/compose/ui/text/font/DelegatingFontLoaderForDeprecatedUsageTest.kt
index 9c8b80e..2c727d5 100644
--- a/compose/ui/ui-text/src/androidInstrumentedTest/kotlin/androidx/compose/ui/text/font/DelegatingFontLoaderForDeprecatedUsageTest.kt
+++ b/compose/ui/ui-text/src/androidInstrumentedTest/kotlin/androidx/compose/ui/text/font/DelegatingFontLoaderForDeprecatedUsageTest.kt
@@ -132,10 +132,7 @@
     @Test
     @Suppress("DEPRECATION")
     fun loadOptional_delegatesToFontResourceLoader() {
-        val resourceFont = Font(
-            resId = 3,
-            loadingStrategy = FontLoadingStrategy.OptionalLocal
-        )
+        val resourceFont = Font(resId = 3, loadingStrategy = FontLoadingStrategy.OptionalLocal)
         val subject = TrackingLoader()
         val bridge = createFontFamilyResolver(subject, context)
 
@@ -146,10 +143,7 @@
     @Test
     @Suppress("DEPRECATION")
     fun loadAsync_delegatesToFontResourceLoader() {
-        val resourceFont = Font(
-            resId = 3,
-            loadingStrategy = FontLoadingStrategy.Async
-        )
+        val resourceFont = Font(resId = 3, loadingStrategy = FontLoadingStrategy.Async)
         val subject = TrackingLoader()
         val bridge = createFontFamilyResolver(subject, context)
 
diff --git a/compose/ui/ui-text/src/androidInstrumentedTest/kotlin/androidx/compose/ui/text/font/DeviceFontFamilyNameFontTest.kt b/compose/ui/ui-text/src/androidInstrumentedTest/kotlin/androidx/compose/ui/text/font/DeviceFontFamilyNameFontTest.kt
index 61d402a..78abe8e 100644
--- a/compose/ui/ui-text/src/androidInstrumentedTest/kotlin/androidx/compose/ui/text/font/DeviceFontFamilyNameFontTest.kt
+++ b/compose/ui/ui-text/src/androidInstrumentedTest/kotlin/androidx/compose/ui/text/font/DeviceFontFamilyNameFontTest.kt
@@ -70,8 +70,10 @@
     @Test
     fun cursive_resolvesNonNull() {
         // this family name is defined in aosp fonts.xml, and is generally available
-        assumeTrue(Typeface.create("cursive", Typeface.NORMAL)
-            != Typeface.create(Typeface.DEFAULT, Typeface.NORMAL))
+        assumeTrue(
+            Typeface.create("cursive", Typeface.NORMAL) !=
+                Typeface.create(Typeface.DEFAULT, Typeface.NORMAL)
+        )
         val name = DeviceFontFamilyName("cursive")
         val font = Font(name) as AndroidFont
         val actual = font.typefaceLoader.loadBlocking(context, font)
@@ -81,8 +83,10 @@
     @Test
     fun cursive_resolvesNonNull_allWeightAllStyles() {
         // this family name is defined in aosp fonts.xml, and is generally available
-        assumeTrue(Typeface.create("cursive", Typeface.NORMAL)
-            != Typeface.create(Typeface.DEFAULT, Typeface.NORMAL))
+        assumeTrue(
+            Typeface.create("cursive", Typeface.NORMAL) !=
+                Typeface.create(Typeface.DEFAULT, Typeface.NORMAL)
+        )
         val name = DeviceFontFamilyName("cursive")
         for (style in listOf(FontStyle.Italic, FontStyle.Normal)) {
             for (weight in 100..1000) {
@@ -94,12 +98,15 @@
     }
 
     private fun fontNameNotInstalledOnSystem(): String {
-        var fontName = "This is a font name that is not installed, like actually, and we will " +
-            "append random characters until it fails to lookup"
+        var fontName =
+            "This is a font name that is not installed, like actually, and we will " +
+                "append random characters until it fails to lookup"
         var index = 0
         // check that it's actually not installed, and append nonsense until wo confirm it misses
-        while (Typeface.create(fontName, Typeface.NORMAL)
-            != Typeface.create(Typeface.DEFAULT, Typeface.NORMAL)) {
+        while (
+            Typeface.create(fontName, Typeface.NORMAL) !=
+                Typeface.create(Typeface.DEFAULT, Typeface.NORMAL)
+        ) {
             fontName += index++.toString()
         }
         return fontName
diff --git a/compose/ui/ui-text/src/androidInstrumentedTest/kotlin/androidx/compose/ui/text/font/FontFamilyResolverFileTest.kt b/compose/ui/ui-text/src/androidInstrumentedTest/kotlin/androidx/compose/ui/text/font/FontFamilyResolverFileTest.kt
index cb1d84c..697885e 100644
--- a/compose/ui/ui-text/src/androidInstrumentedTest/kotlin/androidx/compose/ui/text/font/FontFamilyResolverFileTest.kt
+++ b/compose/ui/ui-text/src/androidInstrumentedTest/kotlin/androidx/compose/ui/text/font/FontFamilyResolverFileTest.kt
@@ -57,12 +57,8 @@
         fontStyle: FontStyle = FontStyle.Normal,
         fontSynthesis: FontSynthesis = FontSynthesis.All
     ): Typeface {
-        return fontFamilyResolver.resolve(
-            fontFamily,
-            fontWeight,
-            fontStyle,
-            fontSynthesis
-        ).value as Typeface
+        return fontFamilyResolver.resolve(fontFamily, fontWeight, fontStyle, fontSynthesis).value
+            as Typeface
     }
 
     private fun deleteFile() {
diff --git a/compose/ui/ui-text/src/androidInstrumentedTest/kotlin/androidx/compose/ui/text/font/FontFamilyResolverImplCancellationTest.kt b/compose/ui/ui-text/src/androidInstrumentedTest/kotlin/androidx/compose/ui/text/font/FontFamilyResolverImplCancellationTest.kt
index 157daa7..b13ee5f 100644
--- a/compose/ui/ui-text/src/androidInstrumentedTest/kotlin/androidx/compose/ui/text/font/FontFamilyResolverImplCancellationTest.kt
+++ b/compose/ui/ui-text/src/androidInstrumentedTest/kotlin/androidx/compose/ui/text/font/FontFamilyResolverImplCancellationTest.kt
@@ -57,11 +57,13 @@
         val dispatcher = StandardTestDispatcher()
         scope = TestCoroutineScope(dispatcher)
         val injectedContext = scope.coroutineContext.minusKey(CoroutineExceptionHandler)
-        subject = FontFamilyResolverImpl(
-            fontLoader,
-            fontResolveInterceptor,
-            typefaceRequestCache,
-            FontListFontFamilyTypefaceAdapter(asyncTypefaceCache, injectedContext))
+        subject =
+            FontFamilyResolverImpl(
+                fontLoader,
+                fontResolveInterceptor,
+                typefaceRequestCache,
+                FontListFontFamilyTypefaceAdapter(asyncTypefaceCache, injectedContext)
+            )
         typefaceLoader = AsyncTestTypefaceLoader()
     }
 
@@ -80,15 +82,16 @@
         val fontFamily = asyncFont.toFontFamily()
         subject.resolve(fontFamily)
 
-        fun currentCacheItem(): TypefaceResult = typefaceRequestCache.get(
-            TypefaceRequest(
-                fontFamily,
-                FontWeight.Normal,
-                FontStyle.Normal,
-                FontSynthesis.All,
-                fontLoader.cacheKey
-            )
-        )!!
+        fun currentCacheItem(): TypefaceResult =
+            typefaceRequestCache.get(
+                TypefaceRequest(
+                    fontFamily,
+                    FontWeight.Normal,
+                    FontStyle.Normal,
+                    FontSynthesis.All,
+                    fontLoader.cacheKey
+                )
+            )!!
 
         scope.runCurrent()
         val beforeCacheEntry = currentCacheItem()
diff --git a/compose/ui/ui-text/src/androidInstrumentedTest/kotlin/androidx/compose/ui/text/font/FontFamilyResolverImplPreloadTest.kt b/compose/ui/ui-text/src/androidInstrumentedTest/kotlin/androidx/compose/ui/text/font/FontFamilyResolverImplPreloadTest.kt
index 92e6b14..1477f72 100644
--- a/compose/ui/ui-text/src/androidInstrumentedTest/kotlin/androidx/compose/ui/text/font/FontFamilyResolverImplPreloadTest.kt
+++ b/compose/ui/ui-text/src/androidInstrumentedTest/kotlin/androidx/compose/ui/text/font/FontFamilyResolverImplPreloadTest.kt
@@ -62,66 +62,63 @@
         dispatcher = TestCoroutineDispatcher()
         scope = TestCoroutineScope(dispatcher)
         val injectedContext = scope.coroutineContext.minusKey(CoroutineExceptionHandler)
-        subject = FontFamilyResolverImpl(
-            fontLoader,
-            typefaceRequestCache = typefaceCache,
-            fontListFontFamilyTypefaceAdapter = FontListFontFamilyTypefaceAdapter(
-                asyncTypefaceCache,
-                injectedContext
+        subject =
+            FontFamilyResolverImpl(
+                fontLoader,
+                typefaceRequestCache = typefaceCache,
+                fontListFontFamilyTypefaceAdapter =
+                    FontListFontFamilyTypefaceAdapter(asyncTypefaceCache, injectedContext)
             )
-        )
         typefaceLoader = AsyncTestTypefaceLoader()
     }
 
     @Test
     fun preload_insertsTypefaceIntoCache() {
         val fontFamily = FontTestData.FONT_100_REGULAR.toFontFamily()
-        scope.runBlockingTest {
-            subject.preload(fontFamily)
-        }
+        scope.runBlockingTest { subject.preload(fontFamily) }
         assertThat(typefaceCache.size).isEqualTo(1)
-        val cacheResult = typefaceCache.getImmutableResultFor(
-            fontFamily,
-            FontWeight.W100,
-            fontLoader = fontLoader
-        )
+        val cacheResult =
+            typefaceCache.getImmutableResultFor(
+                fontFamily,
+                FontWeight.W100,
+                fontLoader = fontLoader
+            )
         assertThat(cacheResult).isNotNull()
     }
 
     @Test
     fun preload_insertsTypefaceIntoCache_onlyForFontWeightAndStyle() {
         val fontFamily = FontTestData.FONT_100_REGULAR.toFontFamily()
-        scope.runBlockingTest {
-            subject.preload(fontFamily)
-        }
+        scope.runBlockingTest { subject.preload(fontFamily) }
         assertThat(typefaceCache.size).isEqualTo(1)
-        val cacheResult = typefaceCache.getImmutableResultFor(
-            fontFamily,
-            FontWeight.W200,
-            fontLoader = fontLoader
-        )
+        val cacheResult =
+            typefaceCache.getImmutableResultFor(
+                fontFamily,
+                FontWeight.W200,
+                fontLoader = fontLoader
+            )
         assertThat(cacheResult).isNull()
     }
 
     @Test
     fun preload_insertsAllTypefaces_intoCache() {
-        val fontFamily = FontFamily(
-            FontTestData.FONT_100_REGULAR,
-            FontTestData.FONT_200_REGULAR,
-            FontTestData.FONT_300_REGULAR,
-            FontTestData.FONT_400_REGULAR,
-            FontTestData.FONT_500_REGULAR
-        )
-        scope.runBlockingTest {
-            subject.preload(fontFamily)
-        }
+        val fontFamily =
+            FontFamily(
+                FontTestData.FONT_100_REGULAR,
+                FontTestData.FONT_200_REGULAR,
+                FontTestData.FONT_300_REGULAR,
+                FontTestData.FONT_400_REGULAR,
+                FontTestData.FONT_500_REGULAR
+            )
+        scope.runBlockingTest { subject.preload(fontFamily) }
         assertThat(typefaceCache.size).isEqualTo(5)
         for (weight in 100..500 step 100) {
-            val cacheResult = typefaceCache.getImmutableResultFor(
-                fontFamily,
-                FontWeight(weight),
-                fontLoader = fontLoader
-            )
+            val cacheResult =
+                typefaceCache.getImmutableResultFor(
+                    fontFamily,
+                    FontWeight(weight),
+                    fontLoader = fontLoader
+                )
             assertThat(cacheResult).isNotNull()
         }
     }
@@ -132,9 +129,7 @@
         val font = AsyncFauxFont(typefaceLoader, FontWeight.Normal, FontStyle.Normal)
 
         val fontFamily = font.toFontFamily()
-        val preloadResult = scope.async {
-            subject.preload(fontFamily)
-        }
+        val preloadResult = scope.async { subject.preload(fontFamily) }
 
         assertThat(typefaceLoader.pendingRequestsFor(font)).hasSize(1)
         // at this point, the request is out but font cache hasn't started
@@ -144,18 +139,14 @@
 
         typefaceLoader.completeOne(font, Typeface.MONOSPACE)
 
-        scope.runBlockingTest {
-            preloadResult.await()
-        }
+        scope.runBlockingTest { preloadResult.await() }
 
         // at this point, result is back, and preload() has returned, so the main typeface
         // cache contains the result
         assertThat(typefaceCache.size).isEqualTo(1)
 
-        val typefaceResult = typefaceCache.getImmutableResultFor(
-            fontFamily,
-            fontLoader = fontLoader
-        )
+        val typefaceResult =
+            typefaceCache.getImmutableResultFor(fontFamily, fontLoader = fontLoader)
         assertThat(typefaceResult).isNotNull()
     }
 
@@ -165,19 +156,12 @@
         val font = AsyncFauxFont(typefaceLoader, FontWeight.Normal, FontStyle.Normal)
         val fallbackFont = AsyncFauxFont(typefaceLoader, FontWeight.Normal, FontStyle.Normal)
 
-        val fontFamily = FontFamily(
-            font,
-            fallbackFont
-        )
-        val preloadResult = scope.async {
-            subject.preload(fontFamily)
-        }
+        val fontFamily = FontFamily(font, fallbackFont)
+        val preloadResult = scope.async { subject.preload(fontFamily) }
 
         typefaceLoader.completeOne(font, Typeface.MONOSPACE)
 
-        scope.runBlockingTest {
-            preloadResult.await()
-        }
+        scope.runBlockingTest { preloadResult.await() }
 
         assertThat(typefaceLoader.pendingRequestsFor(fallbackFont)).hasSize(0)
     }
@@ -190,10 +174,7 @@
         val dispatcher = StandardTestDispatcher()
         val testScope = TestCoroutineScope(dispatcher)
 
-        val fontFamily = FontFamily(
-            font,
-            fallbackFont
-        )
+        val fontFamily = FontFamily(font, fallbackFont)
         val deferred = testScope.async { subject.preload(fontFamily) }
         testScope.testScheduler.apply {
             advanceTimeBy(Font.MaximumAsyncTimeoutMillis)
@@ -208,101 +189,70 @@
     @OptIn(ExperimentalCoroutinesApi::class)
     @Test
     fun whenOptionalFontFound_preload_doesNotResolveAsyncFont() {
-        val optionalFont = OptionalFauxFont(
-            typefaceLoader,
-            Typeface.DEFAULT,
-            FontWeight.Normal,
-            FontStyle.Normal
-        )
+        val optionalFont =
+            OptionalFauxFont(typefaceLoader, Typeface.DEFAULT, FontWeight.Normal, FontStyle.Normal)
         val fallbackFont = AsyncFauxFont(typefaceLoader, FontWeight.Normal, FontStyle.Normal)
         val dispatcher = TestCoroutineDispatcher()
         val testScope = TestCoroutineScope(dispatcher)
 
-        val fontFamily = FontFamily(
-            optionalFont,
-            fallbackFont
-        )
-        val preloadResult = testScope.async {
-            subject.preload(fontFamily)
-        }
+        val fontFamily = FontFamily(optionalFont, fallbackFont)
+        val preloadResult = testScope.async { subject.preload(fontFamily) }
 
-        scope.runBlockingTest {
-            preloadResult.await()
-        }
+        scope.runBlockingTest { preloadResult.await() }
 
         assertThat(typefaceLoader.pendingRequestsFor(fallbackFont)).hasSize(0)
-        val typefaceResult = typefaceCache.getImmutableResultFor(
-            fontFamily,
-            fontLoader = fontLoader
-        )
+        val typefaceResult =
+            typefaceCache.getImmutableResultFor(fontFamily, fontLoader = fontLoader)
         assertThat(typefaceResult).isSameInstanceAs(Typeface.DEFAULT)
     }
 
     @OptIn(ExperimentalCoroutinesApi::class)
     @Test
     fun whenOptionalFontNotFound_preload_doesResolveAsyncFont() {
-        val optionalFont = OptionalFauxFont(
-            typefaceLoader,
-            null,
-            FontWeight.Normal,
-            FontStyle.Normal
-        )
+        val optionalFont =
+            OptionalFauxFont(typefaceLoader, null, FontWeight.Normal, FontStyle.Normal)
         val fallbackFont = AsyncFauxFont(typefaceLoader, FontWeight.Normal, FontStyle.Normal)
         val dispatcher = TestCoroutineDispatcher()
         val testScope = TestCoroutineScope(dispatcher)
-        val fontFamily = FontFamily(
-            optionalFont,
-            fallbackFont
-        )
-        val preloadResult = testScope.async {
-            subject.preload(fontFamily)
-        }
+        val fontFamily = FontFamily(optionalFont, fallbackFont)
+        val preloadResult = testScope.async { subject.preload(fontFamily) }
         testScope.runCurrent() // past yield on optionalFont
         typefaceLoader.completeOne(fallbackFont, Typeface.MONOSPACE)
 
-        scope.runBlockingTest {
-            preloadResult.await()
-        }
+        scope.runBlockingTest { preloadResult.await() }
 
         assertThat(typefaceLoader.pendingRequestsFor(fallbackFont)).hasSize(0)
-        val typefaceResult = typefaceCache.getImmutableResultFor(
-            fontFamily,
-            fontLoader = fontLoader
-        )
+        val typefaceResult =
+            typefaceCache.getImmutableResultFor(fontFamily, fontLoader = fontLoader)
         assertThat(typefaceResult).isSameInstanceAs(Typeface.MONOSPACE)
     }
 
     @OptIn(ExperimentalCoroutinesApi::class)
     @Test
     fun whenBlockingFont_neverResolvesAsync() {
-        val blockingFont = BlockingFauxFont(
-            typefaceLoader,
-            Typeface.DEFAULT_BOLD,
-            FontWeight.Bold,
-            FontStyle.Normal
-        )
+        val blockingFont =
+            BlockingFauxFont(
+                typefaceLoader,
+                Typeface.DEFAULT_BOLD,
+                FontWeight.Bold,
+                FontStyle.Normal
+            )
         val fallbackFont = AsyncFauxFont(typefaceLoader, FontWeight.Bold, FontStyle.Normal)
         val dispatcher = TestCoroutineDispatcher()
         val testScope = TestCoroutineScope(dispatcher)
 
-        val fontFamily = FontFamily(
-            blockingFont,
-            fallbackFont
-        )
-        val preloadResult = testScope.async {
-            subject.preload(fontFamily)
-        }
+        val fontFamily = FontFamily(blockingFont, fallbackFont)
+        val preloadResult = testScope.async { subject.preload(fontFamily) }
 
-        scope.runBlockingTest {
-            preloadResult.await()
-        }
+        scope.runBlockingTest { preloadResult.await() }
 
         assertThat(typefaceLoader.pendingRequestsFor(fallbackFont)).hasSize(0)
-        val typefaceResult = typefaceCache.getImmutableResultFor(
-            fontFamily,
-            fontWeight = FontWeight.Bold,
-            fontLoader = fontLoader
-        )
+        val typefaceResult =
+            typefaceCache.getImmutableResultFor(
+                fontFamily,
+                fontWeight = FontWeight.Bold,
+                fontLoader = fontLoader
+            )
         assertThat(typefaceResult).isSameInstanceAs(Typeface.DEFAULT_BOLD)
     }
 
diff --git a/compose/ui/ui-text/src/androidInstrumentedTest/kotlin/androidx/compose/ui/text/font/FontFamilyResolverImplTest.kt b/compose/ui/ui-text/src/androidInstrumentedTest/kotlin/androidx/compose/ui/text/font/FontFamilyResolverImplTest.kt
index 6a0b85b..f66bee2 100644
--- a/compose/ui/ui-text/src/androidInstrumentedTest/kotlin/androidx/compose/ui/text/font/FontFamilyResolverImplTest.kt
+++ b/compose/ui/ui-text/src/androidInstrumentedTest/kotlin/androidx/compose/ui/text/font/FontFamilyResolverImplTest.kt
@@ -74,15 +74,14 @@
     ) {
         val injectedContext = scope.coroutineContext.minusKey(CoroutineExceptionHandler)
 
-        subject = FontFamilyResolverImpl(
-            fontLoader,
-            platformResolveInterceptor = platformResolveInterceptor,
-            typefaceRequestCache = typefaceCache,
-            fontListFontFamilyTypefaceAdapter = FontListFontFamilyTypefaceAdapter(
-                asyncTypefaceCache,
-                injectedContext
+        subject =
+            FontFamilyResolverImpl(
+                fontLoader,
+                platformResolveInterceptor = platformResolveInterceptor,
+                typefaceRequestCache = typefaceCache,
+                fontListFontFamilyTypefaceAdapter =
+                    FontListFontFamilyTypefaceAdapter(asyncTypefaceCache, injectedContext)
             )
-        )
     }
 
     private fun resolveAsTypeface(
@@ -91,12 +90,7 @@
         fontStyle: FontStyle = FontStyle.Normal,
         fontSynthesis: FontSynthesis = FontSynthesis.All,
     ): Typeface {
-        return subject.resolve(
-            fontFamily,
-            fontWeight,
-            fontStyle,
-            fontSynthesis
-        ).value as Typeface
+        return subject.resolve(fontFamily, fontWeight, fontStyle, fontSynthesis).value as Typeface
     }
 
     @Test
@@ -122,10 +116,7 @@
 
     @Test
     fun fontWeightBoldFontStyleItalicCreatesBoldItalicFont() {
-        val typeface = resolveAsTypeface(
-            fontStyle = FontStyle.Italic,
-            fontWeight = FontWeight.Bold
-        )
+        val typeface = resolveAsTypeface(fontStyle = FontStyle.Italic, fontWeight = FontWeight.Bold)
         assertThat(typeface).hasWeightAndStyle(FontWeight.Bold, FontStyle.Italic)
     }
 
@@ -141,20 +132,19 @@
 
     @Test
     fun getTypefaceStyleSnapToNormalFor100to500() {
-        val fontWeights = arrayOf(
-            FontWeight.W100,
-            FontWeight.W200,
-            FontWeight.W300,
-            FontWeight.W400,
-            FontWeight.W500
-        )
+        val fontWeights =
+            arrayOf(
+                FontWeight.W100,
+                FontWeight.W200,
+                FontWeight.W300,
+                FontWeight.W400,
+                FontWeight.W500
+            )
 
         for (fontWeight in fontWeights) {
             for (fontStyle in FontStyle.values()) {
-                val typefaceStyle = resolveAsTypeface(
-                    fontWeight = fontWeight,
-                    fontStyle = fontStyle
-                )
+                val typefaceStyle =
+                    resolveAsTypeface(fontWeight = fontWeight, fontStyle = fontStyle)
                 assertThat(typefaceStyle).hasWeightAndStyle(fontWeight, fontStyle)
             }
         }
@@ -162,19 +152,13 @@
 
     @Test
     fun getTypefaceStyleSnapToBoldFor600to900() {
-        val fontWeights = arrayOf(
-            FontWeight.W600,
-            FontWeight.W700,
-            FontWeight.W800,
-            FontWeight.W900
-        )
+        val fontWeights =
+            arrayOf(FontWeight.W600, FontWeight.W700, FontWeight.W800, FontWeight.W900)
 
         for (fontWeight in fontWeights) {
             for (fontStyle in FontStyle.values()) {
-                val typefaceStyle = resolveAsTypeface(
-                    fontWeight = fontWeight,
-                    fontStyle = fontStyle
-                )
+                val typefaceStyle =
+                    resolveAsTypeface(fontWeight = fontWeight, fontStyle = fontStyle)
 
                 assertThat(typefaceStyle).hasWeightAndStyle(fontWeight, fontStyle)
             }
@@ -184,20 +168,18 @@
     @Test
     @SdkSuppress(maxSdkVersion = 27)
     fun fontWeights100To500SnapToNormalBeforeApi28() {
-        val fontWeights = arrayOf(
-            FontWeight.W100,
-            FontWeight.W200,
-            FontWeight.W300,
-            FontWeight.W400,
-            FontWeight.W500
-        )
+        val fontWeights =
+            arrayOf(
+                FontWeight.W100,
+                FontWeight.W200,
+                FontWeight.W300,
+                FontWeight.W400,
+                FontWeight.W500
+            )
 
         for (fontWeight in fontWeights) {
             for (fontStyle in FontStyle.values()) {
-                val typeface = resolveAsTypeface(
-                    fontWeight = fontWeight,
-                    fontStyle = fontStyle
-                )
+                val typeface = resolveAsTypeface(fontWeight = fontWeight, fontStyle = fontStyle)
 
                 assertThat(typeface).hasWeightAndStyle(fontWeight, fontStyle)
             }
@@ -207,19 +189,12 @@
     @Test
     @SdkSuppress(maxSdkVersion = 27)
     fun fontWeights600To900SnapToBoldBeforeApi28() {
-        val fontWeights = arrayOf(
-            FontWeight.W600,
-            FontWeight.W700,
-            FontWeight.W800,
-            FontWeight.W900
-        )
+        val fontWeights =
+            arrayOf(FontWeight.W600, FontWeight.W700, FontWeight.W800, FontWeight.W900)
 
         for (fontWeight in fontWeights) {
             for (fontStyle in FontStyle.values()) {
-                val typeface = resolveAsTypeface(
-                    fontWeight = fontWeight,
-                    fontStyle = fontStyle
-                )
+                val typeface = resolveAsTypeface(fontWeight = fontWeight, fontStyle = fontStyle)
                 assertThat(typeface).hasWeightAndStyle(fontWeight, fontStyle)
             }
         }
@@ -230,10 +205,7 @@
     fun typefaceCreatedWithCorrectFontWeightAndFontStyle() {
         for (fontWeight in FontWeight.values) {
             for (fontStyle in FontStyle.values()) {
-                val typeface = resolveAsTypeface(
-                    fontWeight = fontWeight,
-                    fontStyle = fontStyle
-                )
+                val typeface = resolveAsTypeface(fontWeight = fontWeight, fontStyle = fontStyle)
 
                 assertThat(typeface).hasWeightAndStyle(fontWeight, fontStyle)
             }
@@ -260,11 +232,12 @@
 
         val fontFamily = FontTestData.FONT_100_REGULAR.toFontFamily()
 
-        val typeface = resolveAsTypeface(
-            fontFamily = fontFamily,
-            fontStyle = FontStyle.Italic,
-            fontWeight = FontWeight.Bold
-        )
+        val typeface =
+            resolveAsTypeface(
+                fontFamily = fontFamily,
+                fontStyle = FontStyle.Italic,
+                fontWeight = FontWeight.Bold
+            )
 
         assertThat(typeface).hasWeightAndStyle(FontWeight.Bold, FontStyle.Italic)
         assertThat(typeface.bitmap()).isNotEqualToBitmap(defaultTypeface.bitmap())
@@ -273,34 +246,36 @@
     @Test
     @MediumTest
     fun customSingleFontFamilyExactMatch() {
-        val fontFamily = FontFamily(
-            FontTestData.FONT_100_REGULAR,
-            FontTestData.FONT_100_ITALIC,
-            FontTestData.FONT_200_REGULAR,
-            FontTestData.FONT_200_ITALIC,
-            FontTestData.FONT_300_REGULAR,
-            FontTestData.FONT_300_ITALIC,
-            FontTestData.FONT_400_REGULAR,
-            FontTestData.FONT_400_ITALIC,
-            FontTestData.FONT_500_REGULAR,
-            FontTestData.FONT_500_ITALIC,
-            FontTestData.FONT_600_REGULAR,
-            FontTestData.FONT_600_ITALIC,
-            FontTestData.FONT_700_REGULAR,
-            FontTestData.FONT_700_ITALIC,
-            FontTestData.FONT_800_REGULAR,
-            FontTestData.FONT_800_ITALIC,
-            FontTestData.FONT_900_REGULAR,
-            FontTestData.FONT_900_ITALIC
-        )
+        val fontFamily =
+            FontFamily(
+                FontTestData.FONT_100_REGULAR,
+                FontTestData.FONT_100_ITALIC,
+                FontTestData.FONT_200_REGULAR,
+                FontTestData.FONT_200_ITALIC,
+                FontTestData.FONT_300_REGULAR,
+                FontTestData.FONT_300_ITALIC,
+                FontTestData.FONT_400_REGULAR,
+                FontTestData.FONT_400_ITALIC,
+                FontTestData.FONT_500_REGULAR,
+                FontTestData.FONT_500_ITALIC,
+                FontTestData.FONT_600_REGULAR,
+                FontTestData.FONT_600_ITALIC,
+                FontTestData.FONT_700_REGULAR,
+                FontTestData.FONT_700_ITALIC,
+                FontTestData.FONT_800_REGULAR,
+                FontTestData.FONT_800_ITALIC,
+                FontTestData.FONT_900_REGULAR,
+                FontTestData.FONT_900_ITALIC
+            )
 
         for (fontWeight in FontWeight.values) {
             for (fontStyle in FontStyle.values()) {
-                val typeface = resolveAsTypeface(
-                    fontWeight = fontWeight,
-                    fontStyle = fontStyle,
-                    fontFamily = fontFamily
-                )
+                val typeface =
+                    resolveAsTypeface(
+                        fontWeight = fontWeight,
+                        fontStyle = fontStyle,
+                        fontFamily = fontFamily
+                    )
 
                 assertThat(typeface).isNotNull()
                 assertThat(typeface).isTypefaceOf(fontWeight = fontWeight, fontStyle = fontStyle)
@@ -375,15 +350,8 @@
     @Test
     fun resultsAreEvicted_whenCacheOverfills_cacheSize16() {
         val font = BlockingFauxFont(typefaceLoader, Typeface.MONOSPACE, FontWeight.W100)
-        val font800 = BlockingFauxFont(
-            typefaceLoader,
-            Typeface.SANS_SERIF,
-            FontWeight.W800
-        )
-        val fontFamily = FontFamily(
-            font,
-            font800
-        )
+        val font800 = BlockingFauxFont(typefaceLoader, Typeface.SANS_SERIF, FontWeight.W800)
+        val fontFamily = FontFamily(font, font800)
 
         subject.resolve(fontFamily, FontWeight.W100)
 
@@ -391,42 +359,43 @@
             // don't use test resolver for cache busting
             subject.resolve(fontFamily, FontWeight(weight))
         }
-        assertThat(typefaceCache.get(
-            TypefaceRequest(
-                fontFamily,
-                FontWeight.W100,
-                FontStyle.Normal,
-                FontSynthesis.All,
-                fontLoader.cacheKey
-            ))).isNull()
+        assertThat(
+                typefaceCache.get(
+                    TypefaceRequest(
+                        fontFamily,
+                        FontWeight.W100,
+                        FontStyle.Normal,
+                        FontSynthesis.All,
+                        fontLoader.cacheKey
+                    )
+                )
+            )
+            .isNull()
     }
 
     @Test
     fun resultsAreNotEvicted_whenCacheOverfills_ifUsedRecently_cacheSize16() {
         val font = BlockingFauxFont(typefaceLoader, Typeface.MONOSPACE, FontWeight.W100)
-        val font800 = BlockingFauxFont(
-            typefaceLoader,
-            Typeface.SANS_SERIF,
-            FontWeight.W800
-        )
-        val fontFamily = FontFamily(
-            font,
-            font800
-        )
+        val font800 = BlockingFauxFont(typefaceLoader, Typeface.SANS_SERIF, FontWeight.W800)
+        val fontFamily = FontFamily(font, font800)
 
         subject.resolve(fontFamily, FontWeight.W100)
         for (weight in 801..816) {
             subject.resolve(fontFamily, FontWeight.W100)
             subject.resolve(fontFamily, FontWeight(weight))
         }
-        assertThat(typefaceCache.get(
-            TypefaceRequest(
-                fontFamily,
-                FontWeight.W100,
-                FontStyle.Normal,
-                FontSynthesis.All,
-                fontLoader.cacheKey
-            ))).isNotNull()
+        assertThat(
+                typefaceCache.get(
+                    TypefaceRequest(
+                        fontFamily,
+                        FontWeight.W100,
+                        FontStyle.Normal,
+                        FontSynthesis.All,
+                        fontLoader.cacheKey
+                    )
+                )
+            )
+            .isNotNull()
     }
 
     @Test
@@ -434,16 +403,18 @@
         val fontFamily = FontTestData.FONT_100_REGULAR.toFontFamily()
         val typeface = resolveAsTypeface(fontFamily)
         /* definitely not same instance :) */
-        val newFontLoader = object : PlatformFontLoader {
-            override fun loadBlocking(font: Font): Any = Typeface.DEFAULT
-            override suspend fun awaitLoad(font: Font): Any = Typeface.DEFAULT
-            override val cacheKey: String = "Not the default resource loader"
-        }
-        val otherTypeface = UncachedFontFamilyResolver(
-            newFontLoader,
-            PlatformResolveInterceptor.Default
-        )
-            .resolve(fontFamily).value as Typeface
+        val newFontLoader =
+            object : PlatformFontLoader {
+                override fun loadBlocking(font: Font): Any = Typeface.DEFAULT
+
+                override suspend fun awaitLoad(font: Font): Any = Typeface.DEFAULT
+
+                override val cacheKey: String = "Not the default resource loader"
+            }
+        val otherTypeface =
+            UncachedFontFamilyResolver(newFontLoader, PlatformResolveInterceptor.Default)
+                .resolve(fontFamily)
+                .value as Typeface
 
         assertThat(typeface).isNotSameInstanceAs(otherTypeface)
     }
@@ -451,45 +422,54 @@
     @Test
     fun changingResourceLoader_toAndroidResourceLoader_doesNotInvalidateCache() {
         var first = true
-        val unstableLoader = object : AndroidFont.TypefaceLoader {
-            override fun loadBlocking(context: Context, font: AndroidFont): Typeface? {
-                return if (first) {
-                    first = false
-                    Typeface.DEFAULT
-                } else {
-                    Typeface.MONOSPACE
+        val unstableLoader =
+            object : AndroidFont.TypefaceLoader {
+                override fun loadBlocking(context: Context, font: AndroidFont): Typeface? {
+                    return if (first) {
+                        first = false
+                        Typeface.DEFAULT
+                    } else {
+                        Typeface.MONOSPACE
+                    }
+                }
+
+                override suspend fun awaitLoad(context: Context, font: AndroidFont): Typeface? {
+                    TODO("Not yet implemented")
                 }
             }
-
-            override suspend fun awaitLoad(context: Context, font: AndroidFont): Typeface? {
-                TODO("Not yet implemented")
-            }
-        }
-        val fontFamily = FontFamily(
-            object : AndroidFont(
-                FontLoadingStrategy.Blocking,
-                unstableLoader,
-                FontVariation.Settings()
-            ) {
-                override val weight: FontWeight = FontWeight.Normal
-                override val style: FontStyle = FontStyle.Normal
-            }
-        )
+        val fontFamily =
+            FontFamily(
+                object :
+                    AndroidFont(
+                        FontLoadingStrategy.Blocking,
+                        unstableLoader,
+                        FontVariation.Settings()
+                    ) {
+                    override val weight: FontWeight = FontWeight.Normal
+                    override val style: FontStyle = FontStyle.Normal
+                }
+            )
         val firstAndroidResourceLoader = AndroidFontLoader(context)
         val androidResolveInterceptor = AndroidFontResolveInterceptor(context)
-        val typeface = FontFamilyResolverImpl(
-            fontLoader,
-            androidResolveInterceptor,
-            typefaceCache,
-            FontListFontFamilyTypefaceAdapter(asyncTypefaceCache)
-        ).resolve(fontFamily).value as Typeface
+        val typeface =
+            FontFamilyResolverImpl(
+                    fontLoader,
+                    androidResolveInterceptor,
+                    typefaceCache,
+                    FontListFontFamilyTypefaceAdapter(asyncTypefaceCache)
+                )
+                .resolve(fontFamily)
+                .value as Typeface
         val secondAndroidResourceLoader = AndroidFontLoader(context)
-        val otherTypeface = FontFamilyResolverImpl(
-            fontLoader,
-            androidResolveInterceptor,
-            typefaceCache,
-            FontListFontFamilyTypefaceAdapter(asyncTypefaceCache)
-        ).resolve(fontFamily).value as Typeface
+        val otherTypeface =
+            FontFamilyResolverImpl(
+                    fontLoader,
+                    androidResolveInterceptor,
+                    typefaceCache,
+                    FontListFontFamilyTypefaceAdapter(asyncTypefaceCache)
+                )
+                .resolve(fontFamily)
+                .value as Typeface
 
         assertThat(firstAndroidResourceLoader).isNotSameInstanceAs(secondAndroidResourceLoader)
         assertThat(typeface).isSameInstanceAs(otherTypeface)
@@ -512,12 +492,13 @@
     fun fontSynthesisDefault_synthesizeTheFontToItalicBold() {
         val fontFamily = FontTestData.FONT_100_REGULAR.toFontFamily()
 
-        val typeface = resolveAsTypeface(
-            fontFamily = fontFamily,
-            fontWeight = FontWeight.Bold,
-            fontStyle = FontStyle.Italic,
-            fontSynthesis = FontSynthesis.All
-        )
+        val typeface =
+            resolveAsTypeface(
+                fontFamily = fontFamily,
+                fontWeight = FontWeight.Bold,
+                fontStyle = FontStyle.Italic,
+                fontSynthesis = FontSynthesis.All
+            )
 
         assertThat(typeface).hasWeightAndStyle(FontWeight.Bold, FontStyle.Italic)
     }
@@ -526,12 +507,13 @@
     fun fontSynthesisStyle_synthesizeTheFontToItalic() {
         val fontFamily = FontTestData.FONT_100_REGULAR.toFontFamily()
 
-        val typeface = resolveAsTypeface(
-            fontFamily = fontFamily,
-            fontWeight = FontWeight.Bold,
-            fontStyle = FontStyle.Italic,
-            fontSynthesis = FontSynthesis.Style
-        )
+        val typeface =
+            resolveAsTypeface(
+                fontFamily = fontFamily,
+                fontWeight = FontWeight.Bold,
+                fontStyle = FontStyle.Italic,
+                fontSynthesis = FontSynthesis.Style
+            )
 
         assertThat(typeface).hasWeightAndStyle(FontWeight.W100, FontStyle.Italic)
     }
@@ -540,12 +522,13 @@
     fun fontSynthesisWeight_synthesizeTheFontToBold() {
         val fontFamily = FontTestData.FONT_100_REGULAR.toFontFamily()
 
-        val typeface = resolveAsTypeface(
-            fontFamily = fontFamily,
-            fontWeight = FontWeight.Bold,
-            fontStyle = FontStyle.Italic,
-            fontSynthesis = FontSynthesis.Weight
-        )
+        val typeface =
+            resolveAsTypeface(
+                fontFamily = fontFamily,
+                fontWeight = FontWeight.Bold,
+                fontStyle = FontStyle.Italic,
+                fontSynthesis = FontSynthesis.Weight
+            )
 
         assertThat(typeface).hasWeightAndStyle(FontWeight.Bold, FontStyle.Normal)
     }
@@ -554,12 +537,13 @@
     fun fontSynthesisStyle_forMatchingItalicDoesNotSynthesize() {
         val fontFamily = FontTestData.FONT_100_ITALIC.toFontFamily()
 
-        val typeface = resolveAsTypeface(
-            fontFamily = fontFamily,
-            fontWeight = FontWeight.W700,
-            fontStyle = FontStyle.Italic,
-            fontSynthesis = FontSynthesis.Style
-        )
+        val typeface =
+            resolveAsTypeface(
+                fontFamily = fontFamily,
+                fontWeight = FontWeight.W700,
+                fontStyle = FontStyle.Italic,
+                fontSynthesis = FontSynthesis.Style
+            )
 
         assertThat(typeface).hasWeightAndStyle(FontWeight.W100, FontStyle.Normal)
     }
@@ -568,17 +552,19 @@
     fun fontSynthesisAll_doesNotSynthesizeIfFontIsTheSame_beforeApi28() {
         val fontFamily = FontTestData.FONT_700_ITALIC.toFontFamily()
 
-        val typeface = resolveAsTypeface(
-            fontFamily = fontFamily,
-            fontWeight = FontWeight.W700,
-            fontStyle = FontStyle.Italic,
-            fontSynthesis = FontSynthesis.All
-        )
-        val expectedWeight = if (Build.VERSION.SDK_INT < 23) {
-            FontWeight.Normal
-        } else {
-            FontWeight.W700
-        }
+        val typeface =
+            resolveAsTypeface(
+                fontFamily = fontFamily,
+                fontWeight = FontWeight.W700,
+                fontStyle = FontStyle.Italic,
+                fontSynthesis = FontSynthesis.All
+            )
+        val expectedWeight =
+            if (Build.VERSION.SDK_INT < 23) {
+                FontWeight.Normal
+            } else {
+                FontWeight.W700
+            }
 
         assertThat(typeface).hasWeightAndStyle(expectedWeight, FontStyle.Normal)
     }
@@ -587,12 +573,13 @@
     fun fontSynthesisNone_doesNotSynthesize() {
         val fontFamily = FontTestData.FONT_100_REGULAR.toFontFamily()
 
-        val typeface = resolveAsTypeface(
-            fontFamily = fontFamily,
-            fontWeight = FontWeight.Bold,
-            fontStyle = FontStyle.Italic,
-            fontSynthesis = FontSynthesis.None
-        )
+        val typeface =
+            resolveAsTypeface(
+                fontFamily = fontFamily,
+                fontWeight = FontWeight.Bold,
+                fontStyle = FontStyle.Italic,
+                fontSynthesis = FontSynthesis.None
+            )
 
         assertThat(typeface).hasWeightAndStyle(FontWeight.W100, FontStyle.Normal)
     }
@@ -602,17 +589,19 @@
         val fontFamily = FontTestData.FONT_100_REGULAR.toFontFamily()
 
         // Less than 600 is not synthesized
-        val typeface500 = resolveAsTypeface(
-            fontFamily = fontFamily,
-            fontWeight = FontWeight.W500,
-            fontSynthesis = FontSynthesis.Weight
-        )
+        val typeface500 =
+            resolveAsTypeface(
+                fontFamily = fontFamily,
+                fontWeight = FontWeight.W500,
+                fontSynthesis = FontSynthesis.Weight
+            )
         // 600 or more is synthesized
-        val typeface600 = resolveAsTypeface(
-            fontFamily = fontFamily,
-            fontWeight = FontWeight.W600,
-            fontSynthesis = FontSynthesis.Weight
-        )
+        val typeface600 =
+            resolveAsTypeface(
+                fontFamily = fontFamily,
+                fontWeight = FontWeight.W600,
+                fontSynthesis = FontSynthesis.Weight
+            )
 
         assertThat(typeface500).hasWeightAndStyle(FontWeight.W100, FontStyle.Normal)
         assertThat(typeface600).hasWeightAndStyle(FontWeight.W600, FontStyle.Normal)
@@ -625,18 +614,16 @@
         val typefaceLoader = AsyncTestTypefaceLoader()
 
         val w700Font = BlockingFauxFont(typefaceLoader, Typeface.DEFAULT, weight = FontWeight.W700)
-        val fontFamily = FontFamily(
-            BlockingFauxFont(typefaceLoader, Typeface.DEFAULT, weight = FontWeight.W400),
-            BlockingFauxFont(typefaceLoader, Typeface.DEFAULT, weight = FontWeight.W500),
-            BlockingFauxFont(typefaceLoader, Typeface.DEFAULT, weight = FontWeight.W600),
-            w700Font,
-            BlockingFauxFont(typefaceLoader, Typeface.DEFAULT, weight = FontWeight.W800),
-            BlockingFauxFont(typefaceLoader, Typeface.DEFAULT, weight = FontWeight.W900),
-        )
-        resolveAsTypeface(
-            fontFamily = fontFamily,
-            fontWeight = FontWeight.W400
-        )
+        val fontFamily =
+            FontFamily(
+                BlockingFauxFont(typefaceLoader, Typeface.DEFAULT, weight = FontWeight.W400),
+                BlockingFauxFont(typefaceLoader, Typeface.DEFAULT, weight = FontWeight.W500),
+                BlockingFauxFont(typefaceLoader, Typeface.DEFAULT, weight = FontWeight.W600),
+                w700Font,
+                BlockingFauxFont(typefaceLoader, Typeface.DEFAULT, weight = FontWeight.W800),
+                BlockingFauxFont(typefaceLoader, Typeface.DEFAULT, weight = FontWeight.W900),
+            )
+        resolveAsTypeface(fontFamily = fontFamily, fontWeight = FontWeight.W400)
 
         assertThat(typefaceLoader.blockingRequests).containsExactly(w700Font)
     }
@@ -645,10 +632,7 @@
     fun androidFontResolveInterceptor_doesNotAffectTheFontStyle() {
         initializeSubject(AndroidFontResolveInterceptor(accessibilityFontWeightAdjustment))
 
-        val typeface = resolveAsTypeface(
-            fontWeight = FontWeight.W400,
-            fontStyle = FontStyle.Italic
-        )
+        val typeface = resolveAsTypeface(fontWeight = FontWeight.W400, fontStyle = FontStyle.Italic)
 
         assertThat(typeface).hasWeightAndStyle(FontWeight.W700, FontStyle.Italic)
     }
@@ -656,15 +640,14 @@
     @Test
     fun platformResolveInterceptor_affectsTheResolvedFontStyle() {
         initializeSubject(
-            platformResolveInterceptor = object : PlatformResolveInterceptor {
-                override fun interceptFontStyle(fontStyle: FontStyle) = FontStyle.Italic
-            }
+            platformResolveInterceptor =
+                object : PlatformResolveInterceptor {
+                    override fun interceptFontStyle(fontStyle: FontStyle) = FontStyle.Italic
+                }
         )
 
-        val typeface = resolveAsTypeface(
-            fontWeight = FontWeight.Normal,
-            fontStyle = FontStyle.Normal
-        )
+        val typeface =
+            resolveAsTypeface(fontWeight = FontWeight.Normal, fontStyle = FontStyle.Normal)
 
         assertThat(typeface).hasWeightAndStyle(FontWeight.Normal, FontStyle.Italic)
     }
@@ -672,20 +655,22 @@
     @Test
     fun platformResolveInterceptor_affectsTheResolvedFontSynthesis() {
         initializeSubject(
-            platformResolveInterceptor = object : PlatformResolveInterceptor {
-                override fun interceptFontSynthesis(fontSynthesis: FontSynthesis) =
-                    FontSynthesis.All
-            }
+            platformResolveInterceptor =
+                object : PlatformResolveInterceptor {
+                    override fun interceptFontSynthesis(fontSynthesis: FontSynthesis) =
+                        FontSynthesis.All
+                }
         )
 
         val fontFamily = FontTestData.FONT_100_REGULAR.toFontFamily()
 
-        val typeface = resolveAsTypeface(
-            fontFamily = fontFamily,
-            fontWeight = FontWeight.Bold,
-            fontStyle = FontStyle.Italic,
-            fontSynthesis = FontSynthesis.None
-        )
+        val typeface =
+            resolveAsTypeface(
+                fontFamily = fontFamily,
+                fontWeight = FontWeight.Bold,
+                fontStyle = FontStyle.Italic,
+                fontSynthesis = FontSynthesis.None
+            )
 
         assertThat(typeface).hasWeightAndStyle(FontWeight.Bold, FontStyle.Italic)
     }
@@ -693,10 +678,11 @@
     @Test
     fun platformResolveInterceptor_affectsTheResolvedFontFamily() {
         initializeSubject(
-            platformResolveInterceptor = object : PlatformResolveInterceptor {
-                override fun interceptFontFamily(fontFamily: FontFamily?) =
-                    FontTestData.FONT_100_REGULAR.toFontFamily()
-            }
+            platformResolveInterceptor =
+                object : PlatformResolveInterceptor {
+                    override fun interceptFontFamily(fontFamily: FontFamily?) =
+                        FontTestData.FONT_100_REGULAR.toFontFamily()
+                }
         )
 
         val typeface = resolveAsTypeface(fontFamily = FontFamily.Cursive)
@@ -713,11 +699,7 @@
         val asyncFauxFontW700 = AsyncFauxFont(loader, FontWeight.W700)
         val blockingFauxFontW400 = BlockingFauxFont(loader, Typeface.DEFAULT, FontWeight.W400)
 
-        val fontFamily = FontFamily(
-            asyncFauxFontW400,
-            blockingFauxFontW400,
-            asyncFauxFontW700
-        )
+        val fontFamily = FontFamily(asyncFauxFontW400, blockingFauxFontW400, asyncFauxFontW700)
 
         val fallbackTypeface = resolveAsTypeface(fontFamily, FontWeight.W400)
         assertThat(fallbackTypeface).hasWeightAndStyle(FontWeight.W700, FontStyle.Normal)
@@ -738,11 +720,7 @@
         val asyncFauxFontW700 = AsyncFauxFont(loader, FontWeight.W700)
         val blockingFauxFontW700 = BlockingFauxFont(loader, Typeface.SANS_SERIF, FontWeight.W700)
 
-        val fontFamily = FontFamily(
-            asyncFauxFontW400,
-            asyncFauxFontW700,
-            blockingFauxFontW700
-        )
+        val fontFamily = FontFamily(asyncFauxFontW400, asyncFauxFontW700, blockingFauxFontW700)
 
         val blockingTypeface = resolveAsTypeface(fontFamily, FontWeight.W400)
         assertThat(blockingTypeface).isSameInstanceAs(Typeface.SANS_SERIF)
@@ -763,11 +741,8 @@
 
         initializeSubject()
 
-        val fontFamily = FontFamily(
-            optionalFauxFontW400,
-            optionalFauxFontW700,
-            blockingFauxFontW700
-        )
+        val fontFamily =
+            FontFamily(optionalFauxFontW400, optionalFauxFontW700, blockingFauxFontW700)
 
         val typefaceNoAdjustment = resolveAsTypeface(fontFamily, FontWeight.W400)
         assertThat(typefaceNoAdjustment).isSameInstanceAs(Typeface.MONOSPACE)
diff --git a/compose/ui/ui-text/src/androidInstrumentedTest/kotlin/androidx/compose/ui/text/font/FontListFontFamilyTypefaceAdapterPreloadTest.kt b/compose/ui/ui-text/src/androidInstrumentedTest/kotlin/androidx/compose/ui/text/font/FontListFontFamilyTypefaceAdapterPreloadTest.kt
index c3ddac1..819517b 100644
--- a/compose/ui/ui-text/src/androidInstrumentedTest/kotlin/androidx/compose/ui/text/font/FontListFontFamilyTypefaceAdapterPreloadTest.kt
+++ b/compose/ui/ui-text/src/androidInstrumentedTest/kotlin/androidx/compose/ui/text/font/FontListFontFamilyTypefaceAdapterPreloadTest.kt
@@ -45,8 +45,7 @@
 
     private lateinit var typefaceLoader: AsyncTestTypefaceLoader
     private lateinit var subject: FontListFontFamilyTypefaceAdapter
-    @OptIn(ExperimentalCoroutinesApi::class)
-    private lateinit var scope: TestCoroutineScope
+    @OptIn(ExperimentalCoroutinesApi::class) private lateinit var scope: TestCoroutineScope
     private lateinit var cache: AsyncTypefaceCache
 
     private val context = InstrumentationRegistry.getInstrumentation().context
@@ -104,9 +103,7 @@
         val asyncFont = AsyncFauxFont(typefaceLoader)
         val blockingFont = BlockingFauxFont(typefaceLoader, Typeface.MONOSPACE)
         val fontFamily = FontFamily(asyncFont, blockingFont)
-        val preloadJob = scope.launch {
-            subject.preload(fontFamily, fontLoader)
-        }
+        val preloadJob = scope.launch { subject.preload(fontFamily, fontLoader) }
 
         assertThat(typefaceLoader.pendingRequests()).containsExactly(asyncFont)
         assertThat(typefaceLoader.completedRequests()).containsExactly(blockingFont)
@@ -121,9 +118,7 @@
         val blockingFont = BlockingFauxFont(typefaceLoader, Typeface.MONOSPACE)
         val blockingFont2 = BlockingFauxFont(typefaceLoader, Typeface.MONOSPACE)
         val fontFamily = FontFamily(asyncFont, blockingFont, blockingFont2)
-        val preloadJob = scope.launch {
-            subject.preload(fontFamily, fontLoader)
-        }
+        val preloadJob = scope.launch { subject.preload(fontFamily, fontLoader) }
 
         assertThat(typefaceLoader.pendingRequests()).containsExactly(asyncFont)
         assertThat(typefaceLoader.completedRequests()).containsExactly(blockingFont)
@@ -134,16 +129,11 @@
     @OptIn(ExperimentalCoroutinesApi::class)
     @Test
     fun onPreload_blockingAndAsyncFonts_differentStyles_onlyLoadsAsync() {
-        val blockingFont = BlockingFauxFont(
-            typefaceLoader,
-            Typeface.MONOSPACE,
-            weight = FontWeight.W100
-        )
+        val blockingFont =
+            BlockingFauxFont(typefaceLoader, Typeface.MONOSPACE, weight = FontWeight.W100)
         val asyncFont = AsyncFauxFont(typefaceLoader)
         val fontFamily = FontFamily(asyncFont, blockingFont)
-        val preloadJob = scope.launch {
-            subject.preload(fontFamily, fontLoader)
-        }
+        val preloadJob = scope.launch { subject.preload(fontFamily, fontLoader) }
 
         assertThat(typefaceLoader.pendingRequests()).containsExactly(asyncFont)
         typefaceLoader.completeOne(asyncFont, Typeface.SERIF)
@@ -156,9 +146,7 @@
         val asyncFont100 = AsyncFauxFont(typefaceLoader, weight = FontWeight.W100)
         val asyncFont400 = AsyncFauxFont(typefaceLoader)
         val fontFamily = FontFamily(asyncFont400, asyncFont100)
-        val preloadJob = scope.launch {
-            subject.preload(fontFamily, fontLoader)
-        }
+        val preloadJob = scope.launch { subject.preload(fontFamily, fontLoader) }
 
         assertThat(typefaceLoader.pendingRequests()).containsExactly(asyncFont400, asyncFont100)
         typefaceLoader.completeOne(asyncFont400, Typeface.SERIF)
@@ -172,9 +160,7 @@
         val asyncFont = AsyncFauxFont(typefaceLoader)
         val asyncFontFallback = AsyncFauxFont(typefaceLoader, name = "AsyncFallbackFont")
         val fontFamily = FontFamily(asyncFont, asyncFontFallback)
-        val job = scope.launch {
-            subject.preload(fontFamily, fontLoader)
-        }
+        val job = scope.launch { subject.preload(fontFamily, fontLoader) }
 
         assertThat(typefaceLoader.pendingRequests()).containsExactly(asyncFont)
         typefaceLoader.completeOne(asyncFont, Typeface.SERIF)
@@ -189,17 +175,13 @@
         val asyncFont = AsyncFauxFont(typefaceLoader)
         val asyncFontFallback = AsyncFauxFont(typefaceLoader, name = "AsyncFallbackFont")
         val fontFamily = FontFamily(asyncFont, asyncFontFallback)
-        val preloadJob = scope.async {
-            subject.preload(fontFamily, fontLoader)
-        }
+        val preloadJob = scope.async { subject.preload(fontFamily, fontLoader) }
         assertThat(typefaceLoader.pendingRequests()).containsExactly(asyncFont)
         scope.testScheduler.apply {
             advanceTimeBy(Font.MaximumAsyncTimeoutMillis)
             runCurrent()
         }
-        scope.runBlockingTest {
-            preloadJob.await()
-        }
+        scope.runBlockingTest { preloadJob.await() }
     }
 
     @OptIn(ExperimentalCoroutinesApi::class)
@@ -208,14 +190,10 @@
         val asyncFont = AsyncFauxFont(typefaceLoader)
         val asyncFontFallback = AsyncFauxFont(typefaceLoader, name = "AsyncFallbackFont")
         val fontFamily = FontFamily(asyncFont, asyncFontFallback)
-        val deferred = scope.async {
-            subject.preload(fontFamily, fontLoader)
-        }
+        val deferred = scope.async { subject.preload(fontFamily, fontLoader) }
         assertThat(typefaceLoader.pendingRequests()).containsExactly(asyncFont)
         typefaceLoader.errorOne(asyncFont, RuntimeException("Failed to load"))
-        scope.runBlockingTest {
-            deferred.await()
-        }
+        scope.runBlockingTest { deferred.await() }
     }
 
     class MyFontException : RuntimeException()
@@ -226,9 +204,7 @@
         val asyncFont = AsyncFauxFont(typefaceLoader)
         val asyncFontFallback = AsyncFauxFont(typefaceLoader, name = "AsyncFallbackFont")
         val fontFamily = FontFamily(asyncFont, asyncFontFallback)
-        val deferred = scope.async {
-            subject.preload(fontFamily, fontLoader)
-        }
+        val deferred = scope.async { subject.preload(fontFamily, fontLoader) }
         typefaceLoader.errorOne(asyncFont, MyFontException())
         scope.runBlockingTest {
             deferred.await() // should throw
@@ -253,18 +229,13 @@
         val asyncFont = AsyncFauxFont(typefaceLoader)
         val optionalFont = OptionalFauxFont(typefaceLoader, null)
         val fontFamily = FontFamily(optionalFont, asyncFont)
-        val preloadJob = scope.launch {
-            subject.preload(fontFamily, fontLoader)
-        }
+        val preloadJob = scope.launch { subject.preload(fontFamily, fontLoader) }
 
         assertThat(typefaceLoader.completedRequests()).containsExactly(optionalFont)
         assertThat(typefaceLoader.pendingRequests()).containsExactly(asyncFont)
         typefaceLoader.completeOne(asyncFont, Typeface.SERIF)
         assertThat(preloadJob.isActive).isFalse()
-        assertThat(typefaceLoader.completedRequests()).containsExactly(
-            asyncFont,
-            optionalFont
-        )
+        assertThat(typefaceLoader.completedRequests()).containsExactly(asyncFont, optionalFont)
     }
 
     @OptIn(ExperimentalCoroutinesApi::class)
@@ -274,17 +245,12 @@
         val optionalFont = OptionalFauxFont(typefaceLoader, null)
         val blockingFont = BlockingFauxFont(typefaceLoader, Typeface.MONOSPACE)
         val fontFamily = FontFamily(optionalFont, asyncFont, blockingFont)
-        val preloadJob = scope.launch {
-            subject.preload(fontFamily, fontLoader)
-        }
+        val preloadJob = scope.launch { subject.preload(fontFamily, fontLoader) }
         assertThat(typefaceLoader.pendingRequests()).containsExactly(asyncFont)
         typefaceLoader.completeOne(asyncFont, Typeface.SERIF)
         assertThat(preloadJob.isActive).isFalse()
-        assertThat(typefaceLoader.completedRequests()).containsExactly(
-            asyncFont,
-            optionalFont,
-            blockingFont
-        )
+        assertThat(typefaceLoader.completedRequests())
+            .containsExactly(asyncFont, optionalFont, blockingFont)
     }
 
     @OptIn(ExperimentalCoroutinesApi::class)
@@ -295,9 +261,7 @@
         val blockingFont = BlockingFauxFont(typefaceLoader, Typeface.MONOSPACE)
         // this is a weird order, but lets make sure it doesn't break :)
         val fontFamily = FontFamily(asyncFont, optionalFont, blockingFont)
-        val preloadJob = scope.launch {
-            subject.preload(fontFamily, fontLoader)
-        }
+        val preloadJob = scope.launch { subject.preload(fontFamily, fontLoader) }
 
         assertThat(typefaceLoader.pendingRequests()).containsExactly(asyncFont)
         typefaceLoader.completeOne(asyncFont, Typeface.SERIF)
@@ -313,9 +277,7 @@
         val blockingFont = BlockingFauxFont(typefaceLoader, Typeface.MONOSPACE)
         // this is expected order
         val fontFamily = FontFamily(optionalFont, asyncFont, blockingFont)
-        val preloadJob = scope.launch {
-            subject.preload(fontFamily, fontLoader)
-        }
+        val preloadJob = scope.launch { subject.preload(fontFamily, fontLoader) }
 
         assertThat(typefaceLoader.pendingRequests()).isEmpty()
         assertThat(preloadJob.isActive).isFalse()
diff --git a/compose/ui/ui-text/src/androidInstrumentedTest/kotlin/androidx/compose/ui/text/font/FontListFontFamilyTypefaceAdapterTest.kt b/compose/ui/ui-text/src/androidInstrumentedTest/kotlin/androidx/compose/ui/text/font/FontListFontFamilyTypefaceAdapterTest.kt
index 7a5bd38..b56aef2 100644
--- a/compose/ui/ui-text/src/androidInstrumentedTest/kotlin/androidx/compose/ui/text/font/FontListFontFamilyTypefaceAdapterTest.kt
+++ b/compose/ui/ui-text/src/androidInstrumentedTest/kotlin/androidx/compose/ui/text/font/FontListFontFamilyTypefaceAdapterTest.kt
@@ -59,8 +59,7 @@
     private lateinit var typefaceLoader: AsyncTestTypefaceLoader
     private lateinit var subject: FontListFontFamilyTypefaceAdapter
 
-    @OptIn(ExperimentalCoroutinesApi::class)
-    private lateinit var scope: TestCoroutineScope
+    @OptIn(ExperimentalCoroutinesApi::class) private lateinit var scope: TestCoroutineScope
     private lateinit var cache: AsyncTypefaceCache
 
     private val context = InstrumentationRegistry.getInstrumentation().context
@@ -91,25 +90,20 @@
         fontWeight: FontWeight = FontWeight.Normal,
         fontStyle: FontStyle = FontStyle.Normal,
         fontSynthesis: FontSynthesis = FontSynthesis.All
-    ) = TypefaceRequest(
-        this,
-        fontWeight,
-        fontStyle,
-        fontSynthesis,
-        fontLoader.cacheKey
-    )
+    ) = TypefaceRequest(this, fontWeight, fontStyle, fontSynthesis, fontLoader.cacheKey)
 
     @Test
     fun onResolve_onlyBlockingFonts_doesNotLoad() {
         val expected = Typeface.MONOSPACE
         val font = BlockingFauxFont(typefaceLoader, expected)
         val fontFamily = font.toFontFamily()
-        val result = subject.resolve(
-            fontFamily.toTypefaceRequest(),
-            fontLoader,
-            onAsyncCompletion = { error("Should not call") },
-            createDefaultTypeface = { Typeface.DEFAULT }
-        )
+        val result =
+            subject.resolve(
+                fontFamily.toTypefaceRequest(),
+                fontLoader,
+                onAsyncCompletion = { error("Should not call") },
+                createDefaultTypeface = { Typeface.DEFAULT }
+            )
         assertThat(result).isImmutableTypefaceOf(expected)
     }
 
@@ -119,12 +113,13 @@
         val blockingFont = BlockingFauxFont(typefaceLoader, expected)
         val asyncFont = AsyncFauxFont(typefaceLoader)
         val fontFamily = FontFamily(blockingFont, asyncFont)
-        val result = subject.resolve(
-            fontFamily.toTypefaceRequest(),
-            fontLoader,
-            onAsyncCompletion = { error("Should not call") },
-            createDefaultTypeface = { Typeface.DEFAULT }
-        )
+        val result =
+            subject.resolve(
+                fontFamily.toTypefaceRequest(),
+                fontLoader,
+                onAsyncCompletion = { error("Should not call") },
+                createDefaultTypeface = { Typeface.DEFAULT }
+            )
         assertThat(result).isImmutableTypefaceOf(expected)
     }
 
@@ -135,12 +130,13 @@
         doCompleteAsync: (TypefaceResult) -> Unit
     ): Pair<TypefaceResult, Deferred<TypefaceResult>> {
         val result = CompletableDeferred<TypefaceResult>()
-        val reply = subject.resolve(
-            request,
-            fontLoader,
-            onAsyncCompletion = { result.complete(it) },
-            createDefaultTypeface = { Typeface.DEFAULT }
-        )!!
+        val reply =
+            subject.resolve(
+                request,
+                fontLoader,
+                onAsyncCompletion = { result.complete(it) },
+                createDefaultTypeface = { Typeface.DEFAULT }
+            )!!
         beforeAsyncLoad(reply)
         scope.runCurrent()
         doCompleteAsync(reply)
@@ -155,15 +151,12 @@
         val blockingFont = BlockingFauxFont(typefaceLoader, Typeface.MONOSPACE)
         val fontFamily = FontFamily(asyncFont, blockingFont)
 
-        val (reply, finalResult) = doOneAsyncRequest(
-            fontFamily.toTypefaceRequest(),
-            beforeAsyncLoad = {
-                assertThat(it).currentAsyncTypefaceValue(Typeface.MONOSPACE)
-            },
-            doCompleteAsync = {
-                typefaceLoader.completeOne(asyncFont, Typeface.SERIF)
-            }
-        )
+        val (reply, finalResult) =
+            doOneAsyncRequest(
+                fontFamily.toTypefaceRequest(),
+                beforeAsyncLoad = { assertThat(it).currentAsyncTypefaceValue(Typeface.MONOSPACE) },
+                doCompleteAsync = { typefaceLoader.completeOne(asyncFont, Typeface.SERIF) }
+            )
         assertThat(reply).currentAsyncTypefaceValue(Typeface.SERIF)
         scope.runBlockingTest {
             assertThat(finalResult.await()).isImmutableTypefaceOf(Typeface.SERIF)
@@ -180,47 +173,36 @@
         val blockingFont = BlockingFauxFont(typefaceLoader, expectedInitial)
         val blockingFont2 = BlockingFauxFont(typefaceLoader, Typeface.SERIF)
         val fontFamily = FontFamily(asyncFont, blockingFont, blockingFont2)
-        val (reply, finalResult) = doOneAsyncRequest(
-            fontFamily.toTypefaceRequest(),
-            beforeAsyncLoad = {
-                assertThat(it).currentAsyncTypefaceValue(expectedInitial)
-            },
-            doCompleteAsync = {
-                typefaceLoader.completeOne(asyncFont, expected)
-            }
-        )
+        val (reply, finalResult) =
+            doOneAsyncRequest(
+                fontFamily.toTypefaceRequest(),
+                beforeAsyncLoad = { assertThat(it).currentAsyncTypefaceValue(expectedInitial) },
+                doCompleteAsync = { typefaceLoader.completeOne(asyncFont, expected) }
+            )
         assertThat(reply).currentAsyncTypefaceValue(expected)
-        scope.runBlockingTest {
-            assertThat(finalResult.await()).isImmutableTypefaceOf(expected)
-        }
+        scope.runBlockingTest { assertThat(finalResult.await()).isImmutableTypefaceOf(expected) }
         assertThat(typefaceLoader.completedRequests()).containsExactly(blockingFont, asyncFont)
     }
 
     @OptIn(ExperimentalCoroutinesApi::class)
     @Test
     fun onResolve_blockingAndAsyncFonts_differentStyles_onlyLoadsAsync() {
-        val blockingFont = BlockingFauxFont(
-            typefaceLoader,
-            Typeface.MONOSPACE,
-            weight = FontWeight.W100
-        )
+        val blockingFont =
+            BlockingFauxFont(typefaceLoader, Typeface.MONOSPACE, weight = FontWeight.W100)
         val expected = Typeface.SANS_SERIF
         val asyncFont = AsyncFauxFont(typefaceLoader)
         val fontFamily = FontFamily(asyncFont, blockingFont)
-        val (reply, finalResult) = doOneAsyncRequest(
-            fontFamily.toTypefaceRequest(),
-            beforeAsyncLoad = {
-                // this hits platform default
-                assertThat(it).currentAsyncTypefaceValue(Typeface.DEFAULT)
-            },
-            doCompleteAsync = {
-                typefaceLoader.completeOne(asyncFont, expected)
-            }
-        )
+        val (reply, finalResult) =
+            doOneAsyncRequest(
+                fontFamily.toTypefaceRequest(),
+                beforeAsyncLoad = {
+                    // this hits platform default
+                    assertThat(it).currentAsyncTypefaceValue(Typeface.DEFAULT)
+                },
+                doCompleteAsync = { typefaceLoader.completeOne(asyncFont, expected) }
+            )
         assertThat(reply).currentAsyncTypefaceValue(expected)
-        scope.runBlockingTest {
-            assertThat(finalResult.await()).isImmutableTypefaceOf(expected)
-        }
+        scope.runBlockingTest { assertThat(finalResult.await()).isImmutableTypefaceOf(expected) }
         assertThat(typefaceLoader.completedRequests()).containsExactly(asyncFont)
     }
 
@@ -231,20 +213,17 @@
         val asyncFont100 = AsyncFauxFont(typefaceLoader, weight = FontWeight.W100)
         val expected = Typeface.MONOSPACE
         val fontFamily = FontFamily(asyncFont100, asyncFont400)
-        val (reply, finalResult) = doOneAsyncRequest(
-            fontFamily.toTypefaceRequest(),
-            beforeAsyncLoad = {
-                // this hits platform default
-                assertThat(it).currentAsyncTypefaceValue(Typeface.DEFAULT)
-            },
-            doCompleteAsync = {
-                typefaceLoader.completeOne(asyncFont400, expected)
-            }
-        )
+        val (reply, finalResult) =
+            doOneAsyncRequest(
+                fontFamily.toTypefaceRequest(),
+                beforeAsyncLoad = {
+                    // this hits platform default
+                    assertThat(it).currentAsyncTypefaceValue(Typeface.DEFAULT)
+                },
+                doCompleteAsync = { typefaceLoader.completeOne(asyncFont400, expected) }
+            )
         assertThat(reply).currentAsyncTypefaceValue(expected)
-        scope.runBlockingTest {
-            assertThat(finalResult.await()).isImmutableTypefaceOf(expected)
-        }
+        scope.runBlockingTest { assertThat(finalResult.await()).isImmutableTypefaceOf(expected) }
         assertThat(typefaceLoader.pendingRequests()).isEmpty()
         assertThat(typefaceLoader.completedRequests()).containsExactly(asyncFont400)
     }
@@ -256,20 +235,15 @@
         val asyncFontFallback = AsyncFauxFont(typefaceLoader, name = "AsyncFallbackFont")
         val fontFamily = FontFamily(asyncFont, asyncFontFallback)
         val expected = Typeface.MONOSPACE
-        val (reply, finalResult) = doOneAsyncRequest(
-            fontFamily.toTypefaceRequest(),
-            beforeAsyncLoad = {
-                assertThat(it).currentAsyncTypefaceValue(Typeface.DEFAULT)
-            },
-            doCompleteAsync = {
-                typefaceLoader.completeOne(asyncFont, expected)
-            }
-        )
+        val (reply, finalResult) =
+            doOneAsyncRequest(
+                fontFamily.toTypefaceRequest(),
+                beforeAsyncLoad = { assertThat(it).currentAsyncTypefaceValue(Typeface.DEFAULT) },
+                doCompleteAsync = { typefaceLoader.completeOne(asyncFont, expected) }
+            )
 
         assertThat(reply).currentAsyncTypefaceValue(expected)
-        scope.runBlockingTest {
-            assertThat(finalResult.await()).isImmutableTypefaceOf(expected)
-        }
+        scope.runBlockingTest { assertThat(finalResult.await()).isImmutableTypefaceOf(expected) }
         assertThat(typefaceLoader.pendingRequests()).isEmpty()
         assertThat(typefaceLoader.completedRequests()).containsExactly(asyncFont)
     }
@@ -281,25 +255,22 @@
         val asyncFontFallback = AsyncFauxFont(typefaceLoader, name = "AsyncFallbackFont")
         val fontFamily = FontFamily(asyncFont, asyncFontFallback)
         val expected = Typeface.MONOSPACE
-        val (reply, finalResult) = doOneAsyncRequest(
-            fontFamily.toTypefaceRequest(),
-            beforeAsyncLoad = {
-                assertThat(it).currentAsyncTypefaceValue(Typeface.DEFAULT)
-            },
-            doCompleteAsync = {
-                scope.testScheduler.apply {
-                    advanceTimeBy(Font.MaximumAsyncTimeoutMillis)
-                    runCurrent()
+        val (reply, finalResult) =
+            doOneAsyncRequest(
+                fontFamily.toTypefaceRequest(),
+                beforeAsyncLoad = { assertThat(it).currentAsyncTypefaceValue(Typeface.DEFAULT) },
+                doCompleteAsync = {
+                    scope.testScheduler.apply {
+                        advanceTimeBy(Font.MaximumAsyncTimeoutMillis)
+                        runCurrent()
+                    }
+                    scope.runCurrent()
+                    typefaceLoader.completeOne(asyncFontFallback, expected)
                 }
-                scope.runCurrent()
-                typefaceLoader.completeOne(asyncFontFallback, expected)
-            }
-        )
+            )
 
         assertThat(reply).currentAsyncTypefaceValue(expected)
-        scope.runBlockingTest {
-            assertThat(finalResult.await()).isImmutableTypefaceOf(expected)
-        }
+        scope.runBlockingTest { assertThat(finalResult.await()).isImmutableTypefaceOf(expected) }
         assertThat(typefaceLoader.pendingRequests()).containsExactly(asyncFont)
         assertThat(typefaceLoader.completedRequests()).containsExactly(asyncFontFallback)
     }
@@ -311,27 +282,21 @@
         val asyncFontFallback = AsyncFauxFont(typefaceLoader, name = "AsyncFallbackFont")
         val fontFamily = FontFamily(asyncFont, asyncFontFallback)
         val expected = Typeface.MONOSPACE
-        val (reply, finalResult) = doOneAsyncRequest(
-            fontFamily.toTypefaceRequest(),
-            beforeAsyncLoad = {
-                assertThat(it).currentAsyncTypefaceValue(Typeface.DEFAULT)
-            },
-            doCompleteAsync = {
-                typefaceLoader.errorOne(asyncFont, RuntimeException("FooBared"))
-                scope.runCurrent()
-                typefaceLoader.completeOne(asyncFontFallback, expected)
-            }
-        )
+        val (reply, finalResult) =
+            doOneAsyncRequest(
+                fontFamily.toTypefaceRequest(),
+                beforeAsyncLoad = { assertThat(it).currentAsyncTypefaceValue(Typeface.DEFAULT) },
+                doCompleteAsync = {
+                    typefaceLoader.errorOne(asyncFont, RuntimeException("FooBared"))
+                    scope.runCurrent()
+                    typefaceLoader.completeOne(asyncFontFallback, expected)
+                }
+            )
 
         assertThat(reply).currentAsyncTypefaceValue(expected)
-        scope.runBlockingTest {
-            assertThat(finalResult.await()).isImmutableTypefaceOf(expected)
-        }
+        scope.runBlockingTest { assertThat(finalResult.await()).isImmutableTypefaceOf(expected) }
         assertThat(typefaceLoader.pendingRequests()).isEmpty()
-        assertThat(typefaceLoader.completedRequests()).containsExactly(
-            asyncFont,
-            asyncFontFallback
-        )
+        assertThat(typefaceLoader.completedRequests()).containsExactly(asyncFont, asyncFontFallback)
     }
 
     @OptIn(ExperimentalCoroutinesApi::class)
@@ -340,14 +305,15 @@
         val asyncFont = AsyncFauxFont(typefaceLoader)
         val asyncFontFallback = AsyncFauxFont(typefaceLoader, name = "AsyncFallbackFont")
         val fontFamily = FontFamily(asyncFont, asyncFontFallback)
-        val typefaceResult = subject.resolve(
-            fontFamily.toTypefaceRequest(),
-            fontLoader,
-            onAsyncCompletion = {
-                // don't care in this test
-            },
-            createDefaultTypeface = { Typeface.DEFAULT }
-        )
+        val typefaceResult =
+            subject.resolve(
+                fontFamily.toTypefaceRequest(),
+                fontLoader,
+                onAsyncCompletion = {
+                    // don't care in this test
+                },
+                createDefaultTypeface = { Typeface.DEFAULT }
+            )
         // start first load
         typefaceLoader.errorOne(asyncFont, RuntimeException("Failed to load"))
         assertThat(typefaceLoader.pendingRequests()).isEmpty()
@@ -357,10 +323,7 @@
         typefaceLoader.completeOne(asyncFontFallback, Typeface.SERIF)
         scope.runCurrent()
         assertThat(typefaceResult).currentAsyncTypefaceValue(Typeface.SERIF)
-        assertThat(typefaceLoader.completedRequests()).containsExactly(
-            asyncFont,
-            asyncFontFallback
-        )
+        assertThat(typefaceLoader.completedRequests()).containsExactly(asyncFont, asyncFontFallback)
     }
 
     @Test
@@ -369,12 +332,13 @@
         val optionalFont = OptionalFauxFont(typefaceLoader, expected)
         val asyncFont = AsyncFauxFont(typefaceLoader)
         val fontFamily = FontFamily(optionalFont, asyncFont)
-        val result = subject.resolve(
-            fontFamily.toTypefaceRequest(),
-            fontLoader,
-            onAsyncCompletion = { error("Should not call") },
-            createDefaultTypeface = { Typeface.DEFAULT }
-        )
+        val result =
+            subject.resolve(
+                fontFamily.toTypefaceRequest(),
+                fontLoader,
+                onAsyncCompletion = { error("Should not call") },
+                createDefaultTypeface = { Typeface.DEFAULT }
+            )
         assertThat(result).isImmutableTypefaceOf(expected)
     }
 
@@ -385,25 +349,17 @@
         val optionalFont = OptionalFauxFont(typefaceLoader, null)
         val fontFamily = FontFamily(optionalFont, asyncFont)
         val expected = Typeface.MONOSPACE
-        val (reply, finalResult) = doOneAsyncRequest(
-            fontFamily.toTypefaceRequest(),
-            beforeAsyncLoad = {
-                assertThat(it).currentAsyncTypefaceValue(Typeface.DEFAULT)
-            },
-            doCompleteAsync = {
-                typefaceLoader.completeOne(asyncFont, expected)
-            }
-        )
+        val (reply, finalResult) =
+            doOneAsyncRequest(
+                fontFamily.toTypefaceRequest(),
+                beforeAsyncLoad = { assertThat(it).currentAsyncTypefaceValue(Typeface.DEFAULT) },
+                doCompleteAsync = { typefaceLoader.completeOne(asyncFont, expected) }
+            )
 
         assertThat(reply).currentAsyncTypefaceValue(expected)
-        scope.runBlockingTest {
-            assertThat(finalResult.await()).isImmutableTypefaceOf(expected)
-        }
+        scope.runBlockingTest { assertThat(finalResult.await()).isImmutableTypefaceOf(expected) }
         assertThat(typefaceLoader.pendingRequests()).isEmpty()
-        assertThat(typefaceLoader.completedRequests()).containsExactly(
-            asyncFont,
-            optionalFont
-        )
+        assertThat(typefaceLoader.completedRequests()).containsExactly(asyncFont, optionalFont)
     }
 
     @OptIn(ExperimentalCoroutinesApi::class)
@@ -414,26 +370,18 @@
         val blockingFont = BlockingFauxFont(typefaceLoader, Typeface.SERIF)
         val fontFamily = FontFamily(optionalFont, asyncFont, blockingFont)
         val expected = Typeface.MONOSPACE
-        val (reply, finalResult) = doOneAsyncRequest(
-            fontFamily.toTypefaceRequest(),
-            beforeAsyncLoad = {
-                assertThat(it).currentAsyncTypefaceValue(Typeface.SERIF)
-            },
-            doCompleteAsync = {
-                typefaceLoader.completeOne(asyncFont, expected)
-            }
-        )
+        val (reply, finalResult) =
+            doOneAsyncRequest(
+                fontFamily.toTypefaceRequest(),
+                beforeAsyncLoad = { assertThat(it).currentAsyncTypefaceValue(Typeface.SERIF) },
+                doCompleteAsync = { typefaceLoader.completeOne(asyncFont, expected) }
+            )
 
         assertThat(reply).currentAsyncTypefaceValue(expected)
-        scope.runBlockingTest {
-            assertThat(finalResult.await()).isImmutableTypefaceOf(expected)
-        }
+        scope.runBlockingTest { assertThat(finalResult.await()).isImmutableTypefaceOf(expected) }
         assertThat(typefaceLoader.pendingRequests()).isEmpty()
-        assertThat(typefaceLoader.completedRequests()).containsExactly(
-            asyncFont,
-            optionalFont,
-            blockingFont
-        )
+        assertThat(typefaceLoader.completedRequests())
+            .containsExactly(asyncFont, optionalFont, blockingFont)
     }
 
     @OptIn(ExperimentalCoroutinesApi::class)
@@ -445,25 +393,17 @@
         // this is a weird order, but lets make sure it doesn't break :)
         val fontFamily = FontFamily(asyncFont, optionalFont, blockingFont)
         val expected = Typeface.MONOSPACE
-        val (reply, finalResult) = doOneAsyncRequest(
-            fontFamily.toTypefaceRequest(),
-            beforeAsyncLoad = {
-                assertThat(it).currentAsyncTypefaceValue(Typeface.SANS_SERIF)
-            },
-            doCompleteAsync = {
-                typefaceLoader.completeOne(asyncFont, expected)
-            }
-        )
+        val (reply, finalResult) =
+            doOneAsyncRequest(
+                fontFamily.toTypefaceRequest(),
+                beforeAsyncLoad = { assertThat(it).currentAsyncTypefaceValue(Typeface.SANS_SERIF) },
+                doCompleteAsync = { typefaceLoader.completeOne(asyncFont, expected) }
+            )
 
         assertThat(reply).currentAsyncTypefaceValue(expected)
-        scope.runBlockingTest {
-            assertThat(finalResult.await()).isImmutableTypefaceOf(expected)
-        }
+        scope.runBlockingTest { assertThat(finalResult.await()).isImmutableTypefaceOf(expected) }
         assertThat(typefaceLoader.pendingRequests()).isEmpty()
-        assertThat(typefaceLoader.completedRequests()).containsExactly(
-            asyncFont,
-            optionalFont
-        )
+        assertThat(typefaceLoader.completedRequests()).containsExactly(asyncFont, optionalFont)
         scope.advanceUntilIdle()
     }
 
@@ -474,12 +414,13 @@
         val blockingFont = BlockingFauxFont(typefaceLoader, Typeface.MONOSPACE)
         // this is expected order
         val fontFamily = FontFamily(optionalFont, asyncFont, blockingFont)
-        val result = subject.resolve(
-            fontFamily.toTypefaceRequest(),
-            fontLoader,
-            onAsyncCompletion = { error("Should not call") },
-            createDefaultTypeface = { Typeface.DEFAULT }
-        )
+        val result =
+            subject.resolve(
+                fontFamily.toTypefaceRequest(),
+                fontLoader,
+                onAsyncCompletion = { error("Should not call") },
+                createDefaultTypeface = { Typeface.DEFAULT }
+            )
 
         assertThat(typefaceLoader.pendingRequests()).isEmpty()
         assertThat(typefaceLoader.completedRequests()).containsExactly(optionalFont)
@@ -500,12 +441,13 @@
         val fontFamily = FontFamily(asyncFont)
         val finalResult = CompletableDeferred<TypefaceResult>()
 
-        val result = subject.resolve(
-            fontFamily.toTypefaceRequest(),
-            fontLoader,
-            onAsyncCompletion = { finalResult.complete(it) },
-            createDefaultTypeface = { Typeface.DEFAULT }
-        )
+        val result =
+            subject.resolve(
+                fontFamily.toTypefaceRequest(),
+                fontLoader,
+                onAsyncCompletion = { finalResult.complete(it) },
+                createDefaultTypeface = { Typeface.DEFAULT }
+            )
 
         scope.runCurrent()
         newDispatcher.scheduler.runCurrent()
@@ -532,37 +474,38 @@
         val fontFamily = FontFamily(asyncFont)
         val finalResult = CompletableDeferred<TypefaceResult>()
 
-        val firstResult = subject.resolve(
-            fontFamily.toTypefaceRequest(),
-            fontLoader,
-            onAsyncCompletion = { finalResult.complete(it) },
-            createDefaultTypeface = { Typeface.DEFAULT }
-        )
+        val firstResult =
+            subject.resolve(
+                fontFamily.toTypefaceRequest(),
+                fontLoader,
+                onAsyncCompletion = { finalResult.complete(it) },
+                createDefaultTypeface = { Typeface.DEFAULT }
+            )
         scope.runCurrent()
         typefaceLoader.errorOne(asyncFont, CancellationException())
-        scope.runBlockingTest {
-            assertThat(finalResult.await()).isImmutableTypeface()
-        }
+        scope.runBlockingTest { assertThat(finalResult.await()).isImmutableTypeface() }
         assertThat(firstResult).currentAsyncTypefaceValue(Typeface.DEFAULT)
     }
 
     @OptIn(ExperimentalCoroutinesApi::class)
     @Test
     fun cancellationOfFirstRequest_cannotCancelJob() {
-        val cancellingLoader = object : AndroidFont.TypefaceLoader {
-            override fun loadBlocking(context: Context, font: AndroidFont): Typeface? {
-                TODO("Not yet implemented")
-            }
+        val cancellingLoader =
+            object : AndroidFont.TypefaceLoader {
+                override fun loadBlocking(context: Context, font: AndroidFont): Typeface? {
+                    TODO("Not yet implemented")
+                }
 
-            override suspend fun awaitLoad(context: Context, font: AndroidFont): Typeface? {
-                coroutineContext[Job]?.cancel()
-                return null
+                override suspend fun awaitLoad(context: Context, font: AndroidFont): Typeface? {
+                    coroutineContext[Job]?.cancel()
+                    return null
+                }
             }
-        }
-        val asyncFont = object : AndroidFont(FontLoadingStrategy.Async, cancellingLoader) {
-            override val weight: FontWeight = FontWeight.Normal
-            override val style: FontStyle = FontStyle.Normal
-        }
+        val asyncFont =
+            object : AndroidFont(FontLoadingStrategy.Async, cancellingLoader) {
+                override val weight: FontWeight = FontWeight.Normal
+                override val style: FontStyle = FontStyle.Normal
+            }
 
         val asyncFontFallback = AsyncFauxFont(typefaceLoader, name = "AsyncFontFallback")
         val finalResult = CompletableDeferred<TypefaceResult>()
@@ -615,30 +558,32 @@
         val lock = Object()
         val latch = CountDownLatch(1)
 
-        val typefaceLoader = object : AndroidFont.TypefaceLoader {
-            override fun loadBlocking(context: Context, font: AndroidFont): Typeface? {
-                TODO("Not yet implemented")
-            }
+        val typefaceLoader =
+            object : AndroidFont.TypefaceLoader {
+                override fun loadBlocking(context: Context, font: AndroidFont): Typeface? {
+                    TODO("Not yet implemented")
+                }
 
-            override suspend fun awaitLoad(context: Context, font: AndroidFont): Typeface? {
-                synchronized(lock) {
-                    // should be on the testing thread here
-                    beforeThread = Thread.currentThread()
+                override suspend fun awaitLoad(context: Context, font: AndroidFont): Typeface? {
+                    synchronized(lock) {
+                        // should be on the testing thread here
+                        beforeThread = Thread.currentThread()
+                    }
+                    // yield causes dispatch
+                    yield()
+                    synchronized(lock) {
+                        // should be on a worker thread here
+                        afterThread = Thread.currentThread()
+                    }
+                    latch.countDown()
+                    return Typeface.SERIF
                 }
-                // yield causes dispatch
-                yield()
-                synchronized(lock) {
-                    // should be on a worker thread here
-                    afterThread = Thread.currentThread()
-                }
-                latch.countDown()
-                return Typeface.SERIF
             }
-        }
-        val font = object : AndroidFont(FontLoadingStrategy.Async, typefaceLoader) {
-            override val weight: FontWeight = FontWeight.W400
-            override val style: FontStyle = FontStyle.Normal
-        }
+        val font =
+            object : AndroidFont(FontLoadingStrategy.Async, typefaceLoader) {
+                override val weight: FontWeight = FontWeight.W400
+                override val style: FontStyle = FontStyle.Normal
+            }
         val fontFamily = FontFamily(font)
         subject.resolve(
             fontFamily.toTypefaceRequest(),
@@ -686,12 +631,11 @@
     @Test
     fun runtimeExceptionOnRealDispatcher_informsExceptionHandler() {
         val exception: CompletableDeferred<Throwable> = CompletableDeferred()
-        subject = FontListFontFamilyTypefaceAdapter(
-            cache,
-            CoroutineExceptionHandler { _, throwable ->
-                exception.complete(throwable)
-            }
-        )
+        subject =
+            FontListFontFamilyTypefaceAdapter(
+                cache,
+                CoroutineExceptionHandler { _, throwable -> exception.complete(throwable) }
+            )
         val cause = RuntimeException("fail the request")
         requestAndThrowOnRealDispatcher(cause)
         runBlocking {
@@ -717,12 +661,13 @@
         val requestLatch = CountDownLatch(1)
         val result = CompletableDeferred<TypefaceResult?>()
         typefaceLoader.onAsyncLoad { requestLatch.countDown() }
-        val asyncRequest: TypefaceResult? = subject.resolve(
-            fontFamily.toTypefaceRequest(),
-            fontLoader,
-            onAsyncCompletion = { result.complete(it) },
-            createDefaultTypeface = { Typeface.DEFAULT }
-        )
+        val asyncRequest: TypefaceResult? =
+            subject.resolve(
+                fontFamily.toTypefaceRequest(),
+                fontLoader,
+                onAsyncCompletion = { result.complete(it) },
+                createDefaultTypeface = { Typeface.DEFAULT }
+            )
         assertThat(asyncRequest!!.cacheable).isFalse()
         assertThat(asyncRequest).currentAsyncTypefaceValue(Typeface.DEFAULT)
         val typefaceResult = runBlocking { result.await() }
@@ -736,18 +681,17 @@
         val requestLatch = CountDownLatch(1)
         val result = CompletableDeferred<TypefaceResult>()
         typefaceLoader.onAsyncLoad { requestLatch.countDown() }
-        val asyncResult = subject.resolve(
-            fontFamily.toTypefaceRequest(),
-            fontLoader,
-            onAsyncCompletion = { result.complete(it) },
-            createDefaultTypeface = { Typeface.DEFAULT }
-        )
+        val asyncResult =
+            subject.resolve(
+                fontFamily.toTypefaceRequest(),
+                fontLoader,
+                onAsyncCompletion = { result.complete(it) },
+                createDefaultTypeface = { Typeface.DEFAULT }
+            )
         // we're running on a real dispatcher, sync manually
         requestLatch.await()
         typefaceLoader.completeOne(asyncFont, Typeface.SERIF)
-        runBlocking {
-            assertThat(result.await()).isImmutableTypefaceOf(Typeface.SERIF)
-        }
+        runBlocking { assertThat(result.await()).isImmutableTypefaceOf(Typeface.SERIF) }
         assertThat(asyncResult).currentAsyncTypefaceValue(Typeface.SERIF)
     }
 
@@ -758,18 +702,17 @@
         val requestLatch = CountDownLatch(1)
 
         typefaceLoader.onAsyncLoad { requestLatch.countDown() }
-        val asyncResult = subject.resolve(
-            fontFamily.toTypefaceRequest(),
-            fontLoader,
-            onAsyncCompletion = { result.complete(it) },
-            createDefaultTypeface = { Typeface.DEFAULT }
-        )
+        val asyncResult =
+            subject.resolve(
+                fontFamily.toTypefaceRequest(),
+                fontLoader,
+                onAsyncCompletion = { result.complete(it) },
+                createDefaultTypeface = { Typeface.DEFAULT }
+            )
         // we're running on a real dispatcher, sync manually
         requestLatch.await()
         typefaceLoader.errorOne(font, cause)
-        runBlocking {
-            assertThat(result.await()).isImmutableTypefaceOf(Typeface.DEFAULT)
-        }
+        runBlocking { assertThat(result.await()).isImmutableTypefaceOf(Typeface.DEFAULT) }
         assertThat(asyncResult).currentAsyncTypefaceValue(Typeface.DEFAULT)
     }
 }
diff --git a/compose/ui/ui-text/src/androidInstrumentedTest/kotlin/androidx/compose/ui/text/font/FontSynthesisTest.kt b/compose/ui/ui-text/src/androidInstrumentedTest/kotlin/androidx/compose/ui/text/font/FontSynthesisTest.kt
index 2a2ab2a..776968ec 100644
--- a/compose/ui/ui-text/src/androidInstrumentedTest/kotlin/androidx/compose/ui/text/font/FontSynthesisTest.kt
+++ b/compose/ui/ui-text/src/androidInstrumentedTest/kotlin/androidx/compose/ui/text/font/FontSynthesisTest.kt
@@ -35,24 +35,24 @@
     private val resolver = UncachedFontFamilyResolver(context)
 
     private fun loadFont(font: Font): Pair<Font, Typeface> {
-        return font to resolver.resolve(
-            font.toFontFamily(),
-            font.weight,
-            font.style,
-            fontSynthesis = FontSynthesis.None
-        ).value as Typeface
+        return font to
+            resolver
+                .resolve(
+                    font.toFontFamily(),
+                    font.weight,
+                    font.style,
+                    fontSynthesis = FontSynthesis.None
+                )
+                .value as Typeface
     }
 
     @Test
     fun fontSynthesisDefault_synthesizeTheFontToItalicBold() {
         val (font, typeface) = loadFont(FontTestData.FONT_100_REGULAR)
 
-        val synthesized = FontSynthesis.All.synthesizeTypeface(
-            typeface,
-            font,
-            FontWeight.Bold,
-            FontStyle.Italic
-        ) as Typeface
+        val synthesized =
+            FontSynthesis.All.synthesizeTypeface(typeface, font, FontWeight.Bold, FontStyle.Italic)
+                as Typeface
 
         // since 100 regular is not bold and not italic, passing FontWeight.bold and
         // FontStyle.Italic should create a Typeface that is fake bold and fake Italic
@@ -64,12 +64,13 @@
     fun fontSynthesisStyle_synthesizeTheFontToItalic() {
         val (font, typeface) = loadFont(FontTestData.FONT_100_REGULAR)
 
-        val synthesized = FontSynthesis.Style.synthesizeTypeface(
-            typeface,
-            font,
-            FontWeight.Bold,
-            FontStyle.Italic
-        ) as Typeface
+        val synthesized =
+            FontSynthesis.Style.synthesizeTypeface(
+                typeface,
+                font,
+                FontWeight.Bold,
+                FontStyle.Italic
+            ) as Typeface
 
         // since 100 regular is not bold and not italic, passing FontWeight.bold and
         // FontStyle.Italic should create a Typeface that is only fake Italic
@@ -81,12 +82,13 @@
     fun fontSynthesisWeight_synthesizeTheFontToBold() {
         val (font, typeface) = loadFont(FontTestData.FONT_100_REGULAR)
 
-        val synthesized = FontSynthesis.Weight.synthesizeTypeface(
-            typeface,
-            font,
-            FontWeight.Bold,
-            FontStyle.Italic
-        ) as Typeface
+        val synthesized =
+            FontSynthesis.Weight.synthesizeTypeface(
+                typeface,
+                font,
+                FontWeight.Bold,
+                FontStyle.Italic
+            ) as Typeface
 
         // since 100 regular is not bold and not italic, passing FontWeight.bold and
         // FontStyle.Italic should create a Typeface that is only fake bold
@@ -98,12 +100,13 @@
     fun fontSynthesisStyle_forMatchingItalicDoesNotSynthesize() {
         val (font, typeface) = loadFont(FontTestData.FONT_100_ITALIC)
 
-        val synthesized = FontSynthesis.Style.synthesizeTypeface(
-            typeface,
-            font,
-            FontWeight.W700,
-            FontStyle.Italic
-        ) as Typeface
+        val synthesized =
+            FontSynthesis.Style.synthesizeTypeface(
+                typeface,
+                font,
+                FontWeight.W700,
+                FontStyle.Italic
+            ) as Typeface
 
         Truth.assertThat(synthesized.isBold).isFalse()
         Truth.assertThat(synthesized.isItalic).isFalse()
@@ -113,12 +116,9 @@
     fun fontSynthesisAll_doesNotSynthesizeIfFontIsTheSame_beforeApi28() {
         val (font, loaded) = loadFont(FontTestData.FONT_700_ITALIC)
 
-        val typeface = FontSynthesis.All.synthesizeTypeface(
-            loaded,
-            font,
-            FontWeight.W700,
-            FontStyle.Italic
-        ) as Typeface
+        val typeface =
+            FontSynthesis.All.synthesizeTypeface(loaded, font, FontWeight.W700, FontStyle.Italic)
+                as Typeface
         Truth.assertThat(typeface.isItalic).isFalse()
 
         if (Build.VERSION.SDK_INT < 23) {
@@ -135,12 +135,9 @@
     fun fontSynthesisNone_doesNotSynthesize() {
         val (font, loaded) = loadFont(FontTestData.FONT_100_REGULAR)
 
-        val typeface = FontSynthesis.None.synthesizeTypeface(
-            loaded,
-            font,
-            FontWeight.Bold,
-            FontStyle.Italic
-        ) as Typeface
+        val typeface =
+            FontSynthesis.None.synthesizeTypeface(loaded, font, FontWeight.Bold, FontStyle.Italic)
+                as Typeface
 
         Truth.assertThat(typeface.isBold).isFalse()
         Truth.assertThat(typeface.isItalic).isFalse()
@@ -151,20 +148,14 @@
         val (font, loaded) = loadFont(FontTestData.FONT_100_REGULAR)
 
         // Less than 600 is not synthesized
-        val typeface500 = FontSynthesis.Weight.synthesizeTypeface(
-            loaded,
-            font,
-            FontWeight.W500,
-            FontStyle.Normal
-        ) as Typeface
+        val typeface500 =
+            FontSynthesis.Weight.synthesizeTypeface(loaded, font, FontWeight.W500, FontStyle.Normal)
+                as Typeface
 
         // 600 or more is synthesized
-        val typeface600 = FontSynthesis.Weight.synthesizeTypeface(
-            loaded,
-            font,
-            FontWeight.W600,
-            FontStyle.Normal
-        ) as Typeface
+        val typeface600 =
+            FontSynthesis.Weight.synthesizeTypeface(loaded, font, FontWeight.W600, FontStyle.Normal)
+                as Typeface
 
         Truth.assertThat(typeface500.isBold).isFalse()
         Truth.assertThat(typeface600.isBold).isTrue()
diff --git a/compose/ui/ui-text/src/androidInstrumentedTest/kotlin/androidx/compose/ui/text/font/PlatformFontFamilyTypefaceAdapterTest.kt b/compose/ui/ui-text/src/androidInstrumentedTest/kotlin/androidx/compose/ui/text/font/PlatformFontFamilyTypefaceAdapterTest.kt
index 25c0ce2..7db089e 100644
--- a/compose/ui/ui-text/src/androidInstrumentedTest/kotlin/androidx/compose/ui/text/font/PlatformFontFamilyTypefaceAdapterTest.kt
+++ b/compose/ui/ui-text/src/androidInstrumentedTest/kotlin/androidx/compose/ui/text/font/PlatformFontFamilyTypefaceAdapterTest.kt
@@ -36,9 +36,11 @@
     private val fontLoader = AndroidFontLoader(context)
 
     @Suppress("MemberVisibilityCanBePrivate")
-    val parameters: List<Pair<FontWeight, FontStyle>> = (15 until 1000 step 15)
-        .zip(listOf(FontStyle.Italic, FontStyle.Normal))
-        .map { (weight, style) -> FontWeight(weight) to style }
+    val parameters: List<Pair<FontWeight, FontStyle>> =
+        (15 until 1000 step 15).zip(listOf(FontStyle.Italic, FontStyle.Normal)).map {
+            (weight, style) ->
+            FontWeight(weight) to style
+        }
 
     @Test
     fun canLoadNullTypeface() {
@@ -78,26 +80,19 @@
     @Suppress("DEPRECATION")
     @Test
     fun canLoadLoadedFontFamily_noSynthesis() {
-        val fontFamily = FontFamily(
-            Typeface(context, FontTestData.FONT_100_REGULAR.toFontFamily())
-        )
+        val fontFamily = FontFamily(Typeface(context, FontTestData.FONT_100_REGULAR.toFontFamily()))
         // this runs through synthesis path
         parameters.forEach { (weight, style) ->
             val subject = PlatformFontFamilyTypefaceAdapter()
-            val typeRequest = TypefaceRequest(
-                fontFamily,
-                weight,
-                style,
-                FontSynthesis.None,
-                null
-            )
+            val typeRequest = TypefaceRequest(fontFamily, weight, style, FontSynthesis.None, null)
             val trackingFun = TrackingFun()
-            val result = subject.resolve(
-                typefaceRequest = typeRequest,
-                platformFontLoader = fontLoader,
-                onAsyncCompletion = trackingFun,
-                createDefaultTypeface = { android.graphics.Typeface.DEFAULT }
-            )
+            val result =
+                subject.resolve(
+                    typefaceRequest = typeRequest,
+                    platformFontLoader = fontLoader,
+                    onAsyncCompletion = trackingFun,
+                    createDefaultTypeface = { android.graphics.Typeface.DEFAULT }
+                )
 
             val typeface = (result as TypefaceResult.Immutable).value as Typeface?
             assertThat(typeface).hasWeightAndStyle(FontWeight.W100, FontStyle.Normal)
@@ -108,26 +103,19 @@
     @Suppress("DEPRECATION")
     @Test
     fun canLoadLoadedFontFamily_synthesizeStyle() {
-        val fontFamily = FontFamily(
-            Typeface(context, FontTestData.FONT_100_REGULAR.toFontFamily())
-        )
+        val fontFamily = FontFamily(Typeface(context, FontTestData.FONT_100_REGULAR.toFontFamily()))
         // this runs through synthesis path
         parameters.forEach { (weight, style) ->
             val subject = PlatformFontFamilyTypefaceAdapter()
-            val typeRequest = TypefaceRequest(
-                fontFamily,
-                weight,
-                style,
-                FontSynthesis.Style,
-                null
-            )
+            val typeRequest = TypefaceRequest(fontFamily, weight, style, FontSynthesis.Style, null)
             val trackingFun = TrackingFun()
-            val result = subject.resolve(
-                typefaceRequest = typeRequest,
-                platformFontLoader = fontLoader,
-                onAsyncCompletion = trackingFun,
-                createDefaultTypeface = { android.graphics.Typeface.DEFAULT }
-            )
+            val result =
+                subject.resolve(
+                    typefaceRequest = typeRequest,
+                    platformFontLoader = fontLoader,
+                    onAsyncCompletion = trackingFun,
+                    createDefaultTypeface = { android.graphics.Typeface.DEFAULT }
+                )
 
             val typeface = (result as TypefaceResult.Immutable).value as Typeface?
             assertThat(typeface).hasWeightAndStyle(FontWeight.W100, style)
@@ -138,33 +126,27 @@
     @Suppress("DEPRECATION")
     @Test
     fun canLoadLoadedFontFamily_weightSynthesis() {
-        val fontFamily = FontFamily(
-            Typeface(context, FontTestData.FONT_100_REGULAR.toFontFamily())
-        )
+        val fontFamily = FontFamily(Typeface(context, FontTestData.FONT_100_REGULAR.toFontFamily()))
         // this runs through synthesis path
         parameters.forEach { (weight, style) ->
             val subject = PlatformFontFamilyTypefaceAdapter()
-            val typeRequest = TypefaceRequest(
-                fontFamily,
-                weight,
-                style,
-                FontSynthesis.Weight,
-                null
-            )
+            val typeRequest = TypefaceRequest(fontFamily, weight, style, FontSynthesis.Weight, null)
             val trackingFun = TrackingFun()
-            val result = subject.resolve(
-                typefaceRequest = typeRequest,
-                platformFontLoader = fontLoader,
-                onAsyncCompletion = trackingFun,
-                createDefaultTypeface = { android.graphics.Typeface.DEFAULT }
-            )
+            val result =
+                subject.resolve(
+                    typefaceRequest = typeRequest,
+                    platformFontLoader = fontLoader,
+                    onAsyncCompletion = trackingFun,
+                    createDefaultTypeface = { android.graphics.Typeface.DEFAULT }
+                )
 
             val typeface = (result as TypefaceResult.Immutable).value as Typeface?
-            val finalWeight = if (weight >= FontWeight.AndroidBold) {
-                weight
-            } else {
-                FontWeight.W100
-            }
+            val finalWeight =
+                if (weight >= FontWeight.AndroidBold) {
+                    weight
+                } else {
+                    FontWeight.W100
+                }
             assertThat(typeface).hasWeightAndStyle(finalWeight, FontStyle.Normal)
             trackingFun.assertNeverCalled()
         }
@@ -173,33 +155,27 @@
     @Suppress("DEPRECATION")
     @Test
     fun canLoadLoadedFontFamily_allSynthesis() {
-        val fontFamily = FontFamily(
-            Typeface(context, FontTestData.FONT_100_REGULAR.toFontFamily())
-        )
+        val fontFamily = FontFamily(Typeface(context, FontTestData.FONT_100_REGULAR.toFontFamily()))
         // this runs through synthesis path
         parameters.forEach { (weight, style) ->
             val subject = PlatformFontFamilyTypefaceAdapter()
-            val typeRequest = TypefaceRequest(
-                fontFamily,
-                weight,
-                style,
-                FontSynthesis.All,
-                null
-            )
+            val typeRequest = TypefaceRequest(fontFamily, weight, style, FontSynthesis.All, null)
             val trackingFun = TrackingFun()
-            val result = subject.resolve(
-                typefaceRequest = typeRequest,
-                platformFontLoader = fontLoader,
-                onAsyncCompletion = trackingFun,
-                createDefaultTypeface = { android.graphics.Typeface.DEFAULT }
-            )
+            val result =
+                subject.resolve(
+                    typefaceRequest = typeRequest,
+                    platformFontLoader = fontLoader,
+                    onAsyncCompletion = trackingFun,
+                    createDefaultTypeface = { android.graphics.Typeface.DEFAULT }
+                )
 
             val typeface = (result as TypefaceResult.Immutable).value as Typeface?
-            val finalWeight = if (weight >= FontWeight.AndroidBold) {
-                weight
-            } else {
-                FontWeight.W100
-            }
+            val finalWeight =
+                if (weight >= FontWeight.AndroidBold) {
+                    weight
+                } else {
+                    FontWeight.W100
+                }
             assertThat(typeface).hasWeightAndStyle(finalWeight, style)
             trackingFun.assertNeverCalled()
         }
@@ -208,20 +184,22 @@
     @Test
     fun fontListFontFamily_returnsNull() {
         val subject = PlatformFontFamilyTypefaceAdapter()
-        val typeRequest = TypefaceRequest(
-            FontTestData.FONT_100_REGULAR.toFontFamily(),
-            FontWeight.W100,
-            FontStyle.Normal,
-            FontSynthesis.All,
-            null
-        )
+        val typeRequest =
+            TypefaceRequest(
+                FontTestData.FONT_100_REGULAR.toFontFamily(),
+                FontWeight.W100,
+                FontStyle.Normal,
+                FontSynthesis.All,
+                null
+            )
         val trackingFun = TrackingFun()
-        val result = subject.resolve(
-            typefaceRequest = typeRequest,
-            platformFontLoader = fontLoader,
-            onAsyncCompletion = trackingFun,
-            createDefaultTypeface = { android.graphics.Typeface.DEFAULT }
-        )
+        val result =
+            subject.resolve(
+                typefaceRequest = typeRequest,
+                platformFontLoader = fontLoader,
+                onAsyncCompletion = trackingFun,
+                createDefaultTypeface = { android.graphics.Typeface.DEFAULT }
+            )
 
         assertThat(result).isNull()
         trackingFun.assertNeverCalled()
@@ -230,20 +208,22 @@
     private fun assertLoadForAllWeightsAndStyles(fontFamily: FontFamily?) {
         parameters.forEach { (weight, style) ->
             val subject = PlatformFontFamilyTypefaceAdapter()
-            val typeRequest = TypefaceRequest(
-                fontFamily,
-                weight,
-                style,
-                FontSynthesis.All,
-                null,
-            )
+            val typeRequest =
+                TypefaceRequest(
+                    fontFamily,
+                    weight,
+                    style,
+                    FontSynthesis.All,
+                    null,
+                )
             val trackingFun = TrackingFun()
-            val result = subject.resolve(
-                typefaceRequest = typeRequest,
-                platformFontLoader = fontLoader,
-                onAsyncCompletion = trackingFun,
-                createDefaultTypeface = { android.graphics.Typeface.DEFAULT }
-            )
+            val result =
+                subject.resolve(
+                    typefaceRequest = typeRequest,
+                    platformFontLoader = fontLoader,
+                    onAsyncCompletion = trackingFun,
+                    createDefaultTypeface = { android.graphics.Typeface.DEFAULT }
+                )
 
             val typeface = (result as TypefaceResult.Immutable).value as Typeface?
             assertThat(typeface).hasWeightAndStyle(weight, style)
@@ -258,9 +238,7 @@
             get() = synchronized(lock) { _calledWith }
 
         override operator fun invoke(typefaceResult: TypefaceResult) {
-            synchronized(lock) {
-                _calledWith.add(typefaceResult)
-            }
+            synchronized(lock) { _calledWith.add(typefaceResult) }
         }
 
         fun assertNeverCalled() {
diff --git a/compose/ui/ui-text/src/androidInstrumentedTest/kotlin/androidx/compose/ui/text/font/PlatformTypefacesTest.kt b/compose/ui/ui-text/src/androidInstrumentedTest/kotlin/androidx/compose/ui/text/font/PlatformTypefacesTest.kt
index 6fd8979..3cfc4b8 100644
--- a/compose/ui/ui-text/src/androidInstrumentedTest/kotlin/androidx/compose/ui/text/font/PlatformTypefacesTest.kt
+++ b/compose/ui/ui-text/src/androidInstrumentedTest/kotlin/androidx/compose/ui/text/font/PlatformTypefacesTest.kt
@@ -81,19 +81,18 @@
         fontFamily: GenericFontFamily,
         forRange: IntRange
     ) {
-        val boldTypeface = android.graphics.Typeface.create(
-            fontFamily.name, android.graphics.Typeface.BOLD
-        )
-        val normalTypeface = android.graphics.Typeface.create(
-            fontFamily.name, android.graphics.Typeface.NORMAL
-        )
+        val boldTypeface =
+            android.graphics.Typeface.create(fontFamily.name, android.graphics.Typeface.BOLD)
+        val normalTypeface =
+            android.graphics.Typeface.create(fontFamily.name, android.graphics.Typeface.NORMAL)
 
         for (weight in forRange) {
-            val actualTypefaceUpright = createNamed(
-                name = fontFamily,
-                fontWeight = FontWeight(weight),
-                fontStyle = FontStyle.Normal
-            )
+            val actualTypefaceUpright =
+                createNamed(
+                    name = fontFamily,
+                    fontWeight = FontWeight(weight),
+                    fontStyle = FontStyle.Normal
+                )
             assertThat(actualTypefaceUpright).isNotEqualTo(boldTypeface)
             assertThat(actualTypefaceUpright).isNotEqualTo(normalTypeface)
         }
@@ -114,16 +113,21 @@
         forRange: IntRange
     ) {
         for (weight in forRange) {
-            val normalTypeface = android.graphics.Typeface.create(
-                android.graphics.Typeface.create(fontFamily.name, android.graphics.Typeface.NORMAL),
-                weight,
-                false
-            )
-            val actualTypefaceUpright = createNamed(
-                name = fontFamily,
-                fontWeight = FontWeight(weight),
-                fontStyle = FontStyle.Normal
-            )
+            val normalTypeface =
+                android.graphics.Typeface.create(
+                    android.graphics.Typeface.create(
+                        fontFamily.name,
+                        android.graphics.Typeface.NORMAL
+                    ),
+                    weight,
+                    false
+                )
+            val actualTypefaceUpright =
+                createNamed(
+                    name = fontFamily,
+                    fontWeight = FontWeight(weight),
+                    fontStyle = FontStyle.Normal
+                )
             assertThat(actualTypefaceUpright).isEqualTo(normalTypeface)
         }
     }
@@ -132,18 +136,16 @@
     fun assertOptionalOnDeviceFontFamilyByName_returnsPlatformFallback_SansSerif_allWeights() {
         val subject = PlatformTypefaces()
         for (weight in 1..1000) {
-            val genericFontFamilyTypeface = subject.createNamed(
-                FontFamily.SansSerif,
-                FontWeight(weight),
-                FontStyle.Normal
-            )
-            val optionalOnDeviceFontFamilyTypeface = subject.optionalOnDeviceFontFamilyByName(
-                FontFamily.SansSerif.name,
-                FontWeight(weight),
-                FontStyle.Normal,
-                FontVariation.Settings(),
-                context
-            )
+            val genericFontFamilyTypeface =
+                subject.createNamed(FontFamily.SansSerif, FontWeight(weight), FontStyle.Normal)
+            val optionalOnDeviceFontFamilyTypeface =
+                subject.optionalOnDeviceFontFamilyByName(
+                    FontFamily.SansSerif.name,
+                    FontWeight(weight),
+                    FontStyle.Normal,
+                    FontVariation.Settings(),
+                    context
+                )
             assertThat(genericFontFamilyTypeface).isEqualTo(optionalOnDeviceFontFamilyTypeface)
         }
     }
@@ -152,18 +154,16 @@
     fun assertOptionalOnDeviceFontFamilyByName_returnsPlatformFallback_Serif_allWeights() {
         val subject = PlatformTypefaces()
         for (weight in 1..1000) {
-            val genericFontFamilyTypeface = subject.createNamed(
-                FontFamily.Serif,
-                FontWeight(weight),
-                FontStyle.Normal
-            )
-            val optionalOnDeviceFontFamilyTypeface = subject.optionalOnDeviceFontFamilyByName(
-                FontFamily.Serif.name,
-                FontWeight(weight),
-                FontStyle.Normal,
-                FontVariation.Settings(),
-                context
-            )
+            val genericFontFamilyTypeface =
+                subject.createNamed(FontFamily.Serif, FontWeight(weight), FontStyle.Normal)
+            val optionalOnDeviceFontFamilyTypeface =
+                subject.optionalOnDeviceFontFamilyByName(
+                    FontFamily.Serif.name,
+                    FontWeight(weight),
+                    FontStyle.Normal,
+                    FontVariation.Settings(),
+                    context
+                )
             assertThat(genericFontFamilyTypeface).isEqualTo(optionalOnDeviceFontFamilyTypeface)
         }
     }
@@ -172,18 +172,16 @@
     fun assertOptionalOnDeviceFontFamilyByName_returnsPlatformFallback_Monospace_allWeights() {
         val subject = PlatformTypefaces()
         for (weight in 1..1000) {
-            val genericFontFamilyTypeface = subject.createNamed(
-                FontFamily.Monospace,
-                FontWeight(weight),
-                FontStyle.Normal
-            )
-            val optionalOnDeviceFontFamilyTypeface = subject.optionalOnDeviceFontFamilyByName(
-                FontFamily.Monospace.name,
-                FontWeight(weight),
-                FontStyle.Normal,
-                FontVariation.Settings(),
-                context
-            )
+            val genericFontFamilyTypeface =
+                subject.createNamed(FontFamily.Monospace, FontWeight(weight), FontStyle.Normal)
+            val optionalOnDeviceFontFamilyTypeface =
+                subject.optionalOnDeviceFontFamilyByName(
+                    FontFamily.Monospace.name,
+                    FontWeight(weight),
+                    FontStyle.Normal,
+                    FontVariation.Settings(),
+                    context
+                )
             assertThat(genericFontFamilyTypeface).isEqualTo(optionalOnDeviceFontFamilyTypeface)
         }
     }
@@ -192,18 +190,16 @@
     fun assertOptionalOnDeviceFontFamilyByName_returnsPlatformFallback_Cursive_allWeights() {
         val subject = PlatformTypefaces()
         for (weight in 1..1000) {
-            val genericFontFamilyTypeface = subject.createNamed(
-                FontFamily.Cursive,
-                FontWeight(weight),
-                FontStyle.Normal
-            )
-            val optionalOnDeviceFontFamilyTypeface = subject.optionalOnDeviceFontFamilyByName(
-                FontFamily.Cursive.name,
-                FontWeight(weight),
-                FontStyle.Normal,
-                FontVariation.Settings(),
-                context
-            )
+            val genericFontFamilyTypeface =
+                subject.createNamed(FontFamily.Cursive, FontWeight(weight), FontStyle.Normal)
+            val optionalOnDeviceFontFamilyTypeface =
+                subject.optionalOnDeviceFontFamilyByName(
+                    FontFamily.Cursive.name,
+                    FontWeight(weight),
+                    FontStyle.Normal,
+                    FontVariation.Settings(),
+                    context
+                )
             assertThat(genericFontFamilyTypeface).isEqualTo(optionalOnDeviceFontFamilyTypeface)
         }
     }
diff --git a/compose/ui/ui-text/src/androidInstrumentedTest/kotlin/androidx/compose/ui/text/font/testutils/AsyncTestFonts.kt b/compose/ui/ui-text/src/androidInstrumentedTest/kotlin/androidx/compose/ui/text/font/testutils/AsyncTestFonts.kt
index a462530..f5d72fa 100644
--- a/compose/ui/ui-text/src/androidInstrumentedTest/kotlin/androidx/compose/ui/text/font/testutils/AsyncTestFonts.kt
+++ b/compose/ui/ui-text/src/androidInstrumentedTest/kotlin/androidx/compose/ui/text/font/testutils/AsyncTestFonts.kt
@@ -33,8 +33,7 @@
 class AsyncTestTypefaceLoader : AndroidFont.TypefaceLoader {
     private val callbackLock = Object()
     private var loadCallback: ((AndroidFont) -> Unit)? = null
-    @Volatile
-    private var asyncLoadCallback: ((AndroidFont) -> Unit)? = null
+    @Volatile private var asyncLoadCallback: ((AndroidFont) -> Unit)? = null
     private val requests =
         mutableMapOf<AsyncFauxFont, MutableList<CompletableDeferred<Typeface?>>>()
     internal val completedAsyncRequests = mutableListOf<AsyncFauxFont>()
@@ -44,48 +43,44 @@
     internal val optionalAsyncRequests = mutableListOf<Font>()
 
     override fun loadBlocking(context: Context, font: AndroidFont): Typeface? {
-        val result = when (font) {
-            is OptionalFauxFont -> {
-                optionalRequests.add(font)
-                font.typeface
+        val result =
+            when (font) {
+                is OptionalFauxFont -> {
+                    optionalRequests.add(font)
+                    font.typeface
+                }
+                is BlockingFauxFont -> {
+                    blockingRequests.add(font)
+                    font.typeface
+                }
+                else -> error("unsupported load() font")
             }
-            is BlockingFauxFont -> {
-                blockingRequests.add(font)
-                font.typeface
-            }
-            else -> error("unsupported load() font")
-        }
         loadCallback?.invoke(font)
         return result
     }
 
     override suspend fun awaitLoad(context: Context, font: AndroidFont): Typeface? {
-        val result = when (font) {
-            is OptionalFauxFont -> {
-                optionalAsyncRequests.add(font)
-                synchronized(callbackLock) {
-                    asyncLoadCallback?.invoke(font)
+        val result =
+            when (font) {
+                is OptionalFauxFont -> {
+                    optionalAsyncRequests.add(font)
+                    synchronized(callbackLock) { asyncLoadCallback?.invoke(font) }
+                    font.typeface
                 }
-                font.typeface
-            }
-            is BlockingFauxFont -> {
-                blockingAsyncRequests.add(font)
-                synchronized(callbackLock) {
-                    asyncLoadCallback?.invoke(font)
+                is BlockingFauxFont -> {
+                    blockingAsyncRequests.add(font)
+                    synchronized(callbackLock) { asyncLoadCallback?.invoke(font) }
+                    font.typeface
                 }
-                font.typeface
-            }
-            is AsyncFauxFont -> {
-                val deferred = CompletableDeferred<Typeface?>()
-                val list = requests.getOrPut(font) { mutableListOf() }
-                list.add(deferred)
-                synchronized(callbackLock) {
-                    asyncLoadCallback?.invoke(font)
+                is AsyncFauxFont -> {
+                    val deferred = CompletableDeferred<Typeface?>()
+                    val list = requests.getOrPut(font) { mutableListOf() }
+                    list.add(deferred)
+                    synchronized(callbackLock) { asyncLoadCallback?.invoke(font) }
+                    deferred.await()
                 }
-                deferred.await()
+                else -> null
             }
-            else -> null
-        }
         return result
     }
 
@@ -104,9 +99,7 @@
     }
 
     fun pendingRequestsFor(font: AsyncFauxFont): List<Font> {
-        return requests
-            .getOrPut(font) { mutableListOf() }
-            .map { font }
+        return requests.getOrPut(font) { mutableListOf() }.map { font }
     }
 
     fun completedRequests(): List<Font> {
@@ -126,9 +119,7 @@
     }
 
     fun onAsyncLoad(function: (AndroidFont) -> Unit) {
-        synchronized(callbackLock) {
-            asyncLoadCallback = function
-        }
+        synchronized(callbackLock) { asyncLoadCallback = function }
     }
 }
 
diff --git a/compose/ui/ui-text/src/androidInstrumentedTest/kotlin/androidx/compose/ui/text/font/testutils/FontFamilyResolverUtils.kt b/compose/ui/ui-text/src/androidInstrumentedTest/kotlin/androidx/compose/ui/text/font/testutils/FontFamilyResolverUtils.kt
index ce28acf..7f62426 100644
--- a/compose/ui/ui-text/src/androidInstrumentedTest/kotlin/androidx/compose/ui/text/font/testutils/FontFamilyResolverUtils.kt
+++ b/compose/ui/ui-text/src/androidInstrumentedTest/kotlin/androidx/compose/ui/text/font/testutils/FontFamilyResolverUtils.kt
@@ -41,15 +41,16 @@
     fontSynthesis: FontSynthesis = FontSynthesis.All,
     fontLoader: AndroidFontLoader
 ): Any? {
-    val result = get(
-        TypefaceRequest(
-            fontFamily = fontFamily,
-            fontWeight = fontWeight,
-            fontStyle = fontStyle,
-            fontSynthesis = fontSynthesis,
-            resourceLoaderCacheKey = fontLoader.cacheKey
+    val result =
+        get(
+            TypefaceRequest(
+                fontFamily = fontFamily,
+                fontWeight = fontWeight,
+                fontStyle = fontStyle,
+                fontSynthesis = fontSynthesis,
+                resourceLoaderCacheKey = fontLoader.cacheKey
+            )
         )
-    )
     if (result == null) {
         return result
     }
diff --git a/compose/ui/ui-text/src/androidInstrumentedTest/kotlin/androidx/compose/ui/text/input/BackspaceCommandTest.kt b/compose/ui/ui-text/src/androidInstrumentedTest/kotlin/androidx/compose/ui/text/input/BackspaceCommandTest.kt
index 829ce54..1752776 100644
--- a/compose/ui/ui-text/src/androidInstrumentedTest/kotlin/androidx/compose/ui/text/input/BackspaceCommandTest.kt
+++ b/compose/ui/ui-text/src/androidInstrumentedTest/kotlin/androidx/compose/ui/text/input/BackspaceCommandTest.kt
@@ -119,10 +119,7 @@
     @Test
     @SdkSuppress(minSdkVersion = 26)
     fun test_delete_with_composition_zwj_emoji() {
-        val eb = EditingBuffer(
-            "$ZWJ_EMOJI$ZWJ_EMOJI",
-            TextRange(ZWJ_EMOJI.length)
-        )
+        val eb = EditingBuffer("$ZWJ_EMOJI$ZWJ_EMOJI", TextRange(ZWJ_EMOJI.length))
 
         BackspaceCommand().applyTo(eb)
 
diff --git a/compose/ui/ui-text/src/androidInstrumentedTest/kotlin/androidx/compose/ui/text/intl/LocaleListTest.kt b/compose/ui/ui-text/src/androidInstrumentedTest/kotlin/androidx/compose/ui/text/intl/LocaleListTest.kt
index 52a36c8..f67c43d 100644
--- a/compose/ui/ui-text/src/androidInstrumentedTest/kotlin/androidx/compose/ui/text/intl/LocaleListTest.kt
+++ b/compose/ui/ui-text/src/androidInstrumentedTest/kotlin/androidx/compose/ui/text/intl/LocaleListTest.kt
@@ -43,25 +43,19 @@
 
     @Test
     fun equals_order_matters() {
-        assertThat(LocaleList("ja-JP,en-US"))
-            .isNotEqualTo(LocaleList("en-US,ja-JP"))
+        assertThat(LocaleList("ja-JP,en-US")).isNotEqualTo(LocaleList("en-US,ja-JP"))
     }
 
     @Test
     fun equals() {
-        assertThat(LocaleList("en-US,ja-JP"))
-            .isEqualTo(LocaleList("en-US,ja-JP"))
-        assertThat(LocaleList("en-US,ja-JP"))
-            .isNotEqualTo(LocaleList("en-US,es-ES"))
+        assertThat(LocaleList("en-US,ja-JP")).isEqualTo(LocaleList("en-US,ja-JP"))
+        assertThat(LocaleList("en-US,ja-JP")).isNotEqualTo(LocaleList("en-US,es-ES"))
     }
 
     @Test
     fun getCurrent_afterJavaLocaleSetDefault() {
-        val javaLocales = listOf(
-            java.util.Locale("ar"),
-            java.util.Locale("ja"),
-            java.util.Locale("en")
-        )
+        val javaLocales =
+            listOf(java.util.Locale("ar"), java.util.Locale("ja"), java.util.Locale("en"))
         for (javaLocale in javaLocales) {
             java.util.Locale.setDefault(javaLocale)
 
diff --git a/compose/ui/ui-text/src/androidInstrumentedTest/kotlin/androidx/compose/ui/text/matchers/BitmapSubject.kt b/compose/ui/ui-text/src/androidInstrumentedTest/kotlin/androidx/compose/ui/text/matchers/BitmapSubject.kt
index 7ccf78d..9f676b8 100644
--- a/compose/ui/ui-text/src/androidInstrumentedTest/kotlin/androidx/compose/ui/text/matchers/BitmapSubject.kt
+++ b/compose/ui/ui-text/src/androidInstrumentedTest/kotlin/androidx/compose/ui/text/matchers/BitmapSubject.kt
@@ -21,17 +21,16 @@
 import com.google.common.truth.Subject
 import com.google.common.truth.Subject.Factory
 
-/**
- * Truth extension for Bitmap.
- */
-internal class BitmapSubject private constructor(
-    failureMetadata: FailureMetadata?,
-    private val subject: Bitmap?
-) : Subject(failureMetadata, subject) {
+/** Truth extension for Bitmap. */
+internal class BitmapSubject
+private constructor(failureMetadata: FailureMetadata?, private val subject: Bitmap?) :
+    Subject(failureMetadata, subject) {
 
     companion object {
         internal val SUBJECT_FACTORY: Factory<BitmapSubject?, Bitmap?> =
-            Factory { failureMetadata, subject -> BitmapSubject(failureMetadata, subject) }
+            Factory { failureMetadata, subject ->
+                BitmapSubject(failureMetadata, subject)
+            }
     }
 
     /**
diff --git a/compose/ui/ui-text/src/androidInstrumentedTest/kotlin/androidx/compose/ui/text/matchers/CharSequenceSubject.kt b/compose/ui/ui-text/src/androidInstrumentedTest/kotlin/androidx/compose/ui/text/matchers/CharSequenceSubject.kt
index 77a996f..e16d527 100644
--- a/compose/ui/ui-text/src/androidInstrumentedTest/kotlin/androidx/compose/ui/text/matchers/CharSequenceSubject.kt
+++ b/compose/ui/ui-text/src/androidInstrumentedTest/kotlin/androidx/compose/ui/text/matchers/CharSequenceSubject.kt
@@ -25,26 +25,31 @@
 import com.google.common.truth.Truth.assertAbout
 import kotlin.reflect.KClass
 
-/**
- * Truth extension for CharSequence used for Span related checks.
- */
-internal class CharSequenceSubject private constructor(
-    failureMetadata: FailureMetadata?,
-    private val subject: CharSequence?
-) : Subject(failureMetadata, subject) {
+/** Truth extension for CharSequence used for Span related checks. */
+internal class CharSequenceSubject
+private constructor(failureMetadata: FailureMetadata?, private val subject: CharSequence?) :
+    Subject(failureMetadata, subject) {
 
     companion object {
         internal val SUBJECT_FACTORY: Factory<CharSequenceSubject?, CharSequence?> =
-            Factory { failureMetadata, subject -> CharSequenceSubject(failureMetadata, subject) }
+            Factory { failureMetadata, subject ->
+                CharSequenceSubject(failureMetadata, subject)
+            }
     }
 
     fun <T : Any> spans(spanClazz: KClass<out T>): SpanIterableSubject<T> {
         check("isNotNull()").that(subject).isNotNull()
         check("instanceOf()").that(subject).isInstanceOf(Spanned::class.java)
         val spanned = subject as Spanned
-        val spans = spanned.getSpans(0, spanned.length, spanClazz.java).map {
-            SpanInfo(it, spanned.getSpanStart(it), spanned.getSpanEnd(it), spanned.getSpanFlags(it))
-        }
+        val spans =
+            spanned.getSpans(0, spanned.length, spanClazz.java).map {
+                SpanInfo(
+                    it,
+                    spanned.getSpanStart(it),
+                    spanned.getSpanEnd(it),
+                    spanned.getSpanFlags(it)
+                )
+            }
         return assertAbout(SpanIterableSubject.factory(spanClazz)).that(spans)!!
     }
 
@@ -93,24 +98,20 @@
     }
 }
 
-/**
- * Truth extension for a list of Spans.
- */
-internal class SpanIterableSubject<T : Any> private constructor(
+/** Truth extension for a list of Spans. */
+internal class SpanIterableSubject<T : Any>
+private constructor(
     failureMetadata: FailureMetadata?,
     private val subjects: List<SpanInfo<out T>>?,
     private val spanClazz: KClass<out T>
 ) : IterableSubject(failureMetadata, subjects) {
 
     companion object {
-        fun <T : Any> factory(spanClazz: KClass<out T>): Factory<SpanIterableSubject<T>?,
-            List<SpanInfo<T>>?> {
+        fun <T : Any> factory(
+            spanClazz: KClass<out T>
+        ): Factory<SpanIterableSubject<T>?, List<SpanInfo<T>>?> {
             return Factory { failureMetadata, subject ->
-                SpanIterableSubject(
-                    failureMetadata,
-                    subject,
-                    spanClazz
-                )
+                SpanIterableSubject(failureMetadata, subject, spanClazz)
             }
         }
     }
@@ -136,15 +137,13 @@
         }
 
         failWithActual(
-            simpleFact(
-                "Can't find span $spanClazz at [$start, $end] ${toString(predicate)}"
-            )
+            simpleFact("Can't find span $spanClazz at [$start, $end] ${toString(predicate)}")
         )
     }
 
     /**
-     * Similar to [has] checks if the spans contain a span matching the given position and
-     * also that span is not covered by other spans.
+     * Similar to [has] checks if the spans contain a span matching the given position and also that
+     * span is not covered by other spans.
      *
      * @param start start position of the expected span
      * @param end end position of the expected span
@@ -158,8 +157,9 @@
             if (spanInfo.start == start || spanInfo.end == end) {
                 // Find the target span
                 if (predicate == null || predicate.invoke(spanInfo.span)) return
-            } else if (start in spanInfo.start until spanInfo.end ||
-                end in (spanInfo.start + 1)..spanInfo.end
+            } else if (
+                start in spanInfo.start until spanInfo.end ||
+                    end in (spanInfo.start + 1)..spanInfo.end
             ) {
                 // Find a span covers the given range.
                 // Impossible to find the target span on top.
@@ -168,9 +168,7 @@
         }
 
         failWithActual(
-            simpleFact(
-                "Can't find span $spanClazz at [$start, $end] ${toString(predicate)}"
-            )
+            simpleFact("Can't find span $spanClazz at [$start, $end] ${toString(predicate)}")
         )
     }
 
@@ -183,9 +181,7 @@
             return "{" +
                 subjects.joinToString(
                     separator = ", ",
-                    transform = {
-                        "${it.span::class.java.simpleName}[${it.start}, ${it.end}]"
-                    }
+                    transform = { "${it.span::class.java.simpleName}[${it.start}, ${it.end}]" }
                 ) +
                 "}"
         } else {
diff --git a/compose/ui/ui-text/src/androidInstrumentedTest/kotlin/androidx/compose/ui/text/matchers/RectSubject.kt b/compose/ui/ui-text/src/androidInstrumentedTest/kotlin/androidx/compose/ui/text/matchers/RectSubject.kt
index d253cae..5161b63 100644
--- a/compose/ui/ui-text/src/androidInstrumentedTest/kotlin/androidx/compose/ui/text/matchers/RectSubject.kt
+++ b/compose/ui/ui-text/src/androidInstrumentedTest/kotlin/androidx/compose/ui/text/matchers/RectSubject.kt
@@ -23,14 +23,15 @@
 import com.google.common.truth.Subject.Factory
 import com.google.common.truth.Truth.assertThat
 
-internal class RectSubject private constructor(
-    failureMetadata: FailureMetadata?,
-    private val subject: Rect?
-) : Subject(failureMetadata, subject) {
+internal class RectSubject
+private constructor(failureMetadata: FailureMetadata?, private val subject: Rect?) :
+    Subject(failureMetadata, subject) {
 
     companion object {
         internal val SUBJECT_FACTORY: Factory<RectSubject?, Rect?> =
-            Factory { failureMetadata, subject -> RectSubject(failureMetadata, subject) }
+            Factory { failureMetadata, subject ->
+                RectSubject(failureMetadata, subject)
+            }
     }
 
     fun isEqualToWithTolerance(expected: Rect) {
@@ -44,14 +45,15 @@
     }
 }
 
-internal class RectArraySubject private constructor(
-    failureMetadata: FailureMetadata?,
-    private val subject: Array<Rect>?
-) : Subject(failureMetadata, subject) {
+internal class RectArraySubject
+private constructor(failureMetadata: FailureMetadata?, private val subject: Array<Rect>?) :
+    Subject(failureMetadata, subject) {
 
     companion object {
         internal val SUBJECT_FACTORY: Factory<RectArraySubject?, Array<Rect>?> =
-            Factory { failureMetadata, subject -> RectArraySubject(failureMetadata, subject) }
+            Factory { failureMetadata, subject ->
+                RectArraySubject(failureMetadata, subject)
+            }
     }
 
     fun isEqualToWithTolerance(expected: Array<Rect>) {
@@ -59,7 +61,8 @@
         check("instanceOf()").that(subject).isInstanceOf(Array<Rect>::class.java)
         check("size").that(subject).hasLength(expected.size)
         for (index in subject!!.indices) {
-            androidx.compose.ui.text.matchers.assertThat(subject[index])
+            androidx.compose.ui.text.matchers
+                .assertThat(subject[index])
                 .isEqualToWithTolerance(expected[index])
         }
     }
diff --git a/compose/ui/ui-text/src/androidInstrumentedTest/kotlin/androidx/compose/ui/text/matchers/TypefaceResultSubject.kt b/compose/ui/ui-text/src/androidInstrumentedTest/kotlin/androidx/compose/ui/text/matchers/TypefaceResultSubject.kt
index 066baf9..87c82dc1 100644
--- a/compose/ui/ui-text/src/androidInstrumentedTest/kotlin/androidx/compose/ui/text/matchers/TypefaceResultSubject.kt
+++ b/compose/ui/ui-text/src/androidInstrumentedTest/kotlin/androidx/compose/ui/text/matchers/TypefaceResultSubject.kt
@@ -24,34 +24,31 @@
 import com.google.common.truth.Subject
 import com.google.common.truth.Subject.Factory
 
-internal class TypefaceResultSubject private constructor(
-    failureMetadata: FailureMetadata?,
-    private val subject: TypefaceResult?
-) : Subject(failureMetadata, subject) {
+internal class TypefaceResultSubject
+private constructor(failureMetadata: FailureMetadata?, private val subject: TypefaceResult?) :
+    Subject(failureMetadata, subject) {
 
     companion object {
         internal val SUBJECT_FACTORY: Factory<TypefaceResultSubject?, TypefaceResult?> =
-            Factory { failureMetadata, subject -> TypefaceResultSubject(failureMetadata, subject) }
+            Factory { failureMetadata, subject ->
+                TypefaceResultSubject(failureMetadata, subject)
+            }
     }
 
     fun isImmutableTypefaceOf(expectedInstance: Typeface) {
         check("isNotNull())").that(subject).isNotNull()
-        check("is TypefaceResult.Immutable").that(subject)
-            .isInstanceOf(Immutable::class.java)
-        check(".value == $expectedInstance").that(subject?.value)
-            .isSameInstanceAs(expectedInstance)
+        check("is TypefaceResult.Immutable").that(subject).isInstanceOf(Immutable::class.java)
+        check(".value == $expectedInstance").that(subject?.value).isSameInstanceAs(expectedInstance)
     }
 
     fun isImmutableTypeface() {
         check("isNotNull())").that(subject).isNotNull()
-        check("is TypefaceResult.Immutable").that(subject)
-            .isInstanceOf(Immutable::class.java)
+        check("is TypefaceResult.Immutable").that(subject).isInstanceOf(Immutable::class.java)
     }
 
     fun currentAsyncTypefaceValue(expectedInstance: Typeface) {
         check("isNotNull())").that(subject).isNotNull()
-        check("is TypefaceResult.Async").that(subject)
-            .isInstanceOf(Async::class.java)
+        check("is TypefaceResult.Async").that(subject).isInstanceOf(Async::class.java)
         check("$subject === $expectedInstance")
             .that(subject?.value)
             .isSameInstanceAs(expectedInstance)
@@ -59,15 +56,13 @@
 
     fun isAsyncTypeface() {
         check("isNotNull())").that(subject).isNotNull()
-        check("is TypefaceResult.Async").that(subject)
-            .isInstanceOf(Async::class.java)
+        check("is TypefaceResult.Async").that(subject).isInstanceOf(Async::class.java)
     }
 
-    override fun actualCustomStringRepresentation(): String = when (subject) {
-        null -> "null TypefaceResult"
-        is Immutable ->
-            "TypefaceResult.Immutable(value=${subject.value})"
-        is Async ->
-            "TypefaceResult.Immutable(currentState=${subject.current.value})"
-    }
+    override fun actualCustomStringRepresentation(): String =
+        when (subject) {
+            null -> "null TypefaceResult"
+            is Immutable -> "TypefaceResult.Immutable(value=${subject.value})"
+            is Async -> "TypefaceResult.Immutable(currentState=${subject.current.value})"
+        }
 }
diff --git a/compose/ui/ui-text/src/androidInstrumentedTest/kotlin/androidx/compose/ui/text/matchers/TypefaceSubject.kt b/compose/ui/ui-text/src/androidInstrumentedTest/kotlin/androidx/compose/ui/text/matchers/TypefaceSubject.kt
index 93f3e87..9714828 100644
--- a/compose/ui/ui-text/src/androidInstrumentedTest/kotlin/androidx/compose/ui/text/matchers/TypefaceSubject.kt
+++ b/compose/ui/ui-text/src/androidInstrumentedTest/kotlin/androidx/compose/ui/text/matchers/TypefaceSubject.kt
@@ -33,53 +33,54 @@
 /**
  * Truth extension for Typeface.
  *
- * Checks if a given [Typeface] has a given [FontWeight] and [FontStyle]. Since [Typeface] does
- * not contain the required information before API 28, it uses the set of specific fonts to infer
- * which type of font was loaded. Check [DEFINED_CHARACTERS] and [FontTestData] for the set of
- * fonts designed for this class.
+ * Checks if a given [Typeface] has a given [FontWeight] and [FontStyle]. Since [Typeface] does not
+ * contain the required information before API 28, it uses the set of specific fonts to infer which
+ * type of font was loaded. Check [DEFINED_CHARACTERS] and [FontTestData] for the set of fonts
+ * designed for this class.
  *
  * Each font contains [a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r] characters and [wide,narrow] glyph
- * types. Each font file includes one character that is represented with wide glyph, and others
- * with narrow. This is used in the tests in order to differentiate the font that is loaded for
- * a specific weight/style in the FontFamily.
+ * types. Each font file includes one character that is represented with wide glyph, and others with
+ * narrow. This is used in the tests in order to differentiate the font that is loaded for a
+ * specific weight/style in the FontFamily.
  *
  * The size difference between wide and narrow glyph is 3 (wide = 3 * narrow).
- *
  * - 200 italic has "a" with wide glyph
  * - 200 regular has "b" with wide glyph
  * - ...
  * - 900 italic has "q" with wide glyph
  * - 900 regular has "r" with wide glyph
  */
-internal class TypefaceSubject private constructor(
-    failureMetadata: FailureMetadata?,
-    private val subject: Typeface?
-) : Subject(failureMetadata, subject) {
+internal class TypefaceSubject
+private constructor(failureMetadata: FailureMetadata?, private val subject: Typeface?) :
+    Subject(failureMetadata, subject) {
 
     companion object {
         internal val SUBJECT_FACTORY: Factory<TypefaceSubject?, Typeface?> =
-            Factory { failureMetadata, subject -> TypefaceSubject(failureMetadata, subject) }
+            Factory { failureMetadata, subject ->
+                TypefaceSubject(failureMetadata, subject)
+            }
 
-        internal val DEFINED_CHARACTERS = arrayOf(
-            CharacterInfo('a', FontWeight.W100, FontStyle.Italic),
-            CharacterInfo('b', FontWeight.W100, FontStyle.Normal),
-            CharacterInfo('c', FontWeight.W200, FontStyle.Italic),
-            CharacterInfo('d', FontWeight.W200, FontStyle.Normal),
-            CharacterInfo('e', FontWeight.W300, FontStyle.Italic),
-            CharacterInfo('f', FontWeight.W300, FontStyle.Normal),
-            CharacterInfo('g', FontWeight.W400, FontStyle.Italic),
-            CharacterInfo('h', FontWeight.W400, FontStyle.Normal),
-            CharacterInfo('i', FontWeight.W500, FontStyle.Italic),
-            CharacterInfo('j', FontWeight.W500, FontStyle.Normal),
-            CharacterInfo('k', FontWeight.W600, FontStyle.Italic),
-            CharacterInfo('l', FontWeight.W600, FontStyle.Normal),
-            CharacterInfo('m', FontWeight.W700, FontStyle.Italic),
-            CharacterInfo('n', FontWeight.W700, FontStyle.Normal),
-            CharacterInfo('o', FontWeight.W800, FontStyle.Italic),
-            CharacterInfo('p', FontWeight.W800, FontStyle.Normal),
-            CharacterInfo('q', FontWeight.W900, FontStyle.Italic),
-            CharacterInfo('r', FontWeight.W900, FontStyle.Normal)
-        )
+        internal val DEFINED_CHARACTERS =
+            arrayOf(
+                CharacterInfo('a', FontWeight.W100, FontStyle.Italic),
+                CharacterInfo('b', FontWeight.W100, FontStyle.Normal),
+                CharacterInfo('c', FontWeight.W200, FontStyle.Italic),
+                CharacterInfo('d', FontWeight.W200, FontStyle.Normal),
+                CharacterInfo('e', FontWeight.W300, FontStyle.Italic),
+                CharacterInfo('f', FontWeight.W300, FontStyle.Normal),
+                CharacterInfo('g', FontWeight.W400, FontStyle.Italic),
+                CharacterInfo('h', FontWeight.W400, FontStyle.Normal),
+                CharacterInfo('i', FontWeight.W500, FontStyle.Italic),
+                CharacterInfo('j', FontWeight.W500, FontStyle.Normal),
+                CharacterInfo('k', FontWeight.W600, FontStyle.Italic),
+                CharacterInfo('l', FontWeight.W600, FontStyle.Normal),
+                CharacterInfo('m', FontWeight.W700, FontStyle.Italic),
+                CharacterInfo('n', FontWeight.W700, FontStyle.Normal),
+                CharacterInfo('o', FontWeight.W800, FontStyle.Italic),
+                CharacterInfo('p', FontWeight.W800, FontStyle.Normal),
+                CharacterInfo('q', FontWeight.W900, FontStyle.Italic),
+                CharacterInfo('r', FontWeight.W900, FontStyle.Normal)
+            )
     }
 
     private fun getPaint(typeface: Typeface): TextPaint {
@@ -106,21 +107,22 @@
     fun isTypefaceOf(fontWeight: FontWeight, fontStyle: FontStyle) {
         check("isNotNull()").that(subject).isNotNull()
         val typeface = subject as Typeface
-        val charInfo = DEFINED_CHARACTERS.find {
-            it.fontWeight == fontWeight && it.fontStyle == fontStyle
-        }!!
+        val charInfo =
+            DEFINED_CHARACTERS.find { it.fontWeight == fontWeight && it.fontStyle == fontStyle }!!
 
         val isSelectedFont = isSelectedFont(typeface, charInfo.character)
 
         if (Build.VERSION.SDK_INT >= 28) {
             check("sameTypeface($isSelectedFont, $fontWeight, $fontStyle)")
-                .that(isSelectedFont && typeface.weight == fontWeight.weight).isTrue()
+                .that(isSelectedFont && typeface.weight == fontWeight.weight)
+                .isTrue()
             // cannot check typeface.isItalic == (fontStyle == FontStyle.Italic) since it is for
             // fake italic, and for cases where synthesis is disable this does not give correct
             // signal
         } else {
             check("sameTypeface($isSelectedFont, $fontWeight, $fontStyle)")
-                .that(isSelectedFont).isTrue()
+                .that(isSelectedFont)
+                .isTrue()
         }
     }
 
@@ -147,21 +149,24 @@
 
         val platformTypefaceStyle = getAndroidTypefaceStyle(fontWeight, fontStyle)
         if (Build.VERSION.SDK_INT >= 28) {
-            check("weight == ($fontWeight)")
-                .that(typeface.weight).isEqualTo(fontWeight.weight)
+            check("weight == ($fontWeight)").that(typeface.weight).isEqualTo(fontWeight.weight)
             check("isItalic == ($fontStyle)")
-                .that(typeface.isItalic).isEqualTo(fontStyle == FontStyle.Italic)
+                .that(typeface.isItalic)
+                .isEqualTo(fontStyle == FontStyle.Italic)
             check("style == ($fontWeight, $fontStyle)")
-                .that(typeface.style).isEqualTo(platformTypefaceStyle)
+                .that(typeface.style)
+                .isEqualTo(platformTypefaceStyle)
         } else {
-            val expectBold = platformTypefaceStyle == Typeface.BOLD ||
-                platformTypefaceStyle == Typeface.BOLD_ITALIC
+            val expectBold =
+                platformTypefaceStyle == Typeface.BOLD ||
+                    platformTypefaceStyle == Typeface.BOLD_ITALIC
             check("isItalic == ($fontWeight)")
-                .that(typeface.isItalic).isEqualTo(fontStyle == FontStyle.Italic)
+                .that(typeface.isItalic)
+                .isEqualTo(fontStyle == FontStyle.Italic)
             check("style == ($fontWeight, $fontStyle)")
-                .that(typeface.style).isEqualTo(platformTypefaceStyle)
-            check("isBold == ($fontWeight)")
-                .that(typeface.isBold).isEqualTo(expectBold)
+                .that(typeface.style)
+                .isEqualTo(platformTypefaceStyle)
+            check("isBold == ($fontWeight)").that(typeface.isBold).isEqualTo(expectBold)
         }
     }
 }
@@ -190,10 +195,11 @@
     }
 }
 
-private fun Int.toTypefaceStyleString(): String = when (this) {
-    Typeface.NORMAL -> "NORMAL"
-    Typeface.BOLD -> "BOLD"
-    Typeface.BOLD_ITALIC -> "BOLD_ITALIC"
-    Typeface.ITALIC -> "ITALIC"
-    else -> "Unknown($this)"
-}
+private fun Int.toTypefaceStyleString(): String =
+    when (this) {
+        Typeface.NORMAL -> "NORMAL"
+        Typeface.BOLD -> "BOLD"
+        Typeface.BOLD_ITALIC -> "BOLD_ITALIC"
+        Typeface.ITALIC -> "ITALIC"
+        else -> "Unknown($this)"
+    }
diff --git a/compose/ui/ui-text/src/androidInstrumentedTest/kotlin/androidx/compose/ui/text/platform/AndroidAccessibilitySpannableStringTest.kt b/compose/ui/ui-text/src/androidInstrumentedTest/kotlin/androidx/compose/ui/text/platform/AndroidAccessibilitySpannableStringTest.kt
index 1580586c..697cffe 100644
--- a/compose/ui/ui-text/src/androidInstrumentedTest/kotlin/androidx/compose/ui/text/platform/AndroidAccessibilitySpannableStringTest.kt
+++ b/compose/ui/ui-text/src/androidInstrumentedTest/kotlin/androidx/compose/ui/text/platform/AndroidAccessibilitySpannableStringTest.kt
@@ -81,21 +81,18 @@
         val languageTag = "en-GB"
         val annotatedString = buildAnnotatedString {
             append("hello")
-            withStyle(style = SpanStyle(localeList = LocaleList(languageTag))) {
-                append("world")
-            }
+            withStyle(style = SpanStyle(localeList = LocaleList(languageTag))) { append("world") }
         }
 
-        val spannableString = annotatedString.toAccessibilitySpannableString(
-            density,
-            fontFamilyResolver,
-            urlSpanCache
-        )
+        val spannableString =
+            annotatedString.toAccessibilitySpannableString(
+                density,
+                fontFamilyResolver,
+                urlSpanCache
+            )
 
         assertThat(spannableString).isInstanceOf(SpannableString::class.java)
-        assertThat(spannableString).hasSpan(
-            LocaleSpan::class, 5, 10
-        ) {
+        assertThat(spannableString).hasSpan(LocaleSpan::class, 5, 10) {
             it.locale?.language == languageTag
             true
         }
@@ -106,21 +103,18 @@
         val color = Color.Black
         val annotatedString = buildAnnotatedString {
             append("hello")
-            withStyle(style = SpanStyle(color = color)) {
-                append("world")
-            }
+            withStyle(style = SpanStyle(color = color)) { append("world") }
         }
 
-        val spannableString = annotatedString.toAccessibilitySpannableString(
-            density,
-            fontFamilyResolver,
-            urlSpanCache
-        )
+        val spannableString =
+            annotatedString.toAccessibilitySpannableString(
+                density,
+                fontFamilyResolver,
+                urlSpanCache
+            )
 
         assertThat(spannableString).isInstanceOf(SpannableString::class.java)
-        assertThat(spannableString).hasSpan(
-            ForegroundColorSpan::class, 5, 10
-        ) {
+        assertThat(spannableString).hasSpan(ForegroundColorSpan::class, 5, 10) {
             it.foregroundColor == color.toArgb()
         }
     }
@@ -130,21 +124,18 @@
         val fontSize = 12.sp
         val annotatedString = buildAnnotatedString {
             append("hello")
-            withStyle(style = SpanStyle(fontSize = fontSize)) {
-                append("world")
-            }
+            withStyle(style = SpanStyle(fontSize = fontSize)) { append("world") }
         }
 
-        val spannableString = annotatedString.toAccessibilitySpannableString(
-            density,
-            fontFamilyResolver,
-            urlSpanCache
-        )
+        val spannableString =
+            annotatedString.toAccessibilitySpannableString(
+                density,
+                fontFamilyResolver,
+                urlSpanCache
+            )
 
         assertThat(spannableString).isInstanceOf(SpannableString::class.java)
-        assertThat(spannableString).hasSpan(
-            AbsoluteSizeSpan::class, 5, 10
-        ) {
+        assertThat(spannableString).hasSpan(AbsoluteSizeSpan::class, 5, 10) {
             it.size == with(density) { fontSize.roundToPx() }
         }
     }
@@ -154,21 +145,18 @@
         val fontSize = 2.em
         val annotatedString = buildAnnotatedString {
             append("hello")
-            withStyle(style = SpanStyle(fontSize = fontSize)) {
-                append("world")
-            }
+            withStyle(style = SpanStyle(fontSize = fontSize)) { append("world") }
         }
 
-        val spannableString = annotatedString.toAccessibilitySpannableString(
-            density,
-            fontFamilyResolver,
-            urlSpanCache
-        )
+        val spannableString =
+            annotatedString.toAccessibilitySpannableString(
+                density,
+                fontFamilyResolver,
+                urlSpanCache
+            )
 
         assertThat(spannableString).isInstanceOf(SpannableString::class.java)
-        assertThat(spannableString).hasSpan(
-            RelativeSizeSpan::class, 5, 10
-        ) {
+        assertThat(spannableString).hasSpan(RelativeSizeSpan::class, 5, 10) {
             it.sizeChange == fontSize.value
         }
     }
@@ -177,46 +165,36 @@
     fun toAccessibilitySpannableString_with_fontWeightBold() {
         val annotatedString = buildAnnotatedString {
             append("hello")
-            withStyle(style = SpanStyle(fontWeight = FontWeight.Bold)) {
-                append("world")
-            }
+            withStyle(style = SpanStyle(fontWeight = FontWeight.Bold)) { append("world") }
         }
 
-        val spannableString = annotatedString.toAccessibilitySpannableString(
-            density,
-            fontFamilyResolver,
-            urlSpanCache
-        )
+        val spannableString =
+            annotatedString.toAccessibilitySpannableString(
+                density,
+                fontFamilyResolver,
+                urlSpanCache
+            )
 
         assertThat(spannableString).isInstanceOf(SpannableString::class.java)
-        assertThat(spannableString).hasSpan(
-            StyleSpan::class, 5, 10
-        ) {
-            it.style == Typeface.BOLD
-        }
+        assertThat(spannableString).hasSpan(StyleSpan::class, 5, 10) { it.style == Typeface.BOLD }
     }
 
     @Test
     fun toAccessibilitySpannableString_with_italic() {
         val annotatedString = buildAnnotatedString {
             append("hello")
-            withStyle(style = SpanStyle(fontStyle = FontStyle.Italic)) {
-                append("world")
-            }
+            withStyle(style = SpanStyle(fontStyle = FontStyle.Italic)) { append("world") }
         }
 
-        val spannableString = annotatedString.toAccessibilitySpannableString(
-            density,
-            fontFamilyResolver,
-            urlSpanCache
-        )
+        val spannableString =
+            annotatedString.toAccessibilitySpannableString(
+                density,
+                fontFamilyResolver,
+                urlSpanCache
+            )
 
         assertThat(spannableString).isInstanceOf(SpannableString::class.java)
-        assertThat(spannableString).hasSpan(
-            StyleSpan::class, 5, 10
-        ) {
-            it.style == Typeface.ITALIC
-        }
+        assertThat(spannableString).hasSpan(StyleSpan::class, 5, 10) { it.style == Typeface.ITALIC }
     }
 
     @Test
@@ -224,25 +202,19 @@
         val fontFamily = FontFamily.Monospace
         val annotatedString = buildAnnotatedString {
             append("hello")
-            withStyle(style = SpanStyle(fontFamily = fontFamily)) {
-                append("world")
-            }
+            withStyle(style = SpanStyle(fontFamily = fontFamily)) { append("world") }
         }
 
-        val spannableString = annotatedString.toAccessibilitySpannableString(
-            density,
-            fontFamilyResolver,
-            urlSpanCache
-        )
+        val spannableString =
+            annotatedString.toAccessibilitySpannableString(
+                density,
+                fontFamilyResolver,
+                urlSpanCache
+            )
 
         assertThat(spannableString).isInstanceOf(SpannableString::class.java)
-        assertThat(
-            spannableString.getSpans(
-                0,
-                spannableString.length,
-                TypefaceSpan::class.java
-            )
-        ).isEmpty()
+        assertThat(spannableString.getSpans(0, spannableString.length, TypefaceSpan::class.java))
+            .isEmpty()
     }
 
     @Test
@@ -254,16 +226,15 @@
             }
         }
 
-        val spannableString = annotatedString.toAccessibilitySpannableString(
-            density,
-            fontFamilyResolver,
-            urlSpanCache
-        )
+        val spannableString =
+            annotatedString.toAccessibilitySpannableString(
+                density,
+                fontFamilyResolver,
+                urlSpanCache
+            )
 
         assertThat(spannableString).isInstanceOf(SpannableString::class.java)
-        assertThat(spannableString).hasSpan(
-            UnderlineSpan::class, 5, 10
-        )
+        assertThat(spannableString).hasSpan(UnderlineSpan::class, 5, 10)
     }
 
     @Test
@@ -275,16 +246,15 @@
             }
         }
 
-        val spannableString = annotatedString.toAccessibilitySpannableString(
-            density,
-            fontFamilyResolver,
-            urlSpanCache
-        )
+        val spannableString =
+            annotatedString.toAccessibilitySpannableString(
+                density,
+                fontFamilyResolver,
+                urlSpanCache
+            )
 
         assertThat(spannableString).isInstanceOf(SpannableString::class.java)
-        assertThat(spannableString).hasSpan(
-            StrikethroughSpan::class, 5, 10
-        )
+        assertThat(spannableString).hasSpan(StrikethroughSpan::class, 5, 10)
     }
 
     @Test
@@ -299,18 +269,15 @@
             }
         }
 
-        val spannableString = annotatedString.toAccessibilitySpannableString(
-            density,
-            fontFamilyResolver,
-            urlSpanCache
-        )
+        val spannableString =
+            annotatedString.toAccessibilitySpannableString(
+                density,
+                fontFamilyResolver,
+                urlSpanCache
+            )
 
         assertThat(spannableString).isInstanceOf(SpannableString::class.java)
-        assertThat(spannableString).hasSpan(
-            ScaleXSpan::class, 5, 10
-        ) {
-            it.scaleX == scaleX
-        }
+        assertThat(spannableString).hasSpan(ScaleXSpan::class, 5, 10) { it.scaleX == scaleX }
     }
 
     @Test
@@ -318,21 +285,18 @@
         val backgroundColor = Color.Red
         val annotatedString = buildAnnotatedString {
             append("hello")
-            withStyle(style = SpanStyle(background = backgroundColor)) {
-                append("world")
-            }
+            withStyle(style = SpanStyle(background = backgroundColor)) { append("world") }
         }
 
-        val spannableString = annotatedString.toAccessibilitySpannableString(
-            density,
-            fontFamilyResolver,
-            urlSpanCache
-        )
+        val spannableString =
+            annotatedString.toAccessibilitySpannableString(
+                density,
+                fontFamilyResolver,
+                urlSpanCache
+            )
 
         assertThat(spannableString).isInstanceOf(SpannableString::class.java)
-        assertThat(spannableString).hasSpan(
-            BackgroundColorSpan::class, 5, 10
-        ) {
+        assertThat(spannableString).hasSpan(BackgroundColorSpan::class, 5, 10) {
             it.backgroundColor == backgroundColor.toArgb()
         }
     }
@@ -341,21 +305,18 @@
     fun toAccessibilitySpannableString_with_verbatimTtsAnnotation() {
         val annotatedString = buildAnnotatedString {
             append("hello")
-            withAnnotation(VerbatimTtsAnnotation("verbatim")) {
-                append("world")
-            }
+            withAnnotation(VerbatimTtsAnnotation("verbatim")) { append("world") }
         }
 
-        val spannableString = annotatedString.toAccessibilitySpannableString(
-            density,
-            fontFamilyResolver,
-            urlSpanCache
-        )
+        val spannableString =
+            annotatedString.toAccessibilitySpannableString(
+                density,
+                fontFamilyResolver,
+                urlSpanCache
+            )
 
         assertThat(spannableString).isInstanceOf(SpannableString::class.java)
-        assertThat(spannableString).hasSpan(
-            TtsSpan::class, 5, 10
-        ) {
+        assertThat(spannableString).hasSpan(TtsSpan::class, 5, 10) {
             it.type == TtsSpan.TYPE_VERBATIM &&
                 it.args.getString(TtsSpan.ARG_VERBATIM) == "verbatim"
         }
@@ -365,23 +326,18 @@
     fun toAccessibilitySpannableString_with_urlAnnotation() {
         val annotatedString = buildAnnotatedString {
             append("hello")
-            withAnnotation(UrlAnnotation("http://url.com")) {
-                append("world")
-            }
+            withAnnotation(UrlAnnotation("http://url.com")) { append("world") }
         }
 
-        val spannableString = annotatedString.toAccessibilitySpannableString(
-            density,
-            fontFamilyResolver,
-            urlSpanCache
-        )
+        val spannableString =
+            annotatedString.toAccessibilitySpannableString(
+                density,
+                fontFamilyResolver,
+                urlSpanCache
+            )
 
         assertThat(spannableString).isInstanceOf(SpannableString::class.java)
-        assertThat(spannableString).hasSpan(
-            URLSpan::class, 5, 10
-        ) {
-            it.url == "http://url.com"
-        }
+        assertThat(spannableString).hasSpan(URLSpan::class, 5, 10) { it.url == "http://url.com" }
     }
 
     @Test
@@ -416,12 +372,10 @@
             append("link")
         }
 
-        val spannable1 = string.toAccessibilitySpannableString(
-            density, fontFamilyResolver, urlSpanCache
-        )
-        val spannable2 = string.toAccessibilitySpannableString(
-            density, fontFamilyResolver, urlSpanCache
-        )
+        val spannable1 =
+            string.toAccessibilitySpannableString(density, fontFamilyResolver, urlSpanCache)
+        val spannable2 =
+            string.toAccessibilitySpannableString(density, fontFamilyResolver, urlSpanCache)
         val urlSpan1 = spannable1.getSpans(0, string.length, URLSpan::class.java).single()
         val urlSpan2 = spannable2.getSpans(0, string.length, URLSpan::class.java).single()
 
@@ -438,12 +392,10 @@
             append("link")
         }
 
-        val spannable1 = string.toAccessibilitySpannableString(
-            density, fontFamilyResolver, urlSpanCache
-        )
-        val spannable2 = string.toAccessibilitySpannableString(
-            density, fontFamilyResolver, urlSpanCache
-        )
+        val spannable1 =
+            string.toAccessibilitySpannableString(density, fontFamilyResolver, urlSpanCache)
+        val spannable2 =
+            string.toAccessibilitySpannableString(density, fontFamilyResolver, urlSpanCache)
         val urlSpan1 = spannable1.getSpans(0, string.length, URLSpan::class.java).single()
         val urlSpan2 = spannable2.getSpans(0, string.length, URLSpan::class.java).single()
 
@@ -460,12 +412,10 @@
             append("link")
         }
 
-        val spannable1 = string.toAccessibilitySpannableString(
-            density, fontFamilyResolver, urlSpanCache
-        )
-        val spannable2 = string.toAccessibilitySpannableString(
-            density, fontFamilyResolver, urlSpanCache
-        )
+        val spannable1 =
+            string.toAccessibilitySpannableString(density, fontFamilyResolver, urlSpanCache)
+        val spannable2 =
+            string.toAccessibilitySpannableString(density, fontFamilyResolver, urlSpanCache)
         val span1 = spannable1.getSpans(0, string.length, ClickableSpan::class.java).single()
         val span2 = spannable2.getSpans(0, string.length, ClickableSpan::class.java).single()
 
@@ -475,19 +425,17 @@
 
     @Test
     fun clickableSpansSame_forSameAnnotationAndRange_forClickables() {
-        val link = LinkAnnotation.Clickable("Tag", linkInteractionListener = { })
+        val link = LinkAnnotation.Clickable("Tag", linkInteractionListener = {})
 
         val string = buildAnnotatedString {
             pushLink(link)
             append("clickable")
         }
 
-        val spannable1 = string.toAccessibilitySpannableString(
-            density, fontFamilyResolver, urlSpanCache
-        )
-        val spannable2 = string.toAccessibilitySpannableString(
-            density, fontFamilyResolver, urlSpanCache
-        )
+        val spannable1 =
+            string.toAccessibilitySpannableString(density, fontFamilyResolver, urlSpanCache)
+        val spannable2 =
+            string.toAccessibilitySpannableString(density, fontFamilyResolver, urlSpanCache)
         val span1 = spannable1.getSpans(0, string.length, ClickableSpan::class.java).single()
         val span2 = spannable2.getSpans(0, string.length, ClickableSpan::class.java).single()
 
@@ -504,9 +452,8 @@
             withLink(link) { append("link") }
         }
 
-        val spannable = string.toAccessibilitySpannableString(
-            density, fontFamilyResolver, urlSpanCache
-        )
+        val spannable =
+            string.toAccessibilitySpannableString(density, fontFamilyResolver, urlSpanCache)
         val span1 = spannable.getSpans(0, string.length, ClickableSpan::class.java)[0]
         val span2 = spannable.getSpans(0, string.length, ClickableSpan::class.java)[1]
 
@@ -522,9 +469,8 @@
             withLink(link) { append("link") }
         }
 
-        val spannable = string.toAccessibilitySpannableString(
-            density, fontFamilyResolver, urlSpanCache
-        )
+        val spannable =
+            string.toAccessibilitySpannableString(density, fontFamilyResolver, urlSpanCache)
         val span1 = spannable.getSpans(0, string.length, ClickableSpan::class.java)[0]
         val span2 = spannable.getSpans(0, string.length, ClickableSpan::class.java)[1]
 
diff --git a/compose/ui/ui-text/src/androidInstrumentedTest/kotlin/androidx/compose/ui/text/platform/AndroidParagraphGetRangeForRectTest.kt b/compose/ui/ui-text/src/androidInstrumentedTest/kotlin/androidx/compose/ui/text/platform/AndroidParagraphGetRangeForRectTest.kt
index 4db957a..64d9fdb 100644
--- a/compose/ui/ui-text/src/androidInstrumentedTest/kotlin/androidx/compose/ui/text/platform/AndroidParagraphGetRangeForRectTest.kt
+++ b/compose/ui/ui-text/src/androidInstrumentedTest/kotlin/androidx/compose/ui/text/platform/AndroidParagraphGetRangeForRectTest.kt
@@ -59,11 +59,12 @@
     fun getRangeForRect_characterGranularity_containsCenter_singleLine() {
         val fontSize = 10f
         val text = "abcdef"
-        val paragraph = simpleParagraph(
-            text = text,
-            style = TextStyle(fontSize = fontSize.sp, fontFamily = basicFontFamily),
-            width = Float.MAX_VALUE
-        )
+        val paragraph =
+            simpleParagraph(
+                text = text,
+                style = TextStyle(fontSize = fontSize.sp, fontFamily = basicFontFamily),
+                width = Float.MAX_VALUE
+            )
 
         // Precondition check: only 1 lines is laid out.
         assertThat(paragraph.lineCount).isEqualTo(1)
@@ -72,11 +73,12 @@
                 val startBoundingBox = paragraph.getBoundingBox(start)
                 val endBoundingBox = paragraph.getBoundingBox(end - 1)
                 val rect = boundingBoxOf(startBoundingBox.center, endBoundingBox.center)
-                val range = paragraph.getRangeForRect(
-                    rect,
-                    TextGranularity.Character,
-                    TextInclusionStrategy.ContainsCenter
-                )
+                val range =
+                    paragraph.getRangeForRect(
+                        rect,
+                        TextGranularity.Character,
+                        TextInclusionStrategy.ContainsCenter
+                    )
                 assertThat(range).isEqualTo(TextRange(start, end))
             }
         }
@@ -86,11 +88,12 @@
     fun getRangeForRect_characterGranularity_containsAll_singleLine() {
         val fontSize = 10f
         val text = "abcdef"
-        val paragraph = simpleParagraph(
-            text = text,
-            style = TextStyle(fontSize = fontSize.sp, fontFamily = basicFontFamily),
-            width = Float.MAX_VALUE
-        )
+        val paragraph =
+            simpleParagraph(
+                text = text,
+                style = TextStyle(fontSize = fontSize.sp, fontFamily = basicFontFamily),
+                width = Float.MAX_VALUE
+            )
 
         // Precondition check: only 1 lines is laid out.
         assertThat(paragraph.lineCount).isEqualTo(1)
@@ -99,11 +102,12 @@
                 val startBoundingBox = paragraph.getBoundingBox(start)
                 val endBoundingBox = paragraph.getBoundingBox(end - 1)
                 val rect = boundingBoxOf(startBoundingBox, endBoundingBox)
-                val range = paragraph.getRangeForRect(
-                    rect,
-                    TextGranularity.Character,
-                    TextInclusionStrategy.ContainsAll
-                )
+                val range =
+                    paragraph.getRangeForRect(
+                        rect,
+                        TextGranularity.Character,
+                        TextInclusionStrategy.ContainsAll
+                    )
                 assertThat(range).isEqualTo(TextRange(start, end))
             }
         }
@@ -113,11 +117,12 @@
     fun getRangeForRect_characterGranularity_anyOverlap_singleLine() {
         val fontSize = 10f
         val text = "abcdef"
-        val paragraph = simpleParagraph(
-            text = text,
-            style = TextStyle(fontSize = fontSize.sp, fontFamily = basicFontFamily),
-            width = Float.MAX_VALUE
-        )
+        val paragraph =
+            simpleParagraph(
+                text = text,
+                style = TextStyle(fontSize = fontSize.sp, fontFamily = basicFontFamily),
+                width = Float.MAX_VALUE
+            )
 
         // Precondition check: only 1 lines is laid out.
         assertThat(paragraph.lineCount).isEqualTo(1)
@@ -128,15 +133,15 @@
                 val endBoundingBox = paragraph.getBoundingBox(end - 1)
 
                 // It's testing any overlap, make top and bottom 1 pixel away.
-                val rect = boundingBoxOf(startBoundingBox, endBoundingBox).copy(
-                    top = lineTop,
-                    bottom = lineTop + 1
-                )
-                val range = paragraph.getRangeForRect(
-                    rect,
-                    TextGranularity.Character,
-                    TextInclusionStrategy.AnyOverlap
-                )
+                val rect =
+                    boundingBoxOf(startBoundingBox, endBoundingBox)
+                        .copy(top = lineTop, bottom = lineTop + 1)
+                val range =
+                    paragraph.getRangeForRect(
+                        rect,
+                        TextGranularity.Character,
+                        TextInclusionStrategy.AnyOverlap
+                    )
                 assertThat(range).isEqualTo(TextRange(start, end))
             }
         }
@@ -147,22 +152,24 @@
         val text = "abcdef"
         val fontSize = 10f
         val charPerLine = 3
-        val paragraph = simpleParagraph(
-            text = text,
-            style = TextStyle(fontSize = fontSize.sp, fontFamily = basicFontFamily),
-            width = fontSize * charPerLine
-        )
+        val paragraph =
+            simpleParagraph(
+                text = text,
+                style = TextStyle(fontSize = fontSize.sp, fontFamily = basicFontFamily),
+                width = fontSize * charPerLine
+            )
 
         // Precondition check: 2 lines are laid out.
         assertThat(paragraph.lineCount).isEqualTo(2)
 
         // Character 'b' and 'e' are covered in the rectangle.
         val rect = paragraph.boundingBoxOf(text.indexOf('b'), text.indexOf('e'))
-        val range = paragraph.getRangeForRect(
-            rect,
-            TextGranularity.Character,
-            TextInclusionStrategy.ContainsCenter
-        )
+        val range =
+            paragraph.getRangeForRect(
+                rect,
+                TextGranularity.Character,
+                TextInclusionStrategy.ContainsCenter
+            )
 
         assertThat(range).isEqualTo(text.rangeOf('b', 'e'))
     }
@@ -171,22 +178,24 @@
     fun getRangeForRect_characterGranularity_singleLine_compoundCharacter() {
         val fontSize = 10f
         val text = "ab\uD83D\uDE03def" // \uD83D\uDE03 is the smiling face emoji
-        val paragraph = simpleParagraph(
-            text = text,
-            style = TextStyle(fontSize = fontSize.sp, fontFamily = basicFontFamily),
-            width = Float.MAX_VALUE
-        )
+        val paragraph =
+            simpleParagraph(
+                text = text,
+                style = TextStyle(fontSize = fontSize.sp, fontFamily = basicFontFamily),
+                width = Float.MAX_VALUE
+            )
 
         // Precondition check: only 1 line is laid out.
         assertThat(paragraph.lineCount).isEqualTo(1)
 
         // This rect should covers character 'b' and the following smiling emoji.
         val rect = paragraph.boundingBoxOf(text.indexOf('b'), text.indexOf('\uDE03'))
-        val range = paragraph.getRangeForRect(
-            rect,
-            TextGranularity.Character,
-            TextInclusionStrategy.ContainsCenter
-        )
+        val range =
+            paragraph.getRangeForRect(
+                rect,
+                TextGranularity.Character,
+                TextInclusionStrategy.ContainsCenter
+            )
 
         assertThat(range).isEqualTo(text.rangeOf('b', '\uDE03'))
     }
@@ -196,11 +205,12 @@
         val fontSize = 10f
         val text = "abc\u05D1\u05D2\u05D3" // rendered in the order of: a b c \u05D3 \u05D2 \u05D1
 
-        val paragraph = simpleParagraph(
-            text = text,
-            style = TextStyle(fontSize = fontSize.sp, fontFamily = basicFontFamily),
-            width = Float.MAX_VALUE
-        )
+        val paragraph =
+            simpleParagraph(
+                text = text,
+                style = TextStyle(fontSize = fontSize.sp, fontFamily = basicFontFamily),
+                width = Float.MAX_VALUE
+            )
 
         // Precondition check: only 1 line is laid out.
         assertThat(paragraph.lineCount).isEqualTo(1)
@@ -208,11 +218,12 @@
         // This rectangle covers character 'c' and also the character \u05D3, characters between
         // them are also included in the final range. The final range is [2, 6)
         val rect = paragraph.boundingBoxOf(text.indexOf('c'), text.indexOf('\u05D3'))
-        val range = paragraph.getRangeForRect(
-            rect,
-            TextGranularity.Character,
-            TextInclusionStrategy.ContainsCenter
-        )
+        val range =
+            paragraph.getRangeForRect(
+                rect,
+                TextGranularity.Character,
+                TextInclusionStrategy.ContainsCenter
+            )
 
         assertThat(range).isEqualTo(text.rangeOf('c', '\u05D3'))
     }
@@ -222,11 +233,12 @@
         val fontSize = 10f
         val text = "abcdef"
 
-        val paragraph = simpleParagraph(
-            text = text,
-            style = TextStyle(fontSize = fontSize.sp, fontFamily = basicFontFamily),
-            width = Float.MAX_VALUE
-        )
+        val paragraph =
+            simpleParagraph(
+                text = text,
+                style = TextStyle(fontSize = fontSize.sp, fontFamily = basicFontFamily),
+                width = Float.MAX_VALUE
+            )
 
         // Precondition check: only 1 line is laid out.
         assertThat(paragraph.lineCount).isEqualTo(1)
@@ -239,11 +251,12 @@
         val right = left + fontSize * 0.4f
 
         val rect = Rect(left, top, right, bottom)
-        val range = paragraph.getRangeForRect(
-            rect,
-            TextGranularity.Character,
-            TextInclusionStrategy.ContainsCenter
-        )
+        val range =
+            paragraph.getRangeForRect(
+                rect,
+                TextGranularity.Character,
+                TextInclusionStrategy.ContainsCenter
+            )
 
         assertThat(range).isEqualTo(TextRange.Zero)
     }
@@ -253,11 +266,12 @@
         val fontSize = 10f
         val text = "abc def"
 
-        val paragraph = simpleParagraph(
-            text = text,
-            style = TextStyle(fontSize = fontSize.sp, fontFamily = basicFontFamily),
-            width = Float.MAX_VALUE
-        )
+        val paragraph =
+            simpleParagraph(
+                text = text,
+                style = TextStyle(fontSize = fontSize.sp, fontFamily = basicFontFamily),
+                width = Float.MAX_VALUE
+            )
 
         // Precondition check: only 1 line is laid out.
         assertThat(paragraph.lineCount).isEqualTo(1)
@@ -266,11 +280,12 @@
 
         // This rectangle covers the center of the word "abc".
         val rect = boundingBoxOf(bBoundingBox.center)
-        val range = paragraph.getRangeForRect(
-            rect,
-            TextGranularity.Word,
-            TextInclusionStrategy.ContainsCenter
-        )
+        val range =
+            paragraph.getRangeForRect(
+                rect,
+                TextGranularity.Word,
+                TextInclusionStrategy.ContainsCenter
+            )
 
         assertThat(range).isEqualTo(text.rangeOf('a', 'c'))
     }
@@ -280,22 +295,20 @@
         val fontSize = 10f
         val text = "abc def hij"
 
-        val paragraph = simpleParagraph(
-            text = text,
-            style = TextStyle(fontSize = fontSize.sp, fontFamily = basicFontFamily),
-            width = Float.MAX_VALUE
-        )
+        val paragraph =
+            simpleParagraph(
+                text = text,
+                style = TextStyle(fontSize = fontSize.sp, fontFamily = basicFontFamily),
+                width = Float.MAX_VALUE
+            )
 
         // Precondition check: only 1 line is laid out.
         assertThat(paragraph.lineCount).isEqualTo(1)
 
         // This rectangle covers the word "def"'s bounds and partially covers "hij".
         val rect = paragraph.boundingBoxOf(text.indexOf('d'), text.indexOf('i'))
-        val range = paragraph.getRangeForRect(
-            rect,
-            TextGranularity.Word,
-            TextInclusionStrategy.ContainsAll
-        )
+        val range =
+            paragraph.getRangeForRect(rect, TextGranularity.Word, TextInclusionStrategy.ContainsAll)
 
         assertThat(range).isEqualTo(text.rangeOf('d', 'f'))
     }
@@ -305,11 +318,12 @@
         val fontSize = 10f
         val text = "abc def hij"
 
-        val paragraph = simpleParagraph(
-            text = text,
-            style = TextStyle(fontSize = fontSize.sp, fontFamily = basicFontFamily),
-            width = Float.MAX_VALUE
-        )
+        val paragraph =
+            simpleParagraph(
+                text = text,
+                style = TextStyle(fontSize = fontSize.sp, fontFamily = basicFontFamily),
+                width = Float.MAX_VALUE
+            )
 
         // Precondition check: only 1 line is laid out.
         assertThat(paragraph.lineCount).isEqualTo(1)
@@ -318,11 +332,8 @@
         val dBoundingBox = paragraph.getBoundingBox(text.indexOf('d'))
 
         val rect = boundingBoxOf(dBoundingBox.topLeft)
-        val range = paragraph.getRangeForRect(
-            rect,
-            TextGranularity.Word,
-            TextInclusionStrategy.AnyOverlap
-        )
+        val range =
+            paragraph.getRangeForRect(rect, TextGranularity.Word, TextInclusionStrategy.AnyOverlap)
 
         assertThat(range).isEqualTo(text.rangeOf('d', 'f'))
     }
@@ -332,22 +343,24 @@
         val fontSize = 10f
         val text = "abc def"
 
-        val paragraph = simpleParagraph(
-            text = text,
-            style = TextStyle(fontSize = fontSize.sp, fontFamily = basicFontFamily),
-            width = Float.MAX_VALUE
-        )
+        val paragraph =
+            simpleParagraph(
+                text = text,
+                style = TextStyle(fontSize = fontSize.sp, fontFamily = basicFontFamily),
+                width = Float.MAX_VALUE
+            )
 
         // Precondition check: only 1 line is laid out.
         assertThat(paragraph.lineCount).isEqualTo(1)
 
         // This rectangle covers only the space character, returned range is null
         val rect = paragraph.getBoundingBox(text.indexOf(' '))
-        val range = paragraph.getRangeForRect(
-            rect,
-            TextGranularity.Word,
-            TextInclusionStrategy.ContainsCenter
-        )
+        val range =
+            paragraph.getRangeForRect(
+                rect,
+                TextGranularity.Word,
+                TextInclusionStrategy.ContainsCenter
+            )
 
         assertThat(range).isEqualTo(TextRange.Zero)
     }
@@ -358,22 +371,24 @@
         val charPerLine = 7
         val text = "abc def ghk lmn"
 
-        val paragraph = simpleParagraph(
-            text = text,
-            style = TextStyle(fontSize = fontSize.sp, fontFamily = basicFontFamily),
-            width = fontSize * charPerLine
-        )
+        val paragraph =
+            simpleParagraph(
+                text = text,
+                style = TextStyle(fontSize = fontSize.sp, fontFamily = basicFontFamily),
+                width = fontSize * charPerLine
+            )
 
         // Precondition check: 2 lines are laid out.
         assertThat(paragraph.lineCount).isEqualTo(2)
 
         // This rectangle covers the center of the word "abc" and "ghk".
         val rect = paragraph.boundingBoxOf(text.indexOf('b'), text.indexOf('h'))
-        val range = paragraph.getRangeForRect(
-            rect,
-            TextGranularity.Word,
-            TextInclusionStrategy.ContainsCenter
-        )
+        val range =
+            paragraph.getRangeForRect(
+                rect,
+                TextGranularity.Word,
+                TextInclusionStrategy.ContainsCenter
+            )
 
         assertThat(range).isEqualTo(text.rangeOf('a', 'k'))
     }
@@ -384,11 +399,12 @@
         val charPerLine = 7
         val text = "abc def g hi"
 
-        val paragraph = simpleParagraph(
-            text = text,
-            style = TextStyle(fontSize = fontSize.sp, fontFamily = basicFontFamily),
-            width = fontSize * charPerLine
-        )
+        val paragraph =
+            simpleParagraph(
+                text = text,
+                style = TextStyle(fontSize = fontSize.sp, fontFamily = basicFontFamily),
+                width = fontSize * charPerLine
+            )
 
         // This paragraph is rendered like this:
         //   abc def
@@ -401,11 +417,12 @@
         // This rectangle covers the center of the word "abc" but only covers the space at the
         // second line, the returned range only covers "abc".
         val rect = paragraph.boundingBoxOf(text.indexOf('b'), 9)
-        val range = paragraph.getRangeForRect(
-            rect,
-            TextGranularity.Word,
-            TextInclusionStrategy.ContainsCenter
-        )
+        val range =
+            paragraph.getRangeForRect(
+                rect,
+                TextGranularity.Word,
+                TextInclusionStrategy.ContainsCenter
+            )
 
         assertThat(range).isEqualTo(text.rangeOf('a', 'c'))
     }
@@ -417,11 +434,12 @@
         //   abc \u05D4\u05D3 \u05D2\u05D1
         val text = "abc \u05D1\u05D2 \u05D3\u05D4"
 
-        val paragraph = simpleParagraph(
-            text = text,
-            style = TextStyle(fontSize = fontSize.sp, fontFamily = basicFontFamily),
-            width = Float.MAX_VALUE
-        )
+        val paragraph =
+            simpleParagraph(
+                text = text,
+                style = TextStyle(fontSize = fontSize.sp, fontFamily = basicFontFamily),
+                width = Float.MAX_VALUE
+            )
 
         // Precondition check: only 1 line is laid out.
         assertThat(paragraph.lineCount).isEqualTo(1)
@@ -429,11 +447,12 @@
         // This rectangle covers the center of the word "abc" and "\u05D3\u05D4",
         // the returned range is [0, text.length)
         val rect = paragraph.boundingBoxOf(text.indexOf('b'), text.indexOf('\u05D3'))
-        val range = paragraph.getRangeForRect(
-            rect,
-            TextGranularity.Word,
-            TextInclusionStrategy.ContainsCenter
-        )
+        val range =
+            paragraph.getRangeForRect(
+                rect,
+                TextGranularity.Word,
+                TextInclusionStrategy.ContainsCenter
+            )
 
         assertThat(range).isEqualTo(TextRange(0, text.length))
     }
@@ -446,9 +465,7 @@
         return boundingBoxOf(*offsets.map { getBoundingBox(it) }.toTypedArray())
     }
 
-    /**
-     * Helper function that returns the minimal [Rect] which contains all the given [rects].
-     */
+    /** Helper function that returns the minimal [Rect] which contains all the given [rects]. */
     private fun boundingBoxOf(vararg rects: Rect): Rect {
         return Rect(
             left = rects.minOf { it.left },
@@ -459,16 +476,16 @@
     }
 
     /**
-     * Helper function that returns a minimal [Rect] which contains the given point represented
-     * in Offset.
+     * Helper function that returns a minimal [Rect] which contains the given point represented in
+     * Offset.
      */
     private fun boundingBoxOf(offset: Offset): Rect {
         return Rect(offset.x, offset.y, offset.x + 0.01f, offset.y + 0.01f)
     }
 
     /**
-     * Helper function that returns a minimal [Rect] which contains the given points represented
-     * in Offset.
+     * Helper function that returns a minimal [Rect] which contains the given points represented in
+     * Offset.
      */
     private fun boundingBoxOf(offset1: Offset, offset2: Offset): Rect {
         val left = min(offset1.x, offset2.x)
@@ -494,17 +511,16 @@
             text = text,
             spanStyles = spanStyles,
             placeholders = listOf(),
-            style = TextStyle(
-                fontFamily = basicFontFamily,
-                textAlign = textAlign,
-                textIndent = textIndent
-            ).merge(style),
+            style =
+                TextStyle(
+                        fontFamily = basicFontFamily,
+                        textAlign = textAlign,
+                        textIndent = textIndent
+                    )
+                    .merge(style),
             maxLines = maxLines,
             ellipsis = ellipsis,
-            constraints = Constraints(
-                maxWidth = width.ceilToInt(),
-                maxHeight = height.ceilToInt()
-            ),
+            constraints = Constraints(maxWidth = width.ceilToInt(), maxHeight = height.ceilToInt()),
             density = Density(density = 1f),
             fontFamilyResolver = fontFamilyResolver
         )
diff --git a/compose/ui/ui-text/src/androidInstrumentedTest/kotlin/androidx/compose/ui/text/platform/AndroidParagraphIntrinsicsTest.kt b/compose/ui/ui-text/src/androidInstrumentedTest/kotlin/androidx/compose/ui/text/platform/AndroidParagraphIntrinsicsTest.kt
index d3ff1ae..15b52e5 100644
--- a/compose/ui/ui-text/src/androidInstrumentedTest/kotlin/androidx/compose/ui/text/platform/AndroidParagraphIntrinsicsTest.kt
+++ b/compose/ui/ui-text/src/androidInstrumentedTest/kotlin/androidx/compose/ui/text/platform/AndroidParagraphIntrinsicsTest.kt
@@ -53,20 +53,23 @@
     @Test
     fun whenEmojiCompatLoads_hasStaleFontsIsTrue() {
         val fontState = mutableStateOf(false)
-        EmojiCompatStatus.setDelegateForTesting(object : EmojiCompatStatusDelegate {
-            override val fontLoaded: State<Boolean>
-                get() = fontState
-        })
-
-        val subject = ActualParagraphIntrinsics(
-            "text",
-            TextStyle.Default,
-            listOf(),
-            listOf(),
-            Density(1f),
-            createFontFamilyResolver(context)
+        EmojiCompatStatus.setDelegateForTesting(
+            object : EmojiCompatStatusDelegate {
+                override val fontLoaded: State<Boolean>
+                    get() = fontState
+            }
         )
 
+        val subject =
+            ActualParagraphIntrinsics(
+                "text",
+                TextStyle.Default,
+                listOf(),
+                listOf(),
+                Density(1f),
+                createFontFamilyResolver(context)
+            )
+
         assertThat(subject.hasStaleResolvedFonts).isFalse()
         fontState.value = true
         assertThat(subject.hasStaleResolvedFonts).isTrue()
@@ -75,24 +78,24 @@
     @Test
     fun whenStyleSaysNoemojiCompat_NoEmojiCompat() {
         val fontState = mutableStateOf(false)
-        EmojiCompatStatus.setDelegateForTesting(object : EmojiCompatStatusDelegate {
-            override val fontLoaded: State<Boolean>
-                get() = fontState
-        })
+        EmojiCompatStatus.setDelegateForTesting(
+            object : EmojiCompatStatusDelegate {
+                override val fontLoaded: State<Boolean>
+                    get() = fontState
+            }
+        )
 
-        val style = TextStyle(
-            platformStyle = PlatformTextStyle(
-                emojiSupportMatch = EmojiSupportMatch.None
+        val style =
+            TextStyle(platformStyle = PlatformTextStyle(emojiSupportMatch = EmojiSupportMatch.None))
+        val subject =
+            ActualParagraphIntrinsics(
+                "text",
+                style,
+                listOf(),
+                listOf(),
+                Density(1f),
+                createFontFamilyResolver(context)
             )
-        )
-        val subject = ActualParagraphIntrinsics(
-            "text",
-            style,
-            listOf(),
-            listOf(),
-            Density(1f),
-            createFontFamilyResolver(context)
-        )
         fontState.value = true
         assertThat(subject.hasStaleResolvedFonts).isFalse()
     }
@@ -106,16 +109,15 @@
             .thenReturn("")
         EmojiCompat.reset(mock)
 
-        EmojiCompatStatus.setDelegateForTesting(object : EmojiCompatStatusDelegate {
-            override val fontLoaded: State<Boolean>
-                get() = mutableStateOf(true)
-        })
-
-        val style = TextStyle(
-            platformStyle = PlatformTextStyle(
-                emojiSupportMatch = EmojiSupportMatch.All
-            )
+        EmojiCompatStatus.setDelegateForTesting(
+            object : EmojiCompatStatusDelegate {
+                override val fontLoaded: State<Boolean>
+                    get() = mutableStateOf(true)
+            }
         )
+
+        val style =
+            TextStyle(platformStyle = PlatformTextStyle(emojiSupportMatch = EmojiSupportMatch.All))
         ActualParagraphIntrinsics(
             "text",
             style,
@@ -125,13 +127,14 @@
             createFontFamilyResolver(context)
         )
 
-        verify(mock).process(
-            eq("text"),
-            eq(0),
-            eq("text".length),
-            eq(Int.MAX_VALUE),
-            eq(EmojiCompat.REPLACE_STRATEGY_ALL)
-        )
+        verify(mock)
+            .process(
+                eq("text"),
+                eq(0),
+                eq("text".length),
+                eq(Int.MAX_VALUE),
+                eq(EmojiCompat.REPLACE_STRATEGY_ALL)
+            )
     }
 
     @Test
@@ -143,16 +146,17 @@
             .thenReturn("")
         EmojiCompat.reset(mock)
 
-        EmojiCompatStatus.setDelegateForTesting(object : EmojiCompatStatusDelegate {
-            override val fontLoaded: State<Boolean>
-                get() = mutableStateOf(true)
-        })
-
-        val style = TextStyle(
-            platformStyle = PlatformTextStyle(
-                emojiSupportMatch = EmojiSupportMatch.Default
-            )
+        EmojiCompatStatus.setDelegateForTesting(
+            object : EmojiCompatStatusDelegate {
+                override val fontLoaded: State<Boolean>
+                    get() = mutableStateOf(true)
+            }
         )
+
+        val style =
+            TextStyle(
+                platformStyle = PlatformTextStyle(emojiSupportMatch = EmojiSupportMatch.Default)
+            )
         ActualParagraphIntrinsics(
             "text",
             style,
@@ -162,12 +166,13 @@
             createFontFamilyResolver(context)
         )
 
-        verify(mock).process(
-            eq("text"),
-            eq(0),
-            eq("text".length),
-            eq(Int.MAX_VALUE),
-            eq(EmojiCompat.REPLACE_STRATEGY_DEFAULT)
-        )
+        verify(mock)
+            .process(
+                eq("text"),
+                eq(0),
+                eq("text".length),
+                eq(Int.MAX_VALUE),
+                eq(EmojiCompat.REPLACE_STRATEGY_DEFAULT)
+            )
     }
 }
diff --git a/compose/ui/ui-text/src/androidInstrumentedTest/kotlin/androidx/compose/ui/text/platform/AndroidTextPaintTest.kt b/compose/ui/ui-text/src/androidInstrumentedTest/kotlin/androidx/compose/ui/text/platform/AndroidTextPaintTest.kt
index bccb32e..68faded 100644
--- a/compose/ui/ui-text/src/androidInstrumentedTest/kotlin/androidx/compose/ui/text/platform/AndroidTextPaintTest.kt
+++ b/compose/ui/ui-text/src/androidInstrumentedTest/kotlin/androidx/compose/ui/text/platform/AndroidTextPaintTest.kt
@@ -97,9 +97,7 @@
     fun setTextDecoration_withLineThroughAndUnderline() {
         val textPaint = defaultTextPaint
         textPaint.setTextDecoration(
-            TextDecoration.combine(
-                listOf(TextDecoration.LineThrough, TextDecoration.Underline)
-            )
+            TextDecoration.combine(listOf(TextDecoration.LineThrough, TextDecoration.Underline))
         )
         assertThat(textPaint.isUnderlineText).isTrue()
         assertThat(textPaint.isStrikeThruText).isTrue()
@@ -109,9 +107,7 @@
     fun setTextDecoration_changeDecorationToNone() {
         val textPaint = defaultTextPaint
         textPaint.setTextDecoration(
-            TextDecoration.combine(
-                listOf(TextDecoration.LineThrough, TextDecoration.Underline)
-            )
+            TextDecoration.combine(listOf(TextDecoration.LineThrough, TextDecoration.Underline))
         )
         assertThat(textPaint.isUnderlineText).isTrue()
         assertThat(textPaint.isStrikeThruText).isTrue()
@@ -125,9 +121,7 @@
     fun setTextDecoration_changeDecorationToNull() {
         val textPaint = defaultTextPaint
         textPaint.setTextDecoration(
-            TextDecoration.combine(
-                listOf(TextDecoration.LineThrough, TextDecoration.Underline)
-            )
+            TextDecoration.combine(listOf(TextDecoration.LineThrough, TextDecoration.Underline))
         )
         assertThat(textPaint.isUnderlineText).isTrue()
         assertThat(textPaint.isStrikeThruText).isTrue()
@@ -175,13 +169,15 @@
     @Test
     fun setShaderBrush_with_specified_size() {
         var calls = 0
-        val brush = object : ShaderBrush() {
-            val brush = linearGradient(listOf(Color.Red, Color.Blue))
-            override fun createShader(size: Size): Shader {
-                calls++
-                return (brush as ShaderBrush).createShader(size)
+        val brush =
+            object : ShaderBrush() {
+                val brush = linearGradient(listOf(Color.Red, Color.Blue))
+
+                override fun createShader(size: Size): Shader {
+                    calls++
+                    return (brush as ShaderBrush).createShader(size)
+                }
             }
-        }
 
         val size = Size(10f, 10f)
         val textPaint = defaultTextPaint
@@ -470,12 +466,7 @@
     fun setDrawStyle_withStrokeThenFill() {
         val textPaint = defaultTextPaint
         textPaint.setDrawStyle(
-            Stroke(
-                width = 4f,
-                miter = 2f,
-                join = StrokeJoin.Bevel,
-                cap = StrokeCap.Square
-            )
+            Stroke(width = 4f, miter = 2f, join = StrokeJoin.Bevel, cap = StrokeCap.Square)
         )
         textPaint.setDrawStyle(Fill)
         assertThat(textPaint.style).isEqualTo(Paint.Style.FILL)
@@ -485,12 +476,7 @@
     fun setDrawStyle_changeDrawStyleToNull() {
         val textPaint = defaultTextPaint
         textPaint.setDrawStyle(
-            Stroke(
-                width = 4f,
-                miter = 2f,
-                join = StrokeJoin.Bevel,
-                cap = StrokeCap.Square
-            )
+            Stroke(width = 4f, miter = 2f, join = StrokeJoin.Bevel, cap = StrokeCap.Square)
         )
         assertThat(textPaint.style).isEqualTo(Paint.Style.STROKE)
 
@@ -511,5 +497,6 @@
         assertThat(textPaint.blendMode).isEqualTo(BlendMode.DstOver)
     }
 
-    private val defaultTextPaint get() = AndroidTextPaint(flags = 0, density = 1.0f)
+    private val defaultTextPaint
+        get() = AndroidTextPaint(flags = 0, density = 1.0f)
 }
diff --git a/compose/ui/ui-text/src/androidInstrumentedTest/kotlin/androidx/compose/ui/text/platform/AndroidTypefaceCacheTest.kt b/compose/ui/ui-text/src/androidInstrumentedTest/kotlin/androidx/compose/ui/text/platform/AndroidTypefaceCacheTest.kt
index daa999be..f38707d 100644
--- a/compose/ui/ui-text/src/androidInstrumentedTest/kotlin/androidx/compose/ui/text/platform/AndroidTypefaceCacheTest.kt
+++ b/compose/ui/ui-text/src/androidInstrumentedTest/kotlin/androidx/compose/ui/text/platform/AndroidTypefaceCacheTest.kt
@@ -33,19 +33,17 @@
 
     @Test
     fun cached_instance_for_the_same_input() {
-        assertThat(
-            AndroidTypefaceCache.getOrCreate(context, FontTestData.FONT_100_REGULAR)
-        ).isSameInstanceAs(
-            AndroidTypefaceCache.getOrCreate(context, FontTestData.FONT_100_REGULAR)
-        )
+        assertThat(AndroidTypefaceCache.getOrCreate(context, FontTestData.FONT_100_REGULAR))
+            .isSameInstanceAs(
+                AndroidTypefaceCache.getOrCreate(context, FontTestData.FONT_100_REGULAR)
+            )
     }
 
     @Test
     fun not_cached_instance_if_different_input() {
-        assertThat(
-            AndroidTypefaceCache.getOrCreate(context, FontTestData.FONT_100_REGULAR)
-        ).isNotSameInstanceAs(
-            AndroidTypefaceCache.getOrCreate(context, FontTestData.FONT_200_REGULAR)
-        )
+        assertThat(AndroidTypefaceCache.getOrCreate(context, FontTestData.FONT_100_REGULAR))
+            .isNotSameInstanceAs(
+                AndroidTypefaceCache.getOrCreate(context, FontTestData.FONT_200_REGULAR)
+            )
     }
 }
diff --git a/compose/ui/ui-text/src/androidInstrumentedTest/kotlin/androidx/compose/ui/text/platform/AndroidTypefaceSubsetTest.kt b/compose/ui/ui-text/src/androidInstrumentedTest/kotlin/androidx/compose/ui/text/platform/AndroidTypefaceSubsetTest.kt
index 0f8c137..fbf8bbd 100644
--- a/compose/ui/ui-text/src/androidInstrumentedTest/kotlin/androidx/compose/ui/text/platform/AndroidTypefaceSubsetTest.kt
+++ b/compose/ui/ui-text/src/androidInstrumentedTest/kotlin/androidx/compose/ui/text/platform/AndroidTypefaceSubsetTest.kt
@@ -36,26 +36,27 @@
 
     val context = InstrumentationRegistry.getInstrumentation().targetContext!!
 
-    val fontFamily = FontFamily(
-        FontTestData.FONT_100_REGULAR,
-        FontTestData.FONT_100_ITALIC,
-        FontTestData.FONT_200_REGULAR,
-        FontTestData.FONT_200_ITALIC,
-        FontTestData.FONT_300_REGULAR,
-        FontTestData.FONT_300_ITALIC,
-        FontTestData.FONT_400_REGULAR,
-        FontTestData.FONT_400_ITALIC,
-        FontTestData.FONT_500_REGULAR,
-        FontTestData.FONT_500_ITALIC,
-        FontTestData.FONT_600_REGULAR,
-        FontTestData.FONT_600_ITALIC,
-        FontTestData.FONT_700_REGULAR,
-        FontTestData.FONT_700_ITALIC,
-        FontTestData.FONT_800_REGULAR,
-        FontTestData.FONT_800_ITALIC,
-        FontTestData.FONT_900_REGULAR,
-        FontTestData.FONT_900_ITALIC
-    )
+    val fontFamily =
+        FontFamily(
+            FontTestData.FONT_100_REGULAR,
+            FontTestData.FONT_100_ITALIC,
+            FontTestData.FONT_200_REGULAR,
+            FontTestData.FONT_200_ITALIC,
+            FontTestData.FONT_300_REGULAR,
+            FontTestData.FONT_300_ITALIC,
+            FontTestData.FONT_400_REGULAR,
+            FontTestData.FONT_400_ITALIC,
+            FontTestData.FONT_500_REGULAR,
+            FontTestData.FONT_500_ITALIC,
+            FontTestData.FONT_600_REGULAR,
+            FontTestData.FONT_600_ITALIC,
+            FontTestData.FONT_700_REGULAR,
+            FontTestData.FONT_700_ITALIC,
+            FontTestData.FONT_800_REGULAR,
+            FontTestData.FONT_800_ITALIC,
+            FontTestData.FONT_900_REGULAR,
+            FontTestData.FONT_900_ITALIC
+        )
 
     @Suppress("DEPRECATION")
     private fun androidTypefaceFromFontFamily(
@@ -70,20 +71,18 @@
     @Test
     fun subset_load_regular_bold_only_and_query_regular() {
         // Load only Regular and Bold font
-        val typeface = androidTypefaceFromFontFamily(
-            context,
-            fontFamily,
-            listOf(
-                Pair(FontWeight.W400, FontStyle.Normal),
-                Pair(FontWeight.W700, FontStyle.Normal)
+        val typeface =
+            androidTypefaceFromFontFamily(
+                context,
+                fontFamily,
+                listOf(
+                    Pair(FontWeight.W400, FontStyle.Normal),
+                    Pair(FontWeight.W700, FontStyle.Normal)
+                )
             )
-        )
 
-        val typefaceFromSubset = typeface.getNativeTypeface(
-            FontWeight.Normal,
-            FontStyle.Normal,
-            FontSynthesis.None
-        )
+        val typefaceFromSubset =
+            typeface.getNativeTypeface(FontWeight.Normal, FontStyle.Normal, FontSynthesis.None)
 
         assertThat(typefaceFromSubset).isTypefaceOf(FontWeight.Normal, FontStyle.Normal)
     }
@@ -91,20 +90,18 @@
     @Test
     fun subset_load_regular_bold_only_and_query_bold() {
         // Load only Regular and Bold font
-        val typeface = androidTypefaceFromFontFamily(
-            context,
-            fontFamily,
-            listOf(
-                Pair(FontWeight.W400, FontStyle.Normal),
-                Pair(FontWeight.W700, FontStyle.Normal)
+        val typeface =
+            androidTypefaceFromFontFamily(
+                context,
+                fontFamily,
+                listOf(
+                    Pair(FontWeight.W400, FontStyle.Normal),
+                    Pair(FontWeight.W700, FontStyle.Normal)
+                )
             )
-        )
 
-        val typefaceFromSubset = typeface.getNativeTypeface(
-            FontWeight.Bold,
-            FontStyle.Normal,
-            FontSynthesis.None
-        )
+        val typefaceFromSubset =
+            typeface.getNativeTypeface(FontWeight.Bold, FontStyle.Normal, FontSynthesis.None)
 
         assertThat(typefaceFromSubset).isTypefaceOf(FontWeight.Bold, FontStyle.Normal)
     }
@@ -112,20 +109,18 @@
     @Test
     fun subset_load_regular_bold_only_and_query_black() {
         // Load only Regular and Bold font
-        val typeface = androidTypefaceFromFontFamily(
-            context,
-            fontFamily,
-            listOf(
-                Pair(FontWeight.W400, FontStyle.Normal),
-                Pair(FontWeight.W700, FontStyle.Normal)
+        val typeface =
+            androidTypefaceFromFontFamily(
+                context,
+                fontFamily,
+                listOf(
+                    Pair(FontWeight.W400, FontStyle.Normal),
+                    Pair(FontWeight.W700, FontStyle.Normal)
+                )
             )
-        )
 
-        val typefaceFromSubset = typeface.getNativeTypeface(
-            FontWeight.Normal,
-            FontStyle.Italic,
-            FontSynthesis.None
-        )
+        val typefaceFromSubset =
+            typeface.getNativeTypeface(FontWeight.Normal, FontStyle.Italic, FontSynthesis.None)
 
         // The italic font is not loaded, so querying Italic will return Normal font.
         assertThat(typefaceFromSubset).isTypefaceOf(FontWeight.Normal, FontStyle.Normal)
diff --git a/compose/ui/ui-text/src/androidInstrumentedTest/kotlin/androidx/compose/ui/text/platform/AndroidTypefaceTest.kt b/compose/ui/ui-text/src/androidInstrumentedTest/kotlin/androidx/compose/ui/text/platform/AndroidTypefaceTest.kt
index 8ea1d54..7f2c606 100644
--- a/compose/ui/ui-text/src/androidInstrumentedTest/kotlin/androidx/compose/ui/text/platform/AndroidTypefaceTest.kt
+++ b/compose/ui/ui-text/src/androidInstrumentedTest/kotlin/androidx/compose/ui/text/platform/AndroidTypefaceTest.kt
@@ -60,71 +60,71 @@
     @Test
     fun createDefaultTypeface() {
         val typeface = androidTypefaceFromFontFamily(context, FontFamily.Default)
-        val nativeTypeface = typeface.getNativeTypeface(
-            FontWeight.Normal, FontStyle.Normal, FontSynthesis.None
-        )
+        val nativeTypeface =
+            typeface.getNativeTypeface(FontWeight.Normal, FontStyle.Normal, FontSynthesis.None)
 
         assertThat(nativeTypeface).isNotNull()
         assertThat(nativeTypeface.isBold).isFalse()
         assertThat(nativeTypeface.isItalic).isFalse()
-        assertThat(nativeTypeface.bitmap()).isEqualToBitmap(
-            android.graphics.Typeface.DEFAULT.bitmap()
-        )
+        assertThat(nativeTypeface.bitmap())
+            .isEqualToBitmap(android.graphics.Typeface.DEFAULT.bitmap())
     }
 
     @Test
     fun fontWeightItalicCreatesItalicFont() {
         val typeface = androidTypefaceFromFontFamily(context, FontFamily.Default)
-        val nativeTypeface = typeface.getNativeTypeface(
-            FontWeight.Normal, FontStyle.Italic, FontSynthesis.None
-        )
+        val nativeTypeface =
+            typeface.getNativeTypeface(FontWeight.Normal, FontStyle.Italic, FontSynthesis.None)
 
         assertThat(nativeTypeface).isNotNull()
         assertThat(nativeTypeface.isBold).isFalse()
         assertThat(nativeTypeface.isItalic).isTrue()
-        assertThat(nativeTypeface.bitmap()).isEqualToBitmap(
-            android.graphics.Typeface.defaultFromStyle(android.graphics.Typeface.ITALIC)
-                .bitmap()
-        )
+        assertThat(nativeTypeface.bitmap())
+            .isEqualToBitmap(
+                android.graphics.Typeface.defaultFromStyle(android.graphics.Typeface.ITALIC)
+                    .bitmap()
+            )
     }
 
     @Test
     fun fontWeightBoldCreatesBoldFont() {
         val typeface = androidTypefaceFromFontFamily(context, FontFamily.Default)
-        val nativeTypeface = typeface.getNativeTypeface(
-            FontWeight.Bold, FontStyle.Normal, FontSynthesis.None
-        )
+        val nativeTypeface =
+            typeface.getNativeTypeface(FontWeight.Bold, FontStyle.Normal, FontSynthesis.None)
 
         assertThat(nativeTypeface).isNotNull()
         assertThat(nativeTypeface.isBold).isTrue()
         assertThat(nativeTypeface.isItalic).isFalse()
-        assertThat(nativeTypeface.bitmap()).isEqualToBitmap(
-            android.graphics.Typeface.defaultFromStyle(android.graphics.Typeface.BOLD).bitmap()
-        )
+        assertThat(nativeTypeface.bitmap())
+            .isEqualToBitmap(
+                android.graphics.Typeface.defaultFromStyle(android.graphics.Typeface.BOLD).bitmap()
+            )
     }
 
     @Test
     fun fontWeightBoldFontStyleItalicCreatesBoldItalicFont() {
         val typeface = androidTypefaceFromFontFamily(context, FontFamily.Default)
-        val nativeTypeface = typeface.getNativeTypeface(
-            FontWeight.Bold, FontStyle.Italic, FontSynthesis.None
-        )
+        val nativeTypeface =
+            typeface.getNativeTypeface(FontWeight.Bold, FontStyle.Italic, FontSynthesis.None)
 
         assertThat(nativeTypeface).isNotNull()
         assertThat(nativeTypeface.isBold).isTrue()
         assertThat(nativeTypeface.isItalic).isTrue()
-        assertThat(nativeTypeface.bitmap()).isEqualToBitmap(
-            android.graphics.Typeface.defaultFromStyle(android.graphics.Typeface.BOLD_ITALIC)
-                .bitmap()
-        )
+        assertThat(nativeTypeface.bitmap())
+            .isEqualToBitmap(
+                android.graphics.Typeface.defaultFromStyle(android.graphics.Typeface.BOLD_ITALIC)
+                    .bitmap()
+            )
     }
 
     @Test
     fun serifAndSansSerifPaintsDifferent() {
-        val typefaceSans = androidTypefaceFromFontFamily(context, FontFamily.SansSerif)
-            .getNativeTypeface(FontWeight.Normal, FontStyle.Normal, FontSynthesis.None)
-        val typefaceSerif = androidTypefaceFromFontFamily(context, FontFamily.Serif)
-            .getNativeTypeface(FontWeight.Normal, FontStyle.Normal, FontSynthesis.None)
+        val typefaceSans =
+            androidTypefaceFromFontFamily(context, FontFamily.SansSerif)
+                .getNativeTypeface(FontWeight.Normal, FontStyle.Normal, FontSynthesis.None)
+        val typefaceSerif =
+            androidTypefaceFromFontFamily(context, FontFamily.Serif)
+                .getNativeTypeface(FontWeight.Normal, FontStyle.Normal, FontSynthesis.None)
 
         assertThat(typefaceSans).isNotNull()
         assertThat(typefaceSans).isNotNull()
@@ -135,20 +135,19 @@
     // TypefaceAdapterTest is migrated to AndroidTypefaceTest
     @Test
     fun getTypefaceStyleSnapToNormalFor100to500() {
-        val fontWeights = arrayOf(
-            FontWeight.W100,
-            FontWeight.W200,
-            FontWeight.W300,
-            FontWeight.W400,
-            FontWeight.W500
-        )
+        val fontWeights =
+            arrayOf(
+                FontWeight.W100,
+                FontWeight.W200,
+                FontWeight.W300,
+                FontWeight.W400,
+                FontWeight.W500
+            )
 
         for (fontWeight in fontWeights) {
             for (fontStyle in FontStyle.values()) {
-                val typefaceStyle = getAndroidTypefaceStyle(
-                    fontWeight = fontWeight,
-                    fontStyle = fontStyle
-                )
+                val typefaceStyle =
+                    getAndroidTypefaceStyle(fontWeight = fontWeight, fontStyle = fontStyle)
 
                 if (fontStyle == FontStyle.Normal) {
                     assertThat(typefaceStyle).isEqualTo(android.graphics.Typeface.NORMAL)
@@ -163,19 +162,13 @@
     // TypefaceAdapterTest is migrated to AndroidTypefaceTest
     @Test
     fun getTypefaceStyleSnapToBoldFor600to900() {
-        val fontWeights = arrayOf(
-            FontWeight.W600,
-            FontWeight.W700,
-            FontWeight.W800,
-            FontWeight.W900
-        )
+        val fontWeights =
+            arrayOf(FontWeight.W600, FontWeight.W700, FontWeight.W800, FontWeight.W900)
 
         for (fontWeight in fontWeights) {
             for (fontStyle in FontStyle.values()) {
-                val typefaceStyle = getAndroidTypefaceStyle(
-                    fontWeight = fontWeight,
-                    fontStyle = fontStyle
-                )
+                val typefaceStyle =
+                    getAndroidTypefaceStyle(fontWeight = fontWeight, fontStyle = fontStyle)
 
                 if (fontStyle == FontStyle.Normal) {
                     assertThat(typefaceStyle).isEqualTo(android.graphics.Typeface.BOLD)
@@ -189,18 +182,20 @@
     @Test
     @SdkSuppress(maxSdkVersion = 27)
     fun fontWeights100To500SnapToNormalBeforeApi28() {
-        val fontWeights = arrayOf(
-            FontWeight.W100,
-            FontWeight.W200,
-            FontWeight.W300,
-            FontWeight.W400,
-            FontWeight.W500
-        )
+        val fontWeights =
+            arrayOf(
+                FontWeight.W100,
+                FontWeight.W200,
+                FontWeight.W300,
+                FontWeight.W400,
+                FontWeight.W500
+            )
 
         for (fontWeight in fontWeights) {
             for (fontStyle in FontStyle.values()) {
-                val typeface = androidTypefaceFromFontFamily(context, FontFamily.Default)
-                    .getNativeTypeface(fontWeight, fontStyle, FontSynthesis.None)
+                val typeface =
+                    androidTypefaceFromFontFamily(context, FontFamily.Default)
+                        .getNativeTypeface(fontWeight, fontStyle, FontSynthesis.None)
 
                 assertThat(typeface).isNotNull()
                 assertThat(typeface.isBold).isFalse()
@@ -212,17 +207,14 @@
     @Test
     @SdkSuppress(maxSdkVersion = 27)
     fun fontWeights600To900SnapToBoldBeforeApi28() {
-        val fontWeights = arrayOf(
-            FontWeight.W600,
-            FontWeight.W700,
-            FontWeight.W800,
-            FontWeight.W900
-        )
+        val fontWeights =
+            arrayOf(FontWeight.W600, FontWeight.W700, FontWeight.W800, FontWeight.W900)
 
         for (fontWeight in fontWeights) {
             for (fontStyle in FontStyle.values()) {
-                val typeface = androidTypefaceFromFontFamily(context, FontFamily.Default)
-                    .getNativeTypeface(fontWeight, fontStyle, FontSynthesis.None)
+                val typeface =
+                    androidTypefaceFromFontFamily(context, FontFamily.Default)
+                        .getNativeTypeface(fontWeight, fontStyle, FontSynthesis.None)
 
                 assertThat(typeface).isNotNull()
                 assertThat(typeface.isBold).isTrue()
@@ -236,8 +228,9 @@
     fun typefaceCreatedWithCorrectFontWeightAndFontStyle() {
         for (fontWeight in FontWeight.values) {
             for (fontStyle in FontStyle.values()) {
-                val typeface = androidTypefaceFromFontFamily(context, FontFamily.Default)
-                    .getNativeTypeface(fontWeight, fontStyle, FontSynthesis.None)
+                val typeface =
+                    androidTypefaceFromFontFamily(context, FontFamily.Default)
+                        .getNativeTypeface(fontWeight, fontStyle, FontSynthesis.None)
 
                 assertThat(typeface).isNotNull()
                 assertThat(typeface.weight).isEqualTo(fontWeight.weight)
@@ -248,13 +241,15 @@
 
     @Test
     fun customSingleFont() {
-        val defaultTypeface = androidTypefaceFromFontFamily(context, FontFamily.Default)
-            .getNativeTypeface(FontWeight.Normal, FontStyle.Normal, FontSynthesis.None)
+        val defaultTypeface =
+            androidTypefaceFromFontFamily(context, FontFamily.Default)
+                .getNativeTypeface(FontWeight.Normal, FontStyle.Normal, FontSynthesis.None)
 
         val fontFamily = FontTestData.FONT_100_REGULAR.toFontFamily()
 
-        val typeface = androidTypefaceFromFontFamily(context, fontFamily)
-            .getNativeTypeface(FontWeight.Normal, FontStyle.Normal, FontSynthesis.None)
+        val typeface =
+            androidTypefaceFromFontFamily(context, fontFamily)
+                .getNativeTypeface(FontWeight.Normal, FontStyle.Normal, FontSynthesis.None)
 
         assertThat(typeface).isNotNull()
         assertThat(typeface.bitmap()).isNotEqualToBitmap(defaultTypeface.bitmap())
@@ -264,13 +259,15 @@
 
     @Test
     fun customSingleFontBoldItalic() {
-        val defaultTypeface = androidTypefaceFromFontFamily(context, FontFamily.Default)
-            .getNativeTypeface(FontWeight.Normal, FontStyle.Normal, FontSynthesis.None)
+        val defaultTypeface =
+            androidTypefaceFromFontFamily(context, FontFamily.Default)
+                .getNativeTypeface(FontWeight.Normal, FontStyle.Normal, FontSynthesis.None)
 
         val fontFamily = FontTestData.FONT_100_REGULAR.toFontFamily()
 
-        val typeface = androidTypefaceFromFontFamily(context, fontFamily)
-            .getNativeTypeface(FontWeight.Bold, FontStyle.Italic, FontSynthesis.All)
+        val typeface =
+            androidTypefaceFromFontFamily(context, fontFamily)
+                .getNativeTypeface(FontWeight.Bold, FontStyle.Italic, FontSynthesis.All)
 
         assertThat(typeface).isNotNull()
         assertThat(typeface.bitmap()).isNotEqualToBitmap(defaultTypeface.bitmap())
@@ -281,31 +278,33 @@
     @Test
     @MediumTest
     fun customSinglefontFamilyExactMatch() {
-        val fontFamily = FontFamily(
-            FontTestData.FONT_100_REGULAR,
-            FontTestData.FONT_100_ITALIC,
-            FontTestData.FONT_200_REGULAR,
-            FontTestData.FONT_200_ITALIC,
-            FontTestData.FONT_300_REGULAR,
-            FontTestData.FONT_300_ITALIC,
-            FontTestData.FONT_400_REGULAR,
-            FontTestData.FONT_400_ITALIC,
-            FontTestData.FONT_500_REGULAR,
-            FontTestData.FONT_500_ITALIC,
-            FontTestData.FONT_600_REGULAR,
-            FontTestData.FONT_600_ITALIC,
-            FontTestData.FONT_700_REGULAR,
-            FontTestData.FONT_700_ITALIC,
-            FontTestData.FONT_800_REGULAR,
-            FontTestData.FONT_800_ITALIC,
-            FontTestData.FONT_900_REGULAR,
-            FontTestData.FONT_900_ITALIC
-        )
+        val fontFamily =
+            FontFamily(
+                FontTestData.FONT_100_REGULAR,
+                FontTestData.FONT_100_ITALIC,
+                FontTestData.FONT_200_REGULAR,
+                FontTestData.FONT_200_ITALIC,
+                FontTestData.FONT_300_REGULAR,
+                FontTestData.FONT_300_ITALIC,
+                FontTestData.FONT_400_REGULAR,
+                FontTestData.FONT_400_ITALIC,
+                FontTestData.FONT_500_REGULAR,
+                FontTestData.FONT_500_ITALIC,
+                FontTestData.FONT_600_REGULAR,
+                FontTestData.FONT_600_ITALIC,
+                FontTestData.FONT_700_REGULAR,
+                FontTestData.FONT_700_ITALIC,
+                FontTestData.FONT_800_REGULAR,
+                FontTestData.FONT_800_ITALIC,
+                FontTestData.FONT_900_REGULAR,
+                FontTestData.FONT_900_ITALIC
+            )
 
         for (fontWeight in FontWeight.values) {
             for (fontStyle in FontStyle.values()) {
-                val typeface = androidTypefaceFromFontFamily(context, fontFamily)
-                    .getNativeTypeface(fontWeight, fontStyle, FontSynthesis.None)
+                val typeface =
+                    androidTypefaceFromFontFamily(context, fontFamily)
+                        .getNativeTypeface(fontWeight, fontStyle, FontSynthesis.None)
 
                 assertThat(typeface).isNotNull()
                 assertThat(typeface).isTypefaceOf(fontWeight = fontWeight, fontStyle = fontStyle)
@@ -322,18 +321,22 @@
         // is called.
         val fontWeight = FontWeight.W300
         val fontStyle = FontStyle.Italic
-        val fontFamily = FontFamily(
-            FontTestData.FONT_200_ITALIC,
-            FontTestData.FONT_200_ITALIC_FALLBACK,
-            FontTestData.FONT_200_REGULAR
-        ) as FontListFontFamily
+        val fontFamily =
+            FontFamily(
+                FontTestData.FONT_200_ITALIC,
+                FontTestData.FONT_200_ITALIC_FALLBACK,
+                FontTestData.FONT_200_REGULAR
+            )
+                as FontListFontFamily
 
-        val typeface = AndroidFontListTypeface(
-            context = context,
-            fontFamily = fontFamily,
-            necessaryStyles = null,
-            fontMatcher = FontMatcher()
-        ).getNativeTypeface(fontWeight, fontStyle, FontSynthesis.None)
+        val typeface =
+            AndroidFontListTypeface(
+                    context = context,
+                    fontFamily = fontFamily,
+                    necessaryStyles = null,
+                    fontMatcher = FontMatcher()
+                )
+                .getNativeTypeface(fontWeight, fontStyle, FontSynthesis.None)
 
         /* Match will find 200 weight font, synthesis disabled */
         assertThat(typeface).isTypefaceOf(fontWeight = FontWeight.W200, fontStyle = fontStyle)
@@ -342,60 +345,53 @@
     @Test(expected = IllegalStateException::class)
     @MediumTest
     fun noEagerFonts_throws() {
-        val asyncFont = object : Font {
-            override val weight: FontWeight = FontWeight.W100
-            override val style: FontStyle = FontStyle.Italic
-            @ExperimentalTextApi
-            override val loadingStrategy: FontLoadingStrategy = FontLoadingStrategy.Async
-        }
+        val asyncFont =
+            object : Font {
+                override val weight: FontWeight = FontWeight.W100
+                override val style: FontStyle = FontStyle.Italic
+                @ExperimentalTextApi
+                override val loadingStrategy: FontLoadingStrategy = FontLoadingStrategy.Async
+            }
 
-        val fontFamily = FontFamily(
-            asyncFont
-        ) as FontListFontFamily
+        val fontFamily = FontFamily(asyncFont) as FontListFontFamily
 
-        AndroidFontListTypeface(
-            context = context,
-            fontFamily = fontFamily,
-            necessaryStyles = null
-        )
+        AndroidFontListTypeface(context = context, fontFamily = fontFamily, necessaryStyles = null)
     }
 
     @Test
     @MediumTest
     fun eagerAndAsyncFont_alwaysChoosesEagerFont_evenIfAsyncIsBetterMatch() {
-        val asyncFont = object : Font {
-            override val weight: FontWeight = FontWeight.W800
-            override val style: FontStyle = FontStyle.Italic
-            @ExperimentalTextApi
-            override val loadingStrategy: FontLoadingStrategy = FontLoadingStrategy.Async
-        }
+        val asyncFont =
+            object : Font {
+                override val weight: FontWeight = FontWeight.W800
+                override val style: FontStyle = FontStyle.Italic
+                @ExperimentalTextApi
+                override val loadingStrategy: FontLoadingStrategy = FontLoadingStrategy.Async
+            }
 
-        val fontFamily = FontFamily(
-            asyncFont,
-            FontTestData.FONT_100_REGULAR
-        ) as FontListFontFamily
+        val fontFamily = FontFamily(asyncFont, FontTestData.FONT_100_REGULAR) as FontListFontFamily
 
         // (100, Normal, Blocking) matches for (800, Italic, Blocking)
-        val typeface = AndroidFontListTypeface(
-            context = context,
-            fontFamily = fontFamily,
-            necessaryStyles = null
-        ).getNativeTypeface(FontWeight.W800, FontStyle.Italic, FontSynthesis.None)
+        val typeface =
+            AndroidFontListTypeface(
+                    context = context,
+                    fontFamily = fontFamily,
+                    necessaryStyles = null
+                )
+                .getNativeTypeface(FontWeight.W800, FontStyle.Italic, FontSynthesis.None)
         assertThat(typeface).isTypefaceOf(FontWeight.W100, FontStyle.Normal)
     }
 
     @Test
     fun resultsAreCached_defaultTypeface() {
         val typeface = androidTypefaceFromFontFamily(context, FontFamily.Default)
-        val nativeTypeface = typeface.getNativeTypeface(
-            FontWeight.Normal, FontStyle.Normal, FontSynthesis.None
-        )
+        val nativeTypeface =
+            typeface.getNativeTypeface(FontWeight.Normal, FontStyle.Normal, FontSynthesis.None)
 
         // getting typeface with same parameters should hit the cache
         // therefore return the same typeface
-        val otherNativeTypeface = typeface.getNativeTypeface(
-            FontWeight.Normal, FontStyle.Normal, FontSynthesis.None
-        )
+        val otherNativeTypeface =
+            typeface.getNativeTypeface(FontWeight.Normal, FontStyle.Normal, FontSynthesis.None)
 
         assertThat(nativeTypeface).isSameInstanceAs(otherNativeTypeface)
     }
@@ -403,15 +399,13 @@
     @Test
     fun resultsNotSame_forDifferentFontWeight() {
         val typeface = androidTypefaceFromFontFamily(context, FontFamily.Default)
-        val nativeTypeface = typeface.getNativeTypeface(
-            FontWeight.Normal, FontStyle.Normal, FontSynthesis.None
-        )
+        val nativeTypeface =
+            typeface.getNativeTypeface(FontWeight.Normal, FontStyle.Normal, FontSynthesis.None)
 
         // getting typeface with different parameters should not hit the cache
         // therefore return some other typeface
-        val otherNativeTypeface = typeface.getNativeTypeface(
-            FontWeight.Bold, FontStyle.Normal, FontSynthesis.None
-        )
+        val otherNativeTypeface =
+            typeface.getNativeTypeface(FontWeight.Bold, FontStyle.Normal, FontSynthesis.None)
 
         assertThat(nativeTypeface).isNotSameInstanceAs(otherNativeTypeface)
     }
@@ -420,12 +414,10 @@
     fun resultsNotSame_forDifferentFontStyle() {
         val typeface = androidTypefaceFromFontFamily(context, FontFamily.Default)
 
-        val nativeTypeface = typeface.getNativeTypeface(
-            FontWeight.Normal, FontStyle.Normal, FontSynthesis.None
-        )
-        val otherNativeTypeface = typeface.getNativeTypeface(
-            FontWeight.Normal, FontStyle.Italic, FontSynthesis.None
-        )
+        val nativeTypeface =
+            typeface.getNativeTypeface(FontWeight.Normal, FontStyle.Normal, FontSynthesis.None)
+        val otherNativeTypeface =
+            typeface.getNativeTypeface(FontWeight.Normal, FontStyle.Italic, FontSynthesis.None)
 
         assertThat(nativeTypeface).isNotSameInstanceAs(otherNativeTypeface)
     }
@@ -437,26 +429,27 @@
         val fontStyle = FontStyle.Italic
 
         val typeface = androidTypefaceFromFontFamily(context, fontFamily)
-        val nativeTypeface = typeface.getNativeTypeface(
-            fontWeight, fontStyle, FontSynthesis.None
-        )
-        val otherNativeTypeface = typeface.getNativeTypeface(
-            fontWeight, fontStyle, FontSynthesis.None
-        )
+        val nativeTypeface = typeface.getNativeTypeface(fontWeight, fontStyle, FontSynthesis.None)
+        val otherNativeTypeface =
+            typeface.getNativeTypeface(fontWeight, fontStyle, FontSynthesis.None)
 
         assertThat(nativeTypeface).isSameInstanceAs(otherNativeTypeface)
     }
 
     @Test
     fun cacheCanHoldTwoResults() {
-        val serifTypeface = androidTypefaceFromFontFamily(context, FontFamily.Serif)
-            .getNativeTypeface(FontWeight.Normal, FontStyle.Normal, FontSynthesis.All)
-        val otherSerifTypeface = androidTypefaceFromFontFamily(context, FontFamily.Serif)
-            .getNativeTypeface(FontWeight.Normal, FontStyle.Normal, FontSynthesis.All)
-        val sansTypeface = androidTypefaceFromFontFamily(context, FontFamily.SansSerif)
-            .getNativeTypeface(FontWeight.Normal, FontStyle.Normal, FontSynthesis.All)
-        val otherSansTypeface = androidTypefaceFromFontFamily(context, FontFamily.SansSerif)
-            .getNativeTypeface(FontWeight.Normal, FontStyle.Normal, FontSynthesis.All)
+        val serifTypeface =
+            androidTypefaceFromFontFamily(context, FontFamily.Serif)
+                .getNativeTypeface(FontWeight.Normal, FontStyle.Normal, FontSynthesis.All)
+        val otherSerifTypeface =
+            androidTypefaceFromFontFamily(context, FontFamily.Serif)
+                .getNativeTypeface(FontWeight.Normal, FontStyle.Normal, FontSynthesis.All)
+        val sansTypeface =
+            androidTypefaceFromFontFamily(context, FontFamily.SansSerif)
+                .getNativeTypeface(FontWeight.Normal, FontStyle.Normal, FontSynthesis.All)
+        val otherSansTypeface =
+            androidTypefaceFromFontFamily(context, FontFamily.SansSerif)
+                .getNativeTypeface(FontWeight.Normal, FontStyle.Normal, FontSynthesis.All)
 
         assertThat(serifTypeface).isSameInstanceAs(otherSerifTypeface)
         assertThat(sansTypeface).isSameInstanceAs(otherSansTypeface)
@@ -479,8 +472,9 @@
     fun fontSynthesisDefault_synthesizeTheFontToItalicBold() {
         val fontFamily = FontTestData.FONT_100_REGULAR.toFontFamily()
 
-        val typeface = androidTypefaceFromFontFamily(context, fontFamily)
-            .getNativeTypeface(FontWeight.Bold, FontStyle.Italic, FontSynthesis.All)
+        val typeface =
+            androidTypefaceFromFontFamily(context, fontFamily)
+                .getNativeTypeface(FontWeight.Bold, FontStyle.Italic, FontSynthesis.All)
 
         // since 100 regular is not bold and not italic, passing FontWeight.bold and
         // FontStyle.Italic should create a Typeface that is fake bold and fake Italic
@@ -492,8 +486,9 @@
     fun fontSynthesisStyle_synthesizeTheFontToItalic() {
         val fontFamily = FontTestData.FONT_100_REGULAR.toFontFamily()
 
-        val typeface = androidTypefaceFromFontFamily(context, fontFamily)
-            .getNativeTypeface(FontWeight.Bold, FontStyle.Italic, FontSynthesis.Style)
+        val typeface =
+            androidTypefaceFromFontFamily(context, fontFamily)
+                .getNativeTypeface(FontWeight.Bold, FontStyle.Italic, FontSynthesis.Style)
 
         // since 100 regular is not bold and not italic, passing FontWeight.bold and
         // FontStyle.Italic should create a Typeface that is only fake Italic
@@ -505,8 +500,9 @@
     fun fontSynthesisWeight_synthesizeTheFontToBold() {
         val fontFamily = FontTestData.FONT_100_REGULAR.toFontFamily()
 
-        val typeface = androidTypefaceFromFontFamily(context, fontFamily)
-            .getNativeTypeface(FontWeight.Bold, FontStyle.Italic, FontSynthesis.Weight)
+        val typeface =
+            androidTypefaceFromFontFamily(context, fontFamily)
+                .getNativeTypeface(FontWeight.Bold, FontStyle.Italic, FontSynthesis.Weight)
 
         // since 100 regular is not bold and not italic, passing FontWeight.bold and
         // FontStyle.Italic should create a Typeface that is only fake bold
@@ -518,8 +514,9 @@
     fun fontSynthesisStyle_forMatchingItalicDoesNotSynthesize() {
         val fontFamily = FontTestData.FONT_100_ITALIC.toFontFamily()
 
-        val typeface = androidTypefaceFromFontFamily(context, fontFamily)
-            .getNativeTypeface(FontWeight.W700, FontStyle.Italic, FontSynthesis.Style)
+        val typeface =
+            androidTypefaceFromFontFamily(context, fontFamily)
+                .getNativeTypeface(FontWeight.W700, FontStyle.Italic, FontSynthesis.Style)
 
         assertThat(typeface.isBold).isFalse()
         assertThat(typeface.isItalic).isFalse()
@@ -529,8 +526,9 @@
     fun fontSynthesisAll_doesNotSynthesizeIfFontIsTheSame_beforeApi28() {
         val fontFamily = FontTestData.FONT_700_ITALIC.toFontFamily()
 
-        val typeface = androidTypefaceFromFontFamily(context, fontFamily)
-            .getNativeTypeface(FontWeight.W700, FontStyle.Italic, FontSynthesis.All)
+        val typeface =
+            androidTypefaceFromFontFamily(context, fontFamily)
+                .getNativeTypeface(FontWeight.W700, FontStyle.Italic, FontSynthesis.All)
         assertThat(typeface.isItalic).isFalse()
 
         if (Build.VERSION.SDK_INT < 23) {
@@ -547,8 +545,9 @@
     fun fontSynthesisNone_doesNotSynthesize() {
         val fontFamily = FontTestData.FONT_100_REGULAR.toFontFamily()
 
-        val typeface = androidTypefaceFromFontFamily(context, fontFamily)
-            .getNativeTypeface(FontWeight.Bold, FontStyle.Italic, FontSynthesis.None)
+        val typeface =
+            androidTypefaceFromFontFamily(context, fontFamily)
+                .getNativeTypeface(FontWeight.Bold, FontStyle.Italic, FontSynthesis.None)
 
         assertThat(typeface.isBold).isFalse()
         assertThat(typeface.isItalic).isFalse()
@@ -559,12 +558,14 @@
         val fontFamily = FontTestData.FONT_100_REGULAR.toFontFamily()
 
         // Less than 600 is not synthesized
-        val typeface500 = androidTypefaceFromFontFamily(context, fontFamily)
-            .getNativeTypeface(FontWeight.W500, FontStyle.Normal, FontSynthesis.Weight)
+        val typeface500 =
+            androidTypefaceFromFontFamily(context, fontFamily)
+                .getNativeTypeface(FontWeight.W500, FontStyle.Normal, FontSynthesis.Weight)
 
         // 600 or more is synthesized
-        val typeface600 = androidTypefaceFromFontFamily(context, fontFamily)
-            .getNativeTypeface(FontWeight.W600, FontStyle.Normal, FontSynthesis.Weight)
+        val typeface600 =
+            androidTypefaceFromFontFamily(context, fontFamily)
+                .getNativeTypeface(FontWeight.W600, FontStyle.Normal, FontSynthesis.Weight)
 
         assertThat(typeface500.isBold).isFalse()
         assertThat(typeface600.isBold).isTrue()
@@ -574,17 +575,13 @@
     fun typefaceWrapper_returnsExactSameInstance() {
         val typeface = Typeface(android.graphics.Typeface.MONOSPACE) as AndroidTypefaceWrapper
         assertThat(
-            typeface.getNativeTypeface(
-                FontWeight.Light,
-                FontStyle.Italic,
-                FontSynthesis.None
+                typeface.getNativeTypeface(FontWeight.Light, FontStyle.Italic, FontSynthesis.None)
             )
-        ).isEqualTo(android.graphics.Typeface.MONOSPACE)
+            .isEqualTo(android.graphics.Typeface.MONOSPACE)
     }
 }
 
 internal fun anyFontStyle(): FontStyle {
-    return Mockito.argThat { arg: Any ->
-        arg is Int || arg is FontStyle
-    } as FontStyle? ?: FontStyle.Normal
+    return Mockito.argThat { arg: Any -> arg is Int || arg is FontStyle } as FontStyle?
+        ?: FontStyle.Normal
 }
diff --git a/compose/ui/ui-text/src/androidInstrumentedTest/kotlin/androidx/compose/ui/text/platform/EmojiCompatStatusTest.kt b/compose/ui/ui-text/src/androidInstrumentedTest/kotlin/androidx/compose/ui/text/platform/EmojiCompatStatusTest.kt
index db0c29a..56530bd 100644
--- a/compose/ui/ui-text/src/androidInstrumentedTest/kotlin/androidx/compose/ui/text/platform/EmojiCompatStatusTest.kt
+++ b/compose/ui/ui-text/src/androidInstrumentedTest/kotlin/androidx/compose/ui/text/platform/EmojiCompatStatusTest.kt
@@ -127,10 +127,7 @@
         // there's too many async actors to do anything reasonable and non-flaky here. tie up the
         // test thread until main posts the value
         runBlocking {
-            withTimeout(1000) {
-                while (!value)
-                    delay(0)
-            }
+            withTimeout(1000) { while (!value) delay(0) }
             assertThat(value).isTrue()
         }
     }
diff --git a/compose/ui/ui-text/src/androidInstrumentedTest/kotlin/androidx/compose/ui/text/platform/GenericFontFamilyCacheTest.kt b/compose/ui/ui-text/src/androidInstrumentedTest/kotlin/androidx/compose/ui/text/platform/GenericFontFamilyCacheTest.kt
index 0daffb0..354f6d3 100644
--- a/compose/ui/ui-text/src/androidInstrumentedTest/kotlin/androidx/compose/ui/text/platform/GenericFontFamilyCacheTest.kt
+++ b/compose/ui/ui-text/src/androidInstrumentedTest/kotlin/androidx/compose/ui/text/platform/GenericFontFamilyCacheTest.kt
@@ -36,10 +36,11 @@
     fun cached_instance_for_the_same_input() {
         val typeface = AndroidGenericFontFamilyTypeface(FontFamily.SansSerif)
         assertThat(
-            typeface.getNativeTypeface(FontWeight.Bold, FontStyle.Normal, FontSynthesis.None)
-        ).isSameInstanceAs(
-            typeface.getNativeTypeface(FontWeight.Bold, FontStyle.Normal, FontSynthesis.None)
-        )
+                typeface.getNativeTypeface(FontWeight.Bold, FontStyle.Normal, FontSynthesis.None)
+            )
+            .isSameInstanceAs(
+                typeface.getNativeTypeface(FontWeight.Bold, FontStyle.Normal, FontSynthesis.None)
+            )
     }
 
     @Test
@@ -47,9 +48,10 @@
     fun not_cached_instance_if_different_input() {
         val typeface = AndroidGenericFontFamilyTypeface(FontFamily.SansSerif)
         assertThat(
-            typeface.getNativeTypeface(FontWeight.Bold, FontStyle.Normal, FontSynthesis.None)
-        ).isNotSameInstanceAs(
-            typeface.getNativeTypeface(FontWeight.Bold, FontStyle.Italic, FontSynthesis.None)
-        )
+                typeface.getNativeTypeface(FontWeight.Bold, FontStyle.Normal, FontSynthesis.None)
+            )
+            .isNotSameInstanceAs(
+                typeface.getNativeTypeface(FontWeight.Bold, FontStyle.Italic, FontSynthesis.None)
+            )
     }
 }
diff --git a/compose/ui/ui-text/src/androidInstrumentedTest/kotlin/androidx/compose/ui/text/platform/SpannableExtensionsTest.kt b/compose/ui/ui-text/src/androidInstrumentedTest/kotlin/androidx/compose/ui/text/platform/SpannableExtensionsTest.kt
index 653562a..a905f31 100644
--- a/compose/ui/ui-text/src/androidInstrumentedTest/kotlin/androidx/compose/ui/text/platform/SpannableExtensionsTest.kt
+++ b/compose/ui/ui-text/src/androidInstrumentedTest/kotlin/androidx/compose/ui/text/platform/SpannableExtensionsTest.kt
@@ -69,9 +69,7 @@
         val spanStyle = SpanStyle(fontWeight = FontWeight(123))
         val start = 4
         val end = 10
-        val spanStyles = listOf(
-            AnnotatedString.Range(spanStyle, start, end)
-        )
+        val spanStyles = listOf(AnnotatedString.Range(spanStyle, start, end))
         val block = mock<(SpanStyle, Int, Int) -> Unit>()
         flattenFontStylesAndApply(
             contextFontSpanStyle = null,
@@ -86,10 +84,11 @@
         val spanStyle1 = SpanStyle(fontWeight = FontWeight(123))
         val spanStyle2 = SpanStyle(fontStyle = FontStyle.Italic)
 
-        val spanStyles = listOf(
-            AnnotatedString.Range(spanStyle1, 3, 10),
-            AnnotatedString.Range(spanStyle2, 4, 6)
-        )
+        val spanStyles =
+            listOf(
+                AnnotatedString.Range(spanStyle1, 3, 10),
+                AnnotatedString.Range(spanStyle2, 4, 6)
+            )
         val block = mock<(SpanStyle, Int, Int) -> Unit>()
         flattenFontStylesAndApply(
             contextFontSpanStyle = null,
@@ -109,10 +108,11 @@
         val spanStyle1 = SpanStyle(fontWeight = FontWeight(123))
         val spanStyle2 = SpanStyle(fontStyle = FontStyle.Italic)
 
-        val spanStyles = listOf(
-            AnnotatedString.Range(spanStyle1, 3, 10),
-            AnnotatedString.Range(spanStyle2, 3, 6)
-        )
+        val spanStyles =
+            listOf(
+                AnnotatedString.Range(spanStyle1, 3, 10),
+                AnnotatedString.Range(spanStyle2, 3, 6)
+            )
         val block = mock<(SpanStyle, Int, Int) -> Unit>()
         flattenFontStylesAndApply(
             contextFontSpanStyle = null,
@@ -131,10 +131,11 @@
         val spanStyle1 = SpanStyle(fontWeight = FontWeight(123))
         val spanStyle2 = SpanStyle(fontStyle = FontStyle.Italic)
 
-        val spanStyles = listOf(
-            AnnotatedString.Range(spanStyle1, 3, 10),
-            AnnotatedString.Range(spanStyle2, 5, 10)
-        )
+        val spanStyles =
+            listOf(
+                AnnotatedString.Range(spanStyle1, 3, 10),
+                AnnotatedString.Range(spanStyle2, 5, 10)
+            )
         val block = mock<(SpanStyle, Int, Int) -> Unit>()
         flattenFontStylesAndApply(
             contextFontSpanStyle = null,
@@ -153,10 +154,11 @@
         val spanStyle1 = SpanStyle(fontWeight = FontWeight(123))
         val spanStyle2 = SpanStyle(fontStyle = FontStyle.Italic)
 
-        val spanStyles = listOf(
-            AnnotatedString.Range(spanStyle1, 3, 10),
-            AnnotatedString.Range(spanStyle2, 3, 10)
-        )
+        val spanStyles =
+            listOf(
+                AnnotatedString.Range(spanStyle1, 3, 10),
+                AnnotatedString.Range(spanStyle2, 3, 10)
+            )
         val block = mock<(SpanStyle, Int, Int) -> Unit>()
         flattenFontStylesAndApply(
             contextFontSpanStyle = null,
@@ -174,10 +176,11 @@
         val spanStyle1 = SpanStyle(fontWeight = FontWeight(123))
         val spanStyle2 = SpanStyle(fontStyle = FontStyle.Italic)
 
-        val spanStyles = listOf(
-            AnnotatedString.Range(spanStyle1, 3, 10),
-            AnnotatedString.Range(spanStyle2, 6, 19)
-        )
+        val spanStyles =
+            listOf(
+                AnnotatedString.Range(spanStyle1, 3, 10),
+                AnnotatedString.Range(spanStyle2, 6, 19)
+            )
         val block = mock<(SpanStyle, Int, Int) -> Unit>()
         flattenFontStylesAndApply(
             contextFontSpanStyle = null,
@@ -197,10 +200,11 @@
         val spanStyle1 = SpanStyle(fontWeight = FontWeight(123))
         val spanStyle2 = SpanStyle(fontStyle = FontStyle.Italic)
 
-        val spanStyles = listOf(
-            AnnotatedString.Range(spanStyle1, 3, 4),
-            AnnotatedString.Range(spanStyle2, 8, 10)
-        )
+        val spanStyles =
+            listOf(
+                AnnotatedString.Range(spanStyle1, 3, 4),
+                AnnotatedString.Range(spanStyle2, 8, 10)
+            )
         val block = mock<(SpanStyle, Int, Int) -> Unit>()
         flattenFontStylesAndApply(
             contextFontSpanStyle = null,
@@ -219,10 +223,11 @@
         val spanStyle1 = SpanStyle(fontWeight = FontWeight(123))
         val spanStyle2 = SpanStyle(fontWeight = FontWeight(200))
 
-        val spanStyles = listOf(
-            AnnotatedString.Range(spanStyle1, 3, 10),
-            AnnotatedString.Range(spanStyle2, 5, 9)
-        )
+        val spanStyles =
+            listOf(
+                AnnotatedString.Range(spanStyle1, 3, 10),
+                AnnotatedString.Range(spanStyle2, 5, 9)
+            )
         val block = mock<(SpanStyle, Int, Int) -> Unit>()
         flattenFontStylesAndApply(
             contextFontSpanStyle = null,
@@ -243,10 +248,11 @@
         val spanStyle1 = SpanStyle(fontWeight = FontWeight(123))
         val spanStyle2 = SpanStyle(fontWeight = FontWeight(200))
 
-        val spanStyles = listOf(
-            AnnotatedString.Range(spanStyle1, 5, 7),
-            AnnotatedString.Range(spanStyle2, 3, 10)
-        )
+        val spanStyles =
+            listOf(
+                AnnotatedString.Range(spanStyle1, 5, 7),
+                AnnotatedString.Range(spanStyle2, 3, 10)
+            )
         val block = mock<(SpanStyle, Int, Int) -> Unit>()
         flattenFontStylesAndApply(
             contextFontSpanStyle = null,
@@ -269,11 +275,12 @@
         val spanStyle2 = SpanStyle(fontWeight = FontWeight(200))
         val spanStyle3 = SpanStyle(fontWeight = FontWeight(300))
 
-        val spanStyles = listOf(
-            AnnotatedString.Range(spanStyle3, 7, 8),
-            AnnotatedString.Range(spanStyle2, 3, 4),
-            AnnotatedString.Range(spanStyle1, 1, 2)
-        )
+        val spanStyles =
+            listOf(
+                AnnotatedString.Range(spanStyle3, 7, 8),
+                AnnotatedString.Range(spanStyle2, 3, 4),
+                AnnotatedString.Range(spanStyle1, 1, 2)
+            )
         val block = mock<(SpanStyle, Int, Int) -> Unit>()
         flattenFontStylesAndApply(
             contextFontSpanStyle = null,
@@ -294,10 +301,8 @@
         val spanStyle1 = SpanStyle(fontWeight = FontWeight(100))
         val spanStyle2 = SpanStyle(fontWeight = FontWeight(200))
 
-        val spanStyles = listOf(
-            AnnotatedString.Range(spanStyle1, 5, 9),
-            AnnotatedString.Range(spanStyle2, 3, 6)
-        )
+        val spanStyles =
+            listOf(AnnotatedString.Range(spanStyle1, 5, 9), AnnotatedString.Range(spanStyle2, 3, 6))
         val block = mock<(SpanStyle, Int, Int) -> Unit>()
         flattenFontStylesAndApply(
             contextFontSpanStyle = null,
@@ -321,11 +326,12 @@
         val spanStyle2 = SpanStyle(fontWeight = FontWeight(200))
         val spanStyle3 = SpanStyle(fontWeight = FontWeight(300))
 
-        val spanStyles = listOf(
-            AnnotatedString.Range(spanStyle1, 2, 2),
-            AnnotatedString.Range(spanStyle2, 4, 4),
-            AnnotatedString.Range(spanStyle3, 0, 0),
-        )
+        val spanStyles =
+            listOf(
+                AnnotatedString.Range(spanStyle1, 2, 2),
+                AnnotatedString.Range(spanStyle2, 4, 4),
+                AnnotatedString.Range(spanStyle3, 0, 0),
+            )
         val block = mock<(SpanStyle, Int, Int) -> Unit>()
         flattenFontStylesAndApply(
             contextFontSpanStyle = contextSpanStyle,
@@ -345,11 +351,12 @@
         val spanStyle2 = SpanStyle(fontStyle = FontStyle.Italic)
         val spanStyle3 = SpanStyle(fontWeight = FontWeight(200))
 
-        val spanStyles = listOf(
-            AnnotatedString.Range(spanStyle3, 4, 10),
-            AnnotatedString.Range(spanStyle2, 1, 7),
-            AnnotatedString.Range(spanStyle1, 3, 3)
-        )
+        val spanStyles =
+            listOf(
+                AnnotatedString.Range(spanStyle3, 4, 10),
+                AnnotatedString.Range(spanStyle2, 1, 7),
+                AnnotatedString.Range(spanStyle1, 3, 3)
+            )
         val block = mock<(SpanStyle, Int, Int) -> Unit>()
         flattenFontStylesAndApply(
             contextFontSpanStyle = null,
@@ -370,10 +377,8 @@
         val spanStyle1 = SpanStyle(fontWeight = FontWeight(100))
         val spanStyle2 = SpanStyle(fontStyle = FontStyle.Italic)
 
-        val spanStyles = listOf(
-            AnnotatedString.Range(spanStyle1, 0, 0),
-            AnnotatedString.Range(spanStyle2, 0, 7)
-        )
+        val spanStyles =
+            listOf(AnnotatedString.Range(spanStyle1, 0, 0), AnnotatedString.Range(spanStyle2, 0, 7))
         val block = mock<(SpanStyle, Int, Int) -> Unit>()
         flattenFontStylesAndApply(
             contextFontSpanStyle = null,
@@ -394,9 +399,7 @@
         val contextSpanStyle = SpanStyle(color = color, fontStyle = fontStyle)
         val spanStyle = SpanStyle(fontWeight = fontWeight)
 
-        val spanStyles = listOf(
-            AnnotatedString.Range(spanStyle, 3, 6)
-        )
+        val spanStyles = listOf(AnnotatedString.Range(spanStyle, 3, 6))
         val block = mock<(SpanStyle, Int, Int) -> Unit>()
         flattenFontStylesAndApply(
             contextFontSpanStyle = contextSpanStyle,
@@ -404,17 +407,15 @@
             block = block
         )
         inOrder(block) {
-            verify(block).invoke(
-                argThat {
-                    this == SpanStyle(
-                        color = color,
-                        fontStyle = fontStyle,
-                        fontWeight = fontWeight
-                    )
-                },
-                eq(3),
-                eq(6)
-            )
+            verify(block)
+                .invoke(
+                    argThat {
+                        this ==
+                            SpanStyle(color = color, fontStyle = fontStyle, fontWeight = fontWeight)
+                    },
+                    eq(3),
+                    eq(6)
+                )
             verifyNoMoreInteractions()
         }
     }
@@ -429,12 +430,13 @@
         val fontWeight = FontWeight.Bold
         val fontStyle = FontStyle.Italic
         val fontSize = 24.sp
-        val contextSpanStyle = SpanStyle(
-            color = contextColor,
-            fontWeight = contextFontWeight,
-            fontStyle = contextFontStyle,
-            fontSize = contextFontSize
-        )
+        val contextSpanStyle =
+            SpanStyle(
+                color = contextColor,
+                fontWeight = contextFontWeight,
+                fontStyle = contextFontStyle,
+                fontSize = contextFontSize
+            )
         val spanStyle1 = SpanStyle(fontWeight = fontWeight)
         val spanStyle2 = SpanStyle(fontStyle = fontStyle)
         val spanStyle3 = SpanStyle(fontSize = fontSize)
@@ -445,11 +447,12 @@
         //   [6, 8)   contextColor, fontWeight,        fontStyle,        fontSize
         //   [8, 10)  contextColor, contextFontWeight, fontStyle,        fontSize
         //   [10, 12) contextColor, contextFontWeight, contextFontStyle, fontSize
-        val spanStyles = listOf(
-            AnnotatedString.Range(spanStyle1, 2, 8),
-            AnnotatedString.Range(spanStyle2, 4, 10),
-            AnnotatedString.Range(spanStyle3, 6, 12),
-        )
+        val spanStyles =
+            listOf(
+                AnnotatedString.Range(spanStyle1, 2, 8),
+                AnnotatedString.Range(spanStyle2, 4, 10),
+                AnnotatedString.Range(spanStyle3, 6, 12),
+            )
         val block = mock<(SpanStyle, Int, Int) -> Unit>()
         flattenFontStylesAndApply(
             contextFontSpanStyle = contextSpanStyle,
@@ -458,48 +461,48 @@
         )
 
         inOrder(block) {
-            verify(block).invoke(
-                argThat {
-                    this == contextSpanStyle.copy(fontWeight = fontWeight)
-                },
-                eq(2),
-                eq(4)
-            )
-            verify(block).invoke(
-                argThat {
-                    this == contextSpanStyle.copy(fontWeight = fontWeight, fontStyle = fontStyle)
-                },
-                eq(4),
-                eq(6)
-            )
-            verify(block).invoke(
-                argThat {
-                    this == contextSpanStyle.copy(
-                        fontWeight = fontWeight,
-                        fontStyle = fontStyle,
-                        fontSize = fontSize
-                    )
-                },
-                eq(6),
-                eq(8)
-            )
-            verify(block).invoke(
-                argThat {
-                    this == contextSpanStyle.copy(
-                        fontStyle = fontStyle,
-                        fontSize = fontSize
-                    )
-                },
-                eq(8),
-                eq(10)
-            )
-            verify(block).invoke(
-                argThat {
-                    this == contextSpanStyle.copy(fontSize = fontSize)
-                },
-                eq(10),
-                eq(12)
-            )
+            verify(block)
+                .invoke(
+                    argThat { this == contextSpanStyle.copy(fontWeight = fontWeight) },
+                    eq(2),
+                    eq(4)
+                )
+            verify(block)
+                .invoke(
+                    argThat {
+                        this ==
+                            contextSpanStyle.copy(fontWeight = fontWeight, fontStyle = fontStyle)
+                    },
+                    eq(4),
+                    eq(6)
+                )
+            verify(block)
+                .invoke(
+                    argThat {
+                        this ==
+                            contextSpanStyle.copy(
+                                fontWeight = fontWeight,
+                                fontStyle = fontStyle,
+                                fontSize = fontSize
+                            )
+                    },
+                    eq(6),
+                    eq(8)
+                )
+            verify(block)
+                .invoke(
+                    argThat {
+                        this == contextSpanStyle.copy(fontStyle = fontStyle, fontSize = fontSize)
+                    },
+                    eq(8),
+                    eq(10)
+                )
+            verify(block)
+                .invoke(
+                    argThat { this == contextSpanStyle.copy(fontSize = fontSize) },
+                    eq(10),
+                    eq(12)
+                )
             verifyNoMoreInteractions()
         }
     }
@@ -562,10 +565,11 @@
         val spannable = SpannableStringBuilder().apply { append(text) }
         spannable.setSpanStyles(
             contextTextStyle = TextStyle(),
-            spanStyles = listOf(
-                AnnotatedString.Range(brushStyle, 0, text.length),
-                AnnotatedString.Range(colorStyle, 0, text.length)
-            ),
+            spanStyles =
+                listOf(
+                    AnnotatedString.Range(brushStyle, 0, text.length),
+                    AnnotatedString.Range(colorStyle, 0, text.length)
+                ),
             density = Density(1f, 1f),
             resolveTypeface = { _, _, _, _ -> Typeface.DEFAULT }
         )
@@ -585,10 +589,11 @@
         val spannable = SpannableStringBuilder().apply { append(text) }
         spannable.setSpanStyles(
             contextTextStyle = TextStyle(),
-            spanStyles = listOf(
-                AnnotatedString.Range(brushStyle, 0, text.length),
-                AnnotatedString.Range(colorStyle, 0, text.length)
-            ),
+            spanStyles =
+                listOf(
+                    AnnotatedString.Range(brushStyle, 0, text.length),
+                    AnnotatedString.Range(colorStyle, 0, text.length)
+                ),
             density = Density(1f, 1f),
             resolveTypeface = { _, _, _, _ -> Typeface.DEFAULT }
         )
diff --git a/compose/ui/ui-text/src/androidInstrumentedTest/kotlin/androidx/compose/ui/text/platform/TextPaintExtensionsTest.kt b/compose/ui/ui-text/src/androidInstrumentedTest/kotlin/androidx/compose/ui/text/platform/TextPaintExtensionsTest.kt
index 1a0eceb78..f80a8c0 100644
--- a/compose/ui/ui-text/src/androidInstrumentedTest/kotlin/androidx/compose/ui/text/platform/TextPaintExtensionsTest.kt
+++ b/compose/ui/ui-text/src/androidInstrumentedTest/kotlin/androidx/compose/ui/text/platform/TextPaintExtensionsTest.kt
@@ -80,10 +80,7 @@
 
     @Test
     fun textGeometricTransform_shouldBeAppliedTo_scaleSkew() {
-        val textGeometricTransform = TextGeometricTransform(
-            scaleX = 1.5f,
-            skewX = 1f
-        )
+        val textGeometricTransform = TextGeometricTransform(scaleX = 1.5f, skewX = 1f)
         val spanStyle = SpanStyle(textGeometricTransform = textGeometricTransform)
         val tp = AndroidTextPaint(0, density.density)
         val originalSkew = tp.textSkewX
@@ -194,12 +191,13 @@
         val fontStyle = FontStyle.Italic
         val fontSynthesis = FontSynthesis.Style
 
-        val spanStyle = SpanStyle(
-            fontFamily = fontFamily,
-            fontWeight = fontWeight,
-            fontStyle = fontStyle,
-            fontSynthesis = fontSynthesis
-        )
+        val spanStyle =
+            SpanStyle(
+                fontFamily = fontFamily,
+                fontWeight = fontWeight,
+                fontStyle = fontStyle,
+                fontSynthesis = fontSynthesis
+            )
 
         val tp = AndroidTextPaint(0, density.density)
         tp.typeface = Typeface.DEFAULT
@@ -209,17 +207,18 @@
         var calledFontStyle: FontStyle? = null
         var calledFontSynthesis: FontSynthesis? = null
 
-        val notApplied = tp.applySpanStyle(
-            spanStyle,
-            { family, weight, style, synthesis ->
-                calledFontFamily = family
-                calledFontWeight = weight
-                calledFontStyle = style
-                calledFontSynthesis = synthesis
-                Typeface.MONOSPACE
-            },
-            density
-        )
+        val notApplied =
+            tp.applySpanStyle(
+                spanStyle,
+                { family, weight, style, synthesis ->
+                    calledFontFamily = family
+                    calledFontWeight = weight
+                    calledFontStyle = style
+                    calledFontSynthesis = synthesis
+                    Typeface.MONOSPACE
+                },
+                density
+            )
 
         assertThat(tp.typeface).isEqualTo(Typeface.MONOSPACE)
         assertThat(calledFontFamily).isEqualTo(fontFamily)
@@ -360,8 +359,7 @@
         val tp = AndroidTextPaint(0, density.density)
         tp.setTextMotion(textMotion)
 
-        assertThat(tp.flags and TextPaint.LINEAR_TEXT_FLAG)
-            .isEqualTo(TextPaint.LINEAR_TEXT_FLAG)
+        assertThat(tp.flags and TextPaint.LINEAR_TEXT_FLAG).isEqualTo(TextPaint.LINEAR_TEXT_FLAG)
         assertThat(tp.flags and TextPaint.SUBPIXEL_TEXT_FLAG)
             .isEqualTo(TextPaint.SUBPIXEL_TEXT_FLAG)
         assertThat(tp.hinting).isEqualTo(TextPaint.HINTING_OFF)
@@ -373,8 +371,7 @@
         val tp = AndroidTextPaint(0, density.density)
         tp.setTextMotion(textMotion)
 
-        assertThat(tp.flags and TextPaint.LINEAR_TEXT_FLAG)
-            .isEqualTo(0)
+        assertThat(tp.flags and TextPaint.LINEAR_TEXT_FLAG).isEqualTo(0)
         assertThat(tp.flags and TextPaint.SUBPIXEL_TEXT_FLAG)
             .isEqualTo(TextPaint.SUBPIXEL_TEXT_FLAG)
         assertThat(tp.hinting).isEqualTo(TextPaint.HINTING_ON)
@@ -386,8 +383,7 @@
         val tp = AndroidTextPaint(0, density.density)
         tp.setTextMotion(textMotion)
 
-        assertThat(tp.flags and TextPaint.LINEAR_TEXT_FLAG)
-            .isEqualTo(0)
+        assertThat(tp.flags and TextPaint.LINEAR_TEXT_FLAG).isEqualTo(0)
         assertThat(tp.flags and TextPaint.SUBPIXEL_TEXT_FLAG)
             .isEqualTo(TextPaint.SUBPIXEL_TEXT_FLAG)
         assertThat(tp.hinting).isEqualTo(TextPaint.HINTING_OFF)
diff --git a/compose/ui/ui-text/src/androidInstrumentedTest/kotlin/androidx/compose/ui/text/platform/TextTestExtensions.kt b/compose/ui/ui-text/src/androidInstrumentedTest/kotlin/androidx/compose/ui/text/platform/TextTestExtensions.kt
index 20f5522..ef19be5 100644
--- a/compose/ui/ui-text/src/androidInstrumentedTest/kotlin/androidx/compose/ui/text/platform/TextTestExtensions.kt
+++ b/compose/ui/ui-text/src/androidInstrumentedTest/kotlin/androidx/compose/ui/text/platform/TextTestExtensions.kt
@@ -25,11 +25,7 @@
 import androidx.compose.ui.text.android.TextLayout
 
 fun Layout.bitmap(): Bitmap {
-    val bitmap = Bitmap.createBitmap(
-        this.width,
-        this.height,
-        Bitmap.Config.ARGB_8888
-    )
+    val bitmap = Bitmap.createBitmap(this.width, this.height, Bitmap.Config.ARGB_8888)
     this.draw(Canvas(bitmap))
     return bitmap
 }
@@ -50,10 +46,7 @@
     paint.textSize = fontSize
     paint.typeface = this
     // 1.5 is a random number to increase the size of bitmap a little
-    val layout = TextLayout(
-        charSequence = text,
-        textPaint = paint,
-        width = text.length * fontSize * 1.5f
-    )
+    val layout =
+        TextLayout(charSequence = text, textPaint = paint, width = text.length * fontSize * 1.5f)
     return layout.bitmap()
 }
diff --git a/compose/ui/ui-text/src/androidInstrumentedTest/kotlin/androidx/compose/ui/text/style/HyphensTest.kt b/compose/ui/ui-text/src/androidInstrumentedTest/kotlin/androidx/compose/ui/text/style/HyphensTest.kt
index c3469bf..5f271e9 100644
--- a/compose/ui/ui-text/src/androidInstrumentedTest/kotlin/androidx/compose/ui/text/style/HyphensTest.kt
+++ b/compose/ui/ui-text/src/androidInstrumentedTest/kotlin/androidx/compose/ui/text/style/HyphensTest.kt
@@ -26,33 +26,15 @@
 
     @Test
     fun check_hyphens_Auto() {
-        val brokenLines = breakTextIntoLines(
-            text = text,
-            hyphens = Hyphens.Auto,
-            maxWidth = 30
-        )
-        val expected = listOf(
-            "Tran",
-            "sfor",
-            "ma",
-            "tion"
-        )
+        val brokenLines = breakTextIntoLines(text = text, hyphens = Hyphens.Auto, maxWidth = 30)
+        val expected = listOf("Tran", "sfor", "ma", "tion")
         assertThat(brokenLines).isEqualTo(expected)
     }
 
     @Test
     fun check_hyphens_None() {
-        val brokenLines = breakTextIntoLines(
-            text = text,
-            hyphens = Hyphens.None,
-            maxWidth = 30
-        )
-        val expected = listOf(
-            "Tran",
-            "sfor",
-            "mati",
-            "on"
-        )
+        val brokenLines = breakTextIntoLines(text = text, hyphens = Hyphens.None, maxWidth = 30)
+        val expected = listOf("Tran", "sfor", "mati", "on")
         assertThat(brokenLines).isEqualTo(expected)
     }
 }
diff --git a/compose/ui/ui-text/src/androidInstrumentedTest/kotlin/androidx/compose/ui/text/style/LineBreakTest.kt b/compose/ui/ui-text/src/androidInstrumentedTest/kotlin/androidx/compose/ui/text/style/LineBreakTest.kt
index 040414c..e44bba5 100644
--- a/compose/ui/ui-text/src/androidInstrumentedTest/kotlin/androidx/compose/ui/text/style/LineBreakTest.kt
+++ b/compose/ui/ui-text/src/androidInstrumentedTest/kotlin/androidx/compose/ui/text/style/LineBreakTest.kt
@@ -57,160 +57,162 @@
 
     @Test
     fun equals_different_strategy_returns_false() {
-        val lineBreak = LineBreak(
-            strategy = LineBreak.Strategy.Balanced,
-            strictness = LineBreak.Strictness.Strict,
-            wordBreak = LineBreak.WordBreak.Phrase
-        )
-        val otherLineBreak = LineBreak(
-            strategy = LineBreak.Strategy.HighQuality,
-            strictness = LineBreak.Strictness.Strict,
-            wordBreak = LineBreak.WordBreak.Phrase
-        )
+        val lineBreak =
+            LineBreak(
+                strategy = LineBreak.Strategy.Balanced,
+                strictness = LineBreak.Strictness.Strict,
+                wordBreak = LineBreak.WordBreak.Phrase
+            )
+        val otherLineBreak =
+            LineBreak(
+                strategy = LineBreak.Strategy.HighQuality,
+                strictness = LineBreak.Strictness.Strict,
+                wordBreak = LineBreak.WordBreak.Phrase
+            )
 
         assertThat(lineBreak.equals(otherLineBreak)).isFalse()
     }
 
     @Test
     fun equals_different_style_returns_false() {
-        val lineBreak = LineBreak(
-            strategy = LineBreak.Strategy.Balanced,
-            strictness = LineBreak.Strictness.Strict,
-            wordBreak = LineBreak.WordBreak.Phrase
-        )
-        val otherLineBreak = LineBreak(
-            strategy = LineBreak.Strategy.Balanced,
-            strictness = LineBreak.Strictness.Loose,
-            wordBreak = LineBreak.WordBreak.Phrase
-        )
+        val lineBreak =
+            LineBreak(
+                strategy = LineBreak.Strategy.Balanced,
+                strictness = LineBreak.Strictness.Strict,
+                wordBreak = LineBreak.WordBreak.Phrase
+            )
+        val otherLineBreak =
+            LineBreak(
+                strategy = LineBreak.Strategy.Balanced,
+                strictness = LineBreak.Strictness.Loose,
+                wordBreak = LineBreak.WordBreak.Phrase
+            )
 
         assertThat(lineBreak.equals(otherLineBreak)).isFalse()
     }
 
     @Test
     fun equals_different_wordBreak_returns_false() {
-        val lineBreak = LineBreak(
-            strategy = LineBreak.Strategy.Balanced,
-            strictness = LineBreak.Strictness.Strict,
-            wordBreak = LineBreak.WordBreak.Phrase
-        )
-        val otherLineBreak = LineBreak(
-            strategy = LineBreak.Strategy.Balanced,
-            strictness = LineBreak.Strictness.Strict,
-            wordBreak = LineBreak.WordBreak.Default
-        )
+        val lineBreak =
+            LineBreak(
+                strategy = LineBreak.Strategy.Balanced,
+                strictness = LineBreak.Strictness.Strict,
+                wordBreak = LineBreak.WordBreak.Phrase
+            )
+        val otherLineBreak =
+            LineBreak(
+                strategy = LineBreak.Strategy.Balanced,
+                strictness = LineBreak.Strictness.Strict,
+                wordBreak = LineBreak.WordBreak.Default
+            )
 
         assertThat(lineBreak.equals(otherLineBreak)).isFalse()
     }
 
     @Test
     fun equals_same_flags_returns_true() {
-        val lineBreak = LineBreak(
-            strategy = LineBreak.Strategy.Balanced,
-            strictness = LineBreak.Strictness.Strict,
-            wordBreak = LineBreak.WordBreak.Phrase
-        )
-        val otherLineBreak = LineBreak(
-            strategy = LineBreak.Strategy.Balanced,
-            strictness = LineBreak.Strictness.Strict,
-            wordBreak = LineBreak.WordBreak.Phrase
-        )
+        val lineBreak =
+            LineBreak(
+                strategy = LineBreak.Strategy.Balanced,
+                strictness = LineBreak.Strictness.Strict,
+                wordBreak = LineBreak.WordBreak.Phrase
+            )
+        val otherLineBreak =
+            LineBreak(
+                strategy = LineBreak.Strategy.Balanced,
+                strictness = LineBreak.Strictness.Strict,
+                wordBreak = LineBreak.WordBreak.Phrase
+            )
 
         assertThat(lineBreak.equals(otherLineBreak)).isTrue()
     }
 
     @Test
     fun hashCode_different_for_different_strategy() {
-        val lineBreak = LineBreak(
-            strategy = LineBreak.Strategy.Balanced,
-            strictness = LineBreak.Strictness.Strict,
-            wordBreak = LineBreak.WordBreak.Phrase
-        )
-        val otherLineBreak = LineBreak(
-            strategy = LineBreak.Strategy.HighQuality,
-            strictness = LineBreak.Strictness.Strict,
-            wordBreak = LineBreak.WordBreak.Phrase
-        )
+        val lineBreak =
+            LineBreak(
+                strategy = LineBreak.Strategy.Balanced,
+                strictness = LineBreak.Strictness.Strict,
+                wordBreak = LineBreak.WordBreak.Phrase
+            )
+        val otherLineBreak =
+            LineBreak(
+                strategy = LineBreak.Strategy.HighQuality,
+                strictness = LineBreak.Strictness.Strict,
+                wordBreak = LineBreak.WordBreak.Phrase
+            )
 
         assertThat(lineBreak.hashCode()).isNotEqualTo(otherLineBreak.hashCode())
     }
 
     @Test
     fun hashCode_different_for_different_style() {
-        val lineBreak = LineBreak(
-            strategy = LineBreak.Strategy.Balanced,
-            strictness = LineBreak.Strictness.Strict,
-            wordBreak = LineBreak.WordBreak.Phrase
-        )
-        val otherLineBreak = LineBreak(
-            strategy = LineBreak.Strategy.Balanced,
-            strictness = LineBreak.Strictness.Loose,
-            wordBreak = LineBreak.WordBreak.Phrase
-        )
+        val lineBreak =
+            LineBreak(
+                strategy = LineBreak.Strategy.Balanced,
+                strictness = LineBreak.Strictness.Strict,
+                wordBreak = LineBreak.WordBreak.Phrase
+            )
+        val otherLineBreak =
+            LineBreak(
+                strategy = LineBreak.Strategy.Balanced,
+                strictness = LineBreak.Strictness.Loose,
+                wordBreak = LineBreak.WordBreak.Phrase
+            )
 
         assertThat(lineBreak.hashCode()).isNotEqualTo(otherLineBreak.hashCode())
     }
 
     @Test
     fun hashCode_different_for_different_wordBreak() {
-        val lineBreak = LineBreak(
-            strategy = LineBreak.Strategy.Balanced,
-            strictness = LineBreak.Strictness.Strict,
-            wordBreak = LineBreak.WordBreak.Phrase
-        )
-        val otherLineBreak = LineBreak(
-            strategy = LineBreak.Strategy.Balanced,
-            strictness = LineBreak.Strictness.Strict,
-            wordBreak = LineBreak.WordBreak.Default
-        )
+        val lineBreak =
+            LineBreak(
+                strategy = LineBreak.Strategy.Balanced,
+                strictness = LineBreak.Strictness.Strict,
+                wordBreak = LineBreak.WordBreak.Phrase
+            )
+        val otherLineBreak =
+            LineBreak(
+                strategy = LineBreak.Strategy.Balanced,
+                strictness = LineBreak.Strictness.Strict,
+                wordBreak = LineBreak.WordBreak.Default
+            )
 
         assertThat(lineBreak.hashCode()).isNotEqualTo(otherLineBreak.hashCode())
     }
 
     @Test
     fun hashCode_same_for_same_flags() {
-        val lineBreak = LineBreak(
-            strategy = LineBreak.Strategy.Balanced,
-            strictness = LineBreak.Strictness.Strict,
-            wordBreak = LineBreak.WordBreak.Phrase
-        )
-        val otherLineBreak = LineBreak(
-            strategy = LineBreak.Strategy.Balanced,
-            strictness = LineBreak.Strictness.Strict,
-            wordBreak = LineBreak.WordBreak.Phrase
-        )
+        val lineBreak =
+            LineBreak(
+                strategy = LineBreak.Strategy.Balanced,
+                strictness = LineBreak.Strictness.Strict,
+                wordBreak = LineBreak.WordBreak.Phrase
+            )
+        val otherLineBreak =
+            LineBreak(
+                strategy = LineBreak.Strategy.Balanced,
+                strictness = LineBreak.Strictness.Strict,
+                wordBreak = LineBreak.WordBreak.Phrase
+            )
 
         assertThat(lineBreak.hashCode()).isEqualTo(otherLineBreak.hashCode())
     }
 
     @Test
     fun correct_lineBreak_simple_result_narrow() {
-        val expectedBrokenLines = listOf(
-            "This is ",
-            "an ",
-            "example ",
-            "text"
-        )
-        val brokenLines = breakTextIntoLines(
-            text = textToLineBreak,
-            lineBreak = LineBreak.Simple,
-            maxWidth = 50
-        )
+        val expectedBrokenLines = listOf("This is ", "an ", "example ", "text")
+        val brokenLines =
+            breakTextIntoLines(text = textToLineBreak, lineBreak = LineBreak.Simple, maxWidth = 50)
 
         assertThat(brokenLines).isEqualTo(expectedBrokenLines)
     }
 
     @Test
     fun correct_lineBreak_simple_result_wide() {
-        val expectedBrokenLines = listOf(
-            "This is an example ",
-            "text"
-        )
-        val brokenLines = breakTextIntoLines(
-            text = textToLineBreak,
-            lineBreak = LineBreak.Simple,
-            maxWidth = 120
-        )
+        val expectedBrokenLines = listOf("This is an example ", "text")
+        val brokenLines =
+            breakTextIntoLines(text = textToLineBreak, lineBreak = LineBreak.Simple, maxWidth = 120)
 
         assertThat(brokenLines).isEqualTo(expectedBrokenLines)
     }
@@ -218,17 +220,13 @@
     @SdkSuppress(minSdkVersion = 23) // b/269193836
     @Test
     fun correct_lineBreak_paragraph_result() {
-        val expectedBrokenLines = listOf(
-            "This ",
-            "is an ",
-            "example ",
-            "text"
-        )
-        val brokenLines = breakTextIntoLines(
-            text = textToLineBreak,
-            lineBreak = LineBreak.Paragraph,
-            maxWidth = 50
-        )
+        val expectedBrokenLines = listOf("This ", "is an ", "example ", "text")
+        val brokenLines =
+            breakTextIntoLines(
+                text = textToLineBreak,
+                lineBreak = LineBreak.Paragraph,
+                maxWidth = 50
+            )
 
         assertThat(brokenLines).isEqualTo(expectedBrokenLines)
     }
@@ -236,15 +234,13 @@
     @SdkSuppress(minSdkVersion = 23) // b/269193836
     @Test
     fun correct_lineBreak_heading_result() {
-        val expectedBrokenLines = listOf(
-            "This is an ",
-            "example text"
-        )
-        val brokenLines = breakTextIntoLines(
-            text = textToLineBreak,
-            lineBreak = LineBreak.Heading,
-            maxWidth = 120
-        )
+        val expectedBrokenLines = listOf("This is an ", "example text")
+        val brokenLines =
+            breakTextIntoLines(
+                text = textToLineBreak,
+                lineBreak = LineBreak.Heading,
+                maxWidth = 120
+            )
 
         assertThat(brokenLines).isEqualTo(expectedBrokenLines)
     }
diff --git a/compose/ui/ui-text/src/androidInstrumentedTest/kotlin/androidx/compose/ui/text/style/TextLineBreaker.kt b/compose/ui/ui-text/src/androidInstrumentedTest/kotlin/androidx/compose/ui/text/style/TextLineBreaker.kt
index 9077ca0..2187744 100644
--- a/compose/ui/ui-text/src/androidInstrumentedTest/kotlin/androidx/compose/ui/text/style/TextLineBreaker.kt
+++ b/compose/ui/ui-text/src/androidInstrumentedTest/kotlin/androidx/compose/ui/text/style/TextLineBreaker.kt
@@ -44,10 +44,8 @@
             style = textStyle,
             maxLines = Int.MAX_VALUE,
             ellipsis = false,
-            constraints = Constraints(
-                maxWidth = maxWidth,
-                maxHeight = Float.POSITIVE_INFINITY.ceilToInt()
-            ),
+            constraints =
+                Constraints(maxWidth = maxWidth, maxHeight = Float.POSITIVE_INFINITY.ceilToInt()),
             density = density,
             fontFamilyResolver = fontFamilyResolver
         )
@@ -59,17 +57,15 @@
         lineBreak: LineBreak = defaultLineBreak,
         maxWidth: Int
     ): List<String> {
-        val layoutResult = paragraph(
-            text = text,
-            textStyle = TextStyle(hyphens = hyphens, lineBreak = lineBreak),
-            maxWidth = maxWidth
-        )
+        val layoutResult =
+            paragraph(
+                text = text,
+                textStyle = TextStyle(hyphens = hyphens, lineBreak = lineBreak),
+                maxWidth = maxWidth
+            )
 
         return (0 until layoutResult.lineCount).map { lineIndex ->
-            text.substring(
-                layoutResult.getLineStart(lineIndex),
-                layoutResult.getLineEnd(lineIndex)
-            )
+            text.substring(layoutResult.getLineStart(lineIndex), layoutResult.getLineEnd(lineIndex))
         }
     }
 }
diff --git a/compose/ui/ui-text/src/androidMain/kotlin/androidx/compose/ui/text/AndroidParagraph.android.kt b/compose/ui/ui-text/src/androidMain/kotlin/androidx/compose/ui/text/AndroidParagraph.android.kt
index 47f95c5..dfe0975 100644
--- a/compose/ui/ui-text/src/androidMain/kotlin/androidx/compose/ui/text/AndroidParagraph.android.kt
+++ b/compose/ui/ui-text/src/androidMain/kotlin/androidx/compose/ui/text/AndroidParagraph.android.kt
@@ -88,9 +88,7 @@
 import androidx.compose.ui.unit.sp
 import java.util.Locale as JavaLocale
 
-/**
- * Android specific implementation for [Paragraph]
- */
+/** Android specific implementation for [Paragraph] */
 // NOTE(text-perf-review): I see most of the APIs in this class just delegate to TextLayout or to
 // AndroidParagraphIntrinsics. Should we consider just having one TextLayout class which
 // implements Paragraph and ParagraphIntrinsics? it seems like all of these types are immutable
@@ -113,14 +111,15 @@
         fontFamilyResolver: FontFamily.Resolver,
         density: Density
     ) : this(
-        paragraphIntrinsics = AndroidParagraphIntrinsics(
-            text = text,
-            style = style,
-            placeholders = placeholders,
-            spanStyles = spanStyles,
-            fontFamilyResolver = fontFamilyResolver,
-            density = density
-        ),
+        paragraphIntrinsics =
+            AndroidParagraphIntrinsics(
+                text = text,
+                style = style,
+                placeholders = placeholders,
+                spanStyles = spanStyles,
+                fontFamilyResolver = fontFamilyResolver,
+                density = density
+            ),
         maxLines = maxLines,
         ellipsis = ellipsis,
         constraints = constraints
@@ -128,8 +127,7 @@
 
     private val layout: TextLayout
 
-    @VisibleForTesting
-    internal val charSequence: CharSequence
+    @VisibleForTesting internal val charSequence: CharSequence
 
     init {
         require(constraints.minHeight == 0 && constraints.minWidth == 0) {
@@ -140,21 +138,24 @@
 
         val style = paragraphIntrinsics.style
 
-        charSequence = if (shouldAttachIndentationFixSpan(style, ellipsis)) {
-            // When letter spacing, align and ellipsize applied to text, the ellipsized line is
-            // indented wrong. This function adds the IndentationFixSpan in order to fix the issue
-            // with best effort. b/228463206
-            paragraphIntrinsics.charSequence.attachIndentationFixSpan()
-        } else {
-            paragraphIntrinsics.charSequence
-        }
+        charSequence =
+            if (shouldAttachIndentationFixSpan(style, ellipsis)) {
+                // When letter spacing, align and ellipsize applied to text, the ellipsized line is
+                // indented wrong. This function adds the IndentationFixSpan in order to fix the
+                // issue
+                // with best effort. b/228463206
+                paragraphIntrinsics.charSequence.attachIndentationFixSpan()
+            } else {
+                paragraphIntrinsics.charSequence
+            }
 
         val alignment = toLayoutAlign(style.textAlign)
 
-        val justificationMode = when (style.textAlign) {
-            TextAlign.Justify -> JUSTIFICATION_MODE_INTER_WORD
-            else -> DEFAULT_JUSTIFICATION_MODE
-        }
+        val justificationMode =
+            when (style.textAlign) {
+                TextAlign.Justify -> JUSTIFICATION_MODE_INTER_WORD
+                else -> DEFAULT_JUSTIFICATION_MODE
+            }
 
         val hyphens = toLayoutHyphenationFrequency(style.paragraphStyle.hyphens)
 
@@ -162,45 +163,50 @@
         val lineBreakStyle = toLayoutLineBreakStyle(style.lineBreak.strictness)
         val lineBreakWordStyle = toLayoutLineBreakWordStyle(style.lineBreak.wordBreak)
 
-        val ellipsize = if (ellipsis) {
-            TextUtils.TruncateAt.END
-        } else {
-            null
-        }
+        val ellipsize =
+            if (ellipsis) {
+                TextUtils.TruncateAt.END
+            } else {
+                null
+            }
 
-        val firstLayout = constructTextLayout(
-            alignment = alignment,
-            justificationMode = justificationMode,
-            ellipsize = ellipsize,
-            maxLines = maxLines,
-            hyphens = hyphens,
-            breakStrategy = breakStrategy,
-            lineBreakStyle = lineBreakStyle,
-            lineBreakWordStyle = lineBreakWordStyle
-        )
+        val firstLayout =
+            constructTextLayout(
+                alignment = alignment,
+                justificationMode = justificationMode,
+                ellipsize = ellipsize,
+                maxLines = maxLines,
+                hyphens = hyphens,
+                breakStrategy = breakStrategy,
+                lineBreakStyle = lineBreakStyle,
+                lineBreakWordStyle = lineBreakWordStyle
+            )
 
         // Ellipsize if there's not enough vertical space to fit all lines
         if (ellipsis && firstLayout.height > constraints.maxHeight && maxLines > 1) {
             val calculatedMaxLines =
                 firstLayout.numberOfLinesThatFitMaxHeight(constraints.maxHeight)
-            layout = if (calculatedMaxLines >= 0 && calculatedMaxLines != maxLines) {
-                constructTextLayout(
-                    alignment = alignment,
-                    justificationMode = justificationMode,
-                    ellipsize = ellipsize,
-                    // When we can't fully fit even a single line, measure with one line anyway.
-                    // This will allow to have an ellipsis on that single line. If we measured with
-                    // 0 maxLines, it would measure all lines with no ellipsis even though the first
-                    // line might be partially visible
-                    maxLines = calculatedMaxLines.coerceAtLeast(1),
-                    hyphens = hyphens,
-                    breakStrategy = breakStrategy,
-                    lineBreakStyle = lineBreakStyle,
-                    lineBreakWordStyle = lineBreakWordStyle
-                )
-            } else {
-                firstLayout
-            }
+            layout =
+                if (calculatedMaxLines >= 0 && calculatedMaxLines != maxLines) {
+                    constructTextLayout(
+                        alignment = alignment,
+                        justificationMode = justificationMode,
+                        ellipsize = ellipsize,
+                        // When we can't fully fit even a single line, measure with one line anyway.
+                        // This will allow to have an ellipsis on that single line. If we measured
+                        // with
+                        // 0 maxLines, it would measure all lines with no ellipsis even though the
+                        // first
+                        // line might be partially visible
+                        maxLines = calculatedMaxLines.coerceAtLeast(1),
+                        hyphens = hyphens,
+                        breakStrategy = breakStrategy,
+                        lineBreakStyle = lineBreakStyle,
+                        lineBreakWordStyle = lineBreakWordStyle
+                    )
+                } else {
+                    firstLayout
+                }
         } else {
             layout = firstLayout
         }
@@ -258,8 +264,9 @@
                 // truncated due to maxLines limitation. It will return the index of last line.
                 val line = layout.getLineForOffset(start)
                 val exceedsMaxLines = line >= maxLines
-                val isPlaceholderSpanEllipsized = layout.getLineEllipsisCount(line) > 0 &&
-                    end > layout.getLineEllipsisOffset(line)
+                val isPlaceholderSpanEllipsized =
+                    layout.getLineEllipsisCount(line) > 0 &&
+                        end > layout.getLineEllipsisOffset(line)
                 val isPlaceholderSpanTruncated = end > layout.getLineEnd(line)
                 // This Placeholder is ellipsized or truncated, return null instead.
                 if (isPlaceholderSpanEllipsized || isPlaceholderSpanTruncated || exceedsMaxLines) {
@@ -268,33 +275,34 @@
 
                 val direction = getBidiRunDirection(start)
 
-                val left = when (direction) {
-                    ResolvedTextDirection.Ltr ->
-                        getHorizontalPosition(start, true)
-                    ResolvedTextDirection.Rtl ->
-                        getHorizontalPosition(start, true) - span.widthPx
-                }
+                val left =
+                    when (direction) {
+                        ResolvedTextDirection.Ltr -> getHorizontalPosition(start, true)
+                        ResolvedTextDirection.Rtl ->
+                            getHorizontalPosition(start, true) - span.widthPx
+                    }
                 val right = left + span.widthPx
 
-                val top = with(layout) {
-                    when (span.verticalAlign) {
-                        PlaceholderSpan.ALIGN_ABOVE_BASELINE ->
-                            getLineBaseline(line) - span.heightPx
-                        PlaceholderSpan.ALIGN_TOP -> getLineTop(line)
-                        PlaceholderSpan.ALIGN_BOTTOM -> getLineBottom(line) - span.heightPx
-                        PlaceholderSpan.ALIGN_CENTER ->
-                            (getLineTop(line) + getLineBottom(line) - span.heightPx) / 2
-                        PlaceholderSpan.ALIGN_TEXT_TOP ->
-                            span.fontMetrics.ascent + getLineBaseline(line)
-                        PlaceholderSpan.ALIGN_TEXT_BOTTOM ->
-                            span.fontMetrics.descent + getLineBaseline(line) - span.heightPx
-                        PlaceholderSpan.ALIGN_TEXT_CENTER ->
-                            with(span.fontMetrics) {
-                                (ascent + descent - span.heightPx) / 2 + getLineBaseline(line)
-                            }
-                        else -> throw IllegalStateException("unexpected verticalAlignment")
+                val top =
+                    with(layout) {
+                        when (span.verticalAlign) {
+                            PlaceholderSpan.ALIGN_ABOVE_BASELINE ->
+                                getLineBaseline(line) - span.heightPx
+                            PlaceholderSpan.ALIGN_TOP -> getLineTop(line)
+                            PlaceholderSpan.ALIGN_BOTTOM -> getLineBottom(line) - span.heightPx
+                            PlaceholderSpan.ALIGN_CENTER ->
+                                (getLineTop(line) + getLineBottom(line) - span.heightPx) / 2
+                            PlaceholderSpan.ALIGN_TEXT_TOP ->
+                                span.fontMetrics.ascent + getLineBaseline(line)
+                            PlaceholderSpan.ALIGN_TEXT_BOTTOM ->
+                                span.fontMetrics.descent + getLineBaseline(line) - span.heightPx
+                            PlaceholderSpan.ALIGN_TEXT_CENTER ->
+                                with(span.fontMetrics) {
+                                    (ascent + descent - span.heightPx) / 2 + getLineBaseline(line)
+                                }
+                            else -> throw IllegalStateException("unexpected verticalAlignment")
+                        }
                     }
-                }
 
                 val bottom = top + span.heightPx
 
@@ -320,13 +328,17 @@
         granularity: TextGranularity,
         inclusionStrategy: TextInclusionStrategy
     ): TextRange {
-        val range = layout.getRangeForRect(
-            rect = rect.toAndroidRectF(),
-            granularity = granularity.toLayoutTextGranularity(),
-            inclusionStrategy = { segmentBounds: RectF, area: RectF ->
-                inclusionStrategy.isIncluded(segmentBounds.toComposeRect(), area.toComposeRect())
-            }
-        ) ?: return TextRange.Zero
+        val range =
+            layout.getRangeForRect(
+                rect = rect.toAndroidRectF(),
+                granularity = granularity.toLayoutTextGranularity(),
+                inclusionStrategy = { segmentBounds: RectF, area: RectF ->
+                    inclusionStrategy.isIncluded(
+                        segmentBounds.toComposeRect(),
+                        area.toComposeRect()
+                    )
+                }
+            ) ?: return TextRange.Zero
         return TextRange(range[0], range[1])
     }
 
@@ -363,9 +375,9 @@
      *
      * @param range the [TextRange] representing the start and end indices in the [Paragraph].
      * @param array the array to fill in the values. The array divided into segments of four where
-     * each index in that segment represents left, top, right, bottom of the character.
+     *   each index in that segment represents left, top, right, bottom of the character.
      * @param arrayStart the inclusive start index in the array where the function will start
-     * filling in the values from
+     *   filling in the values from
      */
     override fun fillBoundingBoxes(
         range: TextRange,
@@ -394,12 +406,7 @@
 
         // The width of the cursor is not taken into account. The callers of this API should use
         // rect.left to get the start X position and then adjust it according to the width if needed
-        return Rect(
-            horizontal,
-            layout.getLineTop(line),
-            horizontal,
-            layout.getLineBottom(line)
-        )
+        return Rect(horizontal, layout.getLineTop(line), horizontal, layout.getLineBottom(line))
     }
 
     override fun getWordBoundary(offset: Int): TextRange {
@@ -452,18 +459,14 @@
     }
 
     override fun getBidiRunDirection(offset: Int): ResolvedTextDirection {
-        return if (layout.isRtlCharAt(offset))
-            ResolvedTextDirection.Rtl
-        else
-            ResolvedTextDirection.Ltr
+        return if (layout.isRtlCharAt(offset)) ResolvedTextDirection.Rtl
+        else ResolvedTextDirection.Ltr
     }
 
     private fun TextLayout.getShaderBrushSpans(): Array<ShaderBrushSpan>? {
         if (text !is Spanned) return null
         if (!(text as Spanned).hasSpan(ShaderBrushSpan::class.java)) return null
-        val brushSpans = (text as Spanned).getSpans(
-            0, text.length, ShaderBrushSpan::class.java
-        )
+        val brushSpans = (text as Spanned).getSpans(0, text.length, ShaderBrushSpan::class.java)
         return brushSpans
     }
 
@@ -573,37 +576,39 @@
         )
 }
 
-/**
- * Converts [TextAlign] into [TextLayout] alignment constants.
- */
+/** Converts [TextAlign] into [TextLayout] alignment constants. */
 @OptIn(InternalPlatformTextApi::class)
-private fun toLayoutAlign(align: TextAlign): Int = when (align) {
-    TextAlign.Left -> ALIGN_LEFT
-    TextAlign.Right -> ALIGN_RIGHT
-    TextAlign.Center -> ALIGN_CENTER
-    TextAlign.Start -> ALIGN_NORMAL
-    TextAlign.End -> ALIGN_OPPOSITE
-    else -> DEFAULT_ALIGNMENT
-}
-
-@OptIn(InternalPlatformTextApi::class)
-private fun toLayoutHyphenationFrequency(hyphens: Hyphens): Int = when (hyphens) {
-    Hyphens.Auto -> if (Build.VERSION.SDK_INT <= 32) {
-        HYPHENATION_FREQUENCY_FULL
-    } else {
-        HYPHENATION_FREQUENCY_FULL_FAST
+private fun toLayoutAlign(align: TextAlign): Int =
+    when (align) {
+        TextAlign.Left -> ALIGN_LEFT
+        TextAlign.Right -> ALIGN_RIGHT
+        TextAlign.Center -> ALIGN_CENTER
+        TextAlign.Start -> ALIGN_NORMAL
+        TextAlign.End -> ALIGN_OPPOSITE
+        else -> DEFAULT_ALIGNMENT
     }
-    Hyphens.None -> HYPHENATION_FREQUENCY_NONE
-    else -> DEFAULT_HYPHENATION_FREQUENCY
-}
 
 @OptIn(InternalPlatformTextApi::class)
-private fun toLayoutBreakStrategy(breakStrategy: LineBreak.Strategy): Int = when (breakStrategy) {
-    LineBreak.Strategy.Simple -> BREAK_STRATEGY_SIMPLE
-    LineBreak.Strategy.HighQuality -> BREAK_STRATEGY_HIGH_QUALITY
-    LineBreak.Strategy.Balanced -> BREAK_STRATEGY_BALANCED
-    else -> DEFAULT_BREAK_STRATEGY
-}
+private fun toLayoutHyphenationFrequency(hyphens: Hyphens): Int =
+    when (hyphens) {
+        Hyphens.Auto ->
+            if (Build.VERSION.SDK_INT <= 32) {
+                HYPHENATION_FREQUENCY_FULL
+            } else {
+                HYPHENATION_FREQUENCY_FULL_FAST
+            }
+        Hyphens.None -> HYPHENATION_FREQUENCY_NONE
+        else -> DEFAULT_HYPHENATION_FREQUENCY
+    }
+
+@OptIn(InternalPlatformTextApi::class)
+private fun toLayoutBreakStrategy(breakStrategy: LineBreak.Strategy): Int =
+    when (breakStrategy) {
+        LineBreak.Strategy.Simple -> BREAK_STRATEGY_SIMPLE
+        LineBreak.Strategy.HighQuality -> BREAK_STRATEGY_HIGH_QUALITY
+        LineBreak.Strategy.Balanced -> BREAK_STRATEGY_BALANCED
+        else -> DEFAULT_BREAK_STRATEGY
+    }
 
 @OptIn(InternalPlatformTextApi::class)
 private fun toLayoutLineBreakStyle(lineBreakStrictness: LineBreak.Strictness): Int =
@@ -633,8 +638,10 @@
 
 private fun shouldAttachIndentationFixSpan(textStyle: TextStyle, ellipsis: Boolean) =
     with(textStyle) {
-        ellipsis && (letterSpacing != 0.sp && letterSpacing != TextUnit.Unspecified) &&
-            (textAlign != TextAlign.Unspecified && textAlign != TextAlign.Start &&
+        ellipsis &&
+            (letterSpacing != 0.sp && letterSpacing != TextUnit.Unspecified) &&
+            (textAlign != TextAlign.Unspecified &&
+                textAlign != TextAlign.Start &&
                 textAlign != TextAlign.Justify)
     }
 
diff --git a/compose/ui/ui-text/src/androidMain/kotlin/androidx/compose/ui/text/AndroidTextStyle.android.kt b/compose/ui/ui-text/src/androidMain/kotlin/androidx/compose/ui/text/AndroidTextStyle.android.kt
index 67f0518..2141e42 100644
--- a/compose/ui/ui-text/src/androidMain/kotlin/androidx/compose/ui/text/AndroidTextStyle.android.kt
+++ b/compose/ui/ui-text/src/androidMain/kotlin/androidx/compose/ui/text/AndroidTextStyle.android.kt
@@ -18,18 +18,12 @@
 
 internal const val DefaultIncludeFontPadding = false
 
-/**
- * Provides Android specific [TextStyle] configuration options for styling and compatibility.
- */
+/** Provides Android specific [TextStyle] configuration options for styling and compatibility. */
 actual class PlatformTextStyle {
-    /**
-     * Android specific text span styling and compatibility configuration.
-     */
+    /** Android specific text span styling and compatibility configuration. */
     actual val spanStyle: PlatformSpanStyle?
 
-    /**
-     * Android specific paragraph styling and compatibility configuration.
-     */
+    /** Android specific paragraph styling and compatibility configuration. */
     actual val paragraphStyle: PlatformParagraphStyle?
 
     /**
@@ -38,16 +32,14 @@
      * @param spanStyle platform specific span styling
      * @param paragraphStyle platform specific paragraph styling
      */
-    constructor(
-        spanStyle: PlatformSpanStyle?,
-        paragraphStyle: PlatformParagraphStyle?
-    ) {
+    constructor(spanStyle: PlatformSpanStyle?, paragraphStyle: PlatformParagraphStyle?) {
         this.spanStyle = spanStyle
         this.paragraphStyle = paragraphStyle
     }
 
     /**
-     * Enables turning on and off for Android [includeFontPadding](https://developer.android.com/reference/android/text/StaticLayout.Builder#setIncludePad(boolean)).
+     * Enables turning on and off for Android
+     * [includeFontPadding](https://developer.android.com/reference/android/text/StaticLayout.Builder#setIncludePad(boolean)).
      *
      * includeFontPadding was added to Android in order to prevent clipping issues on tall scripts.
      * However that issue has been fixed since Android 28. Jetpack Compose backports the fix for
@@ -75,10 +67,7 @@
      */
     constructor(
         emojiSupportMatch: EmojiSupportMatch
-    ) : this(
-        paragraphStyle = PlatformParagraphStyle(emojiSupportMatch),
-        spanStyle = null
-    )
+    ) : this(paragraphStyle = PlatformParagraphStyle(emojiSupportMatch), spanStyle = null)
 
     override fun hashCode(): Int {
         var result = spanStyle?.hashCode() ?: 0
@@ -98,7 +87,7 @@
         return "PlatformTextStyle(" +
             "spanStyle=$spanStyle, " +
             "paragraphSyle=$paragraphStyle" +
-        ")"
+            ")"
     }
 }
 
@@ -114,21 +103,21 @@
  */
 actual class PlatformParagraphStyle {
     actual companion object {
-        actual val Default: PlatformParagraphStyle =
-            PlatformParagraphStyle()
+        actual val Default: PlatformParagraphStyle = PlatformParagraphStyle()
     }
 
     /**
      * Include extra space beyond font ascent and descent.
      *
-     * Enables turning on and off for Android [includeFontPadding](https://developer.android.com/reference/android/text/StaticLayout.Builder#setIncludePad(boolean)).
+     * Enables turning on and off for Android
+     * [includeFontPadding](https://developer.android.com/reference/android/text/StaticLayout.Builder#setIncludePad(boolean)).
      *
      * includeFontPadding was added to Android in order to prevent clipping issues on tall scripts.
      * However that issue has been fixed since Android 28. Jetpack Compose backports the fix for
      * Android versions prior to Android 28. Therefore the original reason why includeFontPadding
      * was needed in invalid on Compose.
      *
-     * This configuration was added for migration of the apps in case some code or design  was
+     * This configuration was added for migration of the apps in case some code or design was
      * relying includeFontPadding=true behavior.
      */
     @Suppress("GetterSetterNames")
@@ -176,13 +165,12 @@
         this.emojiSupportMatch = emojiSupportMatch
     }
 
-    /**
-     * Default platform paragraph style
-     */
-    constructor() : this(
-        includeFontPadding = DefaultIncludeFontPadding,
-        emojiSupportMatch = EmojiSupportMatch.Default
-    )
+    /** Default platform paragraph style */
+    constructor() :
+        this(
+            includeFontPadding = DefaultIncludeFontPadding,
+            emojiSupportMatch = EmojiSupportMatch.Default
+        )
 
     override fun equals(other: Any?): Boolean {
         if (this === other) return true
@@ -202,7 +190,7 @@
         return "PlatformParagraphStyle(" +
             "includeFontPadding=$includeFontPadding, " +
             "emojiSupportMatch=$emojiSupportMatch" +
-        ")"
+            ")"
     }
 
     actual fun merge(other: PlatformParagraphStyle?): PlatformParagraphStyle {
@@ -212,9 +200,7 @@
     }
 }
 
-/**
- * Provides Android specific [SpanStyle] configuration options for styling and compatibility.
- */
+/** Provides Android specific [SpanStyle] configuration options for styling and compatibility. */
 actual class PlatformSpanStyle {
     actual companion object {
         actual val Default: PlatformSpanStyle = PlatformSpanStyle()
@@ -245,13 +231,12 @@
  *
  * This will not work well if the styles don't set the same fields.
  *
- * The [fraction] argument represents position on the timeline, with 0.0 meaning
- * that the interpolation has not started, returning [start] (or something
- * equivalent to [start]), 1.0 meaning that the interpolation has finished,
- * returning [stop] (or something equivalent to [stop]), and values in between
- * meaning that the interpolation is at the relevant point on the timeline
- * between [start] and [stop]. The interpolation can be extrapolated beyond 0.0 and
- * 1.0, so negative values and values greater than 1.0 are valid.
+ * The [fraction] argument represents position on the timeline, with 0.0 meaning that the
+ * interpolation has not started, returning [start] (or something equivalent to [start]), 1.0
+ * meaning that the interpolation has finished, returning [stop] (or something equivalent to
+ * [stop]), and values in between meaning that the interpolation is at the relevant point on the
+ * timeline between [start] and [stop]. The interpolation can be extrapolated beyond 0.0 and 1.0, so
+ * negative values and values greater than 1.0 are valid.
  */
 actual fun lerp(
     start: PlatformParagraphStyle,
@@ -261,16 +246,9 @@
     if (start.includeFontPadding == stop.includeFontPadding) return start
 
     return PlatformParagraphStyle(
-        emojiSupportMatch = lerpDiscrete(
-            start.emojiSupportMatch,
-            stop.emojiSupportMatch,
-            fraction
-        ),
-        includeFontPadding = lerpDiscrete(
-            start.includeFontPadding,
-            stop.includeFontPadding,
-            fraction
-        )
+        emojiSupportMatch = lerpDiscrete(start.emojiSupportMatch, stop.emojiSupportMatch, fraction),
+        includeFontPadding =
+            lerpDiscrete(start.includeFontPadding, stop.includeFontPadding, fraction)
     )
 }
 
@@ -279,13 +257,12 @@
  *
  * This will not work well if the styles don't set the same fields.
  *
- * The [fraction] argument represents position on the timeline, with 0.0 meaning
- * that the interpolation has not started, returning [start] (or something
- * equivalent to [start]), 1.0 meaning that the interpolation has finished,
- * returning [stop] (or something equivalent to [stop]), and values in between
- * meaning that the interpolation is at the relevant point on the timeline
- * between [start] and [stop]. The interpolation can be extrapolated beyond 0.0 and
- * 1.0, so negative values and values greater than 1.0 are valid.
+ * The [fraction] argument represents position on the timeline, with 0.0 meaning that the
+ * interpolation has not started, returning [start] (or something equivalent to [start]), 1.0
+ * meaning that the interpolation has finished, returning [stop] (or something equivalent to
+ * [stop]), and values in between meaning that the interpolation is at the relevant point on the
+ * timeline between [start] and [stop]. The interpolation can be extrapolated beyond 0.0 and 1.0, so
+ * negative values and values greater than 1.0 are valid.
  */
 actual fun lerp(
     start: PlatformSpanStyle,
diff --git a/compose/ui/ui-text/src/androidMain/kotlin/androidx/compose/ui/text/EmojiSupportMatch.android.kt b/compose/ui/ui-text/src/androidMain/kotlin/androidx/compose/ui/text/EmojiSupportMatch.android.kt
index 515dc7f..bc99da4 100644
--- a/compose/ui/ui-text/src/androidMain/kotlin/androidx/compose/ui/text/EmojiSupportMatch.android.kt
+++ b/compose/ui/ui-text/src/androidMain/kotlin/androidx/compose/ui/text/EmojiSupportMatch.android.kt
@@ -37,19 +37,13 @@
 
     companion object {
 
-        /**
-         * Default support strategy defers to EmojiCompat.get()
-         */
+        /** Default support strategy defers to EmojiCompat.get() */
         val Default = EmojiSupportMatch(0)
 
-        /**
-         * Do not use support emoji for this paragraph.
-         */
+        /** Do not use support emoji for this paragraph. */
         val None = EmojiSupportMatch(1)
 
-        /**
-         * Attempt to replace all emoji, even if they're available on this device's fonts.
-         */
+        /** Attempt to replace all emoji, even if they're available on this device's fonts. */
         val All = EmojiSupportMatch(2)
     }
 }
diff --git a/compose/ui/ui-text/src/androidMain/kotlin/androidx/compose/ui/text/Html.android.kt b/compose/ui/ui-text/src/androidMain/kotlin/androidx/compose/ui/text/Html.android.kt
index 484018b..b46b704 100644
--- a/compose/ui/ui-text/src/androidMain/kotlin/androidx/compose/ui/text/Html.android.kt
+++ b/compose/ui/ui-text/src/androidMain/kotlin/androidx/compose/ui/text/Html.android.kt
@@ -57,12 +57,8 @@
 ): AnnotatedString {
     // Check ContentHandlerReplacementTag kdoc for more details
     val stringToParse = "<$ContentHandlerReplacementTag />$htmlString"
-    val spanned = HtmlCompat.fromHtml(
-        stringToParse,
-        HtmlCompat.FROM_HTML_MODE_COMPACT,
-        null,
-        TagHandler
-    )
+    val spanned =
+        HtmlCompat.fromHtml(stringToParse, HtmlCompat.FROM_HTML_MODE_COMPACT, null, TagHandler)
     return spanned.toAnnotatedString(linkStyles, linkInteractionListener)
 }
 
@@ -73,11 +69,7 @@
 ): AnnotatedString {
     return AnnotatedString.Builder(capacity = length)
         .append(this)
-        .also { it.addSpans(
-            this,
-            linkStyles,
-            linkInteractionListener
-        ) }
+        .also { it.addSpans(this, linkStyles, linkInteractionListener) }
         .toAnnotatedString()
 }
 
@@ -88,13 +80,7 @@
 ) {
     spanned.getSpans(0, length, Any::class.java).forEach { span ->
         val range = TextRange(spanned.getSpanStart(span), spanned.getSpanEnd(span))
-        addSpan(
-            span,
-            range.start,
-            range.end,
-            linkStyles,
-            linkInteractionListener
-        )
+        addSpan(span, range.start, range.end, linkStyles, linkInteractionListener)
     }
 }
 
@@ -144,11 +130,7 @@
         }
         is URLSpan -> {
             span.url?.let { url ->
-                val link = LinkAnnotation.Url(
-                    url,
-                    linkStyles,
-                    linkInteractionListener
-                )
+                val link = LinkAnnotation.Url(url, linkStyles, linkInteractionListener)
                 addLink(link, start, end)
             }
         }
@@ -156,19 +138,21 @@
 }
 
 private fun AlignmentSpan.toParagraphStyle(): ParagraphStyle {
-    val alignment = when (this.alignment) {
-        Layout.Alignment.ALIGN_NORMAL -> TextAlign.Start
-        Layout.Alignment.ALIGN_CENTER -> TextAlign.Center
-        Layout.Alignment.ALIGN_OPPOSITE -> TextAlign.End
-        else -> TextAlign.Unspecified
-    }
+    val alignment =
+        when (this.alignment) {
+            Layout.Alignment.ALIGN_NORMAL -> TextAlign.Start
+            Layout.Alignment.ALIGN_CENTER -> TextAlign.Center
+            Layout.Alignment.ALIGN_OPPOSITE -> TextAlign.End
+            else -> TextAlign.Unspecified
+        }
     return ParagraphStyle(textAlign = alignment)
 }
 
 private fun StyleSpan.toSpanStyle(): SpanStyle? {
-    /** StyleSpan doc: styles are cumulative -- if both bold and italic are set in
-     * separate spans, or if the base style is bold and a span calls for italic,
-     * you get bold italic.  You can't turn off a style from the base style.
+    /**
+     * StyleSpan doc: styles are cumulative -- if both bold and italic are set in separate spans, or
+     * if the base style is bold and a span calls for italic, you get bold italic. You can't turn
+     * off a style from the base style.
      */
     return when (style) {
         Typeface.BOLD -> {
@@ -185,42 +169,50 @@
 }
 
 private fun TypefaceSpan.toSpanStyle(): SpanStyle {
-    val fontFamily = when (family) {
-        FontFamily.Cursive.name -> FontFamily.Cursive
-        FontFamily.Monospace.name -> FontFamily.Monospace
-        FontFamily.SansSerif.name -> FontFamily.SansSerif
-        FontFamily.Serif.name -> FontFamily.Serif
-        else -> { optionalFontFamilyFromName(family) }
-    }
+    val fontFamily =
+        when (family) {
+            FontFamily.Cursive.name -> FontFamily.Cursive
+            FontFamily.Monospace.name -> FontFamily.Monospace
+            FontFamily.SansSerif.name -> FontFamily.SansSerif
+            FontFamily.Serif.name -> FontFamily.Serif
+            else -> {
+                optionalFontFamilyFromName(family)
+            }
+        }
     return SpanStyle(fontFamily = fontFamily)
 }
 
 /**
  * Mirrors [androidx.compose.ui.text.font.PlatformTypefaces.optionalOnDeviceFontFamilyByName]
- * behavior with both font weight and font style being Normal in this case */
+ * behavior with both font weight and font style being Normal in this case
+ */
 private fun optionalFontFamilyFromName(familyName: String?): FontFamily? {
     if (familyName.isNullOrEmpty()) return null
     val typeface = Typeface.create(familyName, Typeface.NORMAL)
-    return typeface.takeIf { typeface != Typeface.DEFAULT &&
-        typeface != Typeface.create(Typeface.DEFAULT, Typeface.NORMAL)
-    }?.let { FontFamily(it) }
+    return typeface
+        .takeIf {
+            typeface != Typeface.DEFAULT &&
+                typeface != Typeface.create(Typeface.DEFAULT, Typeface.NORMAL)
+        }
+        ?.let { FontFamily(it) }
 }
 
-private val TagHandler = object : TagHandler {
-    override fun handleTag(
-        opening: Boolean,
-        tag: String?,
-        output: Editable?,
-        xmlReader: XMLReader?
-    ) {
-        if (xmlReader == null || output == null) return
+private val TagHandler =
+    object : TagHandler {
+        override fun handleTag(
+            opening: Boolean,
+            tag: String?,
+            output: Editable?,
+            xmlReader: XMLReader?
+        ) {
+            if (xmlReader == null || output == null) return
 
-        if (opening && tag == ContentHandlerReplacementTag) {
-            val currentContentHandler = xmlReader.contentHandler
-            xmlReader.contentHandler = AnnotationContentHandler(currentContentHandler, output)
+            if (opening && tag == ContentHandlerReplacementTag) {
+                val currentContentHandler = xmlReader.contentHandler
+                xmlReader.contentHandler = AnnotationContentHandler(currentContentHandler, output)
+            }
         }
     }
-}
 
 private class AnnotationContentHandler(
     private val contentHandler: ContentHandler,
@@ -261,7 +253,8 @@
     private fun handleAnnotationEnd() {
         // iterate through all of the spans that we added when handling the opening tag. Calculate
         // the true position of the span and make a replacement
-        output.getSpans(0, output.length, AnnotationSpan::class.java)
+        output
+            .getSpans(0, output.length, AnnotationSpan::class.java)
             .filter { output.getSpanFlags(it) == SPAN_MARK_MARK }
             .fastForEach { annotation ->
                 val start = output.getSpanStart(annotation)
@@ -279,13 +272,13 @@
 private class AnnotationSpan(val key: String, val value: String)
 
 /**
- * This tag is added at the beginning of a string fed to the HTML parser in order to trigger
- * a TagHandler's callback early on so we can replace the ContentHandler with our
- * own [AnnotationContentHandler]. This is needed to handle the opening <annotation> tags since by
- * the time TagHandler is triggered, the parser already visited and left the opening <annotation>
- * tag which contains the attributes. Note that closing tag doesn't have the attributes and
- * therefore not enough to construct the intermediate [AnnotationSpan] object that is later
- * transformed into [AnnotatedString]'s string annotation.
+ * This tag is added at the beginning of a string fed to the HTML parser in order to trigger a
+ * TagHandler's callback early on so we can replace the ContentHandler with our own
+ * [AnnotationContentHandler]. This is needed to handle the opening <annotation> tags since by the
+ * time TagHandler is triggered, the parser already visited and left the opening <annotation> tag
+ * which contains the attributes. Note that closing tag doesn't have the attributes and therefore
+ * not enough to construct the intermediate [AnnotationSpan] object that is later transformed into
+ * [AnnotatedString]'s string annotation.
  */
 private const val ContentHandlerReplacementTag = "ContentHandlerReplacementTag"
 private const val AnnotationTag = "annotation"
diff --git a/compose/ui/ui-text/src/androidMain/kotlin/androidx/compose/ui/text/Paragraph.android.kt b/compose/ui/ui-text/src/androidMain/kotlin/androidx/compose/ui/text/Paragraph.android.kt
index a2dc0ef..c0cdaa7 100644
--- a/compose/ui/ui-text/src/androidMain/kotlin/androidx/compose/ui/text/Paragraph.android.kt
+++ b/compose/ui/ui-text/src/androidMain/kotlin/androidx/compose/ui/text/Paragraph.android.kt
@@ -40,37 +40,61 @@
     actual val didExceedMaxLines: Boolean
     actual val lineCount: Int
     actual val placeholderRects: List<Rect?>
+
     actual fun getPathForRange(start: Int, end: Int): Path
+
     actual fun getCursorRect(offset: Int): Rect
+
     actual fun getLineLeft(lineIndex: Int): Float
+
     actual fun getLineRight(lineIndex: Int): Float
+
     actual fun getLineTop(lineIndex: Int): Float
+
     actual fun getLineBaseline(lineIndex: Int): Float
+
     actual fun getLineBottom(lineIndex: Int): Float
+
     actual fun getLineHeight(lineIndex: Int): Float
+
     actual fun getLineWidth(lineIndex: Int): Float
+
     actual fun getLineStart(lineIndex: Int): Int
+
     actual fun getLineEnd(lineIndex: Int, visibleEnd: Boolean): Int
+
     actual fun isLineEllipsized(lineIndex: Int): Boolean
+
     actual fun getLineForOffset(offset: Int): Int
+
     actual fun getHorizontalPosition(offset: Int, usePrimaryDirection: Boolean): Float
+
     actual fun getParagraphDirection(offset: Int): ResolvedTextDirection
+
     actual fun getBidiRunDirection(offset: Int): ResolvedTextDirection
+
     actual fun getLineForVerticalPosition(vertical: Float): Int
+
     actual fun getOffsetForPosition(position: Offset): Int
+
     actual fun getRangeForRect(
         rect: Rect,
         granularity: TextGranularity,
         inclusionStrategy: TextInclusionStrategy
     ): TextRange
+
     actual fun getBoundingBox(offset: Int): Rect
+
     actual fun fillBoundingBoxes(
         range: TextRange,
         array: FloatArray,
         @IntRange(from = 0) arrayStart: Int
     )
+
     actual fun getWordBoundary(offset: Int): TextRange
+
     actual fun paint(canvas: Canvas, color: Color, shadow: Shadow?, textDecoration: TextDecoration?)
+
     actual fun paint(
         canvas: Canvas,
         color: Color,
@@ -79,6 +103,7 @@
         drawStyle: DrawStyle?,
         blendMode: BlendMode
     )
+
     actual fun paint(
         canvas: Canvas,
         brush: Brush,
diff --git a/compose/ui/ui-text/src/androidMain/kotlin/androidx/compose/ui/text/font/AndroidFont.android.kt b/compose/ui/ui-text/src/androidMain/kotlin/androidx/compose/ui/text/font/AndroidFont.android.kt
index 9225c07..ca3e5ec 100644
--- a/compose/ui/ui-text/src/androidMain/kotlin/androidx/compose/ui/text/font/AndroidFont.android.kt
+++ b/compose/ui/ui-text/src/androidMain/kotlin/androidx/compose/ui/text/font/AndroidFont.android.kt
@@ -27,18 +27,18 @@
 import java.io.File
 
 /**
- * Create a Font declaration from a file in the assets directory. The content of the [File] is
- * read during construction.
+ * Create a Font declaration from a file in the assets directory. The content of the [File] is read
+ * during construction.
  *
  * @param path full path starting from the assets directory (i.e. dir/myfont.ttf for
- * assets/dir/myfont.ttf).
+ *   assets/dir/myfont.ttf).
  * @param assetManager Android AssetManager
- * @param weight The weight of the font. The system uses this to match a font to a font request
- * that is given in a [androidx.compose.ui.text.SpanStyle].
+ * @param weight The weight of the font. The system uses this to match a font to a font request that
+ *   is given in a [androidx.compose.ui.text.SpanStyle].
  * @param style The style of the font, normal or italic. The system uses this to match a font to a
- * font request that is given in a [androidx.compose.ui.text.SpanStyle].
+ *   font request that is given in a [androidx.compose.ui.text.SpanStyle].
  * @param variationSettings on API 26 and above these settings are applied to a variable font when
- * the font is loaded
+ *   the font is loaded
  */
 @Stable
 fun Font(
@@ -53,12 +53,12 @@
  * Create a Font declaration from a file. The content of the [File] is read during construction.
  *
  * @param file the font file.
- * @param weight The weight of the font. The system uses this to match a font to a font request
- * that is given in a [androidx.compose.ui.text.SpanStyle].
+ * @param weight The weight of the font. The system uses this to match a font to a font request that
+ *   is given in a [androidx.compose.ui.text.SpanStyle].
  * @param style The style of the font, normal or italic. The system uses this to match a font to a
- * font request that is given in a [androidx.compose.ui.text.SpanStyle].
+ *   font request that is given in a [androidx.compose.ui.text.SpanStyle].
  * @param variationSettings on API 26 and above these settings are applied to a variable font when
- * the font is loaded
+ *   the font is loaded
  */
 @Stable
 @Suppress("StreamFiles")
@@ -74,10 +74,10 @@
  * [ParcelFileDescriptor] is read during construction.
  *
  * @param fileDescriptor the file descriptor for the font file.
- * @param weight The weight of the font. The system uses this to match a font to a font request
- * that is given in a [androidx.compose.ui.text.SpanStyle].
+ * @param weight The weight of the font. The system uses this to match a font to a font request that
+ *   is given in a [androidx.compose.ui.text.SpanStyle].
  * @param style The style of the font, normal or italic. The system uses this to match a font to a
- * font request that is given in a [androidx.compose.ui.text.SpanStyle].
+ *   font request that is given in a [androidx.compose.ui.text.SpanStyle].
  * @param variationSettings these settings are applied to a variable font when the font is loaded
  */
 @RequiresApi(26)
@@ -97,36 +97,34 @@
  * Android for both blocking and async load.
  *
  * You may subclass this to add new types of font descriptions that may be used in
- * [FontListFontFamily]. For example, you can add a [FontLoadingStrategy.Blocking] font that
- * returns a Typeface from a local resource not supported by an existing [Font]. Or, you can create
- * an [FontLoadingStrategy.Async] font that loads a font file from your server.
+ * [FontListFontFamily]. For example, you can add a [FontLoadingStrategy.Blocking] font that returns
+ * a Typeface from a local resource not supported by an existing [Font]. Or, you can create an
+ * [FontLoadingStrategy.Async] font that loads a font file from your server.
  *
  * When introducing new font descriptors, it is recommended to follow the patterns of providing a
  * public Font constructor and a private implementation class:
- *
  * 1. Declare an internal or private subclass of AndroidFont
  * 2. Expose a public Font(...) constructor that returns your new type.
  *
  * Font constructors are
- *
  * 1. Regular functions named `Font` that return type `Font`
  * 2. The first argument is the font name, or similar object that describes the font uniquely
  * 3. If the font has a provider, loader, or similar argument, put it after the font name.
  * 4. The last two arguments are FontWeight and FontStyle.
  *
  * Examples of Font constructors:
- *
  * ```
  * fun Font("myIdentifier", MyFontLoader, FontWeight, FontStyle): Font
  * fun Font(CustomFontDescription(...), MyFontLoader, FontWeight, FontStyle): Font
  * fun Font(CustomFontDescription(...), FontWeight, FontStyle): Font
- *```
+ * ```
  *
  * @param loadingStrategy loadingStrategy this font will provide in fallback chains
  * @param typefaceLoader a loader that knows how to load this [AndroidFont], may be shared between
- * several fonts
+ *   several fonts
  */
-abstract class AndroidFont constructor(
+abstract class AndroidFont
+constructor(
     final override val loadingStrategy: FontLoadingStrategy,
     val typefaceLoader: TypefaceLoader,
     variationSettings: FontVariation.Settings,
@@ -134,9 +132,7 @@
 
     @Deprecated(
         "Replaced with fontVariation constructor",
-        ReplaceWith(
-            "AndroidFont(loadingStrategy, typefaceLoader, FontVariation.Settings())"
-        )
+        ReplaceWith("AndroidFont(loadingStrategy, typefaceLoader, FontVariation.Settings())")
     )
     constructor(
         loadingStrategy: FontLoadingStrategy,
@@ -168,9 +164,9 @@
      *
      * Examples of new types of fonts that [TypefaceLoader] can add:
      * - [FontLoadingStrategy.Blocking] [Font] that loads Typeface from a local resource not
-     * supported by an existing font
+     *   supported by an existing font
      * - [FontLoadingStrategy.OptionalLocal] [Font] that "loads" a platform Typeface only available
-     * on some devices.
+     *   on some devices.
      * - [FontLoadingStrategy.Async] [Font] that loads a font from a backend via a network request.
      *
      * During resolution from [FontFamily.Resolver], an [AndroidFont] subclass will be queried for
@@ -216,9 +212,9 @@
          * cancelled and considered a permanent failure. Implementations should use structured
          * concurrency to cooperatively cancel work.
          *
-         * Compose does not know what resources are required to satisfy a font load.
-         * Subclasses implementing [FontLoadingStrategy.Async] behavior should ensure requests are
-         * de-duped for the same resource.
+         * Compose does not know what resources are required to satisfy a font load. Subclasses
+         * implementing [FontLoadingStrategy.Async] behavior should ensure requests are de-duped for
+         * the same resource.
          *
          * It is possible for [awaitLoad] to be called for the same instance of [AndroidFont] in
          * parallel. Implementations should support parallel concurrent loads, or de-dup.
@@ -226,7 +222,6 @@
          * @param context current Android context for loading the font
          * @param font the font to load which contains this loader as [AndroidFont.typefaceLoader]
          * @return [android.graphics.Typeface] for loaded font, or null if not available
-         *
          */
         suspend fun awaitLoad(context: Context, font: AndroidFont): Typeface?
     }
diff --git a/compose/ui/ui-text/src/androidMain/kotlin/androidx/compose/ui/text/font/AndroidFontLoader.android.kt b/compose/ui/ui-text/src/androidMain/kotlin/androidx/compose/ui/text/font/AndroidFontLoader.android.kt
index 57d55a7..8fd5130 100644
--- a/compose/ui/ui-text/src/androidMain/kotlin/androidx/compose/ui/text/font/AndroidFontLoader.android.kt
+++ b/compose/ui/ui-text/src/androidMain/kotlin/androidx/compose/ui/text/font/AndroidFontLoader.android.kt
@@ -27,26 +27,24 @@
 import kotlin.runCatching
 import kotlinx.coroutines.suspendCancellableCoroutine
 
-/**
- * Android implementation for [Font.ResourceLoader]. It is designed to load only [ResourceFont].
- */
-internal class AndroidFontLoader(
-    context: Context
-) : PlatformFontLoader {
+/** Android implementation for [Font.ResourceLoader]. It is designed to load only [ResourceFont]. */
+internal class AndroidFontLoader(context: Context) : PlatformFontLoader {
     private val context = context.applicationContext
 
     @OptIn(ExperimentalTextApi::class)
     override fun loadBlocking(font: Font): Typeface? {
         return when (font) {
             is AndroidFont -> font.typefaceLoader.loadBlocking(context, font)
-            is ResourceFont -> when (font.loadingStrategy) {
-                Blocking -> font.load(context)
-                OptionalLocal -> runCatching { font.load(context) }.getOrNull()
-                Async -> throw UnsupportedOperationException("Unsupported Async font load path")
-                else -> throw IllegalArgumentException(
-                    "Unknown loading type ${font.loadingStrategy}"
-                )
-            }.setFontVariationSettings(font.variationSettings, context)
+            is ResourceFont ->
+                when (font.loadingStrategy) {
+                    Blocking -> font.load(context)
+                    OptionalLocal -> runCatching { font.load(context) }.getOrNull()
+                    Async -> throw UnsupportedOperationException("Unsupported Async font load path")
+                    else ->
+                        throw IllegalArgumentException(
+                            "Unknown loading type ${font.loadingStrategy}"
+                        )
+                }.setFontVariationSettings(font.variationSettings, context)
             else -> null
         }
     }
@@ -55,8 +53,8 @@
     override suspend fun awaitLoad(font: Font): Typeface? {
         return when (font) {
             is AndroidFont -> font.typefaceLoader.awaitLoad(context, font)
-            is ResourceFont -> font.loadAsync(context)
-                .setFontVariationSettings(font.variationSettings, context)
+            is ResourceFont ->
+                font.loadAsync(context).setFontVariationSettings(font.variationSettings, context)
             else -> throw IllegalArgumentException("Unknown font type: $font")
         }
     }
@@ -70,16 +68,23 @@
 // TODO(seanmcq): Move to core-ktx to dedup
 private suspend fun ResourceFont.loadAsync(context: Context): Typeface {
     return suspendCancellableCoroutine { continuation ->
-        ResourcesCompat.getFont(context, resId, object : ResourcesCompat.FontCallback() {
-            override fun onFontRetrieved(typeface: Typeface) {
-                continuation.resume(typeface)
-            }
+        ResourcesCompat.getFont(
+            context,
+            resId,
+            object : ResourcesCompat.FontCallback() {
+                override fun onFontRetrieved(typeface: Typeface) {
+                    continuation.resume(typeface)
+                }
 
-            override fun onFontRetrievalFailed(reason: Int) {
-                continuation.cancel(
-                    IllegalStateException("Unable to load font ${this@loadAsync} (reason=$reason)")
-                )
-            }
-        }, null)
+                override fun onFontRetrievalFailed(reason: Int) {
+                    continuation.cancel(
+                        IllegalStateException(
+                            "Unable to load font ${this@loadAsync} (reason=$reason)"
+                        )
+                    )
+                }
+            },
+            null
+        )
     }
 }
diff --git a/compose/ui/ui-text/src/androidMain/kotlin/androidx/compose/ui/text/font/AndroidFontResolveInterceptor.android.kt b/compose/ui/ui-text/src/androidMain/kotlin/androidx/compose/ui/text/font/AndroidFontResolveInterceptor.android.kt
index b56bf6c..4dfb192 100644
--- a/compose/ui/ui-text/src/androidMain/kotlin/androidx/compose/ui/text/font/AndroidFontResolveInterceptor.android.kt
+++ b/compose/ui/ui-text/src/androidMain/kotlin/androidx/compose/ui/text/font/AndroidFontResolveInterceptor.android.kt
@@ -25,37 +25,38 @@
 /**
  * Android implementation for [PlatformResolveInterceptor].
  *
- * Android system accessibility should be able to override any font metric that
- * affects how FontFamily is resolved. Font Size preference is handled by [Density.fontScale].
- * This interceptor currently adjusts the Font Weight for Bold Text feature.
+ * Android system accessibility should be able to override any font metric that affects how
+ * FontFamily is resolved. Font Size preference is handled by [Density.fontScale]. This interceptor
+ * currently adjusts the Font Weight for Bold Text feature.
  */
-internal data class AndroidFontResolveInterceptor(
-    private val fontWeightAdjustment: Int
-) : PlatformResolveInterceptor {
+internal data class AndroidFontResolveInterceptor(private val fontWeightAdjustment: Int) :
+    PlatformResolveInterceptor {
 
     override fun interceptFontWeight(fontWeight: FontWeight): FontWeight {
         // do not intercept if fontWeightAdjustment is not set or undefined
-        if (fontWeightAdjustment == 0 ||
-            fontWeightAdjustment == Configuration.FONT_WEIGHT_ADJUSTMENT_UNDEFINED) {
+        if (
+            fontWeightAdjustment == 0 ||
+                fontWeightAdjustment == Configuration.FONT_WEIGHT_ADJUSTMENT_UNDEFINED
+        ) {
             return fontWeight
         }
 
-        val finalFontWeight = (fontWeight.weight + fontWeightAdjustment).coerceIn(
-            FontStyle.FONT_WEIGHT_MIN,
-            FontStyle.FONT_WEIGHT_MAX
-        )
+        val finalFontWeight =
+            (fontWeight.weight + fontWeightAdjustment).coerceIn(
+                FontStyle.FONT_WEIGHT_MIN,
+                FontStyle.FONT_WEIGHT_MAX
+            )
         return FontWeight(finalFontWeight)
     }
 }
 
-/**
- * A helper function to create an interceptor using a context.
- */
+/** A helper function to create an interceptor using a context. */
 internal fun AndroidFontResolveInterceptor(context: Context): AndroidFontResolveInterceptor {
-    val fontWeightAdjustment = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) {
-        context.resources.configuration.fontWeightAdjustment
-    } else {
-        0
-    }
+    val fontWeightAdjustment =
+        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) {
+            context.resources.configuration.fontWeightAdjustment
+        } else {
+            0
+        }
     return AndroidFontResolveInterceptor(fontWeightAdjustment)
 }
diff --git a/compose/ui/ui-text/src/androidMain/kotlin/androidx/compose/ui/text/font/AndroidFontUtils.android.kt b/compose/ui/ui-text/src/androidMain/kotlin/androidx/compose/ui/text/font/AndroidFontUtils.android.kt
index 12a2f2f..bd5ad88 100644
--- a/compose/ui/ui-text/src/androidMain/kotlin/androidx/compose/ui/text/font/AndroidFontUtils.android.kt
+++ b/compose/ui/ui-text/src/androidMain/kotlin/androidx/compose/ui/text/font/AndroidFontUtils.android.kt
@@ -60,9 +60,9 @@
 }
 
 /**
- * This class is here to ensure that the classes that use this API will get verified and can be
- * AOT compiled. It is expected that this class will soft-fail verification, but the classes
- * which use this method will pass.
+ * This class is here to ensure that the classes that use this API will get verified and can be AOT
+ * compiled. It is expected that this class will soft-fail verification, but the classes which use
+ * this method will pass.
  */
 @RequiresApi(28)
 internal object TypefaceHelperMethodsApi28 {
diff --git a/compose/ui/ui-text/src/androidMain/kotlin/androidx/compose/ui/text/font/AndroidPreloadedFont.android.kt b/compose/ui/ui-text/src/androidMain/kotlin/androidx/compose/ui/text/font/AndroidPreloadedFont.android.kt
index 2dfc00b..44118eb 100644
--- a/compose/ui/ui-text/src/androidMain/kotlin/androidx/compose/ui/text/font/AndroidPreloadedFont.android.kt
+++ b/compose/ui/ui-text/src/androidMain/kotlin/androidx/compose/ui/text/font/AndroidPreloadedFont.android.kt
@@ -29,16 +29,19 @@
 import androidx.compose.ui.util.fastMap
 import java.io.File
 
-internal sealed class AndroidPreloadedFont constructor(
+internal sealed class AndroidPreloadedFont
+constructor(
     final override val weight: FontWeight,
     final override val style: FontStyle,
     variationSettings: FontVariation.Settings
-) : AndroidFont(
-    FontLoadingStrategy.Blocking,
-    AndroidPreloadedFontTypefaceLoader,
-    variationSettings
-) {
+) :
+    AndroidFont(
+        FontLoadingStrategy.Blocking,
+        AndroidPreloadedFontTypefaceLoader,
+        variationSettings
+    ) {
     abstract val cacheKey: String?
+
     internal abstract fun doLoad(context: Context?): Typeface?
 
     private var didInitWithContext: Boolean = false
@@ -64,7 +67,8 @@
 }
 
 @OptIn(ExperimentalTextApi::class) /* FontVariation.Settings */
-internal class AndroidAssetFont constructor(
+internal class AndroidAssetFont
+constructor(
     val assetManager: AssetManager,
     val path: String,
     weight: FontWeight = FontWeight.Normal,
@@ -108,7 +112,8 @@
 }
 
 @OptIn(ExperimentalTextApi::class)
-internal class AndroidFileFont constructor(
+internal class AndroidFileFont
+constructor(
     val file: File,
     weight: FontWeight = FontWeight.Normal,
     style: FontStyle = FontStyle.Normal,
@@ -128,6 +133,7 @@
     }
 
     override val cacheKey: String? = null
+
     override fun toString(): String {
         return "Font(file=$file, weight=$weight, style=$style)"
     }
@@ -135,7 +141,8 @@
 
 @RequiresApi(26)
 @OptIn(ExperimentalTextApi::class)
-internal class AndroidFileDescriptorFont constructor(
+internal class AndroidFileDescriptorFont
+constructor(
     val fileDescriptor: ParcelFileDescriptor,
     weight: FontWeight = FontWeight.Normal,
     style: FontStyle = FontStyle.Normal,
@@ -159,6 +166,7 @@
     }
 
     override val cacheKey: String? = null
+
     override fun toString(): String {
         return "Font(fileDescriptor=$fileDescriptor, weight=$weight, style=$style)"
     }
@@ -217,17 +225,20 @@
     private fun FontVariation.Settings.toVariationSettings(
         context: Context?
     ): Array<FontVariationAxis> {
-        val density = if (context != null) {
-            Density(context)
-        } else if (!needsDensity) {
-            // we don't need density, so make a fake one and be on with it
-            Density(1f, 1f)
-        } else {
-            // cannot reach
-            throw IllegalStateException("Required density, but not provided")
-        }
-        return settings.fastMap { setting ->
-            FontVariationAxis(setting.axisName, setting.toVariationValue(density))
-        }.toTypedArray()
+        val density =
+            if (context != null) {
+                Density(context)
+            } else if (!needsDensity) {
+                // we don't need density, so make a fake one and be on with it
+                Density(1f, 1f)
+            } else {
+                // cannot reach
+                throw IllegalStateException("Required density, but not provided")
+            }
+        return settings
+            .fastMap { setting ->
+                FontVariationAxis(setting.axisName, setting.toVariationValue(density))
+            }
+            .toTypedArray()
     }
 }
diff --git a/compose/ui/ui-text/src/androidMain/kotlin/androidx/compose/ui/text/font/AndroidTypeface.android.kt b/compose/ui/ui-text/src/androidMain/kotlin/androidx/compose/ui/text/font/AndroidTypeface.android.kt
index c06da8f..e9964ee 100644
--- a/compose/ui/ui-text/src/androidMain/kotlin/androidx/compose/ui/text/font/AndroidTypeface.android.kt
+++ b/compose/ui/ui-text/src/androidMain/kotlin/androidx/compose/ui/text/font/AndroidTypeface.android.kt
@@ -35,15 +35,15 @@
  *
  * @param context the context to be used for loading Typeface.
  * @param fontFamily the font family to be loaded
- * @param styles optional style filter for loading subset of fontFamily. null means load
- *                        all fonts in fontFamily.
+ * @param styles optional style filter for loading subset of fontFamily. null means load all fonts
+ *   in fontFamily.
  * @return [androidx.compose.ui.text.font.Typeface] instance
  */
-@Deprecated("This API is deprecated with the introduction of async fonts which cannot" +
-    " resolve in this context. To preload fonts, use FontFamily.Resolver.",
-    replaceWith = ReplaceWith(
-        "FontFamily.Resolver.preload(fontFamily, Font.AndroidResourceLoader(context))"
-    ),
+@Deprecated(
+    "This API is deprecated with the introduction of async fonts which cannot" +
+        " resolve in this context. To preload fonts, use FontFamily.Resolver.",
+    replaceWith =
+        ReplaceWith("FontFamily.Resolver.preload(fontFamily, Font.AndroidResourceLoader(context))"),
     level = DeprecationLevel.WARNING
 )
 fun Typeface(
diff --git a/compose/ui/ui-text/src/androidMain/kotlin/androidx/compose/ui/text/font/DelegatingFontLoaderForDeprecatedUsage.android.kt b/compose/ui/ui-text/src/androidMain/kotlin/androidx/compose/ui/text/font/DelegatingFontLoaderForDeprecatedUsage.android.kt
index 56914a1..9ea4cd8 100644
--- a/compose/ui/ui-text/src/androidMain/kotlin/androidx/compose/ui/text/font/DelegatingFontLoaderForDeprecatedUsage.android.kt
+++ b/compose/ui/ui-text/src/androidMain/kotlin/androidx/compose/ui/text/font/DelegatingFontLoaderForDeprecatedUsage.android.kt
@@ -22,7 +22,6 @@
  * Bridge between subclasses of Font.ResourceLoader and the new FontFamily.Resolver API.
  *
  * To use add as a CompositionLocal replacing the default FontFamily.Resolver:
- *
  * ```
  * LocalFontFamilyResolver provides createFontFamilyResolver(myFontResourceLoader, context)
  * ```
@@ -37,8 +36,9 @@
  * A FontFamily.Resolver created this way will not share caches with other FontFamily.Resolvers.
  */
 @Suppress("DEPRECATION")
-@Deprecated("This exists to bridge existing Font.ResourceLoader subclasses to be used as a" +
-    "FontFamily.ResourceLoader during upgrade.",
+@Deprecated(
+    "This exists to bridge existing Font.ResourceLoader subclasses to be used as a" +
+        "FontFamily.ResourceLoader during upgrade.",
     replaceWith = ReplaceWith("createFontFamilyResolver()"),
 )
 fun createFontFamilyResolver(
@@ -51,8 +51,8 @@
 }
 
 @Suppress("DEPRECATION")
-@Deprecated("This exists to bridge existing Font.ResourceLoader APIs, and should be " +
-    "removed with them",
+@Deprecated(
+    "This exists to bridge existing Font.ResourceLoader APIs, and should be " + "removed with them",
     replaceWith = ReplaceWith("createFontFamilyResolver()"),
 )
 internal actual fun createFontFamilyResolver(
@@ -70,9 +70,8 @@
  * [FontFamily.Resolver] using [createFontFamilyResolver] (Font.ResourceLoader, Context).
  */
 @Suppress("DEPRECATION")
-internal class DelegatingFontLoaderForDeprecatedUsage(
-    internal val loader: Font.ResourceLoader
-) : PlatformFontLoader {
+internal class DelegatingFontLoaderForDeprecatedUsage(internal val loader: Font.ResourceLoader) :
+    PlatformFontLoader {
 
     // never consider these reusable for caching
     override val cacheKey: Any = Any()
diff --git a/compose/ui/ui-text/src/androidMain/kotlin/androidx/compose/ui/text/font/DeviceFontFamilyNameFont.android.kt b/compose/ui/ui-text/src/androidMain/kotlin/androidx/compose/ui/text/font/DeviceFontFamilyNameFont.android.kt
index e009714..21c5b32 100644
--- a/compose/ui/ui-text/src/androidMain/kotlin/androidx/compose/ui/text/font/DeviceFontFamilyNameFont.android.kt
+++ b/compose/ui/ui-text/src/androidMain/kotlin/androidx/compose/ui/text/font/DeviceFontFamilyNameFont.android.kt
@@ -51,7 +51,6 @@
  * @param weight weight to load
  * @param style style to load
  * @param variationSettings font variation settings, unset by default to load default VF from system
- *
  * @throws IllegalArgumentException if familyName is empty
  */
 fun Font(
@@ -68,9 +67,9 @@
  *
  * See `/system/etc/fonts.xml` and `/product/etc/fonts_customization.xml` on a device.
  *
- * @see Typeface
  * @param name System fontFamilyName as passed to [Typeface.create]
  * @throws IllegalArgumentException if name is empty
+ * @see Typeface
  */
 @JvmInline
 value class DeviceFontFamilyName(val name: String) {
@@ -79,24 +78,22 @@
     }
 }
 
-private class DeviceFontFamilyNameFont constructor(
+private class DeviceFontFamilyNameFont
+constructor(
     private val familyName: DeviceFontFamilyName,
     override val weight: FontWeight,
     override val style: FontStyle,
     variationSettings: FontVariation.Settings
-) : AndroidFont(
-    FontLoadingStrategy.OptionalLocal,
-    NamedFontLoader,
-    variationSettings
-) {
+) : AndroidFont(FontLoadingStrategy.OptionalLocal, NamedFontLoader, variationSettings) {
     fun loadCached(context: Context): Typeface? {
-         return PlatformTypefaces().optionalOnDeviceFontFamilyByName(
-            familyName.name,
-            weight,
-            style,
-            variationSettings,
-            context
-        )
+        return PlatformTypefaces()
+            .optionalOnDeviceFontFamilyByName(
+                familyName.name,
+                weight,
+                style,
+                variationSettings,
+                context
+            )
     }
 
     override fun equals(other: Any?): Boolean {
diff --git a/compose/ui/ui-text/src/androidMain/kotlin/androidx/compose/ui/text/font/FontFamilyResolver.android.kt b/compose/ui/ui-text/src/androidMain/kotlin/androidx/compose/ui/text/font/FontFamilyResolver.android.kt
index 3e507a3..295a264 100644
--- a/compose/ui/ui-text/src/androidMain/kotlin/androidx/compose/ui/text/font/FontFamilyResolver.android.kt
+++ b/compose/ui/ui-text/src/androidMain/kotlin/androidx/compose/ui/text/font/FontFamilyResolver.android.kt
@@ -35,9 +35,7 @@
  * All instances of FontFamily.Resolver created by [createFontFamilyResolver] share the same
  * typeface caches.
  */
-fun createFontFamilyResolver(
-    context: Context
-): FontFamily.Resolver {
+fun createFontFamilyResolver(context: Context): FontFamily.Resolver {
     return FontFamilyResolverImpl(
         AndroidFontLoader(context),
         AndroidFontResolveInterceptor(context)
@@ -54,9 +52,9 @@
  *
  * Usages inside of Composition should use LocalFontFamilyResolver.current
  *
- * Any [kotlinx.coroutines.CoroutineExceptionHandler] provided will be called with
- * exceptions related to fallback font loading. These exceptions are not fatal, and indicate
- * that font fallback continued to the next font load.
+ * Any [kotlinx.coroutines.CoroutineExceptionHandler] provided will be called with exceptions
+ * related to fallback font loading. These exceptions are not fatal, and indicate that font fallback
+ * continued to the next font load.
  *
  * If no [kotlinx.coroutines.CoroutineExceptionHandler] is provided, a default implementation will
  * be added that ignores all exceptions.
@@ -75,10 +73,7 @@
         AndroidFontLoader(context),
         AndroidFontResolveInterceptor(context),
         GlobalTypefaceRequestCache,
-        FontListFontFamilyTypefaceAdapter(
-            GlobalAsyncTypefaceCache,
-            coroutineContext
-        )
+        FontListFontFamilyTypefaceAdapter(GlobalAsyncTypefaceCache, coroutineContext)
     )
 }
 
@@ -86,7 +81,6 @@
  * Create a FontFamily.resolver that does not share a cache with other FontFamily.Resolvers.
  *
  * This is primarily useful for testing or benchmarking.
- *
  */
 @InternalTextApi // exposed for benchmarking, not a stable API.
 @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
@@ -94,9 +88,7 @@
     return FontFamilyResolverImpl(
         AndroidFontLoader(context),
         typefaceRequestCache = TypefaceRequestCache(),
-        fontListFontFamilyTypefaceAdapter = FontListFontFamilyTypefaceAdapter(
-            AsyncTypefaceCache()
-        )
+        fontListFontFamilyTypefaceAdapter = FontListFontFamilyTypefaceAdapter(AsyncTypefaceCache())
     )
 }
 
@@ -111,8 +103,8 @@
  * @param fontWeight font weight to resolve in [fontFamily], will use closest match if not exact
  * @param fontStyle italic or upright text, to resolve in [fontFamily]
  * @param fontSynthesis allow font synthesis if [fontFamily] or [fontStyle] don't have an exact
- * match. This will allow "fake bold" (drawing with too wide a brush) and "fake italic" (drawing
- * then skewing) to be applied when no exact match is present for the weight and style.
+ *   match. This will allow "fake bold" (drawing with too wide a brush) and "fake italic" (drawing
+ *   then skewing) to be applied when no exact match is present for the weight and style.
  */
 fun FontFamily.Resolver.resolveAsTypeface(
     fontFamily: FontFamily? = null,
diff --git a/compose/ui/ui-text/src/androidMain/kotlin/androidx/compose/ui/text/font/FontSynthesis.android.kt b/compose/ui/ui-text/src/androidMain/kotlin/androidx/compose/ui/text/font/FontSynthesis.android.kt
index e1a83a1..7726040 100644
--- a/compose/ui/ui-text/src/androidMain/kotlin/androidx/compose/ui/text/font/FontSynthesis.android.kt
+++ b/compose/ui/ui-text/src/androidMain/kotlin/androidx/compose/ui/text/font/FontSynthesis.android.kt
@@ -21,7 +21,6 @@
 
 /**
  * Apply android font-synthesis rules.
- *
  * 1. Fake bold is applied if requestedWeight >= 600 and fontWeight < 600
  * 2. Fake italic is applied if requestedStyle does not match font style
  *
@@ -35,35 +34,40 @@
 ): Any {
     if (typeface !is Typeface) return typeface
 
-    val synthesizeWeight = isWeightOn && font.weight != requestedWeight &&
-        (requestedWeight >= FontWeight.AndroidBold && font.weight < FontWeight.AndroidBold)
+    val synthesizeWeight =
+        isWeightOn &&
+            font.weight != requestedWeight &&
+            (requestedWeight >= FontWeight.AndroidBold && font.weight < FontWeight.AndroidBold)
 
     val synthesizeStyle = isStyleOn && requestedStyle != font.style
 
     if (!synthesizeStyle && !synthesizeWeight) return typeface
 
     return if (Build.VERSION.SDK_INT < 28) {
-        val targetStyle = getAndroidTypefaceStyle(
-            isBold = synthesizeWeight,
-            isItalic = synthesizeStyle && requestedStyle == FontStyle.Italic
-        )
+        val targetStyle =
+            getAndroidTypefaceStyle(
+                isBold = synthesizeWeight,
+                isItalic = synthesizeStyle && requestedStyle == FontStyle.Italic
+            )
         Typeface.create(typeface, targetStyle)
     } else {
-        val finalFontWeight = if (synthesizeWeight) {
-            // if we want to synthesize weight, we send the requested fontWeight
-            requestedWeight.weight
-        } else {
-            // if we do not want to synthesize weight, we keep the loaded font weight
-            font.weight.weight
-        }
+        val finalFontWeight =
+            if (synthesizeWeight) {
+                // if we want to synthesize weight, we send the requested fontWeight
+                requestedWeight.weight
+            } else {
+                // if we do not want to synthesize weight, we keep the loaded font weight
+                font.weight.weight
+            }
 
-        val finalFontStyle = if (synthesizeStyle) {
-            // if we want to synthesize style, we send the requested fontStyle
-            requestedStyle == FontStyle.Italic
-        } else {
-            // if we do not want to synthesize style, we keep the loaded font style
-            font.style == FontStyle.Italic
-        }
+        val finalFontStyle =
+            if (synthesizeStyle) {
+                // if we want to synthesize style, we send the requested fontStyle
+                requestedStyle == FontStyle.Italic
+            } else {
+                // if we do not want to synthesize style, we keep the loaded font style
+                font.style == FontStyle.Italic
+            }
         TypefaceHelperMethodsApi28.create(typeface, finalFontWeight, finalFontStyle)
     }
 }
diff --git a/compose/ui/ui-text/src/androidMain/kotlin/androidx/compose/ui/text/font/PlatformFontFamilyTypefaceAdapter.android.kt b/compose/ui/ui-text/src/androidMain/kotlin/androidx/compose/ui/text/font/PlatformFontFamilyTypefaceAdapter.android.kt
index a20c7cc..0980f37 100644
--- a/compose/ui/ui-text/src/androidMain/kotlin/androidx/compose/ui/text/font/PlatformFontFamilyTypefaceAdapter.android.kt
+++ b/compose/ui/ui-text/src/androidMain/kotlin/androidx/compose/ui/text/font/PlatformFontFamilyTypefaceAdapter.android.kt
@@ -29,25 +29,29 @@
         onAsyncCompletion: (TypefaceResult.Immutable) -> Unit,
         createDefaultTypeface: (TypefaceRequest) -> Any
     ): TypefaceResult? {
-        val result: Typeface = when (typefaceRequest.fontFamily) {
-            null, is DefaultFontFamily -> platformTypefaceResolver.createDefault(
-                typefaceRequest.fontWeight,
-                typefaceRequest.fontStyle
-            )
-            is GenericFontFamily -> platformTypefaceResolver.createNamed(
-                typefaceRequest.fontFamily,
-                typefaceRequest.fontWeight,
-                typefaceRequest.fontStyle
-            )
-            is LoadedFontFamily -> {
-                (typefaceRequest.fontFamily.typeface as AndroidTypeface).getNativeTypeface(
-                    typefaceRequest.fontWeight,
-                    typefaceRequest.fontStyle,
-                    typefaceRequest.fontSynthesis
-                )
+        val result: Typeface =
+            when (typefaceRequest.fontFamily) {
+                null,
+                is DefaultFontFamily ->
+                    platformTypefaceResolver.createDefault(
+                        typefaceRequest.fontWeight,
+                        typefaceRequest.fontStyle
+                    )
+                is GenericFontFamily ->
+                    platformTypefaceResolver.createNamed(
+                        typefaceRequest.fontFamily,
+                        typefaceRequest.fontWeight,
+                        typefaceRequest.fontStyle
+                    )
+                is LoadedFontFamily -> {
+                    (typefaceRequest.fontFamily.typeface as AndroidTypeface).getNativeTypeface(
+                        typefaceRequest.fontWeight,
+                        typefaceRequest.fontStyle,
+                        typefaceRequest.fontSynthesis
+                    )
+                }
+                else -> return null // exit to make result non-null
             }
-            else -> return null // exit to make result non-null
-        }
         return TypefaceResult.Immutable(result)
     }
 }
diff --git a/compose/ui/ui-text/src/androidMain/kotlin/androidx/compose/ui/text/font/PlatformTypefaces.android.kt b/compose/ui/ui-text/src/androidMain/kotlin/androidx/compose/ui/text/font/PlatformTypefaces.android.kt
index 9b8893e..02772d3 100644
--- a/compose/ui/ui-text/src/androidMain/kotlin/androidx/compose/ui/text/font/PlatformTypefaces.android.kt
+++ b/compose/ui/ui-text/src/androidMain/kotlin/androidx/compose/ui/text/font/PlatformTypefaces.android.kt
@@ -26,9 +26,7 @@
 import androidx.compose.ui.unit.Density
 import androidx.compose.ui.util.fastJoinToString
 
-/**
- * Primary internal interface for resolving typefaces from Android platform
- */
+/** Primary internal interface for resolving typefaces from Android platform */
 internal interface PlatformTypefaces {
     /**
      * Resolve the system default font
@@ -56,7 +54,7 @@
      * @param weight weight to load, if available, will fallback
      * @param style italic or not, will fallback
      * @return typeface from system cache if available, or null if the system doesn't know this font
-     * name
+     *   name
      */
     fun optionalOnDeviceFontFamilyByName(
         familyName: String,
@@ -102,13 +100,14 @@
     ): Typeface? {
         // if the developer specified one of the named fonts, behave identically to the
         // GenericFontFamily behavior, return the same as createNamed always
-        val typeface = when (familyName) {
-            FontFamily.SansSerif.name -> createNamed(FontFamily.SansSerif, weight, style)
-            FontFamily.Serif.name -> createNamed(FontFamily.Serif, weight, style)
-            FontFamily.Monospace.name -> createNamed(FontFamily.Monospace, weight, style)
-            FontFamily.Cursive.name -> createNamed(FontFamily.Cursive, weight, style)
-            else -> loadNamedFromTypefaceCacheOrNull(familyName, weight, style)
-        }
+        val typeface =
+            when (familyName) {
+                FontFamily.SansSerif.name -> createNamed(FontFamily.SansSerif, weight, style)
+                FontFamily.Serif.name -> createNamed(FontFamily.Serif, weight, style)
+                FontFamily.Monospace.name -> createNamed(FontFamily.Monospace, weight, style)
+                FontFamily.Cursive.name -> createNamed(FontFamily.Cursive, weight, style)
+                else -> loadNamedFromTypefaceCacheOrNull(familyName, weight, style)
+            }
         return typeface.setFontVariationSettings(variationSettings, context)
     }
 
@@ -131,9 +130,10 @@
         fontWeight: FontWeight = FontWeight.Normal,
         fontStyle: FontStyle = FontStyle.Normal
     ): Typeface {
-        if (fontStyle == FontStyle.Normal &&
-            fontWeight == FontWeight.Normal &&
-            genericFontFamily.isNullOrEmpty()
+        if (
+            fontStyle == FontStyle.Normal &&
+                fontWeight == FontWeight.Normal &&
+                genericFontFamily.isNullOrEmpty()
         ) {
             return Typeface.DEFAULT
         }
@@ -160,13 +160,14 @@
     ): Typeface? {
         // if the developer specified one of the named fonts, behave identically to the
         // GenericFontFamily behavior, return the same as createNamed always
-        val result = when (familyName) {
-            FontFamily.SansSerif.name -> createNamed(FontFamily.SansSerif, weight, style)
-            FontFamily.Serif.name -> createNamed(FontFamily.Serif, weight, style)
-            FontFamily.Monospace.name -> createNamed(FontFamily.Monospace, weight, style)
-            FontFamily.Cursive.name -> createNamed(FontFamily.Cursive, weight, style)
-            else -> loadNamedFromTypefaceCacheOrNull(familyName, weight, style)
-        }
+        val result =
+            when (familyName) {
+                FontFamily.SansSerif.name -> createNamed(FontFamily.SansSerif, weight, style)
+                FontFamily.Serif.name -> createNamed(FontFamily.Serif, weight, style)
+                FontFamily.Monospace.name -> createNamed(FontFamily.Monospace, weight, style)
+                FontFamily.Cursive.name -> createNamed(FontFamily.Cursive, weight, style)
+                else -> loadNamedFromTypefaceCacheOrNull(familyName, weight, style)
+            }
         return result.setFontVariationSettings(variationSettings, context)
     }
 
@@ -203,30 +204,26 @@
         fontWeight: FontWeight,
         fontStyle: FontStyle
     ): Typeface {
-        if (fontStyle == FontStyle.Normal &&
-            fontWeight == FontWeight.Normal &&
-            genericFontFamily.isNullOrEmpty()
+        if (
+            fontStyle == FontStyle.Normal &&
+                fontWeight == FontWeight.Normal &&
+                genericFontFamily.isNullOrEmpty()
         ) {
             return Typeface.DEFAULT
         }
 
-        val familyTypeface = if (genericFontFamily == null) {
-            Typeface.DEFAULT
-        } else {
-            Typeface.create(genericFontFamily, Typeface.NORMAL)
-        }
+        val familyTypeface =
+            if (genericFontFamily == null) {
+                Typeface.DEFAULT
+            } else {
+                Typeface.create(genericFontFamily, Typeface.NORMAL)
+            }
 
-        return Typeface.create(
-            familyTypeface,
-            fontWeight.weight,
-            fontStyle == FontStyle.Italic
-        )
+        return Typeface.create(familyTypeface, fontWeight.weight, fontStyle == FontStyle.Italic)
     }
 }
 
-/**
- * Apply font variation settings to a typeface on supported API levels (26+)
- */
+/** Apply font variation settings to a typeface on supported API levels (26+) */
 @ExperimentalTextApi
 internal fun Typeface?.setFontVariationSettings(
     variationSettings: FontVariation.Settings,
@@ -273,14 +270,11 @@
 }
 
 /**
- * Convert system family name like "sans-serif" to fallback family names like
- * "sans-serif-medium" for platforms <28.
+ * Convert system family name like "sans-serif" to fallback family names like "sans-serif-medium"
+ * for platforms <28.
  */
 @VisibleForTesting
-internal fun getWeightSuffixForFallbackFamilyName(
-    name: String,
-    fontWeight: FontWeight
-): String {
+internal fun getWeightSuffixForFallbackFamilyName(name: String, fontWeight: FontWeight): String {
     // logic for matching comes from FontFamily.cpp#computeMatch(FontStyle, FontStyle)
 
     // for our purposes, we expect full-coverage from 100-900 for system fonts, and can ignore
diff --git a/compose/ui/ui-text/src/androidMain/kotlin/androidx/compose/ui/text/input/PlatformImeOptions.android.kt b/compose/ui/ui-text/src/androidMain/kotlin/androidx/compose/ui/text/input/PlatformImeOptions.android.kt
index 68ef3fb..90aa3a7 100644
--- a/compose/ui/ui-text/src/androidMain/kotlin/androidx/compose/ui/text/input/PlatformImeOptions.android.kt
+++ b/compose/ui/ui-text/src/androidMain/kotlin/androidx/compose/ui/text/input/PlatformImeOptions.android.kt
@@ -21,8 +21,8 @@
 /**
  * Used to configure Android platform IME options.
  *
- * @param privateImeOptions defines a [String] for supplying additional information options that
- * are private to a particular IME implementation.
+ * @param privateImeOptions defines a [String] for supplying additional information options that are
+ *   private to a particular IME implementation.
  */
 @Immutable
 actual class PlatformImeOptions(
diff --git a/compose/ui/ui-text/src/androidMain/kotlin/androidx/compose/ui/text/intl/AndroidLocaleDelegate.android.kt b/compose/ui/ui-text/src/androidMain/kotlin/androidx/compose/ui/text/intl/AndroidLocaleDelegate.android.kt
index f20ad34..ada92f1 100644
--- a/compose/ui/ui-text/src/androidMain/kotlin/androidx/compose/ui/text/intl/AndroidLocaleDelegate.android.kt
+++ b/compose/ui/ui-text/src/androidMain/kotlin/androidx/compose/ui/text/intl/AndroidLocaleDelegate.android.kt
@@ -24,9 +24,7 @@
 
 private val TAG = "Locale"
 
-/**
- * An Android implementation of LocaleDelegate object for API 23
- */
+/** An Android implementation of LocaleDelegate object for API 23 */
 internal class AndroidLocaleDelegateAPI23 : PlatformLocaleDelegate {
 
     override val current: LocaleList
@@ -35,17 +33,18 @@
     override fun parseLanguageTag(languageTag: String): PlatformLocale {
         val platformLocale = JavaLocale.forLanguageTag(languageTag)
         if (platformLocale.toLanguageTag() == "und") {
-            Log.e(TAG, "The language tag $languageTag is not well-formed. Locale is resolved " +
-                "to Undetermined. Note that underscore '_' is not a valid subtags delimiter and " +
-                "must be replaced with '-'.")
+            Log.e(
+                TAG,
+                "The language tag $languageTag is not well-formed. Locale is resolved " +
+                    "to Undetermined. Note that underscore '_' is not a valid subtags delimiter and " +
+                    "must be replaced with '-'."
+            )
         }
         return platformLocale
     }
 }
 
-/**
- * An Android implementation of LocaleDelegate object for API 24 and later
- */
+/** An Android implementation of LocaleDelegate object for API 24 and later */
 @RequiresApi(api = 24)
 internal class AndroidLocaleDelegateAPI24 : PlatformLocaleDelegate {
     private var lastPlatformLocaleList: AndroidLocaleList? = null
@@ -57,15 +56,14 @@
             val platformLocaleList = AndroidLocaleList.getDefault()
             return synchronized(lock) {
                 // try to avoid any more allocs
-                lastLocaleList?.let {
-                    if (platformLocaleList === lastPlatformLocaleList) return it
-                }
+                lastLocaleList?.let { if (platformLocaleList === lastPlatformLocaleList) return it }
                 // this is faster than adding to an empty mutableList
-                val localeList = LocaleList(
-                    List(platformLocaleList.size()) { position ->
-                        Locale(platformLocaleList[position])
-                    }
-                )
+                val localeList =
+                    LocaleList(
+                        List(platformLocaleList.size()) { position ->
+                            Locale(platformLocaleList[position])
+                        }
+                    )
                 // cache the platform result and compose result
                 lastPlatformLocaleList = platformLocaleList
                 lastLocaleList = localeList
@@ -76,9 +74,12 @@
     override fun parseLanguageTag(languageTag: String): PlatformLocale {
         val platformLocale = JavaLocale.forLanguageTag(languageTag)
         if (platformLocale.toLanguageTag() == "und") {
-            Log.e(TAG, "The language tag $languageTag is not well-formed. Locale is resolved " +
-                "to Undetermined. Note that underscore '_' is not a valid subtag delimiter and " +
-                "must be replaced with '-'.")
+            Log.e(
+                TAG,
+                "The language tag $languageTag is not well-formed. Locale is resolved " +
+                    "to Undetermined. Note that underscore '_' is not a valid subtag delimiter and " +
+                    "must be replaced with '-'."
+            )
         }
         return platformLocale
     }
diff --git a/compose/ui/ui-text/src/androidMain/kotlin/androidx/compose/ui/text/platform/ActualParagraph.android.kt b/compose/ui/ui-text/src/androidMain/kotlin/androidx/compose/ui/text/platform/ActualParagraph.android.kt
index 747853f..0cd4880 100644
--- a/compose/ui/ui-text/src/androidMain/kotlin/androidx/compose/ui/text/platform/ActualParagraph.android.kt
+++ b/compose/ui/ui-text/src/androidMain/kotlin/androidx/compose/ui/text/platform/ActualParagraph.android.kt
@@ -35,10 +35,11 @@
 @Suppress("DEPRECATION")
 @Deprecated(
     "Font.ResourceLoader is deprecated, instead pass FontFamily.Resolver",
-    replaceWith = ReplaceWith(
-        "ActualParagraph(text, style, spanStyles, placeholders, " +
-            "maxLines, ellipsis, width, density, fontFamilyResolver)"
-    ),
+    replaceWith =
+        ReplaceWith(
+            "ActualParagraph(text, style, spanStyles, placeholders, " +
+                "maxLines, ellipsis, width, density, fontFamilyResolver)"
+        ),
 )
 internal actual fun ActualParagraph(
     text: String,
@@ -50,19 +51,20 @@
     width: Float,
     density: Density,
     @Suppress("DEPRECATION") resourceLoader: Font.ResourceLoader
-): Paragraph = AndroidParagraph(
-    AndroidParagraphIntrinsics(
-        text = text,
-        style = style,
-        placeholders = placeholders,
-        spanStyles = spanStyles,
-        fontFamilyResolver = createFontFamilyResolver(resourceLoader),
-        density = density
-    ),
-    maxLines,
-    ellipsis,
-    Constraints(maxWidth = width.ceilToInt())
-)
+): Paragraph =
+    AndroidParagraph(
+        AndroidParagraphIntrinsics(
+            text = text,
+            style = style,
+            placeholders = placeholders,
+            spanStyles = spanStyles,
+            fontFamilyResolver = createFontFamilyResolver(resourceLoader),
+            density = density
+        ),
+        maxLines,
+        ellipsis,
+        Constraints(maxWidth = width.ceilToInt())
+    )
 
 internal actual fun ActualParagraph(
     text: String,
@@ -74,28 +76,30 @@
     constraints: Constraints,
     density: Density,
     fontFamilyResolver: FontFamily.Resolver
-): Paragraph = AndroidParagraph(
-    AndroidParagraphIntrinsics(
-        text = text,
-        style = style,
-        placeholders = placeholders,
-        spanStyles = spanStyles,
-        fontFamilyResolver = fontFamilyResolver,
-        density = density
-    ),
-    maxLines,
-    ellipsis,
-    constraints
-)
+): Paragraph =
+    AndroidParagraph(
+        AndroidParagraphIntrinsics(
+            text = text,
+            style = style,
+            placeholders = placeholders,
+            spanStyles = spanStyles,
+            fontFamilyResolver = fontFamilyResolver,
+            density = density
+        ),
+        maxLines,
+        ellipsis,
+        constraints
+    )
 
 internal actual fun ActualParagraph(
     paragraphIntrinsics: ParagraphIntrinsics,
     maxLines: Int,
     ellipsis: Boolean,
     constraints: Constraints
-): Paragraph = AndroidParagraph(
-    paragraphIntrinsics as AndroidParagraphIntrinsics,
-    maxLines,
-    ellipsis,
-    constraints
-)
+): Paragraph =
+    AndroidParagraph(
+        paragraphIntrinsics as AndroidParagraphIntrinsics,
+        maxLines,
+        ellipsis,
+        constraints
+    )
diff --git a/compose/ui/ui-text/src/androidMain/kotlin/androidx/compose/ui/text/platform/AndroidAccessibilitySpannableString.android.kt b/compose/ui/ui-text/src/androidMain/kotlin/androidx/compose/ui/text/platform/AndroidAccessibilitySpannableString.android.kt
index ae0c09e..f89514a 100644
--- a/compose/ui/ui-text/src/androidMain/kotlin/androidx/compose/ui/text/platform/AndroidAccessibilitySpannableString.android.kt
+++ b/compose/ui/ui-text/src/androidMain/kotlin/androidx/compose/ui/text/platform/AndroidAccessibilitySpannableString.android.kt
@@ -144,10 +144,13 @@
         } else {
             if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {
                 // TODO(b/214587005): Check for async here and uncache
-                val typeface = fontFamilyResolver.resolve(
-                    fontFamily = spanStyle.fontFamily,
-                    fontSynthesis = spanStyle.fontSynthesis ?: FontSynthesis.All
-                ).value as Typeface
+                val typeface =
+                    fontFamilyResolver
+                        .resolve(
+                            fontFamily = spanStyle.fontFamily,
+                            fontSynthesis = spanStyle.fontSynthesis ?: FontSynthesis.All
+                        )
+                        .value as Typeface
                 setSpan(
                     Api28Impl.createTypefaceSpan(typeface),
                     start,
@@ -163,20 +166,10 @@
         // should remove the underline and lineThrough effect on the given range. Here we didn't
         // remove any previously applied spans yet.
         if (TextDecoration.Underline in spanStyle.textDecoration) {
-            setSpan(
-                UnderlineSpan(),
-                start,
-                end,
-                Spanned.SPAN_EXCLUSIVE_EXCLUSIVE
-            )
+            setSpan(UnderlineSpan(), start, end, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE)
         }
         if (TextDecoration.LineThrough in spanStyle.textDecoration) {
-            setSpan(
-                StrikethroughSpan(),
-                start,
-                end,
-                Spanned.SPAN_EXCLUSIVE_EXCLUSIVE
-            )
+            setSpan(StrikethroughSpan(), start, end, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE)
         }
     }
 
@@ -196,8 +189,7 @@
 
 @RequiresApi(28)
 private object Api28Impl {
-    @DoNotInline
-    fun createTypefaceSpan(typeface: Typeface): TypefaceSpan = TypefaceSpan(typeface)
+    @DoNotInline fun createTypefaceSpan(typeface: Typeface): TypefaceSpan = TypefaceSpan(typeface)
 }
 
 private fun AnnotatedString.Range<LinkAnnotation>.toUrlLink() =
diff --git a/compose/ui/ui-text/src/androidMain/kotlin/androidx/compose/ui/text/platform/AndroidDefaultTypeface.android.kt b/compose/ui/ui-text/src/androidMain/kotlin/androidx/compose/ui/text/platform/AndroidDefaultTypeface.android.kt
index 70f8f41..4806c1b 100644
--- a/compose/ui/ui-text/src/androidMain/kotlin/androidx/compose/ui/text/platform/AndroidDefaultTypeface.android.kt
+++ b/compose/ui/ui-text/src/androidMain/kotlin/androidx/compose/ui/text/platform/AndroidDefaultTypeface.android.kt
@@ -26,9 +26,7 @@
 import androidx.compose.ui.text.font.TypefaceHelperMethodsApi28
 import androidx.compose.ui.text.font.getAndroidTypefaceStyle
 
-/**
- * An implementation of [AndroidTypeface] for [DefaultFontFamily]
- */
+/** An implementation of [AndroidTypeface] for [DefaultFontFamily] */
 @Deprecated("This path for preloading fonts is not supported")
 internal class AndroidDefaultTypeface : AndroidTypeface {
 
@@ -40,9 +38,7 @@
         synthesis: FontSynthesis
     ): Typeface {
         return if (Build.VERSION.SDK_INT < 28) {
-            Typeface.defaultFromStyle(
-                getAndroidTypefaceStyle(fontWeight, fontStyle)
-            )
+            Typeface.defaultFromStyle(getAndroidTypefaceStyle(fontWeight, fontStyle))
         } else {
             TypefaceHelperMethodsApi28.create(
                 Typeface.DEFAULT,
diff --git a/compose/ui/ui-text/src/androidMain/kotlin/androidx/compose/ui/text/platform/AndroidFontListTypeface.android.kt b/compose/ui/ui-text/src/androidMain/kotlin/androidx/compose/ui/text/platform/AndroidFontListTypeface.android.kt
index e745347..78e1d7b1 100644
--- a/compose/ui/ui-text/src/androidMain/kotlin/androidx/compose/ui/text/platform/AndroidFontListTypeface.android.kt
+++ b/compose/ui/ui-text/src/androidMain/kotlin/androidx/compose/ui/text/platform/AndroidFontListTypeface.android.kt
@@ -44,9 +44,7 @@
 import androidx.compose.ui.util.fastMap
 import androidx.core.content.res.ResourcesCompat
 
-/**
- * An implementation of [AndroidTypeface] for [FontListFontFamily]
- */
+/** An implementation of [AndroidTypeface] for [FontListFontFamily] */
 // internal constructor for injecting FontMatcher for testing purpose
 @Suppress("DEPRECATION")
 @Deprecated("This is not supported after downloadable fonts.")
@@ -60,15 +58,19 @@
     private companion object {
         val fontMatcher = FontMatcher()
     }
+
     private val loadedTypefaces: Map<Font, Typeface>
 
     init {
-        val blockingFonts = fontFamily.fonts.fastFilter {
-            it.loadingStrategy == FontLoadingStrategy.Blocking
-        }
-        val matchedFonts: List<Font>? = necessaryStyles?.fastMap { (weight, style) ->
-            fontMatcher.matchFont(blockingFonts, weight, style).firstOrNull()
-        }?.fastFilterNotNull()?.fastDistinctBy { it }
+        val blockingFonts =
+            fontFamily.fonts.fastFilter { it.loadingStrategy == FontLoadingStrategy.Blocking }
+        val matchedFonts: List<Font>? =
+            necessaryStyles
+                ?.fastMap { (weight, style) ->
+                    fontMatcher.matchFont(blockingFonts, weight, style).firstOrNull()
+                }
+                ?.fastFilterNotNull()
+                ?.fastDistinctBy { it }
         val targetFonts = matchedFonts ?: blockingFonts
         check(targetFonts.isNotEmpty()) { "Could not match font" }
 
@@ -91,9 +93,10 @@
         fontStyle: FontStyle,
         synthesis: FontSynthesis
     ): Typeface {
-        val font = fontMatcher
-            .matchFont(ArrayList(loadedTypefaces.keys), fontWeight, fontStyle)
-            .firstOrNull()
+        val font =
+            fontMatcher
+                .matchFont(ArrayList(loadedTypefaces.keys), fontWeight, fontStyle)
+                .firstOrNull()
         checkNotNull(font) { "Could not load font" }
 
         val typeface = loadedTypefaces[font]
@@ -103,9 +106,7 @@
     }
 }
 
-/**
- * Global Android NativeTypeface cache.
- */
+/** Global Android NativeTypeface cache. */
 @Deprecated("Duplicate cache")
 internal object AndroidTypefaceCache {
 
@@ -121,29 +122,30 @@
         val key = getKey(context, font)
 
         key?.let {
-            cache.get(key)?.let { return it }
+            cache.get(key)?.let {
+                return it
+            }
         }
 
-        val typeface = when (font) {
-            is ResourceFont ->
-                if (Build.VERSION.SDK_INT >= 26) {
-                    @Suppress("DEPRECATION")
-                    AndroidResourceFontLoaderHelper.create(context, font.resId)
-                } else {
-                    ResourcesCompat.getFont(context, font.resId)!!
-                }
-            is AndroidFont -> font.typefaceLoader.loadBlocking(context, font)
-            else -> throw IllegalArgumentException("Unknown font type: $font")
-        } ?: throw IllegalArgumentException("Unable to load font $font")
+        val typeface =
+            when (font) {
+                is ResourceFont ->
+                    if (Build.VERSION.SDK_INT >= 26) {
+                        @Suppress("DEPRECATION")
+                        AndroidResourceFontLoaderHelper.create(context, font.resId)
+                    } else {
+                        ResourcesCompat.getFont(context, font.resId)!!
+                    }
+                is AndroidFont -> font.typefaceLoader.loadBlocking(context, font)
+                else -> throw IllegalArgumentException("Unknown font type: $font")
+            } ?: throw IllegalArgumentException("Unable to load font $font")
 
         key?.let { cache.put(key, typeface) }
 
         return typeface
     }
 
-    /**
-     * Utility method to generate a key for caching purposes.
-     */
+    /** Utility method to generate a key for caching purposes. */
     fun getKey(context: Context, font: Font): String? {
         return when (font) {
             is ResourceFont -> {
@@ -158,9 +160,9 @@
 }
 
 /**
- * This class is here to ensure that the classes that use this API will get verified and can be
- * AOT compiled. It is expected that this class will soft-fail verification, but the classes
- * which use this method will pass.
+ * This class is here to ensure that the classes that use this API will get verified and can be AOT
+ * compiled. It is expected that this class will soft-fail verification, but the classes which use
+ * this method will pass.
  */
 @RequiresApi(26)
 @Deprecated("Only used by deprecated APIs in this file, remove with them.")
diff --git a/compose/ui/ui-text/src/androidMain/kotlin/androidx/compose/ui/text/platform/AndroidGenericFontFamilyTypeface.android.kt b/compose/ui/ui-text/src/androidMain/kotlin/androidx/compose/ui/text/platform/AndroidGenericFontFamilyTypeface.android.kt
index 859a17a..60f8ad4 100644
--- a/compose/ui/ui-text/src/androidMain/kotlin/androidx/compose/ui/text/platform/AndroidGenericFontFamilyTypeface.android.kt
+++ b/compose/ui/ui-text/src/androidMain/kotlin/androidx/compose/ui/text/platform/AndroidGenericFontFamilyTypeface.android.kt
@@ -26,13 +26,9 @@
 import androidx.compose.ui.text.font.TypefaceHelperMethodsApi28
 import androidx.compose.ui.text.font.getAndroidTypefaceStyle
 
-/**
- * An implementation of [AndroidTypeface] for [GenericFontFamily]
- */
+/** An implementation of [AndroidTypeface] for [GenericFontFamily] */
 @Deprecated("This path for preloading loading fonts is not supported.")
-internal class AndroidGenericFontFamilyTypeface(
-    fontFamily: GenericFontFamily
-) : AndroidTypeface {
+internal class AndroidGenericFontFamilyTypeface(fontFamily: GenericFontFamily) : AndroidTypeface {
 
     override val fontFamily: FontFamily = fontFamily
 
@@ -47,10 +43,7 @@
 
     private fun buildStyledTypeface(fontWeight: FontWeight, fontStyle: FontStyle) =
         if (Build.VERSION.SDK_INT < 28) {
-            Typeface.create(
-                nativeTypeface,
-                getAndroidTypefaceStyle(fontWeight, fontStyle)
-            )
+            Typeface.create(nativeTypeface, getAndroidTypefaceStyle(fontWeight, fontStyle))
         } else {
             TypefaceHelperMethodsApi28.create(
                 nativeTypeface,
diff --git a/compose/ui/ui-text/src/androidMain/kotlin/androidx/compose/ui/text/platform/AndroidParagraphHelper.android.kt b/compose/ui/ui-text/src/androidMain/kotlin/androidx/compose/ui/text/platform/AndroidParagraphHelper.android.kt
index d58e9cc..676aab8 100644
--- a/compose/ui/ui-text/src/androidMain/kotlin/androidx/compose/ui/text/platform/AndroidParagraphHelper.android.kt
+++ b/compose/ui/ui-text/src/androidMain/kotlin/androidx/compose/ui/text/platform/AndroidParagraphHelper.android.kt
@@ -58,37 +58,36 @@
     useEmojiCompat: Boolean,
 ): CharSequence {
 
-    val currentText = if (useEmojiCompat && EmojiCompat.isConfigured()) {
-        val emojiSupportMatch = contextTextStyle.platformStyle?.paragraphStyle?.emojiSupportMatch
-        val replaceStrategy = if (emojiSupportMatch == EmojiSupportMatch.All) {
-            REPLACE_STRATEGY_ALL
+    val currentText =
+        if (useEmojiCompat && EmojiCompat.isConfigured()) {
+            val emojiSupportMatch =
+                contextTextStyle.platformStyle?.paragraphStyle?.emojiSupportMatch
+            val replaceStrategy =
+                if (emojiSupportMatch == EmojiSupportMatch.All) {
+                    REPLACE_STRATEGY_ALL
+                } else {
+                    REPLACE_STRATEGY_DEFAULT
+                }
+            EmojiCompat.get().process(text, 0, text.length, Int.MAX_VALUE, replaceStrategy)!!
         } else {
-            REPLACE_STRATEGY_DEFAULT
+            text
         }
-        EmojiCompat.get().process(
-            text,
-            0,
-            text.length,
-            Int.MAX_VALUE,
-            replaceStrategy
-        )!!
-    } else {
-        text
-    }
 
-    if (spanStyles.isEmpty() &&
-        placeholders.isEmpty() &&
-        contextTextStyle.textIndent == TextIndent.None &&
-        contextTextStyle.lineHeight.isUnspecified
+    if (
+        spanStyles.isEmpty() &&
+            placeholders.isEmpty() &&
+            contextTextStyle.textIndent == TextIndent.None &&
+            contextTextStyle.lineHeight.isUnspecified
     ) {
         return currentText
     }
 
-    val spannableString = if (currentText is Spannable) {
-        currentText
-    } else {
-        SpannableString(currentText)
-    }
+    val spannableString =
+        if (currentText is Spannable) {
+            currentText
+        } else {
+            SpannableString(currentText)
+        }
 
     // b/199939617
     // Due to a bug in the platform's native drawText stack, some CJK characters cause a bolder
@@ -99,8 +98,8 @@
         spannableString.setSpan(NoopSpan, 0, text.length)
     }
 
-    if (contextTextStyle.isIncludeFontPaddingEnabled() &&
-        contextTextStyle.lineHeightStyle == null
+    if (
+        contextTextStyle.isIncludeFontPaddingEnabled() && contextTextStyle.lineHeightStyle == null
     ) {
         // keep the existing line height behavior for includeFontPadding=true
         spannableString.setLineHeight(
@@ -120,12 +119,7 @@
 
     spannableString.setTextIndent(contextTextStyle.textIndent, contextFontSize, density)
 
-    spannableString.setSpanStyles(
-        contextTextStyle,
-        spanStyles,
-        density,
-        resolveTypeface
-    )
+    spannableString.setSpanStyles(contextTextStyle, spanStyles, density, resolveTypeface)
 
     spannableString.setPlaceholders(placeholders, density)
 
@@ -136,6 +130,7 @@
     return platformStyle?.paragraphStyle?.includeFontPadding ?: DefaultIncludeFontPadding
 }
 
-private val NoopSpan = object : CharacterStyle() {
-    override fun updateDrawState(p0: TextPaint?) {}
-}
+private val NoopSpan =
+    object : CharacterStyle() {
+        override fun updateDrawState(p0: TextPaint?) {}
+    }
diff --git a/compose/ui/ui-text/src/androidMain/kotlin/androidx/compose/ui/text/platform/AndroidParagraphIntrinsics.android.kt b/compose/ui/ui-text/src/androidMain/kotlin/androidx/compose/ui/text/platform/AndroidParagraphIntrinsics.android.kt
index 3868c83..18e9093 100644
--- a/compose/ui/ui-text/src/androidMain/kotlin/androidx/compose/ui/text/platform/AndroidParagraphIntrinsics.android.kt
+++ b/compose/ui/ui-text/src/androidMain/kotlin/androidx/compose/ui/text/platform/AndroidParagraphIntrinsics.android.kt
@@ -44,7 +44,8 @@
 import java.util.Locale
 
 @OptIn(InternalPlatformTextApi::class, ExperimentalTextApi::class)
-internal class AndroidParagraphIntrinsics constructor(
+internal class AndroidParagraphIntrinsics
+constructor(
     val text: String,
     val style: TextStyle,
     val spanStyles: List<AnnotatedString.Range<SpanStyle>>,
@@ -73,27 +74,27 @@
      * This value will never change
      */
     private val emojiCompatProcessed: Boolean =
-        if (!style.hasEmojiCompat) { false } else { EmojiCompatStatus.fontLoaded.value }
+        if (!style.hasEmojiCompat) {
+            false
+        } else {
+            EmojiCompatStatus.fontLoaded.value
+        }
 
     override val hasStaleResolvedFonts: Boolean
-        get() = (resolvedTypefaces?.isStaleResolvedFont ?: false) ||
-            (!emojiCompatProcessed && style.hasEmojiCompat &&
-                /* short-circuit this state read */ EmojiCompatStatus.fontLoaded.value)
+        get() =
+            (resolvedTypefaces?.isStaleResolvedFont ?: false) ||
+                (!emojiCompatProcessed &&
+                    style.hasEmojiCompat &&
+                    /* short-circuit this state read */ EmojiCompatStatus.fontLoaded.value)
 
-    internal val textDirectionHeuristic = resolveTextDirectionHeuristics(
-        style.textDirection,
-        style.localeList
-    )
+    internal val textDirectionHeuristic =
+        resolveTextDirectionHeuristics(style.textDirection, style.localeList)
 
     init {
         val resolveTypeface: (FontFamily?, FontWeight, FontStyle, FontSynthesis) -> Typeface =
             { fontFamily, fontWeight, fontStyle, fontSynthesis ->
-                val result = fontFamilyResolver.resolve(
-                    fontFamily,
-                    fontWeight,
-                    fontStyle,
-                    fontSynthesis
-                )
+                val result =
+                    fontFamilyResolver.resolve(fontFamily, fontWeight, fontStyle, fontSynthesis)
                 if (result !is TypefaceResult.Immutable) {
                     val newHead = TypefaceDirtyTrackerLinkedList(result, resolvedTypefaces)
                     resolvedTypefaces = newHead
@@ -105,49 +106,49 @@
 
         textPaint.setTextMotion(style.textMotion)
 
-        val notAppliedStyle = textPaint.applySpanStyle(
-            style = style.toSpanStyle(),
-            resolveTypeface = resolveTypeface,
-            density = density,
-            requiresLetterSpacing = spanStyles.isNotEmpty(),
-        )
+        val notAppliedStyle =
+            textPaint.applySpanStyle(
+                style = style.toSpanStyle(),
+                resolveTypeface = resolveTypeface,
+                density = density,
+                requiresLetterSpacing = spanStyles.isNotEmpty(),
+            )
 
-        val finalSpanStyles = if (notAppliedStyle != null) {
-            // This is just a prepend operation, written in a lower alloc way
-            // equivalent to: `AnnotatedString.Range(...) + spanStyles`
-            List(spanStyles.size + 1) { position ->
-                when (position) {
-                    0 -> AnnotatedString.Range(
-                        item = notAppliedStyle,
-                        start = 0,
-                        end = text.length
-                    )
-
-                    else -> spanStyles[position - 1]
+        val finalSpanStyles =
+            if (notAppliedStyle != null) {
+                // This is just a prepend operation, written in a lower alloc way
+                // equivalent to: `AnnotatedString.Range(...) + spanStyles`
+                List(spanStyles.size + 1) { position ->
+                    when (position) {
+                        0 ->
+                            AnnotatedString.Range(
+                                item = notAppliedStyle,
+                                start = 0,
+                                end = text.length
+                            )
+                        else -> spanStyles[position - 1]
+                    }
                 }
+            } else {
+                spanStyles
             }
-        } else {
-            spanStyles
-        }
-        charSequence = createCharSequence(
-            text = text,
-            contextFontSize = textPaint.textSize,
-            contextTextStyle = style,
-            spanStyles = finalSpanStyles,
-            placeholders = placeholders,
-            density = density,
-            resolveTypeface = resolveTypeface,
-            useEmojiCompat = emojiCompatProcessed
-        )
+        charSequence =
+            createCharSequence(
+                text = text,
+                contextFontSize = textPaint.textSize,
+                contextTextStyle = style,
+                spanStyles = finalSpanStyles,
+                placeholders = placeholders,
+                density = density,
+                resolveTypeface = resolveTypeface,
+                useEmojiCompat = emojiCompatProcessed
+            )
 
         layoutIntrinsics = LayoutIntrinsics(charSequence, textPaint, textDirectionHeuristic)
     }
 }
 
-/**
- * For a given [TextDirection] return [TextLayout] constants for text direction
- * heuristics.
- */
+/** For a given [TextDirection] return [TextLayout] constants for text direction heuristics. */
 @OptIn(InternalPlatformTextApi::class)
 internal fun resolveTextDirectionHeuristics(
     textDirection: TextDirection,
@@ -158,10 +159,9 @@
         TextDirection.ContentOrRtl -> LayoutCompat.TEXT_DIRECTION_FIRST_STRONG_RTL
         TextDirection.Ltr -> LayoutCompat.TEXT_DIRECTION_LTR
         TextDirection.Rtl -> LayoutCompat.TEXT_DIRECTION_RTL
-        TextDirection.Content, TextDirection.Unspecified -> {
-            val currentLocale = localeList?.let {
-                it[0].platformLocale
-            } ?: Locale.getDefault()
+        TextDirection.Content,
+        TextDirection.Unspecified -> {
+            val currentLocale = localeList?.let { it[0].platformLocale } ?: Locale.getDefault()
             when (TextUtilsCompat.getLayoutDirectionFromLocale(currentLocale)) {
                 View.LAYOUT_DIRECTION_LTR -> LayoutCompat.TEXT_DIRECTION_FIRST_STRONG_LTR
                 View.LAYOUT_DIRECTION_RTL -> LayoutCompat.TEXT_DIRECTION_FIRST_STRONG_RTL
@@ -180,14 +180,15 @@
     placeholders: List<AnnotatedString.Range<Placeholder>>,
     density: Density,
     fontFamilyResolver: FontFamily.Resolver
-): ParagraphIntrinsics = AndroidParagraphIntrinsics(
-    text = text,
-    style = style,
-    placeholders = placeholders,
-    fontFamilyResolver = fontFamilyResolver,
-    spanStyles = spanStyles,
-    density = density
-)
+): ParagraphIntrinsics =
+    AndroidParagraphIntrinsics(
+        text = text,
+        style = style,
+        placeholders = placeholders,
+        fontFamilyResolver = fontFamilyResolver,
+        spanStyles = spanStyles,
+        density = density
+    )
 
 private class TypefaceDirtyTrackerLinkedList(
     private val resolveResult: State<Any>,
diff --git a/compose/ui/ui-text/src/androidMain/kotlin/androidx/compose/ui/text/platform/AndroidStringDelegate.android.kt b/compose/ui/ui-text/src/androidMain/kotlin/androidx/compose/ui/text/platform/AndroidStringDelegate.android.kt
index 14a88d7..dcf16cc 100644
--- a/compose/ui/ui-text/src/androidMain/kotlin/androidx/compose/ui/text/platform/AndroidStringDelegate.android.kt
+++ b/compose/ui/ui-text/src/androidMain/kotlin/androidx/compose/ui/text/platform/AndroidStringDelegate.android.kt
@@ -19,9 +19,7 @@
 import androidx.compose.ui.text.PlatformStringDelegate
 import androidx.compose.ui.text.intl.PlatformLocale
 
-/**
- * An Android implementation of StringDelegate
- */
+/** An Android implementation of StringDelegate */
 internal class AndroidStringDelegate : PlatformStringDelegate {
     override fun toUpperCase(string: String, locale: PlatformLocale): String =
         string.uppercase(locale)
@@ -30,15 +28,10 @@
         string.lowercase(locale)
 
     override fun capitalize(string: String, locale: PlatformLocale): String =
-        string.replaceFirstChar {
-            if (it.isLowerCase())
-                it.titlecase(locale)
-            else it.toString()
-        }
+        string.replaceFirstChar { if (it.isLowerCase()) it.titlecase(locale) else it.toString() }
 
     override fun decapitalize(string: String, locale: PlatformLocale): String =
         string.replaceFirstChar { it.lowercase(locale) }
 }
 
-internal actual fun ActualStringDelegate(): PlatformStringDelegate =
-    AndroidStringDelegate()
+internal actual fun ActualStringDelegate(): PlatformStringDelegate = AndroidStringDelegate()
diff --git a/compose/ui/ui-text/src/androidMain/kotlin/androidx/compose/ui/text/platform/AndroidTextPaint.android.kt b/compose/ui/ui-text/src/androidMain/kotlin/androidx/compose/ui/text/platform/AndroidTextPaint.android.kt
index 1b8d827..45c3009 100644
--- a/compose/ui/ui-text/src/androidMain/kotlin/androidx/compose/ui/text/platform/AndroidTextPaint.android.kt
+++ b/compose/ui/ui-text/src/androidMain/kotlin/androidx/compose/ui/text/platform/AndroidTextPaint.android.kt
@@ -62,16 +62,13 @@
 
     private var backingBlendMode: BlendMode = DrawScope.DefaultBlendMode
 
-    @VisibleForTesting
-    internal var shadow: Shadow = Shadow.None
+    @VisibleForTesting internal var shadow: Shadow = Shadow.None
 
-    @VisibleForTesting
-    internal var brush: Brush? = null
+    @VisibleForTesting internal var brush: Brush? = null
 
     internal var shaderState: State<Shader?>? = null
 
-    @VisibleForTesting
-    internal var brushSize: Size? = null
+    @VisibleForTesting internal var brushSize: Size? = null
 
     private var drawStyle: DrawStyle? = null
 
@@ -131,9 +128,7 @@
                     if (size.isSpecified) {
                         this.brush = brush
                         this.brushSize = size
-                        this.shaderState = derivedStateOf {
-                            brush.createShader(size)
-                        }
+                        this.shaderState = derivedStateOf { brush.createShader(size) }
                     }
                 }
                 composePaint.shader = this.shaderState?.value
@@ -179,9 +174,7 @@
             backingBlendMode = value
         }
 
-    /**
-     * Clears all shader related cache parameters and native shader property.
-     */
+    /** Clears all shader related cache parameters and native shader property. */
     private fun clearShader() {
         this.shaderState = null
         this.brush = null
@@ -190,10 +183,7 @@
     }
 }
 
-/**
- * Accepts an alpha value in the range [0f, 1f] then maps to an integer value
- * in [0, 255] range.
- */
+/** Accepts an alpha value in the range [0f, 1f] then maps to an integer value in [0, 255] range. */
 internal fun TextPaint.setAlpha(alpha: Float) {
     if (!alpha.isNaN()) {
         val alphaInt = alpha.fastCoerceIn(0f, 1f).times(255).fastRoundToInt()
diff --git a/compose/ui/ui-text/src/androidMain/kotlin/androidx/compose/ui/text/platform/AndroidTypeface.android.kt b/compose/ui/ui-text/src/androidMain/kotlin/androidx/compose/ui/text/platform/AndroidTypeface.android.kt
index f5fd858..b79d77e 100644
--- a/compose/ui/ui-text/src/androidMain/kotlin/androidx/compose/ui/text/platform/AndroidTypeface.android.kt
+++ b/compose/ui/ui-text/src/androidMain/kotlin/androidx/compose/ui/text/platform/AndroidTypeface.android.kt
@@ -22,9 +22,7 @@
 import androidx.compose.ui.text.font.FontWeight
 import androidx.compose.ui.text.font.Typeface
 
-/**
- * An interface of Android specific Typeface.
- */
+/** An interface of Android specific Typeface. */
 internal interface AndroidTypeface : Typeface {
     /**
      * Returns the Android's native Typeface to be able use for given parameters.
@@ -32,7 +30,6 @@
      * @param fontWeight A weight to be used for drawing text.
      * @param fontStyle A style to be used for drawing text.
      * @param synthesis An synthesis option for drawing text.
-     *
      * @return the Android native Typeface which has closest style to the given parameter.
      */
     fun getNativeTypeface(
diff --git a/compose/ui/ui-text/src/androidMain/kotlin/androidx/compose/ui/text/platform/AndroidTypefaceWrapper.android.kt b/compose/ui/ui-text/src/androidMain/kotlin/androidx/compose/ui/text/platform/AndroidTypefaceWrapper.android.kt
index 63ff7c7..5a486d3 100644
--- a/compose/ui/ui-text/src/androidMain/kotlin/androidx/compose/ui/text/platform/AndroidTypefaceWrapper.android.kt
+++ b/compose/ui/ui-text/src/androidMain/kotlin/androidx/compose/ui/text/platform/AndroidTypefaceWrapper.android.kt
@@ -22,9 +22,7 @@
 import androidx.compose.ui.text.font.FontSynthesis
 import androidx.compose.ui.text.font.FontWeight
 
-/**
- * [AndroidTypeface] that wraps Android [Typeface].
- */
+/** [AndroidTypeface] that wraps Android [Typeface]. */
 internal class AndroidTypefaceWrapper(val typeface: Typeface) : AndroidTypeface {
 
     override val fontFamily: FontFamily? = null
diff --git a/compose/ui/ui-text/src/androidMain/kotlin/androidx/compose/ui/text/platform/EmojiCompatStatus.android.kt b/compose/ui/ui-text/src/androidMain/kotlin/androidx/compose/ui/text/platform/EmojiCompatStatus.android.kt
index b17a3a8..e4fa77f 100644
--- a/compose/ui/ui-text/src/androidMain/kotlin/androidx/compose/ui/text/platform/EmojiCompatStatus.android.kt
+++ b/compose/ui/ui-text/src/androidMain/kotlin/androidx/compose/ui/text/platform/EmojiCompatStatus.android.kt
@@ -28,9 +28,7 @@
     val fontLoaded: State<Boolean>
 }
 
-/**
- * Used for observing emojicompat font loading status from compose.
- */
+/** Used for observing emojicompat font loading status from compose. */
 internal object EmojiCompatStatus : EmojiCompatStatusDelegate {
     private var delegate: EmojiCompatStatusDelegate = DefaultImpl()
 
@@ -53,10 +51,9 @@
     }
 }
 
-/**
- * is-a state, but doesn't cause an observation when read
- */
+/** is-a state, but doesn't cause an observation when read */
 private class ImmutableBool(override val value: Boolean) : State<Boolean>
+
 private val Falsey = ImmutableBool(false)
 
 private class DefaultImpl : EmojiCompatStatusDelegate {
@@ -64,28 +61,30 @@
     private var loadState: State<Boolean>?
 
     init {
-        loadState = if (EmojiCompat.isConfigured()) {
-            getFontLoadState()
-        } else {
-            // EC isn't configured yet, will check again in getter
-            null
-        }
+        loadState =
+            if (EmojiCompat.isConfigured()) {
+                getFontLoadState()
+            } else {
+                // EC isn't configured yet, will check again in getter
+                null
+            }
     }
 
     override val fontLoaded: State<Boolean>
-        get() = if (loadState != null) {
-            loadState!!
-        } else {
-            // EC wasn't configured last time, check again and update loadState if it's ready
-            if (EmojiCompat.isConfigured()) {
-                loadState = getFontLoadState()
+        get() =
+            if (loadState != null) {
                 loadState!!
             } else {
-                // ec disabled path
-                // no observations allowed, this is pre init
-                Falsey
+                // EC wasn't configured last time, check again and update loadState if it's ready
+                if (EmojiCompat.isConfigured()) {
+                    loadState = getFontLoadState()
+                    loadState!!
+                } else {
+                    // ec disabled path
+                    // no observations allowed, this is pre init
+                    Falsey
+                }
             }
-        }
 
     private fun getFontLoadState(): State<Boolean> {
         val ec = EmojiCompat.get()
@@ -93,16 +92,17 @@
             ImmutableBool(true)
         } else {
             val mutableLoaded = mutableStateOf(false)
-            val initCallback = object : EmojiCompat.InitCallback() {
-                override fun onInitialized() {
-                    mutableLoaded.value = true // update previous observers
-                    loadState = ImmutableBool(true) // never observe again
-                }
+            val initCallback =
+                object : EmojiCompat.InitCallback() {
+                    override fun onInitialized() {
+                        mutableLoaded.value = true // update previous observers
+                        loadState = ImmutableBool(true) // never observe again
+                    }
 
-                override fun onFailed(throwable: Throwable?) {
-                    loadState = Falsey // never observe again
+                    override fun onFailed(throwable: Throwable?) {
+                        loadState = Falsey // never observe again
+                    }
                 }
-            }
             ec.registerInitCallback(initCallback)
             mutableLoaded
         }
diff --git a/compose/ui/ui-text/src/androidMain/kotlin/androidx/compose/ui/text/platform/URLSpanCache.android.kt b/compose/ui/ui-text/src/androidMain/kotlin/androidx/compose/ui/text/platform/URLSpanCache.android.kt
index 790beec..6418529 100644
--- a/compose/ui/ui-text/src/androidMain/kotlin/androidx/compose/ui/text/platform/URLSpanCache.android.kt
+++ b/compose/ui/ui-text/src/androidMain/kotlin/androidx/compose/ui/text/platform/URLSpanCache.android.kt
@@ -31,8 +31,8 @@
 
 /**
  * This class converts [UrlAnnotation]s to [URLSpan]s, ensuring that the same instance of [URLSpan]
- * will be returned for every instance of [UrlAnnotation]. This is required for [URLSpan]s (and
- * any ClickableSpan) to be handled correctly by accessibility services, which require every
+ * will be returned for every instance of [UrlAnnotation]. This is required for [URLSpan]s (and any
+ * ClickableSpan) to be handled correctly by accessibility services, which require every
  * ClickableSpan to have a stable ID across reads from the accessibility node. A11y services convert
  * these spans to parcelable ones, then look them up later using their ID. Since the ID is a hidden
  * property, the only way to satisfy this constraint is to actually use the same [URLSpan] instance
@@ -66,9 +66,7 @@
      * This method takes a [linkRange] which is an annotation that occupies range in Compose text
      * and converts it into a ClickableSpan
      */
-    fun toClickableSpan(
-        linkRange: AnnotatedString.Range<LinkAnnotation>
-    ): ClickableSpan? =
+    fun toClickableSpan(linkRange: AnnotatedString.Range<LinkAnnotation>): ClickableSpan? =
         linkSpansWithListenerByAnnotation.getOrPut(linkRange) {
             ComposeClickableSpan(linkRange.item)
         }
diff --git a/compose/ui/ui-text/src/androidMain/kotlin/androidx/compose/ui/text/platform/extensions/LocaleExtensions.android.kt b/compose/ui/ui-text/src/androidMain/kotlin/androidx/compose/ui/text/platform/extensions/LocaleExtensions.android.kt
index a47c62e..fe326c3 100644
--- a/compose/ui/ui-text/src/androidMain/kotlin/androidx/compose/ui/text/platform/extensions/LocaleExtensions.android.kt
+++ b/compose/ui/ui-text/src/androidMain/kotlin/androidx/compose/ui/text/platform/extensions/LocaleExtensions.android.kt
@@ -23,24 +23,21 @@
 import androidx.compose.ui.text.platform.AndroidTextPaint
 
 /**
- * This class is here to ensure that the classes that use this API will get verified and can be
- * AOT compiled. It is expected that this class will soft-fail verification, but the classes
- * which use this method will pass.
+ * This class is here to ensure that the classes that use this API will get verified and can be AOT
+ * compiled. It is expected that this class will soft-fail verification, but the classes which use
+ * this method will pass.
  */
 @RequiresApi(24)
 internal object LocaleListHelperMethods {
     @RequiresApi(24)
     @DoNotInline
     fun localeSpan(localeList: LocaleList): Any =
-        LocaleSpan(
-            android.os.LocaleList(*localeList.map { it.platformLocale }.toTypedArray())
-        )
+        LocaleSpan(android.os.LocaleList(*localeList.map { it.platformLocale }.toTypedArray()))
 
     @RequiresApi(24)
     @DoNotInline
     fun setTextLocales(textPaint: AndroidTextPaint, localeList: LocaleList) {
-        textPaint.textLocales = android.os.LocaleList(
-            *localeList.map { it.platformLocale }.toTypedArray()
-        )
+        textPaint.textLocales =
+            android.os.LocaleList(*localeList.map { it.platformLocale }.toTypedArray())
     }
 }
diff --git a/compose/ui/ui-text/src/androidMain/kotlin/androidx/compose/ui/text/platform/extensions/PlaceholderExtensions.android.kt b/compose/ui/ui-text/src/androidMain/kotlin/androidx/compose/ui/text/platform/extensions/PlaceholderExtensions.android.kt
index 5cc4bee..accd4d6 100644
--- a/compose/ui/ui-text/src/androidMain/kotlin/androidx/compose/ui/text/platform/extensions/PlaceholderExtensions.android.kt
+++ b/compose/ui/ui-text/src/androidMain/kotlin/androidx/compose/ui/text/platform/extensions/PlaceholderExtensions.android.kt
@@ -45,9 +45,7 @@
     end: Int,
     density: Density
 ) {
-    getSpans(start, end, EmojiSpan::class.java).forEach {
-        removeSpan(it)
-    }
+    getSpans(start, end, EmojiSpan::class.java).forEach { removeSpan(it) }
     setSpan(
         with(placeholder) {
             PlaceholderSpan(
@@ -68,11 +66,12 @@
 @OptIn(InternalPlatformTextApi::class)
 @Suppress("DEPRECATION")
 private val TextUnit.spanUnit: Int
-    get() = when (type) {
-        TextUnitType.Sp -> PlaceholderSpan.UNIT_SP
-        TextUnitType.Em -> PlaceholderSpan.UNIT_EM
-        else -> PlaceholderSpan.UNIT_UNSPECIFIED
-    }
+    get() =
+        when (type) {
+            TextUnitType.Sp -> PlaceholderSpan.UNIT_SP
+            TextUnitType.Em -> PlaceholderSpan.UNIT_EM
+            else -> PlaceholderSpan.UNIT_UNSPECIFIED
+        }
 
 /**
  * Helper function that converts [PlaceholderVerticalAlign] to the verticalAlign in
@@ -80,13 +79,14 @@
  */
 @OptIn(InternalPlatformTextApi::class)
 private val PlaceholderVerticalAlign.spanVerticalAlign: Int
-    get() = when (this) {
-        PlaceholderVerticalAlign.AboveBaseline -> PlaceholderSpan.ALIGN_ABOVE_BASELINE
-        PlaceholderVerticalAlign.Top -> PlaceholderSpan.ALIGN_TOP
-        PlaceholderVerticalAlign.Bottom -> PlaceholderSpan.ALIGN_BOTTOM
-        PlaceholderVerticalAlign.Center -> PlaceholderSpan.ALIGN_CENTER
-        PlaceholderVerticalAlign.TextTop -> PlaceholderSpan.ALIGN_TEXT_TOP
-        PlaceholderVerticalAlign.TextBottom -> PlaceholderSpan.ALIGN_TEXT_BOTTOM
-        PlaceholderVerticalAlign.TextCenter -> PlaceholderSpan.ALIGN_TEXT_CENTER
-        else -> error("Invalid PlaceholderVerticalAlign")
-    }
+    get() =
+        when (this) {
+            PlaceholderVerticalAlign.AboveBaseline -> PlaceholderSpan.ALIGN_ABOVE_BASELINE
+            PlaceholderVerticalAlign.Top -> PlaceholderSpan.ALIGN_TOP
+            PlaceholderVerticalAlign.Bottom -> PlaceholderSpan.ALIGN_BOTTOM
+            PlaceholderVerticalAlign.Center -> PlaceholderSpan.ALIGN_CENTER
+            PlaceholderVerticalAlign.TextTop -> PlaceholderSpan.ALIGN_TEXT_TOP
+            PlaceholderVerticalAlign.TextBottom -> PlaceholderSpan.ALIGN_TEXT_BOTTOM
+            PlaceholderVerticalAlign.TextCenter -> PlaceholderSpan.ALIGN_TEXT_CENTER
+            else -> error("Invalid PlaceholderVerticalAlign")
+        }
diff --git a/compose/ui/ui-text/src/androidMain/kotlin/androidx/compose/ui/text/platform/extensions/SpannableExtensions.android.kt b/compose/ui/ui-text/src/androidMain/kotlin/androidx/compose/ui/text/platform/extensions/SpannableExtensions.android.kt
index 028c137..eaa7c1c 100644
--- a/compose/ui/ui-text/src/androidMain/kotlin/androidx/compose/ui/text/platform/extensions/SpannableExtensions.android.kt
+++ b/compose/ui/ui-text/src/androidMain/kotlin/androidx/compose/ui/text/platform/extensions/SpannableExtensions.android.kt
@@ -91,21 +91,20 @@
         if (indent.firstLine == 0.sp && indent.restLine == 0.sp) return@let
         if (indent.firstLine.isUnspecified || indent.restLine.isUnspecified) return@let
         with(density) {
-            val firstLine = when (indent.firstLine.type) {
-                TextUnitType.Sp -> indent.firstLine.toPx()
-                TextUnitType.Em -> indent.firstLine.value * contextFontSize
-                else -> 0f
-            }
-            val restLine = when (indent.restLine.type) {
-                TextUnitType.Sp -> indent.restLine.toPx()
-                TextUnitType.Em -> indent.restLine.value * contextFontSize
-                else -> 0f
-            }
+            val firstLine =
+                when (indent.firstLine.type) {
+                    TextUnitType.Sp -> indent.firstLine.toPx()
+                    TextUnitType.Em -> indent.firstLine.value * contextFontSize
+                    else -> 0f
+                }
+            val restLine =
+                when (indent.restLine.type) {
+                    TextUnitType.Sp -> indent.restLine.toPx()
+                    TextUnitType.Em -> indent.restLine.value * contextFontSize
+                    else -> 0f
+                }
             setSpan(
-                LeadingMarginSpan.Standard(
-                    ceil(firstLine).toInt(),
-                    ceil(restLine).toInt()
-                ),
+                LeadingMarginSpan.Standard(ceil(firstLine).toInt(), ceil(restLine).toInt()),
                 0,
                 length
             )
@@ -126,14 +125,15 @@
         // it won't apply trimLastLineBottom rule
         val endIndex = if (isEmpty() || last() == '\n') length + 1 else length
         setSpan(
-            span = LineHeightStyleSpan(
-                lineHeight = resolvedLineHeight,
-                startIndex = 0,
-                endIndex = endIndex,
-                trimFirstLineTop = lineHeightStyle.trim.isTrimFirstLineTop(),
-                trimLastLineBottom = lineHeightStyle.trim.isTrimLastLineBottom(),
-                topRatio = lineHeightStyle.alignment.topRatio
-            ),
+            span =
+                LineHeightStyleSpan(
+                    lineHeight = resolvedLineHeight,
+                    startIndex = 0,
+                    endIndex = endIndex,
+                    trimFirstLineTop = lineHeightStyle.trim.isTrimFirstLineTop(),
+                    trimLastLineBottom = lineHeightStyle.trim.isTrimLastLineBottom(),
+                    topRatio = lineHeightStyle.alignment.topRatio
+                ),
             start = 0,
             end = length
         )
@@ -148,11 +148,7 @@
 ) {
     val resolvedLineHeight = resolveLineHeightInPx(lineHeight, contextFontSize, density)
     if (!resolvedLineHeight.isNaN()) {
-        setSpan(
-            span = LineHeightSpan(lineHeight = resolvedLineHeight),
-            start = 0,
-            end = length
-        )
+        setSpan(span = LineHeightSpan(lineHeight = resolvedLineHeight), start = 0, end = length)
     }
 }
 
@@ -199,10 +195,7 @@
 
         if (start < 0 || start >= length || end <= start || end > length) continue
 
-        setSpanStyle(
-            spanStyleRange,
-            density
-        )
+        setSpanStyle(spanStyleRange, density)
 
         if (spanStyleRange.item.needsLetterSpacingSpan) {
             hasLetterSpacing = true
@@ -223,9 +216,7 @@
 
             if (start < 0 || start >= length || end <= start || end > length) continue
 
-            createLetterSpacingSpan(style.letterSpacing, density)?.let {
-                setSpan(it, start, end)
-            }
+            createLetterSpacingSpan(style.letterSpacing, density)?.let { setSpan(it, start, end) }
         }
     }
 }
@@ -271,21 +262,16 @@
  * and we have to resolve font settings and create typeface first and then set it directly on
  * TextPaint.
  *
- * Notice that a [contextTextStyle] is also required when we flatten the font related styles.
- * For example:
- *  the entire text has the TextStyle(fontFamily = Sans-serif)
- *  Hi Hello World
- *  [ bold ]
- * FontWeight.Bold is set in range [0, 8).
- * The resolved TypefaceSpan should be TypefaceSpan("Sans-serif", "bold") in range [0, 8).
- * As demonstrated above, the fontFamily information is from [contextTextStyle].
- *
- * @see flattenFontStylesAndApply
+ * Notice that a [contextTextStyle] is also required when we flatten the font related styles. For
+ * example: the entire text has the TextStyle(fontFamily = Sans-serif) Hi Hello World [ bold ]
+ * FontWeight.Bold is set in range
+ * [0, 8). The resolved TypefaceSpan should be TypefaceSpan("Sans-serif", "bold") in range [0, 8). As demonstrated above, the fontFamily information is from [contextTextStyle].
  *
  * @param contextTextStyle the global [TextStyle] for the entire string.
  * @param spanStyles the [spanStyles] to be applied, this function will first filter out the font
- * related [SpanStyle]s and then apply them to this [Spannable].
+ *   related [SpanStyle]s and then apply them to this [Spannable].
  * @param fontFamilyResolver the [Font.ResourceLoader] used to resolve font.
+ * @see flattenFontStylesAndApply
  */
 @OptIn(InternalPlatformTextApi::class)
 private fun Spannable.setFontAttributes(
@@ -293,27 +279,25 @@
     spanStyles: List<AnnotatedString.Range<SpanStyle>>,
     resolveTypeface: (FontFamily?, FontWeight, FontStyle, FontSynthesis) -> Typeface,
 ) {
-    val fontRelatedSpanStyles = spanStyles.fastFilter {
-        it.item.hasFontAttributes() || it.item.fontSynthesis != null
-    }
+    val fontRelatedSpanStyles =
+        spanStyles.fastFilter { it.item.hasFontAttributes() || it.item.fontSynthesis != null }
 
     // Create a SpanStyle if contextTextStyle has font related attributes, otherwise use
     // null to avoid unnecessary object creation.
-    val contextFontSpanStyle = if (contextTextStyle.hasFontAttributes()) {
-        SpanStyle(
-            fontFamily = contextTextStyle.fontFamily,
-            fontWeight = contextTextStyle.fontWeight,
-            fontStyle = contextTextStyle.fontStyle,
-            fontSynthesis = contextTextStyle.fontSynthesis
-        )
-    } else {
-        null
-    }
+    val contextFontSpanStyle =
+        if (contextTextStyle.hasFontAttributes()) {
+            SpanStyle(
+                fontFamily = contextTextStyle.fontFamily,
+                fontWeight = contextTextStyle.fontWeight,
+                fontStyle = contextTextStyle.fontStyle,
+                fontSynthesis = contextTextStyle.fontSynthesis
+            )
+        } else {
+            null
+        }
 
-    flattenFontStylesAndApply(
-        contextFontSpanStyle,
-        fontRelatedSpanStyles
-    ) { spanStyle, start, end ->
+    flattenFontStylesAndApply(contextFontSpanStyle, fontRelatedSpanStyles) { spanStyle, start, end
+        ->
         setSpan(
             TypefaceSpan(
                 resolveTypeface(
@@ -334,9 +318,9 @@
  * Flatten styles in the [spanStyles], so that overlapping styles are merged, and then apply the
  * [block] on the merged [SpanStyle].
  *
- * @param contextFontSpanStyle the global [SpanStyle]. It act as if every [spanStyles] is applied
- * on top of it. This parameter is nullable. A null value is exactly the same as a default
- * SpanStyle, but avoids unnecessary object creation.
+ * @param contextFontSpanStyle the global [SpanStyle]. It act as if every [spanStyles] is applied on
+ *   top of it. This parameter is nullable. A null value is exactly the same as a default SpanStyle,
+ *   but avoids unnecessary object creation.
  * @param spanStyles the input [SpanStyle] ranges to be flattened.
  * @param block the function to be applied on the merged [SpanStyle].
  */
@@ -385,15 +369,18 @@
             // Empty spans do not intersect with anything, skip them.
             if (
                 spanStyle.start != spanStyle.end &&
-                intersect(lastTransitionOffsets, transitionOffset, spanStyle.start, spanStyle.end)
+                    intersect(
+                        lastTransitionOffsets,
+                        transitionOffset,
+                        spanStyle.start,
+                        spanStyle.end
+                    )
             ) {
                 mergedSpanStyle = mergedSpanStyle.merge(spanStyle.item)
             }
         }
 
-        mergedSpanStyle?.let {
-            block(it, lastTransitionOffsets, transitionOffset)
-        }
+        mergedSpanStyle?.let { block(it, lastTransitionOffsets, transitionOffset) }
 
         lastTransitionOffsets = transitionOffset
     }
@@ -406,9 +393,7 @@
     density: Density
 ): MetricAffectingSpan? {
     return when (letterSpacing.type) {
-        TextUnitType.Sp -> with(density) {
-            LetterSpacingSpanPx(letterSpacing.toPx())
-        }
+        TextUnitType.Sp -> with(density) { LetterSpacingSpanPx(letterSpacing.toPx()) }
         TextUnitType.Em -> {
             LetterSpacingSpanEm(letterSpacing.value)
         }
@@ -439,18 +424,12 @@
 
 @OptIn(InternalPlatformTextApi::class)
 private fun Spannable.setDrawStyle(drawStyle: DrawStyle?, start: Int, end: Int) {
-    drawStyle?.let {
-        setSpan(DrawStyleSpan(it), start, end)
-    }
+    drawStyle?.let { setSpan(DrawStyleSpan(it), start, end) }
 }
 
 internal fun Spannable.setBackground(color: Color, start: Int, end: Int) {
     if (color.isSpecified) {
-        setSpan(
-            BackgroundColorSpan(color.toArgb()),
-            start,
-            end
-        )
+        setSpan(BackgroundColorSpan(color.toArgb()), start, end)
     }
 }
 
@@ -483,36 +462,35 @@
 
 @OptIn(InternalPlatformTextApi::class)
 private fun Spannable.setFontFeatureSettings(fontFeatureSettings: String?, start: Int, end: Int) {
-    fontFeatureSettings?.let {
-        setSpan(FontFeatureSpan(it), start, end)
-    }
+    fontFeatureSettings?.let { setSpan(FontFeatureSpan(it), start, end) }
 }
 
 @Suppress("DEPRECATION")
 internal fun Spannable.setFontSize(fontSize: TextUnit, density: Density, start: Int, end: Int) {
     when (fontSize.type) {
-        TextUnitType.Sp -> with(density) {
-            setSpan(
-                AbsoluteSizeSpan(/* size */ fontSize.toPx().roundToInt(), /* dip */ false),
-                start,
-                end
-            )
-        }
+        TextUnitType.Sp ->
+            with(density) {
+                setSpan(
+                    AbsoluteSizeSpan(/* size */ fontSize.toPx().roundToInt(), /* dip */ false),
+                    start,
+                    end
+                )
+            }
         TextUnitType.Em -> {
             setSpan(RelativeSizeSpan(fontSize.value), start, end)
         }
-        else -> {
-        } // Do nothing
+        else -> {} // Do nothing
     }
 }
 
 @OptIn(InternalPlatformTextApi::class)
 internal fun Spannable.setTextDecoration(textDecoration: TextDecoration?, start: Int, end: Int) {
     textDecoration?.let {
-        val textDecorationSpan = TextDecorationSpan(
-            isUnderlineText = TextDecoration.Underline in it,
-            isStrikethroughText = TextDecoration.LineThrough in it
-        )
+        val textDecorationSpan =
+            TextDecorationSpan(
+                isUnderlineText = TextDecoration.Underline in it,
+                isStrikethroughText = TextDecoration.LineThrough in it
+            )
         setSpan(textDecorationSpan, start, end)
     }
 }
@@ -525,17 +503,10 @@
 
 @OptIn(InternalPlatformTextApi::class)
 private fun Spannable.setBaselineShift(baselineShift: BaselineShift?, start: Int, end: Int) {
-    baselineShift?.let {
-        setSpan(BaselineShiftSpan(it.multiplier), start, end)
-    }
+    baselineShift?.let { setSpan(BaselineShiftSpan(it.multiplier), start, end) }
 }
 
-private fun Spannable.setBrush(
-    brush: Brush?,
-    alpha: Float,
-    start: Int,
-    end: Int
-) {
+private fun Spannable.setBrush(brush: Brush?, alpha: Float, start: Int, end: Int) {
     brush?.let {
         when (brush) {
             is SolidColor -> {
@@ -550,15 +521,14 @@
 
 /**
  * Returns true if there is any font settings on this [TextStyle].
+ *
  * @see hasFontAttributes
  */
 private fun TextStyle.hasFontAttributes(): Boolean {
     return toSpanStyle().hasFontAttributes() || fontSynthesis != null
 }
 
-/**
- * Helper function that merges a nullable [SpanStyle] with another [SpanStyle].
- */
+/** Helper function that merges a nullable [SpanStyle] with another [SpanStyle]. */
 private fun SpanStyle?.merge(spanStyle: SpanStyle): SpanStyle {
     if (this == null) return spanStyle
     return this.merge(spanStyle)
diff --git a/compose/ui/ui-text/src/androidMain/kotlin/androidx/compose/ui/text/platform/extensions/TextPaintExtensions.android.kt b/compose/ui/ui-text/src/androidMain/kotlin/androidx/compose/ui/text/platform/extensions/TextPaintExtensions.android.kt
index b231989..f6e8747 100644
--- a/compose/ui/ui-text/src/androidMain/kotlin/androidx/compose/ui/text/platform/extensions/TextPaintExtensions.android.kt
+++ b/compose/ui/ui-text/src/androidMain/kotlin/androidx/compose/ui/text/platform/extensions/TextPaintExtensions.android.kt
@@ -50,9 +50,7 @@
     requiresLetterSpacing: Boolean = false,
 ): SpanStyle? {
     when (style.fontSize.type) {
-        TextUnitType.Sp -> with(density) {
-            textSize = style.fontSize.toPx()
-        }
+        TextUnitType.Sp -> with(density) { textSize = style.fontSize.toPx() }
         TextUnitType.Em -> {
             textSize *= style.fontSize.value
         }
@@ -60,23 +58,25 @@
     }
 
     if (style.hasFontAttributes()) {
-        typeface = resolveTypeface(
-            style.fontFamily,
-            style.fontWeight ?: FontWeight.Normal,
-            style.fontStyle ?: FontStyle.Normal,
-            style.fontSynthesis ?: FontSynthesis.All
-        )
+        typeface =
+            resolveTypeface(
+                style.fontFamily,
+                style.fontWeight ?: FontWeight.Normal,
+                style.fontStyle ?: FontStyle.Normal,
+                style.fontSynthesis ?: FontSynthesis.All
+            )
     }
 
     if (style.localeList != null && style.localeList != LocaleList.current) {
         if (Build.VERSION.SDK_INT >= 24) {
             LocaleListHelperMethods.setTextLocales(this, style.localeList)
         } else {
-            val locale = if (style.localeList.isEmpty()) {
-                Locale.current
-            } else {
-                style.localeList[0]
-            }
+            val locale =
+                if (style.localeList.isEmpty()) {
+                    Locale.current
+                } else {
+                    style.localeList[0]
+                }
             textLocale = locale.platformLocale
         }
     }
@@ -85,8 +85,9 @@
         fontFeatureSettings = style.fontFeatureSettings
     }
 
-    if (style.textGeometricTransform != null &&
-        style.textGeometricTransform != TextGeometricTransform.None
+    if (
+        style.textGeometricTransform != null &&
+            style.textGeometricTransform != TextGeometricTransform.None
     ) {
         textScaleX *= style.textGeometricTransform.scaleX
         textSkewX += style.textGeometricTransform.skewX
@@ -106,9 +107,7 @@
     // apply para level leterspacing
     if (style.letterSpacing.type == TextUnitType.Sp && style.letterSpacing.value != 0.0f) {
         val emWidth = textSize * textScaleX
-        val letterSpacingPx = with(density) {
-            style.letterSpacing.toPx()
-        }
+        val letterSpacingPx = with(density) { style.letterSpacing.toPx() }
         // Do nothing if emWidth is 0.0f.
         if (emWidth != 0.0f) {
             letterSpacing = letterSpacingPx / emWidth
@@ -133,8 +132,9 @@
 ): SpanStyle? {
     // letterSpacing needs to be reset at every metricsEffectingSpan transition - so generate
     // a span for it only if there are other spans
-    val hasLetterSpacing = requiresLetterSpacing &&
-        (letterSpacing.type == TextUnitType.Sp && letterSpacing.value != 0f)
+    val hasLetterSpacing =
+        requiresLetterSpacing &&
+            (letterSpacing.type == TextUnitType.Sp && letterSpacing.value != 0f)
 
     // baselineShift and bgColor is reset in the Android Layout constructor,
     // therefore we cannot apply them on paint, have to use spans.
@@ -145,20 +145,36 @@
         null
     } else {
         SpanStyle(
-            letterSpacing = if (hasLetterSpacing) { letterSpacing } else { TextUnit.Unspecified },
-            background = if (hasBackgroundColor) { background } else { Color.Unspecified },
-            baselineShift = if (hasBaselineShift) { baselineShift } else { null }
+            letterSpacing =
+                if (hasLetterSpacing) {
+                    letterSpacing
+                } else {
+                    TextUnit.Unspecified
+                },
+            background =
+                if (hasBackgroundColor) {
+                    background
+                } else {
+                    Color.Unspecified
+                },
+            baselineShift =
+                if (hasBaselineShift) {
+                    baselineShift
+                } else {
+                    null
+                }
         )
     }
 }
 
 internal fun AndroidTextPaint.setTextMotion(textMotion: TextMotion?) {
     val finalTextMotion = textMotion ?: TextMotion.Static
-    flags = if (finalTextMotion.subpixelTextPositioning) {
-        flags or TextPaint.SUBPIXEL_TEXT_FLAG
-    } else {
-        flags and TextPaint.SUBPIXEL_TEXT_FLAG.inv()
-    }
+    flags =
+        if (finalTextMotion.subpixelTextPositioning) {
+            flags or TextPaint.SUBPIXEL_TEXT_FLAG
+        } else {
+            flags and TextPaint.SUBPIXEL_TEXT_FLAG.inv()
+        }
     when (finalTextMotion.linearity) {
         TextMotion.Linearity.Linear -> {
             flags = flags or TextPaint.LINEAR_TEXT_FLAG
@@ -176,21 +192,20 @@
     }
 }
 
-/**
- * Returns true if this [SpanStyle] contains any font style attributes set.
- */
+/** Returns true if this [SpanStyle] contains any font style attributes set. */
 internal fun SpanStyle.hasFontAttributes(): Boolean {
     return fontFamily != null || fontStyle != null || fontWeight != null
 }
 
 /**
- * Platform shadow layer turns off shadow when blur is zero. Where as developers expect when blur
- * is zero, the shadow is still visible but without any blur. This utility function is used
- * while setting shadow on spans or paint in order to replace 0 with Float.MIN_VALUE so that the
- * shadow will still be visible and the blur is practically 0.
+ * Platform shadow layer turns off shadow when blur is zero. Where as developers expect when blur is
+ * zero, the shadow is still visible but without any blur. This utility function is used while
+ * setting shadow on spans or paint in order to replace 0 with Float.MIN_VALUE so that the shadow
+ * will still be visible and the blur is practically 0.
  */
-internal fun correctBlurRadius(blurRadius: Float) = if (blurRadius == 0f) {
-    Float.MIN_VALUE
-} else {
-    blurRadius
-}
+internal fun correctBlurRadius(blurRadius: Float) =
+    if (blurRadius == 0f) {
+        Float.MIN_VALUE
+    } else {
+        blurRadius
+    }
diff --git a/compose/ui/ui-text/src/androidMain/kotlin/androidx/compose/ui/text/platform/style/DrawStyleSpan.android.kt b/compose/ui/ui-text/src/androidMain/kotlin/androidx/compose/ui/text/platform/style/DrawStyleSpan.android.kt
index 6b5f62a..178376c 100644
--- a/compose/ui/ui-text/src/androidMain/kotlin/androidx/compose/ui/text/platform/style/DrawStyleSpan.android.kt
+++ b/compose/ui/ui-text/src/androidMain/kotlin/androidx/compose/ui/text/platform/style/DrawStyleSpan.android.kt
@@ -28,12 +28,8 @@
 import androidx.compose.ui.graphics.drawscope.Fill
 import androidx.compose.ui.graphics.drawscope.Stroke
 
-/**
- * A span that applies [ShaderBrush] to TextPaint after receiving a specified size
- */
-internal class DrawStyleSpan(
-    val drawStyle: DrawStyle
-) : CharacterStyle(), UpdateAppearance {
+/** A span that applies [ShaderBrush] to TextPaint after receiving a specified size */
+internal class DrawStyleSpan(val drawStyle: DrawStyle) : CharacterStyle(), UpdateAppearance {
     override fun updateDrawState(textPaint: TextPaint?) {
         textPaint?.run {
             when (drawStyle) {
diff --git a/compose/ui/ui-text/src/androidMain/kotlin/androidx/compose/ui/text/platform/style/ShaderBrushSpan.android.kt b/compose/ui/ui-text/src/androidMain/kotlin/androidx/compose/ui/text/platform/style/ShaderBrushSpan.android.kt
index 86f0f50..72e4df9 100644
--- a/compose/ui/ui-text/src/androidMain/kotlin/androidx/compose/ui/text/platform/style/ShaderBrushSpan.android.kt
+++ b/compose/ui/ui-text/src/androidMain/kotlin/androidx/compose/ui/text/platform/style/ShaderBrushSpan.android.kt
@@ -30,13 +30,9 @@
 import androidx.compose.ui.graphics.ShaderBrush
 import androidx.compose.ui.text.platform.setAlpha
 
-/**
- * A span that applies [ShaderBrush] to TextPaint after receiving a specified size
- */
-internal class ShaderBrushSpan(
-    val shaderBrush: ShaderBrush,
-    val alpha: Float
-) : CharacterStyle(), UpdateAppearance {
+/** A span that applies [ShaderBrush] to TextPaint after receiving a specified size */
+internal class ShaderBrushSpan(val shaderBrush: ShaderBrush, val alpha: Float) :
+    CharacterStyle(), UpdateAppearance {
 
     var size: Size by mutableStateOf(Size.Unspecified)
 
diff --git a/compose/ui/ui-text/src/androidMain/kotlin/androidx/compose/ui/text/style/LineBreak.android.kt b/compose/ui/ui-text/src/androidMain/kotlin/androidx/compose/ui/text/style/LineBreak.android.kt
index 6386ba6..fa5540c 100644
--- a/compose/ui/ui-text/src/androidMain/kotlin/androidx/compose/ui/text/style/LineBreak.android.kt
+++ b/compose/ui/ui-text/src/androidMain/kotlin/androidx/compose/ui/text/style/LineBreak.android.kt
@@ -24,26 +24,24 @@
 
 // TODO(b/246340708): Remove @sample LineBreakSample from the actual class
 /**
- * When soft wrap is enabled and the width of the text exceeds the width of its container,
- * line breaks are inserted in the text to split it over multiple lines.
+ * When soft wrap is enabled and the width of the text exceeds the width of its container, line
+ * breaks are inserted in the text to split it over multiple lines.
  *
- * There are a number of parameters that affect how the line breaks are inserted.
- * For example, the breaking algorithm can be changed to one with improved readability
- * at the cost of speed.
- * Another example is the strictness, which in some languages determines which symbols can appear
- * at the start of a line.
+ * There are a number of parameters that affect how the line breaks are inserted. For example, the
+ * breaking algorithm can be changed to one with improved readability at the cost of speed. Another
+ * example is the strictness, which in some languages determines which symbols can appear at the
+ * start of a line.
  *
- * This represents a configuration for line breaking on Android, describing [Strategy], [Strictness],
- * and [WordBreak].
+ * This represents a configuration for line breaking on Android, describing [Strategy],
+ * [Strictness], and [WordBreak].
  *
  * @sample androidx.compose.ui.text.samples.LineBreakSample
+ *
  * @sample androidx.compose.ui.text.samples.AndroidLineBreakSample
  */
 @Immutable
 @JvmInline
-actual value class LineBreak private constructor(
-    internal val mask: Int
-) {
+actual value class LineBreak private constructor(internal val mask: Int) {
 
     /**
      * This represents a configuration for line breaking on Android, describing [Strategy],
@@ -57,11 +55,7 @@
         strategy: Strategy,
         strictness: Strictness,
         wordBreak: WordBreak
-    ) : this(packBytes(
-        strategy.value,
-        strictness.value,
-        wordBreak.value
-    ))
+    ) : this(packBytes(strategy.value, strictness.value, wordBreak.value))
 
     val strategy: Strategy
         get() = Strategy(unpackByte1(mask))
@@ -76,20 +70,15 @@
         strategy: Strategy = this.strategy,
         strictness: Strictness = this.strictness,
         wordBreak: WordBreak = this.wordBreak
-    ): LineBreak = LineBreak(
-        strategy = strategy,
-        strictness = strictness,
-        wordBreak = wordBreak
-    )
+    ): LineBreak = LineBreak(strategy = strategy, strictness = strictness, wordBreak = wordBreak)
 
     override fun toString(): String =
         "LineBreak(strategy=$strategy, strictness=$strictness, wordBreak=$wordBreak)"
 
     actual companion object {
         /**
-         * The greedy, fast line breaking algorithm. Ideal for text that updates often,
-         * such as a text editor, as the text will reflow minimally.
-         *
+         * The greedy, fast line breaking algorithm. Ideal for text that updates often, such as a
+         * text editor, as the text will reflow minimally.
          * <pre>
          * +---------+
          * | This is |
@@ -105,18 +94,14 @@
          * </pre>
          */
         @Stable
-        actual val Simple: LineBreak = LineBreak(
-            packBytes(
-                Strategy.Simple.value,
-                Strictness.Normal.value,
-                WordBreak.Default.value
+        actual val Simple: LineBreak =
+            LineBreak(
+                packBytes(Strategy.Simple.value, Strictness.Normal.value, WordBreak.Default.value)
             )
-        )
 
         /**
-         * Balanced line lengths, hyphenation, and phrase-based breaking.
-         * Suitable for short text such as titles or narrow newspaper columns.
-         *
+         * Balanced line lengths, hyphenation, and phrase-based breaking. Suitable for short text
+         * such as titles or narrow newspaper columns.
          * <pre>
          * +---------+
          * | This    |
@@ -132,18 +117,14 @@
          * </pre>
          */
         @Stable
-        actual val Heading: LineBreak = LineBreak(
-            packBytes(
-                Strategy.Balanced.value,
-                Strictness.Loose.value,
-                WordBreak.Phrase.value
+        actual val Heading: LineBreak =
+            LineBreak(
+                packBytes(Strategy.Balanced.value, Strictness.Loose.value, WordBreak.Phrase.value)
             )
-        )
 
         /**
-         * Slower, higher quality line breaking for improved readability.
-         * Suitable for larger amounts of text.
-         *
+         * Slower, higher quality line breaking for improved readability. Suitable for larger
+         * amounts of text.
          * <pre>
          * +---------+
          * | This    |
@@ -159,32 +140,29 @@
          * </pre>
          */
         @Stable
-        actual val Paragraph: LineBreak = LineBreak(
-            packBytes(
-                Strategy.HighQuality.value,
-                Strictness.Strict.value,
-                WordBreak.Default.value
+        actual val Paragraph: LineBreak =
+            LineBreak(
+                packBytes(
+                    Strategy.HighQuality.value,
+                    Strictness.Strict.value,
+                    WordBreak.Default.value
+                )
             )
-        )
 
         /**
-         * This represents an unset value, a usual replacement for "null" when a primitive value
-         * is desired.
+         * This represents an unset value, a usual replacement for "null" when a primitive value is
+         * desired.
          */
-        @Stable
-        actual val Unspecified: LineBreak = LineBreak(0)
+        @Stable actual val Unspecified: LineBreak = LineBreak(0)
     }
 
-    /**
-     * The strategy used for line breaking.
-     */
+    /** The strategy used for line breaking. */
     @JvmInline
     value class Strategy internal constructor(internal val value: Int) {
         companion object {
             /**
-             * Basic, fast break strategy. Hyphenation, if enabled, is done only for words
-             * that don't fit on an entire line by themselves.
-             *
+             * Basic, fast break strategy. Hyphenation, if enabled, is done only for words that
+             * don't fit on an entire line by themselves.
              * <pre>
              * +---------+
              * | This is |
@@ -197,9 +175,8 @@
             val Simple: Strategy = Strategy(1)
 
             /**
-             * Does whole paragraph optimization for more readable text,
-             * including hyphenation if enabled.
-             *
+             * Does whole paragraph optimization for more readable text, including hyphenation if
+             * enabled.
              * <pre>
              * +---------+
              * | This    |
@@ -212,9 +189,8 @@
             val HighQuality: Strategy = Strategy(2)
 
             /**
-             * Attempts to balance the line lengths of the text, also applying automatic
-             * hyphenation if enabled. Suitable for small screens.
-             *
+             * Attempts to balance the line lengths of the text, also applying automatic hyphenation
+             * if enabled. Suitable for small screens.
              * <pre>
              * +-----------------------+
              * | This is an            |
@@ -231,18 +207,19 @@
             val Unspecified: Strategy = Strategy(0)
         }
 
-        override fun toString(): String = when (this) {
-            Simple -> "Strategy.Simple"
-            HighQuality -> "Strategy.HighQuality"
-            Balanced -> "Strategy.Balanced"
-            Unspecified -> "Strategy.Unspecified"
-            else -> "Invalid"
-        }
+        override fun toString(): String =
+            when (this) {
+                Simple -> "Strategy.Simple"
+                HighQuality -> "Strategy.HighQuality"
+                Balanced -> "Strategy.Balanced"
+                Unspecified -> "Strategy.Unspecified"
+                else -> "Invalid"
+            }
     }
 
     /**
-     * Describes the strictness of line breaking, determining before which characters
-     * line breaks can be inserted. It is useful when working with CJK scripts.
+     * Describes the strictness of line breaking, determining before which characters line breaks
+     * can be inserted. It is useful when working with CJK scripts.
      */
     @JvmInline
     value class Strictness internal constructor(internal val value: Int) {
@@ -262,16 +239,16 @@
             /**
              * The most common rules for line breaking.
              *
-             * For example, in Japanese it allows breaking before characters like
-             * small hiragana (ぁ), small katakana (ァ), halfwidth variants (ｧ).
+             * For example, in Japanese it allows breaking before characters like small hiragana
+             * (ぁ), small katakana (ァ), halfwidth variants (ｧ).
              */
             val Normal: Strictness = Strictness(3)
 
             /**
              * The most stringent rules for line breaking.
              *
-             * For example, in Japanese it does not allow breaking before characters like
-             * small hiragana (ぁ), small katakana (ァ), halfwidth variants (ｧ).
+             * For example, in Japanese it does not allow breaking before characters like small
+             * hiragana (ぁ), small katakana (ァ), halfwidth variants (ｧ).
              */
             val Strict: Strictness = Strictness(4)
 
@@ -282,28 +259,25 @@
             val Unspecified: Strictness = Strictness(0)
         }
 
-        override fun toString(): String = when (this) {
-            Default -> "Strictness.None"
-            Loose -> "Strictness.Loose"
-            Normal -> "Strictness.Normal"
-            Strict -> "Strictness.Strict"
-            Unspecified -> "Strictness.Unspecified"
-            else -> "Invalid"
-        }
+        override fun toString(): String =
+            when (this) {
+                Default -> "Strictness.None"
+                Loose -> "Strictness.Loose"
+                Normal -> "Strictness.Normal"
+                Strict -> "Strictness.Strict"
+                Unspecified -> "Strictness.Unspecified"
+                else -> "Invalid"
+            }
     }
 
-    /**
-     * Describes how line breaks should be inserted within words.
-     */
+    /** Describes how line breaks should be inserted within words. */
     @JvmInline
     value class WordBreak internal constructor(internal val value: Int) {
         companion object {
             /**
-             * Default word breaking rules for the locale.
-             * In latin scripts this means inserting line breaks between words,
-             * while in languages that don't use whitespace (e.g. Japanese) the line can break
-             * between characters.
-             *
+             * Default word breaking rules for the locale. In latin scripts this means inserting
+             * line breaks between words, while in languages that don't use whitespace (e.g.
+             * Japanese) the line can break between characters.
              * <pre>
              * +---------+
              * | This is |
@@ -321,11 +295,9 @@
             val Default: WordBreak = WordBreak(1)
 
             /**
-             * Line breaking is based on phrases.
-             * In languages that don't use whitespace (e.g. Japanese), line breaks are not inserted
-             * between characters that are part of the same phrase unit.
-             * This is ideal for short text such as titles and UI labels.
-             *
+             * Line breaking is based on phrases. In languages that don't use whitespace (e.g.
+             * Japanese), line breaks are not inserted between characters that are part of the same
+             * phrase unit. This is ideal for short text such as titles and UI labels.
              * <pre>
              * +---------+
              * | This    |
@@ -349,12 +321,13 @@
             val Unspecified: WordBreak = WordBreak(0)
         }
 
-        override fun toString(): String = when (this) {
-            Default -> "WordBreak.None"
-            Phrase -> "WordBreak.Phrase"
-            Unspecified -> "WordBreak.Unspecified"
-            else -> "Invalid"
-        }
+        override fun toString(): String =
+            when (this) {
+                Default -> "WordBreak.None"
+                Phrase -> "WordBreak.Phrase"
+                Unspecified -> "WordBreak.Unspecified"
+                else -> "Invalid"
+            }
     }
 }
 
@@ -364,7 +337,6 @@
  * A byte can represent any value between 0 and 256.
  *
  * Only the 8 least significant bits of any given value are packed into the returned Integer.
- *
  */
 private fun packBytes(i1: Int, i2: Int, i3: Int): Int {
     return i1 or (i2 shl 8) or (i3 shl 16)
diff --git a/compose/ui/ui-text/src/androidMain/kotlin/androidx/compose/ui/text/style/TextMotion.android.kt b/compose/ui/ui-text/src/androidMain/kotlin/androidx/compose/ui/text/style/TextMotion.android.kt
index eca6c08..ff840b9 100644
--- a/compose/ui/ui-text/src/androidMain/kotlin/androidx/compose/ui/text/style/TextMotion.android.kt
+++ b/compose/ui/ui-text/src/androidMain/kotlin/androidx/compose/ui/text/style/TextMotion.android.kt
@@ -18,11 +18,10 @@
 
 import androidx.compose.runtime.Immutable
 
-/**
- * Implementation of possible TextMotion configurations on Android.
- */
+/** Implementation of possible TextMotion configurations on Android. */
 @Immutable
-actual class TextMotion internal constructor(
+actual class TextMotion
+internal constructor(
     internal val linearity: Linearity,
     internal val subpixelTextPositioning: Boolean
 ) {
@@ -34,10 +33,8 @@
     internal fun copy(
         linearity: Linearity = this.linearity,
         subpixelTextPositioning: Boolean = this.subpixelTextPositioning
-    ): TextMotion = TextMotion(
-        linearity = linearity,
-        subpixelTextPositioning = subpixelTextPositioning
-    )
+    ): TextMotion =
+        TextMotion(linearity = linearity, subpixelTextPositioning = subpixelTextPositioning)
 
     override fun equals(other: Any?): Boolean {
         if (this === other) return true
@@ -87,11 +84,12 @@
             val None = Linearity(3)
         }
 
-        override fun toString(): String = when (this) {
-            Linear -> "Linearity.Linear"
-            FontHinting -> "Linearity.FontHinting"
-            None -> "Linearity.None"
-            else -> "Invalid"
-        }
+        override fun toString(): String =
+            when (this) {
+                Linear -> "Linearity.Linear"
+                FontHinting -> "Linearity.FontHinting"
+                None -> "Linearity.None"
+                else -> "Invalid"
+            }
     }
 }
diff --git a/compose/ui/ui-text/src/androidUnitTest/kotlin/androidx/compose/ui/text/AnnotatedStringBuilderTest.kt b/compose/ui/ui-text/src/androidUnitTest/kotlin/androidx/compose/ui/text/AnnotatedStringBuilderTest.kt
index 4113024..96220ed 100644
--- a/compose/ui/ui-text/src/androidUnitTest/kotlin/androidx/compose/ui/text/AnnotatedStringBuilderTest.kt
+++ b/compose/ui/ui-text/src/androidUnitTest/kotlin/androidx/compose/ui/text/AnnotatedStringBuilderTest.kt
@@ -65,14 +65,13 @@
     fun addStyle_withSpanStyle_addsStyle() {
         val style = SpanStyle(color = Color.Red)
         val range = TextRange(0, 1)
-        val annotatedString = with(AnnotatedString.Builder("ab")) {
-            addStyle(style, range.start, range.end)
-            toAnnotatedString()
-        }
+        val annotatedString =
+            with(AnnotatedString.Builder("ab")) {
+                addStyle(style, range.start, range.end)
+                toAnnotatedString()
+            }
 
-        val expectedSpanStyles = listOf(
-            Range(style, range.start, range.end)
-        )
+        val expectedSpanStyles = listOf(Range(style, range.start, range.end))
 
         assertThat(annotatedString.paragraphStyles).isEmpty()
         assertThat(annotatedString.spanStyles).isEqualTo(expectedSpanStyles)
@@ -82,14 +81,13 @@
     fun addStyle_withParagraphStyle_addsStyle() {
         val style = ParagraphStyle(lineHeight = 30.sp)
         val range = TextRange(0, 1)
-        val annotatedString = with(AnnotatedString.Builder("ab")) {
-            addStyle(style, range.start, range.end)
-            toAnnotatedString()
-        }
+        val annotatedString =
+            with(AnnotatedString.Builder("ab")) {
+                addStyle(style, range.start, range.end)
+                toAnnotatedString()
+            }
 
-        val expectedParagraphStyles = listOf(
-            Range(style, range.start, range.end)
-        )
+        val expectedParagraphStyles = listOf(Range(style, range.start, range.end))
 
         assertThat(annotatedString.spanStyles).isEmpty()
         assertThat(annotatedString.paragraphStyles).isEqualTo(expectedParagraphStyles)
@@ -99,10 +97,11 @@
     fun append_withString_appendsTheText() {
         val text = "a"
         val appendedText = "b"
-        val annotatedString = with(AnnotatedString.Builder(text)) {
-            append(appendedText)
-            toAnnotatedString()
-        }
+        val annotatedString =
+            with(AnnotatedString.Builder(text)) {
+                append(appendedText)
+                toAnnotatedString()
+            }
 
         val expectedString = "$text$appendedText"
 
@@ -113,11 +112,12 @@
 
     @Test
     fun append_withString_andMultipleCalls_appendsAllOfTheText() {
-        val annotatedString = with(AnnotatedString.Builder("a")) {
-            append("b")
-            append("c")
-            toAnnotatedString()
-        }
+        val annotatedString =
+            with(AnnotatedString.Builder("a")) {
+                append("b")
+                append("c")
+                toAnnotatedString()
+            }
 
         assertThat(annotatedString.text).isEqualTo("abc")
     }
@@ -127,52 +127,45 @@
         val color = Color.Red
         val text = "a"
         val lineHeight = 20.sp
-        val annotatedString = createAnnotatedString(
-            text = text,
-            color = color,
-            lineHeight = lineHeight
-        )
+        val annotatedString =
+            createAnnotatedString(text = text, color = color, lineHeight = lineHeight)
 
         val appendedColor = Color.Blue
         val appendedText = "b"
         val appendedLineHeight = 30.sp
-        val appendedAnnotatedString = createAnnotatedString(
-            text = appendedText,
-            color = appendedColor,
-            lineHeight = appendedLineHeight
-        )
+        val appendedAnnotatedString =
+            createAnnotatedString(
+                text = appendedText,
+                color = appendedColor,
+                lineHeight = appendedLineHeight
+            )
 
-        val buildResult = with(AnnotatedString.Builder(annotatedString)) {
-            append(appendedAnnotatedString)
-            toAnnotatedString()
-        }
+        val buildResult =
+            with(AnnotatedString.Builder(annotatedString)) {
+                append(appendedAnnotatedString)
+                toAnnotatedString()
+            }
 
         val expectedString = "$text$appendedText"
-        val expectedSpanStyles = listOf(
-            Range(
-                item = SpanStyle(color),
-                start = 0,
-                end = text.length
-            ),
-            Range(
-                item = SpanStyle(appendedColor),
-                start = text.length,
-                end = expectedString.length
+        val expectedSpanStyles =
+            listOf(
+                Range(item = SpanStyle(color), start = 0, end = text.length),
+                Range(
+                    item = SpanStyle(appendedColor),
+                    start = text.length,
+                    end = expectedString.length
+                )
             )
-        )
 
-        val expectedParagraphStyles = listOf(
-            Range(
-                item = ParagraphStyle(lineHeight = lineHeight),
-                start = 0,
-                end = text.length
-            ),
-            Range(
-                item = ParagraphStyle(lineHeight = appendedLineHeight),
-                start = text.length,
-                end = expectedString.length
+        val expectedParagraphStyles =
+            listOf(
+                Range(item = ParagraphStyle(lineHeight = lineHeight), start = 0, end = text.length),
+                Range(
+                    item = ParagraphStyle(lineHeight = appendedLineHeight),
+                    start = text.length,
+                    end = expectedString.length
+                )
             )
-        )
 
         assertThat(buildResult.text).isEqualTo(expectedString)
         assertThat(buildResult.spanStyles).isEqualTo(expectedSpanStyles)
@@ -182,82 +175,106 @@
     @Test
     fun append_withAnnotatedStringAndRange_appendsTheText() {
         val text = "a"
-        val annotatedString = AnnotatedString(
-            text = text,
-            spanStylesOrNull = listOf(
-                text.inclusiveRangeOf('a', 'a', item = SpanStyle(color = Color.Red))
-            ),
-            paragraphStylesOrNull = listOf(
-                text.inclusiveRangeOf('a', 'a', item = ParagraphStyle(lineHeight = 20.sp))
-            ),
-            annotations = listOf(
-                text.inclusiveRangeOf('a', 'a', item = "prefix", tag = "prefixTag")
+        val annotatedString =
+            AnnotatedString(
+                text = text,
+                spanStylesOrNull =
+                    listOf(text.inclusiveRangeOf('a', 'a', item = SpanStyle(color = Color.Red))),
+                paragraphStylesOrNull =
+                    listOf(
+                        text.inclusiveRangeOf('a', 'a', item = ParagraphStyle(lineHeight = 20.sp))
+                    ),
+                annotations =
+                    listOf(text.inclusiveRangeOf('a', 'a', item = "prefix", tag = "prefixTag"))
             )
-        )
 
         // We want to test the cross product of the following cases:
         // - Range beginning at start, ending at end-1, completely overlapping [start,end), and
         //   completely inside (start, end-1).
         // - SpanStyle, ParagraphStyle, annotation
         val appendedText = "bcdef"
-        val appendedSpanStyles = listOf(
-            appendedText.inclusiveRangeOf('b', 'f', item = SpanStyle(color = Color.Blue)),
-            appendedText.inclusiveRangeOf('c', 'f', item = SpanStyle(color = Color.Green)),
-            appendedText.inclusiveRangeOf('b', 'e', item = SpanStyle(color = Color.Yellow)),
-            appendedText.inclusiveRangeOf('c', 'e', item = SpanStyle(color = Color.Magenta)),
-        )
-        // Paragraph styles can't overlap.
-        val appendedParagraphStyles = listOf(
-            appendedText.inclusiveRangeOf('b', 'b', item = ParagraphStyle(lineHeight = 30.sp)),
-            appendedText.inclusiveRangeOf('c', 'c', item = ParagraphStyle(lineHeight = 40.sp)),
-            appendedText.inclusiveRangeOf('d', 'd', item = ParagraphStyle(lineHeight = 50.sp)),
-            appendedText.inclusiveRangeOf('e', 'e', item = ParagraphStyle(lineHeight = 60.sp)),
-            appendedText.inclusiveRangeOf('f', 'f', item = ParagraphStyle(lineHeight = 70.sp)),
-        )
-        val appendedAnnotations = listOf(
-            appendedText.inclusiveRangeOf('b', 'f', item = 1, tag = "tag1"),
-            appendedText.inclusiveRangeOf('c', 'f', item = 2, tag = "tag2"),
-            appendedText.inclusiveRangeOf('b', 'e', item = 3, tag = "tag3"),
-            appendedText.inclusiveRangeOf('c', 'e', item = 4, tag = "tag4"),
-        )
-        val appendedAnnotatedString = AnnotatedString(
-            text = appendedText,
-            spanStylesOrNull = appendedSpanStyles,
-            paragraphStylesOrNull = appendedParagraphStyles,
-            annotations = appendedAnnotations
-        )
-
-        val buildResult = with(AnnotatedString.Builder(annotatedString)) {
-            // Append everything but the first and last characters of the appended string.
-            append(
-                appendedAnnotatedString,
-                start = appendedText.indexOf('c'),
-                end = appendedText.indexOf('e') + 1
+        val appendedSpanStyles =
+            listOf(
+                appendedText.inclusiveRangeOf('b', 'f', item = SpanStyle(color = Color.Blue)),
+                appendedText.inclusiveRangeOf('c', 'f', item = SpanStyle(color = Color.Green)),
+                appendedText.inclusiveRangeOf('b', 'e', item = SpanStyle(color = Color.Yellow)),
+                appendedText.inclusiveRangeOf('c', 'e', item = SpanStyle(color = Color.Magenta)),
             )
-            toAnnotatedString()
-        }
+        // Paragraph styles can't overlap.
+        val appendedParagraphStyles =
+            listOf(
+                appendedText.inclusiveRangeOf('b', 'b', item = ParagraphStyle(lineHeight = 30.sp)),
+                appendedText.inclusiveRangeOf('c', 'c', item = ParagraphStyle(lineHeight = 40.sp)),
+                appendedText.inclusiveRangeOf('d', 'd', item = ParagraphStyle(lineHeight = 50.sp)),
+                appendedText.inclusiveRangeOf('e', 'e', item = ParagraphStyle(lineHeight = 60.sp)),
+                appendedText.inclusiveRangeOf('f', 'f', item = ParagraphStyle(lineHeight = 70.sp)),
+            )
+        val appendedAnnotations =
+            listOf(
+                appendedText.inclusiveRangeOf('b', 'f', item = 1, tag = "tag1"),
+                appendedText.inclusiveRangeOf('c', 'f', item = 2, tag = "tag2"),
+                appendedText.inclusiveRangeOf('b', 'e', item = 3, tag = "tag3"),
+                appendedText.inclusiveRangeOf('c', 'e', item = 4, tag = "tag4"),
+            )
+        val appendedAnnotatedString =
+            AnnotatedString(
+                text = appendedText,
+                spanStylesOrNull = appendedSpanStyles,
+                paragraphStylesOrNull = appendedParagraphStyles,
+                annotations = appendedAnnotations
+            )
+
+        val buildResult =
+            with(AnnotatedString.Builder(annotatedString)) {
+                // Append everything but the first and last characters of the appended string.
+                append(
+                    appendedAnnotatedString,
+                    start = appendedText.indexOf('c'),
+                    end = appendedText.indexOf('e') + 1
+                )
+                toAnnotatedString()
+            }
 
         val expectedString = "acde"
-        val expectedSpanStyles = listOf(
-            expectedString.inclusiveRangeOf('a', 'a', item = SpanStyle(color = Color.Red)),
-            expectedString.inclusiveRangeOf('c', 'e', item = SpanStyle(color = Color.Blue)),
-            expectedString.inclusiveRangeOf('c', 'e', item = SpanStyle(color = Color.Green)),
-            expectedString.inclusiveRangeOf('c', 'e', item = SpanStyle(color = Color.Yellow)),
-            expectedString.inclusiveRangeOf('c', 'e', item = SpanStyle(color = Color.Magenta)),
-        )
-        val expectedParagraphStyles = listOf(
-            expectedString.inclusiveRangeOf('a', 'a', item = ParagraphStyle(lineHeight = 20.sp)),
-            expectedString.inclusiveRangeOf('c', 'c', item = ParagraphStyle(lineHeight = 40.sp)),
-            expectedString.inclusiveRangeOf('d', 'd', item = ParagraphStyle(lineHeight = 50.sp)),
-            expectedString.inclusiveRangeOf('e', 'e', item = ParagraphStyle(lineHeight = 60.sp)),
-        )
-        val expectedAnnotations = listOf(
-            expectedString.inclusiveRangeOf('a', 'a', item = "prefix", tag = "prefixTag"),
-            expectedString.inclusiveRangeOf('c', 'e', item = 1, tag = "tag1"),
-            expectedString.inclusiveRangeOf('c', 'e', item = 2, tag = "tag2"),
-            expectedString.inclusiveRangeOf('c', 'e', item = 3, tag = "tag3"),
-            expectedString.inclusiveRangeOf('c', 'e', item = 4, tag = "tag4"),
-        )
+        val expectedSpanStyles =
+            listOf(
+                expectedString.inclusiveRangeOf('a', 'a', item = SpanStyle(color = Color.Red)),
+                expectedString.inclusiveRangeOf('c', 'e', item = SpanStyle(color = Color.Blue)),
+                expectedString.inclusiveRangeOf('c', 'e', item = SpanStyle(color = Color.Green)),
+                expectedString.inclusiveRangeOf('c', 'e', item = SpanStyle(color = Color.Yellow)),
+                expectedString.inclusiveRangeOf('c', 'e', item = SpanStyle(color = Color.Magenta)),
+            )
+        val expectedParagraphStyles =
+            listOf(
+                expectedString.inclusiveRangeOf(
+                    'a',
+                    'a',
+                    item = ParagraphStyle(lineHeight = 20.sp)
+                ),
+                expectedString.inclusiveRangeOf(
+                    'c',
+                    'c',
+                    item = ParagraphStyle(lineHeight = 40.sp)
+                ),
+                expectedString.inclusiveRangeOf(
+                    'd',
+                    'd',
+                    item = ParagraphStyle(lineHeight = 50.sp)
+                ),
+                expectedString.inclusiveRangeOf(
+                    'e',
+                    'e',
+                    item = ParagraphStyle(lineHeight = 60.sp)
+                ),
+            )
+        val expectedAnnotations =
+            listOf(
+                expectedString.inclusiveRangeOf('a', 'a', item = "prefix", tag = "prefixTag"),
+                expectedString.inclusiveRangeOf('c', 'e', item = 1, tag = "tag1"),
+                expectedString.inclusiveRangeOf('c', 'e', item = 2, tag = "tag2"),
+                expectedString.inclusiveRangeOf('c', 'e', item = 3, tag = "tag3"),
+                expectedString.inclusiveRangeOf('c', 'e', item = 4, tag = "tag4"),
+            )
 
         assertThat(buildResult.text).isEqualTo(expectedString)
         assertThat(buildResult.spanStyles).isEqualTo(expectedSpanStyles)
@@ -270,54 +287,46 @@
         val color = Color.Red
         val text = "a"
         val lineHeight = 20.sp
-        val annotatedString = createAnnotatedString(
-            text = text,
-            color = color,
-            lineHeight = lineHeight
-        )
+        val annotatedString =
+            createAnnotatedString(text = text, color = color, lineHeight = lineHeight)
 
         val appendedColor = Color.Blue
         val appendedText = "b"
         val appendedLineHeight = 30.sp
-        val appendedAnnotatedString = createAnnotatedString(
-            text = appendedText,
-            color = appendedColor,
-            lineHeight = appendedLineHeight
-        )
+        val appendedAnnotatedString =
+            createAnnotatedString(
+                text = appendedText,
+                color = appendedColor,
+                lineHeight = appendedLineHeight
+            )
 
-        val buildResult = with(AnnotatedString.Builder(annotatedString)) {
-            // Cast forces dispatch to the more general method, using the return value ensures
-            // the right method was selected.
-            append(appendedAnnotatedString as CharSequence)
-                .toAnnotatedString()
-        }
+        val buildResult =
+            with(AnnotatedString.Builder(annotatedString)) {
+                // Cast forces dispatch to the more general method, using the return value ensures
+                // the right method was selected.
+                append(appendedAnnotatedString as CharSequence).toAnnotatedString()
+            }
 
         val expectedString = "$text$appendedText"
-        val expectedSpanStyles = listOf(
-            Range(
-                item = SpanStyle(color),
-                start = 0,
-                end = text.length
-            ),
-            Range(
-                item = SpanStyle(appendedColor),
-                start = text.length,
-                end = expectedString.length
+        val expectedSpanStyles =
+            listOf(
+                Range(item = SpanStyle(color), start = 0, end = text.length),
+                Range(
+                    item = SpanStyle(appendedColor),
+                    start = text.length,
+                    end = expectedString.length
+                )
             )
-        )
 
-        val expectedParagraphStyles = listOf(
-            Range(
-                item = ParagraphStyle(lineHeight = lineHeight),
-                start = 0,
-                end = text.length
-            ),
-            Range(
-                item = ParagraphStyle(lineHeight = appendedLineHeight),
-                start = text.length,
-                end = expectedString.length
+        val expectedParagraphStyles =
+            listOf(
+                Range(item = ParagraphStyle(lineHeight = lineHeight), start = 0, end = text.length),
+                Range(
+                    item = ParagraphStyle(lineHeight = appendedLineHeight),
+                    start = text.length,
+                    end = expectedString.length
+                )
             )
-        )
 
         assertThat(buildResult.text).isEqualTo(expectedString)
         assertThat(buildResult.spanStyles).isEqualTo(expectedSpanStyles)
@@ -328,10 +337,11 @@
     fun append_withCharSequence_appendsTheText_whenNotAnnotatedString() {
         val text = "a"
         val appendedText = object : CharSequence by "bc" {}
-        val annotatedString = with(AnnotatedString.Builder(text)) {
-            append(appendedText)
-            toAnnotatedString()
-        }
+        val annotatedString =
+            with(AnnotatedString.Builder(text)) {
+                append(appendedText)
+                toAnnotatedString()
+            }
 
         val expectedString = "abc"
 
@@ -349,11 +359,8 @@
         val color = Color.Red
         val text = "a"
         val lineHeight = 20.sp
-        val annotatedString = createAnnotatedString(
-            text = text,
-            color = color,
-            lineHeight = lineHeight
-        )
+        val annotatedString =
+            createAnnotatedString(text = text, color = color, lineHeight = lineHeight)
 
         // b-g will have a style span.
         // c-f will have a paragraph span.
@@ -368,60 +375,55 @@
                 append("b(")
                 withStyle(ParagraphStyle(lineHeight = appendedLineHeight)) {
                     append("c(")
-                    withAnnotation(appendedAnnotationTag, appendedAnnotation) {
-                        append("de")
-                    }
+                    withAnnotation(appendedAnnotationTag, appendedAnnotation) { append("de") }
                     append(")f")
                 }
                 append(")g")
             }
         }
 
-        val buildResult = with(AnnotatedString.Builder(annotatedString)) {
-            // Cast forces dispatch to the more general method, using the return value ensures
-            // the right method was selected.
-            append(
-                appendedAnnotatedString as CharSequence,
-                start = appendedText.indexOf('c'),
-                end = appendedText.indexOf('f') + 1
-            ).toAnnotatedString()
-        }
+        val buildResult =
+            with(AnnotatedString.Builder(annotatedString)) {
+                // Cast forces dispatch to the more general method, using the return value ensures
+                // the right method was selected.
+                append(
+                        appendedAnnotatedString as CharSequence,
+                        start = appendedText.indexOf('c'),
+                        end = appendedText.indexOf('f') + 1
+                    )
+                    .toAnnotatedString()
+            }
 
         val expectedString = "ac(de)f"
-        val expectedSpanStyles = listOf(
-            Range(
-                item = SpanStyle(color),
-                start = 0,
-                end = text.length
-            ),
-            Range(
-                item = SpanStyle(appendedColor),
-                start = text.length,
-                end = expectedString.length
+        val expectedSpanStyles =
+            listOf(
+                Range(item = SpanStyle(color), start = 0, end = text.length),
+                Range(
+                    item = SpanStyle(appendedColor),
+                    start = text.length,
+                    end = expectedString.length
+                )
             )
-        )
 
-        val expectedParagraphStyles = listOf(
-            Range(
-                item = ParagraphStyle(lineHeight = lineHeight),
-                start = 0,
-                end = text.length
-            ),
-            Range(
-                item = ParagraphStyle(lineHeight = appendedLineHeight),
-                start = text.length,
-                end = expectedString.length
+        val expectedParagraphStyles =
+            listOf(
+                Range(item = ParagraphStyle(lineHeight = lineHeight), start = 0, end = text.length),
+                Range(
+                    item = ParagraphStyle(lineHeight = appendedLineHeight),
+                    start = text.length,
+                    end = expectedString.length
+                )
             )
-        )
 
-        val expectedAnnotations = listOf(
-            Range(
-                tag = appendedAnnotationTag,
-                item = appendedAnnotation,
-                start = expectedString.indexOf('d'),
-                end = expectedString.indexOf('e') + 1
+        val expectedAnnotations =
+            listOf(
+                Range(
+                    tag = appendedAnnotationTag,
+                    item = appendedAnnotation,
+                    start = expectedString.indexOf('d'),
+                    end = expectedString.indexOf('e') + 1
+                )
             )
-        )
 
         assertThat(buildResult.text).isEqualTo(expectedString)
         assertThat(buildResult.spanStyles).isEqualTo(expectedSpanStyles)
@@ -433,10 +435,11 @@
     fun append_withCharSequenceAndRange_appendsTheText_whenNotAnnotatedString() {
         val text = "a"
         val appendedText = object : CharSequence by "bcde" {}
-        val annotatedString = with(AnnotatedString.Builder(text)) {
-            append(appendedText, 1, 3)
-            toAnnotatedString()
-        }
+        val annotatedString =
+            with(AnnotatedString.Builder(text)) {
+                append(appendedText, 1, 3)
+                toAnnotatedString()
+            }
 
         val expectedString = "acd"
 
@@ -449,11 +452,14 @@
     fun pushStyle() {
         val text = "Test"
         val style = SpanStyle(color = Color.Red)
-        val buildResult = AnnotatedString.Builder().apply {
-            pushStyle(style)
-            append(text)
-            pop()
-        }.toAnnotatedString()
+        val buildResult =
+            AnnotatedString.Builder()
+                .apply {
+                    pushStyle(style)
+                    append(text)
+                    pop()
+                }
+                .toAnnotatedString()
 
         assertThat(buildResult.text).isEqualTo(text)
         assertThat(buildResult.spanStyles).hasSize(1)
@@ -464,20 +470,22 @@
 
     @Test
     fun pushStyle_without_pop() {
-        val styles = arrayOf(
-            SpanStyle(color = Color.Red),
-            SpanStyle(fontStyle = FontStyle.Italic),
-            SpanStyle(fontWeight = FontWeight.Bold)
-        )
+        val styles =
+            arrayOf(
+                SpanStyle(color = Color.Red),
+                SpanStyle(fontStyle = FontStyle.Italic),
+                SpanStyle(fontWeight = FontWeight.Bold)
+            )
 
-        val buildResult = with(AnnotatedString.Builder()) {
-            styles.forEachIndexed { index, spanStyle ->
-                // pop is intentionally not called here
-                pushStyle(spanStyle)
-                append("Style$index")
+        val buildResult =
+            with(AnnotatedString.Builder()) {
+                styles.forEachIndexed { index, spanStyle ->
+                    // pop is intentionally not called here
+                    pushStyle(spanStyle)
+                    append("Style$index")
+                }
+                toAnnotatedString()
             }
-            toAnnotatedString()
-        }
 
         assertThat(buildResult.text).isEqualTo("Style0Style1Style2")
         assertThat(buildResult.spanStyles).hasSize(3)
@@ -497,15 +505,16 @@
         val spanStyle1 = SpanStyle(color = Color.Red)
         val spanStyle2 = SpanStyle(fontStyle = FontStyle.Italic)
 
-        val buildResult = with(AnnotatedString.Builder()) {
-            pushStyle(spanStyle1)
-            append("Test")
-            pushStyle(spanStyle2)
-            append(" me")
-            pop()
-            pop()
-            toAnnotatedString()
-        }
+        val buildResult =
+            with(AnnotatedString.Builder()) {
+                pushStyle(spanStyle1)
+                append("Test")
+                pushStyle(spanStyle2)
+                append(" me")
+                pop()
+                pop()
+                toAnnotatedString()
+            }
 
         assertThat(buildResult.text).isEqualTo("Test me")
         assertThat(buildResult.spanStyles).hasSize(2)
@@ -521,19 +530,21 @@
 
     @Test
     fun pushStyle_with_multiple_styles_on_top_of_each_other() {
-        val styles = arrayOf(
-            SpanStyle(color = Color.Red),
-            SpanStyle(fontStyle = FontStyle.Italic),
-            SpanStyle(fontWeight = FontWeight.Bold)
-        )
+        val styles =
+            arrayOf(
+                SpanStyle(color = Color.Red),
+                SpanStyle(fontStyle = FontStyle.Italic),
+                SpanStyle(fontWeight = FontWeight.Bold)
+            )
 
-        val buildResult = with(AnnotatedString.Builder()) {
-            styles.forEach { spanStyle ->
-                // pop is intentionally not called here
-                pushStyle(spanStyle)
+        val buildResult =
+            with(AnnotatedString.Builder()) {
+                styles.forEach { spanStyle ->
+                    // pop is intentionally not called here
+                    pushStyle(spanStyle)
+                }
+                toAnnotatedString()
             }
-            toAnnotatedString()
-        }
 
         assertThat(buildResult.text).isEmpty()
         assertThat(buildResult.spanStyles).hasSize(3)
@@ -546,29 +557,31 @@
 
     @Test
     fun pushStyle_with_multiple_stacks_should_construct_styles_in_the_same_order() {
-        val styles = arrayOf(
-            SpanStyle(color = Color.Red),
-            SpanStyle(fontStyle = FontStyle.Italic),
-            SpanStyle(fontWeight = FontWeight.Bold),
-            SpanStyle(letterSpacing = 1.2.em)
-        )
+        val styles =
+            arrayOf(
+                SpanStyle(color = Color.Red),
+                SpanStyle(fontStyle = FontStyle.Italic),
+                SpanStyle(fontWeight = FontWeight.Bold),
+                SpanStyle(letterSpacing = 1.2.em)
+            )
 
-        val buildResult = with(AnnotatedString.Builder()) {
-            pushStyle(styles[0])
-            append("layer1-1")
-            pushStyle(styles[1])
-            append("layer2-1")
-            pushStyle(styles[2])
-            append("layer3-1")
-            pop()
-            pushStyle(styles[3])
-            append("layer3-2")
-            pop()
-            append("layer2-2")
-            pop()
-            append("layer1-2")
-            toAnnotatedString()
-        }
+        val buildResult =
+            with(AnnotatedString.Builder()) {
+                pushStyle(styles[0])
+                append("layer1-1")
+                pushStyle(styles[1])
+                append("layer2-1")
+                pushStyle(styles[2])
+                append("layer3-1")
+                pop()
+                pushStyle(styles[3])
+                append("layer3-2")
+                pop()
+                append("layer2-2")
+                pop()
+                append("layer1-2")
+                toAnnotatedString()
+            }
 
         assertThat(buildResult.spanStyles).hasSize(4)
         styles.forEachIndexed { index, spanStyle ->
@@ -578,30 +591,32 @@
 
     @Test
     fun pushStyle_with_multiple_nested_styles_should_return_styles_in_same_order() {
-        val styles = arrayOf(
-            SpanStyle(color = Color.Red),
-            SpanStyle(fontStyle = FontStyle.Italic),
-            SpanStyle(fontWeight = FontWeight.Bold),
-            SpanStyle(letterSpacing = 1.2.em)
-        )
+        val styles =
+            arrayOf(
+                SpanStyle(color = Color.Red),
+                SpanStyle(fontStyle = FontStyle.Italic),
+                SpanStyle(fontWeight = FontWeight.Bold),
+                SpanStyle(letterSpacing = 1.2.em)
+            )
 
-        val buildResult = with(AnnotatedString.Builder()) {
-            pushStyle(styles[0])
-            append("layer1-1")
-            pushStyle(styles[1])
-            append("layer2-1")
-            pop()
-            pushStyle(styles[2])
-            append("layer2-2")
-            pushStyle(styles[3])
-            append("layer3-1")
-            pop()
-            append("layer2-3")
-            pop()
-            append("layer1-2")
-            pop()
-            toAnnotatedString()
-        }
+        val buildResult =
+            with(AnnotatedString.Builder()) {
+                pushStyle(styles[0])
+                append("layer1-1")
+                pushStyle(styles[1])
+                append("layer2-1")
+                pop()
+                pushStyle(styles[2])
+                append("layer2-2")
+                pushStyle(styles[3])
+                append("layer3-1")
+                pop()
+                append("layer2-3")
+                pop()
+                append("layer1-2")
+                pop()
+                toAnnotatedString()
+            }
 
         assertThat(buildResult.spanStyles).hasSize(4)
         styles.forEachIndexed { index, spanStyle ->
@@ -619,17 +634,18 @@
         val spanStyle1 = SpanStyle(color = Color.Red)
         val spanStyle2 = SpanStyle(fontStyle = FontStyle.Italic)
 
-        val buildResult = with(AnnotatedString.Builder()) {
-            append("Style0")
-            pushStyle(spanStyle1)
-            append("Style1")
-            pop()
-            pushStyle(spanStyle2)
-            append("Style2")
-            pop()
-            append("Style3")
-            toAnnotatedString()
-        }
+        val buildResult =
+            with(AnnotatedString.Builder()) {
+                append("Style0")
+                pushStyle(spanStyle1)
+                append("Style1")
+                pop()
+                pushStyle(spanStyle2)
+                append("Style2")
+                pop()
+                append("Style3")
+                toAnnotatedString()
+            }
 
         assertThat(buildResult.text).isEqualTo("Style0Style1Style2Style3")
         assertThat(buildResult.spanStyles).hasSize(2)
@@ -709,42 +725,38 @@
     @Test
     fun withStyle_applies_style_to_block() {
         val style = SpanStyle(color = Color.Red)
-        val buildResult = with(AnnotatedString.Builder()) {
-            withStyle(style) {
-                append("Style")
+        val buildResult =
+            with(AnnotatedString.Builder()) {
+                withStyle(style) { append("Style") }
+                toAnnotatedString()
             }
-            toAnnotatedString()
-        }
 
         assertThat(buildResult.paragraphStyles).isEmpty()
-        assertThat(buildResult.spanStyles).isEqualTo(
-            listOf(Range(style, 0, buildResult.length))
-        )
+        assertThat(buildResult.spanStyles).isEqualTo(listOf(Range(style, 0, buildResult.length)))
     }
 
     @Test
     fun withStyle_with_paragraphStyle_applies_style_to_block() {
         val style = ParagraphStyle(lineHeight = 18.sp)
-        val buildResult = with(AnnotatedString.Builder()) {
-            withStyle(style) {
-                append("Style")
+        val buildResult =
+            with(AnnotatedString.Builder()) {
+                withStyle(style) { append("Style") }
+                toAnnotatedString()
             }
-            toAnnotatedString()
-        }
 
         assertThat(buildResult.spanStyles).isEmpty()
-        assertThat(buildResult.paragraphStyles).isEqualTo(
-            listOf(Range(style, 0, buildResult.length))
-        )
+        assertThat(buildResult.paragraphStyles)
+            .isEqualTo(listOf(Range(style, 0, buildResult.length)))
     }
 
     @Test
     fun append_char_appends() {
-        val buildResult = with(AnnotatedString.Builder("a")) {
-            append('b')
-            append('c')
-            toAnnotatedString()
-        }
+        val buildResult =
+            with(AnnotatedString.Builder("a")) {
+                append('b')
+                append('c')
+                toAnnotatedString()
+            }
 
         assertThat(buildResult).isEqualTo(AnnotatedString("abc"))
     }
@@ -759,11 +771,7 @@
         val paragraphStyle2 = ParagraphStyle(textAlign = TextAlign.Right)
 
         val buildResult = buildAnnotatedString {
-            withStyle(paragraphStyle1) {
-                withStyle(spanStyle1) {
-                    append(text1)
-                }
-            }
+            withStyle(paragraphStyle1) { withStyle(spanStyle1) { append(text1) } }
             append(" ")
             pushStyle(paragraphStyle2)
             pushStyle(spanStyle2)
@@ -772,14 +780,16 @@
         }
 
         val expectedString = "$text1 $text2"
-        val expectedSpanStyles = listOf(
-            Range(spanStyle1, 0, text1.length),
-            Range(spanStyle2, text1.length + 1, expectedString.length)
-        )
-        val expectedParagraphStyles = listOf(
-            Range(paragraphStyle1, 0, text1.length),
-            Range(paragraphStyle2, text1.length + 1, expectedString.length)
-        )
+        val expectedSpanStyles =
+            listOf(
+                Range(spanStyle1, 0, text1.length),
+                Range(spanStyle2, text1.length + 1, expectedString.length)
+            )
+        val expectedParagraphStyles =
+            listOf(
+                Range(paragraphStyle1, 0, text1.length),
+                Range(paragraphStyle2, text1.length + 1, expectedString.length)
+            )
 
         assertThat(buildResult.text).isEqualTo(expectedString)
         assertThat(buildResult.spanStyles).isEqualTo(expectedSpanStyles)
@@ -788,44 +798,46 @@
 
     @Test
     fun toAnnotatedString_calling_twice_creates_equal_annotated_strings() {
-        val builder = AnnotatedString.Builder().apply {
-            // pushed styles not popped on purpose
-            pushStyle(SpanStyle(color = Color.Red))
-            append("Hello")
-            pushStyle(SpanStyle(color = Color.Blue))
-            append("World")
-        }
+        val builder =
+            AnnotatedString.Builder().apply {
+                // pushed styles not popped on purpose
+                pushStyle(SpanStyle(color = Color.Red))
+                append("Hello")
+                pushStyle(SpanStyle(color = Color.Blue))
+                append("World")
+            }
 
         assertThat(builder.toAnnotatedString()).isEqualTo(builder.toAnnotatedString())
     }
 
     @Test
     fun can_call_other_functions_after_toAnnotatedString() {
-        val builder = AnnotatedString.Builder().apply {
-            // pushed styles not popped on purpose
-            pushStyle(SpanStyle(fontSize = 12.sp))
-            append("Hello")
-            pushStyle(SpanStyle(fontSize = 16.sp))
-            append("World")
-        }
+        val builder =
+            AnnotatedString.Builder().apply {
+                // pushed styles not popped on purpose
+                pushStyle(SpanStyle(fontSize = 12.sp))
+                append("Hello")
+                pushStyle(SpanStyle(fontSize = 16.sp))
+                append("World")
+            }
 
         val buildResult1 = builder.toAnnotatedString()
-        val buildResult2 = with(builder) {
-            pop()
-            pop()
-            pushStyle(SpanStyle(fontSize = 18.sp))
-            append("!")
-            toAnnotatedString()
-        }
+        val buildResult2 =
+            with(builder) {
+                pop()
+                pop()
+                pushStyle(SpanStyle(fontSize = 18.sp))
+                append("!")
+                toAnnotatedString()
+            }
 
         // buildResult2 should be the same as creating a new AnnotatedString based on the first
         // result and appending the same values
-        val expectedResult = with(AnnotatedString.Builder(buildResult1)) {
-            withStyle(SpanStyle(fontSize = 18.sp)) {
-                append("!")
+        val expectedResult =
+            with(AnnotatedString.Builder(buildResult1)) {
+                withStyle(SpanStyle(fontSize = 18.sp)) { append("!") }
+                toAnnotatedString()
             }
-            toAnnotatedString()
-        }
 
         assertThat(buildResult2).isEqualTo(expectedResult)
     }
@@ -835,18 +847,19 @@
         val text = "Test"
         val annotation = "Annotation"
         val tag = "tag"
-        val buildResult = AnnotatedString.Builder().apply {
-            pushStringAnnotation(tag, annotation)
-            append(text)
-            pop()
-        }.toAnnotatedString()
+        val buildResult =
+            AnnotatedString.Builder()
+                .apply {
+                    pushStringAnnotation(tag, annotation)
+                    append(text)
+                    pop()
+                }
+                .toAnnotatedString()
 
         assertThat(buildResult.text).isEqualTo(text)
         val stringAnnotations = buildResult.getStringAnnotations(tag, 0, text.length)
         assertThat(stringAnnotations).hasSize(1)
-        assertThat(stringAnnotations.first()).isEqualTo(
-            Range(annotation, 0, text.length, tag)
-        )
+        assertThat(stringAnnotations.first()).isEqualTo(Range(annotation, 0, text.length, tag))
     }
 
     @Test
@@ -854,11 +867,14 @@
         val text = "Test"
         val annotation = "Annotation"
         val tag = "tag"
-        val buildResult = AnnotatedString.Builder().apply {
-            pushStringAnnotation(tag, annotation)
-            append(text)
-            pop()
-        }.toAnnotatedString()
+        val buildResult =
+            AnnotatedString.Builder()
+                .apply {
+                    pushStringAnnotation(tag, annotation)
+                    append(text)
+                    pop()
+                }
+                .toAnnotatedString()
 
         assertThat(buildResult.hasStringAnnotations(tag, 0, text.length)).isTrue()
     }
@@ -868,12 +884,15 @@
         val text = "Test"
         val annotation = "Annotation"
         val tag = "tag"
-        val buildResult = AnnotatedString.Builder().apply {
-            pushStringAnnotation(tag, annotation)
-            append(text)
-            pop()
-            append(text)
-        }.toAnnotatedString()
+        val buildResult =
+            AnnotatedString.Builder()
+                .apply {
+                    pushStringAnnotation(tag, annotation)
+                    append(text)
+                    pop()
+                    append(text)
+                }
+                .toAnnotatedString()
 
         assertThat(buildResult.hasStringAnnotations(tag, text.length, buildResult.length)).isFalse()
     }
@@ -883,15 +902,18 @@
         val annotation1 = "Annotation1"
         val annotation2 = "Annotation2"
         val tag = "tag"
-        val buildResult = AnnotatedString.Builder().apply {
-            pushStringAnnotation(tag, annotation1)
-            append("Hello")
-            pushStringAnnotation(tag, annotation2)
-            append("world")
-            pop()
-            append("!")
-            pop()
-        }.toAnnotatedString()
+        val buildResult =
+            AnnotatedString.Builder()
+                .apply {
+                    pushStringAnnotation(tag, annotation1)
+                    append("Hello")
+                    pushStringAnnotation(tag, annotation2)
+                    append("world")
+                    pop()
+                    append("!")
+                    pop()
+                }
+                .toAnnotatedString()
 
         // The final result is Helloworld!
         //                     [         ]
@@ -902,12 +924,8 @@
         assertThat(buildResult.getStringAnnotations(tag, 5, 10)).hasSize(2)
         assertThat(buildResult.getStringAnnotations(tag, 10, 11)).hasSize(1)
         val annotations = buildResult.getStringAnnotations(tag, 0, 11)
-        assertThat(annotations[0]).isEqualTo(
-            Range(annotation1, 0, 11, tag)
-        )
-        assertThat(annotations[1]).isEqualTo(
-            Range(annotation2, 5, 10, tag)
-        )
+        assertThat(annotations[0]).isEqualTo(Range(annotation1, 0, 11, tag))
+        assertThat(annotations[1]).isEqualTo(Range(annotation2, 5, 10, tag))
     }
 
     @Test
@@ -916,15 +934,18 @@
         val annotation2 = "Annotation2"
         val tag1 = "tag1"
         val tag2 = "tag2"
-        val buildResult = AnnotatedString.Builder().apply {
-            pushStringAnnotation(tag1, annotation1)
-            append("Hello")
-            pushStringAnnotation(tag2, annotation2)
-            append("world")
-            pop()
-            append("!")
-            pop()
-        }.toAnnotatedString()
+        val buildResult =
+            AnnotatedString.Builder()
+                .apply {
+                    pushStringAnnotation(tag1, annotation1)
+                    append("Hello")
+                    pushStringAnnotation(tag2, annotation2)
+                    append("world")
+                    pop()
+                    append("!")
+                    pop()
+                }
+                .toAnnotatedString()
 
         // The final result is Helloworld!
         //                     [         ]
@@ -946,16 +967,19 @@
     fun getAnnotation() {
         val annotation = "Annotation"
         val tag = "tag"
-        val buildResult = AnnotatedString.Builder().apply {
-            append("Hello")
-            pushStringAnnotation(tag, annotation)
-            append("World")
-            pop()
-            append("Hello")
-            pushStringAnnotation(tag, annotation)
-            pop()
-            append("World")
-        }.toAnnotatedString()
+        val buildResult =
+            AnnotatedString.Builder()
+                .apply {
+                    append("Hello")
+                    pushStringAnnotation(tag, annotation)
+                    append("World")
+                    pop()
+                    append("Hello")
+                    pushStringAnnotation(tag, annotation)
+                    pop()
+                    append("World")
+                }
+                .toAnnotatedString()
         // The final result is: HelloWorldHelloWorld
         //                           [   ]
         //                                    []
@@ -976,33 +1000,30 @@
         val annotation2 = "Annotation2"
         val tag1 = "tag1"
         val tag2 = "tag2"
-        val buildResult = AnnotatedString.Builder().apply {
-            pushStringAnnotation(tag1, annotation1)
-            append("Hello")
-            pushStringAnnotation(tag2, annotation2)
-            append("world")
-            pop()
-            append("!")
-            pop()
-        }.toAnnotatedString()
+        val buildResult =
+            AnnotatedString.Builder()
+                .apply {
+                    pushStringAnnotation(tag1, annotation1)
+                    append("Hello")
+                    pushStringAnnotation(tag2, annotation2)
+                    append("world")
+                    pop()
+                    append("!")
+                    pop()
+                }
+                .toAnnotatedString()
 
         // The final result is Helloworld!
         //                     [         ]
         //                          [   ]
-        assertThat(buildResult.getStringAnnotations(0, 5)).isEqualTo(
-            listOf(Range(annotation1, 0, 11, tag1))
-        )
+        assertThat(buildResult.getStringAnnotations(0, 5))
+            .isEqualTo(listOf(Range(annotation1, 0, 11, tag1)))
 
-        assertThat(buildResult.getStringAnnotations(5, 6)).isEqualTo(
-            listOf(
-                Range(annotation1, 0, 11, tag1),
-                Range(annotation2, 5, 10, tag2)
-            )
-        )
+        assertThat(buildResult.getStringAnnotations(5, 6))
+            .isEqualTo(listOf(Range(annotation1, 0, 11, tag1), Range(annotation2, 5, 10, tag2)))
 
-        assertThat(buildResult.getStringAnnotations(10, 11)).isEqualTo(
-            listOf(Range(annotation1, 0, 11, tag1))
-        )
+        assertThat(buildResult.getStringAnnotations(10, 11))
+            .isEqualTo(listOf(Range(annotation1, 0, 11, tag1)))
     }
 
     @Test
@@ -1010,30 +1031,30 @@
         val annotation1 = VerbatimTtsAnnotation("abc")
         val annotation2 = "annotation"
         val tag = "tag"
-        val buildResult = AnnotatedString.Builder().apply {
-            pushTtsAnnotation(annotation1)
-            append("Hello")
-            pushStringAnnotation(tag, annotation2)
-            append("world")
-            pop()
-            append("!")
-            pop()
-        }.toAnnotatedString()
+        val buildResult =
+            AnnotatedString.Builder()
+                .apply {
+                    pushTtsAnnotation(annotation1)
+                    append("Hello")
+                    pushStringAnnotation(tag, annotation2)
+                    append("world")
+                    pop()
+                    append("!")
+                    pop()
+                }
+                .toAnnotatedString()
 
         // The final result is Helloworld!
         //                     [         ] TtsAnnotation
         //                          [   ]  Range<String>
-        assertThat(buildResult.getTtsAnnotations(0, 5)).isEqualTo(
-            listOf(Range(annotation1, 0, 11, ""))
-        )
-        assertThat(buildResult.getTtsAnnotations(5, 6)).isEqualTo(
-            listOf(Range(annotation1, 0, 11, ""))
-        )
+        assertThat(buildResult.getTtsAnnotations(0, 5))
+            .isEqualTo(listOf(Range(annotation1, 0, 11, "")))
+        assertThat(buildResult.getTtsAnnotations(5, 6))
+            .isEqualTo(listOf(Range(annotation1, 0, 11, "")))
 
         assertThat(buildResult.getStringAnnotations(0, 5)).isEmpty()
-        assertThat(buildResult.getStringAnnotations(5, 6)).isEqualTo(
-            listOf(Range(annotation2, 5, 10, tag))
-        )
+        assertThat(buildResult.getStringAnnotations(5, 6))
+            .isEqualTo(listOf(Range(annotation2, 5, 10, tag)))
         assertThat(buildResult.getStringAnnotations(10, 11)).isEmpty()
     }
 
@@ -1042,23 +1063,25 @@
         val annotation1 = VerbatimTtsAnnotation("abc")
         val annotation2 = "annotation"
         val tag = "tag"
-        val buildResult = AnnotatedString.Builder().apply {
-            pushTtsAnnotation(annotation1)
-            append("Hello")
-            pushStringAnnotation(tag, annotation2)
-            append("world")
-            pop()
-            append("!")
-            pop()
-        }.toAnnotatedString()
+        val buildResult =
+            AnnotatedString.Builder()
+                .apply {
+                    pushTtsAnnotation(annotation1)
+                    append("Hello")
+                    pushStringAnnotation(tag, annotation2)
+                    append("world")
+                    pop()
+                    append("!")
+                    pop()
+                }
+                .toAnnotatedString()
 
         // The final result is Helloworld!
         //                     [         ] TtsAnnotation
         //                          [   ]  Range<String>
         assertThat(buildResult.getStringAnnotations(tag, 0, 5)).isEmpty()
-        assertThat(buildResult.getStringAnnotations(tag, 5, 6)).isEqualTo(
-            listOf(Range(annotation2, 5, 10, tag))
-        )
+        assertThat(buildResult.getStringAnnotations(tag, 5, 6))
+            .isEqualTo(listOf(Range(annotation2, 5, 10, tag)))
         // The tag doesn't match, return empty list.
         assertThat(buildResult.getStringAnnotations("tag1", 5, 6)).isEmpty()
         assertThat(buildResult.getStringAnnotations(tag, 10, 11)).isEmpty()
@@ -1071,30 +1094,30 @@
         val annotation1 = UrlAnnotation("abc")
         val annotation2 = "annotation"
         val tag = "tag"
-        val buildResult = AnnotatedString.Builder().apply {
-            pushUrlAnnotation(annotation1)
-            append("Hello")
-            pushStringAnnotation(tag, annotation2)
-            append("world")
-            pop()
-            append("!")
-            pop()
-        }.toAnnotatedString()
+        val buildResult =
+            AnnotatedString.Builder()
+                .apply {
+                    pushUrlAnnotation(annotation1)
+                    append("Hello")
+                    pushStringAnnotation(tag, annotation2)
+                    append("world")
+                    pop()
+                    append("!")
+                    pop()
+                }
+                .toAnnotatedString()
 
         // The final result is Helloworld!
         //                     [         ] UrlAnnotation
         //                          [   ]  Range<String>
-        assertThat(buildResult.getUrlAnnotations(0, 5)).isEqualTo(
-            listOf(Range(annotation1, 0, 11, ""))
-        )
-        assertThat(buildResult.getUrlAnnotations(5, 6)).isEqualTo(
-            listOf(Range(annotation1, 0, 11, ""))
-        )
+        assertThat(buildResult.getUrlAnnotations(0, 5))
+            .isEqualTo(listOf(Range(annotation1, 0, 11, "")))
+        assertThat(buildResult.getUrlAnnotations(5, 6))
+            .isEqualTo(listOf(Range(annotation1, 0, 11, "")))
 
         assertThat(buildResult.getStringAnnotations(0, 5)).isEmpty()
-        assertThat(buildResult.getStringAnnotations(5, 6)).isEqualTo(
-            listOf(Range(annotation2, 5, 10, tag))
-        )
+        assertThat(buildResult.getStringAnnotations(5, 6))
+            .isEqualTo(listOf(Range(annotation2, 5, 10, tag)))
         assertThat(buildResult.getStringAnnotations(10, 11)).isEmpty()
     }
 
@@ -1105,23 +1128,25 @@
         val annotation1 = UrlAnnotation("abc")
         val annotation2 = "annotation"
         val tag = "tag"
-        val buildResult = AnnotatedString.Builder().apply {
-            pushUrlAnnotation(annotation1)
-            append("Hello")
-            pushStringAnnotation(tag, annotation2)
-            append("world")
-            pop()
-            append("!")
-            pop()
-        }.toAnnotatedString()
+        val buildResult =
+            AnnotatedString.Builder()
+                .apply {
+                    pushUrlAnnotation(annotation1)
+                    append("Hello")
+                    pushStringAnnotation(tag, annotation2)
+                    append("world")
+                    pop()
+                    append("!")
+                    pop()
+                }
+                .toAnnotatedString()
 
         // The final result is Helloworld!
         //                     [         ] UrlAnnotation
         //                          [   ]  Range<String>
         assertThat(buildResult.getStringAnnotations(tag, 0, 5)).isEmpty()
-        assertThat(buildResult.getStringAnnotations(tag, 5, 6)).isEqualTo(
-            listOf(Range(annotation2, 5, 10, tag))
-        )
+        assertThat(buildResult.getStringAnnotations(tag, 5, 6))
+            .isEqualTo(listOf(Range(annotation2, 5, 10, tag)))
         // The tag doesn't match, return empty list.
         assertThat(buildResult.getStringAnnotations("tag1", 5, 6)).isEmpty()
         assertThat(buildResult.getStringAnnotations(tag, 10, 11)).isEmpty()
@@ -1133,34 +1158,31 @@
         val annotation2 = LinkAnnotation.Clickable("clickable tag") {}
         val annotation3 = "annotation"
         val tag = "tag"
-        val buildResult = AnnotatedString.Builder().apply {
-            pushLink(annotation1)
-            append("ab")
-            pushLink(annotation2)
-            append("cd")
-            pushStringAnnotation(tag, annotation3)
-            append("ef")
-            pop()
-        }.toAnnotatedString()
+        val buildResult =
+            AnnotatedString.Builder()
+                .apply {
+                    pushLink(annotation1)
+                    append("ab")
+                    pushLink(annotation2)
+                    append("cd")
+                    pushStringAnnotation(tag, annotation3)
+                    append("ef")
+                    pop()
+                }
+                .toAnnotatedString()
 
         // The final result is abcdef
         //                     [    ] LinkAnnotation.Url
         //                       [  ] LinkAnnotation.Clickable
         //                         [] Range<String>
-        assertThat(buildResult.getLinkAnnotations(0, 2)).isEqualTo(
-            listOf(Range(annotation1, 0, 6, ""))
-        )
-        assertThat(buildResult.getLinkAnnotations(3, 5)).isEqualTo(
-            listOf(
-                Range(annotation1, 0, 6, ""),
-                Range(annotation2, 2, 6, "")
-            )
-        )
+        assertThat(buildResult.getLinkAnnotations(0, 2))
+            .isEqualTo(listOf(Range(annotation1, 0, 6, "")))
+        assertThat(buildResult.getLinkAnnotations(3, 5))
+            .isEqualTo(listOf(Range(annotation1, 0, 6, ""), Range(annotation2, 2, 6, "")))
 
         assertThat(buildResult.getStringAnnotations(0, 4)).isEmpty()
-        assertThat(buildResult.getStringAnnotations(4, 6)).isEqualTo(
-            listOf(Range(annotation3, 4, 6, tag))
-        )
+        assertThat(buildResult.getStringAnnotations(4, 6))
+            .isEqualTo(listOf(Range(annotation3, 4, 6, tag)))
         assertThat(buildResult.getStringAnnotations("another tag", 4, 6)).isEmpty()
     }
 
@@ -1171,35 +1193,19 @@
     ): AnnotatedString {
         return AnnotatedString(
             text = text,
-            spanStyles = listOf(
-                Range(
-                    item = SpanStyle(color),
-                    start = 0,
-                    end = text.length
+            spanStyles = listOf(Range(item = SpanStyle(color), start = 0, end = text.length)),
+            paragraphStyles =
+                listOf(
+                    Range(
+                        item = ParagraphStyle(lineHeight = lineHeight),
+                        start = 0,
+                        end = text.length
+                    )
                 )
-            ),
-            paragraphStyles = listOf(
-                Range(
-                    item = ParagraphStyle(lineHeight = lineHeight),
-                    start = 0,
-                    end = text.length
-                )
-            )
         )
     }
 
-    /**
-     * Returns a [Range] from the index of [start] to the index of [end], both inclusive.
-     */
-    private fun <T> String.inclusiveRangeOf(
-        start: Char,
-        end: Char,
-        item: T,
-        tag: String = ""
-    ) = Range(
-        tag = tag,
-        item = item,
-        start = indexOf(start),
-        end = indexOf(end) + 1
-    )
+    /** Returns a [Range] from the index of [start] to the index of [end], both inclusive. */
+    private fun <T> String.inclusiveRangeOf(start: Char, end: Char, item: T, tag: String = "") =
+        Range(tag = tag, item = item, start = indexOf(start), end = indexOf(end) + 1)
 }
diff --git a/compose/ui/ui-text/src/androidUnitTest/kotlin/androidx/compose/ui/text/AnnotatedStringTest.kt b/compose/ui/ui-text/src/androidUnitTest/kotlin/androidx/compose/ui/text/AnnotatedStringTest.kt
index e2d34a5..055d204b 100644
--- a/compose/ui/ui-text/src/androidUnitTest/kotlin/androidx/compose/ui/text/AnnotatedStringTest.kt
+++ b/compose/ui/ui-text/src/androidUnitTest/kotlin/androidx/compose/ui/text/AnnotatedStringTest.kt
@@ -37,12 +37,13 @@
 
         val paragraphs = annotatedString.normalizedParagraphStyles(defaultParagraphStyle)
 
-        assertThat(paragraphs).isEqualTo(
-            listOf(
-                Range(defaultParagraphStyle.merge(paragraphStyle), 0, 5),
-                Range(defaultParagraphStyle, 5, text.length)
+        assertThat(paragraphs)
+            .isEqualTo(
+                listOf(
+                    Range(defaultParagraphStyle.merge(paragraphStyle), 0, 5),
+                    Range(defaultParagraphStyle, 5, text.length)
+                )
             )
-        )
     }
 
     @Test
@@ -99,49 +100,56 @@
     @Test
     fun plus_operator_creates_a_new_annotated_string() {
         val text1 = "Hello"
-        val spanStyles1 = listOf(
-            Range(SpanStyle(color = Color.Red), 0, 3),
-            Range(SpanStyle(color = Color.Blue), 2, 4)
-        )
-        val paragraphStyles1 = listOf(
-            Range(ParagraphStyle(lineHeight = 20.sp), 0, 1),
-            Range(ParagraphStyle(lineHeight = 30.sp), 1, 5)
-        )
-        val annotations1 = listOf(
-            Range("annotation1", 0, 2, "scope1"),
-            Range("annotation1", 3, 5, "scope1")
-        )
-        val annotatedString1 = AnnotatedString(
-            text = text1,
-            spanStylesOrNull = spanStyles1,
-            paragraphStylesOrNull = paragraphStyles1,
-            annotations = annotations1
-        )
+        val spanStyles1 =
+            listOf(
+                Range(SpanStyle(color = Color.Red), 0, 3),
+                Range(SpanStyle(color = Color.Blue), 2, 4)
+            )
+        val paragraphStyles1 =
+            listOf(
+                Range(ParagraphStyle(lineHeight = 20.sp), 0, 1),
+                Range(ParagraphStyle(lineHeight = 30.sp), 1, 5)
+            )
+        val annotations1 =
+            listOf(Range("annotation1", 0, 2, "scope1"), Range("annotation1", 3, 5, "scope1"))
+        val annotatedString1 =
+            AnnotatedString(
+                text = text1,
+                spanStylesOrNull = spanStyles1,
+                paragraphStylesOrNull = paragraphStyles1,
+                annotations = annotations1
+            )
 
         val text2 = "World"
         val spanStyle = SpanStyle(color = Color.Cyan)
         val paragraphStyle = ParagraphStyle(lineHeight = 10.sp)
-        val annotatedString2 = AnnotatedString(
-            text = text2,
-            spanStylesOrNull = listOf(Range(spanStyle, 0, text2.length)),
-            paragraphStylesOrNull = listOf(Range(paragraphStyle, 0, text2.length)),
-            annotations = listOf(Range("annotation2", 0, text2.length, "scope2"))
-        )
-
-        assertThat(annotatedString1 + annotatedString2).isEqualTo(
+        val annotatedString2 =
             AnnotatedString(
-                "$text1$text2",
-                spanStyles1 + listOf(
-                    Range(spanStyle, text1.length, text1.length + text2.length)
-                ),
-                paragraphStyles1 + listOf(
-                    Range(paragraphStyle, text1.length, text1.length + text2.length)
-                ),
-                annotations1 + listOf(
-                    Range("annotation2", text1.length, text1.length + text2.length, "scope2")
+                text = text2,
+                spanStylesOrNull = listOf(Range(spanStyle, 0, text2.length)),
+                paragraphStylesOrNull = listOf(Range(paragraphStyle, 0, text2.length)),
+                annotations = listOf(Range("annotation2", 0, text2.length, "scope2"))
+            )
+
+        assertThat(annotatedString1 + annotatedString2)
+            .isEqualTo(
+                AnnotatedString(
+                    "$text1$text2",
+                    spanStyles1 +
+                        listOf(Range(spanStyle, text1.length, text1.length + text2.length)),
+                    paragraphStyles1 +
+                        listOf(Range(paragraphStyle, text1.length, text1.length + text2.length)),
+                    annotations1 +
+                        listOf(
+                            Range(
+                                "annotation2",
+                                text1.length,
+                                text1.length + text2.length,
+                                "scope2"
+                            )
+                        )
                 )
             )
-        )
     }
 
     @Test
@@ -153,169 +161,136 @@
 
     @Test
     fun subSequence_returns_empty_text_for_start_equals_end() {
-        val annotatedString = with(AnnotatedString.Builder()) {
-            withStyle(SpanStyle(fontSize = 12.sp)) {
-                append("a")
-            }
-            withStyle(SpanStyle(fontSize = 12.sp)) {
-                append("b")
-            }
-            withStyle(ParagraphStyle(lineHeight = 14.sp)) {
-                append("c")
-            }
-            toAnnotatedString()
-        }.subSequence(1, 1)
+        val annotatedString =
+            with(AnnotatedString.Builder()) {
+                    withStyle(SpanStyle(fontSize = 12.sp)) { append("a") }
+                    withStyle(SpanStyle(fontSize = 12.sp)) { append("b") }
+                    withStyle(ParagraphStyle(lineHeight = 14.sp)) { append("c") }
+                    toAnnotatedString()
+                }
+                .subSequence(1, 1)
 
-        assertThat(annotatedString).isEqualTo(
-            AnnotatedString("", listOf(Range(SpanStyle(fontSize = 12.sp), 0, 0)))
-        )
+        assertThat(annotatedString)
+            .isEqualTo(AnnotatedString("", listOf(Range(SpanStyle(fontSize = 12.sp), 0, 0))))
     }
 
     @Test
     fun subSequence_returns_original_text_for_text_range_is_full_range() {
-        val annotatedString = with(AnnotatedString.Builder()) {
-            withStyle(SpanStyle(fontSize = 12.sp)) {
-                append("a")
+        val annotatedString =
+            with(AnnotatedString.Builder()) {
+                withStyle(SpanStyle(fontSize = 12.sp)) { append("a") }
+                withStyle(SpanStyle(fontSize = 12.sp)) { append("b") }
+                withStyle(ParagraphStyle(lineHeight = 14.sp)) { append("c") }
+                toAnnotatedString()
             }
-            withStyle(SpanStyle(fontSize = 12.sp)) {
-                append("b")
-            }
-            withStyle(ParagraphStyle(lineHeight = 14.sp)) {
-                append("c")
-            }
-            toAnnotatedString()
-        }
 
         assertThat(annotatedString.subSequence(0, 3)).isSameInstanceAs(annotatedString)
     }
 
     @Test
     fun subSequence_doesNot_include_styles_before_the_start() {
-        val annotatedString = with(AnnotatedString.Builder()) {
-            withStyle(SpanStyle(fontSize = 12.sp)) {
-                append("a")
+        val annotatedString =
+            with(AnnotatedString.Builder()) {
+                withStyle(SpanStyle(fontSize = 12.sp)) { append("a") }
+                withStyle(ParagraphStyle(lineHeight = 14.sp)) { append("b") }
+                append("c")
+                toAnnotatedString()
             }
-            withStyle(ParagraphStyle(lineHeight = 14.sp)) {
-                append("b")
-            }
-            append("c")
-            toAnnotatedString()
-        }
 
-        assertThat(annotatedString.subSequence("ab".length, annotatedString.length)).isEqualTo(
-            AnnotatedString("c")
-        )
+        assertThat(annotatedString.subSequence("ab".length, annotatedString.length))
+            .isEqualTo(AnnotatedString("c"))
     }
 
     @Test
     fun subSequence_doesNot_include_styles_after_the_end() {
-        val annotatedString = with(AnnotatedString.Builder()) {
-            append("a")
-            withStyle(SpanStyle(fontSize = 12.sp)) {
-                append("b")
+        val annotatedString =
+            with(AnnotatedString.Builder()) {
+                append("a")
+                withStyle(SpanStyle(fontSize = 12.sp)) { append("b") }
+                withStyle(ParagraphStyle(lineHeight = 14.sp)) { append("c") }
+                toAnnotatedString()
             }
-            withStyle(ParagraphStyle(lineHeight = 14.sp)) {
-                append("c")
-            }
-            toAnnotatedString()
-        }
 
-        assertThat(annotatedString.subSequence(0, "a".length)).isEqualTo(
-            AnnotatedString("a")
-        )
+        assertThat(annotatedString.subSequence(0, "a".length)).isEqualTo(AnnotatedString("a"))
     }
 
     @Test
     fun subSequence_collapsed_item_with_itemStart_equalTo_rangeStart() {
         val style = SpanStyle(fontSize = 12.sp)
-        val annotatedString = with(AnnotatedString.Builder()) {
-            append("abc")
-            // add collapsed item at the beginning of b
-            addStyle(style, 1, 1)
-            toAnnotatedString()
-        }
+        val annotatedString =
+            with(AnnotatedString.Builder()) {
+                append("abc")
+                // add collapsed item at the beginning of b
+                addStyle(style, 1, 1)
+                toAnnotatedString()
+            }
 
-        assertThat(annotatedString.subSequence(1, 2)).isEqualTo(
-            AnnotatedString("b", listOf(Range(style, 0, 0)))
-        )
+        assertThat(annotatedString.subSequence(1, 2))
+            .isEqualTo(AnnotatedString("b", listOf(Range(style, 0, 0))))
     }
 
     @Test
     fun subSequence_collapses_included_item() {
         val style = SpanStyle(fontSize = 12.sp)
-        val annotatedString = with(AnnotatedString.Builder()) {
-            append("a")
-            // will collapse this style in subsequence
-            withStyle(style) {
-                append("b")
+        val annotatedString =
+            with(AnnotatedString.Builder()) {
+                append("a")
+                // will collapse this style in subsequence
+                withStyle(style) { append("b") }
+                append("c")
+                toAnnotatedString()
             }
-            append("c")
-            toAnnotatedString()
-        }
 
         // subsequence with 1,1 will remove text, but include the style
-        assertThat(annotatedString.subSequence(1, 1)).isEqualTo(
-            AnnotatedString("", listOf(Range(style, 0, 0)))
-        )
+        assertThat(annotatedString.subSequence(1, 1))
+            .isEqualTo(AnnotatedString("", listOf(Range(style, 0, 0))))
     }
 
     @Test
     fun subSequence_collapses_covering_item() {
         val style = SpanStyle(fontSize = 12.sp)
-        val annotatedString = with(AnnotatedString.Builder()) {
-            withStyle(style) {
-                append("abc")
+        val annotatedString =
+            with(AnnotatedString.Builder()) {
+                withStyle(style) { append("abc") }
+                toAnnotatedString()
             }
-            toAnnotatedString()
-        }
 
-        assertThat(annotatedString.subSequence(1, 1)).isEqualTo(
-            AnnotatedString("", listOf(Range(style, 0, 0)))
-        )
+        assertThat(annotatedString.subSequence(1, 1))
+            .isEqualTo(AnnotatedString("", listOf(Range(style, 0, 0))))
     }
 
     @Test
     fun subSequence_with_collapsed_range_with_collapsed_item() {
         val style = SpanStyle(fontSize = 12.sp)
-        val annotatedString = with(AnnotatedString.Builder()) {
-            append("abc")
-            // add collapsed item at the beginning of b
-            addStyle(style, 1, 1)
-            toAnnotatedString()
-        }
+        val annotatedString =
+            with(AnnotatedString.Builder()) {
+                append("abc")
+                // add collapsed item at the beginning of b
+                addStyle(style, 1, 1)
+                toAnnotatedString()
+            }
 
-        assertThat(annotatedString.subSequence(1, 1)).isEqualTo(
-            AnnotatedString("", listOf(Range(style, 0, 0)))
-        )
+        assertThat(annotatedString.subSequence(1, 1))
+            .isEqualTo(AnnotatedString("", listOf(Range(style, 0, 0))))
     }
 
     @Test
     fun subSequence_includes_partial_matches() {
-        val annotatedString = with(AnnotatedString.Builder()) {
-            withStyle(SpanStyle(fontSize = 12.sp)) {
-                append("ab")
+        val annotatedString =
+            with(AnnotatedString.Builder()) {
+                withStyle(SpanStyle(fontSize = 12.sp)) { append("ab") }
+                withStyle(SpanStyle(fontSize = 12.sp)) { append("c") }
+                withStyle(ParagraphStyle(lineHeight = 14.sp)) { append("de") }
+                toAnnotatedString()
             }
-            withStyle(SpanStyle(fontSize = 12.sp)) {
-                append("c")
-            }
-            withStyle(ParagraphStyle(lineHeight = 14.sp)) {
-                append("de")
-            }
-            toAnnotatedString()
-        }
 
-        val expectedString = with(AnnotatedString.Builder()) {
-            withStyle(SpanStyle(fontSize = 12.sp)) {
-                append("b")
+        val expectedString =
+            with(AnnotatedString.Builder()) {
+                withStyle(SpanStyle(fontSize = 12.sp)) { append("b") }
+                withStyle(SpanStyle(fontSize = 12.sp)) { append("c") }
+                withStyle(ParagraphStyle(lineHeight = 14.sp)) { append("d") }
+                toAnnotatedString()
             }
-            withStyle(SpanStyle(fontSize = 12.sp)) {
-                append("c")
-            }
-            withStyle(ParagraphStyle(lineHeight = 14.sp)) {
-                append("d")
-            }
-            toAnnotatedString()
-        }
 
         val subSequence = annotatedString.subSequence("a".length, "abcd".length)
 
@@ -346,25 +321,18 @@
             append("ef")
         }
         // Collapsed range equals to end, no annotation
-        assertThat(annotatedString.subSequence(4, 4))
-            .isEqualTo(AnnotatedString(""))
+        assertThat(annotatedString.subSequence(4, 4)).isEqualTo(AnnotatedString(""))
 
         // Collapsed range equals to start, has annotation
         assertThat(annotatedString.subSequence(2, 2))
             .isEqualTo(
-                AnnotatedString(
-                    "",
-                    annotations = listOf(Range("annotation1", 0, 0, "scope1"))
-                )
+                AnnotatedString("", annotations = listOf(Range("annotation1", 0, 0, "scope1")))
             )
 
         // Collapsed range covered by annotation, has annotation
         assertThat(annotatedString.subSequence(3, 3))
             .isEqualTo(
-                AnnotatedString(
-                    "",
-                    annotations = listOf(Range("annotation1", 0, 0, "scope1"))
-                )
+                AnnotatedString("", annotations = listOf(Range("annotation1", 0, 0, "scope1")))
             )
     }
 
@@ -380,19 +348,13 @@
         // Overlapping range, has annotation
         assertThat(annotatedString.subSequence(0, 3))
             .isEqualTo(
-                AnnotatedString(
-                    "abc",
-                    annotations = listOf(Range("annotation1", 2, 3, "scope1"))
-                )
+                AnnotatedString("abc", annotations = listOf(Range("annotation1", 2, 3, "scope1")))
             )
 
         // Overlapping, has annotation
         assertThat(annotatedString.subSequence(3, 5))
             .isEqualTo(
-                AnnotatedString(
-                    "de",
-                    annotations = listOf(Range("annotation1", 0, 1, "scope1"))
-                )
+                AnnotatedString("de", annotations = listOf(Range("annotation1", 0, 1, "scope1")))
             )
     }
 
@@ -409,19 +371,13 @@
         // Contains range, has annotation
         assertThat(annotatedString.subSequence(0, 5))
             .isEqualTo(
-                AnnotatedString(
-                    "abcde",
-                    annotations = listOf(Range("annotation1", 2, 4, "scope1"))
-                )
+                AnnotatedString("abcde", annotations = listOf(Range("annotation1", 2, 4, "scope1")))
             )
 
         // Full range, has annotation
         assertThat(annotatedString.subSequence(2, 4))
             .isEqualTo(
-                AnnotatedString(
-                    "cd",
-                    annotations = listOf(Range("annotation1", 0, 2, "scope1"))
-                )
+                AnnotatedString("cd", annotations = listOf(Range("annotation1", 0, 2, "scope1")))
             )
     }
 
@@ -455,26 +411,18 @@
     fun constructor_function_with_single_spanStyle() {
         val text = "a"
         val spanStyle = SpanStyle(color = Color.Red)
-        assertThat(
-            AnnotatedString(text, spanStyle)
-        ).isEqualTo(
-            AnnotatedString(text, listOf(Range(spanStyle, 0, text.length)))
-        )
+        assertThat(AnnotatedString(text, spanStyle))
+            .isEqualTo(AnnotatedString(text, listOf(Range(spanStyle, 0, text.length))))
     }
 
     @Test
     fun constructor_function_with_single_paragraphStyle() {
         val text = "a"
         val paragraphStyle = ParagraphStyle(lineHeight = 12.sp)
-        assertThat(
-            AnnotatedString(text, paragraphStyle)
-        ).isEqualTo(
-            AnnotatedString(
-                text,
-                listOf(),
-                listOf(Range(paragraphStyle, 0, text.length))
+        assertThat(AnnotatedString(text, paragraphStyle))
+            .isEqualTo(
+                AnnotatedString(text, listOf(), listOf(Range(paragraphStyle, 0, text.length)))
             )
-        )
     }
 
     @Test
@@ -482,15 +430,14 @@
         val text = "a"
         val spanStyle = SpanStyle(color = Color.Red)
         val paragraphStyle = ParagraphStyle(lineHeight = 12.sp)
-        assertThat(
-            AnnotatedString(text, spanStyle, paragraphStyle)
-        ).isEqualTo(
-            AnnotatedString(
-                text,
-                listOf(Range(spanStyle, 0, text.length)),
-                listOf(Range(paragraphStyle, 0, text.length))
+        assertThat(AnnotatedString(text, spanStyle, paragraphStyle))
+            .isEqualTo(
+                AnnotatedString(
+                    text,
+                    listOf(Range(spanStyle, 0, text.length)),
+                    listOf(Range(paragraphStyle, 0, text.length))
+                )
             )
-        )
     }
 
     @Test
diff --git a/compose/ui/ui-text/src/androidUnitTest/kotlin/androidx/compose/ui/text/AnnotatedStringTransformTest.kt b/compose/ui/ui-text/src/androidUnitTest/kotlin/androidx/compose/ui/text/AnnotatedStringTransformTest.kt
index 20a0dc2..405dceb 100644
--- a/compose/ui/ui-text/src/androidUnitTest/kotlin/androidx/compose/ui/text/AnnotatedStringTransformTest.kt
+++ b/compose/ui/ui-text/src/androidUnitTest/kotlin/androidx/compose/ui/text/AnnotatedStringTransformTest.kt
@@ -34,25 +34,22 @@
     private val paraStyle1 = ParagraphStyle(lineHeight = 10.sp)
     private val paraStyle2 = ParagraphStyle(lineHeight = 20.sp)
 
-    /**
-     * Helper function for creating AnnotatedString.Item with TextRange.
-     */
+    /** Helper function for creating AnnotatedString.Item with TextRange. */
     private fun <T> makeRange(style: T, range: TextRange) =
         AnnotatedString.Range(style, range.min, range.max)
 
     /**
      * Make AnnotatedString.Item with original string with using "(" and ")" characters.
      *
-     * For example.
-     *   val text = "aaa bbb ccc"
+     * For example. val text = "aaa bbb ccc"
      *
-     *   AnnotatedString.Item(STYLE, 4, 8)
+     * AnnotatedString.Item(STYLE, 4, 8)
      *
      * can be written as
      *
-     *   val text = "aaa bbb ccc"
+     * val text = "aaa bbb ccc"
      *
-     *   makeRange(STYLE, "aaa (bbb )ccc")
+     * makeRange(STYLE, "aaa (bbb )ccc")
      */
     private fun <T> makeRange(style: T, rangeStr: String): AnnotatedString.Range<T> {
         val start = rangeStr.indexOf('(')
@@ -73,10 +70,7 @@
 
     @Test
     fun `English uppercase sparse`() {
-        val input = AnnotatedString(
-            "aaa bbb ccc",
-            listOf(makeRange(spanStyle1, "aaa (bbb) ccc"))
-        )
+        val input = AnnotatedString("aaa bbb ccc", listOf(makeRange(spanStyle1, "aaa (bbb) ccc")))
 
         val uppercase = input.toUpperCase()
 
@@ -85,18 +79,19 @@
 
     @Test
     fun `English uppercase`() {
-        val input = AnnotatedString(
-            "aaa bbb ccc",
-            listOf(
-                makeRange(spanStyle1, "(aaa bbb ccc)"),
-                makeRange(spanStyle2, "(aaa )bbb ccc"),
-                makeRange(spanStyle3, "aaa (bbb ccc)")
-            ),
-            listOf(
-                makeRange(paraStyle1, "(aaa bbb )ccc"),
-                makeRange(paraStyle2, "aaa bbb (ccc)")
+        val input =
+            AnnotatedString(
+                "aaa bbb ccc",
+                listOf(
+                    makeRange(spanStyle1, "(aaa bbb ccc)"),
+                    makeRange(spanStyle2, "(aaa )bbb ccc"),
+                    makeRange(spanStyle3, "aaa (bbb ccc)")
+                ),
+                listOf(
+                    makeRange(paraStyle1, "(aaa bbb )ccc"),
+                    makeRange(paraStyle2, "aaa bbb (ccc)")
+                )
             )
-        )
 
         val uppercase = input.toUpperCase()
 
@@ -107,18 +102,19 @@
 
     @Test
     fun `English lowercase`() {
-        val input = AnnotatedString(
-            "aaa bbb ccc",
-            listOf(
-                makeRange(spanStyle1, "(aaa bbb ccc)"),
-                makeRange(spanStyle2, "(aaa )bbb ccc"),
-                makeRange(spanStyle3, "aaa (bbb ccc)")
-            ),
-            listOf(
-                makeRange(paraStyle1, "(aaa bbb )ccc"),
-                makeRange(paraStyle2, "aaa bbb (ccc)")
+        val input =
+            AnnotatedString(
+                "aaa bbb ccc",
+                listOf(
+                    makeRange(spanStyle1, "(aaa bbb ccc)"),
+                    makeRange(spanStyle2, "(aaa )bbb ccc"),
+                    makeRange(spanStyle3, "aaa (bbb ccc)")
+                ),
+                listOf(
+                    makeRange(paraStyle1, "(aaa bbb )ccc"),
+                    makeRange(paraStyle2, "aaa bbb (ccc)")
+                )
             )
-        )
 
         val lowercase = input.toLowerCase()
 
@@ -129,121 +125,123 @@
 
     @Test
     fun `English capitalize`() {
-        val input = AnnotatedString(
-            "aaa bbb ccc",
-            listOf(
-                makeRange(spanStyle1, "(aaa bbb ccc)"),
-                makeRange(spanStyle2, "(aaa )bbb ccc"),
-                makeRange(spanStyle3, "aaa (bbb ccc)")
-            ),
-            listOf(
-                makeRange(paraStyle1, "(aaa bbb )ccc"),
-                makeRange(paraStyle2, "aaa bbb (ccc)")
+        val input =
+            AnnotatedString(
+                "aaa bbb ccc",
+                listOf(
+                    makeRange(spanStyle1, "(aaa bbb ccc)"),
+                    makeRange(spanStyle2, "(aaa )bbb ccc"),
+                    makeRange(spanStyle3, "aaa (bbb ccc)")
+                ),
+                listOf(
+                    makeRange(paraStyle1, "(aaa bbb )ccc"),
+                    makeRange(paraStyle2, "aaa bbb (ccc)")
+                )
             )
-        )
 
         val capitalized = input.capitalize()
 
-        assertThat(capitalized.text).isEqualTo(
-            input.text.replaceFirstChar {
-                if (it.isLowerCase()) it.titlecase(
-                    Locale.getDefault()
-                ) else it.toString()
-            }
-        )
+        assertThat(capitalized.text)
+            .isEqualTo(
+                input.text.replaceFirstChar {
+                    if (it.isLowerCase()) it.titlecase(Locale.getDefault()) else it.toString()
+                }
+            )
         assertThat(capitalized.spanStyles).isEqualTo(input.spanStyles)
         assertThat(capitalized.paragraphStyles).isEqualTo(input.paragraphStyles)
     }
 
     @Test
     fun `English decapitalize`() {
-        val input = AnnotatedString(
-            "aaa bbb ccc",
-            listOf(
-                makeRange(spanStyle1, "(aaa bbb ccc)"),
-                makeRange(spanStyle2, "(aaa )bbb ccc"),
-                makeRange(spanStyle3, "aaa (bbb ccc)")
-            ),
-            listOf(
-                makeRange(paraStyle1, "(aaa bbb )ccc"),
-                makeRange(paraStyle2, "aaa bbb (ccc)")
+        val input =
+            AnnotatedString(
+                "aaa bbb ccc",
+                listOf(
+                    makeRange(spanStyle1, "(aaa bbb ccc)"),
+                    makeRange(spanStyle2, "(aaa )bbb ccc"),
+                    makeRange(spanStyle3, "aaa (bbb ccc)")
+                ),
+                listOf(
+                    makeRange(paraStyle1, "(aaa bbb )ccc"),
+                    makeRange(paraStyle2, "aaa bbb (ccc)")
+                )
             )
-        )
 
         val decapitalized = input.decapitalize()
 
-        assertThat(decapitalized.text).isEqualTo(
-            input.text.replaceFirstChar { it.lowercase(Locale.getDefault()) }
-        )
+        assertThat(decapitalized.text)
+            .isEqualTo(input.text.replaceFirstChar { it.lowercase(Locale.getDefault()) })
         assertThat(decapitalized.spanStyles).isEqualTo(input.spanStyles)
         assertThat(decapitalized.paragraphStyles).isEqualTo(input.paragraphStyles)
     }
 
     @Test
     fun `locale dependent capitalize (Turkish)`() {
-        val input = AnnotatedString(
-            "iii hhh jjj",
-            listOf(
-                makeRange(spanStyle1, "(iii hhh jjj)"),
-                makeRange(spanStyle2, "(iii )hhh jjj"),
-                makeRange(spanStyle3, "iii (hhh jjj)")
-            ),
-            listOf(
-                makeRange(paraStyle1, "(iii hhh )jjj"),
-                makeRange(paraStyle2, "iii hhh (jjj)")
+        val input =
+            AnnotatedString(
+                "iii hhh jjj",
+                listOf(
+                    makeRange(spanStyle1, "(iii hhh jjj)"),
+                    makeRange(spanStyle2, "(iii )hhh jjj"),
+                    makeRange(spanStyle3, "iii (hhh jjj)")
+                ),
+                listOf(
+                    makeRange(paraStyle1, "(iii hhh )jjj"),
+                    makeRange(paraStyle2, "iii hhh (jjj)")
+                )
             )
-        )
         val capitalized = input.capitalize(LocaleList("tr"))
 
-        assertThat(capitalized.text).isEqualTo(
-            input.text.replaceFirstChar {
-                if (it.isLowerCase()) it.titlecase(
-                    Locale.forLanguageTag("tr")
-                ) else it.toString()
-            }
-        )
+        assertThat(capitalized.text)
+            .isEqualTo(
+                input.text.replaceFirstChar {
+                    if (it.isLowerCase()) it.titlecase(Locale.forLanguageTag("tr"))
+                    else it.toString()
+                }
+            )
         assertThat(capitalized.spanStyles).isEqualTo(input.spanStyles)
         assertThat(capitalized.paragraphStyles).isEqualTo(input.paragraphStyles)
     }
 
     @Test
     fun `locale dependent decapitalize (Turkish)`() {
-        val input = AnnotatedString(
-            "III HHH JJJ",
-            listOf(
-                makeRange(spanStyle1, "(III HHH JJJ)"),
-                makeRange(spanStyle2, "(III )HHH JJJ"),
-                makeRange(spanStyle3, "III (HHH JJJ)")
-            ),
-            listOf(
-                makeRange(paraStyle1, "(III HHH )JJJ"),
-                makeRange(paraStyle2, "III HHH (JJJ)")
+        val input =
+            AnnotatedString(
+                "III HHH JJJ",
+                listOf(
+                    makeRange(spanStyle1, "(III HHH JJJ)"),
+                    makeRange(spanStyle2, "(III )HHH JJJ"),
+                    makeRange(spanStyle3, "III (HHH JJJ)")
+                ),
+                listOf(
+                    makeRange(paraStyle1, "(III HHH )JJJ"),
+                    makeRange(paraStyle2, "III HHH (JJJ)")
+                )
             )
-        )
 
         val decapitalized = input.decapitalize(LocaleList("tr"))
 
-        assertThat(decapitalized.text).isEqualTo(
-            input.text.replaceFirstChar { it.lowercase(Locale.forLanguageTag("tr")) }
-        )
+        assertThat(decapitalized.text)
+            .isEqualTo(input.text.replaceFirstChar { it.lowercase(Locale.forLanguageTag("tr")) })
         assertThat(decapitalized.spanStyles).isEqualTo(input.spanStyles)
         assertThat(decapitalized.paragraphStyles).isEqualTo(input.paragraphStyles)
     }
 
     @Test
     fun `locale dependent uppercase or lowercase (Turkish uppercase)`() {
-        val input = AnnotatedString(
-            "hhh iii jjj",
-            listOf(
-                makeRange(spanStyle1, "(hhh iii jjj)"),
-                makeRange(spanStyle2, "(hhh )iii jjj"),
-                makeRange(spanStyle3, "hhh (iii jjj)")
-            ),
-            listOf(
-                makeRange(paraStyle1, "(hhh iii )jjj"),
-                makeRange(paraStyle2, "hhh iii (jjj)")
+        val input =
+            AnnotatedString(
+                "hhh iii jjj",
+                listOf(
+                    makeRange(spanStyle1, "(hhh iii jjj)"),
+                    makeRange(spanStyle2, "(hhh )iii jjj"),
+                    makeRange(spanStyle3, "hhh (iii jjj)")
+                ),
+                listOf(
+                    makeRange(paraStyle1, "(hhh iii )jjj"),
+                    makeRange(paraStyle2, "hhh iii (jjj)")
+                )
             )
-        )
 
         val uppercase = input.toUpperCase(LocaleList("tr"))
 
@@ -251,73 +249,77 @@
 
         val upperI = "i".uppercase(Locale.forLanguageTag("tr"))
 
-        assertThat(uppercase.spanStyles).isEqualTo(
-            listOf(
-                makeRange(spanStyle1, "(HHH $upperI$upperI$upperI JJJ)"),
-                makeRange(spanStyle2, "(HHH )$upperI$upperI$upperI JJJ"),
-                makeRange(spanStyle3, "HHH ($upperI$upperI$upperI JJJ)")
+        assertThat(uppercase.spanStyles)
+            .isEqualTo(
+                listOf(
+                    makeRange(spanStyle1, "(HHH $upperI$upperI$upperI JJJ)"),
+                    makeRange(spanStyle2, "(HHH )$upperI$upperI$upperI JJJ"),
+                    makeRange(spanStyle3, "HHH ($upperI$upperI$upperI JJJ)")
+                )
             )
-        )
-        assertThat(uppercase.paragraphStyles).isEqualTo(
-            listOf(
-                makeRange(paraStyle1, "(HHH $upperI$upperI$upperI )JJJ"),
-                makeRange(paraStyle2, "HHH $upperI$upperI$upperI (JJJ)")
+        assertThat(uppercase.paragraphStyles)
+            .isEqualTo(
+                listOf(
+                    makeRange(paraStyle1, "(HHH $upperI$upperI$upperI )JJJ"),
+                    makeRange(paraStyle2, "HHH $upperI$upperI$upperI (JJJ)")
+                )
             )
-        )
     }
 
     @Test
     fun `not 1-by-1 mapping uppercase or lowercase (Lithuanian lowercase)`() {
-        val input = AnnotatedString(
-            "HHH ÌÌÌ YYY",
-            listOf(
-                makeRange(spanStyle1, "(HHH ÌÌÌ YYY)"),
-                makeRange(spanStyle2, "(HHH )ÌÌÌ YYY"),
-                makeRange(spanStyle3, "HHH (ÌÌÌ YYY)")
-            ),
-            listOf(
-                makeRange(paraStyle1, "(HHH ÌÌÌ )YYY"),
-                makeRange(paraStyle2, "HHH ÌÌÌ (YYY)")
+        val input =
+            AnnotatedString(
+                "HHH ÌÌÌ YYY",
+                listOf(
+                    makeRange(spanStyle1, "(HHH ÌÌÌ YYY)"),
+                    makeRange(spanStyle2, "(HHH )ÌÌÌ YYY"),
+                    makeRange(spanStyle3, "HHH (ÌÌÌ YYY)")
+                ),
+                listOf(
+                    makeRange(paraStyle1, "(HHH ÌÌÌ )YYY"),
+                    makeRange(paraStyle2, "HHH ÌÌÌ (YYY)")
+                )
             )
-        )
 
         val lowercase = input.toLowerCase(LocaleList("lt"))
 
-        assertThat(lowercase.text).isEqualTo(
-            input.text.lowercase(Locale.forLanguageTag("lt"))
-        )
+        assertThat(lowercase.text).isEqualTo(input.text.lowercase(Locale.forLanguageTag("lt")))
 
         // Usually generate U+0069 U+0307 U+0300
         val lowerIDot = "Ì".lowercase(Locale.forLanguageTag("lt"))
-        assertThat(lowercase.spanStyles).isEqualTo(
-            listOf(
-                makeRange(spanStyle1, "(hhh $lowerIDot$lowerIDot$lowerIDot yyy)"),
-                makeRange(spanStyle2, "(hhh )$lowerIDot$lowerIDot$lowerIDot yyy"),
-                makeRange(spanStyle3, "hhh ($lowerIDot$lowerIDot$lowerIDot yyy)")
+        assertThat(lowercase.spanStyles)
+            .isEqualTo(
+                listOf(
+                    makeRange(spanStyle1, "(hhh $lowerIDot$lowerIDot$lowerIDot yyy)"),
+                    makeRange(spanStyle2, "(hhh )$lowerIDot$lowerIDot$lowerIDot yyy"),
+                    makeRange(spanStyle3, "hhh ($lowerIDot$lowerIDot$lowerIDot yyy)")
+                )
             )
-        )
-        assertThat(lowercase.paragraphStyles).isEqualTo(
-            listOf(
-                makeRange(paraStyle1, "(hhh $lowerIDot$lowerIDot$lowerIDot )yyy"),
-                makeRange(paraStyle2, "hhh $lowerIDot$lowerIDot$lowerIDot (yyy)")
+        assertThat(lowercase.paragraphStyles)
+            .isEqualTo(
+                listOf(
+                    makeRange(paraStyle1, "(hhh $lowerIDot$lowerIDot$lowerIDot )yyy"),
+                    makeRange(paraStyle2, "hhh $lowerIDot$lowerIDot$lowerIDot (yyy)")
+                )
             )
-        )
     }
 
     @Test
     fun `nothing happens for CJK uppercase or lowercase (Japanese uppercase)`() {
-        val input = AnnotatedString(
-            "あああ いいい ううう",
-            listOf(
-                makeRange(spanStyle1, "(あああ いいい ううう)"),
-                makeRange(spanStyle2, "(あああ )いいい ううう"),
-                makeRange(spanStyle3, "あああ (いいい ううう)")
-            ),
-            listOf(
-                makeRange(paraStyle1, "(あああ いいい )ううう"),
-                makeRange(paraStyle2, "あああ いいい (ううう)")
+        val input =
+            AnnotatedString(
+                "あああ いいい ううう",
+                listOf(
+                    makeRange(spanStyle1, "(あああ いいい ううう)"),
+                    makeRange(spanStyle2, "(あああ )いいい ううう"),
+                    makeRange(spanStyle3, "あああ (いいい ううう)")
+                ),
+                listOf(
+                    makeRange(paraStyle1, "(あああ いいい )ううう"),
+                    makeRange(paraStyle2, "あああ いいい (ううう)")
+                )
             )
-        )
 
         val uppercase = input.toUpperCase()
 
diff --git a/compose/ui/ui-text/src/androidUnitTest/kotlin/androidx/compose/ui/text/MultiParagraphTest.kt b/compose/ui/ui-text/src/androidUnitTest/kotlin/androidx/compose/ui/text/MultiParagraphTest.kt
index 469b97e6..51d2af0 100644
--- a/compose/ui/ui-text/src/androidUnitTest/kotlin/androidx/compose/ui/text/MultiParagraphTest.kt
+++ b/compose/ui/ui-text/src/androidUnitTest/kotlin/androidx/compose/ui/text/MultiParagraphTest.kt
@@ -29,14 +29,14 @@
         val paragraphNumber = 5
         val paragraphLength = 10
         var start = 0
-        val paragraphInfoList = List(paragraphNumber) {
-            val end = start + paragraphLength
-            ParagraphInfo(mock(), start, end).also { start = end }
-        }
+        val paragraphInfoList =
+            List(paragraphNumber) {
+                val end = start + paragraphLength
+                ParagraphInfo(mock(), start, end).also { start = end }
+            }
 
         for (i in 0 until paragraphNumber * paragraphLength) {
-            assertThat(findParagraphByIndex(paragraphInfoList, i))
-                .isEqualTo(i / paragraphLength)
+            assertThat(findParagraphByIndex(paragraphInfoList, i)).isEqualTo(i / paragraphLength)
         }
     }
 
@@ -45,12 +45,12 @@
         val paragraphNumber = 5
         val paragraphLineCount = 10
         var startLine = 0
-        val paragraphInfoList = List(paragraphNumber) {
-            val endLine = startLine + paragraphLineCount
-            // StartIndex and endIndex doesn't matter in this test
-            ParagraphInfo(mock(), 0, 0, startLine, endLine)
-                .also { startLine = endLine }
-        }
+        val paragraphInfoList =
+            List(paragraphNumber) {
+                val endLine = startLine + paragraphLineCount
+                // StartIndex and endIndex doesn't matter in this test
+                ParagraphInfo(mock(), 0, 0, startLine, endLine).also { startLine = endLine }
+            }
 
         for (i in 0 until paragraphNumber * paragraphLineCount) {
             assertThat(findParagraphByLineIndex(paragraphInfoList, i))
@@ -63,12 +63,12 @@
         val paragraphNumber = 5
         val paragraphHeight = 10
         var top = 0.0f
-        val paragraphInfoList = List(paragraphNumber) {
-            val bottom = top + paragraphHeight
-            // StartIndex and endIndex doesn't matter in this test
-            ParagraphInfo(mock(), 0, 0, top = top, bottom = bottom)
-                .also { top = bottom }
-        }
+        val paragraphInfoList =
+            List(paragraphNumber) {
+                val bottom = top + paragraphHeight
+                // StartIndex and endIndex doesn't matter in this test
+                ParagraphInfo(mock(), 0, 0, top = top, bottom = bottom).also { top = bottom }
+            }
 
         for (i in 0 until paragraphNumber * paragraphHeight) {
             assertThat(findParagraphByY(paragraphInfoList, i.toFloat()))
diff --git a/compose/ui/ui-text/src/androidUnitTest/kotlin/androidx/compose/ui/text/ParagraphStyleTest.kt b/compose/ui/ui-text/src/androidUnitTest/kotlin/androidx/compose/ui/text/ParagraphStyleTest.kt
index 8b20ad5..28b307d 100644
--- a/compose/ui/ui-text/src/androidUnitTest/kotlin/androidx/compose/ui/text/ParagraphStyleTest.kt
+++ b/compose/ui/ui-text/src/androidUnitTest/kotlin/androidx/compose/ui/text/ParagraphStyleTest.kt
@@ -78,9 +78,7 @@
 
         val newStyle = style.merge(otherStyle)
 
-        assertThat(newStyle.textDirection).isEqualTo(
-            otherStyle.textDirection
-        )
+        assertThat(newStyle.textDirection).isEqualTo(otherStyle.textDirection)
     }
 
     @Test
@@ -253,21 +251,18 @@
 
     @Test
     fun `plus operator merges`() {
-        val style = ParagraphStyle(
-            textAlign = TextAlign.Center,
-            textDirection = TextDirection.Rtl
-        ) + ParagraphStyle(
-            textAlign = TextAlign.Justify,
-            lineHeight = 12.sp
-        )
+        val style =
+            ParagraphStyle(textAlign = TextAlign.Center, textDirection = TextDirection.Rtl) +
+                ParagraphStyle(textAlign = TextAlign.Justify, lineHeight = 12.sp)
 
-        assertThat(style).isEqualTo(
-            ParagraphStyle(
-                textAlign = TextAlign.Justify, // overridden by RHS
-                textDirection = TextDirection.Rtl, // from LHS,
-                lineHeight = 12.sp // from RHS
+        assertThat(style)
+            .isEqualTo(
+                ParagraphStyle(
+                    textAlign = TextAlign.Justify, // overridden by RHS
+                    textDirection = TextDirection.Rtl, // from LHS,
+                    lineHeight = 12.sp // from RHS
+                )
             )
-        )
     }
 
     @Test
@@ -378,9 +373,7 @@
 
         val newStyle = lerp(start = style1, stop = style2, fraction = fraction)
 
-        assertThat(newStyle.textIndent).isEqualTo(
-            lerp(TextIndent(), style2.textIndent!!, fraction)
-        )
+        assertThat(newStyle.textIndent).isEqualTo(lerp(TextIndent(), style2.textIndent!!, fraction))
     }
 
     @Test
@@ -390,9 +383,8 @@
         val fraction = 0.6f
         val newStyle = lerp(start = style1, stop = style2, fraction = fraction)
 
-        assertThat(newStyle.textIndent).isEqualTo(
-            lerp(style1.textIndent!!, style2.textIndent!!, fraction)
-        )
+        assertThat(newStyle.textIndent)
+            .isEqualTo(lerp(style1.textIndent!!, style2.textIndent!!, fraction))
     }
 
     @Test
@@ -403,9 +395,8 @@
 
         val newStyle = lerp(start = style1, stop = style2, fraction = fraction)
 
-        assertThat(newStyle.lineHeight).isEqualTo(
-            lerp(style1.lineHeight, style2.lineHeight, fraction)
-        )
+        assertThat(newStyle.lineHeight)
+            .isEqualTo(lerp(style1.lineHeight, style2.lineHeight, fraction))
     }
 
     @Test
@@ -556,34 +547,25 @@
 
     @Test
     fun `hashCode is different for different line height behavior`() {
-        val style = ParagraphStyle(
-            lineHeightStyle = LineHeightStyle(
-                alignment = Alignment.Bottom,
-                trim = Trim.None
+        val style =
+            ParagraphStyle(
+                lineHeightStyle = LineHeightStyle(alignment = Alignment.Bottom, trim = Trim.None)
             )
-        )
-        val otherStyle = ParagraphStyle(
-            lineHeightStyle = LineHeightStyle(
-                alignment = Alignment.Center,
-                trim = Trim.Both
+        val otherStyle =
+            ParagraphStyle(
+                lineHeightStyle = LineHeightStyle(alignment = Alignment.Center, trim = Trim.Both)
             )
-        )
 
         assertThat(style.hashCode()).isNotEqualTo(otherStyle.hashCode())
     }
 
     @Test
     fun `copy with lineHeightStyle returns new lineHeightStyle`() {
-        val style = ParagraphStyle(
-            lineHeightStyle = LineHeightStyle(
-                alignment = Alignment.Bottom,
-                trim = Trim.None
+        val style =
+            ParagraphStyle(
+                lineHeightStyle = LineHeightStyle(alignment = Alignment.Bottom, trim = Trim.None)
             )
-        )
-        val newLineHeightStyle = LineHeightStyle(
-            alignment = Alignment.Center,
-            trim = Trim.Both
-        )
+        val newLineHeightStyle = LineHeightStyle(alignment = Alignment.Center, trim = Trim.Both)
         val newStyle = style.copy(lineHeightStyle = newLineHeightStyle)
 
         assertThat(newStyle.lineHeightStyle).isEqualTo(newLineHeightStyle)
@@ -591,12 +573,10 @@
 
     @Test
     fun `copy without lineHeightStyle uses existing lineHeightStyle`() {
-        val style = ParagraphStyle(
-            lineHeightStyle = LineHeightStyle(
-                alignment = Alignment.Bottom,
-                trim = Trim.Both
+        val style =
+            ParagraphStyle(
+                lineHeightStyle = LineHeightStyle(alignment = Alignment.Bottom, trim = Trim.Both)
             )
-        )
         val newStyle = style.copy()
 
         assertThat(newStyle.lineHeightStyle).isEqualTo(style.lineHeightStyle)
@@ -698,18 +678,14 @@
 
     @Test
     fun `merge with both non-null lineHeightStyle returns other's lineHeightStyle`() {
-        val style = ParagraphStyle(
-            lineHeightStyle = LineHeightStyle(
-                alignment = Alignment.Center,
-                trim = Trim.None
+        val style =
+            ParagraphStyle(
+                lineHeightStyle = LineHeightStyle(alignment = Alignment.Center, trim = Trim.None)
             )
-        )
-        val otherStyle = ParagraphStyle(
-            lineHeightStyle = LineHeightStyle(
-                alignment = Alignment.Bottom,
-                trim = Trim.Both
+        val otherStyle =
+            ParagraphStyle(
+                lineHeightStyle = LineHeightStyle(alignment = Alignment.Bottom, trim = Trim.Both)
             )
-        )
 
         val newStyle = style.merge(otherStyle)
 
diff --git a/compose/ui/ui-text/src/androidUnitTest/kotlin/androidx/compose/ui/text/SaversTest.kt b/compose/ui/ui-text/src/androidUnitTest/kotlin/androidx/compose/ui/text/SaversTest.kt
index 8816d22..65599eb 100644
--- a/compose/ui/ui-text/src/androidUnitTest/kotlin/androidx/compose/ui/text/SaversTest.kt
+++ b/compose/ui/ui-text/src/androidUnitTest/kotlin/androidx/compose/ui/text/SaversTest.kt
@@ -145,12 +145,13 @@
 
     @Test
     fun test_ParagraphStyle_with_no_null_value() {
-        val original = ParagraphStyle(
-            textAlign = TextAlign.Justify,
-            textDirection = TextDirection.Rtl,
-            lineHeight = 10.sp,
-            textIndent = TextIndent(firstLine = 2.sp, restLine = 3.sp)
-        )
+        val original =
+            ParagraphStyle(
+                textAlign = TextAlign.Justify,
+                textDirection = TextDirection.Rtl,
+                lineHeight = 10.sp,
+                textIndent = TextIndent(firstLine = 2.sp, restLine = 3.sp)
+            )
         val saved = save(original, ParagraphStyleSaver, defaultSaverScope)
         val restored: ParagraphStyle? = restore(saved, ParagraphStyleSaver)
 
@@ -177,26 +178,23 @@
 
     @Test
     fun test_SpanStyle_with_no_null_value() {
-        val original = SpanStyle(
-            color = Color.Red,
-            fontSize = 10.sp,
-            fontWeight = FontWeight.Bold,
-            fontStyle = FontStyle.Italic,
-            fontSynthesis = FontSynthesis.All,
-            // fontFamily =
-            fontFeatureSettings = "feature settings",
-            letterSpacing = 2.em,
-            baselineShift = BaselineShift.Superscript,
-            textGeometricTransform = TextGeometricTransform(2f, 3f),
-            localeList = LocaleList(
-                Locale("sr-Latn-SR"),
-                Locale("sr-Cyrl-SR"),
-                Locale.current
-            ),
-            background = Color.Blue,
-            textDecoration = TextDecoration.LineThrough,
-            shadow = Shadow(color = Color.Red, offset = Offset(2f, 2f), blurRadius = 4f)
-        )
+        val original =
+            SpanStyle(
+                color = Color.Red,
+                fontSize = 10.sp,
+                fontWeight = FontWeight.Bold,
+                fontStyle = FontStyle.Italic,
+                fontSynthesis = FontSynthesis.All,
+                // fontFamily =
+                fontFeatureSettings = "feature settings",
+                letterSpacing = 2.em,
+                baselineShift = BaselineShift.Superscript,
+                textGeometricTransform = TextGeometricTransform(2f, 3f),
+                localeList = LocaleList(Locale("sr-Latn-SR"), Locale("sr-Cyrl-SR"), Locale.current),
+                background = Color.Blue,
+                textDecoration = TextDecoration.LineThrough,
+                shadow = Shadow(color = Color.Red, offset = Offset(2f, 2f), blurRadius = 4f)
+            )
         val saved = save(original, SpanStyleSaver, defaultSaverScope)
         val restored: SpanStyle? = restore(saved, SpanStyleSaver)
 
@@ -214,12 +212,13 @@
 
     @Test
     fun test_TextLinkStyles_withNonNullValues() {
-        val original = TextLinkStyles(
-            SpanStyle(color = Color.Red),
-            SpanStyle(color = Color.Green),
-            SpanStyle(color = Color.Blue),
-            SpanStyle(color = Color.Gray)
-        )
+        val original =
+            TextLinkStyles(
+                SpanStyle(color = Color.Red),
+                SpanStyle(color = Color.Green),
+                SpanStyle(color = Color.Blue),
+                SpanStyle(color = Color.Gray)
+            )
         val saved = save(original, TextLinkStylesSaver, defaultSaverScope)
         val restored: TextLinkStyles? = restore(saved, TextLinkStylesSaver)
 
@@ -264,9 +263,8 @@
 
     @Test
     fun test_TextDecoration() {
-        val original = TextDecoration.combine(
-            listOf(TextDecoration.LineThrough, TextDecoration.Underline)
-        )
+        val original =
+            TextDecoration.combine(listOf(TextDecoration.LineThrough, TextDecoration.Underline))
         val saved = save(original, TextDecoration.Saver, defaultSaverScope)
         val restored: TextDecoration? = restore(saved, TextDecoration.Saver)
 
@@ -390,7 +388,9 @@
                         SpanStyle(color = Color.White)
                     )
                 )
-            ) { append("7") }
+            ) {
+                append("7")
+            }
             withLink(
                 LinkAnnotation.Clickable(
                     "tag3",
@@ -438,7 +438,9 @@
                         SpanStyle(color = Color.Yellow)
                     )
                 )
-            ) { append("11") }
+            ) {
+                append("11")
+            }
             withLink(
                 LinkAnnotation.Clickable(
                     "tag3",
@@ -471,11 +473,7 @@
 
     @Test
     fun test_LocaleList() {
-        val original = LocaleList(
-            Locale("sr-Latn-SR"),
-            Locale("sr-Cyrl-SR"),
-            Locale.current
-        )
+        val original = LocaleList(Locale("sr-Latn-SR"), Locale("sr-Cyrl-SR"), Locale.current)
         val saved = with(LocaleList.Saver) { defaultSaverScope.save(original) }
 
         assertThat(LocaleList.Saver.restore(saved!!)).isEqualTo(original)
diff --git a/compose/ui/ui-text/src/androidUnitTest/kotlin/androidx/compose/ui/text/SpanStyleTest.kt b/compose/ui/ui-text/src/androidUnitTest/kotlin/androidx/compose/ui/text/SpanStyleTest.kt
index 3872a3b..7ae936e 100644
--- a/compose/ui/ui-text/src/androidUnitTest/kotlin/androidx/compose/ui/text/SpanStyleTest.kt
+++ b/compose/ui/ui-text/src/androidUnitTest/kotlin/androidx/compose/ui/text/SpanStyleTest.kt
@@ -532,21 +532,18 @@
 
     @Test
     fun `plus operator merges`() {
-        val style = SpanStyle(
-            color = Color.Red,
-            fontWeight = FontWeight.Bold
-        ) + SpanStyle(
-            color = Color.Green,
-            fontFamily = FontFamily.Cursive
-        )
+        val style =
+            SpanStyle(color = Color.Red, fontWeight = FontWeight.Bold) +
+                SpanStyle(color = Color.Green, fontFamily = FontFamily.Cursive)
 
-        assertThat(style).isEqualTo(
-            SpanStyle(
-                color = Color.Green, // overridden by RHS
-                fontWeight = FontWeight.Bold, // from LHS,
-                fontFamily = FontFamily.Cursive // from RHS
+        assertThat(style)
+            .isEqualTo(
+                SpanStyle(
+                    color = Color.Green, // overridden by RHS
+                    fontWeight = FontWeight.Bold, // from LHS,
+                    fontFamily = FontFamily.Cursive // from RHS
+                )
             )
-        )
     }
 
     @Test
@@ -736,8 +733,7 @@
 
         val newSpanStyle = lerp(start = style1, stop = style2, fraction = t)
 
-        assertThat(newSpanStyle.baselineShift)
-            .isEqualTo(lerp(baselineShift1, baselineShift2, t))
+        assertThat(newSpanStyle.baselineShift).isEqualTo(lerp(baselineShift1, baselineShift2, t))
     }
 
     @Test
diff --git a/compose/ui/ui-text/src/androidUnitTest/kotlin/androidx/compose/ui/text/TextInputServiceTest.kt b/compose/ui/ui-text/src/androidUnitTest/kotlin/androidx/compose/ui/text/TextInputServiceTest.kt
index 9c0fa11..3fcb905 100644
--- a/compose/ui/ui-text/src/androidUnitTest/kotlin/androidx/compose/ui/text/TextInputServiceTest.kt
+++ b/compose/ui/ui-text/src/androidUnitTest/kotlin/androidx/compose/ui/text/TextInputServiceTest.kt
@@ -46,18 +46,20 @@
 
         val textInputService = TextInputService(platformService)
 
-        val firstSession = textInputService.startInput(
-            TextFieldValue(),
-            ImeOptions.Default,
-            {}, // onEditCommand
-            {} // onImeActionPerformed
-        )
-        val secondSession = textInputService.startInput(
-            TextFieldValue(),
-            ImeOptions.Default,
-            {}, // onEditCommand
-            {} // onImeActionPerformed
-        )
+        val firstSession =
+            textInputService.startInput(
+                TextFieldValue(),
+                ImeOptions.Default,
+                {}, // onEditCommand
+                {} // onImeActionPerformed
+            )
+        val secondSession =
+            textInputService.startInput(
+                TextFieldValue(),
+                ImeOptions.Default,
+                {}, // onEditCommand
+                {} // onImeActionPerformed
+            )
 
         assertThat(firstSession).isNotEqualTo(secondSession)
     }
@@ -67,18 +69,20 @@
         val platformService = mock<PlatformTextInputService>()
         val textInputService = TextInputService(platformService)
 
-        val firstSession = textInputService.startInput(
-            TextFieldValue(),
-            ImeOptions.Default,
-            {}, // onEditCommand
-            {} // onImeActionPerformed
-        )
-        val secondSession = textInputService.startInput(
-            TextFieldValue(),
-            ImeOptions.Default,
-            {}, // onEditCommand
-            {} // onImeActionPerformed
-        )
+        val firstSession =
+            textInputService.startInput(
+                TextFieldValue(),
+                ImeOptions.Default,
+                {}, // onEditCommand
+                {} // onImeActionPerformed
+            )
+        val secondSession =
+            textInputService.startInput(
+                TextFieldValue(),
+                ImeOptions.Default,
+                {}, // onEditCommand
+                {} // onImeActionPerformed
+            )
 
         assertThat(firstSession.isOpen).isFalse()
         assertThat(secondSession.isOpen).isTrue()
@@ -90,12 +94,13 @@
 
         val textInputService = TextInputService(platformService)
 
-        val session = textInputService.startInput(
-            TextFieldValue(),
-            ImeOptions.Default,
-            {}, // onEditCommand
-            {} // onImeActionPerformed
-        )
+        val session =
+            textInputService.startInput(
+                TextFieldValue(),
+                ImeOptions.Default,
+                {}, // onEditCommand
+                {} // onImeActionPerformed
+            )
 
         textInputService.stopInput(session)
         verify(platformService, times(1)).stopInput()
@@ -107,12 +112,13 @@
 
         val textInputService = TextInputService(platformService)
 
-        val firstSession = textInputService.startInput(
-            TextFieldValue(),
-            ImeOptions.Default,
-            {}, // onEditCommand
-            {} // onImeActionPerformed
-        )
+        val firstSession =
+            textInputService.startInput(
+                TextFieldValue(),
+                ImeOptions.Default,
+                {}, // onEditCommand
+                {} // onImeActionPerformed
+            )
 
         // Start another session. The firstToken is now expired.
         textInputService.startInput(
@@ -187,12 +193,14 @@
 
         val textInputService = TextInputService(platformService)
 
-        textInputService.startInput(
-            TextFieldValue(),
-            ImeOptions.Default,
-            {}, // onEditCommand
-            {} // onImeActionPerformed
-        ).dispose()
+        textInputService
+            .startInput(
+                TextFieldValue(),
+                ImeOptions.Default,
+                {}, // onEditCommand
+                {} // onImeActionPerformed
+            )
+            .dispose()
 
         textInputService.showSoftwareKeyboard()
         verify(platformService, never()).showSoftwareKeyboard()
@@ -214,12 +222,13 @@
 
         val textInputService = TextInputService(platformService)
 
-        val firstSession = textInputService.startInput(
-            TextFieldValue(),
-            ImeOptions.Default,
-            {}, // onEditCommand
-            {} // onImeActionPerformed
-        )
+        val firstSession =
+            textInputService.startInput(
+                TextFieldValue(),
+                ImeOptions.Default,
+                {}, // onEditCommand
+                {} // onImeActionPerformed
+            )
 
         val editorModel = TextFieldValue()
         firstSession.updateState(null, editorModel)
@@ -232,20 +241,22 @@
 
         val textInputService = TextInputService(platformService)
 
-        val firstSession = textInputService.startInput(
-            TextFieldValue(),
-            ImeOptions.Default,
-            {}, // onEditCommand
-            {} // onImeActionPerformed
-        )
+        val firstSession =
+            textInputService.startInput(
+                TextFieldValue(),
+                ImeOptions.Default,
+                {}, // onEditCommand
+                {} // onImeActionPerformed
+            )
 
         // Start another session. The firstToken is now expired.
-        val secondSession = textInputService.startInput(
-            TextFieldValue(),
-            ImeOptions.Default,
-            {}, // onEditCommand
-            {} // onImeActionPerformed
-        )
+        val secondSession =
+            textInputService.startInput(
+                TextFieldValue(),
+                ImeOptions.Default,
+                {}, // onEditCommand
+                {} // onImeActionPerformed
+            )
 
         val editorModel = TextFieldValue()
         firstSession.updateState(null, editorModel)
@@ -261,12 +272,13 @@
 
         val textInputService = TextInputService(platformService)
 
-        val firstSession = textInputService.startInput(
-            TextFieldValue(),
-            ImeOptions.Default,
-            {}, // onEditCommand
-            {} // onImeActionPerformed
-        )
+        val firstSession =
+            textInputService.startInput(
+                TextFieldValue(),
+                ImeOptions.Default,
+                {}, // onEditCommand
+                {} // onImeActionPerformed
+            )
 
         val rect = Rect(Offset.Zero, Size(100f, 100f))
         firstSession.notifyFocusedRect(rect)
@@ -279,20 +291,22 @@
 
         val textInputService = TextInputService(platformService)
 
-        val firstSession = textInputService.startInput(
-            TextFieldValue(),
-            ImeOptions.Default,
-            {}, // onEditCommand
-            {} // onImeActionPerformed
-        )
+        val firstSession =
+            textInputService.startInput(
+                TextFieldValue(),
+                ImeOptions.Default,
+                {}, // onEditCommand
+                {} // onImeActionPerformed
+            )
 
         // Start another session. The firstToken is now expired.
-        val secondSession = textInputService.startInput(
-            TextFieldValue(),
-            ImeOptions.Default,
-            {}, // onEditCommand
-            {} // onImeActionPerformed
-        )
+        val secondSession =
+            textInputService.startInput(
+                TextFieldValue(),
+                ImeOptions.Default,
+                {}, // onEditCommand
+                {} // onImeActionPerformed
+            )
 
         val rect = Rect(Offset.Zero, Size(100f, 100f))
         firstSession.notifyFocusedRect(rect)
diff --git a/compose/ui/ui-text/src/androidUnitTest/kotlin/androidx/compose/ui/text/TextSpanParagraphStyleTest.kt b/compose/ui/ui-text/src/androidUnitTest/kotlin/androidx/compose/ui/text/TextSpanParagraphStyleTest.kt
index 2599fb6..aaffbe0 100644
--- a/compose/ui/ui-text/src/androidUnitTest/kotlin/androidx/compose/ui/text/TextSpanParagraphStyleTest.kt
+++ b/compose/ui/ui-text/src/androidUnitTest/kotlin/androidx/compose/ui/text/TextSpanParagraphStyleTest.kt
@@ -33,9 +33,10 @@
 
     @Test
     fun spanStyle_constructor_is_covered_by_TextStyle() {
-        val spanStyleParameters = constructorParams(SpanStyle::class).toMutableSet().filter {
-            it.name != "platformStyle" && it.name != "textForegroundStyle"
-        }
+        val spanStyleParameters =
+            constructorParams(SpanStyle::class).toMutableSet().filter {
+                it.name != "platformStyle" && it.name != "textForegroundStyle"
+            }
         val textStyleParameters = mutableSetOf<Parameter>()
 
         // In case of multiple constructors, all constructors together should cover
@@ -44,9 +45,8 @@
             // for every SpanStyle parameter, expecting that parameter to be in TextStyle
             // this guards that if a parameter is added to SpanStyle, it should be added
             // to TextStyle
-            textStyleParameters += constructorParams(constructor).toSet().filter {
-                it.name != "platformStyle"
-            }
+            textStyleParameters +=
+                constructorParams(constructor).toSet().filter { it.name != "platformStyle" }
         }
 
         assertThat(textStyleParameters).containsAtLeastElementsIn(spanStyleParameters)
@@ -54,63 +54,59 @@
 
     @Test
     fun spanStyle_properties_is_covered_by_TextStyle() {
-        val spanStyleProperties = memberProperties(SpanStyle::class).filter {
-            it.name != "platformStyle" && it.name != "textForegroundStyle"
-        }
-        val textStyleProperties = memberProperties(TextStyle::class).filter {
-            it.name != "platformStyle"
-        }
+        val spanStyleProperties =
+            memberProperties(SpanStyle::class).filter {
+                it.name != "platformStyle" && it.name != "textForegroundStyle"
+            }
+        val textStyleProperties =
+            memberProperties(TextStyle::class).filter { it.name != "platformStyle" }
         assertThat(textStyleProperties).containsAtLeastElementsIn(spanStyleProperties)
     }
 
     @Test
     fun paragraphStyle_is_covered_by_TextStyle() {
-        val paragraphStyleProperties = memberProperties(ParagraphStyle::class).filter {
-            !it.isKnownUnmatchedProperty()
-        }
-        val textStyleProperties = memberProperties(TextStyle::class).filter {
-            !it.isKnownUnmatchedProperty()
-        }
+        val paragraphStyleProperties =
+            memberProperties(ParagraphStyle::class).filter { !it.isKnownUnmatchedProperty() }
+        val textStyleProperties =
+            memberProperties(TextStyle::class).filter { !it.isKnownUnmatchedProperty() }
         assertThat(textStyleProperties).containsAtLeastElementsIn(paragraphStyleProperties)
     }
 
     @Test
     fun paragraphStyle_properties_is_covered_by_TextStyle() {
-        val paragraphStyleProperties = memberProperties(ParagraphStyle::class).filter {
-            !it.isKnownUnmatchedProperty()
-        }
-        val textStyleProperties = memberProperties(TextStyle::class).filter {
-            !it.isKnownUnmatchedProperty()
-        }
+        val paragraphStyleProperties =
+            memberProperties(ParagraphStyle::class).filter { !it.isKnownUnmatchedProperty() }
+        val textStyleProperties =
+            memberProperties(TextStyle::class).filter { !it.isKnownUnmatchedProperty() }
         assertThat(textStyleProperties).containsAtLeastElementsIn(paragraphStyleProperties)
     }
 
-    /**
-     * These properties are known to not have an exact mach
-     */
+    /** These properties are known to not have an exact mach */
     private fun Property.isKnownUnmatchedProperty(): Boolean {
-        return name in listOf(
-            "platformStyle",
-            // these are for boxing optimizations
-            "hyphensOrDefault",
-            "lineBreakOrDefault",
-            "textAlignOrDefault"
-        )
+        return name in
+            listOf(
+                "platformStyle",
+                // these are for boxing optimizations
+                "hyphensOrDefault",
+                "lineBreakOrDefault",
+                "textAlignOrDefault"
+            )
     }
 
     @Test
     fun textStyle_covered_by_ParagraphStyle_and_SpanStyle() {
-        val spanStyleParameters = allConstructorParams(SpanStyle::class).filter {
-            it.name != "platformStyle" && it.name != "textForegroundStyle"
-        }
-        val paragraphStyleParameters = allConstructorParams(ParagraphStyle::class).filter {
-            it.name != "platformStyle"
-        }
+        val spanStyleParameters =
+            allConstructorParams(SpanStyle::class).filter {
+                it.name != "platformStyle" && it.name != "textForegroundStyle"
+            }
+        val paragraphStyleParameters =
+            allConstructorParams(ParagraphStyle::class).filter { it.name != "platformStyle" }
         val allParameters = (spanStyleParameters + paragraphStyleParameters).toMutableSet()
 
-        val textStyleParameters = allConstructorParams(TextStyle::class).filter {
-            it.name != "platformStyle" && it.name != "spanStyle" && it.name != "paragraphStyle"
-        }
+        val textStyleParameters =
+            allConstructorParams(TextStyle::class).filter {
+                it.name != "platformStyle" && it.name != "spanStyle" && it.name != "paragraphStyle"
+            }
 
         // for every TextStyle parameter, expecting that parameter to be in either ParagraphStyle
         // or SpanStyle
@@ -121,16 +117,17 @@
 
     @Test
     fun testStyle_properties_is_covered_by_ParagraphStyle_and_SpanStyle() {
-        val spanStyleProperties = memberProperties(SpanStyle::class).filter {
-            it.name != "platformStyle" && it.name != "textForegroundStyle"
-        }
-        val paragraphStyleProperties = memberProperties(ParagraphStyle::class).filter {
-            it.name != "platformStyle"
-        }
+        val spanStyleProperties =
+            memberProperties(SpanStyle::class).filter {
+                it.name != "platformStyle" && it.name != "textForegroundStyle"
+            }
+        val paragraphStyleProperties =
+            memberProperties(ParagraphStyle::class).filter { it.name != "platformStyle" }
         val allProperties = spanStyleProperties + paragraphStyleProperties
-        val textStyleProperties = memberProperties(TextStyle::class).filter {
-            it.name != "spanStyle" && it.name != "paragraphStyle" && it.name != "platformStyle"
-        }
+        val textStyleProperties =
+            memberProperties(TextStyle::class).filter {
+                it.name != "spanStyle" && it.name != "paragraphStyle" && it.name != "platformStyle"
+            }
         assertThat(allProperties).containsAtLeastElementsIn(textStyleProperties)
     }
 
@@ -157,7 +154,9 @@
         val isVarArg: Boolean,
         val kind: KParameter.Kind
     ) {
-        constructor(parameter: KParameter) : this(
+        constructor(
+            parameter: KParameter
+        ) : this(
             parameter.name,
             parameter.type,
             parameter.isOptional,
@@ -166,10 +165,7 @@
         )
     }
 
-    private data class Property(
-        val name: String?,
-        val type: KType
-    ) {
+    private data class Property(val name: String?, val type: KType) {
         constructor(parameter: KProperty1<*, *>) : this(parameter.name, parameter.returnType)
     }
 }
diff --git a/compose/ui/ui-text/src/androidUnitTest/kotlin/androidx/compose/ui/text/TextStyleLayoutAttributesTest.kt b/compose/ui/ui-text/src/androidUnitTest/kotlin/androidx/compose/ui/text/TextStyleLayoutAttributesTest.kt
index 2c30f67..e125f8d 100644
--- a/compose/ui/ui-text/src/androidUnitTest/kotlin/androidx/compose/ui/text/TextStyleLayoutAttributesTest.kt
+++ b/compose/ui/ui-text/src/androidUnitTest/kotlin/androidx/compose/ui/text/TextStyleLayoutAttributesTest.kt
@@ -50,45 +50,34 @@
     @Test
     fun returns_true_for_the_same_instance() {
         val style = TextStyle(lineHeight = 1.em)
-        assertThat(
-            style.hasSameLayoutAffectingAttributes(style)
-        ).isTrue()
+        assertThat(style.hasSameLayoutAffectingAttributes(style)).isTrue()
     }
 
     @Test
     fun returns_true_for_the_equal_instance() {
         val style = TextStyle(lineHeight = 1.em)
-        assertThat(
-            style.hasSameLayoutAffectingAttributes(
-                style.copy()
-            )
-        ).isTrue()
+        assertThat(style.hasSameLayoutAffectingAttributes(style.copy())).isTrue()
     }
 
     @Test
     fun returns_true_for_color_change() {
         val style = TextStyle(color = Color.Red)
-        assertThat(
-            style.hasSameLayoutAffectingAttributes(
-                TextStyle(color = Color.Green)
-            )
-        ).isTrue()
+        assertThat(style.hasSameLayoutAffectingAttributes(TextStyle(color = Color.Green))).isTrue()
     }
 
     @Test
     fun returns_true_for_color_to_brush_change() {
         val style = TextStyle(color = Color.Red)
         assertThat(
-            style.hasSameLayoutAffectingAttributes(TextStyle(brush = SolidColor(Color.Green)))
-        ).isTrue()
+                style.hasSameLayoutAffectingAttributes(TextStyle(brush = SolidColor(Color.Green)))
+            )
+            .isTrue()
     }
 
     @Test
     fun returns_true_for_brush_to_color_change() {
         val style = TextStyle(brush = SolidColor(Color.Green))
-        assertThat(
-            style.hasSameLayoutAffectingAttributes(TextStyle(color = Color.Red))
-        ).isTrue()
+        assertThat(style.hasSameLayoutAffectingAttributes(TextStyle(color = Color.Red))).isTrue()
     }
 
     @Test
@@ -96,47 +85,50 @@
         val style = TextStyle(brush = SolidColor(Color.Red))
         style.copy()
         assertThat(
-            style.hasSameLayoutAffectingAttributes(TextStyle(brush = SolidColor(Color.Green)))
-        ).isTrue()
+                style.hasSameLayoutAffectingAttributes(TextStyle(brush = SolidColor(Color.Green)))
+            )
+            .isTrue()
     }
 
     @Test
     fun returns_true_for_brush_shader_change() {
         val style = TextStyle(brush = Brush.linearGradient(listOf(Color.Black, Color.White)))
         assertThat(
-            style.hasSameLayoutAffectingAttributes(TextStyle(
-                brush = Brush.linearGradient(listOf(Color.Red, Color.Blue))
-            ))
-        ).isTrue()
+                style.hasSameLayoutAffectingAttributes(
+                    TextStyle(brush = Brush.linearGradient(listOf(Color.Red, Color.Blue)))
+                )
+            )
+            .isTrue()
     }
 
     @Test
     fun returns_true_for_brush_alpha_change() {
         val brush = Brush.linearGradient(listOf(Color.Black, Color.White))
         val style = TextStyle(brush = brush, alpha = 0.5f)
-        assertThat(
-            style.hasSameLayoutAffectingAttributes(TextStyle(brush = brush, alpha = 0.7f))
-        ).isTrue()
+        assertThat(style.hasSameLayoutAffectingAttributes(TextStyle(brush = brush, alpha = 0.7f)))
+            .isTrue()
     }
 
     @Test
     fun returns_true_for_shadow_change() {
         val style = TextStyle(shadow = Shadow(color = Color.Red))
         assertThat(
-            style.hasSameLayoutAffectingAttributes(
-                TextStyle(shadow = Shadow(color = Color.Green))
+                style.hasSameLayoutAffectingAttributes(
+                    TextStyle(shadow = Shadow(color = Color.Green))
+                )
             )
-        ).isTrue()
+            .isTrue()
     }
 
     @Test
     fun returns_true_for_textDecoration_change() {
         val style = TextStyle(textDecoration = TextDecoration.LineThrough)
         assertThat(
-            style.hasSameLayoutAffectingAttributes(
-                TextStyle(textDecoration = TextDecoration.Underline)
+                style.hasSameLayoutAffectingAttributes(
+                    TextStyle(textDecoration = TextDecoration.Underline)
+                )
             )
-        ).isTrue()
+            .isTrue()
     }
 
     @Test
@@ -144,141 +136,117 @@
         // even though background does not change metrics, without recreating layout background
         // color animations doesn't work, do not remove.
         val style = TextStyle(background = Color.Red)
-        assertThat(
-            style.hasSameLayoutAffectingAttributes(
-                TextStyle(background = Color.Green)
-            )
-        ).isFalse()
+        assertThat(style.hasSameLayoutAffectingAttributes(TextStyle(background = Color.Green)))
+            .isFalse()
     }
 
     @Test
     fun returns_false_for_fontSize_change() {
         val style = TextStyle(fontSize = 10.sp)
-        assertThat(
-            style.hasSameLayoutAffectingAttributes(
-                TextStyle(fontSize = 11.sp)
-            )
-        ).isFalse()
+        assertThat(style.hasSameLayoutAffectingAttributes(TextStyle(fontSize = 11.sp))).isFalse()
     }
 
     @Test
     fun returns_false_for_fontStyle_change() {
         val style = TextStyle(fontStyle = FontStyle.Italic)
-        assertThat(
-            style.hasSameLayoutAffectingAttributes(
-                TextStyle(fontStyle = FontStyle.Normal)
-            )
-        ).isFalse()
+        assertThat(style.hasSameLayoutAffectingAttributes(TextStyle(fontStyle = FontStyle.Normal)))
+            .isFalse()
     }
 
     @Test
     fun returns_false_for_fontSynthesis_change() {
         val style = TextStyle(fontSynthesis = FontSynthesis.Style)
         assertThat(
-            style.hasSameLayoutAffectingAttributes(
-                TextStyle(fontSynthesis = FontSynthesis.Weight)
+                style.hasSameLayoutAffectingAttributes(
+                    TextStyle(fontSynthesis = FontSynthesis.Weight)
+                )
             )
-        ).isFalse()
+            .isFalse()
     }
 
     @Test
     fun returns_false_for_fontFamily_change() {
         val style = TextStyle(fontFamily = FontFamily.SansSerif)
-        assertThat(
-            style.hasSameLayoutAffectingAttributes(
-                TextStyle(fontFamily = FontFamily.Serif)
-            )
-        ).isFalse()
+        assertThat(style.hasSameLayoutAffectingAttributes(TextStyle(fontFamily = FontFamily.Serif)))
+            .isFalse()
     }
 
     @Test
     fun returns_false_for_fontFeatureSettings_change() {
         val style = TextStyle(fontFeatureSettings = "abc")
-        assertThat(
-            style.hasSameLayoutAffectingAttributes(
-                TextStyle(fontFeatureSettings = "def")
-            )
-        ).isFalse()
+        assertThat(style.hasSameLayoutAffectingAttributes(TextStyle(fontFeatureSettings = "def")))
+            .isFalse()
     }
 
     @Test
     fun returns_false_for_letterSpacing_change() {
         val style = TextStyle(letterSpacing = 0.2.sp)
-        assertThat(
-            style.hasSameLayoutAffectingAttributes(
-                TextStyle(letterSpacing = 0.3.sp)
-            )
-        ).isFalse()
+        assertThat(style.hasSameLayoutAffectingAttributes(TextStyle(letterSpacing = 0.3.sp)))
+            .isFalse()
     }
 
     @Test
     fun returns_false_for_baselineShift_change() {
         val style = TextStyle(baselineShift = BaselineShift.Superscript)
         assertThat(
-            style.hasSameLayoutAffectingAttributes(
-                TextStyle(baselineShift = BaselineShift.Subscript)
+                style.hasSameLayoutAffectingAttributes(
+                    TextStyle(baselineShift = BaselineShift.Subscript)
+                )
             )
-        ).isFalse()
+            .isFalse()
     }
 
     @Test
     fun returns_false_for_textGeometricTransform_change() {
         val style = TextStyle(textGeometricTransform = TextGeometricTransform(scaleX = 1f))
         assertThat(
-            style.hasSameLayoutAffectingAttributes(
-                TextStyle(textGeometricTransform = TextGeometricTransform(scaleX = 2f))
+                style.hasSameLayoutAffectingAttributes(
+                    TextStyle(textGeometricTransform = TextGeometricTransform(scaleX = 2f))
+                )
             )
-        ).isFalse()
+            .isFalse()
     }
 
     @Test
     fun returns_false_for_localeList_change() {
         val style = TextStyle(localeList = LocaleList("en-US"))
         assertThat(
-            style.hasSameLayoutAffectingAttributes(
-                TextStyle(localeList = LocaleList("en-CA"))
+                style.hasSameLayoutAffectingAttributes(TextStyle(localeList = LocaleList("en-CA")))
             )
-        ).isFalse()
+            .isFalse()
     }
 
     @Test
     fun returns_false_for_textAlign_change() {
         val style = TextStyle(textAlign = TextAlign.Start)
-        assertThat(
-            style.hasSameLayoutAffectingAttributes(
-                TextStyle(textAlign = TextAlign.End)
-            )
-        ).isFalse()
+        assertThat(style.hasSameLayoutAffectingAttributes(TextStyle(textAlign = TextAlign.End)))
+            .isFalse()
     }
 
     @Test
     fun returns_false_for_textDirection_change() {
         val style = TextStyle(textDirection = TextDirection.Ltr)
         assertThat(
-            style.hasSameLayoutAffectingAttributes(
-                TextStyle(textDirection = TextDirection.Rtl)
+                style.hasSameLayoutAffectingAttributes(TextStyle(textDirection = TextDirection.Rtl))
             )
-        ).isFalse()
+            .isFalse()
     }
 
     @Test
     fun returns_false_for_lineHeight_change() {
         val style = TextStyle(lineHeight = 1.em)
-        assertThat(
-            style.hasSameLayoutAffectingAttributes(
-                TextStyle(lineHeight = 1.1.em)
-            )
-        ).isFalse()
+        assertThat(style.hasSameLayoutAffectingAttributes(TextStyle(lineHeight = 1.1.em))).isFalse()
     }
 
     @Test
     fun returns_false_for_textIndent_change() {
         val style = TextStyle(textIndent = TextIndent(firstLine = 0.sp))
         assertThat(
-            style.hasSameLayoutAffectingAttributes(
-                TextStyle(textIndent = TextIndent(firstLine = 1.sp))
+                style.hasSameLayoutAffectingAttributes(
+                    TextStyle(textIndent = TextIndent(firstLine = 1.sp))
+                )
             )
-        ).isFalse()
+            .isFalse()
     }
 
     @Suppress("DEPRECATION")
@@ -286,54 +254,48 @@
     fun returns_false_for_platformStyle_change() {
         val style = TextStyle(platformStyle = PlatformTextStyle(includeFontPadding = false))
         assertThat(
-            style.hasSameLayoutAffectingAttributes(
-                TextStyle(platformStyle = PlatformTextStyle(includeFontPadding = true))
+                style.hasSameLayoutAffectingAttributes(
+                    TextStyle(platformStyle = PlatformTextStyle(includeFontPadding = true))
+                )
             )
-        ).isFalse()
+            .isFalse()
     }
 
     @Test
     fun returns_false_for_color_and_textAlign_change() {
         val style = TextStyle(color = Color.Red, textAlign = TextAlign.Start)
         assertThat(
-            style.hasSameLayoutAffectingAttributes(
-                TextStyle(color = Color.Blue, textAlign = TextAlign.End)
+                style.hasSameLayoutAffectingAttributes(
+                    TextStyle(color = Color.Blue, textAlign = TextAlign.End)
+                )
             )
-        ).isFalse()
+            .isFalse()
     }
 
     @Test
     fun returns_false_for_lineHeightStyle_change() {
-        val style = TextStyle(
-            lineHeightStyle = LineHeightStyle(
-                alignment = Alignment.Center,
-                trim = Trim.None
+        val style =
+            TextStyle(
+                lineHeightStyle = LineHeightStyle(alignment = Alignment.Center, trim = Trim.None)
             )
-        )
         assertThat(
-            style.hasSameLayoutAffectingAttributes(
-                TextStyle(
-                    lineHeightStyle = LineHeightStyle(
-                        alignment = Alignment.Bottom,
-                        trim = Trim.Both
+                style.hasSameLayoutAffectingAttributes(
+                    TextStyle(
+                        lineHeightStyle =
+                            LineHeightStyle(alignment = Alignment.Bottom, trim = Trim.Both)
                     )
                 )
             )
-        ).isFalse()
+            .isFalse()
     }
 
     @Test
     fun returns_false_for_lineBreak_change() {
-        val style = TextStyle(
-            lineBreak = LineBreak.Heading
-        )
+        val style = TextStyle(lineBreak = LineBreak.Heading)
         assertThat(
-            style.hasSameLayoutAffectingAttributes(
-                TextStyle(
-                    lineBreak = LineBreak.Paragraph
-                )
+                style.hasSameLayoutAffectingAttributes(TextStyle(lineBreak = LineBreak.Paragraph))
             )
-        ).isFalse()
+            .isFalse()
     }
 
     @Test
@@ -341,61 +303,62 @@
         // TextLayoutHelper TextStyle.hasSameLayoutAffectingAttributes is very easy to forget
         // to update when TextStyle changes. Adding this test to fail so that when a new attribute
         // is added to TextStyle it will remind us that we need to update the function.
-        val knownProperties = listOf(
-            getProperty("color"),
-            getProperty("brush"),
-            getProperty("alpha"),
-            getProperty("shadow"),
-            getProperty("textDecoration"),
-            getProperty("fontSize"),
-            getProperty("fontWeight"),
-            getProperty("fontStyle"),
-            getProperty("fontSynthesis"),
-            getProperty("fontFamily"),
-            getProperty("fontFeatureSettings"),
-            getProperty("letterSpacing"),
-            getProperty("baselineShift"),
-            getProperty("textGeometricTransform"),
-            getProperty("localeList"),
-            getProperty("background"),
-            getProperty("drawStyle"),
-            getProperty("textAlign"),
-            getProperty("textDirection"),
-            getProperty("lineHeight"),
-            getProperty("textIndent"),
-            getProperty("platformStyle"),
-            // ParagraphStyle and SpanStyle properties are already compared, TextStyle should have
-            // paragraph style attributes is tested in:
-            // ui-text/../androidx/compose/ui/text/TextSpanParagraphStyleTest.kt
-            getProperty("paragraphStyle"),
-            getProperty("spanStyle"),
-            getProperty("lineHeightStyle"),
-            getProperty("hyphens"),
-            getProperty("lineBreak"),
-            getProperty("textMotion"),
-            // deprecated properties kept for binary compatibility
-            getProperty("deprecated_boxing_textAlign"),
-            getProperty("deprecated_boxing_textDirection"),
-            getProperty("deprecated_boxing_hyphens"),
-            getProperty("deprecated_boxing_lineBreak")
-        )
+        val knownProperties =
+            listOf(
+                getProperty("color"),
+                getProperty("brush"),
+                getProperty("alpha"),
+                getProperty("shadow"),
+                getProperty("textDecoration"),
+                getProperty("fontSize"),
+                getProperty("fontWeight"),
+                getProperty("fontStyle"),
+                getProperty("fontSynthesis"),
+                getProperty("fontFamily"),
+                getProperty("fontFeatureSettings"),
+                getProperty("letterSpacing"),
+                getProperty("baselineShift"),
+                getProperty("textGeometricTransform"),
+                getProperty("localeList"),
+                getProperty("background"),
+                getProperty("drawStyle"),
+                getProperty("textAlign"),
+                getProperty("textDirection"),
+                getProperty("lineHeight"),
+                getProperty("textIndent"),
+                getProperty("platformStyle"),
+                // ParagraphStyle and SpanStyle properties are already compared, TextStyle should
+                // have
+                // paragraph style attributes is tested in:
+                // ui-text/../androidx/compose/ui/text/TextSpanParagraphStyleTest.kt
+                getProperty("paragraphStyle"),
+                getProperty("spanStyle"),
+                getProperty("lineHeightStyle"),
+                getProperty("hyphens"),
+                getProperty("lineBreak"),
+                getProperty("textMotion"),
+                // deprecated properties kept for binary compatibility
+                getProperty("deprecated_boxing_textAlign"),
+                getProperty("deprecated_boxing_textDirection"),
+                getProperty("deprecated_boxing_hyphens"),
+                getProperty("deprecated_boxing_lineBreak")
+            )
 
         val textStyleProperties = TextStyle::class.memberProperties.map { Property(it) }
 
         assertWithMessage(
-            "New property is added to TextStyle, TextStyle.hasSameLayoutAffectingAttributes " +
-                "should be updated accordingly"
-        ).that(knownProperties).containsAtLeastElementsIn(textStyleProperties)
+                "New property is added to TextStyle, TextStyle.hasSameLayoutAffectingAttributes " +
+                    "should be updated accordingly"
+            )
+            .that(knownProperties)
+            .containsAtLeastElementsIn(textStyleProperties)
     }
 
     private fun getProperty(name: String): Property {
         return TextStyle::class.memberProperties.first { it.name == name }.let { Property(it) }
     }
 
-    private data class Property(
-        val name: String?,
-        val type: KType
-    ) {
+    private data class Property(val name: String?, val type: KType) {
         constructor(parameter: KProperty1<*, *>) : this(parameter.name, parameter.returnType)
     }
 }
diff --git a/compose/ui/ui-text/src/androidUnitTest/kotlin/androidx/compose/ui/text/TextStyleResolveDefaultsTest.kt b/compose/ui/ui-text/src/androidUnitTest/kotlin/androidx/compose/ui/text/TextStyleResolveDefaultsTest.kt
index 167bd68..d2433af 100644
--- a/compose/ui/ui-text/src/androidUnitTest/kotlin/androidx/compose/ui/text/TextStyleResolveDefaultsTest.kt
+++ b/compose/ui/ui-text/src/androidUnitTest/kotlin/androidx/compose/ui/text/TextStyleResolveDefaultsTest.kt
@@ -82,306 +82,332 @@
     fun test_use_provided_values_brush() {
         val brush = Brush.linearGradient(listOf(Color.White, Color.Black))
 
-        assertThat(
-            resolveDefaults(
-                TextStyle(brush = brush),
-                direction = LayoutDirection.Ltr
-            ).brush
-        ).isEqualTo(brush)
+        assertThat(resolveDefaults(TextStyle(brush = brush), direction = LayoutDirection.Ltr).brush)
+            .isEqualTo(brush)
     }
 
     @Test
     fun test_use_provided_values_hyphens() {
         assertThat(
-            resolveDefaults(
-                TextStyle(hyphens = Hyphens.Auto),
-                direction = LayoutDirection.Ltr
-            ).hyphens
-        ).isEqualTo(Hyphens.Auto)
+                resolveDefaults(TextStyle(hyphens = Hyphens.Auto), direction = LayoutDirection.Ltr)
+                    .hyphens
+            )
+            .isEqualTo(Hyphens.Auto)
     }
 
     @Test
     fun test_use_provided_values_shader_brush_color_unspecified() {
         val brush = Brush.linearGradient(listOf(Color.White, Color.Black))
 
-        assertThat(
-            resolveDefaults(
-                TextStyle(brush = brush),
-                direction = LayoutDirection.Ltr
-            ).color
-        ).isEqualTo(Color.Unspecified)
+        assertThat(resolveDefaults(TextStyle(brush = brush), direction = LayoutDirection.Ltr).color)
+            .isEqualTo(Color.Unspecified)
     }
 
     @Test
     fun test_use_provided_values_color() {
         assertThat(
-            resolveDefaults(
-                TextStyle(color = Color.Red),
-                direction = LayoutDirection.Ltr
-            ).color
-        ).isEqualTo(Color.Red)
+                resolveDefaults(TextStyle(color = Color.Red), direction = LayoutDirection.Ltr).color
+            )
+            .isEqualTo(Color.Red)
     }
 
     @Test
     fun test_use_provided_values_fontSize() {
         assertThat(
-            resolveDefaults(
-                TextStyle(fontSize = DefaultFontSize * 2),
-                direction = LayoutDirection.Ltr
-            ).fontSize
-        ).isEqualTo(DefaultFontSize * 2)
+                resolveDefaults(
+                        TextStyle(fontSize = DefaultFontSize * 2),
+                        direction = LayoutDirection.Ltr
+                    )
+                    .fontSize
+            )
+            .isEqualTo(DefaultFontSize * 2)
     }
 
     @Test
     fun test_use_provided_values_fontWeight() {
         assertThat(
-            resolveDefaults(
-                TextStyle(fontWeight = FontWeight.W900),
-                direction = LayoutDirection.Ltr
-            ).fontWeight
-        ).isEqualTo(FontWeight.W900)
+                resolveDefaults(
+                        TextStyle(fontWeight = FontWeight.W900),
+                        direction = LayoutDirection.Ltr
+                    )
+                    .fontWeight
+            )
+            .isEqualTo(FontWeight.W900)
     }
 
     @Test
     fun test_use_provided_values_fontStyle() {
         assertThat(
-            resolveDefaults(
-                TextStyle(fontStyle = FontStyle.Italic),
-                direction = LayoutDirection.Ltr
-            ).fontStyle
-        ).isEqualTo(FontStyle.Italic)
+                resolveDefaults(
+                        TextStyle(fontStyle = FontStyle.Italic),
+                        direction = LayoutDirection.Ltr
+                    )
+                    .fontStyle
+            )
+            .isEqualTo(FontStyle.Italic)
     }
 
     @Test
     fun test_use_provided_values_fontSynthesis() {
         assertThat(
-            resolveDefaults(
-                TextStyle(fontSynthesis = FontSynthesis.Weight),
-                direction = LayoutDirection.Ltr
-            ).fontSynthesis
-        ).isEqualTo(FontSynthesis.Weight)
+                resolveDefaults(
+                        TextStyle(fontSynthesis = FontSynthesis.Weight),
+                        direction = LayoutDirection.Ltr
+                    )
+                    .fontSynthesis
+            )
+            .isEqualTo(FontSynthesis.Weight)
     }
 
     @Test
     fun test_use_provided_values_fontFamily() {
         assertThat(
-            resolveDefaults(
-                TextStyle(fontFamily = FontFamily.Cursive),
-                direction = LayoutDirection.Ltr
-            ).fontFamily
-        ).isEqualTo(FontFamily.Cursive)
+                resolveDefaults(
+                        TextStyle(fontFamily = FontFamily.Cursive),
+                        direction = LayoutDirection.Ltr
+                    )
+                    .fontFamily
+            )
+            .isEqualTo(FontFamily.Cursive)
     }
 
     @Test
     fun test_use_provided_values_fontFeatureSettings() {
         assertThat(
-            resolveDefaults(
-                TextStyle(fontFeatureSettings = "'liga': off"),
-                direction = LayoutDirection.Ltr
-            ).fontFeatureSettings
-        ).isEqualTo("'liga': off")
+                resolveDefaults(
+                        TextStyle(fontFeatureSettings = "'liga': off"),
+                        direction = LayoutDirection.Ltr
+                    )
+                    .fontFeatureSettings
+            )
+            .isEqualTo("'liga': off")
     }
 
     @Test
     fun test_use_provided_values_letterSpacing() {
         assertThat(
-            resolveDefaults(
-                TextStyle(letterSpacing = 1.2.em),
-                direction = LayoutDirection.Ltr
-            ).letterSpacing
-        ).isEqualTo(1.2.em)
+                resolveDefaults(TextStyle(letterSpacing = 1.2.em), direction = LayoutDirection.Ltr)
+                    .letterSpacing
+            )
+            .isEqualTo(1.2.em)
     }
 
     @Test
     fun test_use_provided_values_baselineShift() {
         assertThat(
-            resolveDefaults(
-                TextStyle(baselineShift = BaselineShift.Superscript),
-                direction = LayoutDirection.Ltr
-            ).baselineShift
-        ).isEqualTo(BaselineShift.Superscript)
+                resolveDefaults(
+                        TextStyle(baselineShift = BaselineShift.Superscript),
+                        direction = LayoutDirection.Ltr
+                    )
+                    .baselineShift
+            )
+            .isEqualTo(BaselineShift.Superscript)
     }
 
     @Test
     fun test_use_provided_values_textGeometricTransform() {
         assertThat(
-            resolveDefaults(
-                TextStyle(textGeometricTransform = TextGeometricTransform(scaleX = 10.0f)),
-                direction = LayoutDirection.Ltr
-            ).textGeometricTransform
-        ).isEqualTo(TextGeometricTransform(scaleX = 10.0f))
+                resolveDefaults(
+                        TextStyle(textGeometricTransform = TextGeometricTransform(scaleX = 10.0f)),
+                        direction = LayoutDirection.Ltr
+                    )
+                    .textGeometricTransform
+            )
+            .isEqualTo(TextGeometricTransform(scaleX = 10.0f))
     }
 
     @Test
     fun test_use_provided_values_localeList() {
         assertThat(
-            resolveDefaults(
-                TextStyle(localeList = LocaleList("fr-FR")),
-                direction = LayoutDirection.Ltr
-            ).localeList
-        ).isEqualTo(LocaleList("fr-FR"))
+                resolveDefaults(
+                        TextStyle(localeList = LocaleList("fr-FR")),
+                        direction = LayoutDirection.Ltr
+                    )
+                    .localeList
+            )
+            .isEqualTo(LocaleList("fr-FR"))
     }
 
     @Test
     fun test_use_provided_values_background() {
         assertThat(
-            resolveDefaults(
-                TextStyle(background = Color.Blue),
-                direction = LayoutDirection.Ltr
-            ).background
-        ).isEqualTo(Color.Blue)
+                resolveDefaults(TextStyle(background = Color.Blue), direction = LayoutDirection.Ltr)
+                    .background
+            )
+            .isEqualTo(Color.Blue)
     }
 
     @Test
     fun test_use_provided_values_textDecoration() {
         assertThat(
-            resolveDefaults(
-                TextStyle(textDecoration = TextDecoration.LineThrough),
-                direction = LayoutDirection.Ltr
-            ).textDecoration
-        ).isEqualTo(TextDecoration.LineThrough)
+                resolveDefaults(
+                        TextStyle(textDecoration = TextDecoration.LineThrough),
+                        direction = LayoutDirection.Ltr
+                    )
+                    .textDecoration
+            )
+            .isEqualTo(TextDecoration.LineThrough)
     }
 
     @Test
     fun test_use_provided_values_shadow() {
         assertThat(
-            resolveDefaults(
-                TextStyle(shadow = Shadow(color = Color.Yellow)),
-                direction = LayoutDirection.Ltr
-            ).shadow
-        ).isEqualTo(Shadow(color = Color.Yellow))
+                resolveDefaults(
+                        TextStyle(shadow = Shadow(color = Color.Yellow)),
+                        direction = LayoutDirection.Ltr
+                    )
+                    .shadow
+            )
+            .isEqualTo(Shadow(color = Color.Yellow))
     }
 
     @Test
     fun test_use_provided_values_textAlign() {
         assertThat(
-            resolveDefaults(
-                TextStyle(textAlign = TextAlign.Right),
-                direction = LayoutDirection.Ltr
-            ).textAlign
-        ).isEqualTo(TextAlign.Right)
+                resolveDefaults(
+                        TextStyle(textAlign = TextAlign.Right),
+                        direction = LayoutDirection.Ltr
+                    )
+                    .textAlign
+            )
+            .isEqualTo(TextAlign.Right)
     }
 
     @Test
     fun test_use_provided_values_lineHeight() {
         assertThat(
-            resolveDefaults(
-                TextStyle(lineHeight = 12.sp),
-                direction = LayoutDirection.Ltr
-            ).lineHeight
-        ).isEqualTo(12.sp)
+                resolveDefaults(TextStyle(lineHeight = 12.sp), direction = LayoutDirection.Ltr)
+                    .lineHeight
+            )
+            .isEqualTo(12.sp)
     }
 
     @Test
     fun test_use_provided_values_textIndent() {
         assertThat(
-            resolveDefaults(
-                TextStyle(textIndent = TextIndent(12.sp, 13.sp)),
-                direction = LayoutDirection.Ltr
-            ).textIndent
-        ).isEqualTo(TextIndent(12.sp, 13.sp))
+                resolveDefaults(
+                        TextStyle(textIndent = TextIndent(12.sp, 13.sp)),
+                        direction = LayoutDirection.Ltr
+                    )
+                    .textIndent
+            )
+            .isEqualTo(TextIndent(12.sp, 13.sp))
     }
 
     @Test
     fun test_use_provided_values_lineBreak() {
         assertThat(
-            resolveDefaults(
-                TextStyle(lineBreak = LineBreak.Heading),
-                direction = LayoutDirection.Ltr
-            ).lineBreak
-        ).isEqualTo(LineBreak.Heading)
+                resolveDefaults(
+                        TextStyle(lineBreak = LineBreak.Heading),
+                        direction = LayoutDirection.Ltr
+                    )
+                    .lineBreak
+            )
+            .isEqualTo(LineBreak.Heading)
     }
 
     @Test
     fun test_use_provided_values_textDirection_with_LTR_layoutDirection() {
         assertThat(
-            resolveDefaults(
-                TextStyle(textDirection = TextDirection.Content),
-                direction = LayoutDirection.Ltr
-            ).textDirection
-        ).isEqualTo(TextDirection.ContentOrLtr)
+                resolveDefaults(
+                        TextStyle(textDirection = TextDirection.Content),
+                        direction = LayoutDirection.Ltr
+                    )
+                    .textDirection
+            )
+            .isEqualTo(TextDirection.ContentOrLtr)
 
         assertThat(
-            resolveDefaults(
-                TextStyle(textDirection = TextDirection.Ltr),
-                direction = LayoutDirection.Ltr
-            ).textDirection
-        ).isEqualTo(TextDirection.Ltr)
+                resolveDefaults(
+                        TextStyle(textDirection = TextDirection.Ltr),
+                        direction = LayoutDirection.Ltr
+                    )
+                    .textDirection
+            )
+            .isEqualTo(TextDirection.Ltr)
 
         assertThat(
-            resolveDefaults(
-                TextStyle(textDirection = TextDirection.Rtl),
-                direction = LayoutDirection.Ltr
-            ).textDirection
-        ).isEqualTo(TextDirection.Rtl)
+                resolveDefaults(
+                        TextStyle(textDirection = TextDirection.Rtl),
+                        direction = LayoutDirection.Ltr
+                    )
+                    .textDirection
+            )
+            .isEqualTo(TextDirection.Rtl)
 
         assertThat(
-            resolveDefaults(
-                TextStyle(textDirection = TextDirection.ContentOrLtr),
-                direction = LayoutDirection.Ltr
-            ).textDirection
-        ).isEqualTo(TextDirection.ContentOrLtr)
+                resolveDefaults(
+                        TextStyle(textDirection = TextDirection.ContentOrLtr),
+                        direction = LayoutDirection.Ltr
+                    )
+                    .textDirection
+            )
+            .isEqualTo(TextDirection.ContentOrLtr)
 
         assertThat(
-            resolveDefaults(
-                TextStyle(textDirection = TextDirection.ContentOrRtl),
-                direction = LayoutDirection.Ltr
-            ).textDirection
-        ).isEqualTo(TextDirection.ContentOrRtl)
+                resolveDefaults(
+                        TextStyle(textDirection = TextDirection.ContentOrRtl),
+                        direction = LayoutDirection.Ltr
+                    )
+                    .textDirection
+            )
+            .isEqualTo(TextDirection.ContentOrRtl)
     }
 
     @Test
     fun test_use_provided_values_textDirection_with_RTL_layoutDirection() {
         assertThat(
-            resolveDefaults(
-                TextStyle(textDirection = TextDirection.Content),
-                direction = LayoutDirection.Rtl
-            ).textDirection
-        ).isEqualTo(TextDirection.ContentOrRtl)
+                resolveDefaults(
+                        TextStyle(textDirection = TextDirection.Content),
+                        direction = LayoutDirection.Rtl
+                    )
+                    .textDirection
+            )
+            .isEqualTo(TextDirection.ContentOrRtl)
 
         assertThat(
-            resolveDefaults(
-                TextStyle(textDirection = TextDirection.Ltr),
-                direction = LayoutDirection.Rtl
-            ).textDirection
-        ).isEqualTo(TextDirection.Ltr)
+                resolveDefaults(
+                        TextStyle(textDirection = TextDirection.Ltr),
+                        direction = LayoutDirection.Rtl
+                    )
+                    .textDirection
+            )
+            .isEqualTo(TextDirection.Ltr)
 
         assertThat(
-            resolveDefaults(
-                TextStyle(textDirection = TextDirection.Rtl),
-                direction = LayoutDirection.Rtl
-            ).textDirection
-        ).isEqualTo(TextDirection.Rtl)
+                resolveDefaults(
+                        TextStyle(textDirection = TextDirection.Rtl),
+                        direction = LayoutDirection.Rtl
+                    )
+                    .textDirection
+            )
+            .isEqualTo(TextDirection.Rtl)
 
         assertThat(
-            resolveDefaults(
-                TextStyle(textDirection = TextDirection.ContentOrLtr),
-                direction = LayoutDirection.Rtl
-            ).textDirection
-        ).isEqualTo(TextDirection.ContentOrLtr)
+                resolveDefaults(
+                        TextStyle(textDirection = TextDirection.ContentOrLtr),
+                        direction = LayoutDirection.Rtl
+                    )
+                    .textDirection
+            )
+            .isEqualTo(TextDirection.ContentOrLtr)
 
         assertThat(
-            resolveDefaults(
-                TextStyle(textDirection = TextDirection.ContentOrRtl),
-                direction = LayoutDirection.Rtl
-            ).textDirection
-        ).isEqualTo(TextDirection.ContentOrRtl)
+                resolveDefaults(
+                        TextStyle(textDirection = TextDirection.ContentOrRtl),
+                        direction = LayoutDirection.Rtl
+                    )
+                    .textDirection
+            )
+            .isEqualTo(TextDirection.ContentOrRtl)
     }
 
     @Test
     fun test_default_direction_algorithm_with_provided_layoutDirection() {
-        assertThat(
-            resolveDefaults(
-                TextStyle(),
-                direction = LayoutDirection.Ltr
-            ).textDirection
-        ).isEqualTo(TextDirection.Ltr)
+        assertThat(resolveDefaults(TextStyle(), direction = LayoutDirection.Ltr).textDirection)
+            .isEqualTo(TextDirection.Ltr)
 
-        assertThat(
-            resolveDefaults(
-                TextStyle(),
-                direction = LayoutDirection.Rtl
-            ).textDirection
-        ).isEqualTo(TextDirection.Rtl)
+        assertThat(resolveDefaults(TextStyle(), direction = LayoutDirection.Rtl).textDirection)
+            .isEqualTo(TextDirection.Rtl)
     }
 }
diff --git a/compose/ui/ui-text/src/androidUnitTest/kotlin/androidx/compose/ui/text/TextStyleTest.kt b/compose/ui/ui-text/src/androidUnitTest/kotlin/androidx/compose/ui/text/TextStyleTest.kt
index 5ba06a7..b60046c 100644
--- a/compose/ui/ui-text/src/androidUnitTest/kotlin/androidx/compose/ui/text/TextStyleTest.kt
+++ b/compose/ui/ui-text/src/androidUnitTest/kotlin/androidx/compose/ui/text/TextStyleTest.kt
@@ -166,9 +166,7 @@
     fun `platformTextStyle copy with existing drawStyle should not remove drawStyle`() {
         val style = TextStyle(drawStyle = Stroke(2f))
 
-        assertThat(
-            style.copy(platformStyle = PlatformTextStyle()).drawStyle
-        ).isEqualTo(Stroke(2f))
+        assertThat(style.copy(platformStyle = PlatformTextStyle()).drawStyle).isEqualTo(Stroke(2f))
     }
 
     @Test
@@ -887,70 +885,71 @@
 
     @Test
     fun `plus operator merges other TextStyle`() {
-        val style = TextStyle(
-            color = Color.Red,
-            fontWeight = FontWeight.Bold,
-            textAlign = TextAlign.Center,
-            textDirection = TextDirection.Rtl
-        ) + TextStyle(
-            color = Color.Green,
-            fontFamily = FontFamily.Cursive,
-            textAlign = TextAlign.Justify,
-            lineHeight = 12.sp
-        )
-
-        assertThat(style).isEqualTo(
+        val style =
             TextStyle(
-                color = Color.Green, // SpanStyle attribute overridden by RHS
-                fontWeight = FontWeight.Bold, // SpanStyle attribute from LHS,
-                fontFamily = FontFamily.Cursive, // SpanStyle attribute from RHS
-                textAlign = TextAlign.Justify, // ParagraphStyle attribute overridden by RHS
-                textDirection = TextDirection.Rtl, // from LHS,
-                lineHeight = 12.sp // ParagraphStyle attribute from RHS
+                color = Color.Red,
+                fontWeight = FontWeight.Bold,
+                textAlign = TextAlign.Center,
+                textDirection = TextDirection.Rtl
+            ) +
+                TextStyle(
+                    color = Color.Green,
+                    fontFamily = FontFamily.Cursive,
+                    textAlign = TextAlign.Justify,
+                    lineHeight = 12.sp
+                )
+
+        assertThat(style)
+            .isEqualTo(
+                TextStyle(
+                    color = Color.Green, // SpanStyle attribute overridden by RHS
+                    fontWeight = FontWeight.Bold, // SpanStyle attribute from LHS,
+                    fontFamily = FontFamily.Cursive, // SpanStyle attribute from RHS
+                    textAlign = TextAlign.Justify, // ParagraphStyle attribute overridden by RHS
+                    textDirection = TextDirection.Rtl, // from LHS,
+                    lineHeight = 12.sp // ParagraphStyle attribute from RHS
+                )
             )
-        )
     }
 
     @Test
     fun `plus operator merges other SpanStyle`() {
-        val style = TextStyle(
-            color = Color.Red,
-            fontWeight = FontWeight.Bold,
-            textAlign = TextAlign.Center
-        ) + SpanStyle(
-            color = Color.Green,
-            fontFamily = FontFamily.Cursive
-        )
-
-        assertThat(style).isEqualTo(
+        val style =
             TextStyle(
-                color = Color.Green, // SpanStyle attribute overridden by RHS
-                fontWeight = FontWeight.Bold, // SpanStyle attribute from LHS,
-                fontFamily = FontFamily.Cursive, // SpanStyle attribute from RHS
-                textAlign = TextAlign.Center // ParagraphStyle attribute from LHS
+                color = Color.Red,
+                fontWeight = FontWeight.Bold,
+                textAlign = TextAlign.Center
+            ) + SpanStyle(color = Color.Green, fontFamily = FontFamily.Cursive)
+
+        assertThat(style)
+            .isEqualTo(
+                TextStyle(
+                    color = Color.Green, // SpanStyle attribute overridden by RHS
+                    fontWeight = FontWeight.Bold, // SpanStyle attribute from LHS,
+                    fontFamily = FontFamily.Cursive, // SpanStyle attribute from RHS
+                    textAlign = TextAlign.Center // ParagraphStyle attribute from LHS
+                )
             )
-        )
     }
 
     @Test
     fun `plus operator merges other ParagraphStyle`() {
-        val style = TextStyle(
-            color = Color.Red,
-            textAlign = TextAlign.Center,
-            textDirection = TextDirection.Rtl
-        ) + ParagraphStyle(
-            textAlign = TextAlign.Justify,
-            lineHeight = 12.sp
-        )
-
-        assertThat(style).isEqualTo(
+        val style =
             TextStyle(
-                color = Color.Red, // SpanStyle from LHS
-                textAlign = TextAlign.Justify, // ParagraphStyle attribute overridden by RHS
-                textDirection = TextDirection.Rtl, // from LHS,
-                lineHeight = 12.sp // ParagraphStyle attribute from RHS
+                color = Color.Red,
+                textAlign = TextAlign.Center,
+                textDirection = TextDirection.Rtl
+            ) + ParagraphStyle(textAlign = TextAlign.Justify, lineHeight = 12.sp)
+
+        assertThat(style)
+            .isEqualTo(
+                TextStyle(
+                    color = Color.Red, // SpanStyle from LHS
+                    textAlign = TextAlign.Justify, // ParagraphStyle attribute overridden by RHS
+                    textDirection = TextDirection.Rtl, // from LHS,
+                    lineHeight = 12.sp // ParagraphStyle attribute from RHS
+                )
             )
-        )
     }
 
     @Test
@@ -1143,16 +1142,13 @@
 
         val newStyle = lerp(start = style1, stop = style2, fraction = t)
 
-        assertThat(newStyle.baselineShift)
-            .isEqualTo(lerp(baselineShift1, baselineShift2, t))
+        assertThat(newStyle.baselineShift).isEqualTo(lerp(baselineShift1, baselineShift2, t))
     }
 
     @Test
     fun `lerp textGeometricTransform with a and b are not Null`() {
-        val textTransform1 =
-            TextGeometricTransform(scaleX = 1.5f, skewX = 0.1f)
-        val textTransform2 =
-            TextGeometricTransform(scaleX = 1.0f, skewX = 0.3f)
+        val textTransform1 = TextGeometricTransform(scaleX = 1.5f, skewX = 0.1f)
+        val textTransform2 = TextGeometricTransform(scaleX = 1.0f, skewX = 0.3f)
         val t = 0.3f
         val style1 = TextStyle(textGeometricTransform = textTransform1)
         val style2 = TextStyle(textGeometricTransform = textTransform2)
@@ -1368,9 +1364,7 @@
         val fraction = 0.4f
         val newStyle = lerp(start = style1, stop = style2, fraction = fraction)
 
-        assertThat(newStyle.textIndent).isEqualTo(
-            lerp(TextIndent(), style2.textIndent!!, fraction)
-        )
+        assertThat(newStyle.textIndent).isEqualTo(lerp(TextIndent(), style2.textIndent!!, fraction))
     }
 
     @Test
@@ -1380,9 +1374,8 @@
         val fraction = 0.6f
         val newStyle = lerp(start = style1, stop = style2, fraction = fraction)
 
-        assertThat(newStyle.textIndent).isEqualTo(
-            lerp(style1.textIndent!!, style2.textIndent!!, fraction)
-        )
+        assertThat(newStyle.textIndent)
+            .isEqualTo(lerp(style1.textIndent!!, style2.textIndent!!, fraction))
     }
 
     @Test
@@ -1393,9 +1386,10 @@
 
         val newStyle = lerp(start = style1, stop = style2, fraction = fraction)
 
-        assertThat(newStyle.lineHeight).isEqualTo(
-            androidx.compose.ui.unit.lerp(style1.lineHeight, style2.lineHeight, fraction)
-        )
+        assertThat(newStyle.lineHeight)
+            .isEqualTo(
+                androidx.compose.ui.unit.lerp(style1.lineHeight, style2.lineHeight, fraction)
+            )
     }
 
     @Test
@@ -1427,9 +1421,7 @@
 
     @Test
     fun `copy without platformStyle uses existing platformStyle`() {
-        val style = TextStyle(
-            platformStyle = PlatformTextStyle(includeFontPadding = false)
-        )
+        val style = TextStyle(platformStyle = PlatformTextStyle(includeFontPadding = false))
         val newStyle = style.copy()
 
         assertThat(newStyle.platformStyle).isEqualTo(style.platformStyle)
@@ -1568,25 +1560,8 @@
         val decoration = TextDecoration.Underline
         val shadow = Shadow(color = Color.Green, offset = Offset(2f, 4f))
 
-        val style = TextStyle(
-            color = color,
-            fontSize = fontSize,
-            fontWeight = fontWeight,
-            fontStyle = fontStyle,
-            fontSynthesis = fontSynthesis,
-            fontFamily = fontFamily,
-            fontFeatureSettings = fontFeatureSettings,
-            letterSpacing = letterSpacing,
-            baselineShift = baselineShift,
-            textGeometricTransform = textGeometricTransform,
-            localeList = localeList,
-            background = background,
-            textDecoration = decoration,
-            shadow = shadow
-        )
-
-        assertThat(style.toSpanStyle()).isEqualTo(
-            SpanStyle(
+        val style =
+            TextStyle(
                 color = color,
                 fontSize = fontSize,
                 fontWeight = fontWeight,
@@ -1602,7 +1577,26 @@
                 textDecoration = decoration,
                 shadow = shadow
             )
-        )
+
+        assertThat(style.toSpanStyle())
+            .isEqualTo(
+                SpanStyle(
+                    color = color,
+                    fontSize = fontSize,
+                    fontWeight = fontWeight,
+                    fontStyle = fontStyle,
+                    fontSynthesis = fontSynthesis,
+                    fontFamily = fontFamily,
+                    fontFeatureSettings = fontFeatureSettings,
+                    letterSpacing = letterSpacing,
+                    baselineShift = baselineShift,
+                    textGeometricTransform = textGeometricTransform,
+                    localeList = localeList,
+                    background = background,
+                    textDecoration = decoration,
+                    shadow = shadow
+                )
+            )
     }
 
     @Test
@@ -1623,26 +1617,8 @@
         val shadow = Shadow(color = Color.Green, offset = Offset(2f, 4f))
         val drawStyle = Stroke(width = 8f)
 
-        val style = TextStyle(
-            brush = brush,
-            fontSize = fontSize,
-            fontWeight = fontWeight,
-            fontStyle = fontStyle,
-            fontSynthesis = fontSynthesis,
-            fontFamily = fontFamily,
-            fontFeatureSettings = fontFeatureSettings,
-            letterSpacing = letterSpacing,
-            baselineShift = baselineShift,
-            textGeometricTransform = textGeometricTransform,
-            localeList = localeList,
-            background = background,
-            textDecoration = decoration,
-            shadow = shadow,
-            drawStyle = drawStyle
-        )
-
-        assertThat(style.toSpanStyle()).isEqualTo(
-            SpanStyle(
+        val style =
+            TextStyle(
                 brush = brush,
                 fontSize = fontSize,
                 fontWeight = fontWeight,
@@ -1659,7 +1635,27 @@
                 shadow = shadow,
                 drawStyle = drawStyle
             )
-        )
+
+        assertThat(style.toSpanStyle())
+            .isEqualTo(
+                SpanStyle(
+                    brush = brush,
+                    fontSize = fontSize,
+                    fontWeight = fontWeight,
+                    fontStyle = fontStyle,
+                    fontSynthesis = fontSynthesis,
+                    fontFamily = fontFamily,
+                    fontFeatureSettings = fontFeatureSettings,
+                    letterSpacing = letterSpacing,
+                    baselineShift = baselineShift,
+                    textGeometricTransform = textGeometricTransform,
+                    localeList = localeList,
+                    background = background,
+                    textDecoration = decoration,
+                    shadow = shadow,
+                    drawStyle = drawStyle
+                )
+            )
     }
 
     @Test
@@ -1668,41 +1664,45 @@
         val textDirection = TextDirection.Rtl
         val lineHeight = 100.sp
         val textIndent = TextIndent(firstLine = 20.sp, restLine = 40.sp)
-        val lineHeightStyle = LineHeightStyle(
-            alignment = LineHeightStyle.Alignment.Center,
-            trim = LineHeightStyle.Trim.None
-        )
+        val lineHeightStyle =
+            LineHeightStyle(
+                alignment = LineHeightStyle.Alignment.Center,
+                trim = LineHeightStyle.Trim.None
+            )
         val hyphens = Hyphens.Auto
-        val lineBreak = LineBreak(
-            strategy = LineBreak.Strategy.Balanced,
-            strictness = LineBreak.Strictness.Strict,
-            wordBreak = LineBreak.WordBreak.Phrase
-        )
+        val lineBreak =
+            LineBreak(
+                strategy = LineBreak.Strategy.Balanced,
+                strictness = LineBreak.Strictness.Strict,
+                wordBreak = LineBreak.WordBreak.Phrase
+            )
         val textMotion = TextMotion.Animated
 
-        val style = TextStyle(
-            textAlign = textAlign,
-            textDirection = textDirection,
-            lineHeight = lineHeight,
-            textIndent = textIndent,
-            lineHeightStyle = lineHeightStyle,
-            lineBreak = lineBreak,
-            hyphens = hyphens,
-            textMotion = textMotion
-        )
-
-        assertThat(style.toParagraphStyle()).isEqualTo(
-            ParagraphStyle(
+        val style =
+            TextStyle(
                 textAlign = textAlign,
                 textDirection = textDirection,
                 lineHeight = lineHeight,
                 textIndent = textIndent,
                 lineHeightStyle = lineHeightStyle,
-                hyphens = hyphens,
                 lineBreak = lineBreak,
+                hyphens = hyphens,
                 textMotion = textMotion
             )
-        )
+
+        assertThat(style.toParagraphStyle())
+            .isEqualTo(
+                ParagraphStyle(
+                    textAlign = textAlign,
+                    textDirection = textDirection,
+                    lineHeight = lineHeight,
+                    textIndent = textIndent,
+                    lineHeightStyle = lineHeightStyle,
+                    hyphens = hyphens,
+                    lineBreak = lineBreak,
+                    textMotion = textMotion
+                )
+            )
     }
 
     @Test(expected = IllegalStateException::class)
@@ -1786,34 +1786,41 @@
 
     @Test
     fun `hashCode is different for different line height behavior`() {
-        val style = TextStyle(
-            lineHeightStyle = LineHeightStyle(
-                alignment = LineHeightStyle.Alignment.Bottom,
-                trim = LineHeightStyle.Trim.None
+        val style =
+            TextStyle(
+                lineHeightStyle =
+                    LineHeightStyle(
+                        alignment = LineHeightStyle.Alignment.Bottom,
+                        trim = LineHeightStyle.Trim.None
+                    )
             )
-        )
-        val otherStyle = TextStyle(
-            lineHeightStyle = LineHeightStyle(
-                alignment = LineHeightStyle.Alignment.Center,
-                trim = LineHeightStyle.Trim.Both
+        val otherStyle =
+            TextStyle(
+                lineHeightStyle =
+                    LineHeightStyle(
+                        alignment = LineHeightStyle.Alignment.Center,
+                        trim = LineHeightStyle.Trim.Both
+                    )
             )
-        )
 
         assertThat(style.hashCode()).isNotEqualTo(otherStyle.hashCode())
     }
 
     @Test
     fun `copy with lineHeightStyle returns new lineHeightStyle`() {
-        val style = TextStyle(
-            lineHeightStyle = LineHeightStyle(
-                alignment = LineHeightStyle.Alignment.Bottom,
-                trim = LineHeightStyle.Trim.None
+        val style =
+            TextStyle(
+                lineHeightStyle =
+                    LineHeightStyle(
+                        alignment = LineHeightStyle.Alignment.Bottom,
+                        trim = LineHeightStyle.Trim.None
+                    )
             )
-        )
-        val newLineHeightStyle = LineHeightStyle(
-            alignment = LineHeightStyle.Alignment.Center,
-            trim = LineHeightStyle.Trim.Both
-        )
+        val newLineHeightStyle =
+            LineHeightStyle(
+                alignment = LineHeightStyle.Alignment.Center,
+                trim = LineHeightStyle.Trim.Both
+            )
         val newStyle = style.copy(lineHeightStyle = newLineHeightStyle)
 
         assertThat(newStyle.lineHeightStyle).isEqualTo(newLineHeightStyle)
@@ -1821,12 +1828,14 @@
 
     @Test
     fun `copy without lineHeightStyle uses existing lineHeightStyle`() {
-        val style = TextStyle(
-            lineHeightStyle = LineHeightStyle(
-                alignment = LineHeightStyle.Alignment.Bottom,
-                trim = LineHeightStyle.Trim.None
+        val style =
+            TextStyle(
+                lineHeightStyle =
+                    LineHeightStyle(
+                        alignment = LineHeightStyle.Alignment.Bottom,
+                        trim = LineHeightStyle.Trim.None
+                    )
             )
-        )
         val newStyle = style.copy()
 
         assertThat(newStyle.lineHeightStyle).isEqualTo(style.lineHeightStyle)
@@ -1864,18 +1873,22 @@
 
     @Test
     fun `merge with both non-null lineHeightStyle returns other's lineHeightStyle`() {
-        val style = TextStyle(
-            lineHeightStyle = LineHeightStyle(
-                alignment = LineHeightStyle.Alignment.Center,
-                trim = LineHeightStyle.Trim.None
+        val style =
+            TextStyle(
+                lineHeightStyle =
+                    LineHeightStyle(
+                        alignment = LineHeightStyle.Alignment.Center,
+                        trim = LineHeightStyle.Trim.None
+                    )
             )
-        )
-        val otherStyle = TextStyle(
-            lineHeightStyle = LineHeightStyle(
-                alignment = LineHeightStyle.Alignment.Bottom,
-                trim = LineHeightStyle.Trim.Both
+        val otherStyle =
+            TextStyle(
+                lineHeightStyle =
+                    LineHeightStyle(
+                        alignment = LineHeightStyle.Alignment.Bottom,
+                        trim = LineHeightStyle.Trim.Both
+                    )
             )
-        )
 
         val newStyle = style.merge(otherStyle)
 
@@ -1891,127 +1904,85 @@
 
     @Test
     fun resolveTextDirection_unspecified() {
-        assertThat(
-            resolveTextDirection(
-                LayoutDirection.Ltr,
-                TextDirection.Unspecified
-            )
-        ).isEqualTo(TextDirection.Ltr)
+        assertThat(resolveTextDirection(LayoutDirection.Ltr, TextDirection.Unspecified))
+            .isEqualTo(TextDirection.Ltr)
 
-        assertThat(
-            resolveTextDirection(
-                LayoutDirection.Rtl,
-                TextDirection.Unspecified
-            )
-        ).isEqualTo(TextDirection.Rtl)
+        assertThat(resolveTextDirection(LayoutDirection.Rtl, TextDirection.Unspecified))
+            .isEqualTo(TextDirection.Rtl)
     }
 
     @Test
     fun resolveTextDirection_Content() {
-        assertThat(
-            resolveTextDirection(
-                LayoutDirection.Ltr,
-                TextDirection.Content
-            )
-        ).isEqualTo(TextDirection.ContentOrLtr)
+        assertThat(resolveTextDirection(LayoutDirection.Ltr, TextDirection.Content))
+            .isEqualTo(TextDirection.ContentOrLtr)
 
-        assertThat(
-            resolveTextDirection(
-                LayoutDirection.Rtl,
-                TextDirection.Content
-            )
-        ).isEqualTo(TextDirection.ContentOrRtl)
+        assertThat(resolveTextDirection(LayoutDirection.Rtl, TextDirection.Content))
+            .isEqualTo(TextDirection.ContentOrRtl)
     }
 
     @Test
     fun resolveTextDirection_ContentOrLtr() {
-        assertThat(
-            resolveTextDirection(
-                LayoutDirection.Ltr,
-                TextDirection.ContentOrLtr
-            )
-        ).isEqualTo(TextDirection.ContentOrLtr)
+        assertThat(resolveTextDirection(LayoutDirection.Ltr, TextDirection.ContentOrLtr))
+            .isEqualTo(TextDirection.ContentOrLtr)
 
-        assertThat(
-            resolveTextDirection(
-                LayoutDirection.Rtl,
-                TextDirection.ContentOrLtr
-            )
-        ).isEqualTo(TextDirection.ContentOrLtr)
+        assertThat(resolveTextDirection(LayoutDirection.Rtl, TextDirection.ContentOrLtr))
+            .isEqualTo(TextDirection.ContentOrLtr)
     }
 
     @Test
     fun resolveTextDirection_ContentOrRtl() {
-        assertThat(
-            resolveTextDirection(
-                LayoutDirection.Ltr,
-                TextDirection.ContentOrRtl
-            )
-        ).isEqualTo(TextDirection.ContentOrRtl)
+        assertThat(resolveTextDirection(LayoutDirection.Ltr, TextDirection.ContentOrRtl))
+            .isEqualTo(TextDirection.ContentOrRtl)
 
-        assertThat(
-            resolveTextDirection(
-                LayoutDirection.Rtl,
-                TextDirection.ContentOrRtl
-            )
-        ).isEqualTo(TextDirection.ContentOrRtl)
+        assertThat(resolveTextDirection(LayoutDirection.Rtl, TextDirection.ContentOrRtl))
+            .isEqualTo(TextDirection.ContentOrRtl)
     }
 
     @Test
     fun resolveTextDirection_Ltr() {
-        assertThat(
-            resolveTextDirection(
-                LayoutDirection.Ltr,
-                TextDirection.Ltr
-            )
-        ).isEqualTo(TextDirection.Ltr)
+        assertThat(resolveTextDirection(LayoutDirection.Ltr, TextDirection.Ltr))
+            .isEqualTo(TextDirection.Ltr)
 
-        assertThat(
-            resolveTextDirection(
-                LayoutDirection.Rtl,
-                TextDirection.Ltr
-            )
-        ).isEqualTo(TextDirection.Ltr)
+        assertThat(resolveTextDirection(LayoutDirection.Rtl, TextDirection.Ltr))
+            .isEqualTo(TextDirection.Ltr)
     }
 
     @Test
     fun resolveTextDirection_Rtl() {
-        assertThat(
-            resolveTextDirection(
-                LayoutDirection.Ltr,
-                TextDirection.Rtl
-            )
-        ).isEqualTo(TextDirection.Rtl)
+        assertThat(resolveTextDirection(LayoutDirection.Ltr, TextDirection.Rtl))
+            .isEqualTo(TextDirection.Rtl)
 
-        assertThat(
-            resolveTextDirection(
-                LayoutDirection.Rtl,
-                TextDirection.Rtl
-            )
-        ).isEqualTo(TextDirection.Rtl)
+        assertThat(resolveTextDirection(LayoutDirection.Rtl, TextDirection.Rtl))
+            .isEqualTo(TextDirection.Rtl)
     }
 
     @Test
     fun textStyle_allParamsMerge_nonDefaultWins() {
         val subject = TextStyle.Default
         val parameters = TextStyle::class.allConstructorParams()
-        val others = parameters.map { (param, constructor) ->
-            val args = mapOf(param to subject.getNotEqualValueFor(param))
-                .addPairwiseArgsToFix(parameters.map { it.first })
-            param to constructor.callBy(args)
-        }
+        val others =
+            parameters.map { (param, constructor) ->
+                val args =
+                    mapOf(param to subject.getNotEqualValueFor(param))
+                        .addPairwiseArgsToFix(parameters.map { it.first })
+                param to constructor.callBy(args)
+            }
         for ((param, other) in others) {
             val merged = subject.merge(other)
             val inverseMerged = other.merge(subject)
 
             // hand-rolling error messages since this is a all-params test
-            assertNotEquals(subject, merged,
+            assertNotEquals(
+                subject,
+                merged,
                 "subject.merge(other) on param=`${param.name}` failed" +
                     "\n\tmerged  = $merged" +
                     "\n\tother   = $other" +
                     "\n\tsubject = $subject"
             )
-            assertNotEquals(subject, inverseMerged,
+            assertNotEquals(
+                subject,
+                inverseMerged,
                 "other.merge(subject) on param=`${param.name}` failed" +
                     "\n\tmerged  = $merged" +
                     "\n\tother   = $other" +
@@ -2030,64 +2001,62 @@
     params: Collection<KParameter>
 ): Map<KParameter, Any?> {
     val name = keys.first().name
-    return this + when (name) {
-        "brush" -> {
-            val alpha = params.first { it.name == "alpha" }
-            mapOf(alpha to 0.7f)
+    return this +
+        when (name) {
+            "brush" -> {
+                val alpha = params.first { it.name == "alpha" }
+                mapOf(alpha to 0.7f)
+            }
+            "alpha" -> {
+                val brush = params.first { it.name == "brush" }
+                mapOf(brush to linearGradient(listOf(Color.Red)))
+            }
+            else -> emptyMap()
         }
-        "alpha" -> {
-            val brush = params.first { it.name == "brush" }
-            mapOf(brush to linearGradient(listOf(Color.Red)))
-        }
-        else -> emptyMap()
-    }
 }
 
-/**
- * All parameters on any public constructor, distinct by name
- */
-private fun KClass<TextStyle>.allConstructorParams() = this.constructors
-    .filter { it.visibility == KVisibility.PUBLIC }
-    .flatMap { it.parameters.map { param -> param to it } }
-    .fastDistinctBy { it.first.name }
+/** All parameters on any public constructor, distinct by name */
+private fun KClass<TextStyle>.allConstructorParams() =
+    this.constructors
+        .filter { it.visibility == KVisibility.PUBLIC }
+        .flatMap { it.parameters.map { param -> param to it } }
+        .fastDistinctBy { it.first.name }
 
-/**
- * Compute a distinct value for [KParameter] from the value in [kParameter]
- */
+/** Compute a distinct value for [KParameter] from the value in [kParameter] */
 private fun TextStyle.getNotEqualValueFor(kParameter: KParameter): Any {
     val prop: KProperty1<TextStyle, *> =
         TextStyle::class.memberProperties.first { it.name == kParameter.name }
     val currentValue = prop.get(this)
-    val newValue: Any = when (kParameter.type.jvmErasure) {
-        Color::class -> Color.Magenta
-        TextUnit::class -> 4.em
-        FontWeight::class -> FontWeight(712)
-        FontStyle::class -> FontStyle.Italic
-        FontSynthesis::class -> FontSynthesis.Weight
-        FontFamily::class -> FontFamily.Cursive
-        String::class -> (currentValue as? String ?: "") + " more text"
-        BaselineShift::class -> BaselineShift.Superscript
-        TextGeometricTransform::class -> TextGeometricTransform(0.5f, 0.5f)
-        LocaleList::class -> LocaleList("fr")
-        TextDecoration::class -> TextDecoration.Underline
-        Shadow::class -> Shadow(color = Color.Red)
-        TextAlign::class -> TextAlign.Justify
-        TextDirection::class -> TextDirection.Rtl
-        TextIndent::class -> TextIndent(10.sp)
-        PlatformTextStyle::class -> PlatformTextStyle(emojiSupportMatch = EmojiSupportMatch.None)
-        LineHeightStyle::class -> LineHeightStyle(
-            LineHeightStyle.Alignment.Center,
-            LineHeightStyle.Trim.None
-        )
-        LineBreak::class -> LineBreak.Heading
-        Hyphens::class -> Hyphens.Auto
-        DrawStyle::class -> Stroke(1f)
-        TextMotion::class -> TextMotion.Animated
-        Brush::class -> linearGradient(listOf(Color.Blue, Color.Red))
-        Float::class -> (currentValue as? Float).nextDistinct()
-        Int::class -> (currentValue as? Int ?: 0) + 4
-        else -> TODO("Please add an branch to this switch for ${kParameter.type}")
-    }
+    val newValue: Any =
+        when (kParameter.type.jvmErasure) {
+            Color::class -> Color.Magenta
+            TextUnit::class -> 4.em
+            FontWeight::class -> FontWeight(712)
+            FontStyle::class -> FontStyle.Italic
+            FontSynthesis::class -> FontSynthesis.Weight
+            FontFamily::class -> FontFamily.Cursive
+            String::class -> (currentValue as? String ?: "") + " more text"
+            BaselineShift::class -> BaselineShift.Superscript
+            TextGeometricTransform::class -> TextGeometricTransform(0.5f, 0.5f)
+            LocaleList::class -> LocaleList("fr")
+            TextDecoration::class -> TextDecoration.Underline
+            Shadow::class -> Shadow(color = Color.Red)
+            TextAlign::class -> TextAlign.Justify
+            TextDirection::class -> TextDirection.Rtl
+            TextIndent::class -> TextIndent(10.sp)
+            PlatformTextStyle::class ->
+                PlatformTextStyle(emojiSupportMatch = EmojiSupportMatch.None)
+            LineHeightStyle::class ->
+                LineHeightStyle(LineHeightStyle.Alignment.Center, LineHeightStyle.Trim.None)
+            LineBreak::class -> LineBreak.Heading
+            Hyphens::class -> Hyphens.Auto
+            DrawStyle::class -> Stroke(1f)
+            TextMotion::class -> TextMotion.Animated
+            Brush::class -> linearGradient(listOf(Color.Blue, Color.Red))
+            Float::class -> (currentValue as? Float).nextDistinct()
+            Int::class -> (currentValue as? Int ?: 0) + 4
+            else -> TODO("Please add an branch to this switch for ${kParameter.type}")
+        }
     require(newValue != currentValue) {
         "Logic for making distinct values failed, update this function so that" +
             " $currentValue != $newValue for ${prop.name}; you may need to add logic" +
@@ -2096,9 +2065,7 @@
     return newValue
 }
 
-/**
- * Floats can break addition on NaN and Infinity, hardcode distinct values
- */
+/** Floats can break addition on NaN and Infinity, hardcode distinct values */
 private fun Float?.nextDistinct(): Float {
     return if (this == null) {
         1f
diff --git a/compose/ui/ui-text/src/androidUnitTest/kotlin/androidx/compose/ui/text/font/AndroidFontResolverInterceptorTest.kt b/compose/ui/ui-text/src/androidUnitTest/kotlin/androidx/compose/ui/text/font/AndroidFontResolverInterceptorTest.kt
index 4f352de..93a92c0 100644
--- a/compose/ui/ui-text/src/androidUnitTest/kotlin/androidx/compose/ui/text/font/AndroidFontResolverInterceptorTest.kt
+++ b/compose/ui/ui-text/src/androidUnitTest/kotlin/androidx/compose/ui/text/font/AndroidFontResolverInterceptorTest.kt
@@ -32,8 +32,7 @@
         val adjustment = 0
         val expected = 400
         createSubject(adjustment)
-        assertThat(subject.interceptFontWeight(FontWeight(testedWeight)).weight)
-            .isEqualTo(expected)
+        assertThat(subject.interceptFontWeight(FontWeight(testedWeight)).weight).isEqualTo(expected)
     }
 
     @Test
@@ -42,8 +41,7 @@
         val adjustment = 300
         val expected = 700
         createSubject(adjustment)
-        assertThat(subject.interceptFontWeight(FontWeight(testedWeight)).weight)
-            .isEqualTo(expected)
+        assertThat(subject.interceptFontWeight(FontWeight(testedWeight)).weight).isEqualTo(expected)
     }
 
     @Test
@@ -89,8 +87,7 @@
         assertThat(subject.interceptFontFamily(FontFamily.SansSerif))
             .isEqualTo(FontFamily.SansSerif)
 
-        assertThat(subject.interceptFontStyle(FontStyle.Normal))
-            .isEqualTo(FontStyle.Normal)
+        assertThat(subject.interceptFontStyle(FontStyle.Normal)).isEqualTo(FontStyle.Normal)
 
         assertThat(subject.interceptFontSynthesis(FontSynthesis.Weight))
             .isEqualTo(FontSynthesis.Weight)
diff --git a/compose/ui/ui-text/src/androidUnitTest/kotlin/androidx/compose/ui/text/font/AsyncFontListLoaderTest.kt b/compose/ui/ui-text/src/androidUnitTest/kotlin/androidx/compose/ui/text/font/AsyncFontListLoaderTest.kt
index 89b1749..89771ed 100644
--- a/compose/ui/ui-text/src/androidUnitTest/kotlin/androidx/compose/ui/text/font/AsyncFontListLoaderTest.kt
+++ b/compose/ui/ui-text/src/androidUnitTest/kotlin/androidx/compose/ui/text/font/AsyncFontListLoaderTest.kt
@@ -39,11 +39,7 @@
         val resourceLoader = makeResourceLoader { expected }
         val font = makeFont()
         val subject = makeSubject(resourceLoader)
-        val result = runBlocking {
-            with(subject) {
-                font.loadWithTimeoutOrNull()
-            }
-        }
+        val result = runBlocking { with(subject) { font.loadWithTimeoutOrNull() } }
         assertThat(result).isEqualTo(expected)
     }
 
@@ -53,11 +49,7 @@
         val resourceLoader = makeResourceLoader { throw IllegalStateException("Thrown") }
         val font = makeFont()
         val subject = makeSubject(resourceLoader)
-        val result = runBlocking {
-            with(subject) {
-                font.loadWithTimeoutOrNull()
-            }
-        }
+        val result = runBlocking { with(subject) { font.loadWithTimeoutOrNull() } }
         assertThat(result).isEqualTo(expected)
     }
 
@@ -69,18 +61,13 @@
         val latch = CountDownLatch(1)
         val resourceLoader = makeResourceLoader { throw expected }
         val exceptionHandler = CoroutineExceptionHandler { _, throwable ->
-            synchronized(lock) {
-                actualException = throwable
-            }
+            synchronized(lock) { actualException = throwable }
             latch.countDown()
         }
         val font = makeFont()
         val subject = makeSubject(resourceLoader)
-        val result = runBlocking(exceptionHandler) {
-            with(subject) {
-                font.loadWithTimeoutOrNull()
-            }
-        }
+        val result =
+            runBlocking(exceptionHandler) { with(subject) { font.loadWithTimeoutOrNull() } }
         assertThat(result).isNull()
         latch.await(1, TimeUnit.SECONDS)
         synchronized(lock) {
@@ -95,25 +82,20 @@
         val resourceLoader = makeResourceLoader { throw IllegalStateException("Thrown") }
         val font = makeFont()
         val subject = makeSubject(resourceLoader)
-        val result = runBlocking {
-            with(subject) {
-                font.loadWithTimeoutOrNull()
-            }
-        }
+        val result = runBlocking { with(subject) { font.loadWithTimeoutOrNull() } }
         assertThat(result).isEqualTo(expected)
     }
 
     @Test
     fun loadWithTimeoutOrNull_nullsOnCancellation() {
         val expected = null
-        val resourceLoader = makeResourceLoader { coroutineContext.cancel(); 3 }
+        val resourceLoader = makeResourceLoader {
+            coroutineContext.cancel()
+            3
+        }
         val font = makeFont()
         val subject = makeSubject(resourceLoader)
-        val result = runBlocking {
-            with(subject) {
-                font.loadWithTimeoutOrNull()
-            }
-        }
+        val result = runBlocking { with(subject) { font.loadWithTimeoutOrNull() } }
         assertThat(result).isEqualTo(expected)
     }
 
@@ -125,7 +107,7 @@
             0,
             mock(TypefaceRequest::class.java),
             AsyncTypefaceCache(),
-            onCompletion = { },
+            onCompletion = {},
             platformFontLoader
         )
     }
@@ -142,7 +124,9 @@
     private fun makeResourceLoader(asyncLoad: suspend (Font) -> Any?): PlatformFontLoader {
         return object : PlatformFontLoader {
             override fun loadBlocking(font: Font): Any = TODO("Not called")
+
             override suspend fun awaitLoad(font: Font): Any? = asyncLoad(font)
+
             override val cacheKey: String = "androidx.compose.ui.text.font.makeResourceLoader"
         }
     }
diff --git a/compose/ui/ui-text/src/androidUnitTest/kotlin/androidx/compose/ui/text/font/FontFamilyTest.kt b/compose/ui/ui-text/src/androidUnitTest/kotlin/androidx/compose/ui/text/font/FontFamilyTest.kt
index 2ba7e82..7d5c5eb 100644
--- a/compose/ui/ui-text/src/androidUnitTest/kotlin/androidx/compose/ui/text/font/FontFamilyTest.kt
+++ b/compose/ui/ui-text/src/androidUnitTest/kotlin/androidx/compose/ui/text/font/FontFamilyTest.kt
@@ -32,42 +32,30 @@
 
     @Test
     fun `two equal family declarations are equal`() {
-        val fontFamily = FontFamily(
-            Font(
-                resId = resourceId1,
-                weight = FontWeight.W900,
-                style = FontStyle.Italic
+        val fontFamily =
+            FontFamily(
+                Font(resId = resourceId1, weight = FontWeight.W900, style = FontStyle.Italic)
             )
-        )
 
-        val otherFontFamily = FontFamily(
-            Font(
-                resId = resourceId1,
-                weight = FontWeight.W900,
-                style = FontStyle.Italic
+        val otherFontFamily =
+            FontFamily(
+                Font(resId = resourceId1, weight = FontWeight.W900, style = FontStyle.Italic)
             )
-        )
 
         assertThat(fontFamily).isEqualTo(otherFontFamily)
     }
 
     @Test
     fun `two non equal family declarations are not equal`() {
-        val fontFamily = FontFamily(
-            Font(
-                resId = resourceId1,
-                weight = FontWeight.W900,
-                style = FontStyle.Italic
+        val fontFamily =
+            FontFamily(
+                Font(resId = resourceId1, weight = FontWeight.W900, style = FontStyle.Italic)
             )
-        )
 
-        val otherFontFamily = FontFamily(
-            Font(
-                resId = resourceId1,
-                weight = FontWeight.W800,
-                style = FontStyle.Italic
+        val otherFontFamily =
+            FontFamily(
+                Font(resId = resourceId1, weight = FontWeight.W800, style = FontStyle.Italic)
             )
-        )
 
         assertThat(fontFamily).isNotEqualTo(otherFontFamily)
     }
@@ -75,16 +63,8 @@
     @Test
     fun `can add fallback font at same weight and style`() {
         FontFamily(
-            Font(
-                resId = resourceId1,
-                weight = FontWeight.W900,
-                style = FontStyle.Italic
-            ),
-            Font(
-                resId = resourceId1,
-                weight = FontWeight.W900,
-                style = FontStyle.Italic
-            )
+            Font(resId = resourceId1, weight = FontWeight.W900, style = FontStyle.Italic),
+            Font(resId = resourceId1, weight = FontWeight.W900, style = FontStyle.Italic)
         )
     }
 }
diff --git a/compose/ui/ui-text/src/androidUnitTest/kotlin/androidx/compose/ui/text/font/FontMatcherTest.kt b/compose/ui/ui-text/src/androidUnitTest/kotlin/androidx/compose/ui/text/font/FontMatcherTest.kt
index ab361ef..313dbf2 100644
--- a/compose/ui/ui-text/src/androidUnitTest/kotlin/androidx/compose/ui/text/font/FontMatcherTest.kt
+++ b/compose/ui/ui-text/src/androidUnitTest/kotlin/androidx/compose/ui/text/font/FontMatcherTest.kt
@@ -52,82 +52,84 @@
 
     @Test
     fun `family with single italic font matches`() {
-        val font = FontMatcher().matchFont(
-            FontFamily(FONT_100_ITALIC),
-            FontWeight.W100,
-            FontStyle.Italic
-        )
+        val font =
+            FontMatcher().matchFont(FontFamily(FONT_100_ITALIC), FontWeight.W100, FontStyle.Italic)
 
         assertThat(font).isEqualTo(listOf(FONT_100_ITALIC))
     }
 
     @Test
     fun `family with fallback italic font matches`() {
-        val font = FontMatcher().matchFont(
-            FontFamily(FONT_100_ITALIC, FONT_100_ITALIC_FALLBACK),
-            FontWeight.W100,
-            FontStyle.Italic
-        )
+        val font =
+            FontMatcher()
+                .matchFont(
+                    FontFamily(FONT_100_ITALIC, FONT_100_ITALIC_FALLBACK),
+                    FontWeight.W100,
+                    FontStyle.Italic
+                )
 
         assertThat(font).isEqualTo(listOf(FONT_100_ITALIC, FONT_100_ITALIC_FALLBACK))
     }
 
     @Test
     fun `family with single normal font matches`() {
-        val font = FontMatcher().matchFont(
-            FontFamily(FONT_100_REGULAR),
-            FontWeight.W100,
-            FontStyle.Normal
-        )
+        val font =
+            FontMatcher().matchFont(FontFamily(FONT_100_REGULAR), FontWeight.W100, FontStyle.Normal)
 
         assertThat(font).isEqualTo(listOf(FONT_100_REGULAR))
     }
 
     @Test
     fun `italic query against family with multiple fonts matches`() {
-        val font = FontMatcher().matchFont(
-            FontFamily(
-                FONT_100_REGULAR,
-                FONT_100_ITALIC,
-                FONT_200_REGULAR,
-                FONT_200_ITALIC
-            ),
-            FontWeight.W200,
-            FontStyle.Italic
-        )
+        val font =
+            FontMatcher()
+                .matchFont(
+                    FontFamily(
+                        FONT_100_REGULAR,
+                        FONT_100_ITALIC,
+                        FONT_200_REGULAR,
+                        FONT_200_ITALIC
+                    ),
+                    FontWeight.W200,
+                    FontStyle.Italic
+                )
 
         assertThat(font).isEqualTo(listOf(FONT_200_ITALIC))
     }
 
     @Test
     fun `italic query against family with multiple fonts and fallback matches`() {
-        val font = FontMatcher().matchFont(
-            FontFamily(
-                FONT_100_REGULAR,
-                FONT_100_ITALIC,
-                FONT_200_REGULAR,
-                FONT_200_ITALIC,
-                FONT_200_ITALIC_FALLBACK
-            ),
-            FontWeight.W200,
-            FontStyle.Italic
-        )
+        val font =
+            FontMatcher()
+                .matchFont(
+                    FontFamily(
+                        FONT_100_REGULAR,
+                        FONT_100_ITALIC,
+                        FONT_200_REGULAR,
+                        FONT_200_ITALIC,
+                        FONT_200_ITALIC_FALLBACK
+                    ),
+                    FontWeight.W200,
+                    FontStyle.Italic
+                )
 
         assertThat(font).isEqualTo(listOf(FONT_200_ITALIC, FONT_200_ITALIC_FALLBACK))
     }
 
     @Test
     fun `normal style query against family with multiple fonts matches`() {
-        val font = FontMatcher().matchFont(
-            FontFamily(
-                FONT_100_REGULAR,
-                FONT_200_ITALIC,
-                FONT_200_REGULAR,
-                FONT_300_REGULAR
-            ),
-            FontWeight.W200,
-            FontStyle.Normal
-        )
+        val font =
+            FontMatcher()
+                .matchFont(
+                    FontFamily(
+                        FONT_100_REGULAR,
+                        FONT_200_ITALIC,
+                        FONT_200_REGULAR,
+                        FONT_300_REGULAR
+                    ),
+                    FontWeight.W200,
+                    FontStyle.Normal
+                )
 
         assertThat(font).isEqualTo(listOf(FONT_200_REGULAR))
     }
@@ -140,17 +142,19 @@
         //     descending order
         // --> followed by weights above the desired weight in ascending order
         // until a match is found.
-        val font = FontMatcher().matchFont(
-            FontFamily(
-                FONT_100_REGULAR,
-                FONT_100_ITALIC,
-                FONT_300_REGULAR,
-                FONT_400_REGULAR,
-                FONT_400_ITALIC
-            ),
-            FontWeight.W300,
-            FontStyle.Italic
-        )
+        val font =
+            FontMatcher()
+                .matchFont(
+                    FontFamily(
+                        FONT_100_REGULAR,
+                        FONT_100_ITALIC,
+                        FONT_300_REGULAR,
+                        FONT_400_REGULAR,
+                        FONT_400_ITALIC
+                    ),
+                    FontWeight.W300,
+                    FontStyle.Italic
+                )
 
         assertThat(font).isEqualTo(listOf(FONT_100_ITALIC))
     }
@@ -163,18 +167,20 @@
         //     descending order
         // --> followed by weights above the desired weight in ascending order
         // until a match is found.
-        val font = FontMatcher().matchFont(
-            FontFamily(
-                FONT_100_REGULAR,
-                FONT_100_ITALIC,
-                FONT_100_ITALIC_FALLBACK,
-                FONT_300_REGULAR,
-                FONT_400_REGULAR,
-                FONT_400_ITALIC
-            ),
-            FontWeight.W300,
-            FontStyle.Italic
-        )
+        val font =
+            FontMatcher()
+                .matchFont(
+                    FontFamily(
+                        FONT_100_REGULAR,
+                        FONT_100_ITALIC,
+                        FONT_100_ITALIC_FALLBACK,
+                        FONT_300_REGULAR,
+                        FONT_400_REGULAR,
+                        FONT_400_ITALIC
+                    ),
+                    FontWeight.W300,
+                    FontStyle.Italic
+                )
 
         assertThat(font).isEqualTo(listOf(FONT_100_ITALIC, FONT_100_ITALIC_FALLBACK))
     }
@@ -187,17 +193,19 @@
         //     descending order
         // --> (THIS TEST) followed by weights above the desired weight in ascending order
         // until a match is found.
-        val font = FontMatcher().matchFont(
-            FontFamily(
-                FONT_100_REGULAR,
-                FONT_200_REGULAR,
-                FONT_300_REGULAR,
-                FONT_400_REGULAR,
-                FONT_400_ITALIC
-            ),
-            FontWeight.W200,
-            FontStyle.Italic
-        )
+        val font =
+            FontMatcher()
+                .matchFont(
+                    FontFamily(
+                        FONT_100_REGULAR,
+                        FONT_200_REGULAR,
+                        FONT_300_REGULAR,
+                        FONT_400_REGULAR,
+                        FONT_400_ITALIC
+                    ),
+                    FontWeight.W200,
+                    FontStyle.Italic
+                )
 
         assertThat(font).isEqualTo(listOf(FONT_400_ITALIC))
     }
@@ -210,18 +218,20 @@
         //     descending order
         // --> (THIS TEST) followed by weights above the desired weight in ascending order
         // until a match is found.
-        val font = FontMatcher().matchFont(
-            FontFamily(
-                FONT_100_REGULAR,
-                FONT_200_REGULAR,
-                FONT_300_REGULAR,
-                FONT_400_REGULAR,
-                FONT_400_ITALIC,
-                FONT_400_ITALIC_FALLBACK
-            ),
-            FontWeight.W200,
-            FontStyle.Italic
-        )
+        val font =
+            FontMatcher()
+                .matchFont(
+                    FontFamily(
+                        FONT_100_REGULAR,
+                        FONT_200_REGULAR,
+                        FONT_300_REGULAR,
+                        FONT_400_REGULAR,
+                        FONT_400_ITALIC,
+                        FONT_400_ITALIC_FALLBACK
+                    ),
+                    FontWeight.W200,
+                    FontStyle.Italic
+                )
 
         assertThat(font).isEqualTo(listOf(FONT_400_ITALIC, FONT_400_ITALIC_FALLBACK))
     }
@@ -234,19 +244,21 @@
         //     ascending order
         // --> followed by weights below the desired weight in descending order
         // until a match is found.
-        val font = FontMatcher().matchFont(
-            FontFamily(
-                FONT_100_ITALIC,
-                FONT_300_ITALIC,
-                FONT_400_ITALIC,
-                FONT_600_REGULAR,
-                FONT_700_REGULAR,
-                FONT_800_REGULAR,
-                FONT_800_ITALIC
-            ),
-            FontWeight.W600,
-            FontStyle.Italic
-        )
+        val font =
+            FontMatcher()
+                .matchFont(
+                    FontFamily(
+                        FONT_100_ITALIC,
+                        FONT_300_ITALIC,
+                        FONT_400_ITALIC,
+                        FONT_600_REGULAR,
+                        FONT_700_REGULAR,
+                        FONT_800_REGULAR,
+                        FONT_800_ITALIC
+                    ),
+                    FontWeight.W600,
+                    FontStyle.Italic
+                )
 
         assertThat(font).isEqualTo(listOf(FONT_800_ITALIC))
     }
@@ -259,20 +271,22 @@
         //     ascending order
         // --> followed by weights below the desired weight in descending order
         // until a match is found.
-        val font = FontMatcher().matchFont(
-            FontFamily(
-                FONT_100_ITALIC,
-                FONT_300_ITALIC,
-                FONT_400_ITALIC,
-                FONT_600_REGULAR,
-                FONT_700_REGULAR,
-                FONT_800_REGULAR,
-                FONT_800_ITALIC,
-                FONT_800_ITALIC_FALLBACK
-            ),
-            FontWeight.W600,
-            FontStyle.Italic
-        )
+        val font =
+            FontMatcher()
+                .matchFont(
+                    FontFamily(
+                        FONT_100_ITALIC,
+                        FONT_300_ITALIC,
+                        FONT_400_ITALIC,
+                        FONT_600_REGULAR,
+                        FONT_700_REGULAR,
+                        FONT_800_REGULAR,
+                        FONT_800_ITALIC,
+                        FONT_800_ITALIC_FALLBACK
+                    ),
+                    FontWeight.W600,
+                    FontStyle.Italic
+                )
 
         assertThat(font).isEqualTo(listOf(FONT_800_ITALIC, FONT_800_ITALIC_FALLBACK))
     }
@@ -285,18 +299,20 @@
         //     ascending order
         // --> (THIS TEST) followed by weights below the desired weight in descending order
         // until a match is found.
-        val font = FontMatcher().matchFont(
-            FontFamily(
-                FONT_300_ITALIC,
-                FONT_400_REGULAR,
-                FONT_400_ITALIC,
-                FONT_500_REGULAR,
-                FONT_600_REGULAR,
-                FONT_700_REGULAR
-            ),
-            FontWeight.W600,
-            FontStyle.Italic
-        )
+        val font =
+            FontMatcher()
+                .matchFont(
+                    FontFamily(
+                        FONT_300_ITALIC,
+                        FONT_400_REGULAR,
+                        FONT_400_ITALIC,
+                        FONT_500_REGULAR,
+                        FONT_600_REGULAR,
+                        FONT_700_REGULAR
+                    ),
+                    FontWeight.W600,
+                    FontStyle.Italic
+                )
 
         assertThat(font).isEqualTo(listOf(FONT_400_ITALIC))
     }
@@ -309,20 +325,22 @@
         //     ascending order
         // --> (THIS TEST) followed by weights below the desired weight in descending order
         // until a match is found.
-        val font = FontMatcher().matchFont(
-            FontFamily(
-                FONT_300_ITALIC,
-                FONT_400_REGULAR,
-                FONT_400_REGULAR_FALLBACK,
-                FONT_400_ITALIC,
-                FONT_400_ITALIC_FALLBACK,
-                FONT_500_REGULAR,
-                FONT_600_REGULAR,
-                FONT_700_REGULAR
-            ),
-            FontWeight.W600,
-            FontStyle.Italic
-        )
+        val font =
+            FontMatcher()
+                .matchFont(
+                    FontFamily(
+                        FONT_300_ITALIC,
+                        FONT_400_REGULAR,
+                        FONT_400_REGULAR_FALLBACK,
+                        FONT_400_ITALIC,
+                        FONT_400_ITALIC_FALLBACK,
+                        FONT_500_REGULAR,
+                        FONT_600_REGULAR,
+                        FONT_700_REGULAR
+                    ),
+                    FontWeight.W600,
+                    FontStyle.Italic
+                )
 
         assertThat(font).isEqualTo(listOf(FONT_400_ITALIC, FONT_400_ITALIC_FALLBACK))
     }
@@ -336,17 +354,19 @@
         // --> followed by weights less than the target weight in descending order
         // --> followed by weights greater than 500,
         // until a match is found.
-        val font = FontMatcher().matchFont(
-            FontFamily(
-                FONT_300_ITALIC,
-                FONT_400_REGULAR,
-                FONT_500_REGULAR,
-                FONT_500_ITALIC,
-                FONT_600_ITALIC
-            ),
-            FontWeight.W400,
-            FontStyle.Italic
-        )
+        val font =
+            FontMatcher()
+                .matchFont(
+                    FontFamily(
+                        FONT_300_ITALIC,
+                        FONT_400_REGULAR,
+                        FONT_500_REGULAR,
+                        FONT_500_ITALIC,
+                        FONT_600_ITALIC
+                    ),
+                    FontWeight.W400,
+                    FontStyle.Italic
+                )
 
         assertThat(font).isEqualTo(listOf(FONT_500_ITALIC))
     }
@@ -360,18 +380,20 @@
         // --> followed by weights less than the target weight in descending order
         // --> followed by weights greater than 500,
         // until a match is found.
-        val font = FontMatcher().matchFont(
-            FontFamily(
-                FONT_300_ITALIC,
-                FONT_400_REGULAR,
-                FONT_500_REGULAR,
-                FONT_500_ITALIC,
-                FONT_600_ITALIC,
-                FONT_500_ITALIC_FALLBACK
-            ),
-            FontWeight.W400,
-            FontStyle.Italic
-        )
+        val font =
+            FontMatcher()
+                .matchFont(
+                    FontFamily(
+                        FONT_300_ITALIC,
+                        FONT_400_REGULAR,
+                        FONT_500_REGULAR,
+                        FONT_500_ITALIC,
+                        FONT_600_ITALIC,
+                        FONT_500_ITALIC_FALLBACK
+                    ),
+                    FontWeight.W400,
+                    FontStyle.Italic
+                )
 
         assertThat(font).isEqualTo(listOf(FONT_500_ITALIC, FONT_500_ITALIC_FALLBACK))
     }
@@ -385,15 +407,13 @@
         // --> (THIS TEST) followed by weights less than the target weight in descending order
         // --> followed by weights greater than 500,
         // until a match is found.
-        val font = FontMatcher().matchFont(
-            FontFamily(
-                FONT_300_ITALIC,
-                FONT_500_REGULAR,
-                FONT_600_ITALIC
-            ),
-            FontWeight.W400,
-            FontStyle.Italic
-        )
+        val font =
+            FontMatcher()
+                .matchFont(
+                    FontFamily(FONT_300_ITALIC, FONT_500_REGULAR, FONT_600_ITALIC),
+                    FontWeight.W400,
+                    FontStyle.Italic
+                )
 
         assertThat(font).isEqualTo(listOf(FONT_300_ITALIC))
     }
@@ -407,16 +427,18 @@
         // --> (THIS TEST) followed by weights less than the target weight in descending order
         // --> followed by weights greater than 500,
         // until a match is found.
-        val font = FontMatcher().matchFont(
-            FontFamily(
-                FONT_300_ITALIC,
-                FONT_500_REGULAR,
-                FONT_600_ITALIC,
-                FONT_300_ITALIC_FALLBACK
-            ),
-            FontWeight.W400,
-            FontStyle.Italic
-        )
+        val font =
+            FontMatcher()
+                .matchFont(
+                    FontFamily(
+                        FONT_300_ITALIC,
+                        FONT_500_REGULAR,
+                        FONT_600_ITALIC,
+                        FONT_300_ITALIC_FALLBACK
+                    ),
+                    FontWeight.W400,
+                    FontStyle.Italic
+                )
 
         assertThat(font).isEqualTo(listOf(FONT_300_ITALIC, FONT_300_ITALIC_FALLBACK))
     }
@@ -430,15 +452,13 @@
         // --> (THIS TEST) followed by weights less than the target weight in descending order
         // --> followed by weights greater than 500,
         // until a match is found.
-        val font = FontMatcher().matchFont(
-            FontFamily(
-                FONT_300_ITALIC,
-                FONT_500_REGULAR,
-                FONT_600_ITALIC
-            ),
-            FontWeight.W500,
-            FontStyle.Italic
-        )
+        val font =
+            FontMatcher()
+                .matchFont(
+                    FontFamily(FONT_300_ITALIC, FONT_500_REGULAR, FONT_600_ITALIC),
+                    FontWeight.W500,
+                    FontStyle.Italic
+                )
 
         assertThat(font).isEqualTo(listOf(FONT_300_ITALIC))
     }
@@ -452,16 +472,18 @@
         // --> (THIS TEST) followed by weights less than the target weight in descending order
         // --> followed by weights greater than 500,
         // until a match is found.
-        val font = FontMatcher().matchFont(
-            FontFamily(
-                FONT_300_ITALIC,
-                FONT_500_REGULAR,
-                FONT_600_ITALIC,
-                FONT_300_ITALIC_FALLBACK
-            ),
-            FontWeight.W500,
-            FontStyle.Italic
-        )
+        val font =
+            FontMatcher()
+                .matchFont(
+                    FontFamily(
+                        FONT_300_ITALIC,
+                        FONT_500_REGULAR,
+                        FONT_600_ITALIC,
+                        FONT_300_ITALIC_FALLBACK
+                    ),
+                    FontWeight.W500,
+                    FontStyle.Italic
+                )
 
         assertThat(font).isEqualTo(listOf(FONT_300_ITALIC, FONT_300_ITALIC_FALLBACK))
     }
@@ -475,16 +497,18 @@
         // --> followed by weights less than the target weight in descending order
         // --> (THIS TEST) followed by weights greater than 500,
         // until a match is found.
-        val font = FontMatcher().matchFont(
-            FontFamily(
-                FONT_300_REGULAR,
-                FONT_400_REGULAR,
-                FONT_500_REGULAR,
-                FONT_600_ITALIC
-            ),
-            FontWeight.W400,
-            FontStyle.Italic
-        )
+        val font =
+            FontMatcher()
+                .matchFont(
+                    FontFamily(
+                        FONT_300_REGULAR,
+                        FONT_400_REGULAR,
+                        FONT_500_REGULAR,
+                        FONT_600_ITALIC
+                    ),
+                    FontWeight.W400,
+                    FontStyle.Italic
+                )
 
         assertThat(font).isEqualTo(listOf(FONT_600_ITALIC))
     }
@@ -498,17 +522,19 @@
         // --> followed by weights less than the target weight in descending order
         // --> (THIS TEST) followed by weights greater than 500,
         // until a match is found.
-        val font = FontMatcher().matchFont(
-            FontFamily(
-                FONT_300_REGULAR,
-                FONT_400_REGULAR,
-                FONT_500_REGULAR,
-                FONT_600_ITALIC,
-                FONT_600_ITALIC_FALLBACK
-            ),
-            FontWeight.W400,
-            FontStyle.Italic
-        )
+        val font =
+            FontMatcher()
+                .matchFont(
+                    FontFamily(
+                        FONT_300_REGULAR,
+                        FONT_400_REGULAR,
+                        FONT_500_REGULAR,
+                        FONT_600_ITALIC,
+                        FONT_600_ITALIC_FALLBACK
+                    ),
+                    FontWeight.W400,
+                    FontStyle.Italic
+                )
 
         assertThat(font).isEqualTo(listOf(FONT_600_ITALIC, FONT_600_ITALIC_FALLBACK))
     }
@@ -522,16 +548,18 @@
         // --> followed by weights less than the target weight in descending order
         // --> (THIS TEST) followed by weights greater than 500,
         // until a match is found.
-        val font = FontMatcher().matchFont(
-            FontFamily(
-                FONT_300_REGULAR,
-                FONT_400_REGULAR,
-                FONT_500_REGULAR,
-                FONT_600_ITALIC
-            ),
-            FontWeight.W500,
-            FontStyle.Italic
-        )
+        val font =
+            FontMatcher()
+                .matchFont(
+                    FontFamily(
+                        FONT_300_REGULAR,
+                        FONT_400_REGULAR,
+                        FONT_500_REGULAR,
+                        FONT_600_ITALIC
+                    ),
+                    FontWeight.W500,
+                    FontStyle.Italic
+                )
 
         assertThat(font).isEqualTo(listOf(FONT_600_ITALIC))
     }
@@ -545,151 +573,165 @@
         // --> followed by weights less than the target weight in descending order
         // --> (THIS TEST) followed by weights greater than 500,
         // until a match is found.
-        val font = FontMatcher().matchFont(
-            FontFamily(
-                FONT_300_REGULAR,
-                FONT_400_REGULAR,
-                FONT_500_REGULAR,
-                FONT_600_ITALIC,
-                FONT_600_ITALIC_FALLBACK
-            ),
-            FontWeight.W500,
-            FontStyle.Italic
-        )
+        val font =
+            FontMatcher()
+                .matchFont(
+                    FontFamily(
+                        FONT_300_REGULAR,
+                        FONT_400_REGULAR,
+                        FONT_500_REGULAR,
+                        FONT_600_ITALIC,
+                        FONT_600_ITALIC_FALLBACK
+                    ),
+                    FontWeight.W500,
+                    FontStyle.Italic
+                )
 
         assertThat(font).isEqualTo(listOf(FONT_600_ITALIC, FONT_600_ITALIC_FALLBACK))
     }
 
     @Test
     fun `italic style returns another italic if exists`() {
-        val font = FontMatcher().matchFont(
-            FontFamily(
-                FONT_100_REGULAR,
-                FONT_200_REGULAR,
-                FONT_400_REGULAR,
-                FONT_500_REGULAR,
-                FONT_600_ITALIC
-            ),
-            FontWeight.W100,
-            FontStyle.Italic
-        )
+        val font =
+            FontMatcher()
+                .matchFont(
+                    FontFamily(
+                        FONT_100_REGULAR,
+                        FONT_200_REGULAR,
+                        FONT_400_REGULAR,
+                        FONT_500_REGULAR,
+                        FONT_600_ITALIC
+                    ),
+                    FontWeight.W100,
+                    FontStyle.Italic
+                )
 
         assertThat(font).isEqualTo(listOf(FONT_600_ITALIC))
     }
 
     @Test
     fun `italic style returns another italic and fallback if exists`() {
-        val font = FontMatcher().matchFont(
-            FontFamily(
-                FONT_100_REGULAR,
-                FONT_200_REGULAR,
-                FONT_400_REGULAR,
-                FONT_500_REGULAR,
-                FONT_600_ITALIC,
-                FONT_600_ITALIC_FALLBACK
-            ),
-            FontWeight.W100,
-            FontStyle.Italic
-        )
+        val font =
+            FontMatcher()
+                .matchFont(
+                    FontFamily(
+                        FONT_100_REGULAR,
+                        FONT_200_REGULAR,
+                        FONT_400_REGULAR,
+                        FONT_500_REGULAR,
+                        FONT_600_ITALIC,
+                        FONT_600_ITALIC_FALLBACK
+                    ),
+                    FontWeight.W100,
+                    FontStyle.Italic
+                )
 
         assertThat(font).isEqualTo(listOf(FONT_600_ITALIC, FONT_600_ITALIC_FALLBACK))
     }
 
     @Test
     fun `italic style returns another italic if exists even when smaller`() {
-        val font = FontMatcher().matchFont(
-            FontFamily(
-                FONT_100_ITALIC,
-                FONT_200_REGULAR,
-                FONT_400_REGULAR,
-                FONT_500_REGULAR,
-                FONT_600_REGULAR
-            ),
-            FontWeight.W600,
-            FontStyle.Italic
-        )
+        val font =
+            FontMatcher()
+                .matchFont(
+                    FontFamily(
+                        FONT_100_ITALIC,
+                        FONT_200_REGULAR,
+                        FONT_400_REGULAR,
+                        FONT_500_REGULAR,
+                        FONT_600_REGULAR
+                    ),
+                    FontWeight.W600,
+                    FontStyle.Italic
+                )
 
         assertThat(font).isEqualTo(listOf(FONT_100_ITALIC))
     }
 
     @Test
     fun `italic style returns another italic and fallback if exists even when smaller`() {
-        val font = FontMatcher().matchFont(
-            FontFamily(
-                FONT_100_ITALIC,
-                FONT_200_REGULAR,
-                FONT_400_REGULAR,
-                FONT_500_REGULAR,
-                FONT_600_REGULAR,
-                FONT_100_ITALIC_FALLBACK
-            ),
-            FontWeight.W600,
-            FontStyle.Italic
-        )
+        val font =
+            FontMatcher()
+                .matchFont(
+                    FontFamily(
+                        FONT_100_ITALIC,
+                        FONT_200_REGULAR,
+                        FONT_400_REGULAR,
+                        FONT_500_REGULAR,
+                        FONT_600_REGULAR,
+                        FONT_100_ITALIC_FALLBACK
+                    ),
+                    FontWeight.W600,
+                    FontStyle.Italic
+                )
 
         assertThat(font).isEqualTo(listOf(FONT_100_ITALIC, FONT_100_ITALIC_FALLBACK))
     }
 
     @Test
     fun `italic style returns same weight regular if no other italic exists`() {
-        val font = FontMatcher().matchFont(
-            FontFamily(
-                FONT_200_REGULAR,
-                FONT_300_REGULAR,
-                FONT_400_REGULAR
-            ),
-            FontWeight.W300,
-            FontStyle.Italic
-        )
+        val font =
+            FontMatcher()
+                .matchFont(
+                    FontFamily(FONT_200_REGULAR, FONT_300_REGULAR, FONT_400_REGULAR),
+                    FontWeight.W300,
+                    FontStyle.Italic
+                )
 
         assertThat(font).isEqualTo(listOf(FONT_300_REGULAR))
     }
 
     @Test
     fun `italic style returns same weight regular and fallback if no other italic exists`() {
-        val font = FontMatcher().matchFont(
-            FontFamily(
-                FONT_200_REGULAR,
-                FONT_300_REGULAR,
-                FONT_300_REGULAR_FALLBACK,
-                FONT_400_REGULAR
-            ),
-            FontWeight.W300,
-            FontStyle.Italic
-        )
+        val font =
+            FontMatcher()
+                .matchFont(
+                    FontFamily(
+                        FONT_200_REGULAR,
+                        FONT_300_REGULAR,
+                        FONT_300_REGULAR_FALLBACK,
+                        FONT_400_REGULAR
+                    ),
+                    FontWeight.W300,
+                    FontStyle.Italic
+                )
 
         assertThat(font).isEqualTo(listOf(FONT_300_REGULAR, FONT_300_REGULAR_FALLBACK))
     }
 
     @Test
     fun `italic style at 600 returns larger weight regular if no other italic exists`() {
-        val font = FontMatcher().matchFont(
-            FontFamily(
-                FONT_400_REGULAR,
-                FONT_500_REGULAR,
-                FONT_600_REGULAR,
-                FONT_700_REGULAR
-            ),
-            FontWeight.W600,
-            FontStyle.Italic
-        )
+        val font =
+            FontMatcher()
+                .matchFont(
+                    FontFamily(
+                        FONT_400_REGULAR,
+                        FONT_500_REGULAR,
+                        FONT_600_REGULAR,
+                        FONT_700_REGULAR
+                    ),
+                    FontWeight.W600,
+                    FontStyle.Italic
+                )
 
         assertThat(font).isEqualTo(listOf(FONT_600_REGULAR))
     }
 
     @Test
     fun `italic style at 600 returns larger weight regular and fallback if no other italic`() {
-        val font = FontMatcher().matchFont(
-            FontFamily(
-                FONT_400_REGULAR,
-                FONT_500_REGULAR,
-                FONT_600_REGULAR,
-                FONT_700_REGULAR,
-                FONT_600_REGULAR_FALLBACK
-            ),
-            FontWeight.W600,
-            FontStyle.Italic
-        )
+        val font =
+            FontMatcher()
+                .matchFont(
+                    FontFamily(
+                        FONT_400_REGULAR,
+                        FONT_500_REGULAR,
+                        FONT_600_REGULAR,
+                        FONT_700_REGULAR,
+                        FONT_600_REGULAR_FALLBACK
+                    ),
+                    FontWeight.W600,
+                    FontStyle.Italic
+                )
 
         assertThat(font).isEqualTo(listOf(FONT_600_REGULAR, FONT_600_REGULAR_FALLBACK))
     }
@@ -701,14 +743,15 @@
             fonts.add(FontForWeight(weight))
             fonts.add(FontForWeight(weight))
         }
-        val result = with(FontMatcher()) {
-            fonts.filterByClosestWeight(
-                fontWeight = FontWeight(417),
-                preferBelow = true,
-                minSearchRange = null,
-                maxSearchRange = null
-            )
-        }
+        val result =
+            with(FontMatcher()) {
+                fonts.filterByClosestWeight(
+                    fontWeight = FontWeight(417),
+                    preferBelow = true,
+                    minSearchRange = null,
+                    maxSearchRange = null
+                )
+            }
 
         assertThat(result).hasSize(2)
         assertThat(result).containsExactlyElementsIn(fonts.filter { it.weight.weight == 417 })
@@ -721,14 +764,15 @@
             fonts.add(FontForWeight(weight))
             fonts.add(FontForWeight(weight))
         }
-        val result = with(FontMatcher()) {
-            fonts.filterByClosestWeight(
-                fontWeight = FontWeight(417),
-                preferBelow = false,
-                minSearchRange = null,
-                maxSearchRange = null
-            )
-        }
+        val result =
+            with(FontMatcher()) {
+                fonts.filterByClosestWeight(
+                    fontWeight = FontWeight(417),
+                    preferBelow = false,
+                    minSearchRange = null,
+                    maxSearchRange = null
+                )
+            }
 
         assertThat(result).hasSize(2)
         assertThat(result).containsExactlyElementsIn(fonts.filter { it.weight.weight == 417 })
@@ -745,14 +789,15 @@
             fonts.add(FontForWeight(weight))
             fonts.add(FontForWeight(weight))
         }
-        val result = with(FontMatcher()) {
-            fonts.filterByClosestWeight(
-                fontWeight = FontWeight(417),
-                preferBelow = false,
-                minSearchRange = null,
-                maxSearchRange = null
-            )
-        }
+        val result =
+            with(FontMatcher()) {
+                fonts.filterByClosestWeight(
+                    fontWeight = FontWeight(417),
+                    preferBelow = false,
+                    minSearchRange = null,
+                    maxSearchRange = null
+                )
+            }
 
         assertThat(result).hasSize(2)
         assertThat(result).containsExactlyElementsIn(fonts.filter { it.weight.weight == 418 })
@@ -765,14 +810,15 @@
             fonts.add(FontForWeight(weight))
             fonts.add(FontForWeight(weight))
         }
-        val result = with(FontMatcher()) {
-            fonts.filterByClosestWeight(
-                fontWeight = FontWeight(417),
-                preferBelow = false,
-                minSearchRange = null,
-                maxSearchRange = null
-            )
-        }
+        val result =
+            with(FontMatcher()) {
+                fonts.filterByClosestWeight(
+                    fontWeight = FontWeight(417),
+                    preferBelow = false,
+                    minSearchRange = null,
+                    maxSearchRange = null
+                )
+            }
 
         assertThat(result).hasSize(2)
         assertThat(result).containsExactlyElementsIn(fonts.filter { it.weight.weight == 416 })
@@ -789,14 +835,15 @@
             fonts.add(FontForWeight(weight))
             fonts.add(FontForWeight(weight))
         }
-        val result = with(FontMatcher()) {
-            fonts.filterByClosestWeight(
-                fontWeight = FontWeight(417),
-                preferBelow = true,
-                minSearchRange = null,
-                maxSearchRange = null
-            )
-        }
+        val result =
+            with(FontMatcher()) {
+                fonts.filterByClosestWeight(
+                    fontWeight = FontWeight(417),
+                    preferBelow = true,
+                    minSearchRange = null,
+                    maxSearchRange = null
+                )
+            }
 
         assertThat(result).hasSize(2)
         assertThat(result).containsExactlyElementsIn(fonts.filter { it.weight.weight == 416 })
@@ -809,14 +856,15 @@
             fonts.add(FontForWeight(weight))
             fonts.add(FontForWeight(weight))
         }
-        val result = with(FontMatcher()) {
-            fonts.filterByClosestWeight(
-                fontWeight = FontWeight(417),
-                preferBelow = true,
-                minSearchRange = null,
-                maxSearchRange = null
-            )
-        }
+        val result =
+            with(FontMatcher()) {
+                fonts.filterByClosestWeight(
+                    fontWeight = FontWeight(417),
+                    preferBelow = true,
+                    minSearchRange = null,
+                    maxSearchRange = null
+                )
+            }
 
         assertThat(result).hasSize(2)
         assertThat(result).containsExactlyElementsIn(fonts.filter { it.weight.weight == 418 })
@@ -829,14 +877,15 @@
             fonts.add(FontForWeight(weight))
             fonts.add(FontForWeight(weight))
         }
-        val result = with(FontMatcher()) {
-            fonts.filterByClosestWeight(
-                fontWeight = FontWeight(417),
-                preferBelow = true,
-                minSearchRange = FontWeight(450),
-                maxSearchRange = null
-            )
-        }
+        val result =
+            with(FontMatcher()) {
+                fonts.filterByClosestWeight(
+                    fontWeight = FontWeight(417),
+                    preferBelow = true,
+                    minSearchRange = FontWeight(450),
+                    maxSearchRange = null
+                )
+            }
 
         assertThat(result).hasSize(2)
         assertThat(result).containsExactlyElementsIn(fonts.filter { it.weight.weight == 450 })
@@ -849,14 +898,15 @@
             fonts.add(FontForWeight(weight))
             fonts.add(FontForWeight(weight))
         }
-        val result = with(FontMatcher()) {
-            fonts.filterByClosestWeight(
-                fontWeight = FontWeight(417),
-                preferBelow = true,
-                minSearchRange = null,
-                maxSearchRange = FontWeight(401),
-            )
-        }
+        val result =
+            with(FontMatcher()) {
+                fonts.filterByClosestWeight(
+                    fontWeight = FontWeight(417),
+                    preferBelow = true,
+                    minSearchRange = null,
+                    maxSearchRange = FontWeight(401),
+                )
+            }
 
         assertThat(result).hasSize(2)
         assertThat(result).containsExactlyElementsIn(fonts.filter { it.weight.weight == 401 })
@@ -869,14 +919,15 @@
             fonts.add(FontForWeight(weight))
             fonts.add(FontForWeight(weight))
         }
-        val result = with(FontMatcher()) {
-            fonts.filterByClosestWeight(
-                fontWeight = FontWeight(417),
-                preferBelow = true,
-                minSearchRange = FontWeight(500),
-                maxSearchRange = FontWeight(400),
-            )
-        }
+        val result =
+            with(FontMatcher()) {
+                fonts.filterByClosestWeight(
+                    fontWeight = FontWeight(417),
+                    preferBelow = true,
+                    minSearchRange = FontWeight(500),
+                    maxSearchRange = FontWeight(400),
+                )
+            }
 
         assertThat(result).isEmpty()
     }
@@ -888,14 +939,15 @@
             fonts.add(FontForWeight(weight))
             fonts.add(FontForWeight(weight))
         }
-        val result = with(FontMatcher()) {
-            fonts.filterByClosestWeight(
-                fontWeight = FontWeight(417),
-                preferBelow = true,
-                minSearchRange = FontWeight(900),
-                maxSearchRange = FontWeight(900),
-            )
-        }
+        val result =
+            with(FontMatcher()) {
+                fonts.filterByClosestWeight(
+                    fontWeight = FontWeight(417),
+                    preferBelow = true,
+                    minSearchRange = FontWeight(900),
+                    maxSearchRange = FontWeight(900),
+                )
+            }
 
         assertThat(result).hasSize(2)
         assertThat(result).containsExactlyElementsIn(fonts.filter { it.weight.weight == 900 })
@@ -908,24 +960,26 @@
             fonts.add(FontForWeight(weight))
             fonts.add(FontForWeight(weight))
         }
-        val result = with(FontMatcher()) {
-            fonts.filterByClosestWeight(
-                fontWeight = FontWeight(417),
-                preferBelow = true,
-                minSearchRange = FontWeight(100),
-                maxSearchRange = FontWeight(100),
-            )
-        }
+        val result =
+            with(FontMatcher()) {
+                fonts.filterByClosestWeight(
+                    fontWeight = FontWeight(417),
+                    preferBelow = true,
+                    minSearchRange = FontWeight(100),
+                    maxSearchRange = FontWeight(100),
+                )
+            }
 
         assertThat(result).hasSize(2)
         assertThat(result).containsExactlyElementsIn(fonts.filter { it.weight.weight == 100 })
     }
 
-    private fun FontForWeight(it: Int) = object : Font {
-        override val weight: FontWeight = FontWeight(it)
-        override val style: FontStyle = FontStyle.Normal
+    private fun FontForWeight(it: Int) =
+        object : Font {
+            override val weight: FontWeight = FontWeight(it)
+            override val style: FontStyle = FontStyle.Normal
 
-        @ExperimentalTextApi
-        override val loadingStrategy: FontLoadingStrategy = FontLoadingStrategy.Blocking
-    }
+            @ExperimentalTextApi
+            override val loadingStrategy: FontLoadingStrategy = FontLoadingStrategy.Blocking
+        }
 }
diff --git a/compose/ui/ui-text/src/androidUnitTest/kotlin/androidx/compose/ui/text/font/FontTest.kt b/compose/ui/ui-text/src/androidUnitTest/kotlin/androidx/compose/ui/text/font/FontTest.kt
index b2db0b0..9c299e8 100644
--- a/compose/ui/ui-text/src/androidUnitTest/kotlin/androidx/compose/ui/text/font/FontTest.kt
+++ b/compose/ui/ui-text/src/androidUnitTest/kotlin/androidx/compose/ui/text/font/FontTest.kt
@@ -36,45 +36,25 @@
 
     @Test
     fun `two equal font declarations are equal`() {
-        val font = Font(
-            resId = resourceId,
-            weight = FontWeight.W900,
-            style = FontStyle.Italic
-        )
+        val font = Font(resId = resourceId, weight = FontWeight.W900, style = FontStyle.Italic)
 
-        val otherFont = Font(
-            resId = resourceId,
-            weight = FontWeight.W900,
-            style = FontStyle.Italic
-        )
+        val otherFont = Font(resId = resourceId, weight = FontWeight.W900, style = FontStyle.Italic)
 
         assertThat(font).isEqualTo(otherFont)
     }
 
     @Test
     fun `two non equal font declarations are not equal`() {
-        val font = Font(
-            resId = resourceId,
-            weight = FontWeight.W900,
-            style = FontStyle.Italic
-        )
+        val font = Font(resId = resourceId, weight = FontWeight.W900, style = FontStyle.Italic)
 
-        val otherFont = Font(
-            resId = resourceId,
-            weight = FontWeight.W800,
-            style = FontStyle.Italic
-        )
+        val otherFont = Font(resId = resourceId, weight = FontWeight.W800, style = FontStyle.Italic)
 
         assertThat(font).isNotEqualTo(otherFont)
     }
 
     @Test
     fun `asFontFamilyList returns a FontFamily`() {
-        val font = Font(
-            resId = resourceId,
-            weight = FontWeight.W900,
-            style = FontStyle.Italic
-        )
+        val font = Font(resId = resourceId, weight = FontWeight.W900, style = FontStyle.Italic)
 
         val fontFamily = font.toFontFamily() as FontListFontFamily
 
diff --git a/compose/ui/ui-text/src/androidUnitTest/kotlin/androidx/compose/ui/text/font/FontTestData.kt b/compose/ui/ui-text/src/androidUnitTest/kotlin/androidx/compose/ui/text/font/FontTestData.kt
index a3514ed..2301b21 100644
--- a/compose/ui/ui-text/src/androidUnitTest/kotlin/androidx/compose/ui/text/font/FontTestData.kt
+++ b/compose/ui/ui-text/src/androidUnitTest/kotlin/androidx/compose/ui/text/font/FontTestData.kt
@@ -20,178 +20,91 @@
     companion object {
         private val resourceId = 1
 
-        val BASIC_MEASURE_FONT = Font(
-            resId = resourceId,
-            weight = FontWeight.W100,
-            style = FontStyle.Normal
-        )
+        val BASIC_MEASURE_FONT =
+            Font(resId = resourceId, weight = FontWeight.W100, style = FontStyle.Normal)
 
-        val FONT_100_REGULAR = Font(
-            resId = resourceId,
-            weight = FontWeight.W100,
-            style = FontStyle.Normal
-        )
+        val FONT_100_REGULAR =
+            Font(resId = resourceId, weight = FontWeight.W100, style = FontStyle.Normal)
 
-        val FONT_100_ITALIC = Font(
-            resId = resourceId,
-            weight = FontWeight.W100,
-            style = FontStyle.Italic
-        )
+        val FONT_100_ITALIC =
+            Font(resId = resourceId, weight = FontWeight.W100, style = FontStyle.Italic)
 
-        val FONT_100_ITALIC_FALLBACK = Font(
-            resId = resourceId,
-            weight = FontWeight.W100,
-            style = FontStyle.Italic
-        )
+        val FONT_100_ITALIC_FALLBACK =
+            Font(resId = resourceId, weight = FontWeight.W100, style = FontStyle.Italic)
 
-        val FONT_200_REGULAR = Font(
-            resId = resourceId,
-            weight = FontWeight.W200,
-            style = FontStyle.Normal
-        )
+        val FONT_200_REGULAR =
+            Font(resId = resourceId, weight = FontWeight.W200, style = FontStyle.Normal)
 
-        val FONT_200_ITALIC = Font(
-            resId = resourceId,
-            weight = FontWeight.W200,
-            style = FontStyle.Italic
-        )
+        val FONT_200_ITALIC =
+            Font(resId = resourceId, weight = FontWeight.W200, style = FontStyle.Italic)
 
-        val FONT_200_ITALIC_FALLBACK = Font(
-            resId = resourceId,
-            weight = FontWeight.W200,
-            style = FontStyle.Italic
-        )
+        val FONT_200_ITALIC_FALLBACK =
+            Font(resId = resourceId, weight = FontWeight.W200, style = FontStyle.Italic)
 
-        val FONT_300_REGULAR = Font(
-            resId = resourceId,
-            weight = FontWeight.W300,
-            style = FontStyle.Normal
-        )
+        val FONT_300_REGULAR =
+            Font(resId = resourceId, weight = FontWeight.W300, style = FontStyle.Normal)
 
-        val FONT_300_REGULAR_FALLBACK = Font(
-            resId = resourceId,
-            weight = FontWeight.W300,
-            style = FontStyle.Normal
-        )
+        val FONT_300_REGULAR_FALLBACK =
+            Font(resId = resourceId, weight = FontWeight.W300, style = FontStyle.Normal)
 
-        val FONT_300_ITALIC = Font(
-            resId = resourceId,
-            weight = FontWeight.W300,
-            style = FontStyle.Italic
-        )
+        val FONT_300_ITALIC =
+            Font(resId = resourceId, weight = FontWeight.W300, style = FontStyle.Italic)
 
-        val FONT_300_ITALIC_FALLBACK = Font(
-            resId = resourceId,
-            weight = FontWeight.W300,
-            style = FontStyle.Italic
-        )
+        val FONT_300_ITALIC_FALLBACK =
+            Font(resId = resourceId, weight = FontWeight.W300, style = FontStyle.Italic)
 
-        val FONT_400_REGULAR = Font(
-            resId = resourceId,
-            weight = FontWeight.W400,
-            style = FontStyle.Normal
-        )
+        val FONT_400_REGULAR =
+            Font(resId = resourceId, weight = FontWeight.W400, style = FontStyle.Normal)
 
-        val FONT_400_REGULAR_FALLBACK = Font(
-            resId = resourceId,
-            weight = FontWeight.W400,
-            style = FontStyle.Normal
-        )
+        val FONT_400_REGULAR_FALLBACK =
+            Font(resId = resourceId, weight = FontWeight.W400, style = FontStyle.Normal)
 
-        val FONT_400_ITALIC = Font(
-            resId = resourceId,
-            weight = FontWeight.W400,
-            style = FontStyle.Italic
-        )
+        val FONT_400_ITALIC =
+            Font(resId = resourceId, weight = FontWeight.W400, style = FontStyle.Italic)
 
-        val FONT_400_ITALIC_FALLBACK = Font(
-            resId = resourceId,
-            weight = FontWeight.W400,
-            style = FontStyle.Italic
-        )
+        val FONT_400_ITALIC_FALLBACK =
+            Font(resId = resourceId, weight = FontWeight.W400, style = FontStyle.Italic)
 
-        val FONT_500_REGULAR = Font(
-            resId = resourceId,
-            weight = FontWeight.W500,
-            style = FontStyle.Normal
-        )
+        val FONT_500_REGULAR =
+            Font(resId = resourceId, weight = FontWeight.W500, style = FontStyle.Normal)
 
-        val FONT_500_ITALIC = Font(
-            resId = resourceId,
-            weight = FontWeight.W500,
-            style = FontStyle.Italic
-        )
+        val FONT_500_ITALIC =
+            Font(resId = resourceId, weight = FontWeight.W500, style = FontStyle.Italic)
 
-        val FONT_500_ITALIC_FALLBACK = Font(
-            resId = resourceId,
-            weight = FontWeight.W500,
-            style = FontStyle.Italic
-        )
+        val FONT_500_ITALIC_FALLBACK =
+            Font(resId = resourceId, weight = FontWeight.W500, style = FontStyle.Italic)
 
-        val FONT_600_REGULAR = Font(
-            resId = resourceId,
-            weight = FontWeight.W600,
-            style = FontStyle.Normal
-        )
+        val FONT_600_REGULAR =
+            Font(resId = resourceId, weight = FontWeight.W600, style = FontStyle.Normal)
 
-        val FONT_600_REGULAR_FALLBACK = Font(
-            resId = resourceId,
-            weight = FontWeight.W600,
-            style = FontStyle.Normal
-        )
+        val FONT_600_REGULAR_FALLBACK =
+            Font(resId = resourceId, weight = FontWeight.W600, style = FontStyle.Normal)
 
-        val FONT_600_ITALIC = Font(
-            resId = resourceId,
-            weight = FontWeight.W600,
-            style = FontStyle.Italic
-        )
+        val FONT_600_ITALIC =
+            Font(resId = resourceId, weight = FontWeight.W600, style = FontStyle.Italic)
 
-        val FONT_600_ITALIC_FALLBACK = Font(
-            resId = resourceId,
-            weight = FontWeight.W600,
-            style = FontStyle.Italic
-        )
+        val FONT_600_ITALIC_FALLBACK =
+            Font(resId = resourceId, weight = FontWeight.W600, style = FontStyle.Italic)
 
-        val FONT_700_REGULAR = Font(
-            resId = resourceId,
-            weight = FontWeight.W700,
-            style = FontStyle.Normal
-        )
+        val FONT_700_REGULAR =
+            Font(resId = resourceId, weight = FontWeight.W700, style = FontStyle.Normal)
 
-        val FONT_700_ITALIC = Font(
-            resId = resourceId,
-            weight = FontWeight.W700,
-            style = FontStyle.Italic
-        )
+        val FONT_700_ITALIC =
+            Font(resId = resourceId, weight = FontWeight.W700, style = FontStyle.Italic)
 
-        val FONT_800_REGULAR = Font(
-            resId = resourceId,
-            weight = FontWeight.W800,
-            style = FontStyle.Normal
-        )
+        val FONT_800_REGULAR =
+            Font(resId = resourceId, weight = FontWeight.W800, style = FontStyle.Normal)
 
-        val FONT_800_ITALIC = Font(
-            resId = resourceId,
-            weight = FontWeight.W800,
-            style = FontStyle.Italic
-        )
+        val FONT_800_ITALIC =
+            Font(resId = resourceId, weight = FontWeight.W800, style = FontStyle.Italic)
 
-        val FONT_800_ITALIC_FALLBACK = Font(
-            resId = resourceId,
-            weight = FontWeight.W800,
-            style = FontStyle.Italic
-        )
+        val FONT_800_ITALIC_FALLBACK =
+            Font(resId = resourceId, weight = FontWeight.W800, style = FontStyle.Italic)
 
-        val FONT_900_REGULAR = Font(
-            resId = resourceId,
-            weight = FontWeight.W900,
-            style = FontStyle.Normal
-        )
+        val FONT_900_REGULAR =
+            Font(resId = resourceId, weight = FontWeight.W900, style = FontStyle.Normal)
 
-        val FONT_900_ITALIC = Font(
-            resId = resourceId,
-            weight = FontWeight.W900,
-            style = FontStyle.Italic
-        )
+        val FONT_900_ITALIC =
+            Font(resId = resourceId, weight = FontWeight.W900, style = FontStyle.Italic)
     }
 }
diff --git a/compose/ui/ui-text/src/androidUnitTest/kotlin/androidx/compose/ui/text/font/FontWeightTest.kt b/compose/ui/ui-text/src/androidUnitTest/kotlin/androidx/compose/ui/text/font/FontWeightTest.kt
index 0d0a4db..f7223e7 100644
--- a/compose/ui/ui-text/src/androidUnitTest/kotlin/androidx/compose/ui/text/font/FontWeightTest.kt
+++ b/compose/ui/ui-text/src/androidUnitTest/kotlin/androidx/compose/ui/text/font/FontWeightTest.kt
@@ -44,13 +44,7 @@
 
     @Test
     fun `lerp at start returns start value`() {
-        assertThat(
-            lerp(
-                FontWeight.W200,
-                FontWeight.W400,
-                0.0f
-            )
-        ).isEqualTo(FontWeight.W200)
+        assertThat(lerp(FontWeight.W200, FontWeight.W400, 0.0f)).isEqualTo(FontWeight.W200)
     }
 
     @Test
@@ -61,68 +55,53 @@
 
     @Test
     fun `lerp at end returns end value`() {
-        assertThat(
-            lerp(
-                FontWeight.W200,
-                FontWeight.W400,
-                1.0f
-            )
-        ).isEqualTo(FontWeight.W400)
+        assertThat(lerp(FontWeight.W200, FontWeight.W400, 1.0f)).isEqualTo(FontWeight.W400)
     }
 
     @Test
     fun `lerp in the mid-time`() {
-        assertThat(
-            lerp(
-                FontWeight.W200,
-                FontWeight.W800,
-                0.5f
-            )
-        ).isEqualTo(FontWeight.W500)
+        assertThat(lerp(FontWeight.W200, FontWeight.W800, 0.5f)).isEqualTo(FontWeight.W500)
     }
 
     @Test
     fun `lerp in the mid-time with odd distance should be rounded to up`() {
         val start = FontWeight.W200
         val stop = FontWeight.W900
-        assertThat(
-            lerp(
-                start,
-                stop,
-                0.5f
-            )
-        ).isEqualTo(FontWeight(((stop.weight + start.weight) * 0.5).toInt()))
+        assertThat(lerp(start, stop, 0.5f))
+            .isEqualTo(FontWeight(((stop.weight + start.weight) * 0.5).toInt()))
     }
 
     @Test
     fun `values return all weights`() {
-        val expectedValues = listOf(
-            FontWeight.W100,
-            FontWeight.W200,
-            FontWeight.W300,
-            FontWeight.W400,
-            FontWeight.W500,
-            FontWeight.W600,
-            FontWeight.W700,
-            FontWeight.W800,
-            FontWeight.W900
-        )
+        val expectedValues =
+            listOf(
+                FontWeight.W100,
+                FontWeight.W200,
+                FontWeight.W300,
+                FontWeight.W400,
+                FontWeight.W500,
+                FontWeight.W600,
+                FontWeight.W700,
+                FontWeight.W800,
+                FontWeight.W900
+            )
         assertThat(FontWeight.values).isEqualTo(expectedValues)
     }
 
     @Test
     fun `weight returns collect values`() {
-        val fontWeights = mapOf(
-            FontWeight.W100 to 100,
-            FontWeight.W200 to 200,
-            FontWeight.W300 to 300,
-            FontWeight.W400 to 400,
-            FontWeight.W500 to 500,
-            FontWeight.W600 to 600,
-            FontWeight.W700 to 700,
-            FontWeight.W800 to 800,
-            FontWeight.W900 to 900
-        )
+        val fontWeights =
+            mapOf(
+                FontWeight.W100 to 100,
+                FontWeight.W200 to 200,
+                FontWeight.W300 to 300,
+                FontWeight.W400 to 400,
+                FontWeight.W500 to 500,
+                FontWeight.W600 to 600,
+                FontWeight.W700 to 700,
+                FontWeight.W800 to 800,
+                FontWeight.W900 to 900
+            )
 
         // TODO(b/130795950): IR compiler bug was here
         for (weightPair in fontWeights) {
diff --git a/compose/ui/ui-text/src/androidUnitTest/kotlin/androidx/compose/ui/text/font/ResourceFontVariationSettingsTest.kt b/compose/ui/ui-text/src/androidUnitTest/kotlin/androidx/compose/ui/text/font/ResourceFontVariationSettingsTest.kt
index d38bcac..031b151 100644
--- a/compose/ui/ui-text/src/androidUnitTest/kotlin/androidx/compose/ui/text/font/ResourceFontVariationSettingsTest.kt
+++ b/compose/ui/ui-text/src/androidUnitTest/kotlin/androidx/compose/ui/text/font/ResourceFontVariationSettingsTest.kt
@@ -27,32 +27,33 @@
     @OptIn(ExperimentalTextApi::class)
     @Test
     fun resourceFont_acceptsVariationSettings() {
-        val resourceFont = ResourceFont(
-            -1,
-            FontWeight(100),
-            FontStyle.Italic,
-            variationSettings = FontVariation.Settings(FontVariation.grade(3))
-        )
-        assertThat(resourceFont.variationSettings.settings).containsExactly(
-            FontVariation.grade(3)
-        )
+        val resourceFont =
+            ResourceFont(
+                -1,
+                FontWeight(100),
+                FontStyle.Italic,
+                variationSettings = FontVariation.Settings(FontVariation.grade(3))
+            )
+        assertThat(resourceFont.variationSettings.settings).containsExactly(FontVariation.grade(3))
     }
 
     @OptIn(ExperimentalTextApi::class)
     @Test
     fun resourceFont_usesVariationSettingsInEquals() {
-        val resourceFont = ResourceFont(
-            -1,
-            FontWeight(100),
-            FontStyle.Italic,
-            variationSettings = FontVariation.Settings(FontVariation.grade(3))
-        )
-        val resourceFont2 = ResourceFont(
-            -1,
-            FontWeight(100),
-            FontStyle.Italic,
-            variationSettings = FontVariation.Settings(FontVariation.grade(4))
-        )
+        val resourceFont =
+            ResourceFont(
+                -1,
+                FontWeight(100),
+                FontStyle.Italic,
+                variationSettings = FontVariation.Settings(FontVariation.grade(3))
+            )
+        val resourceFont2 =
+            ResourceFont(
+                -1,
+                FontWeight(100),
+                FontStyle.Italic,
+                variationSettings = FontVariation.Settings(FontVariation.grade(4))
+            )
 
         assertThat(resourceFont).isNotEqualTo(resourceFont2)
     }
@@ -60,18 +61,20 @@
     @OptIn(ExperimentalTextApi::class)
     @Test
     fun resourceFont_usesVariationSettingsInHashCode() {
-        val resourceFont = ResourceFont(
-            -1,
-            FontWeight(100),
-            FontStyle.Italic,
-            variationSettings = FontVariation.Settings(FontVariation.grade(3))
-        )
-        val resourceFont2 = ResourceFont(
-            -1,
-            FontWeight(100),
-            FontStyle.Italic,
-            variationSettings = FontVariation.Settings(FontVariation.grade(4))
-        )
+        val resourceFont =
+            ResourceFont(
+                -1,
+                FontWeight(100),
+                FontStyle.Italic,
+                variationSettings = FontVariation.Settings(FontVariation.grade(3))
+            )
+        val resourceFont2 =
+            ResourceFont(
+                -1,
+                FontWeight(100),
+                FontStyle.Italic,
+                variationSettings = FontVariation.Settings(FontVariation.grade(4))
+            )
 
         assertThat(resourceFont.hashCode()).isNotEqualTo(resourceFont2.hashCode())
     }
diff --git a/compose/ui/ui-text/src/androidUnitTest/kotlin/androidx/compose/ui/text/input/DeleteSurroundingTextCommandTest.kt b/compose/ui/ui-text/src/androidUnitTest/kotlin/androidx/compose/ui/text/input/DeleteSurroundingTextCommandTest.kt
index bd134c2..1968bf0 100644
--- a/compose/ui/ui-text/src/androidUnitTest/kotlin/androidx/compose/ui/text/input/DeleteSurroundingTextCommandTest.kt
+++ b/compose/ui/ui-text/src/androidUnitTest/kotlin/androidx/compose/ui/text/input/DeleteSurroundingTextCommandTest.kt
@@ -222,17 +222,19 @@
 
     @Test
     fun throws_whenLengthBeforeInvalid() {
-        val error = assertFailsWith<IllegalArgumentException> {
-            DeleteSurroundingTextCommand(lengthBeforeCursor = -42, lengthAfterCursor = 0)
-        }
+        val error =
+            assertFailsWith<IllegalArgumentException> {
+                DeleteSurroundingTextCommand(lengthBeforeCursor = -42, lengthAfterCursor = 0)
+            }
         assertThat(error).hasMessageThat().contains("-42")
     }
 
     @Test
     fun throws_whenLengthAfterInvalid() {
-        val error = assertFailsWith<IllegalArgumentException> {
-            DeleteSurroundingTextCommand(lengthBeforeCursor = 0, lengthAfterCursor = -42)
-        }
+        val error =
+            assertFailsWith<IllegalArgumentException> {
+                DeleteSurroundingTextCommand(lengthBeforeCursor = 0, lengthAfterCursor = -42)
+            }
         assertThat(error).hasMessageThat().contains("-42")
     }
 
@@ -243,10 +245,8 @@
         val selection = TextRange(textAfterDelete.length)
         val eb = EditingBuffer(text, selection)
 
-        DeleteSurroundingTextCommand(
-            lengthBeforeCursor = 0,
-            lengthAfterCursor = Int.MAX_VALUE
-        ).applyTo(eb)
+        DeleteSurroundingTextCommand(lengthBeforeCursor = 0, lengthAfterCursor = Int.MAX_VALUE)
+            .applyTo(eb)
 
         assertThat(eb.toString()).isEqualTo(textAfterDelete)
         assertThat(eb.cursor).isEqualTo(textAfterDelete.length)
@@ -258,10 +258,8 @@
         val selection = TextRange(1)
         val eb = EditingBuffer(text, selection)
 
-        DeleteSurroundingTextCommand(
-            lengthBeforeCursor = Int.MAX_VALUE,
-            lengthAfterCursor = 0
-        ).applyTo(eb)
+        DeleteSurroundingTextCommand(lengthBeforeCursor = Int.MAX_VALUE, lengthAfterCursor = 0)
+            .applyTo(eb)
 
         assertThat(eb.toString()).isEqualTo("bcde")
         assertThat(eb.cursor).isEqualTo(0)
@@ -274,10 +272,8 @@
         val selection = TextRange(textAfterDelete.length)
         val eb = EditingBuffer(text, selection)
 
-        DeleteSurroundingTextCommand(
-            lengthBeforeCursor = 0,
-            lengthAfterCursor = Int.MAX_VALUE - 1
-        ).applyTo(eb)
+        DeleteSurroundingTextCommand(lengthBeforeCursor = 0, lengthAfterCursor = Int.MAX_VALUE - 1)
+            .applyTo(eb)
 
         assertThat(eb.toString()).isEqualTo(textAfterDelete)
         assertThat(eb.cursor).isEqualTo(textAfterDelete.length)
@@ -289,10 +285,8 @@
         val selection = TextRange(1)
         val eb = EditingBuffer(text, selection)
 
-        DeleteSurroundingTextCommand(
-            lengthBeforeCursor = Int.MAX_VALUE - 1,
-            lengthAfterCursor = 0
-        ).applyTo(eb)
+        DeleteSurroundingTextCommand(lengthBeforeCursor = Int.MAX_VALUE - 1, lengthAfterCursor = 0)
+            .applyTo(eb)
 
         assertThat(eb.toString()).isEqualTo("bcde")
         assertThat(eb.cursor).isEqualTo(0)
diff --git a/compose/ui/ui-text/src/androidUnitTest/kotlin/androidx/compose/ui/text/input/DeleteSurroundingTextInCodePointsCommandTest.kt b/compose/ui/ui-text/src/androidUnitTest/kotlin/androidx/compose/ui/text/input/DeleteSurroundingTextInCodePointsCommandTest.kt
index d9112a7..306656e 100644
--- a/compose/ui/ui-text/src/androidUnitTest/kotlin/androidx/compose/ui/text/input/DeleteSurroundingTextInCodePointsCommandTest.kt
+++ b/compose/ui/ui-text/src/androidUnitTest/kotlin/androidx/compose/ui/text/input/DeleteSurroundingTextInCodePointsCommandTest.kt
@@ -227,23 +227,25 @@
 
     @Test
     fun throws_whenLengthBeforeInvalid() {
-        val error = assertFailsWith<IllegalArgumentException> {
-            DeleteSurroundingTextInCodePointsCommand(
-                lengthBeforeCursor = -42,
-                lengthAfterCursor = 0
-            )
-        }
+        val error =
+            assertFailsWith<IllegalArgumentException> {
+                DeleteSurroundingTextInCodePointsCommand(
+                    lengthBeforeCursor = -42,
+                    lengthAfterCursor = 0
+                )
+            }
         assertThat(error).hasMessageThat().contains("-42")
     }
 
     @Test
     fun throws_whenLengthAfterInvalid() {
-        val error = assertFailsWith<IllegalArgumentException> {
-            DeleteSurroundingTextInCodePointsCommand(
-                lengthBeforeCursor = 0,
-                lengthAfterCursor = -42
-            )
-        }
+        val error =
+            assertFailsWith<IllegalArgumentException> {
+                DeleteSurroundingTextInCodePointsCommand(
+                    lengthBeforeCursor = 0,
+                    lengthAfterCursor = -42
+                )
+            }
         assertThat(error).hasMessageThat().contains("-42")
     }
 
@@ -255,9 +257,10 @@
         val eb = EditingBuffer(text, selection)
 
         DeleteSurroundingTextInCodePointsCommand(
-            lengthBeforeCursor = 0,
-            lengthAfterCursor = Int.MAX_VALUE
-        ).applyTo(eb)
+                lengthBeforeCursor = 0,
+                lengthAfterCursor = Int.MAX_VALUE
+            )
+            .applyTo(eb)
 
         assertThat(eb.toString()).isEqualTo(textAfterDelete)
         assertThat(eb.cursor).isEqualTo(textAfterDelete.length)
@@ -270,9 +273,10 @@
         val eb = EditingBuffer(text, selection)
 
         DeleteSurroundingTextInCodePointsCommand(
-            lengthBeforeCursor = Int.MAX_VALUE,
-            lengthAfterCursor = 0
-        ).applyTo(eb)
+                lengthBeforeCursor = Int.MAX_VALUE,
+                lengthAfterCursor = 0
+            )
+            .applyTo(eb)
 
         assertThat(eb.toString()).isEqualTo("bcde")
         assertThat(eb.cursor).isEqualTo(0)
@@ -285,9 +289,10 @@
         val eb = EditingBuffer(text, selection)
 
         DeleteSurroundingTextInCodePointsCommand(
-            lengthBeforeCursor = Int.MAX_VALUE,
-            lengthAfterCursor = Int.MAX_VALUE
-        ).applyTo(eb)
+                lengthBeforeCursor = Int.MAX_VALUE,
+                lengthAfterCursor = Int.MAX_VALUE
+            )
+            .applyTo(eb)
 
         assertThat(eb.toString()).isEqualTo("")
         assertThat(eb.cursor).isEqualTo(0)
@@ -300,9 +305,10 @@
         val eb = EditingBuffer(text, selection)
 
         DeleteSurroundingTextInCodePointsCommand(
-            lengthBeforeCursor = Int.MAX_VALUE,
-            lengthAfterCursor = Int.MAX_VALUE
-        ).applyTo(eb)
+                lengthBeforeCursor = Int.MAX_VALUE,
+                lengthAfterCursor = Int.MAX_VALUE
+            )
+            .applyTo(eb)
 
         assertThat(eb.toString()).isEqualTo("")
         assertThat(eb.cursor).isEqualTo(0)
@@ -316,9 +322,10 @@
         val eb = EditingBuffer(text, selection)
 
         DeleteSurroundingTextInCodePointsCommand(
-            lengthBeforeCursor = 0,
-            lengthAfterCursor = Int.MAX_VALUE - 1
-        ).applyTo(eb)
+                lengthBeforeCursor = 0,
+                lengthAfterCursor = Int.MAX_VALUE - 1
+            )
+            .applyTo(eb)
 
         assertThat(eb.toString()).isEqualTo(textAfterDelete)
         assertThat(eb.cursor).isEqualTo(textAfterDelete.length)
@@ -331,9 +338,10 @@
         val eb = EditingBuffer(text, selection)
 
         DeleteSurroundingTextInCodePointsCommand(
-            lengthBeforeCursor = Int.MAX_VALUE - 1,
-            lengthAfterCursor = 0
-        ).applyTo(eb)
+                lengthBeforeCursor = Int.MAX_VALUE - 1,
+                lengthAfterCursor = 0
+            )
+            .applyTo(eb)
 
         assertThat(eb.toString()).isEqualTo("bcde")
         assertThat(eb.cursor).isEqualTo(0)
diff --git a/compose/ui/ui-text/src/androidUnitTest/kotlin/androidx/compose/ui/text/input/EditProcessorTest.kt b/compose/ui/ui-text/src/androidUnitTest/kotlin/androidx/compose/ui/text/input/EditProcessorTest.kt
index b27f911..fb8d909 100644
--- a/compose/ui/ui-text/src/androidUnitTest/kotlin/androidx/compose/ui/text/input/EditProcessorTest.kt
+++ b/compose/ui/ui-text/src/androidUnitTest/kotlin/androidx/compose/ui/text/input/EditProcessorTest.kt
@@ -45,10 +45,7 @@
 
         assertThat(proc.mBufferState).isEqualTo(model)
         val captor = argumentCaptor<TextFieldValue>()
-        verify(tis, times(1)).updateState(
-            eq(TextFieldValue("", TextRange.Zero)),
-            captor.capture()
-        )
+        verify(tis, times(1)).updateState(eq(TextFieldValue("", TextRange.Zero)), captor.capture())
         assertThat(captor.allValues.size).isEqualTo(1)
         assertThat(captor.firstValue.text).isEqualTo("ABCDE")
         assertThat(captor.firstValue.selection.min).isEqualTo(0)
@@ -56,11 +53,7 @@
 
         reset(tis)
 
-        val newState = proc.apply(
-            listOf(
-                CommitTextCommand("X", 1)
-            )
-        )
+        val newState = proc.apply(listOf(CommitTextCommand("X", 1)))
 
         assertThat(newState.text).isEqualTo("XABCDE")
         assertThat(newState.selection.min).isEqualTo(1)
@@ -75,17 +68,11 @@
         val textInputSession = mock<TextInputSession>()
 
         val initialBuffer = processor.mBuffer
-        processor.reset(
-            TextFieldValue("qwerty", TextRange.Zero, TextRange.Zero),
-            textInputSession
-        )
+        processor.reset(TextFieldValue("qwerty", TextRange.Zero, TextRange.Zero), textInputSession)
         assertThat(processor.mBuffer).isNotEqualTo(initialBuffer)
 
         val updatedBuffer = processor.mBuffer
-        processor.reset(
-            TextFieldValue("qwerty", TextRange.Zero, TextRange.Zero),
-            textInputSession
-        )
+        processor.reset(TextFieldValue("qwerty", TextRange.Zero, TextRange.Zero), textInputSession)
         assertThat(processor.mBuffer).isEqualTo(updatedBuffer)
     }
 
@@ -95,17 +82,11 @@
         val textInputSession = mock<TextInputSession>()
 
         val textFieldValue = TextFieldValue("qwerty", TextRange.Zero, TextRange.Zero)
-        processor.reset(
-            textFieldValue,
-            textInputSession
-        )
+        processor.reset(textFieldValue, textInputSession)
         val initialBuffer = processor.mBuffer
 
         val newTextFieldValue = textFieldValue.copy("abc")
-        processor.reset(
-            newTextFieldValue,
-            textInputSession
-        )
+        processor.reset(newTextFieldValue, textInputSession)
 
         assertThat(processor.mBuffer).isNotEqualTo(initialBuffer)
     }
@@ -115,17 +96,11 @@
         val processor = EditProcessor()
         val textInputSession = mock<TextInputSession>()
         val textFieldValue = TextFieldValue("qwerty", TextRange.Zero, TextRange.Zero)
-        processor.reset(
-            textFieldValue,
-            textInputSession
-        )
+        processor.reset(textFieldValue, textInputSession)
         val initialBuffer = processor.mBuffer
 
         val newTextFieldValue = textFieldValue.copy(selection = TextRange(1))
-        processor.reset(
-            newTextFieldValue,
-            textInputSession
-        )
+        processor.reset(newTextFieldValue, textInputSession)
 
         assertThat(processor.mBuffer).isEqualTo(initialBuffer)
         assertThat(newTextFieldValue.selection.start).isEqualTo(processor.mBuffer.selectionStart)
@@ -137,10 +112,7 @@
         val processor = EditProcessor()
         val textInputSeson = mock<TextInputSession>()
         val textFieldValue = TextFieldValue("qwerty", TextRange.Zero, TextRange(1))
-        processor.reset(
-            textFieldValue,
-            textInputSeson
-        )
+        processor.reset(textFieldValue, textInputSeson)
         val initialBuffer = processor.mBuffer
 
         // composition can not be set from app, IME owns it.
@@ -148,10 +120,7 @@
         assertThat(EditingBuffer.NOWHERE).isEqualTo(initialBuffer.compositionEnd)
 
         val newTextFieldValue = textFieldValue.copy(composition = null)
-        processor.reset(
-            newTextFieldValue,
-            textInputSeson
-        )
+        processor.reset(newTextFieldValue, textInputSeson)
 
         assertThat(processor.mBuffer).isEqualTo(initialBuffer)
         assertThat(EditingBuffer.NOWHERE).isEqualTo(processor.mBuffer.compositionStart)
@@ -166,10 +135,7 @@
         val textFieldValue = TextFieldValue("qwerty", initialSelection, TextRange(1))
 
         // set the initial selection to be reversed
-        processor.reset(
-            textFieldValue,
-            textInputSession
-        )
+        processor.reset(textFieldValue, textInputSession)
         val initialBuffer = processor.mBuffer
 
         assertThat(initialSelection.min).isEqualTo(initialBuffer.selectionStart)
@@ -178,10 +144,7 @@
         val updatedSelection = TextRange(3, 0)
         val newTextFieldValue = textFieldValue.copy(selection = updatedSelection)
         // set the new selection
-        processor.reset(
-            newTextFieldValue,
-            textInputSession
-        )
+        processor.reset(newTextFieldValue, textInputSession)
 
         assertThat(processor.mBuffer).isEqualTo(initialBuffer)
         assertThat(updatedSelection.min).isEqualTo(initialBuffer.selectionStart)
@@ -194,12 +157,7 @@
         val textInputSession = mock<TextInputSession>()
 
         // set the initial value
-        processor.apply(
-            listOf(
-                CommitTextCommand("ab", 0),
-                SetComposingRegionCommand(0, 2)
-            )
-        )
+        processor.apply(listOf(CommitTextCommand("ab", 0), SetComposingRegionCommand(0, 2)))
 
         // change the text
         val newValue = processor.mBufferState.copy(text = "cd")
@@ -237,12 +195,7 @@
         val textInputSession = mock<TextInputSession>()
 
         // set the initial value
-        processor.apply(
-            listOf(
-                CommitTextCommand("ab", 0),
-                SetComposingRegionCommand(-1, -1)
-            )
-        )
+        processor.apply(listOf(CommitTextCommand("ab", 0), SetComposingRegionCommand(-1, -1)))
 
         // change the composition
         val newValue = processor.mBufferState.copy(composition = TextRange(0, 2))
@@ -258,12 +211,7 @@
         val textInputSession = mock<TextInputSession>()
 
         // set the initial value
-        processor.apply(
-            listOf(
-                CommitTextCommand("ab", 0),
-                SetComposingRegionCommand(0, 2)
-            )
-        )
+        processor.apply(listOf(CommitTextCommand("ab", 0), SetComposingRegionCommand(0, 2)))
 
         // change the composition
         val newValue = processor.mBufferState.copy(composition = TextRange(0, 1))
@@ -307,28 +255,30 @@
             }
         }
 
-        val processor = EditProcessor().apply {
-            mBuffer.replace(0, 0, "hello world")
-            mBuffer.setSelection(0, 5)
-            mBuffer.setComposition(5, 7)
-        }
-        val batch = listOf(
-            CommitTextCommand("ab", 0),
-            InvalidCommand(),
-            SetSelectionCommand(0, 2),
-        )
+        val processor =
+            EditProcessor().apply {
+                mBuffer.replace(0, 0, "hello world")
+                mBuffer.setSelection(0, 5)
+                mBuffer.setComposition(5, 7)
+            }
+        val batch =
+            listOf(
+                CommitTextCommand("ab", 0),
+                InvalidCommand(),
+                SetSelectionCommand(0, 2),
+            )
 
-        val error = assertFailsWith<RuntimeException> {
-            processor.apply(batch)
-        }
+        val error = assertFailsWith<RuntimeException> { processor.apply(batch) }
 
-        assertThat(error).hasMessageThat().isEqualTo(
-            "Error while applying EditCommand batch to buffer " +
-                "(length=11, composition=null, selection=TextRange(5, 5)):\n" +
-                "   CommitTextCommand(text.length=2, newCursorPosition=0)\n" +
-                " > Unknown EditCommand: InvalidCommand\n" +
-                "   SetSelectionCommand(start=0, end=2)"
-        )
+        assertThat(error)
+            .hasMessageThat()
+            .isEqualTo(
+                "Error while applying EditCommand batch to buffer " +
+                    "(length=11, composition=null, selection=TextRange(5, 5)):\n" +
+                    "   CommitTextCommand(text.length=2, newCursorPosition=0)\n" +
+                    " > Unknown EditCommand: InvalidCommand\n" +
+                    "   SetSelectionCommand(start=0, end=2)"
+            )
         assertThat(error).hasCauseThat().hasMessageThat().isEqualTo("Better luck next time")
     }
 }
diff --git a/compose/ui/ui-text/src/androidUnitTest/kotlin/androidx/compose/ui/text/input/EditingBufferTest.kt b/compose/ui/ui-text/src/androidUnitTest/kotlin/androidx/compose/ui/text/input/EditingBufferTest.kt
index 56c8497..7fb6f46 100644
--- a/compose/ui/ui-text/src/androidUnitTest/kotlin/androidx/compose/ui/text/input/EditingBufferTest.kt
+++ b/compose/ui/ui-text/src/androidUnitTest/kotlin/androidx/compose/ui/text/input/EditingBufferTest.kt
@@ -137,20 +137,18 @@
         assertThat(eb.compositionEnd).isEqualTo(-1)
     }
 
-    @Test fun setSelection_throws_whenNegativeStart() {
+    @Test
+    fun setSelection_throws_whenNegativeStart() {
         val eb = EditingBuffer("ABCDE", TextRange.Zero)
 
-        assertFailsWith<IndexOutOfBoundsException> {
-            eb.setSelection(-1, 0)
-        }
+        assertFailsWith<IndexOutOfBoundsException> { eb.setSelection(-1, 0) }
     }
 
-    @Test fun setSelection_throws_whenNegativeEnd() {
+    @Test
+    fun setSelection_throws_whenNegativeEnd() {
         val eb = EditingBuffer("ABCDE", TextRange.Zero)
 
-        assertFailsWith<IndexOutOfBoundsException> {
-            eb.setSelection(0, -1)
-        }
+        assertFailsWith<IndexOutOfBoundsException> { eb.setSelection(0, -1) }
     }
 
     @Test
diff --git a/compose/ui/ui-text/src/androidUnitTest/kotlin/androidx/compose/ui/text/input/GapBufferTest.kt b/compose/ui/ui-text/src/androidUnitTest/kotlin/androidx/compose/ui/text/input/GapBufferTest.kt
index e3ac749..ecbe79b 100644
--- a/compose/ui/ui-text/src/androidUnitTest/kotlin/androidx/compose/ui/text/input/GapBufferTest.kt
+++ b/compose/ui/ui-text/src/androidUnitTest/kotlin/androidx/compose/ui/text/input/GapBufferTest.kt
@@ -31,545 +31,488 @@
 
     @Test
     fun insertTest_insert_to_empty_string() {
-        assertThat(
-            PartialGapBuffer("").apply {
-                replace(0, 0, "A")
-            }
-        ).hasChars("A")
+        assertThat(PartialGapBuffer("").apply { replace(0, 0, "A") }).hasChars("A")
     }
 
     @Test
     fun insertTest_insert_and_append() {
         assertThat(
-            PartialGapBuffer("").apply {
-                replace(0, 0, "A")
-                replace(0, 0, "B")
-            }
-        ).hasChars("BA")
+                PartialGapBuffer("").apply {
+                    replace(0, 0, "A")
+                    replace(0, 0, "B")
+                }
+            )
+            .hasChars("BA")
     }
 
     @Test
     fun insertTest_insert_and_prepend() {
         assertThat(
-            PartialGapBuffer("").apply {
-                replace(0, 0, "A")
-                replace(1, 1, "B")
-            }
-        ).hasChars("AB")
+                PartialGapBuffer("").apply {
+                    replace(0, 0, "A")
+                    replace(1, 1, "B")
+                }
+            )
+            .hasChars("AB")
     }
 
     @Test
     fun insertTest_insert_and_insert_into_middle() {
         assertThat(
-            PartialGapBuffer("").apply {
-                replace(0, 0, "AA")
-                replace(1, 1, "B")
-            }
-        ).hasChars("ABA")
+                PartialGapBuffer("").apply {
+                    replace(0, 0, "AA")
+                    replace(1, 1, "B")
+                }
+            )
+            .hasChars("ABA")
     }
 
     @Test
     fun insertTest_intoExistingText_prepend() {
-        assertThat(
-            PartialGapBuffer("XX").apply {
-                replace(0, 0, "A")
-            }
-        ).hasChars("AXX")
+        assertThat(PartialGapBuffer("XX").apply { replace(0, 0, "A") }).hasChars("AXX")
     }
 
     @Test
     fun insertTest_intoExistingText_insert_into_middle() {
-        assertThat(
-            PartialGapBuffer("XX").apply {
-                replace(1, 1, "A")
-            }
-        ).hasChars("XAX")
+        assertThat(PartialGapBuffer("XX").apply { replace(1, 1, "A") }).hasChars("XAX")
     }
 
     @Test
     fun insertTest_intoExistingText_append() {
-        assertThat(
-            PartialGapBuffer("XX").apply {
-                replace(2, 2, "A")
-            }
-        ).hasChars("XXA")
+        assertThat(PartialGapBuffer("XX").apply { replace(2, 2, "A") }).hasChars("XXA")
     }
 
     @Test
     fun insertTest_intoExistingText_prepend_and_prepend() {
         assertThat(
-            PartialGapBuffer("XX").apply {
-                replace(0, 0, "A")
-                replace(0, 0, "B")
-            }
-        ).hasChars("BAXX")
+                PartialGapBuffer("XX").apply {
+                    replace(0, 0, "A")
+                    replace(0, 0, "B")
+                }
+            )
+            .hasChars("BAXX")
     }
 
     @Test
     fun insertTest_intoExistingText_prepend_and_append() {
         assertThat(
-            PartialGapBuffer("XX").apply {
-                replace(0, 0, "A")
-                replace(1, 1, "B")
-            }
-        ).hasChars("ABXX")
+                PartialGapBuffer("XX").apply {
+                    replace(0, 0, "A")
+                    replace(1, 1, "B")
+                }
+            )
+            .hasChars("ABXX")
     }
 
     @Test
     fun insertTest_intoExistingText_prepend_and_insert_middle() {
         assertThat(
-            PartialGapBuffer("XX").apply {
-                replace(0, 0, "A")
-                replace(2, 2, "B")
-            }
-        ).hasChars("AXBX")
+                PartialGapBuffer("XX").apply {
+                    replace(0, 0, "A")
+                    replace(2, 2, "B")
+                }
+            )
+            .hasChars("AXBX")
     }
 
     @Test
     fun insertTest_intoExistingText_insert_two_chars_and_append() {
         assertThat(
-            PartialGapBuffer("XX").apply {
-                replace(0, 0, "AA")
-                replace(1, 1, "B")
-            }
-        ).hasChars("ABAXX")
+                PartialGapBuffer("XX").apply {
+                    replace(0, 0, "AA")
+                    replace(1, 1, "B")
+                }
+            )
+            .hasChars("ABAXX")
     }
 
     @Test
     fun deleteTest_insert_and_delete_from_head() {
         assertThat(
-            PartialGapBuffer("").apply {
-                replace(0, 0, "ABC")
-                replace(0, 1, "")
-            }
-        ).hasChars("BC")
+                PartialGapBuffer("").apply {
+                    replace(0, 0, "ABC")
+                    replace(0, 1, "")
+                }
+            )
+            .hasChars("BC")
     }
 
     @Test
     fun deleteTest_insert_and_delete_middle() {
         assertThat(
-            PartialGapBuffer("").apply {
-                replace(0, 0, "ABC")
-                replace(1, 2, "")
-            }
-        ).hasChars("AC")
+                PartialGapBuffer("").apply {
+                    replace(0, 0, "ABC")
+                    replace(1, 2, "")
+                }
+            )
+            .hasChars("AC")
     }
 
     @Test
     fun deleteTest_insert_and_delete_tail() {
         assertThat(
-            PartialGapBuffer("").apply {
-                replace(0, 0, "ABC")
-                replace(2, 3, "")
-            }
-        ).hasChars("AB")
+                PartialGapBuffer("").apply {
+                    replace(0, 0, "ABC")
+                    replace(2, 3, "")
+                }
+            )
+            .hasChars("AB")
     }
 
     @Test
     fun deleteTest_insert_and_delete_two_head() {
         assertThat(
-            PartialGapBuffer("").apply {
-                replace(0, 0, "ABC")
-                replace(0, 2, "")
-            }
-        ).hasChars("C")
+                PartialGapBuffer("").apply {
+                    replace(0, 0, "ABC")
+                    replace(0, 2, "")
+                }
+            )
+            .hasChars("C")
     }
 
     @Test
     fun deleteTest_insert_and_delete_two_tail() {
         assertThat(
-            PartialGapBuffer("").apply {
-                replace(0, 0, "ABC")
-                replace(1, 3, "")
-            }
-        ).hasChars("A")
+                PartialGapBuffer("").apply {
+                    replace(0, 0, "ABC")
+                    replace(1, 3, "")
+                }
+            )
+            .hasChars("A")
     }
 
     @Test
     fun deleteTest_insert_and_delete_with_two_instruction_from_haed() {
         assertThat(
-            PartialGapBuffer("").apply {
-                replace(0, 0, "ABC")
-                replace(0, 1, "")
-                replace(0, 1, "")
-            }
-        ).hasChars("C")
+                PartialGapBuffer("").apply {
+                    replace(0, 0, "ABC")
+                    replace(0, 1, "")
+                    replace(0, 1, "")
+                }
+            )
+            .hasChars("C")
     }
 
     @Test
     fun deleteTest_insert_and_delet_with_two_instruction_from_head_and_tail() {
         assertThat(
-            PartialGapBuffer("").apply {
-                replace(0, 0, "ABC")
-                replace(0, 1, "")
-                replace(1, 2, "")
-            }
-        ).hasChars("B")
+                PartialGapBuffer("").apply {
+                    replace(0, 0, "ABC")
+                    replace(0, 1, "")
+                    replace(1, 2, "")
+                }
+            )
+            .hasChars("B")
     }
 
     @Test
     fun deleteTest_insert_and_delet_with_two_instruction_from_tail() {
         assertThat(
-            PartialGapBuffer("").apply {
-                replace(0, 0, "ABC")
-                replace(1, 2, "")
-                replace(1, 2, "")
-            }
-        ).hasChars("A")
+                PartialGapBuffer("").apply {
+                    replace(0, 0, "ABC")
+                    replace(1, 2, "")
+                    replace(1, 2, "")
+                }
+            )
+            .hasChars("A")
     }
 
     @Test
     fun deleteTest_insert_and_delete_three_chars() {
         assertThat(
-            PartialGapBuffer("").apply {
-                replace(0, 0, "ABC")
-                replace(0, 3, "")
-            }
-        ).hasChars("")
+                PartialGapBuffer("").apply {
+                    replace(0, 0, "ABC")
+                    replace(0, 3, "")
+                }
+            )
+            .hasChars("")
     }
 
     @Test
     fun deleteTest_insert_and_delete_three_chars_with_three_instructions() {
         assertThat(
-            PartialGapBuffer("").apply {
-                replace(0, 0, "ABC")
-                replace(0, 1, "")
-                replace(0, 1, "")
-                replace(0, 1, "")
-            }
-        ).hasChars("")
+                PartialGapBuffer("").apply {
+                    replace(0, 0, "ABC")
+                    replace(0, 1, "")
+                    replace(0, 1, "")
+                    replace(0, 1, "")
+                }
+            )
+            .hasChars("")
     }
 
     @Test
     fun deleteTest_fromExistingText_from_head() {
-        assertThat(
-            PartialGapBuffer("ABC").apply {
-                replace(0, 1, "")
-            }
-        ).hasChars("BC")
+        assertThat(PartialGapBuffer("ABC").apply { replace(0, 1, "") }).hasChars("BC")
     }
 
     @Test
     fun deleteTest_fromExistingText_from_middle() {
-        assertThat(
-            PartialGapBuffer("ABC").apply {
-                replace(1, 2, "")
-            }
-        ).hasChars("AC")
+        assertThat(PartialGapBuffer("ABC").apply { replace(1, 2, "") }).hasChars("AC")
     }
 
     @Test
     fun deleteTest_fromExistingText_from_tail() {
-        assertThat(
-            PartialGapBuffer("ABC").apply {
-                replace(2, 3, "")
-            }
-        ).hasChars("AB")
+        assertThat(PartialGapBuffer("ABC").apply { replace(2, 3, "") }).hasChars("AB")
     }
 
     @Test
     fun deleteTest_fromExistingText_delete_two_chars_from_head() {
-        assertThat(
-            PartialGapBuffer("ABC").apply {
-                replace(0, 2, "")
-            }
-        ).hasChars("C")
+        assertThat(PartialGapBuffer("ABC").apply { replace(0, 2, "") }).hasChars("C")
     }
 
     @Test
     fun deleteTest_fromExistingText_delete_two_chars_from_tail() {
-        assertThat(
-            PartialGapBuffer("ABC").apply {
-                replace(1, 3, "")
-            }
-        ).hasChars("A")
+        assertThat(PartialGapBuffer("ABC").apply { replace(1, 3, "") }).hasChars("A")
     }
 
     @Test
     fun deleteTest_fromExistingText_delete_two_chars_with_two_instruction_from_head() {
         assertThat(
-            PartialGapBuffer("ABC").apply {
-                replace(0, 1, "")
-                replace(0, 1, "")
-            }
-        ).hasChars("C")
+                PartialGapBuffer("ABC").apply {
+                    replace(0, 1, "")
+                    replace(0, 1, "")
+                }
+            )
+            .hasChars("C")
     }
 
     @Test
     fun deleteTest_fromExistingText_delete_two_chars_with_two_instruction_from_head_and_tail() {
         assertThat(
-            PartialGapBuffer("ABC").apply {
-                replace(0, 1, "")
-                replace(1, 2, "")
-            }
-        ).hasChars("B")
+                PartialGapBuffer("ABC").apply {
+                    replace(0, 1, "")
+                    replace(1, 2, "")
+                }
+            )
+            .hasChars("B")
     }
 
     @Test
     fun deleteTest_fromExistingText_delete_two_chars_with_two_instruction_from_tail() {
         assertThat(
-            PartialGapBuffer("ABC").apply {
-                replace(1, 2, "")
-                replace(1, 2, "")
-            }
-        ).hasChars("A")
+                PartialGapBuffer("ABC").apply {
+                    replace(1, 2, "")
+                    replace(1, 2, "")
+                }
+            )
+            .hasChars("A")
     }
 
     @Test
     fun deleteTest_fromExistingText_delete_three_chars() {
-        assertThat(
-            PartialGapBuffer("ABC").apply {
-                replace(0, 3, "")
-            }
-        ).hasChars("")
+        assertThat(PartialGapBuffer("ABC").apply { replace(0, 3, "") }).hasChars("")
     }
 
     @Test
     fun deleteTest_fromExistingText_delete_three_chars_with_three_instructions() {
         assertThat(
-            PartialGapBuffer("ABC").apply {
-                replace(0, 1, "")
-                replace(0, 1, "")
-                replace(0, 1, "")
-            }
-        ).hasChars("")
+                PartialGapBuffer("ABC").apply {
+                    replace(0, 1, "")
+                    replace(0, 1, "")
+                    replace(0, 1, "")
+                }
+            )
+            .hasChars("")
     }
 
     @Test
     fun replaceTest_head() {
         assertThat(
-            PartialGapBuffer("").apply {
-                replace(0, 0, "ABC")
-                replace(0, 1, "X")
-            }
-        ).hasChars("XBC")
+                PartialGapBuffer("").apply {
+                    replace(0, 0, "ABC")
+                    replace(0, 1, "X")
+                }
+            )
+            .hasChars("XBC")
     }
 
     @Test
     fun replaceTest_middle() {
         assertThat(
-            PartialGapBuffer("").apply {
-                replace(0, 0, "ABC")
-                replace(1, 2, "X")
-            }
-        ).hasChars("AXC")
+                PartialGapBuffer("").apply {
+                    replace(0, 0, "ABC")
+                    replace(1, 2, "X")
+                }
+            )
+            .hasChars("AXC")
     }
 
     @Test
     fun replaceTest_tail() {
         assertThat(
-            PartialGapBuffer("").apply {
-                replace(0, 0, "ABC")
-                replace(2, 3, "X")
-            }
-        ).hasChars("ABX")
+                PartialGapBuffer("").apply {
+                    replace(0, 0, "ABC")
+                    replace(2, 3, "X")
+                }
+            )
+            .hasChars("ABX")
     }
 
     @Test
     fun replaceTest_head_two_chars() {
         assertThat(
-            PartialGapBuffer("").apply {
-                replace(0, 0, "ABC")
-                replace(0, 2, "X")
-            }
-        ).hasChars("XC")
+                PartialGapBuffer("").apply {
+                    replace(0, 0, "ABC")
+                    replace(0, 2, "X")
+                }
+            )
+            .hasChars("XC")
     }
 
     @Test
     fun replaceTest_middle_two_chars() {
         assertThat(
-            PartialGapBuffer("").apply {
-                replace(0, 0, "ABC")
-                replace(1, 3, "X")
-            }
-        ).hasChars("AX")
+                PartialGapBuffer("").apply {
+                    replace(0, 0, "ABC")
+                    replace(1, 3, "X")
+                }
+            )
+            .hasChars("AX")
     }
 
     @Test
     fun replaceTest_three_chars() {
         assertThat(
-            PartialGapBuffer("").apply {
-                replace(0, 0, "ABC")
-                replace(0, 3, "X")
-            }
-        ).hasChars("X")
+                PartialGapBuffer("").apply {
+                    replace(0, 0, "ABC")
+                    replace(0, 3, "X")
+                }
+            )
+            .hasChars("X")
     }
 
     @Test
     fun replaceTest_one_char_with_two_chars_from_head() {
         assertThat(
-            PartialGapBuffer("").apply {
-                replace(0, 0, "ABC")
-                replace(0, 1, "XY")
-            }
-        ).hasChars("XYBC")
+                PartialGapBuffer("").apply {
+                    replace(0, 0, "ABC")
+                    replace(0, 1, "XY")
+                }
+            )
+            .hasChars("XYBC")
     }
 
     @Test
     fun replaceTest_one_char_with_two_chars_from_middle() {
         assertThat(
-            PartialGapBuffer("").apply {
-                replace(0, 0, "ABC")
-                replace(1, 2, "XY")
-            }
-        ).hasChars("AXYC")
+                PartialGapBuffer("").apply {
+                    replace(0, 0, "ABC")
+                    replace(1, 2, "XY")
+                }
+            )
+            .hasChars("AXYC")
     }
 
     @Test
     fun replaceTest_one_char_with_two_chars_from_tail() {
         assertThat(
-            PartialGapBuffer("").apply {
-                replace(0, 0, "ABC")
-                replace(2, 3, "XY")
-            }
-        ).hasChars("ABXY")
+                PartialGapBuffer("").apply {
+                    replace(0, 0, "ABC")
+                    replace(2, 3, "XY")
+                }
+            )
+            .hasChars("ABXY")
     }
 
     @Test
     fun replaceTest_two_chars_with_two_chars_from_head() {
         assertThat(
-            PartialGapBuffer("").apply {
-                replace(0, 0, "ABC")
-                replace(0, 2, "XY")
-            }
-        ).hasChars("XYC")
+                PartialGapBuffer("").apply {
+                    replace(0, 0, "ABC")
+                    replace(0, 2, "XY")
+                }
+            )
+            .hasChars("XYC")
     }
 
     @Test
     fun replaceTest_two_chars_with_two_chars_from_tail() {
         assertThat(
-            PartialGapBuffer("").apply {
-                replace(0, 0, "ABC")
-                replace(1, 3, "XY")
-            }
-        ).hasChars("AXY")
+                PartialGapBuffer("").apply {
+                    replace(0, 0, "ABC")
+                    replace(1, 3, "XY")
+                }
+            )
+            .hasChars("AXY")
     }
 
     @Test
     fun replaceTest_three_chars_with_two_char() {
         assertThat(
-            PartialGapBuffer("").apply {
-                replace(0, 0, "ABC")
-                replace(0, 3, "XY")
-            }
-        ).hasChars("XY")
+                PartialGapBuffer("").apply {
+                    replace(0, 0, "ABC")
+                    replace(0, 3, "XY")
+                }
+            )
+            .hasChars("XY")
     }
 
     @Test
     fun replaceTest_fromExistingText_head() {
-        assertThat(
-            PartialGapBuffer("ABC").apply {
-                replace(0, 1, "X")
-            }
-        ).hasChars("XBC")
+        assertThat(PartialGapBuffer("ABC").apply { replace(0, 1, "X") }).hasChars("XBC")
     }
 
     @Test
     fun replaceTest_fromExistingText_middle() {
-        assertThat(
-            PartialGapBuffer("ABC").apply {
-                replace(1, 2, "X")
-            }
-        ).hasChars("AXC")
+        assertThat(PartialGapBuffer("ABC").apply { replace(1, 2, "X") }).hasChars("AXC")
     }
 
     @Test
     fun replaceTest_fromExistingText_tail() {
-        assertThat(
-            PartialGapBuffer("ABC").apply {
-                replace(2, 3, "X")
-            }
-        ).hasChars("ABX")
+        assertThat(PartialGapBuffer("ABC").apply { replace(2, 3, "X") }).hasChars("ABX")
     }
 
     @Test
     fun replaceTest_fromExistingText_two_chars_with_one_char_from_head() {
-        assertThat(
-            PartialGapBuffer("ABC").apply {
-                replace(0, 2, "X")
-            }
-        ).hasChars("XC")
+        assertThat(PartialGapBuffer("ABC").apply { replace(0, 2, "X") }).hasChars("XC")
     }
 
     @Test
     fun replaceTest_fromExistingText_two_chars_with_one_char_from_tail() {
-        assertThat(
-            PartialGapBuffer("ABC").apply {
-                replace(1, 3, "X")
-            }
-        ).hasChars("AX")
+        assertThat(PartialGapBuffer("ABC").apply { replace(1, 3, "X") }).hasChars("AX")
     }
 
     @Test
     fun replaceTest_fromExistingText_three_chars() {
-        assertThat(
-            PartialGapBuffer("ABC").apply {
-                replace(0, 3, "X")
-            }
-        ).hasChars("X")
+        assertThat(PartialGapBuffer("ABC").apply { replace(0, 3, "X") }).hasChars("X")
     }
 
     @Test
     fun replaceTest_fromExistingText_one_char_with_two_chars_from_head() {
-        assertThat(
-            PartialGapBuffer("ABC").apply {
-                replace(0, 1, "XY")
-            }
-        ).hasChars("XYBC")
+        assertThat(PartialGapBuffer("ABC").apply { replace(0, 1, "XY") }).hasChars("XYBC")
     }
 
     @Test
     fun replaceTest_fromExistingText_one_char_with_two_chars_from_middle() {
-        assertThat(
-            PartialGapBuffer("ABC").apply {
-                replace(1, 2, "XY")
-            }
-        ).hasChars("AXYC")
+        assertThat(PartialGapBuffer("ABC").apply { replace(1, 2, "XY") }).hasChars("AXYC")
     }
 
     @Test
     fun replaceTest_fromExistingText_one_char_with_two_chars_from_tail() {
-        assertThat(
-            PartialGapBuffer("ABC").apply {
-                replace(2, 3, "XY")
-            }
-        ).hasChars("ABXY")
+        assertThat(PartialGapBuffer("ABC").apply { replace(2, 3, "XY") }).hasChars("ABXY")
     }
 
     @Test
     fun replaceTest_fromExistingText_two_chars_with_two_chars_from_head() {
-        assertThat(
-            PartialGapBuffer("ABC").apply {
-                replace(0, 2, "XY")
-            }
-        ).hasChars("XYC")
+        assertThat(PartialGapBuffer("ABC").apply { replace(0, 2, "XY") }).hasChars("XYC")
     }
 
     @Test
     fun replaceTest_fromExistingText_two_chars_with_two_chars_from_tail() {
-        assertThat(
-            PartialGapBuffer("ABC").apply {
-                replace(1, 3, "XY")
-            }
-        ).hasChars("AXY")
+        assertThat(PartialGapBuffer("ABC").apply { replace(1, 3, "XY") }).hasChars("AXY")
     }
 
     @Test
     fun replaceTest_fromExistingText_three_chars_with_three_chars() {
-        assertThat(
-            PartialGapBuffer("ABC").apply {
-                replace(0, 3, "XY")
-            }
-        ).hasChars("XY")
+        assertThat(PartialGapBuffer("ABC").apply { replace(0, 3, "XY") }).hasChars("XY")
     }
 
     @Test
     fun replace_throws_whenStartGreaterThanEnd() {
         val buffer = PartialGapBuffer("ABCD")
 
-        val error = assertFailsWith<IllegalArgumentException> {
-            buffer.replace(3, 2, "")
-        }
+        val error = assertFailsWith<IllegalArgumentException> { buffer.replace(3, 2, "") }
         assertThat(error).hasMessageThat().contains("3 > 2")
     }
 
@@ -577,9 +520,7 @@
     fun replace_throws_whenStartNegative() {
         val buffer = PartialGapBuffer("ABCD")
 
-        val error = assertFailsWith<IllegalArgumentException> {
-            buffer.replace(-1, 2, "XY")
-        }
+        val error = assertFailsWith<IllegalArgumentException> { buffer.replace(-1, 2, "XY") }
         assertThat(error).hasMessageThat().contains("-1")
     }
 
diff --git a/compose/ui/ui-text/src/androidUnitTest/kotlin/androidx/compose/ui/text/input/TextFieldValueTest.kt b/compose/ui/ui-text/src/androidUnitTest/kotlin/androidx/compose/ui/text/input/TextFieldValueTest.kt
index 795f007..75cb717 100644
--- a/compose/ui/ui-text/src/androidUnitTest/kotlin/androidx/compose/ui/text/input/TextFieldValueTest.kt
+++ b/compose/ui/ui-text/src/androidUnitTest/kotlin/androidx/compose/ui/text/input/TextFieldValueTest.kt
@@ -105,66 +105,53 @@
 
     @Test
     fun equals_returns_true_for_same_instance() {
-        val textFieldValue = TextFieldValue(
-            text = "a",
-            selection = TextRange(1),
-            composition = TextRange(2)
-        )
+        val textFieldValue =
+            TextFieldValue(text = "a", selection = TextRange(1), composition = TextRange(2))
 
         assertThat(textFieldValue).isEqualTo(textFieldValue)
     }
 
     @Test
     fun equals_returns_true_for_same_object() {
-        val textFieldValue = TextFieldValue(
-            text = "a",
-            selection = TextRange(1),
-            composition = TextRange(2)
-        )
+        val textFieldValue =
+            TextFieldValue(text = "a", selection = TextRange(1), composition = TextRange(2))
 
         assertThat(textFieldValue).isEqualTo(textFieldValue.copy())
     }
 
     @Test
     fun copy_sets_text_correctly() {
-        val textFieldValue = TextFieldValue(
-            text = "a",
-            selection = TextRange(1),
-            composition = TextRange(2)
-        )
+        val textFieldValue =
+            TextFieldValue(text = "a", selection = TextRange(1), composition = TextRange(2))
 
-        val expected = TextFieldValue(
-            text = "b",
-            selection = textFieldValue.selection,
-            composition = textFieldValue.composition
-        )
+        val expected =
+            TextFieldValue(
+                text = "b",
+                selection = textFieldValue.selection,
+                composition = textFieldValue.composition
+            )
 
         assertThat(textFieldValue.copy(text = "b")).isEqualTo(expected)
     }
 
     @Test
     fun copy_sets_selection_correctly() {
-        val textFieldValue = TextFieldValue(
-            text = "a",
-            selection = TextRange(1),
-            composition = TextRange(2)
-        )
+        val textFieldValue =
+            TextFieldValue(text = "a", selection = TextRange(1), composition = TextRange(2))
 
-        val expected = TextFieldValue(
-            text = textFieldValue.text,
-            selection = TextRange.Zero,
-            composition = textFieldValue.composition
-        )
+        val expected =
+            TextFieldValue(
+                text = textFieldValue.text,
+                selection = TextRange.Zero,
+                composition = textFieldValue.composition
+            )
 
         assertThat(textFieldValue.copy(selection = TextRange.Zero)).isEqualTo(expected)
     }
 
     @Test
     fun text_and_selection_parameter_constructor_has_null_composition() {
-        val textFieldValue = TextFieldValue(
-            text = "a",
-            selection = TextRange(1)
-        )
+        val textFieldValue = TextFieldValue(text = "a", selection = TextRange(1))
 
         assertThat(textFieldValue.composition).isNull()
     }
@@ -196,15 +183,11 @@
                     letterSpacing = 2.em,
                     baselineShift = BaselineShift.Superscript,
                     textGeometricTransform = TextGeometricTransform(2f, 3f),
-                    localeList = LocaleList(
-                        Locale("sr-Latn-SR"),
-                        Locale("sr-Cyrl-SR"),
-                        Locale.current
-                    ),
+                    localeList =
+                        LocaleList(Locale("sr-Latn-SR"), Locale("sr-Cyrl-SR"), Locale.current),
                     background = Color.Blue,
                     textDecoration = TextDecoration.LineThrough,
                     shadow = Shadow(color = Color.Red, offset = Offset(2f, 2f), blurRadius = 4f)
-
                 )
             ) {
                 append("7")
@@ -221,18 +204,17 @@
             }
         }
 
-        val original = TextFieldValue(
-            annotatedString = annotatedString,
-            selection = TextRange(1, 2),
-            composition = TextRange(3, 4)
-        )
+        val original =
+            TextFieldValue(
+                annotatedString = annotatedString,
+                selection = TextRange(1, 2),
+                composition = TextRange(3, 4)
+            )
 
         val saved = with(TextFieldValue.Saver) { defaultSaverScope.save(original) }
         val restored = TextFieldValue.Saver.restore(saved!!)
 
-        assertThat(restored).isEqualTo(
-            TextFieldValue(original.annotatedString, original.selection)
-        )
+        assertThat(restored).isEqualTo(TextFieldValue(original.annotatedString, original.selection))
     }
 
     @Test
diff --git a/compose/ui/ui-text/src/androidUnitTest/kotlin/androidx/compose/ui/text/matchers/EditBufferSubject.kt b/compose/ui/ui-text/src/androidUnitTest/kotlin/androidx/compose/ui/text/matchers/EditBufferSubject.kt
index 6cce6e9..d5bd93b 100644
--- a/compose/ui/ui-text/src/androidUnitTest/kotlin/androidx/compose/ui/text/matchers/EditBufferSubject.kt
+++ b/compose/ui/ui-text/src/androidUnitTest/kotlin/androidx/compose/ui/text/matchers/EditBufferSubject.kt
@@ -26,17 +26,16 @@
 
 @OptIn(InternalTextApi::class)
 internal fun assertThat(buffer: PartialGapBuffer): EditBufferSubject {
-    return assertAbout(EditBufferSubject.SUBJECT_FACTORY)
-        .that(GapBufferWrapper(buffer))!!
+    return assertAbout(EditBufferSubject.SUBJECT_FACTORY).that(GapBufferWrapper(buffer))!!
 }
 
 internal fun assertThat(buffer: EditingBuffer): EditBufferSubject {
-    return assertAbout(EditBufferSubject.SUBJECT_FACTORY)
-        .that(EditingBufferWrapper(buffer))!!
+    return assertAbout(EditBufferSubject.SUBJECT_FACTORY).that(EditingBufferWrapper(buffer))!!
 }
 
 internal abstract class GetOperatorWrapper(val buffer: Any) {
     abstract operator fun get(index: Int): Char
+
     override fun toString(): String = buffer.toString()
 }
 
@@ -49,18 +48,17 @@
     override fun get(index: Int): Char = (buffer as PartialGapBuffer)[index]
 }
 
-/**
- * Truth extension for Editing Buffers.
- */
+/** Truth extension for Editing Buffers. */
 @OptIn(InternalTextApi::class)
-internal class EditBufferSubject private constructor(
-    failureMetadata: FailureMetadata?,
-    private val subject: GetOperatorWrapper
-) : Subject(failureMetadata, subject) {
+internal class EditBufferSubject
+private constructor(failureMetadata: FailureMetadata?, private val subject: GetOperatorWrapper) :
+    Subject(failureMetadata, subject) {
 
     companion object {
         internal val SUBJECT_FACTORY: Factory<EditBufferSubject, GetOperatorWrapper> =
-            Factory { failureMetadata, subject -> EditBufferSubject(failureMetadata, subject) }
+            Factory { failureMetadata, subject ->
+                EditBufferSubject(failureMetadata, subject)
+            }
     }
 
     fun hasChars(expected: String) {
diff --git a/compose/ui/ui-text/src/androidUnitTest/kotlin/androidx/compose/ui/text/style/LineHeightStyleTest.kt b/compose/ui/ui-text/src/androidUnitTest/kotlin/androidx/compose/ui/text/style/LineHeightStyleTest.kt
index 8d9fc96..7bce3cc 100644
--- a/compose/ui/ui-text/src/androidUnitTest/kotlin/androidx/compose/ui/text/style/LineHeightStyleTest.kt
+++ b/compose/ui/ui-text/src/androidUnitTest/kotlin/androidx/compose/ui/text/style/LineHeightStyleTest.kt
@@ -30,79 +30,45 @@
 
     @Test
     fun equals_returns_false_for_different_alignment() {
-        val lineHeightStyle = LineHeightStyle(
-            alignment = Alignment.Center,
-            trim = Trim.None
-        )
-        val otherLineHeightStyle = LineHeightStyle(
-            alignment = Alignment.Bottom,
-            trim = Trim.None
-        )
+        val lineHeightStyle = LineHeightStyle(alignment = Alignment.Center, trim = Trim.None)
+        val otherLineHeightStyle = LineHeightStyle(alignment = Alignment.Bottom, trim = Trim.None)
         assertThat(lineHeightStyle.equals(otherLineHeightStyle)).isFalse()
     }
 
     @Test
     fun equals_returns_false_for_different_trim() {
-        val lineHeightStyle = LineHeightStyle(
-            alignment = Alignment.Center,
-            trim = Trim.None
-        )
-        val otherLineHeightStyle = LineHeightStyle(
-            alignment = Alignment.Center,
-            trim = Trim.Both
-        )
+        val lineHeightStyle = LineHeightStyle(alignment = Alignment.Center, trim = Trim.None)
+        val otherLineHeightStyle = LineHeightStyle(alignment = Alignment.Center, trim = Trim.Both)
         assertThat(lineHeightStyle.equals(otherLineHeightStyle)).isFalse()
     }
 
     @Test
     fun equals_returns_true_for_same_attributes() {
-        val lineHeightStyle = LineHeightStyle(
-            alignment = Alignment.Center,
-            trim = Trim.FirstLineTop
-        )
-        val otherLineHeightStyle = LineHeightStyle(
-            alignment = Alignment.Center,
-            trim = Trim.FirstLineTop
-        )
+        val lineHeightStyle =
+            LineHeightStyle(alignment = Alignment.Center, trim = Trim.FirstLineTop)
+        val otherLineHeightStyle =
+            LineHeightStyle(alignment = Alignment.Center, trim = Trim.FirstLineTop)
         assertThat(lineHeightStyle.equals(otherLineHeightStyle)).isTrue()
     }
 
     @Test
     fun hashCode_is_different_for_different_alignment() {
-        val lineHeightStyle = LineHeightStyle(
-            alignment = Alignment.Center,
-            trim = Trim.None
-        )
-        val otherLineHeightStyle = LineHeightStyle(
-            alignment = Alignment.Bottom,
-            trim = Trim.Both
-        )
+        val lineHeightStyle = LineHeightStyle(alignment = Alignment.Center, trim = Trim.None)
+        val otherLineHeightStyle = LineHeightStyle(alignment = Alignment.Bottom, trim = Trim.Both)
         assertThat(lineHeightStyle.hashCode()).isNotEqualTo(otherLineHeightStyle.hashCode())
     }
 
     @Test
     fun hashCode_is_different_for_different_trim() {
-        val lineHeightStyle = LineHeightStyle(
-            alignment = Alignment.Center,
-            trim = Trim.None
-        )
-        val otherLineHeightStyle = LineHeightStyle(
-            alignment = Alignment.Center,
-            trim = Trim.Both
-        )
+        val lineHeightStyle = LineHeightStyle(alignment = Alignment.Center, trim = Trim.None)
+        val otherLineHeightStyle = LineHeightStyle(alignment = Alignment.Center, trim = Trim.Both)
         assertThat(lineHeightStyle.hashCode()).isNotEqualTo(otherLineHeightStyle.hashCode())
     }
 
     @Test
     fun hashCode_is_same_for_same_attributes() {
-        val lineHeightStyle = LineHeightStyle(
-            alignment = Alignment.Center,
-            trim = Trim.Both
-        )
-        val otherLineHeightStyle = LineHeightStyle(
-            alignment = Alignment.Center,
-            trim = Trim.Both
-        )
+        val lineHeightStyle = LineHeightStyle(alignment = Alignment.Center, trim = Trim.Both)
+        val otherLineHeightStyle = LineHeightStyle(alignment = Alignment.Center, trim = Trim.Both)
         assertThat(lineHeightStyle.hashCode()).isEqualTo(otherLineHeightStyle.hashCode())
     }
 }
diff --git a/compose/ui/ui-text/src/androidUnitTest/kotlin/androidx/compose/ui/text/style/TextDecorationTest.kt b/compose/ui/ui-text/src/androidUnitTest/kotlin/androidx/compose/ui/text/style/TextDecorationTest.kt
index 28df454..509534e 100644
--- a/compose/ui/ui-text/src/androidUnitTest/kotlin/androidx/compose/ui/text/style/TextDecorationTest.kt
+++ b/compose/ui/ui-text/src/androidUnitTest/kotlin/androidx/compose/ui/text/style/TextDecorationTest.kt
@@ -74,8 +74,7 @@
 
     @Test
     fun `toString with multiple textDecorations`() {
-        assertThat(
-            (TextDecoration.Underline + TextDecoration.LineThrough).toString()
-        ).isEqualTo("TextDecoration[Underline, LineThrough]")
+        assertThat((TextDecoration.Underline + TextDecoration.LineThrough).toString())
+            .isEqualTo("TextDecoration[Underline, LineThrough]")
     }
 }
diff --git a/compose/ui/ui-text/src/androidUnitTest/kotlin/androidx/compose/ui/text/style/TextForegroundStyleTest.kt b/compose/ui/ui-text/src/androidUnitTest/kotlin/androidx/compose/ui/text/style/TextForegroundStyleTest.kt
index 9b2d38e..c2b78d8 100644
--- a/compose/ui/ui-text/src/androidUnitTest/kotlin/androidx/compose/ui/text/style/TextForegroundStyleTest.kt
+++ b/compose/ui/ui-text/src/androidUnitTest/kotlin/androidx/compose/ui/text/style/TextForegroundStyleTest.kt
@@ -152,9 +152,8 @@
 
         val newBrush = Brush.linearGradient(listOf(Color.White, Color.Black))
         val other = TextForegroundStyle.from(newBrush, Float.NaN)
-        assertThat(current.merge(other).brush).isEqualTo(
-            TextForegroundStyle.from(newBrush, 0.7f).brush
-        )
+        assertThat(current.merge(other).brush)
+            .isEqualTo(TextForegroundStyle.from(newBrush, 0.7f).brush)
         assertThat(current.merge(other).alpha).isWithin(TOLERANCE).of(0.7f)
     }
 
@@ -163,9 +162,8 @@
         val start = TextForegroundStyle.Unspecified
         val stop = TextForegroundStyle.from(Color.Red)
 
-        assertThat(lerp(start, stop, fraction = 0.4f)).isEqualTo(
-            TextForegroundStyle.from(lerp(Color.Unspecified, Color.Red, 0.4f))
-        )
+        assertThat(lerp(start, stop, fraction = 0.4f))
+            .isEqualTo(TextForegroundStyle.from(lerp(Color.Unspecified, Color.Red, 0.4f)))
     }
 
     @Test
@@ -173,9 +171,7 @@
         val start = TextForegroundStyle.from(defaultBrush, 1f)
         val stop = TextForegroundStyle.from(Color.Red)
 
-        assertThat(lerp(start, stop, fraction = 0.4f)).isEqualTo(
-            lerpDiscrete(start, stop, 0.4f)
-        )
+        assertThat(lerp(start, stop, fraction = 0.4f)).isEqualTo(lerpDiscrete(start, stop, 0.4f))
     }
 
     @Test
@@ -184,11 +180,12 @@
         val newBrush = Brush.linearGradient(listOf(Color.White, Color.Black))
         val stop = TextForegroundStyle.from(newBrush, 0.7f)
 
-        assertThat(lerp(start, stop, fraction = 0.6f)).isEqualTo(
-            TextForegroundStyle.from(
-                lerpDiscrete(defaultBrush, newBrush, 0.6f),
-                lerp(0.4f, 0.7f, 0.6f)
+        assertThat(lerp(start, stop, fraction = 0.6f))
+            .isEqualTo(
+                TextForegroundStyle.from(
+                    lerpDiscrete(defaultBrush, newBrush, 0.6f),
+                    lerp(0.4f, 0.7f, 0.6f)
+                )
             )
-        )
     }
 }
diff --git a/compose/ui/ui-text/src/commonMain/kotlin/androidx/compose/ui/text/AnnotatedString.kt b/compose/ui/ui-text/src/commonMain/kotlin/androidx/compose/ui/text/AnnotatedString.kt
index 73cf2f9..ad4d8de 100644
--- a/compose/ui/ui-text/src/commonMain/kotlin/androidx/compose/ui/text/AnnotatedString.kt
+++ b/compose/ui/ui-text/src/commonMain/kotlin/androidx/compose/ui/text/AnnotatedString.kt
@@ -28,43 +28,40 @@
 import androidx.compose.ui.util.fastMap
 
 /**
- * The basic data structure of text with multiple styles. To construct an [AnnotatedString] you
- * can use [Builder].
+ * The basic data structure of text with multiple styles. To construct an [AnnotatedString] you can
+ * use [Builder].
  */
 @Immutable
-class AnnotatedString internal constructor(
+class AnnotatedString
+internal constructor(
     val text: String,
     internal val spanStylesOrNull: List<Range<SpanStyle>>? = null,
     internal val paragraphStylesOrNull: List<Range<ParagraphStyle>>? = null,
     internal val annotations: List<Range<out Any>>? = null
 ) : CharSequence {
-    /**
-     * All [SpanStyle] that have been applied to a range of this String
-     */
+    /** All [SpanStyle] that have been applied to a range of this String */
     val spanStyles: List<Range<SpanStyle>>
         get() = spanStylesOrNull ?: emptyList()
 
-    /**
-     * All [ParagraphStyle] that have been applied to a range of this String
-     */
+    /** All [ParagraphStyle] that have been applied to a range of this String */
     val paragraphStyles: List<Range<ParagraphStyle>>
         get() = paragraphStylesOrNull ?: emptyList()
 
     /**
-     * The basic data structure of text with multiple styles. To construct an [AnnotatedString]
-     * you can use [Builder].
+     * The basic data structure of text with multiple styles. To construct an [AnnotatedString] you
+     * can use [Builder].
      *
      * @param text the text to be displayed.
      * @param spanStyles a list of [Range]s that specifies [SpanStyle]s on certain portion of the
-     * text. These styles will be applied in the order of the list. And the [SpanStyle]s applied
-     * later can override the former styles. Notice that [SpanStyle] attributes which are null or
-     * [androidx.compose.ui.unit.TextUnit.Unspecified] won't change the current ones.
-     * @param paragraphStyles a list of [Range]s that specifies [ParagraphStyle]s on certain
-     * portion of the text. Each [ParagraphStyle] with a [Range] defines a paragraph of text.
-     * It's required that [Range]s of paragraphs don't overlap with each other. If there are gaps
-     * between specified paragraph [Range]s, a default paragraph will be created in between.
-     *
+     *   text. These styles will be applied in the order of the list. And the [SpanStyle]s applied
+     *   later can override the former styles. Notice that [SpanStyle] attributes which are null or
+     *   [androidx.compose.ui.unit.TextUnit.Unspecified] won't change the current ones.
+     * @param paragraphStyles a list of [Range]s that specifies [ParagraphStyle]s on certain portion
+     *   of the text. Each [ParagraphStyle] with a [Range] defines a paragraph of text. It's
+     *   required that [Range]s of paragraphs don't overlap with each other. If there are gaps
+     *   between specified paragraph [Range]s, a default paragraph will be created in between.
      * @throws IllegalArgumentException if [paragraphStyles] contains any two overlapping [Range]s.
+     *
      * @sample androidx.compose.ui.text.samples.AnnotatedStringConstructorSample
      *
      * @see SpanStyle
@@ -74,26 +71,23 @@
         text: String,
         spanStyles: List<Range<SpanStyle>> = listOf(),
         paragraphStyles: List<Range<ParagraphStyle>> = listOf()
-    ) : this(
-        text,
-        spanStyles.ifEmpty { null },
-        paragraphStyles.ifEmpty { null },
-        null
-    )
+    ) : this(text, spanStyles.ifEmpty { null }, paragraphStyles.ifEmpty { null }, null)
 
     init {
         var lastStyleEnd = -1
         @Suppress("ListIterator")
-        paragraphStylesOrNull?.sortedBy { it.start }?.fastForEach { paragraphStyle ->
-            require(paragraphStyle.start >= lastStyleEnd) {
-                "ParagraphStyle should not overlap"
+        paragraphStylesOrNull
+            ?.sortedBy { it.start }
+            ?.fastForEach { paragraphStyle ->
+                require(paragraphStyle.start >= lastStyleEnd) {
+                    "ParagraphStyle should not overlap"
+                }
+                require(paragraphStyle.end <= text.length) {
+                    "ParagraphStyle range [${paragraphStyle.start}, ${paragraphStyle.end})" +
+                        " is out of boundary"
+                }
+                lastStyleEnd = paragraphStyle.end
             }
-            require(paragraphStyle.end <= text.length) {
-                "ParagraphStyle range [${paragraphStyle.start}, ${paragraphStyle.end})" +
-                    " is out of boundary"
-            }
-            lastStyleEnd = paragraphStyle.end
-        }
     }
 
     override val length: Int
@@ -102,8 +96,8 @@
     override operator fun get(index: Int): Char = text[index]
 
     /**
-     * Return a substring for the AnnotatedString and include the styles in the range of [startIndex]
-     * (inclusive) and [endIndex] (exclusive).
+     * Return a substring for the AnnotatedString and include the styles in the range of
+     * [startIndex] (inclusive) and [endIndex] (exclusive).
      *
      * @param startIndex the inclusive start offset of the range
      * @param endIndex the exclusive end offset of the range
@@ -126,7 +120,6 @@
      * Return a substring for the AnnotatedString and include the styles in the given [range].
      *
      * @param range the text range
-     *
      * @see subSequence(start: Int, end: Int)
      */
     fun subSequence(range: TextRange): AnnotatedString {
@@ -142,24 +135,24 @@
     }
 
     /**
-     * Query the string annotations attached on this AnnotatedString.
-     * Annotations are metadata attached on the AnnotatedString, for example, a URL is a string
-     * metadata attached on the a certain range. Annotations are also store with [Range] like the
-     * styles.
+     * Query the string annotations attached on this AnnotatedString. Annotations are metadata
+     * attached on the AnnotatedString, for example, a URL is a string metadata attached on the a
+     * certain range. Annotations are also store with [Range] like the styles.
      *
-     * @param tag the tag of the annotations that is being queried. It's used to distinguish
-     * the annotations for different purposes.
+     * @param tag the tag of the annotations that is being queried. It's used to distinguish the
+     *   annotations for different purposes.
      * @param start the start of the query range, inclusive.
      * @param end the end of the query range, exclusive.
-     * @return a list of annotations stored in [Range].  Notice that All annotations that intersect
-     * with the range [start, end) will be returned. When [start] is bigger than [end], an empty
-     * list will be returned.
+     * @return a list of annotations stored in [Range]. Notice that All annotations that intersect
+     *   with the range [start, end) will be returned. When [start] is bigger than [end], an empty
+     *   list will be returned.
      */
     @Suppress("UNCHECKED_CAST")
     fun getStringAnnotations(tag: String, start: Int, end: Int): List<Range<String>> =
         (annotations?.fastFilter {
             it.item is String && tag == it.tag && intersect(start, end, it.start, it.end)
-        } ?: emptyList()) as List<Range<String>>
+        } ?: emptyList())
+            as List<Range<String>>
 
     /**
      * Returns true if [getStringAnnotations] with the same parameters would return a non-empty list
@@ -174,39 +167,40 @@
      *
      * @param start the start of the query range, inclusive.
      * @param end the end of the query range, exclusive.
-     * @return a list of annotations stored in [Range].  Notice that All annotations that intersect
-     * with the range [start, end) will be returned. When [start] is bigger than [end], an empty
-     * list will be returned.
+     * @return a list of annotations stored in [Range]. Notice that All annotations that intersect
+     *   with the range [start, end) will be returned. When [start] is bigger than [end], an empty
+     *   list will be returned.
      */
     @Suppress("UNCHECKED_CAST")
     fun getStringAnnotations(start: Int, end: Int): List<Range<String>> =
-        (annotations?.fastFilter {
-            it.item is String && intersect(start, end, it.start, it.end)
-        } ?: emptyList()) as List<Range<String>>
+        (annotations?.fastFilter { it.item is String && intersect(start, end, it.start, it.end) }
+            ?: emptyList())
+            as List<Range<String>>
 
     /**
      * Query all of the [TtsAnnotation]s attached on this [AnnotatedString].
      *
      * @param start the start of the query range, inclusive.
      * @param end the end of the query range, exclusive.
-     * @return a list of annotations stored in [Range].  Notice that All annotations that intersect
-     * with the range [start, end) will be returned. When [start] is bigger than [end], an empty
-     * list will be returned.
+     * @return a list of annotations stored in [Range]. Notice that All annotations that intersect
+     *   with the range [start, end) will be returned. When [start] is bigger than [end], an empty
+     *   list will be returned.
      */
     @Suppress("UNCHECKED_CAST")
     fun getTtsAnnotations(start: Int, end: Int): List<Range<TtsAnnotation>> =
         ((annotations?.fastFilter {
             it.item is TtsAnnotation && intersect(start, end, it.start, it.end)
-        } ?: emptyList()) as List<Range<TtsAnnotation>>)
+        } ?: emptyList())
+            as List<Range<TtsAnnotation>>)
 
     /**
      * Query all of the [UrlAnnotation]s attached on this [AnnotatedString].
      *
      * @param start the start of the query range, inclusive.
      * @param end the end of the query range, exclusive.
-     * @return a list of annotations stored in [Range].  Notice that All annotations that intersect
-     * with the range [start, end) will be returned. When [start] is bigger than [end], an empty
-     * list will be returned.
+     * @return a list of annotations stored in [Range]. Notice that All annotations that intersect
+     *   with the range [start, end) will be returned. When [start] is bigger than [end], an empty
+     *   list will be returned.
      */
     @ExperimentalTextApi
     @Suppress("UNCHECKED_CAST", "Deprecation")
@@ -214,22 +208,24 @@
     fun getUrlAnnotations(start: Int, end: Int): List<Range<UrlAnnotation>> =
         ((annotations?.fastFilter {
             it.item is UrlAnnotation && intersect(start, end, it.start, it.end)
-        } ?: emptyList()) as List<Range<UrlAnnotation>>)
+        } ?: emptyList())
+            as List<Range<UrlAnnotation>>)
 
     /**
      * Query all of the [LinkAnnotation]s attached on this [AnnotatedString].
      *
      * @param start the start of the query range, inclusive.
      * @param end the end of the query range, exclusive.
-     * @return a list of annotations stored in [Range].  Notice that All annotations that intersect
-     * with the range [start, end) will be returned. When [start] is bigger than [end], an empty
-     * list will be returned.
+     * @return a list of annotations stored in [Range]. Notice that All annotations that intersect
+     *   with the range [start, end) will be returned. When [start] is bigger than [end], an empty
+     *   list will be returned.
      */
     @Suppress("UNCHECKED_CAST")
     fun getLinkAnnotations(start: Int, end: Int): List<Range<LinkAnnotation>> =
         ((annotations?.fastFilter {
             it.item is LinkAnnotation && intersect(start, end, it.start, it.end)
-        } ?: emptyList()) as List<Range<LinkAnnotation>>)
+        } ?: emptyList())
+            as List<Range<LinkAnnotation>>)
 
     /**
      * Returns true if [getLinkAnnotations] with the same parameters would return a non-empty list
@@ -274,8 +270,7 @@
      * @param other to compare annotations with
      * @return true if and only if this compares equal on annotations with other
      */
-    fun hasEqualAnnotations(other: AnnotatedString): Boolean =
-        this.annotations == other.annotations
+    fun hasEqualAnnotations(other: AnnotatedString): Boolean = this.annotations == other.annotations
 
     /**
      * The information attached on the text such as a [SpanStyle].
@@ -284,7 +279,8 @@
      * @param start The start of the range where [item] takes effect. It's inclusive
      * @param end The end of the range where [item] takes effect. It's exclusive
      * @param tag The tag used to distinguish the different ranges. It is useful to store custom
-     * data. And [Range]s with same tag can be queried with functions such as [getStringAnnotations].
+     *   data. And [Range]s with same tag can be queried with functions such as
+     *   [getStringAnnotations].
      */
     @Immutable
     data class Range<T>(val item: T, val start: Int, val end: Int, val tag: String) {
@@ -296,8 +292,8 @@
     }
 
     /**
-     * Builder class for AnnotatedString. Enables construction of an [AnnotatedString] using
-     * methods such as [append] and [addStyle].
+     * Builder class for AnnotatedString. Enables construction of an [AnnotatedString] using methods
+     * such as [append] and [addStyle].
      *
      * @sample androidx.compose.ui.text.samples.AnnotatedStringBuilderSample
      *
@@ -334,24 +330,19 @@
         private val annotations: MutableList<MutableRange<out Any>> = mutableListOf()
         private val styleStack: MutableList<MutableRange<out Any>> = mutableListOf()
 
-        /**
-         * Create an [Builder] instance using the given [String].
-         */
+        /** Create an [Builder] instance using the given [String]. */
         constructor(text: String) : this() {
             append(text)
         }
 
-        /**
-         * Create an [Builder] instance using the given [AnnotatedString].
-         */
+        /** Create an [Builder] instance using the given [AnnotatedString]. */
         constructor(text: AnnotatedString) : this() {
             append(text)
         }
 
-        /**
-         * Returns the length of the [String].
-         */
-        val length: Int get() = text.length
+        /** Returns the length of the [String]. */
+        val length: Int
+            get() = text.length
 
         /**
          * Appends the given [String] to this [Builder].
@@ -363,8 +354,9 @@
         }
 
         @Deprecated(
-            message = "Replaced by the append(Char) method that returns an Appendable. " +
-                "This method must be kept around for binary compatibility.",
+            message =
+                "Replaced by the append(Char) method that returns an Appendable. " +
+                    "This method must be kept around for binary compatibility.",
             level = DeprecationLevel.HIDDEN
         )
         @Suppress("FunctionName", "unused")
@@ -397,12 +389,11 @@
          * Appends the range of [text] between [start] (inclusive) and [end] (exclusive) to this
          * [Builder] if non-null, and returns this [Builder].
          *
-         * If [text] is an [AnnotatedString], all spans and annotations from [text] between
-         * [start] and [end] will be copied over as well.
-         * No other subtypes of [CharSequence] will be treated specially. For example, any
-         * platform-specific types, such as `SpannedString` on Android, will only have their text
-         * copied and any other information held in the sequence, such as Android `Span`s, will be
-         * dropped.
+         * If [text] is an [AnnotatedString], all spans and annotations from [text] between [start]
+         * and [end] will be copied over as well. No other subtypes of [CharSequence] will be
+         * treated specially. For example, any platform-specific types, such as `SpannedString` on
+         * Android, will only have their text copied and any other information held in the sequence,
+         * such as Android `Span`s, will be dropped.
          *
          * @param start The index of the first character in [text] to copy over (inclusive).
          * @param end The index after the last character in [text] to copy over (exclusive).
@@ -440,9 +431,7 @@
             }
 
             text.annotations?.fastForEach {
-                annotations.add(
-                    MutableRange(it.item, start + it.start, start + it.end, it.tag)
-                )
+                annotations.add(MutableRange(it.item, start + it.start, start + it.end, it.tag))
             }
         }
 
@@ -509,6 +498,7 @@
          * @param start the inclusive starting offset of the range
          * @param end the exclusive end offset of the range
          * @see getStringAnnotations
+         *
          * @sample androidx.compose.ui.text.samples.AnnotatedStringAddStringAnnotationSample
          */
         fun addStringAnnotation(tag: String, annotation: String, start: Int, end: Int) {
@@ -519,10 +509,11 @@
          * Set a [TtsAnnotation] for the given [range].
          *
          * @param ttsAnnotation an object that stores text to speech metadata that intended for the
-         * TTS engine.
+         *   TTS engine.
          * @param start the inclusive starting offset of the range
          * @param end the exclusive end offset of the range
          * @see getStringAnnotations
+         *
          * @sample androidx.compose.ui.text.samples.AnnotatedStringAddStringAnnotationSample
          */
         @ExperimentalTextApi
@@ -540,11 +531,13 @@
          * @param start the inclusive starting offset of the range
          * @param end the exclusive end offset of the range
          * @see getStringAnnotations
+         *
          * @sample androidx.compose.ui.text.samples.AnnotatedStringAddStringAnnotationSample
          */
         @ExperimentalTextApi
         @Suppress("SetterReturnsThis", "Deprecation")
-        @Deprecated("Use LinkAnnotation API for links instead",
+        @Deprecated(
+            "Use LinkAnnotation API for links instead",
             ReplaceWith("addLink(, start, end)")
         )
         fun addUrlAnnotation(urlAnnotation: UrlAnnotation, start: Int, end: Int) {
@@ -557,8 +550,8 @@
          * When clicking on the text in [range], the corresponding URL from the [url] annotation
          * will be opened using [androidx.compose.ui.platform.UriHandler].
          *
-         * URLs may be treated specially by screen readers, including being identified while
-         * reading text with an audio icon or being summarized in a links menu.
+         * URLs may be treated specially by screen readers, including being identified while reading
+         * text with an audio icon or being summarized in a links menu.
          *
          * @param url A [LinkAnnotation.Url] object that stores the URL being linked to.
          * @param start the inclusive starting offset of the range
@@ -573,8 +566,8 @@
         /**
          * Set a [LinkAnnotation.Clickable] for the given [range].
          *
-         * When clicking on the text in [range], a [LinkInteractionListener] will be triggered
-         * with the [clickable] object.
+         * When clicking on the text in [range], a [LinkInteractionListener] will be triggered with
+         * the [clickable] object.
          *
          * Clickable link may be treated specially by screen readers, including being identified
          * while reading text with an audio icon or being summarized in a links menu.
@@ -590,8 +583,7 @@
         }
 
         /**
-         * Applies the given [SpanStyle] to any appended text until a corresponding [pop] is
-         * called.
+         * Applies the given [SpanStyle] to any appended text until a corresponding [pop] is called.
          *
          * @sample androidx.compose.ui.text.samples.AnnotatedStringBuilderPushSample
          *
@@ -606,8 +598,8 @@
         }
 
         /**
-         * Applies the given [ParagraphStyle] to any appended text until a corresponding [pop]
-         * is called.
+         * Applies the given [ParagraphStyle] to any appended text until a corresponding [pop] is
+         * called.
          *
          * @sample androidx.compose.ui.text.samples.AnnotatedStringBuilderPushParagraphStyleSample
          *
@@ -622,8 +614,7 @@
         }
 
         /**
-         * Attach the given [annotation] to any appended text until a corresponding [pop]
-         * is called.
+         * Attach the given [annotation] to any appended text until a corresponding [pop] is called.
          *
          * @sample androidx.compose.ui.text.samples.AnnotatedStringBuilderPushStringAnnotationSample
          *
@@ -641,13 +632,13 @@
         }
 
         /**
-         * Attach the given [ttsAnnotation] to any appended text until a corresponding [pop]
-         * is called.
+         * Attach the given [ttsAnnotation] to any appended text until a corresponding [pop] is
+         * called.
          *
          * @sample androidx.compose.ui.text.samples.AnnotatedStringBuilderPushStringAnnotationSample
          *
          * @param ttsAnnotation an object that stores text to speech metadata that intended for the
-         * TTS engine.
+         *   TTS engine.
          * @see getStringAnnotations
          * @see Range
          */
@@ -660,8 +651,8 @@
         }
 
         /**
-         * Attach the given [UrlAnnotation] to any appended text until a corresponding [pop]
-         * is called.
+         * Attach the given [UrlAnnotation] to any appended text until a corresponding [pop] is
+         * called.
          *
          * @sample androidx.compose.ui.text.samples.AnnotatedStringBuilderPushStringAnnotationSample
          *
@@ -671,7 +662,8 @@
          */
         @Suppress("BuilderSetStyle", "Deprecation")
         @ExperimentalTextApi
-        @Deprecated("Use LinkAnnotation API for links instead",
+        @Deprecated(
+            "Use LinkAnnotation API for links instead",
             ReplaceWith("pushLink(, start, end)")
         )
         fun pushUrlAnnotation(urlAnnotation: UrlAnnotation): Int {
@@ -683,11 +675,11 @@
         }
 
         /**
-         * Attach the given [LinkAnnotation] to any appended text until a corresponding [pop]
-         * is called.
+         * Attach the given [LinkAnnotation] to any appended text until a corresponding [pop] is
+         * called.
          *
-         * @param link A [LinkAnnotation] object that stores the URL or clickable tag being
-         * linked to.
+         * @param link A [LinkAnnotation] object that stores the URL or clickable tag being linked
+         *   to.
          * @see getStringAnnotations
          * @see Range
          */
@@ -718,8 +710,7 @@
          * [pushStringAnnotation] that returned the given index.
          *
          * @param index the result of the a previous [pushStyle] or [pushStringAnnotation] in order
-         * to pop to
-         *
+         *   to pop to
          * @see pop
          * @see pushStyle
          * @see pushStringAnnotation
@@ -731,21 +722,14 @@
             }
         }
 
-        /**
-         * Constructs an [AnnotatedString] based on the configurations applied to the [Builder].
-         */
+        /** Constructs an [AnnotatedString] based on the configurations applied to the [Builder]. */
         fun toAnnotatedString(): AnnotatedString {
             return AnnotatedString(
                 text = text.toString(),
-                spanStylesOrNull = spanStyles
-                    .fastMap { it.toRange(text.length) }
-                    .ifEmpty { null },
-                paragraphStylesOrNull = paragraphStyles
-                    .fastMap { it.toRange(text.length) }
-                    .ifEmpty { null },
-                annotations = annotations
-                    .fastMap { it.toRange(text.length) }
-                    .ifEmpty { null }
+                spanStylesOrNull = spanStyles.fastMap { it.toRange(text.length) }.ifEmpty { null },
+                paragraphStylesOrNull =
+                    paragraphStyles.fastMap { it.toRange(text.length) }.ifEmpty { null },
+                annotations = annotations.fastMap { it.toRange(text.length) }.ifEmpty { null }
             )
         }
     }
@@ -766,16 +750,14 @@
  * A helper function used to determine the paragraph boundaries in [MultiParagraph].
  *
  * It reads paragraph information from [AnnotatedString.paragraphStyles] where only some parts of
- * text has [ParagraphStyle] specified, and unspecified parts(gaps between specified paragraphs)
- * are considered as default paragraph with default [ParagraphStyle].
- * For example, the following string with a specified paragraph denoted by "[]"
- *      "Hello WorldHi!"
- *      [          ]
- * The result paragraphs are "Hello World" and "Hi!".
+ * text has [ParagraphStyle] specified, and unspecified parts(gaps between specified paragraphs) are
+ * considered as default paragraph with default [ParagraphStyle]. For example, the following string
+ * with a specified paragraph denoted by "[]" "Hello WorldHi!" [ ] The result paragraphs are "Hello
+ * World" and "Hi!".
  *
- * @param defaultParagraphStyle The default [ParagraphStyle]. It's used for both unspecified
- *  default paragraphs and specified paragraph. When a specified paragraph's [ParagraphStyle] has
- *  a null attribute, the default one will be used instead.
+ * @param defaultParagraphStyle The default [ParagraphStyle]. It's used for both unspecified default
+ *   paragraphs and specified paragraph. When a specified paragraph's [ParagraphStyle] has a null
+ *   attribute, the default one will be used instead.
  */
 internal fun AnnotatedString.normalizedParagraphStyles(
     defaultParagraphStyle: ParagraphStyle
@@ -811,17 +793,15 @@
  * @param end The end index of the paragraph range, exclusive
  * @return The list of converted [SpanStyle]s in the given paragraph range
  */
-private fun AnnotatedString.getLocalSpanStyles(
-    start: Int,
-    end: Int
-): List<Range<SpanStyle>>? {
+private fun AnnotatedString.getLocalSpanStyles(start: Int, end: Int): List<Range<SpanStyle>>? {
     if (start == end) return null
     val spanStyles = spanStylesOrNull ?: return null
     // If the given range covers the whole AnnotatedString, return SpanStyles without conversion.
     if (start == 0 && end >= this.text.length) {
         return spanStyles
     }
-    return spanStyles.fastFilter { intersect(start, end, it.start, it.end) }
+    return spanStyles
+        .fastFilter { intersect(start, end, it.start, it.end) }
         .fastMap {
             Range(
                 it.item,
@@ -848,7 +828,8 @@
     if (start == 0 && end >= this.text.length) {
         return paragraphStyles
     }
-    return paragraphStyles.fastFilter { intersect(start, end, it.start, it.end) }
+    return paragraphStyles
+        .fastFilter { intersect(start, end, it.start, it.end) }
         .fastMap {
             Range(
                 it.item,
@@ -859,23 +840,21 @@
 }
 
 /**
- * Helper function used to find the annotations in the given range and also convert the range
- * of those annotations to the local range.
+ * Helper function used to find the annotations in the given range and also convert the range of
+ * those annotations to the local range.
  *
  * @param start The start index of the range, inclusive
  * @param end The end index of the range, exclusive
  */
-private fun AnnotatedString.getLocalAnnotations(
-    start: Int,
-    end: Int
-): List<Range<out Any>>? {
+private fun AnnotatedString.getLocalAnnotations(start: Int, end: Int): List<Range<out Any>>? {
     if (start == end) return null
     val annotations = annotations ?: return null
     // If the given range covers the whole AnnotatedString, return SpanStyles without conversion.
     if (start == 0 && end >= this.text.length) {
         return annotations
     }
-    return annotations.fastFilter { intersect(start, end, it.start, it.end) }
+    return annotations
+        .fastFilter { intersect(start, end, it.start, it.end) }
         .fastMap {
             Range(
                 tag = it.tag,
@@ -887,18 +866,15 @@
 }
 
 /**
- * Helper function used to return another AnnotatedString that is a substring from [start] to
- * [end]. This will ignore the [ParagraphStyle]s and the resulting [AnnotatedString] will have no
+ * Helper function used to return another AnnotatedString that is a substring from [start] to [end].
+ * This will ignore the [ParagraphStyle]s and the resulting [AnnotatedString] will have no
  * [ParagraphStyle]s.
  *
  * @param start The start index of the paragraph range, inclusive
  * @param end The end index of the paragraph range, exclusive
  * @return The list of converted [SpanStyle]s in the given paragraph range
  */
-private fun AnnotatedString.substringWithoutParagraphStyles(
-    start: Int,
-    end: Int
-): AnnotatedString {
+private fun AnnotatedString.substringWithoutParagraphStyles(start: Int, end: Int): AnnotatedString {
     return AnnotatedString(
         text = if (start != end) text.substring(start, end) else "",
         spanStylesOrNull = getLocalSpanStyles(start, end)
@@ -907,16 +883,12 @@
 
 internal inline fun <T> AnnotatedString.mapEachParagraphStyle(
     defaultParagraphStyle: ParagraphStyle,
-    crossinline block: (
-        annotatedString: AnnotatedString,
-        paragraphStyle: Range<ParagraphStyle>
-    ) -> T
+    crossinline block:
+        (annotatedString: AnnotatedString, paragraphStyle: Range<ParagraphStyle>) -> T
 ): List<T> {
     return normalizedParagraphStyles(defaultParagraphStyle).fastMap { paragraphStyleRange ->
-        val annotatedString = substringWithoutParagraphStyles(
-            paragraphStyleRange.start,
-            paragraphStyleRange.end
-        )
+        val annotatedString =
+            substringWithoutParagraphStyles(paragraphStyleRange.start, paragraphStyleRange.end)
         block(annotatedString, paragraphStyleRange)
     }
 }
@@ -924,15 +896,15 @@
 /**
  * Create upper case transformed [AnnotatedString]
  *
- * The uppercase sometimes maps different number of characters. This function adjusts the text
- * style and paragraph style ranges to transformed offset.
+ * The uppercase sometimes maps different number of characters. This function adjusts the text style
+ * and paragraph style ranges to transformed offset.
  *
  * Note, if the style's offset is middle of the uppercase mapping context, this function won't
  * transform the character, e.g. style starts from between base alphabet character and accent
  * character.
  *
- * @param localeList A locale list used for upper case mapping. Only the first locale is
- *                   effective. If empty locale list is passed, use the current locale instead.
+ * @param localeList A locale list used for upper case mapping. Only the first locale is effective.
+ *   If empty locale list is passed, use the current locale instead.
  * @return A uppercase transformed string.
  */
 fun AnnotatedString.toUpperCase(localeList: LocaleList = LocaleList.current): AnnotatedString {
@@ -942,15 +914,15 @@
 /**
  * Create lower case transformed [AnnotatedString]
  *
- * The lowercase sometimes maps different number of characters. This function adjusts the text
- * style and paragraph style ranges to transformed offset.
+ * The lowercase sometimes maps different number of characters. This function adjusts the text style
+ * and paragraph style ranges to transformed offset.
  *
  * Note, if the style's offset is middle of the lowercase mapping context, this function won't
  * transform the character, e.g. style starts from between base alphabet character and accent
  * character.
  *
- * @param localeList A locale list used for lower case mapping. Only the first locale is
- *                   effective. If empty locale list is passed, use the current locale instead.
+ * @param localeList A locale list used for lower case mapping. Only the first locale is effective.
+ *   If empty locale list is passed, use the current locale instead.
  * @return A lowercase transformed string.
  */
 fun AnnotatedString.toLowerCase(localeList: LocaleList = LocaleList.current): AnnotatedString {
@@ -960,17 +932,16 @@
 /**
  * Create capitalized [AnnotatedString]
  *
- * The capitalization sometimes maps different number of characters. This function adjusts the
- * text style and paragraph style ranges to transformed offset.
+ * The capitalization sometimes maps different number of characters. This function adjusts the text
+ * style and paragraph style ranges to transformed offset.
  *
  * Note, if the style's offset is middle of the capitalization context, this function won't
  * transform the character, e.g. style starts from between base alphabet character and accent
  * character.
  *
- * @param localeList A locale list used for capitalize mapping. Only the first locale is
- *                   effective. If empty locale list is passed, use the current locale instead.
- *                   Note that, this locale is currently ignored since underlying Kotlin method
- *                   is experimental.
+ * @param localeList A locale list used for capitalize mapping. Only the first locale is effective.
+ *   If empty locale list is passed, use the current locale instead. Note that, this locale is
+ *   currently ignored since underlying Kotlin method is experimental.
  * @return A capitalized string.
  */
 fun AnnotatedString.capitalize(localeList: LocaleList = LocaleList.current): AnnotatedString {
@@ -986,17 +957,16 @@
 /**
  * Create capitalized [AnnotatedString]
  *
- * The decapitalization sometimes maps different number of characters. This function adjusts
- * the text style and paragraph style ranges to transformed offset.
+ * The decapitalization sometimes maps different number of characters. This function adjusts the
+ * text style and paragraph style ranges to transformed offset.
  *
  * Note, if the style's offset is middle of the decapitalization context, this function won't
  * transform the character, e.g. style starts from between base alphabet character and accent
  * character.
  *
  * @param localeList A locale list used for decapitalize mapping. Only the first locale is
- *                   effective. If empty locale list is passed, use the current locale instead.
- *                   Note that, this locale is currently ignored since underlying Kotlin method
- *                   is experimental.
+ *   effective. If empty locale list is passed, use the current locale instead. Note that, this
+ *   locale is currently ignored since underlying Kotlin method is experimental.
  * @return A decapitalized string.
  */
 fun AnnotatedString.decapitalize(localeList: LocaleList = LocaleList.current): AnnotatedString {
@@ -1026,16 +996,11 @@
  *
  * @param style [SpanStyle] to be applied
  * @param block function to be executed
- *
  * @return result of the [block]
- *
  * @see AnnotatedString.Builder.pushStyle
  * @see AnnotatedString.Builder.pop
  */
-inline fun <R : Any> Builder.withStyle(
-    style: SpanStyle,
-    block: Builder.() -> R
-): R {
+inline fun <R : Any> Builder.withStyle(style: SpanStyle, block: Builder.() -> R): R {
     val index = pushStyle(style)
     return try {
         block(this)
@@ -1051,9 +1016,7 @@
  *
  * @param style [SpanStyle] to be applied
  * @param block function to be executed
- *
  * @return result of the [block]
- *
  * @see AnnotatedString.Builder.pushStyle
  * @see AnnotatedString.Builder.pop
  */
@@ -1076,9 +1039,7 @@
  * @param tag the tag used to distinguish annotations
  * @param annotation the string annotation attached on this AnnotatedString
  * @param block function to be executed
- *
  * @return result of the [block]
- *
  * @see AnnotatedString.Builder.pushStringAnnotation
  * @see AnnotatedString.Builder.pop
  */
@@ -1101,11 +1062,9 @@
  * annotation.
  *
  * @param ttsAnnotation an object that stores text to speech metadata that intended for the TTS
- * engine.
+ *   engine.
  * @param block function to be executed
- *
  * @return result of the [block]
- *
  * @see AnnotatedString.Builder.pushStringAnnotation
  * @see AnnotatedString.Builder.pop
  */
@@ -1128,16 +1087,12 @@
  *
  * @param urlAnnotation A [UrlAnnotation] object that stores the URL being linked to.
  * @param block function to be executed
- *
  * @return result of the [block]
- *
  * @see AnnotatedString.Builder.pushStringAnnotation
  * @see AnnotatedString.Builder.pop
  */
 @ExperimentalTextApi
-@Deprecated("Use LinkAnnotation API for links instead",
-    ReplaceWith("withLink(, block)")
-)
+@Deprecated("Use LinkAnnotation API for links instead", ReplaceWith("withLink(, block)"))
 @Suppress("Deprecation")
 inline fun <R : Any> Builder.withAnnotation(
     urlAnnotation: UrlAnnotation,
@@ -1157,18 +1112,15 @@
  *
  * @param link A [LinkAnnotation] object representing a clickable part of the text
  * @param block function to be executed
- *
  * @return result of the [block]
  *
  * @sample androidx.compose.ui.text.samples.AnnotatedStringWithLinkSample
- * @sample androidx.compose.ui.text.samples.AnnotatedStringWithHoveredLinkStylingSample
- * @sample androidx.compose.ui.text.samples.AnnotatedStringWithListenerSample
  *
+ * @sample androidx.compose.ui.text.samples.AnnotatedStringWithHoveredLinkStylingSample
+ *
+ * @sample androidx.compose.ui.text.samples.AnnotatedStringWithListenerSample
  */
-inline fun <R : Any> Builder.withLink(
-    link: LinkAnnotation,
-    block: Builder.() -> R
-): R {
+inline fun <R : Any> Builder.withLink(link: LinkAnnotation, block: Builder.() -> R): R {
     val index = pushLink(link)
     return try {
         block(this)
@@ -1188,14 +1140,17 @@
     require(start <= end) { "start ($start) should be less than or equal to end ($end)" }
     val nonNullRange = ranges ?: return null
 
-    return nonNullRange.fastFilter { intersect(start, end, it.start, it.end) }.fastMap {
-        Range(
-            item = it.item,
-            start = maxOf(start, it.start) - start,
-            end = minOf(end, it.end) - start,
-            tag = it.tag
-        )
-    }.ifEmpty { null }
+    return nonNullRange
+        .fastFilter { intersect(start, end, it.start, it.end) }
+        .fastMap {
+            Range(
+                item = it.item,
+                start = maxOf(start, it.start) - start,
+                end = minOf(end, it.end) - start,
+                tag = it.tag
+            )
+        }
+        .ifEmpty { null }
 }
 
 /**
@@ -1208,29 +1163,24 @@
     text: String,
     spanStyle: SpanStyle,
     paragraphStyle: ParagraphStyle? = null
-): AnnotatedString = AnnotatedString(
-    text,
-    listOf(Range(spanStyle, 0, text.length)),
-    if (paragraphStyle == null) listOf() else listOf(Range(paragraphStyle, 0, text.length))
-)
+): AnnotatedString =
+    AnnotatedString(
+        text,
+        listOf(Range(spanStyle, 0, text.length)),
+        if (paragraphStyle == null) listOf() else listOf(Range(paragraphStyle, 0, text.length))
+    )
 
 /**
  * Create an AnnotatedString with a [paragraphStyle] that will apply to the whole text.
  *
  * @param paragraphStyle [ParagraphStyle] to be applied to whole text
  */
-fun AnnotatedString(
-    text: String,
-    paragraphStyle: ParagraphStyle
-): AnnotatedString = AnnotatedString(
-    text,
-    listOf(),
-    listOf(Range(paragraphStyle, 0, text.length))
-)
+fun AnnotatedString(text: String, paragraphStyle: ParagraphStyle): AnnotatedString =
+    AnnotatedString(text, listOf(), listOf(Range(paragraphStyle, 0, text.length)))
 
 /**
- * Build a new AnnotatedString by populating newly created [AnnotatedString.Builder] provided
- * by [builder].
+ * Build a new AnnotatedString by populating newly created [AnnotatedString.Builder] provided by
+ * [builder].
  *
  * @sample androidx.compose.ui.text.samples.AnnotatedStringBuilderLambdaSample
  *
@@ -1240,29 +1190,28 @@
     Builder().apply(builder).toAnnotatedString()
 
 /**
- * Helper function that checks if the range [baseStart, baseEnd) contains the range
- * [targetStart, targetEnd).
+ * Helper function that checks if the range [baseStart, baseEnd) contains the range [targetStart,
+ * targetEnd).
  *
- * @return true if [baseStart, baseEnd) contains [targetStart, targetEnd), vice versa.
- * When [baseStart]==[baseEnd] it return true iff [targetStart]==[targetEnd]==[baseStart].
+ * @return true if
+ *   [baseStart, baseEnd) contains [targetStart, targetEnd), vice versa. When [baseStart]==[baseEnd]
+ *   it return true iff [targetStart]==[targetEnd]==[baseStart].
  */
 internal fun contains(baseStart: Int, baseEnd: Int, targetStart: Int, targetEnd: Int) =
     (baseStart <= targetStart && targetEnd <= baseEnd) &&
         (baseEnd != targetEnd || (targetStart == targetEnd) == (baseStart == baseEnd))
 
 /**
- * Helper function that checks if the range [lStart, lEnd) intersects with the range
- * [rStart, rEnd).
+ * Helper function that checks if the range [lStart, lEnd) intersects with the range [rStart, rEnd).
  *
  * @return [lStart, lEnd) intersects with range [rStart, rEnd), vice versa.
  */
 internal fun intersect(lStart: Int, lEnd: Int, rStart: Int, rEnd: Int) =
     maxOf(lStart, rStart) < minOf(lEnd, rEnd) ||
-        contains(lStart, lEnd, rStart, rEnd) || contains(rStart, rEnd, lStart, lEnd)
+        contains(lStart, lEnd, rStart, rEnd) ||
+        contains(rStart, rEnd, lStart, lEnd)
 
 private val EmptyAnnotatedString: AnnotatedString = AnnotatedString("")
 
-/**
- * Returns an AnnotatedString with empty text and no annotations.
- */
+/** Returns an AnnotatedString with empty text and no annotations. */
 internal fun emptyAnnotatedString() = EmptyAnnotatedString
diff --git a/compose/ui/ui-text/src/commonMain/kotlin/androidx/compose/ui/text/AtomicReference.kt b/compose/ui/ui-text/src/commonMain/kotlin/androidx/compose/ui/text/AtomicReference.kt
index 29974ee..e2c2f80 100644
--- a/compose/ui/ui-text/src/commonMain/kotlin/androidx/compose/ui/text/AtomicReference.kt
+++ b/compose/ui/ui-text/src/commonMain/kotlin/androidx/compose/ui/text/AtomicReference.kt
@@ -20,7 +20,10 @@
 
 internal expect class AtomicReference<V>(value: V) {
     fun get(): V
+
     fun set(value: V)
+
     fun getAndSet(value: V): V
+
     fun compareAndSet(expect: V, newValue: V): Boolean
 }
diff --git a/compose/ui/ui-text/src/commonMain/kotlin/androidx/compose/ui/text/Html.kt b/compose/ui/ui-text/src/commonMain/kotlin/androidx/compose/ui/text/Html.kt
index 757d634..4e94577 100644
--- a/compose/ui/ui-text/src/commonMain/kotlin/androidx/compose/ui/text/Html.kt
+++ b/compose/ui/ui-text/src/commonMain/kotlin/androidx/compose/ui/text/Html.kt
@@ -19,8 +19,8 @@
 /**
  * Converts a string with HTML tags into [AnnotatedString].
  *
- * If you define your string in the resources, make sure to use HTML-escaped opening brackets
- * "&lt;" instead of "<".
+ * If you define your string in the resources, make sure to use HTML-escaped opening brackets "&lt;"
+ * instead of "<".
  *
  * For a list of supported tags go check
  * [Styling with HTML markup](https://developer.android.com/guide/topics/resources/string-resource#StylingWithHTML)
@@ -28,23 +28,23 @@
  *
  * @param htmlString HTML-tagged string to be parsed to construct AnnotatedString
  * @param linkStyles style configuration to be applied to links present in the string in different
- * styles
- * @param linkInteractionListener a listener that will be attached to links that are present in
- * the string and triggered when user clicks on those links. When set to null, which is a default,
- * the system will try to open the corresponding links with the
- * [androidx.compose.ui.platform.UriHandler] composition local
+ *   styles
+ * @param linkInteractionListener a listener that will be attached to links that are present in the
+ *   string and triggered when user clicks on those links. When set to null, which is a default, the
+ *   system will try to open the corresponding links with the
+ *   [androidx.compose.ui.platform.UriHandler] composition local
  *
  * Note that any link style passed directly to this method will be merged with the styles set
  * directly on a HTML-tagged string. For example, if you set a color of the link via the span
  * annotation to "red" but also pass a green color via the [linkStyles], the link will be displayed
- * as green. If, however, you pass a green background via the [linkStyles] instead, the link will
- * be displayed as red on a green background.
+ * as green. If, however, you pass a green background via the [linkStyles] instead, the link will be
+ * displayed as red on a green background.
  *
  * Example of displaying styled string from resources
+ *
  * @sample androidx.compose.ui.text.samples.AnnotatedStringFromHtml
  *
  * @see LinkAnnotation
- *
  */
 expect fun AnnotatedString.Companion.fromHtml(
     htmlString: String,
diff --git a/compose/ui/ui-text/src/commonMain/kotlin/androidx/compose/ui/text/InternalTextApi.kt b/compose/ui/ui-text/src/commonMain/kotlin/androidx/compose/ui/text/InternalTextApi.kt
index 0eea1c1..4826089 100644
--- a/compose/ui/ui-text/src/commonMain/kotlin/androidx/compose/ui/text/InternalTextApi.kt
+++ b/compose/ui/ui-text/src/commonMain/kotlin/androidx/compose/ui/text/InternalTextApi.kt
@@ -20,10 +20,6 @@
     level = RequiresOptIn.Level.ERROR,
     message = "This is internal API that may change frequently and without warning."
 )
-@Target(
-    AnnotationTarget.CLASS,
-    AnnotationTarget.FUNCTION,
-    AnnotationTarget.PROPERTY
-)
+@Target(AnnotationTarget.CLASS, AnnotationTarget.FUNCTION, AnnotationTarget.PROPERTY)
 @Retention(AnnotationRetention.BINARY)
 annotation class InternalTextApi
diff --git a/compose/ui/ui-text/src/commonMain/kotlin/androidx/compose/ui/text/LinkAnnotation.kt b/compose/ui/ui-text/src/commonMain/kotlin/androidx/compose/ui/text/LinkAnnotation.kt
index 3aa24f2..08af0c6 100644
--- a/compose/ui/ui-text/src/commonMain/kotlin/androidx/compose/ui/text/LinkAnnotation.kt
+++ b/compose/ui/ui-text/src/commonMain/kotlin/androidx/compose/ui/text/LinkAnnotation.kt
@@ -16,22 +16,20 @@
 
 package androidx.compose.ui.text
 
-/**
- * An annotation that represents a clickable part of the text.
- */
+/** An annotation that represents a clickable part of the text. */
 abstract class LinkAnnotation private constructor() {
     /** Interaction listener triggered when user interacts with this link. */
     abstract val linkInteractionListener: LinkInteractionListener?
-    /**
-     * Style configuration for this link in different states
-     */
+    /** Style configuration for this link in different states */
     abstract val styles: TextLinkStyles?
+
     /**
-     * An annotation that contains a [url] string. When clicking on the text to which this annotation
-     * is attached, the app will try to open the url using [androidx.compose.ui.platform.UriHandler].
-     * However, if [linkInteractionListener] is provided, its [LinkInteractionListener.onClick]
-     * method will be called instead and so you need to then handle opening url manually (for
-     * example by calling [androidx.compose.ui.platform.UriHandler]).
+     * An annotation that contains a [url] string. When clicking on the text to which this
+     * annotation is attached, the app will try to open the url using
+     * [androidx.compose.ui.platform.UriHandler]. However, if [linkInteractionListener] is provided,
+     * its [LinkInteractionListener.onClick] method will be called instead and so you need to then
+     * handle opening url manually (for example by calling
+     * [androidx.compose.ui.platform.UriHandler]).
      */
     class Url(
         val url: String,
@@ -62,8 +60,8 @@
     }
 
     /**
-     * An annotation that contains a clickable marked with [tag]. When clicking on the text to
-     * which this annotation is attached, the app will trigger a [linkInteractionListener] listener.
+     * An annotation that contains a clickable marked with [tag]. When clicking on the text to which
+     * this annotation is attached, the app will trigger a [linkInteractionListener] listener.
      */
     class Clickable(
         val tag: String,
diff --git a/compose/ui/ui-text/src/commonMain/kotlin/androidx/compose/ui/text/LinkInteractionListener.kt b/compose/ui/ui-text/src/commonMain/kotlin/androidx/compose/ui/text/LinkInteractionListener.kt
index dc1aa74..4eaffbf 100644
--- a/compose/ui/ui-text/src/commonMain/kotlin/androidx/compose/ui/text/LinkInteractionListener.kt
+++ b/compose/ui/ui-text/src/commonMain/kotlin/androidx/compose/ui/text/LinkInteractionListener.kt
@@ -16,9 +16,7 @@
 
 package androidx.compose.ui.text
 
-/**
- * An interface triggered when a user interacts with a link in the text
- */
+/** An interface triggered when a user interacts with a link in the text */
 fun interface LinkInteractionListener {
 
     /** Triggered when a user clicks on the [link] */
diff --git a/compose/ui/ui-text/src/commonMain/kotlin/androidx/compose/ui/text/MultiParagraph.kt b/compose/ui/ui-text/src/commonMain/kotlin/androidx/compose/ui/text/MultiParagraph.kt
index 6ed5eea..6d265c5 100644
--- a/compose/ui/ui-text/src/commonMain/kotlin/androidx/compose/ui/text/MultiParagraph.kt
+++ b/compose/ui/ui-text/src/commonMain/kotlin/androidx/compose/ui/text/MultiParagraph.kt
@@ -44,10 +44,9 @@
  * [ParagraphStyle]s in a given text.
  *
  * @param intrinsics previously calculated text intrinsics
- * @param constraints how wide and tall the text is allowed to be. [Constraints.maxWidth]
- * will define the width of the MultiParagraph. [Constraints.maxHeight] helps defining the
- * number of lines that fit with ellipsis is true. Minimum components of the [Constraints]
- * object are no-op.
+ * @param constraints how wide and tall the text is allowed to be. [Constraints.maxWidth] will
+ *   define the width of the MultiParagraph. [Constraints.maxHeight] helps defining the number of
+ *   lines that fit with ellipsis is true. Minimum components of the [Constraints] object are no-op.
  * @param maxLines the maximum number of lines that the text can have
  * @param ellipsis whether to ellipsize text, applied only when [maxLines] is set
  */
@@ -81,37 +80,35 @@
         maxLines: Int = DefaultMaxLines,
         ellipsis: Boolean = false,
         width: Float
-    ) : this(
-        intrinsics,
-        Constraints(maxWidth = width.ceilToInt()),
-        maxLines,
-        ellipsis
-    )
+    ) : this(intrinsics, Constraints(maxWidth = width.ceilToInt()), maxLines, ellipsis)
 
     /**
-     *  Lays out a given [annotatedString] with the given constraints. Unlike a [Paragraph],
-     *  [MultiParagraph] can handle a text what has multiple paragraph styles.
+     * Lays out a given [annotatedString] with the given constraints. Unlike a [Paragraph],
+     * [MultiParagraph] can handle a text what has multiple paragraph styles.
      *
      * @param annotatedString the text to be laid out
      * @param style the [TextStyle] to be applied to the whole text
      * @param placeholders a list of [Placeholder]s that specify ranges of text which will be
-     * skipped during layout and replaced with [Placeholder]. It's required that the range of each
-     * [Placeholder] doesn't cross paragraph boundary, otherwise [IllegalArgumentException] is
-     * thrown.
+     *   skipped during layout and replaced with [Placeholder]. It's required that the range of each
+     *   [Placeholder] doesn't cross paragraph boundary, otherwise [IllegalArgumentException] is
+     *   thrown.
      * @param maxLines the maximum number of lines that the text can have
      * @param ellipsis whether to ellipsize text, applied only when [maxLines] is set
      * @param width how wide the text is allowed to be
      * @param density density of the device
      * @param resourceLoader [Font.ResourceLoader] to be used to load the font given in [SpanStyle]s
-     *
+     * @throws IllegalArgumentException if [ParagraphStyle.textDirection] is not set, or any of the
+     *   [placeholders] crosses paragraph boundary.
      * @see Placeholder
-     * @throws IllegalArgumentException if [ParagraphStyle.textDirection] is not set, or
-     * any of the [placeholders] crosses paragraph boundary.
      */
     @Suppress("DEPRECATION")
-    @Deprecated("Font.ResourceLoader is deprecated, use fontFamilyResolver instead",
-        replaceWith = ReplaceWith("MultiParagraph(annotatedString, style, " +
-            "placeholders, maxLines, ellipsis, width, density, fontFamilyResolver)")
+    @Deprecated(
+        "Font.ResourceLoader is deprecated, use fontFamilyResolver instead",
+        replaceWith =
+            ReplaceWith(
+                "MultiParagraph(annotatedString, style, " +
+                    "placeholders, maxLines, ellipsis, width, density, fontFamilyResolver)"
+            )
     )
     constructor(
         annotatedString: AnnotatedString,
@@ -123,21 +120,22 @@
         density: Density,
         resourceLoader: Font.ResourceLoader
     ) : this(
-        intrinsics = MultiParagraphIntrinsics(
-            annotatedString = annotatedString,
-            style = style,
-            placeholders = placeholders,
-            density = density,
-            fontFamilyResolver = createFontFamilyResolver(resourceLoader)
-        ),
+        intrinsics =
+            MultiParagraphIntrinsics(
+                annotatedString = annotatedString,
+                style = style,
+                placeholders = placeholders,
+                density = density,
+                fontFamilyResolver = createFontFamilyResolver(resourceLoader)
+            ),
         maxLines = maxLines,
         ellipsis = ellipsis,
         constraints = Constraints(maxWidth = width.ceilToInt())
     )
 
     /**
-     *  Lays out a given [annotatedString] with the given constraints. Unlike a [Paragraph],
-     *  [MultiParagraph] can handle a text what has multiple paragraph styles.
+     * Lays out a given [annotatedString] with the given constraints. Unlike a [Paragraph],
+     * [MultiParagraph] can handle a text what has multiple paragraph styles.
      *
      * @param annotatedString the text to be laid out
      * @param style the [TextStyle] to be applied to the whole text
@@ -145,15 +143,14 @@
      * @param density density of the device
      * @param fontFamilyResolver to be used to load the font given in [SpanStyle]s
      * @param placeholders a list of [Placeholder]s that specify ranges of text which will be
-     * skipped during layout and replaced with [Placeholder]. It's required that the range of each
-     * [Placeholder] doesn't cross paragraph boundary, otherwise [IllegalArgumentException] is
-     * thrown.
+     *   skipped during layout and replaced with [Placeholder]. It's required that the range of each
+     *   [Placeholder] doesn't cross paragraph boundary, otherwise [IllegalArgumentException] is
+     *   thrown.
      * @param maxLines the maximum number of lines that the text can have
      * @param ellipsis whether to ellipsize text, applied only when [maxLines] is set
-     *
+     * @throws IllegalArgumentException if [ParagraphStyle.textDirection] is not set, or any of the
+     *   [placeholders] crosses paragraph boundary.
      * @see Placeholder
-     * @throws IllegalArgumentException if [ParagraphStyle.textDirection] is not set, or
-     * any of the [placeholders] crosses paragraph boundary.
      */
     @Deprecated(
         "MultiParagraph that takes maximum allowed width is deprecated, pass constraints instead.",
@@ -174,40 +171,40 @@
         maxLines: Int = Int.MAX_VALUE,
         ellipsis: Boolean = false
     ) : this(
-        intrinsics = MultiParagraphIntrinsics(
-            annotatedString = annotatedString,
-            style = style,
-            placeholders = placeholders,
-            density = density,
-            fontFamilyResolver = fontFamilyResolver
-        ),
+        intrinsics =
+            MultiParagraphIntrinsics(
+                annotatedString = annotatedString,
+                style = style,
+                placeholders = placeholders,
+                density = density,
+                fontFamilyResolver = fontFamilyResolver
+            ),
         maxLines = maxLines,
         ellipsis = ellipsis,
         constraints = Constraints(maxWidth = width.ceilToInt())
     )
 
     /**
-     *  Lays out a given [annotatedString] with the given constraints. Unlike a [Paragraph],
-     *  [MultiParagraph] can handle a text what has multiple paragraph styles.
+     * Lays out a given [annotatedString] with the given constraints. Unlike a [Paragraph],
+     * [MultiParagraph] can handle a text what has multiple paragraph styles.
      *
      * @param annotatedString the text to be laid out
      * @param style the [TextStyle] to be applied to the whole text
-     * @param constraints how wide and tall the text is allowed to be. [Constraints.maxWidth]
-     * will define the width of the MultiParagraph. [Constraints.maxHeight] helps defining the
-     * number of lines that fit with ellipsis is true. Minimum components of the [Constraints]
-     * object are no-op.
+     * @param constraints how wide and tall the text is allowed to be. [Constraints.maxWidth] will
+     *   define the width of the MultiParagraph. [Constraints.maxHeight] helps defining the number
+     *   of lines that fit with ellipsis is true. Minimum components of the [Constraints] object are
+     *   no-op.
      * @param density density of the device
      * @param fontFamilyResolver to be used to load the font given in [SpanStyle]s
      * @param placeholders a list of [Placeholder]s that specify ranges of text which will be
-     * skipped during layout and replaced with [Placeholder]. It's required that the range of each
-     * [Placeholder] doesn't cross paragraph boundary, otherwise [IllegalArgumentException] is
-     * thrown.
+     *   skipped during layout and replaced with [Placeholder]. It's required that the range of each
+     *   [Placeholder] doesn't cross paragraph boundary, otherwise [IllegalArgumentException] is
+     *   thrown.
      * @param maxLines the maximum number of lines that the text can have
      * @param ellipsis whether to ellipsize text, applied only when [maxLines] is set
-     *
+     * @throws IllegalArgumentException if [ParagraphStyle.textDirection] is not set, or any of the
+     *   [placeholders] crosses paragraph boundary.
      * @see Placeholder
-     * @throws IllegalArgumentException if [ParagraphStyle.textDirection] is not set, or
-     * any of the [placeholders] crosses paragraph boundary.
      */
     constructor(
         annotatedString: AnnotatedString,
@@ -219,42 +216,38 @@
         maxLines: Int = Int.MAX_VALUE,
         ellipsis: Boolean = false
     ) : this(
-        intrinsics = MultiParagraphIntrinsics(
-            annotatedString = annotatedString,
-            style = style,
-            placeholders = placeholders,
-            density = density,
-            fontFamilyResolver = fontFamilyResolver
-        ),
+        intrinsics =
+            MultiParagraphIntrinsics(
+                annotatedString = annotatedString,
+                style = style,
+                placeholders = placeholders,
+                density = density,
+                fontFamilyResolver = fontFamilyResolver
+            ),
         maxLines = maxLines,
         ellipsis = ellipsis,
         constraints = constraints
     )
 
-    private val annotatedString get() = intrinsics.annotatedString
+    private val annotatedString
+        get() = intrinsics.annotatedString
+
+    /** The width for text if all soft wrap opportunities were taken. */
+    val minIntrinsicWidth: Float
+        get() = intrinsics.minIntrinsicWidth
+
+    /** Returns the smallest width beyond which increasing the width never decreases the height. */
+    val maxIntrinsicWidth: Float
+        get() = intrinsics.maxIntrinsicWidth
 
     /**
-     * The width for text if all soft wrap opportunities were taken.
-     */
-    val minIntrinsicWidth: Float get() = intrinsics.minIntrinsicWidth
-
-    /**
-     * Returns the smallest width beyond which increasing the width never
-     * decreases the height.
-     */
-    val maxIntrinsicWidth: Float get() = intrinsics.maxIntrinsicWidth
-
-    /**
-     * True if there is more vertical content, but the text was truncated, either
-     * because we reached `maxLines` lines of text or because the `maxLines` was
-     * null, `ellipsis` was not null, and one of the lines exceeded the width
-     * constraint.
+     * True if there is more vertical content, but the text was truncated, either because we reached
+     * `maxLines` lines of text or because the `maxLines` was null, `ellipsis` was not null, and one
+     * of the lines exceeded the width constraint.
      */
     val didExceedMaxLines: Boolean
 
-    /**
-     * The amount of horizontal space this paragraph occupies.
-     */
+    /** The amount of horizontal space this paragraph occupies. */
     val width: Float
 
     /**
@@ -265,8 +258,8 @@
     val height: Float
 
     /**
-     * The distance from the top of the paragraph to the alphabetic
-     * baseline of the first line, in logical pixels.
+     * The distance from the top of the paragraph to the alphabetic baseline of the first line, in
+     * logical pixels.
      */
     val firstBaseline: Float
         get() {
@@ -278,17 +271,15 @@
         }
 
     /**
-     * The distance from the top of the paragraph to the alphabetic
-     * baseline of the first line, in logical pixels.
+     * The distance from the top of the paragraph to the alphabetic baseline of the first line, in
+     * logical pixels.
      */
     val lastBaseline: Float
         get() {
             return if (paragraphInfoList.isEmpty()) {
                 0f
             } else {
-                with(paragraphInfoList.last()) {
-                    paragraph.lastBaseline.toGlobalYPosition()
-                }
+                with(paragraphInfoList.last()) { paragraph.lastBaseline.toGlobalYPosition() }
             }
         }
 
@@ -298,9 +289,9 @@
     /**
      * The bounding boxes reserved for the input placeholders in this MultiParagraph. Their
      * locations are relative to this MultiParagraph's coordinate. The order of this list
-     * corresponds to that of input placeholders.
-     * Notice that [Rect] in [placeholderRects] is nullable. When [Rect] is null, it indicates
-     * that the corresponding [Placeholder] is ellipsized.
+     * corresponds to that of input placeholders. Notice that [Rect] in [placeholderRects] is
+     * nullable. When [Rect] is null, it indicates that the corresponding [Placeholder] is
+     * ellipsized.
      */
     val placeholderRects: List<Rect?>
 
@@ -322,19 +313,21 @@
         val infoList = intrinsics.infoList
         for (index in infoList.indices) {
             val paragraphInfo = infoList[index]
-            val paragraph = Paragraph(
-                paragraphInfo.intrinsics,
-                Constraints(
-                    maxWidth = constraints.maxWidth,
-                    maxHeight = if (constraints.hasBoundedHeight) {
-                        (constraints.maxHeight - currentHeight.ceilToInt()).coerceAtLeast(0)
-                    } else {
-                        constraints.maxHeight
-                    }
-                ),
-                maxLines - currentLineCount,
-                ellipsis,
-            )
+            val paragraph =
+                Paragraph(
+                    paragraphInfo.intrinsics,
+                    Constraints(
+                        maxWidth = constraints.maxWidth,
+                        maxHeight =
+                            if (constraints.hasBoundedHeight) {
+                                (constraints.maxHeight - currentHeight.ceilToInt()).coerceAtLeast(0)
+                            } else {
+                                constraints.maxHeight
+                            }
+                    ),
+                    maxLines - currentLineCount,
+                    ellipsis,
+                )
 
             val paragraphTop = currentHeight
             val paragraphBottom = currentHeight + paragraph.height
@@ -356,8 +349,9 @@
                 )
             )
 
-            if (paragraph.didExceedMaxLines ||
-                (endLineIndex == maxLines && index != intrinsics.infoList.lastIndex)
+            if (
+                paragraph.didExceedMaxLines ||
+                    (endLineIndex == maxLines && index != intrinsics.infoList.lastIndex)
             ) {
                 didExceedMaxLines = true
                 break
@@ -369,20 +363,22 @@
         this.didExceedMaxLines = didExceedMaxLines
         this.paragraphInfoList = paragraphInfoList
         this.width = constraints.maxWidth.toFloat()
-        this.placeholderRects = paragraphInfoList.fastFlatMap { paragraphInfo ->
-            with(paragraphInfo) {
-                paragraph.placeholderRects.fastMap { it?.toGlobal() }
-            }
-        }.let {
-            // When paragraphs get ellipsized, the size of this list will be smaller than
-            // the input placeholders. In this case, fill this list with null so that it has the
-            // same size as the input placeholders.
-            if (it.size < intrinsics.placeholders.size) {
-                it + List(intrinsics.placeholders.size - it.size) { null }
-            } else {
-                it
-            }
-        }
+        this.placeholderRects =
+            paragraphInfoList
+                .fastFlatMap { paragraphInfo ->
+                    with(paragraphInfo) { paragraph.placeholderRects.fastMap { it?.toGlobal() } }
+                }
+                .let {
+                    // When paragraphs get ellipsized, the size of this list will be smaller than
+                    // the input placeholders. In this case, fill this list with null so that it has
+                    // the
+                    // same size as the input placeholders.
+                    if (it.size < intrinsics.placeholders.size) {
+                        it + List(intrinsics.placeholders.size - it.size) { null }
+                    } else {
+                        it
+                    }
+                }
     }
 
     /** Paint the paragraphs to canvas. */
@@ -447,10 +443,10 @@
         findParagraphsByRange(paragraphInfoList, TextRange(start, end)) { paragraphInfo ->
             with(paragraphInfo) {
                 path.addPath(
-                    path = paragraph.getPathForRange(
-                        start = start.toLocalIndex(),
-                        end = end.toLocalIndex()
-                    ).toGlobal()
+                    path =
+                        paragraph
+                            .getPathForRange(start = start.toLocalIndex(), end = end.toLocalIndex())
+                            .toGlobal()
                 )
             }
         }
@@ -459,9 +455,9 @@
     }
 
     /**
-     * Returns line number closest to the given graphical vertical position.
-     * If you ask for a vertical position before 0, you get 0; if you ask for a vertical position
-     * beyond the last line, you get the last line.
+     * Returns line number closest to the given graphical vertical position. If you ask for a
+     * vertical position before 0, you get 0; if you ask for a vertical position beyond the last
+     * line, you get the last line.
      */
     fun getLineForVerticalPosition(vertical: Float): Int {
         val paragraphIndex = findParagraphByY(paragraphInfoList, vertical)
@@ -469,9 +465,9 @@
             if (length == 0) {
                 startLineIndex
             } else {
-                paragraph.getLineForVerticalPosition(
-                    vertical.toLocalYPosition()
-                ).toGlobalLineIndex()
+                paragraph
+                    .getLineForVerticalPosition(vertical.toLocalYPosition())
+                    .toGlobalLineIndex()
             }
         }
     }
@@ -489,23 +485,22 @@
     }
 
     /**
-     * Find the range of text which is inside the specified [rect].
-     * This method will break text into small text segments based on the given [granularity] such as
-     * character or word. It also support different [inclusionStrategy], which determines when a
-     * small text segments is considered as inside the [rect].
-     * Note that the word/character breaking is both operating system and language dependent.
-     * In the certain cases, the text may be break into smaller segments than the specified the
-     * [granularity].
-     * If a text segment spans multiple lines or multiple directional runs (e.g. a hyphenated word),
-     * the text segment is divided into pieces at the line and run breaks, then the text segment is
-     * considered to be inside the area if any of its pieces are inside the area.
+     * Find the range of text which is inside the specified [rect]. This method will break text into
+     * small text segments based on the given [granularity] such as character or word. It also
+     * support different [inclusionStrategy], which determines when a small text segments is
+     * considered as inside the [rect]. Note that the word/character breaking is both operating
+     * system and language dependent. In the certain cases, the text may be break into smaller
+     * segments than the specified the [granularity]. If a text segment spans multiple lines or
+     * multiple directional runs (e.g. a hyphenated word), the text segment is divided into pieces
+     * at the line and run breaks, then the text segment is considered to be inside the area if any
+     * of its pieces are inside the area.
      *
      * @param rect the rectangle area in which the text range will be found.
      * @param granularity the granularity of the text, it controls how text is segmented.
      * @param inclusionStrategy the strategy that determines whether a range of text's bounds is
-     * inside the given [rect] or not.
+     *   inside the given [rect] or not.
      * @return the [TextRange] that is inside the given [rect], or [TextRange.Zero] if no text is
-     * found.
+     *   found.
      */
     fun getRangeForRect(
         rect: Rect,
@@ -514,14 +509,12 @@
     ): TextRange {
         var firstParagraph = findParagraphByY(paragraphInfoList, rect.top)
         // The first paragraph contains the entire rect, return early in this case.
-        if (paragraphInfoList[firstParagraph].bottom >= rect.bottom ||
-            firstParagraph == paragraphInfoList.lastIndex) {
+        if (
+            paragraphInfoList[firstParagraph].bottom >= rect.bottom ||
+                firstParagraph == paragraphInfoList.lastIndex
+        ) {
             return with(paragraphInfoList[firstParagraph]) {
-                paragraph.getRangeForRect(
-                    rect.toLocal(),
-                    granularity,
-                    inclusionStrategy
-                ).toGlobal()
+                paragraph.getRangeForRect(rect.toLocal(), granularity, inclusionStrategy).toGlobal()
             }
         }
 
@@ -529,13 +522,12 @@
 
         var startRange: TextRange = TextRange.Zero
         while (startRange == TextRange.Zero && firstParagraph <= lastParagraph) {
-            startRange = with(paragraphInfoList[firstParagraph]) {
-                paragraph.getRangeForRect(
-                    rect.toLocal(),
-                    granularity,
-                    inclusionStrategy
-                ).toGlobal()
-            }
+            startRange =
+                with(paragraphInfoList[firstParagraph]) {
+                    paragraph
+                        .getRangeForRect(rect.toLocal(), granularity, inclusionStrategy)
+                        .toGlobal()
+                }
             ++firstParagraph
         }
 
@@ -545,13 +537,12 @@
 
         var endRange: TextRange = TextRange.Zero
         while (endRange == TextRange.Zero && firstParagraph <= lastParagraph) {
-            endRange = with(paragraphInfoList[lastParagraph]) {
-                paragraph.getRangeForRect(
-                    rect.toLocal(),
-                    granularity,
-                    inclusionStrategy
-                ).toGlobal()
-            }
+            endRange =
+                with(paragraphInfoList[lastParagraph]) {
+                    paragraph
+                        .getRangeForRect(rect.toLocal(), granularity, inclusionStrategy)
+                        .toGlobal()
+                }
             --lastParagraph
         }
 
@@ -560,8 +551,8 @@
     }
 
     /**
-     * Returns the bounding box as Rect of the character for given character offset. Rect
-     * includes the top, bottom, left and right of a character.
+     * Returns the bounding box as Rect of the character for given character offset. Rect includes
+     * the top, bottom, left and right of a character.
      */
     fun getBoundingBox(offset: Int): Rect {
         requireIndexInRange(offset)
@@ -593,9 +584,9 @@
      *
      * @param range the [TextRange] representing the start and end indices in the [Paragraph].
      * @param array the array to fill in the values. The array divided into segments of four where
-     * each index in that segment represents left, top, right, bottom of the character.
+     *   each index in that segment represents left, top, right, bottom of the character.
      * @param arrayStart the inclusive start index in the array where the function will start
-     * filling in the values from
+     *   filling in the values from
      */
     fun fillBoundingBoxes(
         range: TextRange,
@@ -611,10 +602,8 @@
             with(paragraphInfo) {
                 val paragraphStart = if (startIndex > range.min) startIndex else range.min
                 val paragraphEnd = if (endIndex < range.max) endIndex else range.max
-                val finalRange = TextRange(
-                    paragraphStart.toLocalIndex(),
-                    paragraphEnd.toLocalIndex()
-                )
+                val finalRange =
+                    TextRange(paragraphStart.toLocalIndex(), paragraphEnd.toLocalIndex())
                 paragraph.fillBoundingBoxes(finalRange, array, currentArrayStart)
                 val currentArrayEnd = currentArrayStart + finalRange.length * 4
                 var arrayIndex = currentArrayStart
@@ -637,6 +626,7 @@
      *
      * If the inserted character at [offset] is within a LTR/RTL run, the returned position will be
      * the left(right) edge of the character.
+     *
      * ```
      * For example:
      *     Paragraph's direction is LTR.
@@ -644,9 +634,11 @@
      *     Text in visual order:              L0 L1 L2 R5 R4 R3
      *         position of the offset(2):          |
      *         position of the offset(4):                   |
-     *```
+     * ```
+     *
      * However, when the [offset] is at the BiDi transition offset, there will be two possible
      * visual positions, which depends on the direction of the inserted character.
+     *
      * ```
      * For example:
      *     Paragraph's direction is LTR.
@@ -654,11 +646,13 @@
      *     Text in visual order:              L0 L1 L2 R5 R4 R3
      *         position of the offset(3):             |           (The inserted character is LTR)
      *                                                         |  (The inserted character is RTL)
-     *```
+     * ```
+     *
      * In this case, [usePrimaryDirection] will be used to resolve the ambiguity. If true, the
-     * inserted character's direction is assumed to be the same as Paragraph's direction.
-     * Otherwise, the inserted character's direction is assumed to be the opposite of the
-     * Paragraph's direction.
+     * inserted character's direction is assumed to be the same as Paragraph's direction. Otherwise,
+     * the inserted character's direction is assumed to be the opposite of the Paragraph's
+     * direction.
+     *
      * ```
      * For example:
      *     Paragraph's direction is LTR.
@@ -666,56 +660,56 @@
      *     Text in visual order:              L0 L1 L2 R5 R4 R3
      *         position of the offset(3):             |           (usePrimaryDirection is true)
      *                                                         |  (usePrimaryDirection is false)
-     *```
+     * ```
+     *
      * This method is useful to compute cursor position.
      *
      * @param offset the offset of the character, in the range of [0, length].
-     * @param usePrimaryDirection whether the paragraph direction is respected when [offset]
-     * points to a BiDi transition point.
+     * @param usePrimaryDirection whether the paragraph direction is respected when [offset] points
+     *   to a BiDi transition point.
      * @return a float number representing the horizontal position in the unit of pixel.
      */
     fun getHorizontalPosition(offset: Int, usePrimaryDirection: Boolean): Float {
         requireIndexInRangeInclusiveEnd(offset)
 
-        val paragraphIndex = if (offset == annotatedString.length) {
-            paragraphInfoList.lastIndex
-        } else {
-            findParagraphByIndex(paragraphInfoList, offset)
-        }
+        val paragraphIndex =
+            if (offset == annotatedString.length) {
+                paragraphInfoList.lastIndex
+            } else {
+                findParagraphByIndex(paragraphInfoList, offset)
+            }
 
         return with(paragraphInfoList[paragraphIndex]) {
             paragraph.getHorizontalPosition(offset.toLocalIndex(), usePrimaryDirection)
         }
     }
 
-    /**
-     * Get the text direction of the paragraph containing the given offset.
-     */
+    /** Get the text direction of the paragraph containing the given offset. */
     fun getParagraphDirection(offset: Int): ResolvedTextDirection {
         requireIndexInRangeInclusiveEnd(offset)
 
-        val paragraphIndex = if (offset == annotatedString.length) {
-            paragraphInfoList.lastIndex
-        } else {
-            findParagraphByIndex(paragraphInfoList, offset)
-        }
+        val paragraphIndex =
+            if (offset == annotatedString.length) {
+                paragraphInfoList.lastIndex
+            } else {
+                findParagraphByIndex(paragraphInfoList, offset)
+            }
 
         return with(paragraphInfoList[paragraphIndex]) {
             paragraph.getParagraphDirection(offset.toLocalIndex())
         }
     }
 
-    /**
-     * Get the text direction of the character at the given offset.
-     */
+    /** Get the text direction of the character at the given offset. */
     fun getBidiRunDirection(offset: Int): ResolvedTextDirection {
         requireIndexInRangeInclusiveEnd(offset)
 
-        val paragraphIndex = if (offset == annotatedString.length) {
-            paragraphInfoList.lastIndex
-        } else {
-            findParagraphByIndex(paragraphInfoList, offset)
-        }
+        val paragraphIndex =
+            if (offset == annotatedString.length) {
+                paragraphInfoList.lastIndex
+            } else {
+                findParagraphByIndex(paragraphInfoList, offset)
+            }
 
         return with(paragraphInfoList[paragraphIndex]) {
             paragraph.getBidiRunDirection(offset.toLocalIndex())
@@ -723,20 +717,20 @@
     }
 
     /**
-     * Returns the TextRange of the word at the given character offset. Characters not
-     * part of a word, such as spaces, symbols, and punctuation, have word breaks
-     * on both sides. In such cases, this method will return TextRange(offset, offset+1).
-     * Word boundaries are defined more precisely in Unicode Standard Annex #29
-     * http://www.unicode.org/reports/tr29/#Word_Boundaries
+     * Returns the TextRange of the word at the given character offset. Characters not part of a
+     * word, such as spaces, symbols, and punctuation, have word breaks on both sides. In such
+     * cases, this method will return TextRange(offset, offset+1). Word boundaries are defined more
+     * precisely in Unicode Standard Annex #29 http://www.unicode.org/reports/tr29/#Word_Boundaries
      */
     fun getWordBoundary(offset: Int): TextRange {
         requireIndexInRangeInclusiveEnd(offset)
 
-        val paragraphIndex = if (offset == annotatedString.length) {
-            paragraphInfoList.lastIndex
-        } else {
-            findParagraphByIndex(paragraphInfoList, offset)
-        }
+        val paragraphIndex =
+            if (offset == annotatedString.length) {
+                paragraphInfoList.lastIndex
+            } else {
+                findParagraphByIndex(paragraphInfoList, offset)
+            }
 
         return with(paragraphInfoList[paragraphIndex]) {
             paragraph.getWordBoundary(offset.toLocalIndex()).toGlobal(treatZeroAsNull = false)
@@ -747,11 +741,12 @@
     fun getCursorRect(offset: Int): Rect {
         requireIndexInRangeInclusiveEnd(offset)
 
-        val paragraphIndex = if (offset == annotatedString.length) {
-            paragraphInfoList.lastIndex
-        } else {
-            findParagraphByIndex(paragraphInfoList, offset)
-        }
+        val paragraphIndex =
+            if (offset == annotatedString.length) {
+                paragraphInfoList.lastIndex
+            } else {
+                findParagraphByIndex(paragraphInfoList, offset)
+            }
 
         return with(paragraphInfoList[paragraphIndex]) {
             paragraph.getCursorRect(offset.toLocalIndex()).toGlobal()
@@ -759,18 +754,19 @@
     }
 
     /**
-     * Returns the line number on which the specified text offset appears.
-     * If you ask for a position before 0, you get 0; if you ask for a position
-     * beyond the end of the text, you get the last line.
+     * Returns the line number on which the specified text offset appears. If you ask for a position
+     * before 0, you get 0; if you ask for a position beyond the end of the text, you get the last
+     * line.
      */
     fun getLineForOffset(offset: Int): Int {
-        val paragraphIndex = if (offset >= annotatedString.length) {
-            paragraphInfoList.lastIndex
-        } else if (offset < 0) {
-            0
-        } else {
-            findParagraphByIndex(paragraphInfoList, offset)
-        }
+        val paragraphIndex =
+            if (offset >= annotatedString.length) {
+                paragraphInfoList.lastIndex
+            } else if (offset < 0) {
+                0
+            } else {
+                findParagraphByIndex(paragraphInfoList, offset)
+            }
         return with(paragraphInfoList[paragraphIndex]) {
             paragraph.getLineForOffset(offset.toLocalIndex()).toGlobalLineIndex()
         }
@@ -810,8 +806,8 @@
     }
 
     /**
-     * Returns the distance from the top of the [MultiParagraph] to the alphabetic
-     * baseline of the given line.
+     * Returns the distance from the top of the [MultiParagraph] to the alphabetic baseline of the
+     * given line.
      */
     fun getLineBaseline(lineIndex: Int): Float {
         requireLineIndexInRange(lineIndex)
@@ -875,8 +871,8 @@
      *
      * @param lineIndex the line number
      * @param visibleEnd if true, the returned line end will not count trailing whitespaces or
-     * linefeed characters. Otherwise, this function will return the logical line end. By default
-     * it's false.
+     *   linefeed characters. Otherwise, this function will return the logical line end. By default
+     *   it's false.
      * @return an exclusive end offset of the line.
      */
     fun getLineEnd(lineIndex: Int, visibleEnd: Boolean = false): Int {
@@ -898,9 +894,7 @@
     fun isLineEllipsized(lineIndex: Int): Boolean {
         requireLineIndexInRange(lineIndex)
         val paragraphIndex = findParagraphByLineIndex(paragraphInfoList, lineIndex)
-        return with(paragraphInfoList[paragraphIndex]) {
-            paragraph.isLineEllipsized(lineIndex)
-        }
+        return with(paragraphInfoList[paragraphIndex]) { paragraph.isLineEllipsized(lineIndex) }
     }
 
     private fun requireIndexInRange(offset: Int) {
@@ -926,10 +920,10 @@
  * Given an character index of [MultiParagraph.annotatedString], find the corresponding
  * [ParagraphInfo] which covers the provided index.
  *
- * @param paragraphInfoList The list of [ParagraphInfo] containing the information of each
- *  paragraph in the [MultiParagraph].
- * @param index The target index in the [MultiParagraph]. It should be in the range of
- *  [0, text.length)
+ * @param paragraphInfoList The list of [ParagraphInfo] containing the information of each paragraph
+ *   in the [MultiParagraph].
+ * @param index The target index in the [MultiParagraph]. It should be in the range of [0,
+ *   text.length)
  * @return The index of the target [ParagraphInfo] in [paragraphInfoList].
  */
 internal fun findParagraphByIndex(paragraphInfoList: List<ParagraphInfo>, index: Int): Int {
@@ -946,8 +940,8 @@
  * Given the y graphical position relative to this [MultiParagraph], find the index of the
  * corresponding [ParagraphInfo] which occupies the provided position.
  *
- * @param paragraphInfoList The list of [ParagraphInfo] containing the information of each
- *  paragraph in the [MultiParagraph].
+ * @param paragraphInfoList The list of [ParagraphInfo] containing the information of each paragraph
+ *   in the [MultiParagraph].
  * @param y The y coordinate position relative to the [MultiParagraph].
  * @return The index of the target [ParagraphInfo] in [paragraphInfoList].
  */
@@ -978,13 +972,13 @@
 }
 
 /**
- * Given an line index in [MultiParagraph], find the corresponding [ParagraphInfo] which
- * covers the provided line index.
+ * Given an line index in [MultiParagraph], find the corresponding [ParagraphInfo] which covers the
+ * provided line index.
  *
- * @param paragraphInfoList The list of [ParagraphInfo] containing the information of each
- *  paragraph in the [MultiParagraph].
+ * @param paragraphInfoList The list of [ParagraphInfo] containing the information of each paragraph
+ *   in the [MultiParagraph].
  * @param lineIndex The target line index in the [MultiParagraph], it should be in the range of
- *  [0, [MultiParagraph.lineCount])
+ *   [0, [MultiParagraph.lineCount])
  * @return The index of the target [ParagraphInfo] in [paragraphInfoList].
  */
 internal fun findParagraphByLineIndex(paragraphInfoList: List<ParagraphInfo>, lineIndex: Int): Int {
@@ -1006,12 +1000,7 @@
         val midVal = get(mid)
         val cmp = comparison(midVal)
 
-        if (cmp < 0)
-            low = mid + 1
-        else if (cmp > 0)
-            high = mid - 1
-        else
-            return mid // key found
+        if (cmp < 0) low = mid + 1 else if (cmp > 0) high = mid - 1 else return mid // key found
     }
     return -(low + 1) // key not found
 }
@@ -1025,9 +1014,9 @@
  * @param startIndex The start index of this paragraph in the parent [MultiParagraph], inclusive.
  * @param endIndex The end index of this paragraph in the parent [MultiParagraph], exclusive.
  * @param startLineIndex The start line index of this paragraph in the parent [MultiParagraph],
- *  inclusive.
+ *   inclusive.
  * @param endLineIndex The end line index of this paragraph in the parent [MultiParagraph],
- *  exclusive.
+ *   exclusive.
  * @param top The top position of the [paragraph] relative to the parent [MultiParagraph].
  * @param bottom The bottom position of the [paragraph] relative to the parent [MultiParagraph].
  */
@@ -1041,15 +1030,11 @@
     var bottom: Float = -1.0f
 ) {
 
-    /**
-     * The length of the text in the covered by this paragraph.
-     */
+    /** The length of the text in the covered by this paragraph. */
     val length
         get() = endIndex - startIndex
 
-    /**
-     * Convert an index in the parent [MultiParagraph] to the local index in the [paragraph].
-     */
+    /** Convert an index in the parent [MultiParagraph] to the local index in the [paragraph]. */
     fun Int.toLocalIndex(): Int {
         return this.coerceIn(startIndex, endIndex) - startIndex
     }
@@ -1064,7 +1049,6 @@
     /**
      * Convert a line index in the parent [MultiParagraph] to the local line index in the
      * [paragraph].
-     *
      */
     fun Int.toLocalLineIndex(): Int {
         return this - startLineIndex
@@ -1095,8 +1079,8 @@
     }
 
     /**
-     * Convert a [Offset] relative to the parent [MultiParagraph] to the local [Offset]
-     * relative to the [paragraph].
+     * Convert a [Offset] relative to the parent [MultiParagraph] to the local [Offset] relative to
+     * the [paragraph].
      */
     fun Offset.toLocal(): Offset {
         return Offset(x, y - top)
@@ -1111,8 +1095,8 @@
     }
 
     /**
-     * Convert a [Rect] relative to the parent [MultiParagraph] to the local [Rect] relative to
-     * this [paragraph].
+     * Convert a [Rect] relative to the parent [MultiParagraph] to the local [Rect] relative to this
+     * [paragraph].
      */
     fun Rect.toLocal(): Rect {
         return translate(Offset(0f, -this@ParagraphInfo.top))
@@ -1132,8 +1116,9 @@
     /**
      * Convert a [TextRange] in to the [paragraph] to the [TextRange] in the parent
      * [MultiParagraph].
+     *
      * @param treatZeroAsNull whether [TextRange.Zero] is used represents `null`. When it's true,
-     * [TextRange.Zero] is not mapped to global index and is returned directly.
+     *   [TextRange.Zero] is not mapped to global index and is returned directly.
      */
     fun TextRange.toGlobal(treatZeroAsNull: Boolean = true): TextRange {
         if (treatZeroAsNull && this == TextRange.Zero) {
diff --git a/compose/ui/ui-text/src/commonMain/kotlin/androidx/compose/ui/text/MultiParagraphIntrinsics.kt b/compose/ui/ui-text/src/commonMain/kotlin/androidx/compose/ui/text/MultiParagraphIntrinsics.kt
index a4d967b..2c35bcb 100644
--- a/compose/ui/ui-text/src/commonMain/kotlin/androidx/compose/ui/text/MultiParagraphIntrinsics.kt
+++ b/compose/ui/ui-text/src/commonMain/kotlin/androidx/compose/ui/text/MultiParagraphIntrinsics.kt
@@ -31,17 +31,15 @@
  *
  * @param annotatedString the text to be laid out
  * @param style the [TextStyle] to be applied to the whole text
- * @param placeholders a list of [Placeholder]s that specify ranges of text which will be
- * skipped during layout and replaced with [Placeholder]. It's required that the range of each
- * [Placeholder] doesn't cross paragraph boundary, otherwise [IllegalArgumentException] is thrown.
+ * @param placeholders a list of [Placeholder]s that specify ranges of text which will be skipped
+ *   during layout and replaced with [Placeholder]. It's required that the range of each
+ *   [Placeholder] doesn't cross paragraph boundary, otherwise [IllegalArgumentException] is thrown.
  * @param density density of the device
  * @param fontFamilyResolver [Font.ResourceLoader] to be used to load the font given in [SpanStyle]s
-
+ * @throws IllegalArgumentException if [ParagraphStyle.textDirection] is not set, or any of the
+ *   [placeholders] crosses paragraph boundary.
  * @see MultiParagraph
  * @see Placeholder
- *
- * @throws IllegalArgumentException if [ParagraphStyle.textDirection] is not set, or any
- * of the [placeholders] crosses paragraph boundary.
  */
 class MultiParagraphIntrinsics(
     val annotatedString: AnnotatedString,
@@ -52,9 +50,13 @@
 ) : ParagraphIntrinsics {
 
     @Suppress("DEPRECATION")
-    @Deprecated("Font.ResourceLoader is deprecated, call with fontFamilyResolver",
-        replaceWith = ReplaceWith("MultiParagraphIntrinsics(annotatedString, style, " +
-            "placeholders, density, fontFamilyResolver)")
+    @Deprecated(
+        "Font.ResourceLoader is deprecated, call with fontFamilyResolver",
+        replaceWith =
+            ReplaceWith(
+                "MultiParagraphIntrinsics(annotatedString, style, " +
+                    "placeholders, density, fontFamilyResolver)"
+            )
     )
     constructor(
         annotatedString: AnnotatedString,
@@ -72,45 +74,47 @@
 
     // NOTE(text-perf-review): why are we using lazy here? Are there cases where these
     // calculations aren't executed?
-    override val minIntrinsicWidth: Float by lazy(LazyThreadSafetyMode.NONE) {
-        infoList.fastMaxBy {
-            it.intrinsics.minIntrinsicWidth
-        }?.intrinsics?.minIntrinsicWidth ?: 0f
-    }
+    override val minIntrinsicWidth: Float by
+        lazy(LazyThreadSafetyMode.NONE) {
+            infoList.fastMaxBy { it.intrinsics.minIntrinsicWidth }?.intrinsics?.minIntrinsicWidth
+                ?: 0f
+        }
 
-    override val maxIntrinsicWidth: Float by lazy(LazyThreadSafetyMode.NONE) {
-        infoList.fastMaxBy {
-            it.intrinsics.maxIntrinsicWidth
-        }?.intrinsics?.maxIntrinsicWidth ?: 0f
-    }
+    override val maxIntrinsicWidth: Float by
+        lazy(LazyThreadSafetyMode.NONE) {
+            infoList.fastMaxBy { it.intrinsics.maxIntrinsicWidth }?.intrinsics?.maxIntrinsicWidth
+                ?: 0f
+        }
 
     /**
-     * [ParagraphIntrinsics] for each paragraph included in the [buildAnnotatedString]. For empty string
-     * there will be a single empty paragraph intrinsics info.
+     * [ParagraphIntrinsics] for each paragraph included in the [buildAnnotatedString]. For empty
+     * string there will be a single empty paragraph intrinsics info.
      */
     internal val infoList: List<ParagraphIntrinsicInfo>
 
     init {
         val paragraphStyle = style.toParagraphStyle()
-        infoList = annotatedString
-            .mapEachParagraphStyle(paragraphStyle) { annotatedString, paragraphStyleItem ->
-                val currentParagraphStyle = resolveTextDirection(
-                    paragraphStyleItem.item,
-                    paragraphStyle
-                )
+        infoList =
+            annotatedString.mapEachParagraphStyle(paragraphStyle) {
+                annotatedString,
+                paragraphStyleItem ->
+                val currentParagraphStyle =
+                    resolveTextDirection(paragraphStyleItem.item, paragraphStyle)
 
                 ParagraphIntrinsicInfo(
-                    intrinsics = ParagraphIntrinsics(
-                        text = annotatedString.text,
-                        style = style.merge(currentParagraphStyle),
-                        spanStyles = annotatedString.spanStyles,
-                        placeholders = placeholders.getLocalPlaceholders(
-                            paragraphStyleItem.start,
-                            paragraphStyleItem.end
+                    intrinsics =
+                        ParagraphIntrinsics(
+                            text = annotatedString.text,
+                            style = style.merge(currentParagraphStyle),
+                            spanStyles = annotatedString.spanStyles,
+                            placeholders =
+                                placeholders.getLocalPlaceholders(
+                                    paragraphStyleItem.start,
+                                    paragraphStyleItem.end
+                                ),
+                            density = density,
+                            fontFamilyResolver = fontFamilyResolver
                         ),
-                        density = density,
-                        fontFamilyResolver = fontFamilyResolver
-                    ),
                     startIndex = paragraphStyleItem.start,
                     endIndex = paragraphStyleItem.end
                 )
@@ -121,9 +125,9 @@
         get() = infoList.fastAny { it.intrinsics.hasStaleResolvedFonts }
 
     /**
-     * if the [style] does `not` have [TextDirection] set, it will return a new
-     * [ParagraphStyle] where [TextDirection] is set using the [defaultStyle]. Otherwise
-     * returns the same [style] object.
+     * if the [style] does `not` have [TextDirection] set, it will return a new [ParagraphStyle]
+     * where [TextDirection] is set using the [defaultStyle]. Otherwise returns the same [style]
+     * object.
      *
      * @param style ParagraphStyle to be checked for [TextDirection]
      * @param defaultStyle [ParagraphStyle] passed to [MultiParagraphIntrinsics] as the main style
@@ -132,19 +136,19 @@
         style: ParagraphStyle,
         defaultStyle: ParagraphStyle
     ): ParagraphStyle {
-        return if (style.textDirection != TextDirection.Unspecified) style else style.copy(
-            textDirection = defaultStyle.textDirection
-        )
+        return if (style.textDirection != TextDirection.Unspecified) style
+        else style.copy(textDirection = defaultStyle.textDirection)
     }
 }
 
 private fun List<AnnotatedString.Range<Placeholder>>.getLocalPlaceholders(start: Int, end: Int) =
-    fastFilter { intersect(start, end, it.start, it.end) }.fastMap {
-        require(start <= it.start && it.end <= end) {
-            "placeholder can not overlap with paragraph."
+    fastFilter { intersect(start, end, it.start, it.end) }
+        .fastMap {
+            require(start <= it.start && it.end <= end) {
+                "placeholder can not overlap with paragraph."
+            }
+            AnnotatedString.Range(it.item, it.start - start, it.end - start)
         }
-        AnnotatedString.Range(it.item, it.start - start, it.end - start)
-    }
 
 internal data class ParagraphIntrinsicInfo(
     val intrinsics: ParagraphIntrinsics,
diff --git a/compose/ui/ui-text/src/commonMain/kotlin/androidx/compose/ui/text/Paragraph.kt b/compose/ui/ui-text/src/commonMain/kotlin/androidx/compose/ui/text/Paragraph.kt
index 660cc83..81cec32a 100644
--- a/compose/ui/ui-text/src/commonMain/kotlin/androidx/compose/ui/text/Paragraph.kt
+++ b/compose/ui/ui-text/src/commonMain/kotlin/androidx/compose/ui/text/Paragraph.kt
@@ -47,60 +47,47 @@
  */
 @JvmDefaultWithCompatibility
 expect sealed interface Paragraph {
-    /**
-     * The amount of horizontal space this paragraph occupies.
-     */
+    /** The amount of horizontal space this paragraph occupies. */
     val width: Float
 
-    /**
-     * The amount of vertical space this paragraph occupies.
-     */
+    /** The amount of vertical space this paragraph occupies. */
     val height: Float
 
-    /**
-     * The width for text if all soft wrap opportunities were taken.
-     */
+    /** The width for text if all soft wrap opportunities were taken. */
     val minIntrinsicWidth: Float
 
-    /**
-     * Returns the smallest width beyond which increasing the width never
-     * decreases the height.
-     */
+    /** Returns the smallest width beyond which increasing the width never decreases the height. */
     val maxIntrinsicWidth: Float
 
     /**
-     * The distance from the top of the paragraph to the alphabetic
-     * baseline of the first line, in logical pixels.
+     * The distance from the top of the paragraph to the alphabetic baseline of the first line, in
+     * logical pixels.
      */
     val firstBaseline: Float
 
     /**
-     * The distance from the top of the paragraph to the alphabetic
-     * baseline of the last line, in logical pixels.
+     * The distance from the top of the paragraph to the alphabetic baseline of the last line, in
+     * logical pixels.
      */
     val lastBaseline: Float
 
     /**
-     * True if there is more vertical content, but the text was truncated, either
-     * because we reached `maxLines` lines of text or because the `maxLines` was
-     * null, `ellipsis` was not null, and one of the lines exceeded the width
-     * constraint.
+     * True if there is more vertical content, but the text was truncated, either because we reached
+     * `maxLines` lines of text or because the `maxLines` was null, `ellipsis` was not null, and one
+     * of the lines exceeded the width constraint.
      *
      * See the discussion of the `maxLines` and `ellipsis` arguments at [ParagraphStyle].
      */
     val didExceedMaxLines: Boolean
 
-    /**
-     * The total number of lines in the text.
-     */
+    /** The total number of lines in the text. */
     val lineCount: Int
 
     /**
      * The bounding boxes reserved for the input placeholders in this Paragraphs. Their locations
      * are relative to this Paragraph's coordinate. The order of this list corresponds to that of
-     * input placeholders.
-     * Notice that [Rect] in [placeholderRects] is nullable. When [Rect] is null, it indicates
-     * that the corresponding [Placeholder] is ellipsized.
+     * input placeholders. Notice that [Rect] in [placeholderRects] is nullable. When [Rect] is
+     * null, it indicates that the corresponding [Placeholder] is ellipsized.
      */
     val placeholderRects: List<Rect?>
 
@@ -120,8 +107,8 @@
     fun getLineTop(lineIndex: Int): Float
 
     /**
-     * Returns the distance from the top of the paragraph to the alphabetic
-     * baseline of the given line.
+     * Returns the distance from the top of the paragraph to the alphabetic baseline of the given
+     * line.
      */
     fun getLineBaseline(lineIndex: Int): Float
 
@@ -145,8 +132,8 @@
      *
      * @param lineIndex the line number
      * @param visibleEnd if true, the returned line end will not count trailing whitespaces or
-     * linefeed characters. Otherwise, this function will return the logical line end. By default
-     * it's false.
+     *   linefeed characters. Otherwise, this function will return the logical line end. By default
+     *   it's false.
      * @return an exclusive end offset of the line.
      */
     fun getLineEnd(lineIndex: Int, visibleEnd: Boolean = false): Int
@@ -160,9 +147,9 @@
     fun isLineEllipsized(lineIndex: Int): Boolean
 
     /**
-     * Returns the line number on which the specified text offset appears.
-     * If you ask for a position before 0, you get 0; if you ask for a position
-     * beyond the end of the text, you get the last line.
+     * Returns the line number on which the specified text offset appears. If you ask for a position
+     * before 0, you get 0; if you ask for a position beyond the end of the text, you get the last
+     * line.
      */
     fun getLineForOffset(offset: Int): Int
 
@@ -171,6 +158,7 @@
      *
      * If the inserted character at [offset] is within a LTR/RTL run, the returned position will be
      * the left(right) edge of the character.
+     *
      * ```
      * For example:
      *     Paragraph's direction is LTR.
@@ -178,9 +166,11 @@
      *     Text in visual order:              L0 L1 L2 R5 R4 R3
      *         position of the offset(2):          |
      *         position of the offset(4):                   |
-     *```
+     * ```
+     *
      * However, when the [offset] is at the BiDi transition offset, there will be two possible
      * visual positions, which depends on the direction of the inserted character.
+     *
      * ```
      * For example:
      *     Paragraph's direction is LTR.
@@ -188,11 +178,13 @@
      *     Text in visual order:              L0 L1 L2 R5 R4 R3
      *         position of the offset(3):             |           (The inserted character is LTR)
      *                                                         |  (The inserted character is RTL)
-     *```
+     * ```
+     *
      * In this case, [usePrimaryDirection] will be used to resolve the ambiguity. If true, the
-     * inserted character's direction is assumed to be the same as Paragraph's direction.
-     * Otherwise, the inserted character's direction is assumed to be the opposite of the
-     * Paragraph's direction.
+     * inserted character's direction is assumed to be the same as Paragraph's direction. Otherwise,
+     * the inserted character's direction is assumed to be the opposite of the Paragraph's
+     * direction.
+     *
      * ```
      * For example:
      *     Paragraph's direction is LTR.
@@ -200,30 +192,27 @@
      *     Text in visual order:              L0 L1 L2 R5 R4 R3
      *         position of the offset(3):             |           (usePrimaryDirection is true)
      *                                                         |  (usePrimaryDirection is false)
-     *```
+     * ```
+     *
      * This method is useful to compute cursor position.
      *
      * @param offset the offset of the character, in the range of [0, length].
-     * @param usePrimaryDirection whether the paragraph direction is respected when [offset]
-     * points to a BiDi transition point.
+     * @param usePrimaryDirection whether the paragraph direction is respected when [offset] points
+     *   to a BiDi transition point.
      * @return a float number representing the horizontal position in the unit of pixel.
      */
     fun getHorizontalPosition(offset: Int, usePrimaryDirection: Boolean): Float
 
-    /**
-     * Get the text direction of the paragraph containing the given offset.
-     */
+    /** Get the text direction of the paragraph containing the given offset. */
     fun getParagraphDirection(offset: Int): ResolvedTextDirection
 
-    /**
-     * Get the text direction of the character at the given offset.
-     */
+    /** Get the text direction of the character at the given offset. */
     fun getBidiRunDirection(offset: Int): ResolvedTextDirection
 
     /**
-     * Returns line number closest to the given graphical vertical position.
-     * If you ask for a vertical position before 0, you get 0; if you ask for a vertical position
-     * beyond the last line, you get the last line.
+     * Returns line number closest to the given graphical vertical position. If you ask for a
+     * vertical position before 0, you get 0; if you ask for a vertical position beyond the last
+     * line, you get the last line.
      */
     fun getLineForVerticalPosition(vertical: Float): Int
 
@@ -231,23 +220,22 @@
     fun getOffsetForPosition(position: Offset): Int
 
     /**
-     * Find the range of text which is inside the specified [rect].
-     * This method will break text into small text segments based on the given [granularity] such as
-     * character or word. It also support different [inclusionStrategy], which determines when a
-     * small text segments is considered as inside the [rect].
-     * Note that the word/character breaking is both operating system and language dependent.
-     * In the certain cases, the text may be break into smaller segments than the specified the
-     * [granularity].
-     * If a text segment spans multiple lines or multiple directional runs (e.g. a hyphenated word),
-     * the text segment is divided into pieces at the line and run breaks, then the text segment is
-     * considered to be inside the area if any of its pieces are inside the area.
+     * Find the range of text which is inside the specified [rect]. This method will break text into
+     * small text segments based on the given [granularity] such as character or word. It also
+     * support different [inclusionStrategy], which determines when a small text segments is
+     * considered as inside the [rect]. Note that the word/character breaking is both operating
+     * system and language dependent. In the certain cases, the text may be break into smaller
+     * segments than the specified the [granularity]. If a text segment spans multiple lines or
+     * multiple directional runs (e.g. a hyphenated word), the text segment is divided into pieces
+     * at the line and run breaks, then the text segment is considered to be inside the area if any
+     * of its pieces are inside the area.
      *
      * @param rect the rectangle area in which the text range will be found.
      * @param granularity the granularity of the text, it controls how text is segmented.
      * @param inclusionStrategy the strategy that determines whether a range of text's bounds is
-     * inside the given [rect] or not.
+     *   inside the given [rect] or not.
      * @return the [TextRange] that is inside the given [rect], or [TextRange.Zero] if no text is
-     * found.
+     *   found.
      */
     fun getRangeForRect(
         rect: Rect,
@@ -256,8 +244,8 @@
     ): TextRange
 
     /**
-     * Returns the bounding box as Rect of the character for given character offset. Rect
-     * includes the top, bottom, left and right of a character.
+     * Returns the bounding box as Rect of the character for given character offset. Rect includes
+     * the top, bottom, left and right of a character.
      */
     fun getBoundingBox(offset: Int): Rect
 
@@ -282,40 +270,35 @@
      *
      * @param range the [TextRange] representing the start and end indices in the [Paragraph].
      * @param array the array to fill in the values. The array divided into segments of four where
-     * each index in that segment represents left, top, right, bottom of the character.
+     *   each index in that segment represents left, top, right, bottom of the character.
      * @param arrayStart the inclusive start index in the array where the function will start
-     * filling in the values from
+     *   filling in the values from
      */
-    fun fillBoundingBoxes(
-        range: TextRange,
-        array: FloatArray,
-        @IntRange(from = 0) arrayStart: Int
-    )
+    fun fillBoundingBoxes(range: TextRange, array: FloatArray, @IntRange(from = 0) arrayStart: Int)
 
     /**
-     * Returns the TextRange of the word at the given character offset. Characters not
-     * part of a word, such as spaces, symbols, and punctuation, have word breaks
-     * on both sides. In such cases, this method will return TextRange(offset, offset).
-     * Word boundaries are defined more precisely in Unicode Standard Annex #29
-     * http://www.unicode.org/reports/tr29/#Word_Boundaries
+     * Returns the TextRange of the word at the given character offset. Characters not part of a
+     * word, such as spaces, symbols, and punctuation, have word breaks on both sides. In such
+     * cases, this method will return TextRange(offset, offset). Word boundaries are defined more
+     * precisely in Unicode Standard Annex #29 http://www.unicode.org/reports/tr29/#Word_Boundaries
      */
     fun getWordBoundary(offset: Int): TextRange
 
     /**
      * Draws this paragraph onto given [canvas] while modifying supported draw properties. Any
-     * change caused by overriding parameters are permanent, meaning that they affect the
-     * subsequent paint calls.
+     * change caused by overriding parameters are permanent, meaning that they affect the subsequent
+     * paint calls.
      *
      * @param canvas Canvas to draw this paragraph on.
      * @param color Applies to the default text paint color that's used by this paragraph. Text
-     * color spans are not affected. [Color.Unspecified] is treated as no-op.
+     *   color spans are not affected. [Color.Unspecified] is treated as no-op.
      * @param shadow Applies to the default text paint shadow that's used by this paragraph. Text
-     * shadow spans are not affected. [Shadow.None] removes any existing shadow on this paragraph,
-     * `null` does not change the currently set [Shadow] configuration.
+     *   shadow spans are not affected. [Shadow.None] removes any existing shadow on this paragraph,
+     *   `null` does not change the currently set [Shadow] configuration.
      * @param textDecoration Applies to the default text paint that's used by this paragraph. Spans
-     * that specify a TextDecoration are not affected. [TextDecoration.None] removes any existing
-     * TextDecoration on this paragraph, `null` does not change the currently set [TextDecoration]
-     * configuration.
+     *   that specify a TextDecoration are not affected. [TextDecoration.None] removes any existing
+     *   TextDecoration on this paragraph, `null` does not change the currently set [TextDecoration]
+     *   configuration.
      */
     @Deprecated(
         "Use the new paint function that takes canvas as the only required parameter.",
@@ -330,22 +313,22 @@
 
     /**
      * Draws this paragraph onto given [canvas] while modifying supported draw properties. Any
-     * change caused by overriding parameters are permanent, meaning that they affect the
-     * subsequent paint calls.
+     * change caused by overriding parameters are permanent, meaning that they affect the subsequent
+     * paint calls.
      *
      * @param canvas Canvas to draw this paragraph on.
      * @param color Applies to the default text paint color that's used by this paragraph. Text
-     * color spans are not affected. [Color.Unspecified] is treated as no-op.
+     *   color spans are not affected. [Color.Unspecified] is treated as no-op.
      * @param shadow Applies to the default text paint shadow that's used by this paragraph. Text
-     * shadow spans are not affected. [Shadow.None] removes any existing shadow on this paragraph,
-     * `null` does not change the currently set [Shadow] configuration.
+     *   shadow spans are not affected. [Shadow.None] removes any existing shadow on this paragraph,
+     *   `null` does not change the currently set [Shadow] configuration.
      * @param textDecoration Applies to the default text paint that's used by this paragraph. Spans
-     * that specify a TextDecoration are not affected. [TextDecoration.None] removes any existing
-     * TextDecoration on this paragraph, `null` does not change the currently set [TextDecoration]
-     * configuration.
+     *   that specify a TextDecoration are not affected. [TextDecoration.None] removes any existing
+     *   TextDecoration on this paragraph, `null` does not change the currently set [TextDecoration]
+     *   configuration.
      * @param drawStyle Applies to the default text paint style that's used by this paragraph. Spans
-     * that specify a DrawStyle are not affected. Passing this value as `null` does not change the
-     * currently set DrawStyle.
+     *   that specify a DrawStyle are not affected. Passing this value as `null` does not change the
+     *   currently set DrawStyle.
      * @param blendMode Blending algorithm to be applied to the Paragraph while painting.
      */
     fun paint(
@@ -359,27 +342,27 @@
 
     /**
      * Draws this paragraph onto given [canvas] while modifying supported draw properties. Any
-     * change caused by overriding parameters are permanent, meaning that they affect the
-     * subsequent paint calls.
+     * change caused by overriding parameters are permanent, meaning that they affect the subsequent
+     * paint calls.
      *
      * @param canvas Canvas to draw this paragraph on.
      * @param brush Applies to the default text paint shader that's used by this paragraph. Text
-     * brush spans are not affected. If brush is type of [SolidColor], color's alpha value is
-     * modulated by [alpha] parameter and gets applied as a color. If brush is type of
-     * [ShaderBrush], its internal shader is created using this paragraph's layout size.
+     *   brush spans are not affected. If brush is type of [SolidColor], color's alpha value is
+     *   modulated by [alpha] parameter and gets applied as a color. If brush is type of
+     *   [ShaderBrush], its internal shader is created using this paragraph's layout size.
      * @param alpha Applies to the default text paint alpha that's used by this paragraph. Text
-     * alpha spans are not affected. [Float.NaN] is treated as no-op. All other values are coerced
-     * into [0f, 1f] range.
+     *   alpha spans are not affected. [Float.NaN] is treated as no-op. All other values are coerced
+     *   into [0f, 1f] range.
      * @param shadow Applies to the default text paint shadow that's used by this paragraph. Text
-     * shadow spans are not affected. [Shadow.None] removes any existing shadow on this paragraph,
-     * `null` does not change the currently set [Shadow] configuration.
+     *   shadow spans are not affected. [Shadow.None] removes any existing shadow on this paragraph,
+     *   `null` does not change the currently set [Shadow] configuration.
      * @param textDecoration Applies to the default text paint that's used by this paragraph. Spans
-     * that specify a TextDecoration are not affected. [TextDecoration.None] removes any existing
-     * TextDecoration on this paragraph, `null` does not change the currently set [TextDecoration]
-     * configuration.
+     *   that specify a TextDecoration are not affected. [TextDecoration.None] removes any existing
+     *   TextDecoration on this paragraph, `null` does not change the currently set [TextDecoration]
+     *   configuration.
      * @param drawStyle Applies to the default text paint style that's used by this paragraph. Spans
-     * that specify a DrawStyle are not affected. Passing this value as `null` does not change the
-     * currently set DrawStyle.
+     *   that specify a DrawStyle are not affected. Passing this value as `null` does not change the
+     *   currently set DrawStyle.
      * @param blendMode Blending algorithm to be applied to the Paragraph while painting.
      */
     fun paint(
@@ -403,23 +386,23 @@
  * @param text the text to be laid out
  * @param style the [TextStyle] to be applied to the whole text
  * @param spanStyles [SpanStyle]s to be applied to parts of text
- * @param placeholders a list of placeholder metrics which tells [Paragraph] where should
- * be left blank to leave space for inline elements.
+ * @param placeholders a list of placeholder metrics which tells [Paragraph] where should be left
+ *   blank to leave space for inline elements.
  * @param maxLines the maximum number of lines that the text can have
  * @param ellipsis whether to ellipsize text, applied only when [maxLines] is set
  * @param width how wide the text is allowed to be
  * @param density density of the device
  * @param resourceLoader [Font.ResourceLoader] to be used to load the font given in [SpanStyle]s
- *
  * @throws IllegalArgumentException if [ParagraphStyle.textDirection] is not set
  */
 @Suppress("DEPRECATION")
 @Deprecated(
     "Font.ResourceLoader is deprecated, instead pass FontFamily.Resolver",
-    replaceWith = ReplaceWith(
-        "Paragraph(text, style, spanStyles, placeholders, maxLines, " +
-            "ellipsis, width, density, fontFamilyResolver)"
-    ),
+    replaceWith =
+        ReplaceWith(
+            "Paragraph(text, style, spanStyles, placeholders, maxLines, " +
+                "ellipsis, width, density, fontFamilyResolver)"
+        ),
 )
 fun Paragraph(
     text: String,
@@ -431,17 +414,18 @@
     width: Float,
     density: Density,
     resourceLoader: Font.ResourceLoader
-): Paragraph = ActualParagraph(
-    text,
-    style,
-    spanStyles,
-    placeholders,
-    maxLines,
-    ellipsis,
-    width,
-    density,
-    resourceLoader
-)
+): Paragraph =
+    ActualParagraph(
+        text,
+        style,
+        spanStyles,
+        placeholders,
+        maxLines,
+        ellipsis,
+        width,
+        density,
+        resourceLoader
+    )
 
 /**
  * Lays out a given [text] with the given constraints. A paragraph is a text that has a single
@@ -456,11 +440,10 @@
  * @param density density of the device
  * @param fontFamilyResolver [FontFamily.Resolver] to be used to load the font given in [SpanStyle]s
  * @param spanStyles [SpanStyle]s to be applied to parts of text
- * @param placeholders a list of placeholder metrics which tells [Paragraph] where should
- * be left blank to leave space for inline elements.
+ * @param placeholders a list of placeholder metrics which tells [Paragraph] where should be left
+ *   blank to leave space for inline elements.
  * @param maxLines the maximum number of lines that the text can have
  * @param ellipsis whether to ellipsize text, applied only when [maxLines] is set
- *
  * @throws IllegalArgumentException if [ParagraphStyle.textDirection] is not set
  */
 @Deprecated(
@@ -482,17 +465,18 @@
     placeholders: List<AnnotatedString.Range<Placeholder>> = listOf(),
     maxLines: Int = DefaultMaxLines,
     ellipsis: Boolean = false
-): Paragraph = ActualParagraph(
-    text,
-    style,
-    spanStyles,
-    placeholders,
-    maxLines,
-    ellipsis,
-    Constraints(maxWidth = width.ceilToInt()),
-    density,
-    fontFamilyResolver
-)
+): Paragraph =
+    ActualParagraph(
+        text,
+        style,
+        spanStyles,
+        placeholders,
+        maxLines,
+        ellipsis,
+        Constraints(maxWidth = width.ceilToInt()),
+        density,
+        fontFamilyResolver
+    )
 
 /**
  * Lays out a given [text] with the given constraints. A paragraph is a text that has a single
@@ -503,17 +487,16 @@
  *
  * @param text the text to be laid out
  * @param style the [TextStyle] to be applied to the whole text
- * @param constraints how wide and tall the text is allowed to be. [Constraints.maxWidth]
- * will define the width of the Paragraph. [Constraints.maxHeight] helps defining the number of
- * lines that fit with ellipsis is true. Minimum components of the [Constraints] object are no-op.
+ * @param constraints how wide and tall the text is allowed to be. [Constraints.maxWidth] will
+ *   define the width of the Paragraph. [Constraints.maxHeight] helps defining the number of lines
+ *   that fit with ellipsis is true. Minimum components of the [Constraints] object are no-op.
  * @param density density of the device
  * @param fontFamilyResolver [FontFamily.Resolver] to be used to load the font given in [SpanStyle]s
  * @param spanStyles [SpanStyle]s to be applied to parts of text
- * @param placeholders a list of placeholder metrics which tells [Paragraph] where should
- * be left blank to leave space for inline elements.
+ * @param placeholders a list of placeholder metrics which tells [Paragraph] where should be left
+ *   blank to leave space for inline elements.
  * @param maxLines the maximum number of lines that the text can have
  * @param ellipsis whether to ellipsize text, applied only when [maxLines] is set
- *
  * @throws IllegalArgumentException if [ParagraphStyle.textDirection] is not set
  */
 fun Paragraph(
@@ -526,21 +509,22 @@
     placeholders: List<AnnotatedString.Range<Placeholder>> = listOf(),
     maxLines: Int = DefaultMaxLines,
     ellipsis: Boolean = false
-): Paragraph = ActualParagraph(
-    text,
-    style,
-    spanStyles,
-    placeholders,
-    maxLines,
-    ellipsis,
-    constraints,
-    density,
-    fontFamilyResolver
-)
+): Paragraph =
+    ActualParagraph(
+        text,
+        style,
+        spanStyles,
+        placeholders,
+        maxLines,
+        ellipsis,
+        constraints,
+        density,
+        fontFamilyResolver
+    )
 
 /**
- * Lays out the text in [ParagraphIntrinsics] with the given constraints. A paragraph is a text
- * that has a single [ParagraphStyle].
+ * Lays out the text in [ParagraphIntrinsics] with the given constraints. A paragraph is a text that
+ * has a single [ParagraphStyle].
  *
  * @param paragraphIntrinsics [ParagraphIntrinsics] instance
  * @param maxLines the maximum number of lines that the text can have
@@ -561,21 +545,22 @@
     maxLines: Int = DefaultMaxLines,
     ellipsis: Boolean = false,
     width: Float
-): Paragraph = ActualParagraph(
-    paragraphIntrinsics,
-    maxLines,
-    ellipsis,
-    Constraints(maxWidth = width.ceilToInt())
-)
+): Paragraph =
+    ActualParagraph(
+        paragraphIntrinsics,
+        maxLines,
+        ellipsis,
+        Constraints(maxWidth = width.ceilToInt())
+    )
 
 /**
- * Lays out the text in [ParagraphIntrinsics] with the given constraints. A paragraph is a text
- * that has a single [ParagraphStyle].
+ * Lays out the text in [ParagraphIntrinsics] with the given constraints. A paragraph is a text that
+ * has a single [ParagraphStyle].
  *
  * @param paragraphIntrinsics [ParagraphIntrinsics] instance
- * @param constraints how wide and tall the text is allowed to be. [Constraints.maxWidth]
- * will define the width of the Paragraph. [Constraints.maxHeight] helps defining the number of
- * lines that fit with ellipsis is true. Minimum components of the [Constraints] object are no-op.
+ * @param constraints how wide and tall the text is allowed to be. [Constraints.maxWidth] will
+ *   define the width of the Paragraph. [Constraints.maxHeight] helps defining the number of lines
+ *   that fit with ellipsis is true. Minimum components of the [Constraints] object are no-op.
  * @param maxLines the maximum number of lines that the text can have
  * @param ellipsis whether to ellipsize text, applied only when [maxLines] is set
  */
@@ -584,11 +569,6 @@
     constraints: Constraints,
     maxLines: Int = DefaultMaxLines,
     ellipsis: Boolean = false
-): Paragraph = ActualParagraph(
-    paragraphIntrinsics,
-    maxLines,
-    ellipsis,
-    constraints
-)
+): Paragraph = ActualParagraph(paragraphIntrinsics, maxLines, ellipsis, constraints)
 
 internal fun Float.ceilToInt(): Int = ceil(this).toInt()
diff --git a/compose/ui/ui-text/src/commonMain/kotlin/androidx/compose/ui/text/ParagraphIntrinsics.kt b/compose/ui/ui-text/src/commonMain/kotlin/androidx/compose/ui/text/ParagraphIntrinsics.kt
index 4aa26740..1a8c4b3 100644
--- a/compose/ui/ui-text/src/commonMain/kotlin/androidx/compose/ui/text/ParagraphIntrinsics.kt
+++ b/compose/ui/ui-text/src/commonMain/kotlin/androidx/compose/ui/text/ParagraphIntrinsics.kt
@@ -22,19 +22,12 @@
 import androidx.compose.ui.text.platform.ActualParagraphIntrinsics
 import androidx.compose.ui.unit.Density
 
-/**
- * Calculates and presents the intrinsic width and height of text.
- */
+/** Calculates and presents the intrinsic width and height of text. */
 interface ParagraphIntrinsics {
-    /**
-     * The width for text if all soft wrap opportunities were taken.
-     */
+    /** The width for text if all soft wrap opportunities were taken. */
     val minIntrinsicWidth: Float
 
-    /**
-     * Returns the smallest width beyond which increasing the width never
-     * decreases the height.
-     */
+    /** Returns the smallest width beyond which increasing the width never decreases the height. */
     val maxIntrinsicWidth: Float
 
     /**
@@ -50,18 +43,18 @@
      *
      * Once true, this will never become false without recreating this [ParagraphIntrinsics].
      *
-     * It is discouraged, but safe, to continue to use this object after this becomes true. The
-     * only impact of using this object after [hasStaleResolvedFonts] becomes true is stale
-     * resolutions of async fonts for measurement and display.
+     * It is discouraged, but safe, to continue to use this object after this becomes true. The only
+     * impact of using this object after [hasStaleResolvedFonts] becomes true is stale resolutions
+     * of async fonts for measurement and display.
      */
     val hasStaleResolvedFonts: Boolean
         get() = false
 }
 
 /**
- *  Factory method to create a [ParagraphIntrinsics].
+ * Factory method to create a [ParagraphIntrinsics].
  *
- *  If the [style] does not contain any [androidx.compose.ui.text.style.TextDirection],
+ * If the [style] does not contain any [androidx.compose.ui.text.style.TextDirection],
  * [androidx.compose.ui.text.style.TextDirection.Content] is used as the default value.
  *
  * @see ParagraphIntrinsics
@@ -69,8 +62,10 @@
 @Suppress("DEPRECATION")
 @Deprecated(
     "Font.ResourceLoader is deprecated, instead use FontFamily.Resolver",
-    ReplaceWith("ParagraphIntrinsics(text, style, spanStyles, placeholders, density, " +
-        "fontFamilyResolver")
+    ReplaceWith(
+        "ParagraphIntrinsics(text, style, spanStyles, placeholders, density, " +
+            "fontFamilyResolver"
+    )
 )
 fun ParagraphIntrinsics(
     text: String,
@@ -79,14 +74,15 @@
     placeholders: List<AnnotatedString.Range<Placeholder>> = listOf(),
     density: Density,
     resourceLoader: Font.ResourceLoader
-): ParagraphIntrinsics = ActualParagraphIntrinsics(
-    text = text,
-    style = style,
-    spanStyles = spanStyles,
-    placeholders = placeholders,
-    density = density,
-    fontFamilyResolver = createFontFamilyResolver(resourceLoader)
-)
+): ParagraphIntrinsics =
+    ActualParagraphIntrinsics(
+        text = text,
+        style = style,
+        spanStyles = spanStyles,
+        placeholders = placeholders,
+        density = density,
+        fontFamilyResolver = createFontFamilyResolver(resourceLoader)
+    )
 
 fun ParagraphIntrinsics(
     text: String,
@@ -95,11 +91,12 @@
     placeholders: List<AnnotatedString.Range<Placeholder>> = listOf(),
     density: Density,
     fontFamilyResolver: FontFamily.Resolver
-): ParagraphIntrinsics = ActualParagraphIntrinsics(
-    text = text,
-    style = style,
-    spanStyles = spanStyles,
-    placeholders = placeholders,
-    density = density,
-    fontFamilyResolver = fontFamilyResolver
-)
+): ParagraphIntrinsics =
+    ActualParagraphIntrinsics(
+        text = text,
+        style = style,
+        spanStyles = spanStyles,
+        placeholders = placeholders,
+        density = density,
+        fontFamilyResolver = fontFamilyResolver
+    )
diff --git a/compose/ui/ui-text/src/commonMain/kotlin/androidx/compose/ui/text/ParagraphStyle.kt b/compose/ui/ui-text/src/commonMain/kotlin/androidx/compose/ui/text/ParagraphStyle.kt
index c6005aa..957b390 100644
--- a/compose/ui/ui-text/src/commonMain/kotlin/androidx/compose/ui/text/ParagraphStyle.kt
+++ b/compose/ui/ui-text/src/commonMain/kotlin/androidx/compose/ui/text/ParagraphStyle.kt
@@ -36,27 +36,27 @@
 /**
  * Paragraph styling configuration for a paragraph. The difference between [SpanStyle] and
  * `ParagraphStyle` is that, `ParagraphStyle` can be applied to a whole [Paragraph] while
- * [SpanStyle] can be applied at the character level.
- * Once a portion of the text is marked with a `ParagraphStyle`, that portion will be separated from
- * the remaining as if a line feed character was added.
+ * [SpanStyle] can be applied at the character level. Once a portion of the text is marked with a
+ * `ParagraphStyle`, that portion will be separated from the remaining as if a line feed character
+ * was added.
  *
  * @sample androidx.compose.ui.text.samples.ParagraphStyleSample
+ *
  * @sample androidx.compose.ui.text.samples.ParagraphStyleAnnotatedStringsSample
  *
  * @param textAlign The alignment of the text within the lines of the paragraph.
- * @param textDirection The algorithm to be used to resolve the final text direction:
- * Left To Right or Right To Left.
+ * @param textDirection The algorithm to be used to resolve the final text direction: Left To Right
+ *   or Right To Left.
  * @param lineHeight Line height for the [Paragraph] in [TextUnit] unit, e.g. SP or EM.
  * @param textIndent The indentation of the paragraph.
  * @param platformStyle Platform specific [ParagraphStyle] parameters.
- * @param lineHeightStyle the configuration for line height such as vertical alignment of the
- * line, whether to apply additional space as a result of line height to top of first line top and
- * bottom of last line. The configuration is applied only when a [lineHeight] is defined.
- * When null, [LineHeightStyle.Default] is used.
+ * @param lineHeightStyle the configuration for line height such as vertical alignment of the line,
+ *   whether to apply additional space as a result of line height to top of first line top and
+ *   bottom of last line. The configuration is applied only when a [lineHeight] is defined. When
+ *   null, [LineHeightStyle.Default] is used.
  * @param lineBreak The line breaking configuration for the text.
  * @param hyphens The configuration of hyphenation.
  * @param textMotion Text character placement, whether to optimize for animated or static text.
- *
  * @see Paragraph
  * @see AnnotatedString
  * @see SpanStyle
@@ -77,28 +77,34 @@
     @Deprecated("Kept for backwards compatibility.", level = DeprecationLevel.WARNING)
     @get:JvmName("getTextAlign-buA522U") // b/320819734
     @Suppress("unused", "RedundantNullableReturnType", "PropertyName")
-    val deprecated_boxing_textAlign: TextAlign? get() = this.textAlign
+    val deprecated_boxing_textAlign: TextAlign?
+        get() = this.textAlign
 
     @Deprecated("Kept for backwards compatibility.", level = DeprecationLevel.WARNING)
     @get:JvmName("getTextDirection-mmuk1to") // b/320819734
     @Suppress("unused", "RedundantNullableReturnType", "PropertyName")
-    val deprecated_boxing_textDirection: TextDirection? get() = this.textDirection
+    val deprecated_boxing_textDirection: TextDirection?
+        get() = this.textDirection
 
     @Deprecated("Kept for backwards compatibility.", level = DeprecationLevel.WARNING)
     @get:JvmName("getHyphens-EaSxIns") // b/320819734
     @Suppress("unused", "RedundantNullableReturnType", "PropertyName")
-    val deprecated_boxing_hyphens: Hyphens? get() = this.hyphens
+    val deprecated_boxing_hyphens: Hyphens?
+        get() = this.hyphens
 
     @Deprecated("Kept for backwards compatibility.", level = DeprecationLevel.WARNING)
     @get:JvmName("getLineBreak-LgCVezo") // b/320819734
     @Suppress("unused", "RedundantNullableReturnType", "PropertyName")
-    val deprecated_boxing_lineBreak: LineBreak? get() = this.lineBreak
+    val deprecated_boxing_lineBreak: LineBreak?
+        get() = this.lineBreak
 
-    @Deprecated("ParagraphStyle constructors that take nullable TextAlign, " +
-        "TextDirection, LineBreak, and Hyphens are deprecated. Please use a new constructor " +
-        "where these parameters are non-nullable. Null value has been replaced by a special " +
-        "Unspecified object for performance reason.",
-        level = DeprecationLevel.HIDDEN)
+    @Deprecated(
+        "ParagraphStyle constructors that take nullable TextAlign, " +
+            "TextDirection, LineBreak, and Hyphens are deprecated. Please use a new constructor " +
+            "where these parameters are non-nullable. Null value has been replaced by a special " +
+            "Unspecified object for performance reason.",
+        level = DeprecationLevel.HIDDEN
+    )
     constructor(
         textAlign: TextAlign? = null,
         textDirection: TextDirection? = null,
@@ -120,6 +126,7 @@
         hyphens = hyphens ?: Hyphens.Unspecified,
         textMotion = textMotion
     )
+
     @Deprecated(
         "ParagraphStyle constructors that do not take new stable parameters " +
             "like LineHeightStyle, LineBreak, Hyphens are deprecated. Please use the new stable " +
@@ -198,9 +205,7 @@
     init {
         if (lineHeight != TextUnit.Unspecified) {
             // Since we are checking if it's negative, no need to convert Sp into Px at this point.
-            check(lineHeight.value >= 0f) {
-                "lineHeight can't be negative (${lineHeight.value})"
-            }
+            check(lineHeight.value >= 0f) { "lineHeight can't be negative (${lineHeight.value})" }
         }
     }
 
@@ -227,11 +232,8 @@
         )
     }
 
-    /**
-     * Plus operator overload that applies a [merge].
-     */
-    @Stable
-    operator fun plus(other: ParagraphStyle): ParagraphStyle = this.merge(other)
+    /** Plus operator overload that applies a [merge]. */
+    @Stable operator fun plus(other: ParagraphStyle): ParagraphStyle = this.merge(other)
 
     @Deprecated(
         "ParagraphStyle copy constructors that do not take new stable parameters " +
@@ -314,11 +316,13 @@
         )
     }
 
-    @Deprecated("ParagraphStyle copy constructors that take nullable TextAlign, " +
-        "TextDirection, LineBreak, and Hyphens are deprecated. Please use a new constructor " +
-        "where these parameters are non-nullable. Null value has been replaced by a special " +
-        "Unspecified object for performance reason.",
-        level = DeprecationLevel.HIDDEN)
+    @Deprecated(
+        "ParagraphStyle copy constructors that take nullable TextAlign, " +
+            "TextDirection, LineBreak, and Hyphens are deprecated. Please use a new constructor " +
+            "where these parameters are non-nullable. Null value has been replaced by a special " +
+            "Unspecified object for performance reason.",
+        level = DeprecationLevel.HIDDEN
+    )
     fun copy(
         textAlign: TextAlign? = this.textAlign,
         textDirection: TextDirection? = this.textDirection,
@@ -417,35 +421,23 @@
  *
  * This will not work well if the styles don't set the same fields.
  *
- * The [fraction] argument represents position on the timeline, with 0.0 meaning
- * that the interpolation has not started, returning [start] (or something
- * equivalent to [start]), 1.0 meaning that the interpolation has finished,
- * returning [stop] (or something equivalent to [stop]), and values in between
- * meaning that the interpolation is at the relevant point on the timeline
- * between [start] and [stop]. The interpolation can be extrapolated beyond 0.0 and
- * 1.0, so negative values and values greater than 1.0 are valid.
+ * The [fraction] argument represents position on the timeline, with 0.0 meaning that the
+ * interpolation has not started, returning [start] (or something equivalent to [start]), 1.0
+ * meaning that the interpolation has finished, returning [stop] (or something equivalent to
+ * [stop]), and values in between meaning that the interpolation is at the relevant point on the
+ * timeline between [start] and [stop]. The interpolation can be extrapolated beyond 0.0 and 1.0, so
+ * negative values and values greater than 1.0 are valid.
  */
 @Stable
 fun lerp(start: ParagraphStyle, stop: ParagraphStyle, fraction: Float): ParagraphStyle {
     return ParagraphStyle(
         textAlign = lerpDiscrete(start.textAlign, stop.textAlign, fraction),
-        textDirection = lerpDiscrete(
-            start.textDirection,
-            stop.textDirection,
-            fraction
-        ),
+        textDirection = lerpDiscrete(start.textDirection, stop.textDirection, fraction),
         lineHeight = lerpTextUnitInheritable(start.lineHeight, stop.lineHeight, fraction),
-        textIndent = lerp(
-            start.textIndent ?: TextIndent.None,
-            stop.textIndent ?: TextIndent.None,
-            fraction
-        ),
+        textIndent =
+            lerp(start.textIndent ?: TextIndent.None, stop.textIndent ?: TextIndent.None, fraction),
         platformStyle = lerpPlatformStyle(start.platformStyle, stop.platformStyle, fraction),
-        lineHeightStyle = lerpDiscrete(
-            start.lineHeightStyle,
-            stop.lineHeightStyle,
-            fraction
-        ),
+        lineHeightStyle = lerpDiscrete(start.lineHeightStyle, stop.lineHeightStyle, fraction),
         lineBreak = lerpDiscrete(start.lineBreak, stop.lineBreak, fraction),
         hyphens = lerpDiscrete(start.hyphens, stop.hyphens, fraction),
         textMotion = lerpDiscrete(start.textMotion, stop.textMotion, fraction)
@@ -463,22 +455,22 @@
     return lerp(startNonNull, stopNonNull, fraction)
 }
 
-internal fun resolveParagraphStyleDefaults(
-    style: ParagraphStyle,
-    direction: LayoutDirection
-) = ParagraphStyle(
-    textAlign = if (style.textAlign == TextAlign.Unspecified) TextAlign.Start else style.textAlign,
-    textDirection = resolveTextDirection(direction, style.textDirection),
-    lineHeight = if (style.lineHeight.isUnspecified) DefaultLineHeight else style.lineHeight,
-    textIndent = style.textIndent ?: TextIndent.None,
-    platformStyle = style.platformStyle,
-    lineHeightStyle = style.lineHeightStyle,
-    lineBreak = if (style.lineBreak == LineBreak.Unspecified) LineBreak.Simple else style.lineBreak,
-    hyphens = if (style.hyphens == Hyphens.Unspecified) Hyphens.None else style.hyphens,
-    textMotion = style.textMotion ?: TextMotion.Static
-)
+internal fun resolveParagraphStyleDefaults(style: ParagraphStyle, direction: LayoutDirection) =
+    ParagraphStyle(
+        textAlign =
+            if (style.textAlign == TextAlign.Unspecified) TextAlign.Start else style.textAlign,
+        textDirection = resolveTextDirection(direction, style.textDirection),
+        lineHeight = if (style.lineHeight.isUnspecified) DefaultLineHeight else style.lineHeight,
+        textIndent = style.textIndent ?: TextIndent.None,
+        platformStyle = style.platformStyle,
+        lineHeightStyle = style.lineHeightStyle,
+        lineBreak =
+            if (style.lineBreak == LineBreak.Unspecified) LineBreak.Simple else style.lineBreak,
+        hyphens = if (style.hyphens == Hyphens.Unspecified) Hyphens.None else style.hyphens,
+        textMotion = style.textMotion ?: TextMotion.Static
+    )
 
- internal fun ParagraphStyle.fastMerge(
+internal fun ParagraphStyle.fastMerge(
     textAlign: TextAlign,
     textDirection: TextDirection,
     lineHeight: TextUnit,
@@ -489,43 +481,42 @@
     hyphens: Hyphens,
     textMotion: TextMotion?
 ): ParagraphStyle {
-     // prioritize the parameters to Text in diffs here
-     /**
-      *  textAlign: TextAlign?
-      *  lineHeight: TextUnit
-      */
+    // prioritize the parameters to Text in diffs here
+    /** textAlign: TextAlign? lineHeight: TextUnit */
 
-     // any new vals should do a pre-merge check here
-     val requiresAlloc = textAlign != TextAlign.Unspecified && textAlign != this.textAlign ||
-         lineHeight.isSpecified && lineHeight != this.lineHeight ||
-         textIndent != null && textIndent != this.textIndent ||
-         textDirection != TextDirection.Unspecified && textDirection != this.textDirection ||
-         platformStyle != null && platformStyle != this.platformStyle ||
-         lineHeightStyle != null && lineHeightStyle != this.lineHeightStyle ||
-         lineBreak != LineBreak.Unspecified && lineBreak != this.lineBreak ||
-         hyphens != Hyphens.Unspecified && hyphens != this.hyphens ||
-         textMotion != null && textMotion != this.textMotion
+    // any new vals should do a pre-merge check here
+    val requiresAlloc =
+        textAlign != TextAlign.Unspecified && textAlign != this.textAlign ||
+            lineHeight.isSpecified && lineHeight != this.lineHeight ||
+            textIndent != null && textIndent != this.textIndent ||
+            textDirection != TextDirection.Unspecified && textDirection != this.textDirection ||
+            platformStyle != null && platformStyle != this.platformStyle ||
+            lineHeightStyle != null && lineHeightStyle != this.lineHeightStyle ||
+            lineBreak != LineBreak.Unspecified && lineBreak != this.lineBreak ||
+            hyphens != Hyphens.Unspecified && hyphens != this.hyphens ||
+            textMotion != null && textMotion != this.textMotion
 
-     if (!requiresAlloc) {
-         return this
-     }
+    if (!requiresAlloc) {
+        return this
+    }
 
-     return ParagraphStyle(
-         lineHeight = if (lineHeight.isUnspecified) {
-             this.lineHeight
-         } else {
-             lineHeight
-         },
-         textIndent = textIndent ?: this.textIndent,
-         textAlign = if (textAlign != TextAlign.Unspecified) textAlign else this.textAlign,
-         textDirection =
-         if (textDirection != TextDirection.Unspecified) textDirection else this.textDirection,
-         platformStyle = mergePlatformStyle(platformStyle),
-         lineHeightStyle = lineHeightStyle ?: this.lineHeightStyle,
-         lineBreak = if (lineBreak != LineBreak.Unspecified) lineBreak else this.lineBreak,
-         hyphens = if (hyphens != Hyphens.Unspecified) hyphens else this.hyphens,
-         textMotion = textMotion ?: this.textMotion
-     )
+    return ParagraphStyle(
+        lineHeight =
+            if (lineHeight.isUnspecified) {
+                this.lineHeight
+            } else {
+                lineHeight
+            },
+        textIndent = textIndent ?: this.textIndent,
+        textAlign = if (textAlign != TextAlign.Unspecified) textAlign else this.textAlign,
+        textDirection =
+            if (textDirection != TextDirection.Unspecified) textDirection else this.textDirection,
+        platformStyle = mergePlatformStyle(platformStyle),
+        lineHeightStyle = lineHeightStyle ?: this.lineHeightStyle,
+        lineBreak = if (lineBreak != LineBreak.Unspecified) lineBreak else this.lineBreak,
+        hyphens = if (hyphens != Hyphens.Unspecified) hyphens else this.hyphens,
+        textMotion = textMotion ?: this.textMotion
+    )
 }
 
 private fun ParagraphStyle.mergePlatformStyle(
diff --git a/compose/ui/ui-text/src/commonMain/kotlin/androidx/compose/ui/text/Placeholder.kt b/compose/ui/ui-text/src/commonMain/kotlin/androidx/compose/ui/text/Placeholder.kt
index 5e85d27..4afec70 100644
--- a/compose/ui/ui-text/src/commonMain/kotlin/androidx/compose/ui/text/Placeholder.kt
+++ b/compose/ui/ui-text/src/commonMain/kotlin/androidx/compose/ui/text/Placeholder.kt
@@ -26,11 +26,11 @@
  * paragraph.
  *
  * @param width the width of the placeholder, it must be specified in sp or em.
- * [TextUnit.Unspecified] is not allowed.
+ *   [TextUnit.Unspecified] is not allowed.
  * @param height the height of the placeholder, it must be specified in sp or em.
- * [TextUnit.Unspecified] is not allowed.
+ *   [TextUnit.Unspecified] is not allowed.
  * @param placeholderVerticalAlign the vertical alignment of the placeholder within the text line.
- * Check [PlaceholderVerticalAlign] for more information.
+ *   Check [PlaceholderVerticalAlign] for more information.
  * @throws IllegalArgumentException if [TextUnit.Unspecified] is passed to [width] or [height].
  */
 @Immutable
@@ -80,14 +80,15 @@
             ")"
     }
 }
+
 /**
  * The settings used to specify how a placeholder is vertically aligned within a text line.
+ *
  * @see Placeholder
  */
 @kotlin.jvm.JvmInline
-value class PlaceholderVerticalAlign internal constructor(
-    @Suppress("unused") private val value: Int
-) {
+value class PlaceholderVerticalAlign
+internal constructor(@Suppress("unused") private val value: Int) {
 
     override fun toString(): String {
         return when (this) {
@@ -112,24 +113,24 @@
         /** Align the center of the placeholder with the center of the entire line. */
         val Center = PlaceholderVerticalAlign(4)
         /**
-         *  Align the top of the placeholder with the top of the proceeding text.
-         *  It is different from the [Top] when there are texts with different font size, font or other
-         *  styles in the same line. This option will use the proceeding text's top instead of the
-         *  whole line's top.
+         * Align the top of the placeholder with the top of the proceeding text. It is different
+         * from the [Top] when there are texts with different font size, font or other styles in the
+         * same line. This option will use the proceeding text's top instead of the whole line's
+         * top.
          */
         val TextTop = PlaceholderVerticalAlign(5)
         /**
-         * Align the bottom of the placeholder with the bottom of the proceeding text.
-         * It is different from the [TextBottom] when there are texts with different font size, font or
-         * other styles in the same line. This option will use the proceeding text's bottom instead of
-         * the whole line's bottom.
+         * Align the bottom of the placeholder with the bottom of the proceeding text. It is
+         * different from the [TextBottom] when there are texts with different font size, font or
+         * other styles in the same line. This option will use the proceeding text's bottom instead
+         * of the whole line's bottom.
          */
         val TextBottom = PlaceholderVerticalAlign(6)
         /**
-         * Align the center of the placeholder with the center of the proceeding text.
-         * It is different from the [Center] when there are texts with different font size, font or
-         * other styles in the same line. This option will use the proceeding text's center instead of
-         * the whole line's center.
+         * Align the center of the placeholder with the center of the proceeding text. It is
+         * different from the [Center] when there are texts with different font size, font or other
+         * styles in the same line. This option will use the proceeding text's center instead of the
+         * whole line's center.
          */
         val TextCenter = PlaceholderVerticalAlign(7)
     }
diff --git a/compose/ui/ui-text/src/commonMain/kotlin/androidx/compose/ui/text/PlatformTextStyle.kt b/compose/ui/ui-text/src/commonMain/kotlin/androidx/compose/ui/text/PlatformTextStyle.kt
index 0c8ea32..8563e1c 100644
--- a/compose/ui/ui-text/src/commonMain/kotlin/androidx/compose/ui/text/PlatformTextStyle.kt
+++ b/compose/ui/ui-text/src/commonMain/kotlin/androidx/compose/ui/text/PlatformTextStyle.kt
@@ -16,18 +16,12 @@
 
 package androidx.compose.ui.text
 
-/**
- * Provides platform specific [TextStyle] configuration options for styling and compatibility.
- */
+/** Provides platform specific [TextStyle] configuration options for styling and compatibility. */
 expect class PlatformTextStyle {
-    /**
-     * Platform specific text span styling and compatibility configuration.
-     */
+    /** Platform specific text span styling and compatibility configuration. */
     val spanStyle: PlatformSpanStyle?
 
-    /**
-     * Platform specific paragraph styling and compatibility configuration.
-     */
+    /** Platform specific paragraph styling and compatibility configuration. */
     val paragraphStyle: PlatformParagraphStyle?
 }
 
@@ -47,9 +41,7 @@
     fun merge(other: PlatformParagraphStyle?): PlatformParagraphStyle
 }
 
-/**
- * Provides platform specific [SpanStyle] configuration options for styling and compatibility.
- */
+/** Provides platform specific [SpanStyle] configuration options for styling and compatibility. */
 expect class PlatformSpanStyle {
     companion object {
         val Default: PlatformSpanStyle
@@ -63,13 +55,12 @@
  *
  * This will not work well if the styles don't set the same fields.
  *
- * The [fraction] argument represents position on the timeline, with 0.0 meaning
- * that the interpolation has not started, returning [start] (or something
- * equivalent to [start]), 1.0 meaning that the interpolation has finished,
- * returning [stop] (or something equivalent to [stop]), and values in between
- * meaning that the interpolation is at the relevant point on the timeline
- * between [start] and [stop]. The interpolation can be extrapolated beyond 0.0 and
- * 1.0, so negative values and values greater than 1.0 are valid.
+ * The [fraction] argument represents position on the timeline, with 0.0 meaning that the
+ * interpolation has not started, returning [start] (or something equivalent to [start]), 1.0
+ * meaning that the interpolation has finished, returning [stop] (or something equivalent to
+ * [stop]), and values in between meaning that the interpolation is at the relevant point on the
+ * timeline between [start] and [stop]. The interpolation can be extrapolated beyond 0.0 and 1.0, so
+ * negative values and values greater than 1.0 are valid.
  */
 expect fun lerp(
     start: PlatformParagraphStyle,
@@ -82,13 +73,12 @@
  *
  * This will not work well if the styles don't set the same fields.
  *
- * The [fraction] argument represents position on the timeline, with 0.0 meaning
- * that the interpolation has not started, returning [start] (or something
- * equivalent to [start]), 1.0 meaning that the interpolation has finished,
- * returning [stop] (or something equivalent to [stop]), and values in between
- * meaning that the interpolation is at the relevant point on the timeline
- * between [start] and [stop]. The interpolation can be extrapolated beyond 0.0 and
- * 1.0, so negative values and values greater than 1.0 are valid.
+ * The [fraction] argument represents position on the timeline, with 0.0 meaning that the
+ * interpolation has not started, returning [start] (or something equivalent to [start]), 1.0
+ * meaning that the interpolation has finished, returning [stop] (or something equivalent to
+ * [stop]), and values in between meaning that the interpolation is at the relevant point on the
+ * timeline between [start] and [stop]. The interpolation can be extrapolated beyond 0.0 and 1.0, so
+ * negative values and values greater than 1.0 are valid.
  */
 expect fun lerp(
     start: PlatformSpanStyle,
diff --git a/compose/ui/ui-text/src/commonMain/kotlin/androidx/compose/ui/text/Savers.kt b/compose/ui/ui-text/src/commonMain/kotlin/androidx/compose/ui/text/Savers.kt
index 8584a0f..fb83b6b 100644
--- a/compose/ui/ui-text/src/commonMain/kotlin/androidx/compose/ui/text/Savers.kt
+++ b/compose/ui/ui-text/src/commonMain/kotlin/androidx/compose/ui/text/Savers.kt
@@ -36,8 +36,8 @@
 import androidx.compose.ui.util.fastMap
 
 /**
- * Utility function to be able to save nullable values. It also enables not to use with() scope
- * for readability/syntactic purposes.
+ * Utility function to be able to save nullable values. It also enables not to use with() scope for
+ * readability/syntactic purposes.
  */
 internal fun <T : Saver<Original, Saveable>, Original, Saveable> save(
     value: Original?,
@@ -48,8 +48,8 @@
 }
 
 /**
- * Utility function to restore nullable values. It also enables not to use with() scope
- * for readability/syntactic purposes.
+ * Utility function to restore nullable values. It also enables not to use with() scope for
+ * readability/syntactic purposes.
  */
 internal inline fun <T : Saver<Original, Saveable>, Original, Saveable, reified Result> restore(
     value: Saveable?,
@@ -64,10 +64,11 @@
 }
 
 /**
- * Use for non-null value classes where the Unspecified value needs to be separately handled,
- * for example as in the [OffsetSaver]
+ * Use for non-null value classes where the Unspecified value needs to be separately handled, for
+ * example as in the [OffsetSaver]
  */
 private interface NonNullValueClassSaver<Original, Saveable : Any> : Saver<Original, Saveable>
+
 private fun <Original, Saveable : Any> NonNullValueClassSaver(
     save: SaverScope.(value: Original) -> Saveable?,
     restore: (value: Saveable) -> Original?
@@ -79,60 +80,53 @@
     }
 }
 
-/**
- * Utility function to save nullable values that does not require a Saver.
- */
+/** Utility function to save nullable values that does not require a Saver. */
 internal fun <T> save(value: T?): T? {
     return value
 }
 
-/**
- * Utility function to restore nullable values that does not require a Saver.
- */
+/** Utility function to restore nullable values that does not require a Saver. */
 internal inline fun <reified Result> restore(value: Any?): Result? {
     return value?.let { it as Result }
 }
 
-internal val AnnotatedStringSaver = Saver<AnnotatedString, Any>(
-    save = {
-        arrayListOf(
-            save(it.text),
-            save(it.spanStyles, AnnotationRangeListSaver, this),
-            save(it.paragraphStyles, AnnotationRangeListSaver, this),
-            save(it.annotations, AnnotationRangeListSaver, this),
-        )
-    },
-    restore = {
-        val list = it as List<Any?>
-        // lift these to make types work
-        val spanStylesOrNull: List<AnnotatedString.Range<SpanStyle>>? =
-            restore(list[1], AnnotationRangeListSaver)
-        val paragraphStylesOrNull: List<AnnotatedString.Range<ParagraphStyle>>? =
-            restore(list[2], AnnotationRangeListSaver)
-        AnnotatedString(
-            text = restore(list[0])!!,
-            spanStylesOrNull = spanStylesOrNull?.ifEmpty { null },
-            paragraphStylesOrNull = paragraphStylesOrNull?.ifEmpty { null },
-            annotations = restore(list[3], AnnotationRangeListSaver),
-        )
-    }
-)
+internal val AnnotatedStringSaver =
+    Saver<AnnotatedString, Any>(
+        save = {
+            arrayListOf(
+                save(it.text),
+                save(it.spanStyles, AnnotationRangeListSaver, this),
+                save(it.paragraphStyles, AnnotationRangeListSaver, this),
+                save(it.annotations, AnnotationRangeListSaver, this),
+            )
+        },
+        restore = {
+            val list = it as List<Any?>
+            // lift these to make types work
+            val spanStylesOrNull: List<AnnotatedString.Range<SpanStyle>>? =
+                restore(list[1], AnnotationRangeListSaver)
+            val paragraphStylesOrNull: List<AnnotatedString.Range<ParagraphStyle>>? =
+                restore(list[2], AnnotationRangeListSaver)
+            AnnotatedString(
+                text = restore(list[0])!!,
+                spanStylesOrNull = spanStylesOrNull?.ifEmpty { null },
+                paragraphStylesOrNull = paragraphStylesOrNull?.ifEmpty { null },
+                annotations = restore(list[3], AnnotationRangeListSaver),
+            )
+        }
+    )
 
-private val AnnotationRangeListSaver = Saver<List<AnnotatedString.Range<out Any>>, Any>(
-    save = {
-        it.fastMap { range ->
-            save(range, AnnotationRangeSaver, this)
+private val AnnotationRangeListSaver =
+    Saver<List<AnnotatedString.Range<out Any>>, Any>(
+        save = { it.fastMap { range -> save(range, AnnotationRangeSaver, this) } },
+        restore = {
+            @Suppress("UNCHECKED_CAST") val list = it as List<Any>
+            list.fastMap { item ->
+                val range: AnnotatedString.Range<out Any> = restore(item, AnnotationRangeSaver)!!
+                range
+            }
         }
-    },
-    restore = {
-        @Suppress("UNCHECKED_CAST")
-        val list = it as List<Any>
-        list.fastMap { item ->
-            val range: AnnotatedString.Range<out Any> = restore(item, AnnotationRangeSaver)!!
-            range
-        }
-    }
-)
+    )
 
 private enum class AnnotationType {
     Paragraph,
@@ -145,396 +139,372 @@
 }
 
 @OptIn(ExperimentalTextApi::class)
-private val AnnotationRangeSaver = Saver<AnnotatedString.Range<out Any>, Any>(
-    save = {
-        val marker = when (it.item) {
-            is ParagraphStyle -> AnnotationType.Paragraph
-            is SpanStyle -> AnnotationType.Span
-            is VerbatimTtsAnnotation -> AnnotationType.VerbatimTts
-            is UrlAnnotation -> AnnotationType.Url
-            is LinkAnnotation.Url -> AnnotationType.Link
-            is LinkAnnotation.Clickable -> AnnotationType.Clickable
-            else -> AnnotationType.String
-        }
+private val AnnotationRangeSaver =
+    Saver<AnnotatedString.Range<out Any>, Any>(
+        save = {
+            val marker =
+                when (it.item) {
+                    is ParagraphStyle -> AnnotationType.Paragraph
+                    is SpanStyle -> AnnotationType.Span
+                    is VerbatimTtsAnnotation -> AnnotationType.VerbatimTts
+                    is UrlAnnotation -> AnnotationType.Url
+                    is LinkAnnotation.Url -> AnnotationType.Link
+                    is LinkAnnotation.Clickable -> AnnotationType.Clickable
+                    else -> AnnotationType.String
+                }
 
-        val item = when (marker) {
-            AnnotationType.Paragraph -> save(it.item as ParagraphStyle, ParagraphStyleSaver, this)
-            AnnotationType.Span -> save(it.item as SpanStyle, SpanStyleSaver, this)
-            AnnotationType.VerbatimTts -> save(
-                it.item as VerbatimTtsAnnotation,
-                VerbatimTtsAnnotationSaver,
-                this
-            )
-            AnnotationType.Url -> save(
-                it.item as UrlAnnotation,
-                UrlAnnotationSaver,
-                this
-            )
-            AnnotationType.Link -> save(
-                it.item as LinkAnnotation.Url,
-                LinkSaver,
-                this
-            )
-            AnnotationType.Clickable -> save(
-                it.item as LinkAnnotation.Clickable,
-                ClickableSaver,
-                this
-            )
-            AnnotationType.String -> save(it.item)
-        }
+            val item =
+                when (marker) {
+                    AnnotationType.Paragraph ->
+                        save(it.item as ParagraphStyle, ParagraphStyleSaver, this)
+                    AnnotationType.Span -> save(it.item as SpanStyle, SpanStyleSaver, this)
+                    AnnotationType.VerbatimTts ->
+                        save(it.item as VerbatimTtsAnnotation, VerbatimTtsAnnotationSaver, this)
+                    AnnotationType.Url -> save(it.item as UrlAnnotation, UrlAnnotationSaver, this)
+                    AnnotationType.Link -> save(it.item as LinkAnnotation.Url, LinkSaver, this)
+                    AnnotationType.Clickable ->
+                        save(it.item as LinkAnnotation.Clickable, ClickableSaver, this)
+                    AnnotationType.String -> save(it.item)
+                }
 
-        arrayListOf(
-            save(marker),
-            item,
-            save(it.start),
-            save(it.end),
-            save(it.tag)
-        )
-    },
-    restore = {
-        @Suppress("UNCHECKED_CAST")
-        val list = it as List<Any>
-        val marker: AnnotationType = restore(list[0])!!
-        val start: Int = restore(list[2])!!
-        val end: Int = restore(list[3])!!
-        val tag: String = restore(list[4])!!
+            arrayListOf(save(marker), item, save(it.start), save(it.end), save(it.tag))
+        },
+        restore = {
+            @Suppress("UNCHECKED_CAST") val list = it as List<Any>
+            val marker: AnnotationType = restore(list[0])!!
+            val start: Int = restore(list[2])!!
+            val end: Int = restore(list[3])!!
+            val tag: String = restore(list[4])!!
 
-        when (marker) {
-            AnnotationType.Paragraph -> {
-                val item: ParagraphStyle = restore(list[1], ParagraphStyleSaver)!!
-                AnnotatedString.Range(item = item, start = start, end = end, tag = tag)
-            }
-            AnnotationType.Span -> {
-                val item: SpanStyle = restore(list[1], SpanStyleSaver)!!
-                AnnotatedString.Range(item = item, start = start, end = end, tag = tag)
-            }
-            AnnotationType.VerbatimTts -> {
-                val item: VerbatimTtsAnnotation = restore(list[1], VerbatimTtsAnnotationSaver)!!
-                AnnotatedString.Range(item = item, start = start, end = end, tag = tag)
-            }
-            AnnotationType.Url -> {
-                val item: UrlAnnotation = restore(list[1], UrlAnnotationSaver)!!
-                AnnotatedString.Range(item = item, start = start, end = end, tag = tag)
-            }
-            AnnotationType.Link -> {
-                val item: LinkAnnotation.Url = restore(list[1], LinkSaver)!!
-                AnnotatedString.Range(item = item, start = start, end = end, tag = tag)
-            }
-            AnnotationType.Clickable -> {
-                val item: LinkAnnotation.Clickable = restore(list[1], ClickableSaver)!!
-                AnnotatedString.Range(item = item, start = start, end = end, tag = tag)
-            }
-            AnnotationType.String -> {
-                val item: String = restore(list[1])!!
-                AnnotatedString.Range(item = item, start = start, end = end, tag = tag)
+            when (marker) {
+                AnnotationType.Paragraph -> {
+                    val item: ParagraphStyle = restore(list[1], ParagraphStyleSaver)!!
+                    AnnotatedString.Range(item = item, start = start, end = end, tag = tag)
+                }
+                AnnotationType.Span -> {
+                    val item: SpanStyle = restore(list[1], SpanStyleSaver)!!
+                    AnnotatedString.Range(item = item, start = start, end = end, tag = tag)
+                }
+                AnnotationType.VerbatimTts -> {
+                    val item: VerbatimTtsAnnotation = restore(list[1], VerbatimTtsAnnotationSaver)!!
+                    AnnotatedString.Range(item = item, start = start, end = end, tag = tag)
+                }
+                AnnotationType.Url -> {
+                    val item: UrlAnnotation = restore(list[1], UrlAnnotationSaver)!!
+                    AnnotatedString.Range(item = item, start = start, end = end, tag = tag)
+                }
+                AnnotationType.Link -> {
+                    val item: LinkAnnotation.Url = restore(list[1], LinkSaver)!!
+                    AnnotatedString.Range(item = item, start = start, end = end, tag = tag)
+                }
+                AnnotationType.Clickable -> {
+                    val item: LinkAnnotation.Clickable = restore(list[1], ClickableSaver)!!
+                    AnnotatedString.Range(item = item, start = start, end = end, tag = tag)
+                }
+                AnnotationType.String -> {
+                    val item: String = restore(list[1])!!
+                    AnnotatedString.Range(item = item, start = start, end = end, tag = tag)
+                }
             }
         }
-    }
-)
+    )
 
-private val VerbatimTtsAnnotationSaver = Saver<VerbatimTtsAnnotation, Any>(
-    save = { save(it.verbatim) },
-    restore = { VerbatimTtsAnnotation(restore(it)!!) }
-)
+private val VerbatimTtsAnnotationSaver =
+    Saver<VerbatimTtsAnnotation, Any>(
+        save = { save(it.verbatim) },
+        restore = { VerbatimTtsAnnotation(restore(it)!!) }
+    )
 
 @OptIn(ExperimentalTextApi::class)
-private val UrlAnnotationSaver = Saver<UrlAnnotation, Any>(
-    save = { save(it.url) },
-    restore = { UrlAnnotation(restore(it)!!) }
-)
+private val UrlAnnotationSaver =
+    Saver<UrlAnnotation, Any>(save = { save(it.url) }, restore = { UrlAnnotation(restore(it)!!) })
 
-private val LinkSaver = Saver<LinkAnnotation.Url, Any>(
-    save = {
-        arrayListOf(
-            save(it.url),
-            save(it.styles, TextLinkStylesSaver, this),
-        )
-    },
-    restore = {
-        val list = it as List<Any?>
+private val LinkSaver =
+    Saver<LinkAnnotation.Url, Any>(
+        save = {
+            arrayListOf(
+                save(it.url),
+                save(it.styles, TextLinkStylesSaver, this),
+            )
+        },
+        restore = {
+            val list = it as List<Any?>
 
-        val url: String = restore(list[0])!!
-        val stylesOrNull: TextLinkStyles? = restore(list[1], TextLinkStylesSaver)
-        LinkAnnotation.Url(
-            url = url,
-            styles = stylesOrNull
-        )
-    }
-)
+            val url: String = restore(list[0])!!
+            val stylesOrNull: TextLinkStyles? = restore(list[1], TextLinkStylesSaver)
+            LinkAnnotation.Url(url = url, styles = stylesOrNull)
+        }
+    )
 
-private val ClickableSaver = Saver<LinkAnnotation.Clickable, Any>(
-    save = {
-        arrayListOf(
-            save(it.tag),
-            save(it.styles, TextLinkStylesSaver, this),
-        )
-    },
-    restore = {
-        val list = it as List<Any?>
+private val ClickableSaver =
+    Saver<LinkAnnotation.Clickable, Any>(
+        save = {
+            arrayListOf(
+                save(it.tag),
+                save(it.styles, TextLinkStylesSaver, this),
+            )
+        },
+        restore = {
+            val list = it as List<Any?>
 
-        val tag: String = restore(list[0])!!
-        val stylesOrNull: TextLinkStyles? = restore(list[1], TextLinkStylesSaver)
-        LinkAnnotation.Clickable(
-            tag = tag,
-            styles = stylesOrNull,
-            linkInteractionListener = null
-        )
-    }
-)
+            val tag: String = restore(list[0])!!
+            val stylesOrNull: TextLinkStyles? = restore(list[1], TextLinkStylesSaver)
+            LinkAnnotation.Clickable(
+                tag = tag,
+                styles = stylesOrNull,
+                linkInteractionListener = null
+            )
+        }
+    )
 
-internal val ParagraphStyleSaver = Saver<ParagraphStyle, Any>(
-    save = {
-        arrayListOf(
-            save(it.textAlign),
-            save(it.textDirection),
-            save(it.lineHeight, TextUnit.Saver, this),
-            save(it.textIndent, TextIndent.Saver, this)
-        )
-    },
-    restore = {
-        val list = it as List<Any?>
-        ParagraphStyle(
-            textAlign = restore(list[0])!!,
-            textDirection = restore(list[1])!!,
-            lineHeight = restore(list[2], TextUnit.Saver)!!,
-            textIndent = restore(list[3], TextIndent.Saver)
-        )
-    }
-)
+internal val ParagraphStyleSaver =
+    Saver<ParagraphStyle, Any>(
+        save = {
+            arrayListOf(
+                save(it.textAlign),
+                save(it.textDirection),
+                save(it.lineHeight, TextUnit.Saver, this),
+                save(it.textIndent, TextIndent.Saver, this)
+            )
+        },
+        restore = {
+            val list = it as List<Any?>
+            ParagraphStyle(
+                textAlign = restore(list[0])!!,
+                textDirection = restore(list[1])!!,
+                lineHeight = restore(list[2], TextUnit.Saver)!!,
+                textIndent = restore(list[3], TextIndent.Saver)
+            )
+        }
+    )
 
-internal val SpanStyleSaver = Saver<SpanStyle, Any>(
-    save = {
-        arrayListOf(
-            save(it.color, Color.Saver, this),
-            save(it.fontSize, TextUnit.Saver, this),
-            save(it.fontWeight, FontWeight.Saver, this),
-            save(it.fontStyle),
-            save(it.fontSynthesis),
-            save(-1), // TODO save fontFamily
-            save(it.fontFeatureSettings),
-            save(it.letterSpacing, TextUnit.Saver, this),
-            save(it.baselineShift, BaselineShift.Saver, this),
-            save(it.textGeometricTransform, TextGeometricTransform.Saver, this),
-            save(it.localeList, LocaleList.Saver, this),
-            save(it.background, Color.Saver, this),
-            save(it.textDecoration, TextDecoration.Saver, this),
-            save(it.shadow, Shadow.Saver, this)
-        )
-    },
-    restore = {
-        val list = it as List<Any?>
-        SpanStyle(
-            color = restore(list[0], Color.Saver)!!,
-            fontSize = restore(list[1], TextUnit.Saver)!!,
-            fontWeight = restore(list[2], FontWeight.Saver),
-            fontStyle = restore(list[3]),
-            fontSynthesis = restore(list[4]),
-            // val fontFamily = list[5] // TODO restore fontFamily
-            fontFeatureSettings = restore(list[6]),
-            letterSpacing = restore(list[7], TextUnit.Saver)!!,
-            baselineShift = restore(list[8], BaselineShift.Saver),
-            textGeometricTransform = restore(list[9], TextGeometricTransform.Saver),
-            localeList = restore(list[10], LocaleList.Saver),
-            background = restore(list[11], Color.Saver)!!,
-            textDecoration = restore(list[12], TextDecoration.Saver),
-            shadow = restore(list[13], Shadow.Saver)
-        )
-    }
-)
+internal val SpanStyleSaver =
+    Saver<SpanStyle, Any>(
+        save = {
+            arrayListOf(
+                save(it.color, Color.Saver, this),
+                save(it.fontSize, TextUnit.Saver, this),
+                save(it.fontWeight, FontWeight.Saver, this),
+                save(it.fontStyle),
+                save(it.fontSynthesis),
+                save(-1), // TODO save fontFamily
+                save(it.fontFeatureSettings),
+                save(it.letterSpacing, TextUnit.Saver, this),
+                save(it.baselineShift, BaselineShift.Saver, this),
+                save(it.textGeometricTransform, TextGeometricTransform.Saver, this),
+                save(it.localeList, LocaleList.Saver, this),
+                save(it.background, Color.Saver, this),
+                save(it.textDecoration, TextDecoration.Saver, this),
+                save(it.shadow, Shadow.Saver, this)
+            )
+        },
+        restore = {
+            val list = it as List<Any?>
+            SpanStyle(
+                color = restore(list[0], Color.Saver)!!,
+                fontSize = restore(list[1], TextUnit.Saver)!!,
+                fontWeight = restore(list[2], FontWeight.Saver),
+                fontStyle = restore(list[3]),
+                fontSynthesis = restore(list[4]),
+                // val fontFamily = list[5] // TODO restore fontFamily
+                fontFeatureSettings = restore(list[6]),
+                letterSpacing = restore(list[7], TextUnit.Saver)!!,
+                baselineShift = restore(list[8], BaselineShift.Saver),
+                textGeometricTransform = restore(list[9], TextGeometricTransform.Saver),
+                localeList = restore(list[10], LocaleList.Saver),
+                background = restore(list[11], Color.Saver)!!,
+                textDecoration = restore(list[12], TextDecoration.Saver),
+                shadow = restore(list[13], Shadow.Saver)
+            )
+        }
+    )
 
-internal val TextLinkStylesSaver = Saver<TextLinkStyles, Any>(
-    save = {
-        arrayListOf(
-            save(it.style, SpanStyleSaver, this),
-            save(it.focusedStyle, SpanStyleSaver, this),
-            save(it.hoveredStyle, SpanStyleSaver, this),
-            save(it.pressedStyle, SpanStyleSaver, this),
-        )
-    },
-    restore = {
-        val list = it as List<Any?>
-        val styleOrNull: SpanStyle? = restore(list[0], SpanStyleSaver)
-        val focusedStyleOrNull: SpanStyle? = restore(list[1], SpanStyleSaver)
-        val hoveredStyleOrNull: SpanStyle? = restore(list[2], SpanStyleSaver)
-        val pressedStyleOrNull: SpanStyle? = restore(list[3], SpanStyleSaver)
-        TextLinkStyles(
-            styleOrNull,
-            focusedStyleOrNull,
-            hoveredStyleOrNull,
-            pressedStyleOrNull
-        )
-    }
-)
+internal val TextLinkStylesSaver =
+    Saver<TextLinkStyles, Any>(
+        save = {
+            arrayListOf(
+                save(it.style, SpanStyleSaver, this),
+                save(it.focusedStyle, SpanStyleSaver, this),
+                save(it.hoveredStyle, SpanStyleSaver, this),
+                save(it.pressedStyle, SpanStyleSaver, this),
+            )
+        },
+        restore = {
+            val list = it as List<Any?>
+            val styleOrNull: SpanStyle? = restore(list[0], SpanStyleSaver)
+            val focusedStyleOrNull: SpanStyle? = restore(list[1], SpanStyleSaver)
+            val hoveredStyleOrNull: SpanStyle? = restore(list[2], SpanStyleSaver)
+            val pressedStyleOrNull: SpanStyle? = restore(list[3], SpanStyleSaver)
+            TextLinkStyles(styleOrNull, focusedStyleOrNull, hoveredStyleOrNull, pressedStyleOrNull)
+        }
+    )
 
 internal val TextDecoration.Companion.Saver: Saver<TextDecoration, Any>
     get() = TextDecorationSaver
 
-private val TextDecorationSaver = Saver<TextDecoration, Any>(
-    save = { it.mask },
-    restore = { TextDecoration(it as Int) }
-)
+private val TextDecorationSaver =
+    Saver<TextDecoration, Any>(save = { it.mask }, restore = { TextDecoration(it as Int) })
 
 internal val TextGeometricTransform.Companion.Saver: Saver<TextGeometricTransform, Any>
     get() = TextGeometricTransformSaver
 
-private val TextGeometricTransformSaver = Saver<TextGeometricTransform, Any>(
-    save = { arrayListOf(it.scaleX, it.skewX) },
-    restore = {
-        @Suppress("UNCHECKED_CAST")
-        val list = it as List<Float>
-        TextGeometricTransform(scaleX = list[0], skewX = list[1])
-    }
-)
+private val TextGeometricTransformSaver =
+    Saver<TextGeometricTransform, Any>(
+        save = { arrayListOf(it.scaleX, it.skewX) },
+        restore = {
+            @Suppress("UNCHECKED_CAST") val list = it as List<Float>
+            TextGeometricTransform(scaleX = list[0], skewX = list[1])
+        }
+    )
 
 internal val TextIndent.Companion.Saver: Saver<TextIndent, Any>
     get() = TextIndentSaver
 
-private val TextIndentSaver = Saver<TextIndent, Any>(
-    save = {
-        arrayListOf(
-            save(it.firstLine, TextUnit.Saver, this),
-            save(it.restLine, TextUnit.Saver, this)
-        )
-    },
-    restore = {
-        @Suppress("UNCHECKED_CAST")
-        val list = it as List<Any>
-        TextIndent(
-            firstLine = restore(list[0], TextUnit.Saver)!!,
-            restLine = restore(list[1], TextUnit.Saver)!!
-        )
-    }
-)
+private val TextIndentSaver =
+    Saver<TextIndent, Any>(
+        save = {
+            arrayListOf(
+                save(it.firstLine, TextUnit.Saver, this),
+                save(it.restLine, TextUnit.Saver, this)
+            )
+        },
+        restore = {
+            @Suppress("UNCHECKED_CAST") val list = it as List<Any>
+            TextIndent(
+                firstLine = restore(list[0], TextUnit.Saver)!!,
+                restLine = restore(list[1], TextUnit.Saver)!!
+            )
+        }
+    )
 
 internal val FontWeight.Companion.Saver: Saver<FontWeight, Any>
     get() = FontWeightSaver
 
-private val FontWeightSaver = Saver<FontWeight, Any>(
-    save = { it.weight },
-    restore = { FontWeight(it as Int) }
-)
+private val FontWeightSaver =
+    Saver<FontWeight, Any>(save = { it.weight }, restore = { FontWeight(it as Int) })
 
 internal val BaselineShift.Companion.Saver: Saver<BaselineShift, Any>
     get() = BaselineShiftSaver
 
-private val BaselineShiftSaver = Saver<BaselineShift, Any>(
-    save = { it.multiplier },
-    restore = {
-        BaselineShift(it as Float)
-    }
-)
+private val BaselineShiftSaver =
+    Saver<BaselineShift, Any>(save = { it.multiplier }, restore = { BaselineShift(it as Float) })
 
 internal val TextRange.Companion.Saver: Saver<TextRange, Any>
     get() = TextRangeSaver
 
-private val TextRangeSaver = Saver<TextRange, Any>(
-    save = {
-        arrayListOf(save(it.start), save(it.end))
-    },
-    restore = {
-        @Suppress("UNCHECKED_CAST")
-        val list = it as List<Any>
-        TextRange(restore(list[0])!!, restore(list[1])!!)
-    }
-)
+private val TextRangeSaver =
+    Saver<TextRange, Any>(
+        save = { arrayListOf(save(it.start), save(it.end)) },
+        restore = {
+            @Suppress("UNCHECKED_CAST") val list = it as List<Any>
+            TextRange(restore(list[0])!!, restore(list[1])!!)
+        }
+    )
 
 internal val Shadow.Companion.Saver: Saver<Shadow, Any>
     get() = ShadowSaver
 
-private val ShadowSaver = Saver<Shadow, Any>(
-    save = {
-        arrayListOf(
-            save(it.color, Color.Saver, this),
-            save(it.offset, Offset.Saver, this),
-            save(it.blurRadius)
-        )
-    },
-    restore = {
-        @Suppress("UNCHECKED_CAST")
-        val list = it as List<Any>
-        Shadow(
-            color = restore(list[0], Color.Saver)!!,
-            offset = restore(list[1], Offset.Saver)!!,
-            blurRadius = restore(list[2])!!
-        )
-    }
-)
+private val ShadowSaver =
+    Saver<Shadow, Any>(
+        save = {
+            arrayListOf(
+                save(it.color, Color.Saver, this),
+                save(it.offset, Offset.Saver, this),
+                save(it.blurRadius)
+            )
+        },
+        restore = {
+            @Suppress("UNCHECKED_CAST") val list = it as List<Any>
+            Shadow(
+                color = restore(list[0], Color.Saver)!!,
+                offset = restore(list[1], Offset.Saver)!!,
+                blurRadius = restore(list[2])!!
+            )
+        }
+    )
 
 internal val Color.Companion.Saver: Saver<Color, Any>
     get() = ColorSaver
 
-private val ColorSaver = NonNullValueClassSaver<Color, Any>(
-    save = {
-        if (it.isUnspecified) { false } else { it.toArgb() }
-    },
-    restore = {
-        if (it == false) { Color.Unspecified } else { Color(it as Int) }
-    }
-)
+private val ColorSaver =
+    NonNullValueClassSaver<Color, Any>(
+        save = {
+            if (it.isUnspecified) {
+                false
+            } else {
+                it.toArgb()
+            }
+        },
+        restore = {
+            if (it == false) {
+                Color.Unspecified
+            } else {
+                Color(it as Int)
+            }
+        }
+    )
 
 internal val TextUnit.Companion.Saver: Saver<TextUnit, Any>
     get() = TextUnitSaver
 
-private val TextUnitSaver = NonNullValueClassSaver<TextUnit, Any>(
-    save = {
-        if (it == TextUnit.Unspecified) {
-            false
-        } else {
-            arrayListOf(save(it.value), save(it.type))
+private val TextUnitSaver =
+    NonNullValueClassSaver<TextUnit, Any>(
+        save = {
+            if (it == TextUnit.Unspecified) {
+                false
+            } else {
+                arrayListOf(save(it.value), save(it.type))
+            }
+        },
+        restore = {
+            if (it == false) {
+                TextUnit.Unspecified
+            } else {
+                @Suppress("UNCHECKED_CAST") val list = it as List<Any>
+                TextUnit(restore(list[0])!!, restore(list[1])!!)
+            }
         }
-    },
-    restore = {
-        if (it == false) {
-            TextUnit.Unspecified
-        } else {
-            @Suppress("UNCHECKED_CAST")
-            val list = it as List<Any>
-            TextUnit(restore(list[0])!!, restore(list[1])!!)
-        }
-    }
-)
+    )
 
 internal val Offset.Companion.Saver: Saver<Offset, Any>
     get() = OffsetSaver
 
-private val OffsetSaver = NonNullValueClassSaver<Offset, Any>(
-    save = {
-        if (it == Offset.Unspecified) {
-            false
-        } else {
-            arrayListOf(save(it.x), save(it.y))
+private val OffsetSaver =
+    NonNullValueClassSaver<Offset, Any>(
+        save = {
+            if (it == Offset.Unspecified) {
+                false
+            } else {
+                arrayListOf(save(it.x), save(it.y))
+            }
+        },
+        restore = {
+            if (it == false) {
+                Offset.Unspecified
+            } else {
+                val list = it as List<Any?>
+                Offset(restore(list[0])!!, restore(list[1])!!)
+            }
         }
-    },
-    restore = {
-        if (it == false) {
-            Offset.Unspecified
-        } else {
-            val list = it as List<Any?>
-            Offset(restore(list[0])!!, restore(list[1])!!)
-        }
-    }
-)
+    )
 
 internal val LocaleList.Companion.Saver: Saver<LocaleList, Any>
     get() = LocaleListSaver
 
-private val LocaleListSaver = Saver<LocaleList, Any>(
-    save = {
-        it.localeList.fastMap { locale ->
-            save(locale, Locale.Saver, this)
+private val LocaleListSaver =
+    Saver<LocaleList, Any>(
+        save = { it.localeList.fastMap { locale -> save(locale, Locale.Saver, this) } },
+        restore = {
+            @Suppress("UNCHECKED_CAST") val list = it as List<Any>
+            LocaleList(list.fastMap { item -> restore(item, Locale.Saver)!! })
         }
-    },
-    restore = {
-        @Suppress("UNCHECKED_CAST")
-        val list = it as List<Any>
-        LocaleList(list.fastMap { item -> restore(item, Locale.Saver)!! })
-    }
-)
+    )
 
 internal val Locale.Companion.Saver: Saver<Locale, Any>
     get() = LocaleSaver
 
-private val LocaleSaver = Saver<Locale, Any>(
-    save = { it.toLanguageTag() },
-    restore = { Locale(languageTag = it as String) }
-)
+private val LocaleSaver =
+    Saver<Locale, Any>(
+        save = { it.toLanguageTag() },
+        restore = { Locale(languageTag = it as String) }
+    )
diff --git a/compose/ui/ui-text/src/commonMain/kotlin/androidx/compose/ui/text/SpanStyle.kt b/compose/ui/ui-text/src/commonMain/kotlin/androidx/compose/ui/text/SpanStyle.kt
index 21bfb54..d9614be 100644
--- a/compose/ui/ui-text/src/commonMain/kotlin/androidx/compose/ui/text/SpanStyle.kt
+++ b/compose/ui/ui-text/src/commonMain/kotlin/androidx/compose/ui/text/SpanStyle.kt
@@ -53,24 +53,24 @@
 private val DefaultColorForegroundStyle = TextForegroundStyle.from(DefaultColor)
 
 /**
- * Styling configuration for a text span. This configuration only allows character level styling,
- * in order to set paragraph level styling such as line height, or text alignment please see
+ * Styling configuration for a text span. This configuration only allows character level styling, in
+ * order to set paragraph level styling such as line height, or text alignment please see
  * [ParagraphStyle].
  *
  * @sample androidx.compose.ui.text.samples.SpanStyleSample
  *
  * @sample androidx.compose.ui.text.samples.AnnotatedStringBuilderSample
  *
- * @param fontSize The size of glyphs (in logical pixels) to use when painting the text. This
- * may be [TextUnit.Unspecified] for inheriting from another [SpanStyle].
+ * @param fontSize The size of glyphs (in logical pixels) to use when painting the text. This may be
+ *   [TextUnit.Unspecified] for inheriting from another [SpanStyle].
  * @param fontWeight The typeface thickness to use when painting the text (e.g., bold).
  * @param fontStyle The typeface variant to use when drawing the letters (e.g., italic).
  * @param fontSynthesis Whether to synthesize font weight and/or style when the requested weight or
- *  style cannot be found in the provided font family.
+ *   style cannot be found in the provided font family.
  * @param fontFamily The font family to be used when rendering the text.
  * @param fontFeatureSettings The advanced typography settings provided by font. The format is the
- *  same as the CSS font-feature-settings attribute:
- *  https://www.w3.org/TR/css-fonts-3/#font-feature-settings-prop
+ *   same as the CSS font-feature-settings attribute:
+ *   https://www.w3.org/TR/css-fonts-3/#font-feature-settings-prop
  * @param letterSpacing The amount of space (in em) to add between each letter.
  * @param baselineShift The amount by which the text is shifted up from the current baseline.
  * @param textGeometricTransform The geometric transformation applied the text.
@@ -80,14 +80,14 @@
  * @param shadow The shadow effect applied on the text.
  * @param platformStyle Platform specific [SpanStyle] parameters.
  * @param drawStyle Drawing style of text, whether fill in the text while drawing or stroke around
- * the edges.
- *
+ *   the edges.
  * @see AnnotatedString
  * @see TextStyle
  * @see ParagraphStyle
  */
 @Immutable
-class SpanStyle internal constructor(
+class SpanStyle
+internal constructor(
     // The fill to draw text, a unified representation of Color and Brush.
     internal val textForegroundStyle: TextForegroundStyle,
     val fontSize: TextUnit = TextUnit.Unspecified,
@@ -108,9 +108,9 @@
 ) {
 
     /**
-     * Styling configuration for a text span. This configuration only allows character level styling,
-     * in order to set paragraph level styling such as line height, or text alignment please see
-     * [ParagraphStyle].
+     * Styling configuration for a text span. This configuration only allows character level
+     * styling, in order to set paragraph level styling such as line height, or text alignment
+     * please see [ParagraphStyle].
      *
      * @sample androidx.compose.ui.text.samples.SpanStyleSample
      *
@@ -118,15 +118,15 @@
      *
      * @param color The text color.
      * @param fontSize The size of glyphs (in logical pixels) to use when painting the text. This
-     * may be [TextUnit.Unspecified] for inheriting from another [SpanStyle].
+     *   may be [TextUnit.Unspecified] for inheriting from another [SpanStyle].
      * @param fontWeight The typeface thickness to use when painting the text (e.g., bold).
      * @param fontStyle The typeface variant to use when drawing the letters (e.g., italic).
      * @param fontSynthesis Whether to synthesize font weight and/or style when the requested weight
-     * or style cannot be found in the provided font family.
+     *   or style cannot be found in the provided font family.
      * @param fontFamily The font family to be used when rendering the text.
      * @param fontFeatureSettings The advanced typography settings provided by font. The format is
-     * the same as the CSS font-feature-settings attribute:
-     *  https://www.w3.org/TR/css-fonts-3/#font-feature-settings-prop
+     *   the same as the CSS font-feature-settings attribute:
+     *   https://www.w3.org/TR/css-fonts-3/#font-feature-settings-prop
      * @param letterSpacing The amount of space (in em) to add between each letter.
      * @param baselineShift The amount by which the text is shifted up from the current baseline.
      * @param textGeometricTransform The geometric transformation applied the text.
@@ -134,7 +134,6 @@
      * @param background The background color for the text.
      * @param textDecoration The decorations to paint on the text (e.g., an underline).
      * @param shadow The shadow effect applied on the text.
-     *
      * @see AnnotatedString
      * @see TextStyle
      * @see ParagraphStyle
@@ -179,9 +178,9 @@
     )
 
     /**
-     * Styling configuration for a text span. This configuration only allows character level styling,
-     * in order to set paragraph level styling such as line height, or text alignment please see
-     * [ParagraphStyle].
+     * Styling configuration for a text span. This configuration only allows character level
+     * styling, in order to set paragraph level styling such as line height, or text alignment
+     * please see [ParagraphStyle].
      *
      * @sample androidx.compose.ui.text.samples.SpanStyleSample
      *
@@ -189,15 +188,15 @@
      *
      * @param color The color to draw the text.
      * @param fontSize The size of glyphs (in logical pixels) to use when painting the text. This
-     * may be [TextUnit.Unspecified] for inheriting from another [SpanStyle].
+     *   may be [TextUnit.Unspecified] for inheriting from another [SpanStyle].
      * @param fontWeight The typeface thickness to use when painting the text (e.g., bold).
      * @param fontStyle The typeface variant to use when drawing the letters (e.g., italic).
      * @param fontSynthesis Whether to synthesize font weight and/or style when the requested weight
-     * or style cannot be found in the provided font family.
+     *   or style cannot be found in the provided font family.
      * @param fontFamily The font family to be used when rendering the text.
      * @param fontFeatureSettings The advanced typography settings provided by font. The format is
-     * the same as the CSS font-feature-settings attribute:
-     *  https://www.w3.org/TR/css-fonts-3/#font-feature-settings-prop
+     *   the same as the CSS font-feature-settings attribute:
+     *   https://www.w3.org/TR/css-fonts-3/#font-feature-settings-prop
      * @param letterSpacing The amount of space (in em) to add between each letter.
      * @param baselineShift The amount by which the text is shifted up from the current baseline.
      * @param textGeometricTransform The geometric transformation applied the text.
@@ -206,7 +205,6 @@
      * @param textDecoration The decorations to paint on the text (e.g., an underline).
      * @param shadow The shadow effect applied on the text.
      * @param platformStyle Platform specific [SpanStyle] parameters.
-     *
      * @see AnnotatedString
      * @see TextStyle
      * @see ParagraphStyle
@@ -252,9 +250,9 @@
     )
 
     /**
-     * Styling configuration for a text span. This configuration only allows character level styling,
-     * in order to set paragraph level styling such as line height, or text alignment please see
-     * [ParagraphStyle].
+     * Styling configuration for a text span. This configuration only allows character level
+     * styling, in order to set paragraph level styling such as line height, or text alignment
+     * please see [ParagraphStyle].
      *
      * @sample androidx.compose.ui.text.samples.SpanStyleSample
      *
@@ -262,15 +260,15 @@
      *
      * @param color The color to draw the text.
      * @param fontSize The size of glyphs (in logical pixels) to use when painting the text. This
-     * may be [TextUnit.Unspecified] for inheriting from another [SpanStyle].
+     *   may be [TextUnit.Unspecified] for inheriting from another [SpanStyle].
      * @param fontWeight The typeface thickness to use when painting the text (e.g., bold).
      * @param fontStyle The typeface variant to use when drawing the letters (e.g., italic).
      * @param fontSynthesis Whether to synthesize font weight and/or style when the requested weight
-     * or style cannot be found in the provided font family.
+     *   or style cannot be found in the provided font family.
      * @param fontFamily The font family to be used when rendering the text.
      * @param fontFeatureSettings The advanced typography settings provided by font. The format is
-     * the same as the CSS font-feature-settings attribute:
-     *  https://www.w3.org/TR/css-fonts-3/#font-feature-settings-prop
+     *   the same as the CSS font-feature-settings attribute:
+     *   https://www.w3.org/TR/css-fonts-3/#font-feature-settings-prop
      * @param letterSpacing The amount of space (in em) to add between each letter.
      * @param baselineShift The amount by which the text is shifted up from the current baseline.
      * @param textGeometricTransform The geometric transformation applied the text.
@@ -280,8 +278,7 @@
      * @param shadow The shadow effect applied on the text.
      * @param platformStyle Platform specific [SpanStyle] parameters.
      * @param drawStyle Drawing style of text, whether fill in the text while drawing or stroke
-     * around the edges.
-     *
+     *   around the edges.
      * @see AnnotatedString
      * @see TextStyle
      * @see ParagraphStyle
@@ -323,29 +320,29 @@
     )
 
     /**
-     * Styling configuration for a text span. This configuration only allows character level styling,
-     * in order to set paragraph level styling such as line height, or text alignment please see
-     * [ParagraphStyle].
+     * Styling configuration for a text span. This configuration only allows character level
+     * styling, in order to set paragraph level styling such as line height, or text alignment
+     * please see [ParagraphStyle].
      *
      * @sample androidx.compose.ui.text.samples.SpanStyleBrushSample
      *
      * @sample androidx.compose.ui.text.samples.AnnotatedStringBuilderSample
      *
      * @param brush The brush to use when painting the text. If brush is given as null, it will be
-     * treated as unspecified. It is equivalent to calling the alternative color constructor with
-     * [Color.Unspecified]
+     *   treated as unspecified. It is equivalent to calling the alternative color constructor with
+     *   [Color.Unspecified]
      * @param alpha Opacity to be applied to [brush] from 0.0f to 1.0f representing fully
-     * transparent to fully opaque respectively.
+     *   transparent to fully opaque respectively.
      * @param fontSize The size of glyphs (in logical pixels) to use when painting the text. This
-     * may be [TextUnit.Unspecified] for inheriting from another [SpanStyle].
+     *   may be [TextUnit.Unspecified] for inheriting from another [SpanStyle].
      * @param fontWeight The typeface thickness to use when painting the text (e.g., bold).
      * @param fontStyle The typeface variant to use when drawing the letters (e.g., italic).
      * @param fontSynthesis Whether to synthesize font weight and/or style when the requested weight
-     * or style cannot be found in the provided font family.
+     *   or style cannot be found in the provided font family.
      * @param fontFamily The font family to be used when rendering the text.
      * @param fontFeatureSettings The advanced typography settings provided by font. The format is
-     * the same as the CSS font-feature-settings attribute:
-     *  https://www.w3.org/TR/css-fonts-3/#font-feature-settings-prop
+     *   the same as the CSS font-feature-settings attribute:
+     *   https://www.w3.org/TR/css-fonts-3/#font-feature-settings-prop
      * @param letterSpacing The amount of space (in em) to add between each letter.
      * @param baselineShift The amount by which the text is shifted up from the current baseline.
      * @param textGeometricTransform The geometric transformation applied the text.
@@ -355,8 +352,7 @@
      * @param shadow The shadow effect applied on the text.
      * @param platformStyle Platform specific [SpanStyle] parameters.
      * @param drawStyle Drawing style of text, whether fill in the text while drawing or stroke
-     * around the edges.
-     *
+     *   around the edges.
      * @see AnnotatedString
      * @see TextStyle
      * @see ParagraphStyle
@@ -398,21 +394,20 @@
         drawStyle = drawStyle
     )
 
-    /**
-     * Color to draw text.
-     */
-    val color: Color get() = this.textForegroundStyle.color
+    /** Color to draw text. */
+    val color: Color
+        get() = this.textForegroundStyle.color
 
-    /**
-     * Brush to draw text. If not null, overrides [color].
-     */
-    val brush: Brush? get() = this.textForegroundStyle.brush
+    /** Brush to draw text. If not null, overrides [color]. */
+    val brush: Brush?
+        get() = this.textForegroundStyle.brush
 
     /**
      * Opacity of text. This value is either provided along side Brush, or via alpha channel in
      * color.
      */
-    val alpha: Float get() = this.textForegroundStyle.alpha
+    val alpha: Float
+        get() = this.textForegroundStyle.alpha
 
     /**
      * Returns a new span style that is a combination of this style and the given [other] style.
@@ -448,11 +443,8 @@
         )
     }
 
-    /**
-     * Plus operator overload that applies a [merge].
-     */
-    @Stable
-    operator fun plus(other: SpanStyle): SpanStyle = this.merge(other)
+    /** Plus operator overload that applies a [merge]. */
+    @Stable operator fun plus(other: SpanStyle): SpanStyle = this.merge(other)
 
     @Deprecated(
         "SpanStyle copy constructors that do not take new stable parameters " +
@@ -477,11 +469,12 @@
         shadow: Shadow? = this.shadow
     ): SpanStyle {
         return SpanStyle(
-            textForegroundStyle = if (color == this.color) {
-                textForegroundStyle
-            } else {
-                TextForegroundStyle.from(color)
-            },
+            textForegroundStyle =
+                if (color == this.color) {
+                    textForegroundStyle
+                } else {
+                    TextForegroundStyle.from(color)
+                },
             fontSize = fontSize,
             fontWeight = fontWeight,
             fontStyle = fontStyle,
@@ -524,11 +517,12 @@
         platformStyle: PlatformSpanStyle? = this.platformStyle
     ): SpanStyle {
         return SpanStyle(
-            textForegroundStyle = if (color == this.color) {
-                textForegroundStyle
-            } else {
-                TextForegroundStyle.from(color)
-            },
+            textForegroundStyle =
+                if (color == this.color) {
+                    textForegroundStyle
+                } else {
+                    TextForegroundStyle.from(color)
+                },
             fontSize = fontSize,
             fontWeight = fontWeight,
             fontStyle = fontStyle,
@@ -565,11 +559,12 @@
         drawStyle: DrawStyle? = this.drawStyle
     ): SpanStyle {
         return SpanStyle(
-            textForegroundStyle = if (color == this.color) {
-                textForegroundStyle
-            } else {
-                TextForegroundStyle.from(color)
-            },
+            textForegroundStyle =
+                if (color == this.color) {
+                    textForegroundStyle
+                } else {
+                    TextForegroundStyle.from(color)
+                },
             fontSize = fontSize,
             fontWeight = fontWeight,
             fontStyle = fontStyle,
@@ -630,8 +625,7 @@
     override fun equals(other: Any?): Boolean {
         if (this === other) return true
         if (other !is SpanStyle) return false
-        return hasSameLayoutAffectingAttributes(other) &&
-            hasSameNonLayoutAttributes(other)
+        return hasSameLayoutAffectingAttributes(other) && hasSameNonLayoutAttributes(other)
     }
 
     internal fun hasSameLayoutAffectingAttributes(other: SpanStyle): Boolean {
@@ -741,80 +735,47 @@
  *
  * This will not work well if the styles don't set the same fields.
  *
- * The [fraction] argument represents position on the timeline, with 0.0 meaning
- * that the interpolation has not started, returning [start] (or something
- * equivalent to [start]), 1.0 meaning that the interpolation has finished,
- * returning [stop] (or something equivalent to [stop]), and values in between
- * meaning that the interpolation is at the relevant point on the timeline
- * between [start] and [stop]. The interpolation can be extrapolated beyond 0.0 and
- * 1.0, so negative values and values greater than 1.0 are valid.
+ * The [fraction] argument represents position on the timeline, with 0.0 meaning that the
+ * interpolation has not started, returning [start] (or something equivalent to [start]), 1.0
+ * meaning that the interpolation has finished, returning [stop] (or something equivalent to
+ * [stop]), and values in between meaning that the interpolation is at the relevant point on the
+ * timeline between [start] and [stop]. The interpolation can be extrapolated beyond 0.0 and 1.0, so
+ * negative values and values greater than 1.0 are valid.
  */
 fun lerp(start: SpanStyle, stop: SpanStyle, fraction: Float): SpanStyle {
     return SpanStyle(
         textForegroundStyle = lerp(start.textForegroundStyle, stop.textForegroundStyle, fraction),
-        fontFamily = lerpDiscrete(
-            start.fontFamily,
-            stop.fontFamily,
-            fraction
-        ),
+        fontFamily = lerpDiscrete(start.fontFamily, stop.fontFamily, fraction),
         fontSize = lerpTextUnitInheritable(start.fontSize, stop.fontSize, fraction),
-        fontWeight = lerp(
-            start.fontWeight ?: FontWeight.Normal,
-            stop.fontWeight ?: FontWeight.Normal,
-            fraction
-        ),
-        fontStyle = lerpDiscrete(
-            start.fontStyle,
-            stop.fontStyle,
-            fraction
-        ),
-        fontSynthesis = lerpDiscrete(
-            start.fontSynthesis,
-            stop.fontSynthesis,
-            fraction
-        ),
-        fontFeatureSettings = lerpDiscrete(
-            start.fontFeatureSettings,
-            stop.fontFeatureSettings,
-            fraction
-        ),
-        letterSpacing = lerpTextUnitInheritable(
-            start.letterSpacing,
-            stop.letterSpacing,
-            fraction
-        ),
-        baselineShift = lerp(
-            start.baselineShift ?: BaselineShift(0f),
-            stop.baselineShift ?: BaselineShift(0f),
-            fraction
-        ),
-        textGeometricTransform = lerp(
-            start.textGeometricTransform ?: TextGeometricTransform.None,
-            stop.textGeometricTransform ?: TextGeometricTransform.None,
-            fraction
-        ),
+        fontWeight =
+            lerp(
+                start.fontWeight ?: FontWeight.Normal,
+                stop.fontWeight ?: FontWeight.Normal,
+                fraction
+            ),
+        fontStyle = lerpDiscrete(start.fontStyle, stop.fontStyle, fraction),
+        fontSynthesis = lerpDiscrete(start.fontSynthesis, stop.fontSynthesis, fraction),
+        fontFeatureSettings =
+            lerpDiscrete(start.fontFeatureSettings, stop.fontFeatureSettings, fraction),
+        letterSpacing = lerpTextUnitInheritable(start.letterSpacing, stop.letterSpacing, fraction),
+        baselineShift =
+            lerp(
+                start.baselineShift ?: BaselineShift(0f),
+                stop.baselineShift ?: BaselineShift(0f),
+                fraction
+            ),
+        textGeometricTransform =
+            lerp(
+                start.textGeometricTransform ?: TextGeometricTransform.None,
+                stop.textGeometricTransform ?: TextGeometricTransform.None,
+                fraction
+            ),
         localeList = lerpDiscrete(start.localeList, stop.localeList, fraction),
-        background = lerp(
-            start.background,
-            stop.background,
-            fraction
-        ),
-        textDecoration = lerpDiscrete(
-            start.textDecoration,
-            stop.textDecoration,
-            fraction
-        ),
-        shadow = lerp(
-            start.shadow ?: Shadow(),
-            stop.shadow ?: Shadow(),
-            fraction
-        ),
+        background = lerp(start.background, stop.background, fraction),
+        textDecoration = lerpDiscrete(start.textDecoration, stop.textDecoration, fraction),
+        shadow = lerp(start.shadow ?: Shadow(), stop.shadow ?: Shadow(), fraction),
         platformStyle = lerpPlatformStyle(start.platformStyle, stop.platformStyle, fraction),
-        drawStyle = lerpDiscrete(
-            start.drawStyle,
-            stop.drawStyle,
-            fraction
-        )
+        drawStyle = lerpDiscrete(start.drawStyle, stop.drawStyle, fraction)
     )
 }
 
@@ -829,28 +790,30 @@
     return lerp(startNonNull, stopNonNull, fraction)
 }
 
-internal fun resolveSpanStyleDefaults(style: SpanStyle) = SpanStyle(
-    textForegroundStyle = style.textForegroundStyle.takeOrElse { DefaultColorForegroundStyle },
-    fontSize = if (style.fontSize.isUnspecified) DefaultFontSize else style.fontSize,
-    fontWeight = style.fontWeight ?: FontWeight.Normal,
-    fontStyle = style.fontStyle ?: FontStyle.Normal,
-    fontSynthesis = style.fontSynthesis ?: FontSynthesis.All,
-    fontFamily = style.fontFamily ?: FontFamily.Default,
-    fontFeatureSettings = style.fontFeatureSettings ?: "",
-    letterSpacing = if (style.letterSpacing.isUnspecified) {
-        DefaultLetterSpacing
-    } else {
-        style.letterSpacing
-    },
-    baselineShift = style.baselineShift ?: BaselineShift.None,
-    textGeometricTransform = style.textGeometricTransform ?: TextGeometricTransform.None,
-    localeList = style.localeList ?: LocaleList.current,
-    background = style.background.takeOrElse { DefaultBackgroundColor },
-    textDecoration = style.textDecoration ?: TextDecoration.None,
-    shadow = style.shadow ?: Shadow.None,
-    platformStyle = style.platformStyle,
-    drawStyle = style.drawStyle ?: Fill
-)
+internal fun resolveSpanStyleDefaults(style: SpanStyle) =
+    SpanStyle(
+        textForegroundStyle = style.textForegroundStyle.takeOrElse { DefaultColorForegroundStyle },
+        fontSize = if (style.fontSize.isUnspecified) DefaultFontSize else style.fontSize,
+        fontWeight = style.fontWeight ?: FontWeight.Normal,
+        fontStyle = style.fontStyle ?: FontStyle.Normal,
+        fontSynthesis = style.fontSynthesis ?: FontSynthesis.All,
+        fontFamily = style.fontFamily ?: FontFamily.Default,
+        fontFeatureSettings = style.fontFeatureSettings ?: "",
+        letterSpacing =
+            if (style.letterSpacing.isUnspecified) {
+                DefaultLetterSpacing
+            } else {
+                style.letterSpacing
+            },
+        baselineShift = style.baselineShift ?: BaselineShift.None,
+        textGeometricTransform = style.textGeometricTransform ?: TextGeometricTransform.None,
+        localeList = style.localeList ?: LocaleList.current,
+        background = style.background.takeOrElse { DefaultBackgroundColor },
+        textDecoration = style.textDecoration ?: TextDecoration.None,
+        shadow = style.shadow ?: Shadow.None,
+        platformStyle = style.platformStyle,
+        drawStyle = style.drawStyle ?: Fill
+    )
 
 internal fun SpanStyle.fastMerge(
     color: Color,
@@ -874,49 +837,46 @@
 ): SpanStyle {
     // prioritize the parameters to Text in diffs here
     /**
-     *  color: Color
-     *  fontSize: TextUnit
-     *  fontStyle: FontStyle?
-     *  fontWeight: FontWeight?
-     *  fontFamily: FontFamily?
-     *  letterSpacing: TextUnit
-     *  textDecoration: TextDecoration?
-     *  textAlign: TextAlign?
-     *  lineHeight: TextUnit
+     * color: Color fontSize: TextUnit fontStyle: FontStyle? fontWeight: FontWeight? fontFamily:
+     * FontFamily? letterSpacing: TextUnit textDecoration: TextDecoration? textAlign: TextAlign?
+     * lineHeight: TextUnit
      */
 
     // any new vals should do a pre-merge check here
-    val requiresAlloc = fontSize.isSpecified && fontSize != this.fontSize ||
-        brush == null && color.isSpecified && color != textForegroundStyle.color ||
-        fontStyle != null && fontStyle != this.fontStyle ||
-        fontWeight != null && fontWeight != this.fontWeight ||
-        // ref check for font-family, since we don't want to compare lists in fast path
-        fontFamily != null && fontFamily !== this.fontFamily ||
-        letterSpacing.isSpecified && letterSpacing != this.letterSpacing ||
-        textDecoration != null && textDecoration != this.textDecoration ||
-        // then compare the remaining params, for potential non-Text merges
-        brush != textForegroundStyle.brush ||
-        brush != null && alpha != this.textForegroundStyle.alpha ||
-        fontSynthesis != null && fontSynthesis != this.fontSynthesis ||
-        fontFeatureSettings != null && fontFeatureSettings != this.fontFeatureSettings ||
-        baselineShift != null && baselineShift != this.baselineShift ||
-        textGeometricTransform != null && textGeometricTransform != this.textGeometricTransform ||
-        localeList != null && localeList != this.localeList ||
-        background.isSpecified && background != this.background ||
-        shadow != null && shadow != this.shadow ||
-        platformStyle != null && platformStyle != this.platformStyle ||
-        drawStyle != null && drawStyle != this.drawStyle
+    val requiresAlloc =
+        fontSize.isSpecified && fontSize != this.fontSize ||
+            brush == null && color.isSpecified && color != textForegroundStyle.color ||
+            fontStyle != null && fontStyle != this.fontStyle ||
+            fontWeight != null && fontWeight != this.fontWeight ||
+            // ref check for font-family, since we don't want to compare lists in fast path
+            fontFamily != null && fontFamily !== this.fontFamily ||
+            letterSpacing.isSpecified && letterSpacing != this.letterSpacing ||
+            textDecoration != null && textDecoration != this.textDecoration ||
+            // then compare the remaining params, for potential non-Text merges
+            brush != textForegroundStyle.brush ||
+            brush != null && alpha != this.textForegroundStyle.alpha ||
+            fontSynthesis != null && fontSynthesis != this.fontSynthesis ||
+            fontFeatureSettings != null && fontFeatureSettings != this.fontFeatureSettings ||
+            baselineShift != null && baselineShift != this.baselineShift ||
+            textGeometricTransform != null &&
+                textGeometricTransform != this.textGeometricTransform ||
+            localeList != null && localeList != this.localeList ||
+            background.isSpecified && background != this.background ||
+            shadow != null && shadow != this.shadow ||
+            platformStyle != null && platformStyle != this.platformStyle ||
+            drawStyle != null && drawStyle != this.drawStyle
 
     if (!requiresAlloc) {
         // we're done
         return this
     }
 
-    val otherTextForegroundStyle = if (brush != null) {
-        TextForegroundStyle.from(brush, alpha)
-    } else {
-        TextForegroundStyle.from(color)
-    }
+    val otherTextForegroundStyle =
+        if (brush != null) {
+            TextForegroundStyle.from(brush, alpha)
+        } else {
+            TextForegroundStyle.from(color)
+        }
 
     return SpanStyle(
         textForegroundStyle = textForegroundStyle.merge(otherTextForegroundStyle),
@@ -926,11 +886,12 @@
         fontStyle = fontStyle ?: this.fontStyle,
         fontSynthesis = fontSynthesis ?: this.fontSynthesis,
         fontFeatureSettings = fontFeatureSettings ?: this.fontFeatureSettings,
-        letterSpacing = if (!letterSpacing.isUnspecified) {
-            letterSpacing
-        } else {
-            this.letterSpacing
-        },
+        letterSpacing =
+            if (!letterSpacing.isUnspecified) {
+                letterSpacing
+            } else {
+                this.letterSpacing
+            },
         baselineShift = baselineShift ?: this.baselineShift,
         textGeometricTransform = textGeometricTransform ?: this.textGeometricTransform,
         localeList = localeList ?: this.localeList,
diff --git a/compose/ui/ui-text/src/commonMain/kotlin/androidx/compose/ui/text/String.kt b/compose/ui/ui-text/src/commonMain/kotlin/androidx/compose/ui/text/String.kt
index 4b9b08b..ab00662 100644
--- a/compose/ui/ui-text/src/commonMain/kotlin/androidx/compose/ui/text/String.kt
+++ b/compose/ui/ui-text/src/commonMain/kotlin/androidx/compose/ui/text/String.kt
@@ -21,9 +21,7 @@
 import androidx.compose.ui.text.intl.PlatformLocale
 import androidx.compose.ui.text.platform.ActualStringDelegate
 
-/**
- * Interface for providing platform dependent string related operations.
- */
+/** Interface for providing platform dependent string related operations. */
 internal interface PlatformStringDelegate {
     /**
      * Implementation must return uppercase transformed String.
@@ -79,6 +77,7 @@
  */
 fun String.toLowerCase(locale: Locale): String =
     stringDelegate.toLowerCase(this, locale.platformLocale)
+
 /**
  * Returns capitalized String.
  *
@@ -87,6 +86,7 @@
  */
 fun String.capitalize(locale: Locale): String =
     stringDelegate.capitalize(this, locale.platformLocale)
+
 /**
  * Returns decapitalized String.
  *
@@ -100,7 +100,7 @@
  * Returns uppercase transformed String.
  *
  * @param localeList a locale list object. If empty locale list object is passed, use current locale
- *                   instead.
+ *   instead.
  * @return a transformed text
  */
 fun String.toUpperCase(localeList: LocaleList): String =
@@ -110,7 +110,7 @@
  * Returns lowercase transformed String.
  *
  * @param localeList a locale list object. If empty locale list object is passed, use current locale
- *                   instead.
+ *   instead.
  * @return a transformed text
  */
 fun String.toLowerCase(localeList: LocaleList): String =
@@ -120,7 +120,7 @@
  * Returns capitalized String.
  *
  * @param localeList a locale list object. If empty locale list object is passed, use current locale
- *                   instead.
+ *   instead.
  * @return a transformed text
  */
 fun String.capitalize(localeList: LocaleList): String =
@@ -130,7 +130,7 @@
  * Returns decapitalized String.
  *
  * @param localeList a locale list object. If empty locale list object is passed, use current locale
- *                   instead.
+ *   instead.
  */
 fun String.decapitalize(localeList: LocaleList): String =
     if (localeList.isEmpty()) decapitalize(Locale.current) else decapitalize(localeList[0])
diff --git a/compose/ui/ui-text/src/commonMain/kotlin/androidx/compose/ui/text/TextInclusionStrategy.kt b/compose/ui/ui-text/src/commonMain/kotlin/androidx/compose/ui/text/TextInclusionStrategy.kt
index eb33935..13050bd 100644
--- a/compose/ui/ui-text/src/commonMain/kotlin/androidx/compose/ui/text/TextInclusionStrategy.kt
+++ b/compose/ui/ui-text/src/commonMain/kotlin/androidx/compose/ui/text/TextInclusionStrategy.kt
@@ -19,9 +19,9 @@
 import androidx.compose.ui.geometry.Rect
 
 /**
- * The text inclusion strategy used by [Paragraph.getRangeForRect], it specifies when a
- * range of text is inside the given rect based on the geometric relation between the text range's
- * bounding box and the given rect.
+ * The text inclusion strategy used by [Paragraph.getRangeForRect], it specifies when a range of
+ * text is inside the given rect based on the geometric relation between the text range's bounding
+ * box and the given rect.
  *
  * @see Paragraph.getRangeForRect
  */
@@ -29,26 +29,29 @@
     /**
      * Returns true if this [TextInclusionStrategy] considers the text range's [textBounds] to be
      * inside the given [rect].
+     *
      * @param textBounds the bounding box of a range of the text.
      * @param rect a rectangle area.
      */
     fun isIncluded(textBounds: Rect, rect: Rect): Boolean
+
     companion object {
         /**
-         * The [TextInclusionStrategy] that includes the text range whose bounds has any
-         * overlap with the given rect.
+         * The [TextInclusionStrategy] that includes the text range whose bounds has any overlap
+         * with the given rect.
          */
-        val AnyOverlap = TextInclusionStrategy { textBounds, rect ->
-            textBounds.overlaps(rect)
-        }
+        val AnyOverlap = TextInclusionStrategy { textBounds, rect -> textBounds.overlaps(rect) }
 
         /**
          * The [TextInclusionStrategy] that includes the text range whose bounds is completely
          * contained by the given rect.
          */
         val ContainsAll = TextInclusionStrategy { textBounds, rect ->
-            !rect.isEmpty && textBounds.left >= rect.left && textBounds.right <= rect.right &&
-                textBounds.top >= rect.top && textBounds.bottom <= rect.bottom
+            !rect.isEmpty &&
+                textBounds.left >= rect.left &&
+                textBounds.right <= rect.right &&
+                textBounds.top >= rect.top &&
+                textBounds.bottom <= rect.bottom
         }
 
         /**
diff --git a/compose/ui/ui-text/src/commonMain/kotlin/androidx/compose/ui/text/TextLayoutResult.kt b/compose/ui/ui-text/src/commonMain/kotlin/androidx/compose/ui/text/TextLayoutResult.kt
index 16e5c87..e74f55f 100644
--- a/compose/ui/ui-text/src/commonMain/kotlin/androidx/compose/ui/text/TextLayoutResult.kt
+++ b/compose/ui/ui-text/src/commonMain/kotlin/androidx/compose/ui/text/TextLayoutResult.kt
@@ -33,18 +33,13 @@
 import androidx.compose.ui.unit.IntSize
 import androidx.compose.ui.unit.LayoutDirection
 
-/**
- * The data class which holds the set of parameters of the text layout computation.
- */
-class TextLayoutInput private constructor(
-    /**
-     * The text used for computing text layout.
-     */
+/** The data class which holds the set of parameters of the text layout computation. */
+class TextLayoutInput
+private constructor(
+    /** The text used for computing text layout. */
     val text: AnnotatedString,
 
-    /**
-     * The text layout used for computing this text layout.
-     */
+    /** The text layout used for computing this text layout. */
     val style: TextStyle,
 
     /**
@@ -58,29 +53,19 @@
      */
     val placeholders: List<AnnotatedString.Range<Placeholder>>,
 
-    /**
-     * The maxLines param used for computing this text layout.
-     */
+    /** The maxLines param used for computing this text layout. */
     val maxLines: Int,
 
-    /**
-     * The maxLines param used for computing this text layout.
-     */
+    /** The maxLines param used for computing this text layout. */
     val softWrap: Boolean,
 
-    /**
-     * The overflow param used for computing this text layout
-     */
+    /** The overflow param used for computing this text layout */
     val overflow: TextOverflow,
 
-    /**
-     * The density param used for computing this text layout.
-     */
+    /** The density param used for computing this text layout. */
     val density: Density,
 
-    /**
-     * The layout direction used for computing this text layout.
-     */
+    /** The layout direction used for computing this text layout. */
     val layoutDirection: LayoutDirection,
 
     /**
@@ -90,22 +75,18 @@
      *
      * @see fontFamilyResolver
      */
-
     @Suppress("DEPRECATION") resourceLoader: Font.ResourceLoader?,
 
-    /**
-     * The font resolver used for computing this text layout.
-     */
+    /** The font resolver used for computing this text layout. */
     val fontFamilyResolver: FontFamily.Resolver,
 
-    /**
-     * The minimum width provided while calculating this text layout.
-     */
+    /** The minimum width provided while calculating this text layout. */
     val constraints: Constraints
 ) {
 
     private var _developerSuppliedResourceLoader = resourceLoader
-    @Deprecated("Replaced with FontFamily.Resolver",
+    @Deprecated(
+        "Replaced with FontFamily.Resolver",
         replaceWith = ReplaceWith("fontFamilyResolver"),
     )
     @Suppress("DEPRECATION")
@@ -117,9 +98,12 @@
 
     @Deprecated(
         "Font.ResourceLoader is replaced with FontFamily.Resolver",
-        replaceWith = ReplaceWith("TextLayoutInput(text, style, placeholders, " +
-            "maxLines, softWrap, overflow, density, layoutDirection, fontFamilyResolver, " +
-            "constraints")
+        replaceWith =
+            ReplaceWith(
+                "TextLayoutInput(text, style, placeholders, " +
+                    "maxLines, softWrap, overflow, density, layoutDirection, fontFamilyResolver, " +
+                    "constraints"
+            )
     )
     @Suppress("DEPRECATION")
     constructor(
@@ -172,10 +156,14 @@
         constraints
     )
 
-    @Deprecated("Font.ResourceLoader is deprecated",
-        replaceWith = ReplaceWith("TextLayoutInput(text, style, placeholders," +
-            " maxLines, softWrap, overFlow, density, layoutDirection, fontFamilyResolver, " +
-            "constraints)")
+    @Deprecated(
+        "Font.ResourceLoader is deprecated",
+        replaceWith =
+            ReplaceWith(
+                "TextLayoutInput(text, style, placeholders," +
+                    " maxLines, softWrap, overFlow, density, layoutDirection, fontFamilyResolver, " +
+                    "constraints)"
+            )
     )
     // Unfortunately, there's no way to deprecate and add a parameter to a copy chain such that the
     // resolution is valid.
@@ -258,19 +246,14 @@
 }
 
 @Suppress("DEPRECATION")
-private class DeprecatedBridgeFontResourceLoader private constructor(
-    private val fontFamilyResolver: FontFamily.Resolver
-) : Font.ResourceLoader {
+private class DeprecatedBridgeFontResourceLoader
+private constructor(private val fontFamilyResolver: FontFamily.Resolver) : Font.ResourceLoader {
     @Deprecated(
         "Replaced by FontFamily.Resolver, this method should not be called",
         ReplaceWith("FontFamily.Resolver.resolve(font, )"),
     )
     override fun load(font: Font): Any {
-        return fontFamilyResolver.resolve(
-            font.toFontFamily(),
-            font.weight,
-            font.style
-        ).value
+        return fontFamilyResolver.resolve(font.toFontFamily(), font.weight, font.style).value
     }
 
     companion object {
@@ -286,14 +269,16 @@
         // (via e.g. remember)
         var cache = mutableMapOf<FontFamily.Resolver, Font.ResourceLoader>()
         val lock: SynchronizedObject = createSynchronizedObject()
+
         fun from(fontFamilyResolver: FontFamily.Resolver): Font.ResourceLoader {
             synchronized(lock) {
                 // the same resolver to return the same ResourceLoader
-                cache[fontFamilyResolver]?.let { return it }
+                cache[fontFamilyResolver]?.let {
+                    return it
+                }
 
-                val deprecatedBridgeFontResourceLoader = DeprecatedBridgeFontResourceLoader(
-                    fontFamilyResolver
-                )
+                val deprecatedBridgeFontResourceLoader =
+                    DeprecatedBridgeFontResourceLoader(fontFamilyResolver)
                 cache[fontFamilyResolver] = deprecatedBridgeFontResourceLoader
                 return deprecatedBridgeFontResourceLoader
             }
@@ -301,13 +286,10 @@
     }
 }
 
-/**
- * The data class which holds text layout result.
- */
-class TextLayoutResult constructor(
-    /**
-     * The parameters used for computing this text layout result.
-     */
+/** The data class which holds text layout result. */
+class TextLayoutResult
+constructor(
+    /** The parameters used for computing this text layout result. */
     val layoutInput: TextLayoutInput,
 
     /**
@@ -317,53 +299,42 @@
      */
     val multiParagraph: MultiParagraph,
 
-    /**
-     * The amount of space required to paint this text in Int.
-     */
+    /** The amount of space required to paint this text in Int. */
     val size: IntSize
 ) {
-    /**
-     * The distance from the top to the alphabetic baseline of the first line.
-     */
+    /** The distance from the top to the alphabetic baseline of the first line. */
     val firstBaseline: Float = multiParagraph.firstBaseline
 
-    /**
-     * The distance from the top to the alphabetic baseline of the last line.
-     */
+    /** The distance from the top to the alphabetic baseline of the last line. */
     val lastBaseline: Float = multiParagraph.lastBaseline
 
-    /**
-     * Returns true if the text is too tall and couldn't fit with given height.
-     */
-    val didOverflowHeight: Boolean get() = multiParagraph.didExceedMaxLines ||
-        size.height < multiParagraph.height
+    /** Returns true if the text is too tall and couldn't fit with given height. */
+    val didOverflowHeight: Boolean
+        get() = multiParagraph.didExceedMaxLines || size.height < multiParagraph.height
+
+    /** Returns true if the text is too wide and couldn't fit with given width. */
+    val didOverflowWidth: Boolean
+        get() = size.width < multiParagraph.width
+
+    /** Returns true if either vertical overflow or horizontal overflow happens. */
+    val hasVisualOverflow: Boolean
+        get() = didOverflowWidth || didOverflowHeight
 
     /**
-     * Returns true if the text is too wide and couldn't fit with given width.
-     */
-    val didOverflowWidth: Boolean get() = size.width < multiParagraph.width
-
-    /**
-     * Returns true if either vertical overflow or horizontal overflow happens.
-     */
-    val hasVisualOverflow: Boolean get() = didOverflowWidth || didOverflowHeight
-
-    /**
-     * Returns a list of bounding boxes that is reserved for [TextLayoutInput.placeholders].
-     * Each [Rect] in this list corresponds to the [Placeholder] passed to
-     * [TextLayoutInput.placeholders] and it will have the height and width specified in the
-     * [Placeholder]. It's guaranteed that [TextLayoutInput.placeholders] and
-     * [TextLayoutResult.placeholderRects] will have same length and order.
+     * Returns a list of bounding boxes that is reserved for [TextLayoutInput.placeholders]. Each
+     * [Rect] in this list corresponds to the [Placeholder] passed to [TextLayoutInput.placeholders]
+     * and it will have the height and width specified in the [Placeholder]. It's guaranteed that
+     * [TextLayoutInput.placeholders] and [TextLayoutResult.placeholderRects] will have same length
+     * and order.
      *
      * @see TextLayoutInput.placeholders
      * @see Placeholder
      */
     val placeholderRects: List<Rect?> = multiParagraph.placeholderRects
 
-    /**
-     * Returns a number of lines of this text layout
-     */
-    val lineCount: Int get() = multiParagraph.lineCount
+    /** Returns a number of lines of this text layout */
+    val lineCount: Int
+        get() = multiParagraph.lineCount
 
     /**
      * Returns the start offset of the given line, inclusive.
@@ -385,8 +356,8 @@
     /**
      * Returns the end offset of the given line.
      *
-     * The end offset represents a position in text after the last character in the given line.
-     * For example, `getLineEnd(0)` will return 4 for the text below
+     * The end offset represents a position in text after the last character in the given line. For
+     * example, `getLineEnd(0)` will return 4 for the text below
      * <pre>
      * ┌────┐
      * │abcd│
@@ -399,8 +370,8 @@
      *
      * @param lineIndex the line number
      * @param visibleEnd if true, the returned line end will not count trailing whitespaces or
-     * linefeed characters. Otherwise, this function will return the logical line end. By default
-     * it's false.
+     *   linefeed characters. Otherwise, this function will return the logical line end. By default
+     *   it's false.
      * @return an exclusive end offset of the line.
      */
     fun getLineEnd(lineIndex: Int, visibleEnd: Boolean = false): Int =
@@ -455,8 +426,8 @@
     /**
      * Returns the line number on which the specified text offset appears.
      *
-     * If you ask for a position before 0, you get 0; if you ask for a position
-     * beyond the end of the text, you get the last line.
+     * If you ask for a position before 0, you get 0; if you ask for a position beyond the end of
+     * the text, you get the last line.
      *
      * @param offset a character offset
      * @return the 0 origin line number.
@@ -484,12 +455,12 @@
      * value as a distance from the right-most edge.
      *
      * [usePrimaryDirection] argument is taken into account only when the offset is in the BiDi
-     * directional transition point. [usePrimaryDirection] is true means use the primary
-     * direction run's coordinate, and use the secondary direction's run's coordinate if false.
+     * directional transition point. [usePrimaryDirection] is true means use the primary direction
+     * run's coordinate, and use the secondary direction's run's coordinate if false.
      *
      * @param offset a character offset
-     * @param usePrimaryDirection true for using the primary run's coordinate if the given
-     * offset is in the BiDi directional transition point.
+     * @param usePrimaryDirection true for using the primary run's coordinate if the given offset is
+     *   in the BiDi directional transition point.
      * @return the relative distance from the text starting edge.
      * @see MultiParagraph.getHorizontalPosition
      */
@@ -516,13 +487,12 @@
         multiParagraph.getBidiRunDirection(offset)
 
     /**
-     *  Returns the character offset closest to the given graphical position.
+     * Returns the character offset closest to the given graphical position.
      *
-     *  @param position a graphical position in this text layout
-     *  @return a character offset that is closest to the given graphical position.
+     * @param position a graphical position in this text layout
+     * @return a character offset that is closest to the given graphical position.
      */
-    fun getOffsetForPosition(position: Offset): Int =
-        multiParagraph.getOffsetForPosition(position)
+    fun getOffsetForPosition(position: Offset): Int = multiParagraph.getOffsetForPosition(position)
 
     /**
      * Returns the bounding box of the character for given character offset.
diff --git a/compose/ui/ui-text/src/commonMain/kotlin/androidx/compose/ui/text/TextLinkStyles.kt b/compose/ui/ui-text/src/commonMain/kotlin/androidx/compose/ui/text/TextLinkStyles.kt
index 3e22713..b2dfcd5 100644
--- a/compose/ui/ui-text/src/commonMain/kotlin/androidx/compose/ui/text/TextLinkStyles.kt
+++ b/compose/ui/ui-text/src/commonMain/kotlin/androidx/compose/ui/text/TextLinkStyles.kt
@@ -29,16 +29,16 @@
  * will not get a specific link styling for this state. Instead it will be styled according to the
  * rest of the [AnnotatedString].
  *
- * The resulting style of the link is always a combination of all styles merged into one in
- * the order `style.merge(focusedStyle).merge(hoveredStyle).merge(pressedStyle)`.
+ * The resulting style of the link is always a combination of all styles merged into one in the
+ * order `style.merge(focusedStyle).merge(hoveredStyle).merge(pressedStyle)`.
  *
  * @param style style configuration for a link that is always applied
- * @param focusedStyle style configuration for a link applied on top of the [style] when the link
- * is focused
- * @param hoveredStyle style configuration for a link applied on top of the [style] when the link
- * is hovered
- * @param pressedStyle style configuration for a link applied on top of the [style] when the link
- * is pressed
+ * @param focusedStyle style configuration for a link applied on top of the [style] when the link is
+ *   focused
+ * @param hoveredStyle style configuration for a link applied on top of the [style] when the link is
+ *   hovered
+ * @param pressedStyle style configuration for a link applied on top of the [style] when the link is
+ *   pressed
  */
 @Immutable
 class TextLinkStyles(
diff --git a/compose/ui/ui-text/src/commonMain/kotlin/androidx/compose/ui/text/TextMeasurer.kt b/compose/ui/ui-text/src/commonMain/kotlin/androidx/compose/ui/text/TextMeasurer.kt
index 533d7eb..85091c5 100644
--- a/compose/ui/ui-text/src/commonMain/kotlin/androidx/compose/ui/text/TextMeasurer.kt
+++ b/compose/ui/ui-text/src/commonMain/kotlin/androidx/compose/ui/text/TextMeasurer.kt
@@ -64,31 +64,33 @@
  *
  * [FontFamily.Resolver], [LayoutDirection], and [Density] are required parameters to construct a
  * text layout but they have no safe fallbacks outside of composition. These parameters must be
- * provided during the construction of a TextMeasurer to be used as default values when they
- * are skipped in [TextMeasurer.measure] call.
+ * provided during the construction of a TextMeasurer to be used as default values when they are
+ * skipped in [TextMeasurer.measure] call.
  *
  * @param defaultFontFamilyResolver to be used to load fonts given in [TextStyle] and [SpanStyle]s
- * in [AnnotatedString].
+ *   in [AnnotatedString].
  * @param defaultLayoutDirection layout direction of the measurement environment.
- * @param defaultDensity density of the measurement environment. Density controls the scaling
- * factor for fonts.
+ * @param defaultDensity density of the measurement environment. Density controls the scaling factor
+ *   for fonts.
  * @param cacheSize Capacity of internal cache inside TextMeasurer. Size unit is the number of
- * unique text layout inputs that are measured. Value of this parameter highly depends on the
- * consumer use case. Provide a cache size that is in line with how many distinct text layouts are
- * going to be calculated by this measurer repeatedly. If you are animating font attributes, or any
- * other layout affecting input, cache can be skipped because most repeated measure calls would miss
- * the cache.
+ *   unique text layout inputs that are measured. Value of this parameter highly depends on the
+ *   consumer use case. Provide a cache size that is in line with how many distinct text layouts are
+ *   going to be calculated by this measurer repeatedly. If you are animating font attributes, or
+ *   any other layout affecting input, cache can be skipped because most repeated measure calls
+ *   would miss the cache.
  */
 @Immutable
-class TextMeasurer constructor(
+class TextMeasurer
+constructor(
     private val defaultFontFamilyResolver: FontFamily.Resolver,
     private val defaultDensity: Density,
     private val defaultLayoutDirection: LayoutDirection,
     private val cacheSize: Int = DefaultCacheSize
 ) {
-    private val textLayoutCache: TextLayoutCache? = if (cacheSize > 0) {
-        TextLayoutCache(cacheSize)
-    } else null
+    private val textLayoutCache: TextLayoutCache? =
+        if (cacheSize > 0) {
+            TextLayoutCache(cacheSize)
+        } else null
 
     /**
      * Creates a [TextLayoutResult] according to given parameters.
@@ -100,38 +102,39 @@
      * boundaries can displace a word to another line which would cause a chain reaction that
      * completely changes how text is rendered.
      *
-     * On the other hand, some attributes only play a role when drawing the created text layout.
-     * For example text layout can be created completely in black color but we can apply
+     * On the other hand, some attributes only play a role when drawing the created text layout. For
+     * example text layout can be created completely in black color but we can apply
      * [TextStyle.color] later in draw phase. This also means that animating text color shouldn't
      * invalidate text layout.
      *
-     * Thus, [textLayoutCache] helps in the process of converting a set of text layout inputs to
-     * a text layout while ignoring non-layout-affecting attributes. Iterative calls that use the
-     * same input parameters should benefit from substantial performance improvements.
+     * Thus, [textLayoutCache] helps in the process of converting a set of text layout inputs to a
+     * text layout while ignoring non-layout-affecting attributes. Iterative calls that use the same
+     * input parameters should benefit from substantial performance improvements.
      *
      * @param text the text to be laid out
      * @param style the [TextStyle] to be applied to the whole text
      * @param overflow How visual overflow should be handled.
      * @param softWrap Whether the text should break at soft line breaks. If false, the glyphs in
-     * the text will be positioned as if there was unlimited horizontal space. If [softWrap] is
-     * false, [overflow] and TextAlign may have unexpected effects.
+     *   the text will be positioned as if there was unlimited horizontal space. If [softWrap] is
+     *   false, [overflow] and TextAlign may have unexpected effects.
      * @param maxLines An optional maximum number of lines for the text to span, wrapping if
-     * necessary. If the text exceeds the given number of lines, it will be truncated according to
-     * [overflow] and [softWrap]. If it is not null, then it must be greater than zero.
+     *   necessary. If the text exceeds the given number of lines, it will be truncated according to
+     *   [overflow] and [softWrap]. If it is not null, then it must be greater than zero.
      * @param placeholders a list of [Placeholder]s that specify ranges of text which will be
-     * skipped during layout and replaced with [Placeholder]. It's required that the range of each
-     * [Placeholder] doesn't cross paragraph boundary, otherwise [IllegalArgumentException] is
-     * thrown.
-     * @param constraints how wide and tall the text is allowed to be. [Constraints.maxWidth]
-     * will define the width of the MultiParagraph. [Constraints.maxHeight] helps defining the
-     * number of lines that fit with ellipsis is true. [Constraints.minWidth] defines the minimum
-     * width the resulting [TextLayoutResult.size] will report. [Constraints.minHeight] is no-op.
+     *   skipped during layout and replaced with [Placeholder]. It's required that the range of each
+     *   [Placeholder] doesn't cross paragraph boundary, otherwise [IllegalArgumentException] is
+     *   thrown.
+     * @param constraints how wide and tall the text is allowed to be. [Constraints.maxWidth] will
+     *   define the width of the MultiParagraph. [Constraints.maxHeight] helps defining the number
+     *   of lines that fit with ellipsis is true. [Constraints.minWidth] defines the minimum width
+     *   the resulting [TextLayoutResult.size] will report. [Constraints.minHeight] is no-op.
      * @param layoutDirection layout direction of the measurement environment. If not specified,
-     * defaults to the value that was given during initialization of this [TextMeasurer].
-     * @param density density of the measurement environment. If not specified, defaults to
-     * the value that was given during initialization of this [TextMeasurer].
+     *   defaults to the value that was given during initialization of this [TextMeasurer].
+     * @param density density of the measurement environment. If not specified, defaults to the
+     *   value that was given during initialization of this [TextMeasurer].
      * @param fontFamilyResolver to be used to load the font given in [SpanStyle]s. If not
-     * specified, defaults to the value that was given during initialization of this [TextMeasurer].
+     *   specified, defaults to the value that was given during initialization of this
+     *   [TextMeasurer].
      * @param skipCache Disables cache optimization if it is passed as true.
      *
      * @sample androidx.compose.ui.text.samples.measureTextAnnotatedString
@@ -150,32 +153,35 @@
         fontFamilyResolver: FontFamily.Resolver = this.defaultFontFamilyResolver,
         skipCache: Boolean = false
     ): TextLayoutResult {
-        val requestedTextLayoutInput = TextLayoutInput(
-            text,
-            style,
-            placeholders,
-            maxLines,
-            softWrap,
-            overflow,
-            density,
-            layoutDirection,
-            fontFamilyResolver,
-            constraints
-        )
+        val requestedTextLayoutInput =
+            TextLayoutInput(
+                text,
+                style,
+                placeholders,
+                maxLines,
+                softWrap,
+                overflow,
+                density,
+                layoutDirection,
+                fontFamilyResolver,
+                constraints
+            )
 
-        val cacheResult = if (!skipCache && textLayoutCache != null) {
-            textLayoutCache.get(requestedTextLayoutInput)
-        } else null
+        val cacheResult =
+            if (!skipCache && textLayoutCache != null) {
+                textLayoutCache.get(requestedTextLayoutInput)
+            } else null
 
         return if (cacheResult != null) {
             cacheResult.copy(
                 layoutInput = requestedTextLayoutInput,
-                size = constraints.constrain(
-                    IntSize(
-                        cacheResult.multiParagraph.width.ceilToInt(),
-                        cacheResult.multiParagraph.height.ceilToInt()
+                size =
+                    constraints.constrain(
+                        IntSize(
+                            cacheResult.multiParagraph.width.ceilToInt(),
+                            cacheResult.multiParagraph.height.ceilToInt()
+                        )
                     )
-                )
             )
         } else {
             layout(requestedTextLayoutInput).also {
@@ -194,34 +200,35 @@
      * boundaries can displace a word to another line which would cause a chain reaction that
      * completely changes how text is rendered.
      *
-     * On the other hand, some attributes only play a role when drawing the created text layout.
-     * For example text layout can be created completely in black color but we can apply
+     * On the other hand, some attributes only play a role when drawing the created text layout. For
+     * example text layout can be created completely in black color but we can apply
      * [TextStyle.color] later in draw phase. This also means that animating text color shouldn't
      * invalidate text layout.
      *
-     * Thus, [textLayoutCache] helps in the process of converting a set of text layout inputs to
-     * a text layout while ignoring non-layout-affecting attributes. Iterative calls that use the
-     * same input parameters should benefit from substantial performance improvements.
+     * Thus, [textLayoutCache] helps in the process of converting a set of text layout inputs to a
+     * text layout while ignoring non-layout-affecting attributes. Iterative calls that use the same
+     * input parameters should benefit from substantial performance improvements.
      *
      * @param text the text to be laid out
      * @param style the [TextStyle] to be applied to the whole text
      * @param overflow How visual overflow should be handled.
      * @param softWrap Whether the text should break at soft line breaks. If false, the glyphs in
-     * the text will be positioned as if there was unlimited horizontal space. If [softWrap] is
-     * false, [overflow] and TextAlign may have unexpected effects.
+     *   the text will be positioned as if there was unlimited horizontal space. If [softWrap] is
+     *   false, [overflow] and TextAlign may have unexpected effects.
      * @param maxLines An optional maximum number of lines for the text to span, wrapping if
-     * necessary. If the text exceeds the given number of lines, it will be truncated according to
-     * [overflow] and [softWrap]. If it is not null, then it must be greater than zero.
-     * @param constraints how wide and tall the text is allowed to be. [Constraints.maxWidth]
-     * will define the width of the MultiParagraph. [Constraints.maxHeight] helps defining the
-     * number of lines that fit with ellipsis is true. [Constraints.minWidth] defines the minimum
-     * width the resulting [TextLayoutResult.size] will report. [Constraints.minHeight] is no-op.
+     *   necessary. If the text exceeds the given number of lines, it will be truncated according to
+     *   [overflow] and [softWrap]. If it is not null, then it must be greater than zero.
+     * @param constraints how wide and tall the text is allowed to be. [Constraints.maxWidth] will
+     *   define the width of the MultiParagraph. [Constraints.maxHeight] helps defining the number
+     *   of lines that fit with ellipsis is true. [Constraints.minWidth] defines the minimum width
+     *   the resulting [TextLayoutResult.size] will report. [Constraints.minHeight] is no-op.
      * @param layoutDirection layout direction of the measurement environment. If not specified,
-     * defaults to the value that was given during initialization of this [TextMeasurer].
-     * @param density density of the measurement environment. If not specified, defaults to
-     * the value that was given during initialization of this [TextMeasurer].
+     *   defaults to the value that was given during initialization of this [TextMeasurer].
+     * @param density density of the measurement environment. If not specified, defaults to the
+     *   value that was given during initialization of this [TextMeasurer].
      * @param fontFamilyResolver to be used to load the font given in [SpanStyle]s. If not
-     * specified, defaults to the value that was given during initialization of this [TextMeasurer].
+     *   specified, defaults to the value that was given during initialization of this
+     *   [TextMeasurer].
      * @param skipCache Disables cache optimization if it is passed as true.
      *
      * @sample androidx.compose.ui.text.samples.measureTextStringWithConstraints
@@ -261,76 +268,83 @@
          * while still being greater than or equal to `minWidth` and less than or equal to
          * `maxWidth`.
          */
-        private fun layout(
-            textLayoutInput: TextLayoutInput
-        ): TextLayoutResult = with(textLayoutInput) {
-            val nonNullIntrinsics = MultiParagraphIntrinsics(
-                annotatedString = text,
-                style = resolveDefaults(style, layoutDirection),
-                density = density,
-                fontFamilyResolver = fontFamilyResolver,
-                placeholders = placeholders
-            )
-
-            val minWidth = constraints.minWidth
-            val widthMatters = softWrap || overflow == TextOverflow.Ellipsis
-            val maxWidth = if (widthMatters && constraints.hasBoundedWidth) {
-                constraints.maxWidth
-            } else {
-                Constraints.Infinity
-            }
-
-            // This is a fallback behavior because native text layout doesn't support multiple
-            // ellipsis in one text layout.
-            // When softWrap is turned off and overflow is ellipsis, it's expected that each line
-            // that exceeds maxWidth will be ellipsized.
-            // For example,
-            // input text:
-            //     "AAAA\nAAAA"
-            // maxWidth:
-            //     3 * fontSize that only allow 3 characters to be displayed each line.
-            // expected output:
-            //     AA…
-            //     AA…
-            // Here we assume there won't be any '\n' character when softWrap is false. And make
-            // maxLines 1 to implement the similar behavior.
-            val overwriteMaxLines = !softWrap && overflow == TextOverflow.Ellipsis
-            val finalMaxLines = if (overwriteMaxLines) 1 else maxLines
-
-            // if minWidth == maxWidth the width is fixed.
-            //    therefore we can pass that value to our paragraph and use it
-            // if minWidth != maxWidth there is a range
-            //    then we should check if the max intrinsic width is in this range to decide the
-            //    width to be passed to Paragraph
-            //        if max intrinsic width is between minWidth and maxWidth
-            //           we can use it to layout
-            //        else if max intrinsic width is greater than maxWidth, we can only use maxWidth
-            //        else if max intrinsic width is less than minWidth, we should use minWidth
-            val width = if (minWidth == maxWidth) {
-                maxWidth
-            } else {
-                nonNullIntrinsics.maxIntrinsicWidth.ceilToInt().coerceIn(minWidth, maxWidth)
-            }
-
-            val multiParagraph = MultiParagraph(
-                intrinsics = nonNullIntrinsics,
-                constraints = Constraints(maxWidth = width, maxHeight = constraints.maxHeight),
-                // This is a fallback behavior for ellipsis. Native
-                maxLines = finalMaxLines,
-                ellipsis = overflow == TextOverflow.Ellipsis
-            )
-
-            return TextLayoutResult(
-                layoutInput = textLayoutInput,
-                multiParagraph = multiParagraph,
-                size = constraints.constrain(
-                    IntSize(
-                        ceil(multiParagraph.width).toInt(),
-                        ceil(multiParagraph.height).toInt()
+        private fun layout(textLayoutInput: TextLayoutInput): TextLayoutResult =
+            with(textLayoutInput) {
+                val nonNullIntrinsics =
+                    MultiParagraphIntrinsics(
+                        annotatedString = text,
+                        style = resolveDefaults(style, layoutDirection),
+                        density = density,
+                        fontFamilyResolver = fontFamilyResolver,
+                        placeholders = placeholders
                     )
+
+                val minWidth = constraints.minWidth
+                val widthMatters = softWrap || overflow == TextOverflow.Ellipsis
+                val maxWidth =
+                    if (widthMatters && constraints.hasBoundedWidth) {
+                        constraints.maxWidth
+                    } else {
+                        Constraints.Infinity
+                    }
+
+                // This is a fallback behavior because native text layout doesn't support multiple
+                // ellipsis in one text layout.
+                // When softWrap is turned off and overflow is ellipsis, it's expected that each
+                // line
+                // that exceeds maxWidth will be ellipsized.
+                // For example,
+                // input text:
+                //     "AAAA\nAAAA"
+                // maxWidth:
+                //     3 * fontSize that only allow 3 characters to be displayed each line.
+                // expected output:
+                //     AA…
+                //     AA…
+                // Here we assume there won't be any '\n' character when softWrap is false. And make
+                // maxLines 1 to implement the similar behavior.
+                val overwriteMaxLines = !softWrap && overflow == TextOverflow.Ellipsis
+                val finalMaxLines = if (overwriteMaxLines) 1 else maxLines
+
+                // if minWidth == maxWidth the width is fixed.
+                //    therefore we can pass that value to our paragraph and use it
+                // if minWidth != maxWidth there is a range
+                //    then we should check if the max intrinsic width is in this range to decide the
+                //    width to be passed to Paragraph
+                //        if max intrinsic width is between minWidth and maxWidth
+                //           we can use it to layout
+                //        else if max intrinsic width is greater than maxWidth, we can only use
+                // maxWidth
+                //        else if max intrinsic width is less than minWidth, we should use minWidth
+                val width =
+                    if (minWidth == maxWidth) {
+                        maxWidth
+                    } else {
+                        nonNullIntrinsics.maxIntrinsicWidth.ceilToInt().coerceIn(minWidth, maxWidth)
+                    }
+
+                val multiParagraph =
+                    MultiParagraph(
+                        intrinsics = nonNullIntrinsics,
+                        constraints =
+                            Constraints(maxWidth = width, maxHeight = constraints.maxHeight),
+                        // This is a fallback behavior for ellipsis. Native
+                        maxLines = finalMaxLines,
+                        ellipsis = overflow == TextOverflow.Ellipsis
+                    )
+
+                return TextLayoutResult(
+                    layoutInput = textLayoutInput,
+                    multiParagraph = multiParagraph,
+                    size =
+                        constraints.constrain(
+                            IntSize(
+                                ceil(multiParagraph.width).toInt(),
+                                ceil(multiParagraph.height).toInt()
+                            )
+                        )
                 )
-            )
-        }
+            }
     }
 }
 
@@ -338,9 +352,8 @@
  * Keeps an LRU layout cache of TextLayoutInput, TextLayoutResult pairs. Any non-layout affecting
  * change in TextLayoutInput (color, brush, shadow, TextDecoration) is ignored by this cache.
  *
- * @param capacity Maximum size of LRU cache. Size unit is the number of [CacheTextLayoutInput]
- * and [TextLayoutResult] pairs.
- *
+ * @param capacity Maximum size of LRU cache. Size unit is the number of [CacheTextLayoutInput] and
+ *   [TextLayoutResult] pairs.
  * @throws IllegalArgumentException if capacity is not a positive integer.
  */
 internal class TextLayoutCache(capacity: Int = DefaultCacheSize) {
@@ -374,20 +387,21 @@
 @Immutable
 internal class CacheTextLayoutInput(val textLayoutInput: TextLayoutInput) {
 
-    override fun hashCode(): Int = with(textLayoutInput) {
-        var result = text.hashCode()
-        result = 31 * result + style.hashCodeLayoutAffectingAttributes()
-        result = 31 * result + placeholders.hashCode()
-        result = 31 * result + maxLines
-        result = 31 * result + softWrap.hashCode()
-        result = 31 * result + overflow.hashCode()
-        result = 31 * result + density.hashCode()
-        result = 31 * result + layoutDirection.hashCode()
-        result = 31 * result + fontFamilyResolver.hashCode()
-        result = 31 * result + constraints.maxWidth.hashCode()
-        result = 31 * result + constraints.maxHeight.hashCode()
-        return result
-    }
+    override fun hashCode(): Int =
+        with(textLayoutInput) {
+            var result = text.hashCode()
+            result = 31 * result + style.hashCodeLayoutAffectingAttributes()
+            result = 31 * result + placeholders.hashCode()
+            result = 31 * result + maxLines
+            result = 31 * result + softWrap.hashCode()
+            result = 31 * result + overflow.hashCode()
+            result = 31 * result + density.hashCode()
+            result = 31 * result + layoutDirection.hashCode()
+            result = 31 * result + fontFamilyResolver.hashCode()
+            result = 31 * result + constraints.maxWidth.hashCode()
+            result = 31 * result + constraints.maxHeight.hashCode()
+            return result
+        }
 
     override fun equals(other: Any?): Boolean {
         if (this === other) return true
diff --git a/compose/ui/ui-text/src/commonMain/kotlin/androidx/compose/ui/text/TextPainter.kt b/compose/ui/ui-text/src/commonMain/kotlin/androidx/compose/ui/text/TextPainter.kt
index f000264..96aa936 100644
--- a/compose/ui/ui-text/src/commonMain/kotlin/androidx/compose/ui/text/TextPainter.kt
+++ b/compose/ui/ui-text/src/commonMain/kotlin/androidx/compose/ui/text/TextPainter.kt
@@ -50,8 +50,9 @@
      * @param textLayoutResult a result of text layout
      */
     fun paint(canvas: Canvas, textLayoutResult: TextLayoutResult) {
-        val needClipping = textLayoutResult.hasVisualOverflow &&
-            textLayoutResult.layoutInput.overflow != TextOverflow.Visible
+        val needClipping =
+            textLayoutResult.hasVisualOverflow &&
+                textLayoutResult.layoutInput.overflow != TextOverflow.Visible
         if (needClipping) {
             val width = textLayoutResult.size.width.toFloat()
             val height = textLayoutResult.size.height.toFloat()
@@ -68,11 +69,12 @@
         try {
             val brush = style.brush
             if (brush != null) {
-                val alpha = if (style.textForegroundStyle !== Unspecified) {
-                    style.textForegroundStyle.alpha
-                } else {
-                    1.0f
-                }
+                val alpha =
+                    if (style.textForegroundStyle !== Unspecified) {
+                        style.textForegroundStyle.alpha
+                    } else {
+                        1.0f
+                    }
                 textLayoutResult.multiParagraph.paint(
                     canvas = canvas,
                     brush = brush,
@@ -82,11 +84,12 @@
                     drawStyle = drawStyle
                 )
             } else {
-                val color = if (style.textForegroundStyle !== Unspecified) {
-                    style.textForegroundStyle.color
-                } else {
-                    Color.Black
-                }
+                val color =
+                    if (style.textForegroundStyle !== Unspecified) {
+                        style.textForegroundStyle.color
+                    } else {
+                        Color.Black
+                    }
                 textLayoutResult.multiParagraph.paint(
                     canvas = canvas,
                     color = color,
@@ -108,34 +111,32 @@
  *
  * This draw function supports multi-styling and async font loading.
  *
- * TextMeasurer carries an internal cache to optimize text layout measurement for repeated calls
- * in draw phase. If layout affecting attributes like font size, font weight, overflow, softWrap,
- * etc. are changed in consecutive calls to this method, TextMeasurer and its internal cache that
- * holds layout results may not offer any benefits. Check out [TextMeasurer] and drawText
- * overloads that take [TextLayoutResult] to learn more about text layout and draw phase
- * optimizations.
+ * TextMeasurer carries an internal cache to optimize text layout measurement for repeated calls in
+ * draw phase. If layout affecting attributes like font size, font weight, overflow, softWrap, etc.
+ * are changed in consecutive calls to this method, TextMeasurer and its internal cache that holds
+ * layout results may not offer any benefits. Check out [TextMeasurer] and drawText overloads that
+ * take [TextLayoutResult] to learn more about text layout and draw phase optimizations.
  *
  * @param textMeasurer Measures and lays out the text
  * @param text Text to be drawn
  * @param topLeft Offsets the text from top left point of the current coordinate system.
  * @param style the [TextStyle] to be applied to the text
  * @param overflow How visual overflow should be handled.
- * @param softWrap Whether the text should break at soft line breaks. If false, the glyphs in
- * the text will be positioned as if there was unlimited horizontal space. If [softWrap] is
- * false, [overflow] and TextAlign may have unexpected effects.
- * @param maxLines An optional maximum number of lines for the text to span, wrapping if
- * necessary. If the text exceeds the given number of lines, it will be truncated according to
- * [overflow] and [softWrap]. If it is not null, then it must be greater than zero.
- * @param placeholders a list of [Placeholder]s that specify ranges of text which will be
- * skipped during layout and replaced with [Placeholder]. It's required that the range of each
- * [Placeholder] doesn't cross paragraph boundary, otherwise [IllegalArgumentException] is
- * thrown.
+ * @param softWrap Whether the text should break at soft line breaks. If false, the glyphs in the
+ *   text will be positioned as if there was unlimited horizontal space. If [softWrap] is false,
+ *   [overflow] and TextAlign may have unexpected effects.
+ * @param maxLines An optional maximum number of lines for the text to span, wrapping if necessary.
+ *   If the text exceeds the given number of lines, it will be truncated according to [overflow] and
+ *   [softWrap]. If it is not null, then it must be greater than zero.
+ * @param placeholders a list of [Placeholder]s that specify ranges of text which will be skipped
+ *   during layout and replaced with [Placeholder]. It's required that the range of each
+ *   [Placeholder] doesn't cross paragraph boundary, otherwise [IllegalArgumentException] is thrown.
  * @param size how wide and tall the text should be. If left [Size.Unspecified] as its default
- * value, text will be forced to fit inside the total drawing area from where it's placed.
- * If size is specified, [Size.width] will define the width of the text. [Size.height] helps
- * defining the number of lines that fit if [softWrap] is enabled and [overflow] is
- * [TextOverflow.Ellipsis]. Otherwise, [Size.height] either defines where the text is clipped
- * ([TextOverflow.Clip]) or becomes no-op.
+ *   value, text will be forced to fit inside the total drawing area from where it's placed. If size
+ *   is specified, [Size.width] will define the width of the text. [Size.height] helps defining the
+ *   number of lines that fit if [softWrap] is enabled and [overflow] is [TextOverflow.Ellipsis].
+ *   Otherwise, [Size.height] either defines where the text is clipped ([TextOverflow.Clip]) or
+ *   becomes no-op.
  * @param blendMode Blending algorithm to be applied to the text
  *
  * @sample androidx.compose.ui.text.samples.DrawTextAnnotatedStringSample
@@ -152,26 +153,24 @@
     size: Size = Size.Unspecified,
     blendMode: BlendMode = DrawScope.DefaultBlendMode
 ) {
-    val textLayoutResult = textMeasurer.measure(
-        text = text,
-        style = style,
-        overflow = overflow,
-        softWrap = softWrap,
-        maxLines = maxLines,
-        placeholders = placeholders,
-        constraints = textLayoutConstraints(size, topLeft),
-        layoutDirection = layoutDirection,
-        density = this
-    )
+    val textLayoutResult =
+        textMeasurer.measure(
+            text = text,
+            style = style,
+            overflow = overflow,
+            softWrap = softWrap,
+            maxLines = maxLines,
+            placeholders = placeholders,
+            constraints = textLayoutConstraints(size, topLeft),
+            layoutDirection = layoutDirection,
+            density = this
+        )
 
     withTransform({
         translate(topLeft.x, topLeft.y)
         clip(textLayoutResult)
     }) {
-        textLayoutResult.multiParagraph.paint(
-            canvas = drawContext.canvas,
-            blendMode = blendMode
-        )
+        textLayoutResult.multiParagraph.paint(canvas = drawContext.canvas, blendMode = blendMode)
     }
 }
 
@@ -180,32 +179,33 @@
  *
  * This draw function supports only one text style, and async font loading.
  *
- * TextMeasurer carries an internal cache to optimize text layout measurement for repeated calls
- * in draw phase. If layout affecting attributes like font size, font weight, overflow, softWrap,
- * etc. are changed in consecutive calls to this method, TextMeasurer and its internal cache that
- * holds layout results may not offer any benefits. Check out [TextMeasurer] and drawText overloads that take [TextLayoutResult] to learn
- * more about text layout and draw phase optimizations.
+ * TextMeasurer carries an internal cache to optimize text layout measurement for repeated calls in
+ * draw phase. If layout affecting attributes like font size, font weight, overflow, softWrap, etc.
+ * are changed in consecutive calls to this method, TextMeasurer and its internal cache that holds
+ * layout results may not offer any benefits. Check out [TextMeasurer] and drawText overloads that
+ * take [TextLayoutResult] to learn more about text layout and draw phase optimizations.
  *
  * @param textMeasurer Measures and lays out the text
  * @param text Text to be drawn
  * @param topLeft Offsets the text from top left point of the current coordinate system.
  * @param style the [TextStyle] to be applied to the text
  * @param overflow How visual overflow should be handled.
- * @param softWrap Whether the text should break at soft line breaks. If false, the glyphs in
- * the text will be positioned as if there was unlimited horizontal space. If [softWrap] is
- * false, [overflow] and TextAlign may have unexpected effects.
- * @param maxLines An optional maximum number of lines for the text to span, wrapping if
- * necessary. If the text exceeds the given number of lines, it will be truncated according to
- * [overflow] and [softWrap]. If it is not null, then it must be greater than zero.
+ * @param softWrap Whether the text should break at soft line breaks. If false, the glyphs in the
+ *   text will be positioned as if there was unlimited horizontal space. If [softWrap] is false,
+ *   [overflow] and TextAlign may have unexpected effects.
+ * @param maxLines An optional maximum number of lines for the text to span, wrapping if necessary.
+ *   If the text exceeds the given number of lines, it will be truncated according to [overflow] and
+ *   [softWrap]. If it is not null, then it must be greater than zero.
  * @param size how wide and tall the text should be. If left [Size.Unspecified] as its default
- * value, text will be forced to fit inside the total drawing area from where it's placed.
- * If size is specified, [Size.width] will define the width of the text. [Size.height] helps
- * defining the number of lines that fit if [softWrap] is enabled and [overflow] is
- * [TextOverflow.Ellipsis]. Otherwise, [Size.height] either defines where the text is clipped
- * ([TextOverflow.Clip]) or becomes no-op.
+ *   value, text will be forced to fit inside the total drawing area from where it's placed. If size
+ *   is specified, [Size.width] will define the width of the text. [Size.height] helps defining the
+ *   number of lines that fit if [softWrap] is enabled and [overflow] is [TextOverflow.Ellipsis].
+ *   Otherwise, [Size.height] either defines where the text is clipped ([TextOverflow.Clip]) or
+ *   becomes no-op.
  * @param blendMode Blending algorithm to be applied to the text
  *
  * @sample androidx.compose.ui.text.samples.DrawTextSample
+ *
  * @sample androidx.compose.ui.text.samples.DrawTextStyledSample
  */
 fun DrawScope.drawText(
@@ -219,25 +219,23 @@
     size: Size = Size.Unspecified,
     blendMode: BlendMode = DrawScope.DefaultBlendMode
 ) {
-    val textLayoutResult = textMeasurer.measure(
-        text = AnnotatedString(text),
-        style = style,
-        overflow = overflow,
-        softWrap = softWrap,
-        maxLines = maxLines,
-        constraints = textLayoutConstraints(size, topLeft),
-        layoutDirection = layoutDirection,
-        density = this
-    )
+    val textLayoutResult =
+        textMeasurer.measure(
+            text = AnnotatedString(text),
+            style = style,
+            overflow = overflow,
+            softWrap = softWrap,
+            maxLines = maxLines,
+            constraints = textLayoutConstraints(size, topLeft),
+            layoutDirection = layoutDirection,
+            density = this
+        )
 
     withTransform({
         translate(topLeft.x, topLeft.y)
         clip(textLayoutResult)
     }) {
-        textLayoutResult.multiParagraph.paint(
-            canvas = drawContext.canvas,
-            blendMode = blendMode
-        )
+        textLayoutResult.multiParagraph.paint(canvas = drawContext.canvas, blendMode = blendMode)
     }
 }
 
@@ -251,13 +249,14 @@
  * @param color Text color to use
  * @param topLeft Offsets the text from top left point of the current coordinate system.
  * @param alpha opacity to be applied to the [color] from 0.0f to 1.0f representing fully
- * transparent to fully opaque respectively
+ *   transparent to fully opaque respectively
  * @param shadow The shadow effect applied on the text.
  * @param textDecoration The decorations to paint on the text (e.g., an underline).
  * @param drawStyle Whether or not the text is stroked or filled in.
  * @param blendMode Blending algorithm to be applied to the text
  *
  * @sample androidx.compose.ui.text.samples.DrawTextMeasureInLayoutSample
+ *
  * @sample androidx.compose.ui.text.samples.DrawTextDrawWithCacheSample
  */
 fun DrawScope.drawText(
@@ -313,8 +312,8 @@
  * @param textLayoutResult Text Layout to be drawn
  * @param brush The brush to use when drawing the text.
  * @param topLeft Offsets the text from top left point of the current coordinate system.
- * @param alpha Opacity to be applied to [brush] from 0.0f to 1.0f representing fully
- * transparent to fully opaque respectively.
+ * @param alpha Opacity to be applied to [brush] from 0.0f to 1.0f representing fully transparent to
+ *   fully opaque respectively.
  * @param shadow The shadow effect applied on the text.
  * @param textDecoration The decorations to paint on the text (e.g., an underline).
  * @param drawStyle Whether or not the text is stroked or filled in.
@@ -351,8 +350,9 @@
 }
 
 private fun DrawTransform.clip(textLayoutResult: TextLayoutResult) {
-    if (textLayoutResult.hasVisualOverflow &&
-        textLayoutResult.layoutInput.overflow != TextOverflow.Visible
+    if (
+        textLayoutResult.hasVisualOverflow &&
+            textLayoutResult.layoutInput.overflow != TextOverflow.Visible
     ) {
         clipRect(
             left = 0f,
@@ -363,13 +363,8 @@
     }
 }
 
-/**
- * Converts given size and placement preferences to Constraints for measuring text layout.
- */
-private fun DrawScope.textLayoutConstraints(
-    size: Size,
-    topLeft: Offset
-): Constraints {
+/** Converts given size and placement preferences to Constraints for measuring text layout. */
+private fun DrawScope.textLayoutConstraints(size: Size, topLeft: Offset): Constraints {
     val minWidth: Int
     val maxWidth: Int
     val isWidthNaN = size.isUnspecified || size.width.isNaN()
diff --git a/compose/ui/ui-text/src/commonMain/kotlin/androidx/compose/ui/text/TextRange.kt b/compose/ui/ui-text/src/commonMain/kotlin/androidx/compose/ui/text/TextRange.kt
index 6d7115a..209d1f6 100644
--- a/compose/ui/ui-text/src/commonMain/kotlin/androidx/compose/ui/text/TextRange.kt
+++ b/compose/ui/ui-text/src/commonMain/kotlin/androidx/compose/ui/text/TextRange.kt
@@ -25,64 +25,59 @@
 
 /**
  * An immutable text range class, represents a text range from [start] (inclusive) to [end]
- * (exclusive). [end] can be smaller than [start] and in those cases [min] and [max] can be
- * used in order to fetch the values.
+ * (exclusive). [end] can be smaller than [start] and in those cases [min] and [max] can be used in
+ * order to fetch the values.
  *
  * @param start the inclusive start offset of the range. Must be non-negative, otherwise an
- * exception will be thrown.
- * @param end the exclusive end offset of the range. Must be non-negative, otherwise an
- * exception will be thrown.
+ *   exception will be thrown.
+ * @param end the exclusive end offset of the range. Must be non-negative, otherwise an exception
+ *   will be thrown.
  */
 fun TextRange(/*@IntRange(from = 0)*/ start: Int, /*@IntRange(from = 0)*/ end: Int) =
     TextRange(packWithCheck(start, end))
 
 /**
  * An immutable text range class, represents a text range from [start] (inclusive) to [end]
- * (exclusive). [end] can be smaller than [start] and in those cases [min] and [max] can be
- * used in order to fetch the values.
+ * (exclusive). [end] can be smaller than [start] and in those cases [min] and [max] can be used in
+ * order to fetch the values.
  */
 @kotlin.jvm.JvmInline
 @Immutable
 value class TextRange internal constructor(private val packedValue: Long) {
 
-    val start: Int get() = unpackInt1(packedValue)
+    val start: Int
+        get() = unpackInt1(packedValue)
 
-    val end: Int get() = unpackInt2(packedValue)
+    val end: Int
+        get() = unpackInt2(packedValue)
 
     /** The minimum offset of the range. */
-    val min: Int get() = if (start > end) end else start
+    val min: Int
+        get() = if (start > end) end else start
 
     /** The maximum offset of the range. */
-    val max: Int get() = if (start > end) start else end
+    val max: Int
+        get() = if (start > end) start else end
 
-    /**
-     * Returns true if the range is collapsed
-     */
-    val collapsed: Boolean get() = start == end
+    /** Returns true if the range is collapsed */
+    val collapsed: Boolean
+        get() = start == end
 
-    /**
-     * Returns true if the start offset is larger than the end offset.
-     */
-    val reversed: Boolean get() = start > end
+    /** Returns true if the start offset is larger than the end offset. */
+    val reversed: Boolean
+        get() = start > end
 
-    /**
-     * Returns the length of the range.
-     */
-    val length: Int get() = max - min
+    /** Returns the length of the range. */
+    val length: Int
+        get() = max - min
 
-    /**
-     * Returns true if the given range has intersection with this range
-     */
+    /** Returns true if the given range has intersection with this range */
     fun intersects(other: TextRange): Boolean = min < other.max && other.min < max
 
-    /**
-     * Returns true if this range covers including equals with the given range.
-     */
+    /** Returns true if this range covers including equals with the given range. */
     operator fun contains(other: TextRange): Boolean = min <= other.min && other.max <= max
 
-    /**
-     * Returns true if the given offset is a part of this range.
-     */
+    /** Returns true if the given offset is a part of this range. */
     operator fun contains(offset: Int): Boolean = offset in min until max
 
     override fun toString(): String {
@@ -94,9 +89,7 @@
     }
 }
 
-/**
- * Creates a [TextRange] where start is equal to end, and the value of those are [index].
- */
+/** Creates a [TextRange] where start is equal to end, and the value of those are [index]. */
 fun TextRange(index: Int): TextRange = TextRange(start = index, end = index)
 
 /**
@@ -118,11 +111,7 @@
 }
 
 private fun packWithCheck(start: Int, end: Int): Long {
-    require(start >= 0) {
-        "start cannot be negative. [start: $start, end: $end]"
-    }
-    require(end >= 0) {
-        "end cannot be negative. [start: $start, end: $end]"
-    }
+    require(start >= 0) { "start cannot be negative. [start: $start, end: $end]" }
+    require(end >= 0) { "end cannot be negative. [start: $start, end: $end]" }
     return packInts(start, end)
 }
diff --git a/compose/ui/ui-text/src/commonMain/kotlin/androidx/compose/ui/text/TextStyle.kt b/compose/ui/ui-text/src/commonMain/kotlin/androidx/compose/ui/text/TextStyle.kt
index e3fad6c..8569bca 100644
--- a/compose/ui/ui-text/src/commonMain/kotlin/androidx/compose/ui/text/TextStyle.kt
+++ b/compose/ui/ui-text/src/commonMain/kotlin/androidx/compose/ui/text/TextStyle.kt
@@ -47,7 +47,6 @@
  * @sample androidx.compose.ui.text.samples.TextStyleSample
  *
  * @param platformStyle Platform specific [TextStyle] parameters.
- *
  * @see AnnotatedString
  * @see SpanStyle
  * @see ParagraphStyle
@@ -55,7 +54,8 @@
 // Maintainer note: When adding a new constructor or copy parameter, make sure to add a test case to
 // TextStyleInvalidationTest to ensure the correct phase(s) get invalidated.
 @Immutable
-class TextStyle internal constructor(
+class TextStyle
+internal constructor(
     internal val spanStyle: SpanStyle,
     internal val paragraphStyle: ParagraphStyle,
     val platformStyle: PlatformTextStyle? = null,
@@ -66,10 +66,8 @@
     ) : this(
         spanStyle = spanStyle,
         paragraphStyle = paragraphStyle,
-        platformStyle = createPlatformTextStyleInternal(
-            spanStyle.platformStyle,
-            paragraphStyle.platformStyle
-        )
+        platformStyle =
+            createPlatformTextStyleInternal(spanStyle.platformStyle, paragraphStyle.platformStyle)
     )
 
     @Deprecated(
@@ -196,16 +194,16 @@
      * @sample androidx.compose.ui.text.samples.TextStyleSample
      *
      * @param color The text color.
-     * @param fontSize The size of glyphs to use when painting the text. This
-     * may be [TextUnit.Unspecified] for inheriting from another [TextStyle].
+     * @param fontSize The size of glyphs to use when painting the text. This may be
+     *   [TextUnit.Unspecified] for inheriting from another [TextStyle].
      * @param fontWeight The typeface thickness to use when painting the text (e.g., bold).
      * @param fontStyle The typeface variant to use when drawing the letters (e.g., italic).
      * @param fontSynthesis Whether to synthesize font weight and/or style when the requested weight
-     * or style cannot be found in the provided font family.
+     *   or style cannot be found in the provided font family.
      * @param fontFamily The font family to be used when rendering the text.
      * @param fontFeatureSettings The advanced typography settings provided by font. The format is
-     * the same as the CSS font-feature-settings attribute:
-     * https://www.w3.org/TR/css-fonts-3/#font-feature-settings-prop
+     *   the same as the CSS font-feature-settings attribute:
+     *   https://www.w3.org/TR/css-fonts-3/#font-feature-settings-prop
      * @param letterSpacing The amount of space to add between each letter.
      * @param baselineShift The amount by which the text is shifted up from the current baseline.
      * @param textGeometricTransform The geometric transformation applied the text.
@@ -215,15 +213,15 @@
      * @param shadow The shadow effect applied on the text.
      * @param textAlign The alignment of the text within the lines of the paragraph.
      * @param textDirection The algorithm to be used to resolve the final text and paragraph
-     * direction: Left To Right or Right To Left. If no value is provided the system will use the
-     * [LayoutDirection] as the primary signal.
+     *   direction: Left To Right or Right To Left. If no value is provided the system will use the
+     *   [LayoutDirection] as the primary signal.
      * @param lineHeight Line height for the [Paragraph] in [TextUnit] unit, e.g. SP or EM.
      * @param textIndent The indentation of the paragraph.
      * @param platformStyle Platform specific [TextStyle] parameters.
      * @param lineHeightStyle the configuration for line height such as vertical alignment of the
-     * line, whether to apply additional space as a result of line height to top of first line top
-     * and bottom of last line. The configuration is applied only when a [lineHeight] is defined.
-     * When null, [LineHeightStyle.Default] is used.
+     *   line, whether to apply additional space as a result of line height to top of first line top
+     *   and bottom of last line. The configuration is applied only when a [lineHeight] is defined.
+     *   When null, [LineHeightStyle.Default] is used.
      * @param lineBreak The line breaking configuration for the text.
      * @param hyphens The configuration of hyphenation.
      */
@@ -287,11 +285,13 @@
         platformStyle = platformStyle
     )
 
-    @Deprecated("TextStyle constructors that take nullable TextAlign, " +
-        "TextDirection, LineBreak, and Hyphens are deprecated. Please use a new constructor " +
-        "where these parameters are non-nullable. Null value has been replaced by a special " +
-        "Unspecified object for performance reason.",
-        level = DeprecationLevel.HIDDEN)
+    @Deprecated(
+        "TextStyle constructors that take nullable TextAlign, " +
+            "TextDirection, LineBreak, and Hyphens are deprecated. Please use a new constructor " +
+            "where these parameters are non-nullable. Null value has been replaced by a special " +
+            "Unspecified object for performance reason.",
+        level = DeprecationLevel.HIDDEN
+    )
     constructor(
         color: Color = Color.Unspecified,
         fontSize: TextUnit = TextUnit.Unspecified,
@@ -356,16 +356,16 @@
      * @sample androidx.compose.ui.text.samples.TextStyleSample
      *
      * @param color The text color.
-     * @param fontSize The size of glyphs to use when painting the text. This
-     * may be [TextUnit.Unspecified] for inheriting from another [TextStyle].
+     * @param fontSize The size of glyphs to use when painting the text. This may be
+     *   [TextUnit.Unspecified] for inheriting from another [TextStyle].
      * @param fontWeight The typeface thickness to use when painting the text (e.g., bold).
      * @param fontStyle The typeface variant to use when drawing the letters (e.g., italic).
      * @param fontSynthesis Whether to synthesize font weight and/or style when the requested weight
-     * or style cannot be found in the provided font family.
+     *   or style cannot be found in the provided font family.
      * @param fontFamily The font family to be used when rendering the text.
      * @param fontFeatureSettings The advanced typography settings provided by font. The format is
-     * the same as the CSS font-feature-settings attribute:
-     * https://www.w3.org/TR/css-fonts-3/#font-feature-settings-prop
+     *   the same as the CSS font-feature-settings attribute:
+     *   https://www.w3.org/TR/css-fonts-3/#font-feature-settings-prop
      * @param letterSpacing The amount of space to add between each letter.
      * @param baselineShift The amount by which the text is shifted up from the current baseline.
      * @param textGeometricTransform The geometric transformation applied the text.
@@ -374,18 +374,18 @@
      * @param textDecoration The decorations to paint on the text (e.g., an underline).
      * @param shadow The shadow effect applied on the text.
      * @param drawStyle Drawing style of text, whether fill in the text while drawing or stroke
-     * around the edges.
+     *   around the edges.
      * @param textAlign The alignment of the text within the lines of the paragraph.
      * @param textDirection The algorithm to be used to resolve the final text and paragraph
-     * direction: Left To Right or Right To Left. If no value is provided the system will use the
-     * [LayoutDirection] as the primary signal.
+     *   direction: Left To Right or Right To Left. If no value is provided the system will use the
+     *   [LayoutDirection] as the primary signal.
      * @param lineHeight Line height for the [Paragraph] in [TextUnit] unit, e.g. SP or EM.
      * @param textIndent The indentation of the paragraph.
      * @param platformStyle Platform specific [TextStyle] parameters.
      * @param lineHeightStyle the configuration for line height such as vertical alignment of the
-     * line, whether to apply additional space as a result of line height to top of first line top
-     * and bottom of last line. The configuration is applied only when a [lineHeight] is defined.
-     * When null, [LineHeightStyle.Default] is used.
+     *   line, whether to apply additional space as a result of line height to top of first line top
+     *   and bottom of last line. The configuration is applied only when a [lineHeight] is defined.
+     *   When null, [LineHeightStyle.Default] is used.
      * @param lineBreak The line breaking configuration for the text.
      * @param hyphens The configuration of hyphenation.
      * @param textMotion Text character placement, whether to optimize for animated or static text.
@@ -454,20 +454,20 @@
      * @sample androidx.compose.ui.text.samples.TextStyleBrushSample
      *
      * @param brush The brush to use when painting the text. If brush is given as null, it will be
-     * treated as unspecified. It is equivalent to calling the alternative color constructor with
-     * [Color.Unspecified]
+     *   treated as unspecified. It is equivalent to calling the alternative color constructor with
+     *   [Color.Unspecified]
      * @param alpha Opacity to be applied to [brush] from 0.0f to 1.0f representing fully
-     * transparent to fully opaque respectively.
-     * @param fontSize The size of glyphs to use when painting the text. This
-     * may be [TextUnit.Unspecified] for inheriting from another [TextStyle].
+     *   transparent to fully opaque respectively.
+     * @param fontSize The size of glyphs to use when painting the text. This may be
+     *   [TextUnit.Unspecified] for inheriting from another [TextStyle].
      * @param fontWeight The typeface thickness to use when painting the text (e.g., bold).
      * @param fontStyle The typeface variant to use when drawing the letters (e.g., italic).
      * @param fontSynthesis Whether to synthesize font weight and/or style when the requested weight
-     * or style cannot be found in the provided font family.
+     *   or style cannot be found in the provided font family.
      * @param fontFamily The font family to be used when rendering the text.
      * @param fontFeatureSettings The advanced typography settings provided by font. The format is
-     * the same as the CSS font-feature-settings attribute:
-     * https://www.w3.org/TR/css-fonts-3/#font-feature-settings-prop
+     *   the same as the CSS font-feature-settings attribute:
+     *   https://www.w3.org/TR/css-fonts-3/#font-feature-settings-prop
      * @param letterSpacing The amount of space to add between each letter.
      * @param baselineShift The amount by which the text is shifted up from the current baseline.
      * @param textGeometricTransform The geometric transformation applied the text.
@@ -476,17 +476,17 @@
      * @param textDecoration The decorations to paint on the text (e.g., an underline).
      * @param shadow The shadow effect applied on the text.
      * @param drawStyle Drawing style of text, whether fill in the text while drawing or stroke
-     * around the edges.
+     *   around the edges.
      * @param textAlign The alignment of the text within the lines of the paragraph.
      * @param textDirection The algorithm to be used to resolve the final text and paragraph
-     * direction: Left To Right or Right To Left. If no value is provided the system will use the
-     * [LayoutDirection] as the primary signal.
+     *   direction: Left To Right or Right To Left. If no value is provided the system will use the
+     *   [LayoutDirection] as the primary signal.
      * @param lineHeight Line height for the [Paragraph] in [TextUnit] unit, e.g. SP or EM.
      * @param textIndent The indentation of the paragraph.
      * @param platformStyle Platform specific [TextStyle] parameters.
      * @param lineHeightStyle the configuration for line height such as vertical alignment of the
-     * line, whether to apply additional space as a result of line height to top of first line top
-     * and bottom of last line. The configuration is applied only when a [lineHeight] is defined.
+     *   line, whether to apply additional space as a result of line height to top of first line top
+     *   and bottom of last line. The configuration is applied only when a [lineHeight] is defined.
      * @param lineBreak The line breaking configuration for the text.
      * @param hyphens The configuration of hyphenation.
      * @param textMotion Text character placement, whether to optimize for animated or static text.
@@ -551,11 +551,13 @@
         platformStyle = platformStyle
     )
 
-    @Deprecated("TextStyle constructors that take nullable TextAlign, " +
-        "TextDirection, LineBreak, and Hyphens are deprecated. Please use a new constructor " +
-        "where these parameters are non-nullable. Null value has been replaced by a special " +
-        "Unspecified object for performance reason.",
-        level = DeprecationLevel.HIDDEN)
+    @Deprecated(
+        "TextStyle constructors that take nullable TextAlign, " +
+            "TextDirection, LineBreak, and Hyphens are deprecated. Please use a new constructor " +
+            "where these parameters are non-nullable. Null value has been replaced by a special " +
+            "Unspecified object for performance reason.",
+        level = DeprecationLevel.HIDDEN
+    )
     constructor(
         brush: Brush?,
         alpha: Float = Float.NaN,
@@ -616,11 +618,9 @@
         platformStyle = platformStyle
     )
 
-    @Stable
-    fun toSpanStyle(): SpanStyle = spanStyle
+    @Stable fun toSpanStyle(): SpanStyle = spanStyle
 
-    @Stable
-    fun toParagraphStyle(): ParagraphStyle = paragraphStyle
+    @Stable fun toParagraphStyle(): ParagraphStyle = paragraphStyle
 
     /**
      * Returns a new text style that is a combination of this style and the given [other] style.
@@ -671,8 +671,7 @@
      * system and applying styling information to a specific usage.
      *
      * @return this or a new TextLayoutResult with all parameters chosen to the non-default option
-     * provided.
-     *
+     *   provided.
      * @see merge
      */
     @Stable
@@ -702,46 +701,50 @@
         platformStyle: PlatformTextStyle? = null,
         textMotion: TextMotion? = null
     ): TextStyle {
-        val mergedSpanStyle: SpanStyle = spanStyle.fastMerge(
-            color = color,
-            brush = null,
-            alpha = Float.NaN,
-            fontSize = fontSize,
-            fontWeight = fontWeight,
-            fontStyle = fontStyle,
-            fontSynthesis = fontSynthesis,
-            fontFamily = fontFamily,
-            fontFeatureSettings = fontFeatureSettings,
-            letterSpacing = letterSpacing,
-            baselineShift = baselineShift,
-            textGeometricTransform = textGeometricTransform,
-            localeList = localeList,
-            background = background,
-            textDecoration = textDecoration,
-            shadow = shadow,
-            platformStyle = platformStyle?.spanStyle,
-            drawStyle = drawStyle
-        )
-        val mergedParagraphStyle: ParagraphStyle = paragraphStyle.fastMerge(
-            textAlign = textAlign,
-            textDirection = textDirection,
-            lineHeight = lineHeight,
-            textIndent = textIndent,
-            platformStyle = platformStyle?.paragraphStyle,
-            lineHeightStyle = lineHeightStyle,
-            lineBreak = lineBreak,
-            hyphens = hyphens,
-            textMotion = textMotion
-        )
+        val mergedSpanStyle: SpanStyle =
+            spanStyle.fastMerge(
+                color = color,
+                brush = null,
+                alpha = Float.NaN,
+                fontSize = fontSize,
+                fontWeight = fontWeight,
+                fontStyle = fontStyle,
+                fontSynthesis = fontSynthesis,
+                fontFamily = fontFamily,
+                fontFeatureSettings = fontFeatureSettings,
+                letterSpacing = letterSpacing,
+                baselineShift = baselineShift,
+                textGeometricTransform = textGeometricTransform,
+                localeList = localeList,
+                background = background,
+                textDecoration = textDecoration,
+                shadow = shadow,
+                platformStyle = platformStyle?.spanStyle,
+                drawStyle = drawStyle
+            )
+        val mergedParagraphStyle: ParagraphStyle =
+            paragraphStyle.fastMerge(
+                textAlign = textAlign,
+                textDirection = textDirection,
+                lineHeight = lineHeight,
+                textIndent = textIndent,
+                platformStyle = platformStyle?.paragraphStyle,
+                lineHeightStyle = lineHeightStyle,
+                lineBreak = lineBreak,
+                hyphens = hyphens,
+                textMotion = textMotion
+            )
         if (spanStyle === mergedSpanStyle && paragraphStyle === mergedParagraphStyle) return this
         return TextStyle(mergedSpanStyle, mergedParagraphStyle)
     }
 
-    @Deprecated("merge that takes nullable TextAlign, " +
-        "TextDirection, LineBreak, and Hyphens are deprecated. Please use a new constructor " +
-        "where these parameters are non-nullable. Null value has been replaced by a special " +
-        "Unspecified object for performance reason.",
-        level = DeprecationLevel.HIDDEN)
+    @Deprecated(
+        "merge that takes nullable TextAlign, " +
+            "TextDirection, LineBreak, and Hyphens are deprecated. Please use a new constructor " +
+            "where these parameters are non-nullable. Null value has been replaced by a special " +
+            "Unspecified object for performance reason.",
+        level = DeprecationLevel.HIDDEN
+    )
     @Stable
     fun merge(
         color: Color = Color.Unspecified,
@@ -769,37 +772,39 @@
         platformStyle: PlatformTextStyle? = null,
         textMotion: TextMotion? = null
     ): TextStyle {
-        val mergedSpanStyle: SpanStyle = spanStyle.fastMerge(
-            color = color,
-            brush = null,
-            alpha = Float.NaN,
-            fontSize = fontSize,
-            fontWeight = fontWeight,
-            fontStyle = fontStyle,
-            fontSynthesis = fontSynthesis,
-            fontFamily = fontFamily,
-            fontFeatureSettings = fontFeatureSettings,
-            letterSpacing = letterSpacing,
-            baselineShift = baselineShift,
-            textGeometricTransform = textGeometricTransform,
-            localeList = localeList,
-            background = background,
-            textDecoration = textDecoration,
-            shadow = shadow,
-            platformStyle = platformStyle?.spanStyle,
-            drawStyle = drawStyle
-        )
-        val mergedParagraphStyle: ParagraphStyle = paragraphStyle.fastMerge(
-            textAlign = textAlign ?: TextAlign.Unspecified,
-            textDirection = textDirection ?: TextDirection.Unspecified,
-            lineHeight = lineHeight,
-            textIndent = textIndent,
-            platformStyle = platformStyle?.paragraphStyle,
-            lineHeightStyle = lineHeightStyle,
-            lineBreak = lineBreak ?: LineBreak.Unspecified,
-            hyphens = hyphens ?: Hyphens.Unspecified,
-            textMotion = textMotion
-        )
+        val mergedSpanStyle: SpanStyle =
+            spanStyle.fastMerge(
+                color = color,
+                brush = null,
+                alpha = Float.NaN,
+                fontSize = fontSize,
+                fontWeight = fontWeight,
+                fontStyle = fontStyle,
+                fontSynthesis = fontSynthesis,
+                fontFamily = fontFamily,
+                fontFeatureSettings = fontFeatureSettings,
+                letterSpacing = letterSpacing,
+                baselineShift = baselineShift,
+                textGeometricTransform = textGeometricTransform,
+                localeList = localeList,
+                background = background,
+                textDecoration = textDecoration,
+                shadow = shadow,
+                platformStyle = platformStyle?.spanStyle,
+                drawStyle = drawStyle
+            )
+        val mergedParagraphStyle: ParagraphStyle =
+            paragraphStyle.fastMerge(
+                textAlign = textAlign ?: TextAlign.Unspecified,
+                textDirection = textDirection ?: TextDirection.Unspecified,
+                lineHeight = lineHeight,
+                textIndent = textIndent,
+                platformStyle = platformStyle?.paragraphStyle,
+                lineHeightStyle = lineHeightStyle,
+                lineBreak = lineBreak ?: LineBreak.Unspecified,
+                hyphens = hyphens ?: Hyphens.Unspecified,
+                textMotion = textMotion
+            )
         if (spanStyle === mergedSpanStyle && paragraphStyle === mergedParagraphStyle) return this
         return TextStyle(mergedSpanStyle, mergedParagraphStyle)
     }
@@ -830,23 +835,14 @@
         )
     }
 
-    /**
-     * Plus operator overload that applies a [merge].
-     */
-    @Stable
-    operator fun plus(other: TextStyle): TextStyle = this.merge(other)
+    /** Plus operator overload that applies a [merge]. */
+    @Stable operator fun plus(other: TextStyle): TextStyle = this.merge(other)
 
-    /**
-     * Plus operator overload that applies a [merge].
-     */
-    @Stable
-    operator fun plus(other: ParagraphStyle): TextStyle = this.merge(other)
+    /** Plus operator overload that applies a [merge]. */
+    @Stable operator fun plus(other: ParagraphStyle): TextStyle = this.merge(other)
 
-    /**
-     * Plus operator overload that applies a [merge].
-     */
-    @Stable
-    operator fun plus(other: SpanStyle): TextStyle = this.merge(other)
+    /** Plus operator overload that applies a [merge]. */
+    @Stable operator fun plus(other: SpanStyle): TextStyle = this.merge(other)
 
     @Deprecated(
         "TextStyle copy constructors that do not take new stable parameters " +
@@ -875,39 +871,42 @@
         textIndent: TextIndent? = this.paragraphStyle.textIndent
     ): TextStyle {
         return TextStyle(
-            spanStyle = SpanStyle(
-                textForegroundStyle = if (color == this.spanStyle.color) {
-                    spanStyle.textForegroundStyle
-                } else {
-                    TextForegroundStyle.from(color)
-                },
-                fontSize = fontSize,
-                fontWeight = fontWeight,
-                fontStyle = fontStyle,
-                fontSynthesis = fontSynthesis,
-                fontFamily = fontFamily,
-                fontFeatureSettings = fontFeatureSettings,
-                letterSpacing = letterSpacing,
-                baselineShift = baselineShift,
-                textGeometricTransform = textGeometricTransform,
-                localeList = localeList,
-                background = background,
-                textDecoration = textDecoration,
-                shadow = shadow,
-                platformStyle = this.spanStyle.platformStyle,
-                drawStyle = this.spanStyle.drawStyle
-            ),
-            paragraphStyle = ParagraphStyle(
-                textAlign = textAlign ?: TextAlign.Unspecified,
-                textDirection = textDirection ?: TextDirection.Unspecified,
-                lineHeight = lineHeight,
-                textIndent = textIndent,
-                platformStyle = this.paragraphStyle.platformStyle,
-                lineHeightStyle = this.lineHeightStyle,
-                lineBreak = this.lineBreak,
-                hyphens = this.hyphens,
-                textMotion = this.textMotion
-            ),
+            spanStyle =
+                SpanStyle(
+                    textForegroundStyle =
+                        if (color == this.spanStyle.color) {
+                            spanStyle.textForegroundStyle
+                        } else {
+                            TextForegroundStyle.from(color)
+                        },
+                    fontSize = fontSize,
+                    fontWeight = fontWeight,
+                    fontStyle = fontStyle,
+                    fontSynthesis = fontSynthesis,
+                    fontFamily = fontFamily,
+                    fontFeatureSettings = fontFeatureSettings,
+                    letterSpacing = letterSpacing,
+                    baselineShift = baselineShift,
+                    textGeometricTransform = textGeometricTransform,
+                    localeList = localeList,
+                    background = background,
+                    textDecoration = textDecoration,
+                    shadow = shadow,
+                    platformStyle = this.spanStyle.platformStyle,
+                    drawStyle = this.spanStyle.drawStyle
+                ),
+            paragraphStyle =
+                ParagraphStyle(
+                    textAlign = textAlign ?: TextAlign.Unspecified,
+                    textDirection = textDirection ?: TextDirection.Unspecified,
+                    lineHeight = lineHeight,
+                    textIndent = textIndent,
+                    platformStyle = this.paragraphStyle.platformStyle,
+                    lineHeightStyle = this.lineHeightStyle,
+                    lineBreak = this.lineBreak,
+                    hyphens = this.hyphens,
+                    textMotion = this.textMotion
+                ),
             platformStyle = this.platformStyle
         )
     }
@@ -941,39 +940,42 @@
         lineHeightStyle: LineHeightStyle? = this.paragraphStyle.lineHeightStyle
     ): TextStyle {
         return TextStyle(
-            spanStyle = SpanStyle(
-                textForegroundStyle = if (color == this.spanStyle.color) {
-                    spanStyle.textForegroundStyle
-                } else {
-                    TextForegroundStyle.from(color)
-                },
-                fontSize = fontSize,
-                fontWeight = fontWeight,
-                fontStyle = fontStyle,
-                fontSynthesis = fontSynthesis,
-                fontFamily = fontFamily,
-                fontFeatureSettings = fontFeatureSettings,
-                letterSpacing = letterSpacing,
-                baselineShift = baselineShift,
-                textGeometricTransform = textGeometricTransform,
-                localeList = localeList,
-                background = background,
-                textDecoration = textDecoration,
-                shadow = shadow,
-                platformStyle = platformStyle?.spanStyle,
-                drawStyle = this.spanStyle.drawStyle
-            ),
-            paragraphStyle = ParagraphStyle(
-                textAlign = textAlign ?: TextAlign.Unspecified,
-                textDirection = textDirection ?: TextDirection.Unspecified,
-                lineHeight = lineHeight,
-                textIndent = textIndent,
-                platformStyle = platformStyle?.paragraphStyle,
-                lineHeightStyle = lineHeightStyle,
-                lineBreak = this.lineBreak,
-                hyphens = this.hyphens,
-                textMotion = this.textMotion
-            ),
+            spanStyle =
+                SpanStyle(
+                    textForegroundStyle =
+                        if (color == this.spanStyle.color) {
+                            spanStyle.textForegroundStyle
+                        } else {
+                            TextForegroundStyle.from(color)
+                        },
+                    fontSize = fontSize,
+                    fontWeight = fontWeight,
+                    fontStyle = fontStyle,
+                    fontSynthesis = fontSynthesis,
+                    fontFamily = fontFamily,
+                    fontFeatureSettings = fontFeatureSettings,
+                    letterSpacing = letterSpacing,
+                    baselineShift = baselineShift,
+                    textGeometricTransform = textGeometricTransform,
+                    localeList = localeList,
+                    background = background,
+                    textDecoration = textDecoration,
+                    shadow = shadow,
+                    platformStyle = platformStyle?.spanStyle,
+                    drawStyle = this.spanStyle.drawStyle
+                ),
+            paragraphStyle =
+                ParagraphStyle(
+                    textAlign = textAlign ?: TextAlign.Unspecified,
+                    textDirection = textDirection ?: TextDirection.Unspecified,
+                    lineHeight = lineHeight,
+                    textIndent = textIndent,
+                    platformStyle = platformStyle?.paragraphStyle,
+                    lineHeightStyle = lineHeightStyle,
+                    lineBreak = this.lineBreak,
+                    hyphens = this.hyphens,
+                    textMotion = this.textMotion
+                ),
             platformStyle = platformStyle
         )
     }
@@ -1009,48 +1011,53 @@
         hyphens: Hyphens? = this.paragraphStyle.hyphens
     ): TextStyle {
         return TextStyle(
-            spanStyle = SpanStyle(
-                textForegroundStyle = if (color == this.spanStyle.color) {
-                    spanStyle.textForegroundStyle
-                } else {
-                    TextForegroundStyle.from(color)
-                },
-                fontSize = fontSize,
-                fontWeight = fontWeight,
-                fontStyle = fontStyle,
-                fontSynthesis = fontSynthesis,
-                fontFamily = fontFamily,
-                fontFeatureSettings = fontFeatureSettings,
-                letterSpacing = letterSpacing,
-                baselineShift = baselineShift,
-                textGeometricTransform = textGeometricTransform,
-                localeList = localeList,
-                background = background,
-                textDecoration = textDecoration,
-                shadow = shadow,
-                platformStyle = platformStyle?.spanStyle,
-                drawStyle = this.drawStyle
-            ),
-            paragraphStyle = ParagraphStyle(
-                textAlign = textAlign ?: TextAlign.Unspecified,
-                textDirection = textDirection ?: TextDirection.Unspecified,
-                lineHeight = lineHeight,
-                textIndent = textIndent,
-                platformStyle = platformStyle?.paragraphStyle,
-                lineHeightStyle = lineHeightStyle,
-                lineBreak = lineBreak ?: LineBreak.Unspecified,
-                hyphens = hyphens ?: Hyphens.Unspecified,
-                textMotion = this.textMotion
-            ),
+            spanStyle =
+                SpanStyle(
+                    textForegroundStyle =
+                        if (color == this.spanStyle.color) {
+                            spanStyle.textForegroundStyle
+                        } else {
+                            TextForegroundStyle.from(color)
+                        },
+                    fontSize = fontSize,
+                    fontWeight = fontWeight,
+                    fontStyle = fontStyle,
+                    fontSynthesis = fontSynthesis,
+                    fontFamily = fontFamily,
+                    fontFeatureSettings = fontFeatureSettings,
+                    letterSpacing = letterSpacing,
+                    baselineShift = baselineShift,
+                    textGeometricTransform = textGeometricTransform,
+                    localeList = localeList,
+                    background = background,
+                    textDecoration = textDecoration,
+                    shadow = shadow,
+                    platformStyle = platformStyle?.spanStyle,
+                    drawStyle = this.drawStyle
+                ),
+            paragraphStyle =
+                ParagraphStyle(
+                    textAlign = textAlign ?: TextAlign.Unspecified,
+                    textDirection = textDirection ?: TextDirection.Unspecified,
+                    lineHeight = lineHeight,
+                    textIndent = textIndent,
+                    platformStyle = platformStyle?.paragraphStyle,
+                    lineHeightStyle = lineHeightStyle,
+                    lineBreak = lineBreak ?: LineBreak.Unspecified,
+                    hyphens = hyphens ?: Hyphens.Unspecified,
+                    textMotion = this.textMotion
+                ),
             platformStyle = platformStyle
         )
     }
 
-    @Deprecated("copy constructors that take nullable TextAlign, " +
-        "TextDirection, LineBreak, and Hyphens are deprecated. Please use a new constructor " +
-        "where these parameters are non-nullable. Null value has been replaced by a special " +
-        "Unspecified object for performance reason.",
-        level = DeprecationLevel.HIDDEN)
+    @Deprecated(
+        "copy constructors that take nullable TextAlign, " +
+            "TextDirection, LineBreak, and Hyphens are deprecated. Please use a new constructor " +
+            "where these parameters are non-nullable. Null value has been replaced by a special " +
+            "Unspecified object for performance reason.",
+        level = DeprecationLevel.HIDDEN
+    )
     fun copy(
         color: Color = this.spanStyle.color,
         fontSize: TextUnit = this.spanStyle.fontSize,
@@ -1078,39 +1085,42 @@
         textMotion: TextMotion? = this.paragraphStyle.textMotion,
     ): TextStyle {
         return TextStyle(
-            spanStyle = SpanStyle(
-                textForegroundStyle = if (color == this.spanStyle.color) {
-                    spanStyle.textForegroundStyle
-                } else {
-                    TextForegroundStyle.from(color)
-                },
-                fontSize = fontSize,
-                fontWeight = fontWeight,
-                fontStyle = fontStyle,
-                fontSynthesis = fontSynthesis,
-                fontFamily = fontFamily,
-                fontFeatureSettings = fontFeatureSettings,
-                letterSpacing = letterSpacing,
-                baselineShift = baselineShift,
-                textGeometricTransform = textGeometricTransform,
-                localeList = localeList,
-                background = background,
-                textDecoration = textDecoration,
-                shadow = shadow,
-                platformStyle = platformStyle?.spanStyle,
-                drawStyle = drawStyle
-            ),
-            paragraphStyle = ParagraphStyle(
-                textAlign = textAlign ?: TextAlign.Unspecified,
-                textDirection = textDirection ?: TextDirection.Unspecified,
-                lineHeight = lineHeight,
-                textIndent = textIndent,
-                platformStyle = platformStyle?.paragraphStyle,
-                lineHeightStyle = lineHeightStyle,
-                lineBreak = lineBreak ?: LineBreak.Unspecified,
-                hyphens = hyphens ?: Hyphens.Unspecified,
-                textMotion = textMotion
-            ),
+            spanStyle =
+                SpanStyle(
+                    textForegroundStyle =
+                        if (color == this.spanStyle.color) {
+                            spanStyle.textForegroundStyle
+                        } else {
+                            TextForegroundStyle.from(color)
+                        },
+                    fontSize = fontSize,
+                    fontWeight = fontWeight,
+                    fontStyle = fontStyle,
+                    fontSynthesis = fontSynthesis,
+                    fontFamily = fontFamily,
+                    fontFeatureSettings = fontFeatureSettings,
+                    letterSpacing = letterSpacing,
+                    baselineShift = baselineShift,
+                    textGeometricTransform = textGeometricTransform,
+                    localeList = localeList,
+                    background = background,
+                    textDecoration = textDecoration,
+                    shadow = shadow,
+                    platformStyle = platformStyle?.spanStyle,
+                    drawStyle = drawStyle
+                ),
+            paragraphStyle =
+                ParagraphStyle(
+                    textAlign = textAlign ?: TextAlign.Unspecified,
+                    textDirection = textDirection ?: TextDirection.Unspecified,
+                    lineHeight = lineHeight,
+                    textIndent = textIndent,
+                    platformStyle = platformStyle?.paragraphStyle,
+                    lineHeightStyle = lineHeightStyle,
+                    lineBreak = lineBreak ?: LineBreak.Unspecified,
+                    hyphens = hyphens ?: Hyphens.Unspecified,
+                    textMotion = textMotion
+                ),
             platformStyle = platformStyle
         )
     }
@@ -1142,48 +1152,53 @@
         textMotion: TextMotion? = this.paragraphStyle.textMotion,
     ): TextStyle {
         return TextStyle(
-            spanStyle = SpanStyle(
-                textForegroundStyle = if (color == this.spanStyle.color) {
-                    spanStyle.textForegroundStyle
-                } else {
-                    TextForegroundStyle.from(color)
-                },
-                fontSize = fontSize,
-                fontWeight = fontWeight,
-                fontStyle = fontStyle,
-                fontSynthesis = fontSynthesis,
-                fontFamily = fontFamily,
-                fontFeatureSettings = fontFeatureSettings,
-                letterSpacing = letterSpacing,
-                baselineShift = baselineShift,
-                textGeometricTransform = textGeometricTransform,
-                localeList = localeList,
-                background = background,
-                textDecoration = textDecoration,
-                shadow = shadow,
-                platformStyle = platformStyle?.spanStyle,
-                drawStyle = drawStyle
-            ),
-            paragraphStyle = ParagraphStyle(
-                textAlign = textAlign,
-                textDirection = textDirection,
-                lineHeight = lineHeight,
-                textIndent = textIndent,
-                platformStyle = platformStyle?.paragraphStyle,
-                lineHeightStyle = lineHeightStyle,
-                lineBreak = lineBreak,
-                hyphens = hyphens,
-                textMotion = textMotion
-            ),
+            spanStyle =
+                SpanStyle(
+                    textForegroundStyle =
+                        if (color == this.spanStyle.color) {
+                            spanStyle.textForegroundStyle
+                        } else {
+                            TextForegroundStyle.from(color)
+                        },
+                    fontSize = fontSize,
+                    fontWeight = fontWeight,
+                    fontStyle = fontStyle,
+                    fontSynthesis = fontSynthesis,
+                    fontFamily = fontFamily,
+                    fontFeatureSettings = fontFeatureSettings,
+                    letterSpacing = letterSpacing,
+                    baselineShift = baselineShift,
+                    textGeometricTransform = textGeometricTransform,
+                    localeList = localeList,
+                    background = background,
+                    textDecoration = textDecoration,
+                    shadow = shadow,
+                    platformStyle = platformStyle?.spanStyle,
+                    drawStyle = drawStyle
+                ),
+            paragraphStyle =
+                ParagraphStyle(
+                    textAlign = textAlign,
+                    textDirection = textDirection,
+                    lineHeight = lineHeight,
+                    textIndent = textIndent,
+                    platformStyle = platformStyle?.paragraphStyle,
+                    lineHeightStyle = lineHeightStyle,
+                    lineBreak = lineBreak,
+                    hyphens = hyphens,
+                    textMotion = textMotion
+                ),
             platformStyle = platformStyle
         )
     }
 
-    @Deprecated("copy constructors that take nullable TextAlign, " +
-        "TextDirection, LineBreak, and Hyphens are deprecated. Please use a new constructor " +
-        "where these parameters are non-nullable. Null value has been replaced by a special " +
-        "Unspecified object for performance reason.",
-        level = DeprecationLevel.HIDDEN)
+    @Deprecated(
+        "copy constructors that take nullable TextAlign, " +
+            "TextDirection, LineBreak, and Hyphens are deprecated. Please use a new constructor " +
+            "where these parameters are non-nullable. Null value has been replaced by a special " +
+            "Unspecified object for performance reason.",
+        level = DeprecationLevel.HIDDEN
+    )
     fun copy(
         brush: Brush?,
         alpha: Float = this.spanStyle.alpha,
@@ -1212,36 +1227,38 @@
         textMotion: TextMotion? = this.paragraphStyle.textMotion,
     ): TextStyle {
         return TextStyle(
-            spanStyle = SpanStyle(
-                brush = brush,
-                alpha = alpha,
-                fontSize = fontSize,
-                fontWeight = fontWeight,
-                fontStyle = fontStyle,
-                fontSynthesis = fontSynthesis,
-                fontFamily = fontFamily,
-                fontFeatureSettings = fontFeatureSettings,
-                letterSpacing = letterSpacing,
-                baselineShift = baselineShift,
-                textGeometricTransform = textGeometricTransform,
-                localeList = localeList,
-                background = background,
-                textDecoration = textDecoration,
-                shadow = shadow,
-                platformStyle = platformStyle?.spanStyle,
-                drawStyle = drawStyle
-            ),
-            paragraphStyle = ParagraphStyle(
-                textAlign = textAlign ?: TextAlign.Unspecified,
-                textDirection = textDirection ?: TextDirection.Unspecified,
-                lineHeight = lineHeight,
-                textIndent = textIndent,
-                platformStyle = platformStyle?.paragraphStyle,
-                lineHeightStyle = lineHeightStyle,
-                lineBreak = lineBreak ?: LineBreak.Unspecified,
-                hyphens = hyphens ?: Hyphens.Unspecified,
-                textMotion = textMotion
-            ),
+            spanStyle =
+                SpanStyle(
+                    brush = brush,
+                    alpha = alpha,
+                    fontSize = fontSize,
+                    fontWeight = fontWeight,
+                    fontStyle = fontStyle,
+                    fontSynthesis = fontSynthesis,
+                    fontFamily = fontFamily,
+                    fontFeatureSettings = fontFeatureSettings,
+                    letterSpacing = letterSpacing,
+                    baselineShift = baselineShift,
+                    textGeometricTransform = textGeometricTransform,
+                    localeList = localeList,
+                    background = background,
+                    textDecoration = textDecoration,
+                    shadow = shadow,
+                    platformStyle = platformStyle?.spanStyle,
+                    drawStyle = drawStyle
+                ),
+            paragraphStyle =
+                ParagraphStyle(
+                    textAlign = textAlign ?: TextAlign.Unspecified,
+                    textDirection = textDirection ?: TextDirection.Unspecified,
+                    lineHeight = lineHeight,
+                    textIndent = textIndent,
+                    platformStyle = platformStyle?.paragraphStyle,
+                    lineHeightStyle = lineHeightStyle,
+                    lineBreak = lineBreak ?: LineBreak.Unspecified,
+                    hyphens = hyphens ?: Hyphens.Unspecified,
+                    textMotion = textMotion
+                ),
             platformStyle = platformStyle
         )
     }
@@ -1274,162 +1291,154 @@
         textMotion: TextMotion? = this.paragraphStyle.textMotion,
     ): TextStyle {
         return TextStyle(
-            spanStyle = SpanStyle(
-                brush = brush,
-                alpha = alpha,
-                fontSize = fontSize,
-                fontWeight = fontWeight,
-                fontStyle = fontStyle,
-                fontSynthesis = fontSynthesis,
-                fontFamily = fontFamily,
-                fontFeatureSettings = fontFeatureSettings,
-                letterSpacing = letterSpacing,
-                baselineShift = baselineShift,
-                textGeometricTransform = textGeometricTransform,
-                localeList = localeList,
-                background = background,
-                textDecoration = textDecoration,
-                shadow = shadow,
-                platformStyle = platformStyle?.spanStyle,
-                drawStyle = drawStyle
-            ),
-            paragraphStyle = ParagraphStyle(
-                textAlign = textAlign,
-                textDirection = textDirection,
-                lineHeight = lineHeight,
-                textIndent = textIndent,
-                platformStyle = platformStyle?.paragraphStyle,
-                lineHeightStyle = lineHeightStyle,
-                lineBreak = lineBreak,
-                hyphens = hyphens,
-                textMotion = textMotion
-            ),
+            spanStyle =
+                SpanStyle(
+                    brush = brush,
+                    alpha = alpha,
+                    fontSize = fontSize,
+                    fontWeight = fontWeight,
+                    fontStyle = fontStyle,
+                    fontSynthesis = fontSynthesis,
+                    fontFamily = fontFamily,
+                    fontFeatureSettings = fontFeatureSettings,
+                    letterSpacing = letterSpacing,
+                    baselineShift = baselineShift,
+                    textGeometricTransform = textGeometricTransform,
+                    localeList = localeList,
+                    background = background,
+                    textDecoration = textDecoration,
+                    shadow = shadow,
+                    platformStyle = platformStyle?.spanStyle,
+                    drawStyle = drawStyle
+                ),
+            paragraphStyle =
+                ParagraphStyle(
+                    textAlign = textAlign,
+                    textDirection = textDirection,
+                    lineHeight = lineHeight,
+                    textIndent = textIndent,
+                    platformStyle = platformStyle?.paragraphStyle,
+                    lineHeightStyle = lineHeightStyle,
+                    lineBreak = lineBreak,
+                    hyphens = hyphens,
+                    textMotion = textMotion
+                ),
             platformStyle = platformStyle
         )
     }
 
-    /**
-     * The brush to use when drawing text. If not null, overrides [color].
-     */
-    val brush: Brush? get() = this.spanStyle.brush
+    /** The brush to use when drawing text. If not null, overrides [color]. */
+    val brush: Brush?
+        get() = this.spanStyle.brush
 
-    /**
-     * The text color.
-     */
-    val color: Color get() = this.spanStyle.color
+    /** The text color. */
+    val color: Color
+        get() = this.spanStyle.color
 
     /**
      * Opacity of text. This value is either provided along side Brush, or via alpha channel in
      * color.
      */
-    val alpha: Float get() = this.spanStyle.alpha
+    val alpha: Float
+        get() = this.spanStyle.alpha
 
     /**
-     * The size of glyphs to use when painting the text. This
-     * may be [TextUnit.Unspecified] for inheriting from another [TextStyle].
+     * The size of glyphs to use when painting the text. This may be [TextUnit.Unspecified] for
+     * inheriting from another [TextStyle].
      */
-    val fontSize: TextUnit get() = this.spanStyle.fontSize
+    val fontSize: TextUnit
+        get() = this.spanStyle.fontSize
+
+    /** The typeface thickness to use when painting the text (e.g., bold). */
+    val fontWeight: FontWeight?
+        get() = this.spanStyle.fontWeight
+
+    /** The typeface variant to use when drawing the letters (e.g., italic). */
+    val fontStyle: FontStyle?
+        get() = this.spanStyle.fontStyle
 
     /**
-     * The typeface thickness to use when painting the text (e.g., bold).
+     * Whether to synthesize font weight and/or style when the requested weight or style cannot be
+     * found in the provided font family.
      */
-    val fontWeight: FontWeight? get() = this.spanStyle.fontWeight
+    val fontSynthesis: FontSynthesis?
+        get() = this.spanStyle.fontSynthesis
+
+    /** The font family to be used when rendering the text. */
+    val fontFamily: FontFamily?
+        get() = this.spanStyle.fontFamily
 
     /**
-     * The typeface variant to use when drawing the letters (e.g., italic).
+     * The advanced typography settings provided by font. The format is the same as the CSS
+     * font-feature-settings attribute:
+     * https://www.w3.org/TR/css-fonts-3/#font-feature-settings-prop
      */
-    val fontStyle: FontStyle? get() = this.spanStyle.fontStyle
+    val fontFeatureSettings: String?
+        get() = this.spanStyle.fontFeatureSettings
 
-    /**
-     * Whether to synthesize font weight and/or style when the requested weight or
-     *  style cannot be found in the provided font family.
-     */
-    val fontSynthesis: FontSynthesis? get() = this.spanStyle.fontSynthesis
+    /** The amount of space to add between each letter. */
+    val letterSpacing: TextUnit
+        get() = this.spanStyle.letterSpacing
 
-    /**
-     * The font family to be used when rendering the text.
-     */
-    val fontFamily: FontFamily? get() = this.spanStyle.fontFamily
+    /** The amount by which the text is shifted up from the current baseline. */
+    val baselineShift: BaselineShift?
+        get() = this.spanStyle.baselineShift
 
-    /**
-     * The advanced typography settings provided by font. The format is the
-     *  same as the CSS font-feature-settings attribute:
-     *  https://www.w3.org/TR/css-fonts-3/#font-feature-settings-prop
-     */
-    val fontFeatureSettings: String? get() = this.spanStyle.fontFeatureSettings
+    /** The geometric transformation applied the text. */
+    val textGeometricTransform: TextGeometricTransform?
+        get() = this.spanStyle.textGeometricTransform
 
-    /**
-     * The amount of space to add between each letter.
-     */
-    val letterSpacing: TextUnit get() = this.spanStyle.letterSpacing
+    /** The locale list used to select region-specific glyphs. */
+    val localeList: LocaleList?
+        get() = this.spanStyle.localeList
 
-    /**
-     * The amount by which the text is shifted up from the current baseline.
-     */
-    val baselineShift: BaselineShift? get() = this.spanStyle.baselineShift
+    /** The background color for the text. */
+    val background: Color
+        get() = this.spanStyle.background
 
-    /**
-     * The geometric transformation applied the text.
-     */
-    val textGeometricTransform: TextGeometricTransform? get() =
-        this.spanStyle.textGeometricTransform
+    /** The decorations to paint on the text (e.g., an underline). */
+    val textDecoration: TextDecoration?
+        get() = this.spanStyle.textDecoration
 
-    /**
-     * The locale list used to select region-specific glyphs.
-     */
-    val localeList: LocaleList? get() = this.spanStyle.localeList
+    /** The shadow effect applied on the text. */
+    val shadow: Shadow?
+        get() = this.spanStyle.shadow
 
-    /**
-     * The background color for the text.
-     */
-    val background: Color get() = this.spanStyle.background
+    /** Drawing style of text, whether fill in the text while drawing or stroke around the edges. */
+    val drawStyle: DrawStyle?
+        get() = this.spanStyle.drawStyle
 
-    /**
-     * The decorations to paint on the text (e.g., an underline).
-     */
-    val textDecoration: TextDecoration? get() = this.spanStyle.textDecoration
-
-    /**
-     * The shadow effect applied on the text.
-     */
-    val shadow: Shadow? get() = this.spanStyle.shadow
-
-    /**
-     * Drawing style of text, whether fill in the text while drawing or stroke around the edges.
-     */
-    val drawStyle: DrawStyle? get() = this.spanStyle.drawStyle
-
-    /**
-     * The alignment of the text within the lines of the paragraph.
-     */
-    val textAlign: TextAlign get() = this.paragraphStyle.textAlign
+    /** The alignment of the text within the lines of the paragraph. */
+    val textAlign: TextAlign
+        get() = this.paragraphStyle.textAlign
 
     @Deprecated("Kept for backwards compatibility.", level = DeprecationLevel.WARNING)
     @get:JvmName("getTextAlign-buA522U") // b/320819734
     @Suppress("unused", "RedundantNullableReturnType", "PropertyName")
-    val deprecated_boxing_textAlign: TextAlign? get() = this.textAlign
+    val deprecated_boxing_textAlign: TextAlign?
+        get() = this.textAlign
 
     /**
-     * The algorithm to be used to resolve the final text and paragraph
-     * direction: Left To Right or Right To Left. If no value is provided the system will use the
-     * [LayoutDirection] as the primary signal.
+     * The algorithm to be used to resolve the final text and paragraph direction: Left To Right or
+     * Right To Left. If no value is provided the system will use the [LayoutDirection] as the
+     * primary signal.
      */
-    val textDirection: TextDirection get() = this.paragraphStyle.textDirection
+    val textDirection: TextDirection
+        get() = this.paragraphStyle.textDirection
 
     @Deprecated("Kept for backwards compatibility.", level = DeprecationLevel.WARNING)
     @get:JvmName("getTextDirection-mmuk1to") // b/320819734
     @Suppress("unused", "RedundantNullableReturnType", "PropertyName")
-    val deprecated_boxing_textDirection: TextDirection? get() = this.textDirection
+    val deprecated_boxing_textDirection: TextDirection?
+        get() = this.textDirection
 
-    /**
-     * Line height for the [Paragraph] in [TextUnit] unit, e.g. SP or EM.
-     */
-    val lineHeight: TextUnit get() = this.paragraphStyle.lineHeight
+    /** Line height for the [Paragraph] in [TextUnit] unit, e.g. SP or EM. */
+    val lineHeight: TextUnit
+        get() = this.paragraphStyle.lineHeight
 
-    /**
-     * The indentation of the paragraph.
-     */
-    val textIndent: TextIndent? get() = this.paragraphStyle.textIndent
+    /** The indentation of the paragraph. */
+    val textIndent: TextIndent?
+        get() = this.paragraphStyle.textIndent
 
     /**
      * The configuration for line height such as vertical alignment of the line, whether to apply
@@ -1439,32 +1448,32 @@
      *
      * When null, [LineHeightStyle.Default] is used.
      */
-    val lineHeightStyle: LineHeightStyle? get() = this.paragraphStyle.lineHeightStyle
+    val lineHeightStyle: LineHeightStyle?
+        get() = this.paragraphStyle.lineHeightStyle
 
-    /**
-     * The hyphens configuration of the paragraph.
-     */
-    val hyphens: Hyphens get() = this.paragraphStyle.hyphens
+    /** The hyphens configuration of the paragraph. */
+    val hyphens: Hyphens
+        get() = this.paragraphStyle.hyphens
 
     @Deprecated("Kept for backwards compatibility.", level = DeprecationLevel.WARNING)
     @get:JvmName("getHyphens-EaSxIns") // b/320819734
     @Suppress("unused", "RedundantNullableReturnType", "PropertyName")
-    val deprecated_boxing_hyphens: Hyphens? get() = this.hyphens
+    val deprecated_boxing_hyphens: Hyphens?
+        get() = this.hyphens
 
-    /**
-     * The line breaking configuration of the paragraph.
-     */
-    val lineBreak: LineBreak get() = this.paragraphStyle.lineBreak
+    /** The line breaking configuration of the paragraph. */
+    val lineBreak: LineBreak
+        get() = this.paragraphStyle.lineBreak
 
     @Deprecated("Kept for backwards compatibility.", level = DeprecationLevel.WARNING)
     @get:JvmName("getLineBreak-LgCVezo") // b/320819734
     @Suppress("unused", "RedundantNullableReturnType", "PropertyName")
-    val deprecated_boxing_lineBreak: LineBreak? get() = this.lineBreak
+    val deprecated_boxing_lineBreak: LineBreak?
+        get() = this.lineBreak
 
-    /**
-     * Text character placement configuration, whether to optimize for animated or static text.
-     */
-    val textMotion: TextMotion? get() = this.paragraphStyle.textMotion
+    /** Text character placement configuration, whether to optimize for animated or static text. */
+    val textMotion: TextMotion?
+        get() = this.paragraphStyle.textMotion
 
     override fun equals(other: Any?): Boolean {
         if (this === other) return true
@@ -1491,8 +1500,9 @@
      * @param other The TextStyle to compare to.
      */
     fun hasSameLayoutAffectingAttributes(other: TextStyle): Boolean {
-        return (this === other) || (paragraphStyle == other.paragraphStyle &&
-            spanStyle.hasSameLayoutAffectingAttributes(other.spanStyle))
+        return (this === other) ||
+            (paragraphStyle == other.paragraphStyle &&
+                spanStyle.hasSameLayoutAffectingAttributes(other.spanStyle))
     }
 
     fun hasSameDrawAffectingAttributes(other: TextStyle): Boolean {
@@ -1545,11 +1555,8 @@
     }
 
     companion object {
-        /**
-         * Constant for default text style.
-         */
-        @Stable
-        val Default = TextStyle()
+        /** Constant for default text style. */
+        @Stable val Default = TextStyle()
     }
 }
 
@@ -1558,13 +1565,12 @@
  *
  * This will not work well if the styles don't set the same fields.
  *
- * The [fraction] argument represents position on the timeline, with 0.0 meaning
- * that the interpolation has not started, returning [start] (or something
- * equivalent to [start]), 1.0 meaning that the interpolation has finished,
- * returning [stop] (or something equivalent to [stop]), and values in between
- * meaning that the interpolation is at the relevant point on the timeline
- * between [start] and [stop]. The interpolation can be extrapolated beyond 0.0 and
- * 1.0, so negative values and values greater than 1.0 are valid.
+ * The [fraction] argument represents position on the timeline, with 0.0 meaning that the
+ * interpolation has not started, returning [start] (or something equivalent to [start]), 1.0
+ * meaning that the interpolation has finished, returning [stop] (or something equivalent to
+ * [stop]), and values in between meaning that the interpolation is at the relevant point on the
+ * timeline between [start] and [stop]. The interpolation can be extrapolated beyond 0.0 and 1.0, so
+ * negative values and values greater than 1.0 are valid.
  */
 fun lerp(start: TextStyle, stop: TextStyle, fraction: Float): TextStyle {
     return TextStyle(
@@ -1577,32 +1583,34 @@
  * Fills missing values in TextStyle with default values and resolve [TextDirection].
  *
  * This function will fill all null or [TextUnit.Unspecified] field with actual values.
+ *
  * @param style a text style to be resolved
  * @param direction a layout direction to be used for resolving text layout direction algorithm
  * @return resolved text style.
  */
-fun resolveDefaults(style: TextStyle, direction: LayoutDirection) = TextStyle(
-    spanStyle = resolveSpanStyleDefaults(style.spanStyle),
-    paragraphStyle = resolveParagraphStyleDefaults(style.paragraphStyle, direction),
-    platformStyle = style.platformStyle
-)
+fun resolveDefaults(style: TextStyle, direction: LayoutDirection) =
+    TextStyle(
+        spanStyle = resolveSpanStyleDefaults(style.spanStyle),
+        paragraphStyle = resolveParagraphStyleDefaults(style.paragraphStyle, direction),
+        platformStyle = style.platformStyle
+    )
 
-/**
- * If [textDirection] is null returns a [TextDirection] based on [layoutDirection].
- */
+/** If [textDirection] is null returns a [TextDirection] based on [layoutDirection]. */
 internal fun resolveTextDirection(
     layoutDirection: LayoutDirection,
     textDirection: TextDirection
 ): TextDirection {
     return when (textDirection) {
-        TextDirection.Content -> when (layoutDirection) {
-            LayoutDirection.Ltr -> TextDirection.ContentOrLtr
-            LayoutDirection.Rtl -> TextDirection.ContentOrRtl
-        }
-        TextDirection.Unspecified -> when (layoutDirection) {
-            LayoutDirection.Ltr -> TextDirection.Ltr
-            LayoutDirection.Rtl -> TextDirection.Rtl
-        }
+        TextDirection.Content ->
+            when (layoutDirection) {
+                LayoutDirection.Ltr -> TextDirection.ContentOrLtr
+                LayoutDirection.Rtl -> TextDirection.ContentOrRtl
+            }
+        TextDirection.Unspecified ->
+            when (layoutDirection) {
+                LayoutDirection.Ltr -> TextDirection.Ltr
+                LayoutDirection.Rtl -> TextDirection.Rtl
+            }
         else -> textDirection
     }
 }
diff --git a/compose/ui/ui-text/src/commonMain/kotlin/androidx/compose/ui/text/TtsAnnotation.kt b/compose/ui/ui-text/src/commonMain/kotlin/androidx/compose/ui/text/TtsAnnotation.kt
index a66ad82..24034be 100644
--- a/compose/ui/ui-text/src/commonMain/kotlin/androidx/compose/ui/text/TtsAnnotation.kt
+++ b/compose/ui/ui-text/src/commonMain/kotlin/androidx/compose/ui/text/TtsAnnotation.kt
@@ -17,20 +17,18 @@
 package androidx.compose.ui.text
 
 /**
- * An annotation that contains the metadata intended for text-to-speech engine. If the text is
- * being processed by a text-to-speech engine, the engine may use the data in this annotation in
- * addition to or instead of its associated text.
+ * An annotation that contains the metadata intended for text-to-speech engine. If the text is being
+ * processed by a text-to-speech engine, the engine may use the data in this annotation in addition
+ * to or instead of its associated text.
  */
 sealed class TtsAnnotation
 
 /**
- * The text associated with this annotation is a series of characters that have to be read
- * verbatim.
+ * The text associated with this annotation is a series of characters that have to be read verbatim.
+ *
  * @param verbatim a string where the characters are read verbatim except whitespace.
  */
-class VerbatimTtsAnnotation(
-    val verbatim: String
-) : TtsAnnotation() {
+class VerbatimTtsAnnotation(val verbatim: String) : TtsAnnotation() {
     override fun equals(other: Any?): Boolean {
         if (this === other) return true
         if (other !is VerbatimTtsAnnotation) return false
diff --git a/compose/ui/ui-text/src/commonMain/kotlin/androidx/compose/ui/text/UrlAnnotation.kt b/compose/ui/ui-text/src/commonMain/kotlin/androidx/compose/ui/text/UrlAnnotation.kt
index 2dcd993..3541715 100644
--- a/compose/ui/ui-text/src/commonMain/kotlin/androidx/compose/ui/text/UrlAnnotation.kt
+++ b/compose/ui/ui-text/src/commonMain/kotlin/androidx/compose/ui/text/UrlAnnotation.kt
@@ -17,18 +17,15 @@
 package androidx.compose.ui.text
 
 /**
- * An annotation that contains the metadata intended for text-to-speech engine. If the text is
- * being processed by a text-to-speech engine, the engine may use the data in this annotation in
- * addition to or instead of its associated text.
+ * An annotation that contains the metadata intended for text-to-speech engine. If the text is being
+ * processed by a text-to-speech engine, the engine may use the data in this annotation in addition
+ * to or instead of its associated text.
  *
- * Note: this is now deprecated. In order to display a link in the text, add a [LinkAnnotation]
- * to the AnnotatedString and pass it to the Text composable function
+ * Note: this is now deprecated. In order to display a link in the text, add a [LinkAnnotation] to
+ * the AnnotatedString and pass it to the Text composable function
  */
 @ExperimentalTextApi
-@Deprecated(
-    "Use LinkAnnotatation.Url(url) instead",
-    ReplaceWith("LinkAnnotation.Url(url)")
-)
+@Deprecated("Use LinkAnnotatation.Url(url) instead", ReplaceWith("LinkAnnotation.Url(url)"))
 @Suppress("Deprecation")
 class UrlAnnotation(val url: String) {
     override fun equals(other: Any?): Boolean {
diff --git a/compose/ui/ui-text/src/commonMain/kotlin/androidx/compose/ui/text/caches/ContainerHelpers.kt b/compose/ui/ui-text/src/commonMain/kotlin/androidx/compose/ui/text/caches/ContainerHelpers.kt
index c9a697c..67f9902 100644
--- a/compose/ui/ui-text/src/commonMain/kotlin/androidx/compose/ui/text/caches/ContainerHelpers.kt
+++ b/compose/ui/ui-text/src/commonMain/kotlin/androidx/compose/ui/text/caches/ContainerHelpers.kt
@@ -16,21 +16,13 @@
 
 package androidx.compose.ui.text.caches
 
-/**
- * Copied from ContainerHelpers.binarySearch until collection2 can be linked
- */
-@kotlin.jvm.JvmField
-internal val EMPTY_INTS = IntArray(0)
+/** Copied from ContainerHelpers.binarySearch until collection2 can be linked */
+@kotlin.jvm.JvmField internal val EMPTY_INTS = IntArray(0)
 
-/**
- * Copied from ContainerHelpers.binarySearch until collection2 can be linked
- */
-@kotlin.jvm.JvmField
-internal val EMPTY_OBJECTS = arrayOfNulls<Any>(0)
+/** Copied from ContainerHelpers.binarySearch until collection2 can be linked */
+@kotlin.jvm.JvmField internal val EMPTY_OBJECTS = arrayOfNulls<Any>(0)
 
-/**
- * Copied from ContainerHelpers.binarySearch until collection2 can be linked
- */
+/** Copied from ContainerHelpers.binarySearch until collection2 can be linked */
 internal fun IntArray.binarySearchInternal(size: Int, value: Int): Int {
     var lo = 0
     var hi = size - 1
diff --git a/compose/ui/ui-text/src/commonMain/kotlin/androidx/compose/ui/text/caches/LruCache.kt b/compose/ui/ui-text/src/commonMain/kotlin/androidx/compose/ui/text/caches/LruCache.kt
index bd3fb7f..7a9544c 100644
--- a/compose/ui/ui-text/src/commonMain/kotlin/androidx/compose/ui/text/caches/LruCache.kt
+++ b/compose/ui/ui-text/src/commonMain/kotlin/androidx/compose/ui/text/caches/LruCache.kt
@@ -20,9 +20,7 @@
 import androidx.compose.ui.text.platform.synchronized
 import kotlin.jvm.JvmName
 
-/**
- * Copy from collection2 until that library can be added as a dependency
- */
+/** Copy from collection2 until that library can be added as a dependency */
 internal open class LruCache<K, V> {
 
     private val monitor = createSynchronizedObject()
@@ -33,11 +31,13 @@
     @get:JvmName("size")
     public var size: Int = 0
         /**
-         * For caches that do not override [sizeOf], this returns the number
-         * of entries in the cache. For all other caches, this returns the sum of
-         * the sizes of the entries in this cache.
+         * For caches that do not override [sizeOf], this returns the number of entries in the
+         * cache. For all other caches, this returns the sum of the sizes of the entries in this
+         * cache.
          */
-        get() = synchronizedValue { return field }
+        get() = synchronizedValue {
+            return field
+        }
         private set
 
     private var maxSize = 0
@@ -49,11 +49,11 @@
     private var missCount = 0
 
     /**
-     * @param maxSize for caches that do not override [sizeOf], this is
-     *     the maximum number of entries in the cache. For all other caches,
-     *     this is the maximum sum of the sizes of the entries in this cache.
+     * @param maxSize for caches that do not override [sizeOf], this is the maximum number of
+     *   entries in the cache. For all other caches, this is the maximum sum of the sizes of the
+     *   entries in this cache.
      */
-        constructor(maxSize: Int) {
+    constructor(maxSize: Int) {
         require(maxSize > 0) { "maxSize <= 0" }
         this.maxSize = maxSize
         map = HashMap<K, V>(0, 0.75f)
@@ -68,19 +68,16 @@
     open fun resize(maxSize: Int) {
         require(maxSize > 0) { "maxSize <= 0" }
 
-        synchronized(monitor) {
-            this.maxSize = maxSize
-        }
+        synchronized(monitor) { this.maxSize = maxSize }
         trimToSize(maxSize)
     }
 
     /**
-     * Returns the value for [key] if it exists in the cache or can be
-     * created by [create]. If a value was returned, it is moved to the
-     * head of the queue. This returns `null` if a value is not cached and cannot
-     * be created.
+     * Returns the value for [key] if it exists in the cache or can be created by [create]. If a
+     * value was returned, it is moved to the head of the queue. This returns `null` if a value is
+     * not cached and cannot be created.
      */
-        fun get(key: K): V? {
+    fun get(key: K): V? {
         var mapValue: V? = null
 
         synchronized(monitor) {
@@ -126,13 +123,12 @@
     }
 
     /**
-     * Caches [value] for [key]. The value is moved to the head of
-     * the queue.
+     * Caches [value] for [key]. The value is moved to the head of the queue.
      *
      * @return the previous value mapped by [key].
      * @throws NullPointerException if [key] or [value] is null
      */
-        fun put(key: K, value: V): V? {
+    fun put(key: K, value: V): V? {
         // Must throw NPE for JVM interop contract.
         if (key == null || value == null) {
             throw NullPointerException()
@@ -161,11 +157,11 @@
     }
 
     /**
-     * Remove the eldest entries until the total of remaining entries is at or
-     * below the requested size.
+     * Remove the eldest entries until the total of remaining entries is at or below the requested
+     * size.
      *
-     * @param maxSize the maximum size of the cache before returning. May be -1
-     *            to evict even 0-sized elements.
+     * @param maxSize the maximum size of the cache before returning. May be -1 to evict even
+     *   0-sized elements.
      * @throws IllegalStateException
      */
     open fun trimToSize(maxSize: Int) {
@@ -174,19 +170,15 @@
             var value: V? = null
 
             synchronized(monitor) {
-                if (size < 0 ||
-                    (map.isEmpty() && size != 0) ||
-                    (map.isEmpty() != keySet.isEmpty())
+                if (
+                    size < 0 || (map.isEmpty() && size != 0) || (map.isEmpty() != keySet.isEmpty())
                 ) {
                     throw IllegalStateException("map/keySet size inconsistency")
                 }
 
                 if (size > maxSize && !map.isEmpty()) {
                     key = keySet.first()
-                    value = map.get(key) ?: throw IllegalStateException(
-                        "inconsistent " +
-                            "state"
-                    )
+                    value = map.get(key) ?: throw IllegalStateException("inconsistent " + "state")
                     map.remove(key)
                     keySet.remove(key)
                     size -= safeSizeOf(key!!, value!!)
@@ -231,41 +223,35 @@
     }
 
     /**
-     * Called for entries that have been evicted or removed. This method is
-     * invoked when a value is evicted to make space, removed by a call to
-     * [remove], or replaced by a call to [put]. The default
-     * implementation does nothing.
+     * Called for entries that have been evicted or removed. This method is invoked when a value is
+     * evicted to make space, removed by a call to [remove], or replaced by a call to [put]. The
+     * default implementation does nothing.
      *
-     * The method is called without synchronization: other threads may
-     * access the cache while this method is executing.
+     * The method is called without synchronization: other threads may access the cache while this
+     * method is executing.
      *
-     * @param evicted `true` if the entry is being removed to make space, `false`
-     *     if the removal was caused by a [put] or [remove].
+     * @param evicted `true` if the entry is being removed to make space, `false` if the removal was
+     *   caused by a [put] or [remove].
      * @param key key of the entry that was evicted or removed.
      * @param oldValue the original value of the entry that was evicted removed.
-     * @param newValue the new value for [key], if it exists. If non-null,
-     *     this removal was caused by a [put]. Otherwise it was caused by
-     *     an eviction or a [remove].
+     * @param newValue the new value for [key], if it exists. If non-null, this removal was caused
+     *   by a [put]. Otherwise it was caused by an eviction or a [remove].
      */
-    protected open fun entryRemoved(evicted: Boolean, key: K, oldValue: V, newValue: V?) {
-    }
+    protected open fun entryRemoved(evicted: Boolean, key: K, oldValue: V, newValue: V?) {}
 
     /**
-     * Called after a cache miss to compute a value for the corresponding key.
-     * Returns the computed value or null if no value can be computed. The
-     * default implementation returns null.
+     * Called after a cache miss to compute a value for the corresponding key. Returns the computed
+     * value or null if no value can be computed. The default implementation returns null.
      *
-     * The method is called without synchronization: other threads may
-     * access the cache while this method is executing.
+     * The method is called without synchronization: other threads may access the cache while this
+     * method is executing.
      *
-     * If a value for [key] exists in the cache when this method
-     * returns, the created value will be released with [entryRemoved]
-     * and discarded. This can occur when multiple threads request the same key
-     * at the same time (causing multiple values to be created), or when one
-     * thread calls [put] while another is creating a value for the same
-     * key.
+     * If a value for [key] exists in the cache when this method returns, the created value will be
+     * released with [entryRemoved] and discarded. This can occur when multiple threads request the
+     * same key at the same time (causing multiple values to be created), or when one thread calls
+     * [put] while another is creating a value for the same key.
      */
-        protected open fun create(key: K): V? = null
+    protected open fun create(key: K): V? = null
 
     private fun safeSizeOf(key: K, value: V): Int {
         val result = sizeOf(key, value)
@@ -274,58 +260,44 @@
     }
 
     /**
-     * Returns the size of the entry for [key] and [value] in
-     * user-defined units.  The default implementation returns 1 so that size
-     * is the number of entries and max size is the maximum number of entries.
+     * Returns the size of the entry for [key] and [value] in user-defined units. The default
+     * implementation returns 1 so that size is the number of entries and max size is the maximum
+     * number of entries.
      *
      * An entry's size must not change while it is in the cache.
      */
     protected open fun sizeOf(key: K, value: V) = 1
 
-    /**
-     * Clear the cache, calling [entryRemoved] on each removed entry.
-     */
+    /** Clear the cache, calling [entryRemoved] on each removed entry. */
     fun evictAll() {
         trimToSize(-1) // -1 will evict 0-sized elements
     }
 
     /**
-     * For caches that do not override [sizeOf], this returns the maximum
-     * number of entries in the cache. For all other caches, this returns the
-     * maximum sum of the sizes of the entries in this cache.
+     * For caches that do not override [sizeOf], this returns the maximum number of entries in the
+     * cache. For all other caches, this returns the maximum sum of the sizes of the entries in this
+     * cache.
      */
     fun maxSize(): Int = synchronizedValue { maxSize }
 
-    /**
-     * Returns the number of times [get] returned a value that was
-     * already present in the cache.
-     */
+    /** Returns the number of times [get] returned a value that was already present in the cache. */
     fun hitCount(): Int = synchronizedValue { hitCount }
 
-    /**
-     * Returns the number of times [get] returned null or required a new
-     * value to be created.
-     */
+    /** Returns the number of times [get] returned null or required a new value to be created. */
     fun missCount(): Int = synchronizedValue { missCount }
 
-    /**
-     * Returns the number of times [create] returned a value.
-     */
+    /** Returns the number of times [create] returned a value. */
     fun createCount(): Int = synchronizedValue { createCount }
 
-    /**
-     * Returns the number of times [put] was called.
-     */
+    /** Returns the number of times [put] was called. */
     fun putCount(): Int = synchronizedValue { putCount }
 
-    /**
-     * Returns the number of values that have been evicted.
-     */
+    /** Returns the number of values that have been evicted. */
     fun evictionCount(): Int = synchronizedValue { evictionCount }
 
     /**
-     * Returns a copy of the current contents of the cache, ordered from least
-     * recently accessed to most recently accessed.
+     * Returns a copy of the current contents of the cache, ordered from least recently accessed to
+     * most recently accessed.
      */
     fun snapshot(): Map<K, V> {
         synchronized(monitor) {
diff --git a/compose/ui/ui-text/src/commonMain/kotlin/androidx/compose/ui/text/caches/SimpleArrayMap.kt b/compose/ui/ui-text/src/commonMain/kotlin/androidx/compose/ui/text/caches/SimpleArrayMap.kt
index 4097272..91cda70 100644
--- a/compose/ui/ui-text/src/commonMain/kotlin/androidx/compose/ui/text/caches/SimpleArrayMap.kt
+++ b/compose/ui/ui-text/src/commonMain/kotlin/androidx/compose/ui/text/caches/SimpleArrayMap.kt
@@ -23,23 +23,21 @@
  * Attempt to spot concurrent modifications to this data structure.
  *
  * It's best-effort, but any time we can throw something more diagnostic than an
- * ArrayIndexOutOfBoundsException deep in the ArrayMap internals it's going to
- * save a lot of development time.
+ * ArrayIndexOutOfBoundsException deep in the ArrayMap internals it's going to save a lot of
+ * development time.
  *
- * Good times to look for CME include after any array allocations/copyOf calls
- * and at the end of functions that change size (put/remove/clear).
+ * Good times to look for CME include after any array allocations/copyOf calls and at the end of
+ * functions that change size (put/remove/clear).
  */
 private const val CONCURRENT_MODIFICATION_EXCEPTIONS = true
 
 /**
- * The minimum amount by which the capacity of a ArrayMap will increase.
- * This is tuned to be relatively space-efficient.
+ * The minimum amount by which the capacity of a ArrayMap will increase. This is tuned to be
+ * relatively space-efficient.
  */
 private const val BASE_SIZE = 4
 
-/**
- * Copy of SimpleArrayMap from collection2 until dependency can be added correctly
- */
+/** Copy of SimpleArrayMap from collection2 until dependency can be added correctly */
 internal class SimpleArrayMap<K, V> {
 
     private var hashes: IntArray
@@ -49,7 +47,8 @@
     // Suppression necessary, see KT-43542.
     @Suppress("INAPPLICABLE_JVM_NAME")
     @get:kotlin.jvm.JvmName("size")
-    val size: Int get() = _size
+    val size: Int
+        get() = _size
 
     protected fun indexOf(key: Any, hash: Int): Int {
         val N = _size
@@ -133,9 +132,7 @@
         return end.inv()
     }
 
-    /**
-     * Create a new ArrayMap with a given initial capacity.
-     */
+    /** Create a new ArrayMap with a given initial capacity. */
     @kotlin.jvm.JvmOverloads
     constructor(capacity: Int = 0) {
         if (capacity == 0) {
@@ -148,9 +145,7 @@
         _size = 0
     }
 
-    /**
-     * Create a new ArrayMap with the mappings from the given ArrayMap.
-     */
+    /** Create a new ArrayMap with the mappings from the given ArrayMap. */
     constructor(map: SimpleArrayMap<K, V>?) : this() {
         if (map != null) {
             putAll(map)
@@ -158,7 +153,7 @@
     }
 
     /**
-     * Make the array map empty.  All storage is released.
+     * Make the array map empty. All storage is released.
      *
      * @throws ConcurrentModificationException if the map has been concurrently modified.
      */
@@ -174,8 +169,7 @@
     }
 
     /**
-     * Ensure the array map can hold at least <var>minimumCapacity</var>
-     * items.
+     * Ensure the array map can hold at least <var>minimumCapacity</var> items.
      *
      * @throws ConcurrentModificationException if the map has been concurrently modified.
      */
@@ -231,8 +225,8 @@
     }
 
     /**
-     * Check whether a value exists in the array.  This requires a linear search
-     * through the entire array.
+     * Check whether a value exists in the array. This requires a linear search through the entire
+     * array.
      *
      * @param value The value to search for.
      * @return Returns true if the value exists, else false.
@@ -241,9 +235,9 @@
 
     /**
      * Retrieve a value from the array.
+     *
      * @param key The key of the value to retrieve.
-     * @return Returns the value associated with the given key,
-     * or null if there is no such key.
+     * @return Returns the value associated with the given key, or null if there is no such key.
      */
     @Suppress("UNCHECKED_CAST")
     operator fun get(key: K): V? {
@@ -254,10 +248,11 @@
 
     /**
      * Retrieve a value from the array, or [defaultValue] if there is no mapping for the key.
+     *
      * @param key The key of the value to retrieve.
      * @param defaultValue The default mapping of the key
-     * @return Returns the value associated with the given key,
-     * or [defaultValue] if there is no mapping for the key.
+     * @return Returns the value associated with the given key, or [defaultValue] if there is no
+     *   mapping for the key.
      */
     @Suppress("UNCHECKED_CAST")
     fun getOrDefault(key: K, defaultValue: V): V {
@@ -267,22 +262,23 @@
 
     /**
      * Return the key at the given index in the array.
+     *
      * @param index The desired index, must be between 0 and [size]-1.
      * @return Returns the key stored at the given index.
      */
-    @Suppress("UNCHECKED_CAST")
-    fun keyAt(index: Int): K = keyValues[index shl 1] as K
+    @Suppress("UNCHECKED_CAST") fun keyAt(index: Int): K = keyValues[index shl 1] as K
 
     /**
      * Return the value at the given index in the array.
+     *
      * @param index The desired index, must be between 0 and [size]-1.
      * @return Returns the value stored at the given index.
      */
-    @Suppress("UNCHECKED_CAST")
-    fun valueAt(index: Int): V = keyValues[(index shl 1) + 1] as V
+    @Suppress("UNCHECKED_CAST") fun valueAt(index: Int): V = keyValues[(index shl 1) + 1] as V
 
     /**
      * Set the value at a given index in the array.
+     *
      * @param index The desired index, must be between 0 and [size]-1.
      * @param value The new value to store at this index.
      * @return Returns the previous value at the given index.
@@ -295,18 +291,17 @@
         return old
     }
 
-    /**
-     * Return true if the array map contains no items.
-     */
+    /** Return true if the array map contains no items. */
     fun isEmpty(): Boolean = _size <= 0
 
     /**
      * Add a new value to the array map.
-     * @param key The key under which to store the value.  <b>Must not be null.</b>  If
-     * this key already exists in the array, its value will be replaced.
+     *
+     * @param key The key under which to store the value. <b>Must not be null.</b> If this key
+     *   already exists in the array, its value will be replaced.
      * @param value The value to store for the given key.
-     * @return Returns the old value that was stored for the given key, or null if there
-     * was no such key.
+     * @return Returns the old value that was stored for the given key, or null if there was no such
+     *   key.
      * @throws ConcurrentModificationException if the map has been concurrently modified.
      */
     @Suppress("UNCHECKED_CAST")
@@ -331,11 +326,12 @@
 
         index = index.inv()
         if (osize >= hashes.size) {
-            val n = when {
-                osize >= BASE_SIZE * 2 -> osize + (osize shr 1)
-                osize >= BASE_SIZE -> BASE_SIZE * 2
-                else -> BASE_SIZE
-            }
+            val n =
+                when {
+                    osize >= BASE_SIZE * 2 -> osize + (osize shr 1)
+                    osize >= BASE_SIZE -> BASE_SIZE * 2
+                    else -> BASE_SIZE
+                }
             if (DEBUG) {
                 println("$TAG put: grow from ${hashes.size} to $n")
             }
@@ -370,6 +366,7 @@
 
     /**
      * Perform a [put] of all key/value pairs in <var>array</var>
+     *
      * @param array The array whose contents are to be retrieved.
      */
     fun putAll(array: SimpleArrayMap<out K, out V>) {
@@ -391,10 +388,11 @@
     /**
      * Add a new value to the array map only if the key does not already have a value or it is
      * mapped to `null`.
+     *
      * @param key The key under which to store the value.
      * @param value The value to store for the given key.
-     * @return Returns the value that was stored for the given key, or null if there
-     * was no such key.
+     * @return Returns the value that was stored for the given key, or null if there was no such
+     *   key.
      */
     fun putIfAbsent(key: K, value: V): V? {
         var mapValue = get(key)
@@ -406,9 +404,9 @@
 
     /**
      * Remove an existing key from the array map.
+     *
      * @param key The key of the mapping to remove.
-     * @return Returns the value that was stored under the key, or null if there
-     * was no such key.
+     * @return Returns the value that was stored under the key, or null if there was no such key.
      */
     fun remove(key: K): V? {
         val index = indexOfKey(key)
@@ -417,6 +415,7 @@
 
     /**
      * Remove an existing key from the array map only if it is currently mapped to [value].
+     *
      * @param key The key of the mapping to remove.
      * @param value The value expected to be mapped to the key.
      * @return Returns true if the mapping was removed.
@@ -435,6 +434,7 @@
 
     /**
      * Remove the key/value mapping at the given index.
+     *
      * @param index The desired index, must be between 0 and [size]-1.
      * @return Returns the value that was stored at this index.
      * @throws ConcurrentModificationException if the map has been concurrently modified.
@@ -455,8 +455,7 @@
                 // Shrunk enough to reduce size of arrays.  We don't allow it to
                 // shrink smaller than (BASE_SIZE*2) to avoid flapping between
                 // that and BASE_SIZE.
-                val n =
-                    if (osize > BASE_SIZE * 2) osize + (osize shr 1) else BASE_SIZE * 2
+                val n = if (osize > BASE_SIZE * 2) osize + (osize shr 1) else BASE_SIZE * 2
                 if (DEBUG) {
                     println("$TAG remove: shrink from $hashes.size to $n")
                 }
@@ -502,6 +501,7 @@
 
     /**
      * Replace the mapping for [key] only if it is already mapped to a value.
+     *
      * @param key The key of the mapping to replace.
      * @param value The value to store for the given key.
      * @return Returns the previous mapped value or null.
@@ -534,10 +534,10 @@
     /**
      * {@inheritDoc}
      *
-     * <p>This implementation returns false if the object is not a Map or
-     * SimpleArrayMap, or if the maps have different sizes. Otherwise, for each
-     * key in this map, values of both maps are compared. If the values for any
-     * key are not equal, the method returns false, otherwise it returns true.
+     * <p>This implementation returns false if the object is not a Map or SimpleArrayMap, or if the
+     * maps have different sizes. Otherwise, for each key in this map, values of both maps are
+     * compared. If the values for any key are not equal, the method returns false, otherwise it
+     * returns true.
      */
     @Suppress("UNCHECKED_CAST")
     override fun equals(other: Any?): Boolean {
@@ -585,15 +585,11 @@
                 }
                 return true
             }
-        } catch (ignored: NullPointerException) {
-        } catch (ignored: ClassCastException) {
-        }
+        } catch (ignored: NullPointerException) {} catch (ignored: ClassCastException) {}
         return false
     }
 
-    /**
-     * {@inheritDoc}
-     */
+    /** {@inheritDoc} */
     override fun hashCode(): Int {
         val hashes = hashes
         val array: Array<Any?> = keyValues
@@ -613,9 +609,8 @@
     /**
      * {@inheritDoc}
      *
-     * <p>This implementation composes a string by iterating over its mappings. If
-     * this map contains itself as a key or a value, the string "(this Map)"
-     * will appear in its place.
+     * <p>This implementation composes a string by iterating over its mappings. If this map contains
+     * itself as a key or a value, the string "(this Map)" will appear in its place.
      */
     override fun toString(): String {
         if (isEmpty()) {
diff --git a/compose/ui/ui-text/src/commonMain/kotlin/androidx/compose/ui/text/font/DelegatingFontLoaderForDeprecatedUsage.kt b/compose/ui/ui-text/src/commonMain/kotlin/androidx/compose/ui/text/font/DelegatingFontLoaderForDeprecatedUsage.kt
index dcf7c54..f32c48d 100644
--- a/compose/ui/ui-text/src/commonMain/kotlin/androidx/compose/ui/text/font/DelegatingFontLoaderForDeprecatedUsage.kt
+++ b/compose/ui/ui-text/src/commonMain/kotlin/androidx/compose/ui/text/font/DelegatingFontLoaderForDeprecatedUsage.kt
@@ -17,8 +17,8 @@
 package androidx.compose.ui.text.font
 
 @Suppress("DEPRECATION")
-@Deprecated("This exists to bridge existing Font.ResourceLoader APIs, and should be " +
-    "removed with them",
+@Deprecated(
+    "This exists to bridge existing Font.ResourceLoader APIs, and should be " + "removed with them",
     replaceWith = ReplaceWith("createFontFamilyResolver()"),
 )
 internal expect fun createFontFamilyResolver(
diff --git a/compose/ui/ui-text/src/commonMain/kotlin/androidx/compose/ui/text/font/Font.kt b/compose/ui/ui-text/src/commonMain/kotlin/androidx/compose/ui/text/font/Font.kt
index 185e012..d50ebcc 100644
--- a/compose/ui/ui-text/src/commonMain/kotlin/androidx/compose/ui/text/font/Font.kt
+++ b/compose/ui/ui-text/src/commonMain/kotlin/androidx/compose/ui/text/font/Font.kt
@@ -28,20 +28,18 @@
 @Immutable
 interface Font {
     /**
-     * The weight of the font. The system uses this to match a font to a font request
-     * that is given in a [androidx.compose.ui.text.SpanStyle].
+     * The weight of the font. The system uses this to match a font to a font request that is given
+     * in a [androidx.compose.ui.text.SpanStyle].
      */
     val weight: FontWeight
 
     /**
-     * The style of the font, normal or italic. The system uses this to match a font to a
-     * font request that is given in a [androidx.compose.ui.text.SpanStyle].
+     * The style of the font, normal or italic. The system uses this to match a font to a font
+     * request that is given in a [androidx.compose.ui.text.SpanStyle].
      */
     val style: FontStyle
 
-    /**
-     * Interface used to load a font resource.
-     */
+    /** Interface used to load a font resource. */
     @Deprecated(
         "Replaced with FontFamily.Resolver during the introduction of async fonts, " +
             "all usages should be replaced. Custom subclasses can be converted into a " +
@@ -51,10 +49,10 @@
         /**
          * Loads resource represented by the [Font] object.
          *
-         * @throws Exception if font cannot be loaded
-         * @throws IllegalStateException if font cannot be loaded
          * @param font [Font] to be loaded
          * @return platform specific typeface
+         * @throws Exception if font cannot be loaded
+         * @throws IllegalStateException if font cannot be loaded
          */
         @Deprecated(
             "Replaced by FontFamily.Resolver, this method should not be called",
@@ -63,9 +61,7 @@
         fun load(font: Font): Any
     }
 
-    /**
-     * Loading strategy for this font.
-     */
+    /** Loading strategy for this font. */
     val loadingStrategy: FontLoadingStrategy
         get() = FontLoadingStrategy.Blocking
 
@@ -77,18 +73,16 @@
          * longer trigger text reflow and is considered "resolved."
          *
          * Each async font is given separate loading window and goes through these states:
-         *
          * ```
          * (initial) -> (loading with timeout) -> (resolved)
          * ```
-         *
          * - In the initial state, a fallback typeface is used to display text, which will reflow if
-         * the font successfully loads.
+         *   the font successfully loads.
          * - In the loading state, the font continues to use the fallback typeface and may cause one
-         * text reflow by finishing load. After a successful load it is considered resolved and will
-         * not cause another text reflow.
+         *   text reflow by finishing load. After a successful load it is considered resolved and
+         *   will not cause another text reflow.
          * - If the font fails to load by the timeout, the failure is permanent, and the font will
-         * never attempt to load again. Failure never causes text reflow.
+         *   never attempt to load again. Failure never causes text reflow.
          *
          * After a font is in resolved, it will never cause text reflow unless it is evicted from
          * the font cache and re-enters initial.
@@ -99,9 +93,7 @@
     }
 }
 
-/**
- * Interface used to load a font resource into a platform-specific typeface.
- */
+/** Interface used to load a font resource into a platform-specific typeface. */
 internal interface PlatformFontLoader {
     /**
      * Loads the resource represented by the [Font] in a blocking manner for use in the current
@@ -109,43 +101,39 @@
      *
      * This method may safely throw if a font fails to load, or return null.
      *
-     * This method will be called on a UI-critical thread, however the font has been determined
-     * to be critical to the current frame display and blocking for file system reads is
-     * permitted.
+     * This method will be called on a UI-critical thread, however the font has been determined to
+     * be critical to the current frame display and blocking for file system reads is permitted.
      *
-     * @throws Exception subclass may optionally be thrown if font cannot be loaded
      * @param font [Font] to be loaded
      * @return platform specific typeface, or null if not available
+     * @throws Exception subclass may optionally be thrown if font cannot be loaded
      */
     fun loadBlocking(font: Font): Any?
 
     /**
-     * Loads resource represented by the [Font] object in a non-blocking manner which causes
-     * text reflow when the font resolves.
+     * Loads resource represented by the [Font] object in a non-blocking manner which causes text
+     * reflow when the font resolves.
      *
      * This method may safely throw if the font cannot be loaded, or return null.
      *
      * This method will be called on a UI-critical thread and should not block the thread beyond
-     * loading local fonts from disk. Loading fonts from sources slower than the local file
-     * system such as a network access should not block the calling thread.
+     * loading local fonts from disk. Loading fonts from sources slower than the local file system
+     * such as a network access should not block the calling thread.
      *
-     * @throws Exception subclass may optionally be thrown if font cannot be loaded
      * @param font [Font] to be loaded
      * @return platform specific typeface, or null if not available
+     * @throws Exception subclass may optionally be thrown if font cannot be loaded
      */
     suspend fun awaitLoad(font: Font): Any?
 
     /**
-     * If this loader returns different results for the same [Font] than the platform default
-     * loader return a non-null object that uniquely identifies this loader for caching. This
-     * cache key will be retained in global maps, and should ensure that it does not create a
-     * memory leak.
+     * If this loader returns different results for the same [Font] than the platform default loader
+     * return a non-null object that uniquely identifies this loader for caching. This cache key
+     * will be retained in global maps, and should ensure that it does not create a memory leak.
      *
-     * Loaders that return the same results for all fonts as the platform default may return
-     * null.
+     * Loaders that return the same results for all fonts as the platform default may return null.
      *
-     * This cache key ensures that [FontFamily.Resolver] can lookup cache
-     * results per-loader.
+     * This cache key ensures that [FontFamily.Resolver] can lookup cache results per-loader.
      */
     val cacheKey: Any?
 }
@@ -156,16 +144,16 @@
  * @sample androidx.compose.ui.text.samples.CustomFontFamilySample
  *
  * @param resId The resource ID of the font file in font resources. i.e. "R.font.myfont".
- * @param weight The weight of the font. The system uses this to match a font to a font request
- * that is given in a [androidx.compose.ui.text.TextStyle].
+ * @param weight The weight of the font. The system uses this to match a font to a font request that
+ *   is given in a [androidx.compose.ui.text.TextStyle].
  * @param style The style of the font, normal or italic. The system uses this to match a font to a
- * font request that is given in a [androidx.compose.ui.text.TextStyle].
+ *   font request that is given in a [androidx.compose.ui.text.TextStyle].
  * @param loadingStrategy Load strategy for this font
- *
  * @see FontFamily
  */
 @OptIn(ExperimentalTextApi::class)
-class ResourceFont internal constructor(
+class ResourceFont
+internal constructor(
     val resId: Int,
     override val weight: FontWeight = FontWeight.Normal,
     override val style: FontStyle = FontStyle.Normal,
@@ -238,10 +226,10 @@
  * available locally.
  *
  * @param resId The resource ID of the font file in font resources. i.e. "R.font.myfont".
- * @param weight The weight of the font. The system uses this to match a font to a font request
- * that is given in a [androidx.compose.ui.text.SpanStyle].
+ * @param weight The weight of the font. The system uses this to match a font to a font request that
+ *   is given in a [androidx.compose.ui.text.SpanStyle].
  * @param style The style of the font, normal or italic. The system uses this to match a font to a
- * font request that is given in a [androidx.compose.ui.text.SpanStyle].
+ *   font request that is given in a [androidx.compose.ui.text.SpanStyle].
  *
  * Fonts made with this factory are local fonts, and will block the first frame for loading. To
  * allow async font loading use [Font(resId, weight, style, isLocal)][Font]
@@ -251,9 +239,7 @@
 // TODO(b/219783755): Remove this when safe after Compose 1.3
 @Deprecated(
     "Maintained for binary compatibility until Compose 1.3.",
-    replaceWith = ReplaceWith(
-        "Font(resId, weight, style)"
-    ),
+    replaceWith = ReplaceWith("Font(resId, weight, style)"),
     DeprecationLevel.HIDDEN
 )
 @Stable
@@ -275,12 +261,11 @@
  * [FontLoadingStrategy.Async].
  *
  * @param resId The resource ID of the font file in font resources. i.e. "R.font.myfont".
- * @param weight The weight of the font. The system uses this to match a font to a font request
- * that is given in a [androidx.compose.ui.text.SpanStyle].
+ * @param weight The weight of the font. The system uses this to match a font to a font request that
+ *   is given in a [androidx.compose.ui.text.SpanStyle].
  * @param style The style of the font, normal or italic. The system uses this to match a font to a
- * font request that is given in a [androidx.compose.ui.text.SpanStyle].
+ *   font request that is given in a [androidx.compose.ui.text.SpanStyle].
  * @param loadingStrategy Load strategy for this font, may be async for async resource fonts
- *
  * @see FontFamily
  */
 @Stable
@@ -300,8 +285,5 @@
     variationSettings: FontVariation.Settings = FontVariation.Settings(weight, style)
 ): Font = ResourceFont(resId, weight, style, variationSettings, loadingStrategy)
 
-/**
- * Create a [FontFamily] from this single [Font].
- */
-@Stable
-fun Font.toFontFamily() = FontFamily(this)
+/** Create a [FontFamily] from this single [Font]. */
+@Stable fun Font.toFontFamily() = FontFamily(this)
diff --git a/compose/ui/ui-text/src/commonMain/kotlin/androidx/compose/ui/text/font/FontFamily.kt b/compose/ui/ui-text/src/commonMain/kotlin/androidx/compose/ui/text/font/FontFamily.kt
index 13dc1ea..0a5c478 100644
--- a/compose/ui/ui-text/src/commonMain/kotlin/androidx/compose/ui/text/font/FontFamily.kt
+++ b/compose/ui/ui-text/src/commonMain/kotlin/androidx/compose/ui/text/font/FontFamily.kt
@@ -53,11 +53,9 @@
          * call to [resolve].
          *
          * This method will suspend until:
-         *
          * 1. All [FontLoadingStrategy.Async] fonts that are reachable have completed loading, or
-         * failed to load
-         * 2. All reachable fonts in the fallback chain have been loaded and inserted into the
-         * cache
+         *    failed to load
+         * 2. All reachable fonts in the fallback chain have been loaded and inserted into the cache
          *
          * After returning, all fonts with [FontLoadingStrategy.Async] and
          * [FontLoadingStrategy.OptionalLocal] will be permanently cached. In contrast to [resolve]
@@ -66,12 +64,10 @@
          *
          * All fonts with [FontLoadingStrategy.Blocking] will be cached with normal eviction rules.
          *
-         * @throws IllegalStateException if any reachable font fails to load
          * @param fontFamily the family to resolve all fonts from
+         * @throws IllegalStateException if any reachable font fails to load
          */
-        suspend fun preload(
-            fontFamily: FontFamily
-        )
+        suspend fun preload(fontFamily: FontFamily)
 
         /**
          * Resolves a typeface using any appropriate logic for the [FontFamily].
@@ -86,8 +82,8 @@
          * @param fontWeight desired font weight
          * @param fontStyle desired font style
          * @param fontSynthesis configuration for font synthesis
-         * @throws IllegalStateException if the FontFamily cannot resolve a to a typeface
          * @return platform-specific Typeface such as [android.graphics.Typeface]
+         * @throws IllegalStateException if the FontFamily cannot resolve a to a typeface
          */
         fun resolve(
             fontFamily: FontFamily? = null,
@@ -96,10 +92,9 @@
             fontSynthesis: FontSynthesis = FontSynthesis.All
         ): State<Any>
     }
+
     companion object {
-        /**
-         * The platform default font.
-         */
+        /** The platform default font. */
         val Default: SystemFontFamily = DefaultFontFamily()
 
         /**
@@ -132,8 +127,8 @@
         /**
          * Cursive, hand-written like font family.
          *
-         * If the device doesn't support this font family, the system will fallback to the
-         * default font.
+         * If the device doesn't support this font family, the system will fallback to the default
+         * font.
          *
          * @sample androidx.compose.ui.text.samples.FontFamilyCursiveSample
          *
@@ -150,27 +145,23 @@
     val canLoadSynchronously = canLoadSynchronously
 }
 
-/**
- * A base class of [FontFamily]s that is created from file sources.
- */
+/** A base class of [FontFamily]s that is created from file sources. */
 sealed class FileBasedFontFamily : FontFamily(false)
 
-/**
- * A base class of [FontFamily]s installed on the system.
- */
+/** A base class of [FontFamily]s installed on the system. */
 sealed class SystemFontFamily : FontFamily(true)
 
 /**
  * Defines a font family with list of [Font].
  *
  * @sample androidx.compose.ui.text.samples.FontFamilySansSerifSample
+ *
  * @sample androidx.compose.ui.text.samples.CustomFontFamilySample
  */
 @Immutable
-class FontListFontFamily internal constructor(
-    /**
-     * The fallback list of fonts used for resolving typefaces for this FontFamily.
-     */
+class FontListFontFamily
+internal constructor(
+    /** The fallback list of fonts used for resolving typefaces for this FontFamily. */
     val fonts: List<Font>
 ) : FileBasedFontFamily(), List<Font> by fonts {
     init {
@@ -205,16 +196,12 @@
  * @see FontFamily.Cursive
  */
 @Immutable
-class GenericFontFamily internal constructor(
-    val name: String,
-    private val fontFamilyName: String
-) : SystemFontFamily() {
+class GenericFontFamily internal constructor(val name: String, private val fontFamilyName: String) :
+    SystemFontFamily() {
     override fun toString(): String = fontFamilyName
 }
 
-/**
- * Defines a default font family.
- */
+/** Defines a default font family. */
 @Immutable
 internal class DefaultFontFamily internal constructor() : SystemFontFamily() {
     override fun toString(): String = "FontFamily.Default"
@@ -247,21 +234,18 @@
  *
  * @param fonts list of font files
  */
-@Stable
-fun FontFamily(fonts: List<Font>): FontFamily = FontListFontFamily(fonts)
+@Stable fun FontFamily(fonts: List<Font>): FontFamily = FontListFontFamily(fonts)
 
 /**
  * Construct a font family that contains list of custom font files.
  *
  * @param fonts list of font files
  */
-@Stable
-fun FontFamily(vararg fonts: Font): FontFamily = FontListFontFamily(fonts.asList())
+@Stable fun FontFamily(vararg fonts: Font): FontFamily = FontListFontFamily(fonts.asList())
 
 /**
  * Construct a font family that contains loaded font family: Typeface.
  *
  * @param typeface A typeface instance.
  */
-@Stable
-fun FontFamily(typeface: Typeface): FontFamily = LoadedFontFamily(typeface)
+@Stable fun FontFamily(typeface: Typeface): FontFamily = LoadedFontFamily(typeface)
diff --git a/compose/ui/ui-text/src/commonMain/kotlin/androidx/compose/ui/text/font/FontFamilyResolver.kt b/compose/ui/ui-text/src/commonMain/kotlin/androidx/compose/ui/text/font/FontFamilyResolver.kt
index c3d4a89..d143fae 100644
--- a/compose/ui/ui-text/src/commonMain/kotlin/androidx/compose/ui/text/font/FontFamilyResolver.kt
+++ b/compose/ui/ui-text/src/commonMain/kotlin/androidx/compose/ui/text/font/FontFamilyResolver.kt
@@ -36,23 +36,22 @@
         resolve(it.copy(fontFamily = null)).value
     }
 
-    override suspend fun preload(
-        fontFamily: FontFamily
-    ) {
+    override suspend fun preload(fontFamily: FontFamily) {
         // all other types of FontFamily are already preloaded.
         if (fontFamily !is FontListFontFamily) return
 
         fontListFontFamilyTypefaceAdapter.preload(fontFamily, platformFontLoader)
 
-        val typeRequests = fontFamily.fonts.fastMap {
-            TypefaceRequest(
-                platformResolveInterceptor.interceptFontFamily(fontFamily),
-                platformResolveInterceptor.interceptFontWeight(it.weight),
-                platformResolveInterceptor.interceptFontStyle(it.style),
-                FontSynthesis.All,
-                platformFontLoader.cacheKey
-            )
-        }
+        val typeRequests =
+            fontFamily.fonts.fastMap {
+                TypefaceRequest(
+                    platformResolveInterceptor.interceptFontFamily(fontFamily),
+                    platformResolveInterceptor.interceptFontWeight(it.weight),
+                    platformResolveInterceptor.interceptFontStyle(it.style),
+                    FontSynthesis.All,
+                    platformFontLoader.cacheKey
+                )
+            }
 
         typefaceRequestCache.preWarmCache(typeRequests) { typeRequest ->
             @Suppress("MoveLambdaOutsideParentheses")
@@ -61,12 +60,14 @@
                 platformFontLoader = platformFontLoader,
                 onAsyncCompletion = { /* nothing */ },
                 createDefaultTypeface = createDefaultTypeface
-            ) ?: platformFamilyTypefaceAdapter.resolve(
-                typefaceRequest = typeRequest,
-                platformFontLoader = platformFontLoader,
-                onAsyncCompletion = { /* nothing */ },
-                createDefaultTypeface = createDefaultTypeface
-            ) ?: throw IllegalStateException("Could not load font")
+            )
+                ?: platformFamilyTypefaceAdapter.resolve(
+                    typefaceRequest = typeRequest,
+                    platformFontLoader = platformFontLoader,
+                    onAsyncCompletion = { /* nothing */ },
+                    createDefaultTypeface = createDefaultTypeface
+                )
+                ?: throw IllegalStateException("Could not load font")
         }
     }
 
@@ -76,40 +77,43 @@
         fontStyle: FontStyle,
         fontSynthesis: FontSynthesis,
     ): State<Any> {
-        return resolve(TypefaceRequest(
-            platformResolveInterceptor.interceptFontFamily(fontFamily),
-            platformResolveInterceptor.interceptFontWeight(fontWeight),
-            platformResolveInterceptor.interceptFontStyle(fontStyle),
-            platformResolveInterceptor.interceptFontSynthesis(fontSynthesis),
-            platformFontLoader.cacheKey
-        ))
+        return resolve(
+            TypefaceRequest(
+                platformResolveInterceptor.interceptFontFamily(fontFamily),
+                platformResolveInterceptor.interceptFontWeight(fontWeight),
+                platformResolveInterceptor.interceptFontStyle(fontStyle),
+                platformResolveInterceptor.interceptFontSynthesis(fontSynthesis),
+                platformFontLoader.cacheKey
+            )
+        )
     }
 
-    /**
-     * Resolves the final [typefaceRequest] without interceptors.
-     */
+    /** Resolves the final [typefaceRequest] without interceptors. */
     private fun resolve(typefaceRequest: TypefaceRequest): State<Any> {
-        val result = typefaceRequestCache.runCached(typefaceRequest) { onAsyncCompletion ->
-            fontListFontFamilyTypefaceAdapter.resolve(
-                typefaceRequest,
-                platformFontLoader,
-                onAsyncCompletion,
-                createDefaultTypeface
-            ) ?: platformFamilyTypefaceAdapter.resolve(
-                typefaceRequest,
-                platformFontLoader,
-                onAsyncCompletion,
-                createDefaultTypeface
-            ) ?: throw IllegalStateException("Could not load font")
-        }
+        val result =
+            typefaceRequestCache.runCached(typefaceRequest) { onAsyncCompletion ->
+                fontListFontFamilyTypefaceAdapter.resolve(
+                    typefaceRequest,
+                    platformFontLoader,
+                    onAsyncCompletion,
+                    createDefaultTypeface
+                )
+                    ?: platformFamilyTypefaceAdapter.resolve(
+                        typefaceRequest,
+                        platformFontLoader,
+                        onAsyncCompletion,
+                        createDefaultTypeface
+                    )
+                    ?: throw IllegalStateException("Could not load font")
+            }
         return result
     }
 }
 
 /**
- * Platform level [FontFamily.Resolver] argument interceptor. This interface is
- * intended to bridge accessibility constraints on any platform with
- * Compose through the use of [FontFamilyResolverImpl.resolve].
+ * Platform level [FontFamily.Resolver] argument interceptor. This interface is intended to bridge
+ * accessibility constraints on any platform with Compose through the use of
+ * [FontFamilyResolverImpl.resolve].
  */
 internal interface PlatformResolveInterceptor {
 
@@ -129,6 +133,7 @@
 
 internal val GlobalTypefaceRequestCache = TypefaceRequestCache()
 internal val GlobalAsyncTypefaceCache = AsyncTypefaceCache()
+
 internal expect class PlatformFontFamilyTypefaceAdapter() : FontFamilyTypefaceAdapter {
     override fun resolve(
         typefaceRequest: TypefaceRequest,
@@ -148,11 +153,10 @@
 
 internal sealed interface TypefaceResult : State<Any> {
     val cacheable: Boolean
+
     // Immutable results present as State, but don't trigger a read observer
-    class Immutable(
-        override val value: Any,
-        override val cacheable: Boolean = true
-    ) : TypefaceResult
+    class Immutable(override val value: Any, override val cacheable: Boolean = true) :
+        TypefaceResult
 
     class Async(internal val current: AsyncFontListLoader) : TypefaceResult, State<Any> by current {
         override val cacheable: Boolean
@@ -188,24 +192,27 @@
         // multiple entries.
         //
         // Necessary font load de-duping is the responsibility of actual font resolution mechanisms.
-        val currentTypefaceResult = try {
-            resolveTypeface { finalResult ->
-                // may this after runCached returns, or immediately if the typeface is immediately
-                // available without dispatch
+        val currentTypefaceResult =
+            try {
+                resolveTypeface { finalResult ->
+                    // may this after runCached returns, or immediately if the typeface is
+                    // immediately
+                    // available without dispatch
 
-                // this converts an async (state) result to an immutable (val) result to optimize
-                // future lookups
-                synchronized(lock) {
-                    if (finalResult.cacheable) {
-                        resultCache.put(typefaceRequest, finalResult)
-                    } else {
-                        resultCache.remove(typefaceRequest)
+                    // this converts an async (state) result to an immutable (val) result to
+                    // optimize
+                    // future lookups
+                    synchronized(lock) {
+                        if (finalResult.cacheable) {
+                            resultCache.put(typefaceRequest, finalResult)
+                        } else {
+                            resultCache.remove(typefaceRequest)
+                        }
                     }
                 }
+            } catch (cause: Exception) {
+                throw IllegalStateException("Could not load font", cause)
             }
-        } catch (cause: Exception) {
-            throw IllegalStateException("Could not load font", cause)
-        }
         synchronized(lock) {
             // async result may have completed prior to this block entering, do not overwrite
             // final results
@@ -226,30 +233,26 @@
             val prior = synchronized(lock) { resultCache.get(typeRequest) }
             if (prior != null) continue
 
-            val next = try {
-                resolveTypeface(typeRequest)
-            } catch (cause: Exception) {
-                throw IllegalStateException("Could not load font", cause)
-            }
+            val next =
+                try {
+                    resolveTypeface(typeRequest)
+                } catch (cause: Exception) {
+                    throw IllegalStateException("Could not load font", cause)
+                }
 
             // only cache immutable, should not reach as FontListFontFamilyTypefaceAdapter already
             // has async fonts in permanent cache
             if (next is TypefaceResult.Async) continue
 
-            synchronized(lock) {
-                resultCache.put(typeRequest, next)
-            }
+            synchronized(lock) { resultCache.put(typeRequest, next) }
         }
     }
 
     // @VisibleForTesting
-    internal fun get(typefaceRequest: TypefaceRequest) = synchronized(lock) {
-        resultCache.get(typefaceRequest)
-    }
+    internal fun get(typefaceRequest: TypefaceRequest) =
+        synchronized(lock) { resultCache.get(typefaceRequest) }
 
     // @VisibleForTesting
     internal val size: Int
-        get() = synchronized(lock) {
-            resultCache.size
-        }
+        get() = synchronized(lock) { resultCache.size }
 }
diff --git a/compose/ui/ui-text/src/commonMain/kotlin/androidx/compose/ui/text/font/FontFamilyTypefaceAdapter.kt b/compose/ui/ui-text/src/commonMain/kotlin/androidx/compose/ui/text/font/FontFamilyTypefaceAdapter.kt
index f571f33..bdf1c8ed 100644
--- a/compose/ui/ui-text/src/commonMain/kotlin/androidx/compose/ui/text/font/FontFamilyTypefaceAdapter.kt
+++ b/compose/ui/ui-text/src/commonMain/kotlin/androidx/compose/ui/text/font/FontFamilyTypefaceAdapter.kt
@@ -19,7 +19,6 @@
 /**
  * Used by [FontFamilyResolverImpl] to dispatch requests for either [FontListFontFamily] resolution
  * or delegate all other [FontFamily] requests to [PlatformFontFamilyTypefaceAdapter].
- *
  * - [FontListFontFamily] will be resolved by [FontListFontFamilyTypefaceAdapter]
  * - All other [FontFamily] will be resolved by [PlatformFontFamilyTypefaceAdapter]
  */
@@ -40,8 +39,8 @@
      * @param typefaceRequest unique description of this typeface request
      * @param platformFontLoader font loader used for loading typefaces from [Font] descriptors
      * @param onAsyncCompletion will be called (on an arbitrary thread) when
-     * [FontLoadingStrategy.Async] fonts reach their final resolved state, may be called prior to
-     * resolve returning
+     *   [FontLoadingStrategy.Async] fonts reach their final resolved state, may be called prior to
+     *   resolve returning
      * @return result of typeface lookup.
      */
     fun resolve(
diff --git a/compose/ui/ui-text/src/commonMain/kotlin/androidx/compose/ui/text/font/FontListFontFamilyTypefaceAdapter.kt b/compose/ui/ui-text/src/commonMain/kotlin/androidx/compose/ui/text/font/FontListFontFamilyTypefaceAdapter.kt
index 2c0d092f..7fd0965 100644
--- a/compose/ui/ui-text/src/commonMain/kotlin/androidx/compose/ui/text/font/FontListFontFamilyTypefaceAdapter.kt
+++ b/compose/ui/ui-text/src/commonMain/kotlin/androidx/compose/ui/text/font/FontListFontFamilyTypefaceAdapter.kt
@@ -52,48 +52,49 @@
     injectedContext: CoroutineContext = EmptyCoroutineContext
 ) : FontFamilyTypefaceAdapter {
 
-    private var asyncLoadScope: CoroutineScope = CoroutineScope(
-        // order is important, we prefer our handler but allow injected to overwrite
-        DropExceptionHandler /* default */ +
-            FontCacheManagementDispatcher /* default */ +
-            injectedContext /* from caller */ +
-            SupervisorJob(injectedContext[Job]) /* forced */
-    )
+    private var asyncLoadScope: CoroutineScope =
+        CoroutineScope(
+            // order is important, we prefer our handler but allow injected to overwrite
+            DropExceptionHandler /* default */ +
+                FontCacheManagementDispatcher /* default */ +
+                injectedContext /* from caller */ +
+                SupervisorJob(injectedContext[Job]) /* forced */
+        )
 
-    suspend fun preload(
-        family: FontFamily,
-        resourceLoader: PlatformFontLoader
-    ) {
+    suspend fun preload(family: FontFamily, resourceLoader: PlatformFontLoader) {
         if (family !is FontListFontFamily) return
 
         val allFonts = family.fonts
         // only preload styles that can be satisfied by async fonts
-        val asyncStyles = family.fonts
-            .fastFilter { it.loadingStrategy == FontLoadingStrategy.Async }
-            .fastMap { it.weight to it.style }
-            .fastDistinctBy { it }
+        val asyncStyles =
+            family.fonts
+                .fastFilter { it.loadingStrategy == FontLoadingStrategy.Async }
+                .fastMap { it.weight to it.style }
+                .fastDistinctBy { it }
 
         val asyncLoads: MutableList<Font> = mutableListOf()
 
         asyncStyles.fastForEach { (fontWeight, fontStyle) ->
             val matched = fontMatcher.matchFont(allFonts, fontWeight, fontStyle)
-            val typeRequest = TypefaceRequest(
-                family,
-                fontWeight,
-                fontStyle,
-                FontSynthesis.All,
-                resourceLoader.cacheKey
-            )
+            val typeRequest =
+                TypefaceRequest(
+                    family,
+                    fontWeight,
+                    fontStyle,
+                    FontSynthesis.All,
+                    resourceLoader.cacheKey
+                )
             // this may be satisfied by non-async font still, which is OK as they'll be cached for
             // immediate lookup by caller
             //
             // only do the permanent cache for results provided via async fonts
-            val (asyncFontsToLoad, _) = matched.firstImmediatelyAvailable(
-                typeRequest,
-                asyncTypefaceCache,
-                resourceLoader,
-                createDefaultTypeface = { } // unused, no fallback necessary
-            )
+            val (asyncFontsToLoad, _) =
+                matched.firstImmediatelyAvailable(
+                    typeRequest,
+                    asyncTypefaceCache,
+                    resourceLoader,
+                    createDefaultTypeface = {} // unused, no fallback necessary
+                )
             if (asyncFontsToLoad != null) {
                 asyncLoads.add(asyncFontsToLoad.first())
             }
@@ -114,7 +115,8 @@
                             } ?: throw IllegalStateException("Unable to load font $font")
                         }
                     }
-                }.joinAll()
+                }
+                .joinAll()
         }
     }
 
@@ -125,26 +127,29 @@
         createDefaultTypeface: (TypefaceRequest) -> Any
     ): TypefaceResult? {
         if (typefaceRequest.fontFamily !is FontListFontFamily) return null
-        val matched = fontMatcher.matchFont(
-            typefaceRequest.fontFamily.fonts,
-            typefaceRequest.fontWeight,
-            typefaceRequest.fontStyle
-        )
-        val (asyncFontsToLoad, synthesizedTypeface) = matched.firstImmediatelyAvailable(
-            typefaceRequest,
-            asyncTypefaceCache,
-            platformFontLoader,
-            createDefaultTypeface
-        )
+        val matched =
+            fontMatcher.matchFont(
+                typefaceRequest.fontFamily.fonts,
+                typefaceRequest.fontWeight,
+                typefaceRequest.fontStyle
+            )
+        val (asyncFontsToLoad, synthesizedTypeface) =
+            matched.firstImmediatelyAvailable(
+                typefaceRequest,
+                asyncTypefaceCache,
+                platformFontLoader,
+                createDefaultTypeface
+            )
         if (asyncFontsToLoad == null) return TypefaceResult.Immutable(synthesizedTypeface)
-        val asyncLoader = AsyncFontListLoader(
-            fontList = asyncFontsToLoad,
-            initialType = synthesizedTypeface,
-            typefaceRequest = typefaceRequest,
-            asyncTypefaceCache = asyncTypefaceCache,
-            onCompletion = onAsyncCompletion,
-            platformFontLoader = platformFontLoader
-        )
+        val asyncLoader =
+            AsyncFontListLoader(
+                fontList = asyncFontsToLoad,
+                initialType = synthesizedTypeface,
+                typefaceRequest = typefaceRequest,
+                asyncTypefaceCache = asyncTypefaceCache,
+                onCompletion = onAsyncCompletion,
+                platformFontLoader = platformFontLoader
+            )
 
         // Always launch on whatever scope was set prior to this call, and continue until the load
         // completes.
@@ -186,13 +191,14 @@
         val font = get(idx)
         when (font.loadingStrategy) {
             FontLoadingStrategy.Blocking -> {
-                val result: Any = asyncTypefaceCache.runCachedBlocking(font, platformFontLoader) {
-                    try {
-                        platformFontLoader.loadBlocking(font)
-                    } catch (cause: Exception) {
-                        throw IllegalStateException("Unable to load font $font", cause)
-                    }
-                } ?: throw IllegalStateException("Unable to load font $font")
+                val result: Any =
+                    asyncTypefaceCache.runCachedBlocking(font, platformFontLoader) {
+                        try {
+                            platformFontLoader.loadBlocking(font)
+                        } catch (cause: Exception) {
+                            throw IllegalStateException("Unable to load font $font", cause)
+                        }
+                    } ?: throw IllegalStateException("Unable to load font $font")
                 return asyncFontsToLoad to
                     typefaceRequest.fontSynthesis.synthesizeTypeface(
                         result,
@@ -202,10 +208,11 @@
                     )
             }
             FontLoadingStrategy.OptionalLocal -> {
-                val result = asyncTypefaceCache.runCachedBlocking(font, platformFontLoader) {
-                    // optional fonts should not throw, but consider it a failed load if they do
-                    kotlin.runCatching { platformFontLoader.loadBlocking(font) }.getOrNull()
-                }
+                val result =
+                    asyncTypefaceCache.runCachedBlocking(font, platformFontLoader) {
+                        // optional fonts should not throw, but consider it a failed load if they do
+                        kotlin.runCatching { platformFontLoader.loadBlocking(font) }.getOrNull()
+                    }
                 if (result != null) {
                     return asyncFontsToLoad to
                         typefaceRequest.fontSynthesis.synthesizeTypeface(
@@ -245,7 +252,8 @@
     return asyncFontsToLoad to fallbackTypeface
 }
 
-internal class AsyncFontListLoader constructor(
+internal class AsyncFontListLoader
+constructor(
     private val fontList: List<Font>,
     initialType: Any,
     private val typefaceRequest: TypefaceRequest,
@@ -269,16 +277,18 @@
                 // therefore, it is not possible for an async load failure early in the chain to
                 //     require a new blocking or optional load to resolve
                 if (font.loadingStrategy == FontLoadingStrategy.Async) {
-                    val typeface = asyncTypefaceCache.runCached(font, platformFontLoader, false) {
-                        font.loadWithTimeoutOrNull()
-                    }
+                    val typeface =
+                        asyncTypefaceCache.runCached(font, platformFontLoader, false) {
+                            font.loadWithTimeoutOrNull()
+                        }
                     if (typeface != null) {
-                        value = typefaceRequest.fontSynthesis.synthesizeTypeface(
-                            typeface,
-                            font,
-                            typefaceRequest.fontWeight,
-                            typefaceRequest.fontStyle
-                        )
+                        value =
+                            typefaceRequest.fontSynthesis.synthesizeTypeface(
+                                typeface,
+                                font,
+                                typefaceRequest.fontWeight,
+                                typefaceRequest.fontStyle
+                            )
                         return /* done loading on first successful typeface */
                     } else {
                         // check cancellation and yield the thread before trying the next font
@@ -368,18 +378,22 @@
         val key = Key(font, platformFontLoader.cacheKey)
         synchronized(cacheLock) {
             when {
-                result == null -> { permanentCache.put(key, PermanentFailure) }
-                forever -> { permanentCache.put(key, AsyncTypefaceResult(result)) }
-                else -> { resultCache.put(key, AsyncTypefaceResult(result)) }
+                result == null -> {
+                    permanentCache.put(key, PermanentFailure)
+                }
+                forever -> {
+                    permanentCache.put(key, AsyncTypefaceResult(result))
+                }
+                else -> {
+                    resultCache.put(key, AsyncTypefaceResult(result))
+                }
             }
         }
     }
 
     fun get(font: Font, platformFontLoader: PlatformFontLoader): AsyncTypefaceResult? {
         val key = Key(font, platformFontLoader.cacheKey)
-        return synchronized(cacheLock) {
-            resultCache.get(key) ?: permanentCache[key]
-        }
+        return synchronized(cacheLock) { resultCache.get(key) ?: permanentCache[key] }
     }
 
     suspend fun runCached(
@@ -424,8 +438,6 @@
                 return priorResult.result
             }
         }
-        return block().also {
-            put(font, platformFontLoader, it)
-        }
+        return block().also { put(font, platformFontLoader, it) }
     }
 }
diff --git a/compose/ui/ui-text/src/commonMain/kotlin/androidx/compose/ui/text/font/FontLoadingStrategy.kt b/compose/ui/ui-text/src/commonMain/kotlin/androidx/compose/ui/text/font/FontLoadingStrategy.kt
index ad4c017..aa3d44c 100644
--- a/compose/ui/ui-text/src/commonMain/kotlin/androidx/compose/ui/text/font/FontLoadingStrategy.kt
+++ b/compose/ui/ui-text/src/commonMain/kotlin/androidx/compose/ui/text/font/FontLoadingStrategy.kt
@@ -64,9 +64,9 @@
          * a remote [Async] source. It may also be followed by other [OptionalLocal] fonts or
          * [Blocking] fonts that have less specific styling to avoid async delay.
          *
-         * Apps should expect that [OptionalLocal] fonts will fail to load on devices where the
-         * font is not available.
-         **
+         * Apps should expect that [OptionalLocal] fonts will fail to load on devices where the font
+         * is not available.
+         * *
          * This should typically not be used for fonts that are fetched from a remote source such as
          * over http, as it will block all rendering until the font loads. Instead use [Async].
          */
diff --git a/compose/ui/ui-text/src/commonMain/kotlin/androidx/compose/ui/text/font/FontMatcher.kt b/compose/ui/ui-text/src/commonMain/kotlin/androidx/compose/ui/text/font/FontMatcher.kt
index bfe532b..43dbe88 100644
--- a/compose/ui/ui-text/src/commonMain/kotlin/androidx/compose/ui/text/font/FontMatcher.kt
+++ b/compose/ui/ui-text/src/commonMain/kotlin/androidx/compose/ui/text/font/FontMatcher.kt
@@ -28,10 +28,10 @@
 internal class FontMatcher {
 
     /**
-     * Given a [FontFamily], [FontWeight] and [FontStyle], matches the best font in the
-     * [FontFamily] that satisfies the requirements of [FontWeight] and [FontStyle]. If there is
-     * not a font that exactly satisfies the given constraints of [FontWeight] and [FontStyle], the
-     * best match will be returned. The rules for the best match are defined in
+     * Given a [FontFamily], [FontWeight] and [FontStyle], matches the best font in the [FontFamily]
+     * that satisfies the requirements of [FontWeight] and [FontStyle]. If there is not a font that
+     * exactly satisfies the given constraints of [FontWeight] and [FontStyle], the best match will
+     * be returned. The rules for the best match are defined in
      * [CSS 4 Font Matching](https://www.w3.org/TR/css-fonts-4/#font-style-matching).
      *
      * If no fonts match, an empty list is returned.
@@ -40,59 +40,61 @@
      * @param fontWeight desired [FontWeight]
      * @param fontStyle desired [FontStyle]
      */
-    fun matchFont(
-        fontList: List<Font>,
-        fontWeight: FontWeight,
-        fontStyle: FontStyle
-    ): List<Font> {
+    fun matchFont(fontList: List<Font>, fontWeight: FontWeight, fontStyle: FontStyle): List<Font> {
         // check for exact match first
-        fontList.fastFilter { it.weight == fontWeight && it.style == fontStyle }.let {
-            // TODO(b/130797349): IR compiler bug was here
-            if (it.isNotEmpty()) {
-                return it
+        fontList
+            .fastFilter { it.weight == fontWeight && it.style == fontStyle }
+            .let {
+                // TODO(b/130797349): IR compiler bug was here
+                if (it.isNotEmpty()) {
+                    return it
+                }
             }
-        }
 
         // if no exact match, filter with style
         val fontsToSearch = fontList.fastFilter { it.style == fontStyle }.ifEmpty { fontList }
 
-        val result = when {
-            fontWeight < FontWeight.W400 -> {
-                // If the desired weight is less than 400
-                // - weights less than or equal to the desired weight are checked in descending order
-                // - followed by weights above the desired weight in ascending order
+        val result =
+            when {
+                fontWeight < FontWeight.W400 -> {
+                    // If the desired weight is less than 400
+                    // - weights less than or equal to the desired weight are checked in descending
+                    // order
+                    // - followed by weights above the desired weight in ascending order
 
-                fontsToSearch.filterByClosestWeight(fontWeight, preferBelow = true)
-            }
-            fontWeight > FontWeight.W500 -> {
-                // If the desired weight is greater than 500
-                // - weights greater than or equal to the desired weight are checked in ascending order
-                // - followed by weights below the desired weight in descending order
-                fontsToSearch.filterByClosestWeight(fontWeight, preferBelow = false)
-            }
-            else -> {
-                // If the desired weight is inclusively between 400 and 500
-                // - weights greater than or equal to the target weight are checked in ascending order
-                // until 500 is hit and checked,
-                // - followed by weights less than the target weight in descending order,
-                // - followed by weights greater than 500
-                fontsToSearch
-                    .filterByClosestWeight(
-                        fontWeight,
-                        preferBelow = false,
-                        minSearchRange = null,
-                        maxSearchRange = FontWeight.W500
-                    )
-                    .ifEmpty {
-                        fontsToSearch.filterByClosestWeight(
+                    fontsToSearch.filterByClosestWeight(fontWeight, preferBelow = true)
+                }
+                fontWeight > FontWeight.W500 -> {
+                    // If the desired weight is greater than 500
+                    // - weights greater than or equal to the desired weight are checked in
+                    // ascending order
+                    // - followed by weights below the desired weight in descending order
+                    fontsToSearch.filterByClosestWeight(fontWeight, preferBelow = false)
+                }
+                else -> {
+                    // If the desired weight is inclusively between 400 and 500
+                    // - weights greater than or equal to the target weight are checked in ascending
+                    // order
+                    // until 500 is hit and checked,
+                    // - followed by weights less than the target weight in descending order,
+                    // - followed by weights greater than 500
+                    fontsToSearch
+                        .filterByClosestWeight(
                             fontWeight,
                             preferBelow = false,
-                            minSearchRange = FontWeight.W500,
-                            maxSearchRange = null
+                            minSearchRange = null,
+                            maxSearchRange = FontWeight.W500
                         )
-                    }
+                        .ifEmpty {
+                            fontsToSearch.filterByClosestWeight(
+                                fontWeight,
+                                preferBelow = false,
+                                minSearchRange = FontWeight.W500,
+                                maxSearchRange = null
+                            )
+                        }
+                }
             }
-        }
 
         return result
     }
@@ -110,8 +112,12 @@
         for (index in indices) {
             val font = get(index)
             val possibleWeight = font.weight
-            if (minSearchRange != null && possibleWeight < minSearchRange) { continue }
-            if (maxSearchRange != null && possibleWeight > maxSearchRange) { continue }
+            if (minSearchRange != null && possibleWeight < minSearchRange) {
+                continue
+            }
+            if (maxSearchRange != null && possibleWeight > maxSearchRange) {
+                continue
+            }
             if (possibleWeight < fontWeight) {
                 if (bestWeightBelow == null || possibleWeight > bestWeightBelow) {
                     bestWeightBelow = possibleWeight
@@ -127,25 +133,25 @@
                 break
             }
         }
-        val bestWeight = if (preferBelow) {
-            bestWeightBelow ?: bestWeightAbove
-        } else {
-            bestWeightAbove ?: bestWeightBelow
-        }
+        val bestWeight =
+            if (preferBelow) {
+                bestWeightBelow ?: bestWeightAbove
+            } else {
+                bestWeightAbove ?: bestWeightBelow
+            }
         return fastFilter { it.weight == bestWeight }
     }
 
-    /**
-     * @see matchFont
-     */
+    /** @see matchFont */
     fun matchFont(
         fontFamily: FontFamily,
         fontWeight: FontWeight,
         fontStyle: FontStyle
     ): List<Font> {
-        if (fontFamily !is FontListFontFamily) throw IllegalArgumentException(
-            "Only FontFamily instances that presents a list of Fonts can be used"
-        )
+        if (fontFamily !is FontListFontFamily)
+            throw IllegalArgumentException(
+                "Only FontFamily instances that presents a list of Fonts can be used"
+            )
 
         return matchFont(fontFamily, fontWeight, fontStyle)
     }
diff --git a/compose/ui/ui-text/src/commonMain/kotlin/androidx/compose/ui/text/font/FontStyle.kt b/compose/ui/ui-text/src/commonMain/kotlin/androidx/compose/ui/text/font/FontStyle.kt
index 2153ff2..618e45d 100644
--- a/compose/ui/ui-text/src/commonMain/kotlin/androidx/compose/ui/text/font/FontStyle.kt
+++ b/compose/ui/ui-text/src/commonMain/kotlin/androidx/compose/ui/text/font/FontStyle.kt
@@ -16,10 +16,10 @@
 package androidx.compose.ui.text.font
 
 /**
- *  Defines whether the font is [Italic] or [Normal].
+ * Defines whether the font is [Italic] or [Normal].
  *
- *  @see Font
- *  @see FontFamily
+ * @see Font
+ * @see FontFamily
  */
 @kotlin.jvm.JvmInline
 value class FontStyle
@@ -39,12 +39,10 @@
 
     companion object {
         /** Use the upright glyphs */
-        @Suppress("DEPRECATION")
-        val Normal = FontStyle(0)
+        @Suppress("DEPRECATION") val Normal = FontStyle(0)
 
         /** Use glyphs designed for slanting */
-        @Suppress("DEPRECATION")
-        val Italic = FontStyle(1)
+        @Suppress("DEPRECATION") val Italic = FontStyle(1)
 
         /** Returns a list of possible values of [FontStyle]. */
         fun values(): List<FontStyle> = listOf(Normal, Italic)
diff --git a/compose/ui/ui-text/src/commonMain/kotlin/androidx/compose/ui/text/font/FontSynthesis.kt b/compose/ui/ui-text/src/commonMain/kotlin/androidx/compose/ui/text/font/FontSynthesis.kt
index 70cd4f7f..00e6084 100644
--- a/compose/ui/ui-text/src/commonMain/kotlin/androidx/compose/ui/text/font/FontSynthesis.kt
+++ b/compose/ui/ui-text/src/commonMain/kotlin/androidx/compose/ui/text/font/FontSynthesis.kt
@@ -16,22 +16,22 @@
 package androidx.compose.ui.text.font
 
 /**
- *  Possible options for font synthesis.
+ * Possible options for font synthesis.
  *
- *  `FontSynthesis` is used to specify whether the system should fake bold or slanted
- *  glyphs when the [FontFamily] used does not contain bold or oblique [Font]s.
+ * `FontSynthesis` is used to specify whether the system should fake bold or slanted glyphs when the
+ * [FontFamily] used does not contain bold or oblique [Font]s.
  *
- *  If the font family does not include a requested [FontWeight] or [FontStyle], the system
- *  fakes bold or slanted glyphs when the [Weight] or [Style], respectively, or both when [All]
- *  is set. If this is not desired, use [None] to disable font synthesis.
+ * If the font family does not include a requested [FontWeight] or [FontStyle], the system fakes
+ * bold or slanted glyphs when the [Weight] or [Style], respectively, or both when [All] is set. If
+ * this is not desired, use [None] to disable font synthesis.
  *
- *  It is possible to fake an increase of [FontWeight] but not a decrease. It is possible to fake
- *  a regular font slanted, but not vice versa.
+ * It is possible to fake an increase of [FontWeight] but not a decrease. It is possible to fake a
+ * regular font slanted, but not vice versa.
  *
- *  `FontSynthesis` works the same way as the
- *  [CSS font-synthesis](https://www.w3.org/TR/css-fonts-4/#font-synthesis) property.
+ * `FontSynthesis` works the same way as the
+ * [CSS font-synthesis](https://www.w3.org/TR/css-fonts-4/#font-synthesis) property.
  *
- *  @sample androidx.compose.ui.text.samples.FontFamilySynthesisSample
+ * @sample androidx.compose.ui.text.samples.FontFamilySynthesisSample
  */
 @kotlin.jvm.JvmInline
 value class FontSynthesis internal constructor(internal val value: Int) {
@@ -60,14 +60,14 @@
         val All = FontSynthesis(1)
 
         /**
-         * Only a bold font is synthesized, if it is not available in the [FontFamily]. Slanted fonts
-         * will not be synthesized.
+         * Only a bold font is synthesized, if it is not available in the [FontFamily]. Slanted
+         * fonts will not be synthesized.
          */
         val Weight = FontSynthesis(2)
 
         /**
-         * Only an slanted font is synthesized, if it is not available in the [FontFamily]. Bold fonts
-         * will not be synthesized.
+         * Only an slanted font is synthesized, if it is not available in the [FontFamily]. Bold
+         * fonts will not be synthesized.
          */
         val Style = FontSynthesis(3)
     }
diff --git a/compose/ui/ui-text/src/commonMain/kotlin/androidx/compose/ui/text/font/FontVariation.kt b/compose/ui/ui-text/src/commonMain/kotlin/androidx/compose/ui/text/font/FontVariation.kt
index bc4f389..53dcf8b 100644
--- a/compose/ui/ui-text/src/commonMain/kotlin/androidx/compose/ui/text/font/FontVariation.kt
+++ b/compose/ui/ui-text/src/commonMain/kotlin/androidx/compose/ui/text/font/FontVariation.kt
@@ -35,9 +35,7 @@
      */
     @Immutable
     class Settings(vararg settings: Setting) {
-        /**
-         * All settings, unique by [FontVariation.Setting.axisName]
-         */
+        /** All settings, unique by [FontVariation.Setting.axisName] */
         val settings: List<Setting>
 
         /**
@@ -48,14 +46,17 @@
         internal val needsDensity: Boolean
 
         init {
-            this.settings = ArrayList(settings
-                .groupBy { it.axisName }
-                .flatMap { (key, value) ->
-                    require(value.size == 1) {
-                        "'$key' must be unique. Actual [ [${value.joinToString()}]"
-                    }
-                    value
-                })
+            this.settings =
+                ArrayList(
+                    settings
+                        .groupBy { it.axisName }
+                        .flatMap { (key, value) ->
+                            require(value.size == 1) {
+                                "'$key' must be unique. Actual [ [${value.joinToString()}]"
+                            }
+                            value
+                        }
+                )
 
             needsDensity = this.settings.fastAny { it.needsDensity }
         }
@@ -74,9 +75,7 @@
         }
     }
 
-    /**
-     * Represents a single point in a variation, such as 0.7 or 100
-     */
+    /** Represents a single point in a variation, such as 0.7 or 100 */
     @Immutable
     sealed interface Setting {
         /**
@@ -95,18 +94,14 @@
          */
         val needsDensity: Boolean
 
-        /**
-         * The font variation axis, such as 'wdth' or 'ital'
-         */
+        /** The font variation axis, such as 'wdth' or 'ital' */
         val axisName: String
     }
 
     @Immutable
-    private class SettingFloat(
-        override val axisName: String,
-        val value: Float
-    ) : Setting {
+    private class SettingFloat(override val axisName: String, val value: Float) : Setting {
         override fun toVariationValue(density: Density?): Float = value
+
         override val needsDensity: Boolean = false
 
         override fun equals(other: Any?): Boolean {
@@ -131,10 +126,7 @@
     }
 
     @Immutable
-    private class SettingTextUnit(
-        override val axisName: String,
-        val value: TextUnit
-    ) : Setting {
+    private class SettingTextUnit(override val axisName: String, val value: TextUnit) : Setting {
         override fun toVariationValue(density: Density?): Float {
             // we don't care about pixel density as 12sp is the same "visual" size on all devices
             // instead we only care about font scaling, which changes visual size
@@ -166,11 +158,9 @@
     }
 
     @Immutable
-    private class SettingInt(
-        override val axisName: String,
-        val value: Int
-    ) : Setting {
+    private class SettingInt(override val axisName: String, val value: Int) : Setting {
         override fun toVariationValue(density: Density?): Float = value.toFloat()
+
         override val needsDensity: Boolean = false
 
         override fun equals(other: Any?): Boolean {
@@ -206,7 +196,6 @@
      *
      * If you had a setting `fzzt` that set a variation setting called fizzable between 1 and 11,
      * define a function like this:
-     *
      * ```
      * fun FontVariation.fizzable(fiz: Int): FontVariation.Setting {
      *    require(fiz in 1..11) { "'fzzt' must be in 1..11" }
@@ -217,9 +206,7 @@
      * @param value value for axis, not validated and directly passed to font
      */
     fun Setting(name: String, value: Float): Setting {
-        require(name.length == 4) {
-            "Name must be exactly four characters. Actual: '$name'"
-        }
+        require(name.length == 4) { "Name must be exactly four characters. Actual: '$name'" }
         return SettingFloat(name, value)
     }
 
@@ -239,9 +226,7 @@
      * @param value [0.0f, 1.0f]
      */
     fun italic(value: Float): Setting {
-        require(value in 0.0f..1.0f) {
-            "'ital' must be in 0.0f..1.0f. Actual: $value"
-        }
+        require(value in 0.0f..1.0f) { "'ital' must be in 0.0f..1.0f. Actual: $value" }
         return SettingFloat("ital", value)
     }
 
@@ -263,9 +248,7 @@
      * @param textSize font-size at the expected display, must be in sp
      */
     fun opticalSizing(textSize: TextUnit): Setting {
-        require(textSize.isSp) {
-            "'opsz' must be provided in sp units"
-        }
+        require(textSize.isSp) { "'opsz' must be provided in sp units" }
         return SettingTextUnit("opsz", textSize)
     }
 
@@ -280,9 +263,7 @@
      * @param value -90f to 90f, represents an angle
      */
     fun slant(value: Float): Setting {
-        require(value in -90f..90f) {
-            "'slnt' must be in -90f..90f. Actual: $value"
-        }
+        require(value in -90f..90f) { "'slnt' must be in -90f..90f. Actual: $value" }
         return SettingFloat("slnt", value)
     }
 
@@ -298,9 +279,7 @@
      * @param value > 0.0f represents the width
      */
     fun width(value: Float): Setting {
-        require(value > 0.0f) {
-            "'wdth' must be strictly > 0.0f. Actual: $value"
-        }
+        require(value > 0.0f) { "'wdth' must be strictly > 0.0f. Actual: $value" }
         return SettingFloat("wdth", value)
     }
 
@@ -311,8 +290,8 @@
      * reflow see [grade]
      *
      * Adjust the style from lighter to bolder in typographic color, by varying stroke weights,
-     * spacing and kerning, and other aspects of the type. This typically changes overall width,
-     * and so may be used in conjunction with Width and Grade axes.
+     * spacing and kerning, and other aspects of the type. This typically changes overall width, and
+     * so may be used in conjunction with Width and Grade axes.
      *
      * This is equivalent to [FontWeight], and platforms _may_ support automatically setting 'wghts'
      * from [FontWeight] during font load.
@@ -325,9 +304,7 @@
      * @param value weight, in 1..1000
      */
     fun weight(value: Int): Setting {
-        require(value in 1..1000) {
-            "'wght' value must be in [1, 1000]. Actual: $value"
-        }
+        require(value in 1..1000) { "'wght' value must be in [1, 1000]. Actual: $value" }
         return SettingInt("wght", value)
     }
 
@@ -347,9 +324,7 @@
      * @param value grade, in -1000..1000
      */
     fun grade(value: Int): Setting {
-        require(value in -1000..1000) {
-            "'GRAD' must be in -1000..1000"
-        }
+        require(value in -1000..1000) { "'GRAD' must be in -1000..1000" }
         return SettingInt("GRAD", value)
     }
 
@@ -359,14 +334,10 @@
      * @param weight to set 'wght' with [weight]\([FontWeight.weight])
      * @param style to set 'ital' with [italic]\([FontStyle.value])
      * @param settings other settings to apply, must not contain 'wght' or 'ital'
-     * @return settings that configure [FontWeight] and [FontStyle] on a font that supports
-     * 'wght' and 'ital'
+     * @return settings that configure [FontWeight] and [FontStyle] on a font that supports 'wght'
+     *   and 'ital'
      */
-    fun Settings(
-        weight: FontWeight,
-        style: FontStyle,
-        vararg settings: Setting
-    ): Settings {
+    fun Settings(weight: FontWeight, style: FontStyle, vararg settings: Setting): Settings {
         return Settings(weight(weight.weight), italic(style.value.toFloat()), *settings)
     }
 }
diff --git a/compose/ui/ui-text/src/commonMain/kotlin/androidx/compose/ui/text/font/FontWeight.kt b/compose/ui/ui-text/src/commonMain/kotlin/androidx/compose/ui/text/font/FontWeight.kt
index e4507c3..20795b3 100644
--- a/compose/ui/ui-text/src/commonMain/kotlin/androidx/compose/ui/text/font/FontWeight.kt
+++ b/compose/ui/ui-text/src/commonMain/kotlin/androidx/compose/ui/text/font/FontWeight.kt
@@ -23,7 +23,6 @@
  * The thickness of the glyphs, in a range of [1, 1000].
  *
  * @param weight Font weight value in the range of [1, 1000]
- *
  * @see Font
  * @see FontFamily
  */
@@ -32,75 +31,46 @@
 
     companion object {
         /** [Thin] */
-        @Stable
-        val W100 = FontWeight(100)
+        @Stable val W100 = FontWeight(100)
         /** [ExtraLight] */
-        @Stable
-        val W200 = FontWeight(200)
+        @Stable val W200 = FontWeight(200)
         /** [Light] */
-        @Stable
-        val W300 = FontWeight(300)
+        @Stable val W300 = FontWeight(300)
         /** [Normal] / regular / plain */
-        @Stable
-        val W400 = FontWeight(400)
+        @Stable val W400 = FontWeight(400)
         /** [Medium] */
-        @Stable
-        val W500 = FontWeight(500)
+        @Stable val W500 = FontWeight(500)
         /** [SemiBold] */
-        @Stable
-        val W600 = FontWeight(600)
+        @Stable val W600 = FontWeight(600)
         /** [Bold] */
-        @Stable
-        val W700 = FontWeight(700)
+        @Stable val W700 = FontWeight(700)
         /** [ExtraBold] */
-        @Stable
-        val W800 = FontWeight(800)
+        @Stable val W800 = FontWeight(800)
         /** [Black] */
-        @Stable
-        val W900 = FontWeight(900)
+        @Stable val W900 = FontWeight(900)
 
         /** Alias for [W100] */
-        @Stable
-        val Thin = W100
+        @Stable val Thin = W100
         /** Alias for [W200] */
-        @Stable
-        val ExtraLight = W200
+        @Stable val ExtraLight = W200
         /** Alias for [W300] */
-        @Stable
-        val Light = W300
+        @Stable val Light = W300
         /** The default font weight - alias for [W400] */
-        @Stable
-        val Normal = W400
+        @Stable val Normal = W400
         /** Alias for [W500] */
-        @Stable
-        val Medium = W500
+        @Stable val Medium = W500
         /** Alias for [W600] */
-        @Stable
-        val SemiBold = W600
-        /**
-         * A commonly used font weight that is heavier than normal - alias for [W700]
-         */
-        @Stable
-        val Bold = W700
+        @Stable val SemiBold = W600
+        /** A commonly used font weight that is heavier than normal - alias for [W700] */
+        @Stable val Bold = W700
         /** Alias for [W800] */
-        @Stable
-        val ExtraBold = W800
+        @Stable val ExtraBold = W800
         /** Alias for [W900] */
-        @Stable
-        val Black = W900
+        @Stable val Black = W900
 
         /** A list of all the font weights. */
-        internal val values: List<FontWeight> = listOf(
-            W100,
-            W200,
-            W300,
-            W400,
-            W500,
-            W600,
-            W700,
-            W800,
-            W900
-        )
+        internal val values: List<FontWeight> =
+            listOf(W100, W200, W300, W400, W500, W600, W700, W800, W900)
     }
 
     init {
@@ -132,17 +102,15 @@
 /**
  * Linearly interpolate between two font weights.
  *
- * The [fraction] argument represents position on the timeline, with 0.0 meaning
- * that the interpolation has not started, returning [start] (or something
- * equivalent to [start]), 1.0 meaning that the interpolation has finished,
- * returning [stop] (or something equivalent to [stop]), and values in between
- * meaning that the interpolation is at the relevant point on the timeline
- * between [start] and [stop]. The interpolation can be extrapolated beyond 0.0 and
- * 1.0, so negative values and values greater than 1.0 are valid (and can
- * easily be generated by curves).
+ * The [fraction] argument represents position on the timeline, with 0.0 meaning that the
+ * interpolation has not started, returning [start] (or something equivalent to [start]), 1.0
+ * meaning that the interpolation has finished, returning [stop] (or something equivalent to
+ * [stop]), and values in between meaning that the interpolation is at the relevant point on the
+ * timeline between [start] and [stop]. The interpolation can be extrapolated beyond 0.0 and 1.0, so
+ * negative values and values greater than 1.0 are valid (and can easily be generated by curves).
  *
- * Values for [fraction] are usually obtained from an [Animation<Float>], such as
- * an `AnimationController`.
+ * Values for [fraction] are usually obtained from an [Animation<Float>], such as an
+ * `AnimationController`.
  */
 fun lerp(start: FontWeight, stop: FontWeight, fraction: Float): FontWeight {
     val weight = lerp(start.weight, stop.weight, fraction).coerceIn(1, 1000)
diff --git a/compose/ui/ui-text/src/commonMain/kotlin/androidx/compose/ui/text/font/Typeface.kt b/compose/ui/ui-text/src/commonMain/kotlin/androidx/compose/ui/text/font/Typeface.kt
index c742ed9..a972110 100644
--- a/compose/ui/ui-text/src/commonMain/kotlin/androidx/compose/ui/text/font/Typeface.kt
+++ b/compose/ui/ui-text/src/commonMain/kotlin/androidx/compose/ui/text/font/Typeface.kt
@@ -16,16 +16,13 @@
 
 package androidx.compose.ui.text.font
 
-/**
- * A class that can be used for changing the font used in text.
- */
+/** A class that can be used for changing the font used in text. */
 interface Typeface {
 
     // TODO Unused, not tested public function
     /**
-     * The font family used for creating this Typeface. If a platform Typeface was used, will
-     * return null.
-     *
+     * The font family used for creating this Typeface. If a platform Typeface was used, will return
+     * null.
      */
     val fontFamily: FontFamily?
 }
diff --git a/compose/ui/ui-text/src/commonMain/kotlin/androidx/compose/ui/text/input/EditCommand.kt b/compose/ui/ui-text/src/commonMain/kotlin/androidx/compose/ui/text/input/EditCommand.kt
index febf0e4..0034692 100644
--- a/compose/ui/ui-text/src/commonMain/kotlin/androidx/compose/ui/text/input/EditCommand.kt
+++ b/compose/ui/ui-text/src/commonMain/kotlin/androidx/compose/ui/text/input/EditCommand.kt
@@ -21,43 +21,37 @@
 import androidx.compose.ui.text.findPrecedingBreak
 
 /**
- * [EditCommand] is a command representation for the platform IME API function calls. The
- * commands from the IME as function calls are translated into command pattern and used by
+ * [EditCommand] is a command representation for the platform IME API function calls. The commands
+ * from the IME as function calls are translated into command pattern and used by
  * [TextInputService.startInput]. For example, as a result of commit text function call by IME
  * [CommitTextCommand] is created.
  */
 interface EditCommand {
-    /**
-     * Apply the command on the editing buffer.
-     */
+    /** Apply the command on the editing buffer. */
     fun applyTo(buffer: EditingBuffer)
 }
 
 /**
  * Commit final [text] to the text box and set the new cursor position.
  *
- * See [`commitText`](https://developer.android.com/reference/android/view/inputmethod/InputConnection.html#commitText(java.lang.CharSequence,%20int)).
+ * See
+ * [`commitText`](https://developer.android.com/reference/android/view/inputmethod/InputConnection.html#commitText(java.lang.CharSequence,%20int)).
  *
  * @param annotatedString The text to commit.
  * @param newCursorPosition The cursor position after inserted text.
  */
-class CommitTextCommand(
-    val annotatedString: AnnotatedString,
-    val newCursorPosition: Int
-) : EditCommand {
+class CommitTextCommand(val annotatedString: AnnotatedString, val newCursorPosition: Int) :
+    EditCommand {
 
     constructor(
-        /**
-         * The text to commit. We ignore any styles in the original API.
-         */
+        /** The text to commit. We ignore any styles in the original API. */
         text: String,
-        /**
-         * The cursor position after setting composing text.
-         */
+        /** The cursor position after setting composing text. */
         newCursorPosition: Int
     ) : this(AnnotatedString(text), newCursorPosition)
 
-    val text: String get() = annotatedString.text
+    val text: String
+        get() = annotatedString.text
 
     override fun applyTo(buffer: EditingBuffer) {
         // API description says replace ongoing composition text if there. Then, if there is no
@@ -74,11 +68,12 @@
         val newCursor = buffer.cursor
 
         // See above API description for the meaning of newCursorPosition.
-        val newCursorInBuffer = if (newCursorPosition > 0) {
-            newCursor + newCursorPosition - 1
-        } else {
-            newCursor + newCursorPosition - text.length
-        }
+        val newCursorInBuffer =
+            if (newCursorPosition > 0) {
+                newCursor + newCursorPosition - 1
+            } else {
+                newCursor + newCursorPosition - text.length
+            }
 
         buffer.cursor = newCursorInBuffer.coerceIn(0, buffer.length)
     }
@@ -107,15 +102,13 @@
 /**
  * Mark a certain region of text as composing text.
  *
- * See [`setComposingRegion`](https://developer.android.com/reference/android/view/inputmethod/InputConnection.html#setComposingRegion(int,%2520int)).
+ * See
+ * [`setComposingRegion`](https://developer.android.com/reference/android/view/inputmethod/InputConnection.html#setComposingRegion(int,%2520int)).
  *
  * @param start The inclusive start offset of the composing region.
  * @param end The exclusive end offset of the composing region
  */
-class SetComposingRegionCommand(
-    val start: Int,
-    val end: Int
-) : EditCommand {
+class SetComposingRegionCommand(val start: Int, val end: Int) : EditCommand {
 
     override fun applyTo(buffer: EditingBuffer) {
         // The API description says, different from SetComposingText, SetComposingRegion must
@@ -161,28 +154,24 @@
  * Replace the currently composing text with the given text, and set the new cursor position. Any
  * composing text set previously will be removed automatically.
  *
- * See [`setComposingText`](https://developer.android.com/reference/android/view/inputmethod/InputConnection.html#setComposingText(java.lang.CharSequence,%2520int)).
+ * See
+ * [`setComposingText`](https://developer.android.com/reference/android/view/inputmethod/InputConnection.html#setComposingText(java.lang.CharSequence,%2520int)).
  *
  * @param annotatedString The composing text.
  * @param newCursorPosition The cursor position after setting composing text.
  */
-class SetComposingTextCommand(
-    val annotatedString: AnnotatedString,
-    val newCursorPosition: Int
-) : EditCommand {
+class SetComposingTextCommand(val annotatedString: AnnotatedString, val newCursorPosition: Int) :
+    EditCommand {
 
     constructor(
-        /**
-         * The composing text.
-         */
+        /** The composing text. */
         text: String,
-        /**
-         * The cursor position after setting composing text.
-         */
+        /** The cursor position after setting composing text. */
         newCursorPosition: Int
     ) : this(AnnotatedString(text), newCursorPosition)
 
-    val text: String get() = annotatedString.text
+    val text: String
+        get() = annotatedString.text
 
     override fun applyTo(buffer: EditingBuffer) {
         if (buffer.hasComposition()) {
@@ -207,11 +196,12 @@
         val newCursor = buffer.cursor
 
         // See above API description for the meaning of newCursorPosition.
-        val newCursorInBuffer = if (newCursorPosition > 0) {
-            newCursor + newCursorPosition - 1
-        } else {
-            newCursor + newCursorPosition - text.length
-        }
+        val newCursorInBuffer =
+            if (newCursorPosition > 0) {
+                newCursor + newCursorPosition - 1
+            } else {
+                newCursor + newCursorPosition - text.length
+            }
 
         buffer.cursor = newCursorInBuffer.coerceIn(0, buffer.length)
     }
@@ -239,22 +229,22 @@
 
 /**
  * Delete [lengthBeforeCursor] characters of text before the current cursor position, and delete
- * [lengthAfterCursor] characters of text after the current cursor position, excluding the selection.
+ * [lengthAfterCursor] characters of text after the current cursor position, excluding the
+ * selection.
  *
  * Before and after refer to the order of the characters in the string, not to their visual
  * representation.
  *
- * See [`deleteSurroundingText`](https://developer.android.com/reference/android/view/inputmethod/InputConnection.html#deleteSurroundingText(int,%2520int)).
+ * See
+ * [`deleteSurroundingText`](https://developer.android.com/reference/android/view/inputmethod/InputConnection.html#deleteSurroundingText(int,%2520int)).
  *
  * @param lengthBeforeCursor The number of characters in UTF-16 before the cursor to be deleted.
- * Must be non-negative.
- * @param lengthAfterCursor The number of characters in UTF-16 after the cursor to be deleted.
- * Must be non-negative.
+ *   Must be non-negative.
+ * @param lengthAfterCursor The number of characters in UTF-16 after the cursor to be deleted. Must
+ *   be non-negative.
  */
-class DeleteSurroundingTextCommand(
-    val lengthBeforeCursor: Int,
-    val lengthAfterCursor: Int
-) : EditCommand {
+class DeleteSurroundingTextCommand(val lengthBeforeCursor: Int, val lengthAfterCursor: Int) :
+    EditCommand {
     init {
         require(lengthBeforeCursor >= 0 && lengthAfterCursor >= 0) {
             "Expected lengthBeforeCursor and lengthAfterCursor to be non-negative, were " +
@@ -299,15 +289,16 @@
 /**
  * A variant of [DeleteSurroundingTextCommand]. The difference is that
  * * The lengths are supplied in code points, not in chars.
- * * This command does nothing if there are one or more invalid surrogate pairs
- * in the requested range.
+ * * This command does nothing if there are one or more invalid surrogate pairs in the requested
+ *   range.
  *
- * See [`deleteSurroundingTextInCodePoints`](https://developer.android.com/reference/android/view/inputmethod/InputConnection.html#deleteSurroundingTextInCodePoints(int,%2520int)).
+ * See
+ * [`deleteSurroundingTextInCodePoints`](https://developer.android.com/reference/android/view/inputmethod/InputConnection.html#deleteSurroundingTextInCodePoints(int,%2520int)).
  *
  * @param lengthBeforeCursor The number of characters in Unicode code points before the cursor to be
- * deleted. Must be non-negative.
+ *   deleted. Must be non-negative.
  * @param lengthAfterCursor The number of characters in Unicode code points after the cursor to be
- * deleted. Must be non-negative.
+ *   deleted. Must be non-negative.
  */
 class DeleteSurroundingTextInCodePointsCommand(
     val lengthBeforeCursor: Int,
@@ -387,15 +378,13 @@
  * Sets the selection on the text. When [start] and [end] have the same value, it sets the cursor
  * position.
  *
- * See [`setSelection`](https://developer.android.com/reference/android/view/inputmethod/InputConnection.html#setSelection(int,%2520int)).
+ * See
+ * [`setSelection`](https://developer.android.com/reference/android/view/inputmethod/InputConnection.html#setSelection(int,%2520int)).
  *
  * @param start The inclusive start offset of the selection region.
  * @param end The exclusive end offset of the selection region.
  */
-class SetSelectionCommand(
-    val start: Int,
-    val end: Int
-) : EditCommand {
+class SetSelectionCommand(val start: Int, val end: Int) : EditCommand {
 
     override fun applyTo(buffer: EditingBuffer) {
         // Sanitize the input: reverse if reversed, clamped into valid range.
@@ -430,11 +419,12 @@
 }
 
 /**
- * Finishes the composing text that is currently active. This simply leaves the text as-is,
- * removing any special composing styling or other state that was around it. The cursor position
- * remains unchanged.
+ * Finishes the composing text that is currently active. This simply leaves the text as-is, removing
+ * any special composing styling or other state that was around it. The cursor position remains
+ * unchanged.
  *
- * See [`finishComposingText`](https://developer.android.com/reference/android/view/inputmethod/InputConnection.html#finishComposingText()).
+ * See
+ * [`finishComposingText`](https://developer.android.com/reference/android/view/inputmethod/InputConnection.html#finishComposingText()).
  */
 class FinishComposingTextCommand : EditCommand {
 
@@ -443,6 +433,7 @@
     }
 
     override fun equals(other: Any?): Boolean = other is FinishComposingTextCommand
+
     override fun hashCode(): Int = this::class.hashCode()
 
     override fun toString(): String {
@@ -453,9 +444,9 @@
 /**
  * Represents a backspace operation at the cursor position.
  *
- * If there is composition, delete the text in the composition range.
- * If there is no composition but there is selection, delete whole selected range.
- * If there is no composition and selection, perform backspace key event at the cursor position.
+ * If there is composition, delete the text in the composition range. If there is no composition but
+ * there is selection, delete whole selected range. If there is no composition and selection,
+ * perform backspace key event at the cursor position.
  */
 class BackspaceCommand : EditCommand {
 
@@ -498,9 +489,7 @@
  *
  * @param amount The amount of cursor movement. If you want to move backward, pass negative value.
  */
-class MoveCursorCommand(
-    val amount: Int
-) : EditCommand {
+class MoveCursorCommand(val amount: Int) : EditCommand {
 
     override fun applyTo(buffer: EditingBuffer) {
         if (buffer.cursor == -1) {
@@ -544,9 +533,7 @@
     }
 }
 
-/**
- * Deletes all the text in the buffer.
- */
+/** Deletes all the text in the buffer. */
 class DeleteAllCommand : EditCommand {
     override fun applyTo(buffer: EditingBuffer) {
         buffer.replace(0, buffer.length, "")
@@ -562,8 +549,8 @@
 }
 
 /**
- * Helper function that returns true when [high] is a Unicode high-surrogate code unit and [low]
- * is a Unicode low-surrogate code unit.
+ * Helper function that returns true when [high] is a Unicode high-surrogate code unit and [low] is
+ * a Unicode low-surrogate code unit.
  */
 private fun isSurrogatePair(high: Char, low: Char): Boolean =
     high.isHighSurrogate() && low.isLowSurrogate()
diff --git a/compose/ui/ui-text/src/commonMain/kotlin/androidx/compose/ui/text/input/EditProcessor.kt b/compose/ui/ui-text/src/commonMain/kotlin/androidx/compose/ui/text/input/EditProcessor.kt
index 5d0747c..133e13b 100644
--- a/compose/ui/ui-text/src/commonMain/kotlin/androidx/compose/ui/text/input/EditProcessor.kt
+++ b/compose/ui/ui-text/src/commonMain/kotlin/androidx/compose/ui/text/input/EditProcessor.kt
@@ -23,39 +23,31 @@
 import androidx.compose.ui.util.fastForEach
 
 /**
- * Helper class to apply [EditCommand]s on an internal buffer. Used by TextField Composable
- * to combine TextFieldValue lifecycle with the editing operations.
- *
+ * Helper class to apply [EditCommand]s on an internal buffer. Used by TextField Composable to
+ * combine TextFieldValue lifecycle with the editing operations.
  * * When a [TextFieldValue] is suggested by the developer, [reset] should be called.
- * * When [TextInputService] provides [EditCommand]s, they should be applied to the internal
- * buffer using [apply].
+ * * When [TextInputService] provides [EditCommand]s, they should be applied to the internal buffer
+ *   using [apply].
  */
 class EditProcessor {
 
-    /**
-     * The current state of the internal editing buffer as a [TextFieldValue].
-     */
+    /** The current state of the internal editing buffer as a [TextFieldValue]. */
     /*@VisibleForTesting*/
-    internal var mBufferState: TextFieldValue = TextFieldValue(
-        emptyAnnotatedString(),
-        TextRange.Zero,
-        null
-    )
+    internal var mBufferState: TextFieldValue =
+        TextFieldValue(emptyAnnotatedString(), TextRange.Zero, null)
         private set
 
     // The editing buffer used for applying editor commands from IME.
     /*@VisibleForTesting*/
-    internal var mBuffer: EditingBuffer = EditingBuffer(
-        text = mBufferState.annotatedString,
-        selection = mBufferState.selection
-    )
+    internal var mBuffer: EditingBuffer =
+        EditingBuffer(text = mBufferState.annotatedString, selection = mBufferState.selection)
         private set
 
     /**
      * Must be called whenever new editor model arrives.
      *
-     * This method updates the internal editing buffer with the given editor model.
-     * This method may tell the IME about the selection offset changes or extracted text changes.
+     * This method updates the internal editing buffer with the given editor model. This method may
+     * tell the IME about the selection offset changes or extracted text changes.
      */
     @Suppress("ReferencesDeprecated")
     fun reset(
@@ -67,10 +59,7 @@
         val compositionChanged = value.composition != mBuffer.composition
 
         if (mBufferState.annotatedString != value.annotatedString) {
-            mBuffer = EditingBuffer(
-                text = value.annotatedString,
-                selection = value.selection
-            )
+            mBuffer = EditingBuffer(text = value.annotatedString, selection = value.selection)
             textChanged = true
         } else if (mBufferState.selection != value.selection) {
             mBuffer.setSelection(value.selection.min, value.selection.max)
@@ -86,12 +75,13 @@
         // this is the same code as in TextInputServiceAndroid class where restartInput is decided
         // if restartInput is going to be called the composition has to be cleared otherwise it
         // results in keyboards behaving strangely.
-        val newValue = if (textChanged || (!selectionChanged && compositionChanged)) {
-            mBuffer.commitComposition()
-            value.copy(composition = null)
-        } else {
-            value
-        }
+        val newValue =
+            if (textChanged || (!selectionChanged && compositionChanged)) {
+                mBuffer.commitComposition()
+                value.copy(composition = null)
+            } else {
+                value
+            }
 
         val oldValue = mBufferState
         mBufferState = newValue
@@ -106,7 +96,6 @@
      * [TextFieldValue]
      *
      * @param editCommands [EditCommand]s to be applied to the editing buffer.
-     *
      * @return the [TextFieldValue] representation of the final buffer state.
      */
     fun apply(editCommands: List<EditCommand>): TextFieldValue {
@@ -120,24 +109,24 @@
             throw RuntimeException(generateBatchErrorMessage(editCommands, lastCommand), e)
         }
 
-        val newState = TextFieldValue(
-            annotatedString = mBuffer.toAnnotatedString(),
-            // preserve original reversed selection when creating new state.
-            // otherwise the text range may flicker to un-reversed for a frame,
-            // which can cause haptics and handles to be crossed.
-            selection = mBuffer.selection.run {
-                takeUnless { mBufferState.selection.reversed } ?: TextRange(max, min)
-            },
-            composition = mBuffer.composition
-        )
+        val newState =
+            TextFieldValue(
+                annotatedString = mBuffer.toAnnotatedString(),
+                // preserve original reversed selection when creating new state.
+                // otherwise the text range may flicker to un-reversed for a frame,
+                // which can cause haptics and handles to be crossed.
+                selection =
+                    mBuffer.selection.run {
+                        takeUnless { mBufferState.selection.reversed } ?: TextRange(max, min)
+                    },
+                composition = mBuffer.composition
+            )
 
         mBufferState = newState
         return newState
     }
 
-    /**
-     * Returns the current state of the internal editing buffer as a [TextFieldValue].
-     */
+    /** Returns the current state of the internal editing buffer as a [TextFieldValue]. */
     fun toTextFieldValue(): TextFieldValue = mBufferState
 
     private fun generateBatchErrorMessage(
@@ -161,21 +150,22 @@
      * Generate a description of the command that is suitable for logging – this should not include
      * any user-entered text, which may be sensitive.
      */
-    private fun EditCommand.toStringForLog(): String = when (this) {
-        is CommitTextCommand ->
-            "CommitTextCommand(text.length=${text.length}, newCursorPosition=$newCursorPosition)"
-        is SetComposingTextCommand ->
-            "SetComposingTextCommand(text.length=${text.length}, " +
-                "newCursorPosition=$newCursorPosition)"
-        is SetComposingRegionCommand -> toString()
-        is DeleteSurroundingTextCommand -> toString()
-        is DeleteSurroundingTextInCodePointsCommand -> toString()
-        is SetSelectionCommand -> toString()
-        is FinishComposingTextCommand -> toString()
-        is BackspaceCommand -> toString()
-        is MoveCursorCommand -> toString()
-        is DeleteAllCommand -> toString()
-        // Do not return toString() by default, since that might contain sensitive text.
-        else -> "Unknown EditCommand: " + (this::class.simpleName ?: "{anonymous EditCommand}")
-    }
+    private fun EditCommand.toStringForLog(): String =
+        when (this) {
+            is CommitTextCommand ->
+                "CommitTextCommand(text.length=${text.length}, newCursorPosition=$newCursorPosition)"
+            is SetComposingTextCommand ->
+                "SetComposingTextCommand(text.length=${text.length}, " +
+                    "newCursorPosition=$newCursorPosition)"
+            is SetComposingRegionCommand -> toString()
+            is DeleteSurroundingTextCommand -> toString()
+            is DeleteSurroundingTextInCodePointsCommand -> toString()
+            is SetSelectionCommand -> toString()
+            is FinishComposingTextCommand -> toString()
+            is BackspaceCommand -> toString()
+            is MoveCursorCommand -> toString()
+            is DeleteAllCommand -> toString()
+            // Do not return toString() by default, since that might contain sensitive text.
+            else -> "Unknown EditCommand: " + (this::class.simpleName ?: "{anonymous EditCommand}")
+        }
 }
diff --git a/compose/ui/ui-text/src/commonMain/kotlin/androidx/compose/ui/text/input/EditingBuffer.kt b/compose/ui/ui-text/src/commonMain/kotlin/androidx/compose/ui/text/input/EditingBuffer.kt
index af7438b..4e1a985 100644
--- a/compose/ui/ui-text/src/commonMain/kotlin/androidx/compose/ui/text/input/EditingBuffer.kt
+++ b/compose/ui/ui-text/src/commonMain/kotlin/androidx/compose/ui/text/input/EditingBuffer.kt
@@ -27,16 +27,13 @@
  */
 @OptIn(InternalTextApi::class)
 class EditingBuffer(
-    /**
-     * The initial text of this editing buffer
-     */
+    /** The initial text of this editing buffer */
     text: AnnotatedString,
     /**
-     * The initial selection range of this buffer.
-     * If you provide collapsed selection, it is treated as the cursor position. The cursor and
-     * selection cannot exists at the same time.
-     * The selection must points the valid index of the initialText, otherwise
-     * IndexOutOfBoundsException will be thrown.
+     * The initial selection range of this buffer. If you provide collapsed selection, it is treated
+     * as the cursor position. The cursor and selection cannot exists at the same time. The
+     * selection must points the valid index of the initialText, otherwise IndexOutOfBoundsException
+     * will be thrown.
      */
     selection: TextRange
 ) {
@@ -46,18 +43,14 @@
 
     private val gapBuffer = PartialGapBuffer(text.text)
 
-    /**
-     * The inclusive selection start offset
-     */
+    /** The inclusive selection start offset */
     internal var selectionStart = selection.min
         private set(value) {
             require(value >= 0) { "Cannot set selectionStart to a negative value: $value" }
             field = value
         }
 
-    /**
-     * The exclusive selection end offset
-     */
+    /** The exclusive selection end offset */
     internal var selectionEnd = selection.max
         private set(value) {
             require(value >= 0) { "Cannot set selectionEnd to a negative value: $value" }
@@ -80,29 +73,21 @@
     internal var compositionEnd = NOWHERE
         private set
 
-    /**
-     * Helper function that returns true if the editing buffer has composition text
-     */
+    /** Helper function that returns true if the editing buffer has composition text */
     internal fun hasComposition(): Boolean = compositionStart != NOWHERE
 
-    /**
-     * Returns the composition information as TextRange. Returns null if no
-     * composition is set.
-     */
+    /** Returns the composition information as TextRange. Returns null if no composition is set. */
     internal val composition: TextRange?
-        get() = if (hasComposition()) {
-            TextRange(compositionStart, compositionEnd)
-        } else null
+        get() =
+            if (hasComposition()) {
+                TextRange(compositionStart, compositionEnd)
+            } else null
 
-    /**
-     * Returns the selection information as TextRange
-     */
+    /** Returns the selection information as TextRange */
     internal val selection: TextRange
         get() = TextRange(selectionStart, selectionEnd)
 
-    /**
-     * Helper accessor for cursor offset
-     */
+    /** Helper accessor for cursor offset */
     /*VisibleForTesting*/
     internal var cursor: Int
         /**
@@ -119,15 +104,12 @@
          */
         set(cursor) = setSelection(cursor, cursor)
 
-    /**
-     * [] operator for the character at the index.
-     */
+    /** [] operator for the character at the index. */
     internal operator fun get(index: Int): Char = gapBuffer[index]
 
-    /**
-     * Returns the length of the buffer.
-     */
-    internal val length: Int get() = gapBuffer.length
+    /** Returns the length of the buffer. */
+    internal val length: Int
+        get() = gapBuffer.length
 
     internal constructor(
         text: String,
@@ -212,10 +194,8 @@
 
         gapBuffer.replace(start, end, "")
 
-        val newSelection = updateRangeAfterDelete(
-            TextRange(selectionStart, selectionEnd),
-            deleteRange
-        )
+        val newSelection =
+            updateRangeAfterDelete(TextRange(selectionStart, selectionEnd), deleteRange)
         selectionStart = newSelection.min
         selectionEnd = newSelection.max
 
@@ -234,11 +214,11 @@
     /**
      * Mark the specified area of the text as selected text.
      *
-     * You can set cursor by specifying the same value to `start` and `end`.
-     * The reversed range is not allowed.
+     * You can set cursor by specifying the same value to `start` and `end`. The reversed range is
+     * not allowed.
+     *
      * @param start the inclusive start offset of the selection
      * @param end the exclusive end offset of the selection
-     *
      * @throws IndexOutOfBoundsException if start or end offset is outside of current buffer.
      * @throws IllegalArgumentException if start is larger than end. (reversed range)
      */
@@ -264,15 +244,14 @@
     /**
      * Mark the specified area of the text as composition text.
      *
-     * The empty range or reversed range is not allowed.
-     * Use clearComposition in case of clearing composition.
+     * The empty range or reversed range is not allowed. Use clearComposition in case of clearing
+     * composition.
      *
      * @param start the inclusive start offset of the composition
      * @param end the exclusive end offset of the composition
-     *
      * @throws IndexOutOfBoundsException if start or end offset is ouside of current buffer
      * @throws IllegalArgumentException if start is larger than or equal to end. (reversed or
-     *                                  collapsed range)
+     *   collapsed range)
      */
     internal fun setComposition(start: Int, end: Int) {
         if (start < 0 || start > gapBuffer.length) {
@@ -293,18 +272,14 @@
         compositionEnd = end
     }
 
-    /**
-     * Removes the ongoing composition text and reset the composition range.
-     */
+    /** Removes the ongoing composition text and reset the composition range. */
     internal fun cancelComposition() {
         replace(compositionStart, compositionEnd, "")
         compositionStart = NOWHERE
         compositionEnd = NOWHERE
     }
 
-    /**
-     * Commits the ongoing composition text and reset the composition range.
-     */
+    /** Commits the ongoing composition text and reset the composition range. */
     internal fun commitComposition() {
         compositionStart = NOWHERE
         compositionEnd = NOWHERE
diff --git a/compose/ui/ui-text/src/commonMain/kotlin/androidx/compose/ui/text/input/GapBuffer.kt b/compose/ui/ui-text/src/commonMain/kotlin/androidx/compose/ui/text/input/GapBuffer.kt
index f1783ef..6b968f6 100644
--- a/compose/ui/ui-text/src/commonMain/kotlin/androidx/compose/ui/text/input/GapBuffer.kt
+++ b/compose/ui/ui-text/src/commonMain/kotlin/androidx/compose/ui/text/input/GapBuffer.kt
@@ -20,13 +20,11 @@
 import androidx.compose.ui.text.InternalTextApi
 
 /**
- * Like [toCharArray] but copies the entire source string.
- * Workaround for compiler error when giving [toCharArray] above default parameters.
+ * Like [toCharArray] but copies the entire source string. Workaround for compiler error when giving
+ * [toCharArray] above default parameters.
  */
-private fun String.toCharArray(
-    destination: CharArray,
-    destinationOffset: Int
-) = toCharArray(destination, destinationOffset, startIndex = 0, endIndex = this.length)
+private fun String.toCharArray(destination: CharArray, destinationOffset: Int) =
+    toCharArray(destination, destinationOffset, startIndex = 0, endIndex = this.length)
 
 /**
  * Copies characters from this [String] into [destination].
@@ -50,40 +48,28 @@
  * The gap buffer implementation
  *
  * @param initBuffer An initial buffer. This class takes ownership of this object, so do not modify
- *                   array after passing to this constructor
+ *   array after passing to this constructor
  * @param initGapStart An initial inclusive gap start offset of the buffer
  * @param initGapEnd An initial exclusive gap end offset of the buffer
  */
 private class GapBuffer(initBuffer: CharArray, initGapStart: Int, initGapEnd: Int) {
 
-    /**
-     * The current capacity of the buffer
-     */
+    /** The current capacity of the buffer */
     private var capacity = initBuffer.size
 
-    /**
-     * The buffer
-     */
+    /** The buffer */
     private var buffer = initBuffer
 
-    /**
-     * The inclusive start offset of the gap
-     */
+    /** The inclusive start offset of the gap */
     private var gapStart = initGapStart
 
-    /**
-     * The exclusive end offset of the gap
-     */
+    /** The exclusive end offset of the gap */
     private var gapEnd = initGapEnd
 
-    /**
-     * The length of the gap.
-     */
+    /** The length of the gap. */
     private fun gapLength(): Int = gapEnd - gapStart
 
-    /**
-     * [] operator for the character at the index.
-     */
+    /** [] operator for the character at the index. */
     operator fun get(index: Int): Char {
         if (index < gapStart) {
             return buffer[index]
@@ -92,9 +78,7 @@
         }
     }
 
-    /**
-     * Check if the gap has a requested size, and allocate new buffer if there is enough space.
-     */
+    /** Check if the gap has a requested size, and allocate new buffer if there is enough space. */
     private fun makeSureAvailableSpace(requestSize: Int) {
         if (requestSize <= gapLength()) {
             return
@@ -118,9 +102,7 @@
         gapEnd = newEnd
     }
 
-    /**
-     * Delete the given range of the text.
-     */
+    /** Delete the given range of the text. */
     private fun delete(start: Int, end: Int) {
         if (start < gapStart && end <= gapStart) {
             // The remove happens in the head buffer. Copy the tail part of the head buffer to the
@@ -200,6 +182,7 @@
 
     /**
      * Write the current text into outBuf.
+     *
      * @param builder The output string builder
      */
     fun append(builder: StringBuilder) {
@@ -221,9 +204,9 @@
  * An editing buffer that uses Gap Buffer only around the cursor location.
  *
  * Different from the original gap buffer, this gap buffer doesn't convert all given text into
- * mutable buffer. Instead, this gap buffer converts cursor around text into mutable gap buffer
- * for saving construction time and memory space. If text modification outside of the gap buffer
- * is requested, this class flush the buffer and create new String, then start new gap buffer.
+ * mutable buffer. Instead, this gap buffer converts cursor around text into mutable gap buffer for
+ * saving construction time and memory space. If text modification outside of the gap buffer is
+ * requested, this class flush the buffer and create new String, then start new gap buffer.
  *
  * @param text The initial text
  */
@@ -240,9 +223,7 @@
     private var bufStart = NOWHERE
     private var bufEnd = NOWHERE
 
-    /**
-     * The text length
-     */
+    /** The text length */
     val length: Int
         get() {
             val buffer = buffer ?: return text.length
@@ -260,9 +241,7 @@
         require(start <= end) {
             "start index must be less than or equal to end index: $start > $end"
         }
-        require(start >= 0) {
-            "start must be non-negative, but was $start"
-        }
+        require(start >= 0) { "start must be non-negative, but was $start" }
 
         val buffer = buffer
         if (buffer == null) { // First time to create gap buffer
@@ -286,11 +265,12 @@
             // Copy given text into buffer
             text.toCharArray(charArray, leftCopyCount)
 
-            this.buffer = GapBuffer(
-                charArray,
-                initGapStart = leftCopyCount + text.length,
-                initGapEnd = charArray.size - rightCopyCount
-            )
+            this.buffer =
+                GapBuffer(
+                    charArray,
+                    initGapStart = leftCopyCount + text.length,
+                    initGapEnd = charArray.size - rightCopyCount
+                )
             bufStart = start - leftCopyCount
             bufEnd = end + rightCopyCount
             return
@@ -312,9 +292,7 @@
         buffer.replace(bufferStart, bufferEnd, text)
     }
 
-    /**
-     * [] operator for the character at the index.
-     */
+    /** [] operator for the character at the index. */
     operator fun get(index: Int): Char {
         val buffer = buffer ?: return text[index]
         if (index < bufStart) {
diff --git a/compose/ui/ui-text/src/commonMain/kotlin/androidx/compose/ui/text/input/ImeAction.kt b/compose/ui/ui-text/src/commonMain/kotlin/androidx/compose/ui/text/input/ImeAction.kt
index a44f18d..845acf4 100644
--- a/compose/ui/ui-text/src/commonMain/kotlin/androidx/compose/ui/text/input/ImeAction.kt
+++ b/compose/ui/ui-text/src/commonMain/kotlin/androidx/compose/ui/text/input/ImeAction.kt
@@ -19,8 +19,8 @@
 import androidx.compose.runtime.Stable
 
 /**
- * Signals the keyboard what type of action should be displayed. It is not guaranteed that
- * the keyboard will show the requested action.
+ * Signals the keyboard what type of action should be displayed. It is not guaranteed that the
+ * keyboard will show the requested action.
  */
 @kotlin.jvm.JvmInline
 value class ImeAction private constructor(@Suppress("unused") private val value: Int) {
@@ -42,69 +42,56 @@
 
     companion object {
         /**
-         * The action is not specified. This defaults to [Default], which explicitly requests
-         * the platform and keyboard to make the decision, but [Default] will take precedence when
+         * The action is not specified. This defaults to [Default], which explicitly requests the
+         * platform and keyboard to make the decision, but [Default] will take precedence when
          * merging [ImeAction]s.
          */
-        @Stable
-        val Unspecified: ImeAction = ImeAction(-1)
+        @Stable val Unspecified: ImeAction = ImeAction(-1)
 
         /**
-         * Use the platform and keyboard defaults and let the keyboard decide the action it is
-         * going to show. The keyboards will mostly show one of [Done] or [None] actions based on
-         * the single/multi line configuration. This action will never be sent as the performed
-         * action to IME action callbacks.
+         * Use the platform and keyboard defaults and let the keyboard decide the action it is going
+         * to show. The keyboards will mostly show one of [Done] or [None] actions based on the
+         * single/multi line configuration. This action will never be sent as the performed action
+         * to IME action callbacks.
          */
-        @Stable
-        val Default: ImeAction = ImeAction(1)
+        @Stable val Default: ImeAction = ImeAction(1)
 
         /**
          * Represents that no action is expected from the keyboard. Keyboard might choose to show an
          * action which mostly will be newline, however this action will never be sent as the
          * performed action to IME action callbacks.
          */
-        @Stable
-        val None: ImeAction = ImeAction(0)
+        @Stable val None: ImeAction = ImeAction(0)
 
         /**
          * Represents that the user would like to go to the target of the text in the input i.e.
          * visiting a URL.
          */
-        @Stable
-        val Go: ImeAction = ImeAction(2)
+        @Stable val Go: ImeAction = ImeAction(2)
 
-        /**
-         * Represents that the user wants to execute a search, i.e. web search query.
-         */
-        @Stable
-        val Search: ImeAction = ImeAction(3)
+        /** Represents that the user wants to execute a search, i.e. web search query. */
+        @Stable val Search: ImeAction = ImeAction(3)
 
-        /**
-         * Represents that the user wants to send the text in the input, i.e. an SMS.
-         */
-        @Stable
-        val Send: ImeAction = ImeAction(4)
+        /** Represents that the user wants to send the text in the input, i.e. an SMS. */
+        @Stable val Send: ImeAction = ImeAction(4)
 
         /**
          * Represents that the user wants to return to the previous input i.e. going back to the
          * previous field in a form.
          */
-        @Stable
-        val Previous: ImeAction = ImeAction(5)
+        @Stable val Previous: ImeAction = ImeAction(5)
 
         /**
          * Represents that the user is done with the current input, and wants to move to the next
          * one i.e. moving to the next field in a form.
          */
-        @Stable
-        val Next: ImeAction = ImeAction(6)
+        @Stable val Next: ImeAction = ImeAction(6)
 
         /**
-         * Represents that the user is done providing input to a group of inputs. Some
-         * kind of finalization behavior should now take place i.e. the field was the last element in
-         * a group and the data input is finalized.
+         * Represents that the user is done providing input to a group of inputs. Some kind of
+         * finalization behavior should now take place i.e. the field was the last element in a
+         * group and the data input is finalized.
          */
-        @Stable
-        val Done: ImeAction = ImeAction(7)
+        @Stable val Done: ImeAction = ImeAction(7)
     }
 }
diff --git a/compose/ui/ui-text/src/commonMain/kotlin/androidx/compose/ui/text/input/ImeOptions.kt b/compose/ui/ui-text/src/commonMain/kotlin/androidx/compose/ui/text/input/ImeOptions.kt
index 9932742..dd4342c 100644
--- a/compose/ui/ui-text/src/commonMain/kotlin/androidx/compose/ui/text/input/ImeOptions.kt
+++ b/compose/ui/ui-text/src/commonMain/kotlin/androidx/compose/ui/text/input/ImeOptions.kt
@@ -20,30 +20,30 @@
 import androidx.compose.ui.text.intl.LocaleList
 
 /**
- * The IME configuration options for [TextInputService]. It is not guaranteed if IME
- * will comply with the options provided here.
+ * The IME configuration options for [TextInputService]. It is not guaranteed if IME will comply
+ * with the options provided here.
  *
- * @param singleLine informs the IME that the text field is single line and IME
- * should not show return key.
- * @param capitalization informs the IME whether to automatically capitalize characters,
- * words or sentences. Only applicable to only text based [KeyboardType]s such as
- * [KeyboardType.Text], [KeyboardType.Ascii]. It will not be applied to [KeyboardType]s such as
- * [KeyboardType.Number] or [KeyboardType.Decimal].
- * @param autoCorrect informs the IME whether to enable auto correct. Only applicable to
- * text based [KeyboardType]s such as [KeyboardType.Email], [KeyboardType.Uri]. It will not be
- * applied to [KeyboardType]s such as [KeyboardType.Number] or [KeyboardType.Decimal]. Most of IME
- * implementations ignore this value for [KeyboardType]s such as [KeyboardType.Text].
- * @param keyboardType The keyboard type to be used in this text field. Note that this input type
- * is honored by IME and shows corresponding keyboard but this is not guaranteed. For example,
- * some IME may send non-ASCII character even if you set [KeyboardType.Ascii].
- * @param imeAction The IME action. This IME action is honored by IME and may show specific icons
- * on the keyboard. For example, search icon may be shown if [ImeAction.Search] is specified.
- * When [singleLine] is false, the IME might show return key rather than the action requested here.
+ * @param singleLine informs the IME that the text field is single line and IME should not show
+ *   return key.
+ * @param capitalization informs the IME whether to automatically capitalize characters, words or
+ *   sentences. Only applicable to only text based [KeyboardType]s such as [KeyboardType.Text],
+ *   [KeyboardType.Ascii]. It will not be applied to [KeyboardType]s such as [KeyboardType.Number]
+ *   or [KeyboardType.Decimal].
+ * @param autoCorrect informs the IME whether to enable auto correct. Only applicable to text based
+ *   [KeyboardType]s such as [KeyboardType.Email], [KeyboardType.Uri]. It will not be applied to
+ *   [KeyboardType]s such as [KeyboardType.Number] or [KeyboardType.Decimal]. Most of IME
+ *   implementations ignore this value for [KeyboardType]s such as [KeyboardType.Text].
+ * @param keyboardType The keyboard type to be used in this text field. Note that this input type is
+ *   honored by IME and shows corresponding keyboard but this is not guaranteed. For example, some
+ *   IME may send non-ASCII character even if you set [KeyboardType.Ascii].
+ * @param imeAction The IME action. This IME action is honored by IME and may show specific icons on
+ *   the keyboard. For example, search icon may be shown if [ImeAction.Search] is specified. When
+ *   [singleLine] is false, the IME might show return key rather than the action requested here.
  * @param platformImeOptions defines the platform specific IME options.
  * @param hintLocales List of the languages that the user is supposed to switch to no matter what
- * input method subtype is currently used. This special "hint" can be used mainly for, but not
- * limited to, multilingual users who want IMEs to switch language based on editor's context.
- * Pass [LocaleList.Empty] to express the intention that a specific hint should not be set.
+ *   input method subtype is currently used. This special "hint" can be used mainly for, but not
+ *   limited to, multilingual users who want IMEs to switch language based on editor's context. Pass
+ *   [LocaleList.Empty] to express the intention that a specific hint should not be set.
  */
 @Immutable
 class ImeOptions(
@@ -56,9 +56,7 @@
     val hintLocales: LocaleList = LocaleList.Empty
 ) {
     companion object {
-        /**
-         * Default [ImeOptions]. Please see parameter descriptions for default values.
-         */
+        /** Default [ImeOptions]. Please see parameter descriptions for default values. */
         val Default = ImeOptions()
     }
 
diff --git a/compose/ui/ui-text/src/commonMain/kotlin/androidx/compose/ui/text/input/InputEventCallback.kt b/compose/ui/ui-text/src/commonMain/kotlin/androidx/compose/ui/text/input/InputEventCallback.kt
index d6d18d9..b16fe17 100644
--- a/compose/ui/ui-text/src/commonMain/kotlin/androidx/compose/ui/text/input/InputEventCallback.kt
+++ b/compose/ui/ui-text/src/commonMain/kotlin/androidx/compose/ui/text/input/InputEventCallback.kt
@@ -16,9 +16,7 @@
 
 package androidx.compose.ui.text.input
 
-/**
- * An interface of listening IME events.
- */
+/** An interface of listening IME events. */
 @Deprecated(
     "This function is not being used by any APIs. API is now deprecated and will be removed"
 )
@@ -28,14 +26,12 @@
      *
      * @param editCommands The list of edit commands.
      */
-    @Suppress("CallbackMethodName")
-    fun onEditCommands(editCommands: List<EditCommand>)
+    @Suppress("CallbackMethodName") fun onEditCommands(editCommands: List<EditCommand>)
 
     /**
      * Called when IME triggered IME action.
      *
      * @param imeAction An IME action.
      */
-    @Suppress("CallbackMethodName")
-    fun onImeAction(imeAction: ImeAction)
+    @Suppress("CallbackMethodName") fun onImeAction(imeAction: ImeAction)
 }
diff --git a/compose/ui/ui-text/src/commonMain/kotlin/androidx/compose/ui/text/input/KeyboardCapitalization.kt b/compose/ui/ui-text/src/commonMain/kotlin/androidx/compose/ui/text/input/KeyboardCapitalization.kt
index 3f17676..e97df4c 100644
--- a/compose/ui/ui-text/src/commonMain/kotlin/androidx/compose/ui/text/input/KeyboardCapitalization.kt
+++ b/compose/ui/ui-text/src/commonMain/kotlin/androidx/compose/ui/text/input/KeyboardCapitalization.kt
@@ -19,8 +19,8 @@
 import androidx.compose.runtime.Stable
 
 /**
- * Options to request software keyboard to capitalize the text. Applies to languages which
- * has upper-case and lower-case letters.
+ * Options to request software keyboard to capitalize the text. Applies to languages which has
+ * upper-case and lower-case letters.
  */
 @kotlin.jvm.JvmInline
 value class KeyboardCapitalization private constructor(private val value: Int) {
@@ -37,34 +37,19 @@
     }
 
     companion object {
-        /**
-         * Capitalization behavior is not specified.
-         */
-        @Stable
-        val Unspecified = KeyboardCapitalization(-1)
+        /** Capitalization behavior is not specified. */
+        @Stable val Unspecified = KeyboardCapitalization(-1)
 
-        /**
-         * Do not auto-capitalize text.
-         */
-        @Stable
-        val None = KeyboardCapitalization(0)
+        /** Do not auto-capitalize text. */
+        @Stable val None = KeyboardCapitalization(0)
 
-        /**
-         * Capitalize all characters.
-         */
-        @Stable
-        val Characters = KeyboardCapitalization(1)
+        /** Capitalize all characters. */
+        @Stable val Characters = KeyboardCapitalization(1)
 
-        /**
-         * Capitalize the first character of every word.
-         */
-        @Stable
-        val Words = KeyboardCapitalization(2)
+        /** Capitalize the first character of every word. */
+        @Stable val Words = KeyboardCapitalization(2)
 
-        /**
-         * Capitalize the first character of each sentence.
-         */
-        @Stable
-        val Sentences = KeyboardCapitalization(3)
+        /** Capitalize the first character of each sentence. */
+        @Stable val Sentences = KeyboardCapitalization(3)
     }
 }
diff --git a/compose/ui/ui-text/src/commonMain/kotlin/androidx/compose/ui/text/input/KeyboardType.kt b/compose/ui/ui-text/src/commonMain/kotlin/androidx/compose/ui/text/input/KeyboardType.kt
index 2057a38..3e8a7de 100644
--- a/compose/ui/ui-text/src/commonMain/kotlin/androidx/compose/ui/text/input/KeyboardType.kt
+++ b/compose/ui/ui-text/src/commonMain/kotlin/androidx/compose/ui/text/input/KeyboardType.kt
@@ -18,9 +18,7 @@
 
 import androidx.compose.runtime.Stable
 
-/**
- * Values representing the different available Keyboard Types.
- */
+/** Values representing the different available Keyboard Types. */
 @kotlin.jvm.JvmInline
 value class KeyboardType private constructor(@Suppress("unused") private val value: Int) {
 
@@ -41,23 +39,14 @@
     }
 
     companion object {
-        /**
-         * The keyboard type is not specified.
-         */
-        @Stable
-        val Unspecified: KeyboardType = KeyboardType(0)
+        /** The keyboard type is not specified. */
+        @Stable val Unspecified: KeyboardType = KeyboardType(0)
 
-        /**
-         * A keyboard type used to request an IME that shows regular keyboard.
-         */
-        @Stable
-        val Text: KeyboardType = KeyboardType(1)
+        /** A keyboard type used to request an IME that shows regular keyboard. */
+        @Stable val Text: KeyboardType = KeyboardType(1)
 
-        /**
-         * A keyboard type used to request an IME that is capable of inputting ASCII characters.
-         */
-        @Stable
-        val Ascii: KeyboardType = KeyboardType(2)
+        /** A keyboard type used to request an IME that is capable of inputting ASCII characters. */
+        @Stable val Ascii: KeyboardType = KeyboardType(2)
 
         /**
          * A keyboard type used to request an IME that is capable of inputting digits. IME may
@@ -65,45 +54,28 @@
          *
          * @see KeyboardType.Decimal
          */
-        @Stable
-        val Number: KeyboardType = KeyboardType(3)
+        @Stable val Number: KeyboardType = KeyboardType(3)
+
+        /** A keyboard type used to request an IME that is capable of inputting phone numbers. */
+        @Stable val Phone: KeyboardType = KeyboardType(4)
+
+        /** A keyboard type used to request an IME that is capable of inputting URIs. */
+        @Stable val Uri: KeyboardType = KeyboardType(5)
+
+        /** A keyboard type used to request an IME that is capable of inputting email addresses. */
+        @Stable val Email: KeyboardType = KeyboardType(6)
+
+        /** A keyboard type used to request an IME that is capable of inputting password. */
+        @Stable val Password: KeyboardType = KeyboardType(7)
+
+        /** A keyboard type used to request an IME that is capable of inputting number password. */
+        @Stable val NumberPassword: KeyboardType = KeyboardType(8)
 
         /**
-         * A keyboard type used to request an IME that is capable of inputting phone numbers.
-         */
-        @Stable
-        val Phone: KeyboardType = KeyboardType(4)
-
-        /**
-         * A keyboard type used to request an IME that is capable of inputting URIs.
-         */
-        @Stable
-        val Uri: KeyboardType = KeyboardType(5)
-
-        /**
-         * A keyboard type used to request an IME that is capable of inputting email addresses.
-         */
-        @Stable
-        val Email: KeyboardType = KeyboardType(6)
-
-        /**
-         * A keyboard type used to request an IME that is capable of inputting password.
-         */
-        @Stable
-        val Password: KeyboardType = KeyboardType(7)
-
-        /**
-         * A keyboard type used to request an IME that is capable of inputting number password.
-         */
-        @Stable
-        val NumberPassword: KeyboardType = KeyboardType(8)
-
-        /**
-         * A keyboard type used to request an IME that is capable of inputting decimals.
-         * IME should explicitly provide a decimal separator as input, which is not assured by
+         * A keyboard type used to request an IME that is capable of inputting decimals. IME should
+         * explicitly provide a decimal separator as input, which is not assured by
          * [KeyboardType.Number].
          */
-        @Stable
-        val Decimal: KeyboardType = KeyboardType(9)
+        @Stable val Decimal: KeyboardType = KeyboardType(9)
     }
 }
diff --git a/compose/ui/ui-text/src/commonMain/kotlin/androidx/compose/ui/text/input/MathUtils.kt b/compose/ui/ui-text/src/commonMain/kotlin/androidx/compose/ui/text/input/MathUtils.kt
index cf58e6a..9f7a900 100644
--- a/compose/ui/ui-text/src/commonMain/kotlin/androidx/compose/ui/text/input/MathUtils.kt
+++ b/compose/ui/ui-text/src/commonMain/kotlin/androidx/compose/ui/text/input/MathUtils.kt
@@ -16,18 +16,14 @@
 
 package androidx.compose.ui.text.input
 
-/**
- * Adds [this] and [right], and if an overflow occurs returns result of [defaultValue].
- */
+/** Adds [this] and [right], and if an overflow occurs returns result of [defaultValue]. */
 internal inline fun Int.addExactOrElse(right: Int, defaultValue: () -> Int): Int {
     val result = this + right
     // HD 2-12 Overflow iff both arguments have the opposite sign of the result
     return if (this xor result and (right xor result) < 0) defaultValue() else result
 }
 
-/**
- * Subtracts [right] from [this], and if an overflow occurs returns result of [defaultValue].
- */
+/** Subtracts [right] from [this], and if an overflow occurs returns result of [defaultValue]. */
 internal inline fun Int.subtractExactOrElse(right: Int, defaultValue: () -> Int): Int {
     val result = this - right
     // HD 2-12 Overflow iff the arguments have different signs and
diff --git a/compose/ui/ui-text/src/commonMain/kotlin/androidx/compose/ui/text/input/OffsetMapping.kt b/compose/ui/ui-text/src/commonMain/kotlin/androidx/compose/ui/text/input/OffsetMapping.kt
index b5c3b38..c9706cc 100644
--- a/compose/ui/ui-text/src/commonMain/kotlin/androidx/compose/ui/text/input/OffsetMapping.kt
+++ b/compose/ui/ui-text/src/commonMain/kotlin/androidx/compose/ui/text/input/OffsetMapping.kt
@@ -16,9 +16,7 @@
 
 package androidx.compose.ui.text.input
 
-/**
- * Provides bidirectional offset mapping between original and transformed text.
- */
+/** Provides bidirectional offset mapping between original and transformed text. */
 interface OffsetMapping {
     /**
      * Convert offset in original text into the offset in transformed text.
@@ -28,7 +26,6 @@
      *
      * @param offset offset in original text.
      * @return offset in transformed text
-     *
      * @see VisualTransformation
      */
     fun originalToTransformed(offset: Int): Int
@@ -42,18 +39,17 @@
      *
      * @param offset offset in transformed text
      * @return offset in original text
-     *
      * @see VisualTransformation
      */
     fun transformedToOriginal(offset: Int): Int
 
     companion object {
-        /**
-         * The offset map used for identity mapping.
-         */
-        val Identity = object : OffsetMapping {
-            override fun originalToTransformed(offset: Int): Int = offset
-            override fun transformedToOriginal(offset: Int): Int = offset
-        }
+        /** The offset map used for identity mapping. */
+        val Identity =
+            object : OffsetMapping {
+                override fun originalToTransformed(offset: Int): Int = offset
+
+                override fun transformedToOriginal(offset: Int): Int = offset
+            }
     }
 }
diff --git a/compose/ui/ui-text/src/commonMain/kotlin/androidx/compose/ui/text/input/PlatformImeOptions.kt b/compose/ui/ui-text/src/commonMain/kotlin/androidx/compose/ui/text/input/PlatformImeOptions.kt
index c7be9a2..5d6d708 100644
--- a/compose/ui/ui-text/src/commonMain/kotlin/androidx/compose/ui/text/input/PlatformImeOptions.kt
+++ b/compose/ui/ui-text/src/commonMain/kotlin/androidx/compose/ui/text/input/PlatformImeOptions.kt
@@ -18,8 +18,5 @@
 
 import androidx.compose.runtime.Immutable
 
-/**
- * Used to configure the platform specific IME options.
- */
-@Immutable
-expect class PlatformImeOptions
+/** Used to configure the platform specific IME options. */
+@Immutable expect class PlatformImeOptions
diff --git a/compose/ui/ui-text/src/commonMain/kotlin/androidx/compose/ui/text/input/TextFieldValue.kt b/compose/ui/ui-text/src/commonMain/kotlin/androidx/compose/ui/text/input/TextFieldValue.kt
index 77f74d1..e57c4d5 100644
--- a/compose/ui/ui-text/src/commonMain/kotlin/androidx/compose/ui/text/input/TextFieldValue.kt
+++ b/compose/ui/ui-text/src/commonMain/kotlin/androidx/compose/ui/text/input/TextFieldValue.kt
@@ -32,34 +32,33 @@
  * A class holding information about the editing state.
  *
  * The input service updates text selection, cursor, text and text composition. This class
- * represents those values and it is possible to observe changes to those values in the text
- * editing composables.
+ * represents those values and it is possible to observe changes to those values in the text editing
+ * composables.
  *
  * This class stores a snapshot of the input state of the edit buffer and provide utility functions
  * for answering IME requests such as getTextBeforeCursor, getSelectedText.
  *
  * Input service composition is an instance of text produced by IME. An example visual for the
- * composition is that the currently composed word is visually separated from others with
- * underline, or text background. For description of composition please check
+ * composition is that the currently composed word is visually separated from others with underline,
+ * or text background. For description of composition please check
  * [W3C IME Composition](https://www.w3.org/TR/ime-api/#ime-composition).
  *
- * IME composition is defined by [composition] parameter and function. When a
- * [TextFieldValue] with null [composition] is passed to a TextField, if there was an
- * active [composition] on the text, the changes will be applied. Applying a composition will
- * accept the changes that were still being composed by IME. Please use [copy]
- * functions if you do not want to intentionally apply the ongoing IME composition.
+ * IME composition is defined by [composition] parameter and function. When a [TextFieldValue] with
+ * null [composition] is passed to a TextField, if there was an active [composition] on the text,
+ * the changes will be applied. Applying a composition will accept the changes that were still being
+ * composed by IME. Please use [copy] functions if you do not want to intentionally apply the
+ * ongoing IME composition.
  *
  * @param annotatedString the text to be rendered.
  * @param selection the selection range. If the selection is collapsed, it represents cursor
- * location. When selection range is out of bounds, it is constrained with the text length.
- * @param composition the composition range, null means empty composition or apply if a
- * composition exists on the text. Owned by IME, and if you have an instance of [TextFieldValue]
- * please use [copy] functions if you do not want to intentionally change the value of this
- * field.
- *
+ *   location. When selection range is out of bounds, it is constrained with the text length.
+ * @param composition the composition range, null means empty composition or apply if a composition
+ *   exists on the text. Owned by IME, and if you have an instance of [TextFieldValue] please use
+ *   [copy] functions if you do not want to intentionally change the value of this field.
  */
 @Immutable
-class TextFieldValue constructor(
+class TextFieldValue
+constructor(
     val annotatedString: AnnotatedString,
     selection: TextRange = TextRange.Zero,
     composition: TextRange? = null
@@ -67,11 +66,11 @@
     /**
      * @param text the text to be rendered.
      * @param selection the selection range. If the selection is collapsed, it represents cursor
-     * location. When selection range is out of bounds, it is constrained with the text length.
+     *   location. When selection range is out of bounds, it is constrained with the text length.
      * @param composition the composition range, null means empty composition or apply if a
-     * composition exists on the text. Owned by IME, and if you have an instance of [TextFieldValue]
-     * please use [copy] functions if you do not want to intentionally change the value of this
-     * field.
+     *   composition exists on the text. Owned by IME, and if you have an instance of
+     *   [TextFieldValue] please use [copy] functions if you do not want to intentionally change the
+     *   value of this field.
      */
     constructor(
         text: String = "",
@@ -79,16 +78,17 @@
         composition: TextRange? = null
     ) : this(AnnotatedString(text), selection, composition)
 
-    val text: String get() = annotatedString.text
+    val text: String
+        get() = annotatedString.text
 
     /**
-     * The selection range. If the selection is collapsed, it represents cursor
-     * location. When selection range is out of bounds, it is constrained with the text length.
+     * The selection range. If the selection is collapsed, it represents cursor location. When
+     * selection range is out of bounds, it is constrained with the text length.
      */
     val selection: TextRange = selection.coerceIn(0, text.length)
 
     /**
-     * Composition range created by  IME. If null, there is no composition range.
+     * Composition range created by IME. If null, there is no composition range.
      *
      * Input service composition is an instance of text produced by IME. An example visual for the
      * composition is that the currently composed word is visually separated from others with
@@ -96,14 +96,12 @@
      * [W3C IME Composition](https://www.w3.org/TR/ime-api/#ime-composition)
      *
      * Composition can be set on the by the system, however it is possible to apply an existing
-     * composition by setting the value to null. Applying a composition will accept the changes
-     * that were still being composed by IME.
+     * composition by setting the value to null. Applying a composition will accept the changes that
+     * were still being composed by IME.
      */
     val composition: TextRange? = composition?.coerceIn(0, text.length)
 
-    /**
-     * Returns a copy of the TextFieldValue.
-     */
+    /** Returns a copy of the TextFieldValue. */
     fun copy(
         annotatedString: AnnotatedString = this.annotatedString,
         selection: TextRange = this.selection,
@@ -112,9 +110,7 @@
         return TextFieldValue(annotatedString, selection, composition)
     }
 
-    /**
-     * Returns a copy of the TextFieldValue.
-     */
+    /** Returns a copy of the TextFieldValue. */
     fun copy(
         text: String,
         selection: TextRange = this.selection,
@@ -151,25 +147,23 @@
     }
 
     companion object {
-        /**
-         * The default [Saver] implementation for [TextFieldValue].
-         */
-        val Saver = Saver<TextFieldValue, Any>(
-            save = {
-                arrayListOf(
-                    save(it.annotatedString, AnnotatedStringSaver, this),
-                    save(it.selection, TextRange.Saver, this),
-                )
-            },
-            restore = {
-                @Suppress("UNCHECKED_CAST")
-                val list = it as List<Any>
-                TextFieldValue(
-                    annotatedString = restore(list[0], AnnotatedStringSaver)!!,
-                    selection = restore(list[1], TextRange.Saver)!!,
-                )
-            }
-        )
+        /** The default [Saver] implementation for [TextFieldValue]. */
+        val Saver =
+            Saver<TextFieldValue, Any>(
+                save = {
+                    arrayListOf(
+                        save(it.annotatedString, AnnotatedStringSaver, this),
+                        save(it.selection, TextRange.Saver, this),
+                    )
+                },
+                restore = {
+                    @Suppress("UNCHECKED_CAST") val list = it as List<Any>
+                    TextFieldValue(
+                        annotatedString = restore(list[0], AnnotatedStringSaver)!!,
+                        selection = restore(list[1], TextRange.Saver)!!,
+                    )
+                }
+            )
     }
 }
 
@@ -177,8 +171,7 @@
  * Returns the text before the selection.
  *
  * @param maxChars maximum number of characters (inclusive) before the minimum value in
- * [TextFieldValue.selection].
- *
+ *   [TextFieldValue.selection].
  * @see TextRange.min
  */
 fun TextFieldValue.getTextBeforeSelection(maxChars: Int): AnnotatedString =
@@ -188,14 +181,11 @@
  * Returns the text after the selection.
  *
  * @param maxChars maximum number of characters (exclusive) after the maximum value in
- * [TextFieldValue.selection].
- *
+ *   [TextFieldValue.selection].
  * @see TextRange.max
  */
 fun TextFieldValue.getTextAfterSelection(maxChars: Int): AnnotatedString =
     annotatedString.subSequence(selection.max, min(selection.max + maxChars, text.length))
 
-/**
- * Returns the currently selected text.
- */
+/** Returns the currently selected text. */
 fun TextFieldValue.getSelectedText(): AnnotatedString = annotatedString.subSequence(selection)
diff --git a/compose/ui/ui-text/src/commonMain/kotlin/androidx/compose/ui/text/input/TextInputService.kt b/compose/ui/ui-text/src/commonMain/kotlin/androidx/compose/ui/text/input/TextInputService.kt
index b5f6bde..70d309d 100644
--- a/compose/ui/ui-text/src/commonMain/kotlin/androidx/compose/ui/text/input/TextInputService.kt
+++ b/compose/ui/ui-text/src/commonMain/kotlin/androidx/compose/ui/text/input/TextInputService.kt
@@ -26,18 +26,17 @@
 import androidx.compose.ui.text.TextLayoutResult
 
 /**
- * Handles communication with the IME. Informs about the IME changes via [EditCommand]s and
- * provides utilities for working with software keyboard.
+ * Handles communication with the IME. Informs about the IME changes via [EditCommand]s and provides
+ * utilities for working with software keyboard.
  *
  * This class is responsible for ensuring there is only one open [TextInputSession] which will
- * interact with software keyboards. Start new a TextInputSession by calling [startInput] and
- * close it with [stopInput].
+ * interact with software keyboards. Start new a TextInputSession by calling [startInput] and close
+ * it with [stopInput].
  */
 // Open for testing purposes.
 @Deprecated("Use PlatformTextInputModifierNode instead.")
 open class TextInputService(private val platformTextInputService: PlatformTextInputService) {
-    private val _currentInputSession: AtomicReference<TextInputSession?> =
-        AtomicReference(null)
+    private val _currentInputSession: AtomicReference<TextInputSession?> = AtomicReference(null)
 
     internal val currentInputSession: TextInputSession?
         get() = _currentInputSession.get()
@@ -45,14 +44,14 @@
     /**
      * Start text input session for given client.
      *
-     * If there is a previous [TextInputSession] open, it will immediately be closed by this call
-     * to [startInput].
+     * If there is a previous [TextInputSession] open, it will immediately be closed by this call to
+     * [startInput].
      *
      * @param value initial [TextFieldValue]
      * @param imeOptions IME configuration
      * @param onEditCommand callback to inform about changes requested by IME
-     * @param onImeActionPerformed callback to inform if an IME action such as [ImeAction.Done]
-     * etc occurred.
+     * @param onImeActionPerformed callback to inform if an IME action such as [ImeAction.Done] etc
+     *   occurred.
      */
     open fun startInput(
         value: TextFieldValue,
@@ -60,21 +59,16 @@
         onEditCommand: (List<EditCommand>) -> Unit,
         onImeActionPerformed: (ImeAction) -> Unit
     ): TextInputSession {
-        platformTextInputService.startInput(
-            value,
-            imeOptions,
-            onEditCommand,
-            onImeActionPerformed
-        )
+        platformTextInputService.startInput(value, imeOptions, onEditCommand, onImeActionPerformed)
         val nextSession = TextInputSession(this, platformTextInputService)
         _currentInputSession.set(nextSession)
         return nextSession
     }
 
     /**
-    * Restart input and show the keyboard. This should only be called when starting a new
-    * `PlatformTextInputModifierNode.textInputSession`.
-    */
+     * Restart input and show the keyboard. This should only be called when starting a new
+     * `PlatformTextInputModifierNode.textInputSession`.
+     */
     @InternalTextApi
     @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
     fun startInput() {
@@ -109,12 +103,13 @@
      * nothing that will accept typed input. The most common way to open a TextInputSession is to
      * set the focus to an editable text composable.
      *
-     * There is no guarantee that the keyboard will be shown. The software keyboard or
-     * system service may silently ignore this request.
+     * There is no guarantee that the keyboard will be shown. The software keyboard or system
+     * service may silently ignore this request.
      */
     @Deprecated(
-        message = "Use SoftwareKeyboardController.show or " +
-            "TextInputSession.showSoftwareKeyboard instead.",
+        message =
+            "Use SoftwareKeyboardController.show or " +
+                "TextInputSession.showSoftwareKeyboard instead.",
         replaceWith = ReplaceWith("textInputSession.showSoftwareKeyboard()")
     )
     // TODO(b/183448615) @InternalTextApi
@@ -124,12 +119,11 @@
         }
     }
 
-    /**
-     * Hide onscreen keyboard.
-     */
+    /** Hide onscreen keyboard. */
     @Deprecated(
-        message = "Use SoftwareKeyboardController.hide or " +
-            "TextInputSession.hideSoftwareKeyboard instead.",
+        message =
+            "Use SoftwareKeyboardController.hide or " +
+                "TextInputSession.hideSoftwareKeyboard instead.",
         replaceWith = ReplaceWith("textInputSession.hideSoftwareKeyboard()")
     )
     // TODO(b/183448615) @InternalTextApi
@@ -139,8 +133,8 @@
 /**
  * Represents a input session for interactions between a soft keyboard and editable text.
  *
- * This session may be closed at any time by [TextInputService] or by calling [dispose], after
- * which [isOpen] will return false and all further calls will have no effect.
+ * This session may be closed at any time by [TextInputService] or by calling [dispose], after which
+ * [isOpen] will return false and all further calls will have no effect.
  */
 @Deprecated("Use PlatformTextInputModifierNode instead.")
 class TextInputSession(
@@ -235,10 +229,10 @@
      * Notify IME about the new [TextFieldValue] and latest state of the editing buffer. [oldValue]
      * is the state of the buffer before the changes applied by the [newValue].
      *
-     * [oldValue] represents the changes that was requested by IME on the buffer, and [newValue]
-     * is the final state of the editing buffer that was requested by the application. In cases
-     * where [oldValue] is not equal to [newValue], it would mean the IME suggested value is
-     * rejected, and the IME connection will be restarted with the newValue.
+     * [oldValue] represents the changes that was requested by IME on the buffer, and [newValue] is
+     * the final state of the editing buffer that was requested by the application. In cases where
+     * [oldValue] is not equal to [newValue], it would mean the IME suggested value is rejected, and
+     * the IME connection will be restarted with the newValue.
      *
      * If the session is not open, action will be performed.
      *
@@ -246,12 +240,10 @@
      * @param newValue final state of the editing buffer that was requested by the application
      * @return false if this session expired and no action was performed
      */
-    fun updateState(
-        oldValue: TextFieldValue?,
-        newValue: TextFieldValue
-    ): Boolean = ensureOpenSession {
-        platformTextInputService.updateState(oldValue, newValue)
-    }
+    fun updateState(oldValue: TextFieldValue?, newValue: TextFieldValue): Boolean =
+        ensureOpenSession {
+            platformTextInputService.updateState(oldValue, newValue)
+        }
 
     /**
      * Request showing onscreen keyboard.
@@ -262,8 +254,8 @@
      * new editable text composable to show the keyboard in response to events related to that
      * composable.
      *
-     * There is no guarantee that the keyboard will be shown. The software keyboard or
-     * system service may silently ignore this request.
+     * There is no guarantee that the keyboard will be shown. The software keyboard or system
+     * service may silently ignore this request.
      *
      * @return false if this session expired and no action was performed
      */
@@ -291,9 +283,7 @@
     }
 }
 
-/**
- * Platform specific text input service.
- */
+/** Platform specific text input service. */
 @Deprecated("Use PlatformTextInputModifierNode instead.")
 interface PlatformTextInputService {
     /**
@@ -354,8 +344,7 @@
      * For example, desktop systems show a popup near the focused input area (for some languages).
      */
     // TODO(b/262648050) Try to find a better API.
-    fun notifyFocusedRect(rect: Rect) {
-    }
+    fun notifyFocusedRect(rect: Rect) {}
 
     /**
      * Notify the input service of layout and position changes.
@@ -369,6 +358,5 @@
         textFieldToRootTransform: (Matrix) -> Unit,
         innerTextFieldBounds: Rect,
         decorationBoxBounds: Rect
-    ) {
-    }
+    ) {}
 }
diff --git a/compose/ui/ui-text/src/commonMain/kotlin/androidx/compose/ui/text/input/VisualTransformation.kt b/compose/ui/ui-text/src/commonMain/kotlin/androidx/compose/ui/text/input/VisualTransformation.kt
index 45a3df4..33bf501 100644
--- a/compose/ui/ui-text/src/commonMain/kotlin/androidx/compose/ui/text/input/VisualTransformation.kt
+++ b/compose/ui/ui-text/src/commonMain/kotlin/androidx/compose/ui/text/input/VisualTransformation.kt
@@ -20,18 +20,12 @@
 import androidx.compose.runtime.Stable
 import androidx.compose.ui.text.AnnotatedString
 
-/**
- * The transformed text with offset offset mapping
- */
+/** The transformed text with offset offset mapping */
 class TransformedText(
-    /**
-     * The transformed text
-     */
+    /** The transformed text */
     val text: AnnotatedString,
 
-    /**
-     * The map used for bidirectional offset mapping from original to transformed text.
-     */
+    /** The map used for bidirectional offset mapping from original to transformed text. */
     val offsetMapping: OffsetMapping
 ) {
     override fun equals(other: Any?): Boolean {
@@ -56,8 +50,8 @@
 /**
  * Interface used for changing visual output of the input field.
  *
- * This interface can be used for changing visual output of the text in the input field.
- * For example, you can mask characters in password field with asterisk with
+ * This interface can be used for changing visual output of the text in the input field. For
+ * example, you can mask characters in password field with asterisk with
  * [PasswordVisualTransformation].
  */
 @Immutable
@@ -65,21 +59,19 @@
     /**
      * Change the visual output of given text.
      *
-     * Note that the returned text length can be different length from the given text. The composable
-     * will call the offset translator for converting offsets for various reasons, cursor drawing
-     * position, text selection by gesture, etc.
+     * Note that the returned text length can be different length from the given text. The
+     * composable will call the offset translator for converting offsets for various reasons, cursor
+     * drawing position, text selection by gesture, etc.
      *
-     * Example: The ASCII only password (replacing with '*' chars)
-     *  original text   : thisispassword
-     *  transformed text: **************
+     * Example: The ASCII only password (replacing with '*' chars) original text : thisispassword
+     * transformed text: **************
      *
-     *  @sample androidx.compose.ui.text.samples.passwordFilter
+     * @sample androidx.compose.ui.text.samples.passwordFilter
      *
-     * Example: Credit Card Visual Output (inserting hyphens each 4 digits)
-     *  original text   : 1234567890123456
-     *  transformed text: 1234-5678-9012-3456
+     * Example: Credit Card Visual Output (inserting hyphens each 4 digits) original text :
+     * 1234567890123456 transformed text: 1234-5678-9012-3456
      *
-     *  @sample androidx.compose.ui.text.samples.creditCardFilter
+     * @sample androidx.compose.ui.text.samples.creditCardFilter
      *
      * @param text The original text
      * @return the pair of filtered text and offset translator.
@@ -87,9 +79,7 @@
     fun filter(text: AnnotatedString): TransformedText
 
     companion object {
-        /**
-         * A special visual transformation object indicating that no transformation is applied.
-         */
+        /** A special visual transformation object indicating that no transformation is applied. */
         @Stable
         val None: VisualTransformation = VisualTransformation { text ->
             TransformedText(text, OffsetMapping.Identity)
diff --git a/compose/ui/ui-text/src/commonMain/kotlin/androidx/compose/ui/text/intl/Locale.kt b/compose/ui/ui-text/src/commonMain/kotlin/androidx/compose/ui/text/intl/Locale.kt
index ee0118c..6656fa3 100644
--- a/compose/ui/ui-text/src/commonMain/kotlin/androidx/compose/ui/text/intl/Locale.kt
+++ b/compose/ui/ui-text/src/commonMain/kotlin/androidx/compose/ui/text/intl/Locale.kt
@@ -21,50 +21,44 @@
 import androidx.compose.ui.text.TextStyle
 
 /**
- * A `Locale` object represents a specific geographical, political, or cultural region. An
- * operation that requires a `Locale` to perform its task is called _locale-sensitive_ and uses the
- * `Locale` to tailor information for the user. For example, displaying a number is a
- * locale-sensitive operation— the number should be formatted according to the customs and
- * conventions of the user's native country, region, or culture.
+ * A `Locale` object represents a specific geographical, political, or cultural region. An operation
+ * that requires a `Locale` to perform its task is called _locale-sensitive_ and uses the `Locale`
+ * to tailor information for the user. For example, displaying a number is a locale-sensitive
+ * operation— the number should be formatted according to the customs and conventions of the user's
+ * native country, region, or culture.
  *
  * @param platformLocale Platform specific Locale object that provides the actual values for the
- * members of this class.
- *
+ *   members of this class.
  * @see TextStyle
  * @see SpanStyle
  */
 @Immutable
 class Locale internal constructor(val platformLocale: PlatformLocale) {
     companion object {
-        /**
-         * Returns a [Locale] object which represents current locale
-         */
-        val current: Locale get() = platformLocaleDelegate.current[0]
+        /** Returns a [Locale] object which represents current locale */
+        val current: Locale
+            get() = platformLocaleDelegate.current[0]
     }
 
     /**
      * Create Locale object from a language tag.
      *
      * @param languageTag A [IETF BCP47](https://tools.ietf.org/html/bcp47) compliant language tag.
-     *
      * @return a locale object
      */
     constructor(languageTag: String) : this(platformLocaleDelegate.parseLanguageTag(languageTag))
 
-    /**
-     * The ISO 639 compliant language code.
-     */
-    val language: String get() = platformLocale.language
+    /** The ISO 639 compliant language code. */
+    val language: String
+        get() = platformLocale.language
 
-    /**
-     * The ISO 15924 compliant 4-letter script code.
-     */
-    val script: String get() = platformLocale.script
+    /** The ISO 15924 compliant 4-letter script code. */
+    val script: String
+        get() = platformLocale.script
 
-    /**
-     * The ISO 3166 compliant region code.
-     */
-    val region: String get() = platformLocale.region
+    /** The ISO 3166 compliant region code. */
+    val region: String
+        get() = platformLocale.region
 
     /**
      * Returns a IETF BCP47 compliant language tag representation of this Locale.
diff --git a/compose/ui/ui-text/src/commonMain/kotlin/androidx/compose/ui/text/intl/LocaleList.kt b/compose/ui/ui-text/src/commonMain/kotlin/androidx/compose/ui/text/intl/LocaleList.kt
index 88a9442..6cb71cf 100644
--- a/compose/ui/ui-text/src/commonMain/kotlin/androidx/compose/ui/text/intl/LocaleList.kt
+++ b/compose/ui/ui-text/src/commonMain/kotlin/androidx/compose/ui/text/intl/LocaleList.kt
@@ -37,9 +37,7 @@
          */
         val Empty = LocaleList(emptyList())
 
-        /**
-         * Returns Locale object which represents current locale
-         */
+        /** Returns Locale object which represents current locale */
         val current: LocaleList
             get() = platformLocaleDelegate.current
     }
@@ -48,14 +46,13 @@
      * Create a [LocaleList] object from comma separated language tags.
      *
      * @param languageTags A comma separated [IETF BCP47](https://tools.ietf.org/html/bcp47)
-     * compliant language tag.
+     *   compliant language tag.
      */
-    constructor(languageTags: String) :
-        this(languageTags.split(",").fastMap { it.trim() }.fastMap { Locale(it) })
+    constructor(
+        languageTags: String
+    ) : this(languageTags.split(",").fastMap { it.trim() }.fastMap { Locale(it) })
 
-    /**
-     * Creates a [LocaleList] object from a list of [Locale]s.
-     */
+    /** Creates a [LocaleList] object from a list of [Locale]s. */
     constructor(vararg locales: Locale) : this(locales.toList())
 
     operator fun get(i: Int) = localeList[i]
diff --git a/compose/ui/ui-text/src/commonMain/kotlin/androidx/compose/ui/text/intl/PlatformLocale.kt b/compose/ui/ui-text/src/commonMain/kotlin/androidx/compose/ui/text/intl/PlatformLocale.kt
index 31b368f..a3f2a1e 100644
--- a/compose/ui/ui-text/src/commonMain/kotlin/androidx/compose/ui/text/intl/PlatformLocale.kt
+++ b/compose/ui/ui-text/src/commonMain/kotlin/androidx/compose/ui/text/intl/PlatformLocale.kt
@@ -16,35 +16,22 @@
 
 package androidx.compose.ui.text.intl
 
-/**
- * Class for providing Locale functionality from the current platform.
- */
+/** Class for providing Locale functionality from the current platform. */
 expect class PlatformLocale
 
-/**
- * Implementation must give ISO 639 compliant language code.
- */
+/** Implementation must give ISO 639 compliant language code. */
 internal expect val PlatformLocale.language: String
 
-/**
- * Implementation must give ISO 15924 compliant 4-letter script code.
- */
+/** Implementation must give ISO 15924 compliant 4-letter script code. */
 internal expect val PlatformLocale.script: String
 
-/**
- * Implementation must give ISO 3166 compliant region code.
- */
+/** Implementation must give ISO 3166 compliant region code. */
 internal expect val PlatformLocale.region: String
 
-/**
- * Implementation must return IETF BCP47 compliant language tag representation of this Locale.
- */
+/** Implementation must return IETF BCP47 compliant language tag representation of this Locale. */
 internal expect fun PlatformLocale.getLanguageTag(): String
 
-/**
- * Interface for providing platform dependent locale non-instance helper functions.
- *
- */
+/** Interface for providing platform dependent locale non-instance helper functions. */
 internal interface PlatformLocaleDelegate {
     /**
      * Returns the list of current locales.
diff --git a/compose/ui/ui-text/src/commonMain/kotlin/androidx/compose/ui/text/platform/Dispatcher.kt b/compose/ui/ui-text/src/commonMain/kotlin/androidx/compose/ui/text/platform/Dispatcher.kt
index 18719ab..429dfdc 100644
--- a/compose/ui/ui-text/src/commonMain/kotlin/androidx/compose/ui/text/platform/Dispatcher.kt
+++ b/compose/ui/ui-text/src/commonMain/kotlin/androidx/compose/ui/text/platform/Dispatcher.kt
@@ -27,7 +27,7 @@
  *
  * This should be Main or some other always-available dispatcher.
  *
- * It is important that this dispatcher, if it is shared with other coroutines,  implements `yield`
+ * It is important that this dispatcher, if it is shared with other coroutines, implements `yield`
  * to dispatch.
  */
 internal val FontCacheManagementDispatcher: CoroutineDispatcher = Dispatchers.Main
diff --git a/compose/ui/ui-text/src/commonMain/kotlin/androidx/compose/ui/text/platform/PlatformParagraph.kt b/compose/ui/ui-text/src/commonMain/kotlin/androidx/compose/ui/text/platform/PlatformParagraph.kt
index 78815c0..3651805 100644
--- a/compose/ui/ui-text/src/commonMain/kotlin/androidx/compose/ui/text/platform/PlatformParagraph.kt
+++ b/compose/ui/ui-text/src/commonMain/kotlin/androidx/compose/ui/text/platform/PlatformParagraph.kt
@@ -29,8 +29,11 @@
 @Suppress("DEPRECATION")
 @Deprecated(
     "Font.ResourceLoader is deprecated, instead pass FontFamily.Resolver",
-    replaceWith = ReplaceWith("ActualParagraph(text, style, spanStyles, placeholders, " +
-        "maxLines, ellipsis, width, density, fontFamilyResolver)"),
+    replaceWith =
+        ReplaceWith(
+            "ActualParagraph(text, style, spanStyles, placeholders, " +
+                "maxLines, ellipsis, width, density, fontFamilyResolver)"
+        ),
 )
 // TODO(b/157854677): remove after fixing.
 internal expect fun ActualParagraph(
diff --git a/compose/ui/ui-text/src/commonMain/kotlin/androidx/compose/ui/text/style/BaselineShift.kt b/compose/ui/ui-text/src/commonMain/kotlin/androidx/compose/ui/text/style/BaselineShift.kt
index df1d450..0fa3454 100644
--- a/compose/ui/ui-text/src/commonMain/kotlin/androidx/compose/ui/text/style/BaselineShift.kt
+++ b/compose/ui/ui-text/src/commonMain/kotlin/androidx/compose/ui/text/style/BaselineShift.kt
@@ -22,46 +22,31 @@
 
 /**
  * The amount by which the text is shifted up or down from current the baseline.
- * @constructor
- * @sample androidx.compose.ui.text.samples.BaselineShiftSample
- * @sample androidx.compose.ui.text.samples.BaselineShiftAnnotatedStringSample
  *
  * @param multiplier shift the baseline by multiplier * (baseline - ascent)
+ * @constructor
+ *
+ * @sample androidx.compose.ui.text.samples.BaselineShiftSample
+ *
+ * @sample androidx.compose.ui.text.samples.BaselineShiftAnnotatedStringSample
  */
 @Immutable
 @kotlin.jvm.JvmInline
 value class BaselineShift(val multiplier: Float) {
     companion object {
-        /**
-         * Default baseline shift for superscript.
-         */
-        @Stable
-        val Superscript = BaselineShift(0.5f)
+        /** Default baseline shift for superscript. */
+        @Stable val Superscript = BaselineShift(0.5f)
 
-        /**
-         * Default baseline shift for subscript
-         */
-        @Stable
-        val Subscript = BaselineShift(-0.5f)
+        /** Default baseline shift for subscript */
+        @Stable val Subscript = BaselineShift(-0.5f)
 
-        /**
-         * Constant for no baseline shift.
-         */
-        @Stable
-        val None = BaselineShift(0.0f)
+        /** Constant for no baseline shift. */
+        @Stable val None = BaselineShift(0.0f)
     }
 }
 
-/**
- * Linearly interpolate two [BaselineShift]s.
- */
+/** Linearly interpolate two [BaselineShift]s. */
 @Stable
 fun lerp(start: BaselineShift, stop: BaselineShift, fraction: Float): BaselineShift {
-    return BaselineShift(
-        lerp(
-            start.multiplier,
-            stop.multiplier,
-            fraction
-        )
-    )
+    return BaselineShift(lerp(start.multiplier, stop.multiplier, fraction))
 }
diff --git a/compose/ui/ui-text/src/commonMain/kotlin/androidx/compose/ui/text/style/Hyphens.kt b/compose/ui/ui-text/src/commonMain/kotlin/androidx/compose/ui/text/style/Hyphens.kt
index 9d9bb40..f189eea 100644
--- a/compose/ui/ui-text/src/commonMain/kotlin/androidx/compose/ui/text/style/Hyphens.kt
+++ b/compose/ui/ui-text/src/commonMain/kotlin/androidx/compose/ui/text/style/Hyphens.kt
@@ -25,33 +25,26 @@
  * Automatic hyphenation is added between syllables at appropriate hyphenation points, following
  * language rules.
  *
- * However, user can override automatic break point selection, suggesting line break
- * opportunities (see Suggesting line break opportunities below).
+ * However, user can override automatic break point selection, suggesting line break opportunities
+ * (see Suggesting line break opportunities below).
  *
  * Suggesting line break opportunities:
- *
- * - <code>\u2010</code> ("hard" hyphen)
- * Indicates a visible line break opportunity. Even if the line is not actually broken at that
- * point, the hyphen is still rendered.
- *
- * - <code>\u00AD</code> ("soft" hyphen)
- * This character is not rendered visibly; instead, it marks a place where the word can be broken if
- * hyphenation is necessary.
+ * - <code>\u2010</code> ("hard" hyphen) Indicates a visible line break opportunity. Even if the
+ *   line is not actually broken at that point, the hyphen is still rendered.
+ * - <code>\u00AD</code> ("soft" hyphen) This character is not rendered visibly; instead, it marks a
+ *   place where the word can be broken if hyphenation is necessary.
  *
  * The default configuration for [Hyphens] = [Hyphens.None]
- *
  */
 @JvmInline
 value class Hyphens private constructor(internal val value: Int) {
     companion object {
         /**
-         *  Lines will break with no hyphenation.
+         * Lines will break with no hyphenation.
          *
-         *  "Hard" hyphens will
-         *  still be respected. However, no automatic hyphenation will be
-         *  attempted. If a word must be broken due to being longer than a line, it will break at
-         *  any character and will not attempt to break at a syllable boundary.
-         *
+         * "Hard" hyphens will still be respected. However, no automatic hyphenation will be
+         * attempted. If a word must be broken due to being longer than a line, it will break at any
+         * character and will not attempt to break at a syllable boundary.
          * <pre>
          * +---------+
          * | Experim |
@@ -66,7 +59,6 @@
          *
          * However, suggested line break opportunities (see Suggesting line break opportunities
          * above) will override automatic break point selection when present.
-         *
          * <pre>
          * +---------+
          * | Experi- |
@@ -77,16 +69,17 @@
         val Auto = Hyphens(2)
 
         /**
-         * This represents an unset value, a usual replacement for "null" when a primitive value
-         * is desired.
+         * This represents an unset value, a usual replacement for "null" when a primitive value is
+         * desired.
          */
         val Unspecified = Hyphens(Int.MIN_VALUE)
     }
 
-    override fun toString() = when (this) {
-        None -> "Hyphens.None"
-        Auto -> "Hyphens.Auto"
-        Unspecified -> "Hyphens.Unspecified"
-        else -> "Invalid"
-    }
+    override fun toString() =
+        when (this) {
+            None -> "Hyphens.None"
+            Auto -> "Hyphens.Auto"
+            Unspecified -> "Hyphens.Unspecified"
+            else -> "Invalid"
+        }
 }
diff --git a/compose/ui/ui-text/src/commonMain/kotlin/androidx/compose/ui/text/style/LineBreak.kt b/compose/ui/ui-text/src/commonMain/kotlin/androidx/compose/ui/text/style/LineBreak.kt
index a7a1d19..c319725 100644
--- a/compose/ui/ui-text/src/commonMain/kotlin/androidx/compose/ui/text/style/LineBreak.kt
+++ b/compose/ui/ui-text/src/commonMain/kotlin/androidx/compose/ui/text/style/LineBreak.kt
@@ -23,17 +23,16 @@
 import androidx.compose.ui.text.style.LineBreak.Companion.Simple
 
 /**
- * When soft wrap is enabled and the width of the text exceeds the width of its container,
- * line breaks are inserted in the text to split it over multiple lines.
+ * When soft wrap is enabled and the width of the text exceeds the width of its container, line
+ * breaks are inserted in the text to split it over multiple lines.
  *
- * There are a number of parameters that affect how the line breaks are inserted.
- * For example, the breaking algorithm can be changed to one with improved readability
- * at the cost of speed.
- * Another example is the strictness, which in some languages determines which symbols can appear
- * at the start of a line.
+ * There are a number of parameters that affect how the line breaks are inserted. For example, the
+ * breaking algorithm can be changed to one with improved readability at the cost of speed. Another
+ * example is the strictness, which in some languages determines which symbols can appear at the
+ * start of a line.
  *
- * `LineBreak` represents a configuration for line breaking, offering several presets
- * for different use cases: [Simple], [Heading], [Paragraph].
+ * `LineBreak` represents a configuration for line breaking, offering several presets for different
+ * use cases: [Simple], [Heading], [Paragraph].
  *
  * @sample androidx.compose.ui.text.samples.LineBreakSample
  *
@@ -42,36 +41,30 @@
  * @sample androidx.compose.ui.text.samples.AndroidLineBreakSample
  */
 @Immutable
-expect value class LineBreak private constructor(
-    private val mask: Int
-) {
+expect value class LineBreak private constructor(private val mask: Int) {
     companion object {
         /**
-         * Basic, fast line breaking. Ideal for text input fields, as it will cause minimal
-         * text reflow when editing.
+         * Basic, fast line breaking. Ideal for text input fields, as it will cause minimal text
+         * reflow when editing.
          */
-        @Stable
-        val Simple: LineBreak
+        @Stable val Simple: LineBreak
 
         /**
          * Looser breaking rules, suitable for short text such as titles or narrow newspaper
          * columns. For longer lines of text, use [Paragraph] for improved readability.
          */
-        @Stable
-        val Heading: LineBreak
+        @Stable val Heading: LineBreak
 
         /**
-         * Slower, higher quality line breaking for improved readability.
-         * Suitable for larger amounts of text.
+         * Slower, higher quality line breaking for improved readability. Suitable for larger
+         * amounts of text.
          */
-        @Stable
-        val Paragraph: LineBreak
+        @Stable val Paragraph: LineBreak
 
         /**
-         * This represents an unset value, a usual replacement for "null" when a primitive value
-         * is desired.
+         * This represents an unset value, a usual replacement for "null" when a primitive value is
+         * desired.
          */
-        @Stable
-        val Unspecified: LineBreak
+        @Stable val Unspecified: LineBreak
     }
 }
diff --git a/compose/ui/ui-text/src/commonMain/kotlin/androidx/compose/ui/text/style/LineHeightStyle.kt b/compose/ui/ui-text/src/commonMain/kotlin/androidx/compose/ui/text/style/LineHeightStyle.kt
index e6d44f7..bd55b0c 100644
--- a/compose/ui/ui-text/src/commonMain/kotlin/androidx/compose/ui/text/style/LineHeightStyle.kt
+++ b/compose/ui/ui-text/src/commonMain/kotlin/androidx/compose/ui/text/style/LineHeightStyle.kt
@@ -20,8 +20,8 @@
 
 /**
  * The configuration for line height such as alignment of the line in the provided line height,
- * whether to apply additional space as a result of line height to top of first line top and
- * bottom of last line.
+ * whether to apply additional space as a result of line height to top of first line top and bottom
+ * of last line.
  *
  * The configuration is applied only when a line height is defined on the text.
  *
@@ -30,24 +30,18 @@
  * Please check [Trim] and [Alignment] for more description.
  *
  * @param alignment defines how to align the line in the space provided by the line height.
- * @param trim defines whether the space that would be added to the top of first line, and
- * bottom of the last line should be trimmed or not. This feature is available only when
- * [PlatformParagraphStyle.includeFontPadding] is false.
+ * @param trim defines whether the space that would be added to the top of first line, and bottom of
+ *   the last line should be trimmed or not. This feature is available only when
+ *   [PlatformParagraphStyle.includeFontPadding] is false.
  */
-class LineHeightStyle(
-    val alignment: Alignment,
-    val trim: Trim
-) {
+class LineHeightStyle(val alignment: Alignment, val trim: Trim) {
     companion object {
         /**
          * The default configuration for [LineHeightStyle]:
          * - alignment = [Alignment.Proportional]
          * - trim = [Trim.Both]
          */
-        val Default = LineHeightStyle(
-            alignment = Alignment.Proportional,
-            trim = Trim.Both
-        )
+        val Default = LineHeightStyle(alignment = Alignment.Proportional, trim = Trim.Both)
     }
 
     override fun equals(other: Any?): Boolean {
@@ -67,10 +61,7 @@
     }
 
     override fun toString(): String {
-        return "LineHeightStyle(" +
-            "alignment=$alignment, " +
-            "trim=$trim" +
-            ")"
+        return "LineHeightStyle(" + "alignment=$alignment, " + "trim=$trim" + ")"
     }
 
     /**
@@ -100,9 +91,9 @@
              * line height. Single line text is both the first and last line. This feature is
              * available only when [PlatformParagraphStyle.includeFontPadding] is false.
              *
-             * For example, when line height is 3.em, and [Alignment] is
-             * [Alignment.Center], the first line has 2.em height and the height from
-             * first line baseline to second line baseline is still 3.em:
+             * For example, when line height is 3.em, and [Alignment] is [Alignment.Center], the
+             * first line has 2.em height and the height from first line baseline to second line
+             * baseline is still 3.em:
              * <pre>
              * +--------+
              * | Line1  |
@@ -121,9 +112,9 @@
              * line height. Single line text is both the first and last line. This feature is
              * available only when [PlatformParagraphStyle.includeFontPadding] is false.
              *
-             * For example, when line height is 3.em, and [Alignment] is
-             * [Alignment.Center], the last line has 2.em height and the height from
-             * first line baseline to second line baseline is still 3.em:
+             * For example, when line height is 3.em, and [Alignment] is [Alignment.Center], the
+             * last line has 2.em height and the height from first line baseline to second line
+             * baseline is still 3.em:
              * <pre>
              * +--------+
              * |        |
@@ -138,13 +129,13 @@
             val LastLineBottom = Trim(FlagTrimBottom)
 
             /**
-             * Trim the space that would be added to the top of the first line and bottom of the last
-             * line as a result of the line height. This feature is available only when
+             * Trim the space that would be added to the top of the first line and bottom of the
+             * last line as a result of the line height. This feature is available only when
              * [PlatformParagraphStyle.includeFontPadding] is false.
              *
-             * For example, when line height is 3.em, and [Alignment] is
-             * [Alignment.Center], the first and last line has 2.em height and the height
-             * from first line baseline to second line baseline is still 3.em:
+             * For example, when line height is 3.em, and [Alignment] is [Alignment.Center], the
+             * first and last line has 2.em height and the height from first line baseline to second
+             * line baseline is still 3.em:
              * <pre>
              * +--------+
              * | Line1  |
@@ -160,9 +151,9 @@
             /**
              * Do not trim first line top or last line bottom.
              *
-             * For example, when line height is 3.em, and [Alignment] is
-             * [Alignment.Center], the first line height, last line height and the height
-             * from first line baseline to second line baseline are 3.em:
+             * For example, when line height is 3.em, and [Alignment] is [Alignment.Center], the
+             * first line height, last line height and the height from first line baseline to second
+             * line baseline are 3.em:
              * <pre>
              * +--------+
              * |        |
@@ -190,8 +181,8 @@
     /**
      * Defines how to align the line in the space provided by the line height.
      *
-     * @param topRatio the ratio of ascent to ascent+descent in percentage. Valid values are
-     * between 0f (inclusive) and 1f (inclusive).
+     * @param topRatio the ratio of ascent to ascent+descent in percentage. Valid values are between
+     *   0f (inclusive) and 1f (inclusive).
      */
     @kotlin.jvm.JvmInline
     value class Alignment constructor(internal val topRatio: Float) {
@@ -214,11 +205,11 @@
 
         companion object {
             /**
-             * Align the line to the top of the space reserved for that line. This means that all extra
-             * space as a result of line height is applied to the bottom of the line. When the provided
-             * line height value is smaller than the actual line height, the line will still be aligned
-             * to the top, therefore the required difference will be subtracted from the bottom of the
-             * line.
+             * Align the line to the top of the space reserved for that line. This means that all
+             * extra space as a result of line height is applied to the bottom of the line. When the
+             * provided line height value is smaller than the actual line height, the line will
+             * still be aligned to the top, therefore the required difference will be subtracted
+             * from the bottom of the line.
              *
              * For example, when line height is 3.em, the lines are aligned to the top of 3.em
              * height:
@@ -258,18 +249,18 @@
 
             /**
              * Align the line proportional to the ascent and descent values of the line. For example
-             * if ascent is 8 units of length, and descent is 2 units; an additional space of 10 units
-             * will be distributed as 8 units to top, and 2 units to the bottom of the line. This is
-             * the default behavior.
+             * if ascent is 8 units of length, and descent is 2 units; an additional space of 10
+             * units will be distributed as 8 units to top, and 2 units to the bottom of the line.
+             * This is the default behavior.
              */
             val Proportional = Alignment(topRatio = -1f)
 
             /**
              * Align the line to the bottom of the space reserved for that line. This means that all
              * extra space as a result of line height is applied to the top of the line. When the
-             * provided line height value is smaller than the actual line height, the line will still
-             * be aligned to the bottom, therefore the required difference will be subtracted from the
-             * top of the line.
+             * provided line height value is smaller than the actual line height, the line will
+             * still be aligned to the bottom, therefore the required difference will be subtracted
+             * from the top of the line.
              *
              * For example, when line height is 3.em, the lines are aligned to the bottom of 3.em
              * height:
diff --git a/compose/ui/ui-text/src/commonMain/kotlin/androidx/compose/ui/text/style/ResolvedTextDirection.kt b/compose/ui/ui-text/src/commonMain/kotlin/androidx/compose/ui/text/style/ResolvedTextDirection.kt
index 8e379e8..c6540b0 100644
--- a/compose/ui/ui-text/src/commonMain/kotlin/androidx/compose/ui/text/style/ResolvedTextDirection.kt
+++ b/compose/ui/ui-text/src/commonMain/kotlin/androidx/compose/ui/text/style/ResolvedTextDirection.kt
@@ -23,13 +23,9 @@
  * @see androidx.compose.ui.text.Paragraph.getBidiRunDirection
  */
 enum class ResolvedTextDirection {
-    /**
-     * Represents the text that is left-to-right.
-     */
+    /** Represents the text that is left-to-right. */
     Ltr,
 
-    /**
-     * Represents the text that is right-to-left.
-     */
+    /** Represents the text that is right-to-left. */
     Rtl
 }
diff --git a/compose/ui/ui-text/src/commonMain/kotlin/androidx/compose/ui/text/style/TextAlign.kt b/compose/ui/ui-text/src/commonMain/kotlin/androidx/compose/ui/text/style/TextAlign.kt
index 786ffa8..581ec9e 100644
--- a/compose/ui/ui-text/src/commonMain/kotlin/androidx/compose/ui/text/style/TextAlign.kt
+++ b/compose/ui/ui-text/src/commonMain/kotlin/androidx/compose/ui/text/style/TextAlign.kt
@@ -46,8 +46,7 @@
         val Center = TextAlign(3)
 
         /**
-         * Stretch lines of text that end with a soft line break to fill the width of
-         * the container.
+         * Stretch lines of text that end with a soft line break to fill the width of the container.
          *
          * Lines that end with hard line breaks are aligned towards the [Start] edge.
          */
@@ -58,7 +57,8 @@
          *
          * For Left to Right text ([ResolvedTextDirection.Ltr]), this is the left edge.
          *
-         * For Right to Left text ([ResolvedTextDirection.Rtl]), like Arabic, this is the right edge.
+         * For Right to Left text ([ResolvedTextDirection.Rtl]), like Arabic, this is the right
+         * edge.
          */
         val Start = TextAlign(5)
 
@@ -71,14 +71,12 @@
          */
         val End = TextAlign(6)
 
-        /**
-         * Return a list containing all possible values of TextAlign.
-         */
+        /** Return a list containing all possible values of TextAlign. */
         fun values(): List<TextAlign> = listOf(Left, Right, Center, Justify, Start, End)
 
         /**
-         * This represents an unset value, a usual replacement for "null" when a primitive value
-         * is desired.
+         * This represents an unset value, a usual replacement for "null" when a primitive value is
+         * desired.
          */
         val Unspecified = TextAlign(Int.MIN_VALUE)
     }
diff --git a/compose/ui/ui-text/src/commonMain/kotlin/androidx/compose/ui/text/style/TextDecoration.kt b/compose/ui/ui-text/src/commonMain/kotlin/androidx/compose/ui/text/style/TextDecoration.kt
index c107fbc..728ed48 100644
--- a/compose/ui/ui-text/src/commonMain/kotlin/androidx/compose/ui/text/style/TextDecoration.kt
+++ b/compose/ui/ui-text/src/commonMain/kotlin/androidx/compose/ui/text/style/TextDecoration.kt
@@ -20,31 +20,26 @@
 import androidx.compose.ui.util.fastFold
 import androidx.compose.ui.util.fastJoinToString
 
-/**
- * Defines a horizontal line to be drawn on the text.
- */
+/** Defines a horizontal line to be drawn on the text. */
 @Immutable
 class TextDecoration internal constructor(val mask: Int) {
 
     companion object {
-        @Stable
-        val None: TextDecoration = TextDecoration(0x0)
+        @Stable val None: TextDecoration = TextDecoration(0x0)
 
         /**
          * Draws a horizontal line below the text.
          *
          * @sample androidx.compose.ui.text.samples.TextDecorationUnderlineSample
          */
-        @Stable
-        val Underline: TextDecoration = TextDecoration(0x1)
+        @Stable val Underline: TextDecoration = TextDecoration(0x1)
 
         /**
          * Draws a horizontal line over the text.
          *
          * @sample androidx.compose.ui.text.samples.TextDecorationLineThroughSample
          */
-        @Stable
-        val LineThrough: TextDecoration = TextDecoration(0x2)
+        @Stable val LineThrough: TextDecoration = TextDecoration(0x2)
 
         /**
          * Creates a decoration that includes all the given decorations.
@@ -54,9 +49,7 @@
          * @param decorations The decorations to be added
          */
         fun combine(decorations: List<TextDecoration>): TextDecoration {
-            val mask = decorations.fastFold(0) { acc, decoration ->
-                acc or decoration.mask
-            }
+            val mask = decorations.fastFold(0) { acc, decoration -> acc or decoration.mask }
             return TextDecoration(mask)
         }
     }
diff --git a/compose/ui/ui-text/src/commonMain/kotlin/androidx/compose/ui/text/style/TextDirection.kt b/compose/ui/ui-text/src/commonMain/kotlin/androidx/compose/ui/text/style/TextDirection.kt
index 4ea31b3..7109a8f 100644
--- a/compose/ui/ui-text/src/commonMain/kotlin/androidx/compose/ui/text/style/TextDirection.kt
+++ b/compose/ui/ui-text/src/commonMain/kotlin/androidx/compose/ui/text/style/TextDirection.kt
@@ -37,44 +37,42 @@
     }
 
     companion object {
-        /**
-         * Always sets the text direction to be Left to Right.
-         */
+        /** Always sets the text direction to be Left to Right. */
         val Ltr = TextDirection(1)
 
-        /**
-         * Always sets the text direction to be Right to Left.
-         */
+        /** Always sets the text direction to be Right to Left. */
         val Rtl = TextDirection(2)
 
         /**
          * This value indicates that the text direction depends on the first strong directional
-         * character in the text according to the Unicode Bidirectional Algorithm.
-         * If no strong directional character is present, then
-         * [androidx.compose.ui.unit.LayoutDirection] is used to resolve the final TextDirection.
-         * * if used while creating a Paragraph object, [androidx.compose.ui.text.intl.LocaleList] will
-         * be used to resolve the direction as a fallback instead of
-         * [androidx.compose.ui.unit.LayoutDirection].
+         * character in the text according to the Unicode Bidirectional Algorithm. If no strong
+         * directional character is present, then [androidx.compose.ui.unit.LayoutDirection] is used
+         * to resolve the final TextDirection.
+         * * if used while creating a Paragraph object, [androidx.compose.ui.text.intl.LocaleList]
+         *   will be used to resolve the direction as a fallback instead of
+         *   [androidx.compose.ui.unit.LayoutDirection].
          */
         val Content = TextDirection(3)
 
         /**
          * This value indicates that the text direction depends on the first strong directional
          * character in the text according to the Unicode Bidirectional Algorithm. If no strong
-         * directional character is present, then Left to Right will be used as the default direction.
+         * directional character is present, then Left to Right will be used as the default
+         * direction.
          */
         val ContentOrLtr = TextDirection(4)
 
         /**
          * This value indicates that the text direction depends on the first strong directional
          * character in the text according to the Unicode Bidirectional Algorithm. If no strong
-         * directional character is present, then Right to Left will be used as the default direction.
+         * directional character is present, then Right to Left will be used as the default
+         * direction.
          */
         val ContentOrRtl = TextDirection(5)
 
         /**
-         * This represents an unset value, a usual replacement for "null" when a primitive value
-         * is desired.
+         * This represents an unset value, a usual replacement for "null" when a primitive value is
+         * desired.
          */
         val Unspecified = TextDirection(Int.MIN_VALUE)
     }
diff --git a/compose/ui/ui-text/src/commonMain/kotlin/androidx/compose/ui/text/style/TextForegroundStyle.kt b/compose/ui/ui-text/src/commonMain/kotlin/androidx/compose/ui/text/style/TextForegroundStyle.kt
index f21c244..47b3aa7 100644
--- a/compose/ui/ui-text/src/commonMain/kotlin/androidx/compose/ui/text/style/TextForegroundStyle.kt
+++ b/compose/ui/ui-text/src/commonMain/kotlin/androidx/compose/ui/text/style/TextForegroundStyle.kt
@@ -28,9 +28,8 @@
 
 /**
  * An internal interface to represent possible ways to draw Text e.g. color, brush. This interface
- * aims to unify unspecified versions of complementary drawing styles. There are some guarantees
- * as following;
- *
+ * aims to unify unspecified versions of complementary drawing styles. There are some guarantees as
+ * following;
  * - If [color] is not [Color.Unspecified], brush is null.
  * - If [brush] is not null, color is [Color.Unspecified].
  * - Both [color] can be [Color.Unspecified] and [brush] null, indicating that nothing is specified.
@@ -87,9 +86,7 @@
     }
 }
 
-private data class ColorStyle(
-    val value: Color
-) : TextForegroundStyle {
+private data class ColorStyle(val value: Color) : TextForegroundStyle {
     init {
         require(value.isSpecified) {
             "ColorStyle value must be specified, use TextForegroundStyle.Unspecified instead."
@@ -106,10 +103,8 @@
         get() = color.alpha
 }
 
-private data class BrushStyle(
-    val value: ShaderBrush,
-    override val alpha: Float
-) : TextForegroundStyle {
+private data class BrushStyle(val value: ShaderBrush, override val alpha: Float) :
+    TextForegroundStyle {
     override val color: Color
         get() = Color.Unspecified
 
@@ -138,10 +133,11 @@
     }
 }
 
-internal fun Color.modulate(alpha: Float): Color = when {
-    alpha.isNaN() || alpha >= 1f -> this
-    else -> this.copy(alpha = this.alpha * alpha)
-}
+internal fun Color.modulate(alpha: Float): Color =
+    when {
+        alpha.isNaN() || alpha >= 1f -> this
+        else -> this.copy(alpha = this.alpha * alpha)
+    }
 
 private fun Float.takeOrElse(block: () -> Float): Float {
     return if (this.isNaN()) block() else this
diff --git a/compose/ui/ui-text/src/commonMain/kotlin/androidx/compose/ui/text/style/TextGeometricTransform.kt b/compose/ui/ui-text/src/commonMain/kotlin/androidx/compose/ui/text/style/TextGeometricTransform.kt
index 0763615..4d89aaf 100644
--- a/compose/ui/ui-text/src/commonMain/kotlin/androidx/compose/ui/text/style/TextGeometricTransform.kt
+++ b/compose/ui/ui-text/src/commonMain/kotlin/androidx/compose/ui/text/style/TextGeometricTransform.kt
@@ -24,25 +24,18 @@
  * Define a geometric transformation on text.
  *
  * @param scaleX The scale of the text on the horizontal direction. The default value is 1.0f, i.e
- * no scaling.
- * @param skewX The shear of the text on the horizontal direction. A pixel at (x, y), where y is
- * the distance above baseline, will be transformed to (x + y * skewX, y). The default value is
- * 0.0f i.e. no skewing.
+ *   no scaling.
+ * @param skewX The shear of the text on the horizontal direction. A pixel at (x, y), where y is the
+ *   distance above baseline, will be transformed to (x + y * skewX, y). The default value is 0.0f
+ *   i.e. no skewing.
  */
 @Immutable
-class TextGeometricTransform(
-    val scaleX: Float = 1.0f,
-    val skewX: Float = 0f
-) {
+class TextGeometricTransform(val scaleX: Float = 1.0f, val skewX: Float = 0f) {
     companion object {
-        @Stable
-        internal val None = TextGeometricTransform(1.0f, 0.0f)
+        @Stable internal val None = TextGeometricTransform(1.0f, 0.0f)
     }
 
-    fun copy(
-        scaleX: Float = this.scaleX,
-        skewX: Float = this.skewX
-    ): TextGeometricTransform {
+    fun copy(scaleX: Float = this.scaleX, skewX: Float = this.skewX): TextGeometricTransform {
         return TextGeometricTransform(scaleX, skewX)
     }
 
diff --git a/compose/ui/ui-text/src/commonMain/kotlin/androidx/compose/ui/text/style/TextIndent.kt b/compose/ui/ui-text/src/commonMain/kotlin/androidx/compose/ui/text/style/TextIndent.kt
index ae93195..bd545aa 100644
--- a/compose/ui/ui-text/src/commonMain/kotlin/androidx/compose/ui/text/style/TextIndent.kt
+++ b/compose/ui/ui-text/src/commonMain/kotlin/androidx/compose/ui/text/style/TextIndent.kt
@@ -29,22 +29,13 @@
  * @param restLine the amount of indentation applied to every line except the first line.
  */
 @Immutable
-class TextIndent(
-    val firstLine: TextUnit = 0.sp,
-    val restLine: TextUnit = 0.sp
-) {
+class TextIndent(val firstLine: TextUnit = 0.sp, val restLine: TextUnit = 0.sp) {
     companion object {
-        /**
-         * Constant fot no text indent.
-         */
-        @Stable
-        val None = TextIndent()
+        /** Constant fot no text indent. */
+        @Stable val None = TextIndent()
     }
 
-    fun copy(
-        firstLine: TextUnit = this.firstLine,
-        restLine: TextUnit = this.restLine
-    ): TextIndent {
+    fun copy(firstLine: TextUnit = this.firstLine, restLine: TextUnit = this.restLine): TextIndent {
         return TextIndent(firstLine, restLine)
     }
 
@@ -70,13 +61,12 @@
 /**
  * Linearly interpolate between two [TextIndent]s.
  *
- * The [fraction] argument represents position on the timeline, with 0.0 meaning
- * that the interpolation has not started, returning [start] (or something
- * equivalent to [start]), 1.0 meaning that the interpolation has finished,
- * returning [stop] (or something equivalent to [stop]), and values in between
- * meaning that the interpolation is at the relevant point on the timeline
- * between [start] and [stop]. The interpolation can be extrapolated beyond 0.0 and
- * 1.0, so negative values and values greater than 1.0 are valid.
+ * The [fraction] argument represents position on the timeline, with 0.0 meaning that the
+ * interpolation has not started, returning [start] (or something equivalent to [start]), 1.0
+ * meaning that the interpolation has finished, returning [stop] (or something equivalent to
+ * [stop]), and values in between meaning that the interpolation is at the relevant point on the
+ * timeline between [start] and [stop]. The interpolation can be extrapolated beyond 0.0 and 1.0, so
+ * negative values and values greater than 1.0 are valid.
  */
 fun lerp(start: TextIndent, stop: TextIndent, fraction: Float): TextIndent {
     return TextIndent(
diff --git a/compose/ui/ui-text/src/commonMain/kotlin/androidx/compose/ui/text/style/TextOverflow.kt b/compose/ui/ui-text/src/commonMain/kotlin/androidx/compose/ui/text/style/TextOverflow.kt
index 8fc4117..97dc5fa 100644
--- a/compose/ui/ui-text/src/commonMain/kotlin/androidx/compose/ui/text/style/TextOverflow.kt
+++ b/compose/ui/ui-text/src/commonMain/kotlin/androidx/compose/ui/text/style/TextOverflow.kt
@@ -34,24 +34,24 @@
     companion object {
         /**
          * Clip the overflowing text to fix its container.
+         *
          * @sample androidx.compose.ui.text.samples.TextOverflowClipSample
          */
-        @Stable
-        val Clip = TextOverflow(1)
+        @Stable val Clip = TextOverflow(1)
 
         /**
          * Use an ellipsis to indicate that the text has overflowed.
+         *
          * @sample androidx.compose.ui.text.samples.TextOverflowEllipsisSample
          */
-        @Stable
-        val Ellipsis = TextOverflow(2)
+        @Stable val Ellipsis = TextOverflow(2)
 
         /**
-         * Display all text, even if there is not enough space in the specified bounds.
-         * When overflow is visible, text may be rendered outside the bounds of the composable
-         * displaying the text. This ensures that all text is displayed to the user, and is typically
-         * the right choice for most text display. It does mean that the text may visually occupy a
-         * region larger than the bounds of it's composable. This can lead to situations where text
+         * Display all text, even if there is not enough space in the specified bounds. When
+         * overflow is visible, text may be rendered outside the bounds of the composable displaying
+         * the text. This ensures that all text is displayed to the user, and is typically the right
+         * choice for most text display. It does mean that the text may visually occupy a region
+         * larger than the bounds of it's composable. This can lead to situations where text
          * displays outside the bounds of the background and clickable on a Text composable with a
          * fixed height and width.
          *
@@ -65,7 +65,6 @@
          * Note: text that expands past its bounds using `Visible` may be clipped by other modifiers
          * such as `Modifier.clipToBounds`.
          */
-        @Stable
-        val Visible = TextOverflow(3)
+        @Stable val Visible = TextOverflow(3)
     }
 }
diff --git a/compose/ui/ui-text/src/desktopMain/kotlin/androidx/compose/ui/text/ExpireAfterAccessCache.desktop.kt b/compose/ui/ui-text/src/desktopMain/kotlin/androidx/compose/ui/text/ExpireAfterAccessCache.desktop.kt
index eab8151..37dfccd 100644
--- a/compose/ui/ui-text/src/desktopMain/kotlin/androidx/compose/ui/text/ExpireAfterAccessCache.desktop.kt
+++ b/compose/ui/ui-text/src/desktopMain/kotlin/androidx/compose/ui/text/ExpireAfterAccessCache.desktop.kt
@@ -96,11 +96,7 @@
             } else {
                 checkEvicted(now)
                 val newVal = loader(key)
-                val entry = Entry(
-                    key = key,
-                    value = newVal,
-                    accessTime = now
-                )
+                val entry = Entry(key = key, value = newVal, accessTime = now)
                 map[key] = entry
                 accessQueue.putToHead(entry)
                 return newVal
diff --git a/compose/ui/ui-text/src/desktopMain/kotlin/androidx/compose/ui/text/font/FontSynthesis.desktop.kt b/compose/ui/ui-text/src/desktopMain/kotlin/androidx/compose/ui/text/font/FontSynthesis.desktop.kt
index 44b8f04..516d349 100644
--- a/compose/ui/ui-text/src/desktopMain/kotlin/androidx/compose/ui/text/font/FontSynthesis.desktop.kt
+++ b/compose/ui/ui-text/src/desktopMain/kotlin/androidx/compose/ui/text/font/FontSynthesis.desktop.kt
@@ -16,9 +16,7 @@
  * limitations under the License.
  */
 
-/**
- * Do not do font synthesis on desktop
- */
+/** Do not do font synthesis on desktop */
 internal actual fun FontSynthesis.synthesizeTypeface(
     typeface: Any,
     font: Font,
diff --git a/compose/ui/ui-text/src/desktopMain/kotlin/androidx/compose/ui/text/input/PlatformImeOptions.desktop.kt b/compose/ui/ui-text/src/desktopMain/kotlin/androidx/compose/ui/text/input/PlatformImeOptions.desktop.kt
index a5bc839..2764f82 100644
--- a/compose/ui/ui-text/src/desktopMain/kotlin/androidx/compose/ui/text/input/PlatformImeOptions.desktop.kt
+++ b/compose/ui/ui-text/src/desktopMain/kotlin/androidx/compose/ui/text/input/PlatformImeOptions.desktop.kt
@@ -18,8 +18,5 @@
 
 import androidx.compose.runtime.Immutable
 
-/**
- * Used to configure the platform specific IME options.
- */
-@Immutable
-actual class PlatformImeOptions
+/** Used to configure the platform specific IME options. */
+@Immutable actual class PlatformImeOptions
diff --git a/compose/ui/ui-text/src/desktopMain/kotlin/androidx/compose/ui/text/intl/DesktopPlatformLocale.desktop.kt b/compose/ui/ui-text/src/desktopMain/kotlin/androidx/compose/ui/text/intl/DesktopPlatformLocale.desktop.kt
index 5470465..de783fb 100644
--- a/compose/ui/ui-text/src/desktopMain/kotlin/androidx/compose/ui/text/intl/DesktopPlatformLocale.desktop.kt
+++ b/compose/ui/ui-text/src/desktopMain/kotlin/androidx/compose/ui/text/intl/DesktopPlatformLocale.desktop.kt
@@ -18,10 +18,11 @@
 
 import java.util.Locale
 
-internal actual fun createPlatformLocaleDelegate() = object : PlatformLocaleDelegate {
-    override val current: LocaleList
-        get() = LocaleList(listOf(Locale(Locale.getDefault())))
+internal actual fun createPlatformLocaleDelegate() =
+    object : PlatformLocaleDelegate {
+        override val current: LocaleList
+            get() = LocaleList(listOf(Locale(Locale.getDefault())))
 
-    override fun parseLanguageTag(languageTag: String): PlatformLocale =
-        Locale.forLanguageTag(languageTag)
-}
+        override fun parseLanguageTag(languageTag: String): PlatformLocale =
+            Locale.forLanguageTag(languageTag)
+    }
diff --git a/compose/ui/ui-text/src/desktopMain/kotlin/androidx/compose/ui/text/platform/DesktopFont.desktop.kt b/compose/ui/ui-text/src/desktopMain/kotlin/androidx/compose/ui/text/platform/DesktopFont.desktop.kt
index 9471053..383d3b3 100644
--- a/compose/ui/ui-text/src/desktopMain/kotlin/androidx/compose/ui/text/platform/DesktopFont.desktop.kt
+++ b/compose/ui/ui-text/src/desktopMain/kotlin/androidx/compose/ui/text/platform/DesktopFont.desktop.kt
@@ -48,10 +48,7 @@
             )
         Platform.MacOS ->
             mapOf(
-                FontFamily.SansSerif.name to listOf(
-                    "Helvetica Neue",
-                    "Helvetica"
-                ),
+                FontFamily.SansSerif.name to listOf("Helvetica Neue", "Helvetica"),
                 FontFamily.Serif.name to listOf("Times"),
                 FontFamily.Monospace.name to listOf("Courier"),
                 FontFamily.Cursive.name to listOf("Apple Chancery")
@@ -78,15 +75,14 @@
  * Defines a Font using resource name.
  *
  * @param name The resource name in classpath.
- * @param weight The weight of the font. The system uses this to match a font to a font request
- * that is given in a [androidx.compose.ui.text.SpanStyle].
+ * @param weight The weight of the font. The system uses this to match a font to a font request that
+ *   is given in a [androidx.compose.ui.text.SpanStyle].
  * @param style The style of the font, normal or italic. The system uses this to match a font to a
- * font request that is given in a [androidx.compose.ui.text.SpanStyle].
- *
+ *   font request that is given in a [androidx.compose.ui.text.SpanStyle].
  * @see FontFamily
  */
-
-class ResourceFont internal constructor(
+class ResourceFont
+internal constructor(
     val name: String,
     override val weight: FontWeight = FontWeight.Normal,
     override val style: FontStyle = FontStyle.Normal
@@ -126,11 +122,10 @@
  * Creates a Font using resource name.
  *
  * @param resource The resource name in classpath.
- * @param weight The weight of the font. The system uses this to match a font to a font request
- * that is given in a [androidx.compose.ui.text.SpanStyle].
+ * @param weight The weight of the font. The system uses this to match a font to a font request that
+ *   is given in a [androidx.compose.ui.text.SpanStyle].
  * @param style The style of the font, normal or italic. The system uses this to match a font to a
- * font request that is given in a [androidx.compose.ui.text.SpanStyle].
- *
+ *   font request that is given in a [androidx.compose.ui.text.SpanStyle].
  * @see FontFamily
  */
 fun Font(
@@ -143,14 +138,14 @@
  * Defines a Font using file path.
  *
  * @param file File path to font.
- * @param weight The weight of the font. The system uses this to match a font to a font request
- * that is given in a [androidx.compose.ui.text.SpanStyle].
+ * @param weight The weight of the font. The system uses this to match a font to a font request that
+ *   is given in a [androidx.compose.ui.text.SpanStyle].
  * @param style The style of the font, normal or italic. The system uses this to match a font to a
- * font request that is given in a [androidx.compose.ui.text.SpanStyle].
- *
+ *   font request that is given in a [androidx.compose.ui.text.SpanStyle].
  * @see FontFamily
  */
-class FileFont internal constructor(
+class FileFont
+internal constructor(
     val file: File,
     override val weight: FontWeight = FontWeight.Normal,
     override val style: FontStyle = FontStyle.Normal,
@@ -190,11 +185,10 @@
  * Creates a Font using file path.
  *
  * @param file File path to font.
- * @param weight The weight of the font. The system uses this to match a font to a font request
- * that is given in a [androidx.compose.ui.text.SpanStyle].
+ * @param weight The weight of the font. The system uses this to match a font to a font request that
+ *   is given in a [androidx.compose.ui.text.SpanStyle].
  * @param style The style of the font, normal or italic. The system uses this to match a font to a
- * font request that is given in a [androidx.compose.ui.text.SpanStyle].
- *
+ *   font request that is given in a [androidx.compose.ui.text.SpanStyle].
  * @see FontFamily
  */
 fun Font(
@@ -236,10 +230,9 @@
     )
 
 private fun typefaceResource(resourceName: String): SkTypeface {
-    val resource = Thread
-        .currentThread()
-        .contextClassLoader
-        .getResourceAsStream(resourceName) ?: error("Can't load font from $resourceName")
+    val resource =
+        Thread.currentThread().contextClassLoader.getResourceAsStream(resourceName)
+            ?: error("Can't load font from $resourceName")
     val bytes = resource.readAllBytes()
     return SkTypeface.makeFromData(Data.makeFromBytes(bytes))
 }
diff --git a/compose/ui/ui-text/src/desktopMain/kotlin/androidx/compose/ui/text/platform/DesktopStringDelegate.desktop.kt b/compose/ui/ui-text/src/desktopMain/kotlin/androidx/compose/ui/text/platform/DesktopStringDelegate.desktop.kt
index a610728..9d181ba 100644
--- a/compose/ui/ui-text/src/desktopMain/kotlin/androidx/compose/ui/text/platform/DesktopStringDelegate.desktop.kt
+++ b/compose/ui/ui-text/src/desktopMain/kotlin/androidx/compose/ui/text/platform/DesktopStringDelegate.desktop.kt
@@ -19,9 +19,7 @@
 import androidx.compose.ui.text.PlatformStringDelegate
 import androidx.compose.ui.text.intl.PlatformLocale
 
-/**
- * An Desktop implementation of StringDelegate
- */
+/** An Desktop implementation of StringDelegate */
 internal class DesktopStringDelegate : PlatformStringDelegate {
     override fun toUpperCase(string: String, locale: PlatformLocale): String =
         string.uppercase(locale)
@@ -30,16 +28,10 @@
         string.lowercase(locale)
 
     override fun capitalize(string: String, locale: PlatformLocale): String =
-        string.replaceFirstChar {
-            if (it.isLowerCase())
-                it.titlecase(locale)
-            else
-                it.toString()
-        }
+        string.replaceFirstChar { if (it.isLowerCase()) it.titlecase(locale) else it.toString() }
 
     override fun decapitalize(string: String, locale: PlatformLocale): String =
         string.replaceFirstChar { it.lowercase(locale) }
 }
 
-internal actual fun ActualStringDelegate(): PlatformStringDelegate =
-    DesktopStringDelegate()
+internal actual fun ActualStringDelegate(): PlatformStringDelegate = DesktopStringDelegate()
diff --git a/compose/ui/ui-text/src/desktopTest/kotlin/androidx/compose/ui/text/CacheTest.kt b/compose/ui/ui-text/src/desktopTest/kotlin/androidx/compose/ui/text/CacheTest.kt
index 9d1d6b6..131f5a8 100644
--- a/compose/ui/ui-text/src/desktopTest/kotlin/androidx/compose/ui/text/CacheTest.kt
+++ b/compose/ui/ui-text/src/desktopTest/kotlin/androidx/compose/ui/text/CacheTest.kt
@@ -23,6 +23,7 @@
 
 private class MockedTimeProvider : ExpireAfterAccessCache.TimeProvider {
     var currentTime: Long = 0
+
     override fun getTime() = currentTime
 }
 
@@ -32,17 +33,17 @@
 @RunWith(JUnit4::class)
 class CacheTest {
     private val time = MockedTimeProvider()
-    private val cache = ExpireAfterAccessCache<String, String>(
-        expireAfterNanos = 1_000_000_000L, // 1 second
-        timeProvider = time
-    )
+    private val cache =
+        ExpireAfterAccessCache<String, String>(
+            expireAfterNanos = 1_000_000_000L, // 1 second
+            timeProvider = time
+        )
+
     @Test
     fun single_key() {
         cache.get("k1") { "v1" }
-        Truth.assertThat(cache.accessQueue.head!!.key)
-            .isEqualTo("k1")
-        Truth.assertThat(cache.accessQueue.tail!!.key)
-            .isEqualTo("k1")
+        Truth.assertThat(cache.accessQueue.head!!.key).isEqualTo("k1")
+        Truth.assertThat(cache.accessQueue.tail!!.key).isEqualTo("k1")
 
         var valueFromCache = cache.get("k1") { "v1_2" }
         Truth.assertThat(valueFromCache).isEqualTo("v1")
@@ -52,8 +53,7 @@
         valueFromCache = cache.get("k1") { "v1_3" }
         Truth.assertThat(valueFromCache).isEqualTo("v1")
 
-        Truth.assertThat(cache.accessQueue.head!!.accessTime)
-            .isEqualTo(twoSecondsInNanos)
+        Truth.assertThat(cache.accessQueue.head!!.accessTime).isEqualTo(twoSecondsInNanos)
     }
 
     @Test
@@ -64,10 +64,8 @@
 
         cache.get("k2") { "v2" }
 
-        Truth.assertThat(cache.accessQueue.head!!.key)
-            .isEqualTo("k2")
-        Truth.assertThat(cache.accessQueue.tail!!.key)
-            .isEqualTo("k1")
+        Truth.assertThat(cache.accessQueue.head!!.key).isEqualTo("k2")
+        Truth.assertThat(cache.accessQueue.tail!!.key).isEqualTo("k1")
 
         time.currentTime += tenMillisInNanos
 
@@ -75,22 +73,17 @@
 
         Truth.assertThat(valueFromCache).isEqualTo("v1")
 
-        Truth.assertThat(cache.accessQueue.head!!.key)
-            .isEqualTo("k1")
-        Truth.assertThat(cache.accessQueue.tail!!.key)
-            .isEqualTo("k2")
+        Truth.assertThat(cache.accessQueue.head!!.key).isEqualTo("k1")
+        Truth.assertThat(cache.accessQueue.tail!!.key).isEqualTo("k2")
 
         // expiration
         time.currentTime += twoSecondsInNanos
         cache.get("k1") { "v1_3" }
 
-        Truth.assertThat(cache.accessQueue.head!!.key)
-            .isEqualTo("k1")
-        Truth.assertThat(cache.accessQueue.tail!!.key)
-            .isEqualTo("k1")
+        Truth.assertThat(cache.accessQueue.head!!.key).isEqualTo("k1")
+        Truth.assertThat(cache.accessQueue.tail!!.key).isEqualTo("k1")
 
-        Truth.assertThat(cache.map.size)
-            .isEqualTo(1)
+        Truth.assertThat(cache.map.size).isEqualTo(1)
     }
 
     @Test
@@ -99,31 +92,23 @@
         cache.get("k2") { "v2" }
         cache.get("k3") { "v3" }
 
-        Truth.assertThat(cache.accessQueue.head!!.key)
-            .isEqualTo("k3")
-        Truth.assertThat(cache.accessQueue.tail!!.key)
-            .isEqualTo("k1")
+        Truth.assertThat(cache.accessQueue.head!!.key).isEqualTo("k3")
+        Truth.assertThat(cache.accessQueue.tail!!.key).isEqualTo("k1")
 
         cache.get("k2") { "v2_2" }
 
-        Truth.assertThat(cache.accessQueue.head!!.key)
-            .isEqualTo("k2")
-        Truth.assertThat(cache.accessQueue.tail!!.key)
-            .isEqualTo("k1")
-        Truth.assertThat(cache.accessQueue.tail!!.nextInAccess!!.key)
-            .isEqualTo("k3")
+        Truth.assertThat(cache.accessQueue.head!!.key).isEqualTo("k2")
+        Truth.assertThat(cache.accessQueue.tail!!.key).isEqualTo("k1")
+        Truth.assertThat(cache.accessQueue.tail!!.nextInAccess!!.key).isEqualTo("k3")
 
         time.currentTime += twoSecondsInNanos
         cache.get("k3") { "v3_3" }
 
-        Truth.assertThat(cache.accessQueue.head!!.key)
-            .isEqualTo("k3")
-        Truth.assertThat(cache.accessQueue.head!!)
-            .isEqualTo(cache.accessQueue.tail!!)
+        Truth.assertThat(cache.accessQueue.head!!.key).isEqualTo("k3")
+        Truth.assertThat(cache.accessQueue.head!!).isEqualTo(cache.accessQueue.tail!!)
         Truth.assertThat(cache.accessQueue.tail!!.prevInAccess).isNull()
         Truth.assertThat(cache.accessQueue.tail!!.nextInAccess).isNull()
 
-        Truth.assertThat(cache.map.size)
-            .isEqualTo(1)
+        Truth.assertThat(cache.map.size).isEqualTo(1)
     }
 }
diff --git a/compose/ui/ui-text/src/desktopTest/kotlin/androidx/compose/ui/text/DesktopFontTest.kt b/compose/ui/ui-text/src/desktopTest/kotlin/androidx/compose/ui/text/DesktopFontTest.kt
index 7c60589..09b876e 100644
--- a/compose/ui/ui-text/src/desktopTest/kotlin/androidx/compose/ui/text/DesktopFontTest.kt
+++ b/compose/ui/ui-text/src/desktopTest/kotlin/androidx/compose/ui/text/DesktopFontTest.kt
@@ -33,35 +33,27 @@
 
 @RunWith(JUnit4::class)
 class DesktopFontTest {
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
     private val fontLoader = SkiaFontLoader()
 
     private val fontListFontFamily by lazy {
         FontFamily(
-            Font(
-                "font/sample_font.ttf"
-            ),
-            Font(
-                "font/test_400_italic.ttf",
-                style = FontStyle.Italic
-            )
+            Font("font/sample_font.ttf"),
+            Font("font/test_400_italic.ttf", style = FontStyle.Italic)
         )
     }
 
     private val loadedTypeface by lazy {
-        val bytes = Thread
-            .currentThread()
-            .contextClassLoader
-            .getResourceAsStream("font/sample_font.ttf")!!
-            .readAllBytes()
+        val bytes =
+            Thread.currentThread()
+                .contextClassLoader
+                .getResourceAsStream("font/sample_font.ttf")!!
+                .readAllBytes()
         Typeface.makeFromData(Data.makeFromBytes(bytes))
     }
 
-    private val loadedFontFamily by lazy {
-        FontFamily(Typeface(loadedTypeface))
-    }
+    private val loadedFontFamily by lazy { FontFamily(Typeface(loadedTypeface)) }
 
     @Test
     fun ensureRegistered() {
diff --git a/compose/ui/ui-text/src/desktopTest/kotlin/androidx/compose/ui/text/DesktopParagraphTest.kt b/compose/ui/ui-text/src/desktopTest/kotlin/androidx/compose/ui/text/DesktopParagraphTest.kt
index e110330..6cf61a1 100644
--- a/compose/ui/ui-text/src/desktopTest/kotlin/androidx/compose/ui/text/DesktopParagraphTest.kt
+++ b/compose/ui/ui-text/src/desktopTest/kotlin/androidx/compose/ui/text/DesktopParagraphTest.kt
@@ -40,18 +40,13 @@
 
 @RunWith(JUnit4::class)
 class DesktopParagraphTest {
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
     private val fontFamilyResolver = createFontFamilyResolver()
     private val defaultDensity = Density(density = 1f)
     private val fontFamilyMeasureFont =
         FontFamily(
-            Font(
-                "font/sample_font.ttf",
-                weight = FontWeight.Normal,
-                style = FontStyle.Normal
-            )
+            Font("font/sample_font.ttf", weight = FontWeight.Normal, style = FontStyle.Normal)
         )
 
     @Test
@@ -61,10 +56,7 @@
             val text = "abc"
             val fontSize = 50.sp
             val fontSizeInPx = fontSize.toPx()
-            val paragraph = simpleParagraph(
-                text = text,
-                style = TextStyle(fontSize = fontSize)
-            )
+            val paragraph = simpleParagraph(text = text, style = TextStyle(fontSize = fontSize))
 
             for (i in 0..text.length - 1) {
                 val box = paragraph.getBoundingBox(i)
@@ -84,13 +76,9 @@
             val text = "h\uD83E\uDDD1\uD83C\uDFFF\u200D\uD83E\uDDB0"
             val fontSize = 50.sp
             val fontSizeInPx = fontSize.toPx()
-            val paragraph = simpleParagraph(
-                text = text,
-                style = TextStyle(fontSize = 50.sp)
-            )
+            val paragraph = simpleParagraph(text = text, style = TextStyle(fontSize = 50.sp))
 
-            Truth.assertThat(paragraph.getBoundingBox(0))
-                .isEqualTo(Rect(0f, 0f, fontSizeInPx, 60f))
+            Truth.assertThat(paragraph.getBoundingBox(0)).isEqualTo(Rect(0f, 0f, fontSizeInPx, 60f))
 
             Truth.assertThat(paragraph.getBoundingBox(1))
                 .isEqualTo(Rect(fontSizeInPx, 0f, fontSizeInPx * 2.5f, 60f))
@@ -103,54 +91,34 @@
     @Test
     fun getLineForOffset() {
         val text = "ab\na"
-        val paragraph = simpleParagraph(
-            text = text,
-            style = TextStyle(fontSize = 50.sp)
-        )
+        val paragraph = simpleParagraph(text = text, style = TextStyle(fontSize = 50.sp))
 
-        Truth.assertThat(paragraph.getLineForOffset(2))
-            .isEqualTo(0)
-        Truth.assertThat(paragraph.getLineForOffset(3))
-            .isEqualTo(1)
+        Truth.assertThat(paragraph.getLineForOffset(2)).isEqualTo(0)
+        Truth.assertThat(paragraph.getLineForOffset(3)).isEqualTo(1)
     }
 
     @Test
     fun getLineEnd() {
         with(defaultDensity) {
             val text = ""
-            val paragraph = simpleParagraph(
-                text = text,
-                style = TextStyle(fontSize = 50.sp)
-            )
+            val paragraph = simpleParagraph(text = text, style = TextStyle(fontSize = 50.sp))
 
-            Truth.assertThat(paragraph.getLineEnd(0, true))
-                .isEqualTo(0)
+            Truth.assertThat(paragraph.getLineEnd(0, true)).isEqualTo(0)
         }
         with(defaultDensity) {
             val text = "ab\n\nc"
-            val paragraph = simpleParagraph(
-                text = text,
-                style = TextStyle(fontSize = 50.sp)
-            )
+            val paragraph = simpleParagraph(text = text, style = TextStyle(fontSize = 50.sp))
 
-            Truth.assertThat(paragraph.getLineEnd(0, true))
-                .isEqualTo(2)
-            Truth.assertThat(paragraph.getLineEnd(1, true))
-                .isEqualTo(3)
-            Truth.assertThat(paragraph.getLineEnd(2, true))
-                .isEqualTo(5)
+            Truth.assertThat(paragraph.getLineEnd(0, true)).isEqualTo(2)
+            Truth.assertThat(paragraph.getLineEnd(1, true)).isEqualTo(3)
+            Truth.assertThat(paragraph.getLineEnd(2, true)).isEqualTo(5)
         }
         with(defaultDensity) {
             val text = "ab\n"
-            val paragraph = simpleParagraph(
-                text = text,
-                style = TextStyle(fontSize = 50.sp)
-            )
+            val paragraph = simpleParagraph(text = text, style = TextStyle(fontSize = 50.sp))
 
-            Truth.assertThat(paragraph.getLineEnd(0, true))
-                .isEqualTo(2)
-            Truth.assertThat(paragraph.getLineEnd(1, true))
-                .isEqualTo(3)
+            Truth.assertThat(paragraph.getLineEnd(0, true)).isEqualTo(2)
+            Truth.assertThat(paragraph.getLineEnd(1, true)).isEqualTo(3)
         }
     }
 
@@ -172,11 +140,8 @@
             val fontSize = 50.sp
             val fontSizeInPx = fontSize.toPx()
             val width = text.length * fontSizeInPx
-            val paragraph = simpleParagraph(
-                text = text,
-                style = TextStyle(fontSize = fontSize),
-                width = width
-            )
+            val paragraph =
+                simpleParagraph(text = text, style = TextStyle(fontSize = fontSize), width = width)
 
             for (i in 0..ltrText.length) {
                 Truth.assertThat(paragraph.getHorizontalPosition(i, true))
@@ -199,14 +164,12 @@
             val fontSize = 50.sp
             val fontSizeInPx = fontSize.toPx()
             val width = text.length * fontSizeInPx
-            val paragraph = simpleParagraph(
-                text = text,
-                style = TextStyle(
-                    fontSize = fontSize,
-                    textDirection = TextDirection.Ltr
-                ),
-                width = width
-            )
+            val paragraph =
+                simpleParagraph(
+                    text = text,
+                    style = TextStyle(fontSize = fontSize, textDirection = TextDirection.Ltr),
+                    width = width
+                )
 
             for (i in ltrText.indices) {
                 Truth.assertThat(paragraph.getHorizontalPosition(i, false))
@@ -226,13 +189,11 @@
     @Test
     fun getWordBoundary_spaces() {
         val text = "ab cd  e"
-        val paragraph = simpleParagraph(
-            text = text,
-            style = TextStyle(
-                fontFamily = fontFamilyMeasureFont,
-                fontSize = 20.sp
+        val paragraph =
+            simpleParagraph(
+                text = text,
+                style = TextStyle(fontFamily = fontFamilyMeasureFont, fontSize = 20.sp)
             )
-        )
 
         val singleSpaceStartResult = paragraph.getWordBoundary(text.indexOf('b') + 1)
         Truth.assertThat(singleSpaceStartResult.start).isEqualTo(text.indexOf('a'))
@@ -279,10 +240,11 @@
 
     @Test
     fun `line heights`() {
-        val paragraph = simpleParagraph(
-            text = "aaa\n\naaa\n\n\naaa\n   \naaa",
-            style = TextStyle(fontSize = 50.sp)
-        )
+        val paragraph =
+            simpleParagraph(
+                text = "aaa\n\naaa\n\n\naaa\n   \naaa",
+                style = TextStyle(fontSize = 50.sp)
+            )
         val firstLineHeight = paragraph.getLineHeight(0)
 
         for (i in 1 until paragraph.lineCount) {
@@ -302,9 +264,7 @@
         return Paragraph(
             text = text,
             spanStyles = spanStyles,
-            style = TextStyle(
-                fontFamily = fontFamilyMeasureFont
-            ).merge(style),
+            style = TextStyle(fontFamily = fontFamilyMeasureFont).merge(style),
             maxLines = maxLines,
             ellipsis = ellipsis,
             constraints = Constraints(maxWidth = width.ceilToInt()),
@@ -322,9 +282,7 @@
         return ParagraphIntrinsics(
             text = text,
             spanStyles = spanStyles,
-            style = TextStyle(
-                fontFamily = fontFamilyMeasureFont
-            ).merge(style),
+            style = TextStyle(fontFamily = fontFamilyMeasureFont).merge(style),
             density = density ?: defaultDensity,
             fontFamilyResolver = fontFamilyResolver
         )
diff --git a/compose/ui/ui-text/src/jvmMain/kotlin/androidx/compose/ui/text/JvmAnnotatedString.jvm.kt b/compose/ui/ui-text/src/jvmMain/kotlin/androidx/compose/ui/text/JvmAnnotatedString.jvm.kt
index d500695..7a86459 100644
--- a/compose/ui/ui-text/src/jvmMain/kotlin/androidx/compose/ui/text/JvmAnnotatedString.jvm.kt
+++ b/compose/ui/ui-text/src/jvmMain/kotlin/androidx/compose/ui/text/JvmAnnotatedString.jvm.kt
@@ -42,16 +42,17 @@
         offsetMap.put(end, resultStr.length)
     }
 
-    val newSpanStyles = spanStylesOrNull?.fastMap {
-        // The offset map must have mapping entry from all style start, end position.
-        Range(it.item, offsetMap[it.start]!!, offsetMap[it.end]!!)
-    }
-    val newParaStyles = paragraphStylesOrNull?.fastMap {
-        Range(it.item, offsetMap[it.start]!!, offsetMap[it.end]!!)
-    }
-    val newAnnotations = annotations?.fastMap {
-        Range(it.item, offsetMap[it.start]!!, offsetMap[it.end]!!)
-    }
+    val newSpanStyles =
+        spanStylesOrNull?.fastMap {
+            // The offset map must have mapping entry from all style start, end position.
+            Range(it.item, offsetMap[it.start]!!, offsetMap[it.end]!!)
+        }
+    val newParaStyles =
+        paragraphStylesOrNull?.fastMap {
+            Range(it.item, offsetMap[it.start]!!, offsetMap[it.end]!!)
+        }
+    val newAnnotations =
+        annotations?.fastMap { Range(it.item, offsetMap[it.start]!!, offsetMap[it.end]!!) }
 
     return AnnotatedString(
         text = resultStr,
@@ -67,10 +68,7 @@
  * @param ranges The list of AnnotatedString.Range
  * @param target The output list
  */
-private fun collectRangeTransitions(
-    ranges: List<Range<*>>?,
-    target: SortedSet<Int>
-) {
+private fun collectRangeTransitions(ranges: List<Range<*>>?, target: SortedSet<Int>) {
     ranges?.fastFold(target) { acc, range ->
         acc.apply {
             add(range.start)
diff --git a/compose/ui/ui-text/src/jvmMain/kotlin/androidx/compose/ui/text/platform/Synchronization.jvm.kt b/compose/ui/ui-text/src/jvmMain/kotlin/androidx/compose/ui/text/platform/Synchronization.jvm.kt
index 684384a..24e41dd 100644
--- a/compose/ui/ui-text/src/jvmMain/kotlin/androidx/compose/ui/text/platform/Synchronization.jvm.kt
+++ b/compose/ui/ui-text/src/jvmMain/kotlin/androidx/compose/ui/text/platform/Synchronization.jvm.kt
@@ -16,8 +16,7 @@
 
 package androidx.compose.ui.text.platform
 
-@PublishedApi
-internal actual class SynchronizedObject
+@PublishedApi internal actual class SynchronizedObject
 
 internal actual fun createSynchronizedObject() = SynchronizedObject()
 
diff --git a/compose/ui/ui-text/src/skikoMain/kotlin/androidx/compose/ui/text/DesktopTextStyle.skiko.kt b/compose/ui/ui-text/src/skikoMain/kotlin/androidx/compose/ui/text/DesktopTextStyle.skiko.kt
index c78eb71..b70486c 100644
--- a/compose/ui/ui-text/src/skikoMain/kotlin/androidx/compose/ui/text/DesktopTextStyle.skiko.kt
+++ b/compose/ui/ui-text/src/skikoMain/kotlin/androidx/compose/ui/text/DesktopTextStyle.skiko.kt
@@ -16,17 +16,12 @@
 
 package androidx.compose.ui.text
 
-/**
- * Provides configuration options for behavior compatibility for TextStyle.
- */
+/** Provides configuration options for behavior compatibility for TextStyle. */
 actual class PlatformTextStyle {
     actual val spanStyle: PlatformSpanStyle?
     actual val paragraphStyle: PlatformParagraphStyle?
 
-    constructor(
-        spanStyle: PlatformSpanStyle?,
-        paragraphStyle: PlatformParagraphStyle?
-    ) {
+    constructor(spanStyle: PlatformSpanStyle?, paragraphStyle: PlatformParagraphStyle?) {
         this.spanStyle = spanStyle
         this.paragraphStyle = paragraphStyle
     }
@@ -52,9 +47,7 @@
     return PlatformTextStyle(spanStyle, paragraphStyle)
 }
 
-/**
- * Provides configuration options for behavior compatibility for SpanStyle.
- */
+/** Provides configuration options for behavior compatibility for SpanStyle. */
 actual class PlatformParagraphStyle {
     actual companion object {
         actual val Default: PlatformParagraphStyle = PlatformParagraphStyle()
@@ -76,9 +69,7 @@
     }
 }
 
-/**
- * Provides configuration options for behavior compatibility for SpanStyle.
- */
+/** Provides configuration options for behavior compatibility for SpanStyle. */
 actual class PlatformSpanStyle {
     actual companion object {
         actual val Default: PlatformSpanStyle = PlatformSpanStyle()
@@ -105,13 +96,12 @@
  *
  * This will not work well if the styles don't set the same fields.
  *
- * The [fraction] argument represents position on the timeline, with 0.0 meaning
- * that the interpolation has not started, returning [start] (or something
- * equivalent to [start]), 1.0 meaning that the interpolation has finished,
- * returning [stop] (or something equivalent to [stop]), and values in between
- * meaning that the interpolation is at the relevant point on the timeline
- * between [start] and [stop]. The interpolation can be extrapolated beyond 0.0 and
- * 1.0, so negative values and values greater than 1.0 are valid.
+ * The [fraction] argument represents position on the timeline, with 0.0 meaning that the
+ * interpolation has not started, returning [start] (or something equivalent to [start]), 1.0
+ * meaning that the interpolation has finished, returning [stop] (or something equivalent to
+ * [stop]), and values in between meaning that the interpolation is at the relevant point on the
+ * timeline between [start] and [stop]. The interpolation can be extrapolated beyond 0.0 and 1.0, so
+ * negative values and values greater than 1.0 are valid.
  */
 actual fun lerp(
     start: PlatformParagraphStyle,
@@ -126,13 +116,12 @@
  *
  * This will not work well if the styles don't set the same fields.
  *
- * The [fraction] argument represents position on the timeline, with 0.0 meaning
- * that the interpolation has not started, returning [start] (or something
- * equivalent to [start]), 1.0 meaning that the interpolation has finished,
- * returning [stop] (or something equivalent to [stop]), and values in between
- * meaning that the interpolation is at the relevant point on the timeline
- * between [start] and [stop]. The interpolation can be extrapolated beyond 0.0 and
- * 1.0, so negative values and values greater than 1.0 are valid.
+ * The [fraction] argument represents position on the timeline, with 0.0 meaning that the
+ * interpolation has not started, returning [start] (or something equivalent to [start]), 1.0
+ * meaning that the interpolation has finished, returning [stop] (or something equivalent to
+ * [stop]), and values in between meaning that the interpolation is at the relevant point on the
+ * timeline between [start] and [stop]. The interpolation can be extrapolated beyond 0.0 and 1.0, so
+ * negative values and values greater than 1.0 are valid.
  */
 actual fun lerp(
     start: PlatformSpanStyle,
diff --git a/compose/ui/ui-text/src/skikoMain/kotlin/androidx/compose/ui/text/Paragraph.skiko.kt b/compose/ui/ui-text/src/skikoMain/kotlin/androidx/compose/ui/text/Paragraph.skiko.kt
index e91f88b..9781139 100644
--- a/compose/ui/ui-text/src/skikoMain/kotlin/androidx/compose/ui/text/Paragraph.skiko.kt
+++ b/compose/ui/ui-text/src/skikoMain/kotlin/androidx/compose/ui/text/Paragraph.skiko.kt
@@ -41,37 +41,61 @@
     actual val didExceedMaxLines: Boolean
     actual val lineCount: Int
     actual val placeholderRects: List<Rect?>
+
     actual fun getPathForRange(start: Int, end: Int): Path
+
     actual fun getCursorRect(offset: Int): Rect
+
     actual fun getLineLeft(lineIndex: Int): Float
+
     actual fun getLineRight(lineIndex: Int): Float
+
     actual fun getLineTop(lineIndex: Int): Float
+
     actual fun getLineBaseline(lineIndex: Int): Float
+
     actual fun getLineBottom(lineIndex: Int): Float
+
     actual fun getLineHeight(lineIndex: Int): Float
+
     actual fun getLineWidth(lineIndex: Int): Float
+
     actual fun getLineStart(lineIndex: Int): Int
+
     actual fun getLineEnd(lineIndex: Int, visibleEnd: Boolean): Int
+
     actual fun isLineEllipsized(lineIndex: Int): Boolean
+
     actual fun getLineForOffset(offset: Int): Int
+
     actual fun getHorizontalPosition(offset: Int, usePrimaryDirection: Boolean): Float
+
     actual fun getParagraphDirection(offset: Int): ResolvedTextDirection
+
     actual fun getBidiRunDirection(offset: Int): ResolvedTextDirection
+
     actual fun getLineForVerticalPosition(vertical: Float): Int
+
     actual fun getOffsetForPosition(position: Offset): Int
+
     actual fun getRangeForRect(
         rect: Rect,
         granularity: TextGranularity,
         inclusionStrategy: TextInclusionStrategy
     ): TextRange
+
     actual fun getBoundingBox(offset: Int): Rect
+
     actual fun fillBoundingBoxes(
         range: TextRange,
         array: FloatArray,
         @IntRange(from = 0) arrayStart: Int
     )
+
     actual fun getWordBoundary(offset: Int): TextRange
+
     actual fun paint(canvas: Canvas, color: Color, shadow: Shadow?, textDecoration: TextDecoration?)
+
     actual fun paint(
         canvas: Canvas,
         color: Color,
@@ -80,6 +104,7 @@
         drawStyle: DrawStyle?,
         blendMode: BlendMode
     )
+
     actual fun paint(
         canvas: Canvas,
         brush: Brush,
diff --git a/compose/ui/ui-text/src/skikoMain/kotlin/androidx/compose/ui/text/SkiaParagraph.skiko.kt b/compose/ui/ui-text/src/skikoMain/kotlin/androidx/compose/ui/text/SkiaParagraph.skiko.kt
index 3238a01..a5da7fab 100644
--- a/compose/ui/ui-text/src/skikoMain/kotlin/androidx/compose/ui/text/SkiaParagraph.skiko.kt
+++ b/compose/ui/ui-text/src/skikoMain/kotlin/androidx/compose/ui/text/SkiaParagraph.skiko.kt
@@ -55,14 +55,11 @@
     private val layouter = paragraphIntrinsics.layouter()
 
     /**
-     * Paragraph isn't always immutable, it could be changed via [paint] method without
-     * rerunning layout
+     * Paragraph isn't always immutable, it could be changed via [paint] method without rerunning
+     * layout
      */
-    private var para = layouter.layoutParagraph(
-        width = width,
-        maxLines = maxLines,
-        ellipsis = ellipsisChar
-    )
+    private var para =
+        layouter.layoutParagraph(width = width, maxLines = maxLines, ellipsis = ellipsisChar)
 
     init {
         para.layout(width)
@@ -94,25 +91,18 @@
 
     override val lineCount: Int
         // workaround for https://bugs.chromium.org/p/skia/issues/detail?id=11321
-        get() = if (text == "") {
-            1
-        } else {
-            para.lineNumber.toInt()
-        }
-
-    override val placeholderRects: List<Rect?>
         get() =
-            para.rectsForPlaceholders.map {
-                it.rect.toComposeRect()
+            if (text == "") {
+                1
+            } else {
+                para.lineNumber.toInt()
             }
 
+    override val placeholderRects: List<Rect?>
+        get() = para.rectsForPlaceholders.map { it.rect.toComposeRect() }
+
     override fun getPathForRange(start: Int, end: Int): Path {
-        val boxes = para.getRectsForRange(
-            start,
-            end,
-            RectHeightMode.MAX,
-            RectWidthMode.MAX
-        )
+        val boxes = para.getRectsForRange(start, end, RectHeightMode.MAX, RectWidthMode.MAX)
         val path = Path()
         for (b in boxes) {
             path.asSkiaPath().addRect(b.rect)
@@ -178,8 +168,7 @@
             if (lineIndex > 0 && metrics.startIndex < lineMetrics[lineIndex - 1].endIndex) {
                 metrics.endIndex.toInt()
             } else if (
-                metrics.startIndex < text.length &&
-                text[metrics.startIndex.toInt()] == '\n'
+                metrics.startIndex < text.length && text[metrics.startIndex.toInt()] == '\n'
             ) {
                 metrics.startIndex.toInt()
             } else {
@@ -192,8 +181,7 @@
     override fun isLineEllipsized(lineIndex: Int) = false
 
     override fun getLineForOffset(offset: Int) =
-        lineMetricsForOffset(offset)?.run { lineNumber.toInt() }
-            ?: 0
+        lineMetricsForOffset(offset)?.run { lineNumber.toInt() } ?: 0
 
     override fun getLineForVerticalPosition(vertical: Float): Int {
         return 0
@@ -216,26 +204,24 @@
 
     // workaround for https://bugs.chromium.org/p/skia/issues/detail?id=11321 :(
     private val lineMetrics: Array<LineMetrics>
-        get() = if (text == "") {
-            val height = layouter.defaultHeight.toDouble()
-            arrayOf(
-                LineMetrics(
-                    0, 0, 0, 0, true,
-                    height, 0.0, height, height, 0.0, 0.0, height, 0
+        get() =
+            if (text == "") {
+                val height = layouter.defaultHeight.toDouble()
+                arrayOf(
+                    LineMetrics(0, 0, 0, 0, true, height, 0.0, height, height, 0.0, 0.0, height, 0)
                 )
-            )
-        } else {
-            @Suppress("UNCHECKED_CAST", "USELESS_CAST")
-            para.lineMetrics as Array<LineMetrics>
-        }
+            } else {
+                @Suppress("UNCHECKED_CAST", "USELESS_CAST")
+                para.lineMetrics as Array<LineMetrics>
+            }
 
     private fun getBoxForwardByOffset(offset: Int): TextBox? {
         var to = offset + 1
         while (to <= text.length) {
-            val box = para.getRectsForRange(
-                offset, to,
-                RectHeightMode.STRUT, RectWidthMode.TIGHT
-            ).firstOrNull()
+            val box =
+                para
+                    .getRectsForRange(offset, to, RectHeightMode.STRUT, RectWidthMode.TIGHT)
+                    .firstOrNull()
             if (box != null) {
                 return box
             }
@@ -247,10 +233,10 @@
     private fun getBoxBackwardByOffset(offset: Int, end: Int = offset): TextBox? {
         var from = offset - 1
         while (from >= 0) {
-            val box = para.getRectsForRange(
-                from, end,
-                RectHeightMode.STRUT, RectWidthMode.TIGHT
-            ).firstOrNull()
+            val box =
+                para
+                    .getRectsForRange(from, end, RectHeightMode.STRUT, RectWidthMode.TIGHT)
+                    .firstOrNull()
             when {
                 (box == null) -> from -= 1
                 (text.get(from) == '\n') -> {
@@ -301,13 +287,10 @@
 
     override fun getWordBoundary(offset: Int): TextRange {
         return when {
-            (text[offset].isLetterOrDigit()) -> para.getWordBoundary(offset).let {
-                TextRange(it.start, it.end)
-            }
+            (text[offset].isLetterOrDigit()) ->
+                para.getWordBoundary(offset).let { TextRange(it.start, it.end) }
             (text.getOrNull(offset - 1)?.isLetterOrDigit() ?: false) ->
-                para.getWordBoundary(offset - 1).let {
-                    TextRange(it.start, it.end)
-                }
+                para.getWordBoundary(offset - 1).let { TextRange(it.start, it.end) }
             else -> TextRange(offset, offset)
         }
     }
@@ -318,14 +301,15 @@
         shadow: Shadow?,
         textDecoration: TextDecoration?
     ) {
-        para = layouter.layoutParagraph(
-            width = width,
-            maxLines = maxLines,
-            ellipsis = ellipsisChar,
-            color = color,
-            shadow = shadow,
-            textDecoration = textDecoration
-        )
+        para =
+            layouter.layoutParagraph(
+                width = width,
+                maxLines = maxLines,
+                ellipsis = ellipsisChar,
+                color = color,
+                shadow = shadow,
+                textDecoration = textDecoration
+            )
 
         para.paint(canvas.nativeCanvas, 0.0f, 0.0f)
     }
@@ -338,14 +322,15 @@
         drawStyle: DrawStyle?,
         blendMode: BlendMode
     ) {
-        para = layouter.layoutParagraph(
-            width = width,
-            maxLines = maxLines,
-            ellipsis = ellipsisChar,
-            color = color,
-            shadow = shadow,
-            textDecoration = textDecoration
-        )
+        para =
+            layouter.layoutParagraph(
+                width = width,
+                maxLines = maxLines,
+                ellipsis = ellipsisChar,
+                color = color,
+                shadow = shadow,
+                textDecoration = textDecoration
+            )
 
         para.paint(canvas.nativeCanvas, 0.0f, 0.0f)
     }
@@ -362,6 +347,7 @@
     ) {
         throw UnsupportedOperationException(
             "Using brush for painting the paragraph is a separate functionality that " +
-                "is not supported on this platform")
+                "is not supported on this platform"
+        )
     }
 }
diff --git a/compose/ui/ui-text/src/skikoMain/kotlin/androidx/compose/ui/text/font/DelegatingFontLoaderForDeprecatedUsage.sikio.kt b/compose/ui/ui-text/src/skikoMain/kotlin/androidx/compose/ui/text/font/DelegatingFontLoaderForDeprecatedUsage.sikio.kt
index 8059b0c..91ab9cb 100644
--- a/compose/ui/ui-text/src/skikoMain/kotlin/androidx/compose/ui/text/font/DelegatingFontLoaderForDeprecatedUsage.sikio.kt
+++ b/compose/ui/ui-text/src/skikoMain/kotlin/androidx/compose/ui/text/font/DelegatingFontLoaderForDeprecatedUsage.sikio.kt
@@ -19,8 +19,8 @@
 
 import androidx.compose.ui.text.platform.FontLoader
 
-@Deprecated("This exists to bridge existing Font.ResourceLoader APIs, and should be " +
-    "removed with them",
+@Deprecated(
+    "This exists to bridge existing Font.ResourceLoader APIs, and should be " + "removed with them",
     replaceWith = ReplaceWith("createFontFamilyResolver()"),
 )
 internal actual fun createFontFamilyResolver(
diff --git a/compose/ui/ui-text/src/skikoMain/kotlin/androidx/compose/ui/text/font/FontFamilyResolver.sikio.kt b/compose/ui/ui-text/src/skikoMain/kotlin/androidx/compose/ui/text/font/FontFamilyResolver.sikio.kt
index 4827ba2..8a26d70 100644
--- a/compose/ui/ui-text/src/skikoMain/kotlin/androidx/compose/ui/text/font/FontFamilyResolver.sikio.kt
+++ b/compose/ui/ui-text/src/skikoMain/kotlin/androidx/compose/ui/text/font/FontFamilyResolver.sikio.kt
@@ -44,9 +44,9 @@
  *
  * Usages inside of Composition should use LocalFontFamilyResolver.current
  *
- * Any [kotlinx.coroutines.CoroutineExceptionHandler] provided will be called with
- * exceptions related to fallback font loading. These exceptions are not fatal, and indicate
- * that font fallback continued to the next font load.
+ * Any [kotlinx.coroutines.CoroutineExceptionHandler] provided will be called with exceptions
+ * related to fallback font loading. These exceptions are not fatal, and indicate that font fallback
+ * continued to the next font load.
  *
  * If no [kotlinx.coroutines.CoroutineExceptionHandler] is provided, a default implementation will
  * be added that ignores all exceptions.
@@ -54,22 +54,16 @@
  * @param coroutineContext context to launch async requests in during resolution.
  */
 @ExperimentalTextApi
-fun createFontFamilyResolver(
-    coroutineContext: CoroutineContext
-): FontFamily.Resolver {
+fun createFontFamilyResolver(coroutineContext: CoroutineContext): FontFamily.Resolver {
     return FontFamilyResolverImpl(
         SkiaFontLoader(),
         PlatformResolveInterceptor.Default,
         GlobalTypefaceRequestCache,
-        FontListFontFamilyTypefaceAdapter(
-            GlobalAsyncTypefaceCache,
-            coroutineContext
-        )
+        FontListFontFamilyTypefaceAdapter(GlobalAsyncTypefaceCache, coroutineContext)
     )
 }
-/**
- * For bridging between FontLoader and FontFamily.ResourceLoader. Can remove with FontLoader.
- */
+
+/** For bridging between FontLoader and FontFamily.ResourceLoader. Can remove with FontLoader. */
 @OptIn(ExperimentalTextApi::class)
 internal fun createFontFamilyResolver(fontCache: FontCache): FontFamily.Resolver {
     return FontFamilyResolverImpl(SkiaFontLoader(fontCache))
diff --git a/compose/ui/ui-text/src/skikoMain/kotlin/androidx/compose/ui/text/font/PlatformFontFamilyTypefaceAdapter.skiko.kt b/compose/ui/ui-text/src/skikoMain/kotlin/androidx/compose/ui/text/font/PlatformFontFamilyTypefaceAdapter.skiko.kt
index a5c4bb8..70cfaad 100644
--- a/compose/ui/ui-text/src/skikoMain/kotlin/androidx/compose/ui/text/font/PlatformFontFamilyTypefaceAdapter.skiko.kt
+++ b/compose/ui/ui-text/src/skikoMain/kotlin/androidx/compose/ui/text/font/PlatformFontFamilyTypefaceAdapter.skiko.kt
@@ -27,11 +27,12 @@
     ): TypefaceResult? {
         if (typefaceRequest.fontFamily is FontListFontFamily) return null
         val skiaFontLoader = (platformFontLoader as SkiaFontLoader)
-        val result = skiaFontLoader.loadPlatformTypes(
-            typefaceRequest.fontFamily ?: FontFamily.Default,
-            typefaceRequest.fontWeight,
-            typefaceRequest.fontStyle
-        )
+        val result =
+            skiaFontLoader.loadPlatformTypes(
+                typefaceRequest.fontFamily ?: FontFamily.Default,
+                typefaceRequest.fontWeight,
+                typefaceRequest.fontStyle
+            )
         return TypefaceResult.Immutable(result)
     }
 }
diff --git a/compose/ui/ui-text/src/skikoMain/kotlin/androidx/compose/ui/text/font/SkiaFontLoader.skiko.kt b/compose/ui/ui-text/src/skikoMain/kotlin/androidx/compose/ui/text/font/SkiaFontLoader.skiko.kt
index 7ed707a..6c9fb3e 100644
--- a/compose/ui/ui-text/src/skikoMain/kotlin/androidx/compose/ui/text/font/SkiaFontLoader.skiko.kt
+++ b/compose/ui/ui-text/src/skikoMain/kotlin/androidx/compose/ui/text/font/SkiaFontLoader.skiko.kt
@@ -25,9 +25,7 @@
 import androidx.compose.ui.text.platform.PlatformFont
 import org.jetbrains.skia.paragraph.FontCollection
 
-internal class SkiaFontLoader(
-    private val fontCache: FontCache = FontCache()
-) : PlatformFontLoader {
+internal class SkiaFontLoader(private val fontCache: FontCache = FontCache()) : PlatformFontLoader {
 
     val fontCollection: FontCollection
         get() = fontCache.fonts
@@ -45,9 +43,7 @@
             Blocking -> fontCache.load(font)
             OptionalLocal -> kotlin.runCatching { fontCache.load(font) }.getOrNull()
             Async -> throw UnsupportedOperationException("Unsupported Async font load path")
-            else -> throw IllegalArgumentException(
-                "Unknown loading type ${font.loadingStrategy}"
-            )
+            else -> throw IllegalArgumentException("Unknown loading type ${font.loadingStrategy}")
         }
     }
 
diff --git a/compose/ui/ui-text/src/skikoMain/kotlin/androidx/compose/ui/text/platform/ParagraphLayouter.skiko.kt b/compose/ui/ui-text/src/skikoMain/kotlin/androidx/compose/ui/text/platform/ParagraphLayouter.skiko.kt
index a020695..e6a8a31 100644
--- a/compose/ui/ui-text/src/skikoMain/kotlin/androidx/compose/ui/text/platform/ParagraphLayouter.skiko.kt
+++ b/compose/ui/ui-text/src/skikoMain/kotlin/androidx/compose/ui/text/platform/ParagraphLayouter.skiko.kt
@@ -30,8 +30,8 @@
 import org.jetbrains.skia.paragraph.Paragraph
 
 /**
- * The purpose of this class is to store already built paragraph and pass it between
- * different internal entities (from SkiaParagraphIntrinsics to SkiaParagraph).
+ * The purpose of this class is to store already built paragraph and pass it between different
+ * internal entities (from SkiaParagraphIntrinsics to SkiaParagraph).
  *
  * An alternative to passing and reusing existed paragraph is to build it again, but it is 2.5x
  * slower.
@@ -40,12 +40,10 @@
  *
  * Tests:
  *
- * val text = (1..100000).joinToString(" ")
- * reusedParagraph.layout(300f): 116.848500ms
+ * val text = (1..100000).joinToString(" ") reusedParagraph.layout(300f): 116.848500ms
  * builder.build().layout(300f): 288.302300ms
  *
- * text = (1..10000).joinToString(" ")
- * reusedParagraph.layout(300f): 10.004400ms
+ * text = (1..10000).joinToString(" ") reusedParagraph.layout(300f): 10.004400ms
  * builder.build().layout(300f): 23.421500ms
  */
 class ParagraphLayouter(
@@ -57,20 +55,22 @@
     density: Density,
     fontFamilyResolver: FontFamily.Resolver
 ) {
-    private val builder = ParagraphBuilder(
-        fontFamilyResolver = fontFamilyResolver,
-        text = text,
-        textStyle = style,
-        spanStyles = spanStyles,
-        placeholders = placeholders,
-        density = density,
-        textDirection = textDirection
-    )
+    private val builder =
+        ParagraphBuilder(
+            fontFamilyResolver = fontFamilyResolver,
+            text = text,
+            textStyle = style,
+            spanStyles = spanStyles,
+            placeholders = placeholders,
+            density = density,
+            textDirection = textDirection
+        )
     private var para = builder.build()
 
     private var width: Float = -1f
 
-    val defaultHeight get() = builder.defaultHeight
+    val defaultHeight
+        get() = builder.defaultHeight
 
     fun layoutParagraph(
         width: Float = this.width,
@@ -83,19 +83,20 @@
         val actualColor = color.takeOrElse { builder.textStyle.color }
         if (
             builder.maxLines != maxLines ||
-            builder.ellipsis != ellipsis ||
-            builder.textStyle.color != actualColor ||
-            builder.textStyle.shadow != shadow ||
-            builder.textStyle.textDecoration != textDecoration
+                builder.ellipsis != ellipsis ||
+                builder.textStyle.color != actualColor ||
+                builder.textStyle.shadow != shadow ||
+                builder.textStyle.textDecoration != textDecoration
         ) {
             this.width = width
             builder.maxLines = maxLines
             builder.ellipsis = ellipsis
-            builder.textStyle = builder.textStyle.copy(
-                color = actualColor,
-                shadow = shadow,
-                textDecoration = textDecoration
-            )
+            builder.textStyle =
+                builder.textStyle.copy(
+                    color = actualColor,
+                    shadow = shadow,
+                    textDecoration = textDecoration
+                )
             para = builder.build()
             para.layout(width)
         } else if (this.width != width) {
diff --git a/compose/ui/ui-text/src/skikoMain/kotlin/androidx/compose/ui/text/platform/PlatformFont.skiko.kt b/compose/ui/ui-text/src/skikoMain/kotlin/androidx/compose/ui/text/platform/PlatformFont.skiko.kt
index 9cc0c21..0fb3774 100644
--- a/compose/ui/ui-text/src/skikoMain/kotlin/androidx/compose/ui/text/platform/PlatformFont.skiko.kt
+++ b/compose/ui/ui-text/src/skikoMain/kotlin/androidx/compose/ui/text/platform/PlatformFont.skiko.kt
@@ -42,14 +42,14 @@
  *
  * @param identity Unique identity for a font. Used internally to distinguish fonts.
  * @param data Byte array with loaded font data.
- * @param weight The weight of the font. The system uses this to match a font to a font request
- * that is given in a [androidx.compose.ui.text.SpanStyle].
+ * @param weight The weight of the font. The system uses this to match a font to a font request that
+ *   is given in a [androidx.compose.ui.text.SpanStyle].
  * @param style The style of the font, normal or italic. The system uses this to match a font to a
- * font request that is given in a [androidx.compose.ui.text.SpanStyle].
- *
+ *   font request that is given in a [androidx.compose.ui.text.SpanStyle].
  * @see FontFamily
  */
-class LoadedFont internal constructor(
+class LoadedFont
+internal constructor(
     override val identity: String,
     val data: ByteArray,
     override val weight: FontWeight,
@@ -87,11 +87,10 @@
  *
  * @param identity Unique identity for a font. Used internally to distinguish fonts.
  * @param data Byte array with loaded font data.
- * @param weight The weight of the font. The system uses this to match a font to a font request
- * that is given in a [androidx.compose.ui.text.SpanStyle].
+ * @param weight The weight of the font. The system uses this to match a font to a font request that
+ *   is given in a [androidx.compose.ui.text.SpanStyle].
  * @param style The style of the font, normal or italic. The system uses this to match a font to a
- * font request that is given in a [androidx.compose.ui.text.SpanStyle].
- *
+ *   font request that is given in a [androidx.compose.ui.text.SpanStyle].
  * @see FontFamily
  */
 fun Font(
@@ -101,10 +100,7 @@
     style: FontStyle = FontStyle.Normal
 ): Font = LoadedFont(identity, data, weight, style)
 
-internal class SkiaBackedTypeface(
-    val alias: String?,
-    val nativeTypeface: SkTypeface
-) : Typeface {
+internal class SkiaBackedTypeface(val alias: String?, val nativeTypeface: SkTypeface) : Typeface {
     override val fontFamily: FontFamily? = null
 }
 
@@ -215,4 +211,5 @@
 }
 
 internal expect val typefacesCache: Cache<String, SkTypeface>
+
 internal expect fun loadFromTypefacesCache(font: Font): SkTypeface
diff --git a/compose/ui/ui-text/src/skikoMain/kotlin/androidx/compose/ui/text/platform/SkiaParagraph.skiko.kt b/compose/ui/ui-text/src/skikoMain/kotlin/androidx/compose/ui/text/platform/SkiaParagraph.skiko.kt
index 639186d..7f3f1f0 100644
--- a/compose/ui/ui-text/src/skikoMain/kotlin/androidx/compose/ui/text/platform/SkiaParagraph.skiko.kt
+++ b/compose/ui/ui-text/src/skikoMain/kotlin/androidx/compose/ui/text/platform/SkiaParagraph.skiko.kt
@@ -72,8 +72,11 @@
 @Suppress("DEPRECATION")
 @Deprecated(
     "Font.ResourceLoader is deprecated, instead pass FontFamily.Resolver",
-    replaceWith = ReplaceWith("ActualParagraph(text, style, spanStyles, placeholders, " +
-        "maxLines, ellipsis, width, density, fontFamilyResolver)"),
+    replaceWith =
+        ReplaceWith(
+            "ActualParagraph(text, style, spanStyles, placeholders, " +
+                "maxLines, ellipsis, width, density, fontFamilyResolver)"
+        ),
 )
 internal actual fun ActualParagraph(
     text: String,
@@ -85,19 +88,20 @@
     width: Float,
     density: Density,
     @Suppress("DEPRECATION") resourceLoader: Font.ResourceLoader
-): Paragraph = SkiaParagraph(
-    SkiaParagraphIntrinsics(
-        text,
-        style,
-        spanStyles,
-        placeholders,
-        density,
-        createFontFamilyResolver(resourceLoader)
-    ),
-    maxLines,
-    ellipsis,
-    Constraints(maxWidth = width.ceilToInt())
-)
+): Paragraph =
+    SkiaParagraph(
+        SkiaParagraphIntrinsics(
+            text,
+            style,
+            spanStyles,
+            placeholders,
+            density,
+            createFontFamilyResolver(resourceLoader)
+        ),
+        maxLines,
+        ellipsis,
+        Constraints(maxWidth = width.ceilToInt())
+    )
 
 internal actual fun ActualParagraph(
     text: String,
@@ -109,19 +113,13 @@
     constraints: Constraints,
     density: Density,
     fontFamilyResolver: FontFamily.Resolver
-): Paragraph = SkiaParagraph(
-    SkiaParagraphIntrinsics(
-        text,
-        style,
-        spanStyles,
-        placeholders,
-        density,
-        fontFamilyResolver
-    ),
-    maxLines,
-    ellipsis,
-    constraints
-)
+): Paragraph =
+    SkiaParagraph(
+        SkiaParagraphIntrinsics(text, style, spanStyles, placeholders, density, fontFamilyResolver),
+        maxLines,
+        ellipsis,
+        constraints
+    )
 
 @Suppress("UNUSED_PARAMETER")
 internal actual fun ActualParagraph(
@@ -129,12 +127,8 @@
     maxLines: Int,
     ellipsis: Boolean,
     constraints: Constraints
-): Paragraph = SkiaParagraph(
-    paragraphIntrinsics as SkiaParagraphIntrinsics,
-    maxLines,
-    ellipsis,
-    constraints
-)
+): Paragraph =
+    SkiaParagraph(paragraphIntrinsics as SkiaParagraphIntrinsics, maxLines, ellipsis, constraints)
 
 private fun fontSizeInHierarchy(density: Density, base: Float, other: TextUnit): Float {
     return when {
@@ -165,7 +159,10 @@
     var shadow: Shadow?
 ) {
 
-    constructor(density: Density, spanStyle: SpanStyle) : this(
+    constructor(
+        density: Density,
+        spanStyle: SpanStyle
+    ) : this(
         color = spanStyle.color,
         fontSize = with(density) { spanStyle.fontSize.toPx() },
         fontWeight = spanStyle.fontWeight,
@@ -173,13 +170,12 @@
         fontSynthesis = spanStyle.fontSynthesis,
         fontFamily = spanStyle.fontFamily,
         fontFeatureSettings = spanStyle.fontFeatureSettings,
-        letterSpacing = if (spanStyle.letterSpacing.isUnspecified) {
-            null
-        } else {
-            with(density) {
-                spanStyle.letterSpacing.toPx()
-            }
-        },
+        letterSpacing =
+            if (spanStyle.letterSpacing.isUnspecified) {
+                null
+            } else {
+                with(density) { spanStyle.letterSpacing.toPx() }
+            },
         baselineShift = spanStyle.baselineShift,
         textGeometricTransform = spanStyle.textGeometricTransform,
         localeList = spanStyle.localeList,
@@ -194,37 +190,28 @@
         if (color != Color.Unspecified) {
             res.color = color.toArgb()
         }
-        fontStyle?.let {
-            res.fontStyle = it.toSkFontStyle()
-        }
-        textDecoration?.let {
-            res.decorationStyle = it.toSkDecorationStyle(this.color)
-        }
+        fontStyle?.let { res.fontStyle = it.toSkFontStyle() }
+        textDecoration?.let { res.decorationStyle = it.toSkDecorationStyle(this.color) }
         if (background != Color.Unspecified) {
-            res.background = Paint().also {
-                it.color = background.toArgb()
-            }
+            res.background = Paint().also { it.color = background.toArgb() }
         }
-        fontWeight?.let {
-            res.fontStyle = res.fontStyle.withWeight(it.weight)
-        }
-        shadow?.let {
-            res.addShadow(it.toSkShadow())
-        }
+        fontWeight?.let { res.fontStyle = res.fontStyle.withWeight(it.weight) }
+        shadow?.let { res.addShadow(it.toSkShadow()) }
 
-        letterSpacing?.let {
-            res.letterSpacing = it
-        }
+        letterSpacing?.let { res.letterSpacing = it }
 
         res.fontSize = fontSize
         fontFamily?.let {
             @Suppress("UNCHECKED_CAST")
-            val resolved = fontFamilyResolver.resolve(
-                it,
-                fontWeight ?: FontWeight.Normal,
-                fontStyle ?: FontStyle.Normal,
-                fontSynthesis ?: FontSynthesis.None
-            ).value as FontLoadResult
+            val resolved =
+                fontFamilyResolver
+                    .resolve(
+                        it,
+                        fontWeight ?: FontWeight.Normal,
+                        fontStyle ?: FontStyle.Normal,
+                        fontSynthesis ?: FontSynthesis.None
+                    )
+                    .value as FontLoadResult
             res.fontFamilies = resolved.aliases.toTypedArray()
         }
         return res
@@ -243,12 +230,9 @@
         other.fontFeatureSettings?.let { fontFeatureSettings = it }
         if (!other.letterSpacing.isUnspecified) {
             when {
-                other.letterSpacing.isEm ->
-                    letterSpacing = fontSize * other.letterSpacing.value
+                other.letterSpacing.isEm -> letterSpacing = fontSize * other.letterSpacing.value
                 other.letterSpacing.isSp ->
-                    letterSpacing = with(density) {
-                        other.letterSpacing.toPx()
-                    }
+                    letterSpacing = with(density) { other.letterSpacing.toPx() }
                 else -> throw UnsupportedOperationException()
             }
         }
@@ -286,23 +270,19 @@
     private lateinit var ops: List<Op>
 
     /**
-     * SkParagraph styles model doesn't match Compose's one.
-     * SkParagraph has only a stack-based push/pop styles interface that works great with Span
-     * trees.
-     * But in Compose we have a list of SpanStyles attached to arbitrary ranges, possibly
-     * overlapped, where a position in the list denotes style's priority
-     * We map Compose styles to SkParagraph styles by projecting every range start/end to single
-     * positions line and maintaining a list of active styles while building a paragraph. This list
-     * of active styles is being compiled into single SkParagraph's style for every chunk of text
+     * SkParagraph styles model doesn't match Compose's one. SkParagraph has only a stack-based
+     * push/pop styles interface that works great with Span trees. But in Compose we have a list of
+     * SpanStyles attached to arbitrary ranges, possibly overlapped, where a position in the list
+     * denotes style's priority We map Compose styles to SkParagraph styles by projecting every
+     * range start/end to single positions line and maintaining a list of active styles while
+     * building a paragraph. This list of active styles is being compiled into single SkParagraph's
+     * style for every chunk of text
      */
     @OptIn(ExperimentalTextApi::class)
     fun build(): SkParagraph {
         initialStyle = textStyle.toSpanStyle().withDefaultFontSize()
         defaultStyle = ComputedStyle(density, initialStyle)
-        ops = makeOps(
-            spanStyles,
-            placeholders
-        )
+        ops = makeOps(spanStyles, placeholders)
 
         var pos = 0
         val ps = textStyleToParagraphStyle(textStyle, defaultStyle)
@@ -315,10 +295,11 @@
         // this downcast is always safe because of sealed types and we control construction
         @OptIn(ExperimentalTextApi::class)
         val platformFontLoader = (fontFamilyResolver as FontFamilyResolverImpl).platformFontLoader
-        val fontCollection = when (platformFontLoader) {
-            is SkiaFontLoader -> platformFontLoader.fontCollection
-            else -> throw IllegalStateException("Unsupported font loader $platformFontLoader")
-        }
+        val fontCollection =
+            when (platformFontLoader) {
+                is SkiaFontLoader -> platformFontLoader.fontCollection
+                else -> throw IllegalStateException("Unsupported font loader $platformFontLoader")
+            }
 
         val pb = SkParagraphBuilder(ps, fontCollection)
 
@@ -345,9 +326,9 @@
                         PlaceholderStyle(
                             op.width,
                             op.height,
-                            op.cut.placeholder.placeholderVerticalAlign
-                                .toSkPlaceholderAlignment(),
-                            // TODO: figure out how exactly we have to work with BaselineMode & offset
+                            op.cut.placeholder.placeholderVerticalAlign.toSkPlaceholderAlignment(),
+                            // TODO: figure out how exactly we have to work with BaselineMode &
+                            // offset
                             BaselineMode.ALPHABETIC,
                             0f
                         )
@@ -372,10 +353,7 @@
     private sealed class Op {
         abstract val position: Int
 
-        data class StyleAdd(
-            override val position: Int,
-            val style: ComputedStyle
-        ) : Op()
+        data class StyleAdd(override val position: Int, val style: ComputedStyle) : Op()
 
         data class PutPlaceholder(
             val cut: Cut.PutPlaceholder,
@@ -385,9 +363,7 @@
             override val position: Int by cut::position
         }
 
-        data class EndPlaceholder(
-            val cut: Cut.EndPlaceholder
-        ) : Op() {
+        data class EndPlaceholder(val cut: Cut.EndPlaceholder) : Op() {
             override val position: Int by cut::position
         }
     }
@@ -395,15 +371,9 @@
     private sealed class Cut {
         abstract val position: Int
 
-        data class StyleAdd(
-            override val position: Int,
-            val style: SpanStyle
-        ) : Cut()
+        data class StyleAdd(override val position: Int, val style: SpanStyle) : Cut()
 
-        data class StyleRemove(
-            override val position: Int,
-            val style: SpanStyle
-        ) : Cut()
+        data class StyleRemove(override val position: Int, val style: SpanStyle) : Cut()
 
         data class PutPlaceholder(
             override val position: Int,
@@ -453,23 +423,25 @@
                 }
                 cut is Cut.PutPlaceholder -> {
                     val currentStyle = mergeStyles(activeStyles)
-                    val op = Op.PutPlaceholder(
-                        cut = cut,
-                        width = fontSizeInHierarchy(
-                            density,
-                            currentStyle.fontSize,
-                            cut.placeholder.width
-                        ),
-                        height = fontSizeInHierarchy(
-                            density,
-                            currentStyle.fontSize,
-                            cut.placeholder.height
-                        ),
-                    )
+                    val op =
+                        Op.PutPlaceholder(
+                            cut = cut,
+                            width =
+                                fontSizeInHierarchy(
+                                    density,
+                                    currentStyle.fontSize,
+                                    cut.placeholder.width
+                                ),
+                            height =
+                                fontSizeInHierarchy(
+                                    density,
+                                    currentStyle.fontSize,
+                                    cut.placeholder.height
+                                ),
+                        )
                     ops.add(op)
                 }
-                cut is Cut.EndPlaceholder ->
-                    ops.add(Op.EndPlaceholder(cut))
+                cut is Cut.EndPlaceholder -> ops.add(Op.EndPlaceholder(cut))
             }
         }
         return ops
@@ -498,25 +470,20 @@
     ): ParagraphStyle {
         val pStyle = ParagraphStyle()
         pStyle.textStyle = makeSkTextStyle(computedStyle)
-        style.textAlign.let {
-            pStyle.alignment = it.toSkAlignment()
-        }
+        style.textAlign.let { pStyle.alignment = it.toSkAlignment() }
 
         if (style.lineHeight.isSpecified) {
             val strutStyle = StrutStyle()
 
             strutStyle.isEnabled = true
             strutStyle.isHeightOverridden = true
-            val fontSize = with(density) {
-                style.fontSize.orDefaultFontSize().toPx()
-            }
-            val lineHeight = when {
-                style.lineHeight.isSp -> with(density) {
-                    style.lineHeight.toPx()
+            val fontSize = with(density) { style.fontSize.orDefaultFontSize().toPx() }
+            val lineHeight =
+                when {
+                    style.lineHeight.isSp -> with(density) { style.lineHeight.toPx() }
+                    style.lineHeight.isEm -> fontSize * style.lineHeight.value
+                    else -> error("Unexpected size in textStyleToParagraphStyle")
                 }
-                style.lineHeight.isEm -> fontSize * style.lineHeight.value
-                else -> error("Unexpected size in textStyleToParagraphStyle")
-            }
             strutStyle.height = lineHeight / fontSize
             pStyle.strutStyle = strutStyle
         }
@@ -525,46 +492,44 @@
     }
 
     private fun makeSkTextStyle(style: ComputedStyle): SkTextStyle {
-        return skTextStylesCache.getOrPut(style) {
-            style.toSkTextStyle(fontFamilyResolver)
-        }
+        return skTextStylesCache.getOrPut(style) { style.toSkTextStyle(fontFamilyResolver) }
     }
 
     @OptIn(ExperimentalTextApi::class)
     internal val defaultFont by lazy {
-        val loadResult = textStyle.fontFamily?.let {
-            @Suppress("UNCHECKED_CAST")
-            fontFamilyResolver.resolve(
-                it,
-                textStyle.fontWeight ?: FontWeight.Normal,
-                textStyle.fontStyle ?: FontStyle.Normal,
-                textStyle.fontSynthesis ?: FontSynthesis.All
-            ).value as FontLoadResult
-        }
+        val loadResult =
+            textStyle.fontFamily?.let {
+                @Suppress("UNCHECKED_CAST")
+                fontFamilyResolver
+                    .resolve(
+                        it,
+                        textStyle.fontWeight ?: FontWeight.Normal,
+                        textStyle.fontStyle ?: FontStyle.Normal,
+                        textStyle.fontSynthesis ?: FontSynthesis.All
+                    )
+                    .value as FontLoadResult
+            }
         SkFont(loadResult?.typeface, defaultStyle.fontSize)
     }
 
-    internal val defaultHeight by lazy {
-        defaultFont.metrics.height
-    }
+    internal val defaultHeight by lazy { defaultFont.metrics.height }
 }
 
-private fun TextUnit.orDefaultFontSize() = when {
-    isUnspecified -> DefaultFontSize
-    isEm -> DefaultFontSize * value
-    else -> this
-}
+private fun TextUnit.orDefaultFontSize() =
+    when {
+        isUnspecified -> DefaultFontSize
+        isEm -> DefaultFontSize * value
+        else -> this
+    }
 
 private fun SpanStyle.withDefaultFontSize(): SpanStyle {
     val fontSize = this.fontSize.orDefaultFontSize()
-    val letterSpacing = when {
-        this.letterSpacing.isEm -> fontSize * this.letterSpacing.value
-        else -> this.letterSpacing
-    }
-    return this.copy(
-        fontSize = fontSize,
-        letterSpacing = letterSpacing
-    )
+    val letterSpacing =
+        when {
+            this.letterSpacing.isEm -> fontSize * this.letterSpacing.value
+            else -> this.letterSpacing
+        }
+    return this.copy(fontSize = fontSize, letterSpacing = letterSpacing)
 }
 
 fun FontStyle.toSkFontStyle(): SkFontStyle {
diff --git a/compose/ui/ui-text/src/skikoMain/kotlin/androidx/compose/ui/text/platform/SkiaParagraphIntrinsics.skiko.kt b/compose/ui/ui-text/src/skikoMain/kotlin/androidx/compose/ui/text/platform/SkiaParagraphIntrinsics.skiko.kt
index 0a94be1..cb581d4 100644
--- a/compose/ui/ui-text/src/skikoMain/kotlin/androidx/compose/ui/text/platform/SkiaParagraphIntrinsics.skiko.kt
+++ b/compose/ui/ui-text/src/skikoMain/kotlin/androidx/compose/ui/text/platform/SkiaParagraphIntrinsics.skiko.kt
@@ -34,14 +34,7 @@
     density: Density,
     fontFamilyResolver: FontFamily.Resolver
 ): ParagraphIntrinsics =
-    SkiaParagraphIntrinsics(
-        text,
-        style,
-        spanStyles,
-        placeholders,
-        density,
-        fontFamilyResolver
-    )
+    SkiaParagraphIntrinsics(text, style, spanStyles, placeholders, density, fontFamilyResolver)
 
 internal class SkiaParagraphIntrinsics(
     val text: String,
@@ -61,12 +54,20 @@
         return layouter
     }
 
-    private fun newLayouter() = ParagraphLayouter(
-        text, textDirection, style, spanStyles, placeholders, density, fontFamilyResolver
-    )
+    private fun newLayouter() =
+        ParagraphLayouter(
+            text,
+            textDirection,
+            style,
+            spanStyles,
+            placeholders,
+            density,
+            fontFamilyResolver
+        )
 
     override var minIntrinsicWidth = 0f
         private set
+
     override var maxIntrinsicWidth = 0f
         private set
 
diff --git a/compose/ui/ui-text/src/skikoMain/kotlin/androidx/compose/ui/text/style/LineBreak.skiko.kt b/compose/ui/ui-text/src/skikoMain/kotlin/androidx/compose/ui/text/style/LineBreak.skiko.kt
index 20c25b0..719a93f 100644
--- a/compose/ui/ui-text/src/skikoMain/kotlin/androidx/compose/ui/text/style/LineBreak.skiko.kt
+++ b/compose/ui/ui-text/src/skikoMain/kotlin/androidx/compose/ui/text/style/LineBreak.skiko.kt
@@ -21,20 +21,14 @@
 
 @Immutable
 @JvmInline
-actual value class LineBreak private constructor(
-    internal val mask: Int
-) {
+actual value class LineBreak private constructor(internal val mask: Int) {
     actual companion object {
-        @Stable
-        actual val Simple: LineBreak = LineBreak(1)
+        @Stable actual val Simple: LineBreak = LineBreak(1)
 
-        @Stable
-        actual val Heading: LineBreak = LineBreak(2)
+        @Stable actual val Heading: LineBreak = LineBreak(2)
 
-        @Stable
-        actual val Paragraph: LineBreak = LineBreak(3)
+        @Stable actual val Paragraph: LineBreak = LineBreak(3)
 
-        @Stable
-        actual val Unspecified: LineBreak = LineBreak(Int.MIN_VALUE)
+        @Stable actual val Unspecified: LineBreak = LineBreak(Int.MIN_VALUE)
     }
 }
diff --git a/compose/ui/ui-tooling-data/src/androidInstrumentedTest/kotlin/androidx/compose/ui/tooling/data/BoundsTest.kt b/compose/ui/ui-tooling-data/src/androidInstrumentedTest/kotlin/androidx/compose/ui/tooling/data/BoundsTest.kt
index 1ade585..7ee8ef1 100644
--- a/compose/ui/ui-tooling-data/src/androidInstrumentedTest/kotlin/androidx/compose/ui/tooling/data/BoundsTest.kt
+++ b/compose/ui/ui-tooling-data/src/androidInstrumentedTest/kotlin/androidx/compose/ui/tooling/data/BoundsTest.kt
@@ -44,48 +44,44 @@
 @MediumTest
 @RunWith(AndroidJUnit4::class)
 class BoundsTest : ToolingTest() {
-    fun Group.all(): Collection<Group> =
-        listOf(this) + this.children.flatMap { it.all() }
+    fun Group.all(): Collection<Group> = listOf(this) + this.children.flatMap { it.all() }
 
     @Test
     fun testBounds() {
         val slotTableRecord = CompositionDataRecord.create()
         show {
             Inspectable(slotTableRecord) {
-                Box {
-                    Column(Modifier.padding(10.dp)) {
-                        Text("Hello", Modifier.padding(5.dp))
-                    }
-                }
+                Box { Column(Modifier.padding(10.dp)) { Text("Hello", Modifier.padding(5.dp)) } }
             }
         }
 
         activityTestRule.runOnUiThread {
             val tree = slotTableRecord.store.first().asTree()
 
-            val boundingBoxes = tree.firstOrNull {
-                it.location?.sourceFile?.equals("BoundsTest.kt") == true && it.box.right > 0
-            }!!
-                .all()
-                .filter {
-                    val name = it.location?.sourceFile
-                    name != null && name.equals("BoundsTest.kt")
-                }
-                .map {
-                    it.box.left
-                }
-                .distinct()
-                .sorted()
-                .toTypedArray()
+            val boundingBoxes =
+                tree
+                    .firstOrNull {
+                        it.location?.sourceFile?.equals("BoundsTest.kt") == true && it.box.right > 0
+                    }!!
+                    .all()
+                    .filter {
+                        val name = it.location?.sourceFile
+                        name != null && name.equals("BoundsTest.kt")
+                    }
+                    .map { it.box.left }
+                    .distinct()
+                    .sorted()
+                    .toTypedArray()
             with(Density(activityTestRule.activity)) {
                 println(boundingBoxes.contentDeepToString())
                 arrayOf(
-                    0.dp.roundToPx(), // Root
-                    10.dp.roundToPx(), // Column
-                    15.dp.roundToPx() // Text
-                ).forEachIndexed { index, value ->
-                    Assert.assertTrue(boundingBoxes[index] in value - 1..value + 1)
-                }
+                        0.dp.roundToPx(), // Root
+                        10.dp.roundToPx(), // Column
+                        15.dp.roundToPx() // Text
+                    )
+                    .forEachIndexed { index, value ->
+                        Assert.assertTrue(boundingBoxes[index] in value - 1..value + 1)
+                    }
             }
         }
     }
@@ -97,23 +93,21 @@
         val slotTableRecord = CompositionDataRecord.create()
         show {
             Inspectable(slotTableRecord) {
-                Box {
-                    Column(Modifier.padding(10.dp)) {
-                        Text("Hello", Modifier.padding(5.dp))
-                    }
-                }
+                Box { Column(Modifier.padding(10.dp)) { Text("Hello", Modifier.padding(5.dp)) } }
             }
         }
 
         activityTestRule.runOnUiThread {
-            slotTableRecord.store.first().mapTree<Any>({ group, context, _ ->
-                if (context.location?.sourceFile == "BoundsTest.kt") {
-                    with(Density(activityTestRule.activity)) {
-                        lefts[context.name!!] = context.bounds.left.toDp()
-                        anchors[context.name!!] = group.identity
+            slotTableRecord.store
+                .first()
+                .mapTree<Any>({ group, context, _ ->
+                    if (context.location?.sourceFile == "BoundsTest.kt") {
+                        with(Density(activityTestRule.activity)) {
+                            lefts[context.name!!] = context.bounds.left.toDp()
+                            anchors[context.name!!] = group.identity
+                        }
                     }
-                }
-            })
+                })
 
             assertThat(lefts["Box"]?.value).isWithin(1f).of(0f)
             assertThat(lefts["Column"]?.value).isWithin(1f).of(10f)
@@ -133,12 +127,8 @@
             Inspectable(slotTableRecord) {
                 BoxWithConstraints {
                     Column {
-                        Box {
-                            Text("Hello")
-                        }
-                        Box {
-                            Text("Hello")
-                        }
+                        Box { Text("Hello") }
+                        Box { Text("Hello") }
                     }
                 }
             }
@@ -148,11 +138,15 @@
             val store = slotTableRecord.store
             Assert.assertTrue(store.size > 1)
             val trees = slotTableRecord.store.map { it.asTree() }
-            val boundingBoxes = trees.map {
-                it.all().filter {
-                    it.box.right > 0 && it.location?.sourceFile == "BoundsTest.kt"
-                }
-            }.flatten().groupBy { it.location }
+            val boundingBoxes =
+                trees
+                    .map {
+                        it.all().filter {
+                            it.box.right > 0 && it.location?.sourceFile == "BoundsTest.kt"
+                        }
+                    }
+                    .flatten()
+                    .groupBy { it.location }
 
             Assert.assertTrue(boundingBoxes.size >= 4)
         }
diff --git a/compose/ui/ui-tooling-data/src/androidInstrumentedTest/kotlin/androidx/compose/ui/tooling/data/Inspectable.kt b/compose/ui/ui-tooling-data/src/androidInstrumentedTest/kotlin/androidx/compose/ui/tooling/data/Inspectable.kt
index 8be0d0f..0c42e19 100644
--- a/compose/ui/ui-tooling-data/src/androidInstrumentedTest/kotlin/androidx/compose/ui/tooling/data/Inspectable.kt
+++ b/compose/ui/ui-tooling-data/src/androidInstrumentedTest/kotlin/androidx/compose/ui/tooling/data/Inspectable.kt
@@ -26,9 +26,7 @@
 import java.util.Collections
 import java.util.WeakHashMap
 
-/**
- * Storage for the preview generated [CompositionData]s.
- */
+/** Storage for the preview generated [CompositionData]s. */
 internal interface CompositionDataRecord {
     val store: Set<CompositionData>
 
@@ -39,8 +37,7 @@
 
 private class CompositionDataRecordImpl : CompositionDataRecord {
     @OptIn(InternalComposeApi::class)
-    override val store: MutableSet<CompositionData> =
-        Collections.newSetFromMap(WeakHashMap())
+    override val store: MutableSet<CompositionData> = Collections.newSetFromMap(WeakHashMap())
 }
 
 /**
@@ -48,7 +45,7 @@
  * is in inspection mode.
  *
  * @param compositionDataRecord [CompositionDataRecord] to record the SlotTable used in the
- * composition of [content]
+ *   composition of [content]
  */
 @Composable
 @OptIn(InternalComposeApi::class)
diff --git a/compose/ui/ui-tooling-data/src/androidInstrumentedTest/kotlin/androidx/compose/ui/tooling/data/InspectableTests.kt b/compose/ui/ui-tooling-data/src/androidInstrumentedTest/kotlin/androidx/compose/ui/tooling/data/InspectableTests.kt
index 196eb55..0cc9efe 100644
--- a/compose/ui/ui-tooling-data/src/androidInstrumentedTest/kotlin/androidx/compose/ui/tooling/data/InspectableTests.kt
+++ b/compose/ui/ui-tooling-data/src/androidInstrumentedTest/kotlin/androidx/compose/ui/tooling/data/InspectableTests.kt
@@ -54,21 +54,16 @@
         val slotTableRecord = CompositionDataRecord.create()
         show {
             Inspectable(slotTableRecord) {
-                Column {
-                    Box(
-                        Modifier.size(100.dp).drawBehind {
-                            drawRect(Color.Black)
-                        }
-                    )
-                }
+                Column { Box(Modifier.size(100.dp).drawBehind { drawRect(Color.Black) }) }
             }
         }
 
         // Should be able to find the group for this test
         val tree = slotTableRecord.store.first().asTree()
-        val group = tree.firstOrNull {
-            it.location?.sourceFile?.equals("InspectableTests.kt") == true && it.box.right > 0
-        } ?: error("Expected a group from this file")
+        val group =
+            tree.firstOrNull {
+                it.location?.sourceFile?.equals("InspectableTests.kt") == true && it.box.right > 0
+            } ?: error("Expected a group from this file")
         assertNotNull(group)
 
         // The group should have a non-empty bounding box
@@ -117,11 +112,11 @@
 
         val tree = slotTableRecord.store.first().asTree()
         val list = tree.asList()
-        val parameters = list.filter { group ->
-            group.parameters.isNotEmpty() && group.location.let {
-                it != null && it.sourceFile == "InspectableTests.kt"
+        val parameters =
+            list.filter { group ->
+                group.parameters.isNotEmpty() &&
+                    group.location.let { it != null && it.sourceFile == "InspectableTests.kt" }
             }
-        }
 
         val callCursor = parameters.listIterator()
         class ParameterValidationReceiver(val parameterCursor: Iterator<ParameterInformation>) {
@@ -328,18 +323,15 @@
     @Test // regression test for b/161839910
     fun textParametersAreCorrect() {
         val slotTableRecord = CompositionDataRecord.create()
-        show {
-            Inspectable(slotTableRecord) {
-                Text("Test")
-            }
-        }
+        show { Inspectable(slotTableRecord) { Text("Test") } }
         val tree = slotTableRecord.store.first().asTree()
         val list = tree.asList()
-        val parameters = list.filter { group ->
-            group.parameters.isNotEmpty() && group.name == "Text" && group.location.let {
-                it != null && it.sourceFile == "InspectableTests.kt"
+        val parameters =
+            list.filter { group ->
+                group.parameters.isNotEmpty() &&
+                    group.name == "Text" &&
+                    group.location.let { it != null && it.sourceFile == "InspectableTests.kt" }
             }
-        }
         val names = parameters.first().parameters.map { it.name }
         assertEquals(
             "text, modifier, color, fontSize, fontStyle, fontWeight, fontFamily, " +
@@ -357,11 +349,7 @@
             ModalDrawer(
                 drawerContent = { Text("Something") },
                 content = {
-                    Column(
-                        Modifier.onGloballyPositioned {
-                            positioned.countDown()
-                        }
-                    ) {
+                    Column(Modifier.onGloballyPositioned { positioned.countDown() }) {
                         Text(text = "Hello World", color = Color.Green)
                         Button(onClick = {}) { Text(text = "OK") }
                     }
@@ -372,21 +360,23 @@
         assertTrue(positioned.await(2, TimeUnit.SECONDS))
 
         // Wait for composition to complete
-        activity.runOnUiThread { }
+        activity.runOnUiThread {}
 
         assertFalse(tables.isNullOrEmpty())
         assertTrue(tables.size > 1)
 
-        val calls = activity.uiThread {
-            tables.flatMap { table ->
-                if (!table.isEmpty) table.asTree().asList() else emptyList()
-            }.filter {
-                val location = it.location
-                location != null && location.sourceFile == "InspectableTests.kt"
-            }.map {
-                it.name
+        val calls =
+            activity.uiThread {
+                tables
+                    .flatMap { table ->
+                        if (!table.isEmpty) table.asTree().asList() else emptyList()
+                    }
+                    .filter {
+                        val location = it.location
+                        location != null && location.sourceFile == "InspectableTests.kt"
+                    }
+                    .map { it.name }
             }
-        }
 
         assertTrue(calls.contains("Column"))
         assertTrue(calls.contains("Text"))
@@ -397,22 +387,18 @@
     fun allowKeysThatLookLikeInvalidSourceInformation() {
         val slotTableRecord = CompositionDataRecord.create()
         show {
-            Inspectable(slotTableRecord) {
-                ReusableContent("1234123412341234") {
-                    Text("Test")
-                }
-            }
+            Inspectable(slotTableRecord) { ReusableContent("1234123412341234") { Text("Test") } }
         }
         slotTableRecord.store.first().asTree()
     }
 
     @Test
     fun emptyCompostionDataShouldProduceEmptyTree() {
-        val emptyCompositionData = object : CompositionData {
-            override val compositionGroups: Iterable<CompositionGroup> =
-                emptyList()
-            override val isEmpty = true
-        }
+        val emptyCompositionData =
+            object : CompositionData {
+                override val compositionGroups: Iterable<CompositionGroup> = emptyList()
+                override val isEmpty = true
+            }
 
         val emptyTree = emptyCompositionData.asTree()
         assertTrue(emptyTree.children.isEmpty())
@@ -430,25 +416,15 @@
     return result!!
 }
 
-@Suppress("UNUSED_PARAMETER")
-@Composable
-fun OneParameter(a: Int) {
-}
+@Suppress("UNUSED_PARAMETER") @Composable fun OneParameter(a: Int) {}
+
+@Suppress("UNUSED_PARAMETER") @Composable fun OneDefaultParameter(a: Int = 1) {}
+
+@Suppress("UNUSED_PARAMETER") @Composable fun ThreeParameters(a: Int, b: Int, c: Int) {}
 
 @Suppress("UNUSED_PARAMETER")
 @Composable
-fun OneDefaultParameter(a: Int = 1) {
-}
-
-@Suppress("UNUSED_PARAMETER")
-@Composable
-fun ThreeParameters(a: Int, b: Int, c: Int) {
-}
-
-@Suppress("UNUSED_PARAMETER")
-@Composable
-fun ThreeDefaultParameters(a: Int = 1, b: Int = 2, c: Int = 3) {
-}
+fun ThreeDefaultParameters(a: Int = 1, b: Int = 2, c: Int = 3) {}
 
 // BFS
 @UiToolingDataApi
diff --git a/compose/ui/ui-tooling-data/src/androidInstrumentedTest/kotlin/androidx/compose/ui/tooling/data/ModifierInfoTest.kt b/compose/ui/ui-tooling-data/src/androidInstrumentedTest/kotlin/androidx/compose/ui/tooling/data/ModifierInfoTest.kt
index b5df642..1067f94 100644
--- a/compose/ui/ui-tooling-data/src/androidInstrumentedTest/kotlin/androidx/compose/ui/tooling/data/ModifierInfoTest.kt
+++ b/compose/ui/ui-tooling-data/src/androidInstrumentedTest/kotlin/androidx/compose/ui/tooling/data/ModifierInfoTest.kt
@@ -38,8 +38,7 @@
 @MediumTest
 @RunWith(AndroidJUnit4::class)
 class ModifierInfoTest : ToolingTest() {
-    fun Group.all(): Collection<Group> =
-        listOf(this) + this.children.flatMap { it.all() }
+    fun Group.all(): Collection<Group> = listOf(this) + this.children.flatMap { it.all() }
 
     @Test
     fun testBounds() {
@@ -60,8 +59,7 @@
                     boxSizeModifier = Modifier.size(px5)
                     Box {
                         Column(
-                            Modifier
-                                .then(columnPaddingModifier)
+                            Modifier.then(columnPaddingModifier)
                                 .then(graphicsLayer)
                                 .then(backgroundModifier)
                         ) {
@@ -74,16 +72,18 @@
 
         activityTestRule.runOnUiThread {
             val tree = slotTableRecord.store.first().asTree()
-            val firstGroup = tree.firstOrNull {
-                it.location?.sourceFile?.equals("ModifierInfoTest.kt") == true && it.box.right > 0
-            }!!
-            val modifierInfoItems = firstGroup.all()
-                .filter { it.modifierInfo.isNotEmpty() }
-                .sortedBy { it.modifierInfo.size }
+            val firstGroup =
+                tree.firstOrNull {
+                    it.location?.sourceFile?.equals("ModifierInfoTest.kt") == true &&
+                        it.box.right > 0
+                }!!
+            val modifierInfoItems =
+                firstGroup
+                    .all()
+                    .filter { it.modifierInfo.isNotEmpty() }
+                    .sortedBy { it.modifierInfo.size }
 
-            val modifierInfo = modifierInfoItems.map {
-                it.modifierInfo
-            }
+            val modifierInfo = modifierInfoItems.map { it.modifierInfo }
 
             assertEquals(2, modifierInfo.size)
 
@@ -92,14 +92,16 @@
             assertEquals(
                 "Box should only have LayoutModifiers, but the first was " +
                     "${boxModifierInfo[0].modifier}",
-                boxPaddingModifier, boxModifierInfo[0].modifier
+                boxPaddingModifier,
+                boxModifierInfo[0].modifier
             )
             assertEquals(10f, boxModifierInfo[0].coordinates.positionInRoot().x)
 
             assertEquals(
                 "Box should only have LayoutModifiers, but the second was " +
                     "${boxModifierInfo[1].modifier}",
-                boxSizeModifier, boxModifierInfo[1].modifier
+                boxSizeModifier,
+                boxModifierInfo[1].modifier
             )
             assertEquals(15f, boxModifierInfo[1].coordinates.positionInRoot().x)
 
@@ -108,20 +110,23 @@
             assertEquals(
                 "The first modifier in the column should be a LayoutModifier" +
                     "but was ${columnModifierInfo[0].modifier}",
-                columnPaddingModifier, columnModifierInfo[0].modifier
+                columnPaddingModifier,
+                columnModifierInfo[0].modifier
             )
             assertEquals(0f, columnModifierInfo[0].coordinates.positionInRoot().x)
             assertEquals(
                 "The second modifier in the column should be the graphicsLayer" +
                     "but was ${columnModifierInfo[1].modifier}",
-                graphicsLayer, columnModifierInfo[1].modifier
+                graphicsLayer,
+                columnModifierInfo[1].modifier
             )
             assertTrue(columnModifierInfo[2].extra is GraphicLayerInfo)
             assertEquals(10f, columnModifierInfo[1].coordinates.positionInRoot().x)
             assertEquals(
                 "The third modifier in the column should be a DrawModifier" +
                     "but was ${columnModifierInfo[2].modifier}",
-                backgroundModifier, columnModifierInfo[2].modifier
+                backgroundModifier,
+                columnModifierInfo[2].modifier
             )
             assertEquals(10f, columnModifierInfo[2].coordinates.positionInRoot().x)
         }
diff --git a/compose/ui/ui-tooling-data/src/androidInstrumentedTest/kotlin/androidx/compose/ui/tooling/data/OffsetData.kt b/compose/ui/ui-tooling-data/src/androidInstrumentedTest/kotlin/androidx/compose/ui/tooling/data/OffsetData.kt
index 61727c4..e28d2b6 100644
--- a/compose/ui/ui-tooling-data/src/androidInstrumentedTest/kotlin/androidx/compose/ui/tooling/data/OffsetData.kt
+++ b/compose/ui/ui-tooling-data/src/androidInstrumentedTest/kotlin/androidx/compose/ui/tooling/data/OffsetData.kt
@@ -34,10 +34,7 @@
 import androidx.compose.ui.unit.dp
 import androidx.compose.ui.unit.sp
 
-/**
- * WARNING: Any modification of this *requires* a change to OffsetInformationTest
- */
-
+/** WARNING: Any modification of this *requires* a change to OffsetInformationTest */
 @Composable
 fun MyComposeTheme(content: @Composable () -> Unit) {
     content()
@@ -49,33 +46,19 @@
         Column(modifier = Modifier.padding(20.dp)) {
             Text(
                 text = "Hello",
-                style = TextStyle(
-                    color = Color.Magenta,
-                    background = Color.White,
-                    fontSize = 30.sp
-                )
+                style = TextStyle(color = Color.Magenta, background = Color.White, fontSize = 30.sp)
             )
             Greeting("Android")
-            Surface(
-                color = Color.Blue,
-                shape = MaterialTheme.shapes.small
-            ) {
+            Surface(color = Color.Blue, shape = MaterialTheme.shapes.small) {
                 Button(onClick = {}) { Text("OK") }
             }
-            Surface(
-                color = Color.Red,
-                shape = MaterialTheme.shapes.small
-            ) {
-                TextButton(
-                    onClick = {},
-                    modifier = Modifier.fillMaxWidth()
-                ) {
+            Surface(color = Color.Red, shape = MaterialTheme.shapes.small) {
+                TextButton(onClick = {}, modifier = Modifier.fillMaxWidth()) {
                     Row(
                         horizontalArrangement = Arrangement.Start,
                         verticalAlignment = Alignment.CenterVertically,
                         modifier = Modifier.fillMaxWidth()
-                    ) {
-                    }
+                    ) {}
                 }
             }
         }
diff --git a/compose/ui/ui-tooling-data/src/androidInstrumentedTest/kotlin/androidx/compose/ui/tooling/data/OffsetInformationTest.kt b/compose/ui/ui-tooling-data/src/androidInstrumentedTest/kotlin/androidx/compose/ui/tooling/data/OffsetInformationTest.kt
index 86c3da5..ebb0263 100644
--- a/compose/ui/ui-tooling-data/src/androidInstrumentedTest/kotlin/androidx/compose/ui/tooling/data/OffsetInformationTest.kt
+++ b/compose/ui/ui-tooling-data/src/androidInstrumentedTest/kotlin/androidx/compose/ui/tooling/data/OffsetInformationTest.kt
@@ -29,34 +29,33 @@
     @Test
     fun testOffset() {
         val slotTableRecord = CompositionDataRecord.create()
-        show {
-            Inspectable(slotTableRecord) {
-                OffsetData()
-            }
-        }
+        show { Inspectable(slotTableRecord) { OffsetData() } }
 
         val table = slotTableRecord.store.first()
         val tree = table.asTree()
-        val offsets = tree.all().filter {
-            it.location?.sourceFile == "OffsetData.kt" &&
-                it.name != null && it.name != "remember"
-        }.map {
-            it.name!! to it.location!!.offset
-        }
+        val offsets =
+            tree
+                .all()
+                .filter {
+                    it.location?.sourceFile == "OffsetData.kt" &&
+                        it.name != null &&
+                        it.name != "remember"
+                }
+                .map { it.name!! to it.location!!.offset }
 
         assertArrayEquals(
             arrayListOf(
-                "MyComposeTheme" to 1603,
-                "Column" to 1628,
-                "Text" to 1685,
-                "Greeting" to 1928,
-                "Text" to 2763,
-                "Surface" to 1960,
-                "Button" to 2088,
-                "Text" to 2111,
-                "Surface" to 2150,
-                "TextButton" to 2277,
-                "Row" to 2418
+                "MyComposeTheme" to 1598,
+                "Column" to 1623,
+                "Text" to 1680,
+                "Greeting" to 1845,
+                "Text" to 2509,
+                "Surface" to 1877,
+                "Button" to 1959,
+                "Text" to 1982,
+                "Surface" to 2021,
+                "TextButton" to 2102,
+                "Row" to 2185
             ),
             offsets
         )
@@ -65,20 +64,19 @@
     @Test
     fun testInline() {
         val slotTableRecord = CompositionDataRecord.create()
-        show {
-            Inspectable(slotTableRecord) {
-                OffsetData()
-            }
-        }
+        show { Inspectable(slotTableRecord) { OffsetData() } }
 
         val table = slotTableRecord.store.first()
         val tree = table.asTree()
-        val inlines = tree.all().filter {
-            it.location?.sourceFile == "OffsetData.kt" &&
-                it.name != null && it.name != "remember"
-        }.map {
-            it.name!! to it.isInline
-        }
+        val inlines =
+            tree
+                .all()
+                .filter {
+                    it.location?.sourceFile == "OffsetData.kt" &&
+                        it.name != null &&
+                        it.name != "remember"
+                }
+                .map { it.name!! to it.isInline }
 
         assertArrayEquals(
             arrayListOf(
diff --git a/compose/ui/ui-tooling-data/src/androidInstrumentedTest/kotlin/androidx/compose/ui/tooling/data/ToolingTest.kt b/compose/ui/ui-tooling-data/src/androidInstrumentedTest/kotlin/androidx/compose/ui/tooling/data/ToolingTest.kt
index 96411de..0315a6d 100644
--- a/compose/ui/ui-tooling-data/src/androidInstrumentedTest/kotlin/androidx/compose/ui/tooling/data/ToolingTest.kt
+++ b/compose/ui/ui-tooling-data/src/androidInstrumentedTest/kotlin/androidx/compose/ui/tooling/data/ToolingTest.kt
@@ -37,9 +37,8 @@
 open class ToolingTest {
     @Suppress("DEPRECATION")
     @get:Rule
-    val activityTestRule = androidx.test.rule.ActivityTestRule<TestActivity>(
-        TestActivity::class.java
-    )
+    val activityTestRule =
+        androidx.test.rule.ActivityTestRule<TestActivity>(TestActivity::class.java)
     lateinit var activity: TestActivity
     lateinit var handler: Handler
     lateinit var positionedLatch: CountDownLatch
@@ -56,11 +55,7 @@
         positionedLatch = CountDownLatch(1)
         activityTestRule.onUiThread {
             activity.setContent {
-                Box(
-                    Modifier
-                        .fillMaxSize()
-                        .onGloballyPositioned { positionedLatch.countDown() }
-                ) {
+                Box(Modifier.fillMaxSize().onGloballyPositioned { positionedLatch.countDown() }) {
                     composable()
                 }
             }
@@ -70,26 +65,21 @@
         positionedLatch.await(1, TimeUnit.SECONDS)
 
         // Wait for the UI thread to complete its current work so we know that layout is done.
-        activityTestRule.onUiThread { }
+        activityTestRule.onUiThread {}
     }
 
     internal fun showAndRecord(content: @Composable () -> Unit): MutableSet<CompositionData> {
 
         positionedLatch = CountDownLatch(1)
-        val map: MutableSet<CompositionData> = Collections.newSetFromMap(
-            WeakHashMap<CompositionData, Boolean>()
-        )
+        val map: MutableSet<CompositionData> =
+            Collections.newSetFromMap(WeakHashMap<CompositionData, Boolean>())
         activityTestRule.onUiThread {
             ViewRootForTest.onViewCreatedCallback = {
                 it.view.setTag(R.id.inspection_slot_table_set, map)
                 ViewRootForTest.onViewCreatedCallback = null
             }
             activity.setContent {
-                Box(
-                    Modifier
-                        .fillMaxSize()
-                        .onGloballyPositioned { positionedLatch.countDown() }
-                ) {
+                Box(Modifier.fillMaxSize().onGloballyPositioned { positionedLatch.countDown() }) {
                     content()
                 }
             }
@@ -98,7 +88,7 @@
             positionedLatch.await(1, TimeUnit.SECONDS)
 
             // Wait for the UI thread to complete its current work so we know that layout is done.
-            activityTestRule.onUiThread { }
+            activityTestRule.onUiThread {}
         }
         return map
     }
@@ -108,10 +98,11 @@
 // lambda to Runnable, so separate it here
 @Suppress("DEPRECATION")
 fun androidx.test.rule.ActivityTestRule<TestActivity>.onUiThread(block: () -> Unit) {
-    val runnable: Runnable = object : Runnable {
-        override fun run() {
-            block()
+    val runnable: Runnable =
+        object : Runnable {
+            override fun run() {
+                block()
+            }
         }
-    }
     runOnUiThread(runnable)
 }
diff --git a/compose/ui/ui-tooling-data/src/jvmMain/kotlin/androidx/compose/ui/tooling/data/SlotTree.jvm.kt b/compose/ui/ui-tooling-data/src/jvmMain/kotlin/androidx/compose/ui/tooling/data/SlotTree.jvm.kt
index c439766..4987032 100644
--- a/compose/ui/ui-tooling-data/src/jvmMain/kotlin/androidx/compose/ui/tooling/data/SlotTree.jvm.kt
+++ b/compose/ui/ui-tooling-data/src/jvmMain/kotlin/androidx/compose/ui/tooling/data/SlotTree.jvm.kt
@@ -29,24 +29,16 @@
 import kotlin.math.min
 import kotlin.math.roundToInt
 
-/**
- * A group in the slot table. Represents either a call or an emitted node.
- */
+/** A group in the slot table. Represents either a call or an emitted node. */
 @UiToolingDataApi
 sealed class Group(
-    /**
-     * The key is the key generated for the group
-     */
+    /** The key is the key generated for the group */
     val key: Any?,
 
-    /**
-     * The name of the function called, if provided
-     */
+    /** The name of the function called, if provided */
     val name: String?,
 
-    /**
-     * The source location that produce the group if it can be determined
-     */
+    /** The source location that produce the group if it can be determined */
     val location: SourceLocation?,
 
     /**
@@ -54,35 +46,25 @@
      */
     val identity: Any?,
 
-    /**
-     * The bounding layout box for the group.
-     */
+    /** The bounding layout box for the group. */
     val box: IntRect,
 
-    /**
-     * Any data that was stored in the slot table for the group
-     */
+    /** Any data that was stored in the slot table for the group */
     val data: Collection<Any?>,
 
-    /**
-     * The child groups of this group
-     */
+    /** The child groups of this group */
     val children: Collection<Group>,
 
-    /**
-     * True if the group is for an inline function call
-     */
+    /** True if the group is for an inline function call */
     val isInline: Boolean,
 ) {
-    /**
-     * Modifier information for the Group, or empty list if there isn't any.
-     */
-    open val modifierInfo: List<ModifierInfo> get() = emptyList()
+    /** Modifier information for the Group, or empty list if there isn't any. */
+    open val modifierInfo: List<ModifierInfo>
+        get() = emptyList()
 
-    /**
-     * Parameter information for Groups that represent calls
-     */
-    open val parameters: List<ParameterInformation> get() = emptyList()
+    /** Parameter information for Groups that represent calls */
+    open val parameters: List<ParameterInformation>
+        get() = emptyList()
 }
 
 @UiToolingDataApi
@@ -96,19 +78,15 @@
     val stable: Boolean
 )
 
-/**
- * Source location of the call that produced the call group.
- */
+/** Source location of the call that produced the call group. */
 @UiToolingDataApi
 data class SourceLocation(
-    /**
-     * A 0 offset line number of the source location.
-     */
+    /** A 0 offset line number of the source location. */
     val lineNumber: Int,
 
     /**
-     * Offset into the file. The offset is calculated as the number of UTF-16 code units from
-     * the beginning of the file to the first UTF-16 code unit of the call that produced the group.
+     * Offset into the file. The offset is calculated as the number of UTF-16 code units from the
+     * beginning of the file to the first UTF-16 code unit of the call that produced the group.
      */
     val offset: Int,
 
@@ -128,7 +106,7 @@
     /**
      * A hash code of the package name of the file. This hash is calculated by,
      *
-     *   `packageName.fold(0) { hash, current -> hash * 31 + current.toInt() }?.absoluteValue`
+     * `packageName.fold(0) { hash, current -> hash * 31 + current.toInt() }?.absoluteValue`
      *
      * where the package name is the dotted name of the package. This can be used to disambiguate
      * which file is referenced by [sourceFile]. This number is -1 if there was no package hash
@@ -137,9 +115,7 @@
     val packageHash: Int
 )
 
-/**
- * A group that represents the invocation of a component
- */
+/** A group that represents the invocation of a component */
 @UiToolingDataApi
 class CallGroup(
     key: Any?,
@@ -153,16 +129,12 @@
     isInline: Boolean
 ) : Group(key, name, location, identity, box, data, children, isInline)
 
-/**
- * A group that represents an emitted node
- */
+/** A group that represents an emitted node */
 @UiToolingDataApi
 class NodeGroup(
     key: Any?,
 
-    /**
-     * An emitted node
-     */
+    /** An emitted node */
     val node: Any,
     box: IntRect,
     data: Collection<Any?>,
@@ -171,34 +143,40 @@
 ) : Group(key, null, null, null, box, data, children, false)
 
 @UiToolingDataApi
-private object EmptyGroup : Group(
-    key = null,
-    name = null,
-    location = null,
-    identity = null,
-    box = emptyBox,
-    data = emptyList(),
-    children = emptyList(),
-    isInline = false
-)
+private object EmptyGroup :
+    Group(
+        key = null,
+        name = null,
+        location = null,
+        identity = null,
+        box = emptyBox,
+        data = emptyList(),
+        children = emptyList(),
+        isInline = false
+    )
 
-/**
- * A key that has being joined together to form one key.
- */
-@UiToolingDataApi
-data class JoinedKey(val left: Any?, val right: Any?)
+/** A key that has being joined together to form one key. */
+@UiToolingDataApi data class JoinedKey(val left: Any?, val right: Any?)
 
 internal val emptyBox = IntRect(0, 0, 0, 0)
 
 private val tokenizer = Regex("(\\d+)|([,])|([*])|([:])|L|(P\\([^)]*\\))|(C(\\(([^)]*)\\))?)|@")
 
 private fun MatchResult.isNumber() = groups[1] != null
+
 private fun MatchResult.number() = groupValues[1].parseToInt()
-private val MatchResult.text get() = groupValues[0]
+
+private val MatchResult.text
+    get() = groupValues[0]
+
 private fun MatchResult.isChar(c: String) = text == c
+
 private fun MatchResult.isFileName() = groups[4] != null
+
 private fun MatchResult.isParameterInformation() = groups[5] != null
+
 private fun MatchResult.isCallWithName() = groups[6] != null
+
 private fun MatchResult.callName() = groupValues[8]
 
 private class SourceLocationInfo(val lineNumber: Int?, val offset: Int?, val length: Int?)
@@ -254,15 +232,14 @@
 }
 
 private val parametersInformationTokenizer = Regex("(\\d+)|,|[!P()]|:([^,!)]+)")
-private val MatchResult.isANumber get() = groups[1] != null
-private val MatchResult.isClassName get() = groups[2] != null
+private val MatchResult.isANumber
+    get() = groups[1] != null
+private val MatchResult.isClassName
+    get() = groups[2] != null
 
 private class ParseError : Exception()
 
-private class Parameter(
-    val sortedIndex: Int,
-    val inlineClass: String? = null
-)
+private class Parameter(val sortedIndex: Int, val inlineClass: String? = null)
 
 private fun String.parseToInt(): Int =
     try {
@@ -309,9 +286,7 @@
         val mr = currentResult
         if (mr == null || !mr.isClassName) throw ParseError()
         next()
-        return mr.text
-            .substring(1)
-            .replacePrefix("c#", "androidx.compose.")
+        return mr.text.substring(1).replacePrefix("c#", "androidx.compose.")
     }
 
     fun expect(value: String) {
@@ -335,9 +310,7 @@
         if (missing > 0) {
             val minAddAmount = 4
             val amountToAdd = if (missing < minAddAmount) minAddAmount else missing
-            repeat(amountToAdd) {
-                expectedSortedIndex.add(it + lastAdded + 1)
-            }
+            repeat(amountToAdd) { expectedSortedIndex.add(it + lastAdded + 1) }
             lastAdded += amountToAdd
         }
     }
@@ -360,9 +333,10 @@
                 isChar(",") -> next()
                 else -> {
                     val index = expectNumber()
-                    val inlineClass = if (isClassName()) {
-                        expectClassName()
-                    } else null
+                    val inlineClass =
+                        if (isClassName()) {
+                            expectClassName()
+                        } else null
                     result.add(Parameter(index, inlineClass))
                     ensureIndexes(index)
                     expectedSortedIndex.remove(index)
@@ -472,20 +446,20 @@
                 val hashText = sourceFile.substringAfterLast("#", "")
                 if (hashText.isNotEmpty()) {
                     // Remove the hash information
-                    sourceFile = sourceFile
-                        .substring(0 until sourceFile.length - hashText.length - 1)
-                    packageHash = try {
-                        hashText.parseToInt(36)
-                    } catch (_: NumberFormatException) {
-                        -1
-                    }
+                    sourceFile =
+                        sourceFile.substring(0 until sourceFile.length - hashText.length - 1)
+                    packageHash =
+                        try {
+                            hashText.parseToInt(36)
+                        } catch (_: NumberFormatException) {
+                            -1
+                        }
                 }
                 break@loop
             }
             else -> break@loop
         }
-        if (mr == currentResult)
-            return null
+        if (mr == currentResult) return null
     }
 
     return SourceInformationContext(
@@ -500,9 +474,7 @@
     )
 }
 
-/**
- * Iterate the slot table and extract a group tree that corresponds to the content of the table.
- */
+/** Iterate the slot table and extract a group tree that corresponds to the content of the table. */
 @UiToolingDataApi
 private fun CompositionGroup.getGroup(parentContext: SourceInformationContext?): Group {
     val key = key
@@ -511,44 +483,45 @@
     val data = mutableListOf<Any?>()
     val children = mutableListOf<Group>()
     data.addAll(this.data)
-    for (child in compositionGroups)
-        children.add(child.getGroup(context))
+    for (child in compositionGroups) children.add(child.getGroup(context))
 
-    val modifierInfo = if (node is LayoutInfo) {
-        node.getModifierInfo()
-    } else {
-        emptyList()
-    }
+    val modifierInfo =
+        if (node is LayoutInfo) {
+            node.getModifierInfo()
+        } else {
+            emptyList()
+        }
 
     // Calculate bounding box
-    val box = when (node) {
-        is LayoutInfo -> boundsOfLayoutNode(node)
-        else ->
-            if (children.isEmpty()) emptyBox else
-                children.map { g -> g.box }.reduce { acc, box -> box.union(acc) }
-    }
+    val box =
+        when (node) {
+            is LayoutInfo -> boundsOfLayoutNode(node)
+            else ->
+                if (children.isEmpty()) emptyBox
+                else children.map { g -> g.box }.reduce { acc, box -> box.union(acc) }
+        }
     val location =
-        if (context?.isCall == true) { parentContext?.nextSourceLocation() } else { null }
-    return if (node != null) NodeGroup(
-        key,
-        node,
-        box,
-        data,
-        modifierInfo,
-        children
-    ) else
+        if (context?.isCall == true) {
+            parentContext?.nextSourceLocation()
+        } else {
+            null
+        }
+    return if (node != null) NodeGroup(key, node, box, data, modifierInfo, children)
+    else
         CallGroup(
             key,
             context?.name,
             box,
             location,
-            identity = if (!context?.name.isNullOrEmpty() &&
-                (box.bottom - box.top > 0 || box.right - box.left > 0)
-            ) {
-                this.identity
-            } else {
-                null
-            },
+            identity =
+                if (
+                    !context?.name.isNullOrEmpty() &&
+                        (box.bottom - box.top > 0 || box.right - box.left > 0)
+                ) {
+                    this.identity
+                } else {
+                    null
+                },
             extractParameterInfo(data, context),
             data,
             children,
@@ -559,12 +532,7 @@
 private fun boundsOfLayoutNode(node: LayoutInfo): IntRect {
     val coordinates = node.coordinates
     if (!node.isAttached || !coordinates.isAttached) {
-        return IntRect(
-            left = 0,
-            top = 0,
-            right = node.width,
-            bottom = node.height
-        )
+        return IntRect(left = 0, top = 0, right = node.width, bottom = node.height)
     }
     val position = coordinates.positionInWindow()
     val size = coordinates.size
@@ -605,11 +573,12 @@
     override val name: String?
         get() {
             val info = current.sourceInfo ?: return null
-            val startIndex = when {
-                info.startsWith("CC(") -> 3
-                info.startsWith("C(") -> 2
-                else -> return null
-            }
+            val startIndex =
+                when {
+                    info.startsWith("CC(") -> 3
+                    info.startsWith("C(") -> 2
+                    else -> return null
+                }
             val endIndex = info.indexOf(')')
             return if (endIndex > 2) info.substring(startIndex, endIndex) else null
         }
@@ -643,11 +612,9 @@
     override val depth: Int
         get() = stack.size
 
-    private fun push(group: CompositionGroup) =
-        stack.addLast(group)
+    private fun push(group: CompositionGroup) = stack.addLast(group)
 
-    private fun pop() =
-        stack.removeLast()
+    private fun pop() = stack.removeLast()
 
     private val current: CompositionGroup
         get() = stack.last()
@@ -663,14 +630,10 @@
         group.sourceInfo?.startsWith("C") ?: false
 }
 
-/**
- * A cache of [SourceInformationContext] that optionally can be specified when using [mapTree].
- */
+/** A cache of [SourceInformationContext] that optionally can be specified when using [mapTree]. */
 @UiToolingDataApi
 class ContextCache {
-    /**
-     * Clears the cache.
-     */
+    /** Clears the cache. */
     fun clear() {
         contexts.clear()
     }
@@ -685,47 +648,36 @@
  */
 @UiToolingDataApi
 interface SourceContext {
-    /**
-     * The name of the Composable or null if not applicable.
-     */
+    /** The name of the Composable or null if not applicable. */
     val name: String?
 
-    /**
-     * The bounds of the Composable if known.
-     */
+    /** The bounds of the Composable if known. */
     val bounds: IntRect
 
-    /**
-     * The [SourceLocation] of where the Composable was called.
-     */
+    /** The [SourceLocation] of where the Composable was called. */
     val location: SourceLocation?
 
-    /**
-     * The parameters of the Composable.
-     */
+    /** The parameters of the Composable. */
     val parameters: List<ParameterInformation>
 
-    /**
-     * The current depth into the [CompositionGroup] tree.
-     */
+    /** The current depth into the [CompositionGroup] tree. */
     val depth: Int
 
-    /**
-     * The source context is for a call to an inline composable function
-     */
-    val isInline: Boolean get() = false
+    /** The source context is for a call to an inline composable function */
+    val isInline: Boolean
+        get() = false
 }
 
 /**
  * Return a tree of custom nodes for the slot table.
  *
- * The [factory] method will be called for every [CompositionGroup] in the slot tree and can be
- * used to create custom nodes based on the passed arguments. The [SourceContext] argument gives
- * access to additional information encoded in the [CompositionGroup.sourceInfo].
- * A return of null from [factory] means that the entire subtree will be ignored.
+ * The [factory] method will be called for every [CompositionGroup] in the slot tree and can be used
+ * to create custom nodes based on the passed arguments. The [SourceContext] argument gives access
+ * to additional information encoded in the [CompositionGroup.sourceInfo]. A return of null from
+ * [factory] means that the entire subtree will be ignored.
  *
- * A [cache] can optionally be specified. If a client is calling [mapTree] multiple times,
- * this can save some time if the values of [CompositionGroup.sourceInfo] are not unique.
+ * A [cache] can optionally be specified. If a client is calling [mapTree] multiple times, this can
+ * save some time if the values of [CompositionGroup.sourceInfo] are not unique.
  */
 @UiToolingDataApi
 fun <T> CompositionData.mapTree(
@@ -739,27 +691,25 @@
     return out.firstOrNull()
 }
 
-/**
- * Return the parameters found for this [CompositionGroup].
- */
+/** Return the parameters found for this [CompositionGroup]. */
 @UiToolingDataApi
 fun CompositionGroup.findParameters(cache: ContextCache? = null): List<ParameterInformation> {
     val information = sourceInfo ?: return emptyList()
-    val context = if (cache == null) sourceInformationContextOf(information) else
-        cache.contexts.getOrPut(information) { sourceInformationContextOf(information) }
-            as? SourceInformationContext
+    val context =
+        if (cache == null) sourceInformationContextOf(information)
+        else
+            cache.contexts.getOrPut(information) { sourceInformationContextOf(information) }
+                as? SourceInformationContext
     val data = mutableListOf<Any?>()
     data.addAll(this.data)
     return extractParameterInfo(data, context)
 }
 
 /**
- * Return a group tree for for the slot table that represents the entire content of the slot
- * table.
+ * Return a group tree for for the slot table that represents the entire content of the slot table.
  */
 @UiToolingDataApi
-fun CompositionData.asTree(): Group = compositionGroups.firstOrNull()?.getGroup(null)
-    ?: EmptyGroup
+fun CompositionData.asTree(): Group = compositionGroups.firstOrNull()?.getGroup(null) ?: EmptyGroup
 
 internal fun IntRect.union(other: IntRect): IntRect {
     if (this == emptyBox) return other else if (other == emptyBox) return this
@@ -773,13 +723,12 @@
 }
 
 @UiToolingDataApi
-private fun keyPosition(key: Any?): String? = when (key) {
-    is String -> key
-    is JoinedKey ->
-        keyPosition(key.left)
-            ?: keyPosition(key.right)
-    else -> null
-}
+private fun keyPosition(key: Any?): String? =
+    when (key) {
+        is String -> key
+        is JoinedKey -> keyPosition(key.left) ?: keyPosition(key.right)
+        else -> null
+    }
 
 private const val parameterPrefix = "${'$'}"
 private const val internalFieldPrefix = parameterPrefix + parameterPrefix
@@ -794,9 +743,8 @@
     context: SourceInformationContext?
 ): List<ParameterInformation> {
     if (data.isNotEmpty()) {
-        val recomposeScope = data.firstOrNull {
-            it != null && it.javaClass.name.endsWith(recomposeScopeNameSuffix)
-        }
+        val recomposeScope =
+            data.firstOrNull { it != null && it.javaClass.name.endsWith(recomposeScopeNameSuffix) }
         if (recomposeScope != null) {
             try {
                 val blockField = recomposeScope.javaClass.accessibleField("block")
@@ -810,26 +758,28 @@
                             if (defaultsField != null) defaultsField.get(block) as Int else 0
                         val changed =
                             if (changedField != null) changedField.get(block) as Int else 0
-                        val fields = blockClass.declaredFields
-                            .filter {
-                                it.name.startsWith(parameterPrefix) &&
-                                    !it.name.startsWith(internalFieldPrefix) &&
-                                    !it.name.startsWith(jacocoDataField)
-                            }.sortedBy { it.name }
+                        val fields =
+                            blockClass.declaredFields
+                                .filter {
+                                    it.name.startsWith(parameterPrefix) &&
+                                        !it.name.startsWith(internalFieldPrefix) &&
+                                        !it.name.startsWith(jacocoDataField)
+                                }
+                                .sortedBy { it.name }
                         val parameters = mutableListOf<ParameterInformation>()
                         val parametersMetadata = context?.parameters ?: emptyList()
                         repeat(fields.size) { index ->
-                            val metadata = if (index < parametersMetadata.size)
-                                parametersMetadata[index] else Parameter(index)
+                            val metadata =
+                                if (index < parametersMetadata.size) parametersMetadata[index]
+                                else Parameter(index)
                             if (metadata.sortedIndex >= fields.size) return@repeat
                             val field = fields[metadata.sortedIndex]
                             field.isAccessible = true
                             val value = field.get(block)
                             val fromDefault = (1 shl index) and default != 0
                             val changedOffset = index * BITS_PER_SLOT + 1
-                            val parameterChanged = (
-                                (SLOT_MASK shl changedOffset) and changed
-                                ) shr changedOffset
+                            val parameterChanged =
+                                ((SLOT_MASK shl changedOffset) and changed) shr changedOffset
                             val static = parameterChanged and STATIC_BITS == STATIC_BITS
                             val compared = parameterChanged and STATIC_BITS == 0
                             val stable = parameterChanged and STABLE_BITS == 0
@@ -848,8 +798,7 @@
                         return parameters
                     }
                 }
-            } catch (_: Throwable) {
-            }
+            } catch (_: Throwable) {}
         }
     }
     return emptyList()
@@ -860,18 +809,13 @@
 private const val STATIC_BITS = 0b011
 private const val STABLE_BITS = 0b100
 
-/**
- * The source position of the group extracted from the key, if one exists for the group.
- */
+/** The source position of the group extracted from the key, if one exists for the group. */
 @UiToolingDataApi
 val Group.position: String?
-    @Suppress("OPT_IN_MARKER_ON_WRONG_TARGET")
-    @UiToolingDataApi
-    get() = keyPosition(key)
+    @Suppress("OPT_IN_MARKER_ON_WRONG_TARGET") @UiToolingDataApi get() = keyPosition(key)
 
-private fun Class<*>.accessibleField(name: String): Field? = declaredFields.firstOrNull {
-    it.name == name
-}?.apply { isAccessible = true }
+private fun Class<*>.accessibleField(name: String): Field? =
+    declaredFields.firstOrNull { it.name == name }?.apply { isAccessible = true }
 
 private fun String.replacePrefix(prefix: String, replacement: String) =
     if (startsWith(prefix)) replacement + substring(prefix.length) else this
diff --git a/compose/ui/ui-tooling-preview/src/androidMain/kotlin/androidx/compose/ui/tooling/preview/Device.android.kt b/compose/ui/ui-tooling-preview/src/androidMain/kotlin/androidx/compose/ui/tooling/preview/Device.android.kt
index c140060..f151aed 100644
--- a/compose/ui/ui-tooling-preview/src/androidMain/kotlin/androidx/compose/ui/tooling/preview/Device.android.kt
+++ b/compose/ui/ui-tooling-preview/src/androidMain/kotlin/androidx/compose/ui/tooling/preview/Device.android.kt
@@ -18,9 +18,7 @@
 
 import androidx.annotation.StringDef
 
-/**
- * List with the pre-defined devices available to be used in the preview.
- */
+/** List with the pre-defined devices available to be used in the preview. */
 object Devices {
     const val DEFAULT = ""
 
@@ -56,17 +54,25 @@
 
     const val AUTOMOTIVE_1024p = "id:automotive_1024p_landscape"
 
-    @Deprecated("Use [androidx.wear.tooling.preview.devices.WearDevices.LARGE_ROUND] from the " +
-        "wear:wear-tooling-preview library instead")
+    @Deprecated(
+        "Use [androidx.wear.tooling.preview.devices.WearDevices.LARGE_ROUND] from the " +
+            "wear:wear-tooling-preview library instead"
+    )
     const val WEAR_OS_LARGE_ROUND = "id:wearos_large_round"
-    @Deprecated("Use [androidx.wear.tooling.preview.devices.WearDevices.SMALL_ROUND] from the " +
-        "wear:wear-tooling-preview library instead")
+    @Deprecated(
+        "Use [androidx.wear.tooling.preview.devices.WearDevices.SMALL_ROUND] from the " +
+            "wear:wear-tooling-preview library instead"
+    )
     const val WEAR_OS_SMALL_ROUND = "id:wearos_small_round"
-    @Deprecated("Use [androidx.wear.tooling.preview.devices.WearDevices.SQUARE] from the " +
-        "wear:wear-tooling-preview library instead")
+    @Deprecated(
+        "Use [androidx.wear.tooling.preview.devices.WearDevices.SQUARE] from the " +
+            "wear:wear-tooling-preview library instead"
+    )
     const val WEAR_OS_SQUARE = "id:wearos_square"
-    @Deprecated("Use [androidx.wear.tooling.preview.devices.WearDevices.RECT] from the " +
-        "wear:wear-tooling-preview library instead")
+    @Deprecated(
+        "Use [androidx.wear.tooling.preview.devices.WearDevices.RECT] from the " +
+            "wear:wear-tooling-preview library instead"
+    )
     const val WEAR_OS_RECT = "id:wearos_rect"
 
     // Reference devices
@@ -82,60 +88,54 @@
     const val TV_1080p = "spec:shape=Normal,width=1920,height=1080,unit=dp,dpi=420"
 }
 
-/**
- * Annotation for defining the [Preview] device to use.
- */
+/** Annotation for defining the [Preview] device to use. */
 @Retention(AnnotationRetention.SOURCE)
 @Suppress("DEPRECATION")
 @StringDef(
     open = true,
-    value = [
-        Devices.DEFAULT,
-
-        Devices.NEXUS_7,
-        Devices.NEXUS_7_2013,
-        Devices.NEXUS_5,
-        Devices.NEXUS_6,
-        Devices.NEXUS_9,
-        Devices.NEXUS_10,
-        Devices.NEXUS_5X,
-        Devices.NEXUS_6P,
-        Devices.PIXEL_C,
-        Devices.PIXEL,
-        Devices.PIXEL_XL,
-        Devices.PIXEL_2,
-        Devices.PIXEL_2_XL,
-        Devices.PIXEL_3,
-        Devices.PIXEL_3_XL,
-        Devices.PIXEL_3A,
-        Devices.PIXEL_3A_XL,
-        Devices.PIXEL_4,
-        Devices.PIXEL_4_XL,
-        Devices.PIXEL_4A,
-        Devices.PIXEL_5,
-        Devices.PIXEL_6,
-        Devices.PIXEL_6_PRO,
-        Devices.PIXEL_6A,
-        Devices.PIXEL_7,
-        Devices.PIXEL_7_PRO,
-        Devices.PIXEL_7A,
-        Devices.PIXEL_FOLD,
-        Devices.PIXEL_TABLET,
-
-        Devices.AUTOMOTIVE_1024p,
-
-        Devices.WEAR_OS_LARGE_ROUND,
-        Devices.WEAR_OS_SMALL_ROUND,
-        Devices.WEAR_OS_SQUARE,
-        Devices.WEAR_OS_RECT,
-
-        Devices.PHONE,
-        Devices.FOLDABLE,
-        Devices.TABLET,
-        Devices.DESKTOP,
-
-        Devices.TV_720p,
-        Devices.TV_1080p,
-    ]
+    value =
+        [
+            Devices.DEFAULT,
+            Devices.NEXUS_7,
+            Devices.NEXUS_7_2013,
+            Devices.NEXUS_5,
+            Devices.NEXUS_6,
+            Devices.NEXUS_9,
+            Devices.NEXUS_10,
+            Devices.NEXUS_5X,
+            Devices.NEXUS_6P,
+            Devices.PIXEL_C,
+            Devices.PIXEL,
+            Devices.PIXEL_XL,
+            Devices.PIXEL_2,
+            Devices.PIXEL_2_XL,
+            Devices.PIXEL_3,
+            Devices.PIXEL_3_XL,
+            Devices.PIXEL_3A,
+            Devices.PIXEL_3A_XL,
+            Devices.PIXEL_4,
+            Devices.PIXEL_4_XL,
+            Devices.PIXEL_4A,
+            Devices.PIXEL_5,
+            Devices.PIXEL_6,
+            Devices.PIXEL_6_PRO,
+            Devices.PIXEL_6A,
+            Devices.PIXEL_7,
+            Devices.PIXEL_7_PRO,
+            Devices.PIXEL_7A,
+            Devices.PIXEL_FOLD,
+            Devices.PIXEL_TABLET,
+            Devices.AUTOMOTIVE_1024p,
+            Devices.WEAR_OS_LARGE_ROUND,
+            Devices.WEAR_OS_SMALL_ROUND,
+            Devices.WEAR_OS_SQUARE,
+            Devices.WEAR_OS_RECT,
+            Devices.PHONE,
+            Devices.FOLDABLE,
+            Devices.TABLET,
+            Devices.DESKTOP,
+            Devices.TV_720p,
+            Devices.TV_1080p,
+        ]
 )
 internal annotation class Device
diff --git a/compose/ui/ui-tooling-preview/src/androidMain/kotlin/androidx/compose/ui/tooling/preview/MultiPreviews.android.kt b/compose/ui/ui-tooling-preview/src/androidMain/kotlin/androidx/compose/ui/tooling/preview/MultiPreviews.android.kt
index 284dd31..599af10 100644
--- a/compose/ui/ui-tooling-preview/src/androidMain/kotlin/androidx/compose/ui/tooling/preview/MultiPreviews.android.kt
+++ b/compose/ui/ui-tooling-preview/src/androidMain/kotlin/androidx/compose/ui/tooling/preview/MultiPreviews.android.kt
@@ -28,17 +28,17 @@
 import androidx.compose.ui.tooling.preview.Wallpapers.YELLOW_DOMINATED_EXAMPLE
 
 /**
- * A MultiPreview annotation for displaying a @[Composable] method using the screen sizes of five different reference devices.
+ * A MultiPreview annotation for displaying a @[Composable] method using the screen sizes of five
+ * different reference devices.
  */
 @Retention(AnnotationRetention.BINARY)
-@Target(
-        AnnotationTarget.ANNOTATION_CLASS,
-        AnnotationTarget.FUNCTION
-)
+@Target(AnnotationTarget.ANNOTATION_CLASS, AnnotationTarget.FUNCTION)
 @Preview(name = "Phone", device = PHONE, showSystemUi = true)
-@Preview(name = "Phone - Landscape",
-         device = "spec:width = 411dp, height = 891dp, orientation = landscape, dpi = 420",
-         showSystemUi = true)
+@Preview(
+    name = "Phone - Landscape",
+    device = "spec:width = 411dp, height = 891dp, orientation = landscape, dpi = 420",
+    showSystemUi = true
+)
 @Preview(name = "Unfolded Foldable", device = FOLDABLE, showSystemUi = true)
 @Preview(name = "Tablet", device = TABLET, showSystemUi = true)
 @Preview(name = "Desktop", device = DESKTOP, showSystemUi = true)
@@ -48,10 +48,7 @@
  * A MultiPreview annotation for desplaying a @[Composable] method using seven standard font sizes.
  */
 @Retention(AnnotationRetention.BINARY)
-@Target(
-        AnnotationTarget.ANNOTATION_CLASS,
-        AnnotationTarget.FUNCTION
-)
+@Target(AnnotationTarget.ANNOTATION_CLASS, AnnotationTarget.FUNCTION)
 @Preview(name = "85%", fontScale = 0.85f)
 @Preview(name = "100%", fontScale = 1.0f)
 @Preview(name = "115%", fontScale = 1.15f)
@@ -67,24 +64,19 @@
  * Note that the app theme should support dark and light modes for these previews to be different.
  */
 @Retention(AnnotationRetention.BINARY)
-@Target(
-        AnnotationTarget.ANNOTATION_CLASS,
-        AnnotationTarget.FUNCTION
-)
+@Target(AnnotationTarget.ANNOTATION_CLASS, AnnotationTarget.FUNCTION)
 @Preview(name = "Light")
 @Preview(name = "Dark", uiMode = UI_MODE_NIGHT_YES or UI_MODE_TYPE_NORMAL)
 annotation class PreviewLightDark
 
 /**
- * A MultiPreview annotation for desplaying a @[Composable] method using four different wallpaper colors.
+ * A MultiPreview annotation for desplaying a @[Composable] method using four different wallpaper
+ * colors.
  *
  * Note that the app should use a dynamic theme for these previews to be different.
  */
 @Retention(AnnotationRetention.BINARY)
-@Target(
-        AnnotationTarget.ANNOTATION_CLASS,
-        AnnotationTarget.FUNCTION
-)
+@Target(AnnotationTarget.ANNOTATION_CLASS, AnnotationTarget.FUNCTION)
 @Preview(name = "Red", wallpaper = RED_DOMINATED_EXAMPLE)
 @Preview(name = "Blue", wallpaper = BLUE_DOMINATED_EXAMPLE)
 @Preview(name = "Green", wallpaper = GREEN_DOMINATED_EXAMPLE)
diff --git a/compose/ui/ui-tooling-preview/src/androidMain/kotlin/androidx/compose/ui/tooling/preview/Preview.android.kt b/compose/ui/ui-tooling-preview/src/androidMain/kotlin/androidx/compose/ui/tooling/preview/Preview.android.kt
index 71a8286..bf06078 100644
--- a/compose/ui/ui-tooling-preview/src/androidMain/kotlin/androidx/compose/ui/tooling/preview/Preview.android.kt
+++ b/compose/ui/ui-tooling-preview/src/androidMain/kotlin/androidx/compose/ui/tooling/preview/Preview.android.kt
@@ -24,7 +24,7 @@
  * [Preview] can be applied to either of the following:
  * - @[Composable] methods with no parameters to show them in the Android Studio preview.
  * - Annotation classes, that could then be used to annotate @[Composable] methods or other
- * annotation classes, which will then be considered as indirectly annotated with that [Preview].
+ *   annotation classes, which will then be considered as indirectly annotated with that [Preview].
  *
  * The annotation contains a number of parameters that allow to define the way the @[Composable]
  * will be rendered within the preview.
@@ -33,34 +33,31 @@
  *
  * @param name Display name of this preview allowing to identify it in the panel.
  * @param group Group name for this @[Preview]. This allows grouping them in the UI and display only
- * one or more of them.
+ *   one or more of them.
  * @param apiLevel API level to be used when rendering the annotated @[Composable]
  * @param widthDp Max width in DP the annotated @[Composable] will be rendered in. Use this to
- * restrict the size of the rendering viewport.
+ *   restrict the size of the rendering viewport.
  * @param heightDp Max height in DP the annotated @[Composable] will be rendered in. Use this to
- * restrict the size of the rendering viewport.
+ *   restrict the size of the rendering viewport.
  * @param locale Current user preference for the locale, corresponding to
- * [locale](https://d.android.com/guide/topics/resources/providing-resources.html#LocaleQualifier) resource
- * qualifier. By default, the `default` folder will be used. To preview an RTL layout use
- * a locale that uses right to left script, such as `ar` (or the `ar-rXB` pseudo locale).
- * @param fontScale User preference for the scaling factor for fonts, relative to the base
- * density scaling.
+ *   [locale](https://d.android.com/guide/topics/resources/providing-resources.html#LocaleQualifier)
+ *   resource qualifier. By default, the `default` folder will be used. To preview an RTL layout use
+ *   a locale that uses right to left script, such as `ar` (or the `ar-rXB` pseudo locale).
+ * @param fontScale User preference for the scaling factor for fonts, relative to the base density
+ *   scaling.
  * @param showSystemUi If true, the status bar and action bar of the device will be displayed.
- * The @[Composable] will be render in the context of a full activity.
+ *   The @[Composable] will be render in the context of a full activity.
  * @param showBackground If true, the @[Composable] will use a default background color.
  * @param backgroundColor The 32-bit ARGB color int for the background or 0 if not set
  * @param uiMode Bit mask of the ui mode as per [android.content.res.Configuration.uiMode]
  * @param device Device string indicating the device to use in the preview. See the available
- * devices in [Devices].
- * @param wallpaper Integer defining which wallpaper from those available in Android Studio
- * to use for dynamic theming.
+ *   devices in [Devices].
+ * @param wallpaper Integer defining which wallpaper from those available in Android Studio to use
+ *   for dynamic theming.
  */
 @MustBeDocumented
 @Retention(AnnotationRetention.BINARY)
-@Target(
-    AnnotationTarget.ANNOTATION_CLASS,
-    AnnotationTarget.FUNCTION
-)
+@Target(AnnotationTarget.ANNOTATION_CLASS, AnnotationTarget.FUNCTION)
 @Repeatable
 annotation class Preview(
     val name: String = "",
diff --git a/compose/ui/ui-tooling-preview/src/androidMain/kotlin/androidx/compose/ui/tooling/preview/PreviewParameter.android.kt b/compose/ui/ui-tooling-preview/src/androidMain/kotlin/androidx/compose/ui/tooling/preview/PreviewParameter.android.kt
index 348cc14..d545f8b 100644
--- a/compose/ui/ui-tooling-preview/src/androidMain/kotlin/androidx/compose/ui/tooling/preview/PreviewParameter.android.kt
+++ b/compose/ui/ui-tooling-preview/src/androidMain/kotlin/androidx/compose/ui/tooling/preview/PreviewParameter.android.kt
@@ -25,22 +25,19 @@
  */
 @JvmDefaultWithCompatibility
 interface PreviewParameterProvider<T> {
-    /**
-     * [Sequence] of values of type [T] to be passed as @[Preview] parameter.
-     */
+    /** [Sequence] of values of type [T] to be passed as @[Preview] parameter. */
     val values: Sequence<T>
 
-    /**
-     * Returns the number of elements in the [values] [Sequence].
-     */
-    val count get() = values.count()
+    /** Returns the number of elements in the [values] [Sequence]. */
+    val count
+        get() = values.count()
 }
 
 /**
  * [PreviewParameter] can be applied to any parameter of a @[Preview].
  *
  * @param provider A [PreviewParameterProvider] class to use to inject values to the annotated
- * parameter.
+ *   parameter.
  * @param limit Max number of values from [provider] to inject to this parameter.
  */
 annotation class PreviewParameter(
diff --git a/compose/ui/ui-tooling-preview/src/androidMain/kotlin/androidx/compose/ui/tooling/preview/UiMode.android.kt b/compose/ui/ui-tooling-preview/src/androidMain/kotlin/androidx/compose/ui/tooling/preview/UiMode.android.kt
index 5ea037f..acd1533 100644
--- a/compose/ui/ui-tooling-preview/src/androidMain/kotlin/androidx/compose/ui/tooling/preview/UiMode.android.kt
+++ b/compose/ui/ui-tooling-preview/src/androidMain/kotlin/androidx/compose/ui/tooling/preview/UiMode.android.kt
@@ -33,27 +33,26 @@
 import androidx.annotation.IntDef
 import androidx.annotation.RestrictTo
 
-/**
- * Annotation of setting uiMode in [Preview].
- */
+/** Annotation of setting uiMode in [Preview]. */
 @RestrictTo(RestrictTo.Scope.LIBRARY)
 @SuppressLint("UniqueConstants") // UI_MODE_NIGHT_UNDEFINED == UI_MODE_TYPE_UNDEFINED
 @Retention(AnnotationRetention.SOURCE)
 @IntDef(
-    value = [
-        UI_MODE_TYPE_MASK,
-        UI_MODE_TYPE_UNDEFINED,
-        UI_MODE_TYPE_APPLIANCE,
-        UI_MODE_TYPE_CAR,
-        UI_MODE_TYPE_DESK,
-        UI_MODE_TYPE_NORMAL,
-        UI_MODE_TYPE_TELEVISION,
-        UI_MODE_TYPE_VR_HEADSET,
-        UI_MODE_TYPE_WATCH,
-        UI_MODE_NIGHT_MASK,
-        UI_MODE_NIGHT_UNDEFINED,
-        UI_MODE_NIGHT_NO,
-        UI_MODE_NIGHT_YES
-    ]
+    value =
+        [
+            UI_MODE_TYPE_MASK,
+            UI_MODE_TYPE_UNDEFINED,
+            UI_MODE_TYPE_APPLIANCE,
+            UI_MODE_TYPE_CAR,
+            UI_MODE_TYPE_DESK,
+            UI_MODE_TYPE_NORMAL,
+            UI_MODE_TYPE_TELEVISION,
+            UI_MODE_TYPE_VR_HEADSET,
+            UI_MODE_TYPE_WATCH,
+            UI_MODE_NIGHT_MASK,
+            UI_MODE_NIGHT_UNDEFINED,
+            UI_MODE_NIGHT_NO,
+            UI_MODE_NIGHT_YES
+        ]
 )
 annotation class UiMode
diff --git a/compose/ui/ui-tooling-preview/src/androidMain/kotlin/androidx/compose/ui/tooling/preview/Wallpaper.android.kt b/compose/ui/ui-tooling-preview/src/androidMain/kotlin/androidx/compose/ui/tooling/preview/Wallpaper.android.kt
index 34f0979..ed57f09 100644
--- a/compose/ui/ui-tooling-preview/src/androidMain/kotlin/androidx/compose/ui/tooling/preview/Wallpaper.android.kt
+++ b/compose/ui/ui-tooling-preview/src/androidMain/kotlin/androidx/compose/ui/tooling/preview/Wallpaper.android.kt
@@ -18,9 +18,7 @@
 
 import androidx.annotation.IntDef
 
-/**
- * Wallpapers available to be used in the [Preview].
- */
+/** Wallpapers available to be used in the [Preview]. */
 object Wallpapers {
     /** Default value, representing dynamic theming not enabled. */
     const val NONE = -1
@@ -34,10 +32,13 @@
     const val YELLOW_DOMINATED_EXAMPLE = 3
 }
 
-/**
- * Annotation for defining the wallpaper to use for dynamic theming in the [Preview].
- */
+/** Annotation for defining the wallpaper to use for dynamic theming in the [Preview]. */
 @Retention(AnnotationRetention.SOURCE)
-@IntDef(Wallpapers.NONE, Wallpapers.RED_DOMINATED_EXAMPLE, Wallpapers.GREEN_DOMINATED_EXAMPLE,
-    Wallpapers.BLUE_DOMINATED_EXAMPLE, Wallpapers.YELLOW_DOMINATED_EXAMPLE)
+@IntDef(
+    Wallpapers.NONE,
+    Wallpapers.RED_DOMINATED_EXAMPLE,
+    Wallpapers.GREEN_DOMINATED_EXAMPLE,
+    Wallpapers.BLUE_DOMINATED_EXAMPLE,
+    Wallpapers.YELLOW_DOMINATED_EXAMPLE
+)
 internal annotation class Wallpaper
diff --git a/compose/ui/ui-tooling-preview/src/androidMain/kotlin/androidx/compose/ui/tooling/preview/datasource/LoremIpsum.android.kt b/compose/ui/ui-tooling-preview/src/androidMain/kotlin/androidx/compose/ui/tooling/preview/datasource/LoremIpsum.android.kt
index dec0f53..53d0ec9 100644
--- a/compose/ui/ui-tooling-preview/src/androidMain/kotlin/androidx/compose/ui/tooling/preview/datasource/LoremIpsum.android.kt
+++ b/compose/ui/ui-tooling-preview/src/androidMain/kotlin/androidx/compose/ui/tooling/preview/datasource/LoremIpsum.android.kt
@@ -18,7 +18,8 @@
 
 import androidx.compose.ui.tooling.preview.PreviewParameterProvider
 
-private val LOREM_IPSUM_SOURCE = """
+private val LOREM_IPSUM_SOURCE =
+    """
 Lorem ipsum dolor sit amet, consectetur adipiscing elit. Integer sodales
 laoreet commodo. Phasellus a purus eu risus elementum consequat. Aenean eu
 elit ut nunc convallis laoreet non ut libero. Suspendisse interdum placerat
@@ -36,7 +37,9 @@
 Phasellus quis suscipit nisi. Nam elementum malesuada tincidunt. Curabitur
 iaculis pretium eros, malesuada faucibus leo eleifend a. Curabitur congue
 orci in neque euismod a blandit libero vehicula.
-""".trim().split(" ")
+"""
+        .trim()
+        .split(" ")
 
 /**
  * [PreviewParameterProvider] with 1 value containing Lorem Ipsum.
@@ -51,14 +54,12 @@
     override val values: Sequence<String>
         get() = sequenceOf(generateLoremIpsum(words))
 
-    /**
-     * Generate a Lorem Ipsum [words] long.
-     */
+    /** Generate a Lorem Ipsum [words] long. */
     private fun generateLoremIpsum(words: Int): String {
         var wordsUsed = 0
         val loremIpsumMaxSize = LOREM_IPSUM_SOURCE.size
-        return generateSequence {
-            LOREM_IPSUM_SOURCE[wordsUsed++ % loremIpsumMaxSize]
-        }.take(words).joinToString(" ")
+        return generateSequence { LOREM_IPSUM_SOURCE[wordsUsed++ % loremIpsumMaxSize] }
+            .take(words)
+            .joinToString(" ")
     }
 }
diff --git a/compose/ui/ui-tooling-preview/src/androidUnitTest/kotlin/androidx/compose/ui/tooling/preview/datasource/LoremIpsumTest.kt b/compose/ui/ui-tooling-preview/src/androidUnitTest/kotlin/androidx/compose/ui/tooling/preview/datasource/LoremIpsumTest.kt
index 59d914e..fef77e9 100644
--- a/compose/ui/ui-tooling-preview/src/androidUnitTest/kotlin/androidx/compose/ui/tooling/preview/datasource/LoremIpsumTest.kt
+++ b/compose/ui/ui-tooling-preview/src/androidUnitTest/kotlin/androidx/compose/ui/tooling/preview/datasource/LoremIpsumTest.kt
@@ -29,9 +29,7 @@
                 "laoreet",
             LoremIpsum(10).values.single()
         )
-        assertEquals(
-            2000, LoremIpsum(2000).values.single().split(" ").size
-        )
+        assertEquals(2000, LoremIpsum(2000).values.single().split(" ").size)
         assertTrue(LoremIpsum().values.single().startsWith("Lorem ipsum dolor sit amet"))
     }
 }
diff --git a/compose/ui/ui-tooling-preview/src/desktopMain/kotlin/androidx/compose/desktop/ui/tooling/preview/Preview.desktop.kt b/compose/ui/ui-tooling-preview/src/desktopMain/kotlin/androidx/compose/desktop/ui/tooling/preview/Preview.desktop.kt
index d57ddc4..629512e 100644
--- a/compose/ui/ui-tooling-preview/src/desktopMain/kotlin/androidx/compose/desktop/ui/tooling/preview/Preview.desktop.kt
+++ b/compose/ui/ui-tooling-preview/src/desktopMain/kotlin/androidx/compose/desktop/ui/tooling/preview/Preview.desktop.kt
@@ -16,8 +16,4 @@
 
 package androidx.compose.desktop.ui.tooling.preview
 
-@Retention(AnnotationRetention.SOURCE)
-@Target(
-    AnnotationTarget.FUNCTION
-)
-annotation class Preview
+@Retention(AnnotationRetention.SOURCE) @Target(AnnotationTarget.FUNCTION) annotation class Preview
diff --git a/compose/ui/ui-tooling/src/androidInstrumentedTest/kotlin/androidx/compose/ui/tooling/ComposeInvokerTest.kt b/compose/ui/ui-tooling/src/androidInstrumentedTest/kotlin/androidx/compose/ui/tooling/ComposeInvokerTest.kt
index efe77d9..5101221 100644
--- a/compose/ui/ui-tooling/src/androidInstrumentedTest/kotlin/androidx/compose/ui/tooling/ComposeInvokerTest.kt
+++ b/compose/ui/ui-tooling/src/androidInstrumentedTest/kotlin/androidx/compose/ui/tooling/ComposeInvokerTest.kt
@@ -33,8 +33,7 @@
 @OptIn(ExperimentalComposeUiApi::class)
 class ComposeInvokerTest {
 
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
     @Test
     fun workingComposable() {
@@ -120,9 +119,7 @@
 
 class MyTestComposables {
 
-    @Composable
-    fun MyWorkingComposable() {
-    }
+    @Composable fun MyWorkingComposable() {}
 
     @Composable
     fun MyThrowExceptionComposable() {
@@ -132,9 +129,7 @@
 
 class MyTestComposableWithBooleanPreviewParams {
 
-    @Composable
-    fun TestContent() {
-    }
+    @Composable fun TestContent() {}
 
     @Preview
     @Composable
@@ -142,8 +137,7 @@
         @PreviewParameter(TestContentParameterProviderBoolean::class)
         @Suppress("UNUSED_PARAMETER")
         valueParameter: Boolean
-    ) {
-    }
+    ) {}
 
     private class TestContentParameterProviderBoolean : PreviewParameterProvider<Boolean> {
         override val values = sequenceOf(true, false)
@@ -152,9 +146,7 @@
 
 class MyTestComposableWithIntPreviewParams {
 
-    @Composable
-    fun TestContent() {
-    }
+    @Composable fun TestContent() {}
 
     @Preview
     @Composable
@@ -162,8 +154,7 @@
         @PreviewParameter(TestContentParameterProviderInt::class)
         @Suppress("UNUSED_PARAMETER")
         valueParameter: Int
-    ) {
-    }
+    ) {}
 
     private class TestContentParameterProviderInt : PreviewParameterProvider<Int> {
         override val values = sequenceOf(42, 45, 92)
@@ -177,8 +168,7 @@
         @PreviewParameter(CornerRadiusParamProvider::class)
         @Suppress("UNUSED_PARAMETER")
         radius: CornerRadius
-    ) {
-    }
+    ) {}
 
     class CornerRadiusParamProvider : PreviewParameterProvider<CornerRadius> {
         override val values: Sequence<CornerRadius>
diff --git a/compose/ui/ui-tooling/src/androidInstrumentedTest/kotlin/androidx/compose/ui/tooling/ComposeViewAdapterTest.kt b/compose/ui/ui-tooling/src/androidInstrumentedTest/kotlin/androidx/compose/ui/tooling/ComposeViewAdapterTest.kt
index 5bf1b37..fa00eec 100644
--- a/compose/ui/ui-tooling/src/androidInstrumentedTest/kotlin/androidx/compose/ui/tooling/ComposeViewAdapterTest.kt
+++ b/compose/ui/ui-tooling/src/androidInstrumentedTest/kotlin/androidx/compose/ui/tooling/ComposeViewAdapterTest.kt
@@ -42,9 +42,8 @@
 class ComposeViewAdapterTest {
     @Suppress("DEPRECATION")
     @get:Rule
-    val activityTestRule = androidx.test.rule.ActivityTestRule<TestActivity>(
-        TestActivity::class.java
-    )
+    val activityTestRule =
+        androidx.test.rule.ActivityTestRule<TestActivity>(TestActivity::class.java)
 
     private lateinit var composeViewAdapter: ComposeViewAdapter
 
@@ -53,14 +52,10 @@
         composeViewAdapter = activityTestRule.activity.findViewById(R.id.compose_view_adapter)
     }
 
-    /**
-     * Asserts that the given Composable method executes correct and outputs some [ViewInfo]s.
-     */
+    /** Asserts that the given Composable method executes correct and outputs some [ViewInfo]s. */
     private fun assertRendersCorrectly(className: String, methodName: String): List<ViewInfo> {
         initAndWaitForDraw(className, methodName)
-        activityTestRule.runOnUiThread {
-            assertTrue(composeViewAdapter.viewInfos.isNotEmpty())
-        }
+        activityTestRule.runOnUiThread { assertTrue(composeViewAdapter.viewInfos.isNotEmpty()) }
 
         return composeViewAdapter.viewInfos
     }
@@ -82,9 +77,7 @@
                 debugViewInfos = true,
                 lookForDesignInfoProviders = true,
                 designInfoProvidersArgument = designInfoProvidersArgument,
-                onCommit = {
-                    committed.set(true)
-                },
+                onCommit = { committed.set(true) },
                 onDraw = {
                     if (committed.get()) {
                         committedAndDrawn.countDown()
@@ -95,9 +88,7 @@
 
         // Workaround for a problem described in b/174291742 where onLayout will not be called
         // after composition for the first test in the test suite.
-        activityTestRule.runOnUiThread {
-            composeViewAdapter.requestLayout()
-        }
+        activityTestRule.runOnUiThread { composeViewAdapter.requestLayout() }
 
         // Wait for the first draw after the Composable has been committed.
         committedAndDrawn.await()
@@ -105,12 +96,14 @@
 
     @Test
     fun instantiateComposeViewAdapter() {
-        val viewInfos = assertRendersCorrectly(
-            "androidx.compose.ui.tooling.SimpleComposablePreviewKt",
-            "SimpleComposablePreview"
-        ).flatMap { it.allChildren() + it }
-            .filter { it.fileName == "SimpleComposablePreview.kt" }
-            .toList()
+        val viewInfos =
+            assertRendersCorrectly(
+                    "androidx.compose.ui.tooling.SimpleComposablePreviewKt",
+                    "SimpleComposablePreview"
+                )
+                .flatMap { it.allChildren() + it }
+                .filter { it.fileName == "SimpleComposablePreview.kt" }
+                .toList()
 
         activityTestRule.runOnUiThread {
             assertTrue(viewInfos.isNotEmpty())
@@ -125,51 +118,50 @@
     fun lazyColumn() {
         run {
             composeViewAdapter.stitchTrees = false
-            val viewInfos = assertRendersCorrectly(
-                "androidx.compose.ui.tooling.LazyColumnPreviewKt",
-                "SimpleLazyComposablePreview"
-            )
+            val viewInfos =
+                assertRendersCorrectly(
+                    "androidx.compose.ui.tooling.LazyColumnPreviewKt",
+                    "SimpleLazyComposablePreview"
+                )
 
             assertEquals(
                 """
                     |<root>
-                    .|LazyColumnPreview.kt:35
-                    |<root>
-                    .|LazyColumnPreview.kt:35
-                    |<root>
-                    .|LazyColumnPreview.kt:35
+                    .|LazyColumnPreview.kt:31
                     |<root>
                     .|LazyColumnPreview.kt:31
-                    ..|LazyColumnPreview.kt:32
-                """.trimIndent(),
-                viewInfos.toDebugString {
-                it.fileName == "LazyColumnPreview.kt"
-            }.trimIndent())
+                    |<root>
+                    .|LazyColumnPreview.kt:31
+                    |<root>
+                    .|LazyColumnPreview.kt:31
+                    ..|LazyColumnPreview.kt:31
+                """
+                    .trimIndent(),
+                viewInfos.toDebugString { it.fileName == "LazyColumnPreview.kt" }.trimIndent()
+            )
         }
 
         run {
             composeViewAdapter.stitchTrees = true
-            val viewInfos = assertRendersCorrectly(
-                "androidx.compose.ui.tooling.LazyColumnPreviewKt",
-                "SimpleLazyComposablePreview"
-            )
+            val viewInfos =
+                assertRendersCorrectly(
+                    "androidx.compose.ui.tooling.LazyColumnPreviewKt",
+                    "SimpleLazyComposablePreview"
+                )
 
-            assertEquals(
-                1,
-                viewInfos.size
-            )
+            assertEquals(1, viewInfos.size)
             assertEquals(
                 """
                     |<root>
                     .|LazyColumnPreview.kt:31
-                    ..|LazyColumnPreview.kt:32
-                    ...|LazyColumnPreview.kt:35
-                    ...|LazyColumnPreview.kt:35
-                    ...|LazyColumnPreview.kt:35
-                """.trimIndent(),
-                viewInfos.toDebugString() {
-                    it.fileName == "LazyColumnPreview.kt"
-                }.trimIndent())
+                    ..|LazyColumnPreview.kt:31
+                    ...|LazyColumnPreview.kt:31
+                    ...|LazyColumnPreview.kt:31
+                    ...|LazyColumnPreview.kt:31
+                """
+                    .trimIndent(),
+                viewInfos.toDebugString() { it.fileName == "LazyColumnPreview.kt" }.trimIndent()
+            )
         }
     }
 
@@ -177,29 +169,29 @@
     fun complexTreeStitchLazyColumn() {
         run {
             composeViewAdapter.stitchTrees = true
-            val viewInfos = assertRendersCorrectly(
-                "androidx.compose.ui.tooling.LazyColumnPreviewKt",
-                "ComplexLazyComposablePreview"
-            )
+            val viewInfos =
+                assertRendersCorrectly(
+                    "androidx.compose.ui.tooling.LazyColumnPreviewKt",
+                    "ComplexLazyComposablePreview"
+                )
 
             assertEquals(1, viewInfos.size)
             assertEquals(
                 """
                     |<root>
-                    .|LazyColumnPreview.kt:45
-                    ..|LazyColumnPreview.kt:46
-                    ...|LazyColumnPreview.kt:49
-                    ...|LazyColumnPreview.kt:50
-                    ....|LazyColumnPreview.kt:53
-                    ....|LazyColumnPreview.kt:53
-                    ....|LazyColumnPreview.kt:53
-                    .....|LazyColumnPreview.kt:54
-                    ....|LazyColumnPreview.kt:53
-                    .....|LazyColumnPreview.kt:54
-                """.trimIndent(),
-                viewInfos.toDebugString() {
-                    it.fileName == "LazyColumnPreview.kt"
-                }.trimIndent()
+                    .|LazyColumnPreview.kt:37
+                    ..|LazyColumnPreview.kt:38
+                    ...|LazyColumnPreview.kt:41
+                    ...|LazyColumnPreview.kt:42
+                    ....|LazyColumnPreview.kt:42
+                    ....|LazyColumnPreview.kt:42
+                    ....|LazyColumnPreview.kt:42
+                    .....|LazyColumnPreview.kt:42
+                    ....|LazyColumnPreview.kt:42
+                    .....|LazyColumnPreview.kt:42
+                """
+                    .trimIndent(),
+                viewInfos.toDebugString() { it.fileName == "LazyColumnPreview.kt" }.trimIndent()
             )
         }
     }
@@ -259,11 +251,7 @@
 
     @Test
     fun transitionAnimationsAreSubscribedToTheClock() {
-        checkAnimationsAreSubscribed(
-            "TransitionPreview",
-            emptyList(),
-            listOf("checkBoxAnim")
-        )
+        checkAnimationsAreSubscribed("TransitionPreview", emptyList(), listOf("checkBoxAnim"))
     }
 
     @Test
@@ -288,11 +276,12 @@
         AnimateXAsStateComposeAnimation.testOverrideAvailability(false)
         checkAnimationsAreSubscribed(
             "AllAnimations",
-            unsupported = listOf(
-                "animateContentSize",
-                "TargetBasedAnimation",
-                "DecayAnimation",
-            ),
+            unsupported =
+                listOf(
+                    "animateContentSize",
+                    "TargetBasedAnimation",
+                    "DecayAnimation",
+                ),
             transitions = listOf("checkBoxAnim", "Crossfade"),
             animatedContent = listOf("AnimatedContent"),
             animateXAsState = emptyList(),
@@ -317,11 +306,7 @@
 
     @Test
     fun crossFadeIsSubscribed() {
-        checkAnimationsAreSubscribed(
-            "CrossFadePreview",
-            emptyList(),
-            listOf("Crossfade")
-        )
+        checkAnimationsAreSubscribed("CrossFadePreview", emptyList(), listOf("Crossfade"))
     }
 
     @Test
@@ -413,10 +398,7 @@
         val clock = PreviewAnimationClock()
 
         activityTestRule.runOnUiThread {
-            composeViewAdapter.init(
-                "androidx.compose.ui.tooling.TestAnimationPreviewKt",
-                preview
-            )
+            composeViewAdapter.init("androidx.compose.ui.tooling.TestAnimationPreviewKt", preview)
             composeViewAdapter.clock = clock
             assertFalse(composeViewAdapter.hasAnimations())
             assertTrue(clock.transitionClocks.isEmpty())
@@ -436,13 +418,18 @@
         activityTestRule.runOnUiThread {
             assertEquals(unsupported, clock.trackedUnsupportedAnimations.map { it.label })
             assertEquals(transitions, clock.transitionClocks.values.map { it.animation.label })
-            assertEquals(animateXAsState,
-                clock.animateXAsStateClocks.values.map { it.animation.label })
+            assertEquals(
+                animateXAsState,
+                clock.animateXAsStateClocks.values.map { it.animation.label }
+            )
             assertEquals(
                 animatedContent,
-                clock.animatedContentClocks.values.map { it.animation.label })
-            assertEquals(infiniteTransitions,
-                clock.infiniteTransitionClocks.values.map { it.animation.label })
+                clock.animatedContentClocks.values.map { it.animation.label }
+            )
+            assertEquals(
+                infiniteTransitions,
+                clock.infiniteTransitionClocks.values.map { it.animation.label }
+            )
             assertEquals(0, clock.animatedVisibilityClocks.size)
         }
     }
@@ -459,10 +446,7 @@
 
     private fun findAnimationWithoutClock(preview: String) {
         activityTestRule.runOnUiThread {
-            composeViewAdapter.init(
-                "androidx.compose.ui.tooling.TestAnimationPreviewKt",
-                preview
-            )
+            composeViewAdapter.init("androidx.compose.ui.tooling.TestAnimationPreviewKt", preview)
             assertFalse(composeViewAdapter.hasAnimations())
         }
 
@@ -477,48 +461,42 @@
 
     @Test
     fun lineNumberMapping() {
-        val viewInfos = assertRendersCorrectly(
-            "androidx.compose.ui.tooling.LineNumberPreviewKt",
-            "LineNumberPreview"
-        ).flatMap { it.allChildren() + it }
-            .filter { it.fileName == "LineNumberPreview.kt" }
-            .toList()
+        val viewInfos =
+            assertRendersCorrectly(
+                    "androidx.compose.ui.tooling.LineNumberPreviewKt",
+                    "LineNumberPreview"
+                )
+                .flatMap { it.allChildren() + it }
+                .filter { it.fileName == "LineNumberPreview.kt" }
+                .toList()
 
         activityTestRule.runOnUiThread {
             // Verify all calls, generate the correct line number information
             assertArrayEquals(
-                arrayOf(36, 37, 38, 40, 43, 44, 45),
-                viewInfos
-                    .map { it.lineNumber }
-                    .sorted()
-                    .distinct()
-                    .toTypedArray()
+                arrayOf(35, 36, 37, 39, 42, 43, 44),
+                viewInfos.map { it.lineNumber }.sorted().distinct().toTypedArray()
             )
         }
     }
 
     //    @Test
     fun lineNumberLocationMapping() {
-        val viewInfos = assertRendersCorrectly(
-            "androidx.compose.ui.tooling.LineNumberPreviewKt",
-            "LineNumberPreview"
-        ).flatMap { it.allChildren() + it }
-            .filter { it.location?.let { it.sourceFile == "LineNumberPreview.kt" } == true }
-            .toList()
+        val viewInfos =
+            assertRendersCorrectly(
+                    "androidx.compose.ui.tooling.LineNumberPreviewKt",
+                    "LineNumberPreview"
+                )
+                .flatMap { it.allChildren() + it }
+                .filter { it.location?.let { it.sourceFile == "LineNumberPreview.kt" } == true }
+                .toList()
 
         activityTestRule.runOnUiThread {
             // Verify all calls, generate the correct line number information
-            val lines = viewInfos
-                .map { it.location?.lineNumber ?: -1 }
-                .sorted()
-                .toTypedArray()
+            val lines = viewInfos.map { it.location?.lineNumber ?: -1 }.sorted().toTypedArray()
             assertArrayEquals(arrayOf(36, 37, 38, 40, 40, 40, 43, 44, 44, 45, 45), lines)
 
             // Verify that all calls generate the correct offset information
-            val offsets = viewInfos
-                .map { it.location?.offset ?: -1 }
-                .sorted()
-                .toTypedArray()
+            val offsets = viewInfos.map { it.location?.offset ?: -1 }.sorted().toTypedArray()
             assertArrayEquals(
                 arrayOf(1235, 1272, 1293, 1421, 1421, 1421, 1469, 1491, 1508, 1531, 1548),
                 offsets
@@ -559,9 +537,9 @@
     }
 
     /**
-     * Verifies the use of inline classes as preview default parameters. Methods with inline
-     * classes as parameters will get the name mangled so we need to ensure we invoke correctly
-     * the right method.
+     * Verifies the use of inline classes as preview default parameters. Methods with inline classes
+     * as parameters will get the name mangled so we need to ensure we invoke correctly the right
+     * method.
      */
     @Test
     fun defaultParametersComposableTest4() {
@@ -581,10 +559,7 @@
 
     @Test
     fun previewInClass() {
-        assertRendersCorrectly(
-            "androidx.compose.ui.tooling.TestGroup",
-            "InClassPreview"
-        )
+        assertRendersCorrectly("androidx.compose.ui.tooling.TestGroup", "InClassPreview")
     }
 
     @Test
@@ -634,14 +609,12 @@
             "Multipreview"
         )
         assertRendersCorrectly(
-                "androidx.compose.ui.tooling.SimpleComposablePreviewKt",
-                "MultiPreviews"
+            "androidx.compose.ui.tooling.SimpleComposablePreviewKt",
+            "MultiPreviews"
         )
     }
 
-    /**
-     * Check that no re-composition happens without forcing it.
-     */
+    /** Check that no re-composition happens without forcing it. */
     @LargeTest
     @Test
     fun testNoInvalidation() {
@@ -670,9 +643,7 @@
         }
     }
 
-    /**
-     * Check re-composition happens when forced.
-     */
+    /** Check re-composition happens when forced. */
     @Test
     fun testInvalidation() {
         compositionCount.set(0)
@@ -685,9 +656,7 @@
                 onDraw = { drawCountDownLatch.countDown() }
             )
         }
-        activityTestRule.runOnUiThread {
-            assertEquals(1, compositionCount.get())
-        }
+        activityTestRule.runOnUiThread { assertEquals(1, compositionCount.get()) }
         // Draw will keep happening so, eventually this will hit 0
         assertTrue(drawCountDownLatch.await(10, TimeUnit.SECONDS))
     }
@@ -729,18 +698,12 @@
      * Waits for a given condition to be satisfied within a given timeout. Fails the test when
      * timing out. The condition is evaluated on the UI thread.
      */
-    private fun waitFor(
-        timeout: Long,
-        timeUnit: TimeUnit,
-        conditionExpression: () -> Boolean
-    ) {
+    private fun waitFor(timeout: Long, timeUnit: TimeUnit, conditionExpression: () -> Boolean) {
         val conditionSatisfied = AtomicBoolean(false)
         val now = System.nanoTime()
         val timeoutNanos = timeUnit.toNanos(timeout)
         while (!conditionSatisfied.get()) {
-            activityTestRule.runOnUiThread {
-                conditionSatisfied.set(conditionExpression())
-            }
+            activityTestRule.runOnUiThread { conditionSatisfied.set(conditionExpression()) }
             if ((System.nanoTime() - now) > timeoutNanos) {
                 // Some previews are expected not to have animations.
                 return
diff --git a/compose/ui/ui-tooling/src/androidInstrumentedTest/kotlin/androidx/compose/ui/tooling/DesignInfoProviderComposable.kt b/compose/ui/ui-tooling/src/androidInstrumentedTest/kotlin/androidx/compose/ui/tooling/DesignInfoProviderComposable.kt
index b916f34..a434d01 100644
--- a/compose/ui/ui-tooling/src/androidInstrumentedTest/kotlin/androidx/compose/ui/tooling/DesignInfoProviderComposable.kt
+++ b/compose/ui/ui-tooling/src/androidInstrumentedTest/kotlin/androidx/compose/ui/tooling/DesignInfoProviderComposable.kt
@@ -34,9 +34,7 @@
 @Preview
 @Composable
 fun ScaffoldDesignInfoProvider() {
-    Scaffold {
-        DesignInfoProviderA()
-    }
+    Scaffold { DesignInfoProviderA() }
 }
 
 @Composable
diff --git a/compose/ui/ui-tooling/src/androidInstrumentedTest/kotlin/androidx/compose/ui/tooling/HotReloaderTest.kt b/compose/ui/ui-tooling/src/androidInstrumentedTest/kotlin/androidx/compose/ui/tooling/HotReloaderTest.kt
index 3c117e8..6717263 100644
--- a/compose/ui/ui-tooling/src/androidInstrumentedTest/kotlin/androidx/compose/ui/tooling/HotReloaderTest.kt
+++ b/compose/ui/ui-tooling/src/androidInstrumentedTest/kotlin/androidx/compose/ui/tooling/HotReloaderTest.kt
@@ -28,22 +28,24 @@
      */
     @Test
     fun checkViaReflection() {
-        val hotReloader = HotReloaderTest::class.java.classLoader!!
-            .loadClass("androidx.compose.runtime.HotReloader")
-        val hotReloaderInstance = hotReloader.getDeclaredField("Companion").let {
-            it.isAccessible = true
-            it.get(null)
-        }
+        val hotReloader =
+            HotReloaderTest::class
+                .java
+                .classLoader!!
+                .loadClass("androidx.compose.runtime.HotReloader")
+        val hotReloaderInstance =
+            hotReloader.getDeclaredField("Companion").let {
+                it.isAccessible = true
+                it.get(null)
+            }
         val saveStateAndDisposeMethod =
-            hotReloaderInstance.javaClass.getDeclaredMethod("saveStateAndDispose", Any::class.java)
-                .also {
-                    it.isAccessible = true
-                }
+            hotReloaderInstance.javaClass
+                .getDeclaredMethod("saveStateAndDispose", Any::class.java)
+                .also { it.isAccessible = true }
         val loadStateAndDisposeMethod =
-            hotReloaderInstance.javaClass.getDeclaredMethod("loadStateAndCompose", Any::class.java)
-                .also {
-                    it.isAccessible = true
-                }
+            hotReloaderInstance.javaClass
+                .getDeclaredMethod("loadStateAndCompose", Any::class.java)
+                .also { it.isAccessible = true }
         assertNotNull(saveStateAndDisposeMethod)
         assertNotNull(loadStateAndDisposeMethod)
     }
diff --git a/compose/ui/ui-tooling/src/androidInstrumentedTest/kotlin/androidx/compose/ui/tooling/LazyColumnPreview.kt b/compose/ui/ui-tooling/src/androidInstrumentedTest/kotlin/androidx/compose/ui/tooling/LazyColumnPreview.kt
index 2d81a2e..c1425d4 100644
--- a/compose/ui/ui-tooling/src/androidInstrumentedTest/kotlin/androidx/compose/ui/tooling/LazyColumnPreview.kt
+++ b/compose/ui/ui-tooling/src/androidInstrumentedTest/kotlin/androidx/compose/ui/tooling/LazyColumnPreview.kt
@@ -28,15 +28,7 @@
 @Preview
 @Composable
 fun SimpleLazyComposablePreview() {
-    Surface(color = Color.Red) {
-        LazyColumn {
-            repeat(3) {
-                item {
-                    Text("Hello world")
-                }
-            }
-        }
-    }
+    Surface(color = Color.Red) { LazyColumn { repeat(3) { item { Text("Hello world") } } } }
 }
 
 @Preview
@@ -47,15 +39,7 @@
             repeat(1) {
                 item {
                     Text("Hello world")
-                    LazyRow {
-                        repeat(2) {
-                            item {
-                                Button(onClick = {}) {
-                                    Text("H$it")
-                                }
-                            }
-                        }
-                    }
+                    LazyRow { repeat(2) { item { Button(onClick = {}) { Text("H$it") } } } }
                 }
             }
         }
@@ -65,9 +49,5 @@
 @Preview
 @Composable
 fun SimpleTestComposablePreview() {
-    Surface(color = Color.Red) {
-            repeat(3) {
-                    Text("Hello world")
-            }
-    }
+    Surface(color = Color.Red) { repeat(3) { Text("Hello world") } }
 }
diff --git a/compose/ui/ui-tooling/src/androidInstrumentedTest/kotlin/androidx/compose/ui/tooling/LineNumberPreview.kt b/compose/ui/ui-tooling/src/androidInstrumentedTest/kotlin/androidx/compose/ui/tooling/LineNumberPreview.kt
index eeb4a51..ae49d4a 100644
--- a/compose/ui/ui-tooling/src/androidInstrumentedTest/kotlin/androidx/compose/ui/tooling/LineNumberPreview.kt
+++ b/compose/ui/ui-tooling/src/androidInstrumentedTest/kotlin/androidx/compose/ui/tooling/LineNumberPreview.kt
@@ -26,9 +26,8 @@
 import androidx.compose.ui.tooling.preview.Preview
 
 /**
- * Method used to verify the Composable -> Source Code mapping.
- * If the line numbers in this file change, the ComposeViewAdapter#lineNumberMapping test will
- * break!!!
+ * Method used to verify the Composable -> Source Code mapping. If the line numbers in this file
+ * change, the ComposeViewAdapter#lineNumberMapping test will break!!!
  */
 @Preview
 @Composable
diff --git a/compose/ui/ui-tooling/src/androidInstrumentedTest/kotlin/androidx/compose/ui/tooling/ParameterProviderComposable.kt b/compose/ui/ui-tooling/src/androidInstrumentedTest/kotlin/androidx/compose/ui/tooling/ParameterProviderComposable.kt
index 9c7f0cb..c1ed4bb 100644
--- a/compose/ui/ui-tooling/src/androidInstrumentedTest/kotlin/androidx/compose/ui/tooling/ParameterProviderComposable.kt
+++ b/compose/ui/ui-tooling/src/androidInstrumentedTest/kotlin/androidx/compose/ui/tooling/ParameterProviderComposable.kt
@@ -29,48 +29,34 @@
 @Suppress("PLATFORM_CLASS_MAPPED_TO_KOTLIN")
 @Preview
 @Composable
-fun OneStringParameter(
-    parameter: String
-) {
-    Surface(color = Color.Red) {
-        Text(parameter)
-    }
+fun OneStringParameter(parameter: String) {
+    Surface(color = Color.Red) { Text(parameter) }
 }
 
 @Suppress("PLATFORM_CLASS_MAPPED_TO_KOTLIN")
 @Preview
 @Composable
 fun OneIntParameter(parameter: Integer) {
-    Surface(color = Color.Red) {
-        Text("$parameter")
-    }
+    Surface(color = Color.Red) { Text("$parameter") }
 }
 
 @Suppress("PLATFORM_CLASS_MAPPED_TO_KOTLIN")
 @Preview
 @Composable
 fun ColorsParameter(parameter: Colors) {
-    MaterialTheme(colors = parameter) {
-        Button(onClick = {}) {
-            Text("Hello colors")
-        }
-    }
+    MaterialTheme(colors = parameter) { Button(onClick = {}) { Text("Hello colors") } }
 }
 
 @Suppress("PLATFORM_CLASS_MAPPED_TO_KOTLIN")
 @Preview
 @Composable
-fun BooleanParameter(
-    valueParameter: Boolean
-) {
+fun BooleanParameter(valueParameter: Boolean) {
     Text(valueParameter.toString())
 }
 
 @Suppress("PLATFORM_CLASS_MAPPED_TO_KOTLIN")
 @Preview
 @Composable
-fun CornerRadiusParameter(
-    radius: CornerRadius
-) {
+fun CornerRadiusParameter(radius: CornerRadius) {
     Text(radius.toString())
 }
diff --git a/compose/ui/ui-tooling/src/androidInstrumentedTest/kotlin/androidx/compose/ui/tooling/PreviewParameterTest.kt b/compose/ui/ui-tooling/src/androidInstrumentedTest/kotlin/androidx/compose/ui/tooling/PreviewParameterTest.kt
index ee8d3a72..b078037 100644
--- a/compose/ui/ui-tooling/src/androidInstrumentedTest/kotlin/androidx/compose/ui/tooling/PreviewParameterTest.kt
+++ b/compose/ui/ui-tooling/src/androidInstrumentedTest/kotlin/androidx/compose/ui/tooling/PreviewParameterTest.kt
@@ -41,8 +41,7 @@
 
     @Before
     fun setup() {
-        composeViewAdapter =
-            activityTestRule.activity.findViewById(R.id.compose_view_adapter)
+        composeViewAdapter = activityTestRule.activity.findViewById(R.id.compose_view_adapter)
     }
 
     @Test
@@ -71,9 +70,8 @@
         }
     }
 
-    private class MyColorsProvider : CollectionPreviewParameterProvider<Colors>(
-        listOf(lightColors(), darkColors())
-    )
+    private class MyColorsProvider :
+        CollectionPreviewParameterProvider<Colors>(listOf(lightColors(), darkColors()))
 
     @Test
     fun checkColorsProvider() {
@@ -87,9 +85,8 @@
         }
     }
 
-    private class MyBooleanProvider : CollectionPreviewParameterProvider<Boolean>(
-        listOf(true, false)
-    )
+    private class MyBooleanProvider :
+        CollectionPreviewParameterProvider<Boolean>(listOf(true, false))
 
     @Test
     fun checkBooleanProvider() {
@@ -103,9 +100,10 @@
         }
     }
 
-    class MyCornerRadiusProvider : CollectionPreviewParameterProvider<CornerRadius>(
-        listOf(CornerRadius.Zero, CornerRadius(5f))
-    )
+    class MyCornerRadiusProvider :
+        CollectionPreviewParameterProvider<CornerRadius>(
+            listOf(CornerRadius.Zero, CornerRadius(5f))
+        )
 
     @Test
     fun checkKotlinValueClasses() {
diff --git a/compose/ui/ui-tooling/src/androidInstrumentedTest/kotlin/androidx/compose/ui/tooling/SimpleComposablePreview.kt b/compose/ui/ui-tooling/src/androidInstrumentedTest/kotlin/androidx/compose/ui/tooling/SimpleComposablePreview.kt
index bb18d5b..8ae762c 100644
--- a/compose/ui/ui-tooling/src/androidInstrumentedTest/kotlin/androidx/compose/ui/tooling/SimpleComposablePreview.kt
+++ b/compose/ui/ui-tooling/src/androidInstrumentedTest/kotlin/androidx/compose/ui/tooling/SimpleComposablePreview.kt
@@ -42,17 +42,13 @@
 @Preview
 @Composable
 fun SimpleComposablePreview() {
-    Surface(color = Color.Red) {
-        Text("Hello world")
-    }
+    Surface(color = Color.Red) { Text("Hello world") }
 }
 
 @Preview
 @Composable
 private fun PrivateSimpleComposablePreview() {
-    Surface(color = Color.Red) {
-        Text("Private Hello world")
-    }
+    Surface(color = Color.Red) { Text("Private Hello world") }
 }
 
 data class Data(val name: String = "123")
@@ -93,36 +89,32 @@
 @Composable
 private fun LifecyclePreview() {
     val lifecycleState = LocalLifecycleOwner.current.lifecycle.currentState
-    if (lifecycleState != Lifecycle.State.RESUMED) throw IllegalArgumentException(
-        "Lifecycle state is not resumed. $lifecycleState"
-    )
+    if (lifecycleState != Lifecycle.State.RESUMED)
+        throw IllegalArgumentException("Lifecycle state is not resumed. $lifecycleState")
     Text("Lifecycle is $lifecycleState")
 }
 
 @Preview
 @Composable
 private fun SaveableStateRegistryPreview() {
-    if (LocalSaveableStateRegistry.current == null) throw IllegalArgumentException(
-        "SaveableStateRegistry is not provided"
-    )
+    if (LocalSaveableStateRegistry.current == null)
+        throw IllegalArgumentException("SaveableStateRegistry is not provided")
     Text("SaveableStateRegistry preview")
 }
 
 @Preview
 @Composable
 private fun OnBackPressedDispatcherPreview() {
-    if (LocalOnBackPressedDispatcherOwner.current == null) throw IllegalArgumentException(
-        "OnBackPressedDispatcher is not provided"
-    )
+    if (LocalOnBackPressedDispatcherOwner.current == null)
+        throw IllegalArgumentException("OnBackPressedDispatcher is not provided")
     Text("OnBackPressedDispatcher preview")
 }
 
 @Preview
 @Composable
 private fun ActivityResultRegistryPreview() {
-    if (LocalActivityResultRegistryOwner.current == null) throw IllegalArgumentException(
-        "ActivityResultRegistry is not provided"
-    )
+    if (LocalActivityResultRegistryOwner.current == null)
+        throw IllegalArgumentException("ActivityResultRegistry is not provided")
     Text("ActivityResultRegistry preview")
 }
 
@@ -143,21 +135,16 @@
     @Preview
     @Composable
     fun InClassPreview() {
-        Surface(color = Color.Red) {
-            Text("In class")
-        }
+        Surface(color = Color.Red) { Text("In class") }
     }
 }
 
-@Preview
-annotation class MyAnnotation()
+@Preview annotation class MyAnnotation()
 
 @Composable
 @MyAnnotation
 fun Multipreview() {
-    Surface(color = Color.Red) {
-        Text("Hello world")
-    }
+    Surface(color = Color.Red) { Text("Hello world") }
 }
 
 @PreviewDynamicColors
@@ -176,25 +163,19 @@
 @Preview
 @Composable
 fun PreviewParametersComposablePreview(
-    @PreviewParameter(TestContentParameterProviderBoolean::class)
-    valueParameter: Boolean
+    @PreviewParameter(TestContentParameterProviderBoolean::class) valueParameter: Boolean
 ) {
     Text(valueParameter.toString())
 }
 
 class TestContentParameterProviderCornerRadius : PreviewParameterProvider<CornerRadius> {
-    override val values = sequenceOf(
-        CornerRadius(42f),
-        CornerRadius.Zero,
-        CornerRadius(0f, 34f)
-    )
+    override val values = sequenceOf(CornerRadius(42f), CornerRadius.Zero, CornerRadius(0f, 34f))
 }
 
 @Preview
 @Composable
 fun TestCornerRadius(
-    @PreviewParameter(TestContentParameterProviderCornerRadius::class)
-    radius: CornerRadius
+    @PreviewParameter(TestContentParameterProviderCornerRadius::class) radius: CornerRadius
 ) {
     Text(radius.toString())
 }
diff --git a/compose/ui/ui-tooling/src/androidInstrumentedTest/kotlin/androidx/compose/ui/tooling/TestAnimationPreview.kt b/compose/ui/ui-tooling/src/androidInstrumentedTest/kotlin/androidx/compose/ui/tooling/TestAnimationPreview.kt
index 623f4ee..96a6584 100644
--- a/compose/ui/ui-tooling/src/androidInstrumentedTest/kotlin/androidx/compose/ui/tooling/TestAnimationPreview.kt
+++ b/compose/ui/ui-tooling/src/androidInstrumentedTest/kotlin/androidx/compose/ui/tooling/TestAnimationPreview.kt
@@ -77,14 +77,15 @@
 import androidx.compose.ui.unit.Dp
 import androidx.compose.ui.unit.dp
 
-enum class CheckBoxState { Unselected, Selected }
+enum class CheckBoxState {
+    Unselected,
+    Selected
+}
 
 @Preview(name = "CheckBox + Scaffold")
 @Composable
 fun TransitionWithScaffoldPreview() {
-    Scaffold {
-        TransitionPreview()
-    }
+    Scaffold { TransitionPreview() }
 }
 
 @Preview(name = "All unsupported and transition animations")
@@ -124,15 +125,14 @@
 fun AnimatedContentPreview() {
     Row {
         var count by remember { mutableStateOf(0) }
-        Button(onClick = { count++ }) {
-            Text("Add")
-        }
+        Button(onClick = { count++ }) { Text("Add") }
         AnimatedContent(targetState = count) { targetCount ->
             // Make sure to use `targetCount`, not `count`.
             Text(text = "Count: $targetCount")
         }
     }
 }
+
 @Preview
 @Composable
 fun NullAnimatedContentPreview() {
@@ -157,18 +157,14 @@
 fun AnimatedContentExtensionPreview() {
     val editable by remember { mutableStateOf(CheckBoxState.Unselected) }
     val transition = updateTransition(targetState = editable, label = "transition.AV")
-    transition.AnimatedContent {
-        Text(text = "State: $it")
-    }
+    transition.AnimatedContent { Text(text = "State: $it") }
 }
 
 @Preview
 @Composable
 fun AnimatedVisibilityPreview() {
     val editable by remember { mutableStateOf(true) }
-    AnimatedVisibility(label = "My Animated Visibility", visible = editable) {
-        Text(text = "Edit")
-    }
+    AnimatedVisibility(label = "My Animated Visibility", visible = editable) { Text(text = "Edit") }
 }
 
 @OptIn(ExperimentalAnimationApi::class)
@@ -186,22 +182,22 @@
 @Composable
 fun TransitionPreview() {
     val (selected, onSelected) = remember { mutableStateOf(false) }
-    val transition = updateTransition(
-        if (selected) CheckBoxState.Selected else CheckBoxState.Unselected,
-        label = "checkBoxAnim"
-    )
+    val transition =
+        updateTransition(
+            if (selected) CheckBoxState.Selected else CheckBoxState.Unselected,
+            label = "checkBoxAnim"
+        )
 
-    val checkBoxCorner by transition.animateDp(
-        transitionSpec = {
-            tween(durationMillis = 1000, easing = LinearEasing)
-        },
-        label = "CheckBox Corner"
-    ) {
-        when (it) {
-            CheckBoxState.Selected -> 28.dp
-            CheckBoxState.Unselected -> 0.dp
+    val checkBoxCorner by
+        transition.animateDp(
+            transitionSpec = { tween(durationMillis = 1000, easing = LinearEasing) },
+            label = "CheckBox Corner"
+        ) {
+            when (it) {
+                CheckBoxState.Selected -> 28.dp
+                CheckBoxState.Unselected -> 0.dp
+            }
         }
-    }
 
     Surface(
         shape = MaterialTheme.shapes.large.copy(topStart = CornerSize(checkBoxCorner)),
@@ -214,15 +210,10 @@
 @Preview
 @Composable
 fun NullTransitionPreview() {
-    val transition = updateTransition<Boolean?>(
-        null,
-        label = "checkBoxAnim"
-    )
+    val transition = updateTransition<Boolean?>(null, label = "checkBoxAnim")
 
     transition.animateDp(
-        transitionSpec = {
-            tween(durationMillis = 1000, easing = LinearEasing)
-        },
+        transitionSpec = { tween(durationMillis = 1000, easing = LinearEasing) },
         label = "CheckBox Corner"
     ) {
         when (it) {
@@ -238,24 +229,21 @@
     var showMenu by remember { mutableStateOf(true) }
     var message by remember { mutableStateOf("Hello") }
 
-    val size: Dp by animateDpAsState(
-        targetValue = if (showMenu) 0.dp else 10.dp,
-        animationSpec = spring(Spring.DampingRatioHighBouncy, Spring.StiffnessHigh),
-    )
-    val offset by animateIntAsState(
-        targetValue = if (showMenu) 2 else 1
-    )
+    val size: Dp by
+        animateDpAsState(
+            targetValue = if (showMenu) 0.dp else 10.dp,
+            animationSpec = spring(Spring.DampingRatioHighBouncy, Spring.StiffnessHigh),
+        )
+    val offset by animateIntAsState(targetValue = if (showMenu) 2 else 1)
 
     Box(
-        Modifier
-            .padding(size)
-            .offset(offset.dp)
-            .pointerInput(Unit) {
-                detectTapGestures {
-                    showMenu = !showMenu
-                    message += "!"
-                }
-            }) {
+        Modifier.padding(size).offset(offset.dp).pointerInput(Unit) {
+            detectTapGestures {
+                showMenu = !showMenu
+                message += "!"
+            }
+        }
+    ) {
         Text(text = message)
     }
 }
@@ -266,26 +254,22 @@
     var showMenu by remember { mutableStateOf(true) }
     var message by remember { mutableStateOf("Hello") }
 
-    val size: Dp by animateDpAsState(
-        targetValue = if (showMenu) 0.dp else 10.dp,
-        animationSpec = spring(Spring.DampingRatioHighBouncy, Spring.StiffnessHigh),
-        label = "CustomDpLabel"
-    )
-    val offset by animateIntAsState(
-        targetValue = if (showMenu) 2 else 1,
-        label = "CustomIntLabel"
-    )
+    val size: Dp by
+        animateDpAsState(
+            targetValue = if (showMenu) 0.dp else 10.dp,
+            animationSpec = spring(Spring.DampingRatioHighBouncy, Spring.StiffnessHigh),
+            label = "CustomDpLabel"
+        )
+    val offset by animateIntAsState(targetValue = if (showMenu) 2 else 1, label = "CustomIntLabel")
 
     Box(
-        Modifier
-            .padding(size)
-            .offset(offset.dp)
-            .pointerInput(Unit) {
-                detectTapGestures {
-                    showMenu = !showMenu
-                    message += "!"
-                }
-            }) {
+        Modifier.padding(size).offset(offset.dp).pointerInput(Unit) {
+            detectTapGestures {
+                showMenu = !showMenu
+                message += "!"
+            }
+        }
+    ) {
         Text(text = message)
     }
 }
@@ -293,11 +277,8 @@
 @Preview
 @Composable
 fun NullAnimateAsStatePreview() {
-    val offset by animateValueAsState(
-        targetValue = null,
-        Utils.nullableFloatConverter,
-        label = "Nullable"
-    )
+    val offset by
+        animateValueAsState(targetValue = null, Utils.nullableFloatConverter, label = "Nullable")
 
     Box(Modifier.offset(offset?.dp ?: 1.dp))
 }
@@ -307,13 +288,16 @@
 fun CrossFadePreview() {
     var currentPage by remember { mutableStateOf("A") }
     Row {
-        Button(onClick = {
-            currentPage = when (currentPage) {
-                "A" -> "B"
-                "B" -> "A"
-                else -> "A"
+        Button(
+            onClick = {
+                currentPage =
+                    when (currentPage) {
+                        "A" -> "B"
+                        "B" -> "A"
+                        else -> "A"
+                    }
             }
-        }) {
+        ) {
             Text("Switch Page")
         }
         Crossfade(targetState = currentPage) { screen ->
@@ -330,13 +314,16 @@
 fun CrossFadeWithLabelPreview() {
     var currentPage by remember { mutableStateOf("A") }
     Row {
-        Button(onClick = {
-            currentPage = when (currentPage) {
-                "A" -> "B"
-                "B" -> "A"
-                else -> "A"
+        Button(
+            onClick = {
+                currentPage =
+                    when (currentPage) {
+                        "A" -> "B"
+                        "B" -> "A"
+                        else -> "A"
+                    }
             }
-        }) {
+        ) {
             Text("Switch Page")
         }
         Crossfade(targetState = currentPage, label = "CrossfadeWithLabel") { screen ->
@@ -354,18 +341,15 @@
     var message by remember { mutableStateOf("Hello") }
     Row {
         var count by remember { mutableStateOf(0) }
-        Button(onClick = {
-            count++
-            message = "Count is $count"
-        }) {
+        Button(
+            onClick = {
+                count++
+                message = "Count is $count"
+            }
+        ) {
             Text("Add")
         }
-        Box(
-            modifier = Modifier
-                .animateContentSize()
-        ) {
-            Text(text = message)
-        }
+        Box(modifier = Modifier.animateContentSize()) { Text(text = message) }
     }
 }
 
@@ -454,14 +438,14 @@
 
 @Composable
 fun InfiniteTransition.PulsingDot(startOffset: StartOffset) {
-    val scale by animateFloat(
-        0.2f,
-        1f,
-        infiniteRepeatable(tween(600), RepeatMode.Reverse, initialStartOffset = startOffset)
-    )
+    val scale by
+        animateFloat(
+            0.2f,
+            1f,
+            infiniteRepeatable(tween(600), RepeatMode.Reverse, initialStartOffset = startOffset)
+        )
     Box(
-        Modifier
-            .padding(5.dp)
+        Modifier.padding(5.dp)
             .size(20.dp)
             .graphicsLayer {
                 scaleX = scale
diff --git a/compose/ui/ui-tooling/src/androidInstrumentedTest/kotlin/androidx/compose/ui/tooling/ToolingTest.kt b/compose/ui/ui-tooling/src/androidInstrumentedTest/kotlin/androidx/compose/ui/tooling/ToolingTest.kt
index b895328..92d8f17 100644
--- a/compose/ui/ui-tooling/src/androidInstrumentedTest/kotlin/androidx/compose/ui/tooling/ToolingTest.kt
+++ b/compose/ui/ui-tooling/src/androidInstrumentedTest/kotlin/androidx/compose/ui/tooling/ToolingTest.kt
@@ -32,9 +32,8 @@
 open class ToolingTest {
     @Suppress("DEPRECATION")
     @get:Rule
-    val activityTestRule = androidx.test.rule.ActivityTestRule<TestActivity>(
-        TestActivity::class.java
-    )
+    val activityTestRule =
+        androidx.test.rule.ActivityTestRule<TestActivity>(TestActivity::class.java)
     lateinit var activity: TestActivity
     lateinit var handler: Handler
     lateinit var positionedLatch: CountDownLatch
@@ -51,11 +50,7 @@
         positionedLatch = CountDownLatch(1)
         activityTestRule.onUiThread {
             activity.setContent {
-                Box(
-                    Modifier
-                        .fillMaxSize()
-                        .onGloballyPositioned { positionedLatch.countDown() }
-                ) {
+                Box(Modifier.fillMaxSize().onGloballyPositioned { positionedLatch.countDown() }) {
                     composable()
                 }
             }
@@ -65,7 +60,7 @@
         positionedLatch.await(1, TimeUnit.SECONDS)
 
         // Wait for the UI thread to complete its current work so we know that layout is done.
-        activityTestRule.onUiThread { }
+        activityTestRule.onUiThread {}
     }
 }
 
@@ -73,10 +68,11 @@
 // lambda to Runnable, so separate it here
 @Suppress("DEPRECATION")
 fun androidx.test.rule.ActivityTestRule<TestActivity>.onUiThread(block: () -> Unit) {
-    val runnable: Runnable = object : Runnable {
-        override fun run() {
-            block()
+    val runnable: Runnable =
+        object : Runnable {
+            override fun run() {
+                block()
+            }
         }
-    }
     runOnUiThread(runnable)
 }
diff --git a/compose/ui/ui-tooling/src/androidInstrumentedTest/kotlin/androidx/compose/ui/tooling/animation/AnimateXAsStateComposeAnimationTest.kt b/compose/ui/ui-tooling/src/androidInstrumentedTest/kotlin/androidx/compose/ui/tooling/animation/AnimateXAsStateComposeAnimationTest.kt
index c9658a2..d9d1e42 100644
--- a/compose/ui/ui-tooling/src/androidInstrumentedTest/kotlin/androidx/compose/ui/tooling/animation/AnimateXAsStateComposeAnimationTest.kt
+++ b/compose/ui/ui-tooling/src/androidInstrumentedTest/kotlin/androidx/compose/ui/tooling/animation/AnimateXAsStateComposeAnimationTest.kt
@@ -55,107 +55,82 @@
 @RunWith(AndroidJUnit4::class)
 class AnimateXAsStateComposeAnimationTest {
 
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
     @Test
     fun dpAnimation() {
-        val search = AnimationSearch.AnimateXAsStateSearch { }
+        val search = AnimationSearch.AnimateXAsStateSearch {}
         var dpState: State<Dp>? = null
-        rule.addAnimations(search) {
-            dpState = animateDpAsState(targetValue = 10.dp)
-        }
+        rule.addAnimations(search) { dpState = animateDpAsState(targetValue = 10.dp) }
         val composeAnimation = checkDefaultState(search, "DpAnimation", 10.dp)
-        rule.runOnUiThread {
-            composeAnimation.setState(20.dp)
-        }
+        rule.runOnUiThread { composeAnimation.setState(20.dp) }
         rule.waitForIdle()
         assertEquals(20.dp, dpState!!.value)
     }
 
     @Test
     fun floatAnimation() {
-        val search = AnimationSearch.AnimateXAsStateSearch { }
+        val search = AnimationSearch.AnimateXAsStateSearch {}
         var state: State<Float>? = null
-        rule.addAnimations(search) {
-            state = animateFloatAsState(targetValue = 10f)
-        }
+        rule.addAnimations(search) { state = animateFloatAsState(targetValue = 10f) }
         val composeAnimation = checkDefaultState(search, "FloatAnimation", 10f)
-        rule.runOnUiThread {
-            composeAnimation.setState(20f)
-        }
+        rule.runOnUiThread { composeAnimation.setState(20f) }
         rule.waitForIdle()
         assertEquals(20f, state!!.value)
     }
 
     @Test
     fun intAnimation() {
-        val search = AnimationSearch.AnimateXAsStateSearch { }
+        val search = AnimationSearch.AnimateXAsStateSearch {}
         var state: State<Int>? = null
-        rule.addAnimations(search) {
-            state = animateIntAsState(targetValue = 10)
-        }
+        rule.addAnimations(search) { state = animateIntAsState(targetValue = 10) }
         val composeAnimation = checkDefaultState(search, "IntAnimation", 10)
-        rule.runOnUiThread {
-            composeAnimation.setState(20)
-        }
+        rule.runOnUiThread { composeAnimation.setState(20) }
         rule.waitForIdle()
         assertEquals(20, state!!.value)
     }
 
     @Test
     fun intSizeAnimation() {
-        val search = AnimationSearch.AnimateXAsStateSearch { }
+        val search = AnimationSearch.AnimateXAsStateSearch {}
         var state: State<IntSize>? = null
-        rule.addAnimations(search) {
-            state = animateIntSizeAsState(targetValue = IntSize(10, 20))
-        }
+        rule.addAnimations(search) { state = animateIntSizeAsState(targetValue = IntSize(10, 20)) }
         checkDefaultState(search, "IntSizeAnimation", IntSize(10, 20))
         val composeAnimation = search.animations.first().parse()!!
-        rule.runOnUiThread {
-            composeAnimation.setState(IntSize(30, 40))
-        }
+        rule.runOnUiThread { composeAnimation.setState(IntSize(30, 40)) }
         rule.waitForIdle()
         assertEquals(IntSize(30, 40), state!!.value)
     }
 
     @Test
     fun intOffsetAnimation() {
-        val search = AnimationSearch.AnimateXAsStateSearch { }
+        val search = AnimationSearch.AnimateXAsStateSearch {}
         var state: State<IntOffset>? = null
         rule.addAnimations(search) {
             state = animateIntOffsetAsState(targetValue = IntOffset(10, 20))
         }
         val composeAnimation = checkDefaultState(search, "IntOffsetAnimation", IntOffset(10, 20))
-        rule.runOnUiThread {
-            composeAnimation.setState(IntOffset(30, 40))
-        }
+        rule.runOnUiThread { composeAnimation.setState(IntOffset(30, 40)) }
         rule.waitForIdle()
         assertEquals(IntOffset(30, 40), state!!.value)
     }
 
     @Test
     fun offsetAnimation() {
-        val search = AnimationSearch.AnimateXAsStateSearch { }
+        val search = AnimationSearch.AnimateXAsStateSearch {}
         var state: State<Offset>? = null
-        rule.addAnimations(search) {
-            state = animateOffsetAsState(targetValue = Offset(10f, 20f))
-        }
+        rule.addAnimations(search) { state = animateOffsetAsState(targetValue = Offset(10f, 20f)) }
         val composeAnimation = checkDefaultState(search, "OffsetAnimation", Offset(10f, 20f))
-        rule.runOnUiThread {
-            composeAnimation.setState(Offset(30f, 40f))
-        }
+        rule.runOnUiThread { composeAnimation.setState(Offset(30f, 40f)) }
         rule.waitForIdle()
         assertEquals(Offset(30f, 40f), state!!.value)
     }
 
     @Test
     fun sizeAnimation() {
-        val search = AnimationSearch.AnimateXAsStateSearch { }
+        val search = AnimationSearch.AnimateXAsStateSearch {}
         var state: State<Size>? = null
-        rule.addAnimations(search) {
-            state = animateSizeAsState(targetValue = Size(10f, 20f))
-        }
+        rule.addAnimations(search) { state = animateSizeAsState(targetValue = Size(10f, 20f)) }
         val composeAnimation = checkDefaultState(search, "SizeAnimation", Size(10f, 20f))
         composeAnimation.setState(Size(30f, 40f))
         rule.waitForIdle()
@@ -164,7 +139,7 @@
 
     @Test
     fun rectAnimation() {
-        val search = AnimationSearch.AnimateXAsStateSearch { }
+        val search = AnimationSearch.AnimateXAsStateSearch {}
         var state: State<Rect>? = null
         rule.addAnimations(search) {
             state = animateRectAsState(targetValue = Rect(10f, 20f, 30f, 40f))
@@ -177,7 +152,7 @@
 
     @Test
     fun colorAnimation() {
-        val search = AnimationSearch.AnimateXAsStateSearch { }
+        val search = AnimationSearch.AnimateXAsStateSearch {}
         var state: State<Color>? = null
         rule.addAnimations(search) {
             state = animateColorAsState(targetValue = Color(0.1f, 0.2f, 0.3f, 0.4f))
@@ -193,9 +168,7 @@
     fun customFloatAnimation() {
         val search = AnimationSearch.AnimateXAsStateSearch {}
         var state: State<Float>? = null
-        rule.addAnimations(search) {
-            state = animateValueAsState(10f, Float.VectorConverter)
-        }
+        rule.addAnimations(search) { state = animateValueAsState(10f, Float.VectorConverter) }
         val composeAnimation = checkDefaultState(search, "ValueAnimation", 10f)
         composeAnimation.setState(30f)
         rule.waitForIdle()
@@ -204,11 +177,9 @@
 
     @Test
     fun nullableFloatAnimation() {
-        val search = AnimationSearch.AnimateXAsStateSearch { }
+        val search = AnimationSearch.AnimateXAsStateSearch {}
         var state: State<Float?>? = null
-        rule.addAnimations(search) {
-            state = animateValueAsState(1f, Utils.nullableFloatConverter)
-        }
+        rule.addAnimations(search) { state = animateValueAsState(1f, Utils.nullableFloatConverter) }
         val composeAnimation = checkDefaultState(search, "ValueAnimation", 1f)
         composeAnimation.setState(30f)
         rule.waitForIdle()
@@ -217,10 +188,8 @@
 
     @Test
     fun nullableFloatAnimationWithNullState() {
-        val search = AnimationSearch.AnimateXAsStateSearch { }
-        rule.addAnimations(search) {
-            animateValueAsState(null, Utils.nullableFloatConverter)
-        }
+        val search = AnimationSearch.AnimateXAsStateSearch {}
+        rule.addAnimations(search) { animateValueAsState(null, Utils.nullableFloatConverter) }
         assertEquals(1, search.animations.size)
         val composeAnimation = search.animations.first().parse()
         assertNull(composeAnimation)
@@ -228,11 +197,9 @@
 
     @Test
     fun stringAnimation() {
-        val search = AnimationSearch.AnimateXAsStateSearch { }
+        val search = AnimationSearch.AnimateXAsStateSearch {}
         var state: State<String>? = null
-        rule.addAnimations(search) {
-            state = animateValueAsState("11.0", Utils.stringConverter)
-        }
+        rule.addAnimations(search) { state = animateValueAsState("11.0", Utils.stringConverter) }
         val composeAnimation = checkDefaultState(search, "ValueAnimation", "11.0")
         composeAnimation.setState("56.0")
         rule.waitForIdle()
@@ -241,7 +208,7 @@
 
     @Test
     fun enumAnimation() {
-        val search = AnimationSearch.AnimateXAsStateSearch { }
+        val search = AnimationSearch.AnimateXAsStateSearch {}
         var state: State<Utils.EnumState>? = null
         rule.addAnimations(search) {
             state = animateValueAsState(Utils.EnumState.One, Utils.enumConverter)
@@ -254,7 +221,7 @@
 
     @Test
     fun nullableEnumAnimation() {
-        val search = AnimationSearch.AnimateXAsStateSearch { }
+        val search = AnimationSearch.AnimateXAsStateSearch {}
         var state: State<Utils.EnumState?>? = null
         rule.addAnimations(search) {
             state = animateValueAsState(Utils.EnumState.One, Utils.nullableEnumConverter)
@@ -267,11 +234,10 @@
 
     @Test
     fun animationsAreNotCreated() {
-        val search = AnimationSearch.AnimateXAsStateSearch { }
+        val search = AnimationSearch.AnimateXAsStateSearch {}
         var state: State<Int>? = null
-        val hasAnimations = rule.hasAnimations(search) {
-            state = animateIntAsState(targetValue = 10)
-        }
+        val hasAnimations =
+            rule.hasAnimations(search) { state = animateIntAsState(targetValue = 10) }
         assertTrue(hasAnimations)
         // No animations were created.
         assertTrue(search.animations.isEmpty())
diff --git a/compose/ui/ui-tooling/src/androidInstrumentedTest/kotlin/androidx/compose/ui/tooling/animation/AnimatedContentComposeAnimationTest.kt b/compose/ui/ui-tooling/src/androidInstrumentedTest/kotlin/androidx/compose/ui/tooling/animation/AnimatedContentComposeAnimationTest.kt
index c10cff8..2052904 100644
--- a/compose/ui/ui-tooling/src/androidInstrumentedTest/kotlin/androidx/compose/ui/tooling/animation/AnimatedContentComposeAnimationTest.kt
+++ b/compose/ui/ui-tooling/src/androidInstrumentedTest/kotlin/androidx/compose/ui/tooling/animation/AnimatedContentComposeAnimationTest.kt
@@ -38,13 +38,12 @@
 @RunWith(AndroidJUnit4::class)
 class AnimatedContentComposeAnimationTest {
 
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
     @Test
     fun parseAnimation() {
         assertTrue(AnimatedContentComposeAnimation.apiAvailable)
-        val search = AnimationSearch.AnimatedContentSearch { }
+        val search = AnimationSearch.AnimatedContentSearch {}
         rule.addAnimations(search) {
             AnimatedContent(targetState = 1.dp) { targetCount ->
                 Text(text = "Count: $targetCount")
@@ -65,7 +64,7 @@
     @Test
     fun parseIfApiIsNotAvailable() {
         AnimatedContentComposeAnimation.testOverrideAvailability(false)
-        val search = AnimationSearch.AnimatedContentSearch { }
+        val search = AnimationSearch.AnimatedContentSearch {}
         rule.addAnimations(search) {
             AnimatedContent(targetState = 1.dp) { targetCount ->
                 Text(text = "Count: $targetCount")
@@ -78,7 +77,7 @@
 
     @Test
     fun parseAnimationWithNullState() {
-        val search = AnimationSearch.AnimatedContentSearch { }
+        val search = AnimationSearch.AnimatedContentSearch {}
         rule.addAnimations(search) {
             AnimatedContent(targetState = null) { targetCount ->
                 Text(text = "Count: $targetCount")
diff --git a/compose/ui/ui-tooling/src/androidInstrumentedTest/kotlin/androidx/compose/ui/tooling/animation/AnimatedVisibilityComposeAnimationTest.kt b/compose/ui/ui-tooling/src/androidInstrumentedTest/kotlin/androidx/compose/ui/tooling/animation/AnimatedVisibilityComposeAnimationTest.kt
index 1711089..9283107 100644
--- a/compose/ui/ui-tooling/src/androidInstrumentedTest/kotlin/androidx/compose/ui/tooling/animation/AnimatedVisibilityComposeAnimationTest.kt
+++ b/compose/ui/ui-tooling/src/androidInstrumentedTest/kotlin/androidx/compose/ui/tooling/animation/AnimatedVisibilityComposeAnimationTest.kt
@@ -25,8 +25,7 @@
 
 class AnimatedVisibilityComposeAnimationTest {
 
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
     @Test
     fun createComposeAnimation() {
diff --git a/compose/ui/ui-tooling/src/androidInstrumentedTest/kotlin/androidx/compose/ui/tooling/animation/AnimationSearchTest.kt b/compose/ui/ui-tooling/src/androidInstrumentedTest/kotlin/androidx/compose/ui/tooling/animation/AnimationSearchTest.kt
index ec8469e..c082844 100644
--- a/compose/ui/ui-tooling/src/androidInstrumentedTest/kotlin/androidx/compose/ui/tooling/animation/AnimationSearchTest.kt
+++ b/compose/ui/ui-tooling/src/androidInstrumentedTest/kotlin/androidx/compose/ui/tooling/animation/AnimationSearchTest.kt
@@ -56,8 +56,7 @@
 @RunWith(AndroidJUnit4::class)
 class AnimationSearchTest {
 
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
     @Test
     fun targetBasedIsAddedAndTracked() {
@@ -73,9 +72,7 @@
 
     @Test
     fun targetBasedIsFound() {
-        animationIsFound(AnimationSearch.TargetBasedSearch {}) {
-            TargetBasedAnimationPreview()
-        }
+        animationIsFound(AnimationSearch.TargetBasedSearch {}) { TargetBasedAnimationPreview() }
     }
 
     @Test
@@ -99,9 +96,7 @@
 
     @Test
     fun decayBasedIsFound() {
-        animationIsFound(AnimationSearch.DecaySearch {}) {
-            DecayAnimationPreview()
-        }
+        animationIsFound(AnimationSearch.DecaySearch {}) { DecayAnimationPreview() }
     }
 
     @Test
@@ -144,7 +139,7 @@
 
     @Test
     fun multipleInfiniteTransitionIsAdded() {
-        val search = AnimationSearch.InfiniteTransitionSearch { }
+        val search = AnimationSearch.InfiniteTransitionSearch {}
         rule.addAnimations(search) {
             rememberInfiniteTransition()
             rememberInfiniteTransition()
@@ -183,9 +178,7 @@
 
     @Test
     fun animatedXAsStateIsFound() {
-        animationIsFound(AnimationSearch.AnimateXAsStateSearch {}) {
-            AnimateAsStatePreview()
-        }
+        animationIsFound(AnimationSearch.AnimateXAsStateSearch {}) { AnimateAsStatePreview() }
     }
 
     @Test
@@ -266,9 +259,7 @@
 
     @Test
     fun transitionIsFound() {
-        animationIsFound(AnimationSearch.TransitionSearch {}) {
-            TransitionPreview()
-        }
+        animationIsFound(AnimationSearch.TransitionSearch {}) { TransitionPreview() }
     }
 
     @Test
@@ -328,9 +319,7 @@
 
     @Test
     fun crossFadeIsFound() {
-        animationIsFound(AnimationSearch.TransitionSearch {}) {
-            CrossFadePreview()
-        }
+        animationIsFound(AnimationSearch.TransitionSearch {}) { CrossFadePreview() }
     }
 
     @Test
@@ -400,9 +389,7 @@
 
     @Test
     fun animatedContentIsFound() {
-        animationIsFound(AnimationSearch.AnimatedContentSearch {}) {
-            AnimatedContentPreview()
-        }
+        animationIsFound(AnimationSearch.AnimatedContentSearch {}) { AnimatedContentPreview() }
     }
 
     @Test
diff --git a/compose/ui/ui-tooling/src/androidInstrumentedTest/kotlin/androidx/compose/ui/tooling/animation/InfiniteTransitionComposeAnimationTest.kt b/compose/ui/ui-tooling/src/androidInstrumentedTest/kotlin/androidx/compose/ui/tooling/animation/InfiniteTransitionComposeAnimationTest.kt
index cca3022..cb67357 100644
--- a/compose/ui/ui-tooling/src/androidInstrumentedTest/kotlin/androidx/compose/ui/tooling/animation/InfiniteTransitionComposeAnimationTest.kt
+++ b/compose/ui/ui-tooling/src/androidInstrumentedTest/kotlin/androidx/compose/ui/tooling/animation/InfiniteTransitionComposeAnimationTest.kt
@@ -35,17 +35,18 @@
 @RunWith(AndroidJUnit4::class)
 class InfiniteTransitionComposeAnimationTest {
 
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
     @Test
     fun apiAvailable() {
         assertTrue(InfiniteTransitionComposeAnimation.apiAvailable)
         rule.setContent {
-            val composeAnimation = AnimationSearch.InfiniteTransitionSearchInfo(
-                rememberInfiniteTransition(),
-                ToolingState(0L)
-            ).parse()
+            val composeAnimation =
+                AnimationSearch.InfiniteTransitionSearchInfo(
+                        rememberInfiniteTransition(),
+                        ToolingState(0L)
+                    )
+                    .parse()
             assertNotNull(composeAnimation)
             composeAnimation!!
             assertNotNull(composeAnimation.animationObject)
@@ -60,10 +61,12 @@
         InfiniteTransitionComposeAnimation.testOverrideAvailability(false)
         assertFalse(InfiniteTransitionComposeAnimation.apiAvailable)
         rule.setContent {
-            val composeAnimation = AnimationSearch.InfiniteTransitionSearchInfo(
-                rememberInfiniteTransition(),
-                ToolingState(0L)
-            ).parse()
+            val composeAnimation =
+                AnimationSearch.InfiniteTransitionSearchInfo(
+                        rememberInfiniteTransition(),
+                        ToolingState(0L)
+                    )
+                    .parse()
             assertNull(composeAnimation)
         }
         InfiniteTransitionComposeAnimation.testOverrideAvailability(true)
diff --git a/compose/ui/ui-tooling/src/androidInstrumentedTest/kotlin/androidx/compose/ui/tooling/animation/PreviewAnimationClockTest.kt b/compose/ui/ui-tooling/src/androidInstrumentedTest/kotlin/androidx/compose/ui/tooling/animation/PreviewAnimationClockTest.kt
index 0fe39de..3e7e960 100644
--- a/compose/ui/ui-tooling/src/androidInstrumentedTest/kotlin/androidx/compose/ui/tooling/animation/PreviewAnimationClockTest.kt
+++ b/compose/ui/ui-tooling/src/androidInstrumentedTest/kotlin/androidx/compose/ui/tooling/animation/PreviewAnimationClockTest.kt
@@ -60,8 +60,7 @@
 @OptIn(InternalAnimationApi::class)
 class PreviewAnimationClockTest {
 
-    @get:Rule
-    val composeRule = createComposeRule()
+    @get:Rule val composeRule = createComposeRule()
 
     private lateinit var testClock: TestPreviewAnimationClock
 
@@ -185,9 +184,7 @@
     fun getAnimatedPropertiesReturnsAllDescendantAnimations() {
         var transitionAnimation: ComposeAnimation? = null
 
-        composeRule.setContent {
-            transitionAnimation = setUpOffsetScenario()
-        }
+        composeRule.setContent { transitionAnimation = setUpOffsetScenario() }
         composeRule.waitForIdle()
 
         val animatedProperties = testClock.getAnimatedProperties(transitionAnimation!!)
@@ -203,9 +200,7 @@
     fun getAnimatedPropertiesReturnsChildAnimations() {
         var animatedVisibility: ComposeAnimation? = null
 
-        composeRule.setContent {
-            testClock.trackTransition(createAnimationVisibility(1000))
-        }
+        composeRule.setContent { testClock.trackTransition(createAnimationVisibility(1000)) }
         composeRule.waitForIdle()
         composeRule.runOnIdle {
             animatedVisibility = testClock.transitionClocks.keys.single()
@@ -230,9 +225,7 @@
     fun onSeekCallbackCalledWhenTrackingAnimatedVisibility() {
         var animatedVisibility: Transition<Any>? = null
         var onSeekCalls = 0
-        composeRule.setContent {
-            animatedVisibility = createAnimationVisibility(1000)
-        }
+        composeRule.setContent { animatedVisibility = createAnimationVisibility(1000) }
 
         composeRule.waitForIdle()
         assertEquals(0, onSeekCalls)
@@ -314,10 +307,7 @@
         assertEquals(0, scale.startTimeMillis)
         assertEquals(1000, scale.endTimeMillis)
         assertEquals("androidx.compose.animation.core.TweenSpec", scale.specType)
-        assertArrayEquals(
-            arrayOf(0L, 450L, 900L, 1000L),
-            scale.values.keys.sorted().toTypedArray()
-        )
+        assertArrayEquals(arrayOf(0L, 450L, 900L, 1000L), scale.values.keys.sorted().toTypedArray())
 
         val alpha = transitions.single { it.label == "Built-in alpha" }
         // We're animating from invisible (Built-in alpha 0f) to visible (Built-in alpha 1f).
@@ -326,10 +316,7 @@
         assertEquals(0, alpha.startTimeMillis)
         assertEquals(1000, alpha.endTimeMillis)
         assertEquals("androidx.compose.animation.core.TweenSpec", alpha.specType)
-        assertArrayEquals(
-            arrayOf(0L, 450L, 900L, 1000L),
-            alpha.values.keys.sorted().toTypedArray()
-        )
+        assertArrayEquals(arrayOf(0L, 450L, 900L, 1000L), alpha.values.keys.sorted().toTypedArray())
     }
 
     @Test
@@ -427,9 +414,7 @@
     @Test
     fun updateFromAndToStatesModifiesCachedTransitionStates() {
         var animation: ComposeAnimation? = null
-        composeRule.setContent {
-            animation = setUpRotationColorScenario()
-        }
+        composeRule.setContent { animation = setUpRotationColorScenario() }
         composeRule.waitForIdle()
 
         val stateBeforeUpdate = testClock.transitionClocks.values.single().state
@@ -474,30 +459,30 @@
                 createAnimationVisibility(isEnter = true, label = "My AnimatedVisibility label")
         }
         composeRule.waitForIdle()
-        val animationWithLabel = testClock.transitionClocks.keys.single {
-            it.states.contains(someState)
-        }
+        val animationWithLabel =
+            testClock.transitionClocks.keys.single { it.states.contains(someState) }
         // Label explicitly set
         assertEquals("My animation label", animationWithLabel.label)
 
-        val animationWithoutLabel = testClock.transitionClocks.keys.single {
-            it.states.contains(Offset.O1)
-        }
+        val animationWithoutLabel =
+            testClock.transitionClocks.keys.single { it.states.contains(Offset.O1) }
         // Label is not explicitly set, but inferred from the state type
         assertEquals("Offset", animationWithoutLabel.label)
 
         testClock.trackAnimatedVisibility(animatedVisibilityTransition!!)
         testClock.trackAnimatedVisibility(animatedVisibilityTransitionExplicitLabel!!)
 
-        val animatedVisibilityExplicitLabel = testClock.animatedVisibilityClocks.keys.single {
-            testClock.getAnimatedVisibilityState(it) == AnimatedVisibilityState.Enter
-        }
+        val animatedVisibilityExplicitLabel =
+            testClock.animatedVisibilityClocks.keys.single {
+                testClock.getAnimatedVisibilityState(it) == AnimatedVisibilityState.Enter
+            }
         // Label explicitly set
         assertEquals("My AnimatedVisibility label", animatedVisibilityExplicitLabel.label)
 
-        val animatedVisibilityImplicitLabel = testClock.animatedVisibilityClocks.keys.single {
-            testClock.getAnimatedVisibilityState(it) == AnimatedVisibilityState.Exit
-        }
+        val animatedVisibilityImplicitLabel =
+            testClock.animatedVisibilityClocks.keys.single {
+                testClock.getAnimatedVisibilityState(it) == AnimatedVisibilityState.Exit
+            }
         // Label is not explicitly set, so we fall back to the default AnimatedVisibility label
         assertEquals("AnimatedVisibility", animatedVisibilityImplicitLabel.label)
     }
@@ -518,10 +503,7 @@
             infiniteTransition.animateFloat(
                 initialValue = 0f,
                 targetValue = 1f,
-                animationSpec = infiniteRepeatable(
-                    tween(300),
-                    RepeatMode.Restart
-                )
+                animationSpec = infiniteRepeatable(tween(300), RepeatMode.Restart)
             )
         }
         // Default states.
@@ -552,9 +534,7 @@
         val transition = updateTransition(RotationColor.RC1)
         transition.animateFloat(
             label = "myRotation",
-            transitionSpec = {
-                tween(durationMillis = 1000, easing = LinearEasing)
-            }
+            transitionSpec = { tween(durationMillis = 1000, easing = LinearEasing) }
         ) {
             when (it) {
                 RotationColor.RC1 -> 0f
@@ -564,9 +544,7 @@
         }
         transition.animateColor(
             label = "borderColor",
-            transitionSpec = {
-                tween(durationMillis = 1000, easing = LinearEasing)
-            }
+            transitionSpec = { tween(durationMillis = 1000, easing = LinearEasing) }
         ) {
             when (it) {
                 RotationColor.RC1 -> Color.Red
@@ -576,9 +554,8 @@
         }
 
         testClock.trackTransition(transition as Transition<Any>)
-        val animation = testClock.transitionClocks.keys.single {
-            it.states.contains(RotationColor.RC1)
-        }
+        val animation =
+            testClock.transitionClocks.keys.single { it.states.contains(RotationColor.RC1) }
         testClock.updateFromAndToStates(animation, RotationColor.RC1, RotationColor.RC3)
         return animation
     }
@@ -593,9 +570,7 @@
         val transition = updateTransition(Offset.O1)
         transition.animateFloat(
             label = "myOffset",
-            transitionSpec = {
-                tween(durationMillis = 800, easing = LinearEasing)
-            }
+            transitionSpec = { tween(durationMillis = 800, easing = LinearEasing) }
         ) {
             when (it) {
                 Offset.O1 -> 0f
@@ -604,18 +579,19 @@
         }
 
         val child1 = transition.createChildTransition { it == Offset.O1 }
-        child1.animateFloat(label = "child1 scale") { pressed ->
-            if (pressed) 1f else 3f
-        }
+        child1.animateFloat(label = "child1 scale") { pressed -> if (pressed) 1f else 3f }
 
-        child1.createChildTransition { it }
-            .animateDp(label = "grandchild", transitionSpec = {
-                tween(durationMillis = 900, easing = LinearEasing)
-            }) { parentState ->
+        child1
+            .createChildTransition { it }
+            .animateDp(
+                label = "grandchild",
+                transitionSpec = { tween(durationMillis = 900, easing = LinearEasing) }
+            ) { parentState ->
                 if (parentState) 1.dp else 9.dp
             }
 
-        transition.createChildTransition { it }
+        transition
+            .createChildTransition { it }
             .animateColor(label = "child2 color") { state ->
                 if (state == Offset.O1) Color.Red else Color.Blue
             }
@@ -645,16 +621,15 @@
             enter = fadeIn(animationSpec = linearTween()),
             exit = fadeOut(animationSpec = linearTween()),
         ) {
-            val scale by transition.animateFloat(
-                transitionSpec = { linearTween() },
-                label = "box scale"
-            ) { enterExitState ->
-                when (enterExitState) {
-                    EnterExitState.PreEnter -> 0.5f
-                    EnterExitState.Visible -> 1.0f
-                    EnterExitState.PostExit -> 0.5f
+            val scale by
+                transition.animateFloat(transitionSpec = { linearTween() }, label = "box scale") {
+                    enterExitState ->
+                    when (enterExitState) {
+                        EnterExitState.PreEnter -> 0.5f
+                        EnterExitState.Visible -> 1.0f
+                        EnterExitState.PostExit -> 0.5f
+                    }
                 }
-            }
             Box(Modifier.size((100 * scale).dp))
         }
         return parentAnimatedVisibility as Transition<Any>
@@ -677,8 +652,15 @@
     }
 }
 
-private enum class Offset { O1, O2 }
+private enum class Offset {
+    O1,
+    O2
+}
 
-private enum class RotationColor { RC1, RC2, RC3 }
+private enum class RotationColor {
+    RC1,
+    RC2,
+    RC3
+}
 
 private const val eps = 0.00001f
diff --git a/compose/ui/ui-tooling/src/androidInstrumentedTest/kotlin/androidx/compose/ui/tooling/animation/TransitionComposeAnimationTest.kt b/compose/ui/ui-tooling/src/androidInstrumentedTest/kotlin/androidx/compose/ui/tooling/animation/TransitionComposeAnimationTest.kt
index 8de8eb7..39f90dc 100644
--- a/compose/ui/ui-tooling/src/androidInstrumentedTest/kotlin/androidx/compose/ui/tooling/animation/TransitionComposeAnimationTest.kt
+++ b/compose/ui/ui-tooling/src/androidInstrumentedTest/kotlin/androidx/compose/ui/tooling/animation/TransitionComposeAnimationTest.kt
@@ -29,8 +29,7 @@
 
 class TransitionComposeAnimationTest {
 
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
     @Test
     fun parseIntComposeAnimation() {
diff --git a/compose/ui/ui-tooling/src/androidInstrumentedTest/kotlin/androidx/compose/ui/tooling/animation/Utils.kt b/compose/ui/ui-tooling/src/androidInstrumentedTest/kotlin/androidx/compose/ui/tooling/animation/Utils.kt
index 96079e7..0dad335 100644
--- a/compose/ui/ui-tooling/src/androidInstrumentedTest/kotlin/androidx/compose/ui/tooling/animation/Utils.kt
+++ b/compose/ui/ui-tooling/src/androidInstrumentedTest/kotlin/androidx/compose/ui/tooling/animation/Utils.kt
@@ -38,39 +38,50 @@
 
 object Utils {
 
-    enum class EnumState { One, Two, Three }
-
-    val nullableFloatConverter = TwoWayConverter<Float?, AnimationVector1D>({
-        AnimationVector1D(it ?: 0f)
-    }, { if (it.value == 0f) null else it.value })
-
-    val stringConverter = TwoWayConverter<String, AnimationVector1D>(
-        { AnimationVector1D(it.toFloat()) }, { it.value.toString() })
-
-    val enumConverter = object : TwoWayConverter<EnumState, AnimationVector> {
-        override val convertFromVector: (AnimationVector) -> EnumState
-            get() = { EnumState.One }
-
-        override val convertToVector: (EnumState) -> AnimationVector
-            get() = { AnimationVector(1f) }
+    enum class EnumState {
+        One,
+        Two,
+        Three
     }
 
-    val nullableEnumConverter = object :
-        TwoWayConverter<EnumState?, AnimationVector> {
-        override val convertFromVector: (AnimationVector) -> EnumState?
-            get() = { EnumState.One }
+    val nullableFloatConverter =
+        TwoWayConverter<Float?, AnimationVector1D>(
+            { AnimationVector1D(it ?: 0f) },
+            { if (it.value == 0f) null else it.value }
+        )
 
-        override val convertToVector: (EnumState?) -> AnimationVector
-            get() = { AnimationVector(1f) }
-    }
+    val stringConverter =
+        TwoWayConverter<String, AnimationVector1D>(
+            { AnimationVector1D(it.toFloat()) },
+            { it.value.toString() }
+        )
 
-    val booleanConverter = object : TwoWayConverter<Boolean, AnimationVector1D> {
-        override val convertFromVector: (AnimationVector1D) -> Boolean
-            get() = { it.value == 1f }
+    val enumConverter =
+        object : TwoWayConverter<EnumState, AnimationVector> {
+            override val convertFromVector: (AnimationVector) -> EnumState
+                get() = { EnumState.One }
 
-        override val convertToVector: (Boolean) -> AnimationVector1D
-            get() = { AnimationVector(if (it) 1f else 0f) }
-    }
+            override val convertToVector: (EnumState) -> AnimationVector
+                get() = { AnimationVector(1f) }
+        }
+
+    val nullableEnumConverter =
+        object : TwoWayConverter<EnumState?, AnimationVector> {
+            override val convertFromVector: (AnimationVector) -> EnumState?
+                get() = { EnumState.One }
+
+            override val convertToVector: (EnumState?) -> AnimationVector
+                get() = { AnimationVector(1f) }
+        }
+
+    val booleanConverter =
+        object : TwoWayConverter<Boolean, AnimationVector1D> {
+            override val convertFromVector: (AnimationVector1D) -> Boolean
+                get() = { it.value == 1f }
+
+            override val convertToVector: (Boolean) -> AnimationVector1D
+                get() = { AnimationVector(if (it) 1f else 0f) }
+        }
 
     @OptIn(UiToolingDataApi::class)
     internal fun ComposeContentTestRule.addAnimations(
@@ -79,15 +90,10 @@
         content: @Composable () -> Unit
     ) {
         val slotTableRecord = CompositionDataRecord.create()
-        this.setContent {
-            Inspectable(slotTableRecord) {
-                content()
-            }
-        }
+        this.setContent { Inspectable(slotTableRecord) { content() } }
         this.runOnIdle {
-            val groups = slotTableRecord.store.map {
-                it.asTree()
-            }.flatMap { tree -> tree.findAll { true } }
+            val groups =
+                slotTableRecord.store.map { it.asTree() }.flatMap { tree -> tree.findAll { true } }
             search.addAnimations(groups)
             additionalSearch?.addAnimations(groups)
         }
@@ -99,15 +105,10 @@
         content: @Composable () -> Unit
     ): Boolean {
         val slotTableRecord = CompositionDataRecord.create()
-        this.setContent {
-            Inspectable(slotTableRecord) {
-                content()
-            }
-        }
+        this.setContent { Inspectable(slotTableRecord) { content() } }
         return this.runOnIdle {
-            val groups = slotTableRecord.store.map {
-                it.asTree()
-            }.flatMap { tree -> tree.findAll { true } }
+            val groups =
+                slotTableRecord.store.map { it.asTree() }.flatMap { tree -> tree.findAll { true } }
             search.hasAnimations(groups)
         }
     }
@@ -117,16 +118,12 @@
         clock: PreviewAnimationClock,
         content: @Composable () -> Unit
     ) {
-        val search = AnimationSearch({ clock }) { }
+        val search = AnimationSearch({ clock }) {}
         val slotTableRecord = CompositionDataRecord.create()
-        this.setContent {
-            Inspectable(slotTableRecord) {
-                content()
-            }
-        }
+        this.setContent { Inspectable(slotTableRecord) { content() } }
         this.runOnUiThread {
-            val groups = slotTableRecord.store.map { it.asTree() }
-                .flatMap { tree -> tree.findAll { true } }
+            val groups =
+                slotTableRecord.store.map { it.asTree() }.flatMap { tree -> tree.findAll { true } }
             search.attachAllAnimations(groups)
         }
     }
diff --git a/compose/ui/ui-tooling/src/androidInstrumentedTest/kotlin/androidx/compose/ui/tooling/animation/clock/AnimateXAsStateClockTest.kt b/compose/ui/ui-tooling/src/androidInstrumentedTest/kotlin/androidx/compose/ui/tooling/animation/clock/AnimateXAsStateClockTest.kt
index c649199..9fcba9c 100644
--- a/compose/ui/ui-tooling/src/androidInstrumentedTest/kotlin/androidx/compose/ui/tooling/animation/clock/AnimateXAsStateClockTest.kt
+++ b/compose/ui/ui-tooling/src/androidInstrumentedTest/kotlin/androidx/compose/ui/tooling/animation/clock/AnimateXAsStateClockTest.kt
@@ -57,36 +57,50 @@
 @RunWith(AndroidJUnit4::class)
 class AnimateXAsStateClockTest {
 
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
     @Test
     fun dpAnimationClock() {
-        val search = AnimationSearch.AnimateXAsStateSearch { }
+        val search = AnimationSearch.AnimateXAsStateSearch {}
         var state: State<Dp>? = null
         rule.addAnimations(search) {
-            state = animateDpAsState(
-                targetValue = 10.dp, animationSpec = TweenSpec(durationMillis = 100)
-            )
+            state =
+                animateDpAsState(
+                    targetValue = 10.dp,
+                    animationSpec = TweenSpec(durationMillis = 100)
+                )
         }
         val clock = AnimateXAsStateClock(search.animations.first().parse()!!)
-        checkInitialState(clock, label = "DpAnimation",
+        checkInitialState(
+            clock,
+            label = "DpAnimation",
             initialValue = 10.dp,
-            composeState = { state!!.value })
+            composeState = { state!!.value }
+        )
         rule.runOnUiThread { clock.setStateParameters(1.dp, 2.dp) }
-        checkUpdatedState(clock, label = "DpAnimation",
-            newInitialValue = 1.dp, newTargetValue = 2.dp,
-            composeState = { state!!.value })
+        checkUpdatedState(
+            clock,
+            label = "DpAnimation",
+            newInitialValue = 1.dp,
+            newTargetValue = 2.dp,
+            composeState = { state!!.value }
+        )
         rule.runOnUiThread { clock.setStateParameters(3f, 4.0) }
-        checkUpdatedState(clock, label = "DpAnimation",
-            newInitialValue = 3.dp, newTargetValue = 4.dp,
-            composeState = { state!!.value })
-        rule.runOnUiThread {
-            clock.setStateParameters(listOf(30f), listOf(40f))
-        }
-        checkUpdatedState(clock, label = "DpAnimation",
-            newInitialValue = 30.dp, newTargetValue = 40.dp,
-            composeState = { state!!.value })
+        checkUpdatedState(
+            clock,
+            label = "DpAnimation",
+            newInitialValue = 3.dp,
+            newTargetValue = 4.dp,
+            composeState = { state!!.value }
+        )
+        rule.runOnUiThread { clock.setStateParameters(listOf(30f), listOf(40f)) }
+        checkUpdatedState(
+            clock,
+            label = "DpAnimation",
+            newInitialValue = 30.dp,
+            newTargetValue = 40.dp,
+            composeState = { state!!.value }
+        )
         // Invalid parameters are ignored.
         rule.runOnUiThread {
             clock.setStateParameters(111.dp, "")
@@ -96,32 +110,49 @@
             clock.setStateParameters(listOf(111.dp), emptyList<Dp>())
         }
         // State hasn't changed.
-        checkUpdatedState(clock, label = "DpAnimation",
-            newInitialValue = 30.dp, newTargetValue = 40.dp,
-            composeState = { state!!.value })
+        checkUpdatedState(
+            clock,
+            label = "DpAnimation",
+            newInitialValue = 30.dp,
+            newTargetValue = 40.dp,
+            composeState = { state!!.value }
+        )
     }
 
     @Test
     fun floatAnimation() {
-        val search = AnimationSearch.AnimateXAsStateSearch { }
+        val search = AnimationSearch.AnimateXAsStateSearch {}
         var state: State<Float>? = null
         rule.addAnimations(search) {
-            state = animateFloatAsState(
-                targetValue = 10f, animationSpec = TweenSpec(durationMillis = 100)
-            )
+            state =
+                animateFloatAsState(
+                    targetValue = 10f,
+                    animationSpec = TweenSpec(durationMillis = 100)
+                )
         }
         val clock = AnimateXAsStateClock(search.animations.first().parse()!!)
-        checkInitialState(clock, label = "FloatAnimation",
+        checkInitialState(
+            clock,
+            label = "FloatAnimation",
             initialValue = 10f,
-            composeState = { state!!.value })
+            composeState = { state!!.value }
+        )
         rule.runOnUiThread { clock.setStateParameters(1f, 2f) }
-        checkUpdatedState(clock, label = "FloatAnimation",
-            newInitialValue = 1f, newTargetValue = 2f,
-            composeState = { state!!.value })
+        checkUpdatedState(
+            clock,
+            label = "FloatAnimation",
+            newInitialValue = 1f,
+            newTargetValue = 2f,
+            composeState = { state!!.value }
+        )
         rule.runOnUiThread { clock.setStateParameters(listOf(3f), listOf(4f)) }
-        checkUpdatedState(clock, label = "FloatAnimation",
-            newInitialValue = 3f, newTargetValue = 4f,
-            composeState = { state!!.value })
+        checkUpdatedState(
+            clock,
+            label = "FloatAnimation",
+            newInitialValue = 3f,
+            newTargetValue = 4f,
+            composeState = { state!!.value }
+        )
         // Invalid parameters are ignored.
         rule.runOnUiThread {
             clock.setStateParameters(111f, 111)
@@ -131,35 +162,49 @@
             clock.setStateParameters(listOf(111f), emptyList<Dp>())
         }
         // State hasn't changed.
-        checkUpdatedState(clock, label = "FloatAnimation",
-            newInitialValue = 3f, newTargetValue = 4f,
-            composeState = { state!!.value })
+        checkUpdatedState(
+            clock,
+            label = "FloatAnimation",
+            newInitialValue = 3f,
+            newTargetValue = 4f,
+            composeState = { state!!.value }
+        )
     }
 
     @Test
     fun intSizeAnimation() {
-        val search = AnimationSearch.AnimateXAsStateSearch() { }
+        val search = AnimationSearch.AnimateXAsStateSearch() {}
         var state: State<IntSize>? = null
         rule.addAnimations(search) {
-            state = animateIntSizeAsState(
-                targetValue = IntSize(10, 20),
-                animationSpec = TweenSpec(durationMillis = 100)
-            )
+            state =
+                animateIntSizeAsState(
+                    targetValue = IntSize(10, 20),
+                    animationSpec = TweenSpec(durationMillis = 100)
+                )
         }
         val clock = AnimateXAsStateClock(search.animations.first().parse()!!)
-        checkInitialState(clock, label = "IntSizeAnimation",
+        checkInitialState(
+            clock,
+            label = "IntSizeAnimation",
             initialValue = IntSize(10, 20),
-            composeState = { state!!.value })
-        rule.runOnUiThread {
-            clock.setStateParameters(IntSize(3, 4), IntSize(4, 5))
-        }
-        checkUpdatedState(clock, label = "IntSizeAnimation",
-            newInitialValue = IntSize(3, 4), newTargetValue = IntSize(4, 5),
-            composeState = { state!!.value })
+            composeState = { state!!.value }
+        )
+        rule.runOnUiThread { clock.setStateParameters(IntSize(3, 4), IntSize(4, 5)) }
+        checkUpdatedState(
+            clock,
+            label = "IntSizeAnimation",
+            newInitialValue = IntSize(3, 4),
+            newTargetValue = IntSize(4, 5),
+            composeState = { state!!.value }
+        )
         rule.runOnUiThread { clock.setStateParameters(listOf(5, 6), listOf(7, 8)) }
-        checkUpdatedState(clock, label = "IntSizeAnimation",
-            newInitialValue = IntSize(5, 6), newTargetValue = IntSize(7, 8),
-            composeState = { state!!.value })
+        checkUpdatedState(
+            clock,
+            label = "IntSizeAnimation",
+            newInitialValue = IntSize(5, 6),
+            newTargetValue = IntSize(7, 8),
+            composeState = { state!!.value }
+        )
         // Invalid parameters are ignored.
         rule.runOnUiThread {
             clock.setStateParameters(IntSize(111, 111), 111)
@@ -170,32 +215,46 @@
             clock.setStateParameters(listOf(IntSize(111, 11)), emptyList<IntOffset>())
         }
         // State hasn't changed.
-        checkUpdatedState(clock, label = "IntSizeAnimation",
-            newInitialValue = IntSize(5, 6), newTargetValue = IntSize(7, 8),
-            composeState = { state!!.value })
+        checkUpdatedState(
+            clock,
+            label = "IntSizeAnimation",
+            newInitialValue = IntSize(5, 6),
+            newTargetValue = IntSize(7, 8),
+            composeState = { state!!.value }
+        )
     }
 
     @Test
     fun intAnimation() {
-        val search = AnimationSearch.AnimateXAsStateSearch() { }
+        val search = AnimationSearch.AnimateXAsStateSearch() {}
         var state: State<Int>? = null
         rule.addAnimations(search) {
-            state = animateIntAsState(
-                targetValue = 10, animationSpec = TweenSpec(durationMillis = 100)
-            )
+            state =
+                animateIntAsState(targetValue = 10, animationSpec = TweenSpec(durationMillis = 100))
         }
         val clock = AnimateXAsStateClock(search.animations.first().parse()!!)
-        checkInitialState(clock, label = "IntAnimation",
+        checkInitialState(
+            clock,
+            label = "IntAnimation",
             initialValue = 10,
-            composeState = { state!!.value })
+            composeState = { state!!.value }
+        )
         rule.runOnUiThread { clock.setStateParameters(1, 2) }
-        checkUpdatedState(clock, label = "IntAnimation",
-            newInitialValue = 1, newTargetValue = 2,
-            composeState = { state!!.value })
+        checkUpdatedState(
+            clock,
+            label = "IntAnimation",
+            newInitialValue = 1,
+            newTargetValue = 2,
+            composeState = { state!!.value }
+        )
         rule.runOnUiThread { clock.setStateParameters(listOf(3), listOf(4)) }
-        checkUpdatedState(clock, label = "IntAnimation",
-            newInitialValue = 3, newTargetValue = 4,
-            composeState = { state!!.value })
+        checkUpdatedState(
+            clock,
+            label = "IntAnimation",
+            newInitialValue = 3,
+            newTargetValue = 4,
+            composeState = { state!!.value }
+        )
         // Invalid parameters are ignored.
         rule.runOnUiThread {
             clock.setStateParameters(111, 111f)
@@ -206,35 +265,49 @@
             clock.setStateParameters(listOf(111), emptyList<Int>())
         }
         // State hasn't changed.
-        checkUpdatedState(clock, label = "IntAnimation",
-            newInitialValue = 3, newTargetValue = 4,
-            composeState = { state!!.value })
+        checkUpdatedState(
+            clock,
+            label = "IntAnimation",
+            newInitialValue = 3,
+            newTargetValue = 4,
+            composeState = { state!!.value }
+        )
     }
 
     @Test
     fun intOffsetAnimation() {
-        val search = AnimationSearch.AnimateXAsStateSearch() { }
+        val search = AnimationSearch.AnimateXAsStateSearch() {}
         var state: State<IntOffset>? = null
         rule.addAnimations(search) {
-            state = animateIntOffsetAsState(
-                targetValue = IntOffset(10, 20),
-                animationSpec = TweenSpec(durationMillis = 100)
-            )
+            state =
+                animateIntOffsetAsState(
+                    targetValue = IntOffset(10, 20),
+                    animationSpec = TweenSpec(durationMillis = 100)
+                )
         }
         val clock = AnimateXAsStateClock(search.animations.first().parse()!!)
-        checkInitialState(clock, label = "IntOffsetAnimation",
+        checkInitialState(
+            clock,
+            label = "IntOffsetAnimation",
             initialValue = IntOffset(10, 20),
-            composeState = { state!!.value })
-        rule.runOnUiThread {
-            clock.setStateParameters(IntOffset(1, 2), IntOffset(3, 4))
-        }
-        checkUpdatedState(clock, label = "IntOffsetAnimation",
-            newInitialValue = IntOffset(1, 2), newTargetValue = IntOffset(3, 4),
-            composeState = { state!!.value })
+            composeState = { state!!.value }
+        )
+        rule.runOnUiThread { clock.setStateParameters(IntOffset(1, 2), IntOffset(3, 4)) }
+        checkUpdatedState(
+            clock,
+            label = "IntOffsetAnimation",
+            newInitialValue = IntOffset(1, 2),
+            newTargetValue = IntOffset(3, 4),
+            composeState = { state!!.value }
+        )
         rule.runOnUiThread { clock.setStateParameters(listOf(3, 4), listOf(4, 5)) }
-        checkUpdatedState(clock, label = "IntOffsetAnimation",
-            newInitialValue = IntOffset(3, 4), newTargetValue = IntOffset(4, 5),
-            composeState = { state!!.value })
+        checkUpdatedState(
+            clock,
+            label = "IntOffsetAnimation",
+            newInitialValue = IntOffset(3, 4),
+            newTargetValue = IntOffset(4, 5),
+            composeState = { state!!.value }
+        )
         // Invalid parameters are ignored.
         rule.runOnUiThread {
             clock.setStateParameters(IntOffset(111, 111), 111)
@@ -245,35 +318,49 @@
             clock.setStateParameters(listOf(IntOffset(111, 11)), emptyList<IntOffset>())
         }
         // State hasn't changed.
-        checkUpdatedState(clock, label = "IntOffsetAnimation",
-            newInitialValue = IntOffset(3, 4), newTargetValue = IntOffset(4, 5),
-            composeState = { state!!.value })
+        checkUpdatedState(
+            clock,
+            label = "IntOffsetAnimation",
+            newInitialValue = IntOffset(3, 4),
+            newTargetValue = IntOffset(4, 5),
+            composeState = { state!!.value }
+        )
     }
 
     @Test
     fun offsetAnimation() {
-        val search = AnimationSearch.AnimateXAsStateSearch() { }
+        val search = AnimationSearch.AnimateXAsStateSearch() {}
         var state: State<Offset>? = null
         rule.addAnimations(search) {
-            state = animateOffsetAsState(
-                targetValue = Offset(10f, 20f),
-                animationSpec = TweenSpec(durationMillis = 100)
-            )
+            state =
+                animateOffsetAsState(
+                    targetValue = Offset(10f, 20f),
+                    animationSpec = TweenSpec(durationMillis = 100)
+                )
         }
         val clock = AnimateXAsStateClock(search.animations.first().parse()!!)
-        checkInitialState(clock, label = "OffsetAnimation",
+        checkInitialState(
+            clock,
+            label = "OffsetAnimation",
             initialValue = Offset(10f, 20f),
-            composeState = { state!!.value })
-        rule.runOnUiThread {
-            clock.setStateParameters(Offset(1f, 2f), Offset(3f, 4f))
-        }
-        checkUpdatedState(clock, label = "OffsetAnimation",
-            newInitialValue = Offset(1f, 2f), newTargetValue = Offset(3f, 4f),
-            composeState = { state!!.value })
+            composeState = { state!!.value }
+        )
+        rule.runOnUiThread { clock.setStateParameters(Offset(1f, 2f), Offset(3f, 4f)) }
+        checkUpdatedState(
+            clock,
+            label = "OffsetAnimation",
+            newInitialValue = Offset(1f, 2f),
+            newTargetValue = Offset(3f, 4f),
+            composeState = { state!!.value }
+        )
         rule.runOnUiThread { clock.setStateParameters(listOf(3f, 4f), listOf(4f, 5f)) }
-        checkUpdatedState(clock, label = "OffsetAnimation",
-            newInitialValue = Offset(3f, 4f), newTargetValue = Offset(4f, 5f),
-            composeState = { state!!.value })
+        checkUpdatedState(
+            clock,
+            label = "OffsetAnimation",
+            newInitialValue = Offset(3f, 4f),
+            newTargetValue = Offset(4f, 5f),
+            composeState = { state!!.value }
+        )
         // Invalid parameters are ignored.
         rule.runOnUiThread {
             clock.setStateParameters(Offset(111f, 111f), 111)
@@ -284,35 +371,49 @@
             clock.setStateParameters(listOf(Offset(111f, 111f)), emptyList<Offset>())
         }
         // State hasn't changed.
-        checkUpdatedState(clock, label = "OffsetAnimation",
-            newInitialValue = Offset(3f, 4f), newTargetValue = Offset(4f, 5f),
-            composeState = { state!!.value })
+        checkUpdatedState(
+            clock,
+            label = "OffsetAnimation",
+            newInitialValue = Offset(3f, 4f),
+            newTargetValue = Offset(4f, 5f),
+            composeState = { state!!.value }
+        )
     }
 
     @Test
     fun sizeAnimation() {
-        val search = AnimationSearch.AnimateXAsStateSearch() { }
+        val search = AnimationSearch.AnimateXAsStateSearch() {}
         var state: State<Size>? = null
         rule.addAnimations(search) {
-            state = animateSizeAsState(
-                targetValue = Size(10f, 20f),
-                animationSpec = TweenSpec(durationMillis = 100)
-            )
+            state =
+                animateSizeAsState(
+                    targetValue = Size(10f, 20f),
+                    animationSpec = TweenSpec(durationMillis = 100)
+                )
         }
         val clock = AnimateXAsStateClock(search.animations.first().parse()!!)
-        checkInitialState(clock, label = "SizeAnimation",
+        checkInitialState(
+            clock,
+            label = "SizeAnimation",
             initialValue = Size(10f, 20f),
-            composeState = { state!!.value })
-        rule.runOnUiThread {
-            clock.setStateParameters(Size(1f, 2f), Size(3f, 4f))
-        }
-        checkUpdatedState(clock, label = "SizeAnimation",
-            newInitialValue = Size(1f, 2f), newTargetValue = Size(3f, 4f),
-            composeState = { state!!.value })
+            composeState = { state!!.value }
+        )
+        rule.runOnUiThread { clock.setStateParameters(Size(1f, 2f), Size(3f, 4f)) }
+        checkUpdatedState(
+            clock,
+            label = "SizeAnimation",
+            newInitialValue = Size(1f, 2f),
+            newTargetValue = Size(3f, 4f),
+            composeState = { state!!.value }
+        )
         rule.runOnUiThread { clock.setStateParameters(listOf(3f, 4f), listOf(4f, 5f)) }
-        checkUpdatedState(clock, label = "SizeAnimation",
-            newInitialValue = Size(3f, 4f), newTargetValue = Size(4f, 5f),
-            composeState = { state!!.value })
+        checkUpdatedState(
+            clock,
+            label = "SizeAnimation",
+            newInitialValue = Size(3f, 4f),
+            newTargetValue = Size(4f, 5f),
+            composeState = { state!!.value }
+        )
         // Invalid parameters are ignored.
         rule.runOnUiThread {
             clock.setStateParameters(Size(111f, 111f), 111)
@@ -323,45 +424,53 @@
             clock.setStateParameters(listOf(Size(111f, 111f)), emptyList<Size>())
         }
         // State hasn't changed.
-        checkUpdatedState(clock, label = "SizeAnimation",
-            newInitialValue = Size(3f, 4f), newTargetValue = Size(4f, 5f),
-            composeState = { state!!.value })
+        checkUpdatedState(
+            clock,
+            label = "SizeAnimation",
+            newInitialValue = Size(3f, 4f),
+            newTargetValue = Size(4f, 5f),
+            composeState = { state!!.value }
+        )
     }
 
     @Test
     fun rectAnimation() {
-        val search = AnimationSearch.AnimateXAsStateSearch() { }
+        val search = AnimationSearch.AnimateXAsStateSearch() {}
         var state: State<Rect>? = null
         rule.addAnimations(search) {
-            state = animateRectAsState(
-                targetValue = Rect(10f, 20f, 30f, 40f),
-                animationSpec = TweenSpec(durationMillis = 100)
-            )
+            state =
+                animateRectAsState(
+                    targetValue = Rect(10f, 20f, 30f, 40f),
+                    animationSpec = TweenSpec(durationMillis = 100)
+                )
         }
         val clock = AnimateXAsStateClock(search.animations.first().parse()!!)
-        checkInitialState(clock, label = "RectAnimation",
+        checkInitialState(
+            clock,
+            label = "RectAnimation",
             initialValue = Rect(10f, 20f, 30f, 40f),
-            composeState = { state!!.value })
+            composeState = { state!!.value }
+        )
         rule.runOnUiThread {
-            clock.setStateParameters(
-                Rect(1f, 2f, 30f, 40f),
-                Rect(3f, 4f, 30f, 40f)
-            )
+            clock.setStateParameters(Rect(1f, 2f, 30f, 40f), Rect(3f, 4f, 30f, 40f))
         }
-        checkUpdatedState(clock, label = "RectAnimation",
+        checkUpdatedState(
+            clock,
+            label = "RectAnimation",
             newInitialValue = Rect(1f, 2f, 30f, 40f),
             newTargetValue = Rect(3f, 4f, 30f, 40f),
-            composeState = { state!!.value })
+            composeState = { state!!.value }
+        )
         rule.runOnUiThread {
-            clock.setStateParameters(
-                listOf(3f, 4f, 30f, 40f),
-                listOf(4f, 5f, 30f, 40f)
-            )
+            clock.setStateParameters(listOf(3f, 4f, 30f, 40f), listOf(4f, 5f, 30f, 40f))
         }
-        checkUpdatedState(clock, label = "RectAnimation",
+        checkUpdatedState(
+            clock,
+            label = "RectAnimation",
             newInitialValue = Rect(3f, 4f, 30f, 40f),
             newTargetValue = Rect(4f, 5f, 30f, 40f),
-            composeState = { state!!.value })
+            composeState = { state!!.value }
+        )
         // Invalid parameters are ignored.
         rule.runOnUiThread {
             clock.setStateParameters(Rect(42f, 42f, 42f, 42f), 42f)
@@ -372,39 +481,54 @@
             clock.setStateParameters(listOf(Rect(42f, 42f, 42f, 42f)), emptyList<Rect>())
         }
         // State hasn't changed.
-        checkUpdatedState(clock, label = "RectAnimation",
+        checkUpdatedState(
+            clock,
+            label = "RectAnimation",
             newInitialValue = Rect(3f, 4f, 30f, 40f),
             newTargetValue = Rect(4f, 5f, 30f, 40f),
-            composeState = { state!!.value })
+            composeState = { state!!.value }
+        )
     }
 
     @Test
     fun colorAnimation() {
-        val search = AnimationSearch.AnimateXAsStateSearch() { }
+        val search = AnimationSearch.AnimateXAsStateSearch() {}
         var state: State<Color>? = null
         rule.addAnimations(search) {
-            state = animateColorAsState(
-                targetValue = Color.Black,
-                animationSpec = TweenSpec(durationMillis = 100)
-            )
+            state =
+                animateColorAsState(
+                    targetValue = Color.Black,
+                    animationSpec = TweenSpec(durationMillis = 100)
+                )
         }
         val clock = AnimateXAsStateClock(search.animations.first().parse()!!)
-        checkInitialState(clock, label = "ColorAnimation",
+        checkInitialState(
+            clock,
+            label = "ColorAnimation",
             initialValue = Color.Black,
-            composeState = { state!!.value })
+            composeState = { state!!.value }
+        )
         rule.runOnUiThread { clock.setStateParameters(Color.Gray, Color.Red) }
-        checkUpdatedState(clock, label = "ColorAnimation",
-            newInitialValue = Color.Gray, newTargetValue = Color.Red,
-            composeState = { state!!.value })
+        checkUpdatedState(
+            clock,
+            label = "ColorAnimation",
+            newInitialValue = Color.Gray,
+            newTargetValue = Color.Red,
+            composeState = { state!!.value }
+        )
         rule.runOnUiThread {
             clock.setStateParameters(
                 listOf(Color.Blue.red, Color.Blue.green, Color.Blue.blue, Color.Blue.alpha),
                 listOf(Color.Yellow.red, Color.Yellow.green, Color.Yellow.blue, Color.Yellow.alpha)
             )
         }
-        checkUpdatedState(clock, label = "ColorAnimation",
-            newInitialValue = Color.Blue, newTargetValue = Color.Yellow,
-            composeState = { state!!.value })
+        checkUpdatedState(
+            clock,
+            label = "ColorAnimation",
+            newInitialValue = Color.Blue,
+            newTargetValue = Color.Yellow,
+            composeState = { state!!.value }
+        )
         // Invalid parameters are ignored.
         rule.runOnUiThread {
             clock.setStateParameters(Color.Red, 1)
@@ -417,34 +541,50 @@
             clock.setStateParameters(listOf(0f, 0f, 10f, 10f), listOf(10f, 10f, 0f, 10f))
         }
         // State hasn't changed.
-        checkUpdatedState(clock, label = "ColorAnimation",
-            newInitialValue = Color.Blue, newTargetValue = Color.Yellow,
-            composeState = { state!!.value })
+        checkUpdatedState(
+            clock,
+            label = "ColorAnimation",
+            newInitialValue = Color.Blue,
+            newTargetValue = Color.Yellow,
+            composeState = { state!!.value }
+        )
     }
 
     @Test
     fun customFloatAnimation() {
-        val search = AnimationSearch.AnimateXAsStateSearch() { }
+        val search = AnimationSearch.AnimateXAsStateSearch() {}
         var state: State<Float>? = null
         rule.addAnimations(search) {
-            state = animateValueAsState(
-                targetValue = 10f,
-                Float.VectorConverter,
-                animationSpec = TweenSpec(durationMillis = 100)
-            )
+            state =
+                animateValueAsState(
+                    targetValue = 10f,
+                    Float.VectorConverter,
+                    animationSpec = TweenSpec(durationMillis = 100)
+                )
         }
         val clock = AnimateXAsStateClock(search.animations.first().parse()!!)
-        checkInitialState(clock, label = "ValueAnimation",
+        checkInitialState(
+            clock,
+            label = "ValueAnimation",
             initialValue = 10f,
-            composeState = { state!!.value })
+            composeState = { state!!.value }
+        )
         rule.runOnUiThread { clock.setStateParameters(1f, 2f) }
-        checkUpdatedState(clock, label = "ValueAnimation",
-            newInitialValue = 1f, newTargetValue = 2f,
-            composeState = { state!!.value })
+        checkUpdatedState(
+            clock,
+            label = "ValueAnimation",
+            newInitialValue = 1f,
+            newTargetValue = 2f,
+            composeState = { state!!.value }
+        )
         rule.runOnUiThread { clock.setStateParameters(listOf(3f), listOf(4f)) }
-        checkUpdatedState(clock, label = "ValueAnimation",
-            newInitialValue = 3f, newTargetValue = 4f,
-            composeState = { state!!.value })
+        checkUpdatedState(
+            clock,
+            label = "ValueAnimation",
+            newInitialValue = 3f,
+            newTargetValue = 4f,
+            composeState = { state!!.value }
+        )
         // Invalid parameters are ignored.
         rule.runOnUiThread {
             clock.setStateParameters(30f, 40)
@@ -455,34 +595,50 @@
             clock.setStateParameters(emptyList<Float>(), emptyList<Float>())
         }
         // State hasn't changed.
-        checkUpdatedState(clock, label = "ValueAnimation",
-            newInitialValue = 3f, newTargetValue = 4f,
-            composeState = { state!!.value })
+        checkUpdatedState(
+            clock,
+            label = "ValueAnimation",
+            newInitialValue = 3f,
+            newTargetValue = 4f,
+            composeState = { state!!.value }
+        )
     }
 
     @Test
     fun nullableFloatAnimation() {
-        val search = AnimationSearch.AnimateXAsStateSearch() { }
+        val search = AnimationSearch.AnimateXAsStateSearch() {}
         var state: State<Float?>? = null
         rule.addAnimations(search) {
-            state = animateValueAsState(
-                targetValue = 10f,
-                Utils.nullableFloatConverter,
-                animationSpec = TweenSpec(durationMillis = 100)
-            )
+            state =
+                animateValueAsState(
+                    targetValue = 10f,
+                    Utils.nullableFloatConverter,
+                    animationSpec = TweenSpec(durationMillis = 100)
+                )
         }
         val clock = AnimateXAsStateClock(search.animations.first().parse()!!)
-        checkInitialState(clock, label = "ValueAnimation",
+        checkInitialState(
+            clock,
+            label = "ValueAnimation",
             initialValue = 10f,
-            composeState = { state!!.value!! })
+            composeState = { state!!.value!! }
+        )
         rule.runOnUiThread { clock.setStateParameters(1f, 2f) }
-        checkUpdatedState(clock, label = "ValueAnimation",
-            newInitialValue = 1f, newTargetValue = 2f,
-            composeState = { state!!.value!! })
+        checkUpdatedState(
+            clock,
+            label = "ValueAnimation",
+            newInitialValue = 1f,
+            newTargetValue = 2f,
+            composeState = { state!!.value!! }
+        )
         rule.runOnUiThread { clock.setStateParameters(listOf(3f), listOf(4f)) }
-        checkUpdatedState(clock, label = "ValueAnimation",
-            newInitialValue = 3f, newTargetValue = 4f,
-            composeState = { state!!.value!! })
+        checkUpdatedState(
+            clock,
+            label = "ValueAnimation",
+            newInitialValue = 3f,
+            newTargetValue = 4f,
+            composeState = { state!!.value!! }
+        )
         // Invalid parameters are ignored.
         rule.runOnUiThread {
             clock.setStateParameters(30f, 40)
@@ -493,34 +649,50 @@
             clock.setStateParameters(emptyList<Float>(), emptyList<Float>())
         }
         // State hasn't changed.
-        checkUpdatedState(clock, label = "ValueAnimation",
-            newInitialValue = 3f, newTargetValue = 4f,
-            composeState = { state!!.value!! })
+        checkUpdatedState(
+            clock,
+            label = "ValueAnimation",
+            newInitialValue = 3f,
+            newTargetValue = 4f,
+            composeState = { state!!.value!! }
+        )
     }
 
     @Test
     fun stringAnimation() {
-        val search = AnimationSearch.AnimateXAsStateSearch() { }
+        val search = AnimationSearch.AnimateXAsStateSearch() {}
         var state: State<String>? = null
         rule.addAnimations(search) {
-            state = animateValueAsState(
-                targetValue = "10.0",
-                Utils.stringConverter,
-                animationSpec = TweenSpec(durationMillis = 100)
-            )
+            state =
+                animateValueAsState(
+                    targetValue = "10.0",
+                    Utils.stringConverter,
+                    animationSpec = TweenSpec(durationMillis = 100)
+                )
         }
         val clock = AnimateXAsStateClock(search.animations.first().parse()!!)
-        checkInitialState(clock, label = "ValueAnimation",
+        checkInitialState(
+            clock,
+            label = "ValueAnimation",
             initialValue = "10.0",
-            composeState = { state!!.value })
+            composeState = { state!!.value }
+        )
         rule.runOnUiThread { clock.setStateParameters("20.0", "30.0") }
-        checkUpdatedState(clock, label = "ValueAnimation",
-            newInitialValue = "20.0", newTargetValue = "30.0",
-            composeState = { state!!.value })
+        checkUpdatedState(
+            clock,
+            label = "ValueAnimation",
+            newInitialValue = "20.0",
+            newTargetValue = "30.0",
+            composeState = { state!!.value }
+        )
         rule.runOnUiThread { clock.setStateParameters(listOf("40.0"), listOf("50.0")) }
-        checkUpdatedState(clock, label = "ValueAnimation",
-            newInitialValue = "40.0", newTargetValue = "50.0",
-            composeState = { state!!.value })
+        checkUpdatedState(
+            clock,
+            label = "ValueAnimation",
+            newInitialValue = "40.0",
+            newTargetValue = "50.0",
+            composeState = { state!!.value }
+        )
         // Invalid parameters are ignored.
         rule.runOnUiThread {
             clock.setStateParameters(30f, 40)
@@ -531,51 +703,71 @@
             clock.setStateParameters(emptyList<String>(), emptyList<Int>())
         }
         // State hasn't changed.
-        checkUpdatedState(clock, label = "ValueAnimation",
-            newInitialValue = "40.0", newTargetValue = "50.0",
-            composeState = { state!!.value })
+        checkUpdatedState(
+            clock,
+            label = "ValueAnimation",
+            newInitialValue = "40.0",
+            newTargetValue = "50.0",
+            composeState = { state!!.value }
+        )
     }
 
     @Test
     fun enumAnimation() {
-        val search = AnimationSearch.AnimateXAsStateSearch() { }
+        val search = AnimationSearch.AnimateXAsStateSearch() {}
         var state: State<Utils.EnumState>? = null
         rule.addAnimations(search) {
-            state = animateValueAsState(
-                targetValue = Utils.EnumState.One,
-                Utils.enumConverter,
-                animationSpec = TweenSpec(durationMillis = 100)
-            )
+            state =
+                animateValueAsState(
+                    targetValue = Utils.EnumState.One,
+                    Utils.enumConverter,
+                    animationSpec = TweenSpec(durationMillis = 100)
+                )
         }
         val clock = AnimateXAsStateClock(search.animations.first().parse()!!)
-        checkInitialState(clock, label = "ValueAnimation",
+        checkInitialState(
+            clock,
+            label = "ValueAnimation",
             initialValue = Utils.EnumState.One,
-            composeState = { state!!.value })
+            composeState = { state!!.value }
+        )
     }
 
     @Test
     fun booleanAnimation() {
-        val search = AnimationSearch.AnimateXAsStateSearch() { }
+        val search = AnimationSearch.AnimateXAsStateSearch() {}
         var state: State<Boolean>? = null
         rule.addAnimations(search) {
-            state = animateValueAsState(
-                targetValue = false,
-                Utils.booleanConverter,
-                animationSpec = TweenSpec(durationMillis = 100)
-            )
+            state =
+                animateValueAsState(
+                    targetValue = false,
+                    Utils.booleanConverter,
+                    animationSpec = TweenSpec(durationMillis = 100)
+                )
         }
         val clock = AnimateXAsStateClock(search.animations.first().parse()!!)
-        checkInitialState(clock, label = "ValueAnimation",
+        checkInitialState(
+            clock,
+            label = "ValueAnimation",
             initialValue = false,
-            composeState = { state!!.value })
+            composeState = { state!!.value }
+        )
         rule.runOnUiThread { clock.setStateParameters(false, true) }
-        checkUpdatedState(clock, label = "ValueAnimation",
-            newInitialValue = false, newTargetValue = true,
-            composeState = { state!!.value })
+        checkUpdatedState(
+            clock,
+            label = "ValueAnimation",
+            newInitialValue = false,
+            newTargetValue = true,
+            composeState = { state!!.value }
+        )
         rule.runOnUiThread { clock.setStateParameters(listOf(true), listOf(false)) }
-        checkUpdatedState(clock, label = "ValueAnimation",
-            newInitialValue = true, newTargetValue = false,
-            composeState = { state!!.value })
+        checkUpdatedState(
+            clock,
+            label = "ValueAnimation",
+            newInitialValue = true,
+            newTargetValue = false,
+            composeState = { state!!.value }
+        )
         // Invalid parameters are ignored.
         rule.runOnUiThread {
             clock.setStateParameters(true, 111f)
@@ -586,30 +778,37 @@
             clock.setStateParameters(listOf(true), emptyList<Boolean>())
         }
         // State hasn't changed.
-        checkUpdatedState(clock, label = "ValueAnimation",
-            newInitialValue = true, newTargetValue = false,
-            composeState = { state!!.value })
+        checkUpdatedState(
+            clock,
+            label = "ValueAnimation",
+            newInitialValue = true,
+            newTargetValue = false,
+            composeState = { state!!.value }
+        )
     }
 
     @Test
     fun nullableEnumAnimation() {
-        val search = AnimationSearch.AnimateXAsStateSearch() { }
+        val search = AnimationSearch.AnimateXAsStateSearch() {}
         var state: State<Utils.EnumState?>? = null
         rule.addAnimations(search) {
-            state = animateValueAsState(
-                targetValue = Utils.EnumState.One,
-                Utils.nullableEnumConverter,
-                animationSpec = TweenSpec(durationMillis = 100)
-            )
+            state =
+                animateValueAsState(
+                    targetValue = Utils.EnumState.One,
+                    Utils.nullableEnumConverter,
+                    animationSpec = TweenSpec(durationMillis = 100)
+                )
         }
         val clock = AnimateXAsStateClock(search.animations.first().parse()!!)
-        checkInitialState(clock, label = "ValueAnimation",
+        checkInitialState(
+            clock,
+            label = "ValueAnimation",
             initialValue = Utils.EnumState.One,
-            composeState = { state!!.value!! })
+            composeState = { state!!.value!! }
+        )
     }
 
-    private fun <T : ComposeAnimation, TState : ComposeAnimationState, V : Any>
-        checkInitialState(
+    private fun <T : ComposeAnimation, TState : ComposeAnimationState, V : Any> checkInitialState(
         clock: ComposeAnimationClock<T, TState>,
         label: String,
         initialValue: V,
@@ -635,8 +834,7 @@
         }
     }
 
-    private fun <T : ComposeAnimation, TState : ComposeAnimationState, V : Any>
-        checkUpdatedState(
+    private fun <T : ComposeAnimation, TState : ComposeAnimationState, V : Any> checkUpdatedState(
         clock: ComposeAnimationClock<T, TState>,
         label: String,
         newInitialValue: V,
@@ -666,9 +864,7 @@
             }
         }
         // Jump to the end of the animation.
-        rule.runOnUiThread {
-            clock.setClockTime(millisToNanos(300L))
-        }
+        rule.runOnUiThread { clock.setClockTime(millisToNanos(300L)) }
         // Check state at the end of the animation.
         rule.waitForIdle()
         rule.runOnUiThread {
diff --git a/compose/ui/ui-tooling/src/androidInstrumentedTest/kotlin/androidx/compose/ui/tooling/animation/clock/AnimatedVisibilityClockTest.kt b/compose/ui/ui-tooling/src/androidInstrumentedTest/kotlin/androidx/compose/ui/tooling/animation/clock/AnimatedVisibilityClockTest.kt
index 6bad9d0..de95111 100644
--- a/compose/ui/ui-tooling/src/androidInstrumentedTest/kotlin/androidx/compose/ui/tooling/animation/clock/AnimatedVisibilityClockTest.kt
+++ b/compose/ui/ui-tooling/src/androidInstrumentedTest/kotlin/androidx/compose/ui/tooling/animation/clock/AnimatedVisibilityClockTest.kt
@@ -31,8 +31,7 @@
 
 class AnimatedVisibilityClockTest {
 
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
     @Test
     fun checkClockAfterStateChanged() {
diff --git a/compose/ui/ui-tooling/src/androidInstrumentedTest/kotlin/androidx/compose/ui/tooling/animation/clock/InfiniteTransitionClockTest.kt b/compose/ui/ui-tooling/src/androidInstrumentedTest/kotlin/androidx/compose/ui/tooling/animation/clock/InfiniteTransitionClockTest.kt
index d65df91..978d103 100644
--- a/compose/ui/ui-tooling/src/androidInstrumentedTest/kotlin/androidx/compose/ui/tooling/animation/clock/InfiniteTransitionClockTest.kt
+++ b/compose/ui/ui-tooling/src/androidInstrumentedTest/kotlin/androidx/compose/ui/tooling/animation/clock/InfiniteTransitionClockTest.kt
@@ -42,16 +42,18 @@
 @RunWith(AndroidJUnit4::class)
 class InfiniteTransitionClockTest {
 
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
     @Test
     fun checkAnimatedPropertiesForAnimateFloat() {
-        val search = AnimationSearch.InfiniteTransitionSearch { }
+        val search = AnimationSearch.InfiniteTransitionSearch {}
         rule.addAnimations(search) {
             val infiniteTransition = rememberInfiniteTransition()
             infiniteTransition.animateFloat(
-                0.2f, 2.1f, infiniteRepeatable(tween(300), RepeatMode.Reverse), label = "Test label"
+                0.2f,
+                2.1f,
+                infiniteRepeatable(tween(300), RepeatMode.Reverse),
+                label = "Test label"
             )
         }
         val clock = InfiniteTransitionClock(search.animations.first().parse()!!)
@@ -67,7 +69,7 @@
 
     @Test
     fun checkAnimatedPropertiesForAnimateValue() {
-        val search = AnimationSearch.InfiniteTransitionSearch { }
+        val search = AnimationSearch.InfiniteTransitionSearch {}
         rule.addAnimations(search) {
             val infiniteTransition = rememberInfiniteTransition()
             infiniteTransition.animateValue(
@@ -91,7 +93,7 @@
 
     @Test
     fun checkAnimatedPropertiesForAnimateColor() {
-        val search = AnimationSearch.InfiniteTransitionSearch { }
+        val search = AnimationSearch.InfiniteTransitionSearch {}
         rule.addAnimations(search) {
             val infiniteTransition = rememberInfiniteTransition()
             infiniteTransition.animateColor(
@@ -114,7 +116,7 @@
 
     @Test
     fun checkAnimatedPropertiesForNullableAnimateValue() {
-        val search = AnimationSearch.InfiniteTransitionSearch { }
+        val search = AnimationSearch.InfiniteTransitionSearch {}
         rule.addAnimations(search) {
             val infiniteTransition = rememberInfiniteTransition()
             infiniteTransition.animateValue(
@@ -138,7 +140,7 @@
 
     @Test
     fun checkTransitions() {
-        val search = AnimationSearch.InfiniteTransitionSearch { }
+        val search = AnimationSearch.InfiniteTransitionSearch {}
         rule.addAnimations(search) {
             val infiniteTransition = rememberInfiniteTransition()
             infiniteTransition.animateFloat(
@@ -197,7 +199,7 @@
 
     @Test
     fun checkNullableTransitions() {
-        val search = AnimationSearch.InfiniteTransitionSearch { }
+        val search = AnimationSearch.InfiniteTransitionSearch {}
         rule.addAnimations(search) {
             val infiniteTransition = rememberInfiniteTransition()
             infiniteTransition.animateValue(
@@ -226,11 +228,12 @@
 
     @Test
     fun checkDurationOfReverseAnimation() {
-        val search = AnimationSearch.InfiniteTransitionSearch { }
+        val search = AnimationSearch.InfiniteTransitionSearch {}
         rule.addAnimations(search) {
             val infiniteTransition = rememberInfiniteTransition()
             infiniteTransition.animateFloat(
-                0f, 1f,
+                0f,
+                1f,
                 infiniteRepeatable(tween(300), RepeatMode.Reverse),
             )
         }
@@ -243,11 +246,12 @@
 
     @Test
     fun checkDurationOfRestartAnimation() {
-        val search = AnimationSearch.InfiniteTransitionSearch { }
+        val search = AnimationSearch.InfiniteTransitionSearch {}
         rule.addAnimations(search) {
             val infiniteTransition = rememberInfiniteTransition()
             infiniteTransition.animateFloat(
-                0f, 1f,
+                0f,
+                1f,
                 infiniteRepeatable(tween(300, 50), RepeatMode.Restart),
             )
         }
@@ -260,19 +264,22 @@
 
     @Test
     fun maxDurationIsCorrect() {
-        val search = AnimationSearch.InfiniteTransitionSearch { }
+        val search = AnimationSearch.InfiniteTransitionSearch {}
         rule.addAnimations(search) {
             val infiniteTransition = rememberInfiniteTransition()
             infiniteTransition.animateFloat(
-                0f, 1f,
+                0f,
+                1f,
                 infiniteRepeatable(tween(100), RepeatMode.Restart),
             )
             infiniteTransition.animateFloat(
-                0f, 1f,
+                0f,
+                1f,
                 infiniteRepeatable(tween(300), RepeatMode.Restart),
             )
             infiniteTransition.animateFloat(
-                0f, 1f,
+                0f,
+                1f,
                 infiniteRepeatable(tween(500), RepeatMode.Restart),
             )
         }
@@ -285,11 +292,12 @@
 
     @Test
     fun maxDurationFromOtherAnimations() {
-        val search = AnimationSearch.InfiniteTransitionSearch { }
+        val search = AnimationSearch.InfiniteTransitionSearch {}
         rule.addAnimations(search) {
             val infiniteTransition = rememberInfiniteTransition()
             infiniteTransition.animateFloat(
-                0f, 1f,
+                0f,
+                1f,
                 infiniteRepeatable(tween(100), RepeatMode.Restart),
             )
         }
diff --git a/compose/ui/ui-tooling/src/androidInstrumentedTest/kotlin/androidx/compose/ui/tooling/animation/clock/TransitionClockTest.kt b/compose/ui/ui-tooling/src/androidInstrumentedTest/kotlin/androidx/compose/ui/tooling/animation/clock/TransitionClockTest.kt
index ce1ad15..2ea0d36 100644
--- a/compose/ui/ui-tooling/src/androidInstrumentedTest/kotlin/androidx/compose/ui/tooling/animation/clock/TransitionClockTest.kt
+++ b/compose/ui/ui-tooling/src/androidInstrumentedTest/kotlin/androidx/compose/ui/tooling/animation/clock/TransitionClockTest.kt
@@ -55,14 +55,17 @@
 @OptIn(ExperimentalAnimationApi::class)
 class TransitionClockTest {
 
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
-    enum class EnumState { One, Two, Three }
+    enum class EnumState {
+        One,
+        Two,
+        Three
+    }
 
     data class CustomState(val number: Int)
 
-    //region updateTransition() animations
+    // region updateTransition() animations
 
     @Test
     fun clockWithEnumState() {
@@ -257,10 +260,7 @@
 
     @Test
     fun changeTimeForEnumClock() {
-        changeTimeForClock(
-            createEnumTransitionClock(),
-            TargetState(EnumState.Three, EnumState.Two)
-        )
+        changeTimeForClock(createEnumTransitionClock(), TargetState(EnumState.Three, EnumState.Two))
     }
 
     @Test
@@ -273,10 +273,7 @@
 
     @Test
     fun changeTimeForIntClock() {
-        changeTimeForClock(
-            createIntTransitionClock(),
-            TargetState(3, 2)
-        )
+        changeTimeForClock(createIntTransitionClock(), TargetState(3, 2))
     }
 
     @Test
@@ -306,7 +303,8 @@
                 listOf(
                     ComposeAnimatedProperty("Animated Dp", 10.dp),
                     ComposeAnimatedProperty("Animated Color", Color.Red)
-                ), clock.getAnimatedProperties()
+                ),
+                clock.getAnimatedProperties()
             )
             // Change start and end state.
             clock.state = state
@@ -317,7 +315,8 @@
                 listOf(
                     ComposeAnimatedProperty("Animated Dp", 30.dp),
                     ComposeAnimatedProperty("Animated Color", Color.Green)
-                ), clock.getAnimatedProperties()
+                ),
+                clock.getAnimatedProperties()
             )
             // Update clock time - set it to end of dp animation.
             clock.setClockTime(millisToNanos(1100L))
@@ -350,70 +349,86 @@
     }
 
     private fun createEnumTransitionClock(): TransitionClock<EnumState> {
-        return createTransitionClock(EnumState.One, {
-            when (it) {
-                EnumState.One -> 10.dp
-                EnumState.Two -> 20.dp
-                EnumState.Three -> 30.dp
+        return createTransitionClock(
+            EnumState.One,
+            {
+                when (it) {
+                    EnumState.One -> 10.dp
+                    EnumState.Two -> 20.dp
+                    EnumState.Three -> 30.dp
+                }
+            },
+            {
+                when (it) {
+                    EnumState.One -> Color.Red
+                    EnumState.Two -> Color.Gray
+                    EnumState.Three -> Color.Green
+                }
             }
-        }, {
-            when (it) {
-                EnumState.One -> Color.Red
-                EnumState.Two -> Color.Gray
-                EnumState.Three -> Color.Green
-            }
-        })
+        )
     }
 
     private fun createIntTransitionClock(): TransitionClock<Int> {
-        return createTransitionClock(1, {
-            when (it) {
-                1 -> 10.dp
-                2 -> 20.dp
-                else -> 30.dp
+        return createTransitionClock(
+            1,
+            {
+                when (it) {
+                    1 -> 10.dp
+                    2 -> 20.dp
+                    else -> 30.dp
+                }
+            },
+            {
+                when (it) {
+                    1 -> Color.Red
+                    2 -> Color.Gray
+                    else -> Color.Green
+                }
             }
-        }, {
-            when (it) {
-                1 -> Color.Red
-                2 -> Color.Gray
-                else -> Color.Green
-            }
-        })
+        )
     }
 
     private fun createCustomStateTransitionClock(): TransitionClock<CustomState> {
-        return createTransitionClock(CustomState(1), {
-            when (it) {
-                CustomState(1) -> 10.dp
-                CustomState(2) -> 20.dp
-                else -> 30.dp
+        return createTransitionClock(
+            CustomState(1),
+            {
+                when (it) {
+                    CustomState(1) -> 10.dp
+                    CustomState(2) -> 20.dp
+                    else -> 30.dp
+                }
+            },
+            {
+                when (it) {
+                    CustomState(1) -> Color.Red
+                    CustomState(2) -> Color.Gray
+                    else -> Color.Green
+                }
             }
-        }, {
-            when (it) {
-                CustomState(1) -> Color.Red
-                CustomState(2) -> Color.Gray
-                else -> Color.Green
-            }
-        })
+        )
     }
 
     private fun createNullableEnumTransitionClock(): TransitionClock<EnumState?> {
         // It might not make sense, but it's allowed and it should not fail.
-        return createTransitionClock(EnumState.One, {
-            when (it) {
-                EnumState.One -> 10.dp
-                EnumState.Two -> 20.dp
-                EnumState.Three -> 30.dp
-                null -> 30.dp
+        return createTransitionClock(
+            EnumState.One,
+            {
+                when (it) {
+                    EnumState.One -> 10.dp
+                    EnumState.Two -> 20.dp
+                    EnumState.Three -> 30.dp
+                    null -> 30.dp
+                }
+            },
+            {
+                when (it) {
+                    EnumState.One -> Color.Red
+                    EnumState.Two -> Color.Gray
+                    EnumState.Three -> Color.Green
+                    null -> Color.Green
+                }
             }
-        }, {
-            when (it) {
-                EnumState.One -> Color.Red
-                EnumState.Two -> Color.Gray
-                EnumState.Three -> Color.Green
-                null -> Color.Green
-            }
-        })
+        )
     }
 
     private fun <S> createTransitionClock(
@@ -428,12 +443,16 @@
             transition.animateDp(
                 transitionSpec = { tween(durationMillis = 1000, delayMillis = 100) },
                 label = "Animated Dp"
-            ) { targetDpByState(it) }
+            ) {
+                targetDpByState(it)
+            }
 
             transition.animateColor(
                 transitionSpec = { tween(durationMillis = 2000) },
                 label = "Animated Color"
-            ) { targetColorByState(it) }
+            ) {
+                targetColorByState(it)
+            }
             clock = TransitionClock(transition.parse() as TransitionComposeAnimation<S>)
         }
         return clock
@@ -444,9 +463,7 @@
         lateinit var clock: TransitionClock<Boolean>
         rule.setContent {
             val transition = updateTransition(targetState, label = "TestTransition")
-            transition.AnimatedVisibility(visible = { it }) {
-                Text(text = "TestText")
-            }
+            transition.AnimatedVisibility(visible = { it }) { Text(text = "TestText") }
             clock = TransitionClock(transition.parse() as TransitionComposeAnimation<Boolean>)
         }
         return clock
@@ -488,7 +505,7 @@
 
     @Test
     fun childTransition() {
-        val search = AnimationSearch.TransitionSearch { }
+        val search = AnimationSearch.TransitionSearch {}
         rule.addAnimations(search) { childTransitions() }
         val clock = TransitionClock(search.animations.first().parse()!!)
 
@@ -520,40 +537,60 @@
         parentTransition.animateDp(
             transitionSpec = { tween(durationMillis = 1000, delayMillis = 100) },
             label = "Parent"
-        ) { 10.dp }
+        ) {
+            10.dp
+        }
 
-        val child = parentTransition.createChildTransition(label = "child1") { it }.apply {
-            this.animateDp(
-                transitionSpec = { tween(durationMillis = 1000, delayMillis = 100) },
-                label = "Child1"
-            ) { 10.dp }
-        }
-        val grandchild = child.createChildTransition(label = "child1") { it }.apply {
-            this.animateDp(
-                transitionSpec = { tween(durationMillis = 1000, delayMillis = 100) },
-                label = "Grandchild"
-            ) { 10.dp }
-        }
-        grandchild.createChildTransition(label = "child1") { it }.apply {
-            this.animateDp(
-                transitionSpec = { tween(durationMillis = 1000, delayMillis = 100) },
-                label = "GrandGrandchild"
-            ) { 10.dp }
-        }
-        parentTransition.createChildTransition(label = "child2") { it }.apply {
-            this.animateDp(
-                transitionSpec = { tween(durationMillis = 1000, delayMillis = 100) },
-                label = "Child2"
-            ) { 10.dp }
-        }
+        val child =
+            parentTransition
+                .createChildTransition(label = "child1") { it }
+                .apply {
+                    this.animateDp(
+                        transitionSpec = { tween(durationMillis = 1000, delayMillis = 100) },
+                        label = "Child1"
+                    ) {
+                        10.dp
+                    }
+                }
+        val grandchild =
+            child
+                .createChildTransition(label = "child1") { it }
+                .apply {
+                    this.animateDp(
+                        transitionSpec = { tween(durationMillis = 1000, delayMillis = 100) },
+                        label = "Grandchild"
+                    ) {
+                        10.dp
+                    }
+                }
+        grandchild
+            .createChildTransition(label = "child1") { it }
+            .apply {
+                this.animateDp(
+                    transitionSpec = { tween(durationMillis = 1000, delayMillis = 100) },
+                    label = "GrandGrandchild"
+                ) {
+                    10.dp
+                }
+            }
+        parentTransition
+            .createChildTransition(label = "child2") { it }
+            .apply {
+                this.animateDp(
+                    transitionSpec = { tween(durationMillis = 1000, delayMillis = 100) },
+                    label = "Child2"
+                ) {
+                    10.dp
+                }
+            }
     }
 
-    //endregion
+    // endregion
 
-    //region AnimatedContent() animations
+    // region AnimatedContent() animations
     @Test
     fun animatedContentClockState() {
-        val search = AnimationSearch.AnimatedContentSearch { }
+        val search = AnimationSearch.AnimatedContentSearch {}
         val target = mutableStateOf<Dp?>(null)
         rule.addAnimations(search) { AnimatedContent(1.dp) { target.value = it } }
         val clock = TransitionClock(search.animations.first().parseAnimatedContent()!!)
@@ -576,7 +613,7 @@
 
     @Test
     fun animatedContentClockStateAsList() {
-        val search = AnimationSearch.AnimatedContentSearch { }
+        val search = AnimationSearch.AnimatedContentSearch {}
         val target = mutableStateOf<IntSize?>(null)
         rule.addAnimations(search) { AnimatedContent(IntSize(10, 10)) { target.value = it } }
         val clock = TransitionClock(search.animations.first().parseAnimatedContent()!!)
@@ -592,24 +629,20 @@
 
     @Test
     fun animatedContentClockProperties() {
-        val search = AnimationSearch.AnimatedContentSearch { }
+        val search = AnimationSearch.AnimatedContentSearch {}
         rule.addAnimations(search) { AnimatedContent(1.dp) {} }
         val clock = TransitionClock(search.animations.first().parseAnimatedContent()!!)
-        rule.runOnIdle {
-            clock.setStateParameters(10.dp, 10.dp)
-        }
+        rule.runOnIdle { clock.setStateParameters(10.dp, 10.dp) }
         rule.runOnIdle {
             assertEquals(2, clock.getAnimatedProperties().size)
             clock.setStateParameters(20.dp, 40.dp)
         }
-        rule.runOnIdle {
-            assertTrue(clock.getAnimatedProperties().isNotEmpty())
-        }
+        rule.runOnIdle { assertTrue(clock.getAnimatedProperties().isNotEmpty()) }
     }
 
     @Test
     fun animatedContentClockTransitions() {
-        val search = AnimationSearch.AnimatedContentSearch { }
+        val search = AnimationSearch.AnimatedContentSearch {}
         rule.addAnimations(search) { AnimatedContent(1.dp) {} }
         val clock = TransitionClock(search.animations.first().parseAnimatedContent()!!)
         rule.runOnIdle {
@@ -618,9 +651,7 @@
         }
         rule.runOnIdle {
             // Default clock state.
-            clock.getTransitions(100).let {
-                assertEquals(2, it.size)
-            }
+            clock.getTransitions(100).let { assertEquals(2, it.size) }
             // Change state
             clock.setStateParameters(20.dp, 40.dp)
             clock.setClockTime(0)
@@ -642,10 +673,8 @@
 
     @Test
     fun animatedContentClockDuration() {
-        val search = AnimationSearch.AnimatedContentSearch { }
-        rule.addAnimations(search) {
-            AnimatedContent(targetState = 1.dp) {}
-        }
+        val search = AnimationSearch.AnimatedContentSearch {}
+        rule.addAnimations(search) { AnimatedContent(targetState = 1.dp) {} }
         val clock = TransitionClock(search.animations.first().parseAnimatedContent()!!)
         rule.runOnIdle {
             assertEquals(0, clock.getMaxDuration())
@@ -658,7 +687,8 @@
             assertTrue(clock.getMaxDurationPerIteration() >= 100)
         }
     }
-    //endregion
+
+    // endregion
 
     fun assertEquals(expected: Int, actual: Int, delta: Int) {
         assertEquals(null, expected.toFloat(), actual.toFloat(), delta.toFloat())
diff --git a/compose/ui/ui-tooling/src/androidInstrumentedTest/kotlin/androidx/compose/ui/tooling/animation/clock/UtilsTest.kt b/compose/ui/ui-tooling/src/androidInstrumentedTest/kotlin/androidx/compose/ui/tooling/animation/clock/UtilsTest.kt
index e3e263d..a056e74 100644
--- a/compose/ui/ui-tooling/src/androidInstrumentedTest/kotlin/androidx/compose/ui/tooling/animation/clock/UtilsTest.kt
+++ b/compose/ui/ui-tooling/src/androidInstrumentedTest/kotlin/androidx/compose/ui/tooling/animation/clock/UtilsTest.kt
@@ -74,21 +74,13 @@
 
     @Test
     fun offsetOutOfBounds() {
-        val value = parseParametersToValue(
-            Offset(10f, 20f),
-            listOf(30f),
-            listOf(50f, 60f)
-        )
+        val value = parseParametersToValue(Offset(10f, 20f), listOf(30f), listOf(50f, 60f))
         assertNull(value)
     }
 
     @Test
     fun offsetIncorrectType() {
-        val value = parseParametersToValue(
-            Offset(10f, 20f),
-            listOf("a", "b"),
-            listOf(50f, 60f)
-        )
+        val value = parseParametersToValue(Offset(10f, 20f), listOf("a", "b"), listOf(50f, 60f))
         assertNull(value)
     }
 
@@ -154,141 +146,99 @@
 
     @Test
     fun intSizeIsParsed() {
-        val value = parseParametersToValue(
-            IntSize(10, 20),
-            IntSize(30, 40),
-            IntSize(50, 60)
-        )
+        val value = parseParametersToValue(IntSize(10, 20), IntSize(30, 40), IntSize(50, 60))
         assertEquals(TargetState(IntSize(30, 40), IntSize(50, 60)), value)
     }
 
     @Test
     fun intSizeIsParsedAsList() {
-        val value = parseParametersToValue(
-            IntSize(10, 20),
-            listOf(30, 40),
-            listOf(50, 60)
-        )
+        val value = parseParametersToValue(IntSize(10, 20), listOf(30, 40), listOf(50, 60))
         assertEquals(TargetState(IntSize(30, 40), IntSize(50, 60)), value)
     }
 
     @Test
     fun intOffsetIsParsed() {
-        val value = parseParametersToValue(
-            IntOffset(10, 20),
-            IntOffset(30, 40),
-            IntOffset(50, 60)
-        )
+        val value = parseParametersToValue(IntOffset(10, 20), IntOffset(30, 40), IntOffset(50, 60))
         assertEquals(TargetState(IntOffset(30, 40), IntOffset(50, 60)), value)
     }
 
     @Test
     fun intOffsetIsParsedAsList() {
-        val value = parseParametersToValue(
-            IntOffset(10, 20),
-            listOf(30, 40),
-            listOf(50, 60)
-        )
+        val value = parseParametersToValue(IntOffset(10, 20), listOf(30, 40), listOf(50, 60))
         assertEquals(TargetState(IntOffset(30, 40), IntOffset(50, 60)), value)
     }
 
     @Test
     fun sizeIsParsed() {
-        val value = parseParametersToValue(
-            Size(10f, 20f),
-            Size(30f, 40f),
-            Size(50f, 60f)
-        )
+        val value = parseParametersToValue(Size(10f, 20f), Size(30f, 40f), Size(50f, 60f))
         assertEquals(TargetState(Size(30f, 40f), Size(50f, 60f)), value)
     }
 
     @Test
     fun sizeIsParsedAsList() {
-        val value = parseParametersToValue(
-            Size(10f, 20f),
-            listOf(30f, 40f),
-            listOf(50f, 60f)
-        )
+        val value = parseParametersToValue(Size(10f, 20f), listOf(30f, 40f), listOf(50f, 60f))
         assertEquals(TargetState(Size(30f, 40f), Size(50f, 60f)), value)
     }
 
     @Test
     fun offsetIsParsed() {
-        val value = parseParametersToValue(
-            Offset(10f, 20f),
-            Offset(30f, 40f),
-            Offset(50f, 60f)
-        )
+        val value = parseParametersToValue(Offset(10f, 20f), Offset(30f, 40f), Offset(50f, 60f))
         assertEquals(TargetState(Offset(30f, 40f), Offset(50f, 60f)), value)
     }
 
     @Test
     fun offsetIsParsedAsList() {
-        val value = parseParametersToValue(
-            Offset(10f, 20f),
-            listOf(30f, 40f),
-            listOf(50f, 60f)
-        )
+        val value = parseParametersToValue(Offset(10f, 20f), listOf(30f, 40f), listOf(50f, 60f))
         assertEquals(TargetState(Offset(30f, 40f), Offset(50f, 60f)), value)
     }
 
     @Test
     fun rectIsParsed() {
-        val value = parseParametersToValue(
-            Rect(10f, 20f, 30f, 40f),
-            Rect(50f, 60f, 70f, 80f),
-            Rect(90f, 100f, 110f, 120f)
-        )
-        assertEquals(
-            TargetState(
+        val value =
+            parseParametersToValue(
+                Rect(10f, 20f, 30f, 40f),
                 Rect(50f, 60f, 70f, 80f),
                 Rect(90f, 100f, 110f, 120f)
-            ), value
-        )
+            )
+        assertEquals(TargetState(Rect(50f, 60f, 70f, 80f), Rect(90f, 100f, 110f, 120f)), value)
     }
 
     @Test
     fun rectIsParsedAsList() {
-        val value = parseParametersToValue(
-            Rect(10f, 20f, 30f, 40f),
-            listOf(50f, 60f, 70f, 80f),
-            listOf(90f, 100f, 110f, 120f)
-        )
-        assertEquals(
-            TargetState(
-                Rect(50f, 60f, 70f, 80f),
-                Rect(90f, 100f, 110f, 120f)
-            ), value
-        )
+        val value =
+            parseParametersToValue(
+                Rect(10f, 20f, 30f, 40f),
+                listOf(50f, 60f, 70f, 80f),
+                listOf(90f, 100f, 110f, 120f)
+            )
+        assertEquals(TargetState(Rect(50f, 60f, 70f, 80f), Rect(90f, 100f, 110f, 120f)), value)
     }
 
     @Test
     fun colorIsParsed() {
-        val value = parseParametersToValue(
-            Color(0.1f, 0.2f, 0.3f, 0.4f),
-            Color(0.5f, 0.6f, 0.7f, 0.8f),
-            Color(0.55f, 0.65f, 0.75f, 0.85f)
-        )
-        assertEquals(
-            TargetState(
+        val value =
+            parseParametersToValue(
+                Color(0.1f, 0.2f, 0.3f, 0.4f),
                 Color(0.5f, 0.6f, 0.7f, 0.8f),
                 Color(0.55f, 0.65f, 0.75f, 0.85f)
-            ), value
+            )
+        assertEquals(
+            TargetState(Color(0.5f, 0.6f, 0.7f, 0.8f), Color(0.55f, 0.65f, 0.75f, 0.85f)),
+            value
         )
     }
 
     @Test
     fun colorIsParsedAsList() {
-        val value = parseParametersToValue(
-            Color(0.1f, 0.2f, 0.3f, 0.4f),
-            listOf(0.5f, 0.6f, 0.7f, 0.8f),
-            listOf(0.55f, 0.65f, 0.75f, 0.85f)
-        )
+        val value =
+            parseParametersToValue(
+                Color(0.1f, 0.2f, 0.3f, 0.4f),
+                listOf(0.5f, 0.6f, 0.7f, 0.8f),
+                listOf(0.55f, 0.65f, 0.75f, 0.85f)
+            )
         assertEquals(
-            TargetState(
-                Color(0.5f, 0.6f, 0.7f, 0.8f),
-                Color(0.55f, 0.65f, 0.75f, 0.85f)
-            ), value
+            TargetState(Color(0.5f, 0.6f, 0.7f, 0.8f), Color(0.55f, 0.65f, 0.75f, 0.85f)),
+            value
         )
     }
 }
diff --git a/compose/ui/ui-tooling/src/androidMain/kotlin/androidx/compose/ui/tooling/ComposeViewAdapter.android.kt b/compose/ui/ui-tooling/src/androidMain/kotlin/androidx/compose/ui/tooling/ComposeViewAdapter.android.kt
index 7149b0b..f0de4dd 100644
--- a/compose/ui/ui-tooling/src/androidMain/kotlin/androidx/compose/ui/tooling/ComposeViewAdapter.android.kt
+++ b/compose/ui/ui-tooling/src/androidMain/kotlin/androidx/compose/ui/tooling/ComposeViewAdapter.android.kt
@@ -80,8 +80,8 @@
 private val emptyContent: @Composable () -> Unit = @Composable {}
 
 /**
- * Class containing the minimum information needed by the Preview to map components to the
- * source code and render boundaries.
+ * Class containing the minimum information needed by the Preview to map components to the source
+ * code and render boundaries.
  */
 @OptIn(UiToolingDataApi::class)
 internal data class ViewInfo(
@@ -94,65 +94,56 @@
 ) {
     fun hasBounds(): Boolean = bounds.bottom != 0 && bounds.right != 0
 
-    fun allChildren(): List<ViewInfo> =
-        children + children.flatMap { it.allChildren() }
+    fun allChildren(): List<ViewInfo> = children + children.flatMap { it.allChildren() }
 
     override fun toString(): String =
         """($fileName:$lineNumber,
             |bounds=(top=${bounds.top}, left=${bounds.left},
             |location=${location?.let { "(${it.offset}L${it.length}" } ?: "<none>"}
             |bottom=${bounds.bottom}, right=${bounds.right}),
-            |childrenCount=${children.size})""".trimMargin()
+            |childrenCount=${children.size})"""
+            .trimMargin()
 }
 
 /**
- * View adapter that renders a `@Composable`. The `@Composable` is found by
- * reading the `tools:composableName` attribute that contains the FQN. Additional attributes can
- * be used to customize the behaviour of this view:
- *  - `tools:parameterProviderClass`: FQN of the [PreviewParameterProvider] to be instantiated by
- *  the [ComposeViewAdapter] that will be used as source for the `@Composable` parameters.
- *  - `tools:parameterProviderIndex`: The index within the [PreviewParameterProvider] of the
- *  value to be used in this particular instance.
- *  - `tools:paintBounds`: If true, the component boundaries will be painted. This is only meant
- *  for debugging purposes.
- *  - `tools:printViewInfos`: If true, the [ComposeViewAdapter] will log the tree of [ViewInfo]
- *  to logcat for debugging.
- *  - `tools:animationClockStartTime`: When set, a [PreviewAnimationClock] will control the
- *  animations in the [ComposeViewAdapter] context.
- *
+ * View adapter that renders a `@Composable`. The `@Composable` is found by reading the
+ * `tools:composableName` attribute that contains the FQN. Additional attributes can be used to
+ * customize the behaviour of this view:
+ * - `tools:parameterProviderClass`: FQN of the [PreviewParameterProvider] to be instantiated by the
+ *   [ComposeViewAdapter] that will be used as source for the `@Composable` parameters.
+ * - `tools:parameterProviderIndex`: The index within the [PreviewParameterProvider] of the value to
+ *   be used in this particular instance.
+ * - `tools:paintBounds`: If true, the component boundaries will be painted. This is only meant for
+ *   debugging purposes.
+ * - `tools:printViewInfos`: If true, the [ComposeViewAdapter] will log the tree of [ViewInfo] to
+ *   logcat for debugging.
+ * - `tools:animationClockStartTime`: When set, a [PreviewAnimationClock] will control the
+ *   animations in the [ComposeViewAdapter] context.
  */
 @Suppress("unused")
 @OptIn(UiToolingDataApi::class)
 internal class ComposeViewAdapter : FrameLayout {
     private val TAG = "ComposeViewAdapter"
 
-    /**
-     * [ComposeView] that will contain the [Composable] to preview.
-     */
+    /** [ComposeView] that will contain the [Composable] to preview. */
     private val composeView = ComposeView(context)
 
     /**
-     * When enabled, generate and cache [ViewInfo] tree that can be inspected by the Preview
-     * to map components to source code.
+     * When enabled, generate and cache [ViewInfo] tree that can be inspected by the Preview to map
+     * components to source code.
      */
     private var debugViewInfos = false
 
-    /**
-     * When enabled, paint the boundaries generated by layout nodes.
-     */
+    /** When enabled, paint the boundaries generated by layout nodes. */
     private var debugPaintBounds = false
     internal var viewInfos: List<ViewInfo> = emptyList()
     internal var designInfoList: List<String> = emptyList()
     private val slotTableRecord = CompositionDataRecord.create()
 
-    /**
-     * Simple function name of the Composable being previewed.
-     */
+    /** Simple function name of the Composable being previewed. */
     private var composableName = ""
 
-    /**
-     * Whether the current Composable has animations.
-     */
+    /** Whether the current Composable has animations. */
     private var hasAnimations = false
 
     /**
@@ -163,8 +154,8 @@
     private val delayedException = ThreadSafeException()
 
     /**
-     * The [Composable] to be rendered in the preview. It is initialized when this adapter
-     * is initialized.
+     * The [Composable] to be rendered in the preview. It is initialized when this adapter is
+     * initialized.
      */
     private var previewComposition: @Composable () -> Unit = {}
 
@@ -176,16 +167,15 @@
     private val content = mutableStateOf<@Composable () -> Unit>(emptyContent)
 
     /**
-     * When true, the composition will be immediately invalidated after being drawn. This will
-     * force it to be recomposed on the next render. This is useful for live literals so the
-     * whole composition happens again on the next render.
+     * When true, the composition will be immediately invalidated after being drawn. This will force
+     * it to be recomposed on the next render. This is useful for live literals so the whole
+     * composition happens again on the next render.
      */
     private var forceCompositionInvalidation = false
 
     /**
-     * When true, the adapter will try to look objects that support the call
-     * [DESIGN_INFO_METHOD] within the slot table and populate [designInfoList]. Used to
-     * support rendering in Studio.
+     * When true, the adapter will try to look objects that support the call [DESIGN_INFO_METHOD]
+     * within the slot table and populate [designInfoList]. Used to support rendering in Studio.
      */
     private var lookForDesignInfoProviders = false
 
@@ -196,18 +186,17 @@
      */
     private var designInfoProvidersArgument: String = ""
 
-    /**
-     * Callback invoked when onDraw has been called.
-     */
+    /** Callback invoked when onDraw has been called. */
     private var onDraw = {}
 
     internal var stitchTrees = true
 
-    private val debugBoundsPaint = Paint().apply {
-        pathEffect = DashPathEffect(floatArrayOf(5f, 10f, 15f, 20f), 0f)
-        style = Paint.Style.STROKE
-        color = Color.Red.toArgb()
-    }
+    private val debugBoundsPaint =
+        Paint().apply {
+            pathEffect = DashPathEffect(floatArrayOf(5f, 10f, 15f, 20f), 0f)
+            style = Paint.Style.STROKE
+            color = Color.Red.toArgb()
+        }
 
     private var composition: Composition? = null
 
@@ -215,11 +204,11 @@
         init(attrs)
     }
 
-    constructor(context: Context, attrs: AttributeSet, defStyleAttr: Int) : super(
-        context,
-        attrs,
-        defStyleAttr
-    ) {
+    constructor(
+        context: Context,
+        attrs: AttributeSet,
+        defStyleAttr: Int
+    ) : super(context, attrs, defStyleAttr) {
         init(attrs)
     }
 
@@ -229,15 +218,10 @@
     private val Group.lineNumber: Int
         get() = location?.lineNumber ?: -1
 
-    /**
-     * Returns true if this [Group] has no source position information
-     */
-    private fun Group.hasNullSourcePosition(): Boolean =
-        fileName.isEmpty() && lineNumber == -1
+    /** Returns true if this [Group] has no source position information */
+    private fun Group.hasNullSourcePosition(): Boolean = fileName.isEmpty() && lineNumber == -1
 
-    /**
-     * Returns true if this [Group] has no source position information and no children
-     */
+    /** Returns true if this [Group] has no source position information and no children */
     private fun Group.isNullGroup(): Boolean =
         hasNullSourcePosition() &&
             children.isEmpty() &&
@@ -246,16 +230,12 @@
     private fun Group.toViewInfo(): ViewInfo {
         val layoutInfo = ((this as? NodeGroup)?.node as? LayoutInfo)
 
-        if (children.size == 1 &&
-            hasNullSourcePosition() &&
-            layoutInfo == null) {
+        if (children.size == 1 && hasNullSourcePosition() && layoutInfo == null) {
             // There is no useful information in this intermediate node, remove.
             return children.single().toViewInfo()
         }
 
-        val childrenViewInfo = children
-            .filter { !it.isNullGroup() }
-            .map { it.toViewInfo() }
+        val childrenViewInfo = children.filter { !it.isNullGroup() }.map { it.toViewInfo() }
 
         // TODO: Use group names instead of indexing once it's supported
         return ViewInfo(
@@ -268,18 +248,11 @@
         )
     }
 
-    /**
-     * Processes the recorded slot table and re-generates the [viewInfos] attribute.
-     */
+    /** Processes the recorded slot table and re-generates the [viewInfos] attribute. */
     private fun processViewInfos() {
-        val newViewInfos = slotTableRecord
-            .store
-            .map { it.asTree().toViewInfo() }
-            .toList()
+        val newViewInfos = slotTableRecord.store.map { it.asTree().toViewInfo() }.toList()
 
-        viewInfos = if (stitchTrees)
-            stitchTrees(newViewInfos)
-        else newViewInfos
+        viewInfos = if (stitchTrees) stitchTrees(newViewInfos) else newViewInfos
 
         if (debugViewInfos) {
             val debugString = viewInfos.toDebugString()
@@ -309,8 +282,8 @@
     }
 
     /**
-     * Finds all animations defined in the Compose tree where the root is the
-     * `@Composable` being previewed.
+     * Finds all animations defined in the Compose tree where the root is the `@Composable` being
+     * previewed.
      */
     private fun findAndTrackAnimations() {
         val slotTrees = slotTableRecord.store.map { it.asTree() }
@@ -330,17 +303,23 @@
     private fun findDesignInfoProviders() {
         val slotTrees = slotTableRecord.store.map { it.asTree() }
 
-        designInfoList = slotTrees.flatMap { rootGroup ->
-            rootGroup.findAll { group ->
-                (group.name != REMEMBER && group.hasDesignInfo()) || group.children.any { child ->
-                    child.name == REMEMBER && child.hasDesignInfo()
-                }
-            }.mapNotNull { group ->
-                // Get the DesignInfoProviders from the group or one of its children
-                group.getDesignInfoOrNull(group.box)
-                    ?: group.children.firstNotNullOfOrNull { it.getDesignInfoOrNull(group.box) }
+        designInfoList =
+            slotTrees.flatMap { rootGroup ->
+                rootGroup
+                    .findAll { group ->
+                        (group.name != REMEMBER && group.hasDesignInfo()) ||
+                            group.children.any { child ->
+                                child.name == REMEMBER && child.hasDesignInfo()
+                            }
+                    }
+                    .mapNotNull { group ->
+                        // Get the DesignInfoProviders from the group or one of its children
+                        group.getDesignInfoOrNull(group.box)
+                            ?: group.children.firstNotNullOfOrNull {
+                                it.getDesignInfoOrNull(group.box)
+                            }
+                    }
             }
-        }
     }
 
     private fun Group.hasDesignInfo(): Boolean =
@@ -350,9 +329,9 @@
         data.firstNotNullOfOrNull { it?.invokeGetDesignInfo(box.left, box.right) }
 
     /**
-     * Check if the object supports the method call for [DESIGN_INFO_METHOD], which is expected
-     * to take two Integer arguments for coordinates and a String for additional encoded
-     * arguments that may be provided from Studio.
+     * Check if the object supports the method call for [DESIGN_INFO_METHOD], which is expected to
+     * take two Integer arguments for coordinates and a String for additional encoded arguments that
+     * may be provided from Studio.
      */
     private fun Any.getDesignInfoMethodOrNull(): Method? {
         return try {
@@ -372,12 +351,7 @@
         return this.getDesignInfoMethodOrNull()?.let { designInfoMethod ->
             try {
                 // Workaround for unchecked Method.invoke
-                val result = designInfoMethod.invoke(
-                    this,
-                    x,
-                    y,
-                    designInfoProvidersArgument
-                )
+                val result = designInfoMethod.invoke(this, x, y, designInfoProvidersArgument)
                 (result as String).ifEmpty { null }
             } catch (e: Exception) {
                 null
@@ -408,27 +382,23 @@
             .forEach {
                 if (it.hasBounds()) {
                     canvas.apply {
-                        val pxBounds = android.graphics.Rect(
-                            it.bounds.left,
-                            it.bounds.top,
-                            it.bounds.right,
-                            it.bounds.bottom
-                        )
+                        val pxBounds =
+                            android.graphics.Rect(
+                                it.bounds.left,
+                                it.bounds.top,
+                                it.bounds.right,
+                                it.bounds.bottom
+                            )
                         drawRect(pxBounds, debugBoundsPaint)
                     }
                 }
             }
     }
 
-    /**
-     * Clock that controls the animations defined in the context of this [ComposeViewAdapter].
-     */
-    @VisibleForTesting
-    internal lateinit var clock: PreviewAnimationClock
+    /** Clock that controls the animations defined in the context of this [ComposeViewAdapter]. */
+    @VisibleForTesting internal lateinit var clock: PreviewAnimationClock
 
-    /**
-     * Wraps a given [Preview] method an does any necessary setup.
-     */
+    /** Wraps a given [Preview] method an does any necessary setup. */
     @Composable
     private fun WrapPreview(content: @Composable () -> Unit) {
         // We need to replace the FontResourceLoader to avoid using ResourcesCompat.
@@ -447,22 +417,23 @@
 
     /**
      * Initializes the adapter and populates it with the given [Preview] composable.
+     *
      * @param className name of the class containing the preview function
      * @param methodName `@Preview` method name
-     * @param parameterProvider [Class] for the [PreviewParameterProvider] to be used as
-     * parameter input for this call. If null, no parameters will be passed to the composable.
-     * @param parameterProviderIndex when [parameterProvider] is not null, this index will
-     * reference the element in the [Sequence] to be used as parameter.
+     * @param parameterProvider [Class] for the [PreviewParameterProvider] to be used as parameter
+     *   input for this call. If null, no parameters will be passed to the composable.
+     * @param parameterProviderIndex when [parameterProvider] is not null, this index will reference
+     *   the element in the [Sequence] to be used as parameter.
      * @param debugPaintBounds if true, the view will paint the boundaries around the layout
-     * elements.
+     *   elements.
      * @param debugViewInfos if true, it will generate the [ViewInfo] structures and will log it.
      * @param animationClockStartTime if positive, [clock] will be defined and will control the
-     * animations defined in the context of the `@Composable` being previewed.
+     *   animations defined in the context of the `@Composable` being previewed.
      * @param forceCompositionInvalidation if true, the composition will be invalidated on every
-     * draw, forcing it to recompose on next render.
+     *   draw, forcing it to recompose on next render.
      * @param lookForDesignInfoProviders if true, it will try to populate [designInfoList].
      * @param designInfoProvidersArgument String to use as an argument when populating
-     * [designInfoList].
+     *   [designInfoList].
      * @param onCommit callback invoked after every commit of the preview composable.
      * @param onDraw callback invoked after every draw of the adapter. Only for test use.
      */
@@ -491,61 +462,68 @@
         this.designInfoProvidersArgument = designInfoProvidersArgument ?: ""
         this.onDraw = onDraw
 
-        previewComposition = @Composable {
-            SideEffect(onCommit)
+        previewComposition =
+            @Composable {
+                SideEffect(onCommit)
 
-            WrapPreview {
-                val composer = currentComposer
-                // We need to delay the reflection instantiation of the class until we are in the
-                // composable to ensure all the right initialization has happened and the Composable
-                // class loads correctly.
-                val composable = {
-                    try {
-                        ComposableInvoker.invokeComposable(
-                            className,
-                            methodName,
-                            composer,
-                            *getPreviewProviderParameters(parameterProvider, parameterProviderIndex)
-                        )
-                    } catch (t: Throwable) {
-                        // If there is an exception, store it for later but do not catch it so
-                        // compose can handle it and dispose correctly.
-                        var exception: Throwable = t
-                        // Find the root cause and use that for the delayedException.
-                        while (exception is ReflectiveOperationException) {
-                            exception = exception.cause ?: break
+                WrapPreview {
+                    val composer = currentComposer
+                    // We need to delay the reflection instantiation of the class until we are in
+                    // the
+                    // composable to ensure all the right initialization has happened and the
+                    // Composable
+                    // class loads correctly.
+                    val composable = {
+                        try {
+                            ComposableInvoker.invokeComposable(
+                                className,
+                                methodName,
+                                composer,
+                                *getPreviewProviderParameters(
+                                    parameterProvider,
+                                    parameterProviderIndex
+                                )
+                            )
+                        } catch (t: Throwable) {
+                            // If there is an exception, store it for later but do not catch it so
+                            // compose can handle it and dispose correctly.
+                            var exception: Throwable = t
+                            // Find the root cause and use that for the delayedException.
+                            while (exception is ReflectiveOperationException) {
+                                exception = exception.cause ?: break
+                            }
+                            delayedException.set(exception)
+                            throw t
                         }
-                        delayedException.set(exception)
-                        throw t
                     }
-                }
-                if (animationClockStartTime >= 0) {
-                    // When animation inspection is enabled, i.e. when a valid (non-negative)
-                    // `animationClockStartTime` is passed, set the Preview Animation Clock. This
-                    // clock will control the animations defined in this `ComposeViewAdapter`
-                    // from Android Studio.
-                    clock = PreviewAnimationClock {
-                        // Invalidate the descendants of this ComposeViewAdapter's only grandchild
-                        // (an AndroidOwner) when setting the clock time to make sure the Compose
-                        // Preview will animate when the states are read inside the draw scope.
-                        val composeView = getChildAt(0) as ComposeView
-                        (composeView.getChildAt(0) as? ViewRootForTest)
-                            ?.invalidateDescendants()
-                        // Send pending apply notifications to ensure the animation duration will
-                        // be read in the correct frame.
-                        Snapshot.sendApplyNotifications()
+                    if (animationClockStartTime >= 0) {
+                        // When animation inspection is enabled, i.e. when a valid (non-negative)
+                        // `animationClockStartTime` is passed, set the Preview Animation Clock.
+                        // This
+                        // clock will control the animations defined in this `ComposeViewAdapter`
+                        // from Android Studio.
+                        clock = PreviewAnimationClock {
+                            // Invalidate the descendants of this ComposeViewAdapter's only
+                            // grandchild
+                            // (an AndroidOwner) when setting the clock time to make sure the
+                            // Compose
+                            // Preview will animate when the states are read inside the draw scope.
+                            val composeView = getChildAt(0) as ComposeView
+                            (composeView.getChildAt(0) as? ViewRootForTest)?.invalidateDescendants()
+                            // Send pending apply notifications to ensure the animation duration
+                            // will
+                            // be read in the correct frame.
+                            Snapshot.sendApplyNotifications()
+                        }
                     }
+                    composable()
                 }
-                composable()
             }
-        }
         composeView.setContent(previewComposition)
         invalidate()
     }
 
-    /**
-     * Disposes the Compose elements allocated during [init]
-     */
+    /** Disposes the Compose elements allocated during [init] */
     internal fun dispose() {
         composeView.disposeComposition()
         if (::clock.isInitialized) {
@@ -556,11 +534,11 @@
     }
 
     /**
-     *  Returns whether this `@Composable` has animations. This allows Android Studio to decide if
-     *  the Animation Inspector icon should be displayed for this preview. The reason for using a
-     *  method instead of the property directly is we use Java reflection to call it from Android
-     *  Studio, and to find the property we'd need to filter the method names using `contains`
-     *  instead of `equals`.
+     * Returns whether this `@Composable` has animations. This allows Android Studio to decide if
+     * the Animation Inspector icon should be displayed for this preview. The reason for using a
+     * method instead of the property directly is we use Java reflection to call it from Android
+     * Studio, and to find the property we'd need to filter the method names using `contains`
+     * instead of `equals`.
      */
     fun hasAnimations() = hasAnimations
 
@@ -574,94 +552,90 @@
         val composableName = attrs.getAttributeValue(TOOLS_NS_URI, "composableName") ?: return
         val className = composableName.substringBeforeLast('.')
         val methodName = composableName.substringAfterLast('.')
-        val parameterProviderIndex = attrs.getAttributeIntValue(
-            TOOLS_NS_URI,
-            "parameterProviderIndex", 0
-        )
-        val parameterProviderClass = attrs.getAttributeValue(TOOLS_NS_URI, "parameterProviderClass")
-            ?.asPreviewProviderClass()
+        val parameterProviderIndex =
+            attrs.getAttributeIntValue(TOOLS_NS_URI, "parameterProviderIndex", 0)
+        val parameterProviderClass =
+            attrs
+                .getAttributeValue(TOOLS_NS_URI, "parameterProviderClass")
+                ?.asPreviewProviderClass()
 
-        val animationClockStartTime = try {
-            attrs.getAttributeValue(TOOLS_NS_URI, "animationClockStartTime").toLong()
-        } catch (e: Exception) {
-            -1L
-        }
+        val animationClockStartTime =
+            try {
+                attrs.getAttributeValue(TOOLS_NS_URI, "animationClockStartTime").toLong()
+            } catch (e: Exception) {
+                -1L
+            }
 
-        val forceCompositionInvalidation = attrs.getAttributeBooleanValue(
-            TOOLS_NS_URI,
-            "forceCompositionInvalidation", false
-        )
+        val forceCompositionInvalidation =
+            attrs.getAttributeBooleanValue(TOOLS_NS_URI, "forceCompositionInvalidation", false)
 
         init(
             className = className,
             methodName = methodName,
             parameterProvider = parameterProviderClass,
             parameterProviderIndex = parameterProviderIndex,
-            debugPaintBounds = attrs.getAttributeBooleanValue(
-                TOOLS_NS_URI,
-                "paintBounds",
-                debugPaintBounds
-            ),
-            debugViewInfos = attrs.getAttributeBooleanValue(
-                TOOLS_NS_URI,
-                "printViewInfos",
-                debugViewInfos
-            ),
+            debugPaintBounds =
+                attrs.getAttributeBooleanValue(TOOLS_NS_URI, "paintBounds", debugPaintBounds),
+            debugViewInfos =
+                attrs.getAttributeBooleanValue(TOOLS_NS_URI, "printViewInfos", debugViewInfos),
             animationClockStartTime = animationClockStartTime,
             forceCompositionInvalidation = forceCompositionInvalidation,
-            lookForDesignInfoProviders = attrs.getAttributeBooleanValue(
-                TOOLS_NS_URI,
-                "findDesignInfoProviders",
-                lookForDesignInfoProviders
-            ),
-            designInfoProvidersArgument = attrs.getAttributeValue(
-                TOOLS_NS_URI,
-                "designInfoProvidersArgument"
-            )
+            lookForDesignInfoProviders =
+                attrs.getAttributeBooleanValue(
+                    TOOLS_NS_URI,
+                    "findDesignInfoProviders",
+                    lookForDesignInfoProviders
+                ),
+            designInfoProvidersArgument =
+                attrs.getAttributeValue(TOOLS_NS_URI, "designInfoProvidersArgument")
         )
     }
 
     @SuppressLint("VisibleForTests")
-    private val FakeSavedStateRegistryOwner = object : SavedStateRegistryOwner {
-        val lifecycleRegistry = LifecycleRegistry.createUnsafe(this)
-        private val controller = SavedStateRegistryController.create(this).apply {
-            performRestore(Bundle())
-        }
+    private val FakeSavedStateRegistryOwner =
+        object : SavedStateRegistryOwner {
+            val lifecycleRegistry = LifecycleRegistry.createUnsafe(this)
+            private val controller =
+                SavedStateRegistryController.create(this).apply { performRestore(Bundle()) }
 
-        init {
-            lifecycleRegistry.currentState = Lifecycle.State.RESUMED
-        }
-
-        override val savedStateRegistry: SavedStateRegistry
-            get() = controller.savedStateRegistry
-
-        override val lifecycle: LifecycleRegistry
-            get() = lifecycleRegistry
-    }
-
-    private val FakeViewModelStoreOwner = object : ViewModelStoreOwner {
-        private val vmStore = ViewModelStore()
-
-        override val viewModelStore = vmStore
-    }
-
-    private val FakeOnBackPressedDispatcherOwner = object : OnBackPressedDispatcherOwner {
-        override val onBackPressedDispatcher = OnBackPressedDispatcher()
-
-        override val lifecycle: LifecycleRegistry
-            get() = FakeSavedStateRegistryOwner.lifecycleRegistry
-    }
-
-    private val FakeActivityResultRegistryOwner = object : ActivityResultRegistryOwner {
-        override val activityResultRegistry = object : ActivityResultRegistry() {
-            override fun <I : Any?, O : Any?> onLaunch(
-                requestCode: Int,
-                contract: ActivityResultContract<I, O>,
-                input: I,
-                options: ActivityOptionsCompat?
-            ) {
-                throw IllegalStateException("Calling launch() is not supported in Preview")
+            init {
+                lifecycleRegistry.currentState = Lifecycle.State.RESUMED
             }
+
+            override val savedStateRegistry: SavedStateRegistry
+                get() = controller.savedStateRegistry
+
+            override val lifecycle: LifecycleRegistry
+                get() = lifecycleRegistry
         }
-    }
+
+    private val FakeViewModelStoreOwner =
+        object : ViewModelStoreOwner {
+            private val vmStore = ViewModelStore()
+
+            override val viewModelStore = vmStore
+        }
+
+    private val FakeOnBackPressedDispatcherOwner =
+        object : OnBackPressedDispatcherOwner {
+            override val onBackPressedDispatcher = OnBackPressedDispatcher()
+
+            override val lifecycle: LifecycleRegistry
+                get() = FakeSavedStateRegistryOwner.lifecycleRegistry
+        }
+
+    private val FakeActivityResultRegistryOwner =
+        object : ActivityResultRegistryOwner {
+            override val activityResultRegistry =
+                object : ActivityResultRegistry() {
+                    override fun <I : Any?, O : Any?> onLaunch(
+                        requestCode: Int,
+                        contract: ActivityResultContract<I, O>,
+                        input: I,
+                        options: ActivityOptionsCompat?
+                    ) {
+                        throw IllegalStateException("Calling launch() is not supported in Preview")
+                    }
+                }
+        }
 }
diff --git a/compose/ui/ui-tooling/src/androidMain/kotlin/androidx/compose/ui/tooling/Inspectable.android.kt b/compose/ui/ui-tooling/src/androidMain/kotlin/androidx/compose/ui/tooling/Inspectable.android.kt
index 61b18be..07a93fc 100644
--- a/compose/ui/ui-tooling/src/androidMain/kotlin/androidx/compose/ui/tooling/Inspectable.android.kt
+++ b/compose/ui/ui-tooling/src/androidMain/kotlin/androidx/compose/ui/tooling/Inspectable.android.kt
@@ -27,9 +27,7 @@
 import java.util.Collections
 import java.util.WeakHashMap
 
-/**
- * Storage for the preview generated [CompositionData]s.
- */
+/** Storage for the preview generated [CompositionData]s. */
 internal interface CompositionDataRecord {
     val store: Set<CompositionData>
 
@@ -39,8 +37,7 @@
 }
 
 private class CompositionDataRecordImpl : CompositionDataRecord {
-    override val store: MutableSet<CompositionData> =
-        Collections.newSetFromMap(WeakHashMap())
+    override val store: MutableSet<CompositionData> = Collections.newSetFromMap(WeakHashMap())
 }
 
 /**
@@ -48,7 +45,7 @@
  * is in inspection mode.
  *
  * @param compositionDataRecord [CompositionDataRecord] to record the SlotTable used in the
- * composition of [content]
+ *   composition of [content]
  */
 @Composable
 internal fun Inspectable(
diff --git a/compose/ui/ui-tooling/src/androidMain/kotlin/androidx/compose/ui/tooling/LayoutlibFontResourceLoader.android.kt b/compose/ui/ui-tooling/src/androidMain/kotlin/androidx/compose/ui/tooling/LayoutlibFontResourceLoader.android.kt
index 0f33184..88c9972 100644
--- a/compose/ui/ui-tooling/src/androidMain/kotlin/androidx/compose/ui/tooling/LayoutlibFontResourceLoader.android.kt
+++ b/compose/ui/ui-tooling/src/androidMain/kotlin/androidx/compose/ui/tooling/LayoutlibFontResourceLoader.android.kt
@@ -24,9 +24,7 @@
 import androidx.compose.ui.text.font.Font
 import androidx.compose.ui.text.font.ResourceFont
 
-/**
- * Layoutlib implementation for [Font.ResourceLoader]
- */
+/** Layoutlib implementation for [Font.ResourceLoader] */
 @Suppress("DEPRECATION")
 internal class LayoutlibFontResourceLoader(private val context: Context) : Font.ResourceLoader {
     @Deprecated(
diff --git a/compose/ui/ui-tooling/src/androidMain/kotlin/androidx/compose/ui/tooling/PreviewActivity.android.kt b/compose/ui/ui-tooling/src/androidMain/kotlin/androidx/compose/ui/tooling/PreviewActivity.android.kt
index b55bb40..e902cd0 100644
--- a/compose/ui/ui-tooling/src/androidMain/kotlin/androidx/compose/ui/tooling/PreviewActivity.android.kt
+++ b/compose/ui/ui-tooling/src/androidMain/kotlin/androidx/compose/ui/tooling/PreviewActivity.android.kt
@@ -39,11 +39,10 @@
  * default values and/or *one* parameter annotated with `@PreviewParameter`.
  *
  * The `@Composable` fully qualified name must be passed to this Activity through intent parameters,
- * using `composable` as the key. When deploying Compose Previews with `@PreviewParameter`
- * annotated parameters, the provider should be specified as an intent parameter as well, using
- * the key `parameterProviderClassName`. Optionally, `parameterProviderIndex` can also be set to
- * display a specific provider value instead of all of them.
- *
+ * using `composable` as the key. When deploying Compose Previews with `@PreviewParameter` annotated
+ * parameters, the provider should be specified as an intent parameter as well, using the key
+ * `parameterProviderClassName`. Optionally, `parameterProviderIndex` can also be set to display a
+ * specific provider value instead of all of them.
  */
 @Suppress("ForbiddenSuperClass")
 class PreviewActivity : ComponentActivity() {
@@ -73,13 +72,7 @@
             return@setComposableContent
         }
         Log.d(TAG, "Previewing '$methodName' without a parameter provider.")
-        setContent {
-            ComposableInvoker.invokeComposable(
-                className,
-                methodName,
-                currentComposer
-            )
-        }
+        setContent { ComposableInvoker.invokeComposable(className, methodName, currentComposer) }
     }
 
     /**
@@ -97,10 +90,11 @@
         parameterProvider: String
     ) {
         Log.d(TAG, "Previewing '$methodName' with parameter provider: '$parameterProvider'")
-        val previewParameters = getPreviewProviderParameters(
-            parameterProvider.asPreviewProviderClass(),
-            intent.getIntExtra("parameterProviderIndex", -1)
-        )
+        val previewParameters =
+            getPreviewProviderParameters(
+                parameterProvider.asPreviewProviderClass(),
+                intent.getIntExtra("parameterProviderIndex", -1)
+            )
 
         // Handle the case where parameterProviderIndex is not provided. In this case, instead of
         // showing an arbitrary value (e.g. the first one), we display a FAB that can be used to
diff --git a/compose/ui/ui-tooling/src/androidMain/kotlin/androidx/compose/ui/tooling/PreviewUtils.android.kt b/compose/ui/ui-tooling/src/androidMain/kotlin/androidx/compose/ui/tooling/PreviewUtils.android.kt
index c402e02..958368d 100644
--- a/compose/ui/ui-tooling/src/androidMain/kotlin/androidx/compose/ui/tooling/PreviewUtils.android.kt
+++ b/compose/ui/ui-tooling/src/androidMain/kotlin/androidx/compose/ui/tooling/PreviewUtils.android.kt
@@ -20,9 +20,7 @@
 import androidx.compose.ui.tooling.data.UiToolingDataApi
 import androidx.compose.ui.tooling.preview.PreviewParameterProvider
 
-/**
- * Tries to find the [Class] of the [PreviewParameterProvider] corresponding to the given FQN.
- */
+/** Tries to find the [Class] of the [PreviewParameterProvider] corresponding to the given FQN. */
 internal fun String.asPreviewProviderClass(): Class<out PreviewParameterProvider<*>>? {
     try {
         @Suppress("UNCHECKED_CAST")
@@ -34,11 +32,11 @@
 }
 
 /**
- * Returns an array with some values of a [PreviewParameterProvider]. If the given provider class
- * is `null`, returns an empty array. Otherwise, if the given `parameterProviderIndex` is a valid
- * index, returns a single-element array containing the value corresponding to that particular
- * index in the provider's sequence. Finally, returns an array with all the values of the
- * provider's sequence if `parameterProviderIndex` is invalid, e.g. negative.
+ * Returns an array with some values of a [PreviewParameterProvider]. If the given provider class is
+ * `null`, returns an empty array. Otherwise, if the given `parameterProviderIndex` is a valid
+ * index, returns a single-element array containing the value corresponding to that particular index
+ * in the provider's sequence. Finally, returns an array with all the values of the provider's
+ * sequence if `parameterProviderIndex` is invalid, e.g. negative.
  */
 internal fun getPreviewProviderParameters(
     parameterProviderClass: Class<out PreviewParameterProvider<*>>?,
@@ -46,15 +44,13 @@
 ): Array<Any?> {
     if (parameterProviderClass != null) {
         try {
-            val constructor = parameterProviderClass.constructors
-                .singleOrNull { it.parameterTypes.isEmpty() }
-                ?.apply {
-                    isAccessible = true
-                }
-                ?: throw IllegalArgumentException(
-                    "PreviewParameterProvider constructor can not" +
-                        " have parameters"
-                )
+            val constructor =
+                parameterProviderClass.constructors
+                    .singleOrNull { it.parameterTypes.isEmpty() }
+                    ?.apply { isAccessible = true }
+                    ?: throw IllegalArgumentException(
+                        "PreviewParameterProvider constructor can not" + " have parameters"
+                    )
             val params = constructor.newInstance() as PreviewParameterProvider<*>
             if (parameterProviderIndex < 0) {
                 return params.values.toArray(params.count)
@@ -78,9 +74,8 @@
 }
 
 /**
- * Checks if the object is of inlined value type.
- * If yes, unwraps and returns the packed value
- * If not, returns the object as it is
+ * Checks if the object is of inlined value type. If yes, unwraps and returns the packed value If
+ * not, returns the object as it is
  */
 private fun unwrapIfInline(classToCheck: Any?): Any? {
     // At the moment is not possible to use classToCheck::class.isValue, even if it works when
@@ -89,10 +84,11 @@
     // see also https://kotlinlang.org/docs/inline-classes.html
     if (classToCheck != null && classToCheck::class.java.annotations.any { it is JvmInline }) {
         // The first primitive declared field in the class is the value wrapped
-        val fieldName: String = classToCheck::class.java.declaredFields
-            .first { it.type.isPrimitive }
-            .name
-        return classToCheck::class.java.getDeclaredField(fieldName)
+        val fieldName: String =
+            classToCheck::class.java.declaredFields.first { it.type.isPrimitive }.name
+        return classToCheck::class
+            .java
+            .getDeclaredField(fieldName)
             .also { it.isAccessible = true }
             .get(classToCheck)
     }
@@ -110,9 +106,9 @@
 }
 
 /**
- * Search [Group]s that match a given [predicate], starting from a given [root]. An optional
- * boolean parameter can be set if we're interested in a single occurrence. If it's set, we
- * return early after finding the first matching [Group].
+ * Search [Group]s that match a given [predicate], starting from a given [root]. An optional boolean
+ * parameter can be set if we're interested in a single occurrence. If it's set, we return early
+ * after finding the first matching [Group].
  */
 @OptIn(UiToolingDataApi::class)
 private fun findGroupsThatMatchPredicate(
@@ -140,21 +136,15 @@
     return Array(size) { iterator.next() }
 }
 
-/**
- * A simple wrapper to store and throw exception later in a thread-safe way.
- */
+/** A simple wrapper to store and throw exception later in a thread-safe way. */
 internal class ThreadSafeException {
     private var exception: Throwable? = null
 
-    /**
-     * A lock to take to access exception.
-     */
+    /** A lock to take to access exception. */
     private val lock = Any()
 
     fun set(throwable: Throwable) {
-        synchronized(lock) {
-            exception = throwable
-        }
+        synchronized(lock) { exception = throwable }
     }
 
     fun throwIfPresent() {
diff --git a/compose/ui/ui-tooling/src/androidMain/kotlin/androidx/compose/ui/tooling/ShadowViewInfo.android.kt b/compose/ui/ui-tooling/src/androidMain/kotlin/androidx/compose/ui/tooling/ShadowViewInfo.android.kt
index 9d7614d..825b358 100644
--- a/compose/ui/ui-tooling/src/androidMain/kotlin/androidx/compose/ui/tooling/ShadowViewInfo.android.kt
+++ b/compose/ui/ui-tooling/src/androidMain/kotlin/androidx/compose/ui/tooling/ShadowViewInfo.android.kt
@@ -24,10 +24,8 @@
  * composition roots to the right tree.
  */
 @OptIn(UiToolingDataApi::class)
-private class ShadowViewInfo private constructor(
-    var parent: ShadowViewInfo?,
-    private val viewInfo: ViewInfo
-) {
+private class ShadowViewInfo
+private constructor(var parent: ShadowViewInfo?, private val viewInfo: ViewInfo) {
 
     /** Constructor for root ShadowViewInfo nodes */
     constructor(viewInfo: ViewInfo) : this(null, viewInfo)
@@ -52,20 +50,17 @@
         this.parent = parent
     }
 
-    fun findRoot(): ShadowViewInfo =
-        if (this.parent == null)
-            this
-        else
-            this.parent!!.findRoot()
+    fun findRoot(): ShadowViewInfo = if (this.parent == null) this else this.parent!!.findRoot()
 
-    fun toViewInfo(): ViewInfo = ViewInfo(
-        viewInfo.fileName,
-        viewInfo.lineNumber,
-        viewInfo.bounds,
-        viewInfo.location,
-        _children.map { it.toViewInfo() },
-        viewInfo.layoutInfo
-    )
+    fun toViewInfo(): ViewInfo =
+        ViewInfo(
+            viewInfo.fileName,
+            viewInfo.lineNumber,
+            viewInfo.bounds,
+            viewInfo.location,
+            _children.map { it.toViewInfo() },
+            viewInfo.layoutInfo
+        )
 }
 
 /**
@@ -81,40 +76,39 @@
 
     // Create an index of all the nodes indexed by their layoutInfo so we can quickly lookup
     // the ShadowNode based on its LayoutInfo
-    val shadowNodesWithLayoutInfo = shadowTreeRoots
-        .flatMap { it.allNodes }
-        .map { it.layoutInfo to it }
-        .filter { it.first != null }
-        .groupBy { it.first }
+    val shadowNodesWithLayoutInfo =
+        shadowTreeRoots
+            .flatMap { it.allNodes }
+            .map { it.layoutInfo to it }
+            .filter { it.first != null }
+            .groupBy { it.first }
 
     val currentRoots = LinkedHashSet(shadowTreeRoots)
 
     // Now, for each root, see if it can be attached to any other tree.
-    shadowTreeRoots
-        .forEach { rootToAttach ->
-            rootToAttach
-                // For the root we are trying to find, if it belongs somewhere else, get all
-                // nodes and see if any has a LayoutInfo parent information that matches the
-                // LayoutInfo in a separate tree.
-                .allNodes
-                .flatMap { candidate ->
-                    shadowNodesWithLayoutInfo[candidate.layoutInfo?.parentInfo] ?: emptyList()
-                }
-                .filter {
-                    // Ensure that the node we have found is in a different root
-                    it.second.findRoot() != rootToAttach
-                }
-                .map { (_, candidateNode) -> candidateNode }
-                .firstOrNull()?.let { nodeToAttachTo ->
-                    // We found it, re-attach to the candidate node
-                    rootToAttach.setNewParent(nodeToAttachTo)
-                    currentRoots.remove(rootToAttach)
-                }
-        }
-
-    val newTree = currentRoots.map {
-        it.toViewInfo()
+    shadowTreeRoots.forEach { rootToAttach ->
+        rootToAttach
+            // For the root we are trying to find, if it belongs somewhere else, get all
+            // nodes and see if any has a LayoutInfo parent information that matches the
+            // LayoutInfo in a separate tree.
+            .allNodes
+            .flatMap { candidate ->
+                shadowNodesWithLayoutInfo[candidate.layoutInfo?.parentInfo] ?: emptyList()
+            }
+            .filter {
+                // Ensure that the node we have found is in a different root
+                it.second.findRoot() != rootToAttach
+            }
+            .map { (_, candidateNode) -> candidateNode }
+            .firstOrNull()
+            ?.let { nodeToAttachTo ->
+                // We found it, re-attach to the candidate node
+                rootToAttach.setNewParent(nodeToAttachTo)
+                currentRoots.remove(rootToAttach)
+            }
     }
 
+    val newTree = currentRoots.map { it.toViewInfo() }
+
     return newTree
 }
diff --git a/compose/ui/ui-tooling/src/androidMain/kotlin/androidx/compose/ui/tooling/ViewInfoUtil.android.kt b/compose/ui/ui-tooling/src/androidMain/kotlin/androidx/compose/ui/tooling/ViewInfoUtil.android.kt
index 0240056..47d87fd 100644
--- a/compose/ui/ui-tooling/src/androidMain/kotlin/androidx/compose/ui/tooling/ViewInfoUtil.android.kt
+++ b/compose/ui/ui-tooling/src/androidMain/kotlin/androidx/compose/ui/tooling/ViewInfoUtil.android.kt
@@ -20,38 +20,29 @@
 import androidx.compose.ui.unit.IntRect
 
 @OptIn(UiToolingDataApi::class)
-private fun List<ViewInfo>.filterTree(
-    filter: (ViewInfo) -> Boolean = { true }
-): List<ViewInfo> =
-        flatMap {
-            val acceptedNodes =
-                it.children.filterTree(filter).flatMap { child ->
-                    if (child.location == null)
-                        child.children
-                    else listOf(child)
-                }
+private fun List<ViewInfo>.filterTree(filter: (ViewInfo) -> Boolean = { true }): List<ViewInfo> =
+    flatMap {
+        val acceptedNodes =
+            it.children.filterTree(filter).flatMap { child ->
+                if (child.location == null) child.children else listOf(child)
+            }
 
-            if (filter(it)) {
-                listOf(ViewInfo(
+        if (filter(it)) {
+            listOf(
+                ViewInfo(
                     it.fileName,
                     it.lineNumber,
                     it.bounds,
                     it.location,
                     acceptedNodes,
                     it.layoutInfo
-                ))
-            } else {
-                // Create a fake node to attach the children to
-                listOf(ViewInfo(
-                    "<root>",
-                    -1,
-                    IntRect.Zero,
-                    null,
-                    acceptedNodes,
-                    null
-                ))
-            }
+                )
+            )
+        } else {
+            // Create a fake node to attach the children to
+            listOf(ViewInfo("<root>", -1, IntRect.Zero, null, acceptedNodes, null))
         }
+    }
 
 @OptIn(UiToolingDataApi::class)
 internal fun List<ViewInfo>.toDebugString(
@@ -66,11 +57,9 @@
         .forEach {
             if (it.location != null)
                 builder.appendLine("$indentString|${it.fileName}:${it.lineNumber}")
-            else
-                builder.appendLine("$indentString|<root>")
+            else builder.appendLine("$indentString|<root>")
 
-            val childrenString = it.children
-                .toDebugString(indentation + 1, filter).trim()
+            val childrenString = it.children.toDebugString(indentation + 1, filter).trim()
             if (childrenString.isNotEmpty()) builder.appendLine(childrenString)
         }
 
diff --git a/compose/ui/ui-tooling/src/androidMain/kotlin/androidx/compose/ui/tooling/animation/AnimateXAsStateComposeAnimation.android.kt b/compose/ui/ui-tooling/src/androidMain/kotlin/androidx/compose/ui/tooling/animation/AnimateXAsStateComposeAnimation.android.kt
index f2dadde..db03c31 100644
--- a/compose/ui/ui-tooling/src/androidMain/kotlin/androidx/compose/ui/tooling/animation/AnimateXAsStateComposeAnimation.android.kt
+++ b/compose/ui/ui-tooling/src/androidMain/kotlin/androidx/compose/ui/tooling/animation/AnimateXAsStateComposeAnimation.android.kt
@@ -23,9 +23,7 @@
 import androidx.compose.animation.tooling.ComposeAnimationType
 import org.jetbrains.annotations.TestOnly
 
-/**
- * [ComposeAnimation] of type [ComposeAnimationType.ANIMATE_X_AS_STATE].
- */
+/** [ComposeAnimation] of type [ComposeAnimationType.ANIMATE_X_AS_STATE]. */
 internal class AnimateXAsStateComposeAnimation<T, V : AnimationVector>
 private constructor(
     val toolingState: ToolingState<T>,
@@ -34,9 +32,8 @@
 ) : ComposeAnimation {
     override val type = ComposeAnimationType.ANIMATE_X_AS_STATE
 
-    override val states: Set<Any> = (animationObject.value as Any).let {
-        it.javaClass.enumConstants?.toSet() ?: setOf(it)
-    }
+    override val states: Set<Any> =
+        (animationObject.value as Any).let { it.javaClass.enumConstants?.toSet() ?: setOf(it) }
 
     override val label: String = animationObject.label
 
@@ -57,15 +54,12 @@
             enumValues<ComposeAnimationType>().any { it.name == "ANIMATE_X_AS_STATE" }
             private set
 
-        internal fun <T, V : AnimationVector> AnimationSearch
-        .AnimateXAsStateSearchInfo<T, V>.parse():
-            AnimateXAsStateComposeAnimation<*, *>? {
+        internal fun <T, V : AnimationVector> AnimationSearch.AnimateXAsStateSearchInfo<T, V>
+            .parse(): AnimateXAsStateComposeAnimation<*, *>? {
             if (!apiAvailable) return null
             // Tooling can't control nullable Animatable with value set to null.
             if (animatable.value == null) return null
-            return AnimateXAsStateComposeAnimation(
-                toolingState, animationSpec, animatable
-            )
+            return AnimateXAsStateComposeAnimation(toolingState, animationSpec, animatable)
         }
 
         /** This method is for testing only. */
diff --git a/compose/ui/ui-tooling/src/androidMain/kotlin/androidx/compose/ui/tooling/animation/AnimatedContentComposeAnimation.android.kt b/compose/ui/ui-tooling/src/androidMain/kotlin/androidx/compose/ui/tooling/animation/AnimatedContentComposeAnimation.android.kt
index d2a2ea8..2e3afb7 100644
--- a/compose/ui/ui-tooling/src/androidMain/kotlin/androidx/compose/ui/tooling/animation/AnimatedContentComposeAnimation.android.kt
+++ b/compose/ui/ui-tooling/src/androidMain/kotlin/androidx/compose/ui/tooling/animation/AnimatedContentComposeAnimation.android.kt
@@ -21,10 +21,9 @@
 import androidx.compose.animation.tooling.ComposeAnimationType
 import org.jetbrains.annotations.TestOnly
 
-/**
- * [ComposeAnimation] of type [ComposeAnimationType.ANIMATED_CONTENT].
- */
-internal class AnimatedContentComposeAnimation<T> private constructor(
+/** [ComposeAnimation] of type [ComposeAnimationType.ANIMATED_CONTENT]. */
+internal class AnimatedContentComposeAnimation<T>
+private constructor(
     override val animationObject: Transition<T>,
     override val states: Set<Any>,
     override val label: String?
@@ -35,16 +34,16 @@
         /**
          * [ComposeAnimationType] from ANIMATABLE to UNSUPPORTED are not available in previous
          * versions of the library. To avoid creating non-existing enum,
-         * [AnimatedContentComposeAnimation] should only be instantiated if [ComposeAnimationType] API
-         * for ANIMATED_CONTENT enum is available.
+         * [AnimatedContentComposeAnimation] should only be instantiated if [ComposeAnimationType]
+         * API for ANIMATED_CONTENT enum is available.
          */
         var apiAvailable = enumValues<ComposeAnimationType>().any { it.name == "ANIMATED_CONTENT" }
             private set
 
         /**
-         * Parses the [Transition] into a [AnimatedContentComposeAnimation].
-         * [Transition] can have nullable state.
-         * Compose Tooling is not handling the case if [Transition.currentState] is null.
+         * Parses the [Transition] into a [AnimatedContentComposeAnimation]. [Transition] can have
+         * nullable state. Compose Tooling is not handling the case if [Transition.currentState] is
+         * null.
          */
         fun Transition<*>.parseAnimatedContent(): AnimatedContentComposeAnimation<*>? {
             if (!apiAvailable) return null
diff --git a/compose/ui/ui-tooling/src/androidMain/kotlin/androidx/compose/ui/tooling/animation/AnimatedVisibilityComposeAnimation.android.kt b/compose/ui/ui-tooling/src/androidMain/kotlin/androidx/compose/ui/tooling/animation/AnimatedVisibilityComposeAnimation.android.kt
index cc946833..6d2bdf18 100644
--- a/compose/ui/ui-tooling/src/androidMain/kotlin/androidx/compose/ui/tooling/animation/AnimatedVisibilityComposeAnimation.android.kt
+++ b/compose/ui/ui-tooling/src/androidMain/kotlin/androidx/compose/ui/tooling/animation/AnimatedVisibilityComposeAnimation.android.kt
@@ -21,21 +21,16 @@
 import androidx.compose.animation.tooling.ComposeAnimationType
 import androidx.compose.ui.tooling.animation.states.AnimatedVisibilityState
 
-/**
- * Parses the [Transition] into an [AnimatedVisibilityComposeAnimation].
- */
+/** Parses the [Transition] into an [AnimatedVisibilityComposeAnimation]. */
 internal fun Transition<Boolean>.parseAnimatedVisibility(): AnimatedVisibilityComposeAnimation {
     return AnimatedVisibilityComposeAnimation(this, this.label ?: "AnimatedVisibility")
 }
 
-/**
- * [ComposeAnimation] of type [ComposeAnimationType.ANIMATED_VISIBILITY].
- */
+/** [ComposeAnimation] of type [ComposeAnimationType.ANIMATED_VISIBILITY]. */
 internal class AnimatedVisibilityComposeAnimation(
     override val animationObject: Transition<Boolean>,
     override val label: String?
-) :
-    ComposeAnimation {
+) : ComposeAnimation {
     override val type = ComposeAnimationType.ANIMATED_VISIBILITY
     override val states = setOf(AnimatedVisibilityState.Enter, AnimatedVisibilityState.Exit)
 
diff --git a/compose/ui/ui-tooling/src/androidMain/kotlin/androidx/compose/ui/tooling/animation/AnimationSearch.android.kt b/compose/ui/ui-tooling/src/androidMain/kotlin/androidx/compose/ui/tooling/animation/AnimationSearch.android.kt
index 4d387ac..ae37575 100644
--- a/compose/ui/ui-tooling/src/androidMain/kotlin/androidx/compose/ui/tooling/animation/AnimationSearch.android.kt
+++ b/compose/ui/ui-tooling/src/androidMain/kotlin/androidx/compose/ui/tooling/animation/AnimationSearch.android.kt
@@ -46,17 +46,9 @@
 /** Find first data with type [T] within all remember calls. */
 @OptIn(UiToolingDataApi::class)
 private inline fun <reified T> Collection<Group>.findRememberedData(): List<T> {
-    val selfData = mapNotNull {
-        it.data.firstOrNull { data ->
-            data is T
-        } as? T
-    }
+    val selfData = mapNotNull { it.data.firstOrNull { data -> data is T } as? T }
     val rememberCalls = mapNotNull { it.firstOrNull { call -> call.name == "remember" } }
-    return selfData + rememberCalls.mapNotNull {
-        it.data.firstOrNull { data ->
-            data is T
-        } as? T
-    }
+    return selfData + rememberCalls.mapNotNull { it.data.firstOrNull { data -> data is T } as? T }
 }
 
 @OptIn(UiToolingDataApi::class)
@@ -68,12 +60,14 @@
 @OptIn(UiToolingDataApi::class)
 private inline fun <reified T> Group.findData(includeGrandchildren: Boolean = false): T? {
     // Search in self data and children data
-    val dataToSearch = data + children.let {
-        if (includeGrandchildren) (it + it.flatMap { child -> child.children }) else it
-    }.flatMap { it.data }
-    return dataToSearch.firstOrNull { data ->
-        data is T
-    } as? T
+    val dataToSearch =
+        data +
+            children
+                .let {
+                    if (includeGrandchildren) (it + it.flatMap { child -> child.children }) else it
+                }
+                .flatMap { it.data }
+    return dataToSearch.firstOrNull { data -> data is T } as? T
 }
 
 /** Contains tree parsers for different animation types. */
@@ -83,8 +77,7 @@
     private val onSeek: () -> Unit,
 ) {
     private val transitionSearch = TransitionSearch { clock().trackTransition(it) }
-    private val animatedContentSearch =
-        AnimatedContentSearch { clock().trackAnimatedContent(it) }
+    private val animatedContentSearch = AnimatedContentSearch { clock().trackAnimatedContent(it) }
     private val animatedVisibilitySearch = AnimatedVisibilitySearch {
         clock().trackAnimatedVisibility(it, onSeek)
     }
@@ -96,24 +89,28 @@
 
     private fun infiniteTransitionSearch() =
         if (InfiniteTransitionComposeAnimation.apiAvailable)
-            setOf(InfiniteTransitionSearch() {
-                clock().trackInfiniteTransition(it)
-            })
+            setOf(InfiniteTransitionSearch() { clock().trackInfiniteTransition(it) })
         else emptySet()
 
     /** All supported animations. */
-    private fun supportedSearch() = setOf(
-        transitionSearch,
-        animatedVisibilitySearch,
-    ) + animateXAsStateSearch() + infiniteTransitionSearch() +
-        (if (AnimatedContentComposeAnimation.apiAvailable)
-            setOf(animatedContentSearch) else emptySet())
+    private fun supportedSearch() =
+        setOf(
+            transitionSearch,
+            animatedVisibilitySearch,
+        ) +
+            animateXAsStateSearch() +
+            infiniteTransitionSearch() +
+            (if (AnimatedContentComposeAnimation.apiAvailable) setOf(animatedContentSearch)
+            else emptySet())
 
-    private fun unsupportedSearch() = if (UnsupportedComposeAnimation.apiAvailable) setOf(
-        AnimateContentSizeSearch { clock().trackAnimateContentSize(it) },
-        TargetBasedSearch { clock().trackTargetBasedAnimations(it) },
-        DecaySearch { clock().trackDecayAnimations(it) }
-    ) else emptyList()
+    private fun unsupportedSearch() =
+        if (UnsupportedComposeAnimation.apiAvailable)
+            setOf(
+                AnimateContentSizeSearch { clock().trackAnimateContentSize(it) },
+                TargetBasedSearch { clock().trackTargetBasedAnimations(it) },
+                DecaySearch { clock().trackDecayAnimations(it) }
+            )
+        else emptyList()
 
     /** All supported animations. */
     private val supportedSearch = supportedSearch()
@@ -122,8 +119,8 @@
     private val setToTrack = supportedSearch + unsupportedSearch()
 
     /**
-     * Animations to search. animatedContentSearch is included even if it's not going to be
-     * tracked as it should be excluded from transitionSearch.
+     * Animations to search. animatedContentSearch is included even if it's not going to be tracked
+     * as it should be excluded from transitionSearch.
      */
     private val setToSearch = setToTrack + setOf(animatedContentSearch)
 
@@ -131,7 +128,6 @@
      * Finds if any of supported animations are available. It DOES NOT map detected animations to
      * corresponding animation types.
      */
-
     fun searchAny(slotTrees: Collection<Group>): Boolean {
         return slotTrees.any { tree ->
             val groups = tree.findAll { true }
@@ -141,8 +137,8 @@
 
     /**
      * Finds all animations defined in the Compose tree where the root is the `@Composable` being
-     * previewed. Each found animation is mapped to corresponding animation type and tracked.
-     * It should NOT be called if no animation is found with [searchAny].
+     * previewed. Each found animation is mapped to corresponding animation type and tracked. It
+     * should NOT be called if no animation is found with [searchAny].
      */
     fun attachAllAnimations(slotTrees: Collection<Group>) {
         // Check all the slot tables, since some animations might not be present in the same
@@ -175,9 +171,9 @@
         val animations = mutableSetOf<T>()
 
         /**
-         *  Add all found animations to [animations] list. Should only be called in Animation
-         *  Preview, otherwise other tools (e.g. Interactive Preview) might not render animations
-         *  correctly.
+         * Add all found animations to [animations] list. Should only be called in Animation
+         * Preview, otherwise other tools (e.g. Interactive Preview) might not render animations
+         * correctly.
          */
         open fun addAnimations(groups: Collection<Group>) {}
 
@@ -189,10 +185,8 @@
     }
 
     /** Search for animations with type [T]. */
-    open class RememberSearch<T : Any>(
-        private val clazz: KClass<T>,
-        trackAnimation: (T) -> Unit
-    ) : Search<T>(trackAnimation) {
+    open class RememberSearch<T : Any>(private val clazz: KClass<T>, trackAnimation: (T) -> Unit) :
+        Search<T>(trackAnimation) {
         override fun addAnimations(groups: Collection<Group>) {
             val groupsWithLocation = groups.filter { it.location != null }
             animations.addAll(groupsWithLocation.findRememberCallWithType(clazz).toSet())
@@ -203,11 +197,14 @@
         }
 
         private fun <T : Any> Collection<Group>.findRememberCallWithType(clazz: KClass<T>) =
-            mapNotNull { it.findRememberCallWithType(clazz) }
+            mapNotNull {
+                it.findRememberCallWithType(clazz)
+            }
 
         private fun <T : Any> Group.findRememberCallWithType(clazz: KClass<T>): T? {
             return clazz.safeCast(
-                this.data.firstOrNull { data -> data?.javaClass?.kotlin == clazz })
+                this.data.firstOrNull { data -> data?.javaClass?.kotlin == clazz }
+            )
         }
     }
 
@@ -222,14 +219,12 @@
         val toolingState: ToolingState<Long>
     )
 
-    class InfiniteTransitionSearch(
-        trackAnimation: (InfiniteTransitionSearchInfo) -> Unit
-    ) : Search<InfiniteTransitionSearchInfo>(trackAnimation) {
+    class InfiniteTransitionSearch(trackAnimation: (InfiniteTransitionSearchInfo) -> Unit) :
+        Search<InfiniteTransitionSearchInfo>(trackAnimation) {
 
         override fun hasAnimation(group: Group): Boolean {
             return toAnimationGroup(group)?.let {
-                group.findData<InfiniteTransition>() != null &&
-                    findToolingOverride(group) != null
+                group.findData<InfiniteTransition>() != null && findToolingOverride(group) != null
             } ?: false
         }
 
@@ -238,27 +233,28 @@
         }
 
         private fun toAnimationGroup(group: Group): CallGroup? {
-            return group.takeIf {
-                group.location != null && group.name == REMEMBER_INFINITE_TRANSITION
-            }?.let { it as? CallGroup }
+            return group
+                .takeIf { group.location != null && group.name == REMEMBER_INFINITE_TRANSITION }
+                ?.let { it as? CallGroup }
         }
 
-        private fun findAnimations(groups: Collection<Group>):
-            List<InfiniteTransitionSearchInfo> {
+        private fun findAnimations(groups: Collection<Group>): List<InfiniteTransitionSearchInfo> {
 
-            return groups.mapNotNull { toAnimationGroup(it) }.mapNotNull {
-                val infiniteTransition = it.findData<InfiniteTransition>()
-                val toolingOverride = findToolingOverride(it)
-                if (infiniteTransition != null && toolingOverride != null) {
-                    if (toolingOverride.value == null) {
-                        toolingOverride.value = ToolingState(0L)
-                    }
-                    InfiniteTransitionSearchInfo(
-                        infiniteTransition,
-                        (toolingOverride.value as? ToolingState<Long>) ?: ToolingState(0L)
-                    )
-                } else null
-            }
+            return groups
+                .mapNotNull { toAnimationGroup(it) }
+                .mapNotNull {
+                    val infiniteTransition = it.findData<InfiniteTransition>()
+                    val toolingOverride = findToolingOverride(it)
+                    if (infiniteTransition != null && toolingOverride != null) {
+                        if (toolingOverride.value == null) {
+                            toolingOverride.value = ToolingState(0L)
+                        }
+                        InfiniteTransitionSearchInfo(
+                            infiniteTransition,
+                            (toolingOverride.value as? ToolingState<Long>) ?: ToolingState(0L)
+                        )
+                    } else null
+                }
         }
 
         /**
@@ -278,9 +274,8 @@
     )
 
     /** Search for animateXAsState() and animateValueAsState() animations. */
-    class AnimateXAsStateSearch(
-        trackAnimation: (AnimateXAsStateSearchInfo<*, *>) -> Unit
-    ) : Search<AnimateXAsStateSearchInfo<*, *>>(trackAnimation) {
+    class AnimateXAsStateSearch(trackAnimation: (AnimateXAsStateSearchInfo<*, *>) -> Unit) :
+        Search<AnimateXAsStateSearchInfo<*, *>>(trackAnimation) {
 
         override fun hasAnimation(group: Group): Boolean {
             return toAnimationGroup(group)?.let {
@@ -294,17 +289,16 @@
             animations.addAll(findAnimations<Any?>(groups))
         }
 
-        /**
-         * Find the [Group] containing animation.
-         */
+        /** Find the [Group] containing animation. */
         private fun toAnimationGroup(group: Group): CallGroup? {
-            return group.takeIf {
-                it.location != null && it.name == ANIMATE_VALUE_AS_STATE
-            }?.let { it as? CallGroup }
+            return group
+                .takeIf { it.location != null && it.name == ANIMATE_VALUE_AS_STATE }
+                ?.let { it as? CallGroup }
         }
 
-        private fun <T> findAnimations(groups: Collection<Group>):
-            List<AnimateXAsStateSearchInfo<T, AnimationVector>> {
+        private fun <T> findAnimations(
+            groups: Collection<Group>
+        ): List<AnimateXAsStateSearchInfo<T, AnimationVector>> {
             // How "animateXAsState" calls organized:
             // Group with name "animateXAsState", for example animateDpAsState, animateIntAsState
             //    children
@@ -315,22 +309,24 @@
             // To distinguish Animatable within "animateXAsState" calls from other Animatables,
             // first "animateValueAsState" calls are found.
             //  Find Animatable within "animateValueAsState" call.
-            return groups.mapNotNull { toAnimationGroup(it) }.mapNotNull {
-                val animatable = findAnimatable<T>(it)
-                val spec = findAnimationSpec<T>(it)
-                val toolingOverride = findToolingOverride<T>(it)
-                if (animatable != null && spec != null && toolingOverride != null) {
-                    if (toolingOverride.value == null) {
-                        toolingOverride.value = ToolingState(animatable.value)
-                    }
-                    AnimateXAsStateSearchInfo(
-                        animatable,
-                        spec,
-                        (toolingOverride.value as? ToolingState<T>)
-                            ?: ToolingState(animatable.value)
-                    )
-                } else null
-            }
+            return groups
+                .mapNotNull { toAnimationGroup(it) }
+                .mapNotNull {
+                    val animatable = findAnimatable<T>(it)
+                    val spec = findAnimationSpec<T>(it)
+                    val toolingOverride = findToolingOverride<T>(it)
+                    if (animatable != null && spec != null && toolingOverride != null) {
+                        if (toolingOverride.value == null) {
+                            toolingOverride.value = ToolingState(animatable.value)
+                        }
+                        AnimateXAsStateSearchInfo(
+                            animatable,
+                            spec,
+                            (toolingOverride.value as? ToolingState<T>)
+                                ?: ToolingState(animatable.value)
+                        )
+                    } else null
+                }
         }
 
         /**
@@ -339,7 +335,7 @@
          * [MutableState] from the slot table and directly setting its value. animateValueAsState
          * will use the tooling override if this value is not null.
          */
-        private fun <T>findToolingOverride(group: Group): MutableState<State<T>?>? {
+        private fun <T> findToolingOverride(group: Group): MutableState<State<T>?>? {
             return group.findRememberedData<MutableState<State<T>?>>().firstOrNull()
         }
 
@@ -348,44 +344,42 @@
             val rememberStates = group.children.filter { it.name == REMEMBER_UPDATED_STATE }
             return (rememberStates + rememberStates.flatMap { it.children })
                 .flatMap { it.data }
-                .filterIsInstance<State<T>>().map { it.value }
-                .filterIsInstance<AnimationSpec<T>>().firstOrNull()
+                .filterIsInstance<State<T>>()
+                .map { it.value }
+                .filterIsInstance<AnimationSpec<T>>()
+                .firstOrNull()
         }
 
         private fun <T> findAnimatable(group: CallGroup): Animatable<T, AnimationVector>? {
-            return group.findRememberedData<Animatable<T, AnimationVector>>()
-                .firstOrNull()
+            return group.findRememberedData<Animatable<T, AnimationVector>>().firstOrNull()
         }
     }
 
     /** Search for animateContentSize() animations. */
-    class AnimateContentSizeSearch(trackAnimation: (Any) -> Unit) :
-        Search<Any>(trackAnimation) {
+    class AnimateContentSizeSearch(trackAnimation: (Any) -> Unit) : Search<Any>(trackAnimation) {
 
         override fun hasAnimation(group: Group): Boolean {
-            return group.modifierInfo.isNotEmpty() && group.modifierInfo.any {
-                it.modifier.any { mod ->
-                    mod.javaClass.name == SIZE_ANIMATION_MODIFIER
+            return group.modifierInfo.isNotEmpty() &&
+                group.modifierInfo.any {
+                    it.modifier.any { mod -> mod.javaClass.name == SIZE_ANIMATION_MODIFIER }
                 }
-            }
         }
 
         // It's important not to pre-filter the groups by location, as there's no guarantee
         // that the group containing the modifierInfo we are looking for has a non-null location.
         override fun addAnimations(groups: Collection<Group>) {
-            groups.filter {
-                it.modifierInfo.isNotEmpty()
-            }.forEach { group ->
-                group.modifierInfo.forEach {
-                    it.modifier.any { mod ->
-                        if (mod.javaClass.name == SIZE_ANIMATION_MODIFIER) {
-                            animations.add(mod)
-                            true
-                        } else
-                            false
+            groups
+                .filter { it.modifierInfo.isNotEmpty() }
+                .forEach { group ->
+                    group.modifierInfo.forEach {
+                        it.modifier.any { mod ->
+                            if (mod.javaClass.name == SIZE_ANIMATION_MODIFIER) {
+                                animations.add(mod)
+                                true
+                            } else false
+                        }
                     }
                 }
-            }
         }
     }
 
@@ -401,9 +395,7 @@
             animations.addAll(groups.mapNotNull { toAnimationGroup(it) }.findRememberedData())
         }
 
-        /**
-         * Find the [Group] containing animation.
-         */
+        /** Find the [Group] containing animation. */
         private fun toAnimationGroup(group: Group): Group? {
             // Find `updateTransition` calls.
             return group.takeIf { it.location != null && it.name == UPDATE_TRANSITION }
@@ -422,17 +414,17 @@
             animations.addAll(groups.mapNotNull { toAnimationGroup(it) }.findRememberedData())
         }
 
-        /**
-         * Find the [Group] containing animation.
-         */
+        /** Find the [Group] containing animation. */
         private fun toAnimationGroup(group: Group): Group? {
             // Find `AnimatedVisibility` call.
-            return group.takeIf { it.location != null && it.name == ANIMATED_VISIBILITY }?.let {
-                // Then, find the underlying `updateTransition` it uses.
-                it.children.firstOrNull { updateTransitionCall ->
-                    updateTransitionCall.name == UPDATE_TRANSITION
+            return group
+                .takeIf { it.location != null && it.name == ANIMATED_VISIBILITY }
+                ?.let {
+                    // Then, find the underlying `updateTransition` it uses.
+                    it.children.firstOrNull { updateTransitionCall ->
+                        updateTransitionCall.name == UPDATE_TRANSITION
+                    }
                 }
-            }
         }
     }
 
@@ -448,15 +440,15 @@
             animations.addAll(groups.mapNotNull { toAnimationGroup(it) }.findRememberedData())
         }
 
-        /**
-         * Find the [Group] containing animation.
-         */
+        /** Find the [Group] containing animation. */
         private fun toAnimationGroup(group: Group): Group? {
-            return group.takeIf { group.location != null && group.name == ANIMATED_CONTENT }?.let {
-                it.children.firstOrNull { updateTransitionCall ->
-                    updateTransitionCall.name == UPDATE_TRANSITION
+            return group
+                .takeIf { group.location != null && group.name == ANIMATED_CONTENT }
+                ?.let {
+                    it.children.firstOrNull { updateTransitionCall ->
+                        updateTransitionCall.name == UPDATE_TRANSITION
+                    }
                 }
-            }
         }
     }
 }
diff --git a/compose/ui/ui-tooling/src/androidMain/kotlin/androidx/compose/ui/tooling/animation/InfiniteTransitionComposeAnimation.android.kt b/compose/ui/ui-tooling/src/androidMain/kotlin/androidx/compose/ui/tooling/animation/InfiniteTransitionComposeAnimation.android.kt
index 751b170..7eb03aa 100644
--- a/compose/ui/ui-tooling/src/androidMain/kotlin/androidx/compose/ui/tooling/animation/InfiniteTransitionComposeAnimation.android.kt
+++ b/compose/ui/ui-tooling/src/androidMain/kotlin/androidx/compose/ui/tooling/animation/InfiniteTransitionComposeAnimation.android.kt
@@ -21,9 +21,7 @@
 import androidx.compose.animation.tooling.ComposeAnimationType
 import org.jetbrains.annotations.TestOnly
 
-/**
- * [ComposeAnimation] of type [ComposeAnimationType.INFINITE_TRANSITION].
- */
+/** [ComposeAnimation] of type [ComposeAnimationType.INFINITE_TRANSITION]. */
 internal class InfiniteTransitionComposeAnimation
 private constructor(
     private val toolingState: ToolingState<Long>,
@@ -54,9 +52,7 @@
         internal fun AnimationSearch.InfiniteTransitionSearchInfo.parse():
             InfiniteTransitionComposeAnimation? {
             if (!apiAvailable) return null
-            return InfiniteTransitionComposeAnimation(
-                toolingState, infiniteTransition
-            )
+            return InfiniteTransitionComposeAnimation(toolingState, infiniteTransition)
         }
 
         /** This method is for testing only. */
diff --git a/compose/ui/ui-tooling/src/androidMain/kotlin/androidx/compose/ui/tooling/animation/PreviewAnimationClock.android.kt b/compose/ui/ui-tooling/src/androidMain/kotlin/androidx/compose/ui/tooling/animation/PreviewAnimationClock.android.kt
index 8b1fe2a..58d6c2b 100644
--- a/compose/ui/ui-tooling/src/androidMain/kotlin/androidx/compose/ui/tooling/animation/PreviewAnimationClock.android.kt
+++ b/compose/ui/ui-tooling/src/androidMain/kotlin/androidx/compose/ui/tooling/animation/PreviewAnimationClock.android.kt
@@ -69,42 +69,53 @@
         mutableMapOf<TransitionComposeAnimation<*>, TransitionClock<*>>()
 
     /**
-     * Map of subscribed [AnimatedVisibilityComposeAnimation]s and corresponding [AnimatedVisibilityClock].
+     * Map of subscribed [AnimatedVisibilityComposeAnimation]s and corresponding
+     * [AnimatedVisibilityClock].
      */
     @VisibleForTesting
     internal val animatedVisibilityClocks =
         mutableMapOf<AnimatedVisibilityComposeAnimation, AnimatedVisibilityClock>()
 
-    /** Map of subscribed [AnimateXAsStateComposeAnimation]s and corresponding [AnimateXAsStateClock]s. */
+    /**
+     * Map of subscribed [AnimateXAsStateComposeAnimation]s and corresponding
+     * [AnimateXAsStateClock]s.
+     */
     @VisibleForTesting
     internal val animateXAsStateClocks =
         mutableMapOf<AnimateXAsStateComposeAnimation<*, *>, AnimateXAsStateClock<*, *>>()
 
-    /** Map of subscribed [InfiniteTransitionComposeAnimation]s and corresponding [InfiniteTransitionClock]s. */
+    /**
+     * Map of subscribed [InfiniteTransitionComposeAnimation]s and corresponding
+     * [InfiniteTransitionClock]s.
+     */
     @VisibleForTesting
     internal val infiniteTransitionClocks =
         mutableMapOf<InfiniteTransitionComposeAnimation, InfiniteTransitionClock>()
 
-    /** Map of subscribed [AnimatedContentComposeAnimation]s and corresponding [TransitionClock]s. */
+    /**
+     * Map of subscribed [AnimatedContentComposeAnimation]s and corresponding [TransitionClock]s.
+     */
     @VisibleForTesting
     internal val animatedContentClocks =
         mutableMapOf<AnimatedContentComposeAnimation<*>, TransitionClock<*>>()
 
     private val allClocksExceptInfinite: List<ComposeAnimationClock<*, *>>
-        get() = transitionClocks.values +
-            animatedVisibilityClocks.values +
-            animateXAsStateClocks.values +
-            animatedContentClocks.values
+        get() =
+            transitionClocks.values +
+                animatedVisibilityClocks.values +
+                animateXAsStateClocks.values +
+                animatedContentClocks.values
 
     /** All subscribed animations clocks. */
     private val allClocks: List<ComposeAnimationClock<*, *>>
-        get() = allClocksExceptInfinite +
-            infiniteTransitionClocks.values
+        get() = allClocksExceptInfinite + infiniteTransitionClocks.values
 
     private fun findClock(animation: ComposeAnimation): ComposeAnimationClock<*, *>? {
-        return transitionClocks[animation] ?: animatedVisibilityClocks[animation]
-        ?: animateXAsStateClocks[animation]
-        ?: infiniteTransitionClocks[animation] ?: animatedContentClocks[animation]
+        return transitionClocks[animation]
+            ?: animatedVisibilityClocks[animation]
+            ?: animateXAsStateClocks[animation]
+            ?: infiniteTransitionClocks[animation]
+            ?: animatedContentClocks[animation]
     }
 
     fun trackTransition(animation: Transition<*>) {
@@ -130,9 +141,7 @@
             val composeAnimation = animation.parseAnimatedVisibility()
             onSeek()
             animatedVisibilityClocks[composeAnimation] =
-                AnimatedVisibilityClock(composeAnimation).apply {
-                    setClockTime(0L)
-                }
+                AnimatedVisibilityClock(composeAnimation).apply { setClockTime(0L) }
             notifySubscribe(composeAnimation)
         }
     }
@@ -177,28 +186,28 @@
     fun trackInfiniteTransition(animation: AnimationSearch.InfiniteTransitionSearchInfo) {
         trackAnimation(animation.infiniteTransition) {
             animation.parse()?.let {
-                infiniteTransitionClocks[it] = InfiniteTransitionClock(it) {
-                    // Let InfiniteTransitionClock be aware about max duration of other animations.
-                    val otherClockMaxDuration =
-                        allClocksExceptInfinite.maxOfOrNull { clock -> clock.getMaxDuration() } ?: 0
-                    val infiniteMaxDurationPerIteration =
-                        infiniteTransitionClocks.values.maxOfOrNull { clock ->
-                            clock.getMaxDurationPerIteration()
-                        } ?: 0
-                    maxOf(otherClockMaxDuration, infiniteMaxDurationPerIteration)
-                }
+                infiniteTransitionClocks[it] =
+                    InfiniteTransitionClock(it) {
+                        // Let InfiniteTransitionClock be aware about max duration of other
+                        // animations.
+                        val otherClockMaxDuration =
+                            allClocksExceptInfinite.maxOfOrNull { clock -> clock.getMaxDuration() }
+                                ?: 0
+                        val infiniteMaxDurationPerIteration =
+                            infiniteTransitionClocks.values.maxOfOrNull { clock ->
+                                clock.getMaxDurationPerIteration()
+                            } ?: 0
+                        maxOf(otherClockMaxDuration, infiniteMaxDurationPerIteration)
+                    }
                 notifySubscribe(it)
             }
         }
     }
 
-    @VisibleForTesting
-    val trackedUnsupportedAnimations = linkedSetOf<UnsupportedComposeAnimation>()
+    @VisibleForTesting val trackedUnsupportedAnimations = linkedSetOf<UnsupportedComposeAnimation>()
 
     private fun trackUnsupported(animation: Any, label: String) {
-        trackAnimation(animation) {
-            createUnsupported(label)
-        }
+        trackAnimation(animation) { createUnsupported(label) }
     }
 
     private fun createUnsupported(label: String?) {
@@ -264,8 +273,8 @@
     }
 
     /**
-     * Returns the [AnimatedVisibilityState] corresponding to the given
-     * [AnimatedVisibilityClock] object. Falls back to [AnimatedVisibilityState.Enter].
+     * Returns the [AnimatedVisibilityState] corresponding to the given [AnimatedVisibilityClock]
+     * object. Falls back to [AnimatedVisibilityState.Enter].
      *
      * Expected to be called via reflection from Android Studio.
      */
@@ -283,8 +292,8 @@
     }
 
     /**
-     * Returns the longest duration (ms) per iteration among the animations being tracked. This
-     * can be different from [getMaxDuration], for instance, when there is one or more repeatable
+     * Returns the longest duration (ms) per iteration among the animations being tracked. This can
+     * be different from [getMaxDuration], for instance, when there is one or more repeatable
      * animations with multiple iterations.
      *
      * Expected to be called via reflection from Android Studio.
@@ -294,9 +303,9 @@
     }
 
     /**
-     *  Returns a list of the given [ComposeAnimation]'s animated properties. The properties are
-     *  wrapped into a [ComposeAnimatedProperty] object containing the property label and the
-     *  corresponding value at the current time.
+     * Returns a list of the given [ComposeAnimation]'s animated properties. The properties are
+     * wrapped into a [ComposeAnimatedProperty] object containing the property label and the
+     * corresponding value at the current time.
      *
      * Expected to be called via reflection from Android Studio.
      */
@@ -306,8 +315,8 @@
 
     /**
      * Returns a list of the given [ComposeAnimation]'s animated properties. The properties are
-     * wrapped into a [TransitionInfo] object containing the property label, start and time
-     * of animation and values of the animation.
+     * wrapped into a [TransitionInfo] object containing the property label, start and time of
+     * animation and values of the animation.
      *
      * Expected to be called via reflection from Android Studio.
      */
@@ -338,9 +347,7 @@
         setAnimationsTimeCallback.invoke()
     }
 
-    /**
-     * Unsubscribes the currently tracked animations and clears all the caches.
-     */
+    /** Unsubscribes the currently tracked animations and clears all the caches. */
     fun dispose() {
         allClocks.forEach { notifyUnsubscribe(it.animation) }
         trackedUnsupportedAnimations.forEach { notifyUnsubscribe(it) }
diff --git a/compose/ui/ui-tooling/src/androidMain/kotlin/androidx/compose/ui/tooling/animation/ToolingState.android.kt b/compose/ui/ui-tooling/src/androidMain/kotlin/androidx/compose/ui/tooling/animation/ToolingState.android.kt
index 0cf6e60..3158b8c 100644
--- a/compose/ui/ui-tooling/src/androidMain/kotlin/androidx/compose/ui/tooling/animation/ToolingState.android.kt
+++ b/compose/ui/ui-tooling/src/androidMain/kotlin/androidx/compose/ui/tooling/animation/ToolingState.android.kt
@@ -23,8 +23,8 @@
 import androidx.compose.runtime.setValue
 
 /**
- * Tooling can override [mutableStateOf] in [Composable] with [ToolingState].
- * [Composable] should declare a state, which could be private:
+ * Tooling can override [mutableStateOf] in [Composable] with [ToolingState]. [Composable] should
+ * declare a state, which could be private:
  *
  *      val toolingOverride = remember { mutableStateOf<State<T>?>(null) }
  *
diff --git a/compose/ui/ui-tooling/src/androidMain/kotlin/androidx/compose/ui/tooling/animation/TransitionBasedAnimation.android.kt b/compose/ui/ui-tooling/src/androidMain/kotlin/androidx/compose/ui/tooling/animation/TransitionBasedAnimation.android.kt
index 9dbb76f..6ba8ef7 100644
--- a/compose/ui/ui-tooling/src/androidMain/kotlin/androidx/compose/ui/tooling/animation/TransitionBasedAnimation.android.kt
+++ b/compose/ui/ui-tooling/src/androidMain/kotlin/androidx/compose/ui/tooling/animation/TransitionBasedAnimation.android.kt
@@ -19,9 +19,7 @@
 import androidx.compose.animation.core.Transition
 import androidx.compose.animation.tooling.ComposeAnimation
 
-/**
- * [ComposeAnimation] where [animationObject] is [Transition].
- */
+/** [ComposeAnimation] where [animationObject] is [Transition]. */
 internal interface TransitionBasedAnimation<T> : ComposeAnimation {
     override val animationObject: Transition<T>
 }
diff --git a/compose/ui/ui-tooling/src/androidMain/kotlin/androidx/compose/ui/tooling/animation/TransitionComposeAnimation.android.kt b/compose/ui/ui-tooling/src/androidMain/kotlin/androidx/compose/ui/tooling/animation/TransitionComposeAnimation.android.kt
index 53f9e03..9eec043 100644
--- a/compose/ui/ui-tooling/src/androidMain/kotlin/androidx/compose/ui/tooling/animation/TransitionComposeAnimation.android.kt
+++ b/compose/ui/ui-tooling/src/androidMain/kotlin/androidx/compose/ui/tooling/animation/TransitionComposeAnimation.android.kt
@@ -21,9 +21,8 @@
 import androidx.compose.animation.tooling.ComposeAnimationType
 
 /**
- * Parses the [Transition] into a [TransitionComposeAnimation].
- * [Transition] can have nullable state.
- * Compose Tooling is not handling the case if [Transition.currentState] is null.
+ * Parses the [Transition] into a [TransitionComposeAnimation]. [Transition] can have nullable
+ * state. Compose Tooling is not handling the case if [Transition.currentState] is null.
  */
 internal fun Transition<*>.parse(): TransitionComposeAnimation<*>? {
     return currentState?.let { state ->
@@ -32,9 +31,7 @@
     }
 }
 
-/**
- * [ComposeAnimation] of type [ComposeAnimationType.TRANSITION_ANIMATION].
- */
+/** [ComposeAnimation] of type [ComposeAnimationType.TRANSITION_ANIMATION]. */
 internal class TransitionComposeAnimation<T>(
     override val animationObject: Transition<T>,
     override val states: Set<Any>,
diff --git a/compose/ui/ui-tooling/src/androidMain/kotlin/androidx/compose/ui/tooling/animation/UnsupportedComposeAnimation.android.kt b/compose/ui/ui-tooling/src/androidMain/kotlin/androidx/compose/ui/tooling/animation/UnsupportedComposeAnimation.android.kt
index 765d62e..c3140d7 100644
--- a/compose/ui/ui-tooling/src/androidMain/kotlin/androidx/compose/ui/tooling/animation/UnsupportedComposeAnimation.android.kt
+++ b/compose/ui/ui-tooling/src/androidMain/kotlin/androidx/compose/ui/tooling/animation/UnsupportedComposeAnimation.android.kt
@@ -20,12 +20,9 @@
 import androidx.compose.animation.tooling.ComposeAnimationType
 import org.jetbrains.annotations.TestOnly
 
-/**
- * [ComposeAnimation] of type [ComposeAnimationType.UNSUPPORTED].
- */
-internal class UnsupportedComposeAnimation private constructor(
-    override val label: String?
-) : ComposeAnimation {
+/** [ComposeAnimation] of type [ComposeAnimationType.UNSUPPORTED]. */
+internal class UnsupportedComposeAnimation private constructor(override val label: String?) :
+    ComposeAnimation {
     override val type = ComposeAnimationType.UNSUPPORTED
     override val animationObject: Any = 0
     override val states = emptySet<Int>()
@@ -40,8 +37,7 @@
         var apiAvailable = enumValues<ComposeAnimationType>().any { it.name == "UNSUPPORTED" }
             private set
 
-        fun create(label: String?) =
-            if (apiAvailable) UnsupportedComposeAnimation(label) else null
+        fun create(label: String?) = if (apiAvailable) UnsupportedComposeAnimation(label) else null
 
         /** This method is for testing only. */
         @TestOnly
diff --git a/compose/ui/ui-tooling/src/androidMain/kotlin/androidx/compose/ui/tooling/animation/clock/AnimateXAsStateClock.android.kt b/compose/ui/ui-tooling/src/androidMain/kotlin/androidx/compose/ui/tooling/animation/clock/AnimateXAsStateClock.android.kt
index b6328bd..5e8344e 100644
--- a/compose/ui/ui-tooling/src/androidMain/kotlin/androidx/compose/ui/tooling/animation/clock/AnimateXAsStateClock.android.kt
+++ b/compose/ui/ui-tooling/src/androidMain/kotlin/androidx/compose/ui/tooling/animation/clock/AnimateXAsStateClock.android.kt
@@ -23,18 +23,13 @@
 import androidx.compose.ui.tooling.animation.AnimateXAsStateComposeAnimation
 import androidx.compose.ui.tooling.animation.states.TargetState
 
-/**
- * [ComposeAnimationClock] for [AnimateXAsStateComposeAnimation].
- */
+/** [ComposeAnimationClock] for [AnimateXAsStateComposeAnimation]. */
 internal class AnimateXAsStateClock<T, V : AnimationVector>(
     override val animation: AnimateXAsStateComposeAnimation<T, V>
-) :
-    ComposeAnimationClock<AnimateXAsStateComposeAnimation<T, V>, TargetState<T>> {
+) : ComposeAnimationClock<AnimateXAsStateComposeAnimation<T, V>, TargetState<T>> {
 
-    override var state = TargetState(
-        animation.animationObject.value,
-        animation.animationObject.value
-    )
+    override var state =
+        TargetState(animation.animationObject.value, animation.animationObject.value)
         set(value) {
             field = value
             currAnimation = getCurrentAnimation()
@@ -50,9 +45,7 @@
     private var currAnimation: TargetBasedAnimation<T, V> = getCurrentAnimation()
 
     override fun setStateParameters(par1: Any, par2: Any?) {
-        parseParametersToValue(currentValue, par1, par2)?.let {
-            state = it
-        }
+        parseParametersToValue(currentValue, par1, par2)?.let { state = it }
     }
 
     override fun getAnimatedProperties(): List<ComposeAnimatedProperty> {
@@ -69,9 +62,7 @@
 
     override fun getTransitions(stepMillis: Long): List<TransitionInfo> {
         return listOf(
-            currAnimation.createTransitionInfo(
-                animation.label, animation.animationSpec, stepMillis
-            )
+            currAnimation.createTransitionInfo(animation.label, animation.animationSpec, stepMillis)
         )
     }
 
diff --git a/compose/ui/ui-tooling/src/androidMain/kotlin/androidx/compose/ui/tooling/animation/clock/AnimatedVisibilityClock.android.kt b/compose/ui/ui-tooling/src/androidMain/kotlin/androidx/compose/ui/tooling/animation/clock/AnimatedVisibilityClock.android.kt
index f1eeb55..848e46c 100644
--- a/compose/ui/ui-tooling/src/androidMain/kotlin/androidx/compose/ui/tooling/animation/clock/AnimatedVisibilityClock.android.kt
+++ b/compose/ui/ui-tooling/src/androidMain/kotlin/androidx/compose/ui/tooling/animation/clock/AnimatedVisibilityClock.android.kt
@@ -65,18 +65,24 @@
 
     override fun getTransitions(stepMillis: Long): List<TransitionInfo> {
         animation.childTransition?.let { child ->
-            return child.allAnimations().map {
-                it.createTransitionInfo(stepMillis)
-            }.sortedBy { it.label }.filter { !IGNORE_TRANSITIONS.contains(it.label) }
+            return child
+                .allAnimations()
+                .map { it.createTransitionInfo(stepMillis) }
+                .sortedBy { it.label }
+                .filter { !IGNORE_TRANSITIONS.contains(it.label) }
         }
         return emptyList()
     }
 
     override fun getAnimatedProperties(): List<ComposeAnimatedProperty> {
         animation.childTransition?.let { child ->
-            return child.allAnimations().mapNotNull {
-                ComposeAnimatedProperty(it.label, it.value ?: return@mapNotNull null)
-            }.sortedBy { it.label }.filter { !IGNORE_TRANSITIONS.contains(it.label) }
+            return child
+                .allAnimations()
+                .mapNotNull {
+                    ComposeAnimatedProperty(it.label, it.value ?: return@mapNotNull null)
+                }
+                .sortedBy { it.label }
+                .filter { !IGNORE_TRANSITIONS.contains(it.label) }
         }
         return emptyList()
     }
diff --git a/compose/ui/ui-tooling/src/androidMain/kotlin/androidx/compose/ui/tooling/animation/clock/ComposeAnimationClock.android.kt b/compose/ui/ui-tooling/src/androidMain/kotlin/androidx/compose/ui/tooling/animation/clock/ComposeAnimationClock.android.kt
index 8de5646..470e33f 100644
--- a/compose/ui/ui-tooling/src/androidMain/kotlin/androidx/compose/ui/tooling/animation/clock/ComposeAnimationClock.android.kt
+++ b/compose/ui/ui-tooling/src/androidMain/kotlin/androidx/compose/ui/tooling/animation/clock/ComposeAnimationClock.android.kt
@@ -26,37 +26,33 @@
     val animation: T
     var state: TState
 
-    /** Get duration of the animation (ms).*/
+    /** Get duration of the animation (ms). */
     fun getMaxDuration(): Long
 
     /**
-     * Get duration of one iteration for the animation (ms).
-     * Applicable for repeatable animations with multiple iterations.
-     * For non-repeatable animations [getMaxDuration] and [getMaxDurationPerIteration] are the same.
+     * Get duration of one iteration for the animation (ms). Applicable for repeatable animations
+     * with multiple iterations. For non-repeatable animations [getMaxDuration] and
+     * [getMaxDurationPerIteration] are the same.
+     *
      * TODO(b/177895209) Add support for repeatable animations.
      */
     fun getMaxDurationPerIteration(): Long
 
     /**
-     * Get the list of [ComposeAnimatedProperty].
-     * It changes everytime time if [state] or clock time is changed.
+     * Get the list of [ComposeAnimatedProperty]. It changes everytime time if [state] or clock time
+     * is changed.
      */
     fun getAnimatedProperties(): List<ComposeAnimatedProperty>
 
-    /**
-     * Get the list of [TransitionInfo].
-     * It changes if [state] is changed.
-     */
+    /** Get the list of [TransitionInfo]. It changes if [state] is changed. */
     fun getTransitions(stepMillis: Long): List<TransitionInfo>
 
-    /**
-     * Set clock time for the animation.
-     */
+    /** Set clock time for the animation. */
     fun setClockTime(animationTimeNanos: Long)
 
     /**
-     * Setter for [state] can be removed.
-     * [setStateParameters] allows to update [state] in that case.
+     * Setter for [state] can be removed. [setStateParameters] allows to update [state] in that
+     * case.
      */
     fun setStateParameters(par1: Any, par2: Any? = null)
 }
diff --git a/compose/ui/ui-tooling/src/androidMain/kotlin/androidx/compose/ui/tooling/animation/clock/InfiniteTransitionClock.android.kt b/compose/ui/ui-tooling/src/androidMain/kotlin/androidx/compose/ui/tooling/animation/clock/InfiniteTransitionClock.android.kt
index 50572b8..3a838f0 100644
--- a/compose/ui/ui-tooling/src/androidMain/kotlin/androidx/compose/ui/tooling/animation/clock/InfiniteTransitionClock.android.kt
+++ b/compose/ui/ui-tooling/src/androidMain/kotlin/androidx/compose/ui/tooling/animation/clock/InfiniteTransitionClock.android.kt
@@ -30,13 +30,12 @@
 /**
  * [ComposeAnimationClock] for [InfiniteTransition] animations.
  *
- *  @sample androidx.compose.animation.samples.InfiniteTransitionSample
+ * @sample androidx.compose.animation.samples.InfiniteTransitionSample
  */
 internal class InfiniteTransitionClock(
     override val animation: InfiniteTransitionComposeAnimation,
     private val maxDuration: () -> Long = { 0 }
-) :
-    ComposeAnimationClock<InfiniteTransitionComposeAnimation, TargetState<Any>> {
+) : ComposeAnimationClock<InfiniteTransitionComposeAnimation, TargetState<Any>> {
 
     /** [rememberInfiniteTransition] doesn't have a state. */
     override var state: TargetState<Any> = TargetState(0, 0)
@@ -44,18 +43,20 @@
     override fun setStateParameters(par1: Any, par2: Any?) {}
 
     override fun getAnimatedProperties(): List<ComposeAnimatedProperty> {
-        return animation.animationObject.animations.mapNotNull {
-            val value = it.value
-            value ?: return@mapNotNull null
-            ComposeAnimatedProperty(it.label, value)
-        }.filter { !IGNORE_TRANSITIONS.contains(it.label) }
+        return animation.animationObject.animations
+            .mapNotNull {
+                val value = it.value
+                value ?: return@mapNotNull null
+                ComposeAnimatedProperty(it.label, value)
+            }
+            .filter { !IGNORE_TRANSITIONS.contains(it.label) }
     }
 
     /** Max duration per iteration of the animation. */
     override fun getMaxDurationPerIteration(): Long {
-        return nanosToMillis(animation.animationObject.animations.maxOfOrNull {
-            it.getIterationDuration()
-        } ?: 0)
+        return nanosToMillis(
+            animation.animationObject.animations.maxOfOrNull { it.getIterationDuration() } ?: 0
+        )
     }
 
     /** Max duration of the animation. */
@@ -65,9 +66,10 @@
 
     override fun getTransitions(stepMillis: Long): List<TransitionInfo> {
         val transition = animation.animationObject
-        return transition.animations.map {
-            it.createTransitionInfo(stepMillis, getMaxDuration())
-        }.filter { !IGNORE_TRANSITIONS.contains(it.label) }.toList()
+        return transition.animations
+            .map { it.createTransitionInfo(stepMillis, getMaxDuration()) }
+            .filter { !IGNORE_TRANSITIONS.contains(it.label) }
+            .toList()
     }
 
     override fun setClockTime(animationTimeNanos: Long) {
diff --git a/compose/ui/ui-tooling/src/androidMain/kotlin/androidx/compose/ui/tooling/animation/clock/TransitionClock.android.kt b/compose/ui/ui-tooling/src/androidMain/kotlin/androidx/compose/ui/tooling/animation/clock/TransitionClock.android.kt
index 75efa36..90c1cbb 100644
--- a/compose/ui/ui-tooling/src/androidMain/kotlin/androidx/compose/ui/tooling/animation/clock/TransitionClock.android.kt
+++ b/compose/ui/ui-tooling/src/androidMain/kotlin/androidx/compose/ui/tooling/animation/clock/TransitionClock.android.kt
@@ -24,44 +24,47 @@
 import androidx.compose.ui.tooling.animation.states.TargetState
 
 /**
- * [ComposeAnimationClock] for [Transition] and [AnimatedContent] animations.
- * This clock also controls extension functions such as:
+ * [ComposeAnimationClock] for [Transition] and [AnimatedContent] animations. This clock also
+ * controls extension functions such as:
  * * Transition.AnimatedVisibility
  * * Transition.Crossfade
  * * Transition.AnimatedContent
  *
- *  @sample androidx.compose.animation.core.samples.GestureAnimationSample
- *  @sample androidx.compose.animation.samples.AnimatedVisibilityLazyColumnSample
- *  @sample androidx.compose.animation.samples.CrossfadeSample
- *  @sample androidx.compose.animation.samples.TransitionExtensionAnimatedContentSample
- *  @sample androidx.compose.animation.samples.AnimateIncrementDecrementSample
+ * @sample androidx.compose.animation.core.samples.GestureAnimationSample
+ *
+ * @sample androidx.compose.animation.samples.AnimatedVisibilityLazyColumnSample
+ *
+ * @sample androidx.compose.animation.samples.CrossfadeSample
+ *
+ * @sample androidx.compose.animation.samples.TransitionExtensionAnimatedContentSample
+ *
+ * @sample androidx.compose.animation.samples.AnimateIncrementDecrementSample
  */
 internal class TransitionClock<T>(override val animation: TransitionBasedAnimation<T>) :
     ComposeAnimationClock<TransitionBasedAnimation<T>, TargetState<T>> {
 
-    override var state = TargetState(
-        animation.animationObject.currentState,
-        animation.animationObject.targetState
-    )
+    override var state =
+        TargetState(animation.animationObject.currentState, animation.animationObject.targetState)
         set(value) {
             field = value
             setClockTime(0)
         }
 
     override fun setStateParameters(par1: Any, par2: Any?) {
-        parseParametersToValue(state.initial, par1, par2)?.let {
-            state = it
-        }
+        parseParametersToValue(state.initial, par1, par2)?.let { state = it }
     }
 
     override fun getAnimatedProperties(): List<ComposeAnimatedProperty> {
         // In case the transition have child transitions, make sure to return their
         // descendant animations as well.
-        return animation.animationObject.allAnimations().mapNotNull {
-            val value = it.value
-            value ?: return@mapNotNull null
-            ComposeAnimatedProperty(it.label, value)
-        }.filter { !IGNORE_TRANSITIONS.contains(it.label) }
+        return animation.animationObject
+            .allAnimations()
+            .mapNotNull {
+                val value = it.value
+                value ?: return@mapNotNull null
+                ComposeAnimatedProperty(it.label, value)
+            }
+            .filter { !IGNORE_TRANSITIONS.contains(it.label) }
     }
 
     override fun getMaxDurationPerIteration(): Long {
@@ -74,14 +77,17 @@
 
     override fun getTransitions(stepMillis: Long): List<TransitionInfo> {
         val transition = animation.animationObject
-        return transition.allAnimations().map {
-            it.createTransitionInfo(stepMillis)
-        }.filter { !IGNORE_TRANSITIONS.contains(it.label) }
+        return transition
+            .allAnimations()
+            .map { it.createTransitionInfo(stepMillis) }
+            .filter { !IGNORE_TRANSITIONS.contains(it.label) }
     }
 
     override fun setClockTime(animationTimeNanos: Long) {
         animation.animationObject.setPlaytimeAfterInitialAndTargetStateEstablished(
-            state.initial, state.target, animationTimeNanos
+            state.initial,
+            state.target,
+            animationTimeNanos
         )
     }
 }
diff --git a/compose/ui/ui-tooling/src/androidMain/kotlin/androidx/compose/ui/tooling/animation/clock/Utils.android.kt b/compose/ui/ui-tooling/src/androidMain/kotlin/androidx/compose/ui/tooling/animation/clock/Utils.android.kt
index d2a700f..b23a29a 100644
--- a/compose/ui/ui-tooling/src/androidMain/kotlin/androidx/compose/ui/tooling/animation/clock/Utils.android.kt
+++ b/compose/ui/ui-tooling/src/androidMain/kotlin/androidx/compose/ui/tooling/animation/clock/Utils.android.kt
@@ -42,14 +42,10 @@
 /** Animations can contain internal only transitions which should be ignored by tooling. */
 internal val IGNORE_TRANSITIONS = listOf("TransformOriginInterruptionHandling")
 
-/**
- * Converts the given time in nanoseconds to milliseconds, rounding up when needed.
- */
+/** Converts the given time in nanoseconds to milliseconds, rounding up when needed. */
 internal fun nanosToMillis(timeNs: Long) = (timeNs + 999_999) / 1_000_000
 
-/**
- * Converts the given time in milliseconds to nanoseconds.
- */
+/** Converts the given time in milliseconds to nanoseconds. */
 internal fun millisToNanos(timeMs: Long) = timeMs * 1_000_000L
 
 /**
@@ -66,23 +62,22 @@
  * * [TransitionInfo.startTimeMillis] is an animation delay if it has one.
  * * [TransitionInfo.endTimeMillis] is an animation duration as it's already includes the delay.
  * * [TransitionInfo.specType] is a java class name of the spec.
- * * [TransitionInfo.values] a map of animation values from [TransitionInfo.startTimeMillis]
- * to [TransitionInfo.endTimeMillis] with [stepMs] sampling.
+ * * [TransitionInfo.values] a map of animation values from [TransitionInfo.startTimeMillis] to
+ *   [TransitionInfo.endTimeMillis] with [stepMs] sampling.
  */
-internal fun <T, V : AnimationVector, S>
-    Transition<S>.TransitionAnimationState<T, V>.createTransitionInfo(stepMs: Long = 1):
-    TransitionInfo = animation.createTransitionInfo(label, animationSpec, stepMs)
+internal fun <T, V : AnimationVector, S> Transition<S>.TransitionAnimationState<T, V>
+    .createTransitionInfo(stepMs: Long = 1): TransitionInfo =
+    animation.createTransitionInfo(label, animationSpec, stepMs)
 
 /**
  * Creates [TransitionInfo] for [Animation].
  * * [TransitionInfo.startTimeMillis] is an animation delay if it has one.
  * * [TransitionInfo.endTimeMillis] is an animation duration as it's already includes the delay.
  * * [TransitionInfo.specType] is a java class name of the spec.
- * * [TransitionInfo.values] a map of animation values from [TransitionInfo.startTimeMillis]
- * to [TransitionInfo.endTimeMillis] with [stepMs] sampling.
+ * * [TransitionInfo.values] a map of animation values from [TransitionInfo.startTimeMillis] to
+ *   [TransitionInfo.endTimeMillis] with [stepMs] sampling.
  */
-internal fun <T, V : AnimationVector>
-    Animation<T, V>.createTransitionInfo(
+internal fun <T, V : AnimationVector> Animation<T, V>.createTransitionInfo(
     label: String,
     animationSpec: AnimationSpec<T>,
     stepMs: Long = 1
@@ -98,13 +93,11 @@
                     animationSpec.initialStartOffset.offsetMillis
                 else 0L
             }
-
             is InfiniteRepeatableSpec<*> -> {
                 if (animationSpec.initialStartOffset.offsetType == StartOffsetType.Delay)
                     animationSpec.initialStartOffset.offsetMillis
                 else 0L
             }
-
             is VectorizedDurationBasedAnimationSpec<*> -> animationSpec.delayMillis
             else -> 0L
         }.toLong()
@@ -112,9 +105,7 @@
     val values: Map<Long, T> by lazy {
         val values: MutableMap<Long, T> = mutableMapOf()
         // Always add start and end points.
-        values[startTimeMs] = this.getValueFromNanos(
-            millisToNanos(startTimeMs)
-        )
+        values[startTimeMs] = this.getValueFromNanos(millisToNanos(startTimeMs))
         values[endTimeMs] = this.getValueFromNanos(millisToNanos(endTimeMs))
 
         var millis = startTimeMs
@@ -124,27 +115,17 @@
         }
         values
     }
-    return TransitionInfo(
-        label, animationSpec.javaClass.name,
-        startTimeMs, endTimeMs, values
-    )
+    return TransitionInfo(label, animationSpec.javaClass.name, startTimeMs, endTimeMs, values)
 }
 
-/**
- * Creates [TransitionInfo] for [InfiniteTransition.TransitionAnimationState].
- */
-internal fun <T, V : AnimationVector>
-    InfiniteTransition.TransitionAnimationState<T, V>.createTransitionInfo(
-    stepMs: Long = 1,
-    endTimeMs: Long
-): TransitionInfo {
+/** Creates [TransitionInfo] for [InfiniteTransition.TransitionAnimationState]. */
+internal fun <T, V : AnimationVector> InfiniteTransition.TransitionAnimationState<T, V>
+    .createTransitionInfo(stepMs: Long = 1, endTimeMs: Long): TransitionInfo {
     val startTimeMs: Long = 0
     val values: Map<Long, T> by lazy {
         val values: MutableMap<Long, T> = mutableMapOf()
         // Always add start and end points.
-        values[startTimeMs] = this.animation.getValueFromNanos(
-            millisToNanos(startTimeMs)
-        )
+        values[startTimeMs] = this.animation.getValueFromNanos(millisToNanos(startTimeMs))
         values[endTimeMs] = this.animation.getValueFromNanos(millisToNanos(endTimeMs))
 
         var millis = startTimeMs
@@ -154,10 +135,7 @@
         }
         values
     }
-    return TransitionInfo(
-        label, animationSpec.javaClass.name,
-        startTimeMs, endTimeMs, values
-    )
+    return TransitionInfo(label, animationSpec.javaClass.name, startTimeMs, endTimeMs, values)
 }
 
 /**
@@ -185,16 +163,17 @@
 
     fun parseDp(par1: Any, par2: Any?): TargetState<Dp>? {
         if (currentValue !is Dp || par2 == null) return null
-        return if (par1 is Dp && par2 is Dp)
-            TargetState(par1, par2) else {
+        return if (par1 is Dp && par2 is Dp) TargetState(par1, par2)
+        else {
             val dp1 = getDp(par1)
             val dp2 = getDp(par2)
-            if (dp1 != null && dp2 != null)
-                TargetState(dp1, dp2) else null
+            if (dp1 != null && dp2 != null) TargetState(dp1, dp2) else null
         }
     }
     // Dp could be presented as Float/Double/Int - try to parse it.
-    parseDp(par1, par2)?.let { return it as TargetState<T> }
+    parseDp(par1, par2)?.let {
+        return it as TargetState<T>
+    }
 
     if (!parametersAreValid(par1, par2)) return null
 
@@ -205,26 +184,26 @@
     if (par1 is List<*> && par2 is List<*>) {
         try {
             return when (currentValue) {
-                is IntSize -> TargetState(
-                    IntSize(par1[0] as Int, par1[1] as Int),
-                    IntSize(par2[0] as Int, par2[1] as Int)
-                )
-
-                is IntOffset -> TargetState(
-                    IntOffset(par1[0] as Int, par1[1] as Int),
-                    IntOffset(par2[0] as Int, par2[1] as Int)
-                )
-
-                is Size -> TargetState(
-                    Size(par1[0] as Float, par1[1] as Float),
-                    Size(par2[0] as Float, par2[1] as Float)
-                )
-
-                is Offset -> TargetState(
-                    Offset(par1[0] as Float, par1[1] as Float),
-                    Offset(par2[0] as Float, par2[1] as Float)
-                )
-
+                is IntSize ->
+                    TargetState(
+                        IntSize(par1[0] as Int, par1[1] as Int),
+                        IntSize(par2[0] as Int, par2[1] as Int)
+                    )
+                is IntOffset ->
+                    TargetState(
+                        IntOffset(par1[0] as Int, par1[1] as Int),
+                        IntOffset(par2[0] as Int, par2[1] as Int)
+                    )
+                is Size ->
+                    TargetState(
+                        Size(par1[0] as Float, par1[1] as Float),
+                        Size(par2[0] as Float, par2[1] as Float)
+                    )
+                is Offset ->
+                    TargetState(
+                        Offset(par1[0] as Float, par1[1] as Float),
+                        Offset(par2[0] as Float, par2[1] as Float)
+                    )
                 is Rect ->
                     TargetState(
                         Rect(
@@ -240,32 +219,32 @@
                             par2[3] as Float
                         ),
                     )
-
-                is Color -> TargetState(
-                    Color(
-                        par1[0] as Float,
-                        par1[1] as Float,
-                        par1[2] as Float,
-                        par1[3] as Float
-                    ),
-                    Color(
-                        par2[0] as Float,
-                        par2[1] as Float,
-                        par2[2] as Float,
-                        par2[3] as Float
-                    ),
-                )
-
-                is Dp ->
-                    parseDp(par1[0]!!, par2[0]!!)
-
+                is Color ->
+                    TargetState(
+                        Color(
+                            par1[0] as Float,
+                            par1[1] as Float,
+                            par1[2] as Float,
+                            par1[3] as Float
+                        ),
+                        Color(
+                            par2[0] as Float,
+                            par2[1] as Float,
+                            par2[2] as Float,
+                            par2[3] as Float
+                        ),
+                    )
+                is Dp -> parseDp(par1[0]!!, par2[0]!!)
                 else -> {
-                    if (parametersAreValid(par1[0], par2[0]) &&
-                        parametersHasTheSameType(currentValue, par1[0]!!, par2[0]!!)
-                    ) TargetState(par1[0], par2[0])
+                    if (
+                        parametersAreValid(par1[0], par2[0]) &&
+                            parametersHasTheSameType(currentValue, par1[0]!!, par2[0]!!)
+                    )
+                        TargetState(par1[0], par2[0])
                     else return null
                 }
-            } as TargetState<T>
+            }
+                as TargetState<T>
         } catch (_: IndexOutOfBoundsException) {
             return null
         } catch (_: ClassCastException) {
diff --git a/compose/ui/ui-tooling/src/desktopMain/kotlin/androidx/compose/desktop/ui/tooling/preview/runtime/NonInteractivePreviewFacade.desktop.kt b/compose/ui/ui-tooling/src/desktopMain/kotlin/androidx/compose/desktop/ui/tooling/preview/runtime/NonInteractivePreviewFacade.desktop.kt
index 43b3ce5..a256c164 100644
--- a/compose/ui/ui-tooling/src/desktopMain/kotlin/androidx/compose/desktop/ui/tooling/preview/runtime/NonInteractivePreviewFacade.desktop.kt
+++ b/compose/ui/ui-tooling/src/desktopMain/kotlin/androidx/compose/desktop/ui/tooling/preview/runtime/NonInteractivePreviewFacade.desktop.kt
@@ -23,8 +23,8 @@
 import androidx.compose.ui.unit.Density
 
 /**
- * This class is used by Compose Desktop Intellij plugin
- * for the non-interactive preview functionality.
+ * This class is used by Compose Desktop Intellij plugin for the non-interactive preview
+ * functionality.
  *
  * The class is used via reflection.
  *
@@ -34,12 +34,12 @@
  * 3. When an updated preview is requested, the Intellij plugin requests a fresh build from Gradle
  *    and pulls an updated preview configuration from the build;
  * 4. The IDE plugin manages a separate preview host process;
- * 5. The IDE plugin requests a new frame from the preview host process, when needed (either when
- *    a user requests it explicitly or by resizing the preview tool window);
- * 6. When the preview process receives a preview request, it renders a new frame using this
- *    facade in an isolated classloader via reflection. The classloader is persisted between
- *    requests to minimize render time. Currently it is reused only if there are no changes in a
- *    preview classpath (a requested preview function or a requested frame size may differ).
+ * 5. The IDE plugin requests a new frame from the preview host process, when needed (either when a
+ *    user requests it explicitly or by resizing the preview tool window);
+ * 6. When the preview process receives a preview request, it renders a new frame using this facade
+ *    in an isolated classloader via reflection. The classloader is persisted between requests to
+ *    minimize render time. Currently it is reused only if there are no changes in a preview
+ *    classpath (a requested preview function or a requested frame size may differ).
  * 7. A rendered frame is sent back to the IDE plugin and is shown in the IDE as an image.
  */
 @Suppress("DEPRECATION", "unused")
diff --git a/compose/ui/ui-tooling/src/desktopMain/kotlin/androidx/compose/desktop/ui/tooling/preview/runtime/PreviewRunner.desktop.kt b/compose/ui/ui-tooling/src/desktopMain/kotlin/androidx/compose/desktop/ui/tooling/preview/runtime/PreviewRunner.desktop.kt
index 037308b..359ba6b 100644
--- a/compose/ui/ui-tooling/src/desktopMain/kotlin/androidx/compose/desktop/ui/tooling/preview/runtime/PreviewRunner.desktop.kt
+++ b/compose/ui/ui-tooling/src/desktopMain/kotlin/androidx/compose/desktop/ui/tooling/preview/runtime/PreviewRunner.desktop.kt
@@ -36,22 +36,23 @@
             val className = previewFqName.substringBeforeLast(".")
             val methodName = previewFqName.substringAfterLast(".")
 
-            previewComposition = @Composable {
-                // We need to delay the reflection instantiation of the class until we are in the
-                // composable to ensure all the right initialization has happened and the Composable
-                // class loads correctly.
-                androidx.compose.ui.tooling.ComposableInvoker.invokeComposable(
-                    className,
-                    methodName,
-                    currentComposer
-                )
-            }
+            previewComposition =
+                @Composable {
+                    // We need to delay the reflection instantiation of the class until we are in
+                    // the
+                    // composable to ensure all the right initialization has happened and the
+                    // Composable
+                    // class loads correctly.
+                    androidx.compose.ui.tooling.ComposableInvoker.invokeComposable(
+                        className,
+                        methodName,
+                        currentComposer
+                    )
+                }
 
             @OptIn(DelicateCoroutinesApi::class)
             GlobalScope.launchApplication {
-                Window(onCloseRequest = ::exitApplication) {
-                    previewComposition()
-                }
+                Window(onCloseRequest = ::exitApplication) { previewComposition() }
             }
         }
     }
diff --git a/compose/ui/ui-tooling/src/jvmMain/kotlin/androidx/compose/ui/tooling/ComposableInvoker.jvm.kt b/compose/ui/ui-tooling/src/jvmMain/kotlin/androidx/compose/ui/tooling/ComposableInvoker.jvm.kt
index 6818fad..7d6d8e5 100644
--- a/compose/ui/ui-tooling/src/jvmMain/kotlin/androidx/compose/ui/tooling/ComposableInvoker.jvm.kt
+++ b/compose/ui/ui-tooling/src/jvmMain/kotlin/androidx/compose/ui/tooling/ComposableInvoker.jvm.kt
@@ -22,41 +22,44 @@
 import java.lang.reflect.Modifier
 import kotlin.math.ceil
 
-/**
- * A utility object to invoke composable function by its name and containing class.
- */
+/** A utility object to invoke composable function by its name and containing class. */
 @Deprecated("Use androidx.compose.runtime.reflect.ComposableMethodInvoker instead")
 @ExperimentalComposeUiApi
 object ComposableInvoker {
 
     /**
-     *  Compares the parameter types taken from the composable method and checks if they are all compatible with
-     *  the types taken from the PreviewParameterProvider.
+     * Compares the parameter types taken from the composable method and checks if they are all
+     * compatible with the types taken from the PreviewParameterProvider.
      *
-     *  @param composableMethodTypes types of the Composable Method
-     *  @param previewParameterTypes types defined in the PreviewParameterProvider
-     *  @return true if every `composableMethodTypes[n]` are equal or assignable to `previewParameterTypes[n]`.
+     * @param composableMethodTypes types of the Composable Method
+     * @param previewParameterTypes types defined in the PreviewParameterProvider
+     * @return true if every `composableMethodTypes[n]` are equal or assignable to
+     *   `previewParameterTypes[n]`.
      */
     private fun areParameterTypesCompatible(
         composableMethodTypes: Array<Class<*>>,
         previewParameterTypes: Array<Class<*>>
-    ): Boolean = composableMethodTypes.size == previewParameterTypes.size &&
-            composableMethodTypes.mapIndexed { index, clazz ->
-                val composableParameterType = previewParameterTypes[index]
-                // We can't use [isAssignableFrom] if we have java primitives.
-                // Java primitives aren't equal to Java classes:
-                // comparing int with kotlin.Int or java.lang.Integer will return false.
-                // However, if we convert them both to a KClass they can be compared:
-                // int and java.lang.Integer will be both converted to Int
-                // see more: https://docs.oracle.com/javase/6/docs/api/java/lang/Class.html#isAssignableFrom(java.lang.Class)
-                clazz.kotlin == composableParameterType.kotlin ||
-                    clazz.isAssignableFrom(composableParameterType)
-            }.all { it }
+    ): Boolean =
+        composableMethodTypes.size == previewParameterTypes.size &&
+            composableMethodTypes
+                .mapIndexed { index, clazz ->
+                    val composableParameterType = previewParameterTypes[index]
+                    // We can't use [isAssignableFrom] if we have java primitives.
+                    // Java primitives aren't equal to Java classes:
+                    // comparing int with kotlin.Int or java.lang.Integer will return false.
+                    // However, if we convert them both to a KClass they can be compared:
+                    // int and java.lang.Integer will be both converted to Int
+                    // see more:
+                    // https://docs.oracle.com/javase/6/docs/api/java/lang/Class.html#isAssignableFrom(java.lang.Class)
+                    clazz.kotlin == composableParameterType.kotlin ||
+                        clazz.isAssignableFrom(composableParameterType)
+                }
+                .all { it }
 
     /**
-     * Takes the declared methods and accounts for compatible types so the signature does
-     * not need to exactly match. This allows finding method calls that use subclasses as parameters
-     * instead of the exact types.
+     * Takes the declared methods and accounts for compatible types so the signature does not need
+     * to exactly match. This allows finding method calls that use subclasses as parameters instead
+     * of the exact types.
      *
      * @return the compatible [Method] with the name [methodName]
      * @throws NoSuchMethodException if the method is not found
@@ -64,7 +67,8 @@
     private fun Array<Method>.findCompatibleComposeMethod(
         methodName: String,
         vararg args: Class<*>
-    ): Method = firstOrNull {
+    ): Method =
+        firstOrNull {
             (methodName == it.name || it.name.startsWith("$methodName-")) &&
                 // Methods with inlined classes as parameter will have the name mangled
                 // so we need to check for methodName-xxxx as well
@@ -115,17 +119,18 @@
      * Returns the default value for the [Class] type. This will be 0 for numeric types, false for
      * boolean, '0' for char and null for object references.
      */
-    private fun Class<*>.getDefaultValue(): Any? = when (name) {
-        "int" -> 0.toInt()
-        "short" -> 0.toShort()
-        "byte" -> 0.toByte()
-        "long" -> 0.toLong()
-        "double" -> 0.toDouble()
-        "float" -> 0.toFloat()
-        "boolean" -> false
-        "char" -> 0.toChar()
-        else -> null
-    }
+    private fun Class<*>.getDefaultValue(): Any? =
+        when (name) {
+            "int" -> 0.toInt()
+            "short" -> 0.toShort()
+            "byte" -> 0.toByte()
+            "long" -> 0.toLong()
+            "double" -> 0.toDouble()
+            "float" -> 0.toFloat()
+            "boolean" -> false
+            "char" -> 0.toChar()
+            else -> null
+        }
 
     /**
      * Calls the method on the given [instance]. If the method accepts default values, this function
@@ -141,43 +146,43 @@
         val realParams = composerIndex
         val thisParams = if (instance != null) 1 else 0
         val changedParams = changedParamCount(realParams, thisParams)
-        val totalParamsWithoutDefaults = realParams +
-            1 + // composer
-            changedParams
+        val totalParamsWithoutDefaults =
+            realParams +
+                1 + // composer
+                changedParams
         val totalParams = parameterTypes.size
         val isDefault = totalParams != totalParamsWithoutDefaults
-        val defaultParams = if (isDefault)
-            defaultParamCount(realParams)
-        else
-            0
+        val defaultParams = if (isDefault) defaultParamCount(realParams) else 0
 
         check(
             realParams +
                 1 + // composer
                 changedParams +
-                defaultParams ==
-                totalParams
-        ) { "params don't add up to total params" }
+                defaultParams == totalParams
+        ) {
+            "params don't add up to total params"
+        }
 
         val changedStartIndex = composerIndex + 1
         val defaultStartIndex = changedStartIndex + changedParams
 
-        val arguments = Array(totalParams) { idx ->
-            when (idx) {
-                // pass in "empty" value for all real parameters since we will be using defaults.
-                in 0 until realParams -> args.getOrElse(idx) {
-                    parameterTypes[idx].getDefaultValue()
+        val arguments =
+            Array(totalParams) { idx ->
+                when (idx) {
+                    // pass in "empty" value for all real parameters since we will be using
+                    // defaults.
+                    in 0 until realParams ->
+                        args.getOrElse(idx) { parameterTypes[idx].getDefaultValue() }
+                    // the composer is the first synthetic parameter
+                    composerIndex -> composer
+                    // since this is the root we don't need to be anything unique. 0 should suffice.
+                    // changed parameters should be 0 to indicate "uncertain"
+                    in changedStartIndex until defaultStartIndex -> 0
+                    // Default values mask, all parameters set to use defaults
+                    in defaultStartIndex until totalParams -> 0b111111111111111111111.toInt()
+                    else -> error("Unexpected index")
                 }
-                // the composer is the first synthetic parameter
-                composerIndex -> composer
-                // since this is the root we don't need to be anything unique. 0 should suffice.
-                // changed parameters should be 0 to indicate "uncertain"
-                in changedStartIndex until defaultStartIndex -> 0
-                // Default values mask, all parameters set to use defaults
-                in defaultStartIndex until totalParams -> 0b111111111111111111111.toInt()
-                else -> error("Unexpected index")
             }
-        }
         return invoke(instance, *arguments)
     }
 
@@ -187,21 +192,17 @@
     private fun changedParamCount(realValueParams: Int, thisParams: Int): Int {
         if (realValueParams == 0) return 1
         val totalParams = realValueParams + thisParams
-        return ceil(
-            totalParams.toDouble() / SLOTS_PER_INT.toDouble()
-        ).toInt()
+        return ceil(totalParams.toDouble() / SLOTS_PER_INT.toDouble()).toInt()
     }
 
     private fun defaultParamCount(realValueParams: Int): Int {
-        return ceil(
-            realValueParams.toDouble() / BITS_PER_INT.toDouble()
-        ).toInt()
+        return ceil(realValueParams.toDouble() / BITS_PER_INT.toDouble()).toInt()
     }
 
     /**
      * Invokes the given [methodName] belonging to the given [className]. The [methodName] is
-     * expected to be a Composable function.
-     * This method [args] will be forwarded to the Composable function.
+     * expected to be a Composable function. This method [args] will be forwarded to the Composable
+     * function.
      */
     @ExperimentalComposeUiApi
     fun invokeComposable(
@@ -212,8 +213,9 @@
     ) {
         try {
             val composableClass = Class.forName(className)
-            val method = composableClass.findComposableMethod(methodName, *args)
-                ?: throw NoSuchMethodException("Composable $className.$methodName not found")
+            val method =
+                composableClass.findComposableMethod(methodName, *args)
+                    ?: throw NoSuchMethodException("Composable $className.$methodName not found")
             method.isAccessible = true
 
             if (Modifier.isStatic(method.modifiers)) {
diff --git a/compose/ui/ui-unit/samples/src/main/java/androidx/compose/ui/unit/samples/DpSample.kt b/compose/ui/ui-unit/samples/src/main/java/androidx/compose/ui/unit/samples/DpSample.kt
index 9937c09..790f968 100644
--- a/compose/ui/ui-unit/samples/src/main/java/androidx/compose/ui/unit/samples/DpSample.kt
+++ b/compose/ui/ui-unit/samples/src/main/java/androidx/compose/ui/unit/samples/DpSample.kt
@@ -46,8 +46,6 @@
     val lineThickness = 6.dp
     Canvas(Modifier.fillMaxSize()) {
         val lineThicknessPx = lineThickness.toPx()
-        inset(lineThicknessPx / 2) {
-            drawRect(Color.Red, style = Stroke(lineThicknessPx))
-        }
+        inset(lineThicknessPx / 2) { drawRect(Color.Red, style = Stroke(lineThicknessPx)) }
     }
 }
diff --git a/compose/ui/ui-unit/src/androidInstrumentedTest/kotlin/androidx/compose/ui/unit/AndroidDensityTest.kt b/compose/ui/ui-unit/src/androidInstrumentedTest/kotlin/androidx/compose/ui/unit/AndroidDensityTest.kt
index d11b967..3142a31 100644
--- a/compose/ui/ui-unit/src/androidInstrumentedTest/kotlin/androidx/compose/ui/unit/AndroidDensityTest.kt
+++ b/compose/ui/ui-unit/src/androidInstrumentedTest/kotlin/androidx/compose/ui/unit/AndroidDensityTest.kt
@@ -26,49 +26,31 @@
 class AndroidDensityTest {
     private val density = Density(2f, 3f)
 
-    @Test
-    fun testDpToSp() = with(density) {
-        assertEquals(2.sp, 6.dp.toSp())
-    }
+    @Test fun testDpToSp() = with(density) { assertEquals(2.sp, 6.dp.toSp()) }
 
-    @Test
-    fun testTextUnitToPx() = with(density) {
-        assertEquals(6f, 1.sp.toPx(), 0.001f)
-    }
+    @Test fun testTextUnitToPx() = with(density) { assertEquals(6f, 1.sp.toPx(), 0.001f) }
 
     @Test(expected = IllegalStateException::class)
     fun testTextUnitToPxFail() {
-        with(density) {
-            1.em.toPx()
-        }
+        with(density) { 1.em.toPx() }
     }
 
     @Test
-    fun testTextRoundUnitToPx() = with(density) {
-        assertEquals(6, 1.sp.roundToPx())
-        assertEquals(6, 1.05.sp.roundToPx())
-        assertEquals(6, .95.sp.roundToPx())
-    }
+    fun testTextRoundUnitToPx() =
+        with(density) {
+            assertEquals(6, 1.sp.roundToPx())
+            assertEquals(6, 1.05.sp.roundToPx())
+            assertEquals(6, .95.sp.roundToPx())
+        }
 
     @Test(expected = IllegalStateException::class)
     fun testTextUnitRoundToPxFail() {
-        with(density) {
-            1.em.roundToPx()
-        }
+        with(density) { 1.em.roundToPx() }
     }
 
-    @Test
-    fun testTextUnitToDp() = with(density) {
-        assertEquals(3.dp, 1.sp.toDp())
-    }
+    @Test fun testTextUnitToDp() = with(density) { assertEquals(3.dp, 1.sp.toDp()) }
 
-    @Test
-    fun testIntToSp() = with(density) {
-        assertEquals(1.sp, 6.toSp())
-    }
+    @Test fun testIntToSp() = with(density) { assertEquals(1.sp, 6.toSp()) }
 
-    @Test
-    fun testFloatToSp() = with(density) {
-        assertEquals(1.sp, 6f.toSp())
-    }
+    @Test fun testFloatToSp() = with(density) { assertEquals(1.sp, 6f.toSp()) }
 }
diff --git a/compose/ui/ui-unit/src/androidInstrumentedTest/kotlin/androidx/compose/ui/unit/DpDeviceTest.kt b/compose/ui/ui-unit/src/androidInstrumentedTest/kotlin/androidx/compose/ui/unit/DpDeviceTest.kt
index e38840e..cd68962 100644
--- a/compose/ui/ui-unit/src/androidInstrumentedTest/kotlin/androidx/compose/ui/unit/DpDeviceTest.kt
+++ b/compose/ui/ui-unit/src/androidInstrumentedTest/kotlin/androidx/compose/ui/unit/DpDeviceTest.kt
@@ -31,9 +31,8 @@
 class DpDeviceTest {
     @Suppress("DEPRECATION")
     @get:Rule
-    val activityTestRule = androidx.test.rule.ActivityTestRule<TestActivity>(
-        TestActivity::class.java
-    )
+    val activityTestRule =
+        androidx.test.rule.ActivityTestRule<TestActivity>(TestActivity::class.java)
 
     private lateinit var activity: Activity
 
@@ -46,9 +45,7 @@
     fun dimensionCalculation() {
         val dm = activity.resources.displayMetrics
         val dp10InPx = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 10f, dm)
-        with(Density(activity)) {
-            assertEquals(dp10InPx, 10.dp.toPx(), 0.01f)
-        }
+        with(Density(activity)) { assertEquals(dp10InPx, 10.dp.toPx(), 0.01f) }
     }
 
     companion object {
diff --git a/compose/ui/ui-unit/src/androidInstrumentedTest/kotlin/androidx/compose/ui/unit/SpDeviceTest.kt b/compose/ui/ui-unit/src/androidInstrumentedTest/kotlin/androidx/compose/ui/unit/SpDeviceTest.kt
index 090c7fb..a3567e3 100644
--- a/compose/ui/ui-unit/src/androidInstrumentedTest/kotlin/androidx/compose/ui/unit/SpDeviceTest.kt
+++ b/compose/ui/ui-unit/src/androidInstrumentedTest/kotlin/androidx/compose/ui/unit/SpDeviceTest.kt
@@ -31,9 +31,8 @@
 class SpDeviceTest {
     @Suppress("DEPRECATION")
     @get:Rule
-    val activityTestRule = androidx.test.rule.ActivityTestRule<TestActivity>(
-        TestActivity::class.java
-    )
+    val activityTestRule =
+        androidx.test.rule.ActivityTestRule<TestActivity>(TestActivity::class.java)
 
     private lateinit var activity: Activity
 
diff --git a/compose/ui/ui-unit/src/androidInstrumentedTest/kotlin/androidx/compose/ui/unit/fontscaling/FontScaleConverterFactoryTest.kt b/compose/ui/ui-unit/src/androidInstrumentedTest/kotlin/androidx/compose/ui/unit/fontscaling/FontScaleConverterFactoryTest.kt
index bd8b9e4..59b3ca7 100644
--- a/compose/ui/ui-unit/src/androidInstrumentedTest/kotlin/androidx/compose/ui/unit/fontscaling/FontScaleConverterFactoryTest.kt
+++ b/compose/ui/ui-unit/src/androidInstrumentedTest/kotlin/androidx/compose/ui/unit/fontscaling/FontScaleConverterFactoryTest.kt
@@ -29,9 +29,7 @@
 import org.junit.Test
 import org.junit.runner.RunWith
 
-/**
- * Unit tests for FontScaleConverterFactory.
- */
+/** Unit tests for FontScaleConverterFactory. */
 @RunWith(AndroidJUnit4::class)
 class FontScaleConverterFactoryTest {
 
@@ -50,10 +48,9 @@
     @Test
     fun missingLookupTablePastEnd_returnsLinear() {
         val table = FontScaleConverterFactory.forScale(3F)!!
-        generateSequenceOfFractions(-10000f..10000f, step = 0.01f)
-            .map {
-                assertThat(table.convertSpToDp(it)).isWithin(CONVERSION_TOLERANCE).of(it * 3f)
-            }
+        generateSequenceOfFractions(-10000f..10000f, step = 0.01f).map {
+            assertThat(table.convertSpToDp(it)).isWithin(CONVERSION_TOLERANCE).of(it * 3f)
+        }
         assertThat(table.convertSpToDp(1F)).isWithin(CONVERSION_TOLERANCE).of(3f)
         assertThat(table.convertSpToDp(8F)).isWithin(CONVERSION_TOLERANCE).of(24f)
         assertThat(table.convertSpToDp(10F)).isWithin(CONVERSION_TOLERANCE).of(30f)
@@ -172,8 +169,7 @@
         assertThat(FontScaleConverterFactory.isNonLinearFontScalingActive(1.06f)).isTrue()
         assertThat(FontScaleConverterFactory.isNonLinearFontScalingActive(1.10f)).isTrue()
         assertThat(FontScaleConverterFactory.isNonLinearFontScalingActive(1.15f)).isTrue()
-        assertThat(FontScaleConverterFactory.isNonLinearFontScalingActive(1.1499999f))
-                .isTrue()
+        assertThat(FontScaleConverterFactory.isNonLinearFontScalingActive(1.1499999f)).isTrue()
         assertThat(FontScaleConverterFactory.isNonLinearFontScalingActive(1.5f)).isTrue()
         assertThat(FontScaleConverterFactory.isNonLinearFontScalingActive(2f)).isTrue()
         assertThat(FontScaleConverterFactory.isNonLinearFontScalingActive(3f)).isTrue()
@@ -189,7 +185,8 @@
                 val converter = FontScaleConverterFactory.forScale(fontScale)
                 val currentDp = converter?.convertSpToDp(fontSize) ?: (fontSize * fontScale)
 
-                assertWithMessage("Font Scale $fontScale and Size $fontSize").that(currentDp)
+                assertWithMessage("Font Scale $fontScale and Size $fontSize")
+                    .that(currentDp)
                     .isAtLeast(lastDp)
 
                 lastDp = currentDp
@@ -207,7 +204,8 @@
             wearFontSizes.forEach { fontSize ->
                 val currentDp = converter?.convertSpToDp(fontSize) ?: (fontSize * fontScale)
 
-                assertWithMessage("Font Scale $fontScale and Size $fontSize").that(currentDp)
+                assertWithMessage("Font Scale $fontScale and Size $fontSize")
+                    .that(currentDp)
                     .isAtLeast(lastDp)
 
                 lastDp = currentDp
@@ -222,9 +220,9 @@
             .fuzzFractions()
             .mapNotNull { FontScaleConverterFactory.forScale(it) }
             .flatMap { table ->
-                generateSequenceOfFractions(-2000f..2000f, step = 0.1f)
-                    .fuzzFractions()
-                    .map { Pair(table, it) }
+                generateSequenceOfFractions(-2000f..2000f, step = 0.1f).fuzzFractions().map {
+                    Pair(table, it)
+                }
             }
             .forEach { (table, sp) ->
                 try {
@@ -244,8 +242,7 @@
     @LargeTest
     @Test
     fun testGenerateSequenceOfFractions() {
-        val fractions = generateSequenceOfFractions(-1000f..1000f, step = 0.1f)
-            .toList()
+        val fractions = generateSequenceOfFractions(-1000f..1000f, step = 0.1f).toList()
         fractions.forEach {
             assertThat(it).isAtLeast(-1000f)
             assertThat(it).isAtMost(1000f)
@@ -273,9 +270,8 @@
     @Test
     fun testFuzzFractions() {
         val numFuzzedFractions = 6
-        val fractions = generateSequenceOfFractions(-1000f..1000f, step = 0.1f)
-            .fuzzFractions()
-            .toList()
+        val fractions =
+            generateSequenceOfFractions(-1000f..1000f, step = 0.1f).fuzzFractions().toList()
         fractions.forEach {
             assertThat(it).isAtLeast(-1000f)
             assertThat(it).isLessThan(1001f)
diff --git a/compose/ui/ui-unit/src/androidMain/kotlin/androidx/compose/ui/unit/AndroidDensity.android.kt b/compose/ui/ui-unit/src/androidMain/kotlin/androidx/compose/ui/unit/AndroidDensity.android.kt
index 37e1c09..a428a03 100644
--- a/compose/ui/ui-unit/src/androidMain/kotlin/androidx/compose/ui/unit/AndroidDensity.android.kt
+++ b/compose/ui/ui-unit/src/androidMain/kotlin/androidx/compose/ui/unit/AndroidDensity.android.kt
@@ -52,5 +52,6 @@
 
 private data class LinearFontScaleConverter(private val fontScale: Float) : FontScaleConverter {
     override fun convertSpToDp(sp: Float) = sp * fontScale
+
     override fun convertDpToSp(dp: Float) = dp / fontScale
 }
diff --git a/compose/ui/ui-unit/src/androidMain/kotlin/androidx/compose/ui/unit/FontScaling.android.kt b/compose/ui/ui-unit/src/androidMain/kotlin/androidx/compose/ui/unit/FontScaling.android.kt
index 40b856e..b5a8e00 100644
--- a/compose/ui/ui-unit/src/androidMain/kotlin/androidx/compose/ui/unit/FontScaling.android.kt
+++ b/compose/ui/ui-unit/src/androidMain/kotlin/androidx/compose/ui/unit/FontScaling.android.kt
@@ -31,15 +31,10 @@
 @Immutable
 @JvmDefaultWithCompatibility
 actual interface FontScaling {
-    /**
-     * Current user preference for the scaling factor for fonts.
-     */
-    @Stable
-    actual val fontScale: Float
+    /** Current user preference for the scaling factor for fonts. */
+    @Stable actual val fontScale: Float
 
-    /**
-     * Convert [Dp] to Sp. Sp is used for font size, etc.
-     */
+    /** Convert [Dp] to Sp. Sp is used for font size, etc. */
     @Stable
     actual fun Dp.toSp(): TextUnit {
         if (!FontScaleConverterFactory.isNonLinearFontScalingActive(fontScale)) {
@@ -52,6 +47,7 @@
 
     /**
      * Convert Sp to [Dp].
+     *
      * @throws IllegalStateException if TextUnit other than SP unit is specified.
      */
     @Stable
diff --git a/compose/ui/ui-unit/src/androidMain/kotlin/androidx/compose/ui/unit/fontscaling/FontScaleConverter.android.kt b/compose/ui/ui-unit/src/androidMain/kotlin/androidx/compose/ui/unit/fontscaling/FontScaleConverter.android.kt
index 9c2d2be..484a8d7 100644
--- a/compose/ui/ui-unit/src/androidMain/kotlin/androidx/compose/ui/unit/fontscaling/FontScaleConverter.android.kt
+++ b/compose/ui/ui-unit/src/androidMain/kotlin/androidx/compose/ui/unit/fontscaling/FontScaleConverter.android.kt
@@ -18,28 +18,22 @@
 import androidx.annotation.RestrictTo
 
 /**
- * A converter for non-linear font scaling. Converts font sizes given in "sp" dimensions to a
- * "dp" dimension according to a non-linear curve.
- *
+ * A converter for non-linear font scaling. Converts font sizes given in "sp" dimensions to a "dp"
+ * dimension according to a non-linear curve.
  *
  * This is meant to improve readability at larger font scales: larger fonts will scale up more
  * slowly than smaller fonts, so we don't get ridiculously huge fonts that don't fit on the screen.
  *
- *
- * The thinking here is that large fonts are already big enough to read, but we still want to
- * scale them slightly to preserve the visual hierarchy when compared to smaller fonts.
+ * The thinking here is that large fonts are already big enough to read, but we still want to scale
+ * them slightly to preserve the visual hierarchy when compared to smaller fonts.
  */
 // TODO(b/294384826): move these into core:core when the FontScaleConverter APIs are available.
 //  These are temporary shims until core and platform are in a stable state.
 @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
 interface FontScaleConverter {
-    /**
-     * Converts a dimension in "sp" to "dp".
-     */
+    /** Converts a dimension in "sp" to "dp". */
     fun convertSpToDp(sp: Float): Float
 
-    /**
-     * Converts a dimension in "dp" back to "sp".
-     */
+    /** Converts a dimension in "dp" back to "sp". */
     fun convertDpToSp(dp: Float): Float
 }
diff --git a/compose/ui/ui-unit/src/androidMain/kotlin/androidx/compose/ui/unit/fontscaling/FontScaleConverterFactory.android.kt b/compose/ui/ui-unit/src/androidMain/kotlin/androidx/compose/ui/unit/fontscaling/FontScaleConverterFactory.android.kt
index d0f0121..6f40712 100644
--- a/compose/ui/ui-unit/src/androidMain/kotlin/androidx/compose/ui/unit/fontscaling/FontScaleConverterFactory.android.kt
+++ b/compose/ui/ui-unit/src/androidMain/kotlin/androidx/compose/ui/unit/fontscaling/FontScaleConverterFactory.android.kt
@@ -105,9 +105,7 @@
      * Returns true if non-linear font scaling curves would be in effect for the given scale, false
      * if the scaling would follow a linear curve or for no scaling.
      *
-     *
-     * Example usage:
-     * `isNonLinearFontScalingActive(getResources().getConfiguration().fontScale)`
+     * Example usage: `isNonLinearFontScalingActive(getResources().getConfiguration().fontScale)`
      */
     @AnyThread
     fun isNonLinearFontScalingActive(fontScale: Float): Boolean {
@@ -118,7 +116,6 @@
      * Finds a matching FontScaleConverter for the given fontScale factor.
      *
      * @param fontScale the scale factor, usually from [Configuration.fontScale].
-     *
      * @return a converter for the given scale, or null if non-linear scaling should not be used.
      */
     @AnyThread
@@ -145,8 +142,7 @@
             // them a straight linear table instead.
             // This works because when FontScaleConverter encounters a size beyond its bounds, it
             // calculates a linear fontScale factor using the ratio of the last element pair.
-            val converter =
-                FontScaleConverterTable(floatArrayOf(1f), floatArrayOf(fontScale))
+            val converter = FontScaleConverterTable(floatArrayOf(1f), floatArrayOf(fontScale))
 
             // Cache for next time.
             put(fontScale, converter)
@@ -160,14 +156,10 @@
                 startScale = 1f
                 startTable = FontScaleConverterTable(CommonFontSizes, CommonFontSizes)
             } else {
-                startScale = getScaleFromKey(
-                    sLookupTables.keyAt(lowerIndex)
-                )
+                startScale = getScaleFromKey(sLookupTables.keyAt(lowerIndex))
                 startTable = sLookupTables.valueAt(lowerIndex)
             }
-            val endScale = getScaleFromKey(
-                sLookupTables.keyAt(higherIndex)
-            )
+            val endScale = getScaleFromKey(sLookupTables.keyAt(higherIndex))
             val interpolationPoint =
                 MathUtils.constrainedMap(
                     rangeMin = 0f,
@@ -176,11 +168,12 @@
                     endScale,
                     fontScale
                 )
-            val converter = createInterpolatedTableBetween(
-                startTable,
-                sLookupTables.valueAt(higherIndex),
-                interpolationPoint
-            )
+            val converter =
+                createInterpolatedTableBetween(
+                    startTable,
+                    sLookupTables.valueAt(higherIndex),
+                    interpolationPoint
+                )
 
             // Cache for next time.
             put(fontScale, converter)
diff --git a/compose/ui/ui-unit/src/androidMain/kotlin/androidx/compose/ui/unit/fontscaling/FontScaleConverterTable.android.kt b/compose/ui/ui-unit/src/androidMain/kotlin/androidx/compose/ui/unit/fontscaling/FontScaleConverterTable.android.kt
index c365889..b874986 100644
--- a/compose/ui/ui-unit/src/androidMain/kotlin/androidx/compose/ui/unit/fontscaling/FontScaleConverterTable.android.kt
+++ b/compose/ui/ui-unit/src/androidMain/kotlin/androidx/compose/ui/unit/fontscaling/FontScaleConverterTable.android.kt
@@ -29,7 +29,8 @@
 // TODO(b/294384826): move these into core:core when the FontScaleConverter APIs are available.
 //  These are temporary shims until core and platform are in a stable state.
 @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
-class FontScaleConverterTable @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
+class FontScaleConverterTable
+@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
 /**
  * Creates a lookup table for the given conversions.
  *
@@ -39,18 +40,12 @@
  *
  * @param fromSp array of dimensions in SP
  * @param toDp array of dimensions in DP that correspond to an SP value in fromSp
- *
  * @throws IllegalArgumentException if the array lengths don't match or are empty
  */
-constructor(
-    fromSp: FloatArray,
-    toDp: FloatArray
-) : FontScaleConverter {
-    @VisibleForTesting
-    val mFromSpValues: FloatArray
+constructor(fromSp: FloatArray, toDp: FloatArray) : FontScaleConverter {
+    @VisibleForTesting val mFromSpValues: FloatArray
 
-    @VisibleForTesting
-    val mToDpValues: FloatArray
+    @VisibleForTesting val mToDpValues: FloatArray
 
     init {
         require(!(fromSp.size != toDp.size || fromSp.isEmpty())) {
@@ -84,8 +79,10 @@
 
     override fun toString(): String {
         return ("FontScaleConverter{" +
-            "fromSpValues=" + mFromSpValues.contentToString() +
-            ", toDpValues=" + mToDpValues.contentToString() +
+            "fromSpValues=" +
+            mFromSpValues.contentToString() +
+            ", toDpValues=" +
+            mToDpValues.contentToString() +
             '}')
     }
 
@@ -98,7 +95,8 @@
             val sourceValuePositive = Math.abs(sourceValue)
             // TODO(b/247861374): find a match at a higher index?
             val sign = sign(sourceValue)
-            // We search for exact matches only, even if it's just a little off. The interpolation will
+            // We search for exact matches only, even if it's just a little off. The interpolation
+            // will
             // handle any non-exact matches.
             val index = Arrays.binarySearch(sourceValues, sourceValuePositive)
             return if (index >= 0) {
@@ -112,7 +110,8 @@
                 val startDp: Float
                 val endDp: Float
                 if (lowerIndex >= sourceValues.size - 1) {
-                    // It's past our lookup table. Determine the last elements' scaling factor and use.
+                    // It's past our lookup table. Determine the last elements' scaling factor and
+                    // use.
                     startSp = sourceValues[sourceValues.size - 1]
                     startDp = targetValues[sourceValues.size - 1]
                     if (startSp == 0f) return 0f
@@ -130,13 +129,7 @@
                     startDp = targetValues[lowerIndex]
                     endDp = targetValues[lowerIndex + 1]
                 }
-                sign * MathUtils.constrainedMap(
-                    startDp,
-                    endDp,
-                    startSp,
-                    endSp,
-                    sourceValuePositive
-                )
+                sign * MathUtils.constrainedMap(startDp, endDp, startSp, endSp, sourceValuePositive)
             }
         }
     }
diff --git a/compose/ui/ui-unit/src/androidMain/kotlin/androidx/compose/ui/unit/fontscaling/MathUtils.android.kt b/compose/ui/ui-unit/src/androidMain/kotlin/androidx/compose/ui/unit/fontscaling/MathUtils.android.kt
index 01823f0..d54f4ea 100644
--- a/compose/ui/ui-unit/src/androidMain/kotlin/androidx/compose/ui/unit/fontscaling/MathUtils.android.kt
+++ b/compose/ui/ui-unit/src/androidMain/kotlin/androidx/compose/ui/unit/fontscaling/MathUtils.android.kt
@@ -17,9 +17,7 @@
 
 import androidx.annotation.RestrictTo
 
-/**
- * A utility class providing functions useful for common mathematical operations.
- */
+/** A utility class providing functions useful for common mathematical operations. */
 // TODO(b/294384826): move these into core:core when the FontScaleConverter APIs are available.
 //  These are temporary shims until core and platform are in a stable state.
 @RestrictTo(RestrictTo.Scope.LIBRARY)
@@ -36,10 +34,8 @@
     }
 
     /**
-     * Inverse of [.lerp]. More precisely, returns the interpolation
-     * scalar (s) that satisfies the equation:
-     * `value = `[ ][.lerp]`(a, b, s)`
-     *
+     * Inverse of [.lerp]. More precisely, returns the interpolation scalar (s) that satisfies the
+     * equation: `value = `[ ][.lerp]`(a, b, s)`
      *
      * If `a == b`, then this function will return 0.
      */
@@ -51,23 +47,19 @@
      * Calculates a value in [rangeMin, rangeMax] that maps value in [valueMin, valueMax] to
      * returnVal in [rangeMin, rangeMax].
      *
-     *
      * Always returns a constrained value in the range [rangeMin, rangeMax], even if value is
      * outside [valueMin, valueMax].
      *
-     *
-     * Eg:
-     * constrainedMap(0f, 100f, 0f, 1f, 0.5f) = 50f
-     * constrainedMap(20f, 200f, 10f, 20f, 20f) = 200f
-     * constrainedMap(20f, 200f, 10f, 20f, 50f) = 200f
-     * constrainedMap(10f, 50f, 10f, 20f, 5f) = 10f
+     * Eg: constrainedMap(0f, 100f, 0f, 1f, 0.5f) = 50f constrainedMap(20f, 200f, 10f, 20f, 20f) =
+     * 200f constrainedMap(20f, 200f, 10f, 20f, 50f) = 200f constrainedMap(10f, 50f, 10f, 20f, 5f) =
+     * 10f
      *
      * @param rangeMin minimum of the range that should be returned.
      * @param rangeMax maximum of the range that should be returned.
      * @param valueMin minimum of range to map `value` to.
      * @param valueMax maximum of range to map `value` to.
-     * @param value to map to the range [`valueMin`, `valueMax`]. Note, can be outside
-     * this range, resulting in a clamped value.
+     * @param value to map to the range [`valueMin`, `valueMax`]. Note, can be outside this range,
+     *   resulting in a clamped value.
      * @return the mapped value, constrained to [`rangeMin`, `rangeMax`.
      */
     fun constrainedMap(
@@ -78,7 +70,8 @@
         value: Float
     ): Float {
         return lerp(
-            rangeMin, rangeMax,
+            rangeMin,
+            rangeMax,
             Math.max(0f, Math.min(1f, lerpInv(valueMin, valueMax, value)))
         )
     }
diff --git a/compose/ui/ui-unit/src/androidUnitTest/kotlin/androidx/compose/ui/unit/DensityTest.kt b/compose/ui/ui-unit/src/androidUnitTest/kotlin/androidx/compose/ui/unit/DensityTest.kt
index 3fd407d..00d5fa4 100644
--- a/compose/ui/ui-unit/src/androidUnitTest/kotlin/androidx/compose/ui/unit/DensityTest.kt
+++ b/compose/ui/ui-unit/src/androidUnitTest/kotlin/androidx/compose/ui/unit/DensityTest.kt
@@ -33,54 +33,43 @@
         assertEquals(3f, density.fontScale, 0.001f)
     }
 
-    @Test
-    fun testDpToPx() = with(density) {
-        assertEquals(2f, 1.dp.toPx(), 0.001f)
-    }
+    @Test fun testDpToPx() = with(density) { assertEquals(2f, 1.dp.toPx(), 0.001f) }
 
     @Test
-    fun testDpRoundToPx() = with(density) {
-        assertEquals(10, 4.95.dp.roundToPx())
-        assertEquals(10, 4.75.dp.roundToPx())
-        assertEquals(9, 4.74.dp.roundToPx())
-    }
+    fun testDpRoundToPx() =
+        with(density) {
+            assertEquals(10, 4.95.dp.roundToPx())
+            assertEquals(10, 4.75.dp.roundToPx())
+            assertEquals(9, 4.74.dp.roundToPx())
+        }
+
+    @Test fun testIntToDp() = with(density) { assertEquals(1.dp, 2.toDp()) }
+
+    @Test fun testFloatToDp() = with(density) { assertEquals(1.dp, 2f.toDp()) }
 
     @Test
-    fun testIntToDp() = with(density) {
-        assertEquals(1.dp, 2.toDp())
-    }
+    fun testDpRectToRect() =
+        with(density) {
+            val rect = DpRect(1.dp, 2.dp, 3.dp, 4.dp).toRect()
+            assertEquals(2f, rect.left, 0.001f)
+            assertEquals(4f, rect.top, 0.001f)
+            assertEquals(6f, rect.right, 0.001f)
+            assertEquals(8f, rect.bottom, 0.001f)
+        }
 
     @Test
-    fun testFloatToDp() = with(density) {
-        assertEquals(1.dp, 2f.toDp())
-    }
+    fun testDpSizeToSize() =
+        with(density) { assertEquals(Size(2f, 6f), DpSize(1.dp, 3.dp).toSize()) }
 
     @Test
-    fun testDpRectToRect() = with(density) {
-        val rect = DpRect(1.dp, 2.dp, 3.dp, 4.dp).toRect()
-        assertEquals(2f, rect.left, 0.001f)
-        assertEquals(4f, rect.top, 0.001f)
-        assertEquals(6f, rect.right, 0.001f)
-        assertEquals(8f, rect.bottom, 0.001f)
-    }
+    fun testSizeToDpSize() =
+        with(density) { assertEquals(DpSize(1.dp, 3.dp), Size(2f, 6f).toDpSize()) }
 
     @Test
-    fun testDpSizeToSize() = with(density) {
-        assertEquals(Size(2f, 6f), DpSize(1.dp, 3.dp).toSize())
-    }
+    fun testDpSizeUnspecifiedToSize() =
+        with(density) { assertEquals(Size.Unspecified, DpSize.Unspecified.toSize()) }
 
     @Test
-    fun testSizeToDpSize() = with(density) {
-        assertEquals(DpSize(1.dp, 3.dp), Size(2f, 6f).toDpSize())
-    }
-
-    @Test
-    fun testDpSizeUnspecifiedToSize() = with(density) {
-        assertEquals(Size.Unspecified, DpSize.Unspecified.toSize())
-    }
-
-    @Test
-    fun testSizeUnspecifiedToDpSize() = with(density) {
-        assertEquals(DpSize.Unspecified, Size.Unspecified.toDpSize())
-    }
+    fun testSizeUnspecifiedToDpSize() =
+        with(density) { assertEquals(DpSize.Unspecified, Size.Unspecified.toDpSize()) }
 }
diff --git a/compose/ui/ui-unit/src/androidUnitTest/kotlin/androidx/compose/ui/unit/IntRectTest.kt b/compose/ui/ui-unit/src/androidUnitTest/kotlin/androidx/compose/ui/unit/IntRectTest.kt
index 2dd9332..5c57499 100644
--- a/compose/ui/ui-unit/src/androidUnitTest/kotlin/androidx/compose/ui/unit/IntRectTest.kt
+++ b/compose/ui/ui-unit/src/androidUnitTest/kotlin/androidx/compose/ui/unit/IntRectTest.kt
@@ -58,10 +58,7 @@
 
     @Test
     fun `rect size`() {
-        Assert.assertEquals(
-            IntSize(210, 290),
-            IntRect(70, 10, 280, 300).size
-        )
+        Assert.assertEquals(IntSize(210, 290), IntRect(70, 10, 280, 300).size)
     }
 
     @Test
@@ -100,9 +97,7 @@
 
     @Test
     fun `rect intersect`() {
-        val intersected = IntRect(0, 0, 20, 20).intersect(
-            IntRect(10, 10, 30, 30)
-        )
+        val intersected = IntRect(0, 0, 20, 20).intersect(IntRect(10, 10, 30, 30))
         Assert.assertEquals(IntRect(10, 10, 20, 20), intersected)
     }
 
@@ -231,18 +226,12 @@
         val rect1 = IntRect(0, 0, 100, 100)
         val rect2 = IntRect(50, 50, 200, 200)
 
-        Assert.assertEquals(
-            IntRect(25, 25, 150, 150),
-            lerp(rect1, rect2, 0.5f)
-        )
+        Assert.assertEquals(IntRect(25, 25, 150, 150), lerp(rect1, rect2, 0.5f))
     }
 
     @Test
     fun `to Rect`() {
-        Assert.assertEquals(
-            Rect(25.0f, 25.0f, 150.0f, 150.0f),
-            IntRect(25, 25, 150, 150).toRect()
-        )
+        Assert.assertEquals(Rect(25.0f, 25.0f, 150.0f, 150.0f), IntRect(25, 25, 150, 150).toRect())
     }
 
     @Test
diff --git a/compose/ui/ui-unit/src/androidUnitTest/kotlin/androidx/compose/ui/unit/TextUnitTest.kt b/compose/ui/ui-unit/src/androidUnitTest/kotlin/androidx/compose/ui/unit/TextUnitTest.kt
index 5346f73..138ff7b 100644
--- a/compose/ui/ui-unit/src/androidUnitTest/kotlin/androidx/compose/ui/unit/TextUnitTest.kt
+++ b/compose/ui/ui-unit/src/androidUnitTest/kotlin/androidx/compose/ui/unit/TextUnitTest.kt
@@ -23,7 +23,6 @@
 import org.junit.runners.JUnit4
 
 @Suppress("Deprecation")
-
 @RunWith(JUnit4::class)
 class TextUnitTest {
     @Test
diff --git a/compose/ui/ui-unit/src/androidUnitTest/kotlin/androidx/compose/ui/unit/VelocityTest.kt b/compose/ui/ui-unit/src/androidUnitTest/kotlin/androidx/compose/ui/unit/VelocityTest.kt
index 1e21c71..8c915a6 100644
--- a/compose/ui/ui-unit/src/androidUnitTest/kotlin/androidx/compose/ui/unit/VelocityTest.kt
+++ b/compose/ui/ui-unit/src/androidUnitTest/kotlin/androidx/compose/ui/unit/VelocityTest.kt
@@ -29,44 +29,35 @@
 
     @Test
     fun operatorUnaryMinus() {
-        Truth.assertThat(-velocity1)
-            .isEqualTo(Velocity(-3f, 7f))
-        Truth.assertThat(-velocity2)
-            .isEqualTo(Velocity(-5f, -13f))
+        Truth.assertThat(-velocity1).isEqualTo(Velocity(-3f, 7f))
+        Truth.assertThat(-velocity2).isEqualTo(Velocity(-5f, -13f))
     }
 
     @Test
     fun operatorPlus() {
-        Truth.assertThat(velocity2 + velocity1)
-            .isEqualTo(Velocity(8f, 6f))
-        Truth.assertThat(velocity1 + velocity2)
-            .isEqualTo(Velocity(8f, 6f))
+        Truth.assertThat(velocity2 + velocity1).isEqualTo(Velocity(8f, 6f))
+        Truth.assertThat(velocity1 + velocity2).isEqualTo(Velocity(8f, 6f))
     }
 
     @Test
     fun operatorMinus() {
-        Truth.assertThat(velocity1 - velocity2)
-            .isEqualTo(Velocity(-2f, -20f))
-        Truth.assertThat(velocity2 - velocity1)
-            .isEqualTo(Velocity(2f, 20f))
+        Truth.assertThat(velocity1 - velocity2).isEqualTo(Velocity(-2f, -20f))
+        Truth.assertThat(velocity2 - velocity1).isEqualTo(Velocity(2f, 20f))
     }
 
     @Test
     fun operatorDivide() {
-        Truth.assertThat(velocity1 / 10f)
-            .isEqualTo(Velocity(0.3f, -0.7f))
+        Truth.assertThat(velocity1 / 10f).isEqualTo(Velocity(0.3f, -0.7f))
     }
 
     @Test
     fun operatorTimes() {
-        Truth.assertThat(velocity1 * 10f)
-            .isEqualTo(Velocity(30f, -70f))
+        Truth.assertThat(velocity1 * 10f).isEqualTo(Velocity(30f, -70f))
     }
 
     @Test
     fun operatorRem() {
-        Truth.assertThat(velocity1 % 3f)
-            .isEqualTo(Velocity(0f, -1f))
+        Truth.assertThat(velocity1 % 3f).isEqualTo(Velocity(0f, -1f))
     }
 
     @Test
diff --git a/compose/ui/ui-unit/src/commonMain/kotlin/androidx/compose/ui/unit/Constraints.kt b/compose/ui/ui-unit/src/commonMain/kotlin/androidx/compose/ui/unit/Constraints.kt
index 16ae60a..85375b6 100644
--- a/compose/ui/ui-unit/src/commonMain/kotlin/androidx/compose/ui/unit/Constraints.kt
+++ b/compose/ui/ui-unit/src/commonMain/kotlin/androidx/compose/ui/unit/Constraints.kt
@@ -25,9 +25,8 @@
 /**
  * Immutable constraints for measuring layouts, used by [layouts][androidx.compose.ui.layout.Layout]
  * or [layout modifiers][androidx.compose.ui.layout.LayoutModifier] to measure their layout
- * children. The parent chooses the [Constraints] defining a range, in pixels, within which
- * the measured layout should choose a size:
- *
+ * children. The parent chooses the [Constraints] defining a range, in pixels, within which the
+ * measured layout should choose a size:
  * - `minWidth` <= `chosenWidth` <= `maxWidth`
  * - `minHeight` <= `chosenHeight` <= `maxHeight`
  *
@@ -35,28 +34,25 @@
  * [androidx.compose.ui.layout.MeasurePolicy] or
  * [androidx.compose.ui.layout.LayoutModifier.measure].
  *
- * A set of [Constraints] can have infinite maxWidth and/or maxHeight. This is a trick often
- * used by parents to ask their children for their preferred size: unbounded constraints force
- * children whose default behavior is to fill the available space (always size to
- * maxWidth/maxHeight) to have an opinion about their preferred size. Most commonly, when measured
- * with unbounded [Constraints], these children will fallback to size themselves to wrap their
- * content, instead of expanding to fill the available space (this is not always true
- * as it depends on the child layout model, but is a common behavior for core layout components).
+ * A set of [Constraints] can have infinite maxWidth and/or maxHeight. This is a trick often used by
+ * parents to ask their children for their preferred size: unbounded constraints force children
+ * whose default behavior is to fill the available space (always size to maxWidth/maxHeight) to have
+ * an opinion about their preferred size. Most commonly, when measured with unbounded [Constraints],
+ * these children will fallback to size themselves to wrap their content, instead of expanding to
+ * fill the available space (this is not always true as it depends on the child layout model, but is
+ * a common behavior for core layout components).
  *
- * [Constraints] uses a [Long] to represent four values, [minWidth], [minHeight], [maxWidth],
- * and [maxHeight]. The range of the values varies to allow for at most 256K in one dimension.
- * There are four possible maximum ranges, 13 bits/18 bits, and 15 bits/16 bits for either width
- * or height, depending on the needs. For example, a width could range up to 18 bits
- * and the height up to 13 bits. Alternatively, the width could range up to 16 bits and the height
- * up to 15 bits. The height and width requirements can be reversed, with a height of up to 18 bits
- * and width of 13 bits or height of 16 bits and width of 15 bits. Any constraints exceeding
- * this range will fail.
+ * [Constraints] uses a [Long] to represent four values, [minWidth], [minHeight], [maxWidth], and
+ * [maxHeight]. The range of the values varies to allow for at most 256K in one dimension. There are
+ * four possible maximum ranges, 13 bits/18 bits, and 15 bits/16 bits for either width or height,
+ * depending on the needs. For example, a width could range up to 18 bits and the height up to 13
+ * bits. Alternatively, the width could range up to 16 bits and the height up to 15 bits. The height
+ * and width requirements can be reversed, with a height of up to 18 bits and width of 13 bits or
+ * height of 16 bits and width of 15 bits. Any constraints exceeding this range will fail.
  */
 @Immutable
 @JvmInline
-value class Constraints(
-    @PublishedApi internal val value: Long
-) {
+value class Constraints(@PublishedApi internal val value: Long) {
     /**
      * Indicates how the bits are assigned. One of:
      * - MinFocusWidth
@@ -67,9 +63,7 @@
     private inline val focusIndex
         get() = (value and FocusMask).toInt()
 
-    /**
-     * The minimum width that the measurement can take, in pixels.
-     */
+    /** The minimum width that the measurement can take, in pixels. */
     val minWidth: Int
         get() {
             val mask = widthMask(indexToBitOffset(focusIndex))
@@ -77,8 +71,8 @@
         }
 
     /**
-     * The maximum width that the measurement can take, in pixels. This will either be
-     * a positive value greater than or equal to [minWidth] or [Constraints.Infinity].
+     * The maximum width that the measurement can take, in pixels. This will either be a positive
+     * value greater than or equal to [minWidth] or [Constraints.Infinity].
      */
     val maxWidth: Int
         get() {
@@ -87,9 +81,7 @@
             return if (width == 0) Infinity else width - 1
         }
 
-    /**
-     * The minimum height that the measurement can take, in pixels.
-     */
+    /** The minimum height that the measurement can take, in pixels. */
     val minHeight: Int
         get() {
             val bitOffset = indexToBitOffset(focusIndex)
@@ -99,8 +91,8 @@
         }
 
     /**
-     * The maximum height that the measurement can take, in pixels. This will either be
-     * a positive value greater than or equal to [minHeight] or [Constraints.Infinity].
+     * The maximum height that the measurement can take, in pixels. This will either be a positive
+     * value greater than or equal to [minHeight] or [Constraints.Infinity].
      */
     val maxHeight: Int
         get() {
@@ -113,6 +105,7 @@
 
     /**
      * `false` when [maxWidth] is [Infinity] and `true` if [maxWidth] is a non-[Infinity] value.
+     *
      * @see hasBoundedHeight
      */
     val hasBoundedWidth: Boolean
@@ -123,6 +116,7 @@
 
     /**
      * `false` when [maxHeight] is [Infinity] and `true` if [maxHeight] is a non-[Infinity] value.
+     *
      * @see hasBoundedWidth
      */
     val hasBoundedHeight: Boolean
@@ -133,58 +127,57 @@
             return ((value shr offset).toInt() and mask) != 0
         }
 
-    /**
-     * Whether there is exactly one width value that satisfies the constraints.
-     */
+    /** Whether there is exactly one width value that satisfies the constraints. */
     @Stable
-    val hasFixedWidth: Boolean get() {
-        val mask = widthMask(indexToBitOffset(focusIndex))
-        val minWidth = ((value shr 2).toInt() and mask)
-        val maxWidth = ((value shr 33).toInt() and mask).let {
-            if (it == 0) Infinity else it - 1
+    val hasFixedWidth: Boolean
+        get() {
+            val mask = widthMask(indexToBitOffset(focusIndex))
+            val minWidth = ((value shr 2).toInt() and mask)
+            val maxWidth =
+                ((value shr 33).toInt() and mask).let { if (it == 0) Infinity else it - 1 }
+            return minWidth == maxWidth
         }
-        return minWidth == maxWidth
-    }
 
-    /**
-     * Whether there is exactly one height value that satisfies the constraints.
-     */
+    /** Whether there is exactly one height value that satisfies the constraints. */
     @Stable
-    val hasFixedHeight: Boolean get() {
-        val bitOffset = indexToBitOffset(focusIndex)
-        val mask = heightMask(bitOffset)
-        val offset = minHeightOffsets(bitOffset)
-        val minHeight = (value shr offset).toInt() and mask
-        val maxHeight = ((value shr (offset + 31)).toInt() and mask).let {
-            if (it == 0) Infinity else it - 1
+    val hasFixedHeight: Boolean
+        get() {
+            val bitOffset = indexToBitOffset(focusIndex)
+            val mask = heightMask(bitOffset)
+            val offset = minHeightOffsets(bitOffset)
+            val minHeight = (value shr offset).toInt() and mask
+            val maxHeight =
+                ((value shr (offset + 31)).toInt() and mask).let {
+                    if (it == 0) Infinity else it - 1
+                }
+            return minHeight == maxHeight
         }
-        return minHeight == maxHeight
-    }
 
     /**
-     * Whether the area of a component respecting these constraints will definitely be 0.
-     * This is true when at least one of maxWidth and maxHeight are 0.
+     * Whether the area of a component respecting these constraints will definitely be 0. This is
+     * true when at least one of maxWidth and maxHeight are 0.
      */
     @Stable
-    val isZero: Boolean get() {
-        val bitOffset = indexToBitOffset(focusIndex)
+    val isZero: Boolean
+        get() {
+            val bitOffset = indexToBitOffset(focusIndex)
 
-        // No need to special case width == 0 -> Infinity, instead we let it go to -1
-        // and fail the test that follows
-        val maxWidth = ((value shr 33).toInt() and widthMask(bitOffset)) - 1
-        if (maxWidth == 0) return true
+            // No need to special case width == 0 -> Infinity, instead we let it go to -1
+            // and fail the test that follows
+            val maxWidth = ((value shr 33).toInt() and widthMask(bitOffset)) - 1
+            if (maxWidth == 0) return true
 
-        // Same here
-        val offset = minHeightOffsets(bitOffset) + 31
-        val maxHeight = ((value shr offset).toInt() and heightMask(bitOffset)) - 1
-        return maxHeight == 0
-    }
+            // Same here
+            val offset = minHeightOffsets(bitOffset) + 31
+            val maxHeight = ((value shr offset).toInt() and heightMask(bitOffset)) - 1
+            return maxHeight == 0
+        }
 
     /**
-     * Copies the existing [Constraints], replacing some of [minWidth], [minHeight], [maxWidth],
-     * or [maxHeight] as desired. [minWidth] and [minHeight] must be positive and
-     * [maxWidth] and [maxHeight] must be greater than or equal to [minWidth] and [minHeight],
-     * respectively, or [Infinity].
+     * Copies the existing [Constraints], replacing some of [minWidth], [minHeight], [maxWidth], or
+     * [maxHeight] as desired. [minWidth] and [minHeight] must be positive and [maxWidth] and
+     * [maxHeight] must be greater than or equal to [minWidth] and [minHeight], respectively, or
+     * [Infinity].
      */
     fun copy(
         minWidth: Int = this.minWidth,
@@ -217,36 +210,25 @@
 
     companion object {
         /**
-         * A value that [maxWidth] or [maxHeight] will be set to when the constraint should
-         * be considered infinite. [hasBoundedWidth] or [hasBoundedHeight] will be
-         * `false` when [maxWidth] or [maxHeight] is [Infinity], respectively.
+         * A value that [maxWidth] or [maxHeight] will be set to when the constraint should be
+         * considered infinite. [hasBoundedWidth] or [hasBoundedHeight] will be `false` when
+         * [maxWidth] or [maxHeight] is [Infinity], respectively.
          */
         const val Infinity = Int.MAX_VALUE
 
-        /**
-         * Creates constraints for fixed size in both dimensions.
-         */
+        /** Creates constraints for fixed size in both dimensions. */
         @Stable
-        fun fixed(
-            width: Int,
-            height: Int
-        ): Constraints {
+        fun fixed(width: Int, height: Int): Constraints {
             requirePrecondition(width >= 0 && height >= 0) {
                 "width($width) and height($height) must be >= 0"
             }
             return createConstraints(width, width, height, height)
         }
 
-        /**
-         * Creates constraints for fixed width and unspecified height.
-         */
+        /** Creates constraints for fixed width and unspecified height. */
         @Stable
-        fun fixedWidth(
-            width: Int
-        ): Constraints {
-            requirePrecondition(width >= 0) {
-                "width($width) must be >= 0"
-            }
+        fun fixedWidth(width: Int): Constraints {
+            requirePrecondition(width >= 0) { "width($width) must be >= 0" }
             return createConstraints(
                 minWidth = width,
                 maxWidth = width,
@@ -255,16 +237,10 @@
             )
         }
 
-        /**
-         * Creates constraints for fixed height and unspecified width.
-         */
+        /** Creates constraints for fixed height and unspecified width. */
         @Stable
-        fun fixedHeight(
-            height: Int
-        ): Constraints {
-            requirePrecondition(height >= 0) {
-                "height($height) must be >= 0"
-            }
+        fun fixedHeight(height: Int): Constraints {
+            requirePrecondition(height >= 0) { "height($height) must be >= 0" }
             return createConstraints(
                 minWidth = 0,
                 maxWidth = Infinity,
@@ -276,9 +252,11 @@
         // This should be removed before the next release
         @ExperimentalComposeUiApi
         @Deprecated(
-            "Replace with fitPrioritizingWidth", replaceWith = ReplaceWith(
-                "Constraints.fitPrioritizingWidth(minWidth, maxWidth, minHeight, maxHeight)"
-            )
+            "Replace with fitPrioritizingWidth",
+            replaceWith =
+                ReplaceWith(
+                    "Constraints.fitPrioritizingWidth(minWidth, maxWidth, minHeight, maxHeight)"
+                )
         )
         @Stable
         fun restrictConstraints(
@@ -296,19 +274,19 @@
         }
 
         /**
-         * Returns [Constraints] that match as close as possible to the values passed.
-         * If the dimensions are outside of those that can be represented, the constraints
-         * are limited to those that can be represented.
+         * Returns [Constraints] that match as close as possible to the values passed. If the
+         * dimensions are outside of those that can be represented, the constraints are limited to
+         * those that can be represented.
          *
-         * [Constraints] is a `value class` based on a [Long] and 4 integers must be limited
-         * to fit within its size. The larger dimension has up to 18 bits (262,143) and the
-         * smaller as few as 13 bits (8191). The width is granted as much space as it needs
-         * or caps the size to 18 bits. The height is given the remaining space.
+         * [Constraints] is a `value class` based on a [Long] and 4 integers must be limited to fit
+         * within its size. The larger dimension has up to 18 bits (262,143) and the smaller as few
+         * as 13 bits (8191). The width is granted as much space as it needs or caps the size to 18
+         * bits. The height is given the remaining space.
          *
-         * This can be useful when layout constraints are possible to be extremely large,
-         * but not everything is possible to display on the device. For example a text
-         * layout where an entire chapter of a book is measured in one Layout and it isn't
-         * possible to break up the content to show in a `LazyColumn`.
+         * This can be useful when layout constraints are possible to be extremely large, but not
+         * everything is possible to display on the device. For example a text layout where an
+         * entire chapter of a book is measured in one Layout and it isn't possible to break up the
+         * content to show in a `LazyColumn`.
          */
         @Stable
         fun fitPrioritizingWidth(
@@ -318,33 +296,33 @@
             maxHeight: Int,
         ): Constraints {
             val minW = min(minWidth, MaxFocusMask - 1)
-            val maxW = if (maxWidth == Infinity) {
-                Infinity
-            } else {
-                min(maxWidth, MaxFocusMask - 1)
-            }
+            val maxW =
+                if (maxWidth == Infinity) {
+                    Infinity
+                } else {
+                    min(maxWidth, MaxFocusMask - 1)
+                }
             val consumed = if (maxW == Infinity) minW else maxW
             val maxAllowed = maxAllowedForSize(consumed)
-            val maxH =
-                if (maxHeight == Infinity) Infinity else min(maxAllowed, maxHeight)
+            val maxH = if (maxHeight == Infinity) Infinity else min(maxAllowed, maxHeight)
             val minH = min(maxAllowed, minHeight)
             return Constraints(minW, maxW, minH, maxH)
         }
 
         /**
-         * Returns [Constraints] that match as close as possible to the values passed.
-         * If the dimensions are outside of those that can be represented, the constraints
-         * are limited to those that can be represented.
+         * Returns [Constraints] that match as close as possible to the values passed. If the
+         * dimensions are outside of those that can be represented, the constraints are limited to
+         * those that can be represented.
          *
-         * [Constraints] is a `value class` based on a [Long] and 4 integers must be limited
-         * to fit within its size. The larger dimension has up to 18 bits (262,143) and the
-         * smaller as few as 13 bits (8191). The height is granted as much space as it needs
-         * or caps the size to 18 bits. The width is given the remaining space.
+         * [Constraints] is a `value class` based on a [Long] and 4 integers must be limited to fit
+         * within its size. The larger dimension has up to 18 bits (262,143) and the smaller as few
+         * as 13 bits (8191). The height is granted as much space as it needs or caps the size to 18
+         * bits. The width is given the remaining space.
          *
-         * This can be useful when layout constraints are possible to be extremely large,
-         * but not everything is possible to display on the device. For example a text
-         * layout where an entire chapter of a book is measured in one Layout and it isn't
-         * possible to break up the content to show in a `LazyColumn`.
+         * This can be useful when layout constraints are possible to be extremely large, but not
+         * everything is possible to display on the device. For example a text layout where an
+         * entire chapter of a book is measured in one Layout and it isn't possible to break up the
+         * content to show in a `LazyColumn`.
          */
         @Stable
         fun fitPrioritizingHeight(
@@ -354,11 +332,12 @@
             maxHeight: Int,
         ): Constraints {
             val minH = min(minHeight, MaxFocusMask - 1)
-            val maxH = if (maxHeight == Infinity) {
-                Infinity
-            } else {
-                min(maxHeight, MaxFocusMask - 1)
-            }
+            val maxH =
+                if (maxHeight == Infinity) {
+                    Infinity
+                } else {
+                    min(maxHeight, MaxFocusMask - 1)
+                }
             val consumed = if (maxH == Infinity) minH else maxH
             val maxAllowed = maxAllowedForSize(consumed)
             val maxW = if (maxWidth == Infinity) Infinity else min(maxAllowed, maxWidth)
@@ -372,85 +351,69 @@
 private const val Infinity = Int.MAX_VALUE
 
 /**
- * The bit distribution when the focus of the bits should be on the width, but only
- * a minimal difference in focus.
+ * The bit distribution when the focus of the bits should be on the width, but only a minimal
+ * difference in focus.
  *
  * 16 bits assigned to width, 15 bits assigned to height.
  */
 private const val MinFocusWidth = 0x02
 
 /**
- * The bit distribution when the focus of the bits should be on the width, and a
- * maximal number of bits assigned to the width.
+ * The bit distribution when the focus of the bits should be on the width, and a maximal number of
+ * bits assigned to the width.
  *
  * 18 bits assigned to width, 13 bits assigned to height.
  */
 private const val MaxFocusWidth = 0x03
 
 /**
- * The bit distribution when the focus of the bits should be on the height, but only
- * a minimal difference in focus.
+ * The bit distribution when the focus of the bits should be on the height, but only a minimal
+ * difference in focus.
  *
  * 15 bits assigned to width, 16 bits assigned to height.
  */
 private const val MinFocusHeight = 0x01
 
 /**
- * The bit distribution when the focus of the bits should be on the height, and a
- * a maximal number of bits assigned to the height.
+ * The bit distribution when the focus of the bits should be on the height, and a a maximal number
+ * of bits assigned to the height.
  *
  * 13 bits assigned to width, 18 bits assigned to height.
  */
 private const val MaxFocusHeight = 0x00
 
 /**
- * The mask to retrieve the focus ([MinFocusWidth], [MaxFocusWidth],
- * [MinFocusHeight], [MaxFocusHeight]).
+ * The mask to retrieve the focus ([MinFocusWidth], [MaxFocusWidth], [MinFocusHeight],
+ * [MaxFocusHeight]).
  */
 private const val FocusMask = 0x03L
 
-/**
- * The number of bits used for the focused dimension when there is minimal focus.
- */
+/** The number of bits used for the focused dimension when there is minimal focus. */
 private const val MinFocusBits = 16
 private const val MaxAllowedForMinFocusBits = (1 shl (31 - MinFocusBits)) - 2
 
-/**
- * The mask to use for the focused dimension when there is minimal focus.
- */
+/** The mask to use for the focused dimension when there is minimal focus. */
 private const val MinFocusMask = 0xFFFF // 64K (16 bits)
 
-/**
- * The number of bits used for the non-focused dimension when there is minimal focus.
- */
+/** The number of bits used for the non-focused dimension when there is minimal focus. */
 private const val MinNonFocusBits = 15
 private const val MaxAllowedForMinNonFocusBits = (1 shl (31 - MinNonFocusBits)) - 2
 
-/**
- * The mask to use for the non-focused dimension when there is minimal focus.
- */
+/** The mask to use for the non-focused dimension when there is minimal focus. */
 private const val MinNonFocusMask = 0x7FFF // 32K (15 bits)
 
-/**
- * The number of bits to use for the focused dimension when there is maximal focus.
- */
+/** The number of bits to use for the focused dimension when there is maximal focus. */
 private const val MaxFocusBits = 18
 private const val MaxAllowedForMaxFocusBits = (1 shl (31 - MaxFocusBits)) - 2
 
-/**
- * The mask to use for the focused dimension when there is maximal focus.
- */
+/** The mask to use for the focused dimension when there is maximal focus. */
 private const val MaxFocusMask = 0x3FFFF // 256K (18 bits)
 
-/**
- * The number of bits to use for the non-focused dimension when there is maximal focus.
- */
+/** The number of bits to use for the non-focused dimension when there is maximal focus. */
 private const val MaxNonFocusBits = 13
 private const val MaxAllowedForMaxNonFocusBits = (1 shl (31 - MaxNonFocusBits)) - 2
 
-/**
- * The mask to use for the non-focused dimension when there is maximal focus.
- */
+/** The mask to use for the non-focused dimension when there is maximal focus. */
 private const val MaxNonFocusMask = 0x1FFF // 8K (13 bits)
 
 // Wrap those throws in functions to avoid inlining the string building at the call sites
@@ -461,14 +424,10 @@
 }
 
 private fun invalidSize(size: Int): Nothing {
-    throw IllegalArgumentException(
-        "Can't represent a size of $size in Constraints"
-    )
+    throw IllegalArgumentException("Can't represent a size of $size in Constraints")
 }
 
-/**
- * Creates a [Constraints], only checking that the values fit in the packed Long.
- */
+/** Creates a [Constraints], only checking that the values fit in the packed Long. */
 internal fun createConstraints(
     minWidth: Int,
     maxWidth: Int,
@@ -494,22 +453,24 @@
     var maxHeightValue = maxHeight + 1
     maxHeightValue = maxHeightValue and (maxHeightValue shr 31).inv()
 
-    val focus = when (widthBits) {
-        MinNonFocusBits -> MinFocusHeight
-        MinFocusBits -> MinFocusWidth
-        MaxNonFocusBits -> MaxFocusHeight
-        MaxFocusBits -> MaxFocusWidth
-        else -> 0x00 // can't happen, widthBits is computed from bitsNeedForSizeUnchecked()
-    }
+    val focus =
+        when (widthBits) {
+            MinNonFocusBits -> MinFocusHeight
+            MinFocusBits -> MinFocusWidth
+            MaxNonFocusBits -> MaxFocusHeight
+            MaxFocusBits -> MaxFocusWidth
+            else -> 0x00 // can't happen, widthBits is computed from bitsNeedForSizeUnchecked()
+        }
 
     val minHeightOffset = minHeightOffsets(indexToBitOffset(focus))
     val maxHeightOffset = minHeightOffset + 31
 
-    val value = focus.toLong() or
-        (minWidth.toLong() shl 2) or
-        (maxWidthValue.toLong() shl 33) or
-        (minHeight.toLong() shl minHeightOffset) or
-        (maxHeightValue.toLong() shl maxHeightOffset)
+    val value =
+        focus.toLong() or
+            (minWidth.toLong() shl 2) or
+            (maxWidthValue.toLong() shl 33) or
+            (minHeight.toLong() shl minHeightOffset) or
+            (maxHeightValue.toLong() shl maxHeightOffset)
     return Constraints(value)
 }
 
@@ -534,9 +495,9 @@
 }
 
 /**
- * Create a [Constraints]. [minWidth] and [minHeight] must be positive and
- * [maxWidth] and [maxHeight] must be greater than or equal to [minWidth] and [minHeight],
- * respectively, or [Infinity][Constraints.Infinity].
+ * Create a [Constraints]. [minWidth] and [minHeight] must be positive and [maxWidth] and
+ * [maxHeight] must be greater than or equal to [minWidth] and [minHeight], respectively, or
+ * [Infinity][Constraints.Infinity].
  */
 @Stable
 fun Constraints(
@@ -558,61 +519,51 @@
 }
 
 /**
- * Takes [otherConstraints] and returns the result of coercing them in the current constraints.
- * Note this means that any size satisfying the resulting constraints will satisfy the current
+ * Takes [otherConstraints] and returns the result of coercing them in the current constraints. Note
+ * this means that any size satisfying the resulting constraints will satisfy the current
  * constraints, but they might not satisfy the [otherConstraints] when the two set of constraints
- * are disjoint.
- * Examples (showing only width, height works the same):
- * (minWidth=2, maxWidth=10).constrain(minWidth=7, maxWidth=12) -> (minWidth = 7, maxWidth = 10)
- * (minWidth=2, maxWidth=10).constrain(minWidth=11, maxWidth=12) -> (minWidth=10, maxWidth=10)
- * (minWidth=2, maxWidth=10).constrain(minWidth=5, maxWidth=7) -> (minWidth=5, maxWidth=7)
+ * are disjoint. Examples (showing only width, height works the same): (minWidth=2,
+ * maxWidth=10).constrain(minWidth=7, maxWidth=12) -> (minWidth = 7, maxWidth = 10) (minWidth=2,
+ * maxWidth=10).constrain(minWidth=11, maxWidth=12) -> (minWidth=10, maxWidth=10) (minWidth=2,
+ * maxWidth=10).constrain(minWidth=5, maxWidth=7) -> (minWidth=5, maxWidth=7)
  */
-fun Constraints.constrain(otherConstraints: Constraints) = Constraints(
-    minWidth = otherConstraints.minWidth.coerceIn(minWidth, maxWidth),
-    maxWidth = otherConstraints.maxWidth.coerceIn(minWidth, maxWidth),
-    minHeight = otherConstraints.minHeight.coerceIn(minHeight, maxHeight),
-    maxHeight = otherConstraints.maxHeight.coerceIn(minHeight, maxHeight)
-)
+fun Constraints.constrain(otherConstraints: Constraints) =
+    Constraints(
+        minWidth = otherConstraints.minWidth.coerceIn(minWidth, maxWidth),
+        maxWidth = otherConstraints.maxWidth.coerceIn(minWidth, maxWidth),
+        minHeight = otherConstraints.minHeight.coerceIn(minHeight, maxHeight),
+        maxHeight = otherConstraints.maxHeight.coerceIn(minHeight, maxHeight)
+    )
 
-/**
- * Takes a size and returns the closest size to it that satisfies the constraints.
- */
+/** Takes a size and returns the closest size to it that satisfies the constraints. */
 @Stable
-fun Constraints.constrain(size: IntSize) = IntSize(
-    width = size.width.coerceIn(minWidth, maxWidth),
-    height = size.height.coerceIn(minHeight, maxHeight)
-)
+fun Constraints.constrain(size: IntSize) =
+    IntSize(
+        width = size.width.coerceIn(minWidth, maxWidth),
+        height = size.height.coerceIn(minHeight, maxHeight)
+    )
 
-/**
- * Takes a width and returns the closest size to it that satisfies the constraints.
- */
-@Stable
-fun Constraints.constrainWidth(width: Int) = width.coerceIn(minWidth, maxWidth)
+/** Takes a width and returns the closest size to it that satisfies the constraints. */
+@Stable fun Constraints.constrainWidth(width: Int) = width.coerceIn(minWidth, maxWidth)
 
-/**
- * Takes a height and returns the closest size to it that satisfies the constraints.
- */
-@Stable
-fun Constraints.constrainHeight(height: Int) = height.coerceIn(minHeight, maxHeight)
+/** Takes a height and returns the closest size to it that satisfies the constraints. */
+@Stable fun Constraints.constrainHeight(height: Int) = height.coerceIn(minHeight, maxHeight)
 
-/**
- * Takes a size and returns whether it satisfies the current constraints.
- */
+/** Takes a size and returns whether it satisfies the current constraints. */
 @Stable
 fun Constraints.isSatisfiedBy(size: IntSize): Boolean {
     return size.width in minWidth..maxWidth && size.height in minHeight..maxHeight
 }
 
-/**
- * Returns the Constraints obtained by offsetting the current instance with the given values.
- */
+/** Returns the Constraints obtained by offsetting the current instance with the given values. */
 @Stable
-fun Constraints.offset(horizontal: Int = 0, vertical: Int = 0) = Constraints(
-    (minWidth + horizontal).coerceAtLeast(0),
-    addMaxWithMinimum(maxWidth, horizontal),
-    (minHeight + vertical).coerceAtLeast(0),
-    addMaxWithMinimum(maxHeight, vertical)
-)
+fun Constraints.offset(horizontal: Int = 0, vertical: Int = 0) =
+    Constraints(
+        (minWidth + horizontal).coerceAtLeast(0),
+        addMaxWithMinimum(maxWidth, horizontal),
+        (minHeight + vertical).coerceAtLeast(0),
+        addMaxWithMinimum(maxHeight, vertical)
+    )
 
 private fun addMaxWithMinimum(max: Int, value: Int): Int {
     return if (max == Constraints.Infinity) {
@@ -675,31 +626,25 @@
 // HeightMask = (1 shl (18 - indexToBitOffset(index))) - 1
 
 /**
- * Maps an index (MaxFocusHeight, MinFocusHeight, MinFocusWidth, MaxFocusWidth)
- * to a "bit offset": 0, 2, 3 or 5. That bit offset is used by [minHeightOffsets],
- * [widthMask], and [heightMask] to compute other values without the need of lookup
- * tables. For instance, [minHeightOffsets] returns `2 + 13 + bitOffset`.
+ * Maps an index (MaxFocusHeight, MinFocusHeight, MinFocusWidth, MaxFocusWidth) to a "bit offset":
+ * 0, 2, 3 or 5. That bit offset is used by [minHeightOffsets], [widthMask], and [heightMask] to
+ * compute other values without the need of lookup tables. For instance, [minHeightOffsets] returns
+ * `2 + 13 + bitOffset`.
  */
 @Suppress("NOTHING_TO_INLINE")
 private inline fun indexToBitOffset(index: Int) =
     (index and 0x1 shl 1) + ((index and 0x2 shr 1) * 3)
 
 /**
- * Minimum Height shift offsets into Long value, indexed by FocusMask
- * Max offsets are these + 31
+ * Minimum Height shift offsets into Long value, indexed by FocusMask Max offsets are these + 31
  * Width offsets are always either 2 (min) or 33 (max)
  */
-@Suppress("NOTHING_TO_INLINE")
-private inline fun minHeightOffsets(bitOffset: Int) = 15 + bitOffset
+@Suppress("NOTHING_TO_INLINE") private inline fun minHeightOffsets(bitOffset: Int) = 15 + bitOffset
 
-/**
- * The mask to use for both minimum and maximum width.
- */
+/** The mask to use for both minimum and maximum width. */
 @Suppress("NOTHING_TO_INLINE")
 private inline fun widthMask(bitOffset: Int) = (1 shl (13 + bitOffset)) - 1
 
-/**
- * The mask to use for both minimum and maximum height.
- */
+/** The mask to use for both minimum and maximum height. */
 @Suppress("NOTHING_TO_INLINE")
 private inline fun heightMask(bitOffset: Int) = (1 shl (18 - bitOffset)) - 1
diff --git a/compose/ui/ui-unit/src/commonMain/kotlin/androidx/compose/ui/unit/Density.kt b/compose/ui/ui-unit/src/commonMain/kotlin/androidx/compose/ui/unit/Density.kt
index 186ba34..5b3e3c5 100644
--- a/compose/ui/ui-unit/src/commonMain/kotlin/androidx/compose/ui/unit/Density.kt
+++ b/compose/ui/ui-unit/src/commonMain/kotlin/androidx/compose/ui/unit/Density.kt
@@ -31,13 +31,10 @@
  * @param fontScale Current user preference for the scaling factor for fonts.
  */
 @Stable
-fun Density(density: Float, fontScale: Float = 1f): Density =
-    DensityImpl(density, fontScale)
+fun Density(density: Float, fontScale: Float = 1f): Density = DensityImpl(density, fontScale)
 
-private data class DensityImpl(
-    override val density: Float,
-    override val fontScale: Float
-) : Density
+private data class DensityImpl(override val density: Float, override val fontScale: Float) :
+    Density
 
 /**
  * A density of the screen. Used for the conversions between pixels, [Dp], [Int] and [TextUnit].
@@ -48,21 +45,13 @@
 @JvmDefaultWithCompatibility
 interface Density : FontScaling {
 
-    /**
-     * The logical density of the display. This is a scaling factor for the [Dp] unit.
-     */
-    @Stable
-    val density: Float
+    /** The logical density of the display. This is a scaling factor for the [Dp] unit. */
+    @Stable val density: Float
 
-    /**
-     * Convert [Dp] to pixels. Pixels are used to paint to Canvas.
-     */
-    @Stable
-    fun Dp.toPx(): Float = value * density
+    /** Convert [Dp] to pixels. Pixels are used to paint to Canvas. */
+    @Stable fun Dp.toPx(): Float = value * density
 
-    /**
-     * Convert [Dp] to [Int] by rounding
-     */
+    /** Convert [Dp] to [Int] by rounding */
     @Stable
     fun Dp.roundToPx(): Int {
         val px = toPx()
@@ -71,6 +60,7 @@
 
     /**
      * Convert Sp to pixels. Pixels are used to paint to Canvas.
+     *
      * @throws IllegalStateException if TextUnit other than SP unit is specified.
      */
     @Stable
@@ -79,62 +69,42 @@
         return toDp().toPx()
     }
 
-    /**
-     * Convert Sp to [Int] by rounding
-     */
-    @Stable
-    fun TextUnit.roundToPx(): Int = toPx().fastRoundToInt()
+    /** Convert Sp to [Int] by rounding */
+    @Stable fun TextUnit.roundToPx(): Int = toPx().fastRoundToInt()
 
-    /**
-     * Convert an [Int] pixel value to [Dp].
-     */
-    @Stable
-    fun Int.toDp(): Dp = (this / density).dp
+    /** Convert an [Int] pixel value to [Dp]. */
+    @Stable fun Int.toDp(): Dp = (this / density).dp
 
-    /**
-     * Convert an [Int] pixel value to Sp.
-     */
-    @Stable
-    fun Int.toSp(): TextUnit = toDp().toSp()
+    /** Convert an [Int] pixel value to Sp. */
+    @Stable fun Int.toSp(): TextUnit = toDp().toSp()
 
     /** Convert a [Float] pixel value to a Dp */
-    @Stable
-    fun Float.toDp(): Dp = (this / density).dp
+    @Stable fun Float.toDp(): Dp = (this / density).dp
 
     /** Convert a [Float] pixel value to a Sp */
-    @Stable
-    fun Float.toSp(): TextUnit = toDp().toSp()
+    @Stable fun Float.toSp(): TextUnit = toDp().toSp()
 
-    /**
-     * Convert a [DpRect] to a [Rect].
-     */
+    /** Convert a [DpRect] to a [Rect]. */
     @Stable
     fun DpRect.toRect(): Rect {
-        return Rect(
-            left.toPx(),
-            top.toPx(),
-            right.toPx(),
-            bottom.toPx()
-        )
+        return Rect(left.toPx(), top.toPx(), right.toPx(), bottom.toPx())
     }
 
-    /**
-     * Convert a [DpSize] to a [Size].
-     */
+    /** Convert a [DpSize] to a [Size]. */
     @Stable
-    fun DpSize.toSize(): Size = if (isSpecified) {
-        Size(width.toPx(), height.toPx())
-    } else {
-        Size.Unspecified
-    }
+    fun DpSize.toSize(): Size =
+        if (isSpecified) {
+            Size(width.toPx(), height.toPx())
+        } else {
+            Size.Unspecified
+        }
 
-    /**
-     * Convert a [Size] to a [DpSize].
-     */
+    /** Convert a [Size] to a [DpSize]. */
     @Stable
-    fun Size.toDpSize(): DpSize = if (isSpecified) {
-        DpSize(width.toDp(), height.toDp())
-    } else {
-        DpSize.Unspecified
-    }
+    fun Size.toDpSize(): DpSize =
+        if (isSpecified) {
+            DpSize(width.toDp(), height.toDp())
+        } else {
+            DpSize.Unspecified
+        }
 }
diff --git a/compose/ui/ui-unit/src/commonMain/kotlin/androidx/compose/ui/unit/Dp.kt b/compose/ui/ui-unit/src/commonMain/kotlin/androidx/compose/ui/unit/Dp.kt
index e2d9797..12868d2 100644
--- a/compose/ui/ui-unit/src/commonMain/kotlin/androidx/compose/ui/unit/Dp.kt
+++ b/compose/ui/ui-unit/src/commonMain/kotlin/androidx/compose/ui/unit/Dp.kt
@@ -30,9 +30,9 @@
 
 /**
  * Dimension value representing device-independent pixels (dp). Component APIs specify their
- * dimensions such as line thickness in DP with Dp objects. Hairline (1 pixel) thickness
- * may be specified with [Hairline], a dimension that take up no space. Dp are normally
- * defined using [dp], which can be applied to [Int], [Double], and [Float].
+ * dimensions such as line thickness in DP with Dp objects. Hairline (1 pixel) thickness may be
+ * specified with [Hairline], a dimension that take up no space. Dp are normally defined using [dp],
+ * which can be applied to [Int], [Double], and [Float].
  *
  * @sample androidx.compose.ui.unit.samples.DpSample
  *
@@ -43,153 +43,95 @@
 @Immutable
 @JvmInline
 value class Dp(val value: Float) : Comparable<Dp> {
-    /**
-     * Add two [Dp]s together.
-     */
-    @Stable
-    inline operator fun plus(other: Dp) = Dp(this.value + other.value)
+    /** Add two [Dp]s together. */
+    @Stable inline operator fun plus(other: Dp) = Dp(this.value + other.value)
 
-    /**
-     * Subtract a Dp from another one.
-     */
-    @Stable
-    inline operator fun minus(other: Dp) = Dp(this.value - other.value)
+    /** Subtract a Dp from another one. */
+    @Stable inline operator fun minus(other: Dp) = Dp(this.value - other.value)
 
-    /**
-     * This is the same as multiplying the Dp by -1.0.
-     */
-    @Stable
-    inline operator fun unaryMinus() = Dp(-value)
+    /** This is the same as multiplying the Dp by -1.0. */
+    @Stable inline operator fun unaryMinus() = Dp(-value)
 
-    /**
-     * Divide a Dp by a scalar.
-     */
-    @Stable
-    inline operator fun div(other: Float): Dp = Dp(value / other)
+    /** Divide a Dp by a scalar. */
+    @Stable inline operator fun div(other: Float): Dp = Dp(value / other)
 
-    @Stable
-    inline operator fun div(other: Int): Dp = Dp(value / other)
+    @Stable inline operator fun div(other: Int): Dp = Dp(value / other)
 
-    /**
-     * Divide by another Dp to get a scalar.
-     */
-    @Stable
-    inline operator fun div(other: Dp): Float = value / other.value
+    /** Divide by another Dp to get a scalar. */
+    @Stable inline operator fun div(other: Dp): Float = value / other.value
 
-    /**
-     * Multiply a Dp by a scalar.
-     */
-    @Stable
-    inline operator fun times(other: Float): Dp = Dp(value * other)
+    /** Multiply a Dp by a scalar. */
+    @Stable inline operator fun times(other: Float): Dp = Dp(value * other)
 
-    @Stable
-    inline operator fun times(other: Int): Dp = Dp(value * other)
+    @Stable inline operator fun times(other: Int): Dp = Dp(value * other)
 
-    /**
-     * Support comparing Dimensions with comparison operators.
-     */
+    /** Support comparing Dimensions with comparison operators. */
     @Stable
-    override /* TODO: inline */ operator fun compareTo(other: Dp) = value.compareTo(other.value)
+    override /* TODO: inline */  operator fun compareTo(other: Dp) = value.compareTo(other.value)
 
-    @Stable
-    override fun toString() = if (isUnspecified) "Dp.Unspecified" else "$value.dp"
+    @Stable override fun toString() = if (isUnspecified) "Dp.Unspecified" else "$value.dp"
 
     companion object {
         /**
          * A dimension used to represent a hairline drawing element. Hairline elements take up no
          * space, but will draw a single pixel, independent of the device's resolution and density.
          */
-        @Stable
-        val Hairline = Dp(0f)
+        @Stable val Hairline = Dp(0f)
 
-        /**
-         * Infinite dp dimension.
-         */
-        @Stable
-        val Infinity = Dp(Float.POSITIVE_INFINITY)
+        /** Infinite dp dimension. */
+        @Stable val Infinity = Dp(Float.POSITIVE_INFINITY)
 
-        /**
-         * Constant that means unspecified Dp
-         */
-        @Stable
-        val Unspecified = Dp(Float.NaN)
+        /** Constant that means unspecified Dp */
+        @Stable val Unspecified = Dp(Float.NaN)
     }
 }
 
-/**
- * `false` when this is [Dp.Unspecified].
- */
+/** `false` when this is [Dp.Unspecified]. */
 @Stable
 inline val Dp.isSpecified: Boolean
     get() = !value.isNaN()
 
-/**
- * `true` when this is [Dp.Unspecified].
- */
+/** `true` when this is [Dp.Unspecified]. */
 @Stable
 inline val Dp.isUnspecified: Boolean
     get() = value.isNaN()
 
 /**
- * If this [Dp] [isSpecified] then this is returned, otherwise [block] is executed
- * and its result is returned.
+ * If this [Dp] [isSpecified] then this is returned, otherwise [block] is executed and its result is
+ * returned.
  */
-inline fun Dp.takeOrElse(block: () -> Dp): Dp =
-    if (isSpecified) this else block()
+inline fun Dp.takeOrElse(block: () -> Dp): Dp = if (isSpecified) this else block()
 
-/**
- * Create a [Dp] using an [Int]:
- *     val left = 10
- *     val x = left.dp
- *     // -- or --
- *     val y = 10.dp
- */
+/** Create a [Dp] using an [Int]: val left = 10 val x = left.dp // -- or -- val y = 10.dp */
 @Stable
-inline val Int.dp: Dp get() = Dp(this.toFloat())
+inline val Int.dp: Dp
+    get() = Dp(this.toFloat())
 
-/**
- * Create a [Dp] using a [Double]:
- *     val left = 10.0
- *     val x = left.dp
- *     // -- or --
- *     val y = 10.0.dp
- */
+/** Create a [Dp] using a [Double]: val left = 10.0 val x = left.dp // -- or -- val y = 10.0.dp */
 @Stable
-inline val Double.dp: Dp get() = Dp(this.toFloat())
+inline val Double.dp: Dp
+    get() = Dp(this.toFloat())
 
-/**
- * Create a [Dp] using a [Float]:
- *     val left = 10f
- *     val x = left.dp
- *     // -- or --
- *     val y = 10f.dp
- */
+/** Create a [Dp] using a [Float]: val left = 10f val x = left.dp // -- or -- val y = 10f.dp */
 @Stable
-inline val Float.dp: Dp get() = Dp(this)
+inline val Float.dp: Dp
+    get() = Dp(this)
 
-@Stable
-inline operator fun Float.times(other: Dp) =
-    Dp(this * other.value)
+@Stable inline operator fun Float.times(other: Dp) = Dp(this * other.value)
 
-@Stable
-inline operator fun Double.times(other: Dp) =
-    Dp(this.toFloat() * other.value)
+@Stable inline operator fun Double.times(other: Dp) = Dp(this.toFloat() * other.value)
 
-@Stable
-inline operator fun Int.times(other: Dp) =
-    Dp(this * other.value)
+@Stable inline operator fun Int.times(other: Dp) = Dp(this * other.value)
 
-@Stable
-inline fun min(a: Dp, b: Dp): Dp = Dp(min(a.value, b.value))
+@Stable inline fun min(a: Dp, b: Dp): Dp = Dp(min(a.value, b.value))
 
-@Stable
-inline fun max(a: Dp, b: Dp): Dp = Dp(max(a.value, b.value))
+@Stable inline fun max(a: Dp, b: Dp): Dp = Dp(max(a.value, b.value))
 
 /**
  * Ensures that this value lies in the specified range [minimumValue]..[maximumValue].
  *
  * @return this value if it's in the range, or [minimumValue] if this value is less than
- * [minimumValue], or [maximumValue] if this value is greater than [maximumValue].
+ *   [minimumValue], or [maximumValue] if this value is greater than [maximumValue].
  */
 @Stable
 inline fun Dp.coerceIn(minimumValue: Dp, maximumValue: Dp): Dp =
@@ -197,40 +139,36 @@
 
 /**
  * Ensures that this value is not less than the specified [minimumValue].
- * @return this value if it's greater than or equal to the [minimumValue] or the
- * [minimumValue] otherwise.
+ *
+ * @return this value if it's greater than or equal to the [minimumValue] or the [minimumValue]
+ *   otherwise.
  */
 @Stable
-inline fun Dp.coerceAtLeast(minimumValue: Dp): Dp =
-    Dp(value.coerceAtLeast(minimumValue.value))
+inline fun Dp.coerceAtLeast(minimumValue: Dp): Dp = Dp(value.coerceAtLeast(minimumValue.value))
 
 /**
  * Ensures that this value is not greater than the specified [maximumValue].
  *
- * @return this value if it's less than or equal to the [maximumValue] or the
- * [maximumValue] otherwise.
+ * @return this value if it's less than or equal to the [maximumValue] or the [maximumValue]
+ *   otherwise.
  */
 @Stable
-inline fun Dp.coerceAtMost(maximumValue: Dp): Dp =
-    Dp(value.coerceAtMost(maximumValue.value))
+inline fun Dp.coerceAtMost(maximumValue: Dp): Dp = Dp(value.coerceAtMost(maximumValue.value))
 
-/**
- *
- * Return `true` when it is finite or `false` when it is [Dp.Infinity]
- */
+/** Return `true` when it is finite or `false` when it is [Dp.Infinity] */
 @Stable
-inline val Dp.isFinite: Boolean get() = value != Float.POSITIVE_INFINITY
+inline val Dp.isFinite: Boolean
+    get() = value != Float.POSITIVE_INFINITY
 
 /**
  * Linearly interpolate between two [Dp]s.
  *
- * The [fraction] argument represents position on the timeline, with 0.0 meaning
- * that the interpolation has not started, returning [start] (or something
- * equivalent to [start]), 1.0 meaning that the interpolation has finished,
- * returning [stop] (or something equivalent to [stop]), and values in between
- * meaning that the interpolation is at the relevant point on the timeline
- * between [start] and [stop]. The interpolation can be extrapolated beyond 0.0 and
- * 1.0, so negative values and values greater than 1.0 are valid.
+ * The [fraction] argument represents position on the timeline, with 0.0 meaning that the
+ * interpolation has not started, returning [start] (or something equivalent to [start]), 1.0
+ * meaning that the interpolation has finished, returning [stop] (or something equivalent to
+ * [stop]), and values in between meaning that the interpolation is at the relevant point on the
+ * timeline between [start] and [stop]. The interpolation can be extrapolated beyond 0.0 and 1.0, so
+ * negative values and values greater than 1.0 are valid.
  */
 @Stable
 fun lerp(start: Dp, stop: Dp, fraction: Float): Dp {
@@ -241,57 +179,35 @@
 // Structures using Dp
 // -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
 
-/**
- * Constructs a [DpOffset] from [x] and [y] position [Dp] values.
- */
-@Stable
-fun DpOffset(x: Dp, y: Dp): DpOffset = DpOffset(packFloats(x.value, y.value))
+/** Constructs a [DpOffset] from [x] and [y] position [Dp] values. */
+@Stable fun DpOffset(x: Dp, y: Dp): DpOffset = DpOffset(packFloats(x.value, y.value))
 
-/**
- * A two-dimensional offset using [Dp] for units
- */
+/** A two-dimensional offset using [Dp] for units */
 @Immutable
 @JvmInline
 value class DpOffset internal constructor(@PublishedApi internal val packedValue: Long) {
-    /**
-     * The horizontal aspect of the offset in [Dp]
-     */
+    /** The horizontal aspect of the offset in [Dp] */
     @Stable
-    val x: Dp get() = unpackFloat1(packedValue).dp
+    val x: Dp
+        get() = unpackFloat1(packedValue).dp
 
-    /**
-     * The vertical aspect of the offset in [Dp]
-     */
+    /** The vertical aspect of the offset in [Dp] */
     @Stable
-    val y: Dp get() = unpackFloat2(packedValue).dp
+    val y: Dp
+        get() = unpackFloat2(packedValue).dp
 
-    /**
-     * Returns a copy of this [DpOffset] instance optionally overriding the
-     * x or y parameter
-     */
+    /** Returns a copy of this [DpOffset] instance optionally overriding the x or y parameter */
     fun copy(x: Dp = this.x, y: Dp = this.y): DpOffset = DpOffset(packFloats(x.value, y.value))
 
-    /**
-     * Subtract a [DpOffset] from another one.
-     */
+    /** Subtract a [DpOffset] from another one. */
     @Stable
-    operator fun minus(other: DpOffset) = DpOffset(
-        packFloats(
-            (x - other.x).value,
-            (y - other.y).value
-        )
-    )
+    operator fun minus(other: DpOffset) =
+        DpOffset(packFloats((x - other.x).value, (y - other.y).value))
 
-    /**
-     * Add a [DpOffset] to another one.
-     */
+    /** Add a [DpOffset] to another one. */
     @Stable
-    operator fun plus(other: DpOffset) = DpOffset(
-        packFloats(
-            (x + other.x).value,
-            (y + other.y).value
-        )
-    )
+    operator fun plus(other: DpOffset) =
+        DpOffset(packFloats((x + other.x).value, (y + other.y).value))
 
     @Stable
     override fun toString(): String =
@@ -302,51 +218,43 @@
         }
 
     companion object {
-        /**
-         * A [DpOffset] with 0 DP [x] and 0 DP [y] values.
-         */
+        /** A [DpOffset] with 0 DP [x] and 0 DP [y] values. */
         val Zero = DpOffset(0x0L)
 
         /**
          * Represents an offset whose [x] and [y] are unspecified. This is usually a replacement for
-         * `null` when a primitive value is desired.
-         * Access to [x] or [y] on an unspecified offset is not allowed.
+         * `null` when a primitive value is desired. Access to [x] or [y] on an unspecified offset
+         * is not allowed.
          */
         val Unspecified = DpOffset(0x7fc00000_7fc00000L)
     }
 }
 
-/**
- * `false` when this is [DpOffset.Unspecified].
- */
+/** `false` when this is [DpOffset.Unspecified]. */
 @Stable
 inline val DpOffset.isSpecified: Boolean
     get() = packedValue != 0x7fc00000_7fc00000L // Keep UnspecifiedPackedFloats internal
 
-/**
- * `true` when this is [DpOffset.Unspecified].
- */
+/** `true` when this is [DpOffset.Unspecified]. */
 @Stable
 inline val DpOffset.isUnspecified: Boolean
     get() = packedValue == 0x7fc00000_7fc00000L // Keep UnspecifiedPackedFloats internal
 
 /**
- * If this [DpOffset]&nbsp;[isSpecified] then this is returned, otherwise [block] is executed
- * and its result is returned.
+ * If this [DpOffset]&nbsp;[isSpecified] then this is returned, otherwise [block] is executed and
+ * its result is returned.
  */
-inline fun DpOffset.takeOrElse(block: () -> DpOffset): DpOffset =
-    if (isSpecified) this else block()
+inline fun DpOffset.takeOrElse(block: () -> DpOffset): DpOffset = if (isSpecified) this else block()
 
 /**
  * Linearly interpolate between two [DpOffset]s.
  *
- * The [fraction] argument represents position on the timeline, with 0.0 meaning
- * that the interpolation has not started, returning [start] (or something
- * equivalent to [start]), 1.0 meaning that the interpolation has finished,
- * returning [stop] (or something equivalent to [stop]), and values in between
- * meaning that the interpolation is at the relevant point on the timeline
- * between [start] and [stop]. The interpolation can be extrapolated beyond 0.0 and
- * 1.0, so negative values and values greater than 1.0 are valid.
+ * The [fraction] argument represents position on the timeline, with 0.0 meaning that the
+ * interpolation has not started, returning [start] (or something equivalent to [start]), 1.0
+ * meaning that the interpolation has finished, returning [stop] (or something equivalent to
+ * [stop]), and values in between meaning that the interpolation is at the relevant point on the
+ * timeline between [start] and [stop]. The interpolation can be extrapolated beyond 0.0 and 1.0, so
+ * negative values and values greater than 1.0 are valid.
  */
 @Stable
 fun lerp(start: DpOffset, stop: DpOffset, fraction: Float): DpOffset =
@@ -357,99 +265,58 @@
         )
     )
 
-/**
- * Constructs a [DpSize] from [width] and [height] [Dp] values.
- */
-@Stable
-fun DpSize(width: Dp, height: Dp): DpSize = DpSize(packFloats(width.value, height.value))
+/** Constructs a [DpSize] from [width] and [height] [Dp] values. */
+@Stable fun DpSize(width: Dp, height: Dp): DpSize = DpSize(packFloats(width.value, height.value))
 
-/**
- * A two-dimensional Size using [Dp] for units
- */
+/** A two-dimensional Size using [Dp] for units */
 @Immutable
 @JvmInline
 value class DpSize internal constructor(@PublishedApi internal val packedValue: Long) {
-    /**
-     * The horizontal aspect of the Size in [Dp]
-     */
+    /** The horizontal aspect of the Size in [Dp] */
     @Stable
-    val width: Dp get() = unpackFloat1(packedValue).dp
+    val width: Dp
+        get() = unpackFloat1(packedValue).dp
 
-    /**
-     * The vertical aspect of the Size in [Dp]
-     */
+    /** The vertical aspect of the Size in [Dp] */
     @Stable
-    val height: Dp get() = unpackFloat2(packedValue).dp
+    val height: Dp
+        get() = unpackFloat2(packedValue).dp
 
     /**
-     * Returns a copy of this [DpSize] instance optionally overriding the
-     * width or height parameter
+     * Returns a copy of this [DpSize] instance optionally overriding the width or height parameter
      */
-    fun copy(width: Dp = this.width, height: Dp = this.height): DpSize = DpSize(
-        packFloats(width.value, height.value)
-    )
+    fun copy(width: Dp = this.width, height: Dp = this.height): DpSize =
+        DpSize(packFloats(width.value, height.value))
 
-    /**
-     * Subtract a [DpSize] from another one.
-     */
+    /** Subtract a [DpSize] from another one. */
     @Stable
     operator fun minus(other: DpSize) =
-        DpSize(
-            packFloats(
-                (width - other.width).value,
-                (height - other.height).value
-            )
-        )
+        DpSize(packFloats((width - other.width).value, (height - other.height).value))
 
-    /**
-     * Add a [DpSize] to another one.
-     */
+    /** Add a [DpSize] to another one. */
     @Stable
     operator fun plus(other: DpSize) =
-        DpSize(
-            packFloats(
-                (width + other.width).value,
-                (height + other.height).value
-            )
-        )
+        DpSize(packFloats((width + other.width).value, (height + other.height).value))
+
+    @Stable inline operator fun component1(): Dp = width
+
+    @Stable inline operator fun component2(): Dp = height
 
     @Stable
-    inline operator fun component1(): Dp = width
+    operator fun times(other: Int): DpSize =
+        DpSize(packFloats((width * other).value, (height * other).value))
 
     @Stable
-    inline operator fun component2(): Dp = height
+    operator fun times(other: Float): DpSize =
+        DpSize(packFloats((width * other).value, (height * other).value))
 
     @Stable
-    operator fun times(other: Int): DpSize = DpSize(
-        packFloats(
-            (width * other).value,
-            (height * other).value
-        )
-    )
+    operator fun div(other: Int): DpSize =
+        DpSize(packFloats((width / other).value, (height / other).value))
 
     @Stable
-    operator fun times(other: Float): DpSize = DpSize(
-        packFloats(
-            (width * other).value,
-            (height * other).value
-        )
-    )
-
-    @Stable
-    operator fun div(other: Int): DpSize = DpSize(
-        packFloats(
-            (width / other).value,
-            (height / other).value
-        )
-    )
-
-    @Stable
-    operator fun div(other: Float): DpSize = DpSize(
-        packFloats(
-            (width / other).value,
-            (height / other).value
-        )
-    )
+    operator fun div(other: Float): DpSize =
+        DpSize(packFloats((width / other).value, (height / other).value))
 
     @Stable
     override fun toString(): String =
@@ -460,69 +327,51 @@
         }
 
     companion object {
-        /**
-         * A [DpSize] with 0 DP [width] and 0 DP [height] values.
-         */
+        /** A [DpSize] with 0 DP [width] and 0 DP [height] values. */
         val Zero = DpSize(0x0L)
 
         /**
          * A size whose [width] and [height] are unspecified. This is usually a replacement for
-         * `null` when a primitive value is desired.
-         * Access to [width] or [height] on an unspecified size is not allowed.
+         * `null` when a primitive value is desired. Access to [width] or [height] on an unspecified
+         * size is not allowed.
          */
         val Unspecified = DpSize(0x7fc00000_7fc00000L)
     }
 }
 
-/**
- * `false` when this is [DpSize.Unspecified].
- */
+/** `false` when this is [DpSize.Unspecified]. */
 @Stable
 inline val DpSize.isSpecified: Boolean
     get() = packedValue != 0x7fc00000_7fc00000L // Keep UnspecifiedPackedFloats internal
 
-/**
- * `true` when this is [DpSize.Unspecified].
- */
+/** `true` when this is [DpSize.Unspecified]. */
 @Stable
 inline val DpSize.isUnspecified: Boolean
     get() = packedValue == 0x7fc00000_7fc00000L // Keep UnspecifiedPackedFloats internal
 
 /**
- * If this [DpSize]&nbsp;[isSpecified] then this is returned, otherwise [block] is executed
- * and its result is returned.
+ * If this [DpSize]&nbsp;[isSpecified] then this is returned, otherwise [block] is executed and its
+ * result is returned.
  */
-inline fun DpSize.takeOrElse(block: () -> DpSize): DpSize =
-    if (isSpecified) this else block()
+inline fun DpSize.takeOrElse(block: () -> DpSize): DpSize = if (isSpecified) this else block()
 
-/**
- * Returns the [DpOffset] of the center of the rect from the point of [0, 0]
- * with this [DpSize].
- */
+/** Returns the [DpOffset] of the center of the rect from the point of [0, 0] with this [DpSize]. */
 @Stable
 val DpSize.center: DpOffset
-    get() = DpOffset(
-        packFloats(
-            (width / 2f).value,
-            (height / 2f).value
-        )
-    )
+    get() = DpOffset(packFloats((width / 2f).value, (height / 2f).value))
 
-@Stable
-inline operator fun Int.times(size: DpSize) = size * this
+@Stable inline operator fun Int.times(size: DpSize) = size * this
 
-@Stable
-inline operator fun Float.times(size: DpSize) = size * this
+@Stable inline operator fun Float.times(size: DpSize) = size * this
 
 /**
  * Linearly interpolate between two [DpSize]s.
  *
- * The [fraction] argument represents position on the timeline, with 0.0 meaning
- * that the interpolation has not started, returning [start], 1.0 meaning that the
- * interpolation has finished, returning [stop], and values in between
- * meaning that the interpolation is at the relevant point on the timeline
- * between [start] and [stop]. The interpolation can be extrapolated beyond 0.0 and
- * 1.0, so negative values and values greater than 1.0 are valid.
+ * The [fraction] argument represents position on the timeline, with 0.0 meaning that the
+ * interpolation has not started, returning [start], 1.0 meaning that the interpolation has
+ * finished, returning [stop], and values in between meaning that the interpolation is at the
+ * relevant point on the timeline between [start] and [stop]. The interpolation can be extrapolated
+ * beyond 0.0 and 1.0, so negative values and values greater than 1.0 are valid.
  */
 @Stable
 fun lerp(start: DpSize, stop: DpSize, fraction: Float): DpSize =
@@ -533,43 +382,34 @@
         )
     )
 
-/**
- * A four dimensional bounds using [Dp] for units
- */
+/** A four dimensional bounds using [Dp] for units */
 @Immutable
 data class DpRect(
-    @Stable
-    val left: Dp,
-    @Stable
-    val top: Dp,
-    @Stable
-    val right: Dp,
-    @Stable
-    val bottom: Dp
+    @Stable val left: Dp,
+    @Stable val top: Dp,
+    @Stable val right: Dp,
+    @Stable val bottom: Dp
 ) {
-    /**
-     * Constructs a [DpRect] from the top-left [origin] and the width and height in [size].
-     */
-    constructor(origin: DpOffset, size: DpSize) :
-        this(origin.x, origin.y, origin.x + size.width, origin.y + size.height)
+    /** Constructs a [DpRect] from the top-left [origin] and the width and height in [size]. */
+    constructor(
+        origin: DpOffset,
+        size: DpSize
+    ) : this(origin.x, origin.y, origin.x + size.width, origin.y + size.height)
 
     companion object
 }
 
-/**
- * A width of this Bounds in [Dp].
- */
+/** A width of this Bounds in [Dp]. */
 @Stable
-inline val DpRect.width: Dp get() = right - left
+inline val DpRect.width: Dp
+    get() = right - left
 
-/**
- * A height of this Bounds in [Dp].
- */
+/** A height of this Bounds in [Dp]. */
 @Stable
-inline val DpRect.height: Dp get() = bottom - top
+inline val DpRect.height: Dp
+    get() = bottom - top
 
-/**
- * Returns the size of the [DpRect].
- */
+/** Returns the size of the [DpRect]. */
 @Stable
-inline val DpRect.size: DpSize get() = DpSize(width, height)
+inline val DpRect.size: DpSize
+    get() = DpSize(width, height)
diff --git a/compose/ui/ui-unit/src/commonMain/kotlin/androidx/compose/ui/unit/FontScaling.kt b/compose/ui/ui-unit/src/commonMain/kotlin/androidx/compose/ui/unit/FontScaling.kt
index 68c3238..2d08740 100644
--- a/compose/ui/ui-unit/src/commonMain/kotlin/androidx/compose/ui/unit/FontScaling.kt
+++ b/compose/ui/ui-unit/src/commonMain/kotlin/androidx/compose/ui/unit/FontScaling.kt
@@ -30,24 +30,18 @@
 @Immutable
 @JvmDefaultWithCompatibility
 expect interface FontScaling {
-    /**
-     * Current user preference for the scaling factor for fonts.
-     */
-    @Stable
-    val fontScale: Float
+    /** Current user preference for the scaling factor for fonts. */
+    @Stable val fontScale: Float
 
-    /**
-     * Convert [Dp] to Sp. Sp is used for font size, etc.
-     */
-    @Stable
-    open fun Dp.toSp(): TextUnit
+    /** Convert [Dp] to Sp. Sp is used for font size, etc. */
+    @Stable open fun Dp.toSp(): TextUnit
 
     /**
      * Convert Sp to [Dp].
+     *
      * @throws IllegalStateException if TextUnit other than SP unit is specified.
      */
-    @Stable
-    open fun TextUnit.toDp(): Dp
+    @Stable open fun TextUnit.toDp(): Dp
 }
 
 /**
@@ -59,20 +53,15 @@
 @JvmDefaultWithCompatibility
 @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
 interface FontScalingLinear {
-    /**
-     * Current user preference for the scaling factor for fonts.
-     */
-    @Stable
-    val fontScale: Float
+    /** Current user preference for the scaling factor for fonts. */
+    @Stable val fontScale: Float
 
-    /**
-     * Convert [Dp] to Sp. Sp is used for font size, etc.
-     */
-    @Stable
-    fun Dp.toSp(): TextUnit = (value / fontScale).sp
+    /** Convert [Dp] to Sp. Sp is used for font size, etc. */
+    @Stable fun Dp.toSp(): TextUnit = (value / fontScale).sp
 
     /**
      * Convert Sp to [Dp].
+     *
      * @throws IllegalStateException if TextUnit other than SP unit is specified.
      */
     @Stable
diff --git a/compose/ui/ui-unit/src/commonMain/kotlin/androidx/compose/ui/unit/InlineClassHelper.kt b/compose/ui/ui-unit/src/commonMain/kotlin/androidx/compose/ui/unit/InlineClassHelper.kt
index bdbe1ab..a40396d 100644
--- a/compose/ui/ui-unit/src/commonMain/kotlin/androidx/compose/ui/unit/InlineClassHelper.kt
+++ b/compose/ui/ui-unit/src/commonMain/kotlin/androidx/compose/ui/unit/InlineClassHelper.kt
@@ -34,9 +34,7 @@
 @Suppress("BanInlineOptIn") // same opt-in as using Kotlin's require()
 @OptIn(ExperimentalContracts::class)
 internal inline fun requirePrecondition(value: Boolean, lazyMessage: () -> String) {
-    contract {
-        returns() implies value
-    }
+    contract { returns() implies value }
     if (!value) {
         throwIllegalArgumentException(lazyMessage())
     }
@@ -51,9 +49,7 @@
 @Suppress("BanInlineOptIn") // same opt-in as using Kotlin's check()
 @OptIn(ExperimentalContracts::class)
 internal inline fun checkPrecondition(value: Boolean, lazyMessage: () -> String) {
-    contract {
-        returns() implies value
-    }
+    contract { returns() implies value }
     if (!value) {
         throwIllegalStateException(lazyMessage())
     }
diff --git a/compose/ui/ui-unit/src/commonMain/kotlin/androidx/compose/ui/unit/IntOffset.kt b/compose/ui/ui-unit/src/commonMain/kotlin/androidx/compose/ui/unit/IntOffset.kt
index 75c000e..5453fc6 100644
--- a/compose/ui/ui-unit/src/commonMain/kotlin/androidx/compose/ui/unit/IntOffset.kt
+++ b/compose/ui/ui-unit/src/commonMain/kotlin/androidx/compose/ui/unit/IntOffset.kt
@@ -27,48 +27,32 @@
 import androidx.compose.ui.util.unpackInt1
 import androidx.compose.ui.util.unpackInt2
 
-/**
- * Constructs a [IntOffset] from [x] and [y] position [Int] values.
- */
-@Stable
-fun IntOffset(x: Int, y: Int): IntOffset = IntOffset(packInts(x, y))
+/** Constructs a [IntOffset] from [x] and [y] position [Int] values. */
+@Stable fun IntOffset(x: Int, y: Int): IntOffset = IntOffset(packInts(x, y))
 
-/**
- * A two-dimensional position using [Int] pixels for units
- */
+/** A two-dimensional position using [Int] pixels for units */
 @Immutable
 @JvmInline
 value class IntOffset internal constructor(@PublishedApi internal val packedValue: Long) {
-    /**
-     * The horizontal aspect of the position in [Int] pixels.
-     */
+    /** The horizontal aspect of the position in [Int] pixels. */
     @Stable
     val x: Int
         get() = unpackInt1(packedValue)
 
-    /**
-     * The vertical aspect of the position in [Int] pixels.
-     */
+    /** The vertical aspect of the position in [Int] pixels. */
     @Stable
     val y: Int
         get() = unpackInt2(packedValue)
 
-    @Stable
-    inline operator fun component1(): Int = x
+    @Stable inline operator fun component1(): Int = x
 
-    @Stable
-    inline operator fun component2(): Int = y
+    @Stable inline operator fun component2(): Int = y
 
-    /**
-     * Returns a copy of this IntOffset instance optionally overriding the
-     * x or y parameter
-     */
+    /** Returns a copy of this IntOffset instance optionally overriding the x or y parameter */
     fun copy(x: Int = unpackInt1(packedValue), y: Int = unpackInt2(packedValue)) =
         IntOffset(packInts(x, y))
 
-    /**
-     * Subtract a [IntOffset] from another one.
-     */
+    /** Subtract a [IntOffset] from another one. */
     @Stable
     operator fun minus(other: IntOffset) =
         IntOffset(
@@ -78,9 +62,7 @@
             )
         )
 
-    /**
-     * Add a [IntOffset] to another one.
-     */
+    /** Add a [IntOffset] to another one. */
     @Stable
     operator fun plus(other: IntOffset) =
         IntOffset(
@@ -98,50 +80,46 @@
     /**
      * Multiplication operator.
      *
-     * Returns an IntOffset whose coordinates are the coordinates of the
-     * left-hand-side operand (an IntOffset) multiplied by the scalar
-     * right-hand-side operand (a Float). The result is rounded to the nearest integer.
+     * Returns an IntOffset whose coordinates are the coordinates of the left-hand-side operand (an
+     * IntOffset) multiplied by the scalar right-hand-side operand (a Float). The result is rounded
+     * to the nearest integer.
      */
     @Stable
-    operator fun times(operand: Float): IntOffset = IntOffset(
-        packInts(
-            (unpackInt1(packedValue) * operand).fastRoundToInt(),
-            (unpackInt2(packedValue) * operand).fastRoundToInt()
+    operator fun times(operand: Float): IntOffset =
+        IntOffset(
+            packInts(
+                (unpackInt1(packedValue) * operand).fastRoundToInt(),
+                (unpackInt2(packedValue) * operand).fastRoundToInt()
+            )
         )
-    )
 
     /**
      * Division operator.
      *
-     * Returns an IntOffset whose coordinates are the coordinates of the
-     * left-hand-side operand (an IntOffset) divided by the scalar right-hand-side
-     * operand (a Float). The result is rounded to the nearest integer.
+     * Returns an IntOffset whose coordinates are the coordinates of the left-hand-side operand (an
+     * IntOffset) divided by the scalar right-hand-side operand (a Float). The result is rounded to
+     * the nearest integer.
      */
     @Stable
-    operator fun div(operand: Float): IntOffset = IntOffset(
-        packInts(
-            (unpackInt1(packedValue) / operand).fastRoundToInt(),
-            (unpackInt2(packedValue) / operand).fastRoundToInt()
+    operator fun div(operand: Float): IntOffset =
+        IntOffset(
+            packInts(
+                (unpackInt1(packedValue) / operand).fastRoundToInt(),
+                (unpackInt2(packedValue) / operand).fastRoundToInt()
+            )
         )
-    )
 
     /**
      * Modulo (remainder) operator.
      *
-     * Returns an IntOffset whose coordinates are the remainder of dividing the
-     * coordinates of the left-hand-side operand (an IntOffset) by the scalar
-     * right-hand-side operand (an Int).
+     * Returns an IntOffset whose coordinates are the remainder of dividing the coordinates of the
+     * left-hand-side operand (an IntOffset) by the scalar right-hand-side operand (an Int).
      */
     @Stable
-    operator fun rem(operand: Int) = IntOffset(
-        packInts(
-            unpackInt1(packedValue) % operand,
-            unpackInt2(packedValue) % operand
-        )
-    )
+    operator fun rem(operand: Int) =
+        IntOffset(packInts(unpackInt1(packedValue) % operand, unpackInt2(packedValue) % operand))
 
-    @Stable
-    override fun toString(): String = "($x, $y)"
+    @Stable override fun toString(): String = "($x, $y)"
 
     companion object {
         val Zero = IntOffset(0x0L)
@@ -151,47 +129,27 @@
 /**
  * Linearly interpolate between two [IntOffset]s.
  *
- * The [fraction] argument represents position on the timeline, with 0.0 meaning
- * that the interpolation has not started, returning [start] (or something
- * equivalent to [start]), 1.0 meaning that the interpolation has finished,
- * returning [stop] (or something equivalent to [stop]), and values in between
- * meaning that the interpolation is at the relevant point on the timeline
- * between [start] and [stop]. The interpolation can be extrapolated beyond 0.0 and
- * 1.0, so negative values and values greater than 1.0 are valid.
+ * The [fraction] argument represents position on the timeline, with 0.0 meaning that the
+ * interpolation has not started, returning [start] (or something equivalent to [start]), 1.0
+ * meaning that the interpolation has finished, returning [stop] (or something equivalent to
+ * [stop]), and values in between meaning that the interpolation is at the relevant point on the
+ * timeline between [start] and [stop]. The interpolation can be extrapolated beyond 0.0 and 1.0, so
+ * negative values and values greater than 1.0 are valid.
  */
 @Stable
 fun lerp(start: IntOffset, stop: IntOffset, fraction: Float): IntOffset =
-    IntOffset(
-        packInts(
-            lerp(start.x, stop.x, fraction),
-            lerp(start.y, stop.y, fraction)
-        )
-    )
+    IntOffset(packInts(lerp(start.x, stop.x, fraction), lerp(start.y, stop.y, fraction)))
 
-/**
- * Converts the [IntOffset] to an [Offset].
- */
-@Stable
-inline fun IntOffset.toOffset() = Offset(x.toFloat(), y.toFloat())
+/** Converts the [IntOffset] to an [Offset]. */
+@Stable inline fun IntOffset.toOffset() = Offset(x.toFloat(), y.toFloat())
 
-@Stable
-operator fun Offset.plus(offset: IntOffset): Offset =
-    Offset(x + offset.x, y + offset.y)
+@Stable operator fun Offset.plus(offset: IntOffset): Offset = Offset(x + offset.x, y + offset.y)
 
-@Stable
-operator fun Offset.minus(offset: IntOffset): Offset =
-    Offset(x - offset.x, y - offset.y)
+@Stable operator fun Offset.minus(offset: IntOffset): Offset = Offset(x - offset.x, y - offset.y)
 
-@Stable
-operator fun IntOffset.plus(offset: Offset): Offset =
-    Offset(x + offset.x, y + offset.y)
+@Stable operator fun IntOffset.plus(offset: Offset): Offset = Offset(x + offset.x, y + offset.y)
 
-@Stable
-operator fun IntOffset.minus(offset: Offset): Offset =
-    Offset(x - offset.x, y - offset.y)
+@Stable operator fun IntOffset.minus(offset: Offset): Offset = Offset(x - offset.x, y - offset.y)
 
-/**
- * Round a [Offset] down to the nearest [Int] coordinates.
- */
-@Stable
-fun Offset.round(): IntOffset = IntOffset(packInts(x.fastRoundToInt(), y.fastRoundToInt()))
+/** Round a [Offset] down to the nearest [Int] coordinates. */
+@Stable fun Offset.round(): IntOffset = IntOffset(packInts(x.fastRoundToInt(), y.fastRoundToInt()))
diff --git a/compose/ui/ui-unit/src/commonMain/kotlin/androidx/compose/ui/unit/IntRect.kt b/compose/ui/ui-unit/src/commonMain/kotlin/androidx/compose/ui/unit/IntRect.kt
index 6b3e922..3ffda4a 100644
--- a/compose/ui/ui-unit/src/commonMain/kotlin/androidx/compose/ui/unit/IntRect.kt
+++ b/compose/ui/ui-unit/src/commonMain/kotlin/androidx/compose/ui/unit/IntRect.kt
@@ -28,64 +28,49 @@
 import kotlin.math.absoluteValue
 
 /**
- * An immutable, 2D, axis-aligned, integer bounds rectangle whose coordinates are relative
- * to a given origin.
+ * An immutable, 2D, axis-aligned, integer bounds rectangle whose coordinates are relative to a
+ * given origin.
  */
 @Immutable
 data class IntRect(
-    /**
-     * The offset of the left edge of this rectangle from the x axis.
-     */
-    @Stable
-    val left: Int,
+    /** The offset of the left edge of this rectangle from the x axis. */
+    @Stable val left: Int,
 
-    /**
-     * The offset of the top edge of this rectangle from the y axis.
-     */
-    @Stable
-    val top: Int,
+    /** The offset of the top edge of this rectangle from the y axis. */
+    @Stable val top: Int,
 
-    /**
-     * The offset of the right edge of this rectangle from the x axis.
-     */
-    @Stable
-    val right: Int,
+    /** The offset of the right edge of this rectangle from the x axis. */
+    @Stable val right: Int,
 
-    /**
-     * The offset of the bottom edge of this rectangle from the y axis.
-     */
-    @Stable
-    val bottom: Int
+    /** The offset of the bottom edge of this rectangle from the y axis. */
+    @Stable val bottom: Int
 ) {
     companion object {
 
         /** A rectangle with left, top, right, and bottom edges all at zero. */
-        @Stable
-        val Zero: IntRect = IntRect(0, 0, 0, 0)
+        @Stable val Zero: IntRect = IntRect(0, 0, 0, 0)
     }
 
     /** The distance between the left and right edges of this rectangle. */
     @Stable
     val width: Int
-        get() { return right - left }
+        get() {
+            return right - left
+        }
 
     /** The distance between the top and bottom edges of this rectangle. */
     @Stable
     val height: Int
-        get() { return bottom - top }
+        get() {
+            return bottom - top
+        }
 
-    /**
-     * The distance between the upper-left corner and the lower-right corner of
-     * this rectangle.
-     */
+    /** The distance between the upper-left corner and the lower-right corner of this rectangle. */
     @Stable
     val size: IntSize
         get() = IntSize(width, height)
 
-    /**
-     * Whether this rectangle encloses a non-zero area. Negative areas are
-     * considered empty.
-     */
+    /** Whether this rectangle encloses a non-zero area. Negative areas are considered empty. */
     @Stable
     val isEmpty: Boolean
         get() = left >= right || top >= bottom
@@ -93,8 +78,8 @@
     /**
      * Returns a new rectangle translated by the given offset.
      *
-     * To translate a rectangle by separate x and y components rather than by an
-     * [Offset], consider [translate].
+     * To translate a rectangle by separate x and y components rather than by an [Offset], consider
+     * [translate].
      */
     @Stable
     fun translate(offset: IntOffset): IntRect {
@@ -102,17 +87,12 @@
     }
 
     /**
-     * Returns a new rectangle with translateX added to the x components and
-     * translateY added to the y components.
+     * Returns a new rectangle with translateX added to the x components and translateY added to the
+     * y components.
      */
     @Stable
     fun translate(translateX: Int, translateY: Int): IntRect {
-        return IntRect(
-            left + translateX,
-            top + translateY,
-            right + translateX,
-            bottom + translateY
-        )
+        return IntRect(left + translateX, top + translateY, right + translateX, bottom + translateY)
     }
 
     /** Returns a new rectangle with edges moved outwards by the given delta. */
@@ -122,14 +102,12 @@
     }
 
     /** Returns a new rectangle with edges moved inwards by the given delta. */
-    @Stable
-    fun deflate(delta: Int): IntRect = inflate(-delta)
+    @Stable fun deflate(delta: Int): IntRect = inflate(-delta)
 
     /**
-     * Returns a new rectangle that is the intersection of the given
-     * rectangle and this rectangle. The two rectangles must overlap
-     * for this to be meaningful. If the two rectangles do not overlap,
-     * then the resulting IntRect will have a negative width or height.
+     * Returns a new rectangle that is the intersection of the given rectangle and this rectangle.
+     * The two rectangles must overlap for this to be meaningful. If the two rectangles do not
+     * overlap, then the resulting IntRect will have a negative width or height.
      */
     @Stable
     fun intersect(other: IntRect): IntRect {
@@ -143,110 +121,85 @@
 
     /** Whether `other` has a nonzero area of overlap with this rectangle. */
     fun overlaps(other: IntRect): Boolean {
-        if (right <= other.left || other.right <= left)
-            return false
-        if (bottom <= other.top || other.bottom <= top)
-            return false
+        if (right <= other.left || other.right <= left) return false
+        if (bottom <= other.top || other.bottom <= top) return false
         return true
     }
 
-    /**
-     * The lesser of the magnitudes of the [width] and the [height] of this
-     * rectangle.
-     */
+    /** The lesser of the magnitudes of the [width] and the [height] of this rectangle. */
     val minDimension: Int
         get() = kotlin.math.min(width.absoluteValue, height.absoluteValue)
 
-    /**
-     * The greater of the magnitudes of the [width] and the [height] of this
-     * rectangle.
-     */
+    /** The greater of the magnitudes of the [width] and the [height] of this rectangle. */
     val maxDimension: Int
         get() = kotlin.math.max(width.absoluteValue, height.absoluteValue)
 
-    /**
-     * The offset to the intersection of the top and left edges of this rectangle.
-     */
+    /** The offset to the intersection of the top and left edges of this rectangle. */
     val topLeft: IntOffset
         get() = IntOffset(left, top)
 
-    /**
-     * The offset to the center of the top edge of this rectangle.
-     */
+    /** The offset to the center of the top edge of this rectangle. */
     val topCenter: IntOffset
         get() = IntOffset(left + width / 2, top)
 
-    /**
-     * The offset to the intersection of the top and right edges of this rectangle.
-     */
+    /** The offset to the intersection of the top and right edges of this rectangle. */
     val topRight: IntOffset
         get() = IntOffset(right, top)
 
-    /**
-     * The offset to the center of the left edge of this rectangle.
-     */
+    /** The offset to the center of the left edge of this rectangle. */
     val centerLeft: IntOffset
         get() = IntOffset(left, top + height / 2)
 
     /**
-     * The offset to the point halfway between the left and right and the top and
-     * bottom edges of this rectangle.
+     * The offset to the point halfway between the left and right and the top and bottom edges of
+     * this rectangle.
      *
      * See also [IntSize.center].
      */
     val center: IntOffset
         get() = IntOffset(left + width / 2, top + height / 2)
 
-    /**
-     * The offset to the center of the right edge of this rectangle.
-     */
+    /** The offset to the center of the right edge of this rectangle. */
     val centerRight: IntOffset
         get() = IntOffset(right, top + height / 2)
 
-    /**
-     * The offset to the intersection of the bottom and left edges of this rectangle.
-     */
+    /** The offset to the intersection of the bottom and left edges of this rectangle. */
     val bottomLeft: IntOffset
         get() = IntOffset(left, bottom)
 
-    /**
-     * The offset to the center of the bottom edge of this rectangle.
-     */
+    /** The offset to the center of the bottom edge of this rectangle. */
     val bottomCenter: IntOffset
-        get() { return IntOffset(left + width / 2, bottom) }
+        get() {
+            return IntOffset(left + width / 2, bottom)
+        }
 
-    /**
-     * The offset to the intersection of the bottom and right edges of this rectangle.
-     */
+    /** The offset to the intersection of the bottom and right edges of this rectangle. */
     val bottomRight: IntOffset
-        get() { return IntOffset(right, bottom) }
+        get() {
+            return IntOffset(right, bottom)
+        }
 
     /**
-     * Whether the point specified by the given offset (which is assumed to be
-     * relative to the origin) lies between the left and right and the top and
-     * bottom edges of this rectangle.
+     * Whether the point specified by the given offset (which is assumed to be relative to the
+     * origin) lies between the left and right and the top and bottom edges of this rectangle.
      *
-     * Rectangles include their top and left edges but exclude their bottom and
-     * right edges.
+     * Rectangles include their top and left edges but exclude their bottom and right edges.
      */
     fun contains(offset: IntOffset): Boolean {
         return offset.x >= left && offset.x < right && offset.y >= top && offset.y < bottom
     }
 
-    override fun toString() = "IntRect.fromLTRB(" +
-        "$left, " +
-        "$top, " +
-        "$right, " +
-        "$bottom)"
+    override fun toString() = "IntRect.fromLTRB(" + "$left, " + "$top, " + "$right, " + "$bottom)"
 }
 
 /**
  * Construct a rectangle from its left and top edges as well as its width and height.
+ *
  * @param offset Offset to represent the top and left parameters of the Rect
  * @param size Size to determine the width and height of this [IntRect].
- * @return Rect with [IntRect.left] and [IntRect.top] configured to [IntOffset.x] and
- * [IntOffset.y] as [IntRect.right] and [IntRect.bottom] to [IntOffset.x] + [IntSize.width] and
- * [IntOffset.y] + [IntSize.height] respectively
+ * @return Rect with [IntRect.left] and [IntRect.top] configured to [IntOffset.x] and [IntOffset.y]
+ *   as [IntRect.right] and [IntRect.bottom] to [IntOffset.x] + [IntSize.width] and
+ *   [IntOffset.y] + [IntSize.height] respectively
  */
 @Stable
 fun IntRect(offset: IntOffset, size: IntSize) =
@@ -258,48 +211,38 @@
     )
 
 /**
- * Construct the smallest rectangle that encloses the given offsets, treating
- * them as vectors from the origin.
+ * Construct the smallest rectangle that encloses the given offsets, treating them as vectors from
+ * the origin.
+ *
  * @param topLeft Offset representing the left and top edges of the rectangle
  * @param bottomRight Offset representing the bottom and right edges of the rectangle
  */
 @Stable
 fun IntRect(topLeft: IntOffset, bottomRight: IntOffset): IntRect =
-    IntRect(
-        topLeft.x,
-        topLeft.y,
-        bottomRight.x,
-        bottomRight.y
-    )
+    IntRect(topLeft.x, topLeft.y, bottomRight.x, bottomRight.y)
 
 /**
  * Construct a rectangle that bounds the given circle
+ *
  * @param center Offset that represents the center of the circle
  * @param radius Radius of the circle to enclose
  */
 @Stable
 fun IntRect(center: IntOffset, radius: Int): IntRect =
-    IntRect(
-        center.x - radius,
-        center.y - radius,
-        center.x + radius,
-        center.y + radius
-    )
+    IntRect(center.x - radius, center.y - radius, center.x + radius, center.y + radius)
 
 /**
  * Linearly interpolate between two rectangles.
  *
- * The [fraction] argument represents position on the timeline, with 0.0 meaning
- * that the interpolation has not started, returning [start] (or something
- * equivalent to [start]), 1.0 meaning that the interpolation has finished,
- * returning [stop] (or something equivalent to [stop]), and values in between
- * meaning that the interpolation is at the relevant point on the timeline
- * between [start] and [stop]. The interpolation can be extrapolated beyond 0.0 and
- * 1.0, so negative values and values greater than 1.0 are valid (and can
- * easily be generated by curves).
+ * The [fraction] argument represents position on the timeline, with 0.0 meaning that the
+ * interpolation has not started, returning [start] (or something equivalent to [start]), 1.0
+ * meaning that the interpolation has finished, returning [stop] (or something equivalent to
+ * [stop]), and values in between meaning that the interpolation is at the relevant point on the
+ * timeline between [start] and [stop]. The interpolation can be extrapolated beyond 0.0 and 1.0, so
+ * negative values and values greater than 1.0 are valid (and can easily be generated by curves).
  *
- * Values for [fraction] are usually obtained from an [Animation<Float>], such as
- * an `AnimationController`.
+ * Values for [fraction] are usually obtained from an [Animation<Float>], such as an
+ * `AnimationController`.
  */
 @Stable
 fun lerp(start: IntRect, stop: IntRect, fraction: Float): IntRect {
@@ -311,24 +254,22 @@
     )
 }
 
-/**
- * Converts an [IntRect] to a [Rect]
- */
+/** Converts an [IntRect] to a [Rect] */
 @Stable
-fun IntRect.toRect(): Rect = Rect(
-    left = left.toFloat(),
-    top = top.toFloat(),
-    right = right.toFloat(),
-    bottom = bottom.toFloat()
-)
+fun IntRect.toRect(): Rect =
+    Rect(
+        left = left.toFloat(),
+        top = top.toFloat(),
+        right = right.toFloat(),
+        bottom = bottom.toFloat()
+    )
 
-/**
- * Rounds a [Rect] to an [IntRect]
- */
+/** Rounds a [Rect] to an [IntRect] */
 @Stable
-fun Rect.roundToIntRect(): IntRect = IntRect(
-    left = left.fastRoundToInt(),
-    top = top.fastRoundToInt(),
-    right = right.fastRoundToInt(),
-    bottom = bottom.fastRoundToInt()
-)
+fun Rect.roundToIntRect(): IntRect =
+    IntRect(
+        left = left.fastRoundToInt(),
+        top = top.fastRoundToInt(),
+        right = right.fastRoundToInt(),
+        bottom = bottom.fastRoundToInt()
+    )
diff --git a/compose/ui/ui-unit/src/commonMain/kotlin/androidx/compose/ui/unit/IntSize.kt b/compose/ui/ui-unit/src/commonMain/kotlin/androidx/compose/ui/unit/IntSize.kt
index 2757c10..9ba8646 100644
--- a/compose/ui/ui-unit/src/commonMain/kotlin/androidx/compose/ui/unit/IntSize.kt
+++ b/compose/ui/ui-unit/src/commonMain/kotlin/androidx/compose/ui/unit/IntSize.kt
@@ -26,120 +26,81 @@
 import androidx.compose.ui.util.unpackInt1
 import androidx.compose.ui.util.unpackInt2
 
-/**
- * Constructs an [IntSize] from width and height [Int] values.
- */
-@Stable
-fun IntSize(width: Int, height: Int): IntSize = IntSize(packInts(width, height))
+/** Constructs an [IntSize] from width and height [Int] values. */
+@Stable fun IntSize(width: Int, height: Int): IntSize = IntSize(packInts(width, height))
 
-/**
- * A two-dimensional size class used for measuring in [Int] pixels.
- */
+/** A two-dimensional size class used for measuring in [Int] pixels. */
 @Immutable
 @kotlin.jvm.JvmInline
 value class IntSize internal constructor(@PublishedApi internal val packedValue: Long) {
-    /**
-     * The horizontal aspect of the size in [Int] pixels.
-     */
+    /** The horizontal aspect of the size in [Int] pixels. */
     @Stable
     val width: Int
         get() = unpackInt1(packedValue)
 
-    /**
-     * The vertical aspect of the size in [Int] pixels.
-     */
+    /** The vertical aspect of the size in [Int] pixels. */
     @Stable
     val height: Int
         get() = unpackInt2(packedValue)
 
-    @Stable
-    inline operator fun component1(): Int = width
+    @Stable inline operator fun component1(): Int = width
 
-    @Stable
-    inline operator fun component2(): Int = height
+    @Stable inline operator fun component2(): Int = height
 
-    /**
-     * Returns an IntSize scaled by multiplying [width] and [height] by [other]
-     */
+    /** Returns an IntSize scaled by multiplying [width] and [height] by [other] */
     @Stable
-    operator fun times(other: Int): IntSize = IntSize(
-        packInts(
-            unpackInt1(packedValue) * other,
-            unpackInt2(packedValue) * other
-        )
-    )
+    operator fun times(other: Int): IntSize =
+        IntSize(packInts(unpackInt1(packedValue) * other, unpackInt2(packedValue) * other))
 
-    /**
-     * Returns an IntSize scaled by dividing [width] and [height] by [other]
-     */
+    /** Returns an IntSize scaled by dividing [width] and [height] by [other] */
     @Stable
-    operator fun div(other: Int): IntSize = IntSize(
-        packInts(
-            unpackInt1(packedValue) / other,
-            unpackInt2(packedValue) / other
-        )
-    )
+    operator fun div(other: Int): IntSize =
+        IntSize(packInts(unpackInt1(packedValue) / other, unpackInt2(packedValue) / other))
 
-    @Stable
-    override fun toString(): String = "$width x $height"
+    @Stable override fun toString(): String = "$width x $height"
 
     companion object {
-        /**
-         * IntSize with a zero (0) width and height.
-         */
+        /** IntSize with a zero (0) width and height. */
         val Zero = IntSize(0L)
     }
 }
 
-/**
- * Returns an [IntSize] with [size]'s [IntSize.width] and [IntSize.height]
- * multiplied by [this].
- */
-@Stable
-inline operator fun Int.times(size: IntSize) = size * this
+/** Returns an [IntSize] with [size]'s [IntSize.width] and [IntSize.height] multiplied by [this]. */
+@Stable inline operator fun Int.times(size: IntSize) = size * this
 
-/**
- * Convert a [IntSize] to a [IntRect].
- */
+/** Convert a [IntSize] to a [IntRect]. */
 @Stable
 fun IntSize.toIntRect(): IntRect {
     return IntRect(IntOffset.Zero, this)
 }
 
 /**
- * Returns the [IntOffset] of the center of the rect from the point of [0, 0]
- * with this [IntSize].
+ * Returns the [IntOffset] of the center of the rect from the point of [0, 0] with this [IntSize].
  */
 @Stable
 val IntSize.center: IntOffset
-    get() = IntOffset(
-        // Divide X by 2 by moving it to the low bits, then place it back in the high bits
-        (packedValue shr 33 shl 32)
-        or
-        // Move Y to the high bits so we can preserve the sign when dividing by 2, then
-        // move Y back to the low bits and mask out the top 32 bits for X
-        ((packedValue shl 32 shr 33) and 0xffffffffL)
-    )
+    get() =
+        IntOffset(
+            // Divide X by 2 by moving it to the low bits, then place it back in the high bits
+            (packedValue shr 33 shl 32) or
+                // Move Y to the high bits so we can preserve the sign when dividing by 2, then
+                // move Y back to the low bits and mask out the top 32 bits for X
+                ((packedValue shl 32 shr 33) and 0xffffffffL)
+        )
 
 // temporary while PxSize is transitioned to Size
-@Stable
-fun IntSize.toSize() = Size(width.toFloat(), height.toFloat())
+@Stable fun IntSize.toSize() = Size(width.toFloat(), height.toFloat())
 
 /**
  * Convert a [Size] to an [IntSize]. This rounds the width and height values down to the nearest
  * integer.
  */
-@Stable
-fun Size.toIntSize(): IntSize = IntSize(packInts(this.width.toInt(), this.height.toInt()))
+@Stable fun Size.toIntSize(): IntSize = IntSize(packInts(this.width.toInt(), this.height.toInt()))
 
 /**
  * Convert a [Size] to an [IntSize]. This rounds [Size.width] and [Size.height] to the nearest
  * integer.
  */
 @Stable
-fun Size.roundToIntSize(): IntSize = IntSize(
-    packInts(
-        this.width.fastRoundToInt(),
-        this.height.fastRoundToInt()
-    )
-)
+fun Size.roundToIntSize(): IntSize =
+    IntSize(packInts(this.width.fastRoundToInt(), this.height.fastRoundToInt()))
diff --git a/compose/ui/ui-unit/src/commonMain/kotlin/androidx/compose/ui/unit/LayoutDirection.kt b/compose/ui/ui-unit/src/commonMain/kotlin/androidx/compose/ui/unit/LayoutDirection.kt
index efbfb17..76a3b44 100644
--- a/compose/ui/ui-unit/src/commonMain/kotlin/androidx/compose/ui/unit/LayoutDirection.kt
+++ b/compose/ui/ui-unit/src/commonMain/kotlin/androidx/compose/ui/unit/LayoutDirection.kt
@@ -22,13 +22,9 @@
  * A layout direction can be left-to-right (LTR) or right-to-left (RTL).
  */
 enum class LayoutDirection {
-    /**
-     * Horizontal layout direction is from Left to Right.
-     */
+    /** Horizontal layout direction is from Left to Right. */
     Ltr,
 
-    /**
-     * Horizontal layout direction is from Right to Left.
-     */
+    /** Horizontal layout direction is from Right to Left. */
     Rtl
 }
diff --git a/compose/ui/ui-unit/src/commonMain/kotlin/androidx/compose/ui/unit/TextUnit.kt b/compose/ui/ui-unit/src/commonMain/kotlin/androidx/compose/ui/unit/TextUnit.kt
index 4817cfe..73bd40b 100644
--- a/compose/ui/ui-unit/src/commonMain/kotlin/androidx/compose/ui/unit/TextUnit.kt
+++ b/compose/ui/ui-unit/src/commonMain/kotlin/androidx/compose/ui/unit/TextUnit.kt
@@ -24,25 +24,20 @@
 import androidx.compose.ui.util.lerp
 
 /**
- * We encode the unit information and float value into the single 64-bit long integer.
- * The higher 32bit represents the metadata of this value and lower 32bit represents the bit
- * representation of the float value. Currently lower 8bits in the metadata bits are used for
- * unit information.
+ * We encode the unit information and float value into the single 64-bit long integer. The higher
+ * 32bit represents the metadata of this value and lower 32bit represents the bit representation of
+ * the float value. Currently lower 8bits in the metadata bits are used for unit information.
  *
- * Bits
- * |-------|-------|-------|-------|-------|-------|-------|-------|
- *                                  FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF: Float Value
- *                          UUUUUUUU                                : Unit Information
- *  XXXXXXXXXXXXXXXXXXXXXXXX                                        : Unused bits
+ * Bits |-------|-------|-------|-------|-------|-------|-------|-------|
+ * FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF: Float Value UUUUUUUU : Unit Information
+ * XXXXXXXXXXXXXXXXXXXXXXXX : Unused bits
  */
 private const val UNIT_MASK = 0xFFL shl 32 // 0xFF_0000_0000
 private const val UNIT_TYPE_UNSPECIFIED = 0x00L shl 32 // 0x00_0000_0000
 private const val UNIT_TYPE_SP = 0x01L shl 32 // 0x01_0000_0000
 private const val UNIT_TYPE_EM = 0x02L shl 32 // 0x2_0000_0000
 
-/**
- * An enum class defining for type of [TextUnit].
- */
+/** An enum class defining for type of [TextUnit]. */
 @kotlin.jvm.JvmInline
 value class TextUnitType(internal val type: Long) {
     override fun toString(): String {
@@ -74,11 +69,11 @@
  *
  * This unit can hold either scaled pixels (SP), relative font size (EM) and special unit
  * Unspecified for indicating inheriting from other style or using the default value. It can be
- * created with [sp] or [em]. (e.g. 15.sp or 18.em) which can be applied to [Int], [Double],
- * and [Float].
+ * created with [sp] or [em]. (e.g. 15.sp or 18.em) which can be applied to [Int], [Double], and
+ * [Float].
  *
- * Note that do not store this value in your persistent storage or send to another process since
- * the internal representation may be changed in future.
+ * Note that do not store this value in your persistent storage or send to another process since the
+ * internal representation may be changed in future.
  */
 @Immutable
 @kotlin.jvm.JvmInline
@@ -86,8 +81,8 @@
     /**
      * This is the same as multiplying the [TextUnit] by -1.0.
      *
-     * This operation works only if the operand is not equal to [TextUnit.Unspecified].
-     * The result of this operation is the same unit type of the given one.
+     * This operation works only if the operand is not equal to [TextUnit.Unspecified]. The result
+     * of this operation is the same unit type of the given one.
      *
      * @throws IllegalArgumentException if this [TextUnit]'s type is [TextUnitType.Unspecified].
      */
@@ -99,8 +94,8 @@
     /**
      * Divide a [TextUnit] by a scalar.
      *
-     * This operation works only if the left operand is not equal to [TextUnit.Unspecified].
-     * The result of this operation is the same unit type of the given one.
+     * This operation works only if the left operand is not equal to [TextUnit.Unspecified]. The
+     * result of this operation is the same unit type of the given one.
      *
      * @throws IllegalArgumentException if this [TextUnit]'s type is [TextUnitType.Unspecified].
      */
@@ -112,8 +107,8 @@
     /**
      * Divide a [TextUnit] by a scalar.
      *
-     * This operation works only if the left operand is not equal to [TextUnit.Unspecified].
-     * The result of this operation is the same unit type of the given one.
+     * This operation works only if the left operand is not equal to [TextUnit.Unspecified]. The
+     * result of this operation is the same unit type of the given one.
      *
      * @throws IllegalArgumentException if this [TextUnit]'s type is [TextUnitType.Unspecified].
      */
@@ -125,8 +120,8 @@
     /**
      * Divide a [TextUnit] by a scalar.
      *
-     * This operation works only if the left operand is not equal to [TextUnit.Unspecified].
-     * The result of this operation is the same unit type of the given one.
+     * This operation works only if the left operand is not equal to [TextUnit.Unspecified]. The
+     * result of this operation is the same unit type of the given one.
      *
      * @throws IllegalArgumentException if this [TextUnit]'s type is [TextUnitType.Unspecified].
      */
@@ -138,8 +133,8 @@
     /**
      * Multiply a [TextUnit] by a scalar.
      *
-     * This operation works only if the left operand is not equal to [TextUnit.Unspecified].
-     * The result of this operation is the same unit type of the given one.
+     * This operation works only if the left operand is not equal to [TextUnit.Unspecified]. The
+     * result of this operation is the same unit type of the given one.
      *
      * @throws IllegalArgumentException if this [TextUnit]'s type is [TextUnitType.Unspecified].
      */
@@ -151,8 +146,8 @@
     /**
      * Multiply a [TextUnit] by a scalar.
      *
-     * This operation works only if the left operand is not equal to [TextUnit.Unspecified].
-     * The result of this operation is the same unit type of the given one.
+     * This operation works only if the left operand is not equal to [TextUnit.Unspecified]. The
+     * result of this operation is the same unit type of the given one.
      *
      * @throws IllegalArgumentException if this [TextUnit]'s type is [TextUnitType.Unspecified].
      */
@@ -164,8 +159,8 @@
     /**
      * Multiply a [TextUnit] by a scalar.
      *
-     * This operation works only if the left operand is not equal to [TextUnit.Unspecified].
-     * The result of this operation is the same unit type of the given one.
+     * This operation works only if the left operand is not equal to [TextUnit.Unspecified]. The
+     * result of this operation is the same unit type of the given one.
      *
      * @throws IllegalArgumentException if this [TextUnit]'s type is [TextUnitType.Unspecified].
      */
@@ -178,10 +173,10 @@
      * Support comparing Dimensions with comparison operators.
      *
      * @return 0 if this [TextUnit] equals to the [other], a negative number if it's less than the
-     * [other], or a positive number if it's greater than the [other].
+     *   [other], or a positive number if it's greater than the [other].
      * @throws IllegalArgumentException if this [TextUnit] and the [other] has different
-     * [TextUnitType]s or either of the two has the [TextUnitType] equals to
-     * [TextUnitType.Unspecified].
+     *   [TextUnitType]s or either of the two has the [TextUnitType] equals to
+     *   [TextUnitType.Unspecified].
      */
     inline operator fun compareTo(other: TextUnit): Int {
         checkArithmetic(this, other)
@@ -207,8 +202,7 @@
          * Notice that performing arithmetic operations on [Unspecified] may result in an
          * [IllegalArgumentException].
          */
-        @Stable
-        val Unspecified = pack(UNIT_TYPE_UNSPECIFIED, Float.NaN)
+        @Stable val Unspecified = pack(UNIT_TYPE_UNSPECIFIED, Float.NaN)
     }
 
     /**
@@ -217,22 +211,20 @@
      * Use [TextUnit.type] in public places.
      */
     @PublishedApi
-    internal val rawType: Long get() = packedValue and UNIT_MASK
+    internal val rawType: Long
+        get() = packedValue and UNIT_MASK
 
-    /**
-     * A type information of this TextUnit.
-     */
-    val type: TextUnitType get() = TextUnitTypes[(rawType ushr 32).toInt()]
+    /** A type information of this TextUnit. */
+    val type: TextUnitType
+        get() = TextUnitTypes[(rawType ushr 32).toInt()]
 
-    /**
-     * True if this is a SP unit type.
-     */
-    val isSp get() = rawType == UNIT_TYPE_SP
+    /** True if this is a SP unit type. */
+    val isSp
+        get() = rawType == UNIT_TYPE_SP
 
-    /**
-     * True if this is a EM unit type.
-     */
-    val isEm get() = rawType == UNIT_TYPE_EM
+    /** True if this is a EM unit type. */
+    val isEm
+        get() = rawType == UNIT_TYPE_EM
 
     /**
      * Returns the value of this [TextUnit].
@@ -240,71 +232,61 @@
      * For example, the value of 3.sp equals to 3, and value of 5.em equals to 5. The value of
      * [TextUnit]s whose [TextUnitType] is [TextUnitType.Unspecified] is undefined.
      */
-    val value get() = floatFromBits((packedValue and 0xFFFF_FFFFL).toInt())
+    val value
+        get() = floatFromBits((packedValue and 0xFFFF_FFFFL).toInt())
 }
 
-/**
- * `false` when this is [TextUnit.Unspecified].
- */
+/** `false` when this is [TextUnit.Unspecified]. */
 @Stable
 inline val TextUnit.isSpecified: Boolean
     get() = !isUnspecified
 
-/**
- * `true` when this is [TextUnit.Unspecified].
- */
+/** `true` when this is [TextUnit.Unspecified]. */
 @Stable
 val TextUnit.isUnspecified: Boolean
     get() = rawType == UNIT_TYPE_UNSPECIFIED
 
 /**
- * If this [TextUnit] [isSpecified] then this is returned, otherwise [block] is executed
- * and its result is returned.
+ * If this [TextUnit] [isSpecified] then this is returned, otherwise [block] is executed and its
+ * result is returned.
  */
-inline fun TextUnit.takeOrElse(block: () -> TextUnit): TextUnit =
-    if (isSpecified) this else block()
+inline fun TextUnit.takeOrElse(block: () -> TextUnit): TextUnit = if (isSpecified) this else block()
 
-/**
- * Creates a SP unit [TextUnit]
- */
+/** Creates a SP unit [TextUnit] */
 @Stable
-val Float.sp: TextUnit get() = pack(UNIT_TYPE_SP, this)
+val Float.sp: TextUnit
+    get() = pack(UNIT_TYPE_SP, this)
 
-/**
- * Creates an EM unit [TextUnit]
- */
+/** Creates an EM unit [TextUnit] */
 @Stable
-val Float.em: TextUnit get() = pack(UNIT_TYPE_EM, this)
+val Float.em: TextUnit
+    get() = pack(UNIT_TYPE_EM, this)
 
-/**
- * Creates a SP unit [TextUnit]
- */
+/** Creates a SP unit [TextUnit] */
 @Stable
-val Double.sp: TextUnit get() = pack(UNIT_TYPE_SP, this.toFloat())
+val Double.sp: TextUnit
+    get() = pack(UNIT_TYPE_SP, this.toFloat())
 
-/**
- * Creates an EM unit [TextUnit]
- */
+/** Creates an EM unit [TextUnit] */
 @Stable
-val Double.em: TextUnit get() = pack(UNIT_TYPE_EM, this.toFloat())
+val Double.em: TextUnit
+    get() = pack(UNIT_TYPE_EM, this.toFloat())
 
-/**
- * Creates a SP unit [TextUnit]
- */
+/** Creates a SP unit [TextUnit] */
 @Stable
-val Int.sp: TextUnit get() = pack(UNIT_TYPE_SP, this.toFloat())
+val Int.sp: TextUnit
+    get() = pack(UNIT_TYPE_SP, this.toFloat())
 
-/**
- * Creates an EM unit [TextUnit]
- */
+/** Creates an EM unit [TextUnit] */
 @Stable
-val Int.em: TextUnit get() = pack(UNIT_TYPE_EM, this.toFloat())
+val Int.em: TextUnit
+    get() = pack(UNIT_TYPE_EM, this.toFloat())
 
 /**
  * Multiply a [TextUnit] by a scalar.
  *
- * This operation works only if the right operand is not equal to [TextUnit.Unspecified].
- * The result of this operation is the same unit type of the given one.
+ * This operation works only if the right operand is not equal to [TextUnit.Unspecified]. The result
+ * of this operation is the same unit type of the given one.
  */
 @Stable
 inline operator fun Float.times(other: TextUnit): TextUnit {
@@ -315,8 +297,8 @@
 /**
  * Multiply a [TextUnit] by a scalar.
  *
- * This operation works only if the right operand is not equal to [TextUnit.Unspecified].
- * The result of this operation is the same unit type of the given one.
+ * This operation works only if the right operand is not equal to [TextUnit.Unspecified]. The result
+ * of this operation is the same unit type of the given one.
  */
 @Stable
 inline operator fun Double.times(other: TextUnit): TextUnit {
@@ -327,8 +309,8 @@
 /**
  * Multiply a [TextUnit] by a scalar.
  *
- * This operation works only if the right operand is not equal to [TextUnit.Unspecified].
- * The result of this operation is the same unit type of the given one.
+ * This operation works only if the right operand is not equal to [TextUnit.Unspecified]. The result
+ * of this operation is the same unit type of the given one.
  */
 @Stable
 inline operator fun Int.times(other: TextUnit): TextUnit {
@@ -342,9 +324,7 @@
 
 @PublishedApi
 internal fun checkArithmetic(a: TextUnit) {
-    require(!a.isUnspecified) {
-        "Cannot perform operation for Unspecified type."
-    }
+    require(!a.isUnspecified) { "Cannot perform operation for Unspecified type." }
 }
 
 @PublishedApi
@@ -352,9 +332,7 @@
     require(!a.isUnspecified && !b.isUnspecified) {
         "Cannot perform operation for Unspecified type."
     }
-    require(a.type == b.type) {
-        "Cannot perform operation for ${a.type} and ${b.type}"
-    }
+    require(a.type == b.type) { "Cannot perform operation for ${a.type} and ${b.type}" }
 }
 
 @PublishedApi
@@ -370,16 +348,15 @@
 /**
  * Linearly interpolate between two [TextUnit]s.
  *
- * The [fraction] argument represents position on the timeline, with 0.0 meaning
- * that the interpolation has not started, returning [start] (or something
- * equivalent to [start]), 1.0 meaning that the interpolation has finished,
- * returning [stop] (or something equivalent to [stop]), and values in between
- * meaning that the interpolation is at the relevant point on the timeline
- * between [start] and [stop]. The interpolation can be extrapolated beyond 0.0 and
- * 1.0, so negative values and values greater than 1.0 are valid.
+ * The [fraction] argument represents position on the timeline, with 0.0 meaning that the
+ * interpolation has not started, returning [start] (or something equivalent to [start]), 1.0
+ * meaning that the interpolation has finished, returning [stop] (or something equivalent to
+ * [stop]), and values in between meaning that the interpolation is at the relevant point on the
+ * timeline between [start] and [stop]. The interpolation can be extrapolated beyond 0.0 and 1.0, so
+ * negative values and values greater than 1.0 are valid.
  *
- * @throws IllegalArgumentException if [start] and [stop] have different [TextUnitType]s, or
- * either of the two has its [TextUnitType] equal to [TextUnitType.Unspecified].
+ * @throws IllegalArgumentException if [start] and [stop] have different [TextUnitType]s, or either
+ *   of the two has its [TextUnitType] equal to [TextUnitType.Unspecified].
  */
 @Stable
 fun lerp(start: TextUnit, stop: TextUnit, fraction: Float): TextUnit {
diff --git a/compose/ui/ui-unit/src/commonMain/kotlin/androidx/compose/ui/unit/Velocity.kt b/compose/ui/ui-unit/src/commonMain/kotlin/androidx/compose/ui/unit/Velocity.kt
index 1108692..be81fd1 100644
--- a/compose/ui/ui-unit/src/commonMain/kotlin/androidx/compose/ui/unit/Velocity.kt
+++ b/compose/ui/ui-unit/src/commonMain/kotlin/androidx/compose/ui/unit/Velocity.kt
@@ -30,43 +30,29 @@
  * @param x Horizontal component of the velocity in pixels per second
  * @param y Vertical component of the velocity in pixels per second
  */
-@Stable
-fun Velocity(x: Float, y: Float) = Velocity(packFloats(x, y))
+@Stable fun Velocity(x: Float, y: Float) = Velocity(packFloats(x, y))
 
-/**
- * A two dimensional velocity in pixels per second.
- */
+/** A two dimensional velocity in pixels per second. */
 @Immutable
 @kotlin.jvm.JvmInline
 value class Velocity internal constructor(private val packedValue: Long) {
-    /**
-     * The horizontal component of the velocity in pixels per second.
-     */
+    /** The horizontal component of the velocity in pixels per second. */
     @Stable
-    val x: Float get() = unpackFloat1(packedValue)
+    val x: Float
+        get() = unpackFloat1(packedValue)
 
-    /**
-     * The vertical component of the velocity in pixels per second.
-     */
+    /** The vertical component of the velocity in pixels per second. */
     @Stable
-    val y: Float get() = unpackFloat2(packedValue)
+    val y: Float
+        get() = unpackFloat2(packedValue)
 
-    /**
-     * The horizontal component of the velocity in pixels per second.
-     */
-    @Stable
-    inline operator fun component1(): Float = x
+    /** The horizontal component of the velocity in pixels per second. */
+    @Stable inline operator fun component1(): Float = x
 
-    /**
-     * The vertical component of the velocity in pixels per second.
-     */
-    @Stable
-    inline operator fun component2(): Float = y
+    /** The vertical component of the velocity in pixels per second. */
+    @Stable inline operator fun component2(): Float = y
 
-    /**
-     * Returns a copy of this [Velocity] instance optionally overriding the
-     * x or y parameter
-     */
+    /** Returns a copy of this [Velocity] instance optionally overriding the x or y parameter */
     fun copy(x: Float = unpackFloat1(packedValue), y: Float = unpackFloat2(packedValue)) =
         Velocity(packFloats(x, y))
 
@@ -76,8 +62,7 @@
          *
          * This can be used to represent the origin of a coordinate space.
          */
-        @Stable
-        val Zero = Velocity(0x0L)
+        @Stable val Zero = Velocity(0x0L)
     }
 
     /**
@@ -85,86 +70,77 @@
      *
      * Returns a [Velocity] with the coordinates negated.
      *
-     * If the [Velocity] represents an arrow on a plane, this operator returns the
-     * same arrow but pointing in the reverse direction.
+     * If the [Velocity] represents an arrow on a plane, this operator returns the same arrow but
+     * pointing in the reverse direction.
      */
-    @Stable
-    operator fun unaryMinus(): Velocity = Velocity(packedValue xor DualFloatSignBit)
+    @Stable operator fun unaryMinus(): Velocity = Velocity(packedValue xor DualFloatSignBit)
 
     /**
      * Binary subtraction operator.
      *
-     * Returns a [Velocity] whose [x] value is the left-hand-side operand's [x]
-     * minus the right-hand-side operand's [x] and whose [y] value is the
-     * left-hand-side operand's [y] minus the right-hand-side operand's [y].
+     * Returns a [Velocity] whose [x] value is the left-hand-side operand's [x] minus the
+     * right-hand-side operand's [x] and whose [y] value is the left-hand-side operand's [y] minus
+     * the right-hand-side operand's [y].
      */
     @Stable
-    operator fun minus(other: Velocity): Velocity = Velocity(
-        packFloats(
-            unpackFloat1(packedValue) - unpackFloat1(other.packedValue),
-            unpackFloat2(packedValue) - unpackFloat2(other.packedValue)
+    operator fun minus(other: Velocity): Velocity =
+        Velocity(
+            packFloats(
+                unpackFloat1(packedValue) - unpackFloat1(other.packedValue),
+                unpackFloat2(packedValue) - unpackFloat2(other.packedValue)
+            )
         )
-    )
 
     /**
      * Binary addition operator.
      *
-     * Returns a [Velocity] whose [x] value is the sum of the [x] values of the
-     * two operands, and whose [y] value is the sum of the [y] values of the
-     * two operands.
+     * Returns a [Velocity] whose [x] value is the sum of the [x] values of the two operands, and
+     * whose [y] value is the sum of the [y] values of the two operands.
      */
     @Stable
-    operator fun plus(other: Velocity): Velocity = Velocity(
-        packFloats(
-            unpackFloat1(packedValue) + unpackFloat1(other.packedValue),
-            unpackFloat2(packedValue) + unpackFloat2(other.packedValue)
+    operator fun plus(other: Velocity): Velocity =
+        Velocity(
+            packFloats(
+                unpackFloat1(packedValue) + unpackFloat1(other.packedValue),
+                unpackFloat2(packedValue) + unpackFloat2(other.packedValue)
+            )
         )
-    )
 
     /**
      * Multiplication operator.
      *
-     * Returns a [Velocity] whose coordinates are those of the
-     * left-hand-side operand (a [Velocity]) multiplied by the scalar
-     * right-hand-side operand (a [Float]).
+     * Returns a [Velocity] whose coordinates are those of the left-hand-side operand (a [Velocity])
+     * multiplied by the scalar right-hand-side operand (a [Float]).
      */
     @Stable
-    operator fun times(operand: Float): Velocity = Velocity(
-        packFloats(
-            unpackFloat1(packedValue) * operand,
-            unpackFloat2(packedValue) * operand
+    operator fun times(operand: Float): Velocity =
+        Velocity(
+            packFloats(unpackFloat1(packedValue) * operand, unpackFloat2(packedValue) * operand)
         )
-    )
 
     /**
      * Division operator.
      *
-     * Returns a [Velocity] whose coordinates are those of the
-     * left-hand-side operand (an [Velocity]) divided by the scalar right-hand-side
-     * operand (a [Float]).
+     * Returns a [Velocity] whose coordinates are those of the left-hand-side operand (an
+     * [Velocity]) divided by the scalar right-hand-side operand (a [Float]).
      */
     @Stable
-    operator fun div(operand: Float): Velocity = Velocity(
-        packFloats(
-            unpackFloat1(packedValue) / operand,
-            unpackFloat2(packedValue) / operand
+    operator fun div(operand: Float): Velocity =
+        Velocity(
+            packFloats(unpackFloat1(packedValue) / operand, unpackFloat2(packedValue) / operand)
         )
-    )
 
     /**
      * Modulo (remainder) operator.
      *
-     * Returns a [Velocity] whose coordinates are the remainder of dividing the
-     * coordinates of the left-hand-side operand (a [Velocity]) by the scalar
-     * right-hand-side operand (a [Float]).
+     * Returns a [Velocity] whose coordinates are the remainder of dividing the coordinates of the
+     * left-hand-side operand (a [Velocity]) by the scalar right-hand-side operand (a [Float]).
      */
     @Stable
-    operator fun rem(operand: Float) = Velocity(
-        packFloats(
-            unpackFloat1(packedValue) % operand,
-            unpackFloat2(packedValue) % operand
+    operator fun rem(operand: Float) =
+        Velocity(
+            packFloats(unpackFloat1(packedValue) % operand, unpackFloat2(packedValue) % operand)
         )
-    )
 
     override fun toString() = "($x, $y) px/sec"
 }
diff --git a/compose/ui/ui-unit/src/desktopMain/kotlin/androidx/compose/ui/unit/FontScaling.desktop.kt b/compose/ui/ui-unit/src/desktopMain/kotlin/androidx/compose/ui/unit/FontScaling.desktop.kt
index 609aa4c..9f1c181 100644
--- a/compose/ui/ui-unit/src/desktopMain/kotlin/androidx/compose/ui/unit/FontScaling.desktop.kt
+++ b/compose/ui/ui-unit/src/desktopMain/kotlin/androidx/compose/ui/unit/FontScaling.desktop.kt
@@ -16,7 +16,5 @@
 
 package androidx.compose.ui.unit
 
-/**
- * Converts [TextUnit] to [Dp] and vice-versa.
- */
+/** Converts [TextUnit] to [Dp] and vice-versa. */
 actual typealias FontScaling = FontScalingLinear
diff --git a/compose/ui/ui-util/src/androidMain/kotlin/androidx/compose/ui/util/AndroidTrace.android.kt b/compose/ui/ui-util/src/androidMain/kotlin/androidx/compose/ui/util/AndroidTrace.android.kt
index da5318c..7c1870c 100644
--- a/compose/ui/ui-util/src/androidMain/kotlin/androidx/compose/ui/util/AndroidTrace.android.kt
+++ b/compose/ui/ui-util/src/androidMain/kotlin/androidx/compose/ui/util/AndroidTrace.android.kt
@@ -19,8 +19,8 @@
 import android.os.Trace
 
 /**
- * Wrap the specified [block] in calls to [Trace.beginSection] (with the supplied [sectionName])
- * and [Trace.endSection].
+ * Wrap the specified [block] in calls to [Trace.beginSection] (with the supplied [sectionName]) and
+ * [Trace.endSection].
  */
 actual inline fun <T> trace(sectionName: String, block: () -> T): T {
     Trace.beginSection(sectionName)
diff --git a/compose/ui/ui-util/src/androidUnitTest/kotlin/androidx/compose/ui/util/ListUtilsTest.kt b/compose/ui/ui-util/src/androidUnitTest/kotlin/androidx/compose/ui/util/ListUtilsTest.kt
index d59b8b1..51e5282 100644
--- a/compose/ui/ui-util/src/androidUnitTest/kotlin/androidx/compose/ui/util/ListUtilsTest.kt
+++ b/compose/ui/ui-util/src/androidUnitTest/kotlin/androidx/compose/ui/util/ListUtilsTest.kt
@@ -30,9 +30,7 @@
     fun regularIteration() {
         val list = listOf(1, 5, 10)
         val otherList = mutableListOf<Int>()
-        list.fastForEach {
-            otherList.add(it)
-        }
+        list.fastForEach { otherList.add(it) }
         // The correct iteration order, all items in there
         assertEquals(otherList, list)
     }
@@ -110,6 +108,7 @@
         val list = listOf(0, -1, -500)
         assertNull(list.fastFirstOrNull { it > 0 })
     }
+
     @Test
     fun firstOrNullFound() {
         val list = listOf(0, -1, -500, 1)
diff --git a/compose/ui/ui-util/src/commonMain/kotlin/androidx/compose/ui/InternalComposeUiApi.kt b/compose/ui/ui-util/src/commonMain/kotlin/androidx/compose/ui/InternalComposeUiApi.kt
index 476d2aa..5a1d38d 100644
--- a/compose/ui/ui-util/src/commonMain/kotlin/androidx/compose/ui/InternalComposeUiApi.kt
+++ b/compose/ui/ui-util/src/commonMain/kotlin/androidx/compose/ui/InternalComposeUiApi.kt
@@ -17,8 +17,8 @@
 package androidx.compose.ui
 
 /**
- * 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.
+ * 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.
  */
 @RequiresOptIn(
     "Unstable API for use only between compose-ui modules sharing the same exact version, " +
diff --git a/compose/ui/ui-util/src/commonMain/kotlin/androidx/compose/ui/util/InlineClassHelper.kt b/compose/ui/ui-util/src/commonMain/kotlin/androidx/compose/ui/util/InlineClassHelper.kt
index fc06db4..9ba66eb 100644
--- a/compose/ui/ui-util/src/commonMain/kotlin/androidx/compose/ui/util/InlineClassHelper.kt
+++ b/compose/ui/ui-util/src/commonMain/kotlin/androidx/compose/ui/util/InlineClassHelper.kt
@@ -24,92 +24,68 @@
 // through the Companion class. Using these top-level functions,
 // the generated arm64 code after dex2oat is exactly a single `fmov`
 
-/**
- * Returns the [Float] value corresponding to a given bit representation.
- */
+/** Returns the [Float] value corresponding to a given bit representation. */
 expect fun floatFromBits(bits: Int): Float
 
-/**
- * Returns the [Double] value corresponding to a given bit representation.
- */
+/** Returns the [Double] value corresponding to a given bit representation. */
 expect fun doubleFromBits(bits: Long): Double
 
 /**
- * Returns the closest integer to the argument, tying rounding to positive
- * infinity. Some values are treated differently:
+ * Returns the closest integer to the argument, tying rounding to positive infinity. Some values are
+ * treated differently:
  * - NaN becomes 0
- * - -Infinity or any value less than Integer.MIN_VALUE becomes
- *   Integer.MIN_VALUE.toFloat()
- * - +Infinity or any value greater than Integer.MAX_VALUE becomes
- *   Integer.MAX_VALUE.toFloat()
+ * - -Infinity or any value less than Integer.MIN_VALUE becomes Integer.MIN_VALUE.toFloat()
+ * - +Infinity or any value greater than Integer.MAX_VALUE becomes Integer.MAX_VALUE.toFloat()
  */
 expect fun Float.fastRoundToInt(): Int
 
 /**
- * Returns the closest integer to the argument, tying rounding to positive
- * infinity. Some values are treated differently:
+ * Returns the closest integer to the argument, tying rounding to positive infinity. Some values are
+ * treated differently:
  * - NaN becomes 0
- * - -Infinity or any value less than Integer.MIN_VALUE becomes
- *   Integer.MIN_VALUE.toFloat()
- * - +Infinity or any value greater than Integer.MAX_VALUE becomes
- *   Integer.MAX_VALUE.toFloat()
+ * - -Infinity or any value less than Integer.MIN_VALUE becomes Integer.MIN_VALUE.toFloat()
+ * - +Infinity or any value greater than Integer.MAX_VALUE becomes Integer.MAX_VALUE.toFloat()
  */
 expect fun Double.fastRoundToInt(): Int
 
-/**
- * Packs two Float values into one Long value for use in inline classes.
- */
+/** Packs two Float values into one Long value for use in inline classes. */
 inline fun packFloats(val1: Float, val2: Float): Long {
     val v1 = val1.toRawBits().toLong()
     val v2 = val2.toRawBits().toLong()
     return (v1 shl 32) or (v2 and 0xFFFFFFFF)
 }
 
-/**
- * Unpacks the first Float value in [packFloats] from its returned Long.
- */
+/** Unpacks the first Float value in [packFloats] from its returned Long. */
 inline fun unpackFloat1(value: Long): Float {
     return floatFromBits((value shr 32).toInt())
 }
 
-/**
- * Unpacks the first absolute Float value in [packFloats] from its returned Long.
- */
+/** Unpacks the first absolute Float value in [packFloats] from its returned Long. */
 inline fun unpackAbsFloat1(value: Long): Float {
     return floatFromBits(((value shr 32) and 0x7FFFFFFF).toInt())
 }
 
-/**
- * Unpacks the second Float value in [packFloats] from its returned Long.
- */
+/** Unpacks the second Float value in [packFloats] from its returned Long. */
 inline fun unpackFloat2(value: Long): Float {
     return floatFromBits((value and 0xFFFFFFFF).toInt())
 }
 
-/**
- * Unpacks the second absolute Float value in [packFloats] from its returned Long.
- */
+/** Unpacks the second absolute Float value in [packFloats] from its returned Long. */
 inline fun unpackAbsFloat2(value: Long): Float {
     return floatFromBits((value and 0x7FFFFFFF).toInt())
 }
 
-/**
- * Packs two Int values into one Long value for use in inline classes.
- */
+/** Packs two Int values into one Long value for use in inline classes. */
 inline fun packInts(val1: Int, val2: Int): Long {
     return (val1.toLong() shl 32) or (val2.toLong() and 0xFFFFFFFF)
 }
 
-/**
- * Unpacks the first Int value in [packInts] from its returned ULong.
- */
+/** Unpacks the first Int value in [packInts] from its returned ULong. */
 inline fun unpackInt1(value: Long): Int {
     return (value shr 32).toInt()
 }
 
-/**
- * Unpacks the second Int value in [packInts] from its returned ULong.
- */
+/** Unpacks the second Int value in [packInts] from its returned ULong. */
 inline fun unpackInt2(value: Long): Int {
     return (value and 0xFFFFFFFF).toInt()
 }
diff --git a/compose/ui/ui-util/src/commonMain/kotlin/androidx/compose/ui/util/ListUtils.kt b/compose/ui/ui-util/src/commonMain/kotlin/androidx/compose/ui/util/ListUtils.kt
index bb8caf3..80d197e 100644
--- a/compose/ui/ui-util/src/commonMain/kotlin/androidx/compose/ui/util/ListUtils.kt
+++ b/compose/ui/ui-util/src/commonMain/kotlin/androidx/compose/ui/util/ListUtils.kt
@@ -20,8 +20,8 @@
 import kotlin.contracts.contract
 
 /**
- * Iterates through a [List] using the index and calls [action] for each item.
- * This does not allocate an iterator like [Iterable.forEach].
+ * Iterates through a [List] using the index and calls [action] for each item. This does not
+ * allocate an iterator like [Iterable.forEach].
  *
  * **Do not use for collections that come from public APIs**, since they may not support random
  * access in an efficient way, and this method may actually be a lot slower. Only use for
@@ -38,8 +38,8 @@
 }
 
 /**
- * Iterates through a [List] in reverse order using the index and calls [action] for each item.
- * This does not allocate an iterator like [Iterable.forEach].
+ * Iterates through a [List] in reverse order using the index and calls [action] for each item. This
+ * does not allocate an iterator like [Iterable.forEach].
  *
  * **Do not use for collections that come from public APIs**, since they may not support random
  * access in an efficient way, and this method may actually be a lot slower. Only use for
@@ -56,8 +56,8 @@
 }
 
 /**
- * Iterates through a [List] using the index and calls [action] for each item.
- * This does not allocate an iterator like [Iterable.forEachIndexed].
+ * Iterates through a [List] using the index and calls [action] for each item. This does not
+ * allocate an iterator like [Iterable.forEachIndexed].
  *
  * **Do not use for collections that come from public APIs**, since they may not support random
  * access in an efficient way, and this method may actually be a lot slower. Only use for
@@ -131,15 +131,13 @@
 inline fun <T> List<T>.fastSumBy(selector: (T) -> Int): Int {
     contract { callsInPlace(selector) }
     var sum = 0
-    fastForEach { element ->
-        sum += selector(element)
-    }
+    fastForEach { element -> sum += selector(element) }
     return sum
 }
 
 /**
- * Returns a list containing the results of applying the given [transform] function
- * to each element in the original collection.
+ * Returns a list containing the results of applying the given [transform] function to each element
+ * in the original collection.
  *
  * **Do not use for collections that come from public APIs**, since they may not support random
  * access in an efficient way, and this method may actually be a lot slower. Only use for
@@ -150,16 +148,14 @@
 inline fun <T, R> List<T>.fastMap(transform: (T) -> R): List<R> {
     contract { callsInPlace(transform) }
     val target = ArrayList<R>(size)
-    fastForEach {
-        target += transform(it)
-    }
+    fastForEach { target += transform(it) }
     return target
 }
 
 // TODO: should be fastMaxByOrNull to match stdlib
 /**
- * Returns the first element yielding the largest value of the given function or `null` if there
- * are no elements.
+ * Returns the first element yielding the largest value of the given function or `null` if there are
+ * no elements.
  *
  * **Do not use for collections that come from public APIs**, since they may not support random
  * access in an efficient way, and this method may actually be a lot slower. Only use for
@@ -184,8 +180,8 @@
 }
 
 /**
- * Applies the given [transform] function to each element of the original collection
- * and appends the results to the given [destination].
+ * Applies the given [transform] function to each element of the original collection and appends the
+ * results to the given [destination].
  *
  * **Do not use for collections that come from public APIs**, since they may not support random
  * access in an efficient way, and this method may actually be a lot slower. Only use for
@@ -198,9 +194,7 @@
     transform: (T) -> R
 ): C {
     contract { callsInPlace(transform) }
-    fastForEach { item ->
-        destination.add(transform(item))
-    }
+    fastForEach { item -> destination.add(transform(item)) }
     return destination
 }
 
@@ -234,15 +228,13 @@
 inline fun <T> List<T>.fastFilter(predicate: (T) -> Boolean): List<T> {
     contract { callsInPlace(predicate) }
     val target = ArrayList<T>(size)
-    fastForEach {
-        if (predicate(it)) target += (it)
-    }
+    fastForEach { if (predicate(it)) target += (it) }
     return target
 }
 
 /**
- * Accumulates value starting with [initial] value and applying [operation] from left to right
- * to current accumulator value and each element.
+ * Accumulates value starting with [initial] value and applying [operation] from left to right to
+ * current accumulator value and each element.
  *
  * Returns the specified [initial] value if the collection is empty.
  *
@@ -255,15 +247,13 @@
 inline fun <T, R> List<T>.fastFold(initial: R, operation: (acc: R, T) -> R): R {
     contract { callsInPlace(operation) }
     var accumulator = initial
-    fastForEach { e ->
-        accumulator = operation(accumulator, e)
-    }
+    fastForEach { e -> accumulator = operation(accumulator, e) }
     return accumulator
 }
 
 /**
- * Returns a list containing the results of applying the given [transform] function
- * to each element in the original collection.
+ * Returns a list containing the results of applying the given [transform] function to each element
+ * in the original collection.
  *
  * **Do not use for collections that come from public APIs**, since they may not support random
  * access in an efficient way, and this method may actually be a lot slower. Only use for
@@ -271,20 +261,16 @@
  */
 @OptIn(ExperimentalContracts::class)
 @Suppress("BanInlineOptIn") // Treat Kotlin Contracts as non-experimental.
-inline fun <T, R> List<T>.fastMapIndexed(
-    transform: (index: Int, T) -> R
-): List<R> {
+inline fun <T, R> List<T>.fastMapIndexed(transform: (index: Int, T) -> R): List<R> {
     contract { callsInPlace(transform) }
     val target = ArrayList<R>(size)
-    fastForEachIndexed { index, e ->
-        target += transform(index, e)
-    }
+    fastForEachIndexed { index, e -> target += transform(index, e) }
     return target
 }
 
 /**
- * Returns a list containing the results of applying the given [transform] function
- * to each element in the original collection.
+ * Returns a list containing the results of applying the given [transform] function to each element
+ * in the original collection.
  *
  * **Do not use for collections that come from public APIs**, since they may not support random
  * access in an efficient way, and this method may actually be a lot slower. Only use for
@@ -292,14 +278,10 @@
  */
 @OptIn(ExperimentalContracts::class)
 @Suppress("BanInlineOptIn") // Treat Kotlin Contracts as non-experimental.
-inline fun <T, R> List<T>.fastMapIndexedNotNull(
-    transform: (index: Int, T) -> R?
-): List<R> {
+inline fun <T, R> List<T>.fastMapIndexedNotNull(transform: (index: Int, T) -> R?): List<R> {
     contract { callsInPlace(transform) }
     val target = ArrayList<R>(size)
-    fastForEachIndexed { index, e ->
-        transform(index, e)?.let { target += it }
-    }
+    fastForEachIndexed { index, e -> transform(index, e)?.let { target += it } }
     return target
 }
 
@@ -325,8 +307,8 @@
 }
 
 /**
- * Returns a list containing the results of applying the given [transform] function
- * to each pair of two adjacent elements in this collection.
+ * Returns a list containing the results of applying the given [transform] function to each pair of
+ * two adjacent elements in this collection.
  *
  * The returned list is empty if this collection contains less than two elements.
  *
@@ -351,8 +333,8 @@
 }
 
 /**
- * Accumulates value starting with the first element and applying [operation] from left to right
- * to current accumulator value and each element.
+ * Accumulates value starting with the first element and applying [operation] from left to right to
+ * current accumulator value and each element.
  *
  * Throws an exception if this collection is empty. If the collection can be empty in an expected
  * way, please use [reduceOrNull] instead. It returns `null` when its receiver is empty.
@@ -361,9 +343,8 @@
  * access in an efficient way, and this method may actually be a lot slower. Only use for
  * collections that are created by code we control and are known to support random access.
  *
- * @param [operation] function that takes current accumulator value and an element,
- * and calculates the next accumulator value.
- *
+ * @param [operation] function that takes current accumulator value and an element, and calculates
+ *   the next accumulator value.
  * @throws UnsupportedOperationException if this collection is empty
  */
 @Suppress("BanInlineOptIn")
@@ -379,9 +360,9 @@
 }
 
 /**
- * Returns a list of values built from the elements of `this` collection and the [other] collection with the same index
- * using the provided [transform] function applied to each pair of elements.
- * The returned list has length of the shortest collection.
+ * Returns a list of values built from the elements of `this` collection and the [other] collection
+ * with the same index using the provided [transform] function applied to each pair of elements. The
+ * returned list has length of the shortest collection.
  *
  * **Do not use for collections that come from public APIs**, since they may not support random
  * access in an efficient way, and this method may actually be a lot slower. Only use for
@@ -389,10 +370,7 @@
  */
 @Suppress("BanInlineOptIn")
 @OptIn(ExperimentalContracts::class)
-inline fun <T, R, V> List<T>.fastZip(
-    other: List<R>,
-    transform: (a: T, b: R) -> V
-): List<V> {
+inline fun <T, R, V> List<T>.fastZip(other: List<R>, transform: (a: T, b: R) -> V): List<V> {
     contract { callsInPlace(transform) }
     val minSize = minOf(size, other.size)
     val target = ArrayList<V>(minSize)
@@ -403,8 +381,8 @@
 }
 
 /**
- * Returns a list containing the results of applying the given [transform] function
- * to each element in the original collection.
+ * Returns a list containing the results of applying the given [transform] function to each element
+ * in the original collection.
  *
  * **Do not use for collections that come from public APIs**, since they may not support random
  * access in an efficient way, and this method may actually be a lot slower. Only use for
@@ -415,9 +393,7 @@
 inline fun <T, R> List<T>.fastMapNotNull(transform: (T) -> R?): List<R> {
     contract { callsInPlace(transform) }
     val target = ArrayList<R>(size)
-    fastForEach { e ->
-        transform(e)?.let { target += it }
-    }
+    fastForEach { e -> transform(e)?.let { target += it } }
     return target
 }
 
@@ -446,8 +422,8 @@
 }
 
 /**
- * Returns a list containing only elements from the given collection
- * having distinct keys returned by the given [selector] function.
+ * Returns a list containing only elements from the given collection having distinct keys returned
+ * by the given [selector] function.
  *
  * The elements in the resulting list are in the same order as they were in the source collection.
  *
@@ -469,8 +445,8 @@
 }
 
 /**
- * Returns the first element yielding the largest value of the given function or `null` if there
- * are no elements.
+ * Returns the first element yielding the largest value of the given function or `null` if there are
+ * no elements.
  *
  * **Do not use for collections that come from public APIs**, since they may not support random
  * access in an efficient way, and this method may actually be a lot slower. Only use for
@@ -523,9 +499,7 @@
  */
 fun <T : Any> List<T?>.fastFilterNotNull(): List<T> {
     val target = ArrayList<T>(size)
-    fastForEach {
-        if ((it) != null) target += (it)
-    }
+    fastForEach { if ((it) != null) target += (it) }
     return target
 }
 
@@ -547,12 +521,12 @@
 }
 
 /**
- * Appends the string from all the elements separated using [separator] and using the given
- * [prefix] and [postfix] if supplied.
+ * Appends the string from all the elements separated using [separator] and using the given [prefix]
+ * and [postfix] if supplied.
  *
- * If the collection could be huge, you can specify a non-negative value of [limit], in which
- * case only the first [limit] elements will be appended, followed by the [truncated] string
- * (which defaults to "...").
+ * If the collection could be huge, you can specify a non-negative value of [limit], in which case
+ * only the first [limit] elements will be appended, followed by the [truncated] string (which
+ * defaults to "...").
  *
  * **Do not use for collections that come from public APIs**, since they may not support random
  * access in an efficient way, and this method may actually be a lot slower. Only use for
@@ -581,9 +555,7 @@
     return buffer
 }
 
-/**
- * Copied from Appendable.kt
- */
+/** Copied from Appendable.kt */
 private fun <T> Appendable.appendElement(element: T, transform: ((T) -> CharSequence)?) {
     when {
         transform != null -> append(transform(element))
diff --git a/compose/ui/ui-util/src/commonMain/kotlin/androidx/compose/ui/util/MathHelpers.kt b/compose/ui/ui-util/src/commonMain/kotlin/androidx/compose/ui/util/MathHelpers.kt
index c0e5ba0..368d8a9 100644
--- a/compose/ui/ui-util/src/commonMain/kotlin/androidx/compose/ui/util/MathHelpers.kt
+++ b/compose/ui/ui-util/src/commonMain/kotlin/androidx/compose/ui/util/MathHelpers.kt
@@ -17,31 +17,25 @@
 
 import kotlin.math.roundToLong
 
-/**
- * Linearly interpolate between [start] and [stop] with [fraction] fraction between them.
- */
+/** Linearly interpolate between [start] and [stop] with [fraction] fraction between them. */
 fun lerp(start: Float, stop: Float, fraction: Float): Float {
     return (1 - fraction) * start + fraction * stop
 }
 
-/**
- * Linearly interpolate between [start] and [stop] with [fraction] fraction between them.
- */
+/** Linearly interpolate between [start] and [stop] with [fraction] fraction between them. */
 fun lerp(start: Int, stop: Int, fraction: Float): Int {
     return start + ((stop - start) * fraction.toDouble()).fastRoundToInt()
 }
 
-/**
- * Linearly interpolate between [start] and [stop] with [fraction] fraction between them.
- */
+/** Linearly interpolate between [start] and [stop] with [fraction] fraction between them. */
 fun lerp(start: Long, stop: Long, fraction: Float): Long {
     return start + ((stop - start) * fraction.toDouble()).roundToLong()
 }
 
 /**
- * Returns the smaller of the given values. If any value is NaN, returns NaN.
- * Preferred over `kotlin.comparisons.minfOf()` for 4 arguments as it avoids
- * allocating an array because of the varargs.
+ * Returns the smaller of the given values. If any value is NaN, returns NaN. Preferred over
+ * `kotlin.comparisons.minfOf()` for 4 arguments as it avoids allocating an array because of the
+ * varargs.
  */
 @Suppress("NOTHING_TO_INLINE")
 inline fun fastMinOf(a: Float, b: Float, c: Float, d: Float): Float {
@@ -50,9 +44,9 @@
 }
 
 /**
- * Returns the largest of the given values. If any value is NaN, returns NaN.
- * Preferred over `kotlin.comparisons.maxOf()` for 4 arguments as it avoids
- * allocating an array because of the varargs.
+ * Returns the largest of the given values. If any value is NaN, returns NaN. Preferred over
+ * `kotlin.comparisons.maxOf()` for 4 arguments as it avoids allocating an array because of the
+ * varargs.
  */
 @Suppress("NOTHING_TO_INLINE")
 inline fun fastMaxOf(a: Float, b: Float, c: Float, d: Float): Float {
@@ -61,60 +55,50 @@
 }
 
 /**
- * Returns this float value clamped in the inclusive range defined by
- * [minimumValue] and [maximumValue]. Unlike [Float.coerceIn], the range
- * is not validated: the caller must ensure that [minimumValue] is less than
- * [maximumValue].
+ * Returns this float value clamped in the inclusive range defined by [minimumValue] and
+ * [maximumValue]. Unlike [Float.coerceIn], the range is not validated: the caller must ensure that
+ * [minimumValue] is less than [maximumValue].
  */
 @Suppress("NOTHING_TO_INLINE")
 inline fun Float.fastCoerceIn(minimumValue: Float, maximumValue: Float) =
     this.fastCoerceAtLeast(minimumValue).fastCoerceAtMost(maximumValue)
 
-/**
- * Ensures that this value is not less than the specified [minimumValue].
- */
+/** Ensures that this value is not less than the specified [minimumValue]. */
 @Suppress("NOTHING_TO_INLINE")
 inline fun Float.fastCoerceAtLeast(minimumValue: Float): Float {
     return if (this < minimumValue) minimumValue else this
 }
 
-/**
- * Ensures that this value is not greater than the specified [maximumValue].
- */
+/** Ensures that this value is not greater than the specified [maximumValue]. */
 @Suppress("NOTHING_TO_INLINE")
 inline fun Float.fastCoerceAtMost(maximumValue: Float): Float {
     return if (this > maximumValue) maximumValue else this
 }
 
 /**
- * Returns this double value clamped in the inclusive range defined by
- * [minimumValue] and [maximumValue]. Unlike [Float.coerceIn], the range
- * is not validated: the caller must ensure that [minimumValue] is less than
- * [maximumValue].
+ * Returns this double value clamped in the inclusive range defined by [minimumValue] and
+ * [maximumValue]. Unlike [Float.coerceIn], the range is not validated: the caller must ensure that
+ * [minimumValue] is less than [maximumValue].
  */
 @Suppress("NOTHING_TO_INLINE")
 inline fun Double.fastCoerceIn(minimumValue: Double, maximumValue: Double) =
     this.fastCoerceAtLeast(minimumValue).fastCoerceAtMost(maximumValue)
 
-/**
- * Ensures that this value is not less than the specified [minimumValue].
- */
+/** Ensures that this value is not less than the specified [minimumValue]. */
 @Suppress("NOTHING_TO_INLINE")
 inline fun Double.fastCoerceAtLeast(minimumValue: Double): Double {
     return if (this < minimumValue) minimumValue else this
 }
 
-/**
- * Ensures that this value is not greater than the specified [maximumValue].
- */
+/** Ensures that this value is not greater than the specified [maximumValue]. */
 @Suppress("NOTHING_TO_INLINE")
 inline fun Double.fastCoerceAtMost(maximumValue: Double): Double {
     return if (this > maximumValue) maximumValue else this
 }
 
 /**
- * Fast, approximate cube root function. Returns the cube root
- * of [x]; for any [x] `fastCbrt(-x) == -fastCbrt(x)`.
+ * Fast, approximate cube root function. Returns the cube root of [x]; for any [x] `fastCbrt(-x) ==
+ * -fastCbrt(x)`.
  *
  * When [x] is:
  * - [Float.NaN], returns [Float.NaN]
diff --git a/compose/ui/ui-viewbinding/samples/src/androidTest/java/androidx/compose/ui/samples/AndroidViewBindingTest.kt b/compose/ui/ui-viewbinding/samples/src/androidTest/java/androidx/compose/ui/samples/AndroidViewBindingTest.kt
index 908b85a..fb24e36 100644
--- a/compose/ui/ui-viewbinding/samples/src/androidTest/java/androidx/compose/ui/samples/AndroidViewBindingTest.kt
+++ b/compose/ui/ui-viewbinding/samples/src/androidTest/java/androidx/compose/ui/samples/AndroidViewBindingTest.kt
@@ -49,8 +49,7 @@
 @SdkSuppress(minSdkVersion = Build.VERSION_CODES.O)
 class AndroidViewBindingTest {
 
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
     @Test
     fun drawing() {
@@ -77,16 +76,14 @@
 
         val size = 50.dp
         val sizePx = with(rule.density) { size.roundToPx() }
-        rule.onNodeWithTag("layout").captureToImage()
-            .assertPixels(IntSize(sizePx, sizePx * 2)) {
-                if (it.y < sizePx) Color.Blue else color.value
-            }
+        rule.onNodeWithTag("layout").captureToImage().assertPixels(IntSize(sizePx, sizePx * 2)) {
+            if (it.y < sizePx) Color.Blue else color.value
+        }
 
         rule.runOnIdle { color.value = Color.DarkGray }
-        rule.onNodeWithTag("layout").captureToImage()
-            .assertPixels(IntSize(sizePx, sizePx * 2)) {
-                if (it.y < sizePx) Color.Blue else color.value
-            }
+        rule.onNodeWithTag("layout").captureToImage().assertPixels(IntSize(sizePx, sizePx * 2)) {
+            if (it.y < sizePx) Color.Blue else color.value
+        }
     }
 
     @Test
diff --git a/compose/ui/ui-viewbinding/samples/src/androidTest/java/androidx/compose/ui/samples/FragmentRecreateTest.kt b/compose/ui/ui-viewbinding/samples/src/androidTest/java/androidx/compose/ui/samples/FragmentRecreateTest.kt
index 5de01b8..7d9e503 100644
--- a/compose/ui/ui-viewbinding/samples/src/androidTest/java/androidx/compose/ui/samples/FragmentRecreateTest.kt
+++ b/compose/ui/ui-viewbinding/samples/src/androidTest/java/androidx/compose/ui/samples/FragmentRecreateTest.kt
@@ -56,9 +56,7 @@
             assertThat(binding.editText.text.toString()).isEqualTo("Default")
 
             // Update the state to make sure it gets saved and restored properly
-            withActivity {
-                binding.editText.setText("Updated")
-            }
+            withActivity { binding.editText.setText("Updated") }
 
             recreate()
 
@@ -66,8 +64,7 @@
                 supportFragmentManager.findFragmentById(R.id.fragment_container)!!
             }
             assertThat(recreatedFragment.requireView().parent).isNotNull()
-            val recreatedBinding = SampleEditTextLayoutBinding.bind(
-                recreatedFragment.requireView())
+            val recreatedBinding = SampleEditTextLayoutBinding.bind(recreatedFragment.requireView())
             assertThat(recreatedBinding.editText.text.toString()).isEqualTo("Updated")
         }
     }
@@ -78,31 +75,32 @@
             val parentFragment = withActivity {
                 supportFragmentManager.findFragmentById(PARENT_FRAGMENT_CONTAINER_ID)!!
             }
-            val fragment = parentFragment.childFragmentManager
-                .findFragmentById(R.id.fragment_container)
+            val fragment =
+                parentFragment.childFragmentManager.findFragmentById(R.id.fragment_container)
             assertWithMessage("Fragment should be added as a child fragment")
-                .that(fragment).isNotNull()
+                .that(fragment)
+                .isNotNull()
             assertThat(fragment!!.requireView().parent).isNotNull()
             val binding = SampleEditTextLayoutBinding.bind(fragment.requireView())
             assertThat(binding.editText.text.toString()).isEqualTo("Default")
 
             // Update the state to make sure it gets saved and restored properly
-            withActivity {
-                binding.editText.setText("Updated")
-            }
+            withActivity { binding.editText.setText("Updated") }
 
             recreate()
 
             val recreatedParentFragment = withActivity {
                 supportFragmentManager.findFragmentById(PARENT_FRAGMENT_CONTAINER_ID)!!
             }
-            val recreatedFragment = recreatedParentFragment.childFragmentManager
-                .findFragmentById(R.id.fragment_container)
+            val recreatedFragment =
+                recreatedParentFragment.childFragmentManager.findFragmentById(
+                    R.id.fragment_container
+                )
             assertWithMessage("Fragment should be added as a child fragment")
-                .that(recreatedFragment).isNotNull()
+                .that(recreatedFragment)
+                .isNotNull()
             assertThat(recreatedFragment!!.requireView().parent).isNotNull()
-            val recreatedBinding = SampleEditTextLayoutBinding.bind(
-                recreatedFragment.requireView())
+            val recreatedBinding = SampleEditTextLayoutBinding.bind(recreatedFragment.requireView())
             assertThat(recreatedBinding.editText.text.toString()).isEqualTo("Updated")
         }
     }
@@ -111,20 +109,14 @@
 class InflatedFragmentActivity : FragmentActivity() {
     override fun onCreate(savedInstanceState: Bundle?) {
         super.onCreate(savedInstanceState)
-        setContent {
-            AndroidViewBinding(TestFragmentLayoutBinding::inflate)
-        }
+        setContent { AndroidViewBinding(TestFragmentLayoutBinding::inflate) }
     }
 }
 
 class ChildInflatedFragmentActivity : FragmentActivity() {
     override fun onCreate(savedInstanceState: Bundle?) {
         super.onCreate(savedInstanceState)
-        setContentView(
-            FragmentContainerView(this).apply {
-                id = PARENT_FRAGMENT_CONTAINER_ID
-            }
-        )
+        setContentView(FragmentContainerView(this).apply { id = PARENT_FRAGMENT_CONTAINER_ID })
         if (savedInstanceState == null) {
             supportFragmentManager.commit {
                 setReorderingAllowed(true)
@@ -138,10 +130,9 @@
             inflater: LayoutInflater,
             container: ViewGroup?,
             savedInstanceState: Bundle?
-        ) = ComposeView(requireContext()).apply {
-            setContent {
-                AndroidViewBinding(TestFragmentLayoutBinding::inflate)
+        ) =
+            ComposeView(requireContext()).apply {
+                setContent { AndroidViewBinding(TestFragmentLayoutBinding::inflate) }
             }
-        }
     }
 }
diff --git a/compose/ui/ui-viewbinding/samples/src/androidTest/java/androidx/compose/ui/samples/FragmentRemoveTest.kt b/compose/ui/ui-viewbinding/samples/src/androidTest/java/androidx/compose/ui/samples/FragmentRemoveTest.kt
index ec98ec8..9e9a22e 100644
--- a/compose/ui/ui-viewbinding/samples/src/androidTest/java/androidx/compose/ui/samples/FragmentRemoveTest.kt
+++ b/compose/ui/ui-viewbinding/samples/src/androidTest/java/androidx/compose/ui/samples/FragmentRemoveTest.kt
@@ -48,8 +48,7 @@
 @RunWith(AndroidJUnit4::class)
 class FragmentRemoveTest {
 
-    @get:Rule
-    val rule = createAndroidComposeRule<EmptyFragmentActivity>()
+    @get:Rule val rule = createAndroidComposeRule<EmptyFragmentActivity>()
 
     @Test
     fun testRemoval() {
@@ -61,8 +60,8 @@
             }
         }
 
-        var fragment = rule.activity.supportFragmentManager
-            .findFragmentById(R.id.fragment_container)
+        var fragment =
+            rule.activity.supportFragmentManager.findFragmentById(R.id.fragment_container)
         assertWithMessage("Fragment should be present when AndroidViewBinding is in the hierarchy")
             .that(fragment)
             .isNotNull()
@@ -71,8 +70,7 @@
 
         rule.waitForIdle()
 
-        fragment = rule.activity.supportFragmentManager
-            .findFragmentById(R.id.fragment_container)
+        fragment = rule.activity.supportFragmentManager.findFragmentById(R.id.fragment_container)
         assertWithMessage("Fragment should be removed when the AndroidViewBinding is removed")
             .that(fragment)
             .isNull()
@@ -88,8 +86,8 @@
             }
         }
 
-        var fragment = rule.activity.supportFragmentManager
-            .findFragmentById(R.id.fragment_container)
+        var fragment =
+            rule.activity.supportFragmentManager.findFragmentById(R.id.fragment_container)
         assertWithMessage("Fragment should be present when AndroidViewBinding is in the hierarchy")
             .that(fragment)
             .isNotNull()
@@ -99,16 +97,13 @@
 
         // Update the state to allow verifying the state is destroyed when the
         // AndroidViewBinding is removed from composition
-        rule.runOnUiThread {
-            binding.editText.setText("Updated")
-        }
+        rule.runOnUiThread { binding.editText.setText("Updated") }
 
         show = false
 
         rule.waitForIdle()
 
-        fragment = rule.activity.supportFragmentManager
-            .findFragmentById(R.id.fragment_container)
+        fragment = rule.activity.supportFragmentManager.findFragmentById(R.id.fragment_container)
         assertWithMessage("Fragment should be removed when the AndroidViewBinding is removed")
             .that(fragment)
             .isNull()
@@ -117,8 +112,7 @@
 
         rule.waitForIdle()
 
-        fragment = rule.activity.supportFragmentManager
-            .findFragmentById(R.id.fragment_container)
+        fragment = rule.activity.supportFragmentManager.findFragmentById(R.id.fragment_container)
         assertWithMessage("Fragment should be present when AndroidViewBinding is in the hierarchy")
             .that(fragment)
             .isNotNull()
@@ -136,14 +130,12 @@
             if (showStateA) {
                 AndroidViewBinding(TestFragmentLayoutBinding::inflate)
             } else {
-                SideEffect {
-                    showStateA = true
-                }
+                SideEffect { showStateA = true }
             }
         }
 
-        var fragment = rule.activity.supportFragmentManager
-            .findFragmentById(R.id.fragment_container)
+        var fragment =
+            rule.activity.supportFragmentManager.findFragmentById(R.id.fragment_container)
         assertWithMessage("Fragment should be present when AndroidViewBinding is in the hierarchy")
             .that(fragment)
             .isNotNull()
@@ -153,16 +145,13 @@
 
         // Update the state to allow verifying the state is destroyed when the
         // AndroidViewBinding is removed from composition
-        rule.runOnUiThread {
-            binding.editText.setText("Updated")
-        }
+        rule.runOnUiThread { binding.editText.setText("Updated") }
 
         showStateA = false
 
         rule.waitForIdle()
 
-        fragment = rule.activity.supportFragmentManager
-            .findFragmentById(R.id.fragment_container)
+        fragment = rule.activity.supportFragmentManager.findFragmentById(R.id.fragment_container)
         assertWithMessage("Fragment should be present when AndroidViewBinding is in the hierarchy")
             .that(fragment)
             .isNotNull()
@@ -194,8 +183,7 @@
                 val fragment = supportFragmentManager.findFragmentById(R.id.fragment_container)
                 assertThat(fragment).isNotNull()
                 assertThat(fragment!!.lifecycle.currentState).isEqualTo(Lifecycle.State.RESUMED)
-                val recreatedBinding = SampleEditTextLayoutBinding.bind(
-                    fragment.requireView())
+                val recreatedBinding = SampleEditTextLayoutBinding.bind(fragment.requireView())
                 assertThat(recreatedBinding.editText.text.toString()).isEqualTo("Default")
             }
         }
@@ -216,8 +204,8 @@
             )
         }
 
-        composeView = window.decorView
-            .findViewById<ViewGroup>(android.R.id.content)
-            .getChildAt(0) as? ComposeView
+        composeView =
+            window.decorView.findViewById<ViewGroup>(android.R.id.content).getChildAt(0)
+                as? ComposeView
     }
 }
diff --git a/compose/ui/ui-viewbinding/samples/src/androidTest/java/androidx/compose/ui/samples/ReusableAndroidViewBindingTest.kt b/compose/ui/ui-viewbinding/samples/src/androidTest/java/androidx/compose/ui/samples/ReusableAndroidViewBindingTest.kt
index cbf7ecd..3bb3617 100644
--- a/compose/ui/ui-viewbinding/samples/src/androidTest/java/androidx/compose/ui/samples/ReusableAndroidViewBindingTest.kt
+++ b/compose/ui/ui-viewbinding/samples/src/androidTest/java/androidx/compose/ui/samples/ReusableAndroidViewBindingTest.kt
@@ -53,8 +53,7 @@
 @RunWith(AndroidJUnit4::class)
 class ReusableAndroidViewBindingTest {
 
-    @get:Rule
-    val rule = createAndroidComposeRule<EmptyFragmentActivity>()
+    @get:Rule val rule = createAndroidComposeRule<EmptyFragmentActivity>()
 
     @Test
     fun testViewIsReused_whenMovedAndUpdated() {
@@ -83,9 +82,7 @@
             Column {
                 repeat(10) { slot ->
                     if (slot == slotWithContent) {
-                        ReusableContent(Unit) {
-                            movableContext()
-                        }
+                        ReusableContent(Unit) { movableContext() }
                     } else {
                         BasicText("Slot $slot")
                     }
@@ -162,8 +159,7 @@
         events.clear()
         includeContent = false
 
-        onView(withClassName(`is`(ButtonFqClassName)))
-            .check(doesNotExist())
+        onView(withClassName(`is`(ButtonFqClassName))).check(doesNotExist())
 
         assertEquals(
             "Binding should be released when its containing group is removed from composition",
@@ -188,8 +184,7 @@
         events.clear()
         enableContent = false
 
-        onView(withClassName(`is`(ButtonFqClassName)))
-            .check(doesNotExist())
+        onView(withClassName(`is`(ButtonFqClassName))).check(doesNotExist())
 
         assertEquals(
             "Binding should be reset when its parent ReusableContentHost is deactivated",
@@ -232,9 +227,7 @@
             Column {
                 repeat(10) { slot ->
                     if (slot == slotWithContent) {
-                        ReusableContent(Unit) {
-                            movableContext()
-                        }
+                        ReusableContent(Unit) { movableContext() }
                     } else {
                         BasicText("Slot $slot")
                     }
diff --git a/compose/ui/ui-viewbinding/samples/src/main/java/androidx/compose/ui/samples/AndroidViewBindingSample.kt b/compose/ui/ui-viewbinding/samples/src/main/java/androidx/compose/ui/samples/AndroidViewBindingSample.kt
index 694e5e6..cf33245 100644
--- a/compose/ui/ui-viewbinding/samples/src/main/java/androidx/compose/ui/samples/AndroidViewBindingSample.kt
+++ b/compose/ui/ui-viewbinding/samples/src/main/java/androidx/compose/ui/samples/AndroidViewBindingSample.kt
@@ -29,20 +29,14 @@
 fun AndroidViewBindingSample() {
     // Inflates and composes sample_layout.xml and changes the color of the `second` View.
     // The `second` View is part of sample_layout.xml.
-    AndroidViewBinding(SampleLayoutBinding::inflate) {
-        second.setBackgroundColor(Color.GRAY)
-    }
+    AndroidViewBinding(SampleLayoutBinding::inflate) { second.setBackgroundColor(Color.GRAY) }
 }
 
 @Sampled
 @Composable
 fun AndroidViewBindingReusableSample() {
     @Composable
-    fun MyButton(
-        label: String,
-        action: () -> Unit,
-        modifier: Modifier = Modifier
-    ) {
+    fun MyButton(label: String, action: () -> Unit, modifier: Modifier = Modifier) {
         AndroidViewBinding(
             SampleButtonLayoutBinding::inflate,
             modifier = modifier,
diff --git a/compose/ui/ui-viewbinding/src/main/java/androidx/compose/ui/viewinterop/AndroidViewBinding.kt b/compose/ui/ui-viewbinding/src/main/java/androidx/compose/ui/viewinterop/AndroidViewBinding.kt
index 5f2a288..23bbba4 100644
--- a/compose/ui/ui-viewbinding/src/main/java/androidx/compose/ui/viewinterop/AndroidViewBinding.kt
+++ b/compose/ui/ui-viewbinding/src/main/java/androidx/compose/ui/viewinterop/AndroidViewBinding.kt
@@ -37,20 +37,19 @@
 
 /**
  * Composes an Android layout resource in the presence of [ViewBinding]. The binding is obtained
- * from the [factory] block, which will be called exactly once to obtain the [ViewBinding]
- * to be composed, and it is also guaranteed to be invoked on the UI thread.
- * Therefore, in addition to creating the [ViewBinding], the block can also be used
- * to perform one-off initializations and [View] constant properties' setting.
- * The [update] block can be run multiple times (on the UI thread as well) due to recomposition,
- * and it is the right place to set [View] properties depending on state. When state changes,
- * the block will be reexecuted to set the new properties. Note the block will also be ran once
- * right after the [factory] block completes.
+ * from the [factory] block, which will be called exactly once to obtain the [ViewBinding] to be
+ * composed, and it is also guaranteed to be invoked on the UI thread. Therefore, in addition to
+ * creating the [ViewBinding], the block can also be used to perform one-off initializations and
+ * [View] constant properties' setting. The [update] block can be run multiple times (on the UI
+ * thread as well) due to recomposition, and it is the right place to set [View] properties
+ * depending on state. When state changes, the block will be reexecuted to set the new properties.
+ * Note the block will also be ran once right after the [factory] block completes.
  *
  * This overload of [AndroidViewBinding] does not automatically pool or reuse Views and their
  * bindings. If placed inside of a reusable container (including inside a
  * [LazyRow][androidx.compose.foundation.lazy.LazyRow] or
- * [LazyColumn][androidx.compose.foundation.lazy.LazyColumn]), the View instances and their
- * bindings will always be discarded and recreated if the composition hierarchy containing the
+ * [LazyColumn][androidx.compose.foundation.lazy.LazyColumn]), the View instances and their bindings
+ * will always be discarded and recreated if the composition hierarchy containing the
  * `AndroidViewBinding` changes, even if its group structure did not change and the `View` and its
  * binding could have conceivably been reused.
  *
@@ -70,32 +69,26 @@
  * @param factory The block creating the [ViewBinding] to be composed.
  * @param modifier The modifier to be applied to the layout.
  * @param update The callback to be invoked after the layout is inflated and upon recomposition to
- * update the information and state of the binding
+ *   update the information and state of the binding
  */
 @Composable
 fun <T : ViewBinding> AndroidViewBinding(
     factory: (inflater: LayoutInflater, parent: ViewGroup, attachToParent: Boolean) -> T,
     modifier: Modifier = Modifier,
-    update: T.() -> Unit = { }
+    update: T.() -> Unit = {}
 ) {
-    AndroidViewBinding(
-        factory = factory,
-        modifier = modifier,
-        onReset = null,
-        update = update
-    )
+    AndroidViewBinding(factory = factory, modifier = modifier, onReset = null, update = update)
 }
 
 /**
  * Composes an Android layout resource in the presence of [ViewBinding]. The binding is obtained
- * from the [factory] block, which will be called exactly once to obtain the [ViewBinding]
- * to be composed, and it is also guaranteed to be invoked on the UI thread.
- * Therefore, in addition to creating the [ViewBinding], the block can also be used
- * to perform one-off initializations and [View] constant properties' setting.
- * The [update] block can be run multiple times (on the UI thread as well) due to recomposition,
- * and it is the right place to set [View] properties depending on state. When state changes,
- * the block will be reexecuted to set the new properties. Note the block will also be ran once
- * right after the [factory] block completes.
+ * from the [factory] block, which will be called exactly once to obtain the [ViewBinding] to be
+ * composed, and it is also guaranteed to be invoked on the UI thread. Therefore, in addition to
+ * creating the [ViewBinding], the block can also be used to perform one-off initializations and
+ * [View] constant properties' setting. The [update] block can be run multiple times (on the UI
+ * thread as well) due to recomposition, and it is the right place to set [View] properties
+ * depending on state. When state changes, the block will be reexecuted to set the new properties.
+ * Note the block will also be ran once right after the [factory] block completes.
  *
  * This overload includes support for View reuse, which behaves in the same way as it does for
  * [AndroidView]. Namely, Views and their binding instances are only eligible for reuse if a
@@ -104,13 +97,13 @@
  * [AndroidViewBinding] is used in a scrolling list. It is highly recommended to specify an
  * [onReset] implementation and opt-in to View reuse when possible.
  *
- * When [onReset] is specified, [View] instances and their bindings may be reused when hosted
- * inside of a container that supports reusable elements. Reuse occurs when compatible instances
- * of [AndroidViewBinding] are inserted and removed during recomposition. Two instances of
- * `AndroidViewBinding` are considered compatible if they are invoked with the same composable
- * group structure. The most common scenario where this happens is in lazy layout APIs like
- * `LazyRow` and `LazyColumn`, which can reuse layout nodes (and, in this case, Views and their
- * bindings as well) between items when scrolling.
+ * When [onReset] is specified, [View] instances and their bindings may be reused when hosted inside
+ * of a container that supports reusable elements. Reuse occurs when compatible instances of
+ * [AndroidViewBinding] are inserted and removed during recomposition. Two instances of
+ * `AndroidViewBinding` are considered compatible if they are invoked with the same composable group
+ * structure. The most common scenario where this happens is in lazy layout APIs like `LazyRow` and
+ * `LazyColumn`, which can reuse layout nodes (and, in this case, Views and their bindings as well)
+ * between items when scrolling.
  *
  * [onReset] is invoked on the UI thread when the View and its binding will be reused, signaling
  * that the View and binding should be prepared to appear in a new context in the composition
@@ -123,50 +116,52 @@
  * currently active or inside of a [movable content][androidx.compose.runtime.movableContentOf]
  * block that is being moved. If this happens, the View will be removed from its parent, but
  * retained by Compose so that it may be reused if its content host becomes active again. If the
- * View never becomes active again and is instead discarded entirely, the [onReset] callback will
- * be invoked directly from this deactivated state when Compose releases the View and its binding.
+ * View never becomes active again and is instead discarded entirely, the [onReset] callback will be
+ * invoked directly from this deactivated state when Compose releases the View and its binding.
  *
  * When the View is removed from the composition permanently, [onRelease] will be invoked (also on
- * the UI thread). Once this callback returns, Compose will never attempt to reuse the previous
- * View or binding instance regardless of whether an [onReset] implementation was provided. If the
- * View is needed again in the future, a new instance will be created, with a fresh lifecycle that
- * begins by calling the [factory].
+ * the UI thread). Once this callback returns, Compose will never attempt to reuse the previous View
+ * or binding instance regardless of whether an [onReset] implementation was provided. If the View
+ * is needed again in the future, a new instance will be created, with a fresh lifecycle that begins
+ * by calling the [factory].
  *
  * @sample androidx.compose.ui.samples.AndroidViewBindingReusableSample
  *
  * @param factory The block creating the [ViewBinding] to be composed.
  * @param modifier The modifier to be applied to the layout.
  * @param onReset A callback invoked as a signal that the view is about to be attached to the
- * composition hierarchy in a different context than its original creation. This callback is invoked
- * before [update] and should prepare the view for general reuse. If `null` or not specified, the
- * `AndroidViewBinding` instance will not support reuse, and the View and its binding will always be
- * discarded whenever the AndroidViewBinding is moved or removed from the composition hierarchy.
+ *   composition hierarchy in a different context than its original creation. This callback is
+ *   invoked before [update] and should prepare the view for general reuse. If `null` or not
+ *   specified, the `AndroidViewBinding` instance will not support reuse, and the View and its
+ *   binding will always be discarded whenever the AndroidViewBinding is moved or removed from the
+ *   composition hierarchy.
  * @param onRelease A callback invoked as a signal that this view and its binding have exited the
- * composition hierarchy entirely and will not be reused again. Any additional resources used by the
- * binding should be freed at this time.
+ *   composition hierarchy entirely and will not be reused again. Any additional resources used by
+ *   the binding should be freed at this time.
  * @param update The callback to be invoked after the layout is inflated and upon recomposition to
- * update the information and state of the binding.
+ *   update the information and state of the binding.
  */
 @Composable
 fun <T : ViewBinding> AndroidViewBinding(
     factory: (inflater: LayoutInflater, parent: ViewGroup, attachToParent: Boolean) -> T,
     modifier: Modifier = Modifier,
     onReset: (T.() -> Unit)? = null,
-    onRelease: T.() -> Unit = { },
-    update: T.() -> Unit = { }
+    onRelease: T.() -> Unit = {},
+    update: T.() -> Unit = {}
 ) {
     val localView = LocalView.current
     // Find the parent fragment, if one exists. This will let us ensure that
     // fragments inflated via a FragmentContainerView are properly nested
     // (which, in turn, allows the fragments to properly save/restore their state)
-    val parentFragment = remember(localView) {
-        try {
-            localView.findFragment<Fragment>()
-        } catch (e: IllegalStateException) {
-            // findFragment throws if no parent fragment is found
-            null
+    val parentFragment =
+        remember(localView) {
+            try {
+                localView.findFragment<Fragment>()
+            } catch (e: IllegalStateException) {
+                // findFragment throws if no parent fragment is found
+                null
+            }
         }
-    }
 
     val localContext = LocalContext.current
     AndroidView(
@@ -175,9 +170,7 @@
             // using the parent fragment's LayoutInflater
             val inflater = parentFragment?.layoutInflater ?: LayoutInflater.from(context)
             val viewBinding = factory(inflater, FrameLayout(context), false)
-            viewBinding.root.apply {
-                setBinding(viewBinding)
-            }
+            viewBinding.root.apply { setBinding(viewBinding) }
         },
         modifier = modifier,
         onReset = onReset?.let { reset -> { view -> view.getBinding<T>().reset() } },
@@ -187,17 +180,16 @@
             (view as? ViewGroup)?.let { rootGroup ->
                 // clean up inflated fragments when the AndroidViewBinding is disposed
                 // Find the right FragmentManager
-                val fragmentManager = parentFragment?.childFragmentManager
-                    ?: (localContext as? FragmentActivity)?.supportFragmentManager
+                val fragmentManager =
+                    parentFragment?.childFragmentManager
+                        ?: (localContext as? FragmentActivity)?.supportFragmentManager
                 forEachFragmentContainerView(rootGroup) { container ->
                     // Now find the fragment inflated via the FragmentContainerView
                     val existingFragment = fragmentManager?.findFragmentById(container.id)
                     if (existingFragment != null && !fragmentManager.isStateSaved) {
                         // If the state isn't saved, that means that some state change
                         // has removed this Composable from the hierarchy
-                        fragmentManager.commitNow {
-                            remove(existingFragment)
-                        }
+                        fragmentManager.commitNow { remove(existingFragment) }
                     }
                 }
             }
@@ -206,12 +198,10 @@
     )
 }
 
-private fun <T : ViewBinding> View.setBinding(binding: T) =
-    setTag(R.id.binding_reference, binding)
+private fun <T : ViewBinding> View.setBinding(binding: T) = setTag(R.id.binding_reference, binding)
 
 @Suppress("UNCHECKED_CAST")
-private fun <T : ViewBinding> View.getBinding(): T =
-    getTag(R.id.binding_reference) as T
+private fun <T : ViewBinding> View.getBinding(): T = getTag(R.id.binding_reference) as T
 
 private fun forEachFragmentContainerView(
     viewGroup: ViewGroup,
diff --git a/compose/ui/ui/benchmark/src/androidTest/java/androidx/compose/ui/benchmark/BenchmarkModifierExtensions.kt b/compose/ui/ui/benchmark/src/androidTest/java/androidx/compose/ui/benchmark/BenchmarkModifierExtensions.kt
index 7093ee3..f939b01 100644
--- a/compose/ui/ui/benchmark/src/androidTest/java/androidx/compose/ui/benchmark/BenchmarkModifierExtensions.kt
+++ b/compose/ui/ui/benchmark/src/androidTest/java/androidx/compose/ui/benchmark/BenchmarkModifierExtensions.kt
@@ -35,18 +35,16 @@
 @SuppressLint("ModifierFactoryExtensionFunction")
 fun repeatModifier(count: Int, mod: () -> Modifier): Modifier {
     var modifier: Modifier = Modifier
-    repeat(count) {
-        modifier = modifier.then(mod())
-    }
+    repeat(count) { modifier = modifier.then(mod()) }
     return modifier
 }
 
 /**
  * @param modifierFn A lambda which is passed a toggle parameter and is expected to return a
- *  modifier. The testcase will toggle the boolean passed in to this function, so the lambda
- *  should construct the lambda accordingly, depending on what is wanted to be tested. In practice,
- *  one shouldn't use this directly as it is a bit confusing, and instead use [measureModifier]
- *  which will construct this lambda accordingly.
+ *   modifier. The testcase will toggle the boolean passed in to this function, so the lambda should
+ *   construct the lambda accordingly, depending on what is wanted to be tested. In practice, one
+ *   shouldn't use this directly as it is a bit confusing, and instead use [measureModifier] which
+ *   will construct this lambda accordingly.
  */
 class ModifierTestCase(
     val modifierFn: (Boolean) -> Modifier,
@@ -59,14 +57,8 @@
 
     @Composable
     override fun MeasuredContent() {
-        Box(Modifier
-            .fillMaxSize()
-            .then(modifierFn(state))
-        ) {
-            Box(Modifier
-                .fillMaxSize()
-                .then(modifierFn(!state))
-            )
+        Box(Modifier.fillMaxSize().then(modifierFn(state))) {
+            Box(Modifier.fillMaxSize().then(modifierFn(!state)))
         }
     }
 }
@@ -74,22 +66,22 @@
 /**
  * @param count - the number of modifiers on each node that we want to benchmark.
  * @param reuse - if true, the benchmark will toggle the parameter passed in to [modifierFn] with
- *  the expectation that it will create a similar modifier when it is toggled, but not one that is
- *  exactly equals with the previous one (ie, some params might be different). This will help give
- *  you an idea of what changing the modifier during recomposition might end up looking like.
+ *   the expectation that it will create a similar modifier when it is toggled, but not one that is
+ *   exactly equals with the previous one (ie, some params might be different). This will help give
+ *   you an idea of what changing the modifier during recomposition might end up looking like.
  * @param hoistCreation - if true, the benchmark will not include the cost of running [modifierFn]
- *  itself.
+ *   itself.
  * @param includeComposition - if true, the composition cost will be included in the benchmark
  * @param includeLayout - if true, the cost of the layout phase will be included in the benchmark
  * @param includeDraw - if true, the cost of the draw phase will be included in the benchmark
  * @param modifierFn - A lambda which accepts a boolean and returns a modifier. The expectation is
- *  that this lambda wil call the modifier factory function directly, and pass in whatever
- *  necessary arguments. The boolean argument is meant to act as a toggle between two sets of
- *  consistent arguments. That is, if called twice with the same boolean value, the function should
- *  return modifiers with the same arguments both times, though it is expected that it will be a new
- *  instance. When called twice with different boolean values, it is expected that a similar
- *  modifier (ie, a modifier of the same type) is returned each time, however they would have two
- *  different sets of arguments, meaning that some update would need to take place.
+ *   that this lambda wil call the modifier factory function directly, and pass in whatever
+ *   necessary arguments. The boolean argument is meant to act as a toggle between two sets of
+ *   consistent arguments. That is, if called twice with the same boolean value, the function should
+ *   return modifiers with the same arguments both times, though it is expected that it will be a
+ *   new instance. When called twice with different boolean values, it is expected that a similar
+ *   modifier (ie, a modifier of the same type) is returned each time, however they would have two
+ *   different sets of arguments, meaning that some update would need to take place.
  */
 fun ComposeBenchmarkRule.measureModifier(
     count: Int = 1,
@@ -100,32 +92,29 @@
     includeDraw: Boolean = true,
     modifierFn: (Boolean) -> Modifier,
 ) {
-    val mfn: (Boolean) -> Modifier = when {
-        !hoistCreation && reuse -> {
-            { x: Boolean -> repeatModifier(count) { modifierFn(x) } }
+    val mfn: (Boolean) -> Modifier =
+        when {
+            !hoistCreation && reuse -> {
+                { x: Boolean -> repeatModifier(count) { modifierFn(x) } }
+            }
+            hoistCreation && reuse -> {
+                val left = repeatModifier(count) { modifierFn(true) }
+                val right = repeatModifier(count) { modifierFn(false) };
+                { x: Boolean -> if (x) left else right }
+            }
+            !hoistCreation && !reuse -> {
+                { x: Boolean -> repeatModifier(count) { if (x) modifierFn(x) else Modifier } }
+            }
+            else /* hoistCreation && !reuse */ -> {
+                val mod = repeatModifier(count) { modifierFn(true) };
+                { x: Boolean -> if (x) mod else Modifier }
+            }
         }
-        hoistCreation && reuse -> {
-            val left = repeatModifier(count) { modifierFn(true) }
-            val right = repeatModifier(count) { modifierFn(false) };
-            { x: Boolean -> if (x) left else right }
-        }
-        !hoistCreation && !reuse -> {
-            { x: Boolean -> repeatModifier(count) { if (x) modifierFn(x) else Modifier } }
-        }
-        else /* hoistCreation && !reuse */ -> {
-            val mod = repeatModifier(count) { modifierFn(true) };
-            { x: Boolean -> if (x) mod else Modifier }
-        }
-    }
     runBenchmarkFor({ ModifierTestCase(mfn) }) {
-        runOnUiThread {
-            doFramesUntilNoChangesPending()
-        }
+        runOnUiThread { doFramesUntilNoChangesPending() }
 
         measureRepeatedOnUiThread {
-            runWithTimingDisabled {
-                getTestCase().toggleState()
-            }
+            runWithTimingDisabled { getTestCase().toggleState() }
             timingIf(includeComposition) { recomposeAssertHadChanges() }
             assertNoPendingChanges()
             timingIf(includeLayout) {
diff --git a/compose/ui/ui/benchmark/src/androidTest/java/androidx/compose/ui/benchmark/LayoutNodeModifierBenchmark.kt b/compose/ui/ui/benchmark/src/androidTest/java/androidx/compose/ui/benchmark/LayoutNodeModifierBenchmark.kt
index b95cb7d..9f92539 100644
--- a/compose/ui/ui/benchmark/src/androidTest/java/androidx/compose/ui/benchmark/LayoutNodeModifierBenchmark.kt
+++ b/compose/ui/ui/benchmark/src/androidTest/java/androidx/compose/ui/benchmark/LayoutNodeModifierBenchmark.kt
@@ -47,22 +47,17 @@
 import org.junit.runners.Parameterized
 import org.junit.runners.model.Statement
 
-/**
- * Benchmark that sets the LayoutNode.modifier.
- */
+/** Benchmark that sets the LayoutNode.modifier. */
 @LargeTest
 @RunWith(Parameterized::class)
-class LayoutNodeModifierBenchmark(
-    private val numberOfModifiers: Int
-) {
+class LayoutNodeModifierBenchmark(private val numberOfModifiers: Int) {
     companion object {
         @JvmStatic
         @Parameterized.Parameters(name = "modifiers={0}")
         fun initParameters(): Array<Any> = arrayOf(1, 5, 10)
     }
 
-    @get:Rule
-    val rule = SimpleAndroidBenchmarkRule()
+    @get:Rule val rule = SimpleAndroidBenchmarkRule()
 
     var modifiers = emptyList<Modifier>()
     var combinedModifier: Modifier = Modifier
@@ -70,30 +65,27 @@
 
     @Before
     fun setup() {
-        modifiers = listOf(
-            Modifier.padding(10.dp),
-            Modifier.drawBehind { },
-            Modifier.graphicsLayer(),
-            Modifier.onKeyEvent { true },
-            Modifier.semantics { },
-            Modifier.pointerInput(Unit) {
-                detectTapGestures(onPress = {})
-            },
-            Modifier.layoutId("Hello"),
-            Modifier.padding(10.dp),
-            Modifier.onGloballyPositioned { _ -> },
-            Modifier.zIndex(1f)
-        ).subList(0, numberOfModifiers)
+        modifiers =
+            listOf(
+                    Modifier.padding(10.dp),
+                    Modifier.drawBehind {},
+                    Modifier.graphicsLayer(),
+                    Modifier.onKeyEvent { true },
+                    Modifier.semantics {},
+                    Modifier.pointerInput(Unit) { detectTapGestures(onPress = {}) },
+                    Modifier.layoutId("Hello"),
+                    Modifier.padding(10.dp),
+                    Modifier.onGloballyPositioned { _ -> },
+                    Modifier.zIndex(1f)
+                )
+                .subList(0, numberOfModifiers)
 
-        combinedModifier = modifiers.fold<Modifier, Modifier>(Modifier) { acc, modifier ->
-            acc.then(modifier)
-        }
+        combinedModifier =
+            modifiers.fold<Modifier, Modifier>(Modifier) { acc, modifier -> acc.then(modifier) }
 
         rule.activityTestRule.runOnUiThread {
             rule.activityTestRule.activity.setContent {
-                TestModifierUpdaterLayout {
-                    testModifierUpdater = it
-                }
+                TestModifierUpdaterLayout { testModifierUpdater = it }
             }
         }
     }
@@ -123,28 +115,21 @@
 
     @Test
     fun setDrawModifiersToSameValue() {
-        modifiers = mutableListOf<Modifier>().apply {
-            repeat(numberOfModifiers) {
-                this += Modifier.drawBehind { }
+        modifiers =
+            mutableListOf<Modifier>().apply {
+                repeat(numberOfModifiers) { this += Modifier.drawBehind {} }
             }
-        }
-        combinedModifier = modifiers.fold<Modifier, Modifier>(Modifier) { acc, modifier ->
-            acc.then(modifier)
-        }
+        combinedModifier =
+            modifiers.fold<Modifier, Modifier>(Modifier) { acc, modifier -> acc.then(modifier) }
 
-        val altModifier = mutableListOf<Modifier>().apply {
-            repeat(numberOfModifiers) {
-                this += Modifier.drawBehind { }
-            }
-        }.fold<Modifier, Modifier>(Modifier) { acc, modifier ->
-            acc.then(modifier)
-        }
+        val altModifier =
+            mutableListOf<Modifier>()
+                .apply { repeat(numberOfModifiers) { this += Modifier.drawBehind {} } }
+                .fold<Modifier, Modifier>(Modifier) { acc, modifier -> acc.then(modifier) }
 
         rule.activityTestRule.runOnUiThread {
             rule.activityTestRule.activity.setContent {
-                TestModifierUpdaterLayout {
-                    testModifierUpdater = it
-                }
+                TestModifierUpdaterLayout { testModifierUpdater = it }
             }
         }
 
@@ -158,8 +143,7 @@
 
     class SimpleAndroidBenchmarkRule() : TestRule {
         @Suppress("DEPRECATION")
-        val activityTestRule =
-            androidx.test.rule.ActivityTestRule(ComponentActivity::class.java)
+        val activityTestRule = androidx.test.rule.ActivityTestRule(ComponentActivity::class.java)
 
         val benchmarkRule = BenchmarkRule()
 
diff --git a/compose/ui/ui/benchmark/src/androidTest/java/androidx/compose/ui/benchmark/LifecycleAwareWindowRecomposerBenchmark.kt b/compose/ui/ui/benchmark/src/androidTest/java/androidx/compose/ui/benchmark/LifecycleAwareWindowRecomposerBenchmark.kt
index f1d69a0..e34175a 100644
--- a/compose/ui/ui/benchmark/src/androidTest/java/androidx/compose/ui/benchmark/LifecycleAwareWindowRecomposerBenchmark.kt
+++ b/compose/ui/ui/benchmark/src/androidTest/java/androidx/compose/ui/benchmark/LifecycleAwareWindowRecomposerBenchmark.kt
@@ -41,8 +41,7 @@
 @RunWith(AndroidJUnit4::class)
 class LifecycleAwareWindowRecomposerBenchmark {
 
-    @get:Rule
-    val rule = CombinedActivityBenchmarkRule()
+    @get:Rule val rule = CombinedActivityBenchmarkRule()
 
     @Test
     @UiThreadTest
@@ -65,8 +64,7 @@
 
     class CombinedActivityBenchmarkRule() : TestRule {
         @Suppress("DEPRECATION")
-        val activityTestRule =
-            androidx.test.rule.ActivityTestRule(ComponentActivity::class.java)
+        val activityTestRule = androidx.test.rule.ActivityTestRule(ComponentActivity::class.java)
 
         val benchmarkRule = BenchmarkRule()
 
diff --git a/compose/ui/ui/benchmark/src/androidTest/java/androidx/compose/ui/benchmark/ModifiersBenchmark.kt b/compose/ui/ui/benchmark/src/androidTest/java/androidx/compose/ui/benchmark/ModifiersBenchmark.kt
index 078d509..30dd32e 100644
--- a/compose/ui/ui/benchmark/src/androidTest/java/androidx/compose/ui/benchmark/ModifiersBenchmark.kt
+++ b/compose/ui/ui/benchmark/src/androidTest/java/androidx/compose/ui/benchmark/ModifiersBenchmark.kt
@@ -68,22 +68,16 @@
 
 @LargeTest
 @RunWith(Parameterized::class)
-class ModifiersBenchmark(
-    val name: String,
-    val count: Int,
-    val modifierFn: (Boolean) -> Modifier
-) {
+class ModifiersBenchmark(val name: String, val count: Int, val modifierFn: (Boolean) -> Modifier) {
     companion object {
         /**
          * INSTRUCTIONS FOR ADDING A MODIFIER TO THIS LIST
          * ===============================================
          *
-         * To add a modifier, add a `*modifier(...)` line which includes:
-         *      (1) the name of the modifier
-         *      (2) a lambda which accepts a boolean value and returns the modifier. You should use
-         *          the passed in boolean value to toggle between two different sets of parameters
-         *          to the modifier chain. If the modifier takes no parameters, just ignore the
-         *          boolean.
+         * To add a modifier, add a `*modifier(...)` line which includes: (1) the name of the
+         * modifier (2) a lambda which accepts a boolean value and returns the modifier. You should
+         * use the passed in boolean value to toggle between two different sets of parameters to the
+         * modifier chain. If the modifier takes no parameters, just ignore the boolean.
          *
          * Many modifiers require parameters that are objects that need to be allocated. If this is
          * an object which the developer is expected to remember or hold on to somewhere in their
@@ -94,81 +88,78 @@
         @OptIn(ExperimentalFoundationApi::class)
         @JvmStatic
         @Parameterized.Parameters(name = "{0}_{1}x")
-        fun data(): Collection<Array<Any>> = listOf(
-            *modifier("Modifier") { Modifier },
-            *modifier("emptyElement", true) { Modifier.emptyElement() },
-            // (discouraged) composed overload that defaults to LocalIndication. Since we don't
-            // provide MaterialTheme in this benchmark, it will just be the debug indication
-            *modifier("clickable", true) { Modifier.clickable { capture(it) } },
-            // overload with explicit InteractionSource parameter and a ripple - this more
-            // accurately models how clickable is used in common components like Button.
-            *modifier("clickableWithRipple", true) { Modifier.clickable(
-                // null interactionSource for lazy indication creation
-                interactionSource = null,
-                indication = ripple(),
-            ) { capture(it) } },
-            *modifier("semantics", true) { Modifier.semantics { capture(it) } },
-            *modifier("pointerInput") { Modifier.pointerInput(it) { capture(it) } },
-            *modifier("focusable") { Modifier.focusable() },
-            *modifier("drawWithCache") {
-                Modifier.drawWithCache {
-                    val rectSize = if (it) size / 2f else size
-                    onDrawBehind {
-                        drawRect(Color.Black, size = rectSize)
+        fun data(): Collection<Array<Any>> =
+            listOf(
+                *modifier("Modifier") { Modifier },
+                *modifier("emptyElement", true) { Modifier.emptyElement() },
+                // (discouraged) composed overload that defaults to LocalIndication. Since we don't
+                // provide MaterialTheme in this benchmark, it will just be the debug indication
+                *modifier("clickable", true) { Modifier.clickable { capture(it) } },
+                // overload with explicit InteractionSource parameter and a ripple - this more
+                // accurately models how clickable is used in common components like Button.
+                *modifier("clickableWithRipple", true) {
+                    Modifier.clickable(
+                        // null interactionSource for lazy indication creation
+                        interactionSource = null,
+                        indication = ripple(),
+                    ) {
+                        capture(it)
                     }
+                },
+                *modifier("semantics", true) { Modifier.semantics { capture(it) } },
+                *modifier("pointerInput") { Modifier.pointerInput(it) { capture(it) } },
+                *modifier("focusable") { Modifier.focusable() },
+                *modifier("drawWithCache") {
+                    Modifier.drawWithCache {
+                        val rectSize = if (it) size / 2f else size
+                        onDrawBehind { drawRect(Color.Black, size = rectSize) }
+                    }
+                },
+                *modifier("testTag") { Modifier.testTag("$it") },
+                *modifier("selectableGroup") { Modifier.selectableGroup() },
+                *modifier("indication") {
+                    Modifier.indication(
+                        interactionSource,
+                        if (it) {
+                            ColorIndicationNodeFactory(Color.Blue)
+                        } else {
+                            ColorIndicationNodeFactory(Color.Red)
+                        }
+                    )
+                },
+                *modifier("draggable") {
+                    Modifier.draggable(
+                        draggableState,
+                        if (it) Orientation.Vertical else Orientation.Horizontal
+                    )
+                },
+                *modifier("draggable2D") { Modifier.draggable2D(draggable2DState) },
+                *modifier("hoverable") { Modifier.hoverable(interactionSource) },
+                *modifier("scrollable") {
+                    Modifier.scrollable(
+                        scrollableState,
+                        if (it) Orientation.Vertical else Orientation.Horizontal
+                    )
+                },
+                *modifier("toggleable") { Modifier.toggleable(it) { capture(it) } },
+                *modifier("onFocusEvent") { Modifier.onFocusEvent { capture(it) } },
+                *modifier("selectable") { Modifier.selectable(it) { capture(it) } },
+                *modifier("focusTarget", true) { Modifier.focusTarget() },
+                *modifier("focusRequester") { Modifier.focusRequester(focusRequester) },
+                *modifier("border") {
+                    Modifier.border(
+                        if (it) 4.dp else 2.dp,
+                        if (it) Color.Black else Color.Blue,
+                        CircleShape
+                    )
+                },
+                *modifier("graphicsLayer") {
+                    Modifier.graphicsLayer(
+                        translationX = if (it) 1f else 2f,
+                        shape = if (it) RectangleShape else CircleShape
+                    )
                 }
-            },
-            *modifier("testTag") { Modifier.testTag("$it") },
-            *modifier("selectableGroup") { Modifier.selectableGroup() },
-            *modifier("indication") {
-                Modifier.indication(
-                    interactionSource,
-                    if (it) {
-                        ColorIndicationNodeFactory(Color.Blue)
-                    } else {
-                        ColorIndicationNodeFactory(Color.Red)
-                    }
-                )
-            },
-            *modifier("draggable") {
-                Modifier.draggable(
-                    draggableState,
-                    if (it) Orientation.Vertical else Orientation.Horizontal
-                )
-            },
-            *modifier("draggable2D") {
-                Modifier.draggable2D(
-                    draggable2DState
-                )
-            },
-            *modifier("hoverable") {
-                Modifier.hoverable(interactionSource)
-            },
-            *modifier("scrollable") {
-                Modifier.scrollable(
-                    scrollableState,
-                    if (it) Orientation.Vertical else Orientation.Horizontal
-                )
-            },
-            *modifier("toggleable") { Modifier.toggleable(it) { capture(it) } },
-            *modifier("onFocusEvent") { Modifier.onFocusEvent { capture(it) } },
-            *modifier("selectable") { Modifier.selectable(it) { capture(it) } },
-            *modifier("focusTarget", true) { Modifier.focusTarget() },
-            *modifier("focusRequester") { Modifier.focusRequester(focusRequester) },
-            *modifier("border") {
-                Modifier.border(
-                    if (it) 4.dp else 2.dp,
-                    if (it) Color.Black else Color.Blue,
-                    CircleShape
-                )
-            },
-            *modifier("graphicsLayer") {
-                Modifier.graphicsLayer(
-                    translationX = if (it) 1f else 2f,
-                    shape = if (it) RectangleShape else CircleShape
-                )
-            }
-        )
+            )
 
         private val focusRequester = FocusRequester()
         private val interactionSource = MutableInteractionSource()
@@ -188,6 +179,7 @@
                     }
                 }
             }
+
             override fun equals(other: Any?): Boolean {
                 if (this === other) return true
                 if (other !is ColorIndicationNodeFactory) return false
@@ -200,23 +192,25 @@
             }
         }
 
-        private val draggableState = object : DraggableState {
-            override suspend fun drag(
-                dragPriority: MutatePriority,
-                block: suspend DragScope.() -> Unit
-            ) {}
+        private val draggableState =
+            object : DraggableState {
+                override suspend fun drag(
+                    dragPriority: MutatePriority,
+                    block: suspend DragScope.() -> Unit
+                ) {}
 
-            override fun dispatchRawDelta(delta: Float) {}
-        }
+                override fun dispatchRawDelta(delta: Float) {}
+            }
         @OptIn(ExperimentalFoundationApi::class)
-        private val draggable2DState = object : Draggable2DState {
-            override suspend fun drag(
-                dragPriority: MutatePriority,
-                block: suspend Drag2DScope.() -> Unit
-            ) {}
+        private val draggable2DState =
+            object : Draggable2DState {
+                override suspend fun drag(
+                    dragPriority: MutatePriority,
+                    block: suspend Drag2DScope.() -> Unit
+                ) {}
 
-            override fun dispatchRawDelta(delta: Offset) {}
-        }
+                override fun dispatchRawDelta(delta: Offset) {}
+            }
         private val scrollableState = ScrollableState { it }
 
         fun modifier(
@@ -236,127 +230,137 @@
         }
     }
 
-    @get:Rule
-    val rule = ComposeBenchmarkRule()
+    @get:Rule val rule = ComposeBenchmarkRule()
 
     /**
      * DEFINITIONS
      * ===========
      *
-     * "base"       - means that we are only including cost of composition and cost of setting the
-     *                modifier on the layoutnode itself, but excluding Layout/Draw.
+     * "base" - means that we are only including cost of composition and cost of setting the
+     * modifier on the layoutnode itself, but excluding Layout/Draw.
      *
-     * "full"       - means that we includ all costs from "base", but also including Layout/Draw.
+     * "full" - means that we includ all costs from "base", but also including Layout/Draw.
      *
-     * "hoisted"    - means that the modifier chain's creation is not included in the benchmark.
-     *                The hoisted measurement is representative of a developer "hoisting" the
-     *                allocation of the benchmark up into a higher scope than the composable it is
-     *                used in so that recomposition doesn't create a new one. The non-hoisted
-     *                variants are more representative of developers making modifier chains inline
-     *                in the composable body (most common).
+     * "hoisted" - means that the modifier chain's creation is not included in the benchmark. The
+     * hoisted measurement is representative of a developer "hoisting" the allocation of the
+     * benchmark up into a higher scope than the composable it is used in so that recomposition
+     * doesn't create a new one. The non-hoisted variants are more representative of developers
+     * making modifier chains inline in the composable body (most common).
      *
-     * "reuse"      - means that we change up the parameters of the modifier factory, so we are
-     *                effectively measuring how well we are able to "reuse" the state from the
-     *                "same" modifier, but with different parameters
+     * "reuse" - means that we change up the parameters of the modifier factory, so we are
+     * effectively measuring how well we are able to "reuse" the state from the "same" modifier, but
+     * with different parameters
      */
 
     // base cost, including calling the modifier factory
     @Test
-    fun base() = rule.measureModifier(
-        count = count,
-        reuse = false,
-        hoistCreation = false,
-        includeComposition = true,
-        includeLayout = false,
-        includeDraw = false,
-        modifierFn = modifierFn,
-    )
+    fun base() =
+        rule.measureModifier(
+            count = count,
+            reuse = false,
+            hoistCreation = false,
+            includeComposition = true,
+            includeLayout = false,
+            includeDraw = false,
+            modifierFn = modifierFn,
+        )
 
     // base cost. without calling the modifier factory
     @Test
-    fun baseHoisted() = rule.measureModifier(
-        count = count,
-        reuse = false,
-        hoistCreation = true,
-        includeComposition = true,
-        includeLayout = false,
-        includeDraw = false,
-        modifierFn = modifierFn,
-    )
+    fun baseHoisted() =
+        rule.measureModifier(
+            count = count,
+            reuse = false,
+            hoistCreation = true,
+            includeComposition = true,
+            includeLayout = false,
+            includeDraw = false,
+            modifierFn = modifierFn,
+        )
 
-    // base cost. with different parameters (potential for reuse). includes calling the modifier factory.
+    // base cost. with different parameters (potential for reuse). includes calling the modifier
+    // factory.
     @Test
-    fun baseReuse() = rule.measureModifier(
-        count = count,
-        reuse = true,
-        hoistCreation = true,
-        includeComposition = true,
-        includeLayout = false,
-        includeDraw = false,
-        modifierFn = modifierFn,
-    )
+    fun baseReuse() =
+        rule.measureModifier(
+            count = count,
+            reuse = true,
+            hoistCreation = true,
+            includeComposition = true,
+            includeLayout = false,
+            includeDraw = false,
+            modifierFn = modifierFn,
+        )
 
-    // base cost. with different parameters (potential for reuse). without calling the modifier factory
+    // base cost. with different parameters (potential for reuse). without calling the modifier
+    // factory
     @Test
-    fun baseReuseHoisted() = rule.measureModifier(
-        count = count,
-        reuse = true,
-        hoistCreation = true,
-        includeComposition = true,
-        includeLayout = false,
-        includeDraw = false,
-        modifierFn = modifierFn,
-    )
+    fun baseReuseHoisted() =
+        rule.measureModifier(
+            count = count,
+            reuse = true,
+            hoistCreation = true,
+            includeComposition = true,
+            includeLayout = false,
+            includeDraw = false,
+            modifierFn = modifierFn,
+        )
 
     // base cost + layout/draw, including calling the modifier factory
     @Test
-    fun full() = rule.measureModifier(
-        count = count,
-        reuse = false,
-        hoistCreation = false,
-        includeComposition = true,
-        includeLayout = true,
-        includeDraw = true,
-        modifierFn = modifierFn,
-    )
+    fun full() =
+        rule.measureModifier(
+            count = count,
+            reuse = false,
+            hoistCreation = false,
+            includeComposition = true,
+            includeLayout = true,
+            includeDraw = true,
+            modifierFn = modifierFn,
+        )
 
     // base cost + layout/draw. without calling the modifier factory
     @Test
-    fun fullHoisted() = rule.measureModifier(
-        count = count,
-        reuse = false,
-        hoistCreation = true,
-        includeComposition = true,
-        includeLayout = true,
-        includeDraw = true,
-        modifierFn = modifierFn,
-    )
+    fun fullHoisted() =
+        rule.measureModifier(
+            count = count,
+            reuse = false,
+            hoistCreation = true,
+            includeComposition = true,
+            includeLayout = true,
+            includeDraw = true,
+            modifierFn = modifierFn,
+        )
 
-    // base cost + layout/draw. with different parameters (potential for reuse). includes calling the modifier factory.
+    // base cost + layout/draw. with different parameters (potential for reuse). includes calling
+    // the modifier factory.
     @Test
-    fun fullReuse() = rule.measureModifier(
-        count = count,
-        reuse = true,
-        hoistCreation = false,
-        includeComposition = true,
-        includeLayout = true,
-        includeDraw = true,
-        modifierFn = modifierFn,
-    )
+    fun fullReuse() =
+        rule.measureModifier(
+            count = count,
+            reuse = true,
+            hoistCreation = false,
+            includeComposition = true,
+            includeLayout = true,
+            includeDraw = true,
+            modifierFn = modifierFn,
+        )
 
-    // base cost + layout/draw. with different parameters (potential for reuse). without calling the modifier factory
+    // base cost + layout/draw. with different parameters (potential for reuse). without calling the
+    // modifier factory
     @Test
-    fun fullReuseHoisted() = rule.measureModifier(
-        count = count,
-        reuse = true,
-        hoistCreation = true,
-        includeComposition = true,
-        includeLayout = true,
-        includeDraw = true,
-        modifierFn = modifierFn,
-    )
+    fun fullReuseHoisted() =
+        rule.measureModifier(
+            count = count,
+            reuse = true,
+            hoistCreation = true,
+            includeComposition = true,
+            includeLayout = true,
+            includeDraw = true,
+            modifierFn = modifierFn,
+        )
 }
 
 fun Modifier.emptyElement(): Modifier = this then object : Modifier.Element {}
-@Suppress("UNUSED_PARAMETER")
-fun capture(value: Any?) {}
+
+@Suppress("UNUSED_PARAMETER") fun capture(value: Any?) {}
diff --git a/compose/ui/ui/benchmark/src/androidTest/java/androidx/compose/ui/benchmark/NestedScrollingBenchmark.kt b/compose/ui/ui/benchmark/src/androidTest/java/androidx/compose/ui/benchmark/NestedScrollingBenchmark.kt
index e4c7320..9c909f6 100644
--- a/compose/ui/ui/benchmark/src/androidTest/java/androidx/compose/ui/benchmark/NestedScrollingBenchmark.kt
+++ b/compose/ui/ui/benchmark/src/androidTest/java/androidx/compose/ui/benchmark/NestedScrollingBenchmark.kt
@@ -41,17 +41,14 @@
 @LargeTest
 @RunWith(AndroidJUnit4::class)
 class NestedScrollingBenchmark {
-    @get:Rule
-    val benchmarkRule = ComposeBenchmarkRule()
+    @get:Rule val benchmarkRule = ComposeBenchmarkRule()
 
     private val nestedScrollingCaseFactory = { NestedScrollingTestCase() }
 
     @Test
     fun nested_scroll_propagation() {
         benchmarkRule.runBenchmarkFor(nestedScrollingCaseFactory) {
-            runOnUiThread {
-                doFramesUntilNoChangesPending()
-            }
+            runOnUiThread { doFramesUntilNoChangesPending() }
 
             benchmarkRule.measureRepeatedOnUiThread {
                 getTestCase().toggleState()
@@ -70,30 +67,32 @@
     private var collectedVelocityOuter = Velocity.Zero
     private var collectedVelocityMiddle = Velocity.Zero
 
-    private val outerConnection = object : NestedScrollConnection {
-        override fun onPreScroll(available: Offset, source: NestedScrollSource): Offset {
-            collectedDeltasOuter += available
-            return super.onPreScroll(available, source)
+    private val outerConnection =
+        object : NestedScrollConnection {
+            override fun onPreScroll(available: Offset, source: NestedScrollSource): Offset {
+                collectedDeltasOuter += available
+                return super.onPreScroll(available, source)
+            }
+
+            override suspend fun onPreFling(available: Velocity): Velocity {
+                collectedVelocityOuter += available
+                return super.onPreFling(available)
+            }
         }
 
-        override suspend fun onPreFling(available: Velocity): Velocity {
-            collectedVelocityOuter += available
-            return super.onPreFling(available)
-        }
-    }
+    private val middleConnection =
+        object : NestedScrollConnection {
+            override fun onPreScroll(available: Offset, source: NestedScrollSource): Offset {
+                collectedDeltasMiddle += available
+                return super.onPreScroll(available, source)
+            }
 
-    private val middleConnection = object : NestedScrollConnection {
-        override fun onPreScroll(available: Offset, source: NestedScrollSource): Offset {
-            collectedDeltasMiddle += available
-            return super.onPreScroll(available, source)
+            override suspend fun onPreFling(available: Velocity): Velocity {
+                collectedVelocityMiddle += available
+                return super.onPreFling(available)
+            }
         }
 
-        override suspend fun onPreFling(available: Velocity): Velocity {
-            collectedVelocityMiddle += available
-            return super.onPreFling(available)
-        }
-    }
-
     private val dispatcher = NestedScrollDispatcher()
     private val noOpConnection = object : NestedScrollConnection {}
     private val delta = Offset(200f, 200f)
@@ -104,19 +103,10 @@
 
     @Composable
     override fun MeasuredContent() {
-        Box(
-            modifier = Modifier
-                .nestedScroll(outerConnection)
-        ) {
-            Box(
-                modifier = Modifier
-                    .nestedScroll(middleConnection)
-            ) {
+        Box(modifier = Modifier.nestedScroll(outerConnection)) {
+            Box(modifier = Modifier.nestedScroll(middleConnection)) {
                 NestedBox(boxLevel = 20) {
-                    Box(
-                        modifier = Modifier
-                            .nestedScroll(noOpConnection, dispatcher)
-                    )
+                    Box(modifier = Modifier.nestedScroll(noOpConnection, dispatcher))
                 }
             }
         }
@@ -125,9 +115,7 @@
     @Composable
     private fun NestedBox(boxLevel: Int, leafContent: @Composable () -> Unit) {
         if (boxLevel == 0) {
-            Box {
-                leafContent()
-            }
+            Box { leafContent() }
             return
         }
 
@@ -138,11 +126,8 @@
 
     override fun toggleState() {
         scrollResult = dispatcher.dispatchPreScroll(delta, NestedScrollSource.UserInput)
-        scrollResult = dispatcher.dispatchPostScroll(
-            delta,
-            scrollResult,
-            NestedScrollSource.UserInput
-        )
+        scrollResult =
+            dispatcher.dispatchPostScroll(delta, scrollResult, NestedScrollSource.UserInput)
 
         runBlocking {
             velocityResult = dispatcher.dispatchPreFling(velocity)
diff --git a/compose/ui/ui/benchmark/src/androidTest/java/androidx/compose/ui/benchmark/OnPositionedBenchmark.kt b/compose/ui/ui/benchmark/src/androidTest/java/androidx/compose/ui/benchmark/OnPositionedBenchmark.kt
index 564fce8a..5a988d0 100644
--- a/compose/ui/ui/benchmark/src/androidTest/java/androidx/compose/ui/benchmark/OnPositionedBenchmark.kt
+++ b/compose/ui/ui/benchmark/src/androidTest/java/androidx/compose/ui/benchmark/OnPositionedBenchmark.kt
@@ -39,19 +39,15 @@
 @RunWith(AndroidJUnit4::class)
 class OnPositionedBenchmark {
 
-    @get:Rule
-    val benchmarkRule = ComposeBenchmarkRule()
+    @get:Rule val benchmarkRule = ComposeBenchmarkRule()
 
     @Test
     fun deepHierarchyOnPositioned_layout() {
-        benchmarkRule.toggleStateBenchmarkLayout({
-            DeepHierarchyOnPositionedTestCase()
-        })
+        benchmarkRule.toggleStateBenchmarkLayout({ DeepHierarchyOnPositionedTestCase() })
     }
 }
 
-private class DeepHierarchyOnPositionedTestCase :
-    ComposeTestCase, ToggleableTestCase {
+private class DeepHierarchyOnPositionedTestCase : ComposeTestCase, ToggleableTestCase {
 
     private lateinit var state: MutableState<Dp>
 
@@ -69,15 +65,13 @@
     @Composable
     private fun StaticChildren(count: Int) {
         if (count > 0) {
-            val modifier = if (count == 1) {
-                Modifier.onGloballyPositioned { it.size }
-            } else {
-                Modifier
-            }
-            Box(
-                Modifier.size(100.dp).then(modifier),
-                contentAlignment = Alignment.Center
-            ) {
+            val modifier =
+                if (count == 1) {
+                    Modifier.onGloballyPositioned { it.size }
+                } else {
+                    Modifier
+                }
+            Box(Modifier.size(100.dp).then(modifier), contentAlignment = Alignment.Center) {
                 StaticChildren(count - 1)
             }
         }
diff --git a/compose/ui/ui/benchmark/src/androidTest/java/androidx/compose/ui/benchmark/RecreateLayersBenchmark.kt b/compose/ui/ui/benchmark/src/androidTest/java/androidx/compose/ui/benchmark/RecreateLayersBenchmark.kt
index 43b0976..48cf2f9 100644
--- a/compose/ui/ui/benchmark/src/androidTest/java/androidx/compose/ui/benchmark/RecreateLayersBenchmark.kt
+++ b/compose/ui/ui/benchmark/src/androidTest/java/androidx/compose/ui/benchmark/RecreateLayersBenchmark.kt
@@ -39,19 +39,15 @@
 @RunWith(AndroidJUnit4::class)
 class RecreateLayersBenchmark {
 
-    @get:Rule
-    val benchmarkRule = ComposeBenchmarkRule()
+    @get:Rule val benchmarkRule = ComposeBenchmarkRule()
 
     @Test
     fun recreateContent() {
-        benchmarkRule.toggleStateBenchmarkLayout({
-            RecreateLayersTestCase()
-        })
+        benchmarkRule.toggleStateBenchmarkLayout({ RecreateLayersTestCase() })
     }
 }
 
-private class RecreateLayersTestCase :
-    ComposeTestCase, ToggleableTestCase {
+private class RecreateLayersTestCase : ComposeTestCase, ToggleableTestCase {
 
     private var state by mutableStateOf(false)
 
@@ -59,9 +55,7 @@
     override fun Content() {
         Column {
             val modifier = (if (state) Modifier.clipToBounds() else Modifier).size(10.dp)
-            repeat(100) {
-                Box(modifier)
-            }
+            repeat(100) { Box(modifier) }
         }
     }
 
diff --git a/compose/ui/ui/benchmark/src/androidTest/java/androidx/compose/ui/benchmark/TrailingLambdaBenchmark.kt b/compose/ui/ui/benchmark/src/androidTest/java/androidx/compose/ui/benchmark/TrailingLambdaBenchmark.kt
index 78cacc3..179160d 100644
--- a/compose/ui/ui/benchmark/src/androidTest/java/androidx/compose/ui/benchmark/TrailingLambdaBenchmark.kt
+++ b/compose/ui/ui/benchmark/src/androidTest/java/androidx/compose/ui/benchmark/TrailingLambdaBenchmark.kt
@@ -39,8 +39,7 @@
 @LargeTest
 @RunWith(AndroidJUnit4::class)
 class TrailingLambdaBenchmark {
-    @get:Rule
-    val benchmarkRule = ComposeBenchmarkRule()
+    @get:Rule val benchmarkRule = ComposeBenchmarkRule()
 
     @Test
     fun withTrailingLambdas_compose() {
@@ -72,33 +71,22 @@
         val number = remember { mutableStateOf(5) }
         numberState = number
 
-        val content = @Composable {
-            Box(Modifier.width(10.dp))
-        }
+        val content = @Composable { Box(Modifier.width(10.dp)) }
 
-        Column {
-            repeat(10) {
-                Content(number = number.value, content = content)
-            }
-        }
+        Column { repeat(10) { Content(number = number.value, content = content) } }
     }
 
     override fun toggleState() {
-        with(numberState!!) {
-            value = if (value == 5) 10 else 5
-        }
+        with(numberState!!) { value = if (value == 5) 10 else 5 }
     }
 
-    @Composable
-    abstract fun Content(number: Int, content: @Composable () -> Unit)
+    @Composable abstract fun Content(number: Int, content: @Composable () -> Unit)
 }
 
 private class WithTrailingLambdas : TrailingLambdaTestCase() {
     @Composable
     override fun Content(number: Int, content: @Composable () -> Unit) {
-        EmptyComposable(number = number) {
-            content()
-        }
+        EmptyComposable(number = number) { content() }
     }
 }
 
@@ -111,5 +99,4 @@
 
 @Suppress("UNUSED_PARAMETER")
 @Composable
-private fun EmptyComposable(number: Int, content: @Composable () -> Unit) {
-}
+private fun EmptyComposable(number: Int, content: @Composable () -> Unit) {}
diff --git a/compose/ui/ui/benchmark/src/androidTest/java/androidx/compose/ui/benchmark/accessibility/AccessibilityBenchmark.kt b/compose/ui/ui/benchmark/src/androidTest/java/androidx/compose/ui/benchmark/accessibility/AccessibilityBenchmark.kt
index a1b5633e..65a08db 100644
--- a/compose/ui/ui/benchmark/src/androidTest/java/androidx/compose/ui/benchmark/accessibility/AccessibilityBenchmark.kt
+++ b/compose/ui/ui/benchmark/src/androidTest/java/androidx/compose/ui/benchmark/accessibility/AccessibilityBenchmark.kt
@@ -52,8 +52,7 @@
 @RunWith(AndroidJUnit4::class)
 class AccessibilityBenchmark {
 
-    @get:Rule
-    val composeTestRule = createComposeRule()
+    @get:Rule val composeTestRule = createComposeRule()
 
     @OptIn(ExperimentalBenchmarkConfigApi::class)
     @get:Rule
@@ -81,14 +80,13 @@
         //  Collection directly. If we were only fetching one node with `onNodeWithTag`, we could
         // have a `SemanticsNodeInteraction.semanticsId`, but we want to create ANIs for multiple
         // nodes.
-        semanticsList = composeTestRule
-            .onAllNodesWithTag(tag, useUnmergedTree = true)
-            .fetchSemanticsNodes(atLeastOneRootRequired = false)
+        semanticsList =
+            composeTestRule
+                .onAllNodesWithTag(tag, useUnmergedTree = true)
+                .fetchSemanticsNodes(atLeastOneRootRequired = false)
 
         benchmarkRule.measureRepeated {
-            semanticsList.forEach {
-                provider.createAccessibilityNodeInfo(it.id)
-            }
+            semanticsList.forEach { provider.createAccessibilityNodeInfo(it.id) }
         }
     }
 
@@ -107,8 +105,8 @@
                     Row(Modifier.semantics { isTraversalGroup = true }) {
                         Button(
                             onClick = {},
-                            modifier = Modifier
-                                .semantics {
+                            modifier =
+                                Modifier.semantics {
                                     contentDescription = "ContentDescription 1"
                                     traversalIndex = 2f
                                     testTag = tag
@@ -118,8 +116,8 @@
                         }
                         Button(
                             onClick = {},
-                            modifier = Modifier
-                                .semantics {
+                            modifier =
+                                Modifier.semantics {
                                     contentDescription = "ContentDescription 2"
                                     traversalIndex = 1f
                                     testTag = tag
@@ -129,8 +127,8 @@
                         }
                         Button(
                             onClick = {},
-                            modifier = Modifier
-                                .semantics {
+                            modifier =
+                                Modifier.semantics {
                                     contentDescription = "ContentDescription 3"
                                     traversalIndex = 3f
                                     testTag = tag
diff --git a/compose/ui/ui/benchmark/src/androidTest/java/androidx/compose/ui/benchmark/accessibility/SemanticsEventsBenchmark.kt b/compose/ui/ui/benchmark/src/androidTest/java/androidx/compose/ui/benchmark/accessibility/SemanticsEventsBenchmark.kt
index 4611573..2b953d6 100644
--- a/compose/ui/ui/benchmark/src/androidTest/java/androidx/compose/ui/benchmark/accessibility/SemanticsEventsBenchmark.kt
+++ b/compose/ui/ui/benchmark/src/androidTest/java/androidx/compose/ui/benchmark/accessibility/SemanticsEventsBenchmark.kt
@@ -58,18 +58,13 @@
 
     private val semanticsFactory = { SemanticsTestCase() }
 
-     /**
-      * Send semantic events by changing AnnotatedString in content via toggling.
-      */
+    /** Send semantic events by changing AnnotatedString in content via toggling. */
     @Test
     fun sendSemanticsEvents() {
-        benchmarkRule.toggleStateBenchmarkComposeMeasureLayout(
-            caseFactory = semanticsFactory
-        )
+        benchmarkRule.toggleStateBenchmarkComposeMeasureLayout(caseFactory = semanticsFactory)
     }
 
-    class SemanticsTestCase :
-        ComposeTestCase, ToggleableTestCase {
+    class SemanticsTestCase : ComposeTestCase, ToggleableTestCase {
 
         private lateinit var state: MutableState<Boolean>
 
@@ -81,13 +76,11 @@
             // Use an AnnotatedString to trigger semantics changes and send accessibility events.
             repeat(10) {
                 Box(
-                    Modifier
-                        .size(10.dp)
-                        .semantics(mergeDescendants = true) {
-                            setText { true }
-                            textSelectionRange = TextRange(4)
-                            editableText = AnnotatedString(if (!state.value) "1234" else "1235")
-                        }
+                    Modifier.size(10.dp).semantics(mergeDescendants = true) {
+                        setText { true }
+                        textSelectionRange = TextRange(4)
+                        editableText = AnnotatedString(if (!state.value) "1234" else "1235")
+                    }
                 )
                 BasicText(state.value.toString())
             }
diff --git a/compose/ui/ui/benchmark/src/androidTest/java/androidx/compose/ui/benchmark/accessibility/TextAccessibilityBenchmark.kt b/compose/ui/ui/benchmark/src/androidTest/java/androidx/compose/ui/benchmark/accessibility/TextAccessibilityBenchmark.kt
index 0186a36..c03ae88 100644
--- a/compose/ui/ui/benchmark/src/androidTest/java/androidx/compose/ui/benchmark/accessibility/TextAccessibilityBenchmark.kt
+++ b/compose/ui/ui/benchmark/src/androidTest/java/androidx/compose/ui/benchmark/accessibility/TextAccessibilityBenchmark.kt
@@ -76,9 +76,7 @@
         if (!accessibilityEnabled) return
 
         measureRepeatedOnUiThread(
-            content = {
-                Text("Text Composable", Modifier.testTag("tag"))
-            },
+            content = { Text("Text Composable", Modifier.testTag("tag")) },
             benchmark = {
                 val semanticsId = runWithTimingDisabled { findIdByTag("tag") }
                 nodeProvider.createAccessibilityNodeInfo(semanticsId)
@@ -86,19 +84,15 @@
         )
     }
 
-    @Test fun createAccessibilityNodeInfoFromId_singleOfMultipleTextComponents() {
+    @Test
+    fun createAccessibilityNodeInfoFromId_singleOfMultipleTextComponents() {
         if (!accessibilityEnabled) return
 
         measureRepeatedOnUiThread(
             content = {
                 Column {
-                    Text(
-                        modifier = Modifier.testTag("tag"),
-                        text = "Text Composable"
-                    )
-                    repeat(9) {
-                        Text("Text Composable")
-                    }
+                    Text(modifier = Modifier.testTag("tag"), text = "Text Composable")
+                    repeat(9) { Text("Text Composable") }
                 }
             },
             benchmark = {
@@ -117,12 +111,8 @@
         if (!accessibilityEnabled) return
 
         measureRepeatedOnUiThread(
-            content = {
-                Text("Text Composable", Modifier.testTag("text"))
-            },
-            benchmark = {
-                nodeProvider.createAccessibilityNodeInfo(HOST_VIEW_ID)
-            }
+            content = { Text("Text Composable", Modifier.testTag("text")) },
+            benchmark = { nodeProvider.createAccessibilityNodeInfo(HOST_VIEW_ID) }
         )
     }
 
@@ -137,18 +127,11 @@
         measureRepeatedOnUiThread(
             content = {
                 Column {
-                    Text(
-                        modifier = Modifier.testTag("text"),
-                        text = "Text Composable"
-                    )
-                    repeat(9) {
-                        Text("Text Composable")
-                    }
+                    Text(modifier = Modifier.testTag("text"), text = "Text Composable")
+                    repeat(9) { Text("Text Composable") }
                 }
             },
-            benchmark = {
-                nodeProvider.createAccessibilityNodeInfo(HOST_VIEW_ID)
-            }
+            benchmark = { nodeProvider.createAccessibilityNodeInfo(HOST_VIEW_ID) }
         )
     }
 
@@ -186,9 +169,7 @@
                         setupAccessibility()
                         Column {
                             if (include) {
-                                repeat(10) {
-                                    Text("abc")
-                                }
+                                repeat(10) { Text("abc") }
                             }
                         }
                     }
@@ -212,11 +193,7 @@
                     @Composable
                     override fun Content() {
                         setupAccessibility()
-                        Column {
-                            repeat(count) {
-                                Text("abc")
-                            }
-                        }
+                        Column { repeat(count) { Text("abc") } }
                     }
 
                     override fun toggleState() {
@@ -329,9 +306,7 @@
                         coroutineScope = rememberCoroutineScope()
 
                         LazyColumn(Modifier.height(600.dp), state) {
-                            items(300) {
-                                Text("item $it", Modifier.height(60.dp))
-                            }
+                            items(300) { Text("item $it", Modifier.height(60.dp)) }
                         }
                     }
 
@@ -351,17 +326,16 @@
         @Parameterized.Parameters(
             name = "accessibilityEnabled = {0}, invalidateSemanticsOnEachRun = {1}"
         )
-        fun initParameters() = listOf(
-            arrayOf(false, false),
-            arrayOf(true, false),
-            arrayOf(true, true)
-        )
+        fun initParameters() =
+            listOf(arrayOf(false, false), arrayOf(true, false), arrayOf(true, true))
     }
 
     private fun findIdByTag(@Suppress("SameParameterValue") tag: String): Int {
-        return (view as RootForTest).semanticsOwner
+        return (view as RootForTest)
+            .semanticsOwner
             .getAllSemanticsNodes(mergingEnabled = false)
-            .find { it.config.getOrNull(SemanticsProperties.TestTag) == tag }!!.id
+            .find { it.config.getOrNull(SemanticsProperties.TestTag) == tag }!!
+            .id
     }
 
     private fun measureRepeatedOnUiThread(
@@ -381,7 +355,6 @@
                 }
             }
         ) {
-
             benchmarkRule.measureRepeatedOnUiThread {
                 runWithTimingDisabled {
                     doFrame()
diff --git a/compose/ui/ui/benchmark/src/androidTest/java/androidx/compose/ui/benchmark/accessibility/TextFieldAccessibilityBenchmark.kt b/compose/ui/ui/benchmark/src/androidTest/java/androidx/compose/ui/benchmark/accessibility/TextFieldAccessibilityBenchmark.kt
index 0ebdb9b..4058b22 100644
--- a/compose/ui/ui/benchmark/src/androidTest/java/androidx/compose/ui/benchmark/accessibility/TextFieldAccessibilityBenchmark.kt
+++ b/compose/ui/ui/benchmark/src/androidTest/java/androidx/compose/ui/benchmark/accessibility/TextFieldAccessibilityBenchmark.kt
@@ -90,7 +90,8 @@
         )
     }
 
-    @Test fun createAccessibilityNodeInfoFromId_singleOfMultipleTextField() {
+    @Test
+    fun createAccessibilityNodeInfoFromId_singleOfMultipleTextField() {
         if (!accessibilityEnabled) return
 
         measureRepeatedOnUiThread(
@@ -101,9 +102,7 @@
                         value = "abc",
                         onValueChange = {},
                     )
-                    repeat(9) {
-                        TextField(value = "abc", onValueChange = {})
-                    }
+                    repeat(9) { TextField(value = "abc", onValueChange = {}) }
                 }
             },
             benchmark = {
@@ -123,15 +122,9 @@
 
         measureRepeatedOnUiThread(
             content = {
-                TextField(
-                    modifier = Modifier.testTag("tag"),
-                    value = "abc",
-                    onValueChange = {}
-                )
+                TextField(modifier = Modifier.testTag("tag"), value = "abc", onValueChange = {})
             },
-            benchmark = {
-                nodeProvider.createAccessibilityNodeInfo(HOST_VIEW_ID)
-            }
+            benchmark = { nodeProvider.createAccessibilityNodeInfo(HOST_VIEW_ID) }
         )
     }
 
@@ -151,14 +144,10 @@
                         value = "abc",
                         onValueChange = {},
                     )
-                    repeat(9) {
-                        TextField(value = "abc", onValueChange = {})
-                    }
+                    repeat(9) { TextField(value = "abc", onValueChange = {}) }
                 }
             },
-            benchmark = {
-                nodeProvider.createAccessibilityNodeInfo(HOST_VIEW_ID)
-            }
+            benchmark = { nodeProvider.createAccessibilityNodeInfo(HOST_VIEW_ID) }
         )
     }
 
@@ -172,9 +161,7 @@
                     @Composable
                     override fun Content() {
                         setupAccessibility()
-                        Column {
-                            if (include) TextField(value = "abc", onValueChange = {})
-                        }
+                        Column { if (include) TextField(value = "abc", onValueChange = {}) }
                     }
 
                     override fun toggleState() {
@@ -198,9 +185,7 @@
                         setupAccessibility()
                         Column {
                             if (include) {
-                                repeat(10) {
-                                    TextField(value = "abc", onValueChange = {})
-                                }
+                                repeat(10) { TextField(value = "abc", onValueChange = {}) }
                             }
                         }
                     }
@@ -225,11 +210,7 @@
                     @Composable
                     override fun Content() {
                         setupAccessibility()
-                        Column {
-                            repeat(count) {
-                                TextField(value = "abc", onValueChange = {})
-                            }
-                        }
+                        Column { repeat(count) { TextField(value = "abc", onValueChange = {}) } }
                     }
 
                     override fun toggleState() {
@@ -370,17 +351,16 @@
         @Parameterized.Parameters(
             name = "accessibilityEnabled = {0}, invalidateSemanticsOnEachRun = {1}"
         )
-        fun initParameters() = listOf(
-            arrayOf(false, false),
-            arrayOf(true, false),
-            arrayOf(true, true)
-        )
+        fun initParameters() =
+            listOf(arrayOf(false, false), arrayOf(true, false), arrayOf(true, true))
     }
 
     private fun findIdByTag(@Suppress("SameParameterValue") tag: String): Int {
-        return (view as RootForTest).semanticsOwner
+        return (view as RootForTest)
+            .semanticsOwner
             .getAllSemanticsNodes(mergingEnabled = false)
-            .find { it.config.getOrNull(SemanticsProperties.TestTag) == tag }!!.id
+            .find { it.config.getOrNull(SemanticsProperties.TestTag) == tag }!!
+            .id
     }
 
     private fun measureRepeatedOnUiThread(
diff --git a/compose/ui/ui/benchmark/src/androidTest/java/androidx/compose/ui/benchmark/autofill/AndroidAutofillBenchmark.kt b/compose/ui/ui/benchmark/src/androidTest/java/androidx/compose/ui/benchmark/autofill/AndroidAutofillBenchmark.kt
index 66b8f02..5d9bf46 100644
--- a/compose/ui/ui/benchmark/src/androidTest/java/androidx/compose/ui/benchmark/autofill/AndroidAutofillBenchmark.kt
+++ b/compose/ui/ui/benchmark/src/androidTest/java/androidx/compose/ui/benchmark/autofill/AndroidAutofillBenchmark.kt
@@ -43,11 +43,9 @@
 @RunWith(AndroidJUnit4::class)
 class AndroidAutofillBenchmark {
 
-    @get:Rule
-    val composeTestRule = createComposeRule()
+    @get:Rule val composeTestRule = createComposeRule()
 
-    @get:Rule
-    val benchmarkRule = BenchmarkRule()
+    @get:Rule val benchmarkRule = BenchmarkRule()
 
     private lateinit var autofillTree: AutofillTree
     private lateinit var composeView: View
@@ -67,19 +65,19 @@
     fun provideAutofillVirtualStructure_performAutofill() {
 
         // Arrange.
-        val autofillNode = AutofillNode(
-            onFill = {},
-            autofillTypes = listOf(AutofillType.PersonFullName),
-            boundingBox = Rect(0f, 0f, 0f, 0f)
-        )
-        val autofillValues = SparseArray<AutofillValue>().apply {
-            append(autofillNode.id, AutofillValue.forText("Name"))
-        }
+        val autofillNode =
+            AutofillNode(
+                onFill = {},
+                autofillTypes = listOf(AutofillType.PersonFullName),
+                boundingBox = Rect(0f, 0f, 0f, 0f)
+            )
+        val autofillValues =
+            SparseArray<AutofillValue>().apply {
+                append(autofillNode.id, AutofillValue.forText("Name"))
+            }
         autofillTree += autofillNode
 
         // Assess.
-        benchmarkRule.measureRepeated {
-            composeView.autofill(autofillValues)
-        }
+        benchmarkRule.measureRepeated { composeView.autofill(autofillValues) }
     }
 }
diff --git a/compose/ui/ui/benchmark/src/androidTest/java/androidx/compose/ui/benchmark/focus/FocusBenchmark.kt b/compose/ui/ui/benchmark/src/androidTest/java/androidx/compose/ui/benchmark/focus/FocusBenchmark.kt
index b8db32d..b228824 100644
--- a/compose/ui/ui/benchmark/src/androidTest/java/androidx/compose/ui/benchmark/focus/FocusBenchmark.kt
+++ b/compose/ui/ui/benchmark/src/androidTest/java/androidx/compose/ui/benchmark/focus/FocusBenchmark.kt
@@ -33,8 +33,7 @@
 @RunWith(AndroidJUnit4::class)
 class FocusBenchmark {
 
-    @get:Rule
-    val composeBenchmarkRule = ComposeBenchmarkRule()
+    @get:Rule val composeBenchmarkRule = ComposeBenchmarkRule()
 
     @Test
     fun focusTarget() {
diff --git a/compose/ui/ui/benchmark/src/androidTest/java/androidx/compose/ui/benchmark/graphics/vector/CreateVectorPainterBenchmark.kt b/compose/ui/ui/benchmark/src/androidTest/java/androidx/compose/ui/benchmark/graphics/vector/CreateVectorPainterBenchmark.kt
index 00182f8..1a1191e 100644
--- a/compose/ui/ui/benchmark/src/androidTest/java/androidx/compose/ui/benchmark/graphics/vector/CreateVectorPainterBenchmark.kt
+++ b/compose/ui/ui/benchmark/src/androidTest/java/androidx/compose/ui/benchmark/graphics/vector/CreateVectorPainterBenchmark.kt
@@ -43,21 +43,22 @@
 @RunWith(AndroidJUnit4::class)
 class CreateVectorPainterBenchmark {
 
-    @get:Rule
-    val benchmarkRule = ComposeBenchmarkRule()
+    @get:Rule val benchmarkRule = ComposeBenchmarkRule()
 
     @Test
     fun recreateContent() {
-        benchmarkRule.toggleStateBenchmarkDraw({
-            RecreateVectorPainterTestCase()
-        }, assertOneRecomposition = false)
+        benchmarkRule.toggleStateBenchmarkDraw(
+            { RecreateVectorPainterTestCase() },
+            assertOneRecomposition = false
+        )
     }
 
     @Test
     fun renderVectorWithDifferentSizes() {
-        benchmarkRule.toggleStateBenchmarkDraw({
-            ResizeVectorPainter()
-        }, assertOneRecomposition = false)
+        benchmarkRule.toggleStateBenchmarkDraw(
+            { ResizeVectorPainter() },
+            assertOneRecomposition = false
+        )
     }
 }
 
diff --git a/compose/ui/ui/benchmark/src/androidTest/java/androidx/compose/ui/benchmark/input/pointer/AndroidTapIntegrationBenchmark.kt b/compose/ui/ui/benchmark/src/androidTest/java/androidx/compose/ui/benchmark/input/pointer/AndroidTapIntegrationBenchmark.kt
index 26d85af..e00db2d 100644
--- a/compose/ui/ui/benchmark/src/androidTest/java/androidx/compose/ui/benchmark/input/pointer/AndroidTapIntegrationBenchmark.kt
+++ b/compose/ui/ui/benchmark/src/androidTest/java/androidx/compose/ui/benchmark/input/pointer/AndroidTapIntegrationBenchmark.kt
@@ -44,28 +44,22 @@
  * Benchmark for simply tapping on an item in Android.
  *
  * The intent is to measure the speed of all parts necessary for a normal tap starting from
- * MotionEvents getting dispatched to a particular view. The test therefore includes hit
- * testing and dispatch.
+ * MotionEvents getting dispatched to a particular view. The test therefore includes hit testing and
+ * dispatch.
  *
  * This is intended to be an equivalent counterpart to [ComposeTapIntegrationBenchmark].
  *
- * The hierarchy is set up to look like:
- * rootView
- *   -> LinearLayout
- *     -> CustomView (with click listener)
- *       -> TextView
- *       -> TextView
- *       -> TextView
- *       -> ...
+ * The hierarchy is set up to look like: rootView -> LinearLayout -> CustomView (with click
+ * listener) -> TextView -> TextView -> TextView -> ...
  *
- * MotionEvents are dispatched to rootView as ACTION_DOWN followed by ACTION_UP.  The validity of
- * the test is verified in a custom click listener in CustomView with
+ * MotionEvents are dispatched to rootView as ACTION_DOWN followed by ACTION_UP. The validity of the
+ * test is verified in a custom click listener in CustomView with
  * com.google.common.truth.Truth.assertThat and by counting the clicks in the click listener and
  * later verifying that they count is sufficiently high.
  *
- * The reason a CustomView is used with a custom click listener is that View's normal click
- * listener is called via a posted Runnable, which is problematic for the benchmark library and
- * less equivalent to what Compose does anyway.
+ * The reason a CustomView is used with a custom click listener is that View's normal click listener
+ * is called via a posted Runnable, which is problematic for the benchmark library and less
+ * equivalent to what Compose does anyway.
  */
 @LargeTest
 @RunWith(AndroidJUnit4::class)
@@ -77,8 +71,7 @@
     private var actualClickCount = 0
     private var expectedClickCount = 0
 
-    @get:Rule
-    val benchmarkRule = BenchmarkRule()
+    @get:Rule val benchmarkRule = BenchmarkRule()
 
     @Suppress("DEPRECATION")
     @get:Rule
@@ -95,25 +88,24 @@
         rootView = activity.findViewById<ViewGroup>(android.R.id.content)
 
         activityTestRule.runOnUiThread {
-
-            val children = (0 until NumItems).map { i ->
-                CustomView(activity).apply {
-                    layoutParams = ViewGroup.LayoutParams(MATCH_PARENT, ItemHeightPx.toInt())
-                    label = "$i"
-                    clickListener = {
-                        assertThat(this.label).isEqualTo(expectedLabel)
-                        actualClickCount++
+            val children =
+                (0 until NumItems).map { i ->
+                    CustomView(activity).apply {
+                        layoutParams = ViewGroup.LayoutParams(MATCH_PARENT, ItemHeightPx.toInt())
+                        label = "$i"
+                        clickListener = {
+                            assertThat(this.label).isEqualTo(expectedLabel)
+                            actualClickCount++
+                        }
                     }
                 }
-            }
 
-            val linearLayout = LinearLayout(activity).apply {
-                orientation = LinearLayout.VERTICAL
-                layoutParams = ViewGroup.LayoutParams(MATCH_PARENT, MATCH_PARENT)
-                children.forEach {
-                    addView(it)
+            val linearLayout =
+                LinearLayout(activity).apply {
+                    orientation = LinearLayout.VERTICAL
+                    layoutParams = ViewGroup.LayoutParams(MATCH_PARENT, MATCH_PARENT)
+                    children.forEach { addView(it) }
                 }
-            }
 
             activity.setContentView(linearLayout)
         }
@@ -148,25 +140,27 @@
         // half height of an item + top of the chosen item = middle of the chosen item
         val y = (ItemHeightPx / 2) + (item * ItemHeightPx)
 
-        val down = MotionEvent(
-            0,
-            ACTION_DOWN,
-            1,
-            0,
-            arrayOf(PointerProperties(0)),
-            arrayOf(PointerCoords(0f, y)),
-            rootView
-        )
+        val down =
+            MotionEvent(
+                0,
+                ACTION_DOWN,
+                1,
+                0,
+                arrayOf(PointerProperties(0)),
+                arrayOf(PointerCoords(0f, y)),
+                rootView
+            )
 
-        val up = MotionEvent(
-            10,
-            ACTION_UP,
-            1,
-            0,
-            arrayOf(PointerProperties(0)),
-            arrayOf(PointerCoords(0f, y)),
-            rootView
-        )
+        val up =
+            MotionEvent(
+                10,
+                ACTION_UP,
+                1,
+                0,
+                arrayOf(PointerProperties(0)),
+                arrayOf(PointerCoords(0f, y)),
+                rootView
+            )
 
         benchmarkRule.measureRepeated {
             rootView.dispatchTouchEvent(down)
@@ -187,9 +181,10 @@
 
     lateinit var clickListener: () -> Unit
 
-    val textView: TextView = TextView(context).apply {
-        layoutParams = ViewGroup.LayoutParams(MATCH_PARENT, MATCH_PARENT)
-    }
+    val textView: TextView =
+        TextView(context).apply {
+            layoutParams = ViewGroup.LayoutParams(MATCH_PARENT, MATCH_PARENT)
+        }
 
     init {
         addView(textView)
diff --git a/compose/ui/ui/benchmark/src/androidTest/java/androidx/compose/ui/benchmark/input/pointer/ComposePreciseFingerTapIntegrationBenchmark.kt b/compose/ui/ui/benchmark/src/androidTest/java/androidx/compose/ui/benchmark/input/pointer/ComposePreciseFingerTapIntegrationBenchmark.kt
index 04fc858..2b31e86 100644
--- a/compose/ui/ui/benchmark/src/androidTest/java/androidx/compose/ui/benchmark/input/pointer/ComposePreciseFingerTapIntegrationBenchmark.kt
+++ b/compose/ui/ui/benchmark/src/androidTest/java/androidx/compose/ui/benchmark/input/pointer/ComposePreciseFingerTapIntegrationBenchmark.kt
@@ -42,22 +42,17 @@
  * real device.
  *
  * The intent is to measure the speed of all parts necessary for a normal finger tap and move
- * starting from [MotionEvent]s getting dispatched to a particular view.  The test therefore
- * includes hit testing and dispatch.
+ * starting from [MotionEvent]s getting dispatched to a particular view. The test therefore includes
+ * hit testing and dispatch.
  *
  * This is intended to be a more through benchmark of [ComposeTapIntegrationBenchmark] and a finger
  * tapping version of [ComposePreciseStylusTapIntegrationBenchmark].
  *
- * The hierarchy is set up to look like:
- * rootView
- *   -> Column
- *     -> Text (with click listener)
- *     -> Text (with click listener)
- *     -> Text (with click listener)
- *     -> ...
+ * The hierarchy is set up to look like: rootView -> Column -> Text (with click listener) -> Text
+ * (with click listener) -> Text (with click listener) -> ...
  *
- * MotionEvents are dispatched to rootView as an ACTION_DOWN, an ACTION_MOVE, and finally
- * an ACTION_UP.  The validity of the test is verified inside the click listener with
+ * MotionEvents are dispatched to rootView as an ACTION_DOWN, an ACTION_MOVE, and finally an
+ * ACTION_UP. The validity of the test is verified inside the click listener with
  * com.google.common.truth.Truth.assertThat and by counting the clicks in the click listener and
  * later verifying that they count is sufficiently high.
  */
@@ -65,8 +60,7 @@
 @RunWith(AndroidJUnit4::class)
 class ComposePreciseFingerTapIntegrationBenchmark {
 
-    @get:Rule
-    val benchmarkRule = ComposeBenchmarkRule()
+    @get:Rule val benchmarkRule = ComposeBenchmarkRule()
 
     @Test
     fun clickOnLateItem() {
@@ -110,83 +104,86 @@
 
             // Precise Touch/Finger MotionEvents (Down, Move, Up)
             // Based on real MotionEvents pulled from a device.
-            val fingerDownMotionEvent = android.view.MotionEvent.obtain(
-                8451548L,
-                8451548L,
-                android.view.MotionEvent.ACTION_DOWN,
-                1,
-                arrayOf(
-                    PointerProperties(0).apply {
-                        toolType = android.view.MotionEvent.TOOL_TYPE_FINGER
-                    }
-                ),
-                arrayOf(
-                    PointerCoords(xDown, yDown).apply {
-                        pressure = 1.0f
-                        size = 0.08639053f
-                    }
-                ),
-                0,
-                0,
-                1.000625f,
-                1.0003906f,
-                6,
-                0x0, // Edge Flags value of 0.
-                0x1002, // Source of the event value of 4098
-                0x2 // Motion Event Flags value of 2
-            )
+            val fingerDownMotionEvent =
+                android.view.MotionEvent.obtain(
+                    8451548L,
+                    8451548L,
+                    android.view.MotionEvent.ACTION_DOWN,
+                    1,
+                    arrayOf(
+                        PointerProperties(0).apply {
+                            toolType = android.view.MotionEvent.TOOL_TYPE_FINGER
+                        }
+                    ),
+                    arrayOf(
+                        PointerCoords(xDown, yDown).apply {
+                            pressure = 1.0f
+                            size = 0.08639053f
+                        }
+                    ),
+                    0,
+                    0,
+                    1.000625f,
+                    1.0003906f,
+                    6,
+                    0x0, // Edge Flags value of 0.
+                    0x1002, // Source of the event value of 4098
+                    0x2 // Motion Event Flags value of 2
+                )
 
-            val fingerMoveMotionEvent = android.view.MotionEvent.obtain(
-                8451548L,
-                8451632L,
-                android.view.MotionEvent.ACTION_MOVE,
-                1,
-                arrayOf(
-                    PointerProperties(0).apply {
-                        toolType = android.view.MotionEvent.TOOL_TYPE_FINGER
-                    }
-                ),
-                arrayOf(
-                    PointerCoords(xMove, yMove).apply {
-                        pressure = 1.0f
-                        size = 0.08639053f
-                    }
-                ),
-                0,
-                0,
-                1.000625f,
-                1.0003906f,
-                6,
-                0x0, // Edge Flags value of 0.
-                0x1002, // Source of the event value of 4098
-                0x2 // Motion Event Flags value of 2
-            )
+            val fingerMoveMotionEvent =
+                android.view.MotionEvent.obtain(
+                    8451548L,
+                    8451632L,
+                    android.view.MotionEvent.ACTION_MOVE,
+                    1,
+                    arrayOf(
+                        PointerProperties(0).apply {
+                            toolType = android.view.MotionEvent.TOOL_TYPE_FINGER
+                        }
+                    ),
+                    arrayOf(
+                        PointerCoords(xMove, yMove).apply {
+                            pressure = 1.0f
+                            size = 0.08639053f
+                        }
+                    ),
+                    0,
+                    0,
+                    1.000625f,
+                    1.0003906f,
+                    6,
+                    0x0, // Edge Flags value of 0.
+                    0x1002, // Source of the event value of 4098
+                    0x2 // Motion Event Flags value of 2
+                )
 
-            val fingerUpMotionEvent = android.view.MotionEvent.obtain(
-                8451548L,
-                8451756L,
-                android.view.MotionEvent.ACTION_UP,
-                1,
-                arrayOf(
-                    PointerProperties(0).apply {
-                        toolType = android.view.MotionEvent.TOOL_TYPE_FINGER
-                    }
-                ),
-                arrayOf(
-                    PointerCoords(xUp, yUp).apply {
-                        pressure = 1.0f
-                        size = 0.08639053f
-                    }
-                ),
-                0,
-                0,
-                1.000625f,
-                1.0003906f,
-                6,
-                0x0, // Edge Flags value of 0.
-                0x1002, // Source of the event value of 4098
-                0x2 // Motion Event Flags value of 2
-            )
+            val fingerUpMotionEvent =
+                android.view.MotionEvent.obtain(
+                    8451548L,
+                    8451756L,
+                    android.view.MotionEvent.ACTION_UP,
+                    1,
+                    arrayOf(
+                        PointerProperties(0).apply {
+                            toolType = android.view.MotionEvent.TOOL_TYPE_FINGER
+                        }
+                    ),
+                    arrayOf(
+                        PointerCoords(xUp, yUp).apply {
+                            pressure = 1.0f
+                            size = 0.08639053f
+                        }
+                    ),
+                    0,
+                    0,
+                    1.000625f,
+                    1.0003906f,
+                    6,
+                    0x0, // Edge Flags value of 0.
+                    0x1002, // Source of the event value of 4098
+                    0x2 // Motion Event Flags value of 2
+                )
 
             benchmarkRule.measureRepeatedOnUiThread {
                 rootView.dispatchTouchEvent(fingerDownMotionEvent)
@@ -207,38 +204,33 @@
 
         @Composable
         override fun Content() {
-            with(LocalDensity.current) {
-                itemHeightDp = ItemHeightPx.toDp()
-            }
+            with(LocalDensity.current) { itemHeightDp = ItemHeightPx.toDp() }
 
             EmailList(NumItems)
         }
 
         @Composable
         fun EmailList(count: Int) {
-            Column {
-                repeat(count) { i ->
-                    Email("$i")
-                }
-            }
+            Column { repeat(count) { i -> Email("$i") } }
         }
 
         @Composable
         fun Email(label: String) {
             BasicText(
                 text = label,
-                modifier = Modifier
-                    .pointerInput(label) {
-                        detectTapGestures {
-                            assertThat(label).isEqualTo(expectedLabel)
-                            actualClickCount++
+                modifier =
+                    Modifier.pointerInput(label) {
+                            detectTapGestures {
+                                assertThat(label).isEqualTo(expectedLabel)
+                                actualClickCount++
+                            }
                         }
-                    }
-                    .fillMaxWidth()
-                    .requiredHeight(itemHeightDp)
+                        .fillMaxWidth()
+                        .requiredHeight(itemHeightDp)
             )
         }
     }
+
     companion object {
         private const val MOVE_AMOUNT_PX = 30f
     }
diff --git a/compose/ui/ui/benchmark/src/androidTest/java/androidx/compose/ui/benchmark/input/pointer/ComposePreciseStylusTapIntegrationBenchmark.kt b/compose/ui/ui/benchmark/src/androidTest/java/androidx/compose/ui/benchmark/input/pointer/ComposePreciseStylusTapIntegrationBenchmark.kt
index 184ea91..a805fd0 100644
--- a/compose/ui/ui/benchmark/src/androidTest/java/androidx/compose/ui/benchmark/input/pointer/ComposePreciseStylusTapIntegrationBenchmark.kt
+++ b/compose/ui/ui/benchmark/src/androidTest/java/androidx/compose/ui/benchmark/input/pointer/ComposePreciseStylusTapIntegrationBenchmark.kt
@@ -46,22 +46,17 @@
  * real device.
  *
  * The intent is to measure the speed of all parts necessary for a normal stylus tap and move
- * starting from [MotionEvent]s getting dispatched to a particular view.  The test therefore
- * includes hit testing and dispatch.
+ * starting from [MotionEvent]s getting dispatched to a particular view. The test therefore includes
+ * hit testing and dispatch.
  *
  * This is intended to be a more through benchmark of [ComposeTapIntegrationBenchmark] and a stylus
  * version of [ComposePreciseFingerTapIntegrationBenchmark].
  *
- * The hierarchy is set up to look like:
- * rootView
- *   -> Column
- *     -> Text (with click listener)
- *     -> Text (with click listener)
- *     -> Text (with click listener)
- *     -> ...
+ * The hierarchy is set up to look like: rootView -> Column -> Text (with click listener) -> Text
+ * (with click listener) -> Text (with click listener) -> ...
  *
- * MotionEvents are dispatched to rootView as an ACTION_DOWN, an ACTION_MOVE, and finally
- * an ACTION_UP.  The validity of the test is verified inside the click listener with
+ * MotionEvents are dispatched to rootView as an ACTION_DOWN, an ACTION_MOVE, and finally an
+ * ACTION_UP. The validity of the test is verified inside the click listener with
  * com.google.common.truth.Truth.assertThat and by counting the clicks in the click listener and
  * later verifying that they count is sufficiently high.
  */
@@ -69,8 +64,7 @@
 @RunWith(AndroidJUnit4::class)
 class ComposePreciseStylusTapIntegrationBenchmark {
 
-    @get:Rule
-    val benchmarkRule = ComposeBenchmarkRule()
+    @get:Rule val benchmarkRule = ComposeBenchmarkRule()
 
     @Test
     fun clickOnLateItem() {
@@ -114,83 +108,86 @@
 
             // Precise Stylus MotionEvents (Down, Move, Up)
             // Based on real MotionEvents pulled from a device.
-            val stylusDownMotionEvent = android.view.MotionEvent.obtain(
-                346709L,
-                346709L,
-                android.view.MotionEvent.ACTION_DOWN,
-                1,
-                arrayOf(
-                    PointerProperties(0).apply {
-                        toolType = android.view.MotionEvent.TOOL_TYPE_STYLUS
-                    }
-                ),
-                arrayOf(
-                    PointerCoords(xDown, yDown).apply {
-                        pressure = 0.18339439f
-                        size = 0.0f
-                    }
-                ),
-                0,
-                0,
-                1.000625f,
-                1.0003906f,
-                7,
-                0x0, // Edge Flags value of 0.
-                0x5002, // Source of the event value of 20482
-                0x2 // Motion Event Flags value of 2
-            )
+            val stylusDownMotionEvent =
+                android.view.MotionEvent.obtain(
+                    346709L,
+                    346709L,
+                    android.view.MotionEvent.ACTION_DOWN,
+                    1,
+                    arrayOf(
+                        PointerProperties(0).apply {
+                            toolType = android.view.MotionEvent.TOOL_TYPE_STYLUS
+                        }
+                    ),
+                    arrayOf(
+                        PointerCoords(xDown, yDown).apply {
+                            pressure = 0.18339439f
+                            size = 0.0f
+                        }
+                    ),
+                    0,
+                    0,
+                    1.000625f,
+                    1.0003906f,
+                    7,
+                    0x0, // Edge Flags value of 0.
+                    0x5002, // Source of the event value of 20482
+                    0x2 // Motion Event Flags value of 2
+                )
 
-            val stylusMoveMotionEvent = android.view.MotionEvent.obtain(
-                346709L,
-                347222L,
-                android.view.MotionEvent.ACTION_MOVE,
-                1,
-                arrayOf(
-                    PointerProperties(0).apply {
-                        toolType = android.view.MotionEvent.TOOL_TYPE_STYLUS
-                    }
-                ),
-                arrayOf(
-                    PointerCoords(xMove, yMove).apply {
-                        pressure = 0.2947497f
-                        size = 0.0f
-                    }
-                ),
-                0,
-                0,
-                1.000625f,
-                1.0003906f,
-                7,
-                0x0, // Edge Flags value of 0.
-                0x5002, // Source of the event value of 20482
-                0x2 // Motion Event Flags value of 2
-            )
+            val stylusMoveMotionEvent =
+                android.view.MotionEvent.obtain(
+                    346709L,
+                    347222L,
+                    android.view.MotionEvent.ACTION_MOVE,
+                    1,
+                    arrayOf(
+                        PointerProperties(0).apply {
+                            toolType = android.view.MotionEvent.TOOL_TYPE_STYLUS
+                        }
+                    ),
+                    arrayOf(
+                        PointerCoords(xMove, yMove).apply {
+                            pressure = 0.2947497f
+                            size = 0.0f
+                        }
+                    ),
+                    0,
+                    0,
+                    1.000625f,
+                    1.0003906f,
+                    7,
+                    0x0, // Edge Flags value of 0.
+                    0x5002, // Source of the event value of 20482
+                    0x2 // Motion Event Flags value of 2
+                )
 
-            val stylusUpMotionEvent = android.view.MotionEvent.obtain(
-                346709L,
-                347227L,
-                android.view.MotionEvent.ACTION_UP,
-                1,
-                arrayOf(
-                    PointerProperties(0).apply {
-                        toolType = android.view.MotionEvent.TOOL_TYPE_STYLUS
-                    }
-                ),
-                arrayOf(
-                    PointerCoords(xUp, yUp).apply {
-                        pressure = 0.2947497f
-                        size = 0.0f
-                    }
-                ),
-                0,
-                0,
-                1.000625f,
-                1.0003906f,
-                7,
-                0x0, // Edge Flags value of 0.
-                0x5002, // Source of the event value of 20482
-                0x2 // Motion Event Flags value of 2
-            )
+            val stylusUpMotionEvent =
+                android.view.MotionEvent.obtain(
+                    346709L,
+                    347227L,
+                    android.view.MotionEvent.ACTION_UP,
+                    1,
+                    arrayOf(
+                        PointerProperties(0).apply {
+                            toolType = android.view.MotionEvent.TOOL_TYPE_STYLUS
+                        }
+                    ),
+                    arrayOf(
+                        PointerCoords(xUp, yUp).apply {
+                            pressure = 0.2947497f
+                            size = 0.0f
+                        }
+                    ),
+                    0,
+                    0,
+                    1.000625f,
+                    1.0003906f,
+                    7,
+                    0x0, // Edge Flags value of 0.
+                    0x5002, // Source of the event value of 20482
+                    0x2 // Motion Event Flags value of 2
+                )
 
             benchmarkRule.measureRepeatedOnUiThread {
                 rootView.dispatchTouchEvent(stylusDownMotionEvent)
@@ -211,47 +208,43 @@
 
         @Composable
         override fun Content() {
-            with(LocalDensity.current) {
-                itemHeightDp = ItemHeightPx.toDp()
-            }
+            with(LocalDensity.current) { itemHeightDp = ItemHeightPx.toDp() }
 
             EmailList(NumItems)
         }
 
         @Composable
         fun EmailList(count: Int) {
-            Column {
-                repeat(count) { i ->
-                    Email("$i")
-                }
-            }
+            Column { repeat(count) { i -> Email("$i") } }
         }
 
         @Composable
         fun Email(label: String) {
             BasicText(
                 text = label,
-                modifier = Modifier
-                    .pointerInput(label) {
-                        coroutineScope {
-                            awaitPointerEventScope {
-                                while (coroutineContext.isActive) {
-                                    val down = awaitFirstDown()
-                                    down.consume()
+                modifier =
+                    Modifier.pointerInput(label) {
+                            coroutineScope {
+                                awaitPointerEventScope {
+                                    while (coroutineContext.isActive) {
+                                        val down = awaitFirstDown()
+                                        down.consume()
 
-                                    val upOrCancel: PointerInputChange? = waitForUpOrCancellation()
-                                    upOrCancel?.consume()
-                                    assertThat(label).isEqualTo(expectedLabel)
-                                    actualClickCount++
+                                        val upOrCancel: PointerInputChange? =
+                                            waitForUpOrCancellation()
+                                        upOrCancel?.consume()
+                                        assertThat(label).isEqualTo(expectedLabel)
+                                        actualClickCount++
+                                    }
                                 }
                             }
                         }
-                    }
-                    .fillMaxWidth()
-                    .requiredHeight(itemHeightDp)
+                        .fillMaxWidth()
+                        .requiredHeight(itemHeightDp)
             )
         }
     }
+
     companion object {
         private const val MOVE_AMOUNT_PX = 30f
     }
diff --git a/compose/ui/ui/benchmark/src/androidTest/java/androidx/compose/ui/benchmark/input/pointer/ComposeTapIntegrationBenchmark.kt b/compose/ui/ui/benchmark/src/androidTest/java/androidx/compose/ui/benchmark/input/pointer/ComposeTapIntegrationBenchmark.kt
index 723a23d..488430d 100644
--- a/compose/ui/ui/benchmark/src/androidTest/java/androidx/compose/ui/benchmark/input/pointer/ComposeTapIntegrationBenchmark.kt
+++ b/compose/ui/ui/benchmark/src/androidTest/java/androidx/compose/ui/benchmark/input/pointer/ComposeTapIntegrationBenchmark.kt
@@ -41,30 +41,24 @@
  * Benchmark for simply tapping on an item in Compose.
  *
  * The intent is to measure the speed of all parts necessary for a normal tap starting from
- * [MotionEvent]s getting dispatched to a particular view.  The test therefore includes hit
- * testing and dispatch.
+ * [MotionEvent]s getting dispatched to a particular view. The test therefore includes hit testing
+ * and dispatch.
  *
  * This is intended to be an equivalent counterpart to [AndroidTapIntegrationBenchmark].
  *
- * The hierarchy is set up to look like:
- * rootView
- *   -> Column
- *     -> Text (with click listener)
- *     -> Text (with click listener)
- *     -> Text (with click listener)
- *     -> ...
+ * The hierarchy is set up to look like: rootView -> Column -> Text (with click listener) -> Text
+ * (with click listener) -> Text (with click listener) -> ...
  *
- * MotionEvents are dispatched to rootView as ACTION_DOWN followed by ACTION_UP.  The validity of
- * the test is verified inside the click listener with com.google.common.truth.Truth.assertThat
- * and by counting the clicks in the click listener and later verifying that they count is
- * sufficiently high.
+ * MotionEvents are dispatched to rootView as ACTION_DOWN followed by ACTION_UP. The validity of the
+ * test is verified inside the click listener with com.google.common.truth.Truth.assertThat and by
+ * counting the clicks in the click listener and later verifying that they count is sufficiently
+ * high.
  */
 @LargeTest
 @RunWith(AndroidJUnit4::class)
 class ComposeTapIntegrationBenchmark {
 
-    @get:Rule
-    val benchmarkRule = ComposeBenchmarkRule()
+    @get:Rule val benchmarkRule = ComposeBenchmarkRule()
 
     @Test
     fun clickOnLateItem() {
@@ -100,25 +94,27 @@
             }
 
             // Simple Events
-            val down = MotionEvent(
-                0,
-                android.view.MotionEvent.ACTION_DOWN,
-                1,
-                0,
-                arrayOf(PointerProperties(0)),
-                arrayOf(PointerCoords(0f, y)),
-                rootView
-            )
+            val down =
+                MotionEvent(
+                    0,
+                    android.view.MotionEvent.ACTION_DOWN,
+                    1,
+                    0,
+                    arrayOf(PointerProperties(0)),
+                    arrayOf(PointerCoords(0f, y)),
+                    rootView
+                )
 
-            val up = MotionEvent(
-                10,
-                android.view.MotionEvent.ACTION_UP,
-                1,
-                0,
-                arrayOf(PointerProperties(0)),
-                arrayOf(PointerCoords(0f, y)),
-                rootView
-            )
+            val up =
+                MotionEvent(
+                    10,
+                    android.view.MotionEvent.ACTION_UP,
+                    1,
+                    0,
+                    arrayOf(PointerProperties(0)),
+                    arrayOf(PointerCoords(0f, y)),
+                    rootView
+                )
 
             benchmarkRule.measureRepeatedOnUiThread {
                 rootView.dispatchTouchEvent(down)
@@ -137,35 +133,29 @@
 
         @Composable
         override fun Content() {
-            with(LocalDensity.current) {
-                itemHeightDp = ItemHeightPx.toDp()
-            }
+            with(LocalDensity.current) { itemHeightDp = ItemHeightPx.toDp() }
 
             EmailList(NumItems)
         }
 
         @Composable
         fun EmailList(count: Int) {
-            Column {
-                repeat(count) { i ->
-                    Email("$i")
-                }
-            }
+            Column { repeat(count) { i -> Email("$i") } }
         }
 
         @Composable
         fun Email(label: String) {
             BasicText(
                 text = label,
-                modifier = Modifier
-                    .pointerInput(label) {
-                        detectTapGestures {
-                            assertThat(label).isEqualTo(expectedLabel)
-                            actualClickCount++
+                modifier =
+                    Modifier.pointerInput(label) {
+                            detectTapGestures {
+                                assertThat(label).isEqualTo(expectedLabel)
+                                actualClickCount++
+                            }
                         }
-                    }
-                    .fillMaxWidth()
-                    .requiredHeight(itemHeightDp)
+                        .fillMaxWidth()
+                        .requiredHeight(itemHeightDp)
             )
         }
     }
diff --git a/compose/ui/ui/benchmark/src/androidTest/java/androidx/compose/ui/benchmark/input/pointer/VelocityTrackerBenchmark.kt b/compose/ui/ui/benchmark/src/androidTest/java/androidx/compose/ui/benchmark/input/pointer/VelocityTrackerBenchmark.kt
index 552adeb..d78ffcb 100644
--- a/compose/ui/ui/benchmark/src/androidTest/java/androidx/compose/ui/benchmark/input/pointer/VelocityTrackerBenchmark.kt
+++ b/compose/ui/ui/benchmark/src/androidTest/java/androidx/compose/ui/benchmark/input/pointer/VelocityTrackerBenchmark.kt
@@ -52,8 +52,7 @@
 @LargeTest
 @RunWith(AndroidJUnit4::class)
 class VelocityTrackerBenchmarkTest {
-    @get:Rule
-    val benchmarkRule = ComposeBenchmarkRule()
+    @get:Rule val benchmarkRule = ComposeBenchmarkRule()
 
     @Test
     fun addMovement_differential() {
@@ -96,9 +95,7 @@
             velocityTracker.addDataPoint(dataPoint.timeMillis, dataPoint.motionValue)
         }
 
-        benchmarkRule.measureRepeated {
-            assert(velocityTracker.calculateVelocity() != 0f)
-        }
+        benchmarkRule.measureRepeated { assert(velocityTracker.calculateVelocity() != 0f) }
     }
 
     companion object {
diff --git a/compose/ui/ui/benchmark/src/androidTest/java/androidx/compose/ui/benchmark/input/pointer/utils.kt b/compose/ui/ui/benchmark/src/androidTest/java/androidx/compose/ui/benchmark/input/pointer/utils.kt
index 1f955e2..190917e 100644
--- a/compose/ui/ui/benchmark/src/androidTest/java/androidx/compose/ui/benchmark/input/pointer/utils.kt
+++ b/compose/ui/ui/benchmark/src/androidTest/java/androidx/compose/ui/benchmark/input/pointer/utils.kt
@@ -24,8 +24,8 @@
  * Creates a simple [MotionEvent].
  *
  * @param dispatchTarget The [View] that the [MotionEvent] is going to be dispatched to. This
- * guarantees that the MotionEvent is created correctly for both Compose (which relies on raw
- * coordinates being correct) and Android (which requires that local coordinates are correct).
+ *   guarantees that the MotionEvent is created correctly for both Compose (which relies on raw
+ *   coordinates being correct) and Android (which requires that local coordinates are correct).
  */
 internal fun MotionEvent(
     eventTime: Int,
@@ -48,24 +48,26 @@
         it.y += locationOnScreen[1]
     }
 
-    val motionEvent = MotionEvent.obtain(
-        0,
-        eventTime.toLong(),
-        action + (actionIndex shl MotionEvent.ACTION_POINTER_INDEX_SHIFT),
-        numPointers,
-        pointerProperties,
-        pointerCoords,
-        0,
-        0,
-        0f,
-        0f,
-        0,
-        0,
-        SOURCE_TOUCHSCREEN, // Required for offsetLocation() to work correctly
-        0
-    ).apply {
-        offsetLocation(-locationOnScreen[0].toFloat(), -locationOnScreen[1].toFloat())
-    }
+    val motionEvent =
+        MotionEvent.obtain(
+                0,
+                eventTime.toLong(),
+                action + (actionIndex shl MotionEvent.ACTION_POINTER_INDEX_SHIFT),
+                numPointers,
+                pointerProperties,
+                pointerCoords,
+                0,
+                0,
+                0f,
+                0f,
+                0,
+                0,
+                SOURCE_TOUCHSCREEN, // Required for offsetLocation() to work correctly
+                0
+            )
+            .apply {
+                offsetLocation(-locationOnScreen[0].toFloat(), -locationOnScreen[1].toFloat())
+            }
 
     pointerCoords.forEach {
         it.x -= locationOnScreen[0]
@@ -76,8 +78,7 @@
 }
 
 @Suppress("RemoveRedundantQualifierName")
-internal fun PointerProperties(id: Int) =
-    MotionEvent.PointerProperties().apply { this.id = id }
+internal fun PointerProperties(id: Int) = MotionEvent.PointerProperties().apply { this.id = id }
 
 @Suppress("RemoveRedundantQualifierName")
 internal fun PointerCoords(x: Float, y: Float) =
diff --git a/compose/ui/ui/integration-tests/ui-demos/src/main/java/androidx/compose/ui/demos/ClipboardDemo.kt b/compose/ui/ui/integration-tests/ui-demos/src/main/java/androidx/compose/ui/demos/ClipboardDemo.kt
index c9c5f1e..c2d95a2 100644
--- a/compose/ui/ui/integration-tests/ui-demos/src/main/java/androidx/compose/ui/demos/ClipboardDemo.kt
+++ b/compose/ui/ui/integration-tests/ui-demos/src/main/java/androidx/compose/ui/demos/ClipboardDemo.kt
@@ -67,19 +67,14 @@
     var selectedUri: Uri? by remember { mutableStateOf(null) }
     var pastedUri: Uri? by remember { mutableStateOf(null) }
 
-    val launcher = rememberLauncherForActivityResult(
-        ActivityResultContracts.PickVisualMedia()
-    ) { uri ->
-        if (uri != null) {
-            selectedUri = uri
+    val launcher =
+        rememberLauncherForActivityResult(ActivityResultContracts.PickVisualMedia()) { uri ->
+            if (uri != null) {
+                selectedUri = uri
+            }
         }
-    }
 
-    Box(
-        Modifier
-            .fillMaxSize()
-            .padding(16.dp)
-    ) {
+    Box(Modifier.fillMaxSize().padding(16.dp)) {
         Column {
             Text(
                 "First load an image from local files.\n" +
@@ -88,23 +83,26 @@
 
             if (selectedUri != null) {
                 UriImage(uri = selectedUri!!)
-                Button(onClick = {
-                    clipboardManager.setClip(
-                        ClipData
-                            .newUri(context.contentResolver, "Image", selectedUri!!)
-                            .toClipEntry()
-                    )
-                }) {
+                Button(
+                    onClick = {
+                        clipboardManager.setClip(
+                            ClipData.newUri(context.contentResolver, "Image", selectedUri!!)
+                                .toClipEntry()
+                        )
+                    }
+                ) {
                     Text("Copy")
                 }
             } else {
                 ImagePlaceholder()
             }
-            Button(onClick = {
-                launcher.launch(
-                    PickVisualMediaRequest(ActivityResultContracts.PickVisualMedia.ImageOnly)
-                )
-            }) {
+            Button(
+                onClick = {
+                    launcher.launch(
+                        PickVisualMediaRequest(ActivityResultContracts.PickVisualMedia.ImageOnly)
+                    )
+                }
+            ) {
                 Text("Load")
             }
 
@@ -116,24 +114,29 @@
 
             Text("Or paste an image if one is available in the clipboard.")
 
-            Button(onClick = {
-                if (clipboardManager.hasImage()) {
-                    pastedUri = clipboardManager.getClip()?.firstUriOrNull()
-                } else {
-                    Toast.makeText(
-                        context,
-                        "There are no images in the clipboard",
-                        Toast.LENGTH_SHORT
-                    ).show()
+            Button(
+                onClick = {
+                    if (clipboardManager.hasImage()) {
+                        pastedUri = clipboardManager.getClip()?.firstUriOrNull()
+                    } else {
+                        Toast.makeText(
+                                context,
+                                "There are no images in the clipboard",
+                                Toast.LENGTH_SHORT
+                            )
+                            .show()
+                    }
                 }
-            }) {
+            ) {
                 Text("Paste")
             }
 
-            Button(onClick = {
-                selectedUri = null
-                pastedUri = null
-            }) {
+            Button(
+                onClick = {
+                    selectedUri = null
+                    pastedUri = null
+                }
+            ) {
                 Text("Clear")
             }
         }
@@ -141,45 +144,38 @@
 }
 
 @Composable
-fun UriImage(
-    uri: Uri,
-    modifier: Modifier = Modifier
-) {
+fun UriImage(uri: Uri, modifier: Modifier = Modifier) {
     val context = LocalContext.current
-    val imageBitmap by produceState<ImageBitmap?>(null, uri) {
-        withContext(Dispatchers.IO) {
-            value = uri.readImageBitmap(context)
+    val imageBitmap by
+        produceState<ImageBitmap?>(null, uri) {
+            withContext(Dispatchers.IO) { value = uri.readImageBitmap(context) }
         }
-    }
 
     imageBitmap?.let {
-        Image(
-            bitmap = it,
-            contentDescription = "image from file",
-            modifier = modifier
-        )
+        Image(bitmap = it, contentDescription = "image from file", modifier = modifier)
     }
 }
 
 @Composable
 fun ImagePlaceholder() {
-    Box(modifier = Modifier
-        .size(200.dp)
-        .drawBehind {
-            drawRect(Color.Blue, alpha = 0.4f, style = Stroke(width = 1.dp.toPx()))
-            drawLine(
-                Color.Blue,
-                alpha = 0.4f,
-                start = Offset.Zero,
-                end = Offset(size.width, size.height)
-            )
-            drawLine(
-                Color.Blue,
-                alpha = 0.4f,
-                start = Offset(size.width, 0f),
-                end = Offset(0f, size.height)
-            )
-        }) {
+    Box(
+        modifier =
+            Modifier.size(200.dp).drawBehind {
+                drawRect(Color.Blue, alpha = 0.4f, style = Stroke(width = 1.dp.toPx()))
+                drawLine(
+                    Color.Blue,
+                    alpha = 0.4f,
+                    start = Offset.Zero,
+                    end = Offset(size.width, size.height)
+                )
+                drawLine(
+                    Color.Blue,
+                    alpha = 0.4f,
+                    start = Offset(size.width, 0f),
+                    end = Offset(0f, size.height)
+                )
+            }
+    ) {
         Text("No Image", Modifier.align(Alignment.Center))
     }
 }
@@ -193,8 +189,9 @@
 @Suppress("ClassVerificationFailure", "DEPRECATION")
 fun Uri.readImageBitmap(context: Context): ImageBitmap {
     return if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {
-        ImageDecoder.decodeBitmap(ImageDecoder.createSource(context.contentResolver, this))
-    } else {
-        MediaStore.Images.Media.getBitmap(context.contentResolver, this)
-    }.asImageBitmap()
+            ImageDecoder.decodeBitmap(ImageDecoder.createSource(context.contentResolver, this))
+        } else {
+            MediaStore.Images.Media.getBitmap(context.contentResolver, this)
+        }
+        .asImageBitmap()
 }
diff --git a/compose/ui/ui/integration-tests/ui-demos/src/main/java/androidx/compose/ui/demos/DeclarativeGraphicsDemo.kt b/compose/ui/ui/integration-tests/ui-demos/src/main/java/androidx/compose/ui/demos/DeclarativeGraphicsDemo.kt
index 91cff21..3cd1d78 100644
--- a/compose/ui/ui/integration-tests/ui-demos/src/main/java/androidx/compose/ui/demos/DeclarativeGraphicsDemo.kt
+++ b/compose/ui/ui/integration-tests/ui-demos/src/main/java/androidx/compose/ui/demos/DeclarativeGraphicsDemo.kt
@@ -33,95 +33,64 @@
 @Composable
 fun DeclarativeGraphicsDemo() {
     /**
-     * Demo that shows how to leverage DrawScope to draw 4 rectangular quadrants
-     * inset by a given dimension with a diamond drawn within each of the quadrants
+     * Demo that shows how to leverage DrawScope to draw 4 rectangular quadrants inset by a given
+     * dimension with a diamond drawn within each of the quadrants
      */
     Canvas(
-        modifier =
-            Modifier.fillMaxSize()
-                .wrapContentSize(Alignment.Center)
-                .size(120.dp, 120.dp)
+        modifier = Modifier.fillMaxSize().wrapContentSize(Alignment.Center).size(120.dp, 120.dp)
     ) {
         drawRect(color = Color.Gray)
         // Inset content by 10 pixels on the left/right sides and 12 by the
         // top/bottom
         inset(10.0f, 12.0f) {
             val quadrantSize = size / 2.0f
-            drawRect(
-                size = quadrantSize,
-                color = Color.Red
-            )
+            drawRect(size = quadrantSize, color = Color.Red)
             // Scale the drawing environment down by 50% about the center of the square drawn
             // in the top left quadrant
             scale(0.5f, Offset(size.width / 4, size.height / 4)) {
                 // Rotate the drawing environment 45 degrees about the center of the square
                 // drawn in the top left
                 rotate(45.0f, Offset(size.width / 4, size.height / 4)) {
-                    drawRect(
-                        size = quadrantSize,
-                        color = Color.Yellow,
-                        alpha = 0.75f
-                    )
+                    drawRect(size = quadrantSize, color = Color.Yellow, alpha = 0.75f)
                 }
             }
             // Translate the drawing environment to the right by half the size of the current
             // width
             translate(size.width / 2, 0.0f) {
-                drawRect(
-                    size = quadrantSize,
-                    color = Color.Yellow
-                )
+                drawRect(size = quadrantSize, color = Color.Yellow)
                 // Scale the drawing environment down by 50% about the center of the square drawn
                 // in the top right quadrant
                 scale(0.5f, Offset(size.width / 4, size.height / 4)) {
                     // rotate the drawing environment 45 degrees about the center of the drawn
                     // square in the top right
                     rotate(45.0f, Offset(size.width / 4, size.height / 4)) {
-                        drawRect(
-                            size = quadrantSize,
-                            color = Color.Red,
-                            alpha = 0.75f
-                        )
+                        drawRect(size = quadrantSize, color = Color.Red, alpha = 0.75f)
                     }
                 }
             }
             // Translate the drawing environment down by half the size of the current height
             translate(0.0f, size.height / 2) {
-                drawRect(
-                    size = quadrantSize,
-                    color = Color.Green
-                )
+                drawRect(size = quadrantSize, color = Color.Green)
                 // Scale the drawing environment down by 50% about the center of the square drawn
                 // in the bottom left quadrant
                 scale(0.5f, Offset(size.width / 4, size.height / 4)) {
                     // Rotate the drawing environment by 45 degrees about the center of the
                     // square drawn in the bottom left quadrant
                     rotate(45.0f, Offset(size.width / 4, size.height / 4)) {
-                        drawRect(
-                            size = quadrantSize,
-                            color = Color.Blue,
-                            alpha = 0.75f
-                        )
+                        drawRect(size = quadrantSize, color = Color.Blue, alpha = 0.75f)
                     }
                 }
             }
             // Translate the drawing environment to the bottom right quadrant of the inset bounds
             translate(size.width / 2, size.height / 2) {
-                drawRect(
-                    size = quadrantSize,
-                    color = Color.Blue
-                )
+                drawRect(size = quadrantSize, color = Color.Blue)
                 // Scale the drawing environment down by 50% about the center of the square drawn
                 // in the bottom right quadrant
                 scale(0.5f, Offset(size.width / 4, size.height / 4)) {
                     // Rotate the drawing environment 45 degrees about the center of the drawn
                     // square in the bottom right
                     rotate(45.0f, Offset(size.width / 4, size.height / 4)) {
-                        drawRect(
-                            size = quadrantSize,
-                            color = Color.Green,
-                            alpha = 0.75f
-                        )
+                        drawRect(size = quadrantSize, color = Color.Green, alpha = 0.75f)
                     }
                 }
             }
diff --git a/compose/ui/ui/integration-tests/ui-demos/src/main/java/androidx/compose/ui/demos/DialogDemo.kt b/compose/ui/ui/integration-tests/ui-demos/src/main/java/androidx/compose/ui/demos/DialogDemo.kt
index c3878af..ab50bc6 100644
--- a/compose/ui/ui/integration-tests/ui-demos/src/main/java/androidx/compose/ui/demos/DialogDemo.kt
+++ b/compose/ui/ui/integration-tests/ui-demos/src/main/java/androidx/compose/ui/demos/DialogDemo.kt
@@ -51,16 +51,24 @@
     var expandedHeight by remember { mutableStateOf(expandedHeightInit) }
     var usePlatformDefaultWidth by remember { mutableStateOf(usePlatformDefaultWidthInit) }
 
-    TextButton(onClick = { openDialog = !openDialog }) {
-        Text("Tap anywhere to reopen dialog")
-    }
+    TextButton(onClick = { openDialog = !openDialog }) { Text("Tap anywhere to reopen dialog") }
     if (openDialog) {
         Dialog(
             onDismissRequest = { openDialog = false },
             properties = DialogProperties(usePlatformDefaultWidth = usePlatformDefaultWidth)
         ) {
-            val width = if (expandedWidth) { 1500.dp } else { 300.dp }
-            val height = if (expandedHeight) { 600.dp } else { 400.dp }
+            val width =
+                if (expandedWidth) {
+                    1500.dp
+                } else {
+                    300.dp
+                }
+            val height =
+                if (expandedHeight) {
+                    600.dp
+                } else {
+                    400.dp
+                }
             Card(
                 modifier = Modifier.size(width, height).padding(10.dp),
                 elevation = elevation,
@@ -73,11 +81,12 @@
                     Text("Dialog")
                     TextButton(
                         onClick = {
-                            shape = if (shape == roundedRectangleShape) {
-                                RectangleShape
-                            } else {
-                                roundedRectangleShape
-                            }
+                            shape =
+                                if (shape == roundedRectangleShape) {
+                                    RectangleShape
+                                } else {
+                                    roundedRectangleShape
+                                }
                         }
                     ) {
                         Text("Toggle corners")
@@ -107,13 +116,9 @@
                         Text("Toggle widthlock")
                     }
                     Row(verticalAlignment = Alignment.CenterVertically) {
-                        TextButton(onClick = { elevation -= 1.dp }) {
-                            Text("-1")
-                        }
+                        TextButton(onClick = { elevation -= 1.dp }) { Text("-1") }
                         Text("Elevation: $elevation")
-                        TextButton(onClick = { elevation += 1.dp }) {
-                            Text("+1")
-                        }
+                        TextButton(onClick = { elevation += 1.dp }) { Text("+1") }
                     }
                     Text("Current size: [$width, $height]")
                     Text("usePlatformDefaultWidth = $usePlatformDefaultWidth")
diff --git a/compose/ui/ui/integration-tests/ui-demos/src/main/java/androidx/compose/ui/demos/MultipleCollect.kt b/compose/ui/ui/integration-tests/ui-demos/src/main/java/androidx/compose/ui/demos/MultipleCollect.kt
index a6a1c30..3b6ec91 100644
--- a/compose/ui/ui/integration-tests/ui-demos/src/main/java/androidx/compose/ui/demos/MultipleCollect.kt
+++ b/compose/ui/ui/integration-tests/ui-demos/src/main/java/androidx/compose/ui/demos/MultipleCollect.kt
@@ -39,21 +39,24 @@
         Box(Modifier.layoutId("footer")) { footer() }
         content()
     }) { measurables, constraints ->
-        val headerPlaceable = measurables.first { it.layoutId == "header" }.measure(
-            Constraints.fixed(constraints.maxWidth, 100)
-        )
+        val headerPlaceable =
+            measurables
+                .first { it.layoutId == "header" }
+                .measure(Constraints.fixed(constraints.maxWidth, 100))
         val footerPadding = 50
-        val footerPlaceable = measurables.first { it.layoutId == "footer" }.measure(
-            Constraints.fixed(constraints.maxWidth - footerPadding * 2, 100)
-        )
+        val footerPlaceable =
+            measurables
+                .first { it.layoutId == "footer" }
+                .measure(Constraints.fixed(constraints.maxWidth - footerPadding * 2, 100))
 
         val contentMeasurables = measurables.filter { it.layoutId == null }
         val itemHeight =
             (constraints.maxHeight - headerPlaceable.height - footerPlaceable.height) /
                 contentMeasurables.size
-        val contentPlaceables = contentMeasurables.map { measurable ->
-            measurable.measure(Constraints.fixed(constraints.maxWidth, itemHeight))
-        }
+        val contentPlaceables =
+            contentMeasurables.map { measurable ->
+                measurable.measure(Constraints.fixed(constraints.maxWidth, itemHeight))
+            }
 
         layout(constraints.maxWidth, constraints.maxHeight) {
             headerPlaceable.placeRelative(0, 0)
@@ -72,12 +75,10 @@
 
 @Composable
 fun MultipleCollectTest() {
-    val header = @Composable {
-        Box(Modifier.fillMaxSize().background(Color(android.graphics.Color.GRAY)))
-    }
-    val footer = @Composable {
-        Box(Modifier.fillMaxSize().background(Color(android.graphics.Color.BLUE)))
-    }
+    val header =
+        @Composable { Box(Modifier.fillMaxSize().background(Color(android.graphics.Color.GRAY))) }
+    val footer =
+        @Composable { Box(Modifier.fillMaxSize().background(Color(android.graphics.Color.BLUE))) }
     HeaderFooterLayout(header = header, footer = footer) {
         Box(Modifier.fillMaxSize().background(Color(android.graphics.Color.GREEN)))
         Box(Modifier.fillMaxSize().background(Color(android.graphics.Color.YELLOW)))
diff --git a/compose/ui/ui/integration-tests/ui-demos/src/main/java/androidx/compose/ui/demos/PainterResourcesDemo.kt b/compose/ui/ui/integration-tests/ui-demos/src/main/java/androidx/compose/ui/demos/PainterResourcesDemo.kt
index da40196..d27459a 100644
--- a/compose/ui/ui/integration-tests/ui-demos/src/main/java/androidx/compose/ui/demos/PainterResourcesDemo.kt
+++ b/compose/ui/ui/integration-tests/ui-demos/src/main/java/androidx/compose/ui/demos/PainterResourcesDemo.kt
@@ -39,9 +39,7 @@
             )
         )
 
-        composeView.setContent {
-            PainterResourcesDemo()
-        }
+        composeView.setContent { PainterResourcesDemo() }
     }
 }
 
diff --git a/compose/ui/ui/integration-tests/ui-demos/src/main/java/androidx/compose/ui/demos/PopupDemo.kt b/compose/ui/ui/integration-tests/ui-demos/src/main/java/androidx/compose/ui/demos/PopupDemo.kt
index b5cc1be..9c540e6 100644
--- a/compose/ui/ui/integration-tests/ui-demos/src/main/java/androidx/compose/ui/demos/PopupDemo.kt
+++ b/compose/ui/ui/integration-tests/ui-demos/src/main/java/androidx/compose/ui/demos/PopupDemo.kt
@@ -81,46 +81,40 @@
                 padding = 20.dp
             )
 
-            Box(
-                modifier = Modifier.weight(1f),
-                contentAlignment = Alignment.Center
-            ) {
-                val description: String = {
-                    when (exampleIndex) {
-                        0 -> "Shadow demo"
-                        1 -> "Toggle a simple popup"
-                        2 -> "Different content for the popup"
-                        3 -> "Popup's behavior when the parent's size or position changes"
-                        4 -> "Aligning the popup below the parent"
-                        5 -> "Aligning the popup inside a parent"
-                        6 ->
-                            "Insert an email in the popup and then click outside to dismiss"
-                        7 ->
-                            "[bug] Undesired visual effect caused by" +
-                                " having a new size content displayed at the old" +
-                                " position, until the new one is calculated"
-                        8 ->
-                            "The popup is aligning to its parent when the parent is" +
-                                " inside a Scroller"
-                        9 ->
-                            "[bug] The popup is not repositioned " +
-                                "when the parent is moved by the keyboard"
-                        else -> "Demo description here"
-                    }
-                }.invoke()
+            Box(modifier = Modifier.weight(1f), contentAlignment = Alignment.Center) {
+                val description: String =
+                    {
+                            when (exampleIndex) {
+                                0 -> "Shadow demo"
+                                1 -> "Toggle a simple popup"
+                                2 -> "Different content for the popup"
+                                3 -> "Popup's behavior when the parent's size or position changes"
+                                4 -> "Aligning the popup below the parent"
+                                5 -> "Aligning the popup inside a parent"
+                                6 ->
+                                    "Insert an email in the popup and then click outside to dismiss"
+                                7 ->
+                                    "[bug] Undesired visual effect caused by" +
+                                        " having a new size content displayed at the old" +
+                                        " position, until the new one is calculated"
+                                8 ->
+                                    "The popup is aligning to its parent when the parent is" +
+                                        " inside a Scroller"
+                                9 ->
+                                    "[bug] The popup is not repositioned " +
+                                        "when the parent is moved by the keyboard"
+                                else -> "Demo description here"
+                            }
+                        }
+                        .invoke()
 
-                Text(
-                    text = description,
-                    textAlign = TextAlign.Center
-                )
+                Text(text = description, textAlign = TextAlign.Center)
             }
 
             ClickableTextWithBackground(
                 text = "Next",
                 color = Color.Cyan,
-                onClick = {
-                    exampleIndex = (exampleIndex + 1) % totalExamples
-                },
+                onClick = { exampleIndex = (exampleIndex + 1) % totalExamples },
                 padding = 20.dp
             )
         }
@@ -150,15 +144,8 @@
     // This example utilizes the Card to draw its shadow.
     Column(Modifier.align(Alignment.CenterHorizontally)) {
         Box(Modifier.size(110.dp).background(background)) {
-            Popup(
-                alignment = Alignment.Center,
-                onDismissRequest = { dismissCounter++ }
-            ) {
-                Card(
-                    Modifier.size(contentSize),
-                    elevation = elevation,
-                    shape = shape
-                ) {
+            Popup(alignment = Alignment.Center, onDismissRequest = { dismissCounter++ }) {
+                Card(Modifier.size(contentSize), elevation = elevation, shape = shape) {
                     Text(text = "This is popup!", textAlign = TextAlign.Center)
                 }
             }
@@ -168,13 +155,9 @@
         Text("Dismiss clicked: $dismissCounter")
         Spacer(Modifier.requiredHeight(20.dp))
         Row {
-            Button(onClick = { elevation -= 1.dp }) {
-                Text("-1")
-            }
+            Button(onClick = { elevation -= 1.dp }) { Text("-1") }
             Text("Elevation: $elevation")
-            Button(onClick = { elevation += 1.dp }) {
-                Text("+1")
-            }
+            Button(onClick = { elevation += 1.dp }) { Text("+1") }
         }
         Spacer(Modifier.requiredHeight(10.dp))
         Button(onClick = { shape = if (shape == CircleShape) RectangleShape else CircleShape }) {
@@ -192,13 +175,9 @@
         }
         Spacer(Modifier.requiredHeight(10.dp))
         Row {
-            Button(onClick = { contentSize -= 10.dp }) {
-                Text("-10.dp")
-            }
+            Button(onClick = { contentSize -= 10.dp }) { Text("-10.dp") }
             Text("Size: $contentSize")
-            Button(onClick = { contentSize += 10.dp }) {
-                Text("+10.dp")
-            }
+            Button(onClick = { contentSize += 10.dp }) { Text("+10.dp") }
         }
     }
 }
@@ -215,10 +194,7 @@
                         Modifier.size(70.dp).background(Color.Green, CircleShape),
                         contentAlignment = Alignment.Center
                     ) {
-                        Text(
-                            text = "This is a popup!",
-                            textAlign = TextAlign.Center
-                        )
+                        Text(text = "This is a popup!", textAlign = TextAlign.Center)
                     }
                 }
             }
@@ -227,9 +203,7 @@
         ClickableTextWithBackground(
             text = "Toggle Popup",
             color = Color.Cyan,
-            onClick = {
-                showPopup.value = !showPopup.value
-            }
+            onClick = { showPopup.value = !showPopup.value }
         )
     }
 }
@@ -246,16 +220,13 @@
         Box(Modifier.size(widthSize, heightSize).background(Color.Gray)) {
             Popup(Alignment.Center) {
                 when (popupContentState % totalContentExamples) {
-                    0 -> ClickableTextWithBackground(
-                        text = "Counter : $popupCounter",
-                        color = Color.Green,
-                        onClick = {
-                            popupCounter += 1
-                        }
-                    )
-                    1 -> Box(
-                        Modifier.size(60.dp, 40.dp).background(Color.Blue, CircleShape)
-                    )
+                    0 ->
+                        ClickableTextWithBackground(
+                            text = "Counter : $popupCounter",
+                            color = Color.Green,
+                            onClick = { popupCounter += 1 }
+                        )
+                    1 -> Box(Modifier.size(60.dp, 40.dp).background(Color.Blue, CircleShape))
                 }
             }
         }
@@ -264,9 +235,7 @@
         ClickableTextWithBackground(
             text = "Change content",
             color = Color.Cyan,
-            onClick = {
-                popupContentState++
-            }
+            onClick = { popupContentState++ }
         )
     }
 }
@@ -285,10 +254,7 @@
             Modifier.size(containerWidth, containerHeight),
             contentAlignment = parentAlignment.value
         ) {
-            Box(
-                Modifier.size(parentWidth.value, parentHeight.value)
-                    .background(Color.Blue)
-            ) {
+            Box(Modifier.size(parentWidth.value, parentHeight.value).background(Color.Blue)) {
                 Popup(Alignment.BottomCenter) {
                     Text("Popup", modifier = Modifier.background(color = Color.Green))
                 }
@@ -300,10 +266,8 @@
             color = Color.Cyan,
             onClick = {
                 parentAlignment.value =
-                    if (parentAlignment.value == Alignment.TopStart)
-                        Alignment.TopEnd
-                    else
-                        Alignment.TopStart
+                    if (parentAlignment.value == Alignment.TopStart) Alignment.TopEnd
+                    else Alignment.TopStart
             }
         )
         Spacer(Modifier.height(10.dp))
@@ -359,8 +323,7 @@
 
         Spacer(Modifier.height(10.dp))
         Text(
-            modifier = Modifier.align(Alignment.CenterHorizontally)
-                .background(color = Color.White),
+            modifier = Modifier.align(Alignment.CenterHorizontally).background(color = Color.White),
             text = "Alignment : " + popupAlignment.value.toString()
         )
     }
@@ -381,9 +344,10 @@
         Text(text = showEmail.value)
 
         Box(
-            modifier = Modifier.size(widthSize, heightSize)
-                .align(Alignment.CenterHorizontally)
-                .background(Color.Red)
+            modifier =
+                Modifier.size(widthSize, heightSize)
+                    .align(Alignment.CenterHorizontally)
+                    .background(Color.Red)
         ) {
             if (showPopup.value) {
                 Popup(
@@ -398,9 +362,7 @@
                         modifier = Modifier.width(editLineSize),
                         initialText = "",
                         color = Color.White,
-                        onValueChange = {
-                            email.value = it
-                        }
+                        onValueChange = { email.value = it }
                     )
                 }
             }
@@ -417,17 +379,16 @@
         var rectangleState by remember { mutableIntStateOf(0) }
 
         Spacer(Modifier.height(15.dp))
-        Box(
-            modifier = Modifier.size(widthSize, heightSize).background(Color.Magenta)
-        ) {
+        Box(modifier = Modifier.size(widthSize, heightSize).background(Color.Magenta)) {
             if (showPopup.value) {
                 Popup(Alignment.Center) {
-                    val size = when (rectangleState % 4) {
-                        0 -> Modifier.size(30.dp)
-                        1 -> Modifier.size(100.dp)
-                        2 -> Modifier.size(30.dp, 90.dp)
-                        else -> Modifier.size(90.dp, 30.dp)
-                    }
+                    val size =
+                        when (rectangleState % 4) {
+                            0 -> Modifier.size(30.dp)
+                            1 -> Modifier.size(100.dp)
+                            2 -> Modifier.size(30.dp, 90.dp)
+                            else -> Modifier.size(90.dp, 30.dp)
+                        }
                     Box(modifier = size.background(Color.Gray))
                 }
             }
@@ -436,9 +397,7 @@
         ClickableTextWithBackground(
             text = "Change size",
             color = Color.Cyan,
-            onClick = {
-                rectangleState++
-            }
+            onClick = { rectangleState++ }
         )
     }
 }
@@ -451,9 +410,7 @@
             .verticalScroll(rememberScrollState())
     ) {
         Column(Modifier.fillMaxHeight()) {
-            Box(
-                modifier = Modifier.size(80.dp, 160.dp).background(Color(0xFF00FF00))
-            ) {
+            Box(modifier = Modifier.size(80.dp, 160.dp).background(Color(0xFF00FF00))) {
                 Popup(alignment = Alignment.Center) {
                     ClickableTextWithBackground(text = "Centered", color = Color.Cyan)
                 }
@@ -475,15 +432,12 @@
         Spacer(Modifier.height(350.dp))
         Text("Start typing in the EditText below the parent(Red rectangle)")
         Box(
-            modifier = Modifier.size(widthSize, heightSize)
-                .align(Alignment.CenterHorizontally)
-                .background(Color.Red)
+            modifier =
+                Modifier.size(widthSize, heightSize)
+                    .align(Alignment.CenterHorizontally)
+                    .background(Color.Red)
         ) {
-            Popup(Alignment.Center) {
-                Box(Modifier.background(Color.Green)) {
-                    Text("Popup")
-                }
-            }
+            Popup(Alignment.Center) { Box(Modifier.background(Color.Green)) { Text("Popup") } }
         }
 
         EditLine(initialText = "Continue typing...", color = Color.Gray)
@@ -500,8 +454,7 @@
     padding: Dp = 0.dp
 ) {
     Box(
-        Modifier
-            .clickable(onClick = onClick ?: {}, enabled = onClick != null)
+        Modifier.clickable(onClick = onClick ?: {}, enabled = onClick != null)
             .background(color)
             .padding(padding)
     ) {
@@ -523,10 +476,7 @@
     BasicTextField(
         value = state.value,
         modifier = modifier.background(color = color),
-        keyboardOptions = KeyboardOptions(
-            keyboardType = keyboardType,
-            imeAction = imeAction
-        ),
+        keyboardOptions = KeyboardOptions(keyboardType = keyboardType, imeAction = imeAction),
         onValueChange = {
             state.value = it
             onValueChange(it)
diff --git a/compose/ui/ui/integration-tests/ui-demos/src/main/java/androidx/compose/ui/demos/ScreenCoordinatesDemo.kt b/compose/ui/ui/integration-tests/ui-demos/src/main/java/androidx/compose/ui/demos/ScreenCoordinatesDemo.kt
index d34b9c6..66186a8 100644
--- a/compose/ui/ui/integration-tests/ui-demos/src/main/java/androidx/compose/ui/demos/ScreenCoordinatesDemo.kt
+++ b/compose/ui/ui/integration-tests/ui-demos/src/main/java/androidx/compose/ui/demos/ScreenCoordinatesDemo.kt
@@ -81,13 +81,10 @@
 
         var coords: LayoutCoordinates? by remember { mutableStateOf(null, neverEqualPolicy()) }
 
-        Canvas(modifier = Modifier
-            .fillMaxSize()
-            .onGloballyPositioned { coords = it }
-        ) {
+        Canvas(modifier = Modifier.fillMaxSize().onGloballyPositioned { coords = it }) {
             if (lastPointerPositionInScreen.isUnspecified) return@Canvas
-            val lastPointerPositionInLocal = coords?.screenToLocal(lastPointerPositionInScreen)
-                ?: return@Canvas
+            val lastPointerPositionInLocal =
+                coords?.screenToLocal(lastPointerPositionInScreen) ?: return@Canvas
             if (pointerDown) {
                 drawLine(
                     Color.Black,
@@ -106,22 +103,23 @@
     var popupOffset by remember { mutableStateOf(IntOffset(100, 100)) }
     // TODO(b/292257547) Workaround for popup not updating offset when state read from
     //  calculatePosition changes. Remove when fixed.
-    @Suppress("UNUSED_EXPRESSION")
-    popupOffset
+    @Suppress("UNUSED_EXPRESSION") popupOffset
     Popup(
-        popupPositionProvider = object : PopupPositionProvider {
-            override fun calculatePosition(
-                anchorBounds: IntRect,
-                windowSize: IntSize,
-                layoutDirection: LayoutDirection,
-                popupContentSize: IntSize
-            ): IntOffset = popupOffset
-        },
-        properties = PopupProperties(
-            focusable = true,
-            clippingEnabled = false,
-            dismissOnClickOutside = false,
-        ),
+        popupPositionProvider =
+            object : PopupPositionProvider {
+                override fun calculatePosition(
+                    anchorBounds: IntRect,
+                    windowSize: IntSize,
+                    layoutDirection: LayoutDirection,
+                    popupContentSize: IntSize
+                ): IntOffset = popupOffset
+            },
+        properties =
+            PopupProperties(
+                focusable = true,
+                clippingEnabled = false,
+                dismissOnClickOutside = false,
+            ),
         onDismissRequest = navigateBack
     ) {
         var windowCoords: LayoutCoordinates? by remember {
@@ -132,39 +130,39 @@
         }
         Box(
             contentAlignment = Alignment.BottomCenter,
-            modifier = Modifier
-                .onGloballyPositioned { windowCoords = it }
-                .fitSquare(fraction = 0.9f)
-                .border(2.dp, Color.Red.copy(alpha = 0.5f))
-                // Ensure the gesture area is actually offset from the window.
-                .padding(16.dp)
-                .background(Color.Magenta.copy(alpha = 0.1f))
-                .onGloballyPositioned { gestureAreaCoords = it }
-                .pointerInput(Unit) {
-                    detectDragGestures(
-                        onDragStart = { positionInLocal ->
-                            pointerDown = true
-                            lastPointerPositionInScreen =
-                                windowCoords?.localToScreen(positionInLocal)
-                                    ?: Offset.Unspecified
-                        },
-                        onDrag = { change, delta ->
-                            val positionInLocal = change.position
-                            lastPointerPositionInScreen =
-                                if (useMatrixToConvertToScreenCoordinates) {
-                                    val matrix = Matrix()
-                                    gestureAreaCoords?.transformToScreen(matrix)
-                                    matrix.map(positionInLocal)
-                                } else {
-                                    gestureAreaCoords?.localToScreen(positionInLocal)
+            modifier =
+                Modifier.onGloballyPositioned { windowCoords = it }
+                    .fitSquare(fraction = 0.9f)
+                    .border(2.dp, Color.Red.copy(alpha = 0.5f))
+                    // Ensure the gesture area is actually offset from the window.
+                    .padding(16.dp)
+                    .background(Color.Magenta.copy(alpha = 0.1f))
+                    .onGloballyPositioned { gestureAreaCoords = it }
+                    .pointerInput(Unit) {
+                        detectDragGestures(
+                            onDragStart = { positionInLocal ->
+                                pointerDown = true
+                                lastPointerPositionInScreen =
+                                    windowCoords?.localToScreen(positionInLocal)
                                         ?: Offset.Unspecified
-                                }
-                            popupOffset += delta.round()
-                        },
-                        onDragEnd = { pointerDown = false },
-                        onDragCancel = { pointerDown = false }
-                    )
-                }
+                            },
+                            onDrag = { change, delta ->
+                                val positionInLocal = change.position
+                                lastPointerPositionInScreen =
+                                    if (useMatrixToConvertToScreenCoordinates) {
+                                        val matrix = Matrix()
+                                        gestureAreaCoords?.transformToScreen(matrix)
+                                        matrix.map(positionInLocal)
+                                    } else {
+                                        gestureAreaCoords?.localToScreen(positionInLocal)
+                                            ?: Offset.Unspecified
+                                    }
+                                popupOffset += delta.round()
+                            },
+                            onDragEnd = { pointerDown = false },
+                            onDragCancel = { pointerDown = false }
+                        )
+                    }
         ) {
             Column(horizontalAlignment = Alignment.CenterHorizontally) {
                 Row(
@@ -189,17 +187,16 @@
                     style = MaterialTheme.typography.body2
                 )
                 TextField(value = "Tap to show keyboard", onValueChange = {})
-                Button(onClick = navigateBack) {
-                    Text("Close")
-                }
+                Button(onClick = navigateBack) { Text("Close") }
 
                 // Hack to get the window offset to update while keyboard is animating.
                 val imeOffset = WindowInsets.ime
                 LaunchedEffect(imeOffset) {
-                    snapshotFlow { imeOffset.getBottom(Density(1f)) }.collect {
-                        windowCoords = windowCoords
-                        gestureAreaCoords = gestureAreaCoords
-                    }
+                    snapshotFlow { imeOffset.getBottom(Density(1f)) }
+                        .collect {
+                            windowCoords = windowCoords
+                            gestureAreaCoords = gestureAreaCoords
+                        }
                 }
             }
         }
@@ -210,7 +207,5 @@
     val minConstraint = (minOf(constraints.maxWidth, constraints.maxHeight) * fraction).roundToInt()
     val childConstraints = Constraints.fixed(minConstraint, minConstraint)
     val placeable = measurable.measure(childConstraints)
-    layout(placeable.width, placeable.height) {
-        placeable.place(0, 0)
-    }
+    layout(placeable.width, placeable.height) { placeable.place(0, 0) }
 }
diff --git a/compose/ui/ui/integration-tests/ui-demos/src/main/java/androidx/compose/ui/demos/SimpleChatActivity.kt b/compose/ui/ui/integration-tests/ui-demos/src/main/java/androidx/compose/ui/demos/SimpleChatActivity.kt
index 2e10cef..10fcc64 100644
--- a/compose/ui/ui/integration-tests/ui-demos/src/main/java/androidx/compose/ui/demos/SimpleChatActivity.kt
+++ b/compose/ui/ui/integration-tests/ui-demos/src/main/java/androidx/compose/ui/demos/SimpleChatActivity.kt
@@ -107,11 +107,7 @@
         Box(modifier = Modifier.padding(contentPadding)) {
             // testTagsAsResourceId and testTag is for compose to map testTag to resource-id.
             // https://developer.android.com/jetpack/compose/testing#uiautomator-interop
-            SelectionContainer() {
-                Column {
-                    Conversation(messages, listState)
-                }
-            }
+            SelectionContainer() { Column { Conversation(messages, listState) } }
         }
     }
 }
@@ -119,9 +115,7 @@
 @Composable
 private fun Conversation(messages: List<Message>, state: LazyListState) {
     LazyColumn(
-        modifier = Modifier
-            .testTag("messages")
-            .fillMaxSize(),
+        modifier = Modifier.testTag("messages").fillMaxSize(),
         state = state,
         verticalArrangement = Arrangement.Bottom,
     ) {
@@ -139,9 +133,8 @@
             Text(
                 message.content,
                 fontSize = 20.sp,
-                modifier = Modifier.testTag(
-                    if (message.isReceived) "message_received" else "message_sent"
-                )
+                modifier =
+                    Modifier.testTag(if (message.isReceived) "message_received" else "message_sent")
             )
             Spacer(modifier = Modifier.height(16.dp))
         }
diff --git a/compose/ui/ui/integration-tests/ui-demos/src/main/java/androidx/compose/ui/demos/SoftwareKeyboardControllerDemo.kt b/compose/ui/ui/integration-tests/ui-demos/src/main/java/androidx/compose/ui/demos/SoftwareKeyboardControllerDemo.kt
index ae0e9b8..5be81bc 100644
--- a/compose/ui/ui/integration-tests/ui-demos/src/main/java/androidx/compose/ui/demos/SoftwareKeyboardControllerDemo.kt
+++ b/compose/ui/ui/integration-tests/ui-demos/src/main/java/androidx/compose/ui/demos/SoftwareKeyboardControllerDemo.kt
@@ -44,19 +44,18 @@
 
         val focusRequester = remember { FocusRequester() }
 
-        val text = if (isHidden) {
-            "Click on TextField to show keyboard, even after hiding"
-        } else {
-            "Keyboard shown (input ignored)"
-        }
+        val text =
+            if (isHidden) {
+                "Click on TextField to show keyboard, even after hiding"
+            } else {
+                "Keyboard shown (input ignored)"
+            }
 
         BasicTextField(
             value = text,
             onValueChange = {},
             textStyle = TextStyle.Default.copy(fontSize = 18.sp),
-            modifier = Modifier
-                .focusRequester(focusRequester)
-                .height(200.dp)
+            modifier = Modifier.focusRequester(focusRequester).height(200.dp)
         )
 
         val keyboardController = LocalSoftwareKeyboardController.current
diff --git a/compose/ui/ui/integration-tests/ui-demos/src/main/java/androidx/compose/ui/demos/UiDemos.kt b/compose/ui/ui/integration-tests/ui-demos/src/main/java/androidx/compose/ui/demos/UiDemos.kt
index e1a0987..a2d8987 100644
--- a/compose/ui/ui/integration-tests/ui-demos/src/main/java/androidx/compose/ui/demos/UiDemos.kt
+++ b/compose/ui/ui/integration-tests/ui-demos/src/main/java/androidx/compose/ui/demos/UiDemos.kt
@@ -95,197 +95,200 @@
 import androidx.compose.ui.samples.NestedScrollConnectionSample
 import androidx.compose.ui.samples.TraverseModifierDemo
 
-private val GestureDemos = DemoCategory(
-    "Gestures",
-    listOf(
-        DemoCategory(
-            "Common Gestures",
-            listOf(
-                ComposableDemo("Press Indication") { PressIndicatorGestureFilterDemo() },
-                ComposableDemo("Tap") { DetectTapGesturesDemo() },
-                ComposableDemo("Pressure Tap") { DetectTapPressureGesturesDemo() },
-                ComposableDemo("Double Tap") { DoubleTapGestureFilterDemo() },
-                ComposableDemo("Long Press") { LongPressGestureDetectorDemo() },
-                ComposableDemo("Scroll") { ScrollGestureFilterDemo() },
-                ComposableDemo("Drag") { DragGestureFilterDemo() },
-                ComposableDemo("Long Press Drag") { LongPressDragGestureFilterDemo() },
-                ComposableDemo("Scale") { ScaleGestureFilterDemo() },
-                ComposableDemo("Button/Meta State") { ButtonMetaStateDemo() },
-                ComposableDemo("Buttons with Logging using onClick") {
-                    MultiButtonsWithLoggingUsingOnClick()
-                },
-                ComposableDemo("Buttons with Logging using pointerInput") {
-                    MultiButtonsWithLoggingUsingPointerInput()
-                },
-                ComposableDemo("Event Types") { EventTypesDemo() },
-            )
-        ),
-        DemoCategory(
-            "Building Block Gestures",
-            listOf(
-                ComposableDemo("Drag Slop Exceeded") { DragSlopExceededGestureFilterDemo() },
-                ComposableDemo("Raw Drag") { RawDragGestureFilterDemo() }
-            )
-        ),
-        DemoCategory(
-            "Combinations / Case Studies",
-            listOf(
-                ComposableDemo("Nested Pressing") { NestedPressingDemo() },
-                ComposableDemo("Horizontal Scrollers In Vertical Scroller") {
-                    HorizontalScrollersInVerticalScrollersDemo()
-                },
-                ComposableDemo("Vertical Scroller in Nav Drawer") {
-                    VerticalScrollerInDrawerDemo()
-                },
-                ComposableDemo("Nested Scrolling") { NestedScrollingDemo() },
-                ComposableDemo("Drag and Scale") { DragAndScaleGestureFilterDemo() },
-                ComposableDemo("Popup Drag") { PopupDragDemo() },
-                ComposableDemo("Double Tap in Tap") { DoubleTapInTapDemo() },
-                ComposableDemo("Nested Long Press") { NestedLongPressDemo() },
-                ComposableDemo("Pointer Input During Sub Comp") { PointerInputDuringSubComp() }
-            )
-        ),
-        DemoCategory(
-            "New nested scroll",
-            listOf(
-                ComposableDemo("Nested scroll connection") { NestedScrollConnectionSample() },
-                ComposableDemo("Nested scroll dispatch") { NestedScrollDispatchDemo() }
+private val GestureDemos =
+    DemoCategory(
+        "Gestures",
+        listOf(
+            DemoCategory(
+                "Common Gestures",
+                listOf(
+                    ComposableDemo("Press Indication") { PressIndicatorGestureFilterDemo() },
+                    ComposableDemo("Tap") { DetectTapGesturesDemo() },
+                    ComposableDemo("Pressure Tap") { DetectTapPressureGesturesDemo() },
+                    ComposableDemo("Double Tap") { DoubleTapGestureFilterDemo() },
+                    ComposableDemo("Long Press") { LongPressGestureDetectorDemo() },
+                    ComposableDemo("Scroll") { ScrollGestureFilterDemo() },
+                    ComposableDemo("Drag") { DragGestureFilterDemo() },
+                    ComposableDemo("Long Press Drag") { LongPressDragGestureFilterDemo() },
+                    ComposableDemo("Scale") { ScaleGestureFilterDemo() },
+                    ComposableDemo("Button/Meta State") { ButtonMetaStateDemo() },
+                    ComposableDemo("Buttons with Logging using onClick") {
+                        MultiButtonsWithLoggingUsingOnClick()
+                    },
+                    ComposableDemo("Buttons with Logging using pointerInput") {
+                        MultiButtonsWithLoggingUsingPointerInput()
+                    },
+                    ComposableDemo("Event Types") { EventTypesDemo() },
+                )
+            ),
+            DemoCategory(
+                "Building Block Gestures",
+                listOf(
+                    ComposableDemo("Drag Slop Exceeded") { DragSlopExceededGestureFilterDemo() },
+                    ComposableDemo("Raw Drag") { RawDragGestureFilterDemo() }
+                )
+            ),
+            DemoCategory(
+                "Combinations / Case Studies",
+                listOf(
+                    ComposableDemo("Nested Pressing") { NestedPressingDemo() },
+                    ComposableDemo("Horizontal Scrollers In Vertical Scroller") {
+                        HorizontalScrollersInVerticalScrollersDemo()
+                    },
+                    ComposableDemo("Vertical Scroller in Nav Drawer") {
+                        VerticalScrollerInDrawerDemo()
+                    },
+                    ComposableDemo("Nested Scrolling") { NestedScrollingDemo() },
+                    ComposableDemo("Drag and Scale") { DragAndScaleGestureFilterDemo() },
+                    ComposableDemo("Popup Drag") { PopupDragDemo() },
+                    ComposableDemo("Double Tap in Tap") { DoubleTapInTapDemo() },
+                    ComposableDemo("Nested Long Press") { NestedLongPressDemo() },
+                    ComposableDemo("Pointer Input During Sub Comp") { PointerInputDuringSubComp() }
+                )
+            ),
+            DemoCategory(
+                "New nested scroll",
+                listOf(
+                    ComposableDemo("Nested scroll connection") { NestedScrollConnectionSample() },
+                    ComposableDemo("Nested scroll dispatch") { NestedScrollDispatchDemo() }
+                )
             )
         )
     )
-)
 
-private val FocusDemos = DemoCategory(
-    "Focus",
-    listOf(
-        ComposableDemo("Focusable Siblings") { FocusableDemo() },
-        ComposableDemo("Focus Within Dialog") { FocusInDialogDemo() },
-        ComposableDemo("Focus Within Popup") { FocusInPopupDemo() },
-        ComposableDemo("Reuse Focus Requester") { ReuseFocusRequesterDemo() },
-        ComposableDemo("1D Focus Search") { OneDimensionalFocusSearchDemo() },
-        ComposableDemo("2D Focus Search") { TwoDimensionalFocusSearchDemo() },
-        ComposableDemo("Custom Focus Order") { CustomFocusOrderDemo() },
-        ComposableDemo("Explicit Enter/Exit Focus Group") {
-            ExplicitEnterExitWithCustomFocusEnterExitDemo()
-        },
-        ComposableDemo("Cancel Focus Move") { CancelFocusDemo() },
-        ComposableDemo("FocusManager.moveFocus()") { FocusManagerMoveFocusDemo() },
-        ComposableDemo("Capture/Free Focus") { CaptureFocusDemo() },
-        ComposableDemo("Focus Restoration") { FocusRestorationDemo() },
-        ComposableDemo("Focus In Scrollable Row") { ScrollableRowFocusDemo() },
-        ComposableDemo("Focus in Lazy Row") { ScrollableLazyRowFocusDemo() },
-        ComposableDemo("LazyList Child Focusability") { LazyListChildFocusDemos() },
-        ComposableDemo("Focus In Adjacent Scrollable Rows") { AdjacentScrollablesFocusDemo() },
-        ComposableDemo("Clickable in LazyColumn") { ClickableInLazyColumnDemo() },
-        ComposableDemo("Nested LazyLists") { NestedLazyListFocusSearchDemo() },
-        ComposableDemo("Conditional Focusability") { ConditionalFocusabilityDemo() }
-    )
-)
-
-private val KeyInputDemos = DemoCategory(
-    "KeyInput",
-    listOf(
-        ComposableDemo("onKeyEvent") { KeyInputDemo() },
-        ComposableDemo("onPreviewKeyEvent") { InterceptEnterToSendMessageDemo() },
-    )
-)
-
-private val GraphicsDemos = DemoCategory(
-    "Graphics",
-    listOf(
-        ComposableDemo("VectorGraphicsDemo") { VectorGraphicsDemo() },
-        ComposableDemo("DeclarativeGraphicsDemo") { DeclarativeGraphicsDemo() },
-        ActivityDemo(
-            "Painter Resources Demo",
-            PainterResourcesDemoActivity::class
+private val FocusDemos =
+    DemoCategory(
+        "Focus",
+        listOf(
+            ComposableDemo("Focusable Siblings") { FocusableDemo() },
+            ComposableDemo("Focus Within Dialog") { FocusInDialogDemo() },
+            ComposableDemo("Focus Within Popup") { FocusInPopupDemo() },
+            ComposableDemo("Reuse Focus Requester") { ReuseFocusRequesterDemo() },
+            ComposableDemo("1D Focus Search") { OneDimensionalFocusSearchDemo() },
+            ComposableDemo("2D Focus Search") { TwoDimensionalFocusSearchDemo() },
+            ComposableDemo("Custom Focus Order") { CustomFocusOrderDemo() },
+            ComposableDemo("Explicit Enter/Exit Focus Group") {
+                ExplicitEnterExitWithCustomFocusEnterExitDemo()
+            },
+            ComposableDemo("Cancel Focus Move") { CancelFocusDemo() },
+            ComposableDemo("FocusManager.moveFocus()") { FocusManagerMoveFocusDemo() },
+            ComposableDemo("Capture/Free Focus") { CaptureFocusDemo() },
+            ComposableDemo("Focus Restoration") { FocusRestorationDemo() },
+            ComposableDemo("Focus In Scrollable Row") { ScrollableRowFocusDemo() },
+            ComposableDemo("Focus in Lazy Row") { ScrollableLazyRowFocusDemo() },
+            ComposableDemo("LazyList Child Focusability") { LazyListChildFocusDemos() },
+            ComposableDemo("Focus In Adjacent Scrollable Rows") { AdjacentScrollablesFocusDemo() },
+            ComposableDemo("Clickable in LazyColumn") { ClickableInLazyColumnDemo() },
+            ComposableDemo("Nested LazyLists") { NestedLazyListFocusSearchDemo() },
+            ComposableDemo("Conditional Focusability") { ConditionalFocusabilityDemo() }
         )
     )
-)
 
-private val NestedScrollInteropDemos = DemoCategory(
-    "Nested Scroll Interop",
-    listOf(
-        ActivityDemo(
-            "(Collaborating) View -> Compose",
-            ComposeInAndroidCoordinatorLayout::class
-        ),
-        ActivityDemo(
-            "Compose -> Sliding Pane",
-            ComposeInSwipeToRefreshLayout::class
-        ),
-        ActivityDemo(
-            "(Collaborating) View -> Compose -> View",
-            ViewComposeViewNestedScrollInteropDemo::class
-        ),
-        ActivityDemo(
-            "Material Bottom Sheet Interop",
-            BottomSheetFragmentNestedScrollInteropDemo::class
-        ),
-        ComposableDemo("Compose -> View") {
-            NestedScrollInteropComposeParentWithAndroidChild()
-        },
-        ComposableDemo("Compose -> (Collaborating) View -> Compose Interop") {
-            ComposeViewComposeNestedInterop()
-        }
+private val KeyInputDemos =
+    DemoCategory(
+        "KeyInput",
+        listOf(
+            ComposableDemo("onKeyEvent") { KeyInputDemo() },
+            ComposableDemo("onPreviewKeyEvent") { InterceptEnterToSendMessageDemo() },
+        )
     )
-)
 
-private val ViewInteropDemos = DemoCategory(
-    "View Interop",
-    listOf(
-        ComposableDemo("Views interoperability") { ViewInteropDemo() },
-        ComposeInAndroidDemos,
-        AndroidInComposeDemos,
-        ComplexTouchInterop,
-        ComposableDemo("TextField Interop") { EditTextInteropDemo() },
-        ComposableDemo("Focus Interop") { FocusInteropDemo() },
-        ComposableDemo("RecyclerView Focus Transfer") { RecyclerViewFocusTransferDemo() },
-        NestedScrollInteropDemos,
-        ComposableDemo("Resize ComposeView") { ResizeComposeViewDemo() },
-        ComposableDemo("LazyColumn of Android Views") { ScrollingAndroidViewsDemo() }
+private val GraphicsDemos =
+    DemoCategory(
+        "Graphics",
+        listOf(
+            ComposableDemo("VectorGraphicsDemo") { VectorGraphicsDemo() },
+            ComposableDemo("DeclarativeGraphicsDemo") { DeclarativeGraphicsDemo() },
+            ActivityDemo("Painter Resources Demo", PainterResourcesDemoActivity::class)
+        )
     )
-)
 
-private val ModifierDemos = DemoCategory(
-    "Modifiers",
-    listOf(
-        ComposableDemo("Inter-Modifier Communication") { CommunicatingModifierDemo() },
-        ComposableDemo("Traversing Modifiers") { TraverseModifierDemo() }
+private val NestedScrollInteropDemos =
+    DemoCategory(
+        "Nested Scroll Interop",
+        listOf(
+            ActivityDemo(
+                "(Collaborating) View -> Compose",
+                ComposeInAndroidCoordinatorLayout::class
+            ),
+            ActivityDemo("Compose -> Sliding Pane", ComposeInSwipeToRefreshLayout::class),
+            ActivityDemo(
+                "(Collaborating) View -> Compose -> View",
+                ViewComposeViewNestedScrollInteropDemo::class
+            ),
+            ActivityDemo(
+                "Material Bottom Sheet Interop",
+                BottomSheetFragmentNestedScrollInteropDemo::class
+            ),
+            ComposableDemo("Compose -> View") {
+                NestedScrollInteropComposeParentWithAndroidChild()
+            },
+            ComposableDemo("Compose -> (Collaborating) View -> Compose Interop") {
+                ComposeViewComposeNestedInterop()
+            }
+        )
     )
-)
 
-val AccessibilityDemos = DemoCategory(
-    "Accessibility",
-    listOf(
-        ComposableDemo("Scaffold Top Bar") { ScaffoldSampleDemo() },
-        ComposableDemo("Scaffold with Scrolling") { ScaffoldSampleScrollDemo() },
-        ComposableDemo("Simple Top Bar with Scrolling") { ScrollingColumnDemo() },
-        ComposableDemo("Nested Containers—True") { NestedContainersTrueDemo() },
-        ComposableDemo("Nested Containers—False") { NestedContainersFalseDemo() },
-        ComposableDemo("Linear Progress Indicator") { LinearProgressIndicatorDemo() },
-        ComposableDemo("Dual LTR and RTL Scene") { SimpleRtlLayoutDemo() }
+private val ViewInteropDemos =
+    DemoCategory(
+        "View Interop",
+        listOf(
+            ComposableDemo("Views interoperability") { ViewInteropDemo() },
+            ComposeInAndroidDemos,
+            AndroidInComposeDemos,
+            ComplexTouchInterop,
+            ComposableDemo("TextField Interop") { EditTextInteropDemo() },
+            ComposableDemo("Focus Interop") { FocusInteropDemo() },
+            ComposableDemo("RecyclerView Focus Transfer") { RecyclerViewFocusTransferDemo() },
+            NestedScrollInteropDemos,
+            ComposableDemo("Resize ComposeView") { ResizeComposeViewDemo() },
+            ComposableDemo("LazyColumn of Android Views") { ScrollingAndroidViewsDemo() }
+        )
     )
-)
 
-val CoreDemos = DemoCategory(
-    "Framework",
-    listOf(
-        ModifierDemos,
-        ComposableDemo("Explicit autofill types") { ExplicitAutofillTypesDemo() },
-        FocusDemos,
-        KeyInputDemos,
-        ComposableDemo("TouchMode") { TouchModeDemo() },
-        ComposableDemo("Multiple collects measure") { MultipleCollectTest() },
-        ComposableDemo("Dialog") { DialogDemo() },
-        ComposableDemo("Popup") { PopupDemo() },
-        GraphicsDemos,
-        GestureDemos,
-        ViewInteropDemos,
-        ComposableDemo("Software Keyboard Controller") { SoftwareKeyboardControllerDemo() },
-        RecyclerViewDemos,
-        AccessibilityDemos,
-        ComposableDemo("Screen coordinates") { ScreenCoordinatesDemo(it) },
-        ComposableDemo("Clipboard") { ClipboardDemo() },
-        ActivityDemo("Simple chat", SimpleChatActivity::class)
+private val ModifierDemos =
+    DemoCategory(
+        "Modifiers",
+        listOf(
+            ComposableDemo("Inter-Modifier Communication") { CommunicatingModifierDemo() },
+            ComposableDemo("Traversing Modifiers") { TraverseModifierDemo() }
+        )
     )
-)
+
+val AccessibilityDemos =
+    DemoCategory(
+        "Accessibility",
+        listOf(
+            ComposableDemo("Scaffold Top Bar") { ScaffoldSampleDemo() },
+            ComposableDemo("Scaffold with Scrolling") { ScaffoldSampleScrollDemo() },
+            ComposableDemo("Simple Top Bar with Scrolling") { ScrollingColumnDemo() },
+            ComposableDemo("Nested Containers—True") { NestedContainersTrueDemo() },
+            ComposableDemo("Nested Containers—False") { NestedContainersFalseDemo() },
+            ComposableDemo("Linear Progress Indicator") { LinearProgressIndicatorDemo() },
+            ComposableDemo("Dual LTR and RTL Scene") { SimpleRtlLayoutDemo() }
+        )
+    )
+
+val CoreDemos =
+    DemoCategory(
+        "Framework",
+        listOf(
+            ModifierDemos,
+            ComposableDemo("Explicit autofill types") { ExplicitAutofillTypesDemo() },
+            FocusDemos,
+            KeyInputDemos,
+            ComposableDemo("TouchMode") { TouchModeDemo() },
+            ComposableDemo("Multiple collects measure") { MultipleCollectTest() },
+            ComposableDemo("Dialog") { DialogDemo() },
+            ComposableDemo("Popup") { PopupDemo() },
+            GraphicsDemos,
+            GestureDemos,
+            ViewInteropDemos,
+            ComposableDemo("Software Keyboard Controller") { SoftwareKeyboardControllerDemo() },
+            RecyclerViewDemos,
+            AccessibilityDemos,
+            ComposableDemo("Screen coordinates") { ScreenCoordinatesDemo(it) },
+            ComposableDemo("Clipboard") { ClipboardDemo() },
+            ActivityDemo("Simple chat", SimpleChatActivity::class)
+        )
+    )
diff --git a/compose/ui/ui/integration-tests/ui-demos/src/main/java/androidx/compose/ui/demos/VectorGraphicsDemo.kt b/compose/ui/ui/integration-tests/ui-demos/src/main/java/androidx/compose/ui/demos/VectorGraphicsDemo.kt
index ff32c2c..0e08f45 100644
--- a/compose/ui/ui/integration-tests/ui-demos/src/main/java/androidx/compose/ui/demos/VectorGraphicsDemo.kt
+++ b/compose/ui/ui/integration-tests/ui-demos/src/main/java/androidx/compose/ui/demos/VectorGraphicsDemo.kt
@@ -103,14 +103,12 @@
                     close()
                 }
                 Path(
-                    fill = Brush.horizontalGradient(
-                        listOf(
-                            Color.Red,
-                            Color.Blue
+                    fill =
+                        Brush.horizontalGradient(
+                            listOf(Color.Red, Color.Blue),
+                            startX = 0.0f,
+                            endX = viewportWidth / 2 + 100.0f
                         ),
-                        startX = 0.0f,
-                        endX = viewportWidth / 2 + 100.0f
-                    ),
                     pathData = pathData
                 )
             }
@@ -129,14 +127,15 @@
     }
 
     Path(
-        fill = Brush.verticalGradient(
-            0.0f to Color.Cyan,
-            0.3f to Color.Green,
-            1.0f to Color.Magenta,
-            startY = 0.0f,
-            endY = vectorHeight,
-            tileMode = TileMode.Clamp
-        ),
+        fill =
+            Brush.verticalGradient(
+                0.0f to Color.Cyan,
+                0.3f to Color.Green,
+                1.0f to Color.Magenta,
+                startY = 0.0f,
+                endY = vectorHeight,
+                tileMode = TileMode.Clamp
+            ),
         pathData = background
     )
 }
@@ -145,21 +144,19 @@
 private fun Triangle() {
     val length = 150.0f
     Path(
-        fill = Brush.radialGradient(
-            listOf(
-                Color(0xFF000080),
-                Color(0xFF808000),
-                Color(0xFF008080)
+        fill =
+            Brush.radialGradient(
+                listOf(Color(0xFF000080), Color(0xFF808000), Color(0xFF008080)),
+                Offset(length / 2.0f, length / 2.0f),
+                radius = length / 2.0f,
+                tileMode = TileMode.Repeated
             ),
-            Offset(length / 2.0f, length / 2.0f),
-            radius = length / 2.0f,
-            tileMode = TileMode.Repeated
-        ),
-        pathData = PathData {
-            verticalLineTo(length)
-            horizontalLineTo(length)
-            close()
-        }
+        pathData =
+            PathData {
+                verticalLineTo(length)
+                horizontalLineTo(length)
+                close()
+            }
     )
 }
 
@@ -169,27 +166,27 @@
     val side1 = 150.0f
     val side2 = 150.0f
     Path(
-        fill = Brush.radialGradient(
-            0.0f to Color(0xFF800000),
-            0.3f to Color.Cyan,
-            0.8f to Color.Yellow,
-            center = Offset(side1 / 2.0f, side2 / 2.0f),
-            radius = side1 / 2.0f,
-            tileMode = TileMode.Clamp
-        ),
-        pathData = PathData {
-            horizontalLineToRelative(side1)
-            verticalLineToRelative(side2)
-            close()
-        }
+        fill =
+            Brush.radialGradient(
+                0.0f to Color(0xFF800000),
+                0.3f to Color.Cyan,
+                0.8f to Color.Yellow,
+                center = Offset(side1 / 2.0f, side2 / 2.0f),
+                radius = side1 / 2.0f,
+                tileMode = TileMode.Clamp
+            ),
+        pathData =
+            PathData {
+                horizontalLineToRelative(side1)
+                verticalLineToRelative(side2)
+                close()
+            }
     )
 }
 
 @Composable
 private fun StripePath(vectorWidth: Float, vectorHeight: Float) {
-    val stripeDelegate = PathData {
-        stripe(vectorWidth, vectorHeight, 10)
-    }
+    val stripeDelegate = PathData { stripe(vectorWidth, vectorHeight, 10) }
 
     Path(stroke = SolidColor(Color.Blue), pathData = stripeDelegate)
 }
diff --git a/compose/ui/ui/integration-tests/ui-demos/src/main/java/androidx/compose/ui/demos/accessibility/ComplexAccessibilityDemos.kt b/compose/ui/ui/integration-tests/ui-demos/src/main/java/androidx/compose/ui/demos/accessibility/ComplexAccessibilityDemos.kt
index 70ee50d..8d7db1c 100644
--- a/compose/ui/ui/integration-tests/ui-demos/src/main/java/androidx/compose/ui/demos/accessibility/ComplexAccessibilityDemos.kt
+++ b/compose/ui/ui/integration-tests/ui-demos/src/main/java/androidx/compose/ui/demos/accessibility/ComplexAccessibilityDemos.kt
@@ -76,9 +76,7 @@
     var yPosition = 0
 
     Layout(modifier = modifier, content = content) { measurables, constraints ->
-        val placeables = measurables.map { measurable ->
-            measurable.measure(constraints)
-        }
+        val placeables = measurables.map { measurable -> measurable.measure(constraints) }
 
         layout(constraints.maxWidth, constraints.maxHeight) {
             placeables.forEach { placeable ->
@@ -106,9 +104,7 @@
                 Row { Text("text3\n") }
             }
         }
-        Row {
-            Text("overlaid node")
-        }
+        Row { Text("overlaid node") }
     }
 }
 
@@ -136,22 +132,21 @@
 fun NestedContainersFalseDemo() {
     var topSampleText = "Top text in column "
     var bottomSampleText = "Bottom text in column "
-    Column(
-        Modifier
-            .testTag("Test Tag")
-            .semantics { isTraversalGroup = true }
-    ) {
-        Row() { Modifier.semantics { isTraversalGroup = true }
+    Column(Modifier.testTag("Test Tag").semantics { isTraversalGroup = true }) {
+        Row() {
+            Modifier.semantics { isTraversalGroup = true }
             CardRow(
                 Modifier.semantics { isTraversalGroup = false },
                 1,
                 topSampleText,
-                bottomSampleText)
+                bottomSampleText
+            )
             CardRow(
                 Modifier.semantics { isTraversalGroup = false },
                 2,
                 topSampleText,
-                bottomSampleText)
+                bottomSampleText
+            )
         }
     }
 }
@@ -161,22 +156,21 @@
 fun NestedContainersTrueDemo() {
     var topSampleText = "Top text in column "
     var bottomSampleText = "Bottom text in column "
-    Column(
-        Modifier
-            .testTag("Test Tag")
-            .semantics { isTraversalGroup = true }
-    ) {
-        Row() { Modifier.semantics { isTraversalGroup = true }
+    Column(Modifier.testTag("Test Tag").semantics { isTraversalGroup = true }) {
+        Row() {
+            Modifier.semantics { isTraversalGroup = true }
             CardRow(
                 Modifier.semantics { isTraversalGroup = true },
                 1,
                 topSampleText,
-                bottomSampleText)
+                bottomSampleText
+            )
             CardRow(
                 Modifier.semantics { isTraversalGroup = true },
                 2,
                 topSampleText,
-                bottomSampleText)
+                bottomSampleText
+            )
         }
     }
 }
@@ -184,26 +178,15 @@
 @Composable
 fun TopAppBar() {
     val topAppBar = "Top App Bar"
-    TopAppBar(
-        title = {
-            Text(text = topAppBar)
-        }
-    )
+    TopAppBar(title = { Text(text = topAppBar) })
 }
 
 @Composable
 fun ScrollColumn(padding: PaddingValues) {
     var counter = 0
     var sampleText = "Sample text in column"
-    Column(
-        Modifier
-            .verticalScroll(rememberScrollState())
-            .padding(padding)
-            .testTag("Test Tag")
-    ) {
-        repeat(100) {
-            Text(sampleText + counter++)
-        }
+    Column(Modifier.verticalScroll(rememberScrollState()).padding(padding).testTag("Test Tag")) {
+        repeat(100) { Text(sampleText + counter++) }
     }
 }
 
@@ -215,13 +198,16 @@
         scaffoldState = scaffoldState,
         topBar = { TopAppBar() },
         floatingActionButtonPosition = FabPosition.End,
-        floatingActionButton = { FloatingActionButton(onClick = {}) {
-            Icon(imageVector = Icons.Default.Add, contentDescription = "fab icon")
-        } },
+        floatingActionButton = {
+            FloatingActionButton(onClick = {}) {
+                Icon(imageVector = Icons.Default.Add, contentDescription = "fab icon")
+            }
+        },
         drawerContent = { Text(text = "Drawer Menu 1") },
         content = { padding -> Text("Content", modifier = Modifier.padding(padding)) },
-        bottomBar = { BottomAppBar(backgroundColor = MaterialTheme.colors.primary) {
-            Text("Bottom App Bar") } }
+        bottomBar = {
+            BottomAppBar(backgroundColor = MaterialTheme.colors.primary) { Text("Bottom App Bar") }
+        }
     )
 }
 
@@ -233,12 +219,15 @@
         scaffoldState = scaffoldState,
         topBar = { TopAppBar() },
         floatingActionButtonPosition = FabPosition.End,
-        floatingActionButton = { FloatingActionButton(onClick = {}) {
-            Icon(imageVector = Icons.Default.Add, contentDescription = "fab icon")
-        } },
+        floatingActionButton = {
+            FloatingActionButton(onClick = {}) {
+                Icon(imageVector = Icons.Default.Add, contentDescription = "fab icon")
+            }
+        },
         content = { padding -> ScrollColumn(padding) },
-        bottomBar = { BottomAppBar(backgroundColor = MaterialTheme.colors.primary) {
-            Text("Bottom App Bar") } }
+        bottomBar = {
+            BottomAppBar(backgroundColor = MaterialTheme.colors.primary) { Text("Bottom App Bar") }
+        }
     )
 }
 
@@ -248,25 +237,16 @@
     var sampleText = "Sample text in column"
     var counter = 0
 
-    Column(
-        Modifier
-            .verticalScroll(rememberScrollState())
-            .testTag("Test Tag")
-    ) {
+    Column(Modifier.verticalScroll(rememberScrollState()).testTag("Test Tag")) {
         TopAppBar()
-        repeat(100) {
-            Text(sampleText + counter++)
-        }
+        repeat(100) { Text(sampleText + counter++) }
     }
 }
 
 @Preview
 @Composable
 fun OverlaidNodeTraversalIndexDemo() {
-    LastElementOverLaidColumn(
-        Modifier
-            .semantics { isTraversalGroup = true }
-            .padding(8.dp)) {
+    LastElementOverLaidColumn(Modifier.semantics { isTraversalGroup = true }.padding(8.dp)) {
         Row {
             Column(modifier = Modifier.testTag("Text1")) {
                 Row { Text("text1\n") }
@@ -277,7 +257,12 @@
         // Since default traversalIndex is 0, `traversalIndex = -1f` here means that the overlaid
         // node is read first, even though visually it's below the other text.
         // Container needs to be true, otherwise we only read/register significant
-        Row(Modifier.semantics { isTraversalGroup = true; traversalIndex = -1f }) {
+        Row(
+            Modifier.semantics {
+                isTraversalGroup = true
+                traversalIndex = -1f
+            }
+        ) {
             Text("overlaid node")
         }
     }
@@ -285,7 +270,13 @@
 
 @Composable
 fun FloatingBox() {
-    Box(modifier = Modifier.semantics { isTraversalGroup = true; traversalIndex = -1f }) {
+    Box(
+        modifier =
+            Modifier.semantics {
+                isTraversalGroup = true
+                traversalIndex = -1f
+            }
+    ) {
         FloatingActionButton(onClick = {}) {
             Icon(imageVector = Icons.Default.Add, contentDescription = "fab icon")
         }
@@ -296,31 +287,23 @@
 fun ContentColumn(padding: PaddingValues) {
     var counter = 0
     var sampleText = "Sample text in column"
-    Column(
-        Modifier
-            .verticalScroll(rememberScrollState())
-            .padding(padding)
-            .testTag("Test Tag")
-    ) {
+    Column(Modifier.verticalScroll(rememberScrollState()).padding(padding).testTag("Test Tag")) {
         // every other value has an explicitly set `traversalIndex`
         Text(text = sampleText + counter++)
-        Text(text = sampleText + counter++,
-            modifier = Modifier.semantics { traversalIndex = 1f })
+        Text(text = sampleText + counter++, modifier = Modifier.semantics { traversalIndex = 1f })
         Text(text = sampleText + counter++)
-        Text(text = sampleText + counter++,
-            modifier = Modifier.semantics { traversalIndex = 1f })
+        Text(text = sampleText + counter++, modifier = Modifier.semantics { traversalIndex = 1f })
         Text(text = sampleText + counter++)
-        Text(text = sampleText + counter++,
-            modifier = Modifier.semantics { traversalIndex = 1f })
+        Text(text = sampleText + counter++, modifier = Modifier.semantics { traversalIndex = 1f })
         Text(text = sampleText + counter++)
     }
 }
 
 /**
- * Example of how `traversalIndex` and traversal groups can be used to customize TalkBack
- * ordering. The example below puts the FAB into a box (with `isTraversalGroup = true` and a
- * custom traversal index) to have it appear first when TalkBack is turned on. The
- * text in the column also has been modified. See go/traversal-index-changes for more detail
+ * Example of how `traversalIndex` and traversal groups can be used to customize TalkBack ordering.
+ * The example below puts the FAB into a box (with `isTraversalGroup = true` and a custom traversal
+ * index) to have it appear first when TalkBack is turned on. The text in the column also has been
+ * modified. See go/traversal-index-changes for more detail
  */
 @Preview
 @Composable
@@ -333,8 +316,9 @@
         floatingActionButton = { FloatingBox() },
         drawerContent = { Text(text = "Drawer Menu 1") },
         content = { padding -> ContentColumn(padding = padding) },
-        bottomBar = { BottomAppBar(backgroundColor = MaterialTheme.colors.primary) {
-            Text("Bottom App Bar") } }
+        bottomBar = {
+            BottomAppBar(backgroundColor = MaterialTheme.colors.primary) { Text("Bottom App Bar") }
+        }
     )
 }
 
@@ -345,11 +329,17 @@
         Modifier
             // Having a traversal index here as 8f shouldn't affect anything; this column
             // has no other peers that its compared to
-            .semantics { traversalIndex = 8f; isTraversalGroup = true }
+            .semantics {
+                traversalIndex = 8f
+                isTraversalGroup = true
+            }
             .padding(8.dp)
     ) {
         Row(
-            Modifier.semantics { traversalIndex = 3f; isTraversalGroup = true }
+            Modifier.semantics {
+                traversalIndex = 3f
+                isTraversalGroup = true
+            }
         ) {
             Column(modifier = Modifier.testTag("Text1")) {
                 Row { Text("text 3\n") }
@@ -359,15 +349,9 @@
                 Row { Text("text 4\n") }
             }
         }
-        Row {
-            Text(text = "text 2\n", modifier = Modifier.semantics { traversalIndex = 2f })
-        }
-        Row {
-            Text(text = "text 1\n", modifier = Modifier.semantics { traversalIndex = 1f })
-        }
-        Row {
-            Text(text = "text 0\n")
-        }
+        Row { Text(text = "text 2\n", modifier = Modifier.semantics { traversalIndex = 2f }) }
+        Row { Text(text = "text 1\n", modifier = Modifier.semantics { traversalIndex = 1f }) }
+        Row { Text(text = "text 0\n") }
     }
 }
 
@@ -376,24 +360,15 @@
 fun IconsInScaffoldWithListDemo() {
     Scaffold(
         topBar = {
-            Row(
-                horizontalArrangement = Arrangement.SpaceEvenly
-            ) {
-                IconButton(onClick = { }) {
-                    Icon(Icons.Default.Face, contentDescription = "Face 1")
-                }
+            Row(horizontalArrangement = Arrangement.SpaceEvenly) {
+                IconButton(onClick = {}) { Icon(Icons.Default.Face, contentDescription = "Face 1") }
                 // Setting `clearAndSetSemantics` below means that Face 2 will not be sorted nor
                 // will be read by TalkBack. The final traversal order should go from Face 1 to
                 // Face 3 to the LazyColumn content.
-                IconButton(
-                    onClick = { },
-                    modifier = Modifier.clearAndSetSemantics { }
-                ) {
+                IconButton(onClick = {}, modifier = Modifier.clearAndSetSemantics {}) {
                     Icon(Icons.Default.Face, contentDescription = "Face 2")
                 }
-                IconButton(onClick = { }) {
-                    Icon(Icons.Default.Face, contentDescription = "Face 3")
-                }
+                IconButton(onClick = {}) { Icon(Icons.Default.Face, contentDescription = "Face 3") }
             }
         },
         content = { innerPadding ->
@@ -405,9 +380,7 @@
                 items(count = list.size) {
                     Text(
                         text = list[it],
-                        modifier = Modifier
-                            .fillMaxWidth()
-                            .padding(horizontal = 16.dp)
+                        modifier = Modifier.fillMaxWidth().padding(horizontal = 16.dp)
                     )
                 }
             }
@@ -417,31 +390,18 @@
 
 @Composable
 fun InteropColumn(padding: PaddingValues) {
-    Column(
-        Modifier
-            .verticalScroll(rememberScrollState())
-            .padding(padding)
-            .testTag("Test Tag")
-    ) {
-        Button(onClick = { }) {
-            Text("Button that comes before an AndroidViewBinding")
-        }
+    Column(Modifier.verticalScroll(rememberScrollState()).padding(padding).testTag("Test Tag")) {
+        Button(onClick = {}) { Text("Button that comes before an AndroidViewBinding") }
 
-        AndroidViewBinding(TestLayoutBinding::inflate) {
-            text1.text = "AndroidViewBinding text"
-        }
+        AndroidViewBinding(TestLayoutBinding::inflate) { text1.text = "AndroidViewBinding text" }
 
-        Button(onClick = { }) {
+        Button(onClick = {}) {
             Text("Button that comes after an AndroidViewBinding and before another TextView")
         }
 
-        AndroidView(::TextView) {
-            it.text = "This is a text in a TextView"
-        }
+        AndroidView(::TextView) { it.text = "This is a text in a TextView" }
 
-        Button(onClick = { }) {
-            Text("Last text button")
-        }
+        Button(onClick = {}) { Text("Last text button") }
     }
 }
 
@@ -453,28 +413,23 @@
         scaffoldState = scaffoldState,
         topBar = { TopAppBar() },
         floatingActionButtonPosition = FabPosition.End,
-        floatingActionButton = { FloatingActionButton(onClick = {}) {
-            Icon(imageVector = Icons.Default.Add, contentDescription = "fab icon")
-        } },
+        floatingActionButton = {
+            FloatingActionButton(onClick = {}) {
+                Icon(imageVector = Icons.Default.Add, contentDescription = "fab icon")
+            }
+        },
         drawerContent = { Text(text = "Drawer Menu 1") },
         content = { padding -> InteropColumn(padding) },
-        bottomBar = { BottomAppBar(backgroundColor = MaterialTheme.colors.primary) {
-            Text("Bottom App Bar") } }
+        bottomBar = {
+            BottomAppBar(backgroundColor = MaterialTheme.colors.primary) { Text("Bottom App Bar") }
+        }
     )
 }
 
 @Composable
 fun InteropColumnBackwards(padding: PaddingValues) {
-    Column(
-        Modifier
-            .verticalScroll(rememberScrollState())
-            .padding(padding)
-            .testTag("Test Tag")
-    ) {
-        Button(
-            modifier = Modifier.semantics { traversalIndex = 4f },
-            onClick = { }
-        ) {
+    Column(Modifier.verticalScroll(rememberScrollState()).padding(padding).testTag("Test Tag")) {
+        Button(modifier = Modifier.semantics { traversalIndex = 4f }, onClick = {}) {
             Text("Last button after AndroidViewBinding")
         }
 
@@ -485,24 +440,15 @@
             text1.text = "Fourth — AndroidViewBinding"
         }
 
-        Button(
-            modifier = Modifier.semantics { traversalIndex = 2f },
-            onClick = { }
-        ) {
+        Button(modifier = Modifier.semantics { traversalIndex = 2f }, onClick = {}) {
             Text("Third — Compose button")
         }
 
-        AndroidView(
-            ::TextView,
-            modifier = Modifier.semantics { traversalIndex = 1f }
-        ) {
+        AndroidView(::TextView, modifier = Modifier.semantics { traversalIndex = 1f }) {
             it.text = "Second is a text in a TextView"
         }
 
-        Button(
-            modifier = Modifier.semantics { traversalIndex = 0f },
-            onClick = { }
-        ) {
+        Button(modifier = Modifier.semantics { traversalIndex = 0f }, onClick = {}) {
             Text("First button")
         }
     }
@@ -516,13 +462,16 @@
         scaffoldState = scaffoldState,
         topBar = { TopAppBar() },
         floatingActionButtonPosition = FabPosition.End,
-        floatingActionButton = { FloatingActionButton(onClick = {}) {
-            Icon(imageVector = Icons.Default.Add, contentDescription = "fab icon")
-        } },
+        floatingActionButton = {
+            FloatingActionButton(onClick = {}) {
+                Icon(imageVector = Icons.Default.Add, contentDescription = "fab icon")
+            }
+        },
         drawerContent = { Text(text = "Drawer Menu 1") },
         content = { padding -> InteropColumnBackwards(padding) },
-        bottomBar = { BottomAppBar(backgroundColor = MaterialTheme.colors.primary) {
-            Text("Bottom App Bar") } }
+        bottomBar = {
+            BottomAppBar(backgroundColor = MaterialTheme.colors.primary) { Text("Bottom App Bar") }
+        }
     )
 }
 
@@ -542,9 +491,7 @@
     Column {
         Row(Modifier.semantics { isTraversalGroup = true }.clickable {}) {
             Icon(imageVector = Icons.Default.Add, contentDescription = "fab icon")
-            Button(onClick = { }) {
-                Text("First button")
-            }
+            Button(onClick = {}) { Text("First button") }
         }
     }
 }
@@ -554,47 +501,17 @@
 fun SimpleRtlLayoutDemo() {
     Column {
         Row(Modifier.semantics { isTraversalGroup = true }) {
-            SimpleTestLayout(
-                Modifier
-                    .requiredSize(100.dp)
-            ) {
-                Text("Child 1")
-            }
-            SimpleTestLayout(
-                Modifier
-                    .requiredSize(100.dp)
-            ) {
-                Text("Child 2")
-            }
-            SimpleTestLayout(
-                Modifier
-                    .requiredSize(100.dp)
-            ) {
-                Text("Child 3")
-            }
+            SimpleTestLayout(Modifier.requiredSize(100.dp)) { Text("Child 1") }
+            SimpleTestLayout(Modifier.requiredSize(100.dp)) { Text("Child 2") }
+            SimpleTestLayout(Modifier.requiredSize(100.dp)) { Text("Child 3") }
         }
         CompositionLocalProvider(LocalLayoutDirection provides LayoutDirection.Rtl) {
             // Will display rtlChild3 rtlChild2 rtlChild1, but should be read
             // from child1 => child2 => child3.
             Row(Modifier.semantics { isTraversalGroup = true }) {
-                SimpleTestLayout(
-                    Modifier
-                        .requiredSize(100.dp)
-                ) {
-                    Text("RTL child 1")
-                }
-                SimpleTestLayout(
-                    Modifier
-                        .requiredSize(100.dp)
-                ) {
-                    Text("RTL child 2")
-                }
-                SimpleTestLayout(
-                    Modifier
-                        .requiredSize(100.dp)
-                ) {
-                    Text("RTL child 3")
-                }
+                SimpleTestLayout(Modifier.requiredSize(100.dp)) { Text("RTL child 1") }
+                SimpleTestLayout(Modifier.requiredSize(100.dp)) { Text("RTL child 2") }
+                SimpleTestLayout(Modifier.requiredSize(100.dp)) { Text("RTL child 3") }
             }
         }
     }
@@ -606,21 +523,14 @@
         if (measurables.isEmpty()) {
             layout(constraints.minWidth, constraints.minHeight) {}
         } else {
-            val placeables = measurables.map {
-                it.measure(constraints)
-            }
-            val (width, height) = with(placeables) {
-                Pair(
-                    max(
-                        maxByOrNull { it.width }?.width ?: 0,
-                        constraints.minWidth
-                    ),
-                    max(
-                        maxByOrNull { it.height }?.height ?: 0,
-                        constraints.minHeight
+            val placeables = measurables.map { it.measure(constraints) }
+            val (width, height) =
+                with(placeables) {
+                    Pair(
+                        max(maxByOrNull { it.width }?.width ?: 0, constraints.minWidth),
+                        max(maxByOrNull { it.height }?.height ?: 0, constraints.minHeight)
                     )
-                )
-            }
+                }
             layout(width, height) {
                 for (placeable in placeables) {
                     placeable.placeRelative(0, 0)
diff --git a/compose/ui/ui/integration-tests/ui-demos/src/main/java/androidx/compose/ui/demos/autofill/ExplicitAutofillTypesDemo.kt b/compose/ui/ui/integration-tests/ui-demos/src/main/java/androidx/compose/ui/demos/autofill/ExplicitAutofillTypesDemo.kt
index 88f0663..f75a651 100644
--- a/compose/ui/ui/integration-tests/ui-demos/src/main/java/androidx/compose/ui/demos/autofill/ExplicitAutofillTypesDemo.kt
+++ b/compose/ui/ui/integration-tests/ui-demos/src/main/java/androidx/compose/ui/demos/autofill/ExplicitAutofillTypesDemo.kt
@@ -48,12 +48,10 @@
 @Composable
 @OptIn(ExperimentalComposeUiApi::class)
 fun ExplicitAutofillTypesDemo() {
-    var name by rememberSaveable(stateSaver = TextFieldValue.Saver) {
-        mutableStateOf(TextFieldValue(""))
-    }
-    var email by rememberSaveable(stateSaver = TextFieldValue.Saver) {
-        mutableStateOf(TextFieldValue(""))
-    }
+    var name by
+        rememberSaveable(stateSaver = TextFieldValue.Saver) { mutableStateOf(TextFieldValue("")) }
+    var email by
+        rememberSaveable(stateSaver = TextFieldValue.Saver) { mutableStateOf(TextFieldValue("")) }
 
     Column {
         Autofill(
@@ -91,20 +89,21 @@
 ) {
     val autofill = LocalAutofill.current
     val autofillTree = LocalAutofillTree.current
-    val autofillNode = remember(autofillTypes, onFill) {
-        AutofillNode(onFill = onFill, autofillTypes = autofillTypes)
-    }
+    val autofillNode =
+        remember(autofillTypes, onFill) {
+            AutofillNode(onFill = onFill, autofillTypes = autofillTypes)
+        }
 
     Box(
-        modifier = Modifier
-            .onFocusChanged {
-                if (it.isFocused) {
-                    autofill?.requestAutofillForNode(autofillNode)
-                } else {
-                    autofill?.cancelAutofillForNode(autofillNode)
+        modifier =
+            Modifier.onFocusChanged {
+                    if (it.isFocused) {
+                        autofill?.requestAutofillForNode(autofillNode)
+                    } else {
+                        autofill?.cancelAutofillForNode(autofillNode)
+                    }
                 }
-            }
-            .onGloballyPositioned { autofillNode.boundingBox = it.boundsInWindow() },
+                .onGloballyPositioned { autofillNode.boundingBox = it.boundsInWindow() },
         content = content
     )
 
diff --git a/compose/ui/ui/integration-tests/ui-demos/src/main/java/androidx/compose/ui/demos/focus/AdjacentScrollablesFocusDemo.kt b/compose/ui/ui/integration-tests/ui-demos/src/main/java/androidx/compose/ui/demos/focus/AdjacentScrollablesFocusDemo.kt
index 52b8957..74d9698 100644
--- a/compose/ui/ui/integration-tests/ui-demos/src/main/java/androidx/compose/ui/demos/focus/AdjacentScrollablesFocusDemo.kt
+++ b/compose/ui/ui/integration-tests/ui-demos/src/main/java/androidx/compose/ui/demos/focus/AdjacentScrollablesFocusDemo.kt
@@ -41,11 +41,13 @@
 @Composable
 fun AdjacentScrollablesFocusDemo() {
     Column {
-        Text("""
+        Text(
+            """
         Use the dpad or arrow keys to move focus.
         Every 3rd item in the list is focusable.
         Notice how focus moves through all the items in List 1 before moving to List 2.
-        """.trimIndent()
+        """
+                .trimIndent()
         )
         ScrollableList("List 1")
         ScrollableList("List 2")
@@ -58,17 +60,14 @@
     Text(text = name)
     var color by remember { mutableStateOf(Color.Black) }
     Column(
-        Modifier
-            .height(200.dp)
+        Modifier.height(200.dp)
             .onFocusChanged { color = if (it.isFocused) Color.Red else Color.Black }
             .focusProperties { canFocus = false }
             .focusable()
             .border(2.dp, color)
             .verticalScroll(rememberScrollState())
     ) {
-        repeat(10) {
-            if (it % 3 == 0) FocusableBox("$it") else NonFocusableBox("$it")
-        }
+        repeat(10) { if (it % 3 == 0) FocusableBox("$it") else NonFocusableBox("$it") }
     }
 }
 
@@ -79,12 +78,13 @@
         text = text,
         fontSize = 50.sp,
         textAlign = TextAlign.Center,
-        modifier = modifier
-            .size(100.dp)
-            .border(2.dp, Color.Black)
-            .onFocusChanged { color = if (it.isFocused) Color.Red else Color.White }
-            .background(color)
-            .focusable()
+        modifier =
+            modifier
+                .size(100.dp)
+                .border(2.dp, Color.Black)
+                .onFocusChanged { color = if (it.isFocused) Color.Red else Color.White }
+                .background(color)
+                .focusable()
     )
 }
 
@@ -94,9 +94,6 @@
         text = text,
         fontSize = 50.sp,
         textAlign = TextAlign.Center,
-        modifier = modifier
-            .size(100.dp)
-            .border(2.dp, Color.Black)
-            .background(Color.White)
+        modifier = modifier.size(100.dp).border(2.dp, Color.Black).background(Color.White)
     )
 }
diff --git a/compose/ui/ui/integration-tests/ui-demos/src/main/java/androidx/compose/ui/demos/focus/CancelFocusDemo.kt b/compose/ui/ui/integration-tests/ui-demos/src/main/java/androidx/compose/ui/demos/focus/CancelFocusDemo.kt
index 3829477..5c2b595 100644
--- a/compose/ui/ui/integration-tests/ui-demos/src/main/java/androidx/compose/ui/demos/focus/CancelFocusDemo.kt
+++ b/compose/ui/ui/integration-tests/ui-demos/src/main/java/androidx/compose/ui/demos/focus/CancelFocusDemo.kt
@@ -45,9 +45,7 @@
 @OptIn(ExperimentalComposeUiApi::class)
 @Composable
 fun CancelFocusDemo() {
-    Column {
-        Text("Use the arrow keys to move focus left/right/up/down.")
-    }
+    Column { Text("Use the arrow keys to move focus left/right/up/down.") }
     Column(Modifier.fillMaxSize(), SpaceEvenly) {
         var blockFocusMove by remember { mutableStateOf(false) }
         Row {
@@ -61,15 +59,19 @@
         Row(Modifier.fillMaxWidth(), SpaceEvenly) {
             Text(
                 text = "3",
-                modifier = Modifier
-                    .focusProperties { if (blockFocusMove) { right = Cancel } }
-                    .focusableWithBorder()
+                modifier =
+                    Modifier.focusProperties {
+                            if (blockFocusMove) {
+                                right = Cancel
+                            }
+                        }
+                        .focusableWithBorder()
             )
             Text(
                 text = "4",
-                modifier = Modifier
-                    .focusProperties { left = if (blockFocusMove) Cancel else Default }
-                    .focusableWithBorder()
+                modifier =
+                    Modifier.focusProperties { left = if (blockFocusMove) Cancel else Default }
+                        .focusableWithBorder()
             )
         }
     }
@@ -77,8 +79,7 @@
 
 private fun Modifier.focusableWithBorder() = composed {
     var color by remember { mutableStateOf(Black) }
-    Modifier
-        .size(50.dp)
+    Modifier.size(50.dp)
         .border(1.dp, color)
         .onFocusChanged { color = if (it.isFocused) Red else Black }
         .focusable()
diff --git a/compose/ui/ui/integration-tests/ui-demos/src/main/java/androidx/compose/ui/demos/focus/CaptureFocusDemo.kt b/compose/ui/ui/integration-tests/ui-demos/src/main/java/androidx/compose/ui/demos/focus/CaptureFocusDemo.kt
index 368151e..6b9e2d6 100644
--- a/compose/ui/ui/integration-tests/ui-demos/src/main/java/androidx/compose/ui/demos/focus/CaptureFocusDemo.kt
+++ b/compose/ui/ui/integration-tests/ui-demos/src/main/java/androidx/compose/ui/demos/focus/CaptureFocusDemo.kt
@@ -55,10 +55,10 @@
                 shortString = it
                 if (shortString.length > 5) shortWord.captureFocus() else shortWord.freeFocus()
             },
-            modifier = Modifier
-                .border(2.dp, shortStringBorder)
-                .focusRequester(shortWord)
-                .onFocusChanged { shortStringBorder = if (it.isCaptured) Red else Transparent }
+            modifier =
+                Modifier.border(2.dp, shortStringBorder).focusRequester(shortWord).onFocusChanged {
+                    shortStringBorder = if (it.isCaptured) Red else Transparent
+                }
         )
 
         Spacer(Modifier.height(30.dp))
@@ -74,10 +74,10 @@
                 longString = it
                 if (longString.length < 5) longWord.captureFocus() else longWord.freeFocus()
             },
-            modifier = Modifier
-                .border(2.dp, longStringBorder)
-                .focusRequester(longWord)
-                .onFocusChanged { longStringBorder = if (it.isCaptured) Red else Transparent }
+            modifier =
+                Modifier.border(2.dp, longStringBorder).focusRequester(longWord).onFocusChanged {
+                    longStringBorder = if (it.isCaptured) Red else Transparent
+                }
         )
     }
 }
diff --git a/compose/ui/ui/integration-tests/ui-demos/src/main/java/androidx/compose/ui/demos/focus/ConditionalFocusabilityDemo.kt b/compose/ui/ui/integration-tests/ui-demos/src/main/java/androidx/compose/ui/demos/focus/ConditionalFocusabilityDemo.kt
index 6e9fb60..3638b50 100644
--- a/compose/ui/ui/integration-tests/ui-demos/src/main/java/androidx/compose/ui/demos/focus/ConditionalFocusabilityDemo.kt
+++ b/compose/ui/ui/integration-tests/ui-demos/src/main/java/androidx/compose/ui/demos/focus/ConditionalFocusabilityDemo.kt
@@ -67,26 +67,27 @@
              but clicking on it will request the system
              to switch to keyboard mode, and then call
              request focus.
-             """.trimIndent()
+             """
+                .trimIndent()
         )
         Text(
             text = "Focusable in all modes",
-            modifier = Modifier
-                .focusAwareBackground()
-                .focusRequester(item1)
-                .pointerInput(item1) { detectTapGestures { item1.requestFocus() } }
-                .focusable()
+            modifier =
+                Modifier.focusAwareBackground()
+                    .focusRequester(item1)
+                    .pointerInput(item1) { detectTapGestures { item1.requestFocus() } }
+                    .focusable()
         )
         Row {
             var item2active by remember { mutableStateOf(false) }
             Text(
                 text = "focusable item that is " + if (item2active) "activated" else "deactivated",
-                modifier = Modifier
-                    .focusAwareBackground()
-                    .focusRequester(item2)
-                    .pointerInput(item2) { detectTapGestures { item2.requestFocus() } }
-                    .focusProperties { canFocus = item2active }
-                    .focusable()
+                modifier =
+                    Modifier.focusAwareBackground()
+                        .focusRequester(item2)
+                        .pointerInput(item2) { detectTapGestures { item2.requestFocus() } }
+                        .focusProperties { canFocus = item2active }
+                        .focusable()
             )
             Button(onClick = { item2active = !item2active }) {
                 Text("${if (item2active) "deactivate" else "activate"} item 2")
@@ -94,37 +95,35 @@
         }
         Text(
             text = "Focusable in keyboard mode",
-            modifier = Modifier
-                .focusAwareBackground()
-                .focusRequester(item3)
-                .pointerInput(item3) { detectTapGestures { item3.requestFocus() } }
-                .focusProperties { canFocus = localInputModeManager.inputMode == Keyboard }
-                .focusable()
+            modifier =
+                Modifier.focusAwareBackground()
+                    .focusRequester(item3)
+                    .pointerInput(item3) { detectTapGestures { item3.requestFocus() } }
+                    .focusProperties { canFocus = localInputModeManager.inputMode == Keyboard }
+                    .focusable()
         )
         Text(
             text = "Request focus by touch",
-            modifier = Modifier
-                .focusAwareBackground()
-                .focusRequester(item4)
-                .pointerInput(item4) {
-                    detectTapGestures {
-                        @OptIn(ExperimentalComposeUiApi::class)
-                        if (localInputModeManager.requestInputMode(Keyboard)) {
-                            item4.requestFocus()
+            modifier =
+                Modifier.focusAwareBackground()
+                    .focusRequester(item4)
+                    .pointerInput(item4) {
+                        detectTapGestures {
+                            @OptIn(ExperimentalComposeUiApi::class)
+                            if (localInputModeManager.requestInputMode(Keyboard)) {
+                                item4.requestFocus()
+                            }
                         }
                     }
-                }
-                .focusProperties { canFocus = localInputModeManager.inputMode == Keyboard }
-                .focusable()
+                    .focusProperties { canFocus = localInputModeManager.inputMode == Keyboard }
+                    .focusable()
         )
     }
 }
 
 private fun Modifier.focusAwareBackground() = composed {
     var color by remember { mutableStateOf(Gray) }
-    Modifier
-        .padding(10.dp)
-        .size(150.dp, 50.dp)
-        .background(color)
-        .onFocusChanged { color = if (it.isFocused) Red else Gray }
+    Modifier.padding(10.dp).size(150.dp, 50.dp).background(color).onFocusChanged {
+        color = if (it.isFocused) Red else Gray
+    }
 }
diff --git a/compose/ui/ui/integration-tests/ui-demos/src/main/java/androidx/compose/ui/demos/focus/CustomFocusOrderDemo.kt b/compose/ui/ui/integration-tests/ui-demos/src/main/java/androidx/compose/ui/demos/focus/CustomFocusOrderDemo.kt
index 48ad51e..761999a 100644
--- a/compose/ui/ui/integration-tests/ui-demos/src/main/java/androidx/compose/ui/demos/focus/CustomFocusOrderDemo.kt
+++ b/compose/ui/ui/integration-tests/ui-demos/src/main/java/androidx/compose/ui/demos/focus/CustomFocusOrderDemo.kt
@@ -49,11 +49,7 @@
 @Composable
 fun CustomFocusOrderDemo() {
     Column {
-        Row {
-            Text(
-                "Use the arrow keys to move focus left/right/up/down."
-            )
-        }
+        Row { Text("Use the arrow keys to move focus left/right/up/down.") }
         Column(Modifier.fillMaxSize(), SpaceEvenly) {
             val (item1, item2, item3, item4) = remember { FocusRequester.createRefs() }
             var wrapAround by remember { mutableStateOf(false) }
@@ -62,49 +58,45 @@
                 Switch(checked = wrapAround, onCheckedChange = { wrapAround = !wrapAround })
             }
             Row(Modifier.fillMaxWidth(), SpaceEvenly) {
-                    FocusableText(
-                        text = "1",
-                        modifier = Modifier
-                            .focusRequester(item1)
-                            .focusProperties {
-                                left = if (wrapAround) item2 else Default
-                                up = if (wrapAround) item3 else Default
-                            }
-                    )
-                        FocusableText(
-                        text = "2",
-                        modifier = Modifier
-                            .focusRequester(item2)
-                            .focusProperties {
-                                right = if (wrapAround) item1 else Default
-                                up = if (wrapAround) item4 else Default
-                            }
-                    )
-                }
-                Row(Modifier.fillMaxWidth(), SpaceEvenly) {
-                    FocusableText(
-                        text = "3",
-                        modifier = Modifier
-                            .focusRequester(item3)
-                            .focusProperties {
-                                left = if (wrapAround) item4 else Default
-                                down = if (wrapAround) item1 else Default
-                            }
-                    )
-                    FocusableText(
-                        text = "4",
-                        modifier = Modifier
-                            .focusRequester(item4)
-                            .focusProperties {
-                                right = if (wrapAround) item3 else Default
-                                down = if (wrapAround) item2 else Default
-                            }
-                    )
-                }
-                DisposableEffect(Unit) {
-                    item1.requestFocus()
-                    onDispose { }
-                }
+                FocusableText(
+                    text = "1",
+                    modifier =
+                        Modifier.focusRequester(item1).focusProperties {
+                            left = if (wrapAround) item2 else Default
+                            up = if (wrapAround) item3 else Default
+                        }
+                )
+                FocusableText(
+                    text = "2",
+                    modifier =
+                        Modifier.focusRequester(item2).focusProperties {
+                            right = if (wrapAround) item1 else Default
+                            up = if (wrapAround) item4 else Default
+                        }
+                )
+            }
+            Row(Modifier.fillMaxWidth(), SpaceEvenly) {
+                FocusableText(
+                    text = "3",
+                    modifier =
+                        Modifier.focusRequester(item3).focusProperties {
+                            left = if (wrapAround) item4 else Default
+                            down = if (wrapAround) item1 else Default
+                        }
+                )
+                FocusableText(
+                    text = "4",
+                    modifier =
+                        Modifier.focusRequester(item4).focusProperties {
+                            right = if (wrapAround) item3 else Default
+                            down = if (wrapAround) item2 else Default
+                        }
+                )
+            }
+            DisposableEffect(Unit) {
+                item1.requestFocus()
+                onDispose {}
+            }
         }
     }
 }
@@ -114,13 +106,14 @@
     var color by remember { mutableStateOf(Black) }
     val focusRequester = remember { FocusRequester() }
     Text(
-        modifier = modifier
-            .border(width = 1.dp, color = Black)
-            .requiredWidth(50.dp)
-            .focusRequester(focusRequester)
-            .onFocusChanged { color = if (it.isFocused) Green else Black }
-            .focusTarget()
-            .pointerInput(Unit) { detectTapGestures { focusRequester.requestFocus() } },
+        modifier =
+            modifier
+                .border(width = 1.dp, color = Black)
+                .requiredWidth(50.dp)
+                .focusRequester(focusRequester)
+                .onFocusChanged { color = if (it.isFocused) Green else Black }
+                .focusTarget()
+                .pointerInput(Unit) { detectTapGestures { focusRequester.requestFocus() } },
         text = text,
         fontSize = 40.sp,
         textAlign = TextAlign.Center,
diff --git a/compose/ui/ui/integration-tests/ui-demos/src/main/java/androidx/compose/ui/demos/focus/ExplicitEnterExitWithCustomFocusEnterExitDemo.kt b/compose/ui/ui/integration-tests/ui-demos/src/main/java/androidx/compose/ui/demos/focus/ExplicitEnterExitWithCustomFocusEnterExitDemo.kt
index d332b09..091bed4 100644
--- a/compose/ui/ui/integration-tests/ui-demos/src/main/java/androidx/compose/ui/demos/focus/ExplicitEnterExitWithCustomFocusEnterExitDemo.kt
+++ b/compose/ui/ui/integration-tests/ui-demos/src/main/java/androidx/compose/ui/demos/focus/ExplicitEnterExitWithCustomFocusEnterExitDemo.kt
@@ -43,13 +43,15 @@
     val (top, row, item1, item2, item3, bottom) = remember { FocusRequester.createRefs() }
     val inputModeManager = LocalInputModeManager.current
     Column {
-        Text("""
+        Text(
+            """
             Click on the top button to request focus on the row, which focuses on item 2.
             Entering the row from the top focuses on item 1.
             Entering the row from the bottom focusses on item 3.
             Exiting the row from the left focuses on the top button.
             Exiting the row from right focuses on the bottom button.
-            """.trimIndent()
+            """
+                .trimIndent()
         )
         Button(
             onClick = {
@@ -67,8 +69,7 @@
         }
 
         Row(
-            Modifier
-                .focusRequester(row)
+            Modifier.focusRequester(row)
                 .focusProperties {
                     enter = {
                         when (it) {
diff --git a/compose/ui/ui/integration-tests/ui-demos/src/main/java/androidx/compose/ui/demos/focus/FocusInDialogDemo.kt b/compose/ui/ui/integration-tests/ui-demos/src/main/java/androidx/compose/ui/demos/focus/FocusInDialogDemo.kt
index e8d5c94..604b41c6 100644
--- a/compose/ui/ui/integration-tests/ui-demos/src/main/java/androidx/compose/ui/demos/focus/FocusInDialogDemo.kt
+++ b/compose/ui/ui/integration-tests/ui-demos/src/main/java/androidx/compose/ui/demos/focus/FocusInDialogDemo.kt
@@ -46,9 +46,7 @@
     Column(Modifier.background(if (windowInfo.isWindowFocused) White else LightGray)) {
         Text("Click the button to show the dialog. Click outside the dialog to dismiss it.")
         Spacer(Modifier.requiredHeight(10.dp))
-        Button(onClick = { showDialog = true }) {
-            Text("Show Dialog")
-        }
+        Button(onClick = { showDialog = true }) { Text("Show Dialog") }
 
         Spacer(Modifier.requiredHeight(50.dp))
 
diff --git a/compose/ui/ui/integration-tests/ui-demos/src/main/java/androidx/compose/ui/demos/focus/FocusInPopupDemo.kt b/compose/ui/ui/integration-tests/ui-demos/src/main/java/androidx/compose/ui/demos/focus/FocusInPopupDemo.kt
index 39f1676..b4aa63e 100644
--- a/compose/ui/ui/integration-tests/ui-demos/src/main/java/androidx/compose/ui/demos/focus/FocusInPopupDemo.kt
+++ b/compose/ui/ui/integration-tests/ui-demos/src/main/java/androidx/compose/ui/demos/focus/FocusInPopupDemo.kt
@@ -48,9 +48,7 @@
     Column(Modifier.background(if (windowInfo.isWindowFocused) White else LightGray)) {
         Text("Click the button to show the popup. Click outside the popup to dismiss it.")
         Spacer(Modifier.requiredHeight(10.dp))
-        Button(onClick = { showPopup = true }) {
-            Text("Show Popup")
-        }
+        Button(onClick = { showPopup = true }) { Text("Show Popup") }
 
         Spacer(Modifier.requiredHeight(50.dp))
 
diff --git a/compose/ui/ui/integration-tests/ui-demos/src/main/java/androidx/compose/ui/demos/focus/FocusManagerMoveFocusDemo.kt b/compose/ui/ui/integration-tests/ui-demos/src/main/java/androidx/compose/ui/demos/focus/FocusManagerMoveFocusDemo.kt
index a33bbe3..8378043 100644
--- a/compose/ui/ui/integration-tests/ui-demos/src/main/java/androidx/compose/ui/demos/focus/FocusManagerMoveFocusDemo.kt
+++ b/compose/ui/ui/integration-tests/ui-demos/src/main/java/androidx/compose/ui/demos/focus/FocusManagerMoveFocusDemo.kt
@@ -81,9 +81,8 @@
             Row(Modifier.fillMaxWidth(), SpaceEvenly) {
                 FocusableText(
                     text = "1",
-                    modifier = Modifier
-                        .focusRequester(item1)
-                        .focusProperties {
+                    modifier =
+                        Modifier.focusRequester(item1).focusProperties {
                             previous = item4
                             next = item2
                             right = item2
@@ -92,9 +91,8 @@
                 )
                 FocusableText(
                     text = "2",
-                    modifier = Modifier
-                        .focusRequester(item2)
-                        .focusProperties {
+                    modifier =
+                        Modifier.focusRequester(item2).focusProperties {
                             previous = item1
                             next = item3
                             left = item1
@@ -105,9 +103,8 @@
             Row(Modifier.fillMaxWidth(), SpaceEvenly) {
                 FocusableText(
                     text = "3",
-                    modifier = Modifier
-                        .focusRequester(item3)
-                        .focusProperties {
+                    modifier =
+                        Modifier.focusRequester(item3).focusProperties {
                             previous = item2
                             next = item4
                             right = item4
@@ -116,9 +113,8 @@
                 )
                 FocusableText(
                     text = "4",
-                    modifier = Modifier
-                        .focusRequester(item4)
-                        .focusProperties {
+                    modifier =
+                        Modifier.focusRequester(item4).focusProperties {
                             previous = item3
                             next = item1
                             left = item3
@@ -128,7 +124,7 @@
             }
             DisposableEffect(Unit) {
                 item1.requestFocus()
-                onDispose { }
+                onDispose {}
             }
         }
     }
@@ -139,13 +135,14 @@
     var color by remember { mutableStateOf(Black) }
     val focusRequester = remember { FocusRequester() }
     Text(
-        modifier = modifier
-            .border(width = 1.dp, color = Black)
-            .requiredWidth(50.dp)
-            .focusRequester(focusRequester)
-            .onFocusChanged { color = if (it.isFocused) Green else Black }
-            .focusTarget()
-            .pointerInput(Unit) { detectTapGestures { focusRequester.requestFocus() } },
+        modifier =
+            modifier
+                .border(width = 1.dp, color = Black)
+                .requiredWidth(50.dp)
+                .focusRequester(focusRequester)
+                .onFocusChanged { color = if (it.isFocused) Green else Black }
+                .focusTarget()
+                .pointerInput(Unit) { detectTapGestures { focusRequester.requestFocus() } },
         text = text,
         fontSize = 40.sp,
         textAlign = TextAlign.Center,
diff --git a/compose/ui/ui/integration-tests/ui-demos/src/main/java/androidx/compose/ui/demos/focus/FocusRestorationDemo.kt b/compose/ui/ui/integration-tests/ui-demos/src/main/java/androidx/compose/ui/demos/focus/FocusRestorationDemo.kt
index aa8a43f..211a082 100644
--- a/compose/ui/ui/integration-tests/ui-demos/src/main/java/androidx/compose/ui/demos/focus/FocusRestorationDemo.kt
+++ b/compose/ui/ui/integration-tests/ui-demos/src/main/java/androidx/compose/ui/demos/focus/FocusRestorationDemo.kt
@@ -43,7 +43,8 @@
                 Use the DPad to move focus among these three rows
                 and notice how focus is restored to the previously
                 focused item.
-            """.trimIndent()
+            """
+                .trimIndent()
         )
         // Adding a focusRestorer and a focus group.
         Row(Modifier.focusRestorer().focusGroup()) {
@@ -62,12 +63,13 @@
         // Using a focusRequester to manually restore focus.
         val focusRequester = remember { FocusRequester() }
         LazyRow(
-            Modifier
-                .focusRequester(focusRequester)
-                .focusProperties {
-                    exit = { focusRequester.saveFocusedChild(); Default }
-                    enter = { if (focusRequester.restoreFocusedChild()) Cancel else Default }
+            Modifier.focusRequester(focusRequester).focusProperties {
+                exit = {
+                    focusRequester.saveFocusedChild()
+                    Default
                 }
+                enter = { if (focusRequester.restoreFocusedChild()) Cancel else Default }
+            }
         ) {
             item { Button("1") }
             item { Button("2") }
@@ -76,6 +78,7 @@
         }
     }
 }
+
 @Composable
 private fun Button(text: String) {
     Button(onClick = {}) { Text(text) }
diff --git a/compose/ui/ui/integration-tests/ui-demos/src/main/java/androidx/compose/ui/demos/focus/FocusableDemo.kt b/compose/ui/ui/integration-tests/ui-demos/src/main/java/androidx/compose/ui/demos/focus/FocusableDemo.kt
index 341e98d..ddc4b25 100644
--- a/compose/ui/ui/integration-tests/ui-demos/src/main/java/androidx/compose/ui/demos/focus/FocusableDemo.kt
+++ b/compose/ui/ui/integration-tests/ui-demos/src/main/java/androidx/compose/ui/demos/focus/FocusableDemo.kt
@@ -38,21 +38,11 @@
 
 @Composable
 fun FocusableDemo() {
-    Column(
-        verticalArrangement = Arrangement.SpaceEvenly
-    ) {
-        CenteredRow {
-            Text("Click on any focusable to bring it into focus:")
-        }
-        CenteredRow {
-            FocusableText("Focusable 1")
-        }
-        CenteredRow {
-            FocusableText("Focusable 2")
-        }
-        CenteredRow {
-            FocusableText("Focusable 3")
-        }
+    Column(verticalArrangement = Arrangement.SpaceEvenly) {
+        CenteredRow { Text("Click on any focusable to bring it into focus:") }
+        CenteredRow { FocusableText("Focusable 1") }
+        CenteredRow { FocusableText("Focusable 2") }
+        CenteredRow { FocusableText("Focusable 3") }
     }
 }
 
@@ -61,11 +51,11 @@
     var color by remember { mutableStateOf(Black) }
     val focusRequester = remember { FocusRequester() }
     Text(
-        modifier = Modifier
-            .focusRequester(focusRequester)
-            .onFocusChanged { color = if (it.isFocused) Green else Black }
-            .focusTarget()
-            .pointerInput(Unit) { detectTapGestures { focusRequester.requestFocus() } },
+        modifier =
+            Modifier.focusRequester(focusRequester)
+                .onFocusChanged { color = if (it.isFocused) Green else Black }
+                .focusTarget()
+                .pointerInput(Unit) { detectTapGestures { focusRequester.requestFocus() } },
         text = text,
         color = color
     )
diff --git a/compose/ui/ui/integration-tests/ui-demos/src/main/java/androidx/compose/ui/demos/focus/LazyListChildFocusDemos.kt b/compose/ui/ui/integration-tests/ui-demos/src/main/java/androidx/compose/ui/demos/focus/LazyListChildFocusDemos.kt
index 99049d9..de948ee 100644
--- a/compose/ui/ui/integration-tests/ui-demos/src/main/java/androidx/compose/ui/demos/focus/LazyListChildFocusDemos.kt
+++ b/compose/ui/ui/integration-tests/ui-demos/src/main/java/androidx/compose/ui/demos/focus/LazyListChildFocusDemos.kt
@@ -54,13 +54,7 @@
 fun LazyListChildFocusDemos() {
     LazyColumn {
         stickyHeader { Text("Default Compose Behavior") }
-        item {
-            LazyRow {
-                items(10) {
-                    FocusableBox()
-                }
-            }
-        }
+        item { LazyRow { items(10) { FocusableBox() } } }
 
         stickyHeader { Text("Direct Focus to First Child") }
         item {
@@ -69,19 +63,17 @@
             val coroutineScope = rememberCoroutineScope()
             val state = rememberLazyListState()
             LazyRow(
-                Modifier
-                    .onFocusChanged {
-                        if (it.isFocused) coroutineScope.launch {
-                            state.animateScrollToItem(0)
-                            firstItem.requestFocus()
-                        }
+                Modifier.onFocusChanged {
+                        if (it.isFocused)
+                            coroutineScope.launch {
+                                state.animateScrollToItem(0)
+                                firstItem.requestFocus()
+                            }
                     }
                     .focusable(),
                 state,
             ) {
-                items(10) {
-                    FocusableBox(if (it == 0) firstItemModifier else Modifier)
-                }
+                items(10) { FocusableBox(if (it == 0) firstItemModifier else Modifier) }
             }
         }
 
@@ -89,24 +81,25 @@
         item {
             var previouslyFocusedItem: FocusRequester? by remember { mutableStateOf(null) }
             LazyRow(
-                Modifier
-                    .focusProperties {
-                        @OptIn(ExperimentalComposeUiApi::class)
-                        enter = { previouslyFocusedItem ?: Default }
+                Modifier.focusProperties {
+                    @OptIn(ExperimentalComposeUiApi::class)
+                    enter = {
+                        previouslyFocusedItem ?: Default
                     }
+                }
             ) {
                 items(10) { index ->
                     val focusRequester = remember(index) { FocusRequester() }
                     val pinnableContainer = LocalPinnableContainer.current
                     var pinnedHandle: PinnableContainer.PinnedHandle? = null
-                    FocusableBox(Modifier
-                        .onFocusChanged {
-                            if (it.isFocused) {
-                                previouslyFocusedItem = focusRequester
-                                pinnedHandle = pinnableContainer?.pin()
+                    FocusableBox(
+                        Modifier.onFocusChanged {
+                                if (it.isFocused) {
+                                    previouslyFocusedItem = focusRequester
+                                    pinnedHandle = pinnableContainer?.pin()
+                                }
                             }
-                        }
-                        .focusRequester(focusRequester)
+                            .focusRequester(focusRequester)
                     )
                     DisposableEffect(pinnableContainer) {
                         onDispose {
@@ -127,12 +120,13 @@
 ) {
     var borderColor by remember { mutableStateOf(Color.Black) }
     Box(
-        modifier = modifier
-            .size(100.dp)
-            .padding(2.dp)
-            .onFocusChanged { borderColor = if (it.isFocused) Color.Red else Color.Black }
-            .border(2.dp, borderColor)
-            .focusable(),
+        modifier =
+            modifier
+                .size(100.dp)
+                .padding(2.dp)
+                .onFocusChanged { borderColor = if (it.isFocused) Color.Red else Color.Black }
+                .border(2.dp, borderColor)
+                .focusable(),
         content = content
     )
 }
diff --git a/compose/ui/ui/integration-tests/ui-demos/src/main/java/androidx/compose/ui/demos/focus/NestedLazyListFocusSearchDemo.kt b/compose/ui/ui/integration-tests/ui-demos/src/main/java/androidx/compose/ui/demos/focus/NestedLazyListFocusSearchDemo.kt
index e6bf253..9f33508 100644
--- a/compose/ui/ui/integration-tests/ui-demos/src/main/java/androidx/compose/ui/demos/focus/NestedLazyListFocusSearchDemo.kt
+++ b/compose/ui/ui/integration-tests/ui-demos/src/main/java/androidx/compose/ui/demos/focus/NestedLazyListFocusSearchDemo.kt
@@ -52,12 +52,12 @@
                             text = "$verticalIndex,$horizontalIndex",
                             fontSize = 50.sp,
                             textAlign = Center,
-                            modifier = Modifier
-                                .size(100.dp)
-                                .border(2.dp, Color.Gray)
-                                .onFocusChanged { color = if (it.isFocused) Red else White }
-                                .background(color)
-                                .focusable()
+                            modifier =
+                                Modifier.size(100.dp)
+                                    .border(2.dp, Color.Gray)
+                                    .onFocusChanged { color = if (it.isFocused) Red else White }
+                                    .background(color)
+                                    .focusable()
                         )
                     }
                 }
diff --git a/compose/ui/ui/integration-tests/ui-demos/src/main/java/androidx/compose/ui/demos/focus/ReuseFocusReference.kt b/compose/ui/ui/integration-tests/ui-demos/src/main/java/androidx/compose/ui/demos/focus/ReuseFocusReference.kt
index 1c37922..a971a8f 100644
--- a/compose/ui/ui/integration-tests/ui-demos/src/main/java/androidx/compose/ui/demos/focus/ReuseFocusReference.kt
+++ b/compose/ui/ui/integration-tests/ui-demos/src/main/java/androidx/compose/ui/demos/focus/ReuseFocusReference.kt
@@ -41,13 +41,14 @@
 
 private const val size = 200f
 
-private enum class CurrentShape { Circle, Square }
+private enum class CurrentShape {
+    Circle,
+    Square
+}
 
 @Composable
 fun ReuseFocusRequesterDemo() {
-    Column(
-        verticalArrangement = Arrangement.Top
-    ) {
+    Column(verticalArrangement = Arrangement.Top) {
         Text(
             "Click to Focus on the shape. The focused shape disappears, and is replaced by " +
                 "another shape. The same focus requester is used for both shapes."
@@ -58,18 +59,22 @@
 
         var shape by remember { mutableStateOf(CurrentShape.Square) }
         when (shape) {
-            CurrentShape.Circle -> Circle(
-                modifier = Modifier
-                    .focusRequester(focusRequester)
-                    .pointerInput(Unit) { detectTapGestures { focusRequester.requestFocus() } },
-                nextShape = { shape = CurrentShape.Square }
-            )
-            CurrentShape.Square -> Square(
-                modifier = Modifier
-                    .focusRequester(focusRequester)
-                    .pointerInput(Unit) { detectTapGestures { focusRequester.requestFocus() } },
-                nextShape = { shape = CurrentShape.Circle }
-            )
+            CurrentShape.Circle ->
+                Circle(
+                    modifier =
+                        Modifier.focusRequester(focusRequester).pointerInput(Unit) {
+                            detectTapGestures { focusRequester.requestFocus() }
+                        },
+                    nextShape = { shape = CurrentShape.Square }
+                )
+            CurrentShape.Square ->
+                Square(
+                    modifier =
+                        Modifier.focusRequester(focusRequester).pointerInput(Unit) {
+                            detectTapGestures { focusRequester.requestFocus() }
+                        },
+                    nextShape = { shape = CurrentShape.Circle }
+                )
         }
     }
 }
@@ -77,18 +82,14 @@
 @Composable
 private fun Circle(modifier: Modifier = Modifier, nextShape: () -> Unit) {
     var isFocused by remember { mutableStateOf(false) }
-    val scale by animateFloatAsState(if (isFocused) 0f else 1f, TweenSpec(2000)) {
-        if (it == 0f) {
-            nextShape()
+    val scale by
+        animateFloatAsState(if (isFocused) 0f else 1f, TweenSpec(2000)) {
+            if (it == 0f) {
+                nextShape()
+            }
         }
-    }
     val radius = size / 2
-    Canvas(
-        modifier
-            .onFocusChanged { isFocused = it.isFocused }
-            .fillMaxSize()
-            .focusTarget()
-    ) {
+    Canvas(modifier.onFocusChanged { isFocused = it.isFocused }.fillMaxSize().focusTarget()) {
         drawCircle(
             color = if (isFocused) Color.Red else Color.Blue,
             radius = radius * scale,
@@ -100,23 +101,17 @@
 @Composable
 private fun Square(modifier: Modifier = Modifier, nextShape: () -> Unit) {
     var isFocused by remember { mutableStateOf(false) }
-    val scale by animateFloatAsState(if (isFocused) 0f else 1f, TweenSpec(2000)) {
-        if (it == 0f) {
-            nextShape()
+    val scale by
+        animateFloatAsState(if (isFocused) 0f else 1f, TweenSpec(2000)) {
+            if (it == 0f) {
+                nextShape()
+            }
         }
-    }
     val side = size
-    Canvas(
-        modifier
-            .onFocusChanged { isFocused = it.isFocused }
-            .fillMaxSize()
-            .focusTarget()
-    ) {
+    Canvas(modifier.onFocusChanged { isFocused = it.isFocused }.fillMaxSize().focusTarget()) {
         drawRect(
             color = if (isFocused) Color.Red else Color.Blue,
-            topLeft = Offset(
-                center.x - side / 2 * scale, center.y - side / 2 * scale
-            ),
+            topLeft = Offset(center.x - side / 2 * scale, center.y - side / 2 * scale),
             size = Size(side * scale, side * scale)
         )
     }
diff --git a/compose/ui/ui/integration-tests/ui-demos/src/main/java/androidx/compose/ui/demos/focus/ScrollableLazyRowFocusDemo.kt b/compose/ui/ui/integration-tests/ui-demos/src/main/java/androidx/compose/ui/demos/focus/ScrollableLazyRowFocusDemo.kt
index e1302ca..d643e9a 100644
--- a/compose/ui/ui/integration-tests/ui-demos/src/main/java/androidx/compose/ui/demos/focus/ScrollableLazyRowFocusDemo.kt
+++ b/compose/ui/ui/integration-tests/ui-demos/src/main/java/androidx/compose/ui/demos/focus/ScrollableLazyRowFocusDemo.kt
@@ -64,12 +64,13 @@
         text = text,
         fontSize = 50.sp,
         textAlign = TextAlign.Center,
-        modifier = modifier
-            .size(100.dp)
-            .border(2.dp, Color.Black)
-            .onFocusChanged { color = if (it.isFocused) Color.Red else Color.White }
-            .background(color)
-            .focusable()
+        modifier =
+            modifier
+                .size(100.dp)
+                .border(2.dp, Color.Black)
+                .onFocusChanged { color = if (it.isFocused) Color.Red else Color.White }
+                .background(color)
+                .focusable()
     )
 }
 
@@ -79,9 +80,6 @@
         text = text,
         fontSize = 50.sp,
         textAlign = TextAlign.Center,
-        modifier = modifier
-            .size(100.dp)
-            .border(2.dp, Color.Black)
-            .background(Color.White)
+        modifier = modifier.size(100.dp).border(2.dp, Color.Black).background(Color.White)
     )
 }
diff --git a/compose/ui/ui/integration-tests/ui-demos/src/main/java/androidx/compose/ui/demos/focus/ScrollableRowFocusDemo.kt b/compose/ui/ui/integration-tests/ui-demos/src/main/java/androidx/compose/ui/demos/focus/ScrollableRowFocusDemo.kt
index 142c95e..ac895927 100644
--- a/compose/ui/ui/integration-tests/ui-demos/src/main/java/androidx/compose/ui/demos/focus/ScrollableRowFocusDemo.kt
+++ b/compose/ui/ui/integration-tests/ui-demos/src/main/java/androidx/compose/ui/demos/focus/ScrollableRowFocusDemo.kt
@@ -44,9 +44,7 @@
     Column {
         Text("Use the dpad or arrow keys to move focus")
         Row(Modifier.horizontalScroll(rememberScrollState())) {
-            repeat(20) {
-                FocusableBox(it.toString())
-            }
+            repeat(20) { FocusableBox(it.toString()) }
         }
     }
 }
@@ -58,11 +56,12 @@
         text = text,
         fontSize = 50.sp,
         textAlign = TextAlign.Center,
-        modifier = modifier
-            .size(100.dp)
-            .border(2.dp, Black)
-            .onFocusChanged { color = if (it.isFocused) Red else White }
-            .background(color)
-            .focusable()
+        modifier =
+            modifier
+                .size(100.dp)
+                .border(2.dp, Black)
+                .onFocusChanged { color = if (it.isFocused) Red else White }
+                .background(color)
+                .focusable()
     )
 }
diff --git a/compose/ui/ui/integration-tests/ui-demos/src/main/java/androidx/compose/ui/demos/focus/TwoDimentionalFocusSearchDemo.kt b/compose/ui/ui/integration-tests/ui-demos/src/main/java/androidx/compose/ui/demos/focus/TwoDimentionalFocusSearchDemo.kt
index eaf6f4f..6c7b28f 100644
--- a/compose/ui/ui/integration-tests/ui-demos/src/main/java/androidx/compose/ui/demos/focus/TwoDimentionalFocusSearchDemo.kt
+++ b/compose/ui/ui/integration-tests/ui-demos/src/main/java/androidx/compose/ui/demos/focus/TwoDimentionalFocusSearchDemo.kt
@@ -86,10 +86,11 @@
 ) {
     var borderColor by remember { mutableStateOf(Black) }
     Box(
-        modifier = modifier
-            .onFocusChanged { borderColor = if (it.isFocused) Red else Black }
-            .border(2.dp, borderColor)
-            .focusable(),
+        modifier =
+            modifier
+                .onFocusChanged { borderColor = if (it.isFocused) Red else Black }
+                .border(2.dp, borderColor)
+                .focusable(),
         content = content
     )
 }
diff --git a/compose/ui/ui/integration-tests/ui-demos/src/main/java/androidx/compose/ui/demos/gestures/ButtonMetaStateDemo.kt b/compose/ui/ui/integration-tests/ui-demos/src/main/java/androidx/compose/ui/demos/gestures/ButtonMetaStateDemo.kt
index 3740ea8..eef3680 100644
--- a/compose/ui/ui/integration-tests/ui-demos/src/main/java/androidx/compose/ui/demos/gestures/ButtonMetaStateDemo.kt
+++ b/compose/ui/ui/integration-tests/ui-demos/src/main/java/androidx/compose/ui/demos/gestures/ButtonMetaStateDemo.kt
@@ -45,9 +45,7 @@
 import androidx.compose.ui.input.pointer.isTertiaryPressed
 import androidx.compose.ui.input.pointer.pointerInput
 
-/**
- * Demo to show the state of buttons and meta keys
- */
+/** Demo to show the state of buttons and meta keys */
 @Composable
 fun ButtonMetaStateDemo() {
     var control by remember { mutableStateOf(false) }
diff --git a/compose/ui/ui/integration-tests/ui-demos/src/main/java/androidx/compose/ui/demos/gestures/Colors.kt b/compose/ui/ui/integration-tests/ui-demos/src/main/java/androidx/compose/ui/demos/gestures/Colors.kt
index 36f106b..32e2669 100644
--- a/compose/ui/ui/integration-tests/ui-demos/src/main/java/androidx/compose/ui/demos/gestures/Colors.kt
+++ b/compose/ui/ui/integration-tests/ui-demos/src/main/java/androidx/compose/ui/demos/gestures/Colors.kt
@@ -43,31 +43,33 @@
 internal val Grey = Color(0xFF9e9e9e)
 internal val BlueGrey = Color(0xFF607d8b)
 
-internal val Colors = listOf(
-    Red,
-    Pink,
-    Purple,
-    DeepPurple,
-    Indigo,
-    Blue,
-    LightBlue,
-    Cyan,
-    Teal,
-    Green,
-    LightGreen,
-    Lime,
-    Yellow,
-    Amber,
-    Orange,
-    DeepOrange,
-    Brown,
-    Grey,
-    BlueGrey
-)
+internal val Colors =
+    listOf(
+        Red,
+        Pink,
+        Purple,
+        DeepPurple,
+        Indigo,
+        Blue,
+        LightBlue,
+        Cyan,
+        Teal,
+        Green,
+        LightGreen,
+        Lime,
+        Yellow,
+        Amber,
+        Orange,
+        DeepOrange,
+        Brown,
+        Grey,
+        BlueGrey
+    )
 
 internal fun Color.anotherRandomColor() = Colors.random(this)
 
 internal fun Color.next() = Colors.inOrder(this, true)
+
 internal fun Color.prev() = Colors.inOrder(this, false)
 
 private fun List<Color>.random(exclude: Color?): Color {
@@ -75,13 +77,14 @@
 
     val max = size - if (excludeIndex >= 0) 1 else 0
 
-    val random = Random.nextInt(max).run {
-        if (excludeIndex >= 0 && this >= excludeIndex) {
-            this + 1
-        } else {
-            this
+    val random =
+        Random.nextInt(max).run {
+            if (excludeIndex >= 0 && this >= excludeIndex) {
+                this + 1
+            } else {
+                this
+            }
         }
-    }
 
     return this[random]
 }
diff --git a/compose/ui/ui/integration-tests/ui-demos/src/main/java/androidx/compose/ui/demos/gestures/DoubleTapGestureDetectorDemo.kt b/compose/ui/ui/integration-tests/ui-demos/src/main/java/androidx/compose/ui/demos/gestures/DoubleTapGestureDetectorDemo.kt
index a0267ae..c639995 100644
--- a/compose/ui/ui/integration-tests/ui-demos/src/main/java/androidx/compose/ui/demos/gestures/DoubleTapGestureDetectorDemo.kt
+++ b/compose/ui/ui/integration-tests/ui-demos/src/main/java/androidx/compose/ui/demos/gestures/DoubleTapGestureDetectorDemo.kt
@@ -34,16 +34,12 @@
 import androidx.compose.ui.input.pointer.pointerInput
 import androidx.compose.ui.unit.dp
 
-/**
- * Simple [detectTapGestures] demo for double tap.
- */
+/** Simple [detectTapGestures] demo for double tap. */
 @Composable
 fun DoubleTapGestureFilterDemo() {
     val color = remember { mutableStateOf(Colors.random()) }
 
-    val onDoubleTap: (Offset) -> Unit = {
-        color.value = color.value.anotherRandomColor()
-    }
+    val onDoubleTap: (Offset) -> Unit = { color.value = color.value.anotherRandomColor() }
 
     Column {
         Text("The box changes color when you double tap it.")
diff --git a/compose/ui/ui/integration-tests/ui-demos/src/main/java/androidx/compose/ui/demos/gestures/DoubleTapInTapDemo.kt b/compose/ui/ui/integration-tests/ui-demos/src/main/java/androidx/compose/ui/demos/gestures/DoubleTapInTapDemo.kt
index e06d701..379d1a9 100644
--- a/compose/ui/ui/integration-tests/ui-demos/src/main/java/androidx/compose/ui/demos/gestures/DoubleTapInTapDemo.kt
+++ b/compose/ui/ui/integration-tests/ui-demos/src/main/java/androidx/compose/ui/demos/gestures/DoubleTapInTapDemo.kt
@@ -42,13 +42,9 @@
     val innerColor = remember { mutableStateOf(defaultColor) }
     val outerColor = remember { mutableStateOf(defaultColor) }
 
-    val onTap: (Offset) -> Unit = {
-        outerColor.value = outerColor.value.next()
-    }
+    val onTap: (Offset) -> Unit = { outerColor.value = outerColor.value.next() }
 
-    val onDoubleTap: (Offset) -> Unit = { _ ->
-        innerColor.value = innerColor.value.prev()
-    }
+    val onDoubleTap: (Offset) -> Unit = { _ -> innerColor.value = innerColor.value.prev() }
 
     Column {
         Text(
@@ -63,8 +59,7 @@
                 "change as one would expect."
         )
         Box(
-            Modifier
-                .fillMaxSize()
+            Modifier.fillMaxSize()
                 .wrapContentSize(Alignment.Center)
                 .size(192.dp)
                 .pointerInput(Unit) { detectTapGestures(onTap = onTap) }
diff --git a/compose/ui/ui/integration-tests/ui-demos/src/main/java/androidx/compose/ui/demos/gestures/DragScaleGestureDetectorDemo.kt b/compose/ui/ui/integration-tests/ui-demos/src/main/java/androidx/compose/ui/demos/gestures/DragScaleGestureDetectorDemo.kt
index 3296bee..8e1a8bd 100644
--- a/compose/ui/ui/integration-tests/ui-demos/src/main/java/androidx/compose/ui/demos/gestures/DragScaleGestureDetectorDemo.kt
+++ b/compose/ui/ui/integration-tests/ui-demos/src/main/java/androidx/compose/ui/demos/gestures/DragScaleGestureDetectorDemo.kt
@@ -35,9 +35,7 @@
 import androidx.compose.ui.platform.LocalDensity
 import androidx.compose.ui.unit.dp
 
-/**
- * Simple demo that shows off how [detectTransformGestures] automatically pans and zooms.
- */
+/** Simple demo that shows off how [detectTransformGestures] automatically pans and zooms. */
 @Composable
 fun DragAndScaleGestureFilterDemo() {
     val size = remember { mutableStateOf(200.dp) }
diff --git a/compose/ui/ui/integration-tests/ui-demos/src/main/java/androidx/compose/ui/demos/gestures/DragSlopExceededGestureFilterDemo.kt b/compose/ui/ui/integration-tests/ui-demos/src/main/java/androidx/compose/ui/demos/gestures/DragSlopExceededGestureFilterDemo.kt
index 9834a47..ffccb4c 100644
--- a/compose/ui/ui/integration-tests/ui-demos/src/main/java/androidx/compose/ui/demos/gestures/DragSlopExceededGestureFilterDemo.kt
+++ b/compose/ui/ui/integration-tests/ui-demos/src/main/java/androidx/compose/ui/demos/gestures/DragSlopExceededGestureFilterDemo.kt
@@ -35,9 +35,7 @@
 import androidx.compose.ui.input.pointer.pointerInput
 import androidx.compose.ui.unit.dp
 
-/**
- * Simple [awaitTouchSlopOrCancellation] demo.
- */
+/** Simple [awaitTouchSlopOrCancellation] demo. */
 @Composable
 fun DragSlopExceededGestureFilterDemo() {
 
diff --git a/compose/ui/ui/integration-tests/ui-demos/src/main/java/androidx/compose/ui/demos/gestures/EventTypesDemo.kt b/compose/ui/ui/integration-tests/ui-demos/src/main/java/androidx/compose/ui/demos/gestures/EventTypesDemo.kt
index 6a760c1..1863f66 100644
--- a/compose/ui/ui/integration-tests/ui-demos/src/main/java/androidx/compose/ui/demos/gestures/EventTypesDemo.kt
+++ b/compose/ui/ui/integration-tests/ui-demos/src/main/java/androidx/compose/ui/demos/gestures/EventTypesDemo.kt
@@ -42,10 +42,7 @@
 @Composable
 private fun TextItem(text: String, color: Color) {
     Row {
-        Box(
-            Modifier
-                .size(25.dp)
-                .background(color))
+        Box(Modifier.size(25.dp).background(color))
         Spacer(Modifier.width(5.dp))
         Text(text, fontSize = 20.sp)
     }
@@ -56,23 +53,22 @@
     for (i in events.lastIndex downTo 0) {
         val (type, value) = events[i]
 
-        val color = when (type) {
-            PointerEventType.Press -> Color.Red
-            PointerEventType.Move -> Color(0xFFFFA500) // Orange
-            PointerEventType.Release -> Color.Yellow
-            PointerEventType.Enter -> Color.Green
-            PointerEventType.Exit -> Color.Blue
-            PointerEventType.Scroll -> Color(0xFF800080) // Purple
-            PointerEventType.Unknown -> Color.White
-            else -> Color.Black
-        }
+        val color =
+            when (type) {
+                PointerEventType.Press -> Color.Red
+                PointerEventType.Move -> Color(0xFFFFA500) // Orange
+                PointerEventType.Release -> Color.Yellow
+                PointerEventType.Enter -> Color.Green
+                PointerEventType.Exit -> Color.Blue
+                PointerEventType.Scroll -> Color(0xFF800080) // Purple
+                PointerEventType.Unknown -> Color.White
+                else -> Color.Black
+            }
         TextItem("$type $value", color)
     }
 }
 
-/**
- * Demo to show the event types that are sent
- */
+/** Demo to show the event types that are sent */
 @Composable
 fun EventTypesDemo() {
     val innerPointerEvents = remember { mutableStateListOf<Pair<PointerEventType, Any>>() }
@@ -88,9 +84,7 @@
             }
         }
     ) {
-        Column {
-            DrawEvents(outerPointerEvents)
-        }
+        Column { DrawEvents(outerPointerEvents) }
         Column(
             Modifier.size(200.dp)
                 .border(2.dp, Color.Black)
diff --git a/compose/ui/ui/integration-tests/ui-demos/src/main/java/androidx/compose/ui/demos/gestures/HorizontalScrollersInVerticalScrollerDemo.kt b/compose/ui/ui/integration-tests/ui-demos/src/main/java/androidx/compose/ui/demos/gestures/HorizontalScrollersInVerticalScrollerDemo.kt
index b686261..97c958b 100644
--- a/compose/ui/ui/integration-tests/ui-demos/src/main/java/androidx/compose/ui/demos/gestures/HorizontalScrollersInVerticalScrollerDemo.kt
+++ b/compose/ui/ui/integration-tests/ui-demos/src/main/java/androidx/compose/ui/demos/gestures/HorizontalScrollersInVerticalScrollerDemo.kt
@@ -47,9 +47,7 @@
 import androidx.compose.ui.unit.dp
 import kotlin.math.roundToInt
 
-/**
- * Demonstration for how multiple DragGestureDetectors interact.
- */
+/** Demonstration for how multiple DragGestureDetectors interact. */
 @Composable
 fun HorizontalScrollersInVerticalScrollersDemo() {
     Column {
@@ -65,10 +63,7 @@
                     Scrollable(Orientation.Horizontal) {
                         RepeatingRow(repetitions = 10) {
                             // Composable that indicates it is being pressed
-                            Pressable(
-                                width = 96.dp,
-                                height = 96.dp
-                            )
+                            Pressable(width = 96.dp, height = 96.dp)
                         }
                     }
                 }
@@ -77,9 +72,7 @@
     }
 }
 
-/**
- * A very simple ScrollView like implementation that allows for vertical scrolling.
- */
+/** A very simple ScrollView like implementation that allows for vertical scrolling. */
 @Composable
 private fun Scrollable(orientation: Orientation, content: @Composable () -> Unit) {
     val maxOffset = 0f
@@ -88,42 +81,44 @@
 
     Layout(
         content = content,
-        modifier = Modifier.scrollable(
-            orientation = orientation,
-            state = rememberScrollableState { scrollDistance ->
-                val resultingOffset = offset + scrollDistance
-                val toConsume =
-                    when {
-                        resultingOffset > maxOffset -> {
-                            maxOffset - offset
+        modifier =
+            Modifier.scrollable(
+                    orientation = orientation,
+                    state =
+                        rememberScrollableState { scrollDistance ->
+                            val resultingOffset = offset + scrollDistance
+                            val toConsume =
+                                when {
+                                    resultingOffset > maxOffset -> {
+                                        maxOffset - offset
+                                    }
+                                    resultingOffset < minOffset -> {
+                                        minOffset - offset
+                                    }
+                                    else -> {
+                                        scrollDistance
+                                    }
+                                }
+                            offset = offset + toConsume
+                            toConsume
                         }
-                        resultingOffset < minOffset -> {
-                            minOffset - offset
-                        }
-                        else -> {
-                            scrollDistance
-                        }
-                    }
-                offset = offset + toConsume
-                toConsume
-            }
-        )
-            .then(ClipModifier),
+                )
+                .then(ClipModifier),
         measurePolicy = { measurables, constraints ->
             val placeable =
                 when (orientation) {
-                    Orientation.Horizontal -> measurables.first().measure(
-                        constraints.copy(
-                            minWidth = 0,
-                            maxWidth = Constraints.Infinity
-                        )
-                    )
-                    Orientation.Vertical -> measurables.first().measure(
-                        constraints.copy(
-                            minHeight = 0,
-                            maxHeight = Constraints.Infinity
-                        )
-                    )
+                    Orientation.Horizontal ->
+                        measurables
+                            .first()
+                            .measure(
+                                constraints.copy(minWidth = 0, maxWidth = Constraints.Infinity)
+                            )
+                    Orientation.Vertical ->
+                        measurables
+                            .first()
+                            .measure(
+                                constraints.copy(minHeight = 0, maxHeight = Constraints.Infinity)
+                            )
                 }
 
             minOffset =
@@ -154,22 +149,16 @@
     )
 }
 
-private val ClipModifier = object : DrawModifier {
-    override fun ContentDrawScope.draw() {
-        clipRect {
-            this@draw.drawContent()
+private val ClipModifier =
+    object : DrawModifier {
+        override fun ContentDrawScope.draw() {
+            clipRect { this@draw.drawContent() }
         }
     }
-}
 
-/**
- * A very simple Button like implementation that visually indicates when it is being pressed.
- */
+/** A very simple Button like implementation that visually indicates when it is being pressed. */
 @Composable
-private fun Pressable(
-    width: Dp,
-    height: Dp
-) {
+private fun Pressable(width: Dp, height: Dp) {
 
     val pressedColor = PressedColor
     val defaultColor = Red
@@ -177,21 +166,13 @@
     val color = remember { mutableStateOf(defaultColor) }
     val showPressed = remember { mutableStateOf(false) }
 
-    val onPress: (Offset) -> Unit = {
-        showPressed.value = true
-    }
+    val onPress: (Offset) -> Unit = { showPressed.value = true }
 
-    val onRelease = {
-        showPressed.value = false
-    }
+    val onRelease = { showPressed.value = false }
 
-    val onTap: (Offset) -> Unit = {
-        color.value = color.value.next()
-    }
+    val onTap: (Offset) -> Unit = { color.value = color.value.next() }
 
-    val onDoubleTap: (Offset) -> Unit = {
-        color.value = color.value.prev()
-    }
+    val onDoubleTap: (Offset) -> Unit = { color.value = color.value.prev() }
 
     val onLongPress = { _: Offset ->
         color.value = defaultColor
@@ -199,8 +180,7 @@
     }
 
     val gestureDetectors =
-        Modifier
-            .pointerInput(Unit) {
+        Modifier.pointerInput(Unit) {
                 detectTapGestures(
                     onPress = {
                         onPress.invoke(it)
diff --git a/compose/ui/ui/integration-tests/ui-demos/src/main/java/androidx/compose/ui/demos/gestures/LongPressDragGestureDetectorDemo.kt b/compose/ui/ui/integration-tests/ui-demos/src/main/java/androidx/compose/ui/demos/gestures/LongPressDragGestureDetectorDemo.kt
index 8426140..9554a22 100644
--- a/compose/ui/ui/integration-tests/ui-demos/src/main/java/androidx/compose/ui/demos/gestures/LongPressDragGestureDetectorDemo.kt
+++ b/compose/ui/ui/integration-tests/ui-demos/src/main/java/androidx/compose/ui/demos/gestures/LongPressDragGestureDetectorDemo.kt
@@ -35,9 +35,7 @@
 import androidx.compose.ui.platform.LocalDensity
 import androidx.compose.ui.unit.dp
 
-/**
- * Simple [detectDragGesturesAfterLongPress] demo.
- */
+/** Simple [detectDragGesturesAfterLongPress] demo. */
 @Composable
 fun LongPressDragGestureFilterDemo() {
 
diff --git a/compose/ui/ui/integration-tests/ui-demos/src/main/java/androidx/compose/ui/demos/gestures/LongPressGestureDetectorDemo.kt b/compose/ui/ui/integration-tests/ui-demos/src/main/java/androidx/compose/ui/demos/gestures/LongPressGestureDetectorDemo.kt
index 9cec514..070c74e 100644
--- a/compose/ui/ui/integration-tests/ui-demos/src/main/java/androidx/compose/ui/demos/gestures/LongPressGestureDetectorDemo.kt
+++ b/compose/ui/ui/integration-tests/ui-demos/src/main/java/androidx/compose/ui/demos/gestures/LongPressGestureDetectorDemo.kt
@@ -35,16 +35,12 @@
 import androidx.compose.ui.input.pointer.pointerInput
 import androidx.compose.ui.unit.dp
 
-/**
- * Simple [detectTapGestures] demo for long press.
- */
+/** Simple [detectTapGestures] demo for long press. */
 @Composable
 fun LongPressGestureDetectorDemo() {
     val color = remember { mutableStateOf(Colors.random()) }
 
-    val onLongPress = { _: Offset ->
-        color.value = color.value.anotherRandomColor()
-    }
+    val onLongPress = { _: Offset -> color.value = color.value.anotherRandomColor() }
 
     Column {
         Text("The box changes color when you long press on it.")
diff --git a/compose/ui/ui/integration-tests/ui-demos/src/main/java/androidx/compose/ui/demos/gestures/MultiButtonsWithLogging.kt b/compose/ui/ui/integration-tests/ui-demos/src/main/java/androidx/compose/ui/demos/gestures/MultiButtonsWithLogging.kt
index c640def..9a41de8 100644
--- a/compose/ui/ui/integration-tests/ui-demos/src/main/java/androidx/compose/ui/demos/gestures/MultiButtonsWithLogging.kt
+++ b/compose/ui/ui/integration-tests/ui-demos/src/main/java/androidx/compose/ui/demos/gestures/MultiButtonsWithLogging.kt
@@ -44,29 +44,28 @@
 
     Column(modifier = Modifier.fillMaxSize()) {
         Row(horizontalArrangement = Arrangement.spacedBy(8.dp)) {
-            Button(onClick = {
-                Toast.makeText(context, "Button 1 Clicked", Toast.LENGTH_SHORT).show()
-                val newString = "Button 1 Clicked\n$output"
-                output = newString
-            }) {
+            Button(
+                onClick = {
+                    Toast.makeText(context, "Button 1 Clicked", Toast.LENGTH_SHORT).show()
+                    val newString = "Button 1 Clicked\n$output"
+                    output = newString
+                }
+            ) {
                 Text("Button 1")
             }
-            Button(onClick = {
-                Toast.makeText(context, "Button 2 Clicked", Toast.LENGTH_SHORT).show()
-                val newString = "Button 2 Clicked\n$output"
-                output = newString
-            }) {
+            Button(
+                onClick = {
+                    Toast.makeText(context, "Button 2 Clicked", Toast.LENGTH_SHORT).show()
+                    val newString = "Button 2 Clicked\n$output"
+                    output = newString
+                }
+            ) {
                 Text("Button 2")
             }
-            Button(onClick = { output = "" }) {
-                Text("Clear Output")
-            }
+            Button(onClick = { output = "" }) { Text("Clear Output") }
         }
 
-        Text(
-            modifier = Modifier.fillMaxWidth(),
-            text = output
-        )
+        Text(modifier = Modifier.fillMaxWidth(), text = output)
     }
 }
 
@@ -77,10 +76,8 @@
     Column(modifier = Modifier.fillMaxSize()) {
         Row(horizontalArrangement = Arrangement.spacedBy(8.dp)) {
             Text(
-                modifier = Modifier
-                    .padding(10.dp)
-                    .background(Color.Red)
-                    .pointerInput(Unit) {
+                modifier =
+                    Modifier.padding(10.dp).background(Color.Red).pointerInput(Unit) {
                         awaitPointerEventScope {
                             while (true) {
                                 val pointerEvent = awaitPointerEvent()
@@ -93,10 +90,8 @@
             )
 
             Text(
-                modifier = Modifier
-                    .padding(10.dp)
-                    .background(Color.Red)
-                    .pointerInput(Unit) {
+                modifier =
+                    Modifier.padding(10.dp).background(Color.Red).pointerInput(Unit) {
                         awaitPointerEventScope {
                             while (true) {
                                 val pointerEvent = awaitPointerEvent()
@@ -109,26 +104,19 @@
             )
 
             Text(
-                modifier = Modifier
-                    .padding(10.dp)
-                    .background(Color.Red)
-                    .pointerInput(Unit) {
+                modifier =
+                    Modifier.padding(10.dp).background(Color.Red).pointerInput(Unit) {
                         awaitPointerEventScope {
-
                             while (true) {
                                 awaitPointerEvent()
                                 output = ""
                             }
                         }
                     },
-
                 text = "Clear output"
             )
         }
 
-        Text(
-            modifier = Modifier.fillMaxWidth(),
-            text = output
-        )
+        Text(modifier = Modifier.fillMaxWidth(), text = output)
     }
 }
diff --git a/compose/ui/ui/integration-tests/ui-demos/src/main/java/androidx/compose/ui/demos/gestures/NestedLongPressDemo.kt b/compose/ui/ui/integration-tests/ui-demos/src/main/java/androidx/compose/ui/demos/gestures/NestedLongPressDemo.kt
index dc3a87e..31ac3c8 100644
--- a/compose/ui/ui/integration-tests/ui-demos/src/main/java/androidx/compose/ui/demos/gestures/NestedLongPressDemo.kt
+++ b/compose/ui/ui/integration-tests/ui-demos/src/main/java/androidx/compose/ui/demos/gestures/NestedLongPressDemo.kt
@@ -35,9 +35,7 @@
 import androidx.compose.ui.input.pointer.pointerInput
 import androidx.compose.ui.unit.dp
 
-/**
- * Demonstration of how various press/tap gesture interact together in a nested fashion.
- */
+/** Demonstration of how various press/tap gesture interact together in a nested fashion. */
 @Composable
 fun NestedLongPressDemo() {
     Column {
@@ -59,25 +57,21 @@
 }
 
 @Composable
-private fun LongPressableContainer(
-    modifier: Modifier = Modifier,
-    content: @Composable () -> Unit
-) {
+private fun LongPressableContainer(modifier: Modifier = Modifier, content: @Composable () -> Unit) {
     val defaultColor = DefaultBackgroundColor
     val pressedColor = PressedColor
 
     val currentColor = remember { mutableStateOf(defaultColor) }
     val pressed = remember { mutableStateOf(false) }
 
-    val onLongPress: (Offset) -> Unit = {
-        currentColor.value = currentColor.value.next()
-    }
+    val onLongPress: (Offset) -> Unit = { currentColor.value = currentColor.value.next() }
 
-    val color = if (pressed.value) {
-        pressedColor.compositeOver(currentColor.value)
-    } else {
-        currentColor.value
-    }
+    val color =
+        if (pressed.value) {
+            pressedColor.compositeOver(currentColor.value)
+        } else {
+            currentColor.value
+        }
 
     Box(
         modifier
@@ -86,5 +80,7 @@
             .border(BorderStroke(2.dp, BorderColor))
             .padding(2.dp),
         contentAlignment = Alignment.Center
-    ) { content() }
+    ) {
+        content()
+    }
 }
diff --git a/compose/ui/ui/integration-tests/ui-demos/src/main/java/androidx/compose/ui/demos/gestures/NestedPressDemo.kt b/compose/ui/ui/integration-tests/ui-demos/src/main/java/androidx/compose/ui/demos/gestures/NestedPressDemo.kt
index e526e1b..1e34a18 100644
--- a/compose/ui/ui/integration-tests/ui-demos/src/main/java/androidx/compose/ui/demos/gestures/NestedPressDemo.kt
+++ b/compose/ui/ui/integration-tests/ui-demos/src/main/java/androidx/compose/ui/demos/gestures/NestedPressDemo.kt
@@ -34,9 +34,7 @@
 import androidx.compose.ui.input.pointer.pointerInput
 import androidx.compose.ui.unit.dp
 
-/**
- * Demonstration of how various press/tap gesture interact together in a nested fashion.
- */
+/** Demonstration of how various press/tap gesture interact together in a nested fashion. */
 @Composable
 fun NestedPressingDemo() {
     Column {
@@ -69,36 +67,28 @@
     val currentColor = remember { mutableStateOf(defaultColor) }
     val pressed = remember { mutableStateOf(false) }
 
-    val onStart: (Any) -> Unit = {
-        pressed.value = true
-    }
+    val onStart: (Any) -> Unit = { pressed.value = true }
 
-    val onStop: () -> Unit = {
-        pressed.value = false
-    }
+    val onStop: () -> Unit = { pressed.value = false }
 
     val onLongPress = { _: Offset ->
         pressed.value = false
         currentColor.value = defaultColor
     }
 
-    val onTap: (Offset) -> Unit = {
-        currentColor.value = currentColor.value.next()
-    }
+    val onTap: (Offset) -> Unit = { currentColor.value = currentColor.value.next() }
 
-    val onDoubleTap = { _: Offset ->
-        currentColor.value = currentColor.value.prev()
-    }
+    val onDoubleTap = { _: Offset -> currentColor.value = currentColor.value.prev() }
 
-    val color = if (pressed.value) {
-        pressedColor.compositeOver(currentColor.value)
-    } else {
-        currentColor.value
-    }
+    val color =
+        if (pressed.value) {
+            pressedColor.compositeOver(currentColor.value)
+        } else {
+            currentColor.value
+        }
 
     val gestureDetectors =
-        Modifier
-            .pointerInput(Unit) {
+        Modifier.pointerInput(Unit) {
                 detectTapGestures(
                     onPress = {
                         onStart.invoke(it)
@@ -121,5 +111,7 @@
             .background(color)
             .border(BorderStroke(2.dp, BorderColor))
             .padding(2.dp)
-    ) { content() }
+    ) {
+        content()
+    }
 }
diff --git a/compose/ui/ui/integration-tests/ui-demos/src/main/java/androidx/compose/ui/demos/gestures/NestedScrollingDemo.kt b/compose/ui/ui/integration-tests/ui-demos/src/main/java/androidx/compose/ui/demos/gestures/NestedScrollingDemo.kt
index 0b6abd6..dd7e443 100644
--- a/compose/ui/ui/integration-tests/ui-demos/src/main/java/androidx/compose/ui/demos/gestures/NestedScrollingDemo.kt
+++ b/compose/ui/ui/integration-tests/ui-demos/src/main/java/androidx/compose/ui/demos/gestures/NestedScrollingDemo.kt
@@ -48,9 +48,7 @@
 import androidx.compose.ui.unit.dp
 import kotlin.math.roundToInt
 
-/**
- * Demonstration for how multiple DragGestureDetectors interact.
- */
+/** Demonstration for how multiple DragGestureDetectors interact. */
 @Composable
 fun NestedScrollingDemo() {
     Column {
@@ -66,9 +64,7 @@
                     ScrollableContainer {
                         RepeatingColumn(repetitions = 5) {
                             // Composable that indicates it is being pressed
-                            Pressable(
-                                height = 72.dp
-                            )
+                            Pressable(height = 72.dp)
                         }
                     }
                 }
@@ -77,9 +73,7 @@
     }
 }
 
-/**
- * A very simple ScrollView like implementation that allows for vertical scrolling.
- */
+/** A very simple ScrollView like implementation that allows for vertical scrolling. */
 @Composable
 private fun ScrollableContainer(content: @Composable () -> Unit) {
     var offset by remember { mutableFloatStateOf(0f) }
@@ -87,31 +81,33 @@
 
     Layout(
         content = content,
-        modifier = Modifier
-            .scrollable(
-                orientation = Orientation.Vertical,
-                state = rememberScrollableState { scrollDistance ->
-                    val resultingOffset = offset + scrollDistance
-                    val dyToConsume =
-                        when {
-                            resultingOffset > 0f -> {
-                                0f - offset
-                            }
-                            resultingOffset < maxOffset -> {
-                                maxOffset - offset
-                            }
-                            else -> {
-                                scrollDistance
-                            }
+        modifier =
+            Modifier.scrollable(
+                    orientation = Orientation.Vertical,
+                    state =
+                        rememberScrollableState { scrollDistance ->
+                            val resultingOffset = offset + scrollDistance
+                            val dyToConsume =
+                                when {
+                                    resultingOffset > 0f -> {
+                                        0f - offset
+                                    }
+                                    resultingOffset < maxOffset -> {
+                                        maxOffset - offset
+                                    }
+                                    else -> {
+                                        scrollDistance
+                                    }
+                                }
+                            offset += dyToConsume
+                            dyToConsume
                         }
-                    offset += dyToConsume
-                    dyToConsume
-                }
-            )
-            .clipToBounds(),
+                )
+                .clipToBounds(),
         measurePolicy = { measurables, constraints ->
             val placeable =
-                measurables.first()
+                measurables
+                    .first()
                     .measure(constraints.copy(minHeight = 0, maxHeight = Constraints.Infinity))
 
             maxOffset = (constraints.maxHeight - placeable.height).toFloat()
@@ -123,13 +119,9 @@
     )
 }
 
-/**
- * A very simple Button like implementation that visually indicates when it is being pressed.
- */
+/** A very simple Button like implementation that visually indicates when it is being pressed. */
 @Composable
-private fun Pressable(
-    height: Dp
-) {
+private fun Pressable(height: Dp) {
 
     val pressedColor = PressedColor
     val defaultColor = DefaultBackgroundColor
@@ -137,21 +129,13 @@
     val color = remember { mutableStateOf(defaultColor) }
     val showPressed = remember { mutableStateOf(false) }
 
-    val onPress: (Offset) -> Unit = {
-        showPressed.value = true
-    }
+    val onPress: (Offset) -> Unit = { showPressed.value = true }
 
-    val onRelease = {
-        showPressed.value = false
-    }
+    val onRelease = { showPressed.value = false }
 
-    val onTap: (Offset) -> Unit = {
-        color.value = color.value.next()
-    }
+    val onTap: (Offset) -> Unit = { color.value = color.value.next() }
 
-    val onDoubleTap: (Offset) -> Unit = {
-        color.value = color.value.prev()
-    }
+    val onDoubleTap: (Offset) -> Unit = { color.value = color.value.prev() }
 
     val onLongPress = { _: Offset ->
         color.value = defaultColor
@@ -159,8 +143,7 @@
     }
 
     val gestureDetectors =
-        Modifier
-            .pointerInput(Unit) {
+        Modifier.pointerInput(Unit) {
                 detectTapGestures(
                     onPress = {
                         onPress.invoke(it)
@@ -194,12 +177,7 @@
         for (i in 1..repetitions) {
             content()
             if (i != repetitions) {
-                Box(
-                    Modifier
-                        .fillMaxWidth()
-                        .height(1.dp)
-                        .background(Color(0f, 0f, 0f, .12f))
-                )
+                Box(Modifier.fillMaxWidth().height(1.dp).background(Color(0f, 0f, 0f, .12f)))
             }
         }
     }
@@ -208,14 +186,8 @@
 @Composable
 fun NestedScrollDispatchDemo() {
     LazyColumn {
-        items(5) {
-            Text("I'm text $it", modifier = Modifier.padding(16.dp))
-        }
-        item {
-            NestedScrollDispatcherSample()
-        }
-        items(30) {
-            Text("I'm text $it", modifier = Modifier.padding(16.dp))
-        }
+        items(5) { Text("I'm text $it", modifier = Modifier.padding(16.dp)) }
+        item { NestedScrollDispatcherSample() }
+        items(30) { Text("I'm text $it", modifier = Modifier.padding(16.dp)) }
     }
 }
diff --git a/compose/ui/ui/integration-tests/ui-demos/src/main/java/androidx/compose/ui/demos/gestures/PointerInputDuringSubCompDemo.kt b/compose/ui/ui/integration-tests/ui-demos/src/main/java/androidx/compose/ui/demos/gestures/PointerInputDuringSubCompDemo.kt
index 17e91b3..8bf65e1 100644
--- a/compose/ui/ui/integration-tests/ui-demos/src/main/java/androidx/compose/ui/demos/gestures/PointerInputDuringSubCompDemo.kt
+++ b/compose/ui/ui/integration-tests/ui-demos/src/main/java/androidx/compose/ui/demos/gestures/PointerInputDuringSubCompDemo.kt
@@ -44,9 +44,7 @@
 import androidx.compose.ui.unit.dp
 import androidx.compose.ui.unit.em
 
-/**
- * Demonstration of how various press/tap gesture interact together in a nested fashion.
- */
+/** Demonstration of how various press/tap gesture interact together in a nested fashion. */
 @Composable
 fun PointerInputDuringSubComp() {
     Column {
@@ -63,8 +61,7 @@
                 "your finger there and then add more fingers, it will track those new fingers."
         )
         LazyColumn(
-            Modifier
-                .fillMaxSize()
+            Modifier.fillMaxSize()
                 .wrapContentSize(Alignment.Center)
                 .requiredSize(200.dp)
                 .background(color = Color.White)
@@ -78,20 +75,14 @@
                         .pointerCounterGestureFilter { newCount -> pointerCount = newCount },
                     contentAlignment = Alignment.Center
                 ) {
-                    Text(
-                        "$pointerCount",
-                        fontSize = 16.em,
-                        color = Color.Black
-                    )
+                    Text("$pointerCount", fontSize = 16.em, color = Color.Black)
                 }
             }
         }
     }
 }
 
-fun Modifier.pointerCounterGestureFilter(
-    onPointerCountChanged: (Int) -> Unit
-): Modifier =
+fun Modifier.pointerCounterGestureFilter(onPointerCountChanged: (Int) -> Unit): Modifier =
     composed {
         val filter = remember { PointerCounterGestureFilter() }
         filter.onPointerCountChanged = onPointerCountChanged
@@ -113,9 +104,8 @@
         val changes = pointerEvent.changes
 
         if (pass == PointerEventPass.Main) {
-            if (changes.any {
-                it.changedToDownIgnoreConsumed() || it.changedToUpIgnoreConsumed()
-            }
+            if (
+                changes.any { it.changedToDownIgnoreConsumed() || it.changedToUpIgnoreConsumed() }
             ) {
                 onPointerCountChanged.invoke(changes.count { it.pressed })
             }
diff --git a/compose/ui/ui/integration-tests/ui-demos/src/main/java/androidx/compose/ui/demos/gestures/PopupDragDemo.kt b/compose/ui/ui/integration-tests/ui-demos/src/main/java/androidx/compose/ui/demos/gestures/PopupDragDemo.kt
index ea7df23..ac37b3d 100644
--- a/compose/ui/ui/integration-tests/ui-demos/src/main/java/androidx/compose/ui/demos/gestures/PopupDragDemo.kt
+++ b/compose/ui/ui/integration-tests/ui-demos/src/main/java/androidx/compose/ui/demos/gestures/PopupDragDemo.kt
@@ -43,14 +43,10 @@
 
     Column {
         Text("That is a pop up with a dragGestureFilter on it.  You can drag it around!")
-        Popup(
-            alignment = Alignment.TopStart,
-            offset = offset.value.round()
-        ) {
+        Popup(alignment = Alignment.TopStart, offset = offset.value.round()) {
             Box {
                 Box(
-                    Modifier
-                        .pointerInput(Unit) {
+                    Modifier.pointerInput(Unit) {
                             detectDragGestures { _, dragAmount ->
                                 offset.value = offset.value + dragAmount
                             }
@@ -59,10 +55,7 @@
                         .background(Color.Green, CircleShape),
                     contentAlignment = Alignment.Center
                 ) {
-                    Text(
-                        text = "This is a popup!",
-                        textAlign = TextAlign.Center
-                    )
+                    Text(text = "This is a popup!", textAlign = TextAlign.Center)
                 }
             }
         }
diff --git a/compose/ui/ui/integration-tests/ui-demos/src/main/java/androidx/compose/ui/demos/gestures/PressIndicatorGestureDetectorDemo.kt b/compose/ui/ui/integration-tests/ui-demos/src/main/java/androidx/compose/ui/demos/gestures/PressIndicatorGestureDetectorDemo.kt
index 625a332..b0ac502 100644
--- a/compose/ui/ui/integration-tests/ui-demos/src/main/java/androidx/compose/ui/demos/gestures/PressIndicatorGestureDetectorDemo.kt
+++ b/compose/ui/ui/integration-tests/ui-demos/src/main/java/androidx/compose/ui/demos/gestures/PressIndicatorGestureDetectorDemo.kt
@@ -36,20 +36,14 @@
 import androidx.compose.ui.input.pointer.pointerInput
 import androidx.compose.ui.unit.dp
 
-/**
- * Simple [detectTapGestures] demo for indication.
- */
+/** Simple [detectTapGestures] demo for indication. */
 @Composable
 fun PressIndicatorGestureFilterDemo() {
     val pressed = remember { mutableStateOf(false) }
 
-    val onStart: (Offset) -> Unit = {
-        pressed.value = true
-    }
+    val onStart: (Offset) -> Unit = { pressed.value = true }
 
-    val onStop = {
-        pressed.value = false
-    }
+    val onStop = { pressed.value = false }
 
     val color =
         if (pressed.value) {
diff --git a/compose/ui/ui/integration-tests/ui-demos/src/main/java/androidx/compose/ui/demos/gestures/RawDragGestureDetectorDemo.kt b/compose/ui/ui/integration-tests/ui-demos/src/main/java/androidx/compose/ui/demos/gestures/RawDragGestureDetectorDemo.kt
index e1ec630..e419cea 100644
--- a/compose/ui/ui/integration-tests/ui-demos/src/main/java/androidx/compose/ui/demos/gestures/RawDragGestureDetectorDemo.kt
+++ b/compose/ui/ui/integration-tests/ui-demos/src/main/java/androidx/compose/ui/demos/gestures/RawDragGestureDetectorDemo.kt
@@ -38,9 +38,7 @@
 import androidx.compose.ui.platform.LocalDensity
 import androidx.compose.ui.unit.dp
 
-/**
- * Simple [drag] demo.
- */
+/** Simple [drag] demo. */
 @Composable
 fun RawDragGestureFilterDemo() {
     val offset = remember { mutableStateOf(Offset.Zero) }
@@ -51,8 +49,7 @@
     Column {
         Text("Demonstrates dragging that starts immediately (no slop or anything else).")
         Box(
-            Modifier
-                .fillMaxSize()
+            Modifier.fillMaxSize()
                 .wrapContentSize(Alignment.Center)
                 .offset(offsetX, offsetY)
                 .size(192.dp)
diff --git a/compose/ui/ui/integration-tests/ui-demos/src/main/java/androidx/compose/ui/demos/gestures/ScaleGestureDetectorDemo.kt b/compose/ui/ui/integration-tests/ui-demos/src/main/java/androidx/compose/ui/demos/gestures/ScaleGestureDetectorDemo.kt
index 57ecb8b..e857c99 100644
--- a/compose/ui/ui/integration-tests/ui-demos/src/main/java/androidx/compose/ui/demos/gestures/ScaleGestureDetectorDemo.kt
+++ b/compose/ui/ui/integration-tests/ui-demos/src/main/java/androidx/compose/ui/demos/gestures/ScaleGestureDetectorDemo.kt
@@ -33,9 +33,7 @@
 import androidx.compose.ui.input.pointer.pointerInput
 import androidx.compose.ui.unit.dp
 
-/**
- * Simple [detectTransformGestures] demo with scale only.
- */
+/** Simple [detectTransformGestures] demo with scale only. */
 @Composable
 fun ScaleGestureFilterDemo() {
     val size = remember { mutableStateOf(192.dp) }
diff --git a/compose/ui/ui/integration-tests/ui-demos/src/main/java/androidx/compose/ui/demos/gestures/ScrollGestureFilterDemo.kt b/compose/ui/ui/integration-tests/ui-demos/src/main/java/androidx/compose/ui/demos/gestures/ScrollGestureFilterDemo.kt
index 695fb40..678161d 100644
--- a/compose/ui/ui/integration-tests/ui-demos/src/main/java/androidx/compose/ui/demos/gestures/ScrollGestureFilterDemo.kt
+++ b/compose/ui/ui/integration-tests/ui-demos/src/main/java/androidx/compose/ui/demos/gestures/ScrollGestureFilterDemo.kt
@@ -41,9 +41,7 @@
 import androidx.compose.ui.unit.Dp
 import androidx.compose.ui.unit.dp
 
-/**
- * Simple demo that shows off ScrollGestureFilter.
- */
+/** Simple demo that shows off ScrollGestureFilter. */
 @Composable
 fun ScrollGestureFilterDemo() {
     Column {
@@ -74,13 +72,12 @@
     val color = if (interactionSource.collectIsDraggedAsState().value) activeColor else idleColor
     var offsetPx by remember { mutableFloatStateOf(0f) }
 
-    val offsetDp = with(LocalDensity.current) {
-        offsetPx.toDp()
-    }
-    val (offsetX, offsetY) = when (orientation) {
-        Orientation.Horizontal -> offsetDp to Dp.Hairline
-        Orientation.Vertical -> Dp.Hairline to offsetDp
-    }
+    val offsetDp = with(LocalDensity.current) { offsetPx.toDp() }
+    val (offsetX, offsetY) =
+        when (orientation) {
+            Orientation.Horizontal -> offsetDp to Dp.Hairline
+            Orientation.Vertical -> Dp.Hairline to offsetDp
+        }
 
     Box(
         Modifier.offset(offsetX, offsetY)
@@ -89,10 +86,11 @@
             .scrollable(
                 interactionSource = interactionSource,
                 orientation = orientation,
-                state = rememberScrollableState { scrollDistance ->
-                    offsetPx += scrollDistance
-                    scrollDistance
-                }
+                state =
+                    rememberScrollableState { scrollDistance ->
+                        offsetPx += scrollDistance
+                        scrollDistance
+                    }
             )
             .size(size)
             .background(color)
diff --git a/compose/ui/ui/integration-tests/ui-demos/src/main/java/androidx/compose/ui/demos/gestures/TapGestureDetectorDemo.kt b/compose/ui/ui/integration-tests/ui-demos/src/main/java/androidx/compose/ui/demos/gestures/TapGestureDetectorDemo.kt
index 9906d7d..2583a34 100644
--- a/compose/ui/ui/integration-tests/ui-demos/src/main/java/androidx/compose/ui/demos/gestures/TapGestureDetectorDemo.kt
+++ b/compose/ui/ui/integration-tests/ui-demos/src/main/java/androidx/compose/ui/demos/gestures/TapGestureDetectorDemo.kt
@@ -36,16 +36,12 @@
 import androidx.compose.ui.input.pointer.pointerInput
 import androidx.compose.ui.unit.dp
 
-/**
- * Simple [detectTapGestures] demo.
- */
+/** Simple [detectTapGestures] demo. */
 @Composable
 fun DetectTapGesturesDemo() {
     val color = remember { mutableStateOf(Colors.random()) }
 
-    val onTap: (Offset) -> Unit = {
-        color.value = color.value.anotherRandomColor()
-    }
+    val onTap: (Offset) -> Unit = { color.value = color.value.anotherRandomColor() }
 
     Column {
         Text("The box changes color when you tap it.")
diff --git a/compose/ui/ui/integration-tests/ui-demos/src/main/java/androidx/compose/ui/demos/gestures/TapPressureGestureDetectorDemo.kt b/compose/ui/ui/integration-tests/ui-demos/src/main/java/androidx/compose/ui/demos/gestures/TapPressureGestureDetectorDemo.kt
index 709b169..668614a 100644
--- a/compose/ui/ui/integration-tests/ui-demos/src/main/java/androidx/compose/ui/demos/gestures/TapPressureGestureDetectorDemo.kt
+++ b/compose/ui/ui/integration-tests/ui-demos/src/main/java/androidx/compose/ui/demos/gestures/TapPressureGestureDetectorDemo.kt
@@ -46,27 +46,20 @@
 import androidx.compose.ui.unit.dp
 import androidx.compose.ui.unit.sp
 
-/**
- * Simple demonstration of subscribing to pressure changes.
- */
+/** Simple demonstration of subscribing to pressure changes. */
 @OptIn(ExperimentalComposeUiApi::class)
 @Composable
 fun DetectTapPressureGesturesDemo() {
     val pressureBoxTextSize = 28.sp
 
-    Column(
-        modifier = Modifier
-            .fillMaxSize()
-            .padding(8.dp)
-    ) {
+    Column(modifier = Modifier.fillMaxSize().padding(8.dp)) {
         Text(
-            modifier = Modifier
-                .fillMaxWidth()
-                .weight(1f),
+            modifier = Modifier.fillMaxWidth().weight(1f),
             textAlign = TextAlign.Center,
-            text = "Each box displays pressure (with and without gestures).\n" +
-                "Use a stylus or finger to see pressure values.\n" +
-                "For some pen supported devices, a finger touch pressure will equal 1.0."
+            text =
+                "Each box displays pressure (with and without gestures).\n" +
+                    "Use a stylus or finger to see pressure values.\n" +
+                    "For some pen supported devices, a finger touch pressure will equal 1.0."
         )
 
         var gestureOffsetX by remember { mutableFloatStateOf(0f) }
@@ -75,31 +68,32 @@
 
         // Gestures (detectDragGestures) with pressure.
         Box(
-            modifier = Modifier
-                .fillMaxWidth()
-                .weight(3f)
-                .background(Color.Blue)
-                .wrapContentSize(Alignment.Center)
-                .clipToBounds()
-                .border(BorderStroke(2.dp, BorderColor))
-                // Resets x & y when a new press is detected (not necessarily needed for pressure).
-                .pointerInput(Unit) {
-                    detectTapGestures(
-                        onPress = {
-                            gestureOffsetX = 0f
-                            gestureOffsetY = 0f
-                        }
-                    )
-                }
-                // Retrieves pressure from [PointerInputChange].
-                .pointerInput(Unit) {
-                    detectDragGestures { change: PointerInputChange, dragAmount: Offset ->
-                        change.consume()
-                        gestureOffsetX += dragAmount.x
-                        gestureOffsetY += dragAmount.y
-                        gesturePressure = change.pressure
+            modifier =
+                Modifier.fillMaxWidth()
+                    .weight(3f)
+                    .background(Color.Blue)
+                    .wrapContentSize(Alignment.Center)
+                    .clipToBounds()
+                    .border(BorderStroke(2.dp, BorderColor))
+                    // Resets x & y when a new press is detected (not necessarily needed for
+                    // pressure).
+                    .pointerInput(Unit) {
+                        detectTapGestures(
+                            onPress = {
+                                gestureOffsetX = 0f
+                                gestureOffsetY = 0f
+                            }
+                        )
                     }
-                },
+                    // Retrieves pressure from [PointerInputChange].
+                    .pointerInput(Unit) {
+                        detectDragGestures { change: PointerInputChange, dragAmount: Offset ->
+                            change.consume()
+                            gestureOffsetX += dragAmount.x
+                            gestureOffsetY += dragAmount.y
+                            gesturePressure = change.pressure
+                        }
+                    },
             contentAlignment = Alignment.TopCenter
         ) {
             Text(
@@ -107,37 +101,36 @@
                 fontSize = pressureBoxTextSize,
                 textAlign = TextAlign.Center,
                 color = Color.White,
-                text = "detectDragGestures + pressure:\n" +
-                    "x: $gestureOffsetX, y: $gestureOffsetY,\n" +
-                    "pressure: $gesturePressure"
+                text =
+                    "detectDragGestures + pressure:\n" +
+                        "x: $gestureOffsetX, y: $gestureOffsetY,\n" +
+                        "pressure: $gesturePressure"
             )
         }
 
-        var awaitPointerEventScopePressureMessage by remember {
-            mutableStateOf("Press for value")
-        }
+        var awaitPointerEventScopePressureMessage by remember { mutableStateOf("Press for value") }
 
         // awaitPointerEventScope with pressure.
         Box(
-            modifier = Modifier
-                .fillMaxWidth()
-                .weight(3f)
-                .background(Color.Green)
-                .wrapContentSize(Alignment.Center)
-                .clipToBounds()
-                .border(BorderStroke(2.dp, BorderColor))
-                // Retrieves pressure from [PointerInputChange].
-                .pointerInput(Unit) {
-                    awaitPointerEventScope {
-                        while (true) {
-                            val event = awaitPointerEvent()
-                            event.changes.forEach {
-                                awaitPointerEventScopePressureMessage = "${it.pressure}"
-                                it.consume()
+            modifier =
+                Modifier.fillMaxWidth()
+                    .weight(3f)
+                    .background(Color.Green)
+                    .wrapContentSize(Alignment.Center)
+                    .clipToBounds()
+                    .border(BorderStroke(2.dp, BorderColor))
+                    // Retrieves pressure from [PointerInputChange].
+                    .pointerInput(Unit) {
+                        awaitPointerEventScope {
+                            while (true) {
+                                val event = awaitPointerEvent()
+                                event.changes.forEach {
+                                    awaitPointerEventScopePressureMessage = "${it.pressure}"
+                                    it.consume()
+                                }
                             }
                         }
-                    }
-                },
+                    },
             contentAlignment = Alignment.TopCenter
         ) {
             Text(
diff --git a/compose/ui/ui/integration-tests/ui-demos/src/main/java/androidx/compose/ui/demos/gestures/TouchSlopDragGestureDetectorDemo.kt b/compose/ui/ui/integration-tests/ui-demos/src/main/java/androidx/compose/ui/demos/gestures/TouchSlopDragGestureDetectorDemo.kt
index ae77561..cfc871f 100644
--- a/compose/ui/ui/integration-tests/ui-demos/src/main/java/androidx/compose/ui/demos/gestures/TouchSlopDragGestureDetectorDemo.kt
+++ b/compose/ui/ui/integration-tests/ui-demos/src/main/java/androidx/compose/ui/demos/gestures/TouchSlopDragGestureDetectorDemo.kt
@@ -37,9 +37,7 @@
 import androidx.compose.ui.platform.LocalDensity
 import androidx.compose.ui.unit.dp
 
-/**
- * Simple [detectVerticalDragGestures] and [detectHorizontalDragGestures] demo.
- */
+/** Simple [detectVerticalDragGestures] and [detectHorizontalDragGestures] demo. */
 @Composable
 fun DragGestureFilterDemo() {
 
diff --git a/compose/ui/ui/integration-tests/ui-demos/src/main/java/androidx/compose/ui/demos/gestures/VerticalScrollerInDrawerLayoutDemo.kt b/compose/ui/ui/integration-tests/ui-demos/src/main/java/androidx/compose/ui/demos/gestures/VerticalScrollerInDrawerLayoutDemo.kt
index b75515e..01d6875 100644
--- a/compose/ui/ui/integration-tests/ui-demos/src/main/java/androidx/compose/ui/demos/gestures/VerticalScrollerInDrawerLayoutDemo.kt
+++ b/compose/ui/ui/integration-tests/ui-demos/src/main/java/androidx/compose/ui/demos/gestures/VerticalScrollerInDrawerLayoutDemo.kt
@@ -56,9 +56,7 @@
 import androidx.compose.ui.unit.dp
 import kotlin.math.roundToInt
 
-/**
- * Demonstration for how multiple DragGestureDetectors interact.
- */
+/** Demonstration for how multiple DragGestureDetectors interact. */
 @Composable
 fun VerticalScrollerInDrawerDemo() {
     Column {
@@ -69,11 +67,7 @@
         )
         DrawerLayout(280.dp) {
             Scrollable(Orientation.Vertical) {
-                RepeatingColumn(repetitions = 10) {
-                    Pressable(
-                        height = 96.dp
-                    )
-                }
+                RepeatingColumn(repetitions = 10) { Pressable(height = 96.dp) }
             }
         }
     }
@@ -82,10 +76,7 @@
 @Composable
 private fun DrawerLayout(drawerWidth: Dp, content: @Composable ColumnScope.() -> Unit) {
 
-    val minOffset =
-        with(LocalDensity.current) {
-            -drawerWidth.toPx()
-        }
+    val minOffset = with(LocalDensity.current) { -drawerWidth.toPx() }
 
     var currentOffset by remember { mutableFloatStateOf(minOffset) }
     val maxOffset = 0f
@@ -93,34 +84,30 @@
     Box(
         Modifier.scrollable(
             orientation = Orientation.Horizontal,
-            state = rememberScrollableState { scrollDistance ->
-                val originalOffset = currentOffset
-                currentOffset = (currentOffset + scrollDistance).coerceIn(minOffset, maxOffset)
-                currentOffset - originalOffset
-            }
+            state =
+                rememberScrollableState { scrollDistance ->
+                    val originalOffset = currentOffset
+                    currentOffset = (currentOffset + scrollDistance).coerceIn(minOffset, maxOffset)
+                    currentOffset - originalOffset
+                }
         )
     ) {
         Column(content = content)
         Box(
-            Modifier
-                .fillMaxHeight()
+            Modifier.fillMaxHeight()
                 .requiredWidth(drawerWidth)
                 .offset { IntOffset(currentOffset.roundToInt(), 0) }
                 .background(color = DefaultBackgroundColor)
         ) {
             Text(
                 "This is empty drawer content",
-                Modifier
-                    .fillMaxSize()
-                    .wrapContentSize(Alignment.Center)
+                Modifier.fillMaxSize().wrapContentSize(Alignment.Center)
             )
         }
     }
 }
 
-/**
- * A very simple ScrollView like implementation that allows for vertical scrolling.
- */
+/** A very simple ScrollView like implementation that allows for vertical scrolling. */
 @Composable
 private fun Scrollable(orientation: Orientation, content: @Composable () -> Unit) {
     val maxOffset = 0f
@@ -129,41 +116,44 @@
 
     Layout(
         content = content,
-        modifier = Modifier.scrollable(
-            orientation = orientation,
-            state = rememberScrollableState { scrollDistance ->
-                val resultingOffset = offset + scrollDistance
-                val toConsume =
-                    when {
-                        resultingOffset > maxOffset -> {
-                            maxOffset - offset
+        modifier =
+            Modifier.scrollable(
+                    orientation = orientation,
+                    state =
+                        rememberScrollableState { scrollDistance ->
+                            val resultingOffset = offset + scrollDistance
+                            val toConsume =
+                                when {
+                                    resultingOffset > maxOffset -> {
+                                        maxOffset - offset
+                                    }
+                                    resultingOffset < minOffset -> {
+                                        minOffset - offset
+                                    }
+                                    else -> {
+                                        scrollDistance
+                                    }
+                                }
+                            offset += toConsume
+                            toConsume
                         }
-                        resultingOffset < minOffset -> {
-                            minOffset - offset
-                        }
-                        else -> {
-                            scrollDistance
-                        }
-                    }
-                offset += toConsume
-                toConsume
-            }
-        ).then(ClipModifier),
+                )
+                .then(ClipModifier),
         measurePolicy = { measurables, constraints ->
             val placeable =
                 when (orientation) {
-                    Orientation.Horizontal -> measurables.first().measure(
-                        constraints.copy(
-                            minWidth = 0,
-                            maxWidth = Constraints.Infinity
-                        )
-                    )
-                    Orientation.Vertical -> measurables.first().measure(
-                        constraints.copy(
-                            minHeight = 0,
-                            maxHeight = Constraints.Infinity
-                        )
-                    )
+                    Orientation.Horizontal ->
+                        measurables
+                            .first()
+                            .measure(
+                                constraints.copy(minWidth = 0, maxWidth = Constraints.Infinity)
+                            )
+                    Orientation.Vertical ->
+                        measurables
+                            .first()
+                            .measure(
+                                constraints.copy(minHeight = 0, maxHeight = Constraints.Infinity)
+                            )
                 }
 
             minOffset =
@@ -194,21 +184,16 @@
     )
 }
 
-private val ClipModifier = object : DrawModifier {
-    override fun ContentDrawScope.draw() {
-        clipRect {
-            this@draw.drawContent()
+private val ClipModifier =
+    object : DrawModifier {
+        override fun ContentDrawScope.draw() {
+            clipRect { this@draw.drawContent() }
         }
     }
-}
 
-/**
- * A very simple Button like implementation that visually indicates when it is being pressed.
- */
+/** A very simple Button like implementation that visually indicates when it is being pressed. */
 @Composable
-private fun Pressable(
-    height: Dp
-) {
+private fun Pressable(height: Dp) {
 
     val pressedColor = PressedColor
     val defaultColor = Red
@@ -216,21 +201,13 @@
     val color = remember { mutableStateOf(defaultColor) }
     val showPressed = remember { mutableStateOf(false) }
 
-    val onPress: (Offset) -> Unit = {
-        showPressed.value = true
-    }
+    val onPress: (Offset) -> Unit = { showPressed.value = true }
 
-    val onRelease = {
-        showPressed.value = false
-    }
+    val onRelease = { showPressed.value = false }
 
-    val onTap: (Offset) -> Unit = {
-        color.value = color.value.next()
-    }
+    val onTap: (Offset) -> Unit = { color.value = color.value.next() }
 
-    val onDoubleTap: (Offset) -> Unit = {
-        color.value = color.value.prev()
-    }
+    val onDoubleTap: (Offset) -> Unit = { color.value = color.value.prev() }
 
     val onLongPress = { _: Offset ->
         color.value = defaultColor
@@ -238,8 +215,7 @@
     }
 
     val gestureDetectors =
-        Modifier
-            .pointerInput(Unit) {
+        Modifier.pointerInput(Unit) {
                 detectTapGestures(
                     onPress = {
                         onPress.invoke(it)
@@ -260,12 +236,12 @@
         if (showPressed.value) Modifier.background(color = pressedColor) else Modifier
 
     Box(
-        Modifier
-            .fillMaxWidth()
+        Modifier.fillMaxWidth()
             .height(height)
             .border(1.dp, Color.Black)
             .background(color = color.value)
-            .then(pressOverlay).then(gestureDetectors)
+            .then(pressOverlay)
+            .then(gestureDetectors)
     )
 }
 
diff --git a/compose/ui/ui/integration-tests/ui-demos/src/main/java/androidx/compose/ui/demos/keyinput/InterceptEnterToSendMessageDemo.kt b/compose/ui/ui/integration-tests/ui-demos/src/main/java/androidx/compose/ui/demos/keyinput/InterceptEnterToSendMessageDemo.kt
index 6535363..0e207bf 100644
--- a/compose/ui/ui/integration-tests/ui-demos/src/main/java/androidx/compose/ui/demos/keyinput/InterceptEnterToSendMessageDemo.kt
+++ b/compose/ui/ui/integration-tests/ui-demos/src/main/java/androidx/compose/ui/demos/keyinput/InterceptEnterToSendMessageDemo.kt
@@ -55,40 +55,41 @@
     Scaffold(scaffoldState = scaffoldState) { innerPadding ->
         Column(Modifier.padding(innerPadding)) {
             Text(
-                text = "Use a physical keyboard with this demo. As you enter text into this " +
-                    "textfield, notice how the enter key is intercepted to show a snackbar." +
-                    "You can use Ctrl+Enter or Shift+Enter to start a new line."
+                text =
+                    "Use a physical keyboard with this demo. As you enter text into this " +
+                        "textfield, notice how the enter key is intercepted to show a snackbar." +
+                        "You can use Ctrl+Enter or Shift+Enter to start a new line."
             )
             Spacer(modifier = Modifier.height(30.dp))
             OutlinedTextField(
                 value = textFieldValue,
                 onValueChange = { textFieldValue = it },
-                modifier = Modifier
-                    .padding(10.dp)
-                    .fillMaxSize()
-                    .onPreviewKeyEvent {
-                    @OptIn(ExperimentalComposeUiApi::class)
-                    // Intercept all the "Enter" key events.
-                    if (it.key == Key.Enter && it.type == KeyDown) {
-                        // If this is a ctrl or shift key is pressed, we want to enter a new line.
-                        // Sending ctrl+enter or shift+enter to the text field does not generate a
-                        // new line, so we have to add the new line ourselves.
-                        if (it.isCtrlPressed || it.isShiftPressed) {
-                            textFieldValue = textFieldValue.insertString("\n")
-                        } else {
-                            // Perform Send Message and clear the textfield.
-                            coroutineScope.launch {
-                                scaffoldState.snackbarHostState.showSnackbar("Message is sent")
+                modifier =
+                    Modifier.padding(10.dp).fillMaxSize().onPreviewKeyEvent {
+                        @OptIn(ExperimentalComposeUiApi::class)
+                        // Intercept all the "Enter" key events.
+                        if (it.key == Key.Enter && it.type == KeyDown) {
+                            // If this is a ctrl or shift key is pressed, we want to enter a new
+                            // line.
+                            // Sending ctrl+enter or shift+enter to the text field does not generate
+                            // a
+                            // new line, so we have to add the new line ourselves.
+                            if (it.isCtrlPressed || it.isShiftPressed) {
+                                textFieldValue = textFieldValue.insertString("\n")
+                            } else {
+                                // Perform Send Message and clear the textfield.
+                                coroutineScope.launch {
+                                    scaffoldState.snackbarHostState.showSnackbar("Message is sent")
+                                }
+                                textFieldValue = TextFieldValue("")
                             }
-                            textFieldValue = TextFieldValue("")
+                            // Consume the key event so that it is not propagated further.
+                            true
+                        } else {
+                            // Let all other key events pass through.
+                            false
                         }
-                        // Consume the key event so that it is not propagated further.
-                        true
-                    } else {
-                        // Let all other key events pass through.
-                        false
-                    }
-                },
+                    },
                 textStyle = TextStyle(color = Color.Blue)
             )
         }
diff --git a/compose/ui/ui/integration-tests/ui-demos/src/main/java/androidx/compose/ui/demos/keyinput/KeyInputDemo.kt b/compose/ui/ui/integration-tests/ui-demos/src/main/java/androidx/compose/ui/demos/keyinput/KeyInputDemo.kt
index 8543b38..9f61eab 100644
--- a/compose/ui/ui/integration-tests/ui-demos/src/main/java/androidx/compose/ui/demos/keyinput/KeyInputDemo.kt
+++ b/compose/ui/ui/integration-tests/ui-demos/src/main/java/androidx/compose/ui/demos/keyinput/KeyInputDemo.kt
@@ -42,23 +42,13 @@
 
 @Composable
 fun KeyInputDemo() {
-    Column(
-        verticalArrangement = Arrangement.SpaceEvenly
-    ) {
+    Column(verticalArrangement = Arrangement.SpaceEvenly) {
         CenteredRow {
-            Text(
-                "Click on any item to bring it into focus. \nThen type using a hardware keyboard."
-            )
+            Text("Click on any item to bring it into focus. \nThen type using a hardware keyboard.")
         }
-        CenteredRow {
-            FocusableText(remember { mutableStateOf("Enter Text Here") })
-        }
-        CenteredRow {
-            FocusableText(remember { mutableStateOf("Enter Text Here") })
-        }
-        CenteredRow {
-            FocusableText(remember { mutableStateOf("Enter Text Here") })
-        }
+        CenteredRow { FocusableText(remember { mutableStateOf("Enter Text Here") }) }
+        CenteredRow { FocusableText(remember { mutableStateOf("Enter Text Here") }) }
+        CenteredRow { FocusableText(remember { mutableStateOf("Enter Text Here") }) }
     }
 }
 
@@ -67,21 +57,20 @@
     var color by remember { mutableStateOf(Color.Black) }
     val focusRequester = remember { FocusRequester() }
     Text(
-        modifier = Modifier
-            .focusRequester(focusRequester)
-            .onFocusChanged { color = if (it.isFocused) Color.Green else Color.Black }
-            .focusTarget()
-            .pointerInput(Unit) { detectTapGestures { focusRequester.requestFocus() } }
-            .onKeyEvent {
-                if (it.type == KeyDown) {
-                    text.value = StringBuilder(text.value)
-                        .appendCodePoint(it.utf16CodePoint)
-                        .toString()
-                    true
-                } else {
-                    false
-                }
-            },
+        modifier =
+            Modifier.focusRequester(focusRequester)
+                .onFocusChanged { color = if (it.isFocused) Color.Green else Color.Black }
+                .focusTarget()
+                .pointerInput(Unit) { detectTapGestures { focusRequester.requestFocus() } }
+                .onKeyEvent {
+                    if (it.type == KeyDown) {
+                        text.value =
+                            StringBuilder(text.value).appendCodePoint(it.utf16CodePoint).toString()
+                        true
+                    } else {
+                        false
+                    }
+                },
         text = text.value,
         color = color
     )
diff --git a/compose/ui/ui/integration-tests/ui-demos/src/main/java/androidx/compose/ui/demos/modifier/CommunicatingModifierDemo.kt b/compose/ui/ui/integration-tests/ui-demos/src/main/java/androidx/compose/ui/demos/modifier/CommunicatingModifierDemo.kt
index 80b0d2e..32c16e4 100644
--- a/compose/ui/ui/integration-tests/ui-demos/src/main/java/androidx/compose/ui/demos/modifier/CommunicatingModifierDemo.kt
+++ b/compose/ui/ui/integration-tests/ui-demos/src/main/java/androidx/compose/ui/demos/modifier/CommunicatingModifierDemo.kt
@@ -53,8 +53,7 @@
     fun Modifier.clickToRead() = composed {
         var name by remember { mutableStateOf("Unknown") }
         val coroutineScope = rememberCoroutineScope()
-        Modifier
-            .modifierLocalConsumer { name = ModifierLocalColor.current }
+        Modifier.modifierLocalConsumer { name = ModifierLocalColor.current }
             .clickable {
                 coroutineScope.launch {
                     scaffoldState.snackbarHostState.showSnackbar(
@@ -66,23 +65,17 @@
 
     Scaffold(scaffoldState = scaffoldState) { innerPadding ->
         Column(
-            Modifier
-                .background(Gray)
-                .padding(innerPadding)
-                .modifierLocalProvider(ModifierLocalColor) { "Gray" }
+            Modifier.background(Gray).padding(innerPadding).modifierLocalProvider(
+                ModifierLocalColor
+            ) {
+                "Gray"
+            }
         ) {
             Text("Click the red box to read the parent's ModifierLocalColor")
-            Box(
-                Modifier
-                    .size(100.dp)
-                    .padding(5.dp)
-                    .background(Red)
-                    .clickToRead()
-            )
+            Box(Modifier.size(100.dp).padding(5.dp).background(Red).clickToRead())
             Text("Click the blue box to read its ModifierLocalColor")
             Box(
-                Modifier
-                    .size(100.dp)
+                Modifier.size(100.dp)
                     .padding(5.dp)
                     .modifierLocalProvider(ModifierLocalColor) { "Blue" }
                     .background(Blue)
@@ -90,31 +83,24 @@
             )
             Text("Click the blue box to read the red box's ModifierLocalColor")
             Box(
-                Modifier
-                    .size(100.dp)
-                    .padding(5.dp)
-                    .background(Red)
-                    .modifierLocalProvider(ModifierLocalColor) { "Red" }
+                Modifier.size(100.dp).padding(5.dp).background(Red).modifierLocalProvider(
+                    ModifierLocalColor
+                ) {
+                    "Red"
+                }
             ) {
-                Box(
-                    Modifier
-                        .size(50.dp)
-                        .padding(5.dp)
-                        .background(Blue)
-                        .clickToRead()
-                )
+                Box(Modifier.size(50.dp).padding(5.dp).background(Blue).clickToRead())
             }
             Text("Click the blue box to read its ModifierLocalColor")
             Box(
-                Modifier
-                    .size(100.dp)
-                    .padding(5.dp)
-                    .background(Red)
-                    .modifierLocalProvider(ModifierLocalColor) { "Red" }
+                Modifier.size(100.dp).padding(5.dp).background(Red).modifierLocalProvider(
+                    ModifierLocalColor
+                ) {
+                    "Red"
+                }
             ) {
                 Box(
-                    Modifier
-                        .size(50.dp)
+                    Modifier.size(50.dp)
                         .padding(5.dp)
                         .background(Blue)
                         .modifierLocalProvider(ModifierLocalColor) { "Blue" }
diff --git a/compose/ui/ui/integration-tests/ui-demos/src/main/java/androidx/compose/ui/demos/recyclerview/RecyclerViewDemos.kt b/compose/ui/ui/integration-tests/ui-demos/src/main/java/androidx/compose/ui/demos/recyclerview/RecyclerViewDemos.kt
index 9a172fd..2e0b2558 100644
--- a/compose/ui/ui/integration-tests/ui-demos/src/main/java/androidx/compose/ui/demos/recyclerview/RecyclerViewDemos.kt
+++ b/compose/ui/ui/integration-tests/ui-demos/src/main/java/androidx/compose/ui/demos/recyclerview/RecyclerViewDemos.kt
@@ -19,10 +19,11 @@
 import androidx.compose.integration.demos.common.DemoCategory
 import androidx.compose.integration.demos.common.FragmentDemo
 
-val RecyclerViewDemos = DemoCategory(
-    "RecyclerView",
-    listOf(
-        FragmentDemo("Basic interop (enabled)", RecyclerViewInteropDemoFragment::class),
-        FragmentDemo("Basic interop (disabled)", RecyclerViewInteropOffDemoFragment::class),
+val RecyclerViewDemos =
+    DemoCategory(
+        "RecyclerView",
+        listOf(
+            FragmentDemo("Basic interop (enabled)", RecyclerViewInteropDemoFragment::class),
+            FragmentDemo("Basic interop (disabled)", RecyclerViewInteropOffDemoFragment::class),
+        )
     )
-)
diff --git a/compose/ui/ui/integration-tests/ui-demos/src/main/java/androidx/compose/ui/demos/recyclerview/RecyclerViewInteropDemoFragment.kt b/compose/ui/ui/integration-tests/ui-demos/src/main/java/androidx/compose/ui/demos/recyclerview/RecyclerViewInteropDemoFragment.kt
index 6a610255..ec3235d 100644
--- a/compose/ui/ui/integration-tests/ui-demos/src/main/java/androidx/compose/ui/demos/recyclerview/RecyclerViewInteropDemoFragment.kt
+++ b/compose/ui/ui/integration-tests/ui-demos/src/main/java/androidx/compose/ui/demos/recyclerview/RecyclerViewInteropDemoFragment.kt
@@ -48,6 +48,7 @@
 import androidx.recyclerview.widget.RecyclerView
 
 class RecyclerViewInteropDemoFragment : AbstractInteropDemoFragment(true)
+
 class RecyclerViewInteropOffDemoFragment : AbstractInteropDemoFragment(false)
 
 abstract class AbstractInteropDemoFragment(val interopOn: Boolean) :
@@ -100,17 +101,8 @@
 
         LazyRow(state = state) {
             items(25) { colIdx ->
-                Column(
-                    Modifier
-                        .padding(8.dp)
-                        .size(96.dp, 144.dp)
-                ) {
-                    Box(
-                        Modifier
-                            .fillMaxWidth()
-                            .weight(0.75f)
-                            .background(Color(0xFF999999))
-                    )
+                Column(Modifier.padding(8.dp).size(96.dp, 144.dp)) {
+                    Box(Modifier.fillMaxWidth().weight(0.75f).background(Color(0xFF999999)))
                     Text("Item #$colIdx")
                 }
             }
@@ -118,11 +110,10 @@
     }
 }
 
-class ComposeItemRow @JvmOverloads constructor(
-    context: Context,
-    attrs: AttributeSet? = null,
-    defStyle: Int = 0
-) : AbstractComposeView(context, attrs, defStyle) {
+class ComposeItemRow
+@JvmOverloads
+constructor(context: Context, attrs: AttributeSet? = null, defStyle: Int = 0) :
+    AbstractComposeView(context, attrs, defStyle) {
     var index by mutableIntStateOf(0)
     var rowState: LazyListState? by mutableStateOf(null)
 
diff --git a/compose/ui/ui/integration-tests/ui-demos/src/main/java/androidx/compose/ui/demos/viewinterop/ComplexInteractions.kt b/compose/ui/ui/integration-tests/ui-demos/src/main/java/androidx/compose/ui/demos/viewinterop/ComplexInteractions.kt
index e233f66..6da88d8 100644
--- a/compose/ui/ui/integration-tests/ui-demos/src/main/java/androidx/compose/ui/demos/viewinterop/ComplexInteractions.kt
+++ b/compose/ui/ui/integration-tests/ui-demos/src/main/java/androidx/compose/ui/demos/viewinterop/ComplexInteractions.kt
@@ -43,14 +43,15 @@
 import androidx.compose.ui.unit.dp
 import androidx.compose.ui.viewinterop.AndroidView
 
-val ComplexTouchInterop = DemoCategory(
-    "Complex Touch Interop",
-    listOf(
-        ComposableDemo("Compose in Android in Compose in Android") {
-            ComposeInAndroidInComposeEtcTargetingDemo()
-        }
+val ComplexTouchInterop =
+    DemoCategory(
+        "Complex Touch Interop",
+        listOf(
+            ComposableDemo("Compose in Android in Compose in Android") {
+                ComposeInAndroidInComposeEtcTargetingDemo()
+            }
+        )
     )
-)
 
 @Composable
 fun ComposeInAndroidInComposeEtcTargetingDemo() {
@@ -66,13 +67,7 @@
                 "events translate from Android to compose a couple of times and everything " +
                 "still works."
         )
-        Box(
-            Modifier
-                .fillMaxSize()
-                .background(color = Color(0xFF777777))
-                .padding(48.dp)
-        ) {
-
+        Box(Modifier.fillMaxSize().background(color = Color(0xFF777777)).padding(48.dp)) {
             AndroidView(
                 modifier = Modifier.fillMaxHeight(),
                 factory = {
@@ -90,8 +85,7 @@
                                     }
                                 setContent {
                                     Box(
-                                        Modifier
-                                            .background(color = Color(0xFFAAAAAA))
+                                        Modifier.background(color = Color(0xFFAAAAAA))
                                             .fillMaxSize()
                                             .wrapContentSize(Alignment.Center)
                                     ) {
diff --git a/compose/ui/ui/integration-tests/ui-demos/src/main/java/androidx/compose/ui/demos/viewinterop/NestedScrollInterop.kt b/compose/ui/ui/integration-tests/ui-demos/src/main/java/androidx/compose/ui/demos/viewinterop/NestedScrollInterop.kt
index c584f2e..494d99e 100644
--- a/compose/ui/ui/integration-tests/ui-demos/src/main/java/androidx/compose/ui/demos/viewinterop/NestedScrollInterop.kt
+++ b/compose/ui/ui/integration-tests/ui-demos/src/main/java/androidx/compose/ui/demos/viewinterop/NestedScrollInterop.kt
@@ -89,65 +89,48 @@
     }
 
     // Compose Scrollable
-    Box(
-        Modifier
-            .fillMaxSize()
-            .nestedScroll(nestedScrollConnection)
-    ) {
-
+    Box(Modifier.fillMaxSize().nestedScroll(nestedScrollConnection)) {
         TopAppBar(
-            modifier = Modifier
-                .height(ToolbarHeight)
-                .offset { IntOffset(x = 0, y = toolbarOffsetHeightPx.roundToInt()) },
+            modifier =
+                Modifier.height(ToolbarHeight).offset {
+                    IntOffset(x = 0, y = toolbarOffsetHeightPx.roundToInt())
+                },
             title = { Text("toolbar offset is $toolbarOffsetHeightPx") }
         )
 
         // Android View
-        AndroidView(
-            factory = { context -> factory(context) },
-            modifier = Modifier.fillMaxWidth()
-        )
+        AndroidView(factory = { context -> factory(context) }, modifier = Modifier.fillMaxWidth())
     }
 }
 
 private fun AndroidViewWithNestedScrollEnabled(context: Context): View {
     return LayoutInflater.from(context)
-        .inflate(R.layout.android_in_compose_nested_scroll_interop, null).apply {
+        .inflate(R.layout.android_in_compose_nested_scroll_interop, null)
+        .apply {
             with(findViewById<RecyclerView>(R.id.main_list)) {
-                layoutManager =
-                    LinearLayoutManager(context, RecyclerView.VERTICAL, false)
+                layoutManager = LinearLayoutManager(context, RecyclerView.VERTICAL, false)
                 adapter = NestedScrollInteropAdapter()
             }
-        }.also {
-            ViewCompat.setNestedScrollingEnabled(it, true)
         }
+        .also { ViewCompat.setNestedScrollingEnabled(it, true) }
 }
 
 @Composable
 internal fun NestedScrollInteropComposeParentWithAndroidChild() {
-    OuterComposeWithNestedScroll { context ->
-        AndroidViewWithNestedScrollEnabled(context)
-    }
+    OuterComposeWithNestedScroll { context -> AndroidViewWithNestedScrollEnabled(context) }
 }
 
 @Composable
 private fun LazyColumnWithNestedScrollInteropEnabled() {
     LazyColumn(
-        modifier = Modifier.nestedScroll(
-            rememberNestedScrollInteropConnection()
-        ),
+        modifier = Modifier.nestedScroll(rememberNestedScrollInteropConnection()),
         contentPadding = PaddingValues(top = ToolbarHeight)
     ) {
-        item {
-            Text("This is a Lazy Column")
-        }
+        item { Text("This is a Lazy Column") }
         items(40) { item ->
             Box(
-                modifier = Modifier
-                    .padding(16.dp)
-                    .height(56.dp)
-                    .fillMaxWidth()
-                    .background(Color.Gray),
+                modifier =
+                    Modifier.padding(16.dp).height(56.dp).fillMaxWidth().background(Color.Gray),
                 contentAlignment = Alignment.Center
             ) {
                 Text(item.toString())
@@ -157,21 +140,15 @@
 }
 
 @Composable
-private fun ScrollableColumnWithNestedScrollInteropEnabled(
-    state: ScrollState,
-    hostView: View
-) {
+private fun ScrollableColumnWithNestedScrollInteropEnabled(state: ScrollState, hostView: View) {
     Column(
-        modifier = Modifier
-            .nestedScroll(rememberNestedScrollInteropConnection(hostView))
-            .verticalScroll(state)
+        modifier =
+            Modifier.nestedScroll(rememberNestedScrollInteropConnection(hostView))
+                .verticalScroll(state)
     ) {
         repeat(100) { item ->
             Box(
-                modifier = Modifier
-                    .padding(16.dp)
-                    .size(56.dp)
-                    .background(Color.Gray),
+                modifier = Modifier.padding(16.dp).size(56.dp).background(Color.Gray),
                 contentAlignment = Alignment.Center
             ) {
                 Text(item.toString())
@@ -184,19 +161,20 @@
 internal fun ComposeViewComposeNestedInterop() {
     OuterComposeWithNestedScroll { context ->
         LayoutInflater.from(context)
-            .inflate(R.layout.three_fold_nested_scroll_interop, null).apply {
+            .inflate(R.layout.three_fold_nested_scroll_interop, null)
+            .apply {
                 with(findViewById<ComposeView>(R.id.compose_view)) {
                     setContent { LazyColumnWithNestedScrollInteropEnabled() }
                 }
-            }.also {
-                ViewCompat.setNestedScrollingEnabled(it, true)
             }
+            .also { ViewCompat.setNestedScrollingEnabled(it, true) }
     }
 }
 
 private class NestedScrollInteropAdapter :
     RecyclerView.Adapter<NestedScrollInteropAdapter.NestedScrollInteropViewHolder>() {
     val items = (1..100).map { it.toString() }
+
     override fun onCreateViewHolder(
         parent: ViewGroup,
         viewType: Int
@@ -258,16 +236,14 @@
 }
 
 /**
- * A host view that uses [ScrollableState] to check if its inner scrollable can scroll
- * and to communicate with outer View world mechanisms that use [canScrollHorizontally] or
+ * A host view that uses [ScrollableState] to check if its inner scrollable can scroll and to
+ * communicate with outer View world mechanisms that use [canScrollHorizontally] or
  * [canScrollVertically] to take actions. (e.g.
  * [com.google.android.material.bottomsheet.BottomSheetBehavior],
  * [androidx.slidingpanelayout.widget.SlidingPaneLayout])
  */
-internal class NestedScrollableView(
-    context: Context,
-    attributeSet: AttributeSet
-) : FrameLayout(context, attributeSet) {
+internal class NestedScrollableView(context: Context, attributeSet: AttributeSet) :
+    FrameLayout(context, attributeSet) {
 
     var scrollableState: ScrollableState? = null
 
@@ -291,9 +267,10 @@
             setContent {
                 val nestedScrollInterop = rememberNestedScrollInteropConnection()
                 Box(modifier = Modifier.nestedScroll(nestedScrollInterop)) {
-                    AndroidView({ context ->
-                        AndroidViewWithNestedScrollEnabled(context)
-                    }, modifier = Modifier.fillMaxWidth())
+                    AndroidView(
+                        { context -> AndroidViewWithNestedScrollEnabled(context) },
+                        modifier = Modifier.fillMaxWidth()
+                    )
                 }
             }
         }
@@ -305,9 +282,7 @@
         super.onCreate(savedInstanceState)
         setContentView(R.layout.bottom_sheet_fragment_nestedscrollinterop_demo)
 
-        findViewById<Button>(R.id.button).setOnClickListener {
-            openFragment()
-        }
+        findViewById<Button>(R.id.button).setOnClickListener { openFragment() }
     }
 
     private fun openFragment() {
@@ -326,9 +301,7 @@
         view.findViewById<ComposeView>(R.id.compose_view).setContent {
             Box(Modifier.nestedScroll(rememberNestedScrollInteropConnection())) {
                 LazyColumn(modifier = Modifier.fillMaxSize()) {
-                    items(100) {
-                        Text("Item $it", Modifier.fillMaxWidth(), Color.Black)
-                    }
+                    items(100) { Text("Item $it", Modifier.fillMaxWidth(), Color.Black) }
                 }
             }
         }
diff --git a/compose/ui/ui/integration-tests/ui-demos/src/main/java/androidx/compose/ui/demos/viewinterop/PointerInputInteropAndroidInCompose.kt b/compose/ui/ui/integration-tests/ui-demos/src/main/java/androidx/compose/ui/demos/viewinterop/PointerInputInteropAndroidInCompose.kt
index 4f883bc..7f6181d 100644
--- a/compose/ui/ui/integration-tests/ui-demos/src/main/java/androidx/compose/ui/demos/viewinterop/PointerInputInteropAndroidInCompose.kt
+++ b/compose/ui/ui/integration-tests/ui-demos/src/main/java/androidx/compose/ui/demos/viewinterop/PointerInputInteropAndroidInCompose.kt
@@ -51,26 +51,25 @@
 import androidx.compose.ui.viewinterop.AndroidView
 
 @OptIn(ExperimentalComposeUiApi::class)
-val AndroidInComposeDemos = DemoCategory(
-    "Android In Compose Interop",
-    listOf(
-        ComposableDemo("4 Android tap in Compose") { FourAndroidTapInCompose() },
-        ComposableDemo("Android tap in Compose tap") { AndroidTapInComposeTap() },
-        ComposableDemo("Android tap in Compose scroll") { AndroidTapInComposeScroll() },
-        ComposableDemo("Android scroll in Compose scroll (different orientation)") {
-            AndroidScrollInComposeScrollDifferentOrientation()
-        },
-        ComposableDemo("Android scroll in Compose scroll (same orientation)") {
-            AndroidScrollInComposeScrollSameOrientation()
-        },
-        ComposableDemo("2 ScrollViews as separate children of Compose") {
-            TwoAndroidScrollViewsInCompose()
-        },
-        ComposableDemo("MotionEventPointerInputFilter") {
-            PointerInteropFilterDemo()
-        },
+val AndroidInComposeDemos =
+    DemoCategory(
+        "Android In Compose Interop",
+        listOf(
+            ComposableDemo("4 Android tap in Compose") { FourAndroidTapInCompose() },
+            ComposableDemo("Android tap in Compose tap") { AndroidTapInComposeTap() },
+            ComposableDemo("Android tap in Compose scroll") { AndroidTapInComposeScroll() },
+            ComposableDemo("Android scroll in Compose scroll (different orientation)") {
+                AndroidScrollInComposeScrollDifferentOrientation()
+            },
+            ComposableDemo("Android scroll in Compose scroll (same orientation)") {
+                AndroidScrollInComposeScrollSameOrientation()
+            },
+            ComposableDemo("2 ScrollViews as separate children of Compose") {
+                TwoAndroidScrollViewsInCompose()
+            },
+            ComposableDemo("MotionEventPointerInputFilter") { PointerInteropFilterDemo() },
+        )
     )
-)
 
 @Composable
 private fun FourAndroidTapInCompose() {
@@ -80,15 +79,11 @@
             "Below is a ViewGroup with 4 Android buttons in it.  When each button is tapped, the" +
                 " background of the ViewGroup is updated."
         )
-        Box(
-            Modifier
-                .fillMaxSize()
-                .wrapContentSize(Alignment.Center)
-                .size(240.dp)
-        ) {
+        Box(Modifier.fillMaxSize().wrapContentSize(Alignment.Center).size(240.dp)) {
             AndroidView({ context ->
                 LayoutInflater.from(context)
-                    .inflate(R.layout.android_4_buttons_in_compose, null).let { view ->
+                    .inflate(R.layout.android_4_buttons_in_compose, null)
+                    .let { view ->
                         view as ViewGroup
                         view.findViewById<View>(R.id.buttonBlue).setOnClickListener {
                             view.setBackgroundColor(Color.BLUE)
@@ -113,9 +108,7 @@
 private fun AndroidTapInComposeTap() {
     var theView: View? = null
 
-    val onTap: (Offset) -> Unit = {
-        theView?.setBackgroundColor(Color.BLUE)
-    }
+    val onTap: (Offset) -> Unit = { theView?.setBackgroundColor(Color.BLUE) }
 
     Column {
         Text(
@@ -130,17 +123,16 @@
                 "Blue."
         )
         Box(
-            Modifier
-                .fillMaxSize()
-                .wrapContentSize(Alignment.Center)
-                .size(240.dp)
-                .pointerInput(Unit) {
-                    detectTapGestures(onTap = onTap)
-                }
+            Modifier.fillMaxSize().wrapContentSize(Alignment.Center).size(240.dp).pointerInput(
+                Unit
+            ) {
+                detectTapGestures(onTap = onTap)
+            }
         ) {
             AndroidView({ context ->
                 LayoutInflater.from(context)
-                    .inflate(R.layout.android_tap_in_compose_tap, null).let { view ->
+                    .inflate(R.layout.android_tap_in_compose_tap, null)
+                    .let { view ->
                         theView = view
                         theView?.setBackgroundColor(Color.GREEN)
                         view.findViewById<View>(R.id.buttonRed).setOnClickListener {
@@ -170,31 +162,24 @@
         Row(Modifier.horizontalScroll(rememberScrollState())) {
             AndroidView({ context ->
                 LayoutInflater.from(context)
-                    .inflate(R.layout.android_tap_in_compose_scroll, null).let { view ->
+                    .inflate(R.layout.android_tap_in_compose_scroll, null)
+                    .let { view ->
                         view.setBackgroundColor(Color.YELLOW)
                         view.findViewById<View>(R.id.buttonRed).apply {
                             isClickable = false
-                            setOnClickListener {
-                                view.setBackgroundColor(Color.RED)
-                            }
+                            setOnClickListener { view.setBackgroundColor(Color.RED) }
                         }
                         view.findViewById<View>(R.id.buttonGreen).apply {
                             isClickable = false
-                            setOnClickListener {
-                                view.setBackgroundColor(Color.GREEN)
-                            }
+                            setOnClickListener { view.setBackgroundColor(Color.GREEN) }
                         }
                         view.findViewById<View>(R.id.buttonBlue).apply {
                             isClickable = false
-                            setOnClickListener {
-                                view.setBackgroundColor(Color.BLUE)
-                            }
+                            setOnClickListener { view.setBackgroundColor(Color.BLUE) }
                         }
                         view.findViewById<View>(R.id.buttonYellow).apply {
                             isClickable = false
-                            setOnClickListener {
-                                view.setBackgroundColor(Color.YELLOW)
-                            }
+                            setOnClickListener { view.setBackgroundColor(Color.YELLOW) }
                         }
                         view
                     }
@@ -216,14 +201,15 @@
                 .horizontalScroll(rememberScrollState())
         ) {
             Box(
-                modifier = Modifier.padding(96.dp)
-                    .background(androidx.compose.ui.graphics.Color.Red)
+                modifier =
+                    Modifier.padding(96.dp).background(androidx.compose.ui.graphics.Color.Red)
             ) {
                 AndroidView({ context ->
-                    LayoutInflater.from(context).inflate(
-                        R.layout.android_scroll_in_compose_scroll_different_orientation,
-                        null
-                    )
+                    LayoutInflater.from(context)
+                        .inflate(
+                            R.layout.android_scroll_in_compose_scroll_different_orientation,
+                            null
+                        )
                 })
             }
         }
@@ -246,15 +232,14 @@
                 "intercepting. "
         )
         Column(
-            Modifier
-                .background(androidx.compose.ui.graphics.Color.Blue)
+            Modifier.background(androidx.compose.ui.graphics.Color.Blue)
                 .verticalScroll(rememberScrollState())
         ) {
             Box(
-                modifier = Modifier
-                    .padding(96.dp)
-                    .background(color = androidx.compose.ui.graphics.Color.Red)
-                    .height(750.dp)
+                modifier =
+                    Modifier.padding(96.dp)
+                        .background(color = androidx.compose.ui.graphics.Color.Red)
+                        .height(750.dp)
             ) {
                 AndroidView({ context ->
                     LayoutInflater.from(context)
@@ -276,15 +261,13 @@
         Row {
             AndroidView(
                 { context ->
-                    LayoutInflater.from(context)
-                        .inflate(R.layout.android_scrollview, null)
+                    LayoutInflater.from(context).inflate(R.layout.android_scrollview, null)
                 },
                 Modifier.weight(2f)
             )
             AndroidView(
                 { context ->
-                    LayoutInflater.from(context)
-                        .inflate(R.layout.android_scrollview, null)
+                    LayoutInflater.from(context).inflate(R.layout.android_scrollview, null)
                 },
                 Modifier.weight(1f)
             )
@@ -305,8 +288,7 @@
                 " the MotionEvent that the pointerInteropFilter outputs."
         )
         Box(
-            Modifier
-                .fillMaxSize()
+            Modifier.fillMaxSize()
                 .background(androidx.compose.ui.graphics.Color.Gray)
                 .pointerInteropFilter { newMotionEvent ->
                     motionEventString.value = newMotionEvent.toString()
diff --git a/compose/ui/ui/integration-tests/ui-demos/src/main/java/androidx/compose/ui/demos/viewinterop/PointerInputInteropComposeInAndroid.kt b/compose/ui/ui/integration-tests/ui-demos/src/main/java/androidx/compose/ui/demos/viewinterop/PointerInputInteropComposeInAndroid.kt
index 5d357f3..258432e 100644
--- a/compose/ui/ui/integration-tests/ui-demos/src/main/java/androidx/compose/ui/demos/viewinterop/PointerInputInteropComposeInAndroid.kt
+++ b/compose/ui/ui/integration-tests/ui-demos/src/main/java/androidx/compose/ui/demos/viewinterop/PointerInputInteropComposeInAndroid.kt
@@ -92,43 +92,38 @@
 import androidx.viewpager2.widget.ViewPager2
 
 @OptIn(ExperimentalComposeUiApi::class)
-val ComposeInAndroidDemos = DemoCategory(
-    "Compose in Android Interop",
-    listOf(
-        ActivityDemo(
-            "Compose with no gestures in Android tap",
-            ComposeNothingInAndroidTap::class
-        ),
-        ActivityDemo(
-            "Compose tap in Android tap",
-            ComposeTapInAndroidTap::class
-        ),
-        ActivityDemo(
-            "Compose tap (dynamically loaded via window manager) in Android",
-            AndroidTapAddOrRemoveComposeDynamicallyWithWindowManager::class
-        ),
-        ActivityDemo(
-            "Compose tap in Android scroll",
-            ComposeTapInAndroidScroll::class
-        ),
-        ActivityDemo(
-            "Compose scroll in Android scroll (same orientation, vertical)",
-            ComposeScrollInAndroidScrollSameOrientation::class
-        ),
-        ActivityDemo(
-            "Compose scroll in Android scroll (horizontal pager)",
-            ComposeScrollInAndroidScrollSameOrientationHorizontal::class
-        ),
-        ActivityDemo(
-            "Compose scroll in Android scroll (different orientations)",
-            ComposeScrollInAndroidScrollDifferentOrientation::class
-        ),
-        ActivityDemo(
-            "Compose in Android dialog dismisses dialog during dispatch",
-            ComposeInAndroidDialogDismissDialogDuringDispatch::class
+val ComposeInAndroidDemos =
+    DemoCategory(
+        "Compose in Android Interop",
+        listOf(
+            ActivityDemo(
+                "Compose with no gestures in Android tap",
+                ComposeNothingInAndroidTap::class
+            ),
+            ActivityDemo("Compose tap in Android tap", ComposeTapInAndroidTap::class),
+            ActivityDemo(
+                "Compose tap (dynamically loaded via window manager) in Android",
+                AndroidTapAddOrRemoveComposeDynamicallyWithWindowManager::class
+            ),
+            ActivityDemo("Compose tap in Android scroll", ComposeTapInAndroidScroll::class),
+            ActivityDemo(
+                "Compose scroll in Android scroll (same orientation, vertical)",
+                ComposeScrollInAndroidScrollSameOrientation::class
+            ),
+            ActivityDemo(
+                "Compose scroll in Android scroll (horizontal pager)",
+                ComposeScrollInAndroidScrollSameOrientationHorizontal::class
+            ),
+            ActivityDemo(
+                "Compose scroll in Android scroll (different orientations)",
+                ComposeScrollInAndroidScrollDifferentOrientation::class
+            ),
+            ActivityDemo(
+                "Compose in Android dialog dismisses dialog during dispatch",
+                ComposeInAndroidDialogDismissDialogDuringDispatch::class
+            )
         )
     )
-)
 
 open class ComposeNothingInAndroidTap : ComponentActivity() {
 
@@ -153,19 +148,15 @@
         container.isClickable = true
         container.setBackgroundColor(currentColor.toArgb())
         container.setOnClickListener {
-            currentColor = if (currentColor == Color.Green) {
-                Color.Red
-            } else {
-                Color.Green
-            }
+            currentColor =
+                if (currentColor == Color.Green) {
+                    Color.Red
+                } else {
+                    Color.Green
+                }
             container.setBackgroundColor(currentColor.toArgb())
         }
-        container.setContent {
-            Box(
-                Modifier
-                    .background(color = Color.LightGray)
-                    .fillMaxSize())
-        }
+        container.setContent { Box(Modifier.background(color = Color.LightGray).fillMaxSize()) }
     }
 }
 
@@ -178,8 +169,7 @@
         super.onCreate(savedInstanceState)
         setContentView(R.layout.compose_in_android_tap)
 
-        findViewById<TextView>(R.id.text1).text =
-            "Demonstrates correct interop with simple tapping"
+        findViewById<TextView>(R.id.text1).text = "Demonstrates correct interop with simple tapping"
         findViewById<TextView>(R.id.text2).text =
             "The inner box is Compose, the outer is Android.  When you tap on the inner box, " +
                 "only it changes colors. When you tap on the outer box, only the outer box " +
@@ -189,11 +179,12 @@
         container.isClickable = true
         container.setBackgroundColor(currentColor.toArgb())
         container.setOnClickListener {
-            currentColor = if (currentColor == Color.Green) {
-                Color.Red
-            } else {
-                Color.Green
-            }
+            currentColor =
+                if (currentColor == Color.Green) {
+                    Color.Red
+                } else {
+                    Color.Green
+                }
             container.setBackgroundColor(currentColor.toArgb())
         }
 
@@ -208,14 +199,7 @@
                     }
                 }
 
-            Column {
-                Box(
-                    tap.then(
-                        Modifier
-                            .background(color = currentColor.value)
-                            .fillMaxSize())
-                )
-            }
+            Column { Box(tap.then(Modifier.background(color = currentColor.value).fillMaxSize())) }
         }
     }
 }
@@ -276,28 +260,26 @@
         get() = mViewModelStore
 }
 
-private fun Context.buildWindowView(
-    content: @Composable (composeView: View) -> Unit
-): View {
+private fun Context.buildWindowView(content: @Composable (composeView: View) -> Unit): View {
     val lifecycleOwner = ComposeViewLifecycleOwner()
 
     lifecycleOwner.performRestore(null)
     lifecycleOwner.handleLifecycleEvent(event = Lifecycle.Event.ON_CREATE)
 
     return ComposeView(this).apply {
-        setContent {
-            content(this)
-        }
+        setContent { content(this) }
 
-        addOnAttachStateChangeListener(object : View.OnAttachStateChangeListener {
-            override fun onViewAttachedToWindow(view: View) {
-                lifecycleOwner.handleLifecycleEvent(event = Lifecycle.Event.ON_RESUME)
-            }
+        addOnAttachStateChangeListener(
+            object : View.OnAttachStateChangeListener {
+                override fun onViewAttachedToWindow(view: View) {
+                    lifecycleOwner.handleLifecycleEvent(event = Lifecycle.Event.ON_RESUME)
+                }
 
-            override fun onViewDetachedFromWindow(view: View) {
-                lifecycleOwner.handleLifecycleEvent(event = Lifecycle.Event.ON_PAUSE)
+                override fun onViewDetachedFromWindow(view: View) {
+                    lifecycleOwner.handleLifecycleEvent(event = Lifecycle.Event.ON_PAUSE)
+                }
             }
-        })
+        )
 
         setViewTreeSavedStateRegistryOwner(lifecycleOwner)
         setViewTreeLifecycleOwner(lifecycleOwner = lifecycleOwner)
@@ -315,7 +297,7 @@
 
     layoutParas.width = 1000
     layoutParas.height = 1000
-    layoutParas.flags = WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL;
+    layoutParas.flags = WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL
 
     windowManager.addView(view, layoutParas)
 
@@ -336,9 +318,7 @@
         Scaffold(
             topBar = {
                 TopAppBar(
-                    title = {
-                        Text(text = "Top Bar Clicks: $topBarClickCount")
-                            },
+                    title = { Text(text = "Top Bar Clicks: $topBarClickCount") },
                     navigationIcon = {
                         IconButton(onClick = { topBarClickCount++ }) {
                             Icon(imageVector = Icons.Default.Close, contentDescription = null)
@@ -347,16 +327,8 @@
                 )
             }
         ) { padding ->
-            Box(
-                modifier = Modifier
-                    .fillMaxSize()
-                    .padding(padding)
-                    .background(Color.Yellow)
-            ) {
-                Button(
-                    modifier = Modifier.padding(5.dp),
-                    onClick = { bodyClickCount++ }
-                ) {
+            Box(modifier = Modifier.fillMaxSize().padding(padding).background(Color.Yellow)) {
+                Button(modifier = Modifier.padding(5.dp), onClick = { bodyClickCount++ }) {
                     Text(text = "Button Clicks: $bodyClickCount")
                 }
             }
@@ -390,17 +362,17 @@
                     val currentColor = remember { mutableStateOf(Color.LightGray) }
 
                     Box(
-                        Modifier
-                            .background(color = Color.Gray)
+                        Modifier.background(color = Color.Gray)
                             .fillMaxWidth()
                             .height(456.dp)
                             .wrapContentSize()
                             .clickable {
-                                currentColor.value = if (currentColor.value == Color.Blue) {
-                                    Color.Yellow
-                                } else {
-                                    Color.Blue
-                                }
+                                currentColor.value =
+                                    if (currentColor.value == Color.Blue) {
+                                        Color.Yellow
+                                    } else {
+                                        Color.Blue
+                                    }
                             }
                             .background(currentColor.value, RectangleShape)
                             .size(192.dp)
@@ -408,7 +380,8 @@
                 }
             },
             ViewGroup.LayoutParams(
-                ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT
+                ViewGroup.LayoutParams.WRAP_CONTENT,
+                ViewGroup.LayoutParams.WRAP_CONTENT
             )
         )
     }
@@ -438,16 +411,15 @@
             ComposeView(this).apply {
                 setContent {
                     Column(
-                        modifier = Modifier
-                            .padding(48.dp)
-                            .background(color = Color.Gray)
-                            .fillMaxWidth()
-                            .height(456.dp)
-                            .verticalScroll(rememberScrollState())
+                        modifier =
+                            Modifier.padding(48.dp)
+                                .background(color = Color.Gray)
+                                .fillMaxWidth()
+                                .height(456.dp)
+                                .verticalScroll(rememberScrollState())
                     ) {
                         Box(
-                            Modifier
-                                .padding(48.dp)
+                            Modifier.padding(48.dp)
                                 .background(color = Color.LightGray)
                                 .fillMaxWidth()
                                 .height(456.dp)
@@ -456,7 +428,8 @@
                 }
             },
             ViewGroup.LayoutParams(
-                ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT
+                ViewGroup.LayoutParams.WRAP_CONTENT,
+                ViewGroup.LayoutParams.WRAP_CONTENT
             )
         )
     }
@@ -468,9 +441,7 @@
         super.onCreate(savedInstanceState)
         setContentView(R.layout.compose_in_android_scroll_horizontal_pager)
 
-        findViewById<ViewPager2>(R.id.pager).apply {
-            adapter = ViewPager2Adapter(context)
-        }
+        findViewById<ViewPager2>(R.id.pager).apply { adapter = ViewPager2Adapter(context) }
     }
 }
 
@@ -492,9 +463,7 @@
                 contentPadding = PaddingValues(24.dp)
             ) {
                 items(5) { index ->
-                    Card(
-                        modifier = Modifier.height(240.dp)
-                    ) {
+                    Card(modifier = Modifier.height(240.dp)) {
                         Text(
                             modifier = Modifier.padding(12.dp),
                             text = "LazyRow Item: $index",
@@ -538,16 +507,15 @@
             ComposeView(this).apply {
                 setContent {
                     Row(
-                        modifier = Modifier
-                            .padding(48.dp)
-                            .background(color = Color.Gray)
-                            .height(700.dp)
-                            .width(456.dp)
-                            .horizontalScroll(rememberScrollState())
+                        modifier =
+                            Modifier.padding(48.dp)
+                                .background(color = Color.Gray)
+                                .height(700.dp)
+                                .width(456.dp)
+                                .horizontalScroll(rememberScrollState())
                     ) {
                         Box(
-                            Modifier
-                                .padding(48.dp)
+                            Modifier.padding(48.dp)
                                 .background(color = Color.LightGray)
                                 .width(360.dp)
                                 .fillMaxHeight()
@@ -556,7 +524,8 @@
                 }
             },
             ViewGroup.LayoutParams(
-                ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT
+                ViewGroup.LayoutParams.WRAP_CONTENT,
+                ViewGroup.LayoutParams.WRAP_CONTENT
             )
         )
     }
@@ -596,18 +565,16 @@
         savedInstanceState: Bundle?
     ): View {
 
-        val frameLayout = ComposeView(inflater.context).apply {
-            layoutParams = ViewGroup.LayoutParams(
-                ViewGroup.LayoutParams.WRAP_CONTENT,
-                ViewGroup.LayoutParams.WRAP_CONTENT
-            )
-        }
-
-        frameLayout.setContent {
-            Button({ this@MyDialogFragment.dismiss() }) {
-                Text("Close me")
+        val frameLayout =
+            ComposeView(inflater.context).apply {
+                layoutParams =
+                    ViewGroup.LayoutParams(
+                        ViewGroup.LayoutParams.WRAP_CONTENT,
+                        ViewGroup.LayoutParams.WRAP_CONTENT
+                    )
             }
-        }
+
+        frameLayout.setContent { Button({ this@MyDialogFragment.dismiss() }) { Text("Close me") } }
 
         return frameLayout
     }
diff --git a/compose/ui/ui/integration-tests/ui-demos/src/main/java/androidx/compose/ui/demos/viewinterop/RecyclerViewFocusTransferDemo.kt b/compose/ui/ui/integration-tests/ui-demos/src/main/java/androidx/compose/ui/demos/viewinterop/RecyclerViewFocusTransferDemo.kt
index e61a345..48ba11b 100644
--- a/compose/ui/ui/integration-tests/ui-demos/src/main/java/androidx/compose/ui/demos/viewinterop/RecyclerViewFocusTransferDemo.kt
+++ b/compose/ui/ui/integration-tests/ui-demos/src/main/java/androidx/compose/ui/demos/viewinterop/RecyclerViewFocusTransferDemo.kt
@@ -69,11 +69,12 @@
                 this.isFocusableInTouchMode = true
                 val focusRequester = FocusRequester()
 
-                this.onFocusChangeListener = View.OnFocusChangeListener { _, hasFocus ->
-                    if (hasFocus) {
-                        focusRequester.requestFocus()
+                this.onFocusChangeListener =
+                    View.OnFocusChangeListener { _, hasFocus ->
+                        if (hasFocus) {
+                            focusRequester.requestFocus()
+                        }
                     }
-                }
 
                 setContent {
                     FocusableText(
@@ -97,12 +98,13 @@
     var color by remember { mutableStateOf(Color.Unspecified) }
     val focusRequester = remember { FocusRequester() }
     Text(
-        modifier = modifier
-            .background(color)
-            .focusRequester(focusRequester)
-            .onFocusEvent { color = if (it.isFocused) Color.LightGray else Color.Unspecified }
-            .focusTarget()
-            .pointerInput(Unit) { detectTapGestures { focusRequester.requestFocus() } },
+        modifier =
+            modifier
+                .background(color)
+                .focusRequester(focusRequester)
+                .onFocusEvent { color = if (it.isFocused) Color.LightGray else Color.Unspecified }
+                .focusTarget()
+                .pointerInput(Unit) { detectTapGestures { focusRequester.requestFocus() } },
         text = text,
         fontSize = 30.sp
     )
diff --git a/compose/ui/ui/integration-tests/ui-demos/src/main/java/androidx/compose/ui/demos/viewinterop/ResizeComposeViewDemo.kt b/compose/ui/ui/integration-tests/ui-demos/src/main/java/androidx/compose/ui/demos/viewinterop/ResizeComposeViewDemo.kt
index 411c70c..30a4fd2 100644
--- a/compose/ui/ui/integration-tests/ui-demos/src/main/java/androidx/compose/ui/demos/viewinterop/ResizeComposeViewDemo.kt
+++ b/compose/ui/ui/integration-tests/ui-demos/src/main/java/androidx/compose/ui/demos/viewinterop/ResizeComposeViewDemo.kt
@@ -38,29 +38,29 @@
 fun ResizeComposeViewDemo() {
     var size by remember { mutableStateOf(IntSize(0, 0)) }
     Box(
-        Modifier
-            .fillMaxSize()
-            .pointerInput(Unit) {
-                awaitPointerEventScope {
-                    while (true) {
-                        val event = awaitPointerEvent()
-                        event.changes.forEach { it.consume() }
-                        val change = event.changes.firstOrNull()
-                        if (change != null) {
-                            val position = change.position.round()
-                            size = IntSize(position.x, position.y)
-                        }
+        Modifier.fillMaxSize().pointerInput(Unit) {
+            awaitPointerEventScope {
+                while (true) {
+                    val event = awaitPointerEvent()
+                    event.changes.forEach { it.consume() }
+                    val change = event.changes.firstOrNull()
+                    if (change != null) {
+                        val position = change.position.round()
+                        size = IntSize(position.x, position.y)
                     }
                 }
-            }) {
+            }
+        }
+    ) {
         with(LocalDensity.current) {
-            AndroidView(factory = { context ->
-                ComposeView(context).apply {
-                    setContent {
-                        Box(Modifier.fillMaxSize().background(Color.Blue))
+            AndroidView(
+                factory = { context ->
+                    ComposeView(context).apply {
+                        setContent { Box(Modifier.fillMaxSize().background(Color.Blue)) }
                     }
-                }
-            }, modifier = Modifier.size(size.width.toDp(), size.height.toDp()))
+                },
+                modifier = Modifier.size(size.width.toDp(), size.height.toDp())
+            )
             Text("Touch the screen to change the size of the child ComposeView")
         }
     }
diff --git a/compose/ui/ui/integration-tests/ui-demos/src/main/java/androidx/compose/ui/demos/viewinterop/ScrollingAndroidViewsDemo.kt b/compose/ui/ui/integration-tests/ui-demos/src/main/java/androidx/compose/ui/demos/viewinterop/ScrollingAndroidViewsDemo.kt
index debf0ea..2d858de 100644
--- a/compose/ui/ui/integration-tests/ui-demos/src/main/java/androidx/compose/ui/demos/viewinterop/ScrollingAndroidViewsDemo.kt
+++ b/compose/ui/ui/integration-tests/ui-demos/src/main/java/androidx/compose/ui/demos/viewinterop/ScrollingAndroidViewsDemo.kt
@@ -56,10 +56,7 @@
                 Text("Check All")
             }
 
-            Button(
-                onClick = { checkedItems = emptySet() },
-                modifier = Modifier.weight(1f)
-            ) {
+            Button(onClick = { checkedItems = emptySet() }, modifier = Modifier.weight(1f)) {
                 Text("Uncheck All")
             }
         }
@@ -68,8 +65,7 @@
             checkedItems = checkedItems,
             onChangeCheck = { item, checked ->
                 @Suppress("SuspiciousCollectionReassignment")
-                if (checked) checkedItems += item
-                else checkedItems -= item
+                if (checked) checkedItems += item else checkedItems -= item
             }
         )
     }
@@ -99,13 +95,10 @@
                         }
                 },
                 update = { view ->
-                    view.findViewById<TextView>(R.id.android_view_row_label).text =
-                        "Item $index"
+                    view.findViewById<TextView>(R.id.android_view_row_label).text = "Item $index"
 
                     view.findViewById<CheckBox>(R.id.android_view_row_checkbox).apply {
-                        setOnCheckedChangeListener { _, checked ->
-                            onChangeCheck(index, checked)
-                        }
+                        setOnCheckedChangeListener { _, checked -> onChangeCheck(index, checked) }
 
                         isChecked = index in checkedItems
                         if (view in resetViews) {
@@ -116,12 +109,8 @@
                         }
                     }
                 },
-                onReset = { view ->
-                    resetViews += view
-                },
-                onRelease = { view ->
-                    resetViews -= view
-                }
+                onReset = { view -> resetViews += view },
+                onRelease = { view -> resetViews -= view }
             )
         }
     }
diff --git a/compose/ui/ui/integration-tests/ui-demos/src/main/java/androidx/compose/ui/demos/viewinterop/ViewInterop.kt b/compose/ui/ui/integration-tests/ui-demos/src/main/java/androidx/compose/ui/demos/viewinterop/ViewInterop.kt
index 22effa7..4e79c01 100644
--- a/compose/ui/ui/integration-tests/ui-demos/src/main/java/androidx/compose/ui/demos/viewinterop/ViewInterop.kt
+++ b/compose/ui/ui/integration-tests/ui-demos/src/main/java/androidx/compose/ui/demos/viewinterop/ViewInterop.kt
@@ -61,9 +61,7 @@
         // and Compose in Android ViewGroups. Note that these APIs are subject to change.
 
         // Compose and inflate a layout with ViewBinding.
-        AndroidViewBinding(TestLayoutBinding::inflate) {
-            text1.text = "Text updated"
-        }
+        AndroidViewBinding(TestLayoutBinding::inflate) { text1.text = "Text updated" }
 
         // Compose Android View.
         AndroidView({ context -> TextView(context).apply { text = "This is a TextView" } })
@@ -74,9 +72,7 @@
             view.layoutParams = ViewGroup.LayoutParams(size, size)
         }
 
-        AndroidView(::TextView) {
-            it.text = "This is a text in a TextView"
-        }
+        AndroidView(::TextView) { it.text = "This is a text in a TextView" }
 
         // Compose custom Android View and do remeasurements and invalidates.
         val squareRef = Ref<ColoredSquareView>()
@@ -84,32 +80,42 @@
             it.size = 200
             it.color = Color.Cyan
         }
-        Button(onClick = { squareRef.value!!.size += 50 }) {
-            Text("Increase size of Android view")
-        }
+        Button(onClick = { squareRef.value!!.size += 50 }) { Text("Increase size of Android view") }
         val colorIndex = remember { mutableIntStateOf(0) }
         Button(
             onClick = {
                 colorIndex.intValue = (colorIndex.intValue + 1) % 4
-                squareRef.value!!.color = arrayOf(
-                    Color.Blue, Color.LightGray, Color.Yellow, Color.Cyan
-                )[colorIndex.intValue]
+                squareRef.value!!.color =
+                    arrayOf(Color.Blue, Color.LightGray, Color.Yellow, Color.Cyan)[
+                        colorIndex.intValue]
             }
         ) {
             Text("Change color of Android view")
         }
 
-        Column(modifier =
-            Modifier.fillMaxWidth().height(100.dp).verticalScroll(rememberScrollState())
+        Column(
+            modifier = Modifier.fillMaxWidth().height(100.dp).verticalScroll(rememberScrollState())
         ) {
             AndroidView({ c ->
                 LinearLayout(c).apply {
-                    val text1 = TextView(c).apply { text = "LinearLayout child 1"; id = 11 }
-                    val text2 = TextView(c).apply { text = "LinearLayout child 2"; id = 22 }
-                    val text3 = TextView(c).apply { text = "LinearLayout child 3"; id = 33 }
+                    val text1 =
+                        TextView(c).apply {
+                            text = "LinearLayout child 1"
+                            id = 11
+                        }
+                    val text2 =
+                        TextView(c).apply {
+                            text = "LinearLayout child 2"
+                            id = 22
+                        }
+                    val text3 =
+                        TextView(c).apply {
+                            text = "LinearLayout child 3"
+                            id = 33
+                        }
                     if (Build.VERSION.SDK_INT >= 26) {
-                        Api26Impl.setAccessibilityTraversalAfter(text3, text2.getId());
-                        Api26Impl.setAccessibilityTraversalAfter(text2, text1.getId());
+                        Api26Impl.setAccessibilityTraversalAfter(text3, text2.getId())
+                        Api26Impl.setAccessibilityTraversalAfter(text2, text1.getId())
                     }
                     addView(text3)
                     addView(text2)
@@ -120,9 +126,7 @@
 
         Spacer(Modifier.height(20.dp))
 
-        LazyColumn(
-            modifier = Modifier.fillMaxWidth().height(50.dp)
-        ) {
+        LazyColumn(modifier = Modifier.fillMaxWidth().height(50.dp)) {
             item {
                 AndroidView(::TextView) { it.text = "TextView in LazyColumn 1A" }
                 AndroidView(::TextView) { it.text = "TextView in LazyColumn 1B" }
@@ -194,10 +198,7 @@
 private object Api26Impl {
     @DoNotInline
     @JvmStatic
-    fun setAccessibilityTraversalAfter(
-        view: View,
-        id: Int
-    ) {
-        view.setAccessibilityTraversalAfter(id);
+    fun setAccessibilityTraversalAfter(view: View, id: Int) {
+        view.setAccessibilityTraversalAfter(id)
     }
 }
diff --git a/compose/ui/ui/samples/src/main/java/androidx/compose/ui/samples/AlignmentLineSample.kt b/compose/ui/ui/samples/src/main/java/androidx/compose/ui/samples/AlignmentLineSample.kt
index 689a17a..ac7df01 100644
--- a/compose/ui/ui/samples/src/main/java/androidx/compose/ui/samples/AlignmentLineSample.kt
+++ b/compose/ui/ui/samples/src/main/java/androidx/compose/ui/samples/AlignmentLineSample.kt
@@ -36,9 +36,7 @@
     @Composable
     fun LineProviderLayout(exampleLinePosition: Int) {
         val size: Int = 20
-        Layout({}) { _, _ ->
-            layout(size, size, mapOf(exampleLine to exampleLinePosition)) {}
-        }
+        Layout({}) { _, _ -> layout(size, size, mapOf(exampleLine to exampleLinePosition)) {} }
     }
 
     Layout({
diff --git a/compose/ui/ui/samples/src/main/java/androidx/compose/ui/samples/AndroidViewSample.kt b/compose/ui/ui/samples/src/main/java/androidx/compose/ui/samples/AndroidViewSample.kt
index 3b9a823..ffc011a 100644
--- a/compose/ui/ui/samples/src/main/java/androidx/compose/ui/samples/AndroidViewSample.kt
+++ b/compose/ui/ui/samples/src/main/java/androidx/compose/ui/samples/AndroidViewSample.kt
@@ -59,10 +59,7 @@
     AndroidView({ context -> TextView(context).apply { text = "This is a TextView" } })
     // Compose a View and update its size based on state. Note the modifiers.
     var size by remember { mutableStateOf(20) }
-    AndroidView(::View,
-        Modifier
-            .clickable { size += 20 }
-            .background(Color.Blue)) { view ->
+    AndroidView(::View, Modifier.clickable { size += 20 }.background(Color.Blue)) { view ->
         view.layoutParams = ViewGroup.LayoutParams(size, size)
     }
 }
@@ -87,9 +84,7 @@
     val lifecycle = LocalLifecycleOwner.current.lifecycle
     AndroidView(
         factory = { context -> LifecycleAwareView(context) },
-        update = { view ->
-            view.lifecycle = lifecycle
-        },
+        update = { view -> view.lifecycle = lifecycle },
         onRelease = { view ->
             // Need to release the lifecycle to prevent a memory leak
             view.lifecycle = null
@@ -101,27 +96,27 @@
 @Sampled
 @Composable
 fun ReusableAndroidViewInLazyColumnSample() {
-    val urls = listOf(
-        "https://developer.android.com/jetpack/compose",
-        "https://google.github.io/accompanist/",
-        "https://android-developers.googleblog.com/",
-        "https://io.google/",
-        // ...
-    )
+    val urls =
+        listOf(
+            "https://developer.android.com/jetpack/compose",
+            "https://google.github.io/accompanist/",
+            "https://android-developers.googleblog.com/",
+            "https://io.google/",
+            // ...
+        )
     LazyVerticalGrid(columns = GridCells.Adaptive(512.dp)) {
         items(urls) { url ->
             AndroidView(
                 factory = { context ->
                     WebView(context).apply {
                         settings.javaScriptEnabled = true
-                        webViewClient = object : WebViewClient() {
-                            // Optional overrides for WebViewClient
-                        }
+                        webViewClient =
+                            object : WebViewClient() {
+                                // Optional overrides for WebViewClient
+                            }
                     }
                 },
-                modifier = Modifier
-                    .fillMaxWidth()
-                    .aspectRatio(1f),
+                modifier = Modifier.fillMaxWidth().aspectRatio(1f),
                 update = { webView -> webView.loadUrl(url) },
                 onReset = { webView ->
                     webView.stopLoading()
@@ -138,9 +133,8 @@
 fun AndroidDrawableInDrawScopeSample() {
     val drawable = LocalContext.current.getDrawable(R.drawable.sample_drawable)
     Box(
-        modifier = Modifier
-            .requiredSize(100.dp)
-            .drawBehind {
+        modifier =
+            Modifier.requiredSize(100.dp).drawBehind {
                 drawIntoCanvas { canvas ->
                     drawable?.let {
                         it.setBounds(0, 0, size.width.roundToInt(), size.height.roundToInt())
diff --git a/compose/ui/ui/samples/src/main/java/androidx/compose/ui/samples/BlurSample.kt b/compose/ui/ui/samples/src/main/java/androidx/compose/ui/samples/BlurSample.kt
index 4ecd92c..1e18f68 100644
--- a/compose/ui/ui/samples/src/main/java/androidx/compose/ui/samples/BlurSample.kt
+++ b/compose/ui/ui/samples/src/main/java/androidx/compose/ui/samples/BlurSample.kt
@@ -37,10 +37,7 @@
     Box(
         Modifier.size(300.dp)
             // Blur content allowing the result to extend beyond the bounds of the original content
-            .blur(
-                30.dp,
-                edgeTreatment = BlurredEdgeTreatment.Unbounded
-            )
+            .blur(30.dp, edgeTreatment = BlurredEdgeTreatment.Unbounded)
             .background(Color.Red, CircleShape)
     )
 }
diff --git a/compose/ui/ui/samples/src/main/java/androidx/compose/ui/samples/DrawModifierSample.kt b/compose/ui/ui/samples/src/main/java/androidx/compose/ui/samples/DrawModifierSample.kt
index 85db583..e7445a8 100644
--- a/compose/ui/ui/samples/src/main/java/androidx/compose/ui/samples/DrawModifierSample.kt
+++ b/compose/ui/ui/samples/src/main/java/androidx/compose/ui/samples/DrawModifierSample.kt
@@ -45,10 +45,9 @@
 import androidx.compose.ui.unit.dp
 
 /**
- * Sample showing how to leverage [Modifier.drawWithCache] in order
- * to cache contents in between draw calls that depend on sizing information.
- * In the example below, the LinearGradient is created once and re-used across
- * calls to onDraw. If the size of the drawing area changes, then the
+ * Sample showing how to leverage [Modifier.drawWithCache] in order to cache contents in between
+ * draw calls that depend on sizing information. In the example below, the LinearGradient is created
+ * once and re-used across calls to onDraw. If the size of the drawing area changes, then the
  * LinearGradient is re-created with the updated width and height.
  */
 @Sampled
@@ -56,24 +55,22 @@
 fun DrawWithCacheModifierSample() {
     Box(
         Modifier.drawWithCache {
-            val gradient = Brush.linearGradient(
-                colors = listOf(Color.Red, Color.Blue),
-                start = Offset.Zero,
-                end = Offset(size.width, size.height)
-            )
-            onDrawBehind {
-                drawRect(gradient)
-            }
+            val gradient =
+                Brush.linearGradient(
+                    colors = listOf(Color.Red, Color.Blue),
+                    start = Offset.Zero,
+                    end = Offset(size.width, size.height)
+                )
+            onDrawBehind { drawRect(gradient) }
         }
     )
 }
 
 /**
- * Sample showing how to leverage [Modifier.drawWithCache] to persist data across
- * draw calls. In the example below, the linear gradient will be re-created if either
- * the size of the drawing area changes, or the toggle flag represented by a mutable state
- * object changes. Otherwise the same linear gradient instance is re-used for each call
- * to drawRect.
+ * Sample showing how to leverage [Modifier.drawWithCache] to persist data across draw calls. In the
+ * example below, the linear gradient will be re-created if either the size of the drawing area
+ * changes, or the toggle flag represented by a mutable state object changes. Otherwise the same
+ * linear gradient instance is re-used for each call to drawRect.
  */
 @Sampled
 @Composable
@@ -82,53 +79,56 @@
     val colors2 = listOf(Color.Yellow, Color.Green)
     var toggle by remember { mutableStateOf(true) }
     Box(
-        Modifier.clickable { toggle = !toggle }.drawWithCache {
-            val gradient = Brush.linearGradient(
-                colors = if (toggle) colors1 else colors2,
-                start = Offset.Zero,
-                end = Offset(size.width, size.height)
-            )
-            onDrawBehind {
-                drawRect(gradient)
+        Modifier.clickable { toggle = !toggle }
+            .drawWithCache {
+                val gradient =
+                    Brush.linearGradient(
+                        colors = if (toggle) colors1 else colors2,
+                        start = Offset.Zero,
+                        end = Offset(size.width, size.height)
+                    )
+                onDrawBehind { drawRect(gradient) }
             }
-        }
     )
 }
 
 /**
- * Sample showing how to leverage [Modifier.drawWithCache] to cache a LinearGradient
- * if the size is unchanged. Additionally this sample illustrates how to re-arrange
- * drawing order using [ContentDrawScope.drawContent] in order to draw the desired
- * content first to support blending against the sample vector graphic of a triangle
+ * Sample showing how to leverage [Modifier.drawWithCache] to cache a LinearGradient if the size is
+ * unchanged. Additionally this sample illustrates how to re-arrange drawing order using
+ * [ContentDrawScope.drawContent] in order to draw the desired content first to support blending
+ * against the sample vector graphic of a triangle
  */
 @Sampled
 @Composable
 fun DrawWithCacheContentSample() {
-    val vectorPainter = rememberVectorPainter(24.dp, 24.dp, autoMirror = true) {
-            viewportWidth, viewportHeight ->
-        Path(
-            pathData = PathData {
-                lineTo(viewportWidth, 0f)
-                lineTo(0f, viewportHeight)
-                close()
-            },
-            fill = SolidColor(Color.Black)
-        )
-    }
+    val vectorPainter =
+        rememberVectorPainter(24.dp, 24.dp, autoMirror = true) { viewportWidth, viewportHeight ->
+            Path(
+                pathData =
+                    PathData {
+                        lineTo(viewportWidth, 0f)
+                        lineTo(0f, viewportHeight)
+                        close()
+                    },
+                fill = SolidColor(Color.Black)
+            )
+        }
     Image(
         painter = vectorPainter,
         contentDescription = null,
-        modifier = Modifier.requiredSize(120.dp).drawWithCache {
-            val gradient = Brush.linearGradient(
-                colors = listOf(Color.Red, Color.Blue),
-                start = Offset.Zero,
-                end = Offset(0f, size.height)
-            )
-            onDrawWithContent {
-                drawContent()
-                drawRect(gradient, blendMode = BlendMode.Plus)
+        modifier =
+            Modifier.requiredSize(120.dp).drawWithCache {
+                val gradient =
+                    Brush.linearGradient(
+                        colors = listOf(Color.Red, Color.Blue),
+                        start = Offset.Zero,
+                        end = Offset(0f, size.height)
+                    )
+                onDrawWithContent {
+                    drawContent()
+                    drawRect(gradient, blendMode = BlendMode.Plus)
+                }
             }
-        }
     )
 }
 
@@ -143,9 +143,11 @@
     }
     data class CircleElement(val color: Color) : ModifierNodeElement<CircleNode>() {
         override fun create() = CircleNode(color)
+
         override fun update(node: CircleNode) {
             node.color = color
         }
+
         override fun InspectorInfo.inspectableProperties() {
             name = "color"
             properties["color"] = color
diff --git a/compose/ui/ui/samples/src/main/java/androidx/compose/ui/samples/FocusAwareInputSamples.kt b/compose/ui/ui/samples/src/main/java/androidx/compose/ui/samples/FocusAwareInputSamples.kt
index 707fde0..b5c8abe 100644
--- a/compose/ui/ui/samples/src/main/java/androidx/compose/ui/samples/FocusAwareInputSamples.kt
+++ b/compose/ui/ui/samples/src/main/java/androidx/compose/ui/samples/FocusAwareInputSamples.kt
@@ -71,14 +71,9 @@
     // When the inner Box is focused, and the user presses a key, the key goes down the hierarchy
     // and then back up to the parent. At any stage you can stop the propagation by returning
     // true to indicate that you consumed the event.
-    Box(
-        Modifier
-            .onPreviewKeyEvent { keyEvent1 -> false }
-            .onKeyEvent { keyEvent4 -> false }
-    ) {
+    Box(Modifier.onPreviewKeyEvent { keyEvent1 -> false }.onKeyEvent { keyEvent4 -> false }) {
         Box(
-            Modifier
-                .onPreviewKeyEvent { keyEvent2 -> false }
+            Modifier.onPreviewKeyEvent { keyEvent2 -> false }
                 .onKeyEvent { keyEvent3 -> false }
                 .focusable()
         )
@@ -89,8 +84,7 @@
 @Composable
 fun KeyEventTypeSample() {
     Box(
-        Modifier
-            .onKeyEvent {
+        Modifier.onKeyEvent {
                 when (it.type) {
                     KeyUp -> println("KeyUp Pressed")
                     KeyDown -> println("KeyUp Pressed")
@@ -108,8 +102,7 @@
 @Composable
 fun KeyEventIsAltPressedSample() {
     Box(
-        Modifier
-            .onKeyEvent {
+        Modifier.onKeyEvent {
                 if (it.isAltPressed && it.key == Key.A) {
                     println("Alt + A is pressed")
                     true
@@ -126,8 +119,7 @@
 @Composable
 fun KeyEventIsCtrlPressedSample() {
     Box(
-        Modifier
-            .onKeyEvent {
+        Modifier.onKeyEvent {
                 if (it.isCtrlPressed && it.key == Key.A) {
                     println("Ctrl + A is pressed")
                     true
@@ -144,8 +136,7 @@
 @Composable
 fun KeyEventIsMetaPressedSample() {
     Box(
-        Modifier
-            .onKeyEvent {
+        Modifier.onKeyEvent {
                 if (it.isMetaPressed && it.key == Key.A) {
                     println("Meta + A is pressed")
                     true
@@ -162,8 +153,7 @@
 @Composable
 fun KeyEventIsShiftPressedSample() {
     Box(
-        Modifier
-            .onKeyEvent {
+        Modifier.onKeyEvent {
                 if (it.isShiftPressed && it.key == Key.A) {
                     println("Shift + A is pressed")
                     true
@@ -183,18 +173,19 @@
     val coroutineScope = rememberCoroutineScope()
     val focusRequester = remember { FocusRequester() }
     Column(
-        modifier = Modifier
-            .fillMaxWidth()
-            .verticalScroll(scrollState)
-            .onRotaryScrollEvent {
-                coroutineScope.launch {
-                    scrollState.scrollTo((scrollState.value +
-                        it.verticalScrollPixels).roundToInt())
+        modifier =
+            Modifier.fillMaxWidth()
+                .verticalScroll(scrollState)
+                .onRotaryScrollEvent {
+                    coroutineScope.launch {
+                        scrollState.scrollTo(
+                            (scrollState.value + it.verticalScrollPixels).roundToInt()
+                        )
+                    }
+                    true
                 }
-                true
-            }
-            .focusRequester(focusRequester)
-            .focusable(),
+                .focusRequester(focusRequester)
+                .focusable(),
     ) {
         repeat(100) {
             Text(
@@ -205,9 +196,7 @@
         }
     }
 
-    LaunchedEffect(Unit) {
-        focusRequester.requestFocus()
-    }
+    LaunchedEffect(Unit) { focusRequester.requestFocus() }
 }
 
 @OptIn(ExperimentalComposeUiApi::class)
@@ -221,13 +210,10 @@
         val focusRequester = remember { FocusRequester() }
         var interceptScroll by remember { mutableStateOf(false) }
         Column(
-            Modifier
-                .onPreRotaryScrollEvent {
+            Modifier.onPreRotaryScrollEvent {
                     // You can intercept an event before it is sent to the child.
                     if (interceptScroll) {
-                        coroutineScope.launch {
-                            rowScrollState.scrollBy(it.horizontalScrollPixels)
-                        }
+                        coroutineScope.launch { rowScrollState.scrollBy(it.horizontalScrollPixels) }
                         // return true to consume this event.
                         true
                     } else {
@@ -237,9 +223,7 @@
                 }
                 .onRotaryScrollEvent {
                     // If the child does not use the scroll, we get notified here.
-                    coroutineScope.launch {
-                        rowScrollState.scrollBy(it.horizontalScrollPixels)
-                    }
+                    coroutineScope.launch { rowScrollState.scrollBy(it.horizontalScrollPixels) }
                     true
                 }
         ) {
@@ -257,11 +241,7 @@
                     onCheckedChange = { interceptScroll = it },
                 )
             }
-            Row(
-                modifier = Modifier
-                    .fillMaxWidth()
-                    .horizontalScroll(rowScrollState)
-            ) {
+            Row(modifier = Modifier.fillMaxWidth().horizontalScroll(rowScrollState)) {
                 repeat(100) {
                     Text(
                         text = "row item $it ",
@@ -271,17 +251,17 @@
                 }
             }
             Column(
-                modifier = Modifier
-                    .fillMaxWidth()
-                    .verticalScroll(columnScrollState)
-                    .onRotaryScrollEvent {
-                        coroutineScope.launch {
-                            columnScrollState.scrollBy(it.verticalScrollPixels)
+                modifier =
+                    Modifier.fillMaxWidth()
+                        .verticalScroll(columnScrollState)
+                        .onRotaryScrollEvent {
+                            coroutineScope.launch {
+                                columnScrollState.scrollBy(it.verticalScrollPixels)
+                            }
+                            true
                         }
-                        true
-                    }
-                    .focusRequester(focusRequester)
-                    .focusable(),
+                        .focusRequester(focusRequester)
+                        .focusable(),
             ) {
                 repeat(100) {
                     Text(
@@ -293,8 +273,6 @@
             }
         }
 
-        LaunchedEffect(Unit) {
-            focusRequester.requestFocus()
-        }
+        LaunchedEffect(Unit) { focusRequester.requestFocus() }
     }
 }
diff --git a/compose/ui/ui/samples/src/main/java/androidx/compose/ui/samples/FocusSamples.kt b/compose/ui/ui/samples/src/main/java/androidx/compose/ui/samples/FocusSamples.kt
index 82fc661..b0db75d 100644
--- a/compose/ui/ui/samples/src/main/java/androidx/compose/ui/samples/FocusSamples.kt
+++ b/compose/ui/ui/samples/src/main/java/androidx/compose/ui/samples/FocusSamples.kt
@@ -61,8 +61,7 @@
 fun FocusableSample() {
     var color by remember { mutableStateOf(Black) }
     Box(
-        Modifier
-            .border(2.dp, color)
+        Modifier.border(2.dp, color)
             // The onFocusChanged should be added BEFORE the focusable that is being observed.
             .onFocusChanged { color = if (it.isFocused) Green else Black }
             .focusable()
@@ -74,8 +73,7 @@
 fun FocusableSampleUsingLowerLevelFocusTarget() {
     var color by remember { mutableStateOf(Black) }
     Box(
-        Modifier
-            .border(2.dp, color)
+        Modifier.border(2.dp, color)
             // The onFocusChanged should be added BEFORE the focusTarget that is being observed.
             .onFocusChanged { color = if (it.isFocused) Green else Black }
             .focusTarget()
@@ -91,14 +89,15 @@
     TextField(
         value = value,
         onValueChange = {
-            value = it.apply {
-                if (length > 5) focusRequester.captureFocus() else focusRequester.freeFocus()
-            }
+            value =
+                it.apply {
+                    if (length > 5) focusRequester.captureFocus() else focusRequester.freeFocus()
+                }
         },
-        modifier = Modifier
-            .border(2.dp, borderColor)
-            .focusRequester(focusRequester)
-            .onFocusChanged { borderColor = if (it.isCaptured) Red else Transparent }
+        modifier =
+            Modifier.border(2.dp, borderColor).focusRequester(focusRequester).onFocusChanged {
+                borderColor = if (it.isCaptured) Red else Transparent
+            }
     )
 }
 
@@ -108,12 +107,13 @@
 fun RestoreFocusSample() {
     val focusRequester = remember { FocusRequester() }
     LazyRow(
-        Modifier
-            .focusRequester(focusRequester)
-            .focusProperties {
-                exit = { focusRequester.saveFocusedChild(); Default }
-                enter = { if (focusRequester.restoreFocusedChild()) Cancel else Default }
+        Modifier.focusRequester(focusRequester).focusProperties {
+            exit = {
+                focusRequester.saveFocusedChild()
+                Default
             }
+            enter = { if (focusRequester.restoreFocusedChild()) Cancel else Default }
+        }
     ) {
         item { Button(onClick = {}) { Text("1") } }
         item { Button(onClick = {}) { Text("2") } }
@@ -144,10 +144,7 @@
         Modifier.focusRestorer { focusRequester }
     ) {
         item {
-            Button(
-                modifier = Modifier.focusRequester(focusRequester),
-                onClick = {}
-            ) { Text("1") }
+            Button(modifier = Modifier.focusRequester(focusRequester), onClick = {}) { Text("1") }
         }
         item { Button(onClick = {}) { Text("2") } }
         item { Button(onClick = {}) { Text("3") } }
@@ -161,8 +158,7 @@
     val focusRequester = remember { FocusRequester() }
     var color by remember { mutableStateOf(Black) }
     Box(
-        Modifier
-            .clickable { focusRequester.requestFocus() }
+        Modifier.clickable { focusRequester.requestFocus() }
             .border(2.dp, color)
             // The focusRequester should be added BEFORE the focusable.
             .focusRequester(focusRequester)
@@ -222,8 +218,7 @@
         val (item1, item2, item3, item4) = remember { FocusRequester.createRefs() }
         Row(Modifier.fillMaxWidth(), Arrangement.SpaceEvenly) {
             Box(
-                Modifier
-                    .focusRequester(item1)
+                Modifier.focusRequester(item1)
                     .focusProperties {
                         next = item2
                         right = item2
@@ -233,8 +228,7 @@
                     .focusable()
             )
             Box(
-                Modifier
-                    .focusRequester(item2)
+                Modifier.focusRequester(item2)
                     .focusProperties {
                         next = item3
                         right = item1
@@ -246,24 +240,20 @@
         }
         Row(Modifier.fillMaxWidth(), Arrangement.SpaceEvenly) {
             Box(
-                Modifier
-                    .focusRequester(item3)
-                    .focusProperties {
-                        next = item4
-                        right = item4
-                        up = item1
-                        previous = item2
-                    }
+                Modifier.focusRequester(item3).focusProperties {
+                    next = item4
+                    right = item4
+                    up = item1
+                    previous = item2
+                }
             )
             Box(
-                Modifier
-                    .focusRequester(item4)
-                    .focusProperties {
-                        next = item1
-                        left = item3
-                        up = item2
-                        previous = item3
-                    }
+                Modifier.focusRequester(item4).focusProperties {
+                    next = item1
+                    left = item3
+                    up = item2
+                    previous = item3
+                }
             )
         }
     }
@@ -274,15 +264,13 @@
 fun FocusPropertiesSample() {
     Column {
         // Always focusable.
-        Box(modifier = Modifier
-            .focusProperties { canFocus = true }
-            .focusTarget()
-        )
+        Box(modifier = Modifier.focusProperties { canFocus = true }.focusTarget())
         // Only focusable in non-touch mode.
         val inputModeManager = LocalInputModeManager.current
-        Box(modifier = Modifier
-            .focusProperties { canFocus = inputModeManager.inputMode != Touch }
-            .focusTarget()
+        Box(
+            modifier =
+                Modifier.focusProperties { canFocus = inputModeManager.inputMode != Touch }
+                    .focusTarget()
         )
     }
 }
@@ -297,10 +285,7 @@
         // Box 1.
         Box(Modifier.focusTarget())
         // Box 2.
-        Box(modifier = Modifier
-            .focusProperties { up = Cancel }
-            .focusTarget()
-        )
+        Box(modifier = Modifier.focusProperties { up = Cancel }.focusTarget())
         // Box 3.
         Box(Modifier.focusTarget())
     }
diff --git a/compose/ui/ui/samples/src/main/java/androidx/compose/ui/samples/InspectableModifierSample.kt b/compose/ui/ui/samples/src/main/java/androidx/compose/ui/samples/InspectableModifierSample.kt
index 52df79c..c34a82c 100644
--- a/compose/ui/ui/samples/src/main/java/androidx/compose/ui/samples/InspectableModifierSample.kt
+++ b/compose/ui/ui/samples/src/main/java/androidx/compose/ui/samples/InspectableModifierSample.kt
@@ -32,28 +32,28 @@
 @Suppress("DEPRECATION")
 fun InspectableModifierSample() {
 
-    /**
-     * Sample with a single parameter
-     */
-    fun Modifier.simpleFrame(color: Color) = inspectable(
-        inspectorInfo = debugInspectorInfo {
-            name = "simpleFrame"
-            value = color
+    /** Sample with a single parameter */
+    fun Modifier.simpleFrame(color: Color) =
+        inspectable(
+            inspectorInfo =
+                debugInspectorInfo {
+                    name = "simpleFrame"
+                    value = color
+                }
+        ) {
+            background(color, RoundedCornerShape(5.0.dp))
         }
-    ) {
-        background(color, RoundedCornerShape(5.0.dp))
-    }
 
-    /**
-     * Sample with multiple parameters
-     */
-    fun Modifier.fancyFrame(size: Dp, color: Color) = inspectable(
-        inspectorInfo = debugInspectorInfo {
-            name = "fancyFrame"
-            properties["size"] = size
-            properties["color"] = color
+    /** Sample with multiple parameters */
+    fun Modifier.fancyFrame(size: Dp, color: Color) =
+        inspectable(
+            inspectorInfo =
+                debugInspectorInfo {
+                    name = "fancyFrame"
+                    properties["size"] = size
+                    properties["color"] = color
+                }
+        ) {
+            background(color, RoundedCornerShape(size))
         }
-    ) {
-        background(color, RoundedCornerShape(size))
-    }
 }
diff --git a/compose/ui/ui/samples/src/main/java/androidx/compose/ui/samples/InspectorInfoInComposedModifierSamples.kt b/compose/ui/ui/samples/src/main/java/androidx/compose/ui/samples/InspectorInfoInComposedModifierSamples.kt
index 719f148..efbb838 100644
--- a/compose/ui/ui/samples/src/main/java/androidx/compose/ui/samples/InspectorInfoInComposedModifierSamples.kt
+++ b/compose/ui/ui/samples/src/main/java/androidx/compose/ui/samples/InspectorInfoInComposedModifierSamples.kt
@@ -30,20 +30,22 @@
 fun InspectorInfoInComposedModifierSample() {
 
     // let's create your own custom stateful modifier
-    fun Modifier.myColorModifier(color: Color) = composed(
-        // pass inspector information for debug
-        inspectorInfo = debugInspectorInfo {
-            // name should match the name of the modifier
-            name = "myColorModifier"
-            // specify a single argument as the value when the argument name is irrelevant
-            value = color
-        },
-        // pass your modifier implementation that resolved per modified element
-        factory = {
-            // add your modifier implementation here
-            Modifier
-        }
-    )
+    fun Modifier.myColorModifier(color: Color) =
+        composed(
+            // pass inspector information for debug
+            inspectorInfo =
+                debugInspectorInfo {
+                    // name should match the name of the modifier
+                    name = "myColorModifier"
+                    // specify a single argument as the value when the argument name is irrelevant
+                    value = color
+                },
+            // pass your modifier implementation that resolved per modified element
+            factory = {
+                // add your modifier implementation here
+                Modifier
+            }
+        )
 }
 
 @Suppress("UnnecessaryComposedModifier")
@@ -52,20 +54,22 @@
 fun InspectorInfoInComposedModifierWithArgumentsSample() {
 
     // let's create your own custom stateful modifier with multiple arguments
-    fun Modifier.myModifier(width: Dp, height: Dp, color: Color) = composed(
-        // pass inspector information for debug
-        inspectorInfo = debugInspectorInfo {
-            // name should match the name of the modifier
-            name = "myModifier"
-            // add name and value of each argument
-            properties["width"] = width
-            properties["height"] = height
-            properties["color"] = color
-        },
-        // pass your modifier implementation that resolved per modified element
-        factory = {
-            // add your modifier implementation here
-            Modifier
-        }
-    )
+    fun Modifier.myModifier(width: Dp, height: Dp, color: Color) =
+        composed(
+            // pass inspector information for debug
+            inspectorInfo =
+                debugInspectorInfo {
+                    // name should match the name of the modifier
+                    name = "myModifier"
+                    // add name and value of each argument
+                    properties["width"] = width
+                    properties["height"] = height
+                    properties["color"] = color
+                },
+            // pass your modifier implementation that resolved per modified element
+            factory = {
+                // add your modifier implementation here
+                Modifier
+            }
+        )
 }
diff --git a/compose/ui/ui/samples/src/main/java/androidx/compose/ui/samples/LayerModifierSamples.kt b/compose/ui/ui/samples/src/main/java/androidx/compose/ui/samples/LayerModifierSamples.kt
index 6089322..ee45921 100644
--- a/compose/ui/ui/samples/src/main/java/androidx/compose/ui/samples/LayerModifierSamples.kt
+++ b/compose/ui/ui/samples/src/main/java/androidx/compose/ui/samples/LayerModifierSamples.kt
@@ -49,9 +49,7 @@
             clip = true
         }
     )
-    LaunchedEffect(animatedAlpha) {
-        animatedAlpha.animateTo(1f)
-    }
+    LaunchedEffect(animatedAlpha) { animatedAlpha.animateTo(1f) }
 }
 
 @Sampled
@@ -60,22 +58,18 @@
     Canvas(
         modifier =
             Modifier.size(100.dp)
-            .background(Color.Black)
-            .graphicsLayer(
-                alpha = 0.5f,
-                compositingStrategy = CompositingStrategy.ModulateAlpha
-            )
+                .background(Color.Black)
+                .graphicsLayer(
+                    alpha = 0.5f,
+                    compositingStrategy = CompositingStrategy.ModulateAlpha
+                )
     ) {
         // Configuring an alpha less than 1.0 and specifying
         // CompositingStrategy.ModulateAlpha ends up with the overlapping region
         // of the 2 draw rect calls to blend transparent blue and transparent red
         // against the black background instead of just transparent blue which is what would
         // occur with CompositingStrategy.Auto or CompositingStrategy.Offscreen
-        inset(0f, 0f, size.width / 3, size.height / 3) {
-            drawRect(color = Color.Red)
-        }
-        inset(size.width / 3, size.height / 3, 0f, 0f) {
-            drawRect(color = Color.Blue)
-        }
+        inset(0f, 0f, size.width / 3, size.height / 3) { drawRect(color = Color.Red) }
+        inset(size.width / 3, size.height / 3, 0f, 0f) { drawRect(color = Color.Blue) }
     }
 }
diff --git a/compose/ui/ui/samples/src/main/java/androidx/compose/ui/samples/LayoutSample.kt b/compose/ui/ui/samples/src/main/java/androidx/compose/ui/samples/LayoutSample.kt
index 6908017..0f12e34 100644
--- a/compose/ui/ui/samples/src/main/java/androidx/compose/ui/samples/LayoutSample.kt
+++ b/compose/ui/ui/samples/src/main/java/androidx/compose/ui/samples/LayoutSample.kt
@@ -50,20 +50,23 @@
     Layout(content) { measurables, constraints ->
         // measurables contains one element corresponding to each of our layout children.
         // constraints are the constraints that our parent is currently measuring us with.
-        val childConstraints = Constraints(
-            minWidth = constraints.minWidth / 2,
-            minHeight = constraints.minHeight / 2,
-            maxWidth = if (constraints.hasBoundedWidth) {
-                constraints.maxWidth / 2
-            } else {
-                Constraints.Infinity
-            },
-            maxHeight = if (constraints.hasBoundedHeight) {
-                constraints.maxHeight / 2
-            } else {
-                Constraints.Infinity
-            }
-        )
+        val childConstraints =
+            Constraints(
+                minWidth = constraints.minWidth / 2,
+                minHeight = constraints.minHeight / 2,
+                maxWidth =
+                    if (constraints.hasBoundedWidth) {
+                        constraints.maxWidth / 2
+                    } else {
+                        Constraints.Infinity
+                    },
+                maxHeight =
+                    if (constraints.hasBoundedHeight) {
+                        constraints.maxHeight / 2
+                    } else {
+                        Constraints.Infinity
+                    }
+            )
         // We measure the children with half our constraints, to ensure we can be double
         // the size of the children.
         val placeables = measurables.map { it.measure(childConstraints) }
@@ -84,65 +87,70 @@
 fun LayoutWithProvidedIntrinsicsUsage(content: @Composable () -> Unit) {
     // We build a layout that will occupy twice as much space as its children,
     // and will position them to be bottom right aligned.
-    val measurePolicy = object : MeasurePolicy {
-        override fun MeasureScope.measure(
-            measurables: List<Measurable>,
-            constraints: Constraints
-        ): MeasureResult {
-            // measurables contains one element corresponding to each of our layout children.
-            // constraints are the constraints that our parent is currently measuring us with.
-            val childConstraints = Constraints(
-                minWidth = constraints.minWidth / 2,
-                minHeight = constraints.minHeight / 2,
-                maxWidth = if (constraints.hasBoundedWidth) {
-                    constraints.maxWidth / 2
-                } else {
-                    Constraints.Infinity
-                },
-                maxHeight = if (constraints.hasBoundedHeight) {
-                    constraints.maxHeight / 2
-                } else {
-                    Constraints.Infinity
-                }
-            )
-            // We measure the children with half our constraints, to ensure we can be double
-            // the size of the children.
-            val placeables = measurables.map { it.measure(childConstraints) }
-            val layoutWidth = (placeables.maxByOrNull { it.width }?.width ?: 0) * 2
-            val layoutHeight = (placeables.maxByOrNull { it.height }?.height ?: 0) * 2
-            // We call layout to set the size of the current layout and to provide the positioning
-            // of the children. The children are placed relative to the current layout place.
-            return layout(layoutWidth, layoutHeight) {
-                placeables.forEach {
-                    it.placeRelative(layoutWidth - it.width, layoutHeight - it.height)
+    val measurePolicy =
+        object : MeasurePolicy {
+            override fun MeasureScope.measure(
+                measurables: List<Measurable>,
+                constraints: Constraints
+            ): MeasureResult {
+                // measurables contains one element corresponding to each of our layout children.
+                // constraints are the constraints that our parent is currently measuring us with.
+                val childConstraints =
+                    Constraints(
+                        minWidth = constraints.minWidth / 2,
+                        minHeight = constraints.minHeight / 2,
+                        maxWidth =
+                            if (constraints.hasBoundedWidth) {
+                                constraints.maxWidth / 2
+                            } else {
+                                Constraints.Infinity
+                            },
+                        maxHeight =
+                            if (constraints.hasBoundedHeight) {
+                                constraints.maxHeight / 2
+                            } else {
+                                Constraints.Infinity
+                            }
+                    )
+                // We measure the children with half our constraints, to ensure we can be double
+                // the size of the children.
+                val placeables = measurables.map { it.measure(childConstraints) }
+                val layoutWidth = (placeables.maxByOrNull { it.width }?.width ?: 0) * 2
+                val layoutHeight = (placeables.maxByOrNull { it.height }?.height ?: 0) * 2
+                // We call layout to set the size of the current layout and to provide the
+                // positioning
+                // of the children. The children are placed relative to the current layout place.
+                return layout(layoutWidth, layoutHeight) {
+                    placeables.forEach {
+                        it.placeRelative(layoutWidth - it.width, layoutHeight - it.height)
+                    }
                 }
             }
+
+            // The min intrinsic width of this layout will be twice the largest min intrinsic
+            // width of a child. Note that we call minIntrinsicWidth with h / 2 for children,
+            // since we should be double the size of the children.
+            override fun IntrinsicMeasureScope.minIntrinsicWidth(
+                measurables: List<IntrinsicMeasurable>,
+                height: Int
+            ) = (measurables.map { it.minIntrinsicWidth(height / 2) }.maxByOrNull { it } ?: 0) * 2
+
+            override fun IntrinsicMeasureScope.minIntrinsicHeight(
+                measurables: List<IntrinsicMeasurable>,
+                width: Int
+            ) = (measurables.map { it.minIntrinsicHeight(width / 2) }.maxByOrNull { it } ?: 0) * 2
+
+            override fun IntrinsicMeasureScope.maxIntrinsicWidth(
+                measurables: List<IntrinsicMeasurable>,
+                height: Int
+            ) = (measurables.map { it.maxIntrinsicHeight(height / 2) }.maxByOrNull { it } ?: 0) * 2
+
+            override fun IntrinsicMeasureScope.maxIntrinsicHeight(
+                measurables: List<IntrinsicMeasurable>,
+                width: Int
+            ) = (measurables.map { it.maxIntrinsicHeight(width / 2) }.maxByOrNull { it } ?: 0) * 2
         }
 
-        // The min intrinsic width of this layout will be twice the largest min intrinsic
-        // width of a child. Note that we call minIntrinsicWidth with h / 2 for children,
-        // since we should be double the size of the children.
-        override fun IntrinsicMeasureScope.minIntrinsicWidth(
-            measurables: List<IntrinsicMeasurable>,
-            height: Int
-        ) = (measurables.map { it.minIntrinsicWidth(height / 2) }.maxByOrNull { it } ?: 0) * 2
-
-        override fun IntrinsicMeasureScope.minIntrinsicHeight(
-            measurables: List<IntrinsicMeasurable>,
-            width: Int
-        ) = (measurables.map { it.minIntrinsicHeight(width / 2) }.maxByOrNull { it } ?: 0) * 2
-
-        override fun IntrinsicMeasureScope.maxIntrinsicWidth(
-            measurables: List<IntrinsicMeasurable>,
-            height: Int
-        ) = (measurables.map { it.maxIntrinsicHeight(height / 2) }.maxByOrNull { it } ?: 0) * 2
-
-        override fun IntrinsicMeasureScope.maxIntrinsicHeight(
-            measurables: List<IntrinsicMeasurable>,
-            width: Int
-        ) = (measurables.map { it.maxIntrinsicHeight(width / 2) }.maxByOrNull { it } ?: 0) * 2
-    }
-
     Layout(content = content, measurePolicy = measurePolicy)
 }
 
@@ -155,38 +163,38 @@
         Box(Modifier.layoutId("header")) { header() }
         Box(Modifier.layoutId("footer")) { footer() }
     }) { measurables, constraints ->
-        val placeables = measurables.map { measurable ->
-            when (measurable.layoutId) {
-                // You should use appropriate constraints. Here we measure fake constraints.
-                "header" -> measurable.measure(Constraints.fixed(100, 100))
-                "footer" -> measurable.measure(constraints)
-                else -> error("Unexpected tag")
+        val placeables =
+            measurables.map { measurable ->
+                when (measurable.layoutId) {
+                    // You should use appropriate constraints. Here we measure fake constraints.
+                    "header" -> measurable.measure(Constraints.fixed(100, 100))
+                    "footer" -> measurable.measure(constraints)
+                    else -> error("Unexpected tag")
+                }
             }
-        }
         // Size should be derived from children measured sizes on placeables,
         // but this is simplified for the purposes of the example.
-        layout(100, 100) {
-            placeables.forEach { it.placeRelative(0, 0) }
-        }
+        layout(100, 100) { placeables.forEach { it.placeRelative(0, 0) } }
     }
 }
 
 @Sampled
 @Composable
 fun LayoutModifierSample() {
-    val verticalPadding = object : LayoutModifier {
-        override fun MeasureScope.measure(
-            measurable: Measurable,
-            constraints: Constraints
-        ): MeasureResult {
-            // an example modifier that adds 50 pixels of vertical padding.
-            val padding = 50
-            val placeable = measurable.measure(constraints.offset(vertical = -padding))
-            return layout(placeable.width, placeable.height + padding) {
-                placeable.placeRelative(0, padding)
+    val verticalPadding =
+        object : LayoutModifier {
+            override fun MeasureScope.measure(
+                measurable: Measurable,
+                constraints: Constraints
+            ): MeasureResult {
+                // an example modifier that adds 50 pixels of vertical padding.
+                val padding = 50
+                val placeable = measurable.measure(constraints.offset(vertical = -padding))
+                return layout(placeable.width, placeable.height + padding) {
+                    placeable.placeRelative(0, padding)
+                }
             }
         }
-    }
     Box(Modifier.background(Color.Gray).then(verticalPadding)) {
         Box(Modifier.fillMaxSize().background(Color.DarkGray))
     }
@@ -208,13 +216,13 @@
             }
         }
     }
-    data class VerticalPaddingElement(
-        val padding: Dp
-    ) : ModifierNodeElement<VerticalPadding>() {
+    data class VerticalPaddingElement(val padding: Dp) : ModifierNodeElement<VerticalPadding>() {
         override fun create() = VerticalPadding(padding)
+
         override fun update(node: VerticalPadding) {
             node.padding = padding
         }
+
         override fun InspectorInfo.inspectableProperties() {
             name = "verticalPadding"
             properties["padding"] = padding
@@ -230,15 +238,14 @@
 @Composable
 fun ConvenienceLayoutModifierSample() {
     Box(
-        Modifier.background(Color.Gray)
-            .layout { measurable, constraints ->
-                // an example modifier that adds 50 pixels of vertical padding.
-                val padding = 50
-                val placeable = measurable.measure(constraints.offset(vertical = -padding))
-                layout(placeable.width, placeable.height + padding) {
-                    placeable.placeRelative(0, padding)
-                }
+        Modifier.background(Color.Gray).layout { measurable, constraints ->
+            // an example modifier that adds 50 pixels of vertical padding.
+            val padding = 50
+            val placeable = measurable.measure(constraints.offset(vertical = -padding))
+            layout(placeable.width, placeable.height + padding) {
+                placeable.placeRelative(0, padding)
             }
+        }
     ) {
         Box(Modifier.fillMaxSize().background(Color.DarkGray))
     }
diff --git a/compose/ui/ui/samples/src/main/java/androidx/compose/ui/samples/LookaheadScopeSample.kt b/compose/ui/ui/samples/src/main/java/androidx/compose/ui/samples/LookaheadScopeSample.kt
index c34126c..c3b1e5e 100644
--- a/compose/ui/ui/samples/src/main/java/androidx/compose/ui/samples/LookaheadScopeSample.kt
+++ b/compose/ui/ui/samples/src/main/java/androidx/compose/ui/samples/LookaheadScopeSample.kt
@@ -81,30 +81,29 @@
     fun Modifier.animateConstraints(
         sizeAnimation: DeferredTargetAnimation<IntSize, AnimationVector2D>,
         coroutineScope: CoroutineScope
-    ) = this.approachLayout(
-        isMeasurementApproachInProgress = { lookaheadSize ->
-            // Update the target of the size animation.
-            sizeAnimation.updateTarget(lookaheadSize, coroutineScope)
-            // Return true if the size animation has pending target change or hasn't finished
-            // running.
-            !sizeAnimation.isIdle
-        }
-    ) { measurable, _ ->
-        // In the measurement approach, the goal is to gradually reach the destination size
-        // (i.e. lookahead size). To achieve that, we use an animation to track the current
-        // size, and animate to the destination size whenever it changes. Once the animation
-        // finishes, the approach is complete.
+    ) =
+        this.approachLayout(
+            isMeasurementApproachInProgress = { lookaheadSize ->
+                // Update the target of the size animation.
+                sizeAnimation.updateTarget(lookaheadSize, coroutineScope)
+                // Return true if the size animation has pending target change or hasn't finished
+                // running.
+                !sizeAnimation.isIdle
+            }
+        ) { measurable, _ ->
+            // In the measurement approach, the goal is to gradually reach the destination size
+            // (i.e. lookahead size). To achieve that, we use an animation to track the current
+            // size, and animate to the destination size whenever it changes. Once the animation
+            // finishes, the approach is complete.
 
-        // First, update the target of the animation, and read the current animated size.
-        val (width, height) = sizeAnimation.updateTarget(lookaheadSize, coroutineScope)
-        // Then create fixed size constraints using the animated size
-        val animatedConstraints = Constraints.fixed(width, height)
-        // Measure child with animated constraints.
-        val placeable = measurable.measure(animatedConstraints)
-        layout(placeable.width, placeable.height) {
-            placeable.place(0, 0)
+            // First, update the target of the animation, and read the current animated size.
+            val (width, height) = sizeAnimation.updateTarget(lookaheadSize, coroutineScope)
+            // Then create fixed size constraints using the animated size
+            val animatedConstraints = Constraints.fixed(width, height)
+            // Measure child with animated constraints.
+            val placeable = measurable.measure(animatedConstraints)
+            layout(placeable.width, placeable.height) { placeable.place(0, 0) }
         }
-    }
 
     var fullWidth by remember { mutableStateOf(false) }
 
@@ -117,19 +116,12 @@
             // Use the custom modifier created above to animate the constraints passed
             // to the child, and therefore resize children in an animation.
             .animateConstraints(sizeAnimation, coroutineScope)
-            .clickable { fullWidth = !fullWidth }) {
+            .clickable { fullWidth = !fullWidth }
+    ) {
         Box(
-            Modifier
-                .weight(1f)
-                .fillMaxHeight()
-                .background(Color(0xffff6f69)),
+            Modifier.weight(1f).fillMaxHeight().background(Color(0xffff6f69)),
         )
-        Box(
-            Modifier
-                .weight(2f)
-                .fillMaxHeight()
-                .background(Color(0xffffcc5c))
-        )
+        Box(Modifier.weight(2f).fillMaxHeight().background(Color(0xffffcc5c)))
     }
 }
 
@@ -138,17 +130,14 @@
 @Composable
 fun LookaheadLayoutCoordinatesSample() {
     /**
-     * Creates a custom implementation of ApproachLayoutModifierNode to approach the placement
-     * of the layout using an animation.
+     * Creates a custom implementation of ApproachLayoutModifierNode to approach the placement of
+     * the layout using an animation.
      */
-    class AnimatedPlacementModifierNode(
-        var lookaheadScope: LookaheadScope
-    ) : ApproachLayoutModifierNode, Modifier.Node() {
+    class AnimatedPlacementModifierNode(var lookaheadScope: LookaheadScope) :
+        ApproachLayoutModifierNode, Modifier.Node() {
         // Creates an offset animation, the target of which will be known during placement.
         val offsetAnimation: DeferredTargetAnimation<IntOffset, AnimationVector2D> =
-            DeferredTargetAnimation(
-                IntOffset.VectorConverter
-            )
+            DeferredTargetAnimation(IntOffset.VectorConverter)
 
         override fun isMeasurementApproachInProgress(lookaheadSize: IntSize): Boolean {
             // Since we only animate the placement here, we can consider measurement approach
@@ -160,9 +149,10 @@
         override fun Placeable.PlacementScope.isPlacementApproachInProgress(
             lookaheadCoordinates: LayoutCoordinates
         ): Boolean {
-            val target = with(lookaheadScope) {
-                lookaheadScopeCoordinates.localLookaheadPositionOf(lookaheadCoordinates).round()
-            }
+            val target =
+                with(lookaheadScope) {
+                    lookaheadScopeCoordinates.localLookaheadPositionOf(lookaheadCoordinates).round()
+                }
             offsetAnimation.updateTarget(target, coroutineScope)
             return !offsetAnimation.isIdle
         }
@@ -177,21 +167,20 @@
                 val coordinates = coordinates
                 if (coordinates != null) {
                     // Calculates the target offset within the lookaheadScope
-                    val target = with(lookaheadScope) {
-                        lookaheadScopeCoordinates
-                            .localLookaheadPositionOf(coordinates)
-                            .round()
-                    }
+                    val target =
+                        with(lookaheadScope) {
+                            lookaheadScopeCoordinates.localLookaheadPositionOf(coordinates).round()
+                        }
 
                     // Uses the target offset to start an offset animation
                     val animatedOffset = offsetAnimation.updateTarget(target, coroutineScope)
                     // Calculates the *current* offset within the given LookaheadScope
-                    val placementOffset = with(lookaheadScope) {
-                        lookaheadScopeCoordinates.localPositionOf(
-                            coordinates,
-                            Offset.Zero
-                        ).round()
-                    }
+                    val placementOffset =
+                        with(lookaheadScope) {
+                            lookaheadScopeCoordinates
+                                .localPositionOf(coordinates, Offset.Zero)
+                                .round()
+                        }
                     // Calculates the delta between animated position in scope and current
                     // position in scope, and places the child at the delta offset. This puts
                     // the child layout at the animated position.
@@ -217,9 +206,7 @@
         }
     }
 
-    val colors = listOf(
-        Color(0xffff6f69), Color(0xffffcc5c), Color(0xff264653), Color(0xff2a9d84)
-    )
+    val colors = listOf(Color(0xffff6f69), Color(0xffffcc5c), Color(0xff264653), Color(0xff2a9d84))
 
     var isInColumn by remember { mutableStateOf(true) }
     LookaheadScope {
@@ -229,31 +216,22 @@
             movableContentOf {
                 colors.forEach { color ->
                     Box(
-                        Modifier
-                            .padding(15.dp)
+                        Modifier.padding(15.dp)
                             .size(100.dp, 80.dp)
-                            .then(
-                                AnimatePlacementNodeElement(this)
-                            )
+                            .then(AnimatePlacementNodeElement(this))
                             .background(color, RoundedCornerShape(20))
                     )
                 }
             }
         }
 
-        Box(
-            modifier = Modifier
-                .fillMaxSize()
-                .clickable { isInColumn = !isInColumn }
-        ) {
+        Box(modifier = Modifier.fillMaxSize().clickable { isInColumn = !isInColumn }) {
             // As the items get moved between Column and Row, their positions in LookaheadScope
             // will change. The `animatePlacementInScope` modifier created above will
             // observe that final position change via `localLookaheadPositionOf`, and create
             // a position animation.
             if (isInColumn) {
-                Column(Modifier.fillMaxSize()) {
-                    items()
-                }
+                Column(Modifier.fillMaxSize()) { items() }
             } else {
                 Row { items() }
             }
@@ -264,25 +242,20 @@
 @Sampled
 @Composable
 fun animateContentSizeAfterLookaheadPass() {
-    var sizeAnim by remember {
-        mutableStateOf<Animatable<IntSize, AnimationVector2D>?>(null)
-    }
-    var lookaheadSize by remember {
-        mutableStateOf<IntSize?>(null)
-    }
+    var sizeAnim by remember { mutableStateOf<Animatable<IntSize, AnimationVector2D>?>(null) }
+    var lookaheadSize by remember { mutableStateOf<IntSize?>(null) }
     val coroutineScope = rememberCoroutineScope()
     LookaheadScope {
         // The Box is in a LookaheadScope. This means there will be a lookahead measure pass
         // before the main measure pass.
         // Here we are creating something similar to the `animateContentSize` modifier.
         Box(
-            Modifier
-                .clipToBounds()
-                .layout { measurable, constraints ->
-                    val placeable = measurable.measure(constraints)
+            Modifier.clipToBounds().layout { measurable, constraints ->
+                val placeable = measurable.measure(constraints)
 
-                    val measuredSize = IntSize(placeable.width, placeable.height)
-                    val (width, height) = if (isLookingAhead) {
+                val measuredSize = IntSize(placeable.width, placeable.height)
+                val (width, height) =
+                    if (isLookingAhead) {
                         // Record lookahead size if we are in lookahead pass. This lookahead size
                         // will be used for size animation, such that the main measure pass will
                         // gradually change size until it reaches the lookahead size.
@@ -293,19 +266,18 @@
                         // is guaranteed to happen, therefore the lookahead size that we recorded is
                         // not null.
                         val target = requireNotNull(lookaheadSize)
-                        val anim = sizeAnim?.also {
-                            coroutineScope.launch { it.animateTo(target) }
-                        } ?: Animatable(target, IntSize.VectorConverter)
+                        val anim =
+                            sizeAnim?.also { coroutineScope.launch { it.animateTo(target) } }
+                                ?: Animatable(target, IntSize.VectorConverter)
                         sizeAnim = anim
                         // By returning the animated size only during main pass, we are allowing
                         // lookahead pass to see the future layout past the animation.
                         anim.value
                     }
 
-                    layout(width, height) {
-                        placeable.place(0, 0)
-                    }
-                }) {
+                layout(width, height) { placeable.place(0, 0) }
+            }
+        ) {
             // Some content that changes size
         }
     }
diff --git a/compose/ui/ui/samples/src/main/java/androidx/compose/ui/samples/ModifierCompositionLocalSample.kt b/compose/ui/ui/samples/src/main/java/androidx/compose/ui/samples/ModifierCompositionLocalSample.kt
index aad6edd..41e29b0 100644
--- a/compose/ui/ui/samples/src/main/java/androidx/compose/ui/samples/ModifierCompositionLocalSample.kt
+++ b/compose/ui/ui/samples/src/main/java/androidx/compose/ui/samples/ModifierCompositionLocalSample.kt
@@ -36,42 +36,48 @@
 @Composable
 fun CompositionLocalConsumingModifierSample() {
     val localBackgroundColor = compositionLocalOf { Color.White }
-    class BackgroundColor : Modifier.Node(), DrawModifierNode,
-        CompositionLocalConsumerModifierNode {
+    class BackgroundColor :
+        Modifier.Node(), DrawModifierNode, CompositionLocalConsumerModifierNode {
         override fun ContentDrawScope.draw() {
             val backgroundColor = currentValueOf(localBackgroundColor)
             drawRect(backgroundColor)
             drawContent()
         }
     }
-    val backgroundColorElement = object : ModifierNodeElement<BackgroundColor>() {
-        override fun create() = BackgroundColor()
-        override fun update(node: BackgroundColor) {}
-        override fun hashCode() = System.identityHashCode(this)
-        override fun equals(other: Any?) = (other === this)
-        override fun InspectorInfo.inspectableProperties() {
-            name = "backgroundColor"
+    val backgroundColorElement =
+        object : ModifierNodeElement<BackgroundColor>() {
+            override fun create() = BackgroundColor()
+
+            override fun update(node: BackgroundColor) {}
+
+            override fun hashCode() = System.identityHashCode(this)
+
+            override fun equals(other: Any?) = (other === this)
+
+            override fun InspectorInfo.inspectableProperties() {
+                name = "backgroundColor"
+            }
         }
-    }
     fun Modifier.backgroundColor() = this then backgroundColorElement
-    Box(Modifier.backgroundColor()) {
-        Text("Hello, world!")
-    }
+    Box(Modifier.backgroundColor()) { Text("Hello, world!") }
 }
 
 @Sampled
 @Composable
 fun CompositionLocalConsumingModifierObserverNodeSample() {
     val LocalValue = compositionLocalOf { "abc123" }
-    class ValueObserverModifierNode : Modifier.Node(),
-        CompositionLocalConsumerModifierNode, ObserverModifierNode {
+    class ValueObserverModifierNode :
+        Modifier.Node(), CompositionLocalConsumerModifierNode, ObserverModifierNode {
         private var observedValue: String? = null
+
         override fun onAttach() {
             onObservedReadsChanged()
         }
+
         override fun onDetach() {
             observedValue = null
         }
+
         override fun onObservedReadsChanged() {
             observeReads {
                 observedValue = currentValueOf(LocalValue)
diff --git a/compose/ui/ui/samples/src/main/java/androidx/compose/ui/samples/ModifierLocalSamples.kt b/compose/ui/ui/samples/src/main/java/androidx/compose/ui/samples/ModifierLocalSamples.kt
index 189abfb..87d6cc8 100644
--- a/compose/ui/ui/samples/src/main/java/androidx/compose/ui/samples/ModifierLocalSamples.kt
+++ b/compose/ui/ui/samples/src/main/java/androidx/compose/ui/samples/ModifierLocalSamples.kt
@@ -50,7 +50,6 @@
                     .modifierLocalConsumer { message = ModifierLocalMessage.current }
                     .clickable { println("Hello $message") }
             }
-
     )
 }
 
diff --git a/compose/ui/ui/samples/src/main/java/androidx/compose/ui/samples/ModifierSamples.kt b/compose/ui/ui/samples/src/main/java/androidx/compose/ui/samples/ModifierSamples.kt
index 1fdb55e..479e1c7 100644
--- a/compose/ui/ui/samples/src/main/java/androidx/compose/ui/samples/ModifierSamples.kt
+++ b/compose/ui/ui/samples/src/main/java/androidx/compose/ui/samples/ModifierSamples.kt
@@ -64,8 +64,7 @@
 fun ModifierUsageSample() {
     Text(
         "Hello, World!",
-        Modifier
-            .padding(16.dp) // Outer padding; outside background
+        Modifier.padding(16.dp) // Outer padding; outside background
             .background(color = Color.Green) // Solid element background color
             .padding(16.dp) // Inner padding; inside background, around text
     )
@@ -78,10 +77,7 @@
 
     fun Modifier.fancy(level: Float) = this.then(FancyModifier(level))
 
-    Row(
-        Modifier
-            .fancy(1f)
-            .padding(10.dp)) {
+    Row(Modifier.fancy(1f).padding(10.dp)) {
         // content
     }
 }
@@ -108,12 +104,8 @@
         buttonModifier: Modifier = Modifier
     ) {
         Row(modifier) {
-            Button(onCancel, buttonModifier) {
-                Text("Cancel")
-            }
-            Button(onOk, buttonModifier) {
-                Text("Ok")
-            }
+            Button(onCancel, buttonModifier) { Text("Cancel") }
+            Button(onOk, buttonModifier) { Text("Ok") }
         }
     }
 }
@@ -139,7 +131,9 @@
         PointerInputModifierNode, SemanticsModifierNode, DelegatingNode() {
         var onTap: () -> Unit
             get() = gesture.onTap
-            set(value) { gesture.onTap = value }
+            set(value) {
+                gesture.onTap = value
+            }
 
         val gesture = delegate(TapGestureNode(onTap))
 
@@ -209,11 +203,12 @@
 fun LazyDelegationExample() {
     class ExpensivePositionHandlingOnPointerEvents : PointerInputModifierNode, DelegatingNode() {
 
-        val globalAwareNode = object : GlobalPositionAwareModifierNode, Modifier.Node() {
-            override fun onGloballyPositioned(coordinates: LayoutCoordinates) {
-                // ...
+        val globalAwareNode =
+            object : GlobalPositionAwareModifierNode, Modifier.Node() {
+                override fun onGloballyPositioned(coordinates: LayoutCoordinates) {
+                    // ...
+                }
             }
-        }
 
         override fun onPointerEvent(
             pointerEvent: PointerEvent,
@@ -271,13 +266,13 @@
 @Sampled
 fun ConditionalDelegationExample() {
     class MyModifierNode(global: Boolean) : DelegatingNode() {
-        val globalAwareNode = object : GlobalPositionAwareModifierNode, Modifier.Node() {
-            override fun onGloballyPositioned(coordinates: LayoutCoordinates) {
-                // ...
-            }
-        }.also {
-            if (global) delegate(it)
-        }
+        val globalAwareNode =
+            object : GlobalPositionAwareModifierNode, Modifier.Node() {
+                    override fun onGloballyPositioned(coordinates: LayoutCoordinates) {
+                        // ...
+                    }
+                }
+                .also { if (global) delegate(it) }
         var global: Boolean = global
             set(value) {
                 if (global && !value) {
@@ -293,11 +288,13 @@
 @Sampled
 fun DelegateInAttachSample() {
     class MyModifierNode : DelegatingNode() {
-        val globalAwareNode = object : GlobalPositionAwareModifierNode, Modifier.Node() {
-            override fun onGloballyPositioned(coordinates: LayoutCoordinates) {
-                // ...
+        val globalAwareNode =
+            object : GlobalPositionAwareModifierNode, Modifier.Node() {
+                override fun onGloballyPositioned(coordinates: LayoutCoordinates) {
+                    // ...
+                }
             }
-        }
+
         override fun onAttach() {
             // one can conditionally delegate in attach, for instance if certain conditions are met
             if (requireLayoutDirection() == LayoutDirection.Rtl) {
@@ -316,13 +313,13 @@
             drawCircle(color)
         }
     }
-    data class CircleElement(
-        val color: Color
-    ) : ModifierNodeElement<Circle>() {
+    data class CircleElement(val color: Color) : ModifierNodeElement<Circle>() {
         override fun create() = Circle(color)
+
         override fun update(node: Circle) {
             node.color = color
         }
+
         override fun InspectorInfo.inspectableProperties() {
             name = "circle"
             properties["color"] = color
@@ -342,21 +339,23 @@
         }
     }
 
-    val HeadingElement = object : ModifierNodeElement<HeadingNode>() {
-        override fun create() = HeadingNode()
+    val HeadingElement =
+        object : ModifierNodeElement<HeadingNode>() {
+            override fun create() = HeadingNode()
 
-        override fun update(node: HeadingNode) {
-            // Nothing to update.
+            override fun update(node: HeadingNode) {
+                // Nothing to update.
+            }
+
+            override fun InspectorInfo.inspectableProperties() {
+                name = "heading"
+            }
+
+            override fun hashCode(): Int = "heading".hashCode()
+
+            override fun equals(other: Any?) = (other === this)
         }
 
-        override fun InspectorInfo.inspectableProperties() {
-            name = "heading"
-        }
-
-        override fun hashCode(): Int = "heading".hashCode()
-        override fun equals(other: Any?) = (other === this)
-    }
-
     fun Modifier.heading() = this then HeadingElement
 }
 
@@ -381,10 +380,10 @@
         }
     }
 
-    data class PointerInputElement(
-        val callback: (PointerEvent) -> Unit
-    ) : ModifierNodeElement<OnPointerEventNode>() {
+    data class PointerInputElement(val callback: (PointerEvent) -> Unit) :
+        ModifierNodeElement<OnPointerEventNode>() {
         override fun create() = OnPointerEventNode(callback)
+
         override fun update(node: OnPointerEventNode) {
             node.callback = callback
         }
@@ -411,9 +410,11 @@
 
     data class LogSizeElement(val id: String) : ModifierNodeElement<SizeLoggerNode>() {
         override fun create(): SizeLoggerNode = SizeLoggerNode(id)
+
         override fun update(node: SizeLoggerNode) {
             node.id = id
         }
+
         override fun InspectorInfo.inspectableProperties() {
             name = "logSize"
             properties["id"] = id
@@ -444,9 +445,11 @@
 
     data class PositionLoggerElement(val id: String) : ModifierNodeElement<PositionLoggerNode>() {
         override fun create() = PositionLoggerNode(id)
+
         override fun update(node: PositionLoggerNode) {
             node.id = id
         }
+
         override fun InspectorInfo.inspectableProperties() {
             name = "logPosition"
             properties["id"] = id
@@ -460,7 +463,11 @@
 @Sampled
 @Composable
 fun JustReadingOrProvidingModifierLocalNodeSample() {
-    class Logger { fun log(string: String) { println(string) } }
+    class Logger {
+        fun log(string: String) {
+            println(string)
+        }
+    }
 
     val loggerLocal = modifierLocalOf { Logger() }
 
@@ -468,34 +475,33 @@
         override val providedValues = modifierLocalMapOf(loggerLocal to logger)
     }
 
-    data class ProvideLoggerElement(
-        val logger: Logger
-    ) : ModifierNodeElement<ProvideLoggerNode>() {
+    data class ProvideLoggerElement(val logger: Logger) : ModifierNodeElement<ProvideLoggerNode>() {
         override fun create() = ProvideLoggerNode(logger)
+
         override fun update(node: ProvideLoggerNode) {
             node.provide(loggerLocal, logger)
         }
+
         override fun InspectorInfo.inspectableProperties() {
             name = "provideLogger"
             properties["logger"] = logger
         }
     }
 
-    class SizeLoggerNode(
-        var id: String
-    ) : ModifierLocalModifierNode, LayoutAwareModifierNode, Modifier.Node() {
+    class SizeLoggerNode(var id: String) :
+        ModifierLocalModifierNode, LayoutAwareModifierNode, Modifier.Node() {
         override fun onRemeasured(size: IntSize) {
             loggerLocal.current.log("The size of $id was $size")
         }
     }
 
-    data class SizeLoggerElement(
-        val id: String
-    ) : ModifierNodeElement<SizeLoggerNode>() {
+    data class SizeLoggerElement(val id: String) : ModifierNodeElement<SizeLoggerNode>() {
         override fun create() = SizeLoggerNode(id)
+
         override fun update(node: SizeLoggerNode) {
             node.id = id
         }
+
         override fun InspectorInfo.inspectableProperties() {
             name = "logSize"
             properties["id"] = id
@@ -529,9 +535,7 @@
         val animatable = Animatable(0f)
 
         override fun onAttach() {
-            coroutineScope.launch {
-                animatable.animateTo(1f)
-            }
+            coroutineScope.launch { animatable.animateTo(1f) }
         }
     }
 }
diff --git a/compose/ui/ui/samples/src/main/java/androidx/compose/ui/samples/NestedScrollInteropSamples.kt b/compose/ui/ui/samples/src/main/java/androidx/compose/ui/samples/NestedScrollInteropSamples.kt
index f258989..8264a5a 100644
--- a/compose/ui/ui/samples/src/main/java/androidx/compose/ui/samples/NestedScrollInteropSamples.kt
+++ b/compose/ui/ui/samples/src/main/java/androidx/compose/ui/samples/NestedScrollInteropSamples.kt
@@ -62,11 +62,8 @@
     LazyColumn(modifier = Modifier.nestedScroll(nestedSrollInterop)) {
         items(20) { item ->
             Box(
-                modifier = Modifier
-                    .padding(16.dp)
-                    .height(56.dp)
-                    .fillMaxWidth()
-                    .background(Color.Gray),
+                modifier =
+                    Modifier.padding(16.dp).height(56.dp).fillMaxWidth().background(Color.Gray),
                 contentAlignment = Alignment.Center
             ) {
                 Text(item.toString())
@@ -79,25 +76,23 @@
 @Composable
 fun ViewInComposeNestedScrollInteropSample() {
     Box(
-        Modifier
-            .fillMaxSize()
-            .scrollable(rememberScrollableState {
-                // view world deltas should be reflected in compose world
-                // components that participate in nested scrolling
-                it
-            }, Orientation.Vertical)
+        Modifier.fillMaxSize()
+            .scrollable(
+                rememberScrollableState {
+                    // view world deltas should be reflected in compose world
+                    // components that participate in nested scrolling
+                    it
+                },
+                Orientation.Vertical
+            )
     ) {
-        AndroidView(
-            { context ->
-                LayoutInflater.from(context)
-                    .inflate(android.R.layout.activity_list_item, null)
-                    .apply {
-                        // Nested Scroll Interop will be Enabled when
-                        // nested scroll is enabled for the root view
-                        ViewCompat.setNestedScrollingEnabled(this, true)
-                    }
+        AndroidView({ context ->
+            LayoutInflater.from(context).inflate(android.R.layout.activity_list_item, null).apply {
+                // Nested Scroll Interop will be Enabled when
+                // nested scroll is enabled for the root view
+                ViewCompat.setNestedScrollingEnabled(this, true)
             }
-        )
+        })
     }
 }
 
@@ -120,15 +115,12 @@
     }
 
     // Compose Scrollable
-    Box(
-        Modifier
-            .fillMaxSize()
-            .nestedScroll(nestedScrollConnection)
-    ) {
+    Box(Modifier.fillMaxSize().nestedScroll(nestedScrollConnection)) {
         TopAppBar(
-            modifier = Modifier
-                .height(ToolbarHeight)
-                .offset { IntOffset(x = 0, y = toolbarOffsetHeightPx.value.roundToInt()) },
+            modifier =
+                Modifier.height(ToolbarHeight).offset {
+                    IntOffset(x = 0, y = toolbarOffsetHeightPx.value.roundToInt())
+                },
             title = { Text("toolbar offset is ${toolbarOffsetHeightPx.value}") }
         )
         // Android View
@@ -141,34 +133,27 @@
 
 private fun AndroidViewWithCompose(context: Context): View {
     return LayoutInflater.from(context)
-        .inflate(R.layout.three_fold_nested_scroll_interop, null).apply {
+        .inflate(R.layout.three_fold_nested_scroll_interop, null)
+        .apply {
             with(findViewById<ComposeView>(R.id.compose_view)) {
                 // Compose
                 setContent { LazyColumnWithNestedScrollInteropEnabled() }
             }
-        }.also {
-            ViewCompat.setNestedScrollingEnabled(it, true)
         }
+        .also { ViewCompat.setNestedScrollingEnabled(it, true) }
 }
 
 @Composable
 private fun LazyColumnWithNestedScrollInteropEnabled() {
     LazyColumn(
-        modifier = Modifier.nestedScroll(
-            rememberNestedScrollInteropConnection()
-        ),
+        modifier = Modifier.nestedScroll(rememberNestedScrollInteropConnection()),
         contentPadding = PaddingValues(top = ToolbarHeight)
     ) {
-        item {
-            Text("This is a Lazy Column")
-        }
+        item { Text("This is a Lazy Column") }
         items(40) { item ->
             Box(
-                modifier = Modifier
-                    .padding(16.dp)
-                    .height(56.dp)
-                    .fillMaxWidth()
-                    .background(Color.Gray),
+                modifier =
+                    Modifier.padding(16.dp).height(56.dp).fillMaxWidth().background(Color.Gray),
                 contentAlignment = Alignment.Center
             ) {
                 Text(item.toString())
diff --git a/compose/ui/ui/samples/src/main/java/androidx/compose/ui/samples/NestedScrollSamples.kt b/compose/ui/ui/samples/src/main/java/androidx/compose/ui/samples/NestedScrollSamples.kt
index cb2b988..eb6a4bc 100644
--- a/compose/ui/ui/samples/src/main/java/androidx/compose/ui/samples/NestedScrollSamples.kt
+++ b/compose/ui/ui/samples/src/main/java/androidx/compose/ui/samples/NestedScrollSamples.kt
@@ -75,8 +75,7 @@
         }
     }
     Box(
-        Modifier
-            .fillMaxSize()
+        Modifier.fillMaxSize()
             // attach as a parent to the nested scroll system
             .nestedScroll(nestedScrollConnection)
     ) {
@@ -87,9 +86,10 @@
             }
         }
         TopAppBar(
-            modifier = Modifier
-                .height(toolbarHeight)
-                .offset { IntOffset(x = 0, y = toolbarOffsetHeightPx.value.roundToInt()) },
+            modifier =
+                Modifier.height(toolbarHeight).offset {
+                    IntOffset(x = 0, y = toolbarOffsetHeightPx.value.roundToInt())
+                },
             title = { Text("toolbar offset is ${toolbarOffsetHeightPx.value}") }
         )
     }
@@ -135,43 +135,43 @@
         }
     }
     Box(
-        Modifier
-            .size(100.dp)
+        Modifier.size(100.dp)
             .background(Color.LightGray)
             // attach ourselves to nested scroll system
             .nestedScroll(connection = nestedScrollConnection, dispatcher = nestedScrollDispatcher)
             .draggable(
                 orientation = Orientation.Vertical,
-                state = rememberDraggableState { delta ->
-                    // here's regular drag. Let's be good citizens and ask parents first if they
-                    // want to pre consume (it's a nested scroll contract)
-                    val parentsConsumed = nestedScrollDispatcher.dispatchPreScroll(
-                        available = Offset(x = 0f, y = delta),
-                        source = NestedScrollSource.UserInput
-                    )
-                    // adjust what's available to us since might have consumed smth
-                    val adjustedAvailable = delta - parentsConsumed.y
-                    // we consume
-                    val weConsumed = onNewDelta(adjustedAvailable)
-                    // dispatch as a post scroll what's left after pre-scroll and our consumption
-                    val totalConsumed = Offset(x = 0f, y = weConsumed) + parentsConsumed
-                    val left = adjustedAvailable - weConsumed
-                    nestedScrollDispatcher.dispatchPostScroll(
-                        consumed = totalConsumed,
-                        available = Offset(x = 0f, y = left),
-                        source = NestedScrollSource.UserInput
-                    )
-                    // we won't dispatch pre/post fling events as we have no flinging here, but the
-                    // idea is very similar:
-                    // 1. dispatch pre fling, asking parents to pre consume
-                    // 2. fling (while dispatching scroll events like above for any fling tick)
-                    // 3. dispatch post fling, allowing parent to react to velocity left
-                }
+                state =
+                    rememberDraggableState { delta ->
+                        // here's regular drag. Let's be good citizens and ask parents first if they
+                        // want to pre consume (it's a nested scroll contract)
+                        val parentsConsumed =
+                            nestedScrollDispatcher.dispatchPreScroll(
+                                available = Offset(x = 0f, y = delta),
+                                source = NestedScrollSource.UserInput
+                            )
+                        // adjust what's available to us since might have consumed smth
+                        val adjustedAvailable = delta - parentsConsumed.y
+                        // we consume
+                        val weConsumed = onNewDelta(adjustedAvailable)
+                        // dispatch as a post scroll what's left after pre-scroll and our
+                        // consumption
+                        val totalConsumed = Offset(x = 0f, y = weConsumed) + parentsConsumed
+                        val left = adjustedAvailable - weConsumed
+                        nestedScrollDispatcher.dispatchPostScroll(
+                            consumed = totalConsumed,
+                            available = Offset(x = 0f, y = left),
+                            source = NestedScrollSource.UserInput
+                        )
+                        // we won't dispatch pre/post fling events as we have no flinging here, but
+                        // the
+                        // idea is very similar:
+                        // 1. dispatch pre fling, asking parents to pre consume
+                        // 2. fling (while dispatching scroll events like above for any fling tick)
+                        // 3. dispatch post fling, allowing parent to react to velocity left
+                    }
             )
     ) {
-        Text(
-            "State: ${basicState.value.roundToInt()}",
-            modifier = Modifier.align(Alignment.Center)
-        )
+        Text("State: ${basicState.value.roundToInt()}", modifier = Modifier.align(Alignment.Center))
     }
 }
diff --git a/compose/ui/ui/samples/src/main/java/androidx/compose/ui/samples/OnPlacedSamples.kt b/compose/ui/ui/samples/src/main/java/androidx/compose/ui/samples/OnPlacedSamples.kt
index 339a098..19c507d 100644
--- a/compose/ui/ui/samples/src/main/java/androidx/compose/ui/samples/OnPlacedSamples.kt
+++ b/compose/ui/ui/samples/src/main/java/androidx/compose/ui/samples/OnPlacedSamples.kt
@@ -58,32 +58,34 @@
             mutableStateOf<Animatable<IntOffset, AnimationVector2D>?>(null)
         }
         this.onPlaced {
-            // Calculate the position in the parent layout
-            targetOffset = it.positionInParent().round()
-        }.offset {
-            // Animate to the new target offset when alignment changes.
-            val anim = animatable ?: Animatable(targetOffset, IntOffset.VectorConverter)
-                .also { animatable = it }
-            if (anim.targetValue != targetOffset) {
-                scope.launch {
-                    anim.animateTo(targetOffset, spring(stiffness = StiffnessMediumLow))
-                }
+                // Calculate the position in the parent layout
+                targetOffset = it.positionInParent().round()
             }
-            // Offset the child in the opposite direction to the targetOffset, and slowly catch
-            // up to zero offset via an animation to achieve an overall animated movement.
-            animatable?.let { it.value - targetOffset } ?: IntOffset.Zero
-        }
+            .offset {
+                // Animate to the new target offset when alignment changes.
+                val anim =
+                    animatable
+                        ?: Animatable(targetOffset, IntOffset.VectorConverter).also {
+                            animatable = it
+                        }
+                if (anim.targetValue != targetOffset) {
+                    scope.launch {
+                        anim.animateTo(targetOffset, spring(stiffness = StiffnessMediumLow))
+                    }
+                }
+                // Offset the child in the opposite direction to the targetOffset, and slowly catch
+                // up to zero offset via an animation to achieve an overall animated movement.
+                animatable?.let { it.value - targetOffset } ?: IntOffset.Zero
+            }
     }
 
     @OptIn(ExperimentalComposeUiApi::class)
     @Composable
     fun AnimatedChildAlignment(alignment: Alignment) {
-        Box(
-            Modifier.fillMaxSize().padding(4.dp).border(1.dp, Color.Red)
-        ) {
+        Box(Modifier.fillMaxSize().padding(4.dp).border(1.dp, Color.Red)) {
             Box(
-                modifier = Modifier.animatePlacement().align(alignment).size(100.dp)
-                    .background(Color.Red)
+                modifier =
+                    Modifier.animatePlacement().align(alignment).size(100.dp).background(Color.Red)
             )
         }
     }
diff --git a/compose/ui/ui/samples/src/main/java/androidx/compose/ui/samples/OnSizeChangedSamples.kt b/compose/ui/ui/samples/src/main/java/androidx/compose/ui/samples/OnSizeChangedSamples.kt
index 93093b9..c6b9a7c 100644
--- a/compose/ui/ui/samples/src/main/java/androidx/compose/ui/samples/OnSizeChangedSamples.kt
+++ b/compose/ui/ui/samples/src/main/java/androidx/compose/ui/samples/OnSizeChangedSamples.kt
@@ -29,8 +29,6 @@
     // to use the size of one component to affect the size of another component.
     Text(
         "Hello $name",
-        Modifier.onSizeChanged { size ->
-            println("The size of the Text in pixels is $size")
-        }
+        Modifier.onSizeChanged { size -> println("The size of the Text in pixels is $size") }
     )
 }
diff --git a/compose/ui/ui/samples/src/main/java/androidx/compose/ui/samples/PainterSample.kt b/compose/ui/ui/samples/src/main/java/androidx/compose/ui/samples/PainterSample.kt
index 9b4e1b5..5b26878b 100644
--- a/compose/ui/ui/samples/src/main/java/androidx/compose/ui/samples/PainterSample.kt
+++ b/compose/ui/ui/samples/src/main/java/androidx/compose/ui/samples/PainterSample.kt
@@ -41,11 +41,7 @@
             get() = Size(300.0f, 300.0f)
 
         override fun DrawScope.onDraw() {
-            drawCircle(
-                center = center,
-                radius = size.minDimension / 2.0f,
-                color = Color.Red
-            )
+            drawCircle(center = center, radius = size.minDimension / 2.0f, color = Color.Red)
         }
     }
 
@@ -55,7 +51,9 @@
                 .padding(30.dp)
                 .background(color = Color.Yellow)
                 .paint(CustomPainter())
-    ) { /** intentionally empty */ }
+    ) {
+        /** intentionally empty */
+    }
 }
 
 @Sampled
diff --git a/compose/ui/ui/samples/src/main/java/androidx/compose/ui/samples/PlacementScopeCoordinatesSample.kt b/compose/ui/ui/samples/src/main/java/androidx/compose/ui/samples/PlacementScopeCoordinatesSample.kt
index cd84c1d..ae1f68d 100644
--- a/compose/ui/ui/samples/src/main/java/androidx/compose/ui/samples/PlacementScopeCoordinatesSample.kt
+++ b/compose/ui/ui/samples/src/main/java/androidx/compose/ui/samples/PlacementScopeCoordinatesSample.kt
@@ -35,61 +35,64 @@
     fun FirstItemHalf(modifier: Modifier = Modifier, content: @Composable () -> Unit) {
         val view = LocalView.current
 
-        Layout(content = content, modifier = modifier, measurePolicy = { measurables, constraints ->
-            var width = constraints.minWidth
-            var height = constraints.minHeight
-            // If this doesn't have a fixed size, just layout horizontally
-            var placeables: List<Placeable>? = null
-            if (measurables.isNotEmpty()) {
-                if (constraints.hasBoundedWidth && constraints.hasBoundedHeight) {
-                    width = constraints.maxWidth
-                    height = constraints.maxHeight
-                } else {
-                    placeables = measurables.map { it.measure(constraints) }
-                    width = placeables.sumOf { it.width }
-                    height = placeables.maxOf { it.height }
-                }
-            }
-            layout(width, height) {
-                if (placeables != null) {
-                    var x = 0
-                    placeables.forEach {
-                        it.placeRelative(x, 0)
-                        x += it.width
-                    }
-                } else if (measurables.isNotEmpty() && coordinates != null) {
-                    val coordinates = coordinates!!
-                    val positionInWindow = IntArray(2)
-                    view.getLocationOnScreen(positionInWindow)
-                    val topLeft = coordinates.localToRoot(Offset.Zero).round() +
-                        IntOffset(positionInWindow[0], positionInWindow[1])
-                    val displayWidth = view.resources.displayMetrics.widthPixels
-                    val halfWay = displayWidth / 2
-
-                    val c0 = if (topLeft.x < halfWay) {
-                        // The first measurable should fit to half way across
-                        Constraints.fixed(
-                            halfWay - topLeft.x,
-                            height
-                        )
+        Layout(
+            content = content,
+            modifier = modifier,
+            measurePolicy = { measurables, constraints ->
+                var width = constraints.minWidth
+                var height = constraints.minHeight
+                // If this doesn't have a fixed size, just layout horizontally
+                var placeables: List<Placeable>? = null
+                if (measurables.isNotEmpty()) {
+                    if (constraints.hasBoundedWidth && constraints.hasBoundedHeight) {
+                        width = constraints.maxWidth
+                        height = constraints.maxHeight
                     } else {
-                        // The first is already past the half way, so just divide it evenly
-                        val measureWidth = width / measurables.size
-                        Constraints.fixed(measureWidth, height)
+                        placeables = measurables.map { it.measure(constraints) }
+                        width = placeables.sumOf { it.width }
+                        height = placeables.maxOf { it.height }
                     }
-                    val p0 = measurables[0].measure(c0)
-                    p0.place(0, 0)
+                }
+                layout(width, height) {
+                    if (placeables != null) {
+                        var x = 0
+                        placeables.forEach {
+                            it.placeRelative(x, 0)
+                            x += it.width
+                        }
+                    } else if (measurables.isNotEmpty() && coordinates != null) {
+                        val coordinates = coordinates!!
+                        val positionInWindow = IntArray(2)
+                        view.getLocationOnScreen(positionInWindow)
+                        val topLeft =
+                            coordinates.localToRoot(Offset.Zero).round() +
+                                IntOffset(positionInWindow[0], positionInWindow[1])
+                        val displayWidth = view.resources.displayMetrics.widthPixels
+                        val halfWay = displayWidth / 2
 
-                    // The rest just fit in the remainder of the space
-                    var x = p0.width
-                    for (i in 1..measurables.lastIndex) {
-                        val measureWidth = (width - x) / (measurables.size - i)
-                        val p = measurables[i].measure(Constraints.fixed(measureWidth, height))
-                        p.place(x, 0)
-                        x += p.width
+                        val c0 =
+                            if (topLeft.x < halfWay) {
+                                // The first measurable should fit to half way across
+                                Constraints.fixed(halfWay - topLeft.x, height)
+                            } else {
+                                // The first is already past the half way, so just divide it evenly
+                                val measureWidth = width / measurables.size
+                                Constraints.fixed(measureWidth, height)
+                            }
+                        val p0 = measurables[0].measure(c0)
+                        p0.place(0, 0)
+
+                        // The rest just fit in the remainder of the space
+                        var x = p0.width
+                        for (i in 1..measurables.lastIndex) {
+                            val measureWidth = (width - x) / (measurables.size - i)
+                            val p = measurables[i].measure(Constraints.fixed(measureWidth, height))
+                            p.place(x, 0)
+                            x += p.width
+                        }
                     }
                 }
             }
-        })
+        )
     }
 }
diff --git a/compose/ui/ui/samples/src/main/java/androidx/compose/ui/samples/PlatformTextInputModifierNodeSample.kt b/compose/ui/ui/samples/src/main/java/androidx/compose/ui/samples/PlatformTextInputModifierNodeSample.kt
index 23d6b54..754071e 100644
--- a/compose/ui/ui/samples/src/main/java/androidx/compose/ui/samples/PlatformTextInputModifierNodeSample.kt
+++ b/compose/ui/ui/samples/src/main/java/androidx/compose/ui/samples/PlatformTextInputModifierNodeSample.kt
@@ -43,35 +43,35 @@
 @Suppress("UnusedReceiverParameter")
 @Sampled
 fun platformTextInputModifierNodeSample() {
-    class PlatformTextInputModifierNodeSample : Modifier.Node(),
-        FocusEventModifierNode,
-        PlatformTextInputModifierNode {
+    class PlatformTextInputModifierNodeSample :
+        Modifier.Node(), FocusEventModifierNode, PlatformTextInputModifierNode {
 
         private var focusedJob: Job? = null
 
         override fun onFocusEvent(focusState: FocusState) {
             focusedJob?.cancel()
-            focusedJob = if (focusState.isFocused) {
-                // establishTextInputSession is a suspend function, so it must be called from a
-                // coroutine. Launching it into this modifier node's coroutine scope ensures the
-                // session will automatically be torn down when the node is detached.
-                coroutineScope.launch {
-                    // This will automatically cancel any currently-active session.
-                    establishTextInputSession {
-                        launch {
-                            // TODO: Observe text field state, call into system to update it as
-                            //  required by the platform.
-                        }
+            focusedJob =
+                if (focusState.isFocused) {
+                    // establishTextInputSession is a suspend function, so it must be called from a
+                    // coroutine. Launching it into this modifier node's coroutine scope ensures the
+                    // session will automatically be torn down when the node is detached.
+                    coroutineScope.launch {
+                        // This will automatically cancel any currently-active session.
+                        establishTextInputSession {
+                            launch {
+                                // TODO: Observe text field state, call into system to update it as
+                                //  required by the platform.
+                            }
 
-                        // Call out to a platform-specific expect/actual function to create the
-                        // platform-specific request.
-                        val request: PlatformTextInputMethodRequest = createInputRequest()
-                        startInputMethod(request)
+                            // Call out to a platform-specific expect/actual function to create the
+                            // platform-specific request.
+                            val request: PlatformTextInputMethodRequest = createInputRequest()
+                            startInputMethod(request)
+                        }
                     }
+                } else {
+                    null
                 }
-            } else {
-                null
-            }
         }
 
         // This would probably be an expect/actual function.
@@ -91,30 +91,29 @@
     InterceptPlatformTextInput(
         interceptor = { request, nextHandler ->
             // Create a new request to wrap the incoming one with some custom logic.
-            val modifiedRequest = object : PlatformTextInputMethodRequest {
-                override fun createInputConnection(outAttributes: EditorInfo): InputConnection {
-                    val inputConnection = request.createInputConnection(outAttributes)
-                    // After the original request finishes initializing the EditorInfo we can
-                    // customize it. If we needed to we could also wrap the InputConnection before
-                    // returning it.
-                    updateEditorInfo(outAttributes)
-                    return inputConnection
-                }
+            val modifiedRequest =
+                object : PlatformTextInputMethodRequest {
+                    override fun createInputConnection(outAttributes: EditorInfo): InputConnection {
+                        val inputConnection = request.createInputConnection(outAttributes)
+                        // After the original request finishes initializing the EditorInfo we can
+                        // customize it. If we needed to we could also wrap the InputConnection
+                        // before
+                        // returning it.
+                        updateEditorInfo(outAttributes)
+                        return inputConnection
+                    }
 
-                fun updateEditorInfo(outAttributes: EditorInfo) {
-                    // Your code here, e.g. set some custom properties.
+                    fun updateEditorInfo(outAttributes: EditorInfo) {
+                        // Your code here, e.g. set some custom properties.
+                    }
                 }
-            }
 
             // Send our wrapping request to the next handler, which could be the system or another
             // interceptor up the tree.
             nextHandler.startInputMethod(modifiedRequest)
         }
     ) {
-        BasicTextField(
-            value = text,
-            onValueChange = { text = it }
-        )
+        BasicTextField(value = text, onValueChange = { text = it })
     }
 }
 
diff --git a/compose/ui/ui/samples/src/main/java/androidx/compose/ui/samples/PointerInputModifierSamples.kt b/compose/ui/ui/samples/src/main/java/androidx/compose/ui/samples/PointerInputModifierSamples.kt
index a328c59..a07d2eb 100644
--- a/compose/ui/ui/samples/src/main/java/androidx/compose/ui/samples/PointerInputModifierSamples.kt
+++ b/compose/ui/ui/samples/src/main/java/androidx/compose/ui/samples/PointerInputModifierSamples.kt
@@ -37,15 +37,12 @@
     @Composable
     fun MyComposable(parameter: String) {
         Box(
-            Modifier.fillMaxSize()
-                .pointerInput(parameter) {
-                    // This entire pointerInput block will restart from the beginning
-                    // if and when `parameter` changes, since it's used as a key in
-                    // the creation of the `pointerInput` modifier
-                    detectTapGestures {
-                        performAction(parameter)
-                    }
-                }
+            Modifier.fillMaxSize().pointerInput(parameter) {
+                // This entire pointerInput block will restart from the beginning
+                // if and when `parameter` changes, since it's used as a key in
+                // the creation of the `pointerInput` modifier
+                detectTapGestures { performAction(parameter) }
+            }
         )
     }
 }
@@ -56,18 +53,17 @@
     fun MyComposable(parameter: String) {
         val currentParameter by rememberUpdatedState(parameter)
         Box(
-            Modifier.fillMaxSize()
-                .pointerInput(Unit) {
-                    // This pointerInput block will never restart since
-                    // it specifies a key of `Unit`, which never changes
-                    detectTapGestures {
-                        // ...however, currentParameter is updated out from under this running
-                        // pointerInput suspend block by rememberUpdatedState, and will always
-                        // contain the latest value updated by the composition when a tap
-                        // is detected here.
-                        performAction(currentParameter)
-                    }
+            Modifier.fillMaxSize().pointerInput(Unit) {
+                // This pointerInput block will never restart since
+                // it specifies a key of `Unit`, which never changes
+                detectTapGestures {
+                    // ...however, currentParameter is updated out from under this running
+                    // pointerInput suspend block by rememberUpdatedState, and will always
+                    // contain the latest value updated by the composition when a tap
+                    // is detected here.
+                    performAction(currentParameter)
                 }
+            }
         )
     }
 }
diff --git a/compose/ui/ui/samples/src/main/java/androidx/compose/ui/samples/PopupSample.kt b/compose/ui/ui/samples/src/main/java/androidx/compose/ui/samples/PopupSample.kt
index 7d311d3..5a91fe6 100644
--- a/compose/ui/ui/samples/src/main/java/androidx/compose/ui/samples/PopupSample.kt
+++ b/compose/ui/ui/samples/src/main/java/androidx/compose/ui/samples/PopupSample.kt
@@ -39,8 +39,7 @@
         Popup(alignment = Alignment.Center) {
             // Draw a rectangle shape with rounded corners inside the popup
             Box(
-                Modifier
-                    .size(popupWidth, popupHeight)
+                Modifier.size(popupWidth, popupHeight)
                     .background(Color.White, RoundedCornerShape(cornerSize))
             )
         }
diff --git a/compose/ui/ui/samples/src/main/java/androidx/compose/ui/samples/RotateSample.kt b/compose/ui/ui/samples/src/main/java/androidx/compose/ui/samples/RotateSample.kt
index 3a4ec18..10e69c078 100644
--- a/compose/ui/ui/samples/src/main/java/androidx/compose/ui/samples/RotateSample.kt
+++ b/compose/ui/ui/samples/src/main/java/androidx/compose/ui/samples/RotateSample.kt
@@ -27,8 +27,5 @@
 @Sampled
 @Composable
 fun RotateSample() {
-    Box(
-        Modifier.rotate(45f)
-            .size(100.dp, 100.dp)
-    )
+    Box(Modifier.rotate(45f).size(100.dp, 100.dp))
 }
diff --git a/compose/ui/ui/samples/src/main/java/androidx/compose/ui/samples/RulerSample.kt b/compose/ui/ui/samples/src/main/java/androidx/compose/ui/samples/RulerSample.kt
index 2ed7efa..6bcace5 100644
--- a/compose/ui/ui/samples/src/main/java/androidx/compose/ui/samples/RulerSample.kt
+++ b/compose/ui/ui/samples/src/main/java/androidx/compose/ui/samples/RulerSample.kt
@@ -35,51 +35,53 @@
 fun RulerProducerUsage(content: @Composable BoxScope.() -> Unit) {
     val safeInsets = WindowInsets.safeContent
 
-    Box(Modifier.fillMaxSize().layout { measurable, constraints ->
-        val placeable = measurable.measure(constraints)
-        layout(
-            width = placeable.width,
-            height = placeable.height,
-            rulers = {
-                val height = coordinates.size.height
-                SafeBottomRuler provides (height - safeInsets.getBottom(this)).toFloat()
+    Box(
+        Modifier.fillMaxSize().layout { measurable, constraints ->
+            val placeable = measurable.measure(constraints)
+            layout(
+                width = placeable.width,
+                height = placeable.height,
+                rulers = {
+                    val height = coordinates.size.height
+                    SafeBottomRuler provides (height - safeInsets.getBottom(this)).toFloat()
+                }
+            ) {
+                placeable.place(0, 0)
             }
-        ) {
-            placeable.place(0, 0)
-        }
-    }, content = content)
+        },
+        content = content
+    )
 }
 
 @Sampled
 @Composable
 fun RulerConsumerUsage(content: @Composable BoxScope.() -> Unit) {
-    Box(Modifier.layout { measurable, constraints ->
-        if (!constraints.hasBoundedHeight || !constraints.hasBoundedWidth) {
-            // Can't use the ruler. We don't know our size
-            val placeable = measurable.measure(constraints)
-            layout(placeable.width, placeable.height) {
-                placeable.place(0, 0)
-            }
-        } else {
-            // Use the entire space available
-            layout(constraints.maxWidth, constraints.maxHeight) {
-                // Child is measured to fit above the IME
-                val imePosition = SafeBottomRuler.current(-1f)
-                val maxHeight: Int
-                if (imePosition <= 0 || imePosition >= constraints.maxHeight) {
-                    // IME ruler is outside the bounds of this layout
-                    maxHeight = constraints.maxHeight
-                } else {
-                    maxHeight = imePosition.roundToInt()
+    Box(
+        Modifier.layout { measurable, constraints ->
+            if (!constraints.hasBoundedHeight || !constraints.hasBoundedWidth) {
+                // Can't use the ruler. We don't know our size
+                val placeable = measurable.measure(constraints)
+                layout(placeable.width, placeable.height) { placeable.place(0, 0) }
+            } else {
+                // Use the entire space available
+                layout(constraints.maxWidth, constraints.maxHeight) {
+                    // Child is measured to fit above the IME
+                    val imePosition = SafeBottomRuler.current(-1f)
+                    val maxHeight: Int
+                    if (imePosition <= 0 || imePosition >= constraints.maxHeight) {
+                        // IME ruler is outside the bounds of this layout
+                        maxHeight = constraints.maxHeight
+                    } else {
+                        maxHeight = imePosition.roundToInt()
+                    }
+                    val minHeight = constraints.minHeight.coerceAtMost(maxHeight)
+                    val childConstraints =
+                        constraints.copy(minHeight = minHeight, maxHeight = maxHeight)
+                    val placeable = measurable.measure(childConstraints)
+                    placeable.place(0, 0)
                 }
-                val minHeight = constraints.minHeight.coerceAtMost(maxHeight)
-                val childConstraints = constraints.copy(
-                    minHeight = minHeight,
-                    maxHeight = maxHeight
-                )
-                val placeable = measurable.measure(childConstraints)
-                placeable.place(0, 0)
             }
-        }
-    }, content = content)
+        },
+        content = content
+    )
 }
diff --git a/compose/ui/ui/samples/src/main/java/androidx/compose/ui/samples/ScaleSample.kt b/compose/ui/ui/samples/src/main/java/androidx/compose/ui/samples/ScaleSample.kt
index f05fabe..09489fd 100644
--- a/compose/ui/ui/samples/src/main/java/androidx/compose/ui/samples/ScaleSample.kt
+++ b/compose/ui/ui/samples/src/main/java/androidx/compose/ui/samples/ScaleSample.kt
@@ -27,17 +27,11 @@
 @Sampled
 @Composable
 fun ScaleUniformSample() {
-    Box(
-        Modifier.scale(2f)
-            .size(100.dp, 100.dp)
-    )
+    Box(Modifier.scale(2f).size(100.dp, 100.dp))
 }
 
 @Sampled
 @Composable
 fun ScaleNonUniformSample() {
-    Box(
-        Modifier.scale(scaleX = 2f, scaleY = 3f)
-            .size(100.dp, 100.dp)
-    )
+    Box(Modifier.scale(scaleX = 2f, scaleY = 3f).size(100.dp, 100.dp))
 }
diff --git a/compose/ui/ui/samples/src/main/java/androidx/compose/ui/samples/ShadowSample.kt b/compose/ui/ui/samples/src/main/java/androidx/compose/ui/samples/ShadowSample.kt
index 7ddc032..03dc423 100644
--- a/compose/ui/ui/samples/src/main/java/androidx/compose/ui/samples/ShadowSample.kt
+++ b/compose/ui/ui/samples/src/main/java/androidx/compose/ui/samples/ShadowSample.kt
@@ -28,8 +28,5 @@
 @Sampled
 @Composable
 fun ShadowSample() {
-    Box(
-        Modifier.shadow(12.dp, RectangleShape)
-            .size(100.dp, 100.dp)
-    )
+    Box(Modifier.shadow(12.dp, RectangleShape).size(100.dp, 100.dp))
 }
diff --git a/compose/ui/ui/samples/src/main/java/androidx/compose/ui/samples/SoftwareKeyboardControllerSample.kt b/compose/ui/ui/samples/src/main/java/androidx/compose/ui/samples/SoftwareKeyboardControllerSample.kt
index 5da88e4..e2e8d4c 100644
--- a/compose/ui/ui/samples/src/main/java/androidx/compose/ui/samples/SoftwareKeyboardControllerSample.kt
+++ b/compose/ui/ui/samples/src/main/java/androidx/compose/ui/samples/SoftwareKeyboardControllerSample.kt
@@ -46,20 +46,14 @@
 
     // used to ensure a TextField is focused when showing keyboard
     val focusRequester = remember { FocusRequester() }
-    var (text, setText) = remember {
-        mutableStateOf("Close keyboard on done ime action (blue ✔️)")
-    }
+    var (text, setText) = remember { mutableStateOf("Close keyboard on done ime action (blue ✔️)") }
     Column(Modifier.padding(16.dp)) {
         BasicTextField(
             text,
             setText,
             keyboardOptions = KeyboardOptions(imeAction = ImeAction.Done),
-            keyboardActions = KeyboardActions(
-                onDone = { keyboardController?.hide() }
-            ),
-            modifier = Modifier
-                .focusRequester(focusRequester)
-                .fillMaxWidth()
+            keyboardActions = KeyboardActions(onDone = { keyboardController?.hide() }),
+            modifier = Modifier.focusRequester(focusRequester).fillMaxWidth()
         )
         Spacer(Modifier.height(16.dp))
         Button(
diff --git a/compose/ui/ui/samples/src/main/java/androidx/compose/ui/samples/SubcomposeLayoutSample.kt b/compose/ui/ui/samples/src/main/java/androidx/compose/ui/samples/SubcomposeLayoutSample.kt
index 17abe1a..0f0e5c6 100644
--- a/compose/ui/ui/samples/src/main/java/androidx/compose/ui/samples/SubcomposeLayoutSample.kt
+++ b/compose/ui/ui/samples/src/main/java/androidx/compose/ui/samples/SubcomposeLayoutSample.kt
@@ -29,24 +29,23 @@
 ) {
     // enum class SlotsEnum { Main, Dependent }
     SubcomposeLayout { constraints ->
-        val mainPlaceables = subcompose(SlotsEnum.Main, mainContent).map {
-            it.measure(constraints)
-        }
-        val maxSize = mainPlaceables.fold(IntSize.Zero) { currentMax, placeable ->
-            IntSize(
-                width = maxOf(currentMax.width, placeable.width),
-                height = maxOf(currentMax.height, placeable.height)
-            )
-        }
+        val mainPlaceables = subcompose(SlotsEnum.Main, mainContent).map { it.measure(constraints) }
+        val maxSize =
+            mainPlaceables.fold(IntSize.Zero) { currentMax, placeable ->
+                IntSize(
+                    width = maxOf(currentMax.width, placeable.width),
+                    height = maxOf(currentMax.height, placeable.height)
+                )
+            }
         layout(maxSize.width, maxSize.height) {
             mainPlaceables.forEach { it.placeRelative(0, 0) }
-            subcompose(SlotsEnum.Dependent) {
-                dependentContent(maxSize)
-            }.forEach {
-                it.measure(constraints).placeRelative(0, 0)
-            }
+            subcompose(SlotsEnum.Dependent) { dependentContent(maxSize) }
+                .forEach { it.measure(constraints).placeRelative(0, 0) }
         }
     }
 }
 
-enum class SlotsEnum { Main, Dependent }
+enum class SlotsEnum {
+    Main,
+    Dependent
+}
diff --git a/compose/ui/ui/samples/src/main/java/androidx/compose/ui/samples/TraverseModifierDemo.kt b/compose/ui/ui/samples/src/main/java/androidx/compose/ui/samples/TraverseModifierDemo.kt
index ad2cdbe..4c2c897 100644
--- a/compose/ui/ui/samples/src/main/java/androidx/compose/ui/samples/TraverseModifierDemo.kt
+++ b/compose/ui/ui/samples/src/main/java/androidx/compose/ui/samples/TraverseModifierDemo.kt
@@ -87,9 +87,11 @@
 class CustomTraversableModifierNode : Modifier.Node(), TraversableNode {
     override val traverseKey = TRAVERSAL_NODE_KEY
 
-    fun doSomethingWithAncestor() { }
-    fun doSomethingWithChild() { }
-    fun doSomethingWithDescendant() { }
+    fun doSomethingWithAncestor() {}
+
+    fun doSomethingWithChild() {}
+
+    fun doSomethingWithDescendant() {}
 }
 
 /**
@@ -230,21 +232,20 @@
  * Demonstrates how to use TraversableNode to traverse Modifier.Node ancestors, children, and
  * descendants of the same key. This is done in 5 main steps:
  *
- *  Step 1: Create a unique key for your TraversableNode.
- *  Step 2: Create a custom Modifier.Node class that implements TraversableNode.
- *  Step 3: Create a custom Modifier.Element class that uses that custom Modifier.Node.
- *  Step 4: Create an extension function on Modifier that uses the Modifier.Element.
- *  Step 5: Traverse the Modifier chain when you need to find your node(s).
+ * Step 1: Create a unique key for your TraversableNode. Step 2: Create a custom Modifier.Node class
+ * that implements TraversableNode. Step 3: Create a custom Modifier.Element class that uses that
+ * custom Modifier.Node. Step 4: Create an extension function on Modifier that uses the
+ * Modifier.Element. Step 5: Traverse the Modifier chain when you need to find your node(s).
  *
  * You can see the impact visually of traversing a particular direction from a TraversableNode by
  * the TraversableNode(s) above or below changing their color to green. You can always reset the
  * colors to try out a different traversal methods or nodes.
  *
  * Important Note: References are maintained to all the TraversableNode(s) in this UI, so we can
- * directly call the traversable functions to see how they impact the tree. (We see this visually
- * by the nodes changing color to green.) However, you most likely won't need a block parameter in
- * your code to assign a reference. You will probably just trigger your traversals based on some
- * other event (like a PointerEvent).
+ * directly call the traversable functions to see how they impact the tree. (We see this visually by
+ * the nodes changing color to green.) However, you most likely won't need a block parameter in your
+ * code to assign a reference. You will probably just trigger your traversals based on some other
+ * event (like a PointerEvent).
  *
  * See Compose Foundation's PointerHoverIconModifierNode or the DragAndDropNode implementations for
  * real life examples. (PointerHoverIconModifierNode also skips subtrees.)
@@ -255,16 +256,12 @@
  * Simplified UI hierarchy for this demo (starts at first TraversableNode and ignores
  * non-traversable Row, Spacers, and Text label composables along the way):
  *
- *  Column Root (TraversableBackgroundModifierNode)
- *    ⤷ Column A (TraversableBackgroundModifierNode)
- *        ⤷ Box A (TraversableBackgroundModifierNode)
- *        ⤷ Box B (NON-TRAVERSABLE Box)
- *        ⤷ Box C (TraversableBackgroundModifierNode)
+ * Column Root (TraversableBackgroundModifierNode) ⤷ Column A (TraversableBackgroundModifierNode) ⤷
+ * Box A (TraversableBackgroundModifierNode) ⤷ Box B (NON-TRAVERSABLE Box) ⤷ Box C
+ * (TraversableBackgroundModifierNode)
  *
- *    ⤷ Column B (TraversableBackgroundModifierNode)
- *        ⤷ Box D (NON-TRAVERSABLE Box)
- *        ⤷ Box E (TraversableBackgroundModifierNode)
- *        ⤷ Box F (NON-TRAVERSABLE Box)
+ * ⤷ Column B (TraversableBackgroundModifierNode) ⤷ Box D (NON-TRAVERSABLE Box) ⤷ Box E
+ * (TraversableBackgroundModifierNode) ⤷ Box F (NON-TRAVERSABLE Box)
  */
 @OptIn(ExperimentalMaterialApi::class)
 @Composable
@@ -304,23 +301,24 @@
     var nodeMenuSelectedOptionText by remember { mutableStateOf(nodeMenuOptions[0]) }
 
     // Menu options for picking the actual traversal call made on the node
-    val traversalMenuOptions =
-        listOf(ANCESTORS_LABEL, DESCENDANTS_LABEL)
+    val traversalMenuOptions = listOf(ANCESTORS_LABEL, DESCENDANTS_LABEL)
     var traversalMenuExpanded by remember { mutableStateOf(false) }
     var traversalMenuSelectedOptionText by remember { mutableStateOf(traversalMenuOptions[1]) }
 
-    Column(modifier = Modifier
-        .fillMaxSize()
-        .padding(10.dp)
-        .border(width = 1.dp, color = Color.Black)
-        .padding(10.dp)
+    Column(
+        modifier =
+            Modifier.fillMaxSize()
+                .padding(10.dp)
+                .border(width = 1.dp, color = Color.Black)
+                .padding(10.dp)
     ) {
         Text(
             modifier = Modifier.fillMaxWidth(),
-            text = "Select the Traversable Node and traversal type you want to run.\n\n" +
-                "You can see the results of the tree by which Node is green.\n\n" +
-                "The UI matches the structure of the Composable UI tree.\n\n" +
-                "To reset the colors, click the \"Reset\" button\n."
+            text =
+                "Select the Traversable Node and traversal type you want to run.\n\n" +
+                    "You can see the results of the tree by which Node is green.\n\n" +
+                    "The UI matches the structure of the Composable UI tree.\n\n" +
+                    "To reset the colors, click the \"Reset\" button\n."
         )
 
         Row(modifier = Modifier.fillMaxWidth()) {
@@ -377,9 +375,7 @@
                 )
                 ExposedDropdownMenu(
                     expanded = traversalMenuExpanded,
-                    onDismissRequest = {
-                        traversalMenuExpanded = false
-                    }
+                    onDismissRequest = { traversalMenuExpanded = false }
                 ) {
                     traversalMenuOptions.forEach { selectionOption ->
                         DropdownMenuItem(
@@ -399,13 +395,27 @@
                 onClick = {
                     val selectedNode =
                         when (nodeMenuSelectedOptionText) {
-                            ROOT_LABEL -> { rootTraversableModifierNode }
-                            COLUMN_A_LABEL -> { columnATraversableModifierNode }
-                            BOX_A_LABEL -> { boxATraversableModifierNode }
-                            BOX_C_LABEL -> { boxCTraversableModifierNode }
-                            COLUMN_B_LABEL -> { columnBTraversableModifierNode }
-                            BOX_E_LABEL -> { boxETraversableModifierNode }
-                            else -> { null }
+                            ROOT_LABEL -> {
+                                rootTraversableModifierNode
+                            }
+                            COLUMN_A_LABEL -> {
+                                columnATraversableModifierNode
+                            }
+                            BOX_A_LABEL -> {
+                                boxATraversableModifierNode
+                            }
+                            BOX_C_LABEL -> {
+                                boxCTraversableModifierNode
+                            }
+                            COLUMN_B_LABEL -> {
+                                columnBTraversableModifierNode
+                            }
+                            BOX_E_LABEL -> {
+                                boxETraversableModifierNode
+                            }
+                            else -> {
+                                null
+                            }
                         }
 
                     selectedNode?.let {
@@ -430,40 +440,37 @@
         }
 
         Column(
-            modifier = Modifier
-                .fillMaxWidth()
-                .padding(top = 10.dp)
-                .border(width = 1.dp, color = Color.Black)
-                .traversableBackground(color = ROOT_TRAVERSABLE_DEFAULT_COLOR) {
-                    rootTraversableModifierNode = this
-                },
+            modifier =
+                Modifier.fillMaxWidth()
+                    .padding(top = 10.dp)
+                    .border(width = 1.dp, color = Color.Black)
+                    .traversableBackground(color = ROOT_TRAVERSABLE_DEFAULT_COLOR) {
+                        rootTraversableModifierNode = this
+                    },
             horizontalAlignment = Alignment.CenterHorizontally,
         ) {
-            Text(
-                textAlign = TextAlign.Center,
-                text = "Traversable Root"
-            )
+            Text(textAlign = TextAlign.Center, text = "Traversable Root")
 
             Spacer(Modifier.height(10.dp))
 
             Row(
-                modifier = Modifier
-                    .fillMaxWidth()
-                    .border(width = 1.dp, color = Color.Black)
-                    .padding(10.dp)
-                    .background(Color.Blue)
+                modifier =
+                    Modifier.fillMaxWidth()
+                        .border(width = 1.dp, color = Color.Black)
+                        .padding(10.dp)
+                        .background(Color.Blue)
             ) {
 
                 // Column A
                 Column(
-                    modifier = Modifier
-                        .weight(1f)
-                        .fillMaxSize()
-                        .border(width = 1.dp, color = Color.Black)
-                        .padding(10.dp)
-                        .traversableBackground(color = COLUMN_TRAVERSABLE_DEFAULT_COLOR) {
-                            columnATraversableModifierNode = this
-                        },
+                    modifier =
+                        Modifier.weight(1f)
+                            .fillMaxSize()
+                            .border(width = 1.dp, color = Color.Black)
+                            .padding(10.dp)
+                            .traversableBackground(color = COLUMN_TRAVERSABLE_DEFAULT_COLOR) {
+                                columnATraversableModifierNode = this
+                            },
                     horizontalAlignment = Alignment.CenterHorizontally,
                 ) {
                     Text(
@@ -473,11 +480,11 @@
                     )
 
                     Box(
-                        modifier = Modifier
-                            .border(width = 1.dp, color = Color.Black)
-                            .traversableBackground(color = BOX_TRAVERSABLE_DEFAULT_COLOR) {
-                                boxATraversableModifierNode = this
-                            }
+                        modifier =
+                            Modifier.border(width = 1.dp, color = Color.Black)
+                                .traversableBackground(color = BOX_TRAVERSABLE_DEFAULT_COLOR) {
+                                    boxATraversableModifierNode = this
+                                }
                     ) {
                         Text(
                             modifier = Modifier.padding(4.dp),
@@ -489,9 +496,9 @@
                     Spacer(Modifier.height(10.dp))
 
                     Box(
-                        modifier = Modifier
-                            .border(width = 1.dp, color = Color.Black)
-                            .background(BOX_NON_TRAVERSABLE_DEFAULT_COLOR)
+                        modifier =
+                            Modifier.border(width = 1.dp, color = Color.Black)
+                                .background(BOX_NON_TRAVERSABLE_DEFAULT_COLOR)
                     ) {
                         Text(
                             modifier = Modifier.padding(4.dp),
@@ -503,11 +510,11 @@
                     Spacer(Modifier.height(10.dp))
 
                     Box(
-                        modifier = Modifier
-                            .border(width = 1.dp, color = Color.Black)
-                            .traversableBackground(color = BOX_TRAVERSABLE_DEFAULT_COLOR) {
-                                boxCTraversableModifierNode = this
-                            }
+                        modifier =
+                            Modifier.border(width = 1.dp, color = Color.Black)
+                                .traversableBackground(color = BOX_TRAVERSABLE_DEFAULT_COLOR) {
+                                    boxCTraversableModifierNode = this
+                                }
                     ) {
                         Text(
                             modifier = Modifier.padding(4.dp),
@@ -521,16 +528,16 @@
 
                 // Column B
                 Column(
-                    modifier = Modifier
-                        .weight(1f)
-                        .fillMaxSize()
-                        .border(width = 1.dp, color = Color.Black)
-                        .padding(10.dp)
-                        .traversableBackground(color = COLUMN_TRAVERSABLE_DEFAULT_COLOR) {
-                            columnBTraversableModifierNode = this
-                        },
+                    modifier =
+                        Modifier.weight(1f)
+                            .fillMaxSize()
+                            .border(width = 1.dp, color = Color.Black)
+                            .padding(10.dp)
+                            .traversableBackground(color = COLUMN_TRAVERSABLE_DEFAULT_COLOR) {
+                                columnBTraversableModifierNode = this
+                            },
                     horizontalAlignment = Alignment.CenterHorizontally,
-                    ) {
+                ) {
                     Text(
                         modifier = Modifier.padding(4.dp),
                         textAlign = TextAlign.Center,
@@ -538,9 +545,9 @@
                     )
 
                     Box(
-                        modifier = Modifier
-                            .border(width = 1.dp, color = Color.Black)
-                            .background(BOX_NON_TRAVERSABLE_DEFAULT_COLOR)
+                        modifier =
+                            Modifier.border(width = 1.dp, color = Color.Black)
+                                .background(BOX_NON_TRAVERSABLE_DEFAULT_COLOR)
                     ) {
                         Text(
                             modifier = Modifier.padding(4.dp),
@@ -552,11 +559,11 @@
                     Spacer(Modifier.height(10.dp))
 
                     Box(
-                        modifier = Modifier
-                            .border(width = 1.dp, color = Color.Black)
-                            .traversableBackground(color = BOX_TRAVERSABLE_DEFAULT_COLOR) {
-                                boxETraversableModifierNode = this
-                            }
+                        modifier =
+                            Modifier.border(width = 1.dp, color = Color.Black)
+                                .traversableBackground(color = BOX_TRAVERSABLE_DEFAULT_COLOR) {
+                                    boxETraversableModifierNode = this
+                                }
                     ) {
                         Text(
                             modifier = Modifier.padding(4.dp),
@@ -568,9 +575,9 @@
                     Spacer(Modifier.height(10.dp))
 
                     Box(
-                        modifier = Modifier
-                            .border(width = 1.dp, color = Color.Black)
-                            .background(BOX_NON_TRAVERSABLE_DEFAULT_COLOR)
+                        modifier =
+                            Modifier.border(width = 1.dp, color = Color.Black)
+                                .background(BOX_NON_TRAVERSABLE_DEFAULT_COLOR)
                     ) {
                         Text(
                             modifier = Modifier.padding(4.dp),
@@ -601,15 +608,14 @@
     "androidx.compose.ui.demos.modifier.MY_UNIQUE_TRAVERSAL_NODE_KEY"
 
 /**
- * Step 2: Create a custom Modifier.Node class that implements TraversableNode.
- * TraversableNode is the interface that lets the system know you want to be traversed.
- * In this sample's case, we are using the Modifier.background() Modifier.Node code but making it
- * Traversable.
+ * Step 2: Create a custom Modifier.Node class that implements TraversableNode. TraversableNode is
+ * the interface that lets the system know you want to be traversed. In this sample's case, we are
+ * using the Modifier.background() Modifier.Node code but making it Traversable.
  *
  * We also pass a block as the last parameter, so we can get a reference to the Node. That enables,
- * us to make calls directly from it to search the Modifier chain from that Node. You probably
- * won't do this in practice, but instead get some triggers (like a PointerEvent or something) to
- * execute your traversable calls. To see real examples, look at the implementations of
+ * us to make calls directly from it to search the Modifier chain from that Node. You probably won't
+ * do this in practice, but instead get some triggers (like a PointerEvent or something) to execute
+ * your traversable calls. To see real examples, look at the implementations of
  * PointerHoverIconModifierNode or DragAndDropNode.
  */
 internal class TraversableBackgroundModifierNode(
@@ -627,9 +633,7 @@
     private val originalColor: Color
 
     init {
-        block?.let {
-            it()
-        }
+        block?.let { it() }
         originalColor = color
     }
 
@@ -707,14 +711,14 @@
         if (color != Color.Unspecified) drawOutline(outline, color = color)
         brush?.let { drawOutline(outline, brush = it, alpha = alpha) }
     }
-    override fun toString() =
-        "CustomTraversableModifierNode of key: $TRAVERSAL_NODE_KEY"
+
+    override fun toString() = "CustomTraversableModifierNode of key: $TRAVERSAL_NODE_KEY"
 }
 
 /**
- * Step 3: Create a custom Modifier.Element class that uses the custom Modifier.Node.
- * If you ever need to use a custom Modifier.Node, you need to do this. You can think of this like
- * a Virtual DOM.
+ * Step 3: Create a custom Modifier.Element class that uses the custom Modifier.Node. If you ever
+ * need to use a custom Modifier.Node, you need to do this. You can think of this like a Virtual
+ * DOM.
  */
 private data class DemoCustomTraversableModifierElement(
     private val color: Color = Color.Unspecified,
@@ -723,13 +727,7 @@
     private val shape: Shape,
     val block: (TraversableBackgroundModifierNode.() -> Unit)?
 ) : ModifierNodeElement<TraversableBackgroundModifierNode>() {
-    override fun create() = TraversableBackgroundModifierNode(
-        color,
-        brush,
-        alpha,
-        shape,
-        block
-    )
+    override fun create() = TraversableBackgroundModifierNode(color, brush, alpha, shape, block)
 
     override fun update(node: TraversableBackgroundModifierNode) {
         node.color = color
@@ -749,9 +747,7 @@
     }
 }
 
-/**
- * Step 4: Create an extension function on Modifier that uses the Modifier.Element.
- */
+/** Step 4: Create an extension function on Modifier that uses the Modifier.Element. */
 private fun Modifier.traversableBackground(
     color: Color,
     shape: Shape = RectangleShape,
@@ -759,10 +755,11 @@
 ): Modifier {
     val alpha = 1.0f // for solid colors
 
-    return this then DemoCustomTraversableModifierElement(
-        color = color,
-        shape = shape,
-        alpha = alpha,
-        block = block
-    )
+    return this then
+        DemoCustomTraversableModifierElement(
+            color = color,
+            shape = shape,
+            alpha = alpha,
+            block = block
+        )
 }
diff --git a/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/AccessibilityIteratorsTest.kt b/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/AccessibilityIteratorsTest.kt
index bd38fe1..20e2c84 100644
--- a/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/AccessibilityIteratorsTest.kt
+++ b/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/AccessibilityIteratorsTest.kt
@@ -51,8 +51,7 @@
 @LargeTest
 @RunWith(AndroidJUnit4::class)
 class AccessibilityIteratorsTest {
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
     private val InputText = List(500) { "Line: $it" }.joinToString("\n")
     private val TextFieldTag = "textFieldTag"
@@ -60,8 +59,8 @@
     @Test
     fun characterIterator_following() {
         val text = "abc"
-        val characterIterator = AccessibilityIterators.CharacterTextSegmentIterator
-            .getInstance(Locale.ENGLISH)
+        val characterIterator =
+            AccessibilityIterators.CharacterTextSegmentIterator.getInstance(Locale.ENGLISH)
         characterIterator.initialize(text)
         // Start from the beginning.
         var currentOffset = 0
@@ -90,8 +89,8 @@
     @Test
     fun characterIterator_preceding() {
         val text = "abc"
-        val characterIterator = AccessibilityIterators.CharacterTextSegmentIterator
-            .getInstance(Locale.ENGLISH)
+        val characterIterator =
+            AccessibilityIterators.CharacterTextSegmentIterator.getInstance(Locale.ENGLISH)
         characterIterator.initialize(text)
         // Start from the end.
         var currentOffset = text.length
@@ -120,8 +119,8 @@
     @Test
     fun characterIterator_following_rtl() { // Hebrew -- אבג"
         val text = "\u05d0\u05d1\u05d2"
-        val characterIterator = AccessibilityIterators.CharacterTextSegmentIterator
-            .getInstance(Locale("he", "IL"))
+        val characterIterator =
+            AccessibilityIterators.CharacterTextSegmentIterator.getInstance(Locale("he", "IL"))
         characterIterator.initialize(text)
         // Start from the beginning.
         var currentOffset = 0
@@ -138,8 +137,8 @@
     @Test
     fun characterIterator_preceding_rtl() { // Hebrew -- אבג"
         val text = "\u05d0\u05d1\u05d2"
-        val characterIterator = AccessibilityIterators.CharacterTextSegmentIterator
-            .getInstance(Locale("he", "IL"))
+        val characterIterator =
+            AccessibilityIterators.CharacterTextSegmentIterator.getInstance(Locale("he", "IL"))
         characterIterator.initialize(text)
         // Start from the end.
         var currentOffset = text.length
@@ -156,8 +155,8 @@
     @Test
     fun wordIterator_following() {
         val text = "abc def-ghi. jkl"
-        val wordIterator = AccessibilityIterators.WordTextSegmentIterator
-            .getInstance(Locale.ENGLISH)
+        val wordIterator =
+            AccessibilityIterators.WordTextSegmentIterator.getInstance(Locale.ENGLISH)
         wordIterator.initialize(text)
         // Start from the beginning.
         var currentOffset = 0
@@ -194,8 +193,8 @@
     @Test
     fun wordIterator_preceding() {
         val text = "abc def-ghi. jkl"
-        val wordIterator = AccessibilityIterators.WordTextSegmentIterator
-            .getInstance(Locale.ENGLISH)
+        val wordIterator =
+            AccessibilityIterators.WordTextSegmentIterator.getInstance(Locale.ENGLISH)
         wordIterator.initialize(text)
         // Start from the end.
         var currentOffset = text.length
@@ -225,8 +224,8 @@
     @Test
     fun wordIterator_following_rtl() { // Hebrew -- "אבג דה-וז. חט"
         val text = "\u05d0\u05d1\u05d2 \u05d3\u05d4-\u05d5\u05d6. \u05d7\u05d8"
-        val wordIterator = AccessibilityIterators.WordTextSegmentIterator
-            .getInstance(Locale("he", "IL"))
+        val wordIterator =
+            AccessibilityIterators.WordTextSegmentIterator.getInstance(Locale("he", "IL"))
         wordIterator.initialize(text)
         // Start from the beginning.
         var currentOffset = 0
@@ -249,8 +248,8 @@
     @Test
     fun wordIterator_preceding_rtl() { // Hebrew -- "אבג דה-וז. חט"
         val text = "\u05d0\u05d1\u05d2 \u05d3\u05d4-\u05d5\u05d6. \u05d7\u05d8"
-        val wordIterator = AccessibilityIterators.WordTextSegmentIterator
-            .getInstance(Locale("he", "IL"))
+        val wordIterator =
+            AccessibilityIterators.WordTextSegmentIterator.getInstance(Locale("he", "IL"))
         wordIterator.initialize(text)
         // Start from the end.
         var currentOffset = text.length
@@ -386,8 +385,8 @@
         val endLine = textLayoutResult.getLineForOffset(range[1])
         val startLineTop = textLayoutResult.getLineTop(startLine)
         val endLineTop = textLayoutResult.getLineTop(endLine)
-        val lineHeight = textLayoutResult.getLineBottom(endLine) -
-            textLayoutResult.getLineTop(endLine)
+        val lineHeight =
+            textLayoutResult.getLineBottom(endLine) - textLayoutResult.getLineTop(endLine)
         val iteratorStep = endLineTop - startLineTop
         val nodeHeight = textFieldNode.boundsInWindow.bottom - textFieldNode.boundsInWindow.top
         Truth.assertThat(abs(iteratorStep - nodeHeight) < lineHeight)
@@ -409,8 +408,8 @@
         val endLine = textLayoutResult.getLineForOffset(range[1])
         val startLineTop = textLayoutResult.getLineTop(startLine)
         val endLineTop = textLayoutResult.getLineTop(endLine)
-        val lineHeight = textLayoutResult.getLineBottom(endLine) -
-            textLayoutResult.getLineTop(endLine)
+        val lineHeight =
+            textLayoutResult.getLineBottom(endLine) - textLayoutResult.getLineTop(endLine)
         val iteratorStep = endLineTop - startLineTop
         val nodeHeight = textFieldNode.boundsInWindow.bottom - textFieldNode.boundsInWindow.top
         Truth.assertThat(abs(iteratorStep - nodeHeight) < lineHeight)
@@ -429,14 +428,17 @@
             // TODO(yingleiw): use predefined LocalDensity.current when b/163142237 is fixed.
             with(LocalDensity.current) {
                 BasicText(
-                    style = TextStyle(
-                        fontSize = fontSize,
-                        fontFamily = Font(
-                            resId = androidx.testutils.fonts.R.font.sample_font,
-                            weight = FontWeight.Normal,
-                            style = FontStyle.Normal
-                        ).toFontFamily()
-                    ),
+                    style =
+                        TextStyle(
+                            fontSize = fontSize,
+                            fontFamily =
+                                Font(
+                                        resId = androidx.testutils.fonts.R.font.sample_font,
+                                        weight = FontWeight.Normal,
+                                        style = FontStyle.Normal
+                                    )
+                                    .toFontFamily()
+                        ),
                     text = AnnotatedString(text),
                     modifier = Modifier.requiredWidth(width.toDp()),
                     onTextLayout = { textLayoutResult = it }
diff --git a/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/AndroidAccessibilityTest.kt b/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/AndroidAccessibilityTest.kt
index 9f57a29..0fc0f08 100644
--- a/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/AndroidAccessibilityTest.kt
+++ b/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/AndroidAccessibilityTest.kt
@@ -243,8 +243,7 @@
 @OptIn(ExperimentalMaterialApi::class)
 @RunWith(AndroidJUnit4::class)
 class AndroidAccessibilityTest {
-    @get:Rule
-    val rule = createAndroidComposeRule<TestActivity>()
+    @get:Rule val rule = createAndroidComposeRule<TestActivity>()
 
     private val accessibilityEventLoopIntervalMs = 100L
     private lateinit var androidComposeView: AndroidComposeView
@@ -254,11 +253,13 @@
     private lateinit var resources: Resources
 
     private val accessibilityManager: AccessibilityManager
-        get() = androidComposeView.context
-            .getSystemService(ACCESSIBILITY_SERVICE) as AccessibilityManager
+        get() =
+            androidComposeView.context.getSystemService(ACCESSIBILITY_SERVICE)
+                as AccessibilityManager
+
     private val tag = "Tag"
-    private val argument = ArgumentCaptor
-        .forClass(android.view.accessibility.AccessibilityEvent::class.java)
+    private val argument =
+        ArgumentCaptor.forClass(android.view.accessibility.AccessibilityEvent::class.java)
 
     @Before
     fun setup() {
@@ -267,19 +268,23 @@
         resources = InstrumentationRegistry.getInstrumentation().context.resources
 
         rule.activityRule.scenario.onActivity { activity ->
-            container = spy(OpenComposeView(activity)) {
-                on { onRequestSendAccessibilityEvent(any(), any()) } doReturn false
-            }.apply {
-                layoutParams = ViewGroup.LayoutParams(
-                    ViewGroup.LayoutParams.MATCH_PARENT,
-                    ViewGroup.LayoutParams.MATCH_PARENT
-                )
-            }
+            container =
+                spy(OpenComposeView(activity)) {
+                        on { onRequestSendAccessibilityEvent(any(), any()) } doReturn false
+                    }
+                    .apply {
+                        layoutParams =
+                            ViewGroup.LayoutParams(
+                                ViewGroup.LayoutParams.MATCH_PARENT,
+                                ViewGroup.LayoutParams.MATCH_PARENT
+                            )
+                    }
 
             activity.setContentView(container)
             androidComposeView = container.getChildAt(0) as AndroidComposeView
-            delegate = ViewCompat.getAccessibilityDelegate(androidComposeView) as
-                AndroidComposeViewAccessibilityDelegateCompat
+            delegate =
+                ViewCompat.getAccessibilityDelegate(androidComposeView)
+                    as AndroidComposeViewAccessibilityDelegateCompat
             delegate.accessibilityForceEnabledForTesting = true
             provider = delegate.getAccessibilityNodeProvider(androidComposeView)
         }
@@ -291,9 +296,7 @@
         setContent {
             var checked by remember { mutableStateOf(true) }
             Box(
-                Modifier
-                    .toggleable(value = checked, onValueChange = { checked = it })
-                    .testTag(tag)
+                Modifier.toggleable(value = checked, onValueChange = { checked = it }).testTag(tag)
             ) {
                 BasicText("ToggleableText")
             }
@@ -327,8 +330,7 @@
         setContent {
             var checked by remember { mutableStateOf(true) }
             Box(
-                Modifier
-                    .toggleable(
+                Modifier.toggleable(
                         value = checked,
                         role = Role.Switch,
                         onValueChange = { checked = it }
@@ -338,8 +340,8 @@
                 BasicText("ToggleableText")
             }
         }
-        val toggleableNode = rule.onNodeWithTag(tag, true)
-            .fetchSemanticsNode("couldn't find node with tag $tag")
+        val toggleableNode =
+            rule.onNodeWithTag(tag, true).fetchSemanticsNode("couldn't find node with tag $tag")
         val switchRoleNode = toggleableNode.replacedChildren.last()
 
         // Act.
@@ -362,9 +364,7 @@
             }
 
             // We temporary send Switch role as a separate fake node
-            with(switchRoleInfo) {
-                assertThat(className).isEqualTo("android.view.View")
-            }
+            with(switchRoleInfo) { assertThat(className).isEqualTo("android.view.View") }
         }
     }
 
@@ -406,9 +406,7 @@
         setContent {
             var expanded by remember { mutableStateOf(false) }
             IconButton(
-                modifier = Modifier
-                    .semantics { role = Role.DropdownList }
-                    .testTag(tag),
+                modifier = Modifier.semantics { role = Role.DropdownList }.testTag(tag),
                 onClick = { expanded = true }
             ) {
                 Icon(Icons.Default.MoreVert, null)
@@ -418,9 +416,7 @@
                 onDismissRequest = { expanded = false },
                 offset = DpOffset(24.dp, 0.dp),
             ) {
-                repeat(5) {
-                    DropdownMenuItem(onClick = {}) { Text("Menu Item $it") }
-                }
+                repeat(5) { DropdownMenuItem(onClick = {}) { Text("Menu Item $it") } }
             }
         }
         val virtualId = rule.onNodeWithTag(tag, true).semanticsId
@@ -448,10 +444,7 @@
     fun testCreateAccessibilityNodeInfo_forSelectable() {
         // Arrange.
         setContent {
-            Box(
-                Modifier
-                    .selectable(selected = true, onClick = {})
-                    .testTag(tag)) {
+            Box(Modifier.selectable(selected = true, onClick = {}).testTag(tag)) {
                 BasicText("Text")
             }
         }
@@ -482,10 +475,7 @@
     fun testCreateAccessibilityNodeInfo_forTab() {
         // Arrange.
         setContent {
-            Box(
-                Modifier
-                    .selectable(selected = true, onClick = {}, role = Role.Tab)
-                    .testTag(tag)) {
+            Box(Modifier.selectable(selected = true, onClick = {}, role = Role.Tab).testTag(tag)) {
                 BasicText("Text")
             }
         }
@@ -516,9 +506,9 @@
         // Arrange.
         setContent {
             Box(
-                Modifier
-                    .selectable(selected = true, onClick = {}, role = Role.RadioButton)
-                    .testTag(tag)) {
+                Modifier.selectable(selected = true, onClick = {}, role = Role.RadioButton)
+                    .testTag(tag)
+            ) {
                 BasicText("Text")
             }
         }
@@ -572,17 +562,11 @@
             }
         }
     }
+
     @Test
     fun testCreateAccessibilityNodeInfo_progressIndicator_determinate() {
         // Arrange.
-        setContent {
-            Box(
-                Modifier
-                    .progressSemantics(0.5f)
-                    .testTag(tag)) {
-                BasicText("Text")
-            }
-        }
+        setContent { Box(Modifier.progressSemantics(0.5f).testTag(tag)) { BasicText("Text") } }
         val virtualId = rule.onNodeWithTag(tag).semanticsId
 
         // Act.
@@ -607,15 +591,7 @@
     @Test
     fun testCreateAccessibilityNodeInfo_progressIndicator_determinate_indeterminate() {
         // Arrange.
-        setContent {
-            Box(
-                Modifier
-                    .progressSemantics()
-                    .testTag(tag)
-            ) {
-                BasicText("Text")
-            }
-        }
+        setContent { Box(Modifier.progressSemantics().testTag(tag)) { BasicText("Text") } }
         val virtualId = rule.onNodeWithTag(tag).semanticsId
 
         // Act.
@@ -686,12 +662,7 @@
 
     @Test
     fun emptyTextField_hasStateDescription() {
-        setContent {
-            BasicTextField(
-                rememberTextFieldState(),
-                modifier = Modifier.testTag(tag)
-            )
-        }
+        setContent { BasicTextField(rememberTextFieldState(), modifier = Modifier.testTag(tag)) }
 
         val virtualId = rule.onNodeWithTag(tag).semanticsId
         val info = rule.runOnIdle { createAccessibilityNodeInfo(virtualId) }
@@ -706,18 +677,11 @@
     @Test
     fun emptyTextField_noSpeakableChild_hasStateDescription() {
         setContent {
-            BasicTextField(
-                "",
-                {},
-                modifier = Modifier.testTag(tag)
-            ) {
+            BasicTextField("", {}, modifier = Modifier.testTag(tag)) {
                 Column {
                     it()
                     Button(onClick = {}) {}
-                    Box(
-                        Modifier
-                            .size(10.dp)
-                            .semantics { testTag = "unspeakable child" })
+                    Box(Modifier.size(10.dp).semantics { testTag = "unspeakable child" })
                 }
             }
         }
@@ -750,11 +714,7 @@
         val virtualId = rule.onNodeWithTag(tag).semanticsId
         val info = rule.runOnIdle { createAccessibilityNodeInfo(virtualId) }
 
-        rule.runOnIdle {
-            with(info) {
-                assertThat(stateDescription).isNull()
-            }
-        }
+        rule.runOnIdle { with(info) { assertThat(stateDescription).isNull() } }
     }
 
     @Test
@@ -766,11 +726,10 @@
                 decorator = {
                     Row {
                         it()
-                        Box(modifier = Modifier
-                            .wrapContentSize()
-                            .semantics {
-                                testTag = "box test tag"
-                            }) {
+                        Box(
+                            modifier =
+                                Modifier.wrapContentSize().semantics { testTag = "box test tag" }
+                        ) {
                             BasicText(text = "Label")
                         }
                     }
@@ -781,47 +740,28 @@
         val virtualId = rule.onNodeWithTag(tag).semanticsId
         val info = rule.runOnIdle { createAccessibilityNodeInfo(virtualId) }
 
-        rule.runOnIdle {
-            with(info) {
-                assertThat(stateDescription).isNull()
-            }
-        }
+        rule.runOnIdle { with(info) { assertThat(stateDescription).isNull() } }
     }
 
     @Test
     fun testCreateAccessibilityNodeInfo_forText() {
         // Arrange.
         val text = "Test"
-        setContent {
-            BasicText(text = text)
-        }
+        setContent { BasicText(text = text) }
         val virtualId = rule.onNodeWithText(text).semanticsId
 
         // Act.
         val info = rule.runOnIdle { createAccessibilityNodeInfo(virtualId) }
 
         // Assert.
-        rule.runOnIdle {
-            with(info) {
-                assertThat(className).isEqualTo("android.widget.TextView")
-            }
-        }
+        rule.runOnIdle { with(info) { assertThat(className).isEqualTo("android.widget.TextView") } }
     }
 
     @Test
     fun testCreateAccessibilityNodeInfo_forFocusable_notFocused() {
         // Arrange.
-        setContent {
-            Box(
-                Modifier
-                    .testTag(tag)
-                    .focusable()) {
-                BasicText("focusable")
-            }
-        }
-        val virtualId = rule.onNodeWithTag(tag)
-            .assert(expectValue(Focused, false))
-            .semanticsId
+        setContent { Box(Modifier.testTag(tag).focusable()) { BasicText("focusable") } }
+        val virtualId = rule.onNodeWithTag(tag).assert(expectValue(Focused, false)).semanticsId
 
         // Act.
         val info = rule.runOnIdle { createAccessibilityNodeInfo(virtualId) }
@@ -844,18 +784,12 @@
         // Arrange.
         val focusRequester = FocusRequester()
         setContent {
-            Box(
-                Modifier
-                    .testTag(tag)
-                    .focusRequester(focusRequester)
-                    .focusable()) {
+            Box(Modifier.testTag(tag).focusRequester(focusRequester).focusable()) {
                 BasicText("focusable")
             }
         }
         rule.runOnIdle { focusRequester.requestFocus() }
-        val virtualId = rule.onNodeWithTag(tag)
-            .assert(expectValue(Focused, true))
-            .semanticsId
+        val virtualId = rule.onNodeWithTag(tag).assert(expectValue(Focused, true)).semanticsId
 
         // Act.
         val info = rule.runOnIdle { createAccessibilityNodeInfo(virtualId) }
@@ -880,9 +814,7 @@
     ) {
         var yPosition = 0
         Layout(modifier = modifier, content = content) { measurables, constraints ->
-            val placeables = measurables.map { measurable ->
-                measurable.measure(constraints)
-            }
+            val placeables = measurables.map { measurable -> measurable.measure(constraints) }
 
             layout(constraints.maxWidth, constraints.maxHeight) {
                 placeables.forEach { placeable ->
@@ -915,9 +847,7 @@
                         Row { Text(text3) }
                     }
                 }
-                Row {
-                    Text(overlaidText)
-                }
+                Row { Text(overlaidText) }
             }
         }
         val node3VirtualId = rule.onNodeWithText(text3).semanticsId
@@ -953,9 +883,7 @@
                         Row { Text(text3) }
                     }
                 }
-                Row {
-                    Text(overlaidText)
-                }
+                Row { Text(overlaidText) }
             }
         }
         val node3VirtualId = rule.onNodeWithText(text3).semanticsId
@@ -968,7 +896,8 @@
         // Assert.
         rule.runOnIdle {
             // Nodes 1, 2, and 3 are all children of a larger column; this means with a hierarchy
-            // comparison (like SemanticsSort), the third text node should come before the overlaid node
+            // comparison (like SemanticsSort), the third text node should come before the overlaid
+            // node
             // — OverlaidNode should be read last
             assertThat(ani3.extras.traversalBefore).isNotEqualTo(0)
             assertThat(ani3.extras.traversalBefore).isEqualTo(overlaidNodeVirtualId)
@@ -988,13 +917,12 @@
         setContent {
             Column {
                 Row(
-                    Modifier
-                        .testTag(clickableRowTag)
+                    Modifier.testTag(clickableRowTag)
                         .semantics { isTraversalGroup = true }
-                        .clickable { }
+                        .clickable {}
                 ) {
                     Icon(imageVector = Icons.Default.Add, contentDescription = "fab icon")
-                    Button(onClick = { }, modifier = Modifier.testTag(clickableButtonTag)) {
+                    Button(onClick = {}, modifier = Modifier.testTag(clickableButtonTag)) {
                         Text("First button")
                     }
                 }
@@ -1035,26 +963,24 @@
         val topSampleText = "Top text in column "
         val bottomSampleText = "Bottom text in column "
         setContent {
-            Column(
-                Modifier
-                    .testTag("Test Tag")
-                    .semantics { isTraversalGroup = false }
-            ) {
-                Row { Modifier.semantics { isTraversalGroup = false }
+            Column(Modifier.testTag("Test Tag").semantics { isTraversalGroup = false }) {
+                Row {
+                    Modifier.semantics { isTraversalGroup = false }
                     CardRow(
                         // Setting a bigger traversalIndex here means that this CardRow will be
                         // read second, even though it is visually to the left of the other CardRow
-                        Modifier
-                            .semantics { isTraversalGroup = true }
+                        Modifier.semantics { isTraversalGroup = true }
                             .semantics { traversalIndex = 1f },
                         1,
                         topSampleText,
-                        bottomSampleText)
+                        bottomSampleText
+                    )
                     CardRow(
                         Modifier.semantics { isTraversalGroup = true },
                         2,
                         topSampleText,
-                        bottomSampleText)
+                        bottomSampleText
+                    )
                 }
             }
         }
@@ -1085,22 +1011,21 @@
         val topSampleText = "Top text in column "
         val bottomSampleText = "Bottom text in column "
         setContent {
-            Column(
-                Modifier
-                    .testTag("Test Tag")
-                    .semantics { isTraversalGroup = false }
-            ) {
-                Row { Modifier.semantics { isTraversalGroup = false }
+            Column(Modifier.testTag("Test Tag").semantics { isTraversalGroup = false }) {
+                Row {
+                    Modifier.semantics { isTraversalGroup = false }
                     CardRow(
                         Modifier.semantics { isTraversalGroup = true },
                         1,
                         topSampleText,
-                        bottomSampleText)
+                        bottomSampleText
+                    )
                     CardRow(
                         Modifier.semantics { isTraversalGroup = true },
                         2,
                         topSampleText,
-                        bottomSampleText)
+                        bottomSampleText
+                    )
                 }
             }
         }
@@ -1134,26 +1059,21 @@
         val topSampleText = "Top text in column "
         val bottomSampleText = "Bottom text in column "
         setContent {
-            Column(
-                Modifier
-                    .testTag("Test Tag")
-                    .semantics { isTraversalGroup = true }
-            ) {
-                Row { Modifier.semantics { isTraversalGroup = true }
+            Column(Modifier.testTag("Test Tag").semantics { isTraversalGroup = true }) {
+                Row {
+                    Modifier.semantics { isTraversalGroup = true }
                     CardRow(
-                        Modifier
-                            .testTag("Row 1")
-                            .semantics { isTraversalGroup = false },
+                        Modifier.testTag("Row 1").semantics { isTraversalGroup = false },
                         1,
                         topSampleText,
-                        bottomSampleText)
+                        bottomSampleText
+                    )
                     CardRow(
-                        Modifier
-                            .testTag("Row 2")
-                            .semantics { isTraversalGroup = false },
+                        Modifier.testTag("Row 2").semantics { isTraversalGroup = false },
                         2,
                         topSampleText,
-                        bottomSampleText)
+                        bottomSampleText
+                    )
                 }
             }
         }
@@ -1184,17 +1104,20 @@
                     Modifier.semantics { isTraversalGroup = false },
                     1,
                     topSampleText,
-                    bottomSampleText)
+                    bottomSampleText
+                )
                 CardRow(
                     Modifier.semantics { isTraversalGroup = false },
                     2,
                     topSampleText,
-                    bottomSampleText)
+                    bottomSampleText
+                )
                 CardRow(
                     Modifier.semantics { isTraversalGroup = true },
                     3,
                     topSampleText,
-                    bottomSampleText)
+                    bottomSampleText
+                )
             }
         }
         val bottomText1 = rule.onNodeWithText(bottomSampleText + 1).semanticsId
@@ -1213,7 +1136,8 @@
         // `isTraversalGroup = false`
         // `isTraversalGroup = true`
         // In this case, we expect to read in the order of: Top 1, Top 2, Bottom 1, Bottom 2,
-        // then Top 3, Bottom 3. The first two traversal groups are effectively merged since they are both
+        // then Top 3, Bottom 3. The first two traversal groups are effectively merged since they
+        // are both
         // set to false, while the third traversal group is structurally significant.
         rule.runOnIdle {
             assertThat(bottomText1ANI.extras.traversalBefore).isEqualTo(bottomText2)
@@ -1273,9 +1197,7 @@
         setContent {
             LastElementOverLaidColumn(
                 // None of the elements below should inherit `traversalIndex = 5f`
-                modifier = Modifier
-                    .padding(8.dp)
-                    .semantics { traversalIndex = 5f }
+                modifier = Modifier.padding(8.dp).semantics { traversalIndex = 5f }
             ) {
                 Row {
                     Column {
@@ -1319,29 +1241,32 @@
                 Modifier
                     // Having a traversal index here as 8f shouldn't affect anything; this column
                     // has no other peers that its compared to
-                    .semantics { traversalIndex = 8f; isTraversalGroup = true }
+                    .semantics {
+                        traversalIndex = 8f
+                        isTraversalGroup = true
+                    }
                     .padding(8.dp)
             ) {
                 Row(
-                    Modifier.semantics { traversalIndex = 3f; isTraversalGroup = true }
+                    Modifier.semantics {
+                        traversalIndex = 3f
+                        isTraversalGroup = true
+                    }
                 ) {
                     Column(modifier = Modifier.testTag("Tag1")) {
                         Row { Text(text3) }
-                        Row { Text(
-                            text = text5, modifier = Modifier.semantics { traversalIndex = 1f })
+                        Row {
+                            Text(
+                                text = text5,
+                                modifier = Modifier.semantics { traversalIndex = 1f }
+                            )
                         }
                         Row { Text(text4) }
                     }
                 }
-                Row {
-                    Text(text = text2, modifier = Modifier.semantics { traversalIndex = 2f })
-                }
-                Row {
-                    Text(text = text1, modifier = Modifier.semantics { traversalIndex = 1f })
-                }
-                Row {
-                    Text(text = text0)
-                }
+                Row { Text(text = text2, modifier = Modifier.semantics { traversalIndex = 2f }) }
+                Row { Text(text = text1, modifier = Modifier.semantics { traversalIndex = 1f }) }
+                Row { Text(text = text0) }
             }
         }
         val virtualViewId0 = rule.onNodeWithText(text0).semanticsId
@@ -1378,9 +1303,9 @@
         val text3 = "Text 3\n"
         setContent {
             LastElementOverLaidColumn(
-                modifier = Modifier
-                    .semantics { traversalIndex = -1f }
-                    .semantics { isTraversalGroup = true }
+                modifier =
+                    Modifier.semantics { traversalIndex = -1f }
+                        .semantics { isTraversalGroup = true }
             ) {
                 Row {
                     Column {
@@ -1392,9 +1317,9 @@
                 Row {
                     Text(
                         text = overlaidText,
-                        modifier = Modifier
-                            .semantics { traversalIndex = 1f }
-                            .semantics { isTraversalGroup = true }
+                        modifier =
+                            Modifier.semantics { traversalIndex = 1f }
+                                .semantics { isTraversalGroup = true }
                     )
                 }
             }
@@ -1420,9 +1345,9 @@
         // the modifier chain. Behavior-wise, this shouldn't change anything.
         setContent {
             LastElementOverLaidColumn(
-                modifier = Modifier
-                    .semantics { isTraversalGroup = true }
-                    .semantics { traversalIndex = -1f }
+                modifier =
+                    Modifier.semantics { isTraversalGroup = true }
+                        .semantics { traversalIndex = -1f }
             ) {
                 Row {
                     Column {
@@ -1434,9 +1359,9 @@
                 Row {
                     Text(
                         text = overlaidText,
-                        modifier = Modifier
-                            .semantics { isTraversalGroup = true }
-                            .semantics { traversalIndex = 1f }
+                        modifier =
+                            Modifier.semantics { isTraversalGroup = true }
+                                .semantics { traversalIndex = 1f }
                     )
                 }
             }
@@ -1457,15 +1382,9 @@
         val topAppBarText = "Top App Bar"
         val textBoxTag = "Text Box"
         setContent {
-            Box(Modifier.testTag(textBoxTag)) {
-                Text(text = "Lorem ipsum ".repeat(200))
-            }
+            Box(Modifier.testTag(textBoxTag)) { Text(text = "Lorem ipsum ".repeat(200)) }
 
-            TopAppBar(
-                title = {
-                    Text(text = topAppBarText)
-                }
-            )
+            TopAppBar(title = { Text(text = topAppBarText) })
         }
         val textBoxId = rule.onNodeWithTag(textBoxTag).semanticsId
         val topAppBarId = rule.onNodeWithText(topAppBarText).semanticsId
@@ -1486,14 +1405,9 @@
         val sampleText2 = "Sample text 2"
         var counter = 1
         setContent {
-            Column(
-                Modifier
-                    .verticalScroll(rememberScrollState())
-            ) {
+            Column(Modifier.verticalScroll(rememberScrollState())) {
                 TopAppBar(title = { Text(text = topAppBarText) })
-                repeat(100) {
-                    Text(sampleText + counter++)
-                }
+                repeat(100) { Text(sampleText + counter++) }
             }
         }
         val topAppBarId = rule.onNodeWithText(topAppBarText).semanticsId
@@ -1525,13 +1439,14 @@
                 scaffoldState = scaffoldState,
                 topBar = { TopAppBar(title = { Text(topAppBarText) }) },
                 floatingActionButtonPosition = FabPosition.End,
-                floatingActionButton = { FloatingActionButton(onClick = {}) {
-                    Icon(imageVector = Icons.Default.Add, contentDescription = "fab icon")
-                } },
+                floatingActionButton = {
+                    FloatingActionButton(onClick = {}) {
+                        Icon(imageVector = Icons.Default.Add, contentDescription = "fab icon")
+                    }
+                },
                 drawerContent = { Text(text = "Drawer Menu 1") },
                 content = { padding -> Text(contentText, modifier = Modifier.padding(padding)) },
-                bottomBar = { BottomAppBar {
-                    Text(bottomAppBarText) } }
+                bottomBar = { BottomAppBar { Text(bottomAppBarText) } }
             )
         }
         val topAppBarId = rule.onNodeWithText(topAppBarText).semanticsId
@@ -1560,19 +1475,14 @@
         setContent {
             Scaffold(
                 topBar = {
-                    Row(
-                        horizontalArrangement = Arrangement.SpaceEvenly
-                    ) {
-                        IconButton(onClick = { }) {
+                    Row(horizontalArrangement = Arrangement.SpaceEvenly) {
+                        IconButton(onClick = {}) {
                             Icon(Icons.Default.Face, contentDescription = content1)
                         }
-                        IconButton(
-                            onClick = { },
-                            modifier = Modifier.clearAndSetSemantics { }
-                        ) {
+                        IconButton(onClick = {}, modifier = Modifier.clearAndSetSemantics {}) {
                             Icon(Icons.Default.Face, contentDescription = content2)
                         }
-                        IconButton(onClick = { }) {
+                        IconButton(onClick = {}) {
                             Icon(Icons.Default.Face, contentDescription = content3)
                         }
                     }
@@ -1628,19 +1538,11 @@
                         )
                         BasicText(
                             "Child Two",
-                            Modifier
-                                .testTag(childTwoTag)
-                                .requiredSize(50.toDp())
+                            Modifier.testTag(childTwoTag).requiredSize(50.toDp())
                         )
                     }
                 }
-                Box {
-                    BasicText(
-                        "Child Three",
-                        Modifier
-                            .testTag(childThreeTag)
-                    )
-                }
+                Box { BasicText("Child Three", Modifier.testTag(childThreeTag)) }
             }
         }
         val parentBox1Id = rule.onNodeWithTag(parentBox1Tag).semanticsId
@@ -1668,41 +1570,23 @@
     }
 
     @Composable
-    fun ScrollColumn(
-        padding: PaddingValues,
-        firstElement: String,
-        lastElement: String
-    ) {
+    fun ScrollColumn(padding: PaddingValues, firstElement: String, lastElement: String) {
         var counter = 0
         val sampleText = "Sample text in column"
-        Column(
-            Modifier
-                .verticalScroll(rememberScrollState())
-                .padding(padding)
-        ) {
+        Column(Modifier.verticalScroll(rememberScrollState()).padding(padding)) {
             Text(text = firstElement, modifier = Modifier.testTag(firstElement))
-            repeat(100) {
-                Text(sampleText + counter++)
-            }
+            repeat(100) { Text(sampleText + counter++) }
             Text(text = lastElement, modifier = Modifier.testTag(lastElement))
         }
     }
 
     @Composable
-    fun ScrollColumnNoPadding(
-        firstElement: String,
-        lastElement: String
-    ) {
+    fun ScrollColumnNoPadding(firstElement: String, lastElement: String) {
         var counter = 0
         val sampleText = "Sample text in column"
-        Column(
-            Modifier
-                .verticalScroll(rememberScrollState())
-        ) {
+        Column(Modifier.verticalScroll(rememberScrollState())) {
             Text(text = firstElement, modifier = Modifier.testTag(firstElement))
-            repeat(30) {
-                Text(sampleText + counter++)
-            }
+            repeat(30) { Text(sampleText + counter++) }
             Text(text = lastElement, modifier = Modifier.testTag(lastElement))
         }
     }
@@ -1717,17 +1601,9 @@
         setContent {
             ScaffoldedSubcomposeLayout(
                 modifier = Modifier,
-                topBar = {
-                    TopAppBar(
-                        title = { Text(text = topAppBarText) }
-                    )
-                },
+                topBar = { TopAppBar(title = { Text(text = topAppBarText) }) },
                 content = { ScrollColumnNoPadding(firstContentText, lastContentText) },
-                bottomBar = {
-                    BottomAppBar {
-                        Text(bottomAppBarText)
-                    }
-                }
+                bottomBar = { BottomAppBar { Text(bottomAppBarText) } }
             )
         }
 
@@ -1764,17 +1640,8 @@
         val childTag2 = "child2"
         setContent {
             Column(Modifier.testTag(rootTag)) {
-                SimpleTestLayout(
-                    Modifier
-                        .requiredSize(50.dp)
-                        .zIndex(1f)
-                        .testTag(childTag1)
-                ) {}
-                SimpleTestLayout(
-                    Modifier
-                        .requiredSize(50.dp)
-                        .testTag(childTag2)
-                ) {}
+                SimpleTestLayout(Modifier.requiredSize(50.dp).zIndex(1f).testTag(childTag1)) {}
+                SimpleTestLayout(Modifier.requiredSize(50.dp).testTag(childTag2)) {}
             }
         }
         val root = rule.onNodeWithTag(rootTag).fetchSemanticsNode()
@@ -1801,20 +1668,9 @@
         val childTag1 = "child1"
         val childTag2 = "child2"
         setContent {
-            Row(
-                Modifier.testTag(rootTag)
-            ) {
-                SimpleTestLayout(
-                    Modifier
-                        .requiredSize(50.dp)
-                        .zIndex(1f)
-                        .testTag(childTag1)
-                ) {}
-                SimpleTestLayout(
-                    Modifier
-                        .requiredSize(50.dp)
-                        .testTag(childTag2)
-                ) {}
+            Row(Modifier.testTag(rootTag)) {
+                SimpleTestLayout(Modifier.requiredSize(50.dp).zIndex(1f).testTag(childTag1)) {}
+                SimpleTestLayout(Modifier.requiredSize(50.dp).testTag(childTag2)) {}
             }
         }
         val root = rule.onNodeWithTag(rootTag).fetchSemanticsNode()
@@ -1841,20 +1697,11 @@
         val childTag1 = "child1"
         val childTag2 = "child2"
         setContent {
-            Box(
-                Modifier.testTag(rootTag)
-            ) {
+            Box(Modifier.testTag(rootTag)) {
                 SimpleTestLayout(
-                    Modifier
-                        .requiredSize(50.dp)
-                        .offset(x = 0.dp, y = 50.dp)
-                        .testTag(childTag1)
+                    Modifier.requiredSize(50.dp).offset(x = 0.dp, y = 50.dp).testTag(childTag1)
                 ) {}
-                SimpleTestLayout(
-                    Modifier
-                        .requiredSize(50.dp)
-                        .testTag(childTag2)
-                ) {}
+                SimpleTestLayout(Modifier.requiredSize(50.dp).testTag(childTag2)) {}
             }
         }
         val root = rule.onNodeWithTag(rootTag).fetchSemanticsNode()
@@ -1881,20 +1728,11 @@
         val childTag1 = "child1"
         val childTag2 = "child2"
         setContent {
-            Box(
-                Modifier.testTag(rootTag)
-            ) {
+            Box(Modifier.testTag(rootTag)) {
                 SimpleTestLayout(
-                    Modifier
-                        .requiredSize(50.dp)
-                        .offset(x = 50.dp, y = 0.dp)
-                        .testTag(childTag1)
+                    Modifier.requiredSize(50.dp).offset(x = 50.dp, y = 0.dp).testTag(childTag1)
                 ) {}
-                SimpleTestLayout(
-                    Modifier
-                        .requiredSize(50.dp)
-                        .testTag(childTag2)
-                ) {}
+                SimpleTestLayout(Modifier.requiredSize(50.dp).testTag(childTag2)) {}
             }
         }
         val root = rule.onNodeWithTag(rootTag).fetchSemanticsNode()
@@ -1921,20 +1759,11 @@
         val childTag1 = "child1"
         val childTag2 = "child2"
         setContent {
-            Box(
-                Modifier.testTag(rootTag)
-            ) {
+            Box(Modifier.testTag(rootTag)) {
                 SimpleTestLayout(
-                    Modifier
-                        .requiredSize(50.dp)
-                        .offset(x = 0.dp, y = 20.dp)
-                        .testTag(childTag1)
+                    Modifier.requiredSize(50.dp).offset(x = 0.dp, y = 20.dp).testTag(childTag1)
                 ) {}
-                SimpleTestLayout(
-                    Modifier
-                        .requiredSize(50.dp)
-                        .testTag(childTag2)
-                ) {}
+                SimpleTestLayout(Modifier.requiredSize(50.dp).testTag(childTag2)) {}
             }
         }
         val root = rule.onNodeWithTag(rootTag).fetchSemanticsNode()
@@ -1961,21 +1790,17 @@
         val childTag1 = "child1"
         val childTag2 = "child2"
         setContent {
-            Box(
-                Modifier.testTag(rootTag)
-            ) {
+            Box(Modifier.testTag(rootTag)) {
                 // Layouts need to have `.clickable` on them in order to make the nodes
                 // speakable and therefore sortable
                 SimpleTestLayout(
-                    Modifier
-                        .requiredSize(50.dp)
+                    Modifier.requiredSize(50.dp)
                         .offset(x = 20.dp, y = 0.dp)
                         .testTag(childTag1)
                         .clickable(onClick = {})
                 ) {}
                 SimpleTestLayout(
-                    Modifier
-                        .requiredSize(50.dp)
+                    Modifier.requiredSize(50.dp)
                         .offset(x = 0.dp, y = 20.dp)
                         .testTag(childTag2)
                         .clickable(onClick = {})
@@ -2008,21 +1833,9 @@
             CompositionLocalProvider(LocalDensity provides density) {
                 SimpleSubcomposeLayout(
                     Modifier.testTag(rootTag),
-                    {
-                        SimpleTestLayout(
-                            Modifier
-                                .requiredSize(100.dp)
-                                .testTag(childTag1)
-                        ) {}
-                    },
+                    { SimpleTestLayout(Modifier.requiredSize(100.dp).testTag(childTag1)) {} },
                     Offset(0f, size),
-                    {
-                        SimpleTestLayout(
-                            Modifier
-                                .requiredSize(100.dp)
-                                .testTag(childTag2)
-                        ) {}
-                    },
+                    { SimpleTestLayout(Modifier.requiredSize(100.dp).testTag(childTag2)) {} },
                     Offset(0f, 0f)
                 )
             }
@@ -2056,21 +1869,9 @@
             CompositionLocalProvider(LocalDensity provides density) {
                 SimpleSubcomposeLayout(
                     Modifier.testTag(rootTag),
-                    {
-                        SimpleTestLayout(
-                            Modifier
-                                .requiredSize(100.dp)
-                                .testTag(childTag1)
-                        ) {}
-                    },
+                    { SimpleTestLayout(Modifier.requiredSize(100.dp).testTag(childTag1)) {} },
                     Offset(size, 0f),
-                    {
-                        SimpleTestLayout(
-                            Modifier
-                                .requiredSize(100.dp)
-                                .testTag(childTag2)
-                        ) {}
-                    },
+                    { SimpleTestLayout(Modifier.requiredSize(100.dp).testTag(childTag2)) {} },
                     Offset(0f, 0f)
                 )
             }
@@ -2107,47 +1908,17 @@
                 // Will display child1, child2, child3, and should be read
                 // from child1 => child2 => child3.
                 Row(Modifier.semantics { isTraversalGroup = true }) {
-                    SimpleTestLayout(
-                        Modifier
-                            .requiredSize(100.dp)
-                    ) {
-                        Text(childText1)
-                    }
-                    SimpleTestLayout(
-                        Modifier
-                            .requiredSize(100.dp)
-                    ) {
-                        Text(childText2)
-                    }
-                    SimpleTestLayout(
-                        Modifier
-                            .requiredSize(100.dp)
-                    ) {
-                        Text(childText3)
-                    }
+                    SimpleTestLayout(Modifier.requiredSize(100.dp)) { Text(childText1) }
+                    SimpleTestLayout(Modifier.requiredSize(100.dp)) { Text(childText2) }
+                    SimpleTestLayout(Modifier.requiredSize(100.dp)) { Text(childText3) }
                 }
                 CompositionLocalProvider(LocalLayoutDirection provides LayoutDirection.Rtl) {
                     // Will display rtlChild3 rtlChild2 rtlChild1, but should be read
                     // from child1 => child2 => child3.
                     Row(Modifier.semantics { isTraversalGroup = true }) {
-                        SimpleTestLayout(
-                            Modifier
-                                .requiredSize(100.dp)
-                        ) {
-                            Text(rtlChildText1)
-                        }
-                        SimpleTestLayout(
-                            Modifier
-                                .requiredSize(100.dp)
-                        ) {
-                            Text(rtlChildText2)
-                        }
-                        SimpleTestLayout(
-                            Modifier
-                                .requiredSize(100.dp)
-                        ) {
-                            Text(rtlChildText3)
-                        }
+                        SimpleTestLayout(Modifier.requiredSize(100.dp)) { Text(rtlChildText1) }
+                        SimpleTestLayout(Modifier.requiredSize(100.dp)) { Text(rtlChildText2) }
+                        SimpleTestLayout(Modifier.requiredSize(100.dp)) { Text(rtlChildText3) }
                     }
                 }
             }
@@ -2201,23 +1972,12 @@
         firstButtonText: String,
         lastButtonText: String
     ) {
-        Column(
-            Modifier
-                .verticalScroll(rememberScrollState())
-                .padding(padding)
-                .testTag(columnTag)
-        ) {
-            Button(onClick = { }) {
-                Text(firstButtonText)
-            }
+        Column(Modifier.verticalScroll(rememberScrollState()).padding(padding).testTag(columnTag)) {
+            Button(onClick = {}) { Text(firstButtonText) }
 
-            AndroidView(::TextView) {
-                it.text = interopText
-            }
+            AndroidView(::TextView) { it.text = interopText }
 
-            Button(onClick = { }) {
-                Text(lastButtonText)
-            }
+            Button(onClick = {}) { Text(lastButtonText) }
         }
     }
 
@@ -2236,19 +1996,23 @@
                 scaffoldState = scaffoldState,
                 topBar = { TopAppBar(title = { Text(topAppBarText) }) },
                 floatingActionButtonPosition = FabPosition.End,
-                floatingActionButton = { FloatingActionButton(onClick = {}) {
-                    Icon(imageVector = Icons.Default.Add, contentDescription = fabContentText)
-                } },
+                floatingActionButton = {
+                    FloatingActionButton(onClick = {}) {
+                        Icon(imageVector = Icons.Default.Add, contentDescription = fabContentText)
+                    }
+                },
                 drawerContent = { Text(text = "Drawer Menu 1") },
-                content = { padding -> InteropColumn(
-                    padding, columnTag, interopText, firstButtonText, lastButtonText) },
+                content = { padding ->
+                    InteropColumn(padding, columnTag, interopText, firstButtonText, lastButtonText)
+                },
                 bottomBar = { BottomAppBar { Text("Bottom App Bar") } }
             )
         }
-        val colSemanticsNode = rule.onNodeWithTag(columnTag)
-            .fetchSemanticsNode("can't find node with tag $columnTag")
-        val viewHolder = androidComposeView.androidViewsHandler
-            .layoutNodeToHolder[colSemanticsNode.replacedChildren[1].layoutNode]
+        val colSemanticsNode =
+            rule.onNodeWithTag(columnTag).fetchSemanticsNode("can't find node with tag $columnTag")
+        val viewHolder =
+            androidComposeView.androidViewsHandler.layoutNodeToHolder[
+                    colSemanticsNode.replacedChildren[1].layoutNode]
         checkNotNull(viewHolder)
         val firstButtonId = rule.onNodeWithText(firstButtonText).semanticsId
         val lastButtonId = rule.onNodeWithText(lastButtonText).semanticsId
@@ -2288,13 +2052,8 @@
         thirdButtonText: String,
         fourthButtonText: String
     ) {
-        Column(
-            Modifier
-                .verticalScroll(rememberScrollState())
-                .padding(padding)
-                .testTag(columnTag)
-        ) {
-            Button(modifier = Modifier.semantics { traversalIndex = 3f }, onClick = { }) {
+        Column(Modifier.verticalScroll(rememberScrollState()).padding(padding).testTag(columnTag)) {
+            Button(modifier = Modifier.semantics { traversalIndex = 3f }, onClick = {}) {
                 Text(firstButtonText)
             }
 
@@ -2302,11 +2061,11 @@
                 it.text = interopText
             }
 
-            Button(modifier = Modifier.semantics { traversalIndex = 1f }, onClick = { }) {
+            Button(modifier = Modifier.semantics { traversalIndex = 1f }, onClick = {}) {
                 Text(thirdButtonText)
             }
 
-            Button(modifier = Modifier.semantics { traversalIndex = 0f }, onClick = { }) {
+            Button(modifier = Modifier.semantics { traversalIndex = 0f }, onClick = {}) {
                 Text(fourthButtonText)
             }
         }
@@ -2328,21 +2087,30 @@
                 scaffoldState = scaffoldState,
                 topBar = { TopAppBar(title = { Text(topAppBarText) }) },
                 floatingActionButtonPosition = FabPosition.End,
-                floatingActionButton = { FloatingActionButton(onClick = {}) {
-                    Icon(imageVector = Icons.Default.Add, contentDescription = fabContentText)
-                } },
+                floatingActionButton = {
+                    FloatingActionButton(onClick = {}) {
+                        Icon(imageVector = Icons.Default.Add, contentDescription = fabContentText)
+                    }
+                },
                 drawerContent = { Text(text = "Drawer Menu 1") },
-                content = { padding -> InteropColumnBackwards(
-                    padding, columnTag, interopText,
-                    firstButtonText, thirdButtonText, fourthButtonText
-                ) },
+                content = { padding ->
+                    InteropColumnBackwards(
+                        padding,
+                        columnTag,
+                        interopText,
+                        firstButtonText,
+                        thirdButtonText,
+                        fourthButtonText
+                    )
+                },
                 bottomBar = { BottomAppBar { Text("Bottom App Bar") } }
             )
         }
-        val colSemanticsNode = rule.onNodeWithTag(columnTag)
-            .fetchSemanticsNode("can't find node with tag $columnTag")
-        val viewHolder = androidComposeView.androidViewsHandler
-            .layoutNodeToHolder[colSemanticsNode.replacedChildren[1].layoutNode]
+        val colSemanticsNode =
+            rule.onNodeWithTag(columnTag).fetchSemanticsNode("can't find node with tag $columnTag")
+        val viewHolder =
+            androidComposeView.androidViewsHandler.layoutNodeToHolder[
+                    colSemanticsNode.replacedChildren[1].layoutNode]
         checkNotNull(viewHolder) // Check that the View exists
         val firstButtonId = rule.onNodeWithText(firstButtonText).semanticsId
         val thirdButtonId = rule.onNodeWithText(thirdButtonText).semanticsId
@@ -2394,19 +2162,9 @@
         setContent {
             Box {
                 with(LocalDensity.current) {
-                    Column(
-                        Modifier
-                            .size(200.toDp())
-                            .verticalScroll(scrollState)
-                    ) {
-                        BasicText("Backward",
-                            Modifier
-                                .testTag(target2Tag)
-                                .size(150.toDp()))
-                        BasicText("Forward",
-                            Modifier
-                                .testTag(target1Tag)
-                                .size(150.toDp()))
+                    Column(Modifier.size(200.toDp()).verticalScroll(scrollState)) {
+                        BasicText("Backward", Modifier.testTag(target2Tag).size(150.toDp()))
+                        BasicText("Forward", Modifier.testTag(target1Tag).size(150.toDp()))
                     }
                 }
             }
@@ -2439,22 +2197,11 @@
         setContent {
             Box {
                 with(LocalDensity.current) {
-                    LazyColumn(
-                        modifier = Modifier.size(200.toDp()),
-                        state = lazyState
-                    ) {
+                    LazyColumn(modifier = Modifier.size(200.toDp()), state = lazyState) {
                         item {
-                            BasicText("Backward",
-                                Modifier
-                                    .testTag(target2Tag)
-                                    .size(150.toDp()))
+                            BasicText("Backward", Modifier.testTag(target2Tag).size(150.toDp()))
                         }
-                        item {
-                            BasicText("Forward",
-                                Modifier
-                                    .testTag(target1Tag)
-                                    .size(150.toDp()))
-                        }
+                        item { BasicText("Forward", Modifier.testTag(target1Tag).size(150.toDp())) }
                     }
                 }
             }
@@ -2488,29 +2235,19 @@
         setContent {
             Box {
                 with(LocalDensity.current) {
-                    LazyRow(
-                        modifier = Modifier.size(250.toDp()),
-                        state = parentLazyState
-                    ) {
+                    LazyRow(modifier = Modifier.size(250.toDp()), state = parentLazyState) {
                         item {
-                            LazyColumn(
-                                modifier = Modifier.size(200.toDp()),
-                                state = lazyState
-                            ) {
+                            LazyColumn(modifier = Modifier.size(200.toDp()), state = lazyState) {
                                 item {
                                     BasicText(
                                         "Backward",
-                                        Modifier
-                                            .testTag(target2Tag)
-                                            .size(150.toDp())
+                                        Modifier.testTag(target2Tag).size(150.toDp())
                                     )
                                 }
                                 item {
                                     BasicText(
                                         "Forward",
-                                        Modifier
-                                            .testTag(target1Tag)
-                                            .size(150.toDp())
+                                        Modifier.testTag(target1Tag).size(150.toDp())
                                     )
                                 }
                             }
@@ -2548,17 +2285,8 @@
     @Test
     fun testPerformAction_focus() {
         // Arrange.
-        setContent {
-            Box(
-                Modifier
-                    .testTag(tag)
-                    .focusable()) {
-                BasicText("focusable")
-            }
-        }
-        val virtualViewId = rule.onNodeWithTag(tag)
-            .assert(expectValue(Focused, false))
-            .semanticsId
+        setContent { Box(Modifier.testTag(tag).focusable()) { BasicText("focusable") } }
+        val virtualViewId = rule.onNodeWithTag(tag).assert(expectValue(Focused, false)).semanticsId
 
         // Act.
         rule.runOnUiThread {
@@ -2576,24 +2304,14 @@
         setContent {
             Row {
                 // Initially focused item.
-                Box(
-                    Modifier
-                        .size(10.dp)
-                        .focusable())
-                Box(
-                    Modifier
-                        .testTag(tag)
-                        .focusRequester(focusRequester)
-                        .focusable()
-                ) {
+                Box(Modifier.size(10.dp).focusable())
+                Box(Modifier.testTag(tag).focusRequester(focusRequester).focusable()) {
                     BasicText("focusable")
                 }
             }
         }
         rule.runOnIdle { focusRequester.requestFocus() }
-        val virtualViewId = rule.onNodeWithTag(tag)
-            .assert(expectValue(Focused, true))
-            .semanticsId
+        val virtualViewId = rule.onNodeWithTag(tag).assert(expectValue(Focused, true)).semanticsId
 
         // Act.
         rule.runOnUiThread {
@@ -2610,22 +2328,17 @@
         setContent {
             var checked by remember { mutableStateOf(true) }
             Box(
-                Modifier
-                    .toggleable(value = checked, onValueChange = { checked = it })
-                    .testTag(tag)
+                Modifier.toggleable(value = checked, onValueChange = { checked = it }).testTag(tag)
             ) {
                 BasicText("ToggleableText")
             }
         }
-        rule.onNodeWithTag(tag)
-            .assertIsDisplayed()
-            .assertIsOn()
+        rule.onNodeWithTag(tag).assertIsDisplayed().assertIsOn()
         val toggleableNodeId = rule.onNodeWithTag(tag).semanticsId
 
         // Act.
-        val actionPerformed = rule.runOnUiThread {
-            provider.performAction(toggleableNodeId, ACTION_CLICK, null)
-        }
+        val actionPerformed =
+            rule.runOnUiThread { provider.performAction(toggleableNodeId, ACTION_CLICK, null) }
 
         // Assert.
         rule.mainClock.advanceTimeBy(accessibilityEventLoopIntervalMs)
@@ -2639,27 +2352,20 @@
         setContent {
             var checked by remember { mutableStateOf(true) }
             Box(
-                Modifier
-                    .toggleable(
+                Modifier.toggleable(
                         value = checked,
                         enabled = false,
                         onValueChange = { checked = it }
                     )
                     .testTag(tag),
-                content = {
-                    BasicText("ToggleableText")
-                }
+                content = { BasicText("ToggleableText") }
             )
         }
-        val toggleableId = rule.onNodeWithTag(tag)
-            .assertIsDisplayed()
-            .assertIsOn()
-            .semanticsId
+        val toggleableId = rule.onNodeWithTag(tag).assertIsDisplayed().assertIsOn().semanticsId
 
         // Act.
-        val actionPerformed = rule.runOnUiThread {
-            provider.performAction(toggleableId, ACTION_CLICK, null)
-        }
+        val actionPerformed =
+            rule.runOnUiThread { provider.performAction(toggleableId, ACTION_CLICK, null) }
 
         // Assert.
         rule.onNodeWithTag(tag).assertIsOn()
@@ -2670,20 +2376,13 @@
     fun testTextField_performClickAction_succeedOnEnabledNode() {
         // Arrange.
         setContent {
-            BasicTextField(
-                modifier = Modifier.testTag(tag),
-                value = "value",
-                onValueChange = {}
-            )
+            BasicTextField(modifier = Modifier.testTag(tag), value = "value", onValueChange = {})
         }
-        val textFieldNodeId = rule.onNodeWithTag(tag)
-            .assertIsDisplayed()
-            .semanticsId
+        val textFieldNodeId = rule.onNodeWithTag(tag).assertIsDisplayed().semanticsId
 
         // Act.
-        val actionPerformed = rule.runOnUiThread {
-            provider.performAction(textFieldNodeId, ACTION_CLICK, null)
-        }
+        val actionPerformed =
+            rule.runOnUiThread { provider.performAction(textFieldNodeId, ACTION_CLICK, null) }
 
         // Assert.
         rule.onNodeWithTag(tag).assert(expectValue(Focused, true))
@@ -2697,31 +2396,30 @@
         setContent {
             var value by remember { mutableStateOf(TextFieldValue("hello")) }
             BasicTextField(
-                modifier = Modifier
-                    .semantics {
-                        // Make sure this block will be executed when selection changes.
-                        this.textSelectionRange = value.selection
-                        if (value.selection == TextRange(1)) {
-                            textFieldSelectionOne = true
+                modifier =
+                    Modifier.semantics {
+                            // Make sure this block will be executed when selection changes.
+                            this.textSelectionRange = value.selection
+                            if (value.selection == TextRange(1)) {
+                                textFieldSelectionOne = true
+                            }
                         }
-                    }
-                    .testTag(tag),
+                        .testTag(tag),
                 value = value,
                 onValueChange = { value = it }
             )
         }
-        val textFieldId = rule.onNodeWithTag(tag)
-            .assertIsDisplayed()
-            .semanticsId
+        val textFieldId = rule.onNodeWithTag(tag).assertIsDisplayed().semanticsId
         val argument = Bundle()
         argument.putInt(AccessibilityNodeInfoCompat.ACTION_ARGUMENT_SELECTION_START_INT, 1)
         argument.putInt(AccessibilityNodeInfoCompat.ACTION_ARGUMENT_SELECTION_END_INT, 1)
 
         // Act.
-        val actionPerformed = rule.runOnUiThread {
-            textFieldSelectionOne = false
-            provider.performAction(textFieldId, ACTION_SET_SELECTION, argument)
-        }
+        val actionPerformed =
+            rule.runOnUiThread {
+                textFieldSelectionOne = false
+                provider.performAction(textFieldId, ACTION_SET_SELECTION, argument)
+            }
         rule.waitUntil(5_000) { textFieldSelectionOne }
 
         // Assert.
@@ -2735,10 +2433,7 @@
         setContent {
             Row {
                 // Initially focused item.
-                Box(
-                    Modifier
-                        .size(10.dp)
-                        .focusable())
+                Box(Modifier.size(10.dp).focusable())
                 BasicTextField(
                     modifier = Modifier.testTag(tag),
                     value = "value",
@@ -2746,23 +2441,19 @@
                 )
             }
         }
-        val textFieldId = rule.onNodeWithTag(tag)
-            .assert(expectValue(Focused, false))
-            .semanticsId
+        val textFieldId = rule.onNodeWithTag(tag).assert(expectValue(Focused, false)).semanticsId
 
         // Act.
-        var actionPerformed = rule.runOnUiThread {
-            provider.performAction(textFieldId, ACTION_FOCUS, null)
-        }
+        var actionPerformed =
+            rule.runOnUiThread { provider.performAction(textFieldId, ACTION_FOCUS, null) }
 
         // Assert.
         rule.onNodeWithTag(tag).assert(expectValue(Focused, true))
         assertThat(actionPerformed).isTrue()
 
         // Act.
-        actionPerformed = rule.runOnUiThread {
-            provider.performAction(textFieldId, ACTION_CLEAR_FOCUS, null)
-        }
+        actionPerformed =
+            rule.runOnUiThread { provider.performAction(textFieldId, ACTION_CLEAR_FOCUS, null) }
 
         // Assert.
         rule.onNodeWithTag(tag).assert(expectValue(Focused, false))
@@ -2782,13 +2473,14 @@
                 onTextLayout = { textLayoutResult = it }
             )
         }
-        val textFieldNode = rule.onNodeWithTag(tag)
-            .fetchSemanticsNode("couldn't find node with tag $tag")
+        val textFieldNode =
+            rule.onNodeWithTag(tag).fetchSemanticsNode("couldn't find node with tag $tag")
         val info = AccessibilityNodeInfoCompat.obtain()
-        val argument = Bundle().apply {
-            putInt(EXTRA_DATA_TEXT_CHARACTER_LOCATION_ARG_START_INDEX, 0)
-            putInt(EXTRA_DATA_TEXT_CHARACTER_LOCATION_ARG_LENGTH, 1)
-        }
+        val argument =
+            Bundle().apply {
+                putInt(EXTRA_DATA_TEXT_CHARACTER_LOCATION_ARG_START_INDEX, 0)
+                putInt(EXTRA_DATA_TEXT_CHARACTER_LOCATION_ARG_LENGTH, 1)
+            }
 
         // TODO(b/272068594): This looks like a bug. This should be
         //  AccessibilityNodeInfoCompat.EXTRA_DATA_TEXT_CHARACTER_LOCATION_KEY
@@ -2801,29 +2493,21 @@
 
         // TODO(b/272068594): This looks like a bug. This should be
         //  AccessibilityNodeInfoCompat.EXTRA_DATA_TEXT_CHARACTER_LOCATION_KEY
-        val data = info.extras
-            .getParcelableArray(EXTRA_DATA_TEXT_CHARACTER_LOCATION_KEY)
+        val data = info.extras.getParcelableArray(EXTRA_DATA_TEXT_CHARACTER_LOCATION_KEY)
         assertThat(data!!.size).isEqualTo(1)
 
         val rectF = data[0] as RectF // result in screen coordinates
-        val expectedRectInLocalCoords = textLayoutResult.getBoundingBox(0).translate(
-            textFieldNode.positionInWindow
-        )
-        val expectedTopLeftInScreenCoords = androidComposeView.localToScreen(
-            expectedRectInLocalCoords.topLeft
-        )
+        val expectedRectInLocalCoords =
+            textLayoutResult.getBoundingBox(0).translate(textFieldNode.positionInWindow)
+        val expectedTopLeftInScreenCoords =
+            androidComposeView.localToScreen(expectedRectInLocalCoords.topLeft)
         assertThat(rectF.left).isEqualTo(expectedTopLeftInScreenCoords.x)
         assertThat(rectF.top).isEqualTo(expectedTopLeftInScreenCoords.y)
         assertThat(rectF.width()).isEqualTo(expectedRectInLocalCoords.width)
         assertThat(rectF.height()).isEqualTo(expectedRectInLocalCoords.height)
 
         val testTagKey = "androidx.compose.ui.semantics.testTag"
-        provider.addExtraDataToAccessibilityNodeInfo(
-            textFieldNode.id,
-            info,
-            testTagKey,
-            argument
-        )
+        provider.addExtraDataToAccessibilityNodeInfo(textFieldNode.id, info, testTagKey, argument)
         assertThat(info.extras.getCharSequence(testTagKey)).isEqualTo(tag)
     }
 
@@ -2849,34 +2533,27 @@
     @Test
     fun sendClickedEvent_whenClick() {
         // Arrange.
-        setContent {
-            Box(
-                Modifier
-                    .clickable(onClick = {})
-                    .testTag(tag)) {
-                BasicText("Text")
-            }
-        }
+        setContent { Box(Modifier.clickable(onClick = {}).testTag(tag)) { BasicText("Text") } }
         val virtualViewId = rule.onNodeWithTag(tag).semanticsId
 
         // Act.
-        val actionPerformed = rule.runOnUiThread {
-            provider.performAction(virtualViewId, ACTION_CLICK, null)
-        }
+        val actionPerformed =
+            rule.runOnUiThread { provider.performAction(virtualViewId, ACTION_CLICK, null) }
 
         // Assert.
         rule.mainClock.advanceTimeBy(accessibilityEventLoopIntervalMs)
         rule.runOnIdle {
             assertThat(actionPerformed).isTrue()
-            verify(container, times(1)).requestSendAccessibilityEvent(
-                eq(androidComposeView),
-                argThat(
-                    ArgumentMatcher {
-                        getAccessibilityEventSourceSemanticsNodeId(it) == virtualViewId &&
-                            it.eventType == TYPE_VIEW_CLICKED
-                    }
+            verify(container, times(1))
+                .requestSendAccessibilityEvent(
+                    eq(androidComposeView),
+                    argThat(
+                        ArgumentMatcher {
+                            getAccessibilityEventSourceSemanticsNodeId(it) == virtualViewId &&
+                                it.eventType == TYPE_VIEW_CLICKED
+                        }
+                    )
                 )
-            )
         }
     }
 
@@ -2885,17 +2562,9 @@
         // Arrange.
         var state by mutableStateOf("state one")
         setContent {
-            Box(
-                Modifier
-                    .semantics { stateDescription = state }
-                    .testTag(tag)
-            ) {
-                BasicText("Text")
-            }
+            Box(Modifier.semantics { stateDescription = state }.testTag(tag)) { BasicText("Text") }
         }
-        val virtualViewId = rule.onNodeWithTag(tag)
-            .assertValueEquals("state one")
-            .semanticsId
+        val virtualViewId = rule.onNodeWithTag(tag).assertValueEquals("state one").semanticsId
 
         // Act.
         rule.runOnIdle { state = "state two" }
@@ -2903,29 +2572,31 @@
         // Assert.
         rule.mainClock.advanceTimeBy(accessibilityEventLoopIntervalMs)
         rule.runOnIdle {
-            verify(container, times(1)).requestSendAccessibilityEvent(
-                eq(androidComposeView),
-                argThat(
-                    ArgumentMatcher {
-                        getAccessibilityEventSourceSemanticsNodeId(it) == virtualViewId &&
-                            it.eventType == TYPE_WINDOW_CONTENT_CHANGED &&
-                            it.contentChangeTypes == CONTENT_CHANGE_TYPE_STATE_DESCRIPTION
-                    }
+            verify(container, times(1))
+                .requestSendAccessibilityEvent(
+                    eq(androidComposeView),
+                    argThat(
+                        ArgumentMatcher {
+                            getAccessibilityEventSourceSemanticsNodeId(it) == virtualViewId &&
+                                it.eventType == TYPE_WINDOW_CONTENT_CHANGED &&
+                                it.contentChangeTypes == CONTENT_CHANGE_TYPE_STATE_DESCRIPTION
+                        }
+                    )
                 )
-            )
             // Temporary(b/192295060) fix, sending CONTENT_CHANGE_TYPE_UNDEFINED to
             // force ViewRootImpl to update its accessibility-focused virtual-node.
             // If we have an androidx fix, we can remove this event.
-            verify(container, times(1)).requestSendAccessibilityEvent(
-                eq(androidComposeView),
-                argThat(
-                    ArgumentMatcher {
-                        getAccessibilityEventSourceSemanticsNodeId(it) == virtualViewId &&
-                            it.eventType == TYPE_WINDOW_CONTENT_CHANGED &&
-                            it.contentChangeTypes == CONTENT_CHANGE_TYPE_UNDEFINED
-                    }
+            verify(container, times(1))
+                .requestSendAccessibilityEvent(
+                    eq(androidComposeView),
+                    argThat(
+                        ArgumentMatcher {
+                            getAccessibilityEventSourceSemanticsNodeId(it) == virtualViewId &&
+                                it.eventType == TYPE_WINDOW_CONTENT_CHANGED &&
+                                it.contentChangeTypes == CONTENT_CHANGE_TYPE_UNDEFINED
+                        }
+                    )
                 )
-            )
         }
     }
 
@@ -2935,20 +2606,12 @@
         setContent {
             var checked by remember { mutableStateOf(true) }
             Box(
-                Modifier
-                    .toggleable(
-                        value = checked,
-                        onValueChange = { checked = it }
-                    )
-                    .testTag(tag)
+                Modifier.toggleable(value = checked, onValueChange = { checked = it }).testTag(tag)
             ) {
                 BasicText("ToggleableText")
             }
         }
-        val virtualViewId = rule.onNodeWithTag(tag)
-            .assertIsDisplayed()
-            .assertIsOn()
-            .semanticsId
+        val virtualViewId = rule.onNodeWithTag(tag).assertIsDisplayed().assertIsOn().semanticsId
 
         // Act.
         rule.onNodeWithTag(tag).performClick()
@@ -2957,29 +2620,31 @@
         rule.mainClock.advanceTimeBy(accessibilityEventLoopIntervalMs)
         rule.onNodeWithTag(tag).assertIsOff()
         rule.runOnIdle {
-            verify(container, times(1)).requestSendAccessibilityEvent(
-                eq(androidComposeView),
-                argThat(
-                    ArgumentMatcher {
-                        getAccessibilityEventSourceSemanticsNodeId(it) == virtualViewId &&
-                            it.eventType == TYPE_WINDOW_CONTENT_CHANGED &&
-                            it.contentChangeTypes == CONTENT_CHANGE_TYPE_STATE_DESCRIPTION
-                    }
+            verify(container, times(1))
+                .requestSendAccessibilityEvent(
+                    eq(androidComposeView),
+                    argThat(
+                        ArgumentMatcher {
+                            getAccessibilityEventSourceSemanticsNodeId(it) == virtualViewId &&
+                                it.eventType == TYPE_WINDOW_CONTENT_CHANGED &&
+                                it.contentChangeTypes == CONTENT_CHANGE_TYPE_STATE_DESCRIPTION
+                        }
+                    )
                 )
-            )
             // Temporary(b/192295060) fix, sending CONTENT_CHANGE_TYPE_UNDEFINED to
             // force ViewRootImpl to update its accessibility-focused virtual-node.
             // If we have an androidx fix, we can remove this event.
-            verify(container, times(1)).requestSendAccessibilityEvent(
-                eq(androidComposeView),
-                argThat(
-                    ArgumentMatcher {
-                        getAccessibilityEventSourceSemanticsNodeId(it) == virtualViewId &&
-                            it.eventType == TYPE_WINDOW_CONTENT_CHANGED &&
-                            it.contentChangeTypes == CONTENT_CHANGE_TYPE_UNDEFINED
-                    }
+            verify(container, times(1))
+                .requestSendAccessibilityEvent(
+                    eq(androidComposeView),
+                    argThat(
+                        ArgumentMatcher {
+                            getAccessibilityEventSourceSemanticsNodeId(it) == virtualViewId &&
+                                it.eventType == TYPE_WINDOW_CONTENT_CHANGED &&
+                                it.contentChangeTypes == CONTENT_CHANGE_TYPE_UNDEFINED
+                        }
+                    )
                 )
-            )
         }
     }
 
@@ -2989,17 +2654,13 @@
         setContent {
             var selected by remember { mutableStateOf(false) }
             Box(
-                Modifier
-                    .selectable(selected = selected, onClick = { selected = true })
-                    .testTag(tag)
+                Modifier.selectable(selected = selected, onClick = { selected = true }).testTag(tag)
             ) {
                 BasicText("Text")
             }
         }
-        val virtualViewId = rule.onNodeWithTag(tag)
-            .assertIsDisplayed()
-            .assertIsNotSelected()
-            .semanticsId
+        val virtualViewId =
+            rule.onNodeWithTag(tag).assertIsDisplayed().assertIsNotSelected().semanticsId
 
         // Act.
         rule.onNodeWithTag(tag).performClick()
@@ -3008,29 +2669,31 @@
         rule.mainClock.advanceTimeBy(accessibilityEventLoopIntervalMs)
         rule.onNodeWithTag(tag).assertIsSelected()
         rule.runOnIdle {
-            verify(container, times(1)).requestSendAccessibilityEvent(
-                eq(androidComposeView),
-                argThat(
-                    ArgumentMatcher {
-                        getAccessibilityEventSourceSemanticsNodeId(it) == virtualViewId &&
-                            it.eventType == TYPE_WINDOW_CONTENT_CHANGED &&
-                            it.contentChangeTypes == CONTENT_CHANGE_TYPE_STATE_DESCRIPTION
-                    }
+            verify(container, times(1))
+                .requestSendAccessibilityEvent(
+                    eq(androidComposeView),
+                    argThat(
+                        ArgumentMatcher {
+                            getAccessibilityEventSourceSemanticsNodeId(it) == virtualViewId &&
+                                it.eventType == TYPE_WINDOW_CONTENT_CHANGED &&
+                                it.contentChangeTypes == CONTENT_CHANGE_TYPE_STATE_DESCRIPTION
+                        }
+                    )
                 )
-            )
             // Temporary(b/192295060) fix, sending CONTENT_CHANGE_TYPE_UNDEFINED to
             // force ViewRootImpl to update its accessibility-focused virtual-node.
             // If we have an androidx fix, we can remove this event.
-            verify(container, times(1)).requestSendAccessibilityEvent(
-                eq(androidComposeView),
-                argThat(
-                    ArgumentMatcher {
-                        getAccessibilityEventSourceSemanticsNodeId(it) == virtualViewId &&
-                            it.eventType == TYPE_WINDOW_CONTENT_CHANGED &&
-                            it.contentChangeTypes == CONTENT_CHANGE_TYPE_UNDEFINED
-                    }
+            verify(container, times(1))
+                .requestSendAccessibilityEvent(
+                    eq(androidComposeView),
+                    argThat(
+                        ArgumentMatcher {
+                            getAccessibilityEventSourceSemanticsNodeId(it) == virtualViewId &&
+                                it.eventType == TYPE_WINDOW_CONTENT_CHANGED &&
+                                it.contentChangeTypes == CONTENT_CHANGE_TYPE_UNDEFINED
+                        }
+                    )
                 )
-            )
         }
     }
 
@@ -3040,17 +2703,18 @@
         setContent {
             var selected by remember { mutableStateOf(false) }
             Box(
-                Modifier
-                    .selectable(selected = selected, onClick = { selected = true }, role = Role.Tab)
+                Modifier.selectable(
+                        selected = selected,
+                        onClick = { selected = true },
+                        role = Role.Tab
+                    )
                     .testTag(tag)
             ) {
                 BasicText("Text")
             }
         }
-        val virtualViewId = rule.onNodeWithTag(tag)
-            .assertIsDisplayed()
-            .assertIsNotSelected()
-            .semanticsId
+        val virtualViewId =
+            rule.onNodeWithTag(tag).assertIsDisplayed().assertIsNotSelected().semanticsId
 
         // Act.
         rule.onNodeWithTag(tag).performClick()
@@ -3059,17 +2723,18 @@
         rule.mainClock.advanceTimeBy(accessibilityEventLoopIntervalMs)
         rule.onNodeWithTag(tag).assertIsSelected()
         rule.runOnIdle {
-            verify(container, times(1)).requestSendAccessibilityEvent(
-                eq(androidComposeView),
-                argThat(
-                    ArgumentMatcher {
-                        getAccessibilityEventSourceSemanticsNodeId(it) == virtualViewId &&
-                            it.eventType == TYPE_VIEW_SELECTED &&
-                            it.text.size == 1 &&
-                            it.text[0].toString() == "Text"
-                    }
+            verify(container, times(1))
+                .requestSendAccessibilityEvent(
+                    eq(androidComposeView),
+                    argThat(
+                        ArgumentMatcher {
+                            getAccessibilityEventSourceSemanticsNodeId(it) == virtualViewId &&
+                                it.eventType == TYPE_VIEW_SELECTED &&
+                                it.text.size == 1 &&
+                                it.text[0].toString() == "Text"
+                        }
+                    )
                 )
-            )
         }
     }
 
@@ -3077,14 +2742,7 @@
     fun sendStateChangeEvent_whenRangeInfoChange() {
         // Arrange.
         var current by mutableStateOf(0.5f)
-        setContent {
-            Box(
-                Modifier
-                    .progressSemantics(current)
-                    .testTag(tag)) {
-                BasicText("Text")
-            }
-        }
+        setContent { Box(Modifier.progressSemantics(current).testTag(tag)) { BasicText("Text") } }
         val virtualViewId = rule.onNodeWithTag(tag).semanticsId
 
         // Act.
@@ -3093,29 +2751,31 @@
         // Assert.
         rule.mainClock.advanceTimeBy(accessibilityEventLoopIntervalMs)
         rule.runOnIdle {
-            verify(container, times(1)).requestSendAccessibilityEvent(
-                eq(androidComposeView),
-                argThat(
-                    ArgumentMatcher {
-                        getAccessibilityEventSourceSemanticsNodeId(it) == virtualViewId &&
-                            it.eventType == TYPE_WINDOW_CONTENT_CHANGED &&
-                            it.contentChangeTypes == CONTENT_CHANGE_TYPE_STATE_DESCRIPTION
-                    }
+            verify(container, times(1))
+                .requestSendAccessibilityEvent(
+                    eq(androidComposeView),
+                    argThat(
+                        ArgumentMatcher {
+                            getAccessibilityEventSourceSemanticsNodeId(it) == virtualViewId &&
+                                it.eventType == TYPE_WINDOW_CONTENT_CHANGED &&
+                                it.contentChangeTypes == CONTENT_CHANGE_TYPE_STATE_DESCRIPTION
+                        }
+                    )
                 )
-            )
             // Temporary(b/192295060) fix, sending CONTENT_CHANGE_TYPE_UNDEFINED to
             // force ViewRootImpl to update its accessibility-focused virtual-node.
             // If we have an androidx fix, we can remove this event.
-            verify(container, times(1)).requestSendAccessibilityEvent(
-                eq(androidComposeView),
-                argThat(
-                    ArgumentMatcher {
-                        getAccessibilityEventSourceSemanticsNodeId(it) == virtualViewId &&
-                            it.eventType == TYPE_WINDOW_CONTENT_CHANGED &&
-                            it.contentChangeTypes == CONTENT_CHANGE_TYPE_UNDEFINED
-                    }
+            verify(container, times(1))
+                .requestSendAccessibilityEvent(
+                    eq(androidComposeView),
+                    argThat(
+                        ArgumentMatcher {
+                            getAccessibilityEventSourceSemanticsNodeId(it) == virtualViewId &&
+                                it.eventType == TYPE_WINDOW_CONTENT_CHANGED &&
+                                it.contentChangeTypes == CONTENT_CHANGE_TYPE_UNDEFINED
+                        }
+                    )
                 )
-            )
         }
     }
 
@@ -3136,7 +2796,8 @@
                 }
             )
         }
-        rule.onNodeWithTag(tag)
+        rule
+            .onNodeWithTag(tag)
             .assertIsDisplayed()
             .assert(expectValue(EditableText, AnnotatedString("H")))
 
@@ -3149,13 +2810,14 @@
 
         // Assert.
         rule.mainClock.advanceTimeBy(accessibilityEventLoopIntervalMs)
-        val virtualId = rule.onNodeWithTag(tag)
-            .assert(expectValue(EditableText, AnnotatedString("HELLO")))
-            .semanticsId
+        val virtualId =
+            rule
+                .onNodeWithTag(tag)
+                .assert(expectValue(EditableText, AnnotatedString("HELLO")))
+                .semanticsId
         rule.runOnIdle {
-            verify(container, atLeastOnce()).requestSendAccessibilityEvent(
-                eq(androidComposeView), argument.capture()
-            )
+            verify(container, atLeastOnce())
+                .requestSendAccessibilityEvent(eq(androidComposeView), argument.capture())
             assertThat(argument.allValues)
                 .comparingElementsUsing(AccessibilityEventComparator)
                 .containsExactly(
@@ -3179,7 +2841,8 @@
                         itemCount = finalText.length
                         this.text.add(finalText.toUpperCase(locale))
                     }
-                ).inOrder()
+                )
+                .inOrder()
         }
     }
 
@@ -3203,16 +2866,17 @@
         val columnId = rule.onNodeWithTag(columnTag).semanticsId
 
         rule.runOnIdle {
-            verify(container, atLeastOnce()).requestSendAccessibilityEvent(
-                eq(androidComposeView),
-                argThat(
-                    ArgumentMatcher {
-                        getAccessibilityEventSourceSemanticsNodeId(it) == columnId &&
-                            it.eventType == TYPE_WINDOW_CONTENT_CHANGED &&
-                            it.contentChangeTypes == CONTENT_CHANGE_TYPE_SUBTREE
-                    }
+            verify(container, atLeastOnce())
+                .requestSendAccessibilityEvent(
+                    eq(androidComposeView),
+                    argThat(
+                        ArgumentMatcher {
+                            getAccessibilityEventSourceSemanticsNodeId(it) == columnId &&
+                                it.eventType == TYPE_WINDOW_CONTENT_CHANGED &&
+                                it.contentChangeTypes == CONTENT_CHANGE_TYPE_SUBTREE
+                        }
+                    )
                 )
-            )
         }
         clearInvocations(container)
 
@@ -3222,16 +2886,17 @@
         rule.mainClock.advanceTimeBy(accessibilityEventLoopIntervalMs)
         rule.onNodeWithTag(textFieldTag).assertDoesNotExist()
         rule.runOnIdle {
-            verify(container, atLeastOnce()).requestSendAccessibilityEvent(
-                eq(androidComposeView),
-                argThat(
-                    ArgumentMatcher {
-                        getAccessibilityEventSourceSemanticsNodeId(it) == columnId &&
-                            it.eventType == TYPE_WINDOW_CONTENT_CHANGED &&
-                            it.contentChangeTypes == CONTENT_CHANGE_TYPE_SUBTREE
-                    }
+            verify(container, atLeastOnce())
+                .requestSendAccessibilityEvent(
+                    eq(androidComposeView),
+                    argThat(
+                        ArgumentMatcher {
+                            getAccessibilityEventSourceSemanticsNodeId(it) == columnId &&
+                                it.eventType == TYPE_WINDOW_CONTENT_CHANGED &&
+                                it.contentChangeTypes == CONTENT_CHANGE_TYPE_SUBTREE
+                        }
+                    )
                 )
-            )
         }
     }
 
@@ -3270,9 +2935,8 @@
         // Assert.
         rule.mainClock.advanceTimeBy(accessibilityEventLoopIntervalMs)
         rule.runOnIdle {
-            verify(container, atLeastOnce()).requestSendAccessibilityEvent(
-                eq(androidComposeView), argument.capture()
-            )
+            verify(container, atLeastOnce())
+                .requestSendAccessibilityEvent(eq(androidComposeView), argument.capture())
             assertThat(argument.allValues)
                 .comparingElementsUsing(AccessibilityEventComparator)
                 .containsExactly(
@@ -3304,9 +2968,7 @@
     fun selectionEventBeforeTraverseEvent_whenTraverseText() {
         // Arrange.
         val text = "h"
-        setContent {
-            BasicText(text, Modifier.testTag(tag))
-        }
+        setContent { BasicText(text, Modifier.testTag(tag)) }
         val virtualViewId = rule.onNodeWithTag(tag).assertIsDisplayed().semanticsId
 
         // TODO(b/272068594): Extra TYPE_WINDOW_CONTENT_CHANGED sent 100ms after setup.
@@ -3325,9 +2987,8 @@
         // Assert.
         rule.mainClock.advanceTimeBy(accessibilityEventLoopIntervalMs)
         rule.runOnIdle {
-            verify(container, atLeastOnce()).requestSendAccessibilityEvent(
-                eq(androidComposeView), argument.capture()
-            )
+            verify(container, atLeastOnce())
+                .requestSendAccessibilityEvent(eq(androidComposeView), argument.capture())
             assertThat(argument.allValues)
                 .comparingElementsUsing(AccessibilityEventComparator)
                 .containsExactly(
@@ -3359,31 +3020,30 @@
         setContent {
             var checked by remember { mutableStateOf(true) }
             Box(
-                Modifier
-                    .toggleable(value = checked, onValueChange = { checked = it })
-                    .testTag(tag)
+                Modifier.toggleable(value = checked, onValueChange = { checked = it }).testTag(tag)
             ) {
                 BasicText("ToggleableText")
-                Box {
-                    BasicText("TextNode")
-                }
+                Box { BasicText("TextNode") }
             }
         }
         val toggleableId = rule.onNodeWithTag(tag).semanticsId
-        val textNode = rule.onNodeWithText("TextNode", useUnmergedTree = true)
-            .fetchSemanticsNode("couldn't find node with text TextNode")
+        val textNode =
+            rule
+                .onNodeWithText("TextNode", useUnmergedTree = true)
+                .fetchSemanticsNode("couldn't find node with text TextNode")
 
         rule.runOnIdle {
-            verify(container, atLeastOnce()).requestSendAccessibilityEvent(
-                eq(androidComposeView),
-                argThat(
-                    ArgumentMatcher {
-                        getAccessibilityEventSourceSemanticsNodeId(it) == toggleableId &&
-                            it.eventType == TYPE_WINDOW_CONTENT_CHANGED &&
-                            it.contentChangeTypes == CONTENT_CHANGE_TYPE_SUBTREE
-                    }
+            verify(container, atLeastOnce())
+                .requestSendAccessibilityEvent(
+                    eq(androidComposeView),
+                    argThat(
+                        ArgumentMatcher {
+                            getAccessibilityEventSourceSemanticsNodeId(it) == toggleableId &&
+                                it.eventType == TYPE_WINDOW_CONTENT_CHANGED &&
+                                it.contentChangeTypes == CONTENT_CHANGE_TYPE_SUBTREE
+                        }
+                    )
                 )
-            )
         }
 
         rule.runOnUiThread {
@@ -3395,16 +3055,17 @@
 
         rule.mainClock.advanceTimeBy(accessibilityEventLoopIntervalMs)
         rule.runOnIdle {
-            verify(container, atLeastOnce()).requestSendAccessibilityEvent(
-                eq(androidComposeView),
-                argThat(
-                    ArgumentMatcher {
-                        getAccessibilityEventSourceSemanticsNodeId(it) == toggleableId &&
-                            it.eventType == TYPE_WINDOW_CONTENT_CHANGED &&
-                            it.contentChangeTypes == CONTENT_CHANGE_TYPE_SUBTREE
-                    }
+            verify(container, atLeastOnce())
+                .requestSendAccessibilityEvent(
+                    eq(androidComposeView),
+                    argThat(
+                        ArgumentMatcher {
+                            getAccessibilityEventSourceSemanticsNodeId(it) == toggleableId &&
+                                it.eventType == TYPE_WINDOW_CONTENT_CHANGED &&
+                                it.contentChangeTypes == CONTENT_CHANGE_TYPE_SUBTREE
+                        }
+                    )
                 )
-            )
         }
     }
 
@@ -3414,33 +3075,32 @@
         setContent {
             var checked by remember { mutableStateOf(true) }
             Box(
-                Modifier
-                    .toggleable(value = checked, onValueChange = { checked = it })
-                    .testTag(tag)
+                Modifier.toggleable(value = checked, onValueChange = { checked = it }).testTag(tag)
             ) {
                 BasicText("ToggleableText")
-                Box {
-                    BasicText("TextNode")
-                }
+                Box { BasicText("TextNode") }
             }
         }
 
         val toggleableId = rule.onNodeWithTag(tag).semanticsId
-        val textNode = rule.onNodeWithText("TextNode", useUnmergedTree = true)
-            .fetchSemanticsNode("couldn't find node with text TextNode")
+        val textNode =
+            rule
+                .onNodeWithText("TextNode", useUnmergedTree = true)
+                .fetchSemanticsNode("couldn't find node with text TextNode")
 
         rule.mainClock.advanceTimeBy(accessibilityEventLoopIntervalMs)
         rule.runOnIdle {
-            verify(container, atLeastOnce()).requestSendAccessibilityEvent(
-                eq(androidComposeView),
-                argThat(
-                    ArgumentMatcher {
-                        getAccessibilityEventSourceSemanticsNodeId(it) == toggleableId &&
-                            it.eventType == TYPE_WINDOW_CONTENT_CHANGED &&
-                            it.contentChangeTypes == CONTENT_CHANGE_TYPE_SUBTREE
-                    }
+            verify(container, atLeastOnce())
+                .requestSendAccessibilityEvent(
+                    eq(androidComposeView),
+                    argThat(
+                        ArgumentMatcher {
+                            getAccessibilityEventSourceSemanticsNodeId(it) == toggleableId &&
+                                it.eventType == TYPE_WINDOW_CONTENT_CHANGED &&
+                                it.contentChangeTypes == CONTENT_CHANGE_TYPE_SUBTREE
+                        }
+                    )
                 )
-            )
         }
 
         rule.runOnUiThread {
@@ -3454,16 +3114,17 @@
         rule.mainClock.advanceTimeBy(accessibilityEventLoopIntervalMs)
         rule.runOnIdle {
             // One from initialization and one from layout changes.
-            verify(container, atLeastOnce()).requestSendAccessibilityEvent(
-                eq(androidComposeView),
-                argThat(
-                    ArgumentMatcher {
-                        getAccessibilityEventSourceSemanticsNodeId(it) == toggleableId &&
-                            it.eventType == TYPE_WINDOW_CONTENT_CHANGED &&
-                            it.contentChangeTypes == CONTENT_CHANGE_TYPE_SUBTREE
-                    }
+            verify(container, atLeastOnce())
+                .requestSendAccessibilityEvent(
+                    eq(androidComposeView),
+                    argThat(
+                        ArgumentMatcher {
+                            getAccessibilityEventSourceSemanticsNodeId(it) == toggleableId &&
+                                it.eventType == TYPE_WINDOW_CONTENT_CHANGED &&
+                                it.contentChangeTypes == CONTENT_CHANGE_TYPE_SUBTREE
+                        }
+                    )
                 )
-            )
         }
     }
 
@@ -3473,25 +3134,23 @@
         setContent {
             var checked by remember { mutableStateOf(true) }
             Box(
-                Modifier
-                    .toggleable(value = checked, onValueChange = { checked = it })
-                    .testTag(tag)
+                Modifier.toggleable(value = checked, onValueChange = { checked = it }).testTag(tag)
             ) {
                 BasicText("ToggleableText")
             }
         }
         val toggleableId = rule.onNodeWithTag(tag).semanticsId
-        val toggleableBounds = with(rule.density) {
-            rule.onNodeWithTag(tag).getBoundsInRoot().toRect()
-        }
+        val toggleableBounds =
+            with(rule.density) { rule.onNodeWithTag(tag).getBoundsInRoot().toRect() }
 
         // Act.
-        val toggleableNodeId = rule.runOnIdle {
-            delegate.hitTestSemanticsAt(
-                (toggleableBounds.left + toggleableBounds.right) / 2,
-                (toggleableBounds.top + toggleableBounds.bottom) / 2,
-            )
-        }
+        val toggleableNodeId =
+            rule.runOnIdle {
+                delegate.hitTestSemanticsAt(
+                    (toggleableBounds.left + toggleableBounds.right) / 2,
+                    (toggleableBounds.top + toggleableBounds.bottom) / 2,
+                )
+            }
 
         // Assert.
         assertThat(toggleableId).isEqualTo(toggleableNodeId)
@@ -3507,33 +3166,25 @@
                 with(LocalDensity.current) {
                     BasicText(
                         "Child One",
-                        Modifier
-                            .zIndex(1f)
-                            .testTag(childOneTag)
-                            .requiredSize(50.toDp())
+                        Modifier.zIndex(1f).testTag(childOneTag).requiredSize(50.toDp())
                     )
-                    BasicText(
-                        "Child Two",
-                        Modifier
-                            .testTag(childTwoTag)
-                            .requiredSize(50.toDp())
-                    )
+                    BasicText("Child Two", Modifier.testTag(childTwoTag).requiredSize(50.toDp()))
                 }
             }
         }
         val childOneId = rule.onNodeWithTag(childOneTag).semanticsId
         val childTwoId = rule.onNodeWithTag(childTwoTag).semanticsId
-        val overlappedChildNodeBounds = with(rule.density) {
-            rule.onNodeWithTag(childTwoTag).getBoundsInRoot().toRect()
-        }
+        val overlappedChildNodeBounds =
+            with(rule.density) { rule.onNodeWithTag(childTwoTag).getBoundsInRoot().toRect() }
 
         // Act.
-        val overlappedChildNodeId = rule.runOnIdle {
-            delegate.hitTestSemanticsAt(
-                (overlappedChildNodeBounds.left + overlappedChildNodeBounds.right) / 2,
-                (overlappedChildNodeBounds.top + overlappedChildNodeBounds.bottom) / 2
-            )
-        }
+        val overlappedChildNodeId =
+            rule.runOnIdle {
+                delegate.hitTestSemanticsAt(
+                    (overlappedChildNodeBounds.left + overlappedChildNodeBounds.right) / 2,
+                    (overlappedChildNodeBounds.top + overlappedChildNodeBounds.bottom) / 2
+                )
+            }
 
         // Assert.
         assertThat(childOneId).isEqualTo(overlappedChildNodeId)
@@ -3550,16 +3201,9 @@
 
             Box {
                 with(LocalDensity.current) {
-                    Column(
-                        Modifier
-                            .size(200.toDp())
-                            .verticalScroll(scrollState)
-                    ) {
+                    Column(Modifier.size(200.toDp()).verticalScroll(scrollState)) {
                         BasicText("Before scroll", Modifier.size(200.toDp()))
-                        BasicText("After scroll",
-                            Modifier
-                                .testTag(tag)
-                                .size(200.toDp()))
+                        BasicText("After scroll", Modifier.testTag(tag).size(200.toDp()))
                     }
                 }
             }
@@ -3575,13 +3219,13 @@
         assertThat(scrollState.value).isGreaterThan(199)
 
         val vitrualViewId = rule.onNodeWithTag(tag).semanticsId
-        val childNodeBounds = with(rule.density) {
-            rule.onNodeWithTag(tag).getBoundsInRoot().toRect()
-        }
-        val hitTestedId = delegate.hitTestSemanticsAt(
-            (childNodeBounds.left + childNodeBounds.right) / 2,
-            (childNodeBounds.top + childNodeBounds.bottom) / 2
-        )
+        val childNodeBounds =
+            with(rule.density) { rule.onNodeWithTag(tag).getBoundsInRoot().toRect() }
+        val hitTestedId =
+            delegate.hitTestSemanticsAt(
+                (childNodeBounds.left + childNodeBounds.right) / 2,
+                (childNodeBounds.top + childNodeBounds.bottom) / 2
+            )
         assertThat(vitrualViewId).isEqualTo(hitTestedId)
     }
 
@@ -3590,24 +3234,20 @@
     fun testSemanticsHitTest_invisibleToUserSemantics() {
         // Arrange.
         setContent {
-            Box(
-                Modifier
-                    .size(100.dp)
-                    .clickable {}
-                    .testTag(tag)
-                    .semantics { invisibleToUser() }) {
+            Box(Modifier.size(100.dp).clickable {}.testTag(tag).semantics { invisibleToUser() }) {
                 BasicText("")
             }
         }
         val bounds = with(rule.density) { rule.onNodeWithTag(tag).getBoundsInRoot().toRect() }
 
         // Act.
-        val hitNodeId = rule.runOnIdle {
-            delegate.hitTestSemanticsAt(
-                bounds.left + bounds.width / 2,
-                bounds.top + bounds.height / 2
-            )
-        }
+        val hitNodeId =
+            rule.runOnIdle {
+                delegate.hitTestSemanticsAt(
+                    bounds.left + bounds.width / 2,
+                    bounds.top + bounds.height / 2
+                )
+            }
 
         // Assert.
         rule.runOnIdle { assertThat(hitNodeId).isEqualTo(InvalidId) }
@@ -3617,52 +3257,49 @@
     @SdkSuppress(minSdkVersion = Build.VERSION_CODES.R)
     fun viewInteropIsInvisibleToUser() {
         setContent {
-            AndroidView({ TextView(it).apply { text = "Test"; isScreenReaderFocusable = true } })
+            AndroidView({
+                TextView(it).apply {
+                    text = "Test"
+                    isScreenReaderFocusable = true
+                }
+            })
         }
-        Espresso
-            .onView(instanceOf(TextView::class.java))
-            .check(matches(isDisplayed()))
-            .check { view, exception ->
-                val viewParent = view.parent
-                if (viewParent !is View) {
-                    throw exception
-                }
-                val delegate = ViewCompat.getAccessibilityDelegate(viewParent) ?: throw exception
-                val info = AccessibilityNodeInfoCompat.wrap(
-                    android.view.accessibility.AccessibilityNodeInfo()
-                )
-                delegate.onInitializeAccessibilityNodeInfo(view, info)
-                // This is expected to be false, unlike
-                // AndroidViewTest.androidViewAccessibilityDelegate, because this test suite sets
-                // `accessibilityForceEnabledForTesting` to true.
-                if (info.isVisibleToUser) {
-                    throw exception
-                }
+        Espresso.onView(instanceOf(TextView::class.java)).check(matches(isDisplayed())).check {
+            view,
+            exception ->
+            val viewParent = view.parent
+            if (viewParent !is View) {
+                throw exception
             }
+            val delegate = ViewCompat.getAccessibilityDelegate(viewParent) ?: throw exception
+            val info =
+                AccessibilityNodeInfoCompat.wrap(android.view.accessibility.AccessibilityNodeInfo())
+            delegate.onInitializeAccessibilityNodeInfo(view, info)
+            // This is expected to be false, unlike
+            // AndroidViewTest.androidViewAccessibilityDelegate, because this test suite sets
+            // `accessibilityForceEnabledForTesting` to true.
+            if (info.isVisibleToUser) {
+                throw exception
+            }
+        }
     }
 
     @Test
     fun testSemanticsHitTest_transparentNode() {
         // Arrange.
         setContent {
-            Box(
-                Modifier
-                    .alpha(0f)
-                    .size(100.dp)
-                    .clickable {}
-                    .testTag(tag)) {
-                BasicText("")
-            }
+            Box(Modifier.alpha(0f).size(100.dp).clickable {}.testTag(tag)) { BasicText("") }
         }
         val bounds = with(rule.density) { rule.onNodeWithTag(tag).getBoundsInRoot().toRect() }
 
         // Act.
-        val hitNodeId = rule.runOnIdle {
-            delegate.hitTestSemanticsAt(
-                bounds.left + bounds.width / 2,
-                bounds.top + bounds.height / 2
-            )
-        }
+        val hitNodeId =
+            rule.runOnIdle {
+                delegate.hitTestSemanticsAt(
+                    bounds.left + bounds.width / 2,
+                    bounds.top + bounds.height / 2
+                )
+            }
 
         // Assert.
         rule.runOnIdle { assertThat(hitNodeId).isEqualTo(InvalidId) }
@@ -3674,33 +3311,22 @@
         val outertag = "outerbox"
         val innertag = "innerbox"
         setContent {
-            Box(
-                Modifier
-                    .size(100.dp)
-                    .clickable {}
-                    .testTag(outertag)
-                    .clearAndSetSemantics {}) {
-                Box(
-                    Modifier
-                        .size(100.dp)
-                        .clickable {}
-                        .testTag(innertag)) {
-                    BasicText("")
-                }
+            Box(Modifier.size(100.dp).clickable {}.testTag(outertag).clearAndSetSemantics {}) {
+                Box(Modifier.size(100.dp).clickable {}.testTag(innertag)) { BasicText("") }
             }
         }
         val outerNodeId = rule.onNodeWithTag(outertag).semanticsId
-        val bounds = with(rule.density) {
-            rule.onNodeWithTag(innertag, true).getBoundsInRoot().toRect()
-        }
+        val bounds =
+            with(rule.density) { rule.onNodeWithTag(innertag, true).getBoundsInRoot().toRect() }
 
         // Act.
-        val hitNodeId = rule.runOnIdle {
-            delegate.hitTestSemanticsAt(
-                bounds.left + bounds.width / 2,
-                bounds.top + bounds.height / 2
-            )
-        }
+        val hitNodeId =
+            rule.runOnIdle {
+                delegate.hitTestSemanticsAt(
+                    bounds.left + bounds.width / 2,
+                    bounds.top + bounds.height / 2
+                )
+            }
 
         // Assert.
         rule.runOnIdle { assertThat(outerNodeId).isEqualTo(hitNodeId) }
@@ -3729,18 +3355,18 @@
         val rootView = getViewRootImplMethod.invoke(container)
 
         val forName = Class::class.java.getMethod("forName", String::class.java)
-        val getDeclaredMethod = Class::class.java.getMethod(
-            "getDeclaredMethod",
-            String::class.java,
-            arrayOf<Class<*>>()::class.java
-        )
+        val getDeclaredMethod =
+            Class::class
+                .java
+                .getMethod("getDeclaredMethod", String::class.java, arrayOf<Class<*>>()::class.java)
 
         val viewRootImplClass = forName.invoke(null, "android.view.ViewRootImpl") as Class<*>
-        val getAccessibilityInteractionControllerMethod = getDeclaredMethod.invoke(
-            viewRootImplClass,
-            "getAccessibilityInteractionController",
-            arrayOf<Class<*>>()
-        ) as Method
+        val getAccessibilityInteractionControllerMethod =
+            getDeclaredMethod.invoke(
+                viewRootImplClass,
+                "getAccessibilityInteractionController",
+                arrayOf<Class<*>>()
+            ) as Method
         getAccessibilityInteractionControllerMethod.isAccessible = true
         val accessibilityInteractionController =
             getAccessibilityInteractionControllerMethod.invoke(rootView)
@@ -3755,20 +3381,22 @@
             ) as Method
         findViewByAccessibilityIdMethod.isAccessible = true
 
-        val androidView = rule.onNodeWithTag(tag)
-            .fetchSemanticsNode("can't find node with tag $tag")
-        val viewGroup = androidComposeView.androidViewsHandler
-            .layoutNodeToHolder[androidView.layoutNode]!!.view as ViewGroup
-        val getAccessibilityViewIdMethod = View::class.java
-            .getDeclaredMethod("getAccessibilityViewId")
+        val androidView =
+            rule.onNodeWithTag(tag).fetchSemanticsNode("can't find node with tag $tag")
+        val viewGroup =
+            androidComposeView.androidViewsHandler.layoutNodeToHolder[androidView.layoutNode]!!.view
+                as ViewGroup
+        val getAccessibilityViewIdMethod =
+            View::class.java.getDeclaredMethod("getAccessibilityViewId")
         getAccessibilityViewIdMethod.isAccessible = true
 
         val textTwo = viewGroup.getChildAt(1)
         val textViewTwoId = getAccessibilityViewIdMethod.invoke(textTwo)
-        val foundView = findViewByAccessibilityIdMethod.invoke(
-            accessibilityInteractionController,
-            textViewTwoId
-        )
+        val foundView =
+            findViewByAccessibilityIdMethod.invoke(
+                accessibilityInteractionController,
+                textViewTwoId
+            )
         assertThat(foundView).isNotNull()
         assertThat(textTwo).isEqualTo(foundView)
     }
@@ -3786,15 +3414,16 @@
                 BasicText("text")
             }
         }
-        val colSemanticsNode = rule.onNodeWithTag(tag)
-            .fetchSemanticsNode("can't find node with tag $tag")
+        val colSemanticsNode =
+            rule.onNodeWithTag(tag).fetchSemanticsNode("can't find node with tag $tag")
         val colAccessibilityNode = createAccessibilityNodeInfo(colSemanticsNode.id)
 
         // Act.
-        val buttonHolder = rule.runOnIdle {
-            androidComposeView.androidViewsHandler
-                .layoutNodeToHolder[colSemanticsNode.replacedChildren[0].layoutNode]
-        }
+        val buttonHolder =
+            rule.runOnIdle {
+                androidComposeView.androidViewsHandler.layoutNodeToHolder[
+                        colSemanticsNode.replacedChildren[0].layoutNode]
+            }
         checkNotNull(buttonHolder)
 
         // Assert.
@@ -3803,8 +3432,7 @@
             assertThat(colSemanticsNode.replacedChildren.size).isEqualTo(2)
             assertThat(buttonHolder.importantForAccessibility)
                 .isEqualTo(View.IMPORTANT_FOR_ACCESSIBILITY_YES)
-            assertThat((buttonHolder.getChildAt(0) as Button).text)
-                .isEqualTo(buttonText)
+            assertThat((buttonHolder.getChildAt(0) as Button).text).isEqualTo(buttonText)
         }
     }
 
@@ -3823,44 +3451,48 @@
             }
         }
 
-        val colSemanticsNode = rule.onNodeWithTag(colTag)
-            .fetchSemanticsNode("can't find node with tag $colTag")
+        val colSemanticsNode =
+            rule.onNodeWithTag(colTag).fetchSemanticsNode("can't find node with tag $colTag")
         rule.runOnUiThread {
             val bounds = colSemanticsNode.replacedChildren[0].boundsInRoot
-            val hoverEnter = createHoverMotionEvent(
-                action = ACTION_HOVER_ENTER,
-                x = (bounds.left + bounds.right) / 2f,
-                y = (bounds.top + bounds.bottom) / 2f
-            )
+            val hoverEnter =
+                createHoverMotionEvent(
+                    action = ACTION_HOVER_ENTER,
+                    x = (bounds.left + bounds.right) / 2f,
+                    y = (bounds.top + bounds.bottom) / 2f
+                )
             assertThat(androidComposeView.dispatchHoverEvent(hoverEnter)).isTrue()
             assertThat(delegate.hoveredVirtualViewId).isEqualTo(InvalidId)
         }
         rule.mainClock.advanceTimeBy(accessibilityEventLoopIntervalMs)
         rule.runOnIdle {
-            verify(container, times(1)).requestSendAccessibilityEvent(
-                eq(androidComposeView),
-                argThat(ArgumentMatcher { it.eventType == TYPE_VIEW_HOVER_ENTER })
-            )
+            verify(container, times(1))
+                .requestSendAccessibilityEvent(
+                    eq(androidComposeView),
+                    argThat(ArgumentMatcher { it.eventType == TYPE_VIEW_HOVER_ENTER })
+                )
         }
 
         val virtualViewId = rule.onNodeWithTag(textTag).semanticsId
         val bounds = with(rule.density) { rule.onNodeWithTag(textTag).getBoundsInRoot().toRect() }
         rule.runOnUiThread {
-            val hoverEnter = createHoverMotionEvent(
-                action = ACTION_HOVER_MOVE,
-                x = (bounds.left + bounds.right) / 2,
-                y = (bounds.top + bounds.bottom) / 2
-            )
+            val hoverEnter =
+                createHoverMotionEvent(
+                    action = ACTION_HOVER_MOVE,
+                    x = (bounds.left + bounds.right) / 2,
+                    y = (bounds.top + bounds.bottom) / 2
+                )
             assertThat(androidComposeView.dispatchHoverEvent(hoverEnter)).isTrue()
             assertThat(delegate.hoveredVirtualViewId).isEqualTo(virtualViewId)
         }
         // verify hover exit accessibility event is sent from the previously hovered view
         rule.mainClock.advanceTimeBy(accessibilityEventLoopIntervalMs)
         rule.runOnIdle {
-            verify(container, times(1)).requestSendAccessibilityEvent(
-                eq(androidComposeView),
-                argThat(ArgumentMatcher { it.eventType == TYPE_VIEW_HOVER_EXIT })
-            )
+            verify(container, times(1))
+                .requestSendAccessibilityEvent(
+                    eq(androidComposeView),
+                    argThat(ArgumentMatcher { it.eventType == TYPE_VIEW_HOVER_EXIT })
+                )
         }
     }
 
@@ -3872,17 +3504,15 @@
         val events = mutableListOf<PointerEvent>()
         setContent {
             Column(
-                Modifier
-                    .testTag(colTag)
-                    .pointerInput(Unit) {
-                        awaitPointerEventScope {
-                            while (true) {
-                                val event = awaitPointerEvent()
-                                event.changes[0].consume()
-                                events += event
-                            }
+                Modifier.testTag(colTag).pointerInput(Unit) {
+                    awaitPointerEventScope {
+                        while (true) {
+                            val event = awaitPointerEvent()
+                            event.changes[0].consume()
+                            events += event
                         }
                     }
+                }
             ) {
                 AndroidView(::Button) {
                     it.text = buttonText
@@ -3892,15 +3522,16 @@
             }
         }
 
-        val colSemanticsNode = rule.onNodeWithTag(colTag)
-            .fetchSemanticsNode("can't find node with tag $colTag")
+        val colSemanticsNode =
+            rule.onNodeWithTag(colTag).fetchSemanticsNode("can't find node with tag $colTag")
         rule.runOnUiThread {
             val bounds = colSemanticsNode.replacedChildren[0].boundsInRoot
-            val hoverEnter = createHoverMotionEvent(
-                action = ACTION_HOVER_ENTER,
-                x = (bounds.left + bounds.right) / 2f,
-                y = (bounds.top + bounds.bottom) / 2f
-            )
+            val hoverEnter =
+                createHoverMotionEvent(
+                    action = ACTION_HOVER_ENTER,
+                    x = (bounds.left + bounds.right) / 2f,
+                    y = (bounds.top + bounds.bottom) / 2f
+                )
             assertThat(androidComposeView.dispatchHoverEvent(hoverEnter)).isTrue()
             assertThat(delegate.hoveredVirtualViewId).isEqualTo(InvalidId)
             // Assert that the hover event has also been dispatched
@@ -3911,10 +3542,11 @@
 
         rule.mainClock.advanceTimeBy(accessibilityEventLoopIntervalMs)
         rule.runOnIdle {
-            verify(container, times(1)).requestSendAccessibilityEvent(
-                eq(androidComposeView),
-                argThat(ArgumentMatcher { it.eventType == TYPE_VIEW_HOVER_ENTER })
-            )
+            verify(container, times(1))
+                .requestSendAccessibilityEvent(
+                    eq(androidComposeView),
+                    argThat(ArgumentMatcher { it.eventType == TYPE_VIEW_HOVER_ENTER })
+                )
         }
     }
 
@@ -3927,22 +3559,23 @@
         val change = event.changes[0]
         assertThat(change.pressed).isFalse()
         assertThat(change.previousPressed).isFalse()
-        val expectedHoverType = when {
-            isEnter -> PointerEventType.Enter
-            isExit -> PointerEventType.Exit
-            else -> PointerEventType.Move
-        }
+        val expectedHoverType =
+            when {
+                isEnter -> PointerEventType.Enter
+                isExit -> PointerEventType.Exit
+                else -> PointerEventType.Move
+            }
         assertThat(event.type).isEqualTo(expectedHoverType)
     }
 
     private fun createHoverMotionEvent(action: Int, x: Float, y: Float): MotionEvent {
-        val pointerProperties = MotionEvent.PointerProperties().apply {
-            toolType = MotionEvent.TOOL_TYPE_FINGER
-        }
-        val pointerCoords = MotionEvent.PointerCoords().also {
-            it.x = x
-            it.y = y
-        }
+        val pointerProperties =
+            MotionEvent.PointerProperties().apply { toolType = MotionEvent.TOOL_TYPE_FINGER }
+        val pointerCoords =
+            MotionEvent.PointerCoords().also {
+                it.x = x
+                it.y = y
+            }
         return MotionEvent.obtain(
             0L /* downTime */,
             0L /* eventTime */,
@@ -3972,17 +3605,9 @@
                 with(LocalDensity.current) {
                     BasicText(
                         "Child One",
-                        Modifier
-                            .zIndex(1f)
-                            .testTag(childOneTag)
-                            .requiredSize(50.toDp())
+                        Modifier.zIndex(1f).testTag(childOneTag).requiredSize(50.toDp())
                     )
-                    BasicText(
-                        "Child Two",
-                        Modifier
-                            .testTag(childTwoTag)
-                            .requiredSize(50.toDp())
-                    )
+                    BasicText("Child Two", Modifier.testTag(childTwoTag).requiredSize(50.toDp()))
                 }
             }
         }
@@ -4008,16 +3633,8 @@
             CompositionLocalProvider(LocalDensity provides density) {
                 Box(Modifier.testTag(parentTag)) {
                     with(LocalDensity.current) {
-                        BasicText(
-                            "Child One",
-                            Modifier
-                                .zIndex(1f)
-                                .requiredSize(100.toDp())
-                        )
-                        BasicText(
-                            "Child Two",
-                            Modifier.requiredSize(200.toDp(), 100.toDp())
-                        )
+                        BasicText("Child One", Modifier.zIndex(1f).requiredSize(100.toDp()))
+                        BasicText("Child Two", Modifier.requiredSize(200.toDp(), 100.toDp()))
                     }
                 }
             }
@@ -4048,18 +3665,8 @@
         setContent {
             Box(Modifier.testTag(parentTag)) {
                 with(LocalDensity.current) {
-                    Box(
-                        Modifier
-                            .zIndex(1f)
-                            .testTag(childOneTag)
-                            .requiredSize(50.toDp())
-                    )
-                    BasicText(
-                        "Child Two",
-                        Modifier
-                            .testTag(childTwoTag)
-                            .requiredSize(50.toDp())
-                    )
+                    Box(Modifier.zIndex(1f).testTag(childOneTag).requiredSize(50.toDp()))
+                    BasicText("Child Two", Modifier.testTag(childTwoTag).requiredSize(50.toDp()))
                 }
             }
         }
@@ -4080,11 +3687,7 @@
 
         setContent {
             if (isPaneVisible) {
-                Box(
-                    Modifier
-                        .testTag(tag)
-                        .semantics { paneTitle = paneTestTitle }
-                ) {}
+                Box(Modifier.testTag(tag).semantics { paneTitle = paneTestTitle }) {}
             }
         }
 
@@ -4093,21 +3696,24 @@
         isPaneVisible = true
         rule.mainClock.advanceTimeBy(accessibilityEventLoopIntervalMs)
 
-        val paneId = rule.onNodeWithTag(tag)
-            .assert(expectValue(SemanticsProperties.PaneTitle, "pane title"))
-            .assertIsDisplayed()
-            .semanticsId
+        val paneId =
+            rule
+                .onNodeWithTag(tag)
+                .assert(expectValue(SemanticsProperties.PaneTitle, "pane title"))
+                .assertIsDisplayed()
+                .semanticsId
         rule.runOnIdle {
-            verify(container, times(1)).requestSendAccessibilityEvent(
-                eq(androidComposeView),
-                argThat(
-                    ArgumentMatcher {
-                        getAccessibilityEventSourceSemanticsNodeId(it) == paneId &&
-                            it.eventType == TYPE_WINDOW_STATE_CHANGED &&
-                            it.contentChangeTypes == CONTENT_CHANGE_TYPE_PANE_APPEARED
-                    }
+            verify(container, times(1))
+                .requestSendAccessibilityEvent(
+                    eq(androidComposeView),
+                    argThat(
+                        ArgumentMatcher {
+                            getAccessibilityEventSourceSemanticsNodeId(it) == paneId &&
+                                it.eventType == TYPE_WINDOW_STATE_CHANGED &&
+                                it.contentChangeTypes == CONTENT_CHANGE_TYPE_PANE_APPEARED
+                        }
+                    )
                 )
-            )
         }
     }
 
@@ -4117,11 +3723,7 @@
         var paneTestTitle by mutableStateOf("pane title")
         setContent {
             if (isPaneVisible) {
-                Box(
-                    Modifier
-                        .testTag(tag)
-                        .semantics { paneTitle = paneTestTitle }
-                ) {}
+                Box(Modifier.testTag(tag).semantics { paneTitle = paneTestTitle }) {}
             }
         }
 
@@ -4130,27 +3732,31 @@
         isPaneVisible = true
         rule.mainClock.advanceTimeBy(accessibilityEventLoopIntervalMs)
 
-        rule.onNodeWithTag(tag)
+        rule
+            .onNodeWithTag(tag)
             .assert(expectValue(SemanticsProperties.PaneTitle, "pane title"))
             .assertIsDisplayed()
 
         paneTestTitle = "new pane title"
         rule.mainClock.advanceTimeBy(accessibilityEventLoopIntervalMs)
 
-        val paneId = rule.onNodeWithTag(tag)
-            .assert(expectValue(SemanticsProperties.PaneTitle, "new pane title"))
-            .semanticsId
+        val paneId =
+            rule
+                .onNodeWithTag(tag)
+                .assert(expectValue(SemanticsProperties.PaneTitle, "new pane title"))
+                .semanticsId
         rule.runOnIdle {
-            verify(container, times(1)).requestSendAccessibilityEvent(
-                eq(androidComposeView),
-                argThat(
-                    ArgumentMatcher {
-                        getAccessibilityEventSourceSemanticsNodeId(it) == paneId &&
-                            it.eventType == TYPE_WINDOW_STATE_CHANGED &&
-                            it.contentChangeTypes == CONTENT_CHANGE_TYPE_PANE_TITLE
-                    }
+            verify(container, times(1))
+                .requestSendAccessibilityEvent(
+                    eq(androidComposeView),
+                    argThat(
+                        ArgumentMatcher {
+                            getAccessibilityEventSourceSemanticsNodeId(it) == paneId &&
+                                it.eventType == TYPE_WINDOW_STATE_CHANGED &&
+                                it.contentChangeTypes == CONTENT_CHANGE_TYPE_PANE_TITLE
+                        }
+                    )
                 )
-            )
         }
     }
 
@@ -4160,11 +3766,7 @@
         val paneTestTitle by mutableStateOf("pane title")
         setContent {
             if (isPaneVisible) {
-                Box(
-                    Modifier
-                        .testTag(tag)
-                        .semantics { paneTitle = paneTestTitle }
-                ) {}
+                Box(Modifier.testTag(tag).semantics { paneTitle = paneTestTitle }) {}
             }
         }
 
@@ -4173,7 +3775,8 @@
         isPaneVisible = true
         rule.mainClock.advanceTimeBy(accessibilityEventLoopIntervalMs)
 
-        rule.onNodeWithTag(tag)
+        rule
+            .onNodeWithTag(tag)
             .assert(expectValue(SemanticsProperties.PaneTitle, "pane title"))
             .assertIsDisplayed()
 
@@ -4182,15 +3785,16 @@
 
         rule.onNodeWithTag(tag).assertDoesNotExist()
         rule.runOnIdle {
-            verify(container, times(1)).requestSendAccessibilityEvent(
-                eq(androidComposeView),
-                argThat(
-                    ArgumentMatcher {
-                        it.eventType == TYPE_WINDOW_STATE_CHANGED &&
-                            it.contentChangeTypes == CONTENT_CHANGE_TYPE_PANE_DISAPPEARED
-                    }
+            verify(container, times(1))
+                .requestSendAccessibilityEvent(
+                    eq(androidComposeView),
+                    argThat(
+                        ArgumentMatcher {
+                            it.eventType == TYPE_WINDOW_STATE_CHANGED &&
+                                it.contentChangeTypes == CONTENT_CHANGE_TYPE_PANE_DISAPPEARED
+                        }
+                    )
                 )
-            )
         }
     }
 
@@ -4207,16 +3811,14 @@
                 Column {
                     with(LocalDensity.current) {
                         Box(
-                            Modifier
-                                .size(100.toDp())
-                                .testTag(firstPaneTag)
-                                .semantics { paneTitle = firstPaneTestTitle }
+                            Modifier.size(100.toDp()).testTag(firstPaneTag).semantics {
+                                paneTitle = firstPaneTestTitle
+                            }
                         ) {}
                         Box(
-                            Modifier
-                                .size(100.toDp())
-                                .testTag(secondPaneTag)
-                                .semantics { paneTitle = secondPaneTestTitle }
+                            Modifier.size(100.toDp()).testTag(secondPaneTag).semantics {
+                                paneTitle = secondPaneTestTitle
+                            }
                         ) {}
                     }
                 }
@@ -4229,10 +3831,12 @@
         isPaneVisible = true
         rule.mainClock.advanceTimeBy(accessibilityEventLoopIntervalMs)
 
-        rule.onNodeWithTag(firstPaneTag)
+        rule
+            .onNodeWithTag(firstPaneTag)
             .assert(expectValue(SemanticsProperties.PaneTitle, "first pane title"))
             .assertIsDisplayed()
-        rule.onNodeWithTag(secondPaneTag)
+        rule
+            .onNodeWithTag(secondPaneTag)
             .assert(expectValue(SemanticsProperties.PaneTitle, "second pane title"))
             .assertIsDisplayed()
 
@@ -4242,15 +3846,16 @@
         rule.onNodeWithTag(firstPaneTag).assertDoesNotExist()
         rule.onNodeWithTag(secondPaneTag).assertDoesNotExist()
         rule.runOnIdle {
-            verify(container, times(2)).requestSendAccessibilityEvent(
-                eq(androidComposeView),
-                argThat(
-                    ArgumentMatcher {
-                        it.eventType == TYPE_WINDOW_STATE_CHANGED &&
-                            it.contentChangeTypes == CONTENT_CHANGE_TYPE_PANE_DISAPPEARED
-                    }
+            verify(container, times(2))
+                .requestSendAccessibilityEvent(
+                    eq(androidComposeView),
+                    argThat(
+                        ArgumentMatcher {
+                            it.eventType == TYPE_WINDOW_STATE_CHANGED &&
+                                it.contentChangeTypes == CONTENT_CHANGE_TYPE_PANE_DISAPPEARED
+                        }
+                    )
                 )
-            )
         }
     }
 
@@ -4267,17 +3872,16 @@
         }
 
         // Act.
-        rule.onNodeWithTag(tag).performSemanticsAction(SetText) {
-            it(AnnotatedString("new value"))
-        }
+        rule.onNodeWithTag(tag).performSemanticsAction(SetText) { it(AnnotatedString("new value")) }
 
         // Assert.
         rule.mainClock.advanceTimeBy(accessibilityEventLoopIntervalMs)
         rule.runOnIdle {
-            verify(container, atLeastOnce()).requestSendAccessibilityEvent(
-                eq(androidComposeView),
-                argThat(ArgumentMatcher { it.isPassword })
-            )
+            verify(container, atLeastOnce())
+                .requestSendAccessibilityEvent(
+                    eq(androidComposeView),
+                    argThat(ArgumentMatcher { it.isPassword })
+                )
         }
     }
 
@@ -4289,23 +3893,16 @@
             // semantics change notification.
             with(LocalDensity.current) {
                 Box(
-                    Modifier
-                        .graphicsLayer(scaleX = scale, scaleY = scale)
-                        .requiredSize(300.toDp())
+                    Modifier.graphicsLayer(scaleX = scale, scaleY = scale).requiredSize(300.toDp())
                 ) {
-                    Box(
-                        Modifier
-                            .matchParentSize()
-                            .testTag("node"))
+                    Box(Modifier.matchParentSize().testTag("node"))
                 }
             }
         }
         val virtualViewId = rule.onNodeWithTag("node").semanticsId
 
         var info = AccessibilityNodeInfoCompat.obtain()
-        rule.runOnUiThread {
-            info = createAccessibilityNodeInfo(virtualViewId)
-        }
+        rule.runOnUiThread { info = createAccessibilityNodeInfo(virtualViewId) }
         val rect = Rect()
         info.getBoundsInScreen(rect)
         assertThat(rect.width()).isEqualTo(300)
@@ -4315,9 +3912,7 @@
         rule.mainClock.advanceTimeBy(accessibilityEventLoopIntervalMs)
 
         @Suppress("DEPRECATION") info.recycle()
-        rule.runOnIdle {
-            info = createAccessibilityNodeInfo(virtualViewId)
-        }
+        rule.runOnIdle { info = createAccessibilityNodeInfo(virtualViewId) }
         info.getBoundsInScreen(rect)
         assertThat(rect.width()).isEqualTo(150)
         assertThat(rect.height()).isEqualTo(150)
@@ -4331,26 +3926,20 @@
             // semantics change notification.
             with(LocalDensity.current) {
                 Box(
-                    Modifier
-                        .graphicsLayer {
+                    Modifier.graphicsLayer {
                             scaleX = scale
                             scaleY = scale
                         }
                         .requiredSize(300.toDp())
                 ) {
-                    Box(
-                        Modifier
-                            .matchParentSize()
-                            .testTag(tag))
+                    Box(Modifier.matchParentSize().testTag(tag))
                 }
             }
         }
 
         val virtualViewId = rule.onNodeWithTag(tag).semanticsId
         var info = AccessibilityNodeInfoCompat.obtain()
-        rule.runOnUiThread {
-            info = createAccessibilityNodeInfo(virtualViewId)
-        }
+        rule.runOnUiThread { info = createAccessibilityNodeInfo(virtualViewId) }
         val rect = Rect()
         info.getBoundsInScreen(rect)
         assertThat(rect.width()).isEqualTo(300)
@@ -4358,9 +3947,7 @@
 
         scale = 0.5f
         @Suppress("DEPRECATION") info.recycle()
-        rule.runOnIdle {
-            info = createAccessibilityNodeInfo(virtualViewId)
-        }
+        rule.runOnIdle { info = createAccessibilityNodeInfo(virtualViewId) }
         info.getBoundsInScreen(rect)
         assertThat(rect.width()).isEqualTo(150)
         assertThat(rect.height()).isEqualTo(150)
@@ -4372,17 +3959,16 @@
         setContent {
             Dialog(onDismissRequest = {}) {
                 dialogComposeView = LocalView.current as AndroidComposeView
-                delegate = ViewCompat.getAccessibilityDelegate(dialogComposeView!!) as
-                    AndroidComposeViewAccessibilityDelegateCompat
+                delegate =
+                    ViewCompat.getAccessibilityDelegate(dialogComposeView!!)
+                        as AndroidComposeViewAccessibilityDelegateCompat
                 provider = delegate.getAccessibilityNodeProvider(dialogComposeView!!)
 
                 with(LocalDensity.current) {
                     Box(Modifier.size(300.toDp())) {
                         BasicText(
                             text = "text",
-                            modifier = Modifier
-                                .offset(100.toDp(), 100.toDp())
-                                .fillMaxSize()
+                            modifier = Modifier.offset(100.toDp(), 100.toDp()).fillMaxSize()
                         )
                     }
                 }
@@ -4391,9 +3977,7 @@
         val virtualViewId = rule.onNodeWithText("text").semanticsId
 
         var info = AccessibilityNodeInfoCompat.obtain()
-        rule.runOnUiThread {
-            info = createAccessibilityNodeInfo(virtualViewId)
-        }
+        rule.runOnUiThread { info = createAccessibilityNodeInfo(virtualViewId) }
 
         val viewPosition = intArrayOf(0, 0)
         dialogComposeView!!.getLocationOnScreen(viewPosition)
@@ -4429,52 +4013,31 @@
         setContent {
             with(LocalDensity.current) {
                 Column {
-                    Box(
-                        Modifier
-                            .size(100.toDp())
-                            .testTag(tag1))
+                    Box(Modifier.size(100.toDp()).testTag(tag1))
                     Box(Modifier.semantics { testTagsAsResourceId = true }) {
-                        Box(
-                            Modifier
-                                .size(100.toDp())
-                                .testTag(tag2))
+                        Box(Modifier.size(100.toDp()).testTag(tag2))
                     }
                     Box(Modifier.semantics { testTagsAsResourceId = false }) {
-                        Box(
-                            Modifier
-                                .size(100.toDp())
-                                .testTag(tag3))
+                        Box(Modifier.size(100.toDp()).testTag(tag3))
                     }
                     Box(Modifier.semantics { testTagsAsResourceId = true }) {
                         Box(Modifier.semantics { testTagsAsResourceId = false }) {
-                            Box(
-                                Modifier
-                                    .size(100.toDp())
-                                    .testTag(tag4))
+                            Box(Modifier.size(100.toDp()).testTag(tag4))
                         }
                     }
                     Box(Modifier.semantics { testTagsAsResourceId = false }) {
                         Box(Modifier.semantics { testTagsAsResourceId = true }) {
-                            Box(
-                                Modifier
-                                    .size(100.toDp())
-                                    .testTag(tag5))
+                            Box(Modifier.size(100.toDp()).testTag(tag5))
                         }
                     }
                     Box(Modifier.semantics(true) { testTagsAsResourceId = true }) {
                         Box(Modifier.semantics { testTagsAsResourceId = false }) {
-                            Box(
-                                Modifier
-                                    .size(100.toDp())
-                                    .testTag(tag6))
+                            Box(Modifier.size(100.toDp()).testTag(tag6))
                         }
                     }
                     Box(Modifier.semantics(true) { testTagsAsResourceId = false }) {
                         Box(Modifier.semantics { testTagsAsResourceId = true }) {
-                            Box(
-                                Modifier
-                                    .size(100.toDp())
-                                    .testTag(tag7))
+                            Box(Modifier.size(100.toDp()).testTag(tag7))
                         }
                     }
                 }
@@ -4514,16 +4077,10 @@
     fun testContentDescription_notMergingDescendants_withOwnContentDescription() {
         // Arrange.
         setContent {
-            Column(
-                Modifier
-                    .semantics { contentDescription = "Column" }
-                    .testTag(tag)) {
+            Column(Modifier.semantics { contentDescription = "Column" }.testTag(tag)) {
                 with(LocalDensity.current) {
                     BasicText("Text")
-                    Box(
-                        Modifier
-                            .size(100.toDp())
-                            .semantics { contentDescription = "Box" })
+                    Box(Modifier.size(100.toDp()).semantics { contentDescription = "Box" })
                 }
             }
         }
@@ -4540,16 +4097,10 @@
     fun testContentDescription_notMergingDescendants_withoutOwnContentDescription() {
         // Arrange.
         setContent {
-            Column(
-                Modifier
-                    .semantics {}
-                    .testTag(tag)) {
+            Column(Modifier.semantics {}.testTag(tag)) {
                 BasicText("Text")
                 with(LocalDensity.current) {
-                    Box(
-                        Modifier
-                            .size(100.toDp())
-                            .semantics { contentDescription = "Box" })
+                    Box(Modifier.size(100.toDp()).semantics { contentDescription = "Box" })
                 }
             }
         }
@@ -4567,12 +4118,7 @@
         // Arrange.
         setContent {
             with(LocalDensity.current) {
-                Box(
-                    Modifier
-                        .size(100.toDp())
-                        .testTag(tag)
-                        .semantics { contentDescription = "Box" }
-                )
+                Box(Modifier.size(100.toDp()).testTag(tag).semantics { contentDescription = "Box" })
             }
         }
         val virtualViewId = rule.onNodeWithTag(tag).semanticsId
@@ -4590,10 +4136,9 @@
         setContent {
             with(LocalDensity.current) {
                 Box(
-                    Modifier
-                        .size(100.toDp())
-                        .testTag(tag)
-                        .semantics(true) { contentDescription = "Box" }
+                    Modifier.size(100.toDp()).testTag(tag).semantics(true) {
+                        contentDescription = "Box"
+                    }
                 )
             }
         }
@@ -4612,19 +4157,13 @@
         setContent {
             with(LocalDensity.current) {
                 Column(
-                    Modifier
-                        .size(100.toDp())
-                        .testTag(tag)
-                        .clearAndSetSemantics { contentDescription = "Replacing description" }
+                    Modifier.size(100.toDp()).testTag(tag).clearAndSetSemantics {
+                        contentDescription = "Replacing description"
+                    }
                 ) {
+                    Box(Modifier.size(100.toDp()).semantics { contentDescription = "Box one" })
                     Box(
-                        Modifier
-                            .size(100.toDp())
-                            .semantics { contentDescription = "Box one" })
-                    Box(
-                        Modifier
-                            .size(100.toDp())
-                            .semantics(true) { contentDescription = "Box two" }
+                        Modifier.size(100.toDp()).semantics(true) { contentDescription = "Box two" }
                     )
                 }
             }
@@ -4642,19 +4181,10 @@
     fun testRole_doesNotMerge() {
         // Arrange.
         setContent {
-            Row(
-                Modifier
-                    .semantics(true) {}
-                    .testTag("Row")) {
+            Row(Modifier.semantics(true) {}.testTag("Row")) {
                 with(LocalDensity.current) {
-                    Box(
-                        Modifier
-                            .size(100.toDp())
-                            .semantics { role = Role.Button })
-                    Box(
-                        Modifier
-                            .size(100.toDp())
-                            .semantics { role = Role.Image })
+                    Box(Modifier.size(100.toDp()).semantics { role = Role.Button })
+                    Box(Modifier.size(100.toDp()).semantics { role = Role.Image })
                 }
             }
         }
@@ -4668,78 +4198,78 @@
     }
 
     @Test
-    fun testReportedBounds_clickableNode_includesPadding(): Unit = with(rule.density) {
-        // Arrange.
-        val size = 100.dp.roundToPx()
-        setContent {
-            with(LocalDensity.current) {
-                Column {
-                    Box(
-                        Modifier
-                            .testTag("tag")
-                            .clickable {}
-                            .size(size.toDp())
-                            .padding(10.toDp())
-                            .semantics {
-                                contentDescription = "Button"
-                            }
-                    )
-                }
-            }
-        }
-        val virtualViewId = rule.onNodeWithTag("tag").semanticsId
-
-        // Act.
-        val accessibilityNodeInfo = rule.runOnIdle { createAccessibilityNodeInfo(virtualViewId) }
-
-        // Assert.
-        rule.runOnIdle {
-            val rect = Rect()
-            accessibilityNodeInfo.getBoundsInScreen(rect)
-            val resultWidth = rect.right - rect.left
-            val resultHeight = rect.bottom - rect.top
-            assertThat(resultWidth).isEqualTo(size)
-            assertThat(resultHeight).isEqualTo(size)
-        }
-    }
-
-    @Test
-    fun testReportedBounds_clickableNode_excludesPadding(): Unit = with(rule.density) {
-        // Arrange.
-        val size = 100.dp.roundToPx()
-        val density = Density(2f)
-        setContent {
-            CompositionLocalProvider(LocalDensity provides density) {
-                Column {
-                    with(density) {
+    fun testReportedBounds_clickableNode_includesPadding(): Unit =
+        with(rule.density) {
+            // Arrange.
+            val size = 100.dp.roundToPx()
+            setContent {
+                with(LocalDensity.current) {
+                    Column {
                         Box(
-                            Modifier
-                                .testTag("tag")
-                                .semantics { contentDescription = "Test" }
+                            Modifier.testTag("tag")
+                                .clickable {}
                                 .size(size.toDp())
                                 .padding(10.toDp())
-                                .clickable {}
+                                .semantics { contentDescription = "Button" }
                         )
                     }
                 }
             }
+            val virtualViewId = rule.onNodeWithTag("tag").semanticsId
+
+            // Act.
+            val accessibilityNodeInfo =
+                rule.runOnIdle { createAccessibilityNodeInfo(virtualViewId) }
+
+            // Assert.
+            rule.runOnIdle {
+                val rect = Rect()
+                accessibilityNodeInfo.getBoundsInScreen(rect)
+                val resultWidth = rect.right - rect.left
+                val resultHeight = rect.bottom - rect.top
+                assertThat(resultWidth).isEqualTo(size)
+                assertThat(resultHeight).isEqualTo(size)
+            }
         }
 
-        val virtualViewId = rule.onNodeWithTag("tag").semanticsId
+    @Test
+    fun testReportedBounds_clickableNode_excludesPadding(): Unit =
+        with(rule.density) {
+            // Arrange.
+            val size = 100.dp.roundToPx()
+            val density = Density(2f)
+            setContent {
+                CompositionLocalProvider(LocalDensity provides density) {
+                    Column {
+                        with(density) {
+                            Box(
+                                Modifier.testTag("tag")
+                                    .semantics { contentDescription = "Test" }
+                                    .size(size.toDp())
+                                    .padding(10.toDp())
+                                    .clickable {}
+                            )
+                        }
+                    }
+                }
+            }
 
-        // Act.
-        val accessibilityNodeInfo = rule.runOnIdle { createAccessibilityNodeInfo(virtualViewId) }
+            val virtualViewId = rule.onNodeWithTag("tag").semanticsId
 
-        // Assert.
-        rule.runOnIdle {
-            val rect = Rect()
-            accessibilityNodeInfo.getBoundsInScreen(rect)
-            val resultWidth = rect.right - rect.left
-            val resultHeight = rect.bottom - rect.top
-            assertThat(resultWidth).isEqualTo(size - 20)
-            assertThat(resultHeight).isEqualTo(size - 20)
+            // Act.
+            val accessibilityNodeInfo =
+                rule.runOnIdle { createAccessibilityNodeInfo(virtualViewId) }
+
+            // Assert.
+            rule.runOnIdle {
+                val rect = Rect()
+                accessibilityNodeInfo.getBoundsInScreen(rect)
+                val resultWidth = rect.right - rect.left
+                val resultHeight = rect.bottom - rect.top
+                assertThat(resultWidth).isEqualTo(size - 20)
+                assertThat(resultHeight).isEqualTo(size - 20)
+            }
         }
-    }
 
     @Test
     fun testReportedBounds_withClearAndSetSemantics() {
@@ -4749,8 +4279,7 @@
             with(LocalDensity.current) {
                 Column {
                     Box(
-                        Modifier
-                            .testTag("tag")
+                        Modifier.testTag("tag")
                             .size(size.toDp())
                             .padding(10.toDp())
                             .clearAndSetSemantics {}
@@ -4777,38 +4306,39 @@
     }
 
     @Test
-    fun testReportedBounds_withTwoClickable_outermostWins(): Unit = with(rule.density) {
-        // Arrange.
-        val size = 100.dp.roundToPx()
-        setContent {
-            with(LocalDensity.current) {
-                Column {
-                    Box(
-                        Modifier
-                            .testTag(tag)
-                            .clickable {}
-                            .size(size.toDp())
-                            .padding(10.toDp())
-                            .clickable {}
-                    )
+    fun testReportedBounds_withTwoClickable_outermostWins(): Unit =
+        with(rule.density) {
+            // Arrange.
+            val size = 100.dp.roundToPx()
+            setContent {
+                with(LocalDensity.current) {
+                    Column {
+                        Box(
+                            Modifier.testTag(tag)
+                                .clickable {}
+                                .size(size.toDp())
+                                .padding(10.toDp())
+                                .clickable {}
+                        )
+                    }
                 }
             }
-        }
-        val virtualViewId = rule.onNodeWithTag(tag).semanticsId
+            val virtualViewId = rule.onNodeWithTag(tag).semanticsId
 
-        // Act.
-        val accessibilityNodeInfo = rule.runOnIdle { createAccessibilityNodeInfo(virtualViewId) }
+            // Act.
+            val accessibilityNodeInfo =
+                rule.runOnIdle { createAccessibilityNodeInfo(virtualViewId) }
 
-        // Assert.
-        rule.runOnIdle {
-            val rect = Rect()
-            accessibilityNodeInfo.getBoundsInScreen(rect)
-            val resultWidth = rect.right - rect.left
-            val resultHeight = rect.bottom - rect.top
-            assertThat(resultWidth).isEqualTo(size)
-            assertThat(resultHeight).isEqualTo(size)
+            // Assert.
+            rule.runOnIdle {
+                val rect = Rect()
+                accessibilityNodeInfo.getBoundsInScreen(rect)
+                val resultWidth = rect.right - rect.left
+                val resultHeight = rect.bottom - rect.top
+                assertThat(resultWidth).isEqualTo(size)
+                assertThat(resultHeight).isEqualTo(size)
+            }
         }
-    }
 
     @Test
     fun testReportedBounds_outerMostSemanticsUsed() {
@@ -4818,8 +4348,7 @@
             with(LocalDensity.current) {
                 Column {
                     Box(
-                        Modifier
-                            .testTag(tag)
+                        Modifier.testTag(tag)
                             .semantics { contentDescription = "Test1" }
                             .size(size.toDp())
                             .padding(10.toDp())
@@ -4855,8 +4384,7 @@
                 with(LocalDensity.current) {
                     Column {
                         Box(
-                            Modifier
-                                .size(size.toDp())
+                            Modifier.size(size.toDp())
                                 .offset(offset.toDp(), offset.toDp())
                                 .testTag(tag)
                                 .semantics { contentDescription = "Test" }
@@ -4890,12 +4418,7 @@
         var emitNode by mutableStateOf(true)
         setContent {
             if (emitNode) {
-                with(LocalDensity.current) {
-                    Box(
-                        Modifier
-                            .size(100.toDp())
-                            .testTag(tag))
-                }
+                with(LocalDensity.current) { Box(Modifier.size(100.toDp()).testTag(tag)) }
             }
         }
         val semanticNode = rule.onNodeWithTag(tag).fetchSemanticsNode()
@@ -4920,14 +4443,8 @@
         // Arrange.
         setContent {
             with(LocalDensity.current) {
-                Box(
-                    Modifier
-                        .size(100.toDp())
-                        .testTag("parent")) {
-                    Box(
-                        Modifier
-                            .size(100.toDp())
-                            .testTag("child"))
+                Box(Modifier.size(100.toDp()).testTag("parent")) {
+                    Box(Modifier.size(100.toDp()).testTag("child"))
                 }
             }
         }
@@ -4935,9 +4452,7 @@
         val child = rule.onNodeWithTag("child").fetchSemanticsNode()
 
         // Act.
-        rule.runOnIdle {
-            child.layoutNode.innerCoordinator.onRelease()
-        }
+        rule.runOnIdle { child.layoutNode.innerCoordinator.onRelease() }
 
         // Assert.
         rule.runOnIdle {
@@ -4951,27 +4466,12 @@
         // Arrange.
         setContent {
             with(LocalDensity.current) {
-                Box(
-                    Modifier
-                        .size(100.toDp())
-                        .testTag("parent")) {
-                    Box(
-                        Modifier
-                            .size(100.toDp())
-                            .testTag("child1")) {
-                        Box(
-                            Modifier
-                                .size(50.toDp())
-                                .testTag("grandChild1"))
+                Box(Modifier.size(100.toDp()).testTag("parent")) {
+                    Box(Modifier.size(100.toDp()).testTag("child1")) {
+                        Box(Modifier.size(50.toDp()).testTag("grandChild1"))
                     }
-                    Box(
-                        Modifier
-                            .size(100.toDp())
-                            .testTag("child2")) {
-                        Box(
-                            Modifier
-                                .size(50.toDp())
-                                .testTag("grandChild2"))
+                    Box(Modifier.size(100.toDp()).testTag("child2")) {
+                        Box(Modifier.size(50.toDp()).testTag("grandChild2"))
                     }
                 }
             }
@@ -4987,26 +4487,17 @@
         }
 
         // Assert.
-        rule.runOnIdle {
-            assertThat(parent.unmergedChildren(true).size).isEqualTo(2)
-        }
+        rule.runOnIdle { assertThat(parent.unmergedChildren(true).size).isEqualTo(2) }
     }
 
     @Test
     fun testFakeNodeCreated_forContentDescriptionSemantics() {
         // Arrange.
         setContent {
-            Column(
-                Modifier
-                    .semantics(true) { contentDescription = "Test" }
-                    .testTag(tag)
-            ) {
+            Column(Modifier.semantics(true) { contentDescription = "Test" }.testTag(tag)) {
                 BasicText("Text")
                 with(LocalDensity.current) {
-                    Box(
-                        Modifier
-                            .size(100.toDp())
-                            .semantics { contentDescription = "Hello" })
+                    Box(Modifier.size(100.toDp()).semantics { contentDescription = "Hello" })
                 }
             }
         }
@@ -5025,17 +4516,10 @@
     @Test
     fun testFakeNode_forContentDescriptionSemantics_id() {
         setContent {
-            Column(
-                Modifier
-                    .semantics(true) { contentDescription = "Test" }
-                    .testTag(tag)
-            ) {
+            Column(Modifier.semantics(true) { contentDescription = "Test" }.testTag(tag)) {
                 BasicText("Text")
                 with(LocalDensity.current) {
-                    Box(
-                        Modifier
-                            .size(100.toDp())
-                            .semantics { contentDescription = "Hello" })
+                    Box(Modifier.size(100.toDp()).semantics { contentDescription = "Hello" })
                 }
             }
         }
@@ -5047,21 +4531,14 @@
         val fakeNodeInfoId = getAccessibilityNodeInfoSourceSemanticsNodeId(fakeNodeInfo)
 
         // Assert.
-        rule.runOnIdle {
-            assertThat(fakeNodeInfoId).isEqualTo(fakeNodeId)
-        }
+        rule.runOnIdle { assertThat(fakeNodeInfoId).isEqualTo(fakeNodeId) }
     }
 
     @Test
     fun testFakeNode_createdForButton() {
         // Arrange.
         setContent {
-            Column(
-                Modifier
-                    .clickable(role = Role.Button) {}
-                    .testTag(tag)) {
-                BasicText("Text")
-            }
+            Column(Modifier.clickable(role = Role.Button) {}.testTag(tag)) { BasicText("Text") }
         }
         val buttonNode = rule.onNodeWithTag(tag, true).fetchSemanticsNode()
 
@@ -5080,12 +4557,7 @@
     fun testFakeNode_createdForButton_id() {
         // Arrange.
         setContent {
-            Column(
-                Modifier
-                    .clickable(role = Role.Button) {}
-                    .testTag(tag)) {
-                BasicText("Text")
-            }
+            Column(Modifier.clickable(role = Role.Button) {}.testTag(tag)) { BasicText("Text") }
         }
 
         val buttonNode = rule.onNodeWithTag(tag, true).fetchSemanticsNode()
@@ -5097,9 +4569,7 @@
         val fakeNodeInfoId = fakeNodeInfo?.let { getAccessibilityNodeInfoSourceSemanticsNodeId(it) }
 
         // Assert.
-        rule.runOnIdle {
-            assertThat(fakeNodeInfoId).isEqualTo(fakeNodeId)
-        }
+        rule.runOnIdle { assertThat(fakeNodeInfoId).isEqualTo(fakeNodeId) }
     }
 
     @Test
@@ -5107,11 +4577,7 @@
         // Arrange.
         setContent {
             with(LocalDensity.current) {
-                Box(
-                    Modifier
-                        .size(100.toDp())
-                        .clickable(role = Role.Button) {}
-                        .testTag("button"))
+                Box(Modifier.size(100.toDp()).clickable(role = Role.Button) {}.testTag("button"))
             }
         }
         val buttonNode = rule.onNodeWithTag("button").fetchSemanticsNode()
@@ -5131,11 +4597,7 @@
         setContent {
             CompositionLocalProvider(LocalDensity provides density) {
                 with(density) {
-                    Box(
-                        Modifier
-                            .size(100.toDp())
-                            .clickable(role = Role.Button) {}
-                            .testTag(tag)) {
+                    Box(Modifier.size(100.toDp()).clickable(role = Role.Button) {}.testTag(tag)) {
                         BasicText("Example")
                     }
                 }
@@ -5159,11 +4621,7 @@
     fun testContentDescription_withFakeNode_mergedCorrectly() {
         // Arrange.
         setContent {
-            Column(
-                Modifier
-                    .testTag(tag)
-                    .semantics(true) { contentDescription = "Hello" }
-            ) {
+            Column(Modifier.testTag(tag).semantics(true) { contentDescription = "Hello" }) {
                 Box(Modifier.semantics { contentDescription = "World" })
             }
         }
@@ -5177,9 +4635,7 @@
     fun testScreenReaderFocusable_notSet_whenAncestorMergesDescendants() {
         // Arrange.
         setContent {
-            Column(Modifier.semantics(true) { }) {
-                BasicText("test", Modifier.testTag(tag))
-            }
+            Column(Modifier.semantics(true) {}) { BasicText("test", Modifier.testTag(tag)) }
         }
         val virtualViewId = rule.onNodeWithTag(tag, useUnmergedTree = true).semanticsId
 
@@ -5195,9 +4651,7 @@
     fun testScreenReaderFocusable_set_whenAncestorDoesNotMerge() {
         // Arrange.
         setContent {
-            Column(Modifier.semantics(false) { }) {
-                BasicText("test", Modifier.testTag(tag))
-            }
+            Column(Modifier.semantics(false) {}) { BasicText("test", Modifier.testTag(tag)) }
         }
         val virtualViewId = rule.onNodeWithTag(tag, useUnmergedTree = true).semanticsId
 
@@ -5213,12 +4667,7 @@
     fun testScreenReaderFocusable_notSet_whenChildNotSpeakable() {
         // Arrange.
         setContent {
-            Column(Modifier.semantics(false) { }) {
-                Box(
-                    Modifier
-                        .testTag(tag)
-                        .size(100.dp))
-            }
+            Column(Modifier.semantics(false) {}) { Box(Modifier.testTag(tag).size(100.dp)) }
         }
         val virtualViewId = rule.onNodeWithTag(tag, useUnmergedTree = true).semanticsId
 
@@ -5233,7 +4682,7 @@
     fun testImageRole_notSet_whenAncestorMergesDescendants() {
         // Arrange.
         setContent {
-            Column(Modifier.semantics(true) { }) {
+            Column(Modifier.semantics(true) {}) {
                 Image(ImageBitmap(100, 100), "Image", Modifier.testTag(tag))
             }
         }
@@ -5271,9 +4720,7 @@
                 Image(
                     ImageBitmap(100, 100),
                     "Image",
-                    Modifier
-                        .testTag(tag)
-                        .semantics(true) { /* imitate clickable node */ }
+                    Modifier.testTag(tag).semantics(true) { /* imitate clickable node */ }
                 )
             }
         }
@@ -5295,8 +4742,7 @@
             LazyColumn(Modifier.testTag(tagColumn)) {
                 item {
                     Row(
-                        Modifier
-                            .testTag(tagRow)
+                        Modifier.testTag(tagRow)
                             .scrollable(rememberScrollState(), Orientation.Horizontal)
                     ) {
                         BasicText("test")
@@ -5333,11 +4779,13 @@
                     AndroidView(
                         factory = {
                             FrameLayout(it).apply {
-                                addView(View(it).apply {
-                                    layoutParams = FrameLayout.LayoutParams(viewSize, viewSize)
-                                    setBackgroundColor(Color.Red.toArgb())
-                                    id = viewId
-                                })
+                                addView(
+                                    View(it).apply {
+                                        layoutParams = FrameLayout.LayoutParams(viewSize, viewSize)
+                                        setBackgroundColor(Color.Red.toArgb())
+                                        id = viewId
+                                    }
+                                )
                             }
                         },
                     )
@@ -5346,9 +4794,7 @@
         }
         rule.mainClock.autoAdvance = true // ensure complete recomposition
 
-        rule.runOnIdle {
-            state = true
-        }
+        rule.runOnIdle { state = true }
 
         rule.waitForIdle()
         val info = androidComposeView.findViewById<View>(viewId).createAccessibilityNodeInfo()
@@ -5363,30 +4809,22 @@
         setContent {
             Column(Modifier.testTag("parent")) {
                 val modifier = Modifier.size(100.dp)
-                Box(
-                    Modifier
-                        .alpha(0f)
-                ) {
+                Box(Modifier.alpha(0f)) {
                     Box(
-                        modifier
-                            .semantics {
-                                testTag = "child1"
-                                contentDescription = "test"
-                            }
+                        modifier.semantics {
+                            testTag = "child1"
+                            contentDescription = "test"
+                        }
                     )
                 }
                 Box(
-                    Modifier
-                        .alpha(0f)
-                        .then(modifier)
-                        .semantics {
-                            testTag = "child2"
-                            contentDescription = "test"
-                        }
+                    Modifier.alpha(0f).then(modifier).semantics {
+                        testTag = "child2"
+                        contentDescription = "test"
+                    }
                 )
                 Box(
-                    Modifier
-                        .alpha(0f)
+                    Modifier.alpha(0f)
                         .semantics {
                             testTag = "child3"
                             contentDescription = "test"
@@ -5394,22 +4832,16 @@
                         .then(modifier)
                 )
                 Box(
-                    modifier
-                        .alpha(0f)
-                        .semantics {
-                            testTag = "child4"
-                            contentDescription = "test"
-                        }
+                    modifier.alpha(0f).semantics {
+                        testTag = "child4"
+                        contentDescription = "test"
+                    }
                 )
                 Box(
-                    Modifier
-                        .size(100.dp)
-                        .alpha(0f)
-                        .shadow(2.dp)
-                        .semantics {
-                            testTag = "child5"
-                            contentDescription = "test"
-                        }
+                    Modifier.size(100.dp).alpha(0f).shadow(2.dp).semantics {
+                        testTag = "child5"
+                        contentDescription = "test"
+                    }
                 )
             }
         }
@@ -5447,8 +4879,7 @@
             Column(Modifier.testTag("parent")) {
                 val modifier = Modifier.size(100.dp)
                 Box(
-                    Modifier
-                        .semantics {
+                    Modifier.semantics {
                             testTag = "child1"
                             contentDescription = "test"
                         }
@@ -5456,8 +4887,7 @@
                         .alpha(0f)
                 )
                 Box(
-                    Modifier
-                        .semantics {
+                    Modifier.semantics {
                             testTag = "child2"
                             contentDescription = "test"
                         }
@@ -5500,10 +4930,7 @@
     fun progressSemantics_mergesSemantics_forTalkback() {
         // Arrange.
         setContent {
-            Box(
-                Modifier
-                    .progressSemantics(0.5f)
-                    .testTag("box")) {
+            Box(Modifier.progressSemantics(0.5f).testTag("box")) {
                 BasicText("test", Modifier.testTag("child"))
             }
         }
@@ -5527,10 +4954,7 @@
     fun indeterminateProgressSemantics_mergesSemantics_forTalkback() {
         // Arrange.
         setContent {
-            Box(
-                Modifier
-                    .progressSemantics()
-                    .testTag("box")) {
+            Box(Modifier.progressSemantics().testTag("box")) {
                 BasicText("test", Modifier.testTag("child"))
             }
         }
@@ -5601,17 +5025,9 @@
     @Test
     fun canScroll_returnsFalse_whenAccessedOutsideOfMainThread() {
         setContent {
-            Box(
-                Modifier.semantics(mergeDescendants = true) { }
-            ) {
-                Column(
-                    Modifier
-                        .size(50.dp)
-                        .verticalScroll(rememberScrollState())
-                ) {
-                    repeat(10) {
-                        Box(Modifier.size(30.dp))
-                    }
+            Box(Modifier.semantics(mergeDescendants = true) {}) {
+                Column(Modifier.size(50.dp).verticalScroll(rememberScrollState())) {
+                    repeat(10) { Box(Modifier.size(30.dp)) }
                 }
             }
         }
@@ -5628,21 +5044,25 @@
 
     private fun getAccessibilityNodeInfoSourceSemanticsNodeId(
         node: AccessibilityNodeInfoCompat
-    ): Int = Class
-        .forName("android.view.accessibility.AccessibilityNodeInfo")
-        .getDeclaredMethod("getSourceNodeId").run {
-            isAccessible = true
-            invoke(node.unwrap()) as Long shr 32
-        }.toInt()
+    ): Int =
+        Class.forName("android.view.accessibility.AccessibilityNodeInfo")
+            .getDeclaredMethod("getSourceNodeId")
+            .run {
+                isAccessible = true
+                invoke(node.unwrap()) as Long shr 32
+            }
+            .toInt()
 
     private fun getAccessibilityEventSourceSemanticsNodeId(
         event: android.view.accessibility.AccessibilityEvent
-    ): Int = Class
-        .forName("android.view.accessibility.AccessibilityRecord")
-        .getDeclaredMethod("getSourceNodeId").run {
-            isAccessible = true
-            invoke(event) as Long shr 32
-        }.toInt()
+    ): Int =
+        Class.forName("android.view.accessibility.AccessibilityRecord")
+            .getDeclaredMethod("getSourceNodeId")
+            .run {
+                isAccessible = true
+                invoke(event) as Long shr 32
+            }
+            .toInt()
 
     private fun createMovementGranularityCharacterArgs(): Bundle {
         return Bundle().apply {
@@ -5673,7 +5093,7 @@
 
 /**
  * A simple test layout that does the bare minimum required to lay out an arbitrary number of
- * children reasonably.  Useful for Semantics hierarchy testing
+ * children reasonably. Useful for Semantics hierarchy testing
  */
 @Composable
 private fun SimpleTestLayout(modifier: Modifier = Modifier, content: @Composable () -> Unit) {
@@ -5681,21 +5101,14 @@
         if (measurables.isEmpty()) {
             layout(constraints.minWidth, constraints.minHeight) {}
         } else {
-            val placeables = measurables.map {
-                it.measure(constraints)
-            }
-            val (width, height) = with(placeables) {
-                Pair(
-                    max(
-                        maxByOrNull { it.width }?.width ?: 0,
-                        constraints.minWidth
-                    ),
-                    max(
-                        maxByOrNull { it.height }?.height ?: 0,
-                        constraints.minHeight
+            val placeables = measurables.map { it.measure(constraints) }
+            val (width, height) =
+                with(placeables) {
+                    Pair(
+                        max(maxByOrNull { it.width }?.width ?: 0, constraints.minWidth),
+                        max(maxByOrNull { it.height }?.height ?: 0, constraints.minHeight)
                     )
-                )
-            }
+                }
             layout(width, height) {
                 for (placeable in placeables) {
                     placeable.placeRelative(0, 0)
@@ -5726,21 +5139,15 @@
         val looseConstraints = constraints.copy(minWidth = 0, minHeight = 0)
 
         layout(layoutWidth, layoutHeight) {
-            val placeablesOne = subcompose(TestSlot.First, contentOne).fastMap {
-                it.measure(looseConstraints)
-            }
+            val placeablesOne =
+                subcompose(TestSlot.First, contentOne).fastMap { it.measure(looseConstraints) }
 
-            val placeablesTwo = subcompose(TestSlot.Second, contentTwo).fastMap {
-                it.measure(looseConstraints)
-            }
+            val placeablesTwo =
+                subcompose(TestSlot.Second, contentTwo).fastMap { it.measure(looseConstraints) }
 
             // Placing to control drawing order to match default elevation of each placeable
-            placeablesOne.fastForEach {
-                it.place(positionOne.x.toInt(), positionOne.y.toInt())
-            }
-            placeablesTwo.fastForEach {
-                it.place(positionTwo.x.toInt(), positionTwo.y.toInt())
-            }
+            placeablesOne.fastForEach { it.place(positionOne.x.toInt(), positionOne.y.toInt()) }
+            placeablesTwo.fastForEach { it.place(positionTwo.x.toInt(), positionTwo.y.toInt()) }
         }
     }
 }
@@ -5762,17 +5169,18 @@
         val layoutHeight = constraints.maxHeight
         val looseConstraints = constraints.copy(minWidth = 0, minHeight = 0)
         layout(layoutWidth, layoutHeight) {
-            val topPlaceables = subcompose(ScaffoldedSlots.Top, topBar).fastMap {
-                it.measure(looseConstraints)
-            }
+            val topPlaceables =
+                subcompose(ScaffoldedSlots.Top, topBar).fastMap { it.measure(looseConstraints) }
 
-            val contentPlaceables = subcompose(ScaffoldedSlots.Content, content).fastMap {
-                it.measure(looseConstraints)
-            }
+            val contentPlaceables =
+                subcompose(ScaffoldedSlots.Content, content).fastMap {
+                    it.measure(looseConstraints)
+                }
 
-            val bottomPlaceables = subcompose(ScaffoldedSlots.Bottom, bottomBar).fastMap {
-                it.measure(looseConstraints)
-            }
+            val bottomPlaceables =
+                subcompose(ScaffoldedSlots.Bottom, bottomBar).fastMap {
+                    it.measure(looseConstraints)
+                }
 
             topPlaceables.fastForEach {
                 it.place(0, yPosition)
@@ -5790,22 +5198,31 @@
     }
 }
 
-private enum class TestSlot { First, Second }
-private enum class ScaffoldedSlots { Top, Content, Bottom }
+private enum class TestSlot {
+    First,
+    Second
+}
+
+private enum class ScaffoldedSlots {
+    Top,
+    Content,
+    Bottom
+}
 
 // TODO(b/272068594): Add api to fetch the semantics id from SemanticsNodeInteraction directly.
-private val SemanticsNodeInteraction.semanticsId: Int get() = fetchSemanticsNode().id
+private val SemanticsNodeInteraction.semanticsId: Int
+    get() = fetchSemanticsNode().id
 
 // TODO(b/304359126): Move this to AccessibilityEventCompat and use it wherever we use obtain().
 private fun AccessibilityEvent(): android.view.accessibility.AccessibilityEvent {
     return if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {
-        android.view.accessibility.AccessibilityEvent()
-    } else {
-        @Suppress("DEPRECATION")
-        android.view.accessibility.AccessibilityEvent.obtain()
-    }.apply {
-        packageName = "androidx.compose.ui.test"
-        className = "android.view.View"
-        isEnabled = true
-    }
+            android.view.accessibility.AccessibilityEvent()
+        } else {
+            @Suppress("DEPRECATION") android.view.accessibility.AccessibilityEvent.obtain()
+        }
+        .apply {
+            packageName = "androidx.compose.ui.test"
+            className = "android.view.View"
+            isEnabled = true
+        }
 }
diff --git a/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/AndroidComposeViewAccessibilityDelegateCompatTest.kt b/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/AndroidComposeViewAccessibilityDelegateCompatTest.kt
index 25d4442..5955e2d 100644
--- a/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/AndroidComposeViewAccessibilityDelegateCompatTest.kt
+++ b/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/AndroidComposeViewAccessibilityDelegateCompatTest.kt
@@ -1,4 +1,3 @@
-
 /*
  * Copyright 2020 The Android Open Source Project
  *
@@ -111,8 +110,7 @@
 @MediumTest
 @RunWith(AndroidJUnit4::class)
 class AndroidComposeViewAccessibilityDelegateCompatTest {
-    @get:Rule
-    val rule = createAndroidComposeRule<TestActivity>()
+    @get:Rule val rule = createAndroidComposeRule<TestActivity>()
 
     private val tag = "tag"
     private lateinit var androidComposeView: AndroidComposeView
@@ -130,18 +128,16 @@
         val state = "checked"
         rule.setContentWithAccessibilityEnabled {
             Box(
-                Modifier
-                    .size(10.dp)
-                    .semantics {
-                        stateDescription = "checked"
-                        testTag = tag
-                        testTagsAsResourceId = true
-                        heading()
-                        onClick(clickActionLabel) { true }
-                        dismiss(dismissActionLabel) { true }
-                        expand(expandActionLabel) { true }
-                        collapse(collapseActionLabel) { true }
-                    }
+                Modifier.size(10.dp).semantics {
+                    stateDescription = "checked"
+                    testTag = tag
+                    testTagsAsResourceId = true
+                    heading()
+                    onClick(clickActionLabel) { true }
+                    dismiss(dismissActionLabel) { true }
+                    expand(expandActionLabel) { true }
+                    collapse(collapseActionLabel) { true }
+                }
             )
         }
         val virtualViewId = rule.onNodeWithTag(tag).semanticsId
@@ -173,11 +169,7 @@
     fun testPopulateAccessibilityNodeInfoProperties_screenReaderFocusable_mergingDescendants() {
         // Arrange.
         rule.setContentWithAccessibilityEnabled {
-            Box(
-                Modifier
-                    .size(10.dp)
-                    .semantics(mergeDescendants = true) { testTag = tag }
-            )
+            Box(Modifier.size(10.dp).semantics(mergeDescendants = true) { testTag = tag })
         }
         val virtualViewId = rule.onNodeWithTag(tag).semanticsId
 
@@ -192,11 +184,7 @@
     fun testPopulateAccessibilityNodeInfoProperties_screenReaderFocusable_notMergingDescendants() {
         // Arrange.
         rule.setContentWithAccessibilityEnabled {
-            Box(
-                Modifier
-                    .size(10.dp)
-                    .semantics(mergeDescendants = false) { testTag = tag }
-            )
+            Box(Modifier.size(10.dp).semantics(mergeDescendants = false) { testTag = tag })
         }
         val virtualViewId = rule.onNodeWithTag(tag).semanticsId
 
@@ -212,12 +200,10 @@
         // Arrange.
         rule.setContentWithAccessibilityEnabled {
             Box(
-                Modifier
-                    .size(10.dp)
-                    .semantics(mergeDescendants = false) {
-                        testTag = tag
-                        text = AnnotatedString("Example text")
-                    }
+                Modifier.size(10.dp).semantics(mergeDescendants = false) {
+                    testTag = tag
+                    text = AnnotatedString("Example text")
+                }
             )
         }
         val virtualViewId = rule.onNodeWithTag(tag).semanticsId
@@ -235,24 +221,22 @@
         rule.setContentWithAccessibilityEnabled {
             LocalClipboardManager.current.setText(AnnotatedString("test"))
             Box(
-                Modifier
-                    .size(10.dp)
-                    .semantics(mergeDescendants = true) {
-                        testTag = tag
-                        disabled()
-                        editableText = AnnotatedString("text")
-                        horizontalScrollAxisRange = ScrollAxisRange({ 0f }, { 5f })
-                        onClick { true }
-                        onLongClick { true }
-                        copyText { true }
-                        pasteText { true }
-                        cutText { true }
-                        setText { true }
-                        setSelection { _, _, _ -> true }
-                        dismiss { true }
-                        expand { true }
-                        collapse { true }
-                    }
+                Modifier.size(10.dp).semantics(mergeDescendants = true) {
+                    testTag = tag
+                    disabled()
+                    editableText = AnnotatedString("text")
+                    horizontalScrollAxisRange = ScrollAxisRange({ 0f }, { 5f })
+                    onClick { true }
+                    onLongClick { true }
+                    copyText { true }
+                    pasteText { true }
+                    cutText { true }
+                    setText { true }
+                    setSelection { _, _, _ -> true }
+                    dismiss { true }
+                    expand { true }
+                    collapse { true }
+                }
             )
         }
         val virtualViewId = rule.onNodeWithTag(tag).semanticsId
@@ -297,12 +281,10 @@
         // Arrange.
         rule.setContentWithAccessibilityEnabled {
             Box(
-                Modifier
-                    .size(10.dp)
-                    .semantics(mergeDescendants = true) {
-                        testTag = tag
-                        role = Role.Button
-                    }
+                Modifier.size(10.dp).semantics(mergeDescendants = true) {
+                    testTag = tag
+                    role = Role.Button
+                }
             )
         }
         val virtualViewId = rule.onNodeWithTag(tag).semanticsId
@@ -319,12 +301,10 @@
         // Arrange.
         rule.setContentWithAccessibilityEnabled {
             Box(
-                Modifier
-                    .size(10.dp)
-                    .semantics(mergeDescendants = true) {
-                        testTag = tag
-                        role = Role.Switch
-                    }
+                Modifier.size(10.dp).semantics(mergeDescendants = true) {
+                    testTag = tag
+                    role = Role.Switch
+                }
             )
         }
         val virtualViewId = rule.onNodeWithTag(tag).semanticsId
@@ -341,12 +321,10 @@
         // Arrange.
         rule.setContentWithAccessibilityEnabled {
             Box(
-                Modifier
-                    .size(10.dp)
-                    .semantics(mergeDescendants = true) {
-                        testTag = tag
-                        role = Role.Switch
-                    }
+                Modifier.size(10.dp).semantics(mergeDescendants = true) {
+                    testTag = tag
+                    role = Role.Switch
+                }
             )
         }
         val virtualViewId = rule.onNodeWithTag(tag).semanticsId
@@ -363,12 +341,10 @@
         // Arrange.
         rule.setContentWithAccessibilityEnabled {
             Box(
-                Modifier
-                    .size(10.dp)
-                    .semantics(mergeDescendants = true) {
-                        testTag = tag
-                        role = Role.Checkbox
-                    }
+                Modifier.size(10.dp).semantics(mergeDescendants = true) {
+                    testTag = tag
+                    role = Role.Checkbox
+                }
             )
         }
         val virtualViewId = rule.onNodeWithTag(tag).semanticsId
@@ -385,12 +361,10 @@
         // Arrange.
         rule.setContentWithAccessibilityEnabled {
             Box(
-                Modifier
-                    .size(10.dp)
-                    .semantics(mergeDescendants = true) {
-                        testTag = tag
-                        role = Role.RadioButton
-                    }
+                Modifier.size(10.dp).semantics(mergeDescendants = true) {
+                    testTag = tag
+                    role = Role.RadioButton
+                }
             )
         }
         val virtualViewId = rule.onNodeWithTag(tag).semanticsId
@@ -407,12 +381,10 @@
         // Arrange.
         rule.setContentWithAccessibilityEnabled {
             Box(
-                Modifier
-                    .size(10.dp)
-                    .semantics(mergeDescendants = true) {
-                        testTag = tag
-                        role = Role.Tab
-                    }
+                Modifier.size(10.dp).semantics(mergeDescendants = true) {
+                    testTag = tag
+                    role = Role.Tab
+                }
             )
         }
         val virtualViewId = rule.onNodeWithTag(tag).semanticsId
@@ -429,12 +401,10 @@
         // Arrange.
         rule.setContentWithAccessibilityEnabled {
             Box(
-                Modifier
-                    .size(10.dp)
-                    .semantics(mergeDescendants = true) {
-                        testTag = tag
-                        role = Role.Image
-                    }
+                Modifier.size(10.dp).semantics(mergeDescendants = true) {
+                    testTag = tag
+                    role = Role.Image
+                }
             )
         }
         val virtualViewId = rule.onNodeWithTag(tag).semanticsId
@@ -451,11 +421,7 @@
     fun testIsNotImportant_empty() {
         // Arrange.
         rule.setContentWithAccessibilityEnabled {
-            Box(
-                Modifier
-                    .size(10.dp)
-                    .semantics(mergeDescendants = false) { testTag = tag }
-            )
+            Box(Modifier.size(10.dp).semantics(mergeDescendants = false) { testTag = tag })
         }
         val virtualViewId = rule.onNodeWithTag(tag).semanticsId
 
@@ -471,11 +437,7 @@
     fun testIsImportant_emptyMerging() {
         // Arrange.
         rule.setContentWithAccessibilityEnabled {
-            Box(
-                Modifier
-                    .size(10.dp)
-                    .semantics(mergeDescendants = true) { testTag = tag }
-            )
+            Box(Modifier.size(10.dp).semantics(mergeDescendants = true) { testTag = tag })
         }
         val virtualViewId = rule.onNodeWithTag(tag).semanticsId
 
@@ -493,13 +455,11 @@
         // Arrange.
         rule.setContentWithAccessibilityEnabled {
             Box(
-                Modifier
-                    .size(10.dp)
-                    .semantics(mergeDescendants = false) {
-                        testTag = tag
-                        testTagsAsResourceId = true
-                        invisibleToUser()
-                    }
+                Modifier.size(10.dp).semantics(mergeDescendants = false) {
+                    testTag = tag
+                    testTagsAsResourceId = true
+                    invisibleToUser()
+                }
             )
         }
         val virtualViewId = rule.onNodeWithTag(tag).semanticsId
@@ -517,13 +477,11 @@
         // Arrange.
         rule.setContentWithAccessibilityEnabled {
             Box(
-                Modifier
-                    .size(10.dp)
-                    .semantics(mergeDescendants = false) {
-                        testTag = tag
-                        stateDescription = "stateDescription"
-                        heading()
-                    }
+                Modifier.size(10.dp).semantics(mergeDescendants = false) {
+                    testTag = tag
+                    stateDescription = "stateDescription"
+                    heading()
+                }
             )
         }
         val virtualViewId = rule.onNodeWithTag(tag).semanticsId
@@ -541,12 +499,10 @@
         // Arrange.
         rule.setContentWithAccessibilityEnabled {
             Box(
-                Modifier
-                    .size(10.dp)
-                    .semantics(mergeDescendants = false) {
-                        testTag = tag
-                        onClick("clickLabel") { true }
-                    }
+                Modifier.size(10.dp).semantics(mergeDescendants = false) {
+                    testTag = tag
+                    onClick("clickLabel") { true }
+                }
             )
         }
         val virtualViewId = rule.onNodeWithTag(tag).semanticsId
@@ -567,12 +523,10 @@
         // Arrange.
         rule.setContentWithAccessibilityEnabled {
             Box(
-                Modifier
-                    .size(10.dp)
-                    .semantics(mergeDescendants = false) {
-                        testTag = tag
-                        pickedDate = 1445378400 // 2015-10-21
-                    }
+                Modifier.size(10.dp).semantics(mergeDescendants = false) {
+                    testTag = tag
+                    pickedDate = 1445378400 // 2015-10-21
+                }
             )
         }
         val virtualViewId = rule.onNodeWithTag(tag).semanticsId
@@ -590,8 +544,7 @@
         // Arrange.
         rule.setContentWithAccessibilityEnabled {
             Box(
-                Modifier
-                    .size(10.dp)
+                Modifier.size(10.dp)
                     .clearAndSetSemantics { testTag = tag }
                     .semantics(mergeDescendants = true) { stateDescription = "stateDescription" }
             ) {
@@ -612,12 +565,10 @@
         // Arrange.
         rule.setContentWithAccessibilityEnabled {
             Box(
-                Modifier
-                    .size(10.dp)
-                    .semantics(mergeDescendants = true) {
-                        testTag = tag
-                        text = AnnotatedString("")
-                    }
+                Modifier.size(10.dp).semantics(mergeDescendants = true) {
+                    testTag = tag
+                    text = AnnotatedString("")
+                }
             )
         }
         val virtualViewId = rule.onNodeWithTag(tag).semanticsId
@@ -637,20 +588,16 @@
         rule.setContentWithAccessibilityEnabled {
             Row {
                 Box(
-                    Modifier
-                        .size(10.dp)
-                        .semantics(mergeDescendants = true) {
-                            testTag = testTag1
-                            liveRegion = LiveRegionMode.Polite
-                        }
+                    Modifier.size(10.dp).semantics(mergeDescendants = true) {
+                        testTag = testTag1
+                        liveRegion = LiveRegionMode.Polite
+                    }
                 )
                 Box(
-                    Modifier
-                        .size(10.dp)
-                        .semantics(mergeDescendants = true) {
-                            testTag = testTag2
-                            liveRegion = LiveRegionMode.Assertive
-                        }
+                    Modifier.size(10.dp).semantics(mergeDescendants = true) {
+                        testTag = testTag2
+                        liveRegion = LiveRegionMode.Assertive
+                    }
                 )
             }
         }
@@ -678,12 +625,10 @@
         var liveRegionMode by mutableStateOf(LiveRegionMode.Polite)
         rule.setContentWithAccessibilityEnabled {
             Box(
-                Modifier
-                    .size(10.dp)
-                    .semantics(mergeDescendants = true) {
-                        testTag = tag
-                        liveRegion = liveRegionMode
-                    }
+                Modifier.size(10.dp).semantics(mergeDescendants = true) {
+                    testTag = tag
+                    liveRegion = liveRegionMode
+                }
             )
         }
         val virtualViewId = rule.onNodeWithTag(tag).semanticsId
@@ -716,13 +661,11 @@
         rule.mainClock.autoAdvance = false
         rule.setContentWithAccessibilityEnabled {
             Box(
-                Modifier
-                    .size(10.dp)
-                    .semantics(mergeDescendants = true) {
-                        testTag = tag
-                        progressBarRangeInfo = ProgressBarRangeInfo(0.5f, 0f..1f, 6)
-                        setProgress(setProgressActionLabel) { true }
-                    }
+                Modifier.size(10.dp).semantics(mergeDescendants = true) {
+                    testTag = tag
+                    progressBarRangeInfo = ProgressBarRangeInfo(0.5f, 0f..1f, 6)
+                    setProgress(setProgressActionLabel) { true }
+                }
             )
         }
         val virtualViewId = rule.onNodeWithTag(tag).semanticsId
@@ -758,19 +701,17 @@
         val text = "hello"
         rule.setContentWithAccessibilityEnabled {
             Box(
-                Modifier
-                    .size(10.dp)
-                    .semantics(mergeDescendants = true) {
-                        testTag = tag
-                        editableText = AnnotatedString(text)
-                        textSelectionRange = TextRange(1)
-                        focused = true
-                        maxTextLength = 100
-                        isEditable = true
-                        getTextLayoutResult { true }
-                        setText(setTextActionLabel) { true }
-                        setSelection(setSelectionActionLabel) { _, _, _ -> true }
-                    }
+                Modifier.size(10.dp).semantics(mergeDescendants = true) {
+                    testTag = tag
+                    editableText = AnnotatedString(text)
+                    textSelectionRange = TextRange(1)
+                    focused = true
+                    maxTextLength = 100
+                    isEditable = true
+                    getTextLayoutResult { true }
+                    setText(setTextActionLabel) { true }
+                    setSelection(setSelectionActionLabel) { _, _, _ -> true }
+                }
             )
         }
         val virtualViewId = rule.onNodeWithTag(tag).semanticsId
@@ -797,10 +738,8 @@
                         AccessibilityNodeInfoCompat.ACTION_SET_TEXT,
                         setTextActionLabel
                     ),
-                    AccessibilityActionCompat
-                        .ACTION_NEXT_AT_MOVEMENT_GRANULARITY,
-                    AccessibilityActionCompat
-                        .ACTION_PREVIOUS_AT_MOVEMENT_GRANULARITY
+                    AccessibilityActionCompat.ACTION_NEXT_AT_MOVEMENT_GRANULARITY,
+                    AccessibilityActionCompat.ACTION_PREVIOUS_AT_MOVEMENT_GRANULARITY
                 )
             if (SDK_INT >= 26) {
                 assertThat(info.unwrap().availableExtraData)
@@ -821,18 +760,16 @@
         val text = "hello"
         rule.setContentWithAccessibilityEnabled {
             Box(
-                Modifier
-                    .size(10.dp)
-                    .semantics(mergeDescendants = true) {
-                        testTag = tag
-                        editableText = AnnotatedString(text)
-                        textSelectionRange = TextRange(1)
-                        focused = true
-                        isEditable = true
-                        getTextLayoutResult { true }
-                        setText(setTextActionLabel) { true }
-                        setSelection(setSelectionActionLabel) { _, _, _ -> true }
-                    }
+                Modifier.size(10.dp).semantics(mergeDescendants = true) {
+                    testTag = tag
+                    editableText = AnnotatedString(text)
+                    textSelectionRange = TextRange(1)
+                    focused = true
+                    isEditable = true
+                    getTextLayoutResult { true }
+                    setText(setTextActionLabel) { true }
+                    setSelection(setSelectionActionLabel) { _, _, _ -> true }
+                }
             )
         }
         val virtualViewId = rule.onNodeWithTag(tag).semanticsId
@@ -841,9 +778,7 @@
         val info = rule.runOnIdle { androidComposeView.createAccessibilityNodeInfo(virtualViewId) }
 
         // Assert.
-        rule.runOnIdle {
-            assertThat(info.maxTextLength).isEqualTo(-1)
-        }
+        rule.runOnIdle { assertThat(info.maxTextLength).isEqualTo(-1) }
     }
 
     @Test
@@ -851,17 +786,15 @@
         // Arrange.
         rule.setContentWithAccessibilityEnabled {
             Box(
-                Modifier
-                    .size(10.dp)
-                    .semantics(mergeDescendants = true) {
-                        testTag = tag
-                        editableText = AnnotatedString("text")
-                        textSelectionRange = TextRange(1)
-                        focused = true
-                        getTextLayoutResult { true }
-                        setText { true }
-                        setSelection { _, _, _ -> true }
-                    }
+                Modifier.size(10.dp).semantics(mergeDescendants = true) {
+                    testTag = tag
+                    editableText = AnnotatedString("text")
+                    textSelectionRange = TextRange(1)
+                    focused = true
+                    getTextLayoutResult { true }
+                    setText { true }
+                    setSelection { _, _, _ -> true }
+                }
             )
         }
         val virtualViewId = rule.onNodeWithTag(tag).semanticsId
@@ -871,13 +804,14 @@
 
         // Assert.
         rule.runOnIdle {
-            assertThat(info.movementGranularities).isEqualTo(
-                AccessibilityNodeInfoCompat.MOVEMENT_GRANULARITY_CHARACTER or
-                    AccessibilityNodeInfoCompat.MOVEMENT_GRANULARITY_WORD or
-                    AccessibilityNodeInfoCompat.MOVEMENT_GRANULARITY_PARAGRAPH or
-                    AccessibilityNodeInfoCompat.MOVEMENT_GRANULARITY_LINE or
-                    AccessibilityNodeInfoCompat.MOVEMENT_GRANULARITY_PAGE
-            )
+            assertThat(info.movementGranularities)
+                .isEqualTo(
+                    AccessibilityNodeInfoCompat.MOVEMENT_GRANULARITY_CHARACTER or
+                        AccessibilityNodeInfoCompat.MOVEMENT_GRANULARITY_WORD or
+                        AccessibilityNodeInfoCompat.MOVEMENT_GRANULARITY_PARAGRAPH or
+                        AccessibilityNodeInfoCompat.MOVEMENT_GRANULARITY_LINE or
+                        AccessibilityNodeInfoCompat.MOVEMENT_GRANULARITY_PAGE
+                )
         }
     }
 
@@ -886,16 +820,14 @@
         // Arrange.
         rule.setContentWithAccessibilityEnabled {
             Box(
-                Modifier
-                    .size(10.dp)
-                    .semantics(mergeDescendants = true) {
-                        testTag = tag
-                        editableText = AnnotatedString("text")
-                        textSelectionRange = TextRange(1)
-                        getTextLayoutResult { true }
-                        setText { true }
-                        setSelection { _, _, _ -> true }
-                    }
+                Modifier.size(10.dp).semantics(mergeDescendants = true) {
+                    testTag = tag
+                    editableText = AnnotatedString("text")
+                    textSelectionRange = TextRange(1)
+                    getTextLayoutResult { true }
+                    setText { true }
+                    setSelection { _, _, _ -> true }
+                }
             )
         }
         val virtualViewId = rule.onNodeWithTag(tag).semanticsId
@@ -905,11 +837,12 @@
 
         // Assert.
         rule.runOnIdle {
-            assertThat(info.movementGranularities).isEqualTo(
-                AccessibilityNodeInfoCompat.MOVEMENT_GRANULARITY_CHARACTER or
-                    AccessibilityNodeInfoCompat.MOVEMENT_GRANULARITY_WORD or
-                    AccessibilityNodeInfoCompat.MOVEMENT_GRANULARITY_PARAGRAPH
-            )
+            assertThat(info.movementGranularities)
+                .isEqualTo(
+                    AccessibilityNodeInfoCompat.MOVEMENT_GRANULARITY_CHARACTER or
+                        AccessibilityNodeInfoCompat.MOVEMENT_GRANULARITY_WORD or
+                        AccessibilityNodeInfoCompat.MOVEMENT_GRANULARITY_PARAGRAPH
+                )
         }
     }
 
@@ -919,12 +852,10 @@
         val errorDescription = "Invalid format"
         rule.setContentWithAccessibilityEnabled {
             Box(
-                Modifier
-                    .size(10.dp)
-                    .semantics(mergeDescendants = true) {
-                        testTag = tag
-                        error(errorDescription)
-                    }
+                Modifier.size(10.dp).semantics(mergeDescendants = true) {
+                    testTag = tag
+                    error(errorDescription)
+                }
             )
         }
         val virtualViewId = rule.onNodeWithTag(tag).semanticsId
@@ -944,12 +875,10 @@
         // Arrange.
         rule.setContentWithAccessibilityEnabled {
             Box(
-                Modifier
-                    .size(10.dp)
-                    .semantics(mergeDescendants = true) {
-                        testTag = tag
-                        error("")
-                    }
+                Modifier.size(10.dp).semantics(mergeDescendants = true) {
+                    testTag = tag
+                    error("")
+                }
             )
         }
         val virtualViewId = rule.onNodeWithTag(tag).semanticsId
@@ -970,13 +899,11 @@
         rule.setContentWithAccessibilityEnabled {
             LocalClipboardManager.current.setText(AnnotatedString("test"))
             Box(
-                Modifier
-                    .size(10.dp)
-                    .semantics(mergeDescendants = true) {
-                        testTag = tag
-                        focused = true
-                        pasteText { true }
-                    }
+                Modifier.size(10.dp).semantics(mergeDescendants = true) {
+                    testTag = tag
+                    focused = true
+                    pasteText { true }
+                }
             )
         }
         val virtualViewId = rule.onNodeWithTag(tag).semanticsId
@@ -999,12 +926,10 @@
         rule.setContentWithAccessibilityEnabled {
             LocalClipboardManager.current.setText(AnnotatedString("test"))
             Box(
-                Modifier
-                    .size(10.dp)
-                    .semantics(mergeDescendants = true) {
-                        testTag = tag
-                        pasteText { true }
-                    }
+                Modifier.size(10.dp).semantics(mergeDescendants = true) {
+                    testTag = tag
+                    pasteText { true }
+                }
             )
         }
         val virtualViewId = rule.onNodeWithTag(tag).semanticsId
@@ -1027,12 +952,10 @@
         val actionLabel = "send"
         rule.setContentWithAccessibilityEnabled {
             Box(
-                Modifier
-                    .size(10.dp)
-                    .semantics(mergeDescendants = true) {
-                        testTag = tag
-                        onClick(label = actionLabel, action = null)
-                    }
+                Modifier.size(10.dp).semantics(mergeDescendants = true) {
+                    testTag = tag
+                    onClick(label = actionLabel, action = null)
+                }
             )
         }
         val virtualViewId = rule.onNodeWithTag(tag).semanticsId
@@ -1056,18 +979,9 @@
         // Arrange.
         rule.setContentWithAccessibilityEnabled {
             Row(Modifier.size(10.toDp())) {
-                Box(
-                    Modifier
-                        .size(10.toDp())
-                        .semantics {})
-                Box(
-                    Modifier
-                        .size(10.toDp())
-                        .semantics {})
-                Box(
-                    Modifier
-                        .size(10.toDp())
-                        .semantics {})
+                Box(Modifier.size(10.toDp()).semantics {})
+                Box(Modifier.size(10.toDp()).semantics {})
+                Box(Modifier.size(10.toDp()).semantics {})
             }
         }
 
@@ -1083,9 +997,7 @@
     fun testUncoveredNodes_zeroBoundsRoot_included() {
         // Arrange.
         val bounds = Rect(-1, -1, -1, -1)
-        rule.setContentWithAccessibilityEnabled {
-            Box { }
-        }
+        rule.setContentWithAccessibilityEnabled { Box {} }
 
         // Act.
         rule.runOnIdle {
@@ -1104,13 +1016,11 @@
         rule.mainClock.autoAdvance = false
         rule.setContentWithAccessibilityEnabled {
             Box(
-                Modifier
-                    .size(10.dp)
-                    .semantics(mergeDescendants = true) {
-                        if (hasContentDescription) {
-                            contentDescription = "Hello" // To trigger content description casting.
-                        }
+                Modifier.size(10.dp).semantics(mergeDescendants = true) {
+                    if (hasContentDescription) {
+                        contentDescription = "Hello" // To trigger content description casting.
                     }
+                }
             )
         }
 
@@ -1143,14 +1053,12 @@
         rule.mainClock.autoAdvance = false
         rule.setContentWithAccessibilityEnabled {
             Box(
-                Modifier
-                    .size(10.dp)
-                    .semantics(mergeDescendants = true) {
-                        setText { true }
-                        if (passwordVisible) password()
-                        textSelectionRange = TextRange(4)
-                        editableText = AnnotatedString(if (passwordVisible) "1234" else "****")
-                    }
+                Modifier.size(10.dp).semantics(mergeDescendants = true) {
+                    setText { true }
+                    if (passwordVisible) password()
+                    textSelectionRange = TextRange(4)
+                    editableText = AnnotatedString(if (passwordVisible) "1234" else "****")
+                }
             )
         }
 
@@ -1177,14 +1085,12 @@
         rule.mainClock.autoAdvance = false
         rule.setContentWithAccessibilityEnabled {
             Box(
-                Modifier
-                    .size(10.dp)
-                    .semantics(mergeDescendants = true) {
-                        setText { true }
-                        if (passwordVisible) password()
-                        textSelectionRange = TextRange(4)
-                        editableText = AnnotatedString(if (passwordVisible) "1234" else "****")
-                    }
+                Modifier.size(10.dp).semantics(mergeDescendants = true) {
+                    setText { true }
+                    if (passwordVisible) password()
+                    textSelectionRange = TextRange(4)
+                    editableText = AnnotatedString(if (passwordVisible) "1234" else "****")
+                }
             )
         }
 
@@ -1207,14 +1113,12 @@
         rule.mainClock.autoAdvance = false
         rule.setContentWithAccessibilityEnabled {
             Box(
-                Modifier
-                    .size(10.dp)
-                    .semantics(mergeDescendants = true) {
-                        setText { true }
-                        if (passwordVisible) password()
-                        textSelectionRange = TextRange(4)
-                        editableText = AnnotatedString(if (passwordVisible) "1234" else "****")
-                    }
+                Modifier.size(10.dp).semantics(mergeDescendants = true) {
+                    setText { true }
+                    if (passwordVisible) password()
+                    textSelectionRange = TextRange(4)
+                    editableText = AnnotatedString(if (passwordVisible) "1234" else "****")
+                }
             )
         }
 
@@ -1260,14 +1164,12 @@
         rule.mainClock.autoAdvance = false
         rule.setContentWithAccessibilityEnabled {
             Box(
-                Modifier
-                    .size(10.dp)
-                    .semantics(mergeDescendants = true) {
-                        setText { true }
-                        if (passwordVisible) password()
-                        textSelectionRange = TextRange(4)
-                        editableText = AnnotatedString(if (passwordVisible) "1234" else "****")
-                    }
+                Modifier.size(10.dp).semantics(mergeDescendants = true) {
+                    setText { true }
+                    if (passwordVisible) password()
+                    textSelectionRange = TextRange(4)
+                    editableText = AnnotatedString(if (passwordVisible) "1234" else "****")
+                }
             )
         }
 
@@ -1296,9 +1198,7 @@
                         fromIndex = 4
                         toIndex = 4
                     },
-                    AccessibilityEvent().apply {
-                        eventType = TYPE_WINDOW_CONTENT_CHANGED
-                    },
+                    AccessibilityEvent().apply { eventType = TYPE_WINDOW_CONTENT_CHANGED },
                 )
         }
     }
@@ -1310,14 +1210,12 @@
         rule.mainClock.autoAdvance = false
         rule.setContentWithAccessibilityEnabled {
             Box(
-                Modifier
-                    .size(10.dp)
-                    .semantics(mergeDescendants = true) {
-                        testTag = tag
-                        setText { true }
-                        textSelectionRange = TextRange(4)
-                        editableText = AnnotatedString(if (!textChanged) "1234" else "1235")
-                    }
+                Modifier.size(10.dp).semantics(mergeDescendants = true) {
+                    testTag = tag
+                    setText { true }
+                    textSelectionRange = TextRange(4)
+                    editableText = AnnotatedString(if (!textChanged) "1234" else "1235")
+                }
             )
         }
         val virtualId = rule.onNodeWithTag(tag).semanticsId
@@ -1352,14 +1250,12 @@
         rule.mainClock.autoAdvance = false
         rule.setContentWithAccessibilityEnabled {
             Box(
-                Modifier
-                    .size(10.dp)
-                    .semantics(mergeDescendants = true) {
-                        setText { true }
-                        password()
-                        textSelectionRange = TextRange(4)
-                        editableText = AnnotatedString(if (!textChanged) "1234" else "1235")
-                    }
+                Modifier.size(10.dp).semantics(mergeDescendants = true) {
+                    setText { true }
+                    password()
+                    textSelectionRange = TextRange(4)
+                    editableText = AnnotatedString(if (!textChanged) "1234" else "1235")
+                }
             )
         }
 
@@ -1395,7 +1291,10 @@
             androidComposeView = LocalView.current as AndroidComposeView
             with(androidComposeView.composeAccessibilityDelegate) {
                 accessibilityForceEnabledForTesting = true
-                onSendAccessibilityEvent = { dispatchedAccessibilityEvents += it; false }
+                onSendAccessibilityEvent = {
+                    dispatchedAccessibilityEvents += it
+                    false
+                }
             }
             content()
         }
@@ -1419,17 +1318,19 @@
         internal val IdAndLabel =
             Correspondence.from<AccessibilityActionCompat, AccessibilityActionCompat>(
                 { actual, expected ->
-                    actual != null && expected != null &&
+                    actual != null &&
+                        expected != null &&
                         actual.id == expected.id &&
                         actual.label == expected.label
                 },
                 "has same id and label as"
             )
 
-        internal val AccessibilityEventComparator = Correspondence
-            .from<AccessibilityEvent, AccessibilityEvent>(
+        internal val AccessibilityEventComparator =
+            Correspondence.from<AccessibilityEvent, AccessibilityEvent>(
                 { actual, expected ->
-                    actual != null && expected != null &&
+                    actual != null &&
+                        expected != null &&
                         actual.eventType == expected.eventType &&
                         actual.eventTime == expected.eventTime &&
                         actual.packageName == expected.packageName &&
@@ -1466,21 +1367,24 @@
     }
 
     private val View.composeAccessibilityDelegate: AndroidComposeViewAccessibilityDelegateCompat
-        get() = ViewCompat.getAccessibilityDelegate(this)
-            as AndroidComposeViewAccessibilityDelegateCompat
+        get() =
+            ViewCompat.getAccessibilityDelegate(this)
+                as AndroidComposeViewAccessibilityDelegateCompat
 
     // TODO(b/272068594): Add api to fetch the semantics id from SemanticsNodeInteraction directly.
-    private val SemanticsNodeInteraction.semanticsId: Int get() = fetchSemanticsNode().id
+    private val SemanticsNodeInteraction.semanticsId: Int
+        get() = fetchSemanticsNode().id
 
     // TODO(b/304359126): Move this to AccessibilityEventCompat and use it wherever we use obtain().
-    private fun AccessibilityEvent(): AccessibilityEvent = if (SDK_INT >= R) {
-        android.view.accessibility.AccessibilityEvent()
-    } else {
-        @Suppress("DEPRECATION")
-        AccessibilityEvent.obtain()
-    }.apply {
-        packageName = "androidx.compose.ui.test"
-        className = "android.view.View"
-        isEnabled = true
-    }
+    private fun AccessibilityEvent(): AccessibilityEvent =
+        if (SDK_INT >= R) {
+                android.view.accessibility.AccessibilityEvent()
+            } else {
+                @Suppress("DEPRECATION") AccessibilityEvent.obtain()
+            }
+            .apply {
+                packageName = "androidx.compose.ui.test"
+                className = "android.view.View"
+                isEnabled = true
+            }
 }
diff --git a/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/AndroidLayoutDrawTest.kt b/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/AndroidLayoutDrawTest.kt
index ad00359..52bb5ad 100644
--- a/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/AndroidLayoutDrawTest.kt
+++ b/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/AndroidLayoutDrawTest.kt
@@ -131,20 +131,18 @@
 import org.junit.runner.RunWith
 
 /**
- * Corresponds to ContainingViewTest, but tests single composition measure, layout and draw.
- * It also tests that layouts with both Layout and MeasureBox work.
+ * Corresponds to ContainingViewTest, but tests single composition measure, layout and draw. It also
+ * tests that layouts with both Layout and MeasureBox work.
  */
 @MediumTest
 @RunWith(AndroidJUnit4::class)
 class AndroidLayoutDrawTest {
     @Suppress("DEPRECATION")
     @get:Rule
-    val activityTestRule = androidx.test.rule.ActivityTestRule<TestActivity>(
-        TestActivity::class.java
-    )
+    val activityTestRule =
+        androidx.test.rule.ActivityTestRule<TestActivity>(TestActivity::class.java)
 
-    @get:Rule
-    val excessiveAssertions = AndroidOwnerExtraAssertionsRule()
+    @get:Rule val excessiveAssertions = AndroidOwnerExtraAssertionsRule()
     private lateinit var activity: TestActivity
     private lateinit var drawLatch: CountDownLatch
     private lateinit var density: Density
@@ -192,36 +190,37 @@
         drawLatch = CountDownLatch(1)
         var compositingApplied = false
         activity.runOnUiThread {
-            compositingApplied = when (Build.VERSION.SDK_INT) {
-                // Use public RenderNode API
-                in Build.VERSION_CODES.Q..Int.MAX_VALUE ->
-                    verifyRenderNode29CompositingStrategy(
-                        CompositingStrategy.Auto,
-                        expectedCompositing = false,
-                        expectedOverlappingRendering = true
-                    )
-                // Cannot access private APIs on P
-                Build.VERSION_CODES.P ->
-                    verifyViewLayerCompositingStrategy(
-                        CompositingStrategy.Auto,
-                        View.LAYER_TYPE_NONE,
-                        true
-                    )
-                // Use stub access to framework RenderNode API
-                in Build.VERSION_CODES.M..Int.MAX_VALUE ->
-                    verifyRenderNode23CompositingStrategy(
-                        CompositingStrategy.Auto,
-                        expectedLayerType = View.LAYER_TYPE_NONE,
-                        expectedOverlappingRendering = true
-                    )
-                // No RenderNodes, use Views instead
-                else ->
-                    verifyViewLayerCompositingStrategy(
-                        CompositingStrategy.Auto,
-                        View.LAYER_TYPE_NONE,
-                    true
-                    )
-            }
+            compositingApplied =
+                when (Build.VERSION.SDK_INT) {
+                    // Use public RenderNode API
+                    in Build.VERSION_CODES.Q..Int.MAX_VALUE ->
+                        verifyRenderNode29CompositingStrategy(
+                            CompositingStrategy.Auto,
+                            expectedCompositing = false,
+                            expectedOverlappingRendering = true
+                        )
+                    // Cannot access private APIs on P
+                    Build.VERSION_CODES.P ->
+                        verifyViewLayerCompositingStrategy(
+                            CompositingStrategy.Auto,
+                            View.LAYER_TYPE_NONE,
+                            true
+                        )
+                    // Use stub access to framework RenderNode API
+                    in Build.VERSION_CODES.M..Int.MAX_VALUE ->
+                        verifyRenderNode23CompositingStrategy(
+                            CompositingStrategy.Auto,
+                            expectedLayerType = View.LAYER_TYPE_NONE,
+                            expectedOverlappingRendering = true
+                        )
+                    // No RenderNodes, use Views instead
+                    else ->
+                        verifyViewLayerCompositingStrategy(
+                            CompositingStrategy.Auto,
+                            View.LAYER_TYPE_NONE,
+                            true
+                        )
+                }
             drawLatch.countDown()
         }
 
@@ -234,36 +233,37 @@
         drawLatch = CountDownLatch(1)
         var compositingApplied = false
         activity.runOnUiThread {
-            compositingApplied = when (Build.VERSION.SDK_INT) {
-                // Use public RenderNode API
-                in Build.VERSION_CODES.Q..Int.MAX_VALUE ->
-                    verifyRenderNode29CompositingStrategy(
-                        CompositingStrategy.ModulateAlpha,
-                        expectedCompositing = false,
-                        expectedOverlappingRendering = false
-                    )
-                // Cannot access private APIs on P
-                Build.VERSION_CODES.P ->
-                    verifyViewLayerCompositingStrategy(
-                        CompositingStrategy.ModulateAlpha,
-                        View.LAYER_TYPE_NONE,
-                        false
-                    )
-                // Use stub access to framework RenderNode API
-                in Build.VERSION_CODES.M..Int.MAX_VALUE ->
-                    verifyRenderNode23CompositingStrategy(
-                        CompositingStrategy.ModulateAlpha,
-                        expectedLayerType = View.LAYER_TYPE_NONE,
-                        expectedOverlappingRendering = false
-                    )
-                // No RenderNodes, use Views instead
-                else ->
-                    verifyViewLayerCompositingStrategy(
-                        CompositingStrategy.ModulateAlpha,
-                        View.LAYER_TYPE_NONE,
-                        false
-                    )
-            }
+            compositingApplied =
+                when (Build.VERSION.SDK_INT) {
+                    // Use public RenderNode API
+                    in Build.VERSION_CODES.Q..Int.MAX_VALUE ->
+                        verifyRenderNode29CompositingStrategy(
+                            CompositingStrategy.ModulateAlpha,
+                            expectedCompositing = false,
+                            expectedOverlappingRendering = false
+                        )
+                    // Cannot access private APIs on P
+                    Build.VERSION_CODES.P ->
+                        verifyViewLayerCompositingStrategy(
+                            CompositingStrategy.ModulateAlpha,
+                            View.LAYER_TYPE_NONE,
+                            false
+                        )
+                    // Use stub access to framework RenderNode API
+                    in Build.VERSION_CODES.M..Int.MAX_VALUE ->
+                        verifyRenderNode23CompositingStrategy(
+                            CompositingStrategy.ModulateAlpha,
+                            expectedLayerType = View.LAYER_TYPE_NONE,
+                            expectedOverlappingRendering = false
+                        )
+                    // No RenderNodes, use Views instead
+                    else ->
+                        verifyViewLayerCompositingStrategy(
+                            CompositingStrategy.ModulateAlpha,
+                            View.LAYER_TYPE_NONE,
+                            false
+                        )
+                }
             drawLatch.countDown()
         }
 
@@ -276,36 +276,37 @@
         drawLatch = CountDownLatch(1)
         var compositingApplied = false
         activity.runOnUiThread {
-            compositingApplied = when (Build.VERSION.SDK_INT) {
-                // Use public RenderNode API
-                in Build.VERSION_CODES.Q..Int.MAX_VALUE ->
-                    verifyRenderNode29CompositingStrategy(
-                        CompositingStrategy.Offscreen,
-                        expectedCompositing = true,
-                        expectedOverlappingRendering = true
-                    )
-                // Cannot access private APIs on P
-                Build.VERSION_CODES.P ->
-                    verifyViewLayerCompositingStrategy(
-                        CompositingStrategy.Offscreen,
-                        View.LAYER_TYPE_HARDWARE,
-                        true
-                    )
-                // Use stub access to framework RenderNode API
-                in Build.VERSION_CODES.M..Int.MAX_VALUE ->
-                    verifyRenderNode23CompositingStrategy(
-                        CompositingStrategy.Offscreen,
-                        expectedLayerType = View.LAYER_TYPE_HARDWARE,
-                        expectedOverlappingRendering = true
-                    )
-                // No RenderNodes, use Views instead
-                else ->
-                    verifyViewLayerCompositingStrategy(
-                        CompositingStrategy.Offscreen,
-                        View.LAYER_TYPE_HARDWARE,
-                        true
-                    )
-            }
+            compositingApplied =
+                when (Build.VERSION.SDK_INT) {
+                    // Use public RenderNode API
+                    in Build.VERSION_CODES.Q..Int.MAX_VALUE ->
+                        verifyRenderNode29CompositingStrategy(
+                            CompositingStrategy.Offscreen,
+                            expectedCompositing = true,
+                            expectedOverlappingRendering = true
+                        )
+                    // Cannot access private APIs on P
+                    Build.VERSION_CODES.P ->
+                        verifyViewLayerCompositingStrategy(
+                            CompositingStrategy.Offscreen,
+                            View.LAYER_TYPE_HARDWARE,
+                            true
+                        )
+                    // Use stub access to framework RenderNode API
+                    in Build.VERSION_CODES.M..Int.MAX_VALUE ->
+                        verifyRenderNode23CompositingStrategy(
+                            CompositingStrategy.Offscreen,
+                            expectedLayerType = View.LAYER_TYPE_HARDWARE,
+                            expectedOverlappingRendering = true
+                        )
+                    // No RenderNodes, use Views instead
+                    else ->
+                        verifyViewLayerCompositingStrategy(
+                            CompositingStrategy.Offscreen,
+                            View.LAYER_TYPE_HARDWARE,
+                            true
+                        )
+                }
             drawLatch.countDown()
         }
 
@@ -326,20 +327,21 @@
             // Ensure that each implementation of camera distance consumes positive pixel values
             // properly. Layer implementations backed by View should be compatible on all
             // API versions
-            cameraDistanceApplied = when (Build.VERSION.SDK_INT) {
-                // Use public RenderNode API
-                in Build.VERSION_CODES.Q..Int.MAX_VALUE ->
-                    verifyRenderNode29CameraDistance(targetCameraDistance) &&
-                        verifyViewLayerCameraDistance(targetCameraDistance)
-                // Cannot access private APIs on P
-                Build.VERSION_CODES.P -> verifyViewLayerCameraDistance(targetCameraDistance)
-                // Use stub access to framework RenderNode API
-                in Build.VERSION_CODES.M..Int.MAX_VALUE ->
-                    verifyRenderNode23CameraDistance(targetCameraDistance) &&
-                        verifyViewLayerCameraDistance(targetCameraDistance)
-                // No RenderNodes, use Views instead
-                else -> verifyViewLayerCameraDistance(targetCameraDistance)
-            }
+            cameraDistanceApplied =
+                when (Build.VERSION.SDK_INT) {
+                    // Use public RenderNode API
+                    in Build.VERSION_CODES.Q..Int.MAX_VALUE ->
+                        verifyRenderNode29CameraDistance(targetCameraDistance) &&
+                            verifyViewLayerCameraDistance(targetCameraDistance)
+                    // Cannot access private APIs on P
+                    Build.VERSION_CODES.P -> verifyViewLayerCameraDistance(targetCameraDistance)
+                    // Use stub access to framework RenderNode API
+                    in Build.VERSION_CODES.M..Int.MAX_VALUE ->
+                        verifyRenderNode23CameraDistance(targetCameraDistance) &&
+                            verifyViewLayerCameraDistance(targetCameraDistance)
+                    // No RenderNodes, use Views instead
+                    else -> verifyViewLayerCameraDistance(targetCameraDistance)
+                }
             drawLatch.countDown()
         }
 
@@ -354,12 +356,14 @@
         expectedCompositing: Boolean,
         expectedOverlappingRendering: Boolean
     ): Boolean {
-        val node = RenderNodeApi29(AndroidComposeView(
-            activity,
-            Executors.newFixedThreadPool(3).asCoroutineDispatcher()
-        )).apply {
-            this.compositingStrategy = compositingStrategy
-        }
+        val node =
+            RenderNodeApi29(
+                    AndroidComposeView(
+                        activity,
+                        Executors.newFixedThreadPool(3).asCoroutineDispatcher()
+                    )
+                )
+                .apply { this.compositingStrategy = compositingStrategy }
         return expectedCompositing == node.isUsingCompositingLayer() &&
             expectedOverlappingRendering == node.hasOverlappingRendering()
     }
@@ -370,12 +374,14 @@
         expectedLayerType: Int,
         expectedOverlappingRendering: Boolean
     ): Boolean {
-        val node = RenderNodeApi23(AndroidComposeView(
-            activity,
-            Executors.newFixedThreadPool(3).asCoroutineDispatcher()
-        )).apply {
-            this.compositingStrategy = compositingStrategy
-        }
+        val node =
+            RenderNodeApi23(
+                    AndroidComposeView(
+                        activity,
+                        Executors.newFixedThreadPool(3).asCoroutineDispatcher()
+                    )
+                )
+                .apply { this.compositingStrategy = compositingStrategy }
         return expectedLayerType == node.getLayerType() &&
             expectedOverlappingRendering == node.hasOverlappingRendering()
     }
@@ -385,21 +391,24 @@
         expectedLayerType: Int,
         expectedOverlappingRendering: Boolean
     ): Boolean {
-        val view = ViewLayer(
-            AndroidComposeView(
-                activity,
-                Executors.newFixedThreadPool(3).asCoroutineDispatcher()
-            ),
-            ViewLayerContainer(activity),
-            { _, _ -> },
-            {}).apply {
-            val scope = ReusableGraphicsLayerScope()
-            scope.cameraDistance = cameraDistance
-            scope.compositingStrategy = compositingStrategy
-            scope.layoutDirection = LayoutDirection.Ltr
-            scope.graphicsDensity = Density(1f)
-            updateLayerProperties(scope)
-        }
+        val view =
+            ViewLayer(
+                    AndroidComposeView(
+                        activity,
+                        Executors.newFixedThreadPool(3).asCoroutineDispatcher()
+                    ),
+                    ViewLayerContainer(activity),
+                    { _, _ -> },
+                    {}
+                )
+                .apply {
+                    val scope = ReusableGraphicsLayerScope()
+                    scope.cameraDistance = cameraDistance
+                    scope.compositingStrategy = compositingStrategy
+                    scope.layoutDirection = LayoutDirection.Ltr
+                    scope.graphicsDensity = Density(1f)
+                    updateLayerProperties(scope)
+                }
         return expectedLayerType == view.layerType &&
             expectedOverlappingRendering == view.hasOverlappingRendering()
     }
@@ -408,40 +417,48 @@
     private fun verifyRenderNode29CameraDistance(cameraDistance: Float): Boolean =
         // Verify that the internal render node has the camera distance property
         // given to the wrapper
-        RenderNodeApi29(AndroidComposeView(
-            activity,
-            Executors.newFixedThreadPool(3).asCoroutineDispatcher()
-        )).apply {
-            this.cameraDistance = cameraDistance
-        }.dumpRenderNodeData().cameraDistance == cameraDistance
+        RenderNodeApi29(
+                AndroidComposeView(
+                    activity,
+                    Executors.newFixedThreadPool(3).asCoroutineDispatcher()
+                )
+            )
+            .apply { this.cameraDistance = cameraDistance }
+            .dumpRenderNodeData()
+            .cameraDistance == cameraDistance
 
     @RequiresApi(Build.VERSION_CODES.M)
     private fun verifyRenderNode23CameraDistance(cameraDistance: Float): Boolean =
         // Verify that the internal render node has the camera distance property
         // given to the wrapper
-        RenderNodeApi23(AndroidComposeView(
-            activity,
-            Executors.newFixedThreadPool(3).asCoroutineDispatcher()
-        )).apply {
-            this.cameraDistance = cameraDistance
-        }.dumpRenderNodeData().cameraDistance == -cameraDistance // Camera distance is negative
+        RenderNodeApi23(
+                AndroidComposeView(
+                    activity,
+                    Executors.newFixedThreadPool(3).asCoroutineDispatcher()
+                )
+            )
+            .apply { this.cameraDistance = cameraDistance }
+            .dumpRenderNodeData()
+            .cameraDistance == -cameraDistance // Camera distance is negative
 
     private fun verifyViewLayerCameraDistance(cameraDistance: Float): Boolean {
-        val layer = ViewLayer(
-            AndroidComposeView(
-                activity,
-                Executors.newFixedThreadPool(3).asCoroutineDispatcher()
-            ),
-            ViewLayerContainer(activity),
-            { _, _ -> },
-            {}
-        ).apply {
-            val scope = ReusableGraphicsLayerScope()
-            scope.cameraDistance = cameraDistance
-            scope.layoutDirection = LayoutDirection.Ltr
-            scope.graphicsDensity = Density(1f)
-            updateLayerProperties(scope)
-        }
+        val layer =
+            ViewLayer(
+                    AndroidComposeView(
+                        activity,
+                        Executors.newFixedThreadPool(3).asCoroutineDispatcher()
+                    ),
+                    ViewLayerContainer(activity),
+                    { _, _ -> },
+                    {}
+                )
+                .apply {
+                    val scope = ReusableGraphicsLayerScope()
+                    scope.cameraDistance = cameraDistance
+                    scope.layoutDirection = LayoutDirection.Ltr
+                    scope.graphicsDensity = Density(1f)
+                    updateLayerProperties(scope)
+                }
         // Verify that the camera distance is applied properly even after accounting for
         // the internal dp conversion within View
         return layer.cameraDistance == cameraDistance * layer.resources.displayMetrics.densityDpi
@@ -492,9 +509,7 @@
 
         drawLatch = CountDownLatch(1)
         val yellow = Color(0xFFFFFF00)
-        activityTestRule.runOnUiThreadIR {
-            model.innerColor = yellow
-        }
+        activityTestRule.runOnUiThreadIR { model.innerColor = yellow }
 
         validateSquareColors(outerColor = blue, innerColor = yellow, size = 10)
     }
@@ -508,9 +523,7 @@
         composeSquaresWithNestedRepaintBoundaries(model)
         validateSquareColors(outerColor = blue, innerColor = white, size = 10)
         drawLatch = CountDownLatch(1)
-        activityTestRule.runOnUiThreadIR {
-            model.size = 20
-        }
+        activityTestRule.runOnUiThreadIR { model.size = 20 }
 
         validateSquareColors(outerColor = blue, innerColor = white, size = 20)
     }
@@ -528,9 +541,7 @@
         validateSquareColors(outerColor = blue, innerColor = white, size = 10)
 
         positionLatch = CountDownLatch(1)
-        activityTestRule.runOnUiThreadIR {
-            offset.value = 20
-        }
+        activityTestRule.runOnUiThreadIR { offset.value = 20 }
 
         assertTrue(positionLatch!!.await(1, TimeUnit.SECONDS))
         validateSquareColors(outerColor = blue, innerColor = white, offset = 10, size = 10)
@@ -588,16 +599,13 @@
                 Padding(
                     size = (model.size * 3),
                     modifier = Modifier.fillColor(model, isInner = false)
-                ) {
-                }
+                ) {}
             }
         }
         validateSquareColors(outerColor = green, innerColor = green, size = 20)
 
         drawLatch = CountDownLatch(1)
-        activityTestRule.runOnUiThreadIR {
-            model.size = 30
-        }
+        activityTestRule.runOnUiThreadIR { model.size = 30 }
         validateSquareColors(outerColor = green, innerColor = green, size = 30)
 
         drawLatch = CountDownLatch(1)
@@ -625,11 +633,11 @@
                         Padding(
                             size = (model.size * 3),
                             modifier = Modifier.fillColor(model, isInner = false)
-                        ) { }
+                        ) {}
                         Padding(
                             size = model.size,
                             modifier = Modifier.fillColor(model, isInner = true)
-                        ) { }
+                        ) {}
                     },
                     measurePolicy = { measurables, constraints ->
                         val placeables = measurables.map { it.measure(constraints) }
@@ -653,35 +661,33 @@
 
         activityTestRule.runOnUiThreadIR {
             activity.setContent {
-                val contentDrawing = object : DrawModifier {
-                    override fun ContentDrawScope.draw() {
-                        // Fill the space with the outerColor
-                        drawRect(model.outerColor)
-                        val offset = size.width / 3
-                        // clip drawing to the inner rectangle
-                        clipRect(offset, offset, offset * 2, offset * 2) {
-                            this@draw.drawContent()
+                val contentDrawing =
+                    object : DrawModifier {
+                        override fun ContentDrawScope.draw() {
+                            // Fill the space with the outerColor
+                            drawRect(model.outerColor)
+                            val offset = size.width / 3
+                            // clip drawing to the inner rectangle
+                            clipRect(offset, offset, offset * 2, offset * 2) {
+                                this@draw.drawContent()
 
-                            // Fill bottom half with innerColor -- should be clipped
-                            drawRect(
-                                model.innerColor,
-                                topLeft = Offset(0f, size.height / 2f),
-                                size = Size(size.width, size.height / 2f)
-                            )
+                                // Fill bottom half with innerColor -- should be clipped
+                                drawRect(
+                                    model.innerColor,
+                                    topLeft = Offset(0f, size.height / 2f),
+                                    size = Size(size.width, size.height / 2f)
+                                )
+                            }
                         }
                     }
-                }
 
-                val paddingContent = Modifier.drawBehind {
-                    // Fill top half with innerColor -- should be clipped
-                    drawLatch.countDown()
-                    drawRect(
-                        model.innerColor,
-                        size = Size(size.width, size.height / 2f)
-                    )
-                }
-                Padding(size = (model.size * 3), modifier = contentDrawing.then(paddingContent)) {
-                }
+                val paddingContent =
+                    Modifier.drawBehind {
+                        // Fill top half with innerColor -- should be clipped
+                        drawLatch.countDown()
+                        drawRect(model.innerColor, size = Size(size.width, size.height / 2f))
+                    }
+                Padding(size = (model.size * 3), modifier = contentDrawing.then(paddingContent)) {}
             }
         }
         validateSquareColors(outerColor = green, innerColor = white, size = 20)
@@ -690,43 +696,48 @@
     @Test
     fun multiChildLayoutTest() {
         val childrenCount = 3
-        val childConstraints = arrayOf(
-            Constraints(),
-            Constraints.fixedWidth(50),
-            Constraints.fixedHeight(50)
-        )
+        val childConstraints =
+            arrayOf(Constraints(), Constraints.fixedWidth(50), Constraints.fixedHeight(50))
         val headerChildrenCount = 1
         val footerChildrenCount = 2
 
         activityTestRule.runOnUiThreadIR {
             activity.setContent {
-                val header = @Composable {
-                    Layout(
-                        measurePolicy = { _, constraints ->
-                            assertEquals(childConstraints[0], constraints)
-                            layout(0, 0) {}
-                        },
-                        content = {}, modifier = Modifier.layoutId("header")
-                    )
-                }
-                val footer = @Composable {
-                    Layout(
-                        measurePolicy = { _, constraints ->
-                            assertEquals(childConstraints[1], constraints)
-                            layout(0, 0) {}
-                        },
-                        content = {}, modifier = Modifier.layoutId("footer")
-                    )
-                    Layout(
-                        measurePolicy = { _, constraints ->
-                            assertEquals(childConstraints[2], constraints)
-                            layout(0, 0) {}
-                        },
-                        content = {}, modifier = Modifier.layoutId("footer")
-                    )
-                }
+                val header =
+                    @Composable {
+                        Layout(
+                            measurePolicy = { _, constraints ->
+                                assertEquals(childConstraints[0], constraints)
+                                layout(0, 0) {}
+                            },
+                            content = {},
+                            modifier = Modifier.layoutId("header")
+                        )
+                    }
+                val footer =
+                    @Composable {
+                        Layout(
+                            measurePolicy = { _, constraints ->
+                                assertEquals(childConstraints[1], constraints)
+                                layout(0, 0) {}
+                            },
+                            content = {},
+                            modifier = Modifier.layoutId("footer")
+                        )
+                        Layout(
+                            measurePolicy = { _, constraints ->
+                                assertEquals(childConstraints[2], constraints)
+                                layout(0, 0) {}
+                            },
+                            content = {},
+                            modifier = Modifier.layoutId("footer")
+                        )
+                    }
 
-                Layout({ header(); footer() }) { measurables, _ ->
+                Layout({
+                    header()
+                    footer()
+                }) { measurables, _ ->
                     assertEquals(childrenCount, measurables.size)
                     measurables.forEachIndexed { index, measurable ->
                         measurable.measure(childConstraints[index])
@@ -759,34 +770,32 @@
         activityTestRule.runOnUiThreadIR {
             activity.setContent {
                 Layout(
-                    modifier = remember {
-                        Modifier.drawBehind {
-                            drawRect(model.outerColor)
-                        }
-                    },
+                    modifier = remember { Modifier.drawBehind { drawRect(model.outerColor) } },
                     content = {
                         AtLeastSize(
                             size = model.size,
-                            modifier = Modifier.drawBehind {
-                                drawLatch.countDown()
-                                drawRect(model.innerColor)
-                            }
+                            modifier =
+                                Modifier.drawBehind {
+                                    drawLatch.countDown()
+                                    drawRect(model.innerColor)
+                                }
                         )
                     },
-                    measurePolicy = remember {
-                        MeasurePolicy { measurables, constraints ->
-                            measureCalls++
-                            layout(30, 30) {
-                                layoutCalls++
-                                layoutLatch.countDown()
-                                val placeable = measurables[0].measure(constraints)
-                                placeable.place(
-                                    (30 - placeable.width) / 2,
-                                    (30 - placeable.height) / 2
-                                )
+                    measurePolicy =
+                        remember {
+                            MeasurePolicy { measurables, constraints ->
+                                measureCalls++
+                                layout(30, 30) {
+                                    layoutCalls++
+                                    layoutLatch.countDown()
+                                    val placeable = measurables[0].measure(constraints)
+                                    placeable.place(
+                                        (30 - placeable.width) / 2,
+                                        (30 - placeable.height) / 2
+                                    )
+                                }
                             }
                         }
-                    }
                 )
             }
         }
@@ -797,9 +806,7 @@
         layoutCalls = 0
         measureCalls = 0
         drawLatch = CountDownLatch(1)
-        activityTestRule.runOnUiThreadIR {
-            model.size = 20
-        }
+        activityTestRule.runOnUiThreadIR { model.size = 20 }
 
         validateSquareColors(outerColor = blue, innerColor = white, size = 20, totalSize = 30)
         assertEquals(0, measureCalls)
@@ -809,23 +816,15 @@
     @Test
     fun testLayout_whenMeasuringIsDoneDuringPlacing() {
         @Composable
-        fun FixedSizeRow(
-            width: Int,
-            height: Int,
-            content: @Composable () -> Unit
-        ) {
+        fun FixedSizeRow(width: Int, height: Int, content: @Composable () -> Unit) {
             Layout(
                 content = content,
                 measurePolicy = { measurables, constraints ->
                     val resolvedWidth = constraints.constrainWidth(width)
                     val resolvedHeight = constraints.constrainHeight(height)
                     layout(resolvedWidth, resolvedHeight) {
-                        val childConstraints = Constraints(
-                            0,
-                            Constraints.Infinity,
-                            resolvedHeight,
-                            resolvedHeight
-                        )
+                        val childConstraints =
+                            Constraints(0, Constraints.Infinity, resolvedHeight, resolvedHeight)
                         var left = 0
                         for (measurable in measurables) {
                             val placeable = measurable.measure(childConstraints)
@@ -850,10 +849,11 @@
         ) {
             Layout(
                 content = {},
-                modifier = Modifier.drawBehind {
-                    drawn.value = true
-                    latch.countDown()
-                },
+                modifier =
+                    Modifier.drawBehind {
+                        drawn.value = true
+                        latch.countDown()
+                    },
                 measurePolicy = { _, constraints ->
                     measured.value = true
                     val resolvedWidth = constraints.constrainWidth(width)
@@ -908,8 +908,7 @@
                 AtLeastSize(size = 30, modifier = Modifier.fillColor(outerColor)) {
                     if (drawChild.value) {
                         Padding(size = 20) {
-                            AtLeastSize(size = 20, modifier = Modifier.fillColor(innerColor)) {
-                            }
+                            AtLeastSize(size = 20, modifier = Modifier.fillColor(innerColor)) {}
                         }
                     }
                 }
@@ -942,14 +941,12 @@
                             AtLeastSize(
                                 size = 10,
                                 modifier = Modifier.graphicsLayer().fillColor(Color.Cyan)
-                            ) {
-                            }
+                            ) {}
                         }
                     }
                 ) { measurables, constraints ->
                     layout(width = 20, height = 20) {
-                        measurables.first().measure(constraints)
-                            .place(offset.value, offset.value)
+                        measurables.first().measure(constraints).place(offset.value, offset.value)
                     }
                 }
             }
@@ -983,20 +980,22 @@
             activity.setContent {
                 AtLeastSize(
                     size = 30,
-                    modifier = Modifier.drawBehind {
-                        drawLatch.countDown()
-                        drawRect(outerColor)
-                    }
+                    modifier =
+                        Modifier.drawBehind {
+                            drawLatch.countDown()
+                            drawRect(outerColor)
+                        }
                 ) {
                     AtLeastSize(size = 30) {
                         if (drawChild.value) {
                             Padding(size = 10) {
                                 AtLeastSize(
                                     size = 10,
-                                    modifier = Modifier.drawBehind {
-                                        drawLatch.countDown()
-                                        drawRect(innerColor)
-                                    }
+                                    modifier =
+                                        Modifier.drawBehind {
+                                            drawLatch.countDown()
+                                            drawRect(innerColor)
+                                        }
                                 )
                             }
                         }
@@ -1026,19 +1025,21 @@
             activity.setContent {
                 AtLeastSize(
                     size = 30,
-                    modifier = Modifier.drawBehind {
-                        drawLatch.countDown()
-                        drawRect(outerColor)
-                    }
+                    modifier =
+                        Modifier.drawBehind {
+                            drawLatch.countDown()
+                            drawRect(outerColor)
+                        }
                 ) {
                     Padding(size = 20) {
                         if (drawChild.value) {
                             AtLeastSize(
                                 size = 20,
-                                modifier = Modifier.drawBehind {
-                                    drawLatch.countDown()
-                                    drawRect(innerColor)
-                                }
+                                modifier =
+                                    Modifier.drawBehind {
+                                        drawLatch.countDown()
+                                        drawRect(innerColor)
+                                    }
                             )
                         }
                     }
@@ -1062,48 +1063,48 @@
         val layoutLatch = CountDownLatch(1)
         activityTestRule.runOnUiThreadIR {
             activity.setContent {
-                val child1 = @Composable {
-                    Wrap {
-                        Layout(content = {}) { _, _ ->
-                            layout(
-                                0,
-                                0,
-                                mapOf(
-                                    TestVerticalLine to 10,
-                                    TestHorizontalLine to 20
-                                )
-                            ) { }
+                val child1 =
+                    @Composable {
+                        Wrap {
+                            Layout(content = {}) { _, _ ->
+                                layout(
+                                    0,
+                                    0,
+                                    mapOf(TestVerticalLine to 10, TestHorizontalLine to 20)
+                                ) {}
+                            }
                         }
                     }
-                }
-                val child2 = @Composable {
-                    Wrap {
-                        Layout(content = {}) { _, _ ->
-                            layout(
-                                0,
-                                0,
-                                mapOf(
-                                    TestVerticalLine to 20,
-                                    TestHorizontalLine to 10
-                                )
-                            ) { }
+                val child2 =
+                    @Composable {
+                        Wrap {
+                            Layout(content = {}) { _, _ ->
+                                layout(
+                                    0,
+                                    0,
+                                    mapOf(TestVerticalLine to 20, TestHorizontalLine to 10)
+                                ) {}
+                            }
                         }
                     }
-                }
-                val inner = @Composable {
-                    Layout({ child1(); child2() }) { measurables, constraints ->
-                        val placeable1 = measurables[0].measure(constraints)
-                        val placeable2 = measurables[1].measure(constraints)
-                        assertEquals(10, placeable1[TestVerticalLine])
-                        assertEquals(20, placeable1[TestHorizontalLine])
-                        assertEquals(20, placeable2[TestVerticalLine])
-                        assertEquals(10, placeable2[TestHorizontalLine])
-                        layout(0, 0) {
-                            placeable1.place(0, 0)
-                            placeable2.place(0, 0)
+                val inner =
+                    @Composable {
+                        Layout({
+                            child1()
+                            child2()
+                        }) { measurables, constraints ->
+                            val placeable1 = measurables[0].measure(constraints)
+                            val placeable2 = measurables[1].measure(constraints)
+                            assertEquals(10, placeable1[TestVerticalLine])
+                            assertEquals(20, placeable1[TestHorizontalLine])
+                            assertEquals(20, placeable2[TestVerticalLine])
+                            assertEquals(10, placeable2[TestHorizontalLine])
+                            layout(0, 0) {
+                                placeable1.place(0, 0)
+                                placeable2.place(0, 0)
+                            }
                         }
                     }
-                }
                 Layout(inner) { measurables, constraints ->
                     val placeable = measurables.first().measure(constraints)
                     assertEquals(10, placeable[TestVerticalLine])
@@ -1125,26 +1126,28 @@
         val layoutLatch = CountDownLatch(1)
         activityTestRule.runOnUiThreadIR {
             activity.setContent {
-                val child1 = @Composable {
-                    Layout(content = {}) { _, _ ->
-                        layout(0, 0, mapOf(TestLine1 to 10)) {}
+                val child1 =
+                    @Composable {
+                        Layout(content = {}) { _, _ -> layout(0, 0, mapOf(TestLine1 to 10)) {} }
                     }
-                }
-                val child2 = @Composable {
-                    Layout(content = {}) { _, _ ->
-                        layout(0, 0, mapOf(TestLine2 to 20)) { }
+                val child2 =
+                    @Composable {
+                        Layout(content = {}) { _, _ -> layout(0, 0, mapOf(TestLine2 to 20)) {} }
                     }
-                }
-                val inner = @Composable {
-                    Layout({ child1(); child2() }) { measurables, constraints ->
-                        val placeable1 = measurables[0].measure(constraints)
-                        measurables[1].measure(constraints)
-                        layout(0, 0) {
-                            // Only place the first child.
-                            placeable1.place(0, 0)
+                val inner =
+                    @Composable {
+                        Layout({
+                            child1()
+                            child2()
+                        }) { measurables, constraints ->
+                            val placeable1 = measurables[0].measure(constraints)
+                            measurables[1].measure(constraints)
+                            layout(0, 0) {
+                                // Only place the first child.
+                                placeable1.place(0, 0)
+                            }
                         }
                     }
-                }
                 Layout(inner) { measurables, constraints ->
                     val placeable = measurables.first().measure(constraints)
                     assertEquals(10, placeable[TestLine1])
@@ -1170,32 +1173,34 @@
         val layoutLatch = CountDownLatch(1)
         activityTestRule.runOnUiThreadIR {
             activity.setContent {
-                val child1 = @Composable {
-                    Layout(content = {}) { _, _ ->
-                        ++child1Measures
-                        layout(0, 0, mapOf(TestLine1 to 10)) {
-                            ++child1Layouts
+                val child1 =
+                    @Composable {
+                        Layout(content = {}) { _, _ ->
+                            ++child1Measures
+                            layout(0, 0, mapOf(TestLine1 to 10)) { ++child1Layouts }
                         }
                     }
-                }
-                val child2 = @Composable {
-                    Layout(content = {}) { _, _ ->
-                        ++child2Measures
-                        layout(0, 0, mapOf(TestLine2 to 20)) {
-                            ++child2Layouts
+                val child2 =
+                    @Composable {
+                        Layout(content = {}) { _, _ ->
+                            ++child2Measures
+                            layout(0, 0, mapOf(TestLine2 to 20)) { ++child2Layouts }
                         }
                     }
-                }
-                val inner = @Composable {
-                    Layout({ child1(); child2() }) { measurables, constraints ->
-                        val placeable1 = measurables[0].measure(constraints)
-                        val placeable2 = measurables[1].measure(constraints)
-                        layout(0, 0) {
-                            placeable1.place(0, 0)
-                            placeable2.place(0, 0)
+                val inner =
+                    @Composable {
+                        Layout({
+                            child1()
+                            child2()
+                        }) { measurables, constraints ->
+                            val placeable1 = measurables[0].measure(constraints)
+                            val placeable2 = measurables[1].measure(constraints)
+                            layout(0, 0) {
+                                placeable1.place(0, 0)
+                                placeable2.place(0, 0)
+                            }
                         }
                     }
-                }
                 Layout(inner) { measurables, constraints ->
                     val placeable = measurables.first().measure(constraints)
                     assertEquals(10, placeable[TestLine1])
@@ -1225,38 +1230,38 @@
         val layoutLatch = CountDownLatch(1)
         activityTestRule.runOnUiThreadIR {
             activity.setContent {
-                val child1 = @Composable {
-                    Layout(content = {}) { _, _ ->
-                        ++child1Measures
-                        layout(0, 0, mapOf(TestLine1 to 10)) {
-                            ++child1Layouts
+                val child1 =
+                    @Composable {
+                        Layout(content = {}) { _, _ ->
+                            ++child1Measures
+                            layout(0, 0, mapOf(TestLine1 to 10)) { ++child1Layouts }
                         }
                     }
-                }
-                val child2 = @Composable {
-                    Layout(content = {}) { _, _ ->
-                        ++child2Measures
-                        layout(0, 0, mapOf(TestLine2 to 20)) {
-                            ++child2Layouts
+                val child2 =
+                    @Composable {
+                        Layout(content = {}) { _, _ ->
+                            ++child2Measures
+                            layout(0, 0, mapOf(TestLine2 to 20)) { ++child2Layouts }
                         }
                     }
-                }
-                val inner = @Composable {
-                    Layout({ child1(); child2() }) { measurables, constraints ->
-                        val placeable1 = measurables[0].measure(constraints)
-                        assertEquals(10, placeable1[TestLine1])
-                        val placeable2 = measurables[1].measure(constraints)
-                        layout(0, 0) {
-                            placeable1.place(0, 0)
-                            placeable2.place(0, 0)
+                val inner =
+                    @Composable {
+                        Layout({
+                            child1()
+                            child2()
+                        }) { measurables, constraints ->
+                            val placeable1 = measurables[0].measure(constraints)
+                            assertEquals(10, placeable1[TestLine1])
+                            val placeable2 = measurables[1].measure(constraints)
+                            layout(0, 0) {
+                                placeable1.place(0, 0)
+                                placeable2.place(0, 0)
+                            }
                         }
                     }
-                }
                 Layout(inner) { measurables, constraints ->
                     val placeable = measurables.first().measure(constraints)
-                    layout(placeable.width, placeable.height) {
-                        layoutLatch.countDown()
-                    }
+                    layout(placeable.width, placeable.height) { layoutLatch.countDown() }
                 }
             }
         }
@@ -1273,35 +1278,31 @@
         val layoutLatch = CountDownLatch(1)
         activityTestRule.runOnUiThreadIR {
             activity.setContent {
-                val child1 = @Composable {
-                    Layout(content = { }) { _, _ ->
-                        layout(0, 0, mapOf(TestLine to 10)) { }
+                val child1 =
+                    @Composable {
+                        Layout(content = {}) { _, _ -> layout(0, 0, mapOf(TestLine to 10)) {} }
                     }
-                }
-                val child2 = @Composable {
-                    Layout(content = {}) { _, _ ->
-                        layout(
-                            0,
-                            0,
-                            mapOf(TestLine to 20)
-                        ) { }
+                val child2 =
+                    @Composable {
+                        Layout(content = {}) { _, _ -> layout(0, 0, mapOf(TestLine to 20)) {} }
                     }
-                }
-                val inner = @Composable {
-                    Layout({ child1(); child2() }) { measurables, constraints ->
-                        val placeable1 = measurables[0].measure(constraints)
-                        layout(0, 0) {
-                            assertEquals(10, placeable1[TestLine])
-                            val placeable2 = measurables[1].measure(constraints)
-                            assertEquals(20, placeable2[TestLine])
+                val inner =
+                    @Composable {
+                        Layout({
+                            child1()
+                            child2()
+                        }) { measurables, constraints ->
+                            val placeable1 = measurables[0].measure(constraints)
+                            layout(0, 0) {
+                                assertEquals(10, placeable1[TestLine])
+                                val placeable2 = measurables[1].measure(constraints)
+                                assertEquals(20, placeable2[TestLine])
+                            }
                         }
                     }
-                }
                 Layout(inner) { measurables, constraints ->
                     val placeable = measurables.first().measure(constraints)
-                    layout(placeable.width, placeable.height) {
-                        layoutLatch.countDown()
-                    }
+                    layout(placeable.width, placeable.height) { layoutLatch.countDown() }
                 }
             }
         }
@@ -1315,23 +1316,23 @@
         var childLayouts = 0
         activityTestRule.runOnUiThreadIR {
             activity.setContent {
-                val child = @Composable {
-                    Layout(content = { }) { _, _ ->
-                        layout(0, 0, mapOf(TestLine to 10)) {
-                            ++childLayouts
+                val child =
+                    @Composable {
+                        Layout(content = {}) { _, _ ->
+                            layout(0, 0, mapOf(TestLine to 10)) { ++childLayouts }
                         }
                     }
-                }
-                val inner = @Composable {
-                    Layout({ child() }) { measurables, constraints ->
-                        val placeable = measurables[0].measure(constraints)
-                        layout(0, 0) {
-                            assertEquals(10, placeable[TestLine])
-                            placeable.place(0, 0)
-                            assertEquals(10, placeable[TestLine])
+                val inner =
+                    @Composable {
+                        Layout({ child() }) { measurables, constraints ->
+                            val placeable = measurables[0].measure(constraints)
+                            layout(0, 0) {
+                                assertEquals(10, placeable[TestLine])
+                                placeable.place(0, 0)
+                                assertEquals(10, placeable[TestLine])
+                            }
                         }
                     }
-                }
                 Layout(inner) { measurables, constraints ->
                     val placeable = measurables.first().measure(constraints)
                     layout(placeable.width, placeable.height) {
@@ -1355,11 +1356,12 @@
         var linePosition: Int? = null
         activityTestRule.runOnUiThreadIR {
             activity.setContent {
-                val child = @Composable {
-                    Layout(content = {}) { _, _ ->
-                        layout(0, 0, mapOf(TestLine to offset.value)) {}
+                val child =
+                    @Composable {
+                        Layout(content = {}) { _, _ ->
+                            layout(0, 0, mapOf(TestLine to offset.value)) {}
+                        }
                     }
-                }
                 Layout(child) { measurables, constraints ->
                     val placeable = measurables.first().measure(constraints)
                     linePosition = placeable[TestLine]
@@ -1377,9 +1379,7 @@
         assertEquals(10, linePosition)
 
         layoutLatch = CountDownLatch(1)
-        activityTestRule.runOnUiThreadIR {
-            offset.value = 20
-        }
+        activityTestRule.runOnUiThreadIR { offset.value = 20 }
         assertTrue(layoutLatch.await(1, TimeUnit.SECONDS))
         assertEquals(2, measure)
         assertEquals(2, layout)
@@ -1396,15 +1396,12 @@
         var linePosition: Int? = null
         activityTestRule.runOnUiThreadIR {
             activity.setContent {
-                val child = @Composable {
-                    Layout(content = {}) { _, _ ->
-                        layout(
-                            0,
-                            0,
-                            mapOf(TestLine to offset.value)
-                        ) {}
+                val child =
+                    @Composable {
+                        Layout(content = {}) { _, _ ->
+                            layout(0, 0, mapOf(TestLine to offset.value)) {}
+                        }
                     }
-                }
                 Layout(child) { measurables, constraints ->
                     val placeable = measurables.first().measure(constraints)
                     ++measure
@@ -1439,11 +1436,12 @@
         var linePosition: Int? = null
         activityTestRule.runOnUiThreadIR {
             activity.setContent {
-                val child = @Composable {
-                    Layout(content = {}) { _, _ ->
-                        layout(0, 0, mapOf(TestLine to offset.value)) { }
+                val child =
+                    @Composable {
+                        Layout(content = {}) { _, _ ->
+                            layout(0, 0, mapOf(TestLine to offset.value)) {}
+                        }
                     }
-                }
                 Layout(child) { measurables, constraints ->
                     ++measure
                     layout(1, 1) {
@@ -1480,23 +1478,28 @@
         var linePosition by mutableStateOf(10)
         activityTestRule.runOnUiThreadIR {
             activity.setContent {
-                val innerChild = @Composable {
-                    offset.value // Artificial remeasure.
-                    Layout(content = {}) { _, _ ->
-                        layout(0, 0, mapOf(TestLine to linePosition)) { }
-                    }
-                }
-                val child = @Composable {
-                    Layout({ innerChild(); innerChild() }) { measurables, constraints ->
+                val innerChild =
+                    @Composable {
                         offset.value // Artificial remeasure.
-                        val placeable1 = measurables[0].measure(constraints)
-                        val placeable2 = measurables[1].measure(constraints)
-                        layout(0, 0) {
-                            placeable1.place(0, 0)
-                            placeable2.place(0, 0)
+                        Layout(content = {}) { _, _ ->
+                            layout(0, 0, mapOf(TestLine to linePosition)) {}
                         }
                     }
-                }
+                val child =
+                    @Composable {
+                        Layout({
+                            innerChild()
+                            innerChild()
+                        }) { measurables, constraints ->
+                            offset.value // Artificial remeasure.
+                            val placeable1 = measurables[0].measure(constraints)
+                            val placeable2 = measurables[1].measure(constraints)
+                            layout(0, 0) {
+                                placeable1.place(0, 0)
+                                placeable2.place(0, 0)
+                            }
+                        }
+                    }
                 Layout(child) { measurables, constraints ->
                     val placeable = measurables.first().measure(constraints)
                     if (offset.value < 15) {
@@ -1513,12 +1516,18 @@
         assertEquals(1, alignmentLinesCalculations)
 
         layoutLatch = CountDownLatch(1)
-        activityTestRule.runOnUiThreadIR { offset.value = 20; linePosition = 20 }
+        activityTestRule.runOnUiThreadIR {
+            offset.value = 20
+            linePosition = 20
+        }
         assertTrue(layoutLatch.await(1, TimeUnit.SECONDS))
         assertEquals(1, alignmentLinesCalculations)
 
         layoutLatch = CountDownLatch(1)
-        activityTestRule.runOnUiThreadIR { offset.value = 10; linePosition = 30 }
+        activityTestRule.runOnUiThreadIR {
+            offset.value = 10
+            linePosition = 30
+        }
         assertTrue(layoutLatch.await(1, TimeUnit.SECONDS))
         assertEquals(2, alignmentLinesCalculations)
     }
@@ -1529,19 +1538,17 @@
         val TestLine = VerticalAlignmentLine(::min)
         activityTestRule.runOnUiThreadIR {
             activity.setContent {
-                val innerChild = @Composable {
-                    Layout(content = {}) { _, _ ->
-                        layout(0, 0, mapOf(TestLine to 10)) { }
+                val innerChild =
+                    @Composable {
+                        Layout(content = {}) { _, _ -> layout(0, 0, mapOf(TestLine to 10)) {} }
                     }
-                }
-                val child = @Composable {
-                    Layout({ innerChild() }) { measurables, constraints ->
-                        val placeable = measurables.first().measure(constraints)
-                        layout(0, 0, mapOf(TestLine to 20)) {
-                            placeable.place(0, 0)
+                val child =
+                    @Composable {
+                        Layout({ innerChild() }) { measurables, constraints ->
+                            val placeable = measurables.first().measure(constraints)
+                            layout(0, 0, mapOf(TestLine to 20)) { placeable.place(0, 0) }
                         }
                     }
-                }
                 Layout(child) { measurables, constraints ->
                     val placeable = measurables.first().measure(constraints)
                     assertEquals(20, placeable[TestLine])
@@ -1566,22 +1573,24 @@
         val offset = mutableStateOf(0)
         activityTestRule.runOnUiThreadIR {
             activity.setContent {
-                val child = @Composable {
-                    Layout(content = {}) { _, _ ->
-                        ++innerChildMeasures
-                        layout(0, 0, mapOf(TestLine to 10)) { ++innerChildLayouts }
-                    }
-                }
-                val inner = @Composable {
-                    Layout({ Wrap { Wrap { child() } } }) { measurables, constraints ->
-                        ++outerChildMeasures
-                        val placeable = measurables[0].measure(constraints)
-                        layout(0, 0) {
-                            ++outerChildLayouts
-                            placeable.place(offset.value, 0)
+                val child =
+                    @Composable {
+                        Layout(content = {}) { _, _ ->
+                            ++innerChildMeasures
+                            layout(0, 0, mapOf(TestLine to 10)) { ++innerChildLayouts }
                         }
                     }
-                }
+                val inner =
+                    @Composable {
+                        Layout({ Wrap { Wrap { child() } } }) { measurables, constraints ->
+                            ++outerChildMeasures
+                            val placeable = measurables[0].measure(constraints)
+                            layout(0, 0) {
+                                ++outerChildLayouts
+                                placeable.place(offset.value, 0)
+                            }
+                        }
+                    }
                 Layout(inner) { measurables, constraints ->
                     val placeable = measurables.first().measure(constraints)
                     val width = placeable.width.coerceAtLeast(10)
@@ -1601,9 +1610,7 @@
         assertEquals(1, outerChildLayouts)
 
         layoutLatch = CountDownLatch(1)
-        activityTestRule.runOnUiThreadIR {
-            offset.value = 10
-        }
+        activityTestRule.runOnUiThreadIR { offset.value = 10 }
         assertTrue(layoutLatch.await(1, TimeUnit.SECONDS))
         assertEquals(1, innerChildMeasures)
         assertEquals(1, innerChildLayouts)
@@ -1618,24 +1625,28 @@
         var childLayouts = 0
         activityTestRule.runOnUiThreadIR {
             activity.setContent {
-                val child = @Composable {
-                    Layout(content = {}) { _, constraints ->
-                        layout(
-                            constraints.minWidth,
-                            constraints.minHeight,
-                            mapOf(TestLine to 10)
-                        ) { ++childLayouts }
-                    }
-                }
-                val inner = @Composable {
-                    Layout({ Wrap { Wrap { child() } } }) { measurables, constraints ->
-                        val placeable = measurables[0].measure(constraints)
-                        layout(placeable.width, placeable.height) {
-                            placeable.place(0, 0)
-                            assertEquals(10, placeable[TestLine])
+                val child =
+                    @Composable {
+                        Layout(content = {}) { _, constraints ->
+                            layout(
+                                constraints.minWidth,
+                                constraints.minHeight,
+                                mapOf(TestLine to 10)
+                            ) {
+                                ++childLayouts
+                            }
                         }
                     }
-                }
+                val inner =
+                    @Composable {
+                        Layout({ Wrap { Wrap { child() } } }) { measurables, constraints ->
+                            val placeable = measurables[0].measure(constraints)
+                            layout(placeable.width, placeable.height) {
+                                placeable.place(0, 0)
+                                assertEquals(10, placeable[TestLine])
+                            }
+                        }
+                    }
                 Layout(inner) { measurables, constraints ->
                     val placeable = measurables.first().measure(constraints)
                     layout(placeable.width, placeable.height) {
@@ -1667,39 +1678,48 @@
         var layoutLatch = CountDownLatch(1)
         activityTestRule.runOnUiThreadIR {
             activity.setContent {
-                val childChild = @Composable {
-                    Layout(content = {}) { _, constraints ->
-                        layout(
-                            constraints.minWidth,
-                            constraints.minHeight,
-                            mapOf(TestLine to linePositionState)
-                        ) {
-                            offset.value // To ensure relayout.
+                val childChild =
+                    @Composable {
+                        Layout(content = {}) { _, constraints ->
+                            layout(
+                                constraints.minWidth,
+                                constraints.minHeight,
+                                mapOf(TestLine to linePositionState)
+                            ) {
+                                offset.value // To ensure relayout.
+                            }
                         }
                     }
-                }
-                val child = @Composable {
-                    Layout(content = { childChild(); childChild() }) { measurables, constraints ->
-                        val placeables = measurables.map { it.measure(constraints) }
-                        layout(constraints.minWidth, constraints.minHeight) {
-                            offset.value // To ensure relayout.
-                            placeables.forEach { it.place(0, 0) }
-                            ++childLayouts
+                val child =
+                    @Composable {
+                        Layout(
+                            content = {
+                                childChild()
+                                childChild()
+                            }
+                        ) { measurables, constraints ->
+                            val placeables = measurables.map { it.measure(constraints) }
+                            layout(constraints.minWidth, constraints.minHeight) {
+                                offset.value // To ensure relayout.
+                                placeables.forEach { it.place(0, 0) }
+                                ++childLayouts
+                            }
                         }
                     }
-                }
-                val inner = @Composable {
-                    Layout({
-                        WrapForceRelayout(offset) { child() }
-                    }) { measurables, constraints ->
-                        val placeable = measurables[0].measure(constraints)
-                        layout(placeable.width, placeable.height) {
-                            if (offset.value > 15) assertEquals(linePosition, placeable[TestLine])
-                            placeable.place(0, 0)
-                            if (offset.value > 5) assertEquals(linePosition, placeable[TestLine])
+                val inner =
+                    @Composable {
+                        Layout({ WrapForceRelayout(offset) { child() } }) { measurables, constraints
+                            ->
+                            val placeable = measurables[0].measure(constraints)
+                            layout(placeable.width, placeable.height) {
+                                if (offset.value > 15)
+                                    assertEquals(linePosition, placeable[TestLine])
+                                placeable.place(0, 0)
+                                if (offset.value > 5)
+                                    assertEquals(linePosition, placeable[TestLine])
+                            }
                         }
                     }
-                }
                 Layout(inner) { measurables, constraints ->
                     val placeable = measurables.first().measure(constraints)
                     val width = placeable.width.coerceAtLeast(10)
@@ -1721,107 +1741,134 @@
         assertEquals(3, childLayouts + childAlignmentLinesCalculations)
 
         layoutLatch = CountDownLatch(1)
-        activityTestRule.runOnUiThreadIR { offset.value = 10; changeLinePosition() }
+        activityTestRule.runOnUiThreadIR {
+            offset.value = 10
+            changeLinePosition()
+        }
         assertTrue(layoutLatch.await(1, TimeUnit.SECONDS))
         assertEquals(5, childLayouts + childAlignmentLinesCalculations)
 
         layoutLatch = CountDownLatch(1)
-        activityTestRule.runOnUiThreadIR { offset.value = 12; changeLinePosition() }
+        activityTestRule.runOnUiThreadIR {
+            offset.value = 12
+            changeLinePosition()
+        }
         assertTrue(layoutLatch.await(1, TimeUnit.SECONDS))
         assertEquals(7, childLayouts + childAlignmentLinesCalculations)
 
         layoutLatch = CountDownLatch(1)
-        activityTestRule.runOnUiThreadIR { offset.value = 17; changeLinePosition() }
+        activityTestRule.runOnUiThreadIR {
+            offset.value = 17
+            changeLinePosition()
+        }
         assertTrue(layoutLatch.await(1, TimeUnit.SECONDS))
         assertEquals(9, childLayouts + childAlignmentLinesCalculations)
 
         layoutLatch = CountDownLatch(1)
-        activityTestRule.runOnUiThreadIR { offset.value = 12; changeLinePosition() }
+        activityTestRule.runOnUiThreadIR {
+            offset.value = 12
+            changeLinePosition()
+        }
         assertTrue(layoutLatch.await(1, TimeUnit.SECONDS))
         assertEquals(11, childLayouts + childAlignmentLinesCalculations)
 
         layoutLatch = CountDownLatch(1)
-        activityTestRule.runOnUiThreadIR { offset.value = 1; changeLinePosition() }
+        activityTestRule.runOnUiThreadIR {
+            offset.value = 1
+            changeLinePosition()
+        }
         assertTrue(layoutLatch.await(1, TimeUnit.SECONDS))
         assertEquals(13, childLayouts + childAlignmentLinesCalculations)
 
         layoutLatch = CountDownLatch(1)
-        activityTestRule.runOnUiThreadIR { offset.value = 10; changeLinePosition() }
+        activityTestRule.runOnUiThreadIR {
+            offset.value = 10
+            changeLinePosition()
+        }
         assertTrue(layoutLatch.await(1, TimeUnit.SECONDS))
         assertEquals(15, childLayouts + childAlignmentLinesCalculations)
     }
 
     @Test
-    fun testAlignmentLines_readFromModifier_duringMeasurement() = with(density) {
-        val testVerticalLine = VerticalAlignmentLine(::min)
-        val testHorizontalLine = HorizontalAlignmentLine(::max)
+    fun testAlignmentLines_readFromModifier_duringMeasurement() =
+        with(density) {
+            val testVerticalLine = VerticalAlignmentLine(::min)
+            val testHorizontalLine = HorizontalAlignmentLine(::max)
 
-        val assertLines: Modifier.(Int, Int) -> Modifier = { vertical, horizontal ->
-            this.then(object : LayoutModifier {
-                override fun MeasureScope.measure(
-                    measurable: Measurable,
-                    constraints: Constraints
-                ): MeasureResult {
-                    val placeable = measurable.measure(constraints)
-                    assertEquals(vertical, placeable[testVerticalLine])
-                    assertEquals(horizontal, placeable[testHorizontalLine])
-                    return layout(placeable.width, placeable.height) {
-                        placeable.place(0, 0)
+            val assertLines: Modifier.(Int, Int) -> Modifier = { vertical, horizontal ->
+                this.then(
+                    object : LayoutModifier {
+                        override fun MeasureScope.measure(
+                            measurable: Measurable,
+                            constraints: Constraints
+                        ): MeasureResult {
+                            val placeable = measurable.measure(constraints)
+                            assertEquals(vertical, placeable[testVerticalLine])
+                            assertEquals(horizontal, placeable[testHorizontalLine])
+                            return layout(placeable.width, placeable.height) {
+                                placeable.place(0, 0)
+                            }
+                        }
                     }
-                }
-            })
-        }
+                )
+            }
 
-        testAlignmentLinesReads(testVerticalLine, testHorizontalLine, assertLines)
-    }
+            testAlignmentLinesReads(testVerticalLine, testHorizontalLine, assertLines)
+        }
 
     @Test
-    fun testAlignmentLines_readFromModifier_duringPositioning_before() = with(density) {
-        val testVerticalLine = VerticalAlignmentLine(::min)
-        val testHorizontalLine = HorizontalAlignmentLine(::max)
+    fun testAlignmentLines_readFromModifier_duringPositioning_before() =
+        with(density) {
+            val testVerticalLine = VerticalAlignmentLine(::min)
+            val testHorizontalLine = HorizontalAlignmentLine(::max)
 
-        val assertLines: Modifier.(Int, Int) -> Modifier = { vertical, horizontal ->
-            this.then(object : LayoutModifier {
-                override fun MeasureScope.measure(
-                    measurable: Measurable,
-                    constraints: Constraints
-                ): MeasureResult {
-                    val placeable = measurable.measure(constraints)
-                    return layout(placeable.width, placeable.height) {
-                        assertEquals(vertical, placeable[testVerticalLine])
-                        assertEquals(horizontal, placeable[testHorizontalLine])
-                        placeable.place(0, 0)
+            val assertLines: Modifier.(Int, Int) -> Modifier = { vertical, horizontal ->
+                this.then(
+                    object : LayoutModifier {
+                        override fun MeasureScope.measure(
+                            measurable: Measurable,
+                            constraints: Constraints
+                        ): MeasureResult {
+                            val placeable = measurable.measure(constraints)
+                            return layout(placeable.width, placeable.height) {
+                                assertEquals(vertical, placeable[testVerticalLine])
+                                assertEquals(horizontal, placeable[testHorizontalLine])
+                                placeable.place(0, 0)
+                            }
+                        }
                     }
-                }
-            })
-        }
+                )
+            }
 
-        testAlignmentLinesReads(testVerticalLine, testHorizontalLine, assertLines)
-    }
+            testAlignmentLinesReads(testVerticalLine, testHorizontalLine, assertLines)
+        }
 
     @Test
-    fun testAlignmentLines_readFromModifier_duringPositioning_after() = with(density) {
-        val testVerticalLine = VerticalAlignmentLine(::min)
-        val testHorizontalLine = HorizontalAlignmentLine(::max)
+    fun testAlignmentLines_readFromModifier_duringPositioning_after() =
+        with(density) {
+            val testVerticalLine = VerticalAlignmentLine(::min)
+            val testHorizontalLine = HorizontalAlignmentLine(::max)
 
-        val assertLines: Modifier.(Int, Int) -> Modifier = { vertical, horizontal ->
-            this.then(object : LayoutModifier {
-                override fun MeasureScope.measure(
-                    measurable: Measurable,
-                    constraints: Constraints
-                ): MeasureResult {
-                    val placeable = measurable.measure(constraints)
-                    return layout(placeable.width, placeable.height) {
-                        placeable.place(0, 0)
-                        assertEquals(vertical, placeable[testVerticalLine])
-                        assertEquals(horizontal, placeable[testHorizontalLine])
+            val assertLines: Modifier.(Int, Int) -> Modifier = { vertical, horizontal ->
+                this.then(
+                    object : LayoutModifier {
+                        override fun MeasureScope.measure(
+                            measurable: Measurable,
+                            constraints: Constraints
+                        ): MeasureResult {
+                            val placeable = measurable.measure(constraints)
+                            return layout(placeable.width, placeable.height) {
+                                placeable.place(0, 0)
+                                assertEquals(vertical, placeable[testVerticalLine])
+                                assertEquals(horizontal, placeable[testHorizontalLine])
+                            }
+                        }
                     }
-                }
-            })
-        }
+                )
+            }
 
-        testAlignmentLinesReads(testVerticalLine, testHorizontalLine, assertLines)
-    }
+            testAlignmentLinesReads(testVerticalLine, testHorizontalLine, assertLines)
+        }
 
     private fun Density.testAlignmentLinesReads(
         testVerticalLine: VerticalAlignmentLine,
@@ -1831,32 +1878,20 @@
         val layoutLatch = CountDownLatch(1)
         activityTestRule.runOnUiThreadIR {
             activity.setContent {
-                val layout = @Composable { modifier: Modifier ->
-                    Layout(modifier = modifier, content = {}) { _, _ ->
-                        layout(
-                            0,
-                            0,
-                            mapOf(
-                                testVerticalLine to 10,
-                                testHorizontalLine to 20
-                            )
-                        ) {
-                            layoutLatch.countDown()
+                val layout =
+                    @Composable { modifier: Modifier ->
+                        Layout(modifier = modifier, content = {}) { _, _ ->
+                            layout(0, 0, mapOf(testVerticalLine to 10, testHorizontalLine to 20)) {
+                                layoutLatch.countDown()
+                            }
                         }
                     }
-                }
 
                 layout(Modifier.assertLines(10, 20))
                 layout(Modifier.assertLines(30, 30).offset(20.toDp(), 10.toDp()))
+                layout(Modifier.assertLines(30, 30).graphicsLayer().offset(20.toDp(), 10.toDp()))
                 layout(
-                    Modifier
-                        .assertLines(30, 30)
-                        .graphicsLayer()
-                        .offset(20.toDp(), 10.toDp())
-                )
-                layout(
-                    Modifier
-                        .assertLines(30, 30)
+                    Modifier.assertLines(30, 30)
                         .background(Color.Blue)
                         .graphicsLayer()
                         .offset(20.toDp(), 10.toDp())
@@ -1864,8 +1899,7 @@
                         .background(Color.Blue)
                 )
                 layout(
-                    Modifier
-                        .background(Color.Blue)
+                    Modifier.background(Color.Blue)
                         .assertLines(30, 30)
                         .background(Color.Blue)
                         .graphicsLayer()
@@ -1874,8 +1908,7 @@
                         .background(Color.Blue)
                 )
                 Wrap(
-                    Modifier
-                        .background(Color.Blue)
+                    Modifier.background(Color.Blue)
                         .assertLines(30, 30)
                         .background(Color.Blue)
                         .graphicsLayer()
@@ -1886,8 +1919,7 @@
                     layout(Modifier)
                 }
                 Wrap(
-                    Modifier
-                        .background(Color.Blue)
+                    Modifier.background(Color.Blue)
                         .assertLines(40, 50)
                         .background(Color.Blue)
                         .graphicsLayer()
@@ -1909,47 +1941,43 @@
         var laidOut = false
         activityTestRule.runOnUiThreadIR {
             activity.setContent {
-                val container = @Composable { content: @Composable () -> Unit ->
-                    // This simulates a Container optimisation, when the child does not
-                    // affect parent size.
-                    Layout(content) { measurables, constraints ->
-                        layout(30, 30) {
-                            measurables[0].measure(constraints).place(0, 0)
+                val container =
+                    @Composable { content: @Composable () -> Unit ->
+                        // This simulates a Container optimisation, when the child does not
+                        // affect parent size.
+                        Layout(content) { measurables, constraints ->
+                            layout(30, 30) { measurables[0].measure(constraints).place(0, 0) }
                         }
                     }
-                }
-                val recomposingChild = @Composable { content: @Composable (Int) -> Unit ->
-                    // This simulates a child that recomposes, for example due to a transition.
-                    content(offset.value)
-                }
-                val assumeLayoutBeforeDraw = @Composable { value: Int ->
-                    // This assumes a layout was done before the draw pass.
-                    Layout(
-                        content = {},
-                        modifier = Modifier.drawBehind {
-                            assertEquals(offset.value, value)
-                            assertTrue(laidOut)
-                            latch.countDown()
-                        }
-                    ) { _, _ ->
-                        laidOut = true
-                        layout(0, 0) {}
+                val recomposingChild =
+                    @Composable { content: @Composable (Int) -> Unit ->
+                        // This simulates a child that recomposes, for example due to a transition.
+                        content(offset.value)
                     }
-                }
+                val assumeLayoutBeforeDraw =
+                    @Composable { value: Int ->
+                        // This assumes a layout was done before the draw pass.
+                        Layout(
+                            content = {},
+                            modifier =
+                                Modifier.drawBehind {
+                                    assertEquals(offset.value, value)
+                                    assertTrue(laidOut)
+                                    latch.countDown()
+                                }
+                        ) { _, _ ->
+                            laidOut = true
+                            layout(0, 0) {}
+                        }
+                    }
 
-                container {
-                    recomposingChild {
-                        assumeLayoutBeforeDraw(it)
-                    }
-                }
+                container { recomposingChild { assumeLayoutBeforeDraw(it) } }
             }
         }
 
         assertTrue(latch.await(1, TimeUnit.SECONDS))
         latch = CountDownLatch(1)
-        activityTestRule.runOnUiThreadIR {
-            offset.value = 10
-        }
+        activityTestRule.runOnUiThreadIR { offset.value = 10 }
         assertTrue(latch.await(1, TimeUnit.SECONDS))
     }
 
@@ -1960,9 +1988,7 @@
         activityTestRule.runOnUiThreadIR {
             activity.setContent {
                 Layout(
-                    content = {
-                        AtLeastSize(30, modifier = Modifier.drawBehind { drawn = true })
-                    },
+                    content = { AtLeastSize(30, modifier = Modifier.drawBehind { drawn = true }) },
                     modifier = Modifier.drawLatchModifier()
                 ) { _, _ ->
                     // don't measure or place the AtLeastSize
@@ -1974,15 +2000,12 @@
 
         assertTrue(latch.await(1, TimeUnit.SECONDS))
         assertTrue(drawLatch.await(1, TimeUnit.SECONDS))
-        activityTestRule.runOnUiThreadIR {
-            assertFalse(drawn)
-        }
+        activityTestRule.runOnUiThreadIR { assertFalse(drawn) }
     }
 
     /**
-     * Because we use invalidate() to cause relayout when children
-     * are laid out, we want to ensure that when the View is 0-sized
-     * that it gets a relayout when it needs to change to non-0
+     * Because we use invalidate() to cause relayout when children are laid out, we want to ensure
+     * that when the View is 0-sized that it gets a relayout when it needs to change to non-0
      */
     @Test
     fun testZeroSizeCanRelayout() {
@@ -1990,7 +2013,7 @@
         val model = SquareModel(size = 0)
         activityTestRule.runOnUiThreadIR {
             activity.setContent {
-                Layout(content = { }) { _, _ ->
+                Layout(content = {}) { _, _ ->
                     latch.countDown()
                     layout(model.size, model.size) {}
                 }
@@ -1999,9 +2022,7 @@
 
         assertTrue(latch.await(1, TimeUnit.SECONDS))
         latch = CountDownLatch(1)
-        activityTestRule.runOnUiThreadIR {
-            model.size = 10
-        }
+        activityTestRule.runOnUiThreadIR { model.size = 10 }
         assertTrue(latch.await(1, TimeUnit.SECONDS))
     }
 
@@ -2020,18 +2041,14 @@
                     }
                 ) { measurables, constraints ->
                     val placeable = measurables[0].measure(constraints)
-                    layout(placeable.width, placeable.height) {
-                        placeable.place(0, 0)
-                    }
+                    layout(placeable.width, placeable.height) { placeable.place(0, 0) }
                 }
             }
         }
 
         assertTrue(latch.await(1, TimeUnit.SECONDS))
         latch = CountDownLatch(1)
-        activityTestRule.runOnUiThreadIR {
-            model.size = 10
-        }
+        activityTestRule.runOnUiThreadIR { model.size = 10 }
         assertTrue(latch.await(1, TimeUnit.SECONDS))
     }
 
@@ -2043,28 +2060,21 @@
             activity.setContent {
                 Layout(
                     content = {
-                        Layout(
-                            modifier = Modifier.graphicsLayer(),
-                            content = {}
-                        ) { _, _ ->
+                        Layout(modifier = Modifier.graphicsLayer(), content = {}) { _, _ ->
                             latch.countDown()
                             layout(model.size, model.size) {}
                         }
                     }
                 ) { measurables, constraints ->
                     val placeable = measurables[0].measure(constraints)
-                    layout(placeable.width, placeable.height) {
-                        placeable.place(0, 0)
-                    }
+                    layout(placeable.width, placeable.height) { placeable.place(0, 0) }
                 }
             }
         }
 
         assertTrue(latch.await(1, TimeUnit.SECONDS))
         latch = CountDownLatch(1)
-        activityTestRule.runOnUiThreadIR {
-            model.size = 10
-        }
+        activityTestRule.runOnUiThreadIR { model.size = 10 }
         assertTrue(latch.await(1, TimeUnit.SECONDS))
     }
 
@@ -2073,13 +2083,13 @@
         val latch = CountDownLatch(1)
         activityTestRule.runOnUiThreadIR {
             activity.setContent {
-                val drawnContent = Modifier.drawBehind {
-                    assertEquals(100.0f, size.width)
-                    assertEquals(100.0f, size.height)
-                    latch.countDown()
-                }
-                AtLeastSize(100, Modifier.padding(10).then(drawnContent)) {
-                }
+                val drawnContent =
+                    Modifier.drawBehind {
+                        assertEquals(100.0f, size.width)
+                        assertEquals(100.0f, size.height)
+                        latch.countDown()
+                    }
+                AtLeastSize(100, Modifier.padding(10).then(drawnContent)) {}
             }
         }
         assertTrue(latch.await(1, TimeUnit.SECONDS))
@@ -2092,14 +2102,12 @@
             activity.setContent {
                 AtLeastSize(
                     100,
-                    Modifier.padding(10).graphicsLayer()
-                        .drawBehind {
-                            assertEquals(100.0f, size.width)
-                            assertEquals(100.0f, size.height)
-                            latch.countDown()
-                        }
-                ) {
-                }
+                    Modifier.padding(10).graphicsLayer().drawBehind {
+                        assertEquals(100.0f, size.width)
+                        assertEquals(100.0f, size.height)
+                        latch.countDown()
+                    }
+                ) {}
             }
         }
         assertTrue(latch.await(1, TimeUnit.SECONDS))
@@ -2113,13 +2121,14 @@
         val padding = 20
         activityTestRule.runOnUiThreadIR {
             activity.setContent {
-                val child = @Composable {
-                    Wrap {
-                        Layout(content = {}, modifier = Modifier.padding(padding)) { _, _ ->
-                            layout(0, 0, mapOf(testLine to alignmentLinePosition)) { }
+                val child =
+                    @Composable {
+                        Wrap {
+                            Layout(content = {}, modifier = Modifier.padding(padding)) { _, _ ->
+                                layout(0, 0, mapOf(testLine to alignmentLinePosition)) {}
+                            }
                         }
                     }
-                }
 
                 Layout(child) { measurables, constraints ->
                     assertEquals(
@@ -2127,7 +2136,7 @@
                         measurables[0].measure(constraints)[testLine]
                     )
                     latch.countDown()
-                    layout(0, 0) { }
+                    layout(0, 0) {}
                 }
             }
         }
@@ -2135,20 +2144,20 @@
 
     @Test
     fun modifiers_validateCorrectSizes() {
-        val layoutModifier = object : LayoutModifier {
-            override fun MeasureScope.measure(
-                measurable: Measurable,
-                constraints: Constraints
-            ): MeasureResult {
-                val placeable = measurable.measure(constraints)
-                return layout(placeable.width, placeable.height) {
-                    placeable.place(0, 0)
+        val layoutModifier =
+            object : LayoutModifier {
+                override fun MeasureScope.measure(
+                    measurable: Measurable,
+                    constraints: Constraints
+                ): MeasureResult {
+                    val placeable = measurable.measure(constraints)
+                    return layout(placeable.width, placeable.height) { placeable.place(0, 0) }
                 }
             }
-        }
-        val parentDataModifier = object : ParentDataModifier {
-            override fun Density.modifyParentData(parentData: Any?) = parentData
-        }
+        val parentDataModifier =
+            object : ParentDataModifier {
+                override fun Density.modifyParentData(parentData: Any?) = parentData
+            }
         val size = 50
 
         val latch = CountDownLatch(2)
@@ -2167,7 +2176,7 @@
                             childSizes[i] = IntSize(placeable.width, placeable.height)
                             latch.countDown()
                         }
-                        layout(0, 0) { }
+                        layout(0, 0) {}
                     }
                 )
             }
@@ -2185,10 +2194,7 @@
         activityTestRule.runOnUiThreadIR {
             activity.setContent {
                 FixedSize(30, Modifier.background(outerColor)) {
-                    FixedSize(
-                        10,
-                        Modifier.padding(10).background(innerColor).drawLatchModifier()
-                    )
+                    FixedSize(10, Modifier.padding(10).background(innerColor).drawLatchModifier())
                 }
             }
         }
@@ -2204,10 +2210,11 @@
                 CompositionLocalProvider(LocalLayoutDirection provides LayoutDirection.Rtl) {
                     FixedSize(
                         size = 50,
-                        modifier = Modifier.drawBehind {
-                            layoutDirection.value = this.layoutDirection
-                            drawLatch.countDown()
-                        }
+                        modifier =
+                            Modifier.drawBehind {
+                                layoutDirection.value = this.layoutDirection
+                                drawLatch.countDown()
+                            }
                     )
                 }
             }
@@ -2222,23 +2229,21 @@
         val latch = CountDownLatch(1)
         val layoutDirection = Ref<LayoutDirection>()
 
-        val layoutModifier = object : LayoutModifier {
-            override fun MeasureScope.measure(
-                measurable: Measurable,
-                constraints: Constraints
-            ): MeasureResult {
-                layoutDirection.value = this.layoutDirection
-                latch.countDown()
-                return layout(0, 0) {}
+        val layoutModifier =
+            object : LayoutModifier {
+                override fun MeasureScope.measure(
+                    measurable: Measurable,
+                    constraints: Constraints
+                ): MeasureResult {
+                    layoutDirection.value = this.layoutDirection
+                    latch.countDown()
+                    return layout(0, 0) {}
+                }
             }
-        }
         activityTestRule.runOnUiThreadIR {
             activity.setContent {
                 CompositionLocalProvider(LocalLayoutDirection provides LayoutDirection.Rtl) {
-                    FixedSize(
-                        size = 50,
-                        modifier = layoutModifier
-                    )
+                    FixedSize(size = 50, modifier = layoutModifier)
                 }
             }
         }
@@ -2253,18 +2258,13 @@
         activityTestRule.runOnUiThreadIR {
             activity.setContent {
                 FixedSize(30, Modifier.background(model, false)) {
-                    FixedSize(
-                        10,
-                        Modifier.padding(10).background(model, true).drawLatchModifier()
-                    )
+                    FixedSize(10, Modifier.padding(10).background(model, true).drawLatchModifier())
                 }
             }
         }
         validateSquareColors(outerColor = Color.Green, innerColor = Color.White, size = 10)
         drawLatch = CountDownLatch(1)
-        activityTestRule.runOnUiThreadIR {
-            model.innerColor = Color.Yellow
-        }
+        activityTestRule.runOnUiThreadIR { model.innerColor = Color.Yellow }
         validateSquareColors(outerColor = Color.Green, innerColor = Color.Yellow, size = 10)
     }
 
@@ -2287,9 +2287,7 @@
         }
         validateSquareColors(outerColor = Color.Green, innerColor = Color.White, size = 10)
         drawLatch = CountDownLatch(1)
-        activityTestRule.runOnUiThreadIR {
-            model.innerColor = Color.Yellow
-        }
+        activityTestRule.runOnUiThreadIR { model.innerColor = Color.Yellow }
         validateSquareColors(outerColor = Color.Green, innerColor = Color.Yellow, size = 10)
     }
 
@@ -2300,15 +2298,12 @@
         val innerColor = Color.White
         activityTestRule.runOnUiThreadIR {
             activity.setContent {
-                val colorModifier = Modifier.drawBehind {
-                    drawRect(outerColor)
-                    drawRect(
-                        innerColor,
-                        topLeft = Offset(10f, 10f),
-                        size = Size(10f, 10f)
-                    )
-                    drawLatch.countDown()
-                }
+                val colorModifier =
+                    Modifier.drawBehind {
+                        drawRect(outerColor)
+                        drawRect(innerColor, topLeft = Offset(10f, 10f), size = Size(10f, 10f))
+                        drawLatch.countDown()
+                    }
                 FixedSize(30, colorModifier)
             }
         }
@@ -2322,13 +2317,9 @@
         val innerColor = Color.White
         activityTestRule.runOnUiThreadIR {
             activity.setContent {
-                val countDownModifier = Modifier.drawBehind {
-                    drawLatch.countDown()
-                }
+                val countDownModifier = Modifier.drawBehind { drawLatch.countDown() }
                 FixedSize(30, countDownModifier.background(color = outerColor)) {
-                    Padding(10) {
-                        FixedSize(10, Modifier.background(color = innerColor))
-                    }
+                    Padding(10) { FixedSize(10, Modifier.background(color = innerColor)) }
                 }
             }
         }
@@ -2345,9 +2336,8 @@
                 FixedSize(30, Modifier.background(color = outerColor)) {
                     FixedSize(
                         size = 10,
-                        modifier = Modifier.padding(10)
-                            .background(color = innerColor)
-                            .drawLatchModifier()
+                        modifier =
+                            Modifier.padding(10).background(color = innerColor).drawLatchModifier()
                     )
                 }
             }
@@ -2362,12 +2352,11 @@
         val innerColor = Color.White
         activityTestRule.runOnUiThreadIR {
             activity.setContent {
-                val drawAndOffset = Modifier.drawWithContent {
-                    drawRect(outerColor)
-                    translate(10f, 10f) {
-                        this@drawWithContent.drawContent()
+                val drawAndOffset =
+                    Modifier.drawWithContent {
+                        drawRect(outerColor)
+                        translate(10f, 10f) { this@drawWithContent.drawContent() }
                     }
-                }
                 FixedSize(30, drawAndOffset) {
                     FixedSize(
                         size = 10,
@@ -2388,30 +2377,22 @@
 
         activityTestRule.runOnUiThreadIR {
             activity.setContent {
-                FixedSize(
-                    30,
-                    modifier = Modifier.drawBehind {
-                        drawRect(green)
-                    }
-                ) {
+                FixedSize(30, modifier = Modifier.drawBehind { drawRect(green) }) {
                     FixedSize(
                         offset.value,
-                        modifier = AlignTopLeft.graphicsLayer()
-                            .drawBehind {
+                        modifier =
+                            AlignTopLeft.graphicsLayer().drawBehind {
                                 drawLatch.countDown()
                                 drawRect(blue)
                             }
-                    ) {
-                    }
+                    ) {}
                 }
             }
         }
         validateSquareColors(outerColor = green, innerColor = blue, size = 10, offset = -10)
 
         drawLatch = CountDownLatch(1)
-        activityTestRule.runOnUiThreadIR {
-            offset.value = 20
-        }
+        activityTestRule.runOnUiThreadIR { offset.value = 20 }
         validateSquareColors(
             outerColor = green,
             innerColor = blue,
@@ -2432,16 +2413,17 @@
             activity.setContent {
                 FixedSize(
                     size = size,
-                    modifier = Modifier
-                        .layout { measurable, constraints ->
-                            val placeable = measurable.measure(constraints)
-                            layout(placeable.width, placeable.height) {
-                                placeable.place(offset, offset)
+                    modifier =
+                        Modifier.layout { measurable, constraints ->
+                                val placeable = measurable.measure(constraints)
+                                layout(placeable.width, placeable.height) {
+                                    placeable.place(offset, offset)
+                                }
                             }
-                        }.onGloballyPositioned {
-                            resultCoordinates = it
-                            latch.countDown()
-                        }
+                            .onGloballyPositioned {
+                                resultCoordinates = it
+                                latch.countDown()
+                            }
                 )
             }
         }
@@ -2468,35 +2450,38 @@
             activity.setContent {
                 FixedSize(
                     size = size,
-                    modifier = Modifier
-                        .layout { measurable, constraints ->
-                            val placeable = measurable.measure(constraints)
-                            layout(placeable.width, placeable.height) {
-                                placeable.place(offset, offset)
+                    modifier =
+                        Modifier.layout { measurable, constraints ->
+                                val placeable = measurable.measure(constraints)
+                                layout(placeable.width, placeable.height) {
+                                    placeable.place(offset, offset)
+                                }
                             }
-                        }.onGloballyPositioned {
-                            convenienceCoordinates = it
-                            latch.countDown()
-                        }
+                            .onGloballyPositioned {
+                                convenienceCoordinates = it
+                                latch.countDown()
+                            }
                 )
 
-                val layoutModifier = object : LayoutModifier {
-                    override fun MeasureScope.measure(
-                        measurable: Measurable,
-                        constraints: Constraints
-                    ): MeasureResult {
-                        val placeable = measurable.measure(constraints)
-                        return layout(placeable.width, placeable.height) {
-                            placeable.place(offset, offset)
+                val layoutModifier =
+                    object : LayoutModifier {
+                        override fun MeasureScope.measure(
+                            measurable: Measurable,
+                            constraints: Constraints
+                        ): MeasureResult {
+                            val placeable = measurable.measure(constraints)
+                            return layout(placeable.width, placeable.height) {
+                                placeable.place(offset, offset)
+                            }
                         }
                     }
-                }
                 FixedSize(
                     size = size,
-                    modifier = layoutModifier.onGloballyPositioned {
-                        coordinates = it
-                        latch.countDown()
-                    }
+                    modifier =
+                        layoutModifier.onGloballyPositioned {
+                            coordinates = it
+                            latch.countDown()
+                        }
                 )
             }
         }
@@ -2516,8 +2501,7 @@
         activityTestRule.runOnUiThreadIR {
             activity.setContent {
                 FixedSize(30, Modifier.background(Color.Blue).drawLatchModifier()) {
-                    JustConstraints(LayoutAndDrawModifier(Color.White)) {
-                    }
+                    JustConstraints(LayoutAndDrawModifier(Color.White)) {}
                 }
             }
         }
@@ -2534,9 +2518,7 @@
                 FixedSize(size = 30, modifier = Modifier.background(Color.White)) {
                     FixedSize(
                         size = 10,
-                        modifier = Modifier.padding(5)
-                            .padding(5)
-                            .drawLatchModifier()
+                        modifier = Modifier.padding(5).padding(5).drawLatchModifier()
                     )
                 }
             }
@@ -2558,10 +2540,7 @@
     @Test
     @OptIn(InternalComposeUiApi::class)
     fun showLayoutBounds_resetOnResume() {
-        activityTestRule.runOnUiThreadIR {
-            activity.setContent {
-            }
-        }
+        activityTestRule.runOnUiThreadIR { activity.setContent {} }
         val composeView = activityTestRule.findAndroidComposeView() as AndroidComposeView
         // find out whatever the current setting value is for showLayoutBounds
         val startShowLayoutBounds = composeView.showLayoutBounds
@@ -2599,11 +2578,12 @@
                         var lastLayoutValue: Boolean = false
                         Layout(
                             content = {},
-                            modifier = Modifier.drawBehind {
-                                // this verifies the layout was remeasured before being drawn
-                                assertTrue(lastLayoutValue)
-                                drawlatch.countDown()
-                            }
+                            modifier =
+                                Modifier.drawBehind {
+                                    // this verifies the layout was remeasured before being drawn
+                                    assertTrue(lastLayoutValue)
+                                    drawlatch.countDown()
+                                }
                         ) { _, _ ->
                             lastLayoutValue = state.value
                             // this registers the value read
@@ -2638,17 +2618,14 @@
     fun layerModifier_scaleDraw() {
         activityTestRule.runOnUiThread {
             activity.setContent {
-                FixedSize(
-                    size = 30,
-                    modifier = Modifier.background(Color.Blue)
-                ) {
+                FixedSize(size = 30, modifier = Modifier.background(Color.Blue)) {
                     FixedSize(
                         size = 20,
-                        modifier = AlignTopLeft
-                            .padding(5)
-                            .scale(0.5f)
-                            .background(Color.Red)
-                            .latch(drawLatch)
+                        modifier =
+                            AlignTopLeft.padding(5)
+                                .scale(0.5f)
+                                .background(Color.Red)
+                                .latch(drawLatch)
                     ) {}
                 }
             }
@@ -2660,31 +2637,28 @@
     @Test
     fun layerModifier_scaleChange() {
         val scale = mutableStateOf(1f)
-        val layerModifier = Modifier.graphicsLayer {
-            scaleX = scale.value
-            scaleY = scale.value
-        }
+        val layerModifier =
+            Modifier.graphicsLayer {
+                scaleX = scale.value
+                scaleY = scale.value
+            }
         activityTestRule.runOnUiThread {
             activity.setContent {
-                FixedSize(
-                    size = 30,
-                    modifier = Modifier.background(Color.Blue)
-                ) {
+                FixedSize(size = 30, modifier = Modifier.background(Color.Blue)) {
                     FixedSize(
                         size = 10,
-                        modifier = Modifier.padding(10)
-                            .then(layerModifier)
-                            .background(Color.Red)
-                            .latch(drawLatch)
+                        modifier =
+                            Modifier.padding(10)
+                                .then(layerModifier)
+                                .background(Color.Red)
+                                .latch(drawLatch)
                     ) {}
                 }
             }
         }
         validateSquareColors(outerColor = Color.Blue, innerColor = Color.Red, size = 10)
 
-        activityTestRule.runOnUiThread {
-            scale.value = 2f
-        }
+        activityTestRule.runOnUiThread { scale.value = 2f }
 
         activityTestRule.waitAndScreenShot().apply {
             assertRect(Color.Red, size = 20, centerX = 15, centerY = 15)
@@ -2695,38 +2669,39 @@
     @SdkSuppress(minSdkVersion = Build.VERSION_CODES.O)
     @Test
     fun layerModifier_noClip() {
-        val triangleShape = object : Shape {
-            override fun createOutline(
-                size: Size,
-                layoutDirection: LayoutDirection,
-                density: Density
-            ) = Outline.Generic(
-                Path().apply {
-                    moveTo(size.width / 2f, 0f)
-                    lineTo(size.width, size.height)
-                    lineTo(0f, size.height)
-                    close()
-                }
-            )
-        }
+        val triangleShape =
+            object : Shape {
+                override fun createOutline(
+                    size: Size,
+                    layoutDirection: LayoutDirection,
+                    density: Density
+                ) =
+                    Outline.Generic(
+                        Path().apply {
+                            moveTo(size.width / 2f, 0f)
+                            lineTo(size.width, size.height)
+                            lineTo(0f, size.height)
+                            close()
+                        }
+                    )
+            }
         activityTestRule.runOnUiThread {
             activity.setContent {
-                FixedSize(
-                    size = 30
-                ) {
+                FixedSize(size = 30) {
                     FixedSize(
                         size = 10,
-                        modifier = Modifier.padding(10)
-                            .graphicsLayer(shape = triangleShape)
-                            .drawBehind {
-                                drawRect(
-                                    Color.Blue,
-                                    topLeft = Offset(-10f, -10f),
-                                    size = Size(30.0f, 30.0f)
-                                )
-                            }
-                            .background(Color.Red)
-                            .latch(drawLatch)
+                        modifier =
+                            Modifier.padding(10)
+                                .graphicsLayer(shape = triangleShape)
+                                .drawBehind {
+                                    drawRect(
+                                        Color.Blue,
+                                        topLeft = Offset(-10f, -10f),
+                                        size = Size(30.0f, 30.0f)
+                                    )
+                                }
+                                .background(Color.Red)
+                                .latch(drawLatch)
                     ) {}
                 }
             }
@@ -2744,22 +2719,16 @@
                     @Composable {
                         FixedSize(
                             size = 10,
-                            modifier = Modifier.graphicsLayer()
-                                .padding(10)
-                                .background(innerColor.value)
-                                .latch(drawLatch)
+                            modifier =
+                                Modifier.graphicsLayer()
+                                    .padding(10)
+                                    .background(innerColor.value)
+                                    .latch(drawLatch)
                         ) {}
                     }
                 }
-                FixedSize(
-                    size = 30,
-                    modifier = Modifier.graphicsLayer().background(Color.Blue)
-                ) {
-                    FixedSize(
-                        size = 30,
-                        modifier = Modifier.graphicsLayer(),
-                        content = content
-                    )
+                FixedSize(size = 30, modifier = Modifier.graphicsLayer().background(Color.Blue)) {
+                    FixedSize(size = 30, modifier = Modifier.graphicsLayer(), content = content)
                 }
             }
         }
@@ -2767,9 +2736,7 @@
 
         drawLatch = CountDownLatch(1)
 
-        activityTestRule.runOnUiThread {
-            innerColor.value = Color.White
-        }
+        activityTestRule.runOnUiThread { innerColor.value = Color.White }
 
         validateSquareColors(outerColor = Color.Blue, innerColor = Color.White, size = 10)
     }
@@ -2780,10 +2747,7 @@
         var outerLatch = CountDownLatch(1)
         activityTestRule.runOnUiThread {
             activity.setContent {
-                FixedSize(
-                    30,
-                    Modifier.drawBehind { outerLatch.countDown() }.graphicsLayer()
-                ) {
+                FixedSize(30, Modifier.drawBehind { outerLatch.countDown() }.graphicsLayer()) {
                     FixedSize(
                         10,
                         Modifier.drawBehind {
@@ -2815,11 +2779,7 @@
     @Test
     fun detachChildWithLayer() {
         activityTestRule.runOnUiThread {
-            activity.setContent {
-                FixedSize(10, Modifier.graphicsLayer()) {
-                    FixedSize(8)
-                }
-            }
+            activity.setContent { FixedSize(10, Modifier.graphicsLayer()) { FixedSize(8) } }
             activity.setContentView(View(activity)) // Replace content view with empty
         }
     }
@@ -2832,16 +2792,16 @@
         var placeLatch = CountDownLatch(1)
         activityTestRule.runOnUiThread {
             activity.setContent {
-                val yellowSquare = @Composable {
-                    FixedSize(
-                        10, Modifier.graphicsLayer().background(Color.Yellow).drawLatchModifier()
-                    ) {
+                val yellowSquare =
+                    @Composable {
+                        FixedSize(
+                            10,
+                            Modifier.graphicsLayer().background(Color.Yellow).drawLatchModifier()
+                        ) {}
                     }
-                }
-                Layout(
-                    modifier = Modifier.background(Color.Red),
-                    content = yellowSquare
-                ) { measurables, _ ->
+                Layout(modifier = Modifier.background(Color.Red), content = yellowSquare) {
+                    measurables,
+                    _ ->
                     val childConstraints = Constraints.fixed(10, 10)
                     val p = measurables[0].measure(childConstraints)
                     layout(30, 30) {
@@ -2855,15 +2815,12 @@
         validateSquareColors(outerColor = Color.Red, innerColor = Color.Yellow, size = 10)
 
         placeLatch = CountDownLatch(1)
-        activityTestRule.runOnUiThread {
-            offset.value = 5
-        }
+        activityTestRule.runOnUiThread { offset.value = 5 }
 
         // Wait for layout to complete
         assertTrue(placeLatch.await(1, TimeUnit.SECONDS))
 
-        activityTestRule.runOnUiThread {
-        }
+        activityTestRule.runOnUiThread {}
 
         activityTestRule.waitAndScreenShot(forceInvalidate = false).apply {
             // just test that it is red around the Yellow
@@ -2890,9 +2847,9 @@
                                 translationLatch.countDown()
                                 translationX = offset.value
                                 translationY = offset.value
-                            }.background(Color.Yellow)
-                    ) {
-                    }
+                            }
+                            .background(Color.Yellow)
+                    ) {}
                 }
             }
         }
@@ -2900,14 +2857,11 @@
         validateSquareColors(outerColor = Color.Red, innerColor = Color.Yellow, size = 10)
 
         translationLatch = CountDownLatch(1)
-        activityTestRule.runOnUiThread {
-            offset.value = -5f
-        }
+        activityTestRule.runOnUiThread { offset.value = -5f }
         // Wait for translation to complete
         assertTrue(translationLatch.await(1, TimeUnit.SECONDS))
 
-        activityTestRule.runOnUiThread {
-        }
+        activityTestRule.runOnUiThread {}
 
         activityTestRule.waitAndScreenShot(forceInvalidate = false).apply {
             // just test that it is red around the Yellow
@@ -2924,23 +2878,23 @@
         var color by mutableStateOf(Color.Red)
         var size by mutableStateOf(30)
         var m: Measurable? = null
-        val layoutCaptureModifier = object : LayoutModifier {
-            override fun MeasureScope.measure(
-                measurable: Measurable,
-                constraints: Constraints
-            ): MeasureResult {
-                m = measurable
-                val p = measurable.measure(constraints)
-                return layout(p.width, p.height) {
-                    p.place(0, 0)
+        val layoutCaptureModifier =
+            object : LayoutModifier {
+                override fun MeasureScope.measure(
+                    measurable: Measurable,
+                    constraints: Constraints
+                ): MeasureResult {
+                    m = measurable
+                    val p = measurable.measure(constraints)
+                    return layout(p.width, p.height) { p.place(0, 0) }
                 }
             }
-        }
-        val drawCaptureModifier = object : DrawModifier {
-            override fun ContentDrawScope.draw() {
-                drawLatch.countDown()
+        val drawCaptureModifier =
+            object : DrawModifier {
+                override fun ContentDrawScope.draw() {
+                    drawLatch.countDown()
+                }
             }
-        }
         activityTestRule.runOnUiThread {
             activity.setContent {
                 FixedSize(
@@ -2984,32 +2938,24 @@
             ): MeasureResult {
                 val placeable = measurable.measure(constraints)
                 layoutLatch.countDown()
-                return layout(placeable.width, placeable.height) {
-                    placeable.place(0, 0)
-                }
+                return layout(placeable.width, placeable.height) { placeable.place(0, 0) }
             }
         }
 
-        val layoutCaptureModifier = object : LayoutModifier {
-            override fun MeasureScope.measure(
-                measurable: Measurable,
-                constraints: Constraints
-            ): MeasureResult {
-                m = measurable
-                val p = measurable.measure(constraints)
-                return layout(p.width, p.height) {
-                    p.place(0, 0)
+        val layoutCaptureModifier =
+            object : LayoutModifier {
+                override fun MeasureScope.measure(
+                    measurable: Measurable,
+                    constraints: Constraints
+                ): MeasureResult {
+                    m = measurable
+                    val p = measurable.measure(constraints)
+                    return layout(p.width, p.height) { p.place(0, 0) }
                 }
             }
-        }
         activityTestRule.runOnUiThread {
             activity.setContent {
-                FixedSize(
-                    30,
-                    layoutCaptureModifier
-                        .then(SpecialModifier())
-                        .background(color)
-                ) {}
+                FixedSize(30, layoutCaptureModifier.then(SpecialModifier()).background(color)) {}
             }
         }
         assertTrue(layoutLatch.await(1, TimeUnit.SECONDS))
@@ -3041,11 +2987,10 @@
             activity.setContent {
                 FixedSize(
                     size = 10,
-                    modifier = Modifier.background(color = color).drawLatchModifier().then(
-                        Modifier.padding(10)
-                            .graphicsLayer()
-                            .background(Color.White)
-                    )
+                    modifier =
+                        Modifier.background(color = color)
+                            .drawLatchModifier()
+                            .then(Modifier.padding(10).graphicsLayer().background(Color.White))
                 )
             }
         }
@@ -3071,19 +3016,19 @@
                     ) {
                         FixedSize(
                             size = 10,
-                            modifier = Modifier
-                                .graphicsLayer()
-                                .zIndex(zIndex)
-                                .padding(10.toDp())
-                                .background(Color.White)
+                            modifier =
+                                Modifier.graphicsLayer()
+                                    .zIndex(zIndex)
+                                    .padding(10.toDp())
+                                    .background(Color.White)
                         )
                         FixedSize(
                             size = 10,
-                            modifier = Modifier
-                                .graphicsLayer()
-                                .zIndex(0f)
-                                .padding(10.toDp())
-                                .background(Color.Yellow)
+                            modifier =
+                                Modifier.graphicsLayer()
+                                    .zIndex(0f)
+                                    .padding(10.toDp())
+                                    .background(Color.Yellow)
                         )
                     }
                 }
@@ -3105,11 +3050,12 @@
             activity.setContent {
                 FixedSize(
                     size = 10,
-                    modifier = Modifier.background(Color.Blue)
-                        .padding(10)
-                        .graphicsLayer()
-                        .then(if (showInner) Modifier.background(Color.White) else Modifier)
-                        .drawLatchModifier()
+                    modifier =
+                        Modifier.background(Color.Blue)
+                            .padding(10)
+                            .graphicsLayer()
+                            .then(if (showInner) Modifier.background(Color.White) else Modifier)
+                            .drawLatchModifier()
                 )
             }
         }
@@ -3135,9 +3081,7 @@
                     assertEquals(size, boxSize)
                     val placeable = measurables[0].measure(constraints)
                     measuredLatch.countDown()
-                    layout(boxSize, boxSize) {
-                        placeable.place(0, 0)
-                    }
+                    layout(boxSize, boxSize) { placeable.place(0, 0) }
                 }
             }
         }
@@ -3162,23 +3106,17 @@
             container2 = ComposeView(activity)
             activity.setContentView(container1)
             container1.addView(container2)
-            container2.setContent {
-                FixedSize(10, Modifier.drawLatchModifier())
-            }
+            container2.setContent { FixedSize(10, Modifier.drawLatchModifier()) }
         }
 
         assertTrue(drawLatch.await(10000, TimeUnit.SECONDS))
 
         drawLatch = CountDownLatch(1)
-        activityTestRule.runOnUiThread {
-            container1.removeView(container2)
-        }
+        activityTestRule.runOnUiThread { container1.removeView(container2) }
 
         assertFalse(drawLatch.await(200, TimeUnit.MILLISECONDS))
 
-        activityTestRule.runOnUiThread {
-            container1.addView(container2)
-        }
+        activityTestRule.runOnUiThread { container1.addView(container2) }
 
         // draw modifier will be redrawn if the root node is placed
         assertTrue(drawLatch.await(10000, TimeUnit.SECONDS))
@@ -3198,10 +3136,7 @@
                     var animatedSize by remember { mutableStateOf(size) }
                     animatedSize = animateFloatAsState(size).value
                     if (animatedSize == 10f) {
-                        Layout(
-                            modifier = Modifier.background(Color.Cyan),
-                            content = {}
-                        ) { _, _ ->
+                        Layout(modifier = Modifier.background(Color.Cyan), content = {}) { _, _ ->
                             if (animatedSize != 10f) {
                                 measureLatch.countDown()
                             }
@@ -3217,9 +3152,7 @@
 
         assertTrue(drawLatch.await(1, TimeUnit.SECONDS))
         drawLatch = CountDownLatch(1)
-        activityTestRule.runOnUiThread {
-            size = 20f
-        }
+        activityTestRule.runOnUiThread { size = 20f }
 
         assertTrue(notShownLatch.await(1, TimeUnit.SECONDS))
         assertFalse(measureLatch.await(200, TimeUnit.MILLISECONDS))
@@ -3238,8 +3171,7 @@
             view.setContent {
                 with(LocalDensity.current) {
                     Box(
-                        Modifier
-                            .background(Color.Blue)
+                        Modifier.background(Color.Blue)
                             .requiredSize(30.toDp())
                             .padding(10.toDp())
                             .background(Color.White)
@@ -3282,8 +3214,7 @@
             view.setContent {
                 with(LocalDensity.current) {
                     Box(
-                        Modifier
-                            .background(Color.Blue)
+                        Modifier.background(Color.Blue)
                             .requiredSize(30.toDp())
                             .padding(10.toDp())
                             .drawBehind {
@@ -3315,9 +3246,7 @@
         drawLatch = CountDownLatch(1)
         innerColor = Color.Yellow
 
-        activityTestRule.runOnUiThread {
-            parent!!.addView(view)
-        }
+        activityTestRule.runOnUiThread { parent!!.addView(view) }
 
         validateSquareColors(Color.Blue, Color.Yellow, size = 10)
     }
@@ -3330,23 +3259,16 @@
         var size by mutableStateOf(10.dp)
         var layoutLatch = CountDownLatch(1)
         var measuredSize = 0.dp
-        val sizeModifier = Modifier.layout { measurable, constraints ->
-            measuredSize = size
-            layoutLatch.countDown()
-            val pxSize = size.roundToPx()
-            layout(pxSize, pxSize) {
-                measurable.measure(constraints).place(0, 0)
+        val sizeModifier =
+            Modifier.layout { measurable, constraints ->
+                measuredSize = size
+                layoutLatch.countDown()
+                val pxSize = size.roundToPx()
+                layout(pxSize, pxSize) { measurable.measure(constraints).place(0, 0) }
             }
-        }
         activityTestRule.runOnUiThread {
             view = ComposeView(activity)
-            view.setContent {
-                Box(
-                    Modifier
-                        .background(Color.Blue)
-                        .then(sizeModifier)
-                )
-            }
+            view.setContent { Box(Modifier.background(Color.Blue).then(sizeModifier)) }
             activity.setContentView(view)
         }
 
@@ -3364,9 +3286,7 @@
         layoutLatch = CountDownLatch(1)
         size = 30.dp
 
-        activityTestRule.runOnUiThread {
-            parent!!.addView(view)
-        }
+        activityTestRule.runOnUiThread { parent!!.addView(view) }
 
         assertTrue(layoutLatch.await(1, TimeUnit.SECONDS))
         assertEquals(measuredSize, 30.dp)
@@ -3384,16 +3304,14 @@
             val composeView = ComposeView(activity)
             composeView.setContent {
                 Box(
-                    Modifier
-                        .fillMaxSize()
-                        .drawBehind {
-                            val marginFloat = padding.toFloat()
-                            drawRect(
-                                color = Color.Red,
-                                topLeft = Offset(-marginFloat, -marginFloat),
-                                size = Size(marginFloat * 2, marginFloat * 2)
-                            )
-                        }
+                    Modifier.fillMaxSize().drawBehind {
+                        val marginFloat = padding.toFloat()
+                        drawRect(
+                            color = Color.Red,
+                            topLeft = Offset(-marginFloat, -marginFloat),
+                            size = Size(marginFloat * 2, marginFloat * 2)
+                        )
+                    }
                 )
             }
             frameLayout = FrameLayout(activity)
@@ -3404,15 +3322,17 @@
             activity.setContentView(
                 frameLayout,
                 ViewGroup.LayoutParams(
-                    ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT
+                    ViewGroup.LayoutParams.WRAP_CONTENT,
+                    ViewGroup.LayoutParams.WRAP_CONTENT
                 )
             )
         }
 
-        activityTestRule.waitAndScreenShot(frameLayout).asImageBitmap()
-            .assertPixels(expectedSize = IntSize(size, size)) {
-                Color.Red
-            }
+        activityTestRule.waitAndScreenShot(frameLayout).asImageBitmap().assertPixels(
+            expectedSize = IntSize(size, size)
+        ) {
+            Color.Red
+        }
     }
 
     @SdkSuppress(minSdkVersion = Build.VERSION_CODES.O)
@@ -3425,22 +3345,16 @@
             activity.setContent {
                 Layout(
                     content = {
-                        AtLeastSize(
-                            size = 10,
-                            modifier = Modifier.drawBehind {
-                                drawRect(red)
-                            }
-                        )
+                        AtLeastSize(size = 10, modifier = Modifier.drawBehind { drawRect(red) })
                     },
-                    modifier = Modifier.drawBehind {
-                        drawRect(yellow)
-                        drawLatch.countDown()
-                    }
+                    modifier =
+                        Modifier.drawBehind {
+                            drawRect(yellow)
+                            drawLatch.countDown()
+                        }
                 ) { measurables, constraints ->
                     val placeable = measurables.first().measure(constraints)
-                    layout(30, 30) {
-                        placeable.placeWithLayer(10, 10)
-                    }
+                    layout(30, 30) { placeable.placeWithLayer(10, 10) }
                 }
             }
         }
@@ -3458,17 +3372,13 @@
             activity.setContent {
                 Layout(
                     content = {
-                        AtLeastSize(
-                            size = 20,
-                            modifier = Modifier.drawBehind {
-                                drawRect(red)
-                            }
-                        )
+                        AtLeastSize(size = 20, modifier = Modifier.drawBehind { drawRect(red) })
                     },
-                    modifier = Modifier.drawBehind {
-                        drawRect(yellow)
-                        drawLatch.countDown()
-                    }
+                    modifier =
+                        Modifier.drawBehind {
+                            drawRect(yellow)
+                            drawLatch.countDown()
+                        }
                 ) { measurables, constraints ->
                     val placeable = measurables.first().measure(constraints)
                     layout(30, 30) {
@@ -3496,21 +3406,18 @@
                     content = {
                         AtLeastSize(
                             size = 20,
-                            modifier = Modifier.drawBehind {
-                                childInvalidationCount++
-                            }
+                            modifier = Modifier.drawBehind { childInvalidationCount++ }
                         )
                     },
-                    modifier = Modifier.drawWithContent {
-                        drawContent()
-                        parentInvalidationCount++
-                        drawLatch.countDown()
-                    }
+                    modifier =
+                        Modifier.drawWithContent {
+                            drawContent()
+                            parentInvalidationCount++
+                            drawLatch.countDown()
+                        }
                 ) { measurables, constraints ->
                     val placeable = measurables.first().measure(constraints)
-                    layout(30, 30) {
-                        placeable.placeWithLayer(offset, offset)
-                    }
+                    layout(30, 30) { placeable.placeWithLayer(offset, offset) }
                 }
             }
         }
@@ -3527,9 +3434,7 @@
         assertEquals(1, childInvalidationCount)
     }
 
-    /**
-     * invalidateDescendants should invalidate all layout layers.
-     */
+    /** invalidateDescendants should invalidate all layout layers. */
     @SdkSuppress(minSdkVersion = Build.VERSION_CODES.O)
     @Test
     fun invalidateDescendants() {
@@ -3562,83 +3467,84 @@
     }
 
     @Test
-    fun placeableMeasuredSize() = with(density) {
-        val realSize = 100.dp
-        val constrainedSize = 50.dp
-        val latch = CountDownLatch(1)
-        activityTestRule.runOnUiThread {
-            activity.setContent {
-                Layout(
-                    content = {
-                        Box(Modifier.requiredSize(realSize))
+    fun placeableMeasuredSize() =
+        with(density) {
+            val realSize = 100.dp
+            val constrainedSize = 50.dp
+            val latch = CountDownLatch(1)
+            activityTestRule.runOnUiThread {
+                activity.setContent {
+                    Layout(content = { Box(Modifier.requiredSize(realSize)) }) { measurables, _ ->
+                        val placeable =
+                            measurables[0].measure(
+                                Constraints.fixed(
+                                    constrainedSize.roundToPx(),
+                                    constrainedSize.roundToPx()
+                                )
+                            )
+                        assertEquals(realSize.roundToPx(), placeable.measuredWidth)
+                        assertEquals(realSize.roundToPx(), placeable.measuredHeight)
+                        assertEquals(constrainedSize.roundToPx(), placeable.width)
+                        assertEquals(constrainedSize.roundToPx(), placeable.height)
+                        latch.countDown()
+                        layout(1, 1) {}
                     }
-                ) { measurables, _ ->
-                    val placeable = measurables[0].measure(
-                        Constraints.fixed(constrainedSize.roundToPx(), constrainedSize.roundToPx())
-                    )
-                    assertEquals(realSize.roundToPx(), placeable.measuredWidth)
-                    assertEquals(realSize.roundToPx(), placeable.measuredHeight)
-                    assertEquals(constrainedSize.roundToPx(), placeable.width)
-                    assertEquals(constrainedSize.roundToPx(), placeable.height)
-                    latch.countDown()
-                    layout(1, 1) { }
                 }
             }
+            assertTrue(latch.await(1, TimeUnit.SECONDS))
         }
-        assertTrue(latch.await(1, TimeUnit.SECONDS))
-    }
 
     @Test
-    fun noRemeasureWhenWeStopUsingStateInMeasuring() = with(density) {
-        val counter = mutableStateOf(0)
-        var latch = CountDownLatch(1)
-        var parentRemeasures = 0
-        var measurePolicy = mutableStateOf(
-            MeasurePolicy { measurables, constraints ->
-                counter.value
+    fun noRemeasureWhenWeStopUsingStateInMeasuring() =
+        with(density) {
+            val counter = mutableStateOf(0)
+            var latch = CountDownLatch(1)
+            var parentRemeasures = 0
+            var measurePolicy =
+                mutableStateOf(
+                    MeasurePolicy { measurables, constraints ->
+                        counter.value
+                        parentRemeasures++
+                        measurables.first().measure(constraints)
+                        layout(1, 1) {}
+                    }
+                )
+            activityTestRule.runOnUiThread {
+                activity.setContent {
+                    Layout(
+                        content = {
+                            Layout(content = {}) { _, _ ->
+                                counter.value
+                                latch.countDown()
+                                layout(1, 1) {}
+                            }
+                        },
+                        measurePolicy = measurePolicy.value
+                    )
+                }
+            }
+
+            assertTrue(latch.await(1, TimeUnit.SECONDS))
+            assertEquals(1, parentRemeasures)
+
+            latch = CountDownLatch(1)
+            measurePolicy.value = MeasurePolicy { measurables, constraints ->
+                // not using counter anymore
                 parentRemeasures++
                 measurables.first().measure(constraints)
-                layout(1, 1) { }
+                layout(1, 1) {}
             }
-        )
-        activityTestRule.runOnUiThread {
-            activity.setContent {
-                Layout(
-                    content = {
-                        Layout(
-                            content = {}
-                        ) { _, _ ->
-                            counter.value
-                            latch.countDown()
-                            layout(1, 1) { }
-                        }
-                    },
-                    measurePolicy = measurePolicy.value
-                )
-            }
+
+            assertTrue(latch.await(10000, TimeUnit.SECONDS))
+            assertEquals(2, parentRemeasures)
+
+            latch = CountDownLatch(1)
+            counter.value = 1
+
+            assertTrue(latch.await(10000, TimeUnit.SECONDS))
+            assertEquals(2, parentRemeasures)
         }
 
-        assertTrue(latch.await(1, TimeUnit.SECONDS))
-        assertEquals(1, parentRemeasures)
-
-        latch = CountDownLatch(1)
-        measurePolicy.value = MeasurePolicy { measurables, constraints ->
-            // not using counter anymore
-            parentRemeasures++
-            measurables.first().measure(constraints)
-            layout(1, 1) { }
-        }
-
-        assertTrue(latch.await(10000, TimeUnit.SECONDS))
-        assertEquals(2, parentRemeasures)
-
-        latch = CountDownLatch(1)
-        counter.value = 1
-
-        assertTrue(latch.await(10000, TimeUnit.SECONDS))
-        assertEquals(2, parentRemeasures)
-    }
-
     @Test
     fun updatingModifierIsNotCausingParentsRelayout() {
         var parentLayoutsCount = 0
@@ -3655,11 +3561,7 @@
             activity.setContent {
                 Layout(
                     content = {
-                        Layout({}, modifier) { _, _ ->
-                            layout(10, 10) {
-                                latch.countDown()
-                            }
-                        }
+                        Layout({}, modifier) { _, _ -> layout(10, 10) { latch.countDown() } }
                     },
                     measurePolicy = parentMeasurePolicy
                 )
@@ -3675,9 +3577,7 @@
 
         assertTrue(latch.await(1, TimeUnit.SECONDS))
 
-        activityTestRule.runOnUiThread {
-            assertEquals(1, parentLayoutsCount)
-        }
+        activityTestRule.runOnUiThread { assertEquals(1, parentLayoutsCount) }
     }
 
     @SdkSuppress(minSdkVersion = Build.VERSION_CODES.O)
@@ -3690,21 +3590,22 @@
         activityTestRule.runOnUiThread {
             activity.setContent {
                 with(LocalDensity.current) {
-                    Box(Modifier.size(30.toDp())
-                        .drawBehind {
-                            drawRect(outerColor)
-                            outerDrawLatch.countDown()
-                        }
-                        .drawLatchModifier()
-                        .padding(10.toDp())
-                        .clipToBounds()
-                        .drawBehind {
-                            // clipped by the layer
-                            drawRect(innerColor, Offset(-10f, -10f), Size(30f, 30f))
-                            innerDrawLatch.countDown()
-                        }
-                        .drawLatchModifier()
-                        .size(10.toDp())
+                    Box(
+                        Modifier.size(30.toDp())
+                            .drawBehind {
+                                drawRect(outerColor)
+                                outerDrawLatch.countDown()
+                            }
+                            .drawLatchModifier()
+                            .padding(10.toDp())
+                            .clipToBounds()
+                            .drawBehind {
+                                // clipped by the layer
+                                drawRect(innerColor, Offset(-10f, -10f), Size(30f, 30f))
+                                innerDrawLatch.countDown()
+                            }
+                            .drawLatchModifier()
+                            .size(10.toDp())
                     )
                 }
             }
@@ -3712,11 +3613,7 @@
         assertTrue(innerDrawLatch.await(1, TimeUnit.SECONDS))
         assertTrue(outerDrawLatch.await(1, TimeUnit.SECONDS))
 
-        validateSquareColors(
-            outerColor = Color.Blue,
-            innerColor = Color.White,
-            size = 10
-        )
+        validateSquareColors(outerColor = Color.Blue, innerColor = Color.White, size = 10)
 
         innerDrawLatch = CountDownLatch(1)
         outerDrawLatch = CountDownLatch(1)
@@ -3727,11 +3624,7 @@
 
         assertTrue(innerDrawLatch.await(1, TimeUnit.SECONDS))
 
-        validateSquareColors(
-            outerColor = Color.Blue,
-            innerColor = Color.Yellow,
-            size = 10
-        )
+        validateSquareColors(outerColor = Color.Blue, innerColor = Color.Yellow, size = 10)
 
         assertEquals(1, outerDrawLatch.count)
         innerDrawLatch = CountDownLatch(1)
@@ -3742,40 +3635,29 @@
 
         assertTrue(outerDrawLatch.await(1, TimeUnit.SECONDS))
 
-        validateSquareColors(
-            outerColor = Color.Red,
-            innerColor = Color.Yellow,
-            size = 10
-        )
+        validateSquareColors(outerColor = Color.Red, innerColor = Color.Yellow, size = 10)
 
         assertEquals(1, innerDrawLatch.count)
     }
 
     /**
-     * Android Transitions should be possible with Compose Views. View layers can
-     * confuse the Android Transition system.
+     * Android Transitions should be possible with Compose Views. View layers can confuse the
+     * Android Transition system.
      */
     @Test
     fun worksWithTransitions() {
         val frameLayout = FrameLayout(activity)
         activityTestRule.runOnUiThread {
             activity.setContentView(frameLayout)
-            val composeView = ComposeView(activity).apply {
-                setContent {
-                    Box {}
-                }
-            }
+            val composeView = ComposeView(activity).apply { setContent { Box {} } }
             frameLayout.addView(composeView)
         }
 
         activityTestRule.runOnUiThread {
             TransitionManager.beginDelayedTransition(frameLayout)
             frameLayout.removeAllViews()
-            val composeView = ComposeView(activity).apply {
-                setContent {
-                    Box(Modifier.drawLatchModifier()) {}
-                }
-            }
+            val composeView =
+                ComposeView(activity).apply { setContent { Box(Modifier.drawLatchModifier()) {} } }
             frameLayout.addView(composeView)
         }
 
@@ -3812,9 +3694,7 @@
 
         assertTrue(latch.await(1, TimeUnit.SECONDS))
 
-        activityTestRule.runOnUiThread {
-            Truth.assertThat(root.requestLayoutCalled).isFalse()
-        }
+        activityTestRule.runOnUiThread { Truth.assertThat(root.requestLayoutCalled).isFalse() }
     }
 
     private fun Modifier.layout(onLayout: () -> Unit) = layout { measurable, constraints ->
@@ -3830,16 +3710,15 @@
             activity.setContent {
                 Padding(
                     size = model.size,
-                    modifier = Modifier.drawBehind {
-                        drawRect(model.outerColor)
-                    }
+                    modifier = Modifier.drawBehind { drawRect(model.outerColor) }
                 ) {
                     AtLeastSize(
                         size = model.size,
-                        modifier = Modifier.drawBehind {
-                            drawLatch.countDown()
-                            drawRect(model.innerColor)
-                        }
+                        modifier =
+                            Modifier.drawBehind {
+                                drawLatch.countDown()
+                                drawRect(model.innerColor)
+                            }
                     )
                 }
             }
@@ -3851,14 +3730,14 @@
             activity.setContent {
                 Padding(
                     size = model.size,
-                    modifier = Modifier.fillColor(model, isInner = false, doCountDown = false)
-                        .graphicsLayer()
+                    modifier =
+                        Modifier.fillColor(model, isInner = false, doCountDown = false)
+                            .graphicsLayer()
                 ) {
                     AtLeastSize(
                         size = model.size,
                         modifier = Modifier.graphicsLayer().fillColor(model, isInner = true)
-                    ) {
-                    }
+                    ) {}
                 }
             }
         }
@@ -3875,8 +3754,7 @@
                     AtLeastSize(
                         size = model.size,
                         modifier = Modifier.graphicsLayer().fillColor(model, isInner = true)
-                    ) {
-                    }
+                    ) {}
                 }
             }
         }
@@ -3893,8 +3771,7 @@
                     AtLeastSize(
                         size = model.size,
                         modifier = Modifier.fillColor(model, isInner = true)
-                    ) {
-                    }
+                    ) {}
                 }
             }
         }
@@ -3903,18 +3780,18 @@
     private fun composeNestedSquares(model: SquareModel) {
         activityTestRule.runOnUiThreadIR {
             activity.setContent {
-                val fillColorModifier = Modifier.drawBehind {
-                    drawRect(model.innerColor)
-                    drawLatch.countDown()
-                }
-                val innerDrawWithContentModifier = Modifier.drawWithContent {
-                    drawRect(model.outerColor)
-                    val start = model.size.toFloat()
-                    val end = start * 2
-                    clipRect(start, start, end, end) {
-                        this@drawWithContent.drawContent()
+                val fillColorModifier =
+                    Modifier.drawBehind {
+                        drawRect(model.innerColor)
+                        drawLatch.countDown()
                     }
-                }
+                val innerDrawWithContentModifier =
+                    Modifier.drawWithContent {
+                        drawRect(model.outerColor)
+                        val start = model.size.toFloat()
+                        val end = start * 2
+                        clipRect(start, start, end, end) { this@drawWithContent.drawContent() }
+                    }
                 AtLeastSize(size = (model.size * 3), modifier = innerDrawWithContentModifier) {
                     AtLeastSize(size = (model.size * 3), modifier = fillColorModifier)
                 }
@@ -3969,13 +3846,9 @@
         content: @Composable () -> Unit
     ) {
         Layout(modifier = modifier, content = content) { measurables, constraints ->
-            val placeables = measurables.map { m ->
-                m.measure(constraints)
-            }
+            val placeables = measurables.map { m -> m.measure(constraints) }
             layout(size, size) {
-                placeables.forEach { child ->
-                    child.place(offset.value, offset.value)
-                }
+                placeables.forEach { child -> child.place(offset.value, offset.value) }
                 positionLatch?.countDown()
             }
         }
@@ -3998,9 +3871,7 @@
     val halfHoleSize = holeSize / 2
     for (x in centerX - size / 2 until centerX + size / 2) {
         for (y in centerY - size / 2 until centerY + size / 2) {
-            if (abs(x - centerX) > halfHoleSize &&
-                abs(y - centerY) > halfHoleSize
-            ) {
+            if (abs(x - centerX) > halfHoleSize && abs(y - centerY) > halfHoleSize) {
                 val currentColor = Color(getPixel(x, y))
                 assertColorsEqual(color, currentColor)
             }
@@ -4053,41 +3924,34 @@
 }
 
 @Composable
-fun AtLeastSize(
-    size: Int,
-    modifier: Modifier = Modifier,
-    content: @Composable () -> Unit = {}
-) {
+fun AtLeastSize(size: Int, modifier: Modifier = Modifier, content: @Composable () -> Unit = {}) {
     Layout(
         measurePolicy = { measurables, constraints ->
-            val newConstraints = Constraints(
-                minWidth = max(size, constraints.minWidth),
-                maxWidth = if (constraints.hasBoundedWidth) {
-                    max(size, constraints.maxWidth)
-                } else {
-                    Constraints.Infinity
-                },
-                minHeight = max(size, constraints.minHeight),
-                maxHeight = if (constraints.hasBoundedHeight) {
-                    max(size, constraints.maxHeight)
-                } else {
-                    Constraints.Infinity
-                }
-            )
-            val placeables = measurables.map { m ->
-                m.measure(newConstraints)
-            }
+            val newConstraints =
+                Constraints(
+                    minWidth = max(size, constraints.minWidth),
+                    maxWidth =
+                        if (constraints.hasBoundedWidth) {
+                            max(size, constraints.maxWidth)
+                        } else {
+                            Constraints.Infinity
+                        },
+                    minHeight = max(size, constraints.minHeight),
+                    maxHeight =
+                        if (constraints.hasBoundedHeight) {
+                            max(size, constraints.maxHeight)
+                        } else {
+                            Constraints.Infinity
+                        }
+                )
+            val placeables = measurables.map { m -> m.measure(newConstraints) }
             var maxWidth = size
             var maxHeight = size
             placeables.forEach { child ->
                 maxHeight = max(child.height, maxHeight)
                 maxWidth = max(child.width, maxWidth)
             }
-            layout(maxWidth, maxHeight) {
-                placeables.forEach { child ->
-                    child.place(0, 0)
-                }
-            }
+            layout(maxWidth, maxHeight) { placeables.forEach { child -> child.place(0, 0) } }
         },
         modifier = modifier,
         content = content
@@ -4095,21 +3959,11 @@
 }
 
 @Composable
-fun FixedSize(
-    size: Int,
-    modifier: Modifier = Modifier,
-    content: @Composable () -> Unit = {}
-) {
+fun FixedSize(size: Int, modifier: Modifier = Modifier, content: @Composable () -> Unit = {}) {
     Layout(content = content, modifier = modifier) { measurables, _ ->
         val newConstraints = Constraints.fixed(size, size)
-        val placeables = measurables.map { m ->
-            m.measure(newConstraints)
-        }
-        layout(size, size) {
-            placeables.forEach { child ->
-                child.placeRelative(0, 0)
-            }
-        }
+        val placeables = measurables.map { m -> m.measure(newConstraints) }
+        layout(size, size) { placeables.forEach { child -> child.placeRelative(0, 0) } }
     }
 }
 
@@ -4118,15 +3972,14 @@
     Layout(
         modifier = modifier,
         measurePolicy = { measurables, constraints ->
-            val newConstraints = Constraints(
-                minWidth = 0,
-                maxWidth = constraints.maxWidth,
-                minHeight = 0,
-                maxHeight = constraints.maxHeight
-            )
-            val placeables = measurables.map { m ->
-                m.measure(newConstraints)
-            }
+            val newConstraints =
+                Constraints(
+                    minWidth = 0,
+                    maxWidth = constraints.maxWidth,
+                    minHeight = 0,
+                    maxHeight = constraints.maxHeight
+                )
+            val placeables = measurables.map { m -> m.measure(newConstraints) }
             var maxWidth = constraints.minWidth
             var maxHeight = constraints.minHeight
             placeables.forEach { child ->
@@ -4134,9 +3987,7 @@
                 maxWidth = max(child.width, maxWidth)
             }
             layout(maxWidth, maxHeight) {
-                placeables.forEach { child ->
-                    child.placeRelative(0, 0)
-                }
+                placeables.forEach { child -> child.placeRelative(0, 0) }
             }
         },
         content = content
@@ -4144,36 +3995,33 @@
 }
 
 @Composable
-internal fun Padding(
-    size: Int,
-    modifier: Modifier = Modifier,
-    content: @Composable () -> Unit
-) {
+internal fun Padding(size: Int, modifier: Modifier = Modifier, content: @Composable () -> Unit) {
     Layout(
         modifier = modifier,
         measurePolicy = { measurables, constraints ->
             val totalDiff = size * 2
             val targetMinWidth = constraints.minWidth - totalDiff
-            val targetMaxWidth = if (constraints.hasBoundedWidth) {
-                constraints.maxWidth - totalDiff
-            } else {
-                Constraints.Infinity
-            }
+            val targetMaxWidth =
+                if (constraints.hasBoundedWidth) {
+                    constraints.maxWidth - totalDiff
+                } else {
+                    Constraints.Infinity
+                }
             val targetMinHeight = constraints.minHeight - totalDiff
-            val targetMaxHeight = if (constraints.hasBoundedHeight) {
-                constraints.maxHeight - totalDiff
-            } else {
-                Constraints.Infinity
-            }
-            val newConstraints = Constraints(
-                minWidth = targetMinWidth.coerceAtLeast(0),
-                maxWidth = targetMaxWidth.coerceAtLeast(0),
-                minHeight = targetMinHeight.coerceAtLeast(0),
-                maxHeight = targetMaxHeight.coerceAtLeast(0)
-            )
-            val placeables = measurables.map { m ->
-                m.measure(newConstraints)
-            }
+            val targetMaxHeight =
+                if (constraints.hasBoundedHeight) {
+                    constraints.maxHeight - totalDiff
+                } else {
+                    Constraints.Infinity
+                }
+            val newConstraints =
+                Constraints(
+                    minWidth = targetMinWidth.coerceAtLeast(0),
+                    maxWidth = targetMaxWidth.coerceAtLeast(0),
+                    minHeight = targetMinHeight.coerceAtLeast(0),
+                    maxHeight = targetMaxHeight.coerceAtLeast(0)
+                )
+            val placeables = measurables.map { m -> m.measure(newConstraints) }
             var maxWidth = size
             var maxHeight = size
             placeables.forEach { child ->
@@ -4181,9 +4029,7 @@
                 maxWidth = max(child.width + totalDiff, maxWidth)
             }
             layout(maxWidth, maxHeight) {
-                placeables.forEach { child ->
-                    child.placeRelative(size, size)
-                }
+                placeables.forEach { child -> child.placeRelative(size, size) }
             }
         },
         content = content
@@ -4201,9 +4047,7 @@
         val placeables = measurables.map { it.measure(constraints) }
         val width = max(placeables.maxByOrNull { it.width }?.width ?: 0, minWidth)
         val height = max(placeables.maxByOrNull { it.height }?.height ?: 0, minHeight)
-        layout(width, height) {
-            placeables.forEach { it.placeRelative(0, 0) }
-        }
+        layout(width, height) { placeables.forEach { it.placeRelative(0, 0) } }
     }
 }
 
@@ -4234,10 +4078,8 @@
     content: @Composable () -> Unit
 ) {
     Layout(modifier = modifier, content = content) { measurables, constraints ->
-        val childConstraints = constraints.copy(
-            maxHeight = constraints.maxHeight,
-            maxWidth = Constraints.Infinity
-        )
+        val childConstraints =
+            constraints.copy(maxHeight = constraints.maxHeight, maxWidth = Constraints.Infinity)
         val childMeasurable = measurables.first()
         val placeable = childMeasurable.measure(childConstraints)
         val width = min(placeable.width, constraints.maxWidth)
@@ -4270,12 +4112,13 @@
     Layout(modifier = modifier, content = content) { measurables, constraints ->
         var width = 0
         var height = 0
-        val placeables = measurables.map {
-            it.measure(constraints.copy(maxWidth = constraints.maxWidth - width)).also {
-                width += it.width
-                height = max(height, it.height)
+        val placeables =
+            measurables.map {
+                it.measure(constraints.copy(maxWidth = constraints.maxWidth - width)).also {
+                    width += it.width
+                    height = max(height, it.height)
+                }
             }
-        }
         layout(width, height) {
             var currentWidth = 0
             placeables.forEach {
@@ -4293,8 +4136,7 @@
     }
 }
 
-class DrawCounterListener(private val view: View) :
-    ViewTreeObserver.OnPreDrawListener {
+class DrawCounterListener(private val view: View) : ViewTreeObserver.OnPreDrawListener {
     val latch = CountDownLatch(5)
 
     override fun onPreDraw(): Boolean {
@@ -4310,22 +4152,16 @@
 
 fun Modifier.padding(padding: Int) = this.then(PaddingModifier(padding, padding, padding, padding))
 
-private data class PaddingModifier(
-    val left: Int,
-    val top: Int,
-    val right: Int,
-    val bottom: Int
-) : LayoutModifier {
+private data class PaddingModifier(val left: Int, val top: Int, val right: Int, val bottom: Int) :
+    LayoutModifier {
     override fun MeasureScope.measure(
         measurable: Measurable,
         constraints: Constraints
     ): MeasureResult {
-        val placeable = measurable.measure(
-            constraints.offset(
-                horizontal = -left - right,
-                vertical = -top - bottom
+        val placeable =
+            measurable.measure(
+                constraints.offset(horizontal = -left - right, vertical = -top - bottom)
             )
-        )
         return layout(
             constraints.constrainWidth(left + placeable.width + right),
             constraints.constrainHeight(top + placeable.height + bottom)
@@ -4337,39 +4173,40 @@
     override fun IntrinsicMeasureScope.minIntrinsicWidth(
         measurable: IntrinsicMeasurable,
         height: Int
-    ): Int = measurable.minIntrinsicWidth((height - (top + bottom)).coerceAtLeast(0)) +
-        (left + right)
+    ): Int =
+        measurable.minIntrinsicWidth((height - (top + bottom)).coerceAtLeast(0)) + (left + right)
 
     override fun IntrinsicMeasureScope.maxIntrinsicWidth(
         measurable: IntrinsicMeasurable,
         height: Int
-    ): Int = measurable.maxIntrinsicWidth((height - (top + bottom)).coerceAtLeast(0)) +
-        (left + right)
+    ): Int =
+        measurable.maxIntrinsicWidth((height - (top + bottom)).coerceAtLeast(0)) + (left + right)
 
     override fun IntrinsicMeasureScope.minIntrinsicHeight(
         measurable: IntrinsicMeasurable,
         width: Int
-    ): Int = measurable.minIntrinsicHeight((width - (left + right)).coerceAtLeast(0)) +
-        (top + bottom)
+    ): Int =
+        measurable.minIntrinsicHeight((width - (left + right)).coerceAtLeast(0)) + (top + bottom)
 
     override fun IntrinsicMeasureScope.maxIntrinsicHeight(
         measurable: IntrinsicMeasurable,
         width: Int
-    ): Int = measurable.maxIntrinsicHeight((width - (left + right)).coerceAtLeast(0)) +
-        (top + bottom)
+    ): Int =
+        measurable.maxIntrinsicHeight((width - (left + right)).coerceAtLeast(0)) + (top + bottom)
 }
 
-internal val AlignTopLeft = object : LayoutModifier {
-    override fun MeasureScope.measure(
-        measurable: Measurable,
-        constraints: Constraints
-    ): MeasureResult {
-        val placeable = measurable.measure(constraints.copy(minWidth = 0, minHeight = 0))
-        return layout(constraints.maxWidth, constraints.maxHeight) {
-            placeable.placeRelative(0, 0)
+internal val AlignTopLeft =
+    object : LayoutModifier {
+        override fun MeasureScope.measure(
+            measurable: Measurable,
+            constraints: Constraints
+        ): MeasureResult {
+            val placeable = measurable.measure(constraints.copy(minWidth = 0, minHeight = 0))
+            return layout(constraints.maxWidth, constraints.maxHeight) {
+                placeable.placeRelative(0, 0)
+            }
         }
     }
-}
 
 @Stable
 class SquareModel(
@@ -4385,11 +4222,12 @@
 @Suppress("DEPRECATION")
 // We only need this because IR compiler doesn't like converting lambdas to Runnables
 fun androidx.test.rule.ActivityTestRule<*>.runOnUiThreadIR(block: () -> Unit) {
-    val runnable: Runnable = object : Runnable {
-        override fun run() {
-            block()
+    val runnable: Runnable =
+        object : Runnable {
+            override fun run() {
+                block()
+            }
         }
-    }
     runOnUiThread(runnable)
 }
 
@@ -4403,8 +4241,7 @@
     for (index in 0 until parent.childCount) {
         val child = parent.getChildAt(index)
         if (child is ViewGroup) {
-            if (child is Owner)
-                return child
+            if (child is Owner) return child
             else {
                 val composeView = findAndroidComposeView(child)
                 if (composeView != null) {
@@ -4446,27 +4283,25 @@
     val width = view.width
     val height = view.height
 
-    val dest =
-        Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888)
+    val dest = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888)
     val srcRect = android.graphics.Rect(0, 0, width, height)
     srcRect.offset(offset[0], offset[1])
     val latch = CountDownLatch(1)
     var copyResult = 0
-    val onCopyFinished = object : PixelCopy.OnPixelCopyFinishedListener {
-        override fun onPixelCopyFinished(result: Int) {
-            copyResult = result
-            latch.countDown()
+    val onCopyFinished =
+        object : PixelCopy.OnPixelCopyFinishedListener {
+            override fun onPixelCopyFinished(result: Int) {
+                copyResult = result
+                latch.countDown()
+            }
         }
-    }
     PixelCopy.request(activity.window, srcRect, dest, onCopyFinished, handler!!)
     assertTrue("Pixel copy latch timed out", latch.await(1, TimeUnit.SECONDS))
     assertEquals(PixelCopy.SUCCESS, copyResult)
     return dest
 }
 
-fun Modifier.background(color: Color) = drawBehind {
-    drawRect(color)
-}
+fun Modifier.background(color: Color) = drawBehind { drawRect(color) }
 
 fun Modifier.background(model: SquareModel, isInner: Boolean) = drawBehind {
     drawRect(if (isInner) model.innerColor else model.outerColor)
@@ -4492,22 +4327,23 @@
     }
 }
 
-fun Modifier.scale(scale: Float) = then(LayoutScale(scale))
-    .graphicsLayer(scaleX = scale, scaleY = scale)
+fun Modifier.scale(scale: Float) =
+    then(LayoutScale(scale)).graphicsLayer(scaleX = scale, scaleY = scale)
 
 class LayoutScale(val scale: Float) : LayoutModifier {
     override fun MeasureScope.measure(
         measurable: Measurable,
         constraints: Constraints
     ): MeasureResult {
-        val placeable = measurable.measure(
-            Constraints(
-                minWidth = (constraints.minWidth / scale).roundToInt(),
-                minHeight = (constraints.minHeight / scale).roundToInt(),
-                maxWidth = (constraints.maxWidth / scale).roundToInt(),
-                maxHeight = (constraints.maxHeight / scale).roundToInt()
+        val placeable =
+            measurable.measure(
+                Constraints(
+                    minWidth = (constraints.minWidth / scale).roundToInt(),
+                    minHeight = (constraints.minHeight / scale).roundToInt(),
+                    maxWidth = (constraints.maxWidth / scale).roundToInt(),
+                    maxHeight = (constraints.maxHeight / scale).roundToInt()
+                )
             )
-        )
         return layout(
             (placeable.width * scale).roundToInt(),
             (placeable.height * scale).roundToInt()
@@ -4517,9 +4353,7 @@
     }
 }
 
-fun Modifier.latch(countDownLatch: CountDownLatch) = drawBehind {
-    countDownLatch.countDown()
-}
+fun Modifier.latch(countDownLatch: CountDownLatch) = drawBehind { countDownLatch.countDown() }
 
 private class RequestLayoutTrackingFrameLayout(context: Context) : FrameLayout(context) {
     var requestLayoutCalled = false
diff --git a/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/MemoryLeakTest.kt b/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/MemoryLeakTest.kt
index a5f1f79..1bda89e 100644
--- a/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/MemoryLeakTest.kt
+++ b/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/MemoryLeakTest.kt
@@ -69,13 +69,7 @@
                 // The following line adds coverage for delayed coroutine memory leaks.
                 LaunchedEffect(Unit) { delay(10000) }
 
-                Column {
-                    repeat(3) {
-                        Box {
-                            BasicText("Hello")
-                        }
-                    }
-                }
+                Column { repeat(3) { Box { BasicText("Hello") } } }
             }
         }
         val testCaseFactory = { SimpleTestCase() }
@@ -86,14 +80,14 @@
         // still issue for benchmarks though, as they need to fully occupy the main thread. You can
         // add check on main looper and perform clean asap if you are on main thread.
         withContext(AndroidUiDispatcher.Main) {
-            val runner = createAndroidComposeBenchmarkRunner(
-                testCaseFactory,
-                activityTestRule.activity
-            )
+            val runner =
+                createAndroidComposeBenchmarkRunner(testCaseFactory, activityTestRule.activity)
 
             try {
-                // Unfortunately we have to ignore the first run as it seems that even though the view
-                // gets properly garbage collected there are some data that remain allocated. Not sure
+                // Unfortunately we have to ignore the first run as it seems that even though the
+                // view
+                // gets properly garbage collected there are some data that remain allocated. Not
+                // sure
                 // what is causing this but could be some static variables.
                 loopAndVerifyMemory(iterations = 400, gcFrequency = 40, ignoreFirstRun = true) {
                     try {
@@ -112,33 +106,26 @@
 
     @SdkSuppress(minSdkVersion = 22) // b/266743031
     @Test
-    fun disposeContent_assertNoLeak() = runBlocking(AndroidUiDispatcher.Main) {
-        // We have to ignore the first run because `dispose` leaves the OwnerView in the
-        // View hierarchy to reuse it next time. That is probably not the final desired behavior
-        val emptyView = View(activityTestRule.activity)
-        loopAndVerifyMemory(iterations = 400, gcFrequency = 40) {
-            activityTestRule.activity.setContent {
-                Column {
-                    repeat(3) {
-                        Box {
-                            BasicText("Hello")
-                        }
-                    }
+    fun disposeContent_assertNoLeak() =
+        runBlocking(AndroidUiDispatcher.Main) {
+            // We have to ignore the first run because `dispose` leaves the OwnerView in the
+            // View hierarchy to reuse it next time. That is probably not the final desired behavior
+            val emptyView = View(activityTestRule.activity)
+            loopAndVerifyMemory(iterations = 400, gcFrequency = 40) {
+                activityTestRule.activity.setContent {
+                    Column { repeat(3) { Box { BasicText("Hello") } } }
                 }
-            }
 
-            // This replaces the Compose view, disposing its composition.
-            activityTestRule.activity.setContentView(emptyView)
+                // This replaces the Compose view, disposing its composition.
+                activityTestRule.activity.setContentView(emptyView)
+            }
         }
-    }
 
     @Test
     fun memoryCheckerTest_noAllocationsExpected() = runBlocking {
         // This smoke test checks that we don't give false alert and run all the iterations
         var i = 0
-        loopAndVerifyMemory(200, 10) {
-            i++
-        }
+        loopAndVerifyMemory(200, 10) { i++ }
         assertThat(i).isEqualTo(200)
     }
 
@@ -158,61 +145,69 @@
 
     @OptIn(ExperimentalCoroutinesApi::class)
     @Test
-    fun recreateAndroidView_assertNoLeak() = runBlocking(AndroidUiDispatcher.Main) {
-        val immediateClock = object : MonotonicFrameClock {
-            override suspend fun <R> withFrameNanos(onFrame: (frameTimeNanos: Long) -> R): R {
-                yield()
-                return onFrame(0L)
-            }
-        }
-        val context = coroutineContext + immediateClock
-        val recomposer = Recomposer(context)
+    fun recreateAndroidView_assertNoLeak() =
+        runBlocking(AndroidUiDispatcher.Main) {
+            val immediateClock =
+                object : MonotonicFrameClock {
+                    override suspend fun <R> withFrameNanos(
+                        onFrame: (frameTimeNanos: Long) -> R
+                    ): R {
+                        yield()
+                        return onFrame(0L)
+                    }
+                }
+            val context = coroutineContext + immediateClock
+            val recomposer = Recomposer(context)
 
-        suspend fun doFrame() {
-            Snapshot.sendApplyNotifications()
+            suspend fun doFrame() {
+                Snapshot.sendApplyNotifications()
 
-            var pendingCount = 0
-            while (recomposer.hasPendingWork) {
-                pendingCount++
-                yield()
-                if (pendingCount == 10) {
-                    error("Recomposer still pending work after 10 frames.")
+                var pendingCount = 0
+                while (recomposer.hasPendingWork) {
+                    pendingCount++
+                    yield()
+                    if (pendingCount == 10) {
+                        error("Recomposer still pending work after 10 frames.")
+                    }
                 }
             }
-        }
 
-        var compose by mutableStateOf(false)
-        activityTestRule.activity.setContent(recomposer) {
-            if (compose) {
-                AndroidView(factory = {
-                    object : View(it) { val alloc = List(1024) { 0 } }
-                })
+            var compose by mutableStateOf(false)
+            activityTestRule.activity.setContent(recomposer) {
+                if (compose) {
+                    AndroidView(
+                        factory = {
+                            object : View(it) {
+                                val alloc = List(1024) { 0 }
+                            }
+                        }
+                    )
+                }
             }
-        }
-        launch(context = context, start = CoroutineStart.UNDISPATCHED) {
-            recomposer.runRecomposeAndApplyChanges()
-        }
-        doFrame()
-
-        loopAndVerifyMemory(ignoreFirstRun = true, iterations = 400, gcFrequency = 40) {
-            // Add AndroidView into the composition
-            compose = true
+            launch(context = context, start = CoroutineStart.UNDISPATCHED) {
+                recomposer.runRecomposeAndApplyChanges()
+            }
             doFrame()
 
-            // This removes the AndroidView
-            compose = false
-            doFrame()
-        }
+            loopAndVerifyMemory(ignoreFirstRun = true, iterations = 400, gcFrequency = 40) {
+                // Add AndroidView into the composition
+                compose = true
+                doFrame()
 
-        recomposer.cancel()
-        recomposer.join()
-    }
+                // This removes the AndroidView
+                compose = false
+                doFrame()
+            }
+
+            recomposer.cancel()
+            recomposer.join()
+        }
 
     /**
      * Runs the given code in a loop for exactly [iterations] times and every [gcFrequency] it will
-     * force garbage collection and check the allocated heap size.
-     * Suspending so that we can briefly yield() to the dispatcher before collecting garbage
-     * so that event loop driven cleanup processes can run before we take measurements.
+     * force garbage collection and check the allocated heap size. Suspending so that we can briefly
+     * yield() to the dispatcher before collecting garbage so that event loop driven cleanup
+     * processes can run before we take measurements.
      */
     suspend fun loopAndVerifyMemory(
         iterations: Int,
@@ -252,9 +247,7 @@
         }
 
         // Check if every iteration the memory grew => that's a bad sign
-        val diffs = memoryStats
-            .zipWithNext()
-            .map { (it.second - it.first) / 1024 }
+        val diffs = memoryStats.zipWithNext().map { (it.second - it.first) / 1024 }
         val areAllDiffsGrowing = diffs.all { it > 0 }
         if (areAllDiffsGrowing) {
             throw AssertionError(
diff --git a/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/OpenComposeView.kt b/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/OpenComposeView.kt
index ef0b4a6..c9bdfe5 100644
--- a/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/OpenComposeView.kt
+++ b/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/OpenComposeView.kt
@@ -23,11 +23,10 @@
 import androidx.compose.ui.platform.AbstractComposeView
 
 // Copy of ComposeView, but open, so we can use it with Mockito spy()
-open class OpenComposeView @JvmOverloads constructor(
-    context: Context,
-    attrs: AttributeSet? = null,
-    defStyleAttr: Int = 0
-) : AbstractComposeView(context, attrs, defStyleAttr) {
+open class OpenComposeView
+@JvmOverloads
+constructor(context: Context, attrs: AttributeSet? = null, defStyleAttr: Int = 0) :
+    AbstractComposeView(context, attrs, defStyleAttr) {
 
     @Suppress("RemoveExplicitTypeArguments")
     private val content = mutableStateOf<@Composable () -> Unit>({})
diff --git a/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/ParentDataModifierTest.kt b/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/ParentDataModifierTest.kt
index 9f8bae1..bb7f207 100644
--- a/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/ParentDataModifierTest.kt
+++ b/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/ParentDataModifierTest.kt
@@ -52,9 +52,8 @@
 class ParentDataModifierTest {
     @Suppress("DEPRECATION")
     @get:Rule
-    val activityTestRule = androidx.test.rule.ActivityTestRule<TestActivity>(
-        TestActivity::class.java
-    )
+    val activityTestRule =
+        androidx.test.rule.ActivityTestRule<TestActivity>(TestActivity::class.java)
     private lateinit var activity: TestActivity
     private lateinit var drawLatch: CountDownLatch
 
@@ -72,17 +71,13 @@
         runOnUiThread {
             activity.setContent {
                 Layout(
-                    content = {
-                        SimpleDrawChild(drawLatch = drawLatch)
-                    },
+                    content = { SimpleDrawChild(drawLatch = drawLatch) },
                     measurePolicy = { measurables, constraints ->
                         assertEquals(1, measurables.size)
                         parentData.value = measurables[0].parentData
 
                         val placeable = measurables[0].measure(constraints)
-                        layout(placeable.width, placeable.height) {
-                            placeable.place(0, 0)
-                        }
+                        layout(placeable.width, placeable.height) { placeable.place(0, 0) }
                     }
                 )
             }
@@ -100,17 +95,13 @@
             activity.setContent {
                 Layout(
                     modifier = Modifier.layoutId("Hello"),
-                    content = {
-                        SimpleDrawChild(drawLatch = drawLatch)
-                    },
+                    content = { SimpleDrawChild(drawLatch = drawLatch) },
                     measurePolicy = { measurables, constraints ->
                         assertEquals(1, measurables.size)
                         parentData.value = measurables[0].parentData
 
                         val placeable = measurables[0].measure(constraints)
-                        layout(placeable.width, placeable.height) {
-                            placeable.place(0, 0)
-                        }
+                        layout(placeable.width, placeable.height) { placeable.place(0, 0) }
                     }
                 )
             }
@@ -123,23 +114,26 @@
     fun multiChildLayoutTest_doesNotOverrideChildrenParentData() {
         runOnUiThread {
             activity.setContent {
-                val header = @Composable {
-                    Layout(
-                        modifier = Modifier.layoutId(0),
-                        content = {}
-                    ) { _, _ -> layout(0, 0) {} }
-                }
-                val footer = @Composable {
-                    Layout(
-                        modifier = Modifier.layoutId(1),
-                        content = {}
-                    ) { _, _ -> layout(0, 0) {} }
-                }
+                val header =
+                    @Composable {
+                        Layout(modifier = Modifier.layoutId(0), content = {}) { _, _ ->
+                            layout(0, 0) {}
+                        }
+                    }
+                val footer =
+                    @Composable {
+                        Layout(modifier = Modifier.layoutId(1), content = {}) { _, _ ->
+                            layout(0, 0) {}
+                        }
+                    }
 
-                Layout({ header(); footer() }) { measurables, _ ->
+                Layout({
+                    header()
+                    footer()
+                }) { measurables, _ ->
                     assertEquals(0, ((measurables[0]).parentData as? LayoutIdParentData)?.layoutId)
                     assertEquals(1, ((measurables[1]).parentData as? LayoutIdParentData)?.layoutId)
-                    layout(0, 0) { }
+                    layout(0, 0) {}
                 }
             }
         }
@@ -150,14 +144,13 @@
         runOnUiThread {
             activity.setContent {
                 Layout({
-                    Layout(
-                        modifier = Modifier.layoutId("data"),
-                        content = {}
-                    ) { _, _ -> layout(0, 0) {} }
+                    Layout(modifier = Modifier.layoutId("data"), content = {}) { _, _ ->
+                        layout(0, 0) {}
+                    }
                 }) { measurables, constraints ->
                     val placeable = measurables[0].measure(constraints)
                     assertEquals("data", (placeable.parentData as? LayoutIdParentData)?.layoutId)
-                    layout(0, 0) { }
+                    layout(0, 0) {}
                 }
             }
         }
@@ -165,20 +158,20 @@
 
     @Test
     fun delegatedParentData() {
-        val node = object : DelegatingNode() {
-            val pd = delegate(LayoutIdModifier("data"))
-        }
+        val node =
+            object : DelegatingNode() {
+                val pd = delegate(LayoutIdModifier("data"))
+            }
         runOnUiThread {
             activity.setContent {
                 Layout({
-                    Layout(
-                        modifier = Modifier.elementFor(node),
-                        content = {}
-                    ) { _, _ -> layout(0, 0) {} }
+                    Layout(modifier = Modifier.elementFor(node), content = {}) { _, _ ->
+                        layout(0, 0) {}
+                    }
                 }) { measurables, constraints ->
                     val placeable = measurables[0].measure(constraints)
                     assertEquals("data", (placeable.parentData as? LayoutIdParentData)?.layoutId)
-                    layout(0, 0) { }
+                    layout(0, 0) {}
                 }
             }
         }
@@ -190,13 +183,13 @@
         runOnUiThread {
             activity.setContent {
                 Layout({
-                    Layout(
-                        modifier = ParentDataAndLayoutElement(parentData),
-                        content = {}
-                    ) { _, _ -> layout(0, 0) {} }
+                    Layout(modifier = ParentDataAndLayoutElement(parentData), content = {}) { _, _
+                        ->
+                        layout(0, 0) {}
+                    }
                 }) { measurables, _ ->
                     assertEquals("data", measurables[0].parentData)
-                    layout(0, 0) { }
+                    layout(0, 0) {}
                 }
             }
         }
@@ -204,11 +197,12 @@
 
     // We only need this because IR compiler doesn't like converting lambdas to Runnables
     private fun runOnUiThread(block: () -> Unit) {
-        val runnable: Runnable = object : Runnable {
-            override fun run() {
-                block()
+        val runnable: Runnable =
+            object : Runnable {
+                override fun run() {
+                    block()
+                }
             }
-        }
         activityTestRule.runOnUiThread(runnable)
     }
 }
@@ -217,31 +211,31 @@
 fun SimpleDrawChild(drawLatch: CountDownLatch) {
     AtLeastSize(
         size = 10,
-        modifier = Modifier.drawBehind {
-            drawRect(Color(0xFF008000))
-            drawLatch.countDown()
-        }
+        modifier =
+            Modifier.drawBehind {
+                drawRect(Color(0xFF008000))
+                drawLatch.countDown()
+            }
     ) {}
 }
 
 private data class ParentDataAndLayoutElement(val data: String) :
     ModifierNodeElement<ParentDataAndLayoutNode>() {
     override fun create() = ParentDataAndLayoutNode(data)
+
     override fun update(node: ParentDataAndLayoutNode) {
         node.data = data
     }
 }
 
-class ParentDataAndLayoutNode(var data: String) : Modifier.Node(), LayoutModifierNode,
-    ParentDataModifierNode {
+class ParentDataAndLayoutNode(var data: String) :
+    Modifier.Node(), LayoutModifierNode, ParentDataModifierNode {
     override fun MeasureScope.measure(
         measurable: Measurable,
         constraints: Constraints
     ): MeasureResult {
         val placeable = measurable.measure(constraints)
-        return layout(placeable.width, placeable.height) {
-            placeable.place(0, 0)
-        }
+        return layout(placeable.width, placeable.height) { placeable.place(0, 0) }
     }
 
     override fun Density.modifyParentData(parentData: Any?) = data
diff --git a/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/RecyclerViewIntegrationTest.kt b/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/RecyclerViewIntegrationTest.kt
index 5d1a315..d10f386 100644
--- a/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/RecyclerViewIntegrationTest.kt
+++ b/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/RecyclerViewIntegrationTest.kt
@@ -72,9 +72,7 @@
         assertItemIsDrawnWithCorrectSize(0)
         assertItemIsDrawnWithCorrectSize(1)
 
-        activityScenario.onActivity {
-            it.scrollBy(ScrollAmountToHideTwoItems)
-        }
+        activityScenario.onActivity { it.scrollBy(ScrollAmountToHideTwoItems) }
 
         assertItemIsDrawnWithCorrectSize(2)
         assertItemIsDrawnWithCorrectSize(3)
@@ -84,9 +82,7 @@
         drawnSizes[0] = null
         drawnSizes[1] = null
 
-        activityScenario.onActivity {
-            it.scrollBy(-ScrollAmountToHideTwoItems)
-        }
+        activityScenario.onActivity { it.scrollBy(-ScrollAmountToHideTwoItems) }
 
         assertItemIsDrawnWithCorrectSize(1)
         assertItemIsDrawnWithCorrectSize(0)
@@ -102,9 +98,7 @@
     private fun Modifier.fixedPxSize(height: Int) = layout { measurable, _ ->
         val constraints = Constraints.fixed(100, height)
         val placeable = measurable.measure(constraints)
-        layout(placeable.width, placeable.height) {
-            placeable.place(0, 0)
-        }
+        layout(placeable.width, placeable.height) { placeable.place(0, 0) }
     }
 }
 
@@ -130,17 +124,13 @@
 
 private class VH(context: Context) : RecyclerView.ViewHolder(ComposeView(context))
 
-private class ComposeAdapter(
-    val count: Int,
-    val itemContent: @Composable (Int) -> Unit
-) : RecyclerView.Adapter<VH>() {
+private class ComposeAdapter(val count: Int, val itemContent: @Composable (Int) -> Unit) :
+    RecyclerView.Adapter<VH>() {
 
     override fun onCreateViewHolder(parent: ViewGroup, viewType: Int) = VH(parent.context)
 
     override fun onBindViewHolder(holder: VH, position: Int) {
-        (holder.itemView as ComposeView).setContent {
-            itemContent(position)
-        }
+        (holder.itemView as ComposeView).setContent { itemContent(position) }
     }
 
     override fun getItemCount() = count
diff --git a/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/SnapshotFlowTest.kt b/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/SnapshotFlowTest.kt
index e9275f2..c1ed4cd 100644
--- a/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/SnapshotFlowTest.kt
+++ b/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/SnapshotFlowTest.kt
@@ -33,8 +33,7 @@
 @RunWith(AndroidJUnit4::class)
 class SnapshotFlowTest {
 
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
     @OptIn(InternalCoroutinesApi::class)
     @Test
@@ -44,19 +43,13 @@
         var lastComposedValue: Int? = null
 
         rule.setContent {
-            LaunchedEffect(Unit) {
-                state.value = 1
-            }
+            LaunchedEffect(Unit) { state.value = 1 }
 
             lastComposedValue = state.value
 
-            LaunchedEffect(state) {
-                snapshotFlow { state.value }.collect { }
-            }
+            LaunchedEffect(state) { snapshotFlow { state.value }.collect {} }
         }
 
-        rule.runOnIdle {
-            assertEquals(1, lastComposedValue)
-        }
+        rule.runOnIdle { assertEquals(1, lastComposedValue) }
     }
 }
diff --git a/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/SubcompositionReusableContentHost.kt b/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/SubcompositionReusableContentHost.kt
index bdb1329..556001e 100644
--- a/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/SubcompositionReusableContentHost.kt
+++ b/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/SubcompositionReusableContentHost.kt
@@ -24,18 +24,15 @@
 
 // TODO use ReusableContentHost directly after we fix b/309821523
 @Composable
-fun SubcompositionReusableContentHost(
-    active: Boolean,
-    content: @Composable () -> Unit
-) {
-    SubcomposeLayout(
-        remember { SubcomposeLayoutState(SubcomposeSlotReusePolicy(1)) }
-    ) { constraints ->
-        val placeable = if (active) {
-            subcompose(null, content).map { it.measure(constraints) }
-        } else {
-            emptyList()
-        }
+fun SubcompositionReusableContentHost(active: Boolean, content: @Composable () -> Unit) {
+    SubcomposeLayout(remember { SubcomposeLayoutState(SubcomposeSlotReusePolicy(1)) }) { constraints
+        ->
+        val placeable =
+            if (active) {
+                subcompose(null, content).map { it.measure(constraints) }
+            } else {
+                emptyList()
+            }
         layout(
             placeable.maxOfOrNull { it.width } ?: 0,
             placeable.maxOfOrNull { it.height } ?: 0,
diff --git a/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/ZIndexNodeTest.kt b/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/ZIndexNodeTest.kt
index c81d465..e6ed644 100644
--- a/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/ZIndexNodeTest.kt
+++ b/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/ZIndexNodeTest.kt
@@ -40,8 +40,7 @@
 
         assertThat(modifier.nameFallback).isEqualTo("zIndex")
         assertThat(modifier.valueOverride).isNull()
-        assertThat(modifier.inspectableElements.asIterable()).containsExactly(
-            ValueElement("zIndex", 3.0f)
-        )
+        assertThat(modifier.inspectableElements.asIterable())
+            .containsExactly(ValueElement("zIndex", 3.0f))
     }
 }
diff --git a/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/accessibility/CollectionInfoTest.kt b/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/accessibility/CollectionInfoTest.kt
index 477fc13..12881f9 100644
--- a/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/accessibility/CollectionInfoTest.kt
+++ b/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/accessibility/CollectionInfoTest.kt
@@ -59,8 +59,7 @@
 @LargeTest
 @RunWith(AndroidJUnit4::class)
 class CollectionInfoTest {
-    @get:Rule
-    val rule = createAndroidComposeRule<TestActivity>()
+    @get:Rule val rule = createAndroidComposeRule<TestActivity>()
 
     private lateinit var composeView: AndroidComposeView
     private val tag = "TestTag"
@@ -94,9 +93,7 @@
     fun testDefaultCollectionInfo_lazyList() {
         // Arrange.
         rule.setContentWithAccessibilityEnabled {
-            LazyColumn(Modifier.testTag(tag)) {
-                items(2) { BasicText("Text") }
-            }
+            LazyColumn(Modifier.testTag(tag)) { items(2) { BasicText("Text") } }
         }
         val virtualId = rule.onNodeWithTag(tag).semanticsId
 
@@ -117,11 +114,7 @@
     fun testCollectionInfo_lazyList() {
         // Arrange.
         rule.setContentWithAccessibilityEnabled {
-            LazyColumn(
-                Modifier
-                    .testTag(tag)
-                    .semantics { collectionInfo = CollectionInfo(2, 1) }
-            ) {
+            LazyColumn(Modifier.testTag(tag).semantics { collectionInfo = CollectionInfo(2, 1) }) {
                 items(2) { BasicText("Text") }
             }
         }
@@ -144,9 +137,7 @@
     fun testCollectionInfo_withSelectableGroup_andDefaultLazyListSemantics() {
         // Arrange.
         rule.setContentWithAccessibilityEnabled {
-            LazyColumn(Modifier.testTag(tag).selectableGroup()) {
-                items(2) { BasicText("Text") }
-            }
+            LazyColumn(Modifier.testTag(tag).selectableGroup()) { items(2) { BasicText("Text") } }
         }
         val virtualId = rule.onNodeWithTag(tag).semanticsId
 
@@ -168,10 +159,9 @@
         // Arrange.
         rule.setContentWithAccessibilityEnabled {
             LazyColumn(
-                Modifier
-                    .testTag(tag)
-                    .selectableGroup()
-                    .semantics { collectionInfo = CollectionInfo(2, 1) }
+                Modifier.testTag(tag).selectableGroup().semantics {
+                    collectionInfo = CollectionInfo(2, 1)
+                }
             ) {
                 items(2) { BasicText("Text") }
             }
@@ -197,17 +187,8 @@
         // Arrange.
         rule.setContentWithAccessibilityEnabled {
             Column(Modifier.selectableGroup()) {
-                Box(
-                    Modifier
-                        .size(50.dp)
-                        .testTag(tag)
-                        .selectable(selected = true, onClick = {})
-                )
-                Box(
-                    Modifier
-                        .size(50.dp)
-                        .selectable(selected = false, onClick = {})
-                )
+                Box(Modifier.size(50.dp).testTag(tag).selectable(selected = true, onClick = {}))
+                Box(Modifier.size(50.dp).selectable(selected = false, onClick = {}))
             }
         }
         val virtualId = rule.onNodeWithTag(tag).semanticsId
@@ -345,10 +326,9 @@
         // Arrange.
         rule.setContentWithAccessibilityEnabled {
             Column(
-                Modifier
-                    .size(10.dp)
-                    .testTag(tag)
-                    .semantics { collectionInfo = CollectionInfo(1, 1) }
+                Modifier.size(10.dp).testTag(tag).semantics {
+                    collectionInfo = CollectionInfo(1, 1)
+                }
             ) {
                 // items
             }
@@ -369,12 +349,7 @@
     fun testSemanticsNodeHasCollectionInfo_whenProvidedViaSelectableGroup() {
         // Arrange.
         rule.setContentWithAccessibilityEnabled {
-            Column(
-                Modifier
-                    .size(10.dp)
-                    .testTag(tag)
-                    .selectableGroup()
-            ) {
+            Column(Modifier.size(10.dp).testTag(tag).selectableGroup()) {
                 // items
                 Box(Modifier.size(10.dp).selectable(selected = true, onClick = {}))
                 Box(Modifier.size(10.dp).selectable(selected = false, onClick = {}))
@@ -397,12 +372,7 @@
     fun testSemanticsNodeHasCollectionInfo_whenProvidedViaEmptySelectableGroup() {
         // Arrange.
         rule.setContentWithAccessibilityEnabled {
-            Column(
-                Modifier
-                    .size(10.dp)
-                    .testTag(tag)
-                    .selectableGroup()
-            ) {
+            Column(Modifier.size(10.dp).testTag(tag).selectableGroup()) {
                 // items
             }
         }
@@ -438,22 +408,19 @@
         rule.setContentWithAccessibilityEnabled {
             Column(Modifier.selectableGroup()) {
                 Box(
-                    Modifier
-                        .size(50.dp)
+                    Modifier.size(50.dp)
                         .selectable(selected = true, onClick = {})
                         .zIndex(3f)
                         .testTag("item0")
                 )
                 Box(
-                    Modifier
-                        .size(50.dp)
+                    Modifier.size(50.dp)
                         .selectable(selected = false, onClick = {})
                         .zIndex(2f)
                         .testTag("item1")
                 )
                 Box(
-                    Modifier
-                        .size(50.dp)
+                    Modifier.size(50.dp)
                         .selectable(selected = false, onClick = {})
                         .zIndex(1f)
                         .testTag("item2")
@@ -513,7 +480,8 @@
     }
 
     // TODO(b/272068594): Add api to fetch the semantics id from SemanticsNodeInteraction directly.
-    private val SemanticsNodeInteraction.semanticsId: Int get() = fetchSemanticsNode().id
+    private val SemanticsNodeInteraction.semanticsId: Int
+        get() = fetchSemanticsNode().id
 
     private fun ComposeContentTestRule.setContentWithAccessibilityEnabled(
         content: @Composable () -> Unit
diff --git a/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/accessibility/ScrollingTest.kt b/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/accessibility/ScrollingTest.kt
index 89ddec7..190b395 100644
--- a/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/accessibility/ScrollingTest.kt
+++ b/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/accessibility/ScrollingTest.kt
@@ -73,8 +73,7 @@
 @MediumTest
 @RunWith(AndroidJUnit4::class)
 class ScrollingTest {
-    @get:Rule
-    val rule = createAndroidComposeRule<TestActivity>()
+    @get:Rule val rule = createAndroidComposeRule<TestActivity>()
 
     private val tag = "tag"
     private lateinit var androidComposeView: AndroidComposeView
@@ -90,22 +89,12 @@
         rule.mainClock.autoAdvance = false
         rule.setContentWithAccessibilityEnabled {
             Row(
-                Modifier
-                    .size(20.toDp(), 10.toDp())
-                    .semantics(mergeDescendants = false) {
-                        horizontalScrollAxisRange = ScrollAxisRange(
-                            { scrollValue },
-                            { scrollMaxValue }
-                        )
-                    }
+                Modifier.size(20.toDp(), 10.toDp()).semantics(mergeDescendants = false) {
+                    horizontalScrollAxisRange = ScrollAxisRange({ scrollValue }, { scrollMaxValue })
+                }
             ) {
                 Text("foo", Modifier.size(10.toDp()))
-                Text(
-                    "bar",
-                    Modifier
-                        .size(10.toDp())
-                        .testTag(tag)
-                )
+                Text("bar", Modifier.size(10.toDp()).testTag(tag))
             }
         }
         rule.mainClock.advanceTimeBy(accessibilityEventLoopIntervalMs)
@@ -116,8 +105,11 @@
         try {
             androidComposeView.snapshotObserver.startObserving()
             rule.runOnIdle {
-                androidComposeView.accessibilityNodeProvider
-                    .performAction(virtualViewId, ACTION_ACCESSIBILITY_FOCUS, null)
+                androidComposeView.accessibilityNodeProvider.performAction(
+                    virtualViewId,
+                    ACTION_ACCESSIBILITY_FOCUS,
+                    null
+                )
                 Snapshot.notifyObjectsInitialized()
                 scrollValue = 2f
                 Snapshot.sendApplyNotifications()
@@ -129,16 +121,16 @@
 
         // Assert.
         rule.runOnIdle {
-            val focusedANI = androidComposeView.accessibilityNodeProvider
-                .findFocus(AccessibilityNodeInfo.FOCUS_ACCESSIBILITY)
+            val focusedANI =
+                androidComposeView.accessibilityNodeProvider.findFocus(
+                    AccessibilityNodeInfo.FOCUS_ACCESSIBILITY
+                )
             assertThat(Rect().also { focusedANI?.getBoundsInScreen(it) })
                 .isEqualTo(Rect(10, 0, 20, 10))
             assertThat(dispatchedAccessibilityEvents)
                 .comparingElementsUsing(AccessibilityEventComparator)
                 .containsExactly(
-                    AccessibilityEvent().apply {
-                        eventType = TYPE_VIEW_ACCESSIBILITY_FOCUSED
-                    },
+                    AccessibilityEvent().apply { eventType = TYPE_VIEW_ACCESSIBILITY_FOCUSED },
                     AccessibilityEvent().apply {
                         eventType = TYPE_WINDOW_CONTENT_CHANGED
                         contentChangeTypes = CONTENT_CHANGE_TYPE_SUBTREE
@@ -160,14 +152,9 @@
         rule.mainClock.autoAdvance = false
         rule.setContentWithAccessibilityEnabled {
             Box(
-                Modifier
-                    .size(10.dp)
-                    .semantics(mergeDescendants = false) {
-                        verticalScrollAxisRange = ScrollAxisRange(
-                            { scrollValue },
-                            { scrollMaxValue }
-                        )
-                    }
+                Modifier.size(10.dp).semantics(mergeDescendants = false) {
+                    verticalScrollAxisRange = ScrollAxisRange({ scrollValue }, { scrollMaxValue })
+                }
             )
         }
 
@@ -214,15 +201,10 @@
         // Arrange.
         rule.setContentWithAccessibilityEnabled {
             Box(
-                Modifier
-                    .size(100.dp)
-                    .semantics(mergeDescendants = true) {
-                        horizontalScrollAxisRange = ScrollAxisRange(
-                            value = { 0f },
-                            maxValue = { 1f },
-                            reverseScrolling = false
-                        )
-                    }
+                Modifier.size(100.dp).semantics(mergeDescendants = true) {
+                    horizontalScrollAxisRange =
+                        ScrollAxisRange(value = { 0f }, maxValue = { 1f }, reverseScrolling = false)
+                }
             )
         }
 
@@ -239,16 +221,15 @@
         // Arrange.
         rule.setContentWithAccessibilityEnabled {
             Box(
-                Modifier
-                    .size(100.toDp())
-                    .semantics(mergeDescendants = true) {
-                        testTag = tag
-                        horizontalScrollAxisRange = ScrollAxisRange(
+                Modifier.size(100.toDp()).semantics(mergeDescendants = true) {
+                    testTag = tag
+                    horizontalScrollAxisRange =
+                        ScrollAxisRange(
                             value = { 0.5f },
                             maxValue = { 1f },
                             reverseScrolling = false
                         )
-                    }
+                }
             )
         }
 
@@ -269,16 +250,15 @@
         // Arrange.
         rule.setContentWithAccessibilityEnabled {
             Box(
-                Modifier
-                    .size(100.toDp())
-                    .semantics(mergeDescendants = true) {
-                        testTag = tag
-                        verticalScrollAxisRange = ScrollAxisRange(
+                Modifier.size(100.toDp()).semantics(mergeDescendants = true) {
+                    testTag = tag
+                    verticalScrollAxisRange =
+                        ScrollAxisRange(
                             value = { 0.5f },
                             maxValue = { 1f },
                             reverseScrolling = false
                         )
-                    }
+                }
             )
         }
 
@@ -299,16 +279,11 @@
         // Arrange.
         rule.setContentWithAccessibilityEnabled {
             Box(
-                Modifier
-                    .size(100.toDp())
-                    .semantics(mergeDescendants = true) {
-                        testTag = tag
-                        horizontalScrollAxisRange = ScrollAxisRange(
-                            value = { 1f },
-                            maxValue = { 1f },
-                            reverseScrolling = false
-                        )
-                    }
+                Modifier.size(100.toDp()).semantics(mergeDescendants = true) {
+                    testTag = tag
+                    horizontalScrollAxisRange =
+                        ScrollAxisRange(value = { 1f }, maxValue = { 1f }, reverseScrolling = false)
+                }
             )
         }
 
@@ -328,16 +303,11 @@
         // Arrange.
         rule.setContentWithAccessibilityEnabled {
             Box(
-                Modifier
-                    .size(100.toDp())
-                    .semantics(mergeDescendants = true) {
-                        testTag = tag
-                        horizontalScrollAxisRange = ScrollAxisRange(
-                            value = { 0f },
-                            maxValue = { 1f },
-                            reverseScrolling = false
-                        )
-                    }
+                Modifier.size(100.toDp()).semantics(mergeDescendants = true) {
+                    testTag = tag
+                    horizontalScrollAxisRange =
+                        ScrollAxisRange(value = { 0f }, maxValue = { 1f }, reverseScrolling = false)
+                }
             )
         }
 
@@ -357,16 +327,11 @@
         // Arrange.
         rule.setContentWithAccessibilityEnabled {
             Box(
-                Modifier
-                    .size(100.toDp())
-                    .semantics(mergeDescendants = true) {
-                        testTag = tag
-                        verticalScrollAxisRange = ScrollAxisRange(
-                            value = { 1f },
-                            maxValue = { 1f },
-                            reverseScrolling = false
-                        )
-                    }
+                Modifier.size(100.toDp()).semantics(mergeDescendants = true) {
+                    testTag = tag
+                    verticalScrollAxisRange =
+                        ScrollAxisRange(value = { 1f }, maxValue = { 1f }, reverseScrolling = false)
+                }
             )
         }
 
@@ -386,16 +351,11 @@
         // Arrange.
         rule.setContentWithAccessibilityEnabled {
             Box(
-                Modifier
-                    .size(100.toDp())
-                    .semantics(mergeDescendants = true) {
-                        testTag = tag
-                        verticalScrollAxisRange = ScrollAxisRange(
-                            value = { 0f },
-                            maxValue = { 1f },
-                            reverseScrolling = false
-                        )
-                    }
+                Modifier.size(100.toDp()).semantics(mergeDescendants = true) {
+                    testTag = tag
+                    verticalScrollAxisRange =
+                        ScrollAxisRange(value = { 0f }, maxValue = { 1f }, reverseScrolling = false)
+                }
             )
         }
 
@@ -415,16 +375,11 @@
         // Arrange.
         rule.setContentWithAccessibilityEnabled {
             Box(
-                Modifier
-                    .size(100.toDp())
-                    .semantics(mergeDescendants = true) {
-                        testTag = tag
-                        horizontalScrollAxisRange = ScrollAxisRange(
-                            value = { 0f },
-                            maxValue = { 1f },
-                            reverseScrolling = true
-                        )
-                    }
+                Modifier.size(100.toDp()).semantics(mergeDescendants = true) {
+                    testTag = tag
+                    horizontalScrollAxisRange =
+                        ScrollAxisRange(value = { 0f }, maxValue = { 1f }, reverseScrolling = true)
+                }
             )
         }
 
@@ -444,16 +399,15 @@
         // Arrange.
         rule.setContentWithAccessibilityEnabled {
             Box(
-                Modifier
-                    .size(100.toDp())
-                    .semantics(mergeDescendants = true) {
-                        testTag = tag
-                        horizontalScrollAxisRange = ScrollAxisRange(
+                Modifier.size(100.toDp()).semantics(mergeDescendants = true) {
+                    testTag = tag
+                    horizontalScrollAxisRange =
+                        ScrollAxisRange(
                             value = { 0.5f },
                             maxValue = { 1f },
                             reverseScrolling = true
                         )
-                    }
+                }
             )
         }
 
@@ -475,28 +429,30 @@
         val viewPortSize = 100
         rule.setContentWithAccessibilityEnabled {
             Box(
-                Modifier
-                    .size(viewPortSize.toDp())
-                    .semantics(mergeDescendants = true) {
-                        testTag = tag
-                        horizontalScrollAxisRange = ScrollAxisRange(
+                Modifier.size(viewPortSize.toDp()).semantics(mergeDescendants = true) {
+                    testTag = tag
+                    horizontalScrollAxisRange =
+                        ScrollAxisRange(
                             value = { 0.5f },
                             maxValue = { 1f },
                             reverseScrolling = true
                         )
 
-                        scrollBy { x, _ ->
-                            actualScrolledAmount += x
-                            false
-                        }
+                    scrollBy { x, _ ->
+                        actualScrolledAmount += x
+                        false
                     }
+                }
             )
         }
 
         val virtualViewId = rule.onNodeWithTag(tag).semanticsId
         rule.runOnIdle {
-            androidComposeView.accessibilityNodeProvider
-                .performAction(virtualViewId, ACTION_SCROLL_BACKWARD, null)
+            androidComposeView.accessibilityNodeProvider.performAction(
+                virtualViewId,
+                ACTION_SCROLL_BACKWARD,
+                null
+            )
         }
         assertThat(actualScrolledAmount).isEqualTo(viewPortSize)
     }
@@ -509,30 +465,32 @@
         val contentPadding = 5f
         rule.setContentWithAccessibilityEnabled {
             Box(
-                Modifier
-                    .size(viewPortSize.toDp())
-                    .semantics(mergeDescendants = true) {
-                        testTag = tag
-                        horizontalScrollAxisRange = ScrollAxisRange(
+                Modifier.size(viewPortSize.toDp()).semantics(mergeDescendants = true) {
+                    testTag = tag
+                    horizontalScrollAxisRange =
+                        ScrollAxisRange(
                             value = { 0.5f },
                             maxValue = { 1f },
                             reverseScrolling = true
                         )
 
-                        scrollBy { x, _ ->
-                            actualScrolledAmount += x
-                            false
-                        }
-
-                        getScrollViewportLength { viewPortSize - contentPadding }
+                    scrollBy { x, _ ->
+                        actualScrolledAmount += x
+                        false
                     }
+
+                    getScrollViewportLength { viewPortSize - contentPadding }
+                }
             )
         }
 
         val virtualViewId = rule.onNodeWithTag(tag).semanticsId
         rule.runOnIdle {
-            androidComposeView.accessibilityNodeProvider
-                .performAction(virtualViewId, ACTION_SCROLL_BACKWARD, null)
+            androidComposeView.accessibilityNodeProvider.performAction(
+                virtualViewId,
+                ACTION_SCROLL_BACKWARD,
+                null
+            )
         }
         assertThat(actualScrolledAmount).isEqualTo(viewPortSize - contentPadding)
     }
@@ -542,16 +500,15 @@
         // Arrange.
         rule.setContentWithAccessibilityEnabled {
             Box(
-                Modifier
-                    .size(50.toDp())
-                    .semantics(mergeDescendants = true) {
-                        testTag = tag
-                        horizontalScrollAxisRange = ScrollAxisRange(
+                Modifier.size(50.toDp()).semantics(mergeDescendants = true) {
+                    testTag = tag
+                    horizontalScrollAxisRange =
+                        ScrollAxisRange(
                             value = { 0.5f },
                             maxValue = { 1f },
                             reverseScrolling = true
                         )
-                    }
+                }
             )
         }
 
@@ -575,7 +532,10 @@
             androidComposeView = LocalView.current as AndroidComposeView
             with(androidComposeView.composeAccessibilityDelegate) {
                 accessibilityForceEnabledForTesting = true
-                onSendAccessibilityEvent = { dispatchedAccessibilityEvents += it; false }
+                onSendAccessibilityEvent = {
+                    dispatchedAccessibilityEvents += it
+                    false
+                }
             }
             content()
         }
@@ -588,10 +548,11 @@
 
     companion object {
 
-        internal val AccessibilityEventComparator = Correspondence
-            .from<AccessibilityEvent, AccessibilityEvent>(
+        internal val AccessibilityEventComparator =
+            Correspondence.from<AccessibilityEvent, AccessibilityEvent>(
                 { actual, expected ->
-                    actual != null && expected != null &&
+                    actual != null &&
+                        expected != null &&
                         actual.eventType == expected.eventType &&
                         actual.eventTime == expected.eventTime &&
                         actual.packageName == expected.packageName &&
@@ -628,21 +589,24 @@
     }
 
     private val View.composeAccessibilityDelegate: AndroidComposeViewAccessibilityDelegateCompat
-        get() = ViewCompat.getAccessibilityDelegate(this)
-            as AndroidComposeViewAccessibilityDelegateCompat
+        get() =
+            ViewCompat.getAccessibilityDelegate(this)
+                as AndroidComposeViewAccessibilityDelegateCompat
 
     // TODO(b/272068594): Add api to fetch the semantics id from SemanticsNodeInteraction directly.
-    private val SemanticsNodeInteraction.semanticsId: Int get() = fetchSemanticsNode().id
+    private val SemanticsNodeInteraction.semanticsId: Int
+        get() = fetchSemanticsNode().id
 
     // TODO(b/304359126): Move this to AccessibilityEventCompat and use it wherever we use obtain().
-    private fun AccessibilityEvent(): AccessibilityEvent = if (SDK_INT >= R) {
-        android.view.accessibility.AccessibilityEvent()
-    } else {
-        @Suppress("DEPRECATION")
-        AccessibilityEvent.obtain()
-    }.apply {
-        packageName = "androidx.compose.ui.test"
-        className = "android.view.View"
-        isEnabled = true
-    }
+    private fun AccessibilityEvent(): AccessibilityEvent =
+        if (SDK_INT >= R) {
+                android.view.accessibility.AccessibilityEvent()
+            } else {
+                @Suppress("DEPRECATION") AccessibilityEvent.obtain()
+            }
+            .apply {
+                packageName = "androidx.compose.ui.test"
+                className = "android.view.View"
+                isEnabled = true
+            }
 }
diff --git a/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/accessibility/WindowContentChangeTest.kt b/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/accessibility/WindowContentChangeTest.kt
index b8f22d5..40a08a8 100644
--- a/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/accessibility/WindowContentChangeTest.kt
+++ b/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/accessibility/WindowContentChangeTest.kt
@@ -1,4 +1,3 @@
-
 /*
  * Copyright 2020 The Android Open Source Project
  *
@@ -56,8 +55,7 @@
 @MediumTest
 @RunWith(AndroidJUnit4::class)
 class WindowContentChangeTest {
-    @get:Rule
-    val rule = createAndroidComposeRule<TestActivity>()
+    @get:Rule val rule = createAndroidComposeRule<TestActivity>()
 
     private lateinit var androidComposeView: AndroidComposeView
     private val dispatchedAccessibilityEvents = mutableListOf<AccessibilityEvent>()
@@ -70,11 +68,9 @@
         rule.mainClock.autoAdvance = false
         rule.setContentWithAccessibilityEnabled {
             Box(
-                Modifier
-                    .size(10.dp)
-                    .semantics(mergeDescendants = false) {
-                        if (addProperty) disabled()
-                    }
+                Modifier.size(10.dp).semantics(mergeDescendants = false) {
+                    if (addProperty) disabled()
+                }
             )
         }
 
@@ -102,11 +98,9 @@
         rule.mainClock.autoAdvance = false
         rule.setContentWithAccessibilityEnabled {
             Box(
-                Modifier
-                    .size(10.dp)
-                    .semantics(mergeDescendants = false) {
-                        if (!removeProperty) disabled()
-                    }
+                Modifier.size(10.dp).semantics(mergeDescendants = false) {
+                    if (!removeProperty) disabled()
+                }
             )
         }
 
@@ -135,15 +129,13 @@
         rule.mainClock.autoAdvance = false
         rule.setContentWithAccessibilityEnabled {
             Box(
-                Modifier
-                    .size(10.dp)
-                    .semantics(mergeDescendants = false) {
-                        if (!propertiesChanged) {
-                            disabled()
-                        } else {
-                            onClick { true }
-                        }
+                Modifier.size(10.dp).semantics(mergeDescendants = false) {
+                    if (!propertiesChanged) {
+                        disabled()
+                    } else {
+                        onClick { true }
                     }
+                }
             )
         }
 
@@ -171,15 +163,13 @@
         rule.mainClock.autoAdvance = false
         rule.setContentWithAccessibilityEnabled {
             Box(
-                Modifier
-                    .size(10.dp)
-                    .semantics(mergeDescendants = false) {
-                        if (!newAction) {
-                            onClick(label = "action") { true }
-                        } else {
-                            onClick(label = "action") { true }
-                        }
+                Modifier.size(10.dp).semantics(mergeDescendants = false) {
+                    if (!newAction) {
+                        onClick(label = "action") { true }
+                    } else {
+                        onClick(label = "action") { true }
                     }
+                }
             )
         }
 
@@ -198,15 +188,13 @@
         rule.mainClock.autoAdvance = false
         rule.setContentWithAccessibilityEnabled {
             Box(
-                Modifier
-                    .size(10.dp)
-                    .semantics(mergeDescendants = false) {
-                        if (!newAction) {
-                            onClick(label = "action1") { true }
-                        } else {
-                            onClick(label = "action2") { true }
-                        }
+                Modifier.size(10.dp).semantics(mergeDescendants = false) {
+                    if (!newAction) {
+                        onClick(label = "action1") { true }
+                    } else {
+                        onClick(label = "action2") { true }
                     }
+                }
             )
         }
 
@@ -234,15 +222,14 @@
         rule.mainClock.autoAdvance = false
         rule.setContentWithAccessibilityEnabled {
             Box(
-                Modifier
-                    .size(10.dp)
-                    .semantics(mergeDescendants = false) {
-                        customActions = if (!newAction) {
+                Modifier.size(10.dp).semantics(mergeDescendants = false) {
+                    customActions =
+                        if (!newAction) {
                             listOf(CustomAccessibilityAction("action") { true })
                         } else {
                             listOf(CustomAccessibilityAction("action") { false })
                         }
-                    }
+                }
             )
         }
 
@@ -261,15 +248,14 @@
         rule.mainClock.autoAdvance = false
         rule.setContentWithAccessibilityEnabled {
             Box(
-                Modifier
-                    .size(10.dp)
-                    .semantics(mergeDescendants = false) {
-                        customActions = if (!newAction) {
+                Modifier.size(10.dp).semantics(mergeDescendants = false) {
+                    customActions =
+                        if (!newAction) {
                             listOf(CustomAccessibilityAction("action1") { true })
                         } else {
                             listOf(CustomAccessibilityAction("action2") { true })
                         }
-                    }
+                }
             )
         }
 
@@ -297,7 +283,10 @@
             androidComposeView = LocalView.current as AndroidComposeView
             with(androidComposeView.composeAccessibilityDelegate) {
                 accessibilityForceEnabledForTesting = true
-                onSendAccessibilityEvent = { dispatchedAccessibilityEvents += it; false }
+                onSendAccessibilityEvent = {
+                    dispatchedAccessibilityEvents += it
+                    false
+                }
             }
             content()
         }
@@ -309,10 +298,11 @@
     }
 
     companion object {
-        internal val AccessibilityEventComparator = Correspondence
-            .from<AccessibilityEvent, AccessibilityEvent>(
+        internal val AccessibilityEventComparator =
+            Correspondence.from<AccessibilityEvent, AccessibilityEvent>(
                 { actual, expected ->
-                    actual != null && expected != null &&
+                    actual != null &&
+                        expected != null &&
                         actual.eventType == expected.eventType &&
                         actual.eventTime == expected.eventTime &&
                         actual.packageName == expected.packageName &&
@@ -349,18 +339,20 @@
     }
 
     private val View.composeAccessibilityDelegate: AndroidComposeViewAccessibilityDelegateCompat
-        get() = ViewCompat.getAccessibilityDelegate(this)
-            as AndroidComposeViewAccessibilityDelegateCompat
+        get() =
+            ViewCompat.getAccessibilityDelegate(this)
+                as AndroidComposeViewAccessibilityDelegateCompat
 
     // TODO(b/304359126): Move this to AccessibilityEventCompat and use it wherever we use obtain().
-    private fun AccessibilityEvent(): AccessibilityEvent = if (SDK_INT >= R) {
-        android.view.accessibility.AccessibilityEvent()
-    } else {
-        @Suppress("DEPRECATION")
-        AccessibilityEvent.obtain()
-    }.apply {
-        packageName = "androidx.compose.ui.test"
-        className = "android.view.View"
-        isEnabled = true
-    }
+    private fun AccessibilityEvent(): AccessibilityEvent =
+        if (SDK_INT >= R) {
+                android.view.accessibility.AccessibilityEvent()
+            } else {
+                @Suppress("DEPRECATION") AccessibilityEvent.obtain()
+            }
+            .apply {
+                packageName = "androidx.compose.ui.test"
+                className = "android.view.View"
+                isEnabled = true
+            }
 }
diff --git a/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/autofill/AndroidAutoFillTest.kt b/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/autofill/AndroidAutoFillTest.kt
index 0ed8118..939dfd0 100644
--- a/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/autofill/AndroidAutoFillTest.kt
+++ b/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/autofill/AndroidAutoFillTest.kt
@@ -40,8 +40,7 @@
 @SmallTest
 @RunWith(AndroidJUnit4::class)
 class AndroidAutoFillTest {
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
     private var autofill: Autofill? = null
     private lateinit var autofillTree: AutofillTree
@@ -79,11 +78,12 @@
     fun onProvideAutofillVirtualStructure_populatesViewStructure() {
         // Arrange.
         val viewStructure: ViewStructure = FakeViewStructure()
-        val autofillNode = AutofillNode(
-            onFill = {},
-            autofillTypes = listOf(AutofillType.PersonFullName),
-            boundingBox = Rect(0f, 0f, 0f, 0f)
-        )
+        val autofillNode =
+            AutofillNode(
+                onFill = {},
+                autofillTypes = listOf(AutofillType.PersonFullName),
+                boundingBox = Rect(0f, 0f, 0f, 0f)
+            )
         autofillTree += autofillNode
 
         // Act.
@@ -91,19 +91,20 @@
         val currentPackageName = ownerView.context.applicationInfo.packageName
 
         // Assert.
-        assertThat(viewStructure).isEqualTo(
-            FakeViewStructure().apply {
-                children.add(
-                    FakeViewStructure().apply {
-                        virtualId = autofillNode.id
-                        packageName = currentPackageName
-                        setAutofillType(View.AUTOFILL_TYPE_TEXT)
-                        setAutofillHints(arrayOf(AUTOFILL_HINT_PERSON_NAME))
-                        setDimens(0, 0, 0, 0, 0, 0)
-                    }
-                )
-            }
-        )
+        assertThat(viewStructure)
+            .isEqualTo(
+                FakeViewStructure().apply {
+                    children.add(
+                        FakeViewStructure().apply {
+                            virtualId = autofillNode.id
+                            packageName = currentPackageName
+                            setAutofillType(View.AUTOFILL_TYPE_TEXT)
+                            setAutofillHints(arrayOf(AUTOFILL_HINT_PERSON_NAME))
+                            setDimens(0, 0, 0, 0, 0, 0)
+                        }
+                    )
+                }
+            )
     }
 
     @SdkSuppress(minSdkVersion = 26)
@@ -112,14 +113,16 @@
         // Arrange.
         val expectedValue = "PersonName"
         var autofilledValue = ""
-        val autofillNode = AutofillNode(
-            onFill = { autofilledValue = it },
-            autofillTypes = listOf(AutofillType.PersonFullName),
-            boundingBox = Rect(0f, 0f, 0f, 0f)
-        )
-        val autofillValues = SparseArray<AutofillValue>().apply {
-            append(autofillNode.id, AutofillValue.forText(expectedValue))
-        }
+        val autofillNode =
+            AutofillNode(
+                onFill = { autofilledValue = it },
+                autofillTypes = listOf(AutofillType.PersonFullName),
+                boundingBox = Rect(0f, 0f, 0f, 0f)
+            )
+        val autofillValues =
+            SparseArray<AutofillValue>().apply {
+                append(autofillNode.id, AutofillValue.forText(expectedValue))
+            }
         autofillTree += autofillNode
 
         // Act.
diff --git a/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/autofill/AndroidSemanticAutofillTest.kt b/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/autofill/AndroidSemanticAutofillTest.kt
index fd26064..fe019e6 100644
--- a/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/autofill/AndroidSemanticAutofillTest.kt
+++ b/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/autofill/AndroidSemanticAutofillTest.kt
@@ -82,8 +82,7 @@
 // TODO(MNUZEN): split into filling / saving etc. when more of Autofill goes live and more
 // data types are supported.
 class AndroidPerformSemanticAutofillTest {
-    @get:Rule
-    val rule = createAndroidComposeRule<TestActivity>()
+    @get:Rule val rule = createAndroidComposeRule<TestActivity>()
     private lateinit var androidComposeView: AndroidComposeView
     private lateinit var composeView: View
 
@@ -132,9 +131,7 @@
                     // ViewStructure populated. Once Autofill is triggered for all semantics nodes
                     // (not just ones related to Autofill) the semantics below will no longer be
                     // necessary.
-                    .semantics {
-                        contentType = ContentType.Username
-                    }
+                    .semantics { contentType = ContentType.Username }
                     .size(height, width)
                     .testTag(contentTag)
             )
@@ -146,21 +143,22 @@
         }
 
         // Assert.
-        Truth.assertThat(viewStructure).isEqualTo(
-            FakeViewStructure().apply {
-                children.add(
-                    FakeViewStructure {
-                        virtualId = contentTag.semanticsId()
-                        setAutofillHints(arrayOf(HintConstants.AUTOFILL_HINT_USERNAME))
-                        setVisibility(View.VISIBLE)
-                        setLongClickable(false)
-                        setFocusable(false)
-                        setFocused(false)
-                        setEnabled(false)
-                    }
-                )
-            }
-        )
+        Truth.assertThat(viewStructure)
+            .isEqualTo(
+                FakeViewStructure().apply {
+                    children.add(
+                        FakeViewStructure {
+                            virtualId = contentTag.semanticsId()
+                            setAutofillHints(arrayOf(HintConstants.AUTOFILL_HINT_USERNAME))
+                            setVisibility(View.VISIBLE)
+                            setLongClickable(false)
+                            setFocusable(false)
+                            setFocused(false)
+                            setEnabled(false)
+                        }
+                    )
+                }
+            )
     }
 
     @Test
@@ -178,9 +176,7 @@
                     // ViewStructure populated. Once Autofill is triggered for all semantics nodes
                     // (not just ones related to Autofill) the semantics below will no longer be
                     // necessary.
-                    .semantics {
-                        contentType = ContentType.Username
-                    }
+                    .semantics { contentType = ContentType.Username }
                     .size(height, width)
                     .testTag(contentTag)
             )
@@ -192,22 +188,23 @@
         }
 
         // Assert.
-        Truth.assertThat(viewStructure).isEqualTo(
-            FakeViewStructure().apply {
-                children.add(
-                    FakeViewStructure {
-                        virtualId = contentTag.semanticsId()
-                        setAutofillHints(arrayOf(HintConstants.AUTOFILL_HINT_USERNAME))
-                        setVisibility(View.VISIBLE)
-                        setLongClickable(false)
-                        setFocusable(false)
-                        setFocused(false)
-                        setEnabled(false)
-                        setMaxTextLength(-1)
-                    }
-                )
-            }
-        )
+        Truth.assertThat(viewStructure)
+            .isEqualTo(
+                FakeViewStructure().apply {
+                    children.add(
+                        FakeViewStructure {
+                            virtualId = contentTag.semanticsId()
+                            setAutofillHints(arrayOf(HintConstants.AUTOFILL_HINT_USERNAME))
+                            setVisibility(View.VISIBLE)
+                            setLongClickable(false)
+                            setFocusable(false)
+                            setFocused(false)
+                            setEnabled(false)
+                            setMaxTextLength(-1)
+                        }
+                    )
+                }
+            )
     }
 
     @Test
@@ -219,10 +216,7 @@
 
         rule.setContentWithAutofillEnabled {
             Box(
-                Modifier
-                    .semantics {
-                        contentType = ContentType.Username
-                    }
+                Modifier.semantics { contentType = ContentType.Username }
                     .size(height, width)
                     .testTag(contentTag)
             )
@@ -234,16 +228,17 @@
         }
 
         // Assert.
-        Truth.assertThat(viewStructure).isEqualTo(
-            FakeViewStructure().apply {
-                children.add(
-                    FakeViewStructure {
-                        virtualId = contentTag.semanticsId()
-                        setAutofillHints(arrayOf(HintConstants.AUTOFILL_HINT_USERNAME))
-                    }
-                )
-            }
-        )
+        Truth.assertThat(viewStructure)
+            .isEqualTo(
+                FakeViewStructure().apply {
+                    children.add(
+                        FakeViewStructure {
+                            virtualId = contentTag.semanticsId()
+                            setAutofillHints(arrayOf(HintConstants.AUTOFILL_HINT_USERNAME))
+                        }
+                    )
+                }
+            )
     }
 
     @Test
@@ -255,10 +250,7 @@
 
         rule.setContentWithAutofillEnabled {
             Box(
-                Modifier
-                    .semantics {
-                        contentDataType = ContentDataType.Text
-                    }
+                Modifier.semantics { contentDataType = ContentDataType.Text }
                     .size(height, width)
                     .testTag(contentTag)
             )
@@ -270,16 +262,17 @@
         }
 
         // Assert.
-        Truth.assertThat(viewStructure).isEqualTo(
-            FakeViewStructure().apply {
-                children.add(
-                    FakeViewStructure {
-                        virtualId = contentTag.semanticsId()
-                        setAutofillType(AUTOFILL_TYPE_TEXT)
-                    }
-                )
-            }
-        )
+        Truth.assertThat(viewStructure)
+            .isEqualTo(
+                FakeViewStructure().apply {
+                    children.add(
+                        FakeViewStructure {
+                            virtualId = contentTag.semanticsId()
+                            setAutofillType(AUTOFILL_TYPE_TEXT)
+                        }
+                    )
+                }
+            )
     }
 
     @Test
@@ -291,10 +284,7 @@
 
         rule.setContentWithAutofillEnabled {
             Box(
-                Modifier
-                    .semantics {
-                        contentType = ContentType.Username
-                    }
+                Modifier.semantics { contentType = ContentType.Username }
                     .size(width, height)
                     .clickable {}
                     .testTag(contentTag)
@@ -307,18 +297,19 @@
         }
 
         // Assert.
-        Truth.assertThat(viewStructure).isEqualTo(
-            FakeViewStructure().apply {
-                children.add(
-                    FakeViewStructure {
-                        virtualId = contentTag.semanticsId()
-                        setAutofillHints(arrayOf(HintConstants.AUTOFILL_HINT_USERNAME))
-                        setClickable(true)
-                        setFocusable(true)
-                    }
-                )
-            }
-        )
+        Truth.assertThat(viewStructure)
+            .isEqualTo(
+                FakeViewStructure().apply {
+                    children.add(
+                        FakeViewStructure {
+                            virtualId = contentTag.semanticsId()
+                            setAutofillHints(arrayOf(HintConstants.AUTOFILL_HINT_USERNAME))
+                            setClickable(true)
+                            setFocusable(true)
+                        }
+                    )
+                }
+            )
     }
 
     @Test
@@ -330,8 +321,7 @@
 
         rule.setContentWithAutofillEnabled {
             Box(
-                Modifier
-                    .semantics {
+                Modifier.semantics {
                         contentType = ContentType.Username
                         contentDescription = contentTag
                     }
@@ -346,17 +336,18 @@
         }
 
         // Assert.
-        Truth.assertThat(viewStructure).isEqualTo(
-            FakeViewStructure().apply {
-                children.add(
-                    FakeViewStructure {
-                        virtualId = contentTag.semanticsId()
-                        setAutofillHints(arrayOf(HintConstants.AUTOFILL_HINT_USERNAME))
-                        setContentDescription(contentTag)
-                    }
-                )
-            }
-        )
+        Truth.assertThat(viewStructure)
+            .isEqualTo(
+                FakeViewStructure().apply {
+                    children.add(
+                        FakeViewStructure {
+                            virtualId = contentTag.semanticsId()
+                            setAutofillHints(arrayOf(HintConstants.AUTOFILL_HINT_USERNAME))
+                            setContentDescription(contentTag)
+                        }
+                    )
+                }
+            )
     }
 
     @Test
@@ -368,14 +359,11 @@
 
         rule.setContentWithAutofillEnabled {
             Box(
-                Modifier
-                    .semantics {
-                        contentType = ContentType.Username
-                    }
+                Modifier.semantics { contentType = ContentType.Username }
                     .size(width, height)
                     .selectable(
                         selected = true,
-                        onClick = { },
+                        onClick = {},
                         enabled = true,
                         role = Role.Tab,
                         interactionSource = null,
@@ -391,20 +379,21 @@
         }
 
         // Assert.
-        Truth.assertThat(viewStructure).isEqualTo(
-            FakeViewStructure().apply {
-                children.add(
-                    FakeViewStructure {
-                        virtualId = contentTag.semanticsId()
-                        setAutofillHints(arrayOf(HintConstants.AUTOFILL_HINT_USERNAME))
-                        setClickable(true)
-                        setFocusable(true)
-                        setEnabled(true)
-                        setSelected(true)
-                    }
-                )
-            }
-        )
+        Truth.assertThat(viewStructure)
+            .isEqualTo(
+                FakeViewStructure().apply {
+                    children.add(
+                        FakeViewStructure {
+                            virtualId = contentTag.semanticsId()
+                            setAutofillHints(arrayOf(HintConstants.AUTOFILL_HINT_USERNAME))
+                            setClickable(true)
+                            setFocusable(true)
+                            setEnabled(true)
+                            setSelected(true)
+                        }
+                    )
+                }
+            )
     }
 
     @Test
@@ -416,14 +405,11 @@
 
         rule.setContentWithAutofillEnabled {
             Box(
-                Modifier
-                    .semantics {
-                        contentType = ContentType.Username
-                    }
+                Modifier.semantics { contentType = ContentType.Username }
                     .size(width, height)
                     .selectable(
                         selected = true,
-                        onClick = { },
+                        onClick = {},
                         enabled = true,
                         role = Role.RadioButton,
                         interactionSource = null,
@@ -439,20 +425,21 @@
         }
 
         // Assert.
-        Truth.assertThat(viewStructure).isEqualTo(
-            FakeViewStructure().apply {
-                children.add(
-                    FakeViewStructure {
-                        virtualId = contentTag.semanticsId()
-                        setAutofillHints(arrayOf(HintConstants.AUTOFILL_HINT_USERNAME))
-                        setClickable(true)
-                        setFocusable(true)
-                        setEnabled(true)
-                        setSelected(true)
-                    }
-                )
-            }
-        )
+        Truth.assertThat(viewStructure)
+            .isEqualTo(
+                FakeViewStructure().apply {
+                    children.add(
+                        FakeViewStructure {
+                            virtualId = contentTag.semanticsId()
+                            setAutofillHints(arrayOf(HintConstants.AUTOFILL_HINT_USERNAME))
+                            setClickable(true)
+                            setFocusable(true)
+                            setEnabled(true)
+                            setSelected(true)
+                        }
+                    )
+                }
+            )
     }
 
     @OptIn(ExperimentalComposeUiApi::class)
@@ -465,8 +452,7 @@
 
         rule.setContentWithAutofillEnabled {
             Box(
-                Modifier
-                    .semantics {
+                Modifier.semantics {
                         contentType = ContentType.Username
                         invisibleToUser()
                     }
@@ -481,17 +467,18 @@
         }
 
         // Assert.
-        Truth.assertThat(viewStructure).isEqualTo(
-            FakeViewStructure().apply {
-                children.add(
-                    FakeViewStructure {
-                        virtualId = contentTag.semanticsId()
-                        setAutofillHints(arrayOf(HintConstants.AUTOFILL_HINT_USERNAME))
-                        setVisibility(View.INVISIBLE)
-                    }
-                )
-            }
-        )
+        Truth.assertThat(viewStructure)
+            .isEqualTo(
+                FakeViewStructure().apply {
+                    children.add(
+                        FakeViewStructure {
+                            virtualId = contentTag.semanticsId()
+                            setAutofillHints(arrayOf(HintConstants.AUTOFILL_HINT_USERNAME))
+                            setVisibility(View.INVISIBLE)
+                        }
+                    )
+                }
+            )
     }
 
     @Test
@@ -503,10 +490,7 @@
 
         rule.setContentWithAutofillEnabled {
             Box(
-                Modifier
-                    .semantics {
-                        contentType = ContentType.Username
-                    }
+                Modifier.semantics { contentType = ContentType.Username }
                     .size(width, height)
                     .testTag(contentTag)
             )
@@ -518,17 +502,18 @@
         }
 
         // Assert.
-        Truth.assertThat(viewStructure).isEqualTo(
-            FakeViewStructure().apply {
-                children.add(
-                    FakeViewStructure {
-                        virtualId = contentTag.semanticsId()
-                        setAutofillHints(arrayOf(HintConstants.AUTOFILL_HINT_USERNAME))
-                        setVisibility(View.VISIBLE)
-                    }
-                )
-            }
-        )
+        Truth.assertThat(viewStructure)
+            .isEqualTo(
+                FakeViewStructure().apply {
+                    children.add(
+                        FakeViewStructure {
+                            virtualId = contentTag.semanticsId()
+                            setAutofillHints(arrayOf(HintConstants.AUTOFILL_HINT_USERNAME))
+                            setVisibility(View.VISIBLE)
+                        }
+                    )
+                }
+            )
     }
 
     @Test
@@ -540,10 +525,7 @@
 
         rule.setContentWithAutofillEnabled {
             Box(
-                Modifier
-                    .semantics {
-                        contentType = ContentType.Username
-                    }
+                Modifier.semantics { contentType = ContentType.Username }
                     .alpha(0f) // this node should now be invisible
                     .size(width, height)
                     .testTag(contentTag)
@@ -556,17 +538,18 @@
         }
 
         // Assert.
-        Truth.assertThat(viewStructure).isEqualTo(
-            FakeViewStructure().apply {
-                children.add(
-                    FakeViewStructure {
-                        virtualId = contentTag.semanticsId()
-                        setAutofillHints(arrayOf(HintConstants.AUTOFILL_HINT_USERNAME))
-                        setVisibility(View.INVISIBLE)
-                    }
-                )
-            }
-        )
+        Truth.assertThat(viewStructure)
+            .isEqualTo(
+                FakeViewStructure().apply {
+                    children.add(
+                        FakeViewStructure {
+                            virtualId = contentTag.semanticsId()
+                            setAutofillHints(arrayOf(HintConstants.AUTOFILL_HINT_USERNAME))
+                            setVisibility(View.INVISIBLE)
+                        }
+                    )
+                }
+            )
     }
 
     @Test
@@ -578,8 +561,7 @@
 
         rule.setContentWithAutofillEnabled {
             Box(
-                Modifier
-                    .semantics {
+                Modifier.semantics {
                         contentType = ContentType.Username
                         onLongClick { true }
                     }
@@ -594,17 +576,18 @@
         }
 
         // Assert.
-        Truth.assertThat(viewStructure).isEqualTo(
-            FakeViewStructure().apply {
-                children.add(
-                    FakeViewStructure {
-                        virtualId = contentTag.semanticsId()
-                        setAutofillHints(arrayOf(HintConstants.AUTOFILL_HINT_USERNAME))
-                        setLongClickable(true)
-                    }
-                )
-            }
-        )
+        Truth.assertThat(viewStructure)
+            .isEqualTo(
+                FakeViewStructure().apply {
+                    children.add(
+                        FakeViewStructure {
+                            virtualId = contentTag.semanticsId()
+                            setAutofillHints(arrayOf(HintConstants.AUTOFILL_HINT_USERNAME))
+                            setLongClickable(true)
+                        }
+                    )
+                }
+            )
     }
 
     @Test
@@ -616,8 +599,7 @@
 
         rule.setContentWithAutofillEnabled {
             Box(
-                Modifier
-                    .semantics {
+                Modifier.semantics {
                         contentType = ContentType.Username
                         isFocusable()
                         isFocused()
@@ -633,18 +615,19 @@
         }
 
         // Assert.
-        Truth.assertThat(viewStructure).isEqualTo(
-            FakeViewStructure().apply {
-                children.add(
-                    FakeViewStructure {
-                        virtualId = contentTag.semanticsId()
-                        setAutofillHints(arrayOf(HintConstants.AUTOFILL_HINT_USERNAME))
-                        setFocusable(true)
-                        setFocused(true)
-                    }
-                )
-            }
-        )
+        Truth.assertThat(viewStructure)
+            .isEqualTo(
+                FakeViewStructure().apply {
+                    children.add(
+                        FakeViewStructure {
+                            virtualId = contentTag.semanticsId()
+                            setAutofillHints(arrayOf(HintConstants.AUTOFILL_HINT_USERNAME))
+                            setFocusable(true)
+                            setFocused(true)
+                        }
+                    )
+                }
+            )
     }
 
     @Test
@@ -656,8 +639,7 @@
 
         rule.setContentWithAutofillEnabled {
             Box(
-                Modifier
-                    .semantics {
+                Modifier.semantics {
                         contentType = ContentType.Username
                         isEnabled()
                     }
@@ -672,17 +654,18 @@
         }
 
         // Assert.
-        Truth.assertThat(viewStructure).isEqualTo(
-            FakeViewStructure().apply {
-                children.add(
-                    FakeViewStructure {
-                        virtualId = contentTag.semanticsId()
-                        setAutofillHints(arrayOf(HintConstants.AUTOFILL_HINT_USERNAME))
-                        setEnabled(true)
-                    }
-                )
-            }
-        )
+        Truth.assertThat(viewStructure)
+            .isEqualTo(
+                FakeViewStructure().apply {
+                    children.add(
+                        FakeViewStructure {
+                            virtualId = contentTag.semanticsId()
+                            setAutofillHints(arrayOf(HintConstants.AUTOFILL_HINT_USERNAME))
+                            setEnabled(true)
+                        }
+                    )
+                }
+            )
     }
 
     @Test
@@ -694,8 +677,7 @@
 
         rule.setContentWithAutofillEnabled {
             Box(
-                Modifier
-                    .semantics {
+                Modifier.semantics {
                         contentType = ContentType.Username
                         maxTextLength = 5
                     }
@@ -710,17 +692,18 @@
         }
 
         // Assert.
-        Truth.assertThat(viewStructure).isEqualTo(
-            FakeViewStructure().apply {
-                children.add(
-                    FakeViewStructure {
-                        virtualId = contentTag.semanticsId()
-                        setAutofillHints(arrayOf(HintConstants.AUTOFILL_HINT_USERNAME))
-                        setMaxTextLength(5)
-                    }
-                )
-            }
-        )
+        Truth.assertThat(viewStructure)
+            .isEqualTo(
+                FakeViewStructure().apply {
+                    children.add(
+                        FakeViewStructure {
+                            virtualId = contentTag.semanticsId()
+                            setAutofillHints(arrayOf(HintConstants.AUTOFILL_HINT_USERNAME))
+                            setMaxTextLength(5)
+                        }
+                    )
+                }
+            )
     }
 
     @Test
@@ -732,8 +715,7 @@
 
         rule.setContentWithAutofillEnabled {
             Box(
-                Modifier
-                    .semantics {
+                Modifier.semantics {
                         contentType = ContentType.Username
                         toggleableState = ToggleableState.Off
                     }
@@ -748,19 +730,20 @@
         }
 
         // Assert.
-        Truth.assertThat(viewStructure).isEqualTo(
-            FakeViewStructure().apply {
-                children.add(
-                    FakeViewStructure {
-                        virtualId = contentTag.semanticsId()
-                        setAutofillHints(arrayOf(HintConstants.AUTOFILL_HINT_USERNAME))
-                        setAutofillType(View.AUTOFILL_TYPE_TOGGLE)
-                        setCheckable(true)
-                        setFocusable(true)
-                    }
-                )
-            }
-        )
+        Truth.assertThat(viewStructure)
+            .isEqualTo(
+                FakeViewStructure().apply {
+                    children.add(
+                        FakeViewStructure {
+                            virtualId = contentTag.semanticsId()
+                            setAutofillHints(arrayOf(HintConstants.AUTOFILL_HINT_USERNAME))
+                            setAutofillType(View.AUTOFILL_TYPE_TOGGLE)
+                            setCheckable(true)
+                            setFocusable(true)
+                        }
+                    )
+                }
+            )
     }
 
     @Test
@@ -772,8 +755,7 @@
 
         rule.setContentWithAutofillEnabled {
             Box(
-                Modifier
-                    .semantics {
+                Modifier.semantics {
                         contentType = ContentType.Username
                         toggleableState = ToggleableState.On
                     }
@@ -788,20 +770,21 @@
         }
 
         // Assert.
-        Truth.assertThat(viewStructure).isEqualTo(
-            FakeViewStructure().apply {
-                children.add(
-                    FakeViewStructure {
-                        virtualId = contentTag.semanticsId()
-                        setAutofillHints(arrayOf(HintConstants.AUTOFILL_HINT_USERNAME))
-                        setAutofillType(View.AUTOFILL_TYPE_TOGGLE)
-                        setCheckable(true)
-                        setChecked(true)
-                        setFocusable(true)
-                    }
-                )
-            }
-        )
+        Truth.assertThat(viewStructure)
+            .isEqualTo(
+                FakeViewStructure().apply {
+                    children.add(
+                        FakeViewStructure {
+                            virtualId = contentTag.semanticsId()
+                            setAutofillHints(arrayOf(HintConstants.AUTOFILL_HINT_USERNAME))
+                            setAutofillType(View.AUTOFILL_TYPE_TOGGLE)
+                            setCheckable(true)
+                            setChecked(true)
+                            setFocusable(true)
+                        }
+                    )
+                }
+            )
     }
 
     @Test
@@ -817,11 +800,8 @@
             Column {
                 BasicTextField(
                     state = usernameState,
-                    modifier = createTextFieldModifier(
-                        ContentType.Username,
-                        contentTag,
-                        usernameState
-                    )
+                    modifier =
+                        createTextFieldModifier(ContentType.Username, contentTag, usernameState)
                 )
             }
         }
@@ -832,26 +812,27 @@
         }
 
         // Assert.
-        Truth.assertThat(viewStructure).isEqualTo(
-            FakeViewStructure().apply {
-                children.add(
-                    FakeViewStructure {
-                        virtualId = contentTag.semanticsId()
-                        text = ""
-                        setAutofillHints(arrayOf(HintConstants.AUTOFILL_HINT_USERNAME))
-                        setAutofillType(AUTOFILL_TYPE_TEXT)
-                        setAutofillValue(AutofillValue.forText(""))
-                        setClassName(
-                            AndroidComposeViewAccessibilityDelegateCompat.TextFieldClassName
-                        )
-                        setClickable(true)
-                        setFocusable(true)
-                        setLongClickable(true)
-                        setVisibility(View.VISIBLE)
-                    }
-                )
-            }
-        )
+        Truth.assertThat(viewStructure)
+            .isEqualTo(
+                FakeViewStructure().apply {
+                    children.add(
+                        FakeViewStructure {
+                            virtualId = contentTag.semanticsId()
+                            text = ""
+                            setAutofillHints(arrayOf(HintConstants.AUTOFILL_HINT_USERNAME))
+                            setAutofillType(AUTOFILL_TYPE_TEXT)
+                            setAutofillValue(AutofillValue.forText(""))
+                            setClassName(
+                                AndroidComposeViewAccessibilityDelegateCompat.TextFieldClassName
+                            )
+                            setClickable(true)
+                            setFocusable(true)
+                            setLongClickable(true)
+                            setVisibility(View.VISIBLE)
+                        }
+                    )
+                }
+            )
     }
 
     @Test
@@ -867,11 +848,8 @@
             Column {
                 BasicTextField(
                     state = passwordState,
-                    modifier = createTextFieldModifier(
-                        ContentType.Password,
-                        contentTag,
-                        passwordState
-                    )
+                    modifier =
+                        createTextFieldModifier(ContentType.Password, contentTag, passwordState)
                 )
             }
         }
@@ -882,30 +860,31 @@
         }
 
         // Assert.
-        Truth.assertThat(viewStructure).isEqualTo(
-            FakeViewStructure().apply {
-                children.add(
-                    FakeViewStructure {
-                        virtualId = contentTag.semanticsId()
-                        text = ""
-                        setAutofillHints(arrayOf(HintConstants.AUTOFILL_HINT_USERNAME))
-                        setAutofillType(AUTOFILL_TYPE_TEXT)
-                        setAutofillValue(AutofillValue.forText(""))
-                        setClassName(
-                            AndroidComposeViewAccessibilityDelegateCompat.TextFieldClassName
-                        )
-                        setClickable(true)
-                        setDataIsSensitive(true)
-                        setInputType(
-                            InputType.TYPE_CLASS_TEXT or EditorInfo.TYPE_TEXT_VARIATION_PASSWORD
-                        )
-                        setFocusable(true)
-                        setLongClickable(true)
-                        setVisibility(View.VISIBLE)
-                    }
-                )
-            }
-        )
+        Truth.assertThat(viewStructure)
+            .isEqualTo(
+                FakeViewStructure().apply {
+                    children.add(
+                        FakeViewStructure {
+                            virtualId = contentTag.semanticsId()
+                            text = ""
+                            setAutofillHints(arrayOf(HintConstants.AUTOFILL_HINT_USERNAME))
+                            setAutofillType(AUTOFILL_TYPE_TEXT)
+                            setAutofillValue(AutofillValue.forText(""))
+                            setClassName(
+                                AndroidComposeViewAccessibilityDelegateCompat.TextFieldClassName
+                            )
+                            setClickable(true)
+                            setDataIsSensitive(true)
+                            setInputType(
+                                InputType.TYPE_CLASS_TEXT or EditorInfo.TYPE_TEXT_VARIATION_PASSWORD
+                            )
+                            setFocusable(true)
+                            setLongClickable(true)
+                            setVisibility(View.VISIBLE)
+                        }
+                    )
+                }
+            )
     }
 
     // ============================================================================================
@@ -929,31 +908,24 @@
             Column {
                 BasicTextField(
                     state = usernameState,
-                    modifier = createTextFieldModifier(
-                        ContentType.Username,
-                        usernameTag,
-                        usernameState
-                    )
+                    modifier =
+                        createTextFieldModifier(ContentType.Username, usernameTag, usernameState)
                 )
                 BasicTextField(
                     state = passwordState,
-                    modifier = createTextFieldModifier(
-                        ContentType.Password,
-                        passwordTag,
-                        passwordState
-                    )
+                    modifier =
+                        createTextFieldModifier(ContentType.Password, passwordTag, passwordState)
                 )
             }
         }
 
-        val autofillValues = SparseArray<AutofillValue>().apply {
-            append(usernameTag.semanticsId(), AutofillValue.forText(expectedUsername))
-            append(passwordTag.semanticsId(), AutofillValue.forText(expectedPassword))
-        }
+        val autofillValues =
+            SparseArray<AutofillValue>().apply {
+                append(usernameTag.semanticsId(), AutofillValue.forText(expectedUsername))
+                append(passwordTag.semanticsId(), AutofillValue.forText(expectedPassword))
+            }
 
-        rule.runOnIdle {
-            androidComposeView.autofill(autofillValues)
-        }
+        rule.runOnIdle { androidComposeView.autofill(autofillValues) }
 
         rule.onNodeWithTag(usernameTag).assertTextEquals(expectedUsername)
         rule.onNodeWithTag(passwordTag).assertTextEquals(expectedPassword)
@@ -975,31 +947,32 @@
             Column {
                 BasicTextField(
                     state = creditCardInput,
-                    modifier = createTextFieldModifier(
-                        ContentType.Username,
-                        creditCardTag,
-                        creditCardInput
-                    )
+                    modifier =
+                        createTextFieldModifier(
+                            ContentType.Username,
+                            creditCardTag,
+                            creditCardInput
+                        )
                 )
                 BasicTextField(
                     state = securityCodeInput,
-                    modifier = createTextFieldModifier(
-                        ContentType.Username,
-                        securityCodeTag,
-                        securityCodeInput
-                    )
+                    modifier =
+                        createTextFieldModifier(
+                            ContentType.Username,
+                            securityCodeTag,
+                            securityCodeInput
+                        )
                 )
             }
         }
 
-        val autofillValues = SparseArray<AutofillValue>().apply {
-            append(creditCardTag.semanticsId(), AutofillValue.forText(expectedCreditCardNumber))
-            append(securityCodeTag.semanticsId(), AutofillValue.forText(expectedSecurityCode))
-        }
+        val autofillValues =
+            SparseArray<AutofillValue>().apply {
+                append(creditCardTag.semanticsId(), AutofillValue.forText(expectedCreditCardNumber))
+                append(securityCodeTag.semanticsId(), AutofillValue.forText(expectedSecurityCode))
+            }
 
-        rule.runOnIdle {
-            androidComposeView.autofill(autofillValues)
-        }
+        rule.runOnIdle { androidComposeView.autofill(autofillValues) }
 
         rule.onNodeWithTag(creditCardTag).assertTextEquals(expectedCreditCardNumber)
         rule.onNodeWithTag(securityCodeTag).assertTextEquals(expectedSecurityCode)
@@ -1028,15 +1001,12 @@
         inputTag: String,
         inputState: TextFieldState
     ): Modifier {
-        return Modifier
-            .border(1.dp, Color.LightGray)
+        return Modifier.border(1.dp, Color.LightGray)
             .semantics {
                 contentType = autofillHints
                 contentDataType = ContentDataType.Text
                 onAutofillText {
-                    inputState.edit {
-                        insert(0, it.text)
-                    }
+                    inputState.edit { insert(0, it.text) }
                     true
                 }
             }
@@ -1045,10 +1015,12 @@
     }
 
     private inline fun FakeViewStructure(block: FakeViewStructure.() -> Unit): FakeViewStructure {
-        return FakeViewStructure().apply {
-            packageName = composeView.context.applicationInfo.packageName
-            setDimens(0, 0, 0, 0, width.dpToPx(), height.dpToPx())
-        }.apply(block)
+        return FakeViewStructure()
+            .apply {
+                packageName = composeView.context.applicationInfo.packageName
+                setDimens(0, 0, 0, 0, width.dpToPx(), height.dpToPx())
+            }
+            .apply(block)
     }
 
     @OptIn(ExperimentalComposeUiApi::class)
diff --git a/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/autofill/FakeViewStructure.kt b/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/autofill/FakeViewStructure.kt
index 0852601..0a70dd6 100644
--- a/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/autofill/FakeViewStructure.kt
+++ b/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/autofill/FakeViewStructure.kt
@@ -39,16 +39,12 @@
  * @param children A list of [ViewStructure]s that are children of the current [ViewStructure].
  * @param bounds The bounds (Dimensions) of the component represented by this [ViewStructure].
  * @param autofillId The [autofillId] for the parent component. The same autofillId is used for
- * other child components.
- * @param autofillType The data type. Can be one of the following:
- * [View.AUTOFILL_TYPE_DATE],
- * [View.AUTOFILL_TYPE_LIST],
- * [View.AUTOFILL_TYPE_TEXT],
- * [View.AUTOFILL_TYPE_TOGGLE] or
- * [View.AUTOFILL_TYPE_NONE].
+ *   other child components.
+ * @param autofillType The data type. Can be one of the following: [View.AUTOFILL_TYPE_DATE],
+ *   [View.AUTOFILL_TYPE_LIST], [View.AUTOFILL_TYPE_TEXT], [View.AUTOFILL_TYPE_TOGGLE] or
+ *   [View.AUTOFILL_TYPE_NONE].
  * @param autofillHints The autofill hint. If this value not specified, we use heuristics to
- * determine what data to use while performing autofill.
- *
+ *   determine what data to use while performing autofill.
  */
 @RequiresApi(Build.VERSION_CODES.O)
 internal data class FakeViewStructure(
@@ -93,8 +89,7 @@
     private var webDomain: String? = null
 
     internal companion object {
-        @GuardedBy("this")
-        private var previousId = 0
+        @GuardedBy("this") private var previousId = 0
         private val NO_SESSION = 0
 
         @Synchronized
@@ -152,42 +147,43 @@
         this.bounds = Rect(left, top, width - left, height - top)
     }
 
-    override fun equals(other: Any?) = other is FakeViewStructure &&
-        other.virtualId == virtualId &&
-        other.packageName == packageName &&
-        other.typeName == typeName &&
-        other.entryName == entryName &&
-        other.autofillType == autofillType &&
-        other.autofillHints.contentEquals(autofillHints) &&
-        other.bounds.contentEquals(bounds) &&
-        other.activated == activated &&
-        other.alpha == alpha &&
-        other.autofillOptions.contentEquals(autofillOptions) &&
-        other.autofillValue == autofillValue &&
-        other.className == className &&
-        other.children.count() == children.count() &&
-        other.contentDescription == contentDescription &&
-        other.dataIsSensitive == dataIsSensitive &&
-        other.elevation == elevation &&
-        other.hint == hint &&
-        other.htmlInfo == htmlInfo &&
-        other.inputType == inputType &&
-        other.isEnabled == isEnabled &&
-        other.isCheckable == isCheckable &&
-        other.isChecked == isChecked &&
-        other.isClickable == isClickable &&
-        other.isContextClickable == isContextClickable &&
-        other.isAccessibilityFocused == isAccessibilityFocused &&
-        other.isFocused == isFocused &&
-        other.isLongClickable == isLongClickable &&
-        other.isOpaque == isOpaque &&
-        other.isFocusable == isFocusable &&
-        other.selected == selected &&
-        other.text == text &&
-        other.textLines.contentEquals(textLines) &&
-        other.transformation == transformation &&
-        other.visibility == visibility &&
-        other.webDomain == webDomain
+    override fun equals(other: Any?) =
+        other is FakeViewStructure &&
+            other.virtualId == virtualId &&
+            other.packageName == packageName &&
+            other.typeName == typeName &&
+            other.entryName == entryName &&
+            other.autofillType == autofillType &&
+            other.autofillHints.contentEquals(autofillHints) &&
+            other.bounds.contentEquals(bounds) &&
+            other.activated == activated &&
+            other.alpha == alpha &&
+            other.autofillOptions.contentEquals(autofillOptions) &&
+            other.autofillValue == autofillValue &&
+            other.className == className &&
+            other.children.count() == children.count() &&
+            other.contentDescription == contentDescription &&
+            other.dataIsSensitive == dataIsSensitive &&
+            other.elevation == elevation &&
+            other.hint == hint &&
+            other.htmlInfo == htmlInfo &&
+            other.inputType == inputType &&
+            other.isEnabled == isEnabled &&
+            other.isCheckable == isCheckable &&
+            other.isChecked == isChecked &&
+            other.isClickable == isClickable &&
+            other.isContextClickable == isContextClickable &&
+            other.isAccessibilityFocused == isAccessibilityFocused &&
+            other.isFocused == isFocused &&
+            other.isLongClickable == isLongClickable &&
+            other.isOpaque == isOpaque &&
+            other.isFocusable == isFocusable &&
+            other.selected == selected &&
+            other.text == text &&
+            other.textLines.contentEquals(textLines) &&
+            other.transformation == transformation &&
+            other.visibility == visibility &&
+            other.webDomain == webDomain
 
     override fun hashCode() = super.hashCode()
 
@@ -199,93 +195,163 @@
 
     override fun hasExtras() = !extras.isEmpty
 
-    override fun setActivated(p0: Boolean) { activated = p0 }
+    override fun setActivated(p0: Boolean) {
+        activated = p0
+    }
 
-    override fun setAccessibilityFocused(p0: Boolean) { isAccessibilityFocused = p0 }
+    override fun setAccessibilityFocused(p0: Boolean) {
+        isAccessibilityFocused = p0
+    }
 
-    override fun setAlpha(p0: Float) { alpha = p0 }
+    override fun setAlpha(p0: Float) {
+        alpha = p0
+    }
 
-    override fun setAutofillOptions(p0: Array<CharSequence>?) { autofillOptions = p0 }
+    override fun setAutofillOptions(p0: Array<CharSequence>?) {
+        autofillOptions = p0
+    }
 
-    override fun setAutofillValue(p0: AutofillValue?) { autofillValue = p0 }
+    override fun setAutofillValue(p0: AutofillValue?) {
+        autofillValue = p0
+    }
 
-    override fun setCheckable(p0: Boolean) { isCheckable = p0 }
+    override fun setCheckable(p0: Boolean) {
+        isCheckable = p0
+    }
 
-    override fun setChecked(p0: Boolean) { isChecked = p0 }
+    override fun setChecked(p0: Boolean) {
+        isChecked = p0
+    }
 
-    override fun setClassName(p0: String?) { className = p0 }
+    override fun setClassName(p0: String?) {
+        className = p0
+    }
 
-    override fun setClickable(p0: Boolean) { isClickable = p0 }
+    override fun setClickable(p0: Boolean) {
+        isClickable = p0
+    }
 
-    override fun setContentDescription(p0: CharSequence?) { contentDescription = p0 }
+    override fun setContentDescription(p0: CharSequence?) {
+        contentDescription = p0
+    }
 
-    override fun setContextClickable(p0: Boolean) { isContextClickable = p0 }
+    override fun setContextClickable(p0: Boolean) {
+        isContextClickable = p0
+    }
 
-    override fun setDataIsSensitive(p0: Boolean) { dataIsSensitive = p0 }
+    override fun setDataIsSensitive(p0: Boolean) {
+        dataIsSensitive = p0
+    }
 
-    override fun setElevation(p0: Float) { elevation = p0 }
+    override fun setElevation(p0: Float) {
+        elevation = p0
+    }
 
-    override fun setEnabled(p0: Boolean) { isEnabled = p0 }
+    override fun setEnabled(p0: Boolean) {
+        isEnabled = p0
+    }
 
-    override fun setFocusable(p0: Boolean) { isFocusable = p0 }
+    override fun setFocusable(p0: Boolean) {
+        isFocusable = p0
+    }
 
-    override fun setFocused(p0: Boolean) { isFocused = p0 }
+    override fun setFocused(p0: Boolean) {
+        isFocused = p0
+    }
 
-    override fun setHtmlInfo(p0: HtmlInfo) { htmlInfo = p0 }
+    override fun setHtmlInfo(p0: HtmlInfo) {
+        htmlInfo = p0
+    }
 
-    override fun setHint(p0: CharSequence?) { hint = p0 }
+    override fun setHint(p0: CharSequence?) {
+        hint = p0
+    }
 
-    override fun setInputType(p0: Int) { inputType = p0 }
+    override fun setInputType(p0: Int) {
+        inputType = p0
+    }
 
-    override fun setLongClickable(p0: Boolean) { isLongClickable = p0 }
+    override fun setLongClickable(p0: Boolean) {
+        isLongClickable = p0
+    }
 
-    override fun setOpaque(p0: Boolean) { isOpaque = p0 }
+    override fun setOpaque(p0: Boolean) {
+        isOpaque = p0
+    }
 
-    override fun setSelected(p0: Boolean) { selected = p0 }
+    override fun setSelected(p0: Boolean) {
+        selected = p0
+    }
 
-    override fun setText(p0: CharSequence?) { p0?.let { text = it } }
+    override fun setText(p0: CharSequence?) {
+        p0?.let { text = it }
+    }
 
     override fun setText(p0: CharSequence?, p1: Int, p2: Int) {
         p0?.let { text = it.subSequence(p1, p2) }
     }
 
-    override fun setTextLines(p0: IntArray?, p1: IntArray?) { textLines = p0 }
+    override fun setTextLines(p0: IntArray?, p1: IntArray?) {
+        textLines = p0
+    }
 
-    override fun setTransformation(p0: Matrix?) { transformation = p0 }
+    override fun setTransformation(p0: Matrix?) {
+        transformation = p0
+    }
 
-    override fun setVisibility(p0: Int) { visibility = p0 }
+    override fun setVisibility(p0: Int) {
+        visibility = p0
+    }
 
-    override fun setWebDomain(p0: String?) { webDomain = p0 }
+    override fun setWebDomain(p0: String?) {
+        webDomain = p0
+    }
 
     // Unimplemented methods.
-    override fun asyncCommit() { TODO("not implemented") }
+    override fun asyncCommit() {
+        TODO("not implemented")
+    }
 
-    override fun asyncNewChild(p0: Int): ViewStructure { TODO("not implemented") }
+    override fun asyncNewChild(p0: Int): ViewStructure {
+        TODO("not implemented")
+    }
 
-    override fun getTextSelectionEnd(): Int { TODO("not implemented") }
+    override fun getTextSelectionEnd(): Int {
+        TODO("not implemented")
+    }
 
-    override fun getTextSelectionStart(): Int { TODO("not implemented") }
+    override fun getTextSelectionStart(): Int {
+        TODO("not implemented")
+    }
 
-    override fun newHtmlInfoBuilder(p0: String): HtmlInfo.Builder { TODO("not implemented") }
+    override fun newHtmlInfoBuilder(p0: String): HtmlInfo.Builder {
+        TODO("not implemented")
+    }
 
-    override fun setAutofillId(p0: AutofillId) { TODO("not implemented") }
+    override fun setAutofillId(p0: AutofillId) {
+        TODO("not implemented")
+    }
 
-    override fun setChildCount(p0: Int) { TODO("not implemented") }
+    override fun setChildCount(p0: Int) {
+        TODO("not implemented")
+    }
 
-    override fun setLocaleList(p0: LocaleList?) { TODO("not implemented") }
+    override fun setLocaleList(p0: LocaleList?) {
+        TODO("not implemented")
+    }
 
-    override fun setTextStyle(p0: Float, p1: Int, p2: Int, p3: Int) { TODO("not implemented") }
+    override fun setTextStyle(p0: Float, p1: Int, p2: Int, p3: Int) {
+        TODO("not implemented")
+    }
 }
 
-private fun Rect?.contentEquals(other: Rect?) = when {
-    (other == null && this == null) -> true
-    (other == null || this == null) -> false
-    else ->
-        other.left == left &&
-            other.right == right &&
-            other.bottom == bottom &&
-            other.top == top
-}
+private fun Rect?.contentEquals(other: Rect?) =
+    when {
+        (other == null && this == null) -> true
+        (other == null || this == null) -> false
+        else ->
+            other.left == left && other.right == right && other.bottom == bottom && other.top == top
+    }
 
 /** Obtains a parcel and then recycles it correctly whether an exception is thrown or not. */
 private fun useParcel(block: (Parcel) -> Unit) {
diff --git a/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/autofill/SemanticAutofillManagerTest.kt b/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/autofill/SemanticAutofillManagerTest.kt
index a7aec89..d7a3f71 100644
--- a/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/autofill/SemanticAutofillManagerTest.kt
+++ b/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/autofill/SemanticAutofillManagerTest.kt
@@ -56,8 +56,7 @@
 @RequiresApi(Build.VERSION_CODES.O)
 @RunWith(AndroidJUnit4::class)
 class SemanticAutofillManagerTest {
-    @get:Rule
-    val rule = createAndroidComposeRule<TestActivity>()
+    @get:Rule val rule = createAndroidComposeRule<TestActivity>()
 
     private lateinit var androidComposeView: AndroidComposeView
     private lateinit var composeView: View
@@ -76,18 +75,13 @@
 
         rule.setContentWithAutofillEnabled {
             Box(
-                Modifier
-                    .semantics {
-                        contentType = ContentType.Username
-                    }
+                Modifier.semantics { contentType = ContentType.Username }
                     .size(height, width)
                     .testTag(usernameTag)
             )
         }
 
-        rule.runOnIdle {
-            verifyNoMoreInteractions(autofillManagerMock)
-        }
+        rule.runOnIdle { verifyNoMoreInteractions(autofillManagerMock) }
     }
 
     @Test
@@ -99,8 +93,7 @@
 
         rule.setContentWithAutofillEnabled {
             Box(
-                Modifier
-                    .semantics {
+                Modifier.semantics {
                         contentType = ContentType.Username
                         contentDataType = ContentDataType.Text
                         editableText = AnnotatedString(if (changeText) "1234" else "****")
@@ -112,9 +105,7 @@
 
         rule.runOnIdle { changeText = true }
 
-        rule.runOnIdle {
-            verify(autofillManagerMock).notifyValueChanged(any(), any())
-        }
+        rule.runOnIdle { verify(autofillManagerMock).notifyValueChanged(any(), any()) }
     }
 
     @Test
@@ -126,8 +117,7 @@
 
         rule.setContentWithAutofillEnabled {
             Box(
-                Modifier
-                    .semantics {
+                Modifier.semantics {
                         contentType = ContentType.Username
                         contentDataType = ContentDataType.Text
                         focused = hasFocus
@@ -139,9 +129,7 @@
 
         rule.runOnIdle { hasFocus = true }
 
-        rule.runOnIdle {
-            verify(autofillManagerMock).notifyViewEntered(any(), any())
-        }
+        rule.runOnIdle { verify(autofillManagerMock).notifyViewEntered(any(), any()) }
     }
 
     @Test
@@ -154,25 +142,21 @@
         rule.setContentWithAutofillEnabled {
             Box(
                 modifier =
-                if (hasFocus)
-                    Modifier
-                        .semantics {
-                            contentType = ContentType.Username
-                            contentDataType = ContentDataType.Text
-                            focused = hasFocus
-                        }
-                        .size(height, width)
-                        .testTag(usernameTag)
-                else
-                    plainVisibleModifier(usernameTag)
+                    if (hasFocus)
+                        Modifier.semantics {
+                                contentType = ContentType.Username
+                                contentDataType = ContentDataType.Text
+                                focused = hasFocus
+                            }
+                            .size(height, width)
+                            .testTag(usernameTag)
+                    else plainVisibleModifier(usernameTag)
             )
         }
 
         rule.runOnIdle { hasFocus = true }
 
-        rule.runOnIdle {
-            verify(autofillManagerMock).notifyViewEntered(any(), any())
-        }
+        rule.runOnIdle { verify(autofillManagerMock).notifyViewEntered(any(), any()) }
     }
 
     @Test
@@ -184,8 +168,7 @@
 
         rule.setContentWithAutofillEnabled {
             Box(
-                Modifier
-                    .semantics {
+                Modifier.semantics {
                         contentType = ContentType.Username
                         contentDataType = ContentDataType.Text
                         focused = hasFocus
@@ -197,9 +180,7 @@
 
         rule.runOnIdle { hasFocus = false }
 
-        rule.runOnIdle {
-            verify(autofillManagerMock).notifyViewExited(any())
-        }
+        rule.runOnIdle { verify(autofillManagerMock).notifyViewExited(any()) }
     }
 
     @Test
@@ -212,17 +193,14 @@
         rule.setContentWithAutofillEnabled {
             Box(
                 modifier =
-                if (isVisible) plainVisibleModifier(usernameTag) else invisibleModifier(usernameTag)
+                    if (isVisible) plainVisibleModifier(usernameTag)
+                    else invisibleModifier(usernameTag)
             )
         }
 
-        rule.runOnIdle {
-            isVisible = false
-        }
+        rule.runOnIdle { isVisible = false }
 
-        rule.runOnIdle {
-            verify(autofillManagerMock).notifyViewVisibilityChanged(any(), any())
-        }
+        rule.runOnIdle { verify(autofillManagerMock).notifyViewVisibilityChanged(any(), any()) }
     }
 
     @Test
@@ -235,17 +213,14 @@
         rule.setContentWithAutofillEnabled {
             Box(
                 modifier =
-                if (isVisible) plainVisibleModifier(usernameTag) else invisibleModifier(usernameTag)
+                    if (isVisible) plainVisibleModifier(usernameTag)
+                    else invisibleModifier(usernameTag)
             )
         }
 
-        rule.runOnIdle {
-            isVisible = true
-        }
+        rule.runOnIdle { isVisible = true }
 
-        rule.runOnIdle {
-            verify(autofillManagerMock).notifyViewVisibilityChanged(any(), any())
-        }
+        rule.runOnIdle { verify(autofillManagerMock).notifyViewVisibilityChanged(any(), any()) }
     }
 
     // ============================================================================================
@@ -253,8 +228,7 @@
     // ============================================================================================
 
     private fun plainVisibleModifier(testTag: String): Modifier {
-        return Modifier
-            .semantics {
+        return Modifier.semantics {
                 contentType = ContentType.Username
                 contentDataType = ContentDataType.Text
             }
@@ -264,8 +238,7 @@
 
     @OptIn(ExperimentalComposeUiApi::class)
     private fun invisibleModifier(testTag: String): Modifier {
-        return Modifier
-            .semantics {
+        return Modifier.semantics {
                 contentType = ContentType.Username
                 contentDataType = ContentDataType.Text
                 invisibleToUser()
diff --git a/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/contentcapture/ContentCaptureTest.kt b/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/contentcapture/ContentCaptureTest.kt
index 10940f9..93dbf05 100644
--- a/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/contentcapture/ContentCaptureTest.kt
+++ b/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/contentcapture/ContentCaptureTest.kt
@@ -1,4 +1,3 @@
-
 /*
  * Copyright 2024 The Android Open Source Project
  *
@@ -79,8 +78,7 @@
 @SdkSuppress(minSdkVersion = 31)
 @RunWith(AndroidJUnit4::class)
 class ContentCaptureTest {
-    @get:Rule
-    val rule = createAndroidComposeRule<TestActivity>()
+    @get:Rule val rule = createAndroidComposeRule<TestActivity>()
 
     private val tag = "tag"
     private lateinit var androidComposeView: AndroidComposeView
@@ -133,25 +131,15 @@
         var appeared by mutableStateOf(false)
         rule.mainClock.autoAdvance = false
         rule.setContentWithContentCaptureEnabled {
-            Row(
-                Modifier
-                    .size(100.dp)
-                    .semantics {}
-            ) {
+            Row(Modifier.size(100.dp).semantics {}) {
                 if (appeared) {
                     Box(
-                        Modifier
-                            .size(10.dp)
-                            .semantics {
-                                text = AnnotatedString("foo")
-                                testTag = "testTagFoo"
-                            }
+                        Modifier.size(10.dp).semantics {
+                            text = AnnotatedString("foo")
+                            testTag = "testTagFoo"
+                        }
                     )
-                    Box(
-                        Modifier
-                            .size(10.dp)
-                            .semantics { text = AnnotatedString("bar") }
-                    )
+                    Box(Modifier.size(10.dp).semantics { text = AnnotatedString("bar") })
                 }
             }
         }
@@ -193,21 +181,9 @@
         rule.mainClock.autoAdvance = false
         rule.setContentWithContentCaptureEnabled {
             if (!disappeared) {
-                Row(
-                    Modifier
-                        .size(100.dp)
-                        .semantics { }
-                ) {
-                    Box(
-                        Modifier
-                            .size(10.dp)
-                            .semantics { }
-                    )
-                    Box(
-                        Modifier
-                            .size(10.dp)
-                            .semantics { }
-                    )
+                Row(Modifier.size(100.dp).semantics {}) {
+                    Box(Modifier.size(10.dp).semantics {})
+                    Box(Modifier.size(10.dp).semantics {})
                 }
             }
         }
@@ -241,21 +217,9 @@
         rule.mainClock.autoAdvance = false
         rule.setContentWithContentCaptureEnabled {
             if (appeared) {
-                Row(
-                    Modifier
-                        .size(100.dp)
-                        .semantics { }
-                ) {
-                    Box(
-                        Modifier
-                            .size(10.dp)
-                            .semantics { }
-                    )
-                    Box(
-                        Modifier
-                            .size(10.dp)
-                            .semantics { }
-                    )
+                Row(Modifier.size(100.dp).semantics {}) {
+                    Box(Modifier.size(10.dp).semantics {})
+                    Box(Modifier.size(10.dp).semantics {})
                 }
             }
         }
@@ -300,17 +264,9 @@
 
         rule.mainClock.autoAdvance = false
         rule.setContentWithContentCaptureEnabled {
-            Box(
-                Modifier
-                    .size(10.dp)
-                    .semantics { }
-            ) {
+            Box(Modifier.size(10.dp).semantics {}) {
                 if (appeared) {
-                    Box(
-                        Modifier
-                            .size(10.dp)
-                            .semantics { }
-                    )
+                    Box(Modifier.size(10.dp).semantics {})
                 }
             }
         }
@@ -360,23 +316,17 @@
 
         rule.mainClock.autoAdvance = false
         rule.setContentWithContentCaptureEnabled {
-            Box(
-                Modifier
-                    .size(10.dp)
-                    .semantics { }
-            ) {
+            Box(Modifier.size(10.dp).semantics {}) {
                 if (appeared) {
                     Box(
-                        Modifier
-                            .size(10.dp)
-                            .semantics {
-                                text = AnnotatedString("foo")
-                                isShowingTextSubstitution = true
-                                showTextSubstitution {
-                                    result = it
-                                    true
-                                }
+                        Modifier.size(10.dp).semantics {
+                            text = AnnotatedString("foo")
+                            isShowingTextSubstitution = true
+                            showTextSubstitution {
+                                result = it
+                                true
                             }
+                        }
                     )
                 }
             }
@@ -400,23 +350,17 @@
 
         rule.mainClock.autoAdvance = false
         rule.setContentWithContentCaptureEnabled {
-            Box(
-                Modifier
-                    .size(10.dp)
-                    .semantics { }
-            ) {
+            Box(Modifier.size(10.dp).semantics {}) {
                 if (appeared) {
                     Box(
-                        Modifier
-                            .size(10.dp)
-                            .semantics {
-                                text = AnnotatedString("foo")
-                                isShowingTextSubstitution = false
-                                showTextSubstitution {
-                                    result = it
-                                    true
-                                }
+                        Modifier.size(10.dp).semantics {
+                            text = AnnotatedString("foo")
+                            isShowingTextSubstitution = false
+                            showTextSubstitution {
+                                result = it
+                                true
                             }
+                        }
                     )
                 }
             }
@@ -437,18 +381,12 @@
         // Arrange.
         rule.mainClock.autoAdvance = false
         rule.setContentWithContentCaptureEnabled {
-            Box(
-                Modifier
-                    .size(10.dp)
-                    .semantics { text = AnnotatedString("bar") }
-            ) {
+            Box(Modifier.size(10.dp).semantics { text = AnnotatedString("bar") }) {
                 Box(
-                    Modifier
-                        .size(10.dp)
-                        .semantics {
-                            testTag = tag
-                            text = AnnotatedString("foo")
-                        }
+                    Modifier.size(10.dp).semantics {
+                        testTag = tag
+                        text = AnnotatedString("foo")
+                    }
                 )
             }
         }
@@ -470,12 +408,18 @@
         rule.runOnIdle {
             with(argumentCaptor<ViewTranslationRequest>()) {
                 verify(requestsCollector).accept(capture())
-                assertThat(firstValue).isEqualTo(
-                    ViewTranslationRequest
-                        .Builder(androidComposeView.autofillId, virtualViewId.toLong())
-                        .setValue(ID_TEXT, TranslationRequestValue.forText(AnnotatedString("foo")))
-                        .build()
-                )
+                assertThat(firstValue)
+                    .isEqualTo(
+                        ViewTranslationRequest.Builder(
+                                androidComposeView.autofillId,
+                                virtualViewId.toLong()
+                            )
+                            .setValue(
+                                ID_TEXT,
+                                TranslationRequestValue.forText(AnnotatedString("foo"))
+                            )
+                            .build()
+                    )
             }
         }
     }
@@ -487,22 +431,16 @@
         var result: AnnotatedString? = null
         rule.mainClock.autoAdvance = false
         rule.setContentWithContentCaptureEnabled {
-            Box(
-                Modifier
-                    .size(10.dp)
-                    .semantics { text = AnnotatedString("bar") }
-            ) {
+            Box(Modifier.size(10.dp).semantics { text = AnnotatedString("bar") }) {
                 Box(
-                    Modifier
-                        .size(10.dp)
-                        .semantics {
-                            testTag = tag
-                            text = AnnotatedString("foo")
-                            setTextSubstitution {
-                                result = it
-                                true
-                            }
+                    Modifier.size(10.dp).semantics {
+                        testTag = tag
+                        text = AnnotatedString("foo")
+                        setTextSubstitution {
+                            result = it
+                            true
                         }
+                    }
                 )
             }
         }
@@ -514,8 +452,7 @@
                 LongSparseArray<ViewTranslationResponse?>().apply {
                     append(
                         virtualViewId.toLong(),
-                        ViewTranslationResponse
-                            .Builder(androidComposeView.autofillId)
+                        ViewTranslationResponse.Builder(androidComposeView.autofillId)
                             .setValue(
                                 ID_TEXT,
                                 TranslationResponseValue.Builder(0).setText("bar").build()
@@ -537,22 +474,16 @@
         var result = false
         rule.mainClock.autoAdvance = false
         rule.setContentWithContentCaptureEnabled {
-            Box(
-                Modifier
-                    .size(10.dp)
-                    .semantics { text = AnnotatedString("bar") }
-            ) {
+            Box(Modifier.size(10.dp).semantics { text = AnnotatedString("bar") }) {
                 Box(
-                    Modifier
-                        .size(10.dp)
-                        .semantics {
-                            textSubstitution = AnnotatedString("foo")
-                            isShowingTextSubstitution = false
-                            showTextSubstitution {
-                                result = it
-                                true
-                            }
+                    Modifier.size(10.dp).semantics {
+                        textSubstitution = AnnotatedString("foo")
+                        isShowingTextSubstitution = false
+                        showTextSubstitution {
+                            result = it
+                            true
                         }
+                    }
                 )
             }
         }
@@ -571,23 +502,17 @@
         var result = true
         rule.mainClock.autoAdvance = false
         rule.setContentWithContentCaptureEnabled {
-            Box(
-                Modifier
-                    .size(10.dp)
-                    .semantics { text = AnnotatedString("bar") }
-            ) {
+            Box(Modifier.size(10.dp).semantics { text = AnnotatedString("bar") }) {
                 Box(
-                    Modifier
-                        .size(10.dp)
-                        .semantics {
-                            text = AnnotatedString("bar")
-                            textSubstitution = AnnotatedString("foo")
-                            isShowingTextSubstitution = true
-                            showTextSubstitution {
-                                result = it
-                                true
-                            }
+                    Modifier.size(10.dp).semantics {
+                        text = AnnotatedString("bar")
+                        textSubstitution = AnnotatedString("foo")
+                        isShowingTextSubstitution = true
+                        showTextSubstitution {
+                            result = it
+                            true
                         }
+                    }
                 )
             }
         }
@@ -605,22 +530,16 @@
         var result = false
         rule.mainClock.autoAdvance = false
         rule.setContentWithContentCaptureEnabled {
-            Box(
-                Modifier
-                    .size(10.dp)
-                    .semantics { text = AnnotatedString("bar") }
-            ) {
+            Box(Modifier.size(10.dp).semantics { text = AnnotatedString("bar") }) {
                 Box(
-                    Modifier
-                        .size(10.dp)
-                        .semantics {
-                            text = AnnotatedString("bar")
-                            isShowingTextSubstitution = true
-                            clearTextSubstitution {
-                                result = true
-                                true
-                            }
+                    Modifier.size(10.dp).semantics {
+                        text = AnnotatedString("bar")
+                        isShowingTextSubstitution = true
+                        clearTextSubstitution {
+                            result = true
+                            true
                         }
+                    }
                 )
             }
         }
@@ -643,16 +562,16 @@
 
         whenever(contentCaptureSessionCompat.newVirtualViewStructure(any(), any()))
             .thenReturn(viewStructureCompat)
-        whenever(viewStructureCompat.toViewStructure())
-            .thenReturn(viewStructure)
+        whenever(viewStructureCompat.toViewStructure()).thenReturn(viewStructure)
 
         // TODO(mnuzen): provideContentCaptureManager as a compositionLocal so that instead of
         //  casting view and getting ContentCaptureManager, retrieve it via
         //  `LocalContentCaptureManager.current`
         setContent {
             androidComposeView = LocalView.current as AndroidComposeView
-            androidComposeView.contentCaptureManager.onContentCaptureSession =
-                { contentCaptureSessionCompat }
+            androidComposeView.contentCaptureManager.onContentCaptureSession = {
+                contentCaptureSessionCompat
+            }
 
             whenever(contentCaptureSessionCompat.newAutofillId(any())).thenAnswer {
                 androidComposeView.autofillId
@@ -673,5 +592,6 @@
     }
 
     // TODO(b/272068594): Add api to fetch the semantics id from SemanticsNodeInteraction directly.
-    private val SemanticsNodeInteraction.semanticsId: Int get() = fetchSemanticsNode().id
+    private val SemanticsNodeInteraction.semanticsId: Int
+        get() = fetchSemanticsNode().id
 }
diff --git a/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/draganddrop/AndroidDragAndDropTest.kt b/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/draganddrop/AndroidDragAndDropTest.kt
index b0325c8..c563826 100644
--- a/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/draganddrop/AndroidDragAndDropTest.kt
+++ b/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/draganddrop/AndroidDragAndDropTest.kt
@@ -62,9 +62,7 @@
 
     @Suppress("DEPRECATION")
     @get:Rule
-    val rule = androidx.test.rule.ActivityTestRule(
-        TestActivity::class.java
-    )
+    val rule = androidx.test.rule.ActivityTestRule(TestActivity::class.java)
 
     private lateinit var container: OpenComposeView
 
@@ -81,49 +79,30 @@
     /**
      * Sets up a grid of drop targets resembling the following for testing:
      *
-     *    accepts                 accepts
-     * ┌───────────┐           ┌───────────┐
-     * │           │           │           │
-     * │           │           │           │
-     * │           │           │           │
-     * └───────────┘           └───────────┘
+     * accepts accepts ┌───────────┐ ┌───────────┐ │ │ │ │ │ │ │ │ │ │ │ │ └───────────┘
+     * └───────────┘
      *
-     *    accepts                 rejects
-     * ┌───────────┐  accepts  ┌───────────┐
-     * │  accepts  │  ┌─────┐  │  accepts  │
-     * │─────┐     │  │     │  │     ┌─────│
-     * │     │     │  └─────┘  │     │     │
-     * └─────┘─────┘           └─────└─────┘
+     * accepts rejects ┌───────────┐ accepts ┌───────────┐ │ accepts │ ┌─────┐ │ accepts │ │─────┐ │
+     * │ │ │ ┌─────│ │ │ │ └─────┘ │ │ │ └─────┘─────┘ └─────└─────┘
      *
-     * parent <------> child
-     *         offset
+     * parent <------> child offset
      */
     @Before
     fun setup() {
         val activity = rule.activity
         container = spy(OpenComposeView(activity))
 
-        acceptingTopStartDropTarget = DropTargetModifierHolder(
-            acceptsDragAndDrop = { true }
-        )
-        acceptingTopEndDropTarget = DropTargetModifierHolder(
-            acceptsDragAndDrop = { true }
-        )
-        acceptingParentBottomStartDropTarget = DropTargetModifierHolder(
-            acceptsDragAndDrop = { true }
-        )
-        acceptingInnerBottomStartDropTarget = DropTargetModifierHolder(
-            acceptsDragAndDrop = { true }
-        )
-        rejectingParentBottomEndDropTarget = DropTargetModifierHolder(
-            acceptsDragAndDrop = { false }
-        )
-        acceptingInnerBottomEndDropTarget = DropTargetModifierHolder(
-            acceptsDragAndDrop = { true }
-        )
-        acceptingOffsetInnerBottomStartDropTarget = DropTargetModifierHolder(
-            acceptsDragAndDrop = { true }
-        )
+        acceptingTopStartDropTarget = DropTargetModifierHolder(acceptsDragAndDrop = { true })
+        acceptingTopEndDropTarget = DropTargetModifierHolder(acceptsDragAndDrop = { true })
+        acceptingParentBottomStartDropTarget =
+            DropTargetModifierHolder(acceptsDragAndDrop = { true })
+        acceptingInnerBottomStartDropTarget =
+            DropTargetModifierHolder(acceptsDragAndDrop = { true })
+        rejectingParentBottomEndDropTarget =
+            DropTargetModifierHolder(acceptsDragAndDrop = { false })
+        acceptingInnerBottomEndDropTarget = DropTargetModifierHolder(acceptsDragAndDrop = { true })
+        acceptingOffsetInnerBottomStartDropTarget =
+            DropTargetModifierHolder(acceptsDragAndDrop = { true })
 
         rule.runOnUiThread {
             activity.setContentView(
@@ -139,56 +118,56 @@
                 container.setContent {
                     density = LocalDensity.current
                     Box(
-                        modifier = Modifier
-                            .requiredSize(ContainerSize)
-                            .onGloballyPositioned { latch.countDown() }
-
+                        modifier =
+                            Modifier.requiredSize(ContainerSize).onGloballyPositioned {
+                                latch.countDown()
+                            }
                     ) {
                         Box(
-                            modifier = Modifier
-                                .requiredSize(ParentSize)
-                                .align(Alignment.TopStart)
-                                .testDropTarget(acceptingTopStartDropTarget)
+                            modifier =
+                                Modifier.requiredSize(ParentSize)
+                                    .align(Alignment.TopStart)
+                                    .testDropTarget(acceptingTopStartDropTarget)
                         )
                         Box(
-                            modifier = Modifier
-                                .requiredSize(ParentSize)
-                                .align(Alignment.TopEnd)
-                                .testDropTarget(acceptingTopEndDropTarget)
+                            modifier =
+                                Modifier.requiredSize(ParentSize)
+                                    .align(Alignment.TopEnd)
+                                    .testDropTarget(acceptingTopEndDropTarget)
                         )
                         Box(
-                            modifier = Modifier
-                                .requiredSize(ParentSize)
-                                .align(Alignment.BottomStart)
-                                .testDropTarget(acceptingParentBottomStartDropTarget)
+                            modifier =
+                                Modifier.requiredSize(ParentSize)
+                                    .align(Alignment.BottomStart)
+                                    .testDropTarget(acceptingParentBottomStartDropTarget)
                         ) {
                             Box(
-                                modifier = Modifier
-                                    .requiredSize(ChildSize)
-                                    .align(Alignment.BottomStart)
-                                    .testDropTarget(acceptingInnerBottomStartDropTarget)
+                                modifier =
+                                    Modifier.requiredSize(ChildSize)
+                                        .align(Alignment.BottomStart)
+                                        .testDropTarget(acceptingInnerBottomStartDropTarget)
                             )
                             Box(
-                                modifier = Modifier
-                                    .offset(
-                                        x = HalfContainerSize - HalfChildSize,
-                                        y = (HalfParentSize - HalfChildSize)
-                                    )
-                                    .requiredSize(ChildSize)
-                                    .testDropTarget(acceptingOffsetInnerBottomStartDropTarget)
+                                modifier =
+                                    Modifier.offset(
+                                            x = HalfContainerSize - HalfChildSize,
+                                            y = (HalfParentSize - HalfChildSize)
+                                        )
+                                        .requiredSize(ChildSize)
+                                        .testDropTarget(acceptingOffsetInnerBottomStartDropTarget)
                             )
                         }
                         Box(
-                            modifier = Modifier
-                                .requiredSize(ParentSize)
-                                .align(Alignment.BottomEnd)
-                                .testDropTarget(rejectingParentBottomEndDropTarget)
+                            modifier =
+                                Modifier.requiredSize(ParentSize)
+                                    .align(Alignment.BottomEnd)
+                                    .testDropTarget(rejectingParentBottomEndDropTarget)
                         ) {
                             Box(
-                                modifier = Modifier
-                                    .requiredSize(ChildSize)
-                                    .align(Alignment.BottomEnd)
-                                    .testDropTarget(acceptingInnerBottomEndDropTarget)
+                                modifier =
+                                    Modifier.requiredSize(ChildSize)
+                                        .align(Alignment.BottomEnd)
+                                        .testDropTarget(acceptingInnerBottomEndDropTarget)
                             )
                         }
                     }
@@ -200,11 +179,12 @@
     @Test
     fun dispatchDragEvent_callsStartOnAllDragAndDropTargetsOn_ACTION_DRAG_STARTED() {
         rule.runOnUiThread {
-            val dragEvent = DragEvent(
-                action = DragEvent.ACTION_DRAG_STARTED,
-                x = 0f,
-                y = 0f,
-            )
+            val dragEvent =
+                DragEvent(
+                    action = DragEvent.ACTION_DRAG_STARTED,
+                    x = 0f,
+                    y = 0f,
+                )
 
             val androidComposeView = findAndroidComposeView(container)!!
             // Act
@@ -216,23 +196,19 @@
             // The following modifiers should have all seen the start event
             Truth.assertThat(acceptingTopStartDropTarget.startOffsets.first())
                 .isEqualTo(dragEvent.offset())
-            Truth.assertThat(acceptingTopStartDropTarget.startOffsets.size)
-                .isEqualTo(1)
+            Truth.assertThat(acceptingTopStartDropTarget.startOffsets.size).isEqualTo(1)
 
             Truth.assertThat(acceptingTopEndDropTarget.startOffsets.first())
                 .isEqualTo(dragEvent.offset())
-            Truth.assertThat(acceptingTopEndDropTarget.startOffsets.size)
-                .isEqualTo(1)
+            Truth.assertThat(acceptingTopEndDropTarget.startOffsets.size).isEqualTo(1)
 
             Truth.assertThat(acceptingParentBottomStartDropTarget.startOffsets.first())
                 .isEqualTo(dragEvent.offset())
-            Truth.assertThat(acceptingParentBottomStartDropTarget.startOffsets.size)
-                .isEqualTo(1)
+            Truth.assertThat(acceptingParentBottomStartDropTarget.startOffsets.size).isEqualTo(1)
 
             Truth.assertThat(acceptingInnerBottomStartDropTarget.startOffsets.first())
                 .isEqualTo(dragEvent.offset())
-            Truth.assertThat(acceptingInnerBottomStartDropTarget.startOffsets.size)
-                .isEqualTo(1)
+            Truth.assertThat(acceptingInnerBottomStartDropTarget.startOffsets.size).isEqualTo(1)
 
             Truth.assertThat(acceptingOffsetInnerBottomStartDropTarget.startOffsets.first())
                 .isEqualTo(dragEvent.offset())
@@ -241,8 +217,7 @@
 
             Truth.assertThat(acceptingInnerBottomEndDropTarget.startOffsets.first())
                 .isEqualTo(dragEvent.offset())
-            Truth.assertThat(acceptingInnerBottomEndDropTarget.startOffsets.size)
-                .isEqualTo(1)
+            Truth.assertThat(acceptingInnerBottomEndDropTarget.startOffsets.size).isEqualTo(1)
 
             // Rejected drag and drop, it should have no start offset
             Truth.assertThat(rejectingParentBottomEndDropTarget.startOffsets.isEmpty())
@@ -253,32 +228,33 @@
     @Test
     fun dispatchDragEvent_canEnterThenMoveWithinAndExitWhenDraggedAcross() {
         rule.runOnUiThread {
-            val events = listOf(
-                // Start in the center
-                DragEvent(
-                    action = DragEvent.ACTION_DRAG_STARTED,
-                    x = with(density) { HalfContainerSize.toPx() },
-                    y = with(density) { HalfContainerSize.toPx() },
-                ),
-                // Move to the top start
-                DragEvent(
-                    action = DragEvent.ACTION_DRAG_LOCATION,
-                    x = 0f,
-                    y = 0f,
-                ),
-                // Move across the top start
-                DragEvent(
-                    action = DragEvent.ACTION_DRAG_LOCATION,
-                    x = with(density) { HalfParentSize.toPx() },
-                    y = 0f,
-                ),
-                // Exit the top start
-                DragEvent(
-                    action = DragEvent.ACTION_DRAG_LOCATION,
-                    x = with(density) { (ParentSize + ChildSize).toPx() },
-                    y = 0f,
+            val events =
+                listOf(
+                    // Start in the center
+                    DragEvent(
+                        action = DragEvent.ACTION_DRAG_STARTED,
+                        x = with(density) { HalfContainerSize.toPx() },
+                        y = with(density) { HalfContainerSize.toPx() },
+                    ),
+                    // Move to the top start
+                    DragEvent(
+                        action = DragEvent.ACTION_DRAG_LOCATION,
+                        x = 0f,
+                        y = 0f,
+                    ),
+                    // Move across the top start
+                    DragEvent(
+                        action = DragEvent.ACTION_DRAG_LOCATION,
+                        x = with(density) { HalfParentSize.toPx() },
+                        y = 0f,
+                    ),
+                    // Exit the top start
+                    DragEvent(
+                        action = DragEvent.ACTION_DRAG_LOCATION,
+                        x = with(density) { (ParentSize + ChildSize).toPx() },
+                        y = 0f,
+                    )
                 )
-            )
             val (initialEvent, moveStartEvent, moveEndEvent, exitEvent) = events
 
             val androidComposeView = findAndroidComposeView(container)!!
@@ -307,20 +283,21 @@
     @Test
     fun dispatchDragEvent_ignoresRejectingParentDropTargetButReachesInnerChild() {
         rule.runOnUiThread {
-            val events = listOf(
-                // Start in the center
-                DragEvent(
-                    action = DragEvent.ACTION_DRAG_STARTED,
-                    x = with(density) { HalfContainerSize.toPx() },
-                    y = with(density) { HalfContainerSize.toPx() },
-                ),
-                // Move into bottom end
-                DragEvent(
-                    action = DragEvent.ACTION_DRAG_LOCATION,
-                    x = with(density) { (ContainerSize - HalfChildSize).toPx() },
-                    y = with(density) { (ContainerSize - HalfChildSize).toPx() },
-                ),
-            )
+            val events =
+                listOf(
+                    // Start in the center
+                    DragEvent(
+                        action = DragEvent.ACTION_DRAG_STARTED,
+                        x = with(density) { HalfContainerSize.toPx() },
+                        y = with(density) { HalfContainerSize.toPx() },
+                    ),
+                    // Move into bottom end
+                    DragEvent(
+                        action = DragEvent.ACTION_DRAG_LOCATION,
+                        x = with(density) { (ContainerSize - HalfChildSize).toPx() },
+                        y = with(density) { (ContainerSize - HalfChildSize).toPx() },
+                    ),
+                )
 
             val (initialEvent, moveEvent) = events
 
@@ -355,20 +332,21 @@
     @Test
     fun dispatchDragEvent_reachesInnerDropTargetOffsetOutsideImmediateParent() {
         rule.runOnUiThread {
-            val events = listOf(
-                // Start in the center
-                DragEvent(
-                    action = DragEvent.ACTION_DRAG_STARTED,
-                    x = with(density) { HalfContainerSize.toPx() },
-                    y = with(density) { HalfContainerSize.toPx() },
-                ),
-                // Move into bottom center where offset child is
-                DragEvent(
-                    action = DragEvent.ACTION_DRAG_LOCATION,
-                    x = with(density) { HalfContainerSize.toPx() },
-                    y = with(density) { (ContainerSize - HalfParentSize).toPx() },
-                ),
-            )
+            val events =
+                listOf(
+                    // Start in the center
+                    DragEvent(
+                        action = DragEvent.ACTION_DRAG_STARTED,
+                        x = with(density) { HalfContainerSize.toPx() },
+                        y = with(density) { HalfContainerSize.toPx() },
+                    ),
+                    // Move into bottom center where offset child is
+                    DragEvent(
+                        action = DragEvent.ACTION_DRAG_LOCATION,
+                        x = with(density) { HalfContainerSize.toPx() },
+                        y = with(density) { (ContainerSize - HalfParentSize).toPx() },
+                    ),
+                )
 
             val (initialEvent, moveEvent) = events
 
@@ -388,26 +366,27 @@
     @Test
     fun dispatchDragEvent_canMoveBetweenTargets() {
         rule.runOnUiThread {
-            val events = listOf(
-                // Start in the center
-                DragEvent(
-                    action = DragEvent.ACTION_DRAG_STARTED,
-                    x = with(density) { HalfContainerSize.toPx() },
-                    y = with(density) { HalfContainerSize.toPx() },
-                ),
-                // Move across the top start
-                DragEvent(
-                    action = DragEvent.ACTION_DRAG_LOCATION,
-                    x = 0f,
-                    y = 0f,
-                ),
-                // Exit the top start and into the top right
-                DragEvent(
-                    action = DragEvent.ACTION_DRAG_LOCATION,
-                    x = with(density) { ContainerSize.toPx() - ParentSize.toPx() },
-                    y = 0f,
+            val events =
+                listOf(
+                    // Start in the center
+                    DragEvent(
+                        action = DragEvent.ACTION_DRAG_STARTED,
+                        x = with(density) { HalfContainerSize.toPx() },
+                        y = with(density) { HalfContainerSize.toPx() },
+                    ),
+                    // Move across the top start
+                    DragEvent(
+                        action = DragEvent.ACTION_DRAG_LOCATION,
+                        x = 0f,
+                        y = 0f,
+                    ),
+                    // Exit the top start and into the top right
+                    DragEvent(
+                        action = DragEvent.ACTION_DRAG_LOCATION,
+                        x = with(density) { ContainerSize.toPx() - ParentSize.toPx() },
+                        y = 0f,
+                    )
                 )
-            )
 
             val (initialEvent, farStartEvent, startToEndEvent) = events
 
@@ -436,72 +415,67 @@
     fun dispatchDragEvent_callsEnterEventsBeforeExitEvents() {
         rule.runOnUiThread {
             val calls = mutableListOf<String>()
-            acceptingParentBottomStartDropTarget.onEntered = {
-                calls += "enter-parent"
-            }
-            acceptingParentBottomStartDropTarget.onExited = {
-                calls += "exit-parent"
-            }
-            acceptingInnerBottomStartDropTarget.onEntered = {
-                calls += "enter-child"
-            }
-            acceptingInnerBottomStartDropTarget.onExited = {
-                calls += "exit-child"
-            }
+            acceptingParentBottomStartDropTarget.onEntered = { calls += "enter-parent" }
+            acceptingParentBottomStartDropTarget.onExited = { calls += "exit-parent" }
+            acceptingInnerBottomStartDropTarget.onEntered = { calls += "enter-child" }
+            acceptingInnerBottomStartDropTarget.onExited = { calls += "exit-child" }
 
-            val events = listOf(
-                // Start in the center
-                DragEvent(
-                    action = DragEvent.ACTION_DRAG_STARTED,
-                    x = with(density) { HalfContainerSize.toPx() },
-                    y = with(density) { HalfContainerSize.toPx() },
-                ),
-                // Move into bottom start parent
-                DragEvent(
-                    action = DragEvent.ACTION_DRAG_LOCATION,
-                    x = with(density) { HalfChildSize.toPx() },
-                    y = with(density) {
-                        (ContainerSize - ChildSize - HalfChildSize).toPx()
-                    },
-                ),
-                // Move into bottom start inner child
-                DragEvent(
-                    action = DragEvent.ACTION_DRAG_LOCATION,
-                    x = with(density) { HalfChildSize.toPx() },
-                    y = with(density) { (ContainerSize - HalfChildSize).toPx() },
+            val events =
+                listOf(
+                    // Start in the center
+                    DragEvent(
+                        action = DragEvent.ACTION_DRAG_STARTED,
+                        x = with(density) { HalfContainerSize.toPx() },
+                        y = with(density) { HalfContainerSize.toPx() },
+                    ),
+                    // Move into bottom start parent
+                    DragEvent(
+                        action = DragEvent.ACTION_DRAG_LOCATION,
+                        x = with(density) { HalfChildSize.toPx() },
+                        y = with(density) { (ContainerSize - ChildSize - HalfChildSize).toPx() },
+                    ),
+                    // Move into bottom start inner child
+                    DragEvent(
+                        action = DragEvent.ACTION_DRAG_LOCATION,
+                        x = with(density) { HalfChildSize.toPx() },
+                        y = with(density) { (ContainerSize - HalfChildSize).toPx() },
+                    )
                 )
-            )
 
             val androidComposeView = findAndroidComposeView(container)!!
             events.forEach(androidComposeView::dispatchDragEvent)
 
             // Assertions
-            Truth.assertThat(calls).isEqualTo(listOf(
-                "enter-parent",
-                // important bit is enter child is received before exit parent.
-                "enter-child",
-                "exit-parent"
-            ))
+            Truth.assertThat(calls)
+                .isEqualTo(
+                    listOf(
+                        "enter-parent",
+                        // important bit is enter child is received before exit parent.
+                        "enter-child",
+                        "exit-parent"
+                    )
+                )
         }
     }
 
     @Test
     fun dispatchDragEvent_multicasts_ACTION_DRAG_ENDED() {
         rule.runOnUiThread {
-            val events = listOf(
-                // Start in the center
-                DragEvent(
-                    action = DragEvent.ACTION_DRAG_STARTED,
-                    x = with(density) { HalfContainerSize.toPx() },
-                    y = with(density) { HalfContainerSize.toPx() },
-                ),
-                // End in the center
-                DragEvent(
-                    action = DragEvent.ACTION_DRAG_ENDED,
-                    x = with(density) { HalfContainerSize.toPx() },
-                    y = with(density) { HalfContainerSize.toPx() },
-                ),
-            )
+            val events =
+                listOf(
+                    // Start in the center
+                    DragEvent(
+                        action = DragEvent.ACTION_DRAG_STARTED,
+                        x = with(density) { HalfContainerSize.toPx() },
+                        y = with(density) { HalfContainerSize.toPx() },
+                    ),
+                    // End in the center
+                    DragEvent(
+                        action = DragEvent.ACTION_DRAG_ENDED,
+                        x = with(density) { HalfContainerSize.toPx() },
+                        y = with(density) { HalfContainerSize.toPx() },
+                    ),
+                )
 
             val (initialEvent, endEvent) = events
 
@@ -513,37 +487,29 @@
                 .isEqualTo(initialEvent.offset())
             Truth.assertThat(acceptingTopStartDropTarget.endedOffsets.first())
                 .isEqualTo(endEvent.offset())
-            Truth.assertThat(acceptingTopStartDropTarget.startOffsets.size)
-                .isEqualTo(1)
-            Truth.assertThat(acceptingTopStartDropTarget.endedOffsets.size)
-                .isEqualTo(1)
+            Truth.assertThat(acceptingTopStartDropTarget.startOffsets.size).isEqualTo(1)
+            Truth.assertThat(acceptingTopStartDropTarget.endedOffsets.size).isEqualTo(1)
 
             Truth.assertThat(acceptingTopEndDropTarget.startOffsets.first())
                 .isEqualTo(initialEvent.offset())
             Truth.assertThat(acceptingTopEndDropTarget.endedOffsets.first())
                 .isEqualTo(endEvent.offset())
-            Truth.assertThat(acceptingTopEndDropTarget.startOffsets.size)
-                .isEqualTo(1)
-            Truth.assertThat(acceptingTopEndDropTarget.endedOffsets.size)
-                .isEqualTo(1)
+            Truth.assertThat(acceptingTopEndDropTarget.startOffsets.size).isEqualTo(1)
+            Truth.assertThat(acceptingTopEndDropTarget.endedOffsets.size).isEqualTo(1)
 
             Truth.assertThat(acceptingParentBottomStartDropTarget.startOffsets.first())
                 .isEqualTo(initialEvent.offset())
             Truth.assertThat(acceptingParentBottomStartDropTarget.endedOffsets.first())
                 .isEqualTo(endEvent.offset())
-            Truth.assertThat(acceptingParentBottomStartDropTarget.startOffsets.size)
-                .isEqualTo(1)
-            Truth.assertThat(acceptingParentBottomStartDropTarget.endedOffsets.size)
-                .isEqualTo(1)
+            Truth.assertThat(acceptingParentBottomStartDropTarget.startOffsets.size).isEqualTo(1)
+            Truth.assertThat(acceptingParentBottomStartDropTarget.endedOffsets.size).isEqualTo(1)
 
             Truth.assertThat(acceptingInnerBottomStartDropTarget.startOffsets.first())
                 .isEqualTo(initialEvent.offset())
             Truth.assertThat(acceptingInnerBottomStartDropTarget.endedOffsets.first())
                 .isEqualTo(endEvent.offset())
-            Truth.assertThat(acceptingInnerBottomStartDropTarget.startOffsets.size)
-                .isEqualTo(1)
-            Truth.assertThat(acceptingInnerBottomStartDropTarget.endedOffsets.size)
-                .isEqualTo(1)
+            Truth.assertThat(acceptingInnerBottomStartDropTarget.startOffsets.size).isEqualTo(1)
+            Truth.assertThat(acceptingInnerBottomStartDropTarget.endedOffsets.size).isEqualTo(1)
 
             Truth.assertThat(acceptingOffsetInnerBottomStartDropTarget.startOffsets.first())
                 .isEqualTo(initialEvent.offset())
@@ -558,10 +524,8 @@
                 .isEqualTo(initialEvent.offset())
             Truth.assertThat(acceptingInnerBottomEndDropTarget.endedOffsets.first())
                 .isEqualTo(endEvent.offset())
-            Truth.assertThat(acceptingInnerBottomEndDropTarget.startOffsets.size)
-                .isEqualTo(1)
-            Truth.assertThat(acceptingInnerBottomEndDropTarget.endedOffsets.size)
-                .isEqualTo(1)
+            Truth.assertThat(acceptingInnerBottomEndDropTarget.startOffsets.size).isEqualTo(1)
+            Truth.assertThat(acceptingInnerBottomEndDropTarget.endedOffsets.size).isEqualTo(1)
 
             // Rejected drag and drop, it should have no start or end offset
             Truth.assertThat(rejectingParentBottomEndDropTarget.startOffsets.isEmpty())
@@ -574,41 +538,39 @@
     @Test
     fun dispatchDragEvent_canEnterThenMoveWithinMultipleNodes() {
         rule.runOnUiThread {
-            val events = listOf(
-                // Start in the center
-                DragEvent(
-                    action = DragEvent.ACTION_DRAG_STARTED,
-                    x = with(density) { HalfContainerSize.toPx() },
-                    y = with(density) { HalfContainerSize.toPx() },
-                ),
-                // Move into top start parent
-                DragEvent(
-                    action = DragEvent.ACTION_DRAG_LOCATION,
-                    x = with(density) { HalfChildSize.toPx() },
-                    y = with(density) { HalfChildSize.toPx() },
-                ),
-                // Move into bottom start parent
-                DragEvent(
-                    action = DragEvent.ACTION_DRAG_LOCATION,
-                    x = with(density) { HalfChildSize.toPx() },
-                    y = with(density) {
-                        (ContainerSize - ChildSize - HalfChildSize).toPx()
-                    },
-                ),
-                // Move into bottom start inner child
-                DragEvent(
-                    action = DragEvent.ACTION_DRAG_LOCATION,
-                    x = with(density) { HalfChildSize.toPx() },
-                    y = with(density) { (ContainerSize - HalfChildSize).toPx() },
-                ),
-                // Move into bottom offset inner child
-                DragEvent(
-                    action = DragEvent.ACTION_DRAG_LOCATION,
-                    x = with(density) { HalfContainerSize.toPx() },
-                    y = with(density) { (ContainerSize - HalfParentSize).toPx() },
+            val events =
+                listOf(
+                    // Start in the center
+                    DragEvent(
+                        action = DragEvent.ACTION_DRAG_STARTED,
+                        x = with(density) { HalfContainerSize.toPx() },
+                        y = with(density) { HalfContainerSize.toPx() },
+                    ),
+                    // Move into top start parent
+                    DragEvent(
+                        action = DragEvent.ACTION_DRAG_LOCATION,
+                        x = with(density) { HalfChildSize.toPx() },
+                        y = with(density) { HalfChildSize.toPx() },
+                    ),
+                    // Move into bottom start parent
+                    DragEvent(
+                        action = DragEvent.ACTION_DRAG_LOCATION,
+                        x = with(density) { HalfChildSize.toPx() },
+                        y = with(density) { (ContainerSize - ChildSize - HalfChildSize).toPx() },
+                    ),
+                    // Move into bottom start inner child
+                    DragEvent(
+                        action = DragEvent.ACTION_DRAG_LOCATION,
+                        x = with(density) { HalfChildSize.toPx() },
+                        y = with(density) { (ContainerSize - HalfChildSize).toPx() },
+                    ),
+                    // Move into bottom offset inner child
+                    DragEvent(
+                        action = DragEvent.ACTION_DRAG_LOCATION,
+                        x = with(density) { HalfContainerSize.toPx() },
+                        y = with(density) { (ContainerSize - HalfParentSize).toPx() },
+                    )
                 )
-
-            )
             val (
                 initialEvent,
                 topStartParentEvent,
@@ -654,9 +616,7 @@
     fun dispatchDragEvent_ignoresNodeThatWasInterestedAndNoLongerIs() {
         // Create UI with node placed in top start of parent
         var shouldRenderItem by mutableStateOf(true)
-        val dropTargetHolder = DropTargetModifierHolder(
-            acceptsDragAndDrop = { shouldRenderItem }
-        )
+        val dropTargetHolder = DropTargetModifierHolder(acceptsDragAndDrop = { shouldRenderItem })
 
         // Set up UI
         countDown(from = 1) { latch ->
@@ -664,35 +624,39 @@
                 container.setContent {
                     density = LocalDensity.current
                     Box(
-                        modifier = Modifier
-                            .requiredSize(ContainerSize)
-                            .testDropTarget(dropTargetHolder)
-                            .onGloballyPositioned { latch.countDown() }
+                        modifier =
+                            Modifier.requiredSize(ContainerSize)
+                                .testDropTarget(dropTargetHolder)
+                                .onGloballyPositioned { latch.countDown() }
                     )
                 }
             }
         }
 
-        val acceptingStartEvent = DragEvent(
-            action = DragEvent.ACTION_DRAG_STARTED,
-            x = with(density) { HalfContainerSize.toPx() },
-            y = with(density) { HalfContainerSize.toPx() },
-        )
-        val acceptingEndEvent = DragEvent(
-            action = DragEvent.ACTION_DRAG_ENDED,
-            x = with(density) { ParentSize.toPx() },
-            y = with(density) { ParentSize.toPx() },
-        )
-        val rejectingStartEvent = DragEvent(
-            action = DragEvent.ACTION_DRAG_STARTED,
-            x = with(density) { HalfParentSize.toPx() },
-            y = with(density) { HalfParentSize.toPx() },
-        )
-        val rejectingEndEvent = DragEvent(
-            action = DragEvent.ACTION_DRAG_ENDED,
-            x = with(density) { ChildSize.toPx() },
-            y = with(density) { ChildSize.toPx() },
-        )
+        val acceptingStartEvent =
+            DragEvent(
+                action = DragEvent.ACTION_DRAG_STARTED,
+                x = with(density) { HalfContainerSize.toPx() },
+                y = with(density) { HalfContainerSize.toPx() },
+            )
+        val acceptingEndEvent =
+            DragEvent(
+                action = DragEvent.ACTION_DRAG_ENDED,
+                x = with(density) { ParentSize.toPx() },
+                y = with(density) { ParentSize.toPx() },
+            )
+        val rejectingStartEvent =
+            DragEvent(
+                action = DragEvent.ACTION_DRAG_STARTED,
+                x = with(density) { HalfParentSize.toPx() },
+                y = with(density) { HalfParentSize.toPx() },
+            )
+        val rejectingEndEvent =
+            DragEvent(
+                action = DragEvent.ACTION_DRAG_ENDED,
+                x = with(density) { ChildSize.toPx() },
+                y = with(density) { ChildSize.toPx() },
+            )
 
         rule.runOnUiThread {
             val androidComposeView = findAndroidComposeView(container)!!
@@ -715,10 +679,8 @@
                 .isEqualTo(acceptingEndEvent.offset())
 
             // Assert only accepting start and end were seen
-            Truth.assertThat(dropTargetHolder.startOffsets.size)
-                .isEqualTo(1)
-            Truth.assertThat(dropTargetHolder.endedOffsets.size)
-                .isEqualTo(1)
+            Truth.assertThat(dropTargetHolder.startOffsets.size).isEqualTo(1)
+            Truth.assertThat(dropTargetHolder.endedOffsets.size).isEqualTo(1)
         }
     }
 
@@ -733,31 +695,30 @@
 
         val androidComposeView = findAndroidComposeView(container)!!
         var canShowChild by mutableStateOf(true)
-        val parentDropTargetHolder = DropTargetModifierHolder(
-            acceptsDragAndDrop = { true }
-        )
-        val childDropTargetHolder = DropTargetModifierHolder(
-            acceptsDragAndDrop = { true }
-        )
+        val parentDropTargetHolder = DropTargetModifierHolder(acceptsDragAndDrop = { true })
+        val childDropTargetHolder = DropTargetModifierHolder(acceptsDragAndDrop = { true })
 
         // At the center
-        val initialEvent = DragEvent(
-            action = DragEvent.ACTION_DRAG_STARTED,
-            x = with(density) { HalfContainerSize.toPx() },
-            y = with(density) { HalfContainerSize.toPx() },
-        )
+        val initialEvent =
+            DragEvent(
+                action = DragEvent.ACTION_DRAG_STARTED,
+                x = with(density) { HalfContainerSize.toPx() },
+                y = with(density) { HalfContainerSize.toPx() },
+            )
         // Close to top start
-        val insideParentAndChild = DragEvent(
-            action = DragEvent.ACTION_DRAG_LOCATION,
-            x = with(density) { HalfParentSize.toPx() },
-            y = with(density) { HalfParentSize.toPx() },
-        )
+        val insideParentAndChild =
+            DragEvent(
+                action = DragEvent.ACTION_DRAG_LOCATION,
+                x = with(density) { HalfParentSize.toPx() },
+                y = with(density) { HalfParentSize.toPx() },
+            )
         // Close to top start
-        val insideParentAndChildWithChildRemoved = DragEvent(
-            action = DragEvent.ACTION_DRAG_LOCATION,
-            x = with(density) { HalfChildSize.toPx() },
-            y = with(density) { HalfChildSize.toPx() },
-        )
+        val insideParentAndChildWithChildRemoved =
+            DragEvent(
+                action = DragEvent.ACTION_DRAG_LOCATION,
+                x = with(density) { HalfChildSize.toPx() },
+                y = with(density) { HalfChildSize.toPx() },
+            )
 
         // Set up UI
         countDown(from = 2) { latch ->
@@ -766,42 +727,43 @@
                 container.setContent {
                     density = LocalDensity.current
                     Box(
-                        modifier = Modifier
-                            .requiredSize(ContainerSize)
-                            .testDropTarget(parentDropTargetHolder)
-                            .onGloballyPositioned {
-                                // Events already dispatched, return
-                                if (!canShowChild) return@onGloballyPositioned
+                        modifier =
+                            Modifier.requiredSize(ContainerSize)
+                                .testDropTarget(parentDropTargetHolder)
+                                .onGloballyPositioned {
+                                    // Events already dispatched, return
+                                    if (!canShowChild) return@onGloballyPositioned
 
-                                // Start in the center
-                                androidComposeView.dispatchDragEvent(initialEvent)
-                                // Move into item
-                                androidComposeView.dispatchDragEvent(insideParentAndChild)
-                                // Remove child
-                                canShowChild = false
+                                    // Start in the center
+                                    androidComposeView.dispatchDragEvent(initialEvent)
+                                    // Move into item
+                                    androidComposeView.dispatchDragEvent(insideParentAndChild)
+                                    // Remove child
+                                    canShowChild = false
+
+                                    latch.countDown()
+                                }
+                    ) {
+                        if (canShowChild)
+                            Box(
+                                modifier =
+                                    Modifier.requiredSize(ParentSize)
+                                        .align(Alignment.TopStart)
+                                        .testDropTarget(childDropTargetHolder)
+                            )
+                    }
+
+                    if (canShowChild)
+                        DisposableEffect(Unit) {
+                            // Move drag pointer after the child has been removed
+                            onDispose {
+                                androidComposeView.dispatchDragEvent(
+                                    insideParentAndChildWithChildRemoved
+                                )
 
                                 latch.countDown()
                             }
-
-                    ) {
-                        if (canShowChild) Box(
-                            modifier = Modifier
-                                .requiredSize(ParentSize)
-                                .align(Alignment.TopStart)
-                                .testDropTarget(childDropTargetHolder)
-                        )
-                    }
-
-                    if (canShowChild) DisposableEffect(Unit) {
-                        // Move drag pointer after the child has been removed
-                        onDispose {
-                            androidComposeView.dispatchDragEvent(
-                                insideParentAndChildWithChildRemoved
-                            )
-
-                            latch.countDown()
                         }
-                    }
                 }
             }
         }
@@ -833,18 +795,13 @@
             .isEqualTo(insideParentAndChild.offset())
 
         // Parent should have seen two enters, one moves and one exit
-        Truth.assertThat(parentDropTargetHolder.enterOffsets.size)
-            .isEqualTo(2)
-        Truth.assertThat(parentDropTargetHolder.moveOffsets.size)
-            .isEqualTo(1)
-        Truth.assertThat(parentDropTargetHolder.exitOffsets.size)
-            .isEqualTo(1)
+        Truth.assertThat(parentDropTargetHolder.enterOffsets.size).isEqualTo(2)
+        Truth.assertThat(parentDropTargetHolder.moveOffsets.size).isEqualTo(1)
+        Truth.assertThat(parentDropTargetHolder.exitOffsets.size).isEqualTo(1)
 
         // Child should have seen just one enter and one move
-        Truth.assertThat(childDropTargetHolder.enterOffsets.size)
-            .isEqualTo(1)
-        Truth.assertThat(childDropTargetHolder.moveOffsets.size)
-            .isEqualTo(1)
+        Truth.assertThat(childDropTargetHolder.enterOffsets.size).isEqualTo(1)
+        Truth.assertThat(childDropTargetHolder.moveOffsets.size).isEqualTo(1)
     }
 
     @Test
@@ -858,34 +815,36 @@
 
         val androidComposeView = findAndroidComposeView(container)!!
         var itemOffset by mutableStateOf(IntOffset.Zero)
-        val dropTargetHolder = DropTargetModifierHolder(
-            acceptsDragAndDrop = { true }
-        )
+        val dropTargetHolder = DropTargetModifierHolder(acceptsDragAndDrop = { true })
 
         // At the center
-        val initialEvent = DragEvent(
-            action = DragEvent.ACTION_DRAG_STARTED,
-            x = with(density) { HalfContainerSize.toPx() },
-            y = with(density) { HalfContainerSize.toPx() },
-        )
+        val initialEvent =
+            DragEvent(
+                action = DragEvent.ACTION_DRAG_STARTED,
+                x = with(density) { HalfContainerSize.toPx() },
+                y = with(density) { HalfContainerSize.toPx() },
+            )
         // Close to top start
-        val eventWhereItemWas = DragEvent(
-            action = DragEvent.ACTION_DRAG_LOCATION,
-            x = with(density) { HalfParentSize.toPx() },
-            y = with(density) { HalfParentSize.toPx() },
-        )
+        val eventWhereItemWas =
+            DragEvent(
+                action = DragEvent.ACTION_DRAG_LOCATION,
+                x = with(density) { HalfParentSize.toPx() },
+                y = with(density) { HalfParentSize.toPx() },
+            )
         // Close to top start
-        val eventWhereItemUsedToBe = DragEvent(
-            action = DragEvent.ACTION_DRAG_LOCATION,
-            x = with(density) { HalfChildSize.toPx() },
-            y = with(density) { HalfChildSize.toPx() },
-        )
+        val eventWhereItemUsedToBe =
+            DragEvent(
+                action = DragEvent.ACTION_DRAG_LOCATION,
+                x = with(density) { HalfChildSize.toPx() },
+                y = with(density) { HalfChildSize.toPx() },
+            )
         // Close to bottom end
-        val eventWhereItemIs = DragEvent(
-            action = DragEvent.ACTION_DRAG_LOCATION,
-            x = with(density) { (ContainerSize - HalfParentSize).toPx() },
-            y = with(density) { (ContainerSize - HalfParentSize).toPx() },
-        )
+        val eventWhereItemIs =
+            DragEvent(
+                action = DragEvent.ACTION_DRAG_LOCATION,
+                x = with(density) { (ContainerSize - HalfParentSize).toPx() },
+                y = with(density) { (ContainerSize - HalfParentSize).toPx() },
+            )
 
         // Set up UI
         countDown(from = 2) { latch ->
@@ -894,39 +853,46 @@
                 container.setContent {
                     density = LocalDensity.current
                     Box(
-                        modifier = Modifier
-                            .requiredSize(ContainerSize)
-                            .onGloballyPositioned {
+                        modifier =
+                            Modifier.requiredSize(ContainerSize).onGloballyPositioned {
                                 // Start in the center
                                 androidComposeView.dispatchDragEvent(initialEvent)
                                 // Move into item
                                 androidComposeView.dispatchDragEvent(eventWhereItemWas)
 
                                 // Move item to bottom end
-                                itemOffset = IntOffset(
-                                    x = with(density) { (ContainerSize - ParentSize).roundToPx() },
-                                    y = with(density) { (ContainerSize - ParentSize).roundToPx() },
-                                )
+                                itemOffset =
+                                    IntOffset(
+                                        x =
+                                            with(density) {
+                                                (ContainerSize - ParentSize).roundToPx()
+                                            },
+                                        y =
+                                            with(density) {
+                                                (ContainerSize - ParentSize).roundToPx()
+                                            },
+                                    )
                             }
-
                     ) {
                         Box(
-                            modifier = Modifier
-                                .offset { itemOffset }
-                                .requiredSize(ParentSize)
-                                .align(Alignment.TopStart)
-                                .testDropTarget(dropTargetHolder)
-                                .onGloballyPositioned { coordinates ->
-                                    // Item has been moved
-                                    if (coordinates.positionInParent() != Offset.Zero) {
-                                        // Move where item used to be
-                                        androidComposeView.dispatchDragEvent(eventWhereItemUsedToBe)
+                            modifier =
+                                Modifier.offset { itemOffset }
+                                    .requiredSize(ParentSize)
+                                    .align(Alignment.TopStart)
+                                    .testDropTarget(dropTargetHolder)
+                                    .onGloballyPositioned { coordinates ->
+                                        // Item has been moved
+                                        if (coordinates.positionInParent() != Offset.Zero) {
+                                            // Move where item used to be
+                                            androidComposeView.dispatchDragEvent(
+                                                eventWhereItemUsedToBe
+                                            )
 
-                                        // Move where item now is
-                                        androidComposeView.dispatchDragEvent(eventWhereItemIs)
+                                            // Move where item now is
+                                            androidComposeView.dispatchDragEvent(eventWhereItemIs)
+                                        }
+                                        latch.countDown()
                                     }
-                                    latch.countDown()
-                                }
                         )
                     }
                 }
@@ -934,33 +900,29 @@
         }
 
         // Assertions
-        Truth.assertThat(dropTargetHolder.startOffsets.first())
-            .isEqualTo(initialEvent.offset())
+        Truth.assertThat(dropTargetHolder.startOffsets.first()).isEqualTo(initialEvent.offset())
 
         // Enter at top start parent
         Truth.assertThat(dropTargetHolder.enterOffsets.first())
             .isEqualTo(eventWhereItemWas.offset())
-        Truth.assertThat(dropTargetHolder.moveOffsets.first())
-            .isEqualTo(eventWhereItemWas.offset())
+        Truth.assertThat(dropTargetHolder.moveOffsets.first()).isEqualTo(eventWhereItemWas.offset())
 
         // The next event seen in the item should be the one that entered after being moved
-        Truth.assertThat(dropTargetHolder.enterOffsets[1])
-            .isEqualTo(eventWhereItemIs.offset())
-        Truth.assertThat(dropTargetHolder.moveOffsets[1])
-            .isEqualTo(eventWhereItemIs.offset())
+        Truth.assertThat(dropTargetHolder.enterOffsets[1]).isEqualTo(eventWhereItemIs.offset())
+        Truth.assertThat(dropTargetHolder.moveOffsets[1]).isEqualTo(eventWhereItemIs.offset())
 
         // The event where the item used to be should never have been seen by the item
         Truth.assertThat(
-            dropTargetHolder.enterOffsets.none { offset ->
-                offset == eventWhereItemUsedToBe.offset()
-            }
-        )
+                dropTargetHolder.enterOffsets.none { offset ->
+                    offset == eventWhereItemUsedToBe.offset()
+                }
+            )
             .isTrue()
         Truth.assertThat(
-            dropTargetHolder.moveOffsets.none { offset ->
-                offset == eventWhereItemUsedToBe.offset()
-            }
-        )
+                dropTargetHolder.moveOffsets.none { offset ->
+                    offset == eventWhereItemUsedToBe.offset()
+                }
+            )
             .isTrue()
     }
 
@@ -974,27 +936,29 @@
                 container.setContent {
                     density = LocalDensity.current
                     Box(
-                        modifier = Modifier
-                            .requiredSize(ContainerSize)
-                            .customTraversableModifier()
-                            .testDropTarget(dropTargetHolder)
-                            .customTraversableModifier()
-                            .onGloballyPositioned { latch.countDown() }
+                        modifier =
+                            Modifier.requiredSize(ContainerSize)
+                                .customTraversableModifier()
+                                .testDropTarget(dropTargetHolder)
+                                .customTraversableModifier()
+                                .onGloballyPositioned { latch.countDown() }
                     )
                 }
             }
         }
 
-        val acceptingStartEvent = DragEvent(
-            action = DragEvent.ACTION_DRAG_STARTED,
-            x = with(density) { HalfContainerSize.toPx() },
-            y = with(density) { HalfContainerSize.toPx() },
-        )
-        val acceptingEndEvent = DragEvent(
-            action = DragEvent.ACTION_DRAG_ENDED,
-            x = with(density) { ParentSize.toPx() },
-            y = with(density) { ParentSize.toPx() },
-        )
+        val acceptingStartEvent =
+            DragEvent(
+                action = DragEvent.ACTION_DRAG_STARTED,
+                x = with(density) { HalfContainerSize.toPx() },
+                y = with(density) { HalfContainerSize.toPx() },
+            )
+        val acceptingEndEvent =
+            DragEvent(
+                action = DragEvent.ACTION_DRAG_ENDED,
+                x = with(density) { ParentSize.toPx() },
+                y = with(density) { ParentSize.toPx() },
+            )
 
         rule.runOnUiThread {
             val androidComposeView = findAndroidComposeView(container)!!
@@ -1022,20 +986,22 @@
 private object CustomTraversableModifierElement :
     ModifierNodeElement<CustomTraversableModifierNode>() {
     override fun create() = CustomTraversableModifierNode()
+
     override fun update(node: CustomTraversableModifierNode) {}
+
     override fun hashCode(): Int = 0
+
     override fun equals(other: Any?): Boolean = this === other
 }
 
 private class CustomTraversableModifierNode : Modifier.Node(), TraversableNode {
     private object CustomTraversableModifierKey
 
-    override val traverseKey: Any get() = CustomTraversableModifierKey
+    override val traverseKey: Any
+        get() = CustomTraversableModifierKey
 }
 
-/**
- * Creates a [DragEvent] with the specified coordinates
- */
+/** Creates a [DragEvent] with the specified coordinates */
 private fun DragEvent(action: Int, x: Float, y: Float): DragEvent {
     val parcel = Parcel.obtain()
     parcel.writeInt(action)
@@ -1049,10 +1015,7 @@
     return DragEvent.CREATOR.createFromParcel(parcel)
 }
 
-private fun DragEvent.offset() = Offset(
-    x = x,
-    y = y
-)
+private fun DragEvent.offset() = Offset(x = x, y = y)
 
 private fun countDown(from: Int, block: (CountDownLatch) -> Unit) {
     val countDownLatch = CountDownLatch(from)
@@ -1061,6 +1024,7 @@
 }
 
 private fun Modifier.testDropTarget(holder: DropTargetModifierHolder) = this then holder.modifier
+
 private class DropTargetModifierHolder(
     private val acceptsDragAndDrop: () -> Boolean,
     var onEntered: ((event: DragAndDropEvent) -> Unit)? = null,
@@ -1074,49 +1038,37 @@
     val endedOffsets = mutableListOf<Offset>()
 
     @OptIn(ExperimentalFoundationApi::class)
-    val modifier = Modifier.dragAndDropTarget(
-        target = object : DragAndDropTarget {
-            override fun onStarted(event: DragAndDropEvent) {
-                startOffsets.add(
-                    Offset(x = event.dragEvent.x, y = event.dragEvent.y)
-                )
-            }
+    val modifier =
+        Modifier.dragAndDropTarget(
+            target =
+                object : DragAndDropTarget {
+                    override fun onStarted(event: DragAndDropEvent) {
+                        startOffsets.add(Offset(x = event.dragEvent.x, y = event.dragEvent.y))
+                    }
 
-            override fun onEntered(event: DragAndDropEvent) {
-                enterOffsets.add(
-                    Offset(x = event.dragEvent.x, y = event.dragEvent.y)
-                )
-                onEntered?.invoke(event)
-            }
+                    override fun onEntered(event: DragAndDropEvent) {
+                        enterOffsets.add(Offset(x = event.dragEvent.x, y = event.dragEvent.y))
+                        onEntered?.invoke(event)
+                    }
 
-            override fun onMoved(event: DragAndDropEvent) {
-                moveOffsets.add(
-                    Offset(x = event.dragEvent.x, y = event.dragEvent.y)
-                )
-            }
+                    override fun onMoved(event: DragAndDropEvent) {
+                        moveOffsets.add(Offset(x = event.dragEvent.x, y = event.dragEvent.y))
+                    }
 
-            override fun onDrop(event: DragAndDropEvent): Boolean {
-                dropOffsets.add(
-                    Offset(x = event.dragEvent.x, y = event.dragEvent.y)
-                )
-                return true
-            }
+                    override fun onDrop(event: DragAndDropEvent): Boolean {
+                        dropOffsets.add(Offset(x = event.dragEvent.x, y = event.dragEvent.y))
+                        return true
+                    }
 
-            override fun onExited(event: DragAndDropEvent) {
-                exitOffsets.add(
-                    Offset(x = event.dragEvent.x, y = event.dragEvent.y)
-                )
-                onExited?.invoke(event)
-            }
+                    override fun onExited(event: DragAndDropEvent) {
+                        exitOffsets.add(Offset(x = event.dragEvent.x, y = event.dragEvent.y))
+                        onExited?.invoke(event)
+                    }
 
-            override fun onEnded(event: DragAndDropEvent) {
-                endedOffsets.add(
-                    Offset(x = event.dragEvent.x, y = event.dragEvent.y)
-                )
-            }
-        },
-        shouldStartDragAndDrop = {
-            acceptsDragAndDrop()
-        },
-    )
+                    override fun onEnded(event: DragAndDropEvent) {
+                        endedOffsets.add(Offset(x = event.dragEvent.x, y = event.dragEvent.y))
+                    }
+                },
+            shouldStartDragAndDrop = { acceptsDragAndDrop() },
+        )
 }
diff --git a/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/draw/AlphaTest.kt b/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/draw/AlphaTest.kt
index d67a405..4ad468a 100644
--- a/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/draw/AlphaTest.kt
+++ b/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/draw/AlphaTest.kt
@@ -73,18 +73,13 @@
             activity.setContent {
                 AtLeastSize(
                     size = 10,
-                    modifier = Modifier.background(Color.White)
-                        .alpha(1f)
-                        .background(color)
-                        .then(unlatch)
-                ) {
-                }
+                    modifier =
+                        Modifier.background(Color.White).alpha(1f).background(color).then(unlatch)
+                ) {}
             }
         }
 
-        takeScreenShot(10).apply {
-            assertRect(color)
-        }
+        takeScreenShot(10).apply { assertRect(color) }
     }
 
     @SdkSuppress(minSdkVersion = Build.VERSION_CODES.O)
@@ -95,18 +90,13 @@
             activity.setContent {
                 AtLeastSize(
                     size = 10,
-                    modifier = Modifier.background(Color.White)
-                        .alpha(0f)
-                        .background(color)
-                        .then(unlatch)
-                ) {
-                }
+                    modifier =
+                        Modifier.background(Color.White).alpha(0f).background(color).then(unlatch)
+                ) {}
             }
         }
 
-        takeScreenShot(10).apply {
-            assertRect(Color.White)
-        }
+        takeScreenShot(10).apply { assertRect(Color.White) }
     }
 
     @SdkSuppress(minSdkVersion = Build.VERSION_CODES.O)
@@ -118,24 +108,21 @@
                 Row(Modifier.background(Color.White)) {
                     AtLeastSize(
                         size = 10,
-                        modifier = Modifier.background(Color.White)
-                            .alpha(0.5f)
-                            .background(color)
-                            .then(unlatch)
-                    ) {
-                    }
+                        modifier =
+                            Modifier.background(Color.White)
+                                .alpha(0.5f)
+                                .background(color)
+                                .then(unlatch)
+                    ) {}
                     AtLeastSize(
                         size = 10,
                         modifier = Modifier.background(color.copy(alpha = 0.5f))
-                    ) {
-                    }
+                    ) {}
                 }
             }
         }
 
-        takeScreenShot(20, 10).apply {
-            assertColorsEqual(color(5, 5), color(15, 5))
-        }
+        takeScreenShot(20, 10).apply { assertColorsEqual(color(5, 5), color(15, 5)) }
     }
 
     @SdkSuppress(minSdkVersion = Build.VERSION_CODES.O)
@@ -148,23 +135,19 @@
             activity.setContent {
                 AtLeastSize(
                     size = 10,
-                    modifier = Modifier.background(Color.White)
-                        .alpha(alpha.value)
-                        .then(unlatch)
-                        .background(color)
-                ) {
-                }
+                    modifier =
+                        Modifier.background(Color.White)
+                            .alpha(alpha.value)
+                            .then(unlatch)
+                            .background(color)
+                ) {}
             }
         }
         assertTrue(drawLatch.await(1, TimeUnit.SECONDS))
 
-        rule.runOnUiThreadIR {
-            alpha.value = 1f
-        }
+        rule.runOnUiThreadIR { alpha.value = 1f }
 
-        takeScreenShot(10).apply {
-            assertRect(color)
-        }
+        takeScreenShot(10).apply { assertRect(color) }
     }
 
     @SdkSuppress(minSdkVersion = Build.VERSION_CODES.O)
@@ -177,24 +160,20 @@
             activity.setContent {
                 AtLeastSize(
                     size = 10,
-                    modifier = Modifier.background(Color.White)
-                        .alpha(1f)
-                        .alpha(alpha)
-                        .then(unlatch)
-                        .background(color)
-                ) {
-                }
+                    modifier =
+                        Modifier.background(Color.White)
+                            .alpha(1f)
+                            .alpha(alpha)
+                            .then(unlatch)
+                            .background(color)
+                ) {}
             }
         }
         assertTrue(drawLatch.await(1, TimeUnit.SECONDS))
 
-        rule.runOnUiThreadIR {
-            alpha = 1f
-        }
+        rule.runOnUiThreadIR { alpha = 1f }
 
-        takeScreenShot(10).apply {
-            assertRect(color)
-        }
+        takeScreenShot(10).apply { assertRect(color) }
     }
 
     @SdkSuppress(minSdkVersion = Build.VERSION_CODES.O)
@@ -206,25 +185,19 @@
             activity.setContent {
                 AtLeastSize(
                     size = 10,
-                    modifier = Modifier.background(Color.White)
-                        .run {
-                            if (model.value) alpha(0f).background(Color.Green) else this
-                        }
-                        .then(unlatch)
-                ) {
-                }
+                    modifier =
+                        Modifier.background(Color.White)
+                            .run { if (model.value) alpha(0f).background(Color.Green) else this }
+                            .then(unlatch)
+                ) {}
             }
         }
         assertTrue(drawLatch.await(1, TimeUnit.SECONDS))
 
         drawLatch = CountDownLatch(1)
-        rule.runOnUiThreadIR {
-            model.value = true
-        }
+        rule.runOnUiThreadIR { model.value = true }
 
-        takeScreenShot(10).apply {
-            assertRect(Color.White)
-        }
+        takeScreenShot(10).apply { assertRect(Color.White) }
     }
 
     // waitAndScreenShot() requires API level 26
diff --git a/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/draw/BlurTest.kt b/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/draw/BlurTest.kt
index 3b871fb..b885224 100644
--- a/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/draw/BlurTest.kt
+++ b/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/draw/BlurTest.kt
@@ -53,18 +53,14 @@
 @RunWith(AndroidJUnit4::class)
 class BlurTest {
 
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
     @Test
     @SmallTest
     fun testNoopBlur() {
         // If we are blurring with a 0 pixel radius and we are not clipping
         // the blurred result, this should return the default Modifier
-        assertEquals(
-            Modifier.blur(0.dp, BlurredEdgeTreatment.Unbounded),
-            Modifier
-        )
+        assertEquals(Modifier.blur(0.dp, BlurredEdgeTreatment.Unbounded), Modifier)
     }
 
     @SdkSuppress(minSdkVersion = Build.VERSION_CODES.S)
@@ -83,9 +79,7 @@
             val padding = (2 / density).dp
             val drawBlock: DrawScope.() -> Unit = {
                 val blurRadiusPx = blurRadius.toPx()
-                inset(blurRadiusPx, blurRadiusPx) {
-                    drawRect(Color.Blue)
-                }
+                inset(blurRadiusPx, blurRadiusPx) { drawRect(Color.Blue) }
             }
             val boxModifierChain = Modifier.size(size).background(Color.Black).padding(padding)
             Row {
@@ -116,24 +110,27 @@
         var blurBuffer: IntArray
         var graphicsLayerBuffer: IntArray
 
-        val blurPixelMap = rule.onNodeWithTag(blurTag).captureToImage().apply {
-            blurBuffer = IntArray(width * height)
-            toPixelMap(buffer = blurBuffer)
-        }
-        val graphicsLayerMap = rule.onNodeWithTag(graphicsLayerTag).captureToImage().apply {
-            graphicsLayerBuffer = IntArray(width * height)
-            toPixelMap(buffer = graphicsLayerBuffer)
-        }
+        val blurPixelMap =
+            rule.onNodeWithTag(blurTag).captureToImage().apply {
+                blurBuffer = IntArray(width * height)
+                toPixelMap(buffer = blurBuffer)
+            }
+        val graphicsLayerMap =
+            rule.onNodeWithTag(graphicsLayerTag).captureToImage().apply {
+                graphicsLayerBuffer = IntArray(width * height)
+                toPixelMap(buffer = graphicsLayerBuffer)
+            }
 
         assertEquals(blurPixelMap.width, graphicsLayerMap.width)
         assertEquals(blurPixelMap.height, graphicsLayerMap.height)
 
-        MSSIMMatcher(threshold = 0.99).compareBitmaps(
-            blurBuffer,
-            graphicsLayerBuffer,
-            blurPixelMap.width,
-            blurPixelMap.height
-        )
+        MSSIMMatcher(threshold = 0.99)
+            .compareBitmaps(
+                blurBuffer,
+                graphicsLayerBuffer,
+                blurPixelMap.width,
+                blurPixelMap.height
+            )
     }
 
     @SdkSuppress(minSdkVersion = Build.VERSION_CODES.S)
@@ -142,12 +139,7 @@
     fun testRectBoundedBlur() {
         // Any bounded edge treatment should clip the underlying graphicsLayer and use
         // TileMode.Clamp in the corresponding BlurEffect
-        testBlurEdgeTreatment(
-            BlurredEdgeTreatment.Rectangle,
-            RectangleShape,
-            true,
-            TileMode.Clamp
-        )
+        testBlurEdgeTreatment(BlurredEdgeTreatment.Rectangle, RectangleShape, true, TileMode.Clamp)
     }
 
     @SdkSuppress(minSdkVersion = Build.VERSION_CODES.S)
@@ -156,24 +148,14 @@
     fun testUnboundedBlur() {
         // Any unbounded edge treatment should not clip the underlying graphicsLayer and use
         // TileMode.Decal in the corresponding BlurEffect
-        testBlurEdgeTreatment(
-            BlurredEdgeTreatment.Unbounded,
-            RectangleShape,
-            false,
-            TileMode.Decal
-        )
+        testBlurEdgeTreatment(BlurredEdgeTreatment.Unbounded, RectangleShape, false, TileMode.Decal)
     }
 
     @SdkSuppress(minSdkVersion = Build.VERSION_CODES.S)
     @Test
     @MediumTest
     fun testCircleBoundedBlur() {
-        testBlurEdgeTreatment(
-            BlurredEdgeTreatment(CircleShape),
-            CircleShape,
-            true,
-            TileMode.Clamp
-        )
+        testBlurEdgeTreatment(BlurredEdgeTreatment(CircleShape), CircleShape, true, TileMode.Clamp)
     }
 
     @Test
diff --git a/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/draw/ClipDrawTest.kt b/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/draw/ClipDrawTest.kt
index 490bb83..3a033e6 100644
--- a/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/draw/ClipDrawTest.kt
+++ b/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/draw/ClipDrawTest.kt
@@ -88,32 +88,46 @@
     private lateinit var activity: TestActivity
     private lateinit var drawLatch: CountDownLatch
 
-    private val rectShape = object : Shape {
-        override fun createOutline(size: Size, layoutDirection: LayoutDirection, density: Density) =
-            Outline.Rectangle(size.toRect())
-    }
-    private val triangleShape = object : Shape {
-        override fun createOutline(size: Size, layoutDirection: LayoutDirection, density: Density) =
-            Outline.Generic(
-                Path().apply {
-                    moveTo(size.width / 2f, 0f)
-                    lineTo(size.width, size.height)
-                    lineTo(0f, size.height)
-                    close()
-                }
-            )
-    }
-    private val invertedTriangleShape = object : Shape {
-        override fun createOutline(size: Size, layoutDirection: LayoutDirection, density: Density) =
-            Outline.Generic(
-                Path().apply {
-                    lineTo(size.width, 0f)
-                    lineTo(size.width / 2f, size.height)
-                    lineTo(0f, 0f)
-                    close()
-                }
-            )
-    }
+    private val rectShape =
+        object : Shape {
+            override fun createOutline(
+                size: Size,
+                layoutDirection: LayoutDirection,
+                density: Density
+            ) = Outline.Rectangle(size.toRect())
+        }
+    private val triangleShape =
+        object : Shape {
+            override fun createOutline(
+                size: Size,
+                layoutDirection: LayoutDirection,
+                density: Density
+            ) =
+                Outline.Generic(
+                    Path().apply {
+                        moveTo(size.width / 2f, 0f)
+                        lineTo(size.width, size.height)
+                        lineTo(0f, size.height)
+                        close()
+                    }
+                )
+        }
+    private val invertedTriangleShape =
+        object : Shape {
+            override fun createOutline(
+                size: Size,
+                layoutDirection: LayoutDirection,
+                density: Density
+            ) =
+                Outline.Generic(
+                    Path().apply {
+                        lineTo(size.width, 0f)
+                        lineTo(size.width / 2f, size.height)
+                        lineTo(0f, 0f)
+                        close()
+                    }
+                )
+        }
 
     @Before
     fun setup() {
@@ -130,11 +144,8 @@
                 Padding(size = 10, modifier = Modifier.fillColor(Color.Green)) {
                     AtLeastSize(
                         size = 10,
-                        modifier = Modifier
-                            .clip(rectShape)
-                            .fillColor(Color.Cyan)
-                    ) {
-                    }
+                        modifier = Modifier.clip(rectShape).fillColor(Color.Cyan)
+                    ) {}
                 }
             }
         }
@@ -153,11 +164,8 @@
                 Padding(size = 10, modifier = Modifier.fillColor(Color.Green)) {
                     AtLeastSize(
                         size = 10,
-                        modifier = Modifier
-                            .clipToBounds()
-                            .fillColor(Color.Cyan)
-                    ) {
-                    }
+                        modifier = Modifier.clipToBounds().fillColor(Color.Cyan)
+                    ) {}
                 }
             }
         }
@@ -175,11 +183,11 @@
             activity.setContent {
                 AtLeastSize(
                     size = 10,
-                    modifier = Modifier
-                        .fillColor(Color.Green)
-                        .padding(10)
-                        .clip(rectShape)
-                        .fillColor(Color.Cyan)
+                    modifier =
+                        Modifier.fillColor(Color.Green)
+                            .padding(10)
+                            .clip(rectShape)
+                            .fillColor(Color.Cyan)
                 ) {}
             }
         }
@@ -193,21 +201,19 @@
     @SdkSuppress(minSdkVersion = Build.VERSION_CODES.O)
     @Test
     fun roundedUniformRectClip() {
-        val shape = object : Shape {
-            override fun createOutline(
-                size: Size,
-                layoutDirection: LayoutDirection,
-                density: Density
-            ) = Outline.Rounded(RoundRect(size.toRect(), CornerRadius(12f)))
-        }
+        val shape =
+            object : Shape {
+                override fun createOutline(
+                    size: Size,
+                    layoutDirection: LayoutDirection,
+                    density: Density
+                ) = Outline.Rounded(RoundRect(size.toRect(), CornerRadius(12f)))
+            }
         rule.runOnUiThreadIR {
             activity.setContent {
                 AtLeastSize(
                     size = 30,
-                    modifier = Modifier
-                        .fillColor(Color.Green)
-                        .clip(shape)
-                        .fillColor(Color.Cyan)
+                    modifier = Modifier.fillColor(Color.Green).clip(shape).fillColor(Color.Cyan)
                 ) {}
             }
         }
@@ -231,29 +237,28 @@
     @SdkSuppress(minSdkVersion = Build.VERSION_CODES.O)
     @Test
     fun roundedRectWithDiffCornersClip() {
-        val shape = object : Shape {
-            override fun createOutline(
-                size: Size,
-                layoutDirection: LayoutDirection,
-                density: Density
-            ) = Outline.Rounded(
-                RoundRect(
-                    size.toRect(),
-                    CornerRadius.Zero,
-                    CornerRadius(12f),
-                    CornerRadius(12f),
-                    CornerRadius(12f)
-                )
-            )
-        }
+        val shape =
+            object : Shape {
+                override fun createOutline(
+                    size: Size,
+                    layoutDirection: LayoutDirection,
+                    density: Density
+                ) =
+                    Outline.Rounded(
+                        RoundRect(
+                            size.toRect(),
+                            CornerRadius.Zero,
+                            CornerRadius(12f),
+                            CornerRadius(12f),
+                            CornerRadius(12f)
+                        )
+                    )
+            }
         rule.runOnUiThreadIR {
             activity.setContent {
                 AtLeastSize(
                     size = 30,
-                    modifier = Modifier
-                        .fillColor(Color.Green)
-                        .clip(shape)
-                        .fillColor(Color.Cyan)
+                    modifier = Modifier.fillColor(Color.Green).clip(shape).fillColor(Color.Cyan)
                 ) {}
             }
         }
@@ -276,17 +281,13 @@
             activity.setContent {
                 AtLeastSize(
                     size = 30,
-                    modifier = Modifier
-                        .fillColor(Color.Green)
-                        .clip(triangleShape)
-                        .fillColor(Color.Cyan)
+                    modifier =
+                        Modifier.fillColor(Color.Green).clip(triangleShape).fillColor(Color.Cyan)
                 ) {}
             }
         }
 
-        takeScreenShot(30).apply {
-            assertTriangle(Color.Cyan, Color.Green)
-        }
+        takeScreenShot(30).apply { assertTriangle(Color.Cyan, Color.Green) }
     }
 
     @Ignore("Test disabled due to flakiness, see b/256950653")
@@ -294,29 +295,29 @@
     @Test
     fun concaveClip() {
         // 30 pixels rect with a rect hole of 10 pixels in the middle
-        val concaveShape = object : Shape {
-            override fun createOutline(
-                size: Size,
-                layoutDirection: LayoutDirection,
-                density: Density
-            ) = Outline.Generic(
-                Path().apply {
-                    op(
-                        Path().apply { addRect(Rect(0f, 0f, 30f, 30f)) },
-                        Path().apply { addRect(Rect(10f, 10f, 20f, 20f)) },
-                        PathOperation.Difference
+        val concaveShape =
+            object : Shape {
+                override fun createOutline(
+                    size: Size,
+                    layoutDirection: LayoutDirection,
+                    density: Density
+                ) =
+                    Outline.Generic(
+                        Path().apply {
+                            op(
+                                Path().apply { addRect(Rect(0f, 0f, 30f, 30f)) },
+                                Path().apply { addRect(Rect(10f, 10f, 20f, 20f)) },
+                                PathOperation.Difference
+                            )
+                        }
                     )
-                }
-            )
-        }
+            }
         rule.runOnUiThreadIR {
             activity.setContent {
                 AtLeastSize(
                     size = 30,
-                    modifier = Modifier
-                        .fillColor(Color.Green)
-                        .clip(concaveShape)
-                        .fillColor(Color.Cyan)
+                    modifier =
+                        Modifier.fillColor(Color.Green).clip(concaveShape).fillColor(Color.Cyan)
                 ) {}
             }
         }
@@ -336,27 +337,24 @@
             activity.setContent {
                 AtLeastSize(
                     size = 30,
-                    modifier = Modifier
-                        .fillColor(Color.Green)
-                        .clip(model.value)
-                        .fillColor(Color.Cyan)
+                    modifier =
+                        Modifier.fillColor(Color.Green).clip(model.value).fillColor(Color.Cyan)
                 ) {}
             }
         }
 
-        takeScreenShot(30).apply {
-            assertRect(Color.Cyan, size = 30)
-        }
+        takeScreenShot(30).apply { assertRect(Color.Cyan, size = 30) }
 
         drawLatch = CountDownLatch(1)
         rule.runOnUiThreadIR {
-            model.value = object : Shape {
-                override fun createOutline(
-                    size: Size,
-                    layoutDirection: LayoutDirection,
-                    density: Density
-                ) = Outline.Rounded(RoundRect(size.toRect(), CornerRadius(12f)))
-            }
+            model.value =
+                object : Shape {
+                    override fun createOutline(
+                        size: Size,
+                        layoutDirection: LayoutDirection,
+                        density: Density
+                    ) = Outline.Rounded(RoundRect(size.toRect(), CornerRadius(12f)))
+                }
         }
 
         takeScreenShot(30).apply {
@@ -376,24 +374,18 @@
             activity.setContent {
                 AtLeastSize(
                     size = 30,
-                    modifier = Modifier
-                        .fillColor(Color.Green)
-                        .clip(model.value)
-                        .fillColor(Color.Cyan)
+                    modifier =
+                        Modifier.fillColor(Color.Green).clip(model.value).fillColor(Color.Cyan)
                 ) {}
             }
         }
 
-        takeScreenShot(30).apply {
-            assertRect(Color.Cyan, size = 30)
-        }
+        takeScreenShot(30).apply { assertRect(Color.Cyan, size = 30) }
 
         drawLatch = CountDownLatch(1)
         rule.runOnUiThreadIR { model.value = triangleShape }
 
-        takeScreenShot(30).apply {
-            assertTriangle(Color.Cyan, Color.Green)
-        }
+        takeScreenShot(30).apply { assertTriangle(Color.Cyan, Color.Green) }
     }
 
     @SdkSuppress(minSdkVersion = Build.VERSION_CODES.O)
@@ -405,24 +397,18 @@
             activity.setContent {
                 AtLeastSize(
                     size = 30,
-                    modifier = Modifier
-                        .fillColor(Color.Green)
-                        .clip(model.value)
-                        .fillColor(Color.Cyan)
+                    modifier =
+                        Modifier.fillColor(Color.Green).clip(model.value).fillColor(Color.Cyan)
                 ) {}
             }
         }
 
-        takeScreenShot(30).apply {
-            assertTriangle(Color.Cyan, Color.Green)
-        }
+        takeScreenShot(30).apply { assertTriangle(Color.Cyan, Color.Green) }
 
         drawLatch = CountDownLatch(1)
         rule.runOnUiThreadIR { model.value = rectShape }
 
-        takeScreenShot(30).apply {
-            assertRect(Color.Cyan, size = 30)
-        }
+        takeScreenShot(30).apply { assertRect(Color.Cyan, size = 30) }
     }
 
     @SdkSuppress(minSdkVersion = Build.VERSION_CODES.O)
@@ -439,54 +425,48 @@
             )
         }
 
-        val clip = Modifier.graphicsLayer {
-            shape = model.value
-            clip = true
-            drawLatch.countDown()
-        }
+        val clip =
+            Modifier.graphicsLayer {
+                shape = model.value
+                clip = true
+                drawLatch.countDown()
+            }
 
         rule.runOnUiThreadIR {
             activity.setContent {
                 AtLeastSize(
                     size = 30,
-                    modifier = Modifier
-                        .background(Color.Green)
-                        .then(clip)
-                        .drawBehind(drawCallback)
-                ) {
-                }
+                    modifier = Modifier.background(Color.Green).then(clip).drawBehind(drawCallback)
+                ) {}
             }
         }
 
-        takeScreenShot(30).apply {
-            assertTriangle(Color.Cyan, Color.Green)
-        }
+        takeScreenShot(30).apply { assertTriangle(Color.Cyan, Color.Green) }
 
         drawLatch = CountDownLatch(1)
         rule.runOnUiThreadIR { model.value = invertedTriangleShape }
 
-        takeScreenShot(30).apply {
-            assertInvertedTriangle(Color.Cyan, Color.Green)
-        }
+        takeScreenShot(30).apply { assertInvertedTriangle(Color.Cyan, Color.Green) }
     }
 
     @SdkSuppress(minSdkVersion = Build.VERSION_CODES.O)
     @Test
     fun switchBetweenDifferentOutlines_differentPath_observableShape() {
         var invertedTriangle by mutableStateOf(false)
-        val observableShape = object : Shape {
-            override fun createOutline(
-                size: Size,
-                layoutDirection: LayoutDirection,
-                density: Density
-            ): Outline {
-              return if (invertedTriangle) {
-                  invertedTriangleShape.createOutline(size, layoutDirection, density)
-              } else {
-                  triangleShape.createOutline(size, layoutDirection, density)
-              }
+        val observableShape =
+            object : Shape {
+                override fun createOutline(
+                    size: Size,
+                    layoutDirection: LayoutDirection,
+                    density: Density
+                ): Outline {
+                    return if (invertedTriangle) {
+                        invertedTriangleShape.createOutline(size, layoutDirection, density)
+                    } else {
+                        triangleShape.createOutline(size, layoutDirection, density)
+                    }
+                }
             }
-        }
         // to be replaced with a DrawModifier wrapped into remember, so the recomposition
         // is not causing invalidation as the DrawModifier didn't change
         val drawCallback: DrawScope.() -> Unit = {
@@ -497,35 +477,28 @@
             )
         }
 
-        val clip = Modifier.graphicsLayer {
-            shape = observableShape
-            clip = true
-            drawLatch.countDown()
-        }
+        val clip =
+            Modifier.graphicsLayer {
+                shape = observableShape
+                clip = true
+                drawLatch.countDown()
+            }
 
         rule.runOnUiThreadIR {
             activity.setContent {
                 AtLeastSize(
                     size = 30,
-                    modifier = Modifier
-                        .background(Color.Green)
-                        .then(clip)
-                        .drawBehind(drawCallback)
-                ) {
-                }
+                    modifier = Modifier.background(Color.Green).then(clip).drawBehind(drawCallback)
+                ) {}
             }
         }
 
-        takeScreenShot(30).apply {
-            assertTriangle(Color.Cyan, Color.Green)
-        }
+        takeScreenShot(30).apply { assertTriangle(Color.Cyan, Color.Green) }
 
         drawLatch = CountDownLatch(1)
         rule.runOnUiThreadIR { invertedTriangle = true }
 
-        takeScreenShot(30).apply {
-            assertInvertedTriangle(Color.Cyan, Color.Green)
-        }
+        takeScreenShot(30).apply { assertInvertedTriangle(Color.Cyan, Color.Green) }
     }
 
     @SdkSuppress(minSdkVersion = Build.VERSION_CODES.O)
@@ -533,22 +506,24 @@
     fun switchBetweenDifferentOutlines_samePath_observableShape() {
         var invertedTriangle by mutableStateOf(false)
         val path = Path()
-        val observableShape = object : Shape {
-            override fun createOutline(
-                size: Size,
-                layoutDirection: LayoutDirection,
-                density: Density
-            ): Outline {
-                val outline = if (invertedTriangle) {
-                    invertedTriangleShape.createOutline(size, layoutDirection, density)
-                } else {
-                    triangleShape.createOutline(size, layoutDirection, density)
+        val observableShape =
+            object : Shape {
+                override fun createOutline(
+                    size: Size,
+                    layoutDirection: LayoutDirection,
+                    density: Density
+                ): Outline {
+                    val outline =
+                        if (invertedTriangle) {
+                            invertedTriangleShape.createOutline(size, layoutDirection, density)
+                        } else {
+                            triangleShape.createOutline(size, layoutDirection, density)
+                        }
+                    path.reset()
+                    path.addOutline(outline)
+                    return Outline.Generic(path)
                 }
-                path.reset()
-                path.addOutline(outline)
-                return Outline.Generic(path)
             }
-        }
         // to be replaced with a DrawModifier wrapped into remember, so the recomposition
         // is not causing invalidation as the DrawModifier didn't change
         val drawCallback: DrawScope.() -> Unit = {
@@ -559,35 +534,28 @@
             )
         }
 
-        val clip = Modifier.graphicsLayer {
-            shape = observableShape
-            clip = true
-            drawLatch.countDown()
-        }
+        val clip =
+            Modifier.graphicsLayer {
+                shape = observableShape
+                clip = true
+                drawLatch.countDown()
+            }
 
         rule.runOnUiThreadIR {
             activity.setContent {
                 AtLeastSize(
                     size = 30,
-                    modifier = Modifier
-                        .background(Color.Green)
-                        .then(clip)
-                        .drawBehind(drawCallback)
-                ) {
-                }
+                    modifier = Modifier.background(Color.Green).then(clip).drawBehind(drawCallback)
+                ) {}
             }
         }
 
-        takeScreenShot(30).apply {
-            assertTriangle(Color.Cyan, Color.Green)
-        }
+        takeScreenShot(30).apply { assertTriangle(Color.Cyan, Color.Green) }
 
         drawLatch = CountDownLatch(1)
         rule.runOnUiThreadIR { invertedTriangle = true }
 
-        takeScreenShot(30).apply {
-            assertInvertedTriangle(Color.Cyan, Color.Green)
-        }
+        takeScreenShot(30).apply { assertInvertedTriangle(Color.Cyan, Color.Green) }
     }
 
     @SdkSuppress(minSdkVersion = Build.VERSION_CODES.O)
@@ -598,24 +566,20 @@
         rule.runOnUiThreadIR {
             activity.setContent {
                 Padding(size = 10, modifier = Modifier.fillColor(Color.Green)) {
-                    val modifier = if (model.value) {
-                        Modifier
-                            .clip(rectShape)
-                            .fillColor(Color.Cyan)
-                    } else {
-                        Modifier
-                    }
-                    AtLeastSize(size = 10, modifier = modifier) {
-                    }
+                    val modifier =
+                        if (model.value) {
+                            Modifier.clip(rectShape).fillColor(Color.Cyan)
+                        } else {
+                            Modifier
+                        }
+                    AtLeastSize(size = 10, modifier = modifier) {}
                 }
             }
         }
         Assert.assertTrue(drawLatch.await(1, TimeUnit.SECONDS))
 
         drawLatch = CountDownLatch(1)
-        rule.runOnUiThreadIR {
-            model.value = true
-        }
+        rule.runOnUiThreadIR { model.value = true }
 
         takeScreenShot(30).apply {
             assertRect(Color.Cyan, size = 10)
@@ -627,42 +591,37 @@
     @Test
     fun switchLayoutDirection() {
         val direction = mutableStateOf(LayoutDirection.Ltr)
-        val shape = object : Shape {
-            override fun createOutline(
-                size: Size,
-                layoutDirection: LayoutDirection,
-                density: Density
-            ) = if (layoutDirection == LayoutDirection.Ltr) {
-                rectShape.createOutline(size, layoutDirection, density)
-            } else {
-                triangleShape.createOutline(size, layoutDirection, density)
+        val shape =
+            object : Shape {
+                override fun createOutline(
+                    size: Size,
+                    layoutDirection: LayoutDirection,
+                    density: Density
+                ) =
+                    if (layoutDirection == LayoutDirection.Ltr) {
+                        rectShape.createOutline(size, layoutDirection, density)
+                    } else {
+                        triangleShape.createOutline(size, layoutDirection, density)
+                    }
             }
-        }
 
         rule.runOnUiThreadIR {
             activity.setContent {
                 CompositionLocalProvider(LocalLayoutDirection provides direction.value) {
                     AtLeastSize(
                         size = 30,
-                        modifier = Modifier
-                            .fillColor(Color.Green)
-                            .clip(shape)
-                            .fillColor(Color.Cyan)
+                        modifier = Modifier.fillColor(Color.Green).clip(shape).fillColor(Color.Cyan)
                     ) {}
                 }
             }
         }
 
-        takeScreenShot(30).apply {
-            assertRect(Color.Cyan, size = 30)
-        }
+        takeScreenShot(30).apply { assertRect(Color.Cyan, size = 30) }
 
         drawLatch = CountDownLatch(1)
         rule.runOnUiThread { direction.value = LayoutDirection.Rtl }
 
-        takeScreenShot(30).apply {
-            assertTriangle(Color.Cyan, Color.Green)
-        }
+        takeScreenShot(30).apply { assertTriangle(Color.Cyan, Color.Green) }
     }
 
     @SdkSuppress(minSdkVersion = Build.VERSION_CODES.O)
@@ -672,39 +631,34 @@
         rule.runOnUiThread {
             activity.setContent {
                 Box(
-                    modifier = Modifier
-                        .background(Color.White)
-                        .layout { measurable, constraints ->
-                            val placeable = measurable.measure(constraints)
-                            layout(30, 30) {
-                                placeable.place(IntOffset.Zero)
+                    modifier =
+                        Modifier.background(Color.White)
+                            .layout { measurable, constraints ->
+                                val placeable = measurable.measure(constraints)
+                                layout(30, 30) { placeable.place(IntOffset.Zero) }
                             }
-                        }
-                        .layout { measurable, constraints ->
-                            val placeable = measurable.measure(Constraints.fixed(sizePx, sizePx))
-                            layout(
-                                constraints.constrainWidth(sizePx),
-                                constraints.constrainHeight(sizePx)
-                            ) {
-                                placeable.place(IntOffset.Zero)
+                            .layout { measurable, constraints ->
+                                val placeable =
+                                    measurable.measure(Constraints.fixed(sizePx, sizePx))
+                                layout(
+                                    constraints.constrainWidth(sizePx),
+                                    constraints.constrainHeight(sizePx)
+                                ) {
+                                    placeable.place(IntOffset.Zero)
+                                }
                             }
-                        }
-                        .clipToBounds()
-                        .fillColor(Color.Red)
+                            .clipToBounds()
+                            .fillColor(Color.Red)
                 )
             }
         }
 
-        takeScreenShot(30).apply {
-            assertRect(Color.Red, size = 20, centerX = 10, centerY = 10)
-        }
+        takeScreenShot(30).apply { assertRect(Color.Red, size = 20, centerX = 10, centerY = 10) }
 
         drawLatch = CountDownLatch(1)
         sizePx = 30
 
-        takeScreenShot(30).apply {
-            assertRect(Color.Red, size = 30)
-        }
+        takeScreenShot(30).apply { assertRect(Color.Red, size = 30) }
     }
 
     @SdkSuppress(minSdkVersion = Build.VERSION_CODES.O)
@@ -718,17 +672,15 @@
                 Box(Modifier.background(Color.White).size(viewDp))
 
                 AndroidView(
-                    modifier = Modifier
-                        .testTag("wrapper")
-                        .drawBehind {
+                    modifier =
+                        Modifier.testTag("wrapper").drawBehind {
                             drawRect(Color.Green)
                             drawLatch.countDown()
                         },
                     factory = {
                         object : View(it) {
-                            val paint = Paint().apply {
-                                color = Color.Red.toArgb()
-                            }
+                            val paint = Paint().apply { color = Color.Red.toArgb() }
+
                             override fun onDraw(canvas: Canvas) {
                                 canvas.drawRect(
                                     0f,
@@ -748,16 +700,12 @@
             }
         }
 
-        takeScreenShot(viewSize).apply {
-            assertRect(Color.Red)
-        }
+        takeScreenShot(viewSize).apply { assertRect(Color.Red) }
 
         drawLatch = CountDownLatch(1)
         rule.runOnUiThread { view?.visibility = View.GONE }
 
-        takeScreenShot(viewSize).apply {
-            assertRect(Color.White)
-        }
+        takeScreenShot(viewSize).apply { assertRect(Color.White) }
     }
 
     private fun Modifier.fillColor(color: Color): Modifier {
diff --git a/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/draw/DrawModifierTest.kt b/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/draw/DrawModifierTest.kt
index 90d23bd..39e6b37 100644
--- a/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/draw/DrawModifierTest.kt
+++ b/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/draw/DrawModifierTest.kt
@@ -99,8 +99,7 @@
 @RunWith(AndroidJUnit4::class)
 class DrawModifierTest {
 
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
     @Before
     fun before() {
@@ -118,9 +117,7 @@
         val useGraphicsLayerComposable = mutableStateOf(true)
         rule.setContent {
             if (useGraphicsLayerComposable.value) {
-                Box(modifier = Modifier.size(100.dp)) {
-                    graphicsLayer = rememberGraphicsLayer()
-                }
+                Box(modifier = Modifier.size(100.dp)) { graphicsLayer = rememberGraphicsLayer() }
             }
         }
         rule.waitForIdle()
@@ -143,19 +140,22 @@
         val tag = "testTag"
         rule.setContent {
             graphicsLayer = rememberGraphicsLayer()
-            Box(modifier = Modifier.testTag(tag).size(100.dp).background(Color.Red).drawWithCache {
-                if (doRecord) {
-                    graphicsLayer!!.record {
-                        recordCalls++
-                        drawRect(Color.Blue)
+            Box(
+                modifier =
+                    Modifier.testTag(tag).size(100.dp).background(Color.Red).drawWithCache {
+                        if (doRecord) {
+                            graphicsLayer!!.record {
+                                recordCalls++
+                                drawRect(Color.Blue)
+                            }
+                        }
+                        onDrawWithContent {
+                            if (shouldDraw) {
+                                drawLayer(graphicsLayer!!)
+                            }
+                        }
                     }
-                }
-                onDrawWithContent {
-                    if (shouldDraw) {
-                        drawLayer(graphicsLayer!!)
-                    }
-                }
-            })
+            )
         }
 
         rule.runOnIdle {
@@ -172,9 +172,7 @@
 
         rule.onNodeWithTag(tag).captureToImage().assertPixels { Color.Red }
 
-        rule.runOnIdle {
-            shouldDraw = true
-        }
+        rule.runOnIdle { shouldDraw = true }
 
         rule.onNodeWithTag(tag).captureToImage().assertPixels { Color.Blue }
 
@@ -190,22 +188,22 @@
         val useCacheModifier = mutableStateOf(true)
         val cacheLatch = CountDownLatch(1)
         rule.setContent {
-            Box(modifier =
-            Modifier
-                .size(120.dp)
-                .then(
-                    if (useCacheModifier.value) {
-                        Modifier.drawWithCache {
-                            graphicsLayer = obtainGraphicsLayer()
-                            cacheLatch.countDown()
-                            onDrawBehind {
-                                // NO-OP
+            Box(
+                modifier =
+                    Modifier.size(120.dp)
+                        .then(
+                            if (useCacheModifier.value) {
+                                Modifier.drawWithCache {
+                                    graphicsLayer = obtainGraphicsLayer()
+                                    cacheLatch.countDown()
+                                    onDrawBehind {
+                                        // NO-OP
+                                    }
+                                }
+                            } else {
+                                Modifier
                             }
-                        }
-                    } else {
-                        Modifier
-                    }
-                )
+                        )
             )
         }
         rule.waitForIdle()
@@ -226,27 +224,27 @@
         var drawLatch = CountDownLatch(1)
         val tag = "tag"
         rule.setContent {
-            var providedLayoutDirection by remember {
-                mutableStateOf(LayoutDirection.Ltr)
-            }
+            var providedLayoutDirection by remember { mutableStateOf(LayoutDirection.Ltr) }
             Column {
                 CompositionLocalProvider(LocalLayoutDirection provides providedLayoutDirection) {
-                    Button(modifier = Modifier.testTag(tag), onClick = {
-                        providedLayoutDirection =
-                            if (providedLayoutDirection == LayoutDirection.Ltr) {
-                                LayoutDirection.Rtl
-                            } else {
-                                LayoutDirection.Ltr
-                            }
-                    }) {
-                        Text(modifier = Modifier
-                            .drawWithCache {
-                                resolvedLayoutDirection = layoutDirection
-                                drawLatch.countDown()
-                                onDrawBehind {
-                                    drawLayoutDirection = layoutDirection
+                    Button(
+                        modifier = Modifier.testTag(tag),
+                        onClick = {
+                            providedLayoutDirection =
+                                if (providedLayoutDirection == LayoutDirection.Ltr) {
+                                    LayoutDirection.Rtl
+                                } else {
+                                    LayoutDirection.Ltr
                                 }
-                            },
+                        }
+                    ) {
+                        Text(
+                            modifier =
+                                Modifier.drawWithCache {
+                                    resolvedLayoutDirection = layoutDirection
+                                    drawLatch.countDown()
+                                    onDrawBehind { drawLayoutDirection = layoutDirection }
+                                },
                             text = "Change Layout Direction"
                         )
                     }
@@ -277,21 +275,24 @@
             var providedDensity by remember { mutableStateOf(Density(2f, 2f)) }
             Column {
                 CompositionLocalProvider(LocalDensity provides providedDensity) {
-                    Button(modifier = Modifier.testTag(tag), onClick = {
-                        providedDensity = if (providedDensity.density == 2f) {
-                            Density(3f, 3f)
-                        } else {
-                            Density(2f, 2f)
-                        }
-                    }) {
-                        Text(modifier = Modifier
-                            .drawWithCache {
-                                resolvedDensity = Density(density, fontScale)
-                                drawLatch.countDown()
-                                onDrawBehind {
-                                    drawDensity = Density(density, fontScale)
+                    Button(
+                        modifier = Modifier.testTag(tag),
+                        onClick = {
+                            providedDensity =
+                                if (providedDensity.density == 2f) {
+                                    Density(3f, 3f)
+                                } else {
+                                    Density(2f, 2f)
                                 }
-                            },
+                        }
+                    ) {
+                        Text(
+                            modifier =
+                                Modifier.drawWithCache {
+                                    resolvedDensity = Density(density, fontScale)
+                                    drawLatch.countDown()
+                                    onDrawBehind { drawDensity = Density(density, fontScale) }
+                                },
                             text = "Change Layout Direction"
                         )
                     }
@@ -322,28 +323,22 @@
         val tintColor = Color.Blue
         rule.setContent {
             sizePx = with(LocalDensity.current) { size.toPx() }
-            Box(modifier =
-            Modifier
-                .size(size)
-                .testTag(testTag)
-                .then(
-                    Modifier.drawWithCache {
-                        val layer = obtainGraphicsLayer().also { graphicsLayer = it }
-                        layer.apply {
-                            record {
-                                drawContent()
+            Box(
+                modifier =
+                    Modifier.size(size)
+                        .testTag(testTag)
+                        .then(
+                            Modifier.drawWithCache {
+                                val layer = obtainGraphicsLayer().also { graphicsLayer = it }
+                                layer.apply {
+                                    record { drawContent() }
+                                    this.colorFilter = ColorFilter.tint(tintColor)
+                                }
+                                onDrawWithContent { drawLayer(layer) }
                             }
-                            this.colorFilter = ColorFilter.tint(tintColor)
-                        }
-                        onDrawWithContent {
-                            drawLayer(layer)
-                        }
-                    }
-                )
+                        )
             ) {
-                Canvas(modifier = Modifier.fillMaxSize()) {
-                    drawRect(Color.Red)
-                }
+                Canvas(modifier = Modifier.fillMaxSize()) { drawRect(Color.Red) }
             }
         }
         rule.waitForIdle()
@@ -370,25 +365,24 @@
         rule.setContent {
             val graphicsLayer = rememberGraphicsLayer()
             assertEquals(IntSize.Zero, graphicsLayer.size)
-            Box(modifier = Modifier
-                .size(120.dp)
-                .testTag(testTag)
-                .then(
-                    Modifier.drawWithCache {
-                        if (!isLayerRecorded) {
-                            graphicsLayer.record {
-                                drawRect(rectColor)
+            Box(
+                modifier =
+                    Modifier.size(120.dp)
+                        .testTag(testTag)
+                        .then(
+                            Modifier.drawWithCache {
+                                if (!isLayerRecorded) {
+                                    graphicsLayer.record { drawRect(rectColor) }
+                                    isLayerRecorded = true
+                                }
+                                onDrawWithContent {
+                                    drawRect(bgColor)
+                                    if (drawGraphicsLayer.value % 4 == 0) {
+                                        drawLayer(graphicsLayer)
+                                    }
+                                }
                             }
-                            isLayerRecorded = true
-                        }
-                        onDrawWithContent {
-                            drawRect(bgColor)
-                            if (drawGraphicsLayer.value % 4 == 0) {
-                                drawLayer(graphicsLayer)
-                            }
-                        }
-                    }
-                )
+                        )
             )
         }
 
@@ -427,15 +421,10 @@
             Column(modifier = Modifier.testTag(testTag)) {
                 val layer = rememberGraphicsLayer()
                 Canvas(
-                    Modifier
-                        .size(40.dp)
-                        .background(Color.Green)
-                        .drawWithContent {
-                            layer.record {
-                                this@drawWithContent.drawContent()
-                            }
-                            drawLayer(layer)
-                        }
+                    Modifier.size(40.dp).background(Color.Green).drawWithContent {
+                        layer.record { this@drawWithContent.drawContent() }
+                        drawLayer(layer)
+                    }
                 ) {
                     drawRect(targetColor)
                 }
@@ -469,30 +458,31 @@
             var rectColor by remember { mutableStateOf(Color.Blue) }
             AtLeastSize(
                 size = size,
-                modifier = Modifier
-                    .testTag(testTag)
-                    .drawWithCache {
-                        val drawSize = this.size
-                        val path = Path().apply {
-                            lineTo(drawSize.width / 2f, 0f)
-                            lineTo(drawSize.width / 2f, drawSize.height)
-                            lineTo(0f, drawSize.height)
-                            close()
+                modifier =
+                    Modifier.testTag(testTag)
+                        .drawWithCache {
+                            val drawSize = this.size
+                            val path =
+                                Path().apply {
+                                    lineTo(drawSize.width / 2f, 0f)
+                                    lineTo(drawSize.width / 2f, drawSize.height)
+                                    lineTo(0f, drawSize.height)
+                                    close()
+                                }
+                            cacheBuildCount++
+                            onDrawBehind {
+                                drawRect(rectColor)
+                                drawPath(path, Color.Red)
+                            }
                         }
-                        cacheBuildCount++
-                        onDrawBehind {
-                            drawRect(rectColor)
-                            drawPath(path, Color.Red)
+                        .clickable {
+                            if (rectColor == Color.Blue) {
+                                rectColor = Color.Green
+                            } else {
+                                rectColor = Color.Blue
+                            }
                         }
-                    }
-                    .clickable {
-                        if (rectColor == Color.Blue) {
-                            rectColor = Color.Green
-                        } else {
-                            rectColor = Color.Blue
-                        }
-                    }
-            ) { }
+            ) {}
         }
 
         rule.onNodeWithTag(testTag).apply {
@@ -537,17 +527,17 @@
         var drawLatch = CountDownLatch(1)
         rule.setContent {
             Box(Modifier.fillMaxSize()) {
-                Box(Modifier
-                    .graphicsLayer { }
-                    .size(50.dp)
-                    .drawWithCache {
-                        val rectSize = Size(size, size)
-                        onDrawBehind {
-                            drawRect(Color.Blue, Offset.Zero, rectSize)
-                            drawLatch.countDown()
+                Box(
+                    Modifier.graphicsLayer {}
+                        .size(50.dp)
+                        .drawWithCache {
+                            val rectSize = Size(size, size)
+                            onDrawBehind {
+                                drawRect(Color.Blue, Offset.Zero, rectSize)
+                                drawLatch.countDown()
+                            }
                         }
-                    }
-                    .graphicsLayer { }
+                        .graphicsLayer {}
                 )
             }
         }
@@ -571,26 +561,25 @@
             var pathFillBounds by remember { mutableStateOf(false) }
             AtLeastSize(
                 size = size,
-                modifier = Modifier
-                    .testTag(testTag)
-                    .drawWithCache {
-                        val pathSize = if (pathFillBounds) this.size else this.size / 2f
-                        val path = Path().apply {
-                            lineTo(pathSize.width, 0f)
-                            lineTo(pathSize.width, pathSize.height)
-                            lineTo(0f, pathSize.height)
-                            close()
+                modifier =
+                    Modifier.testTag(testTag)
+                        .drawWithCache {
+                            val pathSize = if (pathFillBounds) this.size else this.size / 2f
+                            val path =
+                                Path().apply {
+                                    lineTo(pathSize.width, 0f)
+                                    lineTo(pathSize.width, pathSize.height)
+                                    lineTo(0f, pathSize.height)
+                                    close()
+                                }
+                            cacheBuildCount++
+                            onDrawBehind {
+                                drawRect(Color.Red)
+                                drawPath(path, Color.Blue)
+                            }
                         }
-                        cacheBuildCount++
-                        onDrawBehind {
-                            drawRect(Color.Red)
-                            drawPath(path, Color.Blue)
-                        }
-                    }
-                    .clickable {
-                        pathFillBounds = !pathFillBounds
-                    }
-            ) { }
+                        .clickable { pathFillBounds = !pathFillBounds }
+            ) {}
         }
 
         rule.onNodeWithTag(testTag).apply {
@@ -632,28 +621,25 @@
     fun combinedModifiers_drawingSizesAreUsingTheSizeDefinedByLayoutModifier() {
         var drawingSize: Size = Size.Unspecified
         var drawingCacheSize: Size = Size.Unspecified
-        val modifier = object : LayoutModifier, DrawCacheModifier {
-            override fun onBuildCache(params: BuildDrawCacheParams) {
-                drawingCacheSize = params.size
-            }
+        val modifier =
+            object : LayoutModifier, DrawCacheModifier {
+                override fun onBuildCache(params: BuildDrawCacheParams) {
+                    drawingCacheSize = params.size
+                }
 
-            override fun ContentDrawScope.draw() {
-                drawingSize = size
-            }
+                override fun ContentDrawScope.draw() {
+                    drawingSize = size
+                }
 
-            override fun MeasureScope.measure(
-                measurable: Measurable,
-                constraints: Constraints
-            ): MeasureResult {
-                val placeable = measurable.measure(Constraints.fixed(10, 10))
-                return layout(20, 20) {
-                    placeable.place(0, 0)
+                override fun MeasureScope.measure(
+                    measurable: Measurable,
+                    constraints: Constraints
+                ): MeasureResult {
+                    val placeable = measurable.measure(Constraints.fixed(10, 10))
+                    return layout(20, 20) { placeable.place(0, 0) }
                 }
             }
-        }
-        rule.setContent {
-            Box(modifier)
-        }
+        rule.setContent { Box(modifier) }
 
         rule.runOnIdle {
             val expectedSize = Size(10f, 10f)
@@ -674,29 +660,28 @@
             var size by remember { mutableStateOf(startSize) }
             AtLeastSize(
                 size = size,
-                modifier = Modifier
-                    .testTag(testTag)
-                    .drawWithCache {
-                        val drawSize = this.size
-                        val path = Path().apply {
-                            lineTo(drawSize.width, 0f)
-                            lineTo(drawSize.height, drawSize.height)
-                            lineTo(0f, drawSize.height)
-                            close()
+                modifier =
+                    Modifier.testTag(testTag)
+                        .drawWithCache {
+                            val drawSize = this.size
+                            val path =
+                                Path().apply {
+                                    lineTo(drawSize.width, 0f)
+                                    lineTo(drawSize.height, drawSize.height)
+                                    lineTo(0f, drawSize.height)
+                                    close()
+                                }
+                            cacheBuildCount++
+                            onDrawBehind { drawPath(path, Color.Red) }
                         }
-                        cacheBuildCount++
-                        onDrawBehind {
-                            drawPath(path, Color.Red)
+                        .clickable {
+                            if (size == startSize) {
+                                size = endSize
+                            } else {
+                                size = startSize
+                            }
                         }
-                    }
-                    .clickable {
-                        if (size == startSize) {
-                            size = endSize
-                        } else {
-                            size = startSize
-                        }
-                    }
-            ) { }
+            ) {}
         }
 
         rule.onNodeWithTag(testTag).apply {
@@ -734,12 +719,13 @@
             CompositionLocalProvider(LocalLayoutDirection provides layoutDirection) {
                 AtLeastSize(
                     size = 10,
-                    modifier = Modifier.drawWithCache {
-                        realLayoutDirection = layoutDirection
-                        drawLatch.countDown()
-                        onDrawBehind {}
-                    }
-                ) { }
+                    modifier =
+                        Modifier.drawWithCache {
+                            realLayoutDirection = layoutDirection
+                            drawLatch.countDown()
+                            onDrawBehind {}
+                        }
+                ) {}
             }
         }
 
@@ -751,9 +737,7 @@
         }
 
         assertThat(drawLatch.await(2, TimeUnit.SECONDS)).isTrue()
-        rule.runOnIdle {
-            assertEquals(LayoutDirection.Rtl, realLayoutDirection)
-        }
+        rule.runOnIdle { assertEquals(LayoutDirection.Rtl, realLayoutDirection) }
     }
 
     @SdkSuppress(minSdkVersion = Build.VERSION_CODES.O)
@@ -769,17 +753,15 @@
             val color = remember { mutableStateOf(Color.Red) }
             AtLeastSize(
                 size = startSize,
-                modifier = Modifier
-                    .testTag(testTag)
-                    .drawPathHelperModifier(color.value)
-                    .clickable {
+                modifier =
+                    Modifier.testTag(testTag).drawPathHelperModifier(color.value).clickable {
                         if (color.value == Color.Red) {
                             color.value = Color.Blue
                         } else {
                             color.value = Color.Red
                         }
                     }
-            ) { }
+            ) {}
         }
 
         rule.onNodeWithTag(testTag).apply {
@@ -818,28 +800,17 @@
             Column {
                 AtLeastSize(
                     size = 50,
-                    modifier = Modifier
-                        .testTag(boxTag)
-                        .graphicsLayer()
-                        .drawWithCache {
+                    modifier =
+                        Modifier.testTag(boxTag).graphicsLayer().drawWithCache {
                             // State read of flag
                             val color = if (flag.value) Color.Red else Color.Blue
                             cacheBuildCount++
 
-                            onDrawBehind {
-                                drawRect(color)
-                            }
+                            onDrawBehind { drawRect(color) }
                         }
                 )
 
-                Box(
-                    Modifier
-                        .testTag(clickTag)
-                        .size(20.dp)
-                        .clickable {
-                            flag.value = !flag.value
-                        }
-                )
+                Box(Modifier.testTag(clickTag).size(20.dp).clickable { flag.value = !flag.value })
             }
         }
 
@@ -867,15 +838,14 @@
         this.then(
             Modifier.drawWithCache {
                 val drawSize = this.size
-                val path = Path().apply {
-                    lineTo(drawSize.width, 0f)
-                    lineTo(drawSize.height, drawSize.height)
-                    lineTo(0f, drawSize.height)
-                    close()
-                }
-                onDrawBehind {
-                    drawPath(path, color)
-                }
+                val path =
+                    Path().apply {
+                        lineTo(drawSize.width, 0f)
+                        lineTo(drawSize.height, drawSize.height)
+                        lineTo(0f, drawSize.height)
+                        close()
+                    }
+                onDrawBehind { drawPath(path, color) }
             }
         )
 
@@ -890,14 +860,14 @@
         rule.setContent {
             AtLeastSize(
                 size = testSize,
-                modifier = Modifier
-                    .testTag(testTag)
-                    .drawWithCache {
-                        onDrawBehind {
-                            drawRect(Color.Red, size = Size(size.width / 2, size.height))
+                modifier =
+                    Modifier.testTag(testTag)
+                        .drawWithCache {
+                            onDrawBehind {
+                                drawRect(Color.Red, size = Size(size.width / 2, size.height))
+                            }
                         }
-                    }
-                    .background(Color.Blue)
+                        .background(Color.Blue)
             )
         }
 
@@ -922,15 +892,15 @@
         rule.setContent {
             AtLeastSize(
                 size = testSize,
-                modifier = Modifier
-                    .testTag(testTag)
-                    .drawWithCache {
-                        onDrawWithContent {
-                            drawContent()
-                            drawRect(Color.Red, size = Size(size.width / 2, size.height))
+                modifier =
+                    Modifier.testTag(testTag)
+                        .drawWithCache {
+                            onDrawWithContent {
+                                drawContent()
+                                drawRect(Color.Red, size = Size(size.width / 2, size.height))
+                            }
                         }
-                    }
-                    .background(Color.Blue)
+                        .background(Color.Blue)
             )
         }
 
@@ -959,15 +929,15 @@
         rule.setContent {
             AtLeastSize(
                 size = testSize,
-                modifier = Modifier
-                    .testTag(testTag)
-                    .drawWithCache {
-                        onDrawWithContent {
-                            drawContent()
-                            drawRect(Color.Green, blendMode = BlendMode.Plus)
+                modifier =
+                    Modifier.testTag(testTag)
+                        .drawWithCache {
+                            onDrawWithContent {
+                                drawContent()
+                                drawRect(Color.Green, blendMode = BlendMode.Plus)
+                            }
                         }
-                    }
-                    .background(Color.Blue)
+                        .background(Color.Blue)
             )
         }
 
@@ -1028,9 +998,7 @@
         }
         rule.setContent {
             recompositionCounter.value
-            Layout({}, modifier = Modifier.drawBehind(drawBlock)) { _, _ ->
-                layout(100, 100) {}
-            }
+            Layout({}, modifier = Modifier.drawBehind(drawBlock)) { _, _ -> layout(100, 100) {} }
         }
 
         assertTrue(drawLatch.await(3000, TimeUnit.MILLISECONDS))
@@ -1039,18 +1007,14 @@
             recompositionCounter.value = 1
         }
 
-        rule.runOnIdle {
-            assertThat(redrawCounter).isEqualTo(1)
-        }
+        rule.runOnIdle { assertThat(redrawCounter).isEqualTo(1) }
     }
 
     @Test
     fun recompositionWithTheSameDrawWithContentLambdaIsNotTriggeringRedraw() {
         val recompositionCounter = mutableStateOf(0)
         var redrawCounter = 0
-        val drawBlock: ContentDrawScope.() -> Unit = {
-            redrawCounter++
-        }
+        val drawBlock: ContentDrawScope.() -> Unit = { redrawCounter++ }
         rule.setContent {
             recompositionCounter.value
             Layout({}, modifier = Modifier.drawWithContent(drawBlock)) { _, _ ->
@@ -1063,9 +1027,7 @@
             recompositionCounter.value = 1
         }
 
-        rule.runOnIdle {
-            assertThat(redrawCounter).isEqualTo(1)
-        }
+        rule.runOnIdle { assertThat(redrawCounter).isEqualTo(1) }
     }
 
     @Test
@@ -1085,9 +1047,7 @@
         }
         rule.setContent {
             recompositionCounter.value
-            Layout({}, modifier = Modifier.drawWithCache(drawBlock)) { _, _ ->
-                layout(100, 100) {}
-            }
+            Layout({}, modifier = Modifier.drawWithCache(drawBlock)) { _, _ -> layout(100, 100) {} }
         }
 
         assertTrue(cacheLatch.await(3000, TimeUnit.MILLISECONDS))
@@ -1110,25 +1070,17 @@
         val testTag = "testTag"
         val size = 200
 
-        val node = object : DelegatingNode() {
-            val draw = delegate(DrawBackgroundModifier {
-                drawRect(Color.Red)
-            })
-        }
+        val node =
+            object : DelegatingNode() {
+                val draw = delegate(DrawBackgroundModifier { drawRect(Color.Red) })
+            }
 
         rule.setContent {
-            AtLeastSize(
-                size = size,
-                modifier = Modifier
-                    .testTag(testTag)
-                    .elementFor(node)
-            ) { }
+            AtLeastSize(size = size, modifier = Modifier.testTag(testTag).elementFor(node)) {}
         }
 
         rule.onNodeWithTag(testTag).apply {
-            captureToBitmap().apply {
-                assertEquals(Color.Red.toArgb(), getPixel(1, 1))
-            }
+            captureToBitmap().apply { assertEquals(Color.Red.toArgb(), getPixel(1, 1)) }
         }
     }
 
@@ -1137,29 +1089,21 @@
     fun testMultipleDelegatedDrawNodes() {
         val testTag = "testTag"
 
-        val node = object : DelegatingNode() {
-            val a = delegate(DrawBackgroundModifier {
-                drawRect(
-                    Color.Red,
-                    size = Size(10f, 10f)
-                )
-            })
+        val node =
+            object : DelegatingNode() {
+                val a =
+                    delegate(DrawBackgroundModifier { drawRect(Color.Red, size = Size(10f, 10f)) })
 
-            val b = delegate(DrawBackgroundModifier {
-                drawRect(
-                    Color.Blue,
-                    topLeft = Offset(10f, 0f),
-                    size = Size(10f, 10f))
-            })
-        }
+                val b =
+                    delegate(
+                        DrawBackgroundModifier {
+                            drawRect(Color.Blue, topLeft = Offset(10f, 0f), size = Size(10f, 10f))
+                        }
+                    )
+            }
 
         rule.setContent {
-            AtLeastSize(
-                size = 200,
-                modifier = Modifier
-                    .testTag(testTag)
-                    .elementFor(node)
-            ) { }
+            AtLeastSize(size = 200, modifier = Modifier.testTag(testTag).elementFor(node)) {}
         }
 
         rule.onNodeWithTag(testTag).apply {
@@ -1175,27 +1119,20 @@
     fun testDelegatedLayoutModifierNode() {
         val testTag = "testTag"
 
-        val node = object : DelegatingNode() {
-            val a = delegate(LayoutModifierImpl { measurable, constraints ->
-                val p = measurable.measure(constraints)
-                layout(10.dp.roundToPx(), 10.dp.roundToPx()) {
-                    p.place(0, 0)
-                }
-            })
-        }
+        val node =
+            object : DelegatingNode() {
+                val a =
+                    delegate(
+                        LayoutModifierImpl { measurable, constraints ->
+                            val p = measurable.measure(constraints)
+                            layout(10.dp.roundToPx(), 10.dp.roundToPx()) { p.place(0, 0) }
+                        }
+                    )
+            }
 
-        rule.setContent {
-            Box(
-                modifier = Modifier
-                    .testTag(testTag)
-                    .elementFor(node)
-            )
-        }
+        rule.setContent { Box(modifier = Modifier.testTag(testTag).elementFor(node)) }
 
-        rule
-            .onNodeWithTag(testTag)
-            .assertWidthIsEqualTo(10.dp)
-            .assertHeightIsEqualTo(10.dp)
+        rule.onNodeWithTag(testTag).assertWidthIsEqualTo(10.dp).assertHeightIsEqualTo(10.dp)
     }
 
     @Test
@@ -1206,10 +1143,8 @@
 
         rule.setContent {
             Box(
-                Modifier
-                    .drawBehind {
-                        @Suppress("UNUSED_EXPRESSION")
-                        someState
+                Modifier.drawBehind {
+                        @Suppress("UNUSED_EXPRESSION") someState
                         drawCount++
                         drawLatch.countDown()
                     }
diff --git a/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/draw/DrawReorderingTest.kt b/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/draw/DrawReorderingTest.kt
index ebea073..677afbd 100644
--- a/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/draw/DrawReorderingTest.kt
+++ b/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/draw/DrawReorderingTest.kt
@@ -58,11 +58,8 @@
 class DrawReorderingTest {
     @Suppress("DEPRECATION")
     @get:Rule
-    val rule = androidx.test.rule.ActivityTestRule<TestActivity>(
-        TestActivity::class.java
-    )
-    @get:Rule
-    val excessiveAssertions = AndroidOwnerExtraAssertionsRule()
+    val rule = androidx.test.rule.ActivityTestRule<TestActivity>(TestActivity::class.java)
+    @get:Rule val excessiveAssertions = AndroidOwnerExtraAssertionsRule()
 
     private lateinit var activity: TestActivity
     private lateinit var drawLatch: CountDownLatch
@@ -81,27 +78,17 @@
             activity.setContent {
                 Layout(
                     content = {
-                        FixedSize(
-                            10,
-                            Modifier.padding(10)
-                                .background(Color.White)
-                        )
+                        FixedSize(10, Modifier.padding(10).background(Color.White))
                         FixedSize(
                             30,
-                            Modifier.graphicsLayer()
-                                .background(Color.Red)
-                                .drawLatchModifier()
+                            Modifier.graphicsLayer().background(Color.Red).drawLatchModifier()
                         )
                     }
                 ) { measurables, _ ->
                     val newConstraints = Constraints.fixed(30, 30)
-                    val placeables = measurables.map { m ->
-                        m.measure(newConstraints)
-                    }
+                    val placeables = measurables.map { m -> m.measure(newConstraints) }
                     layout(newConstraints.maxWidth, newConstraints.maxWidth) {
-                        placeables.forEach { child ->
-                            child.placeRelative(0, 0)
-                        }
+                        placeables.forEach { child -> child.placeRelative(0, 0) }
                     }
                 }
             }
@@ -121,27 +108,17 @@
             activity.setContent {
                 Layout(
                     content = {
-                        FixedSize(
-                            10,
-                            Modifier.padding(10)
-                                .background(Color.White)
-                        )
+                        FixedSize(10, Modifier.padding(10).background(Color.White))
                         FixedSize(
                             30,
-                            Modifier.graphicsLayer()
-                                .background(Color.Red)
-                                .drawLatchModifier()
+                            Modifier.graphicsLayer().background(Color.Red).drawLatchModifier()
                         )
                     }
                 ) { measurables, _ ->
                     val newConstraints = Constraints.fixed(30, 30)
-                    val placeables = measurables.map { m ->
-                        m.measure(newConstraints)
-                    }
+                    val placeables = measurables.map { m -> m.measure(newConstraints) }
                     layout(newConstraints.maxWidth, newConstraints.maxWidth) {
-                        placeables.reversed().forEach { child ->
-                            child.placeRelative(0, 0)
-                        }
+                        placeables.reversed().forEach { child -> child.placeRelative(0, 0) }
                     }
                 }
             }
@@ -161,11 +138,7 @@
             activity.setContent {
                 Layout(
                     content = {
-                        FixedSize(
-                            10,
-                            Modifier.padding(10)
-                                .background(Color.White)
-                        )
+                        FixedSize(10, Modifier.padding(10).background(Color.White))
                         FixedSize(
                             30,
                             Modifier.graphicsLayer()
@@ -176,13 +149,9 @@
                     }
                 ) { measurables, _ ->
                     val newConstraints = Constraints.fixed(30, 30)
-                    val placeables = measurables.map { m ->
-                        m.measure(newConstraints)
-                    }
+                    val placeables = measurables.map { m -> m.measure(newConstraints) }
                     layout(newConstraints.maxWidth, newConstraints.maxWidth) {
-                        placeables.reversed().forEach { child ->
-                            child.placeRelative(0, 0)
-                        }
+                        placeables.reversed().forEach { child -> child.placeRelative(0, 0) }
                     }
                 }
             }
@@ -202,11 +171,7 @@
             activity.setContent {
                 Layout(
                     content = {
-                        FixedSize(
-                            10,
-                            Modifier.padding(10)
-                                .background(Color.White)
-                        )
+                        FixedSize(10, Modifier.padding(10).background(Color.White))
                         FixedSize(
                             30,
                             Modifier.graphicsLayer()
@@ -217,9 +182,7 @@
                     }
                 ) { measurables, _ ->
                     val newConstraints = Constraints.fixed(30, 30)
-                    val placeables = measurables.map { m ->
-                        m.measure(newConstraints)
-                    }
+                    val placeables = measurables.map { m -> m.measure(newConstraints) }
                     layout(newConstraints.maxWidth, newConstraints.maxWidth) {
                         placeables.reversed().forEach { child ->
                             child.place(0, 0, zIndex = placeables.indexOf(child).toFloat())
@@ -245,27 +208,17 @@
                     content = {
                         FixedSize(
                             30,
-                            Modifier.graphicsLayer()
-                                .background(Color.Red)
-                                .drawLatchModifier()
+                            Modifier.graphicsLayer().background(Color.Red).drawLatchModifier()
                         )
-                        FixedSize(
-                            10,
-                            Modifier.padding(10)
-                                .background(Color.White)
-                        )
+                        FixedSize(10, Modifier.padding(10).background(Color.White))
                         FixedSize(
                             30,
-                            Modifier.graphicsLayer()
-                                .background(Color.Blue)
-                                .drawLatchModifier()
+                            Modifier.graphicsLayer().background(Color.Blue).drawLatchModifier()
                         )
                     }
                 ) { measurables, _ ->
                     val newConstraints = Constraints.fixed(30, 30)
-                    val placeables = measurables.map { m ->
-                        m.measure(newConstraints)
-                    }
+                    val placeables = measurables.map { m -> m.measure(newConstraints) }
                     layout(newConstraints.maxWidth, newConstraints.maxWidth) {
                         placeables[2].place(0, 0)
                         placeables[0].place(0, 0)
@@ -288,11 +241,7 @@
         val latch = CountDownLatch(1)
         rule.runOnUiThread {
             activity.setContent {
-                Layout(
-                    content = {
-                        FixedSize(30)
-                    }
-                ) { measurables, constraints ->
+                Layout(content = { FixedSize(30) }) { measurables, constraints ->
                     val placeables = measurables.first().measure(constraints)
                     layout(30, 30) {
                         placeables.place(0, 0)
@@ -316,20 +265,11 @@
     fun testSiblingZOrder() {
         rule.runOnUiThread {
             activity.setContent {
-                FixedSize(
-                    size = 30
-                ) {
-                    FixedSize(
-                        10,
-                        Modifier.padding(10)
-                            .zIndex(1f)
-                            .background(Color.White)
-                    )
+                FixedSize(size = 30) {
+                    FixedSize(10, Modifier.padding(10).zIndex(1f).background(Color.White))
                     FixedSize(
                         30,
-                        Modifier.graphicsLayer()
-                            .background(Color.Red)
-                            .drawLatchModifier()
+                        Modifier.graphicsLayer().background(Color.Red).drawLatchModifier()
                     )
                 }
             }
@@ -347,20 +287,9 @@
     fun testUncleZOrder() {
         rule.runOnUiThread {
             activity.setContent {
-                FixedSize(
-                    size = 30
-                ) {
-                    FixedSize(
-                        10,
-                        Modifier.padding(10)
-                            .zIndex(1f)
-                            .background(Color.White)
-                    )
-                    FixedSize(
-                        30,
-                        Modifier.background(Color.Red)
-                            .drawLatchModifier()
-                    )
+                FixedSize(size = 30) {
+                    FixedSize(10, Modifier.padding(10).zIndex(1f).background(Color.White))
+                    FixedSize(30, Modifier.background(Color.Red).drawLatchModifier())
                 }
             }
         }
@@ -377,23 +306,13 @@
     fun testCousinZOrder() {
         rule.runOnUiThread {
             activity.setContent {
-                FixedSize(
-                    size = 30
-                ) {
+                FixedSize(size = 30) {
                     FixedSize(10, Modifier.padding(10)) {
-                        FixedSize(
-                            10,
-                            Modifier.zIndex(1f)
-                                .background(Color.Green)
-                        )
+                        FixedSize(10, Modifier.zIndex(1f).background(Color.Green))
                     }
                     FixedSize(30, Modifier.background(Color.Red))
                     FixedSize(10, Modifier.padding(10)) {
-                        FixedSize(
-                            10,
-                            Modifier.background(Color.White)
-                                .drawLatchModifier()
-                        )
+                        FixedSize(10, Modifier.background(Color.White).drawLatchModifier())
                     }
                 }
             }
@@ -411,21 +330,11 @@
     fun testCousinZOrder2() {
         rule.runOnUiThread {
             activity.setContent {
-                FixedSize(
-                    size = 30
-                ) {
+                FixedSize(size = 30) {
                     FixedSize(10, Modifier.padding(10)) {
-                        FixedSize(
-                            10,
-                            Modifier.zIndex(1f)
-                                .background(Color.Green)
-                        )
+                        FixedSize(10, Modifier.zIndex(1f).background(Color.Green))
                     }
-                    FixedSize(
-                        30,
-                        Modifier.background(Color.Red)
-                            .drawLatchModifier()
-                    )
+                    FixedSize(30, Modifier.background(Color.Red).drawLatchModifier())
                 }
             }
         }
@@ -444,24 +353,10 @@
         val view = View(activity)
         rule.runOnUiThread {
             activity.setContent {
-                FixedSize(
-                    size = 30
-                ) {
-                    FixedSize(
-                        10,
-                        Modifier.padding(10)
-                            .zIndex(state.value)
-                            .background(Color.Black)
-                    )
-                    FixedSize(
-                        30,
-                        Modifier.background(Color.Red)
-                            .drawLatchModifier()
-                    )
-                    FixedSize(
-                        10,
-                        Modifier.padding(10).background(Color.White)
-                    )
+                FixedSize(size = 30) {
+                    FixedSize(10, Modifier.padding(10).zIndex(state.value).background(Color.Black))
+                    FixedSize(30, Modifier.background(Color.Red).drawLatchModifier())
+                    FixedSize(10, Modifier.padding(10).background(Color.White))
                 }
             }
             activity.addContentView(view, ViewGroup.LayoutParams(1, 1))
@@ -473,12 +368,12 @@
             drawLatch = drawLatch
         )
 
-        val onDrawListener = object :
-            ViewTreeObserver.OnDrawListener {
-            override fun onDraw() {
-                drawLatch.countDown()
+        val onDrawListener =
+            object : ViewTreeObserver.OnDrawListener {
+                override fun onDraw() {
+                    drawLatch.countDown()
+                }
             }
-        }
         drawLatch = CountDownLatch(1)
         rule.runOnUiThread {
             view.viewTreeObserver.addOnDrawListener(onDrawListener)
@@ -509,17 +404,15 @@
     @SdkSuppress(minSdkVersion = Build.VERSION_CODES.O)
     fun testChangingZOrderReusingModifiers() {
         val state = mutableStateOf(0f)
-        val zIndex = Modifier.layout { measurable, constraints ->
-            val placeable = measurable.measure(constraints)
-            layout(placeable.width, placeable.height) {
-                placeable.place(0, 0, zIndex = state.value)
+        val zIndex =
+            Modifier.layout { measurable, constraints ->
+                val placeable = measurable.measure(constraints)
+                layout(placeable.width, placeable.height) {
+                    placeable.place(0, 0, zIndex = state.value)
+                }
             }
-        }
-        val modifier1 = Modifier.padding(10)
-            .then(zIndex)
-            .background(Color.White)
-        val modifier2 = Modifier.background(Color.Red)
-            .drawLatchModifier()
+        val modifier1 = Modifier.padding(10).then(zIndex).background(Color.White)
+        val modifier2 = Modifier.background(Color.Red).drawLatchModifier()
         val view = View(activity)
         rule.runOnUiThread {
             activity.setContent {
@@ -537,12 +430,12 @@
             drawLatch = drawLatch
         )
 
-        val onDrawListener = object :
-            ViewTreeObserver.OnDrawListener {
-            override fun onDraw() {
-                drawLatch.countDown()
+        val onDrawListener =
+            object : ViewTreeObserver.OnDrawListener {
+                override fun onDraw() {
+                    drawLatch.countDown()
+                }
             }
-        }
         drawLatch = CountDownLatch(1)
         rule.runOnUiThread {
             view.viewTreeObserver.addOnDrawListener(onDrawListener)
@@ -574,31 +467,16 @@
     @SdkSuppress(minSdkVersion = Build.VERSION_CODES.O)
     fun testChangingZOrderUncle() {
         val state = mutableStateOf(0f)
-        val elevation = Modifier.graphicsLayer {
-            shadowElevation = state.value
-        }
+        val elevation = Modifier.graphicsLayer { shadowElevation = state.value }
         val view = View(activity)
         rule.runOnUiThread {
             activity.setContent {
-                FixedSize(
-                    size = 30
-                ) {
+                FixedSize(size = 30) {
                     FixedSize(30) {
-                        FixedSize(
-                            10,
-                            Modifier.padding(10).then(elevation).background(Color.Black)
-                        )
+                        FixedSize(10, Modifier.padding(10).then(elevation).background(Color.Black))
                     }
-                    FixedSize(
-                        30,
-                        Modifier.background(Color.Red)
-                            .drawLatchModifier()
-                    )
-                    FixedSize(
-                        10,
-                        Modifier.padding(10)
-                            .background(Color.White)
-                    )
+                    FixedSize(30, Modifier.background(Color.Red).drawLatchModifier())
+                    FixedSize(10, Modifier.padding(10).background(Color.White))
                 }
             }
             activity.addContentView(view, ViewGroup.LayoutParams(1, 1))
@@ -609,12 +487,12 @@
             size = 10,
             drawLatch = drawLatch
         )
-        val onDrawListener = object :
-            ViewTreeObserver.OnDrawListener {
-            override fun onDraw() {
-                drawLatch.countDown()
+        val onDrawListener =
+            object : ViewTreeObserver.OnDrawListener {
+                override fun onDraw() {
+                    drawLatch.countDown()
+                }
             }
-        }
         drawLatch = CountDownLatch(1)
         rule.runOnUiThread {
             view.viewTreeObserver.addOnDrawListener(onDrawListener)
@@ -636,21 +514,9 @@
         val view = View(activity)
         rule.runOnUiThread {
             activity.setContent {
-                AtLeastSize(
-                    size = 30,
-                    modifier = Modifier.background(Color.Red)
-                ) {
-                    FixedSize(
-                        size,
-                        Modifier.padding(10)
-                            .zIndex(1f)
-                            .background(Color.White)
-                    )
-                    FixedSize(
-                        30,
-                        Modifier.background(Color.Red)
-                            .drawLatchModifier()
-                    )
+                AtLeastSize(size = 30, modifier = Modifier.background(Color.Red)) {
+                    FixedSize(size, Modifier.padding(10).zIndex(1f).background(Color.White))
+                    FixedSize(30, Modifier.background(Color.Red).drawLatchModifier())
                 }
             }
             activity.addContentView(view, ViewGroup.LayoutParams(1, 1))
@@ -661,12 +527,12 @@
             size = 10,
             drawLatch = drawLatch
         )
-        val onDrawListener = object :
-            ViewTreeObserver.OnDrawListener {
-            override fun onDraw() {
-                drawLatch.countDown()
+        val onDrawListener =
+            object : ViewTreeObserver.OnDrawListener {
+                override fun onDraw() {
+                    drawLatch.countDown()
+                }
             }
-        }
         drawLatch = CountDownLatch(1)
         rule.runOnUiThread {
             view.viewTreeObserver.addOnDrawListener(onDrawListener)
@@ -689,17 +555,8 @@
         rule.runOnUiThread {
             activity.setContent {
                 FixedSize(size = 30) {
-                    FixedSize(
-                        10,
-                        Modifier.padding(10)
-                            .zIndex(1f)
-                            .background(Color.White)
-                    )
-                    FixedSize(
-                        30,
-                        Modifier.background(color.value)
-                            .drawLatchModifier()
-                    )
+                    FixedSize(10, Modifier.padding(10).zIndex(1f).background(Color.White))
+                    FixedSize(30, Modifier.background(color.value).drawLatchModifier())
                 }
             }
         }
@@ -710,9 +567,7 @@
             drawLatch = drawLatch
         )
         drawLatch = CountDownLatch(1)
-        rule.runOnUiThread {
-            color.value = Color.Blue
-        }
+        rule.runOnUiThread { color.value = Color.Blue }
         rule.validateSquareColors(
             outerColor = Color.Blue,
             innerColor = Color.White,
@@ -726,22 +581,14 @@
     fun sumOfAllZIndexesIsUsed() {
         rule.runOnUiThread {
             activity.setContent {
-                FixedSize(
-                    size = 30
-                ) {
+                FixedSize(size = 30) {
                     FixedSize(
                         10,
-                        Modifier.padding(10)
-                            .zIndex(2f)
-                            .zIndex(2f)
-                            .background(Color.White)
+                        Modifier.padding(10).zIndex(2f).zIndex(2f).background(Color.White)
                     )
                     FixedSize(
                         30,
-                        Modifier.zIndex(4f)
-                            .zIndex(-1f)
-                            .background(Color.Red)
-                            .drawLatchModifier()
+                        Modifier.zIndex(4f).zIndex(-1f).background(Color.Red).drawLatchModifier()
                     )
                 }
             }
@@ -761,12 +608,7 @@
         rule.runOnUiThread {
             activity.setContent {
                 FixedSize(size = 30) {
-                    FixedSize(
-                        10,
-                        Modifier.padding(10)
-                            .zIndex(1f)
-                            .background(Color.White)
-                    )
+                    FixedSize(10, Modifier.padding(10).zIndex(1f).background(Color.White))
                     FixedSize(30, Modifier.background(color.value).drawLatchModifier())
                 }
             }
@@ -778,9 +620,7 @@
             drawLatch = drawLatch
         )
         drawLatch = CountDownLatch(1)
-        rule.runOnUiThread {
-            color.value = Color.Blue
-        }
+        rule.runOnUiThread { color.value = Color.Blue }
         rule.validateSquareColors(
             outerColor = Color.Blue,
             innerColor = Color.White,
@@ -794,9 +634,7 @@
     fun testShadowSizeIsNotCausingReorder() {
         rule.runOnUiThread {
             activity.setContent {
-                FixedSize(
-                    size = 30
-                ) {
+                FixedSize(size = 30) {
                     FixedSize(
                         10,
                         Modifier.padding(10)
@@ -805,9 +643,7 @@
                     )
                     FixedSize(
                         30,
-                        Modifier.graphicsLayer()
-                            .background(Color.Red)
-                            .drawLatchModifier()
+                        Modifier.graphicsLayer().background(Color.Red).drawLatchModifier()
                     )
                 }
             }
@@ -828,25 +664,15 @@
                 Layout(
                     content = {
                         FixedSize(30) {
-                            FixedSize(
-                                10,
-                                Modifier.padding(10)
-                                    .background(Color.White)
-                            )
+                            FixedSize(10, Modifier.padding(10).background(Color.White))
                         }
                         FixedSize(30) {
-                            FixedSize(
-                                30,
-                                Modifier.background(Color.Red)
-                                    .drawLatchModifier()
-                            )
+                            FixedSize(30, Modifier.background(Color.Red).drawLatchModifier())
                         }
                     }
                 ) { measurables, _ ->
                     val newConstraints = Constraints.fixed(30, 30)
-                    val placeables = measurables.map { m ->
-                        m.measure(newConstraints)
-                    }
+                    val placeables = measurables.map { m -> m.measure(newConstraints) }
                     layout(newConstraints.maxWidth, newConstraints.maxWidth) {
                         placeables[0].place(0, 0, zIndex = 1f)
                         placeables[1].place(0, 0, zIndex = 1f)
@@ -870,25 +696,15 @@
                 Layout(
                     content = {
                         FixedSize(30) {
-                            FixedSize(
-                                10,
-                                Modifier.padding(10)
-                                    .background(Color.White)
-                            )
+                            FixedSize(10, Modifier.padding(10).background(Color.White))
                         }
                         FixedSize(30) {
-                            FixedSize(
-                                30,
-                                Modifier.background(Color.Red)
-                                    .drawLatchModifier()
-                            )
+                            FixedSize(30, Modifier.background(Color.Red).drawLatchModifier())
                         }
                     }
                 ) { measurables, _ ->
                     val newConstraints = Constraints.fixed(30, 30)
-                    val placeables = measurables.map { m ->
-                        m.measure(newConstraints)
-                    }
+                    val placeables = measurables.map { m -> m.measure(newConstraints) }
                     layout(newConstraints.maxWidth, newConstraints.maxWidth) {
                         placeables[1].place(0, 0, zIndex = 1f)
                         placeables[0].place(0, 0, zIndex = 1f)
@@ -912,25 +728,15 @@
                 Layout(
                     content = {
                         FixedSize(30, Modifier.zIndex(2f)) {
-                            FixedSize(
-                                10,
-                                Modifier.padding(10)
-                                    .background(Color.White)
-                            )
+                            FixedSize(10, Modifier.padding(10).background(Color.White))
                         }
                         FixedSize(30) {
-                            FixedSize(
-                                30,
-                                Modifier.background(Color.Red)
-                                    .drawLatchModifier()
-                            )
+                            FixedSize(30, Modifier.background(Color.Red).drawLatchModifier())
                         }
                     }
                 ) { measurables, _ ->
                     val newConstraints = Constraints.fixed(30, 30)
-                    val placeables = measurables.map { m ->
-                        m.measure(newConstraints)
-                    }
+                    val placeables = measurables.map { m -> m.measure(newConstraints) }
                     layout(newConstraints.maxWidth, newConstraints.maxWidth) {
                         placeables[0].place(0, 0, zIndex = 1f)
                         placeables[1].place(0, 0, zIndex = 2f)
@@ -954,25 +760,15 @@
                 Layout(
                     content = {
                         FixedSize(30) {
-                            FixedSize(
-                                10,
-                                Modifier.padding(10)
-                                    .background(Color.White)
-                            )
+                            FixedSize(10, Modifier.padding(10).background(Color.White))
                         }
                         FixedSize(30) {
-                            FixedSize(
-                                30,
-                                Modifier.background(Color.Red)
-                                    .drawLatchModifier()
-                            )
+                            FixedSize(30, Modifier.background(Color.Red).drawLatchModifier())
                         }
                     }
                 ) { measurables, _ ->
                     val newConstraints = Constraints.fixed(30, 30)
-                    val placeables = measurables.map { m ->
-                        m.measure(newConstraints)
-                    }
+                    val placeables = measurables.map { m -> m.measure(newConstraints) }
                     layout(newConstraints.maxWidth, newConstraints.maxWidth) {
                         placeables[0].placeRelative(0, 0, zIndex = 1f)
                         placeables[1].placeRelative(0, 0, zIndex = -1f)
@@ -999,25 +795,16 @@
                         FixedSize(30) {
                             FixedSize(
                                 10,
-                                Modifier.padding(10)
-                                    .background(Color.White)
-                                    .drawLatchModifier()
+                                Modifier.padding(10).background(Color.White).drawLatchModifier()
                             )
                         }
                         if (needSecondChild) {
-                            FixedSize(30) {
-                                FixedSize(
-                                    30,
-                                    Modifier.background(Color.Red)
-                                )
-                            }
+                            FixedSize(30) { FixedSize(30, Modifier.background(Color.Red)) }
                         }
                     }
                 ) { measurables, _ ->
                     val newConstraints = Constraints.fixed(30, 30)
-                    val placeables = measurables.map { m ->
-                        m.measure(newConstraints)
-                    }
+                    val placeables = measurables.map { m -> m.measure(newConstraints) }
                     layout(newConstraints.maxWidth, newConstraints.maxWidth) {
                         placeables[0].placeRelative(0, 0, zIndex = 1f)
                         placeables.getOrNull(1)?.placeRelative(0, 0)
@@ -1044,37 +831,29 @@
     fun changingPlaceOrderInLayout() {
         var reverseOrder by mutableStateOf(false)
         var childRelayoutCount = 0
-        val childRelayoutModifier = Modifier.layout { measurable, constraints ->
-            val placeable = measurable.measure(constraints)
-            layout(placeable.width, placeable.height) {
-                childRelayoutCount++
-                placeable.place(0, 0)
+        val childRelayoutModifier =
+            Modifier.layout { measurable, constraints ->
+                val placeable = measurable.measure(constraints)
+                layout(placeable.width, placeable.height) {
+                    childRelayoutCount++
+                    placeable.place(0, 0)
+                }
             }
-        }
         rule.runOnUiThread {
             activity.setContent {
                 Layout(
                     content = {
                         FixedSize(30, childRelayoutModifier) {
-                            FixedSize(
-                                10,
-                                Modifier.padding(10)
-                                    .background(Color.White)
-                            )
+                            FixedSize(10, Modifier.padding(10).background(Color.White))
                         }
                         FixedSize(30, childRelayoutModifier) {
-                            FixedSize(
-                                30,
-                                Modifier.background(Color.Red)
-                            )
+                            FixedSize(30, Modifier.background(Color.Red))
                         }
                     },
                     modifier = Modifier.drawLatchModifier()
                 ) { measurables, _ ->
                     val newConstraints = Constraints.fixed(30, 30)
-                    val placeables = measurables.map { m ->
-                        m.measure(newConstraints)
-                    }
+                    val placeables = measurables.map { m -> m.measure(newConstraints) }
                     layout(newConstraints.maxWidth, newConstraints.maxWidth) {
                         if (!reverseOrder) {
                             placeables[0].place(0, 0)
@@ -1113,37 +892,29 @@
     fun changingZIndexInLayout() {
         var zIndex by mutableStateOf(1f)
         var childRelayoutCount = 0
-        val childRelayoutModifier = Modifier.layout { measurable, constraints ->
-            val placeable = measurable.measure(constraints)
-            layout(placeable.width, placeable.height) {
-                childRelayoutCount++
-                placeable.place(0, 0)
+        val childRelayoutModifier =
+            Modifier.layout { measurable, constraints ->
+                val placeable = measurable.measure(constraints)
+                layout(placeable.width, placeable.height) {
+                    childRelayoutCount++
+                    placeable.place(0, 0)
+                }
             }
-        }
         rule.runOnUiThread {
             activity.setContent {
                 Layout(
                     content = {
                         FixedSize(30, childRelayoutModifier) {
-                            FixedSize(
-                                10,
-                                Modifier.padding(10)
-                                    .background(Color.White)
-                            )
+                            FixedSize(10, Modifier.padding(10).background(Color.White))
                         }
                         FixedSize(30, childRelayoutModifier) {
-                            FixedSize(
-                                30,
-                                Modifier.background(Color.Red)
-                            )
+                            FixedSize(30, Modifier.background(Color.Red))
                         }
                     },
                     modifier = Modifier.drawLatchModifier()
                 ) { measurables, _ ->
                     val newConstraints = Constraints.fixed(30, 30)
-                    val placeables = measurables.map { m ->
-                        m.measure(newConstraints)
-                    }
+                    val placeables = measurables.map { m -> m.measure(newConstraints) }
                     layout(newConstraints.maxWidth, newConstraints.maxWidth) {
                         placeables[0].place(0, 0)
                         placeables[1].place(0, 0, zIndex)
@@ -1183,13 +954,7 @@
 ) {
     Layout(content = content, modifier = modifier) { measurables, _ ->
         val newConstraints = Constraints.fixed(size.value, size.value)
-        val placeables = measurables.map { m ->
-            m.measure(newConstraints)
-        }
-        layout(size.value, size.value) {
-            placeables.forEach { child ->
-                child.placeRelative(0, 0)
-            }
-        }
+        val placeables = measurables.map { m -> m.measure(newConstraints) }
+        layout(size.value, size.value) { placeables.forEach { child -> child.placeRelative(0, 0) } }
     }
 }
diff --git a/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/draw/DrawingPrebuiltGraphicsLayerTest.kt b/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/draw/DrawingPrebuiltGraphicsLayerTest.kt
index 64efe47..04d58ec 100644
--- a/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/draw/DrawingPrebuiltGraphicsLayerTest.kt
+++ b/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/draw/DrawingPrebuiltGraphicsLayerTest.kt
@@ -60,8 +60,7 @@
 @SdkSuppress(minSdkVersion = Build.VERSION_CODES.O)
 class DrawingPrebuiltGraphicsLayerTest {
 
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
     private val size = 2
     private val sizeDp = with(rule.density) { size.toDp() }
@@ -74,9 +73,7 @@
     @After
     fun releaseLayer() {
         rule.runOnUiThread {
-            layer?.let {
-                context!!.releaseGraphicsLayer(it)
-            }
+            layer?.let { context!!.releaseGraphicsLayer(it) }
             layer = null
         }
     }
@@ -91,24 +88,18 @@
             }
         }
 
-        rule.runOnIdle {
-            drawPrebuiltLayer = true
-        }
+        rule.runOnIdle { drawPrebuiltLayer = true }
 
-        rule.onNodeWithTag(LayerDrawingBoxTag)
-            .captureToImage()
-            .assertPixels(expectedSize) { Color.Red }
+        rule.onNodeWithTag(LayerDrawingBoxTag).captureToImage().assertPixels(expectedSize) {
+            Color.Red
+        }
     }
 
     @Test
     fun sizeIsCorrect() {
-        rule.setContent {
-            ColoredBox()
-        }
+        rule.setContent { ColoredBox() }
 
-        rule.runOnIdle {
-            assertThat(layer!!.size).isEqualTo(IntSize(size, size))
-        }
+        rule.runOnIdle { assertThat(layer!!.size).isEqualTo(IntSize(size, size)) }
     }
 
     @Test
@@ -126,9 +117,9 @@
             layer!!.alpha = 0.5f
         }
 
-        rule.onNodeWithTag(LayerDrawingBoxTag)
-            .captureToImage()
-            .assertPixels(expectedSize) { Color.Red.copy(alpha = 0.5f).compositeOver(Color.White) }
+        rule.onNodeWithTag(LayerDrawingBoxTag).captureToImage().assertPixels(expectedSize) {
+            Color.Red.copy(alpha = 0.5f).compositeOver(Color.White)
+        }
     }
 
     @Test
@@ -148,27 +139,21 @@
             }
         }
 
-        rule.runOnIdle {
-            drawPrebuiltLayer = true
+        rule.runOnIdle { drawPrebuiltLayer = true }
+
+        rule.onNodeWithTag(ColoredBoxTag).captureToImage().assertPixels(expectedSize) { Color.Blue }
+        rule.onNodeWithTag(LayerDrawingBoxTag).captureToImage().assertPixels(expectedSize) {
+            Color.Blue
         }
 
-        rule.onNodeWithTag(ColoredBoxTag)
-            .captureToImage()
-            .assertPixels(expectedSize) { Color.Blue }
-        rule.onNodeWithTag(LayerDrawingBoxTag)
-            .captureToImage()
-            .assertPixels(expectedSize) { Color.Blue }
+        rule.runOnUiThread { color = Color.Green }
 
-        rule.runOnUiThread {
-            color = Color.Green
+        rule.onNodeWithTag(ColoredBoxTag).captureToImage().assertPixels(expectedSize) {
+            Color.Green
         }
-
-        rule.onNodeWithTag(ColoredBoxTag)
-            .captureToImage()
-            .assertPixels(expectedSize) { Color.Green }
-        rule.onNodeWithTag(LayerDrawingBoxTag)
-            .captureToImage()
-            .assertPixels(expectedSize) { Color.Green }
+        rule.onNodeWithTag(LayerDrawingBoxTag).captureToImage().assertPixels(expectedSize) {
+            Color.Green
+        }
     }
 
     @Test
@@ -179,13 +164,12 @@
                 if (!drawPrebuiltLayer) {
                     val layer = obtainLayer()
                     Canvas(
-                        Modifier
-                            .layout { measurable, _ ->
-                                val placeable = measurable.measure(Constraints.fixed(size, size))
-                                layout(placeable.width, placeable.height) {
-                                    placeable.placeWithLayer(0, 0, layer)
-                                }
+                        Modifier.layout { measurable, _ ->
+                            val placeable = measurable.measure(Constraints.fixed(size, size))
+                            layout(placeable.width, placeable.height) {
+                                placeable.placeWithLayer(0, 0, layer)
                             }
+                        }
                     ) {
                         drawRect(Color.Red)
                     }
@@ -195,13 +179,11 @@
             }
         }
 
-        rule.runOnIdle {
-            drawPrebuiltLayer = true
-        }
+        rule.runOnIdle { drawPrebuiltLayer = true }
 
-        rule.onNodeWithTag(LayerDrawingBoxTag)
-            .captureToImage()
-            .assertPixels(expectedSize) { Color.Red }
+        rule.onNodeWithTag(LayerDrawingBoxTag).captureToImage().assertPixels(expectedSize) {
+            Color.Red
+        }
     }
 
     @Test
@@ -209,11 +191,7 @@
         rule.setContent {
             if (!drawPrebuiltLayer) {
                 Box(Modifier.drawIntoLayer()) {
-                    Canvas(
-                        Modifier
-                            .size(sizeDp)
-                            .drawIntoLayer(rememberGraphicsLayer())
-                    ) {
+                    Canvas(Modifier.size(sizeDp).drawIntoLayer(rememberGraphicsLayer())) {
                         drawRect(Color.Red)
                     }
                 }
@@ -222,13 +200,11 @@
             }
         }
 
-        rule.runOnIdle {
-            drawPrebuiltLayer = true
-        }
+        rule.runOnIdle { drawPrebuiltLayer = true }
 
-        rule.onNodeWithTag(LayerDrawingBoxTag)
-            .captureToImage()
-            .assertPixels(expectedSize) { Color.Red }
+        rule.onNodeWithTag(LayerDrawingBoxTag).captureToImage().assertPixels(expectedSize) {
+            Color.Red
+        }
     }
 
     @Test
@@ -237,11 +213,7 @@
             if (!drawPrebuiltLayer) {
                 Box(Modifier.drawIntoLayer()) {
                     Box(Modifier.drawIntoLayer(rememberGraphicsLayer())) {
-                        Canvas(
-                            Modifier
-                                .size(sizeDp)
-                                .drawIntoLayer(rememberGraphicsLayer())
-                        ) {
+                        Canvas(Modifier.size(sizeDp).drawIntoLayer(rememberGraphicsLayer())) {
                             drawRect(Color.Red)
                         }
                     }
@@ -251,13 +223,11 @@
             }
         }
 
-        rule.runOnIdle {
-            drawPrebuiltLayer = true
-        }
+        rule.runOnIdle { drawPrebuiltLayer = true }
 
-        rule.onNodeWithTag(LayerDrawingBoxTag)
-            .captureToImage()
-            .assertPixels(expectedSize) { Color.Red }
+        rule.onNodeWithTag(LayerDrawingBoxTag).captureToImage().assertPixels(expectedSize) {
+            Color.Red
+        }
     }
 
     @Test
@@ -267,16 +237,8 @@
         rule.setContent {
             if (!drawPrebuiltLayer) {
                 Box(Modifier.drawIntoLayer()) {
-                    Box(
-                        Modifier.graphicsLayer()
-                    ) {
-                        Canvas(
-                            Modifier
-                                .size(sizeDp)
-                                .graphicsLayer()
-                        ) {
-                            drawRect(Color.Red)
-                        }
+                    Box(Modifier.graphicsLayer()) {
+                        Canvas(Modifier.size(sizeDp).graphicsLayer()) { drawRect(Color.Red) }
                     }
                 }
             } else {
@@ -284,13 +246,11 @@
             }
         }
 
-        rule.runOnIdle {
-            drawPrebuiltLayer = true
-        }
+        rule.runOnIdle { drawPrebuiltLayer = true }
 
-        rule.onNodeWithTag(LayerDrawingBoxTag)
-            .captureToImage()
-            .assertPixels(expectedSize) { Color.Red }
+        rule.onNodeWithTag(LayerDrawingBoxTag).captureToImage().assertPixels(expectedSize) {
+            Color.Red
+        }
     }
 
     @Test
@@ -300,11 +260,7 @@
         Assume.assumeTrue(Build.VERSION.SDK_INT != Build.VERSION_CODES.P)
         rule.setContent {
             SubcompositionReusableContentHost(active = !drawPrebuiltLayer) {
-                Box(
-                    Modifier
-                        .drawIntoLayer()
-                        .graphicsLayer()
-                ) {
+                Box(Modifier.drawIntoLayer().graphicsLayer()) {
                     Canvas(Modifier.size(sizeDp)) {
                         counter.value
                         drawRect(Color.Red)
@@ -324,9 +280,9 @@
             counter.value++
         }
 
-        rule.onNodeWithTag(LayerDrawingBoxTag)
-            .captureToImage()
-            .assertPixels(expectedSize) { Color.Red }
+        rule.onNodeWithTag(LayerDrawingBoxTag).captureToImage().assertPixels(expectedSize) {
+            Color.Red
+        }
     }
 
     @Test
@@ -334,10 +290,12 @@
         val counter = mutableStateOf(0)
         rule.setContent {
             if (!drawPrebuiltLayer) {
-                ColoredBox(color = {
-                    counter.value
-                    Color.Red
-                })
+                ColoredBox(
+                    color = {
+                        counter.value
+                        Color.Red
+                    }
+                )
             } else {
                 LayerDrawingBox()
             }
@@ -351,9 +309,9 @@
             counter.value++
         }
 
-        rule.onNodeWithTag(LayerDrawingBoxTag)
-            .captureToImage()
-            .assertPixels(expectedSize) { Color.Red }
+        rule.onNodeWithTag(LayerDrawingBoxTag).captureToImage().assertPixels(expectedSize) {
+            Color.Red
+        }
     }
 
     @Test
@@ -371,13 +329,11 @@
             layer!!.alpha = 1f
         }
 
-        rule.runOnIdle {
-            layer!!.alpha = 0.5f
-        }
+        rule.runOnIdle { layer!!.alpha = 0.5f }
 
-        rule.onNodeWithTag(LayerDrawingBoxTag)
-            .captureToImage()
-            .assertPixels(expectedSize) { Color.Red.copy(alpha = 0.5f).compositeOver(Color.White) }
+        rule.onNodeWithTag(LayerDrawingBoxTag).captureToImage().assertPixels(expectedSize) {
+            Color.Red.copy(alpha = 0.5f).compositeOver(Color.White)
+        }
     }
 
     @Test
@@ -388,15 +344,14 @@
             Column {
                 val layer = obtainLayer()
                 Canvas(
-                    Modifier
-                        .layout { measurable, _ ->
-                            val placeable = measurable.measure(Constraints.fixed(size, size))
-                            layout(placeable.width, placeable.height) {
-                                if (shouldPlace) {
-                                    placeable.placeWithLayer(0, 0, layer)
-                                }
+                    Modifier.layout { measurable, _ ->
+                        val placeable = measurable.measure(Constraints.fixed(size, size))
+                        layout(placeable.width, placeable.height) {
+                            if (shouldPlace) {
+                                placeable.placeWithLayer(0, 0, layer)
                             }
                         }
+                    }
                 ) {
                     drawRect(color)
                 }
@@ -410,21 +365,14 @@
             color = Color.Green
         }
 
-        rule.onNodeWithTag(LayerDrawingBoxTag)
-            .captureToImage()
-            .assertPixels(expectedSize) { Color.Red }
+        rule.onNodeWithTag(LayerDrawingBoxTag).captureToImage().assertPixels(expectedSize) {
+            Color.Red
+        }
     }
 
     @Composable
     private fun ColoredBox(modifier: Modifier = Modifier, color: () -> Color = { Color.Red }) {
-        Canvas(
-            modifier
-                .size(sizeDp)
-                .testTag(ColoredBoxTag)
-                .drawIntoLayer()
-                ) {
-            drawRect(color())
-        }
+        Canvas(modifier.size(sizeDp).testTag(ColoredBoxTag).drawIntoLayer()) { drawRect(color()) }
     }
 
     @Composable
@@ -434,28 +382,18 @@
     }
 
     @Composable
-    private fun Modifier.drawIntoLayer(
-        layer: GraphicsLayer = obtainLayer()
-    ): Modifier {
+    private fun Modifier.drawIntoLayer(layer: GraphicsLayer = obtainLayer()): Modifier {
         return drawWithContent {
-            layer.record {
-                this@drawWithContent.drawContent()
-            }
+            layer.record { this@drawWithContent.drawContent() }
             drawLayer(layer)
         }
     }
 
     @Composable
     private fun LayerDrawingBox() {
-        Canvas(
-            Modifier
-                .size(sizeDp)
-                .testTag(LayerDrawingBoxTag)
-        ) {
+        Canvas(Modifier.size(sizeDp).testTag(LayerDrawingBoxTag)) {
             drawRect(Color.White)
-            layer?.let {
-                drawLayer(it)
-            }
+            layer?.let { drawLayer(it) }
         }
     }
 }
diff --git a/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/draw/GraphicsLayerModifierTest.kt b/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/draw/GraphicsLayerModifierTest.kt
index 78b3042..d04eef9 100644
--- a/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/draw/GraphicsLayerModifierTest.kt
+++ b/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/draw/GraphicsLayerModifierTest.kt
@@ -50,47 +50,48 @@
         val modifier = Modifier.graphicsLayer(rotationX = 2.0f) as InspectableValue
         assertThat(modifier.nameFallback).isEqualTo("graphicsLayer")
         assertThat(modifier.valueOverride).isNull()
-        assertThat(modifier.inspectableElements.asIterable()).containsExactly(
-            ValueElement("renderEffect", null),
-            ValueElement("scaleX", 1.0f),
-            ValueElement("scaleY", 1.0f),
-            ValueElement("alpha", 1.0f),
-            ValueElement("translationX", 0.0f),
-            ValueElement("translationY", 0.0f),
-            ValueElement("shadowElevation", 0.0f),
-            ValueElement("ambientShadowColor", DefaultShadowColor),
-            ValueElement("spotShadowColor", DefaultShadowColor),
-            ValueElement("rotationX", 2.0f),
-            ValueElement("rotationY", 0.0f),
-            ValueElement("rotationZ", 0.0f),
-            ValueElement("cameraDistance", DefaultCameraDistance),
-            ValueElement("transformOrigin", TransformOrigin.Center),
-            ValueElement("shape", RectangleShape),
-            ValueElement("clip", false),
-            ValueElement("compositingStrategy", CompositingStrategy.Auto)
-        )
+        assertThat(modifier.inspectableElements.asIterable())
+            .containsExactly(
+                ValueElement("renderEffect", null),
+                ValueElement("scaleX", 1.0f),
+                ValueElement("scaleY", 1.0f),
+                ValueElement("alpha", 1.0f),
+                ValueElement("translationX", 0.0f),
+                ValueElement("translationY", 0.0f),
+                ValueElement("shadowElevation", 0.0f),
+                ValueElement("ambientShadowColor", DefaultShadowColor),
+                ValueElement("spotShadowColor", DefaultShadowColor),
+                ValueElement("rotationX", 2.0f),
+                ValueElement("rotationY", 0.0f),
+                ValueElement("rotationZ", 0.0f),
+                ValueElement("cameraDistance", DefaultCameraDistance),
+                ValueElement("transformOrigin", TransformOrigin.Center),
+                ValueElement("shape", RectangleShape),
+                ValueElement("clip", false),
+                ValueElement("compositingStrategy", CompositingStrategy.Auto)
+            )
     }
 
     @Test
     fun testEquals() {
         assertThat(
-            Modifier.graphicsLayer(
-                scaleX = 1.0f,
-                scaleY = 2.0f,
-                alpha = 0.75f,
-                translationX = 3.0f,
-                translationY = 4.0f,
-                shadowElevation = 5.0f,
-                ambientShadowColor = Color(0xFF00FF42),
-                spotShadowColor = Color(0xFF00FF64),
-                rotationX = 6.0f,
-                rotationY = 7.0f,
-                rotationZ = 8.0f,
-                transformOrigin = TransformOrigin.Center,
-                shape = RectangleShape,
-                clip = true
+                Modifier.graphicsLayer(
+                    scaleX = 1.0f,
+                    scaleY = 2.0f,
+                    alpha = 0.75f,
+                    translationX = 3.0f,
+                    translationY = 4.0f,
+                    shadowElevation = 5.0f,
+                    ambientShadowColor = Color(0xFF00FF42),
+                    spotShadowColor = Color(0xFF00FF64),
+                    rotationX = 6.0f,
+                    rotationY = 7.0f,
+                    rotationZ = 8.0f,
+                    transformOrigin = TransformOrigin.Center,
+                    shape = RectangleShape,
+                    clip = true
+                )
             )
-        )
             .isEqualTo(
                 Modifier.graphicsLayer(
                     scaleX = 1.0f,
@@ -118,20 +119,21 @@
         var shape = RectangleShape
         var clip = true
 
-        fun createGraphicsLayer() = Modifier.graphicsLayer(
-            scaleX = floatValues[0],
-            scaleY = floatValues[1],
-            alpha = floatValues[2],
-            translationX = floatValues[3],
-            translationY = floatValues[4],
-            shadowElevation = floatValues[5],
-            rotationX = floatValues[6],
-            rotationY = floatValues[7],
-            rotationZ = floatValues[8],
-            transformOrigin = transformOrigin,
-            shape = shape,
-            clip = clip
-        )
+        fun createGraphicsLayer() =
+            Modifier.graphicsLayer(
+                scaleX = floatValues[0],
+                scaleY = floatValues[1],
+                alpha = floatValues[2],
+                translationX = floatValues[3],
+                translationY = floatValues[4],
+                shadowElevation = floatValues[5],
+                rotationX = floatValues[6],
+                rotationY = floatValues[7],
+                rotationZ = floatValues[8],
+                transformOrigin = transformOrigin,
+                shape = shape,
+                clip = clip
+            )
 
         val regularValue = createGraphicsLayer()
 
diff --git a/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/draw/GraphicsLayerTest.kt b/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/draw/GraphicsLayerTest.kt
index f21fef5..c546076 100644
--- a/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/draw/GraphicsLayerTest.kt
+++ b/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/draw/GraphicsLayerTest.kt
@@ -114,12 +114,10 @@
 class GraphicsLayerTest {
     @Suppress("DEPRECATION")
     @get:Rule
-    val activityTestRule = androidx.test.rule.ActivityTestRule<TestActivity>(
-        TestActivity::class.java
-    )
+    val activityTestRule =
+        androidx.test.rule.ActivityTestRule<TestActivity>(TestActivity::class.java)
 
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
     @Test
     fun testLayerBoundsPosition() {
@@ -127,13 +125,9 @@
         rule.setContent {
             FixedSize(
                 30,
-                Modifier
-                    .padding(10)
-                    .graphicsLayer()
-                    .onGloballyPositioned {
-                        coords = it
-                    }
-            ) { /* no-op */ }
+                Modifier.padding(10).graphicsLayer().onGloballyPositioned { coords = it }
+            ) { /* no-op */
+            }
         }
 
         rule.onRoot().apply {
@@ -157,13 +151,10 @@
             Padding(10) {
                 FixedSize(
                     10,
-                    Modifier
-                        .graphicsLayer(scaleX = 2f, scaleY = 3f)
-                        .onGloballyPositioned {
-                            coords = it
-                        }
-                ) {
-                }
+                    Modifier.graphicsLayer(scaleX = 2f, scaleY = 3f).onGloballyPositioned {
+                        coords = it
+                    }
+                ) {}
             }
         }
 
@@ -182,13 +173,8 @@
             Padding(10) {
                 FixedSize(
                     10,
-                    Modifier
-                        .scale(scaleX = 2f, scaleY = 3f)
-                        .onGloballyPositioned {
-                            coords = it
-                        }
-                ) {
-                }
+                    Modifier.scale(scaleX = 2f, scaleY = 3f).onGloballyPositioned { coords = it }
+                ) {}
             }
         }
 
@@ -205,15 +191,7 @@
         var coords: LayoutCoordinates? = null
         rule.setContent {
             Padding(10) {
-                FixedSize(
-                    10,
-                    Modifier
-                        .scale(scale = 2f)
-                        .onGloballyPositioned {
-                            coords = it
-                        }
-                ) {
-                }
+                FixedSize(10, Modifier.scale(scale = 2f).onGloballyPositioned { coords = it }) {}
             }
         }
 
@@ -232,13 +210,10 @@
             Padding(10) {
                 FixedSize(
                     10,
-                    Modifier
-                        .graphicsLayer(scaleY = 3f, rotationZ = 90f)
-                        .onGloballyPositioned {
-                            coords = it
-                        }
-                ) {
-                }
+                    Modifier.graphicsLayer(scaleY = 3f, rotationZ = 90f).onGloballyPositioned {
+                        coords = it
+                    }
+                ) {}
             }
         }
 
@@ -255,15 +230,7 @@
         var coords: LayoutCoordinates? = null
         rule.setContent {
             Padding(10) {
-                FixedSize(
-                    10,
-                    Modifier
-                        .rotate(90f)
-                        .onGloballyPositioned {
-                            coords = it
-                        }
-                ) {
-                }
+                FixedSize(10, Modifier.rotate(90f).onGloballyPositioned { coords = it }) {}
             }
         }
 
@@ -282,14 +249,11 @@
             Padding(10) {
                 FixedSize(
                     10,
-                    Modifier
-                        .graphicsLayer(
+                    Modifier.graphicsLayer(
                             rotationZ = 90f,
                             transformOrigin = TransformOrigin(1.0f, 1.0f)
                         )
-                        .onGloballyPositioned {
-                            coords = it
-                        }
+                        .onGloballyPositioned { coords = it }
                 )
             }
         }
@@ -309,14 +273,8 @@
             Padding(10) {
                 FixedSize(
                     10,
-                    Modifier
-                        .graphicsLayer(
-                            translationX = 5.0f,
-                            translationY = 8.0f
-                        )
-                        .onGloballyPositioned {
-                            coords = it
-                        }
+                    Modifier.graphicsLayer(translationX = 5.0f, translationY = 8.0f)
+                        .onGloballyPositioned { coords = it }
                 )
             }
         }
@@ -337,13 +295,8 @@
                 FixedSize(10, Modifier.graphicsLayer(clip = true)) {
                     FixedSize(
                         10,
-                        Modifier
-                            .graphicsLayer(scaleX = 2f)
-                            .onGloballyPositioned {
-                                coords = it
-                            }
-                    ) {
-                    }
+                        Modifier.graphicsLayer(scaleX = 2f).onGloballyPositioned { coords = it }
+                    ) {}
                 }
             }
         }
@@ -363,39 +316,26 @@
         var coords2: LayoutCoordinates? = null
         rule.setContent {
             with(LocalDensity.current) {
-                Box(
-                    Modifier
-                        .requiredSize(25.toDp())
-                        .graphicsLayer(
-                            rotationZ = 30f,
-                            clip = true
-                        )
-                ) {
+                Box(Modifier.requiredSize(25.toDp()).graphicsLayer(rotationZ = 30f, clip = true)) {
                     Box(
-                        Modifier
-                            .graphicsLayer(
+                        Modifier.graphicsLayer(
                                 rotationZ = 90f,
                                 transformOrigin = TransformOrigin(0f, 1f),
                                 clip = true
                             )
                             .requiredSize(20.toDp(), 10.toDp())
                             .align(AbsoluteAlignment.TopLeft)
-                            .onGloballyPositioned {
-                                coords1 = it
-                            }
+                            .onGloballyPositioned { coords1 = it }
                     )
                     Box(
-                        Modifier
-                            .graphicsLayer(
+                        Modifier.graphicsLayer(
                                 rotationZ = -90f,
                                 transformOrigin = TransformOrigin(0f, 1f),
                                 clip = true
                             )
                             .requiredSize(10.toDp())
                             .align(AbsoluteAlignment.BottomRight)
-                            .onGloballyPositioned {
-                                coords2 = it
-                            }
+                            .onGloballyPositioned { coords2 = it }
                     )
                 }
             }
@@ -404,14 +344,8 @@
         rule.onRoot().apply {
             assertEquals(Offset(15f, 5f), coords2!!.localPositionOf(coords1!!, Offset.Zero))
             assertEquals(Offset(-5f, 5f), coords2!!.localPositionOf(coords1!!, Offset(20f, 0f)))
-            assertEquals(
-                Rect(-5f, -5f, 15f, 5f),
-                coords2!!.localBoundingBoxOf(coords1!!, false)
-            )
-            assertEquals(
-                Rect(0f, 0f, 10f, 5f),
-                coords2!!.localBoundingBoxOf(coords1!!, true)
-            )
+            assertEquals(Rect(-5f, -5f, 15f, 5f), coords2!!.localBoundingBoxOf(coords1!!, false))
+            assertEquals(Rect(0f, 0f, 10f, 5f), coords2!!.localBoundingBoxOf(coords1!!, true))
         }
     }
 
@@ -422,15 +356,13 @@
         if (Build.VERSION.SDK_INT == 28) return // b/260095151
         val testTag = "parent"
         rule.setContent {
-            Box(modifier = Modifier
-                .testTag(testTag)
-                .wrapContentSize()) {
+            Box(modifier = Modifier.testTag(testTag).wrapContentSize()) {
                 Box(
-                    modifier = Modifier
-                        .requiredSize(100.dp)
-                        .background(Color.Gray)
-                        .graphicsLayer(rotationY = 25f, cameraDistance = 1.0f)
-                        .background(Color.Red)
+                    modifier =
+                        Modifier.requiredSize(100.dp)
+                            .background(Color.Gray)
+                            .graphicsLayer(rotationY = 25f, cameraDistance = 1.0f)
+                            .background(Color.Red)
                 ) {
                     Box(modifier = Modifier.requiredSize(100.dp))
                 }
@@ -451,24 +383,22 @@
     @SdkSuppress(minSdkVersion = Build.VERSION_CODES.O)
     @Test
     fun testEmptyClip() {
-        val EmptyRectangle = object : Shape {
-            override fun createOutline(
-                size: Size,
-                layoutDirection: LayoutDirection,
-                density: Density
-            ) = Outline.Rectangle(Rect.Zero)
-        }
+        val EmptyRectangle =
+            object : Shape {
+                override fun createOutline(
+                    size: Size,
+                    layoutDirection: LayoutDirection,
+                    density: Density
+                ) = Outline.Rectangle(Rect.Zero)
+            }
         val tag = "testTag"
         rule.setContent {
-            Box(modifier = Modifier
-                .testTag(tag)
-                .requiredSize(100.dp)
-                .background(Color.Blue)) {
+            Box(modifier = Modifier.testTag(tag).requiredSize(100.dp).background(Color.Blue)) {
                 Box(
-                    modifier = Modifier
-                        .matchParentSize()
-                        .graphicsLayer(clip = true, shape = EmptyRectangle)
-                        .background(Color.Red)
+                    modifier =
+                        Modifier.matchParentSize()
+                            .graphicsLayer(clip = true, shape = EmptyRectangle)
+                            .background(Color.Red)
                 )
             }
         }
@@ -484,15 +414,7 @@
         rule.setContent {
             Padding(10) {
                 FixedSize(10, Modifier.graphicsLayer(clip = true)) {
-                    FixedSize(
-                        10,
-                        Modifier
-                            .padding(20)
-                            .onGloballyPositioned {
-                                coords = it
-                            }
-                    ) {
-                    }
+                    FixedSize(10, Modifier.padding(20).onGloballyPositioned { coords = it }) {}
                 }
             }
         }
@@ -513,9 +435,7 @@
             (size / LocalDensity.current.density).dp,
             ({ BlurEffect(blurRadius, blurRadius, TileMode.Decal) })
         ) {
-            inset(blurRadius, blurRadius) {
-                drawRect(androidx.compose.ui.graphics.Color.Blue)
-            }
+            inset(blurRadius, blurRadius) { drawRect(androidx.compose.ui.graphics.Color.Blue) }
         }
     }
 
@@ -527,13 +447,10 @@
         drawBlock: DrawScope.() -> Unit
     ) {
         Box(
-            Modifier
-                .testTag(tag)
+            Modifier.testTag(tag)
                 .size(size)
                 .background(Color.Black)
-                .graphicsLayer {
-                    renderEffect = renderEffectCreator()
-                }
+                .graphicsLayer { renderEffect = renderEffectCreator() }
                 .drawBehind(drawBlock)
         )
     }
@@ -544,9 +461,7 @@
         val tag = "blurTag"
         val size = 100f
         val blurRadius = 10f
-        rule.setContent {
-            BoxBlur(tag, size, blurRadius)
-        }
+        rule.setContent { BoxBlur(tag, size, blurRadius) }
         rule.onNodeWithTag(tag).captureToImage().apply {
             val pixelMap = toPixelMap()
             var nonPureBlueCount = 0
@@ -571,23 +486,20 @@
         val tag = "blurTag"
         val size = 100f
         val blurRadius = 10f
-        rule.setContent {
-            BoxBlur(tag, size, blurRadius)
-        }
+        rule.setContent { BoxBlur(tag, size, blurRadius) }
         rule.onNodeWithTag(tag).captureToImage().apply {
             with(toPixelMap()) {
                 for (x in 0 until width) {
                     for (y in 0 until height) {
-                        if (x >= blurRadius && x < width - blurRadius &&
-                            y >= blurRadius && y < height - blurRadius
+                        if (
+                            x >= blurRadius &&
+                                x < width - blurRadius &&
+                                y >= blurRadius &&
+                                y < height - blurRadius
                         ) {
-                            assertPixelColor(Color.Blue, x, y) {
-                                "Index $x, $y should be blue"
-                            }
+                            assertPixelColor(Color.Blue, x, y) { "Index $x, $y should be blue" }
                         } else {
-                            assertPixelColor(Color.Black, x, y) {
-                                "Index $x, $y should be black"
-                            }
+                            assertPixelColor(Color.Black, x, y) { "Index $x, $y should be black" }
                         }
                     }
                 }
@@ -606,10 +518,7 @@
                 (size / LocalDensity.current.density).dp,
                 { OffsetEffect(20f, 20f) }
             ) {
-                drawRect(
-                    Color.Blue,
-                    size = Size(this.size.width - 20, this.size.height - 20)
-                )
+                drawRect(Color.Blue, size = Size(this.size.width - 20, this.size.height - 20))
             }
         }
         rule.onNodeWithTag(tag).captureToImage().apply {
@@ -641,14 +550,9 @@
             val size = (sizePx / density)
             val squareSize = (squarePx / density)
             offset = (20f / density).roundToInt()
-            Box(
-                Modifier
-                    .size(size.dp)
-                    .background(Color.LightGray)
-                    .testTag(testTag)) {
+            Box(Modifier.size(size.dp).background(Color.LightGray).testTag(testTag)) {
                 Box(
-                    Modifier
-                        .layout { measurable, constraints ->
+                    Modifier.layout { measurable, constraints ->
                             val placeable = measurable.measure(constraints)
                             layout(placeable.width, placeable.height) {
                                 placeable.placeWithLayer(offset, offset) {
@@ -703,14 +607,9 @@
             val size = (sizePx / density)
             val squareSize = (squarePx / density)
             offset = (20f / density).roundToInt()
-            Box(
-                Modifier
-                    .size(size.dp)
-                    .background(Color.LightGray)
-                    .testTag(testTag)) {
+            Box(Modifier.size(size.dp).background(Color.LightGray).testTag(testTag)) {
                 Box(
-                    Modifier
-                        .layout { measurable, constraints ->
+                    Modifier.layout { measurable, constraints ->
                             val placeable = measurable.measure(constraints)
                             layout(placeable.width, placeable.height) {
                                 placeable.placeWithLayer(offset, offset) {
@@ -782,14 +681,9 @@
             val size = (sizePx / density)
             val squareSize = (squarePx / density)
             offset = (20f / density).roundToInt()
-            Box(
-                Modifier
-                    .size(size.dp)
-                    .background(Color.LightGray)
-                    .testTag(testTag)) {
+            Box(Modifier.size(size.dp).background(Color.LightGray).testTag(testTag)) {
                 Box(
-                    Modifier
-                        .layout { measurable, constraints ->
+                    Modifier.layout { measurable, constraints ->
                             val placeable = measurable.measure(constraints)
                             layout(placeable.width, placeable.height) {
                                 placeable.placeWithLayer(offset, offset) {
@@ -864,14 +758,9 @@
             val size = (sizePx / density)
             val squareSize = (squarePx / density)
             offset = (20f / density).roundToInt()
-            Box(
-                Modifier
-                    .size(size.dp)
-                    .background(Color.LightGray)
-                    .testTag(testTag)) {
+            Box(Modifier.size(size.dp).background(Color.LightGray).testTag(testTag)) {
                 Box(
-                    Modifier
-                        .layout { measurable, constraints ->
+                    Modifier.layout { measurable, constraints ->
                             val placeable = measurable.measure(constraints)
                             layout(placeable.width, placeable.height) {
                                 placeable.placeWithLayer(offset, offset) {
@@ -929,8 +818,11 @@
                 assertPixelColor(blended, scaledRight - 5, scaledTop + 1)
                 assertPixelColor(blended, scaledLeft + 1, scaledBottom - 5)
 
-                assertPixelColor(Color.LightGray,
-                    (scaledLeft + scaledRight) / 2 + 3, (scaledTop + scaledBottom) / 2 + 3)
+                assertPixelColor(
+                    Color.LightGray,
+                    (scaledLeft + scaledRight) / 2 + 3,
+                    (scaledTop + scaledBottom) / 2 + 3
+                )
             }
         }
     }
@@ -950,14 +842,9 @@
             val size = (sizePx / density)
             val squareSize = (squarePx / density)
             offset = (20f / density).roundToInt()
-            Box(
-                Modifier
-                    .size(size.dp)
-                    .background(Color.LightGray)
-                    .testTag(testTag)) {
+            Box(Modifier.size(size.dp).background(Color.LightGray).testTag(testTag)) {
                 Box(
-                    Modifier
-                        .layout { measurable, constraints ->
+                    Modifier.layout { measurable, constraints ->
                             val placeable = measurable.measure(constraints)
                             layout(placeable.width, placeable.height) {
                                 placeable.placeWithLayer(offset, offset) {
@@ -966,22 +853,23 @@
                                     scaleY = scale
                                     transformOrigin = TransformOrigin(0f, 0f)
                                     clip = true
-                                    shape = object : Shape {
-                                        override fun createOutline(
-                                            size: Size,
-                                            layoutDirection: LayoutDirection,
-                                            density: Density
-                                        ): Outline {
-                                            return Outline.Rectangle(
-                                                Rect(
-                                                    left = -size.width / 2,
-                                                    top = -size.height / 2,
-                                                    right = size.width / 2,
-                                                    bottom = size.height / 2,
+                                    shape =
+                                        object : Shape {
+                                            override fun createOutline(
+                                                size: Size,
+                                                layoutDirection: LayoutDirection,
+                                                density: Density
+                                            ): Outline {
+                                                return Outline.Rectangle(
+                                                    Rect(
+                                                        left = -size.width / 2,
+                                                        top = -size.height / 2,
+                                                        right = size.width / 2,
+                                                        bottom = size.height / 2,
+                                                    )
                                                 )
-                                            )
+                                            }
                                         }
-                                    }
                                 }
                             }
                         }
@@ -1029,14 +917,9 @@
             val size = (sizePx / density)
             val squareSize = (squarePx / density)
             offset = (20f / density).roundToInt()
-            Box(
-                Modifier
-                    .size(size.dp)
-                    .background(Color.LightGray)
-                    .testTag(testTag)) {
+            Box(Modifier.size(size.dp).background(Color.LightGray).testTag(testTag)) {
                 Box(
-                    Modifier
-                        .layout { measurable, constraints ->
+                    Modifier.layout { measurable, constraints ->
                             val placeable = measurable.measure(constraints)
                             layout(placeable.width, placeable.height) {
                                 placeable.placeWithLayer(offset, offset) {
@@ -1044,26 +927,28 @@
                                     scaleX = scale
                                     scaleY = scale
                                     clip = true
-                                    shape = object : Shape {
-                                        override fun createOutline(
-                                            size: Size,
-                                            layoutDirection: LayoutDirection,
-                                            density: Density
-                                        ): Outline {
-                                            return Outline.Rounded(
-                                                RoundRect(
-                                                    left = -size.width / 2,
-                                                    top = -size.height / 2,
-                                                    right = size.width / 2,
-                                                    bottom = size.height / 2,
-                                                    cornerRadius = CornerRadius(
-                                                        size.width / 2,
-                                                        size.height / 2
+                                    shape =
+                                        object : Shape {
+                                            override fun createOutline(
+                                                size: Size,
+                                                layoutDirection: LayoutDirection,
+                                                density: Density
+                                            ): Outline {
+                                                return Outline.Rounded(
+                                                    RoundRect(
+                                                        left = -size.width / 2,
+                                                        top = -size.height / 2,
+                                                        right = size.width / 2,
+                                                        bottom = size.height / 2,
+                                                        cornerRadius =
+                                                            CornerRadius(
+                                                                size.width / 2,
+                                                                size.height / 2
+                                                            )
                                                     )
                                                 )
-                                            )
+                                            }
                                         }
-                                    }
                                     transformOrigin = TransformOrigin(0f, 0f)
                                 }
                             }
@@ -1093,7 +978,8 @@
                 assertPixelColor(blended, scaledRight - 3, scaledTop + 3)
                 assertPixelColor(blended, scaledLeft + 3, scaledBottom - 3)
 
-                // The bottom right corner should be clipped out and the background should be revealed
+                // The bottom right corner should be clipped out and the background should be
+                // revealed
                 assertPixelColor(Color.LightGray, scaledRight, scaledBottom)
             }
         }
@@ -1103,25 +989,11 @@
     @SdkSuppress(minSdkVersion = Build.VERSION_CODES.O)
     fun invalidateWhenWeHaveSemanticModifierAfterLayer() {
         var color by mutableStateOf(Color.Red)
-        rule.setContent {
-            FixedSize(
-                5,
-                Modifier
-                    .graphicsLayer()
-                    .testTag("tag")
-                    .background(color)
-            )
-        }
+        rule.setContent { FixedSize(5, Modifier.graphicsLayer().testTag("tag").background(color)) }
 
-        rule.runOnIdle {
-            color = Color.Green
-        }
+        rule.runOnIdle { color = Color.Green }
 
-        rule.onNodeWithTag("tag")
-            .captureToImage()
-            .assertPixels {
-                color
-            }
+        rule.onNodeWithTag("tag").captureToImage().assertPixels { color }
     }
 
     @Test
@@ -1134,10 +1006,11 @@
             // Verify that the current density is passed to the graphics layer
             // implementation and that density dependent methods are consuming it
             Box(
-                modifier = Modifier.graphicsLayer {
-                    testDpConversion = 2.dp.toPx()
-                    testFontScaleConversion = 3.dp.toSp().toPx()
-                }
+                modifier =
+                    Modifier.graphicsLayer {
+                        testDpConversion = 2.dp.toPx()
+                        testFontScaleConversion = 3.dp.toSp().toPx()
+                    }
             )
         }
 
@@ -1156,20 +1029,8 @@
         rule.setContent {
             Layout(
                 content = {
-                    Box(
-                        Modifier
-                            .fillMaxSize()
-                            .clickable {
-                                firstClicked = true
-                            }
-                    )
-                    Box(
-                        Modifier
-                            .fillMaxSize()
-                            .clickable {
-                                secondClicked = true
-                            }
-                    )
+                    Box(Modifier.fillMaxSize().clickable { firstClicked = true })
+                    Box(Modifier.fillMaxSize().clickable { secondClicked = true })
                 },
                 modifier = Modifier.testTag("layout")
             ) { measurables, _ ->
@@ -1187,10 +1048,7 @@
             }
         }
 
-        rule.onNodeWithTag("layout")
-            .performTouchInput {
-                click(position = Offset(50f, 170f))
-            }
+        rule.onNodeWithTag("layout").performTouchInput { click(position = Offset(50f, 170f)) }
 
         rule.runOnIdle {
             assertFalse("First element is clicked", firstClicked)
@@ -1206,26 +1064,22 @@
         var valueReadInGraphicsLayer = Float.MIN_VALUE
 
         rule.setContent {
-            Box(Modifier
-                .layout { measurable, constraints ->
-                    // update the state during the measure pass
-                    mutableState.value = 2f
+            Box(
+                Modifier.layout { measurable, constraints ->
+                        // update the state during the measure pass
+                        mutableState.value = 2f
 
-                    val placeable = measurable.measure(constraints)
-                    layout(placeable.width, placeable.height) {
-                        placeable.place(0, 0)
+                        val placeable = measurable.measure(constraints)
+                        layout(placeable.width, placeable.height) { placeable.place(0, 0) }
                     }
-                }
-                .graphicsLayer {
-                    // read during updateLayerParameters
-                    valueReadInGraphicsLayer = nestedDerivedState
-                }
+                    .graphicsLayer {
+                        // read during updateLayerParameters
+                        valueReadInGraphicsLayer = nestedDerivedState
+                    }
             )
         }
 
-        rule.runOnIdle {
-            assertEquals(2f, valueReadInGraphicsLayer)
-        }
+        rule.runOnIdle { assertEquals(2f, valueReadInGraphicsLayer) }
     }
 
     @SdkSuppress(minSdkVersion = Build.VERSION_CODES.O)
@@ -1236,21 +1090,16 @@
         rule.setContent {
             Canvas(
                 modifier =
-                Modifier
-                    .testTag(tag)
-                    .size((dimen / LocalDensity.current.density).dp)
-                    .background(Color.Black)
-                    .graphicsLayer(
-                        alpha = 0.5f,
-                        compositingStrategy = CompositingStrategy.ModulateAlpha
-                    )
+                    Modifier.testTag(tag)
+                        .size((dimen / LocalDensity.current.density).dp)
+                        .background(Color.Black)
+                        .graphicsLayer(
+                            alpha = 0.5f,
+                            compositingStrategy = CompositingStrategy.ModulateAlpha
+                        )
             ) {
-                inset(0f, 0f, size.width / 3, size.height / 3) {
-                    drawRect(color = Color.Red)
-                }
-                inset(size.width / 3, size.height / 3, 0f, 0f) {
-                    drawRect(color = Color.Blue)
-                }
+                inset(0f, 0f, size.width / 3, size.height / 3) { drawRect(color = Color.Red) }
+                inset(size.width / 3, size.height / 3, 0f, 0f) { drawRect(color = Color.Blue) }
             }
         }
 
@@ -1279,17 +1128,12 @@
         rule.setContent {
             Canvas(
                 modifier =
-                Modifier
-                    .testTag(tag)
-                    .size((dimen / LocalDensity.current.density).dp)
-                    .background(Color.LightGray)
-                    .graphicsLayer(
-                        compositingStrategy = CompositingStrategy.Offscreen
-                    )
+                    Modifier.testTag(tag)
+                        .size((dimen / LocalDensity.current.density).dp)
+                        .background(Color.LightGray)
+                        .graphicsLayer(compositingStrategy = CompositingStrategy.Offscreen)
             ) {
-                inset(0f, 0f, size.width / 3, size.height / 3) {
-                    drawRect(color = Color.Red)
-                }
+                inset(0f, 0f, size.width / 3, size.height / 3) { drawRect(color = Color.Red) }
                 inset(size.width / 3, size.height / 3, 0f, 0f) {
                     drawRect(color = Color.Blue, blendMode = BlendMode.Xor)
                 }
@@ -1315,21 +1159,13 @@
         rule.setContent {
             Canvas(
                 modifier =
-                Modifier
-                    .testTag(tag)
-                    .size((dimen / LocalDensity.current.density).dp)
-                    .background(Color.Black)
-                    .graphicsLayer(
-                        alpha = 0.5f,
-                        compositingStrategy = CompositingStrategy.Auto
-                    )
+                    Modifier.testTag(tag)
+                        .size((dimen / LocalDensity.current.density).dp)
+                        .background(Color.Black)
+                        .graphicsLayer(alpha = 0.5f, compositingStrategy = CompositingStrategy.Auto)
             ) {
-                inset(0f, 0f, size.width / 3, size.height / 3) {
-                    drawRect(color = Color.Red)
-                }
-                inset(size.width / 3, size.height / 3, 0f, 0f) {
-                    drawRect(color = Color.Blue)
-                }
+                inset(0f, 0f, size.width / 3, size.height / 3) { drawRect(color = Color.Red) }
+                inset(size.width / 3, size.height / 3, 0f, 0f) { drawRect(color = Color.Blue) }
             }
         }
 
@@ -1361,16 +1197,16 @@
         var drawScopeHeight = -1f
         rule.setContent {
             Box(
-                modifier = Modifier
-                    .size(widthDp, heightDp)
-                    .graphicsLayer {
-                        graphicsLayerWidth = size.width
-                        graphicsLayerHeight = size.height
-                    }
-                    .drawBehind {
-                        drawScopeWidth = size.width
-                        drawScopeHeight = size.height
-                    }
+                modifier =
+                    Modifier.size(widthDp, heightDp)
+                        .graphicsLayer {
+                            graphicsLayerWidth = size.width
+                            graphicsLayerHeight = size.height
+                        }
+                        .drawBehind {
+                            drawScopeWidth = size.width
+                            drawScopeHeight = size.height
+                        }
             )
         }
         rule.runOnIdle {
@@ -1391,16 +1227,17 @@
 
         rule.setContent {
             density = LocalDensity.current
-            Box(modifier = Modifier
-                .size(composableSize, composableSize)
-                .graphicsLayer {
-                    graphicsLayerWidth = size.width
-                    graphicsLayerHeight = size.height
-                }
-                .drawBehind {
-                    drawScopeWidth = size.width
-                    drawScopeHeight = size.height
-                }
+            Box(
+                modifier =
+                    Modifier.size(composableSize, composableSize)
+                        .graphicsLayer {
+                            graphicsLayerWidth = size.width
+                            graphicsLayerHeight = size.height
+                        }
+                        .drawBehind {
+                            drawScopeWidth = size.width
+                            drawScopeHeight = size.height
+                        }
             )
         }
 
@@ -1432,14 +1269,10 @@
         val size = 100
         rule.setContent {
             val sizeDp = with(LocalDensity.current) { size.toDp() }
-            LazyColumn(
-                Modifier
-                    .testTag("lazy")
-                    .background(Color.Blue)) {
+            LazyColumn(Modifier.testTag("lazy").background(Color.Blue)) {
                 items(4) {
                     Box(
-                        Modifier
-                            .then(if (toggle) Modifier.graphicsLayer(alpha = 0f) else Modifier)
+                        Modifier.then(if (toggle) Modifier.graphicsLayer(alpha = 0f) else Modifier)
                             .background(Color.Red)
                             .size(sizeDp)
                     )
@@ -1452,9 +1285,7 @@
             assertEquals(Color.Blue.toArgb(), getPixel(10, (size * 2.5f).roundToInt()))
         }
 
-        rule.runOnIdle {
-            toggle = !toggle
-        }
+        rule.runOnIdle { toggle = !toggle }
 
         rule.onNodeWithTag("lazy").captureToImage().asAndroidBitmap().apply {
             assertEquals(Color.Red.toArgb(), getPixel(10, (size * 1.5f).roundToInt()))
@@ -1473,31 +1304,21 @@
         rule.setContent {
             val sizeDp = with(LocalDensity.current) { size.toDp() }
             Box(
-                Modifier
-                    .testTag("outer")
+                Modifier.testTag("outer")
                     .layout { measurable, constraints ->
                         val placeable = measurable.measure(constraints)
-                        layout(placeable.width, placeable.height) {
-                            placeable.place(0, 0)
-                        }
+                        layout(placeable.width, placeable.height) { placeable.place(0, 0) }
                     }
                     .then(
-                        if (toggle) Modifier
-                            .graphicsLayer(scaleX = 1f)
-                            .layout { measurable, constraints ->
+                        if (toggle)
+                            Modifier.graphicsLayer(scaleX = 1f).layout { measurable, constraints ->
                                 val placeable = measurable.measure(constraints)
-                                layout(placeable.width, placeable.height) {
-                                    placeable.place(0, 0)
-                                }
+                                layout(placeable.width, placeable.height) { placeable.place(0, 0) }
                             }
                         else Modifier
                     )
             ) {
-                Box(
-                    Modifier
-                        .background(Color.Red)
-                        .size(sizeDp)
-                )
+                Box(Modifier.background(Color.Red).size(sizeDp))
             }
         }
 
@@ -1507,17 +1328,13 @@
             assertEquals(Color.Red.toArgb(), getPixel(pt, pt))
         }
 
-        rule.runOnIdle {
-            toggle = !toggle
-        }
+        rule.runOnIdle { toggle = !toggle }
 
         rule.onNodeWithTag("outer").captureToImage().asAndroidBitmap().apply {
             assertEquals(Color.Red.toArgb(), getPixel(pt, pt))
         }
 
-        rule.runOnIdle {
-            toggle = !toggle
-        }
+        rule.runOnIdle { toggle = !toggle }
 
         rule.onNodeWithTag("outer").captureToImage().asAndroidBitmap().apply {
             assertEquals(Color.Red.toArgb(), getPixel(pt, pt))
@@ -1547,9 +1364,7 @@
             addGraphicsLayer = false
         }
 
-        rule.runOnIdle {
-            assertEquals(Rect(0f, 0f, 10f, 10f), coordinates.boundsInRoot())
-        }
+        rule.runOnIdle { assertEquals(Rect(0f, 0f, 10f, 10f), coordinates.boundsInRoot()) }
     }
 
     @Test
@@ -1558,39 +1373,25 @@
         var counter by mutableStateOf(0)
         var counterReadInDrawing = -1
         val content = movableContentOf {
-            Box(
-                Modifier
-                    .size(5.dp)
-                    .graphicsLayer()
-                    .drawBehind {
-                        counterReadInDrawing = counter
-                    })
+            Box(Modifier.size(5.dp).graphicsLayer().drawBehind { counterReadInDrawing = counter })
         }
 
         rule.setContent {
             if (moveContent) {
-                Box(Modifier.size(5.dp)) {
-                    content()
-                }
+                Box(Modifier.size(5.dp)) { content() }
             } else {
-                Box(Modifier.size(10.dp)) {
-                    content()
-                }
+                Box(Modifier.size(10.dp)) { content() }
             }
         }
 
-        rule.runOnIdle {
-            moveContent = true
-        }
+        rule.runOnIdle { moveContent = true }
 
         rule.runOnIdle {
             assertThat(counterReadInDrawing).isEqualTo(counter)
             counter++
         }
 
-        rule.runOnIdle {
-            assertThat(counterReadInDrawing).isEqualTo(counter)
-        }
+        rule.runOnIdle { assertThat(counterReadInDrawing).isEqualTo(counter) }
     }
 
     @Test
@@ -1599,39 +1400,25 @@
         var counter by mutableStateOf(0)
         var counterReadInLayerBlock = -1
         val content = movableContentOf {
-            Box(
-                Modifier
-                    .size(5.dp)
-                    .graphicsLayer {
-                        counterReadInLayerBlock = counter
-                    }
-            )
+            Box(Modifier.size(5.dp).graphicsLayer { counterReadInLayerBlock = counter })
         }
 
         rule.setContent {
             if (moveContent) {
-                Box(Modifier.size(5.dp)) {
-                    content()
-                }
+                Box(Modifier.size(5.dp)) { content() }
             } else {
-                Box(Modifier.size(10.dp)) {
-                    content()
-                }
+                Box(Modifier.size(10.dp)) { content() }
             }
         }
 
-        rule.runOnIdle {
-            moveContent = true
-        }
+        rule.runOnIdle { moveContent = true }
 
         rule.runOnIdle {
             assertThat(counterReadInLayerBlock).isEqualTo(counter)
             counter++
         }
 
-        rule.runOnIdle {
-            assertThat(counterReadInLayerBlock).isEqualTo(counter)
-        }
+        rule.runOnIdle { assertThat(counterReadInLayerBlock).isEqualTo(counter) }
     }
 
     @Test
@@ -1640,19 +1427,17 @@
         lateinit var coordinates: LayoutCoordinates
         var remeasureCount = 0
         var relayoutCount = 0
-        val layoutModifier = Modifier.layout { measurable, constraints ->
-            val placeable = measurable.measure(constraints)
-            remeasureCount++
-            layout(placeable.width, placeable.height) {
-                relayoutCount++
-                placeable.place(0, 0)
+        val layoutModifier =
+            Modifier.layout { measurable, constraints ->
+                val placeable = measurable.measure(constraints)
+                remeasureCount++
+                layout(placeable.width, placeable.height) {
+                    relayoutCount++
+                    placeable.place(0, 0)
+                }
             }
-        }
         rule.setContent {
-            Box(
-                Modifier
-                    .graphicsLayer(translationX = translationX)
-                    .then(layoutModifier)) {
+            Box(Modifier.graphicsLayer(translationX = translationX).then(layoutModifier)) {
                 Layout(Modifier.onGloballyPositioned { coordinates = it }) { _, _ ->
                     layout(10, 10) {}
                 }
@@ -1681,19 +1466,17 @@
         lateinit var coordinates: LayoutCoordinates
         var remeasureCount = 0
         var relayoutCount = 0
-        val layoutModifier = Modifier.layout { measurable, constraints ->
-            val placeable = measurable.measure(constraints)
-            remeasureCount++
-            layout(placeable.width, placeable.height) {
-                relayoutCount++
-                placeable.place(0, 0)
+        val layoutModifier =
+            Modifier.layout { measurable, constraints ->
+                val placeable = measurable.measure(constraints)
+                remeasureCount++
+                layout(placeable.width, placeable.height) {
+                    relayoutCount++
+                    placeable.place(0, 0)
+                }
             }
-        }
         rule.setContent {
-            Box(
-                Modifier
-                    .graphicsLayer(lambda)
-                    .then(layoutModifier)) {
+            Box(Modifier.graphicsLayer(lambda).then(layoutModifier)) {
                 Layout(Modifier.onGloballyPositioned { coordinates = it }) { _, _ ->
                     layout(10, 10) {}
                 }
@@ -1723,27 +1506,26 @@
         var needLayer by mutableStateOf(false)
         var layerBlockCalled = false
         rule.setContent {
-            Layout(content = {
-                Layout(
-                    modifier = Modifier.layout { measurable, constraints ->
-                        val placeable = measurable.measure(constraints)
-                        layout(placeable.width, placeable.height) {
-                            modifierRelayoutCount++
-                            placeable.place(0, 0)
-                        }
-                    }
-                ) { _, _ ->
-                    layout(10, 10) {
-                        relayoutCount++
+            Layout(
+                content = {
+                    Layout(
+                        modifier =
+                            Modifier.layout { measurable, constraints ->
+                                val placeable = measurable.measure(constraints)
+                                layout(placeable.width, placeable.height) {
+                                    modifierRelayoutCount++
+                                    placeable.place(0, 0)
+                                }
+                            }
+                    ) { _, _ ->
+                        layout(10, 10) { relayoutCount++ }
                     }
                 }
-            }) { measurables, constraints ->
+            ) { measurables, constraints ->
                 val placeable = measurables[0].measure(constraints)
                 layout(placeable.width, placeable.height) {
                     if (needLayer) {
-                        placeable.placeWithLayer(0, 0) {
-                            layerBlockCalled = true
-                        }
+                        placeable.placeWithLayer(0, 0) { layerBlockCalled = true }
                     } else {
                         placeable.place(0, 0)
                     }
@@ -1770,25 +1552,24 @@
         var modifierRelayoutCount = 0
         var position by mutableStateOf(0)
         rule.setContent {
-            Layout(content = {
-                Layout(
-                    modifier = Modifier.layout { measurable, constraints ->
-                        val placeable = measurable.measure(constraints)
-                        layout(placeable.width, placeable.height) {
-                            modifierRelayoutCount++
-                            placeable.place(0, 0)
-                        }
-                    }
-                ) { _, _ ->
-                    layout(10, 10) {
-                        relayoutCount++
+            Layout(
+                content = {
+                    Layout(
+                        modifier =
+                            Modifier.layout { measurable, constraints ->
+                                val placeable = measurable.measure(constraints)
+                                layout(placeable.width, placeable.height) {
+                                    modifierRelayoutCount++
+                                    placeable.place(0, 0)
+                                }
+                            }
+                    ) { _, _ ->
+                        layout(10, 10) { relayoutCount++ }
                     }
                 }
-            }) { measurables, constraints ->
+            ) { measurables, constraints ->
                 val placeable = measurables[0].measure(constraints)
-                layout(placeable.width, placeable.height) {
-                    placeable.placeWithLayer(position, 0)
-                }
+                layout(placeable.width, placeable.height) { placeable.placeWithLayer(position, 0) }
             }
         }
 
@@ -1810,9 +1591,8 @@
         rule.setContent {
             val layer = rememberGraphicsLayer()
             Canvas(
-                modifier = Modifier
-                    .testTag("tag")
-                    .layout { measurable, _ ->
+                modifier =
+                    Modifier.testTag("tag").layout { measurable, _ ->
                         val placeable = measurable.measure(Constraints.fixed(10, 10))
                         layout(placeable.width, placeable.height) {
                             placeable.placeWithLayer(0, 0, layer)
@@ -1823,9 +1603,7 @@
             }
         }
 
-        rule.onNodeWithTag("tag")
-            .captureToImage()
-            .assertPixels(IntSize(10, 10)) { Color.Blue }
+        rule.onNodeWithTag("tag").captureToImage().assertPixels(IntSize(10, 10)) { Color.Blue }
     }
 
     @Test
@@ -1834,12 +1612,13 @@
         rule.setContent {
             layer = rememberGraphicsLayer()
             Canvas(
-                modifier = Modifier.layout { measurable, _ ->
-                    val placeable = measurable.measure(Constraints.fixed(20, 20))
-                    layout(placeable.width, placeable.height) {
-                        placeable.placeWithLayer(10, 10, layer)
+                modifier =
+                    Modifier.layout { measurable, _ ->
+                        val placeable = measurable.measure(Constraints.fixed(20, 20))
+                        layout(placeable.width, placeable.height) {
+                            placeable.placeWithLayer(10, 10, layer)
+                        }
                     }
-                }
             ) {
                 drawRect(Color.Blue)
             }
@@ -1861,25 +1640,22 @@
             layer = rememberGraphicsLayer()
             if (needChild) {
                 Canvas(
-                    modifier = Modifier.layout { measurable, constraints ->
-                        val placeable = measurable.measure(constraints)
-                        layout(placeable.width, placeable.height) {
-                            placeable.placeWithLayer(1, 0, layer)
+                    modifier =
+                        Modifier.layout { measurable, constraints ->
+                            val placeable = measurable.measure(constraints)
+                            layout(placeable.width, placeable.height) {
+                                placeable.placeWithLayer(1, 0, layer)
+                            }
                         }
-                    }
                 ) {
                     drawRect(Color.Blue)
                 }
             }
         }
 
-        rule.runOnIdle {
-            needChild = false
-        }
+        rule.runOnIdle { needChild = false }
 
-        rule.runOnIdle {
-            assertThat(layer.isReleased).isFalse()
-        }
+        rule.runOnIdle { assertThat(layer.isReleased).isFalse() }
     }
 
     @SdkSuppress(minSdkVersion = Build.VERSION_CODES.O)
@@ -1887,37 +1663,34 @@
     fun switchingFromExplicitLayerToImplicit() {
         var useExplicitLayer by mutableStateOf(true)
         rule.setContent {
-            val layer = if (useExplicitLayer) {
-                rememberGraphicsLayer()
-            } else {
-                null
-            }
+            val layer =
+                if (useExplicitLayer) {
+                    rememberGraphicsLayer()
+                } else {
+                    null
+                }
             Canvas(
-                modifier = Modifier
-                    .testTag("tag")
-                    .layout { measurable, _ ->
-                        val placeable = measurable.measure(Constraints.fixed(10, 10))
-                        layout(placeable.width, placeable.height) {
-                            if (layer != null) {
-                                placeable.placeWithLayer(0, 0, layer)
-                            } else {
-                                placeable.place(0, 0)
+                modifier =
+                    Modifier.testTag("tag")
+                        .layout { measurable, _ ->
+                            val placeable = measurable.measure(Constraints.fixed(10, 10))
+                            layout(placeable.width, placeable.height) {
+                                if (layer != null) {
+                                    placeable.placeWithLayer(0, 0, layer)
+                                } else {
+                                    placeable.place(0, 0)
+                                }
                             }
                         }
-                    }
-                    .then(if (layer != null) Modifier else Modifier.graphicsLayer())
+                        .then(if (layer != null) Modifier else Modifier.graphicsLayer())
             ) {
                 drawRect(Color.Blue)
             }
         }
 
-        rule.runOnIdle {
-            useExplicitLayer = false
-        }
+        rule.runOnIdle { useExplicitLayer = false }
 
-        rule.onNodeWithTag("tag")
-            .captureToImage()
-            .assertPixels(IntSize(10, 10)) { Color.Blue }
+        rule.onNodeWithTag("tag").captureToImage().assertPixels(IntSize(10, 10)) { Color.Blue }
     }
 
     @Test
@@ -1926,19 +1699,13 @@
         rule.setContent {
             CompositionLocalProvider(LocalDensity provides Density(1f)) {
                 Box(
-                    modifier = Modifier
-                        .size(10.dp)
-                        .rotate(180f)
-                        .onPlaced {
-                            bounds = it.boundsInRoot()
-                        }
+                    modifier =
+                        Modifier.size(10.dp).rotate(180f).onPlaced { bounds = it.boundsInRoot() }
                 )
             }
         }
 
-        rule.runOnIdle {
-            assertThat(bounds).isEqualTo(Rect(0f, 0f, 10f, 10f))
-        }
+        rule.runOnIdle { assertThat(bounds).isEqualTo(Rect(0f, 0f, 10f, 10f)) }
     }
 
     @Test
@@ -1947,19 +1714,13 @@
         rule.setContent {
             CompositionLocalProvider(LocalDensity provides Density(1f)) {
                 Box(
-                    modifier = Modifier
-                        .size(9.dp)
-                        .rotate(180f)
-                        .onPlaced {
-                            bounds = it.boundsInRoot()
-                        }
+                    modifier =
+                        Modifier.size(9.dp).rotate(180f).onPlaced { bounds = it.boundsInRoot() }
                 )
             }
         }
 
-        rule.runOnIdle {
-            assertThat(bounds).isEqualTo(Rect(0f, 0f, 9f, 9f))
-        }
+        rule.runOnIdle { assertThat(bounds).isEqualTo(Rect(0f, 0f, 9f, 9f)) }
     }
 
     @Test
@@ -1968,21 +1729,17 @@
         rule.setContent {
             CompositionLocalProvider(LocalDensity provides Density(1f)) {
                 Box(
-                    modifier = Modifier
-                        .size(10.dp)
-                        .graphicsLayer(
-                            rotationZ = 180f,
-                            transformOrigin = TransformOrigin(1f, 1f)
-                        )
-                        .onPlaced {
-                            bounds = it.boundsInRoot()
-                        }
+                    modifier =
+                        Modifier.size(10.dp)
+                            .graphicsLayer(
+                                rotationZ = 180f,
+                                transformOrigin = TransformOrigin(1f, 1f)
+                            )
+                            .onPlaced { bounds = it.boundsInRoot() }
                 )
             }
         }
 
-        rule.runOnIdle {
-            assertThat(bounds).isEqualTo(Rect(10f, 10f, 20f, 20f))
-        }
+        rule.runOnIdle { assertThat(bounds).isEqualTo(Rect(10f, 10f, 20f, 20f)) }
     }
 }
diff --git a/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/draw/InvalidatingNotPlacedChildTest.kt b/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/draw/InvalidatingNotPlacedChildTest.kt
index 4133459..86f7d58 100644
--- a/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/draw/InvalidatingNotPlacedChildTest.kt
+++ b/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/draw/InvalidatingNotPlacedChildTest.kt
@@ -49,41 +49,25 @@
 @RunWith(AndroidJUnit4::class)
 class InvalidatingNotPlacedChildTest {
 
-    @get:Rule
-    val composeTestRule = createComposeRule()
+    @get:Rule val composeTestRule = createComposeRule()
 
-    @get:Rule
-    val excessiveAssertions = AndroidOwnerExtraAssertionsRule()
+    @get:Rule val excessiveAssertions = AndroidOwnerExtraAssertionsRule()
 
     @Test
     @SdkSuppress(minSdkVersion = Build.VERSION_CODES.O)
     fun childIsDisplayedWhenItWasNotPlacedOriginallyButPlacedLater() {
         val shouldPlace = mutableStateOf(false)
         composeTestRule.setContent {
-            ConditionallyPlacedChild(
-                shouldPlace,
-                Modifier.background(Color.Blue)
-                    .testTag("node")
-            ) {
-                Spacer(
-                    Modifier.requiredSize(5.dp)
-                        .graphicsLayer()
-                        .background(Color.Red)
-                )
+            ConditionallyPlacedChild(shouldPlace, Modifier.background(Color.Blue).testTag("node")) {
+                Spacer(Modifier.requiredSize(5.dp).graphicsLayer().background(Color.Red))
             }
         }
 
-        composeTestRule.onNodeWithTag("node")
-            .captureToImage()
-            .assertCenterPixelColor(Color.Blue)
+        composeTestRule.onNodeWithTag("node").captureToImage().assertCenterPixelColor(Color.Blue)
 
-        composeTestRule.runOnIdle {
-            shouldPlace.value = true
-        }
+        composeTestRule.runOnIdle { shouldPlace.value = true }
 
-        composeTestRule.onNodeWithTag("node")
-            .captureToImage()
-            .assertCenterPixelColor(Color.Red)
+        composeTestRule.onNodeWithTag("node").captureToImage().assertCenterPixelColor(Color.Red)
     }
 
     @Test
@@ -91,32 +75,18 @@
     fun grandChildIsDisplayedWhenItWasNotPlacedOriginallyButPlacedLater() {
         val shouldPlace = mutableStateOf(false)
         composeTestRule.setContent {
-            ConditionallyPlacedChild(
-                shouldPlace,
-                Modifier.background(Color.Blue)
-                    .testTag("node")
-            ) {
+            ConditionallyPlacedChild(shouldPlace, Modifier.background(Color.Blue).testTag("node")) {
                 MeasureInLayoutBlock {
-                    Spacer(
-                        Modifier.fillMaxSize()
-                            .graphicsLayer()
-                            .background(Color.Gray)
-                    )
+                    Spacer(Modifier.fillMaxSize().graphicsLayer().background(Color.Gray))
                 }
             }
         }
 
-        composeTestRule.onNodeWithTag("node")
-            .captureToImage()
-            .assertCenterPixelColor(Color.Blue)
+        composeTestRule.onNodeWithTag("node").captureToImage().assertCenterPixelColor(Color.Blue)
 
-        composeTestRule.runOnIdle {
-            shouldPlace.value = true
-        }
+        composeTestRule.runOnIdle { shouldPlace.value = true }
 
-        composeTestRule.onNodeWithTag("node")
-            .captureToImage()
-            .assertCenterPixelColor(Color.Gray)
+        composeTestRule.onNodeWithTag("node").captureToImage().assertCenterPixelColor(Color.Gray)
     }
 
     @Test
@@ -126,25 +96,15 @@
         composeTestRule.setContent {
             ConditionallyPlacedChild(
                 shouldPlace,
-                Modifier.background(Color.Blue)
-                    .graphicsLayer()
-                    .testTag("node")
+                Modifier.background(Color.Blue).graphicsLayer().testTag("node")
             ) {
-                Spacer(
-                    Modifier.fillMaxSize()
-                        .graphicsLayer()
-                        .background(Color.Red)
-                )
+                Spacer(Modifier.fillMaxSize().graphicsLayer().background(Color.Red))
             }
         }
 
-        composeTestRule.runOnIdle {
-            shouldPlace.value = false
-        }
+        composeTestRule.runOnIdle { shouldPlace.value = false }
 
-        composeTestRule.onNodeWithTag("node")
-            .captureToImage()
-            .assertCenterPixelColor(Color.Blue)
+        composeTestRule.onNodeWithTag("node").captureToImage().assertCenterPixelColor(Color.Blue)
     }
 
     @Test
@@ -152,12 +112,7 @@
     fun childRedrawRequestedWhileNotPlaced() {
         assertChangeWhileNotPlacedIsApplied { shouldPlace, color ->
             ConditionallyPlacedChild(shouldPlace) {
-                Spacer(
-                    Modifier.fillMaxSize()
-                        .drawBehind {
-                            drawRect(color.value)
-                        }
-                )
+                Spacer(Modifier.fillMaxSize().drawBehind { drawRect(color.value) })
             }
         }
     }
@@ -167,13 +122,7 @@
     fun childRedrawRequestedWhileNotPlaced_hadLayer() {
         assertChangeWhileNotPlacedIsApplied { shouldPlace, color ->
             ConditionallyPlacedChild(shouldPlace) {
-                Spacer(
-                    Modifier.fillMaxSize()
-                        .graphicsLayer()
-                        .drawBehind {
-                            drawRect(color.value)
-                        }
-                )
+                Spacer(Modifier.fillMaxSize().graphicsLayer().drawBehind { drawRect(color.value) })
             }
         }
     }
@@ -184,12 +133,7 @@
         assertChangeWhileNotPlacedIsApplied { shouldPlace, color ->
             ConditionallyPlacedChild(shouldPlace) {
                 Box(Modifier.graphicsLayer()) {
-                    Spacer(
-                        Modifier.fillMaxSize()
-                            .drawBehind {
-                                drawRect(color.value)
-                            }
-                    )
+                    Spacer(Modifier.fillMaxSize().drawBehind { drawRect(color.value) })
                 }
             }
         }
@@ -200,12 +144,7 @@
     fun childRedrawRequestedWhileNotPlaced_placedWithLayer() {
         assertChangeWhileNotPlacedIsApplied { shouldPlace, color ->
             ConditionallyPlacedChild(shouldPlace, placeWithLayer = true) {
-                Spacer(
-                    Modifier.fillMaxSize()
-                        .drawBehind {
-                            drawRect(color.value)
-                        }
-                )
+                Spacer(Modifier.fillMaxSize().drawBehind { drawRect(color.value) })
             }
         }
     }
@@ -216,11 +155,9 @@
         assertChangeWhileNotPlacedIsApplied { shouldPlace, color ->
             ConditionallyPlacedChild(shouldPlace) {
                 Spacer(
-                    Modifier.fillMaxSize()
-                        .layout(useDuringMeasure = color)
-                        .drawBehind {
-                            drawRect(color.value)
-                        }
+                    Modifier.fillMaxSize().layout(useDuringMeasure = color).drawBehind {
+                        drawRect(color.value)
+                    }
                 )
             }
         }
@@ -232,11 +169,9 @@
         assertChangeWhileNotPlacedIsApplied { shouldPlace, color ->
             ConditionallyPlacedChild(shouldPlace) {
                 Spacer(
-                    Modifier.fillMaxSize()
-                        .layout(useDuringLayout = color)
-                        .drawBehind {
-                            drawRect(color.value)
-                        }
+                    Modifier.fillMaxSize().layout(useDuringLayout = color).drawBehind {
+                        drawRect(color.value)
+                    }
                 )
             }
         }
@@ -248,12 +183,7 @@
         assertChangeWhileNotPlacedIsApplied { shouldPlace, color ->
             ConditionallyPlacedChild(shouldPlace) {
                 MeasureInLayoutBlock {
-                    Spacer(
-                        Modifier.fillMaxSize()
-                            .drawBehind {
-                                drawRect(color.value)
-                            }
-                    )
+                    Spacer(Modifier.fillMaxSize().drawBehind { drawRect(color.value) })
                 }
             }
         }
@@ -266,11 +196,7 @@
             ConditionallyPlacedChild(shouldPlace) {
                 MeasureInLayoutBlock {
                     Spacer(
-                        Modifier.fillMaxSize()
-                            .graphicsLayer()
-                            .drawBehind {
-                                drawRect(color.value)
-                            }
+                        Modifier.fillMaxSize().graphicsLayer().drawBehind { drawRect(color.value) }
                     )
                 }
             }
@@ -284,12 +210,7 @@
             ConditionallyPlacedChild(shouldPlace) {
                 MeasureInLayoutBlock {
                     Box(Modifier.graphicsLayer()) {
-                        Spacer(
-                            Modifier.fillMaxSize()
-                                .drawBehind {
-                                    drawRect(color.value)
-                                }
-                        )
+                        Spacer(Modifier.fillMaxSize().drawBehind { drawRect(color.value) })
                     }
                 }
             }
@@ -302,12 +223,7 @@
         assertChangeWhileNotPlacedIsApplied { shouldPlace, color ->
             ConditionallyPlacedChild(shouldPlace) {
                 MeasureInLayoutBlock(placeWithLayer = true) {
-                    Spacer(
-                        Modifier.fillMaxSize()
-                            .drawBehind {
-                                drawRect(color.value)
-                            }
-                    )
+                    Spacer(Modifier.fillMaxSize().drawBehind { drawRect(color.value) })
                 }
             }
         }
@@ -320,11 +236,9 @@
             ConditionallyPlacedChild(shouldPlace) {
                 MeasureInLayoutBlock {
                     Spacer(
-                        Modifier.fillMaxSize()
-                            .layout(useDuringMeasure = color)
-                            .drawBehind {
-                                drawRect(color.value)
-                            }
+                        Modifier.fillMaxSize().layout(useDuringMeasure = color).drawBehind {
+                            drawRect(color.value)
+                        }
                     )
                 }
             }
@@ -338,11 +252,9 @@
             ConditionallyPlacedChild(shouldPlace) {
                 MeasureInLayoutBlock {
                     Spacer(
-                        Modifier.fillMaxSize()
-                            .layout(useDuringLayout = color)
-                            .drawBehind {
-                                drawRect(color.value)
-                            }
+                        Modifier.fillMaxSize().layout(useDuringLayout = color).drawBehind {
+                            drawRect(color.value)
+                        }
                     )
                 }
             }
@@ -357,29 +269,16 @@
         val shouldPlace = mutableStateOf(true)
         var color = mutableStateOf(Color.Gray)
         composeTestRule.setContent {
-            Box(
-                Modifier.background(Color.Blue)
-                    .testTag("node")
-            ) {
-                content(shouldPlace, color)
-            }
+            Box(Modifier.background(Color.Blue).testTag("node")) { content(shouldPlace, color) }
         }
 
-        composeTestRule.runOnIdle {
-            shouldPlace.value = false
-        }
+        composeTestRule.runOnIdle { shouldPlace.value = false }
 
-        composeTestRule.runOnIdle {
-            color.value = Color.Red
-        }
+        composeTestRule.runOnIdle { color.value = Color.Red }
 
-        composeTestRule.runOnIdle {
-            shouldPlace.value = true
-        }
+        composeTestRule.runOnIdle { shouldPlace.value = true }
 
-        composeTestRule.onNodeWithTag("node")
-            .captureToImage()
-            .assertCenterPixelColor(Color.Red)
+        composeTestRule.onNodeWithTag("node").captureToImage().assertCenterPixelColor(Color.Red)
     }
 }
 
diff --git a/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/draw/NotHardwareAcceleratedActivityTest.kt b/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/draw/NotHardwareAcceleratedActivityTest.kt
index 7657dec2..5875750 100644
--- a/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/draw/NotHardwareAcceleratedActivityTest.kt
+++ b/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/draw/NotHardwareAcceleratedActivityTest.kt
@@ -44,19 +44,16 @@
 @RunWith(AndroidJUnit4::class)
 class NotHardwareAcceleratedActivityTest {
 
-    @get:Rule
-    val composeTestRule = createAndroidComposeRule<NotHardwareAcceleratedActivity>()
+    @get:Rule val composeTestRule = createAndroidComposeRule<NotHardwareAcceleratedActivity>()
 
-    @get:Rule
-    val screenshotRule = AndroidXScreenshotTestRule(GOLDEN_UI)
+    @get:Rule val screenshotRule = AndroidXScreenshotTestRule(GOLDEN_UI)
 
     @Test
     fun layerTransformationsApplied() {
         composeTestRule.setContent {
             Box(Modifier.size(200.dp).background(Color.White).testTag("box")) {
                 Box(
-                    Modifier
-                        .layout { measurable, constraints ->
+                    Modifier.layout { measurable, constraints ->
                             val placeable = measurable.measure(constraints)
                             layout(placeable.width, placeable.height) {
                                 val offset = 50.dp.roundToPx()
@@ -73,7 +70,8 @@
             }
         }
 
-        composeTestRule.onNodeWithTag("box")
+        composeTestRule
+            .onNodeWithTag("box")
             .captureToImage()
             .assertAgainstGolden(screenshotRule, "not_hardware_accelerated_activity")
     }
diff --git a/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/draw/PainterModifierTest.kt b/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/draw/PainterModifierTest.kt
index 9efacc9..9d764c8 100644
--- a/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/draw/PainterModifierTest.kt
+++ b/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/draw/PainterModifierTest.kt
@@ -111,8 +111,7 @@
     val containerWidth = 100.0f
     private val containerHeight = 100.0f
 
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
     @Before
     fun before() {
@@ -127,54 +126,43 @@
     @SdkSuppress(minSdkVersion = Build.VERSION_CODES.O)
     @Test
     fun testPainterModifierColorFilter() {
-        rule.setContent {
-            TestPainter(colorFilter = ColorFilter.tint(Color.Cyan, BlendMode.SrcIn))
-        }
+        rule.setContent { TestPainter(colorFilter = ColorFilter.tint(Color.Cyan, BlendMode.SrcIn)) }
 
-        rule.obtainScreenshotBitmap(
-            containerWidth.roundToInt(),
-            containerHeight.roundToInt()
-        ).apply {
-            assertEquals(Color.Cyan.toArgb(), getPixel(50, 50))
-        }
+        rule
+            .obtainScreenshotBitmap(containerWidth.roundToInt(), containerHeight.roundToInt())
+            .apply { assertEquals(Color.Cyan.toArgb(), getPixel(50, 50)) }
     }
 
     @SdkSuppress(minSdkVersion = Build.VERSION_CODES.O)
     @Test
     fun testPainterModifierAlpha() {
-        rule.setContent {
-            TestPainter(alpha = 0.5f)
-        }
+        rule.setContent { TestPainter(alpha = 0.5f) }
 
-        rule.obtainScreenshotBitmap(
-            containerWidth.roundToInt(),
-            containerHeight.roundToInt()
-        ).apply {
-            val expected = Color(
-                alpha = 0.5f,
-                red = Color.Red.red,
-                green = Color.Red.green,
-                blue = Color.Red.blue
-            ).compositeOver(Color.White)
+        rule
+            .obtainScreenshotBitmap(containerWidth.roundToInt(), containerHeight.roundToInt())
+            .apply {
+                val expected =
+                    Color(
+                            alpha = 0.5f,
+                            red = Color.Red.red,
+                            green = Color.Red.green,
+                            blue = Color.Red.blue
+                        )
+                        .compositeOver(Color.White)
 
-            val result = Color(getPixel(50, 50))
-            assertColorsEqual(expected, result)
-        }
+                val result = Color(getPixel(50, 50))
+                assertColorsEqual(expected, result)
+            }
     }
 
     @SdkSuppress(minSdkVersion = Build.VERSION_CODES.O)
     @Test
     fun testPainterModifierRtl() {
-        rule.setContent {
-            TestPainter(rtl = true)
-        }
+        rule.setContent { TestPainter(rtl = true) }
 
-        rule.obtainScreenshotBitmap(
-            containerWidth.roundToInt(),
-            containerHeight.roundToInt()
-        ).apply {
-            assertEquals(Color.Blue.toArgb(), getPixel(50, 50))
-        }
+        rule
+            .obtainScreenshotBitmap(containerWidth.roundToInt(), containerHeight.roundToInt())
+            .apply { assertEquals(Color.Blue.toArgb(), getPixel(50, 50)) }
     }
 
     @SdkSuppress(minSdkVersion = Build.VERSION_CODES.O)
@@ -189,51 +177,33 @@
                 Padding(containerWidth.roundToInt()) {
                     AtLeastSize(
                         size = containerWidth.roundToInt(),
-                        modifier = Modifier.paint(
-                            TestPainter(
-                                containerWidth * 2,
-                                containerHeight * 2
-                            ),
-                            alignment = Alignment.Center,
-                            contentScale = ContentScale.Inside
-                        )
-                    ) {
-                    }
+                        modifier =
+                            Modifier.paint(
+                                TestPainter(containerWidth * 2, containerHeight * 2),
+                                alignment = Alignment.Center,
+                                contentScale = ContentScale.Inside
+                            )
+                    ) {}
                 }
             }
         }
 
-        rule.obtainScreenshotBitmap(
-            containerSizePx,
-            containerSizePx
-        ).apply {
+        rule.obtainScreenshotBitmap(containerSizePx, containerSizePx).apply {
             assertEquals(
                 Color.White.toArgb(),
-                getPixel(
-                    containerWidth.roundToInt() - 1,
-                    containerHeight.roundToInt() - 1
-                )
+                getPixel(containerWidth.roundToInt() - 1, containerHeight.roundToInt() - 1)
             )
             assertEquals(
                 Color.Red.toArgb(),
-                getPixel(
-                    containerWidth.roundToInt() + 1,
-                    containerWidth.roundToInt() + 1
-                )
+                getPixel(containerWidth.roundToInt() + 1, containerWidth.roundToInt() + 1)
             )
             assertEquals(
                 Color.Red.toArgb(),
-                getPixel(
-                    containerWidth.roundToInt() * 2 - 1,
-                    containerWidth.roundToInt() * 2 - 1
-                )
+                getPixel(containerWidth.roundToInt() * 2 - 1, containerWidth.roundToInt() * 2 - 1)
             )
             assertEquals(
                 Color.White.toArgb(),
-                getPixel(
-                    containerWidth.roundToInt() * 2 + 1,
-                    containerHeight.roundToInt() * 2 + 1
-                )
+                getPixel(containerWidth.roundToInt() * 2 + 1, containerHeight.roundToInt() * 2 + 1)
             )
         }
     }
@@ -245,13 +215,13 @@
         rule.setContent {
             AtLeastSize(
                 size = containerWidth.roundToInt() * 2,
-                modifier = Modifier
-                    .background(Color.White)
-                    .paint(
-                        TestPainter(
-                            containerWidth, containerHeight
-                        ), alignment = Alignment.BottomEnd, contentScale = ContentScale.Inside
-                    )
+                modifier =
+                    Modifier.background(Color.White)
+                        .paint(
+                            TestPainter(containerWidth, containerHeight),
+                            alignment = Alignment.BottomEnd,
+                            contentScale = ContentScale.Inside
+                        )
             ) {
                 // Intentionally empty
             }
@@ -261,10 +231,7 @@
         val right = containerSizePx - 1
         val innerBoxTop = containerSizePx - containerWidth.roundToInt()
         val innerBoxLeft = containerSizePx - containerWidth.roundToInt()
-        rule.obtainScreenshotBitmap(
-            containerSizePx,
-            containerSizePx
-        ).apply {
+        rule.obtainScreenshotBitmap(containerSizePx, containerSizePx).apply {
             assertEquals(Color.Red.toArgb(), getPixel(right, bottom))
             assertEquals(Color.Red.toArgb(), getPixel(innerBoxLeft, bottom))
             assertEquals(Color.Red.toArgb(), getPixel(innerBoxLeft, innerBoxTop + 1))
@@ -289,21 +256,17 @@
             }
         }
 
-        rule.obtainScreenshotBitmap(
-            containerWidth.roundToInt(),
-            containerHeight.roundToInt()
-        ).apply {
-            assertEquals(Color.Red.toArgb(), getPixel(0, 0))
-            assertEquals(Color.Red.toArgb(), getPixel(containerWidth.roundToInt() - 1, 0))
-            assertEquals(
-                Color.Red.toArgb(),
-                getPixel(
-                    containerWidth.roundToInt() - 1,
-                    containerHeight.roundToInt() - 1
+        rule
+            .obtainScreenshotBitmap(containerWidth.roundToInt(), containerHeight.roundToInt())
+            .apply {
+                assertEquals(Color.Red.toArgb(), getPixel(0, 0))
+                assertEquals(Color.Red.toArgb(), getPixel(containerWidth.roundToInt() - 1, 0))
+                assertEquals(
+                    Color.Red.toArgb(),
+                    getPixel(containerWidth.roundToInt() - 1, containerHeight.roundToInt() - 1)
                 )
-            )
-            assertEquals(Color.Red.toArgb(), getPixel(0, containerHeight.roundToInt() - 1))
-        }
+                assertEquals(Color.Red.toArgb(), getPixel(0, containerHeight.roundToInt() - 1))
+            }
     }
 
     @SdkSuppress(minSdkVersion = Build.VERSION_CODES.O)
@@ -312,19 +275,16 @@
         val containerSize = containerWidth.roundToInt() / 2
         rule.setContent {
             NoIntrinsicSizeContainer(
-                Modifier
-                    .background(Color.White)
+                Modifier.background(Color.White)
                     .then(FixedSizeModifier(containerWidth.roundToInt()))
             ) {
                 NoIntrinsicSizeContainer(
                     AlignTopLeft.then(
-                        FixedSizeModifier(containerSize).paint(
-                            TestPainter(
-                                containerWidth,
-                                containerHeight
-                            ),
-                            alignment = Alignment.TopStart
-                        )
+                        FixedSizeModifier(containerSize)
+                            .paint(
+                                TestPainter(containerWidth, containerHeight),
+                                alignment = Alignment.TopStart
+                            )
                     )
                 ) {
                     // Intentionally empty
@@ -332,30 +292,26 @@
             }
         }
 
-        rule.obtainScreenshotBitmap(
-            containerWidth.roundToInt(),
-            containerHeight.roundToInt()
-        ).apply {
-            assertEquals(Color.Red.toArgb(), getPixel(0, 0))
-            assertEquals(Color.Red.toArgb(), getPixel(containerWidth.roundToInt() / 2 - 1, 0))
-            assertEquals(
-                Color.White.toArgb(),
-                getPixel(
-                    containerWidth.roundToInt() - 1,
-                    containerHeight.roundToInt() - 1
+        rule
+            .obtainScreenshotBitmap(containerWidth.roundToInt(), containerHeight.roundToInt())
+            .apply {
+                assertEquals(Color.Red.toArgb(), getPixel(0, 0))
+                assertEquals(Color.Red.toArgb(), getPixel(containerWidth.roundToInt() / 2 - 1, 0))
+                assertEquals(
+                    Color.White.toArgb(),
+                    getPixel(containerWidth.roundToInt() - 1, containerHeight.roundToInt() - 1)
                 )
-            )
-            assertEquals(Color.Red.toArgb(), getPixel(0, containerHeight.roundToInt() / 2 - 1))
+                assertEquals(Color.Red.toArgb(), getPixel(0, containerHeight.roundToInt() / 2 - 1))
 
-            assertEquals(Color.White.toArgb(), getPixel(containerWidth.roundToInt() / 2 + 1, 0))
-            assertEquals(
-                Color.White.toArgb(),
-                getPixel(
-                    containerWidth.roundToInt() / 2 + 1,
-                    containerHeight.roundToInt() / 2 + 1
+                assertEquals(Color.White.toArgb(), getPixel(containerWidth.roundToInt() / 2 + 1, 0))
+                assertEquals(
+                    Color.White.toArgb(),
+                    getPixel(
+                        containerWidth.roundToInt() / 2 + 1,
+                        containerHeight.roundToInt() / 2 + 1
+                    )
                 )
-            )
-        }
+            }
     }
 
     @Test
@@ -366,10 +322,7 @@
                     // Lazy column has unbounded height so ensure that the constraints
                     // provided to Painters without an intrinsic size are with a finite
                     // range (i.e. don't crash)
-                    Image(
-                        painter = ColorPainter(Color.Black),
-                        contentDescription = ""
-                    )
+                    Image(painter = ColorPainter(Color.Black), contentDescription = "")
                 }
             }
         }
@@ -381,37 +334,25 @@
         val containerSize = containerWidth.roundToInt() / 2
         rule.setContent {
             NoIntrinsicSizeContainer(
-                Modifier
-                    .background(Color.White)
-                    .then(FixedSizeModifier(containerSize))
+                Modifier.background(Color.White).then(FixedSizeModifier(containerSize))
             ) {
                 NoIntrinsicSizeContainer(
-                    FixedSizeModifier(containerSize).paint(
-                        TestPainter(
-                            containerWidth,
-                            containerHeight
-                        ),
-                        sizeToIntrinsics = false, alignment = Alignment.TopStart
-                    )
+                    FixedSizeModifier(containerSize)
+                        .paint(
+                            TestPainter(containerWidth, containerHeight),
+                            sizeToIntrinsics = false,
+                            alignment = Alignment.TopStart
+                        )
                 ) {
                     // Intentionally empty
                 }
             }
         }
 
-        rule.obtainScreenshotBitmap(
-            containerSize,
-            containerSize
-        ).apply {
+        rule.obtainScreenshotBitmap(containerSize, containerSize).apply {
             assertEquals(Color.Red.toArgb(), getPixel(0, 0))
             assertEquals(Color.Red.toArgb(), getPixel(containerSize - 1, 0))
-            assertEquals(
-                Color.Red.toArgb(),
-                getPixel(
-                    containerSize - 1,
-                    containerSize - 1
-                )
-            )
+            assertEquals(Color.Red.toArgb(), getPixel(containerSize - 1, containerSize - 1))
             assertEquals(Color.Red.toArgb(), getPixel(0, containerSize - 1))
         }
     }
@@ -422,8 +363,7 @@
         rule.setContent {
             NoMinSizeContainer {
                 NoIntrinsicSizeContainer(
-                    Modifier
-                        .width(IntrinsicSize.Min)
+                    Modifier.width(IntrinsicSize.Min)
                         .paint(TestPainter(containerWidth, containerHeight))
                 ) {
                     // Intentionally empty
@@ -431,21 +371,17 @@
             }
         }
 
-        rule.obtainScreenshotBitmap(
-            containerWidth.roundToInt(),
-            containerHeight.roundToInt()
-        ).apply {
-            assertEquals(Color.Red.toArgb(), getPixel(0, 0))
-            assertEquals(Color.Red.toArgb(), getPixel(containerWidth.roundToInt() - 1, 0))
-            assertEquals(
-                Color.Red.toArgb(),
-                getPixel(
-                    containerWidth.roundToInt() - 1,
-                    containerHeight.roundToInt() - 1
+        rule
+            .obtainScreenshotBitmap(containerWidth.roundToInt(), containerHeight.roundToInt())
+            .apply {
+                assertEquals(Color.Red.toArgb(), getPixel(0, 0))
+                assertEquals(Color.Red.toArgb(), getPixel(containerWidth.roundToInt() - 1, 0))
+                assertEquals(
+                    Color.Red.toArgb(),
+                    getPixel(containerWidth.roundToInt() - 1, containerHeight.roundToInt() - 1)
                 )
-            )
-            assertEquals(Color.Red.toArgb(), getPixel(0, containerHeight.roundToInt() - 1))
-        }
+                assertEquals(Color.Red.toArgb(), getPixel(0, containerHeight.roundToInt() - 1))
+            }
     }
 
     @SdkSuppress(minSdkVersion = Build.VERSION_CODES.O)
@@ -454,8 +390,7 @@
         rule.setContent {
             NoMinSizeContainer {
                 NoIntrinsicSizeContainer(
-                    Modifier
-                        .height(IntrinsicSize.Min)
+                    Modifier.height(IntrinsicSize.Min)
                         .paint(TestPainter(containerWidth, containerHeight))
                 ) {
                     // Intentionally empty
@@ -463,21 +398,17 @@
             }
         }
 
-        rule.obtainScreenshotBitmap(
-            containerWidth.roundToInt(),
-            containerHeight.roundToInt()
-        ).apply {
-            assertEquals(Color.Red.toArgb(), getPixel(0, 0))
-            assertEquals(Color.Red.toArgb(), getPixel(containerWidth.roundToInt() - 1, 0))
-            assertEquals(
-                Color.Red.toArgb(),
-                getPixel(
-                    containerWidth.roundToInt() - 1,
-                    containerHeight.roundToInt() - 1
+        rule
+            .obtainScreenshotBitmap(containerWidth.roundToInt(), containerHeight.roundToInt())
+            .apply {
+                assertEquals(Color.Red.toArgb(), getPixel(0, 0))
+                assertEquals(Color.Red.toArgb(), getPixel(containerWidth.roundToInt() - 1, 0))
+                assertEquals(
+                    Color.Red.toArgb(),
+                    getPixel(containerWidth.roundToInt() - 1, containerHeight.roundToInt() - 1)
                 )
-            )
-            assertEquals(Color.Red.toArgb(), getPixel(0, containerHeight.roundToInt() - 1))
-        }
+                assertEquals(Color.Red.toArgb(), getPixel(0, containerHeight.roundToInt() - 1))
+            }
     }
 
     @Test
@@ -527,22 +458,23 @@
     }
 
     @Test
-    fun testPainterFixedDimensionUnchanged(): Unit = with(rule.density) {
-        val painterWidth = 1000f
-        val painterHeight = 375f
-        val composableWidth = 250f
-        val composableHeight = 400f
-        // Because the constraints are tight here, do not attempt to resize the composable
-        // based on the intrinsic dimensions of the Painter
-        testPainterScaleMatchesSize(
-            Modifier.requiredWidth(composableWidth.toDp())
-                .requiredHeight(composableHeight.toDp()),
-            ContentScale.Fit,
-            Size(painterWidth, painterHeight),
-            composableWidth,
-            composableHeight
-        )
-    }
+    fun testPainterFixedDimensionUnchanged(): Unit =
+        with(rule.density) {
+            val painterWidth = 1000f
+            val painterHeight = 375f
+            val composableWidth = 250f
+            val composableHeight = 400f
+            // Because the constraints are tight here, do not attempt to resize the composable
+            // based on the intrinsic dimensions of the Painter
+            testPainterScaleMatchesSize(
+                Modifier.requiredWidth(composableWidth.toDp())
+                    .requiredHeight(composableHeight.toDp()),
+                ContentScale.Fit,
+                Size(painterWidth, painterHeight),
+                composableWidth,
+                composableHeight
+            )
+        }
 
     @Test
     fun testPainterComposableHeightScaledUpWithFixedWidth() {
@@ -589,80 +521,78 @@
         painterSize: Size,
         composableWidthPx: Float,
         composableHeightPx: Float
-    ) = with(rule.density) {
-        val composableWidth = composableWidthPx.toDp()
-        val composableHeight = composableHeightPx.toDp()
-        rule.setContent {
-            // Because the painter is told to fit inside the constraints, the width should
-            // match that of the provided fixed width and the height should match that of the
-            // composable as no scaling is being done
-            val painter = object : Painter() {
-                override val intrinsicSize: Size
-                    get() = painterSize
+    ) =
+        with(rule.density) {
+            val composableWidth = composableWidthPx.toDp()
+            val composableHeight = composableHeightPx.toDp()
+            rule.setContent {
+                // Because the painter is told to fit inside the constraints, the width should
+                // match that of the provided fixed width and the height should match that of the
+                // composable as no scaling is being done
+                val painter =
+                    object : Painter() {
+                        override val intrinsicSize: Size
+                            get() = painterSize
 
-                override fun DrawScope.onDraw() { /* no-op */
-                }
+                        override fun DrawScope.onDraw() {
+                            /* no-op */
+                        }
+                    }
+                Box(modifier = Modifier.then(modifier).paint(painter, contentScale = contentScale))
             }
-            Box(
-                modifier = Modifier
-                    .then(modifier)
-                    .paint(painter, contentScale = contentScale)
-            )
-        }
 
-        rule.onRoot()
-            .assertWidthIsEqualTo(composableWidth)
-            .assertHeightIsEqualTo(composableHeight)
-    }
+            rule
+                .onRoot()
+                .assertWidthIsEqualTo(composableWidth)
+                .assertHeightIsEqualTo(composableHeight)
+        }
 
     @Ignore // b/265030745
     @SdkSuppress(minSdkVersion = Build.VERSION_CODES.O)
     @Test
-    fun testBitmapPainterScalesContent(): Unit = with(rule.density) {
-        // BitmapPainter should handle scaling its content image up to fill the
-        // corresponding content bounds. Because the composable is twice the
-        // height of the image and we are providing ContentScale.FillHeight
-        // the BitmapPainter should draw the image with twice its original
-        // height and width centered within the bounds of the composable
-        val boxWidth = 300
-        val boxHeight = 200
-        val srcImage = ImageBitmap(50, 100)
-        val canvas = Canvas(srcImage)
-        val paint = Paint().apply { this.color = Color.Red }
-        canvas.drawRect(0f, 0f, 200f, 100f, paint)
+    fun testBitmapPainterScalesContent(): Unit =
+        with(rule.density) {
+            // BitmapPainter should handle scaling its content image up to fill the
+            // corresponding content bounds. Because the composable is twice the
+            // height of the image and we are providing ContentScale.FillHeight
+            // the BitmapPainter should draw the image with twice its original
+            // height and width centered within the bounds of the composable
+            val boxWidth = 300
+            val boxHeight = 200
+            val srcImage = ImageBitmap(50, 100)
+            val canvas = Canvas(srcImage)
+            val paint = Paint().apply { this.color = Color.Red }
+            canvas.drawRect(0f, 0f, 200f, 100f, paint)
 
-        val testTag = "testTag"
+            val testTag = "testTag"
 
-        rule.setContent {
-            Box(
-                modifier = Modifier
-                    .testTag(testTag)
-                    .background(color = Color.Gray)
-                    .requiredWidth(boxWidth.toDp())
-                    .requiredHeight(boxHeight.toDp())
-                    .paint(BitmapPainter(srcImage), contentScale = ContentScale.FillHeight)
-            )
+            rule.setContent {
+                Box(
+                    modifier =
+                        Modifier.testTag(testTag)
+                            .background(color = Color.Gray)
+                            .requiredWidth(boxWidth.toDp())
+                            .requiredHeight(boxHeight.toDp())
+                            .paint(BitmapPainter(srcImage), contentScale = ContentScale.FillHeight)
+                )
+            }
+
+            rule.obtainScreenshotBitmap(boxWidth, boxHeight).apply {
+                assertEquals(width, boxWidth)
+                assertEquals(height, boxHeight)
+                assertEquals(Color.Gray.toArgb(), getPixel(boxWidth / 2 - srcImage.width - 5, 0))
+                assertEquals(
+                    Color.Gray.toArgb(),
+                    getPixel(boxWidth / 2 + srcImage.width + 5, boxHeight - 1)
+                )
+                assertEquals(Color.Red.toArgb(), getPixel(boxWidth / 2 - srcImage.width + 5, 0))
+                assertEquals(
+                    Color.Red.toArgb(),
+                    getPixel(boxWidth / 2 + srcImage.width - 5, boxHeight - 1)
+                )
+            }
         }
 
-        rule.obtainScreenshotBitmap(
-            boxWidth,
-            boxHeight
-        ).apply {
-            assertEquals(width, boxWidth)
-            assertEquals(height, boxHeight)
-            assertEquals(Color.Gray.toArgb(), getPixel(boxWidth / 2 - srcImage.width - 5, 0))
-            assertEquals(
-                Color.Gray.toArgb(),
-                getPixel(boxWidth / 2 + srcImage.width + 5, boxHeight - 1)
-            )
-            assertEquals(Color.Red.toArgb(), getPixel(boxWidth / 2 - srcImage.width + 5, 0))
-            assertEquals(
-                Color.Red.toArgb(),
-                getPixel(boxWidth / 2 + srcImage.width - 5, boxHeight - 1)
-            )
-        }
-    }
-
     @SdkSuppress(minSdkVersion = Build.VERSION_CODES.O)
     @Test
     fun testBitmapPainterScalesNonUniformly() {
@@ -680,12 +610,12 @@
 
         rule.setContent {
             Box(
-                modifier = Modifier
-                    .testTag(testTag)
-                    .background(color = Color.Gray)
-                    .requiredWidth((boxWidth / LocalDensity.current.density).dp)
-                    .requiredHeight((boxHeight / LocalDensity.current.density).dp)
-                    .paint(BitmapPainter(srcImage), contentScale = ContentScale.FillBounds)
+                modifier =
+                    Modifier.testTag(testTag)
+                        .background(color = Color.Gray)
+                        .requiredWidth((boxWidth / LocalDensity.current.density).dp)
+                        .requiredHeight((boxHeight / LocalDensity.current.density).dp)
+                        .paint(BitmapPainter(srcImage), contentScale = ContentScale.FillBounds)
             )
         }
 
@@ -694,64 +624,64 @@
 
     @SdkSuppress(minSdkVersion = Build.VERSION_CODES.O)
     @Test
-    fun testVectorPainterScalesContent(): Unit = with(rule.density) {
-        // VectorPainter should handle scaling its content vector up to fill the
-        // corresponding content bounds. Because the composable is twice the
-        // height of the vector and we are providing ContentScale.FillHeight
-        // the VectorPainter should draw the vector with twice its original
-        // height and width centered within the bounds of the composable
-        val boxWidth = 300
-        val boxHeight = 200
+    fun testVectorPainterScalesContent(): Unit =
+        with(rule.density) {
+            // VectorPainter should handle scaling its content vector up to fill the
+            // corresponding content bounds. Because the composable is twice the
+            // height of the vector and we are providing ContentScale.FillHeight
+            // the VectorPainter should draw the vector with twice its original
+            // height and width centered within the bounds of the composable
+            val boxWidth = 300
+            val boxHeight = 200
 
-        val vectorWidth = 50
-        val vectorHeight = 100
-        rule.setContent {
-            val vectorWidthDp = vectorWidth.toDp()
-            val vectorHeightDp = vectorHeight.toDp()
-            Box(
-                modifier = Modifier.background(color = Color.Gray)
-                    .requiredWidth(boxWidth.toDp())
-                    .requiredHeight(boxHeight.toDp())
-                    .paint(
-                        rememberVectorPainter(
-                            defaultWidth = vectorWidthDp,
-                            defaultHeight = vectorHeightDp,
-                            autoMirror = false,
-                            content = { viewportWidth, viewportHeight ->
-                                Path(
-                                    fill = SolidColor(Color.Red),
-                                    pathData = PathData {
-                                        horizontalLineToRelative(viewportWidth)
-                                        verticalLineToRelative(viewportHeight)
-                                        horizontalLineToRelative(-viewportWidth)
-                                        close()
+            val vectorWidth = 50
+            val vectorHeight = 100
+            rule.setContent {
+                val vectorWidthDp = vectorWidth.toDp()
+                val vectorHeightDp = vectorHeight.toDp()
+                Box(
+                    modifier =
+                        Modifier.background(color = Color.Gray)
+                            .requiredWidth(boxWidth.toDp())
+                            .requiredHeight(boxHeight.toDp())
+                            .paint(
+                                rememberVectorPainter(
+                                    defaultWidth = vectorWidthDp,
+                                    defaultHeight = vectorHeightDp,
+                                    autoMirror = false,
+                                    content = { viewportWidth, viewportHeight ->
+                                        Path(
+                                            fill = SolidColor(Color.Red),
+                                            pathData =
+                                                PathData {
+                                                    horizontalLineToRelative(viewportWidth)
+                                                    verticalLineToRelative(viewportHeight)
+                                                    horizontalLineToRelative(-viewportWidth)
+                                                    close()
+                                                }
+                                        )
                                     }
-                                )
-                            }
-                        ),
-                        contentScale = ContentScale.FillHeight
-                    )
-            )
-        }
+                                ),
+                                contentScale = ContentScale.FillHeight
+                            )
+                )
+            }
 
-        rule.obtainScreenshotBitmap(
-            boxWidth,
-            boxHeight
-        ).apply {
-            assertEquals(width, boxWidth)
-            assertEquals(height, boxHeight)
-            assertEquals(Color.Gray.toArgb(), getPixel(boxWidth / 2 - vectorWidth - 5, 0))
-            assertEquals(
-                Color.Gray.toArgb(),
-                getPixel(boxWidth / 2 + vectorWidth + 5, boxHeight - 2)
-            )
-            assertEquals(Color.Red.toArgb(), getPixel(boxWidth / 2 - vectorWidth + 5, 0))
-            assertEquals(
-                Color.Red.toArgb(),
-                getPixel(boxWidth / 2 + vectorWidth - 5, boxHeight - 2)
-            )
+            rule.obtainScreenshotBitmap(boxWidth, boxHeight).apply {
+                assertEquals(width, boxWidth)
+                assertEquals(height, boxHeight)
+                assertEquals(Color.Gray.toArgb(), getPixel(boxWidth / 2 - vectorWidth - 5, 0))
+                assertEquals(
+                    Color.Gray.toArgb(),
+                    getPixel(boxWidth / 2 + vectorWidth + 5, boxHeight - 2)
+                )
+                assertEquals(Color.Red.toArgb(), getPixel(boxWidth / 2 - vectorWidth + 5, 0))
+                assertEquals(
+                    Color.Red.toArgb(),
+                    getPixel(boxWidth / 2 + vectorWidth - 5, boxHeight - 2)
+                )
+            }
         }
-    }
 
     @Test
     @SmallTest
@@ -760,39 +690,31 @@
         val modifier = Modifier.paint(painter) as InspectableValue
         assertThat(modifier.nameFallback).isEqualTo("paint")
         assertThat(modifier.valueOverride).isNull()
-        assertThat(modifier.inspectableElements.asIterable()).containsExactly(
-            ValueElement("painter", painter),
-            ValueElement("sizeToIntrinsics", true),
-            ValueElement("alignment", Alignment.Center),
-            ValueElement("contentScale", ContentScale.Inside),
-            ValueElement("alpha", DefaultAlpha),
-            ValueElement("colorFilter", null)
-        )
+        assertThat(modifier.inspectableElements.asIterable())
+            .containsExactly(
+                ValueElement("painter", painter),
+                ValueElement("sizeToIntrinsics", true),
+                ValueElement("alignment", Alignment.Center),
+                ValueElement("contentScale", ContentScale.Inside),
+                ValueElement("alpha", DefaultAlpha),
+                ValueElement("colorFilter", null)
+            )
     }
 
     @Test
     @SmallTest
     @SdkSuppress(minSdkVersion = Build.VERSION_CODES.O)
     fun testBackgroundPainterChain() {
-        val painter = TestPainter(100f, 100f).apply {
-            color = Color.Red
-        }
+        val painter = TestPainter(100f, 100f).apply { color = Color.Red }
 
-        val painter2 = TestPainter(100f, 100f).apply {
-            color = Color.Blue.copy(alpha = 0.5f)
-        }
+        val painter2 = TestPainter(100f, 100f).apply { color = Color.Blue.copy(alpha = 0.5f) }
 
         val tag = "testTag"
         var sizePx = 0f
         val size = 2.dp
         rule.setContent {
             with(LocalDensity.current) { sizePx = size.toPx() }
-            Box(
-                modifier = Modifier.testTag(tag)
-                    .size(size)
-                    .paint(painter)
-                    .paint(painter2)
-            )
+            Box(modifier = Modifier.testTag(tag).size(size).paint(painter).paint(painter2))
         }
 
         rule.onNodeWithTag(tag).captureToImage().apply {
@@ -809,20 +731,12 @@
     @Test
     @SdkSuppress(minSdkVersion = Build.VERSION_CODES.O)
     fun testUpdatingPainterWithTheSameIntrinsicsSize() {
-        var painter by mutableStateOf(TestPainter(10f, 10f).apply {
-            color = Color.Red
-        })
+        var painter by mutableStateOf(TestPainter(10f, 10f).apply { color = Color.Red })
         val tag = "testTag"
 
-        rule.setContent {
-            Box(Modifier.testTag(tag).paint(painter))
-        }
+        rule.setContent { Box(Modifier.testTag(tag).paint(painter)) }
 
-        rule.runOnIdle {
-            painter = TestPainter(10f, 10f).apply {
-                color = Color.Blue
-            }
-        }
+        rule.runOnIdle { painter = TestPainter(10f, 10f).apply { color = Color.Blue } }
 
         rule.onNodeWithTag(tag).captureToImage().apply {
             assertEquals(10, width)
@@ -834,20 +748,12 @@
     @Test
     @SdkSuppress(minSdkVersion = Build.VERSION_CODES.O)
     fun testUpdatingPainterWithTheDifferentIntrinsicsSize() {
-        var painter by mutableStateOf(TestPainter(10f, 10f).apply {
-            color = Color.Red
-        })
+        var painter by mutableStateOf(TestPainter(10f, 10f).apply { color = Color.Red })
         val tag = "testTag"
 
-        rule.setContent {
-            Box(Modifier.testTag(tag).paint(painter))
-        }
+        rule.setContent { Box(Modifier.testTag(tag).paint(painter)) }
 
-        rule.runOnIdle {
-            painter = TestPainter(5f, 5f).apply {
-                color = Color.Blue
-            }
-        }
+        rule.runOnIdle { painter = TestPainter(5f, 5f).apply { color = Color.Blue } }
 
         rule.onNodeWithTag(tag).captureToImage().apply {
             assertEquals(5, width)
@@ -866,9 +772,9 @@
         val layoutDirection = if (rtl) LayoutDirection.Rtl else LayoutDirection.Ltr
         CompositionLocalProvider(LocalLayoutDirection provides layoutDirection) {
             AtLeastSize(
-                modifier = Modifier
-                    .background(Color.White)
-                    .paint(p, alpha = alpha, colorFilter = colorFilter),
+                modifier =
+                    Modifier.background(Color.White)
+                        .paint(p, alpha = alpha, colorFilter = colorFilter),
                 size = containerWidth.roundToInt()
             ) {
                 // Intentionally empty
@@ -885,10 +791,7 @@
     return bitmap.asAndroidBitmap()
 }
 
-private class TestPainter(
-    val width: Float,
-    val height: Float
-) : Painter() {
+private class TestPainter(val width: Float, val height: Float) : Painter() {
 
     var color = Color.Red
 
@@ -906,8 +809,8 @@
 }
 
 /**
- * Container composable that relaxes the minimum width and height constraints
- * before giving them to their child
+ * Container composable that relaxes the minimum width and height constraints before giving them to
+ * their child
  */
 @Composable
 fun NoMinSizeContainer(content: @Composable () -> Unit) {
@@ -918,35 +821,18 @@
         val maxPlaceableHeight = placeables.maxByOrNull { it.height }?.width ?: 0
         val width = max(maxPlaceableWidth, loosenedConstraints.minWidth)
         val height = max(maxPlaceableHeight, loosenedConstraints.minHeight)
-        layout(width, height) {
-            placeables.forEach { it.place(0, 0) }
-        }
+        layout(width, height) { placeables.forEach { it.place(0, 0) } }
     }
 }
 
-/**
- * Composable that is sized purely by the constraints given by its modifiers
- */
+/** Composable that is sized purely by the constraints given by its modifiers */
 @Composable
-fun NoIntrinsicSizeContainer(
-    modifier: Modifier = Modifier,
-    content: @Composable () -> Unit
-) {
+fun NoIntrinsicSizeContainer(modifier: Modifier = Modifier, content: @Composable () -> Unit) {
     Layout(content, modifier) { measurables, constraints ->
         val placeables = measurables.map { it.measure(constraints) }
-        val width = max(
-            placeables.maxByOrNull { it.width }?.width ?: 0,
-            constraints
-                .minWidth
-        )
-        val height = max(
-            placeables.maxByOrNull { it.height }?.height ?: 0,
-            constraints
-                .minHeight
-        )
-        layout(width, height) {
-            placeables.forEach { it.place(0, 0) }
-        }
+        val width = max(placeables.maxByOrNull { it.width }?.width ?: 0, constraints.minWidth)
+        val height = max(placeables.maxByOrNull { it.height }?.height ?: 0, constraints.minHeight)
+        layout(width, height) { placeables.forEach { it.place(0, 0) } }
     }
 }
 
@@ -955,16 +841,15 @@
         measurable: Measurable,
         constraints: Constraints
     ): MeasureResult {
-        val placeable = measurable.measure(
-            Constraints(
-                minWidth = width,
-                minHeight = height,
-                maxWidth = width,
-                maxHeight = height
+        val placeable =
+            measurable.measure(
+                Constraints(
+                    minWidth = width,
+                    minHeight = height,
+                    maxWidth = width,
+                    maxHeight = height
+                )
             )
-        )
-        return layout(width, height) {
-            placeable.place(0, 0)
-        }
+        return layout(width, height) { placeable.place(0, 0) }
     }
 }
diff --git a/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/draw/ShadowTest.kt b/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/draw/ShadowTest.kt
index 8f23d70..dbb49d4 100644
--- a/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/draw/ShadowTest.kt
+++ b/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/draw/ShadowTest.kt
@@ -73,13 +73,14 @@
     private lateinit var activity: TestActivity
     private lateinit var drawLatch: CountDownLatch
 
-    private val rectShape = object : Shape {
-        override fun createOutline(
-            size: Size,
-            layoutDirection: LayoutDirection,
-            density: Density
-        ) = Outline.Rectangle(size.toRect())
-    }
+    private val rectShape =
+        object : Shape {
+            override fun createOutline(
+                size: Size,
+                layoutDirection: LayoutDirection,
+                density: Density
+            ) = Outline.Rectangle(size.toRect())
+        }
 
     @Before
     fun setup() {
@@ -97,31 +98,21 @@
     @SdkSuppress(minSdkVersion = Build.VERSION_CODES.O)
     @Test
     fun shadowDrawn() {
-        rule.runOnUiThreadIR {
-            activity.setContent {
-                ShadowContainer()
-            }
-        }
+        rule.runOnUiThreadIR { activity.setContent { ShadowContainer() } }
 
         assertTrue(drawLatch.await(1, TimeUnit.SECONDS))
-        takeScreenShot(12).apply {
-            hasShadow()
-        }
+        takeScreenShot(12).apply { hasShadow() }
     }
 
     @SdkSuppress(minSdkVersion = Build.VERSION_CODES.O)
     @Test
     fun shadowDrawnInsideRenderNode() {
         rule.runOnUiThreadIR {
-            activity.setContent {
-                ShadowContainer(modifier = Modifier.graphicsLayer())
-            }
+            activity.setContent { ShadowContainer(modifier = Modifier.graphicsLayer()) }
         }
 
         assertTrue(drawLatch.await(1, TimeUnit.SECONDS))
-        takeScreenShot(12).apply {
-            hasShadow()
-        }
+        takeScreenShot(12).apply { hasShadow() }
     }
 
     @Ignore // b/266748959
@@ -130,20 +121,12 @@
     fun switchFromShadowToNoShadow() {
         val elevation = mutableStateOf(0.dp)
 
-        rule.runOnUiThreadIR {
-            activity.setContent {
-                ShadowContainer(elevation = elevation)
-            }
-        }
+        rule.runOnUiThreadIR { activity.setContent { ShadowContainer(elevation = elevation) } }
         assertTrue(drawLatch.await(1, TimeUnit.SECONDS))
 
-        rule.runOnUiThreadIR {
-            elevation.value = 0.dp
-        }
+        rule.runOnUiThreadIR { elevation.value = 0.dp }
 
-        takeScreenShot(12).apply {
-            assertEquals(color(5, 11), Color.White)
-        }
+        takeScreenShot(12).apply { assertEquals(color(5, 11), Color.White) }
     }
 
     @SdkSuppress(minSdkVersion = Build.VERSION_CODES.O)
@@ -158,13 +141,9 @@
         }
         assertTrue(drawLatch.await(1, TimeUnit.SECONDS))
 
-        rule.runOnUiThreadIR {
-            elevation.value = 12.dp
-        }
+        rule.runOnUiThreadIR { elevation.value = 12.dp }
 
-        takeScreenShot(12).apply {
-            hasShadow()
-        }
+        takeScreenShot(12).apply { hasShadow() }
     }
 
     @SdkSuppress(minSdkVersion = Build.VERSION_CODES.O)
@@ -176,13 +155,13 @@
                     val elevation = with(LocalDensity.current) { 4.dp.toPx() }
                     AtLeastSize(
                         size = 10,
-                        modifier = Modifier.graphicsLayer(
-                            shadowElevation = elevation,
-                            shape = rectShape,
-                            alpha = 0.5f
-                        )
-                    ) {
-                    }
+                        modifier =
+                            Modifier.graphicsLayer(
+                                shadowElevation = elevation,
+                                shape = rectShape,
+                                alpha = 0.5f
+                            )
+                    ) {}
                 }
             }
         }
@@ -207,14 +186,14 @@
                     val elevation = with(LocalDensity.current) { 4.dp.toPx() }
                     AtLeastSize(
                         size = 10,
-                        modifier = Modifier.graphicsLayer(
-                            shadowElevation = elevation,
-                            shape = rectShape,
-                            ambientShadowColor = Color(0xFFFF00FF),
-                            spotShadowColor = Color(0xFFFF00FF),
-                        )
-                    ) {
-                    }
+                        modifier =
+                            Modifier.graphicsLayer(
+                                shadowElevation = elevation,
+                                shape = rectShape,
+                                ambientShadowColor = Color(0xFFFF00FF),
+                                spotShadowColor = Color(0xFFFF00FF),
+                            )
+                    ) {}
                 }
             }
         }
@@ -237,26 +216,22 @@
         rule.runOnUiThreadIR {
             activity.setContent {
                 AtLeastSize(size = 12, modifier = Modifier.background(Color.White)) {
-                    val shadow = if (model.value) {
-                        Modifier.shadow(8.dp, rectShape)
-                    } else {
-                        Modifier
-                    }
-                    AtLeastSize(size = 10, modifier = shadow) {
-                    }
+                    val shadow =
+                        if (model.value) {
+                            Modifier.shadow(8.dp, rectShape)
+                        } else {
+                            Modifier
+                        }
+                    AtLeastSize(size = 10, modifier = shadow) {}
                 }
             }
         }
         assertTrue(drawLatch.await(1, TimeUnit.SECONDS))
 
         drawLatch = CountDownLatch(1)
-        rule.runOnUiThreadIR {
-            model.value = true
-        }
+        rule.runOnUiThreadIR { model.value = true }
 
-        takeScreenShot(12).apply {
-            hasShadow()
-        }
+        takeScreenShot(12).apply { hasShadow() }
     }
 
     @Test
@@ -265,13 +240,14 @@
             val modifier = Modifier.shadow(4.0.dp).first() as InspectableValue
             assertThat(modifier.nameFallback).isEqualTo("shadow")
             assertThat(modifier.valueOverride).isNull()
-            assertThat(modifier.inspectableElements.asIterable()).containsExactly(
-                ValueElement("elevation", 4.0.dp),
-                ValueElement("shape", RectangleShape),
-                ValueElement("clip", true),
-                ValueElement("ambientColor", DefaultShadowColor),
-                ValueElement("spotColor", DefaultShadowColor)
-            )
+            assertThat(modifier.inspectableElements.asIterable())
+                .containsExactly(
+                    ValueElement("elevation", 4.0.dp),
+                    ValueElement("shape", RectangleShape),
+                    ValueElement("clip", true),
+                    ValueElement("ambientColor", DefaultShadowColor),
+                    ValueElement("spotColor", DefaultShadowColor)
+                )
         }
     }
 
@@ -280,34 +256,25 @@
         val elevation = mutableStateOf(0f)
         val color = mutableStateOf(Color.Blue)
         val underColor = mutableStateOf(Color.Transparent)
-        val modifier = Modifier.graphicsLayer()
-            .background(underColor)
-            .drawLatchModifier()
-            .graphicsLayer {
-                shadowElevation = elevation.value
-            }
-            .background(color)
+        val modifier =
+            Modifier.graphicsLayer()
+                .background(underColor)
+                .drawLatchModifier()
+                .graphicsLayer { shadowElevation = elevation.value }
+                .background(color)
 
-        rule.runOnUiThread {
-            activity.setContent {
-                androidx.compose.ui.FixedSize(30, modifier)
-            }
-        }
+        rule.runOnUiThread { activity.setContent { androidx.compose.ui.FixedSize(30, modifier) } }
 
         assertTrue(drawLatch.await(1, TimeUnit.SECONDS))
 
         drawLatch = CountDownLatch(1)
 
-        rule.runOnUiThread {
-            color.value = Color.Red
-        }
+        rule.runOnUiThread { color.value = Color.Red }
 
         Assert.assertFalse(drawLatch.await(200, TimeUnit.MILLISECONDS))
 
         drawLatch = CountDownLatch(1)
-        rule.runOnUiThread {
-            elevation.value = 1f
-        }
+        rule.runOnUiThread { elevation.value = 1f }
 
         assertTrue(drawLatch.await(1, TimeUnit.SECONDS))
 
@@ -337,9 +304,7 @@
 
         drawLatch = CountDownLatch(1)
 
-        rule.runOnUiThread {
-            elevation.value = 1f
-        }
+        rule.runOnUiThread { elevation.value = 1f }
         assertTrue(drawLatch.await(1, TimeUnit.SECONDS))
     }
 
@@ -352,8 +317,7 @@
             AtLeastSize(
                 size = 10,
                 modifier = Modifier.shadow(elevation = elevation.value, shape = rectShape)
-            ) {
-            }
+            ) {}
         }
     }
 
@@ -368,9 +332,7 @@
 
     fun Modifier.drawLatchModifier() = drawBehind { drawLatch.countDown() }
 
-    private fun Modifier.background(
-        color: State<Color>
-    ) = drawBehind {
+    private fun Modifier.background(color: State<Color>) = drawBehind {
         if (color.value != Color.Transparent) {
             drawRect(color.value)
         }
diff --git a/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/focus/CancelFocusMoveTest.kt b/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/focus/CancelFocusMoveTest.kt
index c5d48ba..e3a68cd 100644
--- a/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/focus/CancelFocusMoveTest.kt
+++ b/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/focus/CancelFocusMoveTest.kt
@@ -74,9 +74,7 @@
                 }
                 Row {
                     Box(Modifier.testFocusable(4))
-                    Box(Modifier.testFocusable(5)) {
-                        Box(Modifier.testFocusable(7))
-                    }
+                    Box(Modifier.testFocusable(5)) { Box(Modifier.testFocusable(7)) }
                     Box(Modifier.testFocusable(6))
                 }
                 Row {
@@ -111,9 +109,9 @@
                 Row {
                     Box(Modifier.testFocusable(4))
                     Box(
-                        modifier = Modifier
-                            .focusProperties { left = FocusRequester.Cancel }
-                            .testFocusable(5)
+                        modifier =
+                            Modifier.focusProperties { left = FocusRequester.Cancel }
+                                .testFocusable(5)
                     ) {
                         Box(Modifier.testFocusable(7))
                     }
@@ -159,9 +157,9 @@
                 Row {
                     Box(Modifier.testFocusable(4))
                     Box(
-                        modifier = Modifier
-                            .focusProperties { right = FocusRequester.Cancel }
-                            .testFocusable(5)
+                        modifier =
+                            Modifier.focusProperties { right = FocusRequester.Cancel }
+                                .testFocusable(5)
                     ) {
                         Box(Modifier.testFocusable(7))
                     }
@@ -207,9 +205,8 @@
                 Row {
                     Box(Modifier.testFocusable(4))
                     Box(
-                        modifier = Modifier
-                            .focusProperties { up = FocusRequester.Cancel }
-                            .testFocusable(5)
+                        modifier =
+                            Modifier.focusProperties { up = FocusRequester.Cancel }.testFocusable(5)
                     ) {
                         Box(Modifier.testFocusable(7))
                     }
@@ -255,9 +252,9 @@
                 Row {
                     Box(Modifier.testFocusable(4))
                     Box(
-                        modifier = Modifier
-                            .focusProperties { down = FocusRequester.Cancel }
-                            .testFocusable(5)
+                        modifier =
+                            Modifier.focusProperties { down = FocusRequester.Cancel }
+                                .testFocusable(5)
                     ) {
                         Box(Modifier.testFocusable(7))
                     }
@@ -303,9 +300,9 @@
                 Row {
                     Box(Modifier.testFocusable(4))
                     Box(
-                        modifier = Modifier
-                            .focusProperties { next = FocusRequester.Cancel }
-                            .testFocusable(5)
+                        modifier =
+                            Modifier.focusProperties { next = FocusRequester.Cancel }
+                                .testFocusable(5)
                     ) {
                         Box(Modifier.testFocusable(7))
                     }
@@ -351,9 +348,9 @@
                 Row {
                     Box(Modifier.testFocusable(4))
                     Box(
-                        modifier = Modifier
-                            .focusProperties { previous = FocusRequester.Cancel }
-                            .testFocusable(5)
+                        modifier =
+                            Modifier.focusProperties { previous = FocusRequester.Cancel }
+                                .testFocusable(5)
                     ) {
                         Box(Modifier.testFocusable(7))
                     }
@@ -399,12 +396,12 @@
                 Row {
                     Box(Modifier.testFocusable(4))
                     Box(
-                        modifier = Modifier
-                            .focusProperties {
-                                next = FocusRequester.Cancel
-                                previous = FocusRequester.Cancel
-                            }
-                            .testFocusable(5)
+                        modifier =
+                            Modifier.focusProperties {
+                                    next = FocusRequester.Cancel
+                                    previous = FocusRequester.Cancel
+                                }
+                                .testFocusable(5)
                     ) {
                         Box(Modifier.testFocusable(7))
                     }
@@ -424,7 +421,8 @@
         // Assert.
         rule.runOnIdle {
             when (focusDirection) {
-                Next, Previous -> {
+                Next,
+                Previous -> {
                     assertThat(success).isFalse()
                     assertThat(focusState[initialFocusedItem]).isTrue()
                 }
@@ -450,12 +448,12 @@
                 Row {
                     Box(Modifier.testFocusable(4))
                     Box(
-                        modifier = Modifier
-                            .focusProperties {
-                                left = FocusRequester.Cancel
-                                right = FocusRequester.Cancel
-                            }
-                            .testFocusable(5)
+                        modifier =
+                            Modifier.focusProperties {
+                                    left = FocusRequester.Cancel
+                                    right = FocusRequester.Cancel
+                                }
+                                .testFocusable(5)
                     ) {
                         Box(Modifier.testFocusable(7))
                     }
@@ -475,7 +473,8 @@
         // Assert.
         rule.runOnIdle {
             when (focusDirection) {
-                Left, Right -> {
+                Left,
+                Right -> {
                     assertThat(success).isFalse()
                     assertThat(focusState[initialFocusedItem]).isTrue()
                 }
@@ -501,16 +500,16 @@
                 Row {
                     Box(Modifier.testFocusable(4))
                     Box(
-                        modifier = Modifier
-                            .focusProperties {
-                                left = FocusRequester.Cancel
-                                right = FocusRequester.Cancel
-                                up = FocusRequester.Cancel
-                                down = FocusRequester.Cancel
-                                previous = FocusRequester.Cancel
-                                next = FocusRequester.Cancel
-                            }
-                            .testFocusable(5)
+                        modifier =
+                            Modifier.focusProperties {
+                                    left = FocusRequester.Cancel
+                                    right = FocusRequester.Cancel
+                                    up = FocusRequester.Cancel
+                                    down = FocusRequester.Cancel
+                                    previous = FocusRequester.Cancel
+                                    next = FocusRequester.Cancel
+                                }
+                                .testFocusable(5)
                     ) {
                         Box(Modifier.testFocusable(7))
                     }
@@ -531,7 +530,8 @@
         rule.runOnIdle {
             when (focusDirection) {
                 // TODO(b/183746982): remove this after we add custom Enter and Exit.
-                Enter, Exit -> {
+                Enter,
+                Exit -> {
                     assertThat(success).isTrue()
                     assertThat(focusState[defaultFocusMoveResult]).isTrue()
                 }
@@ -557,10 +557,10 @@
                 Row {
                     Box(Modifier.testFocusable(4))
                     Box(
-                        modifier = Modifier
-                            .focusProperties { right = FocusRequester.Default }
-                            .focusProperties { right = FocusRequester.Cancel }
-                            .testFocusable(5)
+                        modifier =
+                            Modifier.focusProperties { right = FocusRequester.Default }
+                                .focusProperties { right = FocusRequester.Cancel }
+                                .testFocusable(5)
                     ) {
                         Box(Modifier.testFocusable(7))
                     }
@@ -591,11 +591,11 @@
     }
 
     @Composable
-    fun Modifier.testFocusable(index: Int, size: Dp = 10.dp) = this
-        .size(size)
-        .focusRequester(focusRequester[index])
-        .onFocusChanged { focusState[index] = it.isFocused }
-        .focusable()
+    fun Modifier.testFocusable(index: Int, size: Dp = 10.dp) =
+        this.size(size)
+            .focusRequester(focusRequester[index])
+            .onFocusChanged { focusState[index] = it.isFocused }
+            .focusable()
 
     private fun ComposeContentTestRule.setContentWithInitialFocus(
         composable: @Composable () -> Unit
@@ -608,13 +608,16 @@
     }
 
     private val defaultFocusMoveResult: Int
-        get() = when (focusDirection) {
-            Left, Previous -> 4
-            Right -> 6
-            Up -> 2
-            Down -> 9
-            Enter, Next -> 7
-            Exit -> 0
-            else -> error("")
-        }
+        get() =
+            when (focusDirection) {
+                Left,
+                Previous -> 4
+                Right -> 6
+                Up -> 2
+                Down -> 9
+                Enter,
+                Next -> 7
+                Exit -> 0
+                else -> error("")
+            }
 }
diff --git a/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/focus/CaptureFocusTest.kt b/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/focus/CaptureFocusTest.kt
index a70eb38..070eaae 100644
--- a/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/focus/CaptureFocusTest.kt
+++ b/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/focus/CaptureFocusTest.kt
@@ -30,8 +30,7 @@
 @MediumTest
 @RunWith(AndroidJUnit4::class)
 class CaptureFocusTest {
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
     @Test
     fun active_captureFocus_changesStateToCaptured() {
@@ -40,8 +39,7 @@
         val focusRequester = FocusRequester()
         rule.setFocusableContent {
             Box(
-                Modifier
-                    .onFocusChanged { focusState = it }
+                Modifier.onFocusChanged { focusState = it }
                     .focusRequester(focusRequester)
                     .focusTarget()
             )
@@ -49,9 +47,7 @@
         rule.runOnIdle { focusRequester.requestFocus() }
 
         // Act.
-        val success = rule.runOnIdle {
-            focusRequester.captureFocus()
-        }
+        val success = rule.runOnIdle { focusRequester.captureFocus() }
 
         // Assert.
         rule.runOnIdle {
@@ -69,16 +65,11 @@
         val focusRequester = FocusRequester()
         rule.setFocusableContent {
             Box(
-                Modifier
-                    .onFocusChanged { focusState = it }
+                Modifier.onFocusChanged { focusState = it }
                     .focusRequester(focusRequester)
                     .focusTarget()
             ) {
-                Box(
-                    Modifier
-                        .focusRequester(initialFocus)
-                        .focusTarget()
-                )
+                Box(Modifier.focusRequester(initialFocus).focusTarget())
             }
         }
         rule.runOnIdle {
@@ -88,9 +79,7 @@
         }
 
         // Act.
-        val success = rule.runOnIdle {
-            focusRequester.captureFocus()
-        }
+        val success = rule.runOnIdle { focusRequester.captureFocus() }
 
         // Assert.
         rule.runOnIdle {
@@ -107,8 +96,7 @@
         val focusRequester = FocusRequester()
         rule.setFocusableContent {
             Box(
-                Modifier
-                    .onFocusChanged { focusState = it }
+                Modifier.onFocusChanged { focusState = it }
                     .focusRequester(focusRequester)
                     .focusTarget()
             )
@@ -120,9 +108,7 @@
         }
 
         // Act.
-        val success = rule.runOnIdle {
-            focusRequester.captureFocus()
-        }
+        val success = rule.runOnIdle { focusRequester.captureFocus() }
 
         // Assert.
         rule.runOnIdle {
@@ -138,8 +124,7 @@
         val focusRequester = FocusRequester()
         rule.setFocusableContent {
             Box(
-                Modifier
-                    .onFocusChanged { focusState = it }
+                Modifier.onFocusChanged { focusState = it }
                     .focusRequester(focusRequester)
                     .focusProperties { canFocus = false }
                     .focusable()
@@ -147,9 +132,7 @@
         }
 
         // Act.
-        val success = rule.runOnIdle {
-            focusRequester.captureFocus()
-        }
+        val success = rule.runOnIdle { focusRequester.captureFocus() }
 
         // Assert.
         rule.runOnIdle {
@@ -167,25 +150,18 @@
         val focusRequester = FocusRequester()
         rule.setFocusableContent {
             Box(
-                Modifier
-                    .onFocusChanged { focusState = it }
+                Modifier.onFocusChanged { focusState = it }
                     .focusRequester(focusRequester)
                     .focusProperties { canFocus = false }
                     .focusable()
             ) {
-                Box(
-                    Modifier
-                        .focusRequester(initialFocus)
-                        .focusable()
-                )
+                Box(Modifier.focusRequester(initialFocus).focusable())
             }
         }
         rule.runOnIdle { initialFocus.requestFocus() }
 
         // Act.
-        val success = rule.runOnIdle {
-            focusRequester.captureFocus()
-        }
+        val success = rule.runOnIdle { focusRequester.captureFocus() }
 
         // Assert.
         rule.runOnIdle {
@@ -202,17 +178,14 @@
         val focusRequester = FocusRequester()
         rule.setFocusableContent {
             Box(
-                Modifier
-                    .onFocusChanged { focusState = it }
+                Modifier.onFocusChanged { focusState = it }
                     .focusRequester(focusRequester)
                     .focusTarget()
             )
         }
 
         // Act.
-        val success = rule.runOnIdle {
-            focusRequester.captureFocus()
-        }
+        val success = rule.runOnIdle { focusRequester.captureFocus() }
 
         // Assert.
         rule.runOnIdle {
diff --git a/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/focus/ClearFocusExitTest.kt b/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/focus/ClearFocusExitTest.kt
index 331bb2a..e4e6a3c 100644
--- a/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/focus/ClearFocusExitTest.kt
+++ b/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/focus/ClearFocusExitTest.kt
@@ -34,8 +34,7 @@
 @SmallTest
 @RunWith(AndroidJUnit4::class)
 class ClearFocusExitTest {
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
     private val focusRequester = FocusRequester()
     private var clearTriggered = false
@@ -48,23 +47,21 @@
         rule.setFocusableContent {
             focusManager = LocalFocusManager.current
             Box(
-                Modifier
-                    .focusRequester(focusRequester)
+                Modifier.focusRequester(focusRequester)
                     .focusProperties {
-                        exit = { clearTriggered = true; Default }
+                        exit = {
+                            clearTriggered = true
+                            Default
+                        }
                     }
                     .onFocusChanged { focusState = it }
                     .focusTarget()
             )
         }
-        rule.runOnIdle {
-            focusRequester.requestFocus()
-        }
+        rule.runOnIdle { focusRequester.requestFocus() }
 
         // Act.
-        rule.runOnIdle {
-            focusManager.clearFocus()
-        }
+        rule.runOnIdle { focusManager.clearFocus() }
 
         // Assert.
         rule.runOnIdle {
@@ -79,28 +76,25 @@
         rule.setFocusableContent {
             focusManager = LocalFocusManager.current
             Box(
-                Modifier
-                    .focusRequester(focusRequester)
+                Modifier.focusRequester(focusRequester)
                     .onFocusChanged { focusState = it }
                     .focusTarget()
             ) {
                 Box(
-                    Modifier
-                        .focusProperties {
-                            exit = { clearTriggered = true; Default }
+                    Modifier.focusProperties {
+                            exit = {
+                                clearTriggered = true
+                                Default
+                            }
                         }
                         .focusTarget()
                 )
             }
         }
-        rule.runOnIdle {
-            focusRequester.requestFocus()
-        }
+        rule.runOnIdle { focusRequester.requestFocus() }
 
         // Act.
-        rule.runOnIdle {
-            focusManager.clearFocus()
-        }
+        rule.runOnIdle { focusManager.clearFocus() }
 
         // Assert.
         rule.runOnIdle {
@@ -115,28 +109,25 @@
         rule.setFocusableContent {
             focusManager = LocalFocusManager.current
             Box(
-                Modifier
-                    .focusProperties {
-                        exit = { clearTriggered = true; Default }
+                Modifier.focusProperties {
+                        exit = {
+                            clearTriggered = true
+                            Default
+                        }
                     }
                     .focusTarget()
             ) {
                 Box(
-                    Modifier
-                        .focusRequester(focusRequester)
+                    Modifier.focusRequester(focusRequester)
                         .onFocusChanged { focusState = it }
                         .focusTarget()
                 )
             }
         }
-        rule.runOnIdle {
-            focusRequester.requestFocus()
-        }
+        rule.runOnIdle { focusRequester.requestFocus() }
 
         // Act.
-        rule.runOnIdle {
-            focusManager.clearFocus()
-        }
+        rule.runOnIdle { focusManager.clearFocus() }
 
         // Assert.
         rule.runOnIdle {
@@ -155,30 +146,27 @@
         rule.setFocusableContent {
             focusManager = LocalFocusManager.current
             Box(
-                Modifier
-                    .focusProperties {
-                        exit = { clearTriggered = true; Default }
+                Modifier.focusProperties {
+                        exit = {
+                            clearTriggered = true
+                            Default
+                        }
                     }
                     .focusTarget()
             ) {
                 Box {
                     Box(
-                        Modifier
-                            .focusRequester(focusRequester)
+                        Modifier.focusRequester(focusRequester)
                             .onFocusChanged { focusState = it }
                             .focusTarget()
                     )
                 }
             }
         }
-        rule.runOnIdle {
-            focusRequester.requestFocus()
-        }
+        rule.runOnIdle { focusRequester.requestFocus() }
 
         // Act.
-        rule.runOnIdle {
-            focusManager.clearFocus()
-        }
+        rule.runOnIdle { focusManager.clearFocus() }
 
         // Assert.
         rule.runOnIdle {
@@ -193,26 +181,19 @@
         rule.setFocusableContent {
             focusManager = LocalFocusManager.current
             Box(
-                Modifier
-                    .focusRequester(focusRequester)
+                Modifier.focusRequester(focusRequester)
                     .focusProperties { exit = { Cancel } }
                     .onFocusChanged { focusState = it }
                     .focusTarget()
             )
         }
-        rule.runOnIdle {
-            focusRequester.requestFocus()
-        }
+        rule.runOnIdle { focusRequester.requestFocus() }
 
         // Act.
-        rule.runOnIdle {
-            focusManager.clearFocus()
-        }
+        rule.runOnIdle { focusManager.clearFocus() }
 
         // Assert.
-        rule.runOnIdle {
-            assertThat(focusState.isFocused).isFalse()
-        }
+        rule.runOnIdle { assertThat(focusState.isFocused).isFalse() }
     }
 
     @Test
@@ -221,30 +202,20 @@
         rule.setFocusableContent {
             focusManager = LocalFocusManager.current
             Box(
-                Modifier
-                    .focusRequester(focusRequester)
+                Modifier.focusRequester(focusRequester)
                     .onFocusChanged { focusState = it }
                     .focusTarget()
             ) {
-                Box(
-                    Modifier
-                        .focusProperties { exit = { Cancel } }
-                )
+                Box(Modifier.focusProperties { exit = { Cancel } })
             }
         }
-        rule.runOnIdle {
-            focusRequester.requestFocus()
-        }
+        rule.runOnIdle { focusRequester.requestFocus() }
 
         // Act.
-        rule.runOnIdle {
-            focusManager.clearFocus()
-        }
+        rule.runOnIdle { focusManager.clearFocus() }
 
         // Assert.
-        rule.runOnIdle {
-            assertThat(focusState.isFocused).isFalse()
-        }
+        rule.runOnIdle { assertThat(focusState.isFocused).isFalse() }
     }
 
     @Test
@@ -252,32 +223,21 @@
         // Arrange.
         rule.setFocusableContent {
             focusManager = LocalFocusManager.current
-            Box(
-                Modifier
-                    .focusProperties { exit = { Cancel } }
-                    .focusTarget()
-            ) {
+            Box(Modifier.focusProperties { exit = { Cancel } }.focusTarget()) {
                 Box(
-                    Modifier
-                        .focusRequester(focusRequester)
+                    Modifier.focusRequester(focusRequester)
                         .onFocusChanged { focusState = it }
                         .focusTarget()
                 )
             }
         }
-        rule.runOnIdle {
-            focusRequester.requestFocus()
-        }
+        rule.runOnIdle { focusRequester.requestFocus() }
 
         // Act.
-        rule.runOnIdle {
-            focusManager.clearFocus()
-        }
+        rule.runOnIdle { focusManager.clearFocus() }
 
         // Assert.
-        rule.runOnIdle {
-            assertThat(focusState.isFocused).isTrue()
-        }
+        rule.runOnIdle { assertThat(focusState.isFocused).isTrue() }
     }
 
     @Test
@@ -285,34 +245,23 @@
         // Arrange.
         rule.setFocusableContent {
             focusManager = LocalFocusManager.current
-            Box(
-                Modifier
-                    .focusProperties { exit = { Cancel } }
-                    .focusTarget()
-            ) {
+            Box(Modifier.focusProperties { exit = { Cancel } }.focusTarget()) {
                 Box {
                     Box(
-                        Modifier
-                            .focusRequester(focusRequester)
+                        Modifier.focusRequester(focusRequester)
                             .onFocusChanged { focusState = it }
                             .focusTarget()
                     )
                 }
             }
         }
-        rule.runOnIdle {
-            focusRequester.requestFocus()
-        }
+        rule.runOnIdle { focusRequester.requestFocus() }
 
         // Act.
-        rule.runOnIdle {
-            focusManager.clearFocus()
-        }
+        rule.runOnIdle { focusManager.clearFocus() }
 
         // Assert.
-        rule.runOnIdle {
-            assertThat(focusState.isFocused).isTrue()
-        }
+        rule.runOnIdle { assertThat(focusState.isFocused).isTrue() }
     }
 
     @Test
@@ -321,37 +270,22 @@
         val customDestination = FocusRequester()
         rule.setFocusableContent {
             focusManager = LocalFocusManager.current
-            Box(
-                Modifier
-                    .focusProperties { exit = { customDestination } }
-                    .focusTarget()
-            ) {
+            Box(Modifier.focusProperties { exit = { customDestination } }.focusTarget()) {
+                Box(Modifier.focusRequester(focusRequester).focusTarget())
                 Box(
-                    Modifier
-                        .focusRequester(focusRequester)
-                        .focusTarget()
-                    )
-                Box(
-                    Modifier
-                        .focusRequester(customDestination)
+                    Modifier.focusRequester(customDestination)
                         .onFocusChanged { focusState = it }
                         .focusTarget()
                 )
             }
         }
-        rule.runOnIdle {
-            focusRequester.requestFocus()
-        }
+        rule.runOnIdle { focusRequester.requestFocus() }
 
         // Act.
-        rule.runOnIdle {
-            focusManager.clearFocus()
-        }
+        rule.runOnIdle { focusManager.clearFocus() }
 
         // Assert.
-        rule.runOnIdle {
-            assertThat(focusState.isFocused).isTrue()
-        }
+        rule.runOnIdle { assertThat(focusState.isFocused).isTrue() }
     }
 
     @Test
@@ -361,32 +295,21 @@
         rule.setFocusableContent {
             focusManager = LocalFocusManager.current
             Box(
-                Modifier
-                    .focusProperties { exit = { customDestination } }
+                Modifier.focusProperties { exit = { customDestination } }
                     .focusRequester(customDestination)
                     .onFocusChanged { focusState = it }
                     .focusTarget()
             ) {
-                Box(
-                    Modifier
-                        .focusRequester(focusRequester)
-                        .focusTarget()
-                )
+                Box(Modifier.focusRequester(focusRequester).focusTarget())
             }
         }
-        rule.runOnIdle {
-            focusRequester.requestFocus()
-        }
+        rule.runOnIdle { focusRequester.requestFocus() }
 
         // Act.
-        rule.runOnIdle {
-            focusManager.clearFocus()
-        }
+        rule.runOnIdle { focusManager.clearFocus() }
 
         // Assert.
-        rule.runOnIdle {
-            assertThat(focusState.isFocused).isTrue()
-        }
+        rule.runOnIdle { assertThat(focusState.isFocused).isTrue() }
     }
 
     @Test
@@ -396,37 +319,22 @@
         rule.setFocusableContent {
             focusManager = LocalFocusManager.current
             Box {
-                Box(
-                    Modifier
-                        .focusProperties { exit = { customDestination } }
-                        .focusTarget()
-                ) {
-                    Box(
-                        Modifier
-                            .focusRequester(focusRequester)
-                            .focusTarget()
-                    )
+                Box(Modifier.focusProperties { exit = { customDestination } }.focusTarget()) {
+                    Box(Modifier.focusRequester(focusRequester).focusTarget())
                 }
                 Box(
-                    Modifier
-                        .focusRequester(customDestination)
+                    Modifier.focusRequester(customDestination)
                         .onFocusChanged { focusState = it }
                         .focusTarget()
                 )
             }
         }
-        rule.runOnIdle {
-            focusRequester.requestFocus()
-        }
+        rule.runOnIdle { focusRequester.requestFocus() }
 
         // Act.
-        rule.runOnIdle {
-            focusManager.clearFocus()
-        }
+        rule.runOnIdle { focusManager.clearFocus() }
 
         // Assert.
-        rule.runOnIdle {
-            assertThat(focusState.isFocused).isTrue()
-        }
+        rule.runOnIdle { assertThat(focusState.isFocused).isTrue() }
     }
 }
diff --git a/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/focus/CombinedFocusModifierNodeTest.kt b/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/focus/CombinedFocusModifierNodeTest.kt
index c73a652..369c5e9 100644
--- a/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/focus/CombinedFocusModifierNodeTest.kt
+++ b/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/focus/CombinedFocusModifierNodeTest.kt
@@ -35,43 +35,30 @@
 @MediumTest
 @RunWith(Parameterized::class)
 class CombinedFocusModifierNodeTest(private val delegatedFocusTarget: Boolean) {
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
     @Test
     fun requestFocus() {
         // Arrange.
         val combinedFocusNode = CombinedFocusNode()
-        rule.setFocusableContent {
-            Box(Modifier.combinedFocusElement(combinedFocusNode))
-        }
+        rule.setFocusableContent { Box(Modifier.combinedFocusElement(combinedFocusNode)) }
 
         // Act.
-        rule.runOnIdle {
-            combinedFocusNode.requestFocus()
-        }
+        rule.runOnIdle { combinedFocusNode.requestFocus() }
 
         // Assert.
-        rule.runOnIdle {
-            assertThat(combinedFocusNode.focusState.isFocused).isTrue()
-        }
+        rule.runOnIdle { assertThat(combinedFocusNode.focusState.isFocused).isTrue() }
     }
 
     @Test
     fun captureFocus() {
         // Arrange.
         val combinedFocusNode = CombinedFocusNode()
-        rule.setFocusableContent {
-            Box(Modifier.combinedFocusElement(combinedFocusNode))
-        }
-        rule.runOnIdle {
-            combinedFocusNode.requestFocus()
-        }
+        rule.setFocusableContent { Box(Modifier.combinedFocusElement(combinedFocusNode)) }
+        rule.runOnIdle { combinedFocusNode.requestFocus() }
 
         // Act.
-        rule.runOnIdle {
-            combinedFocusNode.captureFocus()
-        }
+        rule.runOnIdle { combinedFocusNode.captureFocus() }
 
         // Assert.
         rule.runOnIdle {
@@ -84,18 +71,14 @@
     fun freeFocus() {
         // Arrange.
         val combinedFocusNode = CombinedFocusNode()
-        rule.setFocusableContent {
-            Box(Modifier.combinedFocusElement(combinedFocusNode))
-        }
+        rule.setFocusableContent { Box(Modifier.combinedFocusElement(combinedFocusNode)) }
         rule.runOnIdle {
             combinedFocusNode.requestFocus()
             combinedFocusNode.captureFocus()
         }
 
         // Act.
-        rule.runOnIdle {
-            combinedFocusNode.freeFocus()
-        }
+        rule.runOnIdle { combinedFocusNode.freeFocus() }
 
         // Assert.
         rule.runOnIdle {
@@ -108,38 +91,26 @@
     fun requestFocusWhenCanFocusIsTrue() {
         // Arrange.
         val combinedFocusNode = CombinedFocusNode().apply { canFocus = true }
-        rule.setFocusableContent {
-            Box(Modifier.combinedFocusElement(combinedFocusNode))
-        }
+        rule.setFocusableContent { Box(Modifier.combinedFocusElement(combinedFocusNode)) }
 
         // Act.
-        rule.runOnIdle {
-            combinedFocusNode.requestFocus()
-        }
+        rule.runOnIdle { combinedFocusNode.requestFocus() }
 
         // Assert.
-        rule.runOnIdle {
-            assertThat(combinedFocusNode.focusState.isFocused).isTrue()
-        }
+        rule.runOnIdle { assertThat(combinedFocusNode.focusState.isFocused).isTrue() }
     }
 
     @Test
     fun requestFocusWhenCanFocusIsFalse() {
         // Arrange.
         val combinedFocusNode = CombinedFocusNode().apply { canFocus = false }
-        rule.setFocusableContent {
-            Box(Modifier.combinedFocusElement(combinedFocusNode))
-        }
+        rule.setFocusableContent { Box(Modifier.combinedFocusElement(combinedFocusNode)) }
 
         // Act.
-        rule.runOnIdle {
-            combinedFocusNode.requestFocus()
-        }
+        rule.runOnIdle { combinedFocusNode.requestFocus() }
 
         // Assert.
-        rule.runOnIdle {
-            assertThat(combinedFocusNode.focusState.isFocused).isFalse()
-        }
+        rule.runOnIdle { assertThat(combinedFocusNode.focusState.isFocused).isFalse() }
     }
 
     /**
@@ -150,60 +121,49 @@
     fun losesFocusWhenCanFocusChangesToFalse() {
         // Arrange.
         val combinedFocusNode = CombinedFocusNode()
-        rule.setFocusableContent {
-            Box(Modifier.combinedFocusElement(combinedFocusNode))
-        }
-        rule.runOnIdle {
-            combinedFocusNode.requestFocus()
-        }
+        rule.setFocusableContent { Box(Modifier.combinedFocusElement(combinedFocusNode)) }
+        rule.runOnIdle { combinedFocusNode.requestFocus() }
 
         // Act.
-        rule.runOnIdle {
-            combinedFocusNode.canFocus = false
-        }
+        rule.runOnIdle { combinedFocusNode.canFocus = false }
 
         // Assert.
-        rule.runOnIdle {
-            assertThat(combinedFocusNode.focusState.isFocused).isFalse()
-        }
+        rule.runOnIdle { assertThat(combinedFocusNode.focusState.isFocused).isFalse() }
     }
 
     @Test
     fun doesNotGainFocusWhenCanFocusChangesToTrue() {
         // Arrange.
         val combinedFocusNode = CombinedFocusNode()
-        rule.setFocusableContent {
-            Box(Modifier.combinedFocusElement(combinedFocusNode))
-        }
+        rule.setFocusableContent { Box(Modifier.combinedFocusElement(combinedFocusNode)) }
         rule.runOnIdle {
             combinedFocusNode.requestFocus()
             combinedFocusNode.canFocus = false
         }
 
         // Act.
-        rule.runOnIdle {
-            combinedFocusNode.canFocus = true
-        }
+        rule.runOnIdle { combinedFocusNode.canFocus = true }
 
         // Assert.
-        rule.runOnIdle {
-            assertThat(combinedFocusNode.focusState.isFocused).isFalse()
-        }
+        rule.runOnIdle { assertThat(combinedFocusNode.focusState.isFocused).isFalse() }
     }
 
     private fun Modifier.combinedFocusElement(
         combinedFocusNode: CombinedFocusModifierNode
-    ): Modifier = if (delegatedFocusTarget) {
-        this then DelegatedFocusTargetElement(combinedFocusNode as DelegatedFocusTargetNode)
-    } else {
-        this then AppendedFocusTargetElement(combinedFocusNode as AppendedFocusTargetNode)
-            .focusTarget()
-    }
+    ): Modifier =
+        if (delegatedFocusTarget) {
+            this then DelegatedFocusTargetElement(combinedFocusNode as DelegatedFocusTargetNode)
+        } else {
+            this then
+                AppendedFocusTargetElement(combinedFocusNode as AppendedFocusTargetNode)
+                    .focusTarget()
+        }
 
     private data class AppendedFocusTargetElement(
         val appendedFocusTargetNode: AppendedFocusTargetNode
     ) : ModifierNodeElement<AppendedFocusTargetNode>() {
         override fun create(): AppendedFocusTargetNode = appendedFocusTargetNode
+
         override fun update(node: AppendedFocusTargetNode) {}
     }
 
@@ -211,6 +171,7 @@
         val delegatedFocusTargetNode: DelegatedFocusTargetNode
     ) : ModifierNodeElement<DelegatedFocusTargetNode>() {
         override fun create(): DelegatedFocusTargetNode = delegatedFocusTargetNode
+
         override fun update(node: DelegatedFocusTargetNode) {}
     }
 
@@ -231,9 +192,7 @@
     }
 
     private class AppendedFocusTargetNode :
-        CombinedFocusModifierNode,
-        FocusEventModifierNode,
-        DelegatingNode() {
+        CombinedFocusModifierNode, FocusEventModifierNode, DelegatingNode() {
 
         override lateinit var focusState: FocusState
 
@@ -248,15 +207,12 @@
         }
     }
 
-    private class DelegatedFocusTargetNode :
-        CombinedFocusModifierNode,
-        DelegatingNode() {
+    private class DelegatedFocusTargetNode : CombinedFocusModifierNode, DelegatingNode() {
 
         val focusTargetModifierNode = delegate(FocusTargetModifierNode())
 
         override val focusState: FocusState
-            @OptIn(ExperimentalComposeUiApi::class)
-            get() = focusTargetModifierNode.focusState
+            @OptIn(ExperimentalComposeUiApi::class) get() = focusTargetModifierNode.focusState
 
         override var canFocus by mutableStateOf(true)
 
diff --git a/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/focus/ComposeViewKeyEventInteropTest.kt b/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/focus/ComposeViewKeyEventInteropTest.kt
index 7d92cfd..63192d9 100644
--- a/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/focus/ComposeViewKeyEventInteropTest.kt
+++ b/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/focus/ComposeViewKeyEventInteropTest.kt
@@ -41,16 +41,13 @@
 @RunWith(AndroidJUnit4::class)
 @OptIn(ExperimentalComposeUiApi::class)
 class ComposeViewKeyEventInteropTest {
-    @get:Rule
-    val rule = createAndroidComposeRule<TestActivity>()
+    @get:Rule val rule = createAndroidComposeRule<TestActivity>()
 
     @Test
     fun composeView_doesNotConsumesKeyEvent_ifTheContentIsNotFocusable() {
         // Arrange.
         rule.activityRule.scenario.onActivity { activity ->
-            activity.setContent {
-                BasicText("text")
-            }
+            activity.setContent { BasicText("text") }
         }
 
         // Act.
@@ -69,9 +66,7 @@
             activity.setContent {
                 BasicText(
                     text = "text",
-                    modifier = Modifier
-                        .focusRequester(focusRequester)
-                        .focusable()
+                    modifier = Modifier.focusRequester(focusRequester).focusable()
                 )
             }
         }
@@ -95,16 +90,14 @@
                 Row {
                     BasicText(
                         text = "Item 1",
-                        modifier = Modifier
-                            .focusRequester(item1)
-                            .focusProperties { right = item2 }
-                            .focusable()
+                        modifier =
+                            Modifier.focusRequester(item1)
+                                .focusProperties { right = item2 }
+                                .focusable()
                     )
                     BasicText(
                         text = "Item 2",
-                        modifier = Modifier
-                            .focusRequester(item2)
-                            .focusable()
+                        modifier = Modifier.focusRequester(item2).focusable()
                     )
                 }
             }
@@ -127,10 +120,8 @@
             activity.setContent {
                 BasicText(
                     text = "Item 1",
-                    modifier = Modifier
-                        .focusRequester(item1)
-                        .focusProperties { down = item2 }
-                        .focusable()
+                    modifier =
+                        Modifier.focusRequester(item1).focusProperties { down = item2 }.focusable()
                 )
             }
         }
@@ -153,10 +144,10 @@
                 Box(Modifier.focusable()) {
                     BasicText(
                         text = "Item 1",
-                        modifier = Modifier
-                            .focusRequester(item1)
-                            .focusProperties { down = item2 }
-                            .focusable()
+                        modifier =
+                            Modifier.focusRequester(item1)
+                                .focusProperties { down = item2 }
+                                .focusable()
                     )
                 }
             }
diff --git a/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/focus/CustomFocusTraversalTest.kt b/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/focus/CustomFocusTraversalTest.kt
index ae65f2d..c230b14 100644
--- a/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/focus/CustomFocusTraversalTest.kt
+++ b/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/focus/CustomFocusTraversalTest.kt
@@ -54,18 +54,18 @@
     private val moveFocusProgrammatically: Boolean,
     private val useFocusOrderModifier: Boolean
 ) {
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
     companion object {
         @JvmStatic
         @Parameters(name = "moveFocusProgrammatically = {0}, useFocusOrderModifier = {1}")
-        fun initParameters() = listOf(
-            arrayOf(true, true),
-            arrayOf(true, false),
-            arrayOf(false, true),
-            arrayOf(false, false)
-        )
+        fun initParameters() =
+            listOf(
+                arrayOf(true, true),
+                arrayOf(true, false),
+                arrayOf(false, true),
+                arrayOf(false, false)
+            )
     }
 
     @Test
@@ -80,20 +80,14 @@
             focusManager = LocalFocusManager.current
             Row {
                 Box(
-                    Modifier
-                        .focusRequester(item1)
+                    Modifier.focusRequester(item1)
                         .dynamicFocusProperties { next = item3 }
                         .onFocusChanged { item1Focused = it.isFocused }
                         .focusTarget()
                 )
+                Box(Modifier.onFocusChanged { item2Focused = it.isFocused }.focusTarget())
                 Box(
-                    Modifier
-                        .onFocusChanged { item2Focused = it.isFocused }
-                        .focusTarget()
-                )
-                Box(
-                    Modifier
-                        .focusRequester(item3)
+                    Modifier.focusRequester(item3)
                         .onFocusChanged { item3Focused = it.isFocused }
                         .focusTarget()
                 )
@@ -103,9 +97,7 @@
 
         // Act.
         if (moveFocusProgrammatically) {
-            rule.runOnIdle {
-                focusManager.moveFocus(FocusDirection.Next)
-            }
+            rule.runOnIdle { focusManager.moveFocus(FocusDirection.Next) }
         } else {
             rule.onRoot().performKeyPress(KeyEvent(AndroidKeyEvent(KeyDown, Tab.nativeKeyCode)))
         }
@@ -130,19 +122,13 @@
             focusManager = LocalFocusManager.current
             Row {
                 Box(
-                    Modifier
-                        .focusRequester(item1)
+                    Modifier.focusRequester(item1)
                         .onFocusChanged { item1Focused = it.isFocused }
                         .focusTarget()
                 )
+                Box(Modifier.onFocusChanged { item2Focused = it.isFocused }.focusTarget())
                 Box(
-                    Modifier
-                        .onFocusChanged { item2Focused = it.isFocused }
-                        .focusTarget()
-                )
-                Box(
-                    Modifier
-                        .focusRequester(item3)
+                    Modifier.focusRequester(item3)
                         .dynamicFocusProperties { previous = item1 }
                         .onFocusChanged { item3Focused = it.isFocused }
                         .focusTarget()
@@ -153,9 +139,7 @@
 
         // Act.
         if (moveFocusProgrammatically) {
-            rule.runOnIdle {
-                focusManager.moveFocus(FocusDirection.Previous)
-            }
+            rule.runOnIdle { focusManager.moveFocus(FocusDirection.Previous) }
         } else {
             val nativeEvent = AndroidKeyEvent(0L, 0L, KeyDown, Tab.nativeKeyCode, 0, META_SHIFT_ON)
             rule.onRoot().performKeyPress(KeyEvent(nativeEvent))
@@ -181,19 +165,13 @@
             focusManager = LocalFocusManager.current
             Column {
                 Box(
-                    Modifier
-                        .focusRequester(item1)
+                    Modifier.focusRequester(item1)
                         .onFocusChanged { item1Focused = it.isFocused }
                         .focusTarget()
                 )
+                Box(Modifier.onFocusChanged { item2Focused = it.isFocused }.focusTarget())
                 Box(
-                    Modifier
-                        .onFocusChanged { item2Focused = it.isFocused }
-                        .focusTarget()
-                )
-                Box(
-                    Modifier
-                        .focusRequester(item3)
+                    Modifier.focusRequester(item3)
                         .dynamicFocusProperties { up = item1 }
                         .onFocusChanged { item3Focused = it.isFocused }
                         .focusTarget()
@@ -204,9 +182,7 @@
 
         // Act.
         if (moveFocusProgrammatically) {
-            rule.runOnIdle {
-                focusManager.moveFocus(FocusDirection.Up)
-            }
+            rule.runOnIdle { focusManager.moveFocus(FocusDirection.Up) }
         } else {
             val nativeKeyEvent = AndroidKeyEvent(KeyDown, DirectionUp.nativeKeyCode)
             rule.onRoot().performKeyPress(KeyEvent(nativeKeyEvent))
@@ -232,20 +208,14 @@
             focusManager = LocalFocusManager.current
             Column {
                 Box(
-                    Modifier
-                        .focusRequester(item1)
+                    Modifier.focusRequester(item1)
                         .dynamicFocusProperties { down = item3 }
                         .onFocusChanged { item1Focused = it.isFocused }
                         .focusTarget()
                 )
+                Box(Modifier.onFocusChanged { item2Focused = it.isFocused }.focusTarget())
                 Box(
-                    Modifier
-                        .onFocusChanged { item2Focused = it.isFocused }
-                        .focusTarget()
-                )
-                Box(
-                    Modifier
-                        .focusRequester(item3)
+                    Modifier.focusRequester(item3)
                         .onFocusChanged { item3Focused = it.isFocused }
                         .focusTarget()
                 )
@@ -255,9 +225,7 @@
 
         // Act.
         if (moveFocusProgrammatically) {
-            rule.runOnIdle {
-                focusManager.moveFocus(FocusDirection.Down)
-            }
+            rule.runOnIdle { focusManager.moveFocus(FocusDirection.Down) }
         } else {
             val nativeKeyEvent = AndroidKeyEvent(KeyDown, DirectionDown.nativeKeyCode)
             rule.onRoot().performKeyPress(KeyEvent(nativeKeyEvent))
@@ -283,19 +251,13 @@
             focusManager = LocalFocusManager.current
             Row {
                 Box(
-                    Modifier
-                        .focusRequester(item1)
+                    Modifier.focusRequester(item1)
                         .onFocusChanged { item1Focused = it.isFocused }
                         .focusTarget()
                 )
+                Box(Modifier.onFocusChanged { item2Focused = it.isFocused }.focusTarget())
                 Box(
-                    Modifier
-                        .onFocusChanged { item2Focused = it.isFocused }
-                        .focusTarget()
-                )
-                Box(
-                    Modifier
-                        .focusRequester(item3)
+                    Modifier.focusRequester(item3)
                         .dynamicFocusProperties { left = item1 }
                         .onFocusChanged { item3Focused = it.isFocused }
                         .focusTarget()
@@ -306,9 +268,7 @@
 
         // Act.
         if (moveFocusProgrammatically) {
-            rule.runOnIdle {
-                focusManager.moveFocus(FocusDirection.Left)
-            }
+            rule.runOnIdle { focusManager.moveFocus(FocusDirection.Left) }
         } else {
             val nativeKeyEvent = AndroidKeyEvent(KeyDown, DirectionLeft.nativeKeyCode)
             rule.onRoot().performKeyPress(KeyEvent(nativeKeyEvent))
@@ -334,20 +294,14 @@
             focusManager = LocalFocusManager.current
             Row {
                 Box(
-                    Modifier
-                        .focusRequester(item1)
+                    Modifier.focusRequester(item1)
                         .dynamicFocusProperties { right = item3 }
                         .onFocusChanged { item1Focused = it.isFocused }
                         .focusTarget()
                 )
+                Box(Modifier.onFocusChanged { item2Focused = it.isFocused }.focusTarget())
                 Box(
-                    Modifier
-                        .onFocusChanged { item2Focused = it.isFocused }
-                        .focusTarget()
-                )
-                Box(
-                    Modifier
-                        .focusRequester(item3)
+                    Modifier.focusRequester(item3)
                         .onFocusChanged { item3Focused = it.isFocused }
                         .focusTarget()
                 )
@@ -357,9 +311,7 @@
 
         // Act.
         if (moveFocusProgrammatically) {
-            rule.runOnIdle {
-                focusManager.moveFocus(FocusDirection.Right)
-            }
+            rule.runOnIdle { focusManager.moveFocus(FocusDirection.Right) }
         } else {
             val nativeKeyEvent = AndroidKeyEvent(KeyDown, DirectionRight.nativeKeyCode)
             rule.onRoot().performKeyPress(KeyEvent(nativeKeyEvent))
@@ -387,19 +339,13 @@
             focusManager = LocalFocusManager.current
             Row {
                 Box(
-                    Modifier
-                        .focusRequester(item1)
+                    Modifier.focusRequester(item1)
                         .onFocusChanged { item1Focused = it.isFocused }
                         .focusTarget()
                 )
+                Box(Modifier.onFocusChanged { item2Focused = it.isFocused }.focusTarget())
                 Box(
-                    Modifier
-                        .onFocusChanged { item2Focused = it.isFocused }
-                        .focusTarget()
-                )
-                Box(
-                    Modifier
-                        .focusRequester(item3)
+                    Modifier.focusRequester(item3)
                         .dynamicFocusProperties { start = item1 }
                         .onFocusChanged { item3Focused = it.isFocused }
                         .focusTarget()
@@ -410,9 +356,7 @@
 
         // Act.
         if (moveFocusProgrammatically) {
-            rule.runOnIdle {
-                focusManager.moveFocus(FocusDirection.Left)
-            }
+            rule.runOnIdle { focusManager.moveFocus(FocusDirection.Left) }
         } else {
             val nativeKeyEvent = AndroidKeyEvent(KeyDown, DirectionLeft.nativeKeyCode)
             rule.onRoot().performKeyPress(KeyEvent(nativeKeyEvent))
@@ -440,20 +384,14 @@
             focusManager = LocalFocusManager.current
             Row {
                 Box(
-                    Modifier
-                        .focusRequester(item1)
+                    Modifier.focusRequester(item1)
                         .dynamicFocusProperties { end = item3 }
                         .onFocusChanged { item1Focused = it.isFocused }
                         .focusTarget()
                 )
+                Box(Modifier.onFocusChanged { item2Focused = it.isFocused }.focusTarget())
                 Box(
-                    Modifier
-                        .onFocusChanged { item2Focused = it.isFocused }
-                        .focusTarget()
-                )
-                Box(
-                    Modifier
-                        .focusRequester(item3)
+                    Modifier.focusRequester(item3)
                         .onFocusChanged { item3Focused = it.isFocused }
                         .focusTarget()
                 )
@@ -463,9 +401,7 @@
 
         // Act.
         if (moveFocusProgrammatically) {
-            rule.runOnIdle {
-                focusManager.moveFocus(FocusDirection.Right)
-            }
+            rule.runOnIdle { focusManager.moveFocus(FocusDirection.Right) }
         } else {
             val nativeKeyEvent = AndroidKeyEvent(KeyDown, DirectionRight.nativeKeyCode)
             rule.onRoot().performKeyPress(KeyEvent(nativeKeyEvent))
@@ -491,8 +427,7 @@
         rule.setFocusableContent {
             focusManager = LocalFocusManager.current
             Row(
-                Modifier
-                    .focusRequester(parent)
+                Modifier.focusRequester(parent)
                     .focusProperties {
                         enter = {
                             directionThatTriggeredEnter = it
@@ -501,31 +436,20 @@
                     }
                     .focusTarget()
             ) {
+                Box(Modifier.onFocusChanged { item1Focused = it.isFocused }.focusTarget())
                 Box(
-                    Modifier
-                        .onFocusChanged { item1Focused = it.isFocused }
-                        .focusTarget()
-                )
-                Box(
-                    Modifier
-                        .focusRequester(item2)
+                    Modifier.focusRequester(item2)
                         .onFocusChanged { item2Focused = it.isFocused }
                         .focusTarget()
                 )
-                Box(
-                    Modifier
-                        .onFocusChanged { item3Focused = it.isFocused }
-                        .focusTarget()
-                )
+                Box(Modifier.onFocusChanged { item3Focused = it.isFocused }.focusTarget())
             }
         }
         rule.runOnIdle { parent.requestFocus() }
 
         // Act.
         if (moveFocusProgrammatically) {
-            rule.runOnIdle {
-                focusManager.moveFocus(FocusDirection.Enter)
-            }
+            rule.runOnIdle { focusManager.moveFocus(FocusDirection.Enter) }
         } else {
             val nativeKeyEvent = AndroidKeyEvent(KeyDown, Enter.nativeKeyCode)
             rule.onRoot().performKeyPress(KeyEvent(nativeKeyEvent))
@@ -552,14 +476,9 @@
         lateinit var focusManager: FocusManager
         rule.setFocusableContent {
             focusManager = LocalFocusManager.current
-            Row(
-                Modifier
-                    .onFocusChanged { parentFocused = it.isFocused }
-                    .focusTarget()
-            ) {
+            Row(Modifier.onFocusChanged { parentFocused = it.isFocused }.focusTarget()) {
                 Box(
-                    Modifier
-                        .focusRequester(item1)
+                    Modifier.focusRequester(item1)
                         .onFocusChanged { item1Focused = it.isFocused }
                         .focusProperties {
                             enter = {
@@ -569,14 +488,9 @@
                         }
                         .focusTarget()
                 )
+                Box(Modifier.onFocusChanged { item2Focused = it.isFocused }.focusTarget())
                 Box(
-                    Modifier
-                        .onFocusChanged { item2Focused = it.isFocused }
-                        .focusTarget()
-                )
-                Box(
-                    Modifier
-                        .focusRequester(item3)
+                    Modifier.focusRequester(item3)
                         .onFocusChanged { item3Focused = it.isFocused }
                         .focusTarget()
                 )
@@ -586,9 +500,7 @@
 
         // Act.
         if (moveFocusProgrammatically) {
-            rule.runOnIdle {
-                focusManager.moveFocus(FocusDirection.Enter)
-            }
+            rule.runOnIdle { focusManager.moveFocus(FocusDirection.Enter) }
         } else {
             val nativeKeyEvent = AndroidKeyEvent(KeyDown, Enter.nativeKeyCode)
             rule.onRoot().performKeyPress(KeyEvent(nativeKeyEvent))
@@ -618,27 +530,20 @@
             Row {
                 Box(Modifier.dynamicFocusProperties { next = item4 }) {
                     Box(
-                        Modifier
-                            .focusRequester(item1)
+                        Modifier.focusRequester(item1)
                             .dynamicFocusProperties { next = item3 }
                             .onFocusChanged { item1Focused = it.isFocused }
                             .focusTarget()
                     )
                 }
+                Box(Modifier.onFocusChanged { item2Focused = it.isFocused }.focusTarget())
                 Box(
-                    Modifier
-                        .onFocusChanged { item2Focused = it.isFocused }
-                        .focusTarget()
-                )
-                Box(
-                    Modifier
-                        .focusRequester(item3)
+                    Modifier.focusRequester(item3)
                         .onFocusChanged { item3Focused = it.isFocused }
                         .focusTarget()
                 )
                 Box(
-                    Modifier
-                        .focusRequester(item4)
+                    Modifier.focusRequester(item4)
                         .onFocusChanged { item4Focused = it.isFocused }
                         .focusTarget()
                 )
@@ -648,9 +553,7 @@
 
         // Act.
         if (moveFocusProgrammatically) {
-            rule.runOnIdle {
-                focusManager.moveFocus(FocusDirection.Next)
-            }
+            rule.runOnIdle { focusManager.moveFocus(FocusDirection.Next) }
         } else {
             rule.onRoot().performKeyPress(KeyEvent(AndroidKeyEvent(KeyDown, Tab.nativeKeyCode)))
         }
@@ -677,21 +580,15 @@
             Row {
                 Box(Modifier.dynamicFocusProperties { next = FocusRequester.Default }) {
                     Box(
-                        Modifier
-                            .focusRequester(item1)
+                        Modifier.focusRequester(item1)
                             .dynamicFocusProperties { next = item3 }
                             .onFocusChanged { item1Focused = it.isFocused }
                             .focusTarget()
                     )
                 }
+                Box(Modifier.onFocusChanged { item2Focused = it.isFocused }.focusTarget())
                 Box(
-                    Modifier
-                        .onFocusChanged { item2Focused = it.isFocused }
-                        .focusTarget()
-                )
-                Box(
-                    Modifier
-                        .focusRequester(item3)
+                    Modifier.focusRequester(item3)
                         .onFocusChanged { item3Focused = it.isFocused }
                         .focusTarget()
                 )
@@ -701,9 +598,7 @@
 
         // Act.
         if (moveFocusProgrammatically) {
-            rule.runOnIdle {
-                focusManager.moveFocus(FocusDirection.Next)
-            }
+            rule.runOnIdle { focusManager.moveFocus(FocusDirection.Next) }
         } else {
             rule.onRoot().performKeyPress(KeyEvent(AndroidKeyEvent(KeyDown, Tab.nativeKeyCode)))
         }
@@ -727,23 +622,17 @@
         rule.setFocusableContent {
             focusManager = LocalFocusManager.current
             Row {
-                Box(Modifier.dynamicFocusProperties { }) {
+                Box(Modifier.dynamicFocusProperties {}) {
                     Box(
-                        Modifier
-                            .focusRequester(item1)
+                        Modifier.focusRequester(item1)
                             .dynamicFocusProperties { next = item3 }
                             .onFocusChanged { item1Focused = it.isFocused }
                             .focusTarget()
                     )
                 }
+                Box(Modifier.onFocusChanged { item2Focused = it.isFocused }.focusTarget())
                 Box(
-                    Modifier
-                        .onFocusChanged { item2Focused = it.isFocused }
-                        .focusTarget()
-                )
-                Box(
-                    Modifier
-                        .focusRequester(item3)
+                    Modifier.focusRequester(item3)
                         .onFocusChanged { item3Focused = it.isFocused }
                         .focusTarget()
                 )
@@ -753,9 +642,7 @@
 
         // Act.
         if (moveFocusProgrammatically) {
-            rule.runOnIdle {
-                focusManager.moveFocus(FocusDirection.Next)
-            }
+            rule.runOnIdle { focusManager.moveFocus(FocusDirection.Next) }
         } else {
             rule.onRoot().performKeyPress(KeyEvent(AndroidKeyEvent(KeyDown, Tab.nativeKeyCode)))
         }
@@ -782,26 +669,19 @@
             focusManager = LocalFocusManager.current
             Row {
                 Box(
-                    Modifier
-                        .focusRequester(item1)
+                    Modifier.focusRequester(item1)
                         .dynamicFocusProperties { next = nextItem }
                         .onFocusChanged { item1Focused = it.isFocused }
                         .focusTarget()
                 )
+                Box(Modifier.onFocusChanged { item2Focused = it.isFocused }.focusTarget())
                 Box(
-                    Modifier
-                        .onFocusChanged { item2Focused = it.isFocused }
-                        .focusTarget()
-                )
-                Box(
-                    Modifier
-                        .focusRequester(item3)
+                    Modifier.focusRequester(item3)
                         .onFocusChanged { item3Focused = it.isFocused }
                         .focusTarget()
                 )
                 Box(
-                    Modifier
-                        .focusRequester(item4)
+                    Modifier.focusRequester(item4)
                         .onFocusChanged { item4Focused = it.isFocused }
                         .focusTarget()
                 )
@@ -810,13 +690,9 @@
         rule.runOnIdle { item1.requestFocus() }
 
         // Act.
-        rule.runOnIdle {
-            nextItem = item4
-        }
+        rule.runOnIdle { nextItem = item4 }
         if (moveFocusProgrammatically) {
-            rule.runOnIdle {
-                focusManager.moveFocus(FocusDirection.Next)
-            }
+            rule.runOnIdle { focusManager.moveFocus(FocusDirection.Next) }
         } else {
             rule.onRoot().performKeyPress(KeyEvent(AndroidKeyEvent(KeyDown, Tab.nativeKeyCode)))
         }
@@ -844,26 +720,19 @@
             focusManager = LocalFocusManager.current
             Row {
                 Box(
-                    Modifier
-                        .focusRequester(item1)
+                    Modifier.focusRequester(item1)
                         .dynamicFocusProperties { next = nextItem }
                         .onFocusChanged { item1Focused = it.isFocused }
                         .focusTarget()
                 )
+                Box(Modifier.onFocusChanged { item2Focused = it.isFocused }.focusTarget())
                 Box(
-                    Modifier
-                        .onFocusChanged { item2Focused = it.isFocused }
-                        .focusTarget()
-                )
-                Box(
-                    Modifier
-                        .focusRequester(item3)
+                    Modifier.focusRequester(item3)
                         .onFocusChanged { item3Focused = it.isFocused }
                         .focusTarget()
                 )
                 Box(
-                    Modifier
-                        .focusRequester(item4)
+                    Modifier.focusRequester(item4)
                         .onFocusChanged { item4Focused = it.isFocused }
                         .focusTarget()
                 )
@@ -898,9 +767,7 @@
         }
 
     @Suppress("DEPRECATION")
-    class ReceiverFocusOrderModifier(
-        val block: FocusOrder.() -> Unit
-    ) : FocusOrderModifier {
+    class ReceiverFocusOrderModifier(val block: FocusOrder.() -> Unit) : FocusOrderModifier {
         override fun populateFocusOrder(focusOrder: FocusOrder) {
             focusOrder.block()
         }
diff --git a/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/focus/DeactivatedFocusNodeTest.kt b/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/focus/DeactivatedFocusNodeTest.kt
index cdc42ef..82869c3 100644
--- a/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/focus/DeactivatedFocusNodeTest.kt
+++ b/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/focus/DeactivatedFocusNodeTest.kt
@@ -41,8 +41,7 @@
 @SmallTest
 @RunWith(AndroidJUnit4::class)
 class DeactivatedFocusNodeTest {
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
     private lateinit var lazyListState: LazyListState
     private lateinit var coroutineScope: CoroutineScope
@@ -53,14 +52,10 @@
     fun deactivatedActiveFocusNodeSendsFocusEvent() {
         // Arrange.
         rule.setTestContent {
-            LazyRow(
-                state = lazyListState,
-                modifier = Modifier.size(10.dp)
-            ) {
+            LazyRow(state = lazyListState, modifier = Modifier.size(10.dp)) {
                 items(2) { index ->
                     Box(
-                        Modifier
-                            .size(10.dp)
+                        Modifier.size(10.dp)
                             .testTag("$index")
                             .then(
                                 if (index == 0) {
@@ -81,34 +76,25 @@
         }
 
         // Act.
-        rule.runOnIdle {
-            coroutineScope.launch { lazyListState.scrollToItem(1) }
-        }
+        rule.runOnIdle { coroutineScope.launch { lazyListState.scrollToItem(1) } }
 
         // Assert.
-        rule.runOnIdle {
-            assertThat(focusStates[0]).isEqualTo(Inactive)
-        }
+        rule.runOnIdle { assertThat(focusStates[0]).isEqualTo(Inactive) }
     }
 
     @Test
     fun deactivatedActiveParentFocusNodeSendsFocusEvent() {
         // Arrange.
         rule.setTestContent {
-            LazyRow(
-                state = lazyListState,
-                modifier = Modifier.size(10.dp)
-            ) {
+            LazyRow(state = lazyListState, modifier = Modifier.size(10.dp)) {
                 items(2) { index ->
                     Box(
-                        Modifier
-                            .size(10.dp)
+                        Modifier.size(10.dp)
                             .onFocusChanged { focusStates[index] = it }
                             .focusTarget()
                     ) {
                         Box(
-                            Modifier
-                                .size(5.dp)
+                            Modifier.size(5.dp)
                                 .then(
                                     if (index == 0) {
                                         Modifier.focusRequester(initialFocusedItem)
@@ -117,7 +103,6 @@
                                     }
                                 )
                                 .focusTarget()
-
                         )
                     }
                 }
@@ -129,28 +114,20 @@
         }
 
         // Act.
-        rule.runOnIdle {
-            coroutineScope.launch { lazyListState.scrollToItem(1) }
-        }
+        rule.runOnIdle { coroutineScope.launch { lazyListState.scrollToItem(1) } }
 
         // Assert.
-        rule.runOnIdle {
-            assertThat(focusStates[0]).isEqualTo(Inactive)
-        }
+        rule.runOnIdle { assertThat(focusStates[0]).isEqualTo(Inactive) }
     }
 
     @Test
     fun deactivatedCapturedFocusNodeSendsFocusEvent() {
         // Arrange.
         rule.setTestContent {
-            LazyRow(
-                state = lazyListState,
-                modifier = Modifier.size(10.dp)
-            ) {
+            LazyRow(state = lazyListState, modifier = Modifier.size(10.dp)) {
                 items(2) { index ->
                     Box(
-                        Modifier
-                            .size(10.dp)
+                        Modifier.size(10.dp)
                             .testTag("$index")
                             .then(
                                 if (index == 0) {
@@ -172,28 +149,20 @@
         }
 
         // Act.
-        rule.runOnIdle {
-            coroutineScope.launch { lazyListState.scrollToItem(1) }
-        }
+        rule.runOnIdle { coroutineScope.launch { lazyListState.scrollToItem(1) } }
 
         // Assert.
-        rule.runOnIdle {
-            assertThat(focusStates[0]).isEqualTo(Inactive)
-        }
+        rule.runOnIdle { assertThat(focusStates[0]).isEqualTo(Inactive) }
     }
 
     @Test
     fun deactivatedInactiveFocusNodeDoesNotSendFocusEvent() {
         // Arrange.
         rule.setTestContent {
-            LazyRow(
-                state = lazyListState,
-                modifier = Modifier.size(10.dp)
-            ) {
+            LazyRow(state = lazyListState, modifier = Modifier.size(10.dp)) {
                 items(2) { index ->
                     Box(
-                        Modifier
-                            .size(10.dp)
+                        Modifier.size(10.dp)
                             .testTag("$index")
                             .then(
                                 if (index == 0) {
@@ -208,19 +177,13 @@
                 }
             }
         }
-        rule.runOnIdle {
-            focusStates.clear()
-        }
+        rule.runOnIdle { focusStates.clear() }
 
         // Act.
-        rule.runOnIdle {
-            coroutineScope.launch { lazyListState.scrollToItem(1) }
-        }
+        rule.runOnIdle { coroutineScope.launch { lazyListState.scrollToItem(1) } }
 
         // Assert.
-        rule.runOnIdle {
-            assertThat(focusStates[0]).isNull()
-        }
+        rule.runOnIdle { assertThat(focusStates[0]).isNull() }
     }
 
     private fun ComposeContentTestRule.setTestContent(content: @Composable () -> Unit) {
diff --git a/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/focus/FocusAggregationTest.kt b/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/focus/FocusAggregationTest.kt
index bff41d8..b055653 100644
--- a/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/focus/FocusAggregationTest.kt
+++ b/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/focus/FocusAggregationTest.kt
@@ -32,16 +32,13 @@
 @MediumTest
 @RunWith(AndroidJUnit4::class)
 class FocusAggregationTest {
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
     @Test
     fun nonFocusableItem() {
         // Arrange.
         lateinit var focusState: FocusState
-        rule.setFocusableContent {
-            Box(Modifier.onFocusChanged { focusState = it })
-        }
+        rule.setFocusableContent { Box(Modifier.onFocusChanged { focusState = it }) }
 
         // Assert.
         rule.runOnIdle {
@@ -58,8 +55,7 @@
         val focusRequester = FocusRequester()
         rule.setFocusableContent {
             Box(
-                Modifier
-                    .focusRequester(focusRequester)
+                Modifier.focusRequester(focusRequester)
                     .onFocusChanged { focusState = it }
                     .focusable()
             )
@@ -80,8 +76,7 @@
         val focusRequester = FocusRequester()
         rule.setFocusableContent {
             Box(
-                Modifier
-                    .focusRequester(focusRequester)
+                Modifier.focusRequester(focusRequester)
                     .onFocusChanged { focusState = it }
                     .focusable()
             )
@@ -102,11 +97,7 @@
     fun parentOfNonFocusableItem() {
         // Arrange.
         lateinit var focusState: FocusState
-        rule.setFocusableContent {
-            Box(Modifier.onFocusChanged { focusState = it }) {
-                Box {}
-            }
-        }
+        rule.setFocusableContent { Box(Modifier.onFocusChanged { focusState = it }) { Box {} } }
 
         // Assert.
         rule.runOnIdle {
@@ -121,9 +112,7 @@
         // Arrange.
         lateinit var focusState: FocusState
         rule.setFocusableContent {
-            Box(Modifier.onFocusChanged { focusState = it }) {
-                Box(Modifier.focusable())
-            }
+            Box(Modifier.onFocusChanged { focusState = it }) { Box(Modifier.focusable()) }
         }
 
         // Assert.
diff --git a/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/focus/FocusChangedCountTest.kt b/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/focus/FocusChangedCountTest.kt
index d1b5b2d..5549fa8 100644
--- a/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/focus/FocusChangedCountTest.kt
+++ b/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/focus/FocusChangedCountTest.kt
@@ -35,8 +35,7 @@
 @MediumTest
 @RunWith(AndroidJUnit4::class)
 class FocusChangedCountTest {
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
     @Test
     fun initially_focusChangedIsCalledOnce() {
@@ -45,10 +44,10 @@
         val focusRequester = FocusRequester()
         rule.setFocusableContent {
             Box(
-                modifier = Modifier
-                    .onFocusChanged { focusStates.add(it) }
-                    .focusRequester(focusRequester)
-                    .focusTarget()
+                modifier =
+                    Modifier.onFocusChanged { focusStates.add(it) }
+                        .focusRequester(focusRequester)
+                        .focusTarget()
             )
         }
 
@@ -60,9 +59,7 @@
     fun initiallyNoFocusTarget_onFocusChangedIsCalledOnce() {
         // Arrange.
         val focusStates = mutableListOf<FocusState>()
-        rule.setFocusableContent {
-            Box(modifier = Modifier.onFocusChanged { focusStates.add(it) })
-        }
+        rule.setFocusableContent { Box(modifier = Modifier.onFocusChanged { focusStates.add(it) }) }
 
         // Assert.
         rule.runOnIdle { assertThat(focusStates).isExactly(Inactive) }
@@ -75,10 +72,10 @@
         val focusRequester = FocusRequester()
         rule.setFocusableContent {
             Box(
-                modifier = Modifier
-                    .onFocusChanged { focusStates.add(it) }
-                    .focusRequester(focusRequester)
-                    .focusTarget()
+                modifier =
+                    Modifier.onFocusChanged { focusStates.add(it) }
+                        .focusRequester(focusRequester)
+                        .focusTarget()
             )
         }
         rule.runOnIdle { focusStates.clear() }
@@ -97,10 +94,10 @@
         val focusRequester = FocusRequester()
         rule.setFocusableContent {
             Box(
-                modifier = Modifier
-                    .onFocusChanged { focusStates.add(it) }
-                    .focusRequester(focusRequester)
-                    .focusTarget()
+                modifier =
+                    Modifier.onFocusChanged { focusStates.add(it) }
+                        .focusRequester(focusRequester)
+                        .focusTarget()
             )
         }
         rule.runOnIdle {
@@ -124,10 +121,10 @@
         rule.setFocusableContent {
             focusManager = LocalFocusManager.current
             Box(
-                modifier = Modifier
-                    .onFocusChanged { focusStates.add(it) }
-                    .focusRequester(focusRequester)
-                    .focusTarget()
+                modifier =
+                    Modifier.onFocusChanged { focusStates.add(it) }
+                        .focusRequester(focusRequester)
+                        .focusTarget()
             )
         }
         rule.runOnIdle {
@@ -151,10 +148,10 @@
         rule.setFocusableContent {
             addFocusTarget = remember { mutableStateOf(true) }
             Box(
-                modifier = Modifier
-                    .onFocusChanged { focusStates.add(it) }
-                    .focusRequester(focusRequester)
-                    .then(if (addFocusTarget.value) Modifier.focusTarget() else Modifier)
+                modifier =
+                    Modifier.onFocusChanged { focusStates.add(it) }
+                        .focusRequester(focusRequester)
+                        .then(if (addFocusTarget.value) Modifier.focusTarget() else Modifier)
             )
         }
         rule.runOnIdle {
@@ -177,9 +174,9 @@
         rule.setFocusableContent {
             addFocusTarget = remember { mutableStateOf(true) }
             Box(
-                modifier = Modifier
-                    .onFocusChanged { focusStates.add(it) }
-                    .then(if (addFocusTarget.value) Modifier.focusTarget() else Modifier)
+                modifier =
+                    Modifier.onFocusChanged { focusStates.add(it) }
+                        .then(if (addFocusTarget.value) Modifier.focusTarget() else Modifier)
             )
         }
         rule.runOnIdle { focusStates.clear() }
@@ -199,9 +196,9 @@
         rule.setFocusableContent {
             addFocusTarget = remember { mutableStateOf(false) }
             Box(
-                modifier = Modifier
-                    .onFocusChanged { focusStates.add(it) }
-                    .then(if (addFocusTarget.value) Modifier.focusTarget() else Modifier)
+                modifier =
+                    Modifier.onFocusChanged { focusStates.add(it) }
+                        .then(if (addFocusTarget.value) Modifier.focusTarget() else Modifier)
             )
         }
         rule.runOnIdle { focusStates.clear() }
diff --git a/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/focus/FocusChangedTest.kt b/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/focus/FocusChangedTest.kt
index 6c9bf4d..265dc11 100644
--- a/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/focus/FocusChangedTest.kt
+++ b/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/focus/FocusChangedTest.kt
@@ -29,8 +29,7 @@
 @MediumTest
 @RunWith(AndroidJUnit4::class)
 class FocusChangedTest {
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
     @Test
     fun active_requestFocus() {
@@ -39,10 +38,10 @@
         val focusRequester = FocusRequester()
         rule.setFocusableContent {
             Box(
-                modifier = Modifier
-                    .onFocusChanged { focusState = it }
-                    .focusRequester(focusRequester)
-                    .focusTarget()
+                modifier =
+                    Modifier.onFocusChanged { focusState = it }
+                        .focusRequester(focusRequester)
+                        .focusTarget()
             )
         }
         rule.runOnIdle { focusRequester.requestFocus() }
@@ -62,16 +61,16 @@
         val (focusRequester, childFocusRequester) = FocusRequester.createRefs()
         rule.setFocusableContent {
             Box(
-                modifier = Modifier
-                    .onFocusChanged { focusState = it }
-                    .focusRequester(focusRequester)
-                    .focusTarget()
+                modifier =
+                    Modifier.onFocusChanged { focusState = it }
+                        .focusRequester(focusRequester)
+                        .focusTarget()
             ) {
                 Box(
-                    modifier = Modifier
-                        .onFocusChanged { childFocusState = it }
-                        .focusRequester(childFocusRequester)
-                        .focusTarget()
+                    modifier =
+                        Modifier.onFocusChanged { childFocusState = it }
+                            .focusRequester(childFocusRequester)
+                            .focusTarget()
                 )
             }
         }
@@ -97,10 +96,10 @@
         val focusRequester = FocusRequester()
         rule.setFocusableContent {
             Box(
-                modifier = Modifier
-                    .onFocusChanged { focusState = it }
-                    .focusRequester(focusRequester)
-                    .focusTarget()
+                modifier =
+                    Modifier.onFocusChanged { focusState = it }
+                        .focusRequester(focusRequester)
+                        .focusTarget()
             )
         }
         rule.runOnIdle {
@@ -123,11 +122,11 @@
         val focusRequester = FocusRequester()
         rule.setFocusableContent {
             Box(
-                modifier = Modifier
-                    .onFocusChanged { focusState = it }
-                    .focusRequester(focusRequester)
-                    .focusProperties { canFocus = false }
-                    .focusTarget()
+                modifier =
+                    Modifier.onFocusChanged { focusState = it }
+                        .focusRequester(focusRequester)
+                        .focusProperties { canFocus = false }
+                        .focusTarget()
             )
         }
 
@@ -146,17 +145,17 @@
         val (focusRequester, childFocusRequester) = FocusRequester.createRefs()
         rule.setFocusableContent {
             Box(
-                modifier = Modifier
-                    .onFocusChanged { focusState = it }
-                    .focusRequester(focusRequester)
-                    .focusProperties { canFocus = false }
-                    .focusTarget()
+                modifier =
+                    Modifier.onFocusChanged { focusState = it }
+                        .focusRequester(focusRequester)
+                        .focusProperties { canFocus = false }
+                        .focusTarget()
             ) {
                 Box(
-                    modifier = Modifier
-                        .onFocusChanged { childFocusState = it }
-                        .focusRequester(childFocusRequester)
-                        .focusTarget()
+                    modifier =
+                        Modifier.onFocusChanged { childFocusState = it }
+                            .focusRequester(childFocusRequester)
+                            .focusTarget()
                 )
             }
         }
@@ -185,10 +184,10 @@
         val focusRequester = FocusRequester()
         rule.setFocusableContent {
             Box(
-                modifier = Modifier
-                    .onFocusChanged { focusState = it }
-                    .focusRequester(focusRequester)
-                    .focusTarget()
+                modifier =
+                    Modifier.onFocusChanged { focusState = it }
+                        .focusRequester(focusRequester)
+                        .focusTarget()
             )
         }
 
@@ -211,22 +210,21 @@
         val focusRequester = FocusRequester()
         rule.setFocusableContent {
             Box(
-                modifier = Modifier
-                    .onFocusChanged { focusState1 = it }
-                    .onFocusChanged { focusState2 = it }
+                modifier =
+                    Modifier.onFocusChanged { focusState1 = it }.onFocusChanged { focusState2 = it }
             ) {
                 Box {
                     Box(
-                        modifier = Modifier
-                            .onFocusChanged { focusState3 = it }
-                            .onFocusChanged { focusState4 = it }
+                        modifier =
+                            Modifier.onFocusChanged { focusState3 = it }
+                                .onFocusChanged { focusState4 = it }
                     ) {
                         Box(
-                            modifier = Modifier
-                                .onFocusChanged { focusState5 = it }
-                                .onFocusChanged { focusState6 = it }
-                                .focusRequester(focusRequester)
-                                .focusTarget()
+                            modifier =
+                                Modifier.onFocusChanged { focusState5 = it }
+                                    .onFocusChanged { focusState6 = it }
+                                    .focusRequester(focusRequester)
+                                    .focusTarget()
                         )
                     }
                 }
@@ -257,14 +255,14 @@
         val focusRequester = FocusRequester()
         rule.setFocusableContent {
             Box(
-                modifier = Modifier
-                    .onFocusChanged { focusState1 = it }
-                    .onFocusChanged { focusState2 = it }
-                    .focusTarget()
-                    .onFocusChanged { focusState3 = it }
-                    .onFocusChanged { focusState4 = it }
-                    .focusRequester(focusRequester)
-                    .focusTarget()
+                modifier =
+                    Modifier.onFocusChanged { focusState1 = it }
+                        .onFocusChanged { focusState2 = it }
+                        .focusTarget()
+                        .onFocusChanged { focusState3 = it }
+                        .onFocusChanged { focusState4 = it }
+                        .focusRequester(focusRequester)
+                        .focusTarget()
             )
         }
 
diff --git a/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/focus/FocusEventCountTest.kt b/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/focus/FocusEventCountTest.kt
index e393205..a28f3aad 100644
--- a/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/focus/FocusEventCountTest.kt
+++ b/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/focus/FocusEventCountTest.kt
@@ -39,19 +39,17 @@
 @MediumTest
 @RunWith(Parameterized::class)
 class FocusEventCountTest(private val focusEventType: String) {
-    private val onFocusEvent = if (focusEventType == UseOnFocusEvent) {
-        OnFocusEventCall
-    } else {
-        FocusEventModifierCall
-    }
+    private val onFocusEvent =
+        if (focusEventType == UseOnFocusEvent) {
+            OnFocusEventCall
+        } else {
+            FocusEventModifierCall
+        }
 
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
     companion object {
-        val OnFocusEventCall: Modifier.((FocusState) -> Unit) -> Modifier = {
-            onFocusEvent(it)
-        }
+        val OnFocusEventCall: Modifier.((FocusState) -> Unit) -> Modifier = { onFocusEvent(it) }
         val FocusEventModifierCall: Modifier.((FocusState) -> Unit) -> Modifier = {
             focusEventModifier(it)
         }
@@ -60,12 +58,13 @@
         @Parameterized.Parameters(name = "onFocusEvent = {0}")
         fun initParameters() = listOf(UseOnFocusEvent, UseFocusEventModifier)
 
-        private fun Modifier.focusEventModifier(event: (FocusState) -> Unit) = this.then(
-            @Suppress("DEPRECATION")
-            object : FocusEventModifier {
-                override fun onFocusEvent(focusState: FocusState) = event(focusState)
-            }
-        )
+        private fun Modifier.focusEventModifier(event: (FocusState) -> Unit) =
+            this.then(
+                @Suppress("DEPRECATION")
+                object : FocusEventModifier {
+                    override fun onFocusEvent(focusState: FocusState) = event(focusState)
+                }
+            )
     }
 
     @Test
@@ -75,10 +74,10 @@
         val focusRequester = FocusRequester()
         rule.setFocusableContent {
             Box(
-                modifier = Modifier
-                    .onFocusEvent { focusStates.add(it) }
-                    .focusRequester(focusRequester)
-                    .focusTarget()
+                modifier =
+                    Modifier.onFocusEvent { focusStates.add(it) }
+                        .focusRequester(focusRequester)
+                        .focusTarget()
             )
         }
 
@@ -90,9 +89,7 @@
     fun initiallyNoFocusTarget_onFocusEventIsCalledOnce() {
         // Arrange.
         val focusStates = mutableListOf<FocusState>()
-        rule.setFocusableContent {
-            Box(modifier = Modifier.onFocusEvent { focusStates.add(it) })
-        }
+        rule.setFocusableContent { Box(modifier = Modifier.onFocusEvent { focusStates.add(it) }) }
 
         // Assert.
         rule.runOnIdle { assertThat(focusStates).isExactly(Inactive) }
@@ -105,10 +102,10 @@
         val focusRequester = FocusRequester()
         rule.setFocusableContent {
             Box(
-                modifier = Modifier
-                    .onFocusEvent { focusStates.add(it) }
-                    .focusRequester(focusRequester)
-                    .focusTarget()
+                modifier =
+                    Modifier.onFocusEvent { focusStates.add(it) }
+                        .focusRequester(focusRequester)
+                        .focusTarget()
             )
         }
         rule.runOnIdle { focusStates.clear() }
@@ -126,21 +123,9 @@
         val focusStates = mutableListOf<FocusState>()
         val (item1, item2) = FocusRequester.createRefs()
         rule.setFocusableContent {
-            Box(
-                modifier = Modifier
-                    .onFocusEvent { focusStates.add(it) }
-                    .focusTarget()
-            ) {
-                Box(
-                    modifier = Modifier
-                        .focusRequester(item1)
-                        .focusTarget()
-                )
-                Box(
-                    modifier = Modifier
-                        .focusRequester(item2)
-                        .focusTarget()
-                )
+            Box(modifier = Modifier.onFocusEvent { focusStates.add(it) }.focusTarget()) {
+                Box(modifier = Modifier.focusRequester(item1).focusTarget())
+                Box(modifier = Modifier.focusRequester(item2).focusTarget())
             }
         }
         rule.runOnIdle {
@@ -161,16 +146,8 @@
         val focusStates = mutableListOf<FocusState>()
         val focusRequester = FocusRequester()
         rule.setFocusableContent {
-            Box(
-                modifier = Modifier
-                    .onFocusEvent { focusStates.add(it) }
-                    .focusTarget()
-            ) {
-                Box(
-                    modifier = Modifier
-                        .focusRequester(focusRequester)
-                        .focusTarget()
-                )
+            Box(modifier = Modifier.onFocusEvent { focusStates.add(it) }.focusTarget()) {
+                Box(modifier = Modifier.focusRequester(focusRequester).focusTarget())
             }
         }
         rule.runOnIdle { focusStates.clear() }
@@ -189,11 +166,11 @@
         val focusRequester = FocusRequester()
         rule.setFocusableContent {
             Box(
-                modifier = Modifier
-                    .onFocusEvent { focusStates.add(it) }
-                    .focusTarget()
-                    .focusRequester(focusRequester)
-                    .focusTarget()
+                modifier =
+                    Modifier.onFocusEvent { focusStates.add(it) }
+                        .focusTarget()
+                        .focusRequester(focusRequester)
+                        .focusTarget()
             )
         }
         rule.runOnIdle { focusStates.clear() }
@@ -212,10 +189,10 @@
         val focusRequester = FocusRequester()
         rule.setFocusableContent {
             Box(
-                modifier = Modifier
-                    .onFocusEvent { focusStates.add(it) }
-                    .focusRequester(focusRequester)
-                    .focusTarget()
+                modifier =
+                    Modifier.onFocusEvent { focusStates.add(it) }
+                        .focusRequester(focusRequester)
+                        .focusTarget()
             )
         }
         rule.runOnIdle {
@@ -239,10 +216,10 @@
         rule.setFocusableContent {
             focusManager = LocalFocusManager.current
             Box(
-                modifier = Modifier
-                    .onFocusEvent { focusStates.add(it) }
-                    .focusRequester(focusRequester)
-                    .focusTarget()
+                modifier =
+                    Modifier.onFocusEvent { focusStates.add(it) }
+                        .focusRequester(focusRequester)
+                        .focusTarget()
             )
         }
         rule.runOnIdle {
@@ -266,10 +243,10 @@
         rule.setFocusableContent {
             if (showBox) {
                 Box(
-                    modifier = Modifier
-                        .onFocusEvent { focusStates.add(it) }
-                        .focusRequester(focusRequester)
-                        .focusTarget()
+                    modifier =
+                        Modifier.onFocusEvent { focusStates.add(it) }
+                            .focusRequester(focusRequester)
+                            .focusTarget()
                 )
             }
         }
@@ -293,10 +270,10 @@
         var addFocusTarget by mutableStateOf(true)
         rule.setFocusableContent {
             Box(
-                modifier = Modifier
-                    .onFocusEvent { focusStates.add(it) }
-                    .focusRequester(focusRequester)
-                    .then(if (addFocusTarget) Modifier.focusTarget() else Modifier)
+                modifier =
+                    Modifier.onFocusEvent { focusStates.add(it) }
+                        .focusRequester(focusRequester)
+                        .then(if (addFocusTarget) Modifier.focusTarget() else Modifier)
             )
         }
         rule.runOnIdle {
@@ -310,14 +287,13 @@
         // Assert.
         rule.runOnIdle {
             if (focusEventType == UseOnFocusEvent) {
-                assertThat(focusStates).isExactly(
-                    Inactive
-                )
+                assertThat(focusStates).isExactly(Inactive)
             } else {
-                assertThat(focusStates).isExactly(
-                    Inactive, // triggered by clearFocus() of the active node.
-                    Inactive, // triggered by onFocusEvent node's attach().
-                )
+                assertThat(focusStates)
+                    .isExactly(
+                        Inactive, // triggered by clearFocus() of the active node.
+                        Inactive, // triggered by onFocusEvent node's attach().
+                    )
             }
         }
     }
@@ -329,9 +305,9 @@
         var addFocusTarget by mutableStateOf(true)
         rule.setFocusableContent {
             Box(
-                modifier = Modifier
-                    .onFocusEvent { focusStates.add(it) }
-                    .then(if (addFocusTarget) Modifier.focusTarget() else Modifier)
+                modifier =
+                    Modifier.onFocusEvent { focusStates.add(it) }
+                        .then(if (addFocusTarget) Modifier.focusTarget() else Modifier)
             )
         }
         rule.runOnIdle { focusStates.clear() }
@@ -355,11 +331,11 @@
         var addFocusTarget by mutableStateOf(true)
         rule.setFocusableContent {
             Box(
-                modifier = Modifier
-                    .onFocusEvent { focusStates.add(it) }
-                    .then(if (addFocusTarget) Modifier.focusTarget() else Modifier)
-                    .focusRequester(focusRequester)
-                    .focusTarget()
+                modifier =
+                    Modifier.onFocusEvent { focusStates.add(it) }
+                        .then(if (addFocusTarget) Modifier.focusTarget() else Modifier)
+                        .focusRequester(focusRequester)
+                        .focusTarget()
             )
         }
         rule.runOnIdle {
@@ -387,11 +363,7 @@
         rule.setFocusableContent {
             Box(Modifier.onFocusEvent { focusStates.add(it) }) {
                 Box(if (addFocusTarget) Modifier.focusTarget() else Modifier) {
-                    Box(
-                        modifier = Modifier
-                            .focusRequester(focusRequester)
-                            .focusTarget()
-                    )
+                    Box(modifier = Modifier.focusRequester(focusRequester).focusTarget())
                 }
             }
         }
@@ -418,9 +390,9 @@
         var addFocusTarget by mutableStateOf(false)
         rule.setFocusableContent {
             Box(
-                modifier = Modifier
-                    .onFocusEvent { focusStates.add(it) }
-                    .then(if (addFocusTarget) Modifier.focusTarget() else Modifier)
+                modifier =
+                    Modifier.onFocusEvent { focusStates.add(it) }
+                        .then(if (addFocusTarget) Modifier.focusTarget() else Modifier)
             )
         }
         rule.runOnIdle { focusStates.clear() }
@@ -445,10 +417,10 @@
         var addFocusProperties by mutableStateOf(false)
         rule.setFocusableContent {
             Box(
-                modifier = Modifier
-                    .onFocusEvent { focusStates.add(it) }
-                    .then(if (addFocusProperties) Modifier.focusProperties {} else Modifier)
-                    .focusTarget()
+                modifier =
+                    Modifier.onFocusEvent { focusStates.add(it) }
+                        .then(if (addFocusProperties) Modifier.focusProperties {} else Modifier)
+                        .focusTarget()
             )
         }
         rule.runOnIdle { focusStates.clear() }
@@ -473,16 +445,16 @@
         var addFocusProperties by mutableStateOf(false)
         rule.setFocusableContent {
             Box(
-                modifier = Modifier
-                    .onFocusEvent { focusStates.add(it) }
-                    .then(
-                        if (addFocusProperties) {
-                            Modifier.focusProperties { canFocus = true }
-                        } else {
-                            Modifier
-                        }
-                    )
-                    .focusTarget()
+                modifier =
+                    Modifier.onFocusEvent { focusStates.add(it) }
+                        .then(
+                            if (addFocusProperties) {
+                                Modifier.focusProperties { canFocus = true }
+                            } else {
+                                Modifier
+                            }
+                        )
+                        .focusTarget()
             )
         }
         rule.runOnIdle { focusStates.clear() }
@@ -507,10 +479,10 @@
         var add by mutableStateOf(false)
         rule.setFocusableContent {
             Box(
-                modifier = Modifier
-                    .onFocusEvent { focusStates.add(it) }
-                    .then(if (add) Modifier.focusProperties { canFocus = false } else Modifier)
-                    .focusTarget()
+                modifier =
+                    Modifier.onFocusEvent { focusStates.add(it) }
+                        .then(if (add) Modifier.focusProperties { canFocus = false } else Modifier)
+                        .focusTarget()
             )
         }
         rule.runOnIdle { focusStates.clear() }
@@ -536,10 +508,12 @@
         val lambda: (FocusState) -> Unit = { focusStates.add(it) }
         rule.setFocusableContent {
             Box(
-                modifier = Modifier
-                    .onFocusEvent(lambda)
-                    .then(if (remove) Modifier else Modifier.focusProperties { canFocus = true })
-                    .focusTarget()
+                modifier =
+                    Modifier.onFocusEvent(lambda)
+                        .then(
+                            if (remove) Modifier else Modifier.focusProperties { canFocus = true }
+                        )
+                        .focusTarget()
             )
         }
         rule.runOnIdle { focusStates.clear() }
@@ -567,10 +541,12 @@
 
         rule.setFocusableContent {
             Box(
-                modifier = Modifier
-                    .onFocusEvent(focusEventHandler)
-                    .then(if (remove) Modifier else Modifier.focusProperties { canFocus = false })
-                    .focusTarget()
+                modifier =
+                    Modifier.onFocusEvent(focusEventHandler)
+                        .then(
+                            if (remove) Modifier else Modifier.focusProperties { canFocus = false }
+                        )
+                        .focusTarget()
             )
         }
         rule.runOnIdle { focusStates.clear() }
@@ -579,13 +555,13 @@
         rule.runOnIdle { remove = true }
 
         // Assert.
-         rule.runOnIdle {
-             if (focusEventType == UseOnFocusEvent) {
-                 assertThat(focusStates).isEmpty()
-             } else {
-                 assertThat(focusStates).isExactly(Inactive)
-             }
-         }
+        rule.runOnIdle {
+            if (focusEventType == UseOnFocusEvent) {
+                assertThat(focusStates).isEmpty()
+            } else {
+                assertThat(focusStates).isExactly(Inactive)
+            }
+        }
     }
 
     @Test
@@ -595,10 +571,10 @@
         var deactivated by mutableStateOf(false)
         rule.setFocusableContent {
             Box(
-                modifier = Modifier
-                    .onFocusEvent { focusStates.add(it) }
-                    .focusProperties { canFocus = !deactivated }
-                    .focusTarget()
+                modifier =
+                    Modifier.onFocusEvent { focusStates.add(it) }
+                        .focusProperties { canFocus = !deactivated }
+                        .focusTarget()
             )
         }
         rule.runOnIdle { focusStates.clear() }
@@ -618,10 +594,10 @@
         var nextItem by mutableStateOf(item1)
         rule.setFocusableContent {
             Box(
-                modifier = Modifier
-                    .onFocusEvent { focusStates.add(it) }
-                    .focusProperties { next = nextItem }
-                    .focusTarget()
+                modifier =
+                    Modifier.onFocusEvent { focusStates.add(it) }
+                        .focusProperties { next = nextItem }
+                        .focusTarget()
             )
         }
         rule.runOnIdle { focusStates.clear() }
@@ -640,10 +616,10 @@
         var canFocus by mutableStateOf(false)
         rule.setFocusableContent {
             Box(
-                modifier = Modifier
-                    .onFocusEvent { focusStates.add(it) }
-                    .focusProperties { this.canFocus = canFocus }
-                    .focusTarget()
+                modifier =
+                    Modifier.onFocusEvent { focusStates.add(it) }
+                        .focusProperties { this.canFocus = canFocus }
+                        .focusTarget()
             )
         }
         rule.runOnIdle { focusStates.clear() }
diff --git a/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/focus/FocusManagerCompositionLocalTest.kt b/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/focus/FocusManagerCompositionLocalTest.kt
index 05ce734..7fda49e 100644
--- a/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/focus/FocusManagerCompositionLocalTest.kt
+++ b/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/focus/FocusManagerCompositionLocalTest.kt
@@ -48,8 +48,7 @@
 @MediumTest
 @RunWith(AndroidJUnit4::class)
 class FocusManagerCompositionLocalTest {
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
     private lateinit var focusManager: FocusManager
     private lateinit var inputModeManager: InputModeManager
@@ -61,10 +60,10 @@
         val focusRequester = FocusRequester()
         rule.setTestContent(extraItemForInitialFocus = false) {
             Box(
-                modifier = Modifier
-                    .focusRequester(focusRequester)
-                    .onFocusChanged { focusStates += it }
-                    .focusTarget()
+                modifier =
+                    Modifier.focusRequester(focusRequester)
+                        .onFocusChanged { focusStates += it }
+                        .focusTarget()
             )
         }
         rule.runOnIdle {
@@ -100,21 +99,13 @@
         val focusRequester = FocusRequester()
         rule.setTestContent {
             focusManager = LocalFocusManager.current
-            Box(
-                modifier = Modifier
-                    .onFocusChanged { grandparentFocusState = it }
-                    .focusTarget()
-            ) {
-                Box(
-                    modifier = Modifier
-                        .onFocusChanged { parentFocusState = it }
-                        .focusTarget()
-                ) {
+            Box(modifier = Modifier.onFocusChanged { grandparentFocusState = it }.focusTarget()) {
+                Box(modifier = Modifier.onFocusChanged { parentFocusState = it }.focusTarget()) {
                     Box(
-                        modifier = Modifier
-                            .focusRequester(focusRequester)
-                            .onFocusChanged { focusState = it }
-                            .focusTarget()
+                        modifier =
+                            Modifier.focusRequester(focusRequester)
+                                .onFocusChanged { focusState = it }
+                                .focusTarget()
                     )
                 }
             }
@@ -144,11 +135,7 @@
         lateinit var view: View
         rule.setTestContent(extraItemForInitialFocus = false) {
             view = LocalView.current
-            Box(
-                modifier = Modifier
-                    .onFocusChanged { focusStates += it }
-                    .focusTarget()
-            )
+            Box(modifier = Modifier.onFocusChanged { focusStates += it }.focusTarget())
         }
 
         // Act.
@@ -170,11 +157,7 @@
         lateinit var view: View
         rule.setTestContent(extraItemForInitialFocus = false) {
             view = LocalView.current
-            Box(
-                modifier = Modifier
-                    .onFocusChanged { focusStates += it }
-                    .focusTarget()
-            )
+            Box(modifier = Modifier.onFocusChanged { focusStates += it }.focusTarget())
         }
 
         // Act.
@@ -195,10 +178,10 @@
         rule.setTestContent(extraItemForInitialFocus = false) {
             view = LocalView.current
             Box(
-                modifier = Modifier
-                    .focusRequester(focusRequester)
-                    .onFocusChanged { focusStates += it }
-                    .focusTarget()
+                modifier =
+                    Modifier.focusRequester(focusRequester)
+                        .onFocusChanged { focusStates += it }
+                        .focusTarget()
             )
         }
         rule.runOnIdle {
@@ -207,9 +190,7 @@
         }
 
         // Act.
-        rule.runOnIdle {
-            view.clearFocus()
-        }
+        rule.runOnIdle { view.clearFocus() }
 
         // Assert.
         rule.runOnIdle {
@@ -234,10 +215,10 @@
         val focusRequester = FocusRequester()
         rule.setTestContent {
             Box(
-                modifier = Modifier
-                    .focusRequester(focusRequester)
-                    .onFocusChanged { focusStates += it }
-                    .focusTarget()
+                modifier =
+                    Modifier.focusRequester(focusRequester)
+                        .onFocusChanged { focusStates += it }
+                        .focusTarget()
             )
         }
         rule.runOnIdle { focusStates.clear() }
@@ -267,10 +248,10 @@
         val focusRequester = FocusRequester()
         rule.setTestContent(extraItemForInitialFocus = false) {
             Box(
-                modifier = Modifier
-                    .focusRequester(focusRequester)
-                    .onFocusChanged { focusStates += it }
-                    .focusTarget()
+                modifier =
+                    Modifier.focusRequester(focusRequester)
+                        .onFocusChanged { focusStates += it }
+                        .focusTarget()
             )
         }
         rule.runOnIdle {
@@ -304,10 +285,10 @@
         rule.setTestContent {
             focusManager = LocalFocusManager.current
             Box(
-                modifier = Modifier
-                    .focusRequester(focusRequester)
-                    .onFocusChanged { focusStates += it }
-                    .focusTarget()
+                modifier =
+                    Modifier.focusRequester(focusRequester)
+                        .onFocusChanged { focusStates += it }
+                        .focusTarget()
             )
         }
         rule.runOnIdle {
@@ -331,12 +312,11 @@
         // Arrange.
         val focusRequester = FocusRequester()
         rule.setTestContent(extraItemForInitialFocus = false) {
-
             Box(
-                modifier = Modifier
-                    .focusRequester(focusRequester)
-                    .onFocusChanged { focusStates += it }
-                    .focusTarget()
+                modifier =
+                    Modifier.focusRequester(focusRequester)
+                        .onFocusChanged { focusStates += it }
+                        .focusTarget()
             )
         }
         rule.runOnIdle {
@@ -370,11 +350,7 @@
         // Arrange.
         val textField = "textField"
         rule.setTestContent(extraItemForInitialFocus = false) {
-            TextField(
-                value = "",
-                onValueChange = {},
-                modifier = Modifier.testTag(textField)
-            )
+            TextField(value = "", onValueChange = {}, modifier = Modifier.testTag(textField))
         }
         rule.onNodeWithTag(textField).requestFocus()
 
diff --git a/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/focus/FocusRequesterTest.kt b/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/focus/FocusRequesterTest.kt
index b7977b7..67c0a7a 100644
--- a/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/focus/FocusRequesterTest.kt
+++ b/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/focus/FocusRequesterTest.kt
@@ -43,8 +43,7 @@
 @MediumTest
 @RunWith(Parameterized::class)
 class FocusRequesterTest(private val modifierNodeVersion: Boolean) {
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
     @Test
     fun requestFocus_noFocusTargetInLayoutNode() {
@@ -53,9 +52,8 @@
         val focusRequester = FocusRequester()
         rule.setFocusableContent {
             Box(
-                modifier = Modifier
-                    .onFocusChanged { focusState = it }
-                    .focusRequester(focusRequester)
+                modifier =
+                    Modifier.onFocusChanged { focusState = it }.focusRequester(focusRequester)
             )
         }
 
@@ -75,10 +73,10 @@
         val focusRequester = FocusRequester()
         rule.setFocusableContent {
             Box(
-                modifier = Modifier
-                    .onFocusChanged { focusState = it }
-                    .focusTarget()
-                    .focusRequester(focusRequester)
+                modifier =
+                    Modifier.onFocusChanged { focusState = it }
+                        .focusTarget()
+                        .focusRequester(focusRequester)
             )
         }
 
@@ -98,10 +96,10 @@
         val focusRequester = FocusRequester()
         rule.setFocusableContent {
             Box(
-                modifier = Modifier
-                    .onFocusChanged { focusState = it }
-                    .focusRequester(focusRequester)
-                    .focusTarget()
+                modifier =
+                    Modifier.onFocusChanged { focusState = it }
+                        .focusRequester(focusRequester)
+                        .focusTarget()
             )
         }
 
@@ -121,9 +119,8 @@
         val focusRequester = FocusRequester()
         rule.setFocusableContent {
             Box(
-                modifier = Modifier
-                    .focusRequester(focusRequester)
-                    .onFocusChanged { focusState = it }
+                modifier =
+                    Modifier.focusRequester(focusRequester).onFocusChanged { focusState = it }
             ) {
                 Box(modifier = Modifier.focusTarget())
             }
@@ -144,14 +141,8 @@
         lateinit var focusState: FocusState
         val focusRequester = FocusRequester()
         rule.setFocusableContent {
-            Box(
-                modifier = Modifier.onFocusChanged { focusState = it }
-            ) {
-                Box(
-                    modifier = Modifier
-                        .focusRequester(focusRequester)
-                        .focusTarget()
-                )
+            Box(modifier = Modifier.onFocusChanged { focusState = it }) {
+                Box(modifier = Modifier.focusRequester(focusRequester).focusTarget())
             }
         }
 
@@ -170,14 +161,8 @@
         lateinit var focusState: FocusState
         val focusRequester = FocusRequester()
         rule.setFocusableContent {
-            Box(
-                modifier = Modifier.focusRequester(focusRequester)
-            ) {
-                Box(
-                    modifier = Modifier
-                        .onFocusChanged { focusState = it }
-                        .focusTarget()
-                )
+            Box(modifier = Modifier.focusRequester(focusRequester)) {
+                Box(modifier = Modifier.onFocusChanged { focusState = it }.focusTarget())
             }
         }
 
@@ -197,23 +182,10 @@
         val focusRequester = FocusRequester()
         rule.setFocusableContent {
             Box(
-                modifier = Modifier
-                    .onFocusChanged { focusState = it }
-                    .focusRequester(focusRequester)
+                modifier =
+                    Modifier.onFocusChanged { focusState = it }.focusRequester(focusRequester)
             ) {
-                Box {
-                    Box {
-                        Box {
-                            Box {
-                                Box {
-                                    Box(
-                                        modifier = Modifier.focusTarget()
-                                    )
-                                }
-                            }
-                        }
-                    }
-                }
+                Box { Box { Box { Box { Box { Box(modifier = Modifier.focusTarget()) } } } } }
             }
         }
 
@@ -233,19 +205,9 @@
         lateinit var focusState2: FocusState
         val focusRequester = FocusRequester()
         rule.setFocusableContent {
-            Column(
-                modifier = Modifier.focusRequester(focusRequester)
-            ) {
-                Box(
-                    modifier = Modifier
-                        .onFocusChanged { focusState1 = it }
-                        .focusTarget()
-                )
-                Box(
-                    modifier = Modifier
-                        .onFocusChanged { focusState2 = it }
-                        .focusTarget()
-                )
+            Column(modifier = Modifier.focusRequester(focusRequester)) {
+                Box(modifier = Modifier.onFocusChanged { focusState1 = it }.focusTarget())
+                Box(modifier = Modifier.onFocusChanged { focusState2 = it }.focusTarget())
             }
         }
 
@@ -266,16 +228,14 @@
         val focusRequester = FocusRequester()
         rule.setFocusableContent {
             Box(
-                modifier = Modifier
-                    .focusRequester(focusRequester)
-                    .focusProperties { canFocus = false }
-                    .focusTarget()
+                modifier =
+                    Modifier.focusRequester(focusRequester)
+                        .focusProperties { canFocus = false }
+                        .focusTarget()
             ) {
                 Box(
-                    modifier = Modifier
-                        .size(10.dp)
-                        .onFocusChanged { childFocusState = it }
-                        .focusTarget()
+                    modifier =
+                        Modifier.size(10.dp).onFocusChanged { childFocusState = it }.focusTarget()
                 )
             }
         }
@@ -297,23 +257,16 @@
         val focusRequester = FocusRequester()
         rule.setFocusableContent {
             Column(
-                modifier = Modifier
-                    .focusRequester(focusRequester)
-                    .focusProperties { canFocus = false }
-                    .focusTarget()
+                modifier =
+                    Modifier.focusRequester(focusRequester)
+                        .focusProperties { canFocus = false }
+                        .focusTarget()
             ) {
                 Box(
-                    modifier = Modifier
-                        .size(10.dp)
-                        .onFocusChanged { childFocusState = it }
-                        .focusTarget()
+                    modifier =
+                        Modifier.size(10.dp).onFocusChanged { childFocusState = it }.focusTarget()
                 )
-                Box(
-                    modifier = Modifier
-                        .size(10.dp)
-                        .focusRequester(initialFocus)
-                        .focusTarget()
-                )
+                Box(modifier = Modifier.size(10.dp).focusRequester(initialFocus).focusTarget())
             }
         }
         rule.runOnIdle { initialFocus.requestFocus() }
@@ -334,25 +287,16 @@
         val focusRequester = FocusRequester()
         rule.setFocusableContent {
             Box(
-                modifier = Modifier
-                    .focusRequester(focusRequester)
-                    .focusProperties { canFocus = false }
-                    .focusTarget()
-            ) {
-                Box(
-                    modifier = Modifier
+                modifier =
+                    Modifier.focusRequester(focusRequester)
                         .focusProperties { canFocus = false }
                         .focusTarget()
-                ) {
-                    Box(
-                        modifier = Modifier
-                            .focusProperties { canFocus = false }
-                            .focusTarget()
-                    ) {
+            ) {
+                Box(modifier = Modifier.focusProperties { canFocus = false }.focusTarget()) {
+                    Box(modifier = Modifier.focusProperties { canFocus = false }.focusTarget()) {
                         Box(
-                            modifier = Modifier
-                                .onFocusChanged { childFocusState = it }
-                                .focusTarget()
+                            modifier =
+                                Modifier.onFocusChanged { childFocusState = it }.focusTarget()
                         )
                     }
                 }
@@ -375,16 +319,14 @@
         val focusRequester = FocusRequester()
         rule.setFocusableContent {
             Box(
-                modifier = Modifier
-                    .focusRequester(focusRequester)
-                    .focusProperties { canFocus = false }
-                    .focusTarget()
+                modifier =
+                    Modifier.focusRequester(focusRequester)
+                        .focusProperties { canFocus = false }
+                        .focusTarget()
             ) {
                 Box(
-                    modifier = Modifier
-                        .size(10.dp)
-                        .onFocusChanged { childFocusState = it }
-                        .focusTarget()
+                    modifier =
+                        Modifier.size(10.dp).onFocusChanged { childFocusState = it }.focusTarget()
                 )
             }
         }
@@ -405,20 +347,20 @@
         val focusRequester = FocusRequester()
         rule.setFocusableContent {
             Box(
-                modifier = Modifier
-                    .focusRequester(focusRequester)
-                    .focusProperties {
-                        canFocus = false
-                        @OptIn(ExperimentalComposeUiApi::class)
-                        enter = { FocusRequester.Cancel }
-                    }
-                    .focusTarget()
+                modifier =
+                    Modifier.focusRequester(focusRequester)
+                        .focusProperties {
+                            canFocus = false
+                            @OptIn(ExperimentalComposeUiApi::class)
+                            enter = {
+                                FocusRequester.Cancel
+                            }
+                        }
+                        .focusTarget()
             ) {
                 Box(
-                    modifier = Modifier
-                        .size(10.dp)
-                        .onFocusChanged { childFocusState = it }
-                        .focusTarget()
+                    modifier =
+                        Modifier.size(10.dp).onFocusChanged { childFocusState = it }.focusTarget()
                 )
             }
         }
@@ -439,33 +381,29 @@
         val focusRequester = FocusRequester()
         rule.setFocusableContent {
             Box(
-                modifier = Modifier
-                    .size(10.dp)
-                    .focusRequester(focusRequester)
-                    .focusProperties { canFocus = false }
-                    .focusTarget()
+                modifier =
+                    Modifier.size(10.dp)
+                        .focusRequester(focusRequester)
+                        .focusProperties { canFocus = false }
+                        .focusTarget()
             ) {
                 Box(
-                    modifier = Modifier
-                        .size(10.dp)
-                        .onFocusChanged { childFocusState = it }
-                        .focusTarget()
+                    modifier =
+                        Modifier.size(10.dp).onFocusChanged { childFocusState = it }.focusTarget()
                 )
                 Box(
-                    modifier = Modifier
-                        .size(10.dp)
-                        .focusProperties {
-                            canFocus = false
-                            @OptIn(ExperimentalComposeUiApi::class)
-                            enter = { FocusRequester.Cancel }
-                        }
-                        .focusTarget()
-                ) {
-                    Box(
-                        modifier = Modifier
-                            .size(10.dp)
+                    modifier =
+                        Modifier.size(10.dp)
+                            .focusProperties {
+                                canFocus = false
+                                @OptIn(ExperimentalComposeUiApi::class)
+                                enter = {
+                                    FocusRequester.Cancel
+                                }
+                            }
                             .focusTarget()
-                    )
+                ) {
+                    Box(modifier = Modifier.size(10.dp).focusTarget())
                 }
             }
         }
@@ -486,29 +424,21 @@
         val focusRequester = FocusRequester()
         rule.setFocusableContent {
             Row(
-                modifier = Modifier
-                    .size(100.dp)
-                    .focusRequester(focusRequester)
-                    .focusProperties { canFocus = false }
-                    .focusTarget()
-            ) {
-                Box(
-                    modifier = Modifier
-                        .size(10.dp)
-                        .onFocusChanged { childFocusState = it }
-                        .focusTarget()
-                )
-                Box(
-                    modifier = Modifier
-                        .size(10.dp)
+                modifier =
+                    Modifier.size(100.dp)
+                        .focusRequester(focusRequester)
                         .focusProperties { canFocus = false }
                         .focusTarget()
+            ) {
+                Box(
+                    modifier =
+                        Modifier.size(10.dp).onFocusChanged { childFocusState = it }.focusTarget()
+                )
+                Box(
+                    modifier =
+                        Modifier.size(10.dp).focusProperties { canFocus = false }.focusTarget()
                 ) {
-                    Box(
-                        modifier = Modifier
-                            .size(10.dp)
-                            .focusTarget()
-                    )
+                    Box(modifier = Modifier.size(10.dp).focusTarget())
                 }
             }
         }
@@ -529,30 +459,24 @@
         val focusRequester = FocusRequester()
         rule.setFocusableContent {
             Row(
-                modifier = Modifier
-                    .size(100.dp)
-                    .focusRequester(focusRequester)
-                    .focusProperties { canFocus = false }
-                    .focusTarget()
-            ) {
-                Box(
-                    modifier = Modifier
-                        .size(10.dp)
+                modifier =
+                    Modifier.size(100.dp)
+                        .focusRequester(focusRequester)
                         .focusProperties { canFocus = false }
                         .focusTarget()
+            ) {
+                Box(
+                    modifier =
+                        Modifier.size(10.dp).focusProperties { canFocus = false }.focusTarget()
                 ) {
                     Box(
-                        modifier = Modifier
-                            .size(10.dp)
-                            .onFocusChanged { childFocusState = it }
-                            .focusTarget()
+                        modifier =
+                            Modifier.size(10.dp)
+                                .onFocusChanged { childFocusState = it }
+                                .focusTarget()
                     )
                 }
-                Box(
-                    modifier = Modifier
-                        .size(10.dp)
-                        .focusTarget()
-                )
+                Box(modifier = Modifier.size(10.dp).focusTarget())
             }
         }
 
@@ -575,24 +499,22 @@
         val child2 = FocusRequester()
         rule.setFocusableContent {
             Column(
-                modifier = Modifier
-                    .focusRequester(focusRequester)
-                    .focusProperties { enter = { child2 } }
-                    .focusProperties { canFocus = false }
-                    .focusTarget()
+                modifier =
+                    Modifier.focusRequester(focusRequester)
+                        .focusProperties { enter = { child2 } }
+                        .focusProperties { canFocus = false }
+                        .focusTarget()
             ) {
                 Box(
-                    modifier = Modifier
-                        .size(10.dp)
-                        .onFocusChanged { child1FocusState = it }
-                        .focusTarget()
+                    modifier =
+                        Modifier.size(10.dp).onFocusChanged { child1FocusState = it }.focusTarget()
                 )
                 Box(
-                    modifier = Modifier
-                        .size(10.dp)
-                        .focusRequester(child2)
-                        .onFocusChanged { child2FocusState = it }
-                        .focusTarget()
+                    modifier =
+                        Modifier.size(10.dp)
+                            .focusRequester(child2)
+                            .onFocusChanged { child2FocusState = it }
+                            .focusTarget()
                 )
             }
         }
@@ -617,27 +539,15 @@
         val focusRequester = FocusRequester()
         var showBox1 by mutableStateOf(false)
         rule.setFocusableContent {
-            Column(
-                modifier = Modifier.focusRequester(focusRequester)
-            ) {
+            Column(modifier = Modifier.focusRequester(focusRequester)) {
                 if (showBox1) {
-                    Box(
-                        modifier = Modifier
-                            .onFocusChanged { focusState1 = it }
-                            .focusTarget()
-                    )
+                    Box(modifier = Modifier.onFocusChanged { focusState1 = it }.focusTarget())
                 }
-                Box(
-                    modifier = Modifier
-                        .onFocusChanged { focusState2 = it }
-                        .focusTarget()
-                )
+                Box(modifier = Modifier.onFocusChanged { focusState2 = it }.focusTarget())
             }
         }
 
-        rule.runOnIdle {
-            showBox1 = true
-        }
+        rule.runOnIdle { showBox1 = true }
 
         rule.runOnIdle {
             // Act.
@@ -656,21 +566,9 @@
         lateinit var focusState2: FocusState
         val focusRequester = FocusRequester()
         rule.setFocusableContent {
-            Column(
-                modifier = Modifier.focusRequester(focusRequester)
-            ) {
-                Box {
-                    Box(
-                        modifier = Modifier
-                            .onFocusChanged { focusState1 = it }
-                            .focusTarget()
-                    )
-                }
-                Box(
-                    modifier = Modifier
-                        .onFocusChanged { focusState2 = it }
-                        .focusTarget()
-                )
+            Column(modifier = Modifier.focusRequester(focusRequester)) {
+                Box { Box(modifier = Modifier.onFocusChanged { focusState1 = it }.focusTarget()) }
+                Box(modifier = Modifier.onFocusChanged { focusState2 = it }.focusTarget())
             }
         }
 
@@ -692,19 +590,9 @@
         val (focusRequester1, focusRequester2) = FocusRequester.createRefs()
         rule.setFocusableContent {
             hostView = LocalView.current
-            Column(
-                modifier = Modifier.onFocusChanged { focusState = it }
-            ) {
-                Box(
-                    modifier = Modifier
-                        .focusRequester(focusRequester1)
-                        .focusTarget()
-                )
-                Box(
-                    modifier = Modifier
-                        .focusRequester(focusRequester2)
-                        .focusTarget()
-                )
+            Column(modifier = Modifier.onFocusChanged { focusState = it }) {
+                Box(modifier = Modifier.focusRequester(focusRequester1).focusTarget())
+                Box(modifier = Modifier.focusRequester(focusRequester2).focusTarget())
             }
         }
 
@@ -739,10 +627,12 @@
         return if (modifierNodeVersion) {
             this.modifierNodeFocusRequester(focusRequester)
         } else {
-            composed(debugInspectorInfo {
-                name = "focusRequester"
-                properties["focusRequester"] = focusRequester
-            }) {
+            composed(
+                debugInspectorInfo {
+                    name = "focusRequester"
+                    properties["focusRequester"] = focusRequester
+                }
+            ) {
                 remember(focusRequester) {
                     object : @Suppress("DEPRECATION") FocusRequesterModifier {
                         override val focusRequester: FocusRequester
diff --git a/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/focus/FocusRestorerTest.kt b/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/focus/FocusRestorerTest.kt
index 8c56eb7..9b30c46 100644
--- a/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/focus/FocusRestorerTest.kt
+++ b/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/focus/FocusRestorerTest.kt
@@ -51,8 +51,7 @@
 @MediumTest
 @RunWith(AndroidJUnit4::class)
 class FocusRestorerTest {
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
     @Test
     fun restoresSavedChild() {
@@ -63,25 +62,13 @@
         lateinit var child2State: FocusState
         rule.setFocusableContent {
             focusManager = LocalFocusManager.current
-            Box(
-                Modifier
-                    .size(10.dp)
-                    .focusRequester(parent)
-                    .focusRestorer()
-                    .focusGroup()
-            ) {
+            Box(Modifier.size(10.dp).focusRequester(parent).focusRestorer().focusGroup()) {
                 key(1) {
-                    Box(
-                        Modifier
-                            .size(10.dp)
-                            .onFocusChanged { child1State = it }
-                            .focusTarget()
-                    )
+                    Box(Modifier.size(10.dp).onFocusChanged { child1State = it }.focusTarget())
                 }
                 key(2) {
                     Box(
-                        Modifier
-                            .size(10.dp)
+                        Modifier.size(10.dp)
                             .focusRequester(child2)
                             .onFocusChanged { child2State = it }
                             .focusTarget()
@@ -111,22 +98,10 @@
         lateinit var child2State: FocusState
         rule.setFocusableContent {
             focusManager = LocalFocusManager.current
-            Box(
-                Modifier
-                    .size(10.dp)
-                    .focusRequester(parent)
-                    .focusRestorer()
-                    .focusGroup()
-            ) {
+            Box(Modifier.size(10.dp).focusRequester(parent).focusRestorer().focusGroup()) {
+                Box(Modifier.size(10.dp).onFocusChanged { child1State = it }.focusTarget())
                 Box(
-                    Modifier
-                        .size(10.dp)
-                        .onFocusChanged { child1State = it }
-                        .focusTarget()
-                )
-                Box(
-                    Modifier
-                        .size(10.dp)
+                    Modifier.size(10.dp)
                         .focusRequester(child2)
                         .onFocusChanged { child2State = it }
                         .focusTarget()
@@ -155,22 +130,10 @@
         lateinit var grandChildState: FocusState
         rule.setFocusableContent {
             focusManager = LocalFocusManager.current
-            Box(
-                Modifier
-                    .size(10.dp)
-                    .focusRequester(parent)
-                    .focusRestorer()
-                    .focusGroup()
-            ) {
-                Box(
-                    Modifier
-                        .size(10.dp)
-                        .onFocusChanged { childState = it }
-                        .focusTarget()
-                ) {
+            Box(Modifier.size(10.dp).focusRequester(parent).focusRestorer().focusGroup()) {
+                Box(Modifier.size(10.dp).onFocusChanged { childState = it }.focusTarget()) {
                     Box(
-                        Modifier
-                            .size(10.dp)
+                        Modifier.size(10.dp)
                             .focusRequester(grandChild)
                             .onFocusChanged { grandChildState = it }
                             .focusTarget()
@@ -203,20 +166,10 @@
             lazyListState = rememberLazyListState()
             coroutineScope = rememberCoroutineScope()
             LazyColumn(
-                modifier = Modifier
-                    .size(100.dp)
-                    .focusRequester(parent)
-                    .focusRestorer(),
+                modifier = Modifier.size(100.dp).focusRequester(parent).focusRestorer(),
                 state = lazyListState
             ) {
-                items(100) { item ->
-                    Box(
-                        Modifier
-                            .size(10.dp)
-                            .testTag("item $item")
-                            .focusable()
-                    )
-                }
+                items(100) { item -> Box(Modifier.size(10.dp).testTag("item $item").focusable()) }
             }
         }
 
@@ -225,9 +178,7 @@
             requestFocus()
             assertIsFocused()
         }
-        rule.runOnIdle {
-            coroutineScope.launch { lazyListState.scrollToItem(50) }
-        }
+        rule.runOnIdle { coroutineScope.launch { lazyListState.scrollToItem(50) } }
 
         // Act.
         rule.runOnIdle { focusManager.clearFocus() }
@@ -249,25 +200,13 @@
         lateinit var child1State: FocusState
         lateinit var child2State: FocusState
         rule.setFocusableContent {
-            Box(
-                Modifier
-                    .size(10.dp)
-                    .focusRequester(parent)
-                    .focusRestorer { child2 }
-                    .focusGroup()
-            ) {
+            Box(Modifier.size(10.dp).focusRequester(parent).focusRestorer { child2 }.focusGroup()) {
                 key(1) {
-                    Box(
-                        Modifier
-                            .size(10.dp)
-                            .onFocusChanged { child1State = it }
-                            .focusTarget()
-                    )
+                    Box(Modifier.size(10.dp).onFocusChanged { child1State = it }.focusTarget())
                 }
                 key(2) {
                     Box(
-                        Modifier
-                            .size(10.dp)
+                        Modifier.size(10.dp)
                             .focusRequester(child2)
                             .onFocusChanged { child2State = it }
                             .focusTarget()
diff --git a/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/focus/FocusSearchNonPlacedItemsTest.kt b/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/focus/FocusSearchNonPlacedItemsTest.kt
index 1c65e9d..3484fc7 100644
--- a/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/focus/FocusSearchNonPlacedItemsTest.kt
+++ b/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/focus/FocusSearchNonPlacedItemsTest.kt
@@ -43,8 +43,7 @@
 @MediumTest
 @RunWith(AndroidJUnit4::class)
 class FocusSearchNonPlacedItemsTest {
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
     private lateinit var focusManager: FocusManager
     private val initialFocus: FocusRequester = FocusRequester()
@@ -62,9 +61,7 @@
         }
 
         // Act.
-        rule.runOnIdle {
-            focusManager.moveFocus(FocusDirection.Previous)
-        }
+        rule.runOnIdle { focusManager.moveFocus(FocusDirection.Previous) }
 
         // Assert.
         rule.runOnIdle {
@@ -88,9 +85,7 @@
         }
 
         // Act.
-        rule.runOnIdle {
-            focusManager.moveFocus(FocusDirection.Next)
-        }
+        rule.runOnIdle { focusManager.moveFocus(FocusDirection.Next) }
 
         // Assert.
         rule.runOnIdle {
@@ -114,9 +109,7 @@
         }
 
         // Act.
-        rule.runOnIdle {
-            focusManager.moveFocus(FocusDirection.Left)
-        }
+        rule.runOnIdle { focusManager.moveFocus(FocusDirection.Left) }
 
         // Assert.
         rule.runOnIdle {
@@ -140,9 +133,7 @@
         }
 
         // Act.
-        rule.runOnIdle {
-            focusManager.moveFocus(FocusDirection.Right)
-        }
+        rule.runOnIdle { focusManager.moveFocus(FocusDirection.Right) }
 
         // Assert.
         rule.runOnIdle {
@@ -166,9 +157,7 @@
         }
 
         // Act.
-        rule.runOnIdle {
-            focusManager.moveFocus(FocusDirection.Up)
-        }
+        rule.runOnIdle { focusManager.moveFocus(FocusDirection.Up) }
 
         // Assert.
         rule.runOnIdle {
@@ -192,9 +181,7 @@
         }
 
         // Act.
-        rule.runOnIdle {
-            focusManager.moveFocus(FocusDirection.Down)
-        }
+        rule.runOnIdle { focusManager.moveFocus(FocusDirection.Down) }
 
         // Assert.
         rule.runOnIdle {
@@ -217,10 +204,7 @@
         }
 
         // Act.
-        rule.runOnIdle {
-            @OptIn(ExperimentalComposeUiApi::class)
-            focusManager.moveFocus(Enter)
-        }
+        rule.runOnIdle { @OptIn(ExperimentalComposeUiApi::class) focusManager.moveFocus(Enter) }
 
         // Assert.
         rule.runOnIdle {
@@ -243,9 +227,7 @@
         }
 
         // Act.
-        rule.runOnIdle {
-            focusManager.moveFocus(FocusDirection.Previous)
-        }
+        rule.runOnIdle { focusManager.moveFocus(FocusDirection.Previous) }
 
         // Assert.
         rule.runOnIdle {
@@ -269,9 +251,7 @@
         }
 
         // Act.
-        rule.runOnIdle {
-            focusManager.moveFocus(FocusDirection.Next)
-        }
+        rule.runOnIdle { focusManager.moveFocus(FocusDirection.Next) }
 
         // Assert.
         rule.runOnIdle {
@@ -296,9 +276,7 @@
         }
 
         // Act.
-        rule.runOnIdle {
-            focusManager.moveFocus(FocusDirection.Previous)
-        }
+        rule.runOnIdle { focusManager.moveFocus(FocusDirection.Previous) }
 
         // Assert.
         rule.runOnIdle {
@@ -324,9 +302,7 @@
         }
 
         // Act.
-        rule.runOnIdle {
-            focusManager.moveFocus(FocusDirection.Next)
-        }
+        rule.runOnIdle { focusManager.moveFocus(FocusDirection.Next) }
 
         // Assert.
         rule.runOnIdle {
@@ -352,9 +328,7 @@
         }
 
         // Act.
-        rule.runOnIdle {
-            focusManager.moveFocus(FocusDirection.Left)
-        }
+        rule.runOnIdle { focusManager.moveFocus(FocusDirection.Left) }
 
         // Assert.
         rule.runOnIdle {
@@ -380,9 +354,7 @@
         }
 
         // Act.
-        rule.runOnIdle {
-            focusManager.moveFocus(FocusDirection.Right)
-        }
+        rule.runOnIdle { focusManager.moveFocus(FocusDirection.Right) }
 
         // Assert.
         rule.runOnIdle {
@@ -408,9 +380,7 @@
         }
 
         // Act.
-        rule.runOnIdle {
-            focusManager.moveFocus(FocusDirection.Up)
-        }
+        rule.runOnIdle { focusManager.moveFocus(FocusDirection.Up) }
 
         // Assert.
         rule.runOnIdle {
@@ -436,9 +406,7 @@
         }
 
         // Act.
-        rule.runOnIdle {
-            focusManager.moveFocus(FocusDirection.Down)
-        }
+        rule.runOnIdle { focusManager.moveFocus(FocusDirection.Down) }
 
         // Assert.
         rule.runOnIdle {
@@ -461,12 +429,12 @@
         content: @Composable BoxScope.() -> Unit = {}
     ) {
         Box(
-            modifier = Modifier
-                .offset(x, y)
-                .size(width, height)
-                .focusRequester(focusRequester ?: remember { FocusRequester() })
-                .onFocusChanged { isFocused.value = it.isFocused }
-                .focusTarget(),
+            modifier =
+                Modifier.offset(x, y)
+                    .size(width, height)
+                    .focusRequester(focusRequester ?: remember { FocusRequester() })
+                    .onFocusChanged { isFocused.value = it.isFocused }
+                    .focusTarget(),
             content = content
         )
     }
@@ -480,21 +448,22 @@
     ) {
         Layout(
             content = content,
-            modifier = Modifier
-                .focusRequester(focusRequester ?: remember { FocusRequester() })
-                .onFocusChanged { isFocused.value = it.isFocused }
-                .focusTarget()
+            modifier =
+                Modifier.focusRequester(focusRequester ?: remember { FocusRequester() })
+                    .onFocusChanged { isFocused.value = it.isFocused }
+                    .focusTarget()
         ) { measurables, constraints ->
             var width = 0
             var height = 0
-            val placeables = measurables.map {
-                it.measure(constraints).run {
-                    val offset = IntOffset(width, height)
-                    width += this.width
-                    height = maxOf(height, this.height)
-                    Pair(this, offset)
+            val placeables =
+                measurables.map {
+                    it.measure(constraints).run {
+                        val offset = IntOffset(width, height)
+                        width += this.width
+                        height = maxOf(height, this.height)
+                        Pair(this, offset)
+                    }
                 }
-            }
 
             layout(width, height) {
                 placeables.forEachIndexed { index, placeable ->
@@ -515,21 +484,22 @@
     ) {
         Layout(
             content = content,
-            modifier = Modifier
-                .focusRequester(focusRequester ?: remember { FocusRequester() })
-                .onFocusChanged { isFocused.value = it.isFocused }
-                .focusTarget()
+            modifier =
+                Modifier.focusRequester(focusRequester ?: remember { FocusRequester() })
+                    .onFocusChanged { isFocused.value = it.isFocused }
+                    .focusTarget()
         ) { measurables, constraints ->
             var width = 0
             var height = 0
-            val placeables = measurables.map {
-                it.measure(constraints).run {
-                    val offset = IntOffset(width, height)
-                    width = maxOf(width, this.width)
-                    height += this.height
-                    Pair(this, offset)
+            val placeables =
+                measurables.map {
+                    it.measure(constraints).run {
+                        val offset = IntOffset(width, height)
+                        width = maxOf(width, this.width)
+                        height += this.height
+                        Pair(this, offset)
+                    }
                 }
-            }
 
             layout(width, height) {
                 placeables.forEachIndexed { index, placeable ->
diff --git a/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/focus/FocusTargetAttachDetachTest.kt b/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/focus/FocusTargetAttachDetachTest.kt
index c74b9d6..d14706e 100644
--- a/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/focus/FocusTargetAttachDetachTest.kt
+++ b/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/focus/FocusTargetAttachDetachTest.kt
@@ -56,14 +56,14 @@
 @MediumTest
 @RunWith(AndroidJUnit4::class)
 class FocusTargetAttachDetachTest {
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
     // TODO(b/267253920): Add a compose test API to set/reset InputMode.
     @After
-    fun resetTouchMode() = with(InstrumentationRegistry.getInstrumentation()) {
-        if (SDK_INT < 33) setInTouchMode(true) else resetInTouchMode()
-    }
+    fun resetTouchMode() =
+        with(InstrumentationRegistry.getInstrumentation()) {
+            if (SDK_INT < 33) setInTouchMode(true) else resetInTouchMode()
+        }
 
     @Test
     fun reorderedFocusRequesterModifiers_onFocusChangedInSameModifierChain() {
@@ -78,17 +78,18 @@
             val focusTarget2 = Modifier.focusTarget()
             Box {
                 Box(
-                    modifier = if (observingFocusTarget1) {
-                        onFocusChanged
-                            .then(focusRequesterModifier)
-                            .then(focusTarget1)
-                            .then(focusTarget2)
-                    } else {
-                        focusTarget1
-                            .then(onFocusChanged)
-                            .then(focusRequesterModifier)
-                            .then(focusTarget2)
-                    }
+                    modifier =
+                        if (observingFocusTarget1) {
+                            onFocusChanged
+                                .then(focusRequesterModifier)
+                                .then(focusTarget1)
+                                .then(focusTarget2)
+                        } else {
+                            focusTarget1
+                                .then(onFocusChanged)
+                                .then(focusRequesterModifier)
+                                .then(focusTarget2)
+                        }
                 )
             }
         }
@@ -116,15 +117,12 @@
             val focusTarget = Modifier.focusTarget()
             Box {
                 Box(
-                    modifier = if (onFocusChangedHasFocusTarget) {
-                        onFocusChanged
-                            .then(focusRequesterModifier)
-                            .then(focusTarget)
-                    } else {
-                        focusTarget
-                            .then(onFocusChanged)
-                            .then(focusRequesterModifier)
-                    }
+                    modifier =
+                        if (onFocusChangedHasFocusTarget) {
+                            onFocusChanged.then(focusRequesterModifier).then(focusTarget)
+                        } else {
+                            focusTarget.then(onFocusChanged).then(focusRequesterModifier)
+                        }
                 )
             }
         }
@@ -148,8 +146,7 @@
         var optionalFocusTarget by mutableStateOf(true)
         rule.setFocusableContent {
             Box(
-                Modifier
-                    .onFocusChanged { focusState = it }
+                Modifier.onFocusChanged { focusState = it }
                     .focusRequester(focusRequester)
                     .thenIf(optionalFocusTarget) { Modifier.focusTarget() }
             )
@@ -174,8 +171,7 @@
         var optionalFocusTarget by mutableStateOf(true)
         rule.setFocusableContent {
             Box(
-                Modifier
-                    .onFocusChanged { focusState = it }
+                Modifier.onFocusChanged { focusState = it }
                     .focusRequester(focusRequester)
                     .thenIf(optionalFocusTarget) { Modifier.focusTarget() }
             ) {
@@ -202,13 +198,9 @@
         var optionalModifiers by mutableStateOf(true)
         rule.setFocusableContent {
             Box(
-                Modifier
-                    .focusRequester(focusRequester)
-                    .thenIf(optionalModifiers) {
-                        Modifier
-                            .onFocusEvent { focusState = it }
-                            .focusTarget()
-                    }
+                Modifier.focusRequester(focusRequester).thenIf(optionalModifiers) {
+                    Modifier.onFocusEvent { focusState = it }.focusTarget()
+                }
             )
         }
         rule.runOnIdle {
@@ -232,8 +224,7 @@
         rule.setFocusableContent {
             if (optionalBox) {
                 Box(
-                    Modifier
-                        .focusRequester(focusRequester)
+                    Modifier.focusRequester(focusRequester)
                         .onFocusEvent { focusState = it }
                         .focusTarget()
                 )
@@ -259,8 +250,7 @@
         var optionalFocusTarget by mutableStateOf(true)
         rule.setFocusableContent {
             Box(
-                Modifier
-                    .onFocusChanged { focusState = it }
+                Modifier.onFocusChanged { focusState = it }
                     .focusRequester(focusRequester)
                     .thenIf(optionalFocusTarget) { Modifier.focusTarget() }
             ) {
@@ -288,15 +278,10 @@
         var optionalFocusTarget by mutableStateOf(true)
         rule.setFocusableContent {
             Box(
-                Modifier
-                    .onFocusChanged { focusState = it }
+                Modifier.onFocusChanged { focusState = it }
                     .thenIf(optionalFocusTarget) { Modifier.focusTarget() }
             ) {
-                Box(
-                    Modifier
-                        .focusRequester(focusRequester)
-                        .focusTarget()
-                )
+                Box(Modifier.focusRequester(focusRequester).focusTarget())
             }
         }
         rule.runOnIdle {
@@ -323,13 +308,9 @@
         var optionalFocusTarget by mutableStateOf(true)
         rule.setFocusableContent {
             Box(
-                Modifier
-                    .onFocusChanged { focusState = it }
+                Modifier.onFocusChanged { focusState = it }
                     .thenIf(optionalFocusTarget) {
-                        Modifier
-                            .focusTarget()
-                            .focusRequester(focusRequester)
-                            .focusTarget()
+                        Modifier.focusTarget().focusRequester(focusRequester).focusTarget()
                     }
             )
         }
@@ -353,19 +334,11 @@
         val focusRequester = FocusRequester()
         var optionalFocusTargets by mutableStateOf(true)
         rule.setFocusableContent {
-            Box(
-                Modifier
-                    .onFocusChanged { parentFocusState = it }
-                    .focusTarget()
-            ) {
+            Box(Modifier.onFocusChanged { parentFocusState = it }.focusTarget()) {
                 Box(
-                    Modifier
-                        .onFocusChanged { focusState = it }
+                    Modifier.onFocusChanged { focusState = it }
                         .thenIf(optionalFocusTargets) {
-                            Modifier
-                                .focusTarget()
-                                .focusRequester(focusRequester)
-                                .focusTarget()
+                            Modifier.focusTarget().focusRequester(focusRequester).focusTarget()
                         }
                 )
             }
@@ -394,15 +367,10 @@
         val focusRequester = FocusRequester()
         var optionalBox by mutableStateOf(true)
         rule.setFocusableContent {
-            Box(
-                Modifier
-                    .onFocusChanged { parentFocusState = it }
-                    .focusTarget()
-            ) {
+            Box(Modifier.onFocusChanged { parentFocusState = it }.focusTarget()) {
                 if (optionalBox) {
                     Box(
-                        Modifier
-                            .onFocusChanged { focusState = it }
+                        Modifier.onFocusChanged { focusState = it }
                             .focusRequester(focusRequester)
                             .focusTarget()
                     )
@@ -433,19 +401,12 @@
         var optionalFocusTarget by mutableStateOf(true)
         rule.setFocusableContent {
             Box(
-                Modifier
-                    .onFocusChanged { focusState = it }
+                Modifier.onFocusChanged { focusState = it }
                     .thenIf(optionalFocusTarget) {
-                        Modifier
-                            .focusProperties { canFocus = false }
-                            .focusTarget()
+                        Modifier.focusProperties { canFocus = false }.focusTarget()
                     }
             ) {
-                Box(
-                    Modifier
-                        .focusRequester(focusRequester)
-                        .focusTarget()
-                )
+                Box(Modifier.focusRequester(focusRequester).focusTarget())
             }
         }
         rule.runOnIdle {
@@ -458,9 +419,7 @@
         rule.runOnIdle { optionalFocusTarget = false }
 
         // Assert.
-        rule.runOnIdle {
-            assertThat(focusState.isFocused).isTrue()
-        }
+        rule.runOnIdle { assertThat(focusState.isFocused).isTrue() }
     }
 
     @Test
@@ -471,25 +430,17 @@
         var optionalFocusTarget by mutableStateOf(true)
         rule.setFocusableContent {
             Box(
-                Modifier
-                    .onFocusChanged { focusState = it }
+                Modifier.onFocusChanged { focusState = it }
                     .thenIf(optionalFocusTarget) {
-                        Modifier
-                            .focusProperties { canFocus = false }
-                            .focusTarget()
+                        Modifier.focusProperties { canFocus = false }.focusTarget()
                     }
             ) {
                 Box(
-                    Modifier
-                        .onFocusChanged { focusState = it }
+                    Modifier.onFocusChanged { focusState = it }
                         .focusProperties { canFocus = false }
                         .focusTarget()
                 ) {
-                    Box(
-                        Modifier
-                            .focusRequester(focusRequester)
-                            .focusTarget()
-                    )
+                    Box(Modifier.focusRequester(focusRequester).focusTarget())
                 }
             }
         }
@@ -516,23 +467,16 @@
         var optionalFocusTarget by mutableStateOf(true)
         rule.setFocusableContent {
             Box(
-                Modifier
-                    .onFocusChanged { focusState = it }
+                Modifier.onFocusChanged { focusState = it }
                     .focusProperties { canFocus = false }
                     .focusTarget()
             ) {
                 Box(
                     Modifier.thenIf(optionalFocusTarget) {
-                        Modifier
-                            .focusProperties { canFocus = false }
-                            .focusTarget()
+                        Modifier.focusProperties { canFocus = false }.focusTarget()
                     }
                 ) {
-                    Box(
-                        Modifier
-                            .focusRequester(focusRequester)
-                            .focusTarget()
-                    )
+                    Box(Modifier.focusRequester(focusRequester).focusTarget())
                 }
             }
         }
@@ -560,22 +504,19 @@
         var optionalFocusTarget by mutableStateOf(true)
         rule.setFocusableContent {
             Box(
-                Modifier
-                    .onFocusChanged { focusState = it }
+                Modifier.onFocusChanged { focusState = it }
                     .focusProperties { canFocus = false }
                     .focusTarget()
             ) {
                 Box(
                     Modifier.thenIf(optionalFocusTarget) {
-                        Modifier
-                            .focusProperties { canFocus = false }
-                            .focusTarget()
-                        }
+                        Modifier.focusProperties { canFocus = false }.focusTarget()
+                    }
                 ) {
                     Box(
-                        Modifier
-                            .focusRequester(focusRequester)
-                            .thenIf(optionalFocusTarget) { Modifier.focusTarget() }
+                        Modifier.focusRequester(focusRequester).thenIf(optionalFocusTarget) {
+                            Modifier.focusTarget()
+                        }
                     )
                 }
             }
@@ -602,22 +543,16 @@
         val focusRequester = FocusRequester()
         var optionalFocusTarget by mutableStateOf(true)
         rule.setFocusableContent {
-            Box(
-                Modifier
-                    .onFocusChanged { focusState = it }
-                    .focusTarget()
-            ) {
+            Box(Modifier.onFocusChanged { focusState = it }.focusTarget()) {
                 Box(
                     Modifier.thenIf(optionalFocusTarget) {
-                        Modifier
-                            .focusProperties { canFocus = false }
-                            .focusTarget()
+                        Modifier.focusProperties { canFocus = false }.focusTarget()
                     }
                 ) {
                     Box(
-                        Modifier
-                            .focusRequester(focusRequester)
-                            .thenIf(optionalFocusTarget) { Modifier.focusTarget() }
+                        Modifier.focusRequester(focusRequester).thenIf(optionalFocusTarget) {
+                            Modifier.focusTarget()
+                        }
                     )
                 }
             }
@@ -645,8 +580,7 @@
         var optionalFocusTarget by mutableStateOf(true)
         rule.setFocusableContent {
             Box(
-                Modifier
-                    .onFocusChanged { focusState = it }
+                Modifier.onFocusChanged { focusState = it }
                     .thenIf(optionalFocusTarget) { Modifier.focusTarget() }
                     .focusRequester(focusRequester)
                     .focusTarget()
@@ -669,8 +603,7 @@
         var addFocusTarget by mutableStateOf(false)
         rule.setFocusableContent {
             Box(
-                Modifier
-                    .onFocusChanged { focusState = it }
+                Modifier.onFocusChanged { focusState = it }
                     .focusRequester(focusRequester)
                     .thenIf(addFocusTarget) { Modifier.focusTarget() }
             ) {
@@ -697,8 +630,7 @@
         var addFocusTarget by mutableStateOf(false)
         rule.setFocusableContent {
             Box(
-                Modifier
-                    .onFocusChanged { focusState = it }
+                Modifier.onFocusChanged { focusState = it }
                     .focusRequester(focusRequester)
                     .thenIf(addFocusTarget) { Modifier.focusTarget() }
             )
@@ -723,19 +655,14 @@
         var addFocusTarget by mutableStateOf(false)
         rule.setFocusableContent {
             Box(
-                Modifier
-                    .thenIf(addFocusTarget) {
-                        Modifier
-                            .onFocusChanged { focusState = it }
-                            .focusTarget()
+                Modifier.thenIf(addFocusTarget) {
+                        Modifier.onFocusChanged { focusState = it }.focusTarget()
                     }
                     .focusRequester(focusRequester)
                     .focusTarget()
             )
         }
-        rule.runOnIdle {
-            focusRequester.requestFocus()
-        }
+        rule.runOnIdle { focusRequester.requestFocus() }
 
         // Act.
         rule.runOnIdle { addFocusTarget = true }
@@ -753,17 +680,13 @@
         rule.setFocusableContent {
             Box(
                 Modifier.thenIf(addFocusTarget) {
-                    Modifier
-                        .onFocusChanged { focusState = it }
-                        .focusTarget()
+                    Modifier.onFocusChanged { focusState = it }.focusTarget()
                 }
             ) {
                 Box(Modifier.focusRequester(focusRequester).focusTarget())
             }
         }
-        rule.runOnIdle {
-            focusRequester.requestFocus()
-        }
+        rule.runOnIdle { focusRequester.requestFocus() }
 
         // Act.
         rule.runOnIdle { addFocusTarget = true }
@@ -782,24 +705,17 @@
         var addFocusTarget2 by mutableStateOf(false)
         rule.setFocusableContent {
             Box(
-                Modifier
-                    .thenIf(addFocusTarget1) {
-                        Modifier
-                            .onFocusChanged { focusState1 = it }
-                            .focusTarget()
+                Modifier.thenIf(addFocusTarget1) {
+                        Modifier.onFocusChanged { focusState1 = it }.focusTarget()
                     }
                     .thenIf(addFocusTarget2) {
-                        Modifier
-                            .onFocusChanged { focusState2 = it }
-                            .focusTarget()
+                        Modifier.onFocusChanged { focusState2 = it }.focusTarget()
                     }
                     .focusRequester(focusRequester)
                     .focusTarget()
             )
         }
-        rule.runOnIdle {
-            focusRequester.requestFocus()
-        }
+        rule.runOnIdle { focusRequester.requestFocus() }
 
         // Act.
         rule.runOnIdle {
@@ -825,29 +741,19 @@
         rule.setFocusableContent {
             Box(
                 Modifier.thenIf(addFocusTarget1) {
-                    Modifier
-                        .onFocusChanged { focusState1 = it }
-                        .focusTarget()
-                    }
+                    Modifier.onFocusChanged { focusState1 = it }.focusTarget()
+                }
             ) {
                 Box(
                     Modifier.thenIf(addFocusTarget1) {
-                        Modifier
-                            .onFocusChanged { focusState2 = it }
-                            .focusTarget()
+                        Modifier.onFocusChanged { focusState2 = it }.focusTarget()
                     }
                 ) {
-                    Box(
-                        Modifier
-                            .focusRequester(focusRequester)
-                            .focusTarget()
-                    )
+                    Box(Modifier.focusRequester(focusRequester).focusTarget())
                 }
             }
         }
-        rule.runOnIdle {
-            focusRequester.requestFocus()
-        }
+        rule.runOnIdle { focusRequester.requestFocus() }
 
         // Act.
         rule.runOnIdle {
@@ -870,11 +776,8 @@
         var addFocusTarget by mutableStateOf(false)
         rule.setFocusableContent {
             Box(
-                Modifier
-                    .thenIf(addFocusTarget) {
-                        Modifier
-                            .onFocusChanged { focusState = it }
-                            .focusTarget()
+                Modifier.thenIf(addFocusTarget) {
+                        Modifier.onFocusChanged { focusState = it }.focusTarget()
                     }
                     .focusRequester(focusRequester)
                     .focusTarget()
@@ -900,18 +803,11 @@
         var addFocusTarget by mutableStateOf(false)
         rule.setFocusableContent {
             Box(
-                Modifier
-                    .thenIf(addFocusTarget) {
-                        Modifier
-                            .onFocusChanged { focusState = it }
-                            .focusTarget()
-                    }
+                Modifier.thenIf(addFocusTarget) {
+                    Modifier.onFocusChanged { focusState = it }.focusTarget()
+                }
             ) {
-                Box(
-                    Modifier
-                        .focusRequester(focusRequester)
-                        .focusTarget()
-                )
+                Box(Modifier.focusRequester(focusRequester).focusTarget())
             }
         }
         rule.runOnIdle {
@@ -933,12 +829,9 @@
         var removeDeactivatedItem by mutableStateOf(false)
         rule.setFocusableContent {
             Box(
-                Modifier
-                    .onFocusChanged { focusState = it }
+                Modifier.onFocusChanged { focusState = it }
                     .thenIf(!removeDeactivatedItem) {
-                        Modifier
-                            .focusProperties { canFocus = false }
-                            .focusTarget()
+                        Modifier.focusProperties { canFocus = false }.focusTarget()
                     }
             )
         }
@@ -947,9 +840,7 @@
         rule.runOnIdle { removeDeactivatedItem = true }
 
         // Assert.
-        rule.runOnIdle {
-            assertThat(focusState.isFocused).isFalse()
-        }
+        rule.runOnIdle { assertThat(focusState.isFocused).isFalse() }
     }
 
     fun removingDeactivatedItem_withInactiveNextFocusTarget() {
@@ -958,12 +849,9 @@
         var removeDeactivatedItem by mutableStateOf(false)
         rule.setFocusableContent {
             Box(
-                Modifier
-                    .onFocusChanged { focusState = it }
+                Modifier.onFocusChanged { focusState = it }
                     .thenIf(!removeDeactivatedItem) {
-                        Modifier
-                            .focusProperties { canFocus = false }
-                            .focusTarget()
+                        Modifier.focusProperties { canFocus = false }.focusTarget()
                     }
             ) {
                 Box(Modifier.focusTarget())
@@ -974,9 +862,7 @@
         rule.runOnIdle { removeDeactivatedItem = true }
 
         // Assert.
-        rule.runOnIdle {
-            assertThat(focusState.isFocused).isFalse()
-        }
+        rule.runOnIdle { assertThat(focusState.isFocused).isFalse() }
     }
 
     @Test
@@ -986,18 +872,12 @@
         var removeDeactivatedItem by mutableStateOf(false)
         rule.setFocusableContent {
             Box(
-                Modifier
-                    .onFocusChanged { focusState = it }
+                Modifier.onFocusChanged { focusState = it }
                     .thenIf(!removeDeactivatedItem) {
-                        Modifier
-                            .focusProperties { canFocus = false }
-                            .focusTarget()
-                        }
+                        Modifier.focusProperties { canFocus = false }.focusTarget()
+                    }
             ) {
-                Box(Modifier
-                    .focusProperties { canFocus = false }
-                    .focusTarget()
-                )
+                Box(Modifier.focusProperties { canFocus = false }.focusTarget())
             }
         }
 
@@ -1005,9 +885,7 @@
         rule.runOnIdle { removeDeactivatedItem = true }
 
         // Assert.
-        rule.runOnIdle {
-            assertThat(focusState.isFocused).isFalse()
-        }
+        rule.runOnIdle { assertThat(focusState.isFocused).isFalse() }
     }
 
     @OptIn(ExperimentalComposeUiApi::class, ExperimentalTestApi::class)
@@ -1039,10 +917,10 @@
         rule.setFocusableContent(extraItemForInitialFocus = false) {
             inputModeManager = LocalInputModeManager.current
             Box(
-                modifier = Modifier
-                    .testTag(targetTestTag)
-                    .focusRequester(focusRequester)
-                    .then(focusTargetAndKeyInputModifier)
+                modifier =
+                    Modifier.testTag(targetTestTag)
+                        .focusRequester(focusRequester)
+                        .then(focusTargetAndKeyInputModifier)
             )
         }
 
@@ -1065,14 +943,15 @@
         class FocusTargetAndKeyInputNode : DelegatingNode() {
             val keyEvents = mutableListOf<KeyEvent>()
             val focusTargetNode = FocusTargetNode()
-            val keyInputNode = object : KeyInputModifierNode, Modifier.Node() {
-                override fun onKeyEvent(event: KeyEvent): Boolean {
-                    keyEvents.add(event)
-                    return true
-                }
+            val keyInputNode =
+                object : KeyInputModifierNode, Modifier.Node() {
+                    override fun onKeyEvent(event: KeyEvent): Boolean {
+                        keyEvents.add(event)
+                        return true
+                    }
 
-                override fun onPreKeyEvent(event: KeyEvent) = false
-            }
+                    override fun onPreKeyEvent(event: KeyEvent) = false
+                }
 
             init {
                 delegate(focusTargetNode)
@@ -1090,10 +969,10 @@
         rule.setFocusableContent(extraItemForInitialFocus = false) {
             inputModeManager = LocalInputModeManager.current
             Box(
-                modifier = Modifier
-                    .testTag(targetTestTag)
-                    .focusRequester(focusRequester)
-                    .then(focusTargetAndKeyInputModifier)
+                modifier =
+                    Modifier.testTag(targetTestTag)
+                        .focusRequester(focusRequester)
+                        .then(focusTargetAndKeyInputModifier)
             )
         }
 
@@ -1113,8 +992,8 @@
     @OptIn(ExperimentalComposeUiApi::class)
     @Test
     fun focusTarget_nodeThatIsSoftKeyInputNodeKind_implementing_receivesSoftKeyEventsWhenFocused() {
-        class FocusTargetAndSoftKeyboardNode : DelegatingNode(),
-            SoftKeyboardInterceptionModifierNode {
+        class FocusTargetAndSoftKeyboardNode :
+            DelegatingNode(), SoftKeyboardInterceptionModifierNode {
             val keyEvents = mutableListOf<KeyEvent>()
             val focusTargetNode = FocusTargetNode()
 
@@ -1136,10 +1015,10 @@
 
         rule.setFocusableContent(extraItemForInitialFocus = false) {
             Box(
-                modifier = Modifier
-                    .testTag(targetTestTag)
-                    .focusRequester(focusRequester)
-                    .then(focusTargetAndSoftKeyboardModifier)
+                modifier =
+                    Modifier.testTag(targetTestTag)
+                        .focusRequester(focusRequester)
+                        .then(focusTargetAndSoftKeyboardModifier)
             )
         }
 
@@ -1150,14 +1029,16 @@
         // sendKeyEvent, which in turn notifies FocusOwner that there's a
         // SoftKeyboardInterceptionModifierNode-interceptable key event first. performKeyInput goes
         // through dispatchKeyEvent which does not notify SoftKeyboardInterceptionModifierNodes.
-        rule.onRoot().performKeyPress(
-            KeyEvent(
-                NativeKeyEvent(
-                    android.view.KeyEvent.ACTION_DOWN,
-                    android.view.KeyEvent.KEYCODE_ENTER
+        rule
+            .onRoot()
+            .performKeyPress(
+                KeyEvent(
+                    NativeKeyEvent(
+                        android.view.KeyEvent.ACTION_DOWN,
+                        android.view.KeyEvent.KEYCODE_ENTER
+                    )
                 )
             )
-        )
 
         assertThat(focusTargetAndSoftKeyboardNode.keyEvents).hasSize(1)
         assertThat(focusTargetAndSoftKeyboardNode.keyEvents[0].key).isEqualTo(Key.Enter)
@@ -1169,13 +1050,13 @@
         class FocusTargetAndSoftKeyboardNode : DelegatingNode() {
             val keyEvents = mutableListOf<KeyEvent>()
             val focusTargetNode = FocusTargetNode()
-            val softKeyboardInterceptionNode = object : SoftKeyboardInterceptionModifierNode,
-                Modifier.Node() {
-                override fun onInterceptKeyBeforeSoftKeyboard(event: KeyEvent) =
-                    keyEvents.add(event)
+            val softKeyboardInterceptionNode =
+                object : SoftKeyboardInterceptionModifierNode, Modifier.Node() {
+                    override fun onInterceptKeyBeforeSoftKeyboard(event: KeyEvent) =
+                        keyEvents.add(event)
 
-                override fun onPreInterceptKeyBeforeSoftKeyboard(event: KeyEvent) = false
-            }
+                    override fun onPreInterceptKeyBeforeSoftKeyboard(event: KeyEvent) = false
+                }
 
             init {
                 delegate(focusTargetNode)
@@ -1192,10 +1073,10 @@
 
         rule.setFocusableContent(extraItemForInitialFocus = false) {
             Box(
-                modifier = Modifier
-                    .testTag(targetTestTag)
-                    .focusRequester(focusRequester)
-                    .then(focusTargetAndSoftKeyboardModifier)
+                modifier =
+                    Modifier.testTag(targetTestTag)
+                        .focusRequester(focusRequester)
+                        .then(focusTargetAndSoftKeyboardModifier)
             )
         }
 
@@ -1206,14 +1087,16 @@
         // sendKeyEvent, which in turn notifies FocusOwner that there's a
         // SoftKeyboardInterceptionModifierNode-interceptable key event first. performKeyInput goes
         // through dispatchKeyEvent which does not notify SoftKeyboardInterceptionModifierNodes.
-        rule.onRoot().performKeyPress(
-            KeyEvent(
-                NativeKeyEvent(
-                    android.view.KeyEvent.ACTION_DOWN,
-                    android.view.KeyEvent.KEYCODE_ENTER
+        rule
+            .onRoot()
+            .performKeyPress(
+                KeyEvent(
+                    NativeKeyEvent(
+                        android.view.KeyEvent.ACTION_DOWN,
+                        android.view.KeyEvent.KEYCODE_ENTER
+                    )
                 )
             )
-        )
 
         assertThat(focusTargetAndSoftKeyboardNode.keyEvents).hasSize(1)
         assertThat(focusTargetAndSoftKeyboardNode.keyEvents[0].key).isEqualTo(Key.Enter)
@@ -1243,10 +1126,10 @@
 
         rule.setFocusableContent(extraItemForInitialFocus = false) {
             Box(
-                modifier = Modifier
-                    .testTag(targetTestTag)
-                    .focusRequester(focusRequester)
-                    .then(focusTargetAndRotaryModifier)
+                modifier =
+                    Modifier.testTag(targetTestTag)
+                        .focusRequester(focusRequester)
+                        .then(focusTargetAndRotaryModifier)
             )
         }
 
@@ -1267,10 +1150,12 @@
         class FocusTargetAndRotaryNode : DelegatingNode() {
             val events = mutableListOf<RotaryScrollEvent>()
             val focusTargetNode = FocusTargetNode()
-            val rotaryInputNode = object : RotaryInputModifierNode, Modifier.Node() {
-                override fun onRotaryScrollEvent(event: RotaryScrollEvent) = events.add(event)
-                override fun onPreRotaryScrollEvent(event: RotaryScrollEvent) = false
-            }
+            val rotaryInputNode =
+                object : RotaryInputModifierNode, Modifier.Node() {
+                    override fun onRotaryScrollEvent(event: RotaryScrollEvent) = events.add(event)
+
+                    override fun onPreRotaryScrollEvent(event: RotaryScrollEvent) = false
+                }
 
             init {
                 delegate(focusTargetNode)
@@ -1286,10 +1171,10 @@
 
         rule.setFocusableContent(extraItemForInitialFocus = false) {
             Box(
-                modifier = Modifier
-                    .testTag(targetTestTag)
-                    .focusRequester(focusRequester)
-                    .then(focusTargetAndRotaryModifier)
+                modifier =
+                    Modifier.testTag(targetTestTag)
+                        .focusRequester(focusRequester)
+                        .then(focusTargetAndRotaryModifier)
             )
         }
 
@@ -1315,9 +1200,11 @@
 
         class FocusEventAndFocusTargetNode : DelegatingNode(), FocusEventModifierNode {
             val focusStates = mutableListOf<FocusState>()
+
             override fun onFocusEvent(focusState: FocusState) {
                 focusStates.add(focusState)
             }
+
             init {
                 delegate(focusTargetNode)
             }
@@ -1331,9 +1218,9 @@
         rule.setFocusableContent(extraItemForInitialFocus = false) {
             if (composeFocusableBox) {
                 Box(
-                    modifier = Modifier
-                        .focusRequester(focusRequester)
-                        .then(focusEventAndFocusTargetModifier)
+                    modifier =
+                        Modifier.focusRequester(focusRequester)
+                            .then(focusEventAndFocusTargetModifier)
                 )
             }
         }
@@ -1363,6 +1250,7 @@
 
         class MyFocusEventNode : Modifier.Node(), FocusEventModifierNode {
             val focusStates = mutableListOf<FocusState>()
+
             override fun onFocusEvent(focusState: FocusState) {
                 focusStates.add(focusState)
             }
@@ -1385,9 +1273,10 @@
 
         rule.setFocusableContent(extraItemForInitialFocus = false) {
             if (composeFocusableBox) {
-                Box(modifier = Modifier
-                    .focusRequester(focusRequester)
-                    .then(focusEventAndFocusTargetModifier)
+                Box(
+                    modifier =
+                        Modifier.focusRequester(focusRequester)
+                            .then(focusEventAndFocusTargetModifier)
                 )
             }
         }
diff --git a/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/focus/FocusTestUtils.kt b/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/focus/FocusTestUtils.kt
index 3585a5e..f4bae11 100644
--- a/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/focus/FocusTestUtils.kt
+++ b/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/focus/FocusTestUtils.kt
@@ -42,10 +42,10 @@
  * [View.requestFocus()][android.view.View.requestFocus] will not take focus if the view has no
  * size.
  *
- * @param extraItemForInitialFocus Includes an extra item that takes focus initially. This is
- * useful in cases where we need tests that could be affected by initial focus. Eg. When there is
- * only one focusable item and we clear focus, that item could end up being focused on again by the
- * initial focus logic.
+ * @param extraItemForInitialFocus Includes an extra item that takes focus initially. This is useful
+ *   in cases where we need tests that could be affected by initial focus. Eg. When there is only
+ *   one focusable item and we clear focus, that item could end up being focused on again by the
+ *   initial focus logic.
  */
 internal fun ComposeContentTestRule.setFocusableContent(
     extraItemForInitialFocus: Boolean = true,
@@ -81,22 +81,24 @@
 ) {
     Layout(
         content = content,
-        modifier = modifier
-            .offset { IntOffset(x, y) }
-            .focusRequester(focusRequester ?: remember { FocusRequester() })
-            .onFocusChanged { isFocused.value = it.isFocused }
-            .focusProperties { canFocus = !deactivated }
-            .focusTarget(),
-        measurePolicy = remember(width, height) {
-            MeasurePolicy { measurableList, constraint ->
-                layout(width, height) {
-                    measurableList.forEach {
-                        val placeable = it.measure(constraint)
-                        placeable.placeRelative(0, 0)
+        modifier =
+            modifier
+                .offset { IntOffset(x, y) }
+                .focusRequester(focusRequester ?: remember { FocusRequester() })
+                .onFocusChanged { isFocused.value = it.isFocused }
+                .focusProperties { canFocus = !deactivated }
+                .focusTarget(),
+        measurePolicy =
+            remember(width, height) {
+                MeasurePolicy { measurableList, constraint ->
+                    layout(width, height) {
+                        measurableList.forEach {
+                            val placeable = it.measure(constraint)
+                            placeable.placeRelative(0, 0)
+                        }
                     }
                 }
             }
-        }
     )
 }
 
@@ -104,8 +106,8 @@
  * Asserts that the elements appear in the specified order.
  *
  * Consider using this helper function instead of
- * [containsExactlyElementsIn][com.google.common.truth.IterableSubject.containsExactlyElementsIn]
- * or [containsExactly][com.google.common.truth.IterableSubject.containsExactly] as it also asserts
+ * [containsExactlyElementsIn][com.google.common.truth.IterableSubject.containsExactlyElementsIn] or
+ * [containsExactly][com.google.common.truth.IterableSubject.containsExactly] as it also asserts
  * that the elements are in the specified order.
  */
 fun IterableSubject.isExactly(vararg expected: Any?) {
@@ -123,10 +125,5 @@
 
 @Composable
 fun FocusableComponent(tag: String? = null) {
-    Box(
-        Modifier
-            .then(if (tag != null) Modifier.testTag(tag) else Modifier)
-            .size(50.dp)
-            .focusable()
-    )
+    Box(Modifier.then(if (tag != null) Modifier.testTag(tag) else Modifier).size(50.dp).focusable())
 }
diff --git a/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/focus/FocusTransactionsTest.kt b/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/focus/FocusTransactionsTest.kt
index 1d562d0..1f1e2ad 100644
--- a/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/focus/FocusTransactionsTest.kt
+++ b/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/focus/FocusTransactionsTest.kt
@@ -44,8 +44,7 @@
 @MediumTest
 @RunWith(AndroidJUnit4::class)
 class FocusTransactionsTest {
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
     @OptIn(ExperimentalComposeUiApi::class)
     @Test
@@ -56,8 +55,7 @@
         var requestingFocusOnItem2 = false
         rule.setFocusableContent {
             Box(
-                Modifier
-                    .focusRequester(item1)
+                Modifier.focusRequester(item1)
                     .onFocusChanged {
                         item1Focused = it.isFocused
                         if (!item1Focused && requestingFocusOnItem2) {
@@ -71,8 +69,7 @@
                     .focusTarget()
             )
             Box(
-                Modifier
-                    .focusRequester(item2)
+                Modifier.focusRequester(item2)
                     .onFocusChanged { item2Focused = it.isFocused }
                     .focusTarget()
             )
@@ -100,8 +97,7 @@
         var (item1Focused, item2Focused) = List(2) { false }
         rule.setFocusableContent {
             Box(
-                Modifier
-                    .focusRequester(item1)
+                Modifier.focusRequester(item1)
                     .onFocusChanged {
                         item1Focused = it.isFocused
                         if (item1Focused) item2.requestFocus()
@@ -109,8 +105,7 @@
                     .focusTarget()
             )
             Box(
-                Modifier
-                    .focusRequester(item2)
+                Modifier.focusRequester(item2)
                     .onFocusChanged { item2Focused = it.isFocused }
                     .focusTarget()
             )
@@ -142,8 +137,7 @@
             inputModeManager = LocalInputModeManager.current
             view = LocalView.current
             Box(
-                Modifier
-                    .size(10.dp)
+                Modifier.size(10.dp)
                     .focusRequester(box)
                     .onFocusChanged { focusState1 = it }
                     .onFocusChanged {
@@ -156,9 +150,7 @@
         }
 
         // Act.
-        rule.runOnUiThread {
-            box.requestFocus()
-        }
+        rule.runOnUiThread { box.requestFocus() }
 
         // Assert.
         rule.runOnIdle {
@@ -190,25 +182,13 @@
         val focusRequester = FocusRequester()
         rule.setFocusableContent {
             view = LocalView.current
-            Box(
-                Modifier
-                    .focusProperties {
-                        enter = { Cancel }
-                    }
-                    .focusTarget()
-            ) {
-                Box(
-                    Modifier
-                        .focusRequester(focusRequester)
-                        .focusTarget()
-                )
+            Box(Modifier.focusProperties { enter = { Cancel } }.focusTarget()) {
+                Box(Modifier.focusRequester(focusRequester).focusTarget())
             }
         }
 
         // Act.
-        rule.runOnIdle {
-            focusRequester.requestFocus()
-        }
+        rule.runOnIdle { focusRequester.requestFocus() }
 
         // Assert.
         rule.runOnIdle {
@@ -229,9 +209,7 @@
         }
 
         // Act.
-        rule.runOnIdle {
-            view.requestFocus()
-        }
+        rule.runOnIdle { view.requestFocus() }
 
         // Assert.
         val root = view as AndroidComposeView
diff --git a/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/focus/FocusViewInteropTest.kt b/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/focus/FocusViewInteropTest.kt
index 125adfd..159e068 100644
--- a/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/focus/FocusViewInteropTest.kt
+++ b/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/focus/FocusViewInteropTest.kt
@@ -45,8 +45,7 @@
 @RunWith(AndroidJUnit4::class)
 class FocusViewInteropTest {
 
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
     @Test
     fun getFocusedRect_reportsFocusBounds_whenFocused() {
@@ -57,8 +56,7 @@
             view = LocalView.current
             CompositionLocalProvider(LocalDensity provides Density(density = 1f)) {
                 Box(
-                    Modifier
-                        .size(90.dp, 100.dp)
+                    Modifier.size(90.dp, 100.dp)
                         .wrapContentSize(align = Alignment.TopStart)
                         .size(10.dp, 20.dp)
                         .offset(30.dp, 40.dp)
@@ -72,9 +70,7 @@
                 )
             }
         }
-        rule.runOnIdle {
-            focusRequester.requestFocus()
-        }
+        rule.runOnIdle { focusRequester.requestFocus() }
 
         rule.waitUntil { hasFocus }
 
@@ -88,8 +84,7 @@
             view = LocalView.current
             CompositionLocalProvider(LocalDensity provides Density(density = 1f)) {
                 Box(
-                    Modifier
-                        .size(90.dp, 100.dp)
+                    Modifier.size(90.dp, 100.dp)
                         .wrapContentSize(align = Alignment.TopStart)
                         .size(10.dp, 20.dp)
                         .offset(30.dp, 40.dp)
@@ -98,9 +93,7 @@
             }
         }
 
-        assertThat(view.getFocusedRect()).isEqualTo(
-            IntRect(0, 0, 90, 100)
-        )
+        assertThat(view.getFocusedRect()).isEqualTo(IntRect(0, 0, 90, 100))
     }
 
     @Test
@@ -110,19 +103,16 @@
         rule.setContent {
             view = LocalView.current
             Box(
-                Modifier
-                    .size(10.dp)
+                Modifier.size(10.dp)
                     .focusProperties {
                         @OptIn(ExperimentalComposeUiApi::class)
-                        enter = { FocusRequester.Cancel }
+                        enter = {
+                            FocusRequester.Cancel
+                        }
                     }
                     .focusGroup()
             ) {
-                Box(
-                    Modifier
-                        .size(10.dp)
-                        .focusable()
-                )
+                Box(Modifier.size(10.dp).focusable())
             }
         }
 
@@ -133,10 +123,9 @@
         rule.runOnIdle { assertThat(success).isFalse() }
     }
 
-    private fun View.getFocusedRect() = AndroidRect().run {
-        rule.runOnIdle {
-            getFocusedRect(this)
+    private fun View.getFocusedRect() =
+        AndroidRect().run {
+            rule.runOnIdle { getFocusedRect(this) }
+            IntRect(left, top, right, bottom)
         }
-        IntRect(left, top, right, bottom)
-    }
 }
diff --git a/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/focus/FreeFocusTest.kt b/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/focus/FreeFocusTest.kt
index 30cf72a..f543af6 100644
--- a/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/focus/FreeFocusTest.kt
+++ b/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/focus/FreeFocusTest.kt
@@ -29,8 +29,7 @@
 @MediumTest
 @RunWith(AndroidJUnit4::class)
 class FreeFocusTest {
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
     @Test
     fun active_freeFocus_retainFocusAsActive() {
@@ -39,8 +38,7 @@
         val focusRequester = FocusRequester()
         rule.setFocusableContent {
             Box(
-                Modifier
-                    .onFocusChanged { focusState = it }
+                Modifier.onFocusChanged { focusState = it }
                     .focusRequester(focusRequester)
                     .focusTarget()
             )
@@ -65,15 +63,11 @@
         val focusRequester = FocusRequester()
         rule.setFocusableContent {
             Box(
-                Modifier
-                    .onFocusChanged { focusState = it }
+                Modifier.onFocusChanged { focusState = it }
                     .focusRequester(focusRequester)
                     .focusTarget()
             ) {
-                Box(
-                    Modifier
-                        .focusRequester(initialFocus)
-                        .focusTarget())
+                Box(Modifier.focusRequester(initialFocus).focusTarget())
             }
         }
         rule.runOnIdle { initialFocus.requestFocus() }
@@ -95,8 +89,7 @@
         val focusRequester = FocusRequester()
         rule.setFocusableContent {
             Box(
-                Modifier
-                    .onFocusChanged { focusState = it }
+                Modifier.onFocusChanged { focusState = it }
                     .focusRequester(focusRequester)
                     .focusTarget()
             )
@@ -109,9 +102,7 @@
         }
 
         // Act.
-        val success = rule.runOnIdle {
-            focusRequester.freeFocus()
-        }
+        val success = rule.runOnIdle { focusRequester.freeFocus() }
 
         // Assert.
         rule.runOnIdle {
@@ -128,17 +119,14 @@
         val focusRequester = FocusRequester()
         rule.setFocusableContent {
             Box(
-                Modifier
-                    .onFocusChanged { focusState = it }
+                Modifier.onFocusChanged { focusState = it }
                     .focusRequester(focusRequester)
                     .focusTarget()
             )
         }
 
         // Act.
-        val success = rule.runOnIdle {
-            focusRequester.freeFocus()
-        }
+        val success = rule.runOnIdle { focusRequester.freeFocus() }
 
         // Assert.
         rule.runOnIdle {
diff --git a/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/focus/KeyEventToFocusDirectionTest.kt b/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/focus/KeyEventToFocusDirectionTest.kt
index fb9d369..e497650 100644
--- a/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/focus/KeyEventToFocusDirectionTest.kt
+++ b/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/focus/KeyEventToFocusDirectionTest.kt
@@ -46,16 +46,13 @@
 @RunWith(AndroidJUnit4::class)
 @OptIn(ExperimentalComposeUiApi::class)
 class KeyEventToFocusDirectionTest {
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
     private lateinit var owner: Owner
 
     @Before
     fun setup() {
-        rule.setContent {
-            owner = LocalView.current as Owner
-        }
+        rule.setContent { owner = LocalView.current as Owner }
     }
 
     @Test
@@ -163,8 +160,7 @@
         val focusDirection = owner.getFocusDirection(keyEvent)
 
         // Assert.
-        @OptIn(ExperimentalComposeUiApi::class)
-        assertThat(focusDirection).isEqualTo(Enter)
+        @OptIn(ExperimentalComposeUiApi::class) assertThat(focusDirection).isEqualTo(Enter)
     }
 
     @Test
@@ -176,8 +172,7 @@
         val focusDirection = owner.getFocusDirection(keyEvent)
 
         // Assert.
-        @OptIn(ExperimentalComposeUiApi::class)
-        assertThat(focusDirection).isEqualTo(Enter)
+        @OptIn(ExperimentalComposeUiApi::class) assertThat(focusDirection).isEqualTo(Enter)
     }
 
     @Test
@@ -189,8 +184,7 @@
         val focusDirection = owner.getFocusDirection(keyEvent)
 
         // Assert.
-        @OptIn(ExperimentalComposeUiApi::class)
-        assertThat(focusDirection).isEqualTo(Enter)
+        @OptIn(ExperimentalComposeUiApi::class) assertThat(focusDirection).isEqualTo(Enter)
     }
 
     @Test
@@ -202,8 +196,7 @@
         val focusDirection = owner.getFocusDirection(keyEvent)
 
         // Assert.
-        @OptIn(ExperimentalComposeUiApi::class)
-        assertThat(focusDirection).isEqualTo(Exit)
+        @OptIn(ExperimentalComposeUiApi::class) assertThat(focusDirection).isEqualTo(Exit)
     }
 
     @Test
@@ -215,7 +208,6 @@
         val focusDirection = owner.getFocusDirection(keyEvent)
 
         // Assert.
-        @OptIn(ExperimentalComposeUiApi::class)
-        assertThat(focusDirection).isEqualTo(Exit)
+        @OptIn(ExperimentalComposeUiApi::class) assertThat(focusDirection).isEqualTo(Exit)
     }
 }
diff --git a/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/focus/OneDimensionalFocusSearchNextTest.kt b/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/focus/OneDimensionalFocusSearchNextTest.kt
index 78c6445..d568582 100644
--- a/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/focus/OneDimensionalFocusSearchNextTest.kt
+++ b/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/focus/OneDimensionalFocusSearchNextTest.kt
@@ -35,8 +35,7 @@
 @RunWith(AndroidJUnit4::class)
 class OneDimensionalFocusSearchNextTest {
 
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
     private lateinit var focusManager: FocusManager
     private val initialFocus: FocusRequester = FocusRequester()
@@ -57,9 +56,7 @@
     fun moveFocus_oneDisabledFocusableItem() {
         // Arrange.
         val isItemFocused = mutableStateOf(false)
-        rule.setContentForTest {
-            FocusableBox(isItemFocused, 0, 0, 10, 10, deactivated = true)
-        }
+        rule.setContentForTest { FocusableBox(isItemFocused, 0, 0, 10, 10, deactivated = true) }
 
         // Act.
         val movedFocusSuccessfully = rule.runOnIdle { focusManager.moveFocus(Next) }
@@ -72,9 +69,7 @@
     fun initialFocus_oneItem() {
         // Arrange.
         val isItemFocused = mutableStateOf(false)
-        rule.setContentForTest {
-            FocusableBox(isItemFocused, 0, 0, 10, 10)
-        }
+        rule.setContentForTest { FocusableBox(isItemFocused, 0, 0, 10, 10) }
 
         // Act.
         val movedFocusSuccessfully = rule.runOnIdle { focusManager.moveFocus(Next) }
@@ -132,12 +127,8 @@
         // Arrange.
         val (parent1, parent2, child1, child2) = List(4) { mutableStateOf(false) }
         rule.setContentForTest {
-            FocusableBox(parent1, 10, 10, 10, 10) {
-                FocusableBox(child1, 10, 10, 10, 10)
-            }
-            FocusableBox(parent2, 0, 0, 10, 10) {
-                FocusableBox(child2, 10, 10, 10, 10)
-            }
+            FocusableBox(parent1, 10, 10, 10, 10) { FocusableBox(child1, 10, 10, 10, 10) }
+            FocusableBox(parent2, 0, 0, 10, 10) { FocusableBox(child2, 10, 10, 10, 10) }
         }
 
         // Act.
@@ -155,9 +146,7 @@
         // Arrange.
         val (parent1, child1, item2) = List(3) { mutableStateOf(false) }
         rule.setContentForTest {
-            FocusableBox(parent1, 10, 10, 10, 10) {
-                FocusableBox(child1, 10, 10, 10, 10)
-            }
+            FocusableBox(parent1, 10, 10, 10, 10) { FocusableBox(child1, 10, 10, 10, 10) }
             FocusableBox(item2, 0, 0, 10, 10)
         }
 
@@ -177,9 +166,7 @@
         val (parent1, child1, item1) = List(3) { mutableStateOf(false) }
         rule.setContentForTest {
             FocusableBox(item1, 0, 0, 10, 10)
-            FocusableBox(parent1, 10, 10, 10, 10) {
-                FocusableBox(child1, 10, 10, 10, 10)
-            }
+            FocusableBox(parent1, 10, 10, 10, 10) { FocusableBox(child1, 10, 10, 10, 10) }
         }
 
         // Act.
@@ -496,9 +483,7 @@
             }
             FocusableBox(parent2, 0, 10, 10, 10) {
                 FocusableBox(child4, 0, 10, 10, 10)
-                FocusableBox(parent3, 10, 10, 10, 10) {
-                    FocusableBox(child6, 0, 0, 10, 10)
-                }
+                FocusableBox(parent3, 10, 10, 10, 10) { FocusableBox(child6, 0, 0, 10, 10) }
                 FocusableBox(child5, 20, 0, 10, 10)
             }
             FocusableBox(parent4, 0, 10, 10, 10, deactivated = true) {
diff --git a/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/focus/OneDimensionalFocusSearchPreviousTest.kt b/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/focus/OneDimensionalFocusSearchPreviousTest.kt
index 9d248a0..fad7975 100644
--- a/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/focus/OneDimensionalFocusSearchPreviousTest.kt
+++ b/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/focus/OneDimensionalFocusSearchPreviousTest.kt
@@ -35,8 +35,7 @@
 @RunWith(AndroidJUnit4::class)
 class OneDimensionalFocusSearchPreviousTest {
 
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
     private lateinit var focusManager: FocusManager
     private val initialFocus: FocusRequester = FocusRequester()
@@ -57,9 +56,7 @@
     fun moveFocus_oneDisabledFocusableItem() {
         // Arrange.
         val isItemFocused = mutableStateOf(false)
-        rule.setContentForTest {
-            FocusableBox(isItemFocused, 0, 0, 10, 10, deactivated = true)
-        }
+        rule.setContentForTest { FocusableBox(isItemFocused, 0, 0, 10, 10, deactivated = true) }
 
         // Act.
         val movedFocusSuccessfully = rule.runOnIdle { focusManager.moveFocus(Previous) }
@@ -72,9 +69,7 @@
     fun initialFocus_oneItem() {
         // Arrange.
         val isItemFocused = mutableStateOf(false)
-        rule.setContentForTest {
-            FocusableBox(isItemFocused, 0, 0, 10, 10)
-        }
+        rule.setContentForTest { FocusableBox(isItemFocused, 0, 0, 10, 10) }
 
         // Act.
         val movedFocusSuccessfully = rule.runOnIdle { focusManager.moveFocus(Previous) }
@@ -132,12 +127,8 @@
         // Arrange.
         val (parent1, parent2, child1, child2) = List(4) { mutableStateOf(false) }
         rule.setContentForTest {
-            FocusableBox(parent1, 10, 10, 10, 10) {
-                FocusableBox(child1, 10, 10, 10, 10)
-            }
-            FocusableBox(parent2, 0, 0, 10, 10) {
-                FocusableBox(child2, 10, 10, 10, 10)
-            }
+            FocusableBox(parent1, 10, 10, 10, 10) { FocusableBox(child1, 10, 10, 10, 10) }
+            FocusableBox(parent2, 0, 0, 10, 10) { FocusableBox(child2, 10, 10, 10, 10) }
         }
 
         // Act.
@@ -156,9 +147,7 @@
         val (parent1, child1, item1) = List(3) { mutableStateOf(false) }
         rule.setContentForTest {
             FocusableBox(item1, 0, 0, 10, 10)
-            FocusableBox(parent1, 10, 10, 10, 10) {
-                FocusableBox(child1, 10, 10, 10, 10)
-            }
+            FocusableBox(parent1, 10, 10, 10, 10) { FocusableBox(child1, 10, 10, 10, 10) }
         }
 
         // Act.
@@ -562,9 +551,7 @@
             }
             FocusableBox(parent2, 0, 10, 10, 10) {
                 FocusableBox(child4, 0, 10, 10, 10)
-                FocusableBox(parent3, 10, 10, 10, 10) {
-                    FocusableBox(child6, 0, 0, 10, 10)
-                }
+                FocusableBox(parent3, 10, 10, 10, 10) { FocusableBox(child6, 0, 0, 10, 10) }
                 FocusableBox(child5, 20, 0, 10, 10)
             }
             FocusableBox(parent4, 0, 10, 10, 10, deactivated = true) {
diff --git a/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/focus/OwnerFocusTest.kt b/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/focus/OwnerFocusTest.kt
index 6b75c53..71f1d7e 100644
--- a/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/focus/OwnerFocusTest.kt
+++ b/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/focus/OwnerFocusTest.kt
@@ -40,8 +40,7 @@
 @MediumTest
 @RunWith(AndroidJUnit4::class)
 class OwnerFocusTest {
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
     @Test
     fun requestFocus_bringsViewInFocus() {
@@ -50,22 +49,14 @@
         val focusRequester = FocusRequester()
         rule.setFocusableContent {
             ownerView = LocalView.current
-            Box(
-                modifier = Modifier
-                    .focusRequester(focusRequester)
-                    .focusTarget()
-            )
+            Box(modifier = Modifier.focusRequester(focusRequester).focusTarget())
         }
 
         // Act.
-        rule.runOnIdle {
-            focusRequester.requestFocus()
-        }
+        rule.runOnIdle { focusRequester.requestFocus() }
 
         // Assert.
-        rule.runOnIdle {
-            assertThat(ownerView.isFocused).isTrue()
-        }
+        rule.runOnIdle { assertThat(ownerView.isFocused).isTrue() }
     }
 
     @Ignore("b/325466015")
@@ -76,22 +67,14 @@
         lateinit var focusState: FocusState
         rule.setFocusableContent(extraItemForInitialFocus = false) {
             ownerView = LocalView.current
-            Box(
-                modifier = Modifier
-                    .onFocusChanged { focusState = it }
-                    .focusTarget()
-            )
+            Box(modifier = Modifier.onFocusChanged { focusState = it }.focusTarget())
         }
 
         // Act.
-        rule.runOnIdle {
-            ownerView.requestFocus()
-        }
+        rule.runOnIdle { ownerView.requestFocus() }
 
         // Assert.
-        rule.runOnIdle {
-            assertThat(focusState.isFocused).isTrue()
-        }
+        rule.runOnIdle { assertThat(focusState.isFocused).isTrue() }
     }
 
     @Test
@@ -106,34 +89,26 @@
             ownerView = LocalView.current
             Column {
                 Box(
-                    modifier = Modifier
-                        .size(10.dp)
-                        .onFocusChanged { focusState1 = it }
-                        .focusTarget()
+                    modifier =
+                        Modifier.size(10.dp).onFocusChanged { focusState1 = it }.focusTarget()
                 )
                 Box(
-                    modifier = Modifier
-                        .size(10.dp)
-                        .focusRequester(focusRequester)
-                        .onFocusChanged { focusState2 = it }
-                        .focusTarget()
+                    modifier =
+                        Modifier.size(10.dp)
+                            .focusRequester(focusRequester)
+                            .onFocusChanged { focusState2 = it }
+                            .focusTarget()
                 )
                 Box(
-                    modifier = Modifier
-                        .size(10.dp)
-                        .onFocusChanged { focusState3 = it }
-                        .focusTarget()
+                    modifier =
+                        Modifier.size(10.dp).onFocusChanged { focusState3 = it }.focusTarget()
                 )
             }
         }
-        rule.runOnIdle {
-            focusRequester.requestFocus()
-        }
+        rule.runOnIdle { focusRequester.requestFocus() }
 
         // Act.
-        val focusRequested = rule.runOnIdle {
-            ownerView.requestFocus(FOCUS_DOWN)
-        }
+        val focusRequested = rule.runOnIdle { ownerView.requestFocus(FOCUS_DOWN) }
 
         // Assert.
         rule.runOnIdle {
@@ -156,34 +131,26 @@
             ownerView = LocalView.current
             Column {
                 Box(
-                    modifier = Modifier
-                        .size(10.dp)
-                        .onFocusChanged { focusState1 = it }
-                        .focusTarget()
+                    modifier =
+                        Modifier.size(10.dp).onFocusChanged { focusState1 = it }.focusTarget()
                 )
                 Box(
-                    modifier = Modifier
-                        .size(10.dp)
-                        .focusRequester(focusRequester)
-                        .onFocusChanged { focusState2 = it }
-                        .focusTarget()
+                    modifier =
+                        Modifier.size(10.dp)
+                            .focusRequester(focusRequester)
+                            .onFocusChanged { focusState2 = it }
+                            .focusTarget()
                 )
                 Box(
-                    modifier = Modifier
-                        .size(10.dp)
-                        .onFocusChanged { focusState3 = it }
-                        .focusTarget()
+                    modifier =
+                        Modifier.size(10.dp).onFocusChanged { focusState3 = it }.focusTarget()
                 )
             }
         }
-        rule.runOnIdle {
-            focusRequester.requestFocus()
-        }
+        rule.runOnIdle { focusRequester.requestFocus() }
 
         // Act.
-        val focusRequested = rule.runOnIdle {
-            ownerView.requestFocus(FOCUS_UP)
-        }
+        val focusRequested = rule.runOnIdle { ownerView.requestFocus(FOCUS_UP) }
 
         // Assert.
         rule.runOnIdle {
@@ -204,22 +171,18 @@
         rule.setFocusableContent {
             ownerView = LocalView.current
             Box(
-                modifier = Modifier
-                    .onFocusChanged { focusState = it }
-                    .focusRequester(focusRequester)
-                    .focusTarget()
+                modifier =
+                    Modifier.onFocusChanged { focusState = it }
+                        .focusRequester(focusRequester)
+                        .focusTarget()
             )
         }
 
         // Act.
-        rule.runOnIdle {
-            ownerView.dispatchWindowFocusChanged(true)
-        }
+        rule.runOnIdle { ownerView.dispatchWindowFocusChanged(true) }
 
         // Assert.
-        rule.runOnIdle {
-            assertThat(focusState.isFocused).isTrue()
-        }
+        rule.runOnIdle { assertThat(focusState.isFocused).isTrue() }
     }
 
     @Test
@@ -231,26 +194,20 @@
         rule.setFocusableContent {
             ownerView = LocalView.current
             Box(
-                modifier = Modifier
-                    .size(10.dp)
-                    .onFocusChanged { focusState = it }
-                    .focusRequester(focusRequester)
-                    .focusTarget()
+                modifier =
+                    Modifier.size(10.dp)
+                        .onFocusChanged { focusState = it }
+                        .focusRequester(focusRequester)
+                        .focusTarget()
             )
         }
-        rule.runOnIdle {
-            focusRequester.requestFocus()
-        }
+        rule.runOnIdle { focusRequester.requestFocus() }
 
         // Act.
-        rule.runOnIdle {
-            ownerView.clearFocus()
-        }
+        rule.runOnIdle { ownerView.clearFocus() }
 
         // Assert.
-        rule.runOnIdle {
-            assertThat(focusState.isFocused).isFalse()
-        }
+        rule.runOnIdle { assertThat(focusState.isFocused).isFalse() }
     }
 
     @Test
@@ -262,25 +219,19 @@
         rule.setFocusableContent {
             ownerView = LocalView.current
             Box(
-                modifier = Modifier
-                    .onFocusChanged { focusState = it }
-                    .focusRequester(focusRequester)
-                    .focusTarget()
+                modifier =
+                    Modifier.onFocusChanged { focusState = it }
+                        .focusRequester(focusRequester)
+                        .focusTarget()
             )
         }
-        rule.runOnIdle {
-            focusRequester.requestFocus()
-        }
+        rule.runOnIdle { focusRequester.requestFocus() }
 
         // Act.
-        rule.runOnIdle {
-            ownerView.dispatchWindowFocusChanged(false)
-        }
+        rule.runOnIdle { ownerView.dispatchWindowFocusChanged(false) }
 
         // Assert.
-        rule.runOnIdle {
-            assertThat(focusState.isFocused).isTrue()
-        }
+        rule.runOnIdle { assertThat(focusState.isFocused).isTrue() }
     }
 
     @Test
diff --git a/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/focus/RequestFocusEnterExitTest.kt b/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/focus/RequestFocusEnterExitTest.kt
index b653dd4..85962bc 100644
--- a/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/focus/RequestFocusEnterExitTest.kt
+++ b/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/focus/RequestFocusEnterExitTest.kt
@@ -33,8 +33,7 @@
 @MediumTest
 @RunWith(AndroidJUnit4::class)
 class RequestFocusEnterExitTest {
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
     private val source = FocusRequester()
     private val destination = FocusRequester()
@@ -68,9 +67,7 @@
         }
 
         // Act.
-        rule.runOnIdle {
-            destination.requestFocus()
-        }
+        rule.runOnIdle { destination.requestFocus() }
 
         // Assert.
         rule.runOnIdle {
@@ -91,11 +88,16 @@
             Box(Modifier.focusTarget(grandParent)) {
                 Box(Modifier.focusTarget(parent1)) {
                     Box(
-                        Modifier
-                            .focusRequester(source)
+                        Modifier.focusRequester(source)
                             .focusProperties {
-                                enter = { child1.enter = counter++; Default }
-                                exit = { child1.exit = counter++; Cancel }
+                                enter = {
+                                    child1.enter = counter++
+                                    Default
+                                }
+                                exit = {
+                                    child1.exit = counter++
+                                    Cancel
+                                }
                             }
                             .focusTarget()
                     )
@@ -113,9 +115,7 @@
         }
 
         // Act.
-        rule.runOnIdle {
-            destination.requestFocus()
-        }
+        rule.runOnIdle { destination.requestFocus() }
 
         // Assert.
         rule.runOnIdle {
@@ -135,10 +135,15 @@
         rule.setFocusableContent {
             Box(Modifier.focusTarget(grandParent)) {
                 Box(
-                    Modifier
-                        .focusProperties {
-                            enter = { parent1.enter = counter++; Default }
-                            exit = { parent1.exit = counter++; Cancel }
+                    Modifier.focusProperties {
+                            enter = {
+                                parent1.enter = counter++
+                                Default
+                            }
+                            exit = {
+                                parent1.exit = counter++
+                                Cancel
+                            }
                         }
                         .focusTarget()
                 ) {
@@ -157,9 +162,7 @@
         }
 
         // Act.
-        rule.runOnIdle {
-            destination.requestFocus()
-        }
+        rule.runOnIdle { destination.requestFocus() }
 
         // Assert.
         rule.runOnIdle {
@@ -178,10 +181,15 @@
         // Arrange.
         rule.setFocusableContent {
             Box(
-                Modifier
-                    .focusProperties {
-                        enter = { grandParent.enter = counter++; Default }
-                        exit = { grandParent.exit = counter++; Cancel }
+                Modifier.focusProperties {
+                        enter = {
+                            grandParent.enter = counter++
+                            Default
+                        }
+                        exit = {
+                            grandParent.exit = counter++
+                            Cancel
+                        }
                     }
                     .focusTarget()
             ) {
@@ -201,9 +209,7 @@
         }
 
         // Act.
-        rule.runOnIdle {
-            destination.requestFocus()
-        }
+        rule.runOnIdle { destination.requestFocus() }
 
         // Assert.
         rule.runOnIdle {
@@ -223,10 +229,15 @@
         var init = true
         rule.setFocusableContent {
             Box(
-                Modifier
-                    .focusProperties {
-                        enter = { grandParent.enter = counter++; if (init) Default else Cancel }
-                        exit = { grandParent.exit = counter++; Default }
+                Modifier.focusProperties {
+                        enter = {
+                            grandParent.enter = counter++
+                            if (init) Default else Cancel
+                        }
+                        exit = {
+                            grandParent.exit = counter++
+                            Default
+                        }
                     }
                     .focusTarget()
             ) {
@@ -247,9 +258,7 @@
         }
 
         // Act.
-        rule.runOnIdle {
-            destination.requestFocus()
-        }
+        rule.runOnIdle { destination.requestFocus() }
 
         // Assert.
         rule.runOnIdle {
@@ -273,10 +282,15 @@
                     Box(Modifier.focusTarget(child2))
                 }
                 Box(
-                    Modifier
-                        .focusProperties {
-                            enter = { parent2.enter = counter++; Cancel }
-                            exit = { parent2.exit = counter++; Default }
+                    Modifier.focusProperties {
+                            enter = {
+                                parent2.enter = counter++
+                                Cancel
+                            }
+                            exit = {
+                                parent2.exit = counter++
+                                Default
+                            }
                         }
                         .focusTarget()
                 ) {
@@ -291,9 +305,7 @@
         }
 
         // Act.
-        rule.runOnIdle {
-            destination.requestFocus()
-        }
+        rule.runOnIdle { destination.requestFocus() }
 
         // Assert.
         rule.runOnIdle {
@@ -319,11 +331,16 @@
                 Box(Modifier.focusTarget(parent2)) {
                     Box(Modifier.focusTarget(child3))
                     Box(
-                        Modifier
-                            .focusRequester(destination)
+                        Modifier.focusRequester(destination)
                             .focusProperties {
-                                enter = { child4.enter = counter++; Cancel }
-                                exit = { child4.exit = counter++; Default }
+                                enter = {
+                                    child4.enter = counter++
+                                    Cancel
+                                }
+                                exit = {
+                                    child4.exit = counter++
+                                    Default
+                                }
                             }
                             .focusTarget()
                     )
@@ -336,9 +353,7 @@
         }
 
         // Act.
-        rule.runOnIdle {
-            destination.requestFocus()
-        }
+        rule.runOnIdle { destination.requestFocus() }
 
         // Assert.
         rule.runOnIdle {
@@ -351,8 +366,10 @@
             assertThat(child4.enterExit).isEqualTo("0, 0")
         }
     }
+
     private class EnterExitCounter(var enter: Int = 0, var exit: Int = 0) {
-        val enterExit: String get() = "$enter, $exit"
+        val enterExit: String
+            get() = "$enter, $exit"
 
         fun reset() {
             enter = 0
@@ -360,12 +377,18 @@
         }
     }
 
-    private fun Modifier.focusTarget(enterExitCounter: EnterExitCounter): Modifier = this
-        .focusProperties {
-            enter = { enterExitCounter.enter = counter++; Default }
-            exit = { enterExitCounter.exit = counter++; Default }
-        }
-        .focusTarget()
+    private fun Modifier.focusTarget(enterExitCounter: EnterExitCounter): Modifier =
+        this.focusProperties {
+                enter = {
+                    enterExitCounter.enter = counter++
+                    Default
+                }
+                exit = {
+                    enterExitCounter.exit = counter++
+                    Default
+                }
+            }
+            .focusTarget()
 
     private fun resetCounters() {
         counter = 1
diff --git a/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/focus/RequestFocusEnterTest.kt b/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/focus/RequestFocusEnterTest.kt
index c166a2e..a588331 100644
--- a/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/focus/RequestFocusEnterTest.kt
+++ b/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/focus/RequestFocusEnterTest.kt
@@ -33,8 +33,7 @@
 @SmallTest
 @RunWith(AndroidJUnit4::class)
 class RequestFocusEnterTest {
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
     private val focusRequester = FocusRequester()
     private var enterTriggered = false
@@ -45,10 +44,12 @@
         // Arrange.
         rule.setFocusableContent {
             Box(
-                Modifier
-                    .focusRequester(focusRequester)
+                Modifier.focusRequester(focusRequester)
                     .focusProperties {
-                        enter = { enterTriggered = true; Default }
+                        enter = {
+                            enterTriggered = true
+                            Default
+                        }
                     }
                     .onFocusChanged { focusState = it }
                     .focusTarget()
@@ -56,9 +57,7 @@
         }
 
         // Act.
-        rule.runOnIdle {
-            focusRequester.requestFocus()
-        }
+        rule.runOnIdle { focusRequester.requestFocus() }
 
         // Assert.
         rule.runOnIdle {
@@ -72,25 +71,24 @@
         // Arrange.
         rule.setFocusableContent {
             Box(
-                Modifier
-                    .focusRequester(focusRequester)
+                Modifier.focusRequester(focusRequester)
                     .onFocusChanged { focusState = it }
                     .focusTarget()
             ) {
                 Box(
-                    Modifier
-                        .focusProperties {
-                            enter = { enterTriggered = true; Default }
+                    Modifier.focusProperties {
+                            enter = {
+                                enterTriggered = true
+                                Default
+                            }
                         }
                         .focusTarget()
-                    )
-                }
+                )
+            }
         }
 
         // Act.
-        rule.runOnIdle {
-            focusRequester.requestFocus()
-        }
+        rule.runOnIdle { focusRequester.requestFocus() }
 
         // Assert.
         rule.runOnIdle {
@@ -104,15 +102,16 @@
         // Arrange.
         rule.setFocusableContent {
             Box(
-                Modifier
-                    .focusProperties {
-                        enter = { enterTriggered = true; Default }
+                Modifier.focusProperties {
+                        enter = {
+                            enterTriggered = true
+                            Default
+                        }
                     }
                     .focusTarget()
             ) {
                 Box(
-                    Modifier
-                        .focusRequester(focusRequester)
+                    Modifier.focusRequester(focusRequester)
                         .onFocusChanged { focusState = it }
                         .focusTarget()
                 )
@@ -120,9 +119,7 @@
         }
 
         // Act.
-        rule.runOnIdle {
-            focusRequester.requestFocus()
-        }
+        rule.runOnIdle { focusRequester.requestFocus() }
 
         // Assert.
         rule.runOnIdle {
@@ -136,16 +133,17 @@
         // Arrange.
         rule.setFocusableContent {
             Box(
-                Modifier
-                    .focusProperties {
-                        enter = { enterTriggered = true; Default }
+                Modifier.focusProperties {
+                        enter = {
+                            enterTriggered = true
+                            Default
+                        }
                     }
                     .focusTarget()
             ) {
                 Box {
                     Box(
-                        Modifier
-                            .focusRequester(focusRequester)
+                        Modifier.focusRequester(focusRequester)
                             .onFocusChanged { focusState = it }
                             .focusTarget()
                     )
@@ -154,9 +152,7 @@
         }
 
         // Act.
-        rule.runOnIdle {
-            focusRequester.requestFocus()
-        }
+        rule.runOnIdle { focusRequester.requestFocus() }
 
         // Assert.
         rule.runOnIdle {
@@ -170,8 +166,7 @@
         // Arrange.
         rule.setFocusableContent {
             Box(
-                Modifier
-                    .focusRequester(focusRequester)
+                Modifier.focusRequester(focusRequester)
                     .focusProperties { enter = { Cancel } }
                     .onFocusChanged { focusState = it }
                     .focusTarget()
@@ -179,14 +174,10 @@
         }
 
         // Act.
-        rule.runOnIdle {
-            focusRequester.requestFocus()
-        }
+        rule.runOnIdle { focusRequester.requestFocus() }
 
         // Assert.
-        rule.runOnIdle {
-            assertThat(focusState.isFocused).isTrue()
-        }
+        rule.runOnIdle { assertThat(focusState.isFocused).isTrue() }
     }
 
     @Test
@@ -194,8 +185,7 @@
         // Arrange.
         rule.setFocusableContent {
             Box(
-                Modifier
-                    .focusRequester(focusRequester)
+                Modifier.focusRequester(focusRequester)
                     .onFocusChanged { focusState = it }
                     .focusTarget()
             ) {
@@ -204,28 +194,19 @@
         }
 
         // Act.
-        rule.runOnIdle {
-            focusRequester.requestFocus()
-        }
+        rule.runOnIdle { focusRequester.requestFocus() }
 
         // Assert.
-        rule.runOnIdle {
-            assertThat(focusState.isFocused).isTrue()
-        }
+        rule.runOnIdle { assertThat(focusState.isFocused).isTrue() }
     }
 
     @Test
     fun cancellingFocusGain_usingEnterPropertyOnParent() {
         // Arrange.
         rule.setFocusableContent {
-            Box(
-                Modifier
-                    .focusProperties { enter = { Cancel } }
-                    .focusTarget()
-            ) {
+            Box(Modifier.focusProperties { enter = { Cancel } }.focusTarget()) {
                 Box(
-                    Modifier
-                        .focusRequester(focusRequester)
+                    Modifier.focusRequester(focusRequester)
                         .onFocusChanged { focusState = it }
                         .focusTarget()
                 )
@@ -233,29 +214,20 @@
         }
 
         // Act.
-        rule.runOnIdle {
-            focusRequester.requestFocus()
-        }
+        rule.runOnIdle { focusRequester.requestFocus() }
 
         // Assert.
-        rule.runOnIdle {
-            assertThat(focusState.isFocused).isFalse()
-        }
+        rule.runOnIdle { assertThat(focusState.isFocused).isFalse() }
     }
 
     @Test
     fun cancellingFocusGain_usingEnterPropertyOnGrandparent() {
         // Arrange.
         rule.setFocusableContent {
-            Box(
-                Modifier
-                    .focusProperties { enter = { Cancel } }
-                    .focusTarget()
-            ) {
+            Box(Modifier.focusProperties { enter = { Cancel } }.focusTarget()) {
                 Box {
                     Box(
-                        Modifier
-                            .focusRequester(focusRequester)
+                        Modifier.focusRequester(focusRequester)
                             .onFocusChanged { focusState = it }
                             .focusTarget()
                     )
@@ -264,14 +236,10 @@
         }
 
         // Act.
-        rule.runOnIdle {
-            focusRequester.requestFocus()
-        }
+        rule.runOnIdle { focusRequester.requestFocus() }
 
         // Assert.
-        rule.runOnIdle {
-            assertThat(focusState.isFocused).isFalse()
-        }
+        rule.runOnIdle { assertThat(focusState.isFocused).isFalse() }
     }
 
     @Test
@@ -280,22 +248,13 @@
         val customDestination = FocusRequester()
         rule.setFocusableContent {
             Box(Modifier.focusTarget()) {
-                Box(
-                    Modifier
-                        .focusProperties { enter = { customDestination } }
-                        .focusTarget()
-                ) {
-                    Box(
-                        Modifier
-                            .focusRequester(focusRequester)
-                            .focusTarget()
-                    )
+                Box(Modifier.focusProperties { enter = { customDestination } }.focusTarget()) {
+                    Box(Modifier.focusRequester(focusRequester).focusTarget())
                     Box(Modifier.focusTarget())
                 }
                 Box(Modifier.focusTarget()) {
                     Box(
-                        Modifier
-                            .focusRequester(customDestination)
+                        Modifier.focusRequester(customDestination)
                             .onFocusChanged { focusState = it }
                             .focusTarget()
                     )
@@ -304,14 +263,10 @@
         }
 
         // Act.
-        rule.runOnIdle {
-            focusRequester.requestFocus()
-        }
+        rule.runOnIdle { focusRequester.requestFocus() }
 
         // Assert.
-        rule.runOnIdle {
-            assertThat(focusState.isFocused).isTrue()
-        }
+        rule.runOnIdle { assertThat(focusState.isFocused).isTrue() }
     }
 
     @Test
@@ -320,30 +275,22 @@
         val customDestination = FocusRequester()
         lateinit var destinationFocusState: FocusState
         rule.setFocusableContent {
-            Box(
-                Modifier
-                    .focusProperties { enter = { customDestination } }
-                    .focusTarget()
-            ) {
-                    Box(
-                        Modifier
-                            .focusRequester(focusRequester)
-                            .onFocusChanged { focusState = it }
-                            .focusTarget()
-                    )
-                    Box(
-                        Modifier
-                            .focusRequester(customDestination)
-                            .onFocusChanged { destinationFocusState = it }
-                            .focusTarget()
-                    )
+            Box(Modifier.focusProperties { enter = { customDestination } }.focusTarget()) {
+                Box(
+                    Modifier.focusRequester(focusRequester)
+                        .onFocusChanged { focusState = it }
+                        .focusTarget()
+                )
+                Box(
+                    Modifier.focusRequester(customDestination)
+                        .onFocusChanged { destinationFocusState = it }
+                        .focusTarget()
+                )
             }
         }
 
         // Act.
-        rule.runOnIdle {
-            focusRequester.requestFocus()
-        }
+        rule.runOnIdle { focusRequester.requestFocus() }
 
         // Assert.
         rule.runOnIdle {
@@ -358,30 +305,22 @@
         val customDestination = FocusRequester()
         lateinit var destinationFocusState: FocusState
         rule.setFocusableContent {
-            Box(
-                Modifier
-                    .focusProperties { enter = { customDestination } }
-                    .focusTarget()
-            ) {
+            Box(Modifier.focusProperties { enter = { customDestination } }.focusTarget()) {
                 Box(
-                    Modifier
-                        .focusRequester(focusRequester)
+                    Modifier.focusRequester(focusRequester)
                         .onFocusChanged { focusState = it }
                         .focusTarget()
                 )
             }
             Box(
-                Modifier
-                    .focusRequester(customDestination)
+                Modifier.focusRequester(customDestination)
                     .onFocusChanged { destinationFocusState = it }
                     .focusTarget()
             )
         }
 
         // Act.
-        rule.runOnIdle {
-            focusRequester.requestFocus()
-        }
+        rule.runOnIdle { focusRequester.requestFocus() }
 
         // Assert.
         rule.runOnIdle {
@@ -397,15 +336,13 @@
         lateinit var destinationFocusState: FocusState
         rule.setFocusableContent {
             Box(
-                Modifier
-                    .focusRequester(customDestination)
+                Modifier.focusRequester(customDestination)
                     .focusProperties { enter = { customDestination } }
                     .onFocusChanged { destinationFocusState = it }
                     .focusTarget()
             ) {
                 Box(
-                    Modifier
-                        .focusRequester(focusRequester)
+                    Modifier.focusRequester(focusRequester)
                         .onFocusChanged { focusState = it }
                         .focusTarget()
                 )
@@ -413,9 +350,7 @@
         }
 
         // Act.
-        rule.runOnIdle {
-            focusRequester.requestFocus()
-        }
+        rule.runOnIdle { focusRequester.requestFocus() }
 
         // Assert.
         rule.runOnIdle {
@@ -431,14 +366,9 @@
         var enterCount = 0
         rule.setFocusableContent {
             Box(Modifier.focusTarget()) {
+                Box(Modifier.focusRequester(initialFocus).focusTarget())
                 Box(
-                    Modifier
-                        .focusRequester(initialFocus)
-                        .focusTarget()
-                )
-                Box(
-                    Modifier
-                        .focusProperties {
+                    Modifier.focusProperties {
                             enter = {
                                 enterCount++
                                 child2
@@ -446,16 +376,8 @@
                         }
                         .focusTarget()
                 ) {
-                    Box(
-                        Modifier
-                            .focusRequester(child1)
-                            .focusTarget()
-                    )
-                    Box(
-                        Modifier
-                            .focusRequester(child2)
-                            .focusTarget()
-                    )
+                    Box(Modifier.focusRequester(child1).focusTarget())
+                    Box(Modifier.focusRequester(child2).focusTarget())
                 }
             }
         }
diff --git a/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/focus/RequestFocusExitTest.kt b/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/focus/RequestFocusExitTest.kt
index 834b2a0..a9fe882 100644
--- a/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/focus/RequestFocusExitTest.kt
+++ b/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/focus/RequestFocusExitTest.kt
@@ -31,8 +31,7 @@
 @SmallTest
 @RunWith(AndroidJUnit4::class)
 class RequestFocusExitTest {
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
     @Test
     fun redirectingFocusExitFromChild1ToChild2_focusExitIsCalled() {
@@ -41,14 +40,9 @@
         var exitCount = 0
         rule.setFocusableContent {
             Box(Modifier.focusTarget()) {
+                Box(Modifier.focusRequester(destination).focusTarget())
                 Box(
-                    Modifier
-                        .focusRequester(destination)
-                        .focusTarget()
-                )
-                Box(
-                    Modifier
-                        .focusProperties {
+                    Modifier.focusProperties {
                             exit = {
                                 exitCount++
                                 child2
@@ -56,16 +50,8 @@
                         }
                         .focusTarget()
                 ) {
-                    Box(
-                        Modifier
-                            .focusRequester(child1)
-                            .focusTarget()
-                    )
-                    Box(
-                        Modifier
-                            .focusRequester(child2)
-                            .focusTarget()
-                    )
+                    Box(Modifier.focusRequester(child1).focusTarget())
+                    Box(Modifier.focusRequester(child2).focusTarget())
                 }
             }
         }
diff --git a/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/focus/RequestFocusTest.kt b/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/focus/RequestFocusTest.kt
index 2f3e151..5b84031 100644
--- a/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/focus/RequestFocusTest.kt
+++ b/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/focus/RequestFocusTest.kt
@@ -33,8 +33,7 @@
 @SmallTest
 @RunWith(AndroidJUnit4::class)
 class RequestFocusTest {
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
     @Test
     fun active_isUnchanged() {
@@ -43,8 +42,7 @@
         lateinit var focusState: FocusState
         rule.setFocusableContent {
             Box(
-                Modifier
-                    .focusRequester(focusRequester)
+                Modifier.focusRequester(focusRequester)
                     .onFocusChanged { focusState = it }
                     .focusTarget()
             )
@@ -52,14 +50,10 @@
         rule.runOnIdle { focusRequester.requestFocus() }
 
         // Act.
-        rule.runOnIdle {
-            focusRequester.requestFocus()
-        }
+        rule.runOnIdle { focusRequester.requestFocus() }
 
         // Assert.
-        rule.runOnIdle {
-            assertThat(focusState).isEqualTo(Active)
-        }
+        rule.runOnIdle { assertThat(focusState).isEqualTo(Active) }
     }
 
     @Test
@@ -70,8 +64,7 @@
         lateinit var focusState: FocusState
         rule.setFocusableContent {
             Box(
-                Modifier
-                    .focusRequester(focusRequester)
+                Modifier.focusRequester(focusRequester)
                     .onFocusChanged { focusState = it }
                     .focusTarget()
             )
@@ -82,14 +75,10 @@
         }
 
         // Act.
-        rule.runOnIdle {
-            focusRequester.requestFocus()
-        }
+        rule.runOnIdle { focusRequester.requestFocus() }
 
         // Assert.
-        rule.runOnIdle {
-            assertThat(focusState).isEqualTo(Captured)
-        }
+        rule.runOnIdle { assertThat(focusState).isEqualTo(Captured) }
     }
 
     @Test
@@ -98,23 +87,19 @@
         val focusRequester = FocusRequester()
         lateinit var focusState: FocusState
         rule.setFocusableContent {
-            Box(Modifier
-                .focusRequester(focusRequester)
-                .focusProperties { canFocus = false }
-                .onFocusChanged { focusState = it }
-                .focusTarget()
+            Box(
+                Modifier.focusRequester(focusRequester)
+                    .focusProperties { canFocus = false }
+                    .onFocusChanged { focusState = it }
+                    .focusTarget()
             )
         }
 
         // Act.
-        rule.runOnIdle {
-            focusRequester.requestFocus()
-        }
+        rule.runOnIdle { focusRequester.requestFocus() }
 
         // Assert.
-        rule.runOnIdle {
-            assertThat(focusState).isEqualTo(Inactive)
-        }
+        rule.runOnIdle { assertThat(focusState).isEqualTo(Inactive) }
     }
 
     @Test
@@ -126,25 +111,21 @@
         lateinit var focusState: FocusState
         rule.setFocusableContent {
             Box(
-                Modifier
-                    .focusRequester(focusRequester)
+                Modifier.focusRequester(focusRequester)
                     .onFocusChanged { focusState = it }
-                    .focusTarget()) {
+                    .focusTarget()
+            ) {
                 Box(
-                    Modifier
-                        .focusRequester(initialFocus)
+                    Modifier.focusRequester(initialFocus)
                         .onFocusChanged { childFocusState = it }
-                        .focusTarget())
+                        .focusTarget()
+                )
             }
         }
-        rule.runOnIdle {
-            initialFocus.requestFocus()
-        }
+        rule.runOnIdle { initialFocus.requestFocus() }
 
         // Act.
-        rule.runOnIdle {
-            focusRequester.requestFocus()
-        }
+        rule.runOnIdle { focusRequester.requestFocus() }
 
         // Assert.
         rule.runOnIdle {
@@ -162,28 +143,22 @@
         lateinit var childFocusState: FocusState
         rule.setFocusableContent {
             Box(
-                Modifier
-                    .focusRequester(focusRequester)
+                Modifier.focusRequester(focusRequester)
                     .focusProperties { canFocus = false }
                     .onFocusChanged { focusState = it }
                     .focusTarget()
             ) {
                 Box(
-                    Modifier
-                        .focusRequester(initialFocus)
+                    Modifier.focusRequester(initialFocus)
                         .onFocusChanged { childFocusState = it }
                         .focusTarget()
                 )
             }
         }
-        rule.runOnIdle {
-            initialFocus.requestFocus()
-        }
+        rule.runOnIdle { initialFocus.requestFocus() }
 
         // Act.
-        rule.runOnIdle {
-            focusRequester.requestFocus()
-        }
+        rule.runOnIdle { focusRequester.requestFocus() }
 
         // Assert.
         rule.runOnIdle {
@@ -204,34 +179,24 @@
         lateinit var grandChildFocusState: FocusState
         rule.setFocusableContent {
             Box(
-                Modifier
-                    .focusRequester(focusRequester)
+                Modifier.focusRequester(focusRequester)
                     .focusProperties { canFocus = false }
                     .onFocusChanged { focusState = it }
                     .focusTarget()
             ) {
                 Box(
-                    Modifier
-                        .focusRequester(initialFocus)
+                    Modifier.focusRequester(initialFocus)
                         .onFocusChanged { childFocusState = it }
                         .focusTarget()
                 ) {
-                    Box(
-                        Modifier
-                            .onFocusChanged { grandChildFocusState = it }
-                            .focusTarget()
-                    )
+                    Box(Modifier.onFocusChanged { grandChildFocusState = it }.focusTarget())
                 }
             }
         }
-        rule.runOnIdle {
-            initialFocus.requestFocus()
-        }
+        rule.runOnIdle { initialFocus.requestFocus() }
 
         // Act.
-        rule.runOnIdle {
-            focusRequester.requestFocus()
-        }
+        rule.runOnIdle { focusRequester.requestFocus() }
 
         // Assert.
         rule.runOnIdle {
@@ -248,22 +213,17 @@
         lateinit var focusState: FocusState
         rule.setFocusableContent {
             Box(
-                Modifier
-                    .focusRequester(focusRequester)
+                Modifier.focusRequester(focusRequester)
                     .onFocusChanged { focusState = it }
                     .focusTarget()
             )
         }
 
         // Act.
-        rule.runOnIdle {
-            focusRequester.requestFocus()
-        }
+        rule.runOnIdle { focusRequester.requestFocus() }
 
         // Assert.
-        rule.runOnIdle {
-            assertThat(focusState).isEqualTo(Active)
-        }
+        rule.runOnIdle { assertThat(focusState).isEqualTo(Active) }
     }
 
     @Test
@@ -274,22 +234,16 @@
         lateinit var childFocusState: FocusState
         rule.setFocusableContent {
             Box(
-                Modifier
-                    .focusRequester(focusRequester)
+                Modifier.focusRequester(focusRequester)
                     .onFocusChanged { focusState = it }
                     .focusTarget()
             ) {
-                Box(
-                    Modifier
-                        .onFocusChanged { childFocusState = it }
-                        .focusTarget())
+                Box(Modifier.onFocusChanged { childFocusState = it }.focusTarget())
             }
         }
 
         // Act.
-        rule.runOnIdle {
-            focusRequester.requestFocus()
-        }
+        rule.runOnIdle { focusRequester.requestFocus() }
 
         // Assert.
         rule.runOnIdle {
@@ -308,31 +262,23 @@
         lateinit var parentFocusState: FocusState
         rule.setFocusableContent {
             Box(
-                Modifier
-                    .focusRequester(initialFocus)
+                Modifier.focusRequester(initialFocus)
                     .onFocusChanged { parentFocusState = it }
                     .focusTarget()
             ) {
                 Box(
-                    Modifier
-                        .focusRequester(focusRequester)
+                    Modifier.focusRequester(focusRequester)
                         .onFocusChanged { focusState = it }
                         .focusTarget()
                 ) {
-                    Box(
-                        Modifier
-                            .onFocusChanged { childFocusState = it }
-                            .focusTarget()
-                    )
+                    Box(Modifier.onFocusChanged { childFocusState = it }.focusTarget())
                 }
             }
         }
         rule.runOnIdle { initialFocus.requestFocus() }
 
         // Act.
-        rule.runOnIdle {
-            focusRequester.requestFocus()
-        }
+        rule.runOnIdle { focusRequester.requestFocus() }
 
         // Assert.
         rule.runOnIdle {
@@ -349,21 +295,17 @@
         lateinit var focusState: FocusState
         rule.setFocusableContent {
             Box(
-                Modifier
-                    .focusRequester(focusRequester)
+                Modifier.focusRequester(focusRequester)
                     .onFocusChanged { focusState = it }
-                    .focusTarget())
+                    .focusTarget()
+            )
         }
 
         // Act.
-        rule.runOnIdle {
-            focusRequester.requestFocus()
-        }
+        rule.runOnIdle { focusRequester.requestFocus() }
 
         // Assert.
-        rule.runOnIdle {
-            assertThat(focusState).isEqualTo(Active)
-        }
+        rule.runOnIdle { assertThat(focusState).isEqualTo(Active) }
     }
 
     @Test
@@ -373,8 +315,7 @@
         val focusRequester = FocusRequester()
         rule.setFocusableContent {
             Box(
-                Modifier
-                    .focusRequester(focusRequester)
+                Modifier.focusRequester(focusRequester)
                     .onFocusChanged { focusState = it }
                     .focusTarget()
             ) {
@@ -383,14 +324,10 @@
         }
 
         // Act.
-        rule.runOnIdle {
-            focusRequester.requestFocus()
-        }
+        rule.runOnIdle { focusRequester.requestFocus() }
 
         // Assert.
-        rule.runOnIdle {
-            assertThat(focusState).isEqualTo(Active)
-        }
+        rule.runOnIdle { assertThat(focusState).isEqualTo(Active) }
     }
 
     @Test
@@ -401,8 +338,7 @@
         rule.setFocusableContent {
             Box(Modifier.focusTarget()) {
                 Box(
-                    Modifier
-                        .focusRequester(focusRequester)
+                    Modifier.focusRequester(focusRequester)
                         .onFocusChanged { focusState = it }
                         .focusTarget()
                 ) {
@@ -412,14 +348,10 @@
         }
 
         // Act.
-        rule.runOnIdle {
-            focusRequester.requestFocus()
-        }
+        rule.runOnIdle { focusRequester.requestFocus() }
 
         // Assert.
-        rule.runOnIdle {
-            assertThat(focusState).isEqualTo(Active)
-        }
+        rule.runOnIdle { assertThat(focusState).isEqualTo(Active) }
     }
 
     @Test
@@ -429,27 +361,17 @@
         lateinit var focusState: FocusState
         rule.setFocusableContent {
             Box(Modifier.focusTarget()) {
-                Box(
-                    Modifier
-                        .onFocusChanged { focusState = it }
-                        .focusTarget()) {
-                    Box(
-                        Modifier
-                            .focusRequester(focusRequester)
-                            .focusTarget())
+                Box(Modifier.onFocusChanged { focusState = it }.focusTarget()) {
+                    Box(Modifier.focusRequester(focusRequester).focusTarget())
                 }
             }
         }
 
         // Act.
-        rule.runOnIdle {
-            focusRequester.requestFocus()
-        }
+        rule.runOnIdle { focusRequester.requestFocus() }
 
         // Assert.
-        rule.runOnIdle {
-            assertThat(focusState).isEqualTo(ActiveParent)
-        }
+        rule.runOnIdle { assertThat(focusState).isEqualTo(ActiveParent) }
     }
 
     @Test
@@ -461,23 +383,19 @@
             Box(Modifier.focusTarget()) {
                 Box(Modifier.focusTarget()) {
                     Box(
-                        Modifier
-                            .focusRequester(focusRequester)
+                        Modifier.focusRequester(focusRequester)
                             .onFocusChanged { focusState = it }
-                            .focusTarget())
+                            .focusTarget()
+                    )
                 }
             }
         }
 
         // Act.
-        rule.runOnIdle {
-            focusRequester.requestFocus()
-        }
+        rule.runOnIdle { focusRequester.requestFocus() }
 
         // Assert.
-        rule.runOnIdle {
-            assertThat(focusState).isEqualTo(Active)
-        }
+        rule.runOnIdle { assertThat(focusState).isEqualTo(Active) }
     }
 
     @Test
@@ -489,14 +407,12 @@
         lateinit var focusState: FocusState
         rule.setFocusableContent {
             Box(
-                Modifier
-                    .focusRequester(initialFocus)
+                Modifier.focusRequester(initialFocus)
                     .onFocusChanged { parentFocusState = it }
                     .focusTarget()
             ) {
                 Box(
-                    Modifier
-                        .focusRequester(focusRequester)
+                    Modifier.focusRequester(focusRequester)
                         .onFocusChanged { focusState = it }
                         .focusTarget()
                 )
@@ -505,9 +421,7 @@
         rule.runOnIdle { initialFocus.requestFocus() }
 
         // After executing requestFocus, siblingNode will be 'Active'.
-        rule.runOnIdle {
-            focusRequester.requestFocus()
-        }
+        rule.runOnIdle { focusRequester.requestFocus() }
 
         // Assert.
         rule.runOnIdle {
@@ -525,24 +439,21 @@
         lateinit var focusState: FocusState
         rule.setFocusableContent {
             Box(
-                Modifier
-                    .focusRequester(focusRequester)
+                Modifier.focusRequester(focusRequester)
                     .onFocusChanged { parentFocusState = it }
                     .focusTarget()
             ) {
                 Box(
-                    Modifier
-                        .focusRequester(initialFocus)
+                    Modifier.focusRequester(initialFocus)
                         .onFocusChanged { focusState = it }
-                        .focusTarget())
+                        .focusTarget()
+                )
             }
         }
         rule.runOnIdle { initialFocus.requestFocus() }
 
         // Act.
-        rule.runOnIdle {
-            focusRequester.requestFocus()
-        }
+        rule.runOnIdle { focusRequester.requestFocus() }
 
         // Assert.
         rule.runOnIdle {
@@ -560,14 +471,12 @@
         lateinit var childFocusState: FocusState
         rule.setFocusableContent {
             Box(
-                Modifier
-                    .focusRequester(focusRequester)
+                Modifier.focusRequester(focusRequester)
                     .onFocusChanged { focusState = it }
                     .focusTarget()
             ) {
                 Box(
-                    Modifier
-                        .focusRequester(initialFocus)
+                    Modifier.focusRequester(initialFocus)
                         .onFocusChanged { childFocusState = it }
                         .focusTarget()
                 )
@@ -579,9 +488,7 @@
         }
 
         // Act.
-        rule.runOnIdle {
-            focusRequester.requestFocus()
-        }
+        rule.runOnIdle { focusRequester.requestFocus() }
 
         // Assert.
         rule.runOnIdle {
@@ -600,20 +507,14 @@
         lateinit var siblingFocusState: FocusState
 
         rule.setFocusableContent {
-            Box(
-                Modifier
-                    .onFocusChanged { parentFocusState = it }
-                    .focusTarget()
-            ) {
+            Box(Modifier.onFocusChanged { parentFocusState = it }.focusTarget()) {
                 Box(
-                    Modifier
-                        .focusRequester(focusRequester)
+                    Modifier.focusRequester(focusRequester)
                         .onFocusChanged { focusState = it }
                         .focusTarget()
                 )
                 Box(
-                    Modifier
-                        .focusRequester(initialFocus)
+                    Modifier.focusRequester(initialFocus)
                         .onFocusChanged { siblingFocusState = it }
                         .focusTarget()
                 )
@@ -622,9 +523,7 @@
         rule.runOnIdle { initialFocus.requestFocus() }
 
         // Act.
-        rule.runOnIdle {
-            focusRequester.requestFocus()
-        }
+        rule.runOnIdle { focusRequester.requestFocus() }
 
         // Assert.
         rule.runOnIdle {
@@ -643,21 +542,17 @@
         lateinit var focusState: FocusState
         lateinit var siblingFocusState: FocusState
         rule.setFocusableContent {
-            Box(
-                Modifier
-                    .onFocusChanged { parentFocusState = it }
-                    .focusTarget()
-            ) {
+            Box(Modifier.onFocusChanged { parentFocusState = it }.focusTarget()) {
                 Box(
-                    Modifier
-                        .focusRequester(focusRequester)
+                    Modifier.focusRequester(focusRequester)
                         .onFocusChanged { focusState = it }
-                        .focusTarget())
+                        .focusTarget()
+                )
                 Box(
-                    Modifier
-                        .focusRequester(initialFocus)
+                    Modifier.focusRequester(initialFocus)
                         .onFocusChanged { siblingFocusState = it }
-                        .focusTarget())
+                        .focusTarget()
+                )
             }
         }
         rule.runOnIdle {
@@ -666,9 +561,7 @@
         }
 
         // Act.
-        rule.runOnIdle {
-            focusRequester.requestFocus()
-        }
+        rule.runOnIdle { focusRequester.requestFocus() }
 
         // Assert.
         rule.runOnIdle {
@@ -688,33 +581,23 @@
             Box(Modifier.focusTarget()) {
                 Box(Modifier.focusTarget()) {
                     Box(
-                        Modifier
-                            .focusRequester(focusRequester)
+                        Modifier.focusRequester(focusRequester)
                             .onFocusChanged { focusState = it }
                             .focusTarget()
                     )
                 }
                 Box(Modifier.focusTarget()) {
-                    Box(
-                        Modifier
-                            .focusRequester(initialFocus)
-                            .focusTarget())
+                    Box(Modifier.focusRequester(initialFocus).focusTarget())
                 }
             }
         }
-        rule.runOnIdle {
-            initialFocus.requestFocus()
-        }
+        rule.runOnIdle { initialFocus.requestFocus() }
 
         // Act.
-        rule.runOnIdle {
-            focusRequester.requestFocus()
-        }
+        rule.runOnIdle { focusRequester.requestFocus() }
 
         // Assert.
-        rule.runOnIdle {
-            assertThat(focusState).isEqualTo(Active)
-        }
+        rule.runOnIdle { assertThat(focusState).isEqualTo(Active) }
     }
 
     @Test
@@ -727,19 +610,13 @@
         lateinit var focusState: FocusState
         rule.setFocusableContent {
             Box(
-                Modifier
-                    .focusRequester(initialFocus)
+                Modifier.focusRequester(initialFocus)
                     .onFocusChanged { grandParentFocusState = it }
                     .focusTarget()
             ) {
-                Box(
-                    Modifier
-                        .onFocusChanged { parentFocusState = it }
-                        .focusTarget()
-                ) {
+                Box(Modifier.onFocusChanged { parentFocusState = it }.focusTarget()) {
                     Box(
-                        Modifier
-                            .focusRequester(focusRequester)
+                        Modifier.focusRequester(focusRequester)
                             .onFocusChanged { focusState = it }
                             .focusTarget()
                     )
@@ -749,9 +626,7 @@
         rule.runOnIdle { initialFocus.requestFocus() }
 
         // Act.
-        rule.runOnIdle {
-            focusRequester.requestFocus()
-        }
+        rule.runOnIdle { focusRequester.requestFocus() }
 
         // Assert.
         rule.runOnIdle {
diff --git a/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/focus/RestoreFocusTest.kt b/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/focus/RestoreFocusTest.kt
index f7c19b6..a9d1e23 100644
--- a/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/focus/RestoreFocusTest.kt
+++ b/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/focus/RestoreFocusTest.kt
@@ -33,8 +33,7 @@
 @MediumTest
 @RunWith(AndroidJUnit4::class)
 class RestoreFocusTest {
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
     @Test
     fun noSavedChild_doesNotRestoreChild() {
@@ -45,26 +44,15 @@
         lateinit var child2State: FocusState
         rule.setFocusableContent {
             focusManager = LocalFocusManager.current
-            Box(
-                Modifier
-                    .focusRequester(parent)
-                    .focusTarget()
-            ) {
+            Box(Modifier.focusRequester(parent).focusTarget()) {
                 key(1) {
                     Box(
-                        Modifier
-                            .focusRequester(child1)
+                        Modifier.focusRequester(child1)
                             .onFocusChanged { child1State = it }
                             .focusTarget()
                     )
                 }
-                key(2) {
-                    Box(
-                        Modifier
-                            .onFocusChanged { child2State = it }
-                            .focusTarget()
-                    )
-                }
+                key(2) { Box(Modifier.onFocusChanged { child2State = it }.focusTarget()) }
             }
         }
         rule.runOnIdle { child1.requestFocus() }
@@ -90,22 +78,11 @@
         lateinit var child2State: FocusState
         rule.setFocusableContent {
             focusManager = LocalFocusManager.current
-            Box(
-                Modifier
-                    .focusRequester(parent)
-                    .focusTarget()
-            ) {
-                key(1) {
-                    Box(
-                        Modifier
-                            .onFocusChanged { child1State = it }
-                            .focusTarget()
-                    )
-                }
+            Box(Modifier.focusRequester(parent).focusTarget()) {
+                key(1) { Box(Modifier.onFocusChanged { child1State = it }.focusTarget()) }
                 key(2) {
                     Box(
-                        Modifier
-                            .focusRequester(child2)
+                        Modifier.focusRequester(child2)
                             .onFocusChanged { child2State = it }
                             .focusTarget()
                     )
@@ -137,19 +114,10 @@
         lateinit var child2State: FocusState
         rule.setFocusableContent {
             focusManager = LocalFocusManager.current
-            Box(
-                Modifier
-                    .focusRequester(parent)
-                    .focusTarget()
-            ) {
+            Box(Modifier.focusRequester(parent).focusTarget()) {
+                Box(Modifier.onFocusChanged { child1State = it }.focusTarget())
                 Box(
-                    Modifier
-                        .onFocusChanged { child1State = it }
-                        .focusTarget()
-                )
-                Box(
-                    Modifier
-                        .focusRequester(child2)
+                    Modifier.focusRequester(child2)
                         .onFocusChanged { child2State = it }
                         .focusTarget()
                 )
@@ -180,19 +148,10 @@
         lateinit var grandChildState: FocusState
         rule.setFocusableContent {
             focusManager = LocalFocusManager.current
-            Box(
-                Modifier
-                    .focusRequester(parent)
-                    .focusTarget()
-            ) {
-                Box(
-                    Modifier
-                        .onFocusChanged { childState = it }
-                        .focusTarget()
-                ) {
+            Box(Modifier.focusRequester(parent).focusTarget()) {
+                Box(Modifier.onFocusChanged { childState = it }.focusTarget()) {
                     Box(
-                        Modifier
-                            .focusRequester(grandChild)
+                        Modifier.focusRequester(grandChild)
                             .onFocusChanged { grandChildState = it }
                             .focusTarget()
                     )
diff --git a/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/focus/ReusedFocusRequesterCaptureFocusTest.kt b/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/focus/ReusedFocusRequesterCaptureFocusTest.kt
index 1feafc4..b2ce8e8 100644
--- a/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/focus/ReusedFocusRequesterCaptureFocusTest.kt
+++ b/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/focus/ReusedFocusRequesterCaptureFocusTest.kt
@@ -29,8 +29,7 @@
 @MediumTest
 @RunWith(AndroidJUnit4::class)
 class ReusedFocusRequesterCaptureFocusTest {
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
     @Test
     fun oneActiveComponent_returnsTrue() {
@@ -39,8 +38,7 @@
         val focusRequester = FocusRequester()
         rule.setFocusableContent {
             Box(
-                Modifier
-                    .onFocusChanged { focusState = it }
+                Modifier.onFocusChanged { focusState = it }
                     .focusRequester(focusRequester)
                     .focusTarget()
             )
@@ -48,9 +46,7 @@
         rule.runOnIdle { focusRequester.requestFocus() }
 
         // Act.
-        val success = rule.runOnIdle {
-            focusRequester.captureFocus()
-        }
+        val success = rule.runOnIdle { focusRequester.captureFocus() }
 
         // Assert.
         rule.runOnIdle {
@@ -66,8 +62,7 @@
         val focusRequester = FocusRequester()
         rule.setFocusableContent {
             Box(
-                Modifier
-                    .onFocusChanged { focusState = it }
+                Modifier.onFocusChanged { focusState = it }
                     .focusRequester(focusRequester)
                     .focusTarget()
             )
@@ -94,17 +89,14 @@
         val focusRequester = FocusRequester()
         rule.setFocusableContent {
             Box(
-                Modifier
-                    .onFocusChanged { focusState = it }
+                Modifier.onFocusChanged { focusState = it }
                     .focusRequester(focusRequester)
                     .focusTarget()
             )
         }
 
         // Act.
-        val success = rule.runOnIdle {
-            focusRequester.captureFocus()
-        }
+        val success = rule.runOnIdle { focusRequester.captureFocus() }
 
         // Assert.
         rule.runOnIdle {
@@ -122,14 +114,12 @@
         val focusRequester = FocusRequester()
         rule.setFocusableContent {
             Box(
-                Modifier
-                    .onFocusChanged { focusState1 = it }
+                Modifier.onFocusChanged { focusState1 = it }
                     .focusRequester(focusRequester)
                     .focusTarget()
             )
             Box(
-                Modifier
-                    .onFocusChanged { focusState2 = it }
+                Modifier.onFocusChanged { focusState2 = it }
                     .focusRequester(initialFocus)
                     .focusRequester(focusRequester)
                     .focusTarget()
@@ -138,9 +128,7 @@
         rule.runOnIdle { initialFocus.requestFocus() }
 
         // Act.
-        val success = rule.runOnIdle {
-            focusRequester.captureFocus()
-        }
+        val success = rule.runOnIdle { focusRequester.captureFocus() }
 
         // Assert.
         rule.runOnIdle {
@@ -159,14 +147,12 @@
         val focusRequester = FocusRequester()
         rule.setFocusableContent {
             Box(
-                Modifier
-                    .onFocusChanged { focusState1 = it }
+                Modifier.onFocusChanged { focusState1 = it }
                     .focusRequester(focusRequester)
                     .focusTarget()
             )
             Box(
-                Modifier
-                    .onFocusChanged { focusState2 = it }
+                Modifier.onFocusChanged { focusState2 = it }
                     .focusRequester(initialFocus)
                     .focusRequester(focusRequester)
                     .focusTarget()
@@ -196,23 +182,19 @@
         val focusRequester = FocusRequester()
         rule.setFocusableContent {
             Box(
-                Modifier
-                    .onFocusChanged { focusState1 = it }
+                Modifier.onFocusChanged { focusState1 = it }
                     .focusRequester(focusRequester)
                     .focusTarget()
             )
             Box(
-                Modifier
-                    .onFocusChanged { focusState2 = it }
+                Modifier.onFocusChanged { focusState2 = it }
                     .focusRequester(focusRequester)
                     .focusTarget()
             )
         }
 
         // Act.
-        val success = rule.runOnIdle {
-            focusRequester.captureFocus()
-        }
+        val success = rule.runOnIdle { focusRequester.captureFocus() }
 
         // Assert.
         rule.runOnIdle {
diff --git a/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/focus/ReusedFocusRequesterFreeFocusTest.kt b/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/focus/ReusedFocusRequesterFreeFocusTest.kt
index f44e08a..8e55a99 100644
--- a/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/focus/ReusedFocusRequesterFreeFocusTest.kt
+++ b/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/focus/ReusedFocusRequesterFreeFocusTest.kt
@@ -29,8 +29,7 @@
 @MediumTest
 @RunWith(AndroidJUnit4::class)
 class ReusedFocusRequesterFreeFocusTest {
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
     @Test
     fun oneActiveComponent_returnsTrue() {
@@ -39,8 +38,7 @@
         val focusRequester = FocusRequester()
         rule.setFocusableContent {
             Box(
-                Modifier
-                    .onFocusChanged { focusState = it }
+                Modifier.onFocusChanged { focusState = it }
                     .focusRequester(focusRequester)
                     .focusTarget()
             )
@@ -48,9 +46,7 @@
         rule.runOnIdle { focusRequester.requestFocus() }
 
         // Act.
-        val success = rule.runOnIdle {
-            focusRequester.freeFocus()
-        }
+        val success = rule.runOnIdle { focusRequester.freeFocus() }
 
         // Assert.
         rule.runOnIdle {
@@ -66,8 +62,7 @@
         val focusRequester = FocusRequester()
         rule.setFocusableContent {
             Box(
-                Modifier
-                    .onFocusChanged { focusState = it }
+                Modifier.onFocusChanged { focusState = it }
                     .focusRequester(focusRequester)
                     .focusTarget()
             )
@@ -94,17 +89,14 @@
         val focusRequester = FocusRequester()
         rule.setFocusableContent {
             Box(
-                Modifier
-                    .onFocusChanged { focusState = it }
+                Modifier.onFocusChanged { focusState = it }
                     .focusRequester(focusRequester)
                     .focusTarget()
             )
         }
 
         // Act.
-        val success = rule.runOnIdle {
-            focusRequester.freeFocus()
-        }
+        val success = rule.runOnIdle { focusRequester.freeFocus() }
 
         // Assert.
         rule.runOnIdle {
@@ -122,14 +114,12 @@
         val focusRequester = FocusRequester()
         rule.setFocusableContent {
             Box(
-                Modifier
-                    .onFocusChanged { focusState1 = it }
+                Modifier.onFocusChanged { focusState1 = it }
                     .focusRequester(focusRequester)
                     .focusTarget()
             )
             Box(
-                Modifier
-                    .onFocusChanged { focusState2 = it }
+                Modifier.onFocusChanged { focusState2 = it }
                     .focusRequester(initialFocus)
                     .focusRequester(focusRequester)
                     .focusTarget()
@@ -138,9 +128,7 @@
         rule.runOnIdle { initialFocus.requestFocus() }
 
         // Act.
-        val success = rule.runOnIdle {
-            focusRequester.freeFocus()
-        }
+        val success = rule.runOnIdle { focusRequester.freeFocus() }
 
         // Assert.
         rule.runOnIdle {
@@ -159,14 +147,12 @@
         val focusRequester = FocusRequester()
         rule.setFocusableContent {
             Box(
-                Modifier
-                    .onFocusChanged { focusState1 = it }
+                Modifier.onFocusChanged { focusState1 = it }
                     .focusRequester(focusRequester)
                     .focusTarget()
             )
             Box(
-                Modifier
-                    .onFocusChanged { focusState2 = it }
+                Modifier.onFocusChanged { focusState2 = it }
                     .focusRequester(initialFocus)
                     .focusRequester(focusRequester)
                     .focusTarget()
@@ -178,9 +164,7 @@
         }
 
         // Act.
-        val success = rule.runOnIdle {
-            focusRequester.freeFocus()
-        }
+        val success = rule.runOnIdle { focusRequester.freeFocus() }
 
         // Assert.
         rule.runOnIdle {
@@ -198,23 +182,19 @@
         val focusRequester = FocusRequester()
         rule.setFocusableContent {
             Box(
-                Modifier
-                    .onFocusChanged { focusState1 = it }
+                Modifier.onFocusChanged { focusState1 = it }
                     .focusRequester(focusRequester)
                     .focusTarget()
             )
             Box(
-                Modifier
-                    .onFocusChanged { focusState2 = it }
+                Modifier.onFocusChanged { focusState2 = it }
                     .focusRequester(focusRequester)
                     .focusTarget()
             )
         }
 
         // Act.
-        val success = rule.runOnIdle {
-            focusRequester.freeFocus()
-        }
+        val success = rule.runOnIdle { focusRequester.freeFocus() }
 
         // Assert.
         rule.runOnIdle {
diff --git a/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/focus/ReusedFocusRequesterTest.kt b/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/focus/ReusedFocusRequesterTest.kt
index 1e34391..2f6ed9d 100644
--- a/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/focus/ReusedFocusRequesterTest.kt
+++ b/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/focus/ReusedFocusRequesterTest.kt
@@ -29,8 +29,7 @@
 @MediumTest
 @RunWith(AndroidJUnit4::class)
 class ReusedFocusRequesterTest {
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
     @Test
     fun oneComponent() {
@@ -39,10 +38,10 @@
         val focusRequester = FocusRequester()
         rule.setFocusableContent {
             Box(
-                modifier = Modifier
-                    .onFocusChanged { focusState = it }
-                    .focusRequester(focusRequester)
-                    .focusTarget()
+                modifier =
+                    Modifier.onFocusChanged { focusState = it }
+                        .focusRequester(focusRequester)
+                        .focusTarget()
             )
         }
 
@@ -63,16 +62,16 @@
         val focusRequester = FocusRequester()
         rule.setFocusableContent {
             Box(
-                modifier = Modifier
-                    .onFocusChanged { focusState1 = it }
-                    .focusRequester(focusRequester)
-                    .focusTarget()
+                modifier =
+                    Modifier.onFocusChanged { focusState1 = it }
+                        .focusRequester(focusRequester)
+                        .focusTarget()
             )
             Box(
-                modifier = Modifier
-                    .onFocusChanged { focusState2 = it }
-                    .focusRequester(focusRequester)
-                    .focusTarget()
+                modifier =
+                    Modifier.onFocusChanged { focusState2 = it }
+                        .focusRequester(focusRequester)
+                        .focusTarget()
             )
         }
 
@@ -95,22 +94,22 @@
         val focusRequester = FocusRequester()
         rule.setFocusableContent {
             Box(
-                modifier = Modifier
-                    .onFocusChanged { focusState1 = it }
-                    .focusRequester(focusRequester)
-                    .focusTarget()
+                modifier =
+                    Modifier.onFocusChanged { focusState1 = it }
+                        .focusRequester(focusRequester)
+                        .focusTarget()
             )
             Box(
-                modifier = Modifier
-                    .onFocusChanged { focusState2 = it }
-                    .focusRequester(focusRequester)
-                    .focusTarget()
+                modifier =
+                    Modifier.onFocusChanged { focusState2 = it }
+                        .focusRequester(focusRequester)
+                        .focusTarget()
             )
             Box(
-                modifier = Modifier
-                    .onFocusChanged { focusState3 = it }
-                    .focusRequester(focusRequester)
-                    .focusTarget()
+                modifier =
+                    Modifier.onFocusChanged { focusState3 = it }
+                        .focusRequester(focusRequester)
+                        .focusTarget()
             )
         }
 
diff --git a/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/focus/TwoDimensionalFocusTraversalEnterTest.kt b/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/focus/TwoDimensionalFocusTraversalEnterTest.kt
index dbe4f1f..d182d9f 100644
--- a/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/focus/TwoDimensionalFocusTraversalEnterTest.kt
+++ b/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/focus/TwoDimensionalFocusTraversalEnterTest.kt
@@ -36,8 +36,7 @@
 @MediumTest
 @RunWith(AndroidJUnit4::class)
 class TwoDimensionalFocusTraversalEnterTest {
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
     private lateinit var focusManager: FocusManager
     private val initialFocus: FocusRequester = FocusRequester()
@@ -145,9 +144,7 @@
         val (child, grandchild) = List(2) { mutableStateOf(false) }
         rule.setContentForTest {
             FocusableBox(focusedItem, 0, 0, 30, 30, initialFocus) {
-                FocusableBox(child, 10, 10, 10, 10) {
-                    FocusableBox(grandchild, 10, 10, 10, 10)
-                }
+                FocusableBox(child, 10, 10, 10, 10) { FocusableBox(grandchild, 10, 10, 10, 10) }
             }
         }
 
@@ -308,10 +305,7 @@
         rule.runOnIdle {
             assertThat(movedFocusSuccessfully).isTrue()
             assertThat(focusedItem.value).isFalse()
-            assertThat(children.values).isExactly(
-                true, false, false,
-                false, false, false
-            )
+            assertThat(children.values).isExactly(true, false, false, false, false, false)
         }
     }
 
@@ -348,10 +342,7 @@
         rule.runOnIdle {
             assertThat(movedFocusSuccessfully).isTrue()
             assertThat(focusedItem.value).isFalse()
-            assertThat(children.values).isExactly(
-                false, false, false,
-                true, false, false
-            )
+            assertThat(children.values).isExactly(false, false, false, true, false, false)
         }
     }
 
@@ -390,10 +381,7 @@
         rule.runOnIdle {
             assertThat(movedFocusSuccessfully).isTrue()
             assertThat(focusedItem.value).isFalse()
-            assertThat(children.values).isExactly(
-                false, false, false,
-                true, false, false
-            )
+            assertThat(children.values).isExactly(false, false, false, true, false, false)
         }
     }
 
@@ -406,4 +394,5 @@
     }
 }
 
-private val List<MutableState<Boolean>>.values get() = this.map { it.value }
+private val List<MutableState<Boolean>>.values
+    get() = this.map { it.value }
diff --git a/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/focus/TwoDimensionalFocusTraversalExitTest.kt b/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/focus/TwoDimensionalFocusTraversalExitTest.kt
index dc6b92d..126a5fb 100644
--- a/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/focus/TwoDimensionalFocusTraversalExitTest.kt
+++ b/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/focus/TwoDimensionalFocusTraversalExitTest.kt
@@ -39,8 +39,7 @@
 @MediumTest
 @RunWith(AndroidJUnit4::class)
 class TwoDimensionalFocusTraversalExitTest {
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
     private lateinit var focusManager: FocusManager
     private val initialFocus: FocusRequester = FocusRequester()
@@ -54,9 +53,7 @@
     @Test
     fun moveFocusExit_noParent_focusStateUnchanged() {
         // Arrange.
-        rule.setContentForTest {
-            FocusableBox(focusedItem, 0, 0, 10, 10, initialFocus)
-        }
+        rule.setContentForTest { FocusableBox(focusedItem, 0, 0, 10, 10, initialFocus) }
 
         // Act.
         val movedFocusSuccessfully = rule.runOnIdle { focusManager.moveFocus(Exit) }
@@ -252,7 +249,8 @@
             FocusableBox(grandparent, 0, 0, 50, 50) {
                 val customExit = Modifier.focusProperties { exit = { otherItem } }
                 FocusableBox(parent, 10, 10, 30, 30, deactivated = true) {
-                    FocusableBox(focusedItem, 10, 10, 10, 10, initialFocus, modifier = customExit) }
+                    FocusableBox(focusedItem, 10, 10, 10, 10, initialFocus, modifier = customExit)
+                }
             }
             FocusableBox(other, x = 0, y = 60, width = 10, height = 10, otherItem)
         }
@@ -290,9 +288,10 @@
             FocusableBox(grandparent, 0, 0, 50, 50) {
                 val customExit = Modifier.focusProperties { exit = { otherItem } }
                 FocusableBox(parent, 10, 10, 30, 30, deactivated = true) {
-                    FocusableBox(focusedItem, 10, 10, 10, 10, initialFocus, modifier = customExit) }
+                    FocusableBox(focusedItem, 10, 10, 10, 10, initialFocus, modifier = customExit)
                 }
-                FocusableBox(other, x = 0, y = 60, width = 10, height = 10, otherItem)
+            }
+            FocusableBox(other, x = 0, y = 60, width = 10, height = 10, otherItem)
         }
 
         // Act.
@@ -441,15 +440,9 @@
     }
 
     /**
-     *    ___________________________
-     *   |  grandparent             |
-     *   |   _____________________  |
-     *   |  |  parent            |  |
-     *   |  |   _______________  |  |   ____________
-     *   |  |  | focusedItem  |  |  |  | nextItem  |
-     *   |  |  |______________|  |  |  |___________|
-     *   |  |____________________|  |
-     *   |__________________________|
+     * ___________________________ | grandparent | | _____________________ | | | parent | | | |
+     * _______________ | | ____________ | | | focusedItem | | | | nextItem | | | |______________| |
+     * | |___________| | |____________________| | |__________________________|
      */
     @Test
     fun moveFocusRight_focusesOnSiblingOfGrandparent() {
@@ -748,15 +741,12 @@
     }
 
     /**
-     *    _________________________________________________________
-     *   |   parent                                               |
-     *   |   _______________   _______________   _______________  |
-     *   |  | focusedItem  |  |    item1     |  |    item2     |  |
-     *   |  |______________|  |______________|  |______________|  |
-     *   |________________________________________________________|
-     *       _______________   _______________   _______________
-     *      |    item3     |  |    item4     |  |    item5     |
-     *      |______________|  |______________|  |______________|
+     * _________________________________________________________ | parent | | _______________
+     * _______________ _______________ | | | focusedItem | | item1 | | item2 | | | |______________|
+     * |______________| |______________| |
+     * |________________________________________________________| _______________ _______________
+     * _______________ | item3 | | item4 | | item5 | |______________| |______________|
+     * |______________|
      */
     @Test
     fun moveFocusDown_fromBottommostItem_movesFocusOutsideParent() {
@@ -791,15 +781,12 @@
     }
 
     /**
-     *    _________________________________________________________
-     *   |   parent                                               |
-     *   |   _______________   _______________   _______________  |
-     *   |  | focusedItem  |  |    item1     |  |    item2     |  |
-     *   |  |______________|  |______________|  |______________|  |
-     *   |________________________________________________________|
-     *       _______________   _______________   _______________
-     *      |    item3     |  |    item4     |  |    item5     |
-     *      |______________|  |______________|  |______________|
+     * _________________________________________________________ | parent | | _______________
+     * _______________ _______________ | | | focusedItem | | item1 | | item2 | | | |______________|
+     * |______________| |______________| |
+     * |________________________________________________________| _______________ _______________
+     * _______________ | item3 | | item4 | | item5 | |______________| |______________|
+     * |______________|
      */
     @Test
     fun moveFocusDown_fromBottommostItem_movesFocusOutsideDeactivatedParent() {
diff --git a/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/focus/TwoDimensionalFocusTraversalImplicitEnterTest.kt b/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/focus/TwoDimensionalFocusTraversalImplicitEnterTest.kt
index 487357d..ecc3c04 100644
--- a/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/focus/TwoDimensionalFocusTraversalImplicitEnterTest.kt
+++ b/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/focus/TwoDimensionalFocusTraversalImplicitEnterTest.kt
@@ -46,8 +46,7 @@
 @RunWith(Parameterized::class)
 class TwoDimensionalFocusTraversalImplicitEnterTest(param: Param) {
 
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
     private lateinit var focusManager: FocusManager
     private val focusDirection = param.focusDirection
@@ -77,18 +76,19 @@
         val children = List(6) { mutableStateOf(false) }
         var (upItem, downItem, leftItem, rightItem) = FocusRequester.createRefs()
         val (child1, child2, child3, child4) = FocusRequester.createRefs()
-        val customFocusEnter = Modifier.focusProperties {
-            @OptIn(ExperimentalComposeUiApi::class)
-            enter = {
-                when (it) {
-                    Left -> child1
-                    Up -> child2
-                    Down -> child3
-                    Right -> child4
-                    else -> error("Invalid Direction")
+        val customFocusEnter =
+            Modifier.focusProperties {
+                @OptIn(ExperimentalComposeUiApi::class)
+                enter = {
+                    when (it) {
+                        Left -> child1
+                        Up -> child2
+                        Down -> child3
+                        Right -> child4
+                        else -> error("Invalid Direction")
+                    }
                 }
             }
-        }
         when (focusDirection) {
             Left -> rightItem = initialFocus
             Right -> leftItem = initialFocus
@@ -117,22 +117,13 @@
         rule.runOnIdle {
             assertThat(movedFocusSuccessfully).isTrue()
             when (focusDirection) {
-                Left -> assertThat(children.values).isExactly(
-                    false, true, false,
-                    false, false, false
-                )
-                Up -> assertThat(children.values).isExactly(
-                    false, false, true,
-                    false, false, false
-                )
-                Down -> assertThat(children.values).isExactly(
-                    false, false, false,
-                    true, false, false
-                )
-                Right -> assertThat(children.values).isExactly(
-                    false, false, false,
-                    false, true, false
-                )
+                Left ->
+                    assertThat(children.values).isExactly(false, true, false, false, false, false)
+                Up -> assertThat(children.values).isExactly(false, false, true, false, false, false)
+                Down ->
+                    assertThat(children.values).isExactly(false, false, false, true, false, false)
+                Right ->
+                    assertThat(children.values).isExactly(false, false, false, false, true, false)
             }
         }
     }
@@ -159,12 +150,13 @@
         var (upItem, downItem, leftItem, rightItem, childItem) = FocusRequester.createRefs()
         var directionSentToEnter: FocusDirection? = null
         @OptIn(ExperimentalComposeUiApi::class)
-        val customFocusEnter = Modifier.focusProperties {
-            enter = {
-                directionSentToEnter = it
-                Cancel
+        val customFocusEnter =
+            Modifier.focusProperties {
+                enter = {
+                    directionSentToEnter = it
+                    Cancel
+                }
             }
-        }
         when (focusDirection) {
             Left -> rightItem = initialFocus
             Right -> leftItem = initialFocus
@@ -215,22 +207,13 @@
      *                                              |
      *               moveFocus(Left)                |                moveFocus(Right)
      *                                              |
+     *
      * ---------------------------------------------|--------------------------------------------
-     *                                              |                   __________
-     *                                              |                  | focused |
-     *                                              |                  |_________|
-     *               ________________               |                ________________
-     *              |  parent       |               |               |  parent       |
-     *   _________  |   _________   |   _________   |   _________   |   _________   |    _________
-     *  |  Left  |  |  | child0 |   |  |  Right |   |  |  Left  |   |  | child0 |   |   |  Right |
-     *  |________|  |  |________|   |  |________|   |  |________|   |  |________|   |   |________|
-     *              |_______________|               |               |_______________|
-     *                  __________                  |
-     *                 | focused |                  |
-     *                 |_________|                  |
-     *                                              |
-     *                moveFocus(Up)                 |                moveFocus(Down)
-     *                                              |
+     * | __________ | | focused | | |_________| ________________ | ________________ | parent | | |
+     * parent | _________ | _________ | _________ | _________ | _________ | _________ | Left | | |
+     * child0 | | | Right | | | Left | | | child0 | | | Right | |________| | |________| | |________|
+     * | |________| | |________| | |________| |_______________| | |_______________| __________ | |
+     * focused | | |_________| | | moveFocus(Up) | moveFocus(Down) |
      */
     @Test
     fun moveFocusEnter_blockFocusChange_appropriateOtherItemIsFocused() {
@@ -240,12 +223,13 @@
         var (upItem, downItem, leftItem, rightItem, childItem) = FocusRequester.createRefs()
         var directionSentToEnter: FocusDirection? = null
         @OptIn(ExperimentalComposeUiApi::class)
-        val customFocusEnter = Modifier.focusProperties {
-            enter = {
-                directionSentToEnter = it
-                Cancel
+        val customFocusEnter =
+            Modifier.focusProperties {
+                enter = {
+                    directionSentToEnter = it
+                    Cancel
+                }
             }
-        }
         when (focusDirection) {
             Left -> rightItem = initialFocus
             Right -> leftItem = initialFocus
@@ -308,12 +292,7 @@
         rule.setContentForTest {
             FocusableBox(up, 30, 0, 10, 10, upItem)
             FocusableBox(left, 0, 30, 10, 10, leftItem)
-            LazyRow(
-                Modifier
-                    .offset { IntOffset(30, 30) }
-                    .width(10.dp)
-                    .height(10.dp)
-            ) {}
+            LazyRow(Modifier.offset { IntOffset(30, 30) }.width(10.dp).height(10.dp)) {}
             FocusableBox(right, 100, 30, 10, 10, rightItem)
             FocusableBox(down, 30, 90, 10, 10, downItem)
         }
@@ -325,7 +304,9 @@
         rule.runOnIdle {
             assertThat(movedFocusSuccessfully).isTrue()
             when (focusDirection) {
-                Left, Up, Down -> assertThat(left.value).isTrue()
+                Left,
+                Up,
+                Down -> assertThat(left.value).isTrue()
                 Right -> assertThat(right.value).isTrue()
             }
         }
@@ -336,9 +317,7 @@
      *                |   Up   |
      *                |________|
      *
-     *   _________     _________    _________
-     *  |  Left  |    |  item  |   |  Right |
-     *  |________|    |________|   |________|
+     * _________ _________ _________ | Left | | item | | Right | |________| |________| |________|
      *
      *                 _________    _________
      *                |  Down  |   | Other  |
@@ -399,4 +378,5 @@
     }
 }
 
-private val List<MutableState<Boolean>>.values get() = this.map { it.value }
+private val List<MutableState<Boolean>>.values
+    get() = this.map { it.value }
diff --git a/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/focus/TwoDimensionalFocusTraversalImplicitExitTest.kt b/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/focus/TwoDimensionalFocusTraversalImplicitExitTest.kt
index 7fd0cb5..b0bc350 100644
--- a/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/focus/TwoDimensionalFocusTraversalImplicitExitTest.kt
+++ b/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/focus/TwoDimensionalFocusTraversalImplicitExitTest.kt
@@ -41,8 +41,7 @@
 @RunWith(Parameterized::class)
 class TwoDimensionalFocusTraversalImplicitExitTest(param: Param) {
 
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
     private lateinit var focusManager: FocusManager
     private val focusDirection = param.focusDirection
@@ -76,22 +75,22 @@
             FocusableBox(other, x = 20, y = 40, width = 10, height = 10, otherItem)
         }
 
-            // Act.
-            val movedFocusSuccessfully = rule.runOnIdle { focusManager.moveFocus(focusDirection) }
+        // Act.
+        val movedFocusSuccessfully = rule.runOnIdle { focusManager.moveFocus(focusDirection) }
 
-            // Assert.
-            rule.runOnIdle {
-                assertThat(movedFocusSuccessfully).isTrue()
-                assertThat(focusedItem.value).isFalse()
-                assertThat(other.value).isFalse()
-                when (focusDirection) {
-                    Left -> assertThat(left.value).isTrue()
-                    Right -> assertThat(right.value).isTrue()
-                    Up -> assertThat(top.value).isTrue()
-                    Down -> assertThat(bottom.value).isTrue()
-                    else -> error("Invalid FocusDirection")
-                }
+        // Assert.
+        rule.runOnIdle {
+            assertThat(movedFocusSuccessfully).isTrue()
+            assertThat(focusedItem.value).isFalse()
+            assertThat(other.value).isFalse()
+            when (focusDirection) {
+                Left -> assertThat(left.value).isTrue()
+                Right -> assertThat(right.value).isTrue()
+                Up -> assertThat(top.value).isTrue()
+                Down -> assertThat(bottom.value).isTrue()
+                else -> error("Invalid FocusDirection")
             }
+        }
     }
 
     /**
@@ -110,7 +109,6 @@
      *                         ________________         __________
      *                        |      top      |        |  other  |
      *                        |_______________|        |_________|
-     *
      */
     @Test
     fun implicitExit_deactivatedParentCanRedirectExit() {
@@ -123,14 +121,16 @@
             FocusableBox(top, x = 40, y = 0, width = 10, height = 10)
             FocusableBox(left, x = 0, y = 40, width = 10, height = 10, otherItem)
             FocusableBox(grandparent, 20, 20, 50, 50) {
-                val customExit = Modifier.focusProperties {
-                    exit = {
-                        receivedFocusDirection = it
-                        otherItem
+                val customExit =
+                    Modifier.focusProperties {
+                        exit = {
+                            receivedFocusDirection = it
+                            otherItem
+                        }
                     }
-                }
                 FocusableBox(parent, 10, 10, 30, 30, deactivated = true, modifier = customExit) {
-                    FocusableBox(focusedItem, 10, 10, 10, 10, initialFocus) }
+                    FocusableBox(focusedItem, 10, 10, 10, 10, initialFocus)
+                }
             }
             FocusableBox(right, x = 80, y = 40, width = 10, height = 10)
             FocusableBox(bottom, x = 40, y = 80, width = 10, height = 10)
@@ -170,14 +170,16 @@
         var receivedFocusDirection: FocusDirection? = null
         rule.setContentForTest {
             FocusableBox(grandparent, 0, 0, 50, 50, otherItem) {
-                val customExit = Modifier.focusProperties {
-                    exit = {
-                        receivedFocusDirection = it
-                        otherItem
+                val customExit =
+                    Modifier.focusProperties {
+                        exit = {
+                            receivedFocusDirection = it
+                            otherItem
+                        }
                     }
-                }
                 FocusableBox(parent, 10, 10, 30, 30, deactivated = true, modifier = customExit) {
-                    FocusableBox(focusedItem, 10, 10, 10, 10, initialFocus) }
+                    FocusableBox(focusedItem, 10, 10, 10, 10, initialFocus)
+                }
             }
         }
 
@@ -258,9 +260,7 @@
         val (up, down, left, right, parent) = List(5) { mutableStateOf(false) }
         val (upItem, downItem, leftItem, rightItem) = FocusRequester.createRefs()
 
-        val customFocusExit = Modifier
-            .focusProperties { exit = { Cancel } }
-            .focusGroup()
+        val customFocusExit = Modifier.focusProperties { exit = { Cancel } }.focusGroup()
 
         rule.setContentForTest {
             FocusableBox(up, 30, 0, 10, 10, upItem)
@@ -287,18 +287,9 @@
     }
 
     /**
-     *   _________        _________
-     *  |  dest  |       |   Up   |
-     *  |________|       |________|
-     *                 ________________
-     *                |  parent       |
-     *   _________    |   _________   |    _________
-     *  |  Left  |    |  | source |   |   |  Right |
-     *  |________|    |  |________|   |   |________|
-     *                |_______________|
-     *                    _________
-     *                   |  Down  |
-     *                   |________|
+     * _________ _________ | dest | | Up | |________| |________| ________________ | parent |
+     * _________ | _________ | _________ | Left | | | source | | | Right | |________| | |________| |
+     * |________| |_______________| _________ | Down | |________|
      */
     @Test
     fun moveFocusExit_redirectExit() {
@@ -308,14 +299,14 @@
         val (up, down, left, right) = List(4) { mutableStateOf(false) }
         val (upItem, downItem, leftItem, rightItem) = FocusRequester.createRefs()
 
-        val customFocusExit = Modifier
-            .focusProperties {
-                exit = {
-                    initialFocus.requestFocus()
-                    Cancel
+        val customFocusExit =
+            Modifier.focusProperties {
+                    exit = {
+                        initialFocus.requestFocus()
+                        Cancel
+                    }
                 }
-            }
-            .focusGroup()
+                .focusGroup()
 
         rule.setContentForTest {
             FocusableBox(dest, 0, 0, 10, 10, destItem)
@@ -366,9 +357,7 @@
         val (up, down, left, right) = List(4) { mutableStateOf(false) }
         val (upItem, downItem, leftItem, rightItem) = FocusRequester.createRefs()
 
-        val customFocusExit = Modifier
-            .focusProperties { exit = { Cancel } }
-            .focusGroup()
+        val customFocusExit = Modifier.focusProperties { exit = { Cancel } }.focusGroup()
 
         rule.setContentForTest {
             FocusableBox(up, 40, 0, 10, 10, upItem)
@@ -397,18 +386,9 @@
     }
 
     /**
-     *   _________            _________
-     *  |  dest  |           |   Up   |
-     *  |________|           |________|
-     *                  _____________________
-     *                 | grandparent+parent |
-     *   _________     |      _________     |    _________
-     *  |  Left  |     |     | source |     |   |  Right |
-     *  |________|     |     |________|     |   |________|
-     *                 |____________________|
-     *                        _________
-     *                       |  Down  |
-     *                       |________|
+     * _________ _________ | dest | | Up | |________| |________| _____________________ |
+     * grandparent+parent | _________ | _________ | _________ | Left | | | source | | | Right |
+     * |________| | |________| | |________| |____________________| _________ | Down | |________|
      */
     @Test
     fun moveFocusExit_multipleParents_redirectExit() {
@@ -418,15 +398,15 @@
         val (up, down, left, right) = List(4) { mutableStateOf(false) }
         val (upItem, downItem, leftItem, rightItem) = FocusRequester.createRefs()
 
-        val customFocusExit = Modifier
-            .focusGroup()
-            .focusProperties {
-                exit = {
-                    initialFocus.requestFocus()
-                    Cancel
+        val customFocusExit =
+            Modifier.focusGroup()
+                .focusProperties {
+                    exit = {
+                        initialFocus.requestFocus()
+                        Cancel
+                    }
                 }
-            }
-            .focusGroup()
+                .focusGroup()
 
         rule.setContentForTest {
             FocusableBox(dest, 0, 0, 10, 10, destItem)
diff --git a/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/focus/TwoDimensionalFocusTraversalInitialFocusTest.kt b/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/focus/TwoDimensionalFocusTraversalInitialFocusTest.kt
index a08a472..b9ac766 100644
--- a/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/focus/TwoDimensionalFocusTraversalInitialFocusTest.kt
+++ b/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/focus/TwoDimensionalFocusTraversalInitialFocusTest.kt
@@ -42,8 +42,7 @@
 @MediumTest
 @RunWith(Parameterized::class)
 class TwoDimensionalFocusTraversalInitialFocusTest(param: Param) {
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
     // We need to wrap the inline class parameter in another class because Java can't instantiate
     // the inline class.
@@ -78,9 +77,7 @@
         }
 
         // Act.
-        val movedFocusSuccessfully = rule.runOnIdle {
-            focusManager.moveFocus(focusDirection)
-        }
+        val movedFocusSuccessfully = rule.runOnIdle { focusManager.moveFocus(focusDirection) }
 
         // Assert.
         rule.runOnIdle {
@@ -120,34 +117,24 @@
         }
 
         // Act.
-        val movedFocusSuccessfully = rule.runOnIdle {
-            focusManager.moveFocus(focusDirection)
-        }
+        val movedFocusSuccessfully = rule.runOnIdle { focusManager.moveFocus(focusDirection) }
 
         // Assert.
         rule.runOnIdle {
             assertThat(movedFocusSuccessfully).isTrue()
             when (focusDirection) {
-                Up -> assertThat(isFocused.values).isExactly(
-                    false, false, false,
-                    false, false, false,
-                    false, false, true
-                )
-                Down -> assertThat(isFocused.values).isExactly(
-                    false, true, false,
-                    false, false, false,
-                    false, false, false
-                )
-                Left -> assertThat(isFocused.values).isExactly(
-                    false, false, false,
-                    false, false, false,
-                    false, false, true
-                )
-                Right -> assertThat(isFocused.values).isExactly(
-                    false, false, false,
-                    true, false, false,
-                    false, false, false
-                )
+                Up ->
+                    assertThat(isFocused.values)
+                        .isExactly(false, false, false, false, false, false, false, false, true)
+                Down ->
+                    assertThat(isFocused.values)
+                        .isExactly(false, true, false, false, false, false, false, false, false)
+                Left ->
+                    assertThat(isFocused.values)
+                        .isExactly(false, false, false, false, false, false, false, false, true)
+                Right ->
+                    assertThat(isFocused.values)
+                        .isExactly(false, false, false, true, false, false, false, false, false)
                 else -> error(invalid)
             }
         }
@@ -157,14 +144,10 @@
     fun initialFocus_whenThereIsOnlyOneFocusable() {
         // Arrange.
         val isFocused = mutableStateOf(false)
-        rule.setContentForTest {
-            FocusableBox(isFocused)
-        }
+        rule.setContentForTest { FocusableBox(isFocused) }
 
         // Act.
-        val movedFocusSuccessfully = rule.runOnIdle {
-            focusManager.moveFocus(focusDirection)
-        }
+        val movedFocusSuccessfully = rule.runOnIdle { focusManager.moveFocus(focusDirection) }
 
         // Assert.
         rule.runOnIdle {
@@ -176,37 +159,25 @@
     @Test
     fun doesNotCrash_whenThereIsNoFocusable() {
         // Arrange.
-        rule.setContentForTest {
-            BasicText("Hello")
-        }
+        rule.setContentForTest { BasicText("Hello") }
 
         // Act.
-        val movedFocusSuccessfully = rule.runOnIdle {
-            focusManager.moveFocus(focusDirection)
-        }
+        val movedFocusSuccessfully = rule.runOnIdle { focusManager.moveFocus(focusDirection) }
 
         // Assert.
-        rule.runOnIdle {
-            assertThat(movedFocusSuccessfully).isFalse()
-        }
+        rule.runOnIdle { assertThat(movedFocusSuccessfully).isFalse() }
     }
 
     @Test
     fun doesNotCrash_whenThereIsOneDeactivatedItem() {
         // Arrange.
-        rule.setContentForTest {
-            FocusableBox(deactivated = true)
-        }
+        rule.setContentForTest { FocusableBox(deactivated = true) }
 
         // Act.
-        val movedFocusSuccessfully = rule.runOnIdle {
-            focusManager.moveFocus(focusDirection)
-        }
+        val movedFocusSuccessfully = rule.runOnIdle { focusManager.moveFocus(focusDirection) }
 
         // Assert.
-        rule.runOnIdle {
-            assertThat(movedFocusSuccessfully).isFalse()
-        }
+        rule.runOnIdle { assertThat(movedFocusSuccessfully).isFalse() }
     }
 
     private fun ComposeContentTestRule.setContentForTest(composable: @Composable () -> Unit) {
@@ -227,4 +198,5 @@
     FocusableBox(isFocused, 0, 0, 10, 10, focusRequester, deactivated, Modifier, content)
 }
 
-private val MutableList<MutableState<Boolean>>.values get() = this.map { it.value }
+private val MutableList<MutableState<Boolean>>.values
+    get() = this.map { it.value }
diff --git a/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/focus/TwoDimensionalFocusTraversalTest.kt b/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/focus/TwoDimensionalFocusTraversalTest.kt
index 7d3d165..74c1517 100644
--- a/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/focus/TwoDimensionalFocusTraversalTest.kt
+++ b/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/focus/TwoDimensionalFocusTraversalTest.kt
@@ -43,8 +43,7 @@
 @MediumTest
 @RunWith(Parameterized::class)
 class TwoDimensionalFocusTraversalTest(param: Param) {
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
     // We need to wrap the inline class parameter in another class because Java can't instantiate
     // the inline class.
@@ -68,15 +67,19 @@
         // Arrange.
         val isFocused = MutableList(2) { mutableStateOf(false) }
         val (item1, item2) = FocusRequester.createRefs()
-        initialFocus = when (focusDirection) {
-            Up, Left -> item2
-            Down, Right -> item1
-            else -> error(invalid)
-        }
-        val siblings = @Composable {
-            FocusableBox(isFocused[0], item1)
-            FocusableBox(isFocused[1], item2)
-        }
+        initialFocus =
+            when (focusDirection) {
+                Up,
+                Left -> item2
+                Down,
+                Right -> item1
+                else -> error(invalid)
+            }
+        val siblings =
+            @Composable {
+                FocusableBox(isFocused[0], item1)
+                FocusableBox(isFocused[1], item2)
+            }
         rule.setContentForTest {
             FocusableBox {
                 FocusableBox {
@@ -85,8 +88,10 @@
                             FocusableBox {
                                 FocusableBox {
                                     when (focusDirection) {
-                                        Up, Down -> Column { siblings() }
-                                        Left, Right -> Row { siblings() }
+                                        Up,
+                                        Down -> Column { siblings() }
+                                        Left,
+                                        Right -> Row { siblings() }
                                         else -> error(invalid)
                                     }
                                 }
@@ -104,8 +109,10 @@
         rule.runOnIdle {
             assertThat(movedFocusSuccessfully).isTrue()
             when (focusDirection) {
-                Up, Left -> assertThat(isFocused.values).isExactly(true, false)
-                Down, Right -> assertThat(isFocused.values).isExactly(false, true)
+                Up,
+                Left -> assertThat(isFocused.values).isExactly(true, false)
+                Down,
+                Right -> assertThat(isFocused.values).isExactly(false, true)
                 else -> error(invalid)
             }
         }
@@ -115,32 +122,33 @@
     fun movesFocusOutsideCurrentParent() {
         // Arrange.
         val isFocused = MutableList(2) { mutableStateOf(false) }
-        val content = @Composable {
-            FocusableBox(isFocused[0])
-            FocusableBox {
-                FocusableBox(focusRequester = initialFocus)
+        val content =
+            @Composable {
+                FocusableBox(isFocused[0])
+                FocusableBox { FocusableBox(focusRequester = initialFocus) }
+                FocusableBox(isFocused[1])
             }
-            FocusableBox(isFocused[1])
-        }
         rule.setContentForTest {
             when (focusDirection) {
-                Up, Down -> Column { content() }
-                Left, Right -> Row { content() }
+                Up,
+                Down -> Column { content() }
+                Left,
+                Right -> Row { content() }
                 else -> error(invalid)
             }
         }
 
         // Act.
-        val movedFocusSuccessfully = rule.runOnIdle {
-            focusManager.moveFocus(focusDirection)
-        }
+        val movedFocusSuccessfully = rule.runOnIdle { focusManager.moveFocus(focusDirection) }
 
         // Assert.
         rule.runOnIdle {
             assertThat(movedFocusSuccessfully).isTrue()
             when (focusDirection) {
-                Up, Left -> assertThat(isFocused.values).isExactly(true, false)
-                Down, Right -> assertThat(isFocused.values).isExactly(false, true)
+                Up,
+                Left -> assertThat(isFocused.values).isExactly(true, false)
+                Down,
+                Right -> assertThat(isFocused.values).isExactly(false, true)
                 else -> error(invalid)
             }
         }
@@ -151,34 +159,35 @@
         // Arrange.
         val isFocused = MutableList(2) { mutableStateOf(false) }
         val initialFocusValue = mutableStateOf(false)
-        val content = @Composable {
-            FocusableBox(isFocused[0])
-            FocusableBox(deactivated = true) {
-                FocusableBox(isFocused = initialFocusValue, focusRequester = initialFocus)
+        val content =
+            @Composable {
+                FocusableBox(isFocused[0])
+                FocusableBox(deactivated = true) {
+                    FocusableBox(isFocused = initialFocusValue, focusRequester = initialFocus)
+                }
+                FocusableBox(isFocused[1])
             }
-            FocusableBox(isFocused[1])
-        }
         rule.setContentForTest {
             when (focusDirection) {
-                Up, Down -> Column { content() }
-                Left, Right -> Row { content() }
+                Up,
+                Down -> Column { content() }
+                Left,
+                Right -> Row { content() }
                 else -> error(invalid)
             }
         }
 
         // Act.
-        val movedFocusSuccessfully = rule.runOnIdle {
-            focusManager.moveFocus(focusDirection)
-        }
+        val movedFocusSuccessfully = rule.runOnIdle { focusManager.moveFocus(focusDirection) }
 
         // Assert.
         rule.runOnIdle {
             assertThat(movedFocusSuccessfully).isTrue()
             when (focusDirection) {
-                Up, Left -> assertThat(isFocused.values)
-                    .isExactly(true, false)
-                Down, Right -> assertThat(isFocused.values)
-                    .isExactly(false, true)
+                Up,
+                Left -> assertThat(isFocused.values).isExactly(true, false)
+                Down,
+                Right -> assertThat(isFocused.values).isExactly(false, true)
                 else -> error(invalid)
             }
         }
@@ -188,32 +197,33 @@
     fun skipsChild() {
         // Arrange.
         val isFocused = MutableList(3) { mutableStateOf(false) }
-        val content = @Composable {
-            FocusableBox(isFocused[0])
-            FocusableBox(isFocused[1], focusRequester = initialFocus) {
-                FocusableBox()
+        val content =
+            @Composable {
+                FocusableBox(isFocused[0])
+                FocusableBox(isFocused[1], focusRequester = initialFocus) { FocusableBox() }
+                FocusableBox(isFocused[2])
             }
-            FocusableBox(isFocused[2])
-        }
         rule.setContentForTest {
             when (focusDirection) {
-                Up, Down -> Column { content() }
-                Left, Right -> Row { content() }
+                Up,
+                Down -> Column { content() }
+                Left,
+                Right -> Row { content() }
                 else -> error(invalid)
             }
         }
 
         // Act.
-        val movedFocusSuccessfully = rule.runOnIdle {
-            focusManager.moveFocus(focusDirection)
-        }
+        val movedFocusSuccessfully = rule.runOnIdle { focusManager.moveFocus(focusDirection) }
 
         // Assert.
         rule.runOnIdle {
             assertThat(movedFocusSuccessfully).isTrue()
             when (focusDirection) {
-                Up, Left -> assertThat(isFocused.values).isExactly(true, false, false)
-                Down, Right -> assertThat(isFocused.values).isExactly(false, false, true)
+                Up,
+                Left -> assertThat(isFocused.values).isExactly(true, false, false)
+                Down,
+                Right -> assertThat(isFocused.values).isExactly(false, false, true)
                 else -> error(invalid)
             }
         }
@@ -225,31 +235,33 @@
         val isFocused = MutableList(3) { mutableStateOf(false) }
         val childIsFocused = mutableStateOf(false)
         val (item1, item2) = FocusRequester.createRefs()
-        initialFocus = when (focusDirection) {
-            Up, Left -> item2
-            Down, Right -> item1
-            else -> error(invalid)
-        }
-        val content = @Composable {
-            FocusableBox(isFocused[0], item1)
-            FocusableBox(isFocused[1], deactivated = true) {
-                FocusableBox(childIsFocused)
+        initialFocus =
+            when (focusDirection) {
+                Up,
+                Left -> item2
+                Down,
+                Right -> item1
+                else -> error(invalid)
             }
-            FocusableBox(isFocused[2], item2)
-        }
+        val content =
+            @Composable {
+                FocusableBox(isFocused[0], item1)
+                FocusableBox(isFocused[1], deactivated = true) { FocusableBox(childIsFocused) }
+                FocusableBox(isFocused[2], item2)
+            }
 
         rule.setContentForTest {
             when (focusDirection) {
-                Up, Down -> Column { content() }
-                Left, Right -> Row { content() }
+                Up,
+                Down -> Column { content() }
+                Left,
+                Right -> Row { content() }
                 else -> error(invalid)
             }
         }
 
         // Act.
-        val movedFocusSuccessfully = rule.runOnIdle {
-            focusManager.moveFocus(focusDirection)
-        }
+        val movedFocusSuccessfully = rule.runOnIdle { focusManager.moveFocus(focusDirection) }
 
         // Assert.
         rule.runOnIdle {
@@ -263,16 +275,20 @@
         // Arrange.
         val isFocused = MutableList(3) { mutableStateOf(false) }
         val (item1, item3) = FocusRequester.createRefs()
-        initialFocus = when (focusDirection) {
-            Up, Left -> item3
-            Down, Right -> item1
-            else -> error(invalid)
-        }
-        val siblings = @Composable {
-            FocusableBox(isFocused[0], item1)
-            FocusableBox(isFocused[1], deactivated = true)
-            FocusableBox(isFocused[2], item3)
-        }
+        initialFocus =
+            when (focusDirection) {
+                Up,
+                Left -> item3
+                Down,
+                Right -> item1
+                else -> error(invalid)
+            }
+        val siblings =
+            @Composable {
+                FocusableBox(isFocused[0], item1)
+                FocusableBox(isFocused[1], deactivated = true)
+                FocusableBox(isFocused[2], item3)
+            }
 
         rule.setContentForTest {
             FocusableBox {
@@ -282,8 +298,10 @@
                             FocusableBox {
                                 FocusableBox {
                                     when (focusDirection) {
-                                        Up, Down -> Column { siblings() }
-                                        Left, Right -> Row { siblings() }
+                                        Up,
+                                        Down -> Column { siblings() }
+                                        Left,
+                                        Right -> Row { siblings() }
                                         else -> error(invalid)
                                     }
                                 }
@@ -295,16 +313,16 @@
         }
 
         // Act.
-        val movedFocusSuccessfully = rule.runOnIdle {
-            focusManager.moveFocus(focusDirection)
-        }
+        val movedFocusSuccessfully = rule.runOnIdle { focusManager.moveFocus(focusDirection) }
 
         // Assert.
         rule.runOnIdle {
             assertThat(movedFocusSuccessfully).isTrue()
             when (focusDirection) {
-                Up, Left -> assertThat(isFocused.values).isExactly(true, false, false)
-                Down, Right -> assertThat(isFocused.values).isExactly(false, false, true)
+                Up,
+                Left -> assertThat(isFocused.values).isExactly(true, false, false)
+                Down,
+                Right -> assertThat(isFocused.values).isExactly(false, false, true)
                 else -> error(invalid)
             }
         }
@@ -316,39 +334,43 @@
         val siblings = MutableList(3) { mutableStateOf(false) }
         rule.setContentForTest {
             when (focusDirection) {
-                Up, Down -> Box {
-                    FocusableBox(x = 0, y = 10)
-                    FocusableBox(x = 0, y = 0, height = 50) {
-                        FocusableBox(siblings[0], x = 0, y = 0)
-                        FocusableBox(siblings[1], initialFocus, x = 0, y = 20)
-                        FocusableBox(siblings[2], x = 0, y = 40)
+                Up,
+                Down ->
+                    Box {
+                        FocusableBox(x = 0, y = 10)
+                        FocusableBox(x = 0, y = 0, height = 50) {
+                            FocusableBox(siblings[0], x = 0, y = 0)
+                            FocusableBox(siblings[1], initialFocus, x = 0, y = 20)
+                            FocusableBox(siblings[2], x = 0, y = 40)
+                        }
+                        FocusableBox(x = 0, y = 30)
                     }
-                    FocusableBox(x = 0, y = 30)
-                }
-                Left, Right -> Box {
-                    FocusableBox(x = 10, y = 0)
-                    FocusableBox(x = 0, y = 0, width = 50) {
-                        FocusableBox(siblings[0], x = 0, y = 0)
-                        FocusableBox(siblings[1], initialFocus, x = 20, y = 0)
-                        FocusableBox(siblings[2], x = 40, y = 0)
+                Left,
+                Right ->
+                    Box {
+                        FocusableBox(x = 10, y = 0)
+                        FocusableBox(x = 0, y = 0, width = 50) {
+                            FocusableBox(siblings[0], x = 0, y = 0)
+                            FocusableBox(siblings[1], initialFocus, x = 20, y = 0)
+                            FocusableBox(siblings[2], x = 40, y = 0)
+                        }
+                        FocusableBox(x = 30, y = 0)
                     }
-                    FocusableBox(x = 30, y = 0)
-                }
                 else -> error(invalid)
             }
         }
 
         // Act.
-        val movedFocusSuccessfully = rule.runOnIdle {
-            focusManager.moveFocus(focusDirection)
-        }
+        val movedFocusSuccessfully = rule.runOnIdle { focusManager.moveFocus(focusDirection) }
 
         // Assert.
         rule.runOnIdle {
             assertThat(movedFocusSuccessfully).isTrue()
             when (focusDirection) {
-                Up, Left -> assertThat(siblings.values).isExactly(true, false, false)
-                Down, Right -> assertThat(siblings.values).isExactly(false, false, true)
+                Up,
+                Left -> assertThat(siblings.values).isExactly(true, false, false)
+                Down,
+                Right -> assertThat(siblings.values).isExactly(false, false, true)
                 else -> error(invalid)
             }
         }
@@ -360,39 +382,43 @@
         val siblings = MutableList(3) { mutableStateOf(false) }
         rule.setContentForTest {
             when (focusDirection) {
-                Up, Down -> Box {
-                    FocusableBox(x = 0, y = 10)
-                    FocusableBox(x = 0, y = 0, height = 50, deactivated = true) {
-                        FocusableBox(siblings[0], x = 0, y = 0)
-                        FocusableBox(siblings[1], initialFocus, x = 0, y = 20)
-                        FocusableBox(siblings[2], x = 0, y = 40)
+                Up,
+                Down ->
+                    Box {
+                        FocusableBox(x = 0, y = 10)
+                        FocusableBox(x = 0, y = 0, height = 50, deactivated = true) {
+                            FocusableBox(siblings[0], x = 0, y = 0)
+                            FocusableBox(siblings[1], initialFocus, x = 0, y = 20)
+                            FocusableBox(siblings[2], x = 0, y = 40)
+                        }
+                        FocusableBox(x = 0, y = 30)
                     }
-                    FocusableBox(x = 0, y = 30)
-                }
-                Left, Right -> Box {
-                    FocusableBox(x = 10, y = 0)
-                    FocusableBox(x = 0, y = 0, width = 50, deactivated = true) {
-                        FocusableBox(siblings[0], x = 0, y = 0)
-                        FocusableBox(siblings[1], initialFocus, x = 20, y = 0)
-                        FocusableBox(siblings[2], x = 40, y = 0)
+                Left,
+                Right ->
+                    Box {
+                        FocusableBox(x = 10, y = 0)
+                        FocusableBox(x = 0, y = 0, width = 50, deactivated = true) {
+                            FocusableBox(siblings[0], x = 0, y = 0)
+                            FocusableBox(siblings[1], initialFocus, x = 20, y = 0)
+                            FocusableBox(siblings[2], x = 40, y = 0)
+                        }
+                        FocusableBox(x = 30, y = 0)
                     }
-                    FocusableBox(x = 30, y = 0)
-                }
                 else -> error(invalid)
             }
         }
 
         // Act.
-        val movedFocusSuccessfully = rule.runOnIdle {
-            focusManager.moveFocus(focusDirection)
-        }
+        val movedFocusSuccessfully = rule.runOnIdle { focusManager.moveFocus(focusDirection) }
 
         // Assert.
         rule.runOnIdle {
             assertThat(movedFocusSuccessfully).isTrue()
             when (focusDirection) {
-                Up, Left -> assertThat(siblings.values).isExactly(true, false, false)
-                Down, Right -> assertThat(siblings.values).isExactly(false, false, true)
+                Up,
+                Left -> assertThat(siblings.values).isExactly(true, false, false)
+                Down,
+                Right -> assertThat(siblings.values).isExactly(false, false, true)
                 else -> error(invalid)
             }
         }
@@ -421,4 +447,5 @@
     FocusableBox(isFocused, x, y, width, height, focusRequester, deactivated, Modifier, content)
 }
 
-private val MutableList<MutableState<Boolean>>.values get() = this.map { it.value }
+private val MutableList<MutableState<Boolean>>.values
+    get() = this.map { it.value }
diff --git a/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/focus/TwoDimensionalFocusTraversalThreeItemsTest.kt b/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/focus/TwoDimensionalFocusTraversalThreeItemsTest.kt
index 414f89d..a18a73d 100644
--- a/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/focus/TwoDimensionalFocusTraversalThreeItemsTest.kt
+++ b/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/focus/TwoDimensionalFocusTraversalThreeItemsTest.kt
@@ -37,8 +37,7 @@
 
 @RunWith(Parameterized::class)
 class TwoDimensionalFocusTraversalThreeItemsTest(param: Param) {
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
     // We need to wrap the inline class parameter in another class because Java can't instantiate
     // the inline class.
@@ -57,31 +56,19 @@
     }
 
     /**
-     *   __________                    __________       *                            __________
-     *  |   Next  |                   |  Closer |       *              ^            |   Next  |
-     *  |   Item  |                   |   Item  |       *              |            |   Item  |
-     *  |_________|                   |_________|       *          Direction        |_________|
-     *                        ____________              *          of Search
-     *                       |  focused  |              *              |
-     *                       |    Item   |              *              |
-     *                       |___________|              *         ____________
-     *                                                  *        |  focused  |       __________
-     *                                                  *        |    Item   |      |  Closer |
-     *          <---- Direction of Search ---           *        |___________|      |  Item   |
-     *                                                  *                           |_________|
+     * __________ __________ * __________ | Next | | Closer | * ^ | Next | | Item | | Item | * | |
+     * Item | |_________| |_________| * Direction |_________| ____________ * of Search | focused | *
+     * | | Item | * | |___________| * ____________
+     * * | focused | __________
+     * * | Item | | Closer | <---- Direction of Search --- * |___________| | Item |
+     * * |_________|
      * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
-     *   __________                    _________        *                            __________
-     *  |  Closer |                   |  Next  |        *                           |  Closer |
-     *  |   Item  |                   |  Item  |        *         ____________      |   Item  |
-     *  |_________|                   |________|        *        |  focused  |      |_________|
-     *           ____________                           *        |    Item   |
-     *          |  focused  |                           *        |___________|
-     *          |    Item   |                           *
-     *          |___________|                           *              |              _________
-     *                                                  *          Direction         |  Next  |
-     *          ---- Direction of Search --->           *          of Search         |  Item  |
-     *                                                  *              |             |________|
-     *                                                  *              V
+     * __________ _________ * __________ | Closer | | Next | * | Closer | | Item | | Item | *
+     * ____________ | Item | |_________| |________| * | focused | |_________| ____________ * | Item
+     * | | focused | * |___________| | Item | * |___________| * | _________
+     * * Direction | Next | ---- Direction of Search ---> * of Search | Item |
+     * * | |________|
+     * * V
      */
     @MediumTest
     @Test
@@ -115,9 +102,7 @@
         }
 
         // Act.
-        rule.runOnIdle {
-            focusManager.moveFocus(focusDirection)
-        }
+        rule.runOnIdle { focusManager.moveFocus(focusDirection) }
 
         // Assert.
         rule.runOnIdle {
@@ -141,18 +126,12 @@
      *          <---- Direction of Search ---           *       |  Item   |    |___________|
      *                                                  *       |_________|
      * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
-     *           ____________                           *         __________
-     *          |  focused  |                           *        |  Closer |
-     *          |    Item   |                           *        |   Item  |     ____________
-     *          |___________|                           *        |_________|    |  focused  |
-     *    __________                    _________       *                       |    Item   |
-     *   |  Closer |                   |  Next  |       *                       |___________|
-     *   |   Item  |                   |  Item  |       *
-     *   |_________|                   |________|       *          _________          |
-     *                                                  *         |  Next  |      Direction
-     *          ---- Direction of Search --->           *         |  Item  |      of Search
-     *                                                  *         |________|          |
-     *                                                  *                             V
+     * ____________ * __________ | focused | * | Closer | | Item | * | Item | ____________
+     * |___________| * |_________| | focused | __________ _________ * | Item | | Closer | | Next | *
+     * |___________| | Item | | Item | * |_________| |________| * _________ |
+     * * | Next | Direction ---- Direction of Search ---> * | Item | of Search
+     * * |________| |
+     * * V
      */
     @LargeTest
     @Test
@@ -186,9 +165,7 @@
         }
 
         // Act.
-        rule.runOnIdle {
-            focusManager.moveFocus(focusDirection)
-        }
+        rule.runOnIdle { focusManager.moveFocus(focusDirection) }
 
         // Assert.
         rule.runOnIdle {
@@ -199,36 +176,18 @@
     }
 
     /**
-     *    _________                                     *   _________
-     *   |  Next  |                                     *  |  Next  |     ^
-     *   |  Item  |                                     *  |  Item  |     |
-     *   |________|                                     *  |________|  Direction
-     *                        ____________              *             of Search
-     *                       |  focused  |              *                 |
-     *                       |    Item   |              *                 |
-     *                       |___________|              *          ____________
-     *                               __________         *         |  focused  |
-     *                              |  Closer |         *         |    Item   |      __________
-     *                              |   Item  |         *         |___________|     |  Closer |
-     *                              |_________|         *                           |   Item  |
-     *          <---- Direction of Search ---           *                           |_________|
-     *                                                  *
+     * _________ * _________ | Next | * | Next | ^ | Item | * | Item | | |________| * |________|
+     * Direction ____________ * of Search | focused | * | | Item | * | |___________| * ____________
+     * __________ * | focused | | Closer | * | Item | __________ | Item | * |___________| | Closer |
+     * |_________| * | Item | <---- Direction of Search --- * |_________|
+     * *
      * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
-     *   __________                                     *                            __________
-     *  |  Closer |                                     *                           |  Closer |
-     *  |   Item  |                                     *           ____________    |   Item  |
-     *  |_________|                                     *          |  focused  |    |_________|
-     *          ____________                            *          |    Item   |
-     *         |  focused  |                            *          |___________|
-     *         |    Item   |                            *                 |
-     *         |___________|                            *   _________  Direction
-     *                                 _________        *  |  Next  |  of Search
-     *                                |  Next  |        *  |  Item  |     |
-     *                                |  Item  |        *  |________|     |
-     *                                |________|        *                 V
-     *          ---- Direction of Search --->           *
-     *                                                  *
-     *                                                  *
+     * __________ * __________ | Closer | * | Closer | | Item | * ____________ | Item |
+     * |_________| * | focused | |_________| ____________ * | Item | | focused | * |___________| |
+     * Item | * | |___________| * _________ Direction _________ * | Next | of Search | Next | * |
+     * Item | | | Item | * |________| | |________| * V ---- Direction of Search ---> *
+     * *
+     * *
      */
     @LargeTest
     @Test
@@ -262,9 +221,7 @@
         }
 
         // Act.
-        rule.runOnIdle {
-            focusManager.moveFocus(focusDirection)
-        }
+        rule.runOnIdle { focusManager.moveFocus(focusDirection) }
 
         // Assert.
         rule.runOnIdle {
@@ -290,21 +247,12 @@
      *          <---- Direction of Search ---           *  |_________|
      *                                                  *
      * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
-     *                                _________         *    __________
-     *                               |  Next  |         *   |  Closer |
-     *                               |  Item  |         *   |   Item  |   ____________
-     *                               |________|         *   |_________|  |  focused  |
-     *           ____________                           *                |    Item   |
-     *          |  focused  |                           *                |___________|
-     *          |    Item   |                           *                      |
-     *          |___________|                           *                  Direction    _________
-     *   __________                                     *                  of Search   |  Next  |
-     *  |  Closer |                                     *                      |       |  Item  |
-     *  |   Item  |                                     *                      |       |________|
-     *  |_________|                                     *                      V
-     *          ---- Direction of Search --->           *
-     *                                                  *
-     *                                                  *
+     * _________ * __________ | Next | * | Closer | | Item | * | Item | ____________ |________| *
+     * |_________| | focused | ____________ * | Item | | focused | * |___________| | Item | * |
+     * |___________| * Direction _________ __________ * of Search | Next | | Closer | * | | Item | |
+     * Item | * | |________| |_________| * V ---- Direction of Search ---> *
+     * *
+     * *
      */
     @LargeTest
     @Test
@@ -338,9 +286,7 @@
         }
 
         // Act.
-        rule.runOnIdle {
-            focusManager.moveFocus(focusDirection)
-        }
+        rule.runOnIdle { focusManager.moveFocus(focusDirection) }
 
         // Assert.
         rule.runOnIdle {
@@ -364,19 +310,13 @@
      *          <---- Direction of Search ---           *        |___________|
      *                                                  *
      * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
-     *                 __________                       *         ____________
-     *                |  Closer |                       *        |  focused  |
-     *                |   Item  |                       *        |    Item   |       __________
-     *                |_________|                       *        |___________|      |  Closer |
-     *         ____________         __________          *                           |   Item  |
-     *        |  focused  |        |  Item   |          *                           |_________|
-     *        |    Item   |        | in beam |          *
-     *        |___________|        |_________|          *         ____________
-     *                                                  *        |    Item   |          |
-     *          ---- Direction of Search --->           *        |  in beam  |      Direction
-     *                                                  *        |___________|      of Search
-     *                                                  *                               |
-     *                                                  *                               V
+     * __________ * ____________ | Closer | * | focused | | Item | * | Item | __________
+     * |_________| * |___________| | Closer | ____________ __________ * | Item | | focused | | Item
+     * | * |_________| | Item | | in beam | * |___________| |_________| * ____________
+     * * | Item | | ---- Direction of Search ---> * | in beam | Direction
+     * * |___________| of Search
+     * * |
+     * * V
      */
     @MediumTest
     @Test
@@ -410,9 +350,7 @@
         }
 
         // Act.
-        rule.runOnIdle {
-            focusManager.moveFocus(focusDirection)
-        }
+        rule.runOnIdle { focusManager.moveFocus(focusDirection) }
 
         // Assert.
         rule.runOnIdle {
@@ -436,19 +374,13 @@
      *          <---- Direction of Search ---           *       |___________|
      *                                                  *
      * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
-     *                 __________                       *        ____________
-     *                |  Closer |                       *       |  focused  |
-     *                |   Item  |                       *       |    Item   |        __________
-     *                |_________|                       *       |___________|       |  Closer |
-     *                              _______________     *                           |   Item  |
-     *         ____________        | Item in Beam |     *                           |_________|
-     *        |  focused  |        |______________|     *
-     *        |    Item   |                             *              _________
-     *        |___________|                             *             |  Item  |        |
-     *                                                  *             | in beam|    Direction
-     *          ---- Direction of Search --->           *             |________|    of Search
-     *                                                  *                               |
-     *                                                  *                               V
+     * __________ * ____________ | Closer | * | focused | | Item | * | Item | __________
+     * |_________| * |___________| | Closer | _______________ * | Item | ____________ | Item in Beam
+     * | * |_________| | focused | |______________| * | Item | * _________ |___________| * | Item |
+     * |
+     * * | in beam| Direction ---- Direction of Search ---> * |________| of Search
+     * * |
+     * * V
      */
     @LargeTest
     @Test
@@ -482,9 +414,7 @@
         }
 
         // Act.
-        rule.runOnIdle {
-            focusManager.moveFocus(focusDirection)
-        }
+        rule.runOnIdle { focusManager.moveFocus(focusDirection) }
 
         // Assert.
         rule.runOnIdle {
@@ -508,19 +438,13 @@
      *          <---- Direction of Search ---           *        |___________|
      *                                                  *
      * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
-     *                 __________                       *         ____________
-     *                |  Closer |                       *        |  focused  |
-     *                |   Item  |                       *        |    Item   |       __________
-     *                |_________|                       *        |___________|      |  Closer |
-     *         ____________          _______________    *                           |   Item  |
-     *        |  focused  |         | Item in Beam |    *                           |_________|
-     *        |    Item   |         |______________|    *
-     *        |___________|                             *            _________
-     *                                                  *           |  Item  |          |
-     *          ---- Direction of Search --->           *           | in beam|      Direction
-     *                                                  *           |________|      of Search
-     *                                                  *                               |
-     *                                                  *                               V
+     * __________ * ____________ | Closer | * | focused | | Item | * | Item | __________
+     * |_________| * |___________| | Closer | ____________ _______________ * | Item | | focused | |
+     * Item in Beam | * |_________| | Item | |______________| * |___________| * _________
+     * * | Item | | ---- Direction of Search ---> * | in beam| Direction
+     * * |________| of Search
+     * * |
+     * * V
      */
     @LargeTest
     @Test
@@ -554,9 +478,7 @@
         }
 
         // Act.
-        rule.runOnIdle {
-            focusManager.moveFocus(focusDirection)
-        }
+        rule.runOnIdle { focusManager.moveFocus(focusDirection) }
 
         // Assert.
         rule.runOnIdle {
@@ -580,19 +502,13 @@
      *          <---- Direction of Search ---           *        |___________|
      *                                                  *
      * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
-     *                 __________                       *         ____________
-     *                |  Closer |                       *        |  focused  |
-     *                |   Item  |                       *        |    Item   |       __________
-     *                |_________|                       *        |___________|      |  Closer |
-     *         ____________                             *                           |   Item  |
-     *        |           |           _______________   *                           |_________|
-     *        |  focused  |          | Item in Beam |   *
-     *        |    Item   |          |______________|   *            _______
-     *        |___________|                             *           | Item |            |
-     *                                                  *           |  in  |        Direction
-     *                                                  *           | Beam |        of Search
-     *         ---- Direction of Search --->            *           |______|            |
-     *                                                  *                               V
+     * __________ * ____________ | Closer | * | focused | | Item | * | Item | __________
+     * |_________| * |___________| | Closer | ____________ * | Item | | | _______________ *
+     * |_________| | focused | | Item in Beam | * | Item | |______________| * _______
+     * |___________| * | Item | |
+     * * | in | Direction
+     * * | Beam | of Search ---- Direction of Search ---> * |______| |
+     * * V
      */
     @LargeTest
     @Test
@@ -626,9 +542,7 @@
         }
 
         // Act.
-        rule.runOnIdle {
-            focusManager.moveFocus(focusDirection)
-        }
+        rule.runOnIdle { focusManager.moveFocus(focusDirection) }
 
         // Assert.
         rule.runOnIdle {
@@ -652,19 +566,13 @@
      *          <---- Direction of Search ---           *        |_____________|
      *                                                  *
      * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
-     *                 __________                       *         _____________
-     *                |  Closer |                       *        |   focused  |
-     *                |   Item  |                       *        |    Item    |       __________
-     *                |_________|                       *        |____________|      |  Closer |
-     *         ____________                             *                            |   Item  |
-     *        |  focused  |         _______________     *                            |_________|
-     *        |    Item   |        | Item in Beam |     *
-     *        |___________|        |______________|     *         _________
-     *                                                  *        |        |             |
-     *          ---- Direction of Search --->           *        |  Item  |         Direction
-     *                                                  *        | in beam|         of Search
-     *                                                  *        |        |             |
-     *                                                  *        |________|             V
+     * __________ * _____________ | Closer | * | focused | | Item | * | Item | __________
+     * |_________| * |____________| | Closer | ____________ * | Item | | focused | _______________ *
+     * |_________| | Item | | Item in Beam | * |___________| |______________| * _________
+     * * | | | ---- Direction of Search ---> * | Item | Direction
+     * * | in beam| of Search
+     * * | | |
+     * * |________| V
      */
     @LargeTest
     @Test
@@ -698,9 +606,7 @@
         }
 
         // Act.
-        rule.runOnIdle {
-            focusManager.moveFocus(focusDirection)
-        }
+        rule.runOnIdle { focusManager.moveFocus(focusDirection) }
 
         // Assert.
         rule.runOnIdle {
@@ -724,19 +630,12 @@
      *                                                  *         |    Item   |
      *          <---- Direction of Search ---           *         |___________|
      * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
-     *                 __________                       *          ____________
-     *                |  Closer |                       *         |  focused  |
-     *                |   Item  |                       *         |    Item   |      __________
-     *                |_________|                       *         |___________|     |  Closer |
-     *         ____________                             *                           |   Item  |
-     *        |  focused  |                             *                           |_________|
-     *        |    Item   |         _______________     *
-     *        |___________|        |              |     *      _________
-     *                             | Item in Beam |     *     |  Item   |                |
-     *                             |______________|     *     | in beam |            Direction
-     *                                                  *     |________ |            of Search
-     *         ---- Direction of Search --->            *                                |
-     *                                                  *                                V
+     * __________ * ____________ | Closer | * | focused | | Item | * | Item | __________
+     * |_________| * |___________| | Closer | ____________ * | Item | | focused | * |_________| |
+     * Item | _______________ * |___________| | | * _________ | Item in Beam | * | Item | |
+     * |______________| * | in beam | Direction
+     * * |________ | of Search ---- Direction of Search ---> * |
+     * * V
      */
     @LargeTest
     @Test
@@ -770,9 +669,7 @@
         }
 
         // Act.
-        rule.runOnIdle {
-            focusManager.moveFocus(focusDirection)
-        }
+        rule.runOnIdle { focusManager.moveFocus(focusDirection) }
 
         // Assert.
         rule.runOnIdle {
@@ -795,19 +692,14 @@
      *          <---- Direction of Search ---           *        |___________|
      *                                                  *
      * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
-     *                 __________                       *         ____________
-     *                |  Closer |                       *        |  focused  |
-     *                |   Item  |                       *        |    Item   |__________
-     *         _______|_________|   __________          *        |___________|  Closer |
-     *        |  focused  |        |  Item   |          *                    |   Item  |
-     *        |    Item   |        | in beam |          *                    |_________|
-     *        |___________|        |_________|          *
-     *                                                  *         ____________
-     *          ---- Direction of Search --->           *        |    Item   |          |
-     *                                                  *        |  in beam  |      Direction
-     *                                                  *        |___________|      of Search
-     *                                                  *                               |
-     *                                                  *                               V
+     * __________ * ____________ | Closer | * | focused | | Item | * | Item |__________
+     * _______|_________| __________ * |___________| Closer | | focused | | Item | * | Item | | Item
+     * | | in beam | * |_________| |___________| |_________| *
+     * * ____________ ---- Direction of Search ---> * | Item | |
+     * * | in beam | Direction
+     * * |___________| of Search
+     * * |
+     * * V
      */
     @LargeTest
     @Test
@@ -841,9 +733,7 @@
         }
 
         // Act.
-        rule.runOnIdle {
-            focusManager.moveFocus(focusDirection)
-        }
+        rule.runOnIdle { focusManager.moveFocus(focusDirection) }
 
         // Assert.
         rule.runOnIdle {
@@ -867,19 +757,14 @@
      *          <---- Direction of Search ---           *       |___________|
      *                                                  *
      * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
-     *            __________                            *        ____________
-     *           |  Closer |                            *       |  focused  |
-     *           |   Item  |        _______________     *       |    Item   |__________
-     *    _______|_________|       | Item in Beam |     *       |___________|  Closer |
-     *   |  focused  |             |______________|     *                   |   Item  |
-     *   |    Item   |                                  *                   |_________|
-     *   |___________|                                  *
-     *                                                  *              _________
-     *                                                  *             |  Item  |        |
-     *          ---- Direction of Search --->           *             | in beam|    Direction
-     *                                                  *             |________|    of Search
-     *                                                  *                               |
-     *                                                  *                               V
+     * __________ * ____________ | Closer | * | focused | | Item | _______________ * | Item
+     * |__________ _______|_________| | Item in Beam | * |___________| Closer | | focused |
+     * |______________| * | Item | | Item | * |_________| |___________| *
+     * * _________
+     * * | Item | | ---- Direction of Search ---> * | in beam| Direction
+     * * |________| of Search
+     * * |
+     * * V
      */
     @LargeTest
     @Test
@@ -913,9 +798,7 @@
         }
 
         // Act.
-        rule.runOnIdle {
-            focusManager.moveFocus(focusDirection)
-        }
+        rule.runOnIdle { focusManager.moveFocus(focusDirection) }
 
         // Assert.
         rule.runOnIdle {
@@ -939,19 +822,14 @@
      *                                                  *        |___________|
      *                                                  *
      * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
-     *                 __________                       *         ____________
-     *                |  Closer |                       *        |  focused  |
-     *                |   Item  |                       *        |    Item   |__________
-     *         _______|_________|    _______________    *        |___________|  Closer |
-     *        |  focused  |         | Item in Beam |    *                    |   Item  |
-     *        |    Item   |         |______________|    *                    |_________|
-     *        |___________|                             *
-     *                                                  *            _________
-     *                                                  *           |        |          |
-     *          ---- Direction of Search --->           *           |  Item  |      Direction
-     *                                                  *           | in beam|      of Search
-     *                                                  *           |________|          |
-     *                                                  *                               V
+     * __________ * ____________ | Closer | * | focused | | Item | * | Item |__________
+     * _______|_________| _______________ * |___________| Closer | | focused | | Item in Beam | * |
+     * Item | | Item | |______________| * |_________| |___________| *
+     * * _________
+     * * | | | ---- Direction of Search ---> * | Item | Direction
+     * * | in beam| of Search
+     * * |________| |
+     * * V
      */
     @LargeTest
     @Test
@@ -985,9 +863,7 @@
         }
 
         // Act.
-        rule.runOnIdle {
-            focusManager.moveFocus(focusDirection)
-        }
+        rule.runOnIdle { focusManager.moveFocus(focusDirection) }
 
         // Assert.
         rule.runOnIdle {
@@ -1011,19 +887,13 @@
      *                                                  *       |____________|
      *                                                  *
      * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
-     *                 __________                       *        _____________
-     *                |  Closer |                       *       |   focused  |
-     *                |   Item  |                       *       |     Item   |__________
-     *         _______|_________|                       *       |____________|  Closer |
-     *        |           |           _______________   *                    |   Item  |
-     *        |  focused  |          | Item in Beam |   *                    |_________|
-     *        |    Item   |          |______________|   *
-     *        |___________|                             *           _______
-     *                                                  *          | Item |            |
-     *                                                  *          |  in  |        Direction
-     *         ---- Direction of Search --->            *          | Beam |        of Search
-     *                                                  *          |______|            |
-     *                                                  *                              V
+     * __________ * _____________ | Closer | * | focused | | Item | * | Item |__________
+     * _______|_________| * |____________| Closer | | | _______________ * | Item | | focused | |
+     * Item in Beam | * |_________| | Item | |______________| * |___________| * _______
+     * * | Item | |
+     * * | in | Direction ---- Direction of Search ---> * | Beam | of Search
+     * * |______| |
+     * * V
      */
     @LargeTest
     @Test
@@ -1057,9 +927,7 @@
         }
 
         // Act.
-        rule.runOnIdle {
-            focusManager.moveFocus(focusDirection)
-        }
+        rule.runOnIdle { focusManager.moveFocus(focusDirection) }
 
         // Assert.
         rule.runOnIdle {
@@ -1083,19 +951,13 @@
      *          <---- Direction of Search ---           *        |____________|
      *                                                  *
      * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
-     *                                                  *         _____________
-     *                 __________                       *        |   focused  |
-     *                |  Closer |                       *        |    Item    |__________
-     *                |   Item  |                       *        |____________|  Closer |
-     *         _______|_________|                       *                     |   Item  |
-     *        |  focused  |         _______________     *                     |_________|
-     *        |    Item   |        | Item in Beam |     *
-     *        |___________|        |______________|     *         _________
-     *                                                  *        |        |             |
-     *          ---- Direction of Search --->           *        |  Item  |         Direction
-     *                                                  *        | in beam|         of Search
-     *                                                  *        |________|             |
-     *                                                  *                               V
+     *     * _____________ __________ * | focused | | Closer | * | Item |__________ | Item | *
+     *       |____________| Closer | _______|_________| * | Item | | focused | _______________ *
+     *       |_________| | Item | | Item in Beam | * |___________| |______________| * _________
+     *     * | | | ---- Direction of Search ---> * | Item | Direction
+     *     * | in beam| of Search
+     *     * |________| |
+     *     * V
      */
     @LargeTest
     @Test
@@ -1129,9 +991,7 @@
         }
 
         // Act.
-        rule.runOnIdle {
-            focusManager.moveFocus(focusDirection)
-        }
+        rule.runOnIdle { focusManager.moveFocus(focusDirection) }
 
         // Assert.
         rule.runOnIdle {
@@ -1154,19 +1014,13 @@
      *          <---- Direction of Search ---           *        |    Item   |_________|
      *                                                  *        |___________|
      * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
-     *            __________                            *         ____________
-     *           |  Closer |                            *        |  focused  |
-     *           |   Item  |                            *        |    Item   |__________
-     *    _______|_________|                            *        |___________|  Closer |
-     *   |  focused  |                                  *                    |   Item  |
-     *   |    Item   |              _______________     *                    |_________|
-     *   |___________|             | Item in Beam |     *
-     *                             |______________|     *    _________
-     *                                                  *   |  Item  |                  |
-     *         ---- Direction of Search --->            *   | in beam|              Direction
-     *                                                  *   |________|              of Search
-     *                                                  *                               |
-     *                                                  *                               V
+     * __________ * ____________ | Closer | * | focused | | Item | * | Item |__________
+     * _______|_________| * |___________| Closer | | focused | * | Item | | Item | _______________ *
+     * |_________| |___________| | Item in Beam | * |______________| * _________
+     * * | Item | | ---- Direction of Search ---> * | in beam| Direction
+     * * |________| of Search
+     * * |
+     * * V
      */
     @LargeTest
     @Test
@@ -1200,9 +1054,7 @@
         }
 
         // Act.
-        rule.runOnIdle {
-            focusManager.moveFocus(focusDirection)
-        }
+        rule.runOnIdle { focusManager.moveFocus(focusDirection) }
 
         // Assert.
         rule.runOnIdle {
@@ -1226,19 +1078,13 @@
      *          <---- Direction of Search ---           *                     |___________|
      *                                                  *
      * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
-     *                                                  *                      ____________
-     *         ____________            __________       *                     |  focused  |
-     *        |  focused  |           |  Item   |       *       __________    |    Item   |
-     *        |    Item   |           | in beam |       *      |  Closer |    |___________|
-     *        |___________|           |_________|       *      |   Item  |
-     *                 __________                       *      |_________|
-     *                |  Closer |                       *
-     *                |   Item  |                       *                      ____________
-     *                |_________|                       *          |          |    Item   |
-     *                                                  *      Direction      |  in beam  |
-     *        ---- Direction of Search --->             *      of Search      |___________|
-     *                                                  *          |
-     *                                                  *          V
+     *     * ____________ ____________ __________ * | focused | | focused | | Item | * __________ |
+     *       Item | | Item | | in beam | * | Closer | |___________| |___________| |_________| * |
+     *       Item | __________ * |_________| | Closer | * | Item | * ____________ |_________| * | |
+     *       Item |
+     *     * Direction | in beam | ---- Direction of Search ---> * of Search |___________|
+     *     * |
+     *     * V
      */
     @LargeTest
     @Test
@@ -1272,9 +1118,7 @@
         }
 
         // Act.
-        rule.runOnIdle {
-            focusManager.moveFocus(focusDirection)
-        }
+        rule.runOnIdle { focusManager.moveFocus(focusDirection) }
 
         // Assert.
         rule.runOnIdle {
@@ -1285,32 +1129,18 @@
     }
 
     /**
-     *   _______________                                *         ^                 _________
-     *  | Item in Beam |          ____________          *         |                |  Item  |
-     *  |______________|         |  focused  |          *      Direction           | in beam|
-     *                           |    Item   |          *      of Search           |________|
-     *                           |___________|          *         |
-     *                     ___________                  *         |
-     *                    |  Closer  |                  *      __________
-     *                    |   Item   |                  *     |  Closer |     ____________
-     *                    |__________|                  *     |  Item   |    |  focused  |
-     *                                                  *     |_________|    |    Item   |
-     *          <---- Direction of Search ---           *                    |___________|
-     *                                                  *
+     * _______________ * ^ _________ | Item in Beam | ____________ * | | Item | |______________| |
+     * focused | * Direction | in beam| | Item | * of Search |________| |___________| * |
+     * ___________ * | | Closer | * __________ | Item | * | Closer | ____________ |__________| * |
+     * Item | | focused |
+     * * |_________| | Item | <---- Direction of Search --- * |___________| *
      * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
-     *                                _______________   *                     ____________
-     *         ____________          | Item in Beam |   *                    |  focused  |
-     *        |  focused  |          |______________|   *     __________     |    Item   |
-     *        |    Item   |                             *    |  Closer |     |___________|
-     *        |___________|                             *    |   Item  |
-     *                  __________                      *    |_________|
-     *                 |  Closer |                      *
-     *                 |   Item  |                      *                           _________
-     *                 |_________|                      *        |                 |  Item  |
-     *                                                  *    Direction             | in beam|
-     *         ---- Direction of Search --->            *    of Search             |________|
-     *                                                  *        |
-     *                                                  *        V
+     * _______________ * ____________ ____________ | Item in Beam | * | focused | | focused |
+     * |______________| * __________ | Item | | Item | * | Closer | |___________| |___________| * |
+     * Item | __________ * |_________| | Closer | * | Item | * _________ |_________| * | | Item |
+     * * Direction | in beam| ---- Direction of Search ---> * of Search |________|
+     * * |
+     * * V
      */
     @LargeTest
     @Test
@@ -1344,9 +1174,7 @@
         }
 
         // Act.
-        rule.runOnIdle {
-            focusManager.moveFocus(focusDirection)
-        }
+        rule.runOnIdle { focusManager.moveFocus(focusDirection) }
 
         // Assert.
         rule.runOnIdle {
@@ -1370,20 +1198,13 @@
      *          <---- Direction of Search ---           *                   |___________|
      *                                                  *
      * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
-     *                                                  *                    ____________
-     *     ____________             _______________     *                   |  focused  |
-     *    |  focused  |            | Item in Beam |     *     __________    |    Item   |
-     *    |    Item   |            |______________|     *    |  Closer |    |___________|
-     *    |___________|                                 *    |   Item  |
-     *             __________                           *    |_________|
-     *            |  Closer |                           *
-     *            |   Item  |                           *                       _________
-     *            |_________|                           *         |            |  Item  |
-     *                                                  *     Direction        | in beam|
-     *         ---- Direction of Search --->            *     of Search        |________|
-     *                                                  *         |
-     *                                                  *         V
-     *
+     *     * ____________ ____________ _______________ * | focused | | focused | | Item in Beam | *
+     *       __________ | Item | | Item | |______________| * | Closer | |___________|
+     *       |___________| * | Item | __________ * |_________| | Closer | * | Item | * _________
+     *       |_________| * | | Item |
+     *     * Direction | in beam| ---- Direction of Search ---> * of Search |________|
+     *     * |
+     *     * V
      */
     @LargeTest
     @Test
@@ -1417,9 +1238,7 @@
         }
 
         // Act.
-        rule.runOnIdle {
-            focusManager.moveFocus(focusDirection)
-        }
+        rule.runOnIdle { focusManager.moveFocus(focusDirection) }
 
         // Assert.
         rule.runOnIdle {
@@ -1443,19 +1262,12 @@
      *          <---- Direction of Search ---           *                    |___________|
      *                                                  *
      * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
-     *      ____________                                *                    ____________
-     *     |           |              _______________   *                   |  focused  |
-     *     |  focused  |             | Item in Beam |   *     __________    |    Item   |
-     *     |    Item   |             |______________|   *    |  Closer |    |___________|
-     *     |___________|                                *    |   Item  |
-     *              __________                          *    |_________|
-     *             |  Closer |                          *
-     *             |   Item  |                          *                       _______
-     *             |_________|                          *        |             | Item |
-     *                                                  *    Direction         |  in  |
-     *           ---- Direction of Search --->          *    of Search         | Beam |
-     *                                                  *        |             |______|
-     *                                                  *        V
+     * ____________ * ____________ | | _______________ * | focused | | focused | | Item in Beam | *
+     * __________ | Item | | Item | |______________| * | Closer | |___________| |___________| * |
+     * Item | __________ * |_________| | Closer | * | Item | * _______ |_________| * | | Item |
+     * * Direction | in | ---- Direction of Search ---> * of Search | Beam |
+     * * | |______|
+     * * V
      */
     @LargeTest
     @Test
@@ -1489,9 +1301,7 @@
         }
 
         // Act.
-        rule.runOnIdle {
-            focusManager.moveFocus(focusDirection)
-        }
+        rule.runOnIdle { focusManager.moveFocus(focusDirection) }
 
         // Assert.
         rule.runOnIdle {
@@ -1515,19 +1325,13 @@
      *          <---- Direction of Search ---           *                        |____________|
      *                                                  *
      * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
-     *       ____________                               *                          _____________
-     *      |  focused  |           _______________     *                         |  focused   |
-     *      |    Item   |          | Item in Beam |     *        __________       |    Item    |
-     *      |___________|          |______________|     *       |  Closer |       |____________|
-     *             __________                           *       |   Item  |
-     *            |  Closer |                           *       |_________|
-     *            |   Item  |                           *
-     *            |_________|                           *                          _________
-     *                                                  *           |             |  Item  |
-     *        ---- Direction of Search --->             *       Direction         | in beam|
-     *                                                  *       of Search         |________|
-     *                                                  *           |
-     *                                                  *           V
+     * ____________ * _____________ | focused | _______________ * | focused | | Item | | Item in
+     * Beam | * __________ | Item | |___________| |______________| * | Closer | |____________|
+     * __________ * | Item | | Closer | * |_________| | Item | * |_________| * _________
+     * * | | Item | ---- Direction of Search ---> * Direction | in beam|
+     * * of Search |________|
+     * * |
+     * * V
      */
     @LargeTest
     @Test
@@ -1561,9 +1365,7 @@
         }
 
         // Act.
-        rule.runOnIdle {
-            focusManager.moveFocus(focusDirection)
-        }
+        rule.runOnIdle { focusManager.moveFocus(focusDirection) }
 
         // Assert.
         rule.runOnIdle {
@@ -1587,20 +1389,13 @@
      *          <---- Direction of Search ---           *                          |___________|
      *                                                  *
      * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
-     *        ____________                              *                           ____________
-     *       |  focused  |                              *                          |  focused  |
-     *       |    Item   |         _______________      *       __________         |    Item   |
-     *       |___________|        |              |      *      |  Closer |         |___________|
-     *                            | Item in Beam |      *      |   Item  |
-     *                            |______________|      *      |_________|
-     *                                                  *
-     *              __________                          *           |          __________
-     *             |  Closer |                          *       Direction     |  Item   |
-     *             |   Item  |                          *       of Search     | in beam |
-     *             |_________|                          *           |         |_________|
-     *                                                  *           V
-     *        ---- Direction of Search --->             *
-     *                                                  *
+     * ____________ * ____________ | focused | * | focused | | Item | _______________ * __________ |
+     * Item | |___________| | | * | Closer | |___________| | Item in Beam | * | Item |
+     * |______________| * |_________|
+     * *
+     * __________ * | __________ | Closer | * Direction | Item | | Item | * of Search | in beam |
+     * |_________| * | |_________|
+     * * V ---- Direction of Search ---> * *
      */
     @LargeTest
     @Test
@@ -1634,9 +1429,7 @@
         }
 
         // Act.
-        rule.runOnIdle {
-            focusManager.moveFocus(focusDirection)
-        }
+        rule.runOnIdle { focusManager.moveFocus(focusDirection) }
 
         // Assert.
         rule.runOnIdle {
@@ -1659,18 +1452,13 @@
      *          <---- Direction of Search ---           *        |    Item   |
      *                                                  *        |___________|
      * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
-     *                                                  *                   ____________
-     *                                                  *                  |  focused  |
-     *                                                  *          ________|    Item   |
-     *         ____________            __________       *         | Closer |___________|
-     *        |  focused  |           |  Item   |       *         |  Item  |
-     *        |    Item   |           | in beam |       *         |________|
-     *        |___________|______     |_________|       *                   ____________
-     *                |  Closer |                       *           |      |    Item   |
-     *                |   Item  |                       *       Direction  |  in beam  |
-     *                |_________|                       *       of Search  |___________|
-     *                                                  *           |
-     *         ---- Direction of Search --->            *           V
+     *     * ____________
+     *     * | focused |
+     *     * ________| Item | ____________ __________ * | Closer |___________| | focused | | Item
+     *       | * | Item | | Item | | in beam | * |________| |___________|______ |_________| *
+     *       ____________ | Closer | * | | Item | | Item | * Direction | in beam | |_________| * of
+     *       Search |___________|
+     *     * | ---- Direction of Search ---> * V
      */
     @LargeTest
     @Test
@@ -1704,9 +1492,7 @@
         }
 
         // Act.
-        rule.runOnIdle {
-            focusManager.moveFocus(focusDirection)
-        }
+        rule.runOnIdle { focusManager.moveFocus(focusDirection) }
 
         // Assert.
         rule.runOnIdle {
@@ -1730,18 +1516,12 @@
      *          <---- Direction of Search ---           *             |__________|
      *                                                  *
      * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
-     *                              _______________     *               ____________
-     *   ____________              | Item in Beam |     *              |  focused  |
-     *  |  focused  |              |______________|     *     _________|   Item    |
-     *  |    Item   |                                   *    |  Closer |___________|
-     *  |___________|______                             *    |   Item  |
-     *          |  Closer |                             *    |_________|
-     *          |   Item  |                             *
-     *          |_________|                             *         |            _________
-     *                                                  *     Direction       |  Item  |
-     *            ---- Direction of Search --->         *     of Search       | in beam|
-     *                                                  *         |           |________|
-     *                                                  *         V
+     * _______________ * ____________ ____________ | Item in Beam | * | focused | | focused |
+     * |______________| * _________| Item | | Item | * | Closer |___________| |___________|______ *
+     * | Item | | Closer | * |_________| | Item | * |_________| * | _________
+     * * Direction | Item | ---- Direction of Search ---> * of Search | in beam|
+     * * | |________|
+     * * V
      */
     @LargeTest
     @Test
@@ -1775,9 +1555,7 @@
         }
 
         // Act.
-        rule.runOnIdle {
-            focusManager.moveFocus(focusDirection)
-        }
+        rule.runOnIdle { focusManager.moveFocus(focusDirection) }
 
         // Assert.
         rule.runOnIdle {
@@ -1800,19 +1578,14 @@
      *          <---- Direction of Search ---           *                |      Item    |
      *                                                  *                |______________|
      * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
-     *                                                  *                 _______________
-     *                                                  *                |   focused    |
-     *                                                  *       _________|     Item     |
-     *    ____________            _______________       *      |  Closer |______________|
-     *   |  focused  |           | Item in Beam |       *      |   Item  |
-     *   |    Item   |           |______________|       *      |_________|
-     *   |___________|______                            *
-     *           |  Closer |                            *         |             _________
-     *           |   Item  |                            *     Direction        |  Item  |
-     *           |_________|                            *     of Search        | in beam|
-     *                                                  *         |            |________|
-     *                                                  *         V
-     *          ---- Direction of Search --->           *
+     *     * _______________
+     *     * | focused |
+     *     * _________| Item | ____________ _______________ * | Closer |______________| | focused |
+     *       | Item in Beam | * | Item | | Item | |______________| * |_________|
+     *       |___________|______ * | Closer | * | _________ | Item | * Direction | Item |
+     *       |_________| * of Search | in beam|
+     *     * | |________|
+     *     * V ---- Direction of Search ---> *
      */
     @LargeTest
     @Test
@@ -1846,9 +1619,7 @@
         }
 
         // Act.
-        rule.runOnIdle {
-            focusManager.moveFocus(focusDirection)
-        }
+        rule.runOnIdle { focusManager.moveFocus(focusDirection) }
 
         // Assert.
         rule.runOnIdle {
@@ -1872,18 +1643,12 @@
      *                                                  *              |     Item    |
      *                                                  *              |_____________|
      * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
-     *      ____________                                *               ______________
-     *     |           |              _______________   *              |   focused   |
-     *     |  focused  |             | Item in Beam |   *     _________|     Item    |
-     *     |    Item   |             |______________|   *    |  Closer |_____________|
-     *     |___________|______                          *    |   Item  |
-     *             |  Closer |                          *    |_________|
-     *             |   Item  |                          *
-     *             |_________|                          *                   _______         |
-     *                                                  *                  | Item |     Direction
-     *         ---- Direction of Search --->            *                  |  in  |     of Search
-     *                                                  *                  | Beam |         |
-     *                                                  *                  |______|         V
+     * ____________ * ______________ | | _______________ * | focused | | focused | | Item in Beam
+     * | * _________| Item | | Item | |______________| * | Closer |_____________|
+     * |___________|______ * | Item | | Closer | * |_________| | Item | * |_________| * _______ |
+     * * | Item | Direction ---- Direction of Search ---> * | in | of Search
+     * * | Beam | |
+     * * |______| V
      */
     @LargeTest
     @Test
@@ -1917,9 +1682,7 @@
         }
 
         // Act.
-        rule.runOnIdle {
-            focusManager.moveFocus(focusDirection)
-        }
+        rule.runOnIdle { focusManager.moveFocus(focusDirection) }
 
         // Assert.
         rule.runOnIdle {
@@ -1943,16 +1706,11 @@
      *          <---- Direction of Search ---           *             |___________|
      *                                                  *
      * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
-     *         ____________                             *              ____________
-     *        |  focused  |           _______________   *             |  focused  |
-     *        |    Item   |          | Item in Beam |   *    _________|    Item   |
-     *        |___________|______    |______________|   *   |  Closer |___________|
-     *                |  Closer |                       *   |   Item  |                     |
-     *                |   Item  |                       *   |_________|                 Direction
-     *                |_________|                       *              _________       of Search
-     *                                                  *             |  Item  |           |
-     *                                                  *             | in beam|           V
-     *       ---- Direction of Search --->              *             |________|
+     * ____________ * ____________ | focused | _______________ * | focused | | Item | | Item in Beam
+     * | * _________| Item | |___________|______ |______________| * | Closer |___________| | Closer
+     * | * | Item | | | Item | * |_________| Direction |_________| * _________ of Search
+     * * | Item | |
+     * * | in beam| V ---- Direction of Search ---> * |________|
      */
     @LargeTest
     @Test
@@ -1986,9 +1744,7 @@
         }
 
         // Act.
-        rule.runOnIdle {
-            focusManager.moveFocus(focusDirection)
-        }
+        rule.runOnIdle { focusManager.moveFocus(focusDirection) }
 
         // Assert.
         rule.runOnIdle {
@@ -2011,17 +1767,12 @@
      *          <---- Direction of Search ---           *   |_________|    Item   |
      *                                                  *             |___________|
      * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
-     *     ____________                                 *              ____________
-     *    |  focused  |                                 *             |  focused  |
-     *    |    Item   |            _______________      *    _________|    Item   |
-     *    |___________|______     | Item in Beam |      *   |  Closer |___________|
-     *            |  Closer |     |______________|      *   |   Item  |
-     *            |   Item  |                           *   |_________|
-     *            |_________|                           *                               |
-     *                                                  *          _________        Direction
-     *         ---- Direction of Search --->            *         |  Item  |        of Search
-     *                                                  *         | in beam|            |
-     *                                                  *         |________|            V
+     * ____________ * ____________ | focused | * | focused | | Item | _______________ * _________|
+     * Item | |___________|______ | Item in Beam | * | Closer |___________| | Closer |
+     * |______________| * | Item | | Item | * |_________| |_________| * |
+     * * _________ Direction ---- Direction of Search ---> * | Item | of Search
+     * * | in beam| |
+     * * |________| V
      */
     @LargeTest
     @Test
@@ -2055,9 +1806,7 @@
         }
 
         // Act.
-        rule.runOnIdle {
-            focusManager.moveFocus(focusDirection)
-        }
+        rule.runOnIdle { focusManager.moveFocus(focusDirection) }
 
         // Assert.
         rule.runOnIdle {
@@ -2081,18 +1830,13 @@
      *          <---- Direction of Search ---           *        |___________|
      *                                                  *
      * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
-     *              __________                          *
-     *             |  Closer |                          *         ____________
-     *             |   Item  |                          *        |  focused  |       __________
-     *             |_________|                          *        |    Item   |      |  Closer |
-     *         ______________________________           *        |___________|      |   Item  |
-     *        |  focused  |    |    Item    |           *        |           |      |_________|
-     *        |    Item   |    |   in beam  |           *        |___________|
-     *        |___________|____|____________|           *        |    Item   |          |
-     *                                                  *        |  in beam  |      Direction
-     *          ---- Direction of Search --->           *        |___________|      of Search
-     *                                                  *                               |
-     *                                                  *                               V
+     * __________ * | Closer | * ____________ | Item | * | focused | __________ |_________| * | Item
+     * | | Closer | ______________________________ * |___________| | Item | | focused | | Item | * |
+     * | |_________| | Item | | in beam | * |___________| |___________|____|____________| * | Item |
+     * |
+     * * | in beam | Direction ---- Direction of Search ---> * |___________| of Search
+     * * |
+     * * V
      */
     @MediumTest
     @Test
@@ -2126,9 +1870,7 @@
         }
 
         // Act.
-        rule.runOnIdle {
-            focusManager.moveFocus(focusDirection)
-        }
+        rule.runOnIdle { focusManager.moveFocus(focusDirection) }
 
         // Assert.
         rule.runOnIdle {
@@ -2154,17 +1896,12 @@
      *          <---- Direction of Search ---           *        |___________|
      *                                                  *
      * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
-     *                 __________                       *         ____________
-     *                |  Closer |                       *        |  focused  |
-     *                |   Item  |                       *        |    Item   |       __________
-     *                |_________|                       *        |   ________|      |  Closer |
-     *         ______________________________           *        |__|________|      |   Item  |
-     *        |  focused  |  | Item in Beam |           *           |  Item  |      |_________|
-     *        |    Item   |__|______________|           *           | in beam|          |
-     *        |______________|                          *           |________|      Direction
-     *                                                  *                           of Search
-     *          ---- Direction of Search --->           *                               |
-     *                                                  *                               V
+     * __________ * ____________ | Closer | * | focused | | Item | * | Item | __________
+     * |_________| * | ________| | Closer | ______________________________ * |__|________| | Item |
+     * | focused | | Item in Beam | * | Item | |_________| | Item |__|______________| * | in beam| |
+     * |______________| * |________| Direction
+     * * of Search ---- Direction of Search ---> * |
+     * * V
      */
     @LargeTest
     @Test
@@ -2198,9 +1935,7 @@
         }
 
         // Act.
-        rule.runOnIdle {
-            focusManager.moveFocus(focusDirection)
-        }
+        rule.runOnIdle { focusManager.moveFocus(focusDirection) }
 
         // Assert.
         rule.runOnIdle {
@@ -2225,18 +1960,13 @@
      *          <---- Direction of Search ---           *       |    Item   |
      *                                                  *       |___________|
      * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
-     *                 __________                       *
-     *                |  Closer |                       *        ____________
-     *                |   Item  |                       *       |  focused  |
-     *                |_________|                       *       |    Item   |       __________
-     *         _______________                          *       |_________  |      |  Closer |
-     *        |  focused   __|_______________           *       |________|__|      |   Item  |
-     *        |    Item   |  | Item in Beam |           *       |  Item  |         |_________|
-     *        |___________|__|______________|           *       | in beam|             |
-     *                                                  *       |________|         Direction
-     *          ---- Direction of Search --->           *                          of Search
-     *                                                  *                              |
-     *                                                  *                              V
+     * __________ * | Closer | * ____________ | Item | * | focused | |_________| * | Item |
+     * __________ _______________ * |_________ | | Closer | | focused __|_______________ *
+     * |________|__| | Item | | Item | | Item in Beam | * | Item | |_________|
+     * |___________|__|______________| * | in beam| |
+     * * |________| Direction ---- Direction of Search ---> * of Search
+     * * |
+     * * V
      */
     @LargeTest
     @Test
@@ -2270,9 +2000,7 @@
         }
 
         // Act.
-        rule.runOnIdle {
-            focusManager.moveFocus(focusDirection)
-        }
+        rule.runOnIdle { focusManager.moveFocus(focusDirection) }
 
         // Assert.
         rule.runOnIdle {
@@ -2296,18 +2024,12 @@
      *          <---- Direction of Search ---           *        |    Item    |
      *                                                  *        |____________|
      * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
-     *                 __________                       *         ____________
-     *                |  Closer |                       *        |  focused   |
-     *                |   Item  |                       *        |    Item    |       __________
-     *                |_________|                       *        |  _________ |      |  Closer |
-     *         _______________                          *        |_|________|_|      |   Item  |
-     *        |            __|________________          *          |  Item  |        |_________|
-     *        |  focused  |  | Item in Beam  |          *          | in beam|            |
-     *        |    Item   |__|_______________|          *          |________|        Direction
-     *        |______________|                          *                            of Search
-     *                                                  *                                |
-     *                                                  *                                V
-     *         ---- Direction of Search --->            *
+     * __________ * ____________ | Closer | * | focused | | Item | * | Item | __________
+     * |_________| * | _________ | | Closer | _______________ * |_|________|_| | Item | |
+     * __|________________ * | Item | |_________| | focused | | Item in Beam | * | in beam| | | Item
+     * |__|_______________| * |________| Direction |______________| * of Search
+     * * |
+     * * V ---- Direction of Search ---> *
      */
     @LargeTest
     @Test
@@ -2341,9 +2063,7 @@
         }
 
         // Act.
-        rule.runOnIdle {
-            focusManager.moveFocus(focusDirection)
-        }
+        rule.runOnIdle { focusManager.moveFocus(focusDirection) }
 
         // Assert.
         rule.runOnIdle {
@@ -2366,15 +2086,11 @@
      *          <---- Direction of Search ---           *   |___________|
      *                                                  *
      * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
-     *              __________                          *    ____________
-     *             |  Closer |                          *   |  focused  |__________
-     *             |   Item  |                          *   |    Item   |  Closer |
-     *         ____|_________|______________            *   |___________|   Item  |       |
-     *        |  focused  |   |    Item    |            *   |           |_________|   Direction
-     *        |    Item   |   |   in beam  |            *   |___________|             of Search
-     *        |___________|___|____________|            *   |    Item   |                 |
-     *                                                  *   |  in beam  |                 V
-     *          ---- Direction of Search --->           *   |___________|
+     * __________ * ____________ | Closer | * | focused |__________ | Item | * | Item | Closer |
+     * ____|_________|______________ * |___________| Item | | | focused | | Item | * | |_________|
+     * Direction | Item | | in beam | * |___________| of Search |___________|___|____________| * |
+     * Item | |
+     * * | in beam | V ---- Direction of Search ---> * |___________|
      */
     @LargeTest
     @Test
@@ -2408,9 +2124,7 @@
         }
 
         // Act.
-        rule.runOnIdle {
-            focusManager.moveFocus(focusDirection)
-        }
+        rule.runOnIdle { focusManager.moveFocus(focusDirection) }
 
         // Assert.
         rule.runOnIdle {
@@ -2434,17 +2148,11 @@
      *          <---- Direction of Search ---           *        |___________|
      *                                                  *
      * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
-     *                                                  *         ____________
-     *                 __________                       *        |  focused  |
-     *                |  Closer |                       *        |    Item   |__________
-     *                |   Item  |                       *        |   ________|         |
-     *         _______|_________|____________           *        |__|________|  Closer |    |
-     *        |  focused  |  | Item in Beam |           *           |  Item  |   Item  | Direction
-     *        |    Item   |__|______________|           *           | in beam|_________| of Search
-     *        |______________|                          *           |________|              |
-     *                                                  *                                   V
-     *          ---- Direction of Search --->           *
-     *                                                  *
+     *     * ____________ __________ * | focused | | Closer | * | Item |__________ | Item | * |
+     *       ________| | _______|_________|____________ * |__|________| Closer | | | focused | |
+     *       Item in Beam | * | Item | Item | Direction | Item |__|______________| * | in
+     *       beam|_________| of Search |______________| * |________| |
+     *     * V ---- Direction of Search ---> * *
      */
     @LargeTest
     @Test
@@ -2478,9 +2186,7 @@
         }
 
         // Act.
-        rule.runOnIdle {
-            focusManager.moveFocus(focusDirection)
-        }
+        rule.runOnIdle { focusManager.moveFocus(focusDirection) }
 
         // Assert.
         rule.runOnIdle {
@@ -2503,15 +2209,11 @@
      *          <---- Direction of Search ---           *       |    Item   |
      *                                                  *       |___________|
      * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
-     *                 __________                       *        ____________
-     *                |  Closer |                       *       |  focused  |
-     *                |   Item  |                       *       |    Item   |
-     *         _______|_________|                       *       |           |__________
-     *        |  focused   __|_______________           *       |_________  |  Closer |      |
-     *        |    Item   |  | Item in Beam |           *       |________|__|   Item  |  Direction
-     *        |___________|__|______________|           *       |  Item  |  |_________|  of Search
-     *                                                  *       | in beam|                   |
-     *          ---- Direction of Search --->           *       |________|                   V
+     * __________ * ____________ | Closer | * | focused | | Item | * | Item | _______|_________| * |
+     * |__________ | focused __|_______________ * |_________ | Closer | | | Item | | Item in Beam
+     * | * |________|__| Item | Direction |___________|__|______________| * | Item | |_________| of
+     * Search
+     * * | in beam| | ---- Direction of Search ---> * |________| V
      */
     @LargeTest
     @Test
@@ -2545,9 +2247,7 @@
         }
 
         // Act.
-        rule.runOnIdle {
-            focusManager.moveFocus(focusDirection)
-        }
+        rule.runOnIdle { focusManager.moveFocus(focusDirection) }
 
         // Assert.
         rule.runOnIdle {
@@ -2570,17 +2270,12 @@
      *          <---- Direction of Search ---           *        |    Item    |
      *                                                  *        |____________|
      * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
-     *                 __________                       *         _____________
-     *                |  Closer |                       *        |  focused   |
-     *                |   Item  |                       *        |    Item    |__________
-     *         _______|_________|                       *        |  _________ |  Closer |
-     *        |            __|________________          *        |_|________|_|   Item  |
-     *        |  focused  |  | Item in Beam  |          *          |  Item  | |_________|    |
-     *        |    Item   |__|_______________|          *          | in beam|            Direction
-     *        |______________|                          *          |________|            of Search
-     *                                                  *                                    |
-     *                                                  *                                    V
-     *         ---- Direction of Search --->            *
+     * __________ * _____________ | Closer | * | focused | | Item | * | Item |__________
+     * _______|_________| * | _________ | Closer | | __|________________ * |_|________|_| Item | |
+     * focused | | Item in Beam | * | Item | |_________| | | Item |__|_______________| * | in beam|
+     * Direction |______________| * |________| of Search
+     * * |
+     * * V ---- Direction of Search ---> *
      */
     @LargeTest
     @Test
@@ -2614,9 +2309,7 @@
         }
 
         // Act.
-        rule.runOnIdle {
-            focusManager.moveFocus(focusDirection)
-        }
+        rule.runOnIdle { focusManager.moveFocus(focusDirection) }
 
         // Assert.
         rule.runOnIdle {
@@ -2640,18 +2333,13 @@
      *          <---- Direction of Search ---           *                        |___________|
      *                                                  *
      * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
-     *         _____________________________            *
-     *        |  focused  |   |    Item    |            *                         ____________
-     *        |    Item   |   |   in beam  |            *        __________      |  focused  |
-     *        |___________|___|____________|            *       |  Closer |      |    Item   |
-     *             __________                           *       |   Item  |      |___________|
-     *            |  Closer |                           *       |_________|      |           |
-     *            |   Item  |                           *                        |___________|
-     *            |_________|                           *           |            |    Item   |
-     *                                                  *       Direction        |  in beam  |
-     *            ---- Direction of Search --->         *       of Search        |___________|
-     *                                                  *           |
-     *                                                  *           V
+     * _____________________________ * | focused | | Item | * ____________ | Item | | in beam | *
+     * __________ | focused | |___________|___|____________| * | Closer | | Item | __________ * |
+     * Item | |___________| | Closer | * |_________| | | | Item | * |___________| |_________| * | |
+     * Item |
+     * * Direction | in beam | ---- Direction of Search ---> * of Search |___________|
+     * * |
+     * * V
      */
     @LargeTest
     @Test
@@ -2685,9 +2373,7 @@
         }
 
         // Act.
-        rule.runOnIdle {
-            focusManager.moveFocus(focusDirection)
-        }
+        rule.runOnIdle { focusManager.moveFocus(focusDirection) }
 
         // Assert.
         rule.runOnIdle {
@@ -2713,17 +2399,12 @@
      *          <---- Direction of Search ---           *                    |___________|
      *                                                  *
      * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
-     *         ______________________________           *                     ____________
-     *        |  focused  |  | Item in Beam |           *     __________     |  focused  |
-     *        |    Item   |__|______________|           *    |  Closer |     |    Item   |
-     *        |______________|                          *    |   Item  |     |   ________|
-     *                 __________                       *    |         |     |__|________|
-     *                |  Closer |                       *    |_________|        |  Item  |
-     *                |   Item  |                       *        |              | in beam|
-     *                |_________|                       *    Direction          |________|
-     *                                                  *    of Search
-     *          ---- Direction of Search --->           *        |
-     *                                                  *        V
+     * ______________________________ * ____________ | focused | | Item in Beam | * __________ |
+     * focused | | Item |__|______________| * | Closer | | Item | |______________| * | Item | |
+     * ________| __________ * | | |__|________| | Closer | * |_________| | Item | | Item | * | | in
+     * beam| |_________| * Direction |________|
+     * * of Search ---- Direction of Search ---> * |
+     * * V
      */
     @LargeTest
     @Test
@@ -2757,9 +2438,7 @@
         }
 
         // Act.
-        rule.runOnIdle {
-            focusManager.moveFocus(focusDirection)
-        }
+        rule.runOnIdle { focusManager.moveFocus(focusDirection) }
 
         // Assert.
         rule.runOnIdle {
@@ -2784,18 +2463,13 @@
      *          <---- Direction of Search ---           *                   |    Item   |
      *                                                  *                   |___________|
      * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
-     *         _______________                          *
-     *        |  focused   __|_______________           *                    ____________
-     *        |    Item   |  | Item in Beam |           *                   |  focused  |
-     *        |___________|__|______________|           *    __________     |    Item   |
-     *                 __________                       *   |  Closer |     |_________  |
-     *                |  Closer |                       *   |   Item  |     |________|__|
-     *                |   Item  |                       *   |_________|     |  Item  |
-     *                |_________|                       *       |           | in beam|
-     *                                                  *   Direction       |________|
-     *           ---- Direction of Search --->          *   of Search
-     *                                                  *       |
-     *                                                  *       V
+     * _______________ * | focused __|_______________ * ____________ | Item | | Item in Beam | * |
+     * focused | |___________|__|______________| * __________ | Item | __________ * | Closer |
+     * |_________ | | Closer | * | Item | |________|__| | Item | * |_________| | Item |
+     * |_________| * | | in beam|
+     * * Direction |________| ---- Direction of Search ---> * of Search
+     * * |
+     * * V
      */
     @LargeTest
     @Test
@@ -2829,9 +2503,7 @@
         }
 
         // Act.
-        rule.runOnIdle {
-            focusManager.moveFocus(focusDirection)
-        }
+        rule.runOnIdle { focusManager.moveFocus(focusDirection) }
 
         // Assert.
         rule.runOnIdle {
@@ -2855,17 +2527,11 @@
      *          <---- Direction of Search ---           *                     |    Item    |
      *                                                  *                     |____________|
      * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
-     *         _______________                          *                      ____________
-     *        |            __|________________          *                     |  focused   |
-     *        |  focused  |  | Item in Beam  |          *       __________    |    Item    |
-     *        |    Item   |__|_______________|          *      |  Closer |    |  _________ |
-     *        |______________|                          *      |   Item  |    |_|________|_|
-     *                 __________                       *      |_________|      |  Item  |
-     *                |  Closer |                       *          |            | in beam|
-     *                |   Item  |                       *      Direction        |________|
-     *                |_________|                       *      of Search
-     *                                                  *          |
-     *         ---- Direction of Search --->            *          V
+     * _______________ * ____________ | __|________________ * | focused | | focused | | Item in Beam
+     * | * __________ | Item | | Item |__|_______________| * | Closer | | _________ |
+     * |______________| * | Item | |_|________|_| __________ * |_________| | Item | | Closer | * | |
+     * in beam| | Item | * Direction |________| |_________| * of Search
+     * * | ---- Direction of Search ---> * V
      */
     @LargeTest
     @Test
@@ -2899,9 +2565,7 @@
         }
 
         // Act.
-        rule.runOnIdle {
-            focusManager.moveFocus(focusDirection)
-        }
+        rule.runOnIdle { focusManager.moveFocus(focusDirection) }
 
         // Assert.
         rule.runOnIdle {
@@ -2923,15 +2587,11 @@
      *          <---- Direction of Search ---           *                |___________|
      *                                                  *
      * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
-     *         _____________________________            *                 ____________
-     *        |  focused  |   |    Item    |            *       _________|  focused  |
-     *        |    Item   |   |   in beam  |            *      |  Closer |    Item   |
-     *        |___________|___|____________|            *      |   Item  |___________|
-     *            |  Closer |                           *      |_________|           |       |
-     *            |   Item  |                           *                |___________|   Direction
-     *            |_________|                           *                |    Item   |   of Search
-     *                                                  *                |  in beam  |       |
-     *          ---- Direction of Search --->           *                |___________|       V
+     * _____________________________ * ____________ | focused | | Item | * _________| focused | |
+     * Item | | in beam | * | Closer | Item | |___________|___|____________| * | Item |___________|
+     * | Closer | * |_________| | | | Item | * |___________| Direction |_________| * | Item | of
+     * Search
+     * * | in beam | | ---- Direction of Search ---> * |___________| V
      */
     @LargeTest
     @Test
@@ -2965,9 +2625,7 @@
         }
 
         // Act.
-        rule.runOnIdle {
-            focusManager.moveFocus(focusDirection)
-        }
+        rule.runOnIdle { focusManager.moveFocus(focusDirection) }
 
         // Assert.
         rule.runOnIdle {
@@ -2988,15 +2646,11 @@
      *                                                  *            |    Item   |
      *          <---- Direction of Search ---           *            |___________|
      * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
-     *         ______________________________           *             ____________
-     *        |  focused  |  | Item in Beam |           *  __________|  focused  |
-     *        |    Item   |__|______________|           *  |  Closer |           |
-     *        |______________|___                       *  |   Item  |   ________|        |
-     *                |  Closer |                       *  |         |__|________|    Direction
-     *                |   Item  |                       *  |_________|  |        |    of Search
-     *                |_________|                       *               |  Item  |        |
-     *                                                  *               | in beam|        V
-     *           ---- Direction of Search --->          *               |________|
+     * ______________________________ * ____________ | focused | | Item in Beam | * __________|
+     * focused | | Item |__|______________| * | Closer | | |______________|___ * | Item | ________|
+     * | | Closer | * | |__|________| Direction | Item | * |_________| | | of Search |_________| * |
+     * Item | |
+     * * | in beam| V ---- Direction of Search ---> * |________|
      */
     @LargeTest
     @Test
@@ -3030,9 +2684,7 @@
         }
 
         // Act.
-        rule.runOnIdle {
-            focusManager.moveFocus(focusDirection)
-        }
+        rule.runOnIdle { focusManager.moveFocus(focusDirection) }
 
         // Assert.
         rule.runOnIdle {
@@ -3053,15 +2705,11 @@
      *                                                  *             |    Item   |
      *          <---- Direction of Search ---           *             |___________|
      * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
-     *         _______________                          *              ____________
-     *        |  focused   __|_______________           *    _________|  focused  |
-     *        |    Item   |  | Item in Beam |           *   |         |    Item   |
-     *        |___________|__|______________|           *   |  Closer |_________  |
-     *                |  Closer |                       *   |   Item  |________|__|       |
-     *                |   Item  |                       *   |_________|        |      Direction
-     *                |_________|                       *             |  Item  |      of Search
-     *                                                  *             | in beam|          |
-     *          ---- Direction of Search --->           *             |________|          V
+     * _______________ * ____________ | focused __|_______________ * _________| focused | | Item | |
+     * Item in Beam | * | | Item | |___________|__|______________| * | Closer |_________ | | Closer
+     * | * | Item |________|__| | | Item | * |_________| | Direction |_________| * | Item | of
+     * Search
+     * * | in beam| | ---- Direction of Search ---> * |________| V
      */
     @LargeTest
     @Test
@@ -3095,9 +2743,7 @@
         }
 
         // Act.
-        rule.runOnIdle {
-            focusManager.moveFocus(focusDirection)
-        }
+        rule.runOnIdle { focusManager.moveFocus(focusDirection) }
 
         // Assert.
         rule.runOnIdle {
@@ -3119,16 +2765,12 @@
      *                                                  *
      *       <---- Direction of Search ---              *
      * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
-     *         _______________                          *             _____________
-     *        |            __|________________          *            |  focused   |
-     *        |  focused  |  | Item in Beam  |          *   _________|    Item    |       |
-     *        |    Item   |__|_______________|          *  |  Closer |  _________ |   Direction
-     *        |______________|___                       *  |   Item  |_|________|_|   of Search
-     *                |  Closer |                       *  |_________| |  Item  |         |
-     *                |   Item  |                       *              | in beam|         V
-     *                |_________|                       *              |________|
-     *                                                  *
-     *         ---- Direction of Search --->            *
+     * _______________ * _____________ | __|________________ * | focused | | focused | | Item in
+     * Beam | * _________| Item | | | Item |__|_______________| * | Closer | _________ | Direction
+     * |______________|___ * | Item |_|________|_| of Search | Closer | * |_________| | Item | | |
+     * Item | * | in beam| V |_________| * |________|
+     * *
+     * ---- Direction of Search ---> *
      */
     @LargeTest
     @Test
@@ -3162,9 +2804,7 @@
         }
 
         // Act.
-        rule.runOnIdle {
-            focusManager.moveFocus(focusDirection)
-        }
+        rule.runOnIdle { focusManager.moveFocus(focusDirection) }
 
         // Assert.
         rule.runOnIdle {
@@ -3188,18 +2828,12 @@
      *          <---- Direction of Search ---           *        |___________|          |
      *                                                  *                               |
      * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
-     *                             __________           *
-     *                            |  Closer |           *
-     *                            |   Item  |           *         ____________          |
-     *                            |_________|           *        |  focused  |      Direction
-     *         ____________        __________           *        |    Item   |      of Search
-     *        |  focused  |       |  Item   |           *        |___________|          |
-     *        |    Item   |       | in beam |           *                               V
-     *        |___________|       |_________|           *
-     *                                                  *         ____________       __________
-     *          ---- Direction of Search --->           *        |    Item   |      |  Closer |
-     *                                                  *        |  in beam  |      |   Item  |
-     *                                                  *        |___________|      |_________|
+     * __________ * | Closer | * | Item | * ____________ | |_________| * | focused | Direction
+     * ____________ __________ * | Item | of Search | focused | | Item | * |___________| | | Item |
+     * | in beam | * V |___________| |_________| *
+     * * ____________ __________ ---- Direction of Search ---> * | Item | | Closer |
+     * * | in beam | | Item |
+     * * |___________| |_________|
      */
     @MediumTest
     @Test
@@ -3233,9 +2867,7 @@
         }
 
         // Act.
-        rule.runOnIdle {
-            focusManager.moveFocus(focusDirection)
-        }
+        rule.runOnIdle { focusManager.moveFocus(focusDirection) }
 
         // Assert.
         rule.runOnIdle {
@@ -3259,16 +2891,10 @@
      *          <---- Direction of Search ---           *         |            |___________|
      *                                                  *         |
      * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
-     *     ____________        __________               *          |            ____________
-     *    |  focused  |       |  Item   |               *      Direction       |  focused  |
-     *    |    Item   |       | in beam |               *      of Search       |    Item   |
-     *    |___________|       |_________|               *          |           |___________|
-     *                         __________               *          V
-     *                        |  Closer |               *
-     *                        |   Item  |               *       __________      ____________
-     *                        |_________|               *      |  Closer |     |    Item   |
-     *                                                  *      |   Item  |     |  in beam  |
-     *          ---- Direction of Search --->           *      |_________|     |___________|
+     * ____________ __________ * | ____________ | focused | | Item | * Direction | focused | | Item
+     * | | in beam | * of Search | Item | |___________| |_________| * | |___________| __________ * V
+     * | Closer | * | Item | * __________ ____________ |_________| * | Closer | | Item |
+     * * | Item | | in beam | ---- Direction of Search ---> * |_________| |___________|
      */
     @LargeTest
     @Test
@@ -3302,9 +2928,7 @@
         }
 
         // Act.
-        rule.runOnIdle {
-            focusManager.moveFocus(focusDirection)
-        }
+        rule.runOnIdle { focusManager.moveFocus(focusDirection) }
 
         // Assert.
         rule.runOnIdle {
@@ -3328,18 +2952,12 @@
      *          <---- Direction of Search ---           *        |___________|          |
      *                                                  *                               |
      * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
-     *                          _____________           *
-     *                         |   Closer   |           *
-     *                         |    Item    |           *         ____________          |
-     *                         |____________|           *        |  focused  |      Direction
-     *         ____________        __________           *        |    Item   |      of Search
-     *        |  focused  |       |  Item   |           *        |___________|          |
-     *        |    Item   |       | in beam |           *                               V
-     *        |___________|       |_________|           *                            __________
-     *                                                  *         ____________      |         |
-     *          ---- Direction of Search --->           *        |    Item   |      |  Closer |
-     *                                                  *        |  in beam  |      |   Item  |
-     *                                                  *        |___________|      |_________|
+     * _____________ * | Closer | * | Item | * ____________ | |____________| * | focused | Direction
+     * ____________ __________ * | Item | of Search | focused | | Item | * |___________| | | Item |
+     * | in beam | * V |___________| |_________| * __________
+     * * ____________ | | ---- Direction of Search ---> * | Item | | Closer |
+     * * | in beam | | Item |
+     * * |___________| |_________|
      */
     @MediumTest
     @Test
@@ -3373,9 +2991,7 @@
         }
 
         // Act.
-        rule.runOnIdle {
-            focusManager.moveFocus(focusDirection)
-        }
+        rule.runOnIdle { focusManager.moveFocus(focusDirection) }
 
         // Assert.
         rule.runOnIdle {
@@ -3399,16 +3015,11 @@
      *         <---- Direction of Search ---            *         |            |___________|
      *                                                  *         |
      * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
-     *         ____________        __________           *          |            ____________
-     *        |  focused  |       |  Item   |           *      Direction       |  focused  |
-     *        |    Item   |       | in beam |           *      of Search       |    Item   |
-     *        |___________|       |_________|           *          |           |___________|
-     *                          _____________           *          V
-     *                         |   Closer   |           *       __________
-     *                         |    Item    |           *      |         |      ____________
-     *                         |____________|           *      |  Closer |     |    Item   |
-     *                                                  *      |   Item  |     |  in beam  |
-     *        ---- Direction of Search --->             *      |_________|     |___________|
+     * ____________ __________ * | ____________ | focused | | Item | * Direction | focused | | Item
+     * | | in beam | * of Search | Item | |___________| |_________| * | |___________|
+     * _____________ * V | Closer | * __________ | Item | * | | ____________ |____________| * |
+     * Closer | | Item |
+     * * | Item | | in beam | ---- Direction of Search ---> * |_________| |___________|
      */
     @LargeTest
     @Test
@@ -3442,9 +3053,7 @@
         }
 
         // Act.
-        rule.runOnIdle {
-            focusManager.moveFocus(focusDirection)
-        }
+        rule.runOnIdle { focusManager.moveFocus(focusDirection) }
 
         // Assert.
         rule.runOnIdle {
@@ -3468,18 +3077,12 @@
      *          <---- Direction of Search ---           *        |___________|          |
      *                                                  *                               |
      * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
-     *                         ___________              *
-     *                        |  Closer  |              *
-     *                        |   Item   |              *         ____________          |
-     *                        |__________|              *        |  focused  |      Direction
-     *         ____________        __________           *        |    Item   |      of Search
-     *        |  focused  |       |  Item   |           *        |___________|          |
-     *        |    Item   |       | in beam |           *                               V
-     *        |___________|       |_________|           *                            __________
-     *                                                  *         ____________      |  Closer |
-     *          ---- Direction of Search --->           *        |    Item   |      |   Item  |
-     *                                                  *        |  in beam  |      |_________|
-     *                                                  *        |___________|
+     * ___________ * | Closer | * | Item | * ____________ | |__________| * | focused | Direction
+     * ____________ __________ * | Item | of Search | focused | | Item | * |___________| | | Item |
+     * | in beam | * V |___________| |_________| * __________
+     * * ____________ | Closer | ---- Direction of Search ---> * | Item | | Item |
+     * * | in beam | |_________|
+     * * |___________|
      */
     @MediumTest
     @Test
@@ -3513,9 +3116,7 @@
         }
 
         // Act.
-        rule.runOnIdle {
-            focusManager.moveFocus(focusDirection)
-        }
+        rule.runOnIdle { focusManager.moveFocus(focusDirection) }
 
         // Assert.
         rule.runOnIdle {
@@ -3539,16 +3140,10 @@
      *                                                  *          |            |___________|
      *                                                  *          |
      * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
-     *       ____________        __________             *          |             ____________
-     *      |  focused  |       |  Item   |             *      Direction        |  focused  |
-     *      |    Item   |       | in beam |             *      of Search        |    Item   |
-     *      |___________|       |_________|             *          |            |___________|
-     *                       ___________                *          V
-     *                      |  Closer  |                *       __________
-     *                      |   Item   |                *      |  Closer |       ____________
-     *                      |__________|                *      |   Item  |      |    Item   |
-     *                                                  *      |_________|      |  in beam  |
-     *            ---- Direction of Search --->         *                       |___________|
+     * ____________ __________ * | ____________ | focused | | Item | * Direction | focused | | Item
+     * | | in beam | * of Search | Item | |___________| |_________| * | |___________| ___________ *
+     * V | Closer | * __________ | Item | * | Closer | ____________ |__________| * | Item | | Item |
+     * * |_________| | in beam | ---- Direction of Search ---> * |___________|
      */
     @LargeTest
     @Test
@@ -3582,9 +3177,7 @@
         }
 
         // Act.
-        rule.runOnIdle {
-            focusManager.moveFocus(focusDirection)
-        }
+        rule.runOnIdle { focusManager.moveFocus(focusDirection) }
 
         // Assert.
         rule.runOnIdle {
@@ -3609,18 +3202,12 @@
      *                                                 *        |___________|           |
      *                                                 *
      * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
-     *                   ___________                   *         ____________           |
-     *                  |  Closer  |                   *        |  focused  |       Direction
-     *                  |   Item   |                   *        |    Item   |       of Search
-     *                  |__________|                   *        |___________|           |
-     *    ____________              __________         *                                V
-     *   |  focused  |             |  Item   |         *                             _________
-     *   |    Item   |             | in beam |         *                            | Closer |
-     *   |___________|             |_________|         *                            |  Item  |
-     *                                                 *         ____________       |________|
-     *          ---- Direction of Search --->          *        |    Item   |
-     *                                                 *        |  in beam  |
-     *                                                 *        |___________|
+     * ___________ * ____________ | | Closer | * | focused | Direction | Item | * | Item | of Search
+     * |__________| * |___________| | ____________ __________ * V | focused | | Item | * _________ |
+     * Item | | in beam | * | Closer | |___________| |_________| * | Item |
+     * * ____________ |________| ---- Direction of Search ---> * | Item |
+     * * | in beam |
+     * * |___________|
      */
     @MediumTest
     @Test
@@ -3654,19 +3241,19 @@
         }
 
         // Act.
-        rule.runOnIdle {
-            focusManager.moveFocus(focusDirection)
-        }
+        rule.runOnIdle { focusManager.moveFocus(focusDirection) }
 
         // Assert.
         rule.runOnIdle {
             assertThat(focusedItem.value).isFalse()
             when (focusDirection) {
-                Left, Right -> {
+                Left,
+                Right -> {
                     assertThat(closerItem.value).isFalse()
                     assertThat(itemInBeam.value).isTrue()
                 }
-                Up, Down -> {
+                Up,
+                Down -> {
                     assertThat(closerItem.value).isTrue()
                     assertThat(itemInBeam.value).isFalse()
                 }
@@ -3689,18 +3276,12 @@
      *                                                 *        of Search     |    Item   |
      *                                                 *            |         |___________|
      * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
-     *    ____________              __________         *            |          ____________
-     *   |  focused  |             |  Item   |         *        Direction     |  focused  |
-     *   |    Item   |             | in beam |         *        of Search     |    Item   |
-     *   |___________|             |_________|         *            |         |___________|
-     *                   ___________                   *            V
-     *                  |  Closer  |                   *         _________
-     *                  |   Item   |                   *        | Closer |
-     *                  |__________|                   *        |  Item  |
-     *                                                 *        |________|     ____________
-     *          ---- Direction of Search --->          *                      |    Item   |
-     *                                                 *                      |  in beam  |
-     *                                                 *                      |___________|
+     * ____________ __________ * | ____________ | focused | | Item | * Direction | focused | | Item
+     * | | in beam | * of Search | Item | |___________| |_________| * | |___________| ___________ *
+     * V | Closer | * _________ | Item | * | Closer | |__________| * | Item |
+     * * |________| ____________ ---- Direction of Search ---> * | Item |
+     * * | in beam |
+     * * |___________|
      */
     @LargeTest
     @Test
@@ -3734,19 +3315,19 @@
         }
 
         // Act.
-        rule.runOnIdle {
-            focusManager.moveFocus(focusDirection)
-        }
+        rule.runOnIdle { focusManager.moveFocus(focusDirection) }
 
         // Assert.
         rule.runOnIdle {
             assertThat(focusedItem.value).isFalse()
             when (focusDirection) {
-                Left, Right -> {
+                Left,
+                Right -> {
                     assertThat(closerItem.value).isFalse()
                     assertThat(itemInBeam.value).isTrue()
                 }
-                Up, Down -> {
+                Up,
+                Down -> {
                     assertThat(closerItem.value).isTrue()
                     assertThat(itemInBeam.value).isFalse()
                 }
@@ -3770,18 +3351,12 @@
      *                                                *                                 |
      *                                                *
      * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
-     *                ___________                     *                                 |
-     *               |  Closer  |                     *                             Direction
-     *               |   Item   |                     *         ____________        of Search
-     *               |__________|                     *        |  focused  |            |
-     *    ____________           __________           *        |    Item   |            V
-     *   |  focused  |          |  Item   |           *        |___________|         _________
-     *   |    Item   |          | in beam |           *                             | Closer |
-     *   |___________|          |_________|           *                             |  Item  |
-     *                                                *         ____________        |________|
-     *          ---- Direction of Search --->         *        |    Item   |
-     *                                                *        |  in beam  |
-     *                                                *        |___________|
+     * ___________ * | | Closer | * Direction | Item | * ____________ of Search |__________| * |
+     * focused | | ____________ __________ * | Item | V | focused | | Item | * |___________|
+     * _________ | Item | | in beam | * | Closer | |___________| |_________| * | Item |
+     * * ____________ |________| ---- Direction of Search ---> * | Item |
+     * * | in beam |
+     * * |___________|
      */
     @MediumTest
     @Test
@@ -3815,19 +3390,19 @@
         }
 
         // Act.
-        rule.runOnIdle {
-            focusManager.moveFocus(focusDirection)
-        }
+        rule.runOnIdle { focusManager.moveFocus(focusDirection) }
 
         // Assert.
         rule.runOnIdle {
             assertThat(focusedItem.value).isFalse()
             when (focusDirection) {
-                Left, Right -> {
+                Left,
+                Right -> {
                     assertThat(closerItem.value).isFalse()
                     assertThat(itemInBeam.value).isTrue()
                 }
-                Up, Down -> {
+                Up,
+                Down -> {
                     assertThat(closerItem.value).isTrue()
                     assertThat(itemInBeam.value).isFalse()
                 }
@@ -3851,20 +3426,14 @@
      *                                                *        |___________|        of Search
      *                                                *                                 |
      * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
-     *                   __________                   *
-     *                  | Closer  |                   *                                 |
-     *                  |  Item   |                   *         ____________        Direction
-     *                  |_________|                   *        |  focused  |        of Search
-     *    ____________               __________       *        |    Item   |            |
-     *   |  focused  |              |  Item   |       *        |___________|            V
-     *   |    Item   |              | in beam |       *                              _________
-     *   |___________|              |_________|       *                             | Closer |
-     *                                                *                             |  Item  |
-     *          ---- Direction of Search --->         *                             |________|
-     *                                                *         ____________
-     *                                                *        |    Item   |
-     *                                                *        |  in beam  |
-     *                                                *        |___________|
+     * __________ * | Closer | * | | Item | * ____________ Direction |_________| * | focused | of
+     * Search ____________ __________ * | Item | | | focused | | Item | * |___________| V | Item | |
+     * in beam | * _________ |___________| |_________| * | Closer |
+     * * | Item | ---- Direction of Search ---> * |________|
+     * * ____________
+     * * | Item |
+     * * | in beam |
+     * * |___________|
      */
     @LargeTest
     @Test
@@ -3898,19 +3467,19 @@
         }
 
         // Act.
-        rule.runOnIdle {
-            focusManager.moveFocus(focusDirection)
-        }
+        rule.runOnIdle { focusManager.moveFocus(focusDirection) }
 
         // Assert.
         rule.runOnIdle {
             assertThat(focusedItem.value).isFalse()
             when (focusDirection) {
-                Left, Right -> {
+                Left,
+                Right -> {
                     assertThat(closerItem.value).isFalse()
                     assertThat(itemInBeam.value).isTrue()
                 }
-                Up, Down -> {
+                Up,
+                Down -> {
                     assertThat(closerItem.value).isTrue()
                     assertThat(itemInBeam.value).isFalse()
                 }
@@ -3934,19 +3503,13 @@
      *                                                *                             of Search
      *                                                *                                 |
      * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
-     *                __________                      *                                 |
-     *               | Closer  |                      *                             Direction
-     *               |  Item   |                      *         ____________        of Search
-     *               |_________|                      *        |  focused  |            |
-     *    ____________             __________         *        |    Item   |            V
-     *   |  focused  |            |  Item   |         *        |___________|         _________
-     *   |    Item   |            | in beam |         *                             | Closer |
-     *   |___________|            |_________|         *                             |  Item  |
-     *                                                *                             |________|
-     *          ---- Direction of Search --->         *         ____________
-     *                                                *        |    Item   |
-     *                                                *        |  in beam  |
-     *                                                *        |___________|
+     * __________ * | | Closer | * Direction | Item | * ____________ of Search |_________| * |
+     * focused | | ____________ __________ * | Item | V | focused | | Item | * |___________|
+     * _________ | Item | | in beam | * | Closer | |___________| |_________| * | Item |
+     * * |________| ---- Direction of Search ---> * ____________
+     * * | Item |
+     * * | in beam |
+     * * |___________|
      */
     @LargeTest
     @Test
@@ -3980,19 +3543,19 @@
         }
 
         // Act.
-        rule.runOnIdle {
-            focusManager.moveFocus(focusDirection)
-        }
+        rule.runOnIdle { focusManager.moveFocus(focusDirection) }
 
         // Assert.
         rule.runOnIdle {
             assertThat(focusedItem.value).isFalse()
             when (focusDirection) {
-                Left, Right -> {
+                Left,
+                Right -> {
                     assertThat(closerItem.value).isFalse()
                     assertThat(itemInBeam.value).isTrue()
                 }
-                Up, Down -> {
+                Up,
+                Down -> {
                     assertThat(closerItem.value).isTrue()
                     assertThat(itemInBeam.value).isFalse()
                 }
@@ -4015,18 +3578,12 @@
      *                                                *    of Search
      *                                                *        |
      * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
-     *    ____________           __________           *        |
-     *   |  focused  |          |  Item   |           *    Direction
-     *   |    Item   |          | in beam |           *    of Search       ____________
-     *   |___________|          |_________|           *        |          |  focused  |
-     *                ___________                     *        V          |    Item   |
-     *               |  Closer  |                     *     _________     |___________|
-     *               |   Item   |                     *    | Closer |
-     *               |__________|                     *    |  Item  |
-     *                                                *    |________|      ____________
-     *        ---- Direction of Search --->           *                   |    Item   |
-     *                                                *                   |  in beam  |
-     *                                                *                   |___________|
+     * ____________ __________ * | | focused | | Item | * Direction | Item | | in beam | * of Search
+     * ____________ |___________| |_________| * | | focused | ___________ * V | Item | | Closer | *
+     * _________ |___________| | Item | * | Closer | |__________| * | Item |
+     * * |________| ____________ ---- Direction of Search ---> * | Item |
+     * * | in beam |
+     * * |___________|
      */
     @LargeTest
     @Test
@@ -4060,19 +3617,19 @@
         }
 
         // Act.
-        rule.runOnIdle {
-            focusManager.moveFocus(focusDirection)
-        }
+        rule.runOnIdle { focusManager.moveFocus(focusDirection) }
 
         // Assert.
         rule.runOnIdle {
             assertThat(focusedItem.value).isFalse()
             when (focusDirection) {
-                Left, Right -> {
+                Left,
+                Right -> {
                     assertThat(closerItem.value).isFalse()
                     assertThat(itemInBeam.value).isTrue()
                 }
-                Up, Down -> {
+                Up,
+                Down -> {
                     assertThat(closerItem.value).isTrue()
                     assertThat(itemInBeam.value).isFalse()
                 }
@@ -4096,20 +3653,14 @@
      *                                                *     of Search       |___________|
      *                                                *         |
      * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
-     *    ____________               __________       *
-     *   |  focused  |              |  Item   |       *         |
-     *   |    Item   |              | in beam |       *     Direction        ____________
-     *   |___________|              |_________|       *     of Search       |  focused  |
-     *                   __________                   *         |           |    Item   |
-     *                  | Closer  |                   *         V           |___________|
-     *                  |  Item   |                   *      _________
-     *                  |_________|                   *     | Closer |
-     *                                                *     |  Item  |
-     *          ---- Direction of Search --->         *     |________|
-     *                                                *                      ____________
-     *                                                *                     |    Item   |
-     *                                                *                     |  in beam  |
-     *                                                *                     |___________|
+     * ____________ __________ * | focused | | Item | * | | Item | | in beam | * Direction
+     * ____________ |___________| |_________| * of Search | focused | __________ * | | Item | |
+     * Closer | * V |___________| | Item | * _________ |_________| * | Closer |
+     * * | Item | ---- Direction of Search ---> * |________|
+     * * ____________
+     * * | Item |
+     * * | in beam |
+     * * |___________|
      */
     @LargeTest
     @Test
@@ -4143,19 +3694,19 @@
         }
 
         // Act.
-        rule.runOnIdle {
-            focusManager.moveFocus(focusDirection)
-        }
+        rule.runOnIdle { focusManager.moveFocus(focusDirection) }
 
         // Assert.
         rule.runOnIdle {
             assertThat(focusedItem.value).isFalse()
             when (focusDirection) {
-                Left, Right -> {
+                Left,
+                Right -> {
                     assertThat(closerItem.value).isFalse()
                     assertThat(itemInBeam.value).isTrue()
                 }
-                Up, Down -> {
+                Up,
+                Down -> {
                     assertThat(closerItem.value).isTrue()
                     assertThat(itemInBeam.value).isFalse()
                 }
@@ -4179,19 +3730,13 @@
      *                                                *     of Search
      *                                                *         |
      * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
-     *    ____________             __________         *         |
-     *   |  focused  |            |  Item   |         *     Direction
-     *   |    Item   |            | in beam |         *     of Search        ____________
-     *   |___________|            |_________|         *         |           |  focused  |
-     *                __________                      *         V           |    Item   |
-     *               | Closer  |                      *      _________      |___________|
-     *               |  Item   |                      *     | Closer |
-     *               |_________|                      *     |  Item  |
-     *                                                *     |________|
-     *                                                *                      ____________
-     *       ---- Direction of Search --->            *                     |    Item   |
-     *                                                *                     |  in beam  |
-     *                                                *                     |___________|
+     * ____________ __________ * | | focused | | Item | * Direction | Item | | in beam | * of Search
+     * ____________ |___________| |_________| * | | focused | __________ * V | Item | | Closer | *
+     * _________ |___________| | Item | * | Closer | |_________| * | Item |
+     * * |________|
+     * * ____________ ---- Direction of Search ---> * | Item |
+     * * | in beam |
+     * * |___________|
      */
     @LargeTest
     @Test
@@ -4225,19 +3770,19 @@
         }
 
         // Act.
-        rule.runOnIdle {
-            focusManager.moveFocus(focusDirection)
-        }
+        rule.runOnIdle { focusManager.moveFocus(focusDirection) }
 
         // Assert.
         rule.runOnIdle {
             assertThat(focusedItem.value).isFalse()
             when (focusDirection) {
-                Left, Right -> {
+                Left,
+                Right -> {
                     assertThat(closerItem.value).isFalse()
                     assertThat(itemInBeam.value).isTrue()
                 }
-                Up, Down -> {
+                Up,
+                Down -> {
                     assertThat(closerItem.value).isTrue()
                     assertThat(itemInBeam.value).isFalse()
                 }
@@ -4247,31 +3792,27 @@
     }
 
     /**
-     *    ____________   ____________   ____________  *    ____________
-     *   |  In Beam  |  |  In Beam  |  |  focused  |  *   |  In Beam  |
-     *   |  Farther  |  |   Closer  |  |    Item   |  *   |  Farther  |
-     *   |___________|  |___________|  |___________|  *   |___________|        ^
-     *                                                *    ____________        |
-     *         <---- Direction of Search ---          *   |  In Beam  |    Direction
-     *                                                *   |   Closer  |    of Search
-     *                                                *   |___________|        |
-     *                                                *    ____________        |
-     *                                                *   |  focused  |
-     *                                                *   |    Item   |
-     *                                                *   |___________|
+     * ____________ ____________ ____________ * ____________ | In Beam | | In Beam | | focused | * |
+     * In Beam | | Farther | | Closer | | Item | * | Farther | |___________| |___________|
+     * |___________| * |___________| ^
+     * * ____________ | <---- Direction of Search --- * | In Beam | Direction
+     * * | Closer | of Search
+     * * |___________| |
+     * * ____________ |
+     * * | focused |
+     * * | Item |
+     * * |___________|
      * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
-     *    ____________   ____________   ____________  *    ____________
-     *   |  focused  |  |  In Beam  |  |  In Beam  |  *   |  focused  |
-     *   |    Item   |  |   Closer  |  |  Farther  |  *   |    Item   |
-     *   |___________|  |___________|  |___________|  *   |___________|        |
-     *                                                *    ____________        |
-     *        ---- Direction of Search --->           *   |  In Beam  |    Direction
-     *                                                *   |   Closer  |    of Search
-     *                                                *   |___________|        |
-     *                                                *    ____________        v
-     *                                                *   |  In Beam  |
-     *                                                *   |  Farther  |
-     *                                                *   |___________|
+     * ____________ ____________ ____________ * ____________ | focused | | In Beam | | In Beam | * |
+     * focused | | Item | | Closer | | Farther | * | Item | |___________| |___________|
+     * |___________| * |___________| |
+     * * ____________ | ---- Direction of Search ---> * | In Beam | Direction
+     * * | Closer | of Search
+     * * |___________| |
+     * * ____________ v
+     * * | In Beam |
+     * * | Farther |
+     * * |___________|
      */
     @MediumTest
     @Test
@@ -4305,9 +3846,7 @@
         }
 
         // Act.
-        rule.runOnIdle {
-            focusManager.moveFocus(focusDirection)
-        }
+        rule.runOnIdle { focusManager.moveFocus(focusDirection) }
 
         // Assert.
         rule.runOnIdle {
@@ -4333,18 +3872,12 @@
      *                                                *  |      Item       |
      *                                                *  |_________________|
      * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
-     *    ____________                                *   __________________
-     *   |           |                                *  |     focused     |
-     *   |           |                  ____________  *  |      Item       |
-     *   |  focused  |                 |  In Beam  |  *  |_________________|            |
-     *   |    Item   |   ____________  |  Farther  |  *            _____________        |
-     *   |           |  |           |  |___________|  *           |   In Beam  |    Direction
-     *   |           |  |  In Beam  |                 *           |    Closer  |    of Search
-     *   |___________|  |   Closer  |                 *           |____________|        |
-     *                  |___________|                 *       ___________               v
-     *                                                *      |  In Beam |
-     *        ---- Direction of Search --->           *      |  Farther |
-     *                                                *      |__________|
+     * ____________ * __________________ | | * | focused | | | ____________ * | Item | | focused | |
+     * In Beam | * |_________________| | | Item | ____________ | Farther | * _____________ | | | | |
+     * |___________| * | In Beam | Direction | | | In Beam | * | Closer | of Search |___________| |
+     * Closer | * |____________| | |___________| * ___________ v
+     * * | In Beam | ---- Direction of Search ---> * | Farther |
+     * * |__________|
      */
     @LargeTest
     @Test
@@ -4378,9 +3911,7 @@
         }
 
         // Act.
-        rule.runOnIdle {
-            focusManager.moveFocus(focusDirection)
-        }
+        rule.runOnIdle { focusManager.moveFocus(focusDirection) }
 
         // Assert.
         rule.runOnIdle {
@@ -4404,18 +3935,14 @@
      *                                                *   |        Item      |
      *                                                *   |__________________|
      * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
-     *                                                *    ___________________
-     *    ____________                                *   |      focused     |
-     *   |           |                  ____________  *   |        Item      |
-     *   |  focused  |   ____________  |  In Beam  |  *   |__________________|       |
-     *   |    Item   |  |  In Beam  |  |  Farther  |  *          _____________       |
-     *   |           |  |   Closer  |  |___________|  *         |  In Beam   |   Direction
-     *   |___________|  |___________|                 *         |   Closer   |   of Search
-     *                                                *         |____________|       |
-     *        ---- Direction of Search --->           *        ___________           v
-     *                                                *       |  In Beam |
-     *                                                *       |  Farther |
-     *                                                *       |__________|
+     *     * ___________________ ____________ * | focused | | | ____________ * | Item | | focused |
+     *       ____________ | In Beam | * |__________________| | | Item | | In Beam | | Farther | *
+     *       _____________ | | | | Closer | |___________| * | In Beam | Direction |___________|
+     *       |___________| * | Closer | of Search
+     *     * |____________| | ---- Direction of Search ---> * ___________ v
+     *     * | In Beam |
+     *     * | Farther |
+     *     * |__________|
      */
     @LargeTest
     @Test
@@ -4449,9 +3976,7 @@
         }
 
         // Act.
-        rule.runOnIdle {
-            focusManager.moveFocus(focusDirection)
-        }
+        rule.runOnIdle { focusManager.moveFocus(focusDirection) }
 
         // Assert.
         rule.runOnIdle {
@@ -4475,18 +4000,14 @@
      *                                                *    |      Item     |
      *                                                *    |_______________|
      * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
-     *                                                *     ________________
-     *    ____________                                *    |    focused    |
-     *   |           |   ____________   ____________  *    |      Item     |
-     *   |  focused  |  |  In Beam  |  |  In Beam  |  *    |_______________|      |
-     *   |    Item   |  |   Closer  |  |  Farther  |  *       ____________        |
-     *   |           |  |___________|  |___________|  *      |  In Beam  |    Direction
-     *   |___________|                                *      |   Closer  |    of Search
-     *                                                *      |___________|        |
-     *        ---- Direction of Search --->           *       ____________        v
-     *                                                *      |  In Beam  |
-     *                                                *      |  Farther  |
-     *                                                *      |___________|
+     *     * ________________ ____________ * | focused | | | ____________ ____________ * | Item | |
+     *       focused | | In Beam | | In Beam | * |_______________| | | Item | | Closer | | Farther
+     *       | * ____________ | | | |___________| |___________| * | In Beam | Direction
+     *       |___________| * | Closer | of Search
+     *     * |___________| | ---- Direction of Search ---> * ____________ v
+     *     * | In Beam |
+     *     * | Farther |
+     *     * |___________|
      */
     @LargeTest
     @Test
@@ -4520,9 +4041,7 @@
         }
 
         // Act.
-        rule.runOnIdle {
-            focusManager.moveFocus(focusDirection)
-        }
+        rule.runOnIdle { focusManager.moveFocus(focusDirection) }
 
         // Assert.
         rule.runOnIdle {
@@ -4547,18 +4066,13 @@
      *                                                *     |        Item       |
      *                                                *     |___________________|
      * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
-     *                                                *      ____________________
-     *    ____________   ____________                 *     |      focused      |
-     *   |           |  |  In Beam  |   ____________  *     |        Item       |
-     *   |  focused  |  |   Closer  |  |  In Beam  |  *     |___________________|      |
-     *   |    Item   |  |___________|  |  Farther  |  *      ____________              |
-     *   |           |                 |___________|  *     |  In Beam  |          Direction
-     *   |           |                                *     |   Closer  |          of Search
-     *   |___________|                                *     |___________|              |
-     *                                                *           ___________          v
-     *          ---- Direction of Search --->         *          |  In Beam |
-     *                                                *          |  Farther |
-     *                                                *          |__________|
+     *     * ____________________ ____________ ____________ * | focused | | | | In Beam |
+     *       ____________ * | Item | | focused | | Closer | | In Beam | * |___________________| | |
+     *       Item | |___________| | Farther | * ____________ | | | |___________| * | In Beam |
+     *       Direction | | * | Closer | of Search |___________| * |___________| |
+     *     * ___________ v ---- Direction of Search ---> * | In Beam |
+     *     * | Farther |
+     *     * |__________|
      */
     @LargeTest
     @Test
@@ -4592,9 +4106,7 @@
         }
 
         // Act.
-        rule.runOnIdle {
-            focusManager.moveFocus(focusDirection)
-        }
+        rule.runOnIdle { focusManager.moveFocus(focusDirection) }
 
         // Assert.
         rule.runOnIdle {
@@ -4619,18 +4131,13 @@
      *         <---- Direction of Search ---          *     |       Item       |
      *                                                *     |__________________|
      * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
-     *                   ____________                 *      ___________________
-     *    ____________  |           |                 *     |     focused      |
-     *   |           |  |  In Beam  |   ____________  *     |       Item       |
-     *   |  focused  |  |   Closer  |  |  In Beam  |  *     |__________________|       |
-     *   |    Item   |  |___________|  |  Farther  |  *   ____________                 |
-     *   |           |                 |___________|  *  |  In Beam  |             Direction
-     *   |           |                                *  |   Closer  |             of Search
-     *   |___________|                                *  |___________|                 |
-     *                                                *          ___________           v
-     *                                                *         |  In Beam |
-     *        ---- Direction of Search --->           *         |  Farther |
-     *                                                *         |__________|
+     * ____________ * ___________________ ____________ | | * | focused | | | | In Beam |
+     * ____________ * | Item | | focused | | Closer | | In Beam | * |__________________| | | Item |
+     * |___________| | Farther | * ____________ | | | |___________| * | In Beam | Direction | | * |
+     * Closer | of Search |___________| * |___________| |
+     * * ___________ v
+     * * | In Beam | ---- Direction of Search ---> * | Farther |
+     * * |__________|
      */
     @LargeTest
     @Test
@@ -4664,9 +4171,7 @@
         }
 
         // Act.
-        rule.runOnIdle {
-            focusManager.moveFocus(focusDirection)
-        }
+        rule.runOnIdle { focusManager.moveFocus(focusDirection) }
 
         // Assert.
         rule.runOnIdle {
@@ -4691,18 +4196,11 @@
      *        <---- Direction of Search ---          *                                |___________|
      *                                               *
      * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
-     *                                               *   ____________
-     *        ---- Direction of Search --->          *  |  focused  |
-     *   ____________                                *  |    Item   |
-     *  |  focused  |                                *  |___________|
-     *  |    Item   |                                *                          ____________
-     *  |___________|                                *                         |           |
-     *                                 ____________  *      |                  |   Closer  |
-     *                                |           |  *      |                  |___________|
-     *                  ____________  |  Farther  |  *   Direction        ____________
-     *                 |           |  |___________|  *   of Search       |           |
-     *                 |   Closer  |                 *      |            |  Farther  |
-     *                 |___________|                 *      v            |___________|
+     *     * ____________ ---- Direction of Search ---> * | focused | ____________ * | Item | |
+     *       focused | * |___________| | Item | * ____________ |___________| * | | ____________ * |
+     *       | Closer | | | * | |___________| ____________ | Farther | * Direction ____________ | |
+     *       |___________| * of Search | | | Closer | * | | Farther | |___________| * v
+     *       |___________|
      */
     @MediumTest
     @Test
@@ -4735,9 +4233,7 @@
             }
         }
         // Act.
-        rule.runOnIdle {
-            focusManager.moveFocus(focusDirection)
-        }
+        rule.runOnIdle { focusManager.moveFocus(focusDirection) }
 
         // Assert.
         rule.runOnIdle {
@@ -4762,18 +4258,12 @@
      *        <---- Direction of Search ---          *                                |___________|
      *                                               *
      * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
-     *                                               *   ____________
-     *        ---- Direction of Search --->          *  |  focused  |
-     *   ____________                                *  |    Item   |
-     *  |  focused  |                                *  |___________|
-     *  |    Item   |                                *                    ____________
-     *  |___________|                                *                   |           |
-     *                  ____________   ____________  *      |            |   Closer  |
-     *                 |           |  |           |  *      |            |___________|
-     *                 |   Closer  |  |  Farther  |  *   Direction        ____________
-     *                 |___________|  |___________|  *   of Search       |           |
-     *                                               *      |            |  Farther  |
-     *                                               *      v            |___________|
+     *     * ____________ ---- Direction of Search ---> * | focused | ____________ * | Item | |
+     *       focused | * |___________| | Item | * ____________ |___________| * | | ____________
+     *       ____________ * | | Closer | | | | | * | |___________| | Closer | | Farther | *
+     *       Direction ____________ |___________| |___________| * of Search | |
+     *     * | | Farther |
+     *     * v |___________|
      */
     @LargeTest
     @Test
@@ -4806,9 +4296,7 @@
             }
         }
         // Act.
-        rule.runOnIdle {
-            focusManager.moveFocus(focusDirection)
-        }
+        rule.runOnIdle { focusManager.moveFocus(focusDirection) }
 
         // Assert.
         rule.runOnIdle {
@@ -4819,32 +4307,16 @@
     }
 
     /**
-     *   ____________                                *        ____________                  ^
-     *  |           |                                *       |           |                  |
-     *  |  Farther  |   ____________                 *       |  Farther  |              Direction
-     *  |___________|  |           |                 *       |___________|              of Search
-     *                 |   Closer  |                 *               ____________            |
-     *                 |___________|                 *              |           |            |
-     *                                 ____________  *              |   Closer  |
-     *                                |  focused  |  *              |___________|
-     *                                |    Item   |  *                                 ____________
-     *                                |___________|  *                                |  focused  |
-     *                                               *                                |    Item   |
-     *        <---- Direction of Search ---          *                                |___________|
-     *                                               *
+     * ____________ * ____________ ^ | | * | | | | Farther | ____________ * | Farther | Direction
+     * |___________| | | * |___________| of Search | Closer | * ____________ | |___________| * | | |
+     * ____________ * | Closer | | focused | * |___________| | Item | * ____________ |___________| *
+     * | focused |
+     * * | Item | <---- Direction of Search --- * |___________| *
      * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
-     *                                               *   ____________
-     *        ---- Direction of Search --->          *  |  focused  |
-     *   ____________                                *  |    Item   |
-     *  |  focused  |                                *  |___________|
-     *  |    Item   |                                *                  ____________
-     *  |___________|                                *                 |           |
-     *                  ____________                 *      |          |   Closer  |
-     *                 |           |                 *      |          |___________|
-     *                 |   Closer  |   ____________  *   Direction             ____________
-     *                 |___________|  |           |  *   of Search            |           |
-     *                                |  Farther  |  *      |                 |  Farther  |
-     *                                |___________|  *      v                 |___________|
+     * * ____________ ---- Direction of Search ---> * | focused | ____________ * | Item | | focused
+     *   | * |___________| | Item | * ____________ |___________| * | | ____________ * | | Closer | |
+     *   | * | |___________| | Closer | ____________ * Direction ____________ |___________| | | * of
+     *   Search | | | Farther | * | | Farther | |___________| * v |___________|
      */
     @LargeTest
     @Test
@@ -4877,9 +4349,7 @@
             }
         }
         // Act.
-        rule.runOnIdle {
-            focusManager.moveFocus(focusDirection)
-        }
+        rule.runOnIdle { focusManager.moveFocus(focusDirection) }
 
         // Assert.
         rule.runOnIdle {
@@ -4890,21 +4360,10 @@
     }
 
     /**
-     *   ____________
-     *  |           |
-     *  |  Farther  |                                     ^
-     *  |___________|                                     |
-     *                  ____________                  Direction
-     *                 |           |                  of Search
-     *                 |   Closer  |                      |
-     *                 |___________|                      |
-     *                                 ____________
-     *                                |  focused  |
-     *                                |    Item   |
-     *                                |___________|
+     * ____________ | | | Farther | ^ |___________| | ____________ Direction | | of Search | Closer
+     * | | |___________| | ____________ | focused | | Item | |___________|
      *
      *        <---- Direction of Search ---
-     *
      * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
      *
      *        ---- Direction of Search --->
@@ -4928,12 +4387,14 @@
         val (focusedItem, closer, farther) = List(3) { mutableStateOf(false) }
         rule.setContentForTest {
             when (focusDirection) {
-                Left, Up -> {
+                Left,
+                Up -> {
                     FocusableBox(focusedItem, 60, 60, 20, 20, initialFocus)
                     FocusableBox(closer, 30, 30, 20, 20)
                     FocusableBox(farther, 0, 0, 20, 20)
                 }
-                Right, Down -> {
+                Right,
+                Down -> {
                     FocusableBox(focusedItem, 0, 0, 20, 20, initialFocus)
                     FocusableBox(closer, 30, 30, 20, 20)
                     FocusableBox(farther, 60, 60, 20, 20)
@@ -4942,9 +4403,7 @@
             }
         }
         // Act.
-        rule.runOnIdle {
-            focusManager.moveFocus(focusDirection)
-        }
+        rule.runOnIdle { focusManager.moveFocus(focusDirection) }
 
         // Assert.
         rule.runOnIdle {
@@ -4971,20 +4430,11 @@
      *        <---- Direction of Search ---          *                                |___________|
      *                                               *
      * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
-     *                                               *   ____________
-     *        ---- Direction of Search --->          *  |  focused  |
-     *   ____________                                *  |    Item   |
-     *  |  focused  |                                *  |___________|
-     *  |    Item   |                                *                  ____________
-     *  |___________|                                *                 |           |
-     *                   ____________                *      |          |   Closer  |    ____________
-     *                  |           |                *      |          |___________|   |           |
-     *                  |   Closer  |                *   Direction                     |  Farther  |
-     *                  |___________|                *   of Search                     |___________|
-     *                           ____________        *      |
-     *                          |           |        *      v
-     *                          |  Farther  |        *
-     *                          |___________|        *
+     *     * ____________ ---- Direction of Search ---> * | focused | ____________ * | Item | |
+     *       focused | * |___________| | Item | * ____________ |___________| * | | ____________ * |
+     *       | Closer | ____________ | | * | |___________| | | | Closer | * Direction | Farther |
+     *       |___________| * of Search |___________| ____________ * | | | * v | Farther | *
+     *       |___________| *
      */
     @LargeTest
     @Test
@@ -5017,9 +4467,7 @@
             }
         }
         // Act.
-        rule.runOnIdle {
-            focusManager.moveFocus(focusDirection)
-        }
+        rule.runOnIdle { focusManager.moveFocus(focusDirection) }
 
         // Assert.
         rule.runOnIdle {
@@ -5046,20 +4494,11 @@
      *        <---- Direction of Search ---          *                                |___________|
      *                                               *
      * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
-     *                                               *   ____________
-     *        ---- Direction of Search --->          *  |  focused  |
-     *   ____________                                *  |    Item   |
-     *  |  focused  |                                *  |___________|
-     *  |    Item   |                                *                  ____________    ____________
-     *  |___________|                                *                 |           |   |           |
-     *                   ____________                *      |          |   Closer  |   |  Farther  |
-     *                  |           |                *      |          |___________|   |___________|
-     *                  |   Closer  |                *   Direction
-     *                  |___________|                *   of Search
-     *                   ____________                *      |
-     *                  |           |                *      v
-     *                  |  Farther  |                *
-     *                  |___________|                *
+     *     * ____________ ---- Direction of Search ---> * | focused | ____________ * | Item | |
+     *       focused | * |___________| | Item | * ____________ ____________ |___________| * | | | |
+     *       ____________ * | | Closer | | Farther | | | * | |___________| |___________| | Closer
+     *       | * Direction |___________| * of Search ____________ * | | | * v | Farther | *
+     *       |___________| *
      */
     @LargeTest
     @Test
@@ -5092,9 +4531,7 @@
             }
         }
         // Act.
-        rule.runOnIdle {
-            focusManager.moveFocus(focusDirection)
-        }
+        rule.runOnIdle { focusManager.moveFocus(focusDirection) }
 
         // Assert.
         rule.runOnIdle {
@@ -5121,20 +4558,11 @@
      *        <---- Direction of Search ---          *                                |___________|
      *                                               *
      * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
-     *                                               *  ____________
-     *        ---- Direction of Search --->          * |  focused  |
-     *   ____________                                * |    Item   |
-     *  |  focused  |                                * |___________|
-     *  |    Item   |                                *                                  ____________
-     *  |___________|                                *                                 |           |
-     *                            ____________       *      |           ____________   |  Farther  |
-     *                           |           |       *      |          |           |   |___________|
-     *                           |   Closer  |       *   Direction     |   Closer  |
-     *                           |___________|       *   of Search     |___________|
-     *                      ____________             *      |
-     *                     |           |             *      v
-     *                     |  Farther  |             *
-     *                     |___________|             *
+     *     * ____________ ---- Direction of Search ---> * | focused | ____________ * | Item | |
+     *       focused | * |___________| | Item | * ____________ |___________| * | | ____________ * |
+     *       ____________ | Farther | | | * | | | |___________| | Closer | * Direction | Closer |
+     *       |___________| * of Search |___________| ____________ * | | | * v | Farther | *
+     *       |___________| *
      */
     @MediumTest
     @Test
@@ -5167,9 +4595,7 @@
             }
         }
         // Act.
-        rule.runOnIdle {
-            focusManager.moveFocus(focusDirection)
-        }
+        rule.runOnIdle { focusManager.moveFocus(focusDirection) }
 
         // Assert.
         rule.runOnIdle {
diff --git a/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/focus/TwoDimensionalFocusTraversalTwoItemsTest.kt b/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/focus/TwoDimensionalFocusTraversalTwoItemsTest.kt
index 52425ca..49650ee 100644
--- a/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/focus/TwoDimensionalFocusTraversalTwoItemsTest.kt
+++ b/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/focus/TwoDimensionalFocusTraversalTwoItemsTest.kt
@@ -38,8 +38,7 @@
 
 @RunWith(Parameterized::class)
 class TwoDimensionalFocusTraversalTwoItemsTest(param: Param) {
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
     // We need to wrap the inline class parameter in another class because Java can't instantiate
     // the inline class.
@@ -77,9 +76,7 @@
         }
 
         // Act.
-        rule.runOnIdle {
-            focusManager.moveFocus(focusDirection)
-        }
+        rule.runOnIdle { focusManager.moveFocus(focusDirection) }
 
         // Assert.
         rule.runOnIdle {
@@ -88,7 +85,9 @@
                     assertThat(focusedItem.value).isFalse()
                     assertThat(candidate.value).isTrue()
                 }
-                Down, Left, Right -> {
+                Down,
+                Left,
+                Right -> {
                     assertThat(focusedItem.value).isTrue()
                     assertThat(candidate.value).isFalse()
                 }
@@ -115,9 +114,7 @@
         }
 
         // Act.
-        rule.runOnIdle {
-            focusManager.moveFocus(focusDirection)
-        }
+        rule.runOnIdle { focusManager.moveFocus(focusDirection) }
 
         // Assert.
         rule.runOnIdle {
@@ -126,7 +123,9 @@
                     assertThat(focusedItem.value).isFalse()
                     assertThat(candidate.value).isTrue()
                 }
-                Down, Left, Right -> {
+                Down,
+                Left,
+                Right -> {
                     assertThat(focusedItem.value).isTrue()
                     assertThat(candidate.value).isFalse()
                 }
@@ -153,9 +152,7 @@
         }
 
         // Act.
-        rule.runOnIdle {
-            focusManager.moveFocus(focusDirection)
-        }
+        rule.runOnIdle { focusManager.moveFocus(focusDirection) }
 
         // Assert.
         rule.runOnIdle {
@@ -164,7 +161,9 @@
                     assertThat(focusedItem.value).isFalse()
                     assertThat(candidate.value).isTrue()
                 }
-                Down, Left, Right -> {
+                Down,
+                Left,
+                Right -> {
                     assertThat(focusedItem.value).isTrue()
                     assertThat(candidate.value).isFalse()
                 }
@@ -191,9 +190,7 @@
         }
 
         // Act.
-        rule.runOnIdle {
-            focusManager.moveFocus(focusDirection)
-        }
+        rule.runOnIdle { focusManager.moveFocus(focusDirection) }
 
         // Assert.
         rule.runOnIdle {
@@ -202,7 +199,9 @@
                     assertThat(focusedItem.value).isFalse()
                     assertThat(candidate.value).isTrue()
                 }
-                Down, Left, Right -> {
+                Down,
+                Left,
+                Right -> {
                     assertThat(focusedItem.value).isTrue()
                     assertThat(candidate.value).isFalse()
                 }
@@ -229,9 +228,7 @@
         }
 
         // Act.
-        rule.runOnIdle {
-            focusManager.moveFocus(focusDirection)
-        }
+        rule.runOnIdle { focusManager.moveFocus(focusDirection) }
 
         // Assert.
         rule.runOnIdle {
@@ -240,7 +237,9 @@
                     assertThat(focusedItem.value).isFalse()
                     assertThat(candidate.value).isTrue()
                 }
-                Down, Left, Right -> {
+                Down,
+                Left,
+                Right -> {
                     assertThat(focusedItem.value).isTrue()
                     assertThat(candidate.value).isFalse()
                 }
@@ -267,18 +266,18 @@
         }
 
         // Act.
-        rule.runOnIdle {
-            focusManager.moveFocus(focusDirection)
-        }
+        rule.runOnIdle { focusManager.moveFocus(focusDirection) }
 
         // Assert.
         rule.runOnIdle {
             when (focusDirection) {
-                Up, Right -> {
+                Up,
+                Right -> {
                     assertThat(focusedItem.value).isFalse()
                     assertThat(candidate.value).isTrue()
                 }
-                Down, Left -> {
+                Down,
+                Left -> {
                     assertThat(focusedItem.value).isTrue()
                     assertThat(candidate.value).isFalse()
                 }
@@ -305,18 +304,18 @@
         }
 
         // Act.
-        rule.runOnIdle {
-            focusManager.moveFocus(focusDirection)
-        }
+        rule.runOnIdle { focusManager.moveFocus(focusDirection) }
 
         // Assert.
         rule.runOnIdle {
             when (focusDirection) {
-                Up, Right -> {
+                Up,
+                Right -> {
                     assertThat(focusedItem.value).isFalse()
                     assertThat(candidate.value).isTrue()
                 }
-                Down, Left -> {
+                Down,
+                Left -> {
                     assertThat(focusedItem.value).isTrue()
                     assertThat(candidate.value).isFalse()
                 }
@@ -343,18 +342,18 @@
         }
 
         // Act.
-        rule.runOnIdle {
-            focusManager.moveFocus(focusDirection)
-        }
+        rule.runOnIdle { focusManager.moveFocus(focusDirection) }
 
         // Assert.
         rule.runOnIdle {
             when (focusDirection) {
-                Up, Right -> {
+                Up,
+                Right -> {
                     assertThat(focusedItem.value).isFalse()
                     assertThat(candidate.value).isTrue()
                 }
-                Down, Left -> {
+                Down,
+                Left -> {
                     assertThat(focusedItem.value).isTrue()
                     assertThat(candidate.value).isFalse()
                 }
@@ -380,18 +379,18 @@
         }
 
         // Act.
-        rule.runOnIdle {
-            focusManager.moveFocus(focusDirection)
-        }
+        rule.runOnIdle { focusManager.moveFocus(focusDirection) }
 
         // Assert.
         rule.runOnIdle {
             when (focusDirection) {
-                Up, Right -> {
+                Up,
+                Right -> {
                     assertThat(focusedItem.value).isFalse()
                     assertThat(candidate.value).isTrue()
                 }
-                Down, Left -> {
+                Down,
+                Left -> {
                     assertThat(focusedItem.value).isTrue()
                     assertThat(candidate.value).isFalse()
                 }
@@ -416,18 +415,18 @@
         }
 
         // Act.
-        rule.runOnIdle {
-            focusManager.moveFocus(focusDirection)
-        }
+        rule.runOnIdle { focusManager.moveFocus(focusDirection) }
 
         // Assert.
         rule.runOnIdle {
             when (focusDirection) {
-                Up, Right -> {
+                Up,
+                Right -> {
                     assertThat(focusedItem.value).isFalse()
                     assertThat(candidate.value).isTrue()
                 }
-                Down, Left -> {
+                Down,
+                Left -> {
                     assertThat(focusedItem.value).isTrue()
                     assertThat(candidate.value).isFalse()
                 }
@@ -452,9 +451,7 @@
         }
 
         // Act.
-        rule.runOnIdle {
-            focusManager.moveFocus(focusDirection)
-        }
+        rule.runOnIdle { focusManager.moveFocus(focusDirection) }
 
         // Assert.
         rule.runOnIdle {
@@ -463,7 +460,9 @@
                     assertThat(focusedItem.value).isFalse()
                     assertThat(candidate.value).isTrue()
                 }
-                Up, Down, Left -> {
+                Up,
+                Down,
+                Left -> {
                     assertThat(focusedItem.value).isTrue()
                     assertThat(candidate.value).isFalse()
                 }
@@ -489,9 +488,7 @@
         }
 
         // Act.
-        rule.runOnIdle {
-            focusManager.moveFocus(focusDirection)
-        }
+        rule.runOnIdle { focusManager.moveFocus(focusDirection) }
 
         // Assert.
         rule.runOnIdle {
@@ -500,7 +497,9 @@
                     assertThat(focusedItem.value).isFalse()
                     assertThat(candidate.value).isTrue()
                 }
-                Up, Down, Left -> {
+                Up,
+                Down,
+                Left -> {
                     assertThat(focusedItem.value).isTrue()
                     assertThat(candidate.value).isFalse()
                 }
@@ -526,9 +525,7 @@
         }
 
         // Act.
-        rule.runOnIdle {
-            focusManager.moveFocus(focusDirection)
-        }
+        rule.runOnIdle { focusManager.moveFocus(focusDirection) }
 
         // Assert.
         rule.runOnIdle {
@@ -537,7 +534,9 @@
                     assertThat(focusedItem.value).isFalse()
                     assertThat(candidate.value).isTrue()
                 }
-                Up, Down, Left -> {
+                Up,
+                Down,
+                Left -> {
                     assertThat(focusedItem.value).isTrue()
                     assertThat(candidate.value).isFalse()
                 }
@@ -563,9 +562,7 @@
         }
 
         // Act.
-        rule.runOnIdle {
-            focusManager.moveFocus(focusDirection)
-        }
+        rule.runOnIdle { focusManager.moveFocus(focusDirection) }
 
         // Assert.
         rule.runOnIdle {
@@ -574,7 +571,9 @@
                     assertThat(focusedItem.value).isFalse()
                     assertThat(candidate.value).isTrue()
                 }
-                Up, Down, Left -> {
+                Up,
+                Down,
+                Left -> {
                     assertThat(focusedItem.value).isTrue()
                     assertThat(candidate.value).isFalse()
                 }
@@ -600,9 +599,7 @@
         }
 
         // Act.
-        rule.runOnIdle {
-            focusManager.moveFocus(focusDirection)
-        }
+        rule.runOnIdle { focusManager.moveFocus(focusDirection) }
 
         // Assert.
         rule.runOnIdle {
@@ -611,7 +608,9 @@
                     assertThat(focusedItem.value).isFalse()
                     assertThat(candidate.value).isTrue()
                 }
-                Up, Down, Left -> {
+                Up,
+                Down,
+                Left -> {
                     assertThat(focusedItem.value).isTrue()
                     assertThat(candidate.value).isFalse()
                 }
@@ -635,9 +634,7 @@
         }
 
         // Act.
-        rule.runOnIdle {
-            focusManager.moveFocus(focusDirection)
-        }
+        rule.runOnIdle { focusManager.moveFocus(focusDirection) }
 
         // Assert.
         rule.runOnIdle {
@@ -646,7 +643,9 @@
                     assertThat(focusedItem.value).isFalse()
                     assertThat(candidate.value).isTrue()
                 }
-                Up, Down, Left -> {
+                Up,
+                Down,
+                Left -> {
                     assertThat(focusedItem.value).isTrue()
                     assertThat(candidate.value).isFalse()
                 }
@@ -671,9 +670,7 @@
         }
 
         // Act.
-        rule.runOnIdle {
-            focusManager.moveFocus(focusDirection)
-        }
+        rule.runOnIdle { focusManager.moveFocus(focusDirection) }
 
         // Assert.
         rule.runOnIdle {
@@ -682,7 +679,9 @@
                     assertThat(focusedItem.value).isFalse()
                     assertThat(candidate.value).isTrue()
                 }
-                Up, Down, Left -> {
+                Up,
+                Down,
+                Left -> {
                     assertThat(focusedItem.value).isTrue()
                     assertThat(candidate.value).isFalse()
                 }
@@ -707,18 +706,18 @@
         }
 
         // Act.
-        rule.runOnIdle {
-            focusManager.moveFocus(focusDirection)
-        }
+        rule.runOnIdle { focusManager.moveFocus(focusDirection) }
 
         // Assert.
         rule.runOnIdle {
             when (focusDirection) {
-                Right, Down -> {
+                Right,
+                Down -> {
                     assertThat(focusedItem.value).isFalse()
                     assertThat(candidate.value).isTrue()
                 }
-                Up, Left -> {
+                Up,
+                Left -> {
                     assertThat(focusedItem.value).isTrue()
                     assertThat(candidate.value).isFalse()
                 }
@@ -744,18 +743,18 @@
         }
 
         // Act.
-        rule.runOnIdle {
-            focusManager.moveFocus(focusDirection)
-        }
+        rule.runOnIdle { focusManager.moveFocus(focusDirection) }
 
         // Assert.
         rule.runOnIdle {
             when (focusDirection) {
-                Right, Down -> {
+                Right,
+                Down -> {
                     assertThat(focusedItem.value).isFalse()
                     assertThat(candidate.value).isTrue()
                 }
-                Up, Left -> {
+                Up,
+                Left -> {
                     assertThat(focusedItem.value).isTrue()
                     assertThat(candidate.value).isFalse()
                 }
@@ -782,18 +781,18 @@
         }
 
         // Act.
-        rule.runOnIdle {
-            focusManager.moveFocus(focusDirection)
-        }
+        rule.runOnIdle { focusManager.moveFocus(focusDirection) }
 
         // Assert.
         rule.runOnIdle {
             when (focusDirection) {
-                Right, Down -> {
+                Right,
+                Down -> {
                     assertThat(focusedItem.value).isFalse()
                     assertThat(candidate.value).isTrue()
                 }
-                Up, Left -> {
+                Up,
+                Left -> {
                     assertThat(focusedItem.value).isTrue()
                     assertThat(candidate.value).isFalse()
                 }
@@ -820,18 +819,18 @@
         }
 
         // Act.
-        rule.runOnIdle {
-            focusManager.moveFocus(focusDirection)
-        }
+        rule.runOnIdle { focusManager.moveFocus(focusDirection) }
 
         // Assert.
         rule.runOnIdle {
             when (focusDirection) {
-                Right, Down -> {
+                Right,
+                Down -> {
                     assertThat(focusedItem.value).isFalse()
                     assertThat(candidate.value).isTrue()
                 }
-                Up, Left -> {
+                Up,
+                Left -> {
                     assertThat(focusedItem.value).isTrue()
                     assertThat(candidate.value).isFalse()
                 }
@@ -858,18 +857,18 @@
         }
 
         // Act.
-        rule.runOnIdle {
-            focusManager.moveFocus(focusDirection)
-        }
+        rule.runOnIdle { focusManager.moveFocus(focusDirection) }
 
         // Assert.
         rule.runOnIdle {
             when (focusDirection) {
-                Right, Down -> {
+                Right,
+                Down -> {
                     assertThat(focusedItem.value).isFalse()
                     assertThat(candidate.value).isTrue()
                 }
-                Up, Left -> {
+                Up,
+                Left -> {
                     assertThat(focusedItem.value).isTrue()
                     assertThat(candidate.value).isFalse()
                 }
@@ -896,9 +895,7 @@
         }
 
         // Act.
-        rule.runOnIdle {
-            focusManager.moveFocus(focusDirection)
-        }
+        rule.runOnIdle { focusManager.moveFocus(focusDirection) }
 
         // Assert.
         rule.runOnIdle {
@@ -907,7 +904,9 @@
                     assertThat(focusedItem.value).isFalse()
                     assertThat(candidate.value).isTrue()
                 }
-                Up, Left, Right -> {
+                Up,
+                Left,
+                Right -> {
                     assertThat(focusedItem.value).isTrue()
                     assertThat(candidate.value).isFalse()
                 }
@@ -934,9 +933,7 @@
         }
 
         // Act.
-        rule.runOnIdle {
-            focusManager.moveFocus(focusDirection)
-        }
+        rule.runOnIdle { focusManager.moveFocus(focusDirection) }
 
         // Assert.
         rule.runOnIdle {
@@ -945,7 +942,9 @@
                     assertThat(focusedItem.value).isFalse()
                     assertThat(candidate.value).isTrue()
                 }
-                Up, Left, Right -> {
+                Up,
+                Left,
+                Right -> {
                     assertThat(focusedItem.value).isTrue()
                     assertThat(candidate.value).isFalse()
                 }
@@ -972,9 +971,7 @@
         }
 
         // Act.
-        rule.runOnIdle {
-            focusManager.moveFocus(focusDirection)
-        }
+        rule.runOnIdle { focusManager.moveFocus(focusDirection) }
 
         // Assert.
         rule.runOnIdle {
@@ -983,7 +980,9 @@
                     assertThat(focusedItem.value).isFalse()
                     assertThat(candidate.value).isTrue()
                 }
-                Up, Left, Right -> {
+                Up,
+                Left,
+                Right -> {
                     assertThat(focusedItem.value).isTrue()
                     assertThat(candidate.value).isFalse()
                 }
@@ -1010,9 +1009,7 @@
         }
 
         // Act.
-        rule.runOnIdle {
-            focusManager.moveFocus(focusDirection)
-        }
+        rule.runOnIdle { focusManager.moveFocus(focusDirection) }
 
         // Assert.
         rule.runOnIdle {
@@ -1021,7 +1018,9 @@
                     assertThat(focusedItem.value).isFalse()
                     assertThat(candidate.value).isTrue()
                 }
-                Up, Left, Right -> {
+                Up,
+                Left,
+                Right -> {
                     assertThat(focusedItem.value).isTrue()
                     assertThat(candidate.value).isFalse()
                 }
@@ -1048,9 +1047,7 @@
         }
 
         // Act.
-        rule.runOnIdle {
-            focusManager.moveFocus(focusDirection)
-        }
+        rule.runOnIdle { focusManager.moveFocus(focusDirection) }
 
         // Assert.
         rule.runOnIdle {
@@ -1059,7 +1056,9 @@
                     assertThat(focusedItem.value).isFalse()
                     assertThat(candidate.value).isTrue()
                 }
-                Up, Left, Right -> {
+                Up,
+                Left,
+                Right -> {
                     assertThat(focusedItem.value).isTrue()
                     assertThat(candidate.value).isFalse()
                 }
@@ -1086,9 +1085,7 @@
         }
 
         // Act.
-        rule.runOnIdle {
-            focusManager.moveFocus(focusDirection)
-        }
+        rule.runOnIdle { focusManager.moveFocus(focusDirection) }
 
         // Assert.
         rule.runOnIdle {
@@ -1097,7 +1094,9 @@
                     assertThat(focusedItem.value).isFalse()
                     assertThat(candidate.value).isTrue()
                 }
-                Up, Left, Right -> {
+                Up,
+                Left,
+                Right -> {
                     assertThat(focusedItem.value).isTrue()
                     assertThat(candidate.value).isFalse()
                 }
@@ -1124,18 +1123,18 @@
         }
 
         // Act.
-        rule.runOnIdle {
-            focusManager.moveFocus(focusDirection)
-        }
+        rule.runOnIdle { focusManager.moveFocus(focusDirection) }
 
         // Assert.
         rule.runOnIdle {
             when (focusDirection) {
-                Left, Down -> {
+                Left,
+                Down -> {
                     assertThat(focusedItem.value).isFalse()
                     assertThat(candidate.value).isTrue()
                 }
-                Up, Right -> {
+                Up,
+                Right -> {
                     assertThat(focusedItem.value).isTrue()
                     assertThat(candidate.value).isFalse()
                 }
@@ -1162,18 +1161,18 @@
         }
 
         // Act.
-        rule.runOnIdle {
-            focusManager.moveFocus(focusDirection)
-        }
+        rule.runOnIdle { focusManager.moveFocus(focusDirection) }
 
         // Assert.
         rule.runOnIdle {
             when (focusDirection) {
-                Left, Down -> {
+                Left,
+                Down -> {
                     assertThat(focusedItem.value).isFalse()
                     assertThat(candidate.value).isTrue()
                 }
-                Up, Right -> {
+                Up,
+                Right -> {
                     assertThat(focusedItem.value).isTrue()
                     assertThat(candidate.value).isFalse()
                 }
@@ -1200,18 +1199,18 @@
         }
 
         // Act.
-        rule.runOnIdle {
-            focusManager.moveFocus(focusDirection)
-        }
+        rule.runOnIdle { focusManager.moveFocus(focusDirection) }
 
         // Assert.
         rule.runOnIdle {
             when (focusDirection) {
-                Left, Down -> {
+                Left,
+                Down -> {
                     assertThat(focusedItem.value).isFalse()
                     assertThat(candidate.value).isTrue()
                 }
-                Up, Right -> {
+                Up,
+                Right -> {
                     assertThat(focusedItem.value).isTrue()
                     assertThat(candidate.value).isFalse()
                 }
@@ -1237,18 +1236,18 @@
         }
 
         // Act.
-        rule.runOnIdle {
-            focusManager.moveFocus(focusDirection)
-        }
+        rule.runOnIdle { focusManager.moveFocus(focusDirection) }
 
         // Assert.
         rule.runOnIdle {
             when (focusDirection) {
-                Left, Down -> {
+                Left,
+                Down -> {
                     assertThat(focusedItem.value).isFalse()
                     assertThat(candidate.value).isTrue()
                 }
-                Up, Right -> {
+                Up,
+                Right -> {
                     assertThat(focusedItem.value).isTrue()
                     assertThat(candidate.value).isFalse()
                 }
@@ -1273,18 +1272,18 @@
         }
 
         // Act.
-        rule.runOnIdle {
-            focusManager.moveFocus(focusDirection)
-        }
+        rule.runOnIdle { focusManager.moveFocus(focusDirection) }
 
         // Assert.
         rule.runOnIdle {
             when (focusDirection) {
-                Left, Down -> {
+                Left,
+                Down -> {
                     assertThat(focusedItem.value).isFalse()
                     assertThat(candidate.value).isTrue()
                 }
-                Up, Right -> {
+                Up,
+                Right -> {
                     assertThat(focusedItem.value).isTrue()
                     assertThat(candidate.value).isFalse()
                 }
@@ -1294,10 +1293,8 @@
     }
 
     /**
-     *   ________________    ________________
-     *  |               |   |  focusedItem  |
-     *  |   candidate   |   |_______________|
-     *  |_______________|
+     * ________________ ________________ | | | focusedItem | | candidate | |_______________|
+     * |_______________|
      */
     @LargeTest
     @Test
@@ -1309,9 +1306,7 @@
         }
 
         // Act.
-        rule.runOnIdle {
-            focusManager.moveFocus(focusDirection)
-        }
+        rule.runOnIdle { focusManager.moveFocus(focusDirection) }
 
         // Assert.
         rule.runOnIdle {
@@ -1320,7 +1315,9 @@
                     assertThat(focusedItem.value).isFalse()
                     assertThat(candidate.value).isTrue()
                 }
-                Up, Down, Right -> {
+                Up,
+                Down,
+                Right -> {
                     assertThat(focusedItem.value).isTrue()
                     assertThat(candidate.value).isFalse()
                 }
@@ -1330,9 +1327,8 @@
     }
 
     /**
-     *   ________________   ________________
-     *  |   candidate   |  |  focusedItem  |
-     *  |_______________|  |_______________|
+     * ________________ ________________ | candidate | | focusedItem | |_______________|
+     * |_______________|
      */
     @LargeTest
     @Test
@@ -1344,9 +1340,7 @@
         }
 
         // Act.
-        rule.runOnIdle {
-            focusManager.moveFocus(focusDirection)
-        }
+        rule.runOnIdle { focusManager.moveFocus(focusDirection) }
 
         // Assert.
         rule.runOnIdle {
@@ -1355,7 +1349,9 @@
                     assertThat(focusedItem.value).isFalse()
                     assertThat(candidate.value).isTrue()
                 }
-                Up, Down, Right -> {
+                Up,
+                Down,
+                Right -> {
                     assertThat(focusedItem.value).isTrue()
                     assertThat(candidate.value).isFalse()
                 }
@@ -1365,11 +1361,8 @@
     }
 
     /**
-     *   ________________    ________________
-     *  |   candidate   |   |               |
-     *  |_______________|   |  focusedItem  |
-     *                      |               |
-     *                      |_______________|
+     * ________________ ________________ | candidate | | | |_______________| | focusedItem | | |
+     * |_______________|
      */
     @LargeTest
     @Test
@@ -1381,9 +1374,7 @@
         }
 
         // Act.
-        rule.runOnIdle {
-            focusManager.moveFocus(focusDirection)
-        }
+        rule.runOnIdle { focusManager.moveFocus(focusDirection) }
 
         // Assert.
         rule.runOnIdle {
@@ -1392,7 +1383,9 @@
                     assertThat(focusedItem.value).isFalse()
                     assertThat(candidate.value).isTrue()
                 }
-                Up, Down, Right -> {
+                Up,
+                Down,
+                Right -> {
                     assertThat(focusedItem.value).isTrue()
                     assertThat(candidate.value).isFalse()
                 }
@@ -1418,9 +1411,7 @@
         }
 
         // Act.
-        rule.runOnIdle {
-            focusManager.moveFocus(focusDirection)
-        }
+        rule.runOnIdle { focusManager.moveFocus(focusDirection) }
 
         // Assert.
         rule.runOnIdle {
@@ -1429,7 +1420,9 @@
                     assertThat(focusedItem.value).isFalse()
                     assertThat(candidate.value).isTrue()
                 }
-                Up, Down, Right -> {
+                Up,
+                Down,
+                Right -> {
                     assertThat(focusedItem.value).isTrue()
                     assertThat(candidate.value).isFalse()
                 }
@@ -1455,9 +1448,7 @@
         }
 
         // Act.
-        rule.runOnIdle {
-            focusManager.moveFocus(focusDirection)
-        }
+        rule.runOnIdle { focusManager.moveFocus(focusDirection) }
 
         // Assert.
         rule.runOnIdle {
@@ -1466,7 +1457,9 @@
                     assertThat(focusedItem.value).isFalse()
                     assertThat(candidate.value).isTrue()
                 }
-                Up, Down, Right -> {
+                Up,
+                Down,
+                Right -> {
                     assertThat(focusedItem.value).isTrue()
                     assertThat(candidate.value).isFalse()
                 }
@@ -1476,11 +1469,8 @@
     }
 
     /**
-     *   ________________
-     *  |               |    ________________
-     *  |   candidate   |   |  focusedItem  |
-     *  |               |   |_______________|
-     *  |_______________|
+     * ________________ | | ________________ | candidate | | focusedItem | | | |_______________|
+     * |_______________|
      */
     @LargeTest
     @Test
@@ -1492,9 +1482,7 @@
         }
 
         // Act.
-        rule.runOnIdle {
-            focusManager.moveFocus(focusDirection)
-        }
+        rule.runOnIdle { focusManager.moveFocus(focusDirection) }
 
         // Assert.
         rule.runOnIdle {
@@ -1503,7 +1491,9 @@
                     assertThat(focusedItem.value).isFalse()
                     assertThat(candidate.value).isTrue()
                 }
-                Up, Down, Right -> {
+                Up,
+                Down,
+                Right -> {
                     assertThat(focusedItem.value).isTrue()
                     assertThat(candidate.value).isFalse()
                 }
@@ -1513,10 +1503,8 @@
     }
 
     /**
-     *    ________________
-     *   |               |   ________________
-     *   |   candidate   |  |  focusedItem  |
-     *   |_______________|  |_______________|
+     * ________________ | | ________________ | candidate | | focusedItem | |_______________|
+     * |_______________|
      */
     @LargeTest
     @Test
@@ -1528,9 +1516,7 @@
         }
 
         // Act.
-        rule.runOnIdle {
-            focusManager.moveFocus(focusDirection)
-        }
+        rule.runOnIdle { focusManager.moveFocus(focusDirection) }
 
         // Assert.
         rule.runOnIdle {
@@ -1539,7 +1525,9 @@
                     assertThat(focusedItem.value).isFalse()
                     assertThat(candidate.value).isTrue()
                 }
-                Up, Down, Right -> {
+                Up,
+                Down,
+                Right -> {
                     assertThat(focusedItem.value).isTrue()
                     assertThat(candidate.value).isFalse()
                 }
@@ -1549,10 +1537,8 @@
     }
 
     /**
-     *    ________________
-     *   |   candidate   |   ________________
-     *   |_______________|  |  focusedItem  |
-     *                      |_______________|
+     * ________________ | candidate | ________________ |_______________| | focusedItem |
+     * |_______________|
      */
     @LargeTest
     @Test
@@ -1564,18 +1550,18 @@
         }
 
         // Act.
-        rule.runOnIdle {
-            focusManager.moveFocus(focusDirection)
-        }
+        rule.runOnIdle { focusManager.moveFocus(focusDirection) }
 
         // Assert.
         rule.runOnIdle {
             when (focusDirection) {
-                Left, Up -> {
+                Left,
+                Up -> {
                     assertThat(focusedItem.value).isFalse()
                     assertThat(candidate.value).isTrue()
                 }
-                Right, Down -> {
+                Right,
+                Down -> {
                     assertThat(focusedItem.value).isTrue()
                     assertThat(candidate.value).isFalse()
                 }
@@ -1585,11 +1571,8 @@
     }
 
     /**
-     *    ________________
-     *   |   candidate   |
-     *   |_______________|   ________________
-     *                      |  focusedItem  |
-     *                      |_______________|
+     * ________________ | candidate | |_______________| ________________ | focusedItem |
+     * |_______________|
      */
     @LargeTest
     @Test
@@ -1601,18 +1584,18 @@
         }
 
         // Act.
-        rule.runOnIdle {
-            focusManager.moveFocus(focusDirection)
-        }
+        rule.runOnIdle { focusManager.moveFocus(focusDirection) }
 
         // Assert.
         rule.runOnIdle {
             when (focusDirection) {
-                Left, Up -> {
+                Left,
+                Up -> {
                     assertThat(focusedItem.value).isFalse()
                     assertThat(candidate.value).isTrue()
                 }
-                Right, Down -> {
+                Right,
+                Down -> {
                     assertThat(focusedItem.value).isTrue()
                     assertThat(candidate.value).isFalse()
                 }
@@ -1622,12 +1605,8 @@
     }
 
     /**
-     *    ________________
-     *   |   candidate   |
-     *   |_______________|
-     *                       ________________
-     *                      |  focusedItem  |
-     *                      |_______________|
+     * ________________ | candidate | |_______________| ________________ | focusedItem |
+     * |_______________|
      */
     @LargeTest
     @Test
@@ -1639,18 +1618,18 @@
         }
 
         // Act.
-        rule.runOnIdle {
-            focusManager.moveFocus(focusDirection)
-        }
+        rule.runOnIdle { focusManager.moveFocus(focusDirection) }
 
         // Assert.
         rule.runOnIdle {
             when (focusDirection) {
-                Left, Up -> {
+                Left,
+                Up -> {
                     assertThat(focusedItem.value).isFalse()
                     assertThat(candidate.value).isTrue()
                 }
-                Right, Down -> {
+                Right,
+                Down -> {
                     assertThat(focusedItem.value).isTrue()
                     assertThat(candidate.value).isFalse()
                 }
@@ -1677,18 +1656,18 @@
         }
 
         // Act.
-        rule.runOnIdle {
-            focusManager.moveFocus(focusDirection)
-        }
+        rule.runOnIdle { focusManager.moveFocus(focusDirection) }
 
         // Assert.
         rule.runOnIdle {
             when (focusDirection) {
-                Left, Up -> {
+                Left,
+                Up -> {
                     assertThat(focusedItem.value).isFalse()
                     assertThat(candidate.value).isTrue()
                 }
-                Right, Down -> {
+                Right,
+                Down -> {
                     assertThat(focusedItem.value).isTrue()
                     assertThat(candidate.value).isFalse()
                 }
@@ -1715,18 +1694,18 @@
         }
 
         // Act.
-        rule.runOnIdle {
-            focusManager.moveFocus(focusDirection)
-        }
+        rule.runOnIdle { focusManager.moveFocus(focusDirection) }
 
         // Assert.
         rule.runOnIdle {
             when (focusDirection) {
-                Left, Up -> {
+                Left,
+                Up -> {
                     assertThat(focusedItem.value).isFalse()
                     assertThat(candidate.value).isTrue()
                 }
-                Right, Down -> {
+                Right,
+                Down -> {
                     assertThat(focusedItem.value).isTrue()
                     assertThat(candidate.value).isFalse()
                 }
@@ -1753,9 +1732,7 @@
         }
 
         // Act.
-        rule.runOnIdle {
-            focusManager.moveFocus(focusDirection)
-        }
+        rule.runOnIdle { focusManager.moveFocus(focusDirection) }
 
         // Assert.
         rule.runOnIdle {
@@ -1764,7 +1741,9 @@
                     assertThat(focusedItem.value).isFalse()
                     assertThat(candidate.value).isTrue()
                 }
-                Left, Right, Down -> {
+                Left,
+                Right,
+                Down -> {
                     assertThat(focusedItem.value).isTrue()
                     assertThat(candidate.value).isFalse()
                 }
@@ -1790,9 +1769,7 @@
         }
 
         // Act.
-        rule.runOnIdle {
-            focusManager.moveFocus(focusDirection)
-        }
+        rule.runOnIdle { focusManager.moveFocus(focusDirection) }
 
         // Assert.
         rule.runOnIdle {
@@ -1801,7 +1778,9 @@
                     assertThat(focusedItem.value).isFalse()
                     assertThat(candidate.value).isTrue()
                 }
-                Left, Right, Down -> {
+                Left,
+                Right,
+                Down -> {
                     assertThat(focusedItem.value).isTrue()
                     assertThat(candidate.value).isFalse()
                 }
@@ -1827,9 +1806,7 @@
         }
 
         // Act.
-        rule.runOnIdle {
-            focusManager.moveFocus(focusDirection)
-        }
+        rule.runOnIdle { focusManager.moveFocus(focusDirection) }
 
         // Assert.
         rule.runOnIdle {
@@ -1838,7 +1815,9 @@
                     assertThat(focusedItem.value).isFalse()
                     assertThat(candidate.value).isTrue()
                 }
-                Left, Right, Down -> {
+                Left,
+                Right,
+                Down -> {
                     assertThat(focusedItem.value).isTrue()
                     assertThat(candidate.value).isFalse()
                 }
@@ -1864,9 +1843,7 @@
         }
 
         // Act.
-        rule.runOnIdle {
-            focusManager.moveFocus(focusDirection)
-        }
+        rule.runOnIdle { focusManager.moveFocus(focusDirection) }
 
         // Assert.
         rule.runOnIdle {
@@ -1875,7 +1852,9 @@
                     assertThat(focusedItem.value).isFalse()
                     assertThat(candidate.value).isTrue()
                 }
-                Left, Right, Down -> {
+                Left,
+                Right,
+                Down -> {
                     assertThat(focusedItem.value).isTrue()
                     assertThat(candidate.value).isFalse()
                 }
@@ -1901,9 +1880,7 @@
         }
 
         // Act.
-        rule.runOnIdle {
-            focusManager.moveFocus(focusDirection)
-        }
+        rule.runOnIdle { focusManager.moveFocus(focusDirection) }
 
         // Assert.
         rule.runOnIdle {
@@ -1912,7 +1889,9 @@
                     assertThat(focusedItem.value).isFalse()
                     assertThat(candidate.value).isTrue()
                 }
-                Left, Right, Down -> {
+                Left,
+                Right,
+                Down -> {
                     assertThat(focusedItem.value).isTrue()
                     assertThat(candidate.value).isFalse()
                 }
@@ -1938,9 +1917,7 @@
         }
 
         // Act.
-        rule.runOnIdle {
-            focusManager.moveFocus(focusDirection)
-        }
+        rule.runOnIdle { focusManager.moveFocus(focusDirection) }
 
         // Assert.
         rule.runOnIdle {
@@ -1949,7 +1926,9 @@
                     assertThat(focusedItem.value).isFalse()
                     assertThat(candidate.value).isTrue()
                 }
-                Left, Right, Down -> {
+                Left,
+                Right,
+                Down -> {
                     assertThat(focusedItem.value).isTrue()
                     assertThat(candidate.value).isFalse()
                 }
@@ -1975,18 +1954,18 @@
         }
 
         // Act.
-        rule.runOnIdle {
-            focusManager.moveFocus(focusDirection)
-        }
+        rule.runOnIdle { focusManager.moveFocus(focusDirection) }
 
         // Assert.
         rule.runOnIdle {
             when (focusDirection) {
-                Right, Up -> {
+                Right,
+                Up -> {
                     assertThat(focusedItem.value).isFalse()
                     assertThat(candidate.value).isTrue()
                 }
-                Left, Down -> {
+                Left,
+                Down -> {
                     assertThat(focusedItem.value).isTrue()
                     assertThat(candidate.value).isFalse()
                 }
@@ -2012,18 +1991,18 @@
         }
 
         // Act.
-        rule.runOnIdle {
-            focusManager.moveFocus(focusDirection)
-        }
+        rule.runOnIdle { focusManager.moveFocus(focusDirection) }
 
         // Assert.
         rule.runOnIdle {
             when (focusDirection) {
-                Right, Up -> {
+                Right,
+                Up -> {
                     assertThat(focusedItem.value).isFalse()
                     assertThat(candidate.value).isTrue()
                 }
-                Left, Down -> {
+                Left,
+                Down -> {
                     assertThat(focusedItem.value).isTrue()
                     assertThat(candidate.value).isFalse()
                 }
@@ -2048,18 +2027,18 @@
         }
 
         // Act.
-        rule.runOnIdle {
-            focusManager.moveFocus(focusDirection)
-        }
+        rule.runOnIdle { focusManager.moveFocus(focusDirection) }
 
         // Assert.
         rule.runOnIdle {
             when (focusDirection) {
-                Right, Up -> {
+                Right,
+                Up -> {
                     assertThat(focusedItem.value).isFalse()
                     assertThat(candidate.value).isTrue()
                 }
-                Left, Down -> {
+                Left,
+                Down -> {
                     assertThat(focusedItem.value).isTrue()
                     assertThat(candidate.value).isFalse()
                 }
@@ -2084,9 +2063,7 @@
         }
 
         // Act.
-        rule.runOnIdle {
-            focusManager.moveFocus(focusDirection)
-        }
+        rule.runOnIdle { focusManager.moveFocus(focusDirection) }
 
         // Assert.
         rule.runOnIdle {
@@ -2095,7 +2072,9 @@
                     assertThat(focusedItem.value).isFalse()
                     assertThat(candidate.value).isTrue()
                 }
-                Left, Up, Down -> {
+                Left,
+                Up,
+                Down -> {
                     assertThat(focusedItem.value).isTrue()
                     assertThat(candidate.value).isFalse()
                 }
@@ -2121,9 +2100,7 @@
         }
 
         // Act.
-        rule.runOnIdle {
-            focusManager.moveFocus(focusDirection)
-        }
+        rule.runOnIdle { focusManager.moveFocus(focusDirection) }
 
         // Assert.
         rule.runOnIdle {
@@ -2132,7 +2109,9 @@
                     assertThat(focusedItem.value).isFalse()
                     assertThat(candidate.value).isTrue()
                 }
-                Left, Up, Down -> {
+                Left,
+                Up,
+                Down -> {
                     assertThat(focusedItem.value).isTrue()
                     assertThat(candidate.value).isFalse()
                 }
@@ -2158,9 +2137,7 @@
         }
 
         // Act.
-        rule.runOnIdle {
-            focusManager.moveFocus(focusDirection)
-        }
+        rule.runOnIdle { focusManager.moveFocus(focusDirection) }
 
         // Assert.
         rule.runOnIdle {
@@ -2169,7 +2146,9 @@
                     assertThat(focusedItem.value).isFalse()
                     assertThat(candidate.value).isTrue()
                 }
-                Left, Up, Down -> {
+                Left,
+                Up,
+                Down -> {
                     assertThat(focusedItem.value).isTrue()
                     assertThat(candidate.value).isFalse()
                 }
@@ -2195,9 +2174,7 @@
         }
 
         // Act.
-        rule.runOnIdle {
-            focusManager.moveFocus(focusDirection)
-        }
+        rule.runOnIdle { focusManager.moveFocus(focusDirection) }
 
         // Assert.
         rule.runOnIdle {
@@ -2206,7 +2183,9 @@
                     assertThat(focusedItem.value).isFalse()
                     assertThat(candidate.value).isTrue()
                 }
-                Left, Up, Down -> {
+                Left,
+                Up,
+                Down -> {
                     assertThat(focusedItem.value).isTrue()
                     assertThat(candidate.value).isFalse()
                 }
@@ -2232,9 +2211,7 @@
         }
 
         // Act.
-        rule.runOnIdle {
-            focusManager.moveFocus(focusDirection)
-        }
+        rule.runOnIdle { focusManager.moveFocus(focusDirection) }
 
         // Assert.
         rule.runOnIdle {
@@ -2243,7 +2220,9 @@
                     assertThat(focusedItem.value).isFalse()
                     assertThat(candidate.value).isTrue()
                 }
-                Left, Up, Down -> {
+                Left,
+                Up,
+                Down -> {
                     assertThat(focusedItem.value).isTrue()
                     assertThat(candidate.value).isFalse()
                 }
@@ -2267,9 +2246,7 @@
         }
 
         // Act.
-        rule.runOnIdle {
-            focusManager.moveFocus(focusDirection)
-        }
+        rule.runOnIdle { focusManager.moveFocus(focusDirection) }
 
         // Assert.
         rule.runOnIdle {
@@ -2278,7 +2255,9 @@
                     assertThat(focusedItem.value).isFalse()
                     assertThat(candidate.value).isTrue()
                 }
-                Left, Up, Down -> {
+                Left,
+                Up,
+                Down -> {
                     assertThat(focusedItem.value).isTrue()
                     assertThat(candidate.value).isFalse()
                 }
@@ -2303,9 +2282,7 @@
         }
 
         // Act.
-        rule.runOnIdle {
-            focusManager.moveFocus(focusDirection)
-        }
+        rule.runOnIdle { focusManager.moveFocus(focusDirection) }
 
         // Assert.
         rule.runOnIdle {
@@ -2314,7 +2291,9 @@
                     assertThat(focusedItem.value).isFalse()
                     assertThat(candidate.value).isTrue()
                 }
-                Left, Up, Down -> {
+                Left,
+                Up,
+                Down -> {
                     assertThat(focusedItem.value).isTrue()
                     assertThat(candidate.value).isFalse()
                 }
@@ -2339,18 +2318,18 @@
         }
 
         // Act.
-        rule.runOnIdle {
-            focusManager.moveFocus(focusDirection)
-        }
+        rule.runOnIdle { focusManager.moveFocus(focusDirection) }
 
         // Assert.
         rule.runOnIdle {
             when (focusDirection) {
-                Right, Down -> {
+                Right,
+                Down -> {
                     assertThat(focusedItem.value).isFalse()
                     assertThat(candidate.value).isTrue()
                 }
-                Left, Up -> {
+                Left,
+                Up -> {
                     assertThat(focusedItem.value).isTrue()
                     assertThat(candidate.value).isFalse()
                 }
@@ -2376,18 +2355,18 @@
         }
 
         // Act.
-        rule.runOnIdle {
-            focusManager.moveFocus(focusDirection)
-        }
+        rule.runOnIdle { focusManager.moveFocus(focusDirection) }
 
         // Assert.
         rule.runOnIdle {
             when (focusDirection) {
-                Right, Down -> {
+                Right,
+                Down -> {
                     assertThat(focusedItem.value).isFalse()
                     assertThat(candidate.value).isTrue()
                 }
-                Left, Up -> {
+                Left,
+                Up -> {
                     assertThat(focusedItem.value).isTrue()
                     assertThat(candidate.value).isFalse()
                 }
@@ -2413,18 +2392,18 @@
         }
 
         // Act.
-        rule.runOnIdle {
-            focusManager.moveFocus(focusDirection)
-        }
+        rule.runOnIdle { focusManager.moveFocus(focusDirection) }
 
         // Assert.
         rule.runOnIdle {
             when (focusDirection) {
-                Right, Down -> {
+                Right,
+                Down -> {
                     assertThat(focusedItem.value).isFalse()
                     assertThat(candidate.value).isTrue()
                 }
-                Left, Up -> {
+                Left,
+                Up -> {
                     assertThat(focusedItem.value).isTrue()
                     assertThat(candidate.value).isFalse()
                 }
@@ -2450,9 +2429,7 @@
         }
 
         // Act.
-        rule.runOnIdle {
-            focusManager.moveFocus(focusDirection)
-        }
+        rule.runOnIdle { focusManager.moveFocus(focusDirection) }
 
         // Assert.
         rule.runOnIdle {
@@ -2461,7 +2438,9 @@
                     assertThat(focusedItem.value).isFalse()
                     assertThat(candidate.value).isTrue()
                 }
-                Left, Right, Up -> {
+                Left,
+                Right,
+                Up -> {
                     assertThat(focusedItem.value).isTrue()
                     assertThat(candidate.value).isFalse()
                 }
@@ -2487,9 +2466,7 @@
         }
 
         // Act.
-        rule.runOnIdle {
-            focusManager.moveFocus(focusDirection)
-        }
+        rule.runOnIdle { focusManager.moveFocus(focusDirection) }
 
         // Assert.
         rule.runOnIdle {
@@ -2498,7 +2475,9 @@
                     assertThat(focusedItem.value).isFalse()
                     assertThat(candidate.value).isTrue()
                 }
-                Left, Right, Up -> {
+                Left,
+                Right,
+                Up -> {
                     assertThat(focusedItem.value).isTrue()
                     assertThat(candidate.value).isFalse()
                 }
@@ -2524,9 +2503,7 @@
         }
 
         // Act.
-        rule.runOnIdle {
-            focusManager.moveFocus(focusDirection)
-        }
+        rule.runOnIdle { focusManager.moveFocus(focusDirection) }
 
         // Assert.
         rule.runOnIdle {
@@ -2535,7 +2512,9 @@
                     assertThat(focusedItem.value).isFalse()
                     assertThat(candidate.value).isTrue()
                 }
-                Left, Right, Up -> {
+                Left,
+                Right,
+                Up -> {
                     assertThat(focusedItem.value).isTrue()
                     assertThat(candidate.value).isFalse()
                 }
@@ -2561,9 +2540,7 @@
         }
 
         // Act.
-        rule.runOnIdle {
-            focusManager.moveFocus(focusDirection)
-        }
+        rule.runOnIdle { focusManager.moveFocus(focusDirection) }
 
         // Assert.
         rule.runOnIdle {
@@ -2572,7 +2549,9 @@
                     assertThat(focusedItem.value).isFalse()
                     assertThat(candidate.value).isTrue()
                 }
-                Left, Right, Up -> {
+                Left,
+                Right,
+                Up -> {
                     assertThat(focusedItem.value).isTrue()
                     assertThat(candidate.value).isFalse()
                 }
@@ -2598,9 +2577,7 @@
         }
 
         // Act.
-        rule.runOnIdle {
-            focusManager.moveFocus(focusDirection)
-        }
+        rule.runOnIdle { focusManager.moveFocus(focusDirection) }
 
         // Assert.
         rule.runOnIdle {
@@ -2609,7 +2586,9 @@
                     assertThat(focusedItem.value).isFalse()
                     assertThat(candidate.value).isTrue()
                 }
-                Left, Right, Up -> {
+                Left,
+                Right,
+                Up -> {
                     assertThat(focusedItem.value).isTrue()
                     assertThat(candidate.value).isFalse()
                 }
@@ -2635,9 +2614,7 @@
         }
 
         // Act.
-        rule.runOnIdle {
-            focusManager.moveFocus(focusDirection)
-        }
+        rule.runOnIdle { focusManager.moveFocus(focusDirection) }
 
         // Assert.
         rule.runOnIdle {
@@ -2646,7 +2623,9 @@
                     assertThat(focusedItem.value).isFalse()
                     assertThat(candidate.value).isTrue()
                 }
-                Left, Right, Up -> {
+                Left,
+                Right,
+                Up -> {
                     assertThat(focusedItem.value).isTrue()
                     assertThat(candidate.value).isFalse()
                 }
@@ -2672,18 +2651,18 @@
         }
 
         // Act.
-        rule.runOnIdle {
-            focusManager.moveFocus(focusDirection)
-        }
+        rule.runOnIdle { focusManager.moveFocus(focusDirection) }
 
         // Assert.
         rule.runOnIdle {
             when (focusDirection) {
-                Left, Down -> {
+                Left,
+                Down -> {
                     assertThat(focusedItem.value).isFalse()
                     assertThat(candidate.value).isTrue()
                 }
-                Right, Up -> {
+                Right,
+                Up -> {
                     assertThat(focusedItem.value).isTrue()
                     assertThat(candidate.value).isFalse()
                 }
@@ -2709,18 +2688,18 @@
         }
 
         // Act.
-        rule.runOnIdle {
-            focusManager.moveFocus(focusDirection)
-        }
+        rule.runOnIdle { focusManager.moveFocus(focusDirection) }
 
         // Assert.
         rule.runOnIdle {
             when (focusDirection) {
-                Left, Down -> {
+                Left,
+                Down -> {
                     assertThat(focusedItem.value).isFalse()
                     assertThat(candidate.value).isTrue()
                 }
-                Right, Up -> {
+                Right,
+                Up -> {
                     assertThat(focusedItem.value).isTrue()
                     assertThat(candidate.value).isFalse()
                 }
@@ -2745,18 +2724,18 @@
         }
 
         // Act.
-        rule.runOnIdle {
-            focusManager.moveFocus(focusDirection)
-        }
+        rule.runOnIdle { focusManager.moveFocus(focusDirection) }
 
         // Assert.
         rule.runOnIdle {
             when (focusDirection) {
-                Left, Down -> {
+                Left,
+                Down -> {
                     assertThat(focusedItem.value).isFalse()
                     assertThat(candidate.value).isTrue()
                 }
-                Right, Up -> {
+                Right,
+                Up -> {
                     assertThat(focusedItem.value).isTrue()
                     assertThat(candidate.value).isFalse()
                 }
@@ -2766,10 +2745,8 @@
     }
 
     /**
-     *   ________________________________
-     *  |               |  focusedItem  |
-     *  |   candidate   |_______________|
-     *  |_______________|
+     * ________________________________ | | focusedItem | | candidate |_______________|
+     * |_______________|
      */
     @LargeTest
     @Test
@@ -2781,9 +2758,7 @@
         }
 
         // Act.
-        rule.runOnIdle {
-            focusManager.moveFocus(focusDirection)
-        }
+        rule.runOnIdle { focusManager.moveFocus(focusDirection) }
 
         // Assert.
         rule.runOnIdle {
@@ -2792,7 +2767,9 @@
                     assertThat(focusedItem.value).isFalse()
                     assertThat(candidate.value).isTrue()
                 }
-                Right, Up, Down -> {
+                Right,
+                Up,
+                Down -> {
                     assertThat(focusedItem.value).isTrue()
                     assertThat(candidate.value).isFalse()
                 }
@@ -2802,9 +2779,8 @@
     }
 
     /**
-     *   ________________________________
-     *  |   candidate   |  focusedItem  |
-     *  |_______________|_______________|
+     * ________________________________ | candidate | focusedItem |
+     * |_______________|_______________|
      */
     @LargeTest
     @Test
@@ -2816,9 +2792,7 @@
         }
 
         // Act.
-        rule.runOnIdle {
-            focusManager.moveFocus(focusDirection)
-        }
+        rule.runOnIdle { focusManager.moveFocus(focusDirection) }
 
         // Assert.
         rule.runOnIdle {
@@ -2827,7 +2801,9 @@
                     assertThat(focusedItem.value).isFalse()
                     assertThat(candidate.value).isTrue()
                 }
-                Right, Up, Down -> {
+                Right,
+                Up,
+                Down -> {
                     assertThat(focusedItem.value).isTrue()
                     assertThat(candidate.value).isFalse()
                 }
@@ -2837,11 +2813,8 @@
     }
 
     /**
-     *   ________________________________
-     *  |   candidate   |               |
-     *  |_______________|  focusedItem  |
-     *                  |               |
-     *                  |_______________|
+     * ________________________________ | candidate | | |_______________| focusedItem | | |
+     * |_______________|
      */
     @LargeTest
     @Test
@@ -2853,9 +2826,7 @@
         }
 
         // Act.
-        rule.runOnIdle {
-            focusManager.moveFocus(focusDirection)
-        }
+        rule.runOnIdle { focusManager.moveFocus(focusDirection) }
 
         // Assert.
         rule.runOnIdle {
@@ -2864,7 +2835,9 @@
                     assertThat(focusedItem.value).isFalse()
                     assertThat(candidate.value).isTrue()
                 }
-                Right, Up, Down -> {
+                Right,
+                Up,
+                Down -> {
                     assertThat(focusedItem.value).isTrue()
                     assertThat(candidate.value).isFalse()
                 }
@@ -2890,9 +2863,7 @@
         }
 
         // Act.
-        rule.runOnIdle {
-            focusManager.moveFocus(focusDirection)
-        }
+        rule.runOnIdle { focusManager.moveFocus(focusDirection) }
 
         // Assert.
         rule.runOnIdle {
@@ -2901,7 +2872,9 @@
                     assertThat(focusedItem.value).isFalse()
                     assertThat(candidate.value).isTrue()
                 }
-                Right, Up, Down -> {
+                Right,
+                Up,
+                Down -> {
                     assertThat(focusedItem.value).isTrue()
                     assertThat(candidate.value).isFalse()
                 }
@@ -2927,9 +2900,7 @@
         }
 
         // Act.
-        rule.runOnIdle {
-            focusManager.moveFocus(focusDirection)
-        }
+        rule.runOnIdle { focusManager.moveFocus(focusDirection) }
 
         // Assert.
         rule.runOnIdle {
@@ -2938,7 +2909,9 @@
                     assertThat(focusedItem.value).isFalse()
                     assertThat(candidate.value).isTrue()
                 }
-                Right, Up, Down -> {
+                Right,
+                Up,
+                Down -> {
                     assertThat(focusedItem.value).isTrue()
                     assertThat(candidate.value).isFalse()
                 }
@@ -2948,11 +2921,8 @@
     }
 
     /**
-     *   ________________
-     *  |               |________________
-     *  |   candidate   |  focusedItem  |
-     *  |               |_______________|
-     *  |_______________|
+     * ________________ | |________________ | candidate | focusedItem | | |_______________|
+     * |_______________|
      */
     @LargeTest
     @Test
@@ -2964,9 +2934,7 @@
         }
 
         // Act.
-        rule.runOnIdle {
-            focusManager.moveFocus(focusDirection)
-        }
+        rule.runOnIdle { focusManager.moveFocus(focusDirection) }
 
         // Assert.
         rule.runOnIdle {
@@ -2975,7 +2943,9 @@
                     assertThat(focusedItem.value).isFalse()
                     assertThat(candidate.value).isTrue()
                 }
-                Right, Up, Down -> {
+                Right,
+                Up,
+                Down -> {
                     assertThat(focusedItem.value).isTrue()
                     assertThat(candidate.value).isFalse()
                 }
@@ -2985,10 +2955,8 @@
     }
 
     /**
-     *    ________________
-     *   |               |________________
-     *   |   candidate   |  focusedItem  |
-     *   |_______________|_______________|
+     * ________________ | |________________ | candidate | focusedItem |
+     * |_______________|_______________|
      */
     @LargeTest
     @Test
@@ -3000,9 +2968,7 @@
         }
 
         // Act.
-        rule.runOnIdle {
-            focusManager.moveFocus(focusDirection)
-        }
+        rule.runOnIdle { focusManager.moveFocus(focusDirection) }
 
         // Assert.
         rule.runOnIdle {
@@ -3011,7 +2977,9 @@
                     assertThat(focusedItem.value).isFalse()
                     assertThat(candidate.value).isTrue()
                 }
-                Right, Up, Down -> {
+                Right,
+                Up,
+                Down -> {
                     assertThat(focusedItem.value).isTrue()
                     assertThat(candidate.value).isFalse()
                 }
@@ -3021,10 +2989,8 @@
     }
 
     /**
-     *    ________________
-     *   |   candidate   |________________
-     *   |_______________|  focusedItem  |
-     *                   |_______________|
+     * ________________ | candidate |________________ |_______________| focusedItem |
+     * |_______________|
      */
     @LargeTest
     @Test
@@ -3036,18 +3002,18 @@
         }
 
         // Act.
-        rule.runOnIdle {
-            focusManager.moveFocus(focusDirection)
-        }
+        rule.runOnIdle { focusManager.moveFocus(focusDirection) }
 
         // Assert.
         rule.runOnIdle {
             when (focusDirection) {
-                Left, Up -> {
+                Left,
+                Up -> {
                     assertThat(focusedItem.value).isFalse()
                     assertThat(candidate.value).isTrue()
                 }
-                Right, Down -> {
+                Right,
+                Down -> {
                     assertThat(focusedItem.value).isTrue()
                     assertThat(candidate.value).isFalse()
                 }
@@ -3057,11 +3023,8 @@
     }
 
     /**
-     *    ________________
-     *   |   candidate   |
-     *   |_______________|________________
-     *                   |  focusedItem  |
-     *                   |_______________|
+     * ________________ | candidate | |_______________|________________ | focusedItem |
+     * |_______________|
      */
     @LargeTest
     @Test
@@ -3073,18 +3036,18 @@
         }
 
         // Act.
-        rule.runOnIdle {
-            focusManager.moveFocus(focusDirection)
-        }
+        rule.runOnIdle { focusManager.moveFocus(focusDirection) }
 
         // Assert.
         rule.runOnIdle {
             when (focusDirection) {
-                Left, Up -> {
+                Left,
+                Up -> {
                     assertThat(focusedItem.value).isFalse()
                     assertThat(candidate.value).isTrue()
                 }
-                Right, Down -> {
+                Right,
+                Down -> {
                     assertThat(focusedItem.value).isTrue()
                     assertThat(candidate.value).isFalse()
                 }
@@ -3110,18 +3073,18 @@
         }
 
         // Act.
-        rule.runOnIdle {
-            focusManager.moveFocus(focusDirection)
-        }
+        rule.runOnIdle { focusManager.moveFocus(focusDirection) }
 
         // Assert.
         rule.runOnIdle {
             when (focusDirection) {
-                Left, Up -> {
+                Left,
+                Up -> {
                     assertThat(focusedItem.value).isFalse()
                     assertThat(candidate.value).isTrue()
                 }
-                Right, Down -> {
+                Right,
+                Down -> {
                     assertThat(focusedItem.value).isTrue()
                     assertThat(candidate.value).isFalse()
                 }
@@ -3147,9 +3110,7 @@
         }
 
         // Act.
-        rule.runOnIdle {
-            focusManager.moveFocus(focusDirection)
-        }
+        rule.runOnIdle { focusManager.moveFocus(focusDirection) }
 
         // Assert.
         rule.runOnIdle {
@@ -3158,7 +3119,9 @@
                     assertThat(focusedItem.value).isFalse()
                     assertThat(candidate.value).isTrue()
                 }
-                Left, Right, Down -> {
+                Left,
+                Right,
+                Down -> {
                     assertThat(focusedItem.value).isTrue()
                     assertThat(candidate.value).isFalse()
                 }
@@ -3185,9 +3148,7 @@
         }
 
         // Act.
-        rule.runOnIdle {
-            focusManager.moveFocus(focusDirection)
-        }
+        rule.runOnIdle { focusManager.moveFocus(focusDirection) }
 
         // Assert.
         rule.runOnIdle {
@@ -3196,7 +3157,9 @@
                     assertThat(focusedItem.value).isFalse()
                     assertThat(candidate.value).isTrue()
                 }
-                Left, Right, Down -> {
+                Left,
+                Right,
+                Down -> {
                     assertThat(focusedItem.value).isTrue()
                     assertThat(candidate.value).isFalse()
                 }
@@ -3223,9 +3186,7 @@
         }
 
         // Act.
-        rule.runOnIdle {
-            focusManager.moveFocus(focusDirection)
-        }
+        rule.runOnIdle { focusManager.moveFocus(focusDirection) }
 
         // Assert.
         rule.runOnIdle {
@@ -3234,7 +3195,9 @@
                     assertThat(focusedItem.value).isFalse()
                     assertThat(candidate.value).isTrue()
                 }
-                Left, Right, Down -> {
+                Left,
+                Right,
+                Down -> {
                     assertThat(focusedItem.value).isTrue()
                     assertThat(candidate.value).isFalse()
                 }
@@ -3261,9 +3224,7 @@
         }
 
         // Act.
-        rule.runOnIdle {
-            focusManager.moveFocus(focusDirection)
-        }
+        rule.runOnIdle { focusManager.moveFocus(focusDirection) }
 
         // Assert.
         rule.runOnIdle {
@@ -3272,7 +3233,9 @@
                     assertThat(focusedItem.value).isFalse()
                     assertThat(candidate.value).isTrue()
                 }
-                Left, Right, Down -> {
+                Left,
+                Right,
+                Down -> {
                     assertThat(focusedItem.value).isTrue()
                     assertThat(candidate.value).isFalse()
                 }
@@ -3299,9 +3262,7 @@
         }
 
         // Act.
-        rule.runOnIdle {
-            focusManager.moveFocus(focusDirection)
-        }
+        rule.runOnIdle { focusManager.moveFocus(focusDirection) }
 
         // Assert.
         rule.runOnIdle {
@@ -3310,7 +3271,9 @@
                     assertThat(focusedItem.value).isFalse()
                     assertThat(candidate.value).isTrue()
                 }
-                Left, Right, Down -> {
+                Left,
+                Right,
+                Down -> {
                     assertThat(focusedItem.value).isTrue()
                     assertThat(candidate.value).isFalse()
                 }
@@ -3337,9 +3300,7 @@
         }
 
         // Act.
-        rule.runOnIdle {
-            focusManager.moveFocus(focusDirection)
-        }
+        rule.runOnIdle { focusManager.moveFocus(focusDirection) }
 
         // Assert.
         rule.runOnIdle {
@@ -3348,7 +3309,9 @@
                     assertThat(focusedItem.value).isFalse()
                     assertThat(candidate.value).isTrue()
                 }
-                Left, Right, Down -> {
+                Left,
+                Right,
+                Down -> {
                     assertThat(focusedItem.value).isTrue()
                     assertThat(candidate.value).isFalse()
                 }
@@ -3373,18 +3336,18 @@
         }
 
         // Act.
-        rule.runOnIdle {
-            focusManager.moveFocus(focusDirection)
-        }
+        rule.runOnIdle { focusManager.moveFocus(focusDirection) }
 
         // Assert.
         rule.runOnIdle {
             when (focusDirection) {
-                Right, Up -> {
+                Right,
+                Up -> {
                     assertThat(focusedItem.value).isFalse()
                     assertThat(candidate.value).isTrue()
                 }
-                Left, Down -> {
+                Left,
+                Down -> {
                     assertThat(focusedItem.value).isTrue()
                     assertThat(candidate.value).isFalse()
                 }
@@ -3409,9 +3372,7 @@
         }
 
         // Act.
-        rule.runOnIdle {
-            focusManager.moveFocus(focusDirection)
-        }
+        rule.runOnIdle { focusManager.moveFocus(focusDirection) }
 
         // Assert.
         rule.runOnIdle {
@@ -3420,7 +3381,9 @@
                     assertThat(focusedItem.value).isFalse()
                     assertThat(candidate.value).isTrue()
                 }
-                Left, Up, Down -> {
+                Left,
+                Up,
+                Down -> {
                     assertThat(focusedItem.value).isTrue()
                     assertThat(candidate.value).isFalse()
                 }
@@ -3446,9 +3409,7 @@
         }
 
         // Act.
-        rule.runOnIdle {
-            focusManager.moveFocus(focusDirection)
-        }
+        rule.runOnIdle { focusManager.moveFocus(focusDirection) }
 
         // Assert.
         rule.runOnIdle {
@@ -3457,7 +3418,9 @@
                     assertThat(focusedItem.value).isFalse()
                     assertThat(candidate.value).isTrue()
                 }
-                Left, Up, Down -> {
+                Left,
+                Up,
+                Down -> {
                     assertThat(focusedItem.value).isTrue()
                     assertThat(candidate.value).isFalse()
                 }
@@ -3483,9 +3446,7 @@
         }
 
         // Act.
-        rule.runOnIdle {
-            focusManager.moveFocus(focusDirection)
-        }
+        rule.runOnIdle { focusManager.moveFocus(focusDirection) }
 
         // Assert.
         rule.runOnIdle {
@@ -3494,7 +3455,9 @@
                     assertThat(focusedItem.value).isFalse()
                     assertThat(candidate.value).isTrue()
                 }
-                Left, Up, Down -> {
+                Left,
+                Up,
+                Down -> {
                     assertThat(focusedItem.value).isTrue()
                     assertThat(candidate.value).isFalse()
                 }
@@ -3520,9 +3483,7 @@
         }
 
         // Act.
-        rule.runOnIdle {
-            focusManager.moveFocus(focusDirection)
-        }
+        rule.runOnIdle { focusManager.moveFocus(focusDirection) }
 
         // Assert.
         rule.runOnIdle {
@@ -3531,7 +3492,9 @@
                     assertThat(focusedItem.value).isFalse()
                     assertThat(candidate.value).isTrue()
                 }
-                Left, Up, Down -> {
+                Left,
+                Up,
+                Down -> {
                     assertThat(focusedItem.value).isTrue()
                     assertThat(candidate.value).isFalse()
                 }
@@ -3557,9 +3520,7 @@
         }
 
         // Act.
-        rule.runOnIdle {
-            focusManager.moveFocus(focusDirection)
-        }
+        rule.runOnIdle { focusManager.moveFocus(focusDirection) }
 
         // Assert.
         rule.runOnIdle {
@@ -3568,7 +3529,9 @@
                     assertThat(focusedItem.value).isFalse()
                     assertThat(candidate.value).isTrue()
                 }
-                Left, Up, Down -> {
+                Left,
+                Up,
+                Down -> {
                     assertThat(focusedItem.value).isTrue()
                     assertThat(candidate.value).isFalse()
                 }
@@ -3592,9 +3555,7 @@
         }
 
         // Act.
-        rule.runOnIdle {
-            focusManager.moveFocus(focusDirection)
-        }
+        rule.runOnIdle { focusManager.moveFocus(focusDirection) }
 
         // Assert.
         rule.runOnIdle {
@@ -3603,7 +3564,9 @@
                     assertThat(focusedItem.value).isFalse()
                     assertThat(candidate.value).isTrue()
                 }
-                Left, Up, Down -> {
+                Left,
+                Up,
+                Down -> {
                     assertThat(focusedItem.value).isTrue()
                     assertThat(candidate.value).isFalse()
                 }
@@ -3628,9 +3591,7 @@
         }
 
         // Act.
-        rule.runOnIdle {
-            focusManager.moveFocus(focusDirection)
-        }
+        rule.runOnIdle { focusManager.moveFocus(focusDirection) }
 
         // Assert.
         rule.runOnIdle {
@@ -3639,7 +3600,9 @@
                     assertThat(focusedItem.value).isFalse()
                     assertThat(candidate.value).isTrue()
                 }
-                Left, Up, Down -> {
+                Left,
+                Up,
+                Down -> {
                     assertThat(focusedItem.value).isTrue()
                     assertThat(candidate.value).isFalse()
                 }
@@ -3664,18 +3627,18 @@
         }
 
         // Act.
-        rule.runOnIdle {
-            focusManager.moveFocus(focusDirection)
-        }
+        rule.runOnIdle { focusManager.moveFocus(focusDirection) }
 
         // Assert.
         rule.runOnIdle {
             when (focusDirection) {
-                Right, Down -> {
+                Right,
+                Down -> {
                     assertThat(focusedItem.value).isFalse()
                     assertThat(candidate.value).isTrue()
                 }
-                Left, Up -> {
+                Left,
+                Up -> {
                     assertThat(focusedItem.value).isTrue()
                     assertThat(candidate.value).isFalse()
                 }
@@ -3702,9 +3665,7 @@
         }
 
         // Act.
-        rule.runOnIdle {
-            focusManager.moveFocus(focusDirection)
-        }
+        rule.runOnIdle { focusManager.moveFocus(focusDirection) }
 
         // Assert.
         rule.runOnIdle {
@@ -3713,7 +3674,9 @@
                     assertThat(focusedItem.value).isFalse()
                     assertThat(candidate.value).isTrue()
                 }
-                Left, Right, Up -> {
+                Left,
+                Right,
+                Up -> {
                     assertThat(focusedItem.value).isTrue()
                     assertThat(candidate.value).isFalse()
                 }
@@ -3740,9 +3703,7 @@
         }
 
         // Act.
-        rule.runOnIdle {
-            focusManager.moveFocus(focusDirection)
-        }
+        rule.runOnIdle { focusManager.moveFocus(focusDirection) }
 
         // Assert.
         rule.runOnIdle {
@@ -3751,7 +3712,9 @@
                     assertThat(focusedItem.value).isFalse()
                     assertThat(candidate.value).isTrue()
                 }
-                Left, Right, Up -> {
+                Left,
+                Right,
+                Up -> {
                     assertThat(focusedItem.value).isTrue()
                     assertThat(candidate.value).isFalse()
                 }
@@ -3778,9 +3741,7 @@
         }
 
         // Act.
-        rule.runOnIdle {
-            focusManager.moveFocus(focusDirection)
-        }
+        rule.runOnIdle { focusManager.moveFocus(focusDirection) }
 
         // Assert.
         rule.runOnIdle {
@@ -3789,7 +3750,9 @@
                     assertThat(focusedItem.value).isFalse()
                     assertThat(candidate.value).isTrue()
                 }
-                Left, Right, Up -> {
+                Left,
+                Right,
+                Up -> {
                     assertThat(focusedItem.value).isTrue()
                     assertThat(candidate.value).isFalse()
                 }
@@ -3816,9 +3779,7 @@
         }
 
         // Act.
-        rule.runOnIdle {
-            focusManager.moveFocus(focusDirection)
-        }
+        rule.runOnIdle { focusManager.moveFocus(focusDirection) }
 
         // Assert.
         rule.runOnIdle {
@@ -3827,7 +3788,9 @@
                     assertThat(focusedItem.value).isFalse()
                     assertThat(candidate.value).isTrue()
                 }
-                Left, Right, Up -> {
+                Left,
+                Right,
+                Up -> {
                     assertThat(focusedItem.value).isTrue()
                     assertThat(candidate.value).isFalse()
                 }
@@ -3854,9 +3817,7 @@
         }
 
         // Act.
-        rule.runOnIdle {
-            focusManager.moveFocus(focusDirection)
-        }
+        rule.runOnIdle { focusManager.moveFocus(focusDirection) }
 
         // Assert.
         rule.runOnIdle {
@@ -3865,7 +3826,9 @@
                     assertThat(focusedItem.value).isFalse()
                     assertThat(candidate.value).isTrue()
                 }
-                Left, Right, Up -> {
+                Left,
+                Right,
+                Up -> {
                     assertThat(focusedItem.value).isTrue()
                     assertThat(candidate.value).isFalse()
                 }
@@ -3892,9 +3855,7 @@
         }
 
         // Act.
-        rule.runOnIdle {
-            focusManager.moveFocus(focusDirection)
-        }
+        rule.runOnIdle { focusManager.moveFocus(focusDirection) }
 
         // Assert.
         rule.runOnIdle {
@@ -3903,7 +3864,9 @@
                     assertThat(focusedItem.value).isFalse()
                     assertThat(candidate.value).isTrue()
                 }
-                Left, Right, Up -> {
+                Left,
+                Right,
+                Up -> {
                     assertThat(focusedItem.value).isTrue()
                     assertThat(candidate.value).isFalse()
                 }
@@ -3928,18 +3891,18 @@
         }
 
         // Act.
-        rule.runOnIdle {
-            focusManager.moveFocus(focusDirection)
-        }
+        rule.runOnIdle { focusManager.moveFocus(focusDirection) }
 
         // Assert.
         rule.runOnIdle {
             when (focusDirection) {
-                Left, Down -> {
+                Left,
+                Down -> {
                     assertThat(focusedItem.value).isFalse()
                     assertThat(candidate.value).isTrue()
                 }
-                Right, Up -> {
+                Right,
+                Up -> {
                     assertThat(focusedItem.value).isTrue()
                     assertThat(candidate.value).isFalse()
                 }
@@ -3949,10 +3912,8 @@
     }
 
     /**
-     *   ___________________________________
-     *  |               |  |  focusedItem  |
-     *  |   candidate   |__|_______________|
-     *  |__________________|
+     * ___________________________________ | | | focusedItem | | candidate |__|_______________|
+     * |__________________|
      */
     @LargeTest
     @Test
@@ -3964,9 +3925,7 @@
         }
 
         // Act.
-        rule.runOnIdle {
-            focusManager.moveFocus(focusDirection)
-        }
+        rule.runOnIdle { focusManager.moveFocus(focusDirection) }
 
         // Assert.
         rule.runOnIdle {
@@ -3975,7 +3934,9 @@
                     assertThat(focusedItem.value).isFalse()
                     assertThat(candidate.value).isTrue()
                 }
-                Right, Up, Down -> {
+                Right,
+                Up,
+                Down -> {
                     assertThat(focusedItem.value).isTrue()
                     assertThat(candidate.value).isFalse()
                 }
@@ -3985,9 +3946,8 @@
     }
 
     /**
-     *   ___________________________________
-     *  |   candidate   |  |  focusedItem  |
-     *  |_______________|__|_______________|
+     * ___________________________________ | candidate | | focusedItem |
+     * |_______________|__|_______________|
      */
     @LargeTest
     @Test
@@ -3999,9 +3959,7 @@
         }
 
         // Act.
-        rule.runOnIdle {
-            focusManager.moveFocus(focusDirection)
-        }
+        rule.runOnIdle { focusManager.moveFocus(focusDirection) }
 
         // Assert.
         rule.runOnIdle {
@@ -4010,7 +3968,9 @@
                     assertThat(focusedItem.value).isFalse()
                     assertThat(candidate.value).isTrue()
                 }
-                Right, Up, Down -> {
+                Right,
+                Up,
+                Down -> {
                     assertThat(focusedItem.value).isTrue()
                     assertThat(candidate.value).isFalse()
                 }
@@ -4020,11 +3980,8 @@
     }
 
     /**
-     *   ___________________________________
-     *  |   candidate   |  |               |
-     *  |_______________|__|  focusedItem  |
-     *                  |                  |
-     *                  |__________________|
+     * ___________________________________ | candidate | | | |_______________|__| focusedItem | | |
+     * |__________________|
      */
     @LargeTest
     @Test
@@ -4036,9 +3993,7 @@
         }
 
         // Act.
-        rule.runOnIdle {
-            focusManager.moveFocus(focusDirection)
-        }
+        rule.runOnIdle { focusManager.moveFocus(focusDirection) }
 
         // Assert.
         rule.runOnIdle {
@@ -4047,7 +4002,9 @@
                     assertThat(focusedItem.value).isFalse()
                     assertThat(candidate.value).isTrue()
                 }
-                Right, Up, Down -> {
+                Right,
+                Up,
+                Down -> {
                     assertThat(focusedItem.value).isTrue()
                     assertThat(candidate.value).isFalse()
                 }
@@ -4073,9 +4030,7 @@
         }
 
         // Act.
-        rule.runOnIdle {
-            focusManager.moveFocus(focusDirection)
-        }
+        rule.runOnIdle { focusManager.moveFocus(focusDirection) }
 
         // Assert.
         rule.runOnIdle {
@@ -4084,7 +4039,9 @@
                     assertThat(focusedItem.value).isFalse()
                     assertThat(candidate.value).isTrue()
                 }
-                Right, Up, Down -> {
+                Right,
+                Up,
+                Down -> {
                     assertThat(focusedItem.value).isTrue()
                     assertThat(candidate.value).isFalse()
                 }
@@ -4110,9 +4067,7 @@
         }
 
         // Act.
-        rule.runOnIdle {
-            focusManager.moveFocus(focusDirection)
-        }
+        rule.runOnIdle { focusManager.moveFocus(focusDirection) }
 
         // Assert.
         rule.runOnIdle {
@@ -4121,7 +4076,9 @@
                     assertThat(focusedItem.value).isFalse()
                     assertThat(candidate.value).isTrue()
                 }
-                Right, Up, Down -> {
+                Right,
+                Up,
+                Down -> {
                     assertThat(focusedItem.value).isTrue()
                     assertThat(candidate.value).isFalse()
                 }
@@ -4131,11 +4088,8 @@
     }
 
     /**
-     *   ___________________
-     *  |                __|_________________
-     *  |   candidate   |  |   focusedItem  |
-     *  |               |__|________________|
-     *  |__________________|
+     * ___________________ | __|_________________ | candidate | | focusedItem | |
+     * |__|________________| |__________________|
      */
     @MediumTest
     @Test
@@ -4147,9 +4101,7 @@
         }
 
         // Act.
-        rule.runOnIdle {
-            focusManager.moveFocus(focusDirection)
-        }
+        rule.runOnIdle { focusManager.moveFocus(focusDirection) }
 
         // Assert.
         rule.runOnIdle {
@@ -4158,7 +4110,9 @@
                     assertThat(focusedItem.value).isFalse()
                     assertThat(candidate.value).isTrue()
                 }
-                Right, Up, Down -> {
+                Right,
+                Up,
+                Down -> {
                     assertThat(focusedItem.value).isTrue()
                     assertThat(candidate.value).isFalse()
                 }
@@ -4168,10 +4122,8 @@
     }
 
     /**
-     *    ___________________
-     *   |                __|_________________
-     *   |   candidate   |  |   focusedItem  |
-     *   |_______________|__|________________|
+     * ___________________ | __|_________________ | candidate | | focusedItem |
+     * |_______________|__|________________|
      */
     @LargeTest
     @Test
@@ -4183,9 +4135,7 @@
         }
 
         // Act.
-        rule.runOnIdle {
-            focusManager.moveFocus(focusDirection)
-        }
+        rule.runOnIdle { focusManager.moveFocus(focusDirection) }
 
         // Assert.
         rule.runOnIdle {
@@ -4194,7 +4144,9 @@
                     assertThat(focusedItem.value).isFalse()
                     assertThat(candidate.value).isTrue()
                 }
-                Right, Up, Down -> {
+                Right,
+                Up,
+                Down -> {
                     assertThat(focusedItem.value).isTrue()
                     assertThat(candidate.value).isFalse()
                 }
@@ -4204,10 +4156,8 @@
     }
 
     /**
-     *    ___________________
-     *   |   candidate    __|________________
-     *   |_______________|__|  focusedItem  |
-     *                   |__________________|
+     * ___________________ | candidate __|________________ |_______________|__| focusedItem |
+     * |__________________|
      */
     @LargeTest
     @Test
@@ -4219,18 +4169,18 @@
         }
 
         // Act.
-        rule.runOnIdle {
-            focusManager.moveFocus(focusDirection)
-        }
+        rule.runOnIdle { focusManager.moveFocus(focusDirection) }
 
         // Assert.
         rule.runOnIdle {
             when (focusDirection) {
-                Left, Up -> {
+                Left,
+                Up -> {
                     assertThat(focusedItem.value).isFalse()
                     assertThat(candidate.value).isTrue()
                 }
-                Right, Down -> {
+                Right,
+                Down -> {
                     assertThat(focusedItem.value).isTrue()
                     assertThat(candidate.value).isFalse()
                 }
@@ -4257,9 +4207,7 @@
         }
 
         // Act.
-        rule.runOnIdle {
-            focusManager.moveFocus(focusDirection)
-        }
+        rule.runOnIdle { focusManager.moveFocus(focusDirection) }
 
         // Assert.
         rule.runOnIdle {
@@ -4268,7 +4216,9 @@
                     assertThat(focusedItem.value).isFalse()
                     assertThat(candidate.value).isTrue()
                 }
-                Left, Right, Down -> {
+                Left,
+                Right,
+                Down -> {
                     assertThat(focusedItem.value).isTrue()
                     assertThat(candidate.value).isFalse()
                 }
@@ -4294,9 +4244,7 @@
         }
 
         // Act.
-        rule.runOnIdle {
-            focusManager.moveFocus(focusDirection)
-        }
+        rule.runOnIdle { focusManager.moveFocus(focusDirection) }
 
         // Assert.
         rule.runOnIdle {
@@ -4322,9 +4270,7 @@
         }
 
         // Act.
-        rule.runOnIdle {
-            focusManager.moveFocus(focusDirection)
-        }
+        rule.runOnIdle { focusManager.moveFocus(focusDirection) }
 
         // Assert.
         rule.runOnIdle {
@@ -4350,9 +4296,7 @@
         }
 
         // Act.
-        rule.runOnIdle {
-            focusManager.moveFocus(focusDirection)
-        }
+        rule.runOnIdle { focusManager.moveFocus(focusDirection) }
 
         // Assert.
         rule.runOnIdle {
@@ -4378,9 +4322,7 @@
         }
 
         // Act.
-        rule.runOnIdle {
-            focusManager.moveFocus(focusDirection)
-        }
+        rule.runOnIdle { focusManager.moveFocus(focusDirection) }
 
         // Assert.
         rule.runOnIdle {
@@ -4406,9 +4348,7 @@
         }
 
         // Act.
-        rule.runOnIdle {
-            focusManager.moveFocus(focusDirection)
-        }
+        rule.runOnIdle { focusManager.moveFocus(focusDirection) }
 
         // Assert.
         rule.runOnIdle {
@@ -4434,9 +4374,7 @@
         }
 
         // Act.
-        rule.runOnIdle {
-            focusManager.moveFocus(focusDirection)
-        }
+        rule.runOnIdle { focusManager.moveFocus(focusDirection) }
 
         // Assert.
         rule.runOnIdle {
@@ -4462,9 +4400,7 @@
         }
 
         // Act.
-        rule.runOnIdle {
-            focusManager.moveFocus(focusDirection)
-        }
+        rule.runOnIdle { focusManager.moveFocus(focusDirection) }
 
         // Assert.
         rule.runOnIdle {
@@ -4490,9 +4426,7 @@
         }
 
         // Act.
-        rule.runOnIdle {
-            focusManager.moveFocus(focusDirection)
-        }
+        rule.runOnIdle { focusManager.moveFocus(focusDirection) }
 
         // Assert.
         rule.runOnIdle {
@@ -4519,9 +4453,7 @@
         }
 
         // Act.
-        rule.runOnIdle {
-            focusManager.moveFocus(focusDirection)
-        }
+        rule.runOnIdle { focusManager.moveFocus(focusDirection) }
 
         // Assert.
         rule.runOnIdle {
@@ -4547,9 +4479,7 @@
         }
 
         // Act.
-        rule.runOnIdle {
-            focusManager.moveFocus(focusDirection)
-        }
+        rule.runOnIdle { focusManager.moveFocus(focusDirection) }
 
         // Assert.
         rule.runOnIdle {
@@ -4575,9 +4505,7 @@
         }
 
         // Act.
-        rule.runOnIdle {
-            focusManager.moveFocus(focusDirection)
-        }
+        rule.runOnIdle { focusManager.moveFocus(focusDirection) }
 
         // Assert.
         rule.runOnIdle {
@@ -4603,9 +4531,7 @@
         }
 
         // Act.
-        rule.runOnIdle {
-            focusManager.moveFocus(focusDirection)
-        }
+        rule.runOnIdle { focusManager.moveFocus(focusDirection) }
 
         // Assert.
         rule.runOnIdle {
@@ -4631,9 +4557,7 @@
         }
 
         // Act.
-        rule.runOnIdle {
-            focusManager.moveFocus(focusDirection)
-        }
+        rule.runOnIdle { focusManager.moveFocus(focusDirection) }
 
         // Assert.
         rule.runOnIdle {
@@ -4659,9 +4583,7 @@
         }
 
         // Act.
-        rule.runOnIdle {
-            focusManager.moveFocus(focusDirection)
-        }
+        rule.runOnIdle { focusManager.moveFocus(focusDirection) }
 
         // Assert.
         rule.runOnIdle {
@@ -4687,9 +4609,7 @@
         }
 
         // Act.
-        rule.runOnIdle {
-            focusManager.moveFocus(focusDirection)
-        }
+        rule.runOnIdle { focusManager.moveFocus(focusDirection) }
 
         // Assert.
         rule.runOnIdle {
@@ -4715,9 +4635,7 @@
         }
 
         // Act.
-        rule.runOnIdle {
-            focusManager.moveFocus(focusDirection)
-        }
+        rule.runOnIdle { focusManager.moveFocus(focusDirection) }
 
         // Assert.
         rule.runOnIdle {
@@ -4743,9 +4661,7 @@
         }
 
         // Act.
-        rule.runOnIdle {
-            focusManager.moveFocus(focusDirection)
-        }
+        rule.runOnIdle { focusManager.moveFocus(focusDirection) }
 
         // Assert.
         rule.runOnIdle {
@@ -4772,9 +4688,7 @@
         }
 
         // Act.
-        rule.runOnIdle {
-            focusManager.moveFocus(focusDirection)
-        }
+        rule.runOnIdle { focusManager.moveFocus(focusDirection) }
 
         // Assert.
         rule.runOnIdle {
@@ -4793,14 +4707,12 @@
      *          <---- Direction of Search ---          *     |  focus    |_______| |        |
      *                                                 *     |_____________________|
      * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
-     *    ______________________                       *      ______________________
-     *   |            ________ |   _________________   *     |            ________ |        |
-     *   |  current  | child | |  |  next sibling  |   *     |  current  | child | |        |
-     *   |  focus    |_______| |  |________________|   *     |  focus    |_______| |    Direction
-     *   |_____________________|                       *     |_____________________|    of Search
-     *                                                 *        _________________           |
-     *          ---- Direction of Search --->          *       |  next sibling  |           |
-     *                                                 *       |________________|           v
+     * ______________________ * ______________________ | ________ | _________________ * | ________ |
+     * | | current | child | | | next sibling | * | current | child | | | | focus |_______| |
+     * |________________| * | focus |_______| | Direction |_____________________| *
+     * |_____________________| of Search
+     * * _________________ | ---- Direction of Search ---> * | next sibling | |
+     * * |________________| v
      */
     @OptIn(ExperimentalComposeUiApi::class)
     @MediumTest
@@ -4839,9 +4751,7 @@
         }
 
         // Act.
-        rule.runOnIdle {
-            focusManager.moveFocus(focusDirection)
-        }
+        rule.runOnIdle { focusManager.moveFocus(focusDirection) }
 
         // Assert.
         rule.runOnIdle {
@@ -4861,9 +4771,7 @@
         }
 
         // Act.
-        rule.runOnIdle {
-            focusManager.moveFocus(focusDirection)
-        }
+        rule.runOnIdle { focusManager.moveFocus(focusDirection) }
 
         // Assert.
         rule.runOnIdle {
diff --git a/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/gesture/Utils.kt b/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/gesture/Utils.kt
index 5c81cab..6886e97 100644
--- a/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/gesture/Utils.kt
+++ b/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/gesture/Utils.kt
@@ -24,11 +24,12 @@
 // We only need this because IR compiler doesn't like converting lambdas to Runnables
 @Suppress("DEPRECATION")
 internal fun androidx.test.rule.ActivityTestRule<*>.runOnUiThreadIR(block: () -> Unit) {
-    val runnable: Runnable = object : Runnable {
-        override fun run() {
-            block()
+    val runnable: Runnable =
+        object : Runnable {
+            override fun run() {
+                block()
+            }
         }
-    }
     runOnUiThread(runnable)
 }
 
@@ -36,8 +37,8 @@
  * Creates a simple [MotionEvent].
  *
  * @param dispatchTarget The [View] that the [MotionEvent] is going to be dispatched to. This
- * guarantees that the MotionEvent is created correctly for both Compose (which relies on raw
- * coordinates being correct) and Android (which requires that local coordinates are correct).
+ *   guarantees that the MotionEvent is created correctly for both Compose (which relies on raw
+ *   coordinates being correct) and Android (which requires that local coordinates are correct).
  */
 internal fun MotionEvent(
     eventTime: Int,
@@ -57,24 +58,26 @@
         it.y += locationOnScreen[1]
     }
 
-    val motionEvent = MotionEvent.obtain(
-        0,
-        eventTime.toLong(),
-        action + (actionIndex shl MotionEvent.ACTION_POINTER_INDEX_SHIFT),
-        numPointers,
-        pointerProperties,
-        pointerCoords,
-        0,
-        0,
-        0f,
-        0f,
-        0,
-        0,
-        0,
-        0
-    ).apply {
-        offsetLocation(-locationOnScreen[0].toFloat(), -locationOnScreen[1].toFloat())
-    }
+    val motionEvent =
+        MotionEvent.obtain(
+                0,
+                eventTime.toLong(),
+                action + (actionIndex shl MotionEvent.ACTION_POINTER_INDEX_SHIFT),
+                numPointers,
+                pointerProperties,
+                pointerCoords,
+                0,
+                0,
+                0f,
+                0f,
+                0,
+                0,
+                0,
+                0
+            )
+            .apply {
+                offsetLocation(-locationOnScreen[0].toFloat(), -locationOnScreen[1].toFloat())
+            }
 
     pointerCoords.forEach {
         it.x -= locationOnScreen[0]
@@ -85,8 +88,7 @@
 }
 
 @Suppress("RemoveRedundantQualifierName")
-internal fun PointerProperties(id: Int) =
-    MotionEvent.PointerProperties().apply { this.id = id }
+internal fun PointerProperties(id: Int) = MotionEvent.PointerProperties().apply { this.id = id }
 
 @Suppress("RemoveRedundantQualifierName")
 internal fun PointerCoords(x: Float, y: Float, scrollX: Float = 0f, scrollY: Float = 0f) =
diff --git a/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/graphics/vector/VectorInvalidationTestCase.kt b/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/graphics/vector/VectorInvalidationTestCase.kt
index d286ad3..65a84a4 100644
--- a/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/graphics/vector/VectorInvalidationTestCase.kt
+++ b/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/graphics/vector/VectorInvalidationTestCase.kt
@@ -37,8 +37,8 @@
     internal var measured: Boolean = false
 
     /**
-     * Queries the size of the underlying vector image to draw
-     * This assumes both width and height are the same
+     * Queries the size of the underlying vector image to draw This assumes both width and height
+     * are the same
      */
     var vectorSize: Int = 0
 
@@ -51,27 +51,23 @@
         with(LocalDensity.current) {
             val width = imageVector.intrinsicSize.width.toInt()
             vectorSize = width
-            AtLeastSize(
-                size = width,
-                modifier = WhiteBackground.paint(imageVector)
-            ) {
+            AtLeastSize(size = width, modifier = WhiteBackground.paint(imageVector)) {
                 measured = true
             }
         }
     }
 
-    val WhiteBackground = Modifier.drawBehind {
-        drawRect(Color.White)
-    }
+    val WhiteBackground = Modifier.drawBehind { drawRect(Color.White) }
 
     fun toggle() {
         val state = vectorState
         if (state != null) {
-            state.value = if (state.value == R.drawable.ic_triangle) {
-                R.drawable.ic_triangle2
-            } else {
-                R.drawable.ic_triangle
-            }
+            state.value =
+                if (state.value == R.drawable.ic_triangle) {
+                    R.drawable.ic_triangle2
+                } else {
+                    R.drawable.ic_triangle
+                }
         }
     }
 }
diff --git a/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/graphics/vector/VectorTest.kt b/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/graphics/vector/VectorTest.kt
index 2baedd8..893f08a 100644
--- a/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/graphics/vector/VectorTest.kt
+++ b/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/graphics/vector/VectorTest.kt
@@ -100,35 +100,28 @@
 @RunWith(AndroidJUnit4::class)
 class VectorTest {
 
-    @get:Rule
-    val rule = createAndroidComposeRule<ComponentActivity>()
+    @get:Rule val rule = createAndroidComposeRule<ComponentActivity>()
 
     @SdkSuppress(minSdkVersion = Build.VERSION_CODES.O)
     @Test
     fun testVectorTint() {
-        rule.setContent {
-            VectorTint()
-        }
+        rule.setContent { VectorTint() }
 
-        takeScreenShot(200).apply {
-            assertEquals(getPixel(100, 100), Color.Cyan.toArgb())
-        }
+        takeScreenShot(200).apply { assertEquals(getPixel(100, 100), Color.Cyan.toArgb()) }
     }
 
     @SdkSuppress(minSdkVersion = Build.VERSION_CODES.O)
     @Test
     fun testVectorIntrinsicTint() {
         rule.setContent {
-            val background = Modifier.paint(
-                createTestVectorPainter(200, Color.Magenta),
-                alignment = Alignment.Center
-            )
-            AtLeastSize(size = 200, modifier = background) {
-            }
+            val background =
+                Modifier.paint(
+                    createTestVectorPainter(200, Color.Magenta),
+                    alignment = Alignment.Center
+                )
+            AtLeastSize(size = 200, modifier = background) {}
         }
-        takeScreenShot(200).apply {
-            assertEquals(getPixel(100, 100), Color.Magenta.toArgb())
-        }
+        takeScreenShot(200).apply { assertEquals(getPixel(100, 100), Color.Magenta.toArgb()) }
     }
 
     @SdkSuppress(minSdkVersion = Build.VERSION_CODES.O)
@@ -142,40 +135,26 @@
                 val bitmap = ImageBitmap(200, 200)
                 val canvas = Canvas(bitmap)
                 val bitmapSize = Size(200f, 200f)
-                CanvasDrawScope().draw(
-                    Density(1f),
-                    LayoutDirection.Ltr,
-                    canvas,
-                    bitmapSize
-                ) {
-                    with(vector!!) {
-                        draw(bitmapSize)
-                    }
+                CanvasDrawScope().draw(Density(1f), LayoutDirection.Ltr, canvas, bitmapSize) {
+                    with(vector!!) { draw(bitmapSize) }
                 }
                 bitmap
             }
 
             val background = Modifier.paint(BitmapPainter(bitmap))
 
-            AtLeastSize(size = 200, modifier = background) {
-            }
+            AtLeastSize(size = 200, modifier = background) {}
         }
-        takeScreenShot(200).apply {
-            assertEquals(getPixel(100, 100), Color.Magenta.toArgb())
-        }
+        takeScreenShot(200).apply { assertEquals(getPixel(100, 100), Color.Magenta.toArgb()) }
         assertEquals(ImageBitmapConfig.Alpha8, vector!!.bitmapConfig)
     }
 
     @SdkSuppress(minSdkVersion = Build.VERSION_CODES.O)
     @Test
     fun testVectorAlignment() {
-        rule.setContent {
-            VectorTint(minimumSize = 450, alignment = Alignment.BottomEnd)
-        }
+        rule.setContent { VectorTint(minimumSize = 450, alignment = Alignment.BottomEnd) }
 
-        takeScreenShot(450).apply {
-            assertEquals(getPixel(430, 430), Color.Cyan.toArgb())
-        }
+        takeScreenShot(450).apply { assertEquals(getPixel(430, 430), Color.Cyan.toArgb()) }
     }
 
     @Test
@@ -184,36 +163,33 @@
         var composeCount = 0
         var vectorComposeCount = 0
 
-        val composeVector: @Composable @VectorComposable (Float, Float) -> Unit = {
-                viewportWidth, viewportHeight ->
-
-            vectorComposeCount++
-            Path(
-                fill = SolidColor(Color.Blue),
-                pathData = PathData {
-                    lineTo(viewportWidth, 0f)
-                    lineTo(viewportWidth, viewportHeight)
-                    lineTo(0f, viewportHeight)
-                    close()
-                }
-            )
-        }
+        val composeVector: @Composable @VectorComposable (Float, Float) -> Unit =
+            { viewportWidth, viewportHeight ->
+                vectorComposeCount++
+                Path(
+                    fill = SolidColor(Color.Blue),
+                    pathData =
+                        PathData {
+                            lineTo(viewportWidth, 0f)
+                            lineTo(viewportWidth, viewportHeight)
+                            lineTo(0f, viewportHeight)
+                            close()
+                        }
+                )
+            }
 
         rule.setContent {
             composeCount++
             // Arbitrary read to force composition here and verify the subcomposition below skips
             state.value
-            val vectorPainter = rememberVectorPainter(
-                defaultWidth = 10.dp,
-                defaultHeight = 10.dp,
-                autoMirror = false,
-                content = composeVector
-            )
-            Image(
-                vectorPainter,
-                null,
-                modifier = Modifier.size(20.dp)
-            )
+            val vectorPainter =
+                rememberVectorPainter(
+                    defaultWidth = 10.dp,
+                    defaultHeight = 10.dp,
+                    autoMirror = false,
+                    content = composeVector
+                )
+            Image(vectorPainter, null, modifier = Modifier.size(20.dp))
         }
 
         state.value = 1
@@ -226,9 +202,7 @@
     @Test
     fun testVectorInvalidation() {
         val testCase = VectorInvalidationTestCase()
-        rule.setContent {
-            testCase.TestVector()
-        }
+        rule.setContent { testCase.TestVector() }
 
         rule.waitUntil { testCase.measured }
         val size = testCase.vectorSize
@@ -238,9 +212,7 @@
         }
 
         testCase.measured = false
-        rule.runOnUiThread {
-            testCase.toggle()
-        }
+        rule.runOnUiThread { testCase.toggle() }
 
         rule.waitUntil { testCase.measured }
 
@@ -256,13 +228,13 @@
         var drawCount = 0
         val testTag = "TestTag"
         rule.setContent {
-            Box(modifier = Modifier
-                .wrapContentSize()
-                .drawBehind {
-                    drawCount++
-                }
-                .paint(painterResource(R.drawable.ic_triangle2))
-                .testTag(testTag))
+            Box(
+                modifier =
+                    Modifier.wrapContentSize()
+                        .drawBehind { drawCount++ }
+                        .paint(painterResource(R.drawable.ic_triangle2))
+                        .testTag(testTag)
+            )
         }
 
         rule.onNodeWithTag(testTag).captureToImage().toPixelMap().apply {
@@ -273,9 +245,7 @@
     @SdkSuppress(minSdkVersion = Build.VERSION_CODES.O)
     @Test
     fun testVectorClipPath() {
-        rule.setContent {
-            VectorClip()
-        }
+        rule.setContent { VectorClip() }
 
         takeScreenShot(200).apply {
             assertEquals(getPixel(100, 50), Color.Cyan.toArgb())
@@ -287,38 +257,27 @@
     fun testVectorZeroSizeDoesNotCrash() {
         // Make sure that if we are given the size of zero we should not crash and instead
         // act as a no-op
-        rule.setContent {
-            Box(modifier = Modifier.size(0.dp).paint(createTestVectorPainter()))
-        }
+        rule.setContent { Box(modifier = Modifier.size(0.dp).paint(createTestVectorPainter())) }
     }
 
     @Test
     fun testVectorZeroWidthDoesNotCrash() {
         rule.setContent {
-            Box(
-                modifier = Modifier.width(0.dp).height(100.dp).paint
-                (createTestVectorPainter())
-            )
+            Box(modifier = Modifier.width(0.dp).height(100.dp).paint(createTestVectorPainter()))
         }
     }
 
     @Test
     fun testVectorZeroHeightDoesNotCrash() {
         rule.setContent {
-            Box(
-                modifier = Modifier.width(50.dp).height(0.dp).paint(
-                    createTestVectorPainter()
-                )
-            )
+            Box(modifier = Modifier.width(50.dp).height(0.dp).paint(createTestVectorPainter()))
         }
     }
 
     @SdkSuppress(minSdkVersion = Build.VERSION_CODES.O)
     @Test
     fun testVectorTrimPath() {
-        rule.setContent {
-            VectorTrim()
-        }
+        rule.setContent { VectorTrim() }
 
         takeScreenShot(200).apply {
             assertEquals(Color.Yellow.toArgb(), getPixel(25, 100))
@@ -335,37 +294,43 @@
         val viewportWidth = 24f
         val viewportHeight = 24f
 
-        val icon1 = ImageVector.Builder(
-            defaultWidth = defaultWidth,
-            defaultHeight = defaultHeight,
-            viewportWidth = viewportWidth,
-            viewportHeight = viewportHeight
-        )
-            .addPath(
-                fill = SolidColor(Color.Black),
-                pathData = PathData {
-                    lineTo(viewportWidth, 0f)
-                    lineTo(viewportWidth, viewportHeight)
-                    lineTo(0f, 0f)
-                    close()
-                }
-            ).build()
+        val icon1 =
+            ImageVector.Builder(
+                    defaultWidth = defaultWidth,
+                    defaultHeight = defaultHeight,
+                    viewportWidth = viewportWidth,
+                    viewportHeight = viewportHeight
+                )
+                .addPath(
+                    fill = SolidColor(Color.Black),
+                    pathData =
+                        PathData {
+                            lineTo(viewportWidth, 0f)
+                            lineTo(viewportWidth, viewportHeight)
+                            lineTo(0f, 0f)
+                            close()
+                        }
+                )
+                .build()
 
-        val icon2 = ImageVector.Builder(
-            defaultWidth = defaultWidth,
-            defaultHeight = defaultHeight,
-            viewportWidth = viewportWidth,
-            viewportHeight = viewportHeight
-        )
-            .addPath(
-                fill = SolidColor(Color.Black),
-                pathData = PathData {
-                    lineTo(0f, viewportHeight)
-                    lineTo(viewportWidth, viewportHeight)
-                    lineTo(0f, 0f)
-                    close()
-                }
-            ).build()
+        val icon2 =
+            ImageVector.Builder(
+                    defaultWidth = defaultWidth,
+                    defaultHeight = defaultHeight,
+                    viewportWidth = viewportWidth,
+                    viewportHeight = viewportHeight
+                )
+                .addPath(
+                    fill = SolidColor(Color.Black),
+                    pathData =
+                        PathData {
+                            lineTo(0f, viewportHeight)
+                            lineTo(viewportWidth, viewportHeight)
+                            lineTo(0f, 0f)
+                            close()
+                        }
+                )
+                .build()
 
         val testTag = "iconClick"
         rule.setContent {
@@ -373,11 +338,11 @@
             Image(
                 imageVector = if (clickState.value) icon1 else icon2,
                 contentDescription = null,
-                modifier = Modifier
-                    .testTag(testTag)
-                    .size(icon1.defaultWidth, icon1.defaultHeight)
-                    .background(Color.Red)
-                    .clickable { clickState.value = !clickState.value },
+                modifier =
+                    Modifier.testTag(testTag)
+                        .size(icon1.defaultWidth, icon1.defaultHeight)
+                        .background(Color.Red)
+                        .clickable { clickState.value = !clickState.value },
                 alignment = Alignment.TopStart,
                 contentScale = ContentScale.FillHeight
             )
@@ -419,27 +384,27 @@
 
         var tint: ColorFilter? by mutableStateOf(ColorFilter.tint(Color.Green))
         rule.setContent {
-            vectorPainter = rememberVectorPainter(
-                defaultWidth = defaultWidth,
-                defaultHeight = defaultHeight,
-                autoMirror = false
-            ) { viewportWidth, viewportHeight ->
-                Path(
-                    fill = SolidColor(Color.Blue),
-                    pathData = PathData {
-                        lineTo(viewportWidth, 0f)
-                        lineTo(viewportWidth, viewportHeight)
-                        lineTo(0f, viewportHeight)
-                        close()
-                    }
-                )
-            }
+            vectorPainter =
+                rememberVectorPainter(
+                    defaultWidth = defaultWidth,
+                    defaultHeight = defaultHeight,
+                    autoMirror = false
+                ) { viewportWidth, viewportHeight ->
+                    Path(
+                        fill = SolidColor(Color.Blue),
+                        pathData =
+                            PathData {
+                                lineTo(viewportWidth, 0f)
+                                lineTo(viewportWidth, viewportHeight)
+                                lineTo(0f, viewportHeight)
+                                close()
+                            }
+                    )
+                }
             Image(
                 painter = vectorPainter!!,
                 contentDescription = null,
-                modifier = Modifier
-                    .testTag(testTag)
-                    .background(Color.Red),
+                modifier = Modifier.testTag(testTag).background(Color.Red),
                 contentScale = ContentScale.FillBounds,
                 colorFilter = tint
             )
@@ -463,27 +428,27 @@
 
         var tint: ColorFilter? by mutableStateOf(null)
         rule.setContent {
-            vectorPainter = rememberVectorPainter(
-                defaultWidth = defaultWidth,
-                defaultHeight = defaultHeight,
-                autoMirror = false
-            ) { viewportWidth, viewportHeight ->
-                Path(
-                    fill = SolidColor(Color.Blue),
-                    pathData = PathData {
-                        lineTo(viewportWidth, 0f)
-                        lineTo(viewportWidth, viewportHeight)
-                        lineTo(0f, viewportHeight)
-                        close()
-                    }
-                )
-            }
+            vectorPainter =
+                rememberVectorPainter(
+                    defaultWidth = defaultWidth,
+                    defaultHeight = defaultHeight,
+                    autoMirror = false
+                ) { viewportWidth, viewportHeight ->
+                    Path(
+                        fill = SolidColor(Color.Blue),
+                        pathData =
+                            PathData {
+                                lineTo(viewportWidth, 0f)
+                                lineTo(viewportWidth, viewportHeight)
+                                lineTo(0f, viewportHeight)
+                                close()
+                            }
+                    )
+                }
             Image(
                 painter = vectorPainter!!,
                 contentDescription = null,
-                modifier = Modifier
-                    .testTag(testTag)
-                    .background(Color.Red),
+                modifier = Modifier.testTag(testTag).background(Color.Red),
                 contentScale = ContentScale.FillBounds,
                 colorFilter = tint
             )
@@ -702,7 +667,8 @@
     @Test
     fun testAlphaMaskWithDrawDstOverBlendMode() {
         verifyAlphaMaskWithBlendModes(
-            colorFilter = ColorFilter.tint(Color.Yellow, BlendMode.DstOver))
+            colorFilter = ColorFilter.tint(Color.Yellow, BlendMode.DstOver)
+        )
     }
 
     @SdkSuppress(minSdkVersion = Build.VERSION_CODES.O)
@@ -724,28 +690,32 @@
     @Test
     fun testAlphaMaskWithDrawSrcOutBlendMode() {
         verifyAlphaMaskWithBlendModes(
-            colorFilter = ColorFilter.tint(Color.Yellow, BlendMode.SrcOut))
+            colorFilter = ColorFilter.tint(Color.Yellow, BlendMode.SrcOut)
+        )
     }
 
     @SdkSuppress(minSdkVersion = Build.VERSION_CODES.O)
     @Test
     fun testAlphaMaskWithDrawDstOutBlendMode() {
         verifyAlphaMaskWithBlendModes(
-            colorFilter = ColorFilter.tint(Color.Yellow, BlendMode.DstOut))
+            colorFilter = ColorFilter.tint(Color.Yellow, BlendMode.DstOut)
+        )
     }
 
     @SdkSuppress(minSdkVersion = Build.VERSION_CODES.O)
     @Test
     fun testAlphaMaskWithDrawSrcAtopBlendMode() {
         verifyAlphaMaskWithBlendModes(
-            colorFilter = ColorFilter.tint(Color.Yellow, BlendMode.SrcAtop))
+            colorFilter = ColorFilter.tint(Color.Yellow, BlendMode.SrcAtop)
+        )
     }
 
     @SdkSuppress(minSdkVersion = Build.VERSION_CODES.O)
     @Test
     fun testAlphaMaskWithDrawDstAtopBlendMode() {
         verifyAlphaMaskWithBlendModes(
-            colorFilter = ColorFilter.tint(Color.Yellow, BlendMode.DstAtop))
+            colorFilter = ColorFilter.tint(Color.Yellow, BlendMode.DstAtop)
+        )
     }
 
     @SdkSuppress(minSdkVersion = Build.VERSION_CODES.O)
@@ -764,84 +734,96 @@
     @Test
     fun testAlphaMaskWithDrawModulateBlendMode() {
         verifyAlphaMaskWithBlendModes(
-            colorFilter = ColorFilter.tint(Color.Yellow, BlendMode.Modulate))
+            colorFilter = ColorFilter.tint(Color.Yellow, BlendMode.Modulate)
+        )
     }
 
     @SdkSuppress(minSdkVersion = Build.VERSION_CODES.O)
     @Test
     fun testAlphaMaskWithDrawScreenBlendMode() {
         verifyAlphaMaskWithBlendModes(
-            colorFilter = ColorFilter.tint(Color.Yellow, BlendMode.Screen))
+            colorFilter = ColorFilter.tint(Color.Yellow, BlendMode.Screen)
+        )
     }
 
     @SdkSuppress(minSdkVersion = Build.VERSION_CODES.O)
     @Test
     fun testAlphaMaskWithDrawOverlayBlendMode() {
         verifyAlphaMaskWithBlendModes(
-            colorFilter = ColorFilter.tint(Color.Yellow, BlendMode.Overlay))
+            colorFilter = ColorFilter.tint(Color.Yellow, BlendMode.Overlay)
+        )
     }
 
     @SdkSuppress(minSdkVersion = Build.VERSION_CODES.O)
     @Test
     fun testAlphaMaskWithDrawDarkenBlendMode() {
         verifyAlphaMaskWithBlendModes(
-            colorFilter = ColorFilter.tint(Color.Yellow, BlendMode.Darken))
+            colorFilter = ColorFilter.tint(Color.Yellow, BlendMode.Darken)
+        )
     }
 
     @SdkSuppress(minSdkVersion = Build.VERSION_CODES.O)
     @Test
     fun testAlphaMaskWithDrawLightenBlendMode() {
         verifyAlphaMaskWithBlendModes(
-            colorFilter = ColorFilter.tint(Color.Yellow, BlendMode.Lighten))
+            colorFilter = ColorFilter.tint(Color.Yellow, BlendMode.Lighten)
+        )
     }
 
     @SdkSuppress(minSdkVersion = Build.VERSION_CODES.O)
     @Test
     fun testAlphaMaskWithDrawColorDodgeBlendMode() {
         verifyAlphaMaskWithBlendModes(
-            colorFilter = ColorFilter.tint(Color.Yellow, BlendMode.ColorDodge))
+            colorFilter = ColorFilter.tint(Color.Yellow, BlendMode.ColorDodge)
+        )
     }
 
     @SdkSuppress(minSdkVersion = Build.VERSION_CODES.O)
     @Test
     fun testAlphaMaskWithDrawColorBurnBlendMode() {
         verifyAlphaMaskWithBlendModes(
-            colorFilter = ColorFilter.tint(Color.Yellow, BlendMode.ColorBurn))
+            colorFilter = ColorFilter.tint(Color.Yellow, BlendMode.ColorBurn)
+        )
     }
 
     @SdkSuppress(minSdkVersion = Build.VERSION_CODES.O)
     @Test
     fun testAlphaMaskWithDrawHardlightBlendMode() {
         verifyAlphaMaskWithBlendModes(
-            colorFilter = ColorFilter.tint(Color.Yellow, BlendMode.Hardlight))
+            colorFilter = ColorFilter.tint(Color.Yellow, BlendMode.Hardlight)
+        )
     }
 
     @SdkSuppress(minSdkVersion = Build.VERSION_CODES.O)
     @Test
     fun testAlphaMaskWithDrawSoftLightBlendMode() {
         verifyAlphaMaskWithBlendModes(
-            colorFilter = ColorFilter.tint(Color.Yellow, BlendMode.Softlight))
+            colorFilter = ColorFilter.tint(Color.Yellow, BlendMode.Softlight)
+        )
     }
 
     @SdkSuppress(minSdkVersion = Build.VERSION_CODES.O)
     @Test
     fun testAlphaMaskWithDrawDifferenceBlendMode() {
         verifyAlphaMaskWithBlendModes(
-            colorFilter = ColorFilter.tint(Color.Yellow, BlendMode.Difference))
+            colorFilter = ColorFilter.tint(Color.Yellow, BlendMode.Difference)
+        )
     }
 
     @SdkSuppress(minSdkVersion = Build.VERSION_CODES.O)
     @Test
     fun testAlphaMaskWithDrawExclusionBlendMode() {
         verifyAlphaMaskWithBlendModes(
-            colorFilter = ColorFilter.tint(Color.Yellow, BlendMode.Exclusion))
+            colorFilter = ColorFilter.tint(Color.Yellow, BlendMode.Exclusion)
+        )
     }
 
     @SdkSuppress(minSdkVersion = Build.VERSION_CODES.O)
     @Test
     fun testAlphaMaskWithDrawMultiplyBlendMode() {
         verifyAlphaMaskWithBlendModes(
-            colorFilter = ColorFilter.tint(Color.Yellow, BlendMode.Multiply))
+            colorFilter = ColorFilter.tint(Color.Yellow, BlendMode.Multiply)
+        )
     }
 
     @SdkSuppress(minSdkVersion = Build.VERSION_CODES.O)
@@ -854,21 +836,22 @@
     @Test
     fun testAlphaMaskWithDrawSaturationBlendMode() {
         verifyAlphaMaskWithBlendModes(
-            colorFilter = ColorFilter.tint(Color.Yellow, BlendMode.Saturation))
+            colorFilter = ColorFilter.tint(Color.Yellow, BlendMode.Saturation)
+        )
     }
 
     @SdkSuppress(minSdkVersion = Build.VERSION_CODES.O)
     @Test
     fun testAlphaMaskWithDrawColorBlendMode() {
-        verifyAlphaMaskWithBlendModes(
-            colorFilter = ColorFilter.tint(Color.Yellow, BlendMode.Color))
+        verifyAlphaMaskWithBlendModes(colorFilter = ColorFilter.tint(Color.Yellow, BlendMode.Color))
     }
 
     @SdkSuppress(minSdkVersion = Build.VERSION_CODES.O)
     @Test
     fun testAlphaMaskWithDrawLuminosityBlendMode() {
         verifyAlphaMaskWithBlendModes(
-            colorFilter = ColorFilter.tint(Color.Yellow, BlendMode.Luminosity))
+            colorFilter = ColorFilter.tint(Color.Yellow, BlendMode.Luminosity)
+        )
     }
 
     @RequiresApi(Build.VERSION_CODES.O)
@@ -889,34 +872,36 @@
         val solidBlueColor = SolidColor(Color.Blue)
         var targetBrush: Brush by mutableStateOf(solidBlueColor)
         rule.setContent {
-            vectorPainter = rememberVectorPainter(
-                defaultWidth = defaultWidth,
-                defaultHeight = defaultHeight,
-                tintColor = Color.Cyan,
-                tintBlendMode = intrinsicBlendMode,
-                autoMirror = false
-            ) { viewportWidth, viewportHeight ->
-                Path(
-                    fill = targetBrush,
-                    pathData = PathData {
-                        lineTo(viewportWidth, 0f)
-                        lineTo(viewportWidth, viewportHeight)
-                        lineTo(0f, viewportHeight)
-                        close()
-                    }
-                )
-            }
+            vectorPainter =
+                rememberVectorPainter(
+                    defaultWidth = defaultWidth,
+                    defaultHeight = defaultHeight,
+                    tintColor = Color.Cyan,
+                    tintBlendMode = intrinsicBlendMode,
+                    autoMirror = false
+                ) { viewportWidth, viewportHeight ->
+                    Path(
+                        fill = targetBrush,
+                        pathData =
+                            PathData {
+                                lineTo(viewportWidth, 0f)
+                                lineTo(viewportWidth, viewportHeight)
+                                lineTo(0f, viewportHeight)
+                                close()
+                            }
+                    )
+                }
             Image(
                 painter = vectorPainter!!,
                 contentDescription = null,
-                modifier = Modifier
-                    .testTag(testTag)
-                    .background(
-                        Brush.horizontalGradient(
-                            listOf(Color.Transparent, Color.Yellow, Color.Transparent)
+                modifier =
+                    Modifier.testTag(testTag)
+                        .background(
+                            Brush.horizontalGradient(
+                                listOf(Color.Transparent, Color.Yellow, Color.Transparent)
+                            )
                         )
-                    )
-                    .graphicsLayer { compositingStrategy = CompositingStrategy.Offscreen },
+                        .graphicsLayer { compositingStrategy = CompositingStrategy.Offscreen },
                 contentScale = ContentScale.FillBounds,
                 colorFilter = colorFilter
             )
@@ -950,28 +935,30 @@
         var vectorPainter: VectorPainter? = null
         var brush: Brush by mutableStateOf(SolidColor(Color.Blue))
         rule.setContent {
-            vectorPainter = rememberVectorPainter(
-                defaultWidth = defaultWidth,
-                defaultHeight = defaultHeight,
-                autoMirror = false
-            ) { viewportWidth, viewportHeight ->
-                Path(
-                    fill = brush,
-                    pathData = PathData {
-                        lineTo(viewportWidth, 0f)
-                        lineTo(viewportWidth, viewportHeight)
-                        lineTo(0f, viewportHeight)
-                        close()
-                    }
-                )
-            }
+            vectorPainter =
+                rememberVectorPainter(
+                    defaultWidth = defaultWidth,
+                    defaultHeight = defaultHeight,
+                    autoMirror = false
+                ) { viewportWidth, viewportHeight ->
+                    Path(
+                        fill = brush,
+                        pathData =
+                            PathData {
+                                lineTo(viewportWidth, 0f)
+                                lineTo(viewportWidth, viewportHeight)
+                                lineTo(0f, viewportHeight)
+                                close()
+                            }
+                    )
+                }
             Image(
                 painter = vectorPainter!!,
                 contentDescription = null,
-                modifier = Modifier
-                    .testTag(testTag)
-                    .size(defaultWidth * 8, defaultHeight * 2)
-                    .background(Color.Red),
+                modifier =
+                    Modifier.testTag(testTag)
+                        .size(defaultWidth * 8, defaultHeight * 2)
+                        .background(Color.Red),
                 contentScale = ContentScale.FillBounds
             )
         }
@@ -993,30 +980,32 @@
         var vectorPainter: VectorPainter? = null
         var brush: Brush by mutableStateOf(SolidColor(Color.Blue))
         rule.setContent {
-            vectorPainter = rememberVectorPainter(
-                defaultWidth = defaultWidth,
-                defaultHeight = defaultHeight,
-                autoMirror = false
-            ) { viewportWidth, viewportHeight ->
-                Group {
-                    Path(
-                        fill = brush,
-                        pathData = PathData {
-                            lineTo(viewportWidth, 0f)
-                            lineTo(viewportWidth, viewportHeight)
-                            lineTo(0f, viewportHeight)
-                            close()
-                        }
-                    )
+            vectorPainter =
+                rememberVectorPainter(
+                    defaultWidth = defaultWidth,
+                    defaultHeight = defaultHeight,
+                    autoMirror = false
+                ) { viewportWidth, viewportHeight ->
+                    Group {
+                        Path(
+                            fill = brush,
+                            pathData =
+                                PathData {
+                                    lineTo(viewportWidth, 0f)
+                                    lineTo(viewportWidth, viewportHeight)
+                                    lineTo(0f, viewportHeight)
+                                    close()
+                                }
+                        )
+                    }
                 }
-            }
             Image(
                 painter = vectorPainter!!,
                 contentDescription = null,
-                modifier = Modifier
-                    .testTag(testTag)
-                    .size(defaultWidth * 8, defaultHeight * 2)
-                    .background(Color.Red),
+                modifier =
+                    Modifier.testTag(testTag)
+                        .size(defaultWidth * 8, defaultHeight * 2)
+                        .background(Color.Red),
                 contentScale = ContentScale.FillBounds
             )
         }
@@ -1037,28 +1026,30 @@
         val testTag = "testTag"
         var vectorPainter: VectorPainter? = null
         rule.setContent {
-            vectorPainter = rememberVectorPainter(
-                defaultWidth = defaultWidth,
-                defaultHeight = defaultHeight,
-                autoMirror = false
-            ) { viewportWidth, viewportHeight ->
-                Path(
-                    fill = SolidColor(Color.Blue),
-                    pathData = PathData {
-                        lineTo(viewportWidth, 0f)
-                        lineTo(viewportWidth, viewportHeight)
-                        lineTo(0f, viewportHeight)
-                        close()
-                    }
-                )
-            }
+            vectorPainter =
+                rememberVectorPainter(
+                    defaultWidth = defaultWidth,
+                    defaultHeight = defaultHeight,
+                    autoMirror = false
+                ) { viewportWidth, viewportHeight ->
+                    Path(
+                        fill = SolidColor(Color.Blue),
+                        pathData =
+                            PathData {
+                                lineTo(viewportWidth, 0f)
+                                lineTo(viewportWidth, viewportHeight)
+                                lineTo(0f, viewportHeight)
+                                close()
+                            }
+                    )
+                }
             Image(
                 painter = vectorPainter!!,
                 contentDescription = null,
-                modifier = Modifier
-                    .testTag(testTag)
-                    .size(defaultWidth * 8, defaultHeight * 2)
-                    .background(Color.Red),
+                modifier =
+                    Modifier.testTag(testTag)
+                        .size(defaultWidth * 8, defaultHeight * 2)
+                        .background(Color.Red),
                 contentScale = ContentScale.FillBounds
             )
         }
@@ -1074,12 +1065,13 @@
         val color = mutableStateOf(Color.Magenta)
 
         rule.setContent {
-            val background = Modifier.background(Color.Red).paint(
-                createTestVectorPainter(size.value, color.value),
-                alignment = Alignment.TopStart
-            )
-            AtLeastSize(size = 400, modifier = background) {
-            }
+            val background =
+                Modifier.background(Color.Red)
+                    .paint(
+                        createTestVectorPainter(size.value, color.value),
+                        alignment = Alignment.TopStart
+                    )
+            AtLeastSize(size = 400, modifier = background) {}
         }
 
         takeScreenShot(400).apply {
@@ -1112,10 +1104,7 @@
             val theme = LocalContext.current.theme
             val imageVectorCache = LocalImageVectorCache.current
             imageVectorCache.clear()
-            Image(
-                painterResource(R.drawable.ic_triangle),
-                contentDescription = null
-            )
+            Image(painterResource(R.drawable.ic_triangle), contentDescription = null)
 
             vectorInCache =
                 imageVectorCache[ImageVectorCache.Key(theme, R.drawable.ic_triangle)] != null
@@ -1135,10 +1124,7 @@
             theme = LocalContext.current.theme
             val imageVectorCache = LocalImageVectorCache.current
             imageVectorCache.clear()
-            Image(
-                painterResource(R.drawable.ic_triangle),
-                contentDescription = null
-            )
+            Image(painterResource(R.drawable.ic_triangle), contentDescription = null)
 
             vectorInCache =
                 imageVectorCache[ImageVectorCache.Key(theme!!, R.drawable.ic_triangle)] != null
@@ -1148,9 +1134,9 @@
 
         application?.onTrimMemory(0)
 
-        val cacheCleared = vectorCache?.let {
-            it[ImageVectorCache.Key(theme!!, R.drawable.ic_triangle)] == null
-        } ?: false
+        val cacheCleared =
+            vectorCache?.let { it[ImageVectorCache.Key(theme!!, R.drawable.ic_triangle)] == null }
+                ?: false
 
         assertTrue("Vector was not inserted in cache after initial creation", vectorInCache)
         assertTrue("Cache was not cleared after trim memory call", cacheCleared)
@@ -1160,26 +1146,28 @@
         var rotationCount = 0
         var rotateSuccess = false
         var latch: CountDownLatch? = null
-        val callbacks = object : ComponentCallbacks2 {
-            override fun onConfigurationChanged(p0: Configuration) {
-                latch?.countDown()
-            }
+        val callbacks =
+            object : ComponentCallbacks2 {
+                override fun onConfigurationChanged(p0: Configuration) {
+                    latch?.countDown()
+                }
 
-            override fun onLowMemory() {
-                // NO-OP
-            }
+                override fun onLowMemory() {
+                    // NO-OP
+                }
 
-            override fun onTrimMemory(p0: Int) {
-                // NO-OP
+                override fun onTrimMemory(p0: Int) {
+                    // NO-OP
+                }
             }
-        }
         application.registerComponentCallbacks(callbacks)
         try {
             while (rotationCount < 3 && !rotateSuccess) {
                 latch = CountDownLatch(1)
                 this.requestedOrientation = rotation
-                rotateSuccess = latch.await(3000, TimeUnit.MILLISECONDS) &&
-                    this.requestedOrientation == rotation
+                rotateSuccess =
+                    latch.await(3000, TimeUnit.MILLISECONDS) &&
+                        this.requestedOrientation == rotation
                 rotationCount++
             }
         } finally {
@@ -1244,9 +1232,7 @@
     @Test
     fun testVectorStrokeWidth() {
         val strokeWidth = mutableStateOf(100)
-        rule.setContent {
-            VectorStroke(strokeWidth = strokeWidth.value)
-        }
+        rule.setContent { VectorStroke(strokeWidth = strokeWidth.value) }
         takeScreenShot(200).apply {
             assertEquals(Color.Yellow.toArgb(), getPixel(100, 25))
             assertEquals(Color.Blue.toArgb(), getPixel(100, 75))
@@ -1265,13 +1251,13 @@
         minimumSize: Int = size,
         alignment: Alignment = Alignment.Center
     ) {
-        val background = Modifier.paint(
-            createTestVectorPainter(size),
-            colorFilter = ColorFilter.tint(Color.Cyan),
-            alignment = alignment
-        )
-        AtLeastSize(size = minimumSize, modifier = background) {
-        }
+        val background =
+            Modifier.paint(
+                createTestVectorPainter(size),
+                colorFilter = ColorFilter.tint(Color.Cyan),
+                alignment = alignment
+            )
+        AtLeastSize(size = minimumSize, modifier = background) {}
     }
 
     @Composable
@@ -1287,12 +1273,13 @@
             autoMirror = false,
             content = { _, _ ->
                 Path(
-                    pathData = PathData {
-                        lineTo(sizePx, 0.0f)
-                        lineTo(sizePx, sizePx)
-                        lineTo(0.0f, sizePx)
-                        close()
-                    },
+                    pathData =
+                        PathData {
+                            lineTo(sizePx, 0.0f)
+                            lineTo(sizePx, sizePx)
+                            lineTo(0.0f, sizePx)
+                            close()
+                        },
                     fill = SolidColor(Color.Black)
                 )
             },
@@ -1308,50 +1295,53 @@
     ) {
         val sizePx = size.toFloat()
         val sizeDp = (size / LocalDensity.current.density).dp
-        val background = Modifier.paint(
-            rememberVectorPainter(
-                defaultWidth = sizeDp,
-                defaultHeight = sizeDp,
-                autoMirror = false
-            ) { _, _ ->
-                Path(
-                    // Cyan background.
-                    pathData = PathData {
-                        lineTo(sizePx, 0.0f)
-                        lineTo(sizePx, sizePx)
-                        lineTo(0.0f, sizePx)
-                        close()
-                    },
-                    fill = SolidColor(Color.Cyan)
-                )
-                Group(
-                    // Only show the top half...
-                    clipPathData = PathData {
-                        lineTo(sizePx, 0.0f)
-                        lineTo(sizePx, sizePx / 2)
-                        lineTo(0.0f, sizePx / 2)
-                        close()
-                    },
-                    // And rotate it, resulting in the bottom half being black.
-                    pivotX = sizePx / 2,
-                    pivotY = sizePx / 2,
-                    rotation = 180f
-                ) {
+        val background =
+            Modifier.paint(
+                rememberVectorPainter(
+                    defaultWidth = sizeDp,
+                    defaultHeight = sizeDp,
+                    autoMirror = false
+                ) { _, _ ->
                     Path(
-                        pathData = PathData {
-                            lineTo(sizePx, 0.0f)
-                            lineTo(sizePx, sizePx)
-                            lineTo(0.0f, sizePx)
-                            close()
-                        },
-                        fill = SolidColor(Color.Black)
+                        // Cyan background.
+                        pathData =
+                            PathData {
+                                lineTo(sizePx, 0.0f)
+                                lineTo(sizePx, sizePx)
+                                lineTo(0.0f, sizePx)
+                                close()
+                            },
+                        fill = SolidColor(Color.Cyan)
                     )
-                }
-            },
-            alignment = alignment
-        )
-        AtLeastSize(size = minimumSize, modifier = background) {
-        }
+                    Group(
+                        // Only show the top half...
+                        clipPathData =
+                            PathData {
+                                lineTo(sizePx, 0.0f)
+                                lineTo(sizePx, sizePx / 2)
+                                lineTo(0.0f, sizePx / 2)
+                                close()
+                            },
+                        // And rotate it, resulting in the bottom half being black.
+                        pivotX = sizePx / 2,
+                        pivotY = sizePx / 2,
+                        rotation = 180f
+                    ) {
+                        Path(
+                            pathData =
+                                PathData {
+                                    lineTo(sizePx, 0.0f)
+                                    lineTo(sizePx, sizePx)
+                                    lineTo(0.0f, sizePx)
+                                    close()
+                                },
+                            fill = SolidColor(Color.Black)
+                        )
+                    }
+                },
+                alignment = alignment
+            )
+        AtLeastSize(size = minimumSize, modifier = background) {}
     }
 
     @Composable
@@ -1362,38 +1352,40 @@
     ) {
         val sizePx = size.toFloat()
         val sizeDp = (size / LocalDensity.current.density).dp
-        val background = Modifier.paint(
-            rememberVectorPainter(
-                defaultWidth = sizeDp,
-                defaultHeight = sizeDp,
-                autoMirror = false
-            ) { _, _ ->
-                Path(
-                    pathData = PathData {
-                        lineTo(sizePx, 0.0f)
-                        lineTo(sizePx, sizePx)
-                        lineTo(0.0f, sizePx)
-                        close()
-                    },
-                    fill = SolidColor(Color.Blue)
-                )
-                // A thick stroke
-                Path(
-                    pathData = PathData {
-                        moveTo(0.0f, sizePx / 2)
-                        lineTo(sizePx, sizePx / 2)
-                    },
-                    stroke = SolidColor(Color.Yellow),
-                    strokeLineWidth = sizePx / 2,
-                    trimPathStart = 0.25f,
-                    trimPathEnd = 0.75f,
-                    trimPathOffset = 0.5f
-                )
-            },
-            alignment = alignment
-        )
-        AtLeastSize(size = minimumSize, modifier = background) {
-        }
+        val background =
+            Modifier.paint(
+                rememberVectorPainter(
+                    defaultWidth = sizeDp,
+                    defaultHeight = sizeDp,
+                    autoMirror = false
+                ) { _, _ ->
+                    Path(
+                        pathData =
+                            PathData {
+                                lineTo(sizePx, 0.0f)
+                                lineTo(sizePx, sizePx)
+                                lineTo(0.0f, sizePx)
+                                close()
+                            },
+                        fill = SolidColor(Color.Blue)
+                    )
+                    // A thick stroke
+                    Path(
+                        pathData =
+                            PathData {
+                                moveTo(0.0f, sizePx / 2)
+                                lineTo(sizePx, sizePx / 2)
+                            },
+                        stroke = SolidColor(Color.Yellow),
+                        strokeLineWidth = sizePx / 2,
+                        trimPathStart = 0.25f,
+                        trimPathEnd = 0.75f,
+                        trimPathOffset = 0.5f
+                    )
+                },
+                alignment = alignment
+            )
+        AtLeastSize(size = minimumSize, modifier = background) {}
     }
 
     @Composable
@@ -1406,35 +1398,37 @@
         val sizePx = size.toFloat()
         val sizeDp = (size / LocalDensity.current.density).dp
         val strokeWidthPx = strokeWidth.toFloat()
-        val background = Modifier.paint(
-            rememberVectorPainter(
-                defaultWidth = sizeDp,
-                defaultHeight = sizeDp,
-                autoMirror = false
-            ) { _, _ ->
-                Path(
-                    pathData = PathData {
-                        lineTo(sizePx, 0.0f)
-                        lineTo(sizePx, sizePx)
-                        lineTo(0.0f, sizePx)
-                        close()
-                    },
-                    fill = SolidColor(Color.Blue)
-                )
-                // A thick stroke
-                Path(
-                    pathData = PathData {
-                        moveTo(0.0f, 0.0f)
-                        lineTo(sizePx, 0.0f)
-                    },
-                    stroke = SolidColor(Color.Yellow),
-                    strokeLineWidth = strokeWidthPx,
-                )
-            },
-            alignment = alignment
-        )
-        AtLeastSize(size = minimumSize, modifier = background) {
-        }
+        val background =
+            Modifier.paint(
+                rememberVectorPainter(
+                    defaultWidth = sizeDp,
+                    defaultHeight = sizeDp,
+                    autoMirror = false
+                ) { _, _ ->
+                    Path(
+                        pathData =
+                            PathData {
+                                lineTo(sizePx, 0.0f)
+                                lineTo(sizePx, sizePx)
+                                lineTo(0.0f, sizePx)
+                                close()
+                            },
+                        fill = SolidColor(Color.Blue)
+                    )
+                    // A thick stroke
+                    Path(
+                        pathData =
+                            PathData {
+                                moveTo(0.0f, 0.0f)
+                                lineTo(sizePx, 0.0f)
+                            },
+                        stroke = SolidColor(Color.Yellow),
+                        strokeLineWidth = strokeWidthPx,
+                    )
+                },
+                alignment = alignment
+            )
+        AtLeastSize(size = minimumSize, modifier = background) {}
     }
 
     @Composable
@@ -1442,31 +1436,33 @@
         val sizePx = size.toFloat()
         val sizeDp = (size / LocalDensity.current.density).dp
         return rememberVectorPainter(
-                defaultWidth = sizeDp,
-                defaultHeight = sizeDp,
-                autoMirror = true
-            ) { _, _ ->
-                Path(
-                    pathData = PathData {
+            defaultWidth = sizeDp,
+            defaultHeight = sizeDp,
+            autoMirror = true
+        ) { _, _ ->
+            Path(
+                pathData =
+                    PathData {
                         lineTo(sizePx / 2, 0f)
                         lineTo(sizePx / 2, sizePx)
                         lineTo(0f, sizePx)
                         close()
                     },
-                    fill = SolidColor(Color.Red)
-                )
+                fill = SolidColor(Color.Red)
+            )
 
-                Path(
-                    pathData = PathData {
+            Path(
+                pathData =
+                    PathData {
                         moveTo(sizePx / 2, 0f)
                         lineTo(sizePx, 0f)
                         lineTo(sizePx, sizePx)
                         lineTo(sizePx / 2, sizePx)
                         close()
                     },
-                    fill = SolidColor(Color.Blue)
-                )
-            }
+                fill = SolidColor(Color.Blue)
+            )
+        }
     }
 
     // captureToImage() requires API level 26
diff --git a/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/graphics/vector/compat/XmlVectorParserTest.kt b/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/graphics/vector/compat/XmlVectorParserTest.kt
index c02449d..1555b70 100644
--- a/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/graphics/vector/compat/XmlVectorParserTest.kt
+++ b/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/graphics/vector/compat/XmlVectorParserTest.kt
@@ -43,11 +43,7 @@
     @Test
     fun testParseXml() {
         val res = InstrumentationRegistry.getInstrumentation().targetContext.resources
-        val asset = ImageVector.vectorResource(
-            null,
-            res,
-            R.drawable.test_compose_vector
-        )
+        val asset = ImageVector.vectorResource(null, res, R.drawable.test_compose_vector)
         val expectedSize = 24.dp
         assertEquals(expectedSize, asset.defaultWidth)
         assertEquals(expectedSize, asset.defaultHeight)
@@ -88,11 +84,7 @@
     @Test
     fun testImplicitLineTo() {
         val res = InstrumentationRegistry.getInstrumentation().targetContext.resources
-        val asset = ImageVector.vectorResource(
-            null,
-            res,
-            R.drawable.test_compose_vector2
-        )
+        val asset = ImageVector.vectorResource(null, res, R.drawable.test_compose_vector2)
 
         val node = asset.root.iterator().next() as VectorPath
         val path = node.pathData
@@ -113,11 +105,7 @@
     @Test
     fun testGroupParsing() {
         val res = InstrumentationRegistry.getInstrumentation().targetContext.resources
-        val asset = ImageVector.vectorResource(
-            null,
-            res,
-            R.drawable.test_compose_vector3
-        )
+        val asset = ImageVector.vectorResource(null, res, R.drawable.test_compose_vector3)
 
         val root = asset.root
         assertEquals(1, root.size)
@@ -257,16 +245,10 @@
 
     private fun loadVector(id: Int, theme: Resources.Theme? = null): ImageVector {
         val res = InstrumentationRegistry.getInstrumentation().targetContext.resources
-        return ImageVector.vectorResource(
-            theme,
-            res,
-            id
-        )
+        return ImageVector.vectorResource(theme, res, id)
     }
 
-    /**
-     * Asserts that [this] is the expected type [T], and then returns [this] cast to [T].
-     */
+    /** Asserts that [this] is the expected type [T], and then returns [this] cast to [T]. */
     private inline fun <reified T : PathNode> PathNode.assertType(): T {
         assertTrue(
             "Expected type ${T::class.java.simpleName} but was actually " +
@@ -276,9 +258,7 @@
         return this as T
     }
 
-    /**
-     * Asserts that [this] is the expected type [T], and then returns [this] cast to [T].
-     */
+    /** Asserts that [this] is the expected type [T], and then returns [this] cast to [T]. */
     private inline fun <reified T : VectorNode> VectorNode.assertType(): T {
         assertTrue(
             "Expected type ${T::class.java.simpleName} but was actually " +
diff --git a/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/input/ClickNotPlacedChildTest.kt b/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/input/ClickNotPlacedChildTest.kt
index 862a16a..c09544e 100644
--- a/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/input/ClickNotPlacedChildTest.kt
+++ b/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/input/ClickNotPlacedChildTest.kt
@@ -40,8 +40,7 @@
 @RunWith(AndroidJUnit4::class)
 class ClickNotPlacedChildTest {
 
-    @get:Rule
-    val composeTestRule = createComposeRule()
+    @get:Rule val composeTestRule = createComposeRule()
 
     @Test
     @SdkSuppress(minSdkVersion = Build.VERSION_CODES.O)
@@ -51,29 +50,18 @@
         composeTestRule.setContent {
             Layout(
                 content = {
-                    Box(
-                        Modifier.fillMaxSize().clickable {
-                            firstClickedTimes++
-                        }
-                    )
-                    Box(
-                        Modifier.fillMaxSize().clickable {
-                            secondClickedTimes++
-                        }
-                    )
+                    Box(Modifier.fillMaxSize().clickable { firstClickedTimes++ })
+                    Box(Modifier.fillMaxSize().clickable { secondClickedTimes++ })
                 },
                 modifier = Modifier.requiredSize(100.dp).testTag("parent")
             ) { measutables, constraints ->
                 val first = measutables[0].measure(constraints)
                 measutables[1].measure(constraints)
-                layout(first.width, first.height) {
-                    first.place(0, 0)
-                }
+                layout(first.width, first.height) { first.place(0, 0) }
             }
         }
 
-        composeTestRule.onNodeWithTag("parent")
-            .performClick()
+        composeTestRule.onNodeWithTag("parent").performClick()
 
         composeTestRule.runOnIdle {
             assertEquals(0, secondClickedTimes)
diff --git a/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/input/CursorAnchorInfoBuilderTest.kt b/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/input/CursorAnchorInfoBuilderTest.kt
index 66bbeb5..bdc099f 100644
--- a/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/input/CursorAnchorInfoBuilderTest.kt
+++ b/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/input/CursorAnchorInfoBuilderTest.kt
@@ -280,10 +280,13 @@
     fun testInsertionMarkerWithVisualTransformation() {
         val fontSize = 10.sp
         val textFieldValue = TextFieldValue("abcde", selection = TextRange(2))
-        val offsetMapping = object : OffsetMapping {
-            override fun originalToTransformed(offset: Int) = if (offset < 2) offset else offset + 3
-            override fun transformedToOriginal(offset: Int) = throw NotImplementedError()
-        }
+        val offsetMapping =
+            object : OffsetMapping {
+                override fun originalToTransformed(offset: Int) =
+                    if (offset < 2) offset else offset + 3
+
+                override fun transformedToOriginal(offset: Int) = throw NotImplementedError()
+            }
         val textLayoutResult = getTextLayoutResult("ab---cde", fontSize = fontSize)
 
         val cursorAnchorInfo =
@@ -445,10 +448,12 @@
         val text = "abcd"
         // Composition is on "bc"
         val composition = TextRange(2, 4)
-        val offsetMapping = object : OffsetMapping {
-            override fun originalToTransformed(offset: Int) = 2 * offset
-            override fun transformedToOriginal(offset: Int) = throw NotImplementedError()
-        }
+        val offsetMapping =
+            object : OffsetMapping {
+                override fun originalToTransformed(offset: Int) = 2 * offset
+
+                override fun transformedToOriginal(offset: Int) = throw NotImplementedError()
+            }
         val transformedText = "a-b-c-d-"
         val textFieldValue = TextFieldValue(text, composition = composition)
         val width = transformedText.length * fontSizeInPx
diff --git a/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/input/EditorInfoTest.kt b/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/input/EditorInfoTest.kt
index 5c9a77e..4b4a312 100644
--- a/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/input/EditorInfoTest.kt
+++ b/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/input/EditorInfoTest.kt
@@ -39,233 +39,172 @@
     @Test
     fun test_fill_editor_info_text() {
         val info = EditorInfo()
-        info.update(
-            ImeOptions(
-                keyboardType = KeyboardType.Text,
-                imeAction = ImeAction.Default
-            )
-        )
+        info.update(ImeOptions(keyboardType = KeyboardType.Text, imeAction = ImeAction.Default))
 
         assertThat((InputType.TYPE_CLASS_TEXT and info.inputType) != 0).isTrue()
         assertThat(
-            (EditorInfo.IME_MASK_ACTION and info.imeOptions)
-                == EditorInfo.IME_ACTION_UNSPECIFIED
-        ).isTrue()
+                (EditorInfo.IME_MASK_ACTION and info.imeOptions) ==
+                    EditorInfo.IME_ACTION_UNSPECIFIED
+            )
+            .isTrue()
     }
 
     @Test
     fun test_fill_editor_info_ascii() {
         val info = EditorInfo()
-        info.update(
-            ImeOptions(
-                keyboardType = KeyboardType.Ascii,
-                imeAction = ImeAction.Default
-            )
-        )
+        info.update(ImeOptions(keyboardType = KeyboardType.Ascii, imeAction = ImeAction.Default))
 
         assertThat((InputType.TYPE_CLASS_TEXT and info.inputType) != 0).isTrue()
         assertThat((EditorInfo.IME_FLAG_FORCE_ASCII and info.imeOptions) != 0).isTrue()
         assertThat(
-            (EditorInfo.IME_MASK_ACTION and info.imeOptions)
-                == EditorInfo.IME_ACTION_UNSPECIFIED
-        ).isTrue()
+                (EditorInfo.IME_MASK_ACTION and info.imeOptions) ==
+                    EditorInfo.IME_ACTION_UNSPECIFIED
+            )
+            .isTrue()
     }
 
     @Test
     fun test_fill_editor_info_number() {
         val info = EditorInfo()
-        info.update(
-            ImeOptions(
-                keyboardType = KeyboardType.Number,
-                imeAction = ImeAction.Default
-            )
-        )
+        info.update(ImeOptions(keyboardType = KeyboardType.Number, imeAction = ImeAction.Default))
 
         assertThat((InputType.TYPE_CLASS_NUMBER and info.inputType) != 0).isTrue()
         assertThat(
-            (EditorInfo.IME_MASK_ACTION and info.imeOptions)
-                == EditorInfo.IME_ACTION_UNSPECIFIED
-        ).isTrue()
+                (EditorInfo.IME_MASK_ACTION and info.imeOptions) ==
+                    EditorInfo.IME_ACTION_UNSPECIFIED
+            )
+            .isTrue()
     }
 
     @Test
     fun test_fill_editor_info_phone() {
         val info = EditorInfo()
-        info.update(
-            ImeOptions(
-                keyboardType = KeyboardType.Phone,
-                imeAction = ImeAction.Default
-            )
-        )
+        info.update(ImeOptions(keyboardType = KeyboardType.Phone, imeAction = ImeAction.Default))
 
         assertThat((InputType.TYPE_CLASS_PHONE and info.inputType) != 0).isTrue()
         assertThat(
-            (EditorInfo.IME_MASK_ACTION and info.imeOptions)
-                == EditorInfo.IME_ACTION_UNSPECIFIED
-        ).isTrue()
+                (EditorInfo.IME_MASK_ACTION and info.imeOptions) ==
+                    EditorInfo.IME_ACTION_UNSPECIFIED
+            )
+            .isTrue()
     }
 
     @Test
     fun test_fill_editor_info_uri() {
         val info = EditorInfo()
-        info.update(
-            ImeOptions(
-                keyboardType = KeyboardType.Uri,
-                imeAction = ImeAction.Default
-            )
-        )
+        info.update(ImeOptions(keyboardType = KeyboardType.Uri, imeAction = ImeAction.Default))
 
         assertThat((InputType.TYPE_CLASS_TEXT and info.inputType) != 0).isTrue()
         assertThat((InputType.TYPE_TEXT_VARIATION_URI and info.inputType) != 0).isTrue()
         assertThat(
-            (EditorInfo.IME_MASK_ACTION and info.imeOptions)
-                == EditorInfo.IME_ACTION_UNSPECIFIED
-        ).isTrue()
+                (EditorInfo.IME_MASK_ACTION and info.imeOptions) ==
+                    EditorInfo.IME_ACTION_UNSPECIFIED
+            )
+            .isTrue()
     }
 
     @Test
     fun test_fill_editor_info_email() {
         val info = EditorInfo()
-        info.update(
-            ImeOptions(
-                keyboardType = KeyboardType.Email,
-                imeAction = ImeAction.Default
-            )
-        )
+        info.update(ImeOptions(keyboardType = KeyboardType.Email, imeAction = ImeAction.Default))
 
         assertThat((InputType.TYPE_CLASS_TEXT and info.inputType) != 0).isTrue()
-        assertThat((InputType.TYPE_TEXT_VARIATION_EMAIL_ADDRESS and info.inputType) != 0)
-            .isTrue()
+        assertThat((InputType.TYPE_TEXT_VARIATION_EMAIL_ADDRESS and info.inputType) != 0).isTrue()
         assertThat(
-            (EditorInfo.IME_MASK_ACTION and info.imeOptions)
-                == EditorInfo.IME_ACTION_UNSPECIFIED
-        ).isTrue()
+                (EditorInfo.IME_MASK_ACTION and info.imeOptions) ==
+                    EditorInfo.IME_ACTION_UNSPECIFIED
+            )
+            .isTrue()
     }
 
     @Test
     fun test_fill_editor_info_password() {
         val info = EditorInfo()
-        info.update(
-            ImeOptions(
-                keyboardType = KeyboardType.Password,
-                imeAction = ImeAction.Default
-            )
-        )
+        info.update(ImeOptions(keyboardType = KeyboardType.Password, imeAction = ImeAction.Default))
 
         assertThat((InputType.TYPE_CLASS_TEXT and info.inputType) != 0).isTrue()
         assertThat((InputType.TYPE_TEXT_VARIATION_PASSWORD and info.inputType) != 0).isTrue()
         assertThat(
-            (EditorInfo.IME_MASK_ACTION and info.imeOptions)
-                == EditorInfo.IME_ACTION_UNSPECIFIED
-        ).isTrue()
+                (EditorInfo.IME_MASK_ACTION and info.imeOptions) ==
+                    EditorInfo.IME_ACTION_UNSPECIFIED
+            )
+            .isTrue()
     }
 
     @Test
     fun test_fill_editor_info_number_password() {
         val info = EditorInfo()
         info.update(
-            ImeOptions(
-                keyboardType = KeyboardType.NumberPassword,
-                imeAction = ImeAction.Default
-            )
+            ImeOptions(keyboardType = KeyboardType.NumberPassword, imeAction = ImeAction.Default)
         )
 
         assertThat((InputType.TYPE_CLASS_NUMBER and info.inputType) != 0).isTrue()
         assertThat((InputType.TYPE_NUMBER_VARIATION_PASSWORD and info.inputType) != 0).isTrue()
         assertThat(
-            (EditorInfo.IME_MASK_ACTION and info.imeOptions)
-                == EditorInfo.IME_ACTION_UNSPECIFIED
-        ).isTrue()
+                (EditorInfo.IME_MASK_ACTION and info.imeOptions) ==
+                    EditorInfo.IME_ACTION_UNSPECIFIED
+            )
+            .isTrue()
     }
 
     @Test
     fun test_fill_editor_info_decimal_number() {
         val info = EditorInfo()
-        info.update(
-            ImeOptions(
-                keyboardType = KeyboardType.Decimal,
-                imeAction = ImeAction.Default
-            )
-        )
+        info.update(ImeOptions(keyboardType = KeyboardType.Decimal, imeAction = ImeAction.Default))
 
         assertThat((InputType.TYPE_CLASS_NUMBER and info.inputType) != 0).isTrue()
         assertThat((InputType.TYPE_NUMBER_FLAG_DECIMAL and info.inputType) != 0).isTrue()
         assertThat(
-            (EditorInfo.IME_MASK_ACTION and info.imeOptions)
-                == EditorInfo.IME_ACTION_UNSPECIFIED
-        ).isTrue()
+                (EditorInfo.IME_MASK_ACTION and info.imeOptions) ==
+                    EditorInfo.IME_ACTION_UNSPECIFIED
+            )
+            .isTrue()
     }
 
     @Test
     fun test_fill_editor_info_action_none() {
         val info = EditorInfo()
-        info.update(
-            ImeOptions(
-                keyboardType = KeyboardType.Ascii,
-                imeAction = ImeAction.None
-            )
-        )
+        info.update(ImeOptions(keyboardType = KeyboardType.Ascii, imeAction = ImeAction.None))
 
         assertThat((InputType.TYPE_CLASS_TEXT and info.inputType) != 0).isTrue()
         assertThat((EditorInfo.IME_FLAG_FORCE_ASCII and info.imeOptions) != 0).isTrue()
-        assertThat(
-            (EditorInfo.IME_MASK_ACTION and info.imeOptions)
-                == EditorInfo.IME_ACTION_NONE
-        ).isTrue()
+        assertThat((EditorInfo.IME_MASK_ACTION and info.imeOptions) == EditorInfo.IME_ACTION_NONE)
+            .isTrue()
     }
 
     @Test
     fun test_fill_editor_info_action_go() {
         val info = EditorInfo()
-        info.update(
-            ImeOptions(
-                keyboardType = KeyboardType.Ascii,
-                imeAction = ImeAction.Go
-            )
-        )
+        info.update(ImeOptions(keyboardType = KeyboardType.Ascii, imeAction = ImeAction.Go))
 
         assertThat((InputType.TYPE_CLASS_TEXT and info.inputType) != 0).isTrue()
         assertThat((EditorInfo.IME_FLAG_FORCE_ASCII and info.imeOptions) != 0).isTrue()
-        assertThat(
-            (EditorInfo.IME_MASK_ACTION and info.imeOptions)
-                == EditorInfo.IME_ACTION_GO
-        ).isTrue()
+        assertThat((EditorInfo.IME_MASK_ACTION and info.imeOptions) == EditorInfo.IME_ACTION_GO)
+            .isTrue()
     }
 
     @Test
     fun test_fill_editor_info_action_next() {
         val info = EditorInfo()
-        info.update(
-            ImeOptions(
-                keyboardType = KeyboardType.Ascii,
-                imeAction = ImeAction.Next
-            )
-        )
+        info.update(ImeOptions(keyboardType = KeyboardType.Ascii, imeAction = ImeAction.Next))
 
         assertThat((InputType.TYPE_CLASS_TEXT and info.inputType) != 0).isTrue()
         assertThat((EditorInfo.IME_FLAG_FORCE_ASCII and info.imeOptions) != 0).isTrue()
-        assertThat(
-            (EditorInfo.IME_MASK_ACTION and info.imeOptions)
-                == EditorInfo.IME_ACTION_NEXT
-        ).isTrue()
+        assertThat((EditorInfo.IME_MASK_ACTION and info.imeOptions) == EditorInfo.IME_ACTION_NEXT)
+            .isTrue()
     }
 
     @Test
     fun test_fill_editor_info_action_previous() {
         val info = EditorInfo()
-        info.update(
-            ImeOptions(
-                keyboardType = KeyboardType.Ascii,
-                imeAction = ImeAction.Previous
-            )
-        )
+        info.update(ImeOptions(keyboardType = KeyboardType.Ascii, imeAction = ImeAction.Previous))
 
         assertThat((InputType.TYPE_CLASS_TEXT and info.inputType) != 0).isTrue()
         assertThat((EditorInfo.IME_FLAG_FORCE_ASCII and info.imeOptions) != 0).isTrue()
         assertThat(
-            (EditorInfo.IME_MASK_ACTION and info.imeOptions)
-                == EditorInfo.IME_ACTION_PREVIOUS
-        ).isTrue()
+                (EditorInfo.IME_MASK_ACTION and info.imeOptions) == EditorInfo.IME_ACTION_PREVIOUS
+            )
+            .isTrue()
     }
 
     @Test
@@ -280,46 +219,30 @@
 
         assertThat((InputType.TYPE_CLASS_TEXT and info.inputType) != 0).isTrue()
         assertThat((EditorInfo.IME_FLAG_FORCE_ASCII and info.imeOptions) != 0).isTrue()
-        assertThat(
-            (EditorInfo.IME_MASK_ACTION and info.imeOptions)
-                == EditorInfo.IME_ACTION_SEARCH
-        ).isTrue()
+        assertThat((EditorInfo.IME_MASK_ACTION and info.imeOptions) == EditorInfo.IME_ACTION_SEARCH)
+            .isTrue()
     }
 
     @Test
     fun test_fill_editor_info_action_send() {
         val info = EditorInfo()
-        info.update(
-            ImeOptions(
-                keyboardType = KeyboardType.Ascii,
-                imeAction = ImeAction.Send
-            )
-        )
+        info.update(ImeOptions(keyboardType = KeyboardType.Ascii, imeAction = ImeAction.Send))
 
         assertThat((InputType.TYPE_CLASS_TEXT and info.inputType) != 0).isTrue()
         assertThat((EditorInfo.IME_FLAG_FORCE_ASCII and info.imeOptions) != 0).isTrue()
-        assertThat(
-            (EditorInfo.IME_MASK_ACTION and info.imeOptions)
-                == EditorInfo.IME_ACTION_SEND
-        ).isTrue()
+        assertThat((EditorInfo.IME_MASK_ACTION and info.imeOptions) == EditorInfo.IME_ACTION_SEND)
+            .isTrue()
     }
 
     @Test
     fun test_fill_editor_info_action_done() {
         val info = EditorInfo()
-        info.update(
-            ImeOptions(
-                keyboardType = KeyboardType.Ascii,
-                imeAction = ImeAction.Done
-            )
-        )
+        info.update(ImeOptions(keyboardType = KeyboardType.Ascii, imeAction = ImeAction.Done))
 
         assertThat((InputType.TYPE_CLASS_TEXT and info.inputType) != 0).isTrue()
         assertThat((EditorInfo.IME_FLAG_FORCE_ASCII and info.imeOptions) != 0).isTrue()
-        assertThat(
-            (EditorInfo.IME_MASK_ACTION and info.imeOptions)
-                == EditorInfo.IME_ACTION_DONE
-        ).isTrue()
+        assertThat((EditorInfo.IME_MASK_ACTION and info.imeOptions) == EditorInfo.IME_ACTION_DONE)
+            .isTrue()
     }
 
     @Test
@@ -542,11 +465,7 @@
     fun test_privateImeOptions_is_set() {
         val info = EditorInfo()
         val privateImeOptions = "testOptions"
-        info.update(
-            ImeOptions(
-                platformImeOptions = PlatformImeOptions(privateImeOptions)
-            )
-        )
+        info.update(ImeOptions(platformImeOptions = PlatformImeOptions(privateImeOptions)))
 
         assertThat(info.privateImeOptions).isEqualTo(privateImeOptions)
     }
diff --git a/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/input/InputModeTest.kt b/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/input/InputModeTest.kt
index 1cd05d2..98c802f 100644
--- a/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/input/InputModeTest.kt
+++ b/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/input/InputModeTest.kt
@@ -40,8 +40,7 @@
 @RunWith(Parameterized::class)
 @OptIn(ExperimentalComposeUiApi::class)
 class InputModeTest(private val param: Param) {
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
     private lateinit var inputModeManager: InputModeManager
 
@@ -54,22 +53,19 @@
 
     // TODO(b/267253920): Add a compose test API to set/reset InputMode.
     @After
-    fun resetTouchMode() = with(InstrumentationRegistry.getInstrumentation()) {
-        if (SDK_INT < 33) setInTouchMode(true) else resetInTouchMode()
-    }
+    fun resetTouchMode() =
+        with(InstrumentationRegistry.getInstrumentation()) {
+            if (SDK_INT < 33) setInTouchMode(true) else resetInTouchMode()
+        }
 
     @Test
     fun switchToTouchModeProgrammatically() {
         // Arrange.
-        rule.setContentWithInputManager {
-            Box {}
-        }
+        rule.setContentWithInputManager { Box {} }
         val initialMode = rule.runOnIdle { inputModeManager.inputMode }
 
         // Act.
-        val requestGranted = rule.runOnIdle {
-            inputModeManager.requestInputMode(Touch)
-        }
+        val requestGranted = rule.runOnIdle { inputModeManager.requestInputMode(Touch) }
 
         // Assert
         rule.runOnIdle {
diff --git a/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/input/RecordingInputConnectionTest.kt b/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/input/RecordingInputConnectionTest.kt
index 38c0413..455c2b1 100644
--- a/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/input/RecordingInputConnectionTest.kt
+++ b/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/input/RecordingInputConnectionTest.kt
@@ -59,11 +59,12 @@
     @Before
     fun setup() {
         mCallback = mock()
-        ic = RecordingInputConnection(
-            initState = TextFieldValue("", TextRange.Zero),
-            eventCallback = mCallback,
-            autoCorrect = true
-        )
+        ic =
+            RecordingInputConnection(
+                initState = TextFieldValue("", TextRange.Zero),
+                eventCallback = mCallback,
+                autoCorrect = true
+            )
     }
 
     @Test
@@ -72,28 +73,19 @@
         assertThat(ic.getTextAfterCursor(100, 0)).isEqualTo("")
 
         // Set "Hello, World", and place the cursor at the beginning of the text.
-        ic.mTextFieldValue = TextFieldValue(
-            text = "Hello, World",
-            selection = TextRange.Zero
-        )
+        ic.mTextFieldValue = TextFieldValue(text = "Hello, World", selection = TextRange.Zero)
 
         assertThat(ic.getTextBeforeCursor(100, 0)).isEqualTo("")
         assertThat(ic.getTextAfterCursor(100, 0)).isEqualTo("Hello, World")
 
         // Set "Hello, World", and place the cursor between "H" and "e".
-        ic.mTextFieldValue = TextFieldValue(
-            text = "Hello, World",
-            selection = TextRange(1)
-        )
+        ic.mTextFieldValue = TextFieldValue(text = "Hello, World", selection = TextRange(1))
 
         assertThat(ic.getTextBeforeCursor(100, 0)).isEqualTo("H")
         assertThat(ic.getTextAfterCursor(100, 0)).isEqualTo("ello, World")
 
         // Set "Hello, World", and place the cursor at the end of the text.
-        ic.mTextFieldValue = TextFieldValue(
-            text = "Hello, World",
-            selection = TextRange(12)
-        )
+        ic.mTextFieldValue = TextFieldValue(text = "Hello, World", selection = TextRange(12))
 
         assertThat(ic.getTextBeforeCursor(100, 0)).isEqualTo("Hello, World")
         assertThat(ic.getTextAfterCursor(100, 0)).isEqualTo("")
@@ -102,28 +94,19 @@
     @Test
     fun getTextBeforeAndAfterCursorTest_maxCharTest() {
         // Set "Hello, World", and place the cursor at the beginning of the text.
-        ic.mTextFieldValue = TextFieldValue(
-            text = "Hello, World",
-            selection = TextRange.Zero
-        )
+        ic.mTextFieldValue = TextFieldValue(text = "Hello, World", selection = TextRange.Zero)
 
         assertThat(ic.getTextBeforeCursor(5, 0)).isEqualTo("")
         assertThat(ic.getTextAfterCursor(5, 0)).isEqualTo("Hello")
 
         // Set "Hello, World", and place the cursor between "H" and "e".
-        ic.mTextFieldValue = TextFieldValue(
-            text = "Hello, World",
-            selection = TextRange(1)
-        )
+        ic.mTextFieldValue = TextFieldValue(text = "Hello, World", selection = TextRange(1))
 
         assertThat(ic.getTextBeforeCursor(5, 0)).isEqualTo("H")
         assertThat(ic.getTextAfterCursor(5, 0)).isEqualTo("ello,")
 
         // Set "Hello, World", and place the cursor at the end of the text.
-        ic.mTextFieldValue = TextFieldValue(
-            text = "Hello, World",
-            selection = TextRange(12)
-        )
+        ic.mTextFieldValue = TextFieldValue(text = "Hello, World", selection = TextRange(12))
 
         assertThat(ic.getTextBeforeCursor(5, 0)).isEqualTo("World")
         assertThat(ic.getTextAfterCursor(5, 0)).isEqualTo("")
@@ -132,26 +115,17 @@
     @Test
     fun getSelectedTextTest() {
         // Set "Hello, World", and place the cursor at the beginning of the text.
-        ic.mTextFieldValue = TextFieldValue(
-            text = "Hello, World",
-            selection = TextRange.Zero
-        )
+        ic.mTextFieldValue = TextFieldValue(text = "Hello, World", selection = TextRange.Zero)
 
         assertThat(ic.getSelectedText(0)).isNull()
 
         // Set "Hello, World", and place the cursor between "H" and "e".
-        ic.mTextFieldValue = TextFieldValue(
-            text = "Hello, World",
-            selection = TextRange(0, 1)
-        )
+        ic.mTextFieldValue = TextFieldValue(text = "Hello, World", selection = TextRange(0, 1))
 
         assertThat(ic.getSelectedText(0)).isEqualTo("H")
 
         // Set "Hello, World", and place the cursor at the end of the text.
-        ic.mTextFieldValue = TextFieldValue(
-            text = "Hello, World",
-            selection = TextRange(0, 12)
-        )
+        ic.mTextFieldValue = TextFieldValue(text = "Hello, World", selection = TextRange(0, 12))
 
         assertThat(ic.getSelectedText(0)).isEqualTo("Hello, World")
     }
@@ -605,11 +579,12 @@
 
     @Test
     fun commitCorrection_returns_true_when_autoCorrect_is_on() {
-        val inputConnection = RecordingInputConnection(
-            initState = TextFieldValue(),
-            eventCallback = mCallback,
-            autoCorrect = true
-        )
+        val inputConnection =
+            RecordingInputConnection(
+                initState = TextFieldValue(),
+                eventCallback = mCallback,
+                autoCorrect = true
+            )
         val anyCorrectionInfo = CorrectionInfo(0, "", "")
 
         assertThat(inputConnection.commitCorrection(anyCorrectionInfo)).isTrue()
@@ -617,11 +592,12 @@
 
     @Test
     fun commitCorrection_returns_false_when_autoCorrect_is_off() {
-        val inputConnection = RecordingInputConnection(
-            initState = TextFieldValue(),
-            eventCallback = mCallback,
-            autoCorrect = false
-        )
+        val inputConnection =
+            RecordingInputConnection(
+                initState = TextFieldValue(),
+                eventCallback = mCallback,
+                autoCorrect = false
+            )
         val anyCorrectionInfo = CorrectionInfo(0, "", "")
 
         assertThat(inputConnection.commitCorrection(anyCorrectionInfo)).isFalse()
diff --git a/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/input/TextInputServiceAndroidCursorAnchorInfoTest.kt b/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/input/TextInputServiceAndroidCursorAnchorInfoTest.kt
index 408e93c..9489f0e 100644
--- a/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/input/TextInputServiceAndroidCursorAnchorInfoTest.kt
+++ b/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/input/TextInputServiceAndroidCursorAnchorInfoTest.kt
@@ -77,16 +77,17 @@
         Font(resId = R.font.sample_font, weight = FontWeight.Normal, style = FontStyle.Normal)
             .toFontFamily()
     private val rootPosition = Offset(1.2f, 3.4f)
-    private val positionCalculator = object : PositionCalculator {
-        override fun screenToLocal(positionOnScreen: Offset): Offset =
-            positionOnScreen - rootPosition
+    private val positionCalculator =
+        object : PositionCalculator {
+            override fun screenToLocal(positionOnScreen: Offset): Offset =
+                positionOnScreen - rootPosition
 
-        override fun localToScreen(localPosition: Offset): Offset = localPosition + rootPosition
+            override fun localToScreen(localPosition: Offset): Offset = localPosition + rootPosition
 
-        override fun localToScreen(localTransform: androidx.compose.ui.graphics.Matrix) {
-            localTransform.translate(rootPosition.x, rootPosition.y)
+            override fun localToScreen(localTransform: androidx.compose.ui.graphics.Matrix) {
+                localTransform.translate(rootPosition.x, rootPosition.y)
+            }
         }
-    }
 
     private lateinit var textInputService: TextInputServiceAndroid
     private lateinit var inputMethodManager: InputMethodManager
diff --git a/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/input/TextInputServiceAndroidEmojiTest.kt b/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/input/TextInputServiceAndroidEmojiTest.kt
index d66fd0b..46c06c1 100644
--- a/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/input/TextInputServiceAndroidEmojiTest.kt
+++ b/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/input/TextInputServiceAndroidEmojiTest.kt
@@ -56,12 +56,13 @@
         val inputMethodManager = mock<InputMethodManager>()
         // Choreographer must be retrieved on main thread.
         val choreographer = Espresso.onIdle { Choreographer.getInstance() }
-        val textInputService = TextInputServiceAndroid(
-            view,
-            positionCalculator,
-            inputMethodManager,
-            inputCommandProcessorExecutor = choreographer.asExecutor()
-        )
+        val textInputService =
+            TextInputServiceAndroid(
+                view,
+                positionCalculator,
+                inputMethodManager,
+                inputCommandProcessorExecutor = choreographer.asExecutor()
+            )
 
         textInputService.startInput(TextFieldValue(""), ImeOptions.Default, {}, {})
 
diff --git a/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/input/TextInputServiceAndroidOnStateUpdateTest.kt b/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/input/TextInputServiceAndroidOnStateUpdateTest.kt
index 1a2d45d..26f28b1 100644
--- a/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/input/TextInputServiceAndroidOnStateUpdateTest.kt
+++ b/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/input/TextInputServiceAndroidOnStateUpdateTest.kt
@@ -57,7 +57,8 @@
         // we never want the event queue to run during these test cases, as it will cause errant
         // interactions based off an uncontrolled frame clock (causes flakes)
         val neverExecutor = Executor { println("not running $it") }
-        textInputService = TextInputServiceAndroid(
+        textInputService =
+            TextInputServiceAndroid(
                 view,
                 mock(),
                 inputMethodManager,
@@ -69,17 +70,14 @@
             onEditCommand = {},
             onImeActionPerformed = {}
         )
-        inputConnection = textInputService.createInputConnection(EditorInfo())
-            as RecordingInputConnection
+        inputConnection =
+            textInputService.createInputConnection(EditorInfo()) as RecordingInputConnection
     }
 
     @Test
     fun onUpdateState_resetInputCalled_whenOnlyTextChanged() {
         val newValue = TextFieldValue("b")
-        textInputService.updateState(
-            oldValue = TextFieldValue("a"),
-            newValue = newValue
-        )
+        textInputService.updateState(oldValue = TextFieldValue("a"), newValue = newValue)
 
         verify(inputMethodManager, times(1)).restartInput()
         verify(inputMethodManager, never()).updateSelection(any(), any(), any(), any())
@@ -127,10 +125,7 @@
         // We still need to call IMM.updateSelection in this case, for more info please check:
         // https://developer.android.com/reference/android/view/inputmethod/InputMethodManager#updateSelection(android.view.View,%20int,%20int,%20int,%20int)
         val value = TextFieldValue("a", TextRange(1), null)
-        textInputService.updateState(
-            oldValue = value,
-            newValue = value
-        )
+        textInputService.updateState(oldValue = value, newValue = value)
 
         verify(inputMethodManager, never()).restartInput()
         verify(inputMethodManager, times(1)).updateSelection(any(), any(), any(), any())
@@ -143,10 +138,7 @@
     fun onUpdateState_updateSelectionCalled_whenCompositionIsDifferentFromState() {
         // set the initial state, composition active on text, cursor in the middle
         val value1 = TextFieldValue("ab", TextRange(1), TextRange(0, 2))
-        textInputService.updateState(
-            oldValue = value1,
-            newValue = value1
-        )
+        textInputService.updateState(oldValue = value1, newValue = value1)
 
         reset(inputMethodManager)
 
@@ -154,15 +146,11 @@
         // change and old and new values are the same. However they will be different than the
         // last stored TextFieldValue in TextInputService which is value1
         val value2 = value1.copy(composition = null)
-        textInputService.updateState(
-            oldValue = value2,
-            newValue = value2
-        )
+        textInputService.updateState(oldValue = value2, newValue = value2)
 
         verify(inputMethodManager, never()).restartInput()
-        verify(inputMethodManager, times(1)).updateSelection(
-            eq(value2.selection.min), eq(value2.selection.max), eq(-1), eq(-1)
-        )
+        verify(inputMethodManager, times(1))
+            .updateSelection(eq(value2.selection.min), eq(value2.selection.max), eq(-1), eq(-1))
     }
 
     @Test
@@ -183,10 +171,7 @@
     @Test
     fun onUpdateState_resetInputNotCalled_whenValuesAreSame() {
         val value = TextFieldValue("a")
-        textInputService.updateState(
-            oldValue = value,
-            newValue = value
-        )
+        textInputService.updateState(oldValue = value, newValue = value)
 
         verify(inputMethodManager, never()).restartInput()
         verify(inputMethodManager, never()).updateSelection(any(), any(), any(), any())
@@ -198,17 +183,14 @@
     @Test
     fun onUpdateState_recreateInputConnection_createsWithCorrectValue() {
         val value = TextFieldValue("a")
-        textInputService.updateState(
-            oldValue = value,
-            newValue = value
-        )
+        textInputService.updateState(oldValue = value, newValue = value)
 
         verify(inputMethodManager, never()).restartInput()
         verify(inputMethodManager, never()).updateSelection(any(), any(), any(), any())
 
         // recreate the connection
-        inputConnection = textInputService.createInputConnection(EditorInfo())
-            as RecordingInputConnection
+        inputConnection =
+            textInputService.createInputConnection(EditorInfo()) as RecordingInputConnection
 
         assertThat(inputConnection.mTextFieldValue).isEqualTo(value)
     }
diff --git a/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/input/focus/FocusAwareEventPropagationTest.kt b/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/input/focus/FocusAwareEventPropagationTest.kt
index 07764c7..523706a 100644
--- a/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/input/focus/FocusAwareEventPropagationTest.kt
+++ b/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/input/focus/FocusAwareEventPropagationTest.kt
@@ -53,19 +53,18 @@
 import org.junit.runner.RunWith
 import org.junit.runners.Parameterized
 
-/**
- * Focus-aware event propagation test.
- */
+/** Focus-aware event propagation test. */
 @MediumTest
 @RunWith(Parameterized::class)
 class FocusAwareEventPropagationTest(private val nodeType: NodeType) {
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
-    private val sentEvent: Any = when (nodeType) {
-        KeyInput, InterruptedSoftKeyboardInput -> KeyEvent(AndroidKeyEvent(ACTION_DOWN, KEYCODE_A))
-        RotaryInput -> RotaryScrollEvent(1f, 1f, 0L, 0)
-    }
+    private val sentEvent: Any =
+        when (nodeType) {
+            KeyInput,
+            InterruptedSoftKeyboardInput -> KeyEvent(AndroidKeyEvent(ACTION_DOWN, KEYCODE_A))
+            RotaryInput -> RotaryScrollEvent(1f, 1f, 0L, 0)
+        }
     private var receivedEvent: Any? = null
     private val initialFocus = FocusRequester()
 
@@ -86,10 +85,11 @@
         // Arrange.
         rule.setContent {
             Box(
-                modifier = Modifier.onFocusAwareEvent {
-                    receivedEvent = it
-                    true
-                }
+                modifier =
+                    Modifier.onFocusAwareEvent {
+                        receivedEvent = it
+                        true
+                    }
             )
         }
 
@@ -105,12 +105,12 @@
         // Arrange.
         rule.setFocusableContent {
             Box(
-                modifier = Modifier
-                    .onFocusAwareEvent {
-                        receivedEvent = it
-                        true
-                    }
-                    .focusable()
+                modifier =
+                    Modifier.onFocusAwareEvent {
+                            receivedEvent = it
+                            true
+                        }
+                        .focusable()
             )
         }
 
@@ -126,13 +126,11 @@
         // Arrange.
         rule.setContentWithInitialFocus {
             Box(
-                modifier = Modifier
-                    .focusable(initiallyFocused = true)
-                    .onFocusAwareEvent {
+                modifier =
+                    Modifier.focusable(initiallyFocused = true).onFocusAwareEvent {
                         receivedEvent = it
                         true
                     }
-
             )
         }
 
@@ -142,7 +140,8 @@
         // Assert.
         when (nodeType) {
             KeyInput -> assertThat(receivedEvent).isEqualTo(sentEvent)
-            InterruptedSoftKeyboardInput, RotaryInput -> assertThat(receivedEvent).isNull()
+            InterruptedSoftKeyboardInput,
+            RotaryInput -> assertThat(receivedEvent).isNull()
         }
     }
 
@@ -151,9 +150,8 @@
         // Arrange.
         rule.setContentWithInitialFocus {
             Box(
-                modifier = Modifier
-                    .focusable(initiallyFocused = true)
-                    .onPreFocusAwareEvent {
+                modifier =
+                    Modifier.focusable(initiallyFocused = true).onPreFocusAwareEvent {
                         receivedEvent = it
                         true
                     }
@@ -166,7 +164,8 @@
         // Assert.
         when (nodeType) {
             KeyInput -> assertThat(receivedEvent).isEqualTo(sentEvent)
-            InterruptedSoftKeyboardInput, RotaryInput -> assertThat(receivedEvent).isNull()
+            InterruptedSoftKeyboardInput,
+            RotaryInput -> assertThat(receivedEvent).isNull()
         }
     }
 
@@ -175,12 +174,12 @@
         // Arrange.
         rule.setContentWithInitialFocus {
             Box(
-                modifier = Modifier
-                    .onFocusAwareEvent {
-                        receivedEvent = it
-                        true
-                    }
-                    .focusable(initiallyFocused = true)
+                modifier =
+                    Modifier.onFocusAwareEvent {
+                            receivedEvent = it
+                            true
+                        }
+                        .focusable(initiallyFocused = true)
             )
         }
 
@@ -196,12 +195,12 @@
         // Arrange.
         rule.setContentWithInitialFocus {
             Box(
-                modifier = Modifier
-                    .onPreFocusAwareEvent {
-                        receivedEvent = it
-                        true
-                    }
-                    .focusable(initiallyFocused = true)
+                modifier =
+                    Modifier.onPreFocusAwareEvent {
+                            receivedEvent = it
+                            true
+                        }
+                        .focusable(initiallyFocused = true)
             )
         }
 
@@ -217,15 +216,13 @@
         // Arrange.
         rule.setContentWithInitialFocus {
             Box(
-                modifier = Modifier
-                    .onFocusAwareEvent {
-                        receivedEvent = it
-                        true
-                    }
-                    .onPreFocusAwareEvent {
-                        true
-                    }
-                    .focusable(initiallyFocused = true)
+                modifier =
+                    Modifier.onFocusAwareEvent {
+                            receivedEvent = it
+                            true
+                        }
+                        .onPreFocusAwareEvent { true }
+                        .focusable(initiallyFocused = true)
             )
         }
 
@@ -233,9 +230,7 @@
         rule.onRoot().performFocusAwareInput(sentEvent)
 
         // Assert.
-        rule.runOnIdle {
-            assertThat(receivedEvent).isNull()
-        }
+        rule.runOnIdle { assertThat(receivedEvent).isNull() }
     }
 
     @Test
@@ -243,15 +238,13 @@
         // Arrange.
         rule.setContentWithInitialFocus {
             Box(
-                modifier = Modifier
-                    .onPreFocusAwareEvent {
-                        true
-                    }
-                    .onFocusAwareEvent {
-                        receivedEvent = it
-                        true
-                    }
-                    .focusable(initiallyFocused = true)
+                modifier =
+                    Modifier.onPreFocusAwareEvent { true }
+                        .onFocusAwareEvent {
+                            receivedEvent = it
+                            true
+                        }
+                        .focusable(initiallyFocused = true)
             )
         }
 
@@ -259,9 +252,7 @@
         rule.onRoot().performFocusAwareInput(sentEvent)
 
         // Assert.
-        rule.runOnIdle {
-            assertThat(receivedEvent).isNull()
-        }
+        rule.runOnIdle { assertThat(receivedEvent).isNull() }
     }
 
     @Test
@@ -272,16 +263,16 @@
         var onPreFocusAwareEventTrigger = 0
         rule.setContentWithInitialFocus {
             Box(
-                modifier = Modifier
-                    .onFocusAwareEvent {
-                        onFocusAwareEventTrigger = triggerIndex++
-                        true
-                    }
-                    .onPreFocusAwareEvent {
-                        onPreFocusAwareEventTrigger = triggerIndex++
-                        false
-                    }
-                    .focusable(initiallyFocused = true)
+                modifier =
+                    Modifier.onFocusAwareEvent {
+                            onFocusAwareEventTrigger = triggerIndex++
+                            true
+                        }
+                        .onPreFocusAwareEvent {
+                            onPreFocusAwareEventTrigger = triggerIndex++
+                            false
+                        }
+                        .focusable(initiallyFocused = true)
             )
         }
 
@@ -303,16 +294,16 @@
         var onPreFocusAwareEventTrigger = 0
         rule.setContentWithInitialFocus {
             Box(
-                modifier = Modifier
-                    .onPreFocusAwareEvent {
-                        onPreFocusAwareEventTrigger = triggerIndex++
-                        false
-                    }
-                    .onFocusAwareEvent {
-                        onFocusAwareEventTrigger = triggerIndex++
-                        true
-                    }
-                    .focusable(initiallyFocused = true)
+                modifier =
+                    Modifier.onPreFocusAwareEvent {
+                            onPreFocusAwareEventTrigger = triggerIndex++
+                            false
+                        }
+                        .onFocusAwareEvent {
+                            onFocusAwareEventTrigger = triggerIndex++
+                            true
+                        }
+                        .focusable(initiallyFocused = true)
             )
         }
 
@@ -336,28 +327,28 @@
         var childOnPreFocusAwareEventTrigger = 0
         rule.setContentWithInitialFocus {
             Box(
-                modifier = Modifier
-                    .onFocusAwareEvent {
-                        parentOnFocusAwareEventTrigger = triggerIndex++
-                        false
-                    }
-                    .onPreFocusAwareEvent {
-                        parentOnPreFocusAwareEventTrigger = triggerIndex++
-                        false
-                    }
-                    .focusable()
-            ) {
-                Box(
-                    modifier = Modifier
-                        .onFocusAwareEvent {
-                            childOnFocusAwareEventTrigger = triggerIndex++
+                modifier =
+                    Modifier.onFocusAwareEvent {
+                            parentOnFocusAwareEventTrigger = triggerIndex++
                             false
                         }
                         .onPreFocusAwareEvent {
-                            childOnPreFocusAwareEventTrigger = triggerIndex++
+                            parentOnPreFocusAwareEventTrigger = triggerIndex++
                             false
                         }
-                        .focusable(initiallyFocused = true)
+                        .focusable()
+            ) {
+                Box(
+                    modifier =
+                        Modifier.onFocusAwareEvent {
+                                childOnFocusAwareEventTrigger = triggerIndex++
+                                false
+                            }
+                            .onPreFocusAwareEvent {
+                                childOnPreFocusAwareEventTrigger = triggerIndex++
+                                false
+                            }
+                            .focusable(initiallyFocused = true)
                 )
             }
         }
@@ -384,27 +375,27 @@
         var childOnPreFocusAwareEventTrigger = 0
         rule.setContentWithInitialFocus {
             Box(
-                modifier = Modifier
-                    .onFocusAwareEvent {
-                        parentOnFocusAwareEventTrigger = triggerIndex++
-                        false
-                    }
-                    .onPreFocusAwareEvent {
-                        parentOnPreFocusAwareEventTrigger = triggerIndex++
-                        false
-                    }
-            ) {
-                Box(
-                    modifier = Modifier
-                        .onFocusAwareEvent {
-                            childOnFocusAwareEventTrigger = triggerIndex++
+                modifier =
+                    Modifier.onFocusAwareEvent {
+                            parentOnFocusAwareEventTrigger = triggerIndex++
                             false
                         }
                         .onPreFocusAwareEvent {
-                            childOnPreFocusAwareEventTrigger = triggerIndex++
+                            parentOnPreFocusAwareEventTrigger = triggerIndex++
                             false
                         }
-                        .focusable(initiallyFocused = true)
+            ) {
+                Box(
+                    modifier =
+                        Modifier.onFocusAwareEvent {
+                                childOnFocusAwareEventTrigger = triggerIndex++
+                                false
+                            }
+                            .onPreFocusAwareEvent {
+                                childOnPreFocusAwareEventTrigger = triggerIndex++
+                                false
+                            }
+                            .focusable(initiallyFocused = true)
                 )
             }
         }
@@ -433,40 +424,40 @@
         var childOnPreFocusAwareEventTrigger = 0
         rule.setContentWithInitialFocus {
             Box(
-                modifier = Modifier
-                    .onFocusAwareEvent {
-                        grandParentOnFocusAwareEventTrigger = triggerIndex++
-                        false
-                    }
-                    .onPreFocusAwareEvent {
-                        grandParentOnPreFocusAwareEventTrigger = triggerIndex++
-                        false
-                    }
-                    .focusable()
-            ) {
-                Box(
-                    modifier = Modifier
-                        .onFocusAwareEvent {
-                            parentOnFocusAwareEventTrigger = triggerIndex++
+                modifier =
+                    Modifier.onFocusAwareEvent {
+                            grandParentOnFocusAwareEventTrigger = triggerIndex++
                             false
                         }
                         .onPreFocusAwareEvent {
-                            parentOnPreFocusAwareEventTrigger = triggerIndex++
+                            grandParentOnPreFocusAwareEventTrigger = triggerIndex++
                             false
                         }
                         .focusable()
-                ) {
-                    Box(
-                        modifier = Modifier
-                            .onFocusAwareEvent {
-                                childOnFocusAwareEventTrigger = triggerIndex++
+            ) {
+                Box(
+                    modifier =
+                        Modifier.onFocusAwareEvent {
+                                parentOnFocusAwareEventTrigger = triggerIndex++
                                 false
                             }
                             .onPreFocusAwareEvent {
-                                childOnPreFocusAwareEventTrigger = triggerIndex++
+                                parentOnPreFocusAwareEventTrigger = triggerIndex++
                                 false
                             }
-                            .focusable(initiallyFocused = true)
+                            .focusable()
+                ) {
+                    Box(
+                        modifier =
+                            Modifier.onFocusAwareEvent {
+                                    childOnFocusAwareEventTrigger = triggerIndex++
+                                    false
+                                }
+                                .onPreFocusAwareEvent {
+                                    childOnPreFocusAwareEventTrigger = triggerIndex++
+                                    false
+                                }
+                                .focusable(initiallyFocused = true)
                     )
                 }
             }
@@ -486,13 +477,14 @@
         }
     }
 
-    private fun Modifier.focusable(initiallyFocused: Boolean = false) = this
-        .then(if (initiallyFocused) Modifier.focusRequester(initialFocus) else Modifier)
-        .focusTarget()
+    private fun Modifier.focusable(initiallyFocused: Boolean = false) =
+        this.then(if (initiallyFocused) Modifier.focusRequester(initialFocus) else Modifier)
+            .focusTarget()
 
     private fun SemanticsNodeInteraction.performFocusAwareInput(sentEvent: Any) {
         when (nodeType) {
-            KeyInput, InterruptedSoftKeyboardInput -> {
+            KeyInput,
+            InterruptedSoftKeyboardInput -> {
                 check(sentEvent is KeyEvent)
                 performKeyPress(sentEvent)
             }
@@ -512,18 +504,24 @@
     }
 
     @OptIn(ExperimentalComposeUiApi::class)
-    private fun Modifier.onFocusAwareEvent(onEvent: (Any) -> Boolean): Modifier = when (nodeType) {
-        KeyInput -> onKeyEvent(onEvent)
-        InterruptedSoftKeyboardInput -> onInterceptKeyBeforeSoftKeyboard(onEvent)
-        RotaryInput -> onRotaryScrollEvent(onEvent)
-    }
+    private fun Modifier.onFocusAwareEvent(onEvent: (Any) -> Boolean): Modifier =
+        when (nodeType) {
+            KeyInput -> onKeyEvent(onEvent)
+            InterruptedSoftKeyboardInput -> onInterceptKeyBeforeSoftKeyboard(onEvent)
+            RotaryInput -> onRotaryScrollEvent(onEvent)
+        }
 
     @OptIn(ExperimentalComposeUiApi::class)
-    private fun Modifier.onPreFocusAwareEvent(onPreEvent: (Any) -> Boolean) = when (nodeType) {
-        KeyInput -> onPreviewKeyEvent(onPreEvent)
-        InterruptedSoftKeyboardInput -> onPreInterceptKeyBeforeSoftKeyboard(onPreEvent)
-        RotaryInput -> onPreRotaryScrollEvent(onPreEvent)
-    }
+    private fun Modifier.onPreFocusAwareEvent(onPreEvent: (Any) -> Boolean) =
+        when (nodeType) {
+            KeyInput -> onPreviewKeyEvent(onPreEvent)
+            InterruptedSoftKeyboardInput -> onPreInterceptKeyBeforeSoftKeyboard(onPreEvent)
+            RotaryInput -> onPreRotaryScrollEvent(onPreEvent)
+        }
 
-    enum class NodeType { KeyInput, InterruptedSoftKeyboardInput, RotaryInput }
+    enum class NodeType {
+        KeyInput,
+        InterruptedSoftKeyboardInput,
+        RotaryInput
+    }
 }
diff --git a/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/input/key/AndroidProcessKeyInputTest.kt b/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/input/key/AndroidProcessKeyInputTest.kt
index bc0b639..0b8e7ab 100644
--- a/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/input/key/AndroidProcessKeyInputTest.kt
+++ b/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/input/key/AndroidProcessKeyInputTest.kt
@@ -46,16 +46,12 @@
 @SmallTest
 @RunWith(Parameterized::class)
 class AndroidProcessKeyInputTest(private val keyEventActions: List<Int>) {
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
     companion object {
         @JvmStatic
         @Parameterized.Parameters(name = "keyEventAction = {0}")
-        fun initParameters() = listOf(
-            listOf(ActionDown),
-            listOf(ActionDown, ActionUp)
-        )
+        fun initParameters() = listOf(listOf(ActionDown), listOf(ActionDown, ActionUp))
     }
 
     @Test
@@ -67,18 +63,14 @@
         rule.setFocusableContent {
             ownerView = LocalView.current
             Box(
-                modifier = Modifier
-                    .focusRequester(focusRequester)
-                    .focusTarget()
-                    .onKeyEvent {
+                modifier =
+                    Modifier.focusRequester(focusRequester).focusTarget().onKeyEvent {
                         receivedKeyEvent = it
                         true
                     }
             )
         }
-        rule.runOnIdle {
-            focusRequester.requestFocus()
-        }
+        rule.runOnIdle { focusRequester.requestFocus() }
 
         // Act.
         var lastKeyConsumed = false
@@ -95,13 +87,14 @@
         // Assert.
         rule.runOnIdle {
             val keyEvent = checkNotNull(receivedKeyEvent)
-            assertThat(keyEvent.type).isEqualTo(
-                when (keyEventActions.last()) {
-                    ActionUp -> KeyUp
-                    ActionDown -> KeyDown
-                    else -> error("No tests for this key action.")
-                }
-            )
+            assertThat(keyEvent.type)
+                .isEqualTo(
+                    when (keyEventActions.last()) {
+                        ActionUp -> KeyUp
+                        ActionDown -> KeyDown
+                        else -> error("No tests for this key action.")
+                    }
+                )
             assertThat(keyEvent.key).isEqualTo(A)
             assertThat(lastKeyConsumed).isTrue()
         }
diff --git a/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/input/key/HardwareKeyInputTest.kt b/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/input/key/HardwareKeyInputTest.kt
index 5308894..66655fc 100644
--- a/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/input/key/HardwareKeyInputTest.kt
+++ b/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/input/key/HardwareKeyInputTest.kt
@@ -48,8 +48,7 @@
 @RunWith(AndroidJUnit4::class)
 @OptIn(ExperimentalComposeUiApi::class)
 class HardwareKeyInputTest {
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
     val initialFocus = FocusRequester()
 
@@ -59,8 +58,7 @@
         var receivedKeyEvent: KeyEvent? = null
         rule.setContentWithInitialFocus {
             Box(
-                Modifier
-                    .onInterceptKeyBeforeSoftKeyboard {
+                Modifier.onInterceptKeyBeforeSoftKeyboard {
                         receivedKeyEvent = it
                         true
                     }
@@ -87,8 +85,7 @@
         var receivedKeyEvent: KeyEvent? = null
         rule.setContentWithInitialFocus {
             Box(
-                Modifier
-                    .onPreInterceptKeyBeforeSoftKeyboard {
+                Modifier.onPreInterceptKeyBeforeSoftKeyboard {
                         receivedKeyEvent = it
                         true
                     }
@@ -116,8 +113,7 @@
         var receivedKeyEvent: KeyEvent? = null
         rule.setContentWithInitialFocus {
             Box(
-                Modifier
-                    .onInterceptKeyBeforeSoftKeyboard {
+                Modifier.onInterceptKeyBeforeSoftKeyboard {
                         receivedKeyEvent = it
                         true
                     }
@@ -152,8 +148,7 @@
         var onInterceptedPreKeyEventTrigger = 0
         rule.setContentWithInitialFocus {
             Box(
-                Modifier
-                    .onInterceptKeyBeforeSoftKeyboard {
+                Modifier.onInterceptKeyBeforeSoftKeyboard {
                         onInterceptedKeyEventTrigger = triggerIndex++
                         true
                     }
@@ -186,8 +181,7 @@
         var onPreviewKeyEventTrigger = 0
         rule.setContentWithInitialFocus {
             Box(
-                Modifier
-                    .onKeyEvent {
+                Modifier.onKeyEvent {
                         onKeyEventTrigger = triggerIndex++
                         false
                     }
@@ -234,8 +228,7 @@
         var onPreKeyEventParentTrigger = 0
         rule.setContentWithInitialFocus {
             Box(
-                Modifier
-                    .onKeyEvent {
+                Modifier.onKeyEvent {
                         onKeyEventParentTrigger = triggerIndex++
                         false
                     }
@@ -253,8 +246,7 @@
                     }
             ) {
                 Box(
-                    Modifier
-                        .onKeyEvent {
+                    Modifier.onKeyEvent {
                             onKeyEventChildTrigger = triggerIndex++
                             false
                         }
@@ -293,12 +285,8 @@
     }
 
     private fun ComposeContentTestRule.setContentWithInitialFocus(content: @Composable () -> Unit) {
-        setFocusableContent {
-            Box(modifier = Modifier.requiredSize(100.dp, 100.dp)) { content() }
-        }
-        runOnIdle {
-            initialFocus.requestFocus()
-        }
+        setFocusableContent { Box(modifier = Modifier.requiredSize(100.dp, 100.dp)) { content() } }
+        runOnIdle { initialFocus.requestFocus() }
     }
 
     /**
@@ -306,11 +294,12 @@
      * [KeyEvent] that can be used in tests.
      */
     private fun keyEvent(keycode: Int, keyEventType: KeyEventType): KeyEvent {
-        val action = when (keyEventType) {
-            KeyDown -> ACTION_DOWN
-            KeyUp -> ACTION_UP
-            else -> error("Unknown key event type")
-        }
+        val action =
+            when (keyEventType) {
+                KeyDown -> ACTION_DOWN
+                KeyUp -> ACTION_UP
+                else -> error("Unknown key event type")
+            }
         return KeyEvent(AndroidKeyEvent(0L, 0L, action, keycode, 0, 0))
     }
 }
diff --git a/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/input/key/ProcessKeyInputTest.kt b/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/input/key/ProcessKeyInputTest.kt
index f87436d..0905e03 100644
--- a/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/input/key/ProcessKeyInputTest.kt
+++ b/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/input/key/ProcessKeyInputTest.kt
@@ -45,8 +45,7 @@
 @MediumTest
 @RunWith(AndroidJUnit4::class)
 class ProcessKeyInputTest {
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
     @Test
     fun noFocusTarget_doesNotTriggerOnKeyEvent() {
@@ -74,12 +73,10 @@
         var receivedKeyEvent: KeyEvent? = null
         rule.setFocusableContent {
             Box(
-                Modifier
-                    .focusTarget()
-                    .onKeyEvent {
-                        receivedKeyEvent = it
-                        true
-                    }
+                Modifier.focusTarget().onKeyEvent {
+                    receivedKeyEvent = it
+                    true
+                }
             )
         }
 
@@ -97,18 +94,14 @@
         var receivedKeyEvent: KeyEvent? = null
         rule.setFocusableContent {
             Box(
-                modifier = Modifier
-                    .focusRequester(focusRequester)
-                    .focusTarget()
-                    .onKeyEvent {
+                modifier =
+                    Modifier.focusRequester(focusRequester).focusTarget().onKeyEvent {
                         receivedKeyEvent = it
                         true
                     }
             )
         }
-        rule.runOnIdle {
-            focusRequester.requestFocus()
-        }
+        rule.runOnIdle { focusRequester.requestFocus() }
 
         // Act.
         val keyConsumed = rule.onRoot().performKeyPress(keyEvent(KeyCodeA, KeyDown))
@@ -129,18 +122,14 @@
         var receivedKeyEvent: KeyEvent? = null
         rule.setFocusableContent {
             Box(
-                modifier = Modifier
-                    .focusRequester(focusRequester)
-                    .focusTarget()
-                    .onKeyEvent {
+                modifier =
+                    Modifier.focusRequester(focusRequester).focusTarget().onKeyEvent {
                         receivedKeyEvent = it
                         true
                     }
             )
         }
-        rule.runOnIdle {
-            focusRequester.requestFocus()
-        }
+        rule.runOnIdle { focusRequester.requestFocus() }
 
         // Act.
         rule.onRoot().performKeyPress(keyEvent(KeyCodeA, KeyDown))
@@ -162,18 +151,14 @@
         var receivedKeyEvent: KeyEvent? = null
         rule.setFocusableContent {
             Box(
-                modifier = Modifier
-                    .focusRequester(focusRequester)
-                    .focusTarget()
-                    .onPreviewKeyEvent {
+                modifier =
+                    Modifier.focusRequester(focusRequester).focusTarget().onPreviewKeyEvent {
                         receivedKeyEvent = it
                         true
                     }
             )
         }
-        rule.runOnIdle {
-            focusRequester.requestFocus()
-        }
+        rule.runOnIdle { focusRequester.requestFocus() }
 
         // Act.
         val keyConsumed = rule.onRoot().performKeyPress(keyEvent(KeyCodeA, KeyDown))
@@ -194,18 +179,14 @@
         var receivedKeyEvent: KeyEvent? = null
         rule.setFocusableContent {
             Box(
-                modifier = Modifier
-                    .focusRequester(focusRequester)
-                    .focusTarget()
-                    .onPreviewKeyEvent {
+                modifier =
+                    Modifier.focusRequester(focusRequester).focusTarget().onPreviewKeyEvent {
                         receivedKeyEvent = it
                         true
                     }
             )
         }
-        rule.runOnIdle {
-            focusRequester.requestFocus()
-        }
+        rule.runOnIdle { focusRequester.requestFocus() }
 
         // Act.
         rule.onRoot().performKeyPress(keyEvent(KeyCodeA, KeyDown))
@@ -228,22 +209,20 @@
         var receivedKeyEvent: KeyEvent? = null
         rule.setFocusableContent {
             Box(
-                modifier = Modifier
-                    .focusRequester(focusRequester)
-                    .focusTarget()
-                    .onKeyEvent {
-                        receivedKeyEvent = it
-                        true
-                    }
-                    .onPreviewKeyEvent {
-                        receivedPreviewKeyEvent = it
-                        true
-                    }
+                modifier =
+                    Modifier.focusRequester(focusRequester)
+                        .focusTarget()
+                        .onKeyEvent {
+                            receivedKeyEvent = it
+                            true
+                        }
+                        .onPreviewKeyEvent {
+                            receivedPreviewKeyEvent = it
+                            true
+                        }
             )
         }
-        rule.runOnIdle {
-            focusRequester.requestFocus()
-        }
+        rule.runOnIdle { focusRequester.requestFocus() }
 
         // Act.
         rule.onRoot().performKeyPress(keyEvent(KeyCodeA, KeyDown))
@@ -265,22 +244,20 @@
         var onPreviewKeyEventTrigger = 0
         rule.setFocusableContent {
             Box(
-                modifier = Modifier
-                    .focusRequester(focusRequester)
-                    .focusTarget()
-                    .onKeyEvent {
-                        onKeyEventTrigger = triggerIndex++
-                        true
-                    }
-                    .onPreviewKeyEvent {
-                        onPreviewKeyEventTrigger = triggerIndex++
-                        false
-                    }
+                modifier =
+                    Modifier.focusRequester(focusRequester)
+                        .focusTarget()
+                        .onKeyEvent {
+                            onKeyEventTrigger = triggerIndex++
+                            true
+                        }
+                        .onPreviewKeyEvent {
+                            onPreviewKeyEventTrigger = triggerIndex++
+                            false
+                        }
             )
         }
-        rule.runOnIdle {
-            focusRequester.requestFocus()
-        }
+        rule.runOnIdle { focusRequester.requestFocus() }
 
         // Act.
         rule.onRoot().performKeyPress(keyEvent(KeyCodeA, KeyDown))
@@ -298,18 +275,17 @@
         val focusRequester = FocusRequester()
         var keyEventFromOnKeyEvent1: KeyEvent? = null
         var keyEventFromOnKeyEvent2: KeyEvent? = null
-        var onKeyEvent: (event: KeyEvent) -> Boolean by mutableStateOf(
-            value = {
-                keyEventFromOnKeyEvent1 = it
-                true
-            }
-        )
+        var onKeyEvent: (event: KeyEvent) -> Boolean by
+            mutableStateOf(
+                value = {
+                    keyEventFromOnKeyEvent1 = it
+                    true
+                }
+            )
         rule.setFocusableContent {
             Box(
-                modifier = Modifier
-                    .focusRequester(focusRequester)
-                    .onKeyEvent(onKeyEvent)
-                    .focusTarget()
+                modifier =
+                    Modifier.focusRequester(focusRequester).onKeyEvent(onKeyEvent).focusTarget()
             )
         }
         rule.runOnIdle { focusRequester.requestFocus() }
@@ -336,18 +312,19 @@
         val focusRequester = FocusRequester()
         var keyEventFromOnPreviewKeyEvent1: KeyEvent? = null
         var keyEventFromOnPreviewKeyEvent2: KeyEvent? = null
-        var onPreviewKeyEvent: (event: KeyEvent) -> Boolean by mutableStateOf(
-            value = {
-                keyEventFromOnPreviewKeyEvent1 = it
-                true
-            }
-        )
+        var onPreviewKeyEvent: (event: KeyEvent) -> Boolean by
+            mutableStateOf(
+                value = {
+                    keyEventFromOnPreviewKeyEvent1 = it
+                    true
+                }
+            )
         rule.setFocusableContent {
             Box(
-                modifier = Modifier
-                    .focusRequester(focusRequester)
-                    .onPreviewKeyEvent(onPreviewKeyEvent)
-                    .focusTarget()
+                modifier =
+                    Modifier.focusRequester(focusRequester)
+                        .onPreviewKeyEvent(onPreviewKeyEvent)
+                        .focusTarget()
             )
         }
         rule.runOnIdle { focusRequester.requestFocus() }
@@ -379,35 +356,33 @@
         var childOnPreviewKeyEventTrigger = 0
         rule.setFocusableContent {
             Box(
-                modifier = Modifier
-                    .focusTarget()
-                    .onKeyEvent {
-                        parentOnKeyEventTrigger = triggerIndex++
-                        false
-                    }
-                    .onPreviewKeyEvent {
-                        parentOnPreviewKeyEventTrigger = triggerIndex++
-                        false
-                    }
-            ) {
-                Box(
-                    modifier = Modifier
-                        .focusRequester(focusRequester)
-                        .focusTarget()
+                modifier =
+                    Modifier.focusTarget()
                         .onKeyEvent {
-                            childOnKeyEventTrigger = triggerIndex++
+                            parentOnKeyEventTrigger = triggerIndex++
                             false
                         }
                         .onPreviewKeyEvent {
-                            childOnPreviewKeyEventTrigger = triggerIndex++
+                            parentOnPreviewKeyEventTrigger = triggerIndex++
                             false
                         }
+            ) {
+                Box(
+                    modifier =
+                        Modifier.focusRequester(focusRequester)
+                            .focusTarget()
+                            .onKeyEvent {
+                                childOnKeyEventTrigger = triggerIndex++
+                                false
+                            }
+                            .onPreviewKeyEvent {
+                                childOnPreviewKeyEventTrigger = triggerIndex++
+                                false
+                            }
                 )
             }
         }
-        rule.runOnIdle {
-            focusRequester.requestFocus()
-        }
+        rule.runOnIdle { focusRequester.requestFocus() }
 
         // Act.
         rule.onRoot().performKeyPress(keyEvent(KeyCodeA, KeyDown))
@@ -432,34 +407,32 @@
         var childOnPreviewKeyEventTrigger = 0
         rule.setFocusableContent {
             Box(
-                modifier = Modifier
-                    .onKeyEvent {
-                        parentOnKeyEventTrigger = triggerIndex++
-                        false
-                    }
-                    .onPreviewKeyEvent {
-                        parentOnPreviewKeyEventTrigger = triggerIndex++
-                        false
-                    }
-            ) {
-                Box(
-                    modifier = Modifier
-                        .focusRequester(focusRequester)
-                        .focusTarget()
-                        .onKeyEvent {
-                            childOnKeyEventTrigger = triggerIndex++
+                modifier =
+                    Modifier.onKeyEvent {
+                            parentOnKeyEventTrigger = triggerIndex++
                             false
                         }
                         .onPreviewKeyEvent {
-                            childOnPreviewKeyEventTrigger = triggerIndex++
+                            parentOnPreviewKeyEventTrigger = triggerIndex++
                             false
                         }
+            ) {
+                Box(
+                    modifier =
+                        Modifier.focusRequester(focusRequester)
+                            .focusTarget()
+                            .onKeyEvent {
+                                childOnKeyEventTrigger = triggerIndex++
+                                false
+                            }
+                            .onPreviewKeyEvent {
+                                childOnPreviewKeyEventTrigger = triggerIndex++
+                                false
+                            }
                 )
             }
         }
-        rule.runOnIdle {
-            focusRequester.requestFocus()
-        }
+        rule.runOnIdle { focusRequester.requestFocus() }
 
         // Act.
         rule.onRoot().performKeyPress(keyEvent(KeyCodeA, KeyDown))
@@ -482,26 +455,20 @@
         var parentOnPreviewKeyEventTrigger = 0
         rule.setFocusableContent {
             Box(
-                modifier = Modifier
-                    .onKeyEvent {
-                        parentOnKeyEventTrigger = triggerIndex++
-                        false
-                    }
-                    .onPreviewKeyEvent {
-                        parentOnPreviewKeyEventTrigger = triggerIndex++
-                        false
-                    }
+                modifier =
+                    Modifier.onKeyEvent {
+                            parentOnKeyEventTrigger = triggerIndex++
+                            false
+                        }
+                        .onPreviewKeyEvent {
+                            parentOnPreviewKeyEventTrigger = triggerIndex++
+                            false
+                        }
             ) {
-                Box(
-                    modifier = Modifier
-                        .focusRequester(focusRequester)
-                        .focusTarget()
-                )
+                Box(modifier = Modifier.focusRequester(focusRequester).focusTarget())
             }
         }
-        rule.runOnIdle {
-            focusRequester.requestFocus()
-        }
+        rule.runOnIdle { focusRequester.requestFocus() }
 
         // Act.
         rule.onRoot().performKeyPress(keyEvent(KeyCodeA, KeyDown))
@@ -526,48 +493,46 @@
         var childOnPreviewKeyEventTrigger = 0
         rule.setFocusableContent {
             Box(
-                modifier = Modifier
-                    .focusTarget()
-                    .onKeyEvent {
-                        grandParentOnKeyEventTrigger = triggerIndex++
-                        false
-                    }
-                    .onPreviewKeyEvent {
-                        grandParentOnPreviewKeyEventTrigger = triggerIndex++
-                        false
-                    }
-            ) {
-                Box(
-                    modifier = Modifier
-                        .focusTarget()
+                modifier =
+                    Modifier.focusTarget()
                         .onKeyEvent {
-                            parentOnKeyEventTrigger = triggerIndex++
+                            grandParentOnKeyEventTrigger = triggerIndex++
                             false
                         }
                         .onPreviewKeyEvent {
-                            parentOnPreviewKeyEventTrigger = triggerIndex++
+                            grandParentOnPreviewKeyEventTrigger = triggerIndex++
                             false
                         }
-                ) {
-                    Box(
-                        modifier = Modifier
-                            .focusRequester(focusRequester)
-                            .focusTarget()
+            ) {
+                Box(
+                    modifier =
+                        Modifier.focusTarget()
                             .onKeyEvent {
-                                childOnKeyEventTrigger = triggerIndex++
+                                parentOnKeyEventTrigger = triggerIndex++
                                 false
                             }
                             .onPreviewKeyEvent {
-                                childOnPreviewKeyEventTrigger = triggerIndex++
+                                parentOnPreviewKeyEventTrigger = triggerIndex++
                                 false
                             }
+                ) {
+                    Box(
+                        modifier =
+                            Modifier.focusRequester(focusRequester)
+                                .focusTarget()
+                                .onKeyEvent {
+                                    childOnKeyEventTrigger = triggerIndex++
+                                    false
+                                }
+                                .onPreviewKeyEvent {
+                                    childOnPreviewKeyEventTrigger = triggerIndex++
+                                    false
+                                }
                     )
                 }
             }
         }
-        rule.runOnIdle {
-            focusRequester.requestFocus()
-        }
+        rule.runOnIdle { focusRequester.requestFocus() }
 
         // Act.
         rule.onRoot().performKeyPress(keyEvent(KeyCodeA, KeyDown))
@@ -590,26 +555,20 @@
         var receivedKeyEvent: KeyEvent? = null
         rule.setFocusableContent {
             Box(
-                modifier = Modifier
-                    .focusRequester(focusRequester)
-                    .focusTarget()
-                    .onPreviewKeyEvent {
+                modifier =
+                    Modifier.focusRequester(focusRequester).focusTarget().onPreviewKeyEvent {
                         receivedKeyEvent = it
                         true
                     }
             )
         }
-        rule.runOnIdle {
-            focusRequester.requestFocus()
-        }
+        rule.runOnIdle { focusRequester.requestFocus() }
 
         // Act.
         rule.onRoot().performKeyPress(keyEvent(KeyCodeA, KeyUp))
 
         // Assert.
-        rule.runOnIdle {
-            assertThat(receivedKeyEvent).isNull()
-        }
+        rule.runOnIdle { assertThat(receivedKeyEvent).isNull() }
     }
 
     @Test
@@ -619,26 +578,20 @@
         var receivedKeyEvent: KeyEvent? = null
         rule.setFocusableContent {
             Box(
-                modifier = Modifier
-                    .focusRequester(focusRequester)
-                    .focusTarget()
-                    .onKeyEvent {
+                modifier =
+                    Modifier.focusRequester(focusRequester).focusTarget().onKeyEvent {
                         receivedKeyEvent = it
                         true
                     }
             )
         }
-        rule.runOnIdle {
-            focusRequester.requestFocus()
-        }
+        rule.runOnIdle { focusRequester.requestFocus() }
 
         // Act.
         rule.onRoot().performKeyPress(keyEvent(KeyCodeA, KeyUp))
 
         // Assert.
-        rule.runOnIdle {
-            assertThat(receivedKeyEvent).isNull()
-        }
+        rule.runOnIdle { assertThat(receivedKeyEvent).isNull() }
     }
 
     @Test
@@ -648,21 +601,16 @@
         var receivedKeyEvent: KeyEvent? = null
         rule.setFocusableContent {
             Box(
-                modifier = Modifier
-                    .focusRequester(focusRequester)
-                    .focusTarget()
-                    .onKeyEvent {
+                modifier =
+                    Modifier.focusRequester(focusRequester).focusTarget().onKeyEvent {
                         receivedKeyEvent = it
                         true
                     }
             )
         }
-        rule.runOnIdle {
-            focusRequester.requestFocus()
-        }
-        val event = KeyEvent(
-            AndroidKeyEvent(0L, 0L, /*action=*/ Int.MAX_VALUE - 1, KeyCodeA, 0, 0)
-        )
+        rule.runOnIdle { focusRequester.requestFocus() }
+        val event =
+            KeyEvent(AndroidKeyEvent(0L, 0L, /* action= */ Int.MAX_VALUE - 1, KeyCodeA, 0, 0))
 
         // Act.
         val keyConsumed = rule.onRoot().performKeyPress(event)
@@ -684,11 +632,12 @@
         @Suppress("SameParameterValue") keycode: Int,
         keyEventType: KeyEventType
     ): KeyEvent {
-        val action = when (keyEventType) {
-            KeyDown -> ACTION_DOWN
-            KeyUp -> ACTION_UP
-            else -> error("Unknown key event type")
-        }
+        val action =
+            when (keyEventType) {
+                KeyDown -> ACTION_DOWN
+                KeyUp -> ACTION_UP
+                else -> error("Unknown key event type")
+            }
         return KeyEvent(AndroidKeyEvent(0L, 0L, action, keycode, 0, 0))
     }
 }
diff --git a/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/input/nestedscroll/NestedScrollModifierTest.kt b/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/input/nestedscroll/NestedScrollModifierTest.kt
index f5f45b3..f98a785 100644
--- a/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/input/nestedscroll/NestedScrollModifierTest.kt
+++ b/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/input/nestedscroll/NestedScrollModifierTest.kt
@@ -64,8 +64,7 @@
 @RunWith(AndroidJUnit4::class)
 @MediumTest
 class NestedScrollModifierTest {
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
     private val mainLayoutTag = "mainLayout"
 
@@ -80,44 +79,43 @@
     fun nestedScroll_twoNodes_orderTest(): Unit = runBlocking {
         var counter = 0
         val childConnection = object : NestedScrollConnection {}
-        val parentConnection = object : NestedScrollConnection {
-            override fun onPreScroll(available: Offset, source: NestedScrollSource): Offset {
-                assertThat(counter).isEqualTo(1)
-                counter++
-                return Offset.Zero
-            }
+        val parentConnection =
+            object : NestedScrollConnection {
+                override fun onPreScroll(available: Offset, source: NestedScrollSource): Offset {
+                    assertThat(counter).isEqualTo(1)
+                    counter++
+                    return Offset.Zero
+                }
 
-            override fun onPostScroll(
-                consumed: Offset,
-                available: Offset,
-                source: NestedScrollSource
-            ): Offset {
-                assertThat(counter).isEqualTo(3)
-                counter++
-                return Offset.Zero
-            }
+                override fun onPostScroll(
+                    consumed: Offset,
+                    available: Offset,
+                    source: NestedScrollSource
+                ): Offset {
+                    assertThat(counter).isEqualTo(3)
+                    counter++
+                    return Offset.Zero
+                }
 
-            override suspend fun onPreFling(available: Velocity): Velocity {
-                assertThat(counter).isEqualTo(5)
-                counter++
-                return Velocity.Zero
-            }
+                override suspend fun onPreFling(available: Velocity): Velocity {
+                    assertThat(counter).isEqualTo(5)
+                    counter++
+                    return Velocity.Zero
+                }
 
-            override suspend fun onPostFling(
-                consumed: Velocity,
-                available: Velocity
-            ): Velocity {
-                assertThat(counter).isEqualTo(7)
-                counter++
-                return available
+                override suspend fun onPostFling(
+                    consumed: Velocity,
+                    available: Velocity
+                ): Velocity {
+                    assertThat(counter).isEqualTo(7)
+                    counter++
+                    return available
+                }
             }
-        }
         val childDispatcher = NestedScrollDispatcher()
         rule.setContent {
             Box(Modifier.requiredSize(100.dp).nestedScroll(parentConnection)) {
-                Box(
-                    Modifier.requiredSize(100.dp).nestedScroll(childConnection, childDispatcher)
-                )
+                Box(Modifier.requiredSize(100.dp).nestedScroll(childConnection, childDispatcher))
             }
         }
 
@@ -128,8 +126,11 @@
         assertThat(counter).isEqualTo(2)
         counter++
 
-        childDispatcher
-            .dispatchPostScroll(scrollOffset, scrollLeftOffset, NestedScrollSource.UserInput)
+        childDispatcher.dispatchPostScroll(
+            scrollOffset,
+            scrollLeftOffset,
+            NestedScrollSource.UserInput
+        )
         assertThat(counter).isEqualTo(4)
         counter++
 
@@ -146,20 +147,22 @@
     fun nestedScroll_NNodes_orderTest_preScroll() {
         var counter = 0
         val childConnection = object : NestedScrollConnection {}
-        val parentConnection = object : NestedScrollConnection {
-            override fun onPreScroll(available: Offset, source: NestedScrollSource): Offset {
-                assertThat(counter).isEqualTo(2)
-                counter++
-                return Offset.Zero
+        val parentConnection =
+            object : NestedScrollConnection {
+                override fun onPreScroll(available: Offset, source: NestedScrollSource): Offset {
+                    assertThat(counter).isEqualTo(2)
+                    counter++
+                    return Offset.Zero
+                }
             }
-        }
-        val grandParentConnection = object : NestedScrollConnection {
-            override fun onPreScroll(available: Offset, source: NestedScrollSource): Offset {
-                assertThat(counter).isEqualTo(1)
-                counter++
-                return Offset.Zero
+        val grandParentConnection =
+            object : NestedScrollConnection {
+                override fun onPreScroll(available: Offset, source: NestedScrollSource): Offset {
+                    assertThat(counter).isEqualTo(1)
+                    counter++
+                    return Offset.Zero
+                }
             }
-        }
         val childDispatcher = NestedScrollDispatcher()
         rule.setContent {
             Box(Modifier.requiredSize(100.dp).nestedScroll(grandParentConnection)) {
@@ -185,29 +188,31 @@
     fun nestedScroll_NNodes_orderTest_scroll() {
         var counter = 0
         val childConnection = object : NestedScrollConnection {}
-        val parentConnection = object : NestedScrollConnection {
+        val parentConnection =
+            object : NestedScrollConnection {
 
-            override fun onPostScroll(
-                consumed: Offset,
-                available: Offset,
-                source: NestedScrollSource
-            ): Offset {
-                assertThat(counter).isEqualTo(1)
-                counter++
-                return Offset.Zero
+                override fun onPostScroll(
+                    consumed: Offset,
+                    available: Offset,
+                    source: NestedScrollSource
+                ): Offset {
+                    assertThat(counter).isEqualTo(1)
+                    counter++
+                    return Offset.Zero
+                }
             }
-        }
-        val grandParentConnection = object : NestedScrollConnection {
-            override fun onPostScroll(
-                consumed: Offset,
-                available: Offset,
-                source: NestedScrollSource
-            ): Offset {
-                assertThat(counter).isEqualTo(2)
-                counter++
-                return Offset.Zero
+        val grandParentConnection =
+            object : NestedScrollConnection {
+                override fun onPostScroll(
+                    consumed: Offset,
+                    available: Offset,
+                    source: NestedScrollSource
+                ): Offset {
+                    assertThat(counter).isEqualTo(2)
+                    counter++
+                    return Offset.Zero
+                }
             }
-        }
         val childDispatcher = NestedScrollDispatcher()
         rule.setContent {
             Box(Modifier.requiredSize(100.dp).nestedScroll(grandParentConnection)) {
@@ -223,8 +228,11 @@
             assertThat(counter).isEqualTo(0)
             counter++
 
-            childDispatcher
-                .dispatchPostScroll(scrollOffset, scrollLeftOffset, NestedScrollSource.UserInput)
+            childDispatcher.dispatchPostScroll(
+                scrollOffset,
+                scrollLeftOffset,
+                NestedScrollSource.UserInput
+            )
             assertThat(counter).isEqualTo(3)
             counter++
         }
@@ -234,21 +242,23 @@
     fun nestedScroll_NNodes_orderTest_preFling(): Unit = runBlocking {
         var counter = 0
         val childConnection = object : NestedScrollConnection {}
-        val parentConnection = object : NestedScrollConnection {
+        val parentConnection =
+            object : NestedScrollConnection {
 
-            override suspend fun onPreFling(available: Velocity): Velocity {
-                assertThat(counter).isEqualTo(2)
-                counter++
-                return Velocity.Zero
+                override suspend fun onPreFling(available: Velocity): Velocity {
+                    assertThat(counter).isEqualTo(2)
+                    counter++
+                    return Velocity.Zero
+                }
             }
-        }
-        val grandParentConnection = object : NestedScrollConnection {
-            override suspend fun onPreFling(available: Velocity): Velocity {
-                assertThat(counter).isEqualTo(1)
-                counter++
-                return Velocity.Zero
+        val grandParentConnection =
+            object : NestedScrollConnection {
+                override suspend fun onPreFling(available: Velocity): Velocity {
+                    assertThat(counter).isEqualTo(1)
+                    counter++
+                    return Velocity.Zero
+                }
             }
-        }
         val childDispatcher = NestedScrollDispatcher()
         rule.setContent {
             Box(Modifier.requiredSize(100.dp).nestedScroll(grandParentConnection)) {
@@ -272,26 +282,28 @@
     fun nestedScroll_NNodes_orderTest_fling(): Unit = runBlocking {
         var counter = 0
         val childConnection = object : NestedScrollConnection {}
-        val parentConnection = object : NestedScrollConnection {
-            override suspend fun onPostFling(
-                consumed: Velocity,
-                available: Velocity
-            ): Velocity {
-                assertThat(counter).isEqualTo(1)
-                counter++
-                return Velocity.Zero
+        val parentConnection =
+            object : NestedScrollConnection {
+                override suspend fun onPostFling(
+                    consumed: Velocity,
+                    available: Velocity
+                ): Velocity {
+                    assertThat(counter).isEqualTo(1)
+                    counter++
+                    return Velocity.Zero
+                }
             }
-        }
-        val grandParentConnection = object : NestedScrollConnection {
-            override suspend fun onPostFling(
-                consumed: Velocity,
-                available: Velocity
-            ): Velocity {
-                assertThat(counter).isEqualTo(2)
-                counter++
-                return Velocity.Zero
+        val grandParentConnection =
+            object : NestedScrollConnection {
+                override suspend fun onPostFling(
+                    consumed: Velocity,
+                    available: Velocity
+                ): Velocity {
+                    assertThat(counter).isEqualTo(2)
+                    counter++
+                    return Velocity.Zero
+                }
             }
-        }
         val childDispatcher = NestedScrollDispatcher()
         rule.setContent {
             Box(Modifier.requiredSize(100.dp).nestedScroll(grandParentConnection)) {
@@ -319,44 +331,43 @@
         var currentsource = NestedScrollSource.UserInput
 
         val childConnection = object : NestedScrollConnection {}
-        val parentConnection = object : NestedScrollConnection {
-            override fun onPreScroll(available: Offset, source: NestedScrollSource): Offset {
-                assertThat(available).isEqualTo(preScrollOffset)
-                assertThat(source).isEqualTo(currentsource)
-                return preScrollReturn
-            }
+        val parentConnection =
+            object : NestedScrollConnection {
+                override fun onPreScroll(available: Offset, source: NestedScrollSource): Offset {
+                    assertThat(available).isEqualTo(preScrollOffset)
+                    assertThat(source).isEqualTo(currentsource)
+                    return preScrollReturn
+                }
 
-            override fun onPostScroll(
-                consumed: Offset,
-                available: Offset,
-                source: NestedScrollSource
-            ): Offset {
-                assertThat(consumed).isEqualTo(scrollOffset)
-                assertThat(available).isEqualTo(scrollLeftOffset)
-                assertThat(source).isEqualTo(currentsource)
-                return Offset.Zero
-            }
+                override fun onPostScroll(
+                    consumed: Offset,
+                    available: Offset,
+                    source: NestedScrollSource
+                ): Offset {
+                    assertThat(consumed).isEqualTo(scrollOffset)
+                    assertThat(available).isEqualTo(scrollLeftOffset)
+                    assertThat(source).isEqualTo(currentsource)
+                    return Offset.Zero
+                }
 
-            override suspend fun onPreFling(available: Velocity): Velocity {
-                assertThat(available).isEqualTo(preFling)
-                return preFlingReturn
-            }
+                override suspend fun onPreFling(available: Velocity): Velocity {
+                    assertThat(available).isEqualTo(preFling)
+                    return preFlingReturn
+                }
 
-            override suspend fun onPostFling(
-                consumed: Velocity,
-                available: Velocity
-            ): Velocity {
-                assertThat(consumed).isEqualTo(postFlingConsumed)
-                assertThat(available).isEqualTo(postFlingLeft)
-                return Velocity.Zero
+                override suspend fun onPostFling(
+                    consumed: Velocity,
+                    available: Velocity
+                ): Velocity {
+                    assertThat(consumed).isEqualTo(postFlingConsumed)
+                    assertThat(available).isEqualTo(postFlingLeft)
+                    return Velocity.Zero
+                }
             }
-        }
         val childDispatcher = NestedScrollDispatcher()
         rule.setContent {
             Box(Modifier.requiredSize(100.dp).nestedScroll(parentConnection)) {
-                Box(
-                    Modifier.requiredSize(100.dp).nestedScroll(childConnection, childDispatcher)
-                )
+                Box(Modifier.requiredSize(100.dp).nestedScroll(childConnection, childDispatcher))
             }
         }
 
@@ -384,19 +395,21 @@
         val parentConsumedPreScroll = Offset(1f, 1f)
 
         val childConnection = object : NestedScrollConnection {}
-        val grandParentConnection = object : NestedScrollConnection {
-            override fun onPreScroll(available: Offset, source: NestedScrollSource): Offset {
-                assertThat(available).isEqualTo(dispatchedPreScroll)
-                return grandParentConsumesPreScroll
+        val grandParentConnection =
+            object : NestedScrollConnection {
+                override fun onPreScroll(available: Offset, source: NestedScrollSource): Offset {
+                    assertThat(available).isEqualTo(dispatchedPreScroll)
+                    return grandParentConsumesPreScroll
+                }
             }
-        }
-        val parentConnection = object : NestedScrollConnection {
-            override fun onPreScroll(available: Offset, source: NestedScrollSource): Offset {
-                assertThat(available)
-                    .isEqualTo(dispatchedPreScroll - grandParentConsumesPreScroll)
-                return parentConsumedPreScroll
+        val parentConnection =
+            object : NestedScrollConnection {
+                override fun onPreScroll(available: Offset, source: NestedScrollSource): Offset {
+                    assertThat(available)
+                        .isEqualTo(dispatchedPreScroll - grandParentConsumesPreScroll)
+                    return parentConsumedPreScroll
+                }
             }
-        }
         val childDispatcher = NestedScrollDispatcher()
         rule.setContent {
             Box(Modifier.requiredSize(100.dp).nestedScroll(grandParentConnection)) {
@@ -423,28 +436,30 @@
         val parentConsumedScroll = Offset(1f, 1f)
 
         val childConnection = object : NestedScrollConnection {}
-        val grandParentConnection = object : NestedScrollConnection {
-            override fun onPostScroll(
-                consumed: Offset,
-                available: Offset,
-                source: NestedScrollSource
-            ): Offset {
-                assertThat(consumed).isEqualTo(parentConsumedScroll + dispatchedConsumedScroll)
-                assertThat(available).isEqualTo(dispatchedScroll - parentConsumedScroll)
-                return grandParentConsumedScroll
+        val grandParentConnection =
+            object : NestedScrollConnection {
+                override fun onPostScroll(
+                    consumed: Offset,
+                    available: Offset,
+                    source: NestedScrollSource
+                ): Offset {
+                    assertThat(consumed).isEqualTo(parentConsumedScroll + dispatchedConsumedScroll)
+                    assertThat(available).isEqualTo(dispatchedScroll - parentConsumedScroll)
+                    return grandParentConsumedScroll
+                }
             }
-        }
-        val parentConnection = object : NestedScrollConnection {
-            override fun onPostScroll(
-                consumed: Offset,
-                available: Offset,
-                source: NestedScrollSource
-            ): Offset {
-                assertThat(consumed).isEqualTo(dispatchedConsumedScroll)
-                assertThat(available).isEqualTo(dispatchedScroll)
-                return parentConsumedScroll
+        val parentConnection =
+            object : NestedScrollConnection {
+                override fun onPostScroll(
+                    consumed: Offset,
+                    available: Offset,
+                    source: NestedScrollSource
+                ): Offset {
+                    assertThat(consumed).isEqualTo(dispatchedConsumedScroll)
+                    assertThat(available).isEqualTo(dispatchedScroll)
+                    return parentConsumedScroll
+                }
             }
-        }
         val childDispatcher = NestedScrollDispatcher()
         rule.setContent {
             Box(Modifier.requiredSize(100.dp).nestedScroll(grandParentConnection)) {
@@ -472,19 +487,21 @@
         val parentConsumedPreFling = Velocity(1f, 1f)
 
         val childConnection = object : NestedScrollConnection {}
-        val grandParentConnection = object : NestedScrollConnection {
-            override suspend fun onPreFling(available: Velocity): Velocity {
-                assertThat(available).isEqualTo(dispatchedVelocity)
-                return grandParentConsumesPreFling
+        val grandParentConnection =
+            object : NestedScrollConnection {
+                override suspend fun onPreFling(available: Velocity): Velocity {
+                    assertThat(available).isEqualTo(dispatchedVelocity)
+                    return grandParentConsumesPreFling
+                }
             }
-        }
-        val parentConnection = object : NestedScrollConnection {
-            override suspend fun onPreFling(available: Velocity): Velocity {
-                assertThat(available)
-                    .isEqualTo(dispatchedVelocity - grandParentConsumesPreFling)
-                return parentConsumedPreFling
+        val parentConnection =
+            object : NestedScrollConnection {
+                override suspend fun onPreFling(available: Velocity): Velocity {
+                    assertThat(available)
+                        .isEqualTo(dispatchedVelocity - grandParentConsumesPreFling)
+                    return parentConsumedPreFling
+                }
             }
-        }
         val childDispatcher = NestedScrollDispatcher()
         rule.setContent {
             Box(Modifier.requiredSize(100.dp).nestedScroll(grandParentConnection)) {
@@ -508,29 +525,31 @@
         val parentConsumedPostFling = Velocity(1f, 1f)
 
         val childConnection = object : NestedScrollConnection {}
-        val grandParentConnection = object : NestedScrollConnection {
-            override suspend fun onPostFling(
-                consumed: Velocity,
-                available: Velocity
-            ): Velocity {
-                assertThat(consumed)
-                    .isEqualTo(parentConsumedPostFling + dispatchedConsumedVelocity)
-                assertThat(available)
-                    .isEqualTo(dispatchedLeftVelocity - parentConsumedPostFling)
-                return grandParentConsumedPostFling
+        val grandParentConnection =
+            object : NestedScrollConnection {
+                override suspend fun onPostFling(
+                    consumed: Velocity,
+                    available: Velocity
+                ): Velocity {
+                    assertThat(consumed)
+                        .isEqualTo(parentConsumedPostFling + dispatchedConsumedVelocity)
+                    assertThat(available)
+                        .isEqualTo(dispatchedLeftVelocity - parentConsumedPostFling)
+                    return grandParentConsumedPostFling
+                }
             }
-        }
-        val parentConnection = object : NestedScrollConnection {
+        val parentConnection =
+            object : NestedScrollConnection {
 
-            override suspend fun onPostFling(
-                consumed: Velocity,
-                available: Velocity
-            ): Velocity {
-                assertThat(consumed).isEqualTo(dispatchedConsumedVelocity)
-                assertThat(available).isEqualTo(dispatchedLeftVelocity)
-                return parentConsumedPostFling
+                override suspend fun onPostFling(
+                    consumed: Velocity,
+                    available: Velocity
+                ): Velocity {
+                    assertThat(consumed).isEqualTo(dispatchedConsumedVelocity)
+                    assertThat(available).isEqualTo(dispatchedLeftVelocity)
+                    return parentConsumedPostFling
+                }
             }
-        }
         val childDispatcher = NestedScrollDispatcher()
         rule.setContent {
             Box(Modifier.requiredSize(100.dp).nestedScroll(grandParentConnection)) {
@@ -552,43 +571,43 @@
         var currentsource = NestedScrollSource.UserInput
 
         val childConnection = object : NestedScrollConnection {}
-        val parentConnection = object : NestedScrollConnection {
-            override fun onPreScroll(available: Offset, source: NestedScrollSource): Offset {
-                assertThat(available).isEqualTo(preScrollOffset)
-                assertThat(source).isEqualTo(currentsource)
-                return preScrollReturn
-            }
+        val parentConnection =
+            object : NestedScrollConnection {
+                override fun onPreScroll(available: Offset, source: NestedScrollSource): Offset {
+                    assertThat(available).isEqualTo(preScrollOffset)
+                    assertThat(source).isEqualTo(currentsource)
+                    return preScrollReturn
+                }
 
-            override fun onPostScroll(
-                consumed: Offset,
-                available: Offset,
-                source: NestedScrollSource
-            ): Offset {
-                assertThat(consumed).isEqualTo(scrollOffset)
-                assertThat(available).isEqualTo(scrollLeftOffset)
-                assertThat(source).isEqualTo(currentsource)
-                return Offset.Zero
-            }
+                override fun onPostScroll(
+                    consumed: Offset,
+                    available: Offset,
+                    source: NestedScrollSource
+                ): Offset {
+                    assertThat(consumed).isEqualTo(scrollOffset)
+                    assertThat(available).isEqualTo(scrollLeftOffset)
+                    assertThat(source).isEqualTo(currentsource)
+                    return Offset.Zero
+                }
 
-            override suspend fun onPreFling(available: Velocity): Velocity {
-                assertThat(available).isEqualTo(preFling)
-                return preFlingReturn
-            }
+                override suspend fun onPreFling(available: Velocity): Velocity {
+                    assertThat(available).isEqualTo(preFling)
+                    return preFlingReturn
+                }
 
-            override suspend fun onPostFling(
-                consumed: Velocity,
-                available: Velocity
-            ): Velocity {
-                assertThat(consumed).isEqualTo(postFlingConsumed)
-                assertThat(available).isEqualTo(postFlingLeft)
-                return Velocity.Zero
+                override suspend fun onPostFling(
+                    consumed: Velocity,
+                    available: Velocity
+                ): Velocity {
+                    assertThat(consumed).isEqualTo(postFlingConsumed)
+                    assertThat(available).isEqualTo(postFlingLeft)
+                    return Velocity.Zero
+                }
             }
-        }
         val childDispatcher = NestedScrollDispatcher()
         rule.setContent {
             Box(
-                Modifier
-                    .requiredSize(100.dp)
+                Modifier.requiredSize(100.dp)
                     .nestedScroll(parentConnection) // parent
                     .nestedScroll(childConnection, childDispatcher) // child
             )
@@ -613,34 +632,35 @@
 
     @Test
     fun nestedScroll_shouldNotCalledSelfConnection(): Unit = runBlocking {
-        val childConnection = object : NestedScrollConnection {
-            override fun onPreScroll(available: Offset, source: NestedScrollSource): Offset {
-                assertWithMessage("self connection shouldn't be called").fail()
-                return Offset.Zero
-            }
+        val childConnection =
+            object : NestedScrollConnection {
+                override fun onPreScroll(available: Offset, source: NestedScrollSource): Offset {
+                    assertWithMessage("self connection shouldn't be called").fail()
+                    return Offset.Zero
+                }
 
-            override fun onPostScroll(
-                consumed: Offset,
-                available: Offset,
-                source: NestedScrollSource
-            ): Offset {
-                assertWithMessage("self connection shouldn't be called").fail()
-                return Offset.Zero
-            }
+                override fun onPostScroll(
+                    consumed: Offset,
+                    available: Offset,
+                    source: NestedScrollSource
+                ): Offset {
+                    assertWithMessage("self connection shouldn't be called").fail()
+                    return Offset.Zero
+                }
 
-            override suspend fun onPreFling(available: Velocity): Velocity {
-                assertWithMessage("self connection shouldn't be called").fail()
-                return Velocity.Zero
-            }
+                override suspend fun onPreFling(available: Velocity): Velocity {
+                    assertWithMessage("self connection shouldn't be called").fail()
+                    return Velocity.Zero
+                }
 
-            override suspend fun onPostFling(
-                consumed: Velocity,
-                available: Velocity
-            ): Velocity {
-                assertWithMessage("self connection shouldn't be called").fail()
-                return Velocity.Zero
+                override suspend fun onPostFling(
+                    consumed: Velocity,
+                    available: Velocity
+                ): Velocity {
+                    assertWithMessage("self connection shouldn't be called").fail()
+                    return Velocity.Zero
+                }
             }
-        }
         val parentConnection = object : NestedScrollConnection {}
         val childDispatcher = NestedScrollDispatcher()
         rule.setContent {
@@ -650,8 +670,11 @@
         }
 
         childDispatcher.dispatchPreScroll(preScrollOffset, NestedScrollSource.UserInput)
-        childDispatcher
-            .dispatchPostScroll(scrollOffset, scrollLeftOffset, NestedScrollSource.SideEffect)
+        childDispatcher.dispatchPostScroll(
+            scrollOffset,
+            scrollLeftOffset,
+            NestedScrollSource.SideEffect
+        )
 
         childDispatcher.dispatchPreFling(preFling)
         childDispatcher.dispatchPostFling(postFlingConsumed, postFlingLeft)
@@ -660,17 +683,13 @@
     @Test
     fun nestedScroll_hierarchyDispatch_rootParentRemoval() {
         testRootParentAdditionRemoval { root, child ->
-            Box(Modifier.requiredSize(100.dp).then(root)) {
-                Box(child)
-            }
+            Box(Modifier.requiredSize(100.dp).then(root)) { Box(child) }
         }
     }
 
     @Test
     fun nestedScroll_flatDispatch_rootParentRemoval() {
-        testRootParentAdditionRemoval { root, child ->
-            Box(Modifier.then(root).then(child))
-        }
+        testRootParentAdditionRemoval { root, child -> Box(Modifier.then(root).then(child)) }
     }
 
     @Test
@@ -692,13 +711,7 @@
         testMiddleParentAdditionRemoval { rootMod, middleMod, childMod ->
             // random boxes to emulate nesting
             Box(Modifier.requiredSize(100.dp).then(rootMod)) {
-                Box {
-                    Box(Modifier.requiredSize(100.dp).then(middleMod)) {
-                        Box {
-                            Box(childMod)
-                        }
-                    }
-                }
+                Box { Box(Modifier.requiredSize(100.dp).then(middleMod)) { Box { Box(childMod) } } }
             }
         }
     }
@@ -706,12 +719,7 @@
     @Test
     fun nestedScroll_flatDispatch_middleParentRemoval() {
         testMiddleParentAdditionRemoval { rootMod, middleMod, childMod ->
-            Box(
-                Modifier
-                    .then(rootMod)
-                    .then(middleMod)
-                    .then(childMod)
-            )
+            Box(Modifier.then(rootMod).then(middleMod).then(childMod))
         }
     }
 
@@ -720,8 +728,7 @@
         testMiddleParentAdditionRemoval { rootMod, middleMod, childMod ->
             // insert a few random modifiers so it's more realistic example of wrapper re-usage
             Box(
-                Modifier
-                    .requiredSize(100.dp)
+                Modifier.requiredSize(100.dp)
                     .then(rootMod)
                     .requiredSize(90.dp)
                     .clipToBounds()
@@ -740,80 +747,82 @@
 
         val isConnection1Parent = mutableStateOf(true)
         val childConnection = object : NestedScrollConnection {}
-        val connection1 = object : NestedScrollConnection {
-            override fun onPreScroll(available: Offset, source: NestedScrollSource): Offset {
-                assertThat(counter).isEqualTo(if (isConnection1Parent.value) 1 else 2)
-                counter++
-                return preScrollReturn
-            }
+        val connection1 =
+            object : NestedScrollConnection {
+                override fun onPreScroll(available: Offset, source: NestedScrollSource): Offset {
+                    assertThat(counter).isEqualTo(if (isConnection1Parent.value) 1 else 2)
+                    counter++
+                    return preScrollReturn
+                }
 
-            override fun onPostScroll(
-                consumed: Offset,
-                available: Offset,
-                source: NestedScrollSource
-            ): Offset {
-                assertThat(counter).isEqualTo(if (isConnection1Parent.value) 2 else 1)
-                counter++
-                return Offset.Zero
-            }
+                override fun onPostScroll(
+                    consumed: Offset,
+                    available: Offset,
+                    source: NestedScrollSource
+                ): Offset {
+                    assertThat(counter).isEqualTo(if (isConnection1Parent.value) 2 else 1)
+                    counter++
+                    return Offset.Zero
+                }
 
-            override suspend fun onPreFling(available: Velocity): Velocity {
-                assertThat(counter).isEqualTo(if (isConnection1Parent.value) 1 else 2)
-                counter++
-                return preFlingReturn
-            }
+                override suspend fun onPreFling(available: Velocity): Velocity {
+                    assertThat(counter).isEqualTo(if (isConnection1Parent.value) 1 else 2)
+                    counter++
+                    return preFlingReturn
+                }
 
-            override suspend fun onPostFling(
-                consumed: Velocity,
-                available: Velocity
-            ): Velocity {
-                assertThat(counter).isEqualTo(if (isConnection1Parent.value) 2 else 1)
-                counter++
-                return Velocity.Zero
+                override suspend fun onPostFling(
+                    consumed: Velocity,
+                    available: Velocity
+                ): Velocity {
+                    assertThat(counter).isEqualTo(if (isConnection1Parent.value) 2 else 1)
+                    counter++
+                    return Velocity.Zero
+                }
             }
-        }
-        val connection2 = object : NestedScrollConnection {
-            override fun onPreScroll(available: Offset, source: NestedScrollSource): Offset {
-                assertThat(counter).isEqualTo(if (isConnection1Parent.value) 2 else 1)
-                counter++
-                return preScrollReturn
-            }
+        val connection2 =
+            object : NestedScrollConnection {
+                override fun onPreScroll(available: Offset, source: NestedScrollSource): Offset {
+                    assertThat(counter).isEqualTo(if (isConnection1Parent.value) 2 else 1)
+                    counter++
+                    return preScrollReturn
+                }
 
-            override fun onPostScroll(
-                consumed: Offset,
-                available: Offset,
-                source: NestedScrollSource
-            ): Offset {
-                assertThat(counter).isEqualTo(if (isConnection1Parent.value) 1 else 2)
-                counter++
-                return Offset.Zero
-            }
+                override fun onPostScroll(
+                    consumed: Offset,
+                    available: Offset,
+                    source: NestedScrollSource
+                ): Offset {
+                    assertThat(counter).isEqualTo(if (isConnection1Parent.value) 1 else 2)
+                    counter++
+                    return Offset.Zero
+                }
 
-            override suspend fun onPreFling(available: Velocity): Velocity {
-                assertThat(counter).isEqualTo(if (isConnection1Parent.value) 2 else 1)
-                counter++
-                return preFlingReturn
-            }
+                override suspend fun onPreFling(available: Velocity): Velocity {
+                    assertThat(counter).isEqualTo(if (isConnection1Parent.value) 2 else 1)
+                    counter++
+                    return preFlingReturn
+                }
 
-            override suspend fun onPostFling(
-                consumed: Velocity,
-                available: Velocity
-            ): Velocity {
-                assertThat(counter).isEqualTo(if (isConnection1Parent.value) 1 else 2)
-                counter++
-                return Velocity.Zero
+                override suspend fun onPostFling(
+                    consumed: Velocity,
+                    available: Velocity
+                ): Velocity {
+                    assertThat(counter).isEqualTo(if (isConnection1Parent.value) 1 else 2)
+                    counter++
+                    return Velocity.Zero
+                }
             }
-        }
         val childDispatcher = NestedScrollDispatcher()
         rule.setContent {
-            val nestedScrollParents = if (isConnection1Parent.value) {
-                Modifier.nestedScroll(connection1).nestedScroll(connection2)
-            } else {
-                Modifier.nestedScroll(connection2).nestedScroll(connection1)
-            }
+            val nestedScrollParents =
+                if (isConnection1Parent.value) {
+                    Modifier.nestedScroll(connection1).nestedScroll(connection2)
+                } else {
+                    Modifier.nestedScroll(connection2).nestedScroll(connection1)
+                }
             Box(
-                Modifier
-                    .requiredSize(100.dp)
+                Modifier.requiredSize(100.dp)
                     .then(nestedScrollParents)
                     .nestedScroll(childConnection, childDispatcher)
             )
@@ -860,9 +869,7 @@
                 } else {
                     Modifier
                 }
-            Box(parent) {
-                Box(Modifier.nestedScroll(childConnection, childDispatcher))
-            }
+            Box(parent) { Box(Modifier.nestedScroll(childConnection, childDispatcher)) }
         }
 
         rule.runOnIdle {
@@ -884,70 +891,72 @@
 
         val isConnection1Parent = mutableStateOf(true)
         val childConnection = object : NestedScrollConnection {}
-        val connection1 = object : NestedScrollConnection {
-            override fun onPreScroll(available: Offset, source: NestedScrollSource): Offset {
-                assertThat(counter).isEqualTo(if (isConnection1Parent.value) 1 else 2)
-                counter++
-                return preScrollReturn
-            }
+        val connection1 =
+            object : NestedScrollConnection {
+                override fun onPreScroll(available: Offset, source: NestedScrollSource): Offset {
+                    assertThat(counter).isEqualTo(if (isConnection1Parent.value) 1 else 2)
+                    counter++
+                    return preScrollReturn
+                }
 
-            override fun onPostScroll(
-                consumed: Offset,
-                available: Offset,
-                source: NestedScrollSource
-            ): Offset {
-                assertThat(counter).isEqualTo(if (isConnection1Parent.value) 2 else 1)
-                counter++
-                return Offset.Zero
-            }
+                override fun onPostScroll(
+                    consumed: Offset,
+                    available: Offset,
+                    source: NestedScrollSource
+                ): Offset {
+                    assertThat(counter).isEqualTo(if (isConnection1Parent.value) 2 else 1)
+                    counter++
+                    return Offset.Zero
+                }
 
-            override suspend fun onPreFling(available: Velocity): Velocity {
-                assertThat(counter).isEqualTo(if (isConnection1Parent.value) 1 else 2)
-                counter++
-                return preFlingReturn
-            }
+                override suspend fun onPreFling(available: Velocity): Velocity {
+                    assertThat(counter).isEqualTo(if (isConnection1Parent.value) 1 else 2)
+                    counter++
+                    return preFlingReturn
+                }
 
-            override suspend fun onPostFling(
-                consumed: Velocity,
-                available: Velocity
-            ): Velocity {
-                assertThat(counter).isEqualTo(if (isConnection1Parent.value) 2 else 1)
-                counter++
-                return Velocity.Zero
+                override suspend fun onPostFling(
+                    consumed: Velocity,
+                    available: Velocity
+                ): Velocity {
+                    assertThat(counter).isEqualTo(if (isConnection1Parent.value) 2 else 1)
+                    counter++
+                    return Velocity.Zero
+                }
             }
-        }
-        val connection2 = object : NestedScrollConnection {
-            override fun onPreScroll(available: Offset, source: NestedScrollSource): Offset {
-                assertThat(counter).isEqualTo(if (isConnection1Parent.value) 2 else 1)
-                counter++
-                return preScrollReturn
-            }
+        val connection2 =
+            object : NestedScrollConnection {
+                override fun onPreScroll(available: Offset, source: NestedScrollSource): Offset {
+                    assertThat(counter).isEqualTo(if (isConnection1Parent.value) 2 else 1)
+                    counter++
+                    return preScrollReturn
+                }
 
-            override fun onPostScroll(
-                consumed: Offset,
-                available: Offset,
-                source: NestedScrollSource
-            ): Offset {
-                assertThat(counter).isEqualTo(if (isConnection1Parent.value) 1 else 2)
-                counter++
-                return Offset.Zero
-            }
+                override fun onPostScroll(
+                    consumed: Offset,
+                    available: Offset,
+                    source: NestedScrollSource
+                ): Offset {
+                    assertThat(counter).isEqualTo(if (isConnection1Parent.value) 1 else 2)
+                    counter++
+                    return Offset.Zero
+                }
 
-            override suspend fun onPreFling(available: Velocity): Velocity {
-                assertThat(counter).isEqualTo(if (isConnection1Parent.value) 2 else 1)
-                counter++
-                return preFlingReturn
-            }
+                override suspend fun onPreFling(available: Velocity): Velocity {
+                    assertThat(counter).isEqualTo(if (isConnection1Parent.value) 2 else 1)
+                    counter++
+                    return preFlingReturn
+                }
 
-            override suspend fun onPostFling(
-                consumed: Velocity,
-                available: Velocity
-            ): Velocity {
-                assertThat(counter).isEqualTo(if (isConnection1Parent.value) 1 else 2)
-                counter++
-                return Velocity.Zero
+                override suspend fun onPostFling(
+                    consumed: Velocity,
+                    available: Velocity
+                ): Velocity {
+                    assertThat(counter).isEqualTo(if (isConnection1Parent.value) 1 else 2)
+                    counter++
+                    return Velocity.Zero
+                }
             }
-        }
         val childDispatcher = NestedScrollDispatcher()
         rule.setContent {
             val outerBoxConnection = if (isConnection1Parent.value) connection1 else connection2
@@ -993,9 +1002,7 @@
         val MaxOffsetBound = 900f
         val ConsumedEverything = 0.0f
         rule.setContent {
-            var offset by remember {
-                mutableStateOf(MaxOffsetBound)
-            }
+            var offset by remember { mutableStateOf(MaxOffsetBound) }
             val nestedScrollConnection = remember {
                 object : NestedScrollConnection {
                     fun consumedDelta(scrollDelta: Float): Float {
@@ -1021,12 +1028,9 @@
                         available: Offset,
                         source: NestedScrollSource
                     ): Offset {
-                        return if (abs(available.y) > 0f &&
-                            available.y > 0f
-                        ) {
+                        return if (abs(available.y) > 0f && available.y > 0f) {
                             Offset(0f, consumedDelta(available.y))
-                        } else
-                            super.onPostScroll(consumed, available, source)
+                        } else super.onPostScroll(consumed, available, source)
                     }
 
                     override suspend fun onPreFling(available: Velocity): Velocity {
@@ -1037,26 +1041,17 @@
             }
 
             Column(modifier = Modifier.fillMaxSize().testTag(mainLayoutTag)) {
-                Box(
-                    modifier = Modifier
-                        .fillMaxWidth()
-                        .height(80.dp)
-                )
+                Box(modifier = Modifier.fillMaxWidth().height(80.dp))
                 LazyColumn(
-                    modifier = Modifier
-                        .graphicsLayer {
-                            translationY = offset
-                        }
-                        .nestedScroll(connection = nestedScrollConnection)
-                        .fillMaxWidth()
-                        .weight(1f)
+                    modifier =
+                        Modifier.graphicsLayer { translationY = offset }
+                            .nestedScroll(connection = nestedScrollConnection)
+                            .fillMaxWidth()
+                            .weight(1f)
                 ) {
                     items(100) {
                         Box(
-                            modifier = Modifier
-                                .fillMaxWidth()
-                                .height(60.dp)
-                                .background(Color.Gray)
+                            modifier = Modifier.fillMaxWidth().height(60.dp).background(Color.Gray)
                         ) {
                             BasicText(text = it.toString())
                         }
@@ -1092,19 +1087,21 @@
 
         val emitNewParent = mutableStateOf(true)
         val childConnection = object : NestedScrollConnection {}
-        val rootParent = object : NestedScrollConnection {
-            override fun onPreScroll(available: Offset, source: NestedScrollSource): Offset {
-                return rootParentPreConsumed
-            }
-        }
-        val parentToRemove = object : NestedScrollConnection {
-            override fun onPreScroll(available: Offset, source: NestedScrollSource): Offset {
-                if (!emitNewParent.value) {
-                    assertWithMessage("Shouldn't be called when not emitted").fail()
+        val rootParent =
+            object : NestedScrollConnection {
+                override fun onPreScroll(available: Offset, source: NestedScrollSource): Offset {
+                    return rootParentPreConsumed
                 }
-                return parentToRemovePreConsumed
             }
-        }
+        val parentToRemove =
+            object : NestedScrollConnection {
+                override fun onPreScroll(available: Offset, source: NestedScrollSource): Offset {
+                    if (!emitNewParent.value) {
+                        assertWithMessage("Shouldn't be called when not emitted").fail()
+                    }
+                    return parentToRemovePreConsumed
+                }
+            }
         val childDispatcher = NestedScrollDispatcher()
         rule.setContent {
             val maybeNestedScroll =
@@ -1145,11 +1142,12 @@
 
         val emitParentNestedScroll = mutableStateOf(true)
         val childConnection = object : NestedScrollConnection {}
-        val parent = object : NestedScrollConnection {
-            override fun onPreScroll(available: Offset, source: NestedScrollSource): Offset {
-                return preScrollReturn
+        val parent =
+            object : NestedScrollConnection {
+                override fun onPreScroll(available: Offset, source: NestedScrollSource): Offset {
+                    return preScrollReturn
+                }
             }
-        }
         val childDispatcher = NestedScrollDispatcher()
         rule.setContent {
             val maybeNestedScroll =
@@ -1161,29 +1159,23 @@
         }
 
         rule.runOnIdle {
-            val res = childDispatcher.dispatchPreScroll(
-                preScrollOffset,
-                NestedScrollSource.UserInput
-            )
+            val res =
+                childDispatcher.dispatchPreScroll(preScrollOffset, NestedScrollSource.UserInput)
             assertThat(res).isEqualTo(preScrollReturn)
 
             emitParentNestedScroll.value = false
         }
 
         rule.runOnIdle {
-            val res = childDispatcher.dispatchPreScroll(
-                preScrollOffset,
-                NestedScrollSource.UserInput
-            )
+            val res =
+                childDispatcher.dispatchPreScroll(preScrollOffset, NestedScrollSource.UserInput)
             assertThat(res).isEqualTo(Offset.Zero)
             emitParentNestedScroll.value = true
         }
 
         rule.runOnIdle {
-            val res = childDispatcher.dispatchPreScroll(
-                preScrollOffset,
-                NestedScrollSource.UserInput
-            )
+            val res =
+                childDispatcher.dispatchPreScroll(preScrollOffset, NestedScrollSource.UserInput)
             assertThat(res).isEqualTo(preScrollReturn)
         }
     }
@@ -1199,50 +1191,37 @@
         var postScrollConsumedOffset = Offset.Zero
         var postScrollAvailableOffset = Offset.Zero
 
-        val nestedScrollConnection = object : NestedScrollConnection {
-            override fun onPreScroll(available: Offset, source: NestedScrollSource): Offset {
-                preScrollCount++
-                preScrollAvailableOffset = available
+        val nestedScrollConnection =
+            object : NestedScrollConnection {
+                override fun onPreScroll(available: Offset, source: NestedScrollSource): Offset {
+                    preScrollCount++
+                    preScrollAvailableOffset = available
 
-                return available
+                    return available
+                }
+
+                override fun onPostScroll(
+                    consumed: Offset,
+                    available: Offset,
+                    source: NestedScrollSource
+                ): Offset {
+                    postScrollCount++
+                    postScrollConsumedOffset = consumed
+                    postScrollAvailableOffset = available
+
+                    return super.onPostScroll(consumed, available, source)
+                }
             }
 
-            override fun onPostScroll(
-                consumed: Offset,
-                available: Offset,
-                source: NestedScrollSource
-            ): Offset {
-                postScrollCount++
-                postScrollConsumedOffset = consumed
-                postScrollAvailableOffset = available
-
-                return super.onPostScroll(consumed, available, source)
-            }
-        }
-
         rule.setContent {
             Column(
-                modifier = Modifier
-                    .fillMaxSize()
-                    .nestedScroll(connection = nestedScrollConnection)
+                modifier = Modifier.fillMaxSize().nestedScroll(connection = nestedScrollConnection)
             ) {
-                Box(
-                    modifier = Modifier
-                        .fillMaxWidth()
-                        .height(80.dp)
-                )
-                LazyColumn(
-                    modifier = Modifier
-                        .fillMaxWidth()
-                        .testTag(mainLayoutTag)
-                        .weight(1f)
-                ) {
+                Box(modifier = Modifier.fillMaxWidth().height(80.dp))
+                LazyColumn(modifier = Modifier.fillMaxWidth().testTag(mainLayoutTag).weight(1f)) {
                     items(100) {
                         Box(
-                            modifier = Modifier
-                                .fillMaxWidth()
-                                .height(60.dp)
-                                .background(Color.Gray)
+                            modifier = Modifier.fillMaxWidth().height(60.dp).background(Color.Gray)
                         ) {
                             BasicText(text = it.toString())
                         }
@@ -1283,50 +1262,37 @@
         var postScrollConsumedOffset = Offset.Zero
         var postScrollAvailableOffset = Offset.Zero
 
-        val nestedScrollConnection = object : NestedScrollConnection {
-            override fun onPreScroll(available: Offset, source: NestedScrollSource): Offset {
-                preScrollCount++
-                preScrollAvailableOffset = available
+        val nestedScrollConnection =
+            object : NestedScrollConnection {
+                override fun onPreScroll(available: Offset, source: NestedScrollSource): Offset {
+                    preScrollCount++
+                    preScrollAvailableOffset = available
 
-                return Offset.Zero
+                    return Offset.Zero
+                }
+
+                override fun onPostScroll(
+                    consumed: Offset,
+                    available: Offset,
+                    source: NestedScrollSource
+                ): Offset {
+                    postScrollCount++
+                    postScrollConsumedOffset = consumed
+                    postScrollAvailableOffset = available
+
+                    return super.onPostScroll(consumed, available, source)
+                }
             }
 
-            override fun onPostScroll(
-                consumed: Offset,
-                available: Offset,
-                source: NestedScrollSource
-            ): Offset {
-                postScrollCount++
-                postScrollConsumedOffset = consumed
-                postScrollAvailableOffset = available
-
-                return super.onPostScroll(consumed, available, source)
-            }
-        }
-
         rule.setContent {
             Column(
-                modifier = Modifier
-                    .fillMaxSize()
-                    .nestedScroll(connection = nestedScrollConnection)
+                modifier = Modifier.fillMaxSize().nestedScroll(connection = nestedScrollConnection)
             ) {
-                Box(
-                    modifier = Modifier
-                        .fillMaxWidth()
-                        .height(80.dp)
-                )
-                LazyColumn(
-                    modifier = Modifier
-                        .fillMaxWidth()
-                        .testTag(mainLayoutTag)
-                        .weight(1f)
-                ) {
+                Box(modifier = Modifier.fillMaxWidth().height(80.dp))
+                LazyColumn(modifier = Modifier.fillMaxWidth().testTag(mainLayoutTag).weight(1f)) {
                     items(100) {
                         Box(
-                            modifier = Modifier
-                                .fillMaxWidth()
-                                .height(60.dp)
-                                .background(Color.Gray)
+                            modifier = Modifier.fillMaxWidth().height(60.dp).background(Color.Gray)
                         ) {
                             BasicText(text = it.toString())
                         }
@@ -1366,50 +1332,37 @@
         var postScrollConsumedOffset = Offset.Zero
         var postScrollAvailableOffset = Offset.Zero
 
-        val nestedScrollConnection = object : NestedScrollConnection {
-            override fun onPreScroll(available: Offset, source: NestedScrollSource): Offset {
-                preScrollCount++
-                preScrollAvailableOffset = available
-                // Pre-roll consumes full amount
-                return available
-            }
+        val nestedScrollConnection =
+            object : NestedScrollConnection {
+                override fun onPreScroll(available: Offset, source: NestedScrollSource): Offset {
+                    preScrollCount++
+                    preScrollAvailableOffset = available
+                    // Pre-roll consumes full amount
+                    return available
+                }
 
-            override fun onPostScroll(
-                consumed: Offset,
-                available: Offset,
-                source: NestedScrollSource
-            ): Offset {
-                postScrollCount++
-                postScrollConsumedOffset = consumed
-                postScrollAvailableOffset = available
+                override fun onPostScroll(
+                    consumed: Offset,
+                    available: Offset,
+                    source: NestedScrollSource
+                ): Offset {
+                    postScrollCount++
+                    postScrollConsumedOffset = consumed
+                    postScrollAvailableOffset = available
 
-                return super.onPostScroll(consumed, available, source)
+                    return super.onPostScroll(consumed, available, source)
+                }
             }
-        }
 
         rule.setContent {
             Column(
-                modifier = Modifier
-                    .fillMaxSize()
-                    .nestedScroll(connection = nestedScrollConnection)
+                modifier = Modifier.fillMaxSize().nestedScroll(connection = nestedScrollConnection)
             ) {
-                Box(
-                    modifier = Modifier
-                        .fillMaxWidth()
-                        .height(80.dp)
-                )
-                LazyColumn(
-                    modifier = Modifier
-                        .fillMaxWidth()
-                        .testTag(mainLayoutTag)
-                        .weight(1f)
-                ) {
+                Box(modifier = Modifier.fillMaxWidth().height(80.dp))
+                LazyColumn(modifier = Modifier.fillMaxWidth().testTag(mainLayoutTag).weight(1f)) {
                     items(100) {
                         Box(
-                            modifier = Modifier
-                                .fillMaxWidth()
-                                .height(60.dp)
-                                .background(Color.Gray)
+                            modifier = Modifier.fillMaxWidth().height(60.dp).background(Color.Gray)
                         ) {
                             BasicText(text = it.toString())
                         }
@@ -1443,50 +1396,37 @@
         var postScrollConsumedOffset = Offset.Zero
         var postScrollAvailableOffset = Offset.Zero
 
-        val nestedScrollConnection = object : NestedScrollConnection {
-            override fun onPreScroll(available: Offset, source: NestedScrollSource): Offset {
-                preScrollCount++
-                preScrollAvailableOffset = available
+        val nestedScrollConnection =
+            object : NestedScrollConnection {
+                override fun onPreScroll(available: Offset, source: NestedScrollSource): Offset {
+                    preScrollCount++
+                    preScrollAvailableOffset = available
 
-                return Offset.Zero
+                    return Offset.Zero
+                }
+
+                override fun onPostScroll(
+                    consumed: Offset,
+                    available: Offset,
+                    source: NestedScrollSource
+                ): Offset {
+                    postScrollCount++
+                    postScrollConsumedOffset = consumed
+                    postScrollAvailableOffset = available
+
+                    return super.onPostScroll(consumed, available, source)
+                }
             }
 
-            override fun onPostScroll(
-                consumed: Offset,
-                available: Offset,
-                source: NestedScrollSource
-            ): Offset {
-                postScrollCount++
-                postScrollConsumedOffset = consumed
-                postScrollAvailableOffset = available
-
-                return super.onPostScroll(consumed, available, source)
-            }
-        }
-
         rule.setContent {
             Column(
-                modifier = Modifier
-                    .fillMaxSize()
-                    .nestedScroll(connection = nestedScrollConnection)
+                modifier = Modifier.fillMaxSize().nestedScroll(connection = nestedScrollConnection)
             ) {
-                Box(
-                    modifier = Modifier
-                        .fillMaxWidth()
-                        .height(80.dp)
-                )
-                LazyColumn(
-                    modifier = Modifier
-                        .fillMaxWidth()
-                        .testTag(mainLayoutTag)
-                        .weight(1f)
-                ) {
+                Box(modifier = Modifier.fillMaxWidth().height(80.dp))
+                LazyColumn(modifier = Modifier.fillMaxWidth().testTag(mainLayoutTag).weight(1f)) {
                     items(100) {
                         Box(
-                            modifier = Modifier
-                                .fillMaxWidth()
-                                .height(60.dp)
-                                .background(Color.Gray)
+                            modifier = Modifier.fillMaxWidth().height(60.dp).background(Color.Gray)
                         ) {
                             BasicText(text = it.toString())
                         }
@@ -1517,41 +1457,31 @@
         var preFlingCount = 0
         var postFlingCount = 0
 
-        val nestedScrollConnection = object : NestedScrollConnection {
-            override suspend fun onPreFling(available: Velocity): Velocity {
-                preFlingCount++
-                return super.onPreFling(available)
-            }
+        val nestedScrollConnection =
+            object : NestedScrollConnection {
+                override suspend fun onPreFling(available: Velocity): Velocity {
+                    preFlingCount++
+                    return super.onPreFling(available)
+                }
 
-            override suspend fun onPostFling(consumed: Velocity, available: Velocity): Velocity {
-                postFlingCount++
-                return super.onPostFling(consumed, available)
+                override suspend fun onPostFling(
+                    consumed: Velocity,
+                    available: Velocity
+                ): Velocity {
+                    postFlingCount++
+                    return super.onPostFling(consumed, available)
+                }
             }
-        }
 
         rule.setContent {
             Column(
-                modifier = Modifier
-                    .fillMaxSize()
-                    .nestedScroll(connection = nestedScrollConnection)
+                modifier = Modifier.fillMaxSize().nestedScroll(connection = nestedScrollConnection)
             ) {
-                Box(
-                    modifier = Modifier
-                        .fillMaxWidth()
-                        .height(80.dp)
-                )
-                LazyColumn(
-                    modifier = Modifier
-                        .fillMaxWidth()
-                        .testTag(mainLayoutTag)
-                        .weight(1f)
-                ) {
+                Box(modifier = Modifier.fillMaxWidth().height(80.dp))
+                LazyColumn(modifier = Modifier.fillMaxWidth().testTag(mainLayoutTag).weight(1f)) {
                     items(100) {
                         Box(
-                            modifier = Modifier
-                                .fillMaxWidth()
-                                .height(60.dp)
-                                .background(Color.Gray)
+                            modifier = Modifier.fillMaxWidth().height(60.dp).background(Color.Gray)
                         ) {
                             BasicText(text = it.toString())
                         }
@@ -1581,41 +1511,31 @@
         var preFlingCount = 0
         var postFlingCount = 0
 
-        val nestedScrollConnection = object : NestedScrollConnection {
-            override suspend fun onPreFling(available: Velocity): Velocity {
-                preFlingCount++
-                return super.onPreFling(available)
-            }
+        val nestedScrollConnection =
+            object : NestedScrollConnection {
+                override suspend fun onPreFling(available: Velocity): Velocity {
+                    preFlingCount++
+                    return super.onPreFling(available)
+                }
 
-            override suspend fun onPostFling(consumed: Velocity, available: Velocity): Velocity {
-                postFlingCount++
-                return super.onPostFling(consumed, available)
+                override suspend fun onPostFling(
+                    consumed: Velocity,
+                    available: Velocity
+                ): Velocity {
+                    postFlingCount++
+                    return super.onPostFling(consumed, available)
+                }
             }
-        }
 
         rule.setContent {
             Column(
-                modifier = Modifier
-                    .fillMaxSize()
-                    .nestedScroll(connection = nestedScrollConnection)
+                modifier = Modifier.fillMaxSize().nestedScroll(connection = nestedScrollConnection)
             ) {
-                Box(
-                    modifier = Modifier
-                        .fillMaxWidth()
-                        .height(80.dp)
-                )
-                LazyColumn(
-                    modifier = Modifier
-                        .fillMaxWidth()
-                        .testTag(mainLayoutTag)
-                        .weight(1f)
-                ) {
+                Box(modifier = Modifier.fillMaxWidth().height(80.dp))
+                LazyColumn(modifier = Modifier.fillMaxWidth().testTag(mainLayoutTag).weight(1f)) {
                     items(100) {
                         Box(
-                            modifier = Modifier
-                                .fillMaxWidth()
-                                .height(60.dp)
-                                .background(Color.Gray)
+                            modifier = Modifier.fillMaxWidth().height(60.dp).background(Color.Gray)
                         ) {
                             BasicText(text = it.toString())
                         }
diff --git a/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/input/pointer/AndroidPointerInputTest.kt b/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/input/pointer/AndroidPointerInputTest.kt
index 24392c8..99bdb0d 100644
--- a/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/input/pointer/AndroidPointerInputTest.kt
+++ b/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/input/pointer/AndroidPointerInputTest.kt
@@ -105,8 +105,7 @@
 class AndroidPointerInputTest {
     @Suppress("DEPRECATION")
     @get:Rule
-    val rule =
-        androidx.test.rule.ActivityTestRule(AndroidPointerInputTestActivity::class.java)
+    val rule = androidx.test.rule.ActivityTestRule(AndroidPointerInputTestActivity::class.java)
 
     private lateinit var container: OpenComposeView
 
@@ -132,23 +131,24 @@
             rule.runOnUiThread {
                 container.setContent {
                     FillLayout(
-                        Modifier
-                            .consumeMovementGestureFilter()
-                            .onGloballyPositioned { latch.countDown() }
+                        Modifier.consumeMovementGestureFilter().onGloballyPositioned {
+                            latch.countDown()
+                        }
                     )
                 }
             }
         }
 
         rule.runOnUiThread {
-            val motionEvent = MotionEvent(
-                0,
-                ACTION_DOWN,
-                1,
-                0,
-                arrayOf(PointerProperties(0)),
-                arrayOf(PointerCoords(Float.NaN, Float.NaN))
-            )
+            val motionEvent =
+                MotionEvent(
+                    0,
+                    ACTION_DOWN,
+                    1,
+                    0,
+                    arrayOf(PointerProperties(0)),
+                    arrayOf(PointerCoords(Float.NaN, Float.NaN))
+                )
 
             val androidComposeView = findAndroidComposeView(container)!!
             // Act
@@ -165,23 +165,24 @@
             rule.runOnUiThread {
                 container.setContent {
                     FillLayout(
-                        Modifier
-                            .consumeMovementGestureFilter()
-                            .onGloballyPositioned { latch.countDown() }
+                        Modifier.consumeMovementGestureFilter().onGloballyPositioned {
+                            latch.countDown()
+                        }
                     )
                 }
             }
         }
 
         rule.runOnUiThread {
-            val motionEvent = MotionEvent(
-                0,
-                ACTION_DOWN,
-                1,
-                0,
-                arrayOf(PointerProperties(0)),
-                arrayOf(PointerCoords(Float.POSITIVE_INFINITY, Float.POSITIVE_INFINITY))
-            )
+            val motionEvent =
+                MotionEvent(
+                    0,
+                    ACTION_DOWN,
+                    1,
+                    0,
+                    arrayOf(PointerProperties(0)),
+                    arrayOf(PointerCoords(Float.POSITIVE_INFINITY, Float.POSITIVE_INFINITY))
+                )
 
             val androidComposeView = findAndroidComposeView(container)!!
             // Act
@@ -200,23 +201,21 @@
         countDown { latch ->
             rule.runOnUiThread {
                 container.setContent {
-                    FillLayout(
-                        Modifier
-                            .onGloballyPositioned { latch.countDown() }
-                    )
+                    FillLayout(Modifier.onGloballyPositioned { latch.countDown() })
                 }
             }
         }
 
         rule.runOnUiThread {
-            val motionEvent = MotionEvent(
-                0,
-                ACTION_DOWN,
-                1,
-                0,
-                arrayOf(PointerProperties(0)),
-                arrayOf(PointerCoords(0f, 0f))
-            )
+            val motionEvent =
+                MotionEvent(
+                    0,
+                    ACTION_DOWN,
+                    1,
+                    0,
+                    arrayOf(PointerProperties(0)),
+                    arrayOf(PointerCoords(0f, 0f))
+                )
 
             // Act
             val actual = findRootView(container).dispatchTouchEvent(motionEvent)
@@ -245,47 +244,53 @@
             container.setContent {
                 Box(modifier = Modifier.fillMaxSize()) {
                     // Top Box
-                    Box(modifier = Modifier
-                        .size(50.dp)
-                        .align(AbsoluteAlignment.TopLeft)
-                        .pointerInput(Unit) {
-                            awaitPointerEventScope {
-                                while (true) {
-                                    val event = awaitPointerEvent()
-                                    event.changes.forEach { it.consume() }
-                                    pointerEventsLog += event
+                    Box(
+                        modifier =
+                            Modifier.size(50.dp)
+                                .align(AbsoluteAlignment.TopLeft)
+                                .pointerInput(Unit) {
+                                    awaitPointerEventScope {
+                                        while (true) {
+                                            val event = awaitPointerEvent()
+                                            event.changes.forEach { it.consume() }
+                                            pointerEventsLog += event
 
-                                    // Actual dispatch of non-system created cancellation
-                                    // [MotionEvent] while other [MotionEvent]s are being handled.
-                                    if (event.type == PointerEventType.Move) {
-                                        dispatchTouchEvent(ACTION_CANCEL, topBoxInnerCoordinates!!)
+                                            // Actual dispatch of non-system created cancellation
+                                            // [MotionEvent] while other [MotionEvent]s are being
+                                            // handled.
+                                            if (event.type == PointerEventType.Move) {
+                                                dispatchTouchEvent(
+                                                    ACTION_CANCEL,
+                                                    topBoxInnerCoordinates!!
+                                                )
+                                            }
+                                        }
                                     }
                                 }
-                            }
-                        }
-                        .onGloballyPositioned {
-                            topBoxInnerCoordinates = it
-                            latch.countDown()
-                        }
+                                .onGloballyPositioned {
+                                    topBoxInnerCoordinates = it
+                                    latch.countDown()
+                                }
                     )
 
                     // Bottom Box
-                    Box(modifier = Modifier
-                        .size(60.dp)
-                        .align(AbsoluteAlignment.BottomRight)
-                        .pointerInput(Unit) {
-                            awaitPointerEventScope {
-                                while (true) {
-                                    val event = awaitPointerEvent()
-                                    event.changes.forEach { it.consume() }
-                                    pointerEventsLog += event
+                    Box(
+                        modifier =
+                            Modifier.size(60.dp)
+                                .align(AbsoluteAlignment.BottomRight)
+                                .pointerInput(Unit) {
+                                    awaitPointerEventScope {
+                                        while (true) {
+                                            val event = awaitPointerEvent()
+                                            event.changes.forEach { it.consume() }
+                                            pointerEventsLog += event
+                                        }
+                                    }
                                 }
-                            }
-                        }
-                        .onGloballyPositioned {
-                            bottomBoxInnerCoordinates = it
-                            latch.countDown()
-                        }
+                                .onGloballyPositioned {
+                                    bottomBoxInnerCoordinates = it
+                                    latch.countDown()
+                                }
                     )
                 }
             }
@@ -313,88 +318,91 @@
 
             var eventStartTime = 0
 
-            val downTopBoxEvent = MotionEvent(
-                eventStartTime,
-                action = ACTION_DOWN,
-                numPointers = 1,
-                actionIndex = 0,
-                pointerProperties = arrayOf(topBoxPointerProperties),
-                pointerCoords = arrayOf(PointerCoords(topBoxOffset.x, topBoxOffset.y))
-            )
-
-            eventStartTime += 500
-            val downBottomBoxEvent = MotionEvent(
-                eventStartTime,
-                action = ACTION_POINTER_DOWN,
-                numPointers = 2,
-                actionIndex = 1,
-                pointerProperties = arrayOf(
-                    topBoxPointerProperties,
-                    bottomBoxPointerProperties
-                ),
-                pointerCoords = arrayOf(
-                    PointerCoords(topBoxOffset.x, topBoxOffset.y),
-                    PointerCoords(bottomBoxOffset.x, bottomBoxOffset.y)
+            val downTopBoxEvent =
+                MotionEvent(
+                    eventStartTime,
+                    action = ACTION_DOWN,
+                    numPointers = 1,
+                    actionIndex = 0,
+                    pointerProperties = arrayOf(topBoxPointerProperties),
+                    pointerCoords = arrayOf(PointerCoords(topBoxOffset.x, topBoxOffset.y))
                 )
-            )
 
             eventStartTime += 500
-            val moveTopBoxEvent = MotionEvent(
-                eventStartTime,
-                action = ACTION_MOVE,
-                numPointers = 2,
-                actionIndex = 0,
-                pointerProperties = arrayOf(
-                    topBoxPointerProperties,
-                    bottomBoxPointerProperties
-                ),
-                pointerCoords = arrayOf(
-                    PointerCoords(topBoxOffset.x + 10, topBoxOffset.y),
-                    PointerCoords(bottomBoxOffset.x + 10, bottomBoxOffset.y)
+            val downBottomBoxEvent =
+                MotionEvent(
+                    eventStartTime,
+                    action = ACTION_POINTER_DOWN,
+                    numPointers = 2,
+                    actionIndex = 1,
+                    pointerProperties =
+                        arrayOf(topBoxPointerProperties, bottomBoxPointerProperties),
+                    pointerCoords =
+                        arrayOf(
+                            PointerCoords(topBoxOffset.x, topBoxOffset.y),
+                            PointerCoords(bottomBoxOffset.x, bottomBoxOffset.y)
+                        )
                 )
-            )
 
             eventStartTime += 500
-            val moveBottomBoxEvent = MotionEvent(
-                eventStartTime,
-                action = ACTION_MOVE,
-                numPointers = 2,
-                actionIndex = 1,
-                pointerProperties = arrayOf(
-                    topBoxPointerProperties,
-                    bottomBoxPointerProperties
-                ),
-                pointerCoords = arrayOf(
-                    PointerCoords(topBoxOffset.x + 10, topBoxOffset.y),
-                    PointerCoords(bottomBoxOffset.x + 10, bottomBoxOffset.y)
+            val moveTopBoxEvent =
+                MotionEvent(
+                    eventStartTime,
+                    action = ACTION_MOVE,
+                    numPointers = 2,
+                    actionIndex = 0,
+                    pointerProperties =
+                        arrayOf(topBoxPointerProperties, bottomBoxPointerProperties),
+                    pointerCoords =
+                        arrayOf(
+                            PointerCoords(topBoxOffset.x + 10, topBoxOffset.y),
+                            PointerCoords(bottomBoxOffset.x + 10, bottomBoxOffset.y)
+                        )
                 )
-            )
 
             eventStartTime += 500
-            val upTopBoxEvent = MotionEvent(
-                eventStartTime,
-                action = ACTION_POINTER_UP,
-                numPointers = 2,
-                actionIndex = 0,
-                pointerProperties = arrayOf(
-                    topBoxPointerProperties,
-                    bottomBoxPointerProperties
-                ),
-                pointerCoords = arrayOf(
-                    PointerCoords(topBoxOffset.x + 10, topBoxOffset.y),
-                    PointerCoords(bottomBoxOffset.x + 10, bottomBoxOffset.y)
+            val moveBottomBoxEvent =
+                MotionEvent(
+                    eventStartTime,
+                    action = ACTION_MOVE,
+                    numPointers = 2,
+                    actionIndex = 1,
+                    pointerProperties =
+                        arrayOf(topBoxPointerProperties, bottomBoxPointerProperties),
+                    pointerCoords =
+                        arrayOf(
+                            PointerCoords(topBoxOffset.x + 10, topBoxOffset.y),
+                            PointerCoords(bottomBoxOffset.x + 10, bottomBoxOffset.y)
+                        )
                 )
-            )
 
             eventStartTime += 500
-            val upBottomBoxEvent = MotionEvent(
-                eventStartTime,
-                action = ACTION_UP,
-                numPointers = 1,
-                actionIndex = 0,
-                pointerProperties = arrayOf(bottomBoxPointerProperties),
-                pointerCoords = arrayOf(PointerCoords(bottomBoxOffset.x + 10, bottomBoxOffset.y))
-            )
+            val upTopBoxEvent =
+                MotionEvent(
+                    eventStartTime,
+                    action = ACTION_POINTER_UP,
+                    numPointers = 2,
+                    actionIndex = 0,
+                    pointerProperties =
+                        arrayOf(topBoxPointerProperties, bottomBoxPointerProperties),
+                    pointerCoords =
+                        arrayOf(
+                            PointerCoords(topBoxOffset.x + 10, topBoxOffset.y),
+                            PointerCoords(bottomBoxOffset.x + 10, bottomBoxOffset.y)
+                        )
+                )
+
+            eventStartTime += 500
+            val upBottomBoxEvent =
+                MotionEvent(
+                    eventStartTime,
+                    action = ACTION_UP,
+                    numPointers = 1,
+                    actionIndex = 0,
+                    pointerProperties = arrayOf(bottomBoxPointerProperties),
+                    pointerCoords =
+                        arrayOf(PointerCoords(bottomBoxOffset.x + 10, bottomBoxOffset.y))
+                )
 
             // Act
             val androidComposeView = findAndroidComposeView(container) as AndroidComposeView
@@ -435,27 +443,28 @@
             rule.runOnUiThread {
                 container.setContent {
                     FillLayout(
-                        Modifier
-                            .consumeMovementGestureFilter()
-                            .onGloballyPositioned { latch.countDown() }
+                        Modifier.consumeMovementGestureFilter().onGloballyPositioned {
+                            latch.countDown()
+                        }
                     )
                 }
             }
         }
 
         rule.runOnUiThread {
-            val locationInWindow = IntArray(2).also {
-                container.getLocationInWindow(it)
-            }
+            val locationInWindow = IntArray(2).also { container.getLocationInWindow(it) }
 
-            val motionEvent = MotionEvent(
-                0,
-                ACTION_DOWN,
-                1,
-                0,
-                arrayOf(PointerProperties(0)),
-                arrayOf(PointerCoords(locationInWindow[0].toFloat(), locationInWindow[1].toFloat()))
-            )
+            val motionEvent =
+                MotionEvent(
+                    0,
+                    ACTION_DOWN,
+                    1,
+                    0,
+                    arrayOf(PointerProperties(0)),
+                    arrayOf(
+                        PointerCoords(locationInWindow[0].toFloat(), locationInWindow[1].toFloat())
+                    )
+                )
 
             // Act
             val actual = findRootView(container).dispatchTouchEvent(motionEvent)
@@ -488,19 +497,11 @@
         var consumedDownPosition: Offset? = null
         rule.runOnUiThread {
             container.setContent {
-                Box(
-                    Modifier
-                        .fillMaxSize()
-                        .wrapContentSize(align = AbsoluteAlignment.TopLeft)) {
+                Box(Modifier.fillMaxSize().wrapContentSize(align = AbsoluteAlignment.TopLeft)) {
                     Layout(
                         {},
-                        Modifier
-                            .consumeDownGestureFilter {
-                                consumedDownPosition = it
-                            }
-                            .onGloballyPositioned {
-                                latch.countDown()
-                            }
+                        Modifier.consumeDownGestureFilter { consumedDownPosition = it }
+                            .onGloballyPositioned { latch.countDown() }
                     ) { _, _ ->
                         val sizePx = size.value
                         layout(sizePx, sizePx) {}
@@ -516,18 +517,17 @@
             size.value = 20
             // this call will synchronously mark the LayoutNode as needs remeasure
             Snapshot.sendApplyNotifications()
-            val locationInWindow = IntArray(2).also {
-                container.getLocationInWindow(it)
-            }
+            val locationInWindow = IntArray(2).also { container.getLocationInWindow(it) }
 
-            val motionEvent = MotionEvent(
-                0,
-                ACTION_DOWN,
-                1,
-                0,
-                arrayOf(PointerProperties(0)),
-                arrayOf(PointerCoords(locationInWindow[0] + 15f, locationInWindow[1] + 15f))
-            )
+            val motionEvent =
+                MotionEvent(
+                    0,
+                    ACTION_DOWN,
+                    1,
+                    0,
+                    arrayOf(PointerProperties(0)),
+                    arrayOf(PointerCoords(locationInWindow[0] + 15f, locationInWindow[1] + 15f))
+                )
 
             // we expect it to first remeasure and only then process
             findRootView(container).dispatchTouchEvent(motionEvent)
@@ -553,11 +553,9 @@
                             AndroidWithCompose(context, 100) {
                                 Layout(
                                     {},
-                                    Modifier
-                                        .logEventsGestureFilter(log)
-                                        .onGloballyPositioned {
-                                            latch.countDown()
-                                        }
+                                    Modifier.logEventsGestureFilter(log).onGloballyPositioned {
+                                        latch.countDown()
+                                    }
                                 ) { _, _ ->
                                     layout(5, 5) {}
                                 }
@@ -569,23 +567,22 @@
         }
 
         rule.runOnUiThread {
-            val locationInWindow = IntArray(2).also {
-                container.getLocationInWindow(it)
-            }
+            val locationInWindow = IntArray(2).also { container.getLocationInWindow(it) }
 
-            val motionEvent = MotionEvent(
-                0,
-                ACTION_DOWN,
-                1,
-                0,
-                arrayOf(PointerProperties(0)),
-                arrayOf(
-                    PointerCoords(
-                        locationInWindow[0].toFloat() + 1 + 10 + 100,
-                        locationInWindow[1].toFloat() + 1 + 10 + 100
+            val motionEvent =
+                MotionEvent(
+                    0,
+                    ACTION_DOWN,
+                    1,
+                    0,
+                    arrayOf(PointerProperties(0)),
+                    arrayOf(
+                        PointerCoords(
+                            locationInWindow[0].toFloat() + 1 + 10 + 100,
+                            locationInWindow[1].toFloat() + 1 + 10 + 100
+                        )
                     )
                 )
-            )
 
             // Act
             findRootView(container).dispatchTouchEvent(motionEvent)
@@ -608,8 +605,7 @@
             rule.runOnUiThread {
                 container.setContent {
                     FillLayout(
-                        Modifier
-                            .consumeMovementGestureFilter(consumeMovement)
+                        Modifier.consumeMovementGestureFilter(consumeMovement)
                             .onGloballyPositioned { latch.countDown() }
                     )
                 }
@@ -617,28 +613,31 @@
         }
 
         rule.runOnUiThread {
-            val (x, y) = IntArray(2).let { array ->
-                container.getLocationInWindow(array)
-                array.map { item -> item.toFloat() }
-            }
+            val (x, y) =
+                IntArray(2).let { array ->
+                    container.getLocationInWindow(array)
+                    array.map { item -> item.toFloat() }
+                }
 
-            val down = MotionEvent(
-                0,
-                ACTION_DOWN,
-                1,
-                0,
-                arrayOf(PointerProperties(0)),
-                arrayOf(PointerCoords(x, y))
-            )
+            val down =
+                MotionEvent(
+                    0,
+                    ACTION_DOWN,
+                    1,
+                    0,
+                    arrayOf(PointerProperties(0)),
+                    arrayOf(PointerCoords(x, y))
+                )
 
-            val move = MotionEvent(
-                0,
-                ACTION_MOVE,
-                1,
-                0,
-                arrayOf(PointerProperties(0)),
-                arrayOf(PointerCoords(x + 1, y))
-            )
+            val move =
+                MotionEvent(
+                    0,
+                    ACTION_MOVE,
+                    1,
+                    0,
+                    arrayOf(PointerProperties(0)),
+                    arrayOf(PointerCoords(x + 1, y))
+                )
 
             findRootView(container).dispatchTouchEvent(down)
 
@@ -671,9 +670,9 @@
             rule.runOnUiThread {
                 container.setContent {
                     FillLayout(
-                        Modifier
-                            .logEventsGestureFilter(log)
-                            .onGloballyPositioned { latch.countDown() }
+                        Modifier.logEventsGestureFilter(log).onGloballyPositioned {
+                            latch.countDown()
+                        }
                     )
                 }
             }
@@ -681,27 +680,26 @@
 
         rule.runOnUiThread {
             // Get the current location in window.
-            val locationInWindow = IntArray(2).also {
-                container.getLocationInWindow(it)
-            }
+            val locationInWindow = IntArray(2).also { container.getLocationInWindow(it) }
 
             // Offset the androidComposeView.
             container.offsetTopAndBottom(offset)
 
             // Create a motion event that is also offset.
-            val motionEvent = MotionEvent(
-                0,
-                ACTION_DOWN,
-                1,
-                0,
-                arrayOf(PointerProperties(0)),
-                arrayOf(
-                    PointerCoords(
-                        locationInWindow[0].toFloat(),
-                        locationInWindow[1].toFloat() + offset
+            val motionEvent =
+                MotionEvent(
+                    0,
+                    ACTION_DOWN,
+                    1,
+                    0,
+                    arrayOf(PointerProperties(0)),
+                    arrayOf(
+                        PointerCoords(
+                            locationInWindow[0].toFloat(),
+                            locationInWindow[1].toFloat() + offset
+                        )
                     )
                 )
-            )
 
             // Act
             findRootView(container).dispatchTouchEvent(motionEvent)
@@ -723,11 +721,16 @@
         rule.runOnUiThread {
             container.setContent {
                 FillLayout(
-                    Modifier
-                        .pointerInput(Unit) {
+                    Modifier.pointerInput(Unit) {
                             detectTapGestures(
-                                onLongPress = { didLongPress = true; inputLatch.countDown() },
-                                onTap = { didTap = true; inputLatch.countDown() }
+                                onLongPress = {
+                                    didLongPress = true
+                                    inputLatch.countDown()
+                                },
+                                onTap = {
+                                    didTap = true
+                                    inputLatch.countDown()
+                                }
                             )
                         }
                         .onGloballyPositioned { positionedLatch.countDown() }
@@ -746,24 +749,24 @@
 
         repeat(5) { iteration ->
             rule.runOnUiThread {
-                val downEvent = createPointerEventAt(
-                    iteration * sleepTime.toInt(),
-                    ACTION_DOWN,
-                    locationInWindow
-                )
+                val downEvent =
+                    createPointerEventAt(
+                        iteration * sleepTime.toInt(),
+                        ACTION_DOWN,
+                        locationInWindow
+                    )
                 findRootView(container).dispatchTouchEvent(downEvent)
             }
 
             rule.runOnUiThread {
-                val upEvent = createPointerEventAt(
-                    touchUpDelay + iteration * sleepTime.toInt(),
-                    ACTION_UP,
-                    locationInWindow
-                )
+                val upEvent =
+                    createPointerEventAt(
+                        touchUpDelay + iteration * sleepTime.toInt(),
+                        ACTION_UP,
+                        locationInWindow
+                    )
                 handler.postDelayed(
-                    Runnable {
-                        findRootView(container).dispatchTouchEvent(upEvent)
-                    },
+                    Runnable { findRootView(container).dispatchTouchEvent(upEvent) },
                     touchUpDelay.toLong()
                 )
 
@@ -796,14 +799,13 @@
         rule.runOnUiThread {
             container.setContent {
                 FillLayout(
-                    Modifier
-                        .pointerInput(Unit) {
-                            detectTapGestures { tapLatch.countDown() }
-                        }
+                    Modifier.pointerInput(Unit) { detectTapGestures { tapLatch.countDown() } }
                         .then(
-                            if (tap2Enabled) Modifier.pointerInput(Unit) {
-                                detectTapGestures { tapLatch2.countDown() }
-                            } else Modifier
+                            if (tap2Enabled)
+                                Modifier.pointerInput(Unit) {
+                                    detectTapGestures { tapLatch2.countDown() }
+                                }
+                            else Modifier
                         )
                         .onGloballyPositioned { positionedLatch.countDown() }
                 )
@@ -839,11 +841,7 @@
         }
         // Need to wait for long press timeout (at least)
         rule.runOnUiThread {
-            val upEvent = createPointerEventAt(
-                1030,
-                ACTION_UP,
-                locationInWindow
-            )
+            val upEvent = createPointerEventAt(1030, ACTION_UP, locationInWindow)
             findRootView(container).dispatchTouchEvent(upEvent)
         }
         assertTrue(tapLatch2.await(1, TimeUnit.SECONDS))
@@ -864,9 +862,9 @@
     }
 
     /**
-     * There are times that getLocationOnScreen() returns (0, 0). Touch input should still arrive
-     * at the correct place even if getLocationOnScreen() gives a different result than the
-     * rawX, rawY indicate.
+     * There are times that getLocationOnScreen() returns (0, 0). Touch input should still arrive at
+     * the correct place even if getLocationOnScreen() gives a different result than the rawX, rawY
+     * indicate.
      */
     @Test
     fun badGetLocationOnScreen() {
@@ -876,19 +874,16 @@
             container.setContent {
                 with(LocalDensity.current) {
                     Box(
-                        Modifier
-                            .size(250.toDp())
-                            .layout { measurable, constraints ->
-                                val p = measurable.measure(constraints)
-                                layout(p.width, p.height) {
-                                    p.place(0, 0)
-                                    layoutLatch.countDown()
-                                }
+                        Modifier.size(250.toDp()).layout { measurable, constraints ->
+                            val p = measurable.measure(constraints)
+                            layout(p.width, p.height) {
+                                p.place(0, 0)
+                                layoutLatch.countDown()
                             }
+                        }
                     ) {
                         Box(
-                            Modifier
-                                .align(AbsoluteAlignment.TopLeft)
+                            Modifier.align(AbsoluteAlignment.TopLeft)
                                 .pointerInput(Unit) {
                                     awaitPointerEventScope {
                                         awaitFirstDown()
@@ -902,7 +897,7 @@
             }
         }
         assertTrue(layoutLatch.await(1, TimeUnit.SECONDS))
-        rule.runOnUiThread { }
+        rule.runOnUiThread {}
 
         val down = createPointerEventAt(0, ACTION_DOWN, intArrayOf(105, 205))
         down.offsetLocation(-100f, -200f)
@@ -913,8 +908,8 @@
     }
 
     /**
-     * When a scale(0, 0) is used, there is no valid inverse matrix. A touch should not reach
-     * an item that is scaled to 0.
+     * When a scale(0, 0) is used, there is no valid inverse matrix. A touch should not reach an
+     * item that is scaled to 0.
      */
     @Test
     fun badInverseMatrix() {
@@ -925,8 +920,7 @@
             container.setContent {
                 with(LocalDensity.current) {
                     Box(
-                        Modifier
-                            .layout { measurable, constraints ->
+                        Modifier.layout { measurable, constraints ->
                                 val p = measurable.measure(constraints)
                                 layout(p.width, p.height) {
                                     layoutLatch.countDown()
@@ -953,16 +947,14 @@
             }
         }
         assertTrue(layoutLatch.await(1, TimeUnit.SECONDS))
-        rule.runOnUiThread { }
+        rule.runOnUiThread {}
 
         val down = createPointerEventAt(0, ACTION_DOWN, intArrayOf(5, 5))
         val composeView = findAndroidComposeView(container) as AndroidComposeView
         composeView.dispatchTouchEvent(down)
 
         assertTrue(tapLatch.await(1, TimeUnit.SECONDS))
-        rule.runOnUiThread {
-            assertEquals(0, insideTap)
-        }
+        rule.runOnUiThread { assertEquals(0, insideTap) }
     }
 
     @Test
@@ -973,10 +965,7 @@
             container.setContent {
                 with(LocalDensity.current) {
                     Box(
-                        Modifier
-                            .onPlaced {
-                                layoutLatch.countDown()
-                            }
+                        Modifier.onPlaced { layoutLatch.countDown() }
                             .pointerInput(Unit) {
                                 awaitPointerEventScope {
                                     awaitFirstDown()
@@ -1007,18 +996,16 @@
         val change = event.changes[0]
         assertThat(change.pressed).isFalse()
         assertThat(change.previousPressed).isFalse()
-        val expectedHoverType = when {
-            isEnter -> PointerEventType.Enter
-            isExit -> PointerEventType.Exit
-            else -> PointerEventType.Move
-        }
+        val expectedHoverType =
+            when {
+                isEnter -> PointerEventType.Enter
+                isExit -> PointerEventType.Exit
+                else -> PointerEventType.Move
+            }
         assertThat(event.type).isEqualTo(expectedHoverType)
     }
 
-    private fun assertScrollEvent(
-        event: PointerEvent,
-        scrollExpected: Offset
-    ) {
+    private fun assertScrollEvent(event: PointerEvent, scrollExpected: Offset) {
         assertThat(event.changes).hasSize(1)
         val change = event.changes[0]
         assertThat(change.pressed).isFalse()
@@ -1037,19 +1024,23 @@
         rule.runOnUiThread {
             val root = layoutCoordinates.findRootCoordinates()
             val pos = root.localPositionOf(layoutCoordinates, offset)
-            val event = MotionEvent(
-                eventTime,
-                action,
-                1,
-                0,
-                arrayOf(PointerProperties(0).also { it.toolType = MotionEvent.TOOL_TYPE_MOUSE }),
-                arrayOf(PointerCoords(pos.x, pos.y, scrollDelta.x, scrollDelta.y))
-            )
+            val event =
+                MotionEvent(
+                    eventTime,
+                    action,
+                    1,
+                    0,
+                    arrayOf(
+                        PointerProperties(0).also { it.toolType = MotionEvent.TOOL_TYPE_MOUSE }
+                    ),
+                    arrayOf(PointerCoords(pos.x, pos.y, scrollDelta.x, scrollDelta.y))
+                )
 
             val androidComposeView = findAndroidComposeView(container) as AndroidComposeView
             when (action) {
-                ACTION_HOVER_ENTER, ACTION_HOVER_MOVE, ACTION_HOVER_EXIT ->
-                    androidComposeView.dispatchHoverEvent(event)
+                ACTION_HOVER_ENTER,
+                ACTION_HOVER_MOVE,
+                ACTION_HOVER_EXIT -> androidComposeView.dispatchHoverEvent(event)
                 ACTION_SCROLL -> androidComposeView.dispatchGenericMotionEvent(event)
                 else -> androidComposeView.dispatchTouchEvent(event)
             }
@@ -1067,20 +1058,22 @@
             val androidComposeView = findAndroidComposeView(container) as AndroidComposeView
 
             for (action in actions) {
-                val event = MotionEvent(
-                    0,
-                    action,
-                    1,
-                    0,
-                    arrayOf(PointerProperties(0).also {
-                        it.toolType = MotionEvent.TOOL_TYPE_STYLUS
-                    }),
-                    arrayOf(PointerCoords(pos.x, pos.y))
-                )
+                val event =
+                    MotionEvent(
+                        0,
+                        action,
+                        1,
+                        0,
+                        arrayOf(
+                            PointerProperties(0).also { it.toolType = MotionEvent.TOOL_TYPE_STYLUS }
+                        ),
+                        arrayOf(PointerCoords(pos.x, pos.y))
+                    )
 
                 when (action) {
-                    ACTION_HOVER_ENTER, ACTION_HOVER_MOVE, ACTION_HOVER_EXIT ->
-                        androidComposeView.dispatchHoverEvent(event)
+                    ACTION_HOVER_ENTER,
+                    ACTION_HOVER_MOVE,
+                    ACTION_HOVER_EXIT -> androidComposeView.dispatchHoverEvent(event)
                     else -> androidComposeView.dispatchTouchEvent(event)
                 }
             }
@@ -1096,14 +1089,17 @@
         rule.runOnUiThread {
             val root = layoutCoordinates.findRootCoordinates()
             val pos = root.localPositionOf(layoutCoordinates, offset)
-            val event = MotionEvent(
-                eventTime,
-                action,
-                1,
-                0,
-                arrayOf(PointerProperties(0).also { it.toolType = MotionEvent.TOOL_TYPE_FINGER }),
-                arrayOf(PointerCoords(pos.x, pos.y))
-            )
+            val event =
+                MotionEvent(
+                    eventTime,
+                    action,
+                    1,
+                    0,
+                    arrayOf(
+                        PointerProperties(0).also { it.toolType = MotionEvent.TOOL_TYPE_FINGER }
+                    ),
+                    arrayOf(PointerCoords(pos.x, pos.y))
+                )
 
             val androidComposeView = findAndroidComposeView(container) as AndroidComposeView
             androidComposeView.dispatchTouchEvent(event)
@@ -1118,8 +1114,7 @@
         rule.runOnUiThread {
             container.setContent {
                 Box(
-                    Modifier
-                        .fillMaxSize()
+                    Modifier.fillMaxSize()
                         .onGloballyPositioned {
                             layoutCoordinates = it
                             latch.countDown()
@@ -1152,8 +1147,7 @@
         rule.runOnUiThread {
             container.setContent {
                 Box(
-                    Modifier
-                        .fillMaxSize()
+                    Modifier.fillMaxSize()
                         .onGloballyPositioned {
                             layoutCoordinates = it
                             latch.countDown()
@@ -1221,11 +1215,8 @@
         rule.runOnUiThread {
             container.setContent {
                 Column(
-                    Modifier
-                        .fillMaxSize()
-                        .onGloballyPositioned {
-                            setUpFinishedLatch.countDown()
-                        }
+                    Modifier.fillMaxSize()
+                        .onGloballyPositioned { setUpFinishedLatch.countDown() }
                         .pointerInput(Unit) {
                             awaitPointerEventScope {
                                 while (true) {
@@ -1237,8 +1228,7 @@
                 ) {
                     // Box 1
                     Box(
-                        Modifier
-                            .size(50.dp)
+                        Modifier.size(50.dp)
                             .onGloballyPositioned {
                                 box1LayoutCoordinates = it
                                 setUpFinishedLatch.countDown()
@@ -1262,12 +1252,11 @@
                                     }
                                 }
                             }
-                    ) { }
+                    ) {}
 
                     // Box 2
                     Box(
-                        Modifier
-                            .size(50.dp)
+                        Modifier.size(50.dp)
                             .onGloballyPositioned {
                                 box2LayoutCoordinates = it
                                 setUpFinishedLatch.countDown()
@@ -1297,12 +1286,11 @@
                                     }
                                 }
                             }
-                    ) { }
+                    ) {}
 
                     // Box 3
                     Box(
-                        Modifier
-                            .size(50.dp)
+                        Modifier.size(50.dp)
                             .onGloballyPositioned {
                                 box3LayoutCoordinates = it
                                 setUpFinishedLatch.countDown()
@@ -1315,7 +1303,7 @@
                                     }
                                 }
                             }
-                    ) { }
+                    ) {}
                 }
             }
         }
@@ -1418,16 +1406,11 @@
         rule.runOnUiThread {
             container.setContent {
                 Column(
-                    Modifier
-                        .fillMaxSize()
-                        .onGloballyPositioned {
-                            setUpFinishedLatch.countDown()
-                        }
+                    Modifier.fillMaxSize().onGloballyPositioned { setUpFinishedLatch.countDown() }
                 ) {
                     // Box 1
                     Box(
-                        Modifier
-                            .size(50.dp)
+                        Modifier.size(50.dp)
                             .onGloballyPositioned {
                                 box1LayoutCoordinates = it
                                 setUpFinishedLatch.countDown()
@@ -1441,15 +1424,12 @@
                                             PointerEventType.Enter -> {
                                                 enterBox1 = true
                                             }
-
                                             PointerEventType.Exit -> {
                                                 enterBox1 = false
                                             }
-
                                             PointerEventType.Scroll -> {
                                                 scrollBox1 = true
                                             }
-
                                             else -> {
                                                 eventsThatShouldNotTrigger = true
                                             }
@@ -1457,15 +1437,12 @@
                                     }
                                 }
                             }
-                    ) { }
+                    ) {}
 
                     // Box 2
                     Box(
-                        Modifier
-                            .size(50.dp)
-                            .onGloballyPositioned {
-                                setUpFinishedLatch.countDown()
-                            }
+                        Modifier.size(50.dp)
+                            .onGloballyPositioned { setUpFinishedLatch.countDown() }
                             .pointerInput(Unit) {
                                 awaitPointerEventScope {
                                     while (true) {
@@ -1475,15 +1452,12 @@
                                     }
                                 }
                             }
-                    ) { }
+                    ) {}
 
                     // Box 3
                     Box(
-                        Modifier
-                            .size(50.dp)
-                            .onGloballyPositioned {
-                                setUpFinishedLatch.countDown()
-                            }
+                        Modifier.size(50.dp)
+                            .onGloballyPositioned { setUpFinishedLatch.countDown() }
                             .pointerInput(Unit) {
                                 awaitPointerEventScope {
                                     while (true) {
@@ -1493,7 +1467,7 @@
                                     }
                                 }
                             }
-                    ) { }
+                    ) {}
                 }
             }
         }
@@ -1517,24 +1491,30 @@
             val pos = root.localPositionOf(box1LayoutCoordinates!!, Offset.Zero)
 
             // Bad hover exit event on Box 1
-            val exitMotionEvent = MotionEvent(
-                0,
-                ACTION_HOVER_EXIT,
-                1,
-                0,
-                arrayOf(PointerProperties(0).also { it.toolType = MotionEvent.TOOL_TYPE_MOUSE }),
-                arrayOf(PointerCoords(pos.x, pos.y, Offset.Zero.x, Offset.Zero.y))
-            )
+            val exitMotionEvent =
+                MotionEvent(
+                    0,
+                    ACTION_HOVER_EXIT,
+                    1,
+                    0,
+                    arrayOf(
+                        PointerProperties(0).also { it.toolType = MotionEvent.TOOL_TYPE_MOUSE }
+                    ),
+                    arrayOf(PointerCoords(pos.x, pos.y, Offset.Zero.x, Offset.Zero.y))
+                )
 
             // Main scroll event on Box 1
-            val scrollMotionEvent = MotionEvent(
-                0,
-                ACTION_SCROLL,
-                1,
-                0,
-                arrayOf(PointerProperties(0).also { it.toolType = MotionEvent.TOOL_TYPE_MOUSE }),
-                arrayOf(PointerCoords(pos.x, pos.y, scrollDelta.x, scrollDelta.y))
-            )
+            val scrollMotionEvent =
+                MotionEvent(
+                    0,
+                    ACTION_SCROLL,
+                    1,
+                    0,
+                    arrayOf(
+                        PointerProperties(0).also { it.toolType = MotionEvent.TOOL_TYPE_MOUSE }
+                    ),
+                    arrayOf(PointerCoords(pos.x, pos.y, scrollDelta.x, scrollDelta.y))
+                )
 
             val androidComposeView = findAndroidComposeView(container) as AndroidComposeView
             androidComposeView.dispatchHoverEvent(exitMotionEvent)
@@ -1596,16 +1576,11 @@
         rule.runOnUiThread {
             container.setContent {
                 Column(
-                    Modifier
-                        .fillMaxSize()
-                        .onGloballyPositioned {
-                            setUpFinishedLatch.countDown()
-                        }
+                    Modifier.fillMaxSize().onGloballyPositioned { setUpFinishedLatch.countDown() }
                 ) {
                     // Box 1
                     Box(
-                        Modifier
-                            .size(50.dp)
+                        Modifier.size(50.dp)
                             .onGloballyPositioned {
                                 box1LayoutCoordinates = it
                                 setUpFinishedLatch.countDown()
@@ -1619,19 +1594,15 @@
                                             PointerEventType.Enter -> {
                                                 ++box1HoverEnter
                                             }
-
                                             PointerEventType.Press -> {
                                                 ++box1Down
                                             }
-
                                             PointerEventType.Release -> {
                                                 ++box1Up
                                             }
-
                                             PointerEventType.Exit -> {
                                                 ++box1HoverExit
                                             }
-
                                             else -> {
                                                 eventsThatShouldNotTrigger = true
                                             }
@@ -1639,12 +1610,11 @@
                                     }
                                 }
                             }
-                    ) { }
+                    ) {}
 
                     // Box 2
                     Box(
-                        Modifier
-                            .size(50.dp)
+                        Modifier.size(50.dp)
                             .onGloballyPositioned {
                                 box2LayoutCoordinates = it
                                 setUpFinishedLatch.countDown()
@@ -1658,11 +1628,9 @@
                                             PointerEventType.Press -> {
                                                 ++box2Down
                                             }
-
                                             PointerEventType.Release -> {
                                                 ++box2Up
                                             }
-
                                             else -> {
                                                 eventsThatShouldNotTrigger = true
                                             }
@@ -1670,15 +1638,12 @@
                                     }
                                 }
                             }
-                    ) { }
+                    ) {}
 
                     // Box 3
                     Box(
-                        Modifier
-                            .size(50.dp)
-                            .onGloballyPositioned {
-                                setUpFinishedLatch.countDown()
-                            }
+                        Modifier.size(50.dp)
+                            .onGloballyPositioned { setUpFinishedLatch.countDown() }
                             .pointerInput(Unit) {
                                 awaitPointerEventScope {
                                     while (true) {
@@ -1688,7 +1653,7 @@
                                     }
                                 }
                             }
-                    ) { }
+                    ) {}
                 }
             }
         }
@@ -1880,16 +1845,11 @@
         rule.runOnUiThread {
             container.setContent {
                 Column(
-                    Modifier
-                        .fillMaxSize()
-                        .onGloballyPositioned {
-                            setUpFinishedLatch.countDown()
-                        }
+                    Modifier.fillMaxSize().onGloballyPositioned { setUpFinishedLatch.countDown() }
                 ) {
                     // Box 1
                     Box(
-                        Modifier
-                            .size(50.dp)
+                        Modifier.size(50.dp)
                             .onGloballyPositioned {
                                 box1LayoutCoordinates = it
                                 setUpFinishedLatch.countDown()
@@ -1903,11 +1863,9 @@
                                             PointerEventType.Enter -> {
                                                 ++box1HoverEnter
                                             }
-
                                             PointerEventType.Exit -> {
                                                 ++box1HoverExit
                                             }
-
                                             else -> {
                                                 eventsThatShouldNotTrigger = true
                                             }
@@ -1915,12 +1873,11 @@
                                     }
                                 }
                             }
-                    ) { }
+                    ) {}
 
                     // Box 2
                     Box(
-                        Modifier
-                            .size(50.dp)
+                        Modifier.size(50.dp)
                             .onGloballyPositioned {
                                 box2LayoutCoordinates = it
                                 setUpFinishedLatch.countDown()
@@ -1934,11 +1891,9 @@
                                             PointerEventType.Press -> {
                                                 ++box2Down
                                             }
-
                                             PointerEventType.Release -> {
                                                 ++box2Up
                                             }
-
                                             else -> {
                                                 eventsThatShouldNotTrigger = true
                                             }
@@ -1946,15 +1901,12 @@
                                     }
                                 }
                             }
-                    ) { }
+                    ) {}
 
                     // Box 3
                     Box(
-                        Modifier
-                            .size(50.dp)
-                            .onGloballyPositioned {
-                                setUpFinishedLatch.countDown()
-                            }
+                        Modifier.size(50.dp)
+                            .onGloballyPositioned { setUpFinishedLatch.countDown() }
                             .pointerInput(Unit) {
                                 awaitPointerEventScope {
                                     while (true) {
@@ -1964,7 +1916,7 @@
                                     }
                                 }
                             }
-                    ) { }
+                    ) {}
                 }
             }
         }
@@ -2099,16 +2051,11 @@
         rule.runOnUiThread {
             container.setContent {
                 Column(
-                    Modifier
-                        .fillMaxSize()
-                        .onGloballyPositioned {
-                            setUpFinishedLatch.countDown()
-                        }
+                    Modifier.fillMaxSize().onGloballyPositioned { setUpFinishedLatch.countDown() }
                 ) {
                     // Box 1
                     Box(
-                        Modifier
-                            .size(50.dp)
+                        Modifier.size(50.dp)
                             .onGloballyPositioned {
                                 box1LayoutCoordinates = it
                                 setUpFinishedLatch.countDown()
@@ -2122,11 +2069,9 @@
                                             PointerEventType.Enter -> {
                                                 ++box1HoverEnter
                                             }
-
                                             PointerEventType.Exit -> {
                                                 ++box1HoverExit
                                             }
-
                                             else -> {
                                                 eventsThatShouldNotTrigger = true
                                             }
@@ -2134,12 +2079,11 @@
                                     }
                                 }
                             }
-                    ) { }
+                    ) {}
 
                     // Box 2
                     Box(
-                        Modifier
-                            .size(50.dp)
+                        Modifier.size(50.dp)
                             .onGloballyPositioned {
                                 box2LayoutCoordinates = it
                                 setUpFinishedLatch.countDown()
@@ -2153,11 +2097,9 @@
                                             PointerEventType.Enter -> {
                                                 ++box2HoverEnter
                                             }
-
                                             PointerEventType.Exit -> {
                                                 ++box2HoverExit
                                             }
-
                                             else -> {
                                                 eventsThatShouldNotTrigger = true
                                             }
@@ -2165,15 +2107,12 @@
                                     }
                                 }
                             }
-                    ) { }
+                    ) {}
 
                     // Box 3
                     Box(
-                        Modifier
-                            .size(50.dp)
-                            .onGloballyPositioned {
-                                setUpFinishedLatch.countDown()
-                            }
+                        Modifier.size(50.dp)
+                            .onGloballyPositioned { setUpFinishedLatch.countDown() }
                             .pointerInput(Unit) {
                                 awaitPointerEventScope {
                                     while (true) {
@@ -2183,7 +2122,7 @@
                                     }
                                 }
                             }
-                    ) { }
+                    ) {}
                 }
             }
         }
@@ -2302,17 +2241,17 @@
         var dynamicModifierExecuted by mutableStateOf(false)
 
         // Non-Pointer Input Modifier that is toggled on/off based on passed value.
-        fun Modifier.dynamicallyToggledModifier(enable: Boolean) = if (enable) {
-            dynamicModifierExecuted = true
-            background(Color.Green)
-        } else this
+        fun Modifier.dynamicallyToggledModifier(enable: Boolean) =
+            if (enable) {
+                dynamicModifierExecuted = true
+                background(Color.Green)
+            } else this
 
         // Setup UI
         rule.runOnUiThread {
             container.setContent {
                 Box(
-                    Modifier
-                        .size(200.dp)
+                    Modifier.size(200.dp)
                         .onGloballyPositioned {
                             box1LayoutCoordinates = it
                             setUpFinishedLatch.countDown()
@@ -2345,7 +2284,7 @@
                                 }
                             }
                         }
-                ) { }
+                ) {}
             }
         }
         // Ensure Arrange (setup) step is finished
@@ -2512,29 +2451,29 @@
         fun Modifier.dynamicallyToggledPointerInput(
             enable: Boolean,
             pointerEventLambda: (pointerEvent: PointerEvent) -> Unit
-        ) = if (enable) {
-            pointerInput(pointerEventLambda) {
-                ++dynamicPointerInputScopeExecutionCount
+        ) =
+            if (enable) {
+                pointerInput(pointerEventLambda) {
+                    ++dynamicPointerInputScopeExecutionCount
 
-                // Reset pointer events when lambda is ran the first time
-                dynamicModifierPress = 0
-                dynamicModifierMove = 0
-                dynamicModifierRelease = 0
+                    // Reset pointer events when lambda is ran the first time
+                    dynamicModifierPress = 0
+                    dynamicModifierMove = 0
+                    dynamicModifierRelease = 0
 
-                awaitPointerEventScope {
-                    while (true) {
-                        pointerEventLambda(awaitPointerEvent())
+                    awaitPointerEventScope {
+                        while (true) {
+                            pointerEventLambda(awaitPointerEvent())
+                        }
                     }
                 }
-            }
-        } else this
+            } else this
 
         // Setup UI
         rule.runOnUiThread {
             container.setContent {
                 Box(
-                    Modifier
-                        .size(200.dp)
+                    Modifier.size(200.dp)
                         .onGloballyPositioned {
                             box1LayoutCoordinates = it
                             setUpFinishedLatch.countDown()
@@ -2582,7 +2521,7 @@
                                 }
                             }
                         }
-                ) { }
+                ) {}
             }
         }
         // Ensure Arrange (setup) step is finished
@@ -2813,29 +2752,29 @@
         fun Modifier.dynamicallyToggledPointerInput(
             enable: Boolean,
             pointerEventLambda: (pointerEvent: PointerEvent) -> Unit
-        ) = if (enable) {
-            pointerInput(Unit) {
-                ++dynamicPointerInputScopeExecutionCount
+        ) =
+            if (enable) {
+                pointerInput(Unit) {
+                    ++dynamicPointerInputScopeExecutionCount
 
-                // Reset pointer events when lambda is ran the first time
-                dynamicModifierPress = 0
-                dynamicModifierMove = 0
-                dynamicModifierRelease = 0
+                    // Reset pointer events when lambda is ran the first time
+                    dynamicModifierPress = 0
+                    dynamicModifierMove = 0
+                    dynamicModifierRelease = 0
 
-                awaitPointerEventScope {
-                    while (true) {
-                        pointerEventLambda(awaitPointerEvent())
+                    awaitPointerEventScope {
+                        while (true) {
+                            pointerEventLambda(awaitPointerEvent())
+                        }
                     }
                 }
-            }
-        } else this
+            } else this
 
         // Setup UI
         rule.runOnUiThread {
             container.setContent {
                 Box(
-                    Modifier
-                        .size(200.dp)
+                    Modifier.size(200.dp)
                         .onGloballyPositioned {
                             box1LayoutCoordinates = it
                             setUpFinishedLatch.countDown()
@@ -2878,7 +2817,7 @@
                                 }
                             }
                         }
-                ) { }
+                ) {}
             }
         }
         // Ensure Arrange (setup) step is finished
@@ -3085,29 +3024,29 @@
         fun Modifier.dynamicallyToggledPointerInput(
             enable: Boolean,
             pointerEventLambda: (pointerEvent: PointerEvent) -> Unit
-        ) = if (enable) {
-            pointerInput(pointerEventLambda) {
-                ++dynamicPointerInputScopeExecutionCount
+        ) =
+            if (enable) {
+                pointerInput(pointerEventLambda) {
+                    ++dynamicPointerInputScopeExecutionCount
 
-                // Reset pointer events when lambda is ran the first time
-                dynamicModifierPress = 0
-                dynamicModifierMove = 0
-                dynamicModifierRelease = 0
+                    // Reset pointer events when lambda is ran the first time
+                    dynamicModifierPress = 0
+                    dynamicModifierMove = 0
+                    dynamicModifierRelease = 0
 
-                awaitPointerEventScope {
-                    while (true) {
-                        pointerEventLambda(awaitPointerEvent())
+                    awaitPointerEventScope {
+                        while (true) {
+                            pointerEventLambda(awaitPointerEvent())
+                        }
                     }
                 }
-            }
-        } else this
+            } else this
 
         // Setup UI
         rule.runOnUiThread {
             container.setContent {
                 Box(
-                    Modifier
-                        .size(200.dp)
+                    Modifier.size(200.dp)
                         .onGloballyPositioned {
                             box1LayoutCoordinates = it
                             setUpFinishedLatch.countDown()
@@ -3155,7 +3094,7 @@
                                 }
                             }
                         }
-                ) { }
+                ) {}
             }
         }
         // Ensure Arrange (setup) step is finished
@@ -3352,8 +3291,7 @@
         rule.runOnUiThread {
             container.setContent {
                 Box(
-                    Modifier
-                        .size(50.dp)
+                    Modifier.size(50.dp)
                         .onGloballyPositioned {
                             box1LayoutCoordinates = it
                             setUpFinishedLatch.countDown()
@@ -3373,23 +3311,18 @@
                                         PointerEventType.Enter -> {
                                             ++hoverEventCount
                                         }
-
                                         PointerEventType.Press -> {
                                             ++downCount
                                         }
-
                                         PointerEventType.Release -> {
                                             ++upCount
                                         }
-
                                         PointerEventType.Exit -> {
                                             ++hoverExitCount
                                         }
-
                                         PointerEventType.Unknown -> {
                                             ++unknownCount
                                         }
-
                                         else -> {
                                             eventsThatShouldNotTrigger = true
                                         }
@@ -3397,7 +3330,7 @@
                                 }
                             }
                         }
-                ) { }
+                ) {}
             }
         }
         // Ensure Arrange (setup) step is finished
@@ -3539,16 +3472,11 @@
         rule.runOnUiThread {
             container.setContent {
                 Column(
-                    Modifier
-                        .fillMaxSize()
-                        .onGloballyPositioned {
-                            setUpFinishedLatch.countDown()
-                        }
+                    Modifier.fillMaxSize().onGloballyPositioned { setUpFinishedLatch.countDown() }
                 ) {
                     // Box 1
                     Box(
-                        Modifier
-                            .size(50.dp)
+                        Modifier.size(50.dp)
                             .onGloballyPositioned {
                                 box1LayoutCoordinates = it
                                 setUpFinishedLatch.countDown()
@@ -3562,19 +3490,15 @@
                                             PointerEventType.Enter -> {
                                                 enterBox1 = true
                                             }
-
                                             PointerEventType.Exit -> {
                                                 enterBox1 = false
                                             }
-
                                             PointerEventType.Press -> {
                                                 pressBox1 = true
                                             }
-
                                             PointerEventType.Release -> {
                                                 pressBox1 = false
                                             }
-
                                             else -> {
                                                 eventsThatShouldNotTrigger = true
                                             }
@@ -3582,15 +3506,12 @@
                                     }
                                 }
                             }
-                    ) { }
+                    ) {}
 
                     // Box 2
                     Box(
-                        Modifier
-                            .size(50.dp)
-                            .onGloballyPositioned {
-                                setUpFinishedLatch.countDown()
-                            }
+                        Modifier.size(50.dp)
+                            .onGloballyPositioned { setUpFinishedLatch.countDown() }
                             .pointerInput(Unit) {
                                 awaitPointerEventScope {
                                     while (true) {
@@ -3600,15 +3521,12 @@
                                     }
                                 }
                             }
-                    ) { }
+                    ) {}
 
                     // Box 3
                     Box(
-                        Modifier
-                            .size(50.dp)
-                            .onGloballyPositioned {
-                                setUpFinishedLatch.countDown()
-                            }
+                        Modifier.size(50.dp)
+                            .onGloballyPositioned { setUpFinishedLatch.countDown() }
                             .pointerInput(Unit) {
                                 awaitPointerEventScope {
                                     while (true) {
@@ -3618,7 +3536,7 @@
                                     }
                                 }
                             }
-                    ) { }
+                    ) {}
                 }
             }
         }
@@ -3648,35 +3566,32 @@
                 // are recreating it here. However, Compose ignores the exit if it is right before
                 // a down (right before meaning within a couple milliseconds). We verify that it
                 // did in fact ignore this exit.
-                val exitMotionEvent = MotionEvent(
-                    0,
-                    ACTION_HOVER_EXIT,
-                    1,
-                    0,
-                    arrayOf(
-                        PointerProperties(0).also { it.toolType = MotionEvent.TOOL_TYPE_MOUSE }
-                    ),
-                    arrayOf(
-                        PointerCoords(pos.x, pos.y, Offset.Zero.x, Offset.Zero.y)
+                val exitMotionEvent =
+                    MotionEvent(
+                        0,
+                        ACTION_HOVER_EXIT,
+                        1,
+                        0,
+                        arrayOf(
+                            PointerProperties(0).also { it.toolType = MotionEvent.TOOL_TYPE_MOUSE }
+                        ),
+                        arrayOf(PointerCoords(pos.x, pos.y, Offset.Zero.x, Offset.Zero.y))
                     )
-                )
 
                 // Press on Box 1
-                val downMotionEvent = MotionEvent(
-                    0,
-                    ACTION_DOWN,
-                    1,
-                    0,
-                    arrayOf(
-                        PointerProperties(0).also { it.toolType = MotionEvent.TOOL_TYPE_MOUSE }
-                    ),
-                    arrayOf(
-                        PointerCoords(pos.x, pos.y, Offset.Zero.x, Offset.Zero.y)
+                val downMotionEvent =
+                    MotionEvent(
+                        0,
+                        ACTION_DOWN,
+                        1,
+                        0,
+                        arrayOf(
+                            PointerProperties(0).also { it.toolType = MotionEvent.TOOL_TYPE_MOUSE }
+                        ),
+                        arrayOf(PointerCoords(pos.x, pos.y, Offset.Zero.x, Offset.Zero.y))
                     )
-                )
 
-                val androidComposeView =
-                    findAndroidComposeView(container) as AndroidComposeView
+                val androidComposeView = findAndroidComposeView(container) as AndroidComposeView
 
                 // Execute events
                 androidComposeView.dispatchHoverEvent(exitMotionEvent)
@@ -3704,9 +3619,7 @@
             }
         }
 
-        rule.runOnUiThread {
-            assertThat(eventsThatShouldNotTrigger).isFalse()
-        }
+        rule.runOnUiThread { assertThat(eventsThatShouldNotTrigger).isFalse() }
     }
 
     @Test
@@ -3728,8 +3641,7 @@
         rule.runOnUiThread {
             container.setContent {
                 Box(
-                    Modifier
-                        .fillMaxSize()
+                    Modifier.fillMaxSize()
                         .onGloballyPositioned {
                             layoutCoordinates = it
                             latch.countDown()
@@ -3749,12 +3661,9 @@
                         }
                 ) {
                     Box(
-                        Modifier
-                            .align(Alignment.Center)
+                        Modifier.align(Alignment.Center)
                             .size(50.dp)
-                            .onGloballyPositioned {
-                                layoutCoordinates2 = it
-                            }
+                            .onGloballyPositioned { layoutCoordinates2 = it }
                             .pointerInput(Unit) {
                                 awaitPointerEventScope {
                                     enter = awaitPointerEvent()
@@ -3799,9 +3708,7 @@
         // Leave outer Box
         dispatchMouseEvent(ACTION_HOVER_EXIT, layoutCoordinates!!)
 
-        rule.runOnUiThread {
-            assertThat(anyOtherEvent).isFalse()
-        }
+        rule.runOnUiThread { assertThat(anyOtherEvent).isFalse() }
         assertTrue(eventLatch.await(1, TimeUnit.SECONDS))
     }
 
@@ -3814,8 +3721,7 @@
         rule.runOnUiThread {
             container.setContent {
                 Box(
-                    Modifier
-                        .fillMaxSize()
+                    Modifier.fillMaxSize()
                         .onGloballyPositioned {
                             layoutCoordinates = it
                             latch.countDown()
@@ -3850,8 +3756,7 @@
         rule.runOnUiThread {
             container.setContent {
                 Box(
-                    Modifier
-                        .fillMaxSize()
+                    Modifier.fillMaxSize()
                         .onGloballyPositioned {
                             layoutCoordinates = it
                             latch.countDown()
@@ -3892,8 +3797,7 @@
         rule.runOnUiThread {
             container.setContent {
                 Box(
-                    Modifier
-                        .fillMaxSize()
+                    Modifier.fillMaxSize()
                         .onGloballyPositioned {
                             layoutCoordinates = it
                             latch.countDown()
@@ -3933,8 +3837,7 @@
         rule.runOnUiThread {
             container.setContent {
                 Box(
-                    Modifier
-                        .fillMaxSize()
+                    Modifier.fillMaxSize()
                         .onGloballyPositioned {
                             layoutCoordinates = it
                             latch.countDown()
@@ -3968,8 +3871,7 @@
         rule.runOnUiThread {
             container.setContent {
                 Box(
-                    Modifier
-                        .fillMaxSize()
+                    Modifier.fillMaxSize()
                         .onGloballyPositioned {
                             layoutCoordinates = it
                             latch.countDown()
@@ -3995,25 +3897,27 @@
             val pointerProperties = PointerProperties(0).apply { toolType = TOOL_TYPE_MOUSE }
             val androidComposeView = findAndroidComposeView(container) as AndroidComposeView
 
-            val hoverExitEvent = MotionEvent(
-                eventTime = 0,
-                action = ACTION_HOVER_EXIT,
-                numPointers = 1,
-                actionIndex = 0,
-                pointerProperties = arrayOf(pointerProperties),
-                pointerCoords = arrayOf(pointerCoords),
-                buttonState = 0,
-            )
+            val hoverExitEvent =
+                MotionEvent(
+                    eventTime = 0,
+                    action = ACTION_HOVER_EXIT,
+                    numPointers = 1,
+                    actionIndex = 0,
+                    pointerProperties = arrayOf(pointerProperties),
+                    pointerCoords = arrayOf(pointerCoords),
+                    buttonState = 0,
+                )
             androidComposeView.dispatchHoverEvent(hoverExitEvent)
 
-            val downEvent = MotionEvent(
-                eventTime = 0,
-                action = ACTION_DOWN,
-                numPointers = 1,
-                actionIndex = 0,
-                pointerProperties = arrayOf(pointerProperties),
-                pointerCoords = arrayOf(pointerCoords),
-            )
+            val downEvent =
+                MotionEvent(
+                    eventTime = 0,
+                    action = ACTION_DOWN,
+                    numPointers = 1,
+                    actionIndex = 0,
+                    pointerProperties = arrayOf(pointerProperties),
+                    pointerCoords = arrayOf(pointerCoords),
+                )
             androidComposeView.dispatchTouchEvent(downEvent)
         }
 
@@ -4032,16 +3936,13 @@
         rule.runOnUiThread {
             container.setContent {
                 Box(
-                    Modifier
-                        .fillMaxSize()
-                        .onGloballyPositioned {
-                            outerCoordinates = it
-                            latch.countDown()
-                        }
+                    Modifier.fillMaxSize().onGloballyPositioned {
+                        outerCoordinates = it
+                        latch.countDown()
+                    }
                 ) {
                     Box(
-                        Modifier
-                            .align(Alignment.Center)
+                        Modifier.align(Alignment.Center)
                             .size(50.dp)
                             .pointerInput(Unit) {
                                 awaitPointerEventScope {
@@ -4086,8 +3987,7 @@
             container.setContent {
                 Box(Modifier.fillMaxSize()) {
                     Box(
-                        Modifier
-                            .align(AbsoluteAlignment.TopLeft)
+                        Modifier.align(AbsoluteAlignment.TopLeft)
                             .size(50.dp)
                             .pointerInput(Unit) {
                                 awaitPointerEventScope {
@@ -4102,8 +4002,7 @@
                             }
                     )
                     Box(
-                        Modifier
-                            .align(AbsoluteAlignment.BottomRight)
+                        Modifier.align(AbsoluteAlignment.BottomRight)
                             .size(50.dp)
                             .pointerInput(Unit) {
                                 awaitPointerEventScope {
@@ -4141,14 +4040,9 @@
             container.setContent {
                 Box(Modifier.fillMaxSize()) {
                     Box(
-                        Modifier
-                            .align(Alignment.BottomCenter)
+                        Modifier.align(Alignment.BottomCenter)
                             .size(50.dp)
-                            .graphicsLayer {
-                                translationY = 25.dp
-                                    .roundToPx()
-                                    .toFloat()
-                            }
+                            .graphicsLayer { translationY = 25.dp.roundToPx().toFloat() }
                             .pointerInput(Unit) {
                                 awaitPointerEventScope {
                                     while (true) {
@@ -4191,19 +4085,10 @@
         rule.runOnUiThread {
             container.setContent {
                 Box(Modifier.fillMaxSize()) {
-                    Box(
-                        Modifier
-                            .align(Alignment.TopCenter)
-                            .requiredSize(50.dp)
-                            .clipToBounds()) {
+                    Box(Modifier.align(Alignment.TopCenter).requiredSize(50.dp).clipToBounds()) {
                         Box(
-                            Modifier
-                                .requiredSize(50.dp)
-                                .graphicsLayer {
-                                    translationY = 25.dp
-                                        .roundToPx()
-                                        .toFloat()
-                                }
+                            Modifier.requiredSize(50.dp)
+                                .graphicsLayer { translationY = 25.dp.roundToPx().toFloat() }
                                 .pointerInput(Unit) {
                                     awaitPointerEventScope {
                                         while (true) {
@@ -4244,21 +4129,21 @@
         val latch = CountDownLatch(1)
         rule.runOnUiThread {
             container.setContent {
-                Box(Modifier
-                    .fillMaxSize()
-                    .pointerInput(Unit) {
-                        awaitPointerEventScope {
-                            while (true) {
-                                val event = awaitPointerEvent()
-                                event.changes[0].consume()
-                                eventLog += event
+                Box(
+                    Modifier.fillMaxSize()
+                        .pointerInput(Unit) {
+                            awaitPointerEventScope {
+                                while (true) {
+                                    val event = awaitPointerEvent()
+                                    event.changes[0].consume()
+                                    eventLog += event
+                                }
                             }
                         }
-                    }
-                    .onGloballyPositioned {
-                        innerCoordinates = it
-                        latch.countDown()
-                    }
+                        .onGloballyPositioned {
+                            innerCoordinates = it
+                            latch.countDown()
+                        }
                 )
             }
         }
@@ -4277,14 +4162,15 @@
         dispatchMouseEvent(ACTION_DOWN, coords)
         dispatchMouseEvent(ACTION_MOVE, coords, Offset(0f, 1f))
 
-        val motionEvent = MotionEvent(
-            5,
-            ACTION_DOWN,
-            1,
-            0,
-            arrayOf(PointerProperties(10).also { it.toolType = TOOL_TYPE_FINGER }),
-            arrayOf(PointerCoords(1f, 1f))
-        )
+        val motionEvent =
+            MotionEvent(
+                5,
+                ACTION_DOWN,
+                1,
+                0,
+                arrayOf(PointerProperties(10).also { it.toolType = TOOL_TYPE_FINGER }),
+                arrayOf(PointerCoords(1f, 1f))
+            )
 
         container.dispatchTouchEvent(motionEvent)
         rule.runOnUiThread {
@@ -4388,29 +4274,31 @@
             val root = coords.findRootCoordinates()
             val pos = root.localPositionOf(coords, Offset.Zero)
             val androidComposeView = findAndroidComposeView(container) as AndroidComposeView
-            val exit = MotionEvent(
-                0,
-                ACTION_HOVER_EXIT,
-                1,
-                0,
-                arrayOf(PointerProperties(0).also {
-                    it.toolType = MotionEvent.TOOL_TYPE_STYLUS
-                }),
-                arrayOf(PointerCoords(pos.x, pos.y))
-            )
+            val exit =
+                MotionEvent(
+                    0,
+                    ACTION_HOVER_EXIT,
+                    1,
+                    0,
+                    arrayOf(
+                        PointerProperties(0).also { it.toolType = MotionEvent.TOOL_TYPE_STYLUS }
+                    ),
+                    arrayOf(PointerCoords(pos.x, pos.y))
+                )
 
             androidComposeView.dispatchHoverEvent(exit)
 
-            val down = MotionEvent(
-                0,
-                ACTION_DOWN,
-                1,
-                0,
-                arrayOf(PointerProperties(0).also {
-                    it.toolType = MotionEvent.TOOL_TYPE_FINGER
-                }),
-                arrayOf(PointerCoords(pos.x, pos.y))
-            )
+            val down =
+                MotionEvent(
+                    0,
+                    ACTION_DOWN,
+                    1,
+                    0,
+                    arrayOf(
+                        PointerProperties(0).also { it.toolType = MotionEvent.TOOL_TYPE_FINGER }
+                    ),
+                    arrayOf(PointerCoords(pos.x, pos.y))
+                )
             androidComposeView.dispatchTouchEvent(down)
         }
 
@@ -4451,39 +4339,31 @@
             container.setContent {
                 Column(Modifier.fillMaxSize()) {
                     Box(
-                        Modifier
-                            .size(50.dp)
-                            .pointerInput(Unit) {
-                                awaitPointerEventScope {
-                                    while (true) {
-                                        awaitPointerEvent()
-                                    }
-                                }
-                            })
-                    Box(
-                        Modifier
-                            .size(50.dp)
-                            .clipToBounds()) {
-                        Box(Modifier
-                            .size(50.dp)
-                            .graphicsLayer {
-                                translationY = -25.dp
-                                    .roundToPx()
-                                    .toFloat()
-                            }
-                            .pointerInput(Unit) {
-                                awaitPointerEventScope {
-                                    while (true) {
-                                        val event = awaitPointerEvent()
-                                        event.changes[0].consume()
-                                        eventLog += event.type
-                                    }
+                        Modifier.size(50.dp).pointerInput(Unit) {
+                            awaitPointerEventScope {
+                                while (true) {
+                                    awaitPointerEvent()
                                 }
                             }
-                            .onGloballyPositioned {
-                                innerCoordinates = it
-                                latch.countDown()
-                            }
+                        }
+                    )
+                    Box(Modifier.size(50.dp).clipToBounds()) {
+                        Box(
+                            Modifier.size(50.dp)
+                                .graphicsLayer { translationY = -25.dp.roundToPx().toFloat() }
+                                .pointerInput(Unit) {
+                                    awaitPointerEventScope {
+                                        while (true) {
+                                            val event = awaitPointerEvent()
+                                            event.changes[0].consume()
+                                            eventLog += event.type
+                                        }
+                                    }
+                                }
+                                .onGloballyPositioned {
+                                    innerCoordinates = it
+                                    latch.countDown()
+                                }
                         )
                     }
                 }
@@ -4499,36 +4379,37 @@
         // Hit the bottom box, but clipped
         dispatchMouseEvent(ACTION_HOVER_MOVE, coords)
         dispatchMouseEvent(
-            ACTION_HOVER_MOVE, coords,
+            ACTION_HOVER_MOVE,
+            coords,
             Offset(0f, (coords.size.height / 2 - 1).toFloat())
         )
 
-        rule.runOnUiThread {
-            assertThat(eventLog).isEmpty()
-        }
+        rule.runOnUiThread { assertThat(eventLog).isEmpty() }
 
         // Now hit the box in the unclipped region
         dispatchMouseEvent(
-            ACTION_HOVER_MOVE, coords,
+            ACTION_HOVER_MOVE,
+            coords,
             Offset(0f, (coords.size.height / 2 + 1).toFloat())
         )
 
         // Now hit the bottom of the clipped region
         dispatchMouseEvent(
-            ACTION_HOVER_MOVE, coords,
+            ACTION_HOVER_MOVE,
+            coords,
             Offset(0f, (coords.size.height - 1).toFloat())
         )
 
         // Now leave
-        dispatchMouseEvent(
-            ACTION_HOVER_MOVE, coords,
-            Offset(0f, coords.size.height.toFloat() + 1f)
-        )
+        dispatchMouseEvent(ACTION_HOVER_MOVE, coords, Offset(0f, coords.size.height.toFloat() + 1f))
 
         rule.runOnUiThread {
-            assertThat(eventLog).containsExactly(
-                PointerEventType.Enter, PointerEventType.Move, PointerEventType.Exit
-            )
+            assertThat(eventLog)
+                .containsExactly(
+                    PointerEventType.Enter,
+                    PointerEventType.Move,
+                    PointerEventType.Exit
+                )
         }
     }
 
@@ -4541,39 +4422,31 @@
             container.setContent {
                 Column(Modifier.fillMaxSize()) {
                     Box(
-                        Modifier
-                            .size(50.dp)
-                            .pointerInput(Unit) {
-                                awaitPointerEventScope {
-                                    while (true) {
-                                        awaitPointerEvent()
-                                    }
-                                }
-                            })
-                    Box(
-                        Modifier
-                            .size(20.dp)
-                            .clipToBounds()) {
-                        Box(Modifier
-                            .size(20.dp)
-                            .graphicsLayer {
-                                translationY = -10.dp
-                                    .roundToPx()
-                                    .toFloat()
-                            }
-                            .pointerInput(Unit) {
-                                awaitPointerEventScope {
-                                    while (true) {
-                                        val event = awaitPointerEvent()
-                                        event.changes[0].consume()
-                                        eventLog += event.type
-                                    }
+                        Modifier.size(50.dp).pointerInput(Unit) {
+                            awaitPointerEventScope {
+                                while (true) {
+                                    awaitPointerEvent()
                                 }
                             }
-                            .onGloballyPositioned {
-                                innerCoordinates = it
-                                latch.countDown()
-                            }
+                        }
+                    )
+                    Box(Modifier.size(20.dp).clipToBounds()) {
+                        Box(
+                            Modifier.size(20.dp)
+                                .graphicsLayer { translationY = -10.dp.roundToPx().toFloat() }
+                                .pointerInput(Unit) {
+                                    awaitPointerEventScope {
+                                        while (true) {
+                                            val event = awaitPointerEvent()
+                                            event.changes[0].consume()
+                                            eventLog += event.type
+                                        }
+                                    }
+                                }
+                                .onGloballyPositioned {
+                                    innerCoordinates = it
+                                    latch.countDown()
+                                }
                         )
                     }
                 }
@@ -4591,9 +4464,7 @@
         dispatchMouseEvent(ACTION_DOWN, coords)
         dispatchMouseEvent(ACTION_UP, coords)
 
-        rule.runOnUiThread {
-            assertThat(eventLog).isEmpty()
-        }
+        rule.runOnUiThread { assertThat(eventLog).isEmpty() }
 
         // Hit the bottom box in the unclipped region
         val topOfUnclipped = Offset(0f, (coords.size.height / 2 + 1).toFloat())
@@ -4611,14 +4482,15 @@
         dispatchMouseEvent(ACTION_UP, coords, justBelow)
 
         rule.runOnUiThread {
-            assertThat(eventLog).containsExactly(
-                PointerEventType.Press,
-                PointerEventType.Release,
-                PointerEventType.Press,
-                PointerEventType.Release,
-                PointerEventType.Press,
-                PointerEventType.Release,
-            )
+            assertThat(eventLog)
+                .containsExactly(
+                    PointerEventType.Press,
+                    PointerEventType.Release,
+                    PointerEventType.Press,
+                    PointerEventType.Release,
+                    PointerEventType.Press,
+                    PointerEventType.Release,
+                )
         }
     }
 
@@ -4631,32 +4503,30 @@
         rule.runOnUiThread {
             container.setContent {
                 Box(
-                    Modifier
-                        .fillMaxSize()
-                        .pointerInput(Unit) {
-                            awaitPointerEventScope {
-                                while (true) {
-                                    awaitPointerEvent()
-                                }
+                    Modifier.fillMaxSize().pointerInput(Unit) {
+                        awaitPointerEventScope {
+                            while (true) {
+                                awaitPointerEvent()
                             }
                         }
+                    }
                 ) {
-                    Box(Modifier
-                        .size(50.dp)
-                        .align(AbsoluteAlignment.BottomRight)
-                        .pointerInput(Unit) {
-                            awaitPointerEventScope {
-                                while (true) {
-                                    val event = awaitPointerEvent()
-                                    event.changes.forEach { it.consume() }
-                                    eventLog += event
+                    Box(
+                        Modifier.size(50.dp)
+                            .align(AbsoluteAlignment.BottomRight)
+                            .pointerInput(Unit) {
+                                awaitPointerEventScope {
+                                    while (true) {
+                                        val event = awaitPointerEvent()
+                                        event.changes.forEach { it.consume() }
+                                        eventLog += event
+                                    }
                                 }
                             }
-                        }
-                        .onGloballyPositioned {
-                            innerCoordinates = it
-                            latch.countDown()
-                        }
+                            .onGloballyPositioned {
+                                innerCoordinates = it
+                                latch.countDown()
+                            }
                     )
                 }
             }
@@ -4693,26 +4563,25 @@
         rule.runOnUiThread {
             container.setContent {
                 Box(Modifier.fillMaxSize()) {
-                    Box(Modifier
-                        .size(50.dp)
-                        .align(AbsoluteAlignment.TopLeft)
-                        .pointerInput(Unit) {
-                            awaitPointerEventScope {
-                                while (true) {
-                                    val event = awaitPointerEvent()
-                                    event.changes.forEach { it.consume() }
-                                    eventLog += event
+                    Box(
+                        Modifier.size(50.dp)
+                            .align(AbsoluteAlignment.TopLeft)
+                            .pointerInput(Unit) {
+                                awaitPointerEventScope {
+                                    while (true) {
+                                        val event = awaitPointerEvent()
+                                        event.changes.forEach { it.consume() }
+                                        eventLog += event
+                                    }
                                 }
                             }
-                        }
-                        .onGloballyPositioned {
-                            hitCoordinates = it
-                            latch.countDown()
-                        }
+                            .onGloballyPositioned {
+                                hitCoordinates = it
+                                latch.countDown()
+                            }
                     )
                     Box(
-                        Modifier
-                            .size(50.dp)
+                        Modifier.size(50.dp)
                             .align(AbsoluteAlignment.BottomRight)
                             .onGloballyPositioned {
                                 missCoordinates = it
@@ -4761,23 +4630,17 @@
             1,
             0,
             arrayOf(PointerProperties(0)),
-            arrayOf(
-                PointerCoords(
-                    locationInWindow[0].toFloat(),
-                    locationInWindow[1].toFloat()
-                )
-            )
+            arrayOf(PointerCoords(locationInWindow[0].toFloat(), locationInWindow[1].toFloat()))
         )
 }
 
 @Composable
 fun AndroidWithCompose(context: Context, androidPadding: Int, content: @Composable () -> Unit) {
-    val anotherLayout = ComposeView(context).also { view ->
-        view.setContent {
-            content()
+    val anotherLayout =
+        ComposeView(context).also { view ->
+            view.setContent { content() }
+            view.setPadding(androidPadding, androidPadding, androidPadding, androidPadding)
         }
-        view.setPadding(androidPadding, androidPadding, androidPadding, androidPadding)
-    }
     AndroidView({ anotherLayout })
 }
 
@@ -4808,9 +4671,7 @@
         bounds: IntSize
     ) {
         if (consumeMovement) {
-            pointerEvent.changes.fastForEach {
-                it.consume()
-            }
+            pointerEvent.changes.fastForEach { it.consume() }
         }
     }
 
@@ -4819,6 +4680,7 @@
 
 private class ConsumeDownChangeFilter : PointerInputFilter() {
     var onDown by mutableStateOf<(Offset) -> Unit>({})
+
     override fun onPointerEvent(
         pointerEvent: PointerEvent,
         pass: PointerEventPass,
@@ -4874,16 +4736,20 @@
     actionIndex: Int,
     pointerProperties: Array<MotionEvent.PointerProperties>,
     pointerCoords: Array<MotionEvent.PointerCoords>,
-    buttonState: Int = if (
-        pointerProperties[0].toolType == TOOL_TYPE_MOUSE &&
-        (action == ACTION_DOWN || action == ACTION_MOVE)
-    ) MotionEvent.BUTTON_PRIMARY else 0,
+    buttonState: Int =
+        if (
+            pointerProperties[0].toolType == TOOL_TYPE_MOUSE &&
+                (action == ACTION_DOWN || action == ACTION_MOVE)
+        )
+            MotionEvent.BUTTON_PRIMARY
+        else 0,
 ): MotionEvent {
-    val source = if (pointerProperties[0].toolType == TOOL_TYPE_MOUSE) {
-        InputDevice.SOURCE_MOUSE
-    } else {
-        InputDevice.SOURCE_TOUCHSCREEN
-    }
+    val source =
+        if (pointerProperties[0].toolType == TOOL_TYPE_MOUSE) {
+            InputDevice.SOURCE_MOUSE
+        } else {
+            InputDevice.SOURCE_TOUCHSCREEN
+        }
     return MotionEvent.obtain(
         0,
         eventTime.toLong(),
diff --git a/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/input/pointer/ClipPointerInputTest.kt b/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/input/pointer/ClipPointerInputTest.kt
index a845d2f..b7d40a9 100644
--- a/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/input/pointer/ClipPointerInputTest.kt
+++ b/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/input/pointer/ClipPointerInputTest.kt
@@ -75,21 +75,14 @@
      *
      *     0   1   2   3   4
      *   .........   .........
-     * 0 .     t .   . t     .
-     *   .   |---|---|---|   .
-     * 1 . t | t |   | t | t .
-     *   ....|---|   |---|....
-     * 2     |           |
-     *   ....|---|   |---|....
-     * 3 . t | t |   | t | t .
-     *   .   |---|---|---|   .
-     * 4 .     t .   . t     .
-     *   .........   .........
+     *
+     * 0 . t . . t . . |---|---|---| . 1 . t | t | | t | t . ....|---| |---|.... 2 | | ....|---|
+     * |---|.... 3 . t | t | | t | t . . |---|---|---| . 4 . t . . t . ......... .........
      *
      * 4 LayoutNodes with PointerInputModifiers that are positioned by offset modifiers and where
-     * pointer input is clipped by a modifier on the parent. 4 touches touch just inside the
-     * parent LayoutNode and inside the child LayoutNodes. 8 touches touch just outside the
-     * parent LayoutNode but inside the child LayoutNodes.
+     * pointer input is clipped by a modifier on the parent. 4 touches touch just inside the parent
+     * LayoutNode and inside the child LayoutNodes. 8 touches touch just outside the parent
+     * LayoutNode but inside the child LayoutNodes.
      *
      * Because clipToBounds is being used on the parent LayoutNode, only the 4 touches inside the
      * parent LayoutNode should hit.
@@ -107,35 +100,31 @@
 
         rule.runOnUiThreadIR {
             activity.setContent {
+                val children =
+                    @Composable {
+                        Child(loggingPim1)
+                        Child(loggingPim2)
+                        Child(loggingPim3)
+                        Child(loggingPim4)
+                    }
 
-                val children = @Composable {
-                    Child(loggingPim1)
-                    Child(loggingPim2)
-                    Child(loggingPim3)
-                    Child(loggingPim4)
-                }
-
-                val middle = @Composable {
-                    Layout(
-                        content = children,
-                        modifier = Modifier.clipToBounds()
-                    ) { measurables, constraints ->
-                        val placeables = measurables.map { m ->
-                            m.measure(constraints)
-                        }
-                        layout(3, 3) {
-                            placeables[0].place((-1), (-1))
-                            placeables[1].place(2, (-1))
-                            placeables[2].place((-1), 2)
-                            placeables[3].place(2, 2)
+                val middle =
+                    @Composable {
+                        Layout(content = children, modifier = Modifier.clipToBounds()) {
+                            measurables,
+                            constraints ->
+                            val placeables = measurables.map { m -> m.measure(constraints) }
+                            layout(3, 3) {
+                                placeables[0].place((-1), (-1))
+                                placeables[1].place(2, (-1))
+                                placeables[2].place((-1), 2)
+                                placeables[3].place(2, 2)
+                            }
                         }
                     }
-                }
 
                 Layout(content = middle) { measurables, constraints ->
-                    val placeables = measurables.map { m ->
-                        m.measure(constraints)
-                    }
+                    val placeables = measurables.map { m -> m.measure(constraints) }
                     layout(constraints.maxWidth, constraints.maxHeight) {
                         placeables[0].place(1, 1)
                         setupLatch.countDown()
@@ -149,13 +138,7 @@
 
         assertThat(setupLatch.await(2, TimeUnit.SECONDS)).isTrue()
 
-        val offsetsThatHit =
-            listOf(
-                Offset(1f, 1f),
-                Offset(3f, 1f),
-                Offset(1f, 3f),
-                Offset(3f, 3f)
-            )
+        val offsetsThatHit = listOf(Offset(1f, 1f), Offset(3f, 1f), Offset(1f, 3f), Offset(3f, 3f))
         val offsetsThatMiss =
             listOf(
                 Offset(1f, 0f),
@@ -184,11 +167,7 @@
         }
 
         // Act
-        rule.runOnUiThreadIR {
-            downEvents.forEach {
-                view.dispatchTouchEvent(it)
-            }
-        }
+        rule.runOnUiThreadIR { downEvents.forEach { view.dispatchTouchEvent(it) } }
 
         // Assert
 
@@ -203,21 +182,14 @@
      *
      *     0   1   2   3   4
      *   .........   .........
-     * 0 .     t .   . t     .
-     *   .   |---|---|---|   .
-     * 1 . t | t |   | t | t .
-     *   ....|---|   |---|....
-     * 2     |           |
-     *   ....|---|   |---|....
-     * 3 . t | t |   | t | t .
-     *   .   |---|---|---|   .
-     * 4 .     t .   . t     .
-     *   .........   .........
+     *
+     * 0 . t . . t . . |---|---|---| . 1 . t | t | | t | t . ....|---| |---|.... 2 | | ....|---|
+     * |---|.... 3 . t | t | | t | t . . |---|---|---| . 4 . t . . t . ......... .........
      *
      * 4 LayoutNodes with PointerInputModifiers that are positioned by offset modifiers and where
-     * pointer input is clipped by a modifier on the parent. 4 touches touch just inside the
-     * parent LayoutNode and inside the child LayoutNodes. 8 touches touch just outside the
-     * parent LayoutNode but inside the child LayoutNodes.
+     * pointer input is clipped by a modifier on the parent. 4 touches touch just inside the parent
+     * LayoutNode and inside the child LayoutNodes. 8 touches touch just outside the parent
+     * LayoutNode but inside the child LayoutNodes.
      *
      * Because clipToBounds is being used on the parent LayoutNode, only the 4 touches inside the
      * parent LayoutNode should hit.
@@ -235,34 +207,27 @@
 
         rule.runOnUiThreadIR {
             activity.setContent {
-
                 with(LocalDensity.current) {
+                    val children =
+                        @Composable {
+                            Child(Modifier.offset((-1f).toDp(), (-1f).toDp()).then(loggingPim1))
+                            Child(Modifier.offset(2f.toDp(), (-1f).toDp()).then(loggingPim2))
+                            Child(Modifier.offset((-1f).toDp(), 2f.toDp()).then(loggingPim3))
+                            Child(Modifier.offset(2f.toDp(), 2f.toDp()).then(loggingPim4))
+                        }
 
-                    val children = @Composable {
-                        Child(Modifier.offset((-1f).toDp(), (-1f).toDp()).then(loggingPim1))
-                        Child(Modifier.offset(2f.toDp(), (-1f).toDp()).then(loggingPim2))
-                        Child(Modifier.offset((-1f).toDp(), 2f.toDp()).then(loggingPim3))
-                        Child(Modifier.offset(2f.toDp(), 2f.toDp()).then(loggingPim4))
-                    }
-
-                    val middle = @Composable {
-                        Layout(
-                            content = children,
-                            modifier = Modifier.clipToBounds()
-                        ) { measurables, constraints ->
-                            val placeables = measurables.map { m ->
-                                m.measure(constraints)
-                            }
-                            layout(3, 3) {
-                                placeables.forEach { it.place(0, 0) }
+                    val middle =
+                        @Composable {
+                            Layout(content = children, modifier = Modifier.clipToBounds()) {
+                                measurables,
+                                constraints ->
+                                val placeables = measurables.map { m -> m.measure(constraints) }
+                                layout(3, 3) { placeables.forEach { it.place(0, 0) } }
                             }
                         }
-                    }
 
                     Layout(content = middle) { measurables, constraints ->
-                        val placeables = measurables.map { m ->
-                            m.measure(constraints)
-                        }
+                        val placeables = measurables.map { m -> m.measure(constraints) }
                         layout(constraints.maxWidth, constraints.maxHeight) {
                             placeables[0].place(1, 1)
                             setupLatch.countDown()
@@ -277,13 +242,7 @@
 
         assertThat(setupLatch.await(2, TimeUnit.SECONDS)).isTrue()
 
-        val offsetsThatHit =
-            listOf(
-                Offset(1f, 1f),
-                Offset(3f, 1f),
-                Offset(1f, 3f),
-                Offset(3f, 3f)
-            )
+        val offsetsThatHit = listOf(Offset(1f, 1f), Offset(3f, 1f), Offset(1f, 3f), Offset(3f, 3f))
         val offsetsThatMiss =
             listOf(
                 Offset(1f, 0f),
@@ -312,11 +271,7 @@
         }
 
         // Act
-        rule.runOnUiThreadIR {
-            downEvents.forEach {
-                view.dispatchTouchEvent(it)
-            }
-        }
+        rule.runOnUiThreadIR { downEvents.forEach { view.dispatchTouchEvent(it) } }
 
         // Assert
 
@@ -327,8 +282,8 @@
     }
 
     /**
-     * This test creates a layout clipped to a rounded rectangle shape (circle).
-     * We'll touch in and out of the rounded area.
+     * This test creates a layout clipped to a rounded rectangle shape (circle). We'll touch in and
+     * out of the rounded area.
      */
     @SdkSuppress(maxSdkVersion = 33) // b/321823104
     @Test
@@ -337,9 +292,8 @@
     }
 
     /**
-     * This test creates a layout clipped to a rounded rectangle shape (circle), but the
-     * corners are defined as larger than the side length
-     * We'll touch in and out of the rounded area.
+     * This test creates a layout clipped to a rounded rectangle shape (circle), but the corners are
+     * defined as larger than the side length We'll touch in and out of the rounded area.
      */
     @SdkSuppress(maxSdkVersion = 33) // b/321823104
     @Test
@@ -348,22 +302,18 @@
     }
 
     /**
-     * This test creates a layout clipped to a generic shape (circle).
-     * We'll touch in and out of the rounded area.
+     * This test creates a layout clipped to a generic shape (circle). We'll touch in and out of the
+     * rounded area.
      */
     @SdkSuppress(maxSdkVersion = 33) // b/321823104
     @Test
     fun clip_genericShape() {
-        pokeAroundCircle(
-            GenericShape { size, _ ->
-                addOval(Rect(0f, 0f, size.width, size.height))
-            }
-        )
+        pokeAroundCircle(GenericShape { size, _ -> addOval(Rect(0f, 0f, size.width, size.height)) })
     }
 
     /**
-     * This test creates a layout clipped to a circle shape.
-     * We'll touch in and out of the rounded area.
+     * This test creates a layout clipped to a circle shape. We'll touch in and out of the rounded
+     * area.
      */
     fun pokeAroundCircle(shape: Shape) {
 
@@ -374,15 +324,13 @@
         rule.runOnUiThreadIR {
             activity.setContent {
                 Child(
-                    Modifier.clip(shape)
-                        .then(loggingPim)
-                        .layout { measurable, constraints ->
-                            val p = measurable.measure(constraints)
-                            layout(p.width, p.height) {
-                                p.place(0, 0)
-                                setupLatch.countDown()
-                            }
+                    Modifier.clip(shape).then(loggingPim).layout { measurable, constraints ->
+                        val p = measurable.measure(constraints)
+                        layout(p.width, p.height) {
+                            p.place(0, 0)
+                            setupLatch.countDown()
                         }
+                    }
                 )
             }
 
@@ -438,11 +386,7 @@
         }
 
         // Act
-        rule.runOnUiThreadIR {
-            downEvents.forEach {
-                view.dispatchTouchEvent(it)
-            }
-        }
+        rule.runOnUiThreadIR { downEvents.forEach { view.dispatchTouchEvent(it) } }
 
         // Assert
         assertThat(loggingPim.log).isEqualTo(offsetsThatHit)
@@ -455,21 +399,22 @@
     @SdkSuppress(maxSdkVersion = 33) // b/321823104
     @Test
     fun clip_smallRect() {
-        val rectangleShape: Shape = object : Shape {
-            override fun createOutline(
-                size: Size,
-                layoutDirection: LayoutDirection,
-                density: Density
-            ) =
-                Outline.Rectangle(
-                    Rect(
-                        size.width * 0.25f,
-                        size.height * 0.25f,
-                        size.width * 0.75f,
-                        size.height * 0.75f,
+        val rectangleShape: Shape =
+            object : Shape {
+                override fun createOutline(
+                    size: Size,
+                    layoutDirection: LayoutDirection,
+                    density: Density
+                ) =
+                    Outline.Rectangle(
+                        Rect(
+                            size.width * 0.25f,
+                            size.height * 0.25f,
+                            size.width * 0.75f,
+                            size.height * 0.75f,
+                        )
                     )
-                )
-        }
+            }
 
         val setupLatch = CountDownLatch(1)
 
@@ -478,15 +423,14 @@
         rule.runOnUiThreadIR {
             activity.setContent {
                 Child(
-                    Modifier.clip(rectangleShape)
-                        .then(loggingPim)
-                        .layout { measurable, constraints ->
-                            val p = measurable.measure(constraints)
-                            layout(p.width, p.height) {
-                                p.place(0, 0)
-                                setupLatch.countDown()
-                            }
+                    Modifier.clip(rectangleShape).then(loggingPim).layout { measurable, constraints
+                        ->
+                        val p = measurable.measure(constraints)
+                        layout(p.width, p.height) {
+                            p.place(0, 0)
+                            setupLatch.countDown()
                         }
+                    }
                 )
             }
 
@@ -505,12 +449,10 @@
                 Offset(justIn, 0.5f),
                 Offset(0.5f, justIn),
                 Offset(justIn, justIn),
-
                 Offset(1f, 0.5f),
                 Offset(0.5f, 1f),
                 Offset(1f, justIn),
                 Offset(justIn, 1f),
-
                 Offset(1f, 1f),
             )
         val offsetsThatMiss =
@@ -541,11 +483,7 @@
         }
 
         // Act
-        rule.runOnUiThreadIR {
-            downEvents.forEach {
-                view.dispatchTouchEvent(it)
-            }
-        }
+        rule.runOnUiThreadIR { downEvents.forEach { view.dispatchTouchEvent(it) } }
 
         // Assert
         assertThat(loggingPim.log).isEqualTo(offsetsThatHit)
@@ -553,31 +491,30 @@
 
     @Composable
     fun Child(modifier: Modifier) {
-        Layout(content = {}, modifier = modifier) { _, _ ->
-            layout(2, 2) {}
-        }
+        Layout(content = {}, modifier = modifier) { _, _ -> layout(2, 2) {} }
     }
 
     class LoggingPim : PointerInputModifier {
         val log = mutableListOf<Offset>()
 
-        override val pointerInputFilter = object : PointerInputFilter() {
-            override fun onPointerEvent(
-                pointerEvent: PointerEvent,
-                pass: PointerEventPass,
-                bounds: IntSize
-            ) {
-                if (pass == PointerEventPass.Initial) {
-                    pointerEvent.changes.forEach {
-                        println("testtest, bounds: $bounds")
-                        log.add(it.position)
+        override val pointerInputFilter =
+            object : PointerInputFilter() {
+                override fun onPointerEvent(
+                    pointerEvent: PointerEvent,
+                    pass: PointerEventPass,
+                    bounds: IntSize
+                ) {
+                    if (pass == PointerEventPass.Initial) {
+                        pointerEvent.changes.forEach {
+                            println("testtest, bounds: $bounds")
+                            log.add(it.position)
+                        }
                     }
                 }
-            }
 
-            override fun onCancel() {
-                // Nothing
+                override fun onCancel() {
+                    // Nothing
+                }
             }
-        }
     }
 }
diff --git a/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/input/pointer/HitPathTrackerTest.kt b/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/input/pointer/HitPathTrackerTest.kt
index 4d36527..92b2170 100644
--- a/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/input/pointer/HitPathTrackerTest.kt
+++ b/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/input/pointer/HitPathTrackerTest.kt
@@ -88,9 +88,7 @@
 class HitPathTrackerTest {
 
     private lateinit var hitPathTracker: HitPathTracker
-    private val layoutNode = LayoutNode(0, 0, 100, 100).also {
-        it.attach(MockOwner())
-    }
+    private val layoutNode = LayoutNode(0, 0, 100, 100).also { it.attach(MockOwner()) }
 
     @Before
     fun setup() {
@@ -106,23 +104,20 @@
 
         hitPathTracker.addHitPath(pointerId, listOf(pif1, pif2, pif3))
 
-        val expectedRoot = NodeParent().apply {
-            children.add(
-                Node(pif1).apply {
-                    pointerIds.add(pointerId)
-                    children.add(
-                        Node(pif2).apply {
-                            pointerIds.add(pointerId)
-                            children.add(
-                                Node(pif3).apply {
-                                    pointerIds.add(pointerId)
-                                }
-                            )
-                        }
-                    )
-                }
-            )
-        }
+        val expectedRoot =
+            NodeParent().apply {
+                children.add(
+                    Node(pif1).apply {
+                        pointerIds.add(pointerId)
+                        children.add(
+                            Node(pif2).apply {
+                                pointerIds.add(pointerId)
+                                children.add(Node(pif3).apply { pointerIds.add(pointerId) })
+                            }
+                        )
+                    }
+                )
+            }
         assertThat(areEqual(hitPathTracker.root, expectedRoot)).isTrue()
     }
 
@@ -140,38 +135,31 @@
         hitPathTracker.addHitPath(pointerId1, listOf(pif1, pif2, pif3))
         hitPathTracker.addHitPath(pointerId2, listOf(pif4, pif5, pif6))
 
-        val expectedRoot = NodeParent().apply {
-            children.add(
-                Node(pif1).apply {
-                    pointerIds.add(pointerId1)
-                    children.add(
-                        Node(pif2).apply {
-                            pointerIds.add(pointerId1)
-                            children.add(
-                                Node(pif3).apply {
-                                    pointerIds.add(pointerId1)
-                                }
-                            )
-                        }
-                    )
-                }
-            )
-            children.add(
-                Node(pif4).apply {
-                    pointerIds.add(pointerId2)
-                    children.add(
-                        Node(pif5).apply {
-                            pointerIds.add(pointerId2)
-                            children.add(
-                                Node(pif6).apply {
-                                    pointerIds.add(pointerId2)
-                                }
-                            )
-                        }
-                    )
-                }
-            )
-        }
+        val expectedRoot =
+            NodeParent().apply {
+                children.add(
+                    Node(pif1).apply {
+                        pointerIds.add(pointerId1)
+                        children.add(
+                            Node(pif2).apply {
+                                pointerIds.add(pointerId1)
+                                children.add(Node(pif3).apply { pointerIds.add(pointerId1) })
+                            }
+                        )
+                    }
+                )
+                children.add(
+                    Node(pif4).apply {
+                        pointerIds.add(pointerId2)
+                        children.add(
+                            Node(pif5).apply {
+                                pointerIds.add(pointerId2)
+                                children.add(Node(pif6).apply { pointerIds.add(pointerId2) })
+                            }
+                        )
+                    }
+                )
+            }
         assertThat(areEqual(hitPathTracker.root, expectedRoot)).isTrue()
     }
 
@@ -186,26 +174,27 @@
 
         hitPathTracker.addHitPath(pointerId2, listOf(pif1, pif2, pif3))
 
-        val expectedRoot = NodeParent().apply {
-            children.add(
-                Node(pif1).apply {
-                    pointerIds.add(pointerId1)
-                    pointerIds.add(pointerId2)
-                    children.add(
-                        Node(pif2).apply {
-                            pointerIds.add(pointerId1)
-                            pointerIds.add(pointerId2)
-                            children.add(
-                                Node(pif3).apply {
-                                    pointerIds.add(pointerId1)
-                                    pointerIds.add(pointerId2)
-                                }
-                            )
-                        }
-                    )
-                }
-            )
-        }
+        val expectedRoot =
+            NodeParent().apply {
+                children.add(
+                    Node(pif1).apply {
+                        pointerIds.add(pointerId1)
+                        pointerIds.add(pointerId2)
+                        children.add(
+                            Node(pif2).apply {
+                                pointerIds.add(pointerId1)
+                                pointerIds.add(pointerId2)
+                                children.add(
+                                    Node(pif3).apply {
+                                        pointerIds.add(pointerId1)
+                                        pointerIds.add(pointerId2)
+                                    }
+                                )
+                            }
+                        )
+                    }
+                )
+            }
         assertThat(areEqual(hitPathTracker.root, expectedRoot)).isTrue()
     }
 
@@ -222,34 +211,27 @@
 
         hitPathTracker.addHitPath(pointerId2, listOf(pif1, pif4, pif5))
 
-        val expectedRoot = NodeParent().apply {
-            children.add(
-                Node(pif1).apply {
-                    pointerIds.add(pointerId1)
-                    pointerIds.add(pointerId2)
-                    children.add(
-                        Node(pif2).apply {
-                            pointerIds.add(pointerId1)
-                            children.add(
-                                Node(pif3).apply {
-                                    pointerIds.add(pointerId1)
-                                }
-                            )
-                        }
-                    )
-                    children.add(
-                        Node(pif4).apply {
-                            pointerIds.add(pointerId2)
-                            children.add(
-                                Node(pif5).apply {
-                                    pointerIds.add(pointerId2)
-                                }
-                            )
-                        }
-                    )
-                }
-            )
-        }
+        val expectedRoot =
+            NodeParent().apply {
+                children.add(
+                    Node(pif1).apply {
+                        pointerIds.add(pointerId1)
+                        pointerIds.add(pointerId2)
+                        children.add(
+                            Node(pif2).apply {
+                                pointerIds.add(pointerId1)
+                                children.add(Node(pif3).apply { pointerIds.add(pointerId1) })
+                            }
+                        )
+                        children.add(
+                            Node(pif4).apply {
+                                pointerIds.add(pointerId2)
+                                children.add(Node(pif5).apply { pointerIds.add(pointerId2) })
+                            }
+                        )
+                    }
+                )
+            }
         assertThat(areEqual(hitPathTracker.root, expectedRoot)).isTrue()
     }
 
@@ -274,33 +256,34 @@
         // Clear any old hits from previous calls
         hitPathTracker.removeDetachedPointerInputNodes()
 
-        val expectedRoot = NodeParent().apply {
-            children.add(
-                Node(pif1).apply {
-                    pointerIds.add(pointerId1)
-                    children.add(
-                        Node(pif2).apply {
-                            pointerIds.add(pointerId1)
-                            children.add(
-                                Node(pif3).apply {
-                                    pointerIds.add(pointerId1)
-                                    children.add(
-                                        Node(pif4).apply {
-                                            pointerIds.add(pointerId1)
-                                            children.add(
-                                                Node(pifNew1).apply {
-                                                    pointerIds.add(pointerId1)
-                                                }
-                                            )
-                                        }
-                                    )
-                                }
-                            )
-                        }
-                    )
-                }
-            )
-        }
+        val expectedRoot =
+            NodeParent().apply {
+                children.add(
+                    Node(pif1).apply {
+                        pointerIds.add(pointerId1)
+                        children.add(
+                            Node(pif2).apply {
+                                pointerIds.add(pointerId1)
+                                children.add(
+                                    Node(pif3).apply {
+                                        pointerIds.add(pointerId1)
+                                        children.add(
+                                            Node(pif4).apply {
+                                                pointerIds.add(pointerId1)
+                                                children.add(
+                                                    Node(pifNew1).apply {
+                                                        pointerIds.add(pointerId1)
+                                                    }
+                                                )
+                                            }
+                                        )
+                                    }
+                                )
+                            }
+                        )
+                    }
+                )
+            }
         assertThat(areEqual(hitPathTracker.root, expectedRoot)).isTrue()
     }
 
@@ -333,54 +316,53 @@
         // Clear any old hits from previous calls
         hitPathTracker.removeDetachedPointerInputNodes()
 
-        val expectedRoot = NodeParent().apply {
-            children.add(
-                Node(pif1).apply {
-                    pointerIds.add(pointerId1)
-                    children.add(
-                        Node(pif2).apply {
-                            pointerIds.add(pointerId1)
-                            children.add(
-                                Node(pif3).apply {
-                                    pointerIds.add(pointerId1)
-                                    children.add(
-                                        Node(pif4).apply {
-                                            pointerIds.add(pointerId1)
-                                        }
-                                    )
-                                }
-                            )
-                        }
-                    )
-                }
-            )
+        val expectedRoot =
+            NodeParent().apply {
+                children.add(
+                    Node(pif1).apply {
+                        pointerIds.add(pointerId1)
+                        children.add(
+                            Node(pif2).apply {
+                                pointerIds.add(pointerId1)
+                                children.add(
+                                    Node(pif3).apply {
+                                        pointerIds.add(pointerId1)
+                                        children.add(
+                                            Node(pif4).apply { pointerIds.add(pointerId1) }
+                                        )
+                                    }
+                                )
+                            }
+                        )
+                    }
+                )
 
-            children.add(
-                Node(pif5).apply {
-                    pointerIds.add(pointerId2)
-                    children.add(
-                        Node(pif6).apply {
-                            pointerIds.add(pointerId2)
-                            children.add(
-                                Node(pif7).apply {
-                                    pointerIds.add(pointerId2)
-                                    children.add(
-                                        Node(pif8).apply {
-                                            pointerIds.add(pointerId2)
-                                            children.add(
-                                                Node(pifNew1).apply {
-                                                    pointerIds.add(pointerId2)
-                                                }
-                                            )
-                                        }
-                                    )
-                                }
-                            )
-                        }
-                    )
-                }
-            )
-        }
+                children.add(
+                    Node(pif5).apply {
+                        pointerIds.add(pointerId2)
+                        children.add(
+                            Node(pif6).apply {
+                                pointerIds.add(pointerId2)
+                                children.add(
+                                    Node(pif7).apply {
+                                        pointerIds.add(pointerId2)
+                                        children.add(
+                                            Node(pif8).apply {
+                                                pointerIds.add(pointerId2)
+                                                children.add(
+                                                    Node(pifNew1).apply {
+                                                        pointerIds.add(pointerId2)
+                                                    }
+                                                )
+                                            }
+                                        )
+                                    }
+                                )
+                            }
+                        )
+                    }
+                )
+            }
         assertThat(areEqual(hitPathTracker.root, expectedRoot)).isTrue()
     }
 
@@ -402,8 +384,7 @@
         assertThat(log).hasSize(3)
         // Verify call values
         PointerEventPass.values().forEachIndexed { index, value ->
-            PointerEventSubject
-                .assertThat(log[index].pointerEvent)
+            PointerEventSubject.assertThat(log[index].pointerEvent)
                 .isStructurallyEqualTo(pointerEventOf(down(13)))
             assertThat(log[index].pass).isEqualTo(value)
         }
@@ -426,8 +407,7 @@
         assertThat(onPointerEventLog[1].pointerInputNode).isEqualTo(pif2)
         assertThat(onPointerEventLog[2].pointerInputNode).isEqualTo(pif3)
         onPointerEventLog.forEach {
-            PointerEventSubject
-                .assertThat(it.pointerEvent)
+            PointerEventSubject.assertThat(it.pointerEvent)
                 .isStructurallyEqualTo(pointerEventOf(down(13)))
         }
     }
@@ -442,8 +422,10 @@
 
         hitPathTracker.dispatchChanges(internalPointerEventOf(down(13)))
 
-        val onPointerEventLog = log.getOnPointerEventLog()
-            .filter { it.pass == PointerEventPass.Initial || it.pass == PointerEventPass.Main }
+        val onPointerEventLog =
+            log.getOnPointerEventLog().filter {
+                it.pass == PointerEventPass.Initial || it.pass == PointerEventPass.Main
+            }
 
         assertThat(onPointerEventLog).hasSize(6)
         assertThat(onPointerEventLog[0].pointerInputNode).isEqualTo(pif1)
@@ -453,8 +435,7 @@
         assertThat(onPointerEventLog[4].pointerInputNode).isEqualTo(pif2)
         assertThat(onPointerEventLog[5].pointerInputNode).isEqualTo(pif1)
         onPointerEventLog.forEach {
-            PointerEventSubject
-                .assertThat(it.pointerEvent)
+            PointerEventSubject.assertThat(it.pointerEvent)
                 .isStructurallyEqualTo(pointerEventOf(down(13)))
         }
     }
@@ -471,25 +452,22 @@
         val event1 = down(3)
         val event2 = down(5).moveTo(10, 7f, 9f)
 
-        hitPathTracker.dispatchChanges(
-            internalPointerEventOf(event1, event2)
-        )
+        hitPathTracker.dispatchChanges(internalPointerEventOf(event1, event2))
 
-        val log1 = log
-            .getOnPointerEventLog()
-            .filter { it.pointerInputNode == pif1 || it.pointerInputNode == pif2 }
-            .filter { it.pass == PointerEventPass.Initial || it.pass == PointerEventPass.Main }
-        val log2 = log
-            .getOnPointerEventLog()
-            .filter { it.pointerInputNode == pif3 || it.pointerInputNode == pif4 }
-            .filter { it.pass == PointerEventPass.Initial || it.pass == PointerEventPass.Main }
+        val log1 =
+            log.getOnPointerEventLog()
+                .filter { it.pointerInputNode == pif1 || it.pointerInputNode == pif2 }
+                .filter { it.pass == PointerEventPass.Initial || it.pass == PointerEventPass.Main }
+        val log2 =
+            log.getOnPointerEventLog()
+                .filter { it.pointerInputNode == pif3 || it.pointerInputNode == pif4 }
+                .filter { it.pass == PointerEventPass.Initial || it.pass == PointerEventPass.Main }
 
         assertThat(log1).hasSize(4)
         assertThat(log2).hasSize(4)
 
         log1.forEach {
-            PointerEventSubject
-                .assertThat(it.pointerEvent)
+            PointerEventSubject.assertThat(it.pointerEvent)
                 .isStructurallyEqualTo(pointerEventOf(event1))
         }
 
@@ -523,69 +501,59 @@
         val event1 = down(3)
         val event2 = down(5).moveTo(10, 7f, 9f)
 
-        hitPathTracker.dispatchChanges(
-            internalPointerEventOf(event1, event2)
-        )
+        hitPathTracker.dispatchChanges(internalPointerEventOf(event1, event2))
 
-        val log1 = log
-            .getOnPointerEventLog()
-            .filter { it.pointerInputNode == parent || it.pointerInputNode == child1 }
-            .filter { it.pass == PointerEventPass.Initial || it.pass == PointerEventPass.Main }
-        val log2 = log
-            .getOnPointerEventLog()
-            .filter { it.pointerInputNode == parent || it.pointerInputNode == child2 }
-            .filter { it.pass == PointerEventPass.Initial || it.pass == PointerEventPass.Main }
+        val log1 =
+            log.getOnPointerEventLog()
+                .filter { it.pointerInputNode == parent || it.pointerInputNode == child1 }
+                .filter { it.pass == PointerEventPass.Initial || it.pass == PointerEventPass.Main }
+        val log2 =
+            log.getOnPointerEventLog()
+                .filter { it.pointerInputNode == parent || it.pointerInputNode == child2 }
+                .filter { it.pass == PointerEventPass.Initial || it.pass == PointerEventPass.Main }
 
         assertThat(log1).hasSize(4)
         assertThat(log2).hasSize(4)
 
         // Verifies that the events traverse between parent and child1 in the correct order.
         assertThat(log1[0].pointerInputNode).isEqualTo(parent)
-        PointerEventSubject
-            .assertThat(log1[0].pointerEvent)
+        PointerEventSubject.assertThat(log1[0].pointerEvent)
             .isStructurallyEqualTo(pointerEventOf(event1, event2))
         assertThat(log1[0].pass).isEqualTo(PointerEventPass.Initial)
 
         assertThat(log1[1].pointerInputNode).isEqualTo(child1)
-        PointerEventSubject
-            .assertThat(log1[1].pointerEvent)
+        PointerEventSubject.assertThat(log1[1].pointerEvent)
             .isStructurallyEqualTo(pointerEventOf(event1))
         assertThat(log1[1].pass).isEqualTo(PointerEventPass.Initial)
 
         assertThat(log1[2].pointerInputNode).isEqualTo(child1)
-        PointerEventSubject
-            .assertThat(log1[2].pointerEvent)
+        PointerEventSubject.assertThat(log1[2].pointerEvent)
             .isStructurallyEqualTo(pointerEventOf(event1))
         assertThat(log1[2].pass).isEqualTo(PointerEventPass.Main)
 
         assertThat(log1[3].pointerInputNode).isEqualTo(parent)
-        PointerEventSubject
-            .assertThat(log1[3].pointerEvent)
+        PointerEventSubject.assertThat(log1[3].pointerEvent)
             .isStructurallyEqualTo(pointerEventOf(event1, event2))
         assertThat(log1[3].pass).isEqualTo(PointerEventPass.Main)
 
         // Verifies that the events traverse between parent and child2 in the correct order.
         assertThat(log1[0].pointerInputNode).isEqualTo(parent)
-        PointerEventSubject
-            .assertThat(log1[0].pointerEvent)
+        PointerEventSubject.assertThat(log1[0].pointerEvent)
             .isStructurallyEqualTo(pointerEventOf(event1, event2))
         assertThat(log1[0].pass).isEqualTo(PointerEventPass.Initial)
 
         assertThat(log1[1].pointerInputNode).isEqualTo(child1)
-        PointerEventSubject
-            .assertThat(log1[1].pointerEvent)
+        PointerEventSubject.assertThat(log1[1].pointerEvent)
             .isStructurallyEqualTo(pointerEventOf(event1))
         assertThat(log1[1].pass).isEqualTo(PointerEventPass.Initial)
 
         assertThat(log1[2].pointerInputNode).isEqualTo(child1)
-        PointerEventSubject
-            .assertThat(log1[2].pointerEvent)
+        PointerEventSubject.assertThat(log1[2].pointerEvent)
             .isStructurallyEqualTo(pointerEventOf(event1))
         assertThat(log1[2].pass).isEqualTo(PointerEventPass.Main)
 
         assertThat(log1[3].pointerInputNode).isEqualTo(parent)
-        PointerEventSubject
-            .assertThat(log1[3].pointerEvent)
+        PointerEventSubject.assertThat(log1[3].pointerEvent)
             .isStructurallyEqualTo(pointerEventOf(event1, event2))
         assertThat(log1[3].pass).isEqualTo(PointerEventPass.Main)
     }
@@ -600,21 +568,19 @@
         val event1 = down(3)
         val event2 = down(5).moveTo(10, 7f, 9f)
 
-        hitPathTracker.dispatchChanges(
-            internalPointerEventOf(event1, event2)
-        )
+        hitPathTracker.dispatchChanges(internalPointerEventOf(event1, event2))
 
-        val log1 = log
-            .getOnPointerEventLog()
-            .filter { it.pass == PointerEventPass.Initial || it.pass == PointerEventPass.Main }
+        val log1 =
+            log.getOnPointerEventLog().filter {
+                it.pass == PointerEventPass.Initial || it.pass == PointerEventPass.Main
+            }
 
         // Verify call count
         assertThat(log1).hasSize(4)
 
         // Verify PointerEvent
         log1.forEach {
-            PointerEventSubject
-                .assertThat(it.pointerEvent)
+            PointerEventSubject.assertThat(it.pointerEvent)
                 .isStructurallyEqualTo(pointerEventOf(event1, event2))
         }
 
@@ -635,21 +601,21 @@
 
         hitPathTracker.dispatchChanges(internalPointerEvent)
 
-        PointerInputChangeSubject
-            .assertThat(internalPointerEvent.changes.valueAt(0))
+        PointerInputChangeSubject.assertThat(internalPointerEvent.changes.valueAt(0))
             .isStructurallyEqualTo(down(5))
     }
 
     @Test
     fun dispatchChanges_hitResultHasSingleMatch_changesAreUpdatedCorrectly() {
-        val pif1 = PointerInputNodeMock(
-            pointerEventHandler = { pointerEvent, _, _ ->
-                pointerEvent.changes.map {
-                    if (it.pressed != it.previousPressed) it.consume()
-                    it
+        val pif1 =
+            PointerInputNodeMock(
+                pointerEventHandler = { pointerEvent, _, _ ->
+                    pointerEvent.changes.map {
+                        if (it.pressed != it.previousPressed) it.consume()
+                        it
+                    }
                 }
-            }
-        )
+            )
 
         hitPathTracker.addHitPath(PointerId(13), listOf(pif1))
 
@@ -657,43 +623,39 @@
 
         hitPathTracker.dispatchChanges(internalPointerEvent)
 
-        PointerInputChangeSubject
-            .assertThat(internalPointerEvent.changes.valueAt(0))
+        PointerInputChangeSubject.assertThat(internalPointerEvent.changes.valueAt(0))
             .isStructurallyEqualTo(down(13).apply { if (pressed != previousPressed) consume() })
     }
 
     @Test
     fun dispatchChanges_hitResultHasMultipleMatchesAndDownAndUpPaths_changesAreUpdatedCorrectly() {
         val log = mutableListOf<LogEntry>()
-        val pif1 = PointerInputNodeMock(
-            log = log,
-            pointerEventHandler = { pointerEvent, _, _ ->
-                pointerEvent.changes.map {
-                    it.consume()
+        val pif1 =
+            PointerInputNodeMock(
+                log = log,
+                pointerEventHandler = { pointerEvent, _, _ ->
+                    pointerEvent.changes.map { it.consume() }
+                    pointerEvent.changes
                 }
-                pointerEvent.changes
-            }
-        )
+            )
 
-        val pif2 = PointerInputNodeMock(
-            log = log,
-            pointerEventHandler = { pointerEvent, _, _ ->
-                pointerEvent.changes.map {
-                    it.consume()
+        val pif2 =
+            PointerInputNodeMock(
+                log = log,
+                pointerEventHandler = { pointerEvent, _, _ ->
+                    pointerEvent.changes.map { it.consume() }
+                    pointerEvent.changes
                 }
-                pointerEvent.changes
-            }
-        )
+            )
 
-        val pif3 = PointerInputNodeMock(
-            log = log,
-            pointerEventHandler = { pointerEvent, _, _ ->
-                pointerEvent.changes.map {
-                    it.consume()
+        val pif3 =
+            PointerInputNodeMock(
+                log = log,
+                pointerEventHandler = { pointerEvent, _, _ ->
+                    pointerEvent.changes.map { it.consume() }
+                    pointerEvent.changes
                 }
-                pointerEvent.changes
-            }
-        )
+            )
 
         hitPathTracker.addHitPath(PointerId(13), listOf(pif1, pif2, pif3))
         val actualChange = down(13).moveTo(10, 0f, 0f)
@@ -704,115 +666,84 @@
 
         hitPathTracker.dispatchChanges(internalPointerEvent)
 
-        val log1 = log.getOnPointerEventLog()
-            .filter { it.pass == PointerEventPass.Initial || it.pass == PointerEventPass.Main }
+        val log1 =
+            log.getOnPointerEventLog().filter {
+                it.pass == PointerEventPass.Initial || it.pass == PointerEventPass.Main
+            }
 
         assertThat(log1[0].pointerInputNode).isEqualTo(pif1)
-        PointerEventSubject
-            .assertThat(log1[0].pointerEvent)
+        PointerEventSubject.assertThat(log1[0].pointerEvent)
             .isStructurallyEqualTo(pointerEventOf(expectedChange))
         assertThat(log1[0].pass).isEqualTo(PointerEventPass.Initial)
 
         assertThat(log1[1].pointerInputNode).isEqualTo(pif2)
-        PointerEventSubject
-            .assertThat(log1[1].pointerEvent)
-            .isStructurallyEqualTo(
-                pointerEventOf(
-                    consumedExpectedChange
-                )
-            )
+        PointerEventSubject.assertThat(log1[1].pointerEvent)
+            .isStructurallyEqualTo(pointerEventOf(consumedExpectedChange))
         assertThat(log1[1].pass).isEqualTo(PointerEventPass.Initial)
 
         assertThat(log1[2].pointerInputNode).isEqualTo(pif3)
-        PointerEventSubject
-            .assertThat(log1[2].pointerEvent)
-            .isStructurallyEqualTo(
-                pointerEventOf(
-                    consumedExpectedChange
-                )
-            )
+        PointerEventSubject.assertThat(log1[2].pointerEvent)
+            .isStructurallyEqualTo(pointerEventOf(consumedExpectedChange))
         assertThat(log1[2].pass).isEqualTo(PointerEventPass.Initial)
 
         assertThat(log1[3].pointerInputNode).isEqualTo(pif3)
-        PointerEventSubject
-            .assertThat(log1[3].pointerEvent)
-            .isStructurallyEqualTo(
-                pointerEventOf(
-                    consumedExpectedChange
-                )
-            )
+        PointerEventSubject.assertThat(log1[3].pointerEvent)
+            .isStructurallyEqualTo(pointerEventOf(consumedExpectedChange))
         assertThat(log1[3].pass).isEqualTo(PointerEventPass.Main)
 
         assertThat(log1[4].pointerInputNode).isEqualTo(pif2)
-        PointerEventSubject
-            .assertThat(log1[4].pointerEvent)
-            .isStructurallyEqualTo(
-                pointerEventOf(
-                    consumedExpectedChange
-                )
-            )
+        PointerEventSubject.assertThat(log1[4].pointerEvent)
+            .isStructurallyEqualTo(pointerEventOf(consumedExpectedChange))
         assertThat(log1[4].pass).isEqualTo(PointerEventPass.Main)
 
         assertThat(log1[5].pointerInputNode).isEqualTo(pif1)
-        PointerEventSubject
-            .assertThat(log1[5].pointerEvent)
-            .isStructurallyEqualTo(
-                pointerEventOf(
-                    consumedExpectedChange
-                )
-            )
+        PointerEventSubject.assertThat(log1[5].pointerEvent)
+            .isStructurallyEqualTo(pointerEventOf(consumedExpectedChange))
         assertThat(log1[5].pass).isEqualTo(PointerEventPass.Main)
 
-        PointerInputChangeSubject
-            .assertThat(internalPointerEvent.changes.valueAt(0))
-            .isStructurallyEqualTo(
-                consumedExpectedChange
-            )
+        PointerInputChangeSubject.assertThat(internalPointerEvent.changes.valueAt(0))
+            .isStructurallyEqualTo(consumedExpectedChange)
     }
 
     @Test
     fun dispatchChanges_2IndependentBranchesFromRoot_changesAreUpdatedCorrectly() {
         val log = mutableListOf<LogEntry>()
-        val pif1 = PointerInputNodeMock(
-            log = log,
-            pointerEventHandler =
-                { pointerEvent, _, _ ->
+        val pif1 =
+            PointerInputNodeMock(
+                log = log,
+                pointerEventHandler = { pointerEvent, _, _ ->
                     pointerEvent.changes.map {
                         if (it.positionChange() != Offset.Zero) it.consume()
                     }
                     pointerEvent.changes
                 }
-        )
-        val pif2 = PointerInputNodeMock(
-            log = log,
-            pointerEventHandler =
-                { pointerEvent, _, _ ->
+            )
+        val pif2 =
+            PointerInputNodeMock(
+                log = log,
+                pointerEventHandler = { pointerEvent, _, _ ->
                     pointerEvent.changes.map {
                         if (it.positionChange() != Offset.Zero) it.consume()
                     }
                     pointerEvent.changes
                 }
-        )
-        val pif3 = PointerInputNodeMock(
-            log = log,
-            pointerEventHandler =
-                { pointerEvent, _, _ ->
-                    pointerEvent.changes.map {
-                        it.consume()
-                    }
+            )
+        val pif3 =
+            PointerInputNodeMock(
+                log = log,
+                pointerEventHandler = { pointerEvent, _, _ ->
+                    pointerEvent.changes.map { it.consume() }
                     pointerEvent.changes
                 }
-        )
-        val pif4 = PointerInputNodeMock(
-            log = log,
-            pointerEventHandler =
-                { pointerEvent, _, _ ->
-                    pointerEvent.changes.map {
-                        it.consume()
-                    }
+            )
+        val pif4 =
+            PointerInputNodeMock(
+                log = log,
+                pointerEventHandler = { pointerEvent, _, _ ->
+                    pointerEvent.changes.map { it.consume() }
                     pointerEvent.changes
                 }
-        )
+            )
         hitPathTracker.addHitPath(PointerId(3), listOf(pif1, pif2))
         hitPathTracker.addHitPath(PointerId(5), listOf(pif3, pif4))
         val actualEvent1 = down(3).moveTo(10, 0f, 30f)
@@ -826,134 +757,98 @@
 
         hitPathTracker.dispatchChanges(internalPointerEvent)
 
-        val log1 = log.getOnPointerEventLog()
-            .filter { it.pass == PointerEventPass.Initial || it.pass == PointerEventPass.Main }
-            .filter { it.pointerInputNode == pif1 || it.pointerInputNode == pif2 }
+        val log1 =
+            log.getOnPointerEventLog()
+                .filter { it.pass == PointerEventPass.Initial || it.pass == PointerEventPass.Main }
+                .filter { it.pointerInputNode == pif1 || it.pointerInputNode == pif2 }
 
-        val log2 = log.getOnPointerEventLog()
-            .filter { it.pass == PointerEventPass.Initial || it.pass == PointerEventPass.Main }
-            .filter { it.pointerInputNode == pif3 || it.pointerInputNode == pif4 }
+        val log2 =
+            log.getOnPointerEventLog()
+                .filter { it.pass == PointerEventPass.Initial || it.pass == PointerEventPass.Main }
+                .filter { it.pointerInputNode == pif3 || it.pointerInputNode == pif4 }
 
         assertThat(log1[0].pointerInputNode).isEqualTo(pif1)
-        PointerEventSubject
-            .assertThat(log1[0].pointerEvent)
+        PointerEventSubject.assertThat(log1[0].pointerEvent)
             .isStructurallyEqualTo(pointerEventOf(expectedEvent1))
         assertThat(log1[0].pass).isEqualTo(PointerEventPass.Initial)
 
         assertThat(log1[1].pointerInputNode).isEqualTo(pif2)
-        PointerEventSubject
-            .assertThat(log1[1].pointerEvent)
-            .isStructurallyEqualTo(
-                pointerEventOf(
-                    consumedExpectedEvent1
-                )
-            )
+        PointerEventSubject.assertThat(log1[1].pointerEvent)
+            .isStructurallyEqualTo(pointerEventOf(consumedExpectedEvent1))
         assertThat(log1[1].pass).isEqualTo(PointerEventPass.Initial)
 
         assertThat(log1[2].pointerInputNode).isEqualTo(pif2)
-        PointerEventSubject
-            .assertThat(log1[2].pointerEvent)
-            .isStructurallyEqualTo(
-                pointerEventOf(
-                    consumedExpectedEvent1
-                )
-            )
+        PointerEventSubject.assertThat(log1[2].pointerEvent)
+            .isStructurallyEqualTo(pointerEventOf(consumedExpectedEvent1))
         assertThat(log1[2].pass).isEqualTo(PointerEventPass.Main)
 
         assertThat(log1[3].pointerInputNode).isEqualTo(pif1)
-        PointerEventSubject
-            .assertThat(log1[3].pointerEvent)
-            .isStructurallyEqualTo(
-                pointerEventOf(
-                    consumedExpectedEvent1
-                )
-            )
+        PointerEventSubject.assertThat(log1[3].pointerEvent)
+            .isStructurallyEqualTo(pointerEventOf(consumedExpectedEvent1))
         assertThat(log1[3].pass).isEqualTo(PointerEventPass.Main)
 
         assertThat(log2[0].pointerInputNode).isEqualTo(pif3)
-        PointerEventSubject
-            .assertThat(log2[0].pointerEvent)
+        PointerEventSubject.assertThat(log2[0].pointerEvent)
             .isStructurallyEqualTo(pointerEventOf(expectedEvent2))
         assertThat(log2[0].pass).isEqualTo(PointerEventPass.Initial)
 
         assertThat(log2[1].pointerInputNode).isEqualTo(pif4)
-        PointerEventSubject
-            .assertThat(log2[1].pointerEvent)
-            .isStructurallyEqualTo(
-                pointerEventOf(
-                    consumedExpectedEvent2
-                )
-            )
+        PointerEventSubject.assertThat(log2[1].pointerEvent)
+            .isStructurallyEqualTo(pointerEventOf(consumedExpectedEvent2))
         assertThat(log2[1].pass).isEqualTo(PointerEventPass.Initial)
 
         assertThat(log2[2].pointerInputNode).isEqualTo(pif4)
-        PointerEventSubject
-            .assertThat(log2[2].pointerEvent)
-            .isStructurallyEqualTo(
-                pointerEventOf(
-                    consumedExpectedEvent2
-                )
-            )
+        PointerEventSubject.assertThat(log2[2].pointerEvent)
+            .isStructurallyEqualTo(pointerEventOf(consumedExpectedEvent2))
         assertThat(log2[2].pass).isEqualTo(PointerEventPass.Main)
 
         assertThat(log2[3].pointerInputNode).isEqualTo(pif3)
-        PointerEventSubject
-            .assertThat(log2[3].pointerEvent)
-            .isStructurallyEqualTo(
-                pointerEventOf(
-                    consumedExpectedEvent2
-                )
-            )
+        PointerEventSubject.assertThat(log2[3].pointerEvent)
+            .isStructurallyEqualTo(pointerEventOf(consumedExpectedEvent2))
         assertThat(log2[3].pass).isEqualTo(PointerEventPass.Main)
 
         assertEquals(2, internalPointerEvent.changes.size())
-        PointerInputChangeSubject
-            .assertThat(internalPointerEvent.changes[actualEvent1.id.value])
-            .isStructurallyEqualTo(
-                consumedExpectedEvent1
-            )
-        PointerInputChangeSubject
-            .assertThat(internalPointerEvent.changes[actualEvent2.id.value])
-            .isStructurallyEqualTo(
-                consumedExpectedEvent2
-            )
+        PointerInputChangeSubject.assertThat(internalPointerEvent.changes[actualEvent1.id.value])
+            .isStructurallyEqualTo(consumedExpectedEvent1)
+        PointerInputChangeSubject.assertThat(internalPointerEvent.changes[actualEvent2.id.value])
+            .isStructurallyEqualTo(consumedExpectedEvent2)
     }
 
     @Test
     fun dispatchChanges_2BranchesWithSharedParent_changesAreUpdatedCorrectly() {
         val log = mutableListOf<LogEntry>()
-        val parent = PointerInputNodeMock(
-            log = log,
-            pointerEventHandler =
-                { pointerEvent, _, _ ->
+        val parent =
+            PointerInputNodeMock(
+                log = log,
+                pointerEventHandler = { pointerEvent, _, _ ->
                     pointerEvent.changes.map {
                         if (it.positionChange() != Offset.Zero) it.consume()
                     }
                     pointerEvent.changes
                 }
-        )
+            )
 
-        val child1 = PointerInputNodeMock(
-            log = log,
-            pointerEventHandler =
-                { pointerEvent, _, _ ->
+        val child1 =
+            PointerInputNodeMock(
+                log = log,
+                pointerEventHandler = { pointerEvent, _, _ ->
                     pointerEvent.changes.map {
                         if (it.positionChange() != Offset.Zero) it.consume()
                     }
                     pointerEvent.changes
                 }
-        )
+            )
 
-        val child2 = PointerInputNodeMock(
-            log = log,
-            pointerEventHandler =
-                { pointerEvent, _, _ ->
+        val child2 =
+            PointerInputNodeMock(
+                log = log,
+                pointerEventHandler = { pointerEvent, _, _ ->
                     pointerEvent.changes.map {
                         if (it.positionChange() != Offset.Zero) it.consume()
                     }
                     pointerEvent.changes
                 }
-        )
+            )
 
         hitPathTracker.addHitPath(PointerId(3), listOf(parent, child1))
         hitPathTracker.addHitPath(PointerId(5), listOf(parent, child2))
@@ -968,88 +863,68 @@
 
         hitPathTracker.dispatchChanges(internalPointerEvent)
 
-        val log1 = log.getOnPointerEventLog()
-            .filter { it.pass == PointerEventPass.Initial || it.pass == PointerEventPass.Main }
+        val log1 =
+            log.getOnPointerEventLog().filter {
+                it.pass == PointerEventPass.Initial || it.pass == PointerEventPass.Main
+            }
 
         assertThat(log1[0].pointerInputNode).isEqualTo(parent)
-        PointerEventSubject
-            .assertThat(log1[0].pointerEvent)
+        PointerEventSubject.assertThat(log1[0].pointerEvent)
             .isStructurallyEqualTo(pointerEventOf(expectedEvent1, expectedEvent2))
         assertThat(log1[0].pass).isEqualTo(PointerEventPass.Initial)
 
         assertThat(log1[1].pointerInputNode).isEqualTo(child1)
-        PointerEventSubject
-            .assertThat(log1[1].pointerEvent)
-            .isStructurallyEqualTo(
-                pointerEventOf(consumedEvent1)
-            )
+        PointerEventSubject.assertThat(log1[1].pointerEvent)
+            .isStructurallyEqualTo(pointerEventOf(consumedEvent1))
         assertThat(log1[1].pass).isEqualTo(PointerEventPass.Initial)
 
         assertThat(log1[2].pointerInputNode).isEqualTo(child1)
-        PointerEventSubject
-            .assertThat(log1[2].pointerEvent)
-            .isStructurallyEqualTo(
-                pointerEventOf(consumedEvent1)
-            )
+        PointerEventSubject.assertThat(log1[2].pointerEvent)
+            .isStructurallyEqualTo(pointerEventOf(consumedEvent1))
         assertThat(log1[2].pass).isEqualTo(PointerEventPass.Main)
 
         assertThat(log1[3].pointerInputNode).isEqualTo(child2)
-        PointerEventSubject
-            .assertThat(log1[3].pointerEvent)
-            .isStructurallyEqualTo(
-                pointerEventOf(consumedEvent2)
-            )
+        PointerEventSubject.assertThat(log1[3].pointerEvent)
+            .isStructurallyEqualTo(pointerEventOf(consumedEvent2))
         assertThat(log1[3].pass).isEqualTo(PointerEventPass.Initial)
 
         assertThat(log1[4].pointerInputNode).isEqualTo(child2)
-        PointerEventSubject
-            .assertThat(log1[4].pointerEvent)
-            .isStructurallyEqualTo(
-                pointerEventOf(consumedEvent2)
-            )
+        PointerEventSubject.assertThat(log1[4].pointerEvent)
+            .isStructurallyEqualTo(pointerEventOf(consumedEvent2))
         assertThat(log1[4].pass).isEqualTo(PointerEventPass.Main)
 
         assertThat(log1[5].pointerInputNode).isEqualTo(parent)
-        PointerEventSubject
-            .assertThat(log1[5].pointerEvent)
-            .isStructurallyEqualTo(
-                pointerEventOf(consumedEvent1, consumedEvent2)
-            )
+        PointerEventSubject.assertThat(log1[5].pointerEvent)
+            .isStructurallyEqualTo(pointerEventOf(consumedEvent1, consumedEvent2))
         assertThat(log1[5].pass).isEqualTo(PointerEventPass.Main)
 
         assertEquals(2, internalPointerEvent.changes.size())
-        PointerInputChangeSubject
-            .assertThat(internalPointerEvent.changes[actualEvent1.id.value])
+        PointerInputChangeSubject.assertThat(internalPointerEvent.changes[actualEvent1.id.value])
             .isStructurallyEqualTo(consumedEvent1)
 
-        PointerInputChangeSubject
-            .assertThat(internalPointerEvent.changes[actualEvent2.id.value])
+        PointerInputChangeSubject.assertThat(internalPointerEvent.changes[actualEvent2.id.value])
             .isStructurallyEqualTo(consumedEvent2)
     }
 
     @Test
     fun dispatchChanges_2PointersShareCompletePath_changesAreUpdatedCorrectly() {
         val log = mutableListOf<LogEntry>()
-        val child1 = PointerInputNodeMock(
-            log = log,
-            pointerEventHandler =
-                { pointerEvent, _, _ ->
-                    pointerEvent.changes.map {
-                        it.consume()
-                    }
+        val child1 =
+            PointerInputNodeMock(
+                log = log,
+                pointerEventHandler = { pointerEvent, _, _ ->
+                    pointerEvent.changes.map { it.consume() }
                     pointerEvent.changes
                 }
-        )
-        val child2 = PointerInputNodeMock(
-            log = log,
-            pointerEventHandler =
-                { pointerEvent, _, _ ->
-                    pointerEvent.changes.map {
-                        it.consume()
-                    }
+            )
+        val child2 =
+            PointerInputNodeMock(
+                log = log,
+                pointerEventHandler = { pointerEvent, _, _ ->
+                    pointerEvent.changes.map { it.consume() }
                     pointerEvent.changes
                 }
-        )
+            )
 
         hitPathTracker.addHitPath(PointerId(3), listOf(child1, child2))
         hitPathTracker.addHitPath(PointerId(5), listOf(child1, child2))
@@ -1064,66 +939,41 @@
 
         hitPathTracker.dispatchChanges(internalPointerEvent)
 
-        val log1 = log.getOnPointerEventLog()
-            .filter { it.pass == PointerEventPass.Initial || it.pass == PointerEventPass.Main }
+        val log1 =
+            log.getOnPointerEventLog().filter {
+                it.pass == PointerEventPass.Initial || it.pass == PointerEventPass.Main
+            }
 
         assertThat(log1[0].pointerInputNode).isEqualTo(child1)
-        PointerEventSubject
-            .assertThat(log1[0].pointerEvent)
+        PointerEventSubject.assertThat(log1[0].pointerEvent)
             .isStructurallyEqualTo(pointerEventOf(expectedEvent1, expectedEvent2))
         assertThat(log1[0].pass).isEqualTo(PointerEventPass.Initial)
 
         assertThat(log1[1].pointerInputNode).isEqualTo(child2)
-        PointerEventSubject
-            .assertThat(log1[1].pointerEvent)
-            .isStructurallyEqualTo(
-                pointerEventOf(
-                    consumedEvent1,
-                    consumedEvent2
-                )
-            )
+        PointerEventSubject.assertThat(log1[1].pointerEvent)
+            .isStructurallyEqualTo(pointerEventOf(consumedEvent1, consumedEvent2))
         assertThat(log1[1].pass).isEqualTo(PointerEventPass.Initial)
 
         assertThat(log1[2].pointerInputNode).isEqualTo(child2)
-        PointerEventSubject
-            .assertThat(log1[2].pointerEvent)
-            .isStructurallyEqualTo(
-                pointerEventOf(
-                    consumedEvent1,
-                    consumedEvent2
-                )
-            )
+        PointerEventSubject.assertThat(log1[2].pointerEvent)
+            .isStructurallyEqualTo(pointerEventOf(consumedEvent1, consumedEvent2))
         assertThat(log1[2].pass).isEqualTo(PointerEventPass.Main)
 
         assertThat(log1[3].pointerInputNode).isEqualTo(child1)
-        PointerEventSubject
-            .assertThat(log1[3].pointerEvent)
-            .isStructurallyEqualTo(
-                pointerEventOf(
-                    consumedEvent1,
-                    consumedEvent2
-                )
-            )
+        PointerEventSubject.assertThat(log1[3].pointerEvent)
+            .isStructurallyEqualTo(pointerEventOf(consumedEvent1, consumedEvent2))
         assertThat(log1[3].pass).isEqualTo(PointerEventPass.Main)
 
         assertEquals(2, internalPointerEvent.changes.size())
-        PointerInputChangeSubject
-            .assertThat(internalPointerEvent.changes[actualEvent1.id.value])
-            .isStructurallyEqualTo(
-                consumedEvent1
-            )
-        PointerInputChangeSubject
-            .assertThat(internalPointerEvent.changes[actualEvent2.id.value])
-            .isStructurallyEqualTo(
-                consumedEvent2
-            )
+        PointerInputChangeSubject.assertThat(internalPointerEvent.changes[actualEvent1.id.value])
+            .isStructurallyEqualTo(consumedEvent1)
+        PointerInputChangeSubject.assertThat(internalPointerEvent.changes[actualEvent2.id.value])
+            .isStructurallyEqualTo(consumedEvent2)
     }
 
     @Test
     fun removeDetachedPointerInputFilters_noNodes_hitResultJustHasRootAndDoesNotCrash() {
-        val throwable = catchThrowable {
-            hitPathTracker.removeDetachedPointerInputNodes()
-        }
+        val throwable = catchThrowable { hitPathTracker.removeDetachedPointerInputNodes() }
 
         assertThat(throwable).isNull()
         assertThat(areEqual(hitPathTracker.root, NodeParent()))
@@ -1164,54 +1014,35 @@
 
         // Assert.
 
-        val expectedRoot = NodeParent().apply {
-            children.add(
-                Node(pif1).apply {
-                    pointerIds.add(pointerId1)
-                }
-            )
-            children.add(
-                Node(pif3).apply {
-                    pointerIds.add(pointerId2)
-                    children.add(
-                        Node(pif2).apply {
-                            pointerIds.add(pointerId2)
-                        }
-                    )
-                }
-            )
-            children.add(
-                Node(pif6).apply {
-                    pointerIds.add(pointerId3)
-                    children.add(
-                        Node(pif5).apply {
-                            pointerIds.add(pointerId3)
-                            children.add(
-                                Node(pif4).apply {
-                                    pointerIds.add(pointerId3)
-                                }
-                            )
-                        }
-                    )
-                }
-            )
-            children.add(
-                Node(pif9).apply {
-                    pointerIds.add(pointerId4)
-                    pointerIds.add(pointerId5)
-                    children.add(
-                        Node(pif7).apply {
-                            pointerIds.add(pointerId4)
-                        }
-                    )
-                    children.add(
-                        Node(pif8).apply {
-                            pointerIds.add(pointerId5)
-                        }
-                    )
-                }
-            )
-        }
+        val expectedRoot =
+            NodeParent().apply {
+                children.add(Node(pif1).apply { pointerIds.add(pointerId1) })
+                children.add(
+                    Node(pif3).apply {
+                        pointerIds.add(pointerId2)
+                        children.add(Node(pif2).apply { pointerIds.add(pointerId2) })
+                    }
+                )
+                children.add(
+                    Node(pif6).apply {
+                        pointerIds.add(pointerId3)
+                        children.add(
+                            Node(pif5).apply {
+                                pointerIds.add(pointerId3)
+                                children.add(Node(pif4).apply { pointerIds.add(pointerId3) })
+                            }
+                        )
+                    }
+                )
+                children.add(
+                    Node(pif9).apply {
+                        pointerIds.add(pointerId4)
+                        pointerIds.add(pointerId5)
+                        children.add(Node(pif7).apply { pointerIds.add(pointerId4) })
+                        children.add(Node(pif8).apply { pointerIds.add(pointerId5) })
+                    }
+                )
+            }
         assertThat(areEqual(hitPathTracker.root, expectedRoot)).isTrue()
 
         // Assert
@@ -1223,18 +1054,9 @@
     @Test
     fun removeDetachedPointerInputFilters_1PathRootDetached_allRemovedAndCorrectCancels() {
         val log = mutableListOf<LogEntry>()
-        val root = PointerInputNodeMock(
-            log = log,
-            coordinator = LayoutCoordinatesStub(false)
-        )
-        val middle = PointerInputNodeMock(
-            log = log,
-            coordinator = LayoutCoordinatesStub(false)
-        )
-        val leaf = PointerInputNodeMock(
-            log = log,
-            coordinator = LayoutCoordinatesStub(false)
-        )
+        val root = PointerInputNodeMock(log = log, coordinator = LayoutCoordinatesStub(false))
+        val middle = PointerInputNodeMock(log = log, coordinator = LayoutCoordinatesStub(false))
+        val leaf = PointerInputNodeMock(log = log, coordinator = LayoutCoordinatesStub(false))
 
         hitPathTracker.addHitPath(PointerId(0), listOf(root, middle, leaf))
 
@@ -1253,27 +1075,16 @@
     fun removeDetachedPointerInputFilters_1PathMiddleDetached_removesAndCancelsCorrect() {
         val log = mutableListOf<LogEntry>()
         val root = PointerInputNodeMock(log)
-        val middle = PointerInputNodeMock(
-            log,
-            coordinator = LayoutCoordinatesStub(false)
-        )
-        val child = PointerInputNodeMock(
-            log,
-            coordinator = LayoutCoordinatesStub(false)
-        )
+        val middle = PointerInputNodeMock(log, coordinator = LayoutCoordinatesStub(false))
+        val child = PointerInputNodeMock(log, coordinator = LayoutCoordinatesStub(false))
 
         val pointerId = PointerId(0)
         hitPathTracker.addHitPath(pointerId, listOf(root, middle, child))
 
         hitPathTracker.removeDetachedPointerInputNodes()
 
-        val expectedRoot = NodeParent().apply {
-            children.add(
-                Node(root).apply {
-                    pointerIds.add(pointerId)
-                }
-            )
-        }
+        val expectedRoot =
+            NodeParent().apply { children.add(Node(root).apply { pointerIds.add(pointerId) }) }
 
         assertThat(areEqual(hitPathTracker.root, expectedRoot)).isTrue()
 
@@ -1290,28 +1101,22 @@
         val log = mutableListOf<LogEntry>()
         val root = PointerInputNodeMock(log)
         val middle = PointerInputNodeMock(log)
-        val leaf = PointerInputNodeMock(
-            log,
-            coordinator = LayoutCoordinatesStub(false)
-        )
+        val leaf = PointerInputNodeMock(log, coordinator = LayoutCoordinatesStub(false))
 
         val pointerId = PointerId(0)
         hitPathTracker.addHitPath(pointerId, listOf(root, middle, leaf))
 
         hitPathTracker.removeDetachedPointerInputNodes()
 
-        val expectedRoot = NodeParent().apply {
-            children.add(
-                Node(root).apply {
-                    pointerIds.add(pointerId)
-                    children.add(
-                        Node(middle).apply {
-                            pointerIds.add(pointerId)
-                        }
-                    )
-                }
-            )
-        }
+        val expectedRoot =
+            NodeParent().apply {
+                children.add(
+                    Node(root).apply {
+                        pointerIds.add(pointerId)
+                        children.add(Node(middle).apply { pointerIds.add(pointerId) })
+                    }
+                )
+            }
 
         assertThat(areEqual(hitPathTracker.root, expectedRoot)).isTrue()
 
@@ -1336,18 +1141,9 @@
         val middle2 = PointerInputNodeMock(log)
         val leaf2 = PointerInputNodeMock(log)
 
-        val root3 = PointerInputNodeMock(
-            log,
-            coordinator = LayoutCoordinatesStub(false)
-        )
-        val middle3 = PointerInputNodeMock(
-            log,
-            coordinator = LayoutCoordinatesStub(false)
-        )
-        val leaf3 = PointerInputNodeMock(
-            log,
-            coordinator = LayoutCoordinatesStub(false)
-        )
+        val root3 = PointerInputNodeMock(log, coordinator = LayoutCoordinatesStub(false))
+        val middle3 = PointerInputNodeMock(log, coordinator = LayoutCoordinatesStub(false))
+        val leaf3 = PointerInputNodeMock(log, coordinator = LayoutCoordinatesStub(false))
 
         val pointerId1 = PointerId(3)
         val pointerId2 = PointerId(5)
@@ -1359,38 +1155,31 @@
 
         hitPathTracker.removeDetachedPointerInputNodes()
 
-        val expectedRoot = NodeParent().apply {
-            children.add(
-                Node(root1).apply {
-                    pointerIds.add(pointerId1)
-                    children.add(
-                        Node(middle1).apply {
-                            pointerIds.add(pointerId1)
-                            children.add(
-                                Node(leaf1).apply {
-                                    pointerIds.add(pointerId1)
-                                }
-                            )
-                        }
-                    )
-                }
-            )
-            children.add(
-                Node(root2).apply {
-                    pointerIds.add(pointerId2)
-                    children.add(
-                        Node(middle2).apply {
-                            pointerIds.add(pointerId2)
-                            children.add(
-                                Node(leaf2).apply {
-                                    pointerIds.add(pointerId2)
-                                }
-                            )
-                        }
-                    )
-                }
-            )
-        }
+        val expectedRoot =
+            NodeParent().apply {
+                children.add(
+                    Node(root1).apply {
+                        pointerIds.add(pointerId1)
+                        children.add(
+                            Node(middle1).apply {
+                                pointerIds.add(pointerId1)
+                                children.add(Node(leaf1).apply { pointerIds.add(pointerId1) })
+                            }
+                        )
+                    }
+                )
+                children.add(
+                    Node(root2).apply {
+                        pointerIds.add(pointerId2)
+                        children.add(
+                            Node(middle2).apply {
+                                pointerIds.add(pointerId2)
+                                children.add(Node(leaf2).apply { pointerIds.add(pointerId2) })
+                            }
+                        )
+                    }
+                )
+            }
 
         assertThat(areEqual(hitPathTracker.root, expectedRoot)).isTrue()
 
@@ -1410,14 +1199,8 @@
         val log = mutableListOf<LogEntry>()
 
         val root1 = PointerInputNodeMock(log)
-        val middle1 = PointerInputNodeMock(
-            log,
-            coordinator = LayoutCoordinatesStub(false)
-        )
-        val leaf1 = PointerInputNodeMock(
-            log,
-            coordinator = LayoutCoordinatesStub(false)
-        )
+        val middle1 = PointerInputNodeMock(log, coordinator = LayoutCoordinatesStub(false))
+        val leaf1 = PointerInputNodeMock(log, coordinator = LayoutCoordinatesStub(false))
 
         val root2 = PointerInputNodeMock()
         val middle2 = PointerInputNodeMock()
@@ -1437,43 +1220,32 @@
 
         hitPathTracker.removeDetachedPointerInputNodes()
 
-        val expectedRoot = NodeParent().apply {
-            children.add(
-                Node(root1).apply {
-                    pointerIds.add(pointerId1)
-                }
-            )
-            children.add(
-                Node(root2).apply {
-                    pointerIds.add(pointerId2)
-                    children.add(
-                        Node(middle2).apply {
-                            pointerIds.add(pointerId2)
-                            children.add(
-                                Node(leaf2).apply {
-                                    pointerIds.add(pointerId2)
-                                }
-                            )
-                        }
-                    )
-                }
-            )
-            children.add(
-                Node(root3).apply {
-                    pointerIds.add(pointerId3)
-                    children.add(
-                        Node(middle3).apply {
-                            pointerIds.add(pointerId3)
-                            children.add(
-                                Node(leaf3).apply {
-                                    pointerIds.add(pointerId3)
-                                }
-                            )
-                        }
-                    )
-                }
-            )
-        }
+        val expectedRoot =
+            NodeParent().apply {
+                children.add(Node(root1).apply { pointerIds.add(pointerId1) })
+                children.add(
+                    Node(root2).apply {
+                        pointerIds.add(pointerId2)
+                        children.add(
+                            Node(middle2).apply {
+                                pointerIds.add(pointerId2)
+                                children.add(Node(leaf2).apply { pointerIds.add(pointerId2) })
+                            }
+                        )
+                    }
+                )
+                children.add(
+                    Node(root3).apply {
+                        pointerIds.add(pointerId3)
+                        children.add(
+                            Node(middle3).apply {
+                                pointerIds.add(pointerId3)
+                                children.add(Node(leaf3).apply { pointerIds.add(pointerId3) })
+                            }
+                        )
+                    }
+                )
+            }
 
         assertThat(areEqual(hitPathTracker.root, expectedRoot)).isTrue()
 
@@ -1497,10 +1269,7 @@
 
         val root2 = PointerInputNodeMock(log)
         val middle2 = PointerInputNodeMock(log)
-        val leaf2 = PointerInputNodeMock(
-            log,
-            coordinator = LayoutCoordinatesStub(false)
-        )
+        val leaf2 = PointerInputNodeMock(log, coordinator = LayoutCoordinatesStub(false))
 
         val root3 = PointerInputNodeMock(log)
         val middle3 = PointerInputNodeMock(log)
@@ -1516,48 +1285,37 @@
 
         hitPathTracker.removeDetachedPointerInputNodes()
 
-        val expectedRoot = NodeParent().apply {
-            children.add(
-                Node(root1).apply {
-                    pointerIds.add(pointerId1)
-                    children.add(
-                        Node(middle1).apply {
-                            pointerIds.add(pointerId1)
-                            children.add(
-                                Node(leaf1).apply {
-                                    pointerIds.add(pointerId1)
-                                }
-                            )
-                        }
-                    )
-                }
-            )
-            children.add(
-                Node(root2).apply {
-                    pointerIds.add(pointerId2)
-                    children.add(
-                        Node(middle2).apply {
-                            pointerIds.add(pointerId2)
-                        }
-                    )
-                }
-            )
-            children.add(
-                Node(root3).apply {
-                    pointerIds.add(pointerId3)
-                    children.add(
-                        Node(middle3).apply {
-                            pointerIds.add(pointerId3)
-                            children.add(
-                                Node(leaf3).apply {
-                                    pointerIds.add(pointerId3)
-                                }
-                            )
-                        }
-                    )
-                }
-            )
-        }
+        val expectedRoot =
+            NodeParent().apply {
+                children.add(
+                    Node(root1).apply {
+                        pointerIds.add(pointerId1)
+                        children.add(
+                            Node(middle1).apply {
+                                pointerIds.add(pointerId1)
+                                children.add(Node(leaf1).apply { pointerIds.add(pointerId1) })
+                            }
+                        )
+                    }
+                )
+                children.add(
+                    Node(root2).apply {
+                        pointerIds.add(pointerId2)
+                        children.add(Node(middle2).apply { pointerIds.add(pointerId2) })
+                    }
+                )
+                children.add(
+                    Node(root3).apply {
+                        pointerIds.add(pointerId3)
+                        children.add(
+                            Node(middle3).apply {
+                                pointerIds.add(pointerId3)
+                                children.add(Node(leaf3).apply { pointerIds.add(pointerId3) })
+                            }
+                        )
+                    }
+                )
+            }
 
         assertThat(areEqual(hitPathTracker.root, expectedRoot)).isTrue()
 
@@ -1574,35 +1332,17 @@
     fun removeDetachedPointerInputFilters_3Roots2Detached_removesAndCancelsCorrect() {
         val log = mutableListOf<LogEntry>()
 
-        val root1 = PointerInputNodeMock(
-            log,
-            coordinator = LayoutCoordinatesStub(false)
-        )
-        val middle1 = PointerInputNodeMock(
-            log,
-            coordinator = LayoutCoordinatesStub(false)
-        )
-        val leaf1 = PointerInputNodeMock(
-            log,
-            coordinator = LayoutCoordinatesStub(false)
-        )
+        val root1 = PointerInputNodeMock(log, coordinator = LayoutCoordinatesStub(false))
+        val middle1 = PointerInputNodeMock(log, coordinator = LayoutCoordinatesStub(false))
+        val leaf1 = PointerInputNodeMock(log, coordinator = LayoutCoordinatesStub(false))
 
         val root2 = PointerInputNodeMock()
         val middle2 = PointerInputNodeMock()
         val leaf2 = PointerInputNodeMock()
 
-        val root3 = PointerInputNodeMock(
-            log,
-            coordinator = LayoutCoordinatesStub(false)
-        )
-        val middle3 = PointerInputNodeMock(
-            log,
-            coordinator = LayoutCoordinatesStub(false)
-        )
-        val leaf3 = PointerInputNodeMock(
-            log,
-            coordinator = LayoutCoordinatesStub(false)
-        )
+        val root3 = PointerInputNodeMock(log, coordinator = LayoutCoordinatesStub(false))
+        val middle3 = PointerInputNodeMock(log, coordinator = LayoutCoordinatesStub(false))
+        val leaf3 = PointerInputNodeMock(log, coordinator = LayoutCoordinatesStub(false))
 
         val pointerId1 = PointerId(3)
         val pointerId2 = PointerId(5)
@@ -1614,23 +1354,20 @@
 
         hitPathTracker.removeDetachedPointerInputNodes()
 
-        val expectedRoot = NodeParent().apply {
-            children.add(
-                Node(root2).apply {
-                    pointerIds.add(pointerId2)
-                    children.add(
-                        Node(middle2).apply {
-                            pointerIds.add(pointerId2)
-                            children.add(
-                                Node(leaf2).apply {
-                                    pointerIds.add(pointerId2)
-                                }
-                            )
-                        }
-                    )
-                }
-            )
-        }
+        val expectedRoot =
+            NodeParent().apply {
+                children.add(
+                    Node(root2).apply {
+                        pointerIds.add(pointerId2)
+                        children.add(
+                            Node(middle2).apply {
+                                pointerIds.add(pointerId2)
+                                children.add(Node(leaf2).apply { pointerIds.add(pointerId2) })
+                            }
+                        )
+                    }
+                )
+            }
 
         assertThat(areEqual(hitPathTracker.root, expectedRoot)).isTrue()
 
@@ -1653,24 +1390,12 @@
         val log = mutableListOf<LogEntry>()
 
         val root1 = PointerInputNodeMock(log)
-        val middle1 = PointerInputNodeMock(
-            log,
-            coordinator = LayoutCoordinatesStub(false)
-        )
-        val leaf1 = PointerInputNodeMock(
-            log,
-            coordinator = LayoutCoordinatesStub(false)
-        )
+        val middle1 = PointerInputNodeMock(log, coordinator = LayoutCoordinatesStub(false))
+        val leaf1 = PointerInputNodeMock(log, coordinator = LayoutCoordinatesStub(false))
 
         val root2 = PointerInputNodeMock()
-        val middle2 = PointerInputNodeMock(
-            log,
-            coordinator = LayoutCoordinatesStub(false)
-        )
-        val leaf2 = PointerInputNodeMock(
-            log,
-            coordinator = LayoutCoordinatesStub(false)
-        )
+        val middle2 = PointerInputNodeMock(log, coordinator = LayoutCoordinatesStub(false))
+        val leaf2 = PointerInputNodeMock(log, coordinator = LayoutCoordinatesStub(false))
 
         val root3 = PointerInputNodeMock()
         val middle3 = PointerInputNodeMock()
@@ -1686,33 +1411,22 @@
 
         hitPathTracker.removeDetachedPointerInputNodes()
 
-        val expectedRoot = NodeParent().apply {
-            children.add(
-                Node(root1).apply {
-                    pointerIds.add(pointerId1)
-                }
-            )
-            children.add(
-                Node(root2).apply {
-                    pointerIds.add(pointerId2)
-                }
-            )
-            children.add(
-                Node(root3).apply {
-                    pointerIds.add(pointerId3)
-                    children.add(
-                        Node(middle3).apply {
-                            pointerIds.add(pointerId3)
-                            children.add(
-                                Node(leaf3).apply {
-                                    pointerIds.add(pointerId3)
-                                }
-                            )
-                        }
-                    )
-                }
-            )
-        }
+        val expectedRoot =
+            NodeParent().apply {
+                children.add(Node(root1).apply { pointerIds.add(pointerId1) })
+                children.add(Node(root2).apply { pointerIds.add(pointerId2) })
+                children.add(
+                    Node(root3).apply {
+                        pointerIds.add(pointerId3)
+                        children.add(
+                            Node(middle3).apply {
+                                pointerIds.add(pointerId3)
+                                children.add(Node(leaf3).apply { pointerIds.add(pointerId3) })
+                            }
+                        )
+                    }
+                )
+            }
 
         assertThat(areEqual(hitPathTracker.root, expectedRoot)).isTrue()
 
@@ -1738,17 +1452,11 @@
 
         val root2 = PointerInputNodeMock(log)
         val middle2 = PointerInputNodeMock(log)
-        val leaf2 = PointerInputNodeMock(
-            log,
-            coordinator = LayoutCoordinatesStub(false)
-        )
+        val leaf2 = PointerInputNodeMock(log, coordinator = LayoutCoordinatesStub(false))
 
         val root3 = PointerInputNodeMock()
         val middle3 = PointerInputNodeMock()
-        val leaf3 = PointerInputNodeMock(
-            log,
-            coordinator = LayoutCoordinatesStub(false)
-        )
+        val leaf3 = PointerInputNodeMock(log, coordinator = LayoutCoordinatesStub(false))
 
         val pointerId1 = PointerId(3)
         val pointerId2 = PointerId(5)
@@ -1760,43 +1468,32 @@
 
         hitPathTracker.removeDetachedPointerInputNodes()
 
-        val expectedRoot = NodeParent().apply {
-            children.add(
-                Node(root1).apply {
-                    pointerIds.add(pointerId1)
-                    children.add(
-                        Node(middle1).apply {
-                            pointerIds.add(pointerId1)
-                            children.add(
-                                Node(leaf1).apply {
-                                    pointerIds.add(pointerId1)
-                                }
-                            )
-                        }
-                    )
-                }
-            )
-            children.add(
-                Node(root2).apply {
-                    pointerIds.add(pointerId2)
-                    children.add(
-                        Node(middle2).apply {
-                            pointerIds.add(pointerId2)
-                        }
-                    )
-                }
-            )
-            children.add(
-                Node(root3).apply {
-                    pointerIds.add(pointerId3)
-                    children.add(
-                        Node(middle3).apply {
-                            pointerIds.add(pointerId3)
-                        }
-                    )
-                }
-            )
-        }
+        val expectedRoot =
+            NodeParent().apply {
+                children.add(
+                    Node(root1).apply {
+                        pointerIds.add(pointerId1)
+                        children.add(
+                            Node(middle1).apply {
+                                pointerIds.add(pointerId1)
+                                children.add(Node(leaf1).apply { pointerIds.add(pointerId1) })
+                            }
+                        )
+                    }
+                )
+                children.add(
+                    Node(root2).apply {
+                        pointerIds.add(pointerId2)
+                        children.add(Node(middle2).apply { pointerIds.add(pointerId2) })
+                    }
+                )
+                children.add(
+                    Node(root3).apply {
+                        pointerIds.add(pointerId3)
+                        children.add(Node(middle3).apply { pointerIds.add(pointerId3) })
+                    }
+                )
+            }
 
         assertThat(areEqual(hitPathTracker.root, expectedRoot)).isTrue()
 
@@ -1814,44 +1511,17 @@
     fun removeDetachedPointerInputFilters_3Roots3Detached_allRemovedAndCancelsCorrect() {
         val log = mutableListOf<LogEntry>()
 
-        val root1 = PointerInputNodeMock(
-            log,
-            coordinator = LayoutCoordinatesStub(false)
-        )
-        val middle1 = PointerInputNodeMock(
-            log,
-            coordinator = LayoutCoordinatesStub(false)
-        )
-        val leaf1 = PointerInputNodeMock(
-            log,
-            coordinator = LayoutCoordinatesStub(false)
-        )
+        val root1 = PointerInputNodeMock(log, coordinator = LayoutCoordinatesStub(false))
+        val middle1 = PointerInputNodeMock(log, coordinator = LayoutCoordinatesStub(false))
+        val leaf1 = PointerInputNodeMock(log, coordinator = LayoutCoordinatesStub(false))
 
-        val root2 = PointerInputNodeMock(
-            log,
-            coordinator = LayoutCoordinatesStub(false)
-        )
-        val middle2 = PointerInputNodeMock(
-            log,
-            coordinator = LayoutCoordinatesStub(false)
-        )
-        val leaf2 = PointerInputNodeMock(
-            log,
-            coordinator = LayoutCoordinatesStub(false)
-        )
+        val root2 = PointerInputNodeMock(log, coordinator = LayoutCoordinatesStub(false))
+        val middle2 = PointerInputNodeMock(log, coordinator = LayoutCoordinatesStub(false))
+        val leaf2 = PointerInputNodeMock(log, coordinator = LayoutCoordinatesStub(false))
 
-        val root3 = PointerInputNodeMock(
-            log,
-            coordinator = LayoutCoordinatesStub(false)
-        )
-        val middle3 = PointerInputNodeMock(
-            log,
-            coordinator = LayoutCoordinatesStub(false)
-        )
-        val leaf3 = PointerInputNodeMock(
-            log,
-            coordinator = LayoutCoordinatesStub(false)
-        )
+        val root3 = PointerInputNodeMock(log, coordinator = LayoutCoordinatesStub(false))
+        val middle3 = PointerInputNodeMock(log, coordinator = LayoutCoordinatesStub(false))
+        val leaf3 = PointerInputNodeMock(log, coordinator = LayoutCoordinatesStub(false))
 
         hitPathTracker.addHitPath(PointerId(3), listOf(root1, middle1, leaf1))
         hitPathTracker.addHitPath(PointerId(5), listOf(root2, middle2, leaf2))
@@ -1885,34 +1555,16 @@
         val log = mutableListOf<LogEntry>()
 
         val root1 = PointerInputNodeMock(log)
-        val middle1 = PointerInputNodeMock(
-            log,
-            coordinator = LayoutCoordinatesStub(false)
-        )
-        val leaf1 = PointerInputNodeMock(
-            log,
-            coordinator = LayoutCoordinatesStub(false)
-        )
+        val middle1 = PointerInputNodeMock(log, coordinator = LayoutCoordinatesStub(false))
+        val leaf1 = PointerInputNodeMock(log, coordinator = LayoutCoordinatesStub(false))
 
         val root2 = PointerInputNodeMock(log)
-        val middle2 = PointerInputNodeMock(
-            log,
-            coordinator = LayoutCoordinatesStub(false)
-        )
-        val leaf2 = PointerInputNodeMock(
-            log,
-            coordinator = LayoutCoordinatesStub(false)
-        )
+        val middle2 = PointerInputNodeMock(log, coordinator = LayoutCoordinatesStub(false))
+        val leaf2 = PointerInputNodeMock(log, coordinator = LayoutCoordinatesStub(false))
 
         val root3 = PointerInputNodeMock(log)
-        val middle3 = PointerInputNodeMock(
-            log,
-            coordinator = LayoutCoordinatesStub(false)
-        )
-        val leaf3 = PointerInputNodeMock(
-            log,
-            coordinator = LayoutCoordinatesStub(false)
-        )
+        val middle3 = PointerInputNodeMock(log, coordinator = LayoutCoordinatesStub(false))
+        val leaf3 = PointerInputNodeMock(log, coordinator = LayoutCoordinatesStub(false))
 
         val pointerId1 = PointerId(3)
         val pointerId2 = PointerId(5)
@@ -1924,23 +1576,12 @@
 
         hitPathTracker.removeDetachedPointerInputNodes()
 
-        val expectedRoot = NodeParent().apply {
-            children.add(
-                Node(root1).apply {
-                    pointerIds.add(pointerId1)
-                }
-            )
-            children.add(
-                Node(root2).apply {
-                    pointerIds.add(pointerId2)
-                }
-            )
-            children.add(
-                Node(root3).apply {
-                    pointerIds.add(pointerId3)
-                }
-            )
-        }
+        val expectedRoot =
+            NodeParent().apply {
+                children.add(Node(root1).apply { pointerIds.add(pointerId1) })
+                children.add(Node(root2).apply { pointerIds.add(pointerId2) })
+                children.add(Node(root3).apply { pointerIds.add(pointerId3) })
+            }
 
         assertThat(areEqual(hitPathTracker.root, expectedRoot)).isTrue()
 
@@ -1964,24 +1605,15 @@
 
         val root1 = PointerInputNodeMock(log)
         val middle1 = PointerInputNodeMock(log)
-        val leaf1 = PointerInputNodeMock(
-            log,
-            coordinator = LayoutCoordinatesStub(false)
-        )
+        val leaf1 = PointerInputNodeMock(log, coordinator = LayoutCoordinatesStub(false))
 
         val root2 = PointerInputNodeMock(log)
         val middle2 = PointerInputNodeMock(log)
-        val leaf2 = PointerInputNodeMock(
-            log,
-            coordinator = LayoutCoordinatesStub(false)
-        )
+        val leaf2 = PointerInputNodeMock(log, coordinator = LayoutCoordinatesStub(false))
 
         val root3 = PointerInputNodeMock(log)
         val middle3 = PointerInputNodeMock(log)
-        val leaf3 = PointerInputNodeMock(
-            log,
-            coordinator = LayoutCoordinatesStub(false)
-        )
+        val leaf3 = PointerInputNodeMock(log, coordinator = LayoutCoordinatesStub(false))
 
         val pointerId1 = PointerId(3)
         val pointerId2 = PointerId(5)
@@ -1993,38 +1625,27 @@
 
         hitPathTracker.removeDetachedPointerInputNodes()
 
-        val expectedRoot = NodeParent().apply {
-            children.add(
-                Node(root1).apply {
-                    pointerIds.add(pointerId1)
-                    children.add(
-                        Node(middle1).apply {
-                            pointerIds.add(pointerId1)
-                        }
-                    )
-                }
-            )
-            children.add(
-                Node(root2).apply {
-                    pointerIds.add(pointerId2)
-                    children.add(
-                        Node(middle2).apply {
-                            pointerIds.add(pointerId2)
-                        }
-                    )
-                }
-            )
-            children.add(
-                Node(root3).apply {
-                    pointerIds.add(pointerId3)
-                    children.add(
-                        Node(middle3).apply {
-                            pointerIds.add(pointerId3)
-                        }
-                    )
-                }
-            )
-        }
+        val expectedRoot =
+            NodeParent().apply {
+                children.add(
+                    Node(root1).apply {
+                        pointerIds.add(pointerId1)
+                        children.add(Node(middle1).apply { pointerIds.add(pointerId1) })
+                    }
+                )
+                children.add(
+                    Node(root2).apply {
+                        pointerIds.add(pointerId2)
+                        children.add(Node(middle2).apply { pointerIds.add(pointerId2) })
+                    }
+                )
+                children.add(
+                    Node(root3).apply {
+                        pointerIds.add(pointerId3)
+                        children.add(Node(middle3).apply { pointerIds.add(pointerId3) })
+                    }
+                )
+            }
 
         assertThat(areEqual(hitPathTracker.root, expectedRoot)).isTrue()
 
@@ -2043,35 +1664,17 @@
     fun removeDetachedPointerInputFilters_3RootsStaggeredDetached_removesAndCancelsCorrect() {
         val log = mutableListOf<LogEntry>()
 
-        val root1 = PointerInputNodeMock(
-            log,
-            coordinator = LayoutCoordinatesStub(false)
-        )
-        val middle1 = PointerInputNodeMock(
-            log,
-            coordinator = LayoutCoordinatesStub(false)
-        )
-        val leaf1 = PointerInputNodeMock(
-            log,
-            coordinator = LayoutCoordinatesStub(false)
-        )
+        val root1 = PointerInputNodeMock(log, coordinator = LayoutCoordinatesStub(false))
+        val middle1 = PointerInputNodeMock(log, coordinator = LayoutCoordinatesStub(false))
+        val leaf1 = PointerInputNodeMock(log, coordinator = LayoutCoordinatesStub(false))
 
         val root2 = PointerInputNodeMock(log)
-        val middle2 = PointerInputNodeMock(
-            log,
-            coordinator = LayoutCoordinatesStub(false)
-        )
-        val leaf2 = PointerInputNodeMock(
-            log,
-            coordinator = LayoutCoordinatesStub(false)
-        )
+        val middle2 = PointerInputNodeMock(log, coordinator = LayoutCoordinatesStub(false))
+        val leaf2 = PointerInputNodeMock(log, coordinator = LayoutCoordinatesStub(false))
 
         val root3 = PointerInputNodeMock(log)
         val middle3 = PointerInputNodeMock(log)
-        val leaf3 = PointerInputNodeMock(
-            log,
-            coordinator = LayoutCoordinatesStub(false)
-        )
+        val leaf3 = PointerInputNodeMock(log, coordinator = LayoutCoordinatesStub(false))
 
         val pointerId1 = PointerId(3)
         val pointerId2 = PointerId(5)
@@ -2083,23 +1686,16 @@
 
         hitPathTracker.removeDetachedPointerInputNodes()
 
-        val expectedRoot = NodeParent().apply {
-            children.add(
-                Node(root2).apply {
-                    pointerIds.add(pointerId2)
-                }
-            )
-            children.add(
-                Node(root3).apply {
-                    pointerIds.add(pointerId3)
-                    children.add(
-                        Node(middle3).apply {
-                            pointerIds.add(pointerId3)
-                        }
-                    )
-                }
-            )
-        }
+        val expectedRoot =
+            NodeParent().apply {
+                children.add(Node(root2).apply { pointerIds.add(pointerId2) })
+                children.add(
+                    Node(root3).apply {
+                        pointerIds.add(pointerId3)
+                        children.add(Node(middle3).apply { pointerIds.add(pointerId3) })
+                    }
+                )
+            }
 
         assertThat(areEqual(hitPathTracker.root, expectedRoot)).isTrue()
 
@@ -2122,37 +1718,16 @@
     fun removeDetachedPointerInputFilters_rootWith3MiddlesDetached_allRemovedAndCorrectCancels() {
         val log = mutableListOf<LogEntry>()
 
-        val root = PointerInputNodeMock(
-            log,
-            coordinator = LayoutCoordinatesStub(false)
-        )
+        val root = PointerInputNodeMock(log, coordinator = LayoutCoordinatesStub(false))
 
-        val middle1 = PointerInputNodeMock(
-            log,
-            coordinator = LayoutCoordinatesStub(false)
-        )
-        val leaf1 = PointerInputNodeMock(
-            log,
-            coordinator = LayoutCoordinatesStub(false)
-        )
+        val middle1 = PointerInputNodeMock(log, coordinator = LayoutCoordinatesStub(false))
+        val leaf1 = PointerInputNodeMock(log, coordinator = LayoutCoordinatesStub(false))
 
-        val middle2 = PointerInputNodeMock(
-            log,
-            coordinator = LayoutCoordinatesStub(false)
-        )
-        val leaf2 = PointerInputNodeMock(
-            log,
-            coordinator = LayoutCoordinatesStub(false)
-        )
+        val middle2 = PointerInputNodeMock(log, coordinator = LayoutCoordinatesStub(false))
+        val leaf2 = PointerInputNodeMock(log, coordinator = LayoutCoordinatesStub(false))
 
-        val middle3 = PointerInputNodeMock(
-            log,
-            coordinator = LayoutCoordinatesStub(false)
-        )
-        val leaf3 = PointerInputNodeMock(
-            log,
-            coordinator = LayoutCoordinatesStub(false)
-        )
+        val middle3 = PointerInputNodeMock(log, coordinator = LayoutCoordinatesStub(false))
+        val leaf3 = PointerInputNodeMock(log, coordinator = LayoutCoordinatesStub(false))
 
         hitPathTracker.addHitPath(PointerId(3), listOf(root, middle1, leaf1))
         hitPathTracker.addHitPath(PointerId(5), listOf(root, middle2, leaf2))
@@ -2164,23 +1739,26 @@
 
         assertThat(areEqual(hitPathTracker.root, expectedRoot)).isTrue()
 
-        val log1 = log.getOnCancelLog().filter {
-            it.pointerInputNode == leaf1 ||
-                it.pointerInputNode == middle1 ||
-                it.pointerInputNode == root
-        }
+        val log1 =
+            log.getOnCancelLog().filter {
+                it.pointerInputNode == leaf1 ||
+                    it.pointerInputNode == middle1 ||
+                    it.pointerInputNode == root
+            }
 
-        val log2 = log.getOnCancelLog().filter {
-            it.pointerInputNode == leaf2 ||
-                it.pointerInputNode == middle2 ||
-                it.pointerInputNode == root
-        }
+        val log2 =
+            log.getOnCancelLog().filter {
+                it.pointerInputNode == leaf2 ||
+                    it.pointerInputNode == middle2 ||
+                    it.pointerInputNode == root
+            }
 
-        val log3 = log.getOnCancelLog().filter {
-            it.pointerInputNode == leaf3 ||
-                it.pointerInputNode == middle3 ||
-                it.pointerInputNode == root
-        }
+        val log3 =
+            log.getOnCancelLog().filter {
+                it.pointerInputNode == leaf3 ||
+                    it.pointerInputNode == middle3 ||
+                    it.pointerInputNode == root
+            }
 
         assertThat(log1).hasSize(3)
         assertThat(log1[0].pointerInputNode).isEqualTo(leaf1)
@@ -2214,14 +1792,8 @@
         val middle2 = PointerInputNodeMock(log)
         val leaf2 = PointerInputNodeMock(log)
 
-        val middle3 = PointerInputNodeMock(
-            log,
-            coordinator = LayoutCoordinatesStub(false)
-        )
-        val leaf3 = PointerInputNodeMock(
-            log,
-            coordinator = LayoutCoordinatesStub(false)
-        )
+        val middle3 = PointerInputNodeMock(log, coordinator = LayoutCoordinatesStub(false))
+        val leaf3 = PointerInputNodeMock(log, coordinator = LayoutCoordinatesStub(false))
 
         val pointerId1 = PointerId(3)
         val pointerId2 = PointerId(5)
@@ -2233,35 +1805,28 @@
 
         hitPathTracker.removeDetachedPointerInputNodes()
 
-        val expectedRoot = NodeParent().apply {
-            children.add(
-                Node(root).apply {
-                    pointerIds.add(pointerId1)
-                    pointerIds.add(pointerId2)
-                    pointerIds.add(pointerId3)
-                    children.add(
-                        Node(middle1).apply {
-                            pointerIds.add(pointerId1)
-                            children.add(
-                                Node(leaf1).apply {
-                                    pointerIds.add(pointerId1)
-                                }
-                            )
-                        }
-                    )
-                    children.add(
-                        Node(middle2).apply {
-                            pointerIds.add(pointerId2)
-                            children.add(
-                                Node(leaf2).apply {
-                                    pointerIds.add(pointerId2)
-                                }
-                            )
-                        }
-                    )
-                }
-            )
-        }
+        val expectedRoot =
+            NodeParent().apply {
+                children.add(
+                    Node(root).apply {
+                        pointerIds.add(pointerId1)
+                        pointerIds.add(pointerId2)
+                        pointerIds.add(pointerId3)
+                        children.add(
+                            Node(middle1).apply {
+                                pointerIds.add(pointerId1)
+                                children.add(Node(leaf1).apply { pointerIds.add(pointerId1) })
+                            }
+                        )
+                        children.add(
+                            Node(middle2).apply {
+                                pointerIds.add(pointerId2)
+                                children.add(Node(leaf2).apply { pointerIds.add(pointerId2) })
+                            }
+                        )
+                    }
+                )
+            }
 
         assertThat(areEqual(hitPathTracker.root, expectedRoot)).isTrue()
 
@@ -2282,23 +1847,11 @@
 
         val root = PointerInputNodeMock(log)
 
-        val middle1 = PointerInputNodeMock(
-            log,
-            coordinator = LayoutCoordinatesStub(false)
-        )
-        val leaf1 = PointerInputNodeMock(
-            log,
-            coordinator = LayoutCoordinatesStub(false)
-        )
+        val middle1 = PointerInputNodeMock(log, coordinator = LayoutCoordinatesStub(false))
+        val leaf1 = PointerInputNodeMock(log, coordinator = LayoutCoordinatesStub(false))
 
-        val middle2 = PointerInputNodeMock(
-            log,
-            coordinator = LayoutCoordinatesStub(false)
-        )
-        val leaf2 = PointerInputNodeMock(
-            log,
-            coordinator = LayoutCoordinatesStub(false)
-        )
+        val middle2 = PointerInputNodeMock(log, coordinator = LayoutCoordinatesStub(false))
+        val leaf2 = PointerInputNodeMock(log, coordinator = LayoutCoordinatesStub(false))
 
         val middle3 = PointerInputNodeMock(log)
         val leaf3 = PointerInputNodeMock(log)
@@ -2313,25 +1866,22 @@
 
         hitPathTracker.removeDetachedPointerInputNodes()
 
-        val expectedRoot = NodeParent().apply {
-            children.add(
-                Node(root).apply {
-                    pointerIds.add(pointerId1)
-                    pointerIds.add(pointerId2)
-                    pointerIds.add(pointerId3)
-                    children.add(
-                        Node(middle3).apply {
-                            pointerIds.add(pointerId3)
-                            children.add(
-                                Node(leaf3).apply {
-                                    pointerIds.add(pointerId3)
-                                }
-                            )
-                        }
-                    )
-                }
-            )
-        }
+        val expectedRoot =
+            NodeParent().apply {
+                children.add(
+                    Node(root).apply {
+                        pointerIds.add(pointerId1)
+                        pointerIds.add(pointerId2)
+                        pointerIds.add(pointerId3)
+                        children.add(
+                            Node(middle3).apply {
+                                pointerIds.add(pointerId3)
+                                children.add(Node(leaf3).apply { pointerIds.add(pointerId3) })
+                            }
+                        )
+                    }
+                )
+            }
 
         assertThat(areEqual(hitPathTracker.root, expectedRoot)).isTrue()
 
@@ -2354,32 +1904,14 @@
 
         val root = PointerInputNodeMock(log)
 
-        val middle1 = PointerInputNodeMock(
-            log,
-            coordinator = LayoutCoordinatesStub(false)
-        )
-        val leaf1 = PointerInputNodeMock(
-            log,
-            coordinator = LayoutCoordinatesStub(false)
-        )
+        val middle1 = PointerInputNodeMock(log, coordinator = LayoutCoordinatesStub(false))
+        val leaf1 = PointerInputNodeMock(log, coordinator = LayoutCoordinatesStub(false))
 
-        val middle2 = PointerInputNodeMock(
-            log,
-            coordinator = LayoutCoordinatesStub(false)
-        )
-        val leaf2 = PointerInputNodeMock(
-            log,
-            coordinator = LayoutCoordinatesStub(false)
-        )
+        val middle2 = PointerInputNodeMock(log, coordinator = LayoutCoordinatesStub(false))
+        val leaf2 = PointerInputNodeMock(log, coordinator = LayoutCoordinatesStub(false))
 
-        val middle3 = PointerInputNodeMock(
-            log,
-            coordinator = LayoutCoordinatesStub(false)
-        )
-        val leaf3 = PointerInputNodeMock(
-            log,
-            coordinator = LayoutCoordinatesStub(false)
-        )
+        val middle3 = PointerInputNodeMock(log, coordinator = LayoutCoordinatesStub(false))
+        val leaf3 = PointerInputNodeMock(log, coordinator = LayoutCoordinatesStub(false))
 
         val pointerId1 = PointerId(3)
         val pointerId2 = PointerId(5)
@@ -2391,15 +1923,16 @@
 
         hitPathTracker.removeDetachedPointerInputNodes()
 
-        val expectedRoot = NodeParent().apply {
-            children.add(
-                Node(root).apply {
-                    pointerIds.add(pointerId1)
-                    pointerIds.add(pointerId2)
-                    pointerIds.add(pointerId3)
-                }
-            )
-        }
+        val expectedRoot =
+            NodeParent().apply {
+                children.add(
+                    Node(root).apply {
+                        pointerIds.add(pointerId1)
+                        pointerIds.add(pointerId2)
+                        pointerIds.add(pointerId3)
+                    }
+                )
+            }
 
         assertThat(areEqual(hitPathTracker.root, expectedRoot)).isTrue()
 
@@ -2427,10 +1960,7 @@
         val middle = PointerInputNodeMock(log)
 
         val leaf1 = PointerInputNodeMock(log)
-        val leaf2 = PointerInputNodeMock(
-            log,
-            coordinator = LayoutCoordinatesStub(false)
-        )
+        val leaf2 = PointerInputNodeMock(log, coordinator = LayoutCoordinatesStub(false))
         val leaf3 = PointerInputNodeMock(log)
 
         val pointerId1 = PointerId(3)
@@ -2443,32 +1973,25 @@
 
         hitPathTracker.removeDetachedPointerInputNodes()
 
-        val expectedRoot = NodeParent().apply {
-            children.add(
-                Node(root).apply {
-                    pointerIds.add(pointerId1)
-                    pointerIds.add(pointerId2)
-                    pointerIds.add(pointerId3)
-                    children.add(
-                        Node(middle).apply {
-                            pointerIds.add(pointerId1)
-                            pointerIds.add(pointerId2)
-                            pointerIds.add(pointerId3)
-                            children.add(
-                                Node(leaf1).apply {
-                                    pointerIds.add(pointerId1)
-                                }
-                            )
-                            children.add(
-                                Node(leaf3).apply {
-                                    pointerIds.add(pointerId3)
-                                }
-                            )
-                        }
-                    )
-                }
-            )
-        }
+        val expectedRoot =
+            NodeParent().apply {
+                children.add(
+                    Node(root).apply {
+                        pointerIds.add(pointerId1)
+                        pointerIds.add(pointerId2)
+                        pointerIds.add(pointerId3)
+                        children.add(
+                            Node(middle).apply {
+                                pointerIds.add(pointerId1)
+                                pointerIds.add(pointerId2)
+                                pointerIds.add(pointerId3)
+                                children.add(Node(leaf1).apply { pointerIds.add(pointerId1) })
+                                children.add(Node(leaf3).apply { pointerIds.add(pointerId3) })
+                            }
+                        )
+                    }
+                )
+            }
 
         assertThat(areEqual(hitPathTracker.root, expectedRoot)).isTrue()
 
@@ -2490,15 +2013,9 @@
 
         val middle = PointerInputNodeMock(log)
 
-        val leaf1 = PointerInputNodeMock(
-            log,
-            coordinator = LayoutCoordinatesStub(false)
-        )
+        val leaf1 = PointerInputNodeMock(log, coordinator = LayoutCoordinatesStub(false))
         val leaf2 = PointerInputNodeMock(log)
-        val leaf3 = PointerInputNodeMock(
-            log,
-            coordinator = LayoutCoordinatesStub(false)
-        )
+        val leaf3 = PointerInputNodeMock(log, coordinator = LayoutCoordinatesStub(false))
 
         val pointerId1 = PointerId(3)
         val pointerId2 = PointerId(5)
@@ -2510,27 +2027,24 @@
 
         hitPathTracker.removeDetachedPointerInputNodes()
 
-        val expectedRoot = NodeParent().apply {
-            children.add(
-                Node(root).apply {
-                    pointerIds.add(pointerId1)
-                    pointerIds.add(pointerId2)
-                    pointerIds.add(pointerId3)
-                    children.add(
-                        Node(middle).apply {
-                            pointerIds.add(pointerId1)
-                            pointerIds.add(pointerId2)
-                            pointerIds.add(pointerId3)
-                            children.add(
-                                Node(leaf2).apply {
-                                    pointerIds.add(pointerId2)
-                                }
-                            )
-                        }
-                    )
-                }
-            )
-        }
+        val expectedRoot =
+            NodeParent().apply {
+                children.add(
+                    Node(root).apply {
+                        pointerIds.add(pointerId1)
+                        pointerIds.add(pointerId2)
+                        pointerIds.add(pointerId3)
+                        children.add(
+                            Node(middle).apply {
+                                pointerIds.add(pointerId1)
+                                pointerIds.add(pointerId2)
+                                pointerIds.add(pointerId3)
+                                children.add(Node(leaf2).apply { pointerIds.add(pointerId2) })
+                            }
+                        )
+                    }
+                )
+            }
 
         assertThat(areEqual(hitPathTracker.root, expectedRoot)).isTrue()
 
@@ -2553,18 +2067,9 @@
 
         val middle = PointerInputNodeMock(log)
 
-        val leaf1 = PointerInputNodeMock(
-            log,
-            coordinator = LayoutCoordinatesStub(false)
-        )
-        val leaf2 = PointerInputNodeMock(
-            log,
-            coordinator = LayoutCoordinatesStub(false)
-        )
-        val leaf3 = PointerInputNodeMock(
-            log,
-            coordinator = LayoutCoordinatesStub(false)
-        )
+        val leaf1 = PointerInputNodeMock(log, coordinator = LayoutCoordinatesStub(false))
+        val leaf2 = PointerInputNodeMock(log, coordinator = LayoutCoordinatesStub(false))
+        val leaf3 = PointerInputNodeMock(log, coordinator = LayoutCoordinatesStub(false))
 
         val pointerId1 = PointerId(3)
         val pointerId2 = PointerId(5)
@@ -2576,22 +2081,23 @@
 
         hitPathTracker.removeDetachedPointerInputNodes()
 
-        val expectedRoot = NodeParent().apply {
-            children.add(
-                Node(root).apply {
-                    pointerIds.add(pointerId1)
-                    pointerIds.add(pointerId2)
-                    pointerIds.add(pointerId3)
-                    children.add(
-                        Node(middle).apply {
-                            pointerIds.add(pointerId1)
-                            pointerIds.add(pointerId2)
-                            pointerIds.add(pointerId3)
-                        }
-                    )
-                }
-            )
-        }
+        val expectedRoot =
+            NodeParent().apply {
+                children.add(
+                    Node(root).apply {
+                        pointerIds.add(pointerId1)
+                        pointerIds.add(pointerId2)
+                        pointerIds.add(pointerId3)
+                        children.add(
+                            Node(middle).apply {
+                                pointerIds.add(pointerId1)
+                                pointerIds.add(pointerId2)
+                                pointerIds.add(pointerId3)
+                            }
+                        )
+                    }
+                )
+            }
 
         assertThat(areEqual(hitPathTracker.root, expectedRoot)).isTrue()
 
@@ -2634,27 +2140,22 @@
 
         hitPathTracker.addHitPath(pointerId1, listOf(root, middle, leaf))
 
-        hitPathTracker.dispatchChanges(
-            internalPointerEventOf(down(99).up(1L), down(3))
-        )
+        hitPathTracker.dispatchChanges(internalPointerEventOf(down(99).up(1L), down(3)))
 
-        val expectedRoot = NodeParent().apply {
-            children.add(
-                Node(root).apply {
-                    pointerIds.add(pointerId1)
-                    children.add(
-                        Node(middle).apply {
-                            pointerIds.add(pointerId1)
-                            children.add(
-                                Node(leaf).apply {
-                                    pointerIds.add(pointerId1)
-                                }
-                            )
-                        }
-                    )
-                }
-            )
-        }
+        val expectedRoot =
+            NodeParent().apply {
+                children.add(
+                    Node(root).apply {
+                        pointerIds.add(pointerId1)
+                        children.add(
+                            Node(middle).apply {
+                                pointerIds.add(pointerId1)
+                                children.add(Node(leaf).apply { pointerIds.add(pointerId1) })
+                            }
+                        )
+                    }
+                )
+            }
 
         assertThat(areEqual(hitPathTracker.root, expectedRoot)).isTrue()
     }
@@ -2684,27 +2185,22 @@
         hitPathTracker.addHitPath(pointerId1, listOf(root1, middle1, leaf1))
         hitPathTracker.addHitPath(pointerId2, listOf(root2, middle2, leaf2))
 
-        hitPathTracker.dispatchChanges(
-            internalPointerEventOf(down(5).up(1L), down(3))
-        )
+        hitPathTracker.dispatchChanges(internalPointerEventOf(down(5).up(1L), down(3)))
 
-        val expectedRoot = NodeParent().apply {
-            children.add(
-                Node(root1).apply {
-                    pointerIds.add(pointerId1)
-                    children.add(
-                        Node(middle1).apply {
-                            pointerIds.add(pointerId1)
-                            children.add(
-                                Node(leaf1).apply {
-                                    pointerIds.add(pointerId1)
-                                }
-                            )
-                        }
-                    )
-                }
-            )
-        }
+        val expectedRoot =
+            NodeParent().apply {
+                children.add(
+                    Node(root1).apply {
+                        pointerIds.add(pointerId1)
+                        children.add(
+                            Node(middle1).apply {
+                                pointerIds.add(pointerId1)
+                                children.add(Node(leaf1).apply { pointerIds.add(pointerId1) })
+                            }
+                        )
+                    }
+                )
+            }
 
         assertThat(areEqual(hitPathTracker.root, expectedRoot)).isTrue()
     }
@@ -2724,27 +2220,22 @@
         hitPathTracker.addHitPath(pointerId1, listOf(root, middle, leaf))
         hitPathTracker.addHitPath(pointerId2, listOf(root, middle, leaf))
 
-        hitPathTracker.dispatchChanges(
-            internalPointerEventOf(down(3).up(1L), down(5))
-        )
+        hitPathTracker.dispatchChanges(internalPointerEventOf(down(3).up(1L), down(5)))
 
-        val expectedRoot = NodeParent().apply {
-            children.add(
-                Node(root).apply {
-                    pointerIds.add(pointerId2)
-                    children.add(
-                        Node(middle).apply {
-                            pointerIds.add(pointerId2)
-                            children.add(
-                                Node(leaf).apply {
-                                    pointerIds.add(pointerId2)
-                                }
-                            )
-                        }
-                    )
-                }
-            )
-        }
+        val expectedRoot =
+            NodeParent().apply {
+                children.add(
+                    Node(root).apply {
+                        pointerIds.add(pointerId2)
+                        children.add(
+                            Node(middle).apply {
+                                pointerIds.add(pointerId2)
+                                children.add(Node(leaf).apply { pointerIds.add(pointerId2) })
+                            }
+                        )
+                    }
+                )
+            }
 
         assertThat(areEqual(hitPathTracker.root, expectedRoot)).isTrue()
     }
@@ -2764,22 +2255,17 @@
         hitPathTracker.addHitPath(pointerId1, listOf(root, middle, leaf))
         hitPathTracker.addHitPath(pointerId2, listOf(root, middle))
 
-        hitPathTracker.dispatchChanges(
-            internalPointerEventOf(down(3).up(1L), down(5))
-        )
+        hitPathTracker.dispatchChanges(internalPointerEventOf(down(3).up(1L), down(5)))
 
-        val expectedRoot = NodeParent().apply {
-            children.add(
-                Node(root).apply {
-                    pointerIds.add(pointerId2)
-                    children.add(
-                        Node(middle).apply {
-                            pointerIds.add(pointerId2)
-                        }
-                    )
-                }
-            )
-        }
+        val expectedRoot =
+            NodeParent().apply {
+                children.add(
+                    Node(root).apply {
+                        pointerIds.add(pointerId2)
+                        children.add(Node(middle).apply { pointerIds.add(pointerId2) })
+                    }
+                )
+            }
 
         assertThat(areEqual(hitPathTracker.root, expectedRoot)).isTrue()
     }
@@ -2799,27 +2285,22 @@
         hitPathTracker.addHitPath(pointerId1, listOf(root, middle, leaf))
         hitPathTracker.addHitPath(pointerId2, listOf(root, middle))
 
-        hitPathTracker.dispatchChanges(
-            internalPointerEventOf(down(5).up(1L), down(3))
-        )
+        hitPathTracker.dispatchChanges(internalPointerEventOf(down(5).up(1L), down(3)))
 
-        val expectedRoot = NodeParent().apply {
-            children.add(
-                Node(root).apply {
-                    pointerIds.add(pointerId1)
-                    children.add(
-                        Node(middle).apply {
-                            pointerIds.add(pointerId1)
-                            children.add(
-                                Node(leaf).apply {
-                                    pointerIds.add(pointerId1)
-                                }
-                            )
-                        }
-                    )
-                }
-            )
-        }
+        val expectedRoot =
+            NodeParent().apply {
+                children.add(
+                    Node(root).apply {
+                        pointerIds.add(pointerId1)
+                        children.add(
+                            Node(middle).apply {
+                                pointerIds.add(pointerId1)
+                                children.add(Node(leaf).apply { pointerIds.add(pointerId1) })
+                            }
+                        )
+                    }
+                )
+            }
 
         assertThat(areEqual(hitPathTracker.root, expectedRoot)).isTrue()
     }
@@ -2839,17 +2320,10 @@
         hitPathTracker.addHitPath(pointerId1, listOf(root, middle, leaf))
         hitPathTracker.addHitPath(pointerId2, listOf(root))
 
-        hitPathTracker.dispatchChanges(
-            internalPointerEventOf(down(3).up(1L), down(5))
-        )
+        hitPathTracker.dispatchChanges(internalPointerEventOf(down(3).up(1L), down(5)))
 
-        val expectedRoot = NodeParent().apply {
-            children.add(
-                Node(root).apply {
-                    pointerIds.add(pointerId2)
-                }
-            )
-        }
+        val expectedRoot =
+            NodeParent().apply { children.add(Node(root).apply { pointerIds.add(pointerId2) }) }
 
         assertThat(areEqual(hitPathTracker.root, expectedRoot)).isTrue()
     }
@@ -2869,27 +2343,22 @@
         hitPathTracker.addHitPath(pointerId1, listOf(root, middle, leaf))
         hitPathTracker.addHitPath(pointerId2, listOf(root))
 
-        hitPathTracker.dispatchChanges(
-            internalPointerEventOf(down(5).up(1L), down(3))
-        )
+        hitPathTracker.dispatchChanges(internalPointerEventOf(down(5).up(1L), down(3)))
 
-        val expectedRoot = NodeParent().apply {
-            children.add(
-                Node(root).apply {
-                    pointerIds.add(pointerId1)
-                    children.add(
-                        Node(middle).apply {
-                            pointerIds.add(pointerId1)
-                            children.add(
-                                Node(leaf).apply {
-                                    pointerIds.add(pointerId1)
-                                }
-                            )
-                        }
-                    )
-                }
-            )
-        }
+        val expectedRoot =
+            NodeParent().apply {
+                children.add(
+                    Node(root).apply {
+                        pointerIds.add(pointerId1)
+                        children.add(
+                            Node(middle).apply {
+                                pointerIds.add(pointerId1)
+                                children.add(Node(leaf).apply { pointerIds.add(pointerId1) })
+                            }
+                        )
+                    }
+                )
+            }
 
         assertThat(areEqual(hitPathTracker.root, expectedRoot)).isTrue()
     }
@@ -2917,10 +2386,7 @@
         val childPif = PointerInputNodeMock(log)
         val middlePif = PointerInputNodeMock(log)
         val parentPif = PointerInputNodeMock(log)
-        hitPathTracker.addHitPath(
-            PointerId(3),
-            listOf(parentPif, middlePif, childPif)
-        )
+        hitPathTracker.addHitPath(PointerId(3), listOf(parentPif, middlePif, childPif))
 
         hitPathTracker.processCancel()
 
@@ -2969,10 +2435,14 @@
 
         hitPathTracker.processCancel()
 
-        val log1 = log.getOnCancelLog()
-            .filter { it.pointerInputNode == pifChild1 || it.pointerInputNode == pifParent }
-        val log2 = log.getOnCancelLog()
-            .filter { it.pointerInputNode == pifChild2 || it.pointerInputNode == pifParent }
+        val log1 =
+            log.getOnCancelLog().filter {
+                it.pointerInputNode == pifChild1 || it.pointerInputNode == pifParent
+            }
+        val log2 =
+            log.getOnCancelLog().filter {
+                it.pointerInputNode == pifChild2 || it.pointerInputNode == pifParent
+            }
         assertThat(log1).hasSize(2)
         assertThat(log1[0].pointerInputNode).isEqualTo(pifChild1)
         assertThat(log1[1].pointerInputNode).isEqualTo(pifParent)
@@ -2998,10 +2468,7 @@
         val childPif = PointerInputNodeMock()
         val middlePif = PointerInputNodeMock()
         val parentPif = PointerInputNodeMock()
-        hitPathTracker.addHitPath(
-            PointerId(3),
-            listOf(parentPif, middlePif, childPif)
-        )
+        hitPathTracker.addHitPath(PointerId(3), listOf(parentPif, middlePif, childPif))
 
         hitPathTracker.processCancel()
 
@@ -3040,7 +2507,9 @@
     }
 
     private enum class DispatchingPif {
-        Parent, Middle, Child
+        Parent,
+        Middle,
+        Child
     }
 
     // Tests related to reporting whether or not a pointer input filter was dispatched to.
@@ -3099,17 +2568,17 @@
     ) {
         val layoutCoordinates = LayoutCoordinatesStub(true)
         lateinit var pifRef: PointerInputNodeMock
-        val pif = PointerInputNodeMock(
-            pointerEventHandler =
-                { pointerEvent, pass, _ ->
+        val pif =
+            PointerInputNodeMock(
+                pointerEventHandler = { pointerEvent, pass, _ ->
                     if (pass == removalPass) {
                         layoutCoordinates.isAttached = false
                         pifRef.remove()
                     }
                     pointerEvent.changes
                 },
-            coordinator = layoutCoordinates
-        )
+                coordinator = layoutCoordinates
+            )
         pifRef = pif
         hitPathTracker.addHitPath(PointerId(13), listOf(pif))
 
@@ -3152,21 +2621,18 @@
     ) {
         val log = mutableListOf<LogEntry>()
         val childLayoutCoordinates = LayoutCoordinatesStub(true)
-        val childPif = PointerInputNodeMock(
-            log,
-            coordinator = childLayoutCoordinates
-        )
-        val parentPif = PointerInputNodeMock(
-            log,
-            pointerEventHandler =
-                { pointerEvent, pass, _ ->
+        val childPif = PointerInputNodeMock(log, coordinator = childLayoutCoordinates)
+        val parentPif =
+            PointerInputNodeMock(
+                log,
+                pointerEventHandler = { pointerEvent, pass, _ ->
                     if (pass == removalPass) {
                         childLayoutCoordinates.isAttached = false
                         childPif.remove()
                     }
                     pointerEvent.changes
                 }
-        )
+            )
         hitPathTracker.addHitPath(PointerId(13), listOf(parentPif, childPif))
 
         hitPathTracker.dispatchChanges(internalPointerEventOf(down(13)))
@@ -3212,21 +2678,18 @@
     ) {
         val log = mutableListOf<LogEntry>()
         val parentLayoutCoordinates = LayoutCoordinatesStub(true)
-        val parentPif = PointerInputNodeMock(
-            log,
-            coordinator = parentLayoutCoordinates
-        )
-        val childPif = PointerInputNodeMock(
-            log,
-            pointerEventHandler =
-                { pointerEvent, pass, _ ->
+        val parentPif = PointerInputNodeMock(log, coordinator = parentLayoutCoordinates)
+        val childPif =
+            PointerInputNodeMock(
+                log,
+                pointerEventHandler = { pointerEvent, pass, _ ->
                     if (pass == removalPass) {
                         parentLayoutCoordinates.isAttached = false
                         parentPif.remove()
                     }
                     pointerEvent.changes
                 }
-        )
+            )
         hitPathTracker.addHitPath(PointerId(13), listOf(parentPif, childPif))
 
         hitPathTracker.dispatchChanges(internalPointerEventOf(down(13)))
@@ -3275,17 +2738,17 @@
     ) {
         val log = mutableListOf<LogEntry>()
         val layoutCoordinates = LayoutCoordinatesStub(true)
-        val pif = PointerInputNodeMock(
-            log = log,
-            pointerEventHandler =
-                { pointerEvent, pass, _ ->
+        val pif =
+            PointerInputNodeMock(
+                log = log,
+                pointerEventHandler = { pointerEvent, pass, _ ->
                     if (pass == movePass) {
                         layoutCoordinates.additionalOffset = Offset(500f, 500f)
                     }
                     pointerEvent.changes
                 },
-            coordinator = layoutCoordinates
-        )
+                coordinator = layoutCoordinates
+            )
         val parent = PointerInputNodeMock(log)
         val child = PointerInputNodeMock(log)
         hitPathTracker.addHitPath(PointerId(13), listOf(parent, pif, child))
@@ -3295,14 +2758,14 @@
 
         hitPathTracker.dispatchChanges(actual)
 
-        val log1 = log.getOnPointerEventLog()
-            .filter { it.pointerInputNode == parent || it.pointerInputNode == child }
+        val log1 =
+            log.getOnPointerEventLog().filter {
+                it.pointerInputNode == parent || it.pointerInputNode == child
+            }
 
         assertThat(log1).hasSize(6)
         log1.forEach {
-            PointerEventSubject
-                .assertThat(it.pointerEvent)
-                .isStructurallyEqualTo(expected)
+            PointerEventSubject.assertThat(it.pointerEvent).isStructurallyEqualTo(expected)
         }
     }
 
@@ -3317,39 +2780,27 @@
     fun addHitPath_hoverMove_noChange() {
         val log = mutableListOf<LogEntry>()
         val parentLayoutCoordinates = LayoutCoordinatesStub(true)
-        val pif1 = PointerInputNodeMock(
-            log = log,
-            coordinator = parentLayoutCoordinates
-        )
-        val pif2 = PointerInputNodeMock(
-            log = log,
-            coordinator = parentLayoutCoordinates
-        )
-        val pif3 = PointerInputNodeMock(
-            log = log,
-            coordinator = parentLayoutCoordinates
-        )
+        val pif1 = PointerInputNodeMock(log = log, coordinator = parentLayoutCoordinates)
+        val pif2 = PointerInputNodeMock(log = log, coordinator = parentLayoutCoordinates)
+        val pif3 = PointerInputNodeMock(log = log, coordinator = parentLayoutCoordinates)
         val pointerId = PointerId(0)
 
         hitPathTracker.addHitPath(pointerId, listOf(pif1, pif2, pif3))
 
-        val expectedRoot = NodeParent().apply {
-            children.add(
-                Node(pif1).apply {
-                    pointerIds.add(pointerId)
-                    children.add(
-                        Node(pif2).apply {
-                            pointerIds.add(pointerId)
-                            children.add(
-                                Node(pif3).apply {
-                                    pointerIds.add(pointerId)
-                                }
-                            )
-                        }
-                    )
-                }
-            )
-        }
+        val expectedRoot =
+            NodeParent().apply {
+                children.add(
+                    Node(pif1).apply {
+                        pointerIds.add(pointerId)
+                        children.add(
+                            Node(pif2).apply {
+                                pointerIds.add(pointerId)
+                                children.add(Node(pif3).apply { pointerIds.add(pointerId) })
+                            }
+                        )
+                    }
+                )
+            }
 
         hitPathTracker.dispatchChanges(hoverInternalPointerEvent())
 
@@ -3380,16 +2831,18 @@
     ) {
         assertThat(log).hasSize(filterAndTypes.size * 3)
         log.forEachIndexed { index, logEntry ->
-            val pass = when {
-                index < filterAndTypes.size -> PointerEventPass.Initial
-                index < filterAndTypes.size * 2 -> PointerEventPass.Main
-                else -> PointerEventPass.Final
-            }
-            val filterIndex = when {
-                index < filterAndTypes.size -> index
-                index < filterAndTypes.size * 2 -> filterAndTypes.size * 2 - index - 1
-                else -> index - (filterAndTypes.size * 2)
-            }
+            val pass =
+                when {
+                    index < filterAndTypes.size -> PointerEventPass.Initial
+                    index < filterAndTypes.size * 2 -> PointerEventPass.Main
+                    else -> PointerEventPass.Final
+                }
+            val filterIndex =
+                when {
+                    index < filterAndTypes.size -> index
+                    index < filterAndTypes.size * 2 -> filterAndTypes.size * 2 - index - 1
+                    else -> index - (filterAndTypes.size * 2)
+                }
 
             val (filter, type) = filterAndTypes[filterIndex]
 
@@ -3415,51 +2868,31 @@
     fun addHitPath_hoverMove_enterExit() {
         val log = mutableListOf<LogEntry>()
         val layoutCoordinates = layoutNode.outerCoordinator
-        val pif1 = PointerInputNodeMock(
-            log = log,
-            coordinator = layoutCoordinates
-        )
-        val pif2 = PointerInputNodeMock(
-            log = log,
-            coordinator = layoutCoordinates
-        )
-        val pif3 = PointerInputNodeMock(
-            log = log,
-            coordinator = layoutCoordinates
-        )
+        val pif1 = PointerInputNodeMock(log = log, coordinator = layoutCoordinates)
+        val pif2 = PointerInputNodeMock(log = log, coordinator = layoutCoordinates)
+        val pif3 = PointerInputNodeMock(log = log, coordinator = layoutCoordinates)
         val pointerId = PointerId(0)
 
         hitPathTracker.addHitPath(pointerId, listOf(pif1, pif2))
 
         hitPathTracker.dispatchChanges(hoverInternalPointerEvent())
 
-        assertHoverEvent(
-            log,
-            pif1 to PointerEventType.Enter,
-            pif2 to PointerEventType.Enter
-        )
+        assertHoverEvent(log, pif1 to PointerEventType.Enter, pif2 to PointerEventType.Enter)
 
         log.clear()
 
         hitPathTracker.addHitPath(pointerId, listOf(pif1, pif3))
 
-        val expectedRoot = NodeParent().apply {
-            children.add(
-                Node(pif1).apply {
-                    pointerIds.add(pointerId)
-                    children.add(
-                        Node(pif2).apply {
-                            pointerIds.add(pointerId)
-                        }
-                    )
-                    children.add(
-                        Node(pif3).apply {
-                            pointerIds.add(pointerId)
-                        }
-                    )
-                }
-            )
-        }
+        val expectedRoot =
+            NodeParent().apply {
+                children.add(
+                    Node(pif1).apply {
+                        pointerIds.add(pointerId)
+                        children.add(Node(pif2).apply { pointerIds.add(pointerId) })
+                        children.add(Node(pif3).apply { pointerIds.add(pointerId) })
+                    }
+                )
+            }
         assertThat(areEqual(hitPathTracker.root, expectedRoot)).isTrue()
 
         hitPathTracker.dispatchChanges(hoverInternalPointerEvent())
@@ -3467,45 +2900,78 @@
         // These have some that appear out of order because of the different branches
         assertThat(log).hasSize(9)
         assertOnPointerEventEntry(
-            log[0], "LogEntry[0]", PointerEventPass.Initial, PointerEventType.Move, pif1
+            log[0],
+            "LogEntry[0]",
+            PointerEventPass.Initial,
+            PointerEventType.Move,
+            pif1
         )
         assertOnPointerEventEntry(
-            log[1], "LogEntry[1]", PointerEventPass.Initial, PointerEventType.Exit, pif2
+            log[1],
+            "LogEntry[1]",
+            PointerEventPass.Initial,
+            PointerEventType.Exit,
+            pif2
         )
         assertOnPointerEventEntry(
-            log[2], "LogEntry[2]", PointerEventPass.Main, PointerEventType.Exit, pif2
+            log[2],
+            "LogEntry[2]",
+            PointerEventPass.Main,
+            PointerEventType.Exit,
+            pif2
         )
         assertOnPointerEventEntry(
-            log[3], "LogEntry[3]", PointerEventPass.Initial, PointerEventType.Enter, pif3
+            log[3],
+            "LogEntry[3]",
+            PointerEventPass.Initial,
+            PointerEventType.Enter,
+            pif3
         )
         assertOnPointerEventEntry(
-            log[4], "LogEntry[3]", PointerEventPass.Main, PointerEventType.Enter, pif3
+            log[4],
+            "LogEntry[3]",
+            PointerEventPass.Main,
+            PointerEventType.Enter,
+            pif3
         )
         assertOnPointerEventEntry(
-            log[5], "LogEntry[5]", PointerEventPass.Main, PointerEventType.Move, pif1
+            log[5],
+            "LogEntry[5]",
+            PointerEventPass.Main,
+            PointerEventType.Move,
+            pif1
         )
         assertOnPointerEventEntry(
-            log[6], "LogEntry[6]", PointerEventPass.Final, PointerEventType.Move, pif1
+            log[6],
+            "LogEntry[6]",
+            PointerEventPass.Final,
+            PointerEventType.Move,
+            pif1
         )
         assertOnPointerEventEntry(
-            log[7], "LogEntry[7]", PointerEventPass.Final, PointerEventType.Exit, pif2
+            log[7],
+            "LogEntry[7]",
+            PointerEventPass.Final,
+            PointerEventType.Exit,
+            pif2
         )
         assertOnPointerEventEntry(
-            log[8], "LogEntry[8]", PointerEventPass.Final, PointerEventType.Enter, pif3
+            log[8],
+            "LogEntry[8]",
+            PointerEventPass.Final,
+            PointerEventType.Enter,
+            pif3
         )
 
-        val expectedAfterDispatch = NodeParent().apply {
-            children.add(
-                Node(pif1).apply {
-                    pointerIds.add(pointerId)
-                    children.add(
-                        Node(pif3).apply {
-                            pointerIds.add(pointerId)
-                        }
-                    )
-                }
-            )
-        }
+        val expectedAfterDispatch =
+            NodeParent().apply {
+                children.add(
+                    Node(pif1).apply {
+                        pointerIds.add(pointerId)
+                        children.add(Node(pif3).apply { pointerIds.add(pointerId) })
+                    }
+                )
+            }
         assertThat(areEqual(hitPathTracker.root, expectedAfterDispatch)).isTrue()
     }
 
@@ -3513,18 +2979,9 @@
     fun addHitPath_hoverExit() {
         val log = mutableListOf<LogEntry>()
         val layoutCoordinates = layoutNode.outerCoordinator
-        val pif1 = PointerInputNodeMock(
-            log = log,
-            coordinator = layoutCoordinates
-        )
-        val pif2 = PointerInputNodeMock(
-            log = log,
-            coordinator = layoutCoordinates
-        )
-        val pif3 = PointerInputNodeMock(
-            log = log,
-            coordinator = layoutCoordinates
-        )
+        val pif1 = PointerInputNodeMock(log = log, coordinator = layoutCoordinates)
+        val pif2 = PointerInputNodeMock(log = log, coordinator = layoutCoordinates)
+        val pif3 = PointerInputNodeMock(log = log, coordinator = layoutCoordinates)
         val pointerId = PointerId(0)
 
         hitPathTracker.addHitPath(pointerId, listOf(pif1, pif2, pif3))
@@ -3535,23 +2992,20 @@
 
         hitPathTracker.addHitPath(pointerId, listOf())
 
-        val expectedRoot = NodeParent().apply {
-            children.add(
-                Node(pif1).apply {
-                    pointerIds.add(pointerId)
-                    children.add(
-                        Node(pif2).apply {
-                            pointerIds.add(pointerId)
-                            children.add(
-                                Node(pif3).apply {
-                                    pointerIds.add(pointerId)
-                                }
-                            )
-                        }
-                    )
-                }
-            )
-        }
+        val expectedRoot =
+            NodeParent().apply {
+                children.add(
+                    Node(pif1).apply {
+                        pointerIds.add(pointerId)
+                        children.add(
+                            Node(pif2).apply {
+                                pointerIds.add(pointerId)
+                                children.add(Node(pif3).apply { pointerIds.add(pointerId) })
+                            }
+                        )
+                    }
+                )
+            }
         assertThat(areEqual(hitPathTracker.root, expectedRoot)).isTrue()
 
         hitPathTracker.dispatchChanges(hoverInternalPointerEvent(ACTION_HOVER_EXIT))
@@ -3570,36 +3024,27 @@
     @Test
     fun dispatchChangesClearsStaleIds() {
         val layoutCoordinates = LayoutCoordinatesStub(isAttached = true)
-        val pif1 = PointerInputNodeMock(
-            coordinator = layoutCoordinates
-        )
-        val pif2 = PointerInputNodeMock(
-            coordinator = layoutCoordinates
-        )
-        val pif3 = PointerInputNodeMock(
-            coordinator = layoutCoordinates
-        )
+        val pif1 = PointerInputNodeMock(coordinator = layoutCoordinates)
+        val pif2 = PointerInputNodeMock(coordinator = layoutCoordinates)
+        val pif3 = PointerInputNodeMock(coordinator = layoutCoordinates)
         val pointerId = PointerId(0)
 
         hitPathTracker.addHitPath(pointerId, listOf(pif1, pif2, pif3))
 
-        val expectedRoot = NodeParent().apply {
-            children.add(
-                Node(pif1).apply {
-                    pointerIds.add(pointerId)
-                    children.add(
-                        Node(pif2).apply {
-                            pointerIds.add(pointerId)
-                            children.add(
-                                Node(pif3).apply {
-                                    pointerIds.add(pointerId)
-                                }
-                            )
-                        }
-                    )
-                }
-            )
-        }
+        val expectedRoot =
+            NodeParent().apply {
+                children.add(
+                    Node(pif1).apply {
+                        pointerIds.add(pointerId)
+                        children.add(
+                            Node(pif2).apply {
+                                pointerIds.add(pointerId)
+                                children.add(Node(pif3).apply { pointerIds.add(pointerId) })
+                            }
+                        )
+                    }
+                )
+            }
 
         assertThat(areEqual(hitPathTracker.root, expectedRoot)).isTrue()
 
@@ -3616,15 +3061,9 @@
     @Test
     fun dispatchChangesClearsStaleIdsPartialHit() {
         val parentLayoutCoordinates = LayoutCoordinatesStub(true)
-        val pif1 = PointerInputNodeMock(
-            coordinator = parentLayoutCoordinates
-        )
-        val pif2 = PointerInputNodeMock(
-            coordinator = parentLayoutCoordinates
-        )
-        val pif3 = PointerInputNodeMock(
-            coordinator = parentLayoutCoordinates
-        )
+        val pif1 = PointerInputNodeMock(coordinator = parentLayoutCoordinates)
+        val pif2 = PointerInputNodeMock(coordinator = parentLayoutCoordinates)
+        val pif3 = PointerInputNodeMock(coordinator = parentLayoutCoordinates)
         val pointerId1 = PointerId(0)
         val pointerId2 = PointerId(5)
 
@@ -3633,67 +3072,52 @@
 
         hitPathTracker.dispatchChanges(internalPointerEventOf(down(5)))
 
-        val expectedAfterDispatch = NodeParent().apply {
-            children.add(
-                Node(pif1).apply {
-                    pointerIds.add(pointerId2)
-                    children.add(
-                        Node(pif2).apply {
-                            pointerIds.add(pointerId2)
-                        }
-                    )
-                }
-            )
-        }
+        val expectedAfterDispatch =
+            NodeParent().apply {
+                children.add(
+                    Node(pif1).apply {
+                        pointerIds.add(pointerId2)
+                        children.add(Node(pif2).apply { pointerIds.add(pointerId2) })
+                    }
+                )
+            }
         assertThat(areEqual(hitPathTracker.root, expectedAfterDispatch)).isTrue()
     }
 
     @Test
     fun dispatchChangesClearsStaleIdsPartialHitWithInvalidHistory() {
         val parentLayoutCoordinates = LayoutCoordinatesStub(true)
-        val pif1 = PointerInputNodeMock(
-            coordinator = parentLayoutCoordinates
-        )
-        val pif2 = PointerInputNodeMock(
-            coordinator = parentLayoutCoordinates
-        )
-        val pif3 = PointerInputNodeMock(
-            coordinator = parentLayoutCoordinates
-        )
+        val pif1 = PointerInputNodeMock(coordinator = parentLayoutCoordinates)
+        val pif2 = PointerInputNodeMock(coordinator = parentLayoutCoordinates)
+        val pif3 = PointerInputNodeMock(coordinator = parentLayoutCoordinates)
         val pointerId1 = PointerId(0)
         val pointerId2 = PointerId(5)
 
         hitPathTracker.addHitPath(pointerId1, listOf(pif1, pif2, pif3))
         hitPathTracker.addHitPath(pointerId2, listOf(pif1, pif2))
 
-        val internalPointerEventWithBadHistory = internalPointerEventOf(
-            down(
-                id = 5,
-                historicalData = listOf(
-                    HistoricalChange(
-                        uptimeMillis = 1L,
-                        position = Offset.Unspecified
-                    )
+        val internalPointerEventWithBadHistory =
+            internalPointerEventOf(
+                down(
+                    id = 5,
+                    historicalData =
+                        listOf(HistoricalChange(uptimeMillis = 1L, position = Offset.Unspecified))
                 )
             )
-        )
 
         // Bad history should be ignored and not impact test (or crash test). This not only tests
         // HitPathTracker's dispatchChanges() but buildCache() as well.
         hitPathTracker.dispatchChanges(internalPointerEventWithBadHistory)
 
-        val expectedAfterDispatch = NodeParent().apply {
-            children.add(
-                Node(pif1).apply {
-                    pointerIds.add(pointerId2)
-                    children.add(
-                        Node(pif2).apply {
-                            pointerIds.add(pointerId2)
-                        }
-                    )
-                }
-            )
-        }
+        val expectedAfterDispatch =
+            NodeParent().apply {
+                children.add(
+                    Node(pif1).apply {
+                        pointerIds.add(pointerId2)
+                        children.add(Node(pif2).apply { pointerIds.add(pointerId2) })
+                    }
+                )
+            }
         assertThat(areEqual(hitPathTracker.root, expectedAfterDispatch)).isTrue()
     }
 
@@ -3704,9 +3128,7 @@
             return false
         }
         actualNode.children.forEach { child ->
-            check = check && expectedNode.children.any {
-                areEqual(child, it)
-            }
+            check = check && expectedNode.children.any { areEqual(child, it) }
         }
 
         return check
@@ -3732,20 +3154,18 @@
             return false
         }
         actualNode.children.forEach { child ->
-            check = check && expectedNode.children.any {
-                areEqual(child, it)
-            }
+            check = check && expectedNode.children.any { areEqual(child, it) }
         }
 
         return check
     }
 }
 
-internal class LayoutCoordinatesStub(
-    override var isAttached: Boolean = true
-) : NodeCoordinator(LayoutNode()) {
+internal class LayoutCoordinatesStub(override var isAttached: Boolean = true) :
+    NodeCoordinator(LayoutNode()) {
 
     var additionalOffset = Offset.Zero
+
     override fun ensureLookaheadDelegateCreated() {
         TODO("Not yet implemented")
     }
@@ -3760,6 +3180,7 @@
     override fun localToWindow(relativeToLocal: Offset): Offset = relativeToLocal
 
     override fun localToRoot(relativeToLocal: Offset): Offset = relativeToLocal
+
     override fun calculateAlignmentLine(alignmentLine: AlignmentLine): Int {
         TODO("Not yet implemented")
     }
@@ -3793,9 +3214,7 @@
     ): Offset {
         // In normal NodeCoordinator, an invalid Offset will crash the app farther down in the code.
         // (Specifically, in the Offset class when you try to create a new Offset.)
-        checkPrecondition(relativeToSource.isValid()) {
-            "Offset is unspecified"
-        }
+        checkPrecondition(relativeToSource.isValid()) { "Offset is unspecified" }
         return relativeToSource
     }
 
@@ -3821,16 +3240,22 @@
 
     override val rootForTest: RootForTest
         get() = TODO("Not yet implemented")
+
     override val hapticFeedBack: HapticFeedback
         get() = TODO("Not yet implemented")
+
     override val inputModeManager: InputModeManager
         get() = TODO("Not yet implemented")
+
     override val clipboardManager: ClipboardManager
         get() = TODO("Not yet implemented")
+
     override val accessibilityManager: AccessibilityManager
         get() = TODO("Not yet implemented")
+
     override val graphicsContext: GraphicsContext
         get() = TODO("Not yet implemented")
+
     override val textToolbar: TextToolbar
         get() = TODO("Not yet implemented")
 
@@ -3841,12 +3266,16 @@
     @OptIn(ExperimentalComposeUiApi::class)
     override val autofill: Autofill?
         get() = TODO("Not yet implemented")
+
     override val semanticAutofill: SemanticAutofill?
         get() = TODO("Not yet implemented")
+
     override val density: Density
         get() = Density(1f)
+
     override val textInputService: TextInputService
         get() = TODO("Not yet implemented")
+
     override val softwareKeyboardController: SoftwareKeyboardController
         get() = TODO("Not yet implemented")
 
@@ -3870,8 +3299,10 @@
 
     override val pointerIconService: PointerIconService
         get() = TODO("Not yet implemented")
+
     override val focusOwner: FocusOwner
         get() = TODO("Not yet implemented")
+
     override val windowInfo: WindowInfo
         get() = TODO("Not yet implemented")
 
@@ -3882,14 +3313,19 @@
     @Suppress("OverridingDeprecatedMember", "DEPRECATION")
     override val fontLoader: Font.ResourceLoader
         get() = TODO("Not yet implemented")
+
     override val fontFamilyResolver: FontFamily.Resolver
         get() = TODO("Not yet implemented")
+
     override val layoutDirection: LayoutDirection
         get() = LayoutDirection.Ltr
+
     override var showLayoutBounds: Boolean = false
     override val snapshotObserver = OwnerSnapshotObserver { it.invoke() }
     override val modifierLocalManager: ModifierLocalManager = ModifierLocalManager(this)
-    override val dragAndDropManager: DragAndDropManager get() = TODO("Not yet implemented")
+    override val dragAndDropManager: DragAndDropManager
+        get() = TODO("Not yet implemented")
+
     override fun registerOnEndApplyChangesListener(listener: () -> Unit) {
         TODO("Not yet implemented")
     }
@@ -3946,14 +3382,11 @@
 
     override fun requestFocus(): Boolean = false
 
-    override fun measureAndLayout(sendPointerUpdate: Boolean) {
-    }
+    override fun measureAndLayout(sendPointerUpdate: Boolean) {}
 
-    override fun measureAndLayout(layoutNode: LayoutNode, constraints: Constraints) {
-    }
+    override fun measureAndLayout(layoutNode: LayoutNode, constraints: Constraints) {}
 
-    override fun forceMeasureTheSubtree(layoutNode: LayoutNode, affectsLookahead: Boolean) {
-    }
+    override fun forceMeasureTheSubtree(layoutNode: LayoutNode, affectsLookahead: Boolean) {}
 
     override fun createLayer(
         drawBlock: (Canvas, GraphicsLayer?) -> Unit,
@@ -3965,46 +3398,36 @@
 
             override fun isInLayer(position: Offset) = true
 
-            override fun move(position: IntOffset) {
-            }
+            override fun move(position: IntOffset) {}
 
-            override fun resize(size: IntSize) {
-            }
+            override fun resize(size: IntSize) {}
 
             override fun drawLayer(canvas: Canvas, parentLayer: GraphicsLayer?) {
                 drawBlock(canvas, parentLayer)
             }
 
-            override fun updateDisplayList() {
-            }
+            override fun updateDisplayList() {}
 
-            override fun invalidate() {
-            }
+            override fun invalidate() {}
 
-            override fun destroy() {
-            }
+            override fun destroy() {}
 
-            override fun mapBounds(rect: MutableRect, inverse: Boolean) {
-            }
+            override fun mapBounds(rect: MutableRect, inverse: Boolean) {}
 
             override fun reuseLayer(
                 drawBlock: (Canvas, GraphicsLayer?) -> Unit,
                 invalidateParentLayer: () -> Unit
-            ) {
-            }
+            ) {}
 
-            override fun transform(matrix: Matrix) {
-            }
+            override fun transform(matrix: Matrix) {}
 
-            override fun inverseTransform(matrix: Matrix) {
-            }
+            override fun inverseTransform(matrix: Matrix) {}
 
             override fun mapOffset(point: Offset, inverse: Boolean) = point
         }
     }
 
-    override fun onSemanticsChange() {
-    }
+    override fun onSemanticsChange() {}
 
     override fun onLayoutChange(layoutNode: LayoutNode) {
         layoutChangeCount++
diff --git a/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/input/pointer/LayerTouchTransformTest.kt b/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/input/pointer/LayerTouchTransformTest.kt
index 7f69a0d..d34a969 100644
--- a/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/input/pointer/LayerTouchTransformTest.kt
+++ b/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/input/pointer/LayerTouchTransformTest.kt
@@ -57,8 +57,7 @@
 @RunWith(AndroidJUnit4::class)
 class LayerTouchTransformTest {
 
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
     @Test
     fun testTransformTouchEventConsumed() {
@@ -66,23 +65,18 @@
         var latch = CountDownLatch(1)
         rule.setContent {
             val pressed = remember { mutableStateOf(false) }
-            val onStart: (Offset) -> Unit = {
-                pressed.value = true
-            }
+            val onStart: (Offset) -> Unit = { pressed.value = true }
 
-            val onStop = {
-                pressed.value = false
-            }
+            val onStop = { pressed.value = false }
 
-            val color = if (pressed.value) {
-                Color.Red
-            } else {
-                Color.Blue
-            }
+            val color =
+                if (pressed.value) {
+                    Color.Red
+                } else {
+                    Color.Blue
+                }
 
-            val background = Modifier.drawBehind {
-                drawRect(Color.Gray)
-            }
+            val background = Modifier.drawBehind { drawRect(Color.Gray) }
 
             val latchDrawModifier = Modifier.drawBehind { latch.countDown() }
 
@@ -93,33 +87,31 @@
                 val offsetX = 270f.toDp()
                 val offsetY = 120f.toDp()
                 Box(Modifier.testTag(testTag)) {
-                    SimpleLayout(
-                        modifier = Modifier.fillMaxSize().offset(offsetX, offsetY)
-                    ) {
+                    SimpleLayout(modifier = Modifier.fillMaxSize().offset(offsetX, offsetY)) {
                         SimpleLayout(modifier = background.then(Modifier.size(containerDp))) {
                             SimpleLayout(
-                                modifier = Modifier
-                                    .graphicsLayer(
-                                        scaleX = 2.0f,
-                                        scaleY = 0.5f,
-                                        translationX = 50.0f,
-                                        translationY = 30.0f,
-                                        rotationZ = 45.0f,
-                                        transformOrigin = TransformOrigin(1.0f, 1.0f)
-                                    ).drawBehind {
-                                        drawRect(color)
-                                    }
-                                    .then(latchDrawModifier)
-                                    .size(boxDp)
-                                    .pointerInput(Unit) {
-                                        detectTapGestures(
-                                            onPress = {
-                                                onStart.invoke(it)
-                                                val success = tryAwaitRelease()
-                                                if (success) onStop.invoke() else onStop.invoke()
-                                            }
+                                modifier =
+                                    Modifier.graphicsLayer(
+                                            scaleX = 2.0f,
+                                            scaleY = 0.5f,
+                                            translationX = 50.0f,
+                                            translationY = 30.0f,
+                                            rotationZ = 45.0f,
+                                            transformOrigin = TransformOrigin(1.0f, 1.0f)
                                         )
-                                    }
+                                        .drawBehind { drawRect(color) }
+                                        .then(latchDrawModifier)
+                                        .size(boxDp)
+                                        .pointerInput(Unit) {
+                                            detectTapGestures(
+                                                onPress = {
+                                                    onStart.invoke(it)
+                                                    val success = tryAwaitRelease()
+                                                    if (success) onStop.invoke()
+                                                    else onStop.invoke()
+                                                }
+                                            )
+                                        }
                             )
                         }
                     }
@@ -144,10 +136,7 @@
         node.captureToImage().asAndroidBitmap().apply {
             Assert.assertEquals(
                 Color.Red.toArgb(),
-                getPixel(
-                    mappedPosition.x.toInt(),
-                    mappedPosition.y.toInt()
-                )
+                getPixel(mappedPosition.x.toInt(), mappedPosition.y.toInt())
             )
         }
     }
@@ -155,10 +144,7 @@
 
 @Composable
 fun SimpleLayout(modifier: Modifier, content: @Composable () -> Unit = {}) {
-    Layout(
-        content,
-        modifier
-    ) { measurables, constraints ->
+    Layout(content, modifier) { measurables, constraints ->
         val childConstraints = constraints.copy(minWidth = 0, minHeight = 0)
         val placeables = measurables.map { it.measure(childConstraints) }
         var containerWidth = constraints.minWidth
@@ -167,10 +153,6 @@
             containerWidth = max(containerWidth, it.width)
             containerHeight = max(containerHeight, it.height)
         }
-        layout(containerWidth, containerHeight) {
-            placeables.forEach {
-                it.placeRelative(0, 0)
-            }
-        }
+        layout(containerWidth, containerHeight) { placeables.forEach { it.placeRelative(0, 0) } }
     }
 }
diff --git a/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/input/pointer/MotionEventAdapterTest.kt b/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/input/pointer/MotionEventAdapterTest.kt
index 77cdb77..105da0f 100644
--- a/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/input/pointer/MotionEventAdapterTest.kt
+++ b/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/input/pointer/MotionEventAdapterTest.kt
@@ -46,13 +46,14 @@
 class MotionEventAdapterTest {
 
     private lateinit var motionEventAdapter: MotionEventAdapter
-    private val positionCalculator = object : PositionCalculator {
-        override fun screenToLocal(positionOnScreen: Offset): Offset = positionOnScreen
+    private val positionCalculator =
+        object : PositionCalculator {
+            override fun screenToLocal(positionOnScreen: Offset): Offset = positionOnScreen
 
-        override fun localToScreen(localPosition: Offset): Offset = localPosition
+            override fun localToScreen(localPosition: Offset): Offset = localPosition
 
-        override fun localToScreen(localTransform: Matrix) {}
-    }
+            override fun localToScreen(localTransform: Matrix) {}
+        }
 
     @Before
     fun setup() {
@@ -61,27 +62,29 @@
 
     @Test
     fun convertToolType() {
-        val types = mapOf(
-            MotionEvent.TOOL_TYPE_FINGER to PointerType.Touch,
-            MotionEvent.TOOL_TYPE_UNKNOWN to PointerType.Unknown,
-            MotionEvent.TOOL_TYPE_ERASER to PointerType.Eraser,
-            MotionEvent.TOOL_TYPE_STYLUS to PointerType.Stylus,
-            MotionEvent.TOOL_TYPE_MOUSE to PointerType.Mouse,
-        )
+        val types =
+            mapOf(
+                MotionEvent.TOOL_TYPE_FINGER to PointerType.Touch,
+                MotionEvent.TOOL_TYPE_UNKNOWN to PointerType.Unknown,
+                MotionEvent.TOOL_TYPE_ERASER to PointerType.Eraser,
+                MotionEvent.TOOL_TYPE_STYLUS to PointerType.Stylus,
+                MotionEvent.TOOL_TYPE_MOUSE to PointerType.Mouse,
+            )
         types.entries.forEach { (toolType, pointerType) ->
             motionEventAdapter = MotionEventAdapter()
-            val motionEvent = MotionEvent(
-                2894,
-                ACTION_DOWN,
-                1,
-                0,
-                arrayOf(
-                    PointerProperties(1000, toolType),
-                ),
-                arrayOf(
-                    PointerCoords(2967f, 5928f),
+            val motionEvent =
+                MotionEvent(
+                    2894,
+                    ACTION_DOWN,
+                    1,
+                    0,
+                    arrayOf(
+                        PointerProperties(1000, toolType),
+                    ),
+                    arrayOf(
+                        PointerCoords(2967f, 5928f),
+                    )
                 )
-            )
             val pointerInputEvent = motionEventAdapter.convertToPointerInputEvent(motionEvent)!!
             assertPointerInputEventData(
                 pointerInputEvent.pointers[0],
@@ -97,52 +100,56 @@
     @Test
     fun hoverEventsStay() {
         // When a hover event happens, the pointer ID should stick around until it is removed.
-        val hoverEnter = MotionEvent(
-            0,
-            ACTION_HOVER_ENTER,
-            1,
-            0,
-            arrayOf(PointerProperties(1, TOOL_TYPE_MOUSE)),
-            arrayOf(PointerCoords(10f, 10f))
-        )
+        val hoverEnter =
+            MotionEvent(
+                0,
+                ACTION_HOVER_ENTER,
+                1,
+                0,
+                arrayOf(PointerProperties(1, TOOL_TYPE_MOUSE)),
+                arrayOf(PointerCoords(10f, 10f))
+            )
         val hoverEnterEvent = motionEventAdapter.convertToPointerInputEvent(hoverEnter)!!
         assertThat(hoverEnterEvent.pointers).hasSize(1)
         val hoverEnterId = hoverEnterEvent.pointers[0].id
 
-        val hoverExit = MotionEvent(
-            1,
-            ACTION_HOVER_EXIT,
-            1,
-            0,
-            arrayOf(PointerProperties(1, TOOL_TYPE_MOUSE)),
-            arrayOf(PointerCoords(10f, 10f))
-        )
+        val hoverExit =
+            MotionEvent(
+                1,
+                ACTION_HOVER_EXIT,
+                1,
+                0,
+                arrayOf(PointerProperties(1, TOOL_TYPE_MOUSE)),
+                arrayOf(PointerCoords(10f, 10f))
+            )
 
         val hoverExitEvent = motionEventAdapter.convertToPointerInputEvent(hoverExit)!!
         assertThat(hoverExitEvent.pointers).hasSize(1)
         assertThat(hoverExitEvent.pointers[0].id).isEqualTo(hoverEnterId)
 
-        val down = MotionEvent(
-            1,
-            ACTION_DOWN,
-            1,
-            0,
-            arrayOf(PointerProperties(1, TOOL_TYPE_MOUSE)),
-            arrayOf(PointerCoords(10f, 10f))
-        )
+        val down =
+            MotionEvent(
+                1,
+                ACTION_DOWN,
+                1,
+                0,
+                arrayOf(PointerProperties(1, TOOL_TYPE_MOUSE)),
+                arrayOf(PointerCoords(10f, 10f))
+            )
 
         val downEvent = motionEventAdapter.convertToPointerInputEvent(down)!!
         assertThat(downEvent.pointers).hasSize(1)
         assertThat(downEvent.pointers[0].id).isEqualTo(hoverEnterId)
 
-        val up = MotionEvent(
-            2,
-            ACTION_UP,
-            1,
-            0,
-            arrayOf(PointerProperties(1, TOOL_TYPE_MOUSE)),
-            arrayOf(PointerCoords(10f, 10f))
-        )
+        val up =
+            MotionEvent(
+                2,
+                ACTION_UP,
+                1,
+                0,
+                arrayOf(PointerProperties(1, TOOL_TYPE_MOUSE)),
+                arrayOf(PointerCoords(10f, 10f))
+            )
 
         val upEvent = motionEventAdapter.convertToPointerInputEvent(up)!!
         assertThat(upEvent.pointers).hasSize(1)
@@ -153,27 +160,29 @@
         assertThat(hoverEnterEvent2.pointers[0].id).isEqualTo(hoverEnterId)
         motionEventAdapter.convertToPointerInputEvent(hoverExit)!!
 
-        val touchDown = MotionEvent(
-            3,
-            ACTION_DOWN,
-            1,
-            0,
-            arrayOf(PointerProperties(1, TOOL_TYPE_FINGER)),
-            arrayOf(PointerCoords(10f, 10f))
-        )
+        val touchDown =
+            MotionEvent(
+                3,
+                ACTION_DOWN,
+                1,
+                0,
+                arrayOf(PointerProperties(1, TOOL_TYPE_FINGER)),
+                arrayOf(PointerCoords(10f, 10f))
+            )
         val touchDownEvent = motionEventAdapter.convertToPointerInputEvent(touchDown)!!
         assertThat(touchDownEvent.pointers).hasSize(1)
         assertThat(touchDownEvent.pointers[0].id).isNotEqualTo(hoverEnterId)
         val touchDownId = touchDownEvent.pointers[0].id
 
-        val touchUp = MotionEvent(
-            4,
-            ACTION_UP,
-            1,
-            0,
-            arrayOf(PointerProperties(1, TOOL_TYPE_FINGER)),
-            arrayOf(PointerCoords(10f, 10f))
-        )
+        val touchUp =
+            MotionEvent(
+                4,
+                ACTION_UP,
+                1,
+                0,
+                arrayOf(PointerProperties(1, TOOL_TYPE_FINGER)),
+                arrayOf(PointerCoords(10f, 10f))
+            )
         val touchUpEvent = motionEventAdapter.convertToPointerInputEvent(touchUp)!!
         assertThat(touchUpEvent.pointers).hasSize(1)
         assertThat(touchUpEvent.pointers[0].id).isEqualTo(touchDownEvent.pointers[0].id)
@@ -187,28 +196,30 @@
     @Test
     fun robustIdConversion() {
         // When an ID shows up unexpectedly, it shouldn't crash
-        val hoverExit = MotionEvent(
-            3,
-            ACTION_HOVER_EXIT,
-            1,
-            0,
-            arrayOf(PointerProperties(1, TOOL_TYPE_MOUSE)),
-            arrayOf(PointerCoords(10f, 10f))
-        )
+        val hoverExit =
+            MotionEvent(
+                3,
+                ACTION_HOVER_EXIT,
+                1,
+                0,
+                arrayOf(PointerProperties(1, TOOL_TYPE_MOUSE)),
+                arrayOf(PointerCoords(10f, 10f))
+            )
         val event = motionEventAdapter.convertToPointerInputEvent(hoverExit)!!
         assertThat(event.pointers).hasSize(1)
     }
 
     @Test
     fun convertToPointerInputEvent_1pointerActionDown_convertsCorrectly() {
-        val motionEvent = MotionEvent(
-            2894,
-            ACTION_DOWN,
-            1,
-            0,
-            arrayOf(PointerProperties(8290)),
-            arrayOf(PointerCoords(2967f, 5928f))
-        )
+        val motionEvent =
+            MotionEvent(
+                2894,
+                ACTION_DOWN,
+                1,
+                0,
+                arrayOf(PointerProperties(8290)),
+                arrayOf(PointerCoords(2967f, 5928f))
+            )
 
         val pointerInputEvent = motionEventAdapter.convertToPointerInputEvent(motionEvent)
         assertThat(pointerInputEvent).isNotNull()
@@ -218,13 +229,7 @@
         val platformEvent = pointerInputEvent.motionEvent
         assertThat(uptime).isEqualTo(2_894L)
         assertThat(pointers).hasSize(1)
-        assertPointerInputEventData(
-            pointers[0],
-            PointerId(0),
-            true,
-            2967f,
-            5928f
-        )
+        assertPointerInputEventData(pointers[0], PointerId(0), true, 2967f, 5928f)
         assertThat(platformEvent).isSameInstanceAs(motionEvent)
     }
 
@@ -240,14 +245,15 @@
                 arrayOf(PointerCoords(3f, 4f))
             )
         )
-        val motionEvent = MotionEvent(
-            5,
-            ACTION_MOVE,
-            1,
-            0,
-            arrayOf(PointerProperties(2)),
-            arrayOf(PointerCoords(6f, 7f))
-        )
+        val motionEvent =
+            MotionEvent(
+                5,
+                ACTION_MOVE,
+                1,
+                0,
+                arrayOf(PointerProperties(2)),
+                arrayOf(PointerCoords(6f, 7f))
+            )
 
         val pointerInputEvent = motionEventAdapter.convertToPointerInputEvent(motionEvent)
         assertThat(pointerInputEvent).isNotNull()
@@ -256,13 +262,7 @@
         val pointers = pointerInputEvent.pointers
         assertThat(uptime).isEqualTo(5L)
         assertThat(pointers).hasSize(1)
-        assertPointerInputEventData(
-            pointers[0],
-            PointerId(0),
-            true,
-            6f,
-            7f
-        )
+        assertPointerInputEventData(pointers[0], PointerId(0), true, 6f, 7f)
     }
 
     @Test
@@ -277,14 +277,15 @@
                 arrayOf(PointerCoords(3f, 4f))
             )
         )
-        val motionEvent = MotionEvent(
-            34,
-            ACTION_UP,
-            1,
-            0,
-            arrayOf(PointerProperties(46)),
-            arrayOf(PointerCoords(3f, 4f))
-        )
+        val motionEvent =
+            MotionEvent(
+                34,
+                ACTION_UP,
+                1,
+                0,
+                arrayOf(PointerProperties(46)),
+                arrayOf(PointerCoords(3f, 4f))
+            )
 
         val pointerInputEvent = motionEventAdapter.convertToPointerInputEvent(motionEvent)
         assertThat(pointerInputEvent).isNotNull()
@@ -294,13 +295,7 @@
         assertThat(uptime).isEqualTo(34L)
         assertThat(uptime).isEqualTo(34L)
         assertThat(pointers).hasSize(1)
-        assertPointerInputEventData(
-            pointers[0],
-            PointerId(0),
-            false,
-            3f,
-            4f
-        )
+        assertPointerInputEventData(pointers[0], PointerId(0), false, 3f, 4f)
     }
 
     @Test
@@ -315,20 +310,15 @@
                 arrayOf(PointerCoords(3f, 4f))
             )
         )
-        val motionEvent = MotionEvent(
-            4,
-            ACTION_POINTER_DOWN,
-            2,
-            0,
-            arrayOf(
-                PointerProperties(5),
-                PointerProperties(2)
-            ),
-            arrayOf(
-                PointerCoords(7f, 8f),
-                PointerCoords(3f, 4f)
+        val motionEvent =
+            MotionEvent(
+                4,
+                ACTION_POINTER_DOWN,
+                2,
+                0,
+                arrayOf(PointerProperties(5), PointerProperties(2)),
+                arrayOf(PointerCoords(7f, 8f), PointerCoords(3f, 4f))
             )
-        )
 
         val pointerInputEvent = motionEventAdapter.convertToPointerInputEvent(motionEvent)
         assertThat(pointerInputEvent).isNotNull()
@@ -337,20 +327,8 @@
         val pointers = pointerInputEvent.pointers
         assertThat(uptime).isEqualTo(4L)
         assertThat(pointers).hasSize(2)
-        assertPointerInputEventData(
-            pointers[0],
-            PointerId(1),
-            true,
-            7f,
-            8f
-        )
-        assertPointerInputEventData(
-            pointers[1],
-            PointerId(0),
-            true,
-            3f,
-            4f
-        )
+        assertPointerInputEventData(pointers[0], PointerId(1), true, 7f, 8f)
+        assertPointerInputEventData(pointers[1], PointerId(0), true, 3f, 4f)
     }
 
     @Test
@@ -365,20 +343,15 @@
                 arrayOf(PointerCoords(3f, 4f))
             )
         )
-        val motionEvent = MotionEvent(
-            4,
-            ACTION_POINTER_DOWN,
-            2,
-            1,
-            arrayOf(
-                PointerProperties(2),
-                PointerProperties(5)
-            ),
-            arrayOf(
-                PointerCoords(3f, 4f),
-                PointerCoords(7f, 8f)
+        val motionEvent =
+            MotionEvent(
+                4,
+                ACTION_POINTER_DOWN,
+                2,
+                1,
+                arrayOf(PointerProperties(2), PointerProperties(5)),
+                arrayOf(PointerCoords(3f, 4f), PointerCoords(7f, 8f))
             )
-        )
 
         val pointerInputEvent = motionEventAdapter.convertToPointerInputEvent(motionEvent)
         assertThat(pointerInputEvent).isNotNull()
@@ -387,20 +360,8 @@
         val pointers = pointerInputEvent.pointers
         assertThat(uptime).isEqualTo(4L)
         assertThat(pointers).hasSize(2)
-        assertPointerInputEventData(
-            pointers[0],
-            PointerId(0),
-            true,
-            3f,
-            4f
-        )
-        assertPointerInputEventData(
-            pointers[1],
-            PointerId(1),
-            true,
-            7f,
-            8f
-        )
+        assertPointerInputEventData(pointers[0], PointerId(0), true, 3f, 4f)
+        assertPointerInputEventData(pointers[1], PointerId(1), true, 7f, 8f)
     }
 
     @Test
@@ -421,14 +382,8 @@
                 ACTION_POINTER_DOWN,
                 2,
                 1,
-                arrayOf(
-                    PointerProperties(2),
-                    PointerProperties(5)
-                ),
-                arrayOf(
-                    PointerCoords(3f, 4f),
-                    PointerCoords(7f, 8f)
-                )
+                arrayOf(PointerProperties(2), PointerProperties(5)),
+                arrayOf(PointerCoords(3f, 4f), PointerCoords(7f, 8f))
             )
         )
         val motionEvent =
@@ -437,16 +392,8 @@
                 ACTION_POINTER_DOWN,
                 3,
                 0,
-                arrayOf(
-                    PointerProperties(9),
-                    PointerProperties(2),
-                    PointerProperties(5)
-                ),
-                arrayOf(
-                    PointerCoords(10f, 11f),
-                    PointerCoords(3f, 4f),
-                    PointerCoords(7f, 8f)
-                )
+                arrayOf(PointerProperties(9), PointerProperties(2), PointerProperties(5)),
+                arrayOf(PointerCoords(10f, 11f), PointerCoords(3f, 4f), PointerCoords(7f, 8f))
             )
 
         val pointerInputEvent = motionEventAdapter.convertToPointerInputEvent(motionEvent)
@@ -456,27 +403,9 @@
         val pointers = pointerInputEvent.pointers
         assertThat(uptime).isEqualTo(12L)
         assertThat(pointers).hasSize(3)
-        assertPointerInputEventData(
-            pointers[0],
-            PointerId(2),
-            true,
-            10f,
-            11f
-        )
-        assertPointerInputEventData(
-            pointers[1],
-            PointerId(0),
-            true,
-            3f,
-            4f
-        )
-        assertPointerInputEventData(
-            pointers[2],
-            PointerId(1),
-            true,
-            7f,
-            8f
-        )
+        assertPointerInputEventData(pointers[0], PointerId(2), true, 10f, 11f)
+        assertPointerInputEventData(pointers[1], PointerId(0), true, 3f, 4f)
+        assertPointerInputEventData(pointers[2], PointerId(1), true, 7f, 8f)
     }
 
     @Test
@@ -497,14 +426,8 @@
                 ACTION_POINTER_DOWN,
                 2,
                 1,
-                arrayOf(
-                    PointerProperties(2),
-                    PointerProperties(5)
-                ),
-                arrayOf(
-                    PointerCoords(3f, 4f),
-                    PointerCoords(7f, 8f)
-                )
+                arrayOf(PointerProperties(2), PointerProperties(5)),
+                arrayOf(PointerCoords(3f, 4f), PointerCoords(7f, 8f))
             )
         )
         val motionEvent =
@@ -513,16 +436,8 @@
                 ACTION_POINTER_DOWN,
                 3,
                 1,
-                arrayOf(
-                    PointerProperties(2),
-                    PointerProperties(9),
-                    PointerProperties(5)
-                ),
-                arrayOf(
-                    PointerCoords(3f, 4f),
-                    PointerCoords(10f, 11f),
-                    PointerCoords(7f, 8f)
-                )
+                arrayOf(PointerProperties(2), PointerProperties(9), PointerProperties(5)),
+                arrayOf(PointerCoords(3f, 4f), PointerCoords(10f, 11f), PointerCoords(7f, 8f))
             )
 
         val pointerInputEvent = motionEventAdapter.convertToPointerInputEvent(motionEvent)
@@ -532,27 +447,9 @@
         val pointers = pointerInputEvent.pointers
         assertThat(uptime).isEqualTo(12L)
         assertThat(pointers).hasSize(3)
-        assertPointerInputEventData(
-            pointers[0],
-            PointerId(0),
-            true,
-            3f,
-            4f
-        )
-        assertPointerInputEventData(
-            pointers[1],
-            PointerId(2),
-            true,
-            10f,
-            11f
-        )
-        assertPointerInputEventData(
-            pointers[2],
-            PointerId(1),
-            true,
-            7f,
-            8f
-        )
+        assertPointerInputEventData(pointers[0], PointerId(0), true, 3f, 4f)
+        assertPointerInputEventData(pointers[1], PointerId(2), true, 10f, 11f)
+        assertPointerInputEventData(pointers[2], PointerId(1), true, 7f, 8f)
     }
 
     @Test
@@ -573,14 +470,8 @@
                 ACTION_POINTER_DOWN,
                 2,
                 1,
-                arrayOf(
-                    PointerProperties(2),
-                    PointerProperties(5)
-                ),
-                arrayOf(
-                    PointerCoords(3f, 4f),
-                    PointerCoords(7f, 8f)
-                )
+                arrayOf(PointerProperties(2), PointerProperties(5)),
+                arrayOf(PointerCoords(3f, 4f), PointerCoords(7f, 8f))
             )
         )
         val motionEvent =
@@ -589,16 +480,8 @@
                 ACTION_POINTER_DOWN,
                 3,
                 2,
-                arrayOf(
-                    PointerProperties(2),
-                    PointerProperties(5),
-                    PointerProperties(9)
-                ),
-                arrayOf(
-                    PointerCoords(3f, 4f),
-                    PointerCoords(7f, 8f),
-                    PointerCoords(10f, 11f)
-                )
+                arrayOf(PointerProperties(2), PointerProperties(5), PointerProperties(9)),
+                arrayOf(PointerCoords(3f, 4f), PointerCoords(7f, 8f), PointerCoords(10f, 11f))
             )
 
         val pointerInputEvent = motionEventAdapter.convertToPointerInputEvent(motionEvent)
@@ -608,27 +491,9 @@
         val pointers = pointerInputEvent.pointers
         assertThat(uptime).isEqualTo(12L)
         assertThat(pointers).hasSize(3)
-        assertPointerInputEventData(
-            pointers[0],
-            PointerId(0),
-            true,
-            3f,
-            4f
-        )
-        assertPointerInputEventData(
-            pointers[1],
-            PointerId(1),
-            true,
-            7f,
-            8f
-        )
-        assertPointerInputEventData(
-            pointers[2],
-            PointerId(2),
-            true,
-            10f,
-            11f
-        )
+        assertPointerInputEventData(pointers[0], PointerId(0), true, 3f, 4f)
+        assertPointerInputEventData(pointers[1], PointerId(1), true, 7f, 8f)
+        assertPointerInputEventData(pointers[2], PointerId(2), true, 10f, 11f)
     }
 
     @Test
@@ -649,30 +514,19 @@
                 ACTION_POINTER_DOWN,
                 2,
                 1,
-                arrayOf(
-                    PointerProperties(2),
-                    PointerProperties(5)
-                ),
-                arrayOf(
-                    PointerCoords(3f, 4f),
-                    PointerCoords(7f, 8f)
-                )
+                arrayOf(PointerProperties(2), PointerProperties(5)),
+                arrayOf(PointerCoords(3f, 4f), PointerCoords(7f, 8f))
             )
         )
-        val motionEvent = MotionEvent(
-            10,
-            ACTION_MOVE,
-            2,
-            0,
-            arrayOf(
-                PointerProperties(2),
-                PointerProperties(5)
-            ),
-            arrayOf(
-                PointerCoords(11f, 12f),
-                PointerCoords(13f, 15f)
+        val motionEvent =
+            MotionEvent(
+                10,
+                ACTION_MOVE,
+                2,
+                0,
+                arrayOf(PointerProperties(2), PointerProperties(5)),
+                arrayOf(PointerCoords(11f, 12f), PointerCoords(13f, 15f))
             )
-        )
 
         val pointerInputEvent = motionEventAdapter.convertToPointerInputEvent(motionEvent)
         assertThat(pointerInputEvent).isNotNull()
@@ -681,20 +535,8 @@
         val pointers = pointerInputEvent.pointers
         assertThat(uptime).isEqualTo(10L)
         assertThat(pointers).hasSize(2)
-        assertPointerInputEventData(
-            pointers[0],
-            PointerId(0),
-            true,
-            11f,
-            12f
-        )
-        assertPointerInputEventData(
-            pointers[1],
-            PointerId(1),
-            true,
-            13f,
-            15f
-        )
+        assertPointerInputEventData(pointers[0], PointerId(0), true, 11f, 12f)
+        assertPointerInputEventData(pointers[1], PointerId(1), true, 13f, 15f)
     }
 
     @Test
@@ -715,31 +557,20 @@
                 ACTION_POINTER_DOWN,
                 2,
                 1,
-                arrayOf(
-                    PointerProperties(2),
-                    PointerProperties(5)
-                ),
-                arrayOf(
-                    PointerCoords(3f, 4f),
-                    PointerCoords(7f, 8f)
-                )
+                arrayOf(PointerProperties(2), PointerProperties(5)),
+                arrayOf(PointerCoords(3f, 4f), PointerCoords(7f, 8f))
             )
         )
 
-        val motionEvent = MotionEvent(
-            10,
-            ACTION_POINTER_UP,
-            2,
-            0,
-            arrayOf(
-                PointerProperties(2),
-                PointerProperties(5)
-            ),
-            arrayOf(
-                PointerCoords(3f, 4f),
-                PointerCoords(7f, 8f)
+        val motionEvent =
+            MotionEvent(
+                10,
+                ACTION_POINTER_UP,
+                2,
+                0,
+                arrayOf(PointerProperties(2), PointerProperties(5)),
+                arrayOf(PointerCoords(3f, 4f), PointerCoords(7f, 8f))
             )
-        )
         val pointerInputEvent = motionEventAdapter.convertToPointerInputEvent(motionEvent)
         assertThat(pointerInputEvent).isNotNull()
 
@@ -747,20 +578,8 @@
         val pointers = pointerInputEvent.pointers
         assertThat(uptime).isEqualTo(10L)
         assertThat(pointers).hasSize(2)
-        assertPointerInputEventData(
-            pointers[0],
-            PointerId(0),
-            false,
-            3f,
-            4f
-        )
-        assertPointerInputEventData(
-            pointers[1],
-            PointerId(1),
-            true,
-            7f,
-            8f
-        )
+        assertPointerInputEventData(pointers[0], PointerId(0), false, 3f, 4f)
+        assertPointerInputEventData(pointers[1], PointerId(1), true, 7f, 8f)
     }
 
     @Test
@@ -781,31 +600,20 @@
                 ACTION_POINTER_DOWN,
                 2,
                 1,
-                arrayOf(
-                    PointerProperties(2),
-                    PointerProperties(5)
-                ),
-                arrayOf(
-                    PointerCoords(3f, 4f),
-                    PointerCoords(7f, 8f)
-                )
+                arrayOf(PointerProperties(2), PointerProperties(5)),
+                arrayOf(PointerCoords(3f, 4f), PointerCoords(7f, 8f))
             )
         )
 
-        val motionEvent = MotionEvent(
-            10,
-            ACTION_POINTER_UP,
-            2,
-            1,
-            arrayOf(
-                PointerProperties(2),
-                PointerProperties(5)
-            ),
-            arrayOf(
-                PointerCoords(3f, 4f),
-                PointerCoords(7f, 8f)
+        val motionEvent =
+            MotionEvent(
+                10,
+                ACTION_POINTER_UP,
+                2,
+                1,
+                arrayOf(PointerProperties(2), PointerProperties(5)),
+                arrayOf(PointerCoords(3f, 4f), PointerCoords(7f, 8f))
             )
-        )
         val pointerInputEvent = motionEventAdapter.convertToPointerInputEvent(motionEvent)
         assertThat(pointerInputEvent).isNotNull()
 
@@ -813,20 +621,8 @@
         val pointers = pointerInputEvent.pointers
         assertThat(uptime).isEqualTo(10L)
         assertThat(pointers).hasSize(2)
-        assertPointerInputEventData(
-            pointers[0],
-            PointerId(0),
-            true,
-            3f,
-            4f
-        )
-        assertPointerInputEventData(
-            pointers[1],
-            PointerId(1),
-            false,
-            7f,
-            8f
-        )
+        assertPointerInputEventData(pointers[0], PointerId(0), true, 3f, 4f)
+        assertPointerInputEventData(pointers[1], PointerId(1), false, 7f, 8f)
     }
 
     @Test
@@ -847,14 +643,8 @@
                 ACTION_POINTER_DOWN,
                 2,
                 1,
-                arrayOf(
-                    PointerProperties(2),
-                    PointerProperties(5)
-                ),
-                arrayOf(
-                    PointerCoords(3f, 4f),
-                    PointerCoords(7f, 8f)
-                )
+                arrayOf(PointerProperties(2), PointerProperties(5)),
+                arrayOf(PointerCoords(3f, 4f), PointerCoords(7f, 8f))
             )
         )
         motionEventAdapter.convertToPointerInputEvent(
@@ -863,35 +653,20 @@
                 ACTION_POINTER_DOWN,
                 3,
                 2,
-                arrayOf(
-                    PointerProperties(2),
-                    PointerProperties(5),
-                    PointerProperties(9)
-                ),
-                arrayOf(
-                    PointerCoords(3f, 4f),
-                    PointerCoords(7f, 8f),
-                    PointerCoords(10f, 11f)
-                )
+                arrayOf(PointerProperties(2), PointerProperties(5), PointerProperties(9)),
+                arrayOf(PointerCoords(3f, 4f), PointerCoords(7f, 8f), PointerCoords(10f, 11f))
             )
         )
 
-        val motionEvent = MotionEvent(
-            20,
-            ACTION_POINTER_UP,
-            3,
-            0,
-            arrayOf(
-                PointerProperties(2),
-                PointerProperties(5),
-                PointerProperties(9)
-            ),
-            arrayOf(
-                PointerCoords(3f, 4f),
-                PointerCoords(7f, 8f),
-                PointerCoords(10f, 11f)
+        val motionEvent =
+            MotionEvent(
+                20,
+                ACTION_POINTER_UP,
+                3,
+                0,
+                arrayOf(PointerProperties(2), PointerProperties(5), PointerProperties(9)),
+                arrayOf(PointerCoords(3f, 4f), PointerCoords(7f, 8f), PointerCoords(10f, 11f))
             )
-        )
 
         val pointerInputEvent = motionEventAdapter.convertToPointerInputEvent(motionEvent)
         assertThat(pointerInputEvent).isNotNull()
@@ -900,27 +675,9 @@
         val pointers = pointerInputEvent.pointers
         assertThat(uptime).isEqualTo(20L)
         assertThat(pointers).hasSize(3)
-        assertPointerInputEventData(
-            pointers[0],
-            PointerId(0),
-            false,
-            3f,
-            4f
-        )
-        assertPointerInputEventData(
-            pointers[1],
-            PointerId(1),
-            true,
-            7f,
-            8f
-        )
-        assertPointerInputEventData(
-            pointers[2],
-            PointerId(2),
-            true,
-            10f,
-            11f
-        )
+        assertPointerInputEventData(pointers[0], PointerId(0), false, 3f, 4f)
+        assertPointerInputEventData(pointers[1], PointerId(1), true, 7f, 8f)
+        assertPointerInputEventData(pointers[2], PointerId(2), true, 10f, 11f)
     }
 
     @Test
@@ -941,14 +698,8 @@
                 ACTION_POINTER_DOWN,
                 2,
                 1,
-                arrayOf(
-                    PointerProperties(2),
-                    PointerProperties(5)
-                ),
-                arrayOf(
-                    PointerCoords(3f, 4f),
-                    PointerCoords(7f, 8f)
-                )
+                arrayOf(PointerProperties(2), PointerProperties(5)),
+                arrayOf(PointerCoords(3f, 4f), PointerCoords(7f, 8f))
             )
         )
         motionEventAdapter.convertToPointerInputEvent(
@@ -957,35 +708,20 @@
                 ACTION_POINTER_DOWN,
                 3,
                 2,
-                arrayOf(
-                    PointerProperties(2),
-                    PointerProperties(5),
-                    PointerProperties(9)
-                ),
-                arrayOf(
-                    PointerCoords(3f, 4f),
-                    PointerCoords(7f, 8f),
-                    PointerCoords(10f, 11f)
-                )
+                arrayOf(PointerProperties(2), PointerProperties(5), PointerProperties(9)),
+                arrayOf(PointerCoords(3f, 4f), PointerCoords(7f, 8f), PointerCoords(10f, 11f))
             )
         )
 
-        val motionEvent = MotionEvent(
-            20,
-            ACTION_POINTER_UP,
-            3,
-            1,
-            arrayOf(
-                PointerProperties(2),
-                PointerProperties(5),
-                PointerProperties(9)
-            ),
-            arrayOf(
-                PointerCoords(3f, 4f),
-                PointerCoords(7f, 8f),
-                PointerCoords(10f, 11f)
+        val motionEvent =
+            MotionEvent(
+                20,
+                ACTION_POINTER_UP,
+                3,
+                1,
+                arrayOf(PointerProperties(2), PointerProperties(5), PointerProperties(9)),
+                arrayOf(PointerCoords(3f, 4f), PointerCoords(7f, 8f), PointerCoords(10f, 11f))
             )
-        )
 
         val pointerInputEvent = motionEventAdapter.convertToPointerInputEvent(motionEvent)
         assertThat(pointerInputEvent).isNotNull()
@@ -994,27 +730,9 @@
         val pointers = pointerInputEvent.pointers
         assertThat(uptime).isEqualTo(20L)
         assertThat(pointers).hasSize(3)
-        assertPointerInputEventData(
-            pointers[0],
-            PointerId(0),
-            true,
-            3f,
-            4f
-        )
-        assertPointerInputEventData(
-            pointers[1],
-            PointerId(1),
-            false,
-            7f,
-            8f
-        )
-        assertPointerInputEventData(
-            pointers[2],
-            PointerId(2),
-            true,
-            10f,
-            11f
-        )
+        assertPointerInputEventData(pointers[0], PointerId(0), true, 3f, 4f)
+        assertPointerInputEventData(pointers[1], PointerId(1), false, 7f, 8f)
+        assertPointerInputEventData(pointers[2], PointerId(2), true, 10f, 11f)
     }
 
     @Test
@@ -1035,14 +753,8 @@
                 ACTION_POINTER_DOWN,
                 2,
                 1,
-                arrayOf(
-                    PointerProperties(2),
-                    PointerProperties(5)
-                ),
-                arrayOf(
-                    PointerCoords(3f, 4f),
-                    PointerCoords(7f, 8f)
-                )
+                arrayOf(PointerProperties(2), PointerProperties(5)),
+                arrayOf(PointerCoords(3f, 4f), PointerCoords(7f, 8f))
             )
         )
         motionEventAdapter.convertToPointerInputEvent(
@@ -1051,35 +763,20 @@
                 ACTION_POINTER_DOWN,
                 3,
                 2,
-                arrayOf(
-                    PointerProperties(2),
-                    PointerProperties(5),
-                    PointerProperties(9)
-                ),
-                arrayOf(
-                    PointerCoords(3f, 4f),
-                    PointerCoords(7f, 8f),
-                    PointerCoords(10f, 11f)
-                )
+                arrayOf(PointerProperties(2), PointerProperties(5), PointerProperties(9)),
+                arrayOf(PointerCoords(3f, 4f), PointerCoords(7f, 8f), PointerCoords(10f, 11f))
             )
         )
 
-        val motionEvent = MotionEvent(
-            20,
-            ACTION_POINTER_UP,
-            3,
-            2,
-            arrayOf(
-                PointerProperties(2),
-                PointerProperties(5),
-                PointerProperties(9)
-            ),
-            arrayOf(
-                PointerCoords(3f, 4f),
-                PointerCoords(7f, 8f),
-                PointerCoords(10f, 11f)
+        val motionEvent =
+            MotionEvent(
+                20,
+                ACTION_POINTER_UP,
+                3,
+                2,
+                arrayOf(PointerProperties(2), PointerProperties(5), PointerProperties(9)),
+                arrayOf(PointerCoords(3f, 4f), PointerCoords(7f, 8f), PointerCoords(10f, 11f))
             )
-        )
 
         val pointerInputEvent = motionEventAdapter.convertToPointerInputEvent(motionEvent)
         assertThat(pointerInputEvent).isNotNull()
@@ -1088,84 +785,72 @@
         val pointers = pointerInputEvent.pointers
         assertThat(uptime).isEqualTo(20L)
         assertThat(pointers).hasSize(3)
-        assertPointerInputEventData(
-            pointers[0],
-            PointerId(0),
-            true,
-            3f,
-            4f
-        )
-        assertPointerInputEventData(
-            pointers[1],
-            PointerId(1),
-            true,
-            7f,
-            8f
-        )
-        assertPointerInputEventData(
-            pointers[2],
-            PointerId(2),
-            false,
-            10f,
-            11f
-        )
+        assertPointerInputEventData(pointers[0], PointerId(0), true, 3f, 4f)
+        assertPointerInputEventData(pointers[1], PointerId(1), true, 7f, 8f)
+        assertPointerInputEventData(pointers[2], PointerId(2), false, 10f, 11f)
     }
 
     @Test
     fun convertToPointerInputEvent_downUpDownUpDownUpSameMotionEventId_pointerIdsAreUnique() {
-        val down1 = MotionEvent(
-            100,
-            ACTION_DOWN,
-            1,
-            0,
-            arrayOf(PointerProperties(0)),
-            arrayOf(PointerCoords(10f, 11f))
-        )
+        val down1 =
+            MotionEvent(
+                100,
+                ACTION_DOWN,
+                1,
+                0,
+                arrayOf(PointerProperties(0)),
+                arrayOf(PointerCoords(10f, 11f))
+            )
 
-        val up1 = MotionEvent(
-            200,
-            ACTION_UP,
-            1,
-            0,
-            arrayOf(PointerProperties(0)),
-            arrayOf(PointerCoords(10f, 11f))
-        )
+        val up1 =
+            MotionEvent(
+                200,
+                ACTION_UP,
+                1,
+                0,
+                arrayOf(PointerProperties(0)),
+                arrayOf(PointerCoords(10f, 11f))
+            )
 
-        val down2 = MotionEvent(
-            300,
-            ACTION_DOWN,
-            1,
-            0,
-            arrayOf(PointerProperties(0)),
-            arrayOf(PointerCoords(20f, 21f))
-        )
+        val down2 =
+            MotionEvent(
+                300,
+                ACTION_DOWN,
+                1,
+                0,
+                arrayOf(PointerProperties(0)),
+                arrayOf(PointerCoords(20f, 21f))
+            )
 
-        val up2 = MotionEvent(
-            400,
-            ACTION_UP,
-            1,
-            0,
-            arrayOf(PointerProperties(0)),
-            arrayOf(PointerCoords(20f, 21f))
-        )
+        val up2 =
+            MotionEvent(
+                400,
+                ACTION_UP,
+                1,
+                0,
+                arrayOf(PointerProperties(0)),
+                arrayOf(PointerCoords(20f, 21f))
+            )
 
-        val down3 = MotionEvent(
-            500,
-            ACTION_DOWN,
-            1,
-            0,
-            arrayOf(PointerProperties(0)),
-            arrayOf(PointerCoords(30f, 31f))
-        )
+        val down3 =
+            MotionEvent(
+                500,
+                ACTION_DOWN,
+                1,
+                0,
+                arrayOf(PointerProperties(0)),
+                arrayOf(PointerCoords(30f, 31f))
+            )
 
-        val up3 = MotionEvent(
-            600,
-            ACTION_UP,
-            1,
-            0,
-            arrayOf(PointerProperties(0)),
-            arrayOf(PointerCoords(30f, 31f))
-        )
+        val up3 =
+            MotionEvent(
+                600,
+                ACTION_UP,
+                1,
+                0,
+                arrayOf(PointerProperties(0)),
+                arrayOf(PointerCoords(30f, 31f))
+            )
 
         // Test the different events sequentially, since the returned event contains a list that
         // will be reused by convertToPointerInputEvent for performance, so it shouldn't be held
@@ -1198,50 +883,35 @@
 
     @Test
     fun convertToPointerInputEvent_downDownDownRandomMotionEventIds_pointerIdsAreUnique() {
-        val down1 = MotionEvent(
-            100,
-            ACTION_DOWN,
-            1,
-            0,
-            arrayOf(
-                PointerProperties(9276)
-            ),
-            arrayOf(
-                PointerCoords(10f, 11f)
+        val down1 =
+            MotionEvent(
+                100,
+                ACTION_DOWN,
+                1,
+                0,
+                arrayOf(PointerProperties(9276)),
+                arrayOf(PointerCoords(10f, 11f))
             )
-        )
 
-        val down2 = MotionEvent(
-            200,
-            ACTION_POINTER_DOWN,
-            2,
-            1,
-            arrayOf(
-                PointerProperties(9276),
-                PointerProperties(1759)
-            ),
-            arrayOf(
-                PointerCoords(10f, 11f),
-                PointerCoords(20f, 21f)
+        val down2 =
+            MotionEvent(
+                200,
+                ACTION_POINTER_DOWN,
+                2,
+                1,
+                arrayOf(PointerProperties(9276), PointerProperties(1759)),
+                arrayOf(PointerCoords(10f, 11f), PointerCoords(20f, 21f))
             )
-        )
 
-        val down3 = MotionEvent(
-            300,
-            ACTION_POINTER_DOWN,
-            3,
-            2,
-            arrayOf(
-                PointerProperties(9276),
-                PointerProperties(1759),
-                PointerProperties(5043)
-            ),
-            arrayOf(
-                PointerCoords(10f, 11f),
-                PointerCoords(20f, 21f),
-                PointerCoords(30f, 31f)
+        val down3 =
+            MotionEvent(
+                300,
+                ACTION_POINTER_DOWN,
+                3,
+                2,
+                arrayOf(PointerProperties(9276), PointerProperties(1759), PointerProperties(5043)),
+                arrayOf(PointerCoords(10f, 11f), PointerCoords(20f, 21f), PointerCoords(30f, 31f))
             )
-        )
 
         // Test the different events sequentially, since the returned event contains a list that
         // will be reused by convertToPointerInputEvent for performance, so it shouldn't be held
@@ -1271,14 +941,15 @@
 
     @Test
     fun convertToPointerInputEvent_motionEventOffset_usesRawCoordinatesInsteadOfOffset() {
-        val motionEvent = MotionEvent(
-            0,
-            ACTION_DOWN,
-            1,
-            0,
-            arrayOf(PointerProperties(0)),
-            arrayOf(PointerCoords(1f, 2f))
-        )
+        val motionEvent =
+            MotionEvent(
+                0,
+                ACTION_DOWN,
+                1,
+                0,
+                arrayOf(PointerProperties(0)),
+                arrayOf(PointerCoords(1f, 2f))
+            )
 
         motionEvent.offsetLocation(10f, 20f)
 
@@ -1302,14 +973,15 @@
 
     @Test
     fun convertToPointerInputEvent_actionCancel_returnsNull() {
-        val motionEvent = MotionEvent(
-            0,
-            ACTION_CANCEL,
-            1,
-            0,
-            arrayOf(PointerProperties(0)),
-            arrayOf(PointerCoords(1f, 2f))
-        )
+        val motionEvent =
+            MotionEvent(
+                0,
+                ACTION_CANCEL,
+                1,
+                0,
+                arrayOf(PointerProperties(0)),
+                arrayOf(PointerCoords(1f, 2f))
+            )
 
         motionEvent.offsetLocation(10f, 20f)
 
@@ -1319,22 +991,24 @@
 
     @Test
     fun convertToPointerInputEvent_downUp_noPointersTracked() {
-        val motionEvent1 = MotionEvent(
-            2894,
-            ACTION_DOWN,
-            1,
-            0,
-            arrayOf(PointerProperties(8290)),
-            arrayOf(PointerCoords(2967f, 5928f))
-        )
-        val motionEvent2 = MotionEvent(
-            2894,
-            ACTION_UP,
-            1,
-            0,
-            arrayOf(PointerProperties(8290)),
-            arrayOf(PointerCoords(2967f, 5928f))
-        )
+        val motionEvent1 =
+            MotionEvent(
+                2894,
+                ACTION_DOWN,
+                1,
+                0,
+                arrayOf(PointerProperties(8290)),
+                arrayOf(PointerCoords(2967f, 5928f))
+            )
+        val motionEvent2 =
+            MotionEvent(
+                2894,
+                ACTION_UP,
+                1,
+                0,
+                arrayOf(PointerProperties(8290)),
+                arrayOf(PointerCoords(2967f, 5928f))
+            )
 
         motionEventAdapter.convertToPointerInputEvent(motionEvent1)
         motionEventAdapter.convertToPointerInputEvent(motionEvent2)
@@ -1344,185 +1018,146 @@
 
     @Test
     fun convertToPointerInputEvent_downDown_correctPointersTracked() {
-        val motionEvent1 = MotionEvent(
-            1,
-            ACTION_DOWN,
-            1,
-            0,
-            arrayOf(PointerProperties(2)),
-            arrayOf(PointerCoords(3f, 4f))
-        )
-        val motionEvent2 = MotionEvent(
-            4,
-            ACTION_POINTER_DOWN,
-            2,
-            0,
-            arrayOf(
-                PointerProperties(5),
-                PointerProperties(2)
-            ),
-            arrayOf(
-                PointerCoords(7f, 8f),
-                PointerCoords(3f, 4f)
+        val motionEvent1 =
+            MotionEvent(
+                1,
+                ACTION_DOWN,
+                1,
+                0,
+                arrayOf(PointerProperties(2)),
+                arrayOf(PointerCoords(3f, 4f))
             )
-        )
+        val motionEvent2 =
+            MotionEvent(
+                4,
+                ACTION_POINTER_DOWN,
+                2,
+                0,
+                arrayOf(PointerProperties(5), PointerProperties(2)),
+                arrayOf(PointerCoords(7f, 8f), PointerCoords(3f, 4f))
+            )
 
         motionEventAdapter.convertToPointerInputEvent(motionEvent1)
         motionEventAdapter.convertToPointerInputEvent(motionEvent2)
 
         assertThat(motionEventAdapter.motionEventToComposePointerIdMap.toMap())
-            .containsExactlyEntriesIn(
-                mapOf(
-                    2 to PointerId(0),
-                    5 to PointerId(1)
-                )
-            )
+            .containsExactlyEntriesIn(mapOf(2 to PointerId(0), 5 to PointerId(1)))
     }
 
     @Test
     fun convertToPointerInputEvent_downDownFirstUp_correctPointerTracked() {
-        val motionEvent1 = MotionEvent(
-            1,
-            ACTION_DOWN,
-            1,
-            0,
-            arrayOf(PointerProperties(2)),
-            arrayOf(PointerCoords(3f, 4f))
-        )
-        val motionEvent2 = MotionEvent(
-            4,
-            ACTION_POINTER_DOWN,
-            2,
-            0,
-            arrayOf(
-                PointerProperties(5),
-                PointerProperties(2)
-            ),
-            arrayOf(
-                PointerCoords(7f, 8f),
-                PointerCoords(3f, 4f)
+        val motionEvent1 =
+            MotionEvent(
+                1,
+                ACTION_DOWN,
+                1,
+                0,
+                arrayOf(PointerProperties(2)),
+                arrayOf(PointerCoords(3f, 4f))
             )
-        )
-        val motionEvent3 = MotionEvent(
-            10,
-            ACTION_POINTER_UP,
-            2,
-            0,
-            arrayOf(
-                PointerProperties(5),
-                PointerProperties(2)
-            ),
-            arrayOf(
-                PointerCoords(7f, 8f),
-                PointerCoords(3f, 4f)
+        val motionEvent2 =
+            MotionEvent(
+                4,
+                ACTION_POINTER_DOWN,
+                2,
+                0,
+                arrayOf(PointerProperties(5), PointerProperties(2)),
+                arrayOf(PointerCoords(7f, 8f), PointerCoords(3f, 4f))
             )
-        )
+        val motionEvent3 =
+            MotionEvent(
+                10,
+                ACTION_POINTER_UP,
+                2,
+                0,
+                arrayOf(PointerProperties(5), PointerProperties(2)),
+                arrayOf(PointerCoords(7f, 8f), PointerCoords(3f, 4f))
+            )
 
         motionEventAdapter.convertToPointerInputEvent(motionEvent1)
         motionEventAdapter.convertToPointerInputEvent(motionEvent2)
         motionEventAdapter.convertToPointerInputEvent(motionEvent3)
 
         assertThat(motionEventAdapter.motionEventToComposePointerIdMap.toMap())
-            .containsExactlyEntriesIn(
-                mapOf(2 to PointerId(0))
-            )
+            .containsExactlyEntriesIn(mapOf(2 to PointerId(0)))
     }
 
     @Test
     fun convertToPointerInputEvent_downDownSecondUp_correctPointerTracked() {
-        val motionEvent1 = MotionEvent(
-            1,
-            ACTION_DOWN,
-            1,
-            0,
-            arrayOf(PointerProperties(2)),
-            arrayOf(PointerCoords(3f, 4f))
-        )
-        val motionEvent2 = MotionEvent(
-            4,
-            ACTION_POINTER_DOWN,
-            2,
-            0,
-            arrayOf(
-                PointerProperties(5),
-                PointerProperties(2)
-            ),
-            arrayOf(
-                PointerCoords(7f, 8f),
-                PointerCoords(3f, 4f)
+        val motionEvent1 =
+            MotionEvent(
+                1,
+                ACTION_DOWN,
+                1,
+                0,
+                arrayOf(PointerProperties(2)),
+                arrayOf(PointerCoords(3f, 4f))
             )
-        )
-        val motionEvent3 = MotionEvent(
-            10,
-            ACTION_POINTER_UP,
-            2,
-            1,
-            arrayOf(
-                PointerProperties(5),
-                PointerProperties(2)
-            ),
-            arrayOf(
-                PointerCoords(7f, 8f),
-                PointerCoords(3f, 4f)
+        val motionEvent2 =
+            MotionEvent(
+                4,
+                ACTION_POINTER_DOWN,
+                2,
+                0,
+                arrayOf(PointerProperties(5), PointerProperties(2)),
+                arrayOf(PointerCoords(7f, 8f), PointerCoords(3f, 4f))
             )
-        )
+        val motionEvent3 =
+            MotionEvent(
+                10,
+                ACTION_POINTER_UP,
+                2,
+                1,
+                arrayOf(PointerProperties(5), PointerProperties(2)),
+                arrayOf(PointerCoords(7f, 8f), PointerCoords(3f, 4f))
+            )
 
         motionEventAdapter.convertToPointerInputEvent(motionEvent1)
         motionEventAdapter.convertToPointerInputEvent(motionEvent2)
         motionEventAdapter.convertToPointerInputEvent(motionEvent3)
 
         assertThat(motionEventAdapter.motionEventToComposePointerIdMap.toMap())
-            .containsExactlyEntriesIn(
-                mapOf(5 to PointerId(1))
-            )
+            .containsExactlyEntriesIn(mapOf(5 to PointerId(1)))
     }
 
     @Test
     fun convertToPointerInputEvent_downDownUpUp_noPointersTracked() {
-        val motionEvent1 = MotionEvent(
-            1,
-            ACTION_DOWN,
-            1,
-            0,
-            arrayOf(PointerProperties(2)),
-            arrayOf(PointerCoords(3f, 4f))
-        )
-        val motionEvent2 = MotionEvent(
-            4,
-            ACTION_POINTER_DOWN,
-            2,
-            0,
-            arrayOf(
-                PointerProperties(5),
-                PointerProperties(2)
-            ),
-            arrayOf(
-                PointerCoords(7f, 8f),
-                PointerCoords(3f, 4f)
+        val motionEvent1 =
+            MotionEvent(
+                1,
+                ACTION_DOWN,
+                1,
+                0,
+                arrayOf(PointerProperties(2)),
+                arrayOf(PointerCoords(3f, 4f))
             )
-        )
-        val motionEvent3 = MotionEvent(
-            10,
-            ACTION_POINTER_UP,
-            2,
-            0,
-            arrayOf(
-                PointerProperties(5),
-                PointerProperties(2)
-            ),
-            arrayOf(
-                PointerCoords(7f, 8f),
-                PointerCoords(3f, 4f)
+        val motionEvent2 =
+            MotionEvent(
+                4,
+                ACTION_POINTER_DOWN,
+                2,
+                0,
+                arrayOf(PointerProperties(5), PointerProperties(2)),
+                arrayOf(PointerCoords(7f, 8f), PointerCoords(3f, 4f))
             )
-        )
-        val motionEvent4 = MotionEvent(
-            20,
-            ACTION_UP,
-            1,
-            0,
-            arrayOf(PointerProperties(2)),
-            arrayOf(PointerCoords(3f, 4f))
-        )
+        val motionEvent3 =
+            MotionEvent(
+                10,
+                ACTION_POINTER_UP,
+                2,
+                0,
+                arrayOf(PointerProperties(5), PointerProperties(2)),
+                arrayOf(PointerCoords(7f, 8f), PointerCoords(3f, 4f))
+            )
+        val motionEvent4 =
+            MotionEvent(
+                20,
+                ACTION_UP,
+                1,
+                0,
+                arrayOf(PointerProperties(2)),
+                arrayOf(PointerCoords(3f, 4f))
+            )
 
         motionEventAdapter.convertToPointerInputEvent(motionEvent1)
         motionEventAdapter.convertToPointerInputEvent(motionEvent2)
@@ -1534,42 +1169,33 @@
 
     @Test
     fun convertToPointerInputEvent_downCancel_noPointersTracked() {
-        val motionEvent1 = MotionEvent(
-            1,
-            ACTION_DOWN,
-            1,
-            0,
-            arrayOf(PointerProperties(2)),
-            arrayOf(PointerCoords(3f, 4f))
-        )
-        val motionEvent2 = MotionEvent(
-            4,
-            ACTION_POINTER_DOWN,
-            2,
-            0,
-            arrayOf(
-                PointerProperties(5),
-                PointerProperties(2)
-            ),
-            arrayOf(
-                PointerCoords(7f, 8f),
-                PointerCoords(3f, 4f)
+        val motionEvent1 =
+            MotionEvent(
+                1,
+                ACTION_DOWN,
+                1,
+                0,
+                arrayOf(PointerProperties(2)),
+                arrayOf(PointerCoords(3f, 4f))
             )
-        )
-        val motionEvent3 = MotionEvent(
-            10,
-            ACTION_CANCEL,
-            2,
-            0,
-            arrayOf(
-                PointerProperties(5),
-                PointerProperties(2)
-            ),
-            arrayOf(
-                PointerCoords(7f, 8f),
-                PointerCoords(3f, 4f)
+        val motionEvent2 =
+            MotionEvent(
+                4,
+                ACTION_POINTER_DOWN,
+                2,
+                0,
+                arrayOf(PointerProperties(5), PointerProperties(2)),
+                arrayOf(PointerCoords(7f, 8f), PointerCoords(3f, 4f))
             )
-        )
+        val motionEvent3 =
+            MotionEvent(
+                10,
+                ACTION_CANCEL,
+                2,
+                0,
+                arrayOf(PointerProperties(5), PointerProperties(2)),
+                arrayOf(PointerCoords(7f, 8f), PointerCoords(3f, 4f))
+            )
         motionEventAdapter.convertToPointerInputEvent(motionEvent1)
         motionEventAdapter.convertToPointerInputEvent(motionEvent2)
         motionEventAdapter.convertToPointerInputEvent(motionEvent3)
@@ -1579,14 +1205,15 @@
 
     @Test
     fun convertToPointerInputEvent_doesNotSynchronouslyMutateMotionEvent() {
-        val motionEvent = MotionEvent(
-            1,
-            ACTION_DOWN,
-            1,
-            0,
-            arrayOf(PointerProperties(2)),
-            arrayOf(PointerCoords(3f, 4f))
-        )
+        val motionEvent =
+            MotionEvent(
+                1,
+                ACTION_DOWN,
+                1,
+                0,
+                arrayOf(PointerProperties(2)),
+                arrayOf(PointerCoords(3f, 4f))
+            )
         motionEvent.offsetLocation(10f, 100f)
 
         motionEventAdapter.convertToPointerInputEvent(motionEvent)
@@ -1597,14 +1224,15 @@
 
     @Test
     fun convertToPointerInputEvent_1PointerActionDown_includesMotionEvent() {
-        val motionEvent = MotionEvent(
-            2894,
-            ACTION_DOWN,
-            1,
-            0,
-            arrayOf(PointerProperties(8290)),
-            arrayOf(PointerCoords(2967f, 5928f))
-        )
+        val motionEvent =
+            MotionEvent(
+                2894,
+                ACTION_DOWN,
+                1,
+                0,
+                arrayOf(PointerProperties(8290)),
+                arrayOf(PointerCoords(2967f, 5928f))
+            )
 
         val pointerInputEvent = motionEventAdapter.convertToPointerInputEvent(motionEvent)
         assertThat(pointerInputEvent).isNotNull()
@@ -1624,14 +1252,15 @@
                 arrayOf(PointerCoords(3f, 4f))
             )
         )
-        val motionEvent = MotionEvent(
-            5,
-            ACTION_MOVE,
-            1,
-            0,
-            arrayOf(PointerProperties(2)),
-            arrayOf(PointerCoords(6f, 7f))
-        )
+        val motionEvent =
+            MotionEvent(
+                5,
+                ACTION_MOVE,
+                1,
+                0,
+                arrayOf(PointerProperties(2)),
+                arrayOf(PointerCoords(6f, 7f))
+            )
 
         val pointerInputEvent = motionEventAdapter.convertToPointerInputEvent(motionEvent)
         assertThat(pointerInputEvent).isNotNull()
@@ -1651,14 +1280,15 @@
                 arrayOf(PointerCoords(3f, 4f))
             )
         )
-        val motionEvent = MotionEvent(
-            34,
-            ACTION_UP,
-            1,
-            0,
-            arrayOf(PointerProperties(46)),
-            arrayOf(PointerCoords(3f, 4f))
-        )
+        val motionEvent =
+            MotionEvent(
+                34,
+                ACTION_UP,
+                1,
+                0,
+                arrayOf(PointerProperties(46)),
+                arrayOf(PointerCoords(3f, 4f))
+            )
 
         val pointerInputEvent = motionEventAdapter.convertToPointerInputEvent(motionEvent)
         assertThat(pointerInputEvent).isNotNull()
@@ -1678,20 +1308,22 @@
                 arrayOf(PointerCoords(3f, 4f))
             )
         )
-        val motionEvent = MotionEvent(
-            34,
-            ACTION_MOVE,
-            1,
-            0,
-            arrayOf(PointerProperties(46)),
-            arrayOf(PointerCoords(30f, 40f))
-        )
+        val motionEvent =
+            MotionEvent(
+                34,
+                ACTION_MOVE,
+                1,
+                0,
+                arrayOf(PointerProperties(46)),
+                arrayOf(PointerCoords(30f, 40f))
+            )
 
-        val positionCalculator = object : PositionCalculator by positionCalculator {
-            override fun screenToLocal(positionOnScreen: Offset): Offset {
-                return positionOnScreen / 2f
+        val positionCalculator =
+            object : PositionCalculator by positionCalculator {
+                override fun screenToLocal(positionOnScreen: Offset): Offset {
+                    return positionOnScreen / 2f
+                }
             }
-        }
 
         val pointerInputEvent =
             motionEventAdapter.convertToPointerInputEvent(motionEvent, positionCalculator)
@@ -1708,18 +1340,16 @@
 
     @Test
     fun convertScrollEvent_horizontalPositive() {
-        val motionEvent = MotionEvent(
-            eventTime = 1,
-            action = ACTION_SCROLL,
-            numPointers = 1,
-            actionIndex = 0,
-            pointerProperties = arrayOf(PointerProperties(2)),
-            pointerCoords = arrayOf(
-                PointerCoords(3f, 4f).apply {
-                    setAxisValue(AXIS_HSCROLL, 5f)
-                }
+        val motionEvent =
+            MotionEvent(
+                eventTime = 1,
+                action = ACTION_SCROLL,
+                numPointers = 1,
+                actionIndex = 0,
+                pointerProperties = arrayOf(PointerProperties(2)),
+                pointerCoords =
+                    arrayOf(PointerCoords(3f, 4f).apply { setAxisValue(AXIS_HSCROLL, 5f) })
             )
-        )
 
         val pointerInputEvent = motionEventAdapter.convertToPointerInputEvent(motionEvent)
         assertThat(pointerInputEvent).isNotNull()
@@ -1729,18 +1359,16 @@
 
     @Test
     fun convertScrollEvent_horizontalNegative() {
-        val motionEvent = MotionEvent(
-            eventTime = 1,
-            action = ACTION_SCROLL,
-            numPointers = 1,
-            actionIndex = 0,
-            pointerProperties = arrayOf(PointerProperties(2)),
-            pointerCoords = arrayOf(
-                PointerCoords(3f, 4f).apply {
-                    setAxisValue(AXIS_HSCROLL, -5f)
-                }
+        val motionEvent =
+            MotionEvent(
+                eventTime = 1,
+                action = ACTION_SCROLL,
+                numPointers = 1,
+                actionIndex = 0,
+                pointerProperties = arrayOf(PointerProperties(2)),
+                pointerCoords =
+                    arrayOf(PointerCoords(3f, 4f).apply { setAxisValue(AXIS_HSCROLL, -5f) })
             )
-        )
 
         val pointerInputEvent = motionEventAdapter.convertToPointerInputEvent(motionEvent)
         assertThat(pointerInputEvent).isNotNull()
@@ -1750,18 +1378,16 @@
 
     @Test
     fun convertScrollEvent_verticalPositive() {
-        val motionEvent = MotionEvent(
-            eventTime = 1,
-            action = ACTION_SCROLL,
-            numPointers = 1,
-            actionIndex = 0,
-            pointerProperties = arrayOf(PointerProperties(2)),
-            pointerCoords = arrayOf(
-                PointerCoords(3f, 4f).apply {
-                    setAxisValue(AXIS_VSCROLL, 5f)
-                }
+        val motionEvent =
+            MotionEvent(
+                eventTime = 1,
+                action = ACTION_SCROLL,
+                numPointers = 1,
+                actionIndex = 0,
+                pointerProperties = arrayOf(PointerProperties(2)),
+                pointerCoords =
+                    arrayOf(PointerCoords(3f, 4f).apply { setAxisValue(AXIS_VSCROLL, 5f) })
             )
-        )
 
         val pointerInputEvent = motionEventAdapter.convertToPointerInputEvent(motionEvent)
         assertThat(pointerInputEvent).isNotNull()
@@ -1772,18 +1398,16 @@
 
     @Test
     fun convertScrollEvent_verticalNegative() {
-        val motionEvent = MotionEvent(
-            eventTime = 1,
-            action = ACTION_SCROLL,
-            numPointers = 1,
-            actionIndex = 0,
-            pointerProperties = arrayOf(PointerProperties(2)),
-            pointerCoords = arrayOf(
-                PointerCoords(3f, 4f).apply {
-                    setAxisValue(AXIS_VSCROLL, -5f)
-                }
+        val motionEvent =
+            MotionEvent(
+                eventTime = 1,
+                action = ACTION_SCROLL,
+                numPointers = 1,
+                actionIndex = 0,
+                pointerProperties = arrayOf(PointerProperties(2)),
+                pointerCoords =
+                    arrayOf(PointerCoords(3f, 4f).apply { setAxisValue(AXIS_VSCROLL, -5f) })
             )
-        )
 
         val pointerInputEvent = motionEventAdapter.convertToPointerInputEvent(motionEvent)
         assertThat(pointerInputEvent).isNotNull()
@@ -1816,22 +1440,23 @@
     pointerProperties: Array<MotionEvent.PointerProperties>,
     pointerCoords: Array<MotionEvent.PointerCoords>,
     downTime: Long = 0
-) = MotionEvent.obtain(
-    downTime,
-    eventTime.toLong(),
-    action + (actionIndex shl MotionEvent.ACTION_POINTER_INDEX_SHIFT),
-    numPointers,
-    pointerProperties,
-    pointerCoords,
-    0,
-    0,
-    0f,
-    0f,
-    0,
-    0,
-    InputDevice.SOURCE_TOUCHSCREEN,
-    0
-)
+) =
+    MotionEvent.obtain(
+        downTime,
+        eventTime.toLong(),
+        action + (actionIndex shl MotionEvent.ACTION_POINTER_INDEX_SHIFT),
+        numPointers,
+        pointerProperties,
+        pointerCoords,
+        0,
+        0,
+        0f,
+        0f,
+        0,
+        0,
+        InputDevice.SOURCE_TOUCHSCREEN,
+        0
+    )
 
 private fun assertPointerInputEventData(
     actual: PointerInputEventData,
diff --git a/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/input/pointer/MotionEventSpyTest.kt b/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/input/pointer/MotionEventSpyTest.kt
index a22d258..dffdb0c 100644
--- a/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/input/pointer/MotionEventSpyTest.kt
+++ b/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/input/pointer/MotionEventSpyTest.kt
@@ -42,14 +42,11 @@
 @LargeTest
 @RunWith(AndroidJUnit4::class)
 class MotionEventSpyTest {
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
     val Tag = "Test Tag"
 
-    /**
-     * When the events are inside the pointer input area, they should be received.
-     */
+    /** When the events are inside the pointer input area, they should be received. */
     @Test
     fun eventInside() {
         val events = mutableListOf<Int>()
@@ -61,48 +58,39 @@
 
         rule.waitForIdle()
 
-        rule.onNodeWithTag(Tag)
-            .performTouchInput {
-                down(Offset.Zero)
-                moveBy(Offset(1f, 1f))
-                up()
-            }
+        rule.onNodeWithTag(Tag).performTouchInput {
+            down(Offset.Zero)
+            moveBy(Offset(1f, 1f))
+            up()
+        }
 
         rule.waitForIdle()
 
-        assertThat(events).containsExactly(
-            ACTION_DOWN, ACTION_MOVE, ACTION_UP
-        )
+        assertThat(events).containsExactly(ACTION_DOWN, ACTION_MOVE, ACTION_UP)
     }
 
-    /**
-     * When the events are inside the child's pointer input area, they should be received.
-     */
+    /** When the events are inside the child's pointer input area, they should be received. */
     @Test
     fun eventInsideChild() {
         val events = mutableListOf<Int>()
         rule.setContent {
             Box(Modifier.fillMaxSize()) {
                 Box(Modifier.size(50.dp).motionEventSpy { events += it.actionMasked }) {
-                    Box(Modifier.size(50.dp).testTag(Tag).offset(55.dp, 0.dp).pointerInput(Unit) {
-                    })
+                    Box(Modifier.size(50.dp).testTag(Tag).offset(55.dp, 0.dp).pointerInput(Unit) {})
                 }
             }
         }
 
         rule.waitForIdle()
 
-        rule.onNodeWithTag(Tag)
-            .performTouchInput {
-                down(Offset.Zero)
-                moveBy(Offset(1f, 1f))
-                up()
-            }
+        rule.onNodeWithTag(Tag).performTouchInput {
+            down(Offset.Zero)
+            moveBy(Offset(1f, 1f))
+            up()
+        }
 
         rule.waitForIdle()
 
-        assertThat(events).containsExactly(
-            ACTION_DOWN, ACTION_MOVE, ACTION_UP
-        )
+        assertThat(events).containsExactly(ACTION_DOWN, ACTION_MOVE, ACTION_UP)
     }
 }
diff --git a/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/input/pointer/MouseEventTest.kt b/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/input/pointer/MouseEventTest.kt
index 54ed9ab..604b7a8 100644
--- a/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/input/pointer/MouseEventTest.kt
+++ b/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/input/pointer/MouseEventTest.kt
@@ -43,8 +43,7 @@
 @MediumTest
 @OptIn(ExperimentalTestApi::class)
 class MouseEventTest {
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
     val tag = "Tagged Layout"
 
@@ -58,9 +57,7 @@
         rule.setContent {
             Box(Modifier.fillMaxSize()) {
                 Box(
-                    Modifier.align(Alignment.Center).size(50.dp)
-                    .testTag(tag)
-                    .pointerInput(Unit) {
+                    Modifier.align(Alignment.Center).size(50.dp).testTag(tag).pointerInput(Unit) {
                         awaitPointerEventScope {
                             while (true) {
                                 events += awaitPointerEvent().type
@@ -91,9 +88,7 @@
         rule.setContent {
             Box(Modifier.fillMaxSize()) {
                 Box(
-                    Modifier.align(Alignment.Center).size(50.dp)
-                    .testTag(tag)
-                    .pointerInput(Unit) {
+                    Modifier.align(Alignment.Center).size(50.dp).testTag(tag).pointerInput(Unit) {
                         awaitPointerEventScope {
                             while (true) {
                                 events += awaitPointerEvent().type
@@ -105,12 +100,13 @@
         }
 
         rule.waitForIdle()
-        rule.onNodeWithTag(tag).performMouseInput {
-            moveTo(Offset.Zero)
-        }.performTouchInput {
-            down(Offset.Zero)
-            up()
-        }
+        rule
+            .onNodeWithTag(tag)
+            .performMouseInput { moveTo(Offset.Zero) }
+            .performTouchInput {
+                down(Offset.Zero)
+                up()
+            }
 
         assertThat(events).hasSize(4)
         assertThat(events[0]).isEqualTo(PointerEventType.Enter)
@@ -129,15 +125,13 @@
         rule.setContent {
             Box(Modifier.fillMaxSize()) {
                 Box(
-                    Modifier.align(Alignment.Center).size(50.dp)
-                        .testTag(tag)
-                        .pointerInput(Unit) {
-                            awaitPointerEventScope {
-                                while (true) {
-                                    events += awaitPointerEvent().type
-                                }
+                    Modifier.align(Alignment.Center).size(50.dp).testTag(tag).pointerInput(Unit) {
+                        awaitPointerEventScope {
+                            while (true) {
+                                events += awaitPointerEvent().type
                             }
                         }
+                    }
                 )
             }
         }
@@ -167,9 +161,7 @@
         val alignment = mutableStateOf(Alignment.BottomCenter)
         val events = createRelayoutComposition(alignment)
 
-        rule.onNodeWithTag(tag).performMouseInput {
-            moveTo(Offset.Zero)
-        }
+        rule.onNodeWithTag(tag).performMouseInput { moveTo(Offset.Zero) }
 
         assertThat(events).hasSize(1)
         assertThat(events[0]).isEqualTo(PointerEventType.Enter)
@@ -248,15 +240,13 @@
         rule.setContent {
             Box(Modifier.fillMaxSize()) {
                 Box(
-                    Modifier.align(alignment.value).size(50.dp)
-                        .testTag(tag)
-                        .pointerInput(Unit) {
-                            awaitPointerEventScope {
-                                while (true) {
-                                    events += awaitPointerEvent().type
-                                }
+                    Modifier.align(alignment.value).size(50.dp).testTag(tag).pointerInput(Unit) {
+                        awaitPointerEventScope {
+                            while (true) {
+                                events += awaitPointerEvent().type
                             }
                         }
+                    }
                 )
             }
         }
diff --git a/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/input/pointer/PointerIconTest.kt b/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/input/pointer/PointerIconTest.kt
index 508c2fc..59ee1b1 100644
--- a/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/input/pointer/PointerIconTest.kt
+++ b/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/input/pointer/PointerIconTest.kt
@@ -58,8 +58,7 @@
 @OptIn(ExperimentalTestApi::class)
 @RunWith(AndroidJUnit4::class)
 class PointerIconTest {
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
     private val parentIconTag = "myParentIcon"
     private val childIconTag = "myChildIcon"
     private val grandchildIconTag = "myGrandchildIcon"
@@ -71,46 +70,46 @@
 
     @Before
     fun setup() {
-        iconService = object : PointerIconService {
-            private var currentIcon: PointerIcon = PointerIcon.Default
-            override fun getIcon(): PointerIcon {
-                return currentIcon
-            }
+        iconService =
+            object : PointerIconService {
+                private var currentIcon: PointerIcon = PointerIcon.Default
 
-            override fun setIcon(value: PointerIcon?) {
-                currentIcon = value ?: PointerIcon.Default
+                override fun getIcon(): PointerIcon {
+                    return currentIcon
+                }
+
+                override fun setIcon(value: PointerIcon?) {
+                    currentIcon = value ?: PointerIcon.Default
+                }
             }
-        }
     }
 
     @Test
     fun testInspectorValue() {
         isDebugInspectorInfoEnabled = true
         rule.setContent {
-            val modifier = Modifier.pointerHoverIcon(
-                PointerIcon.Hand,
-                overrideDescendants = false
-            ) as InspectableValue
+            val modifier =
+                Modifier.pointerHoverIcon(PointerIcon.Hand, overrideDescendants = false)
+                    as InspectableValue
             assertThat(modifier.nameFallback).isEqualTo("pointerHoverIcon")
             assertThat(modifier.valueOverride).isNull()
-            assertThat(modifier.inspectableElements.map { it.name }.asIterable()).containsExactly(
-                "icon",
-                "overrideDescendants",
-            )
+            assertThat(modifier.inspectableElements.map { it.name }.asIterable())
+                .containsExactly(
+                    "icon",
+                    "overrideDescendants",
+                )
         }
         isDebugInspectorInfoEnabled = false
     }
 
     /**
-     * Setup:
-     * The hierarchy for this test is setup as:
-     *  Parent Box (custom icon = [PointerIcon.Crosshair], overrideDescendants = FALSE)
-     *    ⤷ Child Box (custom icon = [PointerIcon.Text], overrideDescendants = FALSE)
+     * Setup: The hierarchy for this test is setup as: Parent Box (custom icon =
+     * [PointerIcon.Crosshair], overrideDescendants = FALSE) ⤷ Child Box (custom icon =
+     * [PointerIcon.Text], overrideDescendants = FALSE)
      *
-     *  Expected Output:
-     *  Because we don't move the cursor, the icon will be the default [PointerIcon.Default]. We
-     *  also want to check that when using a .pointerHoverIcon modifier with a composable,
-     *  composition only happens once (per composable).
+     * Expected Output: Because we don't move the cursor, the icon will be the default
+     * [PointerIcon.Default]. We also want to check that when using a .pointerHoverIcon modifier
+     * with a composable, composition only happens once (per composable).
      */
     @Test
     fun parentChildFullOverlap_noOverrideDescendants_checkNumberOfCompositions() {
@@ -120,18 +119,16 @@
         rule.setContent {
             CompositionLocalProvider(LocalPointerIconService provides iconService) {
                 Box(
-                    modifier = Modifier
-                        .requiredSize(200.dp)
-                        .border(BorderStroke(2.dp, SolidColor(Color.Red)))
-                        .testTag(parentIconTag)
-                        .pointerHoverIcon(desiredParentIcon, overrideDescendants = false)
+                    modifier =
+                        Modifier.requiredSize(200.dp)
+                            .border(BorderStroke(2.dp, SolidColor(Color.Red)))
+                            .testTag(parentIconTag)
+                            .pointerHoverIcon(desiredParentIcon, overrideDescendants = false)
                 ) {
-
                     numberOfCompositions++
 
                     Box(
-                        Modifier
-                            .requiredSize(200.dp)
+                        Modifier.requiredSize(200.dp)
                             .border(BorderStroke(2.dp, SolidColor(Color.Black)))
                             .testTag(childIconTag)
                             .pointerHoverIcon(desiredChildIcon, overrideDescendants = false)
@@ -149,30 +146,27 @@
     }
 
     /**
-     * Setup:
-     * The hierarchy for this test is setup as:
-     *  Parent Box (custom icon = [PointerIcon.Crosshair], overrideDescendants = FALSE)
-     *    ⤷ Child Box (custom icon = [PointerIcon.Text], overrideDescendants = FALSE)
+     * Setup: The hierarchy for this test is setup as: Parent Box (custom icon =
+     * [PointerIcon.Crosshair], overrideDescendants = FALSE) ⤷ Child Box (custom icon =
+     * [PointerIcon.Text], overrideDescendants = FALSE)
      *
-     *  Expected Output:
-     *  Child Box’s [PointerIcon.Text] wins for the entire Box area because it’s lower in
-     *  the hierarchy than Parent Box. If the Parent Box's overrideDescendants = false, the Child
-     *  Box takes priority.
+     * Expected Output: Child Box’s [PointerIcon.Text] wins for the entire Box area because it’s
+     * lower in the hierarchy than Parent Box. If the Parent Box's overrideDescendants = false, the
+     * Child Box takes priority.
      */
     @Test
     fun parentChildFullOverlap_noOverrideDescendants() {
         rule.setContent {
             CompositionLocalProvider(LocalPointerIconService provides iconService) {
                 Box(
-                    modifier = Modifier
-                        .requiredSize(200.dp)
-                        .border(BorderStroke(2.dp, SolidColor(Color.Red)))
-                        .testTag(parentIconTag)
-                        .pointerHoverIcon(desiredParentIcon, overrideDescendants = false)
+                    modifier =
+                        Modifier.requiredSize(200.dp)
+                            .border(BorderStroke(2.dp, SolidColor(Color.Red)))
+                            .testTag(parentIconTag)
+                            .pointerHoverIcon(desiredParentIcon, overrideDescendants = false)
                 ) {
                     Box(
-                        Modifier
-                            .requiredSize(200.dp)
+                        Modifier.requiredSize(200.dp)
                             .border(BorderStroke(2.dp, SolidColor(Color.Black)))
                             .testTag(childIconTag)
                             .pointerHoverIcon(desiredChildIcon, overrideDescendants = false)
@@ -181,9 +175,7 @@
             }
         }
         // Verify initial state of pointer icon
-        rule.runOnIdle {
-            assertThat(iconService.getIcon()).isEqualTo(desiredDefaultIcon)
-        }
+        rule.runOnIdle { assertThat(iconService.getIcon()).isEqualTo(desiredDefaultIcon) }
         // Verify Child Box's icon is the desired child icon
         verifyIconOnHover(childIconTag, desiredChildIcon)
         // Verify Parent Box is respecting Child Box's icon
@@ -191,31 +183,28 @@
     }
 
     /**
-     * Setup:
-     * The hierarchy for this test is setup as:
-     *  Parent Box (custom icon = [PointerIcon.Crosshair], overrideDescendants = TRUE)
-     *    ⤷ Child Box (custom icon = [PointerIcon.Text], overrideDescendants = FALSE)
+     * Setup: The hierarchy for this test is setup as: Parent Box (custom icon =
+     * [PointerIcon.Crosshair], overrideDescendants = TRUE) ⤷ Child Box (custom icon =
+     * [PointerIcon.Text], overrideDescendants = FALSE)
      *
-     *  Expected Output:
-     *  Parent Box’s [PointerIcon.Crosshair] wins for the entire Box area because it’s higher in
-     *  the hierarchy than Child Box. Also the Parent Box's overrideDescendants value is TRUE, so
-     *  as the topmost parent in the hierarchy with overrideDescendants = true, all its children
-     *  must respect it.
+     * Expected Output: Parent Box’s [PointerIcon.Crosshair] wins for the entire Box area because
+     * it’s higher in the hierarchy than Child Box. Also the Parent Box's overrideDescendants value
+     * is TRUE, so as the topmost parent in the hierarchy with overrideDescendants = true, all its
+     * children must respect it.
      */
     @Test
     fun parentChildFullOverlap_parentOverridesDescendants() {
         rule.setContent {
             CompositionLocalProvider(LocalPointerIconService provides iconService) {
                 Box(
-                    modifier = Modifier
-                        .requiredSize(200.dp)
-                        .border(BorderStroke(2.dp, SolidColor(Color.Red)))
-                        .testTag(parentIconTag)
-                        .pointerHoverIcon(desiredParentIcon, overrideDescendants = true)
+                    modifier =
+                        Modifier.requiredSize(200.dp)
+                            .border(BorderStroke(2.dp, SolidColor(Color.Red)))
+                            .testTag(parentIconTag)
+                            .pointerHoverIcon(desiredParentIcon, overrideDescendants = true)
                 ) {
                     Box(
-                        Modifier
-                            .requiredSize(200.dp)
+                        Modifier.requiredSize(200.dp)
                             .border(BorderStroke(2.dp, SolidColor(Color.Black)))
                             .testTag(childIconTag)
                             .pointerHoverIcon(desiredChildIcon, overrideDescendants = false)
@@ -224,9 +213,7 @@
             }
         }
         // Verify initial state of pointer icon
-        rule.runOnIdle {
-            assertThat(iconService.getIcon()).isEqualTo(desiredDefaultIcon)
-        }
+        rule.runOnIdle { assertThat(iconService.getIcon()).isEqualTo(desiredDefaultIcon) }
         // Verify Parent Box's icon is the desired parent icon
         verifyIconOnHover(parentIconTag, desiredParentIcon)
         // Verify Child Box is respecting Parent Box's icon
@@ -234,30 +221,27 @@
     }
 
     /**
-     * Setup:
-     * The hierarchy for this test is setup as:
-     *  Parent Box (custom icon = [PointerIcon.Crosshair], overrideDescendants = FALSE)
-     *    ⤷ Child Box (custom icon = [PointerIcon.Text], overrideDescendants = TRUE)
+     * Setup: The hierarchy for this test is setup as: Parent Box (custom icon =
+     * [PointerIcon.Crosshair], overrideDescendants = FALSE) ⤷ Child Box (custom icon =
+     * [PointerIcon.Text], overrideDescendants = TRUE)
      *
-     *  Expected Output:
-     *  Child Box’s [PointerIcon.Text] wins for the entire Box area because its lower in priority
-     *  than Parent Box. If the Parent Box's overrideDescendants = false, the Child Box takes
-     *  priority.
+     * Expected Output: Child Box’s [PointerIcon.Text] wins for the entire Box area because its
+     * lower in priority than Parent Box. If the Parent Box's overrideDescendants = false, the Child
+     * Box takes priority.
      */
     @Test
     fun parentChildFullOverlap_childOverridesDescendants() {
         rule.setContent {
             CompositionLocalProvider(LocalPointerIconService provides iconService) {
                 Box(
-                    modifier = Modifier
-                        .requiredSize(200.dp)
-                        .border(BorderStroke(2.dp, SolidColor(Color.Red)))
-                        .testTag(parentIconTag)
-                        .pointerHoverIcon(desiredParentIcon, overrideDescendants = false)
+                    modifier =
+                        Modifier.requiredSize(200.dp)
+                            .border(BorderStroke(2.dp, SolidColor(Color.Red)))
+                            .testTag(parentIconTag)
+                            .pointerHoverIcon(desiredParentIcon, overrideDescendants = false)
                 ) {
                     Box(
-                        Modifier
-                            .requiredSize(200.dp)
+                        Modifier.requiredSize(200.dp)
                             .border(BorderStroke(2.dp, SolidColor(Color.Black)))
                             .testTag(childIconTag)
                             .pointerHoverIcon(desiredChildIcon, overrideDescendants = true)
@@ -266,9 +250,7 @@
             }
         }
         // Verify initial state of pointer icon
-        rule.runOnIdle {
-            assertThat(iconService.getIcon()).isEqualTo(desiredDefaultIcon)
-        }
+        rule.runOnIdle { assertThat(iconService.getIcon()).isEqualTo(desiredDefaultIcon) }
         // Verify Child Box's icon is the desired child icon
         verifyIconOnHover(childIconTag, desiredChildIcon)
         // Verify Parent Box is respecting Child Box's icon
@@ -276,30 +258,27 @@
     }
 
     /**
-     * Setup:
-     * The hierarchy for this test is setup as:
-     *  Parent Box (custom icon = [PointerIcon.Crosshair], overrideDescendants = TRUE)
-     *    ⤷ Child Box (custom icon = [PointerIcon.Text], overrideDescendants = TRUE)
+     * Setup: The hierarchy for this test is setup as: Parent Box (custom icon =
+     * [PointerIcon.Crosshair], overrideDescendants = TRUE) ⤷ Child Box (custom icon =
+     * [PointerIcon.Text], overrideDescendants = TRUE)
      *
-     *  Expected Output:
-     *  Parent Box’s [PointerIcon.Crosshair] wins for the entire Box area because its
-     *  overrideDescendants = true. The Parent Box takes precedence because it is the topmost parent
-     *  in the hierarchy with overrideDescendants = true.
+     * Expected Output: Parent Box’s [PointerIcon.Crosshair] wins for the entire Box area because
+     * its overrideDescendants = true. The Parent Box takes precedence because it is the topmost
+     * parent in the hierarchy with overrideDescendants = true.
      */
     @Test
     fun parentChildFullOverlap_bothOverrideDescendants() {
         rule.setContent {
             CompositionLocalProvider(LocalPointerIconService provides iconService) {
                 Box(
-                    modifier = Modifier
-                        .requiredSize(200.dp)
-                        .border(BorderStroke(2.dp, SolidColor(Color.Red)))
-                        .testTag(parentIconTag)
-                        .pointerHoverIcon(desiredParentIcon, overrideDescendants = true)
+                    modifier =
+                        Modifier.requiredSize(200.dp)
+                            .border(BorderStroke(2.dp, SolidColor(Color.Red)))
+                            .testTag(parentIconTag)
+                            .pointerHoverIcon(desiredParentIcon, overrideDescendants = true)
                 ) {
                     Box(
-                        Modifier
-                            .requiredSize(200.dp)
+                        Modifier.requiredSize(200.dp)
                             .border(BorderStroke(2.dp, SolidColor(Color.Black)))
                             .testTag(childIconTag)
                             .pointerHoverIcon(desiredChildIcon, overrideDescendants = true)
@@ -308,9 +287,7 @@
             }
         }
         // Verify initial state of pointer icon
-        rule.runOnIdle {
-            assertThat(iconService.getIcon()).isEqualTo(desiredDefaultIcon)
-        }
+        rule.runOnIdle { assertThat(iconService.getIcon()).isEqualTo(desiredDefaultIcon) }
         // Verify Parent Box's icon is the desired parent icon
         verifyIconOnHover(parentIconTag, desiredParentIcon)
         // Verify Child Box is respecting Parent Box's icon
@@ -318,31 +295,28 @@
     }
 
     /**
-     * Setup:
-     * The hierarchy for this test is setup as:
-     *  Parent Box (custom icon = [PointerIcon.Crosshair], overrideDescendants = FALSE)
-     *    ⤷ Child Box (custom icon = [PointerIcon.Text], overrideDescendants = FALSE)
+     * Setup: The hierarchy for this test is setup as: Parent Box (custom icon =
+     * [PointerIcon.Crosshair], overrideDescendants = FALSE) ⤷ Child Box (custom icon =
+     * [PointerIcon.Text], overrideDescendants = FALSE)
      *
-     *  Expected Output:
-     *  Child Box’s [PointerIcon.Hand] wins for the entire Child Box surface area because there's
-     *  no parent in its hierarchy that has overrideDescendants = true. Parent Box's
-     *  [PointerIcon.Crosshair] wins for all remaining surface area of its Box that doesn't overlap
-     *  with Child Box.
+     * Expected Output: Child Box’s [PointerIcon.Hand] wins for the entire Child Box surface area
+     * because there's no parent in its hierarchy that has overrideDescendants = true. Parent Box's
+     * [PointerIcon.Crosshair] wins for all remaining surface area of its Box that doesn't overlap
+     * with Child Box.
      */
     @Test
     fun parentChildPartialOverlap_noOverrideDescendants() {
         rule.setContent {
             CompositionLocalProvider(LocalPointerIconService provides iconService) {
                 Box(
-                    modifier = Modifier
-                        .requiredSize(200.dp)
-                        .border(BorderStroke(2.dp, SolidColor(Color.Red)))
-                        .testTag(parentIconTag)
-                        .pointerHoverIcon(desiredParentIcon, overrideDescendants = false)
+                    modifier =
+                        Modifier.requiredSize(200.dp)
+                            .border(BorderStroke(2.dp, SolidColor(Color.Red)))
+                            .testTag(parentIconTag)
+                            .pointerHoverIcon(desiredParentIcon, overrideDescendants = false)
                 ) {
                     Box(
-                        Modifier
-                            .padding(20.dp)
+                        Modifier.padding(20.dp)
                             .requiredSize(100.dp)
                             .border(BorderStroke(2.dp, SolidColor(Color.Black)))
                             .testTag(childIconTag)
@@ -352,9 +326,7 @@
             }
         }
         // Verify initial state of pointer icon
-        rule.runOnIdle {
-            assertThat(iconService.getIcon()).isEqualTo(desiredDefaultIcon)
-        }
+        rule.runOnIdle { assertThat(iconService.getIcon()).isEqualTo(desiredDefaultIcon) }
         // Verify Child Box's icon is the desired child icon
         verifyIconOnHover(childIconTag, desiredChildIcon)
         // Verify remaining Parent Box's area is the desired parent icon
@@ -362,30 +334,27 @@
     }
 
     /**
-     * Setup:
-     * The hierarchy for this test is setup as:
-     *  Parent Box (custom icon = [PointerIcon.Crosshair], overrideDescendants = TRUE)
-     *    ⤷ Child Box (custom icon = [PointerIcon.Hand], overrideDescendants = FALSE)
+     * Setup: The hierarchy for this test is setup as: Parent Box (custom icon =
+     * [PointerIcon.Crosshair], overrideDescendants = TRUE) ⤷ Child Box (custom icon =
+     * [PointerIcon.Hand], overrideDescendants = FALSE)
      *
-     *  Expected Output:
-     *  Parent Box’s [PointerIcon.Hand] wins for the entire Box area because its
-     *  overrideDescendants = true, so every child underneath it in the hierarchy must respect its
-     *  pointer icon since it's the topmost parent in the hierarchy with overrideDescendants = true.
+     * Expected Output: Parent Box’s [PointerIcon.Hand] wins for the entire Box area because its
+     * overrideDescendants = true, so every child underneath it in the hierarchy must respect its
+     * pointer icon since it's the topmost parent in the hierarchy with overrideDescendants = true.
      */
     @Test
     fun parentChildPartialOverlap_parentOverridesDescendants() {
         rule.setContent {
             CompositionLocalProvider(LocalPointerIconService provides iconService) {
                 Box(
-                    modifier = Modifier
-                        .requiredSize(200.dp)
-                        .border(BorderStroke(2.dp, SolidColor(Color.Red)))
-                        .testTag(parentIconTag)
-                        .pointerHoverIcon(desiredParentIcon, overrideDescendants = true)
+                    modifier =
+                        Modifier.requiredSize(200.dp)
+                            .border(BorderStroke(2.dp, SolidColor(Color.Red)))
+                            .testTag(parentIconTag)
+                            .pointerHoverIcon(desiredParentIcon, overrideDescendants = true)
                 ) {
                     Box(
-                        Modifier
-                            .padding(20.dp)
+                        Modifier.padding(20.dp)
                             .requiredSize(100.dp)
                             .border(BorderStroke(2.dp, SolidColor(Color.Black)))
                             .testTag(childIconTag)
@@ -395,9 +364,7 @@
             }
         }
         // Verify initial state of pointer icon
-        rule.runOnIdle {
-            assertThat(iconService.getIcon()).isEqualTo(desiredDefaultIcon)
-        }
+        rule.runOnIdle { assertThat(iconService.getIcon()).isEqualTo(desiredDefaultIcon) }
         // Verify Parent Box's icon is the desired parent icon
         verifyIconOnHover(parentIconTag, desiredParentIcon)
         // Verify Child Box is respecting Parent Box's icon
@@ -405,30 +372,27 @@
     }
 
     /**
-     * Setup:
-     * The hierarchy for this test is setup as:
-     *  Parent Box (custom icon = [PointerIcon.Crosshair], overrideDescendants = FALSE)
-     *    ⤷ Child Box (custom icon = [PointerIcon.Hand], overrideDescendants = TRUE)
+     * Setup: The hierarchy for this test is setup as: Parent Box (custom icon =
+     * [PointerIcon.Crosshair], overrideDescendants = FALSE) ⤷ Child Box (custom icon =
+     * [PointerIcon.Hand], overrideDescendants = TRUE)
      *
-     *  Expected Output:
-     *  Child Box’s [PointerIcon.Hand] wins for the entire Child Box surface area because it’s lower
-     *  in the hierarchy than Parent Box. If Parent Box's overrideDescendants = false, the Child
-     *  Box takes priority.
+     * Expected Output: Child Box’s [PointerIcon.Hand] wins for the entire Child Box surface area
+     * because it’s lower in the hierarchy than Parent Box. If Parent Box's overrideDescendants =
+     * false, the Child Box takes priority.
      */
     @Test
     fun parentChildPartialOverlap_childOverridesDescendants() {
         rule.setContent {
             CompositionLocalProvider(LocalPointerIconService provides iconService) {
                 Box(
-                    modifier = Modifier
-                        .requiredSize(200.dp)
-                        .border(BorderStroke(2.dp, SolidColor(Color.Red)))
-                        .testTag(parentIconTag)
-                        .pointerHoverIcon(desiredParentIcon, overrideDescendants = false)
+                    modifier =
+                        Modifier.requiredSize(200.dp)
+                            .border(BorderStroke(2.dp, SolidColor(Color.Red)))
+                            .testTag(parentIconTag)
+                            .pointerHoverIcon(desiredParentIcon, overrideDescendants = false)
                 ) {
                     Box(
-                        Modifier
-                            .padding(20.dp)
+                        Modifier.padding(20.dp)
                             .requiredSize(100.dp)
                             .border(BorderStroke(2.dp, SolidColor(Color.Black)))
                             .testTag(childIconTag)
@@ -438,9 +402,7 @@
             }
         }
         // Verify initial state of pointer icon
-        rule.runOnIdle {
-            assertThat(iconService.getIcon()).isEqualTo(desiredDefaultIcon)
-        }
+        rule.runOnIdle { assertThat(iconService.getIcon()).isEqualTo(desiredDefaultIcon) }
         // Verify Child Box's icon is the desired child icon
         verifyIconOnHover(childIconTag, desiredChildIcon)
         // Verify remaining Parent Box's area is the desired parent icon
@@ -448,31 +410,28 @@
     }
 
     /**
-     * Setup:
-     * The hierarchy for this test is setup as:
-     *  Parent Box (custom icon = [PointerIcon.Crosshair], overrideDescendants = TRUE)
-     *    ⤷ Child Box (custom icon = [PointerIcon.Hand], overrideDescendants = TRUE)
+     * Setup: The hierarchy for this test is setup as: Parent Box (custom icon =
+     * [PointerIcon.Crosshair], overrideDescendants = TRUE) ⤷ Child Box (custom icon =
+     * [PointerIcon.Hand], overrideDescendants = TRUE)
      *
-     *  Expected Output:
-     *  Parent Box’s [PointerIcon.Crosshair] wins for the entire Box area because its
-     *  overrideDescendants = true. If multiple locations in the hierarchy set
-     *  overrideDescendants = true, the highest parent in the hierarchy takes precedence (in this
-     *  example, it was Parent Box).
+     * Expected Output: Parent Box’s [PointerIcon.Crosshair] wins for the entire Box area because
+     * its overrideDescendants = true. If multiple locations in the hierarchy set
+     * overrideDescendants = true, the highest parent in the hierarchy takes precedence (in this
+     * example, it was Parent Box).
      */
     @Test
     fun parentChildPartialOverlap_bothOverrideDescendants() {
         rule.setContent {
             CompositionLocalProvider(LocalPointerIconService provides iconService) {
                 Box(
-                    modifier = Modifier
-                        .requiredSize(200.dp)
-                        .border(BorderStroke(2.dp, SolidColor(Color.Red)))
-                        .testTag(parentIconTag)
-                        .pointerHoverIcon(desiredParentIcon, overrideDescendants = true)
+                    modifier =
+                        Modifier.requiredSize(200.dp)
+                            .border(BorderStroke(2.dp, SolidColor(Color.Red)))
+                            .testTag(parentIconTag)
+                            .pointerHoverIcon(desiredParentIcon, overrideDescendants = true)
                 ) {
                     Box(
-                        Modifier
-                            .padding(20.dp)
+                        Modifier.padding(20.dp)
                             .requiredSize(100.dp)
                             .border(BorderStroke(2.dp, SolidColor(Color.Black)))
                             .testTag(childIconTag)
@@ -482,9 +441,7 @@
             }
         }
         // Verify initial state of pointer icon
-        rule.runOnIdle {
-            assertThat(iconService.getIcon()).isEqualTo(desiredDefaultIcon)
-        }
+        rule.runOnIdle { assertThat(iconService.getIcon()).isEqualTo(desiredDefaultIcon) }
         // Verify Parent Box's icon is the desired parent icon
         verifyIconOnHover(parentIconTag, desiredParentIcon)
         // Verify Child Box is respecting Parent Box's icon
@@ -492,24 +449,21 @@
     }
 
     /**
-     * Setup:
-     * The hierarchy for the initial setup of this test is:
-     *  Parent Box (no custom icon)
-     *      ⤷ Child Box (custom icon = [PointerIcon.Text], overrideDescendants = FALSE)
+     * Setup: The hierarchy for the initial setup of this test is: Parent Box (no custom icon) ⤷
+     * Child Box (custom icon = [PointerIcon.Text], overrideDescendants = FALSE)
      *
-     *  After hovering over the center of the screen, the hierarchy under the cursor updates to:
-     *  Parent Box (custom icon = [PointerIcon.Crosshair], overrideDescendants = TRUE)
-     *    ⤷ Child Box (custom icon = [PointerIcon.Text], overrideDescendants = FALSE)
+     * After hovering over the center of the screen, the hierarchy under the cursor updates to:
+     * Parent Box (custom icon = [PointerIcon.Crosshair], overrideDescendants = TRUE) ⤷ Child Box
+     * (custom icon = [PointerIcon.Text], overrideDescendants = FALSE)
      *
-     *  Expected Output:
-     *  Initially, the Child Box's [PointerIcon.Text] should win for its entire surface area
-     *  because it has no competition in the hierarchy for any other custom icons. After the Parent
-     *  Box dynamically has the pointerHoverIcon Modifier added to it, the Parent Box's
-     *  [PointerIcon.Crosshair] should win for the entire surface area of the Parent Box and Child
-     *  Box because the Parent Box has overrideDescendants = true.
+     * Expected Output: Initially, the Child Box's [PointerIcon.Text] should win for its entire
+     * surface area because it has no competition in the hierarchy for any other custom icons. After
+     * the Parent Box dynamically has the pointerHoverIcon Modifier added to it, the Parent Box's
+     * [PointerIcon.Crosshair] should win for the entire surface area of the Parent Box and Child
+     * Box because the Parent Box has overrideDescendants = true.
      *
-     *  Parent Box (output icon = [PointerIcon.Crosshair])
-     *    ⤷ Child Box (output icon = [PointerIcon.Crosshair])
+     * Parent Box (output icon = [PointerIcon.Crosshair]) ⤷ Child Box (output icon =
+     * [PointerIcon.Crosshair])
      */
     @Test
     fun parentChildPartialOverlap_parentModifierDynamicallyAdded() {
@@ -517,21 +471,21 @@
         rule.setContent {
             CompositionLocalProvider(LocalPointerIconService provides iconService) {
                 Box(
-                    modifier = Modifier
-                        .requiredSize(200.dp)
-                        .border(BorderStroke(2.dp, SolidColor(Color.Red)))
-                        .testTag(parentIconTag)
-                        .then(
-                            if (isVisible.value) Modifier.pointerHoverIcon(
-                                desiredParentIcon,
-                                overrideDescendants = true
-                            ) else Modifier
-                        )
-
+                    modifier =
+                        Modifier.requiredSize(200.dp)
+                            .border(BorderStroke(2.dp, SolidColor(Color.Red)))
+                            .testTag(parentIconTag)
+                            .then(
+                                if (isVisible.value)
+                                    Modifier.pointerHoverIcon(
+                                        desiredParentIcon,
+                                        overrideDescendants = true
+                                    )
+                                else Modifier
+                            )
                 ) {
                     Box(
-                        Modifier
-                            .padding(20.dp)
+                        Modifier.padding(20.dp)
                             .requiredSize(150.dp)
                             .border(BorderStroke(2.dp, SolidColor(Color.Black)))
                             .testTag(childIconTag)
@@ -541,17 +495,13 @@
             }
         }
         // Verify initial state of pointer icon
-        rule.runOnIdle {
-            assertThat(iconService.getIcon()).isEqualTo(desiredDefaultIcon)
-        }
+        rule.runOnIdle { assertThat(iconService.getIcon()).isEqualTo(desiredDefaultIcon) }
         // Verify Child Box is the desired child icon
         verifyIconOnHover(childIconTag, desiredChildIcon)
         // Verify Parent Box's icon is the desired default icon
         verifyIconOnHover(parentIconTag, desiredDefaultIcon)
         // Dynamically add the pointerHoverIcon Modifier to the Parent Box
-        rule.runOnIdle {
-            isVisible.value = true
-        }
+        rule.runOnIdle { isVisible.value = true }
         // Verify Parent Box's icon is the desired parent icon
         verifyIconOnHover(parentIconTag, desiredParentIcon)
         // Verify Child Box is respecting Parent Box's icon
@@ -559,24 +509,21 @@
     }
 
     /**
-     * Setup:
-     * The hierarchy for the initial setup of this test is:
-     *  Parent Box (no custom icon)
-     *      ⤷ Child Box (custom icon = [PointerIcon.Text], overrideDescendants = FALSE)
+     * Setup: The hierarchy for the initial setup of this test is: Parent Box (no custom icon) ⤷
+     * Child Box (custom icon = [PointerIcon.Text], overrideDescendants = FALSE)
      *
-     *  After hovering over the center of the screen, the hierarchy under the cursor updates to:
-     *  Parent Box (custom icon = [PointerIcon.Crosshair], overrideDescendants = TRUE)
-     *    ⤷ Child Box (custom icon = [PointerIcon.Text], overrideDescendants = FALSE)
+     * After hovering over the center of the screen, the hierarchy under the cursor updates to:
+     * Parent Box (custom icon = [PointerIcon.Crosshair], overrideDescendants = TRUE) ⤷ Child Box
+     * (custom icon = [PointerIcon.Text], overrideDescendants = FALSE)
      *
-     *  Expected Output:
-     *  Initially, the Child Box's [PointerIcon.Text] should win for its entire surface area
-     *  because it has no competition in the hierarchy for any other custom icons. After the Parent
-     *  Box dynamically has the pointerHoverIcon Modifier added to it, the Parent Box's
-     *  [PointerIcon.Crosshair] should win for the entire surface area of the Parent Box and Child
-     *  Box because the Parent Box has overrideDescendants = true.
+     * Expected Output: Initially, the Child Box's [PointerIcon.Text] should win for its entire
+     * surface area because it has no competition in the hierarchy for any other custom icons. After
+     * the Parent Box dynamically has the pointerHoverIcon Modifier added to it, the Parent Box's
+     * [PointerIcon.Crosshair] should win for the entire surface area of the Parent Box and Child
+     * Box because the Parent Box has overrideDescendants = true.
      *
-     *  Parent Box (output icon = [PointerIcon.Crosshair])
-     *    ⤷ Child Box (output icon = [PointerIcon.Crosshair])
+     * Parent Box (output icon = [PointerIcon.Crosshair]) ⤷ Child Box (output icon =
+     * [PointerIcon.Crosshair])
      */
     @Ignore("b/299482894 - not yet implemented")
     @Test
@@ -585,21 +532,21 @@
         rule.setContent {
             CompositionLocalProvider(LocalPointerIconService provides iconService) {
                 Box(
-                    modifier = Modifier
-                        .requiredSize(200.dp)
-                        .border(BorderStroke(2.dp, SolidColor(Color.Red)))
-                        .testTag(parentIconTag)
-                        .then(
-                            if (isVisible.value) Modifier.pointerHoverIcon(
-                                desiredParentIcon,
-                                overrideDescendants = true
-                            ) else Modifier
-                        )
-
+                    modifier =
+                        Modifier.requiredSize(200.dp)
+                            .border(BorderStroke(2.dp, SolidColor(Color.Red)))
+                            .testTag(parentIconTag)
+                            .then(
+                                if (isVisible.value)
+                                    Modifier.pointerHoverIcon(
+                                        desiredParentIcon,
+                                        overrideDescendants = true
+                                    )
+                                else Modifier
+                            )
                 ) {
                     Box(
-                        Modifier
-                            .padding(20.dp)
+                        Modifier.padding(20.dp)
                             .requiredSize(150.dp)
                             .border(BorderStroke(2.dp, SolidColor(Color.Black)))
                             .testTag(childIconTag)
@@ -609,77 +556,49 @@
             }
         }
         // Verify initial state of pointer icon
-        rule.runOnIdle {
-            assertThat(iconService.getIcon()).isEqualTo(desiredDefaultIcon)
-        }
+        rule.runOnIdle { assertThat(iconService.getIcon()).isEqualTo(desiredDefaultIcon) }
         // Hover over Child Box and verify it has the desired child icon
-        rule.onNodeWithTag(childIconTag).performMouseInput {
-            enter(bottomRight)
-        }
-        rule.runOnIdle {
-            assertThat(iconService.getIcon()).isEqualTo(desiredChildIcon)
-        }
+        rule.onNodeWithTag(childIconTag).performMouseInput { enter(bottomRight) }
+        rule.runOnIdle { assertThat(iconService.getIcon()).isEqualTo(desiredChildIcon) }
         // Move to Parent Box and verify its icon is the desired default icon
-        rule.onNodeWithTag(parentIconTag).performMouseInput {
-            moveTo(bottomRight)
-        }
-        rule.runOnIdle {
-            assertThat(iconService.getIcon()).isEqualTo(desiredDefaultIcon)
-        }
+        rule.onNodeWithTag(parentIconTag).performMouseInput { moveTo(bottomRight) }
+        rule.runOnIdle { assertThat(iconService.getIcon()).isEqualTo(desiredDefaultIcon) }
         // Move back to the Child Box
-        rule.onNodeWithTag(childIconTag).performMouseInput {
-            moveTo(center)
-        }
+        rule.onNodeWithTag(childIconTag).performMouseInput { moveTo(center) }
         // Dynamically add the pointerHoverIcon Modifier to the Parent Box
-        rule.runOnIdle {
-            isVisible.value = true
-        }
+        rule.runOnIdle { isVisible.value = true }
         // Verify the Child Box has updated to respect the desired parent icon
-        rule.runOnIdle {
-            assertThat(iconService.getIcon()).isEqualTo(desiredParentIcon)
-        }
+        rule.runOnIdle { assertThat(iconService.getIcon()).isEqualTo(desiredParentIcon) }
         // Move within the Child Box and verify it is still respecting the desired parent icon
-        rule.onNodeWithTag(childIconTag).performMouseInput {
-            moveTo(bottomRight)
-        }
+        rule.onNodeWithTag(childIconTag).performMouseInput { moveTo(bottomRight) }
         // Move to the Parent Box and verify it also has the desired parent icon
-        rule.onNodeWithTag(parentIconTag).performMouseInput {
-            moveTo(bottomRight)
-        }
-        rule.runOnIdle {
-            assertThat(iconService.getIcon()).isEqualTo(desiredParentIcon)
-        }
+        rule.onNodeWithTag(parentIconTag).performMouseInput { moveTo(bottomRight) }
+        rule.runOnIdle { assertThat(iconService.getIcon()).isEqualTo(desiredParentIcon) }
         // Exit hovering over Parent Box
-        rule.onNodeWithTag(parentIconTag).performMouseInput {
-            exit()
-        }
+        rule.onNodeWithTag(parentIconTag).performMouseInput { exit() }
     }
 
     /**
-     * Setup:
-     * The hierarchy for the initial setup of this test is:
-     *  Parent Box (custom icon = [PointerIcon.Crosshair], overrideDescendants = FALSE)
-     *      ⤷ Child Box (custom icon = [PointerIcon.Text], overrideDescendants = FALSE)
+     * Setup: The hierarchy for the initial setup of this test is: Parent Box (custom icon =
+     * [PointerIcon.Crosshair], overrideDescendants = FALSE) ⤷ Child Box (custom icon =
+     * [PointerIcon.Text], overrideDescendants = FALSE)
      *
-     *  After hovering over the center of the screen, the hierarchy under the cursor updates to:
-     *  Parent Box (custom icon = [PointerIcon.Crosshair], overrideDescendants = TRUE)
-     *    ⤷ Child Box (custom icon = [PointerIcon.Text], overrideDescendants = FALSE)
+     * After hovering over the center of the screen, the hierarchy under the cursor updates to:
+     * Parent Box (custom icon = [PointerIcon.Crosshair], overrideDescendants = TRUE) ⤷ Child Box
+     * (custom icon = [PointerIcon.Text], overrideDescendants = FALSE)
      *
-     *  After several assertions, it reverts back to false in the parent:
-     *  Parent Box (custom icon = [PointerIcon.Crosshair], overrideDescendants = FALSE)
-     *    ⤷ Child Box (custom icon = [PointerIcon.Text], overrideDescendants = FALSE)
+     * After several assertions, it reverts back to false in the parent: Parent Box (custom icon =
+     * [PointerIcon.Crosshair], overrideDescendants = FALSE) ⤷ Child Box (custom icon =
+     * [PointerIcon.Text], overrideDescendants = FALSE)
      *
+     * Expected Output: Initially, the Child Box's [PointerIcon.Text] should win for its entire
+     * surface area because the parent does not override descendants. After the Parent Box
+     * dynamically changes overrideDescendants to true, the Parent Box's [PointerIcon.Crosshair]
+     * should win for the entire surface area of the Parent Box and Child Box because the Parent Box
+     * has overrideDescendants = true.
      *
-     *  Expected Output:
-     *  Initially, the Child Box's [PointerIcon.Text] should win for its entire surface area
-     *  because the parent does not override descendants. After the Parent Box dynamically changes
-     *  overrideDescendants to true, the Parent Box's [PointerIcon.Crosshair] should win for the
-     *  entire surface area of the Parent Box and Child Box because the Parent Box has
-     *  overrideDescendants = true.
-     *
-     *  It should then revert back to Child Box's [PointerIcon.Text] after the Parent Box's
-     *  overrideDescendants is set back to false.
-     *
+     * It should then revert back to Child Box's [PointerIcon.Text] after the Parent Box's
+     * overrideDescendants is set back to false.
      */
     @Test
     fun parentChildPartialOverlap_parentModifierDynamicallyChangedToOverrideWithMoveEvents() {
@@ -687,231 +606,8 @@
         rule.setContent {
             CompositionLocalProvider(LocalPointerIconService provides iconService) {
                 Box(
-                    modifier = Modifier
-                        .requiredSize(200.dp)
-                        .border(BorderStroke(2.dp, SolidColor(Color.Red)))
-                        .testTag(parentIconTag)
-                        .then(
-                            Modifier.pointerHoverIcon(
-                                desiredParentIcon,
-                                overrideDescendants = parentOverrideDescendants
-                            )
-                        )
-
-                ) {
-                    Box(
-                        Modifier
-                            .padding(20.dp)
-                            .requiredSize(150.dp)
-                            .border(BorderStroke(2.dp, SolidColor(Color.Black)))
-                            .testTag(childIconTag)
-                            .pointerHoverIcon(desiredChildIcon, overrideDescendants = false)
-                    )
-                }
-            }
-        }
-        // Verify initial state of pointer icon
-        rule.runOnIdle {
-            assertThat(iconService.getIcon()).isEqualTo(desiredDefaultIcon)
-        }
-        // Hover over Child Box and verify it has the desired child icon
-        rule.onNodeWithTag(childIconTag).performMouseInput {
-            enter(bottomRight)
-        }
-        rule.runOnIdle {
-            assertThat(iconService.getIcon()).isEqualTo(desiredChildIcon)
-        }
-        // Move to Parent Box and verify its icon is the desired parent icon
-        rule.onNodeWithTag(parentIconTag).performMouseInput {
-            moveTo(bottomRight)
-        }
-        rule.runOnIdle {
-            assertThat(iconService.getIcon()).isEqualTo(desiredParentIcon)
-        }
-        // Move back to the Child Box
-        rule.onNodeWithTag(childIconTag).performMouseInput {
-            moveTo(center)
-        }
-
-        rule.runOnIdle {
-            assertThat(iconService.getIcon()).isEqualTo(desiredChildIcon)
-        }
-
-        // Dynamically change the pointerHoverIcon Modifier to the Parent Box to
-        // override descendants.
-        rule.runOnIdle {
-            parentOverrideDescendants = true
-        }
-
-        // Verify the Child Box has updated to respect the desired parent icon
-        rule.runOnIdle {
-            assertThat(iconService.getIcon()).isEqualTo(desiredParentIcon)
-        }
-
-        // Move within the Child Box and verify it is still respecting the desired parent icon
-        rule.onNodeWithTag(childIconTag).performMouseInput {
-            moveTo(bottomRight)
-        }
-
-        // Verify the Child Box has updated to respect the desired parent icon
-        rule.runOnIdle {
-            assertThat(iconService.getIcon()).isEqualTo(desiredParentIcon)
-        }
-
-        // Move to the Parent Box and verify it also has the desired parent icon
-        rule.onNodeWithTag(parentIconTag).performMouseInput {
-            moveTo(bottomRight)
-        }
-        rule.runOnIdle {
-            assertThat(iconService.getIcon()).isEqualTo(desiredParentIcon)
-        }
-
-        // Move within the Child Box and verify it is still respecting the desired parent icon
-        rule.onNodeWithTag(childIconTag).performMouseInput {
-            moveTo(bottomRight)
-        }
-
-        rule.runOnIdle {
-            assertThat(iconService.getIcon()).isEqualTo(desiredParentIcon)
-        }
-
-        // Dynamically change the pointerHoverIcon Modifier to the Parent Box to NOT
-        // override descendants.
-        rule.runOnIdle {
-            parentOverrideDescendants = false
-        }
-
-        // Verify it's changed to child icon
-        rule.runOnIdle {
-            assertThat(iconService.getIcon()).isEqualTo(desiredChildIcon)
-        }
-
-        // Move to Parent Box and verify its icon is the desired parent icon
-        rule.onNodeWithTag(parentIconTag).performMouseInput {
-            moveTo(bottomRight)
-        }
-        rule.runOnIdle {
-            assertThat(iconService.getIcon()).isEqualTo(desiredParentIcon)
-        }
-        // Move back to the Child Box
-        rule.onNodeWithTag(childIconTag).performMouseInput {
-            moveTo(center)
-        }
-
-        rule.runOnIdle {
-            assertThat(iconService.getIcon()).isEqualTo(desiredChildIcon)
-        }
-
-        // Exit hovering over Parent Box
-        rule.onNodeWithTag(parentIconTag).performMouseInput {
-            exit()
-        }
-    }
-
-    /**
-     * Setup:
-     *  The hierarchy for the initial setup of this test is:
-     *  Parent Box (custom icon = [PointerIcon.Crosshair], overrideDescendants = FALSE)
-     *      ⤷ Child Box (custom icon = [PointerIcon.Text], overrideDescendants = FALSE)
-     *
-     *  After hovering over the center of the screen, the hierarchy under the cursor updates to:
-     *  Parent Box (custom icon = [PointerIcon.Crosshair], overrideDescendants = TRUE)
-     *    ⤷ Child Box (custom icon = [PointerIcon.Text], overrideDescendants = FALSE)
-     *
-     *  Expected Output:
-     *  Initially, Child Box’s [PointerIcon.Hand] wins for the entire Child Box surface area because
-     *  there's no parent in its hierarchy that has overrideDescendants = true. Additionally, Parent
-     *  Box's [PointerIcon.Crosshair] would initially win for all remaining surface area of its Box
-     *  that doesn't overlap with Child Box. Once Parent Box's overrideDescendants parameter is
-     *  dynamically updated to true, the Parent Box's icon should win for its entire surface area,
-     *  including within Child Box.
-     */
-    @Test
-    fun parentChildPartialOverlap_parentOverrideDescendantsDynamicallyUpdated() {
-        val parentOverrideState = mutableStateOf(false)
-        rule.setContent {
-            CompositionLocalProvider(LocalPointerIconService provides iconService) {
-                Box(
-                    modifier = Modifier
-                        .requiredSize(200.dp)
-                        .border(BorderStroke(2.dp, SolidColor(Color.Red)))
-                        .testTag(parentIconTag)
-                        .pointerHoverIcon(
-                            desiredParentIcon,
-                            overrideDescendants = parentOverrideState.value
-                        )
-                ) {
-                    Box(
-                        Modifier
-                            .padding(20.dp)
-                            .requiredSize(150.dp)
-                            .border(BorderStroke(2.dp, SolidColor(Color.Black)))
-                            .testTag(childIconTag)
-                            .pointerHoverIcon(desiredChildIcon, overrideDescendants = false)
-                    )
-                }
-            }
-        }
-        // Verify initial state of pointer icon
-        rule.runOnIdle {
-            assertThat(iconService.getIcon()).isEqualTo(desiredDefaultIcon)
-        }
-        // Verify Child Box's icon is the desired child icon
-        verifyIconOnHover(childIconTag, desiredChildIcon)
-        // Verify remaining Parent Box's area is the desired parent icon
-        verifyIconOnHover(parentIconTag, desiredParentIcon)
-        rule.runOnIdle {
-            parentOverrideState.value = true
-        }
-        // Verify Child Box's icon is the desired parent icon
-        verifyIconOnHover(childIconTag, desiredParentIcon)
-        // Verify Parent Box also has the desired parent icon
-        verifyIconOnHover(parentIconTag, desiredParentIcon)
-    }
-
-    /**
-     * Setup:
-     * The hierarchy for the initial setup of this test is:
-     *  Parent Box (custom icon = [PointerIcon.Crosshair], overrideDescendants = FALSE)
-     *      ⤷ Child Box (custom icon = [PointerIcon.Text], overrideDescendants = FALSE)
-     *
-     *  After hovering over various parts of the screen and verify the results, we update the
-     *  parent's overrideDescendants to true:
-     *  Parent Box (custom icon = [PointerIcon.Crosshair], overrideDescendants = TRUE)
-     *    ⤷ Child Box (custom icon = [PointerIcon.Text], overrideDescendants = FALSE)
-     *
-     *  After several assertions, it reverts back to false in the parent:
-     *  Parent Box (custom icon = [PointerIcon.Crosshair], overrideDescendants = FALSE)
-     *    ⤷ Child Box (custom icon = [PointerIcon.Text], overrideDescendants = FALSE)
-     *
-     *
-     *  Expected Output:
-     *  Initially, the Child Box's [PointerIcon.Text] should win for its entire surface area
-     *  because the parent does not override descendants. After the Parent Box dynamically changes
-     *  overrideDescendants to true, the Parent Box's [PointerIcon.Crosshair] should win for the
-     *  child's surface area within the Parent Box BUT NOT the portion of the Child Box that is
-     *  outside the Parent Box.
-     *
-     *  It should then revert back to Child Box's [PointerIcon.Text] (in all scenarios) after the
-     *  Parent Box's overrideDescendants is set back to false.
-     *
-     */
-    @Test
-    fun parentChildPartialOverlapAndExtendsBeyondParent_dynamicOverrideDescendants() {
-        var parentOverrideDescendants by mutableStateOf(false)
-        rule.setContent {
-            CompositionLocalProvider(LocalPointerIconService provides iconService) {
-
-                Box(
-                    modifier = Modifier
-                        .requiredSize(300.dp)
-                        .border(BorderStroke(2.dp, SolidColor(Color.Green)))
-
-                ) {
-                    // This child extends beyond the borders of the parent (enabling this test)
-                    Box(
-                        modifier = Modifier
-                            .size(150.dp)
+                    modifier =
+                        Modifier.requiredSize(200.dp)
                             .border(BorderStroke(2.dp, SolidColor(Color.Red)))
                             .testTag(parentIconTag)
                             .then(
@@ -920,11 +616,173 @@
                                     overrideDescendants = parentOverrideDescendants
                                 )
                             )
+                ) {
+                    Box(
+                        Modifier.padding(20.dp)
+                            .requiredSize(150.dp)
+                            .border(BorderStroke(2.dp, SolidColor(Color.Black)))
+                            .testTag(childIconTag)
+                            .pointerHoverIcon(desiredChildIcon, overrideDescendants = false)
+                    )
+                }
+            }
+        }
+        // Verify initial state of pointer icon
+        rule.runOnIdle { assertThat(iconService.getIcon()).isEqualTo(desiredDefaultIcon) }
+        // Hover over Child Box and verify it has the desired child icon
+        rule.onNodeWithTag(childIconTag).performMouseInput { enter(bottomRight) }
+        rule.runOnIdle { assertThat(iconService.getIcon()).isEqualTo(desiredChildIcon) }
+        // Move to Parent Box and verify its icon is the desired parent icon
+        rule.onNodeWithTag(parentIconTag).performMouseInput { moveTo(bottomRight) }
+        rule.runOnIdle { assertThat(iconService.getIcon()).isEqualTo(desiredParentIcon) }
+        // Move back to the Child Box
+        rule.onNodeWithTag(childIconTag).performMouseInput { moveTo(center) }
 
+        rule.runOnIdle { assertThat(iconService.getIcon()).isEqualTo(desiredChildIcon) }
+
+        // Dynamically change the pointerHoverIcon Modifier to the Parent Box to
+        // override descendants.
+        rule.runOnIdle { parentOverrideDescendants = true }
+
+        // Verify the Child Box has updated to respect the desired parent icon
+        rule.runOnIdle { assertThat(iconService.getIcon()).isEqualTo(desiredParentIcon) }
+
+        // Move within the Child Box and verify it is still respecting the desired parent icon
+        rule.onNodeWithTag(childIconTag).performMouseInput { moveTo(bottomRight) }
+
+        // Verify the Child Box has updated to respect the desired parent icon
+        rule.runOnIdle { assertThat(iconService.getIcon()).isEqualTo(desiredParentIcon) }
+
+        // Move to the Parent Box and verify it also has the desired parent icon
+        rule.onNodeWithTag(parentIconTag).performMouseInput { moveTo(bottomRight) }
+        rule.runOnIdle { assertThat(iconService.getIcon()).isEqualTo(desiredParentIcon) }
+
+        // Move within the Child Box and verify it is still respecting the desired parent icon
+        rule.onNodeWithTag(childIconTag).performMouseInput { moveTo(bottomRight) }
+
+        rule.runOnIdle { assertThat(iconService.getIcon()).isEqualTo(desiredParentIcon) }
+
+        // Dynamically change the pointerHoverIcon Modifier to the Parent Box to NOT
+        // override descendants.
+        rule.runOnIdle { parentOverrideDescendants = false }
+
+        // Verify it's changed to child icon
+        rule.runOnIdle { assertThat(iconService.getIcon()).isEqualTo(desiredChildIcon) }
+
+        // Move to Parent Box and verify its icon is the desired parent icon
+        rule.onNodeWithTag(parentIconTag).performMouseInput { moveTo(bottomRight) }
+        rule.runOnIdle { assertThat(iconService.getIcon()).isEqualTo(desiredParentIcon) }
+        // Move back to the Child Box
+        rule.onNodeWithTag(childIconTag).performMouseInput { moveTo(center) }
+
+        rule.runOnIdle { assertThat(iconService.getIcon()).isEqualTo(desiredChildIcon) }
+
+        // Exit hovering over Parent Box
+        rule.onNodeWithTag(parentIconTag).performMouseInput { exit() }
+    }
+
+    /**
+     * Setup: The hierarchy for the initial setup of this test is: Parent Box (custom icon =
+     * [PointerIcon.Crosshair], overrideDescendants = FALSE) ⤷ Child Box (custom icon =
+     * [PointerIcon.Text], overrideDescendants = FALSE)
+     *
+     * After hovering over the center of the screen, the hierarchy under the cursor updates to:
+     * Parent Box (custom icon = [PointerIcon.Crosshair], overrideDescendants = TRUE) ⤷ Child Box
+     * (custom icon = [PointerIcon.Text], overrideDescendants = FALSE)
+     *
+     * Expected Output: Initially, Child Box’s [PointerIcon.Hand] wins for the entire Child Box
+     * surface area because there's no parent in its hierarchy that has overrideDescendants = true.
+     * Additionally, Parent Box's [PointerIcon.Crosshair] would initially win for all remaining
+     * surface area of its Box that doesn't overlap with Child Box. Once Parent Box's
+     * overrideDescendants parameter is dynamically updated to true, the Parent Box's icon should
+     * win for its entire surface area, including within Child Box.
+     */
+    @Test
+    fun parentChildPartialOverlap_parentOverrideDescendantsDynamicallyUpdated() {
+        val parentOverrideState = mutableStateOf(false)
+        rule.setContent {
+            CompositionLocalProvider(LocalPointerIconService provides iconService) {
+                Box(
+                    modifier =
+                        Modifier.requiredSize(200.dp)
+                            .border(BorderStroke(2.dp, SolidColor(Color.Red)))
+                            .testTag(parentIconTag)
+                            .pointerHoverIcon(
+                                desiredParentIcon,
+                                overrideDescendants = parentOverrideState.value
+                            )
+                ) {
+                    Box(
+                        Modifier.padding(20.dp)
+                            .requiredSize(150.dp)
+                            .border(BorderStroke(2.dp, SolidColor(Color.Black)))
+                            .testTag(childIconTag)
+                            .pointerHoverIcon(desiredChildIcon, overrideDescendants = false)
+                    )
+                }
+            }
+        }
+        // Verify initial state of pointer icon
+        rule.runOnIdle { assertThat(iconService.getIcon()).isEqualTo(desiredDefaultIcon) }
+        // Verify Child Box's icon is the desired child icon
+        verifyIconOnHover(childIconTag, desiredChildIcon)
+        // Verify remaining Parent Box's area is the desired parent icon
+        verifyIconOnHover(parentIconTag, desiredParentIcon)
+        rule.runOnIdle { parentOverrideState.value = true }
+        // Verify Child Box's icon is the desired parent icon
+        verifyIconOnHover(childIconTag, desiredParentIcon)
+        // Verify Parent Box also has the desired parent icon
+        verifyIconOnHover(parentIconTag, desiredParentIcon)
+    }
+
+    /**
+     * Setup: The hierarchy for the initial setup of this test is: Parent Box (custom icon =
+     * [PointerIcon.Crosshair], overrideDescendants = FALSE) ⤷ Child Box (custom icon =
+     * [PointerIcon.Text], overrideDescendants = FALSE)
+     *
+     * After hovering over various parts of the screen and verify the results, we update the
+     * parent's overrideDescendants to true: Parent Box (custom icon = [PointerIcon.Crosshair],
+     * overrideDescendants = TRUE) ⤷ Child Box (custom icon = [PointerIcon.Text],
+     * overrideDescendants = FALSE)
+     *
+     * After several assertions, it reverts back to false in the parent: Parent Box (custom icon =
+     * [PointerIcon.Crosshair], overrideDescendants = FALSE) ⤷ Child Box (custom icon =
+     * [PointerIcon.Text], overrideDescendants = FALSE)
+     *
+     * Expected Output: Initially, the Child Box's [PointerIcon.Text] should win for its entire
+     * surface area because the parent does not override descendants. After the Parent Box
+     * dynamically changes overrideDescendants to true, the Parent Box's [PointerIcon.Crosshair]
+     * should win for the child's surface area within the Parent Box BUT NOT the portion of the
+     * Child Box that is outside the Parent Box.
+     *
+     * It should then revert back to Child Box's [PointerIcon.Text] (in all scenarios) after the
+     * Parent Box's overrideDescendants is set back to false.
+     */
+    @Test
+    fun parentChildPartialOverlapAndExtendsBeyondParent_dynamicOverrideDescendants() {
+        var parentOverrideDescendants by mutableStateOf(false)
+        rule.setContent {
+            CompositionLocalProvider(LocalPointerIconService provides iconService) {
+                Box(
+                    modifier =
+                        Modifier.requiredSize(300.dp)
+                            .border(BorderStroke(2.dp, SolidColor(Color.Green)))
+                ) {
+                    // This child extends beyond the borders of the parent (enabling this test)
+                    Box(
+                        modifier =
+                            Modifier.size(150.dp)
+                                .border(BorderStroke(2.dp, SolidColor(Color.Red)))
+                                .testTag(parentIconTag)
+                                .then(
+                                    Modifier.pointerHoverIcon(
+                                        desiredParentIcon,
+                                        overrideDescendants = parentOverrideDescendants
+                                    )
+                                )
                     ) {
                         Box(
-                            Modifier
-                                .padding(20.dp)
+                            Modifier.padding(20.dp)
                                 .offset(100.dp)
                                 .width(300.dp)
                                 .height(100.dp)
@@ -937,144 +795,91 @@
             }
         }
         // Verify initial state of pointer icon
-        rule.runOnIdle {
-            assertThat(iconService.getIcon()).isEqualTo(desiredDefaultIcon)
-        }
+        rule.runOnIdle { assertThat(iconService.getIcon()).isEqualTo(desiredDefaultIcon) }
         // Hover over Child Box and verify it has the desired child icon (outside parent)
-        rule.onNodeWithTag(childIconTag).performMouseInput {
-            enter(bottomRight)
-        }
-        rule.runOnIdle {
-            assertThat(iconService.getIcon()).isEqualTo(desiredChildIcon)
-        }
+        rule.onNodeWithTag(childIconTag).performMouseInput { enter(bottomRight) }
+        rule.runOnIdle { assertThat(iconService.getIcon()).isEqualTo(desiredChildIcon) }
 
         // Hover over Child Box and verify it has the desired child icon (inside parent)
-        rule.onNodeWithTag(childIconTag).performMouseInput {
-            moveTo(bottomLeft)
-        }
-        rule.runOnIdle {
-            assertThat(iconService.getIcon()).isEqualTo(desiredChildIcon)
-        }
+        rule.onNodeWithTag(childIconTag).performMouseInput { moveTo(bottomLeft) }
+        rule.runOnIdle { assertThat(iconService.getIcon()).isEqualTo(desiredChildIcon) }
 
         // Move to Parent Box and verify its icon is the desired parent icon
-        rule.onNodeWithTag(parentIconTag).performMouseInput {
-            moveTo(bottomRight)
-        }
-        rule.runOnIdle {
-            assertThat(iconService.getIcon()).isEqualTo(desiredParentIcon)
-        }
+        rule.onNodeWithTag(parentIconTag).performMouseInput { moveTo(bottomRight) }
+        rule.runOnIdle { assertThat(iconService.getIcon()).isEqualTo(desiredParentIcon) }
         // Move back to the Child Box (portion inside parent)
-        rule.onNodeWithTag(childIconTag).performMouseInput {
-            moveTo(bottomLeft)
-        }
+        rule.onNodeWithTag(childIconTag).performMouseInput { moveTo(bottomLeft) }
 
-        rule.runOnIdle {
-            assertThat(iconService.getIcon()).isEqualTo(desiredChildIcon)
-        }
+        rule.runOnIdle { assertThat(iconService.getIcon()).isEqualTo(desiredChildIcon) }
 
         // Dynamically change the pointerHoverIcon Modifier of the Parent Box to
         // override descendants.
-        rule.runOnIdle {
-            parentOverrideDescendants = true
-        }
+        rule.runOnIdle { parentOverrideDescendants = true }
 
         // Verify the Child Box has updated to respect the desired parent icon
-        rule.runOnIdle {
-            assertThat(iconService.getIcon()).isEqualTo(desiredParentIcon)
-        }
+        rule.runOnIdle { assertThat(iconService.getIcon()).isEqualTo(desiredParentIcon) }
 
         // Hover over Child Box and verify it has the desired child icon (outside parent)
-        rule.onNodeWithTag(childIconTag).performMouseInput {
-            moveTo(bottomRight)
-        }
+        rule.onNodeWithTag(childIconTag).performMouseInput { moveTo(bottomRight) }
 
-        rule.runOnIdle {
-            assertThat(iconService.getIcon()).isEqualTo(desiredChildIcon)
-        }
+        rule.runOnIdle { assertThat(iconService.getIcon()).isEqualTo(desiredChildIcon) }
 
         // Move to the Parent Box and verify it also has the desired parent icon
-        rule.onNodeWithTag(parentIconTag).performMouseInput {
-            moveTo(bottomRight)
-        }
-        rule.runOnIdle {
-            assertThat(iconService.getIcon()).isEqualTo(desiredParentIcon)
-        }
+        rule.onNodeWithTag(parentIconTag).performMouseInput { moveTo(bottomRight) }
+        rule.runOnIdle { assertThat(iconService.getIcon()).isEqualTo(desiredParentIcon) }
 
         // Move within the Child Box (portion inside parent) and verify it is still
         // respecting the desired parent icon
-        rule.onNodeWithTag(childIconTag).performMouseInput {
-            moveTo(bottomLeft)
-        }
+        rule.onNodeWithTag(childIconTag).performMouseInput { moveTo(bottomLeft) }
 
-        rule.runOnIdle {
-            assertThat(iconService.getIcon()).isEqualTo(desiredParentIcon)
-        }
+        rule.runOnIdle { assertThat(iconService.getIcon()).isEqualTo(desiredParentIcon) }
 
         // Dynamically change the pointerHoverIcon Modifier of the Parent Box to NOT
         // override descendants.
-        rule.runOnIdle {
-            parentOverrideDescendants = false
-        }
+        rule.runOnIdle { parentOverrideDescendants = false }
 
         // Verify it's changed to child icon
-        rule.runOnIdle {
-            assertThat(iconService.getIcon()).isEqualTo(desiredChildIcon)
-        }
+        rule.runOnIdle { assertThat(iconService.getIcon()).isEqualTo(desiredChildIcon) }
 
         // Move to Parent Box and verify its icon is the desired parent icon
-        rule.onNodeWithTag(parentIconTag).performMouseInput {
-            moveTo(bottomRight)
-        }
-        rule.runOnIdle {
-            assertThat(iconService.getIcon()).isEqualTo(desiredParentIcon)
-        }
+        rule.onNodeWithTag(parentIconTag).performMouseInput { moveTo(bottomRight) }
+        rule.runOnIdle { assertThat(iconService.getIcon()).isEqualTo(desiredParentIcon) }
         // Move back to the Child Box
-        rule.onNodeWithTag(childIconTag).performMouseInput {
-            moveTo(bottomLeft)
-        }
+        rule.onNodeWithTag(childIconTag).performMouseInput { moveTo(bottomLeft) }
 
-        rule.runOnIdle {
-            assertThat(iconService.getIcon()).isEqualTo(desiredChildIcon)
-        }
+        rule.runOnIdle { assertThat(iconService.getIcon()).isEqualTo(desiredChildIcon) }
 
         // Exit hovering over Parent Box
-        rule.onNodeWithTag(parentIconTag).performMouseInput {
-            exit()
-        }
+        rule.onNodeWithTag(parentIconTag).performMouseInput { exit() }
     }
 
     /**
-     * Setup:
-     * The hierarchy for this test is setup as:
-     *  Parent Box (no custom icon set)
-     *    ⤷ ChildA Box (custom icon = [PointerIcon.Text], overrideDescendants = FALSE)
-     *    ⤷ ChildB Box (custom icon = [PointerIcon.Hand], overrideDescendants = FALSE)
+     * Setup: The hierarchy for this test is setup as: Parent Box (no custom icon set) ⤷ ChildA Box
+     * (custom icon = [PointerIcon.Text], overrideDescendants = FALSE) ⤷ ChildB Box (custom icon =
+     * [PointerIcon.Hand], overrideDescendants = FALSE)
      *
-     *  Expected Output:
-     *  ChildA Box’s [PointerIcon.Text] wins for the entire surface area of ChildA's Box. ChildB
-     *  Box's [PointerIcon.Hand] wins for the entire surface area of ChildB's Box.
-     *  [PointerIcon.Default] wins for the remainder of the surface area of Parent Box that's not
-     *  covered by ChildA Box or ChildB Box. In this example, there's no competition for pointer
-     *  icons because the parent has no icon set and neither ChildA or ChildB Boxes overlap.
+     * Expected Output: ChildA Box’s [PointerIcon.Text] wins for the entire surface area of ChildA's
+     * Box. ChildB Box's [PointerIcon.Hand] wins for the entire surface area of ChildB's Box.
+     * [PointerIcon.Default] wins for the remainder of the surface area of Parent Box that's not
+     * covered by ChildA Box or ChildB Box. In this example, there's no competition for pointer
+     * icons because the parent has no icon set and neither ChildA or ChildB Boxes overlap.
      *
-     *  Parent Box (output icon = [PointerIcon.Default])
-     *    ⤷ Child Box (output icon = [PointerIcon.Text])
-     *    ⤷ Child Box (output icon = [PointerIcon.Hand])
+     * Parent Box (output icon = [PointerIcon.Default]) ⤷ Child Box (output icon =
+     * [PointerIcon.Text]) ⤷ Child Box (output icon = [PointerIcon.Hand])
      */
     @Test
     fun NonOverlappingSiblings_noOverrideDescendants() {
         rule.setContent {
             CompositionLocalProvider(LocalPointerIconService provides iconService) {
                 Box(
-                    modifier = Modifier
-                        .requiredSize(200.dp)
-                        .border(BorderStroke(2.dp, SolidColor(Color.Red)))
-                        .testTag(parentIconTag)
+                    modifier =
+                        Modifier.requiredSize(200.dp)
+                            .border(BorderStroke(2.dp, SolidColor(Color.Red)))
+                            .testTag(parentIconTag)
                 ) {
                     Column {
                         Box(
-                            Modifier
-                                .padding(20.dp)
+                            Modifier.padding(20.dp)
                                 .requiredSize(50.dp)
                                 .border(BorderStroke(2.dp, SolidColor(Color.Black)))
                                 .testTag(childIconTag)
@@ -1082,8 +887,7 @@
                         )
                         // Referencing grandchild tag/icon for ChildB in this test
                         Box(
-                            Modifier
-                                .padding(40.dp)
+                            Modifier.padding(40.dp)
                                 .requiredSize(50.dp)
                                 .border(BorderStroke(2.dp, SolidColor(Color.Blue)))
                                 .testTag(grandchildIconTag)
@@ -1097,9 +901,7 @@
             }
         }
         // Verify initial state of pointer icon
-        rule.runOnIdle {
-            assertThat(iconService.getIcon()).isEqualTo(desiredDefaultIcon)
-        }
+        rule.runOnIdle { assertThat(iconService.getIcon()).isEqualTo(desiredDefaultIcon) }
         // Verify ChildA Box's icon is the desired ChildA icon
         verifyIconOnHover(childIconTag, desiredChildIcon)
         // Verify ChildB Box's icon is the desired ChildB icon
@@ -1109,38 +911,33 @@
     }
 
     /**
-     * Setup:
-     * The hierarchy for this test is setup as:
-     *  Parent Box (no custom icon set)
-     *    ⤷ ChildA Box (custom icon = [PointerIcon.Text], overrideDescendants = TRUE)
-     *    ⤷ ChildB Box (custom icon = [PointerIcon.Hand], overrideDescendants = FALSE)
+     * Setup: The hierarchy for this test is setup as: Parent Box (no custom icon set) ⤷ ChildA Box
+     * (custom icon = [PointerIcon.Text], overrideDescendants = TRUE) ⤷ ChildB Box (custom icon =
+     * [PointerIcon.Hand], overrideDescendants = FALSE)
      *
-     *  Expected Output:
-     *  ChildA Box’s [PointerIcon.Text] wins for the entire surface area of ChildA's Box. ChildB
-     *  Box's [PointerIcon.Hand] wins for the entire surface area of ChildB's Box.
-     *  [PointerIcon.Default] wins for the remainder of the surface area of Parent Box that's not
-     *  covered by ChildA Box or ChildB Box. In this example, it doesn't matter whether ChildA Box's
-     *  overrideDescendants = true or false because there's no competition for pointer icons in
-     *  this example.
+     * Expected Output: ChildA Box’s [PointerIcon.Text] wins for the entire surface area of ChildA's
+     * Box. ChildB Box's [PointerIcon.Hand] wins for the entire surface area of ChildB's Box.
+     * [PointerIcon.Default] wins for the remainder of the surface area of Parent Box that's not
+     * covered by ChildA Box or ChildB Box. In this example, it doesn't matter whether ChildA Box's
+     * overrideDescendants = true or false because there's no competition for pointer icons in this
+     * example.
      *
-     *  Parent Box (output icon = [PointerIcon.Default])
-     *    ⤷ Child Box (output icon = [PointerIcon.Text])
-     *    ⤷ Child Box (output icon = [PointerIcon.Hand])
+     * Parent Box (output icon = [PointerIcon.Default]) ⤷ Child Box (output icon =
+     * [PointerIcon.Text]) ⤷ Child Box (output icon = [PointerIcon.Hand])
      */
     @Test
     fun NonOverlappingSiblings_firstChildOverridesDescendants() {
         rule.setContent {
             CompositionLocalProvider(LocalPointerIconService provides iconService) {
                 Box(
-                    modifier = Modifier
-                        .requiredSize(200.dp)
-                        .border(BorderStroke(2.dp, SolidColor(Color.Red)))
-                        .testTag(parentIconTag)
+                    modifier =
+                        Modifier.requiredSize(200.dp)
+                            .border(BorderStroke(2.dp, SolidColor(Color.Red)))
+                            .testTag(parentIconTag)
                 ) {
                     Column {
                         Box(
-                            Modifier
-                                .padding(20.dp)
+                            Modifier.padding(20.dp)
                                 .requiredSize(50.dp)
                                 .border(BorderStroke(2.dp, SolidColor(Color.Black)))
                                 .testTag(childIconTag)
@@ -1148,8 +945,7 @@
                         )
                         // Referencing grandchild tag/icon for ChildB in this test
                         Box(
-                            Modifier
-                                .padding(40.dp)
+                            Modifier.padding(40.dp)
                                 .requiredSize(50.dp)
                                 .border(BorderStroke(2.dp, SolidColor(Color.Blue)))
                                 .testTag(grandchildIconTag)
@@ -1163,9 +959,7 @@
             }
         }
         // Verify initial state of pointer icon
-        rule.runOnIdle {
-            assertThat(iconService.getIcon()).isEqualTo(desiredDefaultIcon)
-        }
+        rule.runOnIdle { assertThat(iconService.getIcon()).isEqualTo(desiredDefaultIcon) }
         // Verify ChildA Box's icon is the desired ChildA icon
         verifyIconOnHover(childIconTag, desiredChildIcon)
         // Verify ChildB Box's icon is the desired ChildB icon
@@ -1175,38 +969,33 @@
     }
 
     /**
-     * Setup:
-     * The hierarchy for this test is setup as:
-     *  Parent Box (no custom icon set)
-     *    ⤷ ChildA Box (custom icon = [PointerIcon.Text], overrideDescendants = FALSE)
-     *    ⤷ ChildB Box (custom icon = [PointerIcon.Hand], overrideDescendants = TRUE)
+     * Setup: The hierarchy for this test is setup as: Parent Box (no custom icon set) ⤷ ChildA Box
+     * (custom icon = [PointerIcon.Text], overrideDescendants = FALSE) ⤷ ChildB Box (custom icon =
+     * [PointerIcon.Hand], overrideDescendants = TRUE)
      *
-     *  Expected Output:
-     *  ChildA Box’s [PointerIcon.Text] wins for the entire surface area of ChildA's Box. ChildB
-     *  Box's [PointerIcon.Hand] wins for the entire surface area of ChildB's Box.
-     *  [PointerIcon.Default] wins for the remainder of the surface area of Parent Box that's not
-     *  covered by ChildA Box or ChildB Box. In this example, it doesn't matter whether ChildB Box's
-     *  overrideDescendants = true or false because there's no competition for pointer icons in
-     *  this example.
+     * Expected Output: ChildA Box’s [PointerIcon.Text] wins for the entire surface area of ChildA's
+     * Box. ChildB Box's [PointerIcon.Hand] wins for the entire surface area of ChildB's Box.
+     * [PointerIcon.Default] wins for the remainder of the surface area of Parent Box that's not
+     * covered by ChildA Box or ChildB Box. In this example, it doesn't matter whether ChildB Box's
+     * overrideDescendants = true or false because there's no competition for pointer icons in this
+     * example.
      *
-     *  Parent Box (output icon = [PointerIcon.Default])
-     *    ⤷ Child Box (output icon = [PointerIcon.Text])
-     *    ⤷ Child Box (output icon = [PointerIcon.Hand])
+     * Parent Box (output icon = [PointerIcon.Default]) ⤷ Child Box (output icon =
+     * [PointerIcon.Text]) ⤷ Child Box (output icon = [PointerIcon.Hand])
      */
     @Test
     fun NonOverlappingSiblings_secondChildOverridesDescendants() {
         rule.setContent {
             CompositionLocalProvider(LocalPointerIconService provides iconService) {
                 Box(
-                    modifier = Modifier
-                        .requiredSize(200.dp)
-                        .border(BorderStroke(2.dp, SolidColor(Color.Red)))
-                        .testTag(parentIconTag)
+                    modifier =
+                        Modifier.requiredSize(200.dp)
+                            .border(BorderStroke(2.dp, SolidColor(Color.Red)))
+                            .testTag(parentIconTag)
                 ) {
                     Column {
                         Box(
-                            Modifier
-                                .padding(20.dp)
+                            Modifier.padding(20.dp)
                                 .requiredSize(50.dp)
                                 .border(BorderStroke(2.dp, SolidColor(Color.Black)))
                                 .testTag(childIconTag)
@@ -1214,8 +1003,7 @@
                         )
                         // Referencing grandchild tag/icon for ChildB in this test
                         Box(
-                            Modifier
-                                .padding(40.dp)
+                            Modifier.padding(40.dp)
                                 .requiredSize(50.dp)
                                 .border(BorderStroke(2.dp, SolidColor(Color.Blue)))
                                 .testTag(grandchildIconTag)
@@ -1226,9 +1014,7 @@
             }
         }
         // Verify initial state of pointer icon
-        rule.runOnIdle {
-            assertThat(iconService.getIcon()).isEqualTo(desiredDefaultIcon)
-        }
+        rule.runOnIdle { assertThat(iconService.getIcon()).isEqualTo(desiredDefaultIcon) }
         // Verify ChildA Box's icon is the desired ChildA icon
         verifyIconOnHover(childIconTag, desiredChildIcon)
         // Verify ChildB Box's icon is the desired ChildB icon
@@ -1238,38 +1024,33 @@
     }
 
     /**
-     * Setup:
-     * The hierarchy for this test is setup as:
-     *  Parent Box (no custom icon set)
-     *    ⤷ ChildA Box (custom icon = [PointerIcon.Text], overrideDescendants = TRUE)
-     *    ⤷ ChildB Box (custom icon = [PointerIcon.Hand], overrideDescendants = TRUE)
+     * Setup: The hierarchy for this test is setup as: Parent Box (no custom icon set) ⤷ ChildA Box
+     * (custom icon = [PointerIcon.Text], overrideDescendants = TRUE) ⤷ ChildB Box (custom icon =
+     * [PointerIcon.Hand], overrideDescendants = TRUE)
      *
-     *  Expected Output:
-     *  ChildA Box’s [PointerIcon.Text] wins for the entire surface area of ChildA's Box. ChildB
-     *  Box's [PointerIcon.Hand] wins for the entire surface area of ChildB's Box.
-     *  [PointerIcon.Default] wins for the remainder of the surface area of Parent Box that's not
-     *  covered by ChildA Box or ChildB Box. In this example, it doesn't matter whether ChildA Box
-     *  and ChildB Box's overrideDescendants = true or false because there's no competition for
-     *  pointer icons in this example.
+     * Expected Output: ChildA Box’s [PointerIcon.Text] wins for the entire surface area of ChildA's
+     * Box. ChildB Box's [PointerIcon.Hand] wins for the entire surface area of ChildB's Box.
+     * [PointerIcon.Default] wins for the remainder of the surface area of Parent Box that's not
+     * covered by ChildA Box or ChildB Box. In this example, it doesn't matter whether ChildA Box
+     * and ChildB Box's overrideDescendants = true or false because there's no competition for
+     * pointer icons in this example.
      *
-     *  Parent Box (output icon = [PointerIcon.Default])
-     *    ⤷ ChildA Box (output icon = [PointerIcon.Text])
-     *    ⤷ ChildB Box (output icon = [PointerIcon.Hand])
+     * Parent Box (output icon = [PointerIcon.Default]) ⤷ ChildA Box (output icon =
+     * [PointerIcon.Text]) ⤷ ChildB Box (output icon = [PointerIcon.Hand])
      */
     @Test
     fun NonOverlappingSiblings_bothOverrideDescendants() {
         rule.setContent {
             CompositionLocalProvider(LocalPointerIconService provides iconService) {
                 Box(
-                    modifier = Modifier
-                        .requiredSize(200.dp)
-                        .border(BorderStroke(2.dp, SolidColor(Color.Red)))
-                        .testTag(parentIconTag)
+                    modifier =
+                        Modifier.requiredSize(200.dp)
+                            .border(BorderStroke(2.dp, SolidColor(Color.Red)))
+                            .testTag(parentIconTag)
                 ) {
                     Column {
                         Box(
-                            Modifier
-                                .padding(20.dp)
+                            Modifier.padding(20.dp)
                                 .requiredSize(50.dp)
                                 .border(BorderStroke(2.dp, SolidColor(Color.Black)))
                                 .testTag(childIconTag)
@@ -1277,8 +1058,7 @@
                         )
                         // Referencing grandchild tag/icon for ChildB in this test
                         Box(
-                            Modifier
-                                .padding(40.dp)
+                            Modifier.padding(40.dp)
                                 .requiredSize(50.dp)
                                 .border(BorderStroke(2.dp, SolidColor(Color.Blue)))
                                 .testTag(grandchildIconTag)
@@ -1289,9 +1069,7 @@
             }
         }
         // Verify initial state of pointer icon
-        rule.runOnIdle {
-            assertThat(iconService.getIcon()).isEqualTo(desiredDefaultIcon)
-        }
+        rule.runOnIdle { assertThat(iconService.getIcon()).isEqualTo(desiredDefaultIcon) }
         // Verify ChildA Box's icon is the desired ChildA icon
         verifyIconOnHover(childIconTag, desiredChildIcon)
         // Verify ChildB Box's icon is the desired ChildB icon
@@ -1301,36 +1079,31 @@
     }
 
     /**
-     * Setup:
-     * The hierarchy for this test is setup as:
-     *  Parent Box (no custom icon set)
-     *    ⤷ ChildA Box (custom icon = [PointerIcon.Text], overrideDescendants = FALSE)
-     *    ⤷ ChildB Box (custom icon = [PointerIcon.Hand], overrideDescendants = FALSE) where
-     *        ChildB Box's surface area overlaps with its sibling, ChildA, within the Parent Box
+     * Setup: The hierarchy for this test is setup as: Parent Box (no custom icon set) ⤷ ChildA Box
+     * (custom icon = [PointerIcon.Text], overrideDescendants = FALSE) ⤷ ChildB Box (custom icon =
+     * [PointerIcon.Hand], overrideDescendants = FALSE) where ChildB Box's surface area overlaps
+     * with its sibling, ChildA, within the Parent Box
      *
-     *  Expected Output:
-     *  ChildB Box's [PointerIcon.Hand] wins for the entire surface area of ChildB's Box.
-     *  ChildA Box's [PointerIcon.Text] wins for the remaining surface area of ChildA Box not
-     *  covered by ChildB Box. [PointerIcon.Default] wins for the remainder of the surface area of
-     *  Parent Box that's not covered by ChildA Box or ChildB Box.
+     * Expected Output: ChildB Box's [PointerIcon.Hand] wins for the entire surface area of ChildB's
+     * Box. ChildA Box's [PointerIcon.Text] wins for the remaining surface area of ChildA Box not
+     * covered by ChildB Box. [PointerIcon.Default] wins for the remainder of the surface area of
+     * Parent Box that's not covered by ChildA Box or ChildB Box.
      *
-     *  Parent Box (output icon = [PointerIcon.Default])
-     *    ⤷ ChildA Box (output icon = [PointerIcon.Text])
-     *    ⤷ ChildB Box (output icon = [PointerIcon.Hand])
+     * Parent Box (output icon = [PointerIcon.Default]) ⤷ ChildA Box (output icon =
+     * [PointerIcon.Text]) ⤷ ChildB Box (output icon = [PointerIcon.Hand])
      */
     @Test
     fun OverlappingSiblings_noOverrideDescendants() {
         rule.setContent {
             CompositionLocalProvider(LocalPointerIconService provides iconService) {
                 Box(
-                    modifier = Modifier
-                        .requiredSize(200.dp)
-                        .border(BorderStroke(2.dp, SolidColor(Color.Red)))
-                        .testTag(parentIconTag)
+                    modifier =
+                        Modifier.requiredSize(200.dp)
+                            .border(BorderStroke(2.dp, SolidColor(Color.Red)))
+                            .testTag(parentIconTag)
                 ) {
                     Box(
-                        Modifier
-                            .padding(20.dp)
+                        Modifier.padding(20.dp)
                             .requiredSize(120.dp, 60.dp)
                             .border(BorderStroke(2.dp, SolidColor(Color.Black)))
                             .testTag(childIconTag)
@@ -1338,8 +1111,7 @@
                     )
                     // Referencing grandchild tag/icon for ChildB in this test
                     Box(
-                        Modifier
-                            .padding(horizontal = 100.dp, vertical = 40.dp)
+                        Modifier.padding(horizontal = 100.dp, vertical = 40.dp)
                             .requiredSize(120.dp, 20.dp)
                             .border(BorderStroke(2.dp, SolidColor(Color.Blue)))
                             .testTag(grandchildIconTag)
@@ -1353,39 +1125,34 @@
     }
 
     /**
-     * Setup:
-     * The hierarchy for this test is setup as:
-     *  Parent Box (no custom icon set)
-     *    ⤷ ChildA Box (custom icon = [PointerIcon.Text], overrideDescendants = TRUE)
-     *    ⤷ ChildB Box (custom icon = [PointerIcon.Hand], overrideDescendants = FALSE) where
-     *        ChildB Box's surface area overlaps with its sibling, ChildA, within the Parent Box
+     * Setup: The hierarchy for this test is setup as: Parent Box (no custom icon set) ⤷ ChildA Box
+     * (custom icon = [PointerIcon.Text], overrideDescendants = TRUE) ⤷ ChildB Box (custom icon =
+     * [PointerIcon.Hand], overrideDescendants = FALSE) where ChildB Box's surface area overlaps
+     * with its sibling, ChildA, within the Parent Box
      *
-     *  Expected Output:
-     *  ChildB Box's [PointerIcon.Hand] wins for the entire surface area of ChildB's Box.
-     *  ChildA Box's [PointerIcon.Text] wins for the remaining surface area of ChildA Box not
-     *  covered by ChildB Box. [PointerIcon.Default] wins for the remainder of the surface area of
-     *  Parent Box that's not covered by ChildA Box or ChildB Box. The overrideDescendants param
-     *  only affects that element's children. So in this example, it doesn't matter whether ChildA
-     *  Box's overrideDescendants = true because ChildB is its sibling and is therefore unaffected
-     *  by this param.
+     * Expected Output: ChildB Box's [PointerIcon.Hand] wins for the entire surface area of ChildB's
+     * Box. ChildA Box's [PointerIcon.Text] wins for the remaining surface area of ChildA Box not
+     * covered by ChildB Box. [PointerIcon.Default] wins for the remainder of the surface area of
+     * Parent Box that's not covered by ChildA Box or ChildB Box. The overrideDescendants param only
+     * affects that element's children. So in this example, it doesn't matter whether ChildA Box's
+     * overrideDescendants = true because ChildB is its sibling and is therefore unaffected by this
+     * param.
      *
-     *  Parent Box (output icon = [PointerIcon.Default])
-     *    ⤷ ChildA Box (output icon = [PointerIcon.Text])
-     *    ⤷ ChildB Box (output icon = [PointerIcon.Hand])
+     * Parent Box (output icon = [PointerIcon.Default]) ⤷ ChildA Box (output icon =
+     * [PointerIcon.Text]) ⤷ ChildB Box (output icon = [PointerIcon.Hand])
      */
     @Test
     fun OverlappingSiblings_childAOverridesDescendants() {
         rule.setContent {
             CompositionLocalProvider(LocalPointerIconService provides iconService) {
                 Box(
-                    modifier = Modifier
-                        .requiredSize(200.dp)
-                        .border(BorderStroke(2.dp, SolidColor(Color.Red)))
-                        .testTag(parentIconTag)
+                    modifier =
+                        Modifier.requiredSize(200.dp)
+                            .border(BorderStroke(2.dp, SolidColor(Color.Red)))
+                            .testTag(parentIconTag)
                 ) {
                     Box(
-                        Modifier
-                            .padding(20.dp)
+                        Modifier.padding(20.dp)
                             .requiredSize(120.dp, 60.dp)
                             .border(BorderStroke(2.dp, SolidColor(Color.Black)))
                             .testTag(childIconTag)
@@ -1393,8 +1160,7 @@
                     )
                     // Referencing grandchild tag/icon for ChildB in this test
                     Box(
-                        Modifier
-                            .padding(horizontal = 100.dp, vertical = 40.dp)
+                        Modifier.padding(horizontal = 100.dp, vertical = 40.dp)
                             .requiredSize(120.dp, 20.dp)
                             .border(BorderStroke(2.dp, SolidColor(Color.Blue)))
                             .testTag(grandchildIconTag)
@@ -1408,39 +1174,34 @@
     }
 
     /**
-     * Setup:
-     * The hierarchy for this test is setup as:
-     *  Parent Box (no custom icon set)
-     *    ⤷ ChildA Box (custom icon = [PointerIcon.Text], overrideDescendants = FALSE)
-     *    ⤷ ChildB Box (custom icon = [PointerIcon.Hand], overrideDescendants = TRUE) where
-     *        ChildB Box's surface area overlaps with its sibling, ChildA, within the Parent Box
+     * Setup: The hierarchy for this test is setup as: Parent Box (no custom icon set) ⤷ ChildA Box
+     * (custom icon = [PointerIcon.Text], overrideDescendants = FALSE) ⤷ ChildB Box (custom icon =
+     * [PointerIcon.Hand], overrideDescendants = TRUE) where ChildB Box's surface area overlaps with
+     * its sibling, ChildA, within the Parent Box
      *
-     *  Expected Output:
-     *  ChildB Box's [PointerIcon.Hand] wins for the entire surface area of ChildB's Box.
-     *  ChildA Box's [PointerIcon.Text] wins for the remaining surface area of ChildA Box not
-     *  covered by ChildB Box. [PointerIcon.Default] wins for the remainder of the surface area of
-     *  Parent Box that's not covered by ChildA Box or ChildB Box. The overrideDescendants param
-     *  only affects that element's children. So in this example, it doesn't matter whether ChildB
-     *  Box's overrideDescendants = true because ChildA is its sibling and is therefore unaffected
-     *  by this param.
+     * Expected Output: ChildB Box's [PointerIcon.Hand] wins for the entire surface area of ChildB's
+     * Box. ChildA Box's [PointerIcon.Text] wins for the remaining surface area of ChildA Box not
+     * covered by ChildB Box. [PointerIcon.Default] wins for the remainder of the surface area of
+     * Parent Box that's not covered by ChildA Box or ChildB Box. The overrideDescendants param only
+     * affects that element's children. So in this example, it doesn't matter whether ChildB Box's
+     * overrideDescendants = true because ChildA is its sibling and is therefore unaffected by this
+     * param.
      *
-     *  Parent Box (output icon = [PointerIcon.Default])
-     *    ⤷ ChildA Box (output icon = [PointerIcon.Text])
-     *    ⤷ ChildB Box (output icon = [PointerIcon.Hand])
+     * Parent Box (output icon = [PointerIcon.Default]) ⤷ ChildA Box (output icon =
+     * [PointerIcon.Text]) ⤷ ChildB Box (output icon = [PointerIcon.Hand])
      */
     @Test
     fun OverlappingSiblings_childBOverridesDescendants() {
         rule.setContent {
             CompositionLocalProvider(LocalPointerIconService provides iconService) {
                 Box(
-                    modifier = Modifier
-                        .requiredSize(200.dp)
-                        .border(BorderStroke(2.dp, SolidColor(Color.Red)))
-                        .testTag(parentIconTag)
+                    modifier =
+                        Modifier.requiredSize(200.dp)
+                            .border(BorderStroke(2.dp, SolidColor(Color.Red)))
+                            .testTag(parentIconTag)
                 ) {
                     Box(
-                        Modifier
-                            .padding(20.dp)
+                        Modifier.padding(20.dp)
                             .requiredSize(120.dp, 60.dp)
                             .border(BorderStroke(2.dp, SolidColor(Color.Black)))
                             .testTag(childIconTag)
@@ -1448,8 +1209,7 @@
                     )
                     // Referencing grandchild tag/icon for ChildB in this test
                     Box(
-                        Modifier
-                            .padding(horizontal = 100.dp, vertical = 40.dp)
+                        Modifier.padding(horizontal = 100.dp, vertical = 40.dp)
                             .requiredSize(120.dp, 20.dp)
                             .border(BorderStroke(2.dp, SolidColor(Color.Blue)))
                             .testTag(grandchildIconTag)
@@ -1463,39 +1223,34 @@
     }
 
     /**
-     * Setup:
-     * The hierarchy for this test is setup as:
-     *  Parent Box (no custom icon set)
-     *    ⤷ ChildA Box (custom icon = [PointerIcon.Text], overrideDescendants = TRUE)
-     *    ⤷ ChildB Box (custom icon = [PointerIcon.Hand], overrideDescendants = TRUE) where
-     *        ChildB Box's surface area overlaps with its sibling, ChildA, within the Parent Box
+     * Setup: The hierarchy for this test is setup as: Parent Box (no custom icon set) ⤷ ChildA Box
+     * (custom icon = [PointerIcon.Text], overrideDescendants = TRUE) ⤷ ChildB Box (custom icon =
+     * [PointerIcon.Hand], overrideDescendants = TRUE) where ChildB Box's surface area overlaps with
+     * its sibling, ChildA, within the Parent Box
      *
-     *  Expected Output:
-     *  ChildB Box's [PointerIcon.Hand] wins for the entire surface area of ChildB's Box.
-     *  ChildA Box's [PointerIcon.Text] wins for the remaining surface area of ChildA Box not
-     *  covered by ChildB Box. [PointerIcon.Default] wins for the remainder of the surface area of
-     *  Parent Box that's not covered by ChildA Box or ChildB Box. The overrideDescendants param
-     *  only affects that element's children. So in this example, it doesn't matter whether ChildA
-     *  Box or ChildB Box's overrideDescendants = true because ChildA and ChildB Boxes are siblings
-     *  and are unaffected by each other's overrideDescendants param.
+     * Expected Output: ChildB Box's [PointerIcon.Hand] wins for the entire surface area of ChildB's
+     * Box. ChildA Box's [PointerIcon.Text] wins for the remaining surface area of ChildA Box not
+     * covered by ChildB Box. [PointerIcon.Default] wins for the remainder of the surface area of
+     * Parent Box that's not covered by ChildA Box or ChildB Box. The overrideDescendants param only
+     * affects that element's children. So in this example, it doesn't matter whether ChildA Box or
+     * ChildB Box's overrideDescendants = true because ChildA and ChildB Boxes are siblings and are
+     * unaffected by each other's overrideDescendants param.
      *
-     *  Parent Box (output icon = [PointerIcon.Default])
-     *    ⤷ ChildA Box (output icon = [PointerIcon.Text])
-     *    ⤷ ChildB Box (output icon = [PointerIcon.Hand])
+     * Parent Box (output icon = [PointerIcon.Default]) ⤷ ChildA Box (output icon =
+     * [PointerIcon.Text]) ⤷ ChildB Box (output icon = [PointerIcon.Hand])
      */
     @Test
     fun OverlappingSiblings_bothOverrideDescendants() {
         rule.setContent {
             CompositionLocalProvider(LocalPointerIconService provides iconService) {
                 Box(
-                    modifier = Modifier
-                        .requiredSize(200.dp)
-                        .border(BorderStroke(2.dp, SolidColor(Color.Red)))
-                        .testTag(parentIconTag)
+                    modifier =
+                        Modifier.requiredSize(200.dp)
+                            .border(BorderStroke(2.dp, SolidColor(Color.Red)))
+                            .testTag(parentIconTag)
                 ) {
                     Box(
-                        Modifier
-                            .padding(20.dp)
+                        Modifier.padding(20.dp)
                             .requiredSize(120.dp, 60.dp)
                             .border(BorderStroke(2.dp, SolidColor(Color.Black)))
                             .testTag(childIconTag)
@@ -1503,8 +1258,7 @@
                     )
                     // Referencing grandchild tag/icon for ChildB in this test
                     Box(
-                        Modifier
-                            .padding(horizontal = 100.dp, vertical = 40.dp)
+                        Modifier.padding(horizontal = 100.dp, vertical = 40.dp)
                             .requiredSize(120.dp, 20.dp)
                             .border(BorderStroke(2.dp, SolidColor(Color.Blue)))
                             .testTag(grandchildIconTag)
@@ -1518,36 +1272,32 @@
     }
 
     /**
-     * Setup:
-     * The hierarchy for this test is setup as:
-     *  Parent Box (custom icon = [PointerIcon.Crosshair], overrideDescendants = TRUE)
-     *    ⤷ ChildA Box (custom icon = [PointerIcon.Text], overrideDescendants = TRUE)
-     *    ⤷ ChildB Box (custom icon = [PointerIcon.Hand], overrideDescendants = TRUE) where
-     *        ChildB Box's surface area overlaps with its sibling, ChildA, within the Parent Box
+     * Setup: The hierarchy for this test is setup as: Parent Box (custom icon =
+     * [PointerIcon.Crosshair], overrideDescendants = TRUE) ⤷ ChildA Box (custom icon =
+     * [PointerIcon.Text], overrideDescendants = TRUE) ⤷ ChildB Box (custom icon =
+     * [PointerIcon.Hand], overrideDescendants = TRUE) where ChildB Box's surface area overlaps with
+     * its sibling, ChildA, within the Parent Box
      *
-     *  Expected Output:
-     *  Parent Box's [PointerIcon.Crosshair] wins for the entire surface area of its box, including
-     *  the surface area within ChildA Box and ChildB Box. Parent Box has overrideDescendants =
-     *  true, which takes priority over any custom icon set by its children.
+     * Expected Output: Parent Box's [PointerIcon.Crosshair] wins for the entire surface area of its
+     * box, including the surface area within ChildA Box and ChildB Box. Parent Box has
+     * overrideDescendants = true, which takes priority over any custom icon set by its children.
      *
-     *  Parent Box (output icon = [PointerIcon.Crosshair])
-     *    ⤷ ChildA Box (output icon = [PointerIcon.Crosshair])
-     *    ⤷ ChildB Box (output icon = [PointerIcon.Crosshair])
+     * Parent Box (output icon = [PointerIcon.Crosshair]) ⤷ ChildA Box (output icon =
+     * [PointerIcon.Crosshair]) ⤷ ChildB Box (output icon = [PointerIcon.Crosshair])
      */
     @Test
     fun OverlappingSiblings_parentOverridesDescendants() {
         rule.setContent {
             CompositionLocalProvider(LocalPointerIconService provides iconService) {
                 Box(
-                    modifier = Modifier
-                        .requiredSize(200.dp)
-                        .border(BorderStroke(2.dp, SolidColor(Color.Red)))
-                        .testTag(parentIconTag)
-                        .pointerHoverIcon(desiredParentIcon, overrideDescendants = true)
+                    modifier =
+                        Modifier.requiredSize(200.dp)
+                            .border(BorderStroke(2.dp, SolidColor(Color.Red)))
+                            .testTag(parentIconTag)
+                            .pointerHoverIcon(desiredParentIcon, overrideDescendants = true)
                 ) {
                     Box(
-                        Modifier
-                            .padding(20.dp)
+                        Modifier.padding(20.dp)
                             .requiredSize(120.dp, 60.dp)
                             .border(BorderStroke(2.dp, SolidColor(Color.Black)))
                             .testTag(childIconTag)
@@ -1555,8 +1305,7 @@
                     )
                     // Referencing grandchild tag/icon for ChildB in this test
                     Box(
-                        Modifier
-                            .padding(horizontal = 100.dp, vertical = 40.dp)
+                        Modifier.padding(horizontal = 100.dp, vertical = 40.dp)
                             .requiredSize(120.dp, 20.dp)
                             .border(BorderStroke(2.dp, SolidColor(Color.Blue)))
                             .testTag(grandchildIconTag)
@@ -1567,72 +1316,50 @@
         }
 
         // Verify initial state of pointer icon
-        rule.runOnIdle {
-            assertThat(iconService.getIcon()).isEqualTo(desiredDefaultIcon)
-        }
+        rule.runOnIdle { assertThat(iconService.getIcon()).isEqualTo(desiredDefaultIcon) }
         // Hover over ChildB (bottom right corner) and verify desired Parent icon
-        rule.onNodeWithTag(grandchildIconTag).performMouseInput {
-            enter(bottomRight)
-        }
-        rule.runOnIdle {
-            assertThat(iconService.getIcon()).isEqualTo(desiredParentIcon)
-        }
+        rule.onNodeWithTag(grandchildIconTag).performMouseInput { enter(bottomRight) }
+        rule.runOnIdle { assertThat(iconService.getIcon()).isEqualTo(desiredParentIcon) }
         // Then hover to parent (bottom right corner) and icon hasn't changed
-        rule.onNodeWithTag(parentIconTag).performMouseInput {
-            moveTo(bottomRight)
-        }
-        rule.runOnIdle {
-            assertThat(iconService.getIcon()).isEqualTo(desiredParentIcon)
-        }
+        rule.onNodeWithTag(parentIconTag).performMouseInput { moveTo(bottomRight) }
+        rule.runOnIdle { assertThat(iconService.getIcon()).isEqualTo(desiredParentIcon) }
         // Then hover to ChildA (bottom left corner) and verify icon hasn't changed
-        rule.onNodeWithTag(childIconTag).performMouseInput {
-            moveTo(bottomLeft)
-        }
-        rule.runOnIdle {
-            assertThat(iconService.getIcon()).isEqualTo(desiredParentIcon)
-        }
+        rule.onNodeWithTag(childIconTag).performMouseInput { moveTo(bottomLeft) }
+        rule.runOnIdle { assertThat(iconService.getIcon()).isEqualTo(desiredParentIcon) }
         // Exit hovering
-        rule.onNodeWithTag(parentIconTag).performMouseInput {
-            exit()
-        }
+        rule.onNodeWithTag(parentIconTag).performMouseInput { exit() }
     }
 
     /**
-     * Setup:
-     * The hierarchy for this test is setup as:
-     *  Parent Box (no custom icon set)
-     *    ⤷ Child Box (no custom icon set)
-     *        ⤷ Grandchild Box (custom icon = [PointerIcon.Hand], overrideDescendants = FALSE)
+     * Setup: The hierarchy for this test is setup as: Parent Box (no custom icon set) ⤷ Child Box
+     * (no custom icon set) ⤷ Grandchild Box (custom icon = [PointerIcon.Hand], overrideDescendants
+     * = FALSE)
      *
-     *  Expected Output:
-     *  Grandchild Box’s [PointerIcon.Hand] wins for the entire surface area of Grandchild's Box.
-     *  [PointerIcon.Default] wins for the remainder of the surface area of Parent Box that isn't
-     *  covered by Grandchild Box.
+     * Expected Output: Grandchild Box’s [PointerIcon.Hand] wins for the entire surface area of
+     * Grandchild's Box. [PointerIcon.Default] wins for the remainder of the surface area of Parent
+     * Box that isn't covered by Grandchild Box.
      *
-     *  Parent Box (output icon = [PointerIcon.Default])
-     *    ⤷ Child Box (output icon = [PointerIcon.Default])
-     *        ⤷ Grandchild Box (output icon = [PointerIcon.Hand])
+     * Parent Box (output icon = [PointerIcon.Default]) ⤷ Child Box (output icon =
+     * [PointerIcon.Default]) ⤷ Grandchild Box (output icon = [PointerIcon.Hand])
      */
     @Test
     fun multiLayeredNesting_grandchildCustomIconNoOverride() {
         rule.setContent {
             CompositionLocalProvider(LocalPointerIconService provides iconService) {
                 Box(
-                    modifier = Modifier
-                        .requiredSize(200.dp)
-                        .border(BorderStroke(2.dp, SolidColor(Color.Red)))
-                        .testTag(parentIconTag)
+                    modifier =
+                        Modifier.requiredSize(200.dp)
+                            .border(BorderStroke(2.dp, SolidColor(Color.Red)))
+                            .testTag(parentIconTag)
                 ) {
                     Box(
-                        Modifier
-                            .padding(20.dp)
+                        Modifier.padding(20.dp)
                             .requiredSize(150.dp)
                             .border(BorderStroke(2.dp, SolidColor(Color.Black)))
                             .testTag(childIconTag)
                     ) {
                         Box(
-                            Modifier
-                                .padding(40.dp)
+                            Modifier.padding(40.dp)
                                 .requiredSize(100.dp)
                                 .border(BorderStroke(2.dp, SolidColor(Color.Blue)))
                                 .testTag(grandchildIconTag)
@@ -1646,9 +1373,7 @@
             }
         }
         // Verify initial state of pointer icon
-        rule.runOnIdle {
-            assertThat(iconService.getIcon()).isEqualTo(desiredDefaultIcon)
-        }
+        rule.runOnIdle { assertThat(iconService.getIcon()).isEqualTo(desiredDefaultIcon) }
         // Verify Grandchild Box's icon is the desired grandchild icon
         verifyIconOnHover(grandchildIconTag, desiredGrandchildIcon)
         // Verify remaining Child Box's area is the default arrow icon
@@ -1658,57 +1383,46 @@
     }
 
     /**
-     * Setup:
-     * The hierarchy for this test is setup as:
-     *  Parent Box (no custom icon set)
-     *    ⤷ Child Box (no custom icon set)
-     *        ⤷ Grandchild Box (custom icon = [PointerIcon.Hand], overrideDescendants = TRUE)
+     * Setup: The hierarchy for this test is setup as: Parent Box (no custom icon set) ⤷ Child Box
+     * (no custom icon set) ⤷ Grandchild Box (custom icon = [PointerIcon.Hand], overrideDescendants
+     * = TRUE)
      *
-     *  Expected Output:
-     *  Grandchild Box’s [PointerIcon.Hand] wins for the entire surface area of Grandchild's Box.
-     *  [PointerIcon.Default] wins for the remainder of the surface area of Parent Box that isn't
-     *  covered by Grandchild Box.
+     * Expected Output: Grandchild Box’s [PointerIcon.Hand] wins for the entire surface area of
+     * Grandchild's Box. [PointerIcon.Default] wins for the remainder of the surface area of Parent
+     * Box that isn't covered by Grandchild Box.
      *
-     *  Parent Box (output icon = [PointerIcon.Default])
-     *    ⤷ Child Box (output icon = [PointerIcon.Default])
-     *        ⤷ Grandchild Box (output icon = [PointerIcon.Hand])
+     * Parent Box (output icon = [PointerIcon.Default]) ⤷ Child Box (output icon =
+     * [PointerIcon.Default]) ⤷ Grandchild Box (output icon = [PointerIcon.Hand])
      */
     @Test
     fun multiLayeredNesting_grandchildCustomIconHasOverride() {
         rule.setContent {
             CompositionLocalProvider(LocalPointerIconService provides iconService) {
                 Box(
-                    modifier = Modifier
-                        .requiredSize(200.dp)
-                        .border(BorderStroke(2.dp, SolidColor(Color.Red)))
-                        .testTag(parentIconTag)
+                    modifier =
+                        Modifier.requiredSize(200.dp)
+                            .border(BorderStroke(2.dp, SolidColor(Color.Red)))
+                            .testTag(parentIconTag)
                 ) {
                     Box(
-                        Modifier
-                            .padding(20.dp)
+                        Modifier.padding(20.dp)
                             .requiredSize(150.dp)
                             .border(BorderStroke(2.dp, SolidColor(Color.Black)))
                             .testTag(childIconTag)
                     ) {
                         Box(
-                            Modifier
-                                .padding(40.dp)
+                            Modifier.padding(40.dp)
                                 .requiredSize(100.dp)
                                 .border(BorderStroke(2.dp, SolidColor(Color.Blue)))
                                 .testTag(grandchildIconTag)
-                                .pointerHoverIcon(
-                                    desiredGrandchildIcon,
-                                    overrideDescendants = true
-                                )
+                                .pointerHoverIcon(desiredGrandchildIcon, overrideDescendants = true)
                         )
                     }
                 }
             }
         }
         // Verify initial state of pointer icon
-        rule.runOnIdle {
-            assertThat(iconService.getIcon()).isEqualTo(desiredDefaultIcon)
-        }
+        rule.runOnIdle { assertThat(iconService.getIcon()).isEqualTo(desiredDefaultIcon) }
         // Verify Grandchild Box's icon is the desired grandchild icon
         verifyIconOnHover(grandchildIconTag, desiredGrandchildIcon)
         // Verify remaining Child Box's area is the default arrow icon
@@ -1718,43 +1432,37 @@
     }
 
     /**
-     * Setup:
-     * The hierarchy for this test is setup as:
-     *  Parent Box (no custom icon set)
-     *    ⤷ Child Box (custom icon = [PointerIcon.Text], overrideDescendants = FALSE)
-     *        ⤷ Grandchild Box (custom icon = [PointerIcon.Hand], overrideDescendants = FALSE)
+     * Setup: The hierarchy for this test is setup as: Parent Box (no custom icon set) ⤷ Child Box
+     * (custom icon = [PointerIcon.Text], overrideDescendants = FALSE) ⤷ Grandchild Box (custom icon
+     * = [PointerIcon.Hand], overrideDescendants = FALSE)
      *
-     *  Expected Output:
-     *  Grandchild Box's [PointerIcon.Hand] wins for the entire surface area of the Grandchild Box.
-     *  Child Box’s [PointerIcon.Text] wins for remaining surface area of its Box not covered by the
-     *  Grandchild Box. [PointerIcon.Default] wins for the remainder of the surface area of Parent
-     *  Box that isn't covered by Child Box.
+     * Expected Output: Grandchild Box's [PointerIcon.Hand] wins for the entire surface area of the
+     * Grandchild Box. Child Box’s [PointerIcon.Text] wins for remaining surface area of its Box not
+     * covered by the Grandchild Box. [PointerIcon.Default] wins for the remainder of the surface
+     * area of Parent Box that isn't covered by Child Box.
      *
-     *  Parent Box (output icon = [PointerIcon.Default])
-     *    ⤷ Child Box (output icon = [PointerIcon.Text])
-     *        ⤷ Grandchild Box (output icon = [PointerIcon.Hand])
+     * Parent Box (output icon = [PointerIcon.Default]) ⤷ Child Box (output icon =
+     * [PointerIcon.Text]) ⤷ Grandchild Box (output icon = [PointerIcon.Hand])
      */
     @Test
     fun multiLayeredNesting_childAndGrandchildCustomIconsNoOverrides() {
         rule.setContent {
             CompositionLocalProvider(LocalPointerIconService provides iconService) {
                 Box(
-                    modifier = Modifier
-                        .requiredSize(200.dp)
-                        .border(BorderStroke(2.dp, SolidColor(Color.Red)))
-                        .testTag(parentIconTag)
+                    modifier =
+                        Modifier.requiredSize(200.dp)
+                            .border(BorderStroke(2.dp, SolidColor(Color.Red)))
+                            .testTag(parentIconTag)
                 ) {
                     Box(
-                        Modifier
-                            .padding(20.dp)
+                        Modifier.padding(20.dp)
                             .requiredSize(150.dp)
                             .border(BorderStroke(2.dp, SolidColor(Color.Black)))
                             .testTag(childIconTag)
                             .pointerHoverIcon(desiredChildIcon, overrideDescendants = false)
                     ) {
                         Box(
-                            Modifier
-                                .padding(40.dp)
+                            Modifier.padding(40.dp)
                                 .requiredSize(100.dp)
                                 .border(BorderStroke(2.dp, SolidColor(Color.Blue)))
                                 .testTag(grandchildIconTag)
@@ -1768,9 +1476,7 @@
             }
         }
         // Verify initial state of pointer icon
-        rule.runOnIdle {
-            assertThat(iconService.getIcon()).isEqualTo(desiredDefaultIcon)
-        }
+        rule.runOnIdle { assertThat(iconService.getIcon()).isEqualTo(desiredDefaultIcon) }
         // Verify Grandchild Box's icon is the desired grandchild icon
         verifyIconOnHover(grandchildIconTag, desiredGrandchildIcon)
         // Verify remaining Child Box's icon is the desired child icon
@@ -1780,59 +1486,48 @@
     }
 
     /**
-     * Setup:
-     * The hierarchy for this test is setup as:
-     *  Parent Box (no custom icon set)
-     *    ⤷ Child Box (custom icon = [PointerIcon.Text], overrideDescendants = FALSE)
-     *        ⤷ Grandchild Box (custom icon = [PointerIcon.Hand], overrideDescendants = TRUE)
+     * Setup: The hierarchy for this test is setup as: Parent Box (no custom icon set) ⤷ Child Box
+     * (custom icon = [PointerIcon.Text], overrideDescendants = FALSE) ⤷ Grandchild Box (custom icon
+     * = [PointerIcon.Hand], overrideDescendants = TRUE)
      *
-     *  Expected Output:
-     *  Grandchild Box's [PointerIcon.Hand] wins for the entire surface area of the Grandchild Box.
-     *  Child Box’s [PointerIcon.Text] wins for the remainder of the Child Box's surface area
-     *  that's not covered by the Grandchild box. [PointerIcon.Default] wins for the remainder of
-     *  the surface area of Parent Box that isn't covered by Child Box.
+     * Expected Output: Grandchild Box's [PointerIcon.Hand] wins for the entire surface area of the
+     * Grandchild Box. Child Box’s [PointerIcon.Text] wins for the remainder of the Child Box's
+     * surface area that's not covered by the Grandchild box. [PointerIcon.Default] wins for the
+     * remainder of the surface area of Parent Box that isn't covered by Child Box.
      *
-     *  Parent Box (output icon = [PointerIcon.Default])
-     *    ⤷ Child Box (output icon = [PointerIcon.Text])
-     *        ⤷ Grandchild Box (output icon = [PointerIcon.Hand])
+     * Parent Box (output icon = [PointerIcon.Default]) ⤷ Child Box (output icon =
+     * [PointerIcon.Text]) ⤷ Grandchild Box (output icon = [PointerIcon.Hand])
      */
     @Test
     fun multiLayeredNesting_childCustomIconGrandchildHasOverride() {
         rule.setContent {
             CompositionLocalProvider(LocalPointerIconService provides iconService) {
                 Box(
-                    modifier = Modifier
-                        .requiredSize(200.dp)
-                        .border(BorderStroke(2.dp, SolidColor(Color.Red)))
-                        .testTag(parentIconTag)
+                    modifier =
+                        Modifier.requiredSize(200.dp)
+                            .border(BorderStroke(2.dp, SolidColor(Color.Red)))
+                            .testTag(parentIconTag)
                 ) {
                     Box(
-                        Modifier
-                            .padding(20.dp)
+                        Modifier.padding(20.dp)
                             .requiredSize(150.dp)
                             .border(BorderStroke(2.dp, SolidColor(Color.Black)))
                             .testTag(childIconTag)
                             .pointerHoverIcon(desiredChildIcon, overrideDescendants = false)
                     ) {
                         Box(
-                            Modifier
-                                .padding(40.dp)
+                            Modifier.padding(40.dp)
                                 .requiredSize(100.dp)
                                 .border(BorderStroke(2.dp, SolidColor(Color.Blue)))
                                 .testTag(grandchildIconTag)
-                                .pointerHoverIcon(
-                                    desiredGrandchildIcon,
-                                    overrideDescendants = true
-                                )
+                                .pointerHoverIcon(desiredGrandchildIcon, overrideDescendants = true)
                         )
                     }
                 }
             }
         }
         // Verify initial state of pointer icon
-        rule.runOnIdle {
-            assertThat(iconService.getIcon()).isEqualTo(desiredDefaultIcon)
-        }
+        rule.runOnIdle { assertThat(iconService.getIcon()).isEqualTo(desiredDefaultIcon) }
         // Verify Grandchild Box's icon is the desired grandchild icon
         verifyIconOnHover(grandchildIconTag, desiredGrandchildIcon)
         // Verify remaining Child Box's icon is the desired child icon
@@ -1842,43 +1537,37 @@
     }
 
     /**
-     * Setup:
-     * The hierarchy for this test is setup as:
-     *  Parent Box (no custom icon set)
-     *    ⤷ Child Box (custom icon = [PointerIcon.Text], overrideDescendants = TRUE)
-     *        ⤷ Grandchild Box (custom icon = [PointerIcon.Hand], overrideDescendants = FALSE)
+     * Setup: The hierarchy for this test is setup as: Parent Box (no custom icon set) ⤷ Child Box
+     * (custom icon = [PointerIcon.Text], overrideDescendants = TRUE) ⤷ Grandchild Box (custom icon
+     * = [PointerIcon.Hand], overrideDescendants = FALSE)
      *
-     *  Expected Output:
-     *  Child Box’s [PointerIcon.Text] wins for the entire surface area of its Box (including all
-     *  of the Grandchild Box since it is contained within Child Box's surface area).
-     *  [PointerIcon.Default] wins for the remainder of the surface area of Parent Box that isn't
-     *  covered by Child Box.
+     * Expected Output: Child Box’s [PointerIcon.Text] wins for the entire surface area of its Box
+     * (including all of the Grandchild Box since it is contained within Child Box's surface area).
+     * [PointerIcon.Default] wins for the remainder of the surface area of Parent Box that isn't
+     * covered by Child Box.
      *
-     *  Parent Box (output icon = [PointerIcon.Default])
-     *    ⤷ Child Box (output icon = [PointerIcon.Text])
-     *        ⤷ Grandchild Box (output icon = [PointerIcon.Text])
+     * Parent Box (output icon = [PointerIcon.Default]) ⤷ Child Box (output icon =
+     * [PointerIcon.Text]) ⤷ Grandchild Box (output icon = [PointerIcon.Text])
      */
     @Test
     fun multiLayeredNesting_grandchildCustomIconChildHasOverride() {
         rule.setContent {
             CompositionLocalProvider(LocalPointerIconService provides iconService) {
                 Box(
-                    modifier = Modifier
-                        .requiredSize(200.dp)
-                        .border(BorderStroke(2.dp, SolidColor(Color.Red)))
-                        .testTag(parentIconTag)
+                    modifier =
+                        Modifier.requiredSize(200.dp)
+                            .border(BorderStroke(2.dp, SolidColor(Color.Red)))
+                            .testTag(parentIconTag)
                 ) {
                     Box(
-                        Modifier
-                            .padding(20.dp)
+                        Modifier.padding(20.dp)
                             .requiredSize(150.dp)
                             .border(BorderStroke(2.dp, SolidColor(Color.Black)))
                             .testTag(childIconTag)
                             .pointerHoverIcon(desiredChildIcon, overrideDescendants = true)
                     ) {
                         Box(
-                            Modifier
-                                .padding(40.dp)
+                            Modifier.padding(40.dp)
                                 .requiredSize(100.dp)
                                 .border(BorderStroke(2.dp, SolidColor(Color.Blue)))
                                 .testTag(grandchildIconTag)
@@ -1892,9 +1581,7 @@
             }
         }
         // Verify initial state of pointer icon
-        rule.runOnIdle {
-            assertThat(iconService.getIcon()).isEqualTo(desiredDefaultIcon)
-        }
+        rule.runOnIdle { assertThat(iconService.getIcon()).isEqualTo(desiredDefaultIcon) }
         // Verify Child Box's icon is the desired child icon
         verifyIconOnHover(childIconTag, desiredChildIcon)
         // Verify Grandchild Box is respecting Child Box's icon
@@ -1904,59 +1591,48 @@
     }
 
     /**
-     * Setup:
-     * The hierarchy for this test is setup as:
-     *  Parent Box (no custom icon set)
-     *    ⤷ Child Box (custom icon = [PointerIcon.Text], overrideDescendants = TRUE)
-     *        ⤷ Grandchild Box (custom icon = [PointerIcon.Hand], overrideDescendants = TRUE)
+     * Setup: The hierarchy for this test is setup as: Parent Box (no custom icon set) ⤷ Child Box
+     * (custom icon = [PointerIcon.Text], overrideDescendants = TRUE) ⤷ Grandchild Box (custom icon
+     * = [PointerIcon.Hand], overrideDescendants = TRUE)
      *
-     *  Expected Output:
-     *  Child Box’s [PointerIcon.Text] wins for the entire surface area of its Box (including all
-     *  of the Grandchild Box since it is contained within Child Box's surface area).
-     *  [PointerIcon.Default] wins for the remainder of the surface area of Parent Box that isn't
-     *  covered by Child Box.
+     * Expected Output: Child Box’s [PointerIcon.Text] wins for the entire surface area of its Box
+     * (including all of the Grandchild Box since it is contained within Child Box's surface area).
+     * [PointerIcon.Default] wins for the remainder of the surface area of Parent Box that isn't
+     * covered by Child Box.
      *
-     *  Parent Box (output icon = [PointerIcon.Default])
-     *    ⤷ Child Box (output icon = [PointerIcon.Text])
-     *        ⤷ Grandchild Box (output icon = [PointerIcon.Text])
+     * Parent Box (output icon = [PointerIcon.Default]) ⤷ Child Box (output icon =
+     * [PointerIcon.Text]) ⤷ Grandchild Box (output icon = [PointerIcon.Text])
      */
     @Test
     fun multiLayeredNesting_childAndGrandchildOverrideDescendants() {
         rule.setContent {
             CompositionLocalProvider(LocalPointerIconService provides iconService) {
                 Box(
-                    modifier = Modifier
-                        .requiredSize(200.dp)
-                        .border(BorderStroke(2.dp, SolidColor(Color.Red)))
-                        .testTag(parentIconTag)
+                    modifier =
+                        Modifier.requiredSize(200.dp)
+                            .border(BorderStroke(2.dp, SolidColor(Color.Red)))
+                            .testTag(parentIconTag)
                 ) {
                     Box(
-                        Modifier
-                            .padding(20.dp)
+                        Modifier.padding(20.dp)
                             .requiredSize(150.dp)
                             .border(BorderStroke(2.dp, SolidColor(Color.Black)))
                             .testTag(childIconTag)
                             .pointerHoverIcon(desiredChildIcon, overrideDescendants = true)
                     ) {
                         Box(
-                            Modifier
-                                .padding(40.dp)
+                            Modifier.padding(40.dp)
                                 .requiredSize(100.dp)
                                 .border(BorderStroke(2.dp, SolidColor(Color.Blue)))
                                 .testTag(grandchildIconTag)
-                                .pointerHoverIcon(
-                                    desiredGrandchildIcon,
-                                    overrideDescendants = true
-                                )
+                                .pointerHoverIcon(desiredGrandchildIcon, overrideDescendants = true)
                         )
                     }
                 }
             }
         }
         // Verify initial state of pointer icon
-        rule.runOnIdle {
-            assertThat(iconService.getIcon()).isEqualTo(desiredDefaultIcon)
-        }
+        rule.runOnIdle { assertThat(iconService.getIcon()).isEqualTo(desiredDefaultIcon) }
         // Verify Child Box's icon is the desired child icon
         verifyIconOnHover(childIconTag, desiredChildIcon)
         // Verify Grandchild Box is respecting Child Box's icon
@@ -1966,42 +1642,36 @@
     }
 
     /**
-     * Setup:
-     * The hierarchy for this test is setup as:
-     *  Parent Box (custom icon = [PointerIcon.Crosshair], overrideDescendants = FALSE)
-     *    ⤷ Child Box (no icon set)
-     *        ⤷ Grandchild Box (custom icon = [PointerIcon.Hand], overrideDescendants = FALSE)
+     * Setup: The hierarchy for this test is setup as: Parent Box (custom icon =
+     * [PointerIcon.Crosshair], overrideDescendants = FALSE) ⤷ Child Box (no icon set) ⤷ Grandchild
+     * Box (custom icon = [PointerIcon.Hand], overrideDescendants = FALSE)
      *
-     *  Expected Output:
-     *  Grandchild Box's [PointerIcon.Hand] wins for the entire surface area of the Grandchild Box.
-     *  Parent Box’s [PointerIcon.Crosshair] wins for the remaining surface area of the Pare Box
-     *  that's not covered by the Grandchild Box.
+     * Expected Output: Grandchild Box's [PointerIcon.Hand] wins for the entire surface area of the
+     * Grandchild Box. Parent Box’s [PointerIcon.Crosshair] wins for the remaining surface area of
+     * the Pare Box that's not covered by the Grandchild Box.
      *
-     *  Parent Box (output icon = [PointerIcon.Crosshair])
-     *    ⤷ Child Box (output icon = [PointerIcon.Crosshair])
-     *        ⤷ Grandchild Box (output icon = [PointerIcon.Hand])
+     * Parent Box (output icon = [PointerIcon.Crosshair]) ⤷ Child Box (output icon =
+     * [PointerIcon.Crosshair]) ⤷ Grandchild Box (output icon = [PointerIcon.Hand])
      */
     @Test
     fun multiLayeredNesting_parentAndGrandchildCustomIconNoOverrides() {
         rule.setContent {
             CompositionLocalProvider(LocalPointerIconService provides iconService) {
                 Box(
-                    modifier = Modifier
-                        .requiredSize(200.dp)
-                        .border(BorderStroke(2.dp, SolidColor(Color.Red)))
-                        .testTag(parentIconTag)
-                        .pointerHoverIcon(desiredParentIcon, overrideDescendants = false)
+                    modifier =
+                        Modifier.requiredSize(200.dp)
+                            .border(BorderStroke(2.dp, SolidColor(Color.Red)))
+                            .testTag(parentIconTag)
+                            .pointerHoverIcon(desiredParentIcon, overrideDescendants = false)
                 ) {
                     Box(
-                        Modifier
-                            .padding(20.dp)
+                        Modifier.padding(20.dp)
                             .requiredSize(150.dp)
                             .border(BorderStroke(2.dp, SolidColor(Color.Black)))
                             .testTag(childIconTag)
                     ) {
                         Box(
-                            Modifier
-                                .padding(40.dp)
+                            Modifier.padding(40.dp)
                                 .requiredSize(100.dp)
                                 .border(BorderStroke(2.dp, SolidColor(Color.Blue)))
                                 .testTag(grandchildIconTag)
@@ -2015,9 +1685,7 @@
             }
         }
         // Verify initial state of pointer icon
-        rule.runOnIdle {
-            assertThat(iconService.getIcon()).isEqualTo(desiredDefaultIcon)
-        }
+        rule.runOnIdle { assertThat(iconService.getIcon()).isEqualTo(desiredDefaultIcon) }
         // Verify Grandchild Box's icon is the desired grandchild icon
         verifyIconOnHover(grandchildIconTag, desiredGrandchildIcon)
         // Verify remaining Child Box is respecting Parent Box's icon
@@ -2027,58 +1695,47 @@
     }
 
     /**
-     * Setup:
-     * The hierarchy for this test is setup as:
-     *  Parent Box (custom icon = [PointerIcon.Crosshair], overrideDescendants = FALSE)
-     *    ⤷ Child Box (no icon set)
-     *        ⤷ Grandchild Box (custom icon = [PointerIcon.Hand], overrideDescendants = TRUE)
+     * Setup: The hierarchy for this test is setup as: Parent Box (custom icon =
+     * [PointerIcon.Crosshair], overrideDescendants = FALSE) ⤷ Child Box (no icon set) ⤷ Grandchild
+     * Box (custom icon = [PointerIcon.Hand], overrideDescendants = TRUE)
      *
-     *  Expected Output:
-     *  Grandchild Box's [PointerIcon.Hand] wins for the entire surface area of its Box. Parent
-     *  Box’s [PointerIcon.Crosshair] wins for the remaining surface area of the Pare Box that's
-     *  not covered by the Grandchild Box.
+     * Expected Output: Grandchild Box's [PointerIcon.Hand] wins for the entire surface area of its
+     * Box. Parent Box’s [PointerIcon.Crosshair] wins for the remaining surface area of the Pare Box
+     * that's not covered by the Grandchild Box.
      *
-     *  Parent Box (output icon = [PointerIcon.Crosshair])
-     *    ⤷ Child Box (output icon = [PointerIcon.Crosshair])
-     *        ⤷ Grandchild Box (output icon = [PointerIcon.Hand])
+     * Parent Box (output icon = [PointerIcon.Crosshair]) ⤷ Child Box (output icon =
+     * [PointerIcon.Crosshair]) ⤷ Grandchild Box (output icon = [PointerIcon.Hand])
      */
     @Test
     fun multiLayeredNesting_parentCustomIconGrandchildOverrides() {
         rule.setContent {
             CompositionLocalProvider(LocalPointerIconService provides iconService) {
                 Box(
-                    modifier = Modifier
-                        .requiredSize(200.dp)
-                        .border(BorderStroke(2.dp, SolidColor(Color.Red)))
-                        .testTag(parentIconTag)
-                        .pointerHoverIcon(desiredParentIcon, overrideDescendants = false)
+                    modifier =
+                        Modifier.requiredSize(200.dp)
+                            .border(BorderStroke(2.dp, SolidColor(Color.Red)))
+                            .testTag(parentIconTag)
+                            .pointerHoverIcon(desiredParentIcon, overrideDescendants = false)
                 ) {
                     Box(
-                        Modifier
-                            .padding(20.dp)
+                        Modifier.padding(20.dp)
                             .requiredSize(150.dp)
                             .border(BorderStroke(2.dp, SolidColor(Color.Black)))
                             .testTag(childIconTag)
                     ) {
                         Box(
-                            Modifier
-                                .padding(40.dp)
+                            Modifier.padding(40.dp)
                                 .requiredSize(100.dp)
                                 .border(BorderStroke(2.dp, SolidColor(Color.Blue)))
                                 .testTag(grandchildIconTag)
-                                .pointerHoverIcon(
-                                    desiredGrandchildIcon,
-                                    overrideDescendants = true
-                                )
+                                .pointerHoverIcon(desiredGrandchildIcon, overrideDescendants = true)
                         )
                     }
                 }
             }
         }
         // Verify initial state of pointer icon
-        rule.runOnIdle {
-            assertThat(iconService.getIcon()).isEqualTo(desiredDefaultIcon)
-        }
+        rule.runOnIdle { assertThat(iconService.getIcon()).isEqualTo(desiredDefaultIcon) }
         // Verify Grandchild Box's icon is the desired grandchild icon
         verifyIconOnHover(grandchildIconTag, desiredGrandchildIcon)
         // Verify remaining Child Box is respecting Parent Box's icon
@@ -2088,44 +1745,39 @@
     }
 
     /**
-     * Setup:
-     * The hierarchy for this test is setup as:
-     *  Parent Box (custom icon = [PointerIcon.Crosshair], overrideDescendants = FALSE)
-     *    ⤷ Child Box (custom icon = [PointerIcon.Text], overrideDescendants = FALSE)
-     *        ⤷ Grandchild Box (custom icon = [PointerIcon.Hand], overrideDescendants = FALSE)
+     * Setup: The hierarchy for this test is setup as: Parent Box (custom icon =
+     * [PointerIcon.Crosshair], overrideDescendants = FALSE) ⤷ Child Box (custom icon =
+     * [PointerIcon.Text], overrideDescendants = FALSE) ⤷ Grandchild Box (custom icon =
+     * [PointerIcon.Hand], overrideDescendants = FALSE)
      *
-     *  Expected Output:
-     *  Grandchild Box's [PointerIcon.Hand] wins for the entire surface area of the Grandchild Box.
-     *  Child Box's [PointerIcon.Text] wins for the remaining surface area of the Child Box not
-     *  covered by the Grandchild Box. Parent Box’s [PointerIcon.Crosshair] wins for the remaining
-     *  surface area not covered by the Child Box.
+     * Expected Output: Grandchild Box's [PointerIcon.Hand] wins for the entire surface area of the
+     * Grandchild Box. Child Box's [PointerIcon.Text] wins for the remaining surface area of the
+     * Child Box not covered by the Grandchild Box. Parent Box’s [PointerIcon.Crosshair] wins for
+     * the remaining surface area not covered by the Child Box.
      *
-     *  Parent Box (output icon = [PointerIcon.Crosshair])
-     *    ⤷ Child Box (output icon = [PointerIcon.Text])
-     *        ⤷ Grandchild Box (output icon = [PointerIcon.Hand])
+     * Parent Box (output icon = [PointerIcon.Crosshair]) ⤷ Child Box (output icon =
+     * [PointerIcon.Text]) ⤷ Grandchild Box (output icon = [PointerIcon.Hand])
      */
     @Test
     fun multiLayeredNesting_allCustomIconsNoOverrides() {
         rule.setContent {
             CompositionLocalProvider(LocalPointerIconService provides iconService) {
                 Box(
-                    modifier = Modifier
-                        .requiredSize(200.dp)
-                        .border(BorderStroke(2.dp, SolidColor(Color.Red)))
-                        .testTag(parentIconTag)
-                        .pointerHoverIcon(desiredParentIcon, overrideDescendants = false)
+                    modifier =
+                        Modifier.requiredSize(200.dp)
+                            .border(BorderStroke(2.dp, SolidColor(Color.Red)))
+                            .testTag(parentIconTag)
+                            .pointerHoverIcon(desiredParentIcon, overrideDescendants = false)
                 ) {
                     Box(
-                        Modifier
-                            .padding(20.dp)
+                        Modifier.padding(20.dp)
                             .requiredSize(150.dp)
                             .border(BorderStroke(2.dp, SolidColor(Color.Black)))
                             .testTag(childIconTag)
                             .pointerHoverIcon(desiredChildIcon, overrideDescendants = false)
                     ) {
                         Box(
-                            Modifier
-                                .padding(40.dp)
+                            Modifier.padding(40.dp)
                                 .requiredSize(100.dp)
                                 .border(BorderStroke(2.dp, SolidColor(Color.Blue)))
                                 .testTag(grandchildIconTag)
@@ -2139,9 +1791,7 @@
             }
         }
         // Verify initial state of pointer icon
-        rule.runOnIdle {
-            assertThat(iconService.getIcon()).isEqualTo(desiredDefaultIcon)
-        }
+        rule.runOnIdle { assertThat(iconService.getIcon()).isEqualTo(desiredDefaultIcon) }
         // Verify Grandchild Box's icon is the desired grandchild icon
         verifyIconOnHover(grandchildIconTag, desiredGrandchildIcon)
         // Verify remaining Child Box's icon is the desired child icon
@@ -2151,60 +1801,50 @@
     }
 
     /**
-     * Setup:
-     * The hierarchy for this test is setup as:
-     *  Parent Box (custom icon = [PointerIcon.Crosshair], overrideDescendants = FALSE)
-     *    ⤷ Child Box (custom icon = [PointerIcon.Text], overrideDescendants = FALSE)
-     *        ⤷ Grandchild Box (custom icon = [PointerIcon.Hand], overrideDescendants = TRUE)
+     * Setup: The hierarchy for this test is setup as: Parent Box (custom icon =
+     * [PointerIcon.Crosshair], overrideDescendants = FALSE) ⤷ Child Box (custom icon =
+     * [PointerIcon.Text], overrideDescendants = FALSE) ⤷ Grandchild Box (custom icon =
+     * [PointerIcon.Hand], overrideDescendants = TRUE)
      *
-     *  Expected Output:
-     *  Grandchild Box's [PointerIcon.Hand] wins for the entire surface area of the Grandchild Box.
-     *  Child Box's [PointerIcon.Text] wins for the remaining surface area of the Child Box not
-     *  covered by the Grandchild Box. Parent Box’s [PointerIcon.Crosshair] wins for the remaining
-     *  surface area not covered by the Child Box.
+     * Expected Output: Grandchild Box's [PointerIcon.Hand] wins for the entire surface area of the
+     * Grandchild Box. Child Box's [PointerIcon.Text] wins for the remaining surface area of the
+     * Child Box not covered by the Grandchild Box. Parent Box’s [PointerIcon.Crosshair] wins for
+     * the remaining surface area not covered by the Child Box.
      *
-     *  Parent Box (output icon = [PointerIcon.Crosshair])
-     *    ⤷ Child Box (output icon = [PointerIcon.Text])
-     *        ⤷ Grandchild Box (output icon = [PointerIcon.Hand])
+     * Parent Box (output icon = [PointerIcon.Crosshair]) ⤷ Child Box (output icon =
+     * [PointerIcon.Text]) ⤷ Grandchild Box (output icon = [PointerIcon.Hand])
      */
     @Test
     fun multiLayeredNesting_allCustomIconsGrandchildOverrides() {
         rule.setContent {
             CompositionLocalProvider(LocalPointerIconService provides iconService) {
                 Box(
-                    modifier = Modifier
-                        .requiredSize(200.dp)
-                        .border(BorderStroke(2.dp, SolidColor(Color.Red)))
-                        .testTag(parentIconTag)
-                        .pointerHoverIcon(desiredParentIcon, overrideDescendants = false)
+                    modifier =
+                        Modifier.requiredSize(200.dp)
+                            .border(BorderStroke(2.dp, SolidColor(Color.Red)))
+                            .testTag(parentIconTag)
+                            .pointerHoverIcon(desiredParentIcon, overrideDescendants = false)
                 ) {
                     Box(
-                        Modifier
-                            .padding(20.dp)
+                        Modifier.padding(20.dp)
                             .requiredSize(150.dp)
                             .border(BorderStroke(2.dp, SolidColor(Color.Black)))
                             .testTag(childIconTag)
                             .pointerHoverIcon(desiredChildIcon, overrideDescendants = false)
                     ) {
                         Box(
-                            Modifier
-                                .padding(40.dp)
+                            Modifier.padding(40.dp)
                                 .requiredSize(100.dp)
                                 .border(BorderStroke(2.dp, SolidColor(Color.Blue)))
                                 .testTag(grandchildIconTag)
-                                .pointerHoverIcon(
-                                    desiredGrandchildIcon,
-                                    overrideDescendants = true
-                                )
+                                .pointerHoverIcon(desiredGrandchildIcon, overrideDescendants = true)
                         )
                     }
                 }
             }
         }
         // Verify initial state of pointer icon
-        rule.runOnIdle {
-            assertThat(iconService.getIcon()).isEqualTo(desiredDefaultIcon)
-        }
+        rule.runOnIdle { assertThat(iconService.getIcon()).isEqualTo(desiredDefaultIcon) }
         // Verify Grandchild Box's icon is the desired grandchild icon
         verifyIconOnHover(grandchildIconTag, desiredGrandchildIcon)
         // Verify remaining Child Box's icon is the desired child icon
@@ -2214,42 +1854,37 @@
     }
 
     /**
-     * Setup:
-     * The hierarchy for this test is setup as:
-     *  Parent Box (custom icon = [PointerIcon.Crosshair], overrideDescendants = FALSE)
-     *    ⤷ Child Box (custom icon = [PointerIcon.Text], overrideDescendants = TRUE)
-     *        ⤷ Grandchild Box (custom icon = [PointerIcon.Hand], overrideDescendants = FALSE)
+     * Setup: The hierarchy for this test is setup as: Parent Box (custom icon =
+     * [PointerIcon.Crosshair], overrideDescendants = FALSE) ⤷ Child Box (custom icon =
+     * [PointerIcon.Text], overrideDescendants = TRUE) ⤷ Grandchild Box (custom icon =
+     * [PointerIcon.Hand], overrideDescendants = FALSE)
      *
-     *  Expected Output:
-     *  Child Box's [PointerIcon.Hand] wins for the entire surface area of its Box. Parent
-     *  Box’s [PointerIcon.Crosshair] wins for the remaining surface area of its Box.
+     * Expected Output: Child Box's [PointerIcon.Hand] wins for the entire surface area of its Box.
+     * Parent Box’s [PointerIcon.Crosshair] wins for the remaining surface area of its Box.
      *
-     *  Parent Box (output icon = [PointerIcon.Crosshair])
-     *    ⤷ Child Box (output icon = [PointerIcon.Text])
-     *        ⤷ Grandchild Box (output icon = [PointerIcon.Text])
+     * Parent Box (output icon = [PointerIcon.Crosshair]) ⤷ Child Box (output icon =
+     * [PointerIcon.Text]) ⤷ Grandchild Box (output icon = [PointerIcon.Text])
      */
     @Test
     fun multiLayeredNesting_allCustomIconsChildOverrides() {
         rule.setContent {
             CompositionLocalProvider(LocalPointerIconService provides iconService) {
                 Box(
-                    modifier = Modifier
-                        .requiredSize(200.dp)
-                        .border(BorderStroke(2.dp, SolidColor(Color.Red)))
-                        .testTag(parentIconTag)
-                        .pointerHoverIcon(desiredParentIcon, overrideDescendants = false)
+                    modifier =
+                        Modifier.requiredSize(200.dp)
+                            .border(BorderStroke(2.dp, SolidColor(Color.Red)))
+                            .testTag(parentIconTag)
+                            .pointerHoverIcon(desiredParentIcon, overrideDescendants = false)
                 ) {
                     Box(
-                        Modifier
-                            .padding(20.dp)
+                        Modifier.padding(20.dp)
                             .requiredSize(150.dp)
                             .border(BorderStroke(2.dp, SolidColor(Color.Black)))
                             .testTag(childIconTag)
                             .pointerHoverIcon(desiredChildIcon, overrideDescendants = true)
                     ) {
                         Box(
-                            Modifier
-                                .padding(40.dp)
+                            Modifier.padding(40.dp)
                                 .requiredSize(100.dp)
                                 .border(BorderStroke(2.dp, SolidColor(Color.Blue)))
                                 .testTag(grandchildIconTag)
@@ -2263,9 +1898,7 @@
             }
         }
         // Verify initial state of pointer icon
-        rule.runOnIdle {
-            assertThat(iconService.getIcon()).isEqualTo(desiredDefaultIcon)
-        }
+        rule.runOnIdle { assertThat(iconService.getIcon()).isEqualTo(desiredDefaultIcon) }
         // Verify Child Box's icon is the desired child icon
         verifyIconOnHover(childIconTag, desiredChildIcon)
         // Verify Grandchild Box is respecting Child Box's icon
@@ -2275,61 +1908,51 @@
     }
 
     /**
-     * Setup:
-     * The hierarchy for this test is setup as:
-     *  Parent Box (custom icon = [PointerIcon.Crosshair], overrideDescendants = FALSE)
-     *    ⤷ Child Box (custom icon = [PointerIcon.Text], overrideDescendants = TRUE)
-     *        ⤷ Grandchild Box (custom icon = [PointerIcon.Hand], overrideDescendants = TRUE)
+     * Setup: The hierarchy for this test is setup as: Parent Box (custom icon =
+     * [PointerIcon.Crosshair], overrideDescendants = FALSE) ⤷ Child Box (custom icon =
+     * [PointerIcon.Text], overrideDescendants = TRUE) ⤷ Grandchild Box (custom icon =
+     * [PointerIcon.Hand], overrideDescendants = TRUE)
      *
-     *  Expected Output:
-     *  Child Box's [PointerIcon.Hand] wins for the entire surface area of its Box. Parent
-     *  Box’s [PointerIcon.Crosshair] wins for the remaining surface area of its Box. The addition
-     *  of Grandchild Box’s overrideDescendants = true in this test doesn’t impact the outcome; this
-     *  is because Child Box is Grandchild Box's parent in the hierarchy and it already has
-     *  overrideDescendants = true, which takes priority over anything Grandchild Box sets.
+     * Expected Output: Child Box's [PointerIcon.Hand] wins for the entire surface area of its Box.
+     * Parent Box’s [PointerIcon.Crosshair] wins for the remaining surface area of its Box. The
+     * addition of Grandchild Box’s overrideDescendants = true in this test doesn’t impact the
+     * outcome; this is because Child Box is Grandchild Box's parent in the hierarchy and it already
+     * has overrideDescendants = true, which takes priority over anything Grandchild Box sets.
      *
-     *  Parent Box (output icon = [PointerIcon.Crosshair])
-     *    ⤷ Child Box (output icon = [PointerIcon.Text])
-     *        ⤷ Grandchild Box (output icon = [PointerIcon.Text])
+     * Parent Box (output icon = [PointerIcon.Crosshair]) ⤷ Child Box (output icon =
+     * [PointerIcon.Text]) ⤷ Grandchild Box (output icon = [PointerIcon.Text])
      */
     @Test
     fun multiLayeredNesting_allCustomIconsChildAndGrandchildOverrides() {
         rule.setContent {
             CompositionLocalProvider(LocalPointerIconService provides iconService) {
                 Box(
-                    modifier = Modifier
-                        .requiredSize(200.dp)
-                        .border(BorderStroke(2.dp, SolidColor(Color.Red)))
-                        .testTag(parentIconTag)
-                        .pointerHoverIcon(desiredParentIcon, overrideDescendants = false)
+                    modifier =
+                        Modifier.requiredSize(200.dp)
+                            .border(BorderStroke(2.dp, SolidColor(Color.Red)))
+                            .testTag(parentIconTag)
+                            .pointerHoverIcon(desiredParentIcon, overrideDescendants = false)
                 ) {
                     Box(
-                        Modifier
-                            .padding(20.dp)
+                        Modifier.padding(20.dp)
                             .requiredSize(150.dp)
                             .border(BorderStroke(2.dp, SolidColor(Color.Black)))
                             .testTag(childIconTag)
                             .pointerHoverIcon(desiredChildIcon, overrideDescendants = true)
                     ) {
                         Box(
-                            Modifier
-                                .padding(40.dp)
+                            Modifier.padding(40.dp)
                                 .requiredSize(100.dp)
                                 .border(BorderStroke(2.dp, SolidColor(Color.Blue)))
                                 .testTag(grandchildIconTag)
-                                .pointerHoverIcon(
-                                    desiredGrandchildIcon,
-                                    overrideDescendants = true
-                                )
+                                .pointerHoverIcon(desiredGrandchildIcon, overrideDescendants = true)
                         )
                     }
                 }
             }
         }
         // Verify initial state of pointer icon
-        rule.runOnIdle {
-            assertThat(iconService.getIcon()).isEqualTo(desiredDefaultIcon)
-        }
+        rule.runOnIdle { assertThat(iconService.getIcon()).isEqualTo(desiredDefaultIcon) }
         // Verify Child Box's icon is the desired child icon
         verifyIconOnHover(childIconTag, desiredChildIcon)
         // Verify Grandchild Box is respecting Child Box's icon
@@ -2339,42 +1962,36 @@
     }
 
     /**
-     * Setup:
-     * The hierarchy for this test is setup as:
-     *  Parent Box (custom icon = [PointerIcon.Crosshair], overrideDescendants = TRUE)
-     *    ⤷ Child Box (no icon set)
-     *        ⤷ Grandchild Box (custom icon = [PointerIcon.Hand], overrideDescendants = FALSE)
+     * Setup: The hierarchy for this test is setup as: Parent Box (custom icon =
+     * [PointerIcon.Crosshair], overrideDescendants = TRUE) ⤷ Child Box (no icon set) ⤷ Grandchild
+     * Box (custom icon = [PointerIcon.Hand], overrideDescendants = FALSE)
      *
-     *  Expected Output:
-     *  Parent Box’s [PointerIcon.Crosshair] wins for the entire surface area of its Box. Even
-     *  though the Grandchild Box’s icon was set, the Parent Box will always take priority because
-     *  it's the highestmost level in the hierarchy where overrideDescendants = true.
+     * Expected Output: Parent Box’s [PointerIcon.Crosshair] wins for the entire surface area of its
+     * Box. Even though the Grandchild Box’s icon was set, the Parent Box will always take priority
+     * because it's the highestmost level in the hierarchy where overrideDescendants = true.
      *
-     *  Parent Box (output icon = [PointerIcon.Crosshair])
-     *    ⤷ Child Box (output icon = [PointerIcon.Crosshair])
-     *        ⤷ Grandchild Box (output icon = [PointerIcon.Crosshair])
+     * Parent Box (output icon = [PointerIcon.Crosshair]) ⤷ Child Box (output icon =
+     * [PointerIcon.Crosshair]) ⤷ Grandchild Box (output icon = [PointerIcon.Crosshair])
      */
     @Test
     fun multiLayeredNesting_parentGrandChildCustomIconsParentOverrides() {
         rule.setContent {
             CompositionLocalProvider(LocalPointerIconService provides iconService) {
                 Box(
-                    modifier = Modifier
-                        .requiredSize(200.dp)
-                        .border(BorderStroke(2.dp, SolidColor(Color.Red)))
-                        .testTag(parentIconTag)
-                        .pointerHoverIcon(desiredParentIcon, overrideDescendants = true)
+                    modifier =
+                        Modifier.requiredSize(200.dp)
+                            .border(BorderStroke(2.dp, SolidColor(Color.Red)))
+                            .testTag(parentIconTag)
+                            .pointerHoverIcon(desiredParentIcon, overrideDescendants = true)
                 ) {
                     Box(
-                        Modifier
-                            .padding(20.dp)
+                        Modifier.padding(20.dp)
                             .requiredSize(150.dp)
                             .border(BorderStroke(2.dp, SolidColor(Color.Black)))
                             .testTag(childIconTag)
                     ) {
                         Box(
-                            Modifier
-                                .padding(40.dp)
+                            Modifier.padding(40.dp)
                                 .requiredSize(100.dp)
                                 .border(BorderStroke(2.dp, SolidColor(Color.Blue)))
                                 .testTag(grandchildIconTag)
@@ -2388,9 +2005,7 @@
             }
         }
         // Verify initial state of pointer icon
-        rule.runOnIdle {
-            assertThat(iconService.getIcon()).isEqualTo(desiredDefaultIcon)
-        }
+        rule.runOnIdle { assertThat(iconService.getIcon()).isEqualTo(desiredDefaultIcon) }
         // Verify Parent Box's icon is the desired parent icon
         verifyIconOnHover(parentIconTag, desiredParentIcon)
         // Verify Child Box is respecting Parent Box's icon
@@ -2400,59 +2015,48 @@
     }
 
     /**
-     * Setup:
-     * The hierarchy for this test is setup as:
-     *  Parent Box (custom icon = [PointerIcon.Crosshair], overrideDescendants = TRUE)
-     *    ⤷ Child Box (no icon set)
-     *        ⤷ Grandchild Box (custom icon = [PointerIcon.Hand], overrideDescendants = TRUE)
+     * Setup: The hierarchy for this test is setup as: Parent Box (custom icon =
+     * [PointerIcon.Crosshair], overrideDescendants = TRUE) ⤷ Child Box (no icon set) ⤷ Grandchild
+     * Box (custom icon = [PointerIcon.Hand], overrideDescendants = TRUE)
      *
-     *  Expected Output:
-     *  Parent Box’s [PointerIcon.Crosshair] wins for the entire surface area of its Box. Even
-     *  though the Grandchild Box’s icon was set, the Parent Box will always take priority because
-     *  it's the highestmost level in the hierarchy where overrideDescendants = true.
+     * Expected Output: Parent Box’s [PointerIcon.Crosshair] wins for the entire surface area of its
+     * Box. Even though the Grandchild Box’s icon was set, the Parent Box will always take priority
+     * because it's the highestmost level in the hierarchy where overrideDescendants = true.
      *
-     *  Parent Box (output icon = [PointerIcon.Crosshair])
-     *    ⤷ Child Box (output icon = [PointerIcon.Crosshair])
-     *        ⤷ Grandchild Box (output icon = [PointerIcon.Crosshair])
+     * Parent Box (output icon = [PointerIcon.Crosshair]) ⤷ Child Box (output icon =
+     * [PointerIcon.Crosshair]) ⤷ Grandchild Box (output icon = [PointerIcon.Crosshair])
      */
     @Test
     fun multiLayeredNesting_parentGrandChildCustomIconsBothOverride() {
         rule.setContent {
             CompositionLocalProvider(LocalPointerIconService provides iconService) {
                 Box(
-                    modifier = Modifier
-                        .requiredSize(200.dp)
-                        .border(BorderStroke(2.dp, SolidColor(Color.Red)))
-                        .testTag(parentIconTag)
-                        .pointerHoverIcon(desiredParentIcon, overrideDescendants = true)
+                    modifier =
+                        Modifier.requiredSize(200.dp)
+                            .border(BorderStroke(2.dp, SolidColor(Color.Red)))
+                            .testTag(parentIconTag)
+                            .pointerHoverIcon(desiredParentIcon, overrideDescendants = true)
                 ) {
                     Box(
-                        Modifier
-                            .padding(20.dp)
+                        Modifier.padding(20.dp)
                             .requiredSize(150.dp)
                             .border(BorderStroke(2.dp, SolidColor(Color.Black)))
                             .testTag(childIconTag)
                             .pointerHoverIcon(desiredChildIcon, overrideDescendants = false)
                     ) {
                         Box(
-                            Modifier
-                                .padding(40.dp)
+                            Modifier.padding(40.dp)
                                 .requiredSize(100.dp)
                                 .border(BorderStroke(2.dp, SolidColor(Color.Blue)))
                                 .testTag(grandchildIconTag)
-                                .pointerHoverIcon(
-                                    desiredGrandchildIcon,
-                                    overrideDescendants = true
-                                )
+                                .pointerHoverIcon(desiredGrandchildIcon, overrideDescendants = true)
                         )
                     }
                 }
             }
         }
         // Verify initial state of pointer icon
-        rule.runOnIdle {
-            assertThat(iconService.getIcon()).isEqualTo(desiredDefaultIcon)
-        }
+        rule.runOnIdle { assertThat(iconService.getIcon()).isEqualTo(desiredDefaultIcon) }
         // Verify Parent Box's icon is the desired parent icon
         verifyIconOnHover(parentIconTag, desiredParentIcon)
         // Verify Child Box is respecting Parent Box's icon
@@ -2462,44 +2066,39 @@
     }
 
     /**
-     * Setup:
-     * The hierarchy for this test is setup as:
-     *  Parent Box (custom icon = [PointerIcon.Crosshair], overrideDescendants = TRUE)
-     *    ⤷ Child Box (custom icon = [PointerIcon.Text], overrideDescendants = FALSE)
-     *        ⤷ Grandchild Box (custom icon = [PointerIcon.Hand], overrideDescendants = FALSE)
+     * Setup: The hierarchy for this test is setup as: Parent Box (custom icon =
+     * [PointerIcon.Crosshair], overrideDescendants = TRUE) ⤷ Child Box (custom icon =
+     * [PointerIcon.Text], overrideDescendants = FALSE) ⤷ Grandchild Box (custom icon =
+     * [PointerIcon.Hand], overrideDescendants = FALSE)
      *
-     *  Expected Output:
-     *  Parent Box’s [PointerIcon.Crosshair] wins for the entire surface area of its Box. Even
-     *  though the Child and Grandchild Box’s icons were set, the Parent Box will always take
-     *  priority because it's the highestmost level in the hierarchy where overrideDescendants =
-     *  true.
+     * Expected Output: Parent Box’s [PointerIcon.Crosshair] wins for the entire surface area of its
+     * Box. Even though the Child and Grandchild Box’s icons were set, the Parent Box will always
+     * take priority because it's the highestmost level in the hierarchy where overrideDescendants =
+     * true.
      *
-     *  Parent Box (output icon = [PointerIcon.Crosshair])
-     *    ⤷ Child Box (output icon = [PointerIcon.Crosshair])
-     *        ⤷ Grandchild Box (output icon = [PointerIcon.Crosshair])
+     * Parent Box (output icon = [PointerIcon.Crosshair]) ⤷ Child Box (output icon =
+     * [PointerIcon.Crosshair]) ⤷ Grandchild Box (output icon = [PointerIcon.Crosshair])
      */
     @Test
     fun multiLayeredNesting_allCustomIconsParentOverrides() {
         rule.setContent {
             CompositionLocalProvider(LocalPointerIconService provides iconService) {
                 Box(
-                    modifier = Modifier
-                        .requiredSize(200.dp)
-                        .border(BorderStroke(2.dp, SolidColor(Color.Red)))
-                        .testTag(parentIconTag)
-                        .pointerHoverIcon(desiredParentIcon, overrideDescendants = true)
+                    modifier =
+                        Modifier.requiredSize(200.dp)
+                            .border(BorderStroke(2.dp, SolidColor(Color.Red)))
+                            .testTag(parentIconTag)
+                            .pointerHoverIcon(desiredParentIcon, overrideDescendants = true)
                 ) {
                     Box(
-                        Modifier
-                            .padding(20.dp)
+                        Modifier.padding(20.dp)
                             .requiredSize(150.dp)
                             .border(BorderStroke(2.dp, SolidColor(Color.Black)))
                             .testTag(childIconTag)
                             .pointerHoverIcon(desiredChildIcon, overrideDescendants = false)
                     ) {
                         Box(
-                            Modifier
-                                .padding(40.dp)
+                            Modifier.padding(40.dp)
                                 .requiredSize(100.dp)
                                 .border(BorderStroke(2.dp, SolidColor(Color.Blue)))
                                 .testTag(grandchildIconTag)
@@ -2513,9 +2112,7 @@
             }
         }
         // Verify initial state of pointer icon
-        rule.runOnIdle {
-            assertThat(iconService.getIcon()).isEqualTo(desiredDefaultIcon)
-        }
+        rule.runOnIdle { assertThat(iconService.getIcon()).isEqualTo(desiredDefaultIcon) }
         // Verify Parent Box's icon is the desired parent icon
         verifyIconOnHover(parentIconTag, desiredParentIcon)
         // Verify Child Box is respecting Parent Box's icon
@@ -2525,60 +2122,50 @@
     }
 
     /**
-     * Setup:
-     * The hierarchy for this test is setup as:
-     *  Parent Box (custom icon = [PointerIcon.Crosshair], overrideDescendants = TRUE)
-     *    ⤷ Child Box (custom icon = [PointerIcon.Text], overrideDescendants = FALSE)
-     *        ⤷ Grandchild Box (custom icon = [PointerIcon.Hand], overrideDescendants = TRUE)
+     * Setup: The hierarchy for this test is setup as: Parent Box (custom icon =
+     * [PointerIcon.Crosshair], overrideDescendants = TRUE) ⤷ Child Box (custom icon =
+     * [PointerIcon.Text], overrideDescendants = FALSE) ⤷ Grandchild Box (custom icon =
+     * [PointerIcon.Hand], overrideDescendants = TRUE)
      *
-     *  Expected Output:
-     *  Parent Box’s [PointerIcon.Crosshair] wins for the entire surface area of its Box. Even
-     *  though the Child and Grandchild Box’s icons were set, the Parent Box will always take
-     *  priority because it's the highestmost level in the hierarchy where overrideDescendants =
-     *  true.
+     * Expected Output: Parent Box’s [PointerIcon.Crosshair] wins for the entire surface area of its
+     * Box. Even though the Child and Grandchild Box’s icons were set, the Parent Box will always
+     * take priority because it's the highestmost level in the hierarchy where overrideDescendants =
+     * true.
      *
-     *  Parent Box (output icon = [PointerIcon.Crosshair])
-     *    ⤷ Child Box (output icon = [PointerIcon.Crosshair])
-     *        ⤷ Grandchild Box (output icon = [PointerIcon.Crosshair])
+     * Parent Box (output icon = [PointerIcon.Crosshair]) ⤷ Child Box (output icon =
+     * [PointerIcon.Crosshair]) ⤷ Grandchild Box (output icon = [PointerIcon.Crosshair])
      */
     @Test
     fun multiLayeredNesting_allCustomIconsParentAndGrandchildOverride() {
         rule.setContent {
             CompositionLocalProvider(LocalPointerIconService provides iconService) {
                 Box(
-                    modifier = Modifier
-                        .requiredSize(200.dp)
-                        .border(BorderStroke(2.dp, SolidColor(Color.Red)))
-                        .testTag(parentIconTag)
-                        .pointerHoverIcon(desiredParentIcon, overrideDescendants = true)
+                    modifier =
+                        Modifier.requiredSize(200.dp)
+                            .border(BorderStroke(2.dp, SolidColor(Color.Red)))
+                            .testTag(parentIconTag)
+                            .pointerHoverIcon(desiredParentIcon, overrideDescendants = true)
                 ) {
                     Box(
-                        Modifier
-                            .padding(20.dp)
+                        Modifier.padding(20.dp)
                             .requiredSize(150.dp)
                             .border(BorderStroke(2.dp, SolidColor(Color.Black)))
                             .testTag(childIconTag)
                             .pointerHoverIcon(desiredChildIcon, overrideDescendants = false)
                     ) {
                         Box(
-                            Modifier
-                                .padding(40.dp)
+                            Modifier.padding(40.dp)
                                 .requiredSize(100.dp)
                                 .border(BorderStroke(2.dp, SolidColor(Color.Blue)))
                                 .testTag(grandchildIconTag)
-                                .pointerHoverIcon(
-                                    desiredGrandchildIcon,
-                                    overrideDescendants = true
-                                )
+                                .pointerHoverIcon(desiredGrandchildIcon, overrideDescendants = true)
                         )
                     }
                 }
             }
         }
         // Verify initial state of pointer icon
-        rule.runOnIdle {
-            assertThat(iconService.getIcon()).isEqualTo(desiredDefaultIcon)
-        }
+        rule.runOnIdle { assertThat(iconService.getIcon()).isEqualTo(desiredDefaultIcon) }
         // Verify Parent Box's icon is the desired parent icon
         verifyIconOnHover(parentIconTag, desiredParentIcon)
         // Verify Child Box is respecting Parent Box's icon
@@ -2588,44 +2175,39 @@
     }
 
     /**
-     * Setup:
-     * The hierarchy for this test is setup as:
-     *  Parent Box (custom icon = [PointerIcon.Crosshair], overrideDescendants = TRUE)
-     *    ⤷ Child Box (custom icon = [PointerIcon.Text], overrideDescendants = TRUE)
-     *        ⤷ Grandchild Box (custom icon = [PointerIcon.Hand], overrideDescendants = FALSE)
+     * Setup: The hierarchy for this test is setup as: Parent Box (custom icon =
+     * [PointerIcon.Crosshair], overrideDescendants = TRUE) ⤷ Child Box (custom icon =
+     * [PointerIcon.Text], overrideDescendants = TRUE) ⤷ Grandchild Box (custom icon =
+     * [PointerIcon.Hand], overrideDescendants = FALSE)
      *
-     *  Expected Output:
-     *  Parent Box’s [PointerIcon.Crosshair] wins for the entire surface area of its Box. Even
-     *  though the Child and Grandchild Box’s icons were set, the Parent Box will always take
-     *  priority because it's the highestmost level in the hierarchy where overrideDescendants =
-     *  true.
+     * Expected Output: Parent Box’s [PointerIcon.Crosshair] wins for the entire surface area of its
+     * Box. Even though the Child and Grandchild Box’s icons were set, the Parent Box will always
+     * take priority because it's the highestmost level in the hierarchy where overrideDescendants =
+     * true.
      *
-     *  Parent Box (output icon = [PointerIcon.Crosshair])
-     *    ⤷ Child Box (output icon = [PointerIcon.Crosshair])
-     *        ⤷ Grandchild Box (output icon = [PointerIcon.Crosshair])
+     * Parent Box (output icon = [PointerIcon.Crosshair]) ⤷ Child Box (output icon =
+     * [PointerIcon.Crosshair]) ⤷ Grandchild Box (output icon = [PointerIcon.Crosshair])
      */
     @Test
     fun multiLayeredNesting_allCustomIconsParentAndChildOverride() {
         rule.setContent {
             CompositionLocalProvider(LocalPointerIconService provides iconService) {
                 Box(
-                    modifier = Modifier
-                        .requiredSize(200.dp)
-                        .border(BorderStroke(2.dp, SolidColor(Color.Red)))
-                        .testTag(parentIconTag)
-                        .pointerHoverIcon(desiredParentIcon, overrideDescendants = true)
+                    modifier =
+                        Modifier.requiredSize(200.dp)
+                            .border(BorderStroke(2.dp, SolidColor(Color.Red)))
+                            .testTag(parentIconTag)
+                            .pointerHoverIcon(desiredParentIcon, overrideDescendants = true)
                 ) {
                     Box(
-                        Modifier
-                            .padding(20.dp)
+                        Modifier.padding(20.dp)
                             .requiredSize(150.dp)
                             .border(BorderStroke(2.dp, SolidColor(Color.Black)))
                             .testTag(childIconTag)
                             .pointerHoverIcon(desiredChildIcon, overrideDescendants = true)
                     ) {
                         Box(
-                            Modifier
-                                .padding(40.dp)
+                            Modifier.padding(40.dp)
                                 .requiredSize(100.dp)
                                 .border(BorderStroke(2.dp, SolidColor(Color.Blue)))
                                 .testTag(grandchildIconTag)
@@ -2639,9 +2221,7 @@
             }
         }
         // Verify initial state of pointer icon
-        rule.runOnIdle {
-            assertThat(iconService.getIcon()).isEqualTo(desiredDefaultIcon)
-        }
+        rule.runOnIdle { assertThat(iconService.getIcon()).isEqualTo(desiredDefaultIcon) }
         // Verify Parent Box's icon is the desired parent icon
         verifyIconOnHover(parentIconTag, desiredParentIcon)
         // Verify Child Box is respecting Parent Box's icon
@@ -2651,60 +2231,50 @@
     }
 
     /**
-     * Setup:
-     * The hierarchy for this test is setup as:
-     *  Parent Box (custom icon = [PointerIcon.Crosshair], overrideDescendants = TRUE)
-     *    ⤷ Child Box (custom icon = [PointerIcon.Text], overrideDescendants = TRUE)
-     *        ⤷ Grandchild Box (custom icon = [PointerIcon.Hand], overrideDescendants = TRUE)
+     * Setup: The hierarchy for this test is setup as: Parent Box (custom icon =
+     * [PointerIcon.Crosshair], overrideDescendants = TRUE) ⤷ Child Box (custom icon =
+     * [PointerIcon.Text], overrideDescendants = TRUE) ⤷ Grandchild Box (custom icon =
+     * [PointerIcon.Hand], overrideDescendants = TRUE)
      *
-     *  Expected Output:
-     *  Parent Box’s [PointerIcon.Crosshair] wins for the entire surface area of its Box. Even
-     *  though the Child and Grandchild Box’s icons were set, the Parent Box will always take
-     *  priority because it's the highestmost level in the hierarchy where overrideDescendants =
-     *  true.
+     * Expected Output: Parent Box’s [PointerIcon.Crosshair] wins for the entire surface area of its
+     * Box. Even though the Child and Grandchild Box’s icons were set, the Parent Box will always
+     * take priority because it's the highestmost level in the hierarchy where overrideDescendants =
+     * true.
      *
-     *  Parent Box (output icon = [PointerIcon.Crosshair])
-     *    ⤷ Child Box (output icon = [PointerIcon.Crosshair])
-     *        ⤷ Grandchild Box (output icon = [PointerIcon.Crosshair])
+     * Parent Box (output icon = [PointerIcon.Crosshair]) ⤷ Child Box (output icon =
+     * [PointerIcon.Crosshair]) ⤷ Grandchild Box (output icon = [PointerIcon.Crosshair])
      */
     @Test
     fun multiLayeredNesting_allIconsOverride() {
         rule.setContent {
             CompositionLocalProvider(LocalPointerIconService provides iconService) {
                 Box(
-                    modifier = Modifier
-                        .requiredSize(200.dp)
-                        .border(BorderStroke(2.dp, SolidColor(Color.Red)))
-                        .testTag(parentIconTag)
-                        .pointerHoverIcon(desiredParentIcon, overrideDescendants = true)
+                    modifier =
+                        Modifier.requiredSize(200.dp)
+                            .border(BorderStroke(2.dp, SolidColor(Color.Red)))
+                            .testTag(parentIconTag)
+                            .pointerHoverIcon(desiredParentIcon, overrideDescendants = true)
                 ) {
                     Box(
-                        Modifier
-                            .padding(20.dp)
+                        Modifier.padding(20.dp)
                             .requiredSize(150.dp)
                             .border(BorderStroke(2.dp, SolidColor(Color.Black)))
                             .testTag(childIconTag)
                             .pointerHoverIcon(desiredChildIcon, overrideDescendants = true)
                     ) {
                         Box(
-                            Modifier
-                                .padding(40.dp)
+                            Modifier.padding(40.dp)
                                 .requiredSize(100.dp)
                                 .border(BorderStroke(2.dp, SolidColor(Color.Blue)))
                                 .testTag(grandchildIconTag)
-                                .pointerHoverIcon(
-                                    desiredGrandchildIcon,
-                                    overrideDescendants = true
-                                )
+                                .pointerHoverIcon(desiredGrandchildIcon, overrideDescendants = true)
                         )
                     }
                 }
             }
         }
         // Verify initial state of pointer icon
-        rule.runOnIdle {
-            assertThat(iconService.getIcon()).isEqualTo(desiredDefaultIcon)
-        }
+        rule.runOnIdle { assertThat(iconService.getIcon()).isEqualTo(desiredDefaultIcon) }
         // Verify Parent Box's icon is the desired parent icon
         verifyIconOnHover(parentIconTag, desiredParentIcon)
         // Verify Child Box is respecting Parent Box's icon
@@ -2724,15 +2294,14 @@
         rule.setContent {
             CompositionLocalProvider(LocalPointerIconService provides iconService) {
                 Box(
-                    modifier = Modifier
-                        .requiredSize(200.dp)
-                        .border(BorderStroke(2.dp, SolidColor(Color.Red)))
-                        .testTag(parentIconTag)
-                        .pointerHoverIcon(desiredParentIcon, overrideDescendants = false)
+                    modifier =
+                        Modifier.requiredSize(200.dp)
+                            .border(BorderStroke(2.dp, SolidColor(Color.Red)))
+                            .testTag(parentIconTag)
+                            .pointerHoverIcon(desiredParentIcon, overrideDescendants = false)
                 ) {
                     Box(
-                        Modifier
-                            .padding(20.dp)
+                        Modifier.padding(20.dp)
                             .requiredSize(100.dp)
                             .border(BorderStroke(2.dp, SolidColor(Color.Black)))
                             .testTag(childIconTag)
@@ -2743,13 +2312,9 @@
         }
 
         // Verify initial state of pointer icon
-        rule.runOnIdle {
-            assertThat(iconService.getIcon()).isEqualTo(desiredDefaultIcon)
-        }
+        rule.runOnIdle { assertThat(iconService.getIcon()).isEqualTo(desiredDefaultIcon) }
         // Hover over Child Box
-        rule.onNodeWithTag(childIconTag).performMouseInput {
-            enter(bottomRight)
-        }
+        rule.onNodeWithTag(childIconTag).performMouseInput { enter(bottomRight) }
         // Verify Child Box has the desired child icon and dynamically update the icon assigned to
         // the Child Box while hovering over Child Box
         rule.runOnIdle {
@@ -2757,40 +2322,31 @@
             icon.value = desiredGrandchildIcon
         }
         // Verify the icon has been updated to the desired grandchild icon
-        rule.runOnIdle {
-            assertThat(iconService.getIcon()).isEqualTo(desiredGrandchildIcon)
-        }
+        rule.runOnIdle { assertThat(iconService.getIcon()).isEqualTo(desiredGrandchildIcon) }
         // Move cursor within Child Box and verify it still has the updated icon
-        rule.onNodeWithTag(childIconTag).performMouseInput {
-            moveTo(centerRight)
-        }
-        rule.runOnIdle {
-            assertThat(iconService.getIcon()).isEqualTo(desiredGrandchildIcon)
-        }
+        rule.onNodeWithTag(childIconTag).performMouseInput { moveTo(centerRight) }
+        rule.runOnIdle { assertThat(iconService.getIcon()).isEqualTo(desiredGrandchildIcon) }
         // Exit hovering over Child Box
-        rule.onNodeWithTag(childIconTag).performMouseInput {
-            exit()
-        }
+        rule.onNodeWithTag(childIconTag).performMouseInput { exit() }
     }
 
     /**
-     * Setup:
-     * The hierarchy for the initial setup of this test is:
-     *  Parent Box (custom icon = [PointerIcon.Crosshair], overrideDescendants = FALSE)
+     * Setup: The hierarchy for the initial setup of this test is: Parent Box (custom icon =
+     * [PointerIcon.Crosshair], overrideDescendants = FALSE)
      *
-     *  After hovering over the center of the screen, the hierarchy under the cursor updates to:
-     *  Parent Box (custom icon = [PointerIcon.Crosshair], overrideDescendants = FALSE)
-     *    ⤷ Child Box (custom icon = [PointerIcon.Text], overrideDescendants = FALSE)
+     * After hovering over the center of the screen, the hierarchy under the cursor updates to:
+     * Parent Box (custom icon = [PointerIcon.Crosshair], overrideDescendants = FALSE) ⤷ Child Box
+     * (custom icon = [PointerIcon.Text], overrideDescendants = FALSE)
      *
-     *  Expected Output:
-     *  Initially, the Parent Box's [PointerIcon.Crosshair] should win for its entire surface area
-     *  because it has no competition in the hierarchy for any other custom icons. After the Child
-     *  Box is dynamically added under the cursor, the Child Box's [PointerIcon.Text] should win
-     *  for the entire surface area of the Child Box. This also requires updating the user facing
-     *  cursor icon to reflect the Child Box that was added under the cursor.
+     * Expected Output: Initially, the Parent Box's [PointerIcon.Crosshair] should win for its
+     * entire surface area because it has no competition in the hierarchy for any other custom
+     * icons. After the Child Box is dynamically added under the cursor, the Child Box's
+     * [PointerIcon.Text] should win for the entire surface area of the Child Box. This also
+     * requires updating the user facing cursor icon to reflect the Child Box that was added under
+     * the cursor.
      *
-     *  Parent Box (output icon = [PointerIcon.Crosshair])
-     *    ⤷ Child Box (output icon = [PointerIcon.Text])
+     * Parent Box (output icon = [PointerIcon.Crosshair]) ⤷ Child Box (output icon =
+     * [PointerIcon.Text])
      */
     @Test
     fun dynamicallyAddAndRemoveChild_noOverrideDescendants() {
@@ -2799,21 +2355,21 @@
         rule.setContent {
             CompositionLocalProvider(LocalPointerIconService provides iconService) {
                 Box(
-                    modifier = Modifier
-                        .requiredSize(200.dp)
-                        .border(BorderStroke(2.dp, SolidColor(Color.Red)))
-                        .testTag(parentIconTag)
-                        .pointerHoverIcon(desiredParentIcon, overrideDescendants = false),
+                    modifier =
+                        Modifier.requiredSize(200.dp)
+                            .border(BorderStroke(2.dp, SolidColor(Color.Red)))
+                            .testTag(parentIconTag)
+                            .pointerHoverIcon(desiredParentIcon, overrideDescendants = false),
                     contentAlignment = Alignment.Center
                 ) {
                     if (isChildVisible.value) {
                         Box(
-                            modifier = Modifier
-                                .padding(20.dp)
-                                .requiredSize(100.dp)
-                                .border(BorderStroke(2.dp, SolidColor(Color.Black)))
-                                .testTag(childIconTag)
-                                .pointerHoverIcon(desiredChildIcon, overrideDescendants = false)
+                            modifier =
+                                Modifier.padding(20.dp)
+                                    .requiredSize(100.dp)
+                                    .border(BorderStroke(2.dp, SolidColor(Color.Black)))
+                                    .testTag(childIconTag)
+                                    .pointerHoverIcon(desiredChildIcon, overrideDescendants = false)
                         )
                     }
                 }
@@ -2821,13 +2377,9 @@
         }
 
         // Verify initial state of pointer icon
-        rule.runOnIdle {
-            assertThat(iconService.getIcon()).isEqualTo(desiredDefaultIcon)
-        }
+        rule.runOnIdle { assertThat(iconService.getIcon()).isEqualTo(desiredDefaultIcon) }
         // Hover over center of Parent Box
-        rule.onNodeWithTag(parentIconTag).performMouseInput {
-            enter(center)
-        }
+        rule.onNodeWithTag(parentIconTag).performMouseInput { enter(center) }
         // Verify Parent Box has the desired parent icon and dynamically add the Child Box under the
         // cursor
         rule.runOnIdle {
@@ -2835,57 +2387,37 @@
             isChildVisible.value = true
         }
         // Verify the icon has been updated to the desired child icon
-        rule.runOnIdle {
-            assertThat(iconService.getIcon()).isEqualTo(desiredChildIcon)
-        }
+        rule.runOnIdle { assertThat(iconService.getIcon()).isEqualTo(desiredChildIcon) }
         // Move cursor within Child Box and verify it still has the updated icon
-        rule.onNodeWithTag(childIconTag).performMouseInput {
-            moveTo(centerRight)
-        }
-        rule.runOnIdle {
-            assertThat(iconService.getIcon()).isEqualTo(desiredChildIcon)
-        }
+        rule.onNodeWithTag(childIconTag).performMouseInput { moveTo(centerRight) }
+        rule.runOnIdle { assertThat(iconService.getIcon()).isEqualTo(desiredChildIcon) }
         // Move cursor outside Child Box and verify the icon is updated to the desired parent icon
-        rule.onNodeWithTag(parentIconTag).performMouseInput {
-            moveTo(bottomCenter)
-        }
-        rule.runOnIdle {
-            assertThat(iconService.getIcon()).isEqualTo(desiredParentIcon)
-        }
+        rule.onNodeWithTag(parentIconTag).performMouseInput { moveTo(bottomCenter) }
+        rule.runOnIdle { assertThat(iconService.getIcon()).isEqualTo(desiredParentIcon) }
         // Move cursor back to the center of the Child Box
-        rule.onNodeWithTag(childIconTag).performMouseInput {
-            moveTo(center)
-        }
+        rule.onNodeWithTag(childIconTag).performMouseInput { moveTo(center) }
         // Dynamically remove the Child Box
-        rule.runOnIdle {
-            isChildVisible.value = false
-        }
+        rule.runOnIdle { isChildVisible.value = false }
         // Verify the icon has been updated to the desired parent icon
-        rule.runOnIdle {
-            assertThat(iconService.getIcon()).isEqualTo(desiredParentIcon)
-        }
+        rule.runOnIdle { assertThat(iconService.getIcon()).isEqualTo(desiredParentIcon) }
         // Exit hovering over Parent Box
-        rule.onNodeWithTag(parentIconTag).performMouseInput {
-            exit()
-        }
+        rule.onNodeWithTag(parentIconTag).performMouseInput { exit() }
     }
 
     /**
-     * Setup:
-     * The hierarchy for the initial setup of this test is:
-     *  Parent Box (custom icon = [PointerIcon.Crosshair], overrideDescendants = TRUE)
+     * Setup: The hierarchy for the initial setup of this test is: Parent Box (custom icon =
+     * [PointerIcon.Crosshair], overrideDescendants = TRUE)
      *
-     *  After hovering over the center of the screen, the hierarchy under the cursor updates to:
-     *  Parent Box (custom icon = [PointerIcon.Crosshair], overrideDescendants = TRUE)
-     *    ⤷ Child Box (custom icon = [PointerIcon.Text], overrideDescendants = FALSE)
+     * After hovering over the center of the screen, the hierarchy under the cursor updates to:
+     * Parent Box (custom icon = [PointerIcon.Crosshair], overrideDescendants = TRUE) ⤷ Child Box
+     * (custom icon = [PointerIcon.Text], overrideDescendants = FALSE)
      *
-     *  Expected Output:
-     *  The Parent Box's [PointerIcon.Crosshair] should win for its entire surface area regardless
-     *  of whether the Child Box is visible or not. This is because the Parent Box's
-     *  overrideDescendants = true, so its children should always respect Parent Box's custom icon.
+     * Expected Output: The Parent Box's [PointerIcon.Crosshair] should win for its entire surface
+     * area regardless of whether the Child Box is visible or not. This is because the Parent Box's
+     * overrideDescendants = true, so its children should always respect Parent Box's custom icon.
      *
-     *  Parent Box (output icon = [PointerIcon.Crosshair])
-     *    ⤷ Child Box (output icon = [PointerIcon.Crosshair])
+     * Parent Box (output icon = [PointerIcon.Crosshair]) ⤷ Child Box (output icon =
+     * [PointerIcon.Crosshair])
      */
     @Test
     fun dynamicallyAddAndRemoveChild_parentOverridesDescendants() {
@@ -2894,21 +2426,21 @@
         rule.setContent {
             CompositionLocalProvider(LocalPointerIconService provides iconService) {
                 Box(
-                    modifier = Modifier
-                        .requiredSize(200.dp)
-                        .border(BorderStroke(2.dp, SolidColor(Color.Red)))
-                        .testTag(parentIconTag)
-                        .pointerHoverIcon(desiredParentIcon, overrideDescendants = true),
+                    modifier =
+                        Modifier.requiredSize(200.dp)
+                            .border(BorderStroke(2.dp, SolidColor(Color.Red)))
+                            .testTag(parentIconTag)
+                            .pointerHoverIcon(desiredParentIcon, overrideDescendants = true),
                     contentAlignment = Alignment.Center
                 ) {
                     if (isChildVisible.value) {
                         Box(
-                            modifier = Modifier
-                                .padding(20.dp)
-                                .requiredSize(100.dp)
-                                .border(BorderStroke(2.dp, SolidColor(Color.Black)))
-                                .testTag(childIconTag)
-                                .pointerHoverIcon(desiredChildIcon, overrideDescendants = false)
+                            modifier =
+                                Modifier.padding(20.dp)
+                                    .requiredSize(100.dp)
+                                    .border(BorderStroke(2.dp, SolidColor(Color.Black)))
+                                    .testTag(childIconTag)
+                                    .pointerHoverIcon(desiredChildIcon, overrideDescendants = false)
                         )
                     }
                 }
@@ -2916,13 +2448,9 @@
         }
 
         // Verify initial state of pointer icon
-        rule.runOnIdle {
-            assertThat(iconService.getIcon()).isEqualTo(desiredDefaultIcon)
-        }
+        rule.runOnIdle { assertThat(iconService.getIcon()).isEqualTo(desiredDefaultIcon) }
         // Hover over center of Parent Box
-        rule.onNodeWithTag(parentIconTag).performMouseInput {
-            enter(center)
-        }
+        rule.onNodeWithTag(parentIconTag).performMouseInput { enter(center) }
         // Verify Parent Box has the desired parent icon and dynamically add the Child Box under the
         // cursor
         rule.runOnIdle {
@@ -2930,63 +2458,42 @@
             isChildVisible.value = true
         }
         // Verify the icon stays as the parent icon
-        rule.runOnIdle {
-            assertThat(iconService.getIcon()).isEqualTo(desiredParentIcon)
-        }
+        rule.runOnIdle { assertThat(iconService.getIcon()).isEqualTo(desiredParentIcon) }
         // Move cursor within Child Box and verify it still is the parent icon
-        rule.onNodeWithTag(childIconTag).performMouseInput {
-            moveTo(centerRight)
-        }
-        rule.runOnIdle {
-            assertThat(iconService.getIcon()).isEqualTo(desiredParentIcon)
-        }
+        rule.onNodeWithTag(childIconTag).performMouseInput { moveTo(centerRight) }
+        rule.runOnIdle { assertThat(iconService.getIcon()).isEqualTo(desiredParentIcon) }
         // Move cursor outside Child Box and verify the icon is updated to the desired parent icon
-        rule.onNodeWithTag(parentIconTag).performMouseInput {
-            moveTo(bottomCenter)
-        }
-        rule.runOnIdle {
-            assertThat(iconService.getIcon()).isEqualTo(desiredParentIcon)
-        }
+        rule.onNodeWithTag(parentIconTag).performMouseInput { moveTo(bottomCenter) }
+        rule.runOnIdle { assertThat(iconService.getIcon()).isEqualTo(desiredParentIcon) }
         // Move cursor back to the center of the Child Box
-        rule.onNodeWithTag(childIconTag).performMouseInput {
-            moveTo(center)
-        }
+        rule.onNodeWithTag(childIconTag).performMouseInput { moveTo(center) }
         // Dynamically remove the Child Box
-        rule.runOnIdle {
-            isChildVisible.value = false
-        }
+        rule.runOnIdle { isChildVisible.value = false }
         // Verify the icon still the desired parent icon
-        rule.runOnIdle {
-            assertThat(iconService.getIcon()).isEqualTo(desiredParentIcon)
-        }
+        rule.runOnIdle { assertThat(iconService.getIcon()).isEqualTo(desiredParentIcon) }
         // Exit hovering over Parent Box
-        rule.onNodeWithTag(parentIconTag).performMouseInput {
-            exit()
-        }
+        rule.onNodeWithTag(parentIconTag).performMouseInput { exit() }
     }
 
     /**
-     * Setup:
-     * The hierarchy for the initial setup of this test is:
-     *  Parent Box (custom icon = [PointerIcon.Crosshair], overrideDescendants = FALSE)
+     * Setup: The hierarchy for the initial setup of this test is: Parent Box (custom icon =
+     * [PointerIcon.Crosshair], overrideDescendants = FALSE)
      *
-     *  After hovering over the center of the screen, the hierarchy under the cursor updates to:
-     *  Parent Box (custom icon = [PointerIcon.Crosshair], overrideDescendants = FALSE)
-     *    ⤷ Child Box (custom icon = [PointerIcon.Text], overrideDescendants = FALSE)
-     *      ⤷ Grandchild Box (custom icon = [PointerIcon.Hand], overrideDescendants = FALSE)
+     * After hovering over the center of the screen, the hierarchy under the cursor updates to:
+     * Parent Box (custom icon = [PointerIcon.Crosshair], overrideDescendants = FALSE) ⤷ Child Box
+     * (custom icon = [PointerIcon.Text], overrideDescendants = FALSE) ⤷ Grandchild Box (custom icon
+     * = [PointerIcon.Hand], overrideDescendants = FALSE)
      *
-     *  Expected Output:
-     *  Initially, the Parent Box's [PointerIcon.Crosshair] should win for its entire surface area
-     *  because it has no competition in the hierarchy for any other custom icons. After the Child
-     *  Box and the Grandchild Box are dynamically added under the cursor, the Grandchild Box's
-     *  [PointerIcon.Hand] should win for the entire surface area of the Grandchild Box. The Child
-     *  Box's [PointerIcon.Text] should win for the remaining surface area of the Child Box not
-     *  covered by the Grandchild Box. This also requires updating the user facing cursor icon to
-     *  reflect the Child Box and Grandchild Box that were added under the cursor.
+     * Expected Output: Initially, the Parent Box's [PointerIcon.Crosshair] should win for its
+     * entire surface area because it has no competition in the hierarchy for any other custom
+     * icons. After the Child Box and the Grandchild Box are dynamically added under the cursor, the
+     * Grandchild Box's [PointerIcon.Hand] should win for the entire surface area of the Grandchild
+     * Box. The Child Box's [PointerIcon.Text] should win for the remaining surface area of the
+     * Child Box not covered by the Grandchild Box. This also requires updating the user facing
+     * cursor icon to reflect the Child Box and Grandchild Box that were added under the cursor.
      *
-     *  Parent Box (output icon = [PointerIcon.Crosshair])
-     *    ⤷ Child Box (output icon = [PointerIcon.Text])
-     *      ⤷ Grandchild Box (output icon = [PointerIcon.Hand])
+     * Parent Box (output icon = [PointerIcon.Crosshair]) ⤷ Child Box (output icon =
+     * [PointerIcon.Text]) ⤷ Grandchild Box (output icon = [PointerIcon.Hand])
      */
     @Test
     fun dynamicallyAddAndRemoveChildAndGrandchild_noOverrideDescendants() {
@@ -2995,33 +2502,36 @@
         rule.setContent {
             CompositionLocalProvider(LocalPointerIconService provides iconService) {
                 Box(
-                    modifier = Modifier
-                        .requiredSize(200.dp)
-                        .border(BorderStroke(2.dp, SolidColor(Color.Red)))
-                        .testTag(parentIconTag)
-                        .pointerHoverIcon(desiredParentIcon, overrideDescendants = false),
+                    modifier =
+                        Modifier.requiredSize(200.dp)
+                            .border(BorderStroke(2.dp, SolidColor(Color.Red)))
+                            .testTag(parentIconTag)
+                            .pointerHoverIcon(desiredParentIcon, overrideDescendants = false),
                     contentAlignment = Alignment.Center
                 ) {
                     if (areDescendantsVisible.value) {
                         Box(
-                            modifier = Modifier
-                                .padding(20.dp)
-                                .requiredSize(150.dp)
-                                .border(BorderStroke(2.dp, SolidColor(Color.Black)))
-                                .testTag(childIconTag)
-                                .pointerHoverIcon(desiredChildIcon, overrideDescendants = false),
+                            modifier =
+                                Modifier.padding(20.dp)
+                                    .requiredSize(150.dp)
+                                    .border(BorderStroke(2.dp, SolidColor(Color.Black)))
+                                    .testTag(childIconTag)
+                                    .pointerHoverIcon(
+                                        desiredChildIcon,
+                                        overrideDescendants = false
+                                    ),
                             contentAlignment = Alignment.Center
                         ) {
                             Box(
-                                modifier = Modifier
-                                    .padding(40.dp)
-                                    .requiredSize(100.dp)
-                                    .border(BorderStroke(2.dp, SolidColor(Color.Blue)))
-                                    .testTag(grandchildIconTag)
-                                    .pointerHoverIcon(
-                                        desiredGrandchildIcon,
-                                        overrideDescendants = false
-                                    )
+                                modifier =
+                                    Modifier.padding(40.dp)
+                                        .requiredSize(100.dp)
+                                        .border(BorderStroke(2.dp, SolidColor(Color.Blue)))
+                                        .testTag(grandchildIconTag)
+                                        .pointerHoverIcon(
+                                            desiredGrandchildIcon,
+                                            overrideDescendants = false
+                                        )
                             )
                         }
                     }
@@ -3030,13 +2540,9 @@
         }
 
         // Verify initial state of pointer icon
-        rule.runOnIdle {
-            assertThat(iconService.getIcon()).isEqualTo(desiredDefaultIcon)
-        }
+        rule.runOnIdle { assertThat(iconService.getIcon()).isEqualTo(desiredDefaultIcon) }
         // Hover over center of Parent Box
-        rule.onNodeWithTag(parentIconTag).performMouseInput {
-            enter(center)
-        }
+        rule.onNodeWithTag(parentIconTag).performMouseInput { enter(center) }
         // Verify Parent Box has the desired parent icon and dynamically add the Child Box and
         // Grandchild Box under the cursor
         rule.runOnIdle {
@@ -3044,72 +2550,47 @@
             areDescendantsVisible.value = true
         }
         // Verify the icon has been updated to the desired grandchild icon
-        rule.runOnIdle {
-            assertThat(iconService.getIcon()).isEqualTo(desiredGrandchildIcon)
-        }
+        rule.runOnIdle { assertThat(iconService.getIcon()).isEqualTo(desiredGrandchildIcon) }
         // Move cursor within Grandchild Box and verify it still has the grandchild icon
-        rule.onNodeWithTag(grandchildIconTag).performMouseInput {
-            moveTo(centerRight)
-        }
-        rule.runOnIdle {
-            assertThat(iconService.getIcon()).isEqualTo(desiredGrandchildIcon)
-        }
+        rule.onNodeWithTag(grandchildIconTag).performMouseInput { moveTo(centerRight) }
+        rule.runOnIdle { assertThat(iconService.getIcon()).isEqualTo(desiredGrandchildIcon) }
         // Move cursor outside Grandchild Box within Child Box and verify it has the child icon
-        rule.onNodeWithTag(childIconTag).performMouseInput {
-            moveTo(bottomRight)
-        }
-        rule.runOnIdle {
-            assertThat(iconService.getIcon()).isEqualTo(desiredChildIcon)
-        }
+        rule.onNodeWithTag(childIconTag).performMouseInput { moveTo(bottomRight) }
+        rule.runOnIdle { assertThat(iconService.getIcon()).isEqualTo(desiredChildIcon) }
         // Move cursor outside Child Box and verify the icon is updated to the desired parent icon
-        rule.onNodeWithTag(parentIconTag).performMouseInput {
-            moveTo(bottomCenter)
-        }
-        rule.runOnIdle {
-            assertThat(iconService.getIcon()).isEqualTo(desiredParentIcon)
-        }
+        rule.onNodeWithTag(parentIconTag).performMouseInput { moveTo(bottomCenter) }
+        rule.runOnIdle { assertThat(iconService.getIcon()).isEqualTo(desiredParentIcon) }
         // Move cursor back to the center of the Grandchild Box
-        rule.onNodeWithTag(grandchildIconTag).performMouseInput {
-            moveTo(center)
-        }
+        rule.onNodeWithTag(grandchildIconTag).performMouseInput { moveTo(center) }
         // Dynamically remove the Child Box and Grandchild Box
-        rule.runOnIdle {
-            areDescendantsVisible.value = false
-        }
+        rule.runOnIdle { areDescendantsVisible.value = false }
         // Verify the icon has been updated to the desired parent icon
-        rule.runOnIdle {
-            assertThat(iconService.getIcon()).isEqualTo(desiredParentIcon)
-        }
+        rule.runOnIdle { assertThat(iconService.getIcon()).isEqualTo(desiredParentIcon) }
         // Exit hovering over Parent Box
-        rule.onNodeWithTag(parentIconTag).performMouseInput {
-            exit()
-        }
+        rule.onNodeWithTag(parentIconTag).performMouseInput { exit() }
     }
 
     /**
-     * Setup:
-     * The hierarchy for the initial setup of this test is:
-     *  Parent Box (custom icon = [PointerIcon.Crosshair], overrideDescendants = FALSE)
+     * Setup: The hierarchy for the initial setup of this test is: Parent Box (custom icon =
+     * [PointerIcon.Crosshair], overrideDescendants = FALSE)
      *
-     *  After hovering over the center of the screen, the hierarchy under the cursor updates to:
-     *  Parent Box (custom icon = [PointerIcon.Crosshair], overrideDescendants = FALSE)
-     *    ⤷ Child Box (custom icon = [PointerIcon.Text], overrideDescendants = FALSE)
-     *      ⤷ Grandchild Box (custom icon = [PointerIcon.Hand], overrideDescendants = TRUE)
+     * After hovering over the center of the screen, the hierarchy under the cursor updates to:
+     * Parent Box (custom icon = [PointerIcon.Crosshair], overrideDescendants = FALSE) ⤷ Child Box
+     * (custom icon = [PointerIcon.Text], overrideDescendants = FALSE) ⤷ Grandchild Box (custom icon
+     * = [PointerIcon.Hand], overrideDescendants = TRUE)
      *
-     *  Expected Output:
-     *  Initially, the Parent Box's [PointerIcon.Crosshair] should win for its entire surface area
-     *  because it has no competition in the hierarchy for any other custom icons. After the Child
-     *  Box and the Grandchild Box are dynamically added under the cursor, the Grandchild Box's
-     *  [PointerIcon.Hand] should win for the entire surface area of the Grandchild Box. Because the
-     *  Grandchild Box is the lowest level in the hierarchy, the outcome doesn't change whether it
-     *  has overrideDescendants = true or not. The Child Box's [PointerIcon.Text] should win for the
-     *  remaining surface area of the Child Box not covered by the Grandchild Box. This also
-     *  requires updating the user facing cursor icon to reflect the Child Box and Grandchild Box
-     *  that were added under the cursor.
+     * Expected Output: Initially, the Parent Box's [PointerIcon.Crosshair] should win for its
+     * entire surface area because it has no competition in the hierarchy for any other custom
+     * icons. After the Child Box and the Grandchild Box are dynamically added under the cursor, the
+     * Grandchild Box's [PointerIcon.Hand] should win for the entire surface area of the Grandchild
+     * Box. Because the Grandchild Box is the lowest level in the hierarchy, the outcome doesn't
+     * change whether it has overrideDescendants = true or not. The Child Box's [PointerIcon.Text]
+     * should win for the remaining surface area of the Child Box not covered by the Grandchild Box.
+     * This also requires updating the user facing cursor icon to reflect the Child Box and
+     * Grandchild Box that were added under the cursor.
      *
-     *  Parent Box (output icon = [PointerIcon.Crosshair])
-     *    ⤷ Child Box (output icon = [PointerIcon.Text])
-     *      ⤷ Grandchild Box (output icon = [PointerIcon.Hand])
+     * Parent Box (output icon = [PointerIcon.Crosshair]) ⤷ Child Box (output icon =
+     * [PointerIcon.Text]) ⤷ Grandchild Box (output icon = [PointerIcon.Hand])
      */
     @Test
     fun dynamicallyAddAndRemoveChildAndGrandchild_grandchildOverridesDescendants() {
@@ -3118,33 +2599,36 @@
         rule.setContent {
             CompositionLocalProvider(LocalPointerIconService provides iconService) {
                 Box(
-                    modifier = Modifier
-                        .requiredSize(200.dp)
-                        .border(BorderStroke(2.dp, SolidColor(Color.Red)))
-                        .testTag(parentIconTag)
-                        .pointerHoverIcon(desiredParentIcon, overrideDescendants = false),
+                    modifier =
+                        Modifier.requiredSize(200.dp)
+                            .border(BorderStroke(2.dp, SolidColor(Color.Red)))
+                            .testTag(parentIconTag)
+                            .pointerHoverIcon(desiredParentIcon, overrideDescendants = false),
                     contentAlignment = Alignment.Center
                 ) {
                     if (areDescendantsVisible.value) {
                         Box(
-                            modifier = Modifier
-                                .padding(20.dp)
-                                .requiredSize(150.dp)
-                                .border(BorderStroke(2.dp, SolidColor(Color.Black)))
-                                .testTag(childIconTag)
-                                .pointerHoverIcon(desiredChildIcon, overrideDescendants = false),
+                            modifier =
+                                Modifier.padding(20.dp)
+                                    .requiredSize(150.dp)
+                                    .border(BorderStroke(2.dp, SolidColor(Color.Black)))
+                                    .testTag(childIconTag)
+                                    .pointerHoverIcon(
+                                        desiredChildIcon,
+                                        overrideDescendants = false
+                                    ),
                             contentAlignment = Alignment.Center
                         ) {
                             Box(
-                                modifier = Modifier
-                                    .padding(40.dp)
-                                    .requiredSize(100.dp)
-                                    .border(BorderStroke(2.dp, SolidColor(Color.Blue)))
-                                    .testTag(grandchildIconTag)
-                                    .pointerHoverIcon(
-                                        desiredGrandchildIcon,
-                                        overrideDescendants = true
-                                    )
+                                modifier =
+                                    Modifier.padding(40.dp)
+                                        .requiredSize(100.dp)
+                                        .border(BorderStroke(2.dp, SolidColor(Color.Blue)))
+                                        .testTag(grandchildIconTag)
+                                        .pointerHoverIcon(
+                                            desiredGrandchildIcon,
+                                            overrideDescendants = true
+                                        )
                             )
                         }
                     }
@@ -3153,13 +2637,9 @@
         }
 
         // Verify initial state of pointer icon
-        rule.runOnIdle {
-            assertThat(iconService.getIcon()).isEqualTo(desiredDefaultIcon)
-        }
+        rule.runOnIdle { assertThat(iconService.getIcon()).isEqualTo(desiredDefaultIcon) }
         // Hover over center of Parent Box
-        rule.onNodeWithTag(parentIconTag).performMouseInput {
-            enter(center)
-        }
+        rule.onNodeWithTag(parentIconTag).performMouseInput { enter(center) }
         // Verify Parent Box has the desired parent icon and dynamically add the Child Box and
         // Grandchild Box under the cursor
         rule.runOnIdle {
@@ -3167,70 +2647,45 @@
             areDescendantsVisible.value = true
         }
         // Verify the icon has been updated to the desired grandchild icon
-        rule.runOnIdle {
-            assertThat(iconService.getIcon()).isEqualTo(desiredGrandchildIcon)
-        }
+        rule.runOnIdle { assertThat(iconService.getIcon()).isEqualTo(desiredGrandchildIcon) }
         // Move cursor within Grandchild Box and verify it still has the grandchild icon
-        rule.onNodeWithTag(grandchildIconTag).performMouseInput {
-            moveTo(centerRight)
-        }
-        rule.runOnIdle {
-            assertThat(iconService.getIcon()).isEqualTo(desiredGrandchildIcon)
-        }
+        rule.onNodeWithTag(grandchildIconTag).performMouseInput { moveTo(centerRight) }
+        rule.runOnIdle { assertThat(iconService.getIcon()).isEqualTo(desiredGrandchildIcon) }
         // Move cursor outside Grandchild Box within Child Box and verify it has the child icon
-        rule.onNodeWithTag(childIconTag).performMouseInput {
-            moveTo(bottomRight)
-        }
-        rule.runOnIdle {
-            assertThat(iconService.getIcon()).isEqualTo(desiredChildIcon)
-        }
+        rule.onNodeWithTag(childIconTag).performMouseInput { moveTo(bottomRight) }
+        rule.runOnIdle { assertThat(iconService.getIcon()).isEqualTo(desiredChildIcon) }
         // Move cursor outside Child Box and verify the icon is updated to the desired parent icon
-        rule.onNodeWithTag(parentIconTag).performMouseInput {
-            moveTo(bottomCenter)
-        }
-        rule.runOnIdle {
-            assertThat(iconService.getIcon()).isEqualTo(desiredParentIcon)
-        }
+        rule.onNodeWithTag(parentIconTag).performMouseInput { moveTo(bottomCenter) }
+        rule.runOnIdle { assertThat(iconService.getIcon()).isEqualTo(desiredParentIcon) }
         // Move cursor back to the center of the Grandchild Box
-        rule.onNodeWithTag(grandchildIconTag).performMouseInput {
-            moveTo(center)
-        }
+        rule.onNodeWithTag(grandchildIconTag).performMouseInput { moveTo(center) }
         // Dynamically remove the Child Box and Grandchild Box
-        rule.runOnIdle {
-            areDescendantsVisible.value = false
-        }
+        rule.runOnIdle { areDescendantsVisible.value = false }
         // Verify the icon has been updated to the desired parent icon
-        rule.runOnIdle {
-            assertThat(iconService.getIcon()).isEqualTo(desiredParentIcon)
-        }
+        rule.runOnIdle { assertThat(iconService.getIcon()).isEqualTo(desiredParentIcon) }
         // Exit hovering over Parent Box
-        rule.onNodeWithTag(parentIconTag).performMouseInput {
-            exit()
-        }
+        rule.onNodeWithTag(parentIconTag).performMouseInput { exit() }
     }
 
     /**
-     * Setup:
-     * The hierarchy for the initial setup of this test is:
-     *  Parent Box (custom icon = [PointerIcon.Crosshair], overrideDescendants = FALSE)
+     * Setup: The hierarchy for the initial setup of this test is: Parent Box (custom icon =
+     * [PointerIcon.Crosshair], overrideDescendants = FALSE)
      *
-     *  After hovering over the center of the screen, the hierarchy under the cursor updates to:
-     *  Parent Box (custom icon = [PointerIcon.Crosshair], overrideDescendants = FALSE)
-     *    ⤷ Child Box (custom icon = [PointerIcon.Text], overrideDescendants = TRUE)
-     *      ⤷ Grandchild Box (custom icon = [PointerIcon.Hand], overrideDescendants = FALSE)
+     * After hovering over the center of the screen, the hierarchy under the cursor updates to:
+     * Parent Box (custom icon = [PointerIcon.Crosshair], overrideDescendants = FALSE) ⤷ Child Box
+     * (custom icon = [PointerIcon.Text], overrideDescendants = TRUE) ⤷ Grandchild Box (custom icon
+     * = [PointerIcon.Hand], overrideDescendants = FALSE)
      *
-     *  Expected Output:
-     *  Initially, the Parent Box's [PointerIcon.Crosshair] should win for its entire surface area
-     *  because it has no competition in the hierarchy for any other custom icons. After the Child
-     *  Box and the Grandchild Box are dynamically added under the cursor, the Child Box's
-     *  [PointerIcon.Text] should win for the entire surface area of the Child Box. This includes
-     *  the Grandchild Box's [PointerIcon.Text] should win for the remaining surface area of the
-     *  Child Box not covered by the Grandchild Box. This also requires updating the user facing
-     *  cursor icon to reflect the Child Box and Grandchild Box that were added under the cursor.
+     * Expected Output: Initially, the Parent Box's [PointerIcon.Crosshair] should win for its
+     * entire surface area because it has no competition in the hierarchy for any other custom
+     * icons. After the Child Box and the Grandchild Box are dynamically added under the cursor, the
+     * Child Box's [PointerIcon.Text] should win for the entire surface area of the Child Box. This
+     * includes the Grandchild Box's [PointerIcon.Text] should win for the remaining surface area of
+     * the Child Box not covered by the Grandchild Box. This also requires updating the user facing
+     * cursor icon to reflect the Child Box and Grandchild Box that were added under the cursor.
      *
-     *  Parent Box (output icon = [PointerIcon.Crosshair])
-     *    ⤷ Child Box (output icon = [PointerIcon.Text])
-     *      ⤷ Grandchild Box (output icon = [PointerIcon.Hand])
+     * Parent Box (output icon = [PointerIcon.Crosshair]) ⤷ Child Box (output icon =
+     * [PointerIcon.Text]) ⤷ Grandchild Box (output icon = [PointerIcon.Hand])
      */
     @Test
     fun dynamicallyAddAndRemoveChildAndGrandchild_childOverridesDescendants() {
@@ -3239,33 +2694,33 @@
         rule.setContent {
             CompositionLocalProvider(LocalPointerIconService provides iconService) {
                 Box(
-                    modifier = Modifier
-                        .requiredSize(200.dp)
-                        .border(BorderStroke(2.dp, SolidColor(Color.Red)))
-                        .testTag(parentIconTag)
-                        .pointerHoverIcon(desiredParentIcon, overrideDescendants = false),
+                    modifier =
+                        Modifier.requiredSize(200.dp)
+                            .border(BorderStroke(2.dp, SolidColor(Color.Red)))
+                            .testTag(parentIconTag)
+                            .pointerHoverIcon(desiredParentIcon, overrideDescendants = false),
                     contentAlignment = Alignment.Center
                 ) {
                     if (areDescendantsVisible.value) {
                         Box(
-                            modifier = Modifier
-                                .padding(20.dp)
-                                .requiredSize(150.dp)
-                                .border(BorderStroke(2.dp, SolidColor(Color.Black)))
-                                .testTag(childIconTag)
-                                .pointerHoverIcon(desiredChildIcon, overrideDescendants = true),
+                            modifier =
+                                Modifier.padding(20.dp)
+                                    .requiredSize(150.dp)
+                                    .border(BorderStroke(2.dp, SolidColor(Color.Black)))
+                                    .testTag(childIconTag)
+                                    .pointerHoverIcon(desiredChildIcon, overrideDescendants = true),
                             contentAlignment = Alignment.Center
                         ) {
                             Box(
-                                modifier = Modifier
-                                    .padding(40.dp)
-                                    .requiredSize(100.dp)
-                                    .border(BorderStroke(2.dp, SolidColor(Color.Blue)))
-                                    .testTag(grandchildIconTag)
-                                    .pointerHoverIcon(
-                                        desiredGrandchildIcon,
-                                        overrideDescendants = false
-                                    )
+                                modifier =
+                                    Modifier.padding(40.dp)
+                                        .requiredSize(100.dp)
+                                        .border(BorderStroke(2.dp, SolidColor(Color.Blue)))
+                                        .testTag(grandchildIconTag)
+                                        .pointerHoverIcon(
+                                            desiredGrandchildIcon,
+                                            overrideDescendants = false
+                                        )
                             )
                         }
                     }
@@ -3274,13 +2729,9 @@
         }
 
         // Verify initial state of pointer icon
-        rule.runOnIdle {
-            assertThat(iconService.getIcon()).isEqualTo(desiredDefaultIcon)
-        }
+        rule.runOnIdle { assertThat(iconService.getIcon()).isEqualTo(desiredDefaultIcon) }
         // Hover over center of Parent Box
-        rule.onNodeWithTag(parentIconTag).performMouseInput {
-            enter(center)
-        }
+        rule.onNodeWithTag(parentIconTag).performMouseInput { enter(center) }
         // Verify Parent Box has the desired parent icon, then dynamically add the Child Box and
         // Grandchild Box under the cursor
         rule.runOnIdle {
@@ -3288,77 +2739,53 @@
             areDescendantsVisible.value = true
         }
         // Verify the icon has been updated to the desired child icon
-        rule.runOnIdle {
-            assertThat(iconService.getIcon()).isEqualTo(desiredChildIcon)
-        }
+        rule.runOnIdle { assertThat(iconService.getIcon()).isEqualTo(desiredChildIcon) }
         // Move cursor within Grandchild Box and verify it still has the child icon
-        rule.onNodeWithTag(grandchildIconTag).performMouseInput {
-            moveTo(centerRight)
-        }
-        rule.runOnIdle {
-            assertThat(iconService.getIcon()).isEqualTo(desiredChildIcon)
-        }
+        rule.onNodeWithTag(grandchildIconTag).performMouseInput { moveTo(centerRight) }
+        rule.runOnIdle { assertThat(iconService.getIcon()).isEqualTo(desiredChildIcon) }
         // Move cursor outside Grandchild Box within Child Box to verify it still has the child icon
-        rule.onNodeWithTag(childIconTag).performMouseInput {
-            moveTo(bottomRight)
-        }
-        rule.runOnIdle {
-            assertThat(iconService.getIcon()).isEqualTo(desiredChildIcon)
-        }
+        rule.onNodeWithTag(childIconTag).performMouseInput { moveTo(bottomRight) }
+        rule.runOnIdle { assertThat(iconService.getIcon()).isEqualTo(desiredChildIcon) }
         // Move cursor outside Child Box and verify the icon is updated to the desired parent icon
-        rule.onNodeWithTag(parentIconTag).performMouseInput {
-            moveTo(bottomCenter)
-        }
-        rule.runOnIdle {
-            assertThat(iconService.getIcon()).isEqualTo(desiredParentIcon)
-        }
+        rule.onNodeWithTag(parentIconTag).performMouseInput { moveTo(bottomCenter) }
+        rule.runOnIdle { assertThat(iconService.getIcon()).isEqualTo(desiredParentIcon) }
         // Move cursor back to the center of the Grandchild Box
-        rule.onNodeWithTag(grandchildIconTag).performMouseInput {
-            moveTo(center)
-        }
+        rule.onNodeWithTag(grandchildIconTag).performMouseInput { moveTo(center) }
         // Dynamically remove the Child Box and Grandchild Box
-        rule.runOnIdle {
-            areDescendantsVisible.value = false
-        }
+        rule.runOnIdle { areDescendantsVisible.value = false }
         // Verify the icon has been updated to the desired parent icon
-        rule.runOnIdle {
-            assertThat(iconService.getIcon()).isEqualTo(desiredParentIcon)
-        }
+        rule.runOnIdle { assertThat(iconService.getIcon()).isEqualTo(desiredParentIcon) }
         // Exit hovering over Parent Box
-        rule.onNodeWithTag(parentIconTag).performMouseInput {
-            exit()
-        }
+        rule.onNodeWithTag(parentIconTag).performMouseInput { exit() }
     }
 
     /**
-     * Setup:
-     * The hierarchy for the initial setup of this test is:
-     *  Child Box (custom icon = [PointerIcon.Text], overrideDescendants = FALSE)
+     * Setup: The hierarchy for the initial setup of this test is: Child Box (custom icon =
+     * [PointerIcon.Text], overrideDescendants = FALSE)
      *
-     *  After hovering over the center of the screen, the hierarchy under the cursor updates to:
-     *  Parent Box (custom icon = [PointerIcon.Crosshair], overrideDescendants = FALSE)
-     *    ⤷ Child Box (custom icon = [PointerIcon.Text], overrideDescendants = FALSE)
+     * After hovering over the center of the screen, the hierarchy under the cursor updates to:
+     * Parent Box (custom icon = [PointerIcon.Crosshair], overrideDescendants = FALSE) ⤷ Child Box
+     * (custom icon = [PointerIcon.Text], overrideDescendants = FALSE)
      *
-     *  Expected Output:
-     *  The Child Box's [PointerIcon.Text] should win for its entire surface area regardless of
-     *  whether there's a Parent Box present or not. This is because the Parent Box has
-     *  overrideDescendants = false and should therefore not have its custom icon take priority over
-     *  the Child Box's custom icon. The Parent Box's [PointerIcon.Crosshair] should win for its
-     *  remaining surface area not covered by the Child Box.
+     * Expected Output: The Child Box's [PointerIcon.Text] should win for its entire surface area
+     * regardless of whether there's a Parent Box present or not. This is because the Parent Box has
+     * overrideDescendants = false and should therefore not have its custom icon take priority over
+     * the Child Box's custom icon. The Parent Box's [PointerIcon.Crosshair] should win for its
+     * remaining surface area not covered by the Child Box.
      *
-     *  Parent Box (output icon = [PointerIcon.Crosshair])
-     *    ⤷ Child Box (output icon = [PointerIcon.Text])
+     * Parent Box (output icon = [PointerIcon.Crosshair]) ⤷ Child Box (output icon =
+     * [PointerIcon.Text])
      */
     @Test
     fun dynamicallyAddAndRemoveParent_noOverrideDescendants() {
         val isParentVisible = mutableStateOf(false)
         val child = movableContentOf {
             Box(
-                modifier = Modifier
-                    .requiredSize(150.dp)
-                    .border(BorderStroke(2.dp, SolidColor(Color.Black)))
-                    .testTag(childIconTag)
-                    .pointerHoverIcon(desiredChildIcon, overrideDescendants = false)
+                modifier =
+                    Modifier.requiredSize(150.dp)
+                        .border(BorderStroke(2.dp, SolidColor(Color.Black)))
+                        .testTag(childIconTag)
+                        .pointerHoverIcon(desiredChildIcon, overrideDescendants = false)
             )
         }
 
@@ -3366,11 +2793,11 @@
             CompositionLocalProvider(LocalPointerIconService provides iconService) {
                 if (isParentVisible.value) {
                     Box(
-                        modifier = Modifier
-                            .requiredSize(200.dp)
-                            .border(BorderStroke(2.dp, SolidColor(Color.Red)))
-                            .testTag(parentIconTag)
-                            .pointerHoverIcon(desiredParentIcon, overrideDescendants = false),
+                        modifier =
+                            Modifier.requiredSize(200.dp)
+                                .border(BorderStroke(2.dp, SolidColor(Color.Red)))
+                                .testTag(parentIconTag)
+                                .pointerHoverIcon(desiredParentIcon, overrideDescendants = false),
                         contentAlignment = Alignment.Center
                     ) {
                         child()
@@ -3382,13 +2809,9 @@
         }
 
         // Verify initial state of pointer icon
-        rule.runOnIdle {
-            assertThat(iconService.getIcon()).isEqualTo(desiredDefaultIcon)
-        }
+        rule.runOnIdle { assertThat(iconService.getIcon()).isEqualTo(desiredDefaultIcon) }
         // Hover over center of Child Box
-        rule.onNodeWithTag(childIconTag).performMouseInput {
-            enter(center)
-        }
+        rule.onNodeWithTag(childIconTag).performMouseInput { enter(center) }
         // Verify Child Box has the desired child icon and dynamically add the Parent Box under the
         // cursor
         rule.runOnIdle {
@@ -3396,71 +2819,51 @@
             isParentVisible.value = true
         }
         // Verify the icon stays as the desired child icon
-        rule.runOnIdle {
-            assertThat(iconService.getIcon()).isEqualTo(desiredChildIcon)
-        }
+        rule.runOnIdle { assertThat(iconService.getIcon()).isEqualTo(desiredChildIcon) }
         // Move cursor within Child Box and verify it still has the child icon
-        rule.onNodeWithTag(childIconTag).performMouseInput {
-            moveTo(centerRight)
-        }
-        rule.runOnIdle {
-            assertThat(iconService.getIcon()).isEqualTo(desiredChildIcon)
-        }
+        rule.onNodeWithTag(childIconTag).performMouseInput { moveTo(centerRight) }
+        rule.runOnIdle { assertThat(iconService.getIcon()).isEqualTo(desiredChildIcon) }
         // Move cursor outside Child Box and verify the icon is updated to the desired parent icon
-        rule.onNodeWithTag(parentIconTag).performMouseInput {
-            moveTo(bottomCenter)
-        }
-        rule.runOnIdle {
-            assertThat(iconService.getIcon()).isEqualTo(desiredParentIcon)
-        }
+        rule.onNodeWithTag(parentIconTag).performMouseInput { moveTo(bottomCenter) }
+        rule.runOnIdle { assertThat(iconService.getIcon()).isEqualTo(desiredParentIcon) }
         // Move cursor back to the center of the Child Box
-        rule.onNodeWithTag(childIconTag).performMouseInput {
-            moveTo(center)
-        }
+        rule.onNodeWithTag(childIconTag).performMouseInput { moveTo(center) }
         // Dynamically remove the Parent Box
-        rule.runOnIdle {
-            isParentVisible.value = false
-        }
+        rule.runOnIdle { isParentVisible.value = false }
         // Verify the icon stays as the desired child icon
-        rule.runOnIdle {
-            assertThat(iconService.getIcon()).isEqualTo(desiredChildIcon)
-        }
+        rule.runOnIdle { assertThat(iconService.getIcon()).isEqualTo(desiredChildIcon) }
         // Exit hovering over Child Box
-        rule.onNodeWithTag(childIconTag).performMouseInput {
-            exit()
-        }
+        rule.onNodeWithTag(childIconTag).performMouseInput { exit() }
     }
 
     /**
-     * Setup:
-     * The hierarchy for the initial setup of this test is:
-     *  Child Box (custom icon = [PointerIcon.Text], overrideDescendants = FALSE)
+     * Setup: The hierarchy for the initial setup of this test is: Child Box (custom icon =
+     * [PointerIcon.Text], overrideDescendants = FALSE)
      *
-     *  After hovering over the center of the screen, the hierarchy under the cursor updates to:
-     *  Parent Box (custom icon = [PointerIcon.Crosshair], overrideDescendants = TRUE)
-     *    ⤷ Child Box (custom icon = [PointerIcon.Text], overrideDescendants = FALSE)
+     * After hovering over the center of the screen, the hierarchy under the cursor updates to:
+     * Parent Box (custom icon = [PointerIcon.Crosshair], overrideDescendants = TRUE) ⤷ Child Box
+     * (custom icon = [PointerIcon.Text], overrideDescendants = FALSE)
      *
-     *  Expected Output:
-     *  The Child Box's [PointerIcon.Text] should win for its entire surface area when the Parent
-     *  Box isn't present. Once the Parent Box becomes visible, the Parent Box's
-     *  [PointerIcon.Crosshair] should win for its entire surface area. This is because the Parent
-     *  Box's overrideDescendants = true, so its children should always respect Parent Box's custom
-     *  icon. This also requires updating the user facing cursor icon to reflect the Parent Box that
-     *  was added under the cursor.
+     * Expected Output: The Child Box's [PointerIcon.Text] should win for its entire surface area
+     * when the Parent Box isn't present. Once the Parent Box becomes visible, the Parent Box's
+     * [PointerIcon.Crosshair] should win for its entire surface area. This is because the Parent
+     * Box's overrideDescendants = true, so its children should always respect Parent Box's custom
+     * icon. This also requires updating the user facing cursor icon to reflect the Parent Box that
+     * was added under the cursor.
      *
-     *  Parent Box (output icon = [PointerIcon.Crosshair])
-     *    ⤷ Child Box (output icon = [PointerIcon.Crosshair])
+     * Parent Box (output icon = [PointerIcon.Crosshair]) ⤷ Child Box (output icon =
+     * [PointerIcon.Crosshair])
      */
     @Test
     fun dynamicallyAddAndRemoveParent_parentOverridesDescendants() {
         val isParentVisible = mutableStateOf(false)
         val child = movableContentOf {
             Box(
-                modifier = Modifier
-                    .requiredSize(150.dp)
-                    .border(BorderStroke(2.dp, SolidColor(Color.Black)))
-                    .testTag(childIconTag)
-                    .pointerHoverIcon(desiredChildIcon, overrideDescendants = false)
+                modifier =
+                    Modifier.requiredSize(150.dp)
+                        .border(BorderStroke(2.dp, SolidColor(Color.Black)))
+                        .testTag(childIconTag)
+                        .pointerHoverIcon(desiredChildIcon, overrideDescendants = false)
             )
         }
 
@@ -3468,11 +2871,11 @@
             CompositionLocalProvider(LocalPointerIconService provides iconService) {
                 if (isParentVisible.value) {
                     Box(
-                        modifier = Modifier
-                            .requiredSize(200.dp)
-                            .border(BorderStroke(2.dp, SolidColor(Color.Red)))
-                            .testTag(parentIconTag)
-                            .pointerHoverIcon(desiredParentIcon, overrideDescendants = true),
+                        modifier =
+                            Modifier.requiredSize(200.dp)
+                                .border(BorderStroke(2.dp, SolidColor(Color.Red)))
+                                .testTag(parentIconTag)
+                                .pointerHoverIcon(desiredParentIcon, overrideDescendants = true),
                         contentAlignment = Alignment.Center
                     ) {
                         child()
@@ -3484,13 +2887,9 @@
         }
 
         // Verify initial state of pointer icon
-        rule.runOnIdle {
-            assertThat(iconService.getIcon()).isEqualTo(desiredDefaultIcon)
-        }
+        rule.runOnIdle { assertThat(iconService.getIcon()).isEqualTo(desiredDefaultIcon) }
         // Hover over center of Child Box
-        rule.onNodeWithTag(childIconTag).performMouseInput {
-            enter(center)
-        }
+        rule.onNodeWithTag(childIconTag).performMouseInput { enter(center) }
         // Verify Child Box has the desired child icon and dynamically add the Parent Box under the
         // cursor
         rule.runOnIdle {
@@ -3498,94 +2897,77 @@
             isParentVisible.value = true
         }
         // Verify the icon has been updated to the desired parent icon
-        rule.runOnIdle {
-            assertThat(iconService.getIcon()).isEqualTo(desiredParentIcon)
-        }
+        rule.runOnIdle { assertThat(iconService.getIcon()).isEqualTo(desiredParentIcon) }
         // Move cursor within Child Box and verify it still has the parent icon
-        rule.onNodeWithTag(childIconTag).performMouseInput {
-            moveTo(centerRight)
-        }
-        rule.runOnIdle {
-            assertThat(iconService.getIcon()).isEqualTo(desiredParentIcon)
-        }
+        rule.onNodeWithTag(childIconTag).performMouseInput { moveTo(centerRight) }
+        rule.runOnIdle { assertThat(iconService.getIcon()).isEqualTo(desiredParentIcon) }
         // Move cursor outside Child Box and verify the icon is still the parent icon
-        rule.onNodeWithTag(parentIconTag).performMouseInput {
-            moveTo(bottomCenter)
-        }
-        rule.runOnIdle {
-            assertThat(iconService.getIcon()).isEqualTo(desiredParentIcon)
-        }
+        rule.onNodeWithTag(parentIconTag).performMouseInput { moveTo(bottomCenter) }
+        rule.runOnIdle { assertThat(iconService.getIcon()).isEqualTo(desiredParentIcon) }
         // Move cursor back to the center of the Child Box
-        rule.onNodeWithTag(childIconTag).performMouseInput {
-            moveTo(center)
-        }
+        rule.onNodeWithTag(childIconTag).performMouseInput { moveTo(center) }
         // Dynamically remove the Parent Box
-        rule.runOnIdle {
-            isParentVisible.value = false
-        }
+        rule.runOnIdle { isParentVisible.value = false }
         // Verify the icon has been updated to the desired child icon
-        rule.runOnIdle {
-            assertThat(iconService.getIcon()).isEqualTo(desiredChildIcon)
-        }
+        rule.runOnIdle { assertThat(iconService.getIcon()).isEqualTo(desiredChildIcon) }
         // Exit hovering over Child Box
-        rule.onNodeWithTag(childIconTag).performMouseInput {
-            exit()
-        }
+        rule.onNodeWithTag(childIconTag).performMouseInput { exit() }
     }
 
     /**
-     * Setup:
-     * The hierarchy for the initial setup of this test is:
-     *  Parent Box (custom icon = [PointerIcon.Crosshair], overrideDescendants = FALSE)
-     *    ⤷ Grandchild Box (custom icon = [PointerIcon.Hand], overrideDescendants = FALSE)
+     * Setup: The hierarchy for the initial setup of this test is: Parent Box (custom icon =
+     * [PointerIcon.Crosshair], overrideDescendants = FALSE) ⤷ Grandchild Box (custom icon =
+     * [PointerIcon.Hand], overrideDescendants = FALSE)
      *
-     *  After hovering over the center of the screen, the hierarchy under the cursor updates to:
-     *  Parent Box (custom icon = [PointerIcon.Crosshair], overrideDescendants = FALSE)
-     *    ⤷ Child Box (custom icon = [PointerIcon.Text], overrideDescendants = FALSE)
-     *      ⤷ Grandchild Box (custom icon = [PointerIcon.Hand], overrideDescendants = FALSE)
+     * After hovering over the center of the screen, the hierarchy under the cursor updates to:
+     * Parent Box (custom icon = [PointerIcon.Crosshair], overrideDescendants = FALSE) ⤷ Child Box
+     * (custom icon = [PointerIcon.Text], overrideDescendants = FALSE) ⤷ Grandchild Box (custom icon
+     * = [PointerIcon.Hand], overrideDescendants = FALSE)
      *
-     *  Expected Output:
-     *  The Grandchild Box's [PointerIcon.Hand] should win for its entire surface area regardless of
-     *  whether there's a Child Box or Parent Box present. This is because the Parent Box and Child
-     *  Box have overrideDescendants = false and should therefore not have their custom icons take
-     *  priority over the Grandchild Box's custom icon. The Child Box should win for its remaining
-     *  surface area not covered by the Grandchild Box. The Parent Box's [PointerIcon.Crosshair]
-     *  should win for its remaining surface area not covered by the Child Box.
+     * Expected Output: The Grandchild Box's [PointerIcon.Hand] should win for its entire surface
+     * area regardless of whether there's a Child Box or Parent Box present. This is because the
+     * Parent Box and Child Box have overrideDescendants = false and should therefore not have their
+     * custom icons take priority over the Grandchild Box's custom icon. The Child Box should win
+     * for its remaining surface area not covered by the Grandchild Box. The Parent Box's
+     * [PointerIcon.Crosshair] should win for its remaining surface area not covered by the Child
+     * Box.
      *
-     *  Parent Box (output icon = [PointerIcon.Crosshair])
-     *    ⤷ Child Box (output icon = [PointerIcon.Text])
-     *      ⤷ Grandchild Box (output icon = [PointerIcon.Hand])
+     * Parent Box (output icon = [PointerIcon.Crosshair]) ⤷ Child Box (output icon =
+     * [PointerIcon.Text]) ⤷ Grandchild Box (output icon = [PointerIcon.Hand])
      */
     @Test
     fun dynamicallyAddAndRemoveNestedChild_noOverrideDescendants() {
         val isChildVisible = mutableStateOf(false)
         val grandchild = movableContentOf {
             Box(
-                modifier = Modifier
-                    .requiredSize(100.dp)
-                    .border(BorderStroke(2.dp, SolidColor(Color.Blue)))
-                    .testTag(grandchildIconTag)
-                    .pointerHoverIcon(desiredGrandchildIcon, overrideDescendants = false)
+                modifier =
+                    Modifier.requiredSize(100.dp)
+                        .border(BorderStroke(2.dp, SolidColor(Color.Blue)))
+                        .testTag(grandchildIconTag)
+                        .pointerHoverIcon(desiredGrandchildIcon, overrideDescendants = false)
             )
         }
 
         rule.setContent {
             CompositionLocalProvider(LocalPointerIconService provides iconService) {
                 Box(
-                    modifier = Modifier
-                        .requiredSize(200.dp)
-                        .border(BorderStroke(2.dp, SolidColor(Color.Red)))
-                        .testTag(parentIconTag)
-                        .pointerHoverIcon(desiredParentIcon, overrideDescendants = false),
+                    modifier =
+                        Modifier.requiredSize(200.dp)
+                            .border(BorderStroke(2.dp, SolidColor(Color.Red)))
+                            .testTag(parentIconTag)
+                            .pointerHoverIcon(desiredParentIcon, overrideDescendants = false),
                     contentAlignment = Alignment.Center
                 ) {
                     if (isChildVisible.value) {
                         Box(
-                            modifier = Modifier
-                                .requiredSize(150.dp)
-                                .border(BorderStroke(2.dp, SolidColor(Color.Black)))
-                                .testTag(childIconTag)
-                                .pointerHoverIcon(desiredChildIcon, overrideDescendants = false),
+                            modifier =
+                                Modifier.requiredSize(150.dp)
+                                    .border(BorderStroke(2.dp, SolidColor(Color.Black)))
+                                    .testTag(childIconTag)
+                                    .pointerHoverIcon(
+                                        desiredChildIcon,
+                                        overrideDescendants = false
+                                    ),
                             contentAlignment = Alignment.Center
                         ) {
                             grandchild()
@@ -3598,13 +2980,9 @@
         }
 
         // Verify initial state of pointer icon
-        rule.runOnIdle {
-            assertThat(iconService.getIcon()).isEqualTo(desiredDefaultIcon)
-        }
+        rule.runOnIdle { assertThat(iconService.getIcon()).isEqualTo(desiredDefaultIcon) }
         // Hover over center of Grandchild Box
-        rule.onNodeWithTag(grandchildIconTag).performMouseInput {
-            enter(center)
-        }
+        rule.onNodeWithTag(grandchildIconTag).performMouseInput { enter(center) }
         // Verify Grandchild Box has the desired grandchild icon and dynamically add the Child Box
         // under the cursor
         rule.runOnIdle {
@@ -3612,108 +2990,83 @@
             isChildVisible.value = true
         }
         // Verify the icon stays as the desired grandchild icon
-        rule.runOnIdle {
-            assertThat(iconService.getIcon()).isEqualTo(desiredGrandchildIcon)
-        }
+        rule.runOnIdle { assertThat(iconService.getIcon()).isEqualTo(desiredGrandchildIcon) }
         // Move cursor within Grandchild Box and verify it still has the grandchild icon
-        rule.onNodeWithTag(grandchildIconTag).performMouseInput {
-            moveTo(centerRight)
-        }
-        rule.runOnIdle {
-            assertThat(iconService.getIcon()).isEqualTo(desiredGrandchildIcon)
-        }
+        rule.onNodeWithTag(grandchildIconTag).performMouseInput { moveTo(centerRight) }
+        rule.runOnIdle { assertThat(iconService.getIcon()).isEqualTo(desiredGrandchildIcon) }
         // Move cursor outside Grandchild Box within Child Box to verify icon is now the child icon
-        rule.onNodeWithTag(childIconTag).performMouseInput {
-            moveTo(bottomRight)
-        }
-        rule.runOnIdle {
-            assertThat(iconService.getIcon()).isEqualTo(desiredChildIcon)
-        }
+        rule.onNodeWithTag(childIconTag).performMouseInput { moveTo(bottomRight) }
+        rule.runOnIdle { assertThat(iconService.getIcon()).isEqualTo(desiredChildIcon) }
         // Move cursor outside Child Box and verify the icon is updated to the desired parent icon
-        rule.onNodeWithTag(parentIconTag).performMouseInput {
-            moveTo(bottomRight)
-        }
-        rule.runOnIdle {
-            assertThat(iconService.getIcon()).isEqualTo(desiredParentIcon)
-        }
+        rule.onNodeWithTag(parentIconTag).performMouseInput { moveTo(bottomRight) }
+        rule.runOnIdle { assertThat(iconService.getIcon()).isEqualTo(desiredParentIcon) }
         // Move cursor back to the center of the Grandchild Box
-        rule.onNodeWithTag(grandchildIconTag).performMouseInput {
-            moveTo(center)
-        }
+        rule.onNodeWithTag(grandchildIconTag).performMouseInput { moveTo(center) }
         // Dynamically remove the Child Box
-        rule.runOnIdle {
-            isChildVisible.value = false
-        }
+        rule.runOnIdle { isChildVisible.value = false }
         // Verify the icon has been updated to the desired grandchild icon
-        rule.runOnIdle {
-            assertThat(iconService.getIcon()).isEqualTo(desiredGrandchildIcon)
-        }
+        rule.runOnIdle { assertThat(iconService.getIcon()).isEqualTo(desiredGrandchildIcon) }
         // Exit hovering over Parent Box
-        rule.onNodeWithTag(parentIconTag).performMouseInput {
-            exit()
-        }
+        rule.onNodeWithTag(parentIconTag).performMouseInput { exit() }
     }
 
     /**
-     * Setup:
-     * The hierarchy for the initial setup of this test is:
-     *  Parent Box (custom icon = [PointerIcon.Crosshair], overrideDescendants = FALSE)
-     *    ⤷ Grandchild Box (custom icon = [PointerIcon.Hand], overrideDescendants = FALSE)
+     * Setup: The hierarchy for the initial setup of this test is: Parent Box (custom icon =
+     * [PointerIcon.Crosshair], overrideDescendants = FALSE) ⤷ Grandchild Box (custom icon =
+     * [PointerIcon.Hand], overrideDescendants = FALSE)
      *
-     *  After hovering over the center of the screen, the hierarchy under the cursor updates to:
-     *  Parent Box (custom icon = [PointerIcon.Crosshair], overrideDescendants = FALSE)
-     *    ⤷ Child Box (custom icon = [PointerIcon.Text], overrideDescendants = TRUE)
-     *      ⤷ Grandchild Box (custom icon = [PointerIcon.Hand], overrideDescendants = FALSE)
+     * After hovering over the center of the screen, the hierarchy under the cursor updates to:
+     * Parent Box (custom icon = [PointerIcon.Crosshair], overrideDescendants = FALSE) ⤷ Child Box
+     * (custom icon = [PointerIcon.Text], overrideDescendants = TRUE) ⤷ Grandchild Box (custom icon
+     * = [PointerIcon.Hand], overrideDescendants = FALSE)
      *
-     *  Expected Output:
-     *  The Grandchild Box's [PointerIcon.Hand] should win for its entire surface area regardless of
-     *  whether there's a Child Box or Parent Box present. This is because the Parent Box and Child
-     *  Box have overrideDescendants = false and should therefore not have thei custom icona take
-     *  priority over the Grandchild Box's custom icon. The Child Box should win for its remaining
-     *  surface area not covered by the Grandchild Box. The Parent Box's [PointerIcon.Crosshair]
-     *  should win for its remaining surface area not covered by the Child Box.
-     *  Initially, the Parent Box's [PointerIcon.Crosshair] should win for its entire surface area
-     *  because it has no competition in the hierarchy for any other custom icons. After the Child
-     *  Box and the Grandchild Box are dynamically added under the cursor, the Child Box's
-     *  [PointerIcon.Text] should win for the entire surface area of the Child Box. This includes
-     *  the Grandchild Box's [PointerIcon.Text] should win for the remaining surface area of the Child Box not
-     *  covered by the Grandchild Box. This also requires updating the user facing cursor icon to
-     *  reflect the Child Box and Grandchild Box that were added under the cursor.
+     * Expected Output: The Grandchild Box's [PointerIcon.Hand] should win for its entire surface
+     * area regardless of whether there's a Child Box or Parent Box present. This is because the
+     * Parent Box and Child Box have overrideDescendants = false and should therefore not have thei
+     * custom icona take priority over the Grandchild Box's custom icon. The Child Box should win
+     * for its remaining surface area not covered by the Grandchild Box. The Parent Box's
+     * [PointerIcon.Crosshair] should win for its remaining surface area not covered by the Child
+     * Box. Initially, the Parent Box's [PointerIcon.Crosshair] should win for its entire surface
+     * area because it has no competition in the hierarchy for any other custom icons. After the
+     * Child Box and the Grandchild Box are dynamically added under the cursor, the Child Box's
+     * [PointerIcon.Text] should win for the entire surface area of the Child Box. This includes the
+     * Grandchild Box's [PointerIcon.Text] should win for the remaining surface area of the Child
+     * Box not covered by the Grandchild Box. This also requires updating the user facing cursor
+     * icon to reflect the Child Box and Grandchild Box that were added under the cursor.
      *
-     *  Parent Box (output icon = [PointerIcon.Crosshair])
-     *    ⤷ Child Box (output icon = [PointerIcon.Text])
-     *      ⤷ Grandchild Box (output icon = [PointerIcon.Hand])
+     * Parent Box (output icon = [PointerIcon.Crosshair]) ⤷ Child Box (output icon =
+     * [PointerIcon.Text]) ⤷ Grandchild Box (output icon = [PointerIcon.Hand])
      */
     @Test
     fun dynamicallyAddAndRemoveNestedChild_ChildOverridesDescendants() {
         val isChildVisible = mutableStateOf(false)
         val grandchild = movableContentOf {
             Box(
-                modifier = Modifier
-                    .requiredSize(100.dp)
-                    .border(BorderStroke(2.dp, SolidColor(Color.Black)))
-                    .testTag(grandchildIconTag)
-                    .pointerHoverIcon(desiredGrandchildIcon, overrideDescendants = false)
+                modifier =
+                    Modifier.requiredSize(100.dp)
+                        .border(BorderStroke(2.dp, SolidColor(Color.Black)))
+                        .testTag(grandchildIconTag)
+                        .pointerHoverIcon(desiredGrandchildIcon, overrideDescendants = false)
             )
         }
 
         rule.setContent {
             CompositionLocalProvider(LocalPointerIconService provides iconService) {
                 Box(
-                    modifier = Modifier
-                        .requiredSize(200.dp)
-                        .border(BorderStroke(2.dp, SolidColor(Color.Red)))
-                        .testTag(parentIconTag)
-                        .pointerHoverIcon(desiredParentIcon, overrideDescendants = false),
+                    modifier =
+                        Modifier.requiredSize(200.dp)
+                            .border(BorderStroke(2.dp, SolidColor(Color.Red)))
+                            .testTag(parentIconTag)
+                            .pointerHoverIcon(desiredParentIcon, overrideDescendants = false),
                     contentAlignment = Alignment.Center
                 ) {
                     if (isChildVisible.value) {
                         Box(
-                            modifier = Modifier
-                                .requiredSize(150.dp)
-                                .border(BorderStroke(2.dp, SolidColor(Color.Red)))
-                                .testTag(childIconTag)
-                                .pointerHoverIcon(desiredChildIcon, overrideDescendants = true),
+                            modifier =
+                                Modifier.requiredSize(150.dp)
+                                    .border(BorderStroke(2.dp, SolidColor(Color.Red)))
+                                    .testTag(childIconTag)
+                                    .pointerHoverIcon(desiredChildIcon, overrideDescendants = true),
                             contentAlignment = Alignment.Center
                         ) {
                             grandchild()
@@ -3726,13 +3079,9 @@
         }
 
         // Verify initial state of pointer icon
-        rule.runOnIdle {
-            assertThat(iconService.getIcon()).isEqualTo(desiredDefaultIcon)
-        }
+        rule.runOnIdle { assertThat(iconService.getIcon()).isEqualTo(desiredDefaultIcon) }
         // Hover over center of Grandchild Box
-        rule.onNodeWithTag(grandchildIconTag).performMouseInput {
-            enter(center)
-        }
+        rule.onNodeWithTag(grandchildIconTag).performMouseInput { enter(center) }
         // Verify Grandchild Box has the desired grandchild icon and dynamically add the Child Box
         // under the cursor
         rule.runOnIdle {
@@ -3740,76 +3089,51 @@
             isChildVisible.value = true
         }
         // Verify the icon has been updated to the desired child icon
-        rule.runOnIdle {
-            assertThat(iconService.getIcon()).isEqualTo(desiredChildIcon)
-        }
+        rule.runOnIdle { assertThat(iconService.getIcon()).isEqualTo(desiredChildIcon) }
         // Move cursor within Grandchild Box and verify it still has the child icon
-        rule.onNodeWithTag(grandchildIconTag).performMouseInput {
-            moveTo(centerRight)
-        }
-        rule.runOnIdle {
-            assertThat(iconService.getIcon()).isEqualTo(desiredChildIcon)
-        }
+        rule.onNodeWithTag(grandchildIconTag).performMouseInput { moveTo(centerRight) }
+        rule.runOnIdle { assertThat(iconService.getIcon()).isEqualTo(desiredChildIcon) }
         // Move cursor outside Grandchild Box within Child Box to verify it still has the child icon
-        rule.onNodeWithTag(childIconTag).performMouseInput {
-            moveTo(bottomRight)
-        }
-        rule.runOnIdle {
-            assertThat(iconService.getIcon()).isEqualTo(desiredChildIcon)
-        }
+        rule.onNodeWithTag(childIconTag).performMouseInput { moveTo(bottomRight) }
+        rule.runOnIdle { assertThat(iconService.getIcon()).isEqualTo(desiredChildIcon) }
         // Move cursor outside Child Box and verify the icon is updated to the desired parent icon
-        rule.onNodeWithTag(parentIconTag).performMouseInput {
-            moveTo(bottomCenter)
-        }
-        rule.runOnIdle {
-            assertThat(iconService.getIcon()).isEqualTo(desiredParentIcon)
-        }
+        rule.onNodeWithTag(parentIconTag).performMouseInput { moveTo(bottomCenter) }
+        rule.runOnIdle { assertThat(iconService.getIcon()).isEqualTo(desiredParentIcon) }
         // Move cursor back to center of the Grandchild Box
-        rule.onNodeWithTag(grandchildIconTag).performMouseInput {
-            moveTo(center)
-        }
+        rule.onNodeWithTag(grandchildIconTag).performMouseInput { moveTo(center) }
         // Dynamically remove the Child Box
-        rule.runOnIdle {
-            isChildVisible.value = false
-        }
+        rule.runOnIdle { isChildVisible.value = false }
         // Verify the icon has been updated to the desired grandchild icon
-        rule.runOnIdle {
-            assertThat(iconService.getIcon()).isEqualTo(desiredGrandchildIcon)
-        }
+        rule.runOnIdle { assertThat(iconService.getIcon()).isEqualTo(desiredGrandchildIcon) }
         // Exit hovering over Parent Box
-        rule.onNodeWithTag(parentIconTag).performMouseInput {
-            exit()
-        }
+        rule.onNodeWithTag(parentIconTag).performMouseInput { exit() }
     }
 
     /**
-     * Setup:
-     * The hierarchy for the initial setup of this test is:
-     *  Grandparent Box (custom icon = [PointerIcon.Crosshair], overrideDescendants = FALSE)
-     *    ⤷ Parent Box (custom icon = [PointerIcon.Crosshair], overrideDescendants = FALSE)
-     *      ⤷ Grandchild Box (custom icon = [PointerIcon.Hand], overrideDescendants = FALSE)
+     * Setup: The hierarchy for the initial setup of this test is: Grandparent Box (custom icon =
+     * [PointerIcon.Crosshair], overrideDescendants = FALSE) ⤷ Parent Box (custom icon =
+     * [PointerIcon.Crosshair], overrideDescendants = FALSE) ⤷ Grandchild Box (custom icon =
+     * [PointerIcon.Hand], overrideDescendants = FALSE)
      *
-     *  After hovering over the corner of the Grandparent Box that doesn't overlap with any
-     *  descendant, the hierarchy of the screen updates to:
-     *  Grandparent Box (custom icon = [PointerIcon.Crosshair], overrideDescendants = FALSE)
-     *    ⤷ Parent Box (custom icon = [PointerIcon.Crosshair], overrideDescendants = FALSE)
-     *      ⤷ Child Box (custom icon = [PointerIcon.Text], overrideDescendants = FALSE)
-     *         ⤷ Grandchild Box (custom icon = [PointerIcon.Hand], overrideDescendants = FALSE)
+     * After hovering over the corner of the Grandparent Box that doesn't overlap with any
+     * descendant, the hierarchy of the screen updates to: Grandparent Box (custom icon =
+     * [PointerIcon.Crosshair], overrideDescendants = FALSE) ⤷ Parent Box (custom icon =
+     * [PointerIcon.Crosshair], overrideDescendants = FALSE) ⤷ Child Box (custom icon =
+     * [PointerIcon.Text], overrideDescendants = FALSE) ⤷ Grandchild Box (custom icon =
+     * [PointerIcon.Hand], overrideDescendants = FALSE)
      *
-     *  Expected Output:
-     *  The Grandchild Box's [PointerIcon.Hand] should win for its entire surface area regardless of
-     *  whether there's a Child, Parent, or Grandparent Box present. This is because the
-     *  Grandparent, Parent, and Child Boxes have overrideDescendants = false and should therefore
-     *  not have their custom icons take priority over the Grandchild Box's custom icon. The Child
-     *  Box should win for its remaining surface area not covered by the Grandchild Box. The Parent
-     *  Box's [PointerIcon.Crosshair] should win for its remaining surface area not covered by the
-     *  Child Box. And the Grandparent Box should win for its remaining surface area not covered by
-     *  the Parent Box.
+     * Expected Output: The Grandchild Box's [PointerIcon.Hand] should win for its entire surface
+     * area regardless of whether there's a Child, Parent, or Grandparent Box present. This is
+     * because the Grandparent, Parent, and Child Boxes have overrideDescendants = false and should
+     * therefore not have their custom icons take priority over the Grandchild Box's custom icon.
+     * The Child Box should win for its remaining surface area not covered by the Grandchild Box.
+     * The Parent Box's [PointerIcon.Crosshair] should win for its remaining surface area not
+     * covered by the Child Box. And the Grandparent Box should win for its remaining surface area
+     * not covered by the Parent Box.
      *
-     *  Grandparent Box (output icon = [PointerIcon.Crosshair])
-     *    ⤷ Parent Box (output icon = [PointerIcon.Crosshair])
-     *      ⤷ Child Box (output icon = [PointerIcon.Text])
-     *        ⤷ Grandchild Box (output icon = [PointerIcon.Hand])
+     * Grandparent Box (output icon = [PointerIcon.Crosshair]) ⤷ Parent Box (output icon =
+     * [PointerIcon.Crosshair]) ⤷ Child Box (output icon = [PointerIcon.Text]) ⤷ Grandchild Box
+     * (output icon = [PointerIcon.Hand])
      */
     @Test
     fun dynamicallyAddAndRemoveNestedChild_notHoveredOverChild() {
@@ -3818,42 +3142,42 @@
         val isChildVisible = mutableStateOf(false)
         val grandchild = movableContentOf {
             Box(
-                modifier = Modifier
-                    .requiredSize(100.dp)
-                    .border(BorderStroke(2.dp, SolidColor(Color.Blue)))
-                    .testTag(grandchildIconTag)
-                    .pointerHoverIcon(desiredGrandchildIcon, overrideDescendants = false)
+                modifier =
+                    Modifier.requiredSize(100.dp)
+                        .border(BorderStroke(2.dp, SolidColor(Color.Blue)))
+                        .testTag(grandchildIconTag)
+                        .pointerHoverIcon(desiredGrandchildIcon, overrideDescendants = false)
             )
         }
 
         rule.setContent {
             CompositionLocalProvider(LocalPointerIconService provides iconService) {
                 Box(
-                    modifier = Modifier
-                        .requiredSize(200.dp)
-                        .border(BorderStroke(2.dp, SolidColor(Color.Red)))
-                        .testTag(grandparentIconTag)
-                        .pointerHoverIcon(desiredGrandparentIcon, overrideDescendants = false),
+                    modifier =
+                        Modifier.requiredSize(200.dp)
+                            .border(BorderStroke(2.dp, SolidColor(Color.Red)))
+                            .testTag(grandparentIconTag)
+                            .pointerHoverIcon(desiredGrandparentIcon, overrideDescendants = false),
                     contentAlignment = Alignment.Center
                 ) {
                     Box(
-                        modifier = Modifier
-                            .requiredSize(175.dp)
-                            .border(BorderStroke(2.dp, SolidColor(Color.Red)))
-                            .testTag(parentIconTag)
-                            .pointerHoverIcon(desiredParentIcon, overrideDescendants = false),
+                        modifier =
+                            Modifier.requiredSize(175.dp)
+                                .border(BorderStroke(2.dp, SolidColor(Color.Red)))
+                                .testTag(parentIconTag)
+                                .pointerHoverIcon(desiredParentIcon, overrideDescendants = false),
                         contentAlignment = Alignment.Center
                     ) {
                         if (isChildVisible.value) {
                             Box(
-                                modifier = Modifier
-                                    .requiredSize(150.dp)
-                                    .border(BorderStroke(2.dp, SolidColor(Color.Black)))
-                                    .testTag(childIconTag)
-                                    .pointerHoverIcon(
-                                        desiredChildIcon,
-                                        overrideDescendants = false
-                                    ),
+                                modifier =
+                                    Modifier.requiredSize(150.dp)
+                                        .border(BorderStroke(2.dp, SolidColor(Color.Black)))
+                                        .testTag(childIconTag)
+                                        .pointerHoverIcon(
+                                            desiredChildIcon,
+                                            overrideDescendants = false
+                                        ),
                                 contentAlignment = Alignment.Center
                             ) {
                                 grandchild()
@@ -3867,85 +3191,57 @@
         }
 
         // Verify initial state of pointer icon
-        rule.runOnIdle {
-            assertThat(iconService.getIcon()).isEqualTo(desiredDefaultIcon)
-        }
+        rule.runOnIdle { assertThat(iconService.getIcon()).isEqualTo(desiredDefaultIcon) }
         // Hover over center of Grandchild Box
-        rule.onNodeWithTag(grandchildIconTag).performMouseInput {
-            enter(center)
-        }
+        rule.onNodeWithTag(grandchildIconTag).performMouseInput { enter(center) }
         // Verify Grandchild Box has the desired grandchild icon
-        rule.runOnIdle {
-            assertThat(iconService.getIcon()).isEqualTo(desiredGrandchildIcon)
-        }
+        rule.runOnIdle { assertThat(iconService.getIcon()).isEqualTo(desiredGrandchildIcon) }
         // Move to corner of Grandparent Box where no descendants are under the cursor
-        rule.onNodeWithTag(grandparentIconTag).performMouseInput {
-            moveTo(bottomRight)
-        }
+        rule.onNodeWithTag(grandparentIconTag).performMouseInput { moveTo(bottomRight) }
         // Verify the icon is the desired grandparent icon and dynamically add the Child Box
         rule.runOnIdle {
             assertThat(iconService.getIcon()).isEqualTo(desiredGrandparentIcon)
             isChildVisible.value = true
         }
         // Verify the icon stays as the desired grandparent icon
-        rule.runOnIdle {
-            assertThat(iconService.getIcon()).isEqualTo(desiredGrandparentIcon)
-        }
+        rule.runOnIdle { assertThat(iconService.getIcon()).isEqualTo(desiredGrandparentIcon) }
         // Move cursor within Grandparent Box and verify it still has the grandparent icon
-        rule.onNodeWithTag(grandparentIconTag).performMouseInput {
-            moveTo(centerRight)
-        }
-        rule.runOnIdle {
-            assertThat(iconService.getIcon()).isEqualTo(desiredGrandparentIcon)
-        }
+        rule.onNodeWithTag(grandparentIconTag).performMouseInput { moveTo(centerRight) }
+        rule.runOnIdle { assertThat(iconService.getIcon()).isEqualTo(desiredGrandparentIcon) }
         // Move cursor outside Grandparent Box to Parent Box to verify icon is now the parent icon
-        rule.onNodeWithTag(parentIconTag).performMouseInput {
-            moveTo(bottomRight)
-        }
-        rule.runOnIdle {
-            assertThat(iconService.getIcon()).isEqualTo(desiredParentIcon)
-        }
+        rule.onNodeWithTag(parentIconTag).performMouseInput { moveTo(bottomRight) }
+        rule.runOnIdle { assertThat(iconService.getIcon()).isEqualTo(desiredParentIcon) }
         // Move cursor back to corner of Grandparent Box where no descendants are under the cursor
-        rule.onNodeWithTag(grandparentIconTag).performMouseInput {
-            moveTo(bottomRight)
-        }
+        rule.onNodeWithTag(grandparentIconTag).performMouseInput { moveTo(bottomRight) }
         // Dynamically remove the Child Box
-        rule.runOnIdle {
-            isChildVisible.value = false
-        }
+        rule.runOnIdle { isChildVisible.value = false }
         // Verify the icon stays as the grandparent icon
-        rule.runOnIdle {
-            assertThat(iconService.getIcon()).isEqualTo(desiredGrandparentIcon)
-        }
+        rule.runOnIdle { assertThat(iconService.getIcon()).isEqualTo(desiredGrandparentIcon) }
         // Exit hovering over Parent Box
-        rule.onNodeWithTag(parentIconTag).performMouseInput {
-            exit()
-        }
+        rule.onNodeWithTag(parentIconTag).performMouseInput { exit() }
     }
 
     /**
-     * Setup:
-     * The hierarchy for the initial setup of this test is:
-     *  Parent Box (custom icon = [PointerIcon.Crosshair], overrideDescendants = FALSE)
-     *    ⤷ Child Box (custom icon = [PointerIcon.Text], overrideDescendants = FALSE)
+     * Setup: The hierarchy for the initial setup of this test is: Parent Box (custom icon =
+     * [PointerIcon.Crosshair], overrideDescendants = FALSE) ⤷ Child Box (custom icon =
+     * [PointerIcon.Text], overrideDescendants = FALSE)
      *
-     *  After hovering over the corner of the Parent Box that doesn't overlap with any descendant,
-     *  the hierarchy of the screen updates to:
-     *  Parent Box (custom icon = [PointerIcon.Crosshair], overrideDescendants = FALSE)
-     *    ⤷ Child Box (custom icon = [PointerIcon.Text], overrideDescendants = FALSE)
-     *      ⤷ Grandchild Box (custom icon = [PointerIcon.Hand], overrideDescendants = FALSE)
+     * After hovering over the corner of the Parent Box that doesn't overlap with any descendant,
+     * the hierarchy of the screen updates to: Parent Box (custom icon = [PointerIcon.Crosshair],
+     * overrideDescendants = FALSE) ⤷ Child Box (custom icon = [PointerIcon.Text],
+     * overrideDescendants = FALSE) ⤷ Grandchild Box (custom icon = [PointerIcon.Hand],
+     * overrideDescendants = FALSE)
      *
-     *  Expected Output:
-     *  The Grandchild Box's [PointerIcon.Hand] should win for its entire surface area regardless of
-     *  whether there's a Child or Parent Box present. This is because the Parent and Child Boxes
-     *  have overrideDescendants = false and should therefore not have their custom icons take
-     *  priority over the Grandchild Box's custom icon. The Child Box should win for its remaining
-     *  surface area not covered by the Grandchild Box. The Parent Box's [PointerIcon.Crosshair]
-     *  should win for its remaining surface area not covered by the Child Box.
+     * Expected Output: The Grandchild Box's [PointerIcon.Hand] should win for its entire surface
+     * area regardless of whether there's a Child or Parent Box present. This is because the Parent
+     * and Child Boxes have overrideDescendants = false and should therefore not have their custom
+     * icons take priority over the Grandchild Box's custom icon. The Child Box should win for its
+     * remaining surface area not covered by the Grandchild Box. The Parent Box's
+     * [PointerIcon.Crosshair] should win for its remaining surface area not covered by the Child
+     * Box.
      *
-     *  Parent Box (output icon = [PointerIcon.Crosshair])
-     *    ⤷ Child Box (output icon = [PointerIcon.Text])
-     *      ⤷ Grandchild Box (output icon = [PointerIcon.Hand])
+     * Parent Box (output icon = [PointerIcon.Crosshair]) ⤷ Child Box (output icon =
+     * [PointerIcon.Text]) ⤷ Grandchild Box (output icon = [PointerIcon.Hand])
      */
     @Test
     fun dynamicallyAddAndRemoveGrandchild_notHoveredOverGrandchild() {
@@ -3954,34 +3250,31 @@
         rule.setContent {
             CompositionLocalProvider(LocalPointerIconService provides iconService) {
                 Box(
-                    modifier = Modifier
-                        .requiredSize(200.dp)
-                        .border(BorderStroke(2.dp, SolidColor(Color.Red)))
-                        .testTag(parentIconTag)
-                        .pointerHoverIcon(desiredParentIcon, overrideDescendants = false),
+                    modifier =
+                        Modifier.requiredSize(200.dp)
+                            .border(BorderStroke(2.dp, SolidColor(Color.Red)))
+                            .testTag(parentIconTag)
+                            .pointerHoverIcon(desiredParentIcon, overrideDescendants = false),
                     contentAlignment = Alignment.Center
                 ) {
                     Box(
-                        modifier = Modifier
-                            .requiredSize(150.dp)
-                            .border(BorderStroke(2.dp, SolidColor(Color.Black)))
-                            .testTag(childIconTag)
-                            .pointerHoverIcon(
-                                desiredChildIcon,
-                                overrideDescendants = false
-                            ),
+                        modifier =
+                            Modifier.requiredSize(150.dp)
+                                .border(BorderStroke(2.dp, SolidColor(Color.Black)))
+                                .testTag(childIconTag)
+                                .pointerHoverIcon(desiredChildIcon, overrideDescendants = false),
                         contentAlignment = Alignment.Center
                     ) {
                         if (isGrandchildVisible.value) {
                             Box(
-                                modifier = Modifier
-                                    .requiredSize(100.dp)
-                                    .border(BorderStroke(2.dp, SolidColor(Color.Blue)))
-                                    .testTag(grandchildIconTag)
-                                    .pointerHoverIcon(
-                                        desiredGrandchildIcon,
-                                        overrideDescendants = false
-                                    )
+                                modifier =
+                                    Modifier.requiredSize(100.dp)
+                                        .border(BorderStroke(2.dp, SolidColor(Color.Blue)))
+                                        .testTag(grandchildIconTag)
+                                        .pointerHoverIcon(
+                                            desiredGrandchildIcon,
+                                            overrideDescendants = false
+                                        )
                             )
                         }
                     }
@@ -3990,83 +3283,55 @@
         }
 
         // Verify initial state of pointer icon
-        rule.runOnIdle {
-            assertThat(iconService.getIcon()).isEqualTo(desiredDefaultIcon)
-        }
+        rule.runOnIdle { assertThat(iconService.getIcon()).isEqualTo(desiredDefaultIcon) }
         // Hover over center of Child Box
-        rule.onNodeWithTag(childIconTag).performMouseInput {
-            enter(center)
-        }
+        rule.onNodeWithTag(childIconTag).performMouseInput { enter(center) }
         // Verify Child Box has the desired child icon
-        rule.runOnIdle {
-            assertThat(iconService.getIcon()).isEqualTo(desiredChildIcon)
-        }
+        rule.runOnIdle { assertThat(iconService.getIcon()).isEqualTo(desiredChildIcon) }
         // Move to corner of Parent Box where no descendants are under the cursor
-        rule.onNodeWithTag(parentIconTag).performMouseInput {
-            moveTo(bottomRight)
-        }
+        rule.onNodeWithTag(parentIconTag).performMouseInput { moveTo(bottomRight) }
         // Verify the icon is the desired parent icon and dynamically add the Grandchild Box
         rule.runOnIdle {
             assertThat(iconService.getIcon()).isEqualTo(desiredParentIcon)
             isGrandchildVisible.value = true
         }
         // Verify the icon stays as the desired parent icon
-        rule.runOnIdle {
-            assertThat(iconService.getIcon()).isEqualTo(desiredParentIcon)
-        }
+        rule.runOnIdle { assertThat(iconService.getIcon()).isEqualTo(desiredParentIcon) }
         // Move cursor within Parent Box and verify it still has the grandparent icon
-        rule.onNodeWithTag(parentIconTag).performMouseInput {
-            moveTo(centerRight)
-        }
-        rule.runOnIdle {
-            assertThat(iconService.getIcon()).isEqualTo(desiredParentIcon)
-        }
+        rule.onNodeWithTag(parentIconTag).performMouseInput { moveTo(centerRight) }
+        rule.runOnIdle { assertThat(iconService.getIcon()).isEqualTo(desiredParentIcon) }
         // Move cursor outside Parent Box to Child Box to verify icon is now the child icon
-        rule.onNodeWithTag(childIconTag).performMouseInput {
-            moveTo(bottomRight)
-        }
-        rule.runOnIdle {
-            assertThat(iconService.getIcon()).isEqualTo(desiredChildIcon)
-        }
+        rule.onNodeWithTag(childIconTag).performMouseInput { moveTo(bottomRight) }
+        rule.runOnIdle { assertThat(iconService.getIcon()).isEqualTo(desiredChildIcon) }
         // Move cursor back to corner of Parent Box where no descendants are under the cursor
-        rule.onNodeWithTag(parentIconTag).performMouseInput {
-            moveTo(bottomRight)
-        }
+        rule.onNodeWithTag(parentIconTag).performMouseInput { moveTo(bottomRight) }
         // Dynamically remove the Grandchild Box
-        rule.runOnIdle {
-            isGrandchildVisible.value = false
-        }
+        rule.runOnIdle { isGrandchildVisible.value = false }
         // Verify the icon stays as the parent icon
-        rule.runOnIdle {
-            assertThat(iconService.getIcon()).isEqualTo(desiredParentIcon)
-        }
+        rule.runOnIdle { assertThat(iconService.getIcon()).isEqualTo(desiredParentIcon) }
         // Exit hovering over Parent Box
-        rule.onNodeWithTag(parentIconTag).performMouseInput {
-            exit()
-        }
+        rule.onNodeWithTag(parentIconTag).performMouseInput { exit() }
     }
 
     /**
-     * Setup:
-     * The hierarchy for the initial setup of this test is:
-     *  Parent Box (custom icon = [PointerIcon.Crosshair], overrideDescendants = FALSE)
-     *    ⤷ ChildA Box (custom icon = [PointerIcon.Text], overrideDescendants = FALSE)
+     * Setup: The hierarchy for the initial setup of this test is: Parent Box (custom icon =
+     * [PointerIcon.Crosshair], overrideDescendants = FALSE) ⤷ ChildA Box (custom icon =
+     * [PointerIcon.Text], overrideDescendants = FALSE)
      *
-     *  After hovering over the area where ChildB will be, the hierarchy of the screen updates to:
-     *  Parent Box (no custom icon set)
-     *    ⤷ ChildA Box (custom icon = [PointerIcon.Text], overrideDescendants = FALSE)
-     *    ⤷ ChildB Box (custom icon = [PointerIcon.Hand], overrideDescendants = FALSE)
+     * After hovering over the area where ChildB will be, the hierarchy of the screen updates to:
+     * Parent Box (no custom icon set) ⤷ ChildA Box (custom icon = [PointerIcon.Text],
+     * overrideDescendants = FALSE) ⤷ ChildB Box (custom icon = [PointerIcon.Hand],
+     * overrideDescendants = FALSE)
      *
-     *  Expected Output:
-     *  Regardless of the presence of ChildB Box, ChildA Box's [PointerIcon.Text] should win for
-     *  its entire surface area. Once ChildB Box appears, ChildB Box's [PointerIcon.Hand] should
-     *  win for its entire surface area. Initially, Parent Box's [PointerIcon.Crosshair] should win
-     *  for its entire surface area not covered by ChildA Box. Once ChildA Box appears, Parent Box
-     *  should win for its entire surface not covered by either ChildA or ChildB Boxes.
+     * Expected Output: Regardless of the presence of ChildB Box, ChildA Box's [PointerIcon.Text]
+     * should win for its entire surface area. Once ChildB Box appears, ChildB Box's
+     * [PointerIcon.Hand] should win for its entire surface area. Initially, Parent Box's
+     * [PointerIcon.Crosshair] should win for its entire surface area not covered by ChildA Box.
+     * Once ChildA Box appears, Parent Box should win for its entire surface not covered by either
+     * ChildA or ChildB Boxes.
      *
-     *  Parent Box (output icon = [PointerIcon.Crosshair])
-     *    ⤷ Child Box (output icon = [PointerIcon.Text])
-     *    ⤷ Child Box (output icon = [PointerIcon.Hand])
+     * Parent Box (output icon = [PointerIcon.Crosshair]) ⤷ Child Box (output icon =
+     * [PointerIcon.Text]) ⤷ Child Box (output icon = [PointerIcon.Hand])
      */
     @Ignore("b/271277248 - Remove Ignore annotation once input event bug is fixed")
     @Test
@@ -4076,28 +3341,23 @@
         rule.setContent {
             CompositionLocalProvider(LocalPointerIconService provides iconService) {
                 Box(
-                    modifier = Modifier
-                        .requiredSize(150.dp)
-                        .border(BorderStroke(2.dp, SolidColor(Color.Red)))
-                        .testTag(parentIconTag)
-                        .pointerHoverIcon(desiredParentIcon, overrideDescendants = false)
+                    modifier =
+                        Modifier.requiredSize(150.dp)
+                            .border(BorderStroke(2.dp, SolidColor(Color.Red)))
+                            .testTag(parentIconTag)
+                            .pointerHoverIcon(desiredParentIcon, overrideDescendants = false)
                 ) {
                     Column {
                         Box(
-                            Modifier
-                                .requiredSize(50.dp)
+                            Modifier.requiredSize(50.dp)
                                 .border(BorderStroke(2.dp, SolidColor(Color.Blue)))
                                 .testTag(childIconTag)
-                                .pointerHoverIcon(
-                                    desiredChildIcon,
-                                    overrideDescendants = false
-                                )
+                                .pointerHoverIcon(desiredChildIcon, overrideDescendants = false)
                         )
                         if (isChildBVisible.value) {
                             // Referencing grandchild tag/icon for ChildB in this test
                             Box(
-                                Modifier
-                                    .requiredSize(50.dp)
+                                Modifier.requiredSize(50.dp)
                                     .offset(y = 100.dp)
                                     .border(BorderStroke(2.dp, SolidColor(Color.Black)))
                                     .testTag(grandchildIconTag)
@@ -4112,94 +3372,63 @@
             }
         }
         // Verify initial state of pointer icon
-        rule.runOnIdle {
-            assertThat(iconService.getIcon()).isEqualTo(desiredDefaultIcon)
-        }
+        rule.runOnIdle { assertThat(iconService.getIcon()).isEqualTo(desiredDefaultIcon) }
         // Hover over corner of Parent Box
-        rule.onNodeWithTag(parentIconTag).performMouseInput {
-            enter(bottomRight)
-        }
+        rule.onNodeWithTag(parentIconTag).performMouseInput { enter(bottomRight) }
         // Verify Parent Box has the desired parent icon
-        rule.runOnIdle {
-            assertThat(iconService.getIcon()).isEqualTo(desiredParentIcon)
-        }
+        rule.runOnIdle { assertThat(iconService.getIcon()).isEqualTo(desiredParentIcon) }
         // Move to center of ChildA Box
-        rule.onNodeWithTag(childIconTag).performMouseInput {
-            moveTo(center)
-        }
+        rule.onNodeWithTag(childIconTag).performMouseInput { moveTo(center) }
         // Verify ChildA Box has the desired child icon
-        rule.runOnIdle {
-            assertThat(iconService.getIcon()).isEqualTo(desiredChildIcon)
-        }
+        rule.runOnIdle { assertThat(iconService.getIcon()).isEqualTo(desiredChildIcon) }
         // Move to left corner of Parent Box where ChildB will be added
-        rule.onNodeWithTag(parentIconTag).performMouseInput {
-            moveTo(bottomLeft)
-        }
+        rule.onNodeWithTag(parentIconTag).performMouseInput { moveTo(bottomLeft) }
         // Dynamically add the ChildB Box
         rule.runOnIdle {
             assertThat(iconService.getIcon()).isEqualTo(desiredParentIcon)
             isChildBVisible.value = true
         }
         // Verify the icon is updated to the desired ChildB icon
-        rule.runOnIdle {
-            assertThat(iconService.getIcon()).isEqualTo(desiredGrandchildIcon)
-        }
+        rule.runOnIdle { assertThat(iconService.getIcon()).isEqualTo(desiredGrandchildIcon) }
         // Move to corner of ChildB Box
-        rule.onNodeWithTag(grandchildIconTag).performMouseInput {
-            moveTo(bottomRight)
-        }
+        rule.onNodeWithTag(grandchildIconTag).performMouseInput { moveTo(bottomRight) }
         // Verify ChildB Box has the desired grandchild icon
-        rule.runOnIdle {
-            assertThat(iconService.getIcon()).isEqualTo(desiredGrandchildIcon)
-        }
+        rule.runOnIdle { assertThat(iconService.getIcon()).isEqualTo(desiredGrandchildIcon) }
         // Move cursor back to the center of ChildA Box
-        rule.onNodeWithTag(childIconTag).performMouseInput {
-            moveTo(center)
-        }
+        rule.onNodeWithTag(childIconTag).performMouseInput { moveTo(center) }
         // Verify that icon is updated to the desired ChildA icon
-        rule.runOnIdle {
-            assertThat(iconService.getIcon()).isEqualTo(desiredChildIcon)
-        }
+        rule.runOnIdle { assertThat(iconService.getIcon()).isEqualTo(desiredChildIcon) }
         // Move cursor back to the location of ChildB
-        rule.onNodeWithTag(grandchildIconTag).performMouseInput {
-            moveTo(center)
-        }
+        rule.onNodeWithTag(grandchildIconTag).performMouseInput { moveTo(center) }
         // Dynamically remove the ChildB Box
         rule.runOnIdle {
             assertThat(iconService.getIcon()).isEqualTo(desiredGrandchildIcon)
             isChildBVisible.value = false
         }
         // Verify the icon updates to the parent icon
-        rule.runOnIdle {
-            assertThat(iconService.getIcon()).isEqualTo(desiredParentIcon)
-        }
+        rule.runOnIdle { assertThat(iconService.getIcon()).isEqualTo(desiredParentIcon) }
         // Exit hovering over ChildA Box
-        rule.onNodeWithTag(parentIconTag).performMouseInput {
-            exit()
-        }
+        rule.onNodeWithTag(parentIconTag).performMouseInput { exit() }
     }
 
     /**
-     * Setup:
-     * The hierarchy for the initial setup of this test is:
-     *  Parent Box (custom icon = [PointerIcon.Crosshair], overrideDescendants = FALSE)
-     *    ⤷ ChildA Box (custom icon = [PointerIcon.Text], overrideDescendants = FALSE)
+     * Setup: The hierarchy for the initial setup of this test is: Parent Box (custom icon =
+     * [PointerIcon.Crosshair], overrideDescendants = FALSE) ⤷ ChildA Box (custom icon =
+     * [PointerIcon.Text], overrideDescendants = FALSE)
      *
-     *  After hovering over ChildA, the hierarchy of the screen updates to:
-     *  Parent Box (no custom icon set)
-     *    ⤷ ChildA Box (custom icon = [PointerIcon.Text], overrideDescendants = FALSE)
-     *    ⤷ ChildB Box (custom icon = [PointerIcon.Hand], overrideDescendants = FALSE)
+     * After hovering over ChildA, the hierarchy of the screen updates to: Parent Box (no custom
+     * icon set) ⤷ ChildA Box (custom icon = [PointerIcon.Text], overrideDescendants = FALSE) ⤷
+     * ChildB Box (custom icon = [PointerIcon.Hand], overrideDescendants = FALSE)
      *
-     *  Expected Output:
-     *  Regardless of the presence of ChildB Box, ChildA Box's [PointerIcon.Text] should win for
-     *  its entire surface area. Once ChildB Box appears, ChildB Box's [PointerIcon.Hand] should
-     *  win for its entire surface area. Initially, Parent Box's [PointerIcon.Crosshair] should win
-     *  for its entire surface area not covered by ChildA Box. Once ChildA Box appears, Parent Box
-     *  should win for its entire surface not covered by either ChildA or ChildB Boxes.
+     * Expected Output: Regardless of the presence of ChildB Box, ChildA Box's [PointerIcon.Text]
+     * should win for its entire surface area. Once ChildB Box appears, ChildB Box's
+     * [PointerIcon.Hand] should win for its entire surface area. Initially, Parent Box's
+     * [PointerIcon.Crosshair] should win for its entire surface area not covered by ChildA Box.
+     * Once ChildA Box appears, Parent Box should win for its entire surface not covered by either
+     * ChildA or ChildB Boxes.
      *
-     *  Parent Box (output icon = [PointerIcon.Crosshair])
-     *    ⤷ Child Box (output icon = [PointerIcon.Text])
-     *    ⤷ Child Box (output icon = [PointerIcon.Hand])
+     * Parent Box (output icon = [PointerIcon.Crosshair]) ⤷ Child Box (output icon =
+     * [PointerIcon.Text]) ⤷ Child Box (output icon = [PointerIcon.Hand])
      */
     @Ignore("b/271277248 - Remove Ignore annotation once input event bug is fixed")
     @Test
@@ -4209,28 +3438,23 @@
         rule.setContent {
             CompositionLocalProvider(LocalPointerIconService provides iconService) {
                 Box(
-                    modifier = Modifier
-                        .requiredSize(200.dp)
-                        .border(BorderStroke(2.dp, SolidColor(Color.Red)))
-                        .testTag(parentIconTag)
-                        .pointerHoverIcon(desiredParentIcon, overrideDescendants = false)
+                    modifier =
+                        Modifier.requiredSize(200.dp)
+                            .border(BorderStroke(2.dp, SolidColor(Color.Red)))
+                            .testTag(parentIconTag)
+                            .pointerHoverIcon(desiredParentIcon, overrideDescendants = false)
                 ) {
                     Column {
                         Box(
-                            Modifier
-                                .requiredSize(50.dp)
+                            Modifier.requiredSize(50.dp)
                                 .border(BorderStroke(2.dp, SolidColor(Color.Blue)))
                                 .testTag(childIconTag)
-                                .pointerHoverIcon(
-                                    desiredChildIcon,
-                                    overrideDescendants = false
-                                )
+                                .pointerHoverIcon(desiredChildIcon, overrideDescendants = false)
                         )
                         if (isChildBVisible.value) {
                             // Referencing grandchild tag/icon for ChildB in this test
                             Box(
-                                Modifier
-                                    .requiredSize(50.dp)
+                                Modifier.requiredSize(50.dp)
                                     .offset(y = 100.dp)
                                     .border(BorderStroke(2.dp, SolidColor(Color.Black)))
                                     .testTag(grandchildIconTag)
@@ -4245,76 +3469,52 @@
             }
         }
         // Verify initial state of pointer icon
-        rule.runOnIdle {
-            assertThat(iconService.getIcon()).isEqualTo(desiredDefaultIcon)
-        }
+        rule.runOnIdle { assertThat(iconService.getIcon()).isEqualTo(desiredDefaultIcon) }
         // Hover over corner of Parent Box
-        rule.onNodeWithTag(parentIconTag).performMouseInput {
-            enter(bottomRight)
-        }
+        rule.onNodeWithTag(parentIconTag).performMouseInput { enter(bottomRight) }
         // Verify Parent Box has the desired parent icon
-        rule.runOnIdle {
-            assertThat(iconService.getIcon()).isEqualTo(desiredParentIcon)
-        }
+        rule.runOnIdle { assertThat(iconService.getIcon()).isEqualTo(desiredParentIcon) }
         // Move to center of ChildA Box
-        rule.onNodeWithTag(childIconTag).performMouseInput {
-            moveTo(center)
-        }
+        rule.onNodeWithTag(childIconTag).performMouseInput { moveTo(center) }
         // Verify ChildA Box has the desired child icon and dynamically add the ChildB Box
         rule.runOnIdle {
             assertThat(iconService.getIcon()).isEqualTo(desiredChildIcon)
             isChildBVisible.value = true
         }
         // Verify the icon stays as the desired child icon since the cursor hasn't moved
-        rule.runOnIdle {
-            assertThat(iconService.getIcon()).isEqualTo(desiredChildIcon)
-        }
+        rule.runOnIdle { assertThat(iconService.getIcon()).isEqualTo(desiredChildIcon) }
         // Move to corner of ChildB Box
-        rule.onNodeWithTag(grandchildIconTag).performMouseInput {
-            moveTo(bottomRight)
-        }
+        rule.onNodeWithTag(grandchildIconTag).performMouseInput { moveTo(bottomRight) }
         // Verify ChildB Box has the desired grandchild icon
-        rule.runOnIdle {
-            assertThat(iconService.getIcon()).isEqualTo(desiredGrandchildIcon)
-        }
+        rule.runOnIdle { assertThat(iconService.getIcon()).isEqualTo(desiredGrandchildIcon) }
         // Move cursor back to the center of ChildA Box
-        rule.onNodeWithTag(childIconTag).performMouseInput {
-            moveTo(center)
-        }
+        rule.onNodeWithTag(childIconTag).performMouseInput { moveTo(center) }
         // Dynamically remove the ChildB Box
         rule.runOnIdle {
             assertThat(iconService.getIcon()).isEqualTo(desiredChildIcon)
             isChildBVisible.value = false
         }
         // Verify the icon stays as the desired child icon since the cursor hasn't moved
-        rule.runOnIdle {
-            assertThat(iconService.getIcon()).isEqualTo(desiredChildIcon)
-        }
+        rule.runOnIdle { assertThat(iconService.getIcon()).isEqualTo(desiredChildIcon) }
         // Exit hovering over ChildA Box
-        rule.onNodeWithTag(childIconTag).performMouseInput {
-            exit()
-        }
+        rule.onNodeWithTag(childIconTag).performMouseInput { exit() }
     }
 
     /**
-     * Setup:
-     * The hierarchy for this test is setup as:
-     *  Default Box (no custom icon set)
-     *    ⤷ Parent Box (custom icon = [PointerIcon.Crosshair], overrideDescendants = FALSE)
-     *        ⤷ Child Box (custom icon = [PointerIcon.Text], overrideDescendants = FALSE)
-     *            ⤷ Grandchild Box (custom icon = [PointerIcon.Hand], overrideDescendants = FALSE)
+     * Setup: The hierarchy for this test is setup as: Default Box (no custom icon set) ⤷ Parent Box
+     * (custom icon = [PointerIcon.Crosshair], overrideDescendants = FALSE) ⤷ Child Box (custom icon
+     * = [PointerIcon.Text], overrideDescendants = FALSE) ⤷ Grandchild Box (custom icon =
+     * [PointerIcon.Hand], overrideDescendants = FALSE)
      *
-     *  Expected Output:
-     *  Grandchild Box's [PointerIcon.Hand] wins for the entire surface area of the Grandchild Box.
-     *  Child Box's [PointerIcon.Text] wins for the remaining surface area of the Child Box not
-     *  covered by the Grandchild Box. Parent Box’s [PointerIcon.Crosshair] wins for the remaining
-     *  surface area not covered by the Child Box. [PointerIcon.Default] wins for the remaining
-     *  surface area of
+     * Expected Output: Grandchild Box's [PointerIcon.Hand] wins for the entire surface area of the
+     * Grandchild Box. Child Box's [PointerIcon.Text] wins for the remaining surface area of the
+     * Child Box not covered by the Grandchild Box. Parent Box’s [PointerIcon.Crosshair] wins for
+     * the remaining surface area not covered by the Child Box. [PointerIcon.Default] wins for the
+     * remaining surface area of
      *
-     *  Default Box (output icon = [PointerIcon.Default]
-     *    ⤷ Parent Box (output icon = [PointerIcon.Crosshair])
-     *        ⤷ Child Box (output icon = [PointerIcon.Text])
-     *            ⤷ Grandchild Box (output icon = [PointerIcon.Hand])
+     * Default Box (output icon = [PointerIcon.Default] ⤷ Parent Box (output icon =
+     * [PointerIcon.Crosshair]) ⤷ Child Box (output icon = [PointerIcon.Text]) ⤷ Grandchild Box
+     * (output icon = [PointerIcon.Hand])
      */
     @Test
     fun childNotFullyContainedInParent_noOverrideDescendants() {
@@ -4322,28 +3522,26 @@
         rule.setContent {
             CompositionLocalProvider(LocalPointerIconService provides iconService) {
                 Box(
-                    modifier = Modifier
-                        .fillMaxSize()
-                        .border(BorderStroke(2.dp, SolidColor(Color.Yellow)))
-                        .testTag(defaultIconTag)
+                    modifier =
+                        Modifier.fillMaxSize()
+                            .border(BorderStroke(2.dp, SolidColor(Color.Yellow)))
+                            .testTag(defaultIconTag)
                 ) {
                     Box(
-                        modifier = Modifier
-                            .requiredSize(width = 200.dp, height = 150.dp)
-                            .border(BorderStroke(2.dp, SolidColor(Color.Red)))
-                            .testTag(parentIconTag)
-                            .pointerHoverIcon(desiredParentIcon, overrideDescendants = false)
+                        modifier =
+                            Modifier.requiredSize(width = 200.dp, height = 150.dp)
+                                .border(BorderStroke(2.dp, SolidColor(Color.Red)))
+                                .testTag(parentIconTag)
+                                .pointerHoverIcon(desiredParentIcon, overrideDescendants = false)
                     ) {
                         Box(
-                            Modifier
-                                .requiredSize(width = 150.dp, height = 125.dp)
+                            Modifier.requiredSize(width = 150.dp, height = 125.dp)
                                 .border(BorderStroke(2.dp, SolidColor(Color.Black)))
                                 .testTag(childIconTag)
                                 .pointerHoverIcon(desiredChildIcon, overrideDescendants = false)
                         ) {
                             Box(
-                                Modifier
-                                    .requiredSize(width = 300.dp, height = 100.dp)
+                                Modifier.requiredSize(width = 300.dp, height = 100.dp)
                                     .offset(x = 100.dp)
                                     .border(BorderStroke(2.dp, SolidColor(Color.Blue)))
                                     .testTag(grandchildIconTag)
@@ -4359,55 +3557,29 @@
         }
 
         // Verify initial state of pointer icon
-        rule.runOnIdle {
-            assertThat(iconService.getIcon()).isEqualTo(desiredDefaultIcon)
-        }
+        rule.runOnIdle { assertThat(iconService.getIcon()).isEqualTo(desiredDefaultIcon) }
         // Hover over the default wrapping box and verify the cursor is still the default icon
-        rule.onNodeWithTag(defaultIconTag).performMouseInput {
-            enter(center)
-        }
-        rule.runOnIdle {
-            assertThat(iconService.getIcon()).isEqualTo(desiredDefaultIcon)
-        }
+        rule.onNodeWithTag(defaultIconTag).performMouseInput { enter(center) }
+        rule.runOnIdle { assertThat(iconService.getIcon()).isEqualTo(desiredDefaultIcon) }
         // Move cursor to the corner of the Grandchild Box and verify it has the desired grandchild
         // icon
-        rule.onNodeWithTag(grandchildIconTag).performMouseInput {
-            moveTo(bottomRight)
-        }
-        rule.runOnIdle {
-            assertThat(iconService.getIcon()).isEqualTo(desiredGrandchildIcon)
-        }
+        rule.onNodeWithTag(grandchildIconTag).performMouseInput { moveTo(bottomRight) }
+        rule.runOnIdle { assertThat(iconService.getIcon()).isEqualTo(desiredGrandchildIcon) }
         // Move cursor to the center right of the Child Box and verify it still has the desired
         // grandchild icon
-        rule.onNodeWithTag(childIconTag).performMouseInput {
-            moveTo(centerRight)
-        }
-        rule.runOnIdle {
-            assertThat(iconService.getIcon()).isEqualTo(desiredGrandchildIcon)
-        }
+        rule.onNodeWithTag(childIconTag).performMouseInput { moveTo(centerRight) }
+        rule.runOnIdle { assertThat(iconService.getIcon()).isEqualTo(desiredGrandchildIcon) }
         // Move cursor to the corner of the Child Box and verify it has updated to the desired child
         // icon
-        rule.onNodeWithTag(childIconTag).performMouseInput {
-            moveTo(bottomRight)
-        }
-        rule.runOnIdle {
-            assertThat(iconService.getIcon()).isEqualTo(desiredChildIcon)
-        }
+        rule.onNodeWithTag(childIconTag).performMouseInput { moveTo(bottomRight) }
+        rule.runOnIdle { assertThat(iconService.getIcon()).isEqualTo(desiredChildIcon) }
         // Move cursor to the center right of the Parent Box and verify it has the desired
         // grandchild icon
-        rule.onNodeWithTag(parentIconTag).performMouseInput {
-            moveTo(centerRight)
-        }
-        rule.runOnIdle {
-            assertThat(iconService.getIcon()).isEqualTo(desiredGrandchildIcon)
-        }
+        rule.onNodeWithTag(parentIconTag).performMouseInput { moveTo(centerRight) }
+        rule.runOnIdle { assertThat(iconService.getIcon()).isEqualTo(desiredGrandchildIcon) }
         // Move cursor to the corner of the Parent Box and verify it has the desired parent icon
-        rule.onNodeWithTag(parentIconTag).performMouseInput {
-            moveTo(bottomRight)
-        }
-        rule.runOnIdle {
-            assertThat(iconService.getIcon()).isEqualTo(desiredParentIcon)
-        }
+        rule.onNodeWithTag(parentIconTag).performMouseInput { moveTo(bottomRight) }
+        rule.runOnIdle { assertThat(iconService.getIcon()).isEqualTo(desiredParentIcon) }
     }
 
     @Test
@@ -4415,19 +3587,17 @@
         val defaultIconTag = "myDefaultWrapper"
         var show by mutableStateOf(true)
         rule.setContent {
-            CompositionLocalProvider(
-                LocalPointerIconService provides iconService
-            ) {
-                Box(modifier = Modifier
-                    .fillMaxSize()
-                    .pointerHoverIcon(PointerIcon.Hand)
-                    .testTag(defaultIconTag)
+            CompositionLocalProvider(LocalPointerIconService provides iconService) {
+                Box(
+                    modifier =
+                        Modifier.fillMaxSize()
+                            .pointerHoverIcon(PointerIcon.Hand)
+                            .testTag(defaultIconTag)
                 ) {
                     if (show) {
                         Box(
-                            modifier = Modifier
-                                .pointerHoverIcon(PointerIcon.Text)
-                                .size(10.dp, 10.dp)
+                            modifier =
+                                Modifier.pointerHoverIcon(PointerIcon.Text).size(10.dp, 10.dp)
                         )
                     }
                 }
@@ -4439,23 +3609,15 @@
             assertThat(iconService.getIcon()).isEqualTo(PointerIcon.Default)
         }
 
-        rule.onNodeWithTag(defaultIconTag).performMouseInput {
-            moveTo(Offset(x = 5f, y = 5f))
-        }
+        rule.onNodeWithTag(defaultIconTag).performMouseInput { moveTo(Offset(x = 5f, y = 5f)) }
 
-        rule.runOnIdle {
-            assertThat(iconService.getIcon()).isEqualTo(PointerIcon.Text)
-        }
+        rule.runOnIdle { assertThat(iconService.getIcon()).isEqualTo(PointerIcon.Text) }
 
         show = false
 
-        rule.onNodeWithTag(defaultIconTag).performMouseInput {
-            moveTo(Offset(x = 6f, y = 6f))
-        }
+        rule.onNodeWithTag(defaultIconTag).performMouseInput { moveTo(Offset(x = 6f, y = 6f)) }
 
-        rule.runOnIdle {
-            assertThat(iconService.getIcon()).isEqualTo(PointerIcon.Hand)
-        }
+        rule.runOnIdle { assertThat(iconService.getIcon()).isEqualTo(PointerIcon.Hand) }
     }
 
     @Test
@@ -4463,18 +3625,12 @@
         val defaultIconTag = "myDefaultWrapper"
         var show by mutableStateOf(true)
         rule.setContent {
-            CompositionLocalProvider(
-                LocalPointerIconService provides iconService
-            ) {
-                Box(modifier = Modifier
-                    .fillMaxSize()
-                    .testTag(defaultIconTag)
-                ) {
+            CompositionLocalProvider(LocalPointerIconService provides iconService) {
+                Box(modifier = Modifier.fillMaxSize().testTag(defaultIconTag)) {
                     if (show) {
                         Box(
-                            modifier = Modifier
-                                .pointerHoverIcon(PointerIcon.Text)
-                                .size(10.dp, 10.dp)
+                            modifier =
+                                Modifier.pointerHoverIcon(PointerIcon.Text).size(10.dp, 10.dp)
                         )
                     }
                 }
@@ -4486,89 +3642,51 @@
             assertThat(iconService.getIcon()).isEqualTo(PointerIcon.Default)
         }
 
-        rule.onNodeWithTag(defaultIconTag).performMouseInput {
-            moveTo(Offset(x = 5f, y = 5f))
-        }
+        rule.onNodeWithTag(defaultIconTag).performMouseInput { moveTo(Offset(x = 5f, y = 5f)) }
 
-        rule.runOnIdle {
-            assertThat(iconService.getIcon()).isEqualTo(PointerIcon.Text)
-        }
+        rule.runOnIdle { assertThat(iconService.getIcon()).isEqualTo(PointerIcon.Text) }
 
         show = false
 
-        rule.onNodeWithTag(defaultIconTag).performMouseInput {
-            moveTo(Offset(x = 6f, y = 6f))
-        }
+        rule.onNodeWithTag(defaultIconTag).performMouseInput { moveTo(Offset(x = 6f, y = 6f)) }
 
-        rule.runOnIdle {
-            assertThat(iconService.getIcon()).isEqualTo(PointerIcon.Default)
-        }
+        rule.runOnIdle { assertThat(iconService.getIcon()).isEqualTo(PointerIcon.Default) }
     }
 
     private fun verifyIconOnHover(tag: String, expectedIcon: PointerIcon) {
         // Hover over element with specified tag
-        rule.onNodeWithTag(tag).performMouseInput {
-            enter(bottomRight)
-        }
+        rule.onNodeWithTag(tag).performMouseInput { enter(bottomRight) }
         // Verify the current icon is the expected icon
-        rule.runOnIdle {
-            assertThat(iconService.getIcon()).isEqualTo(expectedIcon)
-        }
+        rule.runOnIdle { assertThat(iconService.getIcon()).isEqualTo(expectedIcon) }
         // Exit hovering over element
-        rule.onNodeWithTag(tag).performMouseInput {
-            exit()
-        }
+        rule.onNodeWithTag(tag).performMouseInput { exit() }
     }
 
     private fun verifyOverlappingSiblings() {
         // Verify initial state of pointer icon
-        rule.runOnIdle {
-            assertThat(iconService.getIcon()).isEqualTo(desiredDefaultIcon)
-        }
+        rule.runOnIdle { assertThat(iconService.getIcon()).isEqualTo(desiredDefaultIcon) }
         // Hover over ChildB (bottom right corner) and verify desired ChildB icon
-        rule.onNodeWithTag(grandchildIconTag).performMouseInput {
-            enter(bottomRight)
-        }
-        rule.runOnIdle {
-            assertThat(iconService.getIcon()).isEqualTo(desiredGrandchildIcon)
-        }
+        rule.onNodeWithTag(grandchildIconTag).performMouseInput { enter(bottomRight) }
+        rule.runOnIdle { assertThat(iconService.getIcon()).isEqualTo(desiredGrandchildIcon) }
 
         // Then hover to parent (bottom right corner) and verify default arrow icon
-        rule.onNodeWithTag(parentIconTag).performMouseInput {
-            moveTo(bottomRight)
-        }
-        rule.runOnIdle {
-            assertThat(iconService.getIcon()).isEqualTo(desiredDefaultIcon)
-        }
+        rule.onNodeWithTag(parentIconTag).performMouseInput { moveTo(bottomRight) }
+        rule.runOnIdle { assertThat(iconService.getIcon()).isEqualTo(desiredDefaultIcon) }
 
         // Then hover back over ChildB in area that overlaps with sibling (bottom left corner) and
         // verify desired ChildB icon
-        rule.onNodeWithTag(grandchildIconTag).performMouseInput {
-            moveTo(bottomLeft)
-        }
-        rule.runOnIdle {
-            assertThat(iconService.getIcon()).isEqualTo(desiredGrandchildIcon)
-        }
+        rule.onNodeWithTag(grandchildIconTag).performMouseInput { moveTo(bottomLeft) }
+        rule.runOnIdle { assertThat(iconService.getIcon()).isEqualTo(desiredGrandchildIcon) }
 
         // Then hover to ChildA (bottom left corner) and verify desired ChildA icon (hand)
-        rule.onNodeWithTag(childIconTag).performMouseInput {
-            moveTo(bottomLeft)
-        }
-        rule.runOnIdle {
-            assertThat(iconService.getIcon()).isEqualTo(desiredChildIcon)
-        }
+        rule.onNodeWithTag(childIconTag).performMouseInput { moveTo(bottomLeft) }
+        rule.runOnIdle { assertThat(iconService.getIcon()).isEqualTo(desiredChildIcon) }
 
         // Then hover over parent (bottom left corner) and verify default arrow icon
-        rule.onNodeWithTag(parentIconTag).performMouseInput {
-            moveTo(bottomLeft)
-        }
-        rule.runOnIdle {
-            assertThat(iconService.getIcon()).isEqualTo(desiredDefaultIcon)
-        }
+        rule.onNodeWithTag(parentIconTag).performMouseInput { moveTo(bottomLeft) }
+        rule.runOnIdle { assertThat(iconService.getIcon()).isEqualTo(desiredDefaultIcon) }
 
         // Exit hovering
-        rule.onNodeWithTag(parentIconTag).performMouseInput {
-            exit()
-        }
+        rule.onNodeWithTag(parentIconTag).performMouseInput { exit() }
     }
 }
diff --git a/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/input/pointer/PointerInputDensityTest.kt b/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/input/pointer/PointerInputDensityTest.kt
index 4f5a9d6..cd5391a 100644
--- a/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/input/pointer/PointerInputDensityTest.kt
+++ b/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/input/pointer/PointerInputDensityTest.kt
@@ -46,8 +46,7 @@
 @RunWith(AndroidJUnit4::class)
 class PointerInputDensityTest {
 
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
     private val tag = "Tagged Layout"
 
@@ -55,20 +54,15 @@
     fun sendNotANumberDensityInPointerEvents() {
         lateinit var view: View
 
-        val motionEventsToTrigger = generateMultipleMotionEvents(
-            lastPointerX = Float.NaN,
-            lastPointerY = Float.NaN
-        )
+        val motionEventsToTrigger =
+            generateMultipleMotionEvents(lastPointerX = Float.NaN, lastPointerY = Float.NaN)
         val recordedEvents = mutableListOf<PointerEventType>()
 
         rule.setContent {
             view = LocalView.current
 
-            Box(Modifier
-                .fillMaxSize()
-                .background(Color.Green)
-                .testTag(tag)
-                .pointerInput(Unit) {
+            Box(
+                Modifier.fillMaxSize().background(Color.Green).testTag(tag).pointerInput(Unit) {
                     awaitPointerEventScope {
                         while (true) {
                             val event: PointerEvent = awaitPointerEvent()
@@ -76,16 +70,12 @@
                         }
                     }
                 }
-            ) { }
+            ) {}
         }
 
         rule.waitForIdle()
 
-        rule.runOnUiThread {
-            motionEventsToTrigger.forEach {
-                view.dispatchTouchEvent(it)
-            }
-        }
+        rule.runOnUiThread { motionEventsToTrigger.forEach { view.dispatchTouchEvent(it) } }
         rule.waitForIdle()
 
         assertThat(recordedEvents).hasSize(2)
@@ -97,20 +87,18 @@
     fun sendPositiveInfinityDensityInPointerEvents() {
         lateinit var view: View
 
-        val motionEventsToTrigger = generateMultipleMotionEvents(
-            lastPointerX = Float.POSITIVE_INFINITY,
-            lastPointerY = Float.POSITIVE_INFINITY
-        )
+        val motionEventsToTrigger =
+            generateMultipleMotionEvents(
+                lastPointerX = Float.POSITIVE_INFINITY,
+                lastPointerY = Float.POSITIVE_INFINITY
+            )
         val recordedEvents = mutableListOf<PointerEventType>()
 
         rule.setContent {
             view = LocalView.current
 
-            Box(Modifier
-                .fillMaxSize()
-                .background(Color.Red)
-                .testTag(tag)
-                .pointerInput(Unit) {
+            Box(
+                Modifier.fillMaxSize().background(Color.Red).testTag(tag).pointerInput(Unit) {
                     awaitPointerEventScope {
                         while (true) {
                             val event: PointerEvent = awaitPointerEvent()
@@ -118,16 +106,12 @@
                         }
                     }
                 }
-            ) { }
+            ) {}
         }
 
         rule.waitForIdle()
 
-        rule.runOnUiThread {
-            motionEventsToTrigger.forEach {
-                view.dispatchTouchEvent(it)
-            }
-        }
+        rule.runOnUiThread { motionEventsToTrigger.forEach { view.dispatchTouchEvent(it) } }
         rule.waitForIdle()
 
         assertThat(recordedEvents).hasSize(2)
@@ -139,20 +123,18 @@
     fun sendNegativeInfinityDensityInPointerEvents() {
         lateinit var view: View
 
-        val motionEventsToTrigger = generateMultipleMotionEvents(
-            lastPointerX = Float.NEGATIVE_INFINITY,
-            lastPointerY = Float.NEGATIVE_INFINITY
-        )
+        val motionEventsToTrigger =
+            generateMultipleMotionEvents(
+                lastPointerX = Float.NEGATIVE_INFINITY,
+                lastPointerY = Float.NEGATIVE_INFINITY
+            )
         val recordedEvents = mutableListOf<PointerEventType>()
 
         rule.setContent {
             view = LocalView.current
 
-            Box(Modifier
-                .fillMaxSize()
-                .background(Color.Cyan)
-                .testTag(tag)
-                .pointerInput(Unit) {
+            Box(
+                Modifier.fillMaxSize().background(Color.Cyan).testTag(tag).pointerInput(Unit) {
                     awaitPointerEventScope {
                         while (true) {
                             val event: PointerEvent = awaitPointerEvent()
@@ -160,16 +142,12 @@
                         }
                     }
                 }
-            ) { }
+            ) {}
         }
 
         rule.waitForIdle()
 
-        rule.runOnUiThread {
-            motionEventsToTrigger.forEach {
-                view.dispatchTouchEvent(it)
-            }
-        }
+        rule.runOnUiThread { motionEventsToTrigger.forEach { view.dispatchTouchEvent(it) } }
         rule.waitForIdle()
 
         assertThat(recordedEvents).hasSize(2)
@@ -206,14 +184,16 @@
         val pointerInputDensities = mutableListOf<Float>()
         rule.setContent {
             CompositionLocalProvider(LocalDensity provides Density(density)) {
-                Box(pointerInput {
-                    pointerInputDensities.add(density)
-                    awaitPointerEventScope {
-                        while (true) {
-                            awaitPointerEvent()
+                Box(
+                    pointerInput {
+                            pointerInputDensities.add(density)
+                            awaitPointerEventScope {
+                                while (true) {
+                                    awaitPointerEvent()
+                                }
+                            }
                         }
-                    }
-                }.testTag(tag)
+                        .testTag(tag)
                 )
             }
         }
@@ -222,12 +202,11 @@
         // created/triggered until there is a event(tap), we must trigger a tap to instantiate the
         // pointer input block of code.
         rule.waitForIdle()
-        rule.onNodeWithTag(tag)
-            .performTouchInput {
-                down(Offset.Zero)
-                moveBy(Offset(1f, 1f))
-                up()
-            }
+        rule.onNodeWithTag(tag).performTouchInput {
+            down(Offset.Zero)
+            moveBy(Offset(1f, 1f))
+            up()
+        }
 
         rule.runOnIdle {
             assertThat(pointerInputDensities.size).isEqualTo(1)
@@ -236,12 +215,11 @@
         }
 
         rule.waitForIdle()
-        rule.onNodeWithTag(tag)
-            .performTouchInput {
-                down(Offset.Zero)
-                moveBy(Offset(1f, 1f))
-                up()
-            }
+        rule.onNodeWithTag(tag).performTouchInput {
+            down(Offset.Zero)
+            moveBy(Offset(1f, 1f))
+            up()
+        }
 
         rule.runOnIdle {
             assertThat(pointerInputDensities.size).isEqualTo(2)
@@ -277,74 +255,70 @@
         val eventDownTime = 1L
         var eventStartTime = 0L
 
-        val firstPointerEvent = MotionEvent.obtain(
-            eventDownTime,
-            eventStartTime,
-            MotionEvent.ACTION_DOWN,
-            1,
-            arrayOf(firstPointerProperties),
-            arrayOf(PointerCoords(firstPointerOffset.x, firstPointerOffset.y)),
-            0,
-            0,
-            0f,
-            0f,
-            0,
-            0,
-            0,
-            0
-        )
+        val firstPointerEvent =
+            MotionEvent.obtain(
+                eventDownTime,
+                eventStartTime,
+                MotionEvent.ACTION_DOWN,
+                1,
+                arrayOf(firstPointerProperties),
+                arrayOf(PointerCoords(firstPointerOffset.x, firstPointerOffset.y)),
+                0,
+                0,
+                0f,
+                0f,
+                0,
+                0,
+                0,
+                0
+            )
 
         eventStartTime += 500
 
-        val secondPointerEvent = MotionEvent.obtain(
-            eventDownTime,
-            eventStartTime,
-            MotionEvent.ACTION_POINTER_DOWN,
-            2,
-            arrayOf(
-                firstPointerProperties,
-                secondPointerProperties
-            ),
-            arrayOf(
-                PointerCoords(firstPointerOffset.x, firstPointerOffset.y),
-                PointerCoords(secondPointerOffset.x, secondPointerOffset.y)
-            ),
-            0,
-            0,
-            0f,
-            0f,
-            0,
-            0,
-            0,
-            0
-        )
+        val secondPointerEvent =
+            MotionEvent.obtain(
+                eventDownTime,
+                eventStartTime,
+                MotionEvent.ACTION_POINTER_DOWN,
+                2,
+                arrayOf(firstPointerProperties, secondPointerProperties),
+                arrayOf(
+                    PointerCoords(firstPointerOffset.x, firstPointerOffset.y),
+                    PointerCoords(secondPointerOffset.x, secondPointerOffset.y)
+                ),
+                0,
+                0,
+                0f,
+                0f,
+                0,
+                0,
+                0,
+                0
+            )
 
         eventStartTime += 500
 
-        val thirdPointerEvent = MotionEvent.obtain(
-            eventDownTime,
-            eventStartTime,
-            MotionEvent.ACTION_POINTER_DOWN,
-            3,
-            arrayOf(
-                firstPointerProperties,
-                secondPointerProperties,
-                thirdPointerProperties
-            ),
-            arrayOf(
-                PointerCoords(firstPointerOffset.x, firstPointerOffset.y),
-                PointerCoords(secondPointerOffset.x, secondPointerOffset.y),
-                PointerCoords(lastPointerX, lastPointerY)
-            ),
-            0,
-            0,
-            0f,
-            0f,
-            0,
-            0,
-            0,
-            0
-        )
+        val thirdPointerEvent =
+            MotionEvent.obtain(
+                eventDownTime,
+                eventStartTime,
+                MotionEvent.ACTION_POINTER_DOWN,
+                3,
+                arrayOf(firstPointerProperties, secondPointerProperties, thirdPointerProperties),
+                arrayOf(
+                    PointerCoords(firstPointerOffset.x, firstPointerOffset.y),
+                    PointerCoords(secondPointerOffset.x, secondPointerOffset.y),
+                    PointerCoords(lastPointerX, lastPointerY)
+                ),
+                0,
+                0,
+                0f,
+                0f,
+                0,
+                0,
+                0,
+                0
+            )
 
         return listOf(firstPointerEvent, secondPointerEvent, thirdPointerEvent)
     }
diff --git a/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/input/pointer/PointerInputEventProcessorTest.kt b/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/input/pointer/PointerInputEventProcessorTest.kt
index 4c6c977..89e315e 100644
--- a/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/input/pointer/PointerInputEventProcessorTest.kt
+++ b/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/input/pointer/PointerInputEventProcessorTest.kt
@@ -107,13 +107,14 @@
 
     private lateinit var pointerInputEventProcessor: PointerInputEventProcessor
     private lateinit var testOwner: TestOwner
-    private val positionCalculator = object : PositionCalculator {
-        override fun screenToLocal(positionOnScreen: Offset): Offset = positionOnScreen
+    private val positionCalculator =
+        object : PositionCalculator {
+            override fun screenToLocal(positionOnScreen: Offset): Offset = positionOnScreen
 
-        override fun localToScreen(localPosition: Offset): Offset = localPosition
+            override fun localToScreen(localPosition: Offset): Offset = localPosition
 
-        override fun localToScreen(localTransform: Matrix) {}
-    }
+            override fun localToScreen(localTransform: Matrix) {}
+        }
 
     @Before
     fun setup() {
@@ -122,55 +123,46 @@
     }
 
     private fun addToRoot(vararg layoutNodes: LayoutNode) {
-        layoutNodes.forEachIndexed { index, node ->
-            testOwner.root.insertAt(index, node)
-        }
+        layoutNodes.forEachIndexed { index, node -> testOwner.root.insertAt(index, node) }
         testOwner.measureAndLayout()
     }
 
     @Test
     @OptIn(ExperimentalComposeUiApi::class)
     fun pointerTypePassed() {
-        val pointerTypes = listOf(
-            PointerType.Unknown,
-            PointerType.Touch,
-            PointerType.Mouse,
-            PointerType.Stylus,
-            PointerType.Eraser
-        )
+        val pointerTypes =
+            listOf(
+                PointerType.Unknown,
+                PointerType.Touch,
+                PointerType.Mouse,
+                PointerType.Stylus,
+                PointerType.Eraser
+            )
 
         // Arrange
         val pointerInputFilter = PointerInputFilterMock()
-        val layoutNode = LayoutNode(
-            0,
-            0,
-            500,
-            500,
-            PointerInputModifierImpl2(
-                pointerInputFilter
-            )
-        )
+        val layoutNode = LayoutNode(0, 0, 500, 500, PointerInputModifierImpl2(pointerInputFilter))
 
         addToRoot(layoutNode)
 
         val offset = Offset(100f, 200f)
         val previousEvents = mutableListOf<PointerInputEventData>()
-        val events = pointerTypes.mapIndexed { index, pointerType ->
-            previousEvents += PointerInputEventData(
-                id = PointerId(index.toLong()),
-                uptime = index.toLong(),
-                positionOnScreen = Offset(offset.x + index, offset.y + index),
-                position = Offset(offset.x + index, offset.y + index),
-                originalEventPosition = Offset(offset.x + index, offset.y + index),
-                down = true,
-                pressure = 1.0f,
-                type = pointerType
-            )
-            val data = previousEvents.map {
-                it.copy(uptime = index.toLong())
+        val events =
+            pointerTypes.mapIndexed { index, pointerType ->
+                previousEvents +=
+                    PointerInputEventData(
+                        id = PointerId(index.toLong()),
+                        uptime = index.toLong(),
+                        positionOnScreen = Offset(offset.x + index, offset.y + index),
+                        position = Offset(offset.x + index, offset.y + index),
+                        originalEventPosition = Offset(offset.x + index, offset.y + index),
+                        down = true,
+                        pressure = 1.0f,
+                        type = pointerType
+                    )
+                val data = previousEvents.map { it.copy(uptime = index.toLong()) }
+                PointerInputEvent(index.toLong(), data)
             }
-            PointerInputEvent(index.toLong(), data)
-        }
 
         // Act
 
@@ -181,8 +173,7 @@
         val log = pointerInputFilter.log.getOnPointerEventFilterLog()
 
         // Verify call count
-        assertThat(log)
-            .hasSize(PointerEventPass.values().size * pointerTypes.size)
+        assertThat(log).hasSize(PointerEventPass.values().size * pointerTypes.size)
 
         // Verify types of the pointers
         repeat(pointerTypes.size) { eventIndex ->
@@ -203,50 +194,44 @@
     }
 
     /**
-     * PointerInputEventProcessor doesn't currently support reentrancy and
-     * b/233209795 indicates that it is likely causing a crash. This test
-     * ensures that if we have reentrancy that we exit without handling
-     * the event. This test can be replaced with tests supporting reentrant
+     * PointerInputEventProcessor doesn't currently support reentrancy and b/233209795 indicates
+     * that it is likely causing a crash. This test ensures that if we have reentrancy that we exit
+     * without handling the event. This test can be replaced with tests supporting reentrant
      * behavior when reentrancy is supported.
      */
     @Test
     fun noReentrancy() {
         var reentrancyCount = 0
         // Arrange
-        val reentrantPointerInputFilter = object : PointerInputFilter() {
-            override fun onPointerEvent(
-                pointerEvent: PointerEvent,
-                pass: PointerEventPass,
-                bounds: IntSize
-            ) {
-                if (pass != PointerEventPass.Initial) {
-                    return
+        val reentrantPointerInputFilter =
+            object : PointerInputFilter() {
+                override fun onPointerEvent(
+                    pointerEvent: PointerEvent,
+                    pass: PointerEventPass,
+                    bounds: IntSize
+                ) {
+                    if (pass != PointerEventPass.Initial) {
+                        return
+                    }
+                    if (reentrancyCount > 1) {
+                        // Don't allow infinite recursion. Just enough to break the test.
+                        return
+                    }
+                    val oldId = pointerEvent.changes.fastMaxBy { it.id.value }!!.id.value.toInt()
+                    val event = PointerInputEvent(oldId + 1, 14, Offset.Zero, true)
+                    // force a reentrant call
+                    val result = pointerInputEventProcessor.process(event)
+                    assertThat(result.anyMovementConsumed).isFalse()
+                    assertThat(result.dispatchedToAPointerInputModifier).isFalse()
+                    pointerEvent.changes.forEach { it.consume() }
+                    reentrancyCount++
                 }
-                if (reentrancyCount > 1) {
-                    // Don't allow infinite recursion. Just enough to break the test.
-                    return
-                }
-                val oldId = pointerEvent.changes.fastMaxBy { it.id.value }!!.id.value.toInt()
-                val event = PointerInputEvent(oldId + 1, 14, Offset.Zero, true)
-                // force a reentrant call
-                val result = pointerInputEventProcessor.process(event)
-                assertThat(result.anyMovementConsumed).isFalse()
-                assertThat(result.dispatchedToAPointerInputModifier).isFalse()
-                pointerEvent.changes.forEach { it.consume() }
-                reentrancyCount++
+
+                override fun onCancel() {}
             }
 
-            override fun onCancel() {
-            }
-        }
-
-        val layoutNode = LayoutNode(
-            0,
-            0,
-            500,
-            500,
-            PointerInputModifierImpl2(reentrantPointerInputFilter)
-        )
+        val layoutNode =
+            LayoutNode(0, 0, 500, 500, PointerInputModifierImpl2(reentrantPointerInputFilter))
 
         addToRoot(layoutNode)
 
@@ -269,26 +254,19 @@
 
         // Arrange
         val pointerInputFilter = PointerInputFilterMock()
-        val layoutNode = LayoutNode(
-            0,
-            0,
-            500,
-            500,
-            PointerInputModifierImpl2(
-                pointerInputFilter
-            )
-        )
+        val layoutNode = LayoutNode(0, 0, 500, 500, PointerInputModifierImpl2(pointerInputFilter))
 
         addToRoot(layoutNode)
 
         val offset = Offset(100f, 200f)
         val offset2 = Offset(300f, 400f)
 
-        val events = arrayOf(
-            PointerInputEvent(8712, 3, offset, true),
-            PointerInputEvent(8712, 11, offset2, true),
-            PointerInputEvent(8712, 13, offset2, false)
-        )
+        val events =
+            arrayOf(
+                PointerInputEvent(8712, 3, offset, true),
+                PointerInputEvent(8712, 11, offset2, true),
+                PointerInputEvent(8712, 13, offset2, false)
+            )
 
         val down = down(8712, 3, offset.x, offset.y)
         val move = down.moveTo(11, offset2.x, offset2.y)
@@ -305,16 +283,14 @@
         val log = pointerInputFilter.log.getOnPointerEventFilterLog()
 
         // Verify call count
-        assertThat(log)
-            .hasSize(PointerEventPass.values().size * expectedChanges.size)
+        assertThat(log).hasSize(PointerEventPass.values().size * expectedChanges.size)
 
         // Verify call values
         var count = 0
         expectedChanges.forEach { change ->
             PointerEventPass.values().forEach { pass ->
                 val item = log[count]
-                PointerEventSubject
-                    .assertThat(item.pointerEvent)
+                PointerEventSubject.assertThat(item.pointerEvent)
                     .isStructurallyEqualTo(pointerEventOf(change))
                 assertThat(item.pass).isEqualTo(pass)
                 count++
@@ -329,62 +305,48 @@
 
         val childOffset = Offset(100f, 200f)
         val pointerInputFilter = PointerInputFilterMock()
-        val layoutNode = LayoutNode(
-            100, 200, 301, 401,
-            PointerInputModifierImpl2(
-                pointerInputFilter
-            )
-        )
+        val layoutNode =
+            LayoutNode(100, 200, 301, 401, PointerInputModifierImpl2(pointerInputFilter))
 
         addToRoot(layoutNode)
 
-        val offsets = arrayOf(
-            Offset(100f, 200f),
-            Offset(300f, 200f),
-            Offset(100f, 400f),
-            Offset(300f, 400f)
-        )
+        val offsets =
+            arrayOf(Offset(100f, 200f), Offset(300f, 200f), Offset(100f, 400f), Offset(300f, 400f))
 
-        val events = Array(4) { index ->
-            PointerInputEvent(index, 5, offsets[index], true)
-        }
+        val events = Array(4) { index -> PointerInputEvent(index, 5, offsets[index], true) }
 
-        val expectedChanges = Array(4) { index ->
-            PointerInputChange(
-                id = PointerId(index.toLong()),
-                5,
-                offsets[index] - childOffset,
-                true,
-                5,
-                offsets[index] - childOffset,
-                false,
-                isInitiallyConsumed = false
-            )
-        }
+        val expectedChanges =
+            Array(4) { index ->
+                PointerInputChange(
+                    id = PointerId(index.toLong()),
+                    5,
+                    offsets[index] - childOffset,
+                    true,
+                    5,
+                    offsets[index] - childOffset,
+                    false,
+                    isInitiallyConsumed = false
+                )
+            }
 
         // Act
 
-        events.forEach {
-            pointerInputEventProcessor.process(it)
-        }
+        events.forEach { pointerInputEventProcessor.process(it) }
 
         // Assert
 
         val log =
-            pointerInputFilter
-                .log
-                .getOnPointerEventFilterLog()
-                .filter { it.pass == PointerEventPass.Initial }
+            pointerInputFilter.log.getOnPointerEventFilterLog().filter {
+                it.pass == PointerEventPass.Initial
+            }
 
         // Verify call count
-        assertThat(log)
-            .hasSize(expectedChanges.size)
+        assertThat(log).hasSize(expectedChanges.size)
 
         // Verify call values
         expectedChanges.forEachIndexed { index, change ->
             val item = log[index]
-            PointerEventSubject
-                .assertThat(item.pointerEvent)
+            PointerEventSubject.assertThat(item.pointerEvent)
                 .isStructurallyEqualTo(pointerEventOf(change))
         }
     }
@@ -395,35 +357,28 @@
         // Arrange
 
         val pointerInputFilter = PointerInputFilterMock()
-        val layoutNode = LayoutNode(
-            100, 200, 301, 401,
-            PointerInputModifierImpl2(
-                pointerInputFilter
-            )
-        )
+        val layoutNode =
+            LayoutNode(100, 200, 301, 401, PointerInputModifierImpl2(pointerInputFilter))
 
         addToRoot(layoutNode)
 
-        val offsets = arrayOf(
-            Offset(99f, 200f),
-            Offset(99f, 400f),
-            Offset(100f, 199f),
-            Offset(100f, 401f),
-            Offset(300f, 199f),
-            Offset(300f, 401f),
-            Offset(301f, 200f),
-            Offset(301f, 400f)
-        )
+        val offsets =
+            arrayOf(
+                Offset(99f, 200f),
+                Offset(99f, 400f),
+                Offset(100f, 199f),
+                Offset(100f, 401f),
+                Offset(300f, 199f),
+                Offset(300f, 401f),
+                Offset(301f, 200f),
+                Offset(301f, 400f)
+            )
 
-        val events = Array(8) { index ->
-            PointerInputEvent(index, 0, offsets[index], true)
-        }
+        val events = Array(8) { index -> PointerInputEvent(index, 0, offsets[index], true) }
 
         // Act
 
-        events.forEach {
-            pointerInputEventProcessor.process(it)
-        }
+        events.forEach { pointerInputEventProcessor.process(it) }
 
         // Assert
 
@@ -454,38 +409,23 @@
         val parentPointerInputFilter = PointerInputFilterMock(log)
 
         val childLayoutNode =
-            LayoutNode(
-                100, 100, 200, 200,
-                PointerInputModifierImpl2(
-                    childPointerInputFilter
-                )
-            )
+            LayoutNode(100, 100, 200, 200, PointerInputModifierImpl2(childPointerInputFilter))
         val middleLayoutNode: LayoutNode =
-            LayoutNode(
-                100, 100, 400, 400,
-                PointerInputModifierImpl2(
-                    middlePointerInputFilter
-                )
-            ).apply {
-                insertAt(0, childLayoutNode)
-            }
+            LayoutNode(100, 100, 400, 400, PointerInputModifierImpl2(middlePointerInputFilter))
+                .apply { insertAt(0, childLayoutNode) }
         val parentLayoutNode: LayoutNode =
-            LayoutNode(
-                0, 0, 500, 500,
-                PointerInputModifierImpl2(
-                    parentPointerInputFilter
-                )
-            ).apply {
+            LayoutNode(0, 0, 500, 500, PointerInputModifierImpl2(parentPointerInputFilter)).apply {
                 insertAt(0, middleLayoutNode)
             }
         addToRoot(parentLayoutNode)
 
-        val offset = when (numberOfChildrenHit) {
-            3 -> Offset(250f, 250f)
-            2 -> Offset(150f, 150f)
-            1 -> Offset(50f, 50f)
-            else -> throw IllegalStateException()
-        }
+        val offset =
+            when (numberOfChildrenHit) {
+                3 -> Offset(250f, 250f)
+                2 -> Offset(150f, 150f)
+                1 -> Offset(50f, 50f)
+                else -> throw IllegalStateException()
+            }
 
         val event = PointerInputEvent(0, 5, offset, true)
 
@@ -495,9 +435,8 @@
 
         // Assert
 
-        val filteredLog = log.getOnPointerEventFilterLog().filter {
-            it.pass == PointerEventPass.Initial
-        }
+        val filteredLog =
+            log.getOnPointerEventFilterLog().filter { it.pass == PointerEventPass.Initial }
 
         when (numberOfChildrenHit) {
             3 -> {
@@ -530,61 +469,47 @@
 
         // Arrange
 
-        val expectedInput = PointerInputChange(
-            id = PointerId(0),
-            5,
-            Offset(100f, 0f),
-            true,
-            3,
-            Offset(0f, 0f),
-            true,
-            isInitiallyConsumed = false
-        )
-        val expectedOutput = PointerInputChange(
-            id = PointerId(0),
-            5,
-            Offset(100f, 0f),
-            true,
-            3,
-            Offset(0f, 0f),
-            true,
-            isInitiallyConsumed = true
-        )
-
-        val pointerInputFilter = PointerInputFilterMock(
-            mutableListOf(),
-            pointerEventHandler = { pointerEvent, pass, _ ->
-                if (pass == PointerEventPass.Initial) {
-                    val change = pointerEvent
-                        .changes
-                        .first()
-
-                    if (change.positionChanged()) change.consume()
-                }
-            }
-        )
-
-        val layoutNode = LayoutNode(
-            0, 0, 500, 500,
-            PointerInputModifierImpl2(
-                pointerInputFilter
+        val expectedInput =
+            PointerInputChange(
+                id = PointerId(0),
+                5,
+                Offset(100f, 0f),
+                true,
+                3,
+                Offset(0f, 0f),
+                true,
+                isInitiallyConsumed = false
             )
-        )
+        val expectedOutput =
+            PointerInputChange(
+                id = PointerId(0),
+                5,
+                Offset(100f, 0f),
+                true,
+                3,
+                Offset(0f, 0f),
+                true,
+                isInitiallyConsumed = true
+            )
+
+        val pointerInputFilter =
+            PointerInputFilterMock(
+                mutableListOf(),
+                pointerEventHandler = { pointerEvent, pass, _ ->
+                    if (pass == PointerEventPass.Initial) {
+                        val change = pointerEvent.changes.first()
+
+                        if (change.positionChanged()) change.consume()
+                    }
+                }
+            )
+
+        val layoutNode = LayoutNode(0, 0, 500, 500, PointerInputModifierImpl2(pointerInputFilter))
 
         addToRoot(layoutNode)
 
-        val down = PointerInputEvent(
-            0,
-            3,
-            Offset(0f, 0f),
-            true
-        )
-        val move = PointerInputEvent(
-            0,
-            5,
-            Offset(100f, 0f),
-            true
-        )
+        val down = PointerInputEvent(0, 3, Offset(0f, 0f), true)
+        val move = PointerInputEvent(0, 5, Offset(100f, 0f), true)
 
         // Act
 
@@ -597,45 +522,59 @@
         val log = pointerInputFilter.log.getOnPointerEventFilterLog()
 
         assertThat(log).hasSize(3)
-        PointerInputChangeSubject
-            .assertThat(log[0].pointerEvent.changes.first())
+        PointerInputChangeSubject.assertThat(log[0].pointerEvent.changes.first())
             .isStructurallyEqualTo(expectedInput)
-        PointerInputChangeSubject
-            .assertThat(log[1].pointerEvent.changes.first())
+        PointerInputChangeSubject.assertThat(log[1].pointerEvent.changes.first())
             .isStructurallyEqualTo(expectedOutput)
     }
 
     @Test
     fun process_nodesAndAdditionalOffsetIncreasinglyInset_dispatchInfoIsCorrect() {
         process_dispatchInfoIsCorrect(
-            0, 0, 100, 100,
-            2, 11, 100, 100,
-            23, 31, 100, 100,
-            43, 51,
-            99, 99
+            0,
+            0,
+            100,
+            100,
+            2,
+            11,
+            100,
+            100,
+            23,
+            31,
+            100,
+            100,
+            43,
+            51,
+            99,
+            99
         )
     }
 
     @Test
     fun process_nodesAndAdditionalOffsetIncreasinglyOutset_dispatchInfoIsCorrect() {
         process_dispatchInfoIsCorrect(
-            0, 0, 100, 100,
-            -2, -11, 100, 100,
-            -23, -31, 100, 100,
-            -43, -51,
-            1, 1
+            0,
+            0,
+            100,
+            100,
+            -2,
+            -11,
+            100,
+            100,
+            -23,
+            -31,
+            100,
+            100,
+            -43,
+            -51,
+            1,
+            1
         )
     }
 
     @Test
     fun process_nodesAndAdditionalOffsetNotOffset_dispatchInfoIsCorrect() {
-        process_dispatchInfoIsCorrect(
-            0, 0, 100, 100,
-            0, 0, 100, 100,
-            0, 0, 100, 100,
-            0, 0,
-            50, 50
-        )
+        process_dispatchInfoIsCorrect(0, 0, 100, 100, 0, 0, 100, 100, 0, 0, 100, 100, 0, 0, 50, 50)
     }
 
     @Suppress("SameParameterValue")
@@ -666,36 +605,18 @@
         val parentPointerInputFilter = PointerInputFilterMock(log)
 
         val childOffset = Offset(cX1.toFloat(), cY1.toFloat())
-        val childLayoutNode = LayoutNode(
-            cX1, cY1, cX2, cY2,
-            PointerInputModifierImpl2(
-                childPointerInputFilter
-            )
-        )
+        val childLayoutNode =
+            LayoutNode(cX1, cY1, cX2, cY2, PointerInputModifierImpl2(childPointerInputFilter))
         val middleOffset = Offset(mX1.toFloat(), mY1.toFloat())
-        val middleLayoutNode: LayoutNode = LayoutNode(
-            mX1, mY1, mX2, mY2,
-            PointerInputModifierImpl2(
-                middlePointerInputFilter
-            )
-        ).apply {
-            insertAt(0, childLayoutNode)
-        }
-        val parentLayoutNode: LayoutNode = LayoutNode(
-            pX1, pY1, pX2, pY2,
-            PointerInputModifierImpl2(
-                parentPointerInputFilter
-            )
-        ).apply {
-            insertAt(0, middleLayoutNode)
-        }
+        val middleLayoutNode: LayoutNode =
+            LayoutNode(mX1, mY1, mX2, mY2, PointerInputModifierImpl2(middlePointerInputFilter))
+                .apply { insertAt(0, childLayoutNode) }
+        val parentLayoutNode: LayoutNode =
+            LayoutNode(pX1, pY1, pX2, pY2, PointerInputModifierImpl2(parentPointerInputFilter))
+                .apply { insertAt(0, middleLayoutNode) }
 
-        val outerLayoutNode = LayoutNode(
-            aOX,
-            aOY,
-            aOX + parentLayoutNode.width,
-            aOY + parentLayoutNode.height
-        )
+        val outerLayoutNode =
+            LayoutNode(aOX, aOY, aOX + parentLayoutNode.width, aOY + parentLayoutNode.height)
 
         outerLayoutNode.insertAt(0, parentLayoutNode)
         addToRoot(outerLayoutNode)
@@ -706,44 +627,46 @@
 
         val down = PointerInputEvent(0, 7, offset, true)
 
-        val expectedPointerInputChanges = arrayOf(
-            PointerInputChange(
-                id = PointerId(0),
-                7,
-                offset - additionalOffset,
-                true,
-                7,
-                offset - additionalOffset,
-                false,
-                isInitiallyConsumed = false
-            ),
-            PointerInputChange(
-                id = PointerId(0),
-                7,
-                offset - middleOffset - additionalOffset,
-                true,
-                7,
-                offset - middleOffset - additionalOffset,
-                false,
-                isInitiallyConsumed = false
-            ),
-            PointerInputChange(
-                id = PointerId(0),
-                7,
-                offset - middleOffset - childOffset - additionalOffset,
-                true,
-                7,
-                offset - middleOffset - childOffset - additionalOffset,
-                false,
-                isInitiallyConsumed = false
+        val expectedPointerInputChanges =
+            arrayOf(
+                PointerInputChange(
+                    id = PointerId(0),
+                    7,
+                    offset - additionalOffset,
+                    true,
+                    7,
+                    offset - additionalOffset,
+                    false,
+                    isInitiallyConsumed = false
+                ),
+                PointerInputChange(
+                    id = PointerId(0),
+                    7,
+                    offset - middleOffset - additionalOffset,
+                    true,
+                    7,
+                    offset - middleOffset - additionalOffset,
+                    false,
+                    isInitiallyConsumed = false
+                ),
+                PointerInputChange(
+                    id = PointerId(0),
+                    7,
+                    offset - middleOffset - childOffset - additionalOffset,
+                    true,
+                    7,
+                    offset - middleOffset - childOffset - additionalOffset,
+                    false,
+                    isInitiallyConsumed = false
+                )
             )
-        )
 
-        val expectedSizes = arrayOf(
-            IntSize(pX2 - pX1, pY2 - pY1),
-            IntSize(mX2 - mX1, mY2 - mY1),
-            IntSize(cX2 - cX1, cY2 - cY1)
-        )
+        val expectedSizes =
+            arrayOf(
+                IntSize(pX2 - pX1, pY2 - pY1),
+                IntSize(mX2 - mX1, mY2 - mY1),
+                IntSize(cX2 - cX1, cY2 - cY1)
+            )
 
         // Act
 
@@ -824,19 +747,9 @@
 
     /**
      * This test creates a layout of this shape:
-     *
-     *  -------------
-     *  |     |     |
-     *  |  t  |     |
-     *  |     |     |
-     *  |-----|     |
-     *  |           |
-     *  |     |-----|
-     *  |     |     |
-     *  |     |  t  |
-     *  |     |     |
-     *  -------------
-     *
+     * -------------
+     * | | | | t | | | | | |-----| | | | | |-----| | | | | | t | | | |
+     * -------------
      * Where there is one child in the top right, and one in the bottom left, and 2 down touches,
      * one in the top left and one in the bottom right.
      */
@@ -850,31 +763,22 @@
         val childPointerInputFilter2 = PointerInputFilterMock(log)
 
         val childLayoutNode1 =
-            LayoutNode(
-                0, 0, 50, 50,
-                PointerInputModifierImpl2(
-                    childPointerInputFilter1
-                )
-            )
+            LayoutNode(0, 0, 50, 50, PointerInputModifierImpl2(childPointerInputFilter1))
         val childLayoutNode2 =
-            LayoutNode(
-                50, 50, 100, 100,
-                PointerInputModifierImpl2(
-                    childPointerInputFilter2
-                )
-            )
+            LayoutNode(50, 50, 100, 100, PointerInputModifierImpl2(childPointerInputFilter2))
         addToRoot(childLayoutNode1, childLayoutNode2)
 
         val offset1 = Offset(25f, 25f)
         val offset2 = Offset(75f, 75f)
 
-        val down = PointerInputEvent(
-            5,
-            listOf(
-                PointerInputEventData(0, 5, offset1, true),
-                PointerInputEventData(1, 5, offset2, true)
+        val down =
+            PointerInputEvent(
+                5,
+                listOf(
+                    PointerInputEventData(0, 5, offset1, true),
+                    PointerInputEventData(1, 5, offset2, true)
+                )
             )
-        )
 
         val expectedChange1 =
             PointerInputChange(
@@ -907,12 +811,14 @@
 
         // Verify call count
 
-        val child1Log = log.getOnPointerEventFilterLog().filter {
-            it.pointerInputFilter === childPointerInputFilter1
-        }
-        val child2Log = log.getOnPointerEventFilterLog().filter {
-            it.pointerInputFilter === childPointerInputFilter2
-        }
+        val child1Log =
+            log.getOnPointerEventFilterLog().filter {
+                it.pointerInputFilter === childPointerInputFilter1
+            }
+        val child2Log =
+            log.getOnPointerEventFilterLog().filter {
+                it.pointerInputFilter === childPointerInputFilter2
+            }
         assertThat(child1Log).hasSize(PointerEventPass.values().size)
         assertThat(child2Log).hasSize(PointerEventPass.values().size)
 
@@ -967,22 +873,10 @@
 
     /**
      * This test creates a layout of this shape:
-     *
-     *  ---------------
-     *  | t      |    |
-     *  |        |    |
-     *  |  |-------|  |
-     *  |  | t     |  |
-     *  |  |       |  |
-     *  |  |       |  |
-     *  |--|  |-------|
-     *  |  |  | t     |
-     *  |  |  |       |
-     *  |  |  |       |
-     *  |  |--|       |
-     *  |     |       |
-     *  ---------------
-     *
+     * ---------------
+     * | t | | | | | | |-------| | | | t | | | | | | | | | | |--| |-------| | | | t | | | | | | | |
+     * | | |--| | | | |
+     * ---------------
      * There are 3 staggered children and 3 down events, the first is on child 1, the second is on
      * child 2 in a space that overlaps child 1, and the third is in a space that overlaps both
      * child 2.
@@ -995,24 +889,12 @@
         val childPointerInputFilter2 = PointerInputFilterMock(log)
         val childPointerInputFilter3 = PointerInputFilterMock(log)
 
-        val childLayoutNode1 = LayoutNode(
-            0, 0, 100, 100,
-            PointerInputModifierImpl2(
-                childPointerInputFilter1
-            )
-        )
-        val childLayoutNode2 = LayoutNode(
-            50, 50, 150, 150,
-            PointerInputModifierImpl2(
-                childPointerInputFilter2
-            )
-        )
-        val childLayoutNode3 = LayoutNode(
-            100, 100, 200, 200,
-            PointerInputModifierImpl2(
-                childPointerInputFilter3
-            )
-        )
+        val childLayoutNode1 =
+            LayoutNode(0, 0, 100, 100, PointerInputModifierImpl2(childPointerInputFilter1))
+        val childLayoutNode2 =
+            LayoutNode(50, 50, 150, 150, PointerInputModifierImpl2(childPointerInputFilter2))
+        val childLayoutNode3 =
+            LayoutNode(100, 100, 200, 200, PointerInputModifierImpl2(childPointerInputFilter3))
 
         addToRoot(childLayoutNode1, childLayoutNode2, childLayoutNode3)
 
@@ -1020,14 +902,15 @@
         val offset2 = Offset(75f, 75f)
         val offset3 = Offset(125f, 125f)
 
-        val down = PointerInputEvent(
-            5,
-            listOf(
-                PointerInputEventData(0, 5, offset1, true),
-                PointerInputEventData(1, 5, offset2, true),
-                PointerInputEventData(2, 5, offset3, true)
+        val down =
+            PointerInputEvent(
+                5,
+                listOf(
+                    PointerInputEventData(0, 5, offset1, true),
+                    PointerInputEventData(1, 5, offset2, true),
+                    PointerInputEventData(2, 5, offset3, true)
+                )
             )
-        )
 
         val expectedChange1 =
             PointerInputChange(
@@ -1069,15 +952,18 @@
 
         // Assert
 
-        val child1Log = log.getOnPointerEventFilterLog().filter {
-            it.pointerInputFilter === childPointerInputFilter1
-        }
-        val child2Log = log.getOnPointerEventFilterLog().filter {
-            it.pointerInputFilter === childPointerInputFilter2
-        }
-        val child3Log = log.getOnPointerEventFilterLog().filter {
-            it.pointerInputFilter === childPointerInputFilter3
-        }
+        val child1Log =
+            log.getOnPointerEventFilterLog().filter {
+                it.pointerInputFilter === childPointerInputFilter1
+            }
+        val child2Log =
+            log.getOnPointerEventFilterLog().filter {
+                it.pointerInputFilter === childPointerInputFilter2
+            }
+        val child3Log =
+            log.getOnPointerEventFilterLog().filter {
+                it.pointerInputFilter === childPointerInputFilter3
+            }
         assertThat(child1Log).hasSize(PointerEventPass.values().size)
         assertThat(child2Log).hasSize(PointerEventPass.values().size)
         assertThat(child3Log).hasSize(PointerEventPass.values().size)
@@ -1155,21 +1041,9 @@
 
     /**
      * This test creates a layout of this shape:
-     *
-     *  ---------------
-     *  |             |
-     *  |      t      |
-     *  |             |
-     *  |  |-------|  |
-     *  |  |       |  |
-     *  |  |   t   |  |
-     *  |  |       |  |
-     *  |  |-------|  |
-     *  |             |
-     *  |      t      |
-     *  |             |
-     *  ---------------
-     *
+     * ---------------
+     * | | | t | | | | |-------| | | | | | | | t | | | | | | | |-------| | | | | t | | |
+     * ---------------
      * There are 3 staggered children and 3 down events, the first is on child 1, the second is on
      * child 2 in a space that overlaps child 1, and the third is in a space that overlaps both
      * child 2.
@@ -1180,18 +1054,10 @@
         val childPointerInputFilter1 = PointerInputFilterMock()
         val childPointerInputFilter2 = PointerInputFilterMock()
 
-        val childLayoutNode1 = LayoutNode(
-            0, 0, 100, 150,
-            PointerInputModifierImpl2(
-                childPointerInputFilter1
-            )
-        )
-        val childLayoutNode2 = LayoutNode(
-            25, 50, 75, 100,
-            PointerInputModifierImpl2(
-                childPointerInputFilter2
-            )
-        )
+        val childLayoutNode1 =
+            LayoutNode(0, 0, 100, 150, PointerInputModifierImpl2(childPointerInputFilter1))
+        val childLayoutNode2 =
+            LayoutNode(25, 50, 75, 100, PointerInputModifierImpl2(childPointerInputFilter2))
 
         addToRoot(childLayoutNode1, childLayoutNode2)
 
@@ -1199,14 +1065,15 @@
         val offset2 = Offset(50f, 75f)
         val offset3 = Offset(50f, 125f)
 
-        val down = PointerInputEvent(
-            7,
-            listOf(
-                PointerInputEventData(0, 7, offset1, true),
-                PointerInputEventData(1, 7, offset2, true),
-                PointerInputEventData(2, 7, offset3, true)
+        val down =
+            PointerInputEvent(
+                7,
+                listOf(
+                    PointerInputEventData(0, 7, offset1, true),
+                    PointerInputEventData(1, 7, offset2, true),
+                    PointerInputEventData(2, 7, offset3, true)
+                )
             )
-        )
 
         val expectedChange1 =
             PointerInputChange(
@@ -1276,17 +1143,9 @@
 
     /**
      * This test creates a layout of this shape:
-     *
-     *  -----------------
-     *  |               |
-     *  |   |-------|   |
-     *  |   |       |   |
-     *  | t |   t   | t |
-     *  |   |       |   |
-     *  |   |-------|   |
-     *  |               |
-     *  -----------------
-     *
+     * -----------------
+     * | | | |-------| | | | | | | t | t | t | | | | | | |-------| | | |
+     * -----------------
      * There are 3 staggered children and 3 down events, the first is on child 1, the second is on
      * child 2 in a space that overlaps child 1, and the third is in a space that overlaps both
      * child 2.
@@ -1297,18 +1156,10 @@
         val childPointerInputFilter1 = PointerInputFilterMock()
         val childPointerInputFilter2 = PointerInputFilterMock()
 
-        val childLayoutNode1 = LayoutNode(
-            0, 0, 150, 100,
-            PointerInputModifierImpl2(
-                childPointerInputFilter1
-            )
-        )
-        val childLayoutNode2 = LayoutNode(
-            50, 25, 100, 75,
-            PointerInputModifierImpl2(
-                childPointerInputFilter2
-            )
-        )
+        val childLayoutNode1 =
+            LayoutNode(0, 0, 150, 100, PointerInputModifierImpl2(childPointerInputFilter1))
+        val childLayoutNode2 =
+            LayoutNode(50, 25, 100, 75, PointerInputModifierImpl2(childPointerInputFilter2))
 
         addToRoot(childLayoutNode1, childLayoutNode2)
 
@@ -1316,14 +1167,15 @@
         val offset2 = Offset(75f, 50f)
         val offset3 = Offset(125f, 50f)
 
-        val down = PointerInputEvent(
-            11,
-            listOf(
-                PointerInputEventData(0, 11, offset1, true),
-                PointerInputEventData(1, 11, offset2, true),
-                PointerInputEventData(2, 11, offset3, true)
+        val down =
+            PointerInputEvent(
+                11,
+                listOf(
+                    PointerInputEventData(0, 11, offset1, true),
+                    PointerInputEventData(1, 11, offset2, true),
+                    PointerInputEventData(2, 11, offset3, true)
+                )
             )
-        )
 
         val expectedChange1 =
             PointerInputChange(
@@ -1392,23 +1244,13 @@
     }
 
     /**
-     * This test creates a layout of this shape:
-     *     0   1   2   3   4
-     *   .........   .........
-     * 0 .     t .   . t     .
-     *   .   |---|---|---|   .
-     * 1 . t | t |   | t | t .
-     *   ....|---|   |---|....
-     * 2     |           |
-     *   ....|---|   |---|....
-     * 3 . t | t |   | t | t .
-     *   .   |---|---|---|   .
-     * 4 .     t .   . t     .
-     *   .........   .........
+     * This test creates a layout of this shape: 0 1 2 3 4 ......... ......... 0 . t . . t . .
+     * |---|---|---| . 1 . t | t | | t | t . ....|---| |---|.... 2 | | ....|---| |---|.... 3 . t | t
+     * | | t | t . . |---|---|---| . 4 . t . . t . ......... .........
      *
      * 4 LayoutNodes with PointerInputModifiers that are clipped by their parent LayoutNode. 4
-     * touches touch just inside the parent LayoutNode and inside the child LayoutNodes. 8
-     * touches touch just outside the parent LayoutNode but inside the child LayoutNodes.
+     * touches touch just inside the parent LayoutNode and inside the child LayoutNodes. 8 touches
+     * touch just outside the parent LayoutNode but inside the child LayoutNodes.
      *
      * Because layout node bounds are not used to clip pointer input hit testing, all pointers
      * should hit.
@@ -1423,75 +1265,38 @@
         val pointerInputFilterBottomLeft = PointerInputFilterMock()
         val pointerInputFilterBottomRight = PointerInputFilterMock()
 
-        val layoutNodeTopLeft = LayoutNode(
-            -1, -1, 1, 1,
-            PointerInputModifierImpl2(
-                pointerInputFilterTopLeft
-            )
-        )
-        val layoutNodeTopRight = LayoutNode(
-            2, -1, 4, 1,
-            PointerInputModifierImpl2(
-                pointerInputFilterTopRight
-            )
-        )
-        val layoutNodeBottomLeft = LayoutNode(
-            -1, 2, 1, 4,
-            PointerInputModifierImpl2(
-                pointerInputFilterBottomLeft
-            )
-        )
-        val layoutNodeBottomRight = LayoutNode(
-            2, 2, 4, 4,
-            PointerInputModifierImpl2(
-                pointerInputFilterBottomRight
-            )
-        )
+        val layoutNodeTopLeft =
+            LayoutNode(-1, -1, 1, 1, PointerInputModifierImpl2(pointerInputFilterTopLeft))
+        val layoutNodeTopRight =
+            LayoutNode(2, -1, 4, 1, PointerInputModifierImpl2(pointerInputFilterTopRight))
+        val layoutNodeBottomLeft =
+            LayoutNode(-1, 2, 1, 4, PointerInputModifierImpl2(pointerInputFilterBottomLeft))
+        val layoutNodeBottomRight =
+            LayoutNode(2, 2, 4, 4, PointerInputModifierImpl2(pointerInputFilterBottomRight))
 
-        val parentLayoutNode = LayoutNode(1, 1, 4, 4).apply {
-            insertAt(0, layoutNodeTopLeft)
-            insertAt(1, layoutNodeTopRight)
-            insertAt(2, layoutNodeBottomLeft)
-            insertAt(3, layoutNodeBottomRight)
-        }
+        val parentLayoutNode =
+            LayoutNode(1, 1, 4, 4).apply {
+                insertAt(0, layoutNodeTopLeft)
+                insertAt(1, layoutNodeTopRight)
+                insertAt(2, layoutNodeBottomLeft)
+                insertAt(3, layoutNodeBottomRight)
+            }
         addToRoot(parentLayoutNode)
 
-        val offsetsTopLeft =
-            listOf(
-                Offset(0f, 1f),
-                Offset(1f, 0f),
-                Offset(1f, 1f)
-            )
+        val offsetsTopLeft = listOf(Offset(0f, 1f), Offset(1f, 0f), Offset(1f, 1f))
 
-        val offsetsTopRight =
-            listOf(
-                Offset(3f, 0f),
-                Offset(3f, 1f),
-                Offset(4f, 1f)
-            )
+        val offsetsTopRight = listOf(Offset(3f, 0f), Offset(3f, 1f), Offset(4f, 1f))
 
-        val offsetsBottomLeft =
-            listOf(
-                Offset(0f, 3f),
-                Offset(1f, 3f),
-                Offset(1f, 4f)
-            )
+        val offsetsBottomLeft = listOf(Offset(0f, 3f), Offset(1f, 3f), Offset(1f, 4f))
 
-        val offsetsBottomRight =
-            listOf(
-                Offset(3f, 3f),
-                Offset(3f, 4f),
-                Offset(4f, 3f)
-            )
+        val offsetsBottomRight = listOf(Offset(3f, 3f), Offset(3f, 4f), Offset(4f, 3f))
 
         val allOffsets = offsetsTopLeft + offsetsTopRight + offsetsBottomLeft + offsetsBottomRight
 
         val pointerInputEvent =
             PointerInputEvent(
                 11,
-                (allOffsets.indices).map {
-                    PointerInputEventData(it, 11, allOffsets[it], true)
-                }
+                (allOffsets.indices).map { PointerInputEventData(it, 11, allOffsets[it], true) }
             )
 
         // Act
@@ -1505,16 +1310,10 @@
                 PointerInputChange(
                     id = PointerId(it.toLong()),
                     11,
-                    Offset(
-                        offsetsTopLeft[it].x,
-                        offsetsTopLeft[it].y
-                    ),
+                    Offset(offsetsTopLeft[it].x, offsetsTopLeft[it].y),
                     true,
                     11,
-                    Offset(
-                        offsetsTopLeft[it].x,
-                        offsetsTopLeft[it].y
-                    ),
+                    Offset(offsetsTopLeft[it].x, offsetsTopLeft[it].y),
                     false,
                     isInitiallyConsumed = false
                 )
@@ -1525,16 +1324,10 @@
                 PointerInputChange(
                     id = PointerId(it.toLong() + 3),
                     11,
-                    Offset(
-                        offsetsTopRight[it].x - 3f,
-                        offsetsTopRight[it].y
-                    ),
+                    Offset(offsetsTopRight[it].x - 3f, offsetsTopRight[it].y),
                     true,
                     11,
-                    Offset(
-                        offsetsTopRight[it].x - 3f,
-                        offsetsTopRight[it].y
-                    ),
+                    Offset(offsetsTopRight[it].x - 3f, offsetsTopRight[it].y),
                     false,
                     isInitiallyConsumed = false
                 )
@@ -1545,16 +1338,10 @@
                 PointerInputChange(
                     id = PointerId(it.toLong() + 6),
                     11,
-                    Offset(
-                        offsetsBottomLeft[it].x,
-                        offsetsBottomLeft[it].y - 3f
-                    ),
+                    Offset(offsetsBottomLeft[it].x, offsetsBottomLeft[it].y - 3f),
                     true,
                     11,
-                    Offset(
-                        offsetsBottomLeft[it].x,
-                        offsetsBottomLeft[it].y - 3f
-                    ),
+                    Offset(offsetsBottomLeft[it].x, offsetsBottomLeft[it].y - 3f),
                     false,
                     isInitiallyConsumed = false
                 )
@@ -1565,16 +1352,10 @@
                 PointerInputChange(
                     id = PointerId(it.toLong() + 9),
                     11,
-                    Offset(
-                        offsetsBottomRight[it].x - 3f,
-                        offsetsBottomRight[it].y - 3f
-                    ),
+                    Offset(offsetsBottomRight[it].x - 3f, offsetsBottomRight[it].y - 3f),
                     true,
                     11,
-                    Offset(
-                        offsetsBottomRight[it].x - 3f,
-                        offsetsBottomRight[it].y - 3f
-                    ),
+                    Offset(offsetsBottomRight[it].x - 3f, offsetsBottomRight[it].y - 3f),
                     false,
                     isInitiallyConsumed = false
                 )
@@ -1614,56 +1395,31 @@
     /**
      * This test creates a layout of this shape:
      *
-     *   |---|
-     *   |tt |
-     *   |t  |
-     *   |---|t
-     *       tt
+     * |---| |tt | |t | |---|t tt
      *
-     *   But where the additional offset suggest something more like this shape.
+     * But where the additional offset suggest something more like this shape.
      *
-     *   tt
-     *   t|---|
-     *    |  t|
-     *    | tt|
-     *    |---|
+     * tt t|---| | t| | tt| |---|
      *
-     *   Without the additional offset, it would be expected that only the top left 3 pointers would
-     *   hit, but with the additional offset, only the bottom right 3 hit.
+     * Without the additional offset, it would be expected that only the top left 3 pointers would
+     * hit, but with the additional offset, only the bottom right 3 hit.
      */
     @Test
     fun process_rootIsOffset_onlyCorrectPointersHit() {
 
         // Arrange
         val singlePointerInputFilter = PointerInputFilterMock()
-        val layoutNode = LayoutNode(
-            0, 0, 2, 2,
-            PointerInputModifierImpl2(
-                singlePointerInputFilter
-            )
-        )
+        val layoutNode = LayoutNode(0, 0, 2, 2, PointerInputModifierImpl2(singlePointerInputFilter))
         val outerLayoutNode = LayoutNode(1, 1, 3, 3)
         outerLayoutNode.insertAt(0, layoutNode)
         addToRoot(outerLayoutNode)
-        val offsetsThatHit =
-            listOf(
-                Offset(2f, 2f),
-                Offset(2f, 1f),
-                Offset(1f, 2f)
-            )
-        val offsetsThatMiss =
-            listOf(
-                Offset(0f, 0f),
-                Offset(0f, 1f),
-                Offset(1f, 0f)
-            )
+        val offsetsThatHit = listOf(Offset(2f, 2f), Offset(2f, 1f), Offset(1f, 2f))
+        val offsetsThatMiss = listOf(Offset(0f, 0f), Offset(0f, 1f), Offset(1f, 0f))
         val allOffsets = offsetsThatHit + offsetsThatMiss
         val pointerInputEvent =
             PointerInputEvent(
                 11,
-                (allOffsets.indices).map {
-                    PointerInputEventData(it, 11, allOffsets[it], true)
-                }
+                (allOffsets.indices).map { PointerInputEventData(it, 11, allOffsets[it], true) }
             )
 
         // Act
@@ -1708,25 +1464,18 @@
         val pointerInputFilter2 = PointerInputFilterMock()
         val pointerInputFilter3 = PointerInputFilterMock()
 
-        val modifier = PointerInputModifierImpl2(pointerInputFilter1) then
-            PointerInputModifierImpl2(pointerInputFilter2) then
-            PointerInputModifierImpl2(pointerInputFilter3)
+        val modifier =
+            PointerInputModifierImpl2(pointerInputFilter1) then
+                PointerInputModifierImpl2(pointerInputFilter2) then
+                PointerInputModifierImpl2(pointerInputFilter3)
 
-        val layoutNode = LayoutNode(
-            25, 50, 75, 100,
-            modifier
-        )
+        val layoutNode = LayoutNode(25, 50, 75, 100, modifier)
 
         addToRoot(layoutNode)
 
         val offset1 = Offset(50f, 75f)
 
-        val down = PointerInputEvent(
-            7,
-            listOf(
-                PointerInputEventData(0, 7, offset1, true)
-            )
-        )
+        val down = PointerInputEvent(7, listOf(PointerInputEventData(0, 7, offset1, true)))
 
         val expectedChange =
             PointerInputChange(
@@ -1783,30 +1532,15 @@
 
         val pointerInputFilter = PointerInputFilterMock()
 
-        val layoutNode1 =
-            LayoutNode(
-                1, 5, 500, 500,
-                PointerInputModifierImpl2(pointerInputFilter)
-            )
-        val layoutNode2: LayoutNode = LayoutNode(2, 6, 500, 500).apply {
-            insertAt(0, layoutNode1)
-        }
-        val layoutNode3: LayoutNode = LayoutNode(3, 7, 500, 500).apply {
-            insertAt(0, layoutNode2)
-        }
-        val layoutNode4: LayoutNode = LayoutNode(4, 8, 500, 500).apply {
-            insertAt(0, layoutNode3)
-        }
+        val layoutNode1 = LayoutNode(1, 5, 500, 500, PointerInputModifierImpl2(pointerInputFilter))
+        val layoutNode2: LayoutNode = LayoutNode(2, 6, 500, 500).apply { insertAt(0, layoutNode1) }
+        val layoutNode3: LayoutNode = LayoutNode(3, 7, 500, 500).apply { insertAt(0, layoutNode2) }
+        val layoutNode4: LayoutNode = LayoutNode(4, 8, 500, 500).apply { insertAt(0, layoutNode3) }
         addToRoot(layoutNode4)
 
         val offset1 = Offset(499f, 499f)
 
-        val downEvent = PointerInputEvent(
-            7,
-            listOf(
-                PointerInputEventData(0, 7, offset1, true)
-            )
-        )
+        val downEvent = PointerInputEvent(7, listOf(PointerInputEventData(0, 7, offset1, true)))
 
         val expectedChange =
             PointerInputChange(
@@ -1850,54 +1584,43 @@
         val pointerInputFilter3 = PointerInputFilterMock()
         val pointerInputFilter4 = PointerInputFilterMock()
 
-        val layoutNode1 = LayoutNode(
-            1, 6, 500, 500,
-            PointerInputModifierImpl2(pointerInputFilter1)
-                then PointerInputModifierImpl2(pointerInputFilter2)
-        )
-        val layoutNode2: LayoutNode = LayoutNode(2, 7, 500, 500).apply {
-            insertAt(0, layoutNode1)
-        }
+        val layoutNode1 =
+            LayoutNode(
+                1,
+                6,
+                500,
+                500,
+                PointerInputModifierImpl2(pointerInputFilter1) then
+                    PointerInputModifierImpl2(pointerInputFilter2)
+            )
+        val layoutNode2: LayoutNode = LayoutNode(2, 7, 500, 500).apply { insertAt(0, layoutNode1) }
         val layoutNode3 =
             LayoutNode(
-                3, 8, 500, 500,
-                PointerInputModifierImpl2(pointerInputFilter3)
-                    then PointerInputModifierImpl2(pointerInputFilter4)
-            ).apply {
-                insertAt(0, layoutNode2)
-            }
+                    3,
+                    8,
+                    500,
+                    500,
+                    PointerInputModifierImpl2(pointerInputFilter3) then
+                        PointerInputModifierImpl2(pointerInputFilter4)
+                )
+                .apply { insertAt(0, layoutNode2) }
 
-        val layoutNode4: LayoutNode = LayoutNode(4, 9, 500, 500).apply {
-            insertAt(0, layoutNode3)
-        }
-        val layoutNode5: LayoutNode = LayoutNode(5, 10, 500, 500).apply {
-            insertAt(0, layoutNode4)
-        }
+        val layoutNode4: LayoutNode = LayoutNode(4, 9, 500, 500).apply { insertAt(0, layoutNode3) }
+        val layoutNode5: LayoutNode = LayoutNode(5, 10, 500, 500).apply { insertAt(0, layoutNode4) }
         addToRoot(layoutNode5)
 
         val offset1 = Offset(499f, 499f)
 
-        val downEvent = PointerInputEvent(
-            3,
-            listOf(
-                PointerInputEventData(0, 3, offset1, true)
-            )
-        )
+        val downEvent = PointerInputEvent(3, listOf(PointerInputEventData(0, 3, offset1, true)))
 
         val expectedChange1 =
             PointerInputChange(
                 id = PointerId(0),
                 3,
-                offset1 - Offset(
-                    1f + 2f + 3f + 4f + 5f,
-                    6f + 7f + 8f + 9f + 10f
-                ),
+                offset1 - Offset(1f + 2f + 3f + 4f + 5f, 6f + 7f + 8f + 9f + 10f),
                 true,
                 3,
-                offset1 - Offset(
-                    1f + 2f + 3f + 4f + 5f,
-                    6f + 7f + 8f + 9f + 10f
-                ),
+                offset1 - Offset(1f + 2f + 3f + 4f + 5f, 6f + 7f + 8f + 9f + 10f),
                 false,
                 isInitiallyConsumed = false
             )
@@ -1966,24 +1689,12 @@
         val pointerInputFilter1 = PointerInputFilterMock()
         val pointerInputFilter2 = PointerInputFilterMock()
 
-        val layoutNode1 = LayoutNode(
-            0, 0, 100, 100,
-            PointerInputModifierImpl2(
-                pointerInputFilter1
-            )
-        )
-        val layoutNode2 = LayoutNode(
-            0, 0, 100, 100,
-            PointerInputModifierImpl2(
-                pointerInputFilter2
-            )
-        )
+        val layoutNode1 = LayoutNode(0, 0, 100, 100, PointerInputModifierImpl2(pointerInputFilter1))
+        val layoutNode2 = LayoutNode(0, 0, 100, 100, PointerInputModifierImpl2(pointerInputFilter2))
 
         addToRoot(layoutNode1, layoutNode2)
 
-        val down = PointerInputEvent(
-            1, 0, Offset(50f, 50f), true
-        )
+        val down = PointerInputEvent(1, 0, Offset(50f, 50f), true)
 
         // Act
 
@@ -1999,16 +1710,11 @@
 
         val pointerInputFilter1 = PointerInputFilterMock()
 
-        val layoutNode1 = LayoutNode(
-            0, 0, 0, 0,
-            PointerInputModifierImpl2(pointerInputFilter1)
-        )
+        val layoutNode1 = LayoutNode(0, 0, 0, 0, PointerInputModifierImpl2(pointerInputFilter1))
 
         addToRoot(layoutNode1)
 
-        val down = PointerInputEvent(
-            1, 0, Offset(0f, 0f), true
-        )
+        val down = PointerInputEvent(1, 0, Offset(0f, 0f), true)
 
         // Act
         pointerInputEventProcessor.process(down)
@@ -2031,20 +1737,11 @@
 
         val pointerInputFilter = PointerInputFilterMock()
 
-        val layoutNode = LayoutNode(
-            0, 0, 500, 500,
-            PointerInputModifierImpl2(pointerInputFilter)
-        )
+        val layoutNode = LayoutNode(0, 0, 500, 500, PointerInputModifierImpl2(pointerInputFilter))
 
         addToRoot(layoutNode)
 
-        val pointerInputEvent =
-            PointerInputEvent(
-                7,
-                5,
-                Offset(250f, 250f),
-                true
-            )
+        val pointerInputEvent = PointerInputEvent(7, 5, Offset(250f, 250f), true)
 
         val expectedChange =
             PointerInputChange(
@@ -2065,9 +1762,10 @@
 
         // Assert
 
-        val log = pointerInputFilter.log.filter {
-            it is OnPointerEventFilterEntry || it is OnCancelFilterEntry
-        }
+        val log =
+            pointerInputFilter.log.filter {
+                it is OnPointerEventFilterEntry || it is OnCancelFilterEntry
+            }
 
         // Verify call count
         assertThat(log).hasSize(PointerEventPass.values().size + 1)
@@ -2090,39 +1788,18 @@
 
         val pointerInputFilter = PointerInputFilterMock()
 
-        val layoutNode = LayoutNode(
-            0, 0, 500, 500,
-            PointerInputModifierImpl2(
-                pointerInputFilter
-            )
-        )
+        val layoutNode = LayoutNode(0, 0, 500, 500, PointerInputModifierImpl2(pointerInputFilter))
 
         addToRoot(layoutNode)
 
-        val pointerInputEvent1 =
-            PointerInputEvent(
-                7,
-                5,
-                Offset(200f, 200f),
-                true
-            )
+        val pointerInputEvent1 = PointerInputEvent(7, 5, Offset(200f, 200f), true)
 
         val pointerInputEvent2 =
             PointerInputEvent(
                 10,
                 listOf(
-                    PointerInputEventData(
-                        7,
-                        10,
-                        Offset(200f, 200f),
-                        true
-                    ),
-                    PointerInputEventData(
-                        9,
-                        10,
-                        Offset(300f, 300f),
-                        true
-                    )
+                    PointerInputEventData(7, 10, Offset(200f, 200f), true),
+                    PointerInputEventData(9, 10, Offset(300f, 300f), true)
                 )
             )
 
@@ -2172,9 +1849,10 @@
 
         // Assert
 
-        val log = pointerInputFilter.log.filter {
-            it is OnPointerEventFilterEntry || it is OnCancelFilterEntry
-        }
+        val log =
+            pointerInputFilter.log.filter {
+                it is OnPointerEventFilterEntry || it is OnCancelFilterEntry
+            }
 
         // Verify call count
         assertThat(log).hasSize(PointerEventPass.values().size * 2 + 1)
@@ -2206,39 +1884,20 @@
         // Arrange
 
         val pointerInputFilter1 = PointerInputFilterMock()
-        val layoutNode1 = LayoutNode(
-            0, 0, 199, 199,
-            PointerInputModifierImpl2(pointerInputFilter1)
-        )
+        val layoutNode1 = LayoutNode(0, 0, 199, 199, PointerInputModifierImpl2(pointerInputFilter1))
 
         val pointerInputFilter2 = PointerInputFilterMock()
-        val layoutNode2 = LayoutNode(
-            200, 200, 399, 399,
-            PointerInputModifierImpl2(pointerInputFilter2)
-        )
+        val layoutNode2 =
+            LayoutNode(200, 200, 399, 399, PointerInputModifierImpl2(pointerInputFilter2))
 
         addToRoot(layoutNode1, layoutNode2)
 
-        val pointerInputEventData1 =
-            PointerInputEventData(
-                7,
-                5,
-                Offset(100f, 100f),
-                true
-            )
+        val pointerInputEventData1 = PointerInputEventData(7, 5, Offset(100f, 100f), true)
 
-        val pointerInputEventData2 =
-            PointerInputEventData(
-                9,
-                5,
-                Offset(300f, 300f),
-                true
-            )
+        val pointerInputEventData2 = PointerInputEventData(9, 5, Offset(300f, 300f), true)
 
-        val pointerInputEvent = PointerInputEvent(
-            5,
-            listOf(pointerInputEventData1, pointerInputEventData2)
-        )
+        val pointerInputEvent =
+            PointerInputEvent(5, listOf(pointerInputEventData1, pointerInputEventData2))
 
         val expectedChange1 =
             PointerInputChange(
@@ -2309,28 +1968,13 @@
         // Arrange
 
         val pointerInputFilter = PointerInputFilterMock()
-        val layoutNode = LayoutNode(
-            0, 0, 500, 500,
-            PointerInputModifierImpl2(pointerInputFilter)
-        )
+        val layoutNode = LayoutNode(0, 0, 500, 500, PointerInputModifierImpl2(pointerInputFilter))
 
         addToRoot(layoutNode)
 
-        val down =
-            PointerInputEvent(
-                7,
-                5,
-                Offset(200f, 200f),
-                true
-            )
+        val down = PointerInputEvent(7, 5, Offset(200f, 200f), true)
 
-        val move =
-            PointerInputEvent(
-                7,
-                10,
-                Offset(300f, 300f),
-                true
-            )
+        val move = PointerInputEvent(7, 10, Offset(300f, 300f), true)
 
         val expectedDown =
             PointerInputChange(
@@ -2364,9 +2008,10 @@
 
         // Assert
 
-        val log = pointerInputFilter.log.filter {
-            it is OnPointerEventFilterEntry || it is OnCancelFilterEntry
-        }
+        val log =
+            pointerInputFilter.log.filter {
+                it is OnPointerEventFilterEntry || it is OnCancelFilterEntry
+            }
 
         // Verify call count
         assertThat(log).hasSize(PointerEventPass.values().size * 2 + 1)
@@ -2398,20 +2043,11 @@
         // Arrange
 
         val pointerInputFilter = PointerInputFilterMock()
-        val layoutNode = LayoutNode(
-            0, 0, 500, 500,
-            PointerInputModifierImpl2(pointerInputFilter)
-        )
+        val layoutNode = LayoutNode(0, 0, 500, 500, PointerInputModifierImpl2(pointerInputFilter))
 
         addToRoot(layoutNode)
 
-        val down =
-            PointerInputEvent(
-                7,
-                5,
-                Offset(200f, 200f),
-                true
-            )
+        val down = PointerInputEvent(7, 5, Offset(200f, 200f), true)
 
         val expectedDown =
             PointerInputChange(
@@ -2432,9 +2068,10 @@
 
         // Assert
 
-        val log = pointerInputFilter.log.filter {
-            it is OnPointerEventFilterEntry || it is OnCancelFilterEntry
-        }
+        val log =
+            pointerInputFilter.log.filter {
+                it is OnPointerEventFilterEntry || it is OnCancelFilterEntry
+            }
 
         // Verify call count
         assertThat(log).hasSize(PointerEventPass.values().size + 1)
@@ -2458,30 +2095,13 @@
         // Arrange
 
         val pointerInputFilter = PointerInputFilterMock()
-        val layoutNode = LayoutNode(
-            0, 0, 500, 500,
-            PointerInputModifierImpl2(
-                pointerInputFilter
-            )
-        )
+        val layoutNode = LayoutNode(0, 0, 500, 500, PointerInputModifierImpl2(pointerInputFilter))
 
         addToRoot(layoutNode)
 
-        val down1 =
-            PointerInputEvent(
-                7,
-                5,
-                Offset(200f, 200f),
-                true
-            )
+        val down1 = PointerInputEvent(7, 5, Offset(200f, 200f), true)
 
-        val down2 =
-            PointerInputEvent(
-                7,
-                10,
-                Offset(200f, 200f),
-                true
-            )
+        val down2 = PointerInputEvent(7, 10, Offset(200f, 200f), true)
 
         val expectedDown1 =
             PointerInputChange(
@@ -2515,9 +2135,10 @@
 
         // Assert
 
-        val log = pointerInputFilter.log.filter {
-            it is OnPointerEventFilterEntry || it is OnCancelFilterEntry
-        }
+        val log =
+            pointerInputFilter.log.filter {
+                it is OnPointerEventFilterEntry || it is OnCancelFilterEntry
+            }
 
         // Verify call count
         assertThat(log).hasSize(PointerEventPass.values().size * 2 + 1)
@@ -2550,18 +2171,14 @@
         // Arrange
 
         val childPointerInputFilter = PointerInputFilterMock()
-        val childLayoutNode = LayoutNode(
-            0, 0, 100, 100,
-            PointerInputModifierImpl2(childPointerInputFilter)
-        )
+        val childLayoutNode =
+            LayoutNode(0, 0, 100, 100, PointerInputModifierImpl2(childPointerInputFilter))
 
         val parentPointerInputFilter = PointerInputFilterMock()
-        val parentLayoutNode: LayoutNode = LayoutNode(
-            0, 0, 100, 100,
-            PointerInputModifierImpl2(parentPointerInputFilter)
-        ).apply {
-            insertAt(0, childLayoutNode)
-        }
+        val parentLayoutNode: LayoutNode =
+            LayoutNode(0, 0, 100, 100, PointerInputModifierImpl2(parentPointerInputFilter)).apply {
+                insertAt(0, childLayoutNode)
+            }
 
         addToRoot(parentLayoutNode)
 
@@ -2665,23 +2282,18 @@
         // Arrange
 
         val childPointerInputFilter = PointerInputFilterMock()
-        val childLayoutNode = LayoutNode(
-            0, 0, 100, 100,
-            PointerInputModifierImpl2(childPointerInputFilter)
-        )
+        val childLayoutNode =
+            LayoutNode(0, 0, 100, 100, PointerInputModifierImpl2(childPointerInputFilter))
 
         val parentPointerInputFilter = PointerInputFilterMock()
-        val parentLayoutNode: LayoutNode = LayoutNode(
-            0, 0, 100, 100,
-            PointerInputModifierImpl2(parentPointerInputFilter)
-        ).apply {
-            insertAt(0, childLayoutNode)
-        }
+        val parentLayoutNode: LayoutNode =
+            LayoutNode(0, 0, 100, 100, PointerInputModifierImpl2(parentPointerInputFilter)).apply {
+                insertAt(0, childLayoutNode)
+            }
 
         addToRoot(parentLayoutNode)
 
-        val down =
-            PointerInputEvent(0, 7, Offset(50f, 50f), true)
+        val down = PointerInputEvent(0, 7, Offset(50f, 50f), true)
 
         val up = PointerInputEvent(0, 11, Offset(50f, 50f), false)
 
@@ -2702,22 +2314,14 @@
         // Arrange
 
         val childPointerInputFilter = PointerInputFilterMock()
-        val childLayoutNode = LayoutNode(
-            0, 0, 100, 100,
-            PointerInputModifierImpl2(
-                childPointerInputFilter
-            )
-        )
+        val childLayoutNode =
+            LayoutNode(0, 0, 100, 100, PointerInputModifierImpl2(childPointerInputFilter))
 
         val parentPointerInputFilter = PointerInputFilterMock()
-        val parentLayoutNode: LayoutNode = LayoutNode(
-            0, 0, 100, 100,
-            PointerInputModifierImpl2(
-                parentPointerInputFilter
-            )
-        ).apply {
-            insertAt(0, childLayoutNode)
-        }
+        val parentLayoutNode: LayoutNode =
+            LayoutNode(0, 0, 100, 100, PointerInputModifierImpl2(parentPointerInputFilter)).apply {
+                insertAt(0, childLayoutNode)
+            }
 
         addToRoot(parentLayoutNode)
 
@@ -2821,26 +2425,20 @@
         // Arrange
 
         val childPointerInputFilter = PointerInputFilterMock()
-        val childLayoutNode = LayoutNode(
-            0, 0, 100, 100,
-            PointerInputModifierImpl2(childPointerInputFilter)
-        )
+        val childLayoutNode =
+            LayoutNode(0, 0, 100, 100, PointerInputModifierImpl2(childPointerInputFilter))
 
         val parentPointerInputFilter = PointerInputFilterMock()
-        val parentLayoutNode: LayoutNode = LayoutNode(
-            0, 0, 100, 100,
-            PointerInputModifierImpl2(parentPointerInputFilter)
-        ).apply {
-            insertAt(0, childLayoutNode)
-        }
+        val parentLayoutNode: LayoutNode =
+            LayoutNode(0, 0, 100, 100, PointerInputModifierImpl2(parentPointerInputFilter)).apply {
+                insertAt(0, childLayoutNode)
+            }
 
         addToRoot(parentLayoutNode)
 
-        val down =
-            PointerInputEvent(0, 7, Offset(50f, 50f), true)
+        val down = PointerInputEvent(0, 7, Offset(50f, 50f), true)
 
-        val up =
-            PointerInputEvent(0, 11, Offset(50f, 50f), false)
+        val up = PointerInputEvent(0, 11, Offset(50f, 50f), false)
 
         // Act
 
@@ -2855,17 +2453,17 @@
 
     @Test
     fun process_downNoPointerInputModifiers_nothingInteractedWithAndNoMovementConsumed() {
-        val pointerInputEvent =
-            PointerInputEvent(0, 7, Offset(0f, 0f), true)
+        val pointerInputEvent = PointerInputEvent(0, 7, Offset(0f, 0f), true)
 
         val result: ProcessResult = pointerInputEventProcessor.process(pointerInputEvent)
 
-        assertThat(result).isEqualTo(
-            ProcessResult(
-                dispatchedToAPointerInputModifier = false,
-                anyMovementConsumed = false
+        assertThat(result)
+            .isEqualTo(
+                ProcessResult(
+                    dispatchedToAPointerInputModifier = false,
+                    anyMovementConsumed = false
+                )
             )
-        )
     }
 
     @Test
@@ -2875,28 +2473,15 @@
 
         val pointerInputFilter = PointerInputFilterMock()
 
-        val layoutNode = LayoutNode(
-            0, 0, 1, 1,
-            PointerInputModifierImpl2(
-                pointerInputFilter
-            )
-        )
+        val layoutNode = LayoutNode(0, 0, 1, 1, PointerInputModifierImpl2(pointerInputFilter))
 
         addToRoot(layoutNode)
 
-        val offsets =
-            listOf(
-                Offset(-1f, 0f),
-                Offset(0f, -1f),
-                Offset(1f, 0f),
-                Offset(0f, 1f)
-            )
+        val offsets = listOf(Offset(-1f, 0f), Offset(0f, -1f), Offset(1f, 0f), Offset(0f, 1f))
         val pointerInputEvent =
             PointerInputEvent(
                 11,
-                (offsets.indices).map {
-                    PointerInputEventData(it, 11, offsets[it], true)
-                }
+                (offsets.indices).map { PointerInputEventData(it, 11, offsets[it], true) }
             )
 
         // Act
@@ -2905,12 +2490,13 @@
 
         // Assert
 
-        assertThat(result).isEqualTo(
-            ProcessResult(
-                dispatchedToAPointerInputModifier = false,
-                anyMovementConsumed = false
+        assertThat(result)
+            .isEqualTo(
+                ProcessResult(
+                    dispatchedToAPointerInputModifier = false,
+                    anyMovementConsumed = false
+                )
             )
-        )
     }
 
     @Test
@@ -2919,15 +2505,9 @@
         // Arrange
 
         val pointerInputFilter = PointerInputFilterMock()
-        val layoutNode = LayoutNode(
-            0, 0, 1, 1,
-            PointerInputModifierImpl2(
-                pointerInputFilter
-            )
-        )
+        val layoutNode = LayoutNode(0, 0, 1, 1, PointerInputModifierImpl2(pointerInputFilter))
         addToRoot(layoutNode)
-        val pointerInputEvent =
-            PointerInputEvent(0, 11, Offset(0f, 0f), true)
+        val pointerInputEvent = PointerInputEvent(0, 11, Offset(0f, 0f), true)
 
         // Act
 
@@ -2935,12 +2515,10 @@
 
         // Assert
 
-        assertThat(result).isEqualTo(
-            ProcessResult(
-                dispatchedToAPointerInputModifier = true,
-                anyMovementConsumed = false
+        assertThat(result)
+            .isEqualTo(
+                ProcessResult(dispatchedToAPointerInputModifier = true, anyMovementConsumed = false)
             )
-        )
     }
 
     @Test
@@ -2949,12 +2527,7 @@
         // Arrange
 
         val pointerInputFilter = PointerInputFilterMock()
-        val layoutNode = LayoutNode(
-            0, 0, 1, 1,
-            PointerInputModifierImpl2(
-                pointerInputFilter
-            )
-        )
+        val layoutNode = LayoutNode(0, 0, 1, 1, PointerInputModifierImpl2(pointerInputFilter))
         addToRoot(layoutNode)
         val down = PointerInputEvent(0, 11, Offset(0f, 0f), true)
         pointerInputEventProcessor.process(down)
@@ -2967,12 +2540,13 @@
 
         // Assert
 
-        assertThat(result).isEqualTo(
-            ProcessResult(
-                dispatchedToAPointerInputModifier = false,
-                anyMovementConsumed = false
+        assertThat(result)
+            .isEqualTo(
+                ProcessResult(
+                    dispatchedToAPointerInputModifier = false,
+                    anyMovementConsumed = false
+                )
             )
-        )
     }
 
     @Test
@@ -2981,12 +2555,7 @@
         // Arrange
 
         val pointerInputFilter = PointerInputFilterMock()
-        val layoutNode = LayoutNode(
-            0, 0, 1, 1,
-            PointerInputModifierImpl2(
-                pointerInputFilter
-            )
-        )
+        val layoutNode = LayoutNode(0, 0, 1, 1, PointerInputModifierImpl2(pointerInputFilter))
         addToRoot(layoutNode)
         val down = PointerInputEvent(0, 11, Offset(0f, 0f), true)
         pointerInputEventProcessor.process(down)
@@ -2998,12 +2567,10 @@
 
         // Assert
 
-        assertThat(result).isEqualTo(
-            ProcessResult(
-                dispatchedToAPointerInputModifier = true,
-                anyMovementConsumed = false
+        assertThat(result)
+            .isEqualTo(
+                ProcessResult(dispatchedToAPointerInputModifier = true, anyMovementConsumed = false)
             )
-        )
     }
 
     @Test
@@ -3022,12 +2589,7 @@
                 }
             )
 
-        val layoutNode = LayoutNode(
-            0, 0, 1, 1,
-            PointerInputModifierImpl2(
-                pointerInputFilter
-            )
-        )
+        val layoutNode = LayoutNode(0, 0, 1, 1, PointerInputModifierImpl2(pointerInputFilter))
         addToRoot(layoutNode)
         val down = PointerInputEvent(0, 11, Offset(0f, 0f), true)
         pointerInputEventProcessor.process(down)
@@ -3039,50 +2601,40 @@
 
         // Assert
 
-        assertThat(result).isEqualTo(
-            ProcessResult(
-                dispatchedToAPointerInputModifier = true,
-                anyMovementConsumed = true
+        assertThat(result)
+            .isEqualTo(
+                ProcessResult(dispatchedToAPointerInputModifier = true, anyMovementConsumed = true)
             )
-        )
     }
 
     @Test
     fun processResult_trueTrue_propValuesAreCorrect() {
-        val processResult1 = ProcessResult(
-            dispatchedToAPointerInputModifier = true,
-            anyMovementConsumed = true
-        )
+        val processResult1 =
+            ProcessResult(dispatchedToAPointerInputModifier = true, anyMovementConsumed = true)
         assertThat(processResult1.dispatchedToAPointerInputModifier).isTrue()
         assertThat(processResult1.anyMovementConsumed).isTrue()
     }
 
     @Test
     fun processResult_trueFalse_propValuesAreCorrect() {
-        val processResult1 = ProcessResult(
-            dispatchedToAPointerInputModifier = true,
-            anyMovementConsumed = false
-        )
+        val processResult1 =
+            ProcessResult(dispatchedToAPointerInputModifier = true, anyMovementConsumed = false)
         assertThat(processResult1.dispatchedToAPointerInputModifier).isTrue()
         assertThat(processResult1.anyMovementConsumed).isFalse()
     }
 
     @Test
     fun processResult_falseTrue_propValuesAreCorrect() {
-        val processResult1 = ProcessResult(
-            dispatchedToAPointerInputModifier = false,
-            anyMovementConsumed = true
-        )
+        val processResult1 =
+            ProcessResult(dispatchedToAPointerInputModifier = false, anyMovementConsumed = true)
         assertThat(processResult1.dispatchedToAPointerInputModifier).isFalse()
         assertThat(processResult1.anyMovementConsumed).isTrue()
     }
 
     @Test
     fun processResult_falseFalse_propValuesAreCorrect() {
-        val processResult1 = ProcessResult(
-            dispatchedToAPointerInputModifier = false,
-            anyMovementConsumed = false
-        )
+        val processResult1 =
+            ProcessResult(dispatchedToAPointerInputModifier = false, anyMovementConsumed = false)
         assertThat(processResult1.dispatchedToAPointerInputModifier).isFalse()
         assertThat(processResult1.anyMovementConsumed).isFalse()
     }
@@ -3091,15 +2643,7 @@
     fun buttonsPressed() {
         // Arrange
         val pointerInputFilter = PointerInputFilterMock()
-        val layoutNode = LayoutNode(
-            0,
-            0,
-            500,
-            500,
-            PointerInputModifierImpl2(
-                pointerInputFilter
-            )
-        )
+        val layoutNode = LayoutNode(0, 0, 500, 500, PointerInputModifierImpl2(pointerInputFilter))
         addToRoot(layoutNode)
 
         class ButtonValidation(
@@ -3114,44 +2658,48 @@
             val pressedValues = pressedValues
         }
 
-        val buttonCheckerMap = mapOf(
-            MotionEvent.BUTTON_PRIMARY to ButtonValidation(0, primary = true),
-            MotionEvent.BUTTON_SECONDARY to ButtonValidation(1, secondary = true),
-            MotionEvent.BUTTON_TERTIARY to ButtonValidation(2, tertiary = true),
-            MotionEvent.BUTTON_STYLUS_PRIMARY to ButtonValidation(0, primary = true),
-            MotionEvent.BUTTON_STYLUS_SECONDARY to ButtonValidation(1, secondary = true),
-            MotionEvent.BUTTON_BACK to ButtonValidation(3, back = true),
-            MotionEvent.BUTTON_FORWARD to ButtonValidation(4, forward = true),
-            MotionEvent.BUTTON_PRIMARY or MotionEvent.BUTTON_TERTIARY to
-                ButtonValidation(0, 2, primary = true, tertiary = true),
-            MotionEvent.BUTTON_BACK or MotionEvent.BUTTON_STYLUS_PRIMARY to
-                ButtonValidation(0, 3, primary = true, back = true),
-            0 to ButtonValidation(anyPressed = false)
-        )
+        val buttonCheckerMap =
+            mapOf(
+                MotionEvent.BUTTON_PRIMARY to ButtonValidation(0, primary = true),
+                MotionEvent.BUTTON_SECONDARY to ButtonValidation(1, secondary = true),
+                MotionEvent.BUTTON_TERTIARY to ButtonValidation(2, tertiary = true),
+                MotionEvent.BUTTON_STYLUS_PRIMARY to ButtonValidation(0, primary = true),
+                MotionEvent.BUTTON_STYLUS_SECONDARY to ButtonValidation(1, secondary = true),
+                MotionEvent.BUTTON_BACK to ButtonValidation(3, back = true),
+                MotionEvent.BUTTON_FORWARD to ButtonValidation(4, forward = true),
+                MotionEvent.BUTTON_PRIMARY or
+                    MotionEvent.BUTTON_TERTIARY to
+                    ButtonValidation(0, 2, primary = true, tertiary = true),
+                MotionEvent.BUTTON_BACK or
+                    MotionEvent.BUTTON_STYLUS_PRIMARY to
+                    ButtonValidation(0, 3, primary = true, back = true),
+                0 to ButtonValidation(anyPressed = false)
+            )
 
         for (entry in buttonCheckerMap) {
             val buttonState = entry.key
             val validator = entry.value
-            val event = PointerInputEvent(
-                0,
-                listOf(PointerInputEventData(0, 0L, Offset.Zero, true)),
-                MotionEvent.obtain(
-                    0L,
-                    0L,
-                    MotionEvent.ACTION_DOWN,
-                    1,
-                    arrayOf(PointerProperties(1, MotionEvent.TOOL_TYPE_MOUSE)),
-                    arrayOf(PointerCoords(0f, 0f)),
+            val event =
+                PointerInputEvent(
                     0,
-                    buttonState,
-                    0.1f,
-                    0.1f,
-                    0,
-                    0,
-                    InputDevice.SOURCE_MOUSE,
-                    0
+                    listOf(PointerInputEventData(0, 0L, Offset.Zero, true)),
+                    MotionEvent.obtain(
+                        0L,
+                        0L,
+                        MotionEvent.ACTION_DOWN,
+                        1,
+                        arrayOf(PointerProperties(1, MotionEvent.TOOL_TYPE_MOUSE)),
+                        arrayOf(PointerCoords(0f, 0f)),
+                        0,
+                        buttonState,
+                        0.1f,
+                        0.1f,
+                        0,
+                        0,
+                        InputDevice.SOURCE_MOUSE,
+                        0
+                    )
                 )
-            )
             pointerInputEventProcessor.process(event)
 
             with(
@@ -3178,15 +2726,7 @@
     fun metaState() {
         // Arrange
         val pointerInputFilter = PointerInputFilterMock()
-        val layoutNode = LayoutNode(
-            0,
-            0,
-            500,
-            500,
-            PointerInputModifierImpl2(
-                pointerInputFilter
-            )
-        )
+        val layoutNode = LayoutNode(0, 0, 500, 500, PointerInputModifierImpl2(pointerInputFilter))
         addToRoot(layoutNode)
 
         class MetaValidation(
@@ -3201,49 +2741,54 @@
             val numLock: Boolean = false
         )
 
-        val buttonCheckerMap = mapOf(
-            AndroidKeyEvent.META_CTRL_ON to MetaValidation(control = true),
-            AndroidKeyEvent.META_META_ON to MetaValidation(meta = true),
-            AndroidKeyEvent.META_ALT_ON to MetaValidation(alt = true),
-            AndroidKeyEvent.META_SYM_ON to MetaValidation(sym = true),
-            AndroidKeyEvent.META_SHIFT_ON to MetaValidation(shift = true),
-            AndroidKeyEvent.META_FUNCTION_ON to MetaValidation(function = true),
-            AndroidKeyEvent.META_CAPS_LOCK_ON to MetaValidation(capsLock = true),
-            AndroidKeyEvent.META_SCROLL_LOCK_ON to MetaValidation(scrollLock = true),
-            AndroidKeyEvent.META_NUM_LOCK_ON to MetaValidation(numLock = true),
-            AndroidKeyEvent.META_CTRL_ON or AndroidKeyEvent.META_SHIFT_ON or
-                AndroidKeyEvent.META_NUM_LOCK_ON to
-                MetaValidation(control = true, shift = true, numLock = true),
-            0 to MetaValidation(),
-        )
+        val buttonCheckerMap =
+            mapOf(
+                AndroidKeyEvent.META_CTRL_ON to MetaValidation(control = true),
+                AndroidKeyEvent.META_META_ON to MetaValidation(meta = true),
+                AndroidKeyEvent.META_ALT_ON to MetaValidation(alt = true),
+                AndroidKeyEvent.META_SYM_ON to MetaValidation(sym = true),
+                AndroidKeyEvent.META_SHIFT_ON to MetaValidation(shift = true),
+                AndroidKeyEvent.META_FUNCTION_ON to MetaValidation(function = true),
+                AndroidKeyEvent.META_CAPS_LOCK_ON to MetaValidation(capsLock = true),
+                AndroidKeyEvent.META_SCROLL_LOCK_ON to MetaValidation(scrollLock = true),
+                AndroidKeyEvent.META_NUM_LOCK_ON to MetaValidation(numLock = true),
+                AndroidKeyEvent.META_CTRL_ON or
+                    AndroidKeyEvent.META_SHIFT_ON or
+                    AndroidKeyEvent.META_NUM_LOCK_ON to
+                    MetaValidation(control = true, shift = true, numLock = true),
+                0 to MetaValidation(),
+            )
 
         for (entry in buttonCheckerMap) {
             val metaState = entry.key
             val validator = entry.value
-            val event = PointerInputEvent(
-                0,
-                listOf(PointerInputEventData(0, 0L, Offset.Zero, true)),
-                MotionEvent.obtain(
-                    0L,
-                    0L,
-                    MotionEvent.ACTION_DOWN,
-                    1,
-                    arrayOf(PointerProperties(1, MotionEvent.TOOL_TYPE_MOUSE)),
-                    arrayOf(PointerCoords(0f, 0f)),
-                    metaState,
+            val event =
+                PointerInputEvent(
                     0,
-                    0.1f,
-                    0.1f,
-                    0,
-                    0,
-                    InputDevice.SOURCE_MOUSE,
-                    0
+                    listOf(PointerInputEventData(0, 0L, Offset.Zero, true)),
+                    MotionEvent.obtain(
+                        0L,
+                        0L,
+                        MotionEvent.ACTION_DOWN,
+                        1,
+                        arrayOf(PointerProperties(1, MotionEvent.TOOL_TYPE_MOUSE)),
+                        arrayOf(PointerCoords(0f, 0f)),
+                        metaState,
+                        0,
+                        0.1f,
+                        0.1f,
+                        0,
+                        0,
+                        InputDevice.SOURCE_MOUSE,
+                        0
+                    )
                 )
-            )
             pointerInputEventProcessor.process(event)
 
-            val keyboardModifiers = (pointerInputFilter.log.last() as OnPointerEventFilterEntry)
-                .pointerEvent.keyboardModifiers
+            val keyboardModifiers =
+                (pointerInputFilter.log.last() as OnPointerEventFilterEntry)
+                    .pointerEvent
+                    .keyboardModifiers
             with(keyboardModifiers) {
                 assertThat(isCtrlPressed).isEqualTo(validator.control)
                 assertThat(isMetaPressed).isEqualTo(validator.meta)
@@ -3268,23 +2813,22 @@
 
 internal fun LayoutNode(x: Int, y: Int, x2: Int, y2: Int, modifier: Modifier = Modifier) =
     LayoutNode().apply {
-        this.modifier = Modifier
-            .layout { measurable, constraints ->
-                val placeable = measurable.measure(constraints)
-                layout(placeable.width, placeable.height) {
-                    placeable.place(x, y)
+        this.modifier =
+            Modifier.layout { measurable, constraints ->
+                    val placeable = measurable.measure(constraints)
+                    layout(placeable.width, placeable.height) { placeable.place(x, y) }
                 }
+                .then(modifier)
+        measurePolicy =
+            object : LayoutNode.NoIntrinsicsMeasurePolicy("not supported") {
+                override fun MeasureScope.measure(
+                    measurables: List<Measurable>,
+                    constraints: Constraints
+                ): MeasureResult =
+                    innerCoordinator.layout(x2 - x, y2 - y) {
+                        measurables.forEach { it.measure(constraints).place(0, 0) }
+                    }
             }
-            .then(modifier)
-        measurePolicy = object : LayoutNode.NoIntrinsicsMeasurePolicy("not supported") {
-            override fun MeasureScope.measure(
-                measurables: List<Measurable>,
-                constraints: Constraints
-            ): MeasureResult =
-                innerCoordinator.layout(x2 - x, y2 - y) {
-                    measurables.forEach { it.measure(constraints).place(0, 0) }
-                }
-        }
     }
 
 @OptIn(ExperimentalComposeUiApi::class, InternalCoreApi::class)
@@ -3301,32 +2845,46 @@
     }
 
     override fun requestFocus(): Boolean = false
+
     override val rootForTest: RootForTest
         get() = TODO("Not yet implemented")
+
     override val hapticFeedBack: HapticFeedback
         get() = TODO("Not yet implemented")
+
     override val inputModeManager: InputModeManager
         get() = TODO("Not yet implemented")
+
     override val clipboardManager: ClipboardManager
         get() = TODO("Not yet implemented")
+
     override val accessibilityManager: AccessibilityManager
         get() = TODO("Not yet implemented")
+
     override val graphicsContext: GraphicsContext
         get() = TODO("Not yet implemented")
+
     override val dragAndDropManager: DragAndDropManager
         get() = TODO("Not yet implemented")
+
     override val textToolbar: TextToolbar
         get() = TODO("Not yet implemented")
+
     override val autofillTree: AutofillTree
         get() = TODO("Not yet implemented")
+
     override val autofill: Autofill?
         get() = null
+
     override val semanticAutofill: SemanticAutofill?
         get() = null
+
     override val density: Density
         get() = Density(1f)
+
     override val textInputService: TextInputService
         get() = TODO("Not yet implemented")
+
     override val softwareKeyboardController: SoftwareKeyboardController
         get() = TODO("Not yet implemented")
 
@@ -3350,8 +2908,10 @@
 
     override val pointerIconService: PointerIconService
         get() = TODO("Not yet implemented")
+
     override val focusOwner: FocusOwner
         get() = TODO("Not yet implemented")
+
     override val windowInfo: WindowInfo
         get() = TODO("Not yet implemented")
 
@@ -3362,10 +2922,13 @@
     @Suppress("OverridingDeprecatedMember", "DEPRECATION")
     override val fontLoader: Font.ResourceLoader
         get() = TODO("Not yet implemented")
+
     override val fontFamilyResolver: FontFamily.Resolver
         get() = TODO("Not yet implemented")
+
     override val layoutDirection: LayoutDirection
         get() = LayoutDirection.Ltr
+
     override var showLayoutBounds: Boolean
         get() = false
         set(@Suppress("UNUSED_PARAMETER") value) {}
@@ -3399,11 +2962,9 @@
         TODO("Not yet implemented")
     }
 
-    override fun onAttach(node: LayoutNode) {
-    }
+    override fun onAttach(node: LayoutNode) {}
 
-    override fun onDetach(node: LayoutNode) {
-    }
+    override fun onDetach(node: LayoutNode) {}
 
     override fun calculatePositionInWindow(localPosition: Offset): Offset =
         localPosition + position.toOffset()
@@ -3431,11 +2992,9 @@
         TODO("Not yet implemented")
     }
 
-    override fun onSemanticsChange() {
-    }
+    override fun onSemanticsChange() {}
 
-    override fun onLayoutChange(layoutNode: LayoutNode) {
-    }
+    override fun onLayoutChange(layoutNode: LayoutNode) {}
 
     override fun getFocusDirection(keyEvent: KeyEvent): FocusDirection? {
         TODO("Not yet implemented")
@@ -3446,11 +3005,13 @@
 
     override val viewConfiguration: ViewConfiguration
         get() = TODO("Not yet implemented")
+
     override val snapshotObserver = OwnerSnapshotObserver { it.invoke() }
     override val modifierLocalManager: ModifierLocalManager = ModifierLocalManager(this)
 
     override val coroutineContext: CoroutineContext =
         Executors.newFixedThreadPool(3).asCoroutineDispatcher()
+
     override fun registerOnEndApplyChangesListener(listener: () -> Unit) {
         onEndListeners += listener
     }
@@ -3481,18 +3042,14 @@
     if (expectedPif != null) {
         assertThat(entry.pointerInputFilter).isSameInstanceAs(expectedPif)
     }
-    PointerEventSubject
-        .assertThat(entry.pointerEvent)
-        .isStructurallyEqualTo(expectedEvent)
+    PointerEventSubject.assertThat(entry.pointerEvent).isStructurallyEqualTo(expectedEvent)
     assertThat(entry.pass).isEqualTo(expectedPass)
     if (expectedBounds != null) {
         assertThat(entry.bounds).isEqualTo(expectedBounds)
     }
 }
 
-private fun List<LogEntry>.verifyOnCancelCall(
-    index: Int
-) {
+private fun List<LogEntry>.verifyOnCancelCall(index: Int) {
     val logEntry = this[index]
     assertThat(logEntry).isInstanceOf(OnCancelFilterEntry::class.java)
 }
diff --git a/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/input/pointer/PointerInputViewConfigurationTest.kt b/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/input/pointer/PointerInputViewConfigurationTest.kt
index 887b17a..ec56909 100644
--- a/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/input/pointer/PointerInputViewConfigurationTest.kt
+++ b/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/input/pointer/PointerInputViewConfigurationTest.kt
@@ -43,8 +43,7 @@
 @RunWith(AndroidJUnit4::class)
 class PointerInputViewConfigurationTest {
 
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
     private val tag = "Tagged Layout"
 
@@ -77,18 +76,19 @@
         val pointerInputViewConfigurations = mutableListOf<Float>()
         rule.setContent {
             CompositionLocalProvider(
-                LocalViewConfiguration provides TestViewConfiguration(
-                    touchSlop = viewConfigurationTouchSlop
-                ),
+                LocalViewConfiguration provides
+                    TestViewConfiguration(touchSlop = viewConfigurationTouchSlop),
             ) {
-                Box(pointerInput {
-                    pointerInputViewConfigurations.add(viewConfigurationTouchSlop)
-                    awaitPointerEventScope {
-                        while (true) {
-                            awaitPointerEvent()
+                Box(
+                    pointerInput {
+                            pointerInputViewConfigurations.add(viewConfigurationTouchSlop)
+                            awaitPointerEventScope {
+                                while (true) {
+                                    awaitPointerEvent()
+                                }
+                            }
                         }
-                    }
-                }.testTag(tag)
+                        .testTag(tag)
                 )
             }
         }
@@ -97,12 +97,11 @@
         // created/triggered until there is a event(tap), we must trigger a tap to instantiate the
         // pointer input block of code.
         rule.waitForIdle()
-        rule.onNodeWithTag(tag)
-            .performTouchInput {
-                down(Offset.Zero)
-                moveBy(Offset(1f, 1f))
-                up()
-            }
+        rule.onNodeWithTag(tag).performTouchInput {
+            down(Offset.Zero)
+            moveBy(Offset(1f, 1f))
+            up()
+        }
 
         rule.runOnIdle {
             assertThat(pointerInputViewConfigurations.size).isEqualTo(1)
@@ -111,12 +110,11 @@
         }
 
         rule.waitForIdle()
-        rule.onNodeWithTag(tag)
-            .performTouchInput {
-                down(Offset.Zero)
-                moveBy(Offset(1f, 1f))
-                up()
-            }
+        rule.onNodeWithTag(tag).performTouchInput {
+            down(Offset.Zero)
+            moveBy(Offset(1f, 1f))
+            up()
+        }
 
         rule.runOnIdle {
             assertThat(pointerInputViewConfigurations.size).isEqualTo(2)
diff --git a/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/input/pointer/PointerInteropFilterAndroidViewHookupTest.kt b/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/input/pointer/PointerInteropFilterAndroidViewHookupTest.kt
index 038d0d5..f14059e 100644
--- a/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/input/pointer/PointerInteropFilterAndroidViewHookupTest.kt
+++ b/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/input/pointer/PointerInteropFilterAndroidViewHookupTest.kt
@@ -58,41 +58,42 @@
         eventStringLog.add("motionEvent")
     }
 
-    @get:Rule
-    val rule = createAndroidComposeRule<TestActivity>()
+    @get:Rule val rule = createAndroidComposeRule<TestActivity>()
 
     @Before
     fun setup() {
         rule.activityRule.scenario.onActivity { activity ->
+            child =
+                CustomView2(activity, motionEventCallback).apply {
+                    layoutParams = ViewGroup.LayoutParams(100, 100)
+                }
 
-            child = CustomView2(activity, motionEventCallback).apply {
-                layoutParams = ViewGroup.LayoutParams(100, 100)
-            }
-
-            val parent = ComposeView(activity).apply {
-                layoutParams = ViewGroup.LayoutParams(
-                    ViewGroup.LayoutParams.MATCH_PARENT,
-                    ViewGroup.LayoutParams.MATCH_PARENT
-                )
-                setContent {
-                    Box(Modifier.fillMaxSize()) {
-                        Box(Modifier.fillMaxSize()
-                            .pointerInput(Unit) {
-                                awaitPointerEventScope {
-                                    while (true) {
-                                        val event = awaitPointerEvent()
-                                        siblingEvents += event.type
+            val parent =
+                ComposeView(activity).apply {
+                    layoutParams =
+                        ViewGroup.LayoutParams(
+                            ViewGroup.LayoutParams.MATCH_PARENT,
+                            ViewGroup.LayoutParams.MATCH_PARENT
+                        )
+                    setContent {
+                        Box(Modifier.fillMaxSize()) {
+                            Box(
+                                Modifier.fillMaxSize().pointerInput(Unit) {
+                                    awaitPointerEventScope {
+                                        while (true) {
+                                            val event = awaitPointerEvent()
+                                            siblingEvents += event.type
+                                        }
                                     }
                                 }
-                            }
-                        )
-                        AndroidView(
-                            { child },
-                            Modifier.spyGestureFilter { eventStringLog.add(it.name) }
-                        )
+                            )
+                            AndroidView(
+                                { child },
+                                Modifier.spyGestureFilter { eventStringLog.add(it.name) }
+                            )
+                        }
                     }
                 }
-            }
 
             captureRequestDisallow = CaptureRequestDisallow(activity)
             captureRequestDisallow.addView(parent)
@@ -115,9 +116,7 @@
                 root
             )
 
-        rule.runOnIdle {
-            root.dispatchTouchEvent(down)
-        }
+        rule.runOnIdle { root.dispatchTouchEvent(down) }
 
         assertThat(motionEventLog).hasSize(1)
         assertThat(motionEventLog[0]).isSameInstanceAs(down)
@@ -463,9 +462,7 @@
     @Test
     fun disallowNotTriggeredWhenMovementInClickChild() {
         var clicked = false
-        rule.runOnUiThread {
-            child.setOnClickListener { clicked = true }
-        }
+        rule.runOnUiThread { child.setOnClickListener { clicked = true } }
         rule.runOnIdle {
             val outOfView = Offset(-50f, -50f)
             root.dispatchTouchEvent(down())
@@ -480,9 +477,7 @@
     @Test
     fun disallowTriggeredWhenMovementInClickChildAfterRequestDisallow() {
         var clicked = false
-        rule.runOnUiThread {
-            child.setOnClickListener { clicked = true }
-        }
+        rule.runOnUiThread { child.setOnClickListener { clicked = true } }
 
         rule.runOnIdle {
             val outOfView = Offset(-50f, -50f)
@@ -510,12 +505,13 @@
 
         rule.runOnIdle {
             assertThat(siblingEvents).hasSize(4)
-            assertThat(siblingEvents).containsExactly(
-                PointerEventType.Press,
-                PointerEventType.Move,
-                PointerEventType.Move,
-                PointerEventType.Release
-            )
+            assertThat(siblingEvents)
+                .containsExactly(
+                    PointerEventType.Press,
+                    PointerEventType.Move,
+                    PointerEventType.Move,
+                    PointerEventType.Release
+                )
         }
     }
 
@@ -553,8 +549,8 @@
         )
 }
 
-private class CustomView2(context: Context, val callBack: (MotionEvent?) -> Unit) : ViewGroup
-(context) {
+private class CustomView2(context: Context, val callBack: (MotionEvent?) -> Unit) :
+    ViewGroup(context) {
     var retVal = true
 
     override fun onTouchEvent(event: MotionEvent?): Boolean {
@@ -567,6 +563,7 @@
 
 private class CaptureRequestDisallow(context: Context) : FrameLayout(context) {
     var disallowIntercept = false
+
     override fun requestDisallowInterceptTouchEvent(disallowIntercept: Boolean) {
         this.disallowIntercept = disallowIntercept
         super.requestDisallowInterceptTouchEvent(disallowIntercept)
diff --git a/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/input/pointer/PointerInteropFilterAndroidViewOffsetsTest.kt b/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/input/pointer/PointerInteropFilterAndroidViewOffsetsTest.kt
index e18277c..01fa829 100644
--- a/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/input/pointer/PointerInteropFilterAndroidViewOffsetsTest.kt
+++ b/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/input/pointer/PointerInteropFilterAndroidViewOffsetsTest.kt
@@ -53,8 +53,7 @@
     private lateinit var five: View
     private val theHitListener: () -> Unit = mock()
 
-    @get:Rule
-    val rule = createAndroidComposeRule<TestActivity>()
+    @get:Rule val rule = createAndroidComposeRule<TestActivity>()
 
     @Before
     fun setup() {
@@ -69,46 +68,56 @@
             // With all of the padding, "one" is at 10 x 50 relative to "five" and the tests
             // dispatch MotionEvents to "five".
 
-            val one = CustomView(activity).apply {
-                layoutParams = ViewGroup.LayoutParams(1, 1)
-                hitListener = theHitListener
-            }
+            val one =
+                CustomView(activity).apply {
+                    layoutParams = ViewGroup.LayoutParams(1, 1)
+                    hitListener = theHitListener
+                }
 
-            val two = FrameLayout(activity).apply {
-                layoutParams = ViewGroup.LayoutParams(
-                    ViewGroup.LayoutParams.MATCH_PARENT,
-                    ViewGroup.LayoutParams.MATCH_PARENT
-                )
-                setPadding(1, 11, 0, 0)
-                addView(one)
-            }
+            val two =
+                FrameLayout(activity).apply {
+                    layoutParams =
+                        ViewGroup.LayoutParams(
+                            ViewGroup.LayoutParams.MATCH_PARENT,
+                            ViewGroup.LayoutParams.MATCH_PARENT
+                        )
+                    setPadding(1, 11, 0, 0)
+                    addView(one)
+                }
 
-            val four = ComposeView(activity).apply {
-                layoutParams = ViewGroup.LayoutParams(
-                    ViewGroup.LayoutParams.MATCH_PARENT,
-                    ViewGroup.LayoutParams.MATCH_PARENT
-                )
-                setPadding(3, 13, 0, 0)
-                setContent {
-                    with(LocalDensity.current) {
-                        // Box is "three"
-                        Box(
-                            Modifier.padding(start = (2f / density).dp, top = (12f / density).dp)
-                        ) {
-                            AndroidView({ two })
+            val four =
+                ComposeView(activity).apply {
+                    layoutParams =
+                        ViewGroup.LayoutParams(
+                            ViewGroup.LayoutParams.MATCH_PARENT,
+                            ViewGroup.LayoutParams.MATCH_PARENT
+                        )
+                    setPadding(3, 13, 0, 0)
+                    setContent {
+                        with(LocalDensity.current) {
+                            // Box is "three"
+                            Box(
+                                Modifier.padding(
+                                    start = (2f / density).dp,
+                                    top = (12f / density).dp
+                                )
+                            ) {
+                                AndroidView({ two })
+                            }
                         }
                     }
                 }
-            }
 
-            five = FrameLayout(activity).apply {
-                layoutParams = ViewGroup.LayoutParams(
-                    ViewGroup.LayoutParams.MATCH_PARENT,
-                    ViewGroup.LayoutParams.MATCH_PARENT
-                )
-                setPadding(4, 14, 0, 0)
-                addView(four)
-            }
+            five =
+                FrameLayout(activity).apply {
+                    layoutParams =
+                        ViewGroup.LayoutParams(
+                            ViewGroup.LayoutParams.MATCH_PARENT,
+                            ViewGroup.LayoutParams.MATCH_PARENT
+                        )
+                    setPadding(4, 14, 0, 0)
+                    addView(four)
+                }
 
             activity.setContentView(five)
         }
diff --git a/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/input/pointer/PointerInteropFilterComposeHookupTest.kt b/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/input/pointer/PointerInteropFilterComposeHookupTest.kt
index 5b0ba1e..663a389 100644
--- a/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/input/pointer/PointerInteropFilterComposeHookupTest.kt
+++ b/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/input/pointer/PointerInteropFilterComposeHookupTest.kt
@@ -56,30 +56,27 @@
     }
     private val disallowInterceptRequester = RequestDisallowInterceptTouchEvent()
 
-    @get:Rule
-    val rule = createAndroidComposeRule<TestActivity>()
+    @get:Rule val rule = createAndroidComposeRule<TestActivity>()
 
     @Before
     fun setup() {
         rule.activityRule.scenario.onActivity { activity ->
-
-            val parent = ComposeView(activity).apply {
-                setContent {
-                    with(LocalDensity.current) {
-                        Box(
-                            modifier = Modifier
-                                .spyGestureFilter {
-                                    eventStringLog.add(it.name)
-                                }
-                                .pointerInteropFilter(
-                                    disallowInterceptRequester,
-                                    motionEventCallback
-                                )
-                                .requiredSize(100f.toDp(), 100f.toDp())
-                        )
+            val parent =
+                ComposeView(activity).apply {
+                    setContent {
+                        with(LocalDensity.current) {
+                            Box(
+                                modifier =
+                                    Modifier.spyGestureFilter { eventStringLog.add(it.name) }
+                                        .pointerInteropFilter(
+                                            disallowInterceptRequester,
+                                            motionEventCallback
+                                        )
+                                        .requiredSize(100f.toDp(), 100f.toDp())
+                            )
+                        }
                     }
                 }
-            }
 
             activity.setContentView(
                 parent,
@@ -105,9 +102,7 @@
                 root
             )
 
-        rule.runOnIdle {
-            root.dispatchTouchEvent(down)
-        }
+        rule.runOnIdle { root.dispatchTouchEvent(down) }
 
         assertThat(motionEventLog).hasSize(1)
         assertThat(motionEventLog[0]).isSameInstanceAs(down)
diff --git a/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/input/pointer/PointerInteropFilterTest.kt b/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/input/pointer/PointerInteropFilterTest.kt
index f761c28..a1e6131 100644
--- a/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/input/pointer/PointerInteropFilterTest.kt
+++ b/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/input/pointer/PointerInteropFilterTest.kt
@@ -51,8 +51,7 @@
 @RunWith(AndroidJUnit4::class)
 @OptIn(ExperimentalComposeUiApi::class)
 class PointerInteropFilterTest {
-    @get:Rule
-    val rule = createAndroidComposeRule<TestActivity>()
+    @get:Rule val rule = createAndroidComposeRule<TestActivity>()
 
     private lateinit var pointerInteropFilter: PointerInteropFilter
     private val dispatchedMotionEvents = mutableListOf<MotionEvent>()
@@ -163,14 +162,8 @@
                 ACTION_POINTER_DOWN,
                 2,
                 1,
-                arrayOf(
-                    PointerProperties(0),
-                    PointerProperties(1)
-                ),
-                arrayOf(
-                    PointerCoords(3f, 4f),
-                    PointerCoords(10f, 11f)
-                )
+                arrayOf(PointerProperties(0), PointerProperties(1)),
+                arrayOf(PointerCoords(3f, 4f), PointerCoords(10f, 11f))
             )
 
         pointerInteropFilter.pointerInputFilter::onPointerEvent.invokeOverAllPasses(
@@ -214,14 +207,8 @@
                 ACTION_POINTER_DOWN,
                 2,
                 0,
-                arrayOf(
-                    PointerProperties(1),
-                    PointerProperties(0)
-                ),
-                arrayOf(
-                    PointerCoords(10f, 11f),
-                    PointerCoords(3f, 4f)
-                )
+                arrayOf(PointerProperties(1), PointerProperties(0)),
+                arrayOf(PointerCoords(10f, 11f), PointerCoords(3f, 4f))
             )
         pointerInteropFilter.pointerInputFilter::onPointerEvent.invokeOverAllPasses(
             pointerEventOf(aDown, motionEvent = downMotionEvent)
@@ -263,14 +250,8 @@
                 ACTION_POINTER_DOWN,
                 2,
                 1,
-                arrayOf(
-                    PointerProperties(0),
-                    PointerProperties(1)
-                ),
-                arrayOf(
-                    PointerCoords(3f, 4f),
-                    PointerCoords(10f, 11f)
-                )
+                arrayOf(PointerProperties(0), PointerProperties(1)),
+                arrayOf(PointerCoords(3f, 4f), PointerCoords(10f, 11f))
             )
 
         val aMove2 = aMove1.moveTo(13, 3f, 4f)
@@ -282,14 +263,8 @@
                 ACTION_POINTER_UP,
                 2,
                 1,
-                arrayOf(
-                    PointerProperties(0),
-                    PointerProperties(1)
-                ),
-                arrayOf(
-                    PointerCoords(3f, 4f),
-                    PointerCoords(10f, 11f)
-                )
+                arrayOf(PointerProperties(0), PointerProperties(1)),
+                arrayOf(PointerCoords(3f, 4f), PointerCoords(10f, 11f))
             )
 
         pointerInteropFilter.pointerInputFilter::onPointerEvent.invokeOverAllPasses(
@@ -335,14 +310,8 @@
                 ACTION_POINTER_DOWN,
                 2,
                 1,
-                arrayOf(
-                    PointerProperties(0),
-                    PointerProperties(1)
-                ),
-                arrayOf(
-                    PointerCoords(3f, 4f),
-                    PointerCoords(10f, 11f)
-                )
+                arrayOf(PointerProperties(0), PointerProperties(1)),
+                arrayOf(PointerCoords(3f, 4f), PointerCoords(10f, 11f))
             )
 
         val aMove2 = aMove1.moveTo(13, 3f, 4f)
@@ -353,14 +322,8 @@
                 ACTION_POINTER_UP,
                 2,
                 0,
-                arrayOf(
-                    PointerProperties(0),
-                    PointerProperties(1)
-                ),
-                arrayOf(
-                    PointerCoords(10f, 11f),
-                    PointerCoords(3f, 4f)
-                )
+                arrayOf(PointerProperties(0), PointerProperties(1)),
+                arrayOf(PointerCoords(10f, 11f), PointerCoords(3f, 4f))
             )
 
         pointerInteropFilter.pointerInputFilter::onPointerEvent.invokeOverAllPasses(
@@ -440,14 +403,8 @@
                 ACTION_POINTER_DOWN,
                 2,
                 0,
-                arrayOf(
-                    PointerProperties(0),
-                    PointerProperties(1)
-                ),
-                arrayOf(
-                    PointerCoords(13f, 14f),
-                    PointerCoords(3f, 4f)
-                )
+                arrayOf(PointerProperties(0), PointerProperties(1)),
+                arrayOf(PointerCoords(13f, 14f), PointerCoords(3f, 4f))
             )
 
         val aMove2 = aMove1.moveTo(15, 8f, 9f)
@@ -459,14 +416,8 @@
                 ACTION_MOVE,
                 2,
                 0,
-                arrayOf(
-                    PointerProperties(0),
-                    PointerProperties(1)
-                ),
-                arrayOf(
-                    PointerCoords(8f, 9f),
-                    PointerCoords(18f, 19f)
-                )
+                arrayOf(PointerProperties(0), PointerProperties(1)),
+                arrayOf(PointerCoords(8f, 9f), PointerCoords(18f, 19f))
             )
 
         pointerInteropFilter.pointerInputFilter::onPointerEvent.invokeOverAllPasses(
@@ -513,14 +464,8 @@
                 ACTION_POINTER_DOWN,
                 2,
                 0,
-                arrayOf(
-                    PointerProperties(0),
-                    PointerProperties(1)
-                ),
-                arrayOf(
-                    PointerCoords(13f, 14f),
-                    PointerCoords(3f, 4f)
-                )
+                arrayOf(PointerProperties(0), PointerProperties(1)),
+                arrayOf(PointerCoords(13f, 14f), PointerCoords(3f, 4f))
             )
 
         val aMove2 = aMove1.moveTo(15, 8f, 9f)
@@ -531,14 +476,8 @@
                 ACTION_MOVE,
                 2,
                 0,
-                arrayOf(
-                    PointerProperties(0),
-                    PointerProperties(1)
-                ),
-                arrayOf(
-                    PointerCoords(18f, 19f),
-                    PointerCoords(8f, 9f)
-                )
+                arrayOf(PointerProperties(0), PointerProperties(1)),
+                arrayOf(PointerCoords(18f, 19f), PointerCoords(8f, 9f))
             )
 
         pointerInteropFilter.pointerInputFilter::onPointerEvent.invokeOverAllPasses(
@@ -621,14 +560,8 @@
                 ACTION_CANCEL,
                 2,
                 0,
-                arrayOf(
-                    PointerProperties(0),
-                    PointerProperties(1)
-                ),
-                arrayOf(
-                    PointerCoords(3f, 4f),
-                    PointerCoords(10f, 11f)
-                )
+                arrayOf(PointerProperties(0), PointerProperties(1)),
+                arrayOf(PointerCoords(3f, 4f), PointerCoords(10f, 11f))
             )
 
         pointerInteropFilter.pointerInputFilter::onPointerEvent.invokeOverAllPasses(
@@ -671,14 +604,8 @@
                 ACTION_POINTER_DOWN,
                 2,
                 1,
-                arrayOf(
-                    PointerProperties(0),
-                    PointerProperties(1)
-                ),
-                arrayOf(
-                    PointerCoords(3f, 4f),
-                    PointerCoords(10f, 11f)
-                )
+                arrayOf(PointerProperties(0), PointerProperties(1)),
+                arrayOf(PointerCoords(3f, 4f), PointerCoords(10f, 11f))
             )
 
         val aMove2 = aMove1.moveTo(13, 3f, 4f)
@@ -689,14 +616,8 @@
                 ACTION_CANCEL,
                 2,
                 0,
-                arrayOf(
-                    PointerProperties(0),
-                    PointerProperties(1)
-                ),
-                arrayOf(
-                    PointerCoords(3f, 4f),
-                    PointerCoords(10f, 11f)
-                )
+                arrayOf(PointerProperties(0), PointerProperties(1)),
+                arrayOf(PointerCoords(3f, 4f), PointerCoords(10f, 11f))
             )
 
         pointerInteropFilter.pointerInputFilter::onPointerEvent.invokeOverAllPasses(
@@ -731,9 +652,7 @@
                 arrayOf(PointerProperties(0)),
                 arrayOf(PointerCoords(3f, 4f))
             )
-        val moveConsumed =
-            down.moveTo(7, 8f, 9f)
-                .apply { consume() }
+        val moveConsumed = down.moveTo(7, 8f, 9f).apply { consume() }
         val expected =
             MotionEvent(
                 7,
@@ -779,19 +698,12 @@
                 ACTION_POINTER_DOWN,
                 2,
                 1,
-                arrayOf(
-                    PointerProperties(0),
-                    PointerProperties(1)
-                ),
-                arrayOf(
-                    PointerCoords(3f, 4f),
-                    PointerCoords(13f, 14f)
-                )
+                arrayOf(PointerProperties(0), PointerProperties(1)),
+                arrayOf(PointerCoords(3f, 4f), PointerCoords(13f, 14f))
             )
 
         val aMove2 = aMove1.moveTo(15, 8f, 9f)
-        val bMoveConsumed =
-            bDown.moveTo(15, 18f, 19f).apply { consume() }
+        val bMoveConsumed = bDown.moveTo(15, 18f, 19f).apply { consume() }
 
         val expected =
             MotionEvent(
@@ -799,14 +711,8 @@
                 ACTION_CANCEL,
                 2,
                 0,
-                arrayOf(
-                    PointerProperties(0),
-                    PointerProperties(1)
-                ),
-                arrayOf(
-                    PointerCoords(8f, 9f),
-                    PointerCoords(18f, 19f)
-                )
+                arrayOf(PointerProperties(0), PointerProperties(1)),
+                arrayOf(PointerCoords(8f, 9f), PointerCoords(18f, 19f))
             )
 
         pointerInteropFilter.pointerInputFilter::onPointerEvent.invokeOverAllPasses(
@@ -1042,8 +948,7 @@
                 arrayOf(PointerCoords(3f, 4f))
             )
 
-        val move1Consumed =
-            down.moveTo(5, 6f, 7f).apply { consume() }
+        val move1Consumed = down.moveTo(5, 6f, 7f).apply { consume() }
         val motionEvent2 =
             MotionEvent(
                 5,
@@ -1195,12 +1100,8 @@
                 ACTION_UP,
                 1,
                 0,
-                arrayOf(
-                    PointerProperties(0)
-                ),
-                arrayOf(
-                    PointerCoords(3f, 4f)
-                )
+                arrayOf(PointerProperties(0)),
+                arrayOf(PointerCoords(3f, 4f))
             )
 
         val bDown = down(11, 12, 13f, 14f)
@@ -1210,12 +1111,8 @@
                 ACTION_DOWN,
                 1,
                 0,
-                arrayOf(
-                    PointerProperties(0)
-                ),
-                arrayOf(
-                    PointerCoords(13f, 14f)
-                )
+                arrayOf(PointerProperties(0)),
+                arrayOf(PointerCoords(13f, 14f))
             )
 
         pointerInteropFilter.pointerInputFilter::onPointerEvent.invokeOverAllPasses(
@@ -1908,12 +1805,8 @@
                 ACTION_DOWN,
                 1,
                 0,
-                arrayOf(
-                    PointerProperties(0)
-                ),
-                arrayOf(
-                    PointerCoords(13f, 14f)
-                )
+                arrayOf(PointerProperties(0)),
+                arrayOf(PointerCoords(13f, 14f))
             )
 
         pointerInteropFilter.pointerInputFilter::onPointerEvent.invokeOverAllPasses(
@@ -2445,14 +2338,8 @@
                 ACTION_POINTER_DOWN,
                 2,
                 1,
-                arrayOf(
-                    PointerProperties(0),
-                    PointerProperties(1)
-                ),
-                arrayOf(
-                    PointerCoords(3f, 4f),
-                    PointerCoords(13f, 14f)
-                )
+                arrayOf(PointerProperties(0), PointerProperties(1)),
+                arrayOf(PointerCoords(3f, 4f), PointerCoords(13f, 14f))
             )
 
         val aMove2 = aMove1.moveBy(15, 8f, 9f)
@@ -2463,14 +2350,8 @@
                 ACTION_MOVE,
                 2,
                 1,
-                arrayOf(
-                    PointerProperties(0),
-                    PointerProperties(1)
-                ),
-                arrayOf(
-                    PointerCoords(8f, 9f),
-                    PointerCoords(18f, 19f)
-                )
+                arrayOf(PointerProperties(0), PointerProperties(1)),
+                arrayOf(PointerCoords(8f, 9f), PointerCoords(18f, 19f))
             )
 
         retVal = true
@@ -2519,14 +2400,8 @@
                 ACTION_POINTER_DOWN,
                 2,
                 1,
-                arrayOf(
-                    PointerProperties(0),
-                    PointerProperties(1)
-                ),
-                arrayOf(
-                    PointerCoords(3f, 4f),
-                    PointerCoords(13f, 14f)
-                )
+                arrayOf(PointerProperties(0), PointerProperties(1)),
+                arrayOf(PointerCoords(3f, 4f), PointerCoords(13f, 14f))
             )
 
         val aMove2 = aMove1.moveBy(15, 8f, 9f)
@@ -2537,14 +2412,8 @@
                 ACTION_MOVE,
                 2,
                 1,
-                arrayOf(
-                    PointerProperties(0),
-                    PointerProperties(1)
-                ),
-                arrayOf(
-                    PointerCoords(8f, 9f),
-                    PointerCoords(18f, 19f)
-                )
+                arrayOf(PointerProperties(0), PointerProperties(1)),
+                arrayOf(PointerCoords(8f, 9f), PointerCoords(18f, 19f))
             )
 
         retVal = true
@@ -2626,12 +2495,8 @@
                 ACTION_UP,
                 1,
                 0,
-                arrayOf(
-                    PointerProperties(0)
-                ),
-                arrayOf(
-                    PointerCoords(3f, 4f)
-                )
+                arrayOf(PointerProperties(0)),
+                arrayOf(PointerCoords(3f, 4f))
             )
         retVal = true
 
@@ -2755,36 +2620,22 @@
                 ACTION_POINTER_DOWN,
                 2,
                 1,
-                arrayOf(
-                    PointerProperties(0),
-                    PointerProperties(1)
-                ),
-                arrayOf(
-                    PointerCoords(3f, 4f),
-                    PointerCoords(13f, 14f)
-                )
+                arrayOf(PointerProperties(0), PointerProperties(1)),
+                arrayOf(PointerCoords(3f, 4f), PointerCoords(13f, 14f))
             )
 
         val aMove2 = aMove1.moveTo(15, 8f, 9f)
         val xMove = 18f
         val yMove = 19f
-        val bMoveConsumed =
-            bDown.moveTo(15, xMove, yMove)
-                .apply { consume() }
+        val bMoveConsumed = bDown.moveTo(15, xMove, yMove).apply { consume() }
         val motionEvent3 =
             MotionEvent(
                 7,
                 ACTION_MOVE,
                 2,
                 1,
-                arrayOf(
-                    PointerProperties(0),
-                    PointerProperties(1)
-                ),
-                arrayOf(
-                    PointerCoords(8f, 9f),
-                    PointerCoords(18f, 19f)
-                )
+                arrayOf(PointerProperties(0), PointerProperties(1)),
+                arrayOf(PointerCoords(8f, 9f), PointerCoords(18f, 19f))
             )
 
         pointerInteropFilter.pointerInputFilter::onPointerEvent.invokeOverAllPasses(
@@ -2880,12 +2731,8 @@
                 ACTION_UP,
                 1,
                 0,
-                arrayOf(
-                    PointerProperties(0)
-                ),
-                arrayOf(
-                    PointerCoords(3f, 4f)
-                )
+                arrayOf(PointerProperties(0)),
+                arrayOf(PointerCoords(3f, 4f))
             )
         val bDown = down(11, 12, 13f, 14f)
         val motionEvent3 =
@@ -3719,14 +3566,8 @@
                 ACTION_CANCEL,
                 2,
                 0,
-                arrayOf(
-                    PointerProperties(0),
-                    PointerProperties(1)
-                ),
-                arrayOf(
-                    PointerCoords(3f, 4f),
-                    PointerCoords(10f, 11f)
-                )
+                arrayOf(PointerProperties(0), PointerProperties(1)),
+                arrayOf(PointerCoords(3f, 4f), PointerCoords(10f, 11f))
             )
 
         pointerInteropFilter.pointerInputFilter::onPointerEvent.invokeOverAllPasses(
@@ -3816,9 +3657,7 @@
                 arrayOf(PointerProperties(0)),
                 arrayOf(PointerCoords(3f, 4f))
             )
-        val moveConsumed =
-            down.moveTo(7, 8f, 9f)
-                .apply { consume() }
+        val moveConsumed = down.moveTo(7, 8f, 9f).apply { consume() }
         val motionEvent2 =
             MotionEvent(
                 7,
@@ -3877,8 +3716,7 @@
             )
 
         val aMove2 = aMove1.moveTo(15, 8f, 9f)
-        val bMoveConsumed =
-            bDown.moveTo(15, 18f, 19f).apply { consume() }
+        val bMoveConsumed = bDown.moveTo(15, 18f, 19f).apply { consume() }
         val motionEvent3 =
             MotionEvent(
                 7,
@@ -4335,26 +4173,32 @@
     fun testInspectorValue() {
         val onTouchEvent: (MotionEvent) -> Boolean = { true }
         rule.setContent {
-            val modifier = Modifier.pointerInteropFilter(disallowInterceptRequester, onTouchEvent)
-                as InspectableValue
+            val modifier =
+                Modifier.pointerInteropFilter(disallowInterceptRequester, onTouchEvent)
+                    as InspectableValue
             assertThat(modifier.nameFallback).isEqualTo("pointerInteropFilter")
             assertThat(modifier.valueOverride).isNull()
-            assertThat(modifier.inspectableElements.asIterable()).containsExactly(
-                ValueElement("requestDisallowInterceptTouchEvent", disallowInterceptRequester),
-                ValueElement("onTouchEvent", onTouchEvent)
-            )
+            assertThat(modifier.inspectableElements.asIterable())
+                .containsExactly(
+                    ValueElement("requestDisallowInterceptTouchEvent", disallowInterceptRequester),
+                    ValueElement("onTouchEvent", onTouchEvent)
+                )
         }
     }
 
     private class MockCoordinates : LayoutCoordinates {
         override val size: IntSize
             get() = IntSize.Zero
+
         override val providedAlignmentLines: Set<AlignmentLine>
             get() = emptySet()
+
         override val parentLayoutCoordinates: LayoutCoordinates?
             get() = null
+
         override val parentCoordinates: LayoutCoordinates?
             get() = null
+
         override val isAttached: Boolean
             get() = true
 
@@ -4363,6 +4207,7 @@
         override fun localToWindow(relativeToLocal: Offset): Offset = Offset.Zero
 
         override fun localToRoot(relativeToLocal: Offset): Offset = Offset.Zero
+
         override fun localPositionOf(
             sourceCoordinates: LayoutCoordinates,
             relativeToSource: Offset
@@ -4387,21 +4232,22 @@
     pointerProperties: Array<MotionEvent.PointerProperties>,
     pointerCoords: Array<MotionEvent.PointerCoords>,
     downTime: Long = 0
-) = MotionEvent.obtain(
-    downTime,
-    eventTime.toLong(),
-    action + (actionIndex shl MotionEvent.ACTION_POINTER_INDEX_SHIFT),
-    numPointers,
-    pointerProperties,
-    pointerCoords,
-    0,
-    0,
-    0f,
-    0f,
-    0,
-    0,
-    0,
-    0
-)
+) =
+    MotionEvent.obtain(
+        downTime,
+        eventTime.toLong(),
+        action + (actionIndex shl MotionEvent.ACTION_POINTER_INDEX_SHIFT),
+        numPointers,
+        pointerProperties,
+        pointerCoords,
+        0,
+        0,
+        0f,
+        0f,
+        0,
+        0,
+        0,
+        0
+    )
 
 internal typealias PointerEventHandler = (PointerEvent, PointerEventPass, IntSize) -> Unit
diff --git a/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/input/pointer/PointerInteropUtilsTest.kt b/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/input/pointer/PointerInteropUtilsTest.kt
index e8fab4b..a014503 100644
--- a/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/input/pointer/PointerInteropUtilsTest.kt
+++ b/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/input/pointer/PointerInteropUtilsTest.kt
@@ -36,10 +36,7 @@
 
     @Test(expected = IllegalArgumentException::class)
     fun toMotionEventScope_noPlatformEvent_throws() {
-        val pointerEvent = PointerEvent(
-            listOf(),
-            internalPointerEvent = null
-        )
+        val pointerEvent = PointerEvent(listOf(), internalPointerEvent = null)
         pointerEvent.toMotionEventScope(Offset.Zero) {}
     }
 
@@ -54,22 +51,10 @@
                 arrayOf(PointerProperties(1)),
                 arrayOf(PointerCoords(3f, 4f))
             )
-        val pointerEvent = PointerEvent(
-            listOf(
-                down(
-                    1,
-                    2,
-                    3f,
-                    4f
-                )
-            ),
-            expected
-        )
+        val pointerEvent = PointerEvent(listOf(down(1, 2, 3f, 4f)), expected)
 
         lateinit var actual: MotionEvent
-        pointerEvent.toMotionEventScope(Offset.Zero) {
-            actual = it
-        }
+        pointerEvent.toMotionEventScope(Offset.Zero) { actual = it }
 
         assertThat(actual).isSameInstanceAs(expected)
     }
@@ -85,15 +70,10 @@
                 arrayOf(PointerProperties(1)),
                 arrayOf(PointerCoords(3f, 4f))
             )
-        val pointerEvent = PointerEvent(
-            listOf(down(1, 2, 3f, 4f).up(5)),
-            expected
-        )
+        val pointerEvent = PointerEvent(listOf(down(1, 2, 3f, 4f).up(5)), expected)
 
         lateinit var actual: MotionEvent
-        pointerEvent.toMotionEventScope(Offset.Zero) {
-            actual = it
-        }
+        pointerEvent.toMotionEventScope(Offset.Zero) { actual = it }
 
         assertThat(actual).isSameInstanceAs(expected)
     }
@@ -111,18 +91,10 @@
                 arrayOf(PointerProperties(1), PointerProperties(8)),
                 arrayOf(PointerCoords(3f, 4f), PointerCoords(10f, 11f))
             )
-        val pointerEvent = PointerEvent(
-            listOf(
-                pointer1,
-                pointer2
-            ),
-            expected
-        )
+        val pointerEvent = PointerEvent(listOf(pointer1, pointer2), expected)
 
         lateinit var actual: MotionEvent
-        pointerEvent.toMotionEventScope(Offset.Zero) {
-            actual = it
-        }
+        pointerEvent.toMotionEventScope(Offset.Zero) { actual = it }
 
         assertThat(actual).isSameInstanceAs(expected)
     }
@@ -140,18 +112,10 @@
                 arrayOf(PointerProperties(8), PointerProperties(1)),
                 arrayOf(PointerCoords(10f, 11f), PointerCoords(3f, 4f))
             )
-        val pointerEvent = PointerEvent(
-            listOf(
-                pointer2,
-                pointer1
-            ),
-            expected
-        )
+        val pointerEvent = PointerEvent(listOf(pointer2, pointer1), expected)
 
         lateinit var actual: MotionEvent
-        pointerEvent.toMotionEventScope(Offset.Zero) {
-            actual = it
-        }
+        pointerEvent.toMotionEventScope(Offset.Zero) { actual = it }
 
         assertThat(actual).isSameInstanceAs(expected)
     }
@@ -169,18 +133,10 @@
                 arrayOf(PointerProperties(1), PointerProperties(8)),
                 arrayOf(PointerCoords(3f, 4f), PointerCoords(10f, 11f))
             )
-        val pointerEvent = PointerEvent(
-            listOf(
-                pointer1,
-                pointer2
-            ),
-            expected
-        )
+        val pointerEvent = PointerEvent(listOf(pointer1, pointer2), expected)
 
         lateinit var actual: MotionEvent
-        pointerEvent.toMotionEventScope(Offset.Zero) {
-            actual = it
-        }
+        pointerEvent.toMotionEventScope(Offset.Zero) { actual = it }
 
         assertThat(actual).isSameInstanceAs(expected)
     }
@@ -198,18 +154,10 @@
                 arrayOf(PointerProperties(8), PointerProperties(1)),
                 arrayOf(PointerCoords(10f, 11f), PointerCoords(3f, 4f))
             )
-        val pointerEvent = PointerEvent(
-            listOf(
-                pointer2,
-                pointer1
-            ),
-            expected
-        )
+        val pointerEvent = PointerEvent(listOf(pointer2, pointer1), expected)
 
         lateinit var actual: MotionEvent
-        pointerEvent.toMotionEventScope(Offset.Zero) {
-            actual = it
-        }
+        pointerEvent.toMotionEventScope(Offset.Zero) { actual = it }
 
         assertThat(actual).isSameInstanceAs(expected)
     }
@@ -226,15 +174,10 @@
                 arrayOf(PointerProperties(1)),
                 arrayOf(PointerCoords(8f, 9f))
             )
-        val pointerEvent = PointerEvent(
-            listOf(pointer1),
-            expected
-        )
+        val pointerEvent = PointerEvent(listOf(pointer1), expected)
 
         lateinit var actual: MotionEvent
-        pointerEvent.toMotionEventScope(Offset.Zero) {
-            actual = it
-        }
+        pointerEvent.toMotionEventScope(Offset.Zero) { actual = it }
 
         assertThat(actual).isSameInstanceAs(expected)
     }
@@ -252,18 +195,10 @@
                 arrayOf(PointerProperties(1), PointerProperties(11)),
                 arrayOf(PointerCoords(8f, 9f), PointerCoords(18f, 19f))
             )
-        val pointerEvent = PointerEvent(
-            listOf(
-                pointer1,
-                pointer2
-            ),
-            expected
-        )
+        val pointerEvent = PointerEvent(listOf(pointer1, pointer2), expected)
 
         lateinit var actual: MotionEvent
-        pointerEvent.toMotionEventScope(Offset.Zero) {
-            actual = it
-        }
+        pointerEvent.toMotionEventScope(Offset.Zero) { actual = it }
 
         assertThat(actual).isSameInstanceAs(expected)
     }
@@ -273,22 +208,18 @@
         val pointer1 = down(1, 2, 3f, 4f)
         val expected =
             MotionEvent(
-                2,
-                MotionEvent.ACTION_DOWN,
-                1,
-                0,
-                arrayOf(PointerProperties(1)),
-                arrayOf(PointerCoords(13f, 104f))
-            ).apply { offsetLocation(-10f, -100f) }
-        val pointerEvent = PointerEvent(
-            listOf(pointer1),
-            expected
-        )
+                    2,
+                    MotionEvent.ACTION_DOWN,
+                    1,
+                    0,
+                    arrayOf(PointerProperties(1)),
+                    arrayOf(PointerCoords(13f, 104f))
+                )
+                .apply { offsetLocation(-10f, -100f) }
+        val pointerEvent = PointerEvent(listOf(pointer1), expected)
 
         lateinit var actual: MotionEvent
-        pointerEvent.toMotionEventScope(Offset(10f, 100f)) {
-            actual = it
-        }
+        pointerEvent.toMotionEventScope(Offset(10f, 100f)) { actual = it }
 
         assertThat(actual).isSameInstanceAs(expected)
     }
@@ -299,35 +230,25 @@
         val pointer2 = down(8, 7, 10f, 11f)
         val expected =
             MotionEvent(
-                7,
-                MotionEvent.ACTION_POINTER_DOWN,
-                2,
-                0,
-                arrayOf(PointerProperties(8), PointerProperties(1)),
-                arrayOf(PointerCoords(110f, 1011f), PointerCoords(103f, 1004f))
-            ).apply { offsetLocation(-100f, -1000f) }
-        val pointerEvent = PointerEvent(
-            listOf(
-                pointer2,
-                pointer1
-            ),
-            expected
-        )
+                    7,
+                    MotionEvent.ACTION_POINTER_DOWN,
+                    2,
+                    0,
+                    arrayOf(PointerProperties(8), PointerProperties(1)),
+                    arrayOf(PointerCoords(110f, 1011f), PointerCoords(103f, 1004f))
+                )
+                .apply { offsetLocation(-100f, -1000f) }
+        val pointerEvent = PointerEvent(listOf(pointer2, pointer1), expected)
 
         lateinit var actual: MotionEvent
-        pointerEvent.toMotionEventScope(Offset(100f, 1000f)) {
-            actual = it
-        }
+        pointerEvent.toMotionEventScope(Offset(100f, 1000f)) { actual = it }
 
         assertThat(actual).isSameInstanceAs(expected)
     }
 
     @Test(expected = IllegalArgumentException::class)
     fun toCancelMotionEventScope_noPlatformEvent_throws() {
-        val pointerEvent = PointerEvent(
-            listOf(),
-            internalPointerEvent = null
-        )
+        val pointerEvent = PointerEvent(listOf(), internalPointerEvent = null)
         pointerEvent.toCancelMotionEventScope(Offset.Zero) {}
     }
 
@@ -343,15 +264,10 @@
                 arrayOf(PointerProperties(1)),
                 arrayOf(PointerCoords(8f, 9f))
             )
-        val pointerEvent = PointerEvent(
-            listOf(pointer1),
-            expected
-        )
+        val pointerEvent = PointerEvent(listOf(pointer1), expected)
 
         lateinit var actual: MotionEvent
-        pointerEvent.toCancelMotionEventScope(Offset.Zero) {
-            actual = it
-        }
+        pointerEvent.toCancelMotionEventScope(Offset.Zero) { actual = it }
 
         assertThat(actual).isSameInstanceAs(expected)
     }
@@ -369,18 +285,10 @@
                 arrayOf(PointerProperties(1), PointerProperties(11)),
                 arrayOf(PointerCoords(8f, 9f), PointerCoords(18f, 19f))
             )
-        val pointerEvent = PointerEvent(
-            listOf(
-                pointer1,
-                pointer2
-            ),
-            expected
-        )
+        val pointerEvent = PointerEvent(listOf(pointer1, pointer2), expected)
 
         lateinit var actual: MotionEvent
-        pointerEvent.toCancelMotionEventScope(Offset.Zero) {
-            actual = it
-        }
+        pointerEvent.toCancelMotionEventScope(Offset.Zero) { actual = it }
 
         assertThat(actual).isSameInstanceAs(expected)
     }
@@ -398,18 +306,10 @@
                 arrayOf(PointerProperties(11), PointerProperties(1)),
                 arrayOf(PointerCoords(18f, 19f), PointerCoords(8f, 9f))
             )
-        val pointerEvent = PointerEvent(
-            listOf(
-                pointer2,
-                pointer1
-            ),
-            expected
-        )
+        val pointerEvent = PointerEvent(listOf(pointer2, pointer1), expected)
 
         lateinit var actual: MotionEvent
-        pointerEvent.toCancelMotionEventScope(Offset.Zero) {
-            actual = it
-        }
+        pointerEvent.toCancelMotionEventScope(Offset.Zero) { actual = it }
 
         assertThat(actual).isSameInstanceAs(expected)
     }
@@ -419,22 +319,18 @@
         val pointer1 = down(1, 2, 3f, 4f)
         val expected =
             MotionEvent(
-                2,
-                MotionEvent.ACTION_CANCEL,
-                1,
-                0,
-                arrayOf(PointerProperties(1)),
-                arrayOf(PointerCoords(13f, 104f))
-            ).apply { offsetLocation(-10f, -100f) }
-        val pointerEvent = PointerEvent(
-            listOf(pointer1),
-            expected
-        )
+                    2,
+                    MotionEvent.ACTION_CANCEL,
+                    1,
+                    0,
+                    arrayOf(PointerProperties(1)),
+                    arrayOf(PointerCoords(13f, 104f))
+                )
+                .apply { offsetLocation(-10f, -100f) }
+        val pointerEvent = PointerEvent(listOf(pointer1), expected)
 
         lateinit var actual: MotionEvent
-        pointerEvent.toCancelMotionEventScope(Offset(10f, 100f)) {
-            actual = it
-        }
+        pointerEvent.toCancelMotionEventScope(Offset(10f, 100f)) { actual = it }
 
         assertThat(actual).isSameInstanceAs(expected)
     }
@@ -445,25 +341,18 @@
         val pointer2 = down(8, 7, 10f, 11f)
         val expected =
             MotionEvent(
-                7,
-                MotionEvent.ACTION_CANCEL,
-                2,
-                0,
-                arrayOf(PointerProperties(8), PointerProperties(1)),
-                arrayOf(PointerCoords(110f, 1011f), PointerCoords(103f, 1004f))
-            ).apply { offsetLocation(-100f, -1000f) }
-        val pointerEvent = PointerEvent(
-            listOf(
-                pointer2,
-                pointer1
-            ),
-            expected
-        )
+                    7,
+                    MotionEvent.ACTION_CANCEL,
+                    2,
+                    0,
+                    arrayOf(PointerProperties(8), PointerProperties(1)),
+                    arrayOf(PointerCoords(110f, 1011f), PointerCoords(103f, 1004f))
+                )
+                .apply { offsetLocation(-100f, -1000f) }
+        val pointerEvent = PointerEvent(listOf(pointer2, pointer1), expected)
 
         lateinit var actual: MotionEvent
-        pointerEvent.toCancelMotionEventScope(Offset(100f, 1000f)) {
-            actual = it
-        }
+        pointerEvent.toCancelMotionEventScope(Offset(100f, 1000f)) { actual = it }
 
         assertThat(actual).isSameInstanceAs(expected)
     }
@@ -482,9 +371,7 @@
             )
         lateinit var actual: MotionEvent
 
-        emptyCancelMotionEventScope(76) {
-            actual = it
-        }
+        emptyCancelMotionEventScope(76) { actual = it }
 
         assertEquals(actual, expected)
     }
@@ -498,22 +385,23 @@
     pointerProperties: Array<MotionEvent.PointerProperties>,
     pointerCoords: Array<MotionEvent.PointerCoords>,
     downtime: Long = 0L
-) = MotionEvent.obtain(
-    downtime,
-    eventTime,
-    action + (actionIndex shl MotionEvent.ACTION_POINTER_INDEX_SHIFT),
-    numPointers,
-    pointerProperties,
-    pointerCoords,
-    0,
-    0,
-    0f,
-    0f,
-    0,
-    0,
-    0,
-    0
-)
+) =
+    MotionEvent.obtain(
+        downtime,
+        eventTime,
+        action + (actionIndex shl MotionEvent.ACTION_POINTER_INDEX_SHIFT),
+        numPointers,
+        pointerProperties,
+        pointerCoords,
+        0,
+        0,
+        0f,
+        0f,
+        0,
+        0,
+        0,
+        0
+    )
 
 private fun assertEquals(actual: MotionEvent, expected: MotionEvent) {
     assertThat(actual.downTime).isEqualTo(expected.downTime)
@@ -531,10 +419,7 @@
     assertEqualPointerCoords(actual, expected)
 
     // Equal pointer coords relative to screen.
-    assertEqualPointerCoords(
-        actual.asOffsetToScreen(),
-        expected.asOffsetToScreen()
-    )
+    assertEqualPointerCoords(actual.asOffsetToScreen(), expected.asOffsetToScreen())
 }
 
 private fun assertEqualToolTypes(actual: MotionEvent, expected: MotionEvent) {
@@ -553,9 +438,7 @@
     }
 }
 
-/**
- * Asserts that 2 [MotionEvent]s' [PointerCoords] are the same.
- */
+/** Asserts that 2 [MotionEvent]s' [PointerCoords] are the same. */
 private fun assertEqualPointerCoords(actual: MotionEvent, expected: MotionEvent) {
     val actualPointerCoords = MotionEvent.PointerCoords()
     val expectedPointerCoords = MotionEvent.PointerCoords()
@@ -568,13 +451,11 @@
 }
 
 /**
- * Creates a new [MotionEvent] that is offset to the screen instead of the [View] it was
- * dispatched to.
+ * Creates a new [MotionEvent] that is offset to the screen instead of the [View] it was dispatched
+ * to.
  */
 private fun MotionEvent.asOffsetToScreen() =
-    MotionEvent.obtain(this).also { motionEvent ->
-        motionEvent.offsetLocation(rawX - x, rawY - y)
-    }
+    MotionEvent.obtain(this).also { motionEvent -> motionEvent.offsetLocation(rawX - x, rawY - y) }
 
 private fun PointerEvent(
     changes: List<PointerInputChange>,
diff --git a/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/input/pointer/RestrictedSizeTest.kt b/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/input/pointer/RestrictedSizeTest.kt
index 2b0c52a..33c5d26 100644
--- a/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/input/pointer/RestrictedSizeTest.kt
+++ b/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/input/pointer/RestrictedSizeTest.kt
@@ -45,160 +45,157 @@
 @MediumTest
 @RunWith(AndroidJUnit4::class)
 class RestrictedSizeTest {
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
     private val tag = "tag"
 
     @Test
-    fun pointerPositionAtMeasuredSize(): Unit = with(rule.density) {
-        var point = Offset.Zero
+    fun pointerPositionAtMeasuredSize(): Unit =
+        with(rule.density) {
+            var point = Offset.Zero
 
-        rule.setContent {
-            Box(Modifier.fillMaxSize()) {
-                Box(Modifier.requiredSize(50.dp).testTag(tag)) {
-                    Box(
-                        Modifier.requiredSize(80.dp).pointerInput(Unit) {
-                            awaitPointerEventScope {
-                                val event = awaitPointerEvent()
-                                point = event.changes[0].position
+            rule.setContent {
+                Box(Modifier.fillMaxSize()) {
+                    Box(Modifier.requiredSize(50.dp).testTag(tag)) {
+                        Box(
+                            Modifier.requiredSize(80.dp).pointerInput(Unit) {
+                                awaitPointerEventScope {
+                                    val event = awaitPointerEvent()
+                                    point = event.changes[0].position
+                                }
                             }
-                        }
-                    )
+                        )
+                    }
                 }
             }
+
+            rule.onNodeWithTag(tag).performTouchInput { click(Offset.Zero) }
+
+            assertThat(point.x).isWithin(1f).of(15.dp.toPx())
+            assertThat(point.y).isWithin(1f).of(15.dp.toPx())
         }
 
-        rule.onNodeWithTag(tag)
-            .performTouchInput {
-                click(Offset.Zero)
-            }
-
-        assertThat(point.x).isWithin(1f).of(15.dp.toPx())
-        assertThat(point.y).isWithin(1f).of(15.dp.toPx())
-    }
-
     @Test
-    fun pointerOutOfLayoutBounds(): Unit = with(rule.density) {
-        var point = Offset.Zero
-        var isOutOfBounds = true
+    fun pointerOutOfLayoutBounds(): Unit =
+        with(rule.density) {
+            var point = Offset.Zero
+            var isOutOfBounds = true
 
-        rule.setContent {
-            Box(Modifier.fillMaxSize()) {
-                Box(Modifier.requiredSize(50.dp).testTag(tag)) {
-                    Box(
-                        Modifier.requiredSize(80.dp).pointerInput(Unit) {
-                            awaitPointerEventScope {
-                                val event = awaitPointerEvent()
-                                point = event.changes[0].position
-                                isOutOfBounds =
-                                    event.changes[0].isOutOfBounds(size, extendedTouchPadding)
+            rule.setContent {
+                Box(Modifier.fillMaxSize()) {
+                    Box(Modifier.requiredSize(50.dp).testTag(tag)) {
+                        Box(
+                            Modifier.requiredSize(80.dp).pointerInput(Unit) {
+                                awaitPointerEventScope {
+                                    val event = awaitPointerEvent()
+                                    point = event.changes[0].position
+                                    isOutOfBounds =
+                                        event.changes[0].isOutOfBounds(size, extendedTouchPadding)
+                                }
                             }
-                        }
-                    )
+                        )
+                    }
                 }
             }
+
+            rule.onNodeWithTag(tag).performTouchInput { click(Offset(-5f, -2f)) }
+
+            assertThat(point.x).isWithin(1f).of(15.dp.toPx() - 5f)
+            assertThat(point.y).isWithin(1f).of(15.dp.toPx() - 2f)
+            assertThat(isOutOfBounds).isFalse()
         }
 
-        rule.onNodeWithTag(tag)
-            .performTouchInput {
-                click(Offset(-5f, -2f))
-            }
-
-        assertThat(point.x).isWithin(1f).of(15.dp.toPx() - 5f)
-        assertThat(point.y).isWithin(1f).of(15.dp.toPx() - 2f)
-        assertThat(isOutOfBounds).isFalse()
-    }
-
     @Test
-    fun semanticsSizeTooSmall(): Unit = with(rule.density) {
-        rule.setContent {
-            Box(Modifier.fillMaxSize()) {
-                Box(Modifier.requiredSize(50.dp)) {
-                    Box(
-                        Modifier.requiredSize(80.dp).testTag(tag)
-                    )
+    fun semanticsSizeTooSmall(): Unit =
+        with(rule.density) {
+            rule.setContent {
+                Box(Modifier.fillMaxSize()) {
+                    Box(Modifier.requiredSize(50.dp)) {
+                        Box(Modifier.requiredSize(80.dp).testTag(tag))
+                    }
                 }
             }
+
+            rule.onNodeWithTag(tag).assertWidthIsEqualTo(80.dp).assertHeightIsEqualTo(80.dp)
         }
 
-        rule.onNodeWithTag(tag)
-            .assertWidthIsEqualTo(80.dp)
-            .assertHeightIsEqualTo(80.dp)
-    }
-
     @Test
-    fun clippedTouchInMinimumTouchTarget(): Unit = with(rule.density) {
-        var point = Offset.Zero
-        rule.setContent {
-            Box(Modifier.fillMaxSize()) {
-                Box(Modifier.requiredSize(20.dp).clipToBounds().testTag(tag)) {
-                    Box(
-                        Modifier.requiredSize(40.dp).pointerInput(Unit) {
-                            awaitPointerEventScope {
-                                val event = awaitPointerEvent()
-                                point = event.changes[0].position
+    fun clippedTouchInMinimumTouchTarget(): Unit =
+        with(rule.density) {
+            var point = Offset.Zero
+            rule.setContent {
+                Box(Modifier.fillMaxSize()) {
+                    Box(Modifier.requiredSize(20.dp).clipToBounds().testTag(tag)) {
+                        Box(
+                            Modifier.requiredSize(40.dp).pointerInput(Unit) {
+                                awaitPointerEventScope {
+                                    val event = awaitPointerEvent()
+                                    point = event.changes[0].position
+                                }
                             }
-                        }
-                    )
+                        )
+                    }
                 }
             }
+
+            rule.onNodeWithTag(tag).performTouchInput { click(Offset(-1f, -3f)) }
+
+            val innerPos = 10.dp.roundToPx().toFloat()
+            assertThat(point.x).isWithin(1f).of(innerPos - 1f)
+            assertThat(point.y).isWithin(1f).of(innerPos - 3f)
         }
 
-        rule.onNodeWithTag(tag)
-            .performTouchInput {
-                click(Offset(-1f, -3f))
-            }
-
-        val innerPos = 10.dp.roundToPx().toFloat()
-        assertThat(point.x).isWithin(1f).of(innerPos - 1f)
-        assertThat(point.y).isWithin(1f).of(innerPos - 3f)
-    }
-
     @Test
-    fun pointerUsesDiagonalDistance() = with(rule.density) {
-        var point = Offset.Zero
+    fun pointerUsesDiagonalDistance() =
+        with(rule.density) {
+            var point = Offset.Zero
 
-        rule.setContent {
-            val viewConfiguration = LocalViewConfiguration.current
-            CompositionLocalProvider(
-                LocalViewConfiguration provides object : ViewConfiguration {
-                    override val longPressTimeoutMillis: Long
-                        get() = viewConfiguration.longPressTimeoutMillis
-                    override val doubleTapTimeoutMillis: Long
-                        get() = viewConfiguration.doubleTapTimeoutMillis
-                    override val doubleTapMinTimeMillis: Long
-                        get() = viewConfiguration.doubleTapMinTimeMillis
-                    override val touchSlop: Float
-                        get() = viewConfiguration.touchSlop
-                    override val minimumTouchTargetSize: DpSize
-                        get() = DpSize(300.dp, 300.dp)
-                }
-            ) {
-                Column(Modifier.fillMaxSize().testTag(tag)) {
-                    Box(Modifier.requiredSize(50.dp).pointerInput(Unit) {
-                        awaitPointerEventScope {
-                            val event = awaitPointerEvent()
-                            point = event.changes[0].position
+            rule.setContent {
+                val viewConfiguration = LocalViewConfiguration.current
+                CompositionLocalProvider(
+                    LocalViewConfiguration provides
+                        object : ViewConfiguration {
+                            override val longPressTimeoutMillis: Long
+                                get() = viewConfiguration.longPressTimeoutMillis
+
+                            override val doubleTapTimeoutMillis: Long
+                                get() = viewConfiguration.doubleTapTimeoutMillis
+
+                            override val doubleTapMinTimeMillis: Long
+                                get() = viewConfiguration.doubleTapMinTimeMillis
+
+                            override val touchSlop: Float
+                                get() = viewConfiguration.touchSlop
+
+                            override val minimumTouchTargetSize: DpSize
+                                get() = DpSize(300.dp, 300.dp)
                         }
-                    })
-                    Box(Modifier.requiredSize(50.dp).pointerInput(Unit) {
-                        awaitPointerEventScope {
-                            // Even though this is drawn after the first box, it should
-                            // be considered farther from the pointer position.
-                            awaitPointerEvent()
-                        }
-                    })
+                ) {
+                    Column(Modifier.fillMaxSize().testTag(tag)) {
+                        Box(
+                            Modifier.requiredSize(50.dp).pointerInput(Unit) {
+                                awaitPointerEventScope {
+                                    val event = awaitPointerEvent()
+                                    point = event.changes[0].position
+                                }
+                            }
+                        )
+                        Box(
+                            Modifier.requiredSize(50.dp).pointerInput(Unit) {
+                                awaitPointerEventScope {
+                                    // Even though this is drawn after the first box, it should
+                                    // be considered farther from the pointer position.
+                                    awaitPointerEvent()
+                                }
+                            }
+                        )
+                    }
                 }
             }
+
+            rule.onNodeWithTag(tag).performTouchInput { click(Offset(60.dp.toPx(), 45.dp.toPx())) }
+
+            assertThat(point.x).isWithin(1f).of(60.dp.toPx())
+            assertThat(point.y).isWithin(1f).of(45.dp.toPx())
         }
-
-        rule.onNodeWithTag(tag)
-            .performTouchInput {
-                click(Offset(60.dp.toPx(), 45.dp.toPx()))
-            }
-
-        assertThat(point.x).isWithin(1f).of(60.dp.toPx())
-        assertThat(point.y).isWithin(1f).of(45.dp.toPx())
-    }
 }
diff --git a/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/input/pointer/SuspendingPointerInputFilterCoroutineJobTest.kt b/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/input/pointer/SuspendingPointerInputFilterCoroutineJobTest.kt
index ddf5536..ba277d0 100644
--- a/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/input/pointer/SuspendingPointerInputFilterCoroutineJobTest.kt
+++ b/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/input/pointer/SuspendingPointerInputFilterCoroutineJobTest.kt
@@ -44,9 +44,7 @@
 @RunWith(AndroidJUnit4::class)
 @OptIn(ExperimentalCoroutinesApi::class)
 class SuspendingPointerInputFilterCoroutineJobTest {
-    @OptIn(ExperimentalTestApi::class)
-    @get:Rule
-    val rule = createComposeRule(Dispatchers.Main)
+    @OptIn(ExperimentalTestApi::class) @get:Rule val rule = createComposeRule(Dispatchers.Main)
 
     @Test
     @LargeTest
@@ -86,10 +84,11 @@
 
         rule.setContent {
             Box(
-                modifier = elementFor(
-                    key1 = Unit,
-                    instance = suspendingPointerInputModifierNode as Modifier.Node
-                )
+                modifier =
+                    elementFor(
+                        key1 = Unit,
+                        instance = suspendingPointerInputModifierNode as Modifier.Node
+                    )
             )
         }
 
diff --git a/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/input/pointer/SuspendingPointerInputFilterTest.kt b/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/input/pointer/SuspendingPointerInputFilterTest.kt
index 84b683c..092f887 100644
--- a/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/input/pointer/SuspendingPointerInputFilterTest.kt
+++ b/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/input/pointer/SuspendingPointerInputFilterTest.kt
@@ -68,8 +68,7 @@
 @RunWith(AndroidJUnit4::class)
 @OptIn(ExperimentalCoroutinesApi::class)
 class SuspendingPointerInputFilterTest {
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
     @After
     fun after() {
@@ -96,10 +95,11 @@
 
         rule.setContent {
             Box(
-                modifier = elementFor(
-                    key1 = Unit,
-                    instance = suspendingPointerInputModifierNode as Modifier.Node
-                )
+                modifier =
+                    elementFor(
+                        key1 = Unit,
+                        instance = suspendingPointerInputModifierNode as Modifier.Node
+                    )
             )
         }
 
@@ -136,19 +136,21 @@
 
         rule.setContent {
             Box(
-                modifier = elementFor(
-                    key1 = Unit,
-                    instance = suspendingPointerInputModifierNode as Modifier.Node
-                )
+                modifier =
+                    elementFor(
+                        key1 = Unit,
+                        instance = suspendingPointerInputModifierNode as Modifier.Node
+                    )
             )
         }
 
         val emitter = PointerInputChangeEmitter()
-        val expected = listOf(
-            emitter.nextChange(Offset(5f, 5f)),
-            emitter.nextChange(Offset(10f, 5f)),
-            emitter.nextChange(Offset(10f, 10f))
-        )
+        val expected =
+            listOf(
+                emitter.nextChange(Offset(5f, 5f)),
+                emitter.nextChange(Offset(10f, 5f)),
+                emitter.nextChange(Offset(10f, 10f))
+            )
 
         val bounds = IntSize(20, 20)
 
@@ -166,11 +168,8 @@
             assertTrue("Waiting for relaunch timed out", latch.await(200, TimeUnit.MILLISECONDS))
 
             runTest {
-                val received = withTimeout(200) {
-                    results.receiveAsFlow()
-                        .map { it.firstChange }
-                        .toList()
-                }
+                val received =
+                    withTimeout(200) { results.receiveAsFlow().map { it.firstChange }.toList() }
                 assertEquals(expected, received)
             }
         }
@@ -200,59 +199,63 @@
 
         rule.setContent {
             Box(
-                modifier = elementFor(
-                    key1 = Unit,
-                    instance = suspendingPointerInputModifierNode as Modifier.Node
-                )
+                modifier =
+                    elementFor(
+                        key1 = Unit,
+                        instance = suspendingPointerInputModifierNode as Modifier.Node
+                    )
             )
         }
 
         val bounds = IntSize(50, 50)
         val emitter1 = PointerInputChangeEmitter(0)
         val emitter2 = PointerInputChangeEmitter(1)
-        val expectedEvents = listOf(
-            PointerEvent(
-                listOf(
-                    emitter1.nextChange(Offset(5f, 5f)),
-                    emitter2.nextChange(Offset(10f, 10f))
-                )
-            ),
-            PointerEvent(
-                listOf(
-                    emitter1.nextChange(Offset(6f, 6f)),
-                    emitter2.nextChange(Offset(10f, 10f), down = false)
-                )
-            ),
-            // Synthetic cancel should look like this (Note: this specific event isn't ever
-            // triggered directly, it's just for reference so you know what onCancelPointerInput()
-            // triggers).
-            // Both pointers are there, but only the with the pressed = true is changed to false,
-            // and the down change is consumed.
-            PointerEvent(
-                listOf(
-                    PointerInputChange(
-                        PointerId(0),
-                        0,
-                        Offset(6f, 6f),
-                        false,
-                        0,
-                        Offset(6f, 6f),
-                        true,
-                        isInitiallyConsumed = true
-                    ),
-                    PointerInputChange(
-                        PointerId(1),
-                        0,
-                        Offset(10f, 10f),
-                        false,
-                        0,
-                        Offset(10f, 10f),
-                        false,
-                        isInitiallyConsumed = false
+        val expectedEvents =
+            listOf(
+                PointerEvent(
+                    listOf(
+                        emitter1.nextChange(Offset(5f, 5f)),
+                        emitter2.nextChange(Offset(10f, 10f))
+                    )
+                ),
+                PointerEvent(
+                    listOf(
+                        emitter1.nextChange(Offset(6f, 6f)),
+                        emitter2.nextChange(Offset(10f, 10f), down = false)
+                    )
+                ),
+                // Synthetic cancel should look like this (Note: this specific event isn't ever
+                // triggered directly, it's just for reference so you know what
+                // onCancelPointerInput()
+                // triggers).
+                // Both pointers are there, but only the with the pressed = true is changed to
+                // false,
+                // and the down change is consumed.
+                PointerEvent(
+                    listOf(
+                        PointerInputChange(
+                            PointerId(0),
+                            0,
+                            Offset(6f, 6f),
+                            false,
+                            0,
+                            Offset(6f, 6f),
+                            true,
+                            isInitiallyConsumed = true
+                        ),
+                        PointerInputChange(
+                            PointerId(1),
+                            0,
+                            Offset(10f, 10f),
+                            false,
+                            0,
+                            Offset(10f, 10f),
+                            false,
+                            isInitiallyConsumed = false
+                        )
                     )
                 )
             )
-        )
 
         rule.runOnIdle {
             expectedEvents.take(expectedEvents.size - 1).forEach { pointerEvent ->
@@ -287,9 +290,7 @@
             assertTrue("Waiting for relaunch timed out", latch.await(200, TimeUnit.MILLISECONDS))
 
             runTest {
-                val received = withTimeout(200) {
-                    results.receiveAsFlow().toList()
-                }
+                val received = withTimeout(200) { results.receiveAsFlow().toList() }
 
                 assertThat(expectedEvents).hasSize(received.size)
 
@@ -320,11 +321,7 @@
                     // trigger a cancel event if the previous event has the down [press] set to
                     // false. In this case, it does, so there are only ever two events, so the
                     // withTimeout() will trigger the timeout (expected).
-                    repeat(3) {
-                        withTimeout(200) {
-                            results.trySend(awaitPointerEvent())
-                        }
-                    }
+                    repeat(3) { withTimeout(200) { results.trySend(awaitPointerEvent()) } }
                 } finally {
                     currentEventAtEnd = currentEvent
                     results.close()
@@ -334,30 +331,32 @@
 
         rule.setContent {
             Box(
-                modifier = elementFor(
-                    key1 = Unit,
-                    instance = suspendingPointerInputModifierNode as Modifier.Node
-                )
+                modifier =
+                    elementFor(
+                        key1 = Unit,
+                        instance = suspendingPointerInputModifierNode as Modifier.Node
+                    )
             )
         }
         val bounds = IntSize(50, 50)
         val emitter1 = PointerInputChangeEmitter(0)
         val emitter2 = PointerInputChangeEmitter(1)
-        val twoExpectedEvents = listOf(
-            PointerEvent(
-                listOf(
-                    emitter1.nextChange(Offset(5f, 5f)),
-                    emitter2.nextChange(Offset(10f, 10f))
-                )
-            ),
-            // Pointer event changes don't have any pressed pointers!
-            PointerEvent(
-                listOf(
-                    emitter1.nextChange(Offset(6f, 6f), down = false),
-                    emitter2.nextChange(Offset(10f, 10f), down = false)
+        val twoExpectedEvents =
+            listOf(
+                PointerEvent(
+                    listOf(
+                        emitter1.nextChange(Offset(5f, 5f)),
+                        emitter2.nextChange(Offset(10f, 10f))
+                    )
+                ),
+                // Pointer event changes don't have any pressed pointers!
+                PointerEvent(
+                    listOf(
+                        emitter1.nextChange(Offset(6f, 6f), down = false),
+                        emitter2.nextChange(Offset(10f, 10f), down = false)
+                    )
                 )
             )
-        )
 
         rule.runOnIdle {
             twoExpectedEvents.forEach { pointerEvent ->
@@ -393,9 +392,7 @@
 
         rule.runOnIdle {
             runTest {
-                val received = withTimeout(400) {
-                    results.receiveAsFlow().toList()
-                }
+                val received = withTimeout(400) { results.receiveAsFlow().toList() }
                 assertThat(received).hasSize(twoExpectedEvents.size)
 
                 twoExpectedEvents.forEachIndexed { index, expectedEvent ->
@@ -412,12 +409,10 @@
     @Test
     @MediumTest
     fun testCancelPointerInput() {
-        val firstEventCheckpointInfo =
-            Pair(3, "First pointer event triggered to create Job.")
+        val firstEventCheckpointInfo = Pair(3, "First pointer event triggered to create Job.")
         val cancelEventCheckpointInfo =
             Pair(5, "Cancel pointer event triggered (shouldn't cancel Job).")
-        val invalidEventCheckpointNumber =
-            Pair(-1, "Should never execute.")
+        val invalidEventCheckpointNumber = Pair(-1, "Should never execute.")
 
         val counter = TestCounter()
 
@@ -433,35 +428,44 @@
                         // test is over.
                         repeat(3) { repeatCount ->
                             awaitPointerEvent()
-                            val checkpointInfo = when (repeatCount) {
-                                0 -> { firstEventCheckpointInfo }
-                                1 -> { cancelEventCheckpointInfo }
-                                else -> {
-                                    fail("Should never be three events.")
-                                    invalidEventCheckpointNumber
+                            val checkpointInfo =
+                                when (repeatCount) {
+                                    0 -> {
+                                        firstEventCheckpointInfo
+                                    }
+                                    1 -> {
+                                        cancelEventCheckpointInfo
+                                    }
+                                    else -> {
+                                        fail("Should never be three events.")
+                                        invalidEventCheckpointNumber
+                                    }
                                 }
-                            }
                             counter.expect(checkpointInfo.first, checkpointInfo.second)
                         }
-                        fail("awaitPointerEvent() run 3+ times in repeat() block, should only " +
-                            "have run twice (one event, one cancel).")
+                        fail(
+                            "awaitPointerEvent() run 3+ times in repeat() block, should only " +
+                                "have run twice (one event, one cancel)."
+                        )
                     } finally {
-                        counter.expect(7, "Inner finally block runs after " +
-                            "teardown.")
+                        counter.expect(7, "Inner finally block runs after " + "teardown.")
                     }
                 }
             } finally {
-                counter.expect(8, "Outer finally block runs; inner finally " +
-                    "block should have already run.")
+                counter.expect(
+                    8,
+                    "Outer finally block runs; inner finally " + "block should have already run."
+                )
             }
         }
 
         rule.setContent {
             Box(
-                modifier = elementFor(
-                    key1 = Unit,
-                    instance = suspendingPointerInputModifierNode as Modifier.Node
-                )
+                modifier =
+                    elementFor(
+                        key1 = Unit,
+                        instance = suspendingPointerInputModifierNode as Modifier.Node
+                    )
             )
         }
 
@@ -485,13 +489,14 @@
                 singleEventBounds
             )
 
-            counter.expect(4, "Before onCancelPointerInput() handler; awaitPointerEvent " +
-                "should be suspended")
+            counter.expect(
+                4,
+                "Before onCancelPointerInput() handler; awaitPointerEvent " + "should be suspended"
+            )
 
             // Manually cancels the current pointer input event.
             suspendingPointerInputModifierNode.onCancelPointerInput()
-            counter.expect(6, "After onCancelPointerInput(), end of test, " +
-                " start teardown.")
+            counter.expect(6, "After onCancelPointerInput(), end of test, " + " start teardown.")
         }
     }
 
@@ -514,10 +519,7 @@
                             awaitPointerEvent()
                             when (repeatCount) {
                                 0 -> {
-                                    counter.expect(
-                                        3,
-                                        "First/only pointer event triggered."
-                                    )
+                                    counter.expect(3, "First/only pointer event triggered.")
                                 }
                                 else -> {
                                     fail("Should never be two or more events.")
@@ -525,26 +527,30 @@
                                 }
                             }
                         }
-                        fail("awaitPointerEvent repeated twice; should have only happened once " +
-                            "and stayed suspended in repeat() waiting for a second event (that " +
-                            "should never arrive).")
+                        fail(
+                            "awaitPointerEvent repeated twice; should have only happened once " +
+                                "and stayed suspended in repeat() waiting for a second event (that " +
+                                "should never arrive)."
+                        )
                     } finally {
-                        fail("inner finally shouldn't call during teardown since coroutine job " +
-                            "was cancelled with resetPointerInputHandler().")
+                        fail(
+                            "inner finally shouldn't call during teardown since coroutine job " +
+                                "was cancelled with resetPointerInputHandler()."
+                        )
                     }
                 }
             } finally {
-                counter.expect(5, "outer finally block runs after " +
-                    "resetPointerInputHandler().")
+                counter.expect(5, "outer finally block runs after " + "resetPointerInputHandler().")
             }
         }
 
         rule.setContent {
             Box(
-                modifier = elementFor(
-                    key1 = Unit,
-                    instance = suspendingPointerInputModifierNode as Modifier.Node
-                )
+                modifier =
+                    elementFor(
+                        key1 = Unit,
+                        instance = suspendingPointerInputModifierNode as Modifier.Node
+                    )
             )
         }
 
@@ -568,8 +574,11 @@
                 singleEventBounds
             )
 
-            counter.expect(4, "before resetPointerInputHandler(), handler should" +
-                "be suspended waiting for a second event (that never comes).")
+            counter.expect(
+                4,
+                "before resetPointerInputHandler(), handler should" +
+                    "be suspended waiting for a second event (that never comes)."
+            )
 
             // Cancels the pointer input handler in SuspendPointerInputModifierNode (and thus the
             // Coroutine Job associated with it).
@@ -590,12 +599,13 @@
 
             assertThat(modifier.nameFallback).isEqualTo("pointerInput")
             assertThat(modifier.valueOverride).isNull()
-            assertThat(modifier.inspectableElements.asIterable()).containsExactly(
-                ValueElement("key1", Unit),
-                ValueElement("key2", null),
-                ValueElement("keys", null),
-                ValueElement("pointerInputHandler", pointerInputHandler)
-            )
+            assertThat(modifier.inspectableElements.asIterable())
+                .containsExactly(
+                    ValueElement("key1", Unit),
+                    ValueElement("key2", null),
+                    ValueElement("keys", null),
+                    ValueElement("pointerInputHandler", pointerInputHandler)
+                )
         }
     }
 
@@ -604,9 +614,7 @@
     fun testEquality_key() {
         val block: suspend PointerInputScope.() -> Unit = {}
 
-        assertModifierIsPure { toggleInput ->
-            Modifier.pointerInput(toggleInput, block = block)
-        }
+        assertModifierIsPure { toggleInput -> Modifier.pointerInput(toggleInput, block = block) }
     }
 
     @Test
@@ -644,10 +652,11 @@
             compositionCount++
 
             Box(
-                modifier = elementFor(
-                    key1 = toCapture,
-                    instance = suspendingPointerInputModifierNode as Modifier.Node
-                )
+                modifier =
+                    elementFor(
+                        key1 = toCapture,
+                        instance = suspendingPointerInputModifierNode as Modifier.Node
+                    )
             )
         }
 
@@ -718,9 +727,7 @@
 
                     // Times out waiting for second event (no second event is triggered in this
                     // test).
-                    withTimeout(10) {
-                        awaitPointerEvent()
-                    }
+                    withTimeout(10) { awaitPointerEvent() }
                 } catch (exception: Exception) {
                     assertThat(exception)
                         .isInstanceOf(PointerEventTimeoutCancellationException::class.java)
@@ -731,10 +738,11 @@
 
         rule.setContent {
             Box(
-                modifier = elementFor(
-                    key1 = Unit,
-                    instance = suspendingPointerInputModifierNode as Modifier.Node
-                )
+                modifier =
+                    elementFor(
+                        key1 = Unit,
+                        instance = suspendingPointerInputModifierNode as Modifier.Node
+                    )
             )
         }
 
@@ -751,9 +759,7 @@
 
         rule.mainClock.advanceTimeBy(1000)
 
-        rule.runOnIdle {
-            assertTrue(latch.await(2, TimeUnit.SECONDS))
-        }
+        rule.runOnIdle { assertTrue(latch.await(2, TimeUnit.SECONDS)) }
     }
 
     @Test
@@ -775,9 +781,7 @@
 
                     // Times out waiting for second event (no second event is triggered in this
                     // test).
-                    resultOfTimeoutOrNull = withTimeoutOrNull(10) {
-                        awaitPointerEvent()
-                    }
+                    resultOfTimeoutOrNull = withTimeoutOrNull(10) { awaitPointerEvent() }
                 } catch (exception: Exception) {
                     // An exception should not be raised in this test, but, just in case one is,
                     // we want to verify it isn't the one withTimeout will usually raise.
@@ -789,10 +793,11 @@
 
         rule.setContent {
             Box(
-                modifier = elementFor(
-                    key1 = Unit,
-                    instance = suspendingPointerInputModifierNode as Modifier.Node
-                )
+                modifier =
+                    elementFor(
+                        key1 = Unit,
+                        instance = suspendingPointerInputModifierNode as Modifier.Node
+                    )
             )
         }
 
@@ -809,9 +814,7 @@
 
         rule.mainClock.advanceTimeBy(1000)
 
-        rule.runOnIdle {
-            assertThat(resultOfTimeoutOrNull).isNull()
-        }
+        rule.runOnIdle { assertThat(resultOfTimeoutOrNull).isNull() }
     }
 
     @Test
@@ -830,14 +833,12 @@
                 latch.countDown()
             }
         }
-        val node = object : DelegatingNode() {
-            @Suppress("unused")
-            val pointer = delegate(suspendingPointerInputModifierNode)
-        }
+        val node =
+            object : DelegatingNode() {
+                @Suppress("unused") val pointer = delegate(suspendingPointerInputModifierNode)
+            }
 
-        rule.setContent {
-            Box(Modifier.elementFor(node))
-        }
+        rule.setContent { Box(Modifier.elementFor(node)) }
 
         rule.runOnIdle {
             suspendingPointerInputModifierNode.onPointerEvent(
@@ -859,34 +860,28 @@
         val events = mutableListOf<PointerEvent>()
         val tag = "input rect"
 
-        val node = object : DelegatingNode() {
-            @Suppress("unused")
-            val piNode1 = delegate(SuspendingPointerInputModifierNode {
-                awaitPointerEventScope {
-                    events += awaitPointerEvent()
-                }
-            })
+        val node =
+            object : DelegatingNode() {
+                @Suppress("unused")
+                val piNode1 =
+                    delegate(
+                        SuspendingPointerInputModifierNode {
+                            awaitPointerEventScope { events += awaitPointerEvent() }
+                        }
+                    )
 
-            @Suppress("unused")
-            val piNode2 = delegate(SuspendingPointerInputModifierNode {
-                awaitPointerEventScope {
-                    events += awaitPointerEvent()
-                }
-            })
-        }
+                @Suppress("unused")
+                val piNode2 =
+                    delegate(
+                        SuspendingPointerInputModifierNode {
+                            awaitPointerEventScope { events += awaitPointerEvent() }
+                        }
+                    )
+            }
 
-        rule.setContent {
-            Box(
-                Modifier
-                    .fillMaxSize()
-                    .testTag(tag)
-                    .elementFor(node)
-            )
-        }
+        rule.setContent { Box(Modifier.fillMaxSize().testTag(tag).elementFor(node)) }
 
-        rule.onNodeWithTag(tag).performTouchInput {
-            down(Offset.Zero)
-        }
+        rule.onNodeWithTag(tag).performTouchInput { down(Offset.Zero) }
         assertThat(events).hasSize(2)
     }
 
@@ -904,30 +899,16 @@
             // happens so Modifier.pointerInput() have to update it's lambda to the new one even
             // given that the key (Unit) didn't change.
             val currentKey by rememberUpdatedState(key)
-            Box(
-                Modifier
-                    .testTag(tag)
-                    .fillMaxSize()
-                    .pointerInput(Unit) {
-                        events.add(currentKey)
-                    })
+            Box(Modifier.testTag(tag).fillMaxSize().pointerInput(Unit) { events.add(currentKey) })
         }
 
         var key by mutableStateOf(0)
 
-        rule.setContent {
-            ReusableContent(key = key) {
-                BoxWithKey(key)
-            }
-        }
+        rule.setContent { ReusableContent(key = key) { BoxWithKey(key) } }
 
-        rule.runOnIdle {
-            key++
-        }
+        rule.runOnIdle { key++ }
 
-        rule.onNodeWithTag(tag).performTouchInput {
-            down(Offset.Zero)
-        }
+        rule.onNodeWithTag(tag).performTouchInput { down(Offset.Zero) }
         assertThat(events).isEqualTo(listOf(key))
     }
 
@@ -938,21 +919,19 @@
 
         rule.setContent {
             ReusableContent(key = key) {
-                val modifier = if (key == 0) {
-                    Modifier.pointerInput(Unit) {}
-                } else {
-                    Modifier.size(10.dp)
-                }
+                val modifier =
+                    if (key == 0) {
+                        Modifier.pointerInput(Unit) {}
+                    } else {
+                        Modifier.size(10.dp)
+                    }
                 Box(modifier.testTag(tag))
             }
         }
 
-        rule.runOnIdle {
-            key++
-        }
+        rule.runOnIdle { key++ }
 
-        rule.onNodeWithTag(tag)
-            .assertHeightIsEqualTo(10.dp)
+        rule.onNodeWithTag(tag).assertHeightIsEqualTo(10.dp)
     }
 
     @Test
@@ -964,30 +943,23 @@
 
         rule.setContent {
             Box(
-                Modifier
-                    .testTag(tag)
-                    .fillMaxSize()
-                    .pointerInput(key1 = key1) {
-                        try {
-                            suspendCancellableCoroutine<Unit> {}
-                        } catch (e: CancellationException) {
-                            cancelled = true
-                        }
+                Modifier.testTag(tag).fillMaxSize().pointerInput(key1 = key1) {
+                    try {
+                        suspendCancellableCoroutine<Unit> {}
+                    } catch (e: CancellationException) {
+                        cancelled = true
                     }
+                }
             )
         }
 
         rule.onNodeWithTag(tag).performClick()
 
-        rule.runOnIdle {
-            assertThat(cancelled).isFalse()
-        }
+        rule.runOnIdle { assertThat(cancelled).isFalse() }
 
         key1 = true
 
-        rule.runOnIdle {
-            assertThat(cancelled).isTrue()
-        }
+        rule.runOnIdle { assertThat(cancelled).isTrue() }
     }
 
     @Test
@@ -999,30 +971,23 @@
 
         rule.setContent {
             Box(
-                Modifier
-                    .testTag(tag)
-                    .fillMaxSize()
-                    .pointerInput(key1 = Unit, key2 = key2) {
-                        try {
-                            suspendCancellableCoroutine<Unit> {}
-                        } catch (e: CancellationException) {
-                            cancelled = true
-                        }
+                Modifier.testTag(tag).fillMaxSize().pointerInput(key1 = Unit, key2 = key2) {
+                    try {
+                        suspendCancellableCoroutine<Unit> {}
+                    } catch (e: CancellationException) {
+                        cancelled = true
                     }
+                }
             )
         }
 
         rule.onNodeWithTag(tag).performClick()
 
-        rule.runOnIdle {
-            assertThat(cancelled).isFalse()
-        }
+        rule.runOnIdle { assertThat(cancelled).isFalse() }
 
         key2 = true
 
-        rule.runOnIdle {
-            assertThat(cancelled).isTrue()
-        }
+        rule.runOnIdle { assertThat(cancelled).isTrue() }
     }
 
     @Test
@@ -1034,30 +999,23 @@
 
         rule.setContent {
             Box(
-                Modifier
-                    .testTag(tag)
-                    .fillMaxSize()
-                    .pointerInput(keys = keys) {
-                        try {
-                            suspendCancellableCoroutine<Unit> {}
-                        } catch (e: CancellationException) {
-                            cancelled = true
-                        }
+                Modifier.testTag(tag).fillMaxSize().pointerInput(keys = keys) {
+                    try {
+                        suspendCancellableCoroutine<Unit> {}
+                    } catch (e: CancellationException) {
+                        cancelled = true
                     }
+                }
             )
         }
 
         rule.onNodeWithTag(tag).performClick()
 
-        rule.runOnIdle {
-            assertThat(cancelled).isFalse()
-        }
+        rule.runOnIdle { assertThat(cancelled).isFalse() }
 
         keys = arrayOf(true)
 
-        rule.runOnIdle {
-            assertThat(cancelled).isTrue()
-        }
+        rule.runOnIdle { assertThat(cancelled).isTrue() }
     }
 
     @Test
@@ -1077,8 +1035,7 @@
 
         rule.setContent {
             Box(
-                Modifier
-                    .testTag(tag)
+                Modifier.testTag(tag)
                     .fillMaxSize()
                     .pointerInput(key1 = Unit, key2 = Unit, block = block)
             )
@@ -1086,15 +1043,11 @@
 
         rule.onNodeWithTag(tag).performClick()
 
-        rule.runOnIdle {
-            assertThat(cancelled).isFalse()
-        }
+        rule.runOnIdle { assertThat(cancelled).isFalse() }
 
         block = lambda2
 
-        rule.runOnIdle {
-            assertThat(cancelled).isFalse()
-        }
+        rule.runOnIdle { assertThat(cancelled).isFalse() }
     }
 
     // Tests pointerInput with bad pointer data
@@ -1104,16 +1057,14 @@
         val tag = "input rect"
         rule.setContent {
             Box(
-                Modifier.fillMaxSize()
-                    .testTag(tag)
-                    .pointerInput(Unit) {
-                        awaitPointerEventScope {
-                            while (true) {
-                                val event = awaitPointerEvent()
-                                events += event.type
-                            }
+                Modifier.fillMaxSize().testTag(tag).pointerInput(Unit) {
+                    awaitPointerEventScope {
+                        while (true) {
+                            val event = awaitPointerEvent()
+                            events += event.type
                         }
                     }
+                }
             )
         }
 
@@ -1136,16 +1087,14 @@
         val tag = "input rect"
         rule.setContent {
             Box(
-                Modifier.fillMaxSize()
-                    .testTag(tag)
-                    .pointerInput(Unit) {
-                        awaitPointerEventScope {
-                            while (true) {
-                                val event = awaitPointerEvent()
-                                events += event.type
-                            }
+                Modifier.fillMaxSize().testTag(tag).pointerInput(Unit) {
+                    awaitPointerEventScope {
+                        while (true) {
+                            val event = awaitPointerEvent()
+                            events += event.type
                         }
                     }
+                }
             )
         }
 
@@ -1165,11 +1114,12 @@
             up()
         }
         assertThat(events).hasSize(3)
-        assertThat(events).containsExactly(
-            PointerEventType.Press,
-            PointerEventType.Move,
-            PointerEventType.Release
-        )
+        assertThat(events)
+            .containsExactly(
+                PointerEventType.Press,
+                PointerEventType.Move,
+                PointerEventType.Release
+            )
     }
 
     @Test
@@ -1178,16 +1128,14 @@
         val tag = "input rect"
         rule.setContent {
             Box(
-                Modifier.fillMaxSize()
-                    .testTag(tag)
-                    .pointerInput(Unit) {
-                        awaitPointerEventScope {
-                            while (true) {
-                                val event = awaitPointerEvent()
-                                events += event.type
-                            }
+                Modifier.fillMaxSize().testTag(tag).pointerInput(Unit) {
+                    awaitPointerEventScope {
+                        while (true) {
+                            val event = awaitPointerEvent()
+                            events += event.type
                         }
                     }
+                }
             )
         }
 
@@ -1214,12 +1162,13 @@
             up(3)
         }
         assertThat(events).hasSize(5)
-        assertThat(events).containsExactly(
-            PointerEventType.Press,
-            PointerEventType.Move,
-            PointerEventType.Move,
-            PointerEventType.Release,
-            PointerEventType.Release
-        )
+        assertThat(events)
+            .containsExactly(
+                PointerEventType.Press,
+                PointerEventType.Move,
+                PointerEventType.Move,
+                PointerEventType.Release,
+                PointerEventType.Release
+            )
     }
 }
diff --git a/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/input/pointer/TestUtils.kt b/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/input/pointer/TestUtils.kt
index 5fd4c2c..767bb6c 100644
--- a/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/input/pointer/TestUtils.kt
+++ b/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/input/pointer/TestUtils.kt
@@ -72,14 +72,8 @@
     )
 }
 
-internal fun PointerInputEvent(
-    uptime: Long,
-    pointers: List<PointerInputEventData>
-) = PointerInputEvent(
-    uptime,
-    pointers,
-    MotionEventDouble
-)
+internal fun PointerInputEvent(uptime: Long, pointers: List<PointerInputEventData>) =
+    PointerInputEvent(uptime, pointers, MotionEventDouble)
 
 internal fun catchThrowable(lambda: () -> Unit): Throwable? {
     var exception: Throwable? = null
@@ -100,25 +94,25 @@
 internal val MotionEventDouble = MotionEvent.obtain(0L, 0L, ACTION_DOWN, 0f, 0f, 0)
 
 /**
- * To be used to construct types that require a MotionEvent but where only the ACTION_UP
- * type is needed.
+ * To be used to construct types that require a MotionEvent but where only the ACTION_UP type is
+ * needed.
  */
 internal val MotionEventUp = MotionEvent.obtain(0L, 0L, ACTION_UP, 0f, 0f, 0)
 
 /**
- * To be used to construct types that require a MotionEvent but where we only care if the event
- * is a hover event.
+ * To be used to construct types that require a MotionEvent but where we only care if the event is a
+ * hover event.
  */
 internal val MotionEventHover = createHoverMotionEvent(ACTION_HOVER_MOVE, 0f, 0f)
 
 fun createHoverMotionEvent(action: Int, x: Float, y: Float): MotionEvent {
-    val pointerProperties = MotionEvent.PointerProperties().apply {
-        toolType = MotionEvent.TOOL_TYPE_MOUSE
-    }
-    val pointerCoords = MotionEvent.PointerCoords().also {
-        it.x = x
-        it.y = y
-    }
+    val pointerProperties =
+        MotionEvent.PointerProperties().apply { toolType = MotionEvent.TOOL_TYPE_MOUSE }
+    val pointerCoords =
+        MotionEvent.PointerCoords().also {
+            it.x = x
+            it.y = y
+        }
     return MotionEvent.obtain(
         0L /* downTime */,
         0L /* eventTime */,
@@ -137,9 +131,7 @@
     )
 }
 
-internal fun Modifier.spyGestureFilter(
-    callback: (PointerEventPass) -> Unit
-): Modifier = composed {
+internal fun Modifier.spyGestureFilter(callback: (PointerEventPass) -> Unit): Modifier = composed {
     val modifier = remember { SpyGestureModifier() }
     modifier.callback = callback
     modifier
@@ -177,8 +169,8 @@
  * Creates a simple [MotionEvent].
  *
  * @param dispatchTarget The [View] that the [MotionEvent] is going to be dispatched to. This
- * guarantees that the MotionEvent is created correctly for both Compose (which relies on raw
- * coordinates being correct) and Android (which requires that local coordinates are correct).
+ *   guarantees that the MotionEvent is created correctly for both Compose (which relies on raw
+ *   coordinates being correct) and Android (which requires that local coordinates are correct).
  */
 @Suppress("TestFunctionName")
 internal fun MotionEvent(
@@ -199,24 +191,26 @@
         it.y += locationOnScreen[1]
     }
 
-    val motionEvent = MotionEvent.obtain(
-        0,
-        eventTime.toLong(),
-        action + (actionIndex shl MotionEvent.ACTION_POINTER_INDEX_SHIFT),
-        numPointers,
-        pointerProperties,
-        pointerCoords,
-        0,
-        0,
-        0f,
-        0f,
-        0,
-        0,
-        InputDevice.SOURCE_TOUCHSCREEN,
-        0
-    ).apply {
-        offsetLocation(-locationOnScreen[0].toFloat(), -locationOnScreen[1].toFloat())
-    }
+    val motionEvent =
+        MotionEvent.obtain(
+                0,
+                eventTime.toLong(),
+                action + (actionIndex shl MotionEvent.ACTION_POINTER_INDEX_SHIFT),
+                numPointers,
+                pointerProperties,
+                pointerCoords,
+                0,
+                0,
+                0f,
+                0f,
+                0,
+                0,
+                InputDevice.SOURCE_TOUCHSCREEN,
+                0
+            )
+            .apply {
+                offsetLocation(-locationOnScreen[0].toFloat(), -locationOnScreen[1].toFloat())
+            }
 
     pointerCoords.forEach {
         it.x -= locationOnScreen[0]
@@ -241,20 +235,14 @@
     }
 
 internal fun PointerEvent.deepCopy() =
-    PointerEvent(
-        changes.map {
-            it.deepCopy()
-        },
-        internalPointerEvent = internalPointerEvent
-    ).also { it.type = type }
+    PointerEvent(changes.map { it.deepCopy() }, internalPointerEvent = internalPointerEvent).also {
+        it.type = type
+    }
 
 internal fun pointerEventOf(
     vararg changes: PointerInputChange,
     motionEvent: MotionEvent = MotionEventDouble
-) = PointerEvent(
-    changes.toList(),
-    InternalPointerEvent(changes.toLongSparseArray(), motionEvent)
-)
+) = PointerEvent(changes.toList(), InternalPointerEvent(changes.toLongSparseArray(), motionEvent))
 
 fun Array<out PointerInputChange>.toLongSparseArray(): LongSparseArray<PointerInputChange> {
     val returnArray = LongSparseArray<PointerInputChange>(this.count())
@@ -318,14 +306,7 @@
         pass: PointerEventPass,
         bounds: IntSize
     ) {
-        log.add(
-            OnPointerEventEntry(
-                this,
-                pointerEvent.deepCopy(),
-                pass,
-                bounds
-            )
-        )
+        log.add(OnPointerEventEntry(this, pointerEvent.deepCopy(), pass, bounds))
         pointerEventHandler?.invokeOverPass(pointerEvent, pass, bounds)
     }
 
@@ -338,8 +319,7 @@
     val log: MutableList<LogEntry> = mutableListOf(),
     val pointerEventHandler: PointerEventHandler? = null,
     layoutCoordinates: LayoutCoordinates? = null
-) :
-    PointerInputFilter() {
+) : PointerInputFilter() {
 
     init {
         this.layoutCoordinates = layoutCoordinates ?: LayoutCoordinatesStub(true)
@@ -351,14 +331,7 @@
         pass: PointerEventPass,
         bounds: IntSize
     ) {
-        log.add(
-            OnPointerEventFilterEntry(
-                this,
-                pointerEvent.deepCopy(),
-                pass,
-                bounds
-            )
-        )
+        log.add(OnPointerEventFilterEntry(this, pointerEvent.deepCopy(), pass, bounds))
         pointerEventHandler?.invokeOverPass(pointerEvent, pass, bounds)
     }
 
@@ -368,10 +341,12 @@
 }
 
 internal fun List<LogEntry>.getOnPointerEventLog() = filterIsInstance<OnPointerEventEntry>()
+
 internal fun List<LogEntry>.getOnPointerEventFilterLog() =
     filterIsInstance<OnPointerEventFilterEntry>()
 
 internal fun List<LogEntry>.getOnCancelLog() = filterIsInstance<OnCancelEntry>()
+
 internal fun List<LogEntry>.getOnCancelFilterLog() = filterIsInstance<OnCancelFilterEntry>()
 
 internal sealed class LogEntry
@@ -392,35 +367,33 @@
 ) : LogEntry()
 
 @OptIn(ExperimentalComposeUiApi::class)
-internal class OnCancelEntry(
-    val pointerInputNode: PointerInputModifierNode
-) : LogEntry()
+internal class OnCancelEntry(val pointerInputNode: PointerInputModifierNode) : LogEntry()
 
-internal class OnCancelFilterEntry(
-    val pointerInputFilter: PointerInputFilter
-) : LogEntry()
+internal class OnCancelFilterEntry(val pointerInputFilter: PointerInputFilter) : LogEntry()
 
 internal fun internalPointerEventOf(vararg changes: PointerInputChange): InternalPointerEvent {
-    val event = if (changes.any { it.changedToUpIgnoreConsumed() }) {
-        MotionEventUp
-    } else {
-        MotionEventDouble
-    }
+    val event =
+        if (changes.any { it.changedToUpIgnoreConsumed() }) {
+            MotionEventUp
+        } else {
+            MotionEventDouble
+        }
 
-    val pointers = changes.map {
-        @OptIn(ExperimentalComposeUiApi::class)
-        PointerInputEventData(
-            id = it.id,
-            uptime = it.uptimeMillis,
-            positionOnScreen = it.position,
-            position = it.position,
-            down = it.pressed,
-            pressure = it.pressure,
-            type = it.type,
-            activeHover = false,
-            historical = emptyList()
-        )
-    }
+    val pointers =
+        changes.map {
+            @OptIn(ExperimentalComposeUiApi::class)
+            PointerInputEventData(
+                id = it.id,
+                uptime = it.uptimeMillis,
+                positionOnScreen = it.position,
+                position = it.position,
+                down = it.pressed,
+                pressure = it.pressure,
+                type = it.type,
+                activeHover = false,
+                historical = emptyList()
+            )
+        }
     val pointerEvent = PointerInputEvent(0L, pointers, event)
     return InternalPointerEvent(changes.toLongSparseArray(), pointerEvent)
 }
@@ -430,44 +403,41 @@
     x: Float = 0f,
     y: Float = 0f
 ): InternalPointerEvent {
-    val change = PointerInputChange(
-        PointerId(0),
-        0L,
-        Offset(x, y),
-        false,
-        0L,
-        Offset(0f, 0f),
-        false,
-        false,
-        PointerType.Mouse
-    )
+    val change =
+        PointerInputChange(
+            PointerId(0),
+            0L,
+            Offset(x, y),
+            false,
+            0L,
+            Offset(0f, 0f),
+            false,
+            false,
+            PointerType.Mouse
+        )
 
     @OptIn(ExperimentalComposeUiApi::class)
-    val pointer = PointerInputEventData(
-        id = change.id,
-        uptime = change.uptimeMillis,
-        positionOnScreen = change.position,
-        position = change.position,
-        down = change.pressed,
-        pressure = change.pressure,
-        type = change.type,
-        activeHover = true,
-        historical = emptyList()
-    )
+    val pointer =
+        PointerInputEventData(
+            id = change.id,
+            uptime = change.uptimeMillis,
+            positionOnScreen = change.position,
+            position = change.position,
+            down = change.pressed,
+            pressure = change.pressure,
+            type = change.type,
+            activeHover = true,
+            historical = emptyList()
+        )
     val pointerEvent = PointerInputEvent(0L, listOf(pointer), createHoverMotionEvent(action, x, y))
 
     val pointerArray = LongSparseArray<PointerInputChange>(1)
     pointerArray.put(change.id.value, change)
-    return InternalPointerEvent(
-        pointerArray,
-        pointerEvent
-    )
+    return InternalPointerEvent(pointerArray, pointerEvent)
 }
 
-internal class PointerEventSubject(
-    metaData: FailureMetadata,
-    val actual: PointerEvent
-) : Subject(metaData, actual) {
+internal class PointerEventSubject(metaData: FailureMetadata, val actual: PointerEvent) :
+    Subject(metaData, actual) {
     companion object {
         private val Factory =
             Factory<PointerEventSubject, PointerEvent> { metadata, actual ->
@@ -529,58 +499,46 @@
     }
 
     fun changeConsumed() {
-        check("consumedChange")
-            .that(actual.isConsumed).isEqualTo(true)
+        check("consumedChange").that(actual.isConsumed).isEqualTo(true)
     }
 
     fun changeNotConsumed() {
-        check("consumedChange")
-            .that(actual.isConsumed).isEqualTo(false)
+        check("consumedChange").that(actual.isConsumed).isEqualTo(false)
     }
 
     fun isStructurallyEqualTo(expected: PointerInputChange) {
         check("id").that(actual.id).isEqualTo(expected.id)
-        check("currentPosition")
-            .that(actual.position)
-            .isEqualTo(expected.position)
-        check("previousPosition")
-            .that(actual.previousPosition)
-            .isEqualTo(expected.previousPosition)
-        check("currentTime")
-            .that(actual.uptimeMillis)
-            .isEqualTo(expected.uptimeMillis)
+        check("currentPosition").that(actual.position).isEqualTo(expected.position)
+        check("previousPosition").that(actual.previousPosition).isEqualTo(expected.previousPosition)
+        check("currentTime").that(actual.uptimeMillis).isEqualTo(expected.uptimeMillis)
         check("previousTime")
             .that(actual.previousUptimeMillis)
             .isEqualTo(expected.previousUptimeMillis)
-        check("currentPressed")
-            .that(actual.pressed)
-            .isEqualTo(expected.pressed)
-        check("previousPressed")
-            .that(actual.previousPressed)
-            .isEqualTo(expected.previousPressed)
-        check("consumed")
-            .that(actual.isConsumed)
-            .isEqualTo(expected.isConsumed)
+        check("currentPressed").that(actual.pressed).isEqualTo(expected.pressed)
+        check("previousPressed").that(actual.previousPressed).isEqualTo(expected.previousPressed)
+        check("consumed").that(actual.isConsumed).isEqualTo(expected.isConsumed)
     }
 }
 
-internal fun PointerInputChange.deepCopy() = PointerInputChange(
-    id = this.id,
-    uptimeMillis = this.uptimeMillis,
-    position = this.position,
-    pressed = this.pressed,
-    previousUptimeMillis = this.previousUptimeMillis,
-    previousPosition = this.previousPosition,
-    previousPressed = this.previousPressed,
-    isInitiallyConsumed = this.isConsumed,
-    type = this.type,
-    scrollDelta = this.scrollDelta
-)
+internal fun PointerInputChange.deepCopy() =
+    PointerInputChange(
+        id = this.id,
+        uptimeMillis = this.uptimeMillis,
+        position = this.position,
+        pressed = this.pressed,
+        previousUptimeMillis = this.previousUptimeMillis,
+        previousPosition = this.previousPosition,
+        previousPressed = this.previousPressed,
+        isInitiallyConsumed = this.isConsumed,
+        type = this.type,
+        scrollDelta = this.scrollDelta
+    )
 
 // SuspendingPointerInputFilter test utilities
 internal fun PointerInputChange.toPointerEvent() = PointerEvent(listOf(this))
 
-internal val PointerEvent.firstChange get() = changes.first()
+internal val PointerEvent.firstChange
+    get() = changes.first()
 
 internal class PointerInputChangeEmitter(id: Int = 0) {
     val pointerId = PointerId(id.toLong())
@@ -594,19 +552,20 @@
         time: Long = 0
     ): PointerInputChange {
         return PointerInputChange(
-            id = pointerId,
-            time,
-            position,
-            down,
-            previousTime,
-            previousPosition,
-            previousPressed,
-            isInitiallyConsumed = false
-        ).also {
-            previousTime = time
-            previousPosition = position
-            previousPressed = down
-        }
+                id = pointerId,
+                time,
+                position,
+                down,
+                previousTime,
+                previousPosition,
+                previousPressed,
+                isInitiallyConsumed = false
+            )
+            .also {
+                previousTime = time
+                previousPosition = position
+                previousPressed = down
+            }
     }
 }
 
@@ -622,27 +581,28 @@
     }
 }
 
-internal fun elementFor(
-    key1: Any? = null,
-    instance: Modifier.Node
-) = object : ModifierNodeElement<Modifier.Node>() {
-    override fun InspectorInfo.inspectableProperties() {
-        debugInspectorInfo {
-            name = "pointerInput"
-            properties["key1"] = key1
-            properties["instance"] = instance
+internal fun elementFor(key1: Any? = null, instance: Modifier.Node) =
+    object : ModifierNodeElement<Modifier.Node>() {
+        override fun InspectorInfo.inspectableProperties() {
+            debugInspectorInfo {
+                name = "pointerInput"
+                properties["key1"] = key1
+                properties["instance"] = instance
+            }
+        }
+
+        override fun create() = instance
+
+        override fun update(node: Modifier.Node) {}
+
+        override fun equals(other: Any?): Boolean {
+            if (this === other) return true
+            if (other !is SuspendPointerInputElement) return false
+            if (key1 != other.key1) return false
+            return true
+        }
+
+        override fun hashCode(): Int {
+            return key1?.hashCode() ?: 0
         }
     }
-
-    override fun create() = instance
-    override fun update(node: Modifier.Node) {}
-    override fun equals(other: Any?): Boolean {
-        if (this === other) return true
-        if (other !is SuspendPointerInputElement) return false
-        if (key1 != other.key1) return false
-        return true
-    }
-    override fun hashCode(): Int {
-        return key1?.hashCode() ?: 0
-    }
-}
diff --git a/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/input/rotary/RotaryScrollEventTest.kt b/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/input/rotary/RotaryScrollEventTest.kt
index 2364e7f..60a83c0 100644
--- a/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/input/rotary/RotaryScrollEventTest.kt
+++ b/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/input/rotary/RotaryScrollEventTest.kt
@@ -53,8 +53,7 @@
 @MediumTest
 @RunWith(AndroidJUnit4::class)
 class RotaryScrollEventTest {
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
     private val initialFocus = FocusRequester()
     private lateinit var rootView: View
@@ -71,12 +70,12 @@
         // Arrange.
         ContentWithInitialFocus {
             Box(
-                modifier = Modifier
-                    .onRotaryScrollEvent {
-                        receivedEvent = it
-                        true
-                    }
-                    .focusable(initiallyFocused = true)
+                modifier =
+                    Modifier.onRotaryScrollEvent {
+                            receivedEvent = it
+                            true
+                        }
+                        .focusable(initiallyFocused = true)
             )
         }
 
@@ -91,9 +90,7 @@
         }
 
         // Assert.
-        rule.runOnIdle {
-            assertThat(receivedEvent).isNotNull()
-        }
+        rule.runOnIdle { assertThat(receivedEvent).isNotNull() }
     }
 
     // tests bad data
@@ -102,12 +99,12 @@
         // Arrange.
         ContentWithInitialFocus {
             Box(
-                modifier = Modifier
-                    .onRotaryScrollEvent {
-                        receivedEvent = it
-                        true
-                    }
-                    .focusable(initiallyFocused = true)
+                modifier =
+                    Modifier.onRotaryScrollEvent {
+                            receivedEvent = it
+                            true
+                        }
+                        .focusable(initiallyFocused = true)
             )
         }
 
@@ -123,31 +120,30 @@
         }
 
         // Assert.
-        rule.runOnIdle {
-            assertThat(receivedEvent).isNull()
-        }
+        rule.runOnIdle { assertThat(receivedEvent).isNull() }
     }
 
     @Test
     fun delegated_androidWearCrownRotation_triggersRotaryEvent() {
-        val node = object : DelegatingNode() {
-            val rse = delegate(object : RotaryInputModifierNode, Modifier.Node() {
-                override fun onRotaryScrollEvent(event: RotaryScrollEvent): Boolean {
-                    receivedEvent = event
-                    return true
-                }
-                override fun onPreRotaryScrollEvent(event: RotaryScrollEvent): Boolean {
-                    return false
-                }
-            })
-        }
+        val node =
+            object : DelegatingNode() {
+                val rse =
+                    delegate(
+                        object : RotaryInputModifierNode, Modifier.Node() {
+                            override fun onRotaryScrollEvent(event: RotaryScrollEvent): Boolean {
+                                receivedEvent = event
+                                return true
+                            }
+
+                            override fun onPreRotaryScrollEvent(event: RotaryScrollEvent): Boolean {
+                                return false
+                            }
+                        }
+                    )
+            }
         // Arrange.
         ContentWithInitialFocus {
-            Box(
-                modifier = Modifier
-                    .elementFor(node)
-                    .focusable(initiallyFocused = true)
-            )
+            Box(modifier = Modifier.elementFor(node).focusable(initiallyFocused = true))
         }
 
         // Act.
@@ -161,42 +157,45 @@
         }
 
         // Assert.
-        rule.runOnIdle {
-            assertThat(receivedEvent).isNotNull()
-        }
+        rule.runOnIdle { assertThat(receivedEvent).isNotNull() }
     }
 
     @Test
     fun delegated_multiple_androidWearCrownRotation_triggersRotaryEvent() {
         var event1: RotaryScrollEvent? = null
         var event2: RotaryScrollEvent? = null
-        val node = object : DelegatingNode() {
-            val a = delegate(object : RotaryInputModifierNode, Modifier.Node() {
-                override fun onRotaryScrollEvent(event: RotaryScrollEvent): Boolean {
-                    event1 = event
-                    return false
-                }
-                override fun onPreRotaryScrollEvent(event: RotaryScrollEvent): Boolean {
-                    return false
-                }
-            })
-            val b = delegate(object : RotaryInputModifierNode, Modifier.Node() {
-                override fun onRotaryScrollEvent(event: RotaryScrollEvent): Boolean {
-                    event2 = event
-                    return false
-                }
-                override fun onPreRotaryScrollEvent(event: RotaryScrollEvent): Boolean {
-                    return false
-                }
-            })
-        }
+        val node =
+            object : DelegatingNode() {
+                val a =
+                    delegate(
+                        object : RotaryInputModifierNode, Modifier.Node() {
+                            override fun onRotaryScrollEvent(event: RotaryScrollEvent): Boolean {
+                                event1 = event
+                                return false
+                            }
+
+                            override fun onPreRotaryScrollEvent(event: RotaryScrollEvent): Boolean {
+                                return false
+                            }
+                        }
+                    )
+                val b =
+                    delegate(
+                        object : RotaryInputModifierNode, Modifier.Node() {
+                            override fun onRotaryScrollEvent(event: RotaryScrollEvent): Boolean {
+                                event2 = event
+                                return false
+                            }
+
+                            override fun onPreRotaryScrollEvent(event: RotaryScrollEvent): Boolean {
+                                return false
+                            }
+                        }
+                    )
+            }
         // Arrange.
         ContentWithInitialFocus {
-            Box(
-                modifier = Modifier
-                    .elementFor(node)
-                    .focusable(initiallyFocused = true)
-            )
+            Box(modifier = Modifier.elementFor(node).focusable(initiallyFocused = true))
         }
 
         // Act.
@@ -221,26 +220,25 @@
         // Arrange.
         ContentWithInitialFocus {
             Box(
-                modifier = Modifier
-                    .onRotaryScrollEvent {
-                        receivedEvent = it
-                        true
-                    }
-                    .focusable(initiallyFocused = true)
+                modifier =
+                    Modifier.onRotaryScrollEvent {
+                            receivedEvent = it
+                            true
+                        }
+                        .focusable(initiallyFocused = true)
             )
         }
 
         // Act.
         @OptIn(ExperimentalTestApi::class)
-        rule.onRoot().performRotaryScrollInput {
-            rotateToScrollHorizontally(3.0f)
-        }
+        rule.onRoot().performRotaryScrollInput { rotateToScrollHorizontally(3.0f) }
 
         // Assert.
         rule.runOnIdle {
             with(checkNotNull(receivedEvent)) {
                 assertThat(verticalScrollPixels)
-                    .isWithin(tolerance).of(3.0f * verticalScrollFactor / horizontalScrollFactor)
+                    .isWithin(tolerance)
+                    .of(3.0f * verticalScrollFactor / horizontalScrollFactor)
                 assertThat(horizontalScrollPixels).isWithin(tolerance).of(3.0f)
             }
         }
@@ -251,27 +249,26 @@
         // Arrange.
         ContentWithInitialFocus {
             Box(
-                modifier = Modifier
-                    .onRotaryScrollEvent {
-                        receivedEvent = it
-                        true
-                    }
-                    .focusable(initiallyFocused = true)
+                modifier =
+                    Modifier.onRotaryScrollEvent {
+                            receivedEvent = it
+                            true
+                        }
+                        .focusable(initiallyFocused = true)
             )
         }
 
         // Act.
         @OptIn(ExperimentalTestApi::class)
-        rule.onRoot().performRotaryScrollInput {
-            rotateToScrollVertically(3.0f)
-        }
+        rule.onRoot().performRotaryScrollInput { rotateToScrollVertically(3.0f) }
 
         // Assert.
         rule.runOnIdle {
             with(checkNotNull(receivedEvent)) {
                 assertThat(verticalScrollPixels).isWithin(tolerance).of(3.0f)
                 assertThat(horizontalScrollPixels)
-                    .isWithin(tolerance).of(3.0f * horizontalScrollFactor / verticalScrollFactor)
+                    .isWithin(tolerance)
+                    .of(3.0f * horizontalScrollFactor / verticalScrollFactor)
             }
         }
     }
@@ -283,12 +280,12 @@
         // Arrange.
         ContentWithInitialFocus {
             Box(
-                modifier = Modifier
-                    .onRotaryScrollEvent {
-                        receivedEvent = it
-                        true
-                    }
-                    .focusable(initiallyFocused = true)
+                modifier =
+                    Modifier.onRotaryScrollEvent {
+                            receivedEvent = it
+                            true
+                        }
+                        .focusable(initiallyFocused = true)
             )
         }
 
@@ -305,9 +302,7 @@
 
         // Assert.
         rule.runOnIdle {
-            with(checkNotNull(receivedEvent)) {
-                assertThat(uptimeMillis).isEqualTo(TIME)
-            }
+            with(checkNotNull(receivedEvent)) { assertThat(uptimeMillis).isEqualTo(TIME) }
         }
     }
 
@@ -318,12 +313,12 @@
         // Arrange.
         ContentWithInitialFocus {
             Box(
-                modifier = Modifier
-                    .onRotaryScrollEvent {
-                        receivedEvent = it
-                        true
-                    }
-                    .focusable(initiallyFocused = true)
+                modifier =
+                    Modifier.onRotaryScrollEvent {
+                            receivedEvent = it
+                            true
+                        }
+                        .focusable(initiallyFocused = true)
             )
         }
 
@@ -340,9 +335,7 @@
 
         // Assert.
         rule.runOnIdle {
-            with(checkNotNull(receivedEvent)) {
-                assertThat(inputDeviceId).isEqualTo(DEVICE_ID)
-            }
+            with(checkNotNull(receivedEvent)) { assertThat(inputDeviceId).isEqualTo(DEVICE_ID) }
         }
     }
 
@@ -354,12 +347,12 @@
         // Arrange.
         ContentWithInitialFocus {
             Box(
-                modifier = Modifier
-                    .onRotaryScrollEvent {
-                        receivedEvents.add(it)
-                        true
-                    }
-                    .focusable(initiallyFocused = true)
+                modifier =
+                    Modifier.onRotaryScrollEvent {
+                            receivedEvents.add(it)
+                            true
+                        }
+                        .focusable(initiallyFocused = true)
             )
         }
 
@@ -385,18 +378,19 @@
         val focusRequester = FocusRequester()
         var keyEventFromOnKeyEvent1: RotaryScrollEvent? = null
         var keyEventFromOnKeyEvent2: RotaryScrollEvent? = null
-        var onRotaryScrollEvent: (event: RotaryScrollEvent) -> Boolean by mutableStateOf(
-            value = {
-                keyEventFromOnKeyEvent1 = it
-                true
-            }
-        )
+        var onRotaryScrollEvent: (event: RotaryScrollEvent) -> Boolean by
+            mutableStateOf(
+                value = {
+                    keyEventFromOnKeyEvent1 = it
+                    true
+                }
+            )
         rule.setFocusableContent {
             Box(
-                modifier = Modifier
-                    .focusRequester(focusRequester)
-                    .onRotaryScrollEvent(onRotaryScrollEvent)
-                    .focusTarget()
+                modifier =
+                    Modifier.focusRequester(focusRequester)
+                        .onRotaryScrollEvent(onRotaryScrollEvent)
+                        .focusTarget()
             )
         }
         rule.runOnIdle { focusRequester.requestFocus() }
@@ -424,18 +418,19 @@
         val focusRequester = FocusRequester()
         var keyEventFromOnPreRotaryScrollEvent1: RotaryScrollEvent? = null
         var keyEventFromOnPreRotaryScrollEvent2: RotaryScrollEvent? = null
-        var onPreRotaryScrollEvent: (event: RotaryScrollEvent) -> Boolean by mutableStateOf(
-            value = {
-                keyEventFromOnPreRotaryScrollEvent1 = it
-                true
-            }
-        )
+        var onPreRotaryScrollEvent: (event: RotaryScrollEvent) -> Boolean by
+            mutableStateOf(
+                value = {
+                    keyEventFromOnPreRotaryScrollEvent1 = it
+                    true
+                }
+            )
         rule.setFocusableContent {
             Box(
-                modifier = Modifier
-                    .focusRequester(focusRequester)
-                    .onPreRotaryScrollEvent(onPreRotaryScrollEvent)
-                    .focusTarget()
+                modifier =
+                    Modifier.focusRequester(focusRequester)
+                        .onPreRotaryScrollEvent(onPreRotaryScrollEvent)
+                        .focusTarget()
             )
         }
         rule.runOnIdle { focusRequester.requestFocus() }
@@ -457,9 +452,9 @@
         }
     }
 
-    private fun Modifier.focusable(initiallyFocused: Boolean = false) = this
-        .then(if (initiallyFocused) Modifier.focusRequester(initialFocus) else Modifier)
-        .focusTarget()
+    private fun Modifier.focusable(initiallyFocused: Boolean = false) =
+        this.then(if (initiallyFocused) Modifier.focusRequester(initialFocus) else Modifier)
+            .focusTarget()
 
     private fun ContentWithInitialFocus(content: @Composable () -> Unit) {
         rule.setContent {
@@ -470,14 +465,13 @@
     }
 
     private val horizontalScrollFactor: Float
-        get() = getScaledHorizontalScrollFactor(
-            ViewConfiguration.get(rootView.context),
-            rootView.context
-        )
+        get() =
+            getScaledHorizontalScrollFactor(
+                ViewConfiguration.get(rootView.context),
+                rootView.context
+            )
 
     private val verticalScrollFactor: Float
-        get() = getScaledVerticalScrollFactor(
-            ViewConfiguration.get(rootView.context),
-            rootView.context
-        )
+        get() =
+            getScaledVerticalScrollFactor(ViewConfiguration.get(rootView.context), rootView.context)
 }
diff --git a/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/layout/AlignmentLineTest.kt b/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/layout/AlignmentLineTest.kt
index 5617f9f..ff85d68 100644
--- a/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/layout/AlignmentLineTest.kt
+++ b/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/layout/AlignmentLineTest.kt
@@ -42,8 +42,7 @@
 @MediumTest
 @RunWith(AndroidJUnit4::class)
 class AlignmentLineTest {
-    @get:Rule
-    val rule = createAndroidComposeRule<ComponentActivity>()
+    @get:Rule val rule = createAndroidComposeRule<ComponentActivity>()
 
     @Test
     fun queryingLinesOfUnmeasuredChild() {
@@ -70,17 +69,21 @@
         val constrainedSize = 100
         val actualSize = 200
         rule.setContent {
-            val contentWithAlignmentLines = @Composable {
-                Box(Modifier.requiredSize(with(rule.density) { actualSize.toDp() })) {
-                    Layout({}, Modifier) { _, _ ->
-                        layout(0, 0, mapOf(hLine to hLinePosition, vLine to vLinePosition)) {}
+            val contentWithAlignmentLines =
+                @Composable {
+                    Box(Modifier.requiredSize(with(rule.density) { actualSize.toDp() })) {
+                        Layout({}, Modifier) { _, _ ->
+                            layout(0, 0, mapOf(hLine to hLinePosition, vLine to vLinePosition)) {}
+                        }
                     }
                 }
-            }
             Layout(contentWithAlignmentLines) { measurables, _ ->
-                val placeable = measurables.first().measure(
-                    Constraints(maxWidth = constrainedSize, maxHeight = constrainedSize)
-                )
+                val placeable =
+                    measurables
+                        .first()
+                        .measure(
+                            Constraints(maxWidth = constrainedSize, maxHeight = constrainedSize)
+                        )
                 val obtainedHLinePosition = placeable[hLine]
                 val obtainedVLinePosition = placeable[vLine]
                 assertEquals(
@@ -106,19 +109,23 @@
         val constrainedSize = 100
         val actualSize = 200
         rule.setContent {
-            val contentWithAlignmentLines = @Composable {
-                Layout({}, Modifier) { _, _ ->
-                    layout(
-                        actualSize,
-                        actualSize,
-                        mapOf(hLine to hLinePosition, vLine to vLinePosition)
-                    ) {}
+            val contentWithAlignmentLines =
+                @Composable {
+                    Layout({}, Modifier) { _, _ ->
+                        layout(
+                            actualSize,
+                            actualSize,
+                            mapOf(hLine to hLinePosition, vLine to vLinePosition)
+                        ) {}
+                    }
                 }
-            }
             Layout(contentWithAlignmentLines) { measurables, _ ->
-                val placeable = measurables.first().measure(
-                    Constraints(maxWidth = constrainedSize, maxHeight = constrainedSize)
-                )
+                val placeable =
+                    measurables
+                        .first()
+                        .measure(
+                            Constraints(maxWidth = constrainedSize, maxHeight = constrainedSize)
+                        )
                 val obtainedHLinePosition = placeable[hLine]
                 val obtainedVLinePosition = placeable[vLine]
                 assertEquals(
@@ -143,18 +150,17 @@
         val hLine = HorizontalAlignmentLine(::min)
         val vLine = VerticalAlignmentLine(::min)
         rule.setContent {
-            val content = @Composable {
-                Box(Modifier.size(sizeDp)) {
-                    Box(
-                        Modifier.supplyAlignmentLines {
-                            mapOf(
-                                hLine to linePosition,
-                                vLine to linePosition
-                            )
-                        }.size(sizeDp)
-                    )
+            val content =
+                @Composable {
+                    Box(Modifier.size(sizeDp)) {
+                        Box(
+                            Modifier.supplyAlignmentLines {
+                                    mapOf(hLine to linePosition, vLine to linePosition)
+                                }
+                                .size(sizeDp)
+                        )
+                    }
                 }
-            }
 
             Layout(content) { measurables, constraints ->
                 val placeable = measurables.first().measure(constraints)
@@ -175,20 +181,19 @@
         val hLine = HorizontalAlignmentLine(::min)
         val vLine = VerticalAlignmentLine(::min)
         rule.setContent {
-            val content = @Composable {
-                Box(Modifier.size(sizeDp)) {
-                    Box(
-                        Modifier.offset(offsetDp, offsetDp)
-                            .supplyAlignmentLines {
-                                mapOf(
-                                    hLine to linePosition,
-                                    vLine to linePosition
-                                )
-                            }.size(sizeDp)
-                            .offset(offsetDp, offsetDp)
-                    )
+            val content =
+                @Composable {
+                    Box(Modifier.size(sizeDp)) {
+                        Box(
+                            Modifier.offset(offsetDp, offsetDp)
+                                .supplyAlignmentLines {
+                                    mapOf(hLine to linePosition, vLine to linePosition)
+                                }
+                                .size(sizeDp)
+                                .offset(offsetDp, offsetDp)
+                        )
+                    }
                 }
-            }
 
             Layout(content) { measurables, constraints ->
                 val placeable = measurables.first().measure(constraints)
@@ -211,11 +216,12 @@
         var obtainedHLinePosition = -1
         var obtainedVLinePosition = -1
         rule.setContent {
-            val content = @Composable {
-                Box(Modifier.size(sizeDp)) {
-                    Box(Modifier.supplyAlignmentLines { alignmentLines.toMap() }.size(sizeDp))
+            val content =
+                @Composable {
+                    Box(Modifier.size(sizeDp)) {
+                        Box(Modifier.supplyAlignmentLines { alignmentLines.toMap() }.size(sizeDp))
+                    }
                 }
-            }
 
             Layout(content) { measurables, constraints ->
                 val placeable = measurables.first().measure(constraints)
@@ -250,19 +256,18 @@
         var obtainedHLinePosition = -1
         var obtainedVLinePosition = -1
         rule.setContent {
-            val content = @Composable {
-                val innerContent = @Composable {
-                    Layout({}) { _, _ ->
-                        layout(size, size, alignmentLines) {}
+            val content =
+                @Composable {
+                    val innerContent =
+                        @Composable { Layout({}) { _, _ -> layout(size, size, alignmentLines) {} } }
+                    Layout(content = innerContent, Modifier.size(sizeDp)) { measurables, constraints
+                        ->
+                        val placeable = measurables.first().measure(constraints)
+                        layout(constraints.maxWidth, constraints.maxHeight) {
+                            placeable.place(0, 0)
+                        }
                     }
                 }
-                Layout(content = innerContent, Modifier.size(sizeDp)) { measurables, constraints ->
-                    val placeable = measurables.first().measure(constraints)
-                    layout(constraints.maxWidth, constraints.maxHeight) {
-                        placeable.place(0, 0)
-                    }
-                }
-            }
 
             Layout(content) { measurables, constraints ->
                 val placeable = measurables.first().measure(constraints)
@@ -292,9 +297,7 @@
         rule.setContent {
             Parent(onMeasure = { ++parentMeasures }) {
                 Parent(onMeasure = { ++measures }, readDuringMeasure = true) {
-                    Parent {
-                        Provider()
-                    }
+                    Parent { Provider() }
                 }
             }
         }
@@ -322,9 +325,7 @@
                     onLayout = { ++layouts },
                     readDuringLayoutBeforePlacing = true
                 ) {
-                    Parent {
-                        Provider()
-                    }
+                    Parent { Provider() }
                 }
             }
         }
@@ -354,9 +355,7 @@
                     onLayout = { ++layouts },
                     readDuringLayoutAfterPlacing = true
                 ) {
-                    Parent {
-                        Provider()
-                    }
+                    Parent { Provider() }
                 }
             }
         }
@@ -391,9 +390,7 @@
                     onLayout = { ++layouts },
                     readDuringLayoutBeforePlacing = true
                 ) {
-                    Parent {
-                        Provider()
-                    }
+                    Parent { Provider() }
                 }
             }
         }
@@ -430,9 +427,7 @@
                     onLayout = { ++layouts },
                     readDuringLayoutAfterPlacing = true
                 ) {
-                    Parent {
-                        Provider()
-                    }
+                    Parent { Provider() }
                 }
             }
         }
@@ -469,9 +464,7 @@
                     onLayout = { ++layouts },
                     readDuringMeasure = true
                 ) {
-                    Parent {
-                        Provider()
-                    }
+                    Parent { Provider() }
                 }
             }
         }
@@ -682,9 +675,7 @@
             changeLinePosition()
         }
 
-        rule.runOnIdle {
-            assertEquals(2, childMeasures)
-        }
+        rule.runOnIdle { assertEquals(2, childMeasures) }
     }
 
     @Test
@@ -809,13 +800,8 @@
         var read by mutableStateOf(true)
         rule.setContent {
             Parent(onMeasure = { ++parentMeasures }, readDuringMeasure = true) {
-                ChangingParent(
-                    onMeasure = { ++measures },
-                    readDuringMeasure = { read }
-                ) {
-                    Parent(onMeasure = { ++childMeasures }) {
-                        Provider()
-                    }
+                ChangingParent(onMeasure = { ++measures }, readDuringMeasure = { read }) {
+                    Parent(onMeasure = { ++childMeasures }) { Provider() }
                 }
             }
         }
@@ -854,13 +840,8 @@
                 onLayout = { ++parentLayouts },
                 readDuringLayoutAfterPlacing = true
             ) {
-                ChangingParent(
-                    onMeasure = { ++measures },
-                    readDuringMeasure = { read }
-                ) {
-                    Parent(onMeasure = { ++childMeasures }) {
-                        Provider()
-                    }
+                ChangingParent(onMeasure = { ++measures }, readDuringMeasure = { read }) {
+                    Parent(onMeasure = { ++childMeasures }) { Provider() }
                 }
             }
         }
@@ -911,9 +892,7 @@
         var offset by mutableStateOf(IntOffset.Zero)
         rule.setContent {
             Parent(readDuringLayoutBeforePlacing = true, onLayout = { ++parentLayouts }) {
-                Parent {
-                    Provider(modifier = Modifier.offset { offset })
-                }
+                Parent { Provider(modifier = Modifier.offset { offset }) }
             }
         }
         rule.runOnIdle {
@@ -921,9 +900,7 @@
             linePosition += 10
         }
 
-        rule.runOnIdle {
-            assertEquals(2, parentLayouts)
-        }
+        rule.runOnIdle { assertEquals(2, parentLayouts) }
 
         rule.waitForIdle()
     }
@@ -933,22 +910,13 @@
         var parentMeasures = 0
         var read by mutableStateOf(false)
         rule.setContent {
-            ChangingParent(
-                readDuringMeasure = { read },
-                onMeasure = { ++parentMeasures }
-            ) {
-                Parent {
-                    Provider()
-                }
+            ChangingParent(readDuringMeasure = { read }, onMeasure = { ++parentMeasures }) {
+                Parent { Provider() }
             }
         }
-        rule.runOnIdle {
-            read = true
-        }
+        rule.runOnIdle { read = true }
 
-        rule.runOnIdle {
-            assertEquals(2, parentMeasures)
-        }
+        rule.runOnIdle { assertEquals(2, parentMeasures) }
     }
 
     @Test
@@ -960,18 +928,12 @@
                 readDuringLayoutBeforePlacing = { read },
                 onLayout = { ++parentLayouts }
             ) {
-                Parent {
-                    Provider()
-                }
+                Parent { Provider() }
             }
         }
-        rule.runOnIdle {
-            read = true
-        }
+        rule.runOnIdle { read = true }
 
-        rule.runOnIdle {
-            assertEquals(2, parentLayouts)
-        }
+        rule.runOnIdle { assertEquals(2, parentLayouts) }
     }
 
     @Test
@@ -979,13 +941,7 @@
         var obtainedPosition = 0
         var changingState by mutableStateOf(false)
         rule.setContent {
-            Layout(
-                content = {
-                    Parent {
-                        Provider()
-                    }
-                }
-            ) { measurables, constraints ->
+            Layout(content = { Parent { Provider() } }) { measurables, constraints ->
                 val placeable = measurables.first().measure(constraints)
                 layout(constraints.maxWidth, constraints.maxHeight) {
                     if (changingState) require(true)
@@ -1000,9 +956,7 @@
             changingState = true
         }
 
-        rule.runOnIdle {
-            assertEquals(linePosition, obtainedPosition)
-        }
+        rule.runOnIdle { assertEquals(linePosition, obtainedPosition) }
     }
 
     @Test
@@ -1010,13 +964,7 @@
         var obtainedPosition = 0
         var changingState by mutableStateOf(false)
         rule.setContent {
-            Layout(
-                content = {
-                    Parent {
-                        Provider()
-                    }
-                }
-            ) { measurables, constraints ->
+            Layout(content = { Parent { Provider() } }) { measurables, constraints ->
                 val placeable = measurables.first().measure(constraints)
                 layout(constraints.maxWidth, constraints.maxHeight) {
                     if (changingState) require(true)
@@ -1031,9 +979,7 @@
             changingState = true
         }
 
-        rule.runOnIdle {
-            assertEquals(linePosition, obtainedPosition)
-        }
+        rule.runOnIdle { assertEquals(linePosition, obtainedPosition) }
     }
 
     @Test
@@ -1041,9 +987,7 @@
         var obtainedPosition = 0
         rule.setContent {
             Parent(modifier = Modifier.onGloballyPositioned { obtainedPosition = it[TestLine] }) {
-                Parent {
-                    Provider()
-                }
+                Parent { Provider() }
             }
         }
         rule.runOnIdle {
@@ -1051,9 +995,7 @@
             changeLinePosition()
         }
 
-        rule.runOnIdle {
-            assertEquals(linePosition, obtainedPosition)
-        }
+        rule.runOnIdle { assertEquals(linePosition, obtainedPosition) }
     }
 
     @Test
@@ -1062,16 +1004,15 @@
         var layouts = 0
         rule.setContent {
             Parent(
-                modifier = Modifier.reader(
-                    readDuringMeasure = true,
-                    readDuringLayoutBeforePlacing = true,
-                    onMeasure = { ++measures },
-                    onLayout = { ++layouts }
-                )
+                modifier =
+                    Modifier.reader(
+                        readDuringMeasure = true,
+                        readDuringLayoutBeforePlacing = true,
+                        onMeasure = { ++measures },
+                        onLayout = { ++layouts }
+                    )
             ) {
-                Parent {
-                    Provider()
-                }
+                Parent { Provider() }
             }
         }
         rule.runOnIdle {
@@ -1092,15 +1033,14 @@
         var layouts = 0
         rule.setContent {
             Parent(
-                modifier = Modifier.reader(
-                    readDuringLayoutBeforePlacing = true,
-                    onMeasure = { ++measures },
-                    onLayout = { ++layouts }
-                )
+                modifier =
+                    Modifier.reader(
+                        readDuringLayoutBeforePlacing = true,
+                        onMeasure = { ++measures },
+                        onLayout = { ++layouts }
+                    )
             ) {
-                Parent {
-                    Provider()
-                }
+                Parent { Provider() }
             }
         }
         rule.runOnIdle {
@@ -1121,15 +1061,14 @@
         var layouts = 0
         rule.setContent {
             Parent(
-                modifier = Modifier.reader(
-                    readDuringLayoutAfterPlacing = true,
-                    onMeasure = { ++measures },
-                    onLayout = { ++layouts }
-                )
+                modifier =
+                    Modifier.reader(
+                        readDuringLayoutAfterPlacing = true,
+                        onMeasure = { ++measures },
+                        onLayout = { ++layouts }
+                    )
             ) {
-                Parent {
-                    Provider()
-                }
+                Parent { Provider() }
             }
         }
         rule.runOnIdle {
@@ -1164,25 +1103,23 @@
             ) { measurables, constraints ->
                 val placeable = measurables.first().measure(constraints)
                 placeable[FirstBaseline]
-                layout(placeable.width, placeable.height) {
-                    placeable.place(0, 0)
-                }
+                layout(placeable.width, placeable.height) { placeable.place(0, 0) }
             }
         }
 
-        rule.runOnIdle {
-            emit = true
-        }
+        rule.runOnIdle { emit = true }
 
         rule.runOnIdle {}
     }
 
     private var linePosition = 10
     private var linePositionState by mutableStateOf(10)
+
     private fun changeLinePosition() {
         linePosition += 10
         linePositionState += 10
     }
+
     private val TestLine = HorizontalAlignmentLine(::min)
 
     @Composable
@@ -1218,11 +1155,12 @@
     ) {
         Layout(content, modifier) { measurables, constraints ->
             onMeasure()
-            val placeables = measurables.map {
-                it.measure(constraints).also {
-                    if (readDuringMeasure()) assertEquals(linePosition, it[TestLine])
+            val placeables =
+                measurables.map {
+                    it.measure(constraints).also {
+                        if (readDuringMeasure()) assertEquals(linePosition, it[TestLine])
+                    }
                 }
-            }
             layout(constraints.maxWidth, constraints.maxHeight) {
                 onLayout()
                 placeables.forEach { placeable ->
@@ -1265,15 +1203,17 @@
         readDuringMeasure: Boolean = false,
         readDuringLayoutBeforePlacing: Boolean = false,
         readDuringLayoutAfterPlacing: Boolean = false
-    ) = this.then(
-        ReaderModifier(
-            onMeasure,
-            onLayout,
-            readDuringMeasure,
-            readDuringLayoutBeforePlacing,
-            readDuringLayoutAfterPlacing
+    ) =
+        this.then(
+            ReaderModifier(
+                onMeasure,
+                onLayout,
+                readDuringMeasure,
+                readDuringLayoutBeforePlacing,
+                readDuringLayoutAfterPlacing
+            )
         )
-    )
+
     private inner class ReaderModifier(
         val onMeasure: () -> Unit,
         val onLayout: () -> Unit,
@@ -1298,6 +1238,7 @@
     }
 
     private fun Modifier.provider() = this.then(ProviderModifier())
+
     private inner class ProviderModifier : LayoutModifier {
         override fun MeasureScope.measure(
             measurable: Measurable,
@@ -1325,8 +1266,6 @@
     private fun Modifier.supplyAlignmentLines(alignmentLines: () -> Map<AlignmentLine, Int>) =
         layout { measurable, constraints ->
             val placeable = measurable.measure(constraints)
-            layout(placeable.width, placeable.height, alignmentLines()) {
-                placeable.place(0, 0)
-            }
+            layout(placeable.width, placeable.height, alignmentLines()) { placeable.place(0, 0) }
         }
 }
diff --git a/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/layout/ApproachLayoutTest.kt b/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/layout/ApproachLayoutTest.kt
index c726f15..56164da 100644
--- a/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/layout/ApproachLayoutTest.kt
+++ b/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/layout/ApproachLayoutTest.kt
@@ -63,11 +63,9 @@
 @MediumTest
 @RunWith(AndroidJUnit4::class)
 class ApproachLayoutTest {
-    @get:Rule
-    val rule = createAndroidComposeRule<ComponentActivity>()
+    @get:Rule val rule = createAndroidComposeRule<ComponentActivity>()
 
-    @get:Rule
-    val excessiveAssertions = AndroidOwnerExtraAssertionsRule()
+    @get:Rule val excessiveAssertions = AndroidOwnerExtraAssertionsRule()
 
     // Test that measurement approach has no effect on parent or child when
     // isMeasurementApproachProgress returns false
@@ -84,11 +82,9 @@
         var lookaheadPositionInParent = androidx.compose.ui.geometry.Offset(Float.NaN, Float.NaN)
         rule.setContent {
             Box(Modifier.fillMaxSize()) {
-                Box(Modifier
-                    .layout { measurable, constraints ->
-                        measurable
-                            .measure(constraints)
-                            .run {
+                Box(
+                    Modifier.layout { measurable, constraints ->
+                            measurable.measure(constraints).run {
                                 if (isLookingAhead) {
                                     parentLookaheadSize = IntSize(width, height)
                                 } else {
@@ -104,28 +100,27 @@
                                 }
                                 layout(width, height) { place(0, 0) }
                             }
-                    }
-                    .approachLayout(
-                        isMeasurementApproachInProgress = { !isComplete }
-                    ) { measurable, _ ->
-                        // Intentionally use different constraints, placement and report different
-                        // measure result than lookahead, to verify that they have no effect on
-                        // the layout after completion.
-                        val constraints = Constraints.fixed(
-                            lookaheadSize.width - 20, lookaheadSize.height - 20
-                        )
-                        measurable
-                            .measure(constraints)
-                            .run {
+                        }
+                        .approachLayout(isMeasurementApproachInProgress = { !isComplete }) {
+                            measurable,
+                            _ ->
+                            // Intentionally use different constraints, placement and report
+                            // different
+                            // measure result than lookahead, to verify that they have no effect on
+                            // the layout after completion.
+                            val constraints =
+                                Constraints.fixed(
+                                    lookaheadSize.width - 20,
+                                    lookaheadSize.height - 20
+                                )
+                            measurable.measure(constraints).run {
                                 layout(lookaheadSize.width - 20, lookaheadSize.height - 20) {
                                     place(20, 20)
                                 }
                             }
-                    }
-                    .layout { measurable, constraints ->
-                        measurable
-                            .measure(constraints)
-                            .run {
+                        }
+                        .layout { measurable, constraints ->
+                            measurable.measure(constraints).run {
                                 if (isLookingAhead) {
                                     childLookaheadConstraints = constraints
                                     childLookaheadSize = IntSize(width, height)
@@ -163,8 +158,8 @@
                                     place(0, 0)
                                 }
                             }
-                    }
-                    .fillMaxSize()
+                        }
+                        .fillMaxSize()
                 )
             }
         }
@@ -173,9 +168,7 @@
             isComplete = false
         }
         rule.waitForIdle()
-        rule.runOnIdle {
-            isComplete = true
-        }
+        rule.runOnIdle { isComplete = true }
     }
 
     // Test that placement approach has no effect when _both measure & place approaches_ complete
@@ -194,11 +187,9 @@
         var approachPositionInParent = androidx.compose.ui.geometry.Offset(Float.NaN, Float.NaN)
         rule.setContent {
             Box(Modifier.fillMaxSize()) {
-                Box(Modifier
-                    .layout { measurable, constraints ->
-                        measurable
-                            .measure(constraints)
-                            .run {
+                Box(
+                    Modifier.layout { measurable, constraints ->
+                            measurable.measure(constraints).run {
                                 if (isLookingAhead) {
                                     parentLookaheadSize = IntSize(width, height)
                                 } else {
@@ -214,29 +205,28 @@
                                 }
                                 layout(width, height) { place(0, 0) }
                             }
-                    }
-                    .approachLayout(
-                        isMeasurementApproachInProgress = { !isMeasurementApproachComplete },
-                        isPlacementApproachInProgress = { !isPlacementApproachComplete }
-                    ) { measurable, _ ->
-                        // Intentionally use different constraints, placement and report different
-                        // measure result than lookahead, to verify that they have no effect on
-                        // the layout after completion.
-                        val constraints = Constraints.fixed(
-                            lookaheadSize.width - 20, lookaheadSize.height - 20
-                        )
-                        measurable
-                            .measure(constraints)
-                            .run {
+                        }
+                        .approachLayout(
+                            isMeasurementApproachInProgress = { !isMeasurementApproachComplete },
+                            isPlacementApproachInProgress = { !isPlacementApproachComplete }
+                        ) { measurable, _ ->
+                            // Intentionally use different constraints, placement and report
+                            // different
+                            // measure result than lookahead, to verify that they have no effect on
+                            // the layout after completion.
+                            val constraints =
+                                Constraints.fixed(
+                                    lookaheadSize.width - 20,
+                                    lookaheadSize.height - 20
+                                )
+                            measurable.measure(constraints).run {
                                 layout(lookaheadSize.width - 20, lookaheadSize.height - 20) {
                                     place(20, 20)
                                 }
                             }
-                    }
-                    .layout { measurable, constraints ->
-                        measurable
-                            .measure(constraints)
-                            .run {
+                        }
+                        .layout { measurable, constraints ->
+                            measurable.measure(constraints).run {
                                 if (isLookingAhead) {
                                     childLookaheadConstraints = constraints
                                     childLookaheadSize = IntSize(width, height)
@@ -266,8 +256,8 @@
                                     place(0, 0)
                                 }
                             }
-                    }
-                    .fillMaxSize()
+                        }
+                        .fillMaxSize()
                 )
             }
         }
@@ -276,10 +266,7 @@
             assertNotEquals(Offset(Float.NaN, Float.NaN), lookaheadPositionInParent)
             assertNotEquals(Offset(Float.NaN, Float.NaN), approachPositionInParent)
             // Initial condition: placement incomplete, measurement complete
-            assertNotEquals(
-                lookaheadPositionInParent,
-                approachPositionInParent
-            )
+            assertNotEquals(lookaheadPositionInParent, approachPositionInParent)
         }
 
         rule.runOnIdle {
@@ -290,20 +277,12 @@
         }
         rule.runOnIdle {
             // Updated condition: placement complete, measurement incomplete
-            assertNotEquals(
-                lookaheadPositionInParent,
-                approachPositionInParent
-            )
+            assertNotEquals(lookaheadPositionInParent, approachPositionInParent)
         }
-        rule.runOnIdle {
-            isMeasurementApproachComplete = true
-        }
+        rule.runOnIdle { isMeasurementApproachComplete = true }
         rule.runOnIdle {
             // Both measurement and placement are complete.
-            assertEquals(
-                lookaheadPositionInParent,
-                approachPositionInParent
-            )
+            assertEquals(lookaheadPositionInParent, approachPositionInParent)
         }
 
         rule.runOnIdle {
@@ -314,10 +293,7 @@
         }
         rule.runOnIdle {
             // Updated condition: placement complete, measurement incomplete
-            assertNotEquals(
-                lookaheadPositionInParent,
-                approachPositionInParent
-            )
+            assertNotEquals(lookaheadPositionInParent, approachPositionInParent)
         }
     }
 
@@ -335,73 +311,56 @@
         var childApproachConstraints: Constraints? = null
         var childLookaheadSize: IntSize? = null
         var childApproachSize: IntSize? = null
-        val parentApproachNode = object : TestApproachLayoutModifierNode() {
-            override fun isMeasurementApproachInProgress(lookaheadSize: IntSize): Boolean {
-                return !parentMeasureApproachComplete
-            }
+        val parentApproachNode =
+            object : TestApproachLayoutModifierNode() {
+                override fun isMeasurementApproachInProgress(lookaheadSize: IntSize): Boolean {
+                    return !parentMeasureApproachComplete
+                }
 
-            @ExperimentalComposeUiApi
-            override fun ApproachMeasureScope.approachMeasure(
-                measurable: Measurable,
-                constraints: Constraints
-            ): MeasureResult {
-                return measurable.measure(Constraints.fixed(600, 600)).run {
-                    layout(600, 600) {
-                        place(0, 0)
+                @ExperimentalComposeUiApi
+                override fun ApproachMeasureScope.approachMeasure(
+                    measurable: Measurable,
+                    constraints: Constraints
+                ): MeasureResult {
+                    return measurable.measure(Constraints.fixed(600, 600)).run {
+                        layout(600, 600) { place(0, 0) }
                     }
                 }
             }
-        }
         rule.setContent {
             CompositionLocalProvider(LocalDensity provides Density(1f)) {
                 Box(
-                    Modifier
-                        .fillMaxSize(
+                    Modifier.fillMaxSize(
                             // This forces a lookahead pass when approach complete is changed,
                             // because in the future we will only permit complete becoming true
                             // after a lookahead pass.
-                            if (childMeasureApproachComplete)
-                                1f
-                            else if (parentMeasureApproachComplete)
-                                0.9f
-                            else
-                                0.95f
+                            if (childMeasureApproachComplete) 1f
+                            else if (parentMeasureApproachComplete) 0.9f else 0.95f
                         )
                         .requiredSize(700.dp, 700.dp)
-                        .then(
-                            TestApproachElement(parentApproachNode)
-                        ),
+                        .then(TestApproachElement(parentApproachNode)),
                     propagateMinConstraints = true
                 ) {
                     Box(
-                        Modifier
-                            .layout { measurable, constraints ->
+                        Modifier.layout { measurable, constraints ->
                                 if (isLookingAhead) {
                                     parentLookaheadConstraints = constraints
                                 } else {
                                     parentApproachConstraints = constraints
                                 }
-                                measurable
-                                    .measure(constraints)
-                                    .run {
-                                        if (isLookingAhead) {
-                                            parentLookaheadSize = IntSize(width, height)
-                                        } else {
-                                            parentApproachSize = IntSize(width, height)
-                                        }
-                                        layout(width, height) {
-                                            place(0, 0)
-                                        }
+                                measurable.measure(constraints).run {
+                                    if (isLookingAhead) {
+                                        parentLookaheadSize = IntSize(width, height)
+                                    } else {
+                                        parentApproachSize = IntSize(width, height)
                                     }
+                                    layout(width, height) { place(0, 0) }
+                                }
                             }
                             .approachLayout({ !childMeasureApproachComplete }) { m, _ ->
-                                m
-                                    .measure(Constraints.fixed(500, 500))
-                                    .run {
-                                        layout(500, 500) {
-                                            place(0, 0)
-                                        }
-                                    }
+                                m.measure(Constraints.fixed(500, 500)).run {
+                                    layout(500, 500) { place(0, 0) }
+                                }
                             }
                             .layout { measurable, constraints ->
                                 if (isLookingAhead) {
@@ -409,19 +368,16 @@
                                 } else {
                                     childApproachConstraints = constraints
                                 }
-                                measurable
-                                    .measure(constraints)
-                                    .run {
-                                        if (isLookingAhead) {
-                                            childLookaheadSize = IntSize(width, height)
-                                        } else {
-                                            childApproachSize = IntSize(width, height)
-                                        }
-                                        layout(width, height) {
-                                            place(0, 0)
-                                        }
+                                measurable.measure(constraints).run {
+                                    if (isLookingAhead) {
+                                        childLookaheadSize = IntSize(width, height)
+                                    } else {
+                                        childApproachSize = IntSize(width, height)
                                     }
-                            }) {
+                                    layout(width, height) { place(0, 0) }
+                                }
+                            }
+                    ) {
                         Box(Modifier.fillMaxSize())
                     }
                 }
@@ -471,73 +427,56 @@
         var childApproachConstraints: Constraints? = null
         var childLookaheadSize: IntSize? = null
         var childApproachSize: IntSize? = null
-        val parentApproachNode = object : TestApproachLayoutModifierNode() {
-            override fun isMeasurementApproachInProgress(lookaheadSize: IntSize): Boolean {
-                return !parentMeasureApproachComplete
-            }
+        val parentApproachNode =
+            object : TestApproachLayoutModifierNode() {
+                override fun isMeasurementApproachInProgress(lookaheadSize: IntSize): Boolean {
+                    return !parentMeasureApproachComplete
+                }
 
-            @ExperimentalComposeUiApi
-            override fun ApproachMeasureScope.approachMeasure(
-                measurable: Measurable,
-                constraints: Constraints
-            ): MeasureResult {
-                return measurable.measure(Constraints.fixed(600, 600)).run {
-                    layout(600, 600) {
-                        place(0, 0)
+                @ExperimentalComposeUiApi
+                override fun ApproachMeasureScope.approachMeasure(
+                    measurable: Measurable,
+                    constraints: Constraints
+                ): MeasureResult {
+                    return measurable.measure(Constraints.fixed(600, 600)).run {
+                        layout(600, 600) { place(0, 0) }
                     }
                 }
             }
-        }
         rule.setContent {
             CompositionLocalProvider(LocalDensity provides Density(1f)) {
                 Box(
-                    Modifier
-                        .fillMaxSize(
+                    Modifier.fillMaxSize(
                             // This forces a lookahead pass when approach complete is changed,
                             // because in the future we will only permit complete becoming true
                             // after a lookahead pass.
-                            if (childMeasureApproachComplete)
-                                1f
-                            else if (parentMeasureApproachComplete)
-                                0.9f
-                            else
-                                0.95f
+                            if (childMeasureApproachComplete) 1f
+                            else if (parentMeasureApproachComplete) 0.9f else 0.95f
                         )
                         .requiredSize(700.dp, 700.dp)
-                        .then(
-                            TestApproachElement(parentApproachNode)
-                        ),
+                        .then(TestApproachElement(parentApproachNode)),
                     propagateMinConstraints = true
                 ) {
                     Box(
-                        Modifier
-                            .layout { measurable, constraints ->
+                        Modifier.layout { measurable, constraints ->
                                 if (isLookingAhead) {
                                     parentLookaheadConstraints = constraints
                                 } else {
                                     parentApproachConstraints = constraints
                                 }
-                                measurable
-                                    .measure(constraints)
-                                    .run {
-                                        if (isLookingAhead) {
-                                            parentLookaheadSize = IntSize(width, height)
-                                        } else {
-                                            parentApproachSize = IntSize(width, height)
-                                        }
-                                        layout(width, height) {
-                                            place(0, 0)
-                                        }
+                                measurable.measure(constraints).run {
+                                    if (isLookingAhead) {
+                                        parentLookaheadSize = IntSize(width, height)
+                                    } else {
+                                        parentApproachSize = IntSize(width, height)
                                     }
+                                    layout(width, height) { place(0, 0) }
+                                }
                             }
                             .approachLayout({ !childMeasureApproachComplete }) { m, _ ->
-                                m
-                                    .measure(Constraints.fixed(500, 500))
-                                    .run {
-                                        layout(500, 500) {
-                                            place(0, 0)
-                                        }
-                                    }
+                                m.measure(Constraints.fixed(500, 500)).run {
+                                    layout(500, 500) { place(0, 0) }
+                                }
                             }
                             .layout { measurable, constraints ->
                                 if (isLookingAhead) {
@@ -545,19 +484,16 @@
                                 } else {
                                     childApproachConstraints = constraints
                                 }
-                                measurable
-                                    .measure(constraints)
-                                    .run {
-                                        if (isLookingAhead) {
-                                            childLookaheadSize = IntSize(width, height)
-                                        } else {
-                                            childApproachSize = IntSize(width, height)
-                                        }
-                                        layout(width, height) {
-                                            place(0, 0)
-                                        }
+                                measurable.measure(constraints).run {
+                                    if (isLookingAhead) {
+                                        childLookaheadSize = IntSize(width, height)
+                                    } else {
+                                        childApproachSize = IntSize(width, height)
                                     }
-                            }) {
+                                    layout(width, height) { place(0, 0) }
+                                }
+                            }
+                    ) {
                         Box(Modifier.fillMaxSize())
                     }
                 }
@@ -597,139 +533,116 @@
     @Test
     fun testDefaultPlacementApproachComplete() {
         var measurementComplete = true
-        val node = object : ApproachLayoutModifierNode {
-            override fun isMeasurementApproachInProgress(lookaheadSize: IntSize): Boolean {
-                return !measurementComplete
-            }
+        val node =
+            object : ApproachLayoutModifierNode {
+                override fun isMeasurementApproachInProgress(lookaheadSize: IntSize): Boolean {
+                    return !measurementComplete
+                }
 
-            @ExperimentalComposeUiApi
-            override fun ApproachMeasureScope.approachMeasure(
-                measurable: Measurable,
-                constraints: Constraints
-            ): MeasureResult {
-                return measurable.measure(constraints).run {
-                    layout(width, height) {
-                        place(0, 0)
+                @ExperimentalComposeUiApi
+                override fun ApproachMeasureScope.approachMeasure(
+                    measurable: Measurable,
+                    constraints: Constraints
+                ): MeasureResult {
+                    return measurable.measure(constraints).run {
+                        layout(width, height) { place(0, 0) }
                     }
                 }
-            }
 
-            override val node: Node = object : Node() {}
-        }
+                override val node: Node = object : Node() {}
+            }
 
         assertFalse(node.isMeasurementApproachInProgress(IntSize.Zero))
         with(TestPlacementScope()) {
-            with(node) {
-                isPlacementApproachInProgress(LayoutCoordinatesStub())
+                with(node) { isPlacementApproachInProgress(LayoutCoordinatesStub()) }
             }
-        }.also {
-            assertFalse(it)
-        }
+            .also { assertFalse(it) }
 
         measurementComplete = false
         assertTrue(node.isMeasurementApproachInProgress(IntSize.Zero))
         with(TestPlacementScope()) {
-            with(node) {
-                isPlacementApproachInProgress(LayoutCoordinatesStub())
+                with(node) { isPlacementApproachInProgress(LayoutCoordinatesStub()) }
             }
-        }.also {
-            assertFalse(it)
-        }
+            .also { assertFalse(it) }
     }
 
     /**
-     * Test that the ApproachLayoutModifierNode does not leave child in a forced lookahead
-     * placement state when removed.
+     * Test that the ApproachLayoutModifierNode does not leave child in a forced lookahead placement
+     * state when removed.
      */
     @Test
     fun testForcedPlacementReset() {
         var measureWithFixedConstraints by mutableStateOf(false)
         var removeChild by mutableStateOf(false)
-        val parentNode = object : TestApproachLayoutModifierNode() {
-            override fun isMeasurementApproachInProgress(lookaheadSize: IntSize): Boolean {
-                return true
+        val parentNode =
+            object : TestApproachLayoutModifierNode() {
+                override fun isMeasurementApproachInProgress(lookaheadSize: IntSize): Boolean {
+                    return true
+                }
+
+                override fun Placeable.PlacementScope.isPlacementApproachInProgress(
+                    lookaheadCoordinates: LayoutCoordinates
+                ): Boolean {
+                    return false
+                }
+
+                @ExperimentalComposeUiApi
+                override fun ApproachMeasureScope.approachMeasure(
+                    measurable: Measurable,
+                    constraints: Constraints
+                ): MeasureResult {
+                    return measurable
+                        .measure(
+                            if (measureWithFixedConstraints) Constraints.fixed(0, 0)
+                            else constraints
+                        )
+                        .run { layout(width, height) { place(0, 0) } }
+                }
             }
 
-            override fun Placeable.PlacementScope.isPlacementApproachInProgress(
-                lookaheadCoordinates: LayoutCoordinates
-            ): Boolean {
-                return false
-            }
+        val childNode =
+            object : TestApproachLayoutModifierNode() {
+                override fun isMeasurementApproachInProgress(lookaheadSize: IntSize): Boolean {
+                    return false
+                }
 
-            @ExperimentalComposeUiApi
-            override fun ApproachMeasureScope.approachMeasure(
-                measurable: Measurable,
-                constraints: Constraints
-            ): MeasureResult {
-                return measurable.measure(
-                    if (measureWithFixedConstraints)
-                        Constraints.fixed(0, 0)
-                    else
-                        constraints
-                ).run {
-                    layout(width, height) {
-                        place(0, 0)
+                override fun Placeable.PlacementScope.isPlacementApproachInProgress(
+                    lookaheadCoordinates: LayoutCoordinates
+                ): Boolean {
+                    return false
+                }
+
+                @ExperimentalComposeUiApi
+                override fun ApproachMeasureScope.approachMeasure(
+                    measurable: Measurable,
+                    constraints: Constraints
+                ): MeasureResult {
+                    return measurable.measure(constraints).run {
+                        layout(width, height) { place(0, 0) }
                     }
                 }
             }
-        }
-
-        val childNode = object : TestApproachLayoutModifierNode() {
-            override fun isMeasurementApproachInProgress(lookaheadSize: IntSize): Boolean {
-                return false
-            }
-
-            override fun Placeable.PlacementScope.isPlacementApproachInProgress(
-                lookaheadCoordinates: LayoutCoordinates
-            ): Boolean {
-                return false
-            }
-
-            @ExperimentalComposeUiApi
-            override fun ApproachMeasureScope.approachMeasure(
-                measurable: Measurable,
-                constraints: Constraints
-            ): MeasureResult {
-                return measurable.measure(constraints).run {
-                    layout(width, height) {
-                        place(0, 0)
-                    }
-                }
-            }
-        }
         var position = Offset(-1f, -1f)
         rule.setContent {
             CompositionLocalProvider(LocalDensity provides Density(1f)) {
-                Box(Modifier
-                    .then(TestApproachElement(parentNode))
-                    .layout { measurable, constraints ->
-                        measurable
-                            .measure(constraints)
-                            .run {
-                                layout(width, height) {
-                                    place(0, 0)
-                                }
+                Box(
+                    Modifier.then(TestApproachElement(parentNode))
+                        .layout { measurable, constraints ->
+                            measurable.measure(constraints).run {
+                                layout(width, height) { place(0, 0) }
                             }
-                    }
-                    .then(if (removeChild) Modifier else TestApproachElement(childNode))
-                    .requiredSize(200.dp, 200.dp)
-                    .onGloballyPositioned {
-                        position = it.positionInRoot()
-                    }
+                        }
+                        .then(if (removeChild) Modifier else TestApproachElement(childNode))
+                        .requiredSize(200.dp, 200.dp)
+                        .onGloballyPositioned { position = it.positionInRoot() }
                 )
             }
         }
-        rule.runOnIdle {
-            assertEquals(Offset(0f, 0f), position)
-        }
+        rule.runOnIdle { assertEquals(Offset(0f, 0f), position) }
         removeChild = true
-        rule.runOnIdle {
-            assertEquals(Offset(0f, 0f), position)
-        }
+        rule.runOnIdle { assertEquals(Offset(0f, 0f), position) }
         measureWithFixedConstraints = true
-        rule.runOnIdle {
-            assertEquals(Offset(-100f, -100f), position)
-        }
+        rule.runOnIdle { assertEquals(Offset(-100f, -100f), position) }
     }
 
     @OptIn(ExperimentalComposeUiApi::class)
@@ -745,39 +658,27 @@
                 val movableContent = remember {
                     movableContentOf {
                         Box(
-                            Modifier
-                                .let {
-                                    if (isInColumn) {
-                                        // Same layout as all other boxes in the Column
-                                        it
-                                            .height(100.dp)
-                                            .fillMaxWidth()
-                                    } else {
-                                        it.size(50.dp)
-                                    }
+                            Modifier.let {
+                                if (isInColumn) {
+                                    // Same layout as all other boxes in the Column
+                                    it.height(100.dp).fillMaxWidth()
+                                } else {
+                                    it.size(50.dp)
                                 }
+                            }
                         )
                     }
                 }
 
                 LookaheadScope {
-                    Box(
-                        Modifier
-                            .fillMaxWidth()
-                            .height(300.dp)
-                    ) {
+                    Box(Modifier.fillMaxWidth().height(300.dp)) {
                         Column(
-                            Modifier
-                                .fillMaxSize()
+                            Modifier.fillMaxSize()
                                 // Scroll is part of the trigger that skips ApproachLayout
                                 .verticalScroll(rememberScrollState(0))
                         ) {
                             // First, fixed box.
-                            Box(
-                                Modifier
-                                    .fillMaxWidth()
-                                    .height(100.dp)
-                            )
+                            Box(Modifier.fillMaxWidth().height(100.dp))
                             // Second box is movableContent if `isInColumn` is `true`
                             if (isInColumn) {
                                 movableContent()
@@ -788,8 +689,7 @@
                             // lookahead pass whenever the state changes and the movableContent is
                             // placed as a sibling or the secondary slot.
                             Box(
-                                Modifier
-                                    .approachLayout(
+                                Modifier.approachLayout(
                                         isMeasurementApproachInProgress = {
                                             return@approachLayout false
                                         },
@@ -864,14 +764,13 @@
                 LookaheadScope {
                     Box {
                         Box(
-                            modifier = Modifier
-                                .size(100.dp)
-                                .layout { measurable, constraints ->
-                                    // Applies a 200px offset, that may change from placing under
-                                    // DMP or not
-                                    measurable
-                                        .measure(constraints)
-                                        .run {
+                            modifier =
+                                Modifier.size(100.dp)
+                                    .layout { measurable, constraints ->
+                                        // Applies a 200px offset, that may change from placing
+                                        // under
+                                        // DMP or not
+                                        measurable.measure(constraints).run {
                                             layout(width, height) {
                                                 if (toggleDmp) {
                                                     withMotionFrameOfReferencePlacement {
@@ -882,29 +781,30 @@
                                                 }
                                             }
                                         }
-                                }
-                                .approachLayout(
-                                    isMeasurementApproachInProgress = { false },
-                                    approachMeasure = { measurable, constraints ->
-                                        val placeable = measurable.measure(constraints)
-                                        layout(placeable.width, placeable.height) {
-                                            // Query coordinates during placement, they should
-                                            // get updated when only toggling the flag (despite
-                                            // no change in position)
-                                            coordinates?.let {
-                                                positionExcludingDmp = it
-                                                    .parentLayoutCoordinates!!
-                                                    .toLookaheadCoordinates()
-                                                    .localLookaheadPositionOf(
-                                                        sourceCoordinates = it
-                                                            .toLookaheadCoordinates(),
-                                                        includeMotionFrameOfReference = false
-                                                    )
-                                            }
-                                            placeable.place(0, 0)
-                                        }
                                     }
-                                )
+                                    .approachLayout(
+                                        isMeasurementApproachInProgress = { false },
+                                        approachMeasure = { measurable, constraints ->
+                                            val placeable = measurable.measure(constraints)
+                                            layout(placeable.width, placeable.height) {
+                                                // Query coordinates during placement, they should
+                                                // get updated when only toggling the flag (despite
+                                                // no change in position)
+                                                coordinates?.let {
+                                                    positionExcludingDmp =
+                                                        it.parentLayoutCoordinates!!
+                                                            .toLookaheadCoordinates()
+                                                            .localLookaheadPositionOf(
+                                                                sourceCoordinates =
+                                                                    it.toLookaheadCoordinates(),
+                                                                includeMotionFrameOfReference =
+                                                                    false
+                                                            )
+                                                }
+                                                placeable.place(0, 0)
+                                            }
+                                        }
+                                    )
                         )
                     }
                 }
@@ -925,19 +825,18 @@
     private class TestPlacementScope : Placeable.PlacementScope() {
         override val parentWidth: Int
             get() = TODO("Not yet implemented")
+
         override val parentLayoutDirection: LayoutDirection
             get() = TODO("Not yet implemented")
     }
 
-    private data class TestApproachElement(
-        var approachNode: TestApproachLayoutModifierNode
-    ) : ModifierNodeElement<TestApproachLayoutModifierNode>() {
+    private data class TestApproachElement(var approachNode: TestApproachLayoutModifierNode) :
+        ModifierNodeElement<TestApproachLayoutModifierNode>() {
         override fun create(): TestApproachLayoutModifierNode {
             return approachNode
         }
 
-        override fun update(node: TestApproachLayoutModifierNode) {
-        }
+        override fun update(node: TestApproachLayoutModifierNode) {}
     }
 
     abstract class TestApproachLayoutModifierNode : Node(), ApproachLayoutModifierNode
diff --git a/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/layout/BeyondBoundsLayoutTest.kt b/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/layout/BeyondBoundsLayoutTest.kt
index 1f7c53e..53ed0c2 100644
--- a/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/layout/BeyondBoundsLayoutTest.kt
+++ b/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/layout/BeyondBoundsLayoutTest.kt
@@ -37,8 +37,7 @@
 @RunWith(AndroidJUnit4::class)
 class BeyondBoundsLayoutTest {
 
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
     // The result of an imaginary operation that is run after we add the beyondBounds items we need.
     private val OperationResult = 10
@@ -50,21 +49,20 @@
         var blockInvoked = false
         rule.setContent {
             Box(
-                Modifier
-                    .parentWithoutNonVisibleItems()
-                    .modifierLocalConsumer {
-                        parent = ModifierLocalBeyondBoundsLayout.current
-                    }
+                Modifier.parentWithoutNonVisibleItems().modifierLocalConsumer {
+                    parent = ModifierLocalBeyondBoundsLayout.current
+                }
             )
         }
 
         // Act.
-        val returnValue = rule.runOnIdle {
-            parent!!.layout(After) {
-                blockInvoked = true
-                OperationResult
+        val returnValue =
+            rule.runOnIdle {
+                parent!!.layout(After) {
+                    blockInvoked = true
+                    OperationResult
+                }
             }
-        }
 
         // Assert.
         assertThat(blockInvoked).isFalse()
@@ -78,24 +76,23 @@
         var blockInvokeCount = 0
         rule.setContent {
             Box(
-                Modifier
-                    .parentWithFiveNonVisibleItems()
-                    .modifierLocalConsumer {
-                        parent = ModifierLocalBeyondBoundsLayout.current
-                    }
+                Modifier.parentWithFiveNonVisibleItems().modifierLocalConsumer {
+                    parent = ModifierLocalBeyondBoundsLayout.current
+                }
             )
         }
 
         // Act.
-        val returnValue = rule.runOnIdle {
-            assertThat(parent).isNotNull()
-            parent?.layout<Int>(After) {
-                blockInvokeCount++
-                // Always return null, to continue searching and indicate that
-                // we didn't find the item we were looking for.
-                null
+        val returnValue =
+            rule.runOnIdle {
+                assertThat(parent).isNotNull()
+                parent?.layout<Int>(After) {
+                    blockInvokeCount++
+                    // Always return null, to continue searching and indicate that
+                    // we didn't find the item we were looking for.
+                    null
+                }
             }
-        }
 
         // Assert.
         assertThat(blockInvokeCount).isEqualTo(5)
@@ -110,34 +107,34 @@
         var iterationCount = 0
         rule.setContent {
             Box(
-                Modifier
-                    .parentWithFiveNonVisibleItems()
-                    .modifierLocalConsumer {
-                        parent = ModifierLocalBeyondBoundsLayout.current
-                    }
+                Modifier.parentWithFiveNonVisibleItems().modifierLocalConsumer {
+                    parent = ModifierLocalBeyondBoundsLayout.current
+                }
             )
         }
 
         // Act.
-        val returnValue = rule.runOnIdle {
-            assertThat(parent).isNotNull()
-            parent?.layout(After) {
-                val returnValue = if (hasMoreContent) null else OperationResult
-                callMap[++iterationCount] = returnValue
-                returnValue
+        val returnValue =
+            rule.runOnIdle {
+                assertThat(parent).isNotNull()
+                parent?.layout(After) {
+                    val returnValue = if (hasMoreContent) null else OperationResult
+                    callMap[++iterationCount] = returnValue
+                    returnValue
+                }
             }
-        }
 
         // Assert.
-        assertThat(callMap).containsExactlyEntriesIn(
-            mapOf(
-                1 to null,
-                2 to null,
-                3 to null,
-                4 to null,
-                5 to OperationResult,
+        assertThat(callMap)
+            .containsExactlyEntriesIn(
+                mapOf(
+                    1 to null,
+                    2 to null,
+                    3 to null,
+                    4 to null,
+                    5 to OperationResult,
+                )
             )
-        )
         assertThat(returnValue).isEqualTo(OperationResult)
     }
 
@@ -147,22 +144,21 @@
         var parent: BeyondBoundsLayout? = null
         rule.setContent {
             Box(
-                Modifier
-                    .parentWithFiveNonVisibleItems()
-                    .modifierLocalConsumer {
-                        parent = ModifierLocalBeyondBoundsLayout.current
-                    }
+                Modifier.parentWithFiveNonVisibleItems().modifierLocalConsumer {
+                    parent = ModifierLocalBeyondBoundsLayout.current
+                }
             )
         }
 
         // Act.
-        val returnValue = rule.runOnIdle {
-            assertThat(parent).isNotNull()
-            parent?.layout(After) {
-                // After the first item was added, we were able to perform our operation.
-                OperationResult
+        val returnValue =
+            rule.runOnIdle {
+                assertThat(parent).isNotNull()
+                parent?.layout(After) {
+                    // After the first item was added, we were able to perform our operation.
+                    OperationResult
+                }
             }
-        }
 
         // Assert.
         assertThat(returnValue).isEqualTo(OperationResult)
@@ -174,22 +170,19 @@
         var parent: BeyondBoundsLayout? = null
         rule.setContent {
             Box(
-                Modifier
-                    .parentWithFiveNonVisibleItems()
-                    .modifierLocalConsumer {
-                        parent = ModifierLocalBeyondBoundsLayout.current
-                    }
+                Modifier.parentWithFiveNonVisibleItems().modifierLocalConsumer {
+                    parent = ModifierLocalBeyondBoundsLayout.current
+                }
             )
         }
 
         // Act.
-        val returnValue = rule.runOnIdle {
-            assertThat(parent).isNotNull()
-            var iterationCount = 0
-            parent?.layout(After) {
-                if (iterationCount++ < 3) null else OperationResult
+        val returnValue =
+            rule.runOnIdle {
+                assertThat(parent).isNotNull()
+                var iterationCount = 0
+                parent?.layout(After) { if (iterationCount++ < 3) null else OperationResult }
             }
-        }
 
         // Assert.
         assertThat(returnValue).isEqualTo(OperationResult)
@@ -205,27 +198,29 @@
         var returnValue2: Int? = null
         rule.setContent {
             Box(
-                Modifier
-                    .parentWithFiveNonVisibleItems()
-                    .modifierLocalConsumer {
-                        parent = ModifierLocalBeyondBoundsLayout.current
-                    }
+                Modifier.parentWithFiveNonVisibleItems().modifierLocalConsumer {
+                    parent = ModifierLocalBeyondBoundsLayout.current
+                }
             )
         }
 
         // Act.
         rule.runOnIdle {
             assertThat(parent).isNotNull()
-            returnValue1 = parent?.layout<Int>(After) {
-                block1InvokeCount++
-                // Always return null, to indicate that we didn't find the item we were looking for.
-                null
-            }
-            returnValue2 = parent?.layout<Int>(After) {
-                block2InvokeCount++
-                // Always return null, to indicate that we didn't find the item we were looking for.
-                null
-            }
+            returnValue1 =
+                parent?.layout<Int>(After) {
+                    block1InvokeCount++
+                    // Always return null, to indicate that we didn't find the item we were looking
+                    // for.
+                    null
+                }
+            returnValue2 =
+                parent?.layout<Int>(After) {
+                    block2InvokeCount++
+                    // Always return null, to indicate that we didn't find the item we were looking
+                    // for.
+                    null
+                }
         }
 
         // Assert.
@@ -246,33 +241,34 @@
         var returnValue2: Int? = null
         rule.setContent {
             Box(
-                Modifier
-                    .parentWithFiveNonVisibleItems()
-                    .modifierLocalConsumer {
-                        parent = ModifierLocalBeyondBoundsLayout.current
-                    }
+                Modifier.parentWithFiveNonVisibleItems().modifierLocalConsumer {
+                    parent = ModifierLocalBeyondBoundsLayout.current
+                }
             )
         }
 
         // Act.
         rule.runOnIdle {
             assertThat(parent).isNotNull()
-            returnValue1 = parent?.layout<Int>(direction) {
-                block1InvokeCount++
+            returnValue1 =
+                parent?.layout<Int>(direction) {
+                    block1InvokeCount++
 
-                if (!hasMoreContent) {
-                    // Re-entrant call.
-                    returnValue2 =
-                        parent?.layout<Int>(direction) {
-                            block2InvokeCount++
-                            // Always return null, to indicate that we didn't find the item we were looking for.
-                            null
-                        }
+                    if (!hasMoreContent) {
+                        // Re-entrant call.
+                        returnValue2 =
+                            parent?.layout<Int>(direction) {
+                                block2InvokeCount++
+                                // Always return null, to indicate that we didn't find the item we
+                                // were looking for.
+                                null
+                            }
+                    }
+
+                    // Always return null, to indicate that we didn't find the item we were looking
+                    // for.
+                    null
                 }
-
-                // Always return null, to indicate that we didn't find the item we were looking for.
-                null
-            }
         }
 
         // Assert.
@@ -303,12 +299,13 @@
                     var count = 5
                     var result: T? = null
                     while (count-- > 0 && result == null) {
-                        result = block.invoke(
-                            object : BeyondBoundsScope {
-                                override val hasMoreContent: Boolean
-                                    get() = count > 0
-                            }
-                        )
+                        result =
+                            block.invoke(
+                                object : BeyondBoundsScope {
+                                    override val hasMoreContent: Boolean
+                                        get() = count > 0
+                                }
+                            )
                     }
                     return result
                 }
diff --git a/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/layout/Helpers.kt b/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/layout/Helpers.kt
index 146a10d..d6a155c 100644
--- a/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/layout/Helpers.kt
+++ b/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/layout/Helpers.kt
@@ -74,9 +74,7 @@
     val delegate = MeasureAndLayoutDelegate(root)
     root.attach(FakeOwner(delegate, createLayer))
     if (firstMeasureCompleted) {
-        delegate.updateRootConstraints(
-            defaultRootConstraints()
-        )
+        delegate.updateRootConstraints(defaultRootConstraints())
         Truth.assertThat(delegate.measureAndLayout()).isTrue()
     }
     return delegate
@@ -133,7 +131,8 @@
 
     override val modifierLocalManager: ModifierLocalManager = ModifierLocalManager(this)
 
-    override val dragAndDropManager: DragAndDropManager get() = TODO("Not yet implemented")
+    override val dragAndDropManager: DragAndDropManager
+        get() = TODO("Not yet implemented")
 
     override fun registerOnEndApplyChangesListener(listener: () -> Unit) {
         TODO("Not yet implemented")
@@ -149,34 +148,45 @@
 
     override fun onLayoutChange(layoutNode: LayoutNode) {}
 
-    @OptIn(InternalCoreApi::class)
-    override var showLayoutBounds: Boolean = false
+    @OptIn(InternalCoreApi::class) override var showLayoutBounds: Boolean = false
 
     override fun onAttach(node: LayoutNode) {}
+
     override fun onDetach(node: LayoutNode) {}
 
     override val root: LayoutNode
         get() = TODO("Not yet implemented")
+
     override val sharedDrawScope: LayoutNodeDrawScope
         get() = TODO("Not yet implemented")
+
     override val rootForTest: RootForTest
         get() = TODO("Not yet implemented")
+
     override val hapticFeedBack: HapticFeedback
         get() = TODO("Not yet implemented")
+
     override val inputModeManager: InputModeManager
         get() = TODO("Not yet implemented")
+
     override val clipboardManager: ClipboardManager
         get() = TODO("Not yet implemented")
+
     override val accessibilityManager: AccessibilityManager
         get() = TODO("Not yet implemented")
+
     override val graphicsContext: GraphicsContext
         get() = TODO("Not yet implemented")
+
     override val textToolbar: TextToolbar
         get() = TODO("Not yet implemented")
+
     override val density: Density
         get() = TODO("Not yet implemented")
+
     override val textInputService: TextInputService
         get() = TODO("Not yet implemented")
+
     override val softwareKeyboardController: SoftwareKeyboardController
         get() = TODO("Not yet implemented")
 
@@ -200,8 +210,10 @@
 
     override val pointerIconService: PointerIconService
         get() = TODO("Not yet implemented")
+
     override val focusOwner: FocusOwner
         get() = TODO("Not yet implemented")
+
     override val windowInfo: WindowInfo
         get() = TODO("Not yet implemented")
 
@@ -212,16 +224,22 @@
     @Suppress("OverridingDeprecatedMember", "DEPRECATION")
     override val fontLoader: Font.ResourceLoader
         get() = TODO("Not yet implemented")
+
     override val fontFamilyResolver: FontFamily.Resolver
         get() = TODO("Not yet implemented")
+
     override val layoutDirection: LayoutDirection
         get() = LayoutDirection.Ltr
+
     override val viewConfiguration: ViewConfiguration
         get() = TODO("Not yet implemented")
+
     override val autofillTree: AutofillTree
         get() = TODO("Not yet implemented")
+
     override val autofill: Autofill
         get() = TODO("Not yet implemented")
+
     override val semanticAutofill: SemanticAutofill?
         get() = TODO("Not yet implemented")
 
@@ -236,9 +254,13 @@
     }
 
     override fun calculatePositionInWindow(localPosition: Offset) = TODO("Not yet implemented")
+
     override fun calculateLocalPosition(positionInWindow: Offset) = TODO("Not yet implemented")
+
     override fun requestFocus() = TODO("Not yet implemented")
+
     override fun onSemanticsChange() {}
+
     override fun getFocusDirection(keyEvent: KeyEvent) = TODO("Not yet implemented")
 }
 
@@ -292,28 +314,19 @@
     Truth.assertThat(node.layoutPending).isTrue()
 }
 
-internal fun assertRemeasured(
-    modifier: SpyLayoutModifier,
-    block: () -> Unit
-) {
+internal fun assertRemeasured(modifier: SpyLayoutModifier, block: () -> Unit) {
     val measuresCountBefore = modifier.measuresCount
     block()
     Truth.assertThat(modifier.measuresCount).isEqualTo(measuresCountBefore + 1)
 }
 
-internal fun assertNotRemeasured(
-    modifier: SpyLayoutModifier,
-    block: () -> Unit
-) {
+internal fun assertNotRemeasured(modifier: SpyLayoutModifier, block: () -> Unit) {
     val measuresCountBefore = modifier.measuresCount
     block()
     Truth.assertThat(modifier.measuresCount).isEqualTo(measuresCountBefore)
 }
 
-internal fun assertRelaidOut(
-    modifier: SpyLayoutModifier,
-    block: () -> Unit
-) {
+internal fun assertRelaidOut(modifier: SpyLayoutModifier, block: () -> Unit) {
     val layoutsCountBefore = modifier.layoutsCount
     block()
     Truth.assertThat(modifier.layoutsCount).isEqualTo(layoutsCountBefore + 1)
@@ -361,8 +374,10 @@
     (measurePolicy as SmartMeasurePolicy).shouldClearPreLayoutCallback = once
 }
 
-internal val LayoutNode.first: LayoutNode get() = children.first()
-internal val LayoutNode.second: LayoutNode get() = children[1]
+internal val LayoutNode.first: LayoutNode
+    get() = children.first()
+internal val LayoutNode.second: LayoutNode
+    get() = children[1]
 internal val LayoutNode.measuresCount: Int
     get() = (measurePolicy as SmartMeasurePolicy).measuresCount
 internal val LayoutNode.layoutsCount: Int
@@ -400,8 +415,10 @@
 internal abstract class SmartMeasurePolicy : LayoutNode.NoIntrinsicsMeasurePolicy("") {
     var measuresCount = 0
         protected set
+
     var layoutsCount = 0
         protected set
+
     open var wrapChildren = false
     open var queryAlignmentLinesDuringMeasure = false
     var preMeasureCallback: (() -> Unit)? = null
@@ -410,6 +427,7 @@
     var shouldClearPreLayoutCallback = false
     var measuredLayoutDirection: LayoutDirection? = null
         protected set
+
     var childrenLayoutDirection: LayoutDirection? = null
 
     // child size is used when null
@@ -428,15 +446,14 @@
         if (shouldClearPreMeasureCallback) {
             preMeasureCallback = null
         }
-        val childConstraints = if (size == null) {
-            constraints
-        } else {
-            val size = size!!
-            constraints.copy(maxWidth = size, maxHeight = size)
-        }
-        val placeables = measurables.map {
-            it.measure(childConstraints)
-        }
+        val childConstraints =
+            if (size == null) {
+                constraints
+            } else {
+                val size = size!!
+                constraints.copy(maxWidth = size, maxHeight = size)
+            }
+        val placeables = measurables.map { it.measure(childConstraints) }
         if (queryAlignmentLinesDuringMeasure) {
             placeables.forEach { it[TestAlignmentLine] }
         }
@@ -485,8 +502,7 @@
         set(value) {
             if (value) {
                 throw IllegalArgumentException(
-                    "MeasureInLayoutBlock cannot query alignment " +
-                        "lines during measure"
+                    "MeasureInLayoutBlock cannot query alignment " + "lines during measure"
                 )
             }
         }
@@ -500,12 +516,13 @@
         if (shouldClearPreMeasureCallback) {
             preMeasureCallback = null
         }
-        val childConstraints = if (size == null) {
-            constraints
-        } else {
-            val size = size!!
-            constraints.copy(maxWidth = size, maxHeight = size)
-        }
+        val childConstraints =
+            if (size == null) {
+                constraints
+            } else {
+                val size = size!!
+                constraints.copy(maxWidth = size, maxHeight = size)
+            }
         return layout(childConstraints.maxWidth, childConstraints.maxHeight) {
             preLayoutCallback?.invoke()
             if (shouldClearPreLayoutCallback) {
@@ -533,8 +550,7 @@
         set(value) {
             if (value) {
                 throw IllegalArgumentException(
-                    "MeasureInLayoutBlock cannot query alignment " +
-                        "lines during measure"
+                    "MeasureInLayoutBlock cannot query alignment " + "lines during measure"
                 )
             }
         }
@@ -583,38 +599,28 @@
 
     override fun isInLayer(position: Offset) = true
 
-    override fun move(position: IntOffset) {
-    }
+    override fun move(position: IntOffset) {}
 
-    override fun resize(size: IntSize) {
-    }
+    override fun resize(size: IntSize) {}
 
-    override fun drawLayer(canvas: Canvas, parentLayer: GraphicsLayer?) {
-    }
+    override fun drawLayer(canvas: Canvas, parentLayer: GraphicsLayer?) {}
 
-    override fun updateDisplayList() {
-    }
+    override fun updateDisplayList() {}
 
-    override fun invalidate() {
-    }
+    override fun invalidate() {}
 
-    override fun destroy() {
-    }
+    override fun destroy() {}
 
-    override fun mapBounds(rect: MutableRect, inverse: Boolean) {
-    }
+    override fun mapBounds(rect: MutableRect, inverse: Boolean) {}
 
     override fun reuseLayer(
         drawBlock: (canvas: Canvas, parentLayer: GraphicsLayer?) -> Unit,
         invalidateParentLayer: () -> Unit
-    ) {
-    }
+    ) {}
 
-    override fun transform(matrix: Matrix) {
-    }
+    override fun transform(matrix: Matrix) {}
 
-    override fun inverseTransform(matrix: Matrix) {
-    }
+    override fun inverseTransform(matrix: Matrix) {}
 
     override fun mapOffset(point: Offset, inverse: Boolean) = point
 }
diff --git a/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/layout/IntrinsicsMeasurementTest.kt b/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/layout/IntrinsicsMeasurementTest.kt
index d7e66fb..951ca37 100644
--- a/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/layout/IntrinsicsMeasurementTest.kt
+++ b/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/layout/IntrinsicsMeasurementTest.kt
@@ -39,12 +39,11 @@
 @MediumTest
 @RunWith(AndroidJUnit4::class)
 class IntrinsicsMeasurementTest {
-    @get:Rule
-    val rule = createAndroidComposeRule<ComponentActivity>()
+    @get:Rule val rule = createAndroidComposeRule<ComponentActivity>()
 
     /**
-     * When intrinsics are used for child content measurement and the content changes,
-     * then the intrinsics measurement should be triggered again.
+     * When intrinsics are used for child content measurement and the content changes, then the
+     * intrinsics measurement should be triggered again.
      */
     @Test
     fun intrinsicsChangeCausesParentRemeasure() {
@@ -62,17 +61,14 @@
                     }
                 }
             }
-            Layout(
-                content = content,
-                modifier = Modifier.onPlaced { coords = it }
-            ) { measurables, _ ->
+            Layout(content = content, modifier = Modifier.onPlaced { coords = it }) { measurables, _
+                ->
                 val intrinsicHeight = measurables[0].minIntrinsicHeight(Constraints.Infinity)
-                val placeable = measurables[0].measure(
-                    Constraints.fixedHeight((intrinsicHeight * 1.2).roundToInt())
-                )
-                layout(placeable.width, placeable.height) {
-                    placeable.place(0, 0)
-                }
+                val placeable =
+                    measurables[0].measure(
+                        Constraints.fixedHeight((intrinsicHeight * 1.2).roundToInt())
+                    )
+                layout(placeable.width, placeable.height) { placeable.place(0, 0) }
             }
         }
 
@@ -86,14 +82,12 @@
             showContent = true
         }
 
-        rule.runOnIdle {
-            assertThat(coords.size.height).isEqualTo(24)
-        }
+        rule.runOnIdle { assertThat(coords.size.height).isEqualTo(24) }
     }
 
     /**
-     * When intrinsics are used in the measure block, and measurement is in the layout block,
-     * and the content changes, then the intrinsics measurement should be triggered again.
+     * When intrinsics are used in the measure block, and measurement is in the layout block, and
+     * the content changes, then the intrinsics measurement should be triggered again.
      */
     @Test
     fun intrinsicsChangeCausesParentRemeasureWhenMeasuredInPlacement() {
@@ -111,16 +105,13 @@
                     }
                 }
             }
-            Layout(
-                content = content,
-                modifier = Modifier.onPlaced { coords = it }
-            ) { measurables, constraints ->
+            Layout(content = content, modifier = Modifier.onPlaced { coords = it }) {
+                measurables,
+                constraints ->
                 val width = if (constraints.hasBoundedWidth) constraints.maxWidth else 100
                 val height = (measurables[0].minIntrinsicHeight(width) * 1.2).roundToInt()
                 layout(width, height) {
-                    val placeable = measurables[0].measure(
-                        Constraints.fixed(width, height)
-                    )
+                    val placeable = measurables[0].measure(Constraints.fixed(width, height))
                     placeable.place(0, 0)
                 }
             }
@@ -136,14 +127,12 @@
             showContent = true
         }
 
-        rule.runOnIdle {
-            assertThat(coords.size.height).isEqualTo(24)
-        }
+        rule.runOnIdle { assertThat(coords.size.height).isEqualTo(24) }
     }
 
     /**
-     * When intrinsics are used for child content measurement inside the layout block
-     * and the content changes, then the intrinsics measurement should be triggered again.
+     * When intrinsics are used for child content measurement inside the layout block and the
+     * content changes, then the intrinsics measurement should be triggered again.
      */
     @Test
     fun intrinsicsUseInPlacementOnlyRelayout() {
@@ -163,9 +152,7 @@
                     }
                 }
             }
-            Layout(
-                content = content
-            ) { measurables, constraints ->
+            Layout(content = content) { measurables, constraints ->
                 val width = if (constraints.hasBoundedWidth) constraints.maxWidth else 100
                 val height = if (constraints.hasBoundedHeight) constraints.maxHeight else 100
                 measureCount++
@@ -173,9 +160,7 @@
                     placeCount++
                     val adjustedHeight =
                         (measurables[0].minIntrinsicHeight(width) * 1.2).roundToInt()
-                    val placeable = measurables[0].measure(
-                        Constraints.fixed(width, adjustedHeight)
-                    )
+                    val placeable = measurables[0].measure(Constraints.fixed(width, adjustedHeight))
                     placeable.place(0, 0)
                 }
             }
@@ -204,9 +189,9 @@
     }
 
     /**
-     * When intrinsics are used for child content measurement and the content changes,
-     * then the intrinsics measurement should be triggered again. This should work when the
-     * content is not a direct child of the intrinsic measurement.
+     * When intrinsics are used for child content measurement and the content changes, then the
+     * intrinsics measurement should be triggered again. This should work when the content is not a
+     * direct child of the intrinsic measurement.
      */
     @Test
     fun grandchildChangeCausesRemeasure() {
@@ -226,17 +211,14 @@
                     }
                 }
             }
-            Layout(
-                content = content,
-                modifier = Modifier.onPlaced { coords = it }
-            ) { measurables, _ ->
+            Layout(content = content, modifier = Modifier.onPlaced { coords = it }) { measurables, _
+                ->
                 val intrinsicHeight = measurables[0].minIntrinsicHeight(Constraints.Infinity)
-                val placeable = measurables[0].measure(
-                    Constraints.fixedHeight((intrinsicHeight * 1.2).roundToInt())
-                )
-                layout(placeable.width, placeable.height) {
-                    placeable.place(0, 0)
-                }
+                val placeable =
+                    measurables[0].measure(
+                        Constraints.fixedHeight((intrinsicHeight * 1.2).roundToInt())
+                    )
+                layout(placeable.width, placeable.height) { placeable.place(0, 0) }
             }
         }
 
@@ -250,15 +232,13 @@
             showContent = true
         }
 
-        rule.runOnIdle {
-            assertThat(coords.size.height).isEqualTo(24)
-        }
+        rule.runOnIdle { assertThat(coords.size.height).isEqualTo(24) }
     }
 
     /**
-     * When the intrinsics usage changes, the content should only be measured properly.
-     * In this case, the intrinsics is used in the measure block and then not used, so the
-     * content changing shouldn't cause measurement.
+     * When the intrinsics usage changes, the content should only be measured properly. In this
+     * case, the intrinsics is used in the measure block and then not used, so the content changing
+     * shouldn't cause measurement.
      */
     @Test
     fun intrinsicsUsageChanges() {
@@ -268,33 +248,30 @@
         var measureCount = 0
         var placeCount = 0
 
-        val sometimesIntrinsicsMeasurePolicy = object : MeasurePolicy {
-            override fun MeasureScope.measure(
-                measurables: List<Measurable>,
-                constraints: Constraints
-            ): MeasureResult {
-                if (useIntrinsics) {
-                    val placeable = measurables[0].measure(constraints)
-                    return layout(placeable.width, placeable.height) {
-                        placeable.place(0, 0)
+        val sometimesIntrinsicsMeasurePolicy =
+            object : MeasurePolicy {
+                override fun MeasureScope.measure(
+                    measurables: List<Measurable>,
+                    constraints: Constraints
+                ): MeasureResult {
+                    if (useIntrinsics) {
+                        val placeable = measurables[0].measure(constraints)
+                        return layout(placeable.width, placeable.height) { placeable.place(0, 0) }
                     }
+                    val placeable = measurables[0].measure(constraints)
+                    return layout(100, 100) { placeable.place(0, 0) }
                 }
-                val placeable = measurables[0].measure(constraints)
-                return layout(100, 100) {
-                    placeable.place(0, 0)
-                }
-            }
 
-            override fun IntrinsicMeasureScope.minIntrinsicHeight(
-                measurables: List<IntrinsicMeasurable>,
-                width: Int
-            ): Int {
-                if (useIntrinsics) {
-                    return measurables[0].minIntrinsicHeight(width)
+                override fun IntrinsicMeasureScope.minIntrinsicHeight(
+                    measurables: List<IntrinsicMeasurable>,
+                    width: Int
+                ): Int {
+                    if (useIntrinsics) {
+                        return measurables[0].minIntrinsicHeight(width)
+                    }
+                    return 100
                 }
-                return 100
             }
-        }
 
         rule.setContent {
             val content1: @Composable () -> Unit = {
@@ -308,19 +285,17 @@
                 }
             }
             val content2: @Composable () -> Unit = {
-                Box {
-                    Layout(content1, Modifier, sometimesIntrinsicsMeasurePolicy)
-                }
+                Box { Layout(content1, Modifier, sometimesIntrinsicsMeasurePolicy) }
             }
-            Layout(
-                content = content2,
-                modifier = Modifier.onPlaced { coords = it }
-            ) { measurables, _ ->
+            Layout(content = content2, modifier = Modifier.onPlaced { coords = it }) {
+                measurables,
+                _ ->
                 measureCount++
                 val intrinsicHeight = measurables[0].minIntrinsicHeight(Constraints.Infinity)
-                val placeable = measurables[0].measure(
-                    Constraints.fixedHeight((intrinsicHeight * 1.2).roundToInt())
-                )
+                val placeable =
+                    measurables[0].measure(
+                        Constraints.fixedHeight((intrinsicHeight * 1.2).roundToInt())
+                    )
                 layout(placeable.width, placeable.height) {
                     placeCount++
                     placeable.place(0, 0)
@@ -364,9 +339,9 @@
     }
 
     /**
-     * When the intrinsics usage changes, the content should only be measured properly.
-     * In this case, the measure block and intrinsics change from using the child's size
-     * to not using the child's size for its own size.
+     * When the intrinsics usage changes, the content should only be measured properly. In this
+     * case, the measure block and intrinsics change from using the child's size to not using the
+     * child's size for its own size.
      */
     @Test
     fun intrinsicsUsageChangesInPlacement() {
@@ -375,33 +350,32 @@
         var measureCount = 0
         var placeCount = 0
 
-        val sometimesIntrinsicsMeasurePolicy = object : MeasurePolicy {
-            override fun MeasureScope.measure(
-                measurables: List<Measurable>,
-                constraints: Constraints
-            ): MeasureResult {
-                if (useIntrinsics) {
-                    val placeable = measurables[0].measure(constraints)
-                    return layout(placeable.width, placeable.height) {
+        val sometimesIntrinsicsMeasurePolicy =
+            object : MeasurePolicy {
+                override fun MeasureScope.measure(
+                    measurables: List<Measurable>,
+                    constraints: Constraints
+                ): MeasureResult {
+                    if (useIntrinsics) {
+                        val placeable = measurables[0].measure(constraints)
+                        return layout(placeable.width, placeable.height) { placeable.place(0, 0) }
+                    }
+                    return layout(100, 100) {
+                        val placeable = measurables[0].measure(constraints)
                         placeable.place(0, 0)
                     }
                 }
-                return layout(100, 100) {
-                    val placeable = measurables[0].measure(constraints)
-                    placeable.place(0, 0)
-                }
-            }
 
-            override fun IntrinsicMeasureScope.minIntrinsicHeight(
-                measurables: List<IntrinsicMeasurable>,
-                width: Int
-            ): Int {
-                if (useIntrinsics) {
-                    return measurables[0].minIntrinsicHeight(width)
+                override fun IntrinsicMeasureScope.minIntrinsicHeight(
+                    measurables: List<IntrinsicMeasurable>,
+                    width: Int
+                ): Int {
+                    if (useIntrinsics) {
+                        return measurables[0].minIntrinsicHeight(width)
+                    }
+                    return 100
                 }
-                return 100
             }
-        }
 
         rule.setContent {
             val content1: @Composable () -> Unit = {
@@ -419,16 +393,15 @@
             val content2: @Composable () -> Unit = {
                 Layout(content1, Modifier, sometimesIntrinsicsMeasurePolicy)
             }
-            Layout(
-                content = content2
-            ) { measurables, _ ->
+            Layout(content = content2) { measurables, _ ->
                 measureCount++
                 layout(100, 100) {
                     placeCount++
                     val intrinsicHeight = measurables[0].minIntrinsicHeight(Constraints.Infinity)
-                    val placeable = measurables[0].measure(
-                        Constraints.fixedHeight((intrinsicHeight * 1.2).roundToInt())
-                    )
+                    val placeable =
+                        measurables[0].measure(
+                            Constraints.fixedHeight((intrinsicHeight * 1.2).roundToInt())
+                        )
                     placeable.place(0, 0)
                 }
             }
@@ -467,8 +440,8 @@
     }
 
     /**
-     * The parent starts off using intrinsics in the measure block and then switches to
-     * using it in the layout block.
+     * The parent starts off using intrinsics in the measure block and then switches to using it in
+     * the layout block.
      */
     @Test
     fun changeIntrinsicsUsageFromMeasureToLayout() {
@@ -496,30 +469,28 @@
             ) { measurables, _ ->
                 if (intrinsicsInMeasure) {
                     val intrinsicHeight = measurables[0].minIntrinsicHeight(Constraints.Infinity)
-                    val placeable = measurables[0].measure(
-                        Constraints.fixedHeight((intrinsicHeight * 1.2).roundToInt())
-                    )
-                    layout(placeable.width, placeable.height) {
-                        placeable.place(0, 0)
-                    }
+                    val placeable =
+                        measurables[0].measure(
+                            Constraints.fixedHeight((intrinsicHeight * 1.2).roundToInt())
+                        )
+                    layout(placeable.width, placeable.height) { placeable.place(0, 0) }
                 } else {
                     measureCount++
                     layout(100, 100) {
                         placeCount++
                         val intrinsicHeight =
                             measurables[0].minIntrinsicHeight(Constraints.Infinity)
-                        val placeable = measurables[0].measure(
-                            Constraints.fixedHeight((intrinsicHeight * 1.2).roundToInt())
-                        )
+                        val placeable =
+                            measurables[0].measure(
+                                Constraints.fixedHeight((intrinsicHeight * 1.2).roundToInt())
+                            )
                         placeable.place(0, 0)
                     }
                 }
             }
         }
 
-        rule.runOnIdle {
-            intrinsicsInMeasure = false
-        }
+        rule.runOnIdle { intrinsicsInMeasure = false }
 
         rule.runOnIdle {
             assertThat(coords.size.height).isEqualTo(24)
@@ -547,23 +518,23 @@
     @Test
     fun measureWidthTooLarge() {
         var exception: IllegalStateException? = null
-        val measurePolicy: MeasurePolicy = object : MeasurePolicy {
-            override fun MeasureScope.measure(
-                measurables: List<Measurable>,
-                constraints: Constraints
-            ): MeasureResult {
-                return layout(0, 0) {}
-            }
+        val measurePolicy: MeasurePolicy =
+            object : MeasurePolicy {
+                override fun MeasureScope.measure(
+                    measurables: List<Measurable>,
+                    constraints: Constraints
+                ): MeasureResult {
+                    return layout(0, 0) {}
+                }
 
-            override fun IntrinsicMeasureScope.maxIntrinsicWidth(
-                measurables: List<IntrinsicMeasurable>,
-                height: Int
-            ): Int = 1 shl 24
-        }
+                override fun IntrinsicMeasureScope.maxIntrinsicWidth(
+                    measurables: List<IntrinsicMeasurable>,
+                    height: Int
+                ): Int = 1 shl 24
+            }
         rule.setContent {
             Layout(
-                Modifier
-                    .layout { measurable, _ ->
+                Modifier.layout { measurable, _ ->
                         try {
                             measurable.maxIntrinsicWidth(100)
                         } catch (e: IllegalStateException) {
@@ -573,10 +544,10 @@
                     }
                     .layout { m, c ->
                         val p = m.measure(c)
-                        layout(p.width, p.height) {
-                            p.place(0, 0)
-                        }
-                    }, measurePolicy = measurePolicy)
+                        layout(p.width, p.height) { p.place(0, 0) }
+                    },
+                measurePolicy = measurePolicy
+            )
         }
         rule.waitForIdle()
         assertThat(exception).isNotNull()
@@ -585,23 +556,23 @@
     @Test
     fun measureHeightTooLarge() {
         var exception: IllegalStateException? = null
-        val measurePolicy: MeasurePolicy = object : MeasurePolicy {
-            override fun MeasureScope.measure(
-                measurables: List<Measurable>,
-                constraints: Constraints
-            ): MeasureResult {
-                return layout(0, 0) {}
-            }
+        val measurePolicy: MeasurePolicy =
+            object : MeasurePolicy {
+                override fun MeasureScope.measure(
+                    measurables: List<Measurable>,
+                    constraints: Constraints
+                ): MeasureResult {
+                    return layout(0, 0) {}
+                }
 
-            override fun IntrinsicMeasureScope.maxIntrinsicHeight(
-                measurables: List<IntrinsicMeasurable>,
-                width: Int
-            ): Int = 1 shl 24
-        }
+                override fun IntrinsicMeasureScope.maxIntrinsicHeight(
+                    measurables: List<IntrinsicMeasurable>,
+                    width: Int
+                ): Int = 1 shl 24
+            }
         rule.setContent {
             Layout(
-                Modifier
-                    .layout { measurable, _ ->
+                Modifier.layout { measurable, _ ->
                         try {
                             measurable.maxIntrinsicHeight(100)
                         } catch (e: IllegalStateException) {
@@ -611,10 +582,9 @@
                     }
                     .layout { m, c ->
                         val p = m.measure(c)
-                        layout(p.width, p.height) {
-                            p.place(0, 0)
-                        }
-                    }, measurePolicy = measurePolicy
+                        layout(p.width, p.height) { p.place(0, 0) }
+                    },
+                measurePolicy = measurePolicy
             )
         }
         rule.waitForIdle()
diff --git a/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/layout/LayoutCooperationTest.kt b/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/layout/LayoutCooperationTest.kt
index 01365b8..11a1da4 100644
--- a/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/layout/LayoutCooperationTest.kt
+++ b/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/layout/LayoutCooperationTest.kt
@@ -46,35 +46,27 @@
 @MediumTest
 @RunWith(AndroidJUnit4::class)
 class LayoutCooperationTest {
-    @get:Rule
-    val rule = createAndroidComposeRule<ComponentActivity>()
+    @get:Rule val rule = createAndroidComposeRule<ComponentActivity>()
 
     @Test
     @SdkSuppress(minSdkVersion = Build.VERSION_CODES.O)
-    fun whenConstraintsChangeButSizeDoesNot() = with(rule.density) {
-        val size = 48
-        var initialOuterSize by mutableStateOf((size / 2).toDp())
-        rule.setContent {
-            Box(
-                Modifier
-                    .size(initialOuterSize)
-                    .testTag("outer")) {
-                Box(
-                    Modifier
-                        .requiredSize(size.toDp())
-                        .background(Color.Yellow))
+    fun whenConstraintsChangeButSizeDoesNot() =
+        with(rule.density) {
+            val size = 48
+            var initialOuterSize by mutableStateOf((size / 2).toDp())
+            rule.setContent {
+                Box(Modifier.size(initialOuterSize).testTag("outer")) {
+                    Box(Modifier.requiredSize(size.toDp()).background(Color.Yellow))
+                }
+            }
+
+            rule.runOnIdle { initialOuterSize = size.toDp() }
+
+            rule.onNodeWithTag("outer").captureToImage().assertPixels(IntSize(size, size)) {
+                Color.Yellow
             }
         }
 
-        rule.runOnIdle {
-            initialOuterSize = size.toDp()
-        }
-
-        rule.onNodeWithTag("outer").captureToImage().assertPixels(IntSize(size, size)) {
-            Color.Yellow
-        }
-    }
-
     @Test
     fun relayoutSkippingModifiersDoesntBreakCooperation() {
         with(rule.density) {
@@ -85,32 +77,32 @@
             val heightDp = height.toDp()
             var offset by mutableStateOf(0)
             rule.setContent {
-                Layout(content = {
-                    Box(Modifier.requiredSize(widthDp, heightDp)) {
-                        Box(Modifier.testTag("child"))
+                Layout(
+                    content = {
+                        Box(Modifier.requiredSize(widthDp, heightDp)) {
+                            Box(Modifier.testTag("child"))
+                        }
                     }
-                }) { measurables, _ ->
+                ) { measurables, _ ->
                     val placeable =
                         measurables.first().measure(Constraints.fixed(containerSize, containerSize))
-                    layout(containerSize, containerSize) {
-                        placeable.place(offset, offset)
-                    }
+                    layout(containerSize, containerSize) { placeable.place(offset, offset) }
                 }
             }
 
             var expectedTop = ((containerSize - height) / 2).toDp()
             var expectedLeft = ((containerSize - width) / 2).toDp()
-            rule.onNodeWithTag("child")
+            rule
+                .onNodeWithTag("child")
                 .assertTopPositionInRootIsEqualTo(expectedTop)
                 .assertLeftPositionInRootIsEqualTo(expectedLeft)
 
-            rule.runOnIdle {
-                offset = 10
-            }
+            rule.runOnIdle { offset = 10 }
 
             expectedTop += offset.toDp()
             expectedLeft += offset.toDp()
-            rule.onNodeWithTag("child")
+            rule
+                .onNodeWithTag("child")
                 .assertTopPositionInRootIsEqualTo(expectedTop)
                 .assertLeftPositionInRootIsEqualTo(expectedLeft)
         }
diff --git a/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/layout/LayoutNodeDensityTest.kt b/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/layout/LayoutNodeDensityTest.kt
index 2bae7f6..11aa4a4 100644
--- a/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/layout/LayoutNodeDensityTest.kt
+++ b/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/layout/LayoutNodeDensityTest.kt
@@ -49,8 +49,7 @@
 @RunWith(AndroidJUnit4::class)
 class LayoutNodeDensityTest {
 
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
     @Test
     fun compositionLocalDensityChangeTriggersRemeasure() {
@@ -177,27 +176,23 @@
     fun densityChangeRequestsLayerOutlineUpdate() {
         var density by mutableStateOf(Density(2f))
         var lastOutlineDensity: Density? = null
-        val shape = object : Shape {
-            override fun createOutline(
-                size: Size,
-                layoutDirection: LayoutDirection,
-                density: Density
-            ): Outline {
-                lastOutlineDensity = density
-                return Outline.Rectangle(size.toRect())
+        val shape =
+            object : Shape {
+                override fun createOutline(
+                    size: Size,
+                    layoutDirection: LayoutDirection,
+                    density: Density
+                ): Outline {
+                    lastOutlineDensity = density
+                    return Outline.Rectangle(size.toRect())
+                }
             }
-        }
         rule.setContent {
-            CompositionLocalProvider(
-                LocalDensity provides density
-            ) {
+            CompositionLocalProvider(LocalDensity provides density) {
                 Box(
-                    Modifier
-                        .layout { measurable, _ ->
+                    Modifier.layout { measurable, _ ->
                             val placeable = measurable.measure(Constraints.fixed(100, 100))
-                            layout(placeable.width, placeable.height) {
-                                placeable.place(0, 0)
-                            }
+                            layout(placeable.width, placeable.height) { placeable.place(0, 0) }
                         }
                         .graphicsLayer(shape = shape, clip = true)
                 )
@@ -209,8 +204,6 @@
             density = Density(2.5f)
         }
 
-        rule.runOnIdle {
-            Truth.assertThat(lastOutlineDensity).isEqualTo(density)
-        }
+        rule.runOnIdle { Truth.assertThat(lastOutlineDensity).isEqualTo(density) }
     }
 }
diff --git a/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/layout/LayoutNodeLayoutDirectionTest.kt b/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/layout/LayoutNodeLayoutDirectionTest.kt
index 0589ea4..9a8d9e5 100644
--- a/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/layout/LayoutNodeLayoutDirectionTest.kt
+++ b/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/layout/LayoutNodeLayoutDirectionTest.kt
@@ -49,8 +49,7 @@
 @RunWith(AndroidJUnit4::class)
 class LayoutNodeLayoutDirectionTest {
 
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
     @Test
     fun compositionLocalLayoutDirectionChangeTriggersRemeasure() {
@@ -72,9 +71,7 @@
             localLayoutDirection = LayoutDirection.Rtl
         }
 
-        rule.runOnIdle {
-            Assert.assertEquals(localLayoutDirection, measureScopeLayoutDirection)
-        }
+        rule.runOnIdle { Assert.assertEquals(localLayoutDirection, measureScopeLayoutDirection) }
     }
 
     @Test
@@ -82,9 +79,7 @@
         var localLayoutDirection by mutableStateOf(LayoutDirection.Ltr)
 
         var drawScopeLayoutDirection: LayoutDirection? = null
-        val drawBlock: DrawScope.() -> Unit = {
-            drawScopeLayoutDirection = layoutDirection
-        }
+        val drawBlock: DrawScope.() -> Unit = { drawScopeLayoutDirection = layoutDirection }
         rule.setContent {
             CompositionLocalProvider(LocalLayoutDirection provides localLayoutDirection) {
                 Canvas(Modifier.fillMaxSize(), onDraw = drawBlock)
@@ -96,9 +91,7 @@
             localLayoutDirection = LayoutDirection.Rtl
         }
 
-        rule.runOnIdle {
-            Assert.assertEquals(localLayoutDirection, drawScopeLayoutDirection)
-        }
+        rule.runOnIdle { Assert.assertEquals(localLayoutDirection, drawScopeLayoutDirection) }
     }
 
     @Test
@@ -106,9 +99,7 @@
         var localLayoutDirection by mutableStateOf(LayoutDirection.Ltr)
 
         var drawScopeLayoutDirection: LayoutDirection? = null
-        val drawBlock: DrawScope.() -> Unit = {
-            drawScopeLayoutDirection = layoutDirection
-        }
+        val drawBlock: DrawScope.() -> Unit = { drawScopeLayoutDirection = layoutDirection }
         rule.setContent {
             CompositionLocalProvider(LocalLayoutDirection provides localLayoutDirection) {
                 Spacer(Modifier.fillMaxSize().graphicsLayer().drawBehind(drawBlock))
@@ -120,9 +111,7 @@
             localLayoutDirection = LayoutDirection.Rtl
         }
 
-        rule.runOnIdle {
-            Assert.assertEquals(localLayoutDirection, drawScopeLayoutDirection)
-        }
+        rule.runOnIdle { Assert.assertEquals(localLayoutDirection, drawScopeLayoutDirection) }
     }
 
     @Test
@@ -130,9 +119,7 @@
         var localLayoutDirection by mutableStateOf(LayoutDirection.Ltr)
 
         var drawScopeLayoutDirection: LayoutDirection? = null
-        val drawBlock: DrawScope.() -> Unit = {
-            drawScopeLayoutDirection = layoutDirection
-        }
+        val drawBlock: DrawScope.() -> Unit = { drawScopeLayoutDirection = layoutDirection }
         rule.setContent {
             CompositionLocalProvider(LocalLayoutDirection provides localLayoutDirection) {
                 Spacer(Modifier.fillMaxSize().drawBehind(drawBlock).graphicsLayer())
@@ -144,36 +131,30 @@
             localLayoutDirection = LayoutDirection.Rtl
         }
 
-        rule.runOnIdle {
-            Assert.assertEquals(localLayoutDirection, drawScopeLayoutDirection)
-        }
+        rule.runOnIdle { Assert.assertEquals(localLayoutDirection, drawScopeLayoutDirection) }
     }
 
     @Test
     fun layoutDirectionChangeRequestsLayerOutlineUpdate() {
         var layoutDirection by mutableStateOf(LayoutDirection.Ltr)
         var lastLayoutDirection: LayoutDirection? = null
-        val shape = object : Shape {
-            override fun createOutline(
-                size: Size,
-                layoutDirection: LayoutDirection,
-                density: Density
-            ): Outline {
-                lastLayoutDirection = layoutDirection
-                return Outline.Rectangle(size.toRect())
+        val shape =
+            object : Shape {
+                override fun createOutline(
+                    size: Size,
+                    layoutDirection: LayoutDirection,
+                    density: Density
+                ): Outline {
+                    lastLayoutDirection = layoutDirection
+                    return Outline.Rectangle(size.toRect())
+                }
             }
-        }
         rule.setContent {
-            CompositionLocalProvider(
-                LocalLayoutDirection provides layoutDirection
-            ) {
+            CompositionLocalProvider(LocalLayoutDirection provides layoutDirection) {
                 Box(
-                    Modifier
-                        .layout { measurable, _ ->
+                    Modifier.layout { measurable, _ ->
                             val placeable = measurable.measure(Constraints.fixed(100, 100))
-                            layout(placeable.width, placeable.height) {
-                                placeable.place(0, 0)
-                            }
+                            layout(placeable.width, placeable.height) { placeable.place(0, 0) }
                         }
                         .graphicsLayer(shape = shape, clip = true)
                 )
@@ -185,8 +166,6 @@
             layoutDirection = LayoutDirection.Rtl
         }
 
-        rule.runOnIdle {
-            Truth.assertThat(lastLayoutDirection).isEqualTo(layoutDirection)
-        }
+        rule.runOnIdle { Truth.assertThat(lastLayoutDirection).isEqualTo(layoutDirection) }
     }
 }
diff --git a/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/layout/LookaheadScopeTest.kt b/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/layout/LookaheadScopeTest.kt
index 1cf158d..e84ce07 100644
--- a/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/layout/LookaheadScopeTest.kt
+++ b/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/layout/LookaheadScopeTest.kt
@@ -122,11 +122,9 @@
 @MediumTest
 @RunWith(AndroidJUnit4::class)
 class LookaheadScopeTest {
-    @get:Rule
-    val rule = createAndroidComposeRule<ComponentActivity>()
+    @get:Rule val rule = createAndroidComposeRule<ComponentActivity>()
 
-    @get:Rule
-    val excessiveAssertions = AndroidOwnerExtraAssertionsRule()
+    @get:Rule val excessiveAssertions = AndroidOwnerExtraAssertionsRule()
 
     private var testFinished = true
 
@@ -154,33 +152,34 @@
         }
 
         val root = node {
-            add(LayoutNode(isVirtual = true).apply {
-                isVirtualLookaheadRoot = true
-                add(node {
-                    generateRandomPlaceOrder()
-                    add(nodeList[0])
-                    add(LayoutNode(isVirtual = true).apply {
-                        repeat(4) {
-                            add(nodeList[it + 1])
-                        }
-                    })
-                    add(LayoutNode(isVirtual = true).apply {
-                        repeat(5) {
-                            add(nodeList[5 + it])
-                        }
-                    })
-                    measurePolicy = MeasurePolicy { measurables, constraints ->
-                        assertEquals(10, measurables.size)
-                        val placeables = measurables.fastMap { it.measure(constraints) }
-                        assertEquals(10, placeables.size)
-                        layout(100, 100) {
-                            placementOrder.fastForEach { id ->
-                                placeables[id].place(0, 0)
+            add(
+                LayoutNode(isVirtual = true).apply {
+                    isVirtualLookaheadRoot = true
+                    add(
+                        node {
+                            generateRandomPlaceOrder()
+                            add(nodeList[0])
+                            add(
+                                LayoutNode(isVirtual = true).apply {
+                                    repeat(4) { add(nodeList[it + 1]) }
+                                }
+                            )
+                            add(
+                                LayoutNode(isVirtual = true).apply {
+                                    repeat(5) { add(nodeList[5 + it]) }
+                                }
+                            )
+                            measurePolicy = MeasurePolicy { measurables, constraints ->
+                                assertEquals(10, measurables.size)
+                                val placeables = measurables.fastMap { it.measure(constraints) }
+                                assertEquals(10, placeables.size)
+                                layout(100, 100) {
+                                    placementOrder.fastForEach { id -> placeables[id].place(0, 0) }
+                                }
                             }
                         }
-                    }
-                })
-            }
+                    )
+                }
             )
         }
         val delegate = createDelegate(root)
@@ -197,13 +196,14 @@
 
     @Test
     fun defaultIntermediateMeasurePolicyInSubcomposeLayout() {
-        val expectedSizes = listOf(
-            IntSize(200, 100),
-            IntSize(400, 300),
-            IntSize(100, 500),
-            IntSize(20, 5),
-            IntSize(90, 120)
-        )
+        val expectedSizes =
+            listOf(
+                IntSize(200, 100),
+                IntSize(400, 300),
+                IntSize(100, 500),
+                IntSize(20, 5),
+                IntSize(90, 120)
+            )
         val targetSize = IntSize(260, 350)
         var actualSize by mutableStateOf(IntSize.Zero)
         var actualTargetSize by mutableStateOf(IntSize.Zero)
@@ -212,44 +212,41 @@
         rule.setContent {
             CompositionLocalProvider(LocalDensity provides Density(1f)) {
                 SubcomposeLayout(
-                    Modifier
-                        .requiredSize(targetSize.width.dp, targetSize.height.dp)
-                        .createIntermediateElement(object : TestApproachLayoutModifierNode() {
-                            override fun isMeasurementApproachInProgress(
-                                lookaheadSize: IntSize
-                            ): Boolean {
-                                return iteration <= 6
-                            }
+                    Modifier.requiredSize(targetSize.width.dp, targetSize.height.dp)
+                        .createIntermediateElement(
+                            object : TestApproachLayoutModifierNode() {
+                                override fun isMeasurementApproachInProgress(
+                                    lookaheadSize: IntSize
+                                ): Boolean {
+                                    return iteration <= 6
+                                }
 
-                            @ExperimentalComposeUiApi
-                            override fun ApproachMeasureScope.approachMeasure(
-                                measurable: Measurable,
-                                constraints: Constraints
-                            ): MeasureResult {
-                                val intermediateConstraints = Constraints.fixed(
-                                    expectedSizes[iteration].width,
-                                    expectedSizes[iteration].height
-                                )
-                                return measurable
-                                    .measure(intermediateConstraints)
-                                    .run {
+                                @ExperimentalComposeUiApi
+                                override fun ApproachMeasureScope.approachMeasure(
+                                    measurable: Measurable,
+                                    constraints: Constraints
+                                ): MeasureResult {
+                                    val intermediateConstraints =
+                                        Constraints.fixed(
+                                            expectedSizes[iteration].width,
+                                            expectedSizes[iteration].height
+                                        )
+                                    return measurable.measure(intermediateConstraints).run {
                                         layout(width, height) { place(0, 0) }
                                     }
+                                }
                             }
-                        })
+                        )
                 ) { constraints ->
-                    val placeable = subcompose(0) {
-                        Box(Modifier.fillMaxSize())
-                    }[0].measure(constraints)
+                    val placeable =
+                        subcompose(0) { Box(Modifier.fillMaxSize()) }[0].measure(constraints)
                     val size = placeable.run { IntSize(width, height) }
                     if (!isLookingAhead) {
                         actualSize = size
                     } else {
                         actualTargetSize = size
                     }
-                    layout(size.width, size.height) {
-                        placeable.place(0, 0)
-                    }
+                    layout(size.width, size.height) { placeable.place(0, 0) }
                 }
             }
         }
@@ -275,21 +272,17 @@
                 LookaheadScope {
                     Row(if (isLarge) Modifier.size(200.dp) else Modifier.size(50.dp, 100.dp)) {
                         Box(
-                            Modifier
-                                .fillMaxHeight()
+                            Modifier.fillMaxHeight()
                                 .weight(2f)
-                                .onSizeChanged {
-                                    size1 = it
-                                }
-                                .animateSize())
+                                .onSizeChanged { size1 = it }
+                                .animateSize()
+                        )
                         Box(
-                            Modifier
-                                .fillMaxHeight()
+                            Modifier.fillMaxHeight()
                                 .weight(3f)
-                                .onSizeChanged {
-                                    size2 = it
-                                }
-                                .animateSize())
+                                .onSizeChanged { size2 = it }
+                                .animateSize()
+                        )
                     }
                 }
             }
@@ -325,22 +318,21 @@
                 LookaheadScope {
                     CompositionLocalProvider(LocalLayoutDirection provides LayoutDirection.Rtl) {
                         Box(
-                            Modifier
-                                .size(200.dp)
+                            Modifier.size(200.dp)
                                 .layout { measurable, _ ->
                                     val size = if (isLookingAhead) 300 else 200
                                     val constraints = Constraints.fixed(size, size)
                                     val p = measurable.measure(constraints)
-                                    layout(size, size) {
-                                        p.place(0, 0)
-                                    }
+                                    layout(size, size) { p.place(0, 0) }
                                 }
                                 .wrapContentWidth(Alignment.Start)
                                 .layout { measurable, constraints ->
                                     val p = measurable.measure(constraints)
                                     layout(p.width, p.height) {
-                                        val pos = coordinates!!.parentCoordinates!!
-                                            .localPositionOf(coordinates!!, Offset.Zero)
+                                        val pos =
+                                            coordinates!!
+                                                .parentCoordinates!!
+                                                .localPositionOf(coordinates!!, Offset.Zero)
                                         if (isLookingAhead) {
                                             lookaheadChildPosition = pos
                                         } else {
@@ -371,25 +363,22 @@
     private fun Modifier.animateSize(): Modifier = composed {
         var anim: Animatable<IntSize, AnimationVector2D>? by remember { mutableStateOf(null) }
         val scope = rememberCoroutineScope()
-        this.approachLayout(
-            { lookaheadSize ->
-                val animation = anim ?: Animatable(lookaheadSize, IntSize.VectorConverter)
-                anim = animation
-                animation.targetValue != lookaheadSize || animation.isRunning
-            }
-        ) { measurable, _ ->
-            anim = anim?.apply {
-                scope.launch {
-                    if (lookaheadSize != targetValue) {
-                        animateTo(lookaheadSize, tween(200))
+        this.approachLayout({ lookaheadSize ->
+            val animation = anim ?: Animatable(lookaheadSize, IntSize.VectorConverter)
+            anim = animation
+            animation.targetValue != lookaheadSize || animation.isRunning
+        }) { measurable, _ ->
+            anim =
+                anim?.apply {
+                    scope.launch {
+                        if (lookaheadSize != targetValue) {
+                            animateTo(lookaheadSize, tween(200))
+                        }
                     }
-                }
-            } ?: Animatable(lookaheadSize, IntSize.VectorConverter)
+                } ?: Animatable(lookaheadSize, IntSize.VectorConverter)
             val (width, height) = anim!!.value
             val placeable = measurable.measure(Constraints.fixed(width, height))
-            layout(placeable.width, placeable.height) {
-                placeable.place(0, 0)
-            }
+            layout(placeable.width, placeable.height) { placeable.place(0, 0) }
         }
     }
 
@@ -416,39 +405,42 @@
             // parentLookaheadMeasure -> childLookaheadMeasure -> parentMeasure -> childMeasure
             // -> parentLookaheadPlace -> childLookaheadPlace -> -> parentPlace -> childPlace
             // Each event should happen exactly once in the end.
-            Box(Modifier.layout(
-                measureWithLambdas(
-                    preMeasure = { rootPreMeasure = ++counter },
-                    postMeasure = { rootPostMeasure = ++counter },
-                    prePlacement = { rootPrePlace = ++counter },
-                    postPlacement = { rootPostPlace = ++counter }
+            Box(
+                Modifier.layout(
+                    measureWithLambdas(
+                        preMeasure = { rootPreMeasure = ++counter },
+                        postMeasure = { rootPostMeasure = ++counter },
+                        prePlacement = { rootPrePlace = ++counter },
+                        postPlacement = { rootPostPlace = ++counter }
+                    )
                 )
-            )) {
+            ) {
                 MyLookaheadLayout {
                     Box(
-                        Modifier
-                            .padding(top = 100.dp)
+                        Modifier.padding(top = 100.dp)
                             .fillMaxSize()
-                            .createIntermediateElement(object :
-                                TestApproachLayoutModifierNode() {
+                            .createIntermediateElement(
+                                object : TestApproachLayoutModifierNode() {
 
-                                override fun isMeasurementApproachInProgress(
-                                    lookaheadSize: IntSize
-                                ): Boolean {
-                                    return rootPostPlace < 12
-                                }
+                                    override fun isMeasurementApproachInProgress(
+                                        lookaheadSize: IntSize
+                                    ): Boolean {
+                                        return rootPostPlace < 12
+                                    }
 
-                                @ExperimentalComposeUiApi
-                                override fun ApproachMeasureScope.approachMeasure(
-                                    measurable: Measurable,
-                                    constraints: Constraints
-                                ): MeasureResult {
-                                    return measureWithLambdas(
-                                        preMeasure = { parentMeasure = ++counter },
-                                        prePlacement = { parentPlace = ++counter }
-                                    ).invoke(this, measurable, constraints)
+                                    @ExperimentalComposeUiApi
+                                    override fun ApproachMeasureScope.approachMeasure(
+                                        measurable: Measurable,
+                                        constraints: Constraints
+                                    ): MeasureResult {
+                                        return measureWithLambdas(
+                                                preMeasure = { parentMeasure = ++counter },
+                                                prePlacement = { parentPlace = ++counter }
+                                            )
+                                            .invoke(this, measurable, constraints)
+                                    }
                                 }
-                            })
+                            )
                             .layout(
                                 measureWithLambdas(
                                     preMeasure = {
@@ -469,50 +461,51 @@
                         MyLookaheadLayout {
                             Column {
                                 Box(
-                                    Modifier
-                                        .size(100.dp)
+                                    Modifier.size(100.dp)
                                         .background(Color.Red)
-                                        .createIntermediateElement(object :
-                                            TestApproachLayoutModifierNode() {
+                                        .createIntermediateElement(
+                                            object : TestApproachLayoutModifierNode() {
 
-                                            override fun isMeasurementApproachInProgress(
-                                                lookaheadSize: IntSize
-                                            ): Boolean {
-                                                return rootPostPlace < 12
-                                            }
-
-                                            @ExperimentalComposeUiApi
-                                            override fun
-                                                ApproachMeasureScope.approachMeasure(
-                                                measurable: Measurable,
-                                                constraints: Constraints
-                                            ): MeasureResult {
-                                                return measureWithLambdas(
-                                                    preMeasure = { childMeasure = ++counter },
-                                                    prePlacement = { childPlace = ++counter }
-                                                ).invoke(this, measurable, constraints)
-                                            }
-                                        })
-                                        .layout(
-                                            measure = measureWithLambdas(
-                                                preMeasure = {
-                                                    if (childLookaheadMeasure == 0) {
-                                                        childLookaheadMeasure = ++counter
-                                                    }
-                                                },
-                                                prePlacement = {
-                                                    if (childLookaheadPlace == 0) {
-                                                        childLookaheadPlace = ++counter
-                                                    }
+                                                override fun isMeasurementApproachInProgress(
+                                                    lookaheadSize: IntSize
+                                                ): Boolean {
+                                                    return rootPostPlace < 12
                                                 }
-                                            )
+
+                                                @ExperimentalComposeUiApi
+                                                override fun ApproachMeasureScope.approachMeasure(
+                                                    measurable: Measurable,
+                                                    constraints: Constraints
+                                                ): MeasureResult {
+                                                    return measureWithLambdas(
+                                                            preMeasure = {
+                                                                childMeasure = ++counter
+                                                            },
+                                                            prePlacement = {
+                                                                childPlace = ++counter
+                                                            }
+                                                        )
+                                                        .invoke(this, measurable, constraints)
+                                                }
+                                            }
+                                        )
+                                        .layout(
+                                            measure =
+                                                measureWithLambdas(
+                                                    preMeasure = {
+                                                        if (childLookaheadMeasure == 0) {
+                                                            childLookaheadMeasure = ++counter
+                                                        }
+                                                    },
+                                                    prePlacement = {
+                                                        if (childLookaheadPlace == 0) {
+                                                            childLookaheadPlace = ++counter
+                                                        }
+                                                    }
+                                                )
                                         )
                                 )
-                                Box(
-                                    Modifier
-                                        .size(100.dp)
-                                        .background(Color.Green)
-                                )
+                                Box(Modifier.size(100.dp).background(Color.Green))
                             }
                         }
                     }
@@ -558,21 +551,25 @@
                             Modifier.layout(measureWithLambdas(postMeasure = { parentSize = it }))
                         ) {
                             MyLookaheadLayout {
-                                Box(modifier = Modifier
-                                    .approachLayout(
-                                        isMeasurementApproachInProgress = { scaleFactor <= 3f }
-                                    ) { measurable, constraints ->
-                                        assertEquals(width, lookaheadSize.width)
-                                        assertEquals(height, lookaheadSize.height)
-                                        val placeable = measurable.measure(constraints)
-                                        layout(
-                                            (scaleFactor * width).roundToInt(),
-                                            (scaleFactor * height).roundToInt()
-                                        ) {
-                                            placeable.place(0, 0)
-                                        }
-                                    }
-                                    .size(width.dp, height.dp))
+                                Box(
+                                    modifier =
+                                        Modifier.approachLayout(
+                                                isMeasurementApproachInProgress = {
+                                                    scaleFactor <= 3f
+                                                }
+                                            ) { measurable, constraints ->
+                                                assertEquals(width, lookaheadSize.width)
+                                                assertEquals(height, lookaheadSize.height)
+                                                val placeable = measurable.measure(constraints)
+                                                layout(
+                                                    (scaleFactor * width).roundToInt(),
+                                                    (scaleFactor * height).roundToInt()
+                                                ) {
+                                                    placeable.place(0, 0)
+                                                }
+                                            }
+                                            .size(width.dp, height.dp)
+                                )
                             }
                         }
                         Spacer(modifier = Modifier.size(20.dp))
@@ -625,18 +622,20 @@
                         )
                     )
                 ) {
-                    Layout(measurePolicy = defaultMeasurePolicy, content = {
-                        Box(
-                            Modifier
-                                .size(if (isSmall) 100.dp else 200.dp)
-                                .layout(
-                                    measureWithLambdas(
-                                        postMeasure = { controlGroupMeasure++ },
-                                        postPlacement = { controlGroupPlace++ },
+                    Layout(
+                        measurePolicy = defaultMeasurePolicy,
+                        content = {
+                            Box(
+                                Modifier.size(if (isSmall) 100.dp else 200.dp)
+                                    .layout(
+                                        measureWithLambdas(
+                                            postMeasure = { controlGroupMeasure++ },
+                                            postPlacement = { controlGroupPlace++ },
+                                        )
                                     )
-                                )
-                        )
-                    })
+                            )
+                        }
+                    )
                 }
             } else {
                 Box(
@@ -649,8 +648,7 @@
                 ) {
                     MyLookaheadLayout {
                         Box(
-                            Modifier
-                                .size(if (isSmall) 100.dp else 200.dp)
+                            Modifier.size(if (isSmall) 100.dp else 200.dp)
                                 .animateSize()
                                 .layout(
                                     measureWithLambdas(
@@ -660,9 +658,10 @@
                                 )
                                 .intermediateLayout { measurable, constraints ->
                                     measureWithLambdas(
-                                        postMeasure = { measure++ },
-                                        postPlacement = { place++ }
-                                    ).invoke(this, measurable, constraints)
+                                            postMeasure = { measure++ },
+                                            postPlacement = { place++ }
+                                        )
+                                        .invoke(this, measurable, constraints)
                                 }
                         )
                     }
@@ -704,9 +703,7 @@
         // Pump frames so that animation triggered measurements are not completely dependent on
         // system timing.
         rule.mainClock.autoAdvance = false
-        rule.runOnIdle {
-            isSmall = !isSmall
-        }
+        rule.runOnIdle { isSmall = !isSmall }
         repeat(10) {
             rule.mainClock.advanceTimeByFrame()
             rule.waitForIdle()
@@ -732,32 +729,22 @@
             CompositionLocalProvider(LocalDensity provides Density(1f)) {
                 LookaheadScope {
                     SubcomposeLayout(
-                        Modifier
-                            .size(150.dp)
-                            .intermediateLayout { measurable, _ ->
-                                measurable
-                                    .measure(Constraints(0, 2000, 0, 2000))
-                                    .run {
-                                        defaultIntermediateMeasureSize = IntSize(width, height)
-                                        layout(width, height) {
-                                            place(0, 0)
-                                        }
-                                    }
+                        Modifier.size(150.dp).intermediateLayout { measurable, _ ->
+                            measurable.measure(Constraints(0, 2000, 0, 2000)).run {
+                                defaultIntermediateMeasureSize = IntSize(width, height)
+                                layout(width, height) { place(0, 0) }
                             }
-                    ) { constraints ->
-                        val placeable = subcompose(Unit) {
-                            Box(Modifier.requiredSize(400.dp, 600.dp))
-                        }[0].measure(constraints)
-                        layout(500, 300) {
-                            placeable.place(0, 0)
                         }
+                    ) { constraints ->
+                        val placeable =
+                            subcompose(Unit) { Box(Modifier.requiredSize(400.dp, 600.dp)) }[0]
+                                .measure(constraints)
+                        layout(500, 300) { placeable.place(0, 0) }
                     }
                 }
             }
         }
-        rule.runOnIdle {
-            assertEquals(IntSize(500, 300), defaultIntermediateMeasureSize)
-        }
+        rule.runOnIdle { assertEquals(IntSize(500, 300), defaultIntermediateMeasureSize) }
     }
 
     @Test
@@ -777,8 +764,7 @@
                             }
                     ) {
                         Box(
-                            Modifier
-                                .fillMaxHeight()
+                            Modifier.fillMaxHeight()
                                 .weight(2f)
                                 .intermediateLayout { measurable, constraints ->
                                     child1LookaheadSize = lookaheadSize
@@ -787,8 +773,7 @@
                                 .animateSize()
                         )
                         Box(
-                            Modifier
-                                .fillMaxHeight()
+                            Modifier.fillMaxHeight()
                                 .weight(3f)
                                 .intermediateLayout { measurable, constraints ->
                                     child2LookaheadSize = lookaheadSize
@@ -820,9 +805,7 @@
             }
             rule.mainClock.advanceTimeByFrame()
         }
-        rule.runOnIdle {
-            isLarge = true
-        }
+        rule.runOnIdle { isLarge = true }
         rule.waitForIdle()
         rule.mainClock.advanceTimeByFrame()
 
@@ -847,36 +830,34 @@
             MyLookaheadLayout {
                 Row(Modifier.widthIn(100.dp, 200.dp)) {
                     Box(
-                        modifier = Modifier
-                            .intermediateLayout { measurable, constraints ->
-                                val placeable = measurable.measure(constraints)
-                                layout(placeable.width, placeable.height) {
-                                    // skip placement in the post-lookahead placement pass
+                        modifier =
+                            Modifier.intermediateLayout { measurable, constraints ->
+                                    val placeable = measurable.measure(constraints)
+                                    layout(placeable.width, placeable.height) {
+                                        // skip placement in the post-lookahead placement pass
+                                    }
                                 }
-                            }
-                            .weight(1f)
-                            .layout { measurable, constraints ->
-                                measureWithLambdas(
-                                    prePlacement = { child1TotalPlacement++ }
-                                ).invoke(this, measurable, constraints)
-                            }
-                            .intermediateLayout { measurable, constraints ->
-                                measureWithLambdas(prePlacement = { child1Placement++ })
-                                    .invoke(this, measurable, constraints)
-                            }
+                                .weight(1f)
+                                .layout { measurable, constraints ->
+                                    measureWithLambdas(prePlacement = { child1TotalPlacement++ })
+                                        .invoke(this, measurable, constraints)
+                                }
+                                .intermediateLayout { measurable, constraints ->
+                                    measureWithLambdas(prePlacement = { child1Placement++ })
+                                        .invoke(this, measurable, constraints)
+                                }
                     )
                     Box(
-                        modifier = Modifier
-                            .layout { measurable, constraints ->
-                                measureWithLambdas(
-                                    prePlacement = { child2TotalPlacement++ }
-                                ).invoke(this, measurable, constraints)
-                            }
-                            .intermediateLayout { measurable, constraints ->
-                                measureWithLambdas(prePlacement = { child2Placement++ })
-                                    .invoke(this, measurable, constraints)
-                            }
-                            .weight(3f)
+                        modifier =
+                            Modifier.layout { measurable, constraints ->
+                                    measureWithLambdas(prePlacement = { child2TotalPlacement++ })
+                                        .invoke(this, measurable, constraints)
+                                }
+                                .intermediateLayout { measurable, constraints ->
+                                    measureWithLambdas(prePlacement = { child2Placement++ })
+                                        .invoke(this, measurable, constraints)
+                                }
+                                .weight(3f)
                     )
                     Box(modifier = Modifier.sizeIn(50.dp))
                 }
@@ -904,17 +885,15 @@
         postPlacement: () -> Unit = {},
         content: @Composable LookaheadScope.() -> Unit
     ) {
-        Box(modifier.layout { measurable, constraints ->
-            measurable.measure(constraints).run {
-                postMeasure()
-                // Position the children.
-                layout(width, height) {
-                    place(0, 0)
-                }.apply {
-                    postPlacement()
+        Box(
+            modifier.layout { measurable, constraints ->
+                measurable.measure(constraints).run {
+                    postMeasure()
+                    // Position the children.
+                    layout(width, height) { place(0, 0) }.apply { postPlacement() }
                 }
             }
-        }) {
+        ) {
             LookaheadScope(content)
         }
     }
@@ -928,17 +907,16 @@
             MyLookaheadLayout {
                 Layout(
                     content = {
-                        Box(Modifier
-                            .intermediateLayout { measurable, constraints ->
-                                measureWithLambdas(prePlacement = {
-                                    placementCount++
-                                }).invoke(this, measurable, constraints)
-                            }
-                            .layout { measurable, constraints ->
-                                measureWithLambdas(prePlacement = {
-                                    totalPlacementCount++
-                                }).invoke(this, measurable, constraints)
-                            })
+                        Box(
+                            Modifier.intermediateLayout { measurable, constraints ->
+                                    measureWithLambdas(prePlacement = { placementCount++ })
+                                        .invoke(this, measurable, constraints)
+                                }
+                                .layout { measurable, constraints ->
+                                    measureWithLambdas(prePlacement = { totalPlacementCount++ })
+                                        .invoke(this, measurable, constraints)
+                                }
+                        )
                     }
                 ) { measurables, constraints ->
                     val placeables = measurables.map { it.measure(constraints) }
@@ -947,9 +925,7 @@
                     // Position the children.
                     layout(maxWidth, maxHeight) {
                         if (shouldPlace) {
-                            placeables.forEach {
-                                it.place(0, 0)
-                            }
+                            placeables.forEach { it.place(0, 0) }
                         }
                     }
                 }
@@ -983,26 +959,16 @@
                 verticalAlignment = Alignment.CenterVertically
             ) {
                 LookaheadScope {
-                    Box(
-                        Modifier
-                            .size(200.dp)
-                            .onPlaced { coords ->
-                                firstCoordinates = coords
-                            })
+                    Box(Modifier.size(200.dp).onPlaced { coords -> firstCoordinates = coords })
                 }
-                Box(
-                    Modifier
-                        .padding(top = 30.dp, start = 70.dp)
-                        .offset(40.dp, 60.dp)
-                ) {
+                Box(Modifier.padding(top = 30.dp, start = 70.dp).offset(40.dp, 60.dp)) {
                     LookaheadScope {
                         Box(
-                            Modifier
-                                .size(100.dp, 50.dp)
-                                .onPlaced { coords ->
-                                    secondCoordinates = coords
-                                    assertEqualOffset()
-                                })
+                            Modifier.size(100.dp, 50.dp).onPlaced { coords ->
+                                secondCoordinates = coords
+                                assertEqualOffset()
+                            }
+                        )
                     }
                 }
             }
@@ -1021,25 +987,18 @@
         rule.setContent {
             MyLookaheadLayout {
                 Row(
-                    Modifier
-                        .fillMaxSize()
-                        .onPlaced { it -> firstCoordinates = it },
+                    Modifier.fillMaxSize().onPlaced { it -> firstCoordinates = it },
                     horizontalArrangement = SpaceAround,
                     verticalAlignment = Alignment.CenterVertically
                 ) {
                     Box(Modifier.size(200.dp))
-                    Box(
-                        Modifier
-                            .padding(top = 30.dp, start = 70.dp)
-                            .offset(40.dp, 60.dp)
-                    ) {
+                    Box(Modifier.padding(top = 30.dp, start = 70.dp).offset(40.dp, 60.dp)) {
                         MyLookaheadLayout {
                             Box(
-                                Modifier
-                                    .size(100.dp, 50.dp)
-                                    .onPlaced { it ->
-                                        secondCoordinates = it
-                                    })
+                                Modifier.size(100.dp, 50.dp).onPlaced { it ->
+                                    secondCoordinates = it
+                                }
+                            )
                         }
                     }
                 }
@@ -1052,27 +1011,9 @@
         assertSameLayoutWithAndWithoutLookahead { modifier ->
             Box(modifier) {
                 Row(modifier.height(IntrinsicSize.Max)) {
-                    Box(
-                        modifier
-                            .fillMaxHeight()
-                            .weight(1f)
-                            .aspectRatio(2f)
-                            .background(Color.Gray)
-                    )
-                    Box(
-                        modifier
-                            .fillMaxHeight()
-                            .weight(1f)
-                            .width(1.dp)
-                            .background(Color.Black)
-                    )
-                    Box(
-                        modifier
-                            .fillMaxHeight()
-                            .weight(1f)
-                            .aspectRatio(1f)
-                            .background(Color.Blue)
-                    )
+                    Box(modifier.fillMaxHeight().weight(1f).aspectRatio(2f).background(Color.Gray))
+                    Box(modifier.fillMaxHeight().weight(1f).width(1.dp).background(Color.Black))
+                    Box(modifier.fillMaxHeight().weight(1f).aspectRatio(1f).background(Color.Blue))
                 }
             }
         }
@@ -1085,22 +1026,14 @@
                 Row(modifier.height(IntrinsicSize.Min)) {
                     Text(
                         text = "This is a really short text",
-                        modifier = modifier
-                            .weight(1f)
-                            .fillMaxHeight()
+                        modifier = modifier.weight(1f).fillMaxHeight()
                     )
-                    Box(
-                        modifier
-                            .width(1.dp)
-                            .fillMaxHeight()
-                            .background(Color.Black)
-                    )
+                    Box(modifier.width(1.dp).fillMaxHeight().background(Color.Black))
                     Text(
-                        text = "This is a much much much much much much much much much much" +
-                            " much much much much much much longer text",
-                        modifier = modifier
-                            .weight(1f)
-                            .fillMaxHeight()
+                        text =
+                            "This is a much much much much much much much much much much" +
+                                " much much much much much much longer text",
+                        modifier = modifier.weight(1f).fillMaxHeight()
                     )
                 }
             }
@@ -1110,29 +1043,10 @@
     @Test
     fun lookaheadMinWidthIntrinsicsTest() {
         assertSameLayoutWithAndWithoutLookahead { modifier ->
-            Column(
-                modifier
-                    .width(IntrinsicSize.Min)
-                    .wrapContentHeight()
-            ) {
-                Box(
-                    modifier = modifier
-                        .fillMaxWidth()
-                        .size(20.dp, 10.dp)
-                        .background(Color.Gray)
-                )
-                Box(
-                    modifier = modifier
-                        .fillMaxWidth()
-                        .size(30.dp, 10.dp)
-                        .background(Color.Blue)
-                )
-                Box(
-                    modifier = modifier
-                        .fillMaxWidth()
-                        .size(10.dp, 10.dp)
-                        .background(Color.Magenta)
-                )
+            Column(modifier.width(IntrinsicSize.Min).wrapContentHeight()) {
+                Box(modifier = modifier.fillMaxWidth().size(20.dp, 10.dp).background(Color.Gray))
+                Box(modifier = modifier.fillMaxWidth().size(30.dp, 10.dp).background(Color.Blue))
+                Box(modifier = modifier.fillMaxWidth().size(10.dp, 10.dp).background(Color.Magenta))
             }
         }
     }
@@ -1141,30 +1055,12 @@
     fun lookaheadMaxWidthIntrinsicsTest() {
         assertSameLayoutWithAndWithoutLookahead { modifier ->
             Box {
-                Column(
-                    modifier
-                        .width(IntrinsicSize.Max)
-                        .wrapContentHeight()
-                ) {
-                    Box(
-                        modifier
-                            .fillMaxWidth()
-                            .background(Color.Gray)
-                    ) {
-                        Text("Short text")
-                    }
-                    Box(
-                        modifier
-                            .fillMaxWidth()
-                            .background(Color.Blue)
-                    ) {
+                Column(modifier.width(IntrinsicSize.Max).wrapContentHeight()) {
+                    Box(modifier.fillMaxWidth().background(Color.Gray)) { Text("Short text") }
+                    Box(modifier.fillMaxWidth().background(Color.Blue)) {
                         Text("Extremely long text giving the width of its siblings")
                     }
-                    Box(
-                        modifier
-                            .fillMaxWidth()
-                            .background(Color.Magenta)
-                    ) {
+                    Box(modifier.fillMaxWidth().background(Color.Magenta)) {
                         Text("Medium length text")
                     }
                 }
@@ -1180,34 +1076,25 @@
             CompositionLocalProvider(LocalDensity provides Density(1f)) {
                 LookaheadScope {
                     Row(
-                        Modifier
-                            .height(IntrinsicSize.Max)
-                            .onGloballyPositioned {
-                                rowHeight = it.size.height
-                            }
+                        Modifier.height(IntrinsicSize.Max)
+                            .onGloballyPositioned { rowHeight = it.size.height }
                             .fillMaxWidth()
                     ) {
                         Box(
-                            Modifier
-                                .intermediateLayout { measurable, constraints ->
-                                    measurable
-                                        .measure(constraints)
-                                        .run {
-                                            layout(
-                                                lookaheadSize.width,
-                                                (lookaheadSize.height * fraction).roundToInt()
-                                            ) {
-                                                place(0, 0)
-                                            }
+                            Modifier.intermediateLayout { measurable, constraints ->
+                                    measurable.measure(constraints).run {
+                                        layout(
+                                            lookaheadSize.width,
+                                            (lookaheadSize.height * fraction).roundToInt()
+                                        ) {
+                                            place(0, 0)
                                         }
+                                    }
                                 }
                                 .width(5.dp)
-                                .requiredHeight(300.dp))
-                        Box(
-                            Modifier
-                                .requiredHeight(20.dp)
-                                .weight(1f)
+                                .requiredHeight(300.dp)
                         )
+                        Box(Modifier.requiredHeight(20.dp).weight(1f))
                     }
                 }
             }
@@ -1230,34 +1117,25 @@
             CompositionLocalProvider(LocalDensity provides Density(1f)) {
                 LookaheadScope {
                     Row(
-                        Modifier
-                            .height(IntrinsicSize.Min)
-                            .onGloballyPositioned {
-                                rowHeight = it.size.height
-                            }
+                        Modifier.height(IntrinsicSize.Min)
+                            .onGloballyPositioned { rowHeight = it.size.height }
                             .fillMaxWidth()
                     ) {
                         Box(
-                            Modifier
-                                .intermediateLayout { measurable, constraints ->
-                                    measurable
-                                        .measure(constraints)
-                                        .run {
-                                            layout(
-                                                lookaheadSize.width,
-                                                (lookaheadSize.height * fraction).roundToInt()
-                                            ) {
-                                                place(0, 0)
-                                            }
+                            Modifier.intermediateLayout { measurable, constraints ->
+                                    measurable.measure(constraints).run {
+                                        layout(
+                                            lookaheadSize.width,
+                                            (lookaheadSize.height * fraction).roundToInt()
+                                        ) {
+                                            place(0, 0)
                                         }
+                                    }
                                 }
                                 .width(5.dp)
-                                .requiredHeight(300.dp))
-                        Box(
-                            Modifier
-                                .requiredHeight(20.dp)
-                                .weight(1f)
+                                .requiredHeight(300.dp)
                         )
+                        Box(Modifier.requiredHeight(20.dp).weight(1f))
                     }
                 }
             }
@@ -1280,38 +1158,29 @@
             CompositionLocalProvider(LocalDensity provides Density(1f)) {
                 LookaheadScope {
                     Column(
-                        Modifier
-                            .width(IntrinsicSize.Min)
-                            .onGloballyPositioned {
-                                rowWidth = it.size.width
-                            }
+                        Modifier.width(IntrinsicSize.Min)
+                            .onGloballyPositioned { rowWidth = it.size.width }
                             .height(50.dp)
                     ) {
                         Box(
-                            Modifier
-                                .intermediateLayout { measurable, constraints ->
-                                    measurable
-                                        .measure(constraints)
-                                        .run {
-                                            layout(
-                                                (lookaheadSize.width * fraction).roundToInt(),
-                                                lookaheadSize.height
-                                            ) {
-                                                place(0, 0)
-                                            }
+                            Modifier.intermediateLayout { measurable, constraints ->
+                                    measurable.measure(constraints).run {
+                                        layout(
+                                            (lookaheadSize.width * fraction).roundToInt(),
+                                            lookaheadSize.height
+                                        ) {
+                                            place(0, 0)
                                         }
+                                    }
                                 }
-                                .requiredWidth(300.dp))
-                        Box(
-                            Modifier
-                                .requiredWidth(120.dp)
-                                .height(10.dp)
+                                .requiredWidth(300.dp)
                         )
+                        Box(Modifier.requiredWidth(120.dp).height(10.dp))
                         Text(
                             text =
-                            "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec" +
-                                " non felis euismod nunc commodo pharetra a nec eros. Sed varius," +
-                                " metus sed facilisis condimentum, orci orci aliquet arcu",
+                                "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec" +
+                                    " non felis euismod nunc commodo pharetra a nec eros. Sed varius," +
+                                    " metus sed facilisis condimentum, orci orci aliquet arcu",
                             Modifier.fillMaxWidth(),
                         )
                     }
@@ -1337,34 +1206,28 @@
             CompositionLocalProvider(LocalDensity provides Density(1f)) {
                 LookaheadScope {
                     Box(
-                        Modifier
-                            .height(50.dp)
-                            .width(IntrinsicSize.Max)
-                            .onGloballyPositioned {
-                                boxSize = it.size
-                            }) {
+                        Modifier.height(50.dp).width(IntrinsicSize.Max).onGloballyPositioned {
+                            boxSize = it.size
+                        }
+                    ) {
                         Box(
-                            Modifier
-                                .intermediateLayout { measurable, constraints ->
-                                    measurable
-                                        .measure(constraints)
-                                        .run {
-                                            layout(
-                                                (lookaheadSize.width * fraction).roundToInt(),
-                                                lookaheadSize.height
-                                            ) {
-                                                place(0, 0)
-                                            }
+                            Modifier.intermediateLayout { measurable, constraints ->
+                                    measurable.measure(constraints).run {
+                                        layout(
+                                            (lookaheadSize.width * fraction).roundToInt(),
+                                            lookaheadSize.height
+                                        ) {
+                                            place(0, 0)
                                         }
+                                    }
                                 }
-                                .requiredWidth(100.dp))
+                                .requiredWidth(100.dp)
+                        )
                         Box(
-                            Modifier
-                                .fillMaxWidth()
-                                .height(10.dp)
-                                .onGloballyPositioned {
-                                    childBoxSize = it.size
-                                })
+                            Modifier.fillMaxWidth().height(10.dp).onGloballyPositioned {
+                                childBoxSize = it.size
+                            }
+                        )
                     }
                 }
             }
@@ -1417,44 +1280,42 @@
                     overflow = FlowRowOverflow.Visible
                 ) {
                     Box(
-                        modifier = Modifier
-                            .animateContentSize()
-                            .widthIn(max = 600.dp)
-                            .background(Color.Red)
+                        modifier =
+                            Modifier.animateContentSize()
+                                .widthIn(max = 600.dp)
+                                .background(Color.Red)
                     ) {
                         val height = if (expanded) 500.dp else 300.dp
-                        Box(
-                            modifier = Modifier
-                                .fillMaxWidth()
-                                .height(height)
-                        )
+                        Box(modifier = Modifier.fillMaxWidth().height(height))
                     }
 
                     FlowColumn {
                         Box(
-                            modifier = Modifier
-                                .size(200.dp)
-                                .layout { measurable, constraints ->
-                                    val placeable = measurable.measure(constraints)
-                                    layout(placeable.width, placeable.height) {
-                                        val coords = coordinates
-                                        if (coords != null) {
-                                            if (isLookingAhead) {
-                                                lookaheadOffset = coords
-                                                    .findRootCoordinates()
-                                                    .localLookaheadPositionOf(coords)
-                                            } else {
-                                                actualOffset = coords
-                                                    .findRootCoordinates()
-                                                    .localPositionOf(coords, Offset.Zero)
+                            modifier =
+                                Modifier.size(200.dp)
+                                    .layout { measurable, constraints ->
+                                        val placeable = measurable.measure(constraints)
+                                        layout(placeable.width, placeable.height) {
+                                            val coords = coordinates
+                                            if (coords != null) {
+                                                if (isLookingAhead) {
+                                                    lookaheadOffset =
+                                                        coords
+                                                            .findRootCoordinates()
+                                                            .localLookaheadPositionOf(coords)
+                                                } else {
+                                                    actualOffset =
+                                                        coords
+                                                            .findRootCoordinates()
+                                                            .localPositionOf(coords, Offset.Zero)
+                                                }
                                             }
+                                            placeable.place(0, 0)
                                         }
-                                        placeable.place(0, 0)
                                     }
-                                }
-                                .wrapContentWidth()
-                                .heightIn(min = 156.dp)
-                                .background(Color.Blue)
+                                    .wrapContentWidth()
+                                    .heightIn(min = 156.dp)
+                                    .background(Color.Blue)
                         ) {
                             Box(modifier = Modifier.size(200.dp))
                         }
@@ -1462,9 +1323,7 @@
                 }
             }
         }
-        rule.runOnIdle {
-            expanded = !expanded
-        }
+        rule.runOnIdle { expanded = !expanded }
         rule.runOnIdle {
             assertNotNull(actualOffset)
             assertEquals(actualOffset, lookaheadOffset)
@@ -1482,52 +1341,48 @@
     @Test
     fun grandparentQueryBaseline() {
         assertSameLayoutWithAndWithoutLookahead { modifier ->
-            Layout(modifier = modifier, content = {
-                Row(
-                    modifier
-                        .fillMaxWidth()
-                        .wrapContentHeight()
-                        .background(Color(0xffb4c8ea)),
-                    horizontalArrangement = Arrangement.Center,
-                    verticalAlignment = Alignment.CenterVertically
-                ) {
-                    Text(
-                        text = "First",
-                        fontSize = 80.sp,
-                        color = Color.White,
-                        modifier = modifier
-                            .alignByBaseline()
-                            .background(color = Color(0xfff3722c), RoundedCornerShape(10))
-                    )
-                    Spacer(modifier.size(10.dp))
-                    Text(
-                        text = "Second",
-                        color = Color.White,
-                        fontSize = 30.sp,
-                        modifier = modifier
-                            .alignByBaseline()
-                            .background(color = Color(0xff90be6d), RoundedCornerShape(10))
-                    )
-                    Spacer(modifier.size(10.dp))
-                    Text(
-                        text = "Text",
-                        fontSize = 50.sp,
-                        color = Color.White,
-                        modifier = modifier
-                            .alignByBaseline()
-                            .background(color = Color(0xffffb900), RoundedCornerShape(10))
-                    )
+            Layout(
+                modifier = modifier,
+                content = {
+                    Row(
+                        modifier.fillMaxWidth().wrapContentHeight().background(Color(0xffb4c8ea)),
+                        horizontalArrangement = Arrangement.Center,
+                        verticalAlignment = Alignment.CenterVertically
+                    ) {
+                        Text(
+                            text = "First",
+                            fontSize = 80.sp,
+                            color = Color.White,
+                            modifier =
+                                modifier
+                                    .alignByBaseline()
+                                    .background(color = Color(0xfff3722c), RoundedCornerShape(10))
+                        )
+                        Spacer(modifier.size(10.dp))
+                        Text(
+                            text = "Second",
+                            color = Color.White,
+                            fontSize = 30.sp,
+                            modifier =
+                                modifier
+                                    .alignByBaseline()
+                                    .background(color = Color(0xff90be6d), RoundedCornerShape(10))
+                        )
+                        Spacer(modifier.size(10.dp))
+                        Text(
+                            text = "Text",
+                            fontSize = 50.sp,
+                            color = Color.White,
+                            modifier =
+                                modifier
+                                    .alignByBaseline()
+                                    .background(color = Color(0xffffb900), RoundedCornerShape(10))
+                        )
+                    }
+                    Spacer(modifier.fillMaxWidth().requiredHeight(1.dp).background(Color.Black))
                 }
-                Spacer(
-                    modifier
-                        .fillMaxWidth()
-                        .requiredHeight(1.dp)
-                        .background(Color.Black)
-                )
-            }) { measurables, constraints ->
-                val placeables = measurables.map {
-                    it.measure(constraints)
-                }
+            ) { measurables, constraints ->
+                val placeables = measurables.map { it.measure(constraints) }
                 val row = placeables.first()
                 val position = row[FirstBaseline]
                 layout(row.width, row.height) {
@@ -1554,20 +1409,18 @@
                         },
                         content = {
                             Box(
-                                Modifier
-                                    .intermediateLayout { measurable, constraints ->
-                                        measurable
-                                            .measure(constraints)
-                                            .run {
-                                                layout(width, height) {
-                                                    coordinates!!.transformFrom(
-                                                        lookaheadScopeCoordinates,
-                                                        matrix
-                                                    )
-                                                }
+                                Modifier.intermediateLayout { measurable, constraints ->
+                                        measurable.measure(constraints).run {
+                                            layout(width, height) {
+                                                coordinates!!.transformFrom(
+                                                    lookaheadScopeCoordinates,
+                                                    matrix
+                                                )
                                             }
+                                        }
                                     }
-                                    .size(10.dp))
+                                    .size(10.dp)
+                            )
                         }
                     )
                 }
@@ -1589,21 +1442,19 @@
                         movableContentOf {
                             LookaheadScope {
                                 Box(
-                                    Modifier
-                                        .layout { measurable, constraints ->
-                                            measurable
-                                                .measure(constraints)
-                                                .run {
-                                                    layout(width, height) {
-                                                        scopePositionInRoot =
-                                                            lookaheadScopeCoordinates
-                                                                .localToRoot(Offset.Zero)
-                                                                .round()
-                                                        place(0, 0)
-                                                    }
+                                    Modifier.layout { measurable, constraints ->
+                                            measurable.measure(constraints).run {
+                                                layout(width, height) {
+                                                    scopePositionInRoot =
+                                                        lookaheadScopeCoordinates
+                                                            .localToRoot(Offset.Zero)
+                                                            .round()
+                                                    place(0, 0)
                                                 }
+                                            }
                                         }
-                                        .size(200.dp))
+                                        .size(200.dp)
+                                )
                             }
                         }
                     }
@@ -1648,9 +1499,7 @@
         l1Node.add(l2Node)
         l2Node.add(l3Node)
 
-        rule.runOnIdle {
-            delegate.measureAndLayout()
-        }
+        rule.runOnIdle { delegate.measureAndLayout() }
         rule.runOnIdle {
             assertFalse(l1Node.measurePending)
             assertFalse(l1Node.lookaheadMeasurePending)
@@ -1712,9 +1561,7 @@
         l1Node.add(l2Node)
         l2Node.add(l3Node)
 
-        rule.runOnIdle {
-            delegate.measureAndLayout()
-        }
+        rule.runOnIdle { delegate.measureAndLayout() }
         rule.runOnIdle {
             assertFalse(l1Node.measurePending)
             assertFalse(l1Node.lookaheadMeasurePending)
@@ -1765,24 +1612,20 @@
                     val movableContent = remember {
                         movableContentOf {
                             Box(
-                                Modifier
-                                    .intermediateLayout { measurable, constraints ->
-                                        measurable
-                                            .measure(constraints)
-                                            .run {
-                                                layout(width, height) {
-                                                    coordinates?.let {
-                                                        positionInScope =
-                                                            lookaheadScopeCoordinates
-                                                                .localLookaheadPositionOf(
-                                                                    it
-                                                                )
-                                                                .round()
-                                                    }
+                                Modifier.intermediateLayout { measurable, constraints ->
+                                        measurable.measure(constraints).run {
+                                            layout(width, height) {
+                                                coordinates?.let {
+                                                    positionInScope =
+                                                        lookaheadScopeCoordinates
+                                                            .localLookaheadPositionOf(it)
+                                                            .round()
                                                 }
                                             }
+                                        }
                                     }
-                                    .size(200.dp))
+                                    .size(200.dp)
+                            )
                         }
                     }
                     Box {
@@ -1799,18 +1642,15 @@
                             movableContent()
                         }
                     }
-                    Box(Modifier
-                        .offset(50.dp, 50.dp)
-                        .intermediateLayout { measurable, constraints ->
-                            measurable
-                                .measure(constraints)
-                                .run {
-                                    layout(width, height) {
-                                        place(0, 0)
-                                    }
+                    Box(
+                        Modifier.offset(50.dp, 50.dp)
+                            .intermediateLayout { measurable, constraints ->
+                                measurable.measure(constraints).run {
+                                    layout(width, height) { place(0, 0) }
                                 }
-                        }
-                        .offset(60.dp, 60.dp)) {
+                            }
+                            .offset(60.dp, 60.dp)
+                    ) {
                         if (boxId == 3) {
                             movableContent()
                         }
@@ -1831,9 +1671,7 @@
 
     @Test
     fun nestedVirtualNodes() {
-        val root = node().also {
-            createDelegate(it)
-        }
+        val root = node().also { createDelegate(it) }
         val virtualGrandParent = LayoutNode(isVirtual = true)
         val virtualParent = LayoutNode(isVirtual = true)
         val child = node()
@@ -1870,47 +1708,52 @@
             Box(Modifier.offset(20.dp, 30.dp)) {
                 LookaheadScope {
                     Box(
-                        Modifier
-                            .offset(50.dp, 25.dp)
+                        Modifier.offset(50.dp, 25.dp)
                             .intermediateLayout { measurable, constraints ->
-                                measureWithLambdas(prePlacement = {
-                                    val outerLookaheadScopeCoords = with(this@LookaheadScope) {
-                                        lookaheadScopeCoordinates
+                                measureWithLambdas(
+                                    prePlacement = {
+                                        val outerLookaheadScopeCoords =
+                                            with(this@LookaheadScope) { lookaheadScopeCoordinates }
+                                        assertEquals(
+                                            outerLookaheadScopeCoords,
+                                            lookaheadScopeCoordinates
+                                        )
                                     }
-                                    assertEquals(
-                                        outerLookaheadScopeCoords,
-                                        lookaheadScopeCoordinates
-                                    )
-                                })(measurable, constraints)
+                                )(measurable, constraints)
                             }
                             .offset(15.dp, 20.dp)
                     ) {
                         LookaheadScope {
                             val innerLookaheadScope = this
                             Box(
-                                Modifier
-                                    .intermediateLayout { measurable, constraints ->
-                                        measureWithLambdas(prePlacement = {
-                                            val innerLookaheadCoords = with(innerLookaheadScope) {
-                                                lookaheadScopeCoordinates
+                                Modifier.intermediateLayout { measurable, constraints ->
+                                        measureWithLambdas(
+                                            prePlacement = {
+                                                val innerLookaheadCoords =
+                                                    with(innerLookaheadScope) {
+                                                        lookaheadScopeCoordinates
+                                                    }
+                                                assertEquals(
+                                                    innerLookaheadCoords,
+                                                    lookaheadScopeCoordinates
+                                                )
                                             }
-                                            assertEquals(
-                                                innerLookaheadCoords,
-                                                lookaheadScopeCoordinates
-                                            )
-                                        })(measurable, constraints)
+                                        )(measurable, constraints)
                                     }
                                     .size(50.dp)
                                     .intermediateLayout { measurable, constraints ->
-                                        measureWithLambdas(prePlacement = {
-                                            val innerLookaheadCoords = with(innerLookaheadScope) {
-                                                lookaheadScopeCoordinates
+                                        measureWithLambdas(
+                                            prePlacement = {
+                                                val innerLookaheadCoords =
+                                                    with(innerLookaheadScope) {
+                                                        lookaheadScopeCoordinates
+                                                    }
+                                                assertEquals(
+                                                    innerLookaheadCoords,
+                                                    lookaheadScopeCoordinates
+                                                )
                                             }
-                                            assertEquals(
-                                                innerLookaheadCoords,
-                                                lookaheadScopeCoordinates
-                                            )
-                                        })(measurable, constraints)
+                                        )(measurable, constraints)
                                     }
                             )
                         }
@@ -1938,25 +1781,19 @@
                     LookaheadScope {
                         LookaheadScope {
                             Box(
-                                Modifier
-                                    .offset(offset1().x.dp, offset1().y.dp)
+                                Modifier.offset(offset1().x.dp, offset1().y.dp)
                                     .onGloballyPositioned {
                                         actualSize1 = it.size
-                                        actualOffset1 = it
-                                            .localToRoot(Offset.Zero)
-                                            .round()
+                                        actualOffset1 = it.localToRoot(Offset.Zero).round()
                                     }
                                     .size(size1().dp)
                             )
                         }
                         Box(
-                            Modifier
-                                .offset(offset2().x.dp, offset2().y.dp)
+                            Modifier.offset(offset2().x.dp, offset2().y.dp)
                                 .onGloballyPositioned {
                                     actualSize2 = it.size
-                                    actualOffset2 = it
-                                        .localToRoot(Offset.Zero)
-                                        .round()
+                                    actualOffset2 = it.localToRoot(Offset.Zero).round()
                                 }
                                 .size(size2().dp)
                         )
@@ -1995,38 +1832,46 @@
         rule.setContent {
             LookaheadScope {
                 SubcomposeLayout { incomingConstraints ->
-                    val constraints = if (isLookingAhead) {
-                        lookaheadConstraints = incomingConstraints
-                        incomingConstraints
-                    } else {
-                        lookaheadConstraints!!
-                    }
+                    val constraints =
+                        if (isLookingAhead) {
+                            lookaheadConstraints = incomingConstraints
+                            incomingConstraints
+                        } else {
+                            lookaheadConstraints!!
+                        }
 
                     val placeables = mutableListOf<Placeable>()
                     repeat(3) { id ->
                         subcompose(id) {
-                            Box(Modifier.trackMainPassPlacement {
-                                iteration.toString() // state read to make callback called
-                                actualPlacementOrder.add(id)
-                            })
-                        }.fastMap { it.measure(constraints) }.let { placeables.addAll(it) }
+                                Box(
+                                    Modifier.trackMainPassPlacement {
+                                        iteration.toString() // state read to make callback called
+                                        actualPlacementOrder.add(id)
+                                    }
+                                )
+                            }
+                            .fastMap { it.measure(constraints) }
+                            .let { placeables.addAll(it) }
                     }
                     layout(100, 100) {
                         val allPlaceables = mutableListOf<Placeable>().apply { addAll(placeables) }
                         repeat(3) { index ->
                             val id = index + 3
                             subcompose(id) {
-                                Box(Modifier.trackMainPassPlacement {
-                                    iteration.toString() // state read to make callback called
-                                    actualPlacementOrder.add(id)
-                                })
-                            }.fastMap { it.measure(constraints) }.let { allPlaceables.addAll(it) }
+                                    Box(
+                                        Modifier.trackMainPassPlacement {
+                                            iteration
+                                                .toString() // state read to make callback called
+                                            actualPlacementOrder.add(id)
+                                        }
+                                    )
+                                }
+                                .fastMap { it.measure(constraints) }
+                                .let { allPlaceables.addAll(it) }
                         }
                         // Start lookahead placement
                         assertEquals(6, allPlaceables.size)
-                        expectedPlacementOrder.fastForEach {
-                            allPlaceables[it].place(0, 0)
-                        }
+                        expectedPlacementOrder.fastForEach { allPlaceables[it].place(0, 0) }
                     }
                 }
             }
@@ -2067,16 +1912,14 @@
 
     @Test
     fun subcomposeLayoutInLookahead() {
-        val expectedConstraints = mutableStateListOf(
-            Constraints.fixed(100, 800),
-            Constraints.fixed(300, 400),
-            Constraints.fixed(1000, 200)
-        )
-        val expectedPlacements = mutableStateListOf(
-            IntOffset(-50, 1200),
-            IntOffset.Zero,
-            IntOffset(800, -200)
-        )
+        val expectedConstraints =
+            mutableStateListOf(
+                Constraints.fixed(100, 800),
+                Constraints.fixed(300, 400),
+                Constraints.fixed(1000, 200)
+            )
+        val expectedPlacements =
+            mutableStateListOf(IntOffset(-50, 1200), IntOffset.Zero, IntOffset(800, -200))
 
         val actualConstraints = arrayOfNulls<Constraints?>(3)
         val actualPlacements = arrayOfNulls<IntOffset?>(3)
@@ -2086,33 +1929,29 @@
                     val placeables = mutableVectorOf<Placeable>()
                     repeat(3) {
                         subcompose(it) {
-                            Box(
-                                Modifier
-                                    .intermediateLayout { measurable, constraints ->
-                                        actualConstraints[it] = constraints
-                                        val placeable = measurable.measure(constraints)
-                                        layout(placeable.width, placeable.height) {
-                                            actualPlacements[it] =
-                                                lookaheadScopeCoordinates
-                                                    .localLookaheadPositionOf(
-                                                        coordinates!!.toLookaheadCoordinates()
-                                                    )
-                                                    .round()
-                                            placeable.place(0, 0)
+                                Box(
+                                    Modifier.intermediateLayout { measurable, constraints ->
+                                            actualConstraints[it] = constraints
+                                            val placeable = measurable.measure(constraints)
+                                            layout(placeable.width, placeable.height) {
+                                                actualPlacements[it] =
+                                                    lookaheadScopeCoordinates
+                                                        .localLookaheadPositionOf(
+                                                            coordinates!!.toLookaheadCoordinates()
+                                                        )
+                                                        .round()
+                                                placeable.place(0, 0)
+                                            }
                                         }
-                                    }
-                                    .fillMaxSize())
-                            // This is intentionally left not placed, to check for crash.
-                            Box(Modifier.size(200.dp))
-                        }[0].measure(expectedConstraints[it]).let {
-                            placeables.add(it)
-                        }
+                                        .fillMaxSize()
+                                )
+                                // This is intentionally left not placed, to check for crash.
+                                Box(Modifier.size(200.dp))
+                            }[0]
+                            .measure(expectedConstraints[it])
+                            .let { placeables.add(it) }
                     }
-                    layout(100, 100) {
-                        repeat(3) {
-                            placeables[it].place(expectedPlacements[it])
-                        }
-                    }
+                    layout(100, 100) { repeat(3) { placeables[it].place(expectedPlacements[it]) } }
                 }
             }
         }
@@ -2141,15 +1980,14 @@
                             // This box will get a remeasure request when `iterations` changes.
                             // Subsequently this Box's size change will trigger a measurement pass
                             // from Column.
-                            Box(Modifier.intermediateLayout { measurable, _ ->
-                                // Force a state-read (similar to animation but more reliable)
-                                measurable.measure(Constraints.fixed(200 + 100 * iterations, 200))
-                                    .run {
-                                        layout(width, height) {
-                                            place(0, 0)
-                                        }
-                                    }
-                            }) {
+                            Box(
+                                Modifier.intermediateLayout { measurable, _ ->
+                                    // Force a state-read (similar to animation but more reliable)
+                                    measurable
+                                        .measure(Constraints.fixed(200 + 100 * iterations, 200))
+                                        .run { layout(width, height) { place(0, 0) } }
+                                }
+                            ) {
                                 Box(Modifier.size(100.dp))
                             }
                             Box { // forceMeasureSubtree starts here
@@ -2166,19 +2004,19 @@
                                 }
                             }
                             Box(
-                                Modifier
-                                    .size(100.dp)
-                                    .intermediateLayout { measurable, constraints ->
-                                        measurable
-                                            .measure(constraints)
-                                            .run {
-                                                layout(width, height) {
-                                                    lookaheadPosition = lookaheadScopeCoordinates
-                                                        .localLookaheadPositionOf(coordinates!!)
-                                                    place(0, 0)
-                                                }
-                                            }
-                                    })
+                                Modifier.size(100.dp).intermediateLayout { measurable, constraints
+                                    ->
+                                    measurable.measure(constraints).run {
+                                        layout(width, height) {
+                                            lookaheadPosition =
+                                                lookaheadScopeCoordinates.localLookaheadPositionOf(
+                                                    coordinates!!
+                                                )
+                                            place(0, 0)
+                                        }
+                                    }
+                                }
+                            )
                         }
                     }
                 }
@@ -2202,71 +2040,78 @@
             CompositionLocalProvider(LocalDensity provides Density(1f)) {
                 // Mutate this state in measure
                 Box(Modifier.fillMaxSize()) {
-                    val size by produceState(initialValue = 200) {
-                        delay(500)
-                        value = 600 - value
-                    }
-                    LazyColumn(Modifier.layout { measurable, _ ->
-                        // Mutate this state in measure. This state will later be used in descendant's
-                        // composition.
-                        show = size > 300
-                        measurable.measure(Constraints.fixed(size, size)).run {
-                            layout(width, height) { place(0, 0) }
+                    val size by
+                        produceState(initialValue = 200) {
+                            delay(500)
+                            value = 600 - value
                         }
-                    }) {
+                    LazyColumn(
+                        Modifier.layout { measurable, _ ->
+                            // Mutate this state in measure. This state will later be used in
+                            // descendant's
+                            // composition.
+                            show = size > 300
+                            measurable.measure(Constraints.fixed(size, size)).run {
+                                layout(width, height) { place(0, 0) }
+                            }
+                        }
+                    ) {
                         item {
                             SubcomposeLayout(Modifier.fillMaxSize()) {
-                                val placeable = subcompose(Unit) {
-                                    // read the value to force a recomposition
-                                    Box(
-                                        Modifier.requiredSize(222.dp)
-                                    ) {
-                                        LookaheadScope {
-                                            AnimatedContent(show, Modifier.requiredSize(200.dp)) {
-                                                if (it) {
-                                                    Row(
-                                                        Modifier
-                                                            .fillMaxSize()
-                                                            .layout { measurable, constraints ->
-                                                                val p =
-                                                                    measurable.measure(constraints)
-                                                                layout(p.width, p.height) {
-                                                                    coordinates
-                                                                        ?.positionInRoot()
-                                                                        .let {
-                                                                            if (isLookingAhead) {
-                                                                                lookaheadOffset = it
-                                                                            } else {
-                                                                                offset = it
+                                val placeable =
+                                    subcompose(Unit) {
+                                            // read the value to force a recomposition
+                                            Box(Modifier.requiredSize(222.dp)) {
+                                                LookaheadScope {
+                                                    AnimatedContent(
+                                                        show,
+                                                        Modifier.requiredSize(200.dp)
+                                                    ) {
+                                                        if (it) {
+                                                            Row(
+                                                                Modifier.fillMaxSize().layout {
+                                                                    measurable,
+                                                                    constraints ->
+                                                                    val p =
+                                                                        measurable.measure(
+                                                                            constraints
+                                                                        )
+                                                                    layout(p.width, p.height) {
+                                                                        coordinates
+                                                                            ?.positionInRoot()
+                                                                            .let {
+                                                                                if (
+                                                                                    isLookingAhead
+                                                                                ) {
+                                                                                    lookaheadOffset =
+                                                                                        it
+                                                                                } else {
+                                                                                    offset = it
+                                                                                }
                                                                             }
-                                                                        }
-                                                                    p.place(0, 0)
+                                                                        p.place(0, 0)
+                                                                    }
                                                                 }
-                                                            }) {}
-                                                } else {
-                                                    Row(
-                                                        Modifier.size(10.dp)
-                                                    ) {}
+                                                            ) {}
+                                                        } else {
+                                                            Row(Modifier.size(10.dp)) {}
+                                                        }
+                                                    }
                                                 }
                                             }
-                                        }
-                                    }
-                                }[0].measure(Constraints(0, 2000, 0, 2000))
+                                        }[0]
+                                        .measure(Constraints(0, 2000, 0, 2000))
                                 // Measure with the same constraints to ensure the child (i.e. Box)
                                 // gets no constraints change and hence starts forceMeasureSubtree
                                 // from there
-                                layout(700, 800) {
-                                    placeable.place(0, 0)
-                                }
+                                layout(700, 800) { placeable.place(0, 0) }
                             }
                         }
                     }
                 }
             }
         }
-        rule.waitUntil(2000) {
-            show
-        }
+        rule.waitUntil(2000) { show }
         rule.waitForIdle()
 
         assertEquals(Offset(-150f, 0f), lookaheadOffset)
@@ -2289,59 +2134,44 @@
                             // Subsequently this Box's size change will trigger a measurement pass
                             // from Column.
                             Box(
-                                Modifier
-                                    .layout { measurable, constraints ->
-                                        measurable
-                                            .measure(constraints)
-                                            .run {
-                                                size[isLookingAhead] = IntSize(width, height)
-                                                layout(width, height) {
-                                                    place(0, 0)
-                                                }
-                                            }
+                                Modifier.layout { measurable, constraints ->
+                                        measurable.measure(constraints).run {
+                                            size[isLookingAhead] = IntSize(width, height)
+                                            layout(width, height) { place(0, 0) }
+                                        }
                                     }
                                     .intermediateLayout { measurable, _ ->
                                         // Force a state-read (similar to animation but more
                                         // reliable)
                                         measurable
                                             .measure(Constraints.fixed(200 + 100 * iterations, 200))
-                                            .run {
-                                                layout(width, height) {
-                                                    place(0, 0)
-                                                }
-                                            }
-                                    }) {
+                                            .run { layout(width, height) { place(0, 0) } }
+                                    }
+                            ) {
                                 Box(Modifier.size(100.dp))
                             }
                         }
                         SubcomposeLayout(
-                            Modifier
-                                .layout { measurable, constraints ->
-                                    measurable.measure(constraints).run {
-                                        if (isLookingAhead) {
-                                            assertEquals(500, width)
-                                            assertEquals(300, height)
-                                        } else {
-                                            assertEquals(100, width)
-                                            assertEquals(120, height)
-                                        }
-                                        layout(width, height) {
-                                            place(0, 0)
-                                        }
+                            Modifier.layout { measurable, constraints ->
+                                measurable.measure(constraints).run {
+                                    if (isLookingAhead) {
+                                        assertEquals(500, width)
+                                        assertEquals(300, height)
+                                    } else {
+                                        assertEquals(100, width)
+                                        assertEquals(120, height)
                                     }
+                                    layout(width, height) { place(0, 0) }
                                 }
+                            }
                         ) { constraints ->
-                            val placeable = subcompose(Unit) {
-                                Box(Modifier.requiredSize(400.dp, 600.dp))
-                            }[0].measure(constraints)
+                            val placeable =
+                                subcompose(Unit) { Box(Modifier.requiredSize(400.dp, 600.dp)) }[0]
+                                    .measure(constraints)
                             if (isLookingAhead) {
-                                layout(500, 300) {
-                                    placeable.place(0, 0)
-                                }
+                                layout(500, 300) { placeable.place(0, 0) }
                             } else {
-                                layout(100, 120) {
-                                    placeable.place(0, 0)
-                                }
+                                layout(100, 120) { placeable.place(0, 0) }
                             }
                         }
                     }
@@ -2365,56 +2195,56 @@
             measurable: Measurable,
             constraints: Constraints
         ): MeasureResult {
-            return measurable.measure(constraints).run {
-                layout(width, height) {
-                    place(0, 0)
-                }
-            }
+            return measurable.measure(constraints).run { layout(width, height) { place(0, 0) } }
         }
 
         override fun IntrinsicMeasureScope.maxIntrinsicHeight(
             measurable: IntrinsicMeasurable,
             width: Int
-        ): Int = measurable.maxIntrinsicHeight(width).also {
-            if (isLookingAhead) {
-                lookaheadIntrinsicResult["maxHeight"] = it
-            } else {
-                intrinsicResult["maxHeight"] = it
+        ): Int =
+            measurable.maxIntrinsicHeight(width).also {
+                if (isLookingAhead) {
+                    lookaheadIntrinsicResult["maxHeight"] = it
+                } else {
+                    intrinsicResult["maxHeight"] = it
+                }
             }
-        }
 
         override fun IntrinsicMeasureScope.minIntrinsicHeight(
             measurable: IntrinsicMeasurable,
             width: Int
-        ): Int = measurable.minIntrinsicHeight(width).also {
-            if (isLookingAhead) {
-                lookaheadIntrinsicResult["minHeight"] = it
-            } else {
-                intrinsicResult["minHeight"] = it
+        ): Int =
+            measurable.minIntrinsicHeight(width).also {
+                if (isLookingAhead) {
+                    lookaheadIntrinsicResult["minHeight"] = it
+                } else {
+                    intrinsicResult["minHeight"] = it
+                }
             }
-        }
 
         override fun IntrinsicMeasureScope.maxIntrinsicWidth(
             measurable: IntrinsicMeasurable,
             height: Int
-        ): Int = measurable.maxIntrinsicWidth(height).also {
-            if (isLookingAhead) {
-                lookaheadIntrinsicResult["maxWidth"] = it
-            } else {
-                intrinsicResult["maxWidth"] = it
+        ): Int =
+            measurable.maxIntrinsicWidth(height).also {
+                if (isLookingAhead) {
+                    lookaheadIntrinsicResult["maxWidth"] = it
+                } else {
+                    intrinsicResult["maxWidth"] = it
+                }
             }
-        }
 
         override fun IntrinsicMeasureScope.minIntrinsicWidth(
             measurable: IntrinsicMeasurable,
             height: Int
-        ): Int = measurable.minIntrinsicWidth(height).also {
-            if (isLookingAhead) {
-                lookaheadIntrinsicResult["minWidth"] = it
-            } else {
-                intrinsicResult["minWidth"] = it
+        ): Int =
+            measurable.minIntrinsicWidth(height).also {
+                if (isLookingAhead) {
+                    lookaheadIntrinsicResult["minWidth"] = it
+                } else {
+                    intrinsicResult["minWidth"] = it
+                }
             }
-        }
     }
 
     data class TestElement(
@@ -2440,41 +2270,32 @@
     fun testIsLookingAheadWithIntrinsics() {
         val lookaheadIntrinsicsResult = mutableMapOf<String, Int>()
         val intrinsicsResult = mutableMapOf<String, Int>()
-        val modifierList = listOf(
-            Modifier.width(IntrinsicSize.Max),
-            Modifier.width(IntrinsicSize.Min),
-            Modifier.height(IntrinsicSize.Max),
-            Modifier.height(IntrinsicSize.Min),
-        )
+        val modifierList =
+            listOf(
+                Modifier.width(IntrinsicSize.Max),
+                Modifier.width(IntrinsicSize.Min),
+                Modifier.height(IntrinsicSize.Max),
+                Modifier.height(IntrinsicSize.Min),
+            )
         var iteration by mutableStateOf(0)
         rule.setContent {
             LookaheadScope {
                 CompositionLocalProvider(LocalDensity provides Density(1f)) {
                     Row(Modifier.width(IntrinsicSize.Max)) {
                         Box(
-                            Modifier
-                                .fillMaxSize()
+                            Modifier.fillMaxSize()
                                 .then(modifierList[iteration])
-                                .then(
-                                    TestElement(
-                                        lookaheadIntrinsicsResult, intrinsicsResult
-                                    )
-                                )
+                                .then(TestElement(lookaheadIntrinsicsResult, intrinsicsResult))
                                 .layout { measurable, constraints ->
-                                    measurable
-                                        .measure(constraints)
-                                        .run {
-                                            if (isLookingAhead) {
-                                                layout(200, 250) {
-                                                    place(0, 0)
-                                                }
-                                            } else {
-                                                layout(100, 150) {
-                                                    place(0, 0)
-                                                }
-                                            }
+                                    measurable.measure(constraints).run {
+                                        if (isLookingAhead) {
+                                            layout(200, 250) { place(0, 0) }
+                                        } else {
+                                            layout(100, 150) { place(0, 0) }
                                         }
-                                }) {
+                                    }
+                                }
+                        ) {
                             Box(Modifier.size(10.dp))
                         }
                     }
@@ -2505,75 +2326,65 @@
         rule.setContent {
             CompositionLocalProvider(LocalDensity provides Density(1f)) {
                 LookaheadScope {
-                    Layout(content = {
-                        repeat(3) {
-                            Column(Modifier.layout { measurable, constraints ->
-                                measurable.measure(constraints).run {
-                                    layout(width, height) { place(0, 0) }
-                                }
-                            }) {
-                                Box(
-                                    Modifier
-                                        .requiredHeight(100.dp)
-                                        .fillMaxWidth()
+                    Layout(
+                        content = {
+                            repeat(3) {
+                                Column(
+                                    Modifier.layout { measurable, constraints ->
+                                        measurable.measure(constraints).run {
+                                            layout(width, height) { place(0, 0) }
+                                        }
+                                    }
                                 ) {
-                                    Text("$it")
-                                }
-                                // Bring in a new modifier while setting the size to 0.
-                                Box(
-                                    (if (!expanded) Modifier.clipToBounds() else Modifier)
-                                        .then(Modifier.layout { measurable, constraints ->
-                                            measurable.measure(constraints).run {
-                                                val (w, h) = if (isLookingAhead) {
-                                                    if (!expanded) IntSize.Zero else IntSize(
-                                                        width,
-                                                        height
-                                                    )
-                                                } else {
-                                                    IntSize(width, height)
-                                                }
-                                                layout(w, h) {
-                                                    place(0, 0)
+                                    Box(Modifier.requiredHeight(100.dp).fillMaxWidth()) {
+                                        Text("$it")
+                                    }
+                                    // Bring in a new modifier while setting the size to 0.
+                                    Box(
+                                        (if (!expanded) Modifier.clipToBounds() else Modifier).then(
+                                            Modifier.layout { measurable, constraints ->
+                                                measurable.measure(constraints).run {
+                                                    val (w, h) =
+                                                        if (isLookingAhead) {
+                                                            if (!expanded) IntSize.Zero
+                                                            else IntSize(width, height)
+                                                        } else {
+                                                            IntSize(width, height)
+                                                        }
+                                                    layout(w, h) { place(0, 0) }
                                                 }
                                             }
-                                        })
-                                ) {
-                                    Box(
-                                        Modifier
-                                            .requiredHeight(100.dp)
-                                            .fillMaxWidth()
-                                    )
-                                }
-                            }
-                        }
-                    }) { measurables, constraints ->
-                        measurables.map { it.measure(constraints) }.run {
-                            layout(this[0].width, this[0].height * 3) {
-                                var h = 0
-                                forEachIndexed { id, placeable ->
-                                    if (isLookingAhead) {
-                                        lookaheadHeight[id] = placeable.height
+                                        )
+                                    ) {
+                                        Box(Modifier.requiredHeight(100.dp).fillMaxWidth())
                                     }
-                                    placeable.place(0, h)
-                                    h += placeable.height
                                 }
                             }
                         }
+                    ) { measurables, constraints ->
+                        measurables
+                            .map { it.measure(constraints) }
+                            .run {
+                                layout(this[0].width, this[0].height * 3) {
+                                    var h = 0
+                                    forEachIndexed { id, placeable ->
+                                        if (isLookingAhead) {
+                                            lookaheadHeight[id] = placeable.height
+                                        }
+                                        placeable.place(0, h)
+                                        h += placeable.height
+                                    }
+                                }
+                            }
                     }
                 }
             }
         }
 
-        repeat(3) {
-            assertEquals(200, lookaheadHeight[it])
-        }
-        rule.runOnIdle {
-            expanded = false
-        }
+        repeat(3) { assertEquals(200, lookaheadHeight[it]) }
+        rule.runOnIdle { expanded = false }
         rule.waitForIdle()
-        repeat(3) {
-            assertEquals(100, lookaheadHeight[it])
-        }
+        repeat(3) { assertEquals(100, lookaheadHeight[it]) }
     }
 
     @Test
@@ -2589,34 +2400,26 @@
                             // This box will get a remeasure request when `iterations` changes.
                             // Subsequently this Box's size change will trigger a measurement pass
                             // from Column.
-                            Box(Modifier.intermediateLayout { measurable, _ ->
-                                // Force a state-read, so that this node is the node where
-                                // remeasurement starts.
-                                @Suppress("UNUSED_EXPRESSION")
-                                iterations
-                                measurable.measure(Constraints.fixed(200, 200))
-                                    .run {
-                                        layout(width, height) {
-                                            place(0, 0)
-                                        }
+                            Box(
+                                Modifier.intermediateLayout { measurable, _ ->
+                                    // Force a state-read, so that this node is the node where
+                                    // remeasurement starts.
+                                    @Suppress("UNUSED_EXPRESSION") iterations
+                                    measurable.measure(Constraints.fixed(200, 200)).run {
+                                        layout(width, height) { place(0, 0) }
                                     }
-                            }) {
+                                }
+                            ) {
                                 // Swap modifiers. If lookahead re-measurement from this node isn't
                                 // handled before parent's non-lookahead remeasurement, this would
                                 // lead to a crash.
                                 Box(
-                                    if (iterations % 2 == 0)
-                                        Modifier.size(100.dp)
+                                    if (iterations % 2 == 0) Modifier.size(100.dp)
                                     else
-                                        Modifier
-                                            .intermediateLayout { measurable, constraints ->
-                                                measurable
-                                                    .measure(constraints)
-                                                    .run {
-                                                        layout(width, height) {
-                                                            place(5, 5)
-                                                        }
-                                                    }
+                                        Modifier.intermediateLayout { measurable, constraints ->
+                                                measurable.measure(constraints).run {
+                                                    layout(width, height) { place(5, 5) }
+                                                }
                                             }
                                             .padding(5.dp)
                                 )
@@ -2627,11 +2430,7 @@
             }
         }
 
-        repeat(4) {
-            rule.runOnIdle {
-                iterations++
-            }
-        }
+        repeat(4) { rule.runOnIdle { iterations++ } }
     }
 
     @Test
@@ -2673,41 +2472,24 @@
                 MultiMeasureLayout(
                     content = {
                         if (horizontal) {
-                            Row {
-                                repeat(3) {
-                                    Box(
-                                        Modifier
-                                            .weight(1f)
-                                            .background(Color.Red)
-                                    )
-                                }
-                            }
+                            Row { repeat(3) { Box(Modifier.weight(1f).background(Color.Red)) } }
                         } else {
-                            Column {
-                                repeat(3) {
-                                    Box(
-                                        Modifier
-                                            .weight(1f)
-                                            .background(Color.Red)
-                                    )
-                                }
-                            }
+                            Column { repeat(3) { Box(Modifier.weight(1f).background(Color.Red)) } }
                         }
                     },
                     modifier = Modifier.fillMaxSize(0.6f),
-                    measurePolicy = MeasurePolicy { measurables, constraints ->
-                        // Intentionally measure twice here to ensure multi-measure is supported.
-                        measurables.map { it.measure(Constraints.fixed(200, 300)) }
-                        val placeables = measurables.map { it.measure(constraints) }
-                        val maxWidth: Int = placeables.maxOf { it.width }
-                        val maxHeight = placeables.maxOf { it.height }
-                        // Position the children.
-                        layout(maxWidth, maxHeight) {
-                            placeables.forEach {
-                                it.place(0, 0)
-                            }
+                    measurePolicy =
+                        MeasurePolicy { measurables, constraints ->
+                            // Intentionally measure twice here to ensure multi-measure is
+                            // supported.
+                            measurables.map { it.measure(Constraints.fixed(200, 300)) }
+                            val placeables = measurables.map { it.measure(constraints) }
+                            val maxWidth: Int = placeables.maxOf { it.width }
+                            val maxHeight = placeables.maxOf { it.height }
+                            // Position the children.
+                            layout(maxWidth, maxHeight) { placeables.forEach { it.place(0, 0) } }
                         }
-                    })
+                )
             }
         }
         rule.runOnIdle { horizontal = !horizontal }
@@ -2716,166 +2498,164 @@
     }
 
     @Test
-    fun testDirectManipulationCoordinates_inScroll() = with(rule.density) {
-        val boxSizePx = 150f
-        val itemCount = 3
+    fun testDirectManipulationCoordinates_inScroll() =
+        with(rule.density) {
+            val boxSizePx = 150f
+            val itemCount = 3
 
-        val scrollState = ScrollState(0)
+            val scrollState = ScrollState(0)
 
-        // [(regularPosition, excludedPosition), ...]
-        val positionToExcludedArray = Array(3) { Offset.Unspecified to Offset.Unspecified }
+            // [(regularPosition, excludedPosition), ...]
+            val positionToExcludedArray = Array(3) { Offset.Unspecified to Offset.Unspecified }
 
-        rule.setContent {
-            LookaheadScope {
+            rule.setContent {
+                LookaheadScope {
+                    Column(
+                        Modifier
+                            // Only one box visible (can scroll up to itemCount - 1)
+                            .size(boxSizePx.toDp())
+                            .verticalScroll(scrollState)
+                    ) {
+                        repeat(itemCount) { i ->
+                            Box(
+                                modifier =
+                                    Modifier.size(boxSizePx.toDp()).layout { measurable, constraints
+                                        ->
+                                        val placeable = measurable.measure(constraints)
+                                        layout(placeable.width, placeable.height) {
+                                            if (isLookingAhead && coordinates != null) {
+                                                val parent =
+                                                    coordinates!!
+                                                        .parentLayoutCoordinates!!
+                                                        .parentCoordinates!!
+
+                                                val position =
+                                                    parent.localLookaheadPositionOf(
+                                                        sourceCoordinates = coordinates!!,
+                                                    )
+                                                val excludedPosition =
+                                                    parent.localLookaheadPositionOf(
+                                                        sourceCoordinates = coordinates!!,
+                                                        includeMotionFrameOfReference = false,
+                                                    )
+                                                positionToExcludedArray[i] =
+                                                    position to excludedPosition
+                                            }
+                                            placeable.place(0, 0)
+                                        }
+                                    }
+                            )
+                        }
+                    }
+                }
+            }
+            rule.waitForIdle()
+
+            // Verify initial offset, should be the same values for the "excluded" offset
+            positionToExcludedArray.forEachIndexed { index, (position, excluded) ->
+                // Rounding to avoid -0.0f
+                assertEquals((index * boxSizePx).fastRoundToInt(), position.y.fastRoundToInt())
+                assertEquals((index * boxSizePx).fastRoundToInt(), excluded.y.fastRoundToInt())
+            }
+
+            // Scroll to the end
+            runBlocking { scrollState.scrollTo(((itemCount - 1) * boxSizePx).fastRoundToInt()) }
+            rule.waitForIdle()
+
+            // Verify positions
+            positionToExcludedArray.forEachIndexed { index, (position, excluded) ->
+                // For the default positions, we subtract the scroll amount
+                assertEquals(
+                    ((index - (itemCount - 1)) * boxSizePx).fastRoundToInt(),
+                    position.y.fastRoundToInt()
+                )
+
+                // The excluded should be the same as if there was no scroll
+                assertEquals((index * boxSizePx).fastRoundToInt(), excluded.y.fastRoundToInt())
+            }
+        }
+
+    @Test
+    fun testDirectManipulationCoordinates_inScroll_LookaheadChild() =
+        with(rule.density) {
+            val boxSizePx = 150f
+            val itemCount = 3
+
+            val scrollState = ScrollState(0)
+
+            // [(regularPosition, excludedPosition), ...]
+            val positionToExcludedArray = Array(3) { Offset.Unspecified to Offset.Unspecified }
+
+            rule.setContent {
                 Column(
                     Modifier
                         // Only one box visible (can scroll up to itemCount - 1)
                         .size(boxSizePx.toDp())
                         .verticalScroll(scrollState)
                 ) {
-                    repeat(itemCount) { i ->
-                        Box(
-                            modifier = Modifier
-                                .size(boxSizePx.toDp())
-                                .layout { measurable, constraints ->
-                                    val placeable = measurable.measure(constraints)
-                                    layout(placeable.width, placeable.height) {
-                                        if (isLookingAhead && coordinates != null) {
-                                            val parent = coordinates!!
-                                                .parentLayoutCoordinates!!
-                                                .parentCoordinates!!
+                    LookaheadScope {
+                        repeat(itemCount) { i ->
+                            Box(
+                                modifier =
+                                    Modifier.size(boxSizePx.toDp()).layout { measurable, constraints
+                                        ->
+                                        val placeable = measurable.measure(constraints)
+                                        layout(placeable.width, placeable.height) {
+                                            placeable.place(0, 0)
+                                            if (!isLookingAhead && coordinates != null) {
+                                                val parent = coordinates!!.findRootCoordinates()
 
-                                            val position = parent
-                                                .localLookaheadPositionOf(
-                                                    sourceCoordinates = coordinates!!,
-                                                )
-                                            val excludedPosition = parent
-                                                .localLookaheadPositionOf(
-                                                    sourceCoordinates = coordinates!!,
-                                                    includeMotionFrameOfReference = false,
-                                                )
-                                            positionToExcludedArray[i] =
-                                                position to excludedPosition
+                                                val position =
+                                                    parent.localLookaheadPositionOf(
+                                                        sourceCoordinates = coordinates!!,
+                                                    )
+
+                                                val excludedPosition =
+                                                    parent.localLookaheadPositionOf(
+                                                        sourceCoordinates = coordinates!!,
+                                                        includeMotionFrameOfReference = false,
+                                                    )
+                                                positionToExcludedArray[i] =
+                                                    position to excludedPosition
+                                            }
                                         }
-                                        placeable.place(0, 0)
                                     }
-                                }
-                        )
+                            )
+                        }
                     }
                 }
             }
-        }
-        rule.waitForIdle()
+            rule.waitForIdle()
 
-        // Verify initial offset, should be the same values for the "excluded" offset
-        positionToExcludedArray.forEachIndexed { index, (position, excluded) ->
-            // Rounding to avoid -0.0f
-            assertEquals((index * boxSizePx).fastRoundToInt(), position.y.fastRoundToInt())
-            assertEquals((index * boxSizePx).fastRoundToInt(), excluded.y.fastRoundToInt())
-        }
+            // Verify initial offset, should be the same values for the "excluded" offset
+            positionToExcludedArray.forEachIndexed { index, (position, excluded) ->
+                // Rounding to avoid -0.0f
+                assertEquals((index * boxSizePx).fastRoundToInt(), position.y.fastRoundToInt())
+                assertEquals((index * boxSizePx).fastRoundToInt(), excluded.y.fastRoundToInt())
+            }
 
-        // Scroll to the end
-        runBlocking {
-            scrollState.scrollTo(((itemCount - 1) * boxSizePx).fastRoundToInt())
-        }
-        rule.waitForIdle()
+            // Scroll to the end
+            runBlocking { scrollState.scrollTo(((itemCount - 1) * boxSizePx).fastRoundToInt()) }
+            rule.waitForIdle()
 
-        // Verify positions
-        positionToExcludedArray.forEachIndexed { index, (position, excluded) ->
-            // For the default positions, we subtract the scroll amount
-            assertEquals(
-                ((index - (itemCount - 1)) * boxSizePx).fastRoundToInt(),
-                position.y.fastRoundToInt()
-            )
+            // Verify positions
+            positionToExcludedArray.forEachIndexed { index, (position, excluded) ->
+                // For the default positions, we subtract the scroll amount
+                assertEquals(
+                    ((index - (itemCount - 1)) * boxSizePx).fastRoundToInt(),
+                    position.y.fastRoundToInt()
+                )
 
-            // The excluded should be the same as if there was no scroll
-            assertEquals((index * boxSizePx).fastRoundToInt(), excluded.y.fastRoundToInt())
-        }
-    }
-
-    @Test
-    fun testDirectManipulationCoordinates_inScroll_LookaheadChild() = with(rule.density) {
-        val boxSizePx = 150f
-        val itemCount = 3
-
-        val scrollState = ScrollState(0)
-
-        // [(regularPosition, excludedPosition), ...]
-        val positionToExcludedArray = Array(3) { Offset.Unspecified to Offset.Unspecified }
-
-        rule.setContent {
-            Column(
-                Modifier
-                    // Only one box visible (can scroll up to itemCount - 1)
-                    .size(boxSizePx.toDp())
-                    .verticalScroll(scrollState)
-            ) {
-                LookaheadScope {
-                    repeat(itemCount) { i ->
-                        Box(
-                            modifier = Modifier
-                                .size(boxSizePx.toDp())
-                                .layout { measurable, constraints ->
-                                    val placeable = measurable.measure(constraints)
-                                    layout(placeable.width, placeable.height) {
-                                        placeable.place(0, 0)
-                                        if (!isLookingAhead && coordinates != null) {
-                                            val parent = coordinates!!
-                                                .findRootCoordinates()
-
-                                            val position = parent
-                                                .localLookaheadPositionOf(
-                                                    sourceCoordinates = coordinates!!,
-                                                )
-
-                                            val excludedPosition = parent
-                                                .localLookaheadPositionOf(
-                                                    sourceCoordinates = coordinates!!,
-                                                    includeMotionFrameOfReference = false,
-                                                )
-                                            positionToExcludedArray[i] =
-                                                position to excludedPosition
-                                        }
-                                    }
-                                }
-                        )
-                    }
-                }
+                // The excluded should be the same as if there was no scroll
+                assertEquals((index * boxSizePx).fastRoundToInt(), excluded.y.fastRoundToInt())
             }
         }
-        rule.waitForIdle()
-
-        // Verify initial offset, should be the same values for the "excluded" offset
-        positionToExcludedArray.forEachIndexed { index, (position, excluded) ->
-            // Rounding to avoid -0.0f
-            assertEquals((index * boxSizePx).fastRoundToInt(), position.y.fastRoundToInt())
-            assertEquals((index * boxSizePx).fastRoundToInt(), excluded.y.fastRoundToInt())
-        }
-
-        // Scroll to the end
-        runBlocking {
-            scrollState.scrollTo(((itemCount - 1) * boxSizePx).fastRoundToInt())
-        }
-        rule.waitForIdle()
-
-        // Verify positions
-        positionToExcludedArray.forEachIndexed { index, (position, excluded) ->
-            // For the default positions, we subtract the scroll amount
-            assertEquals(
-                ((index - (itemCount - 1)) * boxSizePx).fastRoundToInt(),
-                position.y.fastRoundToInt()
-            )
-
-            // The excluded should be the same as if there was no scroll
-            assertEquals((index * boxSizePx).fastRoundToInt(), excluded.y.fastRoundToInt())
-        }
-    }
 
     @Test
-    fun testDirectManipulationCoordinates_usingModifierLayout() = with(rule.density) {
-        fun Modifier.verticalOffset(offset: Float, withDirectManipulation: Boolean) =
-            this
-                .then(
+    fun testDirectManipulationCoordinates_usingModifierLayout() =
+        with(rule.density) {
+            fun Modifier.verticalOffset(offset: Float, withDirectManipulation: Boolean) =
+                this.then(
                     object : LayoutModifier {
                         override fun MeasureScope.measure(
                             measurable: Measurable,
@@ -2895,59 +2675,55 @@
                     }
                 )
 
-        var useDirectManipulation by mutableStateOf(true)
+            var useDirectManipulation by mutableStateOf(true)
 
-        var regularPosition = Offset.Unspecified
-        var excludedManipulationPosition = Offset.Unspecified
+            var regularPosition = Offset.Unspecified
+            var excludedManipulationPosition = Offset.Unspecified
 
-        rule.setContent {
-            LookaheadScope {
-                Box {
-                    Box(
-                        Modifier
-                            .width(100f.toDp())
-                            .height(100f.toDp())
-                            .verticalOffset(
-                                offset = 300f,
-                                withDirectManipulation = useDirectManipulation
-                            )
-                            .onPlaced {
-                                val parentLookaheadCoords = it
-                                    .parentLayoutCoordinates!!
-                                    .toLookaheadCoordinates()
+            rule.setContent {
+                LookaheadScope {
+                    Box {
+                        Box(
+                            Modifier.width(100f.toDp())
+                                .height(100f.toDp())
+                                .verticalOffset(
+                                    offset = 300f,
+                                    withDirectManipulation = useDirectManipulation
+                                )
+                                .onPlaced {
+                                    val parentLookaheadCoords =
+                                        it.parentLayoutCoordinates!!.toLookaheadCoordinates()
 
-                                regularPosition =
-                                    parentLookaheadCoords
-                                        .localLookaheadPositionOf(
+                                    regularPosition =
+                                        parentLookaheadCoords.localLookaheadPositionOf(
                                             sourceCoordinates = it
                                         )
 
-                                excludedManipulationPosition =
-                                    parentLookaheadCoords
-                                        .localLookaheadPositionOf(
+                                    excludedManipulationPosition =
+                                        parentLookaheadCoords.localLookaheadPositionOf(
                                             sourceCoordinates = it,
                                             includeMotionFrameOfReference = false,
                                         )
-                            }
-                    )
+                                }
+                        )
+                    }
                 }
             }
+            rule.waitForIdle()
+
+            // When querying lookaheadPosition with `excludeDirectManipulationOffset` the offset
+            // under `withDirectManipulationPlacement` should be ignored
+            assertEquals(300f, regularPosition.y)
+            assertEquals(0f, excludedManipulationPosition.y)
+
+            // Don't place anything with direct manipulation
+            useDirectManipulation = false
+            rule.waitForIdle()
+
+            // There should be no ignored offset now.
+            assertEquals(300f, regularPosition.y)
+            assertEquals(300f, excludedManipulationPosition.y)
         }
-        rule.waitForIdle()
-
-        // When querying lookaheadPosition with `excludeDirectManipulationOffset` the offset
-        // under `withDirectManipulationPlacement` should be ignored
-        assertEquals(300f, regularPosition.y)
-        assertEquals(0f, excludedManipulationPosition.y)
-
-        // Don't place anything with direct manipulation
-        useDirectManipulation = false
-        rule.waitForIdle()
-
-        // There should be no ignored offset now.
-        assertEquals(300f, regularPosition.y)
-        assertEquals(300f, excludedManipulationPosition.y)
-    }
 
     @Test
     fun testDirectManipulationCoordinates_usingMeasurePolicy() {
@@ -2967,11 +2743,12 @@
                 modifier = modifier,
                 content = content,
                 measurePolicy = { measurables, constraints ->
-                    val placeableData = measurables.fastMap { measurable ->
-                        val data = measurable.getOffsetData()
-                        val placeable = measurable.measure(constraints)
-                        placeable to data
-                    }
+                    val placeableData =
+                        measurables.fastMap { measurable ->
+                            val data = measurable.getOffsetData()
+                            val placeable = measurable.measure(constraints)
+                            placeable to data
+                        }
 
                     layout(300, 300) {
                         placeableData.fastForEach { (placeable, offsetData) ->
@@ -2991,54 +2768,48 @@
         rule.setContent {
             LookaheadScope {
                 Column {
-                    MyLayout(
-                        modifier = Modifier.fillMaxSize()
-                    ) {
+                    MyLayout(modifier = Modifier.fillMaxSize()) {
                         Box(
-                            modifier = Modifier
-                                // starts as false
-                                .layoutId(OffsetData(100f, placeWithDirectManipulation))
-                                .onPlaced {
-                                    val parentLookaheadCoords = it
-                                        .parentLayoutCoordinates!!
-                                        .toLookaheadCoordinates()
+                            modifier =
+                                Modifier
+                                    // starts as false
+                                    .layoutId(OffsetData(100f, placeWithDirectManipulation))
+                                    .onPlaced {
+                                        val parentLookaheadCoords =
+                                            it.parentLayoutCoordinates!!.toLookaheadCoordinates()
 
-                                    regularPositions[0] =
-                                        parentLookaheadCoords
-                                            .localLookaheadPositionOf(
+                                        regularPositions[0] =
+                                            parentLookaheadCoords.localLookaheadPositionOf(
                                                 sourceCoordinates = it
                                             )
 
-                                    excludedManipulationPositions[0] =
-                                        parentLookaheadCoords
-                                            .localLookaheadPositionOf(
+                                        excludedManipulationPositions[0] =
+                                            parentLookaheadCoords.localLookaheadPositionOf(
                                                 sourceCoordinates = it,
                                                 includeMotionFrameOfReference = false,
                                             )
-                                }
+                                    }
                         )
                         Box(
-                            modifier = Modifier
-                                // starts as true
-                                .layoutId(OffsetData(200f, !placeWithDirectManipulation))
-                                .onPlaced {
-                                    val parentLookaheadCoords = it
-                                        .parentLayoutCoordinates!!
-                                        .toLookaheadCoordinates()
+                            modifier =
+                                Modifier
+                                    // starts as true
+                                    .layoutId(OffsetData(200f, !placeWithDirectManipulation))
+                                    .onPlaced {
+                                        val parentLookaheadCoords =
+                                            it.parentLayoutCoordinates!!.toLookaheadCoordinates()
 
-                                    regularPositions[1] =
-                                        parentLookaheadCoords
-                                            .localLookaheadPositionOf(
+                                        regularPositions[1] =
+                                            parentLookaheadCoords.localLookaheadPositionOf(
                                                 sourceCoordinates = it
                                             )
 
-                                    excludedManipulationPositions[1] =
-                                        parentLookaheadCoords
-                                            .localLookaheadPositionOf(
+                                        excludedManipulationPositions[1] =
+                                            parentLookaheadCoords.localLookaheadPositionOf(
                                                 sourceCoordinates = it,
                                                 includeMotionFrameOfReference = false,
                                             )
-                                }
+                                    }
                         )
                     }
                 }
@@ -3057,9 +2828,7 @@
         assertEquals(0f, excludedManipulationPositions[1].y)
 
         // Flip behaviors and re-assert
-        rule.runOnIdle {
-            placeWithDirectManipulation = !placeWithDirectManipulation
-        }
+        rule.runOnIdle { placeWithDirectManipulation = !placeWithDirectManipulation }
         rule.waitForIdle()
 
         assertEquals(100f, regularPositions[0].y)
@@ -3070,75 +2839,79 @@
     }
 
     @Test
-    fun testDirectManipulationCoordinates_duringPlacement() = with(rule.density) {
-        var placeWithDirectManipulation by mutableStateOf(false)
+    fun testDirectManipulationCoordinates_duringPlacement() =
+        with(rule.density) {
+            var placeWithDirectManipulation by mutableStateOf(false)
 
-        var lookingAheadPosition = Offset.Unspecified
-        var lookingAheadPositionExcludingDmp = Offset.Unspecified
+            var lookingAheadPosition = Offset.Unspecified
+            var lookingAheadPositionExcludingDmp = Offset.Unspecified
 
-        rule.setContent {
-            LookaheadScope {
-                Box {
-                    Box(
-                        modifier = Modifier
-                            .size(100.toDp())
-                            // Apply offset with Direct Manipulation depending on flag
-                            .layout { measurable, constraints ->
-                                val placeable = measurable.measure(constraints)
-                                layout(placeable.width, placeable.height) {
-                                    if (placeWithDirectManipulation) {
-                                        withMotionFrameOfReferencePlacement {
-                                            placeable.place(0, 200)
+            rule.setContent {
+                LookaheadScope {
+                    Box {
+                        Box(
+                            modifier =
+                                Modifier.size(100.toDp())
+                                    // Apply offset with Direct Manipulation depending on flag
+                                    .layout { measurable, constraints ->
+                                        val placeable = measurable.measure(constraints)
+                                        layout(placeable.width, placeable.height) {
+                                            if (placeWithDirectManipulation) {
+                                                withMotionFrameOfReferencePlacement {
+                                                    placeable.place(0, 200)
+                                                }
+                                            } else {
+                                                placeable.place(0, 200)
+                                            }
                                         }
-                                    } else {
-                                        placeable.place(0, 200)
                                     }
-                                }
-                            }
-                            .layout { measurable, constraints ->
-                                val placeable = measurable.measure(constraints)
+                                    .layout { measurable, constraints ->
+                                        val placeable = measurable.measure(constraints)
 
-                                layout(placeable.width, placeable.height) {
-                                    // Query lookahead coordinates during lookahead pass placement
-                                    if (isLookingAhead && coordinates != null) {
-                                        val lookaheadCoordinates =
-                                            coordinates!!.toLookaheadCoordinates()
+                                        layout(placeable.width, placeable.height) {
+                                            // Query lookahead coordinates during lookahead pass
+                                            // placement
+                                            if (isLookingAhead && coordinates != null) {
+                                                val lookaheadCoordinates =
+                                                    coordinates!!.toLookaheadCoordinates()
 
-                                        lookingAheadPosition = lookaheadScopeCoordinates
-                                            .localLookaheadPositionOf(
-                                                sourceCoordinates = lookaheadCoordinates,
-                                            )
-                                        lookingAheadPositionExcludingDmp = lookaheadScopeCoordinates
-                                            .localLookaheadPositionOf(
-                                                sourceCoordinates = lookaheadCoordinates,
-                                                includeMotionFrameOfReference = false,
-                                            )
+                                                lookingAheadPosition =
+                                                    lookaheadScopeCoordinates
+                                                        .localLookaheadPositionOf(
+                                                            sourceCoordinates =
+                                                                lookaheadCoordinates,
+                                                        )
+                                                lookingAheadPositionExcludingDmp =
+                                                    lookaheadScopeCoordinates
+                                                        .localLookaheadPositionOf(
+                                                            sourceCoordinates =
+                                                                lookaheadCoordinates,
+                                                            includeMotionFrameOfReference = false,
+                                                        )
+                                            }
+                                            placeable.place(0, 0)
+                                        }
                                     }
-                                    placeable.place(0, 0)
-                                }
-                            }
-                    )
+                        )
+                    }
                 }
             }
+            rule.waitForIdle()
+
+            // No DMP, no position to exclude
+            assertEquals(200f, lookingAheadPosition.y)
+            assertEquals(200f, lookingAheadPositionExcludingDmp.y)
+
+            placeWithDirectManipulation = true
+            rule.waitForIdle()
+
+            assertEquals(200f, lookingAheadPosition.y)
+            // Round to int, since it may return -0.0f
+            assertEquals(0, lookingAheadPositionExcludingDmp.y.fastRoundToInt())
         }
-        rule.waitForIdle()
-
-        // No DMP, no position to exclude
-        assertEquals(200f, lookingAheadPosition.y)
-        assertEquals(200f, lookingAheadPositionExcludingDmp.y)
-
-        placeWithDirectManipulation = true
-        rule.waitForIdle()
-
-        assertEquals(200f, lookingAheadPosition.y)
-        // Round to int, since it may return -0.0f
-        assertEquals(0, lookingAheadPositionExcludingDmp.y.fastRoundToInt())
-    }
 
     private fun assertSameLayoutWithAndWithoutLookahead(
-        content: @Composable (
-            modifier: Modifier
-        ) -> Unit
+        content: @Composable (modifier: Modifier) -> Unit
     ) {
         val controlGroupSizes = mutableVectorOf<IntSize>()
         val controlGroupPositions = mutableVectorOf<Offset>()
@@ -3147,29 +2920,32 @@
         var enableControlGroup by mutableStateOf(true)
         rule.setContent {
             if (enableControlGroup) {
-                Layout(measurePolicy = defaultMeasurePolicy, content = {
-                    content(
-                        Modifier.trackSizeAndPosition(
-                            controlGroupSizes,
-                            controlGroupPositions,
-                        )
-                    )
-                })
-            } else {
-                Layout(measurePolicy = defaultMeasurePolicy, content = {
-                    LookaheadScope {
+                Layout(
+                    measurePolicy = defaultMeasurePolicy,
+                    content = {
                         content(
-                            Modifier
-                                .trackSizeAndPosition(sizes, positions)
-                                .assertSameSizeAndPosition(this)
+                            Modifier.trackSizeAndPosition(
+                                controlGroupSizes,
+                                controlGroupPositions,
+                            )
                         )
                     }
-                })
+                )
+            } else {
+                Layout(
+                    measurePolicy = defaultMeasurePolicy,
+                    content = {
+                        LookaheadScope {
+                            content(
+                                Modifier.trackSizeAndPosition(sizes, positions)
+                                    .assertSameSizeAndPosition(this)
+                            )
+                        }
+                    }
+                )
             }
         }
-        rule.runOnIdle {
-            enableControlGroup = !enableControlGroup
-        }
+        rule.runOnIdle { enableControlGroup = !enableControlGroup }
         rule.runOnIdle {
             if (Debug) {
                 controlGroupPositions.debugPrint("Lookahead")
@@ -3182,46 +2958,40 @@
                 assertEquals(position, positions[i])
             }
             assertEquals(controlGroupSizes.size, sizes.size)
-            controlGroupSizes.forEachIndexed { i, size ->
-                assertEquals(size, sizes[i])
-            }
+            controlGroupSizes.forEachIndexed { i, size -> assertEquals(size, sizes[i]) }
         }
     }
 
     private fun Modifier.assertSameSizeAndPosition(scope: LookaheadScope) = composed {
-        var lookaheadSize by remember {
-            mutableStateOf(IntSize.Zero)
-        }
-        var lookaheadLayoutCoordinates: LayoutCoordinates? by remember {
-            mutableStateOf(
-                null
-            )
-        }
+        var lookaheadSize by remember { mutableStateOf(IntSize.Zero) }
+        var lookaheadLayoutCoordinates: LayoutCoordinates? by remember { mutableStateOf(null) }
         var onPlacedCoordinates: LayoutCoordinates? by remember { mutableStateOf(null) }
         with(scope) {
-            this@composed
-                .createIntermediateElement(object : TestApproachLayoutModifierNode() {
-                    override fun isMeasurementApproachInProgress(lookaheadSize: IntSize): Boolean {
-                        return false
-                    }
+            this@composed.createIntermediateElement(
+                    object : TestApproachLayoutModifierNode() {
+                        override fun isMeasurementApproachInProgress(
+                            lookaheadSize: IntSize
+                        ): Boolean {
+                            return false
+                        }
 
-                    @ExperimentalComposeUiApi
-                    override fun ApproachMeasureScope.approachMeasure(
-                        measurable: Measurable,
-                        constraints: Constraints
-                    ): MeasureResult {
-                        assertFalse(isLookingAhead)
-                        lookaheadSize = this.lookaheadSize
-                        return measureWithLambdas(
-                            prePlacement = {
-                                lookaheadLayoutCoordinates = lookaheadScopeCoordinates
-                            }
-                        ).invoke(this, measurable, constraints)
+                        @ExperimentalComposeUiApi
+                        override fun ApproachMeasureScope.approachMeasure(
+                            measurable: Measurable,
+                            constraints: Constraints
+                        ): MeasureResult {
+                            assertFalse(isLookingAhead)
+                            lookaheadSize = this.lookaheadSize
+                            return measureWithLambdas(
+                                    prePlacement = {
+                                        lookaheadLayoutCoordinates = lookaheadScopeCoordinates
+                                    }
+                                )
+                                .invoke(this, measurable, constraints)
+                        }
                     }
-                })
-                .onPlaced { it ->
-                    onPlacedCoordinates = it
-                }
+                )
+                .onPlaced { it -> onPlacedCoordinates = it }
                 .onGloballyPositioned {
                     assertEquals(lookaheadSize, it.size)
                     assertEquals(
@@ -3235,14 +3005,8 @@
                     )
                     // Also check that localPositionOf with non-zero offset works
                     // correctly for lookahead coordinates and LayoutCoordinates.
-                    val randomOffset = Offset(
-                        Random
-                            .nextInt(0, 1000)
-                            .toFloat(),
-                        Random
-                            .nextInt(0, 1000)
-                            .toFloat()
-                    )
+                    val randomOffset =
+                        Offset(Random.nextInt(0, 1000).toFloat(), Random.nextInt(0, 1000).toFloat())
                     assertEquals(
                         lookaheadLayoutCoordinates!!
                             .toLookaheadCoordinates()
@@ -3269,8 +3033,8 @@
     private fun Modifier.trackSizeAndPosition(
         sizes: MutableVector<IntSize>,
         positions: MutableVector<Offset>
-    ) = this
-        .onGloballyPositioned {
+    ) =
+        this.onGloballyPositioned {
             positions.add(it.positionInRoot())
             sizes.add(it.size)
         }
@@ -3282,18 +3046,13 @@
         println()
     }
 
-    private val defaultMeasurePolicy: MeasurePolicy =
-        MeasurePolicy { measurables, constraints ->
-            val placeables = measurables.map { it.measure(constraints) }
-            val maxWidth: Int = placeables.maxOf { it.width }
-            val maxHeight = placeables.maxOf { it.height }
-            // Position the children.
-            layout(maxWidth, maxHeight) {
-                placeables.forEach {
-                    it.place(0, 0)
-                }
-            }
-        }
+    private val defaultMeasurePolicy: MeasurePolicy = MeasurePolicy { measurables, constraints ->
+        val placeables = measurables.map { it.measure(constraints) }
+        val maxWidth: Int = placeables.maxOf { it.width }
+        val maxHeight = placeables.maxOf { it.height }
+        // Position the children.
+        layout(maxWidth, maxHeight) { placeables.forEach { it.place(0, 0) } }
+    }
 
     private fun measureWithLambdas(
         preMeasure: () -> Unit = {},
@@ -3312,25 +3071,24 @@
     }
 
     internal fun Modifier.intermediateLayout(
-        measure: ApproachMeasureScope.(
-            measurable: Measurable,
-            constraints: Constraints,
-        ) -> MeasureResult,
+        measure:
+            ApproachMeasureScope.(
+                measurable: Measurable,
+                constraints: Constraints,
+            ) -> MeasureResult,
     ): Modifier = approachLayout({ !testFinished }, approachMeasure = measure)
 }
 
 private fun Modifier.createIntermediateElement(node: TestApproachLayoutModifierNode): Modifier =
     this then TestIntermediateElement(node)
 
-private data class TestIntermediateElement(
-    var intermediateNode: TestApproachLayoutModifierNode
-) : ModifierNodeElement<TestApproachLayoutModifierNode>() {
+private data class TestIntermediateElement(var intermediateNode: TestApproachLayoutModifierNode) :
+    ModifierNodeElement<TestApproachLayoutModifierNode>() {
     override fun create(): TestApproachLayoutModifierNode {
         return intermediateNode
     }
 
-    override fun update(node: TestApproachLayoutModifierNode) {
-    }
+    override fun update(node: TestApproachLayoutModifierNode) {}
 }
 
 abstract class TestApproachLayoutModifierNode : Modifier.Node(), ApproachLayoutModifierNode
diff --git a/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/layout/MeasureAndLayoutDelegateTest.kt b/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/layout/MeasureAndLayoutDelegateTest.kt
index e52ec8a..612d86e 100644
--- a/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/layout/MeasureAndLayoutDelegateTest.kt
+++ b/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/layout/MeasureAndLayoutDelegateTest.kt
@@ -41,14 +41,11 @@
     private val DifferentSize = 50
     private val DifferentSize2 = 30
 
-    @get:Rule
-    val excessiveAssertions = AndroidOwnerExtraAssertionsRule()
+    @get:Rule val excessiveAssertions = AndroidOwnerExtraAssertionsRule()
 
     @Test
     fun requiresMeasureWhenJustCreated() {
-        val root = root {
-            add(node())
-        }
+        val root = root { add(node()) }
 
         createDelegate(root, firstMeasureCompleted = false)
 
@@ -58,9 +55,7 @@
 
     @Test
     fun measureNotRequiredAfterFirstMeasure() {
-        val root = root {
-            add(node())
-        }
+        val root = root { add(node()) }
 
         createDelegate(root)
 
@@ -70,9 +65,7 @@
 
     @Test
     fun relayoutNotRequiredAfterFirstMeasure() {
-        val root = root {
-            add(node())
-        }
+        val root = root { add(node()) }
 
         createDelegate(root)
 
@@ -82,15 +75,9 @@
 
     @Test
     fun measuredAndLaidOutAfterFirstMeasureAndLayout() {
-        val root = root {
-            add(node())
-        }
+        val root = root { add(node()) }
 
-        assertRemeasured(root) {
-            assertRemeasured(root.first) {
-                createDelegate(root)
-            }
-        }
+        assertRemeasured(root) { assertRemeasured(root.first) { createDelegate(root) } }
     }
 
     @Test
@@ -114,9 +101,7 @@
 
     @Test
     fun childRemeasureRequest_remeasureRequired() {
-        val root = root {
-            add(node())
-        }
+        val root = root { add(node()) }
 
         val delegate = createDelegate(root)
 
@@ -126,9 +111,7 @@
 
     @Test
     fun childRemeasureRequest_childRemeasured() {
-        val root = root {
-            add(node())
-        }
+        val root = root { add(node()) }
 
         val delegate = createDelegate(root)
 
@@ -155,9 +138,7 @@
 
     @Test
     fun childRemeasureWithTheSameResult_parentNotRemeasured() {
-        val root = root {
-            add(node())
-        }
+        val root = root { add(node()) }
 
         val delegate = createDelegate(root)
 
@@ -171,11 +152,7 @@
     fun childRemeasureWithDifferentResult_parentRemeasured() {
         val root = root {
             wrapChildren = true
-            add(
-                node {
-                    size = DifferentSize
-                }
-            )
+            add(node { size = DifferentSize })
         }
 
         val delegate = createDelegate(root)
@@ -222,9 +199,7 @@
 
     @Test
     fun childRemeasureRequest_childRelaidOut() {
-        val root = root {
-            add(node())
-        }
+        val root = root { add(node()) }
 
         val delegate = createDelegate(root)
 
@@ -251,9 +226,7 @@
 
     @Test
     fun childRemeasureWithTheSameResult_parentNotRelaidOut() {
-        val root = root {
-            add(node())
-        }
+        val root = root { add(node()) }
 
         val delegate = createDelegate(root)
 
@@ -296,9 +269,7 @@
 
     @Test
     fun rootRemeasureRequest_childNotAffected() {
-        val root = root {
-            add(node())
-        }
+        val root = root { add(node()) }
 
         val delegate = createDelegate(root)
 
@@ -314,13 +285,7 @@
 
     @Test
     fun parentRemeasureRequest_childNotAffected() {
-        val root = root {
-            add(
-                node {
-                    add(node())
-                }
-            )
-        }
+        val root = root { add(node { add(node()) }) }
 
         val delegate = createDelegate(root)
 
@@ -338,9 +303,7 @@
 
     @Test
     fun childRelayoutRequest_childRelayoutRequired() {
-        val root = root {
-            add(node())
-        }
+        val root = root { add(node()) }
 
         val delegate = createDelegate(root)
 
@@ -350,9 +313,7 @@
 
     @Test
     fun childRelayoutRequest_childRelaidOut() {
-        val root = root {
-            add(node())
-        }
+        val root = root { add(node()) }
 
         val delegate = createDelegate(root)
 
@@ -364,9 +325,7 @@
 
     @Test
     fun childRelayoutRequest_childNotRemeasured() {
-        val root = root {
-            add(node())
-        }
+        val root = root { add(node()) }
 
         val delegate = createDelegate(root)
 
@@ -378,9 +337,7 @@
 
     @Test
     fun childRelayoutRequest_parentNotRemeasured() {
-        val root = root {
-            add(node())
-        }
+        val root = root { add(node()) }
 
         val delegate = createDelegate(root)
 
@@ -392,9 +349,7 @@
 
     @Test
     fun childRelayoutRequest_parentNotRelaidOut() {
-        val root = root {
-            add(node())
-        }
+        val root = root { add(node()) }
 
         val delegate = createDelegate(root)
 
@@ -436,9 +391,7 @@
 
     @Test
     fun rootRelayoutRequest_childNotAffected() {
-        val root = root {
-            add(node())
-        }
+        val root = root { add(node()) }
 
         val delegate = createDelegate(root)
 
@@ -452,13 +405,7 @@
 
     @Test
     fun parentRelayoutRequest_childNotAffected() {
-        val root = root {
-            add(
-                node {
-                    add(node())
-                }
-            )
-        }
+        val root = root { add(node { add(node()) }) }
 
         val delegate = createDelegate(root)
 
@@ -474,9 +421,7 @@
 
     @Test
     fun childRemeasureRequestedTwice_childRemeasuredOnce() {
-        val root = root {
-            add(node())
-        }
+        val root = root { add(node()) }
 
         val delegate = createDelegate(root)
 
@@ -489,9 +434,7 @@
 
     @Test
     fun childRemeasureRequestedTwice_childRelaidOutOnce() {
-        val root = root {
-            add(node())
-        }
+        val root = root { add(node()) }
 
         val delegate = createDelegate(root)
 
@@ -504,9 +447,7 @@
 
     @Test
     fun childRemeasureAndRelayoutRequested_childRemeasured() {
-        val root = root {
-            add(node())
-        }
+        val root = root { add(node()) }
 
         val delegate = createDelegate(root)
 
@@ -519,9 +460,7 @@
 
     @Test
     fun childRemeasureAndRelayoutRequested_childRelaidOut() {
-        val root = root {
-            add(node())
-        }
+        val root = root { add(node()) }
 
         val delegate = createDelegate(root)
 
@@ -534,9 +473,7 @@
 
     @Test
     fun childRelayoutAndRemeasureRequested_childRemeasured() {
-        val root = root {
-            add(node())
-        }
+        val root = root { add(node()) }
 
         val delegate = createDelegate(root)
 
@@ -549,9 +486,7 @@
 
     @Test
     fun childRelayoutAndRemeasureRequested_childRelaidOut() {
-        val root = root {
-            add(node())
-        }
+        val root = root { add(node()) }
 
         val delegate = createDelegate(root)
 
@@ -668,9 +603,7 @@
                 if (!isLookingAhead) {
                     placedNode.add(node())
                 }
-                with(MeasureInMeasureBlock()) {
-                    measure(measurables, constraints)
-                }
+                with(MeasureInMeasureBlock()) { measure(measurables, constraints) }
             }
             add(
                 virtualNode {
@@ -731,9 +664,7 @@
         }
         val root = root {
             measurePolicy = MeasurePolicy { measurables, _ ->
-                with(MeasureInMeasureBlock()) {
-                    measure(measurables, expectedConstraints)
-                }
+                with(MeasureInMeasureBlock()) { measure(measurables, expectedConstraints) }
             }
             add(
                 node {
@@ -765,11 +696,7 @@
     fun remeasureTwoNodesOnDifferentLayers_othersAreNotAffected() {
         val root = root {
             add(node())
-            add(
-                node {
-                    add(node())
-                }
-            )
+            add(node { add(node()) })
         }
 
         val delegate = createDelegate(root)
@@ -797,11 +724,7 @@
                     add(
                         node {
                             wrapChildren = true
-                            add(
-                                node {
-                                    size = DifferentSize
-                                }
-                            )
+                            add(node { size = DifferentSize })
                         }
                     )
                 }
@@ -827,16 +750,8 @@
     @Test
     fun remeasureRequestForItemsOnTheSameLevelButDifferentParents() {
         val root = root {
-            add(
-                node {
-                    add(node())
-                }
-            )
-            add(
-                node {
-                    add(node())
-                }
-            )
+            add(node { add(node()) })
+            add(node { add(node()) })
         }
 
         val delegate = createDelegate(root)
@@ -859,16 +774,8 @@
     @Test
     fun relayoutRequestForItemsOnTheSameLevelButDifferentParents() {
         val root = root {
-            add(
-                node {
-                    add(node())
-                }
-            )
-            add(
-                node {
-                    add(node())
-                }
-            )
+            add(node { add(node()) })
+            add(node { add(node()) })
         }
 
         val delegate = createDelegate(root)
@@ -891,16 +798,8 @@
     @Test
     fun relayoutAndRemeasureRequestForItemsOnTheSameLevelButDifferentParents() {
         val root = root {
-            add(
-                node {
-                    add(node())
-                }
-            )
-            add(
-                node {
-                    add(node())
-                }
-            )
+            add(node { add(node()) })
+            add(node { add(node()) })
         }
 
         val delegate = createDelegate(root)
@@ -924,17 +823,13 @@
 
     @Test
     fun requestChildRemeasureDuringMeasure() {
-        val root = root {
-            add(node())
-        }
+        val root = root { add(node()) }
 
         val delegate = createDelegate(root)
 
         assertRemeasured(root) {
             assertRemeasured(root.first) {
-                root.runDuringMeasure {
-                    delegate.requestRemeasure(root.first)
-                }
+                root.runDuringMeasure { delegate.requestRemeasure(root.first) }
                 delegate.requestRemeasure(root)
                 assertThat(delegate.measureAndLayout()).isFalse()
             }
@@ -943,22 +838,14 @@
 
     @Test
     fun requestGrandchildRemeasureDuringMeasure() {
-        val root = root {
-            add(
-                node {
-                    add(node())
-                }
-            )
-        }
+        val root = root { add(node { add(node()) }) }
 
         val delegate = createDelegate(root)
 
         assertRemeasured(root) {
             assertNotRemeasured(root.first) {
                 assertRemeasured(root.first.first) {
-                    root.runDuringMeasure {
-                        delegate.requestRemeasure(root.first.first)
-                    }
+                    root.runDuringMeasure { delegate.requestRemeasure(root.first.first) }
                     delegate.requestRemeasure(root)
                     assertThat(delegate.measureAndLayout()).isFalse()
                 }
@@ -968,17 +855,13 @@
 
     @Test
     fun requestChildRelayoutDuringMeasure() {
-        val root = root {
-            add(node())
-        }
+        val root = root { add(node()) }
 
         val delegate = createDelegate(root)
 
         assertRemeasured(root) {
             assertRelaidOut(root.first) {
-                root.runDuringMeasure {
-                    delegate.requestRelayout(root.first)
-                }
+                root.runDuringMeasure { delegate.requestRelayout(root.first) }
                 delegate.requestRemeasure(root)
                 assertThat(delegate.measureAndLayout()).isFalse()
             }
@@ -987,22 +870,14 @@
 
     @Test
     fun requestGrandchildRelayoutDuringMeasure() {
-        val root = root {
-            add(
-                node {
-                    add(node())
-                }
-            )
-        }
+        val root = root { add(node { add(node()) }) }
 
         val delegate = createDelegate(root)
 
         assertRemeasured(root) {
             assertNotRelaidOut(root.first) {
                 assertRelaidOut(root.first.first) {
-                    root.runDuringMeasure {
-                        delegate.requestRelayout(root.first.first)
-                    }
+                    root.runDuringMeasure { delegate.requestRelayout(root.first.first) }
                     delegate.requestRemeasure(root)
                     assertThat(delegate.measureAndLayout()).isFalse()
                 }
@@ -1012,17 +887,13 @@
 
     @Test
     fun requestChildRemeasureDuringParentLayout() {
-        val root = root {
-            add(node())
-        }
+        val root = root { add(node()) }
 
         val delegate = createDelegate(root)
 
         assertRelaidOut(root) {
             assertRemeasured(root.first) {
-                root.runDuringLayout {
-                    delegate.requestRemeasure(root.first)
-                }
+                root.runDuringLayout { delegate.requestRemeasure(root.first) }
                 delegate.requestRelayout(root)
                 assertThat(delegate.measureAndLayout()).isFalse()
             }
@@ -1031,22 +902,14 @@
 
     @Test
     fun requestGrandchildRemeasureDuringParentLayout() {
-        val root = root {
-            add(
-                node {
-                    add(node())
-                }
-            )
-        }
+        val root = root { add(node { add(node()) }) }
 
         val delegate = createDelegate(root)
 
         assertRelaidOut(root) {
             assertNotRelaidOut(root.first) {
                 assertRemeasured(root.first.first) {
-                    root.runDuringLayout {
-                        delegate.requestRemeasure(root.first.first)
-                    }
+                    root.runDuringLayout { delegate.requestRemeasure(root.first.first) }
                     delegate.requestRelayout(root)
                     assertThat(delegate.measureAndLayout()).isFalse()
                 }
@@ -1056,16 +919,12 @@
 
     @Test
     fun requestRemeasureForCurrentlyBeingRemeasuredNode() {
-        val root = root {
-            add(node())
-        }
+        val root = root { add(node()) }
 
         val delegate = createDelegate(root)
 
         assertRemeasured(root.first) {
-            root.runDuringMeasure {
-                delegate.requestRemeasure(root.first)
-            }
+            root.runDuringMeasure { delegate.requestRemeasure(root.first) }
             delegate.requestRemeasure(root.first)
             assertThat(delegate.measureAndLayout()).isFalse()
         }
@@ -1073,17 +932,13 @@
 
     @Test
     fun requestRelayoutForCurrentlyBeingRemeasuredNode() {
-        val root = root {
-            add(node())
-        }
+        val root = root { add(node()) }
 
         val delegate = createDelegate(root)
 
         assertRemeasured(root.first) {
             assertRelaidOut(root.first) {
-                root.runDuringMeasure {
-                    delegate.requestRelayout(root.first)
-                }
+                root.runDuringMeasure { delegate.requestRelayout(root.first) }
                 delegate.requestRemeasure(root.first)
                 assertThat(delegate.measureAndLayout()).isFalse()
             }
@@ -1092,17 +947,13 @@
 
     @Test
     fun requestRemeasureForCurrentlyBeingRelayoutNode() {
-        val root = root {
-            add(node())
-        }
+        val root = root { add(node()) }
 
         val delegate = createDelegate(root)
 
         assertRemeasured(root.first) {
             assertRelaidOut(root.first, times = 2) {
-                root.first.runDuringLayout {
-                    delegate.requestRemeasure(root.first)
-                }
+                root.first.runDuringLayout { delegate.requestRemeasure(root.first) }
                 delegate.requestRelayout(root.first)
                 assertThat(delegate.measureAndLayout()).isFalse()
             }
@@ -1111,17 +962,13 @@
 
     @Test
     fun requestRelayoutForCurrentlyBeingRelayoutNode() {
-        val root = root {
-            add(node())
-        }
+        val root = root { add(node()) }
 
         val delegate = createDelegate(root)
 
         assertNotRemeasured(root.first) {
             assertRelaidOut(root.first) {
-                root.runDuringLayout {
-                    delegate.requestRelayout(root.first)
-                }
+                root.runDuringLayout { delegate.requestRelayout(root.first) }
                 delegate.requestRelayout(root.first)
                 assertThat(delegate.measureAndLayout()).isFalse()
             }
@@ -1132,22 +979,14 @@
 
     @Test
     fun changingParentParamsToTheSameValue_noRemeasures() {
-        val root = root {
-            add(
-                node {
-                    add(node())
-                }
-            )
-        }
+        val root = root { add(node { add(node()) }) }
 
         val delegate = createDelegate(root)
 
         assertNotRemeasured(root) {
             assertNotRemeasured(root.first) {
                 assertNotRemeasured(root.first.first) {
-                    delegate.updateRootConstraints(
-                        defaultRootConstraints()
-                    )
+                    delegate.updateRootConstraints(defaultRootConstraints())
                     assertThat(delegate.measureAndLayout()).isFalse()
                 }
             }
@@ -1156,13 +995,7 @@
 
     @Test
     fun changingParentConstraints_remeasureSubTree() {
-        val root = root {
-            add(
-                node {
-                    add(node())
-                }
-            )
-        }
+        val root = root { add(node { add(node()) }) }
 
         val delegate = createDelegate(root)
 
@@ -1206,13 +1039,7 @@
     @Test
     fun requestRemeasureTriggersModifierRemeasure() {
         val spyModifier = SpyLayoutModifier()
-        val root = root {
-            add(
-                node {
-                    modifier = spyModifier
-                }
-            )
-        }
+        val root = root { add(node { modifier = spyModifier }) }
 
         val delegate = createDelegate(root)
 
@@ -1225,13 +1052,7 @@
     @Test
     fun requestRelayoutTriggersModifierRelayout() {
         val spyModifier = SpyLayoutModifier()
-        val root = root {
-            add(
-                node {
-                    modifier = spyModifier
-                }
-            )
-        }
+        val root = root { add(node { modifier = spyModifier }) }
 
         val delegate = createDelegate(root)
 
@@ -1307,9 +1128,7 @@
 
     @Test
     fun hasRelayoutNodes() {
-        val root = root {
-            add(node())
-        }
+        val root = root { add(node()) }
         val delegate = createDelegate(root)
         assertThat(delegate.hasPendingMeasureOrLayout).isFalse()
         delegate.requestRemeasure(root.first)
@@ -1320,17 +1139,7 @@
 
     @Test
     fun theWholeSubtreeIsNotPlacedWhenParentWasntPlaced() {
-        val root = root {
-            add(
-                node {
-                    add(
-                        node {
-                            add(node())
-                        }
-                    )
-                }
-            )
-        }
+        val root = root { add(node { add(node { add(node()) }) }) }
 
         val delegate = createDelegate(root)
 
@@ -1353,15 +1162,19 @@
         lateinit var node5: LayoutNode
         val root = root {
             size = 100
-            add(node {
-                node1 = this
-                size = 50
-                add(node {
-                    node2 = this
-                    add(node { node3 = this })
-                })
-                add(node { node4 = this })
-            })
+            add(
+                node {
+                    node1 = this
+                    size = 50
+                    add(
+                        node {
+                            node2 = this
+                            add(node { node3 = this })
+                        }
+                    )
+                    add(node { node4 = this })
+                }
+            )
             add(node { node5 = this })
         }
 
@@ -1374,9 +1187,7 @@
         // be remeasured via owner.forceMeasureTheSubtree() logic.
         delegate.requestRemeasure(node3)
         // we also want node5 to synchronously request remeasure for already measured node1
-        node5.runDuringMeasure {
-            delegate.requestRemeasure(node1)
-        }
+        node5.runDuringMeasure { delegate.requestRemeasure(node1) }
         node2.toString()
         node4.toString()
         // this was crashing and reported as b/208675143
@@ -1385,9 +1196,7 @@
                 assertNotRemeasured(node2) {
                     assertRemeasured(node3) {
                         assertNotRemeasured(node4) {
-                            assertRemeasured(node5) {
-                                delegate.measureAndLayout()
-                            }
+                            assertRemeasured(node5) { delegate.measureAndLayout() }
                         }
                     }
                 }
@@ -1404,15 +1213,19 @@
 
         var activeLayers = 0
 
-        val delegate = createDelegate(root, createLayer = {
-            activeLayers++
-            object : MockLayer() {
-                override fun destroy() {
-                    super.destroy()
-                    activeLayers--
+        val delegate =
+            createDelegate(
+                root,
+                createLayer = {
+                    activeLayers++
+                    object : MockLayer() {
+                        override fun destroy() {
+                            super.destroy()
+                            activeLayers--
+                        }
+                    }
                 }
-            }
-        })
+            )
 
         assertThat(activeLayers).isEqualTo(1)
 
@@ -1428,31 +1241,37 @@
     @Test
     fun removingModifierWithLayerFromTheNodeDestroysTheLayer() {
         val root = root {
-            add(node {
-                modifier = Modifier
-                    .graphicsLayer()
-                    // we add extra layout modifier after graphicsLayer so the layer is added on
-                    // the coordinator associated with the modifier which is going to be removed
-                    .layout { measurable, constraints ->
-                        val placeable = measurable.measure(constraints)
-                        layout(placeable.width, placeable.height) {
-                            placeable.place(0, 0)
-                        }
-                    }
-            })
+            add(
+                node {
+                    modifier =
+                        Modifier.graphicsLayer()
+                            // we add extra layout modifier after graphicsLayer so the layer is
+                            // added on
+                            // the coordinator associated with the modifier which is going to be
+                            // removed
+                            .layout { measurable, constraints ->
+                                val placeable = measurable.measure(constraints)
+                                layout(placeable.width, placeable.height) { placeable.place(0, 0) }
+                            }
+                }
+            )
         }
 
         var activeLayers = 0
 
-        val delegate = createDelegate(root, createLayer = {
-            activeLayers++
-            object : MockLayer() {
-                override fun destroy() {
-                    super.destroy()
-                    activeLayers--
+        val delegate =
+            createDelegate(
+                root,
+                createLayer = {
+                    activeLayers++
+                    object : MockLayer() {
+                        override fun destroy() {
+                            super.destroy()
+                            activeLayers--
+                        }
+                    }
                 }
-            }
-        })
+            )
 
         assertThat(activeLayers).isEqualTo(1)
 
diff --git a/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/layout/MeasureInPlacementTest.kt b/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/layout/MeasureInPlacementTest.kt
index 2895fac..e56b846 100644
--- a/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/layout/MeasureInPlacementTest.kt
+++ b/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/layout/MeasureInPlacementTest.kt
@@ -48,36 +48,27 @@
 @RunWith(AndroidJUnit4::class)
 class MeasureInPlacementTest {
 
-    @Suppress("DEPRECATION")
-    @get:Rule
-    val rule = createAndroidComposeRule<TestActivity>()
+    @Suppress("DEPRECATION") @get:Rule val rule = createAndroidComposeRule<TestActivity>()
 
     @Before
     fun setup() {
         rule.activity.hasFocusLatch.await(5, TimeUnit.SECONDS)
     }
 
-    /**
-     * Make sure that measurement in the layout modifier's placement block doesn't crash.
-     */
+    /** Make sure that measurement in the layout modifier's placement block doesn't crash. */
     @Test
     fun measureInModifierPlacement() {
         var childSize = IntSize.Zero
         rule.setContent {
-            val measureInPlaceModifier = Modifier.layout { measurable, constraints ->
-                layout(100, 100) {
-                    val p = measurable.measure(constraints)
-                    childSize = IntSize(p.width, p.height)
-                    p.place(0, 0)
+            val measureInPlaceModifier =
+                Modifier.layout { measurable, constraints ->
+                    layout(100, 100) {
+                        val p = measurable.measure(constraints)
+                        childSize = IntSize(p.width, p.height)
+                        p.place(0, 0)
+                    }
                 }
-            }
-            Box(
-                Modifier
-                    .fillMaxSize()
-                    .then(measureInPlaceModifier)
-            ) {
-                Box(Modifier.size(10.dp))
-            }
+            Box(Modifier.fillMaxSize().then(measureInPlaceModifier)) { Box(Modifier.size(10.dp)) }
         }
 
         rule.waitForIdle()
@@ -85,16 +76,15 @@
         assertThat(childSize.height).isGreaterThan(0)
     }
 
-    /**
-     * Make sure that measurement in the layout's placement block doesn't crash.
-     */
+    /** Make sure that measurement in the layout's placement block doesn't crash. */
     @Test
     fun measureInLayoutPlacement() {
         var childSize = IntSize.Zero
         rule.setContent {
-            Layout(modifier = Modifier.fillMaxSize(), content = @Composable {
-                Box(Modifier.size(10.dp))
-            }) { measurables, constraints ->
+            Layout(
+                modifier = Modifier.fillMaxSize(),
+                content = @Composable { Box(Modifier.size(10.dp)) }
+            ) { measurables, constraints ->
                 layout(100, 100) {
                     val p = measurables[0].measure(constraints)
                     childSize = IntSize(p.width, p.height)
@@ -118,18 +108,15 @@
         var childSize = IntSize.Zero
         rule.setContent {
             LookaheadScope {
-                val measureInPlaceModifier = Modifier.layout { measurable, constraints ->
-                    layout(100, 100) {
-                        val p = measurable.measure(constraints)
-                        childSize = IntSize(p.width, p.height)
-                        p.place(0, 0)
+                val measureInPlaceModifier =
+                    Modifier.layout { measurable, constraints ->
+                        layout(100, 100) {
+                            val p = measurable.measure(constraints)
+                            childSize = IntSize(p.width, p.height)
+                            p.place(0, 0)
+                        }
                     }
-                }
-                Box(
-                    Modifier
-                        .fillMaxSize()
-                        .then(measureInPlaceModifier)
-                ) {
+                Box(Modifier.fillMaxSize().then(measureInPlaceModifier)) {
                     Box(Modifier.size(10.dp))
                 }
             }
@@ -141,8 +128,7 @@
     }
 
     /**
-     * Make sure that measurement in the layout's placement block doesn't crash in
-     * lookahead scope.
+     * Make sure that measurement in the layout's placement block doesn't crash in lookahead scope.
      */
     @OptIn(ExperimentalComposeUiApi::class)
     @Test
@@ -150,9 +136,10 @@
         var childSize = IntSize.Zero
         rule.setContent {
             LookaheadScope {
-                Layout(modifier = Modifier.fillMaxSize(), content = @Composable {
-                    Box(Modifier.size(10.dp))
-                }) { measurables, constraints ->
+                Layout(
+                    modifier = Modifier.fillMaxSize(),
+                    content = @Composable { Box(Modifier.size(10.dp)) }
+                ) { measurables, constraints ->
                     layout(100, 100) {
                         val p = measurables[0].measure(constraints)
                         childSize = IntSize(p.width, p.height)
@@ -171,13 +158,12 @@
     fun remeasureRequestForANodeWhichIsNotYetPlacedButMeasuredAlready() {
         var needToMeasureTopBar by mutableStateOf(false)
         var topBoxSize by mutableStateOf(0.dp)
-        val stateBasedSize = Modifier.layout { measurable, _ ->
-            val sizePx = topBoxSize.roundToPx()
-            val placeable = measurable.measure(Constraints.fixed(sizePx, sizePx))
-            layout(placeable.width, placeable.height) {
-                placeable.place(0, 0)
+        val stateBasedSize =
+            Modifier.layout { measurable, _ ->
+                val sizePx = topBoxSize.roundToPx()
+                val placeable = measurable.measure(Constraints.fixed(sizePx, sizePx))
+                layout(placeable.width, placeable.height) { placeable.place(0, 0) }
             }
-        }
         rule.setContent {
             Layout(
                 content = {
@@ -186,34 +172,31 @@
                 }
             ) { measurables, constraints ->
                 layout(constraints.maxWidth, constraints.maxHeight) {
-                    val topBarHeight = if (needToMeasureTopBar) {
-                        val placeable = measurables[0].measure(Constraints())
-                        if (Snapshot.withoutReadObservation { topBoxSize } == 0.dp) {
-                            topBoxSize = 10.dp
-                            // it will synchronously request one more remeasure for measurables[0]
-                            // while it is still not placed. such requests were ignored previously
-                            // meaning that given remeasure will never happen.
-                            Snapshot.sendApplyNotifications()
+                    val topBarHeight =
+                        if (needToMeasureTopBar) {
+                            val placeable = measurables[0].measure(Constraints())
+                            if (Snapshot.withoutReadObservation { topBoxSize } == 0.dp) {
+                                topBoxSize = 10.dp
+                                // it will synchronously request one more remeasure for
+                                // measurables[0]
+                                // while it is still not placed. such requests were ignored
+                                // previously
+                                // meaning that given remeasure will never happen.
+                                Snapshot.sendApplyNotifications()
+                            }
+                            placeable.place(0, 0)
+                            placeable.height
+                        } else {
+                            0
                         }
-                        placeable.place(0, 0)
-                        placeable.height
-                    } else {
-                        0
-                    }
                     measurables[1].measure(Constraints()).place(0, topBarHeight)
                 }
             }
         }
 
-        rule.runOnIdle {
-            needToMeasureTopBar = true
-        }
+        rule.runOnIdle { needToMeasureTopBar = true }
 
-        rule.onNodeWithTag("bottom")
-            .assertIsDisplayed()
-            .assertPositionInRootIsEqualTo(0.dp, 10.dp)
-        rule.onNodeWithTag("top")
-            .assertIsDisplayed()
-            .assertPositionInRootIsEqualTo(0.dp, 0.dp)
+        rule.onNodeWithTag("bottom").assertIsDisplayed().assertPositionInRootIsEqualTo(0.dp, 10.dp)
+        rule.onNodeWithTag("top").assertIsDisplayed().assertPositionInRootIsEqualTo(0.dp, 0.dp)
     }
 }
diff --git a/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/layout/MeasureOnlyTest.kt b/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/layout/MeasureOnlyTest.kt
index ec24356..8b3eb32 100644
--- a/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/layout/MeasureOnlyTest.kt
+++ b/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/layout/MeasureOnlyTest.kt
@@ -45,12 +45,9 @@
 @MediumTest
 @RunWith(AndroidJUnit4::class)
 class MeasureOnlyTest {
-    @get:Rule
-    val rule = createAndroidComposeRule<ComponentActivity>()
+    @get:Rule val rule = createAndroidComposeRule<ComponentActivity>()
 
-    /**
-     * onMeasure() shouldn't call placement or onPlace() or onGloballyPositioned()
-     */
+    /** onMeasure() shouldn't call placement or onPlace() or onGloballyPositioned() */
     @Test
     fun onMeasureDoesNotPlace() {
         var onPlacedCalled: Boolean
@@ -60,17 +57,16 @@
 
         rule.setContent {
             view = LocalView.current
-            Layout(modifier = Modifier
-                .fillMaxSize()
-                .background(Color.Blue)
-                .onPlaced { onPlacedCalled = true }
-                .onGloballyPositioned { onGloballyPositionedCalled = true }
+            Layout(
+                modifier =
+                    Modifier.fillMaxSize()
+                        .background(Color.Blue)
+                        .onPlaced { onPlacedCalled = true }
+                        .onGloballyPositioned { onGloballyPositionedCalled = true }
             ) { _, constraints ->
                 val width = constraints.constrainWidth(10000)
                 val height = constraints.constrainHeight(10000)
-                layout(width, height) {
-                    placementCalled = true
-                }
+                layout(width, height) { placementCalled = true }
             }
         }
 
@@ -94,22 +90,18 @@
 
         rule.setContent {
             view = LocalView.current
-            val child = @Composable {
-                Layout { _, _ ->
-                    childMeasured = true
-                    layout(10, 10) { }
+            val child =
+                @Composable {
+                    Layout { _, _ ->
+                        childMeasured = true
+                        layout(10, 10) {}
+                    }
                 }
-            }
-            Layout(
-                content = child,
-                modifier = Modifier
-                    .fillMaxSize()
-                    .background(Color.Blue)
-            ) { measurables, constraints ->
+            Layout(content = child, modifier = Modifier.fillMaxSize().background(Color.Blue)) {
+                measurables,
+                constraints ->
                 val p = measurables[0].measure(constraints)
-                layout(p.width, p.height) {
-                    p.place(0, 0)
-                }
+                layout(p.width, p.height) { p.place(0, 0) }
             }
         }
 
@@ -129,18 +121,16 @@
 
         rule.setContent {
             view = LocalView.current
-            val child = @Composable {
-                Layout { _, _ ->
-                    childMeasured = true
-                    layout(10, 10) { }
+            val child =
+                @Composable {
+                    Layout { _, _ ->
+                        childMeasured = true
+                        layout(10, 10) {}
+                    }
                 }
-            }
-            Layout(
-                content = child,
-                modifier = Modifier
-                    .fillMaxSize()
-                    .background(Color.Blue)
-            ) { measurables, constraints ->
+            Layout(content = child, modifier = Modifier.fillMaxSize().background(Color.Blue)) {
+                measurables,
+                constraints ->
                 layout(100, 100) {
                     val p = measurables[0].measure(constraints)
                     p.place(0, 0)
@@ -165,22 +155,18 @@
 
         rule.setContent {
             view = LocalView.current
-            val child = @Composable {
-                Layout { _, _ ->
-                    childMeasured = true
-                    layout(childSize.width, childSize.height) { }
+            val child =
+                @Composable {
+                    Layout { _, _ ->
+                        childMeasured = true
+                        layout(childSize.width, childSize.height) {}
+                    }
                 }
-            }
-            Layout(
-                content = child,
-                modifier = Modifier
-                    .fillMaxSize()
-                    .background(Color.Blue)
-            ) { measurables, constraints ->
+            Layout(content = child, modifier = Modifier.fillMaxSize().background(Color.Blue)) {
+                measurables,
+                constraints ->
                 val p = measurables[0].measure(constraints)
-                layout(p.width, p.height) {
-                    p.place(0, 0)
-                }
+                layout(p.width, p.height) { p.place(0, 0) }
             }
         }
 
@@ -210,18 +196,16 @@
 
         rule.setContent {
             view = LocalView.current
-            val child = @Composable {
-                Layout { _, _ ->
-                    childMeasured = true
-                    layout(childSize.width, childSize.height) { }
+            val child =
+                @Composable {
+                    Layout { _, _ ->
+                        childMeasured = true
+                        layout(childSize.width, childSize.height) {}
+                    }
                 }
-            }
-            Layout(
-                content = child,
-                modifier = Modifier
-                    .fillMaxSize()
-                    .background(Color.Blue)
-            ) { measurables, constraints ->
+            Layout(content = child, modifier = Modifier.fillMaxSize().background(Color.Blue)) {
+                measurables,
+                constraints ->
                 layout(10, 10) {
                     val p = measurables[0].measure(constraints)
                     p.place(0, 0)
@@ -248,8 +232,8 @@
     }
 
     /**
-     * When a descendant affects the root size, the root should resize when the
-     * descendant changes size.
+     * When a descendant affects the root size, the root should resize when the descendant changes
+     * size.
      */
     @Test
     fun remeasureRoot() {
@@ -257,40 +241,42 @@
         var showContent by mutableStateOf(false)
         rule.setContent {
             view = LocalView.current
-            AndroidView(factory = { context ->
-                ComposeView(context).apply {
-                    setContent {
-                        Box {
-                            Layout { _, _ ->
-                                val size = if (showContent) 10 else 0
-                                layout(size, size) {}
+            AndroidView(
+                factory = { context ->
+                    ComposeView(context).apply {
+                        setContent {
+                            Box {
+                                Layout { _, _ ->
+                                    val size = if (showContent) 10 else 0
+                                    layout(size, size) {}
+                                }
                             }
                         }
                     }
                 }
-            })
+            )
         }
         rule.runOnIdle {
             assertThat(view.height).isEqualTo(0)
             showContent = true
         }
-        rule.runOnIdle {
-            assertThat(view.height).isEqualTo(10)
-        }
+        rule.runOnIdle { assertThat(view.height).isEqualTo(10) }
     }
 
     @Test
     fun measureWidthTooLarge() {
         var exception: IllegalStateException? = null
         rule.setContent {
-            Box(Modifier.layout { _, _ ->
-                try {
-                    layout(1 shl 24, 100) {}
-                } catch (e: IllegalStateException) {
-                    exception = e
-                    layout(0, 0) {}
+            Box(
+                Modifier.layout { _, _ ->
+                    try {
+                        layout(1 shl 24, 100) {}
+                    } catch (e: IllegalStateException) {
+                        exception = e
+                        layout(0, 0) {}
+                    }
                 }
-            })
+            )
         }
         rule.waitForIdle()
         assertThat(exception).isNotNull()
@@ -300,14 +286,16 @@
     fun measureHeightTooLarge() {
         var exception: IllegalStateException? = null
         rule.setContent {
-            Box(Modifier.layout { _, _ ->
-                try {
-                    layout(100, 1 shl 24) {}
-                } catch (e: IllegalStateException) {
-                    exception = e
-                    layout(0, 0) {}
+            Box(
+                Modifier.layout { _, _ ->
+                    try {
+                        layout(100, 1 shl 24) {}
+                    } catch (e: IllegalStateException) {
+                        exception = e
+                        layout(0, 0) {}
+                    }
                 }
-            })
+            )
         }
         rule.waitForIdle()
         assertThat(exception).isNotNull()
diff --git a/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/layout/MeasuringPlacingTwiceIsNotAllowedTest.kt b/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/layout/MeasuringPlacingTwiceIsNotAllowedTest.kt
index a21ac3e..8f26b63 100644
--- a/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/layout/MeasuringPlacingTwiceIsNotAllowedTest.kt
+++ b/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/layout/MeasuringPlacingTwiceIsNotAllowedTest.kt
@@ -31,42 +31,43 @@
 @RunWith(AndroidJUnit4::class)
 class MeasuringPlacingTwiceIsNotAllowedTest {
 
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
     @Test
     fun measureTwiceInMeasureBlock() {
-        assertException(measureBlock = { measurable, constraints ->
-            measurable.measure(constraints)
-            measurable.measure(constraints)
-        })
+        assertException(
+            measureBlock = { measurable, constraints ->
+                measurable.measure(constraints)
+                measurable.measure(constraints)
+            }
+        )
     }
 
     @Test
     fun measureTwiceInMeasureBlockWithDifferentConstraints() {
-        assertException(measureBlock = { measurable, _ ->
-            measurable.measure(Constraints.fixed(100, 100))
-            measurable.measure(Constraints.fixed(200, 200))
-        })
+        assertException(
+            measureBlock = { measurable, _ ->
+                measurable.measure(Constraints.fixed(100, 100))
+                measurable.measure(Constraints.fixed(200, 200))
+            }
+        )
     }
 
     @Test
     fun measureTwiceInLayoutBlock() {
-        assertException(layoutBlock = { measurable, constraints ->
-            measurable.measure(constraints)
-            measurable.measure(constraints)
-        })
+        assertException(
+            layoutBlock = { measurable, constraints ->
+                measurable.measure(constraints)
+                measurable.measure(constraints)
+            }
+        )
     }
 
     @Test
     fun measureInBothStages() {
         assertException(
-            measureBlock = { measurable, constraints ->
-                measurable.measure(constraints)
-            },
-            layoutBlock = { measurable, constraints ->
-                measurable.measure(constraints)
-            }
+            measureBlock = { measurable, constraints -> measurable.measure(constraints) },
+            layoutBlock = { measurable, constraints -> measurable.measure(constraints) }
         )
     }
 
@@ -112,9 +113,7 @@
     ) {
         var exception: Exception? = null
         rule.setContent {
-            Layout(content = {
-                AtLeastSize(50)
-            }) { measurables, constraints ->
+            Layout(content = { AtLeastSize(50) }) { measurables, constraints ->
                 try {
                     measureBlock(measurables.first(), constraints)
                 } catch (e: Exception) {
diff --git a/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/layout/MultiContentLayoutTest.kt b/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/layout/MultiContentLayoutTest.kt
index b58eea6..db31ee9 100644
--- a/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/layout/MultiContentLayoutTest.kt
+++ b/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/layout/MultiContentLayoutTest.kt
@@ -45,11 +45,9 @@
 @RunWith(AndroidJUnit4::class)
 class MultiContentLayoutTest {
 
-    @get:Rule
-    val rule = createAndroidComposeRule<TestActivity>()
+    @get:Rule val rule = createAndroidComposeRule<TestActivity>()
 
-    @get:Rule
-    val excessiveAssertions = AndroidOwnerExtraAssertionsRule()
+    @get:Rule val excessiveAssertions = AndroidOwnerExtraAssertionsRule()
 
     var size: Dp = Dp.Unspecified
 
@@ -61,13 +59,10 @@
     @Test
     fun haveOneSlotWithOneItem() {
         rule.setContent {
-            val first = @Composable {
-                Item(0)
-            }
-            Layout(
-                contents = listOf(first),
-                modifier = Modifier.size(100.dp)
-            ) { (firstSlot), constraints ->
+            val first = @Composable { Item(0) }
+            Layout(contents = listOf(first), modifier = Modifier.size(100.dp)) {
+                (firstSlot),
+                constraints ->
                 assertThat(firstSlot.size).isEqualTo(1)
                 layoutAsRow(constraints, firstSlot)
             }
@@ -80,10 +75,9 @@
     fun haveOneSlotWithNoItems() {
         rule.setContent {
             val first = @Composable {}
-            Layout(
-                contents = listOf(first),
-                modifier = Modifier.size(100.dp)
-            ) { (firstSlot), constraints ->
+            Layout(contents = listOf(first), modifier = Modifier.size(100.dp)) {
+                (firstSlot),
+                constraints ->
                 assertThat(firstSlot.size).isEqualTo(0)
                 layoutAsRow(constraints, firstSlot)
             }
@@ -93,14 +87,14 @@
     @Test
     fun haveOneSlotWithTwoItems() {
         rule.setContent {
-            val first = @Composable {
-                Item(0)
-                Item(1)
-            }
-            Layout(
-                contents = listOf(first),
-                modifier = Modifier.size(100.dp)
-            ) { (firstSlot), constraints ->
+            val first =
+                @Composable {
+                    Item(0)
+                    Item(1)
+                }
+            Layout(contents = listOf(first), modifier = Modifier.size(100.dp)) {
+                (firstSlot),
+                constraints ->
                 assertThat(firstSlot.size).isEqualTo(2)
                 layoutAsRow(constraints, firstSlot)
             }
@@ -112,16 +106,11 @@
     @Test
     fun haveTwoSlotsWithOneItem() {
         rule.setContent {
-            val first = @Composable {
-                Item(0)
-            }
-            val second = @Composable {
-                Item(1)
-            }
-            Layout(
-                contents = listOf(first, second),
-                modifier = Modifier.size(100.dp)
-            ) { (firstSlot, secondSlot), constraints ->
+            val first = @Composable { Item(0) }
+            val second = @Composable { Item(1) }
+            Layout(contents = listOf(first, second), modifier = Modifier.size(100.dp)) {
+                (firstSlot, secondSlot),
+                constraints ->
                 assertThat(firstSlot.size).isEqualTo(1)
                 assertThat(secondSlot.size).isEqualTo(1)
                 layoutAsRow(constraints, firstSlot + secondSlot)
@@ -134,14 +123,11 @@
     @Test
     fun haveTwoSlotsWithNoItemsInOne() {
         rule.setContent {
-            val first = @Composable {
-                Item(0)
-            }
+            val first = @Composable { Item(0) }
             val second = @Composable {}
-            Layout(
-                contents = listOf(first, second),
-                modifier = Modifier.size(100.dp)
-            ) { (firstSlot, secondSlot), constraints ->
+            Layout(contents = listOf(first, second), modifier = Modifier.size(100.dp)) {
+                (firstSlot, secondSlot),
+                constraints ->
                 assertThat(firstSlot.size).isEqualTo(1)
                 assertThat(secondSlot.size).isEqualTo(0)
                 layoutAsRow(constraints, firstSlot + secondSlot)
@@ -154,17 +140,15 @@
     @Test
     fun haveTwoSlotsWithDifferentNumberOfItems() {
         rule.setContent {
-            val first = @Composable {
-                Item(0)
-                Item(1)
-            }
-            val second = @Composable {
-                Item(2)
-            }
-            Layout(
-                contents = listOf(first, second),
-                modifier = Modifier.size(100.dp)
-            ) { (firstSlot, secondSlot), constraints ->
+            val first =
+                @Composable {
+                    Item(0)
+                    Item(1)
+                }
+            val second = @Composable { Item(2) }
+            Layout(contents = listOf(first, second), modifier = Modifier.size(100.dp)) {
+                (firstSlot, secondSlot),
+                constraints ->
                 assertThat(firstSlot.size).isEqualTo(2)
                 assertThat(secondSlot.size).isEqualTo(1)
                 layoutAsRow(constraints, firstSlot + secondSlot)
@@ -177,20 +161,15 @@
     @Test
     fun haveFiveSlots() {
         rule.setContent {
-            val first = @Composable {
-                Item(0)
-            }
-            val second = @Composable {
-                Item(1)
-            }
-            val third = @Composable {
-                Item(2)
-                Item(3)
-            }
+            val first = @Composable { Item(0) }
+            val second = @Composable { Item(1) }
+            val third =
+                @Composable {
+                    Item(2)
+                    Item(3)
+                }
             val fourth = @Composable {}
-            val fifth = @Composable {
-                Item(4)
-            }
+            val fifth = @Composable { Item(4) }
             Layout(
                 contents = listOf(first, second, third, fourth, fifth),
                 modifier = Modifier.size(100.dp)
@@ -214,24 +193,17 @@
     fun updatingItemCount() {
         var itemCount by mutableStateOf(1)
         rule.setContent {
-            val first = @Composable {
-                repeat(itemCount) {
-                    Item(it)
-                }
-            }
-            Layout(
-                contents = listOf(first),
-                modifier = Modifier.size(100.dp)
-            ) { (firstSlot), constraints ->
+            val first = @Composable { repeat(itemCount) { Item(it) } }
+            Layout(contents = listOf(first), modifier = Modifier.size(100.dp)) {
+                (firstSlot),
+                constraints ->
                 layoutAsRow(constraints, firstSlot)
             }
         }
 
         assertItemsLaidOutAsRow(0..0)
 
-        rule.runOnIdle {
-            itemCount = 3
-        }
+        rule.runOnIdle { itemCount = 3 }
 
         assertItemsLaidOutAsRow(0..2)
     }
@@ -240,17 +212,9 @@
     fun updatingSlotCount() {
         var slotCount by mutableStateOf(1)
         rule.setContent {
-            val contents = buildList<@Composable () -> Unit> {
-                repeat(slotCount) {
-                    add {
-                        Item(it)
-                    }
-                }
-            }
-            Layout(
-                contents = contents,
-                modifier = Modifier.size(100.dp)
-            ) { slots, constraints ->
+            val contents =
+                buildList<@Composable () -> Unit> { repeat(slotCount) { add { Item(it) } } }
+            Layout(contents = contents, modifier = Modifier.size(100.dp)) { slots, constraints ->
                 assertThat(slots.size).isEqualTo(contents.size)
                 layoutAsRow(constraints, slots.flatten())
             }
@@ -258,9 +222,7 @@
 
         assertItemsLaidOutAsRow(0..0)
 
-        rule.runOnIdle {
-            slotCount = 3
-        }
+        rule.runOnIdle { slotCount = 3 }
 
         assertItemsLaidOutAsRow(0..2)
     }
@@ -269,20 +231,15 @@
     fun defaultIntrinsics() {
         rule.setContent {
             Layout({
-                val first = @Composable {
-                    BoxWithIntrinsics(1, 2, 100, 200)
-                    BoxWithIntrinsics(4, 3, 300, 400)
-                }
-                val second = @Composable {
-                    BoxWithIntrinsics(10, 11, 12, 13)
-                }
-                Layout(
-                    contents = listOf(first, second)
-                ) { (_, secondSlot), constraints ->
-                    val placeable = secondSlot.first().measure(constraints)
-                    layout(placeable.width, placeable.height) {
-                        placeable.place(0, 0)
+                val first =
+                    @Composable {
+                        BoxWithIntrinsics(1, 2, 100, 200)
+                        BoxWithIntrinsics(4, 3, 300, 400)
                     }
+                val second = @Composable { BoxWithIntrinsics(10, 11, 12, 13) }
+                Layout(contents = listOf(first, second)) { (_, secondSlot), constraints ->
+                    val placeable = secondSlot.first().measure(constraints)
+                    layout(placeable.width, placeable.height) { placeable.place(0, 0) }
                 }
             }) { measurables, _ ->
                 val box = measurables[0]
@@ -290,7 +247,7 @@
                 assertThat(box.minIntrinsicHeight(1000)).isEqualTo(11)
                 assertThat(box.maxIntrinsicWidth(1000)).isEqualTo(12)
                 assertThat(box.maxIntrinsicHeight(1000)).isEqualTo(13)
-                layout(10, 10) { }
+                layout(10, 10) {}
             }
         }
     }
@@ -299,41 +256,41 @@
     fun customIntrinsics() {
         rule.setContent {
             Layout({
-                val first = @Composable {
-                    BoxWithIntrinsics(1, 2, 100, 200)
-                    BoxWithIntrinsics(4, 3, 300, 400)
-                }
-                val second = @Composable {
-                    BoxWithIntrinsics(10, 11, 12, 13)
-                }
+                val first =
+                    @Composable {
+                        BoxWithIntrinsics(1, 2, 100, 200)
+                        BoxWithIntrinsics(4, 3, 300, 400)
+                    }
+                val second = @Composable { BoxWithIntrinsics(10, 11, 12, 13) }
                 Layout(
                     contents = listOf(first, second),
-                    measurePolicy = object : MultiContentMeasurePolicy {
-                        override fun MeasureScope.measure(
-                            measurables: List<List<Measurable>>,
-                            constraints: Constraints
-                        ) = throw IllegalStateException("shouldn't be called")
+                    measurePolicy =
+                        object : MultiContentMeasurePolicy {
+                            override fun MeasureScope.measure(
+                                measurables: List<List<Measurable>>,
+                                constraints: Constraints
+                            ) = throw IllegalStateException("shouldn't be called")
 
-                        override fun IntrinsicMeasureScope.minIntrinsicWidth(
-                            measurables: List<List<IntrinsicMeasurable>>,
-                            height: Int
-                        ): Int = measurables[1].first().minIntrinsicWidth(height)
+                            override fun IntrinsicMeasureScope.minIntrinsicWidth(
+                                measurables: List<List<IntrinsicMeasurable>>,
+                                height: Int
+                            ): Int = measurables[1].first().minIntrinsicWidth(height)
 
-                        override fun IntrinsicMeasureScope.minIntrinsicHeight(
-                            measurables: List<List<IntrinsicMeasurable>>,
-                            width: Int
-                        ): Int = measurables[1].first().minIntrinsicHeight(width)
+                            override fun IntrinsicMeasureScope.minIntrinsicHeight(
+                                measurables: List<List<IntrinsicMeasurable>>,
+                                width: Int
+                            ): Int = measurables[1].first().minIntrinsicHeight(width)
 
-                        override fun IntrinsicMeasureScope.maxIntrinsicWidth(
-                            measurables: List<List<IntrinsicMeasurable>>,
-                            height: Int
-                        ): Int = measurables[1].first().maxIntrinsicWidth(height)
+                            override fun IntrinsicMeasureScope.maxIntrinsicWidth(
+                                measurables: List<List<IntrinsicMeasurable>>,
+                                height: Int
+                            ): Int = measurables[1].first().maxIntrinsicWidth(height)
 
-                        override fun IntrinsicMeasureScope.maxIntrinsicHeight(
-                            measurables: List<List<IntrinsicMeasurable>>,
-                            width: Int
-                        ): Int = measurables[1].first().maxIntrinsicHeight(width)
-                    }
+                            override fun IntrinsicMeasureScope.maxIntrinsicHeight(
+                                measurables: List<List<IntrinsicMeasurable>>,
+                                width: Int
+                            ): Int = measurables[1].first().maxIntrinsicHeight(width)
+                        }
                 )
             }) { measurables, _ ->
                 val box = measurables[0]
@@ -341,7 +298,7 @@
                 assertThat(box.minIntrinsicHeight(1000)).isEqualTo(11)
                 assertThat(box.maxIntrinsicWidth(1000)).isEqualTo(12)
                 assertThat(box.maxIntrinsicHeight(1000)).isEqualTo(13)
-                layout(10, 10) { }
+                layout(10, 10) {}
             }
         }
     }
@@ -349,24 +306,20 @@
     private fun assertItemsLaidOutAsRow(intRange: IntRange) {
         var currentX = 0.dp
         intRange.forEach {
-            rule.onNodeWithTag("$it")
+            rule
+                .onNodeWithTag("$it")
                 .assertLeftPositionInRootIsEqualTo(currentX)
                 .assertTopPositionInRootIsEqualTo(0.dp)
             currentX += size
         }
 
-        rule.onNodeWithTag("${intRange.first - 1}")
-            .assertDoesNotExist()
-        rule.onNodeWithTag("${intRange.last + 1}")
-            .assertDoesNotExist()
+        rule.onNodeWithTag("${intRange.first - 1}").assertDoesNotExist()
+        rule.onNodeWithTag("${intRange.last + 1}").assertDoesNotExist()
     }
 
     @Composable
     fun Item(id: Int) {
-        Box(
-            Modifier
-                .size(size)
-                .testTag("$id"))
+        Box(Modifier.size(size).testTag("$id"))
     }
 }
 
@@ -388,32 +341,35 @@
 
 @Composable
 private fun BoxWithIntrinsics(minWidth: Int, minHeight: Int, maxWidth: Int, maxHeight: Int) {
-    Layout(measurePolicy = object : MeasurePolicy {
-        override fun MeasureScope.measure(
-            measurables: List<Measurable>,
-            constraints: Constraints
-        ): MeasureResult {
-            TODO("Not yet implemented")
-        }
+    Layout(
+        measurePolicy =
+            object : MeasurePolicy {
+                override fun MeasureScope.measure(
+                    measurables: List<Measurable>,
+                    constraints: Constraints
+                ): MeasureResult {
+                    TODO("Not yet implemented")
+                }
 
-        override fun IntrinsicMeasureScope.minIntrinsicWidth(
-            measurables: List<IntrinsicMeasurable>,
-            height: Int
-        ) = minWidth
+                override fun IntrinsicMeasureScope.minIntrinsicWidth(
+                    measurables: List<IntrinsicMeasurable>,
+                    height: Int
+                ) = minWidth
 
-        override fun IntrinsicMeasureScope.minIntrinsicHeight(
-            measurables: List<IntrinsicMeasurable>,
-            width: Int
-        ) = minHeight
+                override fun IntrinsicMeasureScope.minIntrinsicHeight(
+                    measurables: List<IntrinsicMeasurable>,
+                    width: Int
+                ) = minHeight
 
-        override fun IntrinsicMeasureScope.maxIntrinsicWidth(
-            measurables: List<IntrinsicMeasurable>,
-            height: Int
-        ) = maxWidth
+                override fun IntrinsicMeasureScope.maxIntrinsicWidth(
+                    measurables: List<IntrinsicMeasurable>,
+                    height: Int
+                ) = maxWidth
 
-        override fun IntrinsicMeasureScope.maxIntrinsicHeight(
-            measurables: List<IntrinsicMeasurable>,
-            width: Int
-        ) = maxHeight
-    })
+                override fun IntrinsicMeasureScope.maxIntrinsicHeight(
+                    measurables: List<IntrinsicMeasurable>,
+                    width: Int
+                ) = maxHeight
+            }
+    )
 }
diff --git a/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/layout/NodesRemeasuredOnceTest.kt b/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/layout/NodesRemeasuredOnceTest.kt
index 8db804a2..1ab1eca 100644
--- a/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/layout/NodesRemeasuredOnceTest.kt
+++ b/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/layout/NodesRemeasuredOnceTest.kt
@@ -34,11 +34,9 @@
 @RunWith(AndroidJUnit4::class)
 class NodesRemeasuredOnceTest {
 
-    @get:Rule
-    val rule = createAndroidComposeRule<TestActivity>()
+    @get:Rule val rule = createAndroidComposeRule<TestActivity>()
 
-    @get:Rule
-    val excessiveAssertions = AndroidOwnerExtraAssertionsRule()
+    @get:Rule val excessiveAssertions = AndroidOwnerExtraAssertionsRule()
 
     @Test
     fun remeasuringDirectChild() {
@@ -46,10 +44,12 @@
         var remeasurements = 0
 
         rule.setContent {
-            WrapChild(onMeasured = { actualHeight ->
-                assertThat(actualHeight).isEqualTo(height.value)
-                remeasurements++
-            }) {
+            WrapChild(
+                onMeasured = { actualHeight ->
+                    assertThat(actualHeight).isEqualTo(height.value)
+                    remeasurements++
+                }
+            ) {
                 Child(height)
             }
         }
@@ -59,9 +59,7 @@
             height.value = 20
         }
 
-        rule.runOnIdle {
-            assertThat(remeasurements).isEqualTo(2)
-        }
+        rule.runOnIdle { assertThat(remeasurements).isEqualTo(2) }
     }
 
     @Test
@@ -70,13 +68,13 @@
         var remeasurements = 0
 
         rule.setContent {
-            WrapChild(onMeasured = { actualHeight ->
-                assertThat(actualHeight).isEqualTo(height.value)
-                remeasurements++
-            }) {
-                WrapChild {
-                    Child(height)
+            WrapChild(
+                onMeasured = { actualHeight ->
+                    assertThat(actualHeight).isEqualTo(height.value)
+                    remeasurements++
                 }
+            ) {
+                WrapChild { Child(height) }
             }
         }
 
@@ -85,9 +83,7 @@
             height.value = 20
         }
 
-        rule.runOnIdle {
-            assertThat(remeasurements).isEqualTo(2)
-        }
+        rule.runOnIdle { assertThat(remeasurements).isEqualTo(2) }
     }
 
     @Test
@@ -96,17 +92,13 @@
         var remeasurements = 0
 
         rule.setContent {
-            WrapChild(onMeasured = { actualHeight ->
-                assertThat(actualHeight).isEqualTo(height.value)
-                remeasurements++
-            }) {
-                WrapChild {
-                    WrapChild {
-                        WrapChild {
-                            Child(height)
-                        }
-                    }
+            WrapChild(
+                onMeasured = { actualHeight ->
+                    assertThat(actualHeight).isEqualTo(height.value)
+                    remeasurements++
                 }
+            ) {
+                WrapChild { WrapChild { WrapChild { Child(height) } } }
             }
         }
 
@@ -115,9 +107,7 @@
             height.value = 20
         }
 
-        rule.runOnIdle {
-            assertThat(remeasurements).isEqualTo(2)
-        }
+        rule.runOnIdle { assertThat(remeasurements).isEqualTo(2) }
     }
 
     @Test
@@ -126,15 +116,13 @@
         var remeasurements = 0
 
         rule.setContent {
-            WrapChild(onMeasured = { actualHeight ->
-                assertThat(actualHeight).isEqualTo(height.value)
-                remeasurements++
-            }) {
-                NotPlaceChild(height) {
-                    WrapChild {
-                        Child(height)
-                    }
+            WrapChild(
+                onMeasured = { actualHeight ->
+                    assertThat(actualHeight).isEqualTo(height.value)
+                    remeasurements++
                 }
+            ) {
+                NotPlaceChild(height) { WrapChild { Child(height) } }
             }
         }
 
@@ -143,9 +131,7 @@
             height.value = 20
         }
 
-        rule.runOnIdle {
-            assertThat(remeasurements).isEqualTo(2)
-        }
+        rule.runOnIdle { assertThat(remeasurements).isEqualTo(2) }
     }
 
     @Test
@@ -154,13 +140,13 @@
         var remeasurements = 0
 
         rule.setContent {
-            WrapChildMeasureDuringLayout(onMeasured = { actualHeight ->
-                assertThat(actualHeight).isEqualTo(height.value)
-                remeasurements++
-            }) {
-                WrapChild {
-                    Child(height)
+            WrapChildMeasureDuringLayout(
+                onMeasured = { actualHeight ->
+                    assertThat(actualHeight).isEqualTo(height.value)
+                    remeasurements++
                 }
+            ) {
+                WrapChild { Child(height) }
             }
         }
 
@@ -169,9 +155,7 @@
             height.value = 20
         }
 
-        rule.runOnIdle {
-            assertThat(remeasurements).isEqualTo(2)
-        }
+        rule.runOnIdle { assertThat(remeasurements).isEqualTo(2) }
     }
 
     @Test
@@ -181,10 +165,12 @@
         var remeasurements = 0
 
         rule.setContent {
-            WrapChildMeasureDuringLayout(onMeasured = { actualHeight ->
-                assertThat(actualHeight).isEqualTo(expectedHeight)
-                remeasurements++
-            }) {
+            WrapChildMeasureDuringLayout(
+                onMeasured = { actualHeight ->
+                    assertThat(actualHeight).isEqualTo(expectedHeight)
+                    remeasurements++
+                }
+            ) {
                 Child(height)
             }
         }
@@ -195,9 +181,7 @@
             height.value = 20
         }
 
-        rule.runOnIdle {
-            assertThat(remeasurements).isEqualTo(2)
-        }
+        rule.runOnIdle { assertThat(remeasurements).isEqualTo(2) }
     }
 
     @Test
@@ -206,13 +190,13 @@
         var remeasurements = 0
 
         rule.setContent {
-            IntrinsicSizeAndMeasureDuringLayout(onMeasured = { actualHeight ->
-                assertThat(actualHeight).isEqualTo(height.value)
-                remeasurements++
-            }) {
-                WrapChild {
-                    Child(height)
+            IntrinsicSizeAndMeasureDuringLayout(
+                onMeasured = { actualHeight ->
+                    assertThat(actualHeight).isEqualTo(height.value)
+                    remeasurements++
                 }
+            ) {
+                WrapChild { Child(height) }
             }
         }
 
@@ -221,21 +205,19 @@
             height.value = 20
         }
 
-        rule.runOnIdle {
-            assertThat(remeasurements).isEqualTo(2)
-        }
+        rule.runOnIdle { assertThat(remeasurements).isEqualTo(2) }
     }
 }
 
 @Composable
 private fun WrapChild(onMeasured: (Int) -> Unit = {}, content: @Composable () -> Unit) {
     Layout(content = content) { measurables, constraints ->
-        val placeable = measurables.first()
-            .measure(constraints.copy(minHeight = 0, maxHeight = Constraints.Infinity))
+        val placeable =
+            measurables
+                .first()
+                .measure(constraints.copy(minHeight = 0, maxHeight = Constraints.Infinity))
         onMeasured(placeable.height)
-        layout(placeable.width, placeable.height) {
-            placeable.place(0, 0)
-        }
+        layout(placeable.width, placeable.height) { placeable.place(0, 0) }
     }
 }
 
@@ -249,8 +231,10 @@
         val height =
             if (constraints.hasBoundedHeight) constraints.maxHeight else constraints.minHeight
         layout(width, height) {
-            val placeable = measurables.first()
-                .measure(constraints.copy(minHeight = 0, maxHeight = Constraints.Infinity))
+            val placeable =
+                measurables
+                    .first()
+                    .measure(constraints.copy(minHeight = 0, maxHeight = Constraints.Infinity))
             onMeasured(placeable.height)
             placeable.place(0, 0)
         }
@@ -266,8 +250,10 @@
         val width = measurables.first().maxIntrinsicWidth(constraints.maxWidth)
         val height = measurables.first().maxIntrinsicHeight(constraints.maxHeight)
         layout(width, height) {
-            val placeable = measurables.first()
-                .measure(constraints.copy(minHeight = 0, maxHeight = Constraints.Infinity))
+            val placeable =
+                measurables
+                    .first()
+                    .measure(constraints.copy(minHeight = 0, maxHeight = Constraints.Infinity))
             onMeasured(placeable.height)
             placeable.place(0, 0)
         }
@@ -281,7 +267,8 @@
             if (constraints.hasBoundedWidth) constraints.maxWidth else constraints.minWidth,
             height.value
         ) {
-            measurables.first()
+            measurables
+                .first()
                 .measure(constraints.copy(minHeight = 0, maxHeight = Constraints.Infinity))
         }
     }
diff --git a/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/layout/OnGloballyPositionedTest.kt b/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/layout/OnGloballyPositionedTest.kt
index 0b55a41..cbff896 100644
--- a/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/layout/OnGloballyPositionedTest.kt
+++ b/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/layout/OnGloballyPositionedTest.kt
@@ -81,8 +81,7 @@
 @RunWith(AndroidJUnit4::class)
 class OnGloballyPositionedTest {
 
-    @get:Rule
-    val rule = createAndroidComposeRule<TestActivity>()
+    @get:Rule val rule = createAndroidComposeRule<TestActivity>()
 
     @Test
     fun handlesChildrenNodeMoveCorrectly() {
@@ -97,17 +96,19 @@
                         Wrap(
                             minWidth = size,
                             minHeight = size,
-                            modifier = Modifier.onGloballyPositioned { coordinates ->
-                                wrap1Position = coordinates.positionInWindow().x
-                            }
+                            modifier =
+                                Modifier.onGloballyPositioned { coordinates ->
+                                    wrap1Position = coordinates.positionInWindow().x
+                                }
                         )
                     } else {
                         Wrap(
                             minWidth = size,
                             minHeight = size,
-                            modifier = Modifier.onGloballyPositioned { coordinates ->
-                                wrap2Position = coordinates.positionInWindow().x
-                            }
+                            modifier =
+                                Modifier.onGloballyPositioned { coordinates ->
+                                    wrap2Position = coordinates.positionInWindow().x
+                                }
                         )
                     }
                 }
@@ -133,10 +134,9 @@
         rule.setContent {
             AtLeastSize(size = 20) {
                 Wrap(
-                    minWidth = size, minHeight = size,
-                    modifier = Modifier.onGloballyPositioned {
-                        realChildSize = it.size.width
-                    }
+                    minWidth = size,
+                    minHeight = size,
+                    modifier = Modifier.onGloballyPositioned { realChildSize = it.size.width }
                 )
             }
         }
@@ -146,9 +146,7 @@
             size = 15
         }
 
-        rule.runOnIdle {
-            assertEquals(15, realChildSize)
-        }
+        rule.runOnIdle { assertEquals(15, realChildSize) }
     }
 
     @Test
@@ -159,22 +157,18 @@
         rule.setContent {
             Layout(
                 measurePolicy = { measurables, constraints ->
-                    layout(10, 10) {
-                        measurables[0].measure(constraints).place(position, 0)
-                    }
+                    layout(10, 10) { measurables[0].measure(constraints).place(position, 0) }
                 },
                 content = {
-                    Wrap(
-                        minWidth = 10,
-                        minHeight = 10
-                    ) {
+                    Wrap(minWidth = 10, minHeight = 10) {
                         Wrap(
                             minWidth = 10,
                             minHeight = 10,
-                            modifier = Modifier.onGloballyPositioned { coordinates ->
-                                childGlobalPosition = coordinates.positionInRoot()
-                                latch.countDown()
-                            }
+                            modifier =
+                                Modifier.onGloballyPositioned { coordinates ->
+                                    childGlobalPosition = coordinates.positionInRoot()
+                                    latch.countDown()
+                                }
                         )
                     }
                 }
@@ -184,9 +178,7 @@
         assertTrue(latch.await(1, TimeUnit.SECONDS))
 
         latch = CountDownLatch(1)
-        rule.runOnUiThread {
-            position = 10
-        }
+        rule.runOnUiThread { position = 10 }
 
         assertTrue(latch.await(1, TimeUnit.SECONDS))
         assertEquals(Offset(10f, 0f), childGlobalPosition)
@@ -200,31 +192,23 @@
         rule.setContent {
             Layout(
                 measurePolicy = { measurables, constraints ->
-                    layout(10, 10) {
-                        measurables[1].measure(constraints).place(0, 0)
-                    }
+                    layout(10, 10) { measurables[1].measure(constraints).place(0, 0) }
                 },
                 content = {
                     Wrap(
                         minWidth = 10,
                         minHeight = 10,
-                        modifier = Modifier.onGloballyPositioned {
-                            wrap1OnPositionedCalled = true
-                        }
+                        modifier = Modifier.onGloballyPositioned { wrap1OnPositionedCalled = true }
                     )
                     Wrap(
                         minWidth = 10,
                         minHeight = 10,
-                        modifier = Modifier.onGloballyPositioned {
-                            wrap2OnPositionedCalled = true
-                        }
+                        modifier = Modifier.onGloballyPositioned { wrap2OnPositionedCalled = true }
                     ) {
                         Wrap(
                             minWidth = 10,
                             minHeight = 10,
-                            modifier = Modifier.onGloballyPositioned {
-                                latch.countDown()
-                            }
+                            modifier = Modifier.onGloballyPositioned { latch.countDown() }
                         )
                     }
                 }
@@ -248,9 +232,9 @@
         val size = mutableStateOf(100.dp)
         rule.setContent {
             Box(
-                modifier = Modifier
-                    .size(size.value)
-                    .onGloballyPositioned(if (changeLambda.value) lambda1 else lambda2)
+                modifier =
+                    Modifier.size(size.value)
+                        .onGloballyPositioned(if (changeLambda.value) lambda1 else lambda2)
             )
         }
 
@@ -280,21 +264,22 @@
 
         val changeLambda = mutableStateOf(true)
 
-        val layoutModifier = Modifier.layout { measurable, constraints ->
-            layoutCalled = true
-            val placeable = measurable.measure(constraints)
-            layout(placeable.width, placeable.height) {
-                placementCalled = true
-                placeable.place(0, 0)
+        val layoutModifier =
+            Modifier.layout { measurable, constraints ->
+                layoutCalled = true
+                val placeable = measurable.measure(constraints)
+                layout(placeable.width, placeable.height) {
+                    placementCalled = true
+                    placeable.place(0, 0)
+                }
             }
-        }
 
         rule.setContent {
             Box(
-                modifier = Modifier
-                    .then(layoutModifier)
-                    .size(10.dp)
-                    .onGloballyPositioned(if (changeLambda.value) lambda1 else lambda2)
+                modifier =
+                    Modifier.then(layoutModifier)
+                        .size(10.dp)
+                        .onGloballyPositioned(if (changeLambda.value) lambda1 else lambda2)
             )
         }
 
@@ -337,9 +322,9 @@
         val size = mutableStateOf(100.dp)
         rule.setContent {
             Box(
-                modifier = Modifier
-                    .size(size.value)
-                    .onGloballyPositioned(if (changeLambda.value) lambda1 else lambda2)
+                modifier =
+                    Modifier.size(size.value)
+                        .onGloballyPositioned(if (changeLambda.value) lambda1 else lambda2)
             )
         }
 
@@ -378,11 +363,11 @@
         val size = mutableStateOf(10.dp)
         rule.setContent {
             Box(
-                modifier = Modifier
-                    .padding(10.dp)
-                    .onGloballyPositioned(if (changeLambda.value) lambda1 else lambda2)
-                    .padding(size.value)
-                    .size(10.dp)
+                modifier =
+                    Modifier.padding(10.dp)
+                        .onGloballyPositioned(if (changeLambda.value) lambda1 else lambda2)
+                        .padding(size.value)
+                        .size(10.dp)
             )
         }
 
@@ -420,10 +405,10 @@
         val size = mutableStateOf(100.dp)
         rule.setContent {
             Box(
-                modifier = Modifier
-                    .size(size.value)
-                    .onGloballyPositioned(if (changeLambda.value) lambda1 else lambda2)
-                    .onGloballyPositioned(if (changeLambda.value) lambda2 else lambda1)
+                modifier =
+                    Modifier.size(size.value)
+                        .onGloballyPositioned(if (changeLambda.value) lambda1 else lambda2)
+                        .onGloballyPositioned(if (changeLambda.value) lambda2 else lambda1)
             )
         }
 
@@ -450,16 +435,14 @@
         rule.setContent {
             FixedSize(
                 10,
-                Modifier
-                    .padding(5)
+                Modifier.padding(5)
                     .then(
                         Modifier.onGloballyPositioned {
                             coordinates = it
                             positionedLatch.countDown()
                         }
                     )
-            ) {
-            }
+            ) {}
         }
         assertTrue(positionedLatch.await(1, TimeUnit.SECONDS))
 
@@ -483,16 +466,14 @@
         rule.setContent {
             FixedSize(
                 10,
-                Modifier
-                    .padding(5)
+                Modifier.padding(5)
                     .then(
                         Modifier.onGloballyPositioned {
                             coordinates = it
                             positionedLatch.countDown()
                         }
                     )
-            ) {
-            }
+            ) {}
         }
         assertTrue(positionedLatch.await(1, TimeUnit.SECONDS))
 
@@ -523,10 +504,11 @@
             view.setContent {
                 Layout(
                     {},
-                    modifier = Modifier.onGloballyPositioned {
-                        coordinates = it
-                        positionedLatch.countDown()
-                    }
+                    modifier =
+                        Modifier.onGloballyPositioned {
+                            coordinates = it
+                            positionedLatch.countDown()
+                        }
                 ) { _, _ ->
                     layout(100, 200) {}
                 }
@@ -548,9 +530,7 @@
             positionedLatch.await(1, TimeUnit.SECONDS)
         )
 
-        rule.runOnIdle {
-            assertEquals(view.getYInWindow(), coordinates!!.positionInWindow().y)
-        }
+        rule.runOnIdle { assertEquals(view.getYInWindow(), coordinates!!.positionInWindow().y) }
     }
 
     @Test
@@ -562,14 +542,12 @@
         rule.setContent {
             Layout(
                 {},
-                modifier = Modifier
-                    .graphicsLayer {
-                        translationX = offsetX
-                    }
-                    .onGloballyPositioned {
-                        coordinates = it
-                        positionedLatch.countDown()
-                    }
+                modifier =
+                    Modifier.graphicsLayer { translationX = offsetX }
+                        .onGloballyPositioned {
+                            coordinates = it
+                            positionedLatch.countDown()
+                        }
             ) { _, _ ->
                 layout(100, 200) {}
             }
@@ -590,9 +568,7 @@
             positionedLatch.await(1, TimeUnit.SECONDS)
         )
 
-        rule.runOnIdle {
-            assertEquals(5f, coordinates!!.positionInRoot().x)
-        }
+        rule.runOnIdle { assertEquals(5f, coordinates!!.positionInRoot().x) }
     }
 
     private fun View.getYInWindow(): Float {
@@ -623,10 +599,11 @@
             view.setContent {
                 Layout(
                     {},
-                    modifier = Modifier.onGloballyPositioned {
-                        coordinates = it
-                        positionedLatch.countDown()
-                    }
+                    modifier =
+                        Modifier.onGloballyPositioned {
+                            coordinates = it
+                            positionedLatch.countDown()
+                        }
                 ) { _, constraints ->
                     layout(constraints.maxWidth, constraints.maxHeight) {}
                 }
@@ -639,18 +616,14 @@
         val startY = coordinates!!.positionInWindow().y
         positionedLatch = CountDownLatch(1)
 
-        rule.runOnIdle {
-            topView!!.visibility = View.GONE
-        }
+        rule.runOnIdle { topView!!.visibility = View.GONE }
 
         assertTrue(
             "OnPositioned is not called when the container moved",
             positionedLatch.await(1, TimeUnit.SECONDS)
         )
 
-        rule.runOnIdle {
-            assertEquals(startY - 100f, coordinates!!.positionInWindow().y)
-        }
+        rule.runOnIdle { assertEquals(startY - 100f, coordinates!!.positionInWindow().y) }
     }
 
     @Test
@@ -664,20 +637,16 @@
                 DelayedMeasure(50) {
                     Box(Modifier.requiredSize(25.toDp())) {
                         Box(
-                            Modifier
-                                .requiredSize(size.toDp())
-                                .onGloballyPositioned {
-                                    coordinates1 = it
-                                }
+                            Modifier.requiredSize(size.toDp()).onGloballyPositioned {
+                                coordinates1 = it
+                            }
                         )
                     }
                     Box(Modifier.requiredSize(25.toDp())) {
                         Box(
-                            Modifier
-                                .requiredSize(size.toDp())
-                                .onGloballyPositioned {
-                                    coordinates2 = it
-                                }
+                            Modifier.requiredSize(size.toDp()).onGloballyPositioned {
+                                coordinates2 = it
+                            }
                         )
                     }
                 }
@@ -709,8 +678,7 @@
         rule.setContent {
             with(LocalDensity.current) {
                 Box(
-                    Modifier
-                        .fillMaxSize()
+                    Modifier.fillMaxSize()
                         .padding(start = paddingLeftPx.toDp(), top = paddingTopPx.toDp())
                         .onGloballyPositioned {
                             realLeft = it.positionInParent().x
@@ -734,22 +702,23 @@
         var realTop: Float? = null
 
         val positionedLatch = CountDownLatch(1)
-        val node = object : DelegatingNode() {
-            val ogp = delegate(
-                object : GlobalPositionAwareModifierNode, Modifier.Node() {
-                    override fun onGloballyPositioned(coordinates: LayoutCoordinates) {
-                        realLeft = coordinates.positionInParent().x
-                        realTop = coordinates.positionInParent().y
-                        positionedLatch.countDown()
-                    }
-                }
-            )
-        }
+        val node =
+            object : DelegatingNode() {
+                val ogp =
+                    delegate(
+                        object : GlobalPositionAwareModifierNode, Modifier.Node() {
+                            override fun onGloballyPositioned(coordinates: LayoutCoordinates) {
+                                realLeft = coordinates.positionInParent().x
+                                realTop = coordinates.positionInParent().y
+                                positionedLatch.countDown()
+                            }
+                        }
+                    )
+            }
         rule.setContent {
             with(LocalDensity.current) {
                 Box(
-                    Modifier
-                        .fillMaxSize()
+                    Modifier.fillMaxSize()
                         .padding(start = paddingLeftPx.toDp(), top = paddingTopPx.toDp())
                         .elementFor(node)
                 )
@@ -767,27 +736,29 @@
         val paddingTopPx = 120.0f
 
         val positionedLatch = CountDownLatch(2)
-        val node = object : DelegatingNode() {
-            val a = delegate(
-                object : GlobalPositionAwareModifierNode, Modifier.Node() {
-                    override fun onGloballyPositioned(coordinates: LayoutCoordinates) {
-                        positionedLatch.countDown()
-                    }
-                }
-            )
-            val b = delegate(
-                object : GlobalPositionAwareModifierNode, Modifier.Node() {
-                    override fun onGloballyPositioned(coordinates: LayoutCoordinates) {
-                        positionedLatch.countDown()
-                    }
-                }
-            )
-        }
+        val node =
+            object : DelegatingNode() {
+                val a =
+                    delegate(
+                        object : GlobalPositionAwareModifierNode, Modifier.Node() {
+                            override fun onGloballyPositioned(coordinates: LayoutCoordinates) {
+                                positionedLatch.countDown()
+                            }
+                        }
+                    )
+                val b =
+                    delegate(
+                        object : GlobalPositionAwareModifierNode, Modifier.Node() {
+                            override fun onGloballyPositioned(coordinates: LayoutCoordinates) {
+                                positionedLatch.countDown()
+                            }
+                        }
+                    )
+            }
         rule.setContent {
             with(LocalDensity.current) {
                 Box(
-                    Modifier
-                        .fillMaxSize()
+                    Modifier.fillMaxSize()
                         .padding(start = paddingLeftPx.toDp(), top = paddingTopPx.toDp())
                         .elementFor(node)
                 )
@@ -808,8 +779,7 @@
         rule.setContent {
             with(LocalDensity.current) {
                 Box(
-                    Modifier
-                        .padding(start = firstPaddingPx.toDp())
+                    Modifier.padding(start = firstPaddingPx.toDp())
                         .then(
                             Modifier.onGloballyPositioned {
                                 gpCoordinates = it
@@ -819,8 +789,7 @@
                 ) {
                     Box(Modifier.padding(start = secondPaddingPx.toDp())) {
                         Box(
-                            Modifier
-                                .fillMaxSize()
+                            Modifier.fillMaxSize()
                                 .padding(start = thirdPaddingPx.toDp())
                                 .onGloballyPositioned {
                                     childCoordinates = it
@@ -860,21 +829,16 @@
 
             composeView.setContent {
                 Box(
-                    Modifier
-                        .fillMaxSize()
-                        .onGloballyPositioned {
-                            val position = IntArray(2)
-                            composeView.getLocationInWindow(position)
-                            frameGlobalPosition =
-                                Offset(position[0].toFloat(), position[1].toFloat())
+                    Modifier.fillMaxSize().onGloballyPositioned {
+                        val position = IntArray(2)
+                        composeView.getLocationInWindow(position)
+                        frameGlobalPosition = Offset(position[0].toFloat(), position[1].toFloat())
 
-                            realGlobalPosition = it.localToWindow(localPosition)
-                            realLocalPosition = it.windowToLocal(
-                                framePadding + frameGlobalPosition!!
-                            )
+                        realGlobalPosition = it.localToWindow(localPosition)
+                        realLocalPosition = it.windowToLocal(framePadding + frameGlobalPosition!!)
 
-                            positionedLatch.countDown()
-                        }
+                        positionedLatch.countDown()
+                    }
                 )
             }
         }
@@ -895,19 +859,18 @@
 
         var positionedCalled = false
         rule.setContent {
-            val modifier = if (needCallback.value) {
-                Modifier.onGloballyPositioned { positionedCalled = true }
-            } else {
-                Modifier
-            }
+            val modifier =
+                if (needCallback.value) {
+                    Modifier.onGloballyPositioned { positionedCalled = true }
+                } else {
+                    Modifier
+                }
             Box(modifier.fillMaxSize())
         }
 
         rule.runOnIdle { needCallback.value = true }
 
-        rule.runOnIdle {
-            assertThat(positionedCalled).isTrue()
-        }
+        rule.runOnIdle { assertThat(positionedCalled).isTrue() }
     }
 
     @Test
@@ -919,12 +882,9 @@
             with(LocalDensity.current) {
                 Box {
                     Box(
-                        Modifier
-                            .fillMaxSize()
+                        Modifier.fillMaxSize()
                             .padding(start = left.value.toDp())
-                            .onGloballyPositioned {
-                                realLeft = it.positionInParent().x
-                            }
+                            .onGloballyPositioned { realLeft = it.positionInParent().x }
                     )
                 }
             }
@@ -932,9 +892,7 @@
 
         rule.runOnIdle { left.value = 40 }
 
-        rule.runOnIdle {
-            assertThat(realLeft).isEqualTo(40)
-        }
+        rule.runOnIdle { assertThat(realLeft).isEqualTo(40) }
     }
 
     @Test
@@ -952,8 +910,7 @@
                         Box(Modifier.requiredSize(10.toDp())) {
                             Box(Modifier.requiredSize(10.toDp())) {
                                 Box(
-                                    Modifier
-                                        .onGloballyPositioned {
+                                    Modifier.onGloballyPositioned {
                                             realLeft = it.positionInRoot().x
                                             positionedLatch.countDown()
                                         }
@@ -981,20 +938,20 @@
         val line2 = HorizontalAlignmentLine(::min)
         val lineValue = 10
         rule.setContent {
-            val onPositioned = Modifier.onGloballyPositioned { coordinates: LayoutCoordinates ->
-                assertEquals(2, coordinates.providedAlignmentLines.size)
-                assertEquals(lineValue, coordinates[line1])
-                assertEquals(lineValue, coordinates[line2])
-                latch.countDown()
-            }
-            val lineProvider = Modifier.layout { measurable, constraints ->
-                val placeable = measurable.measure(constraints)
-                layout(0, 0, mapOf(line2 to lineValue)) {
-                    placeable.place(0, 0)
+            val onPositioned =
+                Modifier.onGloballyPositioned { coordinates: LayoutCoordinates ->
+                    assertEquals(2, coordinates.providedAlignmentLines.size)
+                    assertEquals(lineValue, coordinates[line1])
+                    assertEquals(lineValue, coordinates[line2])
+                    latch.countDown()
                 }
-            }
-            Layout(modifier = onPositioned.then(lineProvider), content = { }) { _, _ ->
-                layout(0, 0, mapOf(line1 to lineValue)) { }
+            val lineProvider =
+                Modifier.layout { measurable, constraints ->
+                    val placeable = measurable.measure(constraints)
+                    layout(0, 0, mapOf(line2 to lineValue)) { placeable.place(0, 0) }
+                }
+            Layout(modifier = onPositioned.then(lineProvider), content = {}) { _, _ ->
+                layout(0, 0, mapOf(line1 to lineValue)) {}
             }
         }
         assertTrue(latch.await(1, TimeUnit.SECONDS))
@@ -1006,14 +963,7 @@
         var view: View? = null
         rule.setContent {
             view = LocalView.current
-            FixedSize(
-                30,
-                Modifier
-                    .padding(10)
-                    .onGloballyPositioned {
-                        coords = it
-                    }
-            ) { /* no-op */ }
+            FixedSize(30, Modifier.padding(10).onGloballyPositioned { coords = it }) { /* no-op */ }
         }
 
         val composeView = view as AndroidComposeView
@@ -1024,7 +974,7 @@
             composeView.pivotY = 0f
         }
 
-        rule.runOnIdle { } // wait for redraw
+        rule.runOnIdle {} // wait for redraw
 
         rule.onRoot().apply {
             val layoutCoordinates = coords!!
@@ -1065,13 +1015,11 @@
                 Popup(alignment = alignment) {
                     FixedSize(
                         30,
-                        Modifier
-                            .padding(10)
-                            .background(Color.Red)
-                            .onGloballyPositioned {
-                                coords = it
-                            }
-                    ) { /* no-op */ }
+                        Modifier.padding(10).background(Color.Red).onGloballyPositioned {
+                            coords = it
+                        }
+                    ) { /* no-op */
+                    }
                 }
             }
         }
@@ -1097,19 +1045,12 @@
         var coords3: LayoutCoordinates? = null
         rule.setContent {
             Box(
-                Modifier
-                    .fillMaxSize()
-                    .onGloballyPositioned {
-                        coords1 = it
-                    }
+                Modifier.fillMaxSize()
+                    .onGloballyPositioned { coords1 = it }
                     .padding(2.dp)
-                    .onGloballyPositioned {
-                        coords2 = it
-                    }
+                    .onGloballyPositioned { coords2 = it }
                     .padding(3.dp)
-                    .onGloballyPositioned {
-                        coords3 = it
-                    }
+                    .onGloballyPositioned { coords3 = it }
             )
         }
 
@@ -1125,19 +1066,15 @@
     @Test
     @SmallTest
     fun modifierIsReturningEqualObjectForTheSameLambda() {
-        val lambda: (LayoutCoordinates) -> Unit = { }
+        val lambda: (LayoutCoordinates) -> Unit = {}
         assertEquals(Modifier.onGloballyPositioned(lambda), Modifier.onGloballyPositioned(lambda))
     }
 
     @Test
     @SmallTest
     fun modifierIsReturningNotEqualObjectForDifferentLambdas() {
-        val lambda1: (LayoutCoordinates) -> Unit = {
-            it.isAttached
-        }
-        val lambda2: (LayoutCoordinates) -> Unit = {
-            !it.isAttached
-        }
+        val lambda1: (LayoutCoordinates) -> Unit = { it.isAttached }
+        val lambda2: (LayoutCoordinates) -> Unit = { !it.isAttached }
         Assert.assertNotEquals(
             Modifier.onGloballyPositioned(lambda1),
             Modifier.onGloballyPositioned(lambda2)
@@ -1150,15 +1087,14 @@
         var remeasurementObj: Remeasurement? = null
         rule.setContent {
             Box(
-                Modifier
-                    .then(object : RemeasurementModifier {
-                        override fun onRemeasurementAvailable(remeasurement: Remeasurement) {
-                            remeasurementObj = remeasurement
+                Modifier.then(
+                        object : RemeasurementModifier {
+                            override fun onRemeasurementAvailable(remeasurement: Remeasurement) {
+                                remeasurementObj = remeasurement
+                            }
                         }
-                    })
-                    .onGloballyPositioned {
-                        coords = it
-                    }
+                    )
+                    .onGloballyPositioned { coords = it }
                     .size(100.dp)
             )
         }
@@ -1180,12 +1116,11 @@
         rule.setContent {
             if (nodeIsNeeded) {
                 Box(
-                    Modifier
-                        .onGloballyPositioned {
-                            // onGloballyPositioned is "attached" to the layout node itself
-                            // as there are no layout modifiers added after it
-                            coordindates = it
-                        }
+                    Modifier.onGloballyPositioned {
+                        // onGloballyPositioned is "attached" to the layout node itself
+                        // as there are no layout modifiers added after it
+                        coordindates = it
+                    }
                 )
             }
         }
@@ -1195,39 +1130,31 @@
             nodeIsNeeded = false
         }
 
-        rule.runOnIdle {
-            assertFalse(coordindates.isAttached)
-        }
+        rule.runOnIdle { assertFalse(coordindates.isAttached) }
     }
 
     @Test
     fun coordinatesAreNotAttachedWhenModifierIsNotUsedAnymore() {
         lateinit var coordindates: LayoutCoordinates
-        var modifier by mutableStateOf(
-            Modifier
-                .onGloballyPositioned {
-                    // onGloballyPositioned is "attached" to the next layout modifier
-                    coordindates = it
-                }
-                .layout { measurable, constraints ->
-                    val placeable = measurable.measure(constraints)
-                    layout(placeable.width, placeable.height) {
-                        placeable.place(0, 0)
+        var modifier by
+            mutableStateOf(
+                Modifier.onGloballyPositioned {
+                        // onGloballyPositioned is "attached" to the next layout modifier
+                        coordindates = it
                     }
-                }
-        )
-        rule.setContent {
-            Box(modifier)
-        }
+                    .layout { measurable, constraints ->
+                        val placeable = measurable.measure(constraints)
+                        layout(placeable.width, placeable.height) { placeable.place(0, 0) }
+                    }
+            )
+        rule.setContent { Box(modifier) }
 
         rule.runOnIdle {
             assertTrue(coordindates.isAttached)
             modifier = Modifier
         }
 
-        rule.runOnIdle {
-            assertFalse(coordindates.isAttached)
-        }
+        rule.runOnIdle { assertFalse(coordindates.isAttached) }
     }
 
     // In some special circumstances, the onGloballyPositioned callbacks can be called recursively
@@ -1241,27 +1168,32 @@
         var hasSent = false
         rule.setContent {
             Box(Modifier.fillMaxSize()) {
-                Box(Modifier.fillMaxSize().offset { offset }.onGloballyPositioned {
-                    if (offset != IntOffset.Zero) {
-                        position = it.positionInRoot()
-                    }
-                })
-                Box(Modifier.fillMaxSize().offset { offset }.onGloballyPositioned {
-                    if (offset != IntOffset.Zero && !hasSent) {
-                        hasSent = true
-                        val now = SystemClock.uptimeMillis()
-                        val event = MotionEvent.obtain(now, now, MotionEvent.ACTION_DOWN, 0f, 0f, 0)
-                        view.dispatchTouchEvent(event)
-                    }
-                })
+                Box(
+                    Modifier.fillMaxSize()
+                        .offset { offset }
+                        .onGloballyPositioned {
+                            if (offset != IntOffset.Zero) {
+                                position = it.positionInRoot()
+                            }
+                        }
+                )
+                Box(
+                    Modifier.fillMaxSize()
+                        .offset { offset }
+                        .onGloballyPositioned {
+                            if (offset != IntOffset.Zero && !hasSent) {
+                                hasSent = true
+                                val now = SystemClock.uptimeMillis()
+                                val event =
+                                    MotionEvent.obtain(now, now, MotionEvent.ACTION_DOWN, 0f, 0f, 0)
+                                view.dispatchTouchEvent(event)
+                            }
+                        }
+                )
             }
         }
-        rule.runOnIdle {
-            offset = IntOffset(1, 1)
-        }
-        rule.runOnIdle {
-            assertThat(position).isEqualTo(Offset(1f, 1f))
-        }
+        rule.runOnIdle { offset = IntOffset(1, 1) }
+        rule.runOnIdle { assertThat(position).isEqualTo(Offset(1f, 1f)) }
     }
 
     @Test
@@ -1272,18 +1204,16 @@
         rule.setContent {
             Box(Modifier.fillMaxSize()) {
                 repeat(30) {
-                    Box(Modifier.fillMaxSize().offset { offset }.onGloballyPositioned {
-                        position = it.positionInRoot()
-                    })
+                    Box(
+                        Modifier.fillMaxSize()
+                            .offset { offset }
+                            .onGloballyPositioned { position = it.positionInRoot() }
+                    )
                 }
             }
         }
-        rule.runOnIdle {
-            offset = IntOffset(1, 1)
-        }
-        rule.runOnIdle {
-            assertThat(position).isEqualTo(Offset(1f, 1f))
-        }
+        rule.runOnIdle { offset = IntOffset(1, 1) }
+        rule.runOnIdle { assertThat(position).isEqualTo(Offset(1f, 1f)) }
     }
 
     @Test
@@ -1293,17 +1223,19 @@
         var positionCalled1Count = 0
         var positionCalled2Count = 0
         rule.setContent {
-            val modifier = if (callbackPresent.value) {
-                // Remember lambdas to avoid triggering a node update when the lambda changes
-                Modifier.onGloballyPositioned(remember { { positionCalled1Count++ } })
-            } else {
+            val modifier =
+                if (callbackPresent.value) {
+                    // Remember lambdas to avoid triggering a node update when the lambda changes
+                    Modifier.onGloballyPositioned(remember { { positionCalled1Count++ } })
+                } else {
+                    Modifier
+                }
+            Box(
                 Modifier
-            }
-            Box(Modifier
-                // Remember lambdas to avoid triggering a node update when the lambda changes
-                .onGloballyPositioned(remember { { positionCalled2Count++ } })
-                .then(modifier)
-                .fillMaxSize()
+                    // Remember lambdas to avoid triggering a node update when the lambda changes
+                    .onGloballyPositioned(remember { { positionCalled2Count++ } })
+                    .then(modifier)
+                    .fillMaxSize()
             )
         }
 
@@ -1325,20 +1257,12 @@
 }
 
 @Composable
-fun DelayedMeasure(
-    size: Int,
-    modifier: Modifier = Modifier,
-    content: @Composable () -> Unit = {}
-) {
+fun DelayedMeasure(size: Int, modifier: Modifier = Modifier, content: @Composable () -> Unit = {}) {
     Layout(content = content, modifier = modifier) { measurables, _ ->
         layout(size, size) {
             val newConstraints = Constraints(maxWidth = size, maxHeight = size)
-            val placeables = measurables.map { m ->
-                m.measure(newConstraints)
-            }
-            placeables.forEach { child ->
-                child.place(0, 0)
-            }
+            val placeables = measurables.map { m -> m.measure(newConstraints) }
+            placeables.forEach { child -> child.place(0, 0) }
         }
     }
 }
diff --git a/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/layout/OnSizeChangedTest.kt b/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/layout/OnSizeChangedTest.kt
index 2f2a5c5..54c4e95 100644
--- a/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/layout/OnSizeChangedTest.kt
+++ b/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/layout/OnSizeChangedTest.kt
@@ -114,7 +114,8 @@
                             .onSizeChanged {
                                 changedSize = it
                                 latch.countDown()
-                            }.padding(sizePx.toDp())
+                            }
+                            .padding(sizePx.toDp())
                     ) {
                         Box(Modifier.requiredSize(10.toDp()))
                     }
@@ -190,9 +191,7 @@
                             Modifier.layout { measurable, _ ->
                                 val placeable =
                                     measurable.measure(Constraints.fixed(sizePx, sizePx))
-                                layout(placeable.width, placeable.height) {
-                                    placeable.place(0, 0)
-                                }
+                                layout(placeable.width, placeable.height) { placeable.place(0, 0) }
                             }
                         )
                     }
@@ -228,17 +227,30 @@
             activity.setContent {
                 with(LocalDensity.current) {
                     // Remember lambdas to avoid triggering a node update when the lambda changes
-                    val mod = if (addModifier) Modifier.onSizeChanged(remember { {
-                        changedSize2 = it
-                        latch2.countDown()
-                    } }) else Modifier
+                    val mod =
+                        if (addModifier)
+                            Modifier.onSizeChanged(
+                                remember {
+                                    {
+                                        changedSize2 = it
+                                        latch2.countDown()
+                                    }
+                                }
+                            )
+                        else Modifier
                     Box(
                         // Remember lambdas to avoid triggering a node update when the lambda
                         // changes
-                        Modifier.padding(10.toDp()).onSizeChanged(remember { {
-                            changedSize1 = it
-                            latch1.countDown()
-                        } }).then(mod)
+                        Modifier.padding(10.toDp())
+                            .onSizeChanged(
+                                remember {
+                                    {
+                                        changedSize1 = it
+                                        latch1.countDown()
+                                    }
+                                }
+                            )
+                            .then(mod)
                     ) {
                         Box(Modifier.requiredSize(10.toDp()))
                     }
@@ -272,33 +284,35 @@
         var changedSize2 = IntSize.Zero
         var addModifier by mutableStateOf(false)
 
-        val node = object : LayoutAwareModifierNode, Modifier.Node() {
-            override fun onRemeasured(size: IntSize) {
-                changedSize1 = size
-                sizeLatch1.countDown()
-            }
-            override fun onPlaced(coordinates: LayoutCoordinates) {
-                placedLatch1.countDown()
-            }
-        }
+        val node =
+            object : LayoutAwareModifierNode, Modifier.Node() {
+                override fun onRemeasured(size: IntSize) {
+                    changedSize1 = size
+                    sizeLatch1.countDown()
+                }
 
-        val node2 = object : LayoutAwareModifierNode, Modifier.Node() {
-            override fun onRemeasured(size: IntSize) {
-                changedSize2 = size
-                sizeLatch2.countDown()
+                override fun onPlaced(coordinates: LayoutCoordinates) {
+                    placedLatch1.countDown()
+                }
             }
-            override fun onPlaced(coordinates: LayoutCoordinates) {
-                placedLatch2.countDown()
+
+        val node2 =
+            object : LayoutAwareModifierNode, Modifier.Node() {
+                override fun onRemeasured(size: IntSize) {
+                    changedSize2 = size
+                    sizeLatch2.countDown()
+                }
+
+                override fun onPlaced(coordinates: LayoutCoordinates) {
+                    placedLatch2.countDown()
+                }
             }
-        }
 
         rule.runOnUiThread {
             activity.setContent {
                 with(LocalDensity.current) {
                     val mod = if (addModifier) Modifier.elementFor(node2) else Modifier
-                    Box(
-                        Modifier.padding(10.toDp()).elementFor(node).then(mod)
-                    ) {
+                    Box(Modifier.padding(10.toDp()).elementFor(node).then(mod)) {
                         Box(Modifier.requiredSize(10.toDp()))
                     }
                 }
@@ -340,17 +354,30 @@
             activity.setContent {
                 with(LocalDensity.current) {
                     // Remember lambdas to avoid triggering a node update when the lambda changes
-                    val mod = if (addModifier) Modifier.onSizeChanged(remember { {
-                        changedSize2 = it
-                        latch2.countDown()
-                    } }) else Modifier
+                    val mod =
+                        if (addModifier)
+                            Modifier.onSizeChanged(
+                                remember {
+                                    {
+                                        changedSize2 = it
+                                        latch2.countDown()
+                                    }
+                                }
+                            )
+                        else Modifier
                     Box(
                         // Remember lambdas to avoid triggering a node update when the lambda
                         // changes
-                        Modifier.padding(10.toDp()).onSizeChanged(remember { {
-                            changedSize1 = it
-                            latch1.countDown()
-                        } }).then(mod)
+                        Modifier.padding(10.toDp())
+                            .onSizeChanged(
+                                remember {
+                                    {
+                                        changedSize1 = it
+                                        latch1.countDown()
+                                    }
+                                }
+                            )
+                            .then(mod)
                     ) {
                         Box(Modifier.requiredSize(10.toDp()))
                     }
@@ -385,33 +412,35 @@
         var changedSize2 = IntSize.Zero
         var addModifier by mutableStateOf(true)
 
-        val node = object : LayoutAwareModifierNode, Modifier.Node() {
-            override fun onRemeasured(size: IntSize) {
-                changedSize1 = size
-                latch1.countDown()
-            }
-            override fun onPlaced(coordinates: LayoutCoordinates) {
-                latch1.countDown()
-            }
-        }
+        val node =
+            object : LayoutAwareModifierNode, Modifier.Node() {
+                override fun onRemeasured(size: IntSize) {
+                    changedSize1 = size
+                    latch1.countDown()
+                }
 
-        val node2 = object : LayoutAwareModifierNode, Modifier.Node() {
-            override fun onRemeasured(size: IntSize) {
-                changedSize2 = size
-                latch2.countDown()
+                override fun onPlaced(coordinates: LayoutCoordinates) {
+                    latch1.countDown()
+                }
             }
-            override fun onPlaced(coordinates: LayoutCoordinates) {
-                latch2.countDown()
+
+        val node2 =
+            object : LayoutAwareModifierNode, Modifier.Node() {
+                override fun onRemeasured(size: IntSize) {
+                    changedSize2 = size
+                    latch2.countDown()
+                }
+
+                override fun onPlaced(coordinates: LayoutCoordinates) {
+                    latch2.countDown()
+                }
             }
-        }
 
         rule.runOnUiThread {
             activity.setContent {
                 with(LocalDensity.current) {
                     val mod = if (addModifier) Modifier.elementFor(node2) else Modifier
-                    Box(
-                        Modifier.padding(10.toDp()).elementFor(node).then(mod)
-                    ) {
+                    Box(Modifier.padding(10.toDp()).elementFor(node).then(mod)) {
                         Box(Modifier.requiredSize(10.toDp()))
                     }
                 }
@@ -444,10 +473,11 @@
         var changedSize1 = IntSize.Zero
         var changedSize2 = IntSize.Zero
 
-        var lambda1: (IntSize) -> Unit by mutableStateOf({
-            changedSize1 = it
-            latch1.countDown()
-        })
+        var lambda1: (IntSize) -> Unit by
+            mutableStateOf({
+                changedSize1 = it
+                latch1.countDown()
+            })
 
         // Stable lambda so that this one won't change while we change lambda1
         val lambda2: (IntSize) -> Unit = {
@@ -458,11 +488,7 @@
         rule.runOnUiThread {
             activity.setContent {
                 with(LocalDensity.current) {
-                    Box(
-                        Modifier.padding(10.toDp())
-                            .onSizeChanged(lambda1)
-                            .onSizeChanged(lambda2)
-                    ) {
+                    Box(Modifier.padding(10.toDp()).onSizeChanged(lambda1).onSizeChanged(lambda2)) {
                         Box(Modifier.requiredSize(10.toDp()))
                     }
                 }
@@ -500,14 +526,13 @@
         var changedSize1 = IntSize.Zero
         var changedSize2 = IntSize.Zero
 
-        var onRemeasuredLambda: (IntSize) -> Unit by mutableStateOf({
-            changedSize1 = it
-            latch1.countDown()
-        })
+        var onRemeasuredLambda: (IntSize) -> Unit by
+            mutableStateOf({
+                changedSize1 = it
+                latch1.countDown()
+            })
 
-        var onPlacedLambda: (LayoutCoordinates) -> Unit by mutableStateOf({
-            latch1.countDown()
-        })
+        var onPlacedLambda: (LayoutCoordinates) -> Unit by mutableStateOf({ latch1.countDown() })
 
         class Node1(
             var onRemeasuredLambda: (IntSize) -> Unit,
@@ -519,6 +544,7 @@
             override fun onRemeasured(size: IntSize) {
                 onRemeasuredLambda(size)
             }
+
             override fun onPlaced(coordinates: LayoutCoordinates) {
                 onPlacedLambda(coordinates)
             }
@@ -554,15 +580,17 @@
             }
         }
 
-        val node2 = object : LayoutAwareModifierNode, Modifier.Node() {
-            override fun onRemeasured(size: IntSize) {
-                changedSize2 = size
-                latch2.countDown()
+        val node2 =
+            object : LayoutAwareModifierNode, Modifier.Node() {
+                override fun onRemeasured(size: IntSize) {
+                    changedSize2 = size
+                    latch2.countDown()
+                }
+
+                override fun onPlaced(coordinates: LayoutCoordinates) {
+                    latch2.countDown()
+                }
             }
-            override fun onPlaced(coordinates: LayoutCoordinates) {
-                latch2.countDown()
-            }
-        }
 
         rule.runOnUiThread {
             activity.setContent {
@@ -593,9 +621,7 @@
             changedSize1 = it
             newLatch.countDown()
         }
-        onPlacedLambda = {
-            newLatch.countDown()
-        }
+        onPlacedLambda = { newLatch.countDown() }
 
         // We updated the lambda on the first item, so the new lambda should be called
         assertTrue(newLatch.await(1, TimeUnit.SECONDS))
@@ -619,41 +645,41 @@
         var changedSize1 = IntSize.Zero
         var changedSize2 = IntSize.Zero
 
-        val node = object : LayoutAwareModifierNode, Modifier.Node() {
-            override fun onRemeasured(size: IntSize) {
-                changedSize1 = size
-                sizeLatch1.countDown()
+        val node =
+            object : LayoutAwareModifierNode, Modifier.Node() {
+                override fun onRemeasured(size: IntSize) {
+                    changedSize1 = size
+                    sizeLatch1.countDown()
+                }
+
+                override fun onPlaced(coordinates: LayoutCoordinates) {
+                    placedLatch1.countDown()
+                }
             }
 
-            override fun onPlaced(coordinates: LayoutCoordinates) {
-                placedLatch1.countDown()
-            }
-        }
+        val node2 =
+            object : DelegatingNode() {
+                fun addDelegate() {
+                    delegate(
+                        object : LayoutAwareModifierNode, Modifier.Node() {
+                            override fun onRemeasured(size: IntSize) {
+                                changedSize2 = size
+                                sizeLatch2.countDown()
+                            }
 
-        val node2 = object : DelegatingNode() {
-            fun addDelegate() {
-                delegate(
-                    object : LayoutAwareModifierNode, Modifier.Node() {
-                        override fun onRemeasured(size: IntSize) {
-                            changedSize2 = size
-                            sizeLatch2.countDown()
+                            override fun onPlaced(coordinates: LayoutCoordinates) {
+                                placedLatch2.countDown()
+                            }
                         }
-
-                        override fun onPlaced(coordinates: LayoutCoordinates) {
-                            placedLatch2.countDown()
-                        }
-                    }
-                )
+                    )
+                }
             }
-        }
 
         rule.runOnUiThread {
             activity.setContent {
                 with(LocalDensity.current) {
                     val mod = Modifier.elementFor(node2)
-                    Box(
-                        Modifier.padding(10.toDp()).elementFor(node).then(mod)
-                    ) {
+                    Box(Modifier.padding(10.toDp()).elementFor(node).then(mod)) {
                         Box(Modifier.requiredSize(10.toDp()))
                     }
                 }
@@ -666,9 +692,7 @@
         assertEquals(10, changedSize1.height)
         assertEquals(10, changedSize1.width)
 
-        rule.runOnUiThread {
-            node2.addDelegate()
-        }
+        rule.runOnUiThread { node2.addDelegate() }
 
         // We've delegated to a node, so it must trigger onRemeasured and onPlaced on the new node
         assertTrue(sizeLatch2.await(1, TimeUnit.SECONDS))
@@ -680,19 +704,15 @@
     @Test
     @SmallTest
     fun modifierIsReturningEqualObjectForTheSameLambda() {
-        val lambda: (IntSize) -> Unit = { }
+        val lambda: (IntSize) -> Unit = {}
         assertEquals(Modifier.onSizeChanged(lambda), Modifier.onSizeChanged(lambda))
     }
 
     @Test
     @SmallTest
     fun modifierIsReturningNotEqualObjectForDifferentLambdas() {
-        val lambda1: (IntSize) -> Unit = {
-            it.height
-        }
-        val lambda2: (IntSize) -> Unit = {
-            it.width
-        }
+        val lambda1: (IntSize) -> Unit = { it.height }
+        val lambda2: (IntSize) -> Unit = { it.width }
         assertNotEquals(Modifier.onSizeChanged(lambda1), Modifier.onSizeChanged(lambda2))
     }
 
@@ -702,23 +722,23 @@
         var latch = CountDownLatch(1)
         var changedSize = IntSize.Zero
         var sizePx by mutableStateOf(10)
-        val node = object : DelegatingNode() {
-            val osc = delegate(
-                object : LayoutAwareModifierNode, Modifier.Node() {
-                    override fun onRemeasured(size: IntSize) {
-                        changedSize = size
-                        latch.countDown()
-                    }
-                }
-            )
-        }
+        val node =
+            object : DelegatingNode() {
+                val osc =
+                    delegate(
+                        object : LayoutAwareModifierNode, Modifier.Node() {
+                            override fun onRemeasured(size: IntSize) {
+                                changedSize = size
+                                latch.countDown()
+                            }
+                        }
+                    )
+            }
 
         rule.runOnUiThread {
             activity.setContent {
                 with(LocalDensity.current) {
-                    Box(
-                        Modifier.padding(10.toDp()).elementFor(node)
-                    ) {
+                    Box(Modifier.padding(10.toDp()).elementFor(node)) {
                         Box(Modifier.requiredSize(sizePx.toDp()))
                     }
                 }
@@ -746,31 +766,32 @@
         var changedSize1 = IntSize.Zero
         var changedSize2 = IntSize.Zero
         var sizePx by mutableStateOf(10)
-        val node = object : DelegatingNode() {
-            val a = delegate(
-                object : LayoutAwareModifierNode, Modifier.Node() {
-                    override fun onRemeasured(size: IntSize) {
-                        changedSize1 = size
-                        latch.countDown()
-                    }
-                }
-            )
-            val b = delegate(
-                object : LayoutAwareModifierNode, Modifier.Node() {
-                    override fun onRemeasured(size: IntSize) {
-                        changedSize2 = size
-                        latch.countDown()
-                    }
-                }
-            )
-        }
+        val node =
+            object : DelegatingNode() {
+                val a =
+                    delegate(
+                        object : LayoutAwareModifierNode, Modifier.Node() {
+                            override fun onRemeasured(size: IntSize) {
+                                changedSize1 = size
+                                latch.countDown()
+                            }
+                        }
+                    )
+                val b =
+                    delegate(
+                        object : LayoutAwareModifierNode, Modifier.Node() {
+                            override fun onRemeasured(size: IntSize) {
+                                changedSize2 = size
+                                latch.countDown()
+                            }
+                        }
+                    )
+            }
 
         rule.runOnUiThread {
             activity.setContent {
                 with(LocalDensity.current) {
-                    Box(
-                        Modifier.padding(10.toDp()).elementFor(node)
-                    ) {
+                    Box(Modifier.padding(10.toDp()).elementFor(node)) {
                         Box(Modifier.requiredSize(sizePx.toDp()))
                     }
                 }
@@ -800,29 +821,30 @@
     fun multipleDelegatedOnPlaced() {
         var latch = CountDownLatch(2)
         var paddingDp by mutableStateOf(10)
-        val node = object : DelegatingNode() {
-            val a = delegate(
-                object : LayoutAwareModifierNode, Modifier.Node() {
-                    override fun onPlaced(coordinates: LayoutCoordinates) {
-                        latch.countDown()
-                    }
-                }
-            )
-            val b = delegate(
-                object : LayoutAwareModifierNode, Modifier.Node() {
-                    override fun onPlaced(coordinates: LayoutCoordinates) {
-                        latch.countDown()
-                    }
-                }
-            )
-        }
+        val node =
+            object : DelegatingNode() {
+                val a =
+                    delegate(
+                        object : LayoutAwareModifierNode, Modifier.Node() {
+                            override fun onPlaced(coordinates: LayoutCoordinates) {
+                                latch.countDown()
+                            }
+                        }
+                    )
+                val b =
+                    delegate(
+                        object : LayoutAwareModifierNode, Modifier.Node() {
+                            override fun onPlaced(coordinates: LayoutCoordinates) {
+                                latch.countDown()
+                            }
+                        }
+                    )
+            }
 
         rule.runOnUiThread {
             activity.setContent {
                 with(LocalDensity.current) {
-                    Box(
-                        Modifier.padding(paddingDp.toDp()).elementFor(node)
-                    ) {
+                    Box(Modifier.padding(paddingDp.toDp()).elementFor(node)) {
                         Box(Modifier.requiredSize(10.dp))
                     }
                 }
diff --git a/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/layout/PlacedChildTest.kt b/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/layout/PlacedChildTest.kt
index 1051db8..2a28e137 100644
--- a/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/layout/PlacedChildTest.kt
+++ b/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/layout/PlacedChildTest.kt
@@ -56,8 +56,7 @@
 
     private val Tag = "tag"
 
-    @get:Rule
-    val rule = createAndroidComposeRule<TestActivity>()
+    @get:Rule val rule = createAndroidComposeRule<TestActivity>()
 
     @Test
     fun remeasureNotPlacedChild() {
@@ -66,11 +65,7 @@
             add(
                 node {
                     wrapChildren = true
-                    add(
-                        node {
-                            size = 10
-                        }
-                    )
+                    add(node { size = 10 })
                 }
             )
         }
@@ -92,32 +87,26 @@
         var visible by mutableStateOf(false)
         rule.setContent {
             Box(
-                Modifier
-                    .then(
-                        if (visible) Modifier else Modifier.layout { measurable, constraints ->
-                            val placeable = measurable.measure(constraints)
-                            layout(placeable.width, placeable.height) {
+                Modifier.then(
+                        if (visible) Modifier
+                        else
+                            Modifier.layout { measurable, constraints ->
+                                val placeable = measurable.measure(constraints)
+                                layout(placeable.width, placeable.height) {}
                             }
-                        }
                     )
                     .size(10.dp)
                     .testTag(Tag)
             )
         }
 
-        rule.runOnIdle {
-            visible = true
-        }
+        rule.runOnIdle { visible = true }
 
-        rule.onNodeWithTag(Tag)
-            .assertIsDisplayed()
+        rule.onNodeWithTag(Tag).assertIsDisplayed()
 
-        rule.runOnIdle {
-            visible = false
-        }
+        rule.runOnIdle { visible = false }
 
-        rule.onNodeWithTag(Tag)
-            .assertIsNotDisplayed()
+        rule.onNodeWithTag(Tag).assertIsNotDisplayed()
     }
 
     @SdkSuppress(minSdkVersion = Build.VERSION_CODES.O)
@@ -131,20 +120,19 @@
         rule.setContent {
             Box(Modifier.background(Color.Black).size(sizeDp).testTag(Tag)) {
                 Box(
-                    Modifier
-                        .then(
-                            if (visible) Modifier else Modifier.layout { measurable, constraints ->
-                                val placeable = measurable.measure(constraints)
-                                layout(placeable.width, placeable.height) {
+                    Modifier.then(
+                            if (visible) Modifier
+                            else
+                                Modifier.layout { measurable, constraints ->
+                                    val placeable = measurable.measure(constraints)
+                                    layout(placeable.width, placeable.height) {}
                                 }
-                            }
                         )
                         .fillMaxSize()
                         .background(Color.Red)
                 )
                 Box(
-                    Modifier
-                        .offset(y = halfSizeDp)
+                    Modifier.offset(y = halfSizeDp)
                         .height(halfSizeDp)
                         .fillMaxWidth()
                         .background(Color.Green)
@@ -152,58 +140,51 @@
             }
         }
 
-        rule.runOnIdle {
-            visible = true
+        rule.runOnIdle { visible = true }
+
+        rule.onNodeWithTag(Tag).captureToImage().assertPixels(expectedSize = IntSize(size, size)) {
+            offset ->
+            if (offset.y < halfSize) {
+                Color.Red
+            } else {
+                Color.Green
+            }
         }
 
-        rule.onNodeWithTag(Tag)
-            .captureToImage()
-            .assertPixels(expectedSize = IntSize(size, size)) { offset ->
-                if (offset.y < halfSize) {
-                    Color.Red
-                } else {
-                    Color.Green
-                }
-            }
+        rule.runOnIdle { visible = false }
 
-        rule.runOnIdle {
-            visible = false
+        rule.onNodeWithTag(Tag).captureToImage().assertPixels(expectedSize = IntSize(size, size)) {
+            offset ->
+            if (offset.y < halfSize) {
+                Color.Black
+            } else {
+                Color.Green
+            }
         }
-
-        rule.onNodeWithTag(Tag)
-            .captureToImage()
-            .assertPixels(expectedSize = IntSize(size, size)) { offset ->
-                if (offset.y < halfSize) {
-                    Color.Black
-                } else {
-                    Color.Green
-                }
-            }
     }
 
     @Test
     fun notPlacedChildIsNotCallingPlacingBlockOnItsModifier() {
         var modifier by mutableStateOf<Modifier>(Modifier)
         rule.setContent {
-            Layout(content = {
-                Box(modifier.size(10.dp))
-            }) { measurables, constraints ->
+            Layout(content = { Box(modifier.size(10.dp)) }) { measurables, constraints ->
                 val placeable = measurables.first().measure(constraints)
-                layout(placeable.width, placeable.height) { }
+                layout(placeable.width, placeable.height) {}
             }
         }
 
         var measureCount = 0
         var placementCount = 0
         rule.runOnIdle {
-            modifier = Modifier.layout { measurable, constraints ->
-                val placeable = measurable.measure(constraints)
-                measureCount++
-                layout(placeable.width, placeable.height) {
-                    placementCount++
-                    placeable.place(0, 0)
+            modifier =
+                Modifier.layout { measurable, constraints ->
+                    val placeable = measurable.measure(constraints)
+                    measureCount++
+                    layout(placeable.width, placeable.height) {
+                        placementCount++
+                        placeable.place(0, 0)
+                    }
                 }
-            }
         }
 
         rule.runOnIdle {
@@ -218,22 +199,22 @@
         val shouldPlaceState = mutableStateOf(true)
         var placementCount = 0
         rule.setContent {
-            Layout(content = {
-                Layout(content = {
-                    Layout { _, _ ->
-                        counterState.value
-                        layout(50, 50) {
-                            placementCount++
+            Layout(
+                content = {
+                    Layout(
+                        content = {
+                            Layout { _, _ ->
+                                counterState.value
+                                layout(50, 50) { placementCount++ }
+                            }
                         }
-                    }
-                }) { measurables, constraints ->
-                    // this parent is always placing a child
-                    val placeable = measurables.first().measure(constraints)
-                    layout(placeable.width, placeable.height) {
-                        placeable.place(0, 0)
+                    ) { measurables, constraints ->
+                        // this parent is always placing a child
+                        val placeable = measurables.first().measure(constraints)
+                        layout(placeable.width, placeable.height) { placeable.place(0, 0) }
                     }
                 }
-            }) { measurables, constraints ->
+            ) { measurables, constraints ->
                 val placeable = measurables.first().measure(constraints)
                 val shouldPlace = shouldPlaceState.value
                 layout(placeable.width, placeable.height) {
@@ -257,9 +238,7 @@
             shouldPlaceState.value = false
         }
 
-        rule.runOnIdle {
-            assertThat(placementCount).isEqualTo(0)
-        }
+        rule.runOnIdle { assertThat(placementCount).isEqualTo(0) }
     }
 
     @Test
@@ -269,22 +248,22 @@
         var placementCount = 0
         rule.setContent {
             LookaheadScope {
-                Layout(content = {
-                    Layout(content = {
-                        Layout { _, _ ->
-                            counterState.value
-                            layout(50, 50) {
-                                placementCount++
+                Layout(
+                    content = {
+                        Layout(
+                            content = {
+                                Layout { _, _ ->
+                                    counterState.value
+                                    layout(50, 50) { placementCount++ }
+                                }
                             }
-                        }
-                    }) { measurables, constraints ->
-                        // this parent is always placing a child
-                        val placeable = measurables.first().measure(constraints)
-                        layout(placeable.width, placeable.height) {
-                            placeable.place(0, 0)
+                        ) { measurables, constraints ->
+                            // this parent is always placing a child
+                            val placeable = measurables.first().measure(constraints)
+                            layout(placeable.width, placeable.height) { placeable.place(0, 0) }
                         }
                     }
-                }) { measurables, constraints ->
+                ) { measurables, constraints ->
                     val placeable = measurables.first().measure(constraints)
                     val shouldPlace = shouldPlaceState.value
                     layout(placeable.width, placeable.height) {
@@ -309,41 +288,27 @@
             shouldPlaceState.value = false
         }
 
-        rule.runOnIdle {
-            assertThat(placementCount).isEqualTo(0)
-        }
+        rule.runOnIdle { assertThat(placementCount).isEqualTo(0) }
     }
 
     @Test
     fun forceMeasureTheSubtreeSkipsNodesMeasuringInLayoutBlock() {
         val remeasurings = mutableListOf<Int>()
         val root = root {
-            runDuringMeasure(once = false) {
-                remeasurings.add(0)
-            }
+            runDuringMeasure(once = false) { remeasurings.add(0) }
             add(
                 node {
                     measureInLayoutBlock()
-                    runDuringMeasure(once = false) {
-                        remeasurings.add(1)
-                    }
+                    runDuringMeasure(once = false) { remeasurings.add(1) }
                     add(
                         node {
-                            runDuringMeasure(once = false) {
-                                remeasurings.add(2)
-                            }
+                            runDuringMeasure(once = false) { remeasurings.add(2) }
                             size = 10
                         }
                     )
                 }
             )
-            add(
-                node {
-                    runDuringMeasure(once = false) {
-                        remeasurings.add(3)
-                    }
-                }
-            )
+            add(node { runDuringMeasure(once = false) { remeasurings.add(3) } })
         }
 
         val delegate = createDelegate(root)
@@ -361,28 +326,16 @@
     fun forceMeasureTheSubtreeDoesntRelayoutWhenParentsSizeChanges() {
         val order = mutableListOf<Int>()
         val root = root {
-            runDuringMeasure(once = false) {
-                order.add(0)
-            }
-            runDuringLayout(once = false) {
-                order.add(1)
-            }
+            runDuringMeasure(once = false) { order.add(0) }
+            runDuringLayout(once = false) { order.add(1) }
             add(
                 node {
-                    runDuringMeasure(once = false) {
-                        order.add(2)
-                    }
-                    runDuringLayout(once = false) {
-                        order.add(3)
-                    }
+                    runDuringMeasure(once = false) { order.add(2) }
+                    runDuringLayout(once = false) { order.add(3) }
                     add(
                         node {
-                            runDuringMeasure(once = false) {
-                                order.add(6)
-                            }
-                            runDuringLayout(once = false) {
-                                order.add(7)
-                            }
+                            runDuringMeasure(once = false) { order.add(6) }
+                            runDuringLayout(once = false) { order.add(7) }
                             size = 10
                         }
                     )
@@ -390,12 +343,8 @@
             )
             add(
                 node {
-                    runDuringMeasure(once = false) {
-                        order.add(4)
-                    }
-                    runDuringLayout(once = false) {
-                        order.add(5)
-                    }
+                    runDuringMeasure(once = false) { order.add(4) }
+                    runDuringLayout(once = false) { order.add(5) }
                 }
             )
         }
@@ -409,16 +358,19 @@
         root.second.requestRemeasure() // node with indexes 4 and 5
         delegate.measureAndLayout()
 
-        assertThat(order).isEqualTo(listOf(
-            0, // remeasure root
-            6, // force remeasure root.first.first, it will change the size
-            2, // remeasure root.first because the size changed
-            4, // remeasure root.second
-            1, // relayout root
-            3, // relayout root.first
-            7, // relayout root.first.first
-            5, // relayout root.second
-        ))
+        assertThat(order)
+            .isEqualTo(
+                listOf(
+                    0, // remeasure root
+                    6, // force remeasure root.first.first, it will change the size
+                    2, // remeasure root.first because the size changed
+                    4, // remeasure root.second
+                    1, // relayout root
+                    3, // relayout root.first
+                    7, // relayout root.first.first
+                    5, // relayout root.second
+                )
+            )
     }
 
     @Test
@@ -427,16 +379,20 @@
         var placeCount = 0
         var childPlaceCount = 0
         rule.setContent {
-            Box(Modifier.layout { measurable, constraints ->
-                val p = measurable.measure(constraints)
-                layout(p.width, p.height) {
-                    placeCount++
-                    if (placeChild) {
-                        childPlaceCount++
-                        p.place(0, 0)
+            Box(
+                Modifier.layout { measurable, constraints ->
+                        val p = measurable.measure(constraints)
+                        layout(p.width, p.height) {
+                            placeCount++
+                            if (placeChild) {
+                                childPlaceCount++
+                                p.place(0, 0)
+                            }
+                        }
                     }
-                }
-            }.size(10.dp).background(Color.White)) {
+                    .size(10.dp)
+                    .background(Color.White)
+            ) {
                 Box(Modifier.size(5.dp).background(Color.Green))
             }
         }
@@ -453,14 +409,15 @@
     }
 }
 
-private val UseChildSizeButNotPlace = object : LayoutNode.NoIntrinsicsMeasurePolicy("") {
-    override fun MeasureScope.measure(
-        measurables: List<Measurable>,
-        constraints: Constraints
-    ): MeasureResult {
-        val placeable = measurables.first().measure(constraints)
-        return layout(placeable.width, placeable.height) {
-            // do not place
+private val UseChildSizeButNotPlace =
+    object : LayoutNode.NoIntrinsicsMeasurePolicy("") {
+        override fun MeasureScope.measure(
+            measurables: List<Measurable>,
+            constraints: Constraints
+        ): MeasureResult {
+            val placeable = measurables.first().measure(constraints)
+            return layout(placeable.width, placeable.height) {
+                // do not place
+            }
         }
     }
-}
diff --git a/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/layout/PlacementLayoutCoordinatesTest.kt b/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/layout/PlacementLayoutCoordinatesTest.kt
index f1e4df3..2caa2d7 100644
--- a/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/layout/PlacementLayoutCoordinatesTest.kt
+++ b/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/layout/PlacementLayoutCoordinatesTest.kt
@@ -61,12 +61,11 @@
 @MediumTest
 @RunWith(AndroidJUnit4::class)
 class PlacementLayoutCoordinatesTest {
-    @get:Rule
-    val rule = createAndroidComposeRule<ComponentActivity>()
+    @get:Rule val rule = createAndroidComposeRule<ComponentActivity>()
 
     /**
-     * The [Placeable.PlacementScope.coordinates] should not be `null` during normal placement
-     * and should have the position of the parent that is placing.
+     * The [Placeable.PlacementScope.coordinates] should not be `null` during normal placement and
+     * should have the position of the parent that is placing.
      */
     @Test
     fun coordinatesWhilePlacing() {
@@ -77,15 +76,12 @@
         rule.setContent {
             Box(Modifier.fillMaxSize()) {
                 Box(
-                    Modifier
-                        .align(alignment)
+                    Modifier.align(alignment)
                         .layout { measurable, constraints ->
                             val p = measurable.measure(constraints)
                             layout(p.width, p.height) {
                                 locations += coordinates
-                                locationAtPlace = coordinates
-                                    ?.positionInRoot()
-                                    ?.round()
+                                locationAtPlace = coordinates?.positionInRoot()?.round()
                                 boxSize = IntSize(p.width, p.height)
                                 p.place(0, 0)
                             }
@@ -119,8 +115,8 @@
     }
 
     /**
-     * The [Placeable.PlacementScope.coordinates] should not be `null` during normal placement
-     * and should have the position of the parent that is placing.
+     * The [Placeable.PlacementScope.coordinates] should not be `null` during normal placement and
+     * should have the position of the parent that is placing.
      */
     @OptIn(ExperimentalComposeUiApi::class)
     @Test
@@ -133,15 +129,12 @@
             LookaheadScope {
                 Box(Modifier.fillMaxSize()) {
                     Box(
-                        Modifier
-                            .align(alignment)
+                        Modifier.align(alignment)
                             .layout { measurable, constraints ->
                                 val p = measurable.measure(constraints)
                                 layout(p.width, p.height) {
                                     locations += coordinates
-                                    locationAtPlace = coordinates
-                                        ?.positionInRoot()
-                                        ?.round()
+                                    locationAtPlace = coordinates?.positionInRoot()?.round()
                                     boxSize = IntSize(p.width, p.height)
                                     p.place(0, 0)
                                 }
@@ -180,19 +173,16 @@
         val locations = mutableStateListOf<LayoutCoordinates?>()
         rule.setContent {
             Row(Modifier.fillMaxSize()) {
-                Box(Modifier.alignByBaseline()) {
-                    Text("Hello")
-                }
+                Box(Modifier.alignByBaseline()) { Text("Hello") }
                 Box(
-                    Modifier
-                        .alignByBaseline()
-                        .layout { measurable, constraints ->
-                            val p = measurable.measure(constraints)
-                            layout(p.width, p.height) {
-                                locations += coordinates
-                                p.place(0, 0)
-                            }
-                        }) {
+                    Modifier.alignByBaseline().layout { measurable, constraints ->
+                        val p = measurable.measure(constraints)
+                        layout(p.width, p.height) {
+                            locations += coordinates
+                            p.place(0, 0)
+                        }
+                    }
+                ) {
                     Text("World")
                 }
             }
@@ -214,19 +204,16 @@
         rule.setContent {
             LookaheadScope {
                 Row(Modifier.fillMaxSize()) {
-                    Box(Modifier.alignByBaseline()) {
-                        Text("Hello")
-                    }
+                    Box(Modifier.alignByBaseline()) { Text("Hello") }
                     Box(
-                        Modifier
-                            .alignByBaseline()
-                            .layout { measurable, constraints ->
-                                val p = measurable.measure(constraints)
-                                layout(p.width, p.height) {
-                                    locations += coordinates
-                                    p.place(0, 0)
-                                }
-                            }) {
+                        Modifier.alignByBaseline().layout { measurable, constraints ->
+                            val p = measurable.measure(constraints)
+                            layout(p.width, p.height) {
+                                locations += coordinates
+                                p.place(0, 0)
+                            }
+                        }
+                    ) {
                         Text("World")
                     }
                 }
@@ -250,9 +237,7 @@
         val locations = mutableStateListOf<LayoutCoordinates?>()
         rule.setContent {
             Row(Modifier.fillMaxSize()) {
-                Box(Modifier.alignByBaseline()) {
-                    Text("Hello")
-                }
+                Box(Modifier.alignByBaseline()) { Text("Hello") }
                 val content = @Composable { Text("World") }
                 Layout(content, Modifier.alignByBaseline()) { measurables, constraints ->
                     val p = measurables[0].measure(constraints)
@@ -280,9 +265,7 @@
         rule.setContent {
             LookaheadScope {
                 Row(Modifier.fillMaxSize()) {
-                    Box(Modifier.alignByBaseline()) {
-                        Text("Hello")
-                    }
+                    Box(Modifier.alignByBaseline()) { Text("Hello") }
                     val content = @Composable { Text("World") }
                     Layout(content, Modifier.alignByBaseline()) { measurables, constraints ->
                         val p = measurables[0].measure(constraints)
@@ -308,25 +291,29 @@
         rule.setContent {
             Row(Modifier.fillMaxSize()) {
                 Box(Modifier.alignByBaseline()) {
-                    Text("Hello", modifier = Modifier.layout { measurable, constraints ->
-                        val p = measurable.measure(constraints)
-                        layout(p.width, p.height) {
-                            textLayoutInvocations++
-                            p.place(0, 0)
-                        }
-                    })
+                    Text(
+                        "Hello",
+                        modifier =
+                            Modifier.layout { measurable, constraints ->
+                                val p = measurable.measure(constraints)
+                                layout(p.width, p.height) {
+                                    textLayoutInvocations++
+                                    p.place(0, 0)
+                                }
+                            }
+                    )
                 }
                 val content = @Composable { Text("World") }
-                Layout(content,
-                    Modifier
-                        .alignByBaseline()
-                        .layout { measurable, constraints ->
-                            val p = measurable.measure(constraints)
-                            layout(p.width, p.height + 10) {
-                                p[LastBaseline] // invoke alignment
-                                p.place(0, 10)
-                            }
-                        }) { measurables, constraints ->
+                Layout(
+                    content,
+                    Modifier.alignByBaseline().layout { measurable, constraints ->
+                        val p = measurable.measure(constraints)
+                        layout(p.width, p.height + 10) {
+                            p[LastBaseline] // invoke alignment
+                            p.place(0, 10)
+                        }
+                    }
+                ) { measurables, constraints ->
                     val p = measurables[0].measure(constraints)
                     layout(p.width, p.height) {
                         locations += coordinates.use()
@@ -350,8 +337,7 @@
             Box(Modifier.fillMaxSize()) {
                 Box(Modifier.offset(offset.x, offset.y)) {
                     Box(
-                        Modifier
-                            .layout { measurable, constraints ->
+                        Modifier.layout { measurable, constraints ->
                                 val p = measurable.measure(constraints)
                                 layout(p.width, p.height) {
                                     locations += coordinates.use()
@@ -382,8 +368,7 @@
                 Box(Modifier.offset(offset.x, offset.y)) {
                     Box {
                         Box(
-                            Modifier
-                                .layout { measurable, constraints ->
+                            Modifier.layout { measurable, constraints ->
                                     val p = measurable.measure(constraints)
                                     layout(p.width, p.height) {
                                         locations += coordinates.use()
@@ -418,8 +403,7 @@
                         Box(Modifier.fillMaxSize())
                         if (showContent2) {
                             Box(
-                                Modifier
-                                    .layout { measurable, constraints ->
+                                Modifier.layout { measurable, constraints ->
                                         val p = measurable.measure(constraints)
                                         layout(p.width, p.height) {
                                             locations += coordinates.use()
@@ -455,8 +439,7 @@
                 Box(Modifier.offset(offset.x, offset.y)) {
                     Box {
                         Box(
-                            Modifier
-                                .layout { measurable, constraints ->
+                            Modifier.layout { measurable, constraints ->
                                     val p = measurable.measure(constraints)
                                     layout(p.width, p.height) {
                                         layoutCalls +=
@@ -491,9 +474,7 @@
         assertEquals(0, layoutCalls.size)
     }
 
-    /**
-     * When a LayoutNode is moved, its usage of coordinates should follow.
-     */
+    /** When a LayoutNode is moved, its usage of coordinates should follow. */
     @Test
     fun movedContentNotifies() {
         val locations = mutableStateListOf<LayoutCoordinates?>()
@@ -504,8 +485,7 @@
             val usingCoordinates = remember {
                 movableContentOf {
                     Box(
-                        Modifier
-                            .layout { measurable, constraints ->
+                        Modifier.layout { measurable, constraints ->
                                 val p = measurable.measure(constraints)
                                 layout(p.width, p.height) {
                                     locations += coordinates.use()
@@ -517,20 +497,12 @@
                 }
             }
             Box(Modifier.fillMaxSize()) {
-                Box(
-                    Modifier
-                        .size(50.dp)
-                        .offset(offset1.x, offset1.y)
-                ) {
+                Box(Modifier.size(50.dp).offset(offset1.x, offset1.y)) {
                     if (showInOne) {
                         usingCoordinates()
                     }
                 }
-                Box(
-                    Modifier
-                        .size(50.dp)
-                        .offset(offset2.x, offset2.y)
-                ) {
+                Box(Modifier.size(50.dp).offset(offset2.x, offset2.y)) {
                     if (!showInOne) {
                         usingCoordinates()
                     }
@@ -560,13 +532,14 @@
         var offset by mutableStateOf(Offset.Zero)
         rule.setContent {
             Box(Modifier.fillMaxSize()) {
-                Box(Modifier.graphicsLayer {
-                    translationX = offset.x
-                    translationY = offset.y
-                }) {
+                Box(
+                    Modifier.graphicsLayer {
+                        translationX = offset.x
+                        translationY = offset.y
+                    }
+                ) {
                     Box(
-                        Modifier
-                            .layout { measurable, constraints ->
+                        Modifier.layout { measurable, constraints ->
                                 val p = measurable.measure(constraints)
                                 layout(p.width, p.height) {
                                     locations += coordinates.use()
@@ -597,8 +570,7 @@
         rule.setContent {
             Box(Modifier.fillMaxSize()) {
                 Box(
-                    Modifier
-                        .graphicsLayer {
+                    Modifier.graphicsLayer {
                             translationX = offset.x
                             translationY = offset.y
                         }
@@ -628,21 +600,21 @@
         rule.runOnUiThread {
             val container = FrameLayout(rule.activity)
 
-            composeView = ComposeView(rule.activity).apply {
-                setContent {
-                    Box(
-                        Modifier
-                            .layout { measurable, constraints ->
-                                val p = measurable.measure(constraints)
-                                layout(p.width, p.height) {
-                                    locations += coordinates.use()
-                                    p.place(0, 0)
+            composeView =
+                ComposeView(rule.activity).apply {
+                    setContent {
+                        Box(
+                            Modifier.layout { measurable, constraints ->
+                                    val p = measurable.measure(constraints)
+                                    layout(p.width, p.height) {
+                                        locations += coordinates.use()
+                                        p.place(0, 0)
+                                    }
                                 }
-                            }
-                            .size(10.dp)
-                    )
+                                .size(10.dp)
+                        )
+                    }
                 }
-            }
             container.addView(
                 composeView,
                 FrameLayout.LayoutParams(
@@ -651,10 +623,11 @@
                     Gravity.TOP or Gravity.LEFT
                 )
             )
-            container.layoutParams = ViewGroup.LayoutParams(
-                ViewGroup.LayoutParams.MATCH_PARENT,
-                ViewGroup.LayoutParams.MATCH_PARENT
-            )
+            container.layoutParams =
+                ViewGroup.LayoutParams(
+                    ViewGroup.LayoutParams.MATCH_PARENT,
+                    ViewGroup.LayoutParams.MATCH_PARENT
+                )
             rule.activity.setContentView(container)
         }
 
@@ -675,18 +648,18 @@
         var offset by mutableStateOf(0)
         var layoutBlockCalls = 0
         rule.setContent {
-            Layout(content = {
-                Layout { _, _ ->
-                    layout(10, 10) {
-                        coordinates?.positionInParent()
-                        layoutBlockCalls++
+            Layout(
+                content = {
+                    Layout { _, _ ->
+                        layout(10, 10) {
+                            coordinates?.positionInParent()
+                            layoutBlockCalls++
+                        }
                     }
                 }
-            }) { measurables, constraints ->
+            ) { measurables, constraints ->
                 val placeable = measurables.first().measure(constraints)
-                layout(placeable.width, placeable.height) {
-                    placeable.place(offset, 0)
-                }
+                layout(placeable.width, placeable.height) { placeable.place(offset, 0) }
             }
         }
 
@@ -701,9 +674,7 @@
             offset = 2
         }
 
-        rule.runOnIdle {
-            assertEquals(1, layoutBlockCalls)
-        }
+        rule.runOnIdle { assertEquals(1, layoutBlockCalls) }
     }
 
     @Test
@@ -712,18 +683,18 @@
         var coordinatesAction: (LayoutCoordinates) -> Unit by mutableStateOf({})
         var layoutBlockCalls = 0
         rule.setContent {
-            Layout(content = {
-                Layout { _, _ ->
-                    layout(10, 10) {
-                        coordinates?.let(coordinatesAction)
-                        layoutBlockCalls++
+            Layout(
+                content = {
+                    Layout { _, _ ->
+                        layout(10, 10) {
+                            coordinates?.let(coordinatesAction)
+                            layoutBlockCalls++
+                        }
                     }
                 }
-            }) { measurables, constraints ->
+            ) { measurables, constraints ->
                 val placeable = measurables.first().measure(constraints)
-                layout(placeable.width, placeable.height) {
-                    placeable.place(offset, 0)
-                }
+                layout(placeable.width, placeable.height) { placeable.place(offset, 0) }
             }
         }
 
@@ -755,7 +726,7 @@
         assert(relayoutExpected = true, "boundsInRoot()") { it.boundsInRoot() }
         assert(relayoutExpected = true, "boundsInWindow()") { it.boundsInWindow() }
 
-        assert(relayoutExpected = false, "empty") { }
+        assert(relayoutExpected = false, "empty") {}
         assert(relayoutExpected = false, "size") { it.size }
         assert(relayoutExpected = false, "isAttached") { it.isAttached }
         assert(relayoutExpected = false, "providedAlignmentLines") { it.providedAlignmentLines }
@@ -767,10 +738,10 @@
         var coordinatesAction: (LayoutCoordinates) -> Unit by mutableStateOf({})
         var layoutBlockCalls = 0
         rule.setContent {
-            Layout(content = {
-                Box(
-                    Modifier
-                        .layout { measurable, constraints ->
+            Layout(
+                content = {
+                    Box(
+                        Modifier.layout { measurable, constraints ->
                             val p = measurable.measure(constraints)
                             layout(p.width, p.height) {
                                 coordinates?.let(coordinatesAction)
@@ -778,12 +749,11 @@
                                 p.place(0, 0)
                             }
                         }
-                )
-            }) { measurables, constraints ->
-                val placeable = measurables.first().measure(constraints)
-                layout(placeable.width, placeable.height) {
-                    placeable.place(offset, 0)
+                    )
                 }
+            ) { measurables, constraints ->
+                val placeable = measurables.first().measure(constraints)
+                layout(placeable.width, placeable.height) { placeable.place(offset, 0) }
             }
         }
 
@@ -815,7 +785,7 @@
         assert(relayoutExpected = true, "boundsInRoot()") { it.boundsInRoot() }
         assert(relayoutExpected = true, "boundsInWindow()") { it.boundsInWindow() }
 
-        assert(relayoutExpected = false, "empty") { }
+        assert(relayoutExpected = false, "empty") {}
         assert(relayoutExpected = false, "size") { it.size }
         assert(relayoutExpected = false, "isAttached") { it.isAttached }
         assert(relayoutExpected = false, "providedAlignmentLines") { it.providedAlignmentLines }
@@ -829,37 +799,36 @@
         var intermediateLayoutBlockCalls = 0
         rule.setContent {
             LookaheadScope {
-                Layout(content = {
-                    Box(
-                        Modifier
-                            .approachLayout({
-                                intermediateLayoutBlockCalls <= 20
-                            }) { measurable, constraints ->
-                                val p = measurable.measure(constraints)
-                                layout(p.width, p.height) {
-                                    coordinates?.let(coordinatesAction)
-                                    intermediateLayoutBlockCalls++
-                                    p.place(0, 0)
+                Layout(
+                    content = {
+                        Box(
+                            Modifier.approachLayout({ intermediateLayoutBlockCalls <= 20 }) {
+                                    measurable,
+                                    constraints ->
+                                    val p = measurable.measure(constraints)
+                                    layout(p.width, p.height) {
+                                        coordinates?.let(coordinatesAction)
+                                        intermediateLayoutBlockCalls++
+                                        p.place(0, 0)
+                                    }
                                 }
-                            }
-                            .layout { measurable, constraints ->
-                                val p = measurable.measure(constraints)
-                                layout(10, 10) {
-                                    // if we don't read the coordinates here as well
-                                    // the read of coordinates in intermediate layout could be
-                                    // skipped as both passes share the same
-                                    // coordinatesAccessedDuringPlacement property.
-                                    // filed b/284153462 to track this issue
-                                    coordinates?.let(coordinatesAction)
-                                    p.place(0, 0)
+                                .layout { measurable, constraints ->
+                                    val p = measurable.measure(constraints)
+                                    layout(10, 10) {
+                                        // if we don't read the coordinates here as well
+                                        // the read of coordinates in intermediate layout could be
+                                        // skipped as both passes share the same
+                                        // coordinatesAccessedDuringPlacement property.
+                                        // filed b/284153462 to track this issue
+                                        coordinates?.let(coordinatesAction)
+                                        p.place(0, 0)
+                                    }
                                 }
-                            }
-                    )
-                }) { measurables, constraints ->
-                    val placeable = measurables.first().measure(constraints)
-                    layout(placeable.width, placeable.height) {
-                        placeable.place(offset, 0)
+                        )
                     }
+                ) { measurables, constraints ->
+                    val placeable = measurables.first().measure(constraints)
+                    layout(placeable.width, placeable.height) { placeable.place(offset, 0) }
                 }
             }
         }
@@ -892,7 +861,7 @@
         assert(relayoutExpected = true, "boundsInRoot()") { it.boundsInRoot() }
         assert(relayoutExpected = true, "boundsInWindow()") { it.boundsInWindow() }
 
-        assert(relayoutExpected = false, "empty") { }
+        assert(relayoutExpected = false, "empty") {}
         assert(relayoutExpected = false, "size") { it.size }
         assert(relayoutExpected = false, "isAttached") { it.isAttached }
         assert(relayoutExpected = false, "providedAlignmentLines") { it.providedAlignmentLines }
diff --git a/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/layout/RemeasureWithIntrinsicsRealClockTest.kt b/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/layout/RemeasureWithIntrinsicsRealClockTest.kt
index 9a60433..8d65c60 100644
--- a/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/layout/RemeasureWithIntrinsicsRealClockTest.kt
+++ b/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/layout/RemeasureWithIntrinsicsRealClockTest.kt
@@ -47,18 +47,16 @@
 
 /**
  * Copies of most of the tests in [RemeasureWithIntrinsicsTest] but without using
- * TestMonotonicFrameClock, since it does layout passes slightly differently than in production
- * and this has bitten us in the past (see b/222093277).
+ * TestMonotonicFrameClock, since it does layout passes slightly differently than in production and
+ * this has bitten us in the past (see b/222093277).
  */
 @MediumTest
 @RunWith(AndroidJUnit4::class)
 class RemeasureWithIntrinsicsRealClockTest {
 
-    @get:Rule
-    val rule = ActivityScenarioRule(TestActivity::class.java)
+    @get:Rule val rule = ActivityScenarioRule(TestActivity::class.java)
 
-    @get:Rule
-    val excessiveAssertions = AndroidOwnerExtraAssertionsRule()
+    @get:Rule val excessiveAssertions = AndroidOwnerExtraAssertionsRule()
 
     private val testLatch = CountDownLatch(1)
 
@@ -100,8 +98,7 @@
             content = {
                 LayoutUsingIntrinsics {
                     Box(
-                        Modifier
-                            .onSizeChanged { childSize = it }
+                        Modifier.onSizeChanged { childSize = it }
                             .withIntrinsics(intrinsicWidth, intrinsicHeight)
                     )
                 }
@@ -159,8 +156,7 @@
                 LayoutUsingIntrinsics {
                     Box(propagateMinConstraints = true) {
                         Box(
-                            Modifier
-                                .onSizeChanged { childSize = it }
+                            Modifier.onSizeChanged { childSize = it }
                                 .withIntrinsics(intrinsicWidth, intrinsicHeight)
                         )
                     }
@@ -216,16 +212,10 @@
 
         setTestContent(
             content = {
-                LayoutUsingIntrinsics(
-                    onMeasure = { ++measures1 }
-                ) {
+                LayoutUsingIntrinsics(onMeasure = { ++measures1 }) {
                     Box {
-                        LayoutUsingIntrinsics(
-                            onMeasure = { ++measures2 }
-                        ) {
-                            Box {
-                                LayoutWithIntrinsics(intrinsicWidth, intrinsicHeight)
-                            }
+                        LayoutUsingIntrinsics(onMeasure = { ++measures2 }) {
+                            Box { LayoutWithIntrinsics(intrinsicWidth, intrinsicHeight) }
                         }
                     }
                 }
@@ -261,9 +251,7 @@
             measurable.maxIntrinsicWidth(constraints.maxHeight)
             measurable.maxIntrinsicHeight(constraints.maxWidth)
             val placeable = measurable.measure(constraints)
-            layout(constraints.maxWidth, constraints.maxHeight) {
-                placeable.place(0, 0)
-            }
+            layout(constraints.maxWidth, constraints.maxHeight) { placeable.place(0, 0) }
         }
 
         setTestContent(
@@ -305,11 +293,7 @@
                     // Box used to fast return intrinsics and do not remeasure when the size
                     // of the inner Box is changing after the intrinsics change.
                     Box(Modifier.requiredSize(100.toDp())) {
-                        Box(
-                            Modifier
-                                .onSizeChanged { boxSize = it }
-                                .then(ModifierUsingIntrinsics)
-                        ) {
+                        Box(Modifier.onSizeChanged { boxSize = it }.then(ModifierUsingIntrinsics)) {
                             LayoutWithIntrinsics(intrinsicWidth, intrinsicHeight)
                         }
                     }
@@ -339,11 +323,7 @@
                     // Box used to fast return intrinsics and do not remeasure when the size
                     // of the inner Box is changing after the intrinsics change.
                     Box(Modifier.requiredSize(100.toDp())) {
-                        Box(
-                            Modifier
-                                .onSizeChanged { boxSize = it }
-                                .then(ModifierUsingIntrinsics)
-                        ) {
+                        Box(Modifier.onSizeChanged { boxSize = it }.then(ModifierUsingIntrinsics)) {
                             LayoutWithIntrinsics(intrinsicWidth, intrinsicHeight)
                         }
                     }
@@ -368,11 +348,7 @@
         setTestContent(
             content = {
                 LayoutUsingIntrinsics {
-                    Box(
-                        Modifier
-                            .onSizeChanged { childSize = it }
-                            .then(childModifier)
-                    )
+                    Box(Modifier.onSizeChanged { childSize = it }.then(childModifier))
                 }
             },
             test = {
@@ -416,25 +392,26 @@
         Layout(
             content = content,
             modifier = modifier,
-            measurePolicy = object : MeasurePolicy {
-                override fun MeasureScope.measure(
-                    measurables: List<Measurable>,
-                    constraints: Constraints
-                ): MeasureResult {
-                    onMeasure()
-                    return layout(constraints.minWidth, constraints.minHeight) {}
+            measurePolicy =
+                object : MeasurePolicy {
+                    override fun MeasureScope.measure(
+                        measurables: List<Measurable>,
+                        constraints: Constraints
+                    ): MeasureResult {
+                        onMeasure()
+                        return layout(constraints.minWidth, constraints.minHeight) {}
+                    }
+
+                    override fun IntrinsicMeasureScope.maxIntrinsicWidth(
+                        measurables: List<IntrinsicMeasurable>,
+                        height: Int
+                    ): Int = width
+
+                    override fun IntrinsicMeasureScope.maxIntrinsicHeight(
+                        measurables: List<IntrinsicMeasurable>,
+                        width: Int
+                    ): Int = height
                 }
-
-                override fun IntrinsicMeasureScope.maxIntrinsicWidth(
-                    measurables: List<IntrinsicMeasurable>,
-                    height: Int
-                ): Int = width
-
-                override fun IntrinsicMeasureScope.maxIntrinsicHeight(
-                    measurables: List<IntrinsicMeasurable>,
-                    width: Int
-                ): Int = height
-            }
         )
     }
 
@@ -453,17 +430,17 @@
                 ): MeasureResult {
                     require(measurables.size == 1)
                     onMeasure()
-                    val childConstraints = if (useIntrinsics()) {
-                        val width = measurables.first().maxIntrinsicWidth(constraints.maxHeight)
-                        val height = measurables.first().maxIntrinsicHeight(constraints.maxWidth)
-                        Constraints.fixed(width, height)
-                    } else {
-                        constraints
-                    }
+                    val childConstraints =
+                        if (useIntrinsics()) {
+                            val width = measurables.first().maxIntrinsicWidth(constraints.maxHeight)
+                            val height =
+                                measurables.first().maxIntrinsicHeight(constraints.maxWidth)
+                            Constraints.fixed(width, height)
+                        } else {
+                            constraints
+                        }
                     val placeable = measurables.first().measure(childConstraints)
-                    return layout(placeable.width, placeable.height) {
-                        placeable.place(0, 0)
-                    }
+                    return layout(placeable.width, placeable.height) { placeable.place(0, 0) }
                 }
 
                 override fun IntrinsicMeasureScope.minIntrinsicWidth(
@@ -497,61 +474,60 @@
         content: @Composable () -> Unit
     ) = LayoutMaybeUsingIntrinsics({ true }, modifier, onMeasure, content)
 
-    private val ModifierUsingIntrinsics = object : LayoutModifier {
-        override fun MeasureScope.measure(
-            measurable: Measurable,
-            constraints: Constraints
-        ): MeasureResult {
-            val width = measurable.maxIntrinsicWidth(constraints.maxHeight)
-            val height = measurable.maxIntrinsicHeight(constraints.maxWidth)
-            val placeable = measurable.measure(Constraints.fixed(width, height))
-            return layout(placeable.width, placeable.height) {
-                placeable.place(0, 0)
-            }
-        }
-
-        override fun IntrinsicMeasureScope.minIntrinsicWidth(
-            measurable: IntrinsicMeasurable,
-            height: Int
-        ) = measurable.minIntrinsicWidth(height)
-
-        override fun IntrinsicMeasureScope.minIntrinsicHeight(
-            measurable: IntrinsicMeasurable,
-            width: Int
-        ) = measurable.minIntrinsicHeight(width)
-
-        override fun IntrinsicMeasureScope.maxIntrinsicWidth(
-            measurable: IntrinsicMeasurable,
-            height: Int
-        ) = measurable.maxIntrinsicWidth(height)
-
-        override fun IntrinsicMeasureScope.maxIntrinsicHeight(
-            measurable: IntrinsicMeasurable,
-            width: Int
-        ) = measurable.maxIntrinsicHeight(width)
-    }
-
-    private fun Modifier.withIntrinsics(width: Int, height: Int): Modifier {
-        return this.then(object : LayoutModifier {
+    private val ModifierUsingIntrinsics =
+        object : LayoutModifier {
             override fun MeasureScope.measure(
                 measurable: Measurable,
                 constraints: Constraints
             ): MeasureResult {
-                val placeable = measurable.measure(constraints)
-                return layout(placeable.width, placeable.height) {
-                    placeable.place(0, 0)
-                }
+                val width = measurable.maxIntrinsicWidth(constraints.maxHeight)
+                val height = measurable.maxIntrinsicHeight(constraints.maxWidth)
+                val placeable = measurable.measure(Constraints.fixed(width, height))
+                return layout(placeable.width, placeable.height) { placeable.place(0, 0) }
             }
 
+            override fun IntrinsicMeasureScope.minIntrinsicWidth(
+                measurable: IntrinsicMeasurable,
+                height: Int
+            ) = measurable.minIntrinsicWidth(height)
+
+            override fun IntrinsicMeasureScope.minIntrinsicHeight(
+                measurable: IntrinsicMeasurable,
+                width: Int
+            ) = measurable.minIntrinsicHeight(width)
+
             override fun IntrinsicMeasureScope.maxIntrinsicWidth(
                 measurable: IntrinsicMeasurable,
                 height: Int
-            ): Int = width
+            ) = measurable.maxIntrinsicWidth(height)
 
             override fun IntrinsicMeasureScope.maxIntrinsicHeight(
                 measurable: IntrinsicMeasurable,
                 width: Int
-            ): Int = height
-        })
+            ) = measurable.maxIntrinsicHeight(width)
+        }
+
+    private fun Modifier.withIntrinsics(width: Int, height: Int): Modifier {
+        return this.then(
+            object : LayoutModifier {
+                override fun MeasureScope.measure(
+                    measurable: Measurable,
+                    constraints: Constraints
+                ): MeasureResult {
+                    val placeable = measurable.measure(constraints)
+                    return layout(placeable.width, placeable.height) { placeable.place(0, 0) }
+                }
+
+                override fun IntrinsicMeasureScope.maxIntrinsicWidth(
+                    measurable: IntrinsicMeasurable,
+                    height: Int
+                ): Int = width
+
+                override fun IntrinsicMeasureScope.maxIntrinsicHeight(
+                    measurable: IntrinsicMeasurable,
+                    width: Int
+                ): Int = height
+            }
+        )
     }
 }
diff --git a/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/layout/RemeasureWithIntrinsicsTest.kt b/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/layout/RemeasureWithIntrinsicsTest.kt
index 3b7b505..cb47238 100644
--- a/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/layout/RemeasureWithIntrinsicsTest.kt
+++ b/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/layout/RemeasureWithIntrinsicsTest.kt
@@ -54,11 +54,9 @@
 @RunWith(AndroidJUnit4::class)
 class RemeasureWithIntrinsicsTest {
 
-    @get:Rule
-    val rule = createAndroidComposeRule<TestActivity>()
+    @get:Rule val rule = createAndroidComposeRule<TestActivity>()
 
-    @get:Rule
-    val excessiveAssertions = AndroidOwnerExtraAssertionsRule()
+    @get:Rule val excessiveAssertions = AndroidOwnerExtraAssertionsRule()
 
     @Test
     fun remeasuringChildWhenParentUsedIntrinsicSizes() {
@@ -67,26 +65,18 @@
 
         rule.setContent {
             LayoutUsingIntrinsics {
-                LayoutWithIntrinsics(
-                    intrinsicWidth,
-                    intrinsicHeight,
-                    Modifier.testTag("child")
-                )
+                LayoutWithIntrinsics(intrinsicWidth, intrinsicHeight, Modifier.testTag("child"))
             }
         }
 
-        rule.onNodeWithTag("child")
-            .assertWidthIsEqualTo(40.dp)
-            .assertHeightIsEqualTo(50.dp)
+        rule.onNodeWithTag("child").assertWidthIsEqualTo(40.dp).assertHeightIsEqualTo(50.dp)
 
         rule.runOnIdle {
             intrinsicWidth = 30.dp
             intrinsicHeight = 20.dp
         }
 
-        rule.onNodeWithTag("child")
-            .assertWidthIsEqualTo(30.dp)
-            .assertHeightIsEqualTo(20.dp)
+        rule.onNodeWithTag("child").assertWidthIsEqualTo(30.dp).assertHeightIsEqualTo(20.dp)
     }
 
     @Test
@@ -96,26 +86,18 @@
 
         rule.setContent {
             LayoutUsingIntrinsics {
-                Box(
-                    Modifier
-                        .testTag("child")
-                        .withIntrinsics(intrinsicWidth, intrinsicHeight)
-                )
+                Box(Modifier.testTag("child").withIntrinsics(intrinsicWidth, intrinsicHeight))
             }
         }
 
-        rule.onNodeWithTag("child")
-            .assertWidthIsEqualTo(40.dp)
-            .assertHeightIsEqualTo(50.dp)
+        rule.onNodeWithTag("child").assertWidthIsEqualTo(40.dp).assertHeightIsEqualTo(50.dp)
 
         rule.runOnIdle {
             intrinsicWidth = 30.dp
             intrinsicHeight = 20.dp
         }
 
-        rule.onNodeWithTag("child")
-            .assertWidthIsEqualTo(30.dp)
-            .assertHeightIsEqualTo(20.dp)
+        rule.onNodeWithTag("child").assertWidthIsEqualTo(30.dp).assertHeightIsEqualTo(20.dp)
     }
 
     @Test
@@ -126,27 +108,19 @@
         rule.setContent {
             LayoutUsingIntrinsics {
                 Box(propagateMinConstraints = true) {
-                    LayoutWithIntrinsics(
-                        intrinsicWidth,
-                        intrinsicHeight,
-                        Modifier.testTag("child")
-                    )
+                    LayoutWithIntrinsics(intrinsicWidth, intrinsicHeight, Modifier.testTag("child"))
                 }
             }
         }
 
-        rule.onNodeWithTag("child")
-            .assertWidthIsEqualTo(40.dp)
-            .assertHeightIsEqualTo(50.dp)
+        rule.onNodeWithTag("child").assertWidthIsEqualTo(40.dp).assertHeightIsEqualTo(50.dp)
 
         rule.runOnIdle {
             intrinsicWidth = 30.dp
             intrinsicHeight = 20.dp
         }
 
-        rule.onNodeWithTag("child")
-            .assertWidthIsEqualTo(30.dp)
-            .assertHeightIsEqualTo(20.dp)
+        rule.onNodeWithTag("child").assertWidthIsEqualTo(30.dp).assertHeightIsEqualTo(20.dp)
     }
 
     @Test
@@ -157,27 +131,19 @@
         rule.setContent {
             LayoutUsingIntrinsics {
                 Box(propagateMinConstraints = true) {
-                    Box(
-                        Modifier
-                            .testTag("child")
-                            .withIntrinsics(intrinsicWidth, intrinsicHeight)
-                    )
+                    Box(Modifier.testTag("child").withIntrinsics(intrinsicWidth, intrinsicHeight))
                 }
             }
         }
 
-        rule.onNodeWithTag("child")
-            .assertWidthIsEqualTo(40.dp)
-            .assertHeightIsEqualTo(50.dp)
+        rule.onNodeWithTag("child").assertWidthIsEqualTo(40.dp).assertHeightIsEqualTo(50.dp)
 
         rule.runOnIdle {
             intrinsicWidth = 30.dp
             intrinsicHeight = 20.dp
         }
 
-        rule.onNodeWithTag("child")
-            .assertWidthIsEqualTo(30.dp)
-            .assertHeightIsEqualTo(20.dp)
+        rule.onNodeWithTag("child").assertWidthIsEqualTo(30.dp).assertHeightIsEqualTo(20.dp)
     }
 
     @Test
@@ -201,12 +167,8 @@
             intrinsicHeight = 20.dp
         }
 
-        rule.runOnIdle {
-            assertEquals(1, measures)
-        }
-        rule.onNodeWithTag("parent")
-            .assertWidthIsEqualTo(20.dp)
-            .assertHeightIsEqualTo(20.dp)
+        rule.runOnIdle { assertEquals(1, measures) }
+        rule.onNodeWithTag("parent").assertWidthIsEqualTo(20.dp).assertHeightIsEqualTo(20.dp)
     }
 
     @Test
@@ -225,9 +187,7 @@
                         modifier = Modifier.testTag("parent2"),
                         onMeasure = { ++measures2 }
                     ) {
-                        Box {
-                            LayoutWithIntrinsics(intrinsicWidth, intrinsicHeight)
-                        }
+                        Box { LayoutWithIntrinsics(intrinsicWidth, intrinsicHeight) }
                     }
                 }
             }
@@ -259,9 +219,7 @@
             measurable.maxIntrinsicWidth(constraints.maxHeight)
             measurable.maxIntrinsicHeight(constraints.maxWidth)
             val placeable = measurable.measure(constraints)
-            layout(constraints.maxWidth, constraints.maxHeight) {
-                placeable.place(0, 0)
-            }
+            layout(constraints.maxWidth, constraints.maxHeight) { placeable.place(0, 0) }
         }
 
         rule.setContent {
@@ -286,9 +244,7 @@
             intrinsicHeight = 20.dp
         }
 
-        rule.runOnIdle {
-            assertEquals(2, measures)
-        }
+        rule.runOnIdle { assertEquals(2, measures) }
     }
 
     @Test
@@ -313,13 +269,9 @@
             intrinsicHeight = 20.dp
         }
 
-        rule.runOnIdle {
-            assertEquals(1, parentMeasures)
-        }
+        rule.runOnIdle { assertEquals(1, parentMeasures) }
 
-        rule.onNodeWithTag("box")
-            .assertWidthIsEqualTo(30.dp)
-            .assertHeightIsEqualTo(20.dp)
+        rule.onNodeWithTag("box").assertWidthIsEqualTo(30.dp).assertHeightIsEqualTo(20.dp)
     }
 
     @Test
@@ -344,13 +296,9 @@
             intrinsicHeight = 20.dp
         }
 
-        rule.runOnIdle {
-            assertEquals(1, parentMeasures)
-        }
+        rule.runOnIdle { assertEquals(1, parentMeasures) }
 
-        rule.onNodeWithTag("box")
-            .assertWidthIsEqualTo(30.dp)
-            .assertHeightIsEqualTo(20.dp)
+        rule.onNodeWithTag("box").assertWidthIsEqualTo(30.dp).assertHeightIsEqualTo(20.dp)
     }
 
     @Test
@@ -364,18 +312,19 @@
                 content = {
                     var rect by remember { mutableStateOf(Rect.Zero) }
                     Box(
-                        Modifier
-                            .testTag("box")
+                        Modifier.testTag("box")
                             .layout { measurable, constraints ->
                                 val placeable = measurable.measure(constraints)
-                                rect = Rect(
-                                    offsetPx, offsetPx,
-                                    placeable.width - offsetPx, placeable.height - offsetPx
-                                )
-                                layout(placeable.width, placeable.height) {
-                                    placeable.place(0, 0)
-                                }
-                            }.drawBehind {
+                                rect =
+                                    Rect(
+                                        offsetPx,
+                                        offsetPx,
+                                        placeable.width - offsetPx,
+                                        placeable.height - offsetPx
+                                    )
+                                layout(placeable.width, placeable.height) { placeable.place(0, 0) }
+                            }
+                            .drawBehind {
                                 drawRect(Color.Black)
                                 drawRect(Color.Red, topLeft = rect.topLeft, rect.size)
                             }
@@ -386,17 +335,14 @@
                 val measurable = measurables.first()
                 measurable.minIntrinsicHeight(50)
                 val placeable = measurable.measure(Constraints.fixed(100, 100))
-                layout(100, 100) {
-                    placeable.place(0, 0)
-                }
+                layout(100, 100) { placeable.place(0, 0) }
             }
         }
 
-        rule.runOnIdle {
-            remeasureState.value = Unit
-        }
+        rule.runOnIdle { remeasureState.value = Unit }
 
-        rule.onNodeWithTag("box")
+        rule
+            .onNodeWithTag("box")
             .captureToImage()
             .assertShape(
                 density = rule.density,
@@ -412,26 +358,14 @@
         var childModifier by mutableStateOf(Modifier as Modifier)
 
         rule.setContent {
-            LayoutUsingIntrinsics() {
-                Box(
-                    Modifier
-                        .testTag("child")
-                        .then(childModifier)
-                )
-            }
+            LayoutUsingIntrinsics() { Box(Modifier.testTag("child").then(childModifier)) }
         }
 
-        rule.onNodeWithTag("child")
-            .assertWidthIsEqualTo(0.dp)
-            .assertHeightIsEqualTo(0.dp)
+        rule.onNodeWithTag("child").assertWidthIsEqualTo(0.dp).assertHeightIsEqualTo(0.dp)
 
-        rule.runOnIdle {
-            childModifier = Modifier.withIntrinsics(30.dp, 20.dp)
-        }
+        rule.runOnIdle { childModifier = Modifier.withIntrinsics(30.dp, 20.dp) }
 
-        rule.onNodeWithTag("child")
-            .assertWidthIsEqualTo(30.dp)
-            .assertHeightIsEqualTo(20.dp)
+        rule.onNodeWithTag("child").assertWidthIsEqualTo(30.dp).assertHeightIsEqualTo(20.dp)
     }
 
     @Composable
@@ -445,25 +379,26 @@
         Layout(
             content = content,
             modifier = modifier,
-            measurePolicy = object : MeasurePolicy {
-                override fun MeasureScope.measure(
-                    measurables: List<Measurable>,
-                    constraints: Constraints
-                ): MeasureResult {
-                    onMeasure()
-                    return layout(constraints.minWidth, constraints.minHeight) {}
+            measurePolicy =
+                object : MeasurePolicy {
+                    override fun MeasureScope.measure(
+                        measurables: List<Measurable>,
+                        constraints: Constraints
+                    ): MeasureResult {
+                        onMeasure()
+                        return layout(constraints.minWidth, constraints.minHeight) {}
+                    }
+
+                    override fun IntrinsicMeasureScope.maxIntrinsicWidth(
+                        measurables: List<IntrinsicMeasurable>,
+                        height: Int
+                    ): Int = width.roundToPx()
+
+                    override fun IntrinsicMeasureScope.maxIntrinsicHeight(
+                        measurables: List<IntrinsicMeasurable>,
+                        width: Int
+                    ): Int = height.roundToPx()
                 }
-
-                override fun IntrinsicMeasureScope.maxIntrinsicWidth(
-                    measurables: List<IntrinsicMeasurable>,
-                    height: Int
-                ): Int = width.roundToPx()
-
-                override fun IntrinsicMeasureScope.maxIntrinsicHeight(
-                    measurables: List<IntrinsicMeasurable>,
-                    width: Int
-                ): Int = height.roundToPx()
-            }
         )
     }
 
@@ -482,17 +417,17 @@
                 ): MeasureResult {
                     require(measurables.size == 1)
                     onMeasure()
-                    val childConstraints = if (useIntrinsics()) {
-                        val width = measurables.first().maxIntrinsicWidth(constraints.maxHeight)
-                        val height = measurables.first().maxIntrinsicHeight(constraints.maxWidth)
-                        Constraints.fixed(width, height)
-                    } else {
-                        constraints
-                    }
+                    val childConstraints =
+                        if (useIntrinsics()) {
+                            val width = measurables.first().maxIntrinsicWidth(constraints.maxHeight)
+                            val height =
+                                measurables.first().maxIntrinsicHeight(constraints.maxWidth)
+                            Constraints.fixed(width, height)
+                        } else {
+                            constraints
+                        }
                     val placeable = measurables.first().measure(childConstraints)
-                    return layout(placeable.width, placeable.height) {
-                        placeable.place(0, 0)
-                    }
+                    return layout(placeable.width, placeable.height) { placeable.place(0, 0) }
                 }
 
                 override fun IntrinsicMeasureScope.minIntrinsicWidth(
@@ -526,61 +461,60 @@
         content: @Composable () -> Unit
     ) = LayoutMaybeUsingIntrinsics({ true }, modifier, onMeasure, content)
 
-    private val ModifierUsingIntrinsics = object : LayoutModifier {
-        override fun MeasureScope.measure(
-            measurable: Measurable,
-            constraints: Constraints
-        ): MeasureResult {
-            val width = measurable.maxIntrinsicWidth(constraints.maxHeight)
-            val height = measurable.maxIntrinsicHeight(constraints.maxWidth)
-            val placeable = measurable.measure(Constraints.fixed(width, height))
-            return layout(placeable.width, placeable.height) {
-                placeable.place(0, 0)
-            }
-        }
-
-        override fun IntrinsicMeasureScope.minIntrinsicWidth(
-            measurable: IntrinsicMeasurable,
-            height: Int
-        ) = measurable.minIntrinsicWidth(height)
-
-        override fun IntrinsicMeasureScope.minIntrinsicHeight(
-            measurable: IntrinsicMeasurable,
-            width: Int
-        ) = measurable.minIntrinsicHeight(width)
-
-        override fun IntrinsicMeasureScope.maxIntrinsicWidth(
-            measurable: IntrinsicMeasurable,
-            height: Int
-        ) = measurable.maxIntrinsicWidth(height)
-
-        override fun IntrinsicMeasureScope.maxIntrinsicHeight(
-            measurable: IntrinsicMeasurable,
-            width: Int
-        ) = measurable.maxIntrinsicHeight(width)
-    }
-
-    private fun Modifier.withIntrinsics(width: Dp, height: Dp): Modifier {
-        return this.then(object : LayoutModifier {
+    private val ModifierUsingIntrinsics =
+        object : LayoutModifier {
             override fun MeasureScope.measure(
                 measurable: Measurable,
                 constraints: Constraints
             ): MeasureResult {
-                val placeable = measurable.measure(constraints)
-                return layout(placeable.width, placeable.height) {
-                    placeable.place(0, 0)
-                }
+                val width = measurable.maxIntrinsicWidth(constraints.maxHeight)
+                val height = measurable.maxIntrinsicHeight(constraints.maxWidth)
+                val placeable = measurable.measure(Constraints.fixed(width, height))
+                return layout(placeable.width, placeable.height) { placeable.place(0, 0) }
             }
 
+            override fun IntrinsicMeasureScope.minIntrinsicWidth(
+                measurable: IntrinsicMeasurable,
+                height: Int
+            ) = measurable.minIntrinsicWidth(height)
+
+            override fun IntrinsicMeasureScope.minIntrinsicHeight(
+                measurable: IntrinsicMeasurable,
+                width: Int
+            ) = measurable.minIntrinsicHeight(width)
+
             override fun IntrinsicMeasureScope.maxIntrinsicWidth(
                 measurable: IntrinsicMeasurable,
                 height: Int
-            ): Int = width.roundToPx()
+            ) = measurable.maxIntrinsicWidth(height)
 
             override fun IntrinsicMeasureScope.maxIntrinsicHeight(
                 measurable: IntrinsicMeasurable,
                 width: Int
-            ): Int = height.roundToPx()
-        })
+            ) = measurable.maxIntrinsicHeight(width)
+        }
+
+    private fun Modifier.withIntrinsics(width: Dp, height: Dp): Modifier {
+        return this.then(
+            object : LayoutModifier {
+                override fun MeasureScope.measure(
+                    measurable: Measurable,
+                    constraints: Constraints
+                ): MeasureResult {
+                    val placeable = measurable.measure(constraints)
+                    return layout(placeable.width, placeable.height) { placeable.place(0, 0) }
+                }
+
+                override fun IntrinsicMeasureScope.maxIntrinsicWidth(
+                    measurable: IntrinsicMeasurable,
+                    height: Int
+                ): Int = width.roundToPx()
+
+                override fun IntrinsicMeasureScope.maxIntrinsicHeight(
+                    measurable: IntrinsicMeasurable,
+                    width: Int
+                ): Int = height.roundToPx()
+            }
+        )
     }
 }
diff --git a/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/layout/RemeasurementModifierTest.kt b/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/layout/RemeasurementModifierTest.kt
index edaac82..5c72782 100644
--- a/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/layout/RemeasurementModifierTest.kt
+++ b/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/layout/RemeasurementModifierTest.kt
@@ -31,11 +31,12 @@
         val root = root {
             add(
                 node {
-                    modifier = object : RemeasurementModifier {
-                        override fun onRemeasurementAvailable(remeasurement: Remeasurement) {
-                            remeasurementObj = remeasurement
+                    modifier =
+                        object : RemeasurementModifier {
+                            override fun onRemeasurementAvailable(remeasurement: Remeasurement) {
+                                remeasurementObj = remeasurement
+                            }
                         }
-                    }
                 }
             )
         }
@@ -47,9 +48,7 @@
         assertMeasuredAndLaidOut(root.first)
         // but still remeasured
         assertRemeasured(root.first) {
-            assertRelaidOut(root.first) {
-                remeasurementObj!!.forceRemeasure()
-            }
+            assertRelaidOut(root.first) { remeasurementObj!!.forceRemeasure() }
         }
     }
 
@@ -59,11 +58,12 @@
         val root = root {
             add(
                 node {
-                    modifier = object : RemeasurementModifier {
-                        override fun onRemeasurementAvailable(remeasurement: Remeasurement) {
-                            remeasurementObj = remeasurement
+                    modifier =
+                        object : RemeasurementModifier {
+                            override fun onRemeasurementAvailable(remeasurement: Remeasurement) {
+                                remeasurementObj = remeasurement
+                            }
                         }
-                    }
                 }
             )
             add(node())
@@ -74,9 +74,7 @@
         assertThat(remeasurementObj).isNotNull()
         root.second.requestRemeasure()
         assertNotRemeasured(root.second) {
-            assertNotRelaidOut(root.second) {
-                remeasurementObj!!.forceRemeasure()
-            }
+            assertNotRelaidOut(root.second) { remeasurementObj!!.forceRemeasure() }
         }
     }
 }
diff --git a/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/layout/ResizingComposeViewTest.kt b/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/layout/ResizingComposeViewTest.kt
index 8da28f4..d93fa9c 100644
--- a/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/layout/ResizingComposeViewTest.kt
+++ b/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/layout/ResizingComposeViewTest.kt
@@ -55,9 +55,7 @@
 
     @Suppress("DEPRECATION")
     @get:Rule
-    val rule = androidx.test.rule.ActivityTestRule(
-        TestActivity::class.java
-    )
+    val rule = androidx.test.rule.ActivityTestRule(TestActivity::class.java)
 
     @Test
     fun whenParentIsMeasuringTwiceWithDifferentConstraints() {
@@ -76,15 +74,9 @@
             )
             linearLayout.addView(
                 View(rule.activity),
-                LinearLayout.LayoutParams(
-                    ViewGroup.LayoutParams.MATCH_PARENT,
-                    0,
-                    10000f
-                )
+                LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, 0, 10000f)
             )
-            composeView.setContent {
-                ResizingChild(layoutHeight = { height })
-            }
+            composeView.setContent { ResizingChild(layoutHeight = { height }) }
         }
 
         awaitDrawAndAssertSizes()
@@ -101,12 +93,8 @@
         var height by mutableStateOf(10)
 
         rule.runOnUiThread {
-            rule.activity.setContentView(
-                composeView, WrapContentLayoutParams
-            )
-            composeView.setContent {
-                ResizingChild(layoutHeight = { height })
-            }
+            rule.activity.setContentView(composeView, WrapContentLayoutParams)
+            composeView.setContent { ResizingChild(layoutHeight = { height }) }
         }
 
         awaitDrawAndAssertSizes()
@@ -155,23 +143,20 @@
             rule.activity.setContentView(parent, WrapContentLayoutParams)
             composeView.setContent {
                 Layout(
-                    modifier = Modifier.layout { measurable, _ ->
-                        // this modifier sets a fixed size on a parent similarly to how
-                        // Modifier.fillMaxSize() or Modifier.size(foo) would do
-                        val placeable =
-                            measurable.measure(Constraints.fixed(parentSize, parentSize))
-                        layout(placeable.width, placeable.height) {
-                            placeable.place(0, 0)
-                        }
-                    },
+                    modifier =
+                        Modifier.layout { measurable, _ ->
+                            // this modifier sets a fixed size on a parent similarly to how
+                            // Modifier.fillMaxSize() or Modifier.size(foo) would do
+                            val placeable =
+                                measurable.measure(Constraints.fixed(parentSize, parentSize))
+                            layout(placeable.width, placeable.height) { placeable.place(0, 0) }
+                        },
                     content = {
                         ResizingChild(layoutHeight = { childHeight }, viewHeight = { parentSize })
                     }
                 ) { measurables, constraints ->
                     val placeable = measurables[0].measure(constraints)
-                    layout(placeable.width, placeable.height) {
-                        placeable.place(0, 0)
-                    }
+                    layout(placeable.width, placeable.height) { placeable.place(0, 0) }
                 }
             }
         }
@@ -234,22 +219,19 @@
             rule.activity.setContentView(parent, WrapContentLayoutParams)
             composeView.setContent {
                 Layout(
-                    modifier = Modifier.layout { measurable, _ ->
-                        val intrinsicsSize = measurable.minIntrinsicHeight(Int.MAX_VALUE)
-                        val placeable =
-                            measurable.measure(Constraints.fixed(intrinsicsSize, intrinsicsSize))
-                        layout(placeable.width, placeable.height) {
-                            placeable.place(0, 0)
-                        }
-                    },
-                    content = {
-                        IntrinsicsChild(intrinsicsHeight = { intrinsicsHeight })
-                    }
+                    modifier =
+                        Modifier.layout { measurable, _ ->
+                            val intrinsicsSize = measurable.minIntrinsicHeight(Int.MAX_VALUE)
+                            val placeable =
+                                measurable.measure(
+                                    Constraints.fixed(intrinsicsSize, intrinsicsSize)
+                                )
+                            layout(placeable.width, placeable.height) { placeable.place(0, 0) }
+                        },
+                    content = { IntrinsicsChild(intrinsicsHeight = { intrinsicsHeight }) }
                 ) { measurables, constraints ->
                     val placeable = measurables[0].measure(constraints)
-                    layout(placeable.width, placeable.height) {
-                        placeable.place(0, 0)
-                    }
+                    layout(placeable.width, placeable.height) { placeable.place(0, 0) }
                 }
             }
         }
@@ -322,7 +304,7 @@
         // size assertion is done inside Modifier.drawBehind() which calls countDown() on the latch
 
         // await for the ui thread to be idle
-        rule.runOnUiThread { }
+        rule.runOnUiThread {}
     }
 
     @Composable
@@ -336,10 +318,12 @@
             modifier.drawBehind {
                 val expectedLayoutHeight = Snapshot.withoutReadObservation { layoutHeight() }
                 assertWithMessage("Layout size is wrong")
-                    .that(size.height.roundToInt()).isEqualTo(expectedLayoutHeight)
+                    .that(size.height.roundToInt())
+                    .isEqualTo(expectedLayoutHeight)
                 val expectedViewHeight = Snapshot.withoutReadObservation { viewHeight() }
                 assertWithMessage("ComposeView size is wrong")
-                    .that(composeView.measuredHeight).isEqualTo(expectedViewHeight)
+                    .that(composeView.measuredHeight)
+                    .isEqualTo(expectedViewHeight)
                 drawLatch.countDown()
             }
         ) { _, constraints ->
@@ -348,17 +332,17 @@
     }
 
     @Composable
-    private fun IntrinsicsChild(
-        intrinsicsHeight: () -> Int
-    ) {
+    private fun IntrinsicsChild(intrinsicsHeight: () -> Int) {
         Layout(
             {},
             Modifier.drawBehind {
                 val expectedHeight = Snapshot.withoutReadObservation { intrinsicsHeight() }
                 assertWithMessage("Layout size is wrong")
-                    .that(size.height.roundToInt()).isEqualTo(expectedHeight)
+                    .that(size.height.roundToInt())
+                    .isEqualTo(expectedHeight)
                 assertWithMessage("ComposeView size is wrong")
-                    .that(composeView.measuredHeight).isEqualTo(expectedHeight)
+                    .that(composeView.measuredHeight)
+                    .isEqualTo(expectedHeight)
                 drawLatch.countDown()
             },
             object : MeasurePolicy {
@@ -388,30 +372,30 @@
     }
 }
 
-private val WrapContentLayoutParams = ViewGroup.LayoutParams(
-    ViewGroup.LayoutParams.WRAP_CONTENT,
-    ViewGroup.LayoutParams.WRAP_CONTENT
-)
+private val WrapContentLayoutParams =
+    ViewGroup.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT)
 
-private class RemeasurementElement(
-    private val onRemeasurementAvailable: (Remeasurement) -> Unit
-) : ModifierNodeElement<RemeasurementModifierNode>() {
+private class RemeasurementElement(private val onRemeasurementAvailable: (Remeasurement) -> Unit) :
+    ModifierNodeElement<RemeasurementModifierNode>() {
     override fun create() = RemeasurementModifierNode(onRemeasurementAvailable)
+
     override fun update(node: RemeasurementModifierNode) {
         node.onRemeasurementAvailable = onRemeasurementAvailable
     }
+
     override fun hashCode(): Int = 242
+
     override fun equals(other: Any?) = other === this
 }
 
-private class RemeasurementModifierNode(
-    onRemeasurementAvailable: (Remeasurement) -> Unit
-) : Modifier.Node() {
+private class RemeasurementModifierNode(onRemeasurementAvailable: (Remeasurement) -> Unit) :
+    Modifier.Node() {
     var onRemeasurementAvailable: (Remeasurement) -> Unit = onRemeasurementAvailable
         set(value) {
             field = value
             value(requireLayoutNode())
         }
+
     override fun onAttach() {
         onRemeasurementAvailable(requireLayoutNode())
     }
diff --git a/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/layout/RootNodeLayoutTest.kt b/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/layout/RootNodeLayoutTest.kt
index 316e180..60d3cef 100644
--- a/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/layout/RootNodeLayoutTest.kt
+++ b/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/layout/RootNodeLayoutTest.kt
@@ -114,12 +114,7 @@
             )
             activity.setContentView(parent)
             child.setContent {
-                Layout(
-                    {},
-                    Modifier.onGloballyPositioned {
-                        latch.countDown()
-                    }
-                ) { _, _ ->
+                Layout({}, Modifier.onGloballyPositioned { latch.countDown() }) { _, _ ->
                     layout(10, 15) {}
                 }
             }
@@ -145,12 +140,8 @@
             )
             activity.setContentView(parent)
             child.setContent {
-                Layout(
-                    {},
-                    Modifier.fillMaxSize().onGloballyPositioned {
-                        latch.countDown()
-                    }
-                ) { _, _ ->
+                Layout({}, Modifier.fillMaxSize().onGloballyPositioned { latch.countDown() }) { _, _
+                    ->
                     layout(10, 15) {}
                 }
             }
diff --git a/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/layout/RtlLayoutTest.kt b/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/layout/RtlLayoutTest.kt
index 37fe213..914eff1 100644
--- a/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/layout/RtlLayoutTest.kt
+++ b/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/layout/RtlLayoutTest.kt
@@ -61,9 +61,7 @@
     @Suppress("DEPRECATION")
     @get:Rule
     val activityTestRule =
-        androidx.test.rule.ActivityTestRule<TestActivity>(
-            TestActivity::class.java
-        )
+        androidx.test.rule.ActivityTestRule<TestActivity>(TestActivity::class.java)
     private lateinit var activity: TestActivity
     internal lateinit var density: Density
     internal lateinit var countDownLatch: CountDownLatch
@@ -80,99 +78,59 @@
     }
 
     @Test
-    fun customLayout_absolutePositioning() = with(density) {
-        activityTestRule.runOnUiThreadIR {
-            activity.setContent {
-                CustomLayout(true, LayoutDirection.Ltr)
+    fun customLayout_absolutePositioning() =
+        with(density) {
+            activityTestRule.runOnUiThreadIR {
+                activity.setContent { CustomLayout(true, LayoutDirection.Ltr) }
             }
-        }
 
-        countDownLatch.await(1, TimeUnit.SECONDS)
-        assertEquals(Offset(0f, 0f), position[0].value)
-        assertEquals(Offset(size.toFloat(), size.toFloat()), position[1].value)
-        assertEquals(
-            Offset(
-                (size * 2).toFloat(),
-                (size * 2).toFloat()
-            ),
-            position[2].value
-        )
-    }
+            countDownLatch.await(1, TimeUnit.SECONDS)
+            assertEquals(Offset(0f, 0f), position[0].value)
+            assertEquals(Offset(size.toFloat(), size.toFloat()), position[1].value)
+            assertEquals(Offset((size * 2).toFloat(), (size * 2).toFloat()), position[2].value)
+        }
 
     @Test
-    fun customLayout_absolutePositioning_rtl() = with(density) {
-        activityTestRule.runOnUiThreadIR {
-            activity.setContent {
-                CustomLayout(true, LayoutDirection.Rtl)
+    fun customLayout_absolutePositioning_rtl() =
+        with(density) {
+            activityTestRule.runOnUiThreadIR {
+                activity.setContent { CustomLayout(true, LayoutDirection.Rtl) }
             }
-        }
 
-        countDownLatch.await(1, TimeUnit.SECONDS)
-        assertEquals(
-            Offset(0f, 0f),
-            position[0].value
-        )
-        assertEquals(
-            Offset(
-                size.toFloat(),
-                size.toFloat()
-            ),
-            position[1].value
-        )
-        assertEquals(
-            Offset(
-                (size * 2).toFloat(),
-                (size * 2).toFloat()
-            ),
-            position[2].value
-        )
-    }
+            countDownLatch.await(1, TimeUnit.SECONDS)
+            assertEquals(Offset(0f, 0f), position[0].value)
+            assertEquals(Offset(size.toFloat(), size.toFloat()), position[1].value)
+            assertEquals(Offset((size * 2).toFloat(), (size * 2).toFloat()), position[2].value)
+        }
 
     @Test
-    fun customLayout_positioning() = with(density) {
-        activityTestRule.runOnUiThreadIR {
-            activity.setContent {
-                CustomLayout(false, LayoutDirection.Ltr)
+    fun customLayout_positioning() =
+        with(density) {
+            activityTestRule.runOnUiThreadIR {
+                activity.setContent { CustomLayout(false, LayoutDirection.Ltr) }
             }
-        }
 
-        countDownLatch.await(1, TimeUnit.SECONDS)
-        assertEquals(Offset(0f, 0f), position[0].value)
-        assertEquals(Offset(size.toFloat(), size.toFloat()), position[1].value)
-        assertEquals(
-            Offset(
-                (size * 2).toFloat(),
-                (size * 2).toFloat()
-            ),
-            position[2].value
-        )
-    }
+            countDownLatch.await(1, TimeUnit.SECONDS)
+            assertEquals(Offset(0f, 0f), position[0].value)
+            assertEquals(Offset(size.toFloat(), size.toFloat()), position[1].value)
+            assertEquals(Offset((size * 2).toFloat(), (size * 2).toFloat()), position[2].value)
+        }
 
     @Test
-    fun customLayout_positioning_rtl() = with(density) {
-        activityTestRule.runOnUiThreadIR {
-            activity.setContent {
-                CustomLayout(false, LayoutDirection.Rtl)
+    fun customLayout_positioning_rtl() =
+        with(density) {
+            activityTestRule.runOnUiThreadIR {
+                activity.setContent { CustomLayout(false, LayoutDirection.Rtl) }
             }
+
+            countDownLatch.await(1, TimeUnit.SECONDS)
+
+            countDownLatch.await(1, TimeUnit.SECONDS)
+            assertEquals(Offset((size * 2).toFloat(), 0f), position[0].value)
+            assertEquals(Offset(size.toFloat(), size.toFloat()), position[1].value)
+            assertEquals(Offset(0f, (size * 2).toFloat()), position[2].value)
         }
 
-        countDownLatch.await(1, TimeUnit.SECONDS)
-
-        countDownLatch.await(1, TimeUnit.SECONDS)
-        assertEquals(
-            Offset(
-                (size * 2).toFloat(),
-                0f
-            ),
-            position[0].value
-        )
-        assertEquals(
-            Offset(size.toFloat(), size.toFloat()),
-            position[1].value
-        )
-        assertEquals(Offset(0f, (size * 2).toFloat()), position[2].value)
-    }
-
     @Test
     fun customLayout_updatingDirectionCausesRemeasure() {
         val direction = mutableStateOf(LayoutDirection.Rtl)
@@ -181,13 +139,14 @@
 
         activityTestRule.runOnUiThread {
             activity.setContent {
-                val children = @Composable {
-                    Layout({}) { _, _ ->
-                        actualDirection = layoutDirection
-                        latch.countDown()
-                        layout(100, 100) {}
+                val children =
+                    @Composable {
+                        Layout({}) { _, _ ->
+                            actualDirection = layoutDirection
+                            latch.countDown()
+                            layout(100, 100) {}
+                        }
                     }
-                }
                 CompositionLocalProvider(LocalLayoutDirection provides direction.value) {
                     Layout(children) { measurables, constraints ->
                         layout(100, 100) {
@@ -206,6 +165,7 @@
         assertTrue(latch.await(1, TimeUnit.SECONDS))
         assertEquals(LayoutDirection.Ltr, actualDirection)
     }
+
     @Test
     fun testModifiedLayoutDirection_inMeasureScope() {
         val latch = CountDownLatch(1)
@@ -235,36 +195,37 @@
         activityTestRule.runOnUiThread {
             activity.setContent {
                 CompositionLocalProvider(LocalLayoutDirection provides LayoutDirection.Rtl) {
-                    val measurePolicy = object : MeasurePolicy {
-                        override fun MeasureScope.measure(
-                            measurables: List<Measurable>,
-                            constraints: Constraints
-                        ) = layout(0, 0) {}
+                    val measurePolicy =
+                        object : MeasurePolicy {
+                            override fun MeasureScope.measure(
+                                measurables: List<Measurable>,
+                                constraints: Constraints
+                            ) = layout(0, 0) {}
 
-                        override fun IntrinsicMeasureScope.minIntrinsicWidth(
-                            measurables: List<IntrinsicMeasurable>,
-                            height: Int
-                        ) = 0
+                            override fun IntrinsicMeasureScope.minIntrinsicWidth(
+                                measurables: List<IntrinsicMeasurable>,
+                                height: Int
+                            ) = 0
 
-                        override fun IntrinsicMeasureScope.minIntrinsicHeight(
-                            measurables: List<IntrinsicMeasurable>,
-                            width: Int
-                        ) = 0
+                            override fun IntrinsicMeasureScope.minIntrinsicHeight(
+                                measurables: List<IntrinsicMeasurable>,
+                                width: Int
+                            ) = 0
 
-                        override fun IntrinsicMeasureScope.maxIntrinsicWidth(
-                            measurables: List<IntrinsicMeasurable>,
-                            height: Int
-                        ): Int {
-                            resultLayoutDirection = this.layoutDirection
-                            latch.countDown()
-                            return 0
+                            override fun IntrinsicMeasureScope.maxIntrinsicWidth(
+                                measurables: List<IntrinsicMeasurable>,
+                                height: Int
+                            ): Int {
+                                resultLayoutDirection = this.layoutDirection
+                                latch.countDown()
+                                return 0
+                            }
+
+                            override fun IntrinsicMeasureScope.maxIntrinsicHeight(
+                                measurables: List<IntrinsicMeasurable>,
+                                width: Int
+                            ) = 0
                         }
-
-                        override fun IntrinsicMeasureScope.maxIntrinsicHeight(
-                            measurables: List<IntrinsicMeasurable>,
-                            width: Int
-                        ) = 0
-                    }
                     Layout(
                         content = {},
                         modifier = Modifier.width(IntrinsicSize.Max),
@@ -348,24 +309,24 @@
                 CompositionLocalProvider(LocalLayoutDirection provides LayoutDirection.Rtl) {
                     Row(modifier = Modifier.width(rowWidth)) {
                         Box(
-                            modifier = Modifier
-                                .onGloballyPositioned {
-                                    outerLC = it
-                                    latch.countDown()
-                                }
-                                .size(outerBoxWidth)
-                                .background(color = Color.Red)
-                                .padding(horizontal = padding)
-                                .then(MinimumTouchTargetModifier())
-                        ) {
-                            Box(
-                                modifier = Modifier
-                                    .onGloballyPositioned {
-                                        innerLC = it
+                            modifier =
+                                Modifier.onGloballyPositioned {
+                                        outerLC = it
                                         latch.countDown()
                                     }
-                                    .size(30.dp)
-                                    .background(color = Color.Gray)
+                                    .size(outerBoxWidth)
+                                    .background(color = Color.Red)
+                                    .padding(horizontal = padding)
+                                    .then(MinimumTouchTargetModifier())
+                        ) {
+                            Box(
+                                modifier =
+                                    Modifier.onGloballyPositioned {
+                                            innerLC = it
+                                            latch.countDown()
+                                        }
+                                        .size(30.dp)
+                                        .background(color = Color.Gray)
                             )
                         }
                     }
@@ -374,12 +335,8 @@
         }
 
         assertTrue(latch.await(1, TimeUnit.SECONDS))
-        val (innerOffset, innerWidth) = with(innerLC!!) {
-            localToWindow(Offset.Zero) to size.width
-        }
-        val (outerOffset, outerWidth) = with(outerLC!!) {
-            localToWindow(Offset.Zero) to size.width
-        }
+        val (innerOffset, innerWidth) = with(innerLC!!) { localToWindow(Offset.Zero) to size.width }
+        val (outerOffset, outerWidth) = with(outerLC!!) { localToWindow(Offset.Zero) to size.width }
         assertTrue(innerWidth < outerWidth)
         assertTrue(innerOffset.x > outerOffset.x)
         assertTrue(innerWidth + innerOffset.x < outerWidth + outerOffset.x)
@@ -396,10 +353,7 @@
     }
 
     @Composable
-    private fun CustomLayout(
-        absolutePositioning: Boolean,
-        testLayoutDirection: LayoutDirection
-    ) {
+    private fun CustomLayout(absolutePositioning: Boolean, testLayoutDirection: LayoutDirection) {
         CompositionLocalProvider(LocalLayoutDirection provides testLayoutDirection) {
             Layout(
                 content = {
diff --git a/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/layout/RulerTest.kt b/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/layout/RulerTest.kt
index f623757..6083ac6 100644
--- a/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/layout/RulerTest.kt
+++ b/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/layout/RulerTest.kt
@@ -57,8 +57,7 @@
 @MediumTest
 @RunWith(AndroidJUnit4::class)
 class RulerTest {
-    @get:Rule
-    val rule = createAndroidComposeRule<ComponentActivity>()
+    @get:Rule val rule = createAndroidComposeRule<ComponentActivity>()
 
     private val verticalRuler = VerticalRuler()
     private val horizontalRuler = HorizontalRuler()
@@ -67,12 +66,12 @@
     fun valueWithNoProvider() {
         val keylineValues = mutableFloatListOf()
         rule.setContent {
-            Box(Modifier.layout { measurable, constraints ->
-                val p = measurable.measure(constraints)
-                layout(p.width, p.height) {
-                    keylineValues += verticalRuler.current(Float.NaN)
+            Box(
+                Modifier.layout { measurable, constraints ->
+                    val p = measurable.measure(constraints)
+                    layout(p.width, p.height) { keylineValues += verticalRuler.current(Float.NaN) }
                 }
-            })
+            )
         }
         rule.waitForIdle()
         assertThat(keylineValues.size).isEqualTo(1)
@@ -83,12 +82,12 @@
     fun valueWithNoProviderDefaultValue() {
         val keylineValues = mutableFloatListOf()
         rule.setContent {
-            Box(Modifier.layout { measurable, constraints ->
-                val p = measurable.measure(constraints)
-                layout(p.width, p.height) {
-                    keylineValues += verticalRuler.current(100f)
+            Box(
+                Modifier.layout { measurable, constraints ->
+                    val p = measurable.measure(constraints)
+                    layout(p.width, p.height) { keylineValues += verticalRuler.current(100f) }
                 }
-            })
+            )
         }
         rule.waitForIdle()
         assertThat(keylineValues.size).isEqualTo(1)
@@ -102,20 +101,22 @@
         rule.setContent {
             with(LocalDensity.current) {
                 Box(
-                    Modifier
-                        .size(100.toDp(), 150.toDp())
-                        .layout { measurable, constraints ->
-                            val p = measurable.measure(constraints)
-                            layout(p.width, p.height, rulers = {
+                    Modifier.size(100.toDp(), 150.toDp()).layout { measurable, constraints ->
+                        val p = measurable.measure(constraints)
+                        layout(
+                            p.width,
+                            p.height,
+                            rulers = {
                                 verticalRuler.provides(35f)
                                 horizontalRuler.provides(53f)
-                            }) {
-                                p.place(0, 0)
                             }
-                        }) {
+                        ) {
+                            p.place(0, 0)
+                        }
+                    }
+                ) {
                     Box(
-                        Modifier
-                            .offset(x = 25.toDp(), y = 50.toDp())
+                        Modifier.offset(x = 25.toDp(), y = 50.toDp())
                             .requiredSize(50.toDp())
                             .background(Color.Blue)
                             .layout { measurable, constraints ->
@@ -125,7 +126,8 @@
                                     verticalKeylineValues += verticalRuler.current(Float.NaN)
                                     p.place(0, 0)
                                 }
-                            })
+                            }
+                    )
                 }
             }
         }
@@ -143,21 +145,23 @@
         rule.setContent {
             with(LocalDensity.current) {
                 Row(
-                    Modifier
-                        .size(100.toDp(), 150.toDp())
-                        .layout { measurable, constraints ->
-                            val p = measurable.measure(constraints)
-                            layout(p.width, p.height, rulers = {
+                    Modifier.size(100.toDp(), 150.toDp()).layout { measurable, constraints ->
+                        val p = measurable.measure(constraints)
+                        layout(
+                            p.width,
+                            p.height,
+                            rulers = {
                                 verticalRuler.provides(35f)
                                 horizontalRuler.provides(53f)
-                            }) {
-                                p.place(0, 0)
                             }
-                        }) {
+                        ) {
+                            p.place(0, 0)
+                        }
+                    }
+                ) {
                     Text(
                         "Hello",
-                        Modifier
-                            .alignByBaseline()
+                        Modifier.alignByBaseline()
                             .requiredSize(50.toDp())
                             .background(Color.Blue)
                             .layout { measurable, constraints ->
@@ -189,20 +193,22 @@
         rule.setContent {
             with(LocalDensity.current) {
                 Box(
-                    Modifier
-                        .size(100.toDp(), 150.toDp())
-                        .layout { measurable, constraints ->
-                            val p = measurable.measure(constraints)
-                            layout(p.width, p.height, rulers = {
+                    Modifier.size(100.toDp(), 150.toDp()).layout { measurable, constraints ->
+                        val p = measurable.measure(constraints)
+                        layout(
+                            p.width,
+                            p.height,
+                            rulers = {
                                 verticalRuler.provides(5f)
                                 horizontalRuler.provides(7f)
-                            }) {
-                                p.place(0, 0)
                             }
-                        }) {
+                        ) {
+                            p.place(0, 0)
+                        }
+                    }
+                ) {
                     Box(
-                        Modifier
-                            .offset(x = 25.toDp(), y = 50.toDp())
+                        Modifier.offset(x = 25.toDp(), y = 50.toDp())
                             .requiredSize(50.toDp())
                             .background(Color.Blue)
                             .layout { measurable, constraints ->
@@ -212,7 +218,8 @@
                                     verticalKeylineValues += verticalRuler.current(Float.NaN)
                                     p.place(0, 0)
                                 }
-                            })
+                            }
+                    )
                 }
             }
         }
@@ -230,24 +237,24 @@
             with(LocalDensity.current) {
                 CompositionLocalProvider(LocalLayoutDirection provides LayoutDirection.Rtl) {
                     Box(
-                        Modifier
-                            .size(100.toDp(), 150.toDp())
-                            .layout { measurable, constraints ->
-                                val p = measurable.measure(constraints)
-                                layout(p.width, p.height, rulers = {
-                                    verticalRuler.providesRelative(0f)
-                                }) {
-                                    p.place(0, 0)
-                                }
-                            }) {
+                        Modifier.size(100.toDp(), 150.toDp()).layout { measurable, constraints ->
+                            val p = measurable.measure(constraints)
+                            layout(
+                                p.width,
+                                p.height,
+                                rulers = { verticalRuler.providesRelative(0f) }
+                            ) {
+                                p.place(0, 0)
+                            }
+                        }
+                    ) {
                         // Make sure that the layout direction of the place where the ruler is
                         // defined is used, not the layout direction where it is consumed
                         CompositionLocalProvider(
                             LocalLayoutDirection provides LayoutDirection.Ltr
                         ) {
                             Box(
-                                Modifier
-                                    .align(AbsoluteAlignment.TopLeft)
+                                Modifier.align(AbsoluteAlignment.TopLeft)
                                     .offset(x = 25.toDp(), y = 50.toDp())
                                     .requiredSize(50.toDp())
                                     .background(Color.Blue)
@@ -257,7 +264,8 @@
                                             verticalKeylineValues += verticalRuler.current(0f)
                                             p.place(0, 0)
                                         }
-                                    })
+                                    }
+                            )
                         }
                     }
                 }
@@ -275,24 +283,24 @@
             with(LocalDensity.current) {
                 CompositionLocalProvider(LocalLayoutDirection provides LayoutDirection.Ltr) {
                     Box(
-                        Modifier
-                            .size(100.toDp(), 150.toDp())
-                            .layout { measurable, constraints ->
-                                val p = measurable.measure(constraints)
-                                layout(p.width, p.height, rulers = {
-                                    verticalRuler.providesRelative(0f)
-                                }) {
-                                    p.place(0, 0)
-                                }
-                            }) {
+                        Modifier.size(100.toDp(), 150.toDp()).layout { measurable, constraints ->
+                            val p = measurable.measure(constraints)
+                            layout(
+                                p.width,
+                                p.height,
+                                rulers = { verticalRuler.providesRelative(0f) }
+                            ) {
+                                p.place(0, 0)
+                            }
+                        }
+                    ) {
                         // Make sure that the layout direction of the place where the ruler is
                         // defined is used, not the layout direction where it is consumed
                         CompositionLocalProvider(
                             LocalLayoutDirection provides LayoutDirection.Rtl
                         ) {
                             Box(
-                                Modifier
-                                    .align(AbsoluteAlignment.TopLeft)
+                                Modifier.align(AbsoluteAlignment.TopLeft)
                                     .absoluteOffset(x = 25.toDp(), y = 50.toDp())
                                     .requiredSize(50.toDp())
                                     .background(Color.Blue)
@@ -302,7 +310,8 @@
                                             verticalKeylineValues += verticalRuler.current(0f)
                                             p.place(0, 0)
                                         }
-                                    })
+                                    }
+                            )
                         }
                     }
                 }
@@ -321,24 +330,24 @@
             with(LocalDensity.current) {
                 CompositionLocalProvider(LocalLayoutDirection provides layoutDirection) {
                     Box(
-                        Modifier
-                            .size(100.toDp(), 150.toDp())
-                            .layout { measurable, constraints ->
-                                val p = measurable.measure(constraints)
-                                layout(p.width, p.height, rulers = {
-                                    verticalRuler.providesRelative(0f)
-                                }) {
-                                    p.place(0, 0)
-                                }
-                            }) {
+                        Modifier.size(100.toDp(), 150.toDp()).layout { measurable, constraints ->
+                            val p = measurable.measure(constraints)
+                            layout(
+                                p.width,
+                                p.height,
+                                rulers = { verticalRuler.providesRelative(0f) }
+                            ) {
+                                p.place(0, 0)
+                            }
+                        }
+                    ) {
                         // Make sure that the layout direction of the place where the ruler is
                         // defined is used, not the layout direction where it is consumed
                         CompositionLocalProvider(
                             LocalLayoutDirection provides LayoutDirection.Rtl
                         ) {
                             Box(
-                                Modifier
-                                    .align(AbsoluteAlignment.TopLeft)
+                                Modifier.align(AbsoluteAlignment.TopLeft)
                                     .absoluteOffset(x = 25.toDp(), y = 50.toDp())
                                     .requiredSize(50.toDp())
                                     .background(Color.Blue)
@@ -348,7 +357,8 @@
                                             verticalKeylineValues += verticalRuler.current(0f)
                                             p.place(0, 0)
                                         }
-                                    })
+                                    }
+                            )
                         }
                     }
                 }
@@ -372,20 +382,22 @@
         rule.setContent {
             with(LocalDensity.current) {
                 Box(
-                    Modifier
-                        .size(100.toDp(), 150.toDp())
-                        .layout { measurable, constraints ->
-                            val p = measurable.measure(constraints)
-                            layout(p.width, p.height, rulers = {
+                    Modifier.size(100.toDp(), 150.toDp()).layout { measurable, constraints ->
+                        val p = measurable.measure(constraints)
+                        layout(
+                            p.width,
+                            p.height,
+                            rulers = {
                                 verticalRuler.provides(vertValue)
                                 horizontalRuler.provides(horzValue)
-                            }) {
-                                p.place(0, 0)
                             }
-                        }) {
+                        ) {
+                            p.place(0, 0)
+                        }
+                    }
+                ) {
                     Box(
-                        Modifier
-                            .align(AbsoluteAlignment.TopLeft)
+                        Modifier.align(AbsoluteAlignment.TopLeft)
                             .offset(x = 25.toDp(), y = 50.toDp())
                             .requiredSize(50.toDp())
                             .background(Color.Blue)
@@ -396,7 +408,8 @@
                                     verticalKeylineValues += verticalRuler.current(0f)
                                     p.place(0, 0)
                                 }
-                            })
+                            }
+                    )
                 }
             }
         }
@@ -422,22 +435,24 @@
         rule.setContent {
             with(LocalDensity.current) {
                 Box(
-                    Modifier
-                        .size(100.toDp(), 150.toDp())
-                        .layout { measurable, constraints ->
-                            val p = measurable.measure(constraints)
-                            layout(p.width, p.height, rulers = {
+                    Modifier.size(100.toDp(), 150.toDp()).layout { measurable, constraints ->
+                        val p = measurable.measure(constraints)
+                        layout(
+                            p.width,
+                            p.height,
+                            rulers = {
                                 if (setRulers) {
                                     verticalRuler.provides(35f)
                                     horizontalRuler.provides(53f)
                                 }
-                            }) {
-                                p.place(0, 0)
                             }
-                        }) {
+                        ) {
+                            p.place(0, 0)
+                        }
+                    }
+                ) {
                     Box(
-                        Modifier
-                            .align(AbsoluteAlignment.TopLeft)
+                        Modifier.align(AbsoluteAlignment.TopLeft)
                             .offset(x = 25.toDp(), y = 50.toDp())
                             .requiredSize(50.toDp())
                             .background(Color.Blue)
@@ -448,7 +463,8 @@
                                     verticalKeylineValues += verticalRuler.current(Float.NaN)
                                     p.place(0, 0)
                                 }
-                            })
+                            }
+                    )
                 }
             }
         }
@@ -473,22 +489,24 @@
         rule.setContent {
             with(LocalDensity.current) {
                 Box(
-                    Modifier
-                        .size(100.toDp(), 150.toDp())
-                        .layout { measurable, constraints ->
-                            val p = measurable.measure(constraints)
-                            layout(p.width, p.height, rulers = {
+                    Modifier.size(100.toDp(), 150.toDp()).layout { measurable, constraints ->
+                        val p = measurable.measure(constraints)
+                        layout(
+                            p.width,
+                            p.height,
+                            rulers = {
                                 if (setRulers) {
                                     verticalRuler.provides(35f)
                                     horizontalRuler.provides(53f)
                                 }
-                            }) {
-                                p.place(0, 0)
                             }
-                        }) {
+                        ) {
+                            p.place(0, 0)
+                        }
+                    }
+                ) {
                     Box(
-                        Modifier
-                            .align(AbsoluteAlignment.TopLeft)
+                        Modifier.align(AbsoluteAlignment.TopLeft)
                             .offset(x = 25.toDp(), y = 50.toDp())
                             .requiredSize(50.toDp())
                             .background(Color.Blue)
@@ -499,7 +517,8 @@
                                     verticalKeylineValues += verticalRuler.current(Float.NaN)
                                     p.place(0, 0)
                                 }
-                            })
+                            }
+                    )
                 }
             }
         }
@@ -524,20 +543,22 @@
         rule.setContent {
             with(LocalDensity.current) {
                 Box(
-                    Modifier
-                        .size(100.toDp(), 150.toDp())
-                        .layout { measurable, constraints ->
-                            val p = measurable.measure(constraints)
-                            layout(p.width, p.height, rulers = {
+                    Modifier.size(100.toDp(), 150.toDp()).layout { measurable, constraints ->
+                        val p = measurable.measure(constraints)
+                        layout(
+                            p.width,
+                            p.height,
+                            rulers = {
                                 verticalRuler.provides(35f)
                                 horizontalRuler.provides(53f)
-                            }) {
-                                p.place(0, 0)
                             }
-                        }) {
+                        ) {
+                            p.place(0, 0)
+                        }
+                    }
+                ) {
                     Box(
-                        Modifier
-                            .align(AbsoluteAlignment.TopLeft)
+                        Modifier.align(AbsoluteAlignment.TopLeft)
                             .offset { offset }
                             .offset(x = 25.toDp(), y = 50.toDp())
                             .requiredSize(50.toDp())
@@ -549,7 +570,8 @@
                                     verticalKeylineValues += verticalRuler.current(0f)
                                     p.place(0, 0)
                                 }
-                            })
+                            }
+                    )
                 }
             }
         }
@@ -572,21 +594,29 @@
         var rulerValue = 0f
         rule.setContent {
             Box(Modifier.offset { IntOffset(offset, 0) }) {
-                Box(Modifier.layout { m, constraints ->
-                    val p = m.measure(constraints)
-                    layout(p.width, p.height, rulers = {
-                        val position = coordinates.positionInRoot().x
-                        verticalRuler.provides(-position)
-                    }) {
-                        p.place(0, 0)
-                    }
-                }) {
-                    Box(Modifier.layout { measurable, constraints ->
-                        val p = measurable.measure(constraints)
-                        layout(p.width, p.height) {
-                            rulerValue = verticalRuler.current(Float.NaN)
+                Box(
+                    Modifier.layout { m, constraints ->
+                        val p = m.measure(constraints)
+                        layout(
+                            p.width,
+                            p.height,
+                            rulers = {
+                                val position = coordinates.positionInRoot().x
+                                verticalRuler.provides(-position)
+                            }
+                        ) {
+                            p.place(0, 0)
                         }
-                    })
+                    }
+                ) {
+                    Box(
+                        Modifier.layout { measurable, constraints ->
+                            val p = measurable.measure(constraints)
+                            layout(p.width, p.height) {
+                                rulerValue = verticalRuler.current(Float.NaN)
+                            }
+                        }
+                    )
                 }
             }
         }
@@ -605,35 +635,42 @@
         var rulerChanged = CountDownLatch(1)
         rule.setContent {
             Box(
-                Modifier
-                    .onPlaced {
-                        rootX = it.positionInWindow().x
-                    }
+                Modifier.onPlaced { rootX = it.positionInWindow().x }
                     .offset { IntOffset(offset, 0) }
             ) {
-                AndroidView(factory = { context ->
-                    ComposeView(context).apply {
-                        setContent {
-                            Box(Modifier.layout { m, constraints ->
-                                val p = m.measure(constraints)
-                                layout(p.width, p.height, rulers = {
-                                    val position = coordinates.positionInWindow().x
-                                    verticalRuler.provides(-position)
-                                }) {
-                                    p.place(0, 0)
-                                }
-                            }) {
-                                Box(Modifier.layout { measurable, constraints ->
-                                    val p = measurable.measure(constraints)
-                                    layout(p.width, p.height) {
-                                        rulerValue = verticalRuler.current(Float.NaN)
-                                        rulerChanged.countDown()
+                AndroidView(
+                    factory = { context ->
+                        ComposeView(context).apply {
+                            setContent {
+                                Box(
+                                    Modifier.layout { m, constraints ->
+                                        val p = m.measure(constraints)
+                                        layout(
+                                            p.width,
+                                            p.height,
+                                            rulers = {
+                                                val position = coordinates.positionInWindow().x
+                                                verticalRuler.provides(-position)
+                                            }
+                                        ) {
+                                            p.place(0, 0)
+                                        }
                                     }
-                                })
+                                ) {
+                                    Box(
+                                        Modifier.layout { measurable, constraints ->
+                                            val p = measurable.measure(constraints)
+                                            layout(p.width, p.height) {
+                                                rulerValue = verticalRuler.current(Float.NaN)
+                                                rulerChanged.countDown()
+                                            }
+                                        }
+                                    )
+                                }
                             }
                         }
                     }
-                })
+                )
             }
         }
         assertThat(rulerChanged.await(1, TimeUnit.SECONDS)).isTrue()
@@ -644,8 +681,6 @@
             rule.activity.window.decorView.invalidate()
         }
         assertThat(rulerChanged.await(1, TimeUnit.SECONDS)).isTrue()
-        rule.runOnIdle {
-            assertThat(rulerValue).isWithin(0.01f).of(-100f - rootX)
-        }
+        rule.runOnIdle { assertThat(rulerValue).isWithin(0.01f).of(-100f - rootX) }
     }
 }
diff --git a/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/layout/SubcomposeLayoutTest.kt b/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/layout/SubcomposeLayoutTest.kt
index 6502418..db48053 100644
--- a/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/layout/SubcomposeLayoutTest.kt
+++ b/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/layout/SubcomposeLayoutTest.kt
@@ -103,11 +103,9 @@
 @RunWith(AndroidJUnit4::class)
 class SubcomposeLayoutTest {
 
-    @get:Rule
-    val rule = createAndroidComposeRule<TestActivity>()
+    @get:Rule val rule = createAndroidComposeRule<TestActivity>()
 
-    @get:Rule
-    val excessiveAssertions = AndroidOwnerExtraAssertionsRule()
+    @get:Rule val excessiveAssertions = AndroidOwnerExtraAssertionsRule()
 
     @Test
     fun useSizeOfTheFirstItemInSecondSubcomposition() {
@@ -116,22 +114,20 @@
 
         rule.setContent {
             SubcomposeLayout { constraints ->
-                val first = subcompose(0) {
-                    Spacer(
-                        Modifier
-                            .requiredSize(50.dp)
-                            .testTag(firstTag))
-                }.first().measure(constraints)
+                val first =
+                    subcompose(0) { Spacer(Modifier.requiredSize(50.dp).testTag(firstTag)) }
+                        .first()
+                        .measure(constraints)
 
                 // it is an input for the second subcomposition
                 val halfFirstSize = (first.width / 2).toDp()
 
-                val second = subcompose(1) {
-                    Spacer(
-                        Modifier
-                            .requiredSize(halfFirstSize)
-                            .testTag(secondTag))
-                }.first().measure(constraints)
+                val second =
+                    subcompose(1) {
+                            Spacer(Modifier.requiredSize(halfFirstSize).testTag(secondTag))
+                        }
+                        .first()
+                        .measure(constraints)
 
                 layout(first.width, first.height) {
                     first.place(0, 0)
@@ -140,12 +136,14 @@
             }
         }
 
-        rule.onNodeWithTag(firstTag)
+        rule
+            .onNodeWithTag(firstTag)
             .assertPositionInRootIsEqualTo(0.dp, 0.dp)
             .assertWidthIsEqualTo(50.dp)
             .assertHeightIsEqualTo(50.dp)
 
-        rule.onNodeWithTag(secondTag)
+        rule
+            .onNodeWithTag(secondTag)
             .assertPositionInRootIsEqualTo(25.dp, 25.dp)
             .assertWidthIsEqualTo(25.dp)
             .assertHeightIsEqualTo(25.dp)
@@ -159,18 +157,12 @@
 
         rule.setContent {
             SubcomposeLayout(Modifier.testTag(layoutTag)) { constraints ->
-                val placeables = subcompose(Unit) {
-                    Spacer(
-                        Modifier
-                            .requiredSize(50.dp)
-                            .testTag(firstTag))
-                    Spacer(
-                        Modifier
-                            .requiredSize(30.dp)
-                            .testTag(secondTag))
-                }.map {
-                    it.measure(constraints)
-                }
+                val placeables =
+                    subcompose(Unit) {
+                            Spacer(Modifier.requiredSize(50.dp).testTag(firstTag))
+                            Spacer(Modifier.requiredSize(30.dp).testTag(secondTag))
+                        }
+                        .map { it.measure(constraints) }
 
                 val maxWidth = placeables.maxByOrNull { it.width }!!.width
                 val height = placeables.sumOf { it.height }
@@ -184,19 +176,19 @@
             }
         }
 
-        rule.onNodeWithTag(firstTag)
+        rule
+            .onNodeWithTag(firstTag)
             .assertPositionInRootIsEqualTo(0.dp, 0.dp)
             .assertWidthIsEqualTo(50.dp)
             .assertHeightIsEqualTo(50.dp)
 
-        rule.onNodeWithTag(secondTag)
+        rule
+            .onNodeWithTag(secondTag)
             .assertPositionInRootIsEqualTo(0.dp, 50.dp)
             .assertWidthIsEqualTo(30.dp)
             .assertHeightIsEqualTo(30.dp)
 
-        rule.onNodeWithTag(layoutTag)
-            .assertWidthIsEqualTo(50.dp)
-            .assertHeightIsEqualTo(80.dp)
+        rule.onNodeWithTag(layoutTag).assertWidthIsEqualTo(50.dp).assertHeightIsEqualTo(80.dp)
     }
 
     @Test
@@ -209,17 +201,18 @@
         rule.setContent {
             SubcomposeLayout { constraints ->
                 measuresCount++
-                val placeable = subcompose(Unit) {
-                    recompositionsCount1++
-                    NonInlineBox(Modifier.requiredSize(20.dp)) {
-                        model.value // model read
-                        recompositionsCount2++
-                    }
-                }.first().measure(constraints)
+                val placeable =
+                    subcompose(Unit) {
+                            recompositionsCount1++
+                            NonInlineBox(Modifier.requiredSize(20.dp)) {
+                                model.value // model read
+                                recompositionsCount2++
+                            }
+                        }
+                        .first()
+                        .measure(constraints)
 
-                layout(placeable.width, placeable.height) {
-                    placeable.place(0, 0)
-                }
+                layout(placeable.width, placeable.height) { placeable.place(0, 0) }
             }
         }
 
@@ -249,12 +242,9 @@
                     recompositionsCount1++
                     model.value // model read
                 }
-                subcompose(2) {
-                    recompositionsCount2++
-                }
+                subcompose(2) { recompositionsCount2++ }
 
-                layout(100, 100) {
-                }
+                layout(100, 100) {}
             }
         }
 
@@ -274,65 +264,44 @@
 
         rule.setContent {
             SubcomposeLayout(Modifier.testTag(layoutTag)) { constraints ->
-                val placeables = subcompose(Unit) {
-                    if (addChild.value) {
-                        Spacer(
-                            Modifier
-                                .requiredSize(20.dp)
-                                .testTag(childTag))
-                    }
-                }.map { it.measure(constraints) }
+                val placeables =
+                    subcompose(Unit) {
+                            if (addChild.value) {
+                                Spacer(Modifier.requiredSize(20.dp).testTag(childTag))
+                            }
+                        }
+                        .map { it.measure(constraints) }
 
                 val size = placeables.firstOrNull()?.width ?: 0
-                layout(size, size) {
-                    placeables.forEach { it.place(0, 0) }
-                }
+                layout(size, size) { placeables.forEach { it.place(0, 0) } }
             }
         }
 
-        rule.onNodeWithTag(layoutTag)
-            .assertWidthIsEqualTo(0.dp)
-            .assertHeightIsEqualTo(0.dp)
+        rule.onNodeWithTag(layoutTag).assertWidthIsEqualTo(0.dp).assertHeightIsEqualTo(0.dp)
 
-        rule.onNodeWithTag(childTag)
-            .assertDoesNotExist()
+        rule.onNodeWithTag(childTag).assertDoesNotExist()
 
-        rule.runOnIdle {
-            addChild.value = true
-        }
+        rule.runOnIdle { addChild.value = true }
 
-        rule.onNodeWithTag(layoutTag)
-            .assertWidthIsEqualTo(20.dp)
-            .assertHeightIsEqualTo(20.dp)
+        rule.onNodeWithTag(layoutTag).assertWidthIsEqualTo(20.dp).assertHeightIsEqualTo(20.dp)
 
-        rule.onNodeWithTag(childTag)
-            .assertWidthIsEqualTo(20.dp)
-            .assertHeightIsEqualTo(20.dp)
+        rule.onNodeWithTag(childTag).assertWidthIsEqualTo(20.dp).assertHeightIsEqualTo(20.dp)
     }
 
     @Test
     fun providingNewLambdaCausingRecomposition() {
-        val content = mutableStateOf<@Composable () -> Unit>({
-            Spacer(Modifier.requiredSize(10.dp))
-        })
+        val content =
+            mutableStateOf<@Composable () -> Unit>({ Spacer(Modifier.requiredSize(10.dp)) })
 
-        rule.setContent {
-            MySubcomposeLayout(content.value)
-        }
+        rule.setContent { MySubcomposeLayout(content.value) }
 
         val updatedTag = "updated"
 
         rule.runOnIdle {
-            content.value = {
-                Spacer(
-                    Modifier
-                        .requiredSize(10.dp)
-                        .testTag(updatedTag))
-            }
+            content.value = { Spacer(Modifier.requiredSize(10.dp).testTag(updatedTag)) }
         }
 
-        rule.onNodeWithTag(updatedTag)
-            .assertIsDisplayed()
+        rule.onNodeWithTag(updatedTag).assertIsDisplayed()
     }
 
     @Composable
@@ -341,9 +310,7 @@
             val placeables = subcompose(Unit, content).map { it.measure(constraints) }
             val maxWidth = placeables.maxByOrNull { it.width }!!.width
             val height = placeables.sumOf { it.height }
-            layout(maxWidth, height) {
-                placeables.forEach { it.place(0, 0) }
-            }
+            layout(maxWidth, height) { placeables.forEach { it.place(0, 0) } }
         }
     }
 
@@ -359,13 +326,9 @@
                     subcompose(Unit) {
                         DisposableEffect(Unit) {
                             composed = true
-                            onDispose { }
+                            onDispose {}
                         }
-                        DisposableEffect(Unit) {
-                            onDispose {
-                                disposed = true
-                            }
-                        }
+                        DisposableEffect(Unit) { onDispose { disposed = true } }
                     }
                 }
                 layout(10, 10) {}
@@ -379,9 +342,7 @@
             addSlot.value = false
         }
 
-        rule.runOnIdle {
-            assertThat(disposed).isTrue()
-        }
+        rule.runOnIdle { assertThat(disposed).isTrue() }
     }
 
     @Test
@@ -391,18 +352,18 @@
 
         rule.setContent {
             SubcomposeLayout(Modifier.testTag(layoutTag)) { constraints ->
-                val first = subcompose(Color.Red) {
-                    Spacer(
-                        Modifier
-                            .requiredSize(10.dp)
-                            .background(Color.Red))
-                }.first().measure(constraints)
-                val second = subcompose(Color.Green) {
-                    Spacer(
-                        Modifier
-                            .requiredSize(10.dp)
-                            .background(Color.Green))
-                }.first().measure(constraints)
+                val first =
+                    subcompose(Color.Red) {
+                            Spacer(Modifier.requiredSize(10.dp).background(Color.Red))
+                        }
+                        .first()
+                        .measure(constraints)
+                val second =
+                    subcompose(Color.Green) {
+                            Spacer(Modifier.requiredSize(10.dp).background(Color.Green))
+                        }
+                        .first()
+                        .measure(constraints)
                 layout(first.width, first.height) {
                     first.place(0, 0)
                     second.place(0, 0)
@@ -412,9 +373,7 @@
 
         rule.waitForIdle()
 
-        rule.onNodeWithTag(layoutTag)
-            .captureToImage()
-            .assertCenterPixelColor(Color.Green)
+        rule.onNodeWithTag(layoutTag).captureToImage().assertCenterPixelColor(Color.Green)
     }
 
     @Test
@@ -427,18 +386,18 @@
             SubcomposeLayout(Modifier.testTag(layoutTag)) { constraints ->
                 val firstColor = if (firstSlotIsRed.value) Color.Red else Color.Green
                 val secondColor = if (firstSlotIsRed.value) Color.Green else Color.Red
-                val first = subcompose(firstColor) {
-                    Spacer(
-                        Modifier
-                            .requiredSize(10.dp)
-                            .background(firstColor))
-                }.first().measure(constraints)
-                val second = subcompose(secondColor) {
-                    Spacer(
-                        Modifier
-                            .requiredSize(10.dp)
-                            .background(secondColor))
-                }.first().measure(constraints)
+                val first =
+                    subcompose(firstColor) {
+                            Spacer(Modifier.requiredSize(10.dp).background(firstColor))
+                        }
+                        .first()
+                        .measure(constraints)
+                val second =
+                    subcompose(secondColor) {
+                            Spacer(Modifier.requiredSize(10.dp).background(secondColor))
+                        }
+                        .first()
+                        .measure(constraints)
                 layout(first.width, first.height) {
                     first.place(0, 0)
                     second.place(0, 0)
@@ -446,17 +405,11 @@
             }
         }
 
-        rule.onNodeWithTag(layoutTag)
-            .captureToImage()
-            .assertCenterPixelColor(Color.Green)
+        rule.onNodeWithTag(layoutTag).captureToImage().assertCenterPixelColor(Color.Green)
 
-        rule.runOnIdle {
-            firstSlotIsRed.value = false
-        }
+        rule.runOnIdle { firstSlotIsRed.value = false }
 
-        rule.onNodeWithTag(layoutTag)
-            .captureToImage()
-            .assertCenterPixelColor(Color.Red)
+        rule.onNodeWithTag(layoutTag).captureToImage().assertCenterPixelColor(Color.Red)
     }
 
     @Test
@@ -466,19 +419,18 @@
 
         rule.setContent {
             SubcomposeLayout(Modifier.testTag(layoutTag)) { constraints ->
-                val first = subcompose(Color.Red) {
-                    Spacer(
-                        Modifier
-                            .requiredSize(10.dp)
-                            .background(Color.Red)
-                            .zIndex(1f))
-                }.first().measure(constraints)
-                val second = subcompose(Color.Green) {
-                    Spacer(
-                        Modifier
-                            .requiredSize(10.dp)
-                            .background(Color.Green))
-                }.first().measure(constraints)
+                val first =
+                    subcompose(Color.Red) {
+                            Spacer(Modifier.requiredSize(10.dp).background(Color.Red).zIndex(1f))
+                        }
+                        .first()
+                        .measure(constraints)
+                val second =
+                    subcompose(Color.Green) {
+                            Spacer(Modifier.requiredSize(10.dp).background(Color.Green))
+                        }
+                        .first()
+                        .measure(constraints)
                 layout(first.width, first.height) {
                     first.place(0, 0)
                     second.place(0, 0)
@@ -486,9 +438,7 @@
             }
         }
 
-        rule.onNodeWithTag(layoutTag)
-            .captureToImage()
-            .assertCenterPixelColor(Color.Red)
+        rule.onNodeWithTag(layoutTag).captureToImage().assertCenterPixelColor(Color.Red)
     }
 
     @Test
@@ -500,20 +450,8 @@
         rule.setContent {
             if (addLayout.value) {
                 SubcomposeLayout {
-                    subcompose(0) {
-                        DisposableEffect(Unit) {
-                            onDispose {
-                                firstDisposed = true
-                            }
-                        }
-                    }
-                    subcompose(1) {
-                        DisposableEffect(Unit) {
-                            onDispose {
-                                secondDisposed = true
-                            }
-                        }
-                    }
+                    subcompose(0) { DisposableEffect(Unit) { onDispose { firstDisposed = true } } }
+                    subcompose(1) { DisposableEffect(Unit) { onDispose { secondDisposed = true } } }
                     layout(10, 10) {}
                 }
             }
@@ -540,11 +478,9 @@
             val sizeIpx = with(density) { size.roundToPx() }
             CompositionLocalProvider(LocalDensity provides density) {
                 SubcomposeLayout(
-                    Modifier
-                        .requiredSize(size)
-                        .onGloballyPositioned {
-                            assertThat(it.size).isEqualTo(IntSize(sizeIpx, sizeIpx))
-                        }
+                    Modifier.requiredSize(size).onGloballyPositioned {
+                        assertThat(it.size).isEqualTo(IntSize(sizeIpx, sizeIpx))
+                    }
                 ) { constraints ->
                     layout(constraints.maxWidth, constraints.maxHeight) {}
                 }
@@ -560,18 +496,18 @@
 
         rule.setContent {
             SubcomposeLayout(Modifier.testTag(layoutTag)) { constraints ->
-                val first = subcompose(Color.Red) {
-                    Spacer(
-                        Modifier
-                            .requiredSize(10.dp)
-                            .background(Color.Red))
-                }.first().measure(constraints)
-                val second = subcompose(Color.Green) {
-                    Spacer(
-                        Modifier
-                            .requiredSize(10.dp)
-                            .background(Color.Green))
-                }.first().measure(constraints)
+                val first =
+                    subcompose(Color.Red) {
+                            Spacer(Modifier.requiredSize(10.dp).background(Color.Red))
+                        }
+                        .first()
+                        .measure(constraints)
+                val second =
+                    subcompose(Color.Green) {
+                            Spacer(Modifier.requiredSize(10.dp).background(Color.Green))
+                        }
+                        .first()
+                        .measure(constraints)
 
                 layout(first.width, first.height) {
                     second.place(0, 0)
@@ -582,9 +518,7 @@
 
         rule.waitForIdle()
 
-        rule.onNodeWithTag(layoutTag)
-            .captureToImage()
-            .assertCenterPixelColor(Color.Red)
+        rule.onNodeWithTag(layoutTag).captureToImage().assertCenterPixelColor(Color.Red)
     }
 
     @Test
@@ -608,13 +542,14 @@
             container1.addView(container2)
             container2.setContent {
                 SubcomposeLayout { constraints ->
-                    val first = subcompose(Unit) {
-                        stateUsedLatch.countDown()
-                        Box(Modifier.requiredSize(state.value))
-                    }.first().measure(constraints)
-                    layout(first.width, first.height) {
-                        first.place(0, 0)
-                    }
+                    val first =
+                        subcompose(Unit) {
+                                stateUsedLatch.countDown()
+                                Box(Modifier.requiredSize(state.value))
+                            }
+                            .first()
+                            .measure(constraints)
+                    layout(first.width, first.height) { first.place(0, 0) }
                 }
             }
         }
@@ -631,9 +566,7 @@
         // but it isn't required
         rule.waitForIdle()
 
-        scenario.onActivity {
-            container1.addView(container2)
-        }
+        scenario.onActivity { container1.addView(container2) }
 
         assertTrue(
             "state was used after reattaching view",
@@ -647,9 +580,7 @@
         var composingCounter = 0
         var composedDuringMeasure = false
         val state = SubcomposeLayoutState()
-        val content: @Composable () -> Unit = {
-            composingCounter++
-        }
+        val content: @Composable () -> Unit = { composingCounter++ }
 
         rule.setContent {
             SubcomposeLayout(state) {
@@ -685,22 +616,17 @@
         var disposed = false
         val state = SubcomposeLayoutState()
 
-        rule.setContent {
-            SubcomposeLayout(state) {
-                layout(10, 10) {}
-            }
-        }
+        rule.setContent { SubcomposeLayout(state) { layout(10, 10) {} } }
 
-        val slot = rule.runOnIdle {
-            state.precompose(Unit) {
-                DisposableEffect(Unit) {
-                    composed = true
-                    onDispose {
-                        disposed = true
+        val slot =
+            rule.runOnIdle {
+                state.precompose(Unit) {
+                    DisposableEffect(Unit) {
+                        composed = true
+                        onDispose { disposed = true }
                     }
                 }
             }
-        }
 
         rule.runOnIdle {
             assertThat(composed).isTrue()
@@ -709,9 +635,7 @@
             slot.dispose()
         }
 
-        rule.runOnIdle {
-            assertThat(disposed).isTrue()
-        }
+        rule.runOnIdle { assertThat(disposed).isTrue() }
     }
 
     @Test
@@ -721,15 +645,14 @@
         var enterCounter = 0
         var exitCounter = 0
         val state = SubcomposeLayoutState()
-        val content: @Composable () -> Unit = @Composable {
-            composingCounter++
-            DisposableEffect(Unit) {
-                enterCounter++
-                onDispose {
-                    exitCounter++
+        val content: @Composable () -> Unit =
+            @Composable {
+                composingCounter++
+                DisposableEffect(Unit) {
+                    enterCounter++
+                    onDispose { exitCounter++ }
                 }
             }
-        }
 
         rule.setContent {
             SubcomposeLayout(state) {
@@ -740,13 +663,9 @@
             }
         }
 
-        val slot = rule.runOnIdle {
-            state.precompose(Unit, content)
-        }
+        val slot = rule.runOnIdle { state.precompose(Unit, content) }
 
-        rule.runOnIdle {
-            slot.dispose()
-        }
+        rule.runOnIdle { slot.dispose() }
 
         rule.runOnIdle {
             assertThat(composingCounter).isEqualTo(1)
@@ -769,21 +688,17 @@
         var composing1Counter = 0
         var composing2Counter = 0
         val state = SubcomposeLayoutState()
-        val content1: @Composable () -> Unit = {
-            composing1Counter++
-        }
-        val content2: @Composable () -> Unit = {
-            composing2Counter++
-        }
+        val content1: @Composable () -> Unit = { composing1Counter++ }
+        val content2: @Composable () -> Unit = { composing2Counter++ }
 
         rule.setContent {
             SubcomposeLayout(state) {
-                subcompose(0) { }
+                subcompose(0) {}
                 if (addSlots.value) {
                     subcompose(1, content1)
                     subcompose(2, content2)
                 }
-                subcompose(3) { }
+                subcompose(3) {}
                 layout(10, 10) {}
             }
         }
@@ -813,26 +728,21 @@
         var enterCounter = 0
         var exitCounter = 0
         val state = SubcomposeLayoutState()
-        val content: @Composable () -> Unit = @Composable {
-            DisposableEffect(Unit) {
-                enterCounter++
-                onDispose {
-                    exitCounter++
+        val content: @Composable () -> Unit =
+            @Composable {
+                DisposableEffect(Unit) {
+                    enterCounter++
+                    onDispose { exitCounter++ }
                 }
             }
-        }
 
         rule.setContent {
             if (emitLayout.value) {
-                SubcomposeLayout(state) {
-                    layout(10, 10) {}
-                }
+                SubcomposeLayout(state) { layout(10, 10) {} }
             }
         }
 
-        rule.runOnIdle {
-            state.precompose(Unit, content)
-        }
+        rule.runOnIdle { state.precompose(Unit, content) }
 
         rule.runOnIdle {
             assertThat(enterCounter).isEqualTo(1)
@@ -840,9 +750,7 @@
             emitLayout.value = false
         }
 
-        rule.runOnIdle {
-            assertThat(exitCounter).isEqualTo(1)
-        }
+        rule.runOnIdle { assertThat(exitCounter).isEqualTo(1) }
     }
 
     @Test
@@ -855,18 +763,14 @@
         rule.setContent {
             SubcomposeLayout(state) {
                 measureCount++
-                layout(10, 10) {
-                    layoutCount++
-                }
+                layout(10, 10) { layoutCount++ }
             }
         }
 
         rule.runOnIdle {
             assertThat(measureCount).isEqualTo(1)
             assertThat(layoutCount).isEqualTo(1)
-            state.precompose(Unit) {
-                Box(Modifier.fillMaxSize())
-            }
+            state.precompose(Unit) { Box(Modifier.fillMaxSize()) }
         }
 
         rule.runOnIdle {
@@ -885,18 +789,14 @@
         rule.setContent {
             SubcomposeLayout(state) {
                 measureCount++
-                layout(10, 10) {
-                    layoutCount++
-                }
+                layout(10, 10) { layoutCount++ }
             }
         }
 
         rule.runOnIdle {
             assertThat(measureCount).isEqualTo(1)
             assertThat(layoutCount).isEqualTo(1)
-            val handle = state.precompose(Unit) {
-                Box(Modifier.fillMaxSize())
-            }
+            val handle = state.precompose(Unit) { Box(Modifier.fillMaxSize()) }
             handle.dispose()
         }
 
@@ -913,15 +813,9 @@
 
         composeItems(state, items)
 
-        rule.runOnIdle {
-            items.value = listOf(2, 3)
-        }
+        rule.runOnIdle { items.value = listOf(2, 3) }
 
-        assertNodes(
-            active = listOf(2, 3),
-            deactivated = listOf(0, 1),
-            disposed = listOf(4)
-        )
+        assertNodes(active = listOf(2, 3), deactivated = listOf(0, 1), disposed = listOf(4))
     }
 
     @Test
@@ -941,11 +835,7 @@
             // the last reusable slot (1) will be used for composing 5
         }
 
-        assertNodes(
-            active = listOf(2, 3, 5),
-            deactivated = listOf(0),
-            disposed = listOf(1, 4)
-        )
+        assertNodes(active = listOf(2, 3, 5), deactivated = listOf(0), disposed = listOf(1, 4))
     }
 
     @Test
@@ -965,10 +855,7 @@
             // slot 1 should be taken back from reusable
         }
 
-        assertNodes(
-            active = listOf(2, 3, 1),
-            deactivated = listOf(0)
-        )
+        assertNodes(active = listOf(2, 3, 1), deactivated = listOf(0))
     }
 
     @Test
@@ -984,16 +871,11 @@
         }
 
         rule.runOnIdle {
-            state.precompose(5) {
-                ItemContent(5)
-            }
+            state.precompose(5) { ItemContent(5) }
             // prefetch should take slot 1 from reuse
         }
 
-        assertNodes(
-            active = listOf(2, 3) + /*prefetch*/ listOf(5),
-            deactivated = listOf(0)
-        )
+        assertNodes(active = listOf(2, 3) + /*prefetch*/ listOf(5), deactivated = listOf(0))
     }
 
     @Test
@@ -1009,9 +891,7 @@
         }
 
         rule.runOnIdle {
-            state.precompose(3) {
-                ItemContent(3)
-            }
+            state.precompose(3) { ItemContent(3) }
             // prefetch should take slot 3 from reuse
         }
 
@@ -1029,14 +909,9 @@
 
         composeItems(state, items)
 
-        rule.runOnIdle {
-            items.value = listOf(2, 4)
-        }
+        rule.runOnIdle { items.value = listOf(2, 4) }
 
-        assertNodes(
-            active = listOf(2, 4),
-            disposed = listOf(0, 1, 3)
-        )
+        assertNodes(active = listOf(2, 4), disposed = listOf(0, 1, 3))
     }
 
     @Test
@@ -1046,15 +921,9 @@
 
         composeItems(state, items)
 
-        rule.runOnIdle {
-            items.value = listOf(0, 1)
-        }
+        rule.runOnIdle { items.value = listOf(0, 1) }
 
-        assertNodes(
-            active = listOf(0, 1),
-            deactivated = listOf(2),
-            disposed = listOf(3)
-        )
+        assertNodes(active = listOf(0, 1), deactivated = listOf(2), disposed = listOf(3))
     }
 
     @SuppressLint("RememberReturnType")
@@ -1069,14 +938,10 @@
                 val slot = slotState.value
                 subcompose(slot) {
                     ReusableContent(slot) {
-                        remember {
-                            lastRememberedSlot = slot
-                        }
+                        remember { lastRememberedSlot = slot }
                         Box(
                             Modifier.composed {
-                                remember {
-                                    lastRememberedComposedModifierSlot = slot
-                                }
+                                remember { lastRememberedComposedModifierSlot = slot }
                                 Modifier
                             }
                         )
@@ -1121,12 +986,10 @@
             }
         }
 
-        rule.runOnIdle {
-            emit.value = true
-        }
+        rule.runOnIdle { emit.value = true }
 
         // awaits that the change is applied and no crash happened
-        rule.runOnIdle { }
+        rule.runOnIdle {}
     }
 
     @Test
@@ -1134,11 +997,12 @@
         var flag by mutableStateOf(true)
         val compositionLocal = compositionLocalOf<Boolean> { error("") }
         var subcomposionValue: Boolean? = null
-        val subcomposeLambda = @Composable {
-            // makes sure the recomposition happens only once after the change
-            assertThat(compositionLocal.current).isNotEqualTo(subcomposionValue)
-            subcomposionValue = compositionLocal.current
-        }
+        val subcomposeLambda =
+            @Composable {
+                // makes sure the recomposition happens only once after the change
+                assertThat(compositionLocal.current).isNotEqualTo(subcomposionValue)
+                subcomposionValue = compositionLocal.current
+            }
 
         rule.setContent {
             CompositionLocalProvider(compositionLocal provides flag) {
@@ -1160,9 +1024,7 @@
             flag = false
         }
 
-        rule.runOnIdle {
-            assertThat(subcomposionValue).isFalse()
-        }
+        rule.runOnIdle { assertThat(subcomposionValue).isFalse() }
     }
 
     @Test
@@ -1170,11 +1032,12 @@
         var flag by mutableStateOf(true)
         val compositionLocal = compositionLocalOf<Boolean> { error("") }
         var subcomposionValue: Boolean? = null
-        val subcomposeLambda = @Composable {
-            // makes sure the recomposition happens only once after the change
-            assertThat(compositionLocal.current).isNotEqualTo(subcomposionValue)
-            subcomposionValue = compositionLocal.current
-        }
+        val subcomposeLambda =
+            @Composable {
+                // makes sure the recomposition happens only once after the change
+                assertThat(compositionLocal.current).isNotEqualTo(subcomposionValue)
+                subcomposionValue = compositionLocal.current
+            }
         val measurePolicy: SubcomposeMeasureScope.(Constraints) -> MeasureResult = {
             subcompose(Unit, subcomposeLambda)
             layout(100, 100) {}
@@ -1191,9 +1054,7 @@
             flag = false
         }
 
-        rule.runOnIdle {
-            assertThat(subcomposionValue).isFalse()
-        }
+        rule.runOnIdle { assertThat(subcomposionValue).isFalse() }
     }
 
     @Test
@@ -1201,11 +1062,12 @@
         var flag by mutableStateOf(true)
         val compositionLocal = staticCompositionLocalOf<Boolean> { error("") }
         var subcomposionValue: Boolean? = null
-        val subcomposeLambda = @Composable {
-            // makes sure the recomposition happens only once after the change
-            assertThat(compositionLocal.current).isNotEqualTo(subcomposionValue)
-            subcomposionValue = compositionLocal.current
-        }
+        val subcomposeLambda =
+            @Composable {
+                // makes sure the recomposition happens only once after the change
+                assertThat(compositionLocal.current).isNotEqualTo(subcomposionValue)
+                subcomposionValue = compositionLocal.current
+            }
         val measureBlock: SubcomposeMeasureScope.(Constraints) -> MeasureResult = {
             subcompose(Unit, subcomposeLambda)
             layout(100, 100) {}
@@ -1229,9 +1091,7 @@
             flag = false
         }
 
-        rule.runOnIdle {
-            assertThat(subcomposionValue).isFalse()
-        }
+        rule.runOnIdle { assertThat(subcomposionValue).isFalse() }
     }
 
     @Test
@@ -1239,11 +1099,12 @@
         var flag by mutableStateOf(true)
         val compositionLocal = staticCompositionLocalOf<Boolean> { error("") }
         var subcomposionValue: Boolean? = null
-        val subcomposeLambda = @Composable {
-            // makes sure the recomposition happens only once after the change
-            assertThat(compositionLocal.current).isNotEqualTo(subcomposionValue)
-            subcomposionValue = compositionLocal.current
-        }
+        val subcomposeLambda =
+            @Composable {
+                // makes sure the recomposition happens only once after the change
+                assertThat(compositionLocal.current).isNotEqualTo(subcomposionValue)
+                subcomposionValue = compositionLocal.current
+            }
         val measurePolicy: SubcomposeMeasureScope.(Constraints) -> MeasureResult = {
             subcompose(Unit, subcomposeLambda)
             layout(100, 100) {}
@@ -1260,9 +1121,7 @@
             flag = false
         }
 
-        rule.runOnIdle {
-            assertThat(subcomposionValue).isFalse()
-        }
+        rule.runOnIdle { assertThat(subcomposionValue).isFalse() }
     }
 
     @Test
@@ -1273,47 +1132,39 @@
         val local = compositionLocalOf<Boolean> { error("Not defined") }
         val innerLocal = staticCompositionLocalOf<Unit> { error("\not defined") }
 
-        val content = @Composable {
-            CompositionLocalProvider(innerLocal provides Unit) {
-                val value1 = staticLocal.current
-                val value2 = local.current
-                Box(
-                    Modifier
-                        .testTag(if (value1) "dark" else "light")
-                        .requiredSize(if (value2) 50.dp else 100.dp)
-                )
+        val content =
+            @Composable {
+                CompositionLocalProvider(innerLocal provides Unit) {
+                    val value1 = staticLocal.current
+                    val value2 = local.current
+                    Box(
+                        Modifier.testTag(if (value1) "dark" else "light")
+                            .requiredSize(if (value2) 50.dp else 100.dp)
+                    )
+                }
             }
-        }
 
         rule.setContent {
             CompositionLocalProvider(
                 staticLocal provides isDark,
             ) {
-                CompositionLocalProvider(
-                    local provides staticLocal.current
-                ) {
+                CompositionLocalProvider(local provides staticLocal.current) {
                     SubcomposeLayout { constraints ->
                         val measurables = subcompose(Unit, content)
-                        val placeables = measurables.map {
-                            it.measure(constraints)
-                        }
-                        layout(100, 100) {
-                            placeables.forEach { it.place(IntOffset.Zero) }
-                        }
+                        val placeables = measurables.map { it.measure(constraints) }
+                        layout(100, 100) { placeables.forEach { it.place(IntOffset.Zero) } }
                     }
                 }
             }
         }
 
-        rule.onNodeWithTag("light")
-            .assertWidthIsEqualTo(100.dp)
+        rule.onNodeWithTag("light").assertWidthIsEqualTo(100.dp)
 
         isDark = true
 
         rule.waitForIdle()
 
-        rule.onNodeWithTag("dark")
-            .assertWidthIsEqualTo(50.dp)
+        rule.onNodeWithTag("dark").assertWidthIsEqualTo(50.dp)
     }
 
     @Test
@@ -1324,13 +1175,14 @@
         rule.setContent {
             val updatedState = rememberUpdatedState(flag)
             val derivedState = remember { derivedStateOf { updatedState.value } }
-            val subcomposeLambda = remember<@Composable () -> Unit> {
-                {
-                    // makes sure the recomposition happens only once after the change
-                    assertThat(derivedState.value).isNotEqualTo(subcomposionValue)
-                    subcomposionValue = derivedState.value
+            val subcomposeLambda =
+                remember<@Composable () -> Unit> {
+                    {
+                        // makes sure the recomposition happens only once after the change
+                        assertThat(derivedState.value).isNotEqualTo(subcomposionValue)
+                        subcomposionValue = derivedState.value
+                    }
                 }
-            }
 
             SubcomposeLayout(
                 Modifier.drawBehind {
@@ -1348,9 +1200,7 @@
             flag = false
         }
 
-        rule.runOnIdle {
-            assertThat(subcomposionValue).isFalse()
-        }
+        rule.runOnIdle { assertThat(subcomposionValue).isFalse() }
     }
 
     @Test
@@ -1362,15 +1212,11 @@
             val state = remember(tag) { SubcomposeLayoutState() }
 
             SubcomposeLayout(state = state) {
-                val placeable = subcompose(Unit) {
-                    Box(
-                        Modifier
-                            .size(10.dp)
-                            .testTag(tag))
-                }.first().measure(Constraints())
-                layout(placeable.width, placeable.height) {
-                    placeable.place(0, 0)
-                }
+                val placeable =
+                    subcompose(Unit) { Box(Modifier.size(10.dp).testTag(tag)) }
+                        .first()
+                        .measure(Constraints())
+                layout(placeable.width, placeable.height) { placeable.place(0, 0) }
             }
         }
 
@@ -1385,23 +1231,21 @@
     fun nodesKeptAsReusableAreReusedWhenTheStateObjectChanges() {
         val slotState = mutableStateOf(0)
         var remeasuresCount = 0
-        val measureModifier = Modifier.layout { _, _ ->
-            remeasuresCount++
-            layout(10, 10) {}
-        }
+        val measureModifier =
+            Modifier.layout { _, _ ->
+                remeasuresCount++
+                layout(10, 10) {}
+            }
         val layoutState = mutableStateOf(SubcomposeLayoutState(SubcomposeSlotReusePolicy(1)))
 
         rule.setContent {
             val slot = slotState.value
             SubcomposeLayout(layoutState.value) {
-                val placeable = subcompose(slot) {
-                    ReusableContent(slot) {
-                        Box(measureModifier)
-                    }
-                }.first().measure(Constraints())
-                layout(placeable.width, placeable.height) {
-                    placeable.place(0, 0)
-                }
+                val placeable =
+                    subcompose(slot) { ReusableContent(slot) { Box(measureModifier) } }
+                        .first()
+                        .measure(Constraints())
+                layout(placeable.width, placeable.height) { placeable.place(0, 0) }
             }
         }
 
@@ -1427,23 +1271,21 @@
     fun previouslyActiveNodesAreReusedWhenTheStateObjectChanges() {
         val slotState = mutableStateOf(0)
         var remeasuresCount = 0
-        val measureModifier = Modifier.layout { _, _ ->
-            remeasuresCount++
-            layout(10, 10) {}
-        }
+        val measureModifier =
+            Modifier.layout { _, _ ->
+                remeasuresCount++
+                layout(10, 10) {}
+            }
         val layoutState = mutableStateOf(SubcomposeLayoutState(SubcomposeSlotReusePolicy(1)))
 
         rule.setContent {
             val slot = slotState.value
             SubcomposeLayout(layoutState.value) { _ ->
-                val placeable = subcompose(slot) {
-                    ReusableContent(slot) {
-                        Box(measureModifier)
-                    }
-                }.first().measure(Constraints())
-                layout(placeable.width, placeable.height) {
-                    placeable.place(0, 0)
-                }
+                val placeable =
+                    subcompose(slot) { ReusableContent(slot) { Box(measureModifier) } }
+                        .first()
+                        .measure(Constraints())
+                layout(placeable.width, placeable.height) { placeable.place(0, 0) }
             }
         }
 
@@ -1467,31 +1309,27 @@
 
         rule.setContent {
             SubcomposeLayout(state = layoutState.value) { constraints ->
-                val node = if (needChild.value) {
-                    subcompose(Unit) {
-                        Box(Modifier.testTag("child"))
-                    }.first().measure(constraints)
-                } else {
-                    null
-                }
-                layout(10, 10) {
-                    node?.place(0, 0)
-                }
+                val node =
+                    if (needChild.value) {
+                        subcompose(Unit) { Box(Modifier.testTag("child")) }
+                            .first()
+                            .measure(constraints)
+                    } else {
+                        null
+                    }
+                layout(10, 10) { node?.place(0, 0) }
             }
         }
 
-        rule.onNodeWithTag("child")
-            .assertExists()
+        rule.onNodeWithTag("child").assertExists()
 
         needChild.value = false
 
-        rule.onNodeWithTag("child")
-            .assertIsDeactivated()
+        rule.onNodeWithTag("child").assertIsDeactivated()
 
         layoutState.value = SubcomposeLayoutState(SubcomposeSlotReusePolicy(1))
 
-        rule.onNodeWithTag("child")
-            .assertIsDeactivated()
+        rule.onNodeWithTag("child").assertIsDeactivated()
     }
 
     @Test
@@ -1501,28 +1339,25 @@
 
         rule.setContent {
             SubcomposeLayout(state = layoutState.value) { constraints ->
-                val node = if (needChild.value) {
-                    subcompose(Unit) {
-                        Box(Modifier.testTag("child"))
-                    }.first().measure(constraints)
-                } else {
-                    null
-                }
-                layout(10, 10) {
-                    node?.place(0, 0)
-                }
+                val node =
+                    if (needChild.value) {
+                        subcompose(Unit) { Box(Modifier.testTag("child")) }
+                            .first()
+                            .measure(constraints)
+                    } else {
+                        null
+                    }
+                layout(10, 10) { node?.place(0, 0) }
             }
         }
 
         rule.runOnIdle { needChild.value = false }
 
-        rule.onNodeWithTag("child")
-            .assertIsDeactivated()
+        rule.onNodeWithTag("child").assertIsDeactivated()
 
         layoutState.value = SubcomposeLayoutState(SubcomposeSlotReusePolicy(0))
 
-        rule.onNodeWithTag("child")
-            .assertIsDetached()
+        rule.onNodeWithTag("child").assertIsDetached()
     }
 
     @Test
@@ -1531,17 +1366,9 @@
         var disposed = false
 
         rule.setContent {
-            SubcomposeLayout(
-                state = SubcomposeLayoutState(SubcomposeSlotReusePolicy(1))
-            ) {
+            SubcomposeLayout(state = SubcomposeLayoutState(SubcomposeSlotReusePolicy(1))) {
                 if (needChild.value) {
-                    subcompose(Unit) {
-                        DisposableEffect(Unit) {
-                            onDispose {
-                                disposed = true
-                            }
-                        }
-                    }
+                    subcompose(Unit) { DisposableEffect(Unit) { onDispose { disposed = true } } }
                 }
                 layout(10, 10) {}
             }
@@ -1563,93 +1390,82 @@
 
         rule.setContent {
             SubcomposeLayout(state = layoutState) { constraints ->
-                val node = if (needChild.value) {
-                    subcompose(Unit) {
-                        Box(Modifier.composed {
-                            DisposableEffect(Unit) {
-                                composed = true
-                                onDispose {
-                                    composed = false
-                                }
+                val node =
+                    if (needChild.value) {
+                        subcompose(Unit) {
+                                Box(
+                                    Modifier.composed {
+                                        DisposableEffect(Unit) {
+                                            composed = true
+                                            onDispose { composed = false }
+                                        }
+                                        testTag("child")
+                                    }
+                                )
                             }
-                            testTag("child")
-                        })
-                    }.first().measure(constraints)
-                } else {
-                    null
-                }
-                layout(10, 10) {
-                    node?.place(0, 0)
-                }
+                            .first()
+                            .measure(constraints)
+                    } else {
+                        null
+                    }
+                layout(10, 10) { node?.place(0, 0) }
             }
         }
 
-        rule.onNodeWithTag("child")
-            .assertExists()
+        rule.onNodeWithTag("child").assertExists()
 
         assertThat(composed).isTrue()
         needChild.value = false
 
-        rule.onNodeWithTag("child")
-            .assertIsDeactivated()
+        rule.onNodeWithTag("child").assertIsDeactivated()
         assertThat(composed).isFalse()
         needChild.value = true
 
-        rule.onNodeWithTag("child")
-            .assertExists()
+        rule.onNodeWithTag("child").assertExists()
         assertThat(composed).isTrue()
     }
 
     @Test
     fun customPolicy_retainingExactItem() {
         val items = mutableStateOf(listOf(0, 1, 2, 3, 4))
-        val policy = object : SubcomposeSlotReusePolicy {
-            override fun getSlotsToRetain(slotIds: SubcomposeSlotReusePolicy.SlotIdsSet) {
-                assertThat(slotIds).containsExactly(1, 2, 4).inOrder()
-                slotIds.remove(1)
-                slotIds.remove(4)
-            }
+        val policy =
+            object : SubcomposeSlotReusePolicy {
+                override fun getSlotsToRetain(slotIds: SubcomposeSlotReusePolicy.SlotIdsSet) {
+                    assertThat(slotIds).containsExactly(1, 2, 4).inOrder()
+                    slotIds.remove(1)
+                    slotIds.remove(4)
+                }
 
-            override fun areCompatible(slotId: Any?, reusableSlotId: Any?): Boolean {
-                assertThat(reusableSlotId).isEqualTo(2)
-                return true
+                override fun areCompatible(slotId: Any?, reusableSlotId: Any?): Boolean {
+                    assertThat(reusableSlotId).isEqualTo(2)
+                    return true
+                }
             }
-        }
         val state = SubcomposeLayoutState(policy)
 
         composeItems(state, items)
 
-        rule.runOnIdle {
-            items.value = listOf(0, 3)
-        }
+        rule.runOnIdle { items.value = listOf(0, 3) }
 
-        assertNodes(
-            active = listOf(0, 3),
-            deactivated = listOf(2),
-            disposed = listOf(1, 4)
-        )
+        assertNodes(active = listOf(0, 3), deactivated = listOf(2), disposed = listOf(1, 4))
 
-        rule.runOnIdle {
-            items.value = listOf(0, 3, 5)
-        }
+        rule.runOnIdle { items.value = listOf(0, 3, 5) }
 
-        assertNodes(
-            active = listOf(0, 3, 5),
-            disposed = listOf(1, 2, 4)
-        )
+        assertNodes(active = listOf(0, 3, 5), disposed = listOf(1, 2, 4))
     }
 
     @Test
     fun customPolicy_lastUsedItemsAreFirstInSet() {
         val items = mutableStateOf(listOf(0, 1, 2, 3, 4))
         var expectedReusable = arrayOf<Int>()
-        val policy = object : SubcomposeSlotReusePolicy {
-            override fun getSlotsToRetain(slotIds: SubcomposeSlotReusePolicy.SlotIdsSet) {
-                assertThat(slotIds).containsExactly(*expectedReusable).inOrder()
-            }
+        val policy =
+            object : SubcomposeSlotReusePolicy {
+                override fun getSlotsToRetain(slotIds: SubcomposeSlotReusePolicy.SlotIdsSet) {
+                    assertThat(slotIds).containsExactly(*expectedReusable).inOrder()
+                }
 
-            override fun areCompatible(slotId: Any?, reusableSlotId: Any?) = true
-        }
+                override fun areCompatible(slotId: Any?, reusableSlotId: Any?) = true
+            }
         val state = SubcomposeLayoutState(policy)
 
         composeItems(state, items)
@@ -1677,18 +1493,19 @@
         var callbackCalled = false
         var expectedSlotId: Any? = null
         var expectedreusableSlotId: Any? = null
-        val policy = object : SubcomposeSlotReusePolicy {
-            override fun getSlotsToRetain(slotIds: SubcomposeSlotReusePolicy.SlotIdsSet) {
-                callbackCalled = true
-                assertThat(slotIds).containsExactly(*expectedReusable).inOrder()
-            }
+        val policy =
+            object : SubcomposeSlotReusePolicy {
+                override fun getSlotsToRetain(slotIds: SubcomposeSlotReusePolicy.SlotIdsSet) {
+                    callbackCalled = true
+                    assertThat(slotIds).containsExactly(*expectedReusable).inOrder()
+                }
 
-            override fun areCompatible(slotId: Any?, reusableSlotId: Any?): Boolean {
-                assertThat(slotId).isEqualTo(expectedSlotId)
-                assertThat(reusableSlotId).isEqualTo(expectedreusableSlotId)
-                return true
+                override fun areCompatible(slotId: Any?, reusableSlotId: Any?): Boolean {
+                    assertThat(slotId).isEqualTo(expectedSlotId)
+                    assertThat(reusableSlotId).isEqualTo(expectedreusableSlotId)
+                    return true
+                }
             }
-        }
         val state = SubcomposeLayoutState(policy)
 
         composeItems(state, items)
@@ -1717,27 +1534,23 @@
             return (number as Int) % 2 == 1
         }
         val items = mutableStateOf(listOf(0, 1, 2, 3, 4, 5, 6))
-        val policy = object : SubcomposeSlotReusePolicy {
-            override fun getSlotsToRetain(slotIds: SubcomposeSlotReusePolicy.SlotIdsSet) {
-                slotIds.removeAll { !isOdd(it) }
-            }
+        val policy =
+            object : SubcomposeSlotReusePolicy {
+                override fun getSlotsToRetain(slotIds: SubcomposeSlotReusePolicy.SlotIdsSet) {
+                    slotIds.removeAll { !isOdd(it) }
+                }
 
-            override fun areCompatible(slotId: Any?, reusableSlotId: Any?): Boolean {
-                return isOdd(slotId) && isOdd(reusableSlotId)
+                override fun areCompatible(slotId: Any?, reusableSlotId: Any?): Boolean {
+                    return isOdd(slotId) && isOdd(reusableSlotId)
+                }
             }
-        }
         val state = SubcomposeLayoutState(policy)
 
         composeItems(state, items)
 
-        rule.runOnIdle {
-            items.value = listOf()
-        }
+        rule.runOnIdle { items.value = listOf() }
 
-        assertNodes(
-            deactivated = listOf(1, 3, 5),
-            disposed = listOf(0, 2, 4, 6)
-        )
+        assertNodes(deactivated = listOf(1, 3, 5), disposed = listOf(0, 2, 4, 6))
 
         rule.runOnIdle {
             items.value = listOf(8, 9, 10)
@@ -1745,11 +1558,7 @@
             // 5 is reused for 9
         }
 
-        assertNodes(
-            active = listOf(8, 9, 10),
-            deactivated = listOf(1, 3),
-            disposed = listOf(5)
-        )
+        assertNodes(active = listOf(8, 9, 10), deactivated = listOf(1, 3), disposed = listOf(5))
     }
 
     @Test
@@ -1758,20 +1567,19 @@
             return (number as Int) % 2 == 1
         }
         val items = mutableStateOf(listOf(0, 1, 2, 3))
-        val policy = object : SubcomposeSlotReusePolicy {
-            override fun getSlotsToRetain(slotIds: SubcomposeSlotReusePolicy.SlotIdsSet) {}
+        val policy =
+            object : SubcomposeSlotReusePolicy {
+                override fun getSlotsToRetain(slotIds: SubcomposeSlotReusePolicy.SlotIdsSet) {}
 
-            override fun areCompatible(slotId: Any?, reusableSlotId: Any?): Boolean {
-                return isOdd(slotId) == isOdd(reusableSlotId)
+                override fun areCompatible(slotId: Any?, reusableSlotId: Any?): Boolean {
+                    return isOdd(slotId) == isOdd(reusableSlotId)
+                }
             }
-        }
         val state = SubcomposeLayoutState(policy)
 
         composeItems(state, items)
 
-        rule.runOnIdle {
-            items.value = listOf()
-        }
+        rule.runOnIdle { items.value = listOf() }
 
         assertNodes(deactivated = listOf(0, 1, 2, 3))
 
@@ -1779,11 +1587,7 @@
             items.value = listOf(10) // slot 2 should be reused
         }
 
-        assertNodes(
-            active = listOf(10),
-            deactivated = listOf(0, 1, 3),
-            disposed = listOf(2)
-        )
+        assertNodes(active = listOf(10), deactivated = listOf(0, 1, 3), disposed = listOf(2))
     }
 
     @Test
@@ -1792,16 +1596,16 @@
         var remeasuresCount = 0
         var relayoutCount = 0
         var subcomposeLayoutRemeasures = 0
-        val modifier = Modifier
-            .layout { measurable, constraints ->
-                val placeable = measurable.measure(constraints)
-                remeasuresCount++
-                layout(placeable.width, placeable.height) {
-                    relayoutCount++
-                    placeable.place(0, 0)
+        val modifier =
+            Modifier.layout { measurable, constraints ->
+                    val placeable = measurable.measure(constraints)
+                    remeasuresCount++
+                    layout(placeable.width, placeable.height) {
+                        relayoutCount++
+                        placeable.place(0, 0)
+                    }
                 }
-            }
-            .fillMaxSize()
+                .fillMaxSize()
         val content = @Composable { Box(modifier) }
         val constraints = Constraints(maxWidth = 100, minWidth = 100)
         var needContent by mutableStateOf(false)
@@ -1809,14 +1613,13 @@
         rule.setContent {
             SubcomposeLayout(state) {
                 subcomposeLayoutRemeasures++
-                val placeable = if (needContent) {
-                    subcompose(Unit, content).first().measure(constraints)
-                } else {
-                    null
-                }
-                layout(10, 10) {
-                    placeable?.place(0, 0)
-                }
+                val placeable =
+                    if (needContent) {
+                        subcompose(Unit, content).first().measure(constraints)
+                    } else {
+                        null
+                    }
+                layout(10, 10) { placeable?.place(0, 0) }
             }
         }
 
@@ -1847,37 +1650,35 @@
     fun premeasuringTwoPlaceables() {
         val state = SubcomposeLayoutState()
         var remeasuresCount = 0
-        val modifier = Modifier
-            .layout { measurable, constraints ->
-                val placeable = measurable.measure(constraints)
-                remeasuresCount++
-                layout(placeable.width, placeable.height) {
-                    placeable.place(0, 0)
+        val modifier =
+            Modifier.layout { measurable, constraints ->
+                    val placeable = measurable.measure(constraints)
+                    remeasuresCount++
+                    layout(placeable.width, placeable.height) { placeable.place(0, 0) }
                 }
+                .fillMaxSize()
+        val content =
+            @Composable {
+                Box(modifier)
+                Box(modifier)
             }
-            .fillMaxSize()
-        val content = @Composable {
-            Box(modifier)
-            Box(modifier)
-        }
         val constraints0 = Constraints(maxWidth = 100, minWidth = 100)
         val constraints1 = Constraints(maxWidth = 200, minWidth = 200)
         var needContent by mutableStateOf(false)
 
         rule.setContent {
             SubcomposeLayout(state) {
-                val placeables = if (needContent) {
-                    val measurables = subcompose(Unit, content)
-                    assertThat(measurables.size).isEqualTo(2)
-                    measurables.mapIndexed { index, measurable ->
-                        measurable.measure(if (index == 0) constraints0 else constraints1)
+                val placeables =
+                    if (needContent) {
+                        val measurables = subcompose(Unit, content)
+                        assertThat(measurables.size).isEqualTo(2)
+                        measurables.mapIndexed { index, measurable ->
+                            measurable.measure(if (index == 0) constraints0 else constraints1)
+                        }
+                    } else {
+                        emptyList()
                     }
-                } else {
-                    emptyList()
-                }
-                layout(10, 10) {
-                    placeables.forEach { it.place(0, 0) }
-                }
+                layout(10, 10) { placeables.forEach { it.place(0, 0) } }
             }
         }
 
@@ -1897,24 +1698,19 @@
             needContent = true
         }
 
-        rule.runOnIdle {
-            assertThat(remeasuresCount).isEqualTo(0)
-        }
+        rule.runOnIdle { assertThat(remeasuresCount).isEqualTo(0) }
     }
 
     @Test
     fun premeasuringIncorrectIndexesCrashes() {
         val state = SubcomposeLayoutState()
-        val content = @Composable {
-            Box(Modifier.size(10.dp))
-            Box(Modifier.size(10.dp))
-        }
-
-        rule.setContent {
-            SubcomposeLayout(state) {
-                layout(10, 10) {}
+        val content =
+            @Composable {
+                Box(Modifier.size(10.dp))
+                Box(Modifier.size(10.dp))
             }
-        }
+
+        rule.setContent { SubcomposeLayout(state) { layout(10, 10) {} } }
 
         rule.runOnIdle {
             val handle = state.precompose(Unit, content)
@@ -1931,21 +1727,18 @@
     @Test
     fun ifSlotWasUsedDuringMeasurePassHandleHasZeroPlaceables() {
         val state = SubcomposeLayoutState()
-        val content = @Composable {
-            Box(Modifier.size(10.dp))
-        }
+        val content = @Composable { Box(Modifier.size(10.dp)) }
         var needContent by mutableStateOf(false)
 
         rule.setContent {
             SubcomposeLayout(state) {
-                val placeable = if (needContent) {
-                    subcompose(Unit, content).first().measure(Constraints())
-                } else {
-                    null
-                }
-                layout(10, 10) {
-                    placeable?.place(0, 0)
-                }
+                val placeable =
+                    if (needContent) {
+                        subcompose(Unit, content).first().measure(Constraints())
+                    } else {
+                        null
+                    }
+                layout(10, 10) { placeable?.place(0, 0) }
             }
         }
 
@@ -1997,9 +1790,7 @@
             screen = Screens.Screen1
         }
 
-        rule.runOnIdle {
-            assertThat(restorableNumberOnScreen1).isEqualTo(0)
-        }
+        rule.runOnIdle { assertThat(restorableNumberOnScreen1).isEqualTo(0) }
     }
 
     @Test
@@ -2016,10 +1807,7 @@
             handle.dispose()
         }
 
-        assertNodes(
-            active = /*prefetch*/ listOf(0),
-            disposed = listOf(1)
-        )
+        assertNodes(active = /*prefetch*/ listOf(0), disposed = listOf(1))
     }
 
     @Test
@@ -2027,37 +1815,34 @@
         val slotState = mutableStateOf(0)
 
         rule.setContent {
-            SubcomposeLayout(
-                remember { SubcomposeLayoutState(SubcomposeSlotReusePolicy(1)) }
-            ) { constraints ->
+            SubcomposeLayout(remember { SubcomposeLayoutState(SubcomposeSlotReusePolicy(1)) }) {
+                constraints ->
                 val slot = slotState.value
-                val child = subcompose(slot) {
-                    ReusableContent(slot) {
-                        Box {
-                            SubcomposeLayout(Modifier.testTag("$slot")) { constraints ->
-                                val placeable = subcompose(0) {
-                                    Box(modifier = Modifier.size(10.dp))
-                                }.first().measure(constraints)
-                                layout(placeable.width, placeable.height) {
-                                    placeable.place(0, 0)
+                val child =
+                    subcompose(slot) {
+                            ReusableContent(slot) {
+                                Box {
+                                    SubcomposeLayout(Modifier.testTag("$slot")) { constraints ->
+                                        val placeable =
+                                            subcompose(0) { Box(modifier = Modifier.size(10.dp)) }
+                                                .first()
+                                                .measure(constraints)
+                                        layout(placeable.width, placeable.height) {
+                                            placeable.place(0, 0)
+                                        }
+                                    }
                                 }
                             }
                         }
-                    }
-                }.first().measure(constraints)
-                layout(child.width, child.height) {
-                    child.place(0, 0)
-                }
+                        .first()
+                        .measure(constraints)
+                layout(child.width, child.height) { child.place(0, 0) }
             }
         }
 
-        rule.runOnIdle {
-            slotState.value = 1
-        }
+        rule.runOnIdle { slotState.value = 1 }
 
-        rule.runOnIdle {
-            slotState.value = 2
-        }
+        rule.runOnIdle { slotState.value = 2 }
 
         rule.onNodeWithTag("2").assertIsDisplayed()
         rule.onNodeWithTag("1").assertIsNotDisplayed()
@@ -2070,62 +1855,59 @@
         val state = SubcomposeLayoutState(SubcomposeSlotReusePolicy(1))
 
         rule.setContent {
-            SubcomposeLayout(
-                remember { SubcomposeLayoutState(SubcomposeSlotReusePolicy(1)) }
-            ) { constraints ->
-                val child = if (needSlot) {
-                    subcompose(0) {
-                        Box {
-                            SubcomposeLayout(state = state, Modifier.testTag("0")) { constraints ->
-                                if (needSlot) {
-                                    val placeable = subcompose(0) {
-                                        Box(modifier = Modifier.size(10.dp))
-                                    }.first().measure(constraints)
-                                    layout(placeable.width, placeable.height) {
-                                        placeable.place(0, 0)
+            SubcomposeLayout(remember { SubcomposeLayoutState(SubcomposeSlotReusePolicy(1)) }) {
+                constraints ->
+                val child =
+                    if (needSlot) {
+                        subcompose(0) {
+                                Box {
+                                    SubcomposeLayout(state = state, Modifier.testTag("0")) {
+                                        constraints ->
+                                        if (needSlot) {
+                                            val placeable =
+                                                subcompose(0) {
+                                                        Box(modifier = Modifier.size(10.dp))
+                                                    }
+                                                    .first()
+                                                    .measure(constraints)
+                                            layout(placeable.width, placeable.height) {
+                                                placeable.place(0, 0)
+                                            }
+                                        } else {
+                                            layout(100, 100) {}
+                                        }
                                     }
-                                } else {
-                                    layout(100, 100) { }
                                 }
                             }
-                        }
-                    }.first().measure(constraints)
-                } else {
-                    null
-                }
-                layout(100, 100) {
-                    child?.place(0, 0)
-                }
+                            .first()
+                            .measure(constraints)
+                    } else {
+                        null
+                    }
+                layout(100, 100) { child?.place(0, 0) }
             }
         }
 
         var precomposedSlotActive = false
 
-        val handle = rule.runOnIdle {
-            state.precompose(1) {
-                Box(
-                    modifier = Modifier
-                        .size(10.dp)
-                        .testTag("1")
-                )
+        val handle =
+            rule.runOnIdle {
+                state.precompose(1) {
+                    Box(modifier = Modifier.size(10.dp).testTag("1"))
 
-                DisposableEffect(Unit) {
-                    precomposedSlotActive = true
-                    onDispose {
-                        precomposedSlotActive = false
+                    DisposableEffect(Unit) {
+                        precomposedSlotActive = true
+                        onDispose { precomposedSlotActive = false }
                     }
                 }
             }
-        }
 
         rule.runOnIdle {
             assertThat(precomposedSlotActive).isTrue()
             needSlot = false
         }
 
-        rule.runOnIdle {
-            handle.dispose()
-        }
+        rule.runOnIdle { handle.dispose() }
 
         assertThat(precomposedSlotActive).isFalse()
 
@@ -2138,33 +1920,26 @@
     fun getAlignmentsOnSubcomposeLayoutContent() {
         var baseline: Int? = null
         rule.setContent {
-            Layout(
-                {
-                    SubcomposeLayout { constraints ->
-                        val placeable = subcompose("0") {
-                            Layout(content = {}) { _, _ ->
-                                layout(10, 10, mapOf(FirstBaseline to 100)) {}
+            Layout({
+                SubcomposeLayout { constraints ->
+                    val placeable =
+                        subcompose("0") {
+                                Layout(content = {}) { _, _ ->
+                                    layout(10, 10, mapOf(FirstBaseline to 100)) {}
+                                }
                             }
-                        }.first().measure(constraints)
-                        layout(placeable.width, placeable.height) {
-                            placeable.place(0, 0)
-                        }
-                    }
+                            .first()
+                            .measure(constraints)
+                    layout(placeable.width, placeable.height) { placeable.place(0, 0) }
                 }
-            ) { measurables, constraints ->
-                val titlePlaceable = measurables.first().measure(
-                    constraints.copy(minHeight = 0)
-                )
+            }) { measurables, constraints ->
+                val titlePlaceable = measurables.first().measure(constraints.copy(minHeight = 0))
                 baseline = titlePlaceable[FirstBaseline]
-                layout(titlePlaceable.width, titlePlaceable.height) {
-                    titlePlaceable.place(0, 0)
-                }
+                layout(titlePlaceable.width, titlePlaceable.height) { titlePlaceable.place(0, 0) }
             }
         }
 
-        rule.runOnIdle {
-            assertThat(baseline).isEqualTo(100)
-        }
+        rule.runOnIdle { assertThat(baseline).isEqualTo(100) }
     }
 
     @Test
@@ -2174,20 +1949,17 @@
         rule.setContent {
             Box {
                 SubcomposeLayout { constraints ->
-                    val placeable = subcompose("0") {
-                        Box(Modifier
-                            .fillMaxSize()
-                            .onGloballyPositioned {
-                                coordinates = it
+                    val placeable =
+                        subcompose("0") {
+                                Box(
+                                    Modifier.fillMaxSize()
+                                        .onGloballyPositioned { coordinates = it }
+                                        .onSizeChanged { size = it }
+                                )
                             }
-                            .onSizeChanged {
-                                size = it
-                            }
-                        )
-                    }.first().measure(constraints)
-                    layout(placeable.width, placeable.height) {
-                        placeable.place(0, 0)
-                    }
+                            .first()
+                            .measure(constraints)
+                    layout(placeable.width, placeable.height) { placeable.place(0, 0) }
                 }
             }
         }
@@ -2210,19 +1982,16 @@
             SubcomposeLayout(
                 state = remember { SubcomposeLayoutState(SubcomposeSlotReusePolicy(1)) }
             ) { constraints ->
-                val placeable = subcompose(0) {
-                    Box(Modifier.testTag("0"))
+                val placeable =
+                    subcompose(0) {
+                            Box(Modifier.testTag("0"))
 
-                    DisposableEffect(Unit) {
-                        onDispose {
-                            disposeCount++
+                            DisposableEffect(Unit) { onDispose { disposeCount++ } }
                         }
-                    }
-                }.single().measure(constraints)
+                        .single()
+                        .measure(constraints)
 
-                layout(placeable.width, placeable.height) {
-                    placeable.place(IntOffset.Zero)
-                }
+                layout(placeable.width, placeable.height) { placeable.place(IntOffset.Zero) }
             }
         }
 
@@ -2230,23 +1999,17 @@
 
         rule.setContent {
             if (wrappedWithColumn) {
-                Column {
-                    content()
-                }
+                Column { content() }
             } else {
                 content()
             }
         }
 
-        rule.onNodeWithTag("0")
-            .assertExists()
+        rule.onNodeWithTag("0").assertExists()
 
-        rule.runOnIdle {
-            wrappedWithColumn = true
-        }
+        rule.runOnIdle { wrappedWithColumn = true }
 
-        rule.onNodeWithTag("0")
-            .assertExists()
+        rule.onNodeWithTag("0").assertExists()
         assertThat(disposeCount).isEqualTo(0)
     }
 
@@ -2271,9 +2034,7 @@
             }
         }
 
-        rule.runOnIdle {
-            wrapped = !wrapped
-        }
+        rule.runOnIdle { wrapped = !wrapped }
 
         rule.waitForIdle()
     }
@@ -2287,27 +2048,25 @@
         var remeasurer: Remeasurement? = null
         rule.setContent {
             SubcomposeLayout(
-                modifier = Modifier.then(object : RemeasurementModifier {
-                    override fun onRemeasurementAvailable(remeasurement: Remeasurement) {
-                        remeasurer = remeasurement
-                    }
-                }),
-                state = remember {
-                    SubcomposeLayoutState(SubcomposeSlotReusePolicy(1))
-                },
+                modifier =
+                    Modifier.then(
+                        object : RemeasurementModifier {
+                            override fun onRemeasurementAvailable(remeasurement: Remeasurement) {
+                                remeasurer = remeasurement
+                            }
+                        }
+                    ),
+                state = remember { SubcomposeLayoutState(SubcomposeSlotReusePolicy(1)) },
             ) { constraints ->
-                val placeable = if (isActive) {
-                    val measureables = subcompose(null) {
-                        Box(Modifier)
+                val placeable =
+                    if (isActive) {
+                        val measureables = subcompose(null) { Box(Modifier) }
+                        measureables.map { it.measure(constraints) }
+                    } else {
+                        forceMeasureFromLaunchedEffect = true
+                        emptyList()
                     }
-                    measureables.map { it.measure(constraints) }
-                } else {
-                    forceMeasureFromLaunchedEffect = true
-                    emptyList()
-                }
-                layout(0, 0) {
-                    placeable.forEach { it.place(0, 0) }
-                }
+                layout(0, 0) { placeable.forEach { it.place(0, 0) } }
             }
 
             if (forceMeasureFromLaunchedEffect) {
@@ -2318,9 +2077,7 @@
             }
         }
 
-        rule.runOnIdle {
-            isActive = false
-        }
+        rule.runOnIdle { isActive = false }
 
         rule.waitUntil { isActive }
     }
@@ -2362,16 +2119,13 @@
             }
         }
 
-        rule.runOnIdle {
-            flag = false
-        }
+        rule.runOnIdle { flag = false }
 
         // the node will exist when after `flag` was switched to false it will first cause
         // remeasure, and because during the remeasure we will not subcompose the child
         // the node will be deactivated before its block recomposes causing the Box to be
         // removed from the hierarchy.
-        rule.onNodeWithTag("tag")
-            .assertIsDeactivated()
+        rule.onNodeWithTag("tag").assertIsDeactivated()
     }
 
     // Regression test of b/271156218
@@ -2380,25 +2134,18 @@
         var showContent by mutableStateOf(true)
         val state = SubcomposeLayoutState(SubcomposeSlotReusePolicy(1))
         rule.setContent {
-            SubcomposeLayout(
-                state = state,
-                modifier = Modifier.fillMaxSize()
-            ) { constraints ->
-                val content = if (showContent) {
-                    subcompose(0) {
-                        Box {
-                            AndroidView(::View,
-                                Modifier
-                                    .fillMaxSize()
-                                    .testTag("AndroidView"))
+            SubcomposeLayout(state = state, modifier = Modifier.fillMaxSize()) { constraints ->
+                val content =
+                    if (showContent) {
+                        subcompose(0) {
+                            Box {
+                                AndroidView(::View, Modifier.fillMaxSize().testTag("AndroidView"))
+                            }
                         }
-                    }
-                } else emptyList()
+                    } else emptyList()
 
                 val placeables = measure(content, constraints)
-                layout(100, 100) {
-                    placeables.placeChildren()
-                }
+                layout(100, 100) { placeables.placeChildren() }
             }
         }
 
@@ -2416,34 +2163,28 @@
         var showContent by mutableStateOf(true)
         val state = SubcomposeLayoutState(SubcomposeSlotReusePolicy(1))
         rule.setContent {
-            SubcomposeLayout(
-                state = state,
-                modifier = Modifier.fillMaxSize()
-            ) { constraints ->
-                val content = if (showContent) {
-                    subcompose(0) {
-                        Box {
-                            var disposed by remember { mutableStateOf(false) }
-                            DisposableEffect(Unit) {
-                                onDispose { disposed = true }
-                            }
-                            Box(
-                                Modifier.layout { measurable, constraints ->
-                                    assertThat(disposed).isFalse()
-                                    val placeable = measurable.measure(constraints)
-                                    layout(placeable.width, placeable.height) {
-                                        placeable.place(0, 0)
+            SubcomposeLayout(state = state, modifier = Modifier.fillMaxSize()) { constraints ->
+                val content =
+                    if (showContent) {
+                        subcompose(0) {
+                            Box {
+                                var disposed by remember { mutableStateOf(false) }
+                                DisposableEffect(Unit) { onDispose { disposed = true } }
+                                Box(
+                                    Modifier.layout { measurable, constraints ->
+                                        assertThat(disposed).isFalse()
+                                        val placeable = measurable.measure(constraints)
+                                        layout(placeable.width, placeable.height) {
+                                            placeable.place(0, 0)
+                                        }
                                     }
-                                }
-                            )
+                                )
+                            }
                         }
-                    }
-                } else emptyList()
+                    } else emptyList()
 
                 val placeables = measure(content, constraints)
-                layout(100, 100) {
-                    placeables.placeChildren()
-                }
+                layout(100, 100) { placeables.placeChildren() }
             }
         }
 
@@ -2458,45 +2199,38 @@
 
         val activeChildren = mutableSetOf<Int>()
         var remeasureCount = 0
-        val measureCountModifier = Modifier.layout { measurable, constraints ->
-            remeasureCount++
-            val placeable = measurable.measure(constraints)
-            layout(placeable.width, placeable.height) {
-                placeable.place(0, 0)
+        val measureCountModifier =
+            Modifier.layout { measurable, constraints ->
+                remeasureCount++
+                val placeable = measurable.measure(constraints)
+                layout(placeable.width, placeable.height) { placeable.place(0, 0) }
             }
-        }
 
         rule.setContent {
-            SubcomposeLayout(
-                remember { SubcomposeLayoutState(SubcomposeSlotReusePolicy(1)) }
-            ) { constraints ->
+            SubcomposeLayout(remember { SubcomposeLayoutState(SubcomposeSlotReusePolicy(1)) }) {
+                constraints ->
                 val slot = slotState.value
-                val child = measure(slot, constraints) {
-                    Box {
-                        SubcomposeLayout { constraints ->
-                            val placeable = measure(Unit, constraints) {
-                                Box(
-                                    modifier = Modifier
-                                        .size(10.dp)
-                                        .then(measureCountModifier)
-                                )
+                val child =
+                    measure(slot, constraints) {
+                        Box {
+                            SubcomposeLayout { constraints ->
+                                val placeable =
+                                    measure(Unit, constraints) {
+                                        Box(
+                                            modifier =
+                                                Modifier.size(10.dp).then(measureCountModifier)
+                                        )
 
-                                DisposableEffect(Unit) {
-                                    activeChildren += slot
-                                    onDispose {
-                                        activeChildren -= slot
+                                        DisposableEffect(Unit) {
+                                            activeChildren += slot
+                                            onDispose { activeChildren -= slot }
+                                        }
                                     }
-                                }
-                            }
-                            layout(placeable.width, placeable.height) {
-                                placeable.place(0, 0)
+                                layout(placeable.width, placeable.height) { placeable.place(0, 0) }
                             }
                         }
                     }
-                }
-                layout(child.width, child.height) {
-                    child.place(0, 0)
-                }
+                layout(child.width, child.height) { child.place(0, 0) }
             }
         }
 
@@ -2527,54 +2261,51 @@
         var slotId by mutableStateOf(0)
         val activeChildren = mutableSetOf<Int>()
         var remeasureCount = 0
-        val measureCountModifier = Modifier.layout { measurable, constraints ->
-            remeasureCount++
-            val placeable = measurable.measure(constraints)
-            layout(placeable.width, placeable.height) {
-                placeable.place(0, 0)
+        val measureCountModifier =
+            Modifier.layout { measurable, constraints ->
+                remeasureCount++
+                val placeable = measurable.measure(constraints)
+                layout(placeable.width, placeable.height) { placeable.place(0, 0) }
             }
-        }
 
         rule.setContent {
-            SubcomposeLayout(
-                remember { SubcomposeLayoutState(SubcomposeSlotReusePolicy(1)) }
-            ) { constraints ->
+            SubcomposeLayout(remember { SubcomposeLayoutState(SubcomposeSlotReusePolicy(1)) }) {
+                constraints ->
                 if (contentActive) {
-                    val child = measure(slotId, constraints) {
-                        Box {
-                            SubcomposeLayout { constraints ->
-                                val placeable = measure(Unit, constraints) {
-                                    Box(modifier = Modifier
-                                        .size(10.dp)
-                                        .then(measureCountModifier))
+                    val child =
+                        measure(slotId, constraints) {
+                            Box {
+                                SubcomposeLayout { constraints ->
+                                    val placeable =
+                                        measure(Unit, constraints) {
+                                            Box(
+                                                modifier =
+                                                    Modifier.size(10.dp).then(measureCountModifier)
+                                            )
 
-                                    DisposableEffect(Unit) {
-                                        val capturedSlotId = slotId
-                                        activeChildren += slotId
-                                        onDispose {
-                                            activeChildren -= capturedSlotId
+                                            DisposableEffect(Unit) {
+                                                val capturedSlotId = slotId
+                                                activeChildren += slotId
+                                                onDispose { activeChildren -= capturedSlotId }
+                                            }
                                         }
+                                    layout(placeable.width, placeable.height) {
+                                        placeable.place(0, 0)
                                     }
                                 }
-                                layout(placeable.width, placeable.height) {
-                                    placeable.place(0, 0)
+                            }
+
+                            DisposableEffect(Unit) {
+                                onDispose {
+                                    // schedule remeasure / compose when child is reset
+                                    contentActive = true
+                                    slotId++
                                 }
                             }
                         }
-
-                        DisposableEffect(Unit) {
-                            onDispose {
-                                // schedule remeasure / compose when child is reset
-                                contentActive = true
-                                slotId++
-                            }
-                        }
-                    }
-                    layout(child.width, child.height) {
-                        child.place(0, 0)
-                    }
+                    layout(child.width, child.height) { child.place(0, 0) }
                 } else {
-                    layout(0, 0) { }
+                    layout(0, 0) {}
                 }
             }
         }
@@ -2585,9 +2316,7 @@
             contentActive = false
         }
 
-        rule.runOnIdle {
-            assertThat(activeChildren).containsExactly(1)
-        }
+        rule.runOnIdle { assertThat(activeChildren).containsExactly(1) }
     }
 
     @Test
@@ -2597,22 +2326,16 @@
         var disposed = false
         rule.setContent {
             SubcomposeLayout(state) { constraints ->
-                val placeables = if (shouldCompose) {
-                    subcompose(Unit) {
-                        DisposableEffect(Unit) {
-                            onDispose {
-                                disposed = true
+                val placeables =
+                    if (shouldCompose) {
+                        subcompose(Unit) {
+                                DisposableEffect(Unit) { onDispose { disposed = true } }
                             }
-                        }
-                    }.map {
-                        it.measure(constraints)
+                            .map { it.measure(constraints) }
+                    } else {
+                        emptyList()
                     }
-                } else {
-                    emptyList()
-                }
-                layout(100, 100) {
-                    placeables.forEach { it.place(0, 0) }
-                }
+                layout(100, 100) { placeables.forEach { it.place(0, 0) } }
             }
         }
 
@@ -2621,9 +2344,7 @@
             shouldCompose = false
         }
 
-        rule.runOnIdle {
-            assertThat(disposed).isTrue()
-        }
+        rule.runOnIdle { assertThat(disposed).isTrue() }
     }
 
     @Test
@@ -2631,14 +2352,10 @@
         var coords: LayoutCoordinates? = null
         rule.setContent {
             SubcomposeLayout { constraints ->
-                layout(constraints.maxWidth, constraints.maxHeight) {
-                    coords = coordinates
-                }
+                layout(constraints.maxWidth, constraints.maxHeight) { coords = coordinates }
             }
         }
-        rule.runOnIdle {
-            assertThat(coords).isNotNull()
-        }
+        rule.runOnIdle { assertThat(coords).isNotNull() }
     }
 
     @Test
@@ -2650,28 +2367,27 @@
         rule.setContent {
             ReusableContentHost(active) {
                 SubcomposeLayout { constraints ->
-                    val placeable = subcompose(Unit) {
-                        Layout(
-                            modifier = modifier,
-                        ) { _, _ ->
-                            layout(10, 10) {}
-                        }
-                    }.first().measure(constraints)
-                    layout(placeable.width, placeable.height) {
-                        placeable.place(0, 0)
-                    }
+                    val placeable =
+                        subcompose(Unit) {
+                                Layout(
+                                    modifier = modifier,
+                                ) { _, _ ->
+                                    layout(10, 10) {}
+                                }
+                            }
+                            .first()
+                            .measure(constraints)
+                    layout(placeable.width, placeable.height) { placeable.place(0, 0) }
                 }
             }
         }
 
         rule.runOnIdle {
             active = false
-            modifier = Modifier.drawBehind { }
+            modifier = Modifier.drawBehind {}
         }
 
-        rule.runOnIdle {
-            active = true
-        }
+        rule.runOnIdle { active = true }
 
         rule.runOnIdle {
             // makes sure there will be no runtime crash
@@ -2684,15 +2400,11 @@
         val state = SubcomposeLayoutState(SubcomposeSlotReusePolicy(1))
         rule.setContent {
             if (needSubcomposeLayout) {
-                SubcomposeLayout(state) { _ ->
-                    layout(10, 10) {}
-                }
+                SubcomposeLayout(state) { _ -> layout(10, 10) {} }
             }
         }
 
-        rule.runOnIdle {
-            needSubcomposeLayout = false
-        }
+        rule.runOnIdle { needSubcomposeLayout = false }
 
         rule.runOnIdle {
             val handle = state.precompose(Unit) { Box(Modifier) }
@@ -2706,30 +2418,25 @@
         val needChild = mutableStateOf(true)
 
         rule.setContent {
-            SubcomposeLayout(
-                modifier = Modifier.testTag("layout"),
-                state = layoutState.value
-            ) { constraints ->
-                val node = if (needChild.value) {
-                    subcompose(Unit) {
-                        Box(Modifier.testTag("child"))
-                    }.first().measure(constraints)
-                } else {
-                    null
-                }
-                layout(10, 10) {
-                    node?.place(0, 0)
-                }
+            SubcomposeLayout(modifier = Modifier.testTag("layout"), state = layoutState.value) {
+                constraints ->
+                val node =
+                    if (needChild.value) {
+                        subcompose(Unit) { Box(Modifier.testTag("child")) }
+                            .first()
+                            .measure(constraints)
+                    } else {
+                        null
+                    }
+                layout(10, 10) { node?.place(0, 0) }
             }
         }
 
-        rule.onNodeWithTag("layout")
-            .onChildren().assertCountEquals(1)
+        rule.onNodeWithTag("layout").onChildren().assertCountEquals(1)
 
         needChild.value = false
 
-        rule.onNodeWithTag("layout")
-            .onChildren().assertCountEquals(0)
+        rule.onNodeWithTag("layout").onChildren().assertCountEquals(0)
     }
 
     @Test
@@ -2774,37 +2481,21 @@
             if (active) {
                 BoxWithConstraints {
                     BoxWithConstraints {
-                        DisposableEffect(Unit) {
-                            onDispose {
-                                disposeOrder += "inner 1"
-                            }
-                        }
+                        DisposableEffect(Unit) { onDispose { disposeOrder += "inner 1" } }
                     }
 
-                    DisposableEffect(Unit) {
-                        onDispose {
-                            disposeOrder += "outer"
-                        }
-                    }
+                    DisposableEffect(Unit) { onDispose { disposeOrder += "outer" } }
 
                     BoxWithConstraints {
-                        DisposableEffect(Unit) {
-                            onDispose {
-                                disposeOrder += "inner 2"
-                            }
-                        }
+                        DisposableEffect(Unit) { onDispose { disposeOrder += "inner 2" } }
                     }
                 }
             }
         }
 
-        rule.runOnIdle {
-            active = false
-        }
+        rule.runOnIdle { active = false }
 
-        rule.runOnIdle {
-            assertThat(disposeOrder).isExactly("inner 2", "outer", "inner 1")
-        }
+        rule.runOnIdle { assertThat(disposeOrder).isExactly("inner 2", "outer", "inner 1") }
     }
 
     @Test
@@ -2818,48 +2509,32 @@
             DisposableEffect(view) {
                 val listener = ViewTreeObserver.OnDrawListener { drawingCount++ }
                 view.viewTreeObserver.addOnDrawListener(listener)
-                onDispose {
-                    view.viewTreeObserver.removeOnDrawListener(listener)
-                }
+                onDispose { view.viewTreeObserver.removeOnDrawListener(listener) }
             }
-            SubcomposeLayout(state) {
-                layout(10, 10) { }
-            }
+            SubcomposeLayout(state) { layout(10, 10) {} }
         }
 
         rule.runOnIdle {
             drawingCount = 0
 
-            val handle = state.precompose(Unit) {
-                Box(Modifier.graphicsLayer().size(10.dp))
-            }
+            val handle = state.precompose(Unit) { Box(Modifier.graphicsLayer().size(10.dp)) }
             handle.premeasure(0, Constraints())
         }
 
-        rule.runOnIdle {
-            assertThat(drawingCount).isEqualTo(0)
-        }
+        rule.runOnIdle { assertThat(drawingCount).isEqualTo(0) }
     }
 
     private fun SubcomposeMeasureScope.measure(
         slotId: Any,
         constraints: Constraints,
         content: @Composable () -> Unit
-    ): Placeable =
-        subcompose(slotId, content).first().measure(constraints)
+    ): Placeable = subcompose(slotId, content).first().measure(constraints)
 
-    private fun composeItems(
-        state: SubcomposeLayoutState,
-        items: MutableState<List<Int>>
-    ) {
+    private fun composeItems(state: SubcomposeLayoutState, items: MutableState<List<Int>>) {
         rule.setContent {
             SubcomposeLayout(state) { constraints ->
                 items.value.forEach {
-                    subcompose(it) {
-                        ItemContent(it)
-                    }.forEach {
-                        it.measure(constraints)
-                    }
+                    subcompose(it) { ItemContent(it) }.forEach { it.measure(constraints) }
                 }
                 layout(10, 10) {}
             }
@@ -2868,10 +2543,7 @@
 
     @Composable
     private fun ItemContent(index: Int) {
-        Box(
-            Modifier
-                .fillMaxSize()
-                .testTag("$index"))
+        Box(Modifier.fillMaxSize().testTag("$index"))
     }
 
     private fun assertNodes(
@@ -2879,26 +2551,15 @@
         deactivated: List<Int> = emptyList(),
         disposed: List<Int> = emptyList()
     ) {
-        active.forEach {
-            rule.onNodeWithTag("$it")
-                .assertExists()
-        }
-        deactivated.forEach {
-            rule.onNodeWithTag("$it")
-                .assertIsDeactivated()
-        }
-        disposed.forEach {
-            rule.onNodeWithTag("$it")
-                .assertDoesNotExist()
-        }
+        active.forEach { rule.onNodeWithTag("$it").assertExists() }
+        deactivated.forEach { rule.onNodeWithTag("$it").assertIsDeactivated() }
+        disposed.forEach { rule.onNodeWithTag("$it").assertDoesNotExist() }
     }
 
     private fun SemanticsNodeInteraction.assertIsDetached() {
         assertDoesNotExist()
         // we want to verify the node is not deactivated, but such API does not exist yet
-        expectAssertionError {
-            assertIsDeactivated()
-        }
+        expectAssertionError { assertIsDeactivated() }
     }
 }
 
@@ -2911,9 +2572,7 @@
     Layout(content) { measurables, constraints ->
         val placeable = measurables.first().measure(constraints)
         placeable[FirstBaseline]
-        layout(placeable.width, placeable.height) {
-            placeable.place(0, 0)
-        }
+        layout(placeable.width, placeable.height) { placeable.place(0, 0) }
     }
 }
 
diff --git a/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/layout/TestRuleExecutesLayoutPassesWhenWaitingForIdleTest.kt b/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/layout/TestRuleExecutesLayoutPassesWhenWaitingForIdleTest.kt
index b1bbfb6..80e3046 100644
--- a/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/layout/TestRuleExecutesLayoutPassesWhenWaitingForIdleTest.kt
+++ b/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/layout/TestRuleExecutesLayoutPassesWhenWaitingForIdleTest.kt
@@ -42,8 +42,7 @@
 @RunWith(AndroidJUnit4::class)
 class TestRuleExecutesLayoutPassesWhenWaitingForIdleTest {
 
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
     @Test
     fun measure_animation() {
@@ -55,16 +54,12 @@
             Layout { _, _ ->
                 measures++
                 state
-                layout(1, 1) {
-                    placements++
-                }
+                layout(1, 1) { placements++ }
             }
 
             LaunchedEffect(Unit) {
                 for (i in 0 until numUpdates) {
-                    withFrameNanos {
-                        state++
-                    }
+                    withFrameNanos { state++ }
                 }
             }
         }
@@ -92,9 +87,7 @@
 
             LaunchedEffect(Unit) {
                 for (i in 0 until numUpdates) {
-                    withFrameNanos {
-                        state++
-                    }
+                    withFrameNanos { state++ }
                 }
             }
         }
@@ -115,12 +108,13 @@
         rule.setContent {
             AndroidView(
                 // Animate the constraints of the View.
-                modifier = Modifier.layout { measurable, _ ->
-                    val placeable = measurable.measure(Constraints.fixed(size, size))
-                    layout(placeable.width, placeable.height) {
-                        placeable.place(IntOffset.Zero)
-                    }
-                },
+                modifier =
+                    Modifier.layout { measurable, _ ->
+                        val placeable = measurable.measure(Constraints.fixed(size, size))
+                        layout(placeable.width, placeable.height) {
+                            placeable.place(IntOffset.Zero)
+                        }
+                    },
                 factory = {
                     object : View(it) {
                         override fun onMeasure(widthMeasureSpec: Int, heightMeasureSpec: Int) {
@@ -144,9 +138,7 @@
 
             LaunchedEffect(Unit) {
                 for (i in 0 until numUpdates) {
-                    withFrameNanos {
-                        size++
-                    }
+                    withFrameNanos { size++ }
                 }
             }
         }
@@ -173,9 +165,7 @@
                             Layout { _, _ ->
                                 nestedMeasures++
                                 state
-                                layout(1, 1) {
-                                    nestedPlacements++
-                                }
+                                layout(1, 1) { nestedPlacements++ }
                             }
                         }
                     }
@@ -184,9 +174,7 @@
 
             LaunchedEffect(Unit) {
                 for (i in 0 until numUpdates) {
-                    withFrameNanos {
-                        state++
-                    }
+                    withFrameNanos { state++ }
                 }
             }
         }
@@ -224,9 +212,7 @@
 
             LaunchedEffect(Unit) {
                 for (i in 0 until numUpdates) {
-                    withFrameNanos {
-                        state++
-                    }
+                    withFrameNanos { state++ }
                 }
             }
         }
@@ -245,27 +231,22 @@
         var placements = 0
         rule.setContent {
             SubcomposeLayout { constraints ->
-                val measurables = subcompose(null) {
-                    Layout { _, _ ->
-                        measures++
-                        state
-                        layout(1, 1) {
-                            placements++
+                val measurables =
+                    subcompose(null) {
+                        Layout { _, _ ->
+                            measures++
+                            state
+                            layout(1, 1) { placements++ }
                         }
                     }
-                }
                 val placeable = measurables.single().measure(constraints)
 
-                layout(1, 1) {
-                    placeable.place(IntOffset.Zero)
-                }
+                layout(1, 1) { placeable.place(IntOffset.Zero) }
             }
 
             LaunchedEffect(Unit) {
                 for (i in 0 until numUpdates) {
-                    withFrameNanos {
-                        state++
-                    }
+                    withFrameNanos { state++ }
                 }
             }
         }
@@ -284,27 +265,24 @@
         var placements = 0
         rule.setContent {
             SubcomposeLayout { constraints ->
-                val measurables = subcompose(null) {
-                    Layout { _, _ ->
-                        measures++
-                        layout(1, 1) {
-                            placements++
-                            state
+                val measurables =
+                    subcompose(null) {
+                        Layout { _, _ ->
+                            measures++
+                            layout(1, 1) {
+                                placements++
+                                state
+                            }
                         }
                     }
-                }
                 val placeable = measurables.single().measure(constraints)
 
-                layout(1, 1) {
-                    placeable.place(IntOffset.Zero)
-                }
+                layout(1, 1) { placeable.place(IntOffset.Zero) }
             }
 
             LaunchedEffect(Unit) {
                 for (i in 0 until numUpdates) {
-                    withFrameNanos {
-                        state++
-                    }
+                    withFrameNanos { state++ }
                 }
             }
         }
@@ -324,15 +302,14 @@
         rule.setContent {
             SubcomposeLayout { constraints ->
                 layout(1, 1) {
-                    val measurables = subcompose(null) {
-                        Layout { _, _ ->
-                            measures++
-                            state
-                            layout(1, 1) {
-                                placements++
+                    val measurables =
+                        subcompose(null) {
+                            Layout { _, _ ->
+                                measures++
+                                state
+                                layout(1, 1) { placements++ }
                             }
                         }
-                    }
                     val placeable = measurables.single().measure(constraints)
                     placeable.place(IntOffset.Zero)
                 }
@@ -340,9 +317,7 @@
 
             LaunchedEffect(Unit) {
                 for (i in 0 until numUpdates) {
-                    withFrameNanos {
-                        state++
-                    }
+                    withFrameNanos { state++ }
                 }
             }
         }
@@ -362,15 +337,16 @@
         rule.setContent {
             SubcomposeLayout { constraints ->
                 layout(1, 1) {
-                    val measurables = subcompose(null) {
-                        Layout { _, _ ->
-                            measures++
-                            layout(1, 1) {
-                                placements++
-                                state
+                    val measurables =
+                        subcompose(null) {
+                            Layout { _, _ ->
+                                measures++
+                                layout(1, 1) {
+                                    placements++
+                                    state
+                                }
                             }
                         }
-                    }
                     val placeable = measurables.single().measure(constraints)
                     placeable.place(IntOffset.Zero)
                 }
@@ -378,9 +354,7 @@
 
             LaunchedEffect(Unit) {
                 for (i in 0 until numUpdates) {
-                    withFrameNanos {
-                        state++
-                    }
+                    withFrameNanos { state++ }
                 }
             }
         }
diff --git a/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/layout/TogglePlacementInLookaheadScope.kt b/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/layout/TogglePlacementInLookaheadScope.kt
index 2b79e6d..6e2cfbb 100644
--- a/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/layout/TogglePlacementInLookaheadScope.kt
+++ b/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/layout/TogglePlacementInLookaheadScope.kt
@@ -52,11 +52,9 @@
 @MediumTest
 @RunWith(AndroidJUnit4::class)
 class TogglePlacementInLookaheadScope {
-    @get:Rule
-    val rule = createAndroidComposeRule<ComponentActivity>()
+    @get:Rule val rule = createAndroidComposeRule<ComponentActivity>()
 
-    @get:Rule
-    val excessiveAssertions = AndroidOwnerExtraAssertionsRule()
+    @get:Rule val excessiveAssertions = AndroidOwnerExtraAssertionsRule()
 
     @Test
     fun togglePlacement() {
@@ -65,12 +63,8 @@
         val placed = mutableListOf(false, false)
         rule.setContent {
             LookaheadScope {
-                Layout(content = {
-                    TestItem(
-                        newChildAdded,
-                        placed = placed
-                    )
-                }) { list, constraints ->
+                Layout(content = { TestItem(newChildAdded, placed = placed) }) { list, constraints
+                    ->
                     val placeables = list.map { it.measure(constraints) }
                     layout(placeables[0].width, placeables[0].height) {
                         if (place) {
@@ -88,9 +82,7 @@
         rule.waitForIdle()
         assertFalse(placed[0])
         assertFalse(placed[1])
-        rule.runOnIdle {
-            place = true
-        }
+        rule.runOnIdle { place = true }
         rule.waitForIdle()
         assertTrue(placed[0])
         assertTrue(placed[1])
@@ -121,9 +113,7 @@
             place = false
         }
         rule.waitForIdle()
-        rule.runOnIdle {
-            place = true
-        }
+        rule.runOnIdle { place = true }
         rule.waitForIdle()
     }
 
@@ -134,83 +124,91 @@
         val placed = mutableListOf(false, false)
         rule.setContent {
             LookaheadScope {
-                Layout(measurePolicy =
-                { list, constraints ->
-                    val placeables = list.map { it.measure(constraints) }
-                    layout(placeables[0].width, placeables[0].height) {
-                        if (place) {
-                            placeables.forEach { it.place(0, 0) }
+                Layout(
+                    measurePolicy = { list, constraints ->
+                        val placeables = list.map { it.measure(constraints) }
+                        layout(placeables[0].width, placeables[0].height) {
+                            if (place) {
+                                placeables.forEach { it.place(0, 0) }
+                            }
                         }
-                    }
-                }, content = {
-                    Card {
-                        Column {
-                            Image(
-                                painter = ColorPainter(Color.Blue),
-                                contentDescription = null,
-                                contentScale = ContentScale.Crop,
-                                modifier = Modifier
-                                    .fillMaxWidth()
-                                    .aspectRatio(16f / 9f)
-                            )
+                    },
+                    content = {
+                        Card {
+                            Column {
+                                Image(
+                                    painter = ColorPainter(Color.Blue),
+                                    contentDescription = null,
+                                    contentScale = ContentScale.Crop,
+                                    modifier = Modifier.fillMaxWidth().aspectRatio(16f / 9f)
+                                )
 
-                            ReusableContent(reusableContentKey) {
-                                Row(
-                                    horizontalArrangement = Arrangement.spacedBy(4.dp),
-                                    verticalAlignment = Alignment.CenterVertically,
-                                    modifier = Modifier
-                                        .padding(
-                                            start = 12.dp,
-                                            top = 8.dp,
-                                            end = 12.dp,
-                                            bottom = 12.dp
-                                        )
-                                        .fillMaxWidth()
-                                        .layout { measurable, constraints ->
-                                            measurable
-                                                .measure(constraints)
-                                                .run {
-                                                    layout(width, height) {
-                                                        if (isLookingAhead) {
-                                                            placed[0] = true
-                                                        } else {
-                                                            placed[1] = true
+                                ReusableContent(reusableContentKey) {
+                                    Row(
+                                        horizontalArrangement = Arrangement.spacedBy(4.dp),
+                                        verticalAlignment = Alignment.CenterVertically,
+                                        modifier =
+                                            Modifier.padding(
+                                                    start = 12.dp,
+                                                    top = 8.dp,
+                                                    end = 12.dp,
+                                                    bottom = 12.dp
+                                                )
+                                                .fillMaxWidth()
+                                                .layout { measurable, constraints ->
+                                                    measurable.measure(constraints).run {
+                                                        layout(width, height) {
+                                                            if (isLookingAhead) {
+                                                                placed[0] = true
+                                                            } else {
+                                                                placed[1] = true
+                                                            }
+                                                            @Suppress("UNUSED_EXPRESSION")
+                                                            reusableContentKey // force a read
+                                                            place(0, 0)
                                                         }
-                                                        @Suppress("UNUSED_EXPRESSION")
-                                                        reusableContentKey // force a read
-                                                        place(0, 0)
                                                     }
                                                 }
-                                        }
-                                ) {
-
-                                    Text(
-                                        text = "Static text",
-                                        color = Color.White,
-                                        modifier = Modifier
-                                            .background(Color.Gray, RoundedCornerShape(2.dp))
-                                            .padding(
-                                                start = 3.dp, end = 3.dp,
-                                                top = 0.5.dp, bottom = 1.dp
-                                            )
-                                    )
-
-                                    val badgeModifier = Modifier
-                                        .border(0.5f.dp, Color.Black, RoundedCornerShape(2.dp))
-                                        .padding(
-                                            start = 3.dp, end = 3.dp,
-                                            top = 0.5.dp, bottom = 1.dp
+                                    ) {
+                                        Text(
+                                            text = "Static text",
+                                            color = Color.White,
+                                            modifier =
+                                                Modifier.background(
+                                                        Color.Gray,
+                                                        RoundedCornerShape(2.dp)
+                                                    )
+                                                    .padding(
+                                                        start = 3.dp,
+                                                        end = 3.dp,
+                                                        top = 0.5.dp,
+                                                        bottom = 1.dp
+                                                    )
                                         )
 
-                                    Text(
-                                        text = "Updated",
-                                        modifier = badgeModifier,
-                                    )
+                                        val badgeModifier =
+                                            Modifier.border(
+                                                    0.5f.dp,
+                                                    Color.Black,
+                                                    RoundedCornerShape(2.dp)
+                                                )
+                                                .padding(
+                                                    start = 3.dp,
+                                                    end = 3.dp,
+                                                    top = 0.5.dp,
+                                                    bottom = 1.dp
+                                                )
+
+                                        Text(
+                                            text = "Updated",
+                                            modifier = badgeModifier,
+                                        )
+                                    }
                                 }
                             }
                         }
                     }
-                })
+                )
             }
         }
         assertTrue(placed[0])
@@ -218,18 +216,12 @@
         placed[0] = false
         placed[1] = false
 
-        rule.runOnIdle {
-            place = false
-        }
-        rule.runOnIdle {
-            reusableContentKey++
-        }
+        rule.runOnIdle { place = false }
+        rule.runOnIdle { reusableContentKey++ }
         assertFalse(placed[0])
         assertFalse(placed[1])
 
-        rule.runOnIdle {
-            place = true
-        }
+        rule.runOnIdle { place = true }
         rule.waitForIdle()
         assertTrue(placed[0])
         assertTrue(placed[1])
@@ -248,52 +240,44 @@
                     painter = ColorPainter(Color.Blue),
                     contentDescription = null,
                     contentScale = ContentScale.Crop,
-                    modifier = Modifier
-                        .fillMaxWidth()
-                        .aspectRatio(16f / 9f)
+                    modifier = Modifier.fillMaxWidth().aspectRatio(16f / 9f)
                 )
 
                 Row(
                     horizontalArrangement = Arrangement.spacedBy(4.dp),
                     verticalAlignment = Alignment.CenterVertically,
-                    modifier = Modifier
-                        .padding(start = 12.dp, top = 8.dp, end = 12.dp, bottom = 12.dp)
-                        .fillMaxWidth()
+                    modifier =
+                        Modifier.padding(start = 12.dp, top = 8.dp, end = 12.dp, bottom = 12.dp)
+                            .fillMaxWidth()
                 ) {
-
                     Text(
                         text = "Static text",
                         color = Color.White,
-                        modifier = Modifier
-                            .background(Color.Gray, RoundedCornerShape(2.dp))
-                            .padding(
-                                start = 3.dp, end = 3.dp,
-                                top = 0.5.dp, bottom = 1.dp
-                            )
+                        modifier =
+                            Modifier.background(Color.Gray, RoundedCornerShape(2.dp))
+                                .padding(start = 3.dp, end = 3.dp, top = 0.5.dp, bottom = 1.dp)
                     )
 
-                    val badgeModifier = Modifier
-                        .border(0.5f.dp, Color.Black, RoundedCornerShape(2.dp))
-                        .padding(
-                            start = 3.dp, end = 3.dp,
-                            top = 0.5.dp, bottom = 1.dp
-                        )
+                    val badgeModifier =
+                        Modifier.border(0.5f.dp, Color.Black, RoundedCornerShape(2.dp))
+                            .padding(start = 3.dp, end = 3.dp, top = 0.5.dp, bottom = 1.dp)
 
                     if (showNewText) {
                         Text(
                             text = "New",
-                            modifier = badgeModifier.layout { measurable, constraints ->
-                                measurable.measure(constraints).run {
-                                    layout(width, height) {
-                                        if (isLookingAhead) {
-                                            placed[0] = true
-                                        } else {
-                                            placed[1] = true
+                            modifier =
+                                badgeModifier.layout { measurable, constraints ->
+                                    measurable.measure(constraints).run {
+                                        layout(width, height) {
+                                            if (isLookingAhead) {
+                                                placed[0] = true
+                                            } else {
+                                                placed[1] = true
+                                            }
+                                            place(0, 0)
                                         }
-                                        place(0, 0)
                                     }
-                                }
-                            },
+                                },
                         )
                     }
 
diff --git a/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/modifier/CompositionLocalMapInjectionTest.kt b/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/modifier/CompositionLocalMapInjectionTest.kt
index c04b52d..ab6198e 100644
--- a/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/modifier/CompositionLocalMapInjectionTest.kt
+++ b/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/modifier/CompositionLocalMapInjectionTest.kt
@@ -70,8 +70,7 @@
 @RunWith(AndroidJUnit4::class)
 class CompositionLocalMapInjectionTest {
 
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
     @Test
     fun consumeInDraw() {
@@ -114,9 +113,7 @@
         }
         assertThat(node.int).isEqualTo(state)
         state = 2
-        rule.runOnIdle {
-            assertThat(node.int).isEqualTo(state)
-        }
+        rule.runOnIdle { assertThat(node.int).isEqualTo(state) }
     }
 
     @Test
@@ -130,9 +127,7 @@
         }
         assertThat(node.int).isEqualTo(state)
         state = 2
-        rule.runOnIdle {
-            assertThat(node.int).isEqualTo(state)
-        }
+        rule.runOnIdle { assertThat(node.int).isEqualTo(state) }
     }
 
     @Test
@@ -146,9 +141,7 @@
         }
         assertThat(node.int).isEqualTo(state)
         state = 2
-        rule.runOnIdle {
-            assertThat(node.int).isEqualTo(state)
-        }
+        rule.runOnIdle { assertThat(node.int).isEqualTo(state) }
     }
 
     @Test
@@ -192,9 +185,7 @@
         }
         assertThat(node.int).isEqualTo(state)
         state = 2
-        rule.runOnIdle {
-            assertThat(node.int).isEqualTo(state)
-        }
+        rule.runOnIdle { assertThat(node.int).isEqualTo(state) }
     }
 
     @Test
@@ -208,9 +199,7 @@
         }
         assertThat(node.int).isEqualTo(state)
         state = 2
-        rule.runOnIdle {
-            assertThat(node.int).isEqualTo(state)
-        }
+        rule.runOnIdle { assertThat(node.int).isEqualTo(state) }
     }
 
     @Test
@@ -224,9 +213,7 @@
         }
         assertThat(node.int).isEqualTo(state)
         state = 2
-        rule.runOnIdle {
-            assertThat(node.int).isEqualTo(state)
-        }
+        rule.runOnIdle { assertThat(node.int).isEqualTo(state) }
     }
 }
 
@@ -235,14 +222,18 @@
 inline fun <reified T : Modifier.Node> modifierOf(crossinline fn: () -> T) =
     object : ModifierNodeElement<T>() {
         override fun create() = fn()
+
         override fun hashCode() = System.identityHashCode(this)
+
         override fun equals(other: Any?) = other === this
+
         override fun update(node: T) {}
     }
 
 class ConsumeInDrawNode : CompositionLocalConsumerModifierNode, DrawModifierNode, Modifier.Node() {
     var view: View? = null
     var int: Int? = null
+
     override fun ContentDrawScope.draw() {
         // Consume Static local
         view = currentValueOf(LocalView)
@@ -252,11 +243,10 @@
 }
 
 class ConsumeInLayoutNode :
-    CompositionLocalConsumerModifierNode,
-    LayoutModifierNode,
-    Modifier.Node() {
+    CompositionLocalConsumerModifierNode, LayoutModifierNode, Modifier.Node() {
     var view: View? = null
     var int: Int? = null
+
     override fun MeasureScope.measure(
         measurable: Measurable,
         constraints: Constraints
@@ -266,9 +256,7 @@
         // Consume Freshly Provided Local
         int = currentValueOf(SomeLocal)
         val placeable = measurable.measure(constraints)
-        return layout(constraints.minWidth, constraints.maxWidth) {
-            placeable.place(0, 0)
-        }
+        return layout(constraints.minWidth, constraints.maxWidth) { placeable.place(0, 0) }
     }
 }
 
@@ -276,15 +264,18 @@
     CompositionLocalConsumerModifierNode, ObserverModifierNode, Modifier.Node() {
     var view: View? = null
     var int: Int? = null
+
     private fun readLocals() {
         // Consume Static local
         view = currentValueOf(LocalView)
         // Consume Freshly Provided Local
         int = currentValueOf(SomeLocal)
     }
+
     override fun onAttach() {
         observeReads { readLocals() }
     }
+
     override fun onObservedReadsChanged() {
         observeReads { readLocals() }
     }
@@ -312,12 +303,12 @@
             set(density, SetDensity)
             set(layoutDirection, SetLayoutDirection)
             set(viewConfiguration, SetViewConfiguration)
-            @OptIn(ExperimentalComposeUiApi::class)
-            set(compositeKeyHash, SetCompositeKeyHash)
+            @OptIn(ExperimentalComposeUiApi::class) set(compositeKeyHash, SetCompositeKeyHash)
         },
         // The old version of Layout called a function called "materializerOf". The function below
         // has the same JVM signature as that function used to have, so the code that this source
-        // generates will be essentially identical to what will have been generated in older versions
+        // generates will be essentially identical to what will have been generated in older
+        // versions
         // of UI, despite this name being different now.
         skippableUpdate = materializerOfWithCompositionLocalInjection(modifier),
         content = content
@@ -327,10 +318,7 @@
 @Suppress("NOTHING_TO_INLINE")
 @Composable
 @UiComposable
-internal inline fun OldLayout(
-    modifier: Modifier = Modifier,
-    measurePolicy: MeasurePolicy
-) {
+internal inline fun OldLayout(modifier: Modifier = Modifier, measurePolicy: MeasurePolicy) {
     val compositeKeyHash = currentCompositeKeyHash
     val density = LocalDensity.current
     val layoutDirection = LocalLayoutDirection.current
@@ -348,19 +336,21 @@
             set(layoutDirection, SetLayoutDirection)
             set(viewConfiguration, SetViewConfiguration)
             set(materialized, SetModifier)
-            @OptIn(ExperimentalComposeUiApi::class)
-            set(compositeKeyHash, SetCompositeKeyHash)
+            @OptIn(ExperimentalComposeUiApi::class) set(compositeKeyHash, SetCompositeKeyHash)
         },
     )
 }
+
 private val EmptyBoxMeasurePolicy = MeasurePolicy { _, constraints ->
     layout(constraints.minWidth, constraints.minHeight) {}
 }
 
-@Composable fun OldBoxSkippableUpdate(modifier: Modifier = Modifier) {
-    OldLayoutSkippableUpdate({ }, modifier, EmptyBoxMeasurePolicy)
+@Composable
+fun OldBoxSkippableUpdate(modifier: Modifier = Modifier) {
+    OldLayoutSkippableUpdate({}, modifier, EmptyBoxMeasurePolicy)
 }
 
-@Composable fun OldBox(modifier: Modifier = Modifier) {
+@Composable
+fun OldBox(modifier: Modifier = Modifier) {
     OldLayout(modifier, EmptyBoxMeasurePolicy)
 }
diff --git a/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/modifier/ModifierLocalMultiLayoutNodeTest.kt b/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/modifier/ModifierLocalMultiLayoutNodeTest.kt
index cd34e19..15c185e 100644
--- a/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/modifier/ModifierLocalMultiLayoutNodeTest.kt
+++ b/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/modifier/ModifierLocalMultiLayoutNodeTest.kt
@@ -36,8 +36,7 @@
 @MediumTest
 @RunWith(AndroidJUnit4::class)
 class ModifierLocalMultiLayoutNodeTest {
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
     private val defaultValue = "Default Value"
 
@@ -101,8 +100,7 @@
         rule.setContent {
             Box(Modifier.modifierLocalProvider(localString) { providedValue1 }) {
                 Box(
-                    Modifier
-                        .modifierLocalProvider(localString) { providedValue2 }
+                    Modifier.modifierLocalProvider(localString) { providedValue2 }
                         .modifierLocalConsumer { readValue = localString.current }
                 )
             }
@@ -232,11 +230,7 @@
                     if (useFirstValue) value1 else value2
                 }
             ) {
-                Box(
-                    Modifier.modifierLocalConsumer {
-                        readString = localString.current
-                    }
-                )
+                Box(Modifier.modifierLocalConsumer { readString = localString.current })
             }
         }
 
@@ -294,7 +288,6 @@
                         Modifier.modifierLocalProvider(localString) { providedValue }
                     }
                 )
-
             ) {
                 Box(Modifier.modifierLocalConsumer { readString = localString.current })
             }
diff --git a/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/modifier/ModifierLocalProviderConsumerOrderTest.kt b/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/modifier/ModifierLocalProviderConsumerOrderTest.kt
index de0a0a9..54a1625 100644
--- a/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/modifier/ModifierLocalProviderConsumerOrderTest.kt
+++ b/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/modifier/ModifierLocalProviderConsumerOrderTest.kt
@@ -36,8 +36,7 @@
 @RunWith(AndroidJUnit4::class)
 class ModifierLocalProviderConsumerOrderTest {
 
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
     private val defaultValue = "Default Value"
     private val modifierLocal = modifierLocalOf { defaultValue }
@@ -85,15 +84,18 @@
         var consumerValue by mutableStateOf("")
         rule.setContent {
             Box(ProviderModifier(modifierLocal) { "Outer" }) {
-                val modifier = if (useInnerModifier) {
-                    ProviderModifier(modifierLocal) { "Inner" }
-                } else {
-                    Modifier
-                }
+                val modifier =
+                    if (useInnerModifier) {
+                        ProviderModifier(modifierLocal) { "Inner" }
+                    } else {
+                        Modifier
+                    }
                 Box(modifier) {
-                    Box(ProviderConsumerModifier(modifierLocal, { "" }) {
-                        consumerValue = modifierLocal.current
-                    })
+                    Box(
+                        ProviderConsumerModifier(modifierLocal, { "" }) {
+                            consumerValue = modifierLocal.current
+                        }
+                    )
                 }
             }
         }
@@ -105,9 +107,7 @@
             useInnerModifier = false
         }
 
-        rule.runOnIdle {
-            assertThat(consumerValue).isEqualTo("Outer")
-        }
+        rule.runOnIdle { assertThat(consumerValue).isEqualTo("Outer") }
     }
 
     @Test
@@ -115,15 +115,18 @@
         var useProvider by mutableStateOf(true)
         var consumerValue by mutableStateOf("")
         rule.setContent {
-            val modifier = if (useProvider) {
-                ProviderModifier(modifierLocal) { "Provided Value" }
-            } else {
-                Modifier
-            }
+            val modifier =
+                if (useProvider) {
+                    ProviderModifier(modifierLocal) { "Provided Value" }
+                } else {
+                    Modifier
+                }
             Box(modifier) {
-                Box(ProviderConsumerModifier(modifierLocal, { "" }) {
-                    consumerValue = modifierLocal.current
-                })
+                Box(
+                    ProviderConsumerModifier(modifierLocal, { "" }) {
+                        consumerValue = modifierLocal.current
+                    }
+                )
             }
         }
 
@@ -134,9 +137,7 @@
             useProvider = false
         }
 
-        rule.runOnIdle {
-            assertThat(consumerValue).isEqualTo(defaultValue)
-        }
+        rule.runOnIdle { assertThat(consumerValue).isEqualTo(defaultValue) }
     }
 
     @Test
@@ -145,15 +146,18 @@
         var consumerValue by mutableStateOf("")
         rule.setContent {
             Box(ProviderModifier(modifierLocal) { "Outer" }) {
-                val modifier = if (useInnerModifier) {
-                    ProviderModifier(modifierLocal) { "Inner" }
-                } else {
-                    Modifier
-                }
+                val modifier =
+                    if (useInnerModifier) {
+                        ProviderModifier(modifierLocal) { "Inner" }
+                    } else {
+                        Modifier
+                    }
                 Box(modifier) {
-                    Box(ProviderConsumerModifier(modifierLocal, { "" }) {
-                        consumerValue = modifierLocal.current
-                    })
+                    Box(
+                        ProviderConsumerModifier(modifierLocal, { "" }) {
+                            consumerValue = modifierLocal.current
+                        }
+                    )
                 }
             }
         }
@@ -165,9 +169,7 @@
             useInnerModifier = true
         }
 
-        rule.runOnIdle {
-            assertThat(consumerValue).isEqualTo("Inner")
-        }
+        rule.runOnIdle { assertThat(consumerValue).isEqualTo("Inner") }
     }
 
     @Test
@@ -175,15 +177,18 @@
         var useProvider by mutableStateOf(false)
         var consumerValue by mutableStateOf("")
         rule.setContent {
-            val modifier = if (useProvider) {
-                ProviderModifier(modifierLocal) { "Provided Value" }
-            } else {
-                Modifier
-            }
+            val modifier =
+                if (useProvider) {
+                    ProviderModifier(modifierLocal) { "Provided Value" }
+                } else {
+                    Modifier
+                }
             Box(modifier) {
-                Box(ProviderConsumerModifier(modifierLocal, { "" }) {
-                    consumerValue = modifierLocal.current
-                })
+                Box(
+                    ProviderConsumerModifier(modifierLocal, { "" }) {
+                        consumerValue = modifierLocal.current
+                    }
+                )
             }
         }
 
@@ -194,9 +199,7 @@
             useProvider = true
         }
 
-        rule.runOnIdle {
-            assertThat(consumerValue).isEqualTo("Provided Value")
-        }
+        rule.runOnIdle { assertThat(consumerValue).isEqualTo("Provided Value") }
     }
 
     @Test
@@ -216,15 +219,11 @@
             providedValue = "Value 2"
         }
 
-        rule.runOnIdle {
-            assertThat(consumerValue.value).isEqualTo("Value 2")
-        }
+        rule.runOnIdle { assertThat(consumerValue.value).isEqualTo("Value 2") }
     }
 }
 
-/**
- * This is extracted out so that it can be skipped.
- */
+/** This is extracted out so that it can be skipped. */
 @Composable
 fun ConsumeLocal(
     modifierLocal: ProvidableModifierLocal<String>,
@@ -243,6 +242,7 @@
     private val consumer: ModifierLocalReadScope.() -> Unit
 ) : ModifierLocalConsumer, ModifierLocalProvider<T> {
     override val value by derivedStateOf(value)
+
     override fun onModifierLocalsUpdated(scope: ModifierLocalReadScope) {
         consumer(scope)
     }
diff --git a/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/modifier/ModifierLocalSameLayoutNodeTest.kt b/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/modifier/ModifierLocalSameLayoutNodeTest.kt
index a3c7abd..baa0bd6 100644
--- a/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/modifier/ModifierLocalSameLayoutNodeTest.kt
+++ b/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/modifier/ModifierLocalSameLayoutNodeTest.kt
@@ -38,8 +38,7 @@
 @RunWith(AndroidJUnit4::class)
 class ModifierLocalSameLayoutNodeTest {
 
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
     private val defaultValue = "Default Value"
 
@@ -63,13 +62,7 @@
         // Arrange.
         val localString = modifierLocalOf { defaultValue }
         lateinit var readValue: String
-        rule.setContent {
-            Box(
-                Modifier.modifierLocalConsumer {
-                    readValue = localString.current
-                }
-            )
-        }
+        rule.setContent { Box(Modifier.modifierLocalConsumer { readValue = localString.current }) }
 
         // Assert.
         rule.runOnIdle { assertThat(readValue).isEqualTo(defaultValue) }
@@ -83,8 +76,7 @@
         lateinit var readValue: String
         rule.setContent {
             Box(
-                Modifier
-                    .modifierLocalConsumer { readValue = localString.current }
+                Modifier.modifierLocalConsumer { readValue = localString.current }
                     .modifierLocalProvider(localString) { providedValue }
             )
         }
@@ -101,8 +93,7 @@
         lateinit var readValue: String
         rule.setContent {
             Box(
-                Modifier
-                    .modifierLocalProvider(localString) { providedValue }
+                Modifier.modifierLocalProvider(localString) { providedValue }
                     .modifierLocalConsumer { readValue = localString.current }
             )
         }
@@ -119,8 +110,7 @@
         lateinit var readValue: String
         rule.setContent {
             Box(
-                Modifier
-                    .modifierLocalProvider(localString) { providedValue }
+                Modifier.modifierLocalProvider(localString) { providedValue }
                     .size(100.dp)
                     .modifierLocalConsumer { readValue = localString.current }
             )
@@ -139,8 +129,7 @@
         lateinit var readValue: String
         rule.setContent {
             Box(
-                Modifier
-                    .modifierLocalProvider(localString) { providedValue1 }
+                Modifier.modifierLocalProvider(localString) { providedValue1 }
                     .modifierLocalProvider(localString) { providedValue2 }
                     .modifierLocalConsumer { readValue = localString.current }
             )
@@ -161,8 +150,7 @@
         lateinit var readValue2: String
         rule.setContent {
             Box(
-                Modifier
-                    .modifierLocalProvider(localString1) { providedValue1 }
+                Modifier.modifierLocalProvider(localString1) { providedValue1 }
                     .modifierLocalProvider(localString2) { providedValue2 }
                     .modifierLocalConsumer {
                         readValue1 = localString1.current
@@ -189,8 +177,7 @@
         var readInteger = 0
         rule.setContent {
             Box(
-                Modifier
-                    .modifierLocalProvider(localString) { providedString }
+                Modifier.modifierLocalProvider(localString) { providedString }
                     .modifierLocalProvider(localInteger) { providedInteger }
                     .modifierLocalConsumer {
                         readString = localString.current
@@ -216,8 +203,7 @@
         lateinit var readString: String
         rule.setContent {
             Box(
-                Modifier
-                    .then(
+                Modifier.then(
                         if (useFirstProvider) {
                             Modifier.modifierLocalProvider(localString) { provider1value }
                         } else {
@@ -246,8 +232,7 @@
 
         rule.setContent {
             Box(
-                Modifier
-                    .then(
+                Modifier.then(
                         if (useFirstProvider) {
                             Modifier.modifierLocalProvider(localString) { provider1value }
                         } else {
@@ -263,9 +248,7 @@
 
         // Assert.
         rule.runOnIdle {
-            assertThat(receivedValues)
-                .containsExactly(provider1value, provider2value)
-                .inOrder()
+            assertThat(receivedValues).containsExactly(provider1value, provider2value).inOrder()
         }
     }
 
@@ -277,8 +260,7 @@
         lateinit var receivedValue: String
         rule.setContent {
             Box(
-                Modifier
-                    .then(
+                Modifier.then(
                         if (hasProvider) {
                             Modifier.modifierLocalProvider(modifierLocal) { "ProvidedValue" }
                         } else Modifier
@@ -303,8 +285,7 @@
         rule.setContent {
             if (includeComposable) {
                 Box(
-                    Modifier
-                        .modifierLocalProvider(modifierLocal) { "ProvidedValue" }
+                    Modifier.modifierLocalProvider(modifierLocal) { "ProvidedValue" }
                         .modifierLocalConsumer { receivedValue = modifierLocal.current }
                 )
             }
@@ -327,8 +308,9 @@
         lateinit var readString: String
         rule.setContent {
             Box(
-                Modifier
-                    .modifierLocalProvider(localString) { if (useFirstValue) value1 else value2 }
+                Modifier.modifierLocalProvider(localString) {
+                        if (useFirstValue) value1 else value2
+                    }
                     .modifierLocalConsumer { readString = localString.current }
             )
         }
@@ -350,8 +332,7 @@
         lateinit var readString: String
         rule.setContent {
             Box(
-                Modifier
-                    .modifierLocalProvider(localString) { providedByParent1 }
+                Modifier.modifierLocalProvider(localString) { providedByParent1 }
                     .then(
                         if (secondParentAdded) {
                             Modifier.modifierLocalProvider(localString) { providedByParent2 }
@@ -379,8 +360,7 @@
         lateinit var readString: String
         rule.setContent {
             Box(
-                Modifier
-                    .then(
+                Modifier.then(
                         if (providerRemoved) {
                             Modifier
                         } else {
@@ -408,8 +388,7 @@
         lateinit var readString: String
         rule.setContent {
             Box(
-                Modifier
-                    .modifierLocalProvider(localString) { providedByParent1 }
+                Modifier.modifierLocalProvider(localString) { providedByParent1 }
                     .then(
                         if (secondParentRemoved) {
                             Modifier
@@ -438,8 +417,7 @@
         lateinit var readString: String
         rule.setContent {
             Box(
-                Modifier
-                    .then(if (providerMoved) Modifier else providerModifier)
+                Modifier.then(if (providerMoved) Modifier else providerModifier)
                     .modifierLocalConsumer { readString = localString.current }
                     .then(if (providerMoved) providerModifier else Modifier)
             )
@@ -463,8 +441,7 @@
         lateinit var readString: String
         rule.setContent {
             Box(
-                Modifier
-                    .modifierLocalProvider(localString) { providedByParent1 }
+                Modifier.modifierLocalProvider(localString) { providedByParent1 }
                     .then(if (secondParentMoved) Modifier else parent2Modifier)
                     .modifierLocalConsumer { readString = localString.current }
                     .then(if (secondParentMoved) parent2Modifier else Modifier)
@@ -488,8 +465,7 @@
         lateinit var readString: String
         rule.setContent {
             Box(
-                Modifier
-                    .then(if (providerMoved) Modifier else providerModifier)
+                Modifier.then(if (providerMoved) Modifier else providerModifier)
                     .size(100.dp)
                     .then(if (providerMoved) providerModifier else Modifier)
                     .modifierLocalConsumer { readString = localString.current }
@@ -503,9 +479,7 @@
         rule.runOnIdle { assertThat(readString).isEqualTo(providedValue) }
     }
 
-    /**
-     * We don't want the same modifier local invalidated multiple times for the same change.
-     */
+    /** We don't want the same modifier local invalidated multiple times for the same change. */
     @Test
     fun modifierLocalCallsOnce() {
         var calls = 0
@@ -513,21 +487,18 @@
         val provider1 = Modifier.modifierLocalProvider(localString) { "ProvidedValue" }
         val provider2 = Modifier.modifierLocalProvider(localString) { "Another ProvidedValue" }
         var providerChoice by mutableStateOf(provider1)
-        val consumer = Modifier.modifierLocalConsumer {
-            localString.current // read the value
-            calls++
-        }
-        rule.setContent {
-            Box(providerChoice.then(consumer))
-        }
+        val consumer =
+            Modifier.modifierLocalConsumer {
+                localString.current // read the value
+                calls++
+            }
+        rule.setContent { Box(providerChoice.then(consumer)) }
 
         rule.runOnIdle {
             calls = 0
             providerChoice = provider2
         }
 
-        rule.runOnIdle {
-            assertThat(calls).isEqualTo(1)
-        }
+        rule.runOnIdle { assertThat(calls).isEqualTo(1) }
     }
 }
diff --git a/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/modifier/ModifierNodeReuseAndDeactivationTest.kt b/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/modifier/ModifierNodeReuseAndDeactivationTest.kt
index 21a972d..7019183 100644
--- a/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/modifier/ModifierNodeReuseAndDeactivationTest.kt
+++ b/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/modifier/ModifierNodeReuseAndDeactivationTest.kt
@@ -79,8 +79,7 @@
 @RunWith(AndroidJUnit4::class)
 class ModifierNodeReuseAndDeactivationTest {
 
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
     @Test
     fun reusingCallsResetOnModifier() {
@@ -88,20 +87,14 @@
 
         var resetCalls = 0
 
-        rule.setContent {
-            ReusableContent(reuseKey) {
-                TestLayout(onReset = { resetCalls++ })
-            }
-        }
+        rule.setContent { ReusableContent(reuseKey) { TestLayout(onReset = { resetCalls++ }) } }
 
         rule.runOnIdle {
             assertThat(resetCalls).isEqualTo(0)
             reuseKey = 1
         }
 
-        rule.runOnIdle {
-            assertThat(resetCalls).isEqualTo(1)
-        }
+        rule.runOnIdle { assertThat(resetCalls).isEqualTo(1) }
     }
 
     @Test
@@ -110,20 +103,14 @@
 
         var createCalls = 0
 
-        rule.setContent {
-            ReusableContent(reuseKey) {
-                TestLayout(onCreate = { createCalls++ })
-            }
-        }
+        rule.setContent { ReusableContent(reuseKey) { TestLayout(onCreate = { createCalls++ }) } }
 
         rule.runOnIdle {
             assertThat(createCalls).isEqualTo(1)
             reuseKey = 1
         }
 
-        rule.runOnIdle {
-            assertThat(createCalls).isEqualTo(1)
-        }
+        rule.runOnIdle { assertThat(createCalls).isEqualTo(1) }
     }
 
     @Test
@@ -133,9 +120,7 @@
 
         rule.setContent {
             ReusableContentHost(active) {
-                ReusableContent(0) {
-                    TestLayout(onReset = { resetCalls++ })
-                }
+                ReusableContent(0) { TestLayout(onReset = { resetCalls++ }) }
             }
         }
 
@@ -144,9 +129,7 @@
             active = false
         }
 
-        rule.runOnIdle {
-            assertThat(resetCalls).isEqualTo(1)
-        }
+        rule.runOnIdle { assertThat(resetCalls).isEqualTo(1) }
     }
 
     @Test
@@ -156,23 +139,15 @@
 
         rule.setContent {
             ReusableContentHost(active) {
-                ReusableContent(0) {
-                    TestLayout(onReset = { resetCalls++ })
-                }
+                ReusableContent(0) { TestLayout(onReset = { resetCalls++ }) }
             }
         }
 
-        rule.runOnIdle {
-            active = false
-        }
+        rule.runOnIdle { active = false }
 
-        rule.runOnIdle {
-            active = true
-        }
+        rule.runOnIdle { active = true }
 
-        rule.runOnIdle {
-            assertThat(resetCalls).isEqualTo(1)
-        }
+        rule.runOnIdle { assertThat(resetCalls).isEqualTo(1) }
     }
 
     @Test
@@ -181,12 +156,7 @@
         var updateCalls = 0
 
         rule.setContent {
-            ReusableContent(reuseKey) {
-                TestLayout(
-                    key = 1,
-                    onUpdate = { updateCalls++ }
-                )
-            }
+            ReusableContent(reuseKey) { TestLayout(key = 1, onUpdate = { updateCalls++ }) }
         }
 
         rule.runOnIdle {
@@ -194,9 +164,7 @@
             reuseKey++
         }
 
-        rule.runOnIdle {
-            assertThat(updateCalls).isEqualTo(0)
-        }
+        rule.runOnIdle { assertThat(updateCalls).isEqualTo(0) }
     }
 
     @Test
@@ -205,12 +173,7 @@
         var updateCalls = 0
 
         rule.setContent {
-            ReusableContent(reuseKey) {
-                TestLayout(
-                    key = reuseKey,
-                    onUpdate = { updateCalls++ }
-                )
-            }
+            ReusableContent(reuseKey) { TestLayout(key = reuseKey, onUpdate = { updateCalls++ }) }
         }
 
         rule.runOnIdle {
@@ -218,9 +181,7 @@
             reuseKey++
         }
 
-        rule.runOnIdle {
-            assertThat(updateCalls).isEqualTo(1)
-        }
+        rule.runOnIdle { assertThat(updateCalls).isEqualTo(1) }
     }
 
     @Test
@@ -259,12 +220,16 @@
     @Test
     fun unchangedNodesAreDetachedAndReattachedWhenReused() {
         val nodeInstance = object : Modifier.Node() {}
-        val element = object : ModifierNodeElement<Modifier.Node>() {
-            override fun create(): Modifier.Node = nodeInstance
-            override fun hashCode(): Int = System.identityHashCode(this)
-            override fun equals(other: Any?) = (other === this)
-            override fun update(node: Modifier.Node) { }
-        }
+        val element =
+            object : ModifierNodeElement<Modifier.Node>() {
+                override fun create(): Modifier.Node = nodeInstance
+
+                override fun hashCode(): Int = System.identityHashCode(this)
+
+                override fun equals(other: Any?) = (other === this)
+
+                override fun update(node: Modifier.Node) {}
+            }
 
         var active by mutableStateOf(true)
         rule.setContent {
@@ -279,27 +244,30 @@
                             modifier = element
                         }
                     },
-                    update = { },
-                    content = { }
+                    update = {},
+                    content = {}
                 )
             }
         }
 
         rule.runOnIdle {
             assertWithMessage("Modifier Node was not attached when being initially created")
-                .that(nodeInstance.isAttached).isTrue()
+                .that(nodeInstance.isAttached)
+                .isTrue()
         }
 
         active = false
         rule.runOnIdle {
             assertWithMessage("Modifier Node should be detached when its LayoutNode is deactivated")
-                .that(nodeInstance.isAttached).isFalse()
+                .that(nodeInstance.isAttached)
+                .isFalse()
         }
 
         active = true
         rule.runOnIdle {
             assertWithMessage("Modifier Node was not attached after being reactivated")
-                .that(nodeInstance.isAttached).isTrue()
+                .that(nodeInstance.isAttached)
+                .isTrue()
         }
     }
 
@@ -337,9 +305,7 @@
             active = true
         }
 
-        rule.runOnIdle {
-            assertThat(onAttachCalls).isEqualTo(2)
-        }
+        rule.runOnIdle { assertThat(onAttachCalls).isEqualTo(2) }
     }
 
     @Test
@@ -348,17 +314,12 @@
         var reuseKey by mutableStateOf(0)
 
         var invalidations = 0
-        val onInvalidate: () -> Unit = {
-            invalidations++
-        }
+        val onInvalidate: () -> Unit = { invalidations++ }
 
         rule.setContent {
             ReusableContentHost(active) {
                 ReusableContent(reuseKey) {
-                    Layout(
-                        modifier = StatelessElement(onInvalidate),
-                        measurePolicy = MeasurePolicy
-                    )
+                    Layout(modifier = StatelessElement(onInvalidate), measurePolicy = MeasurePolicy)
                 }
             }
         }
@@ -373,9 +334,7 @@
             reuseKey = 1
         }
 
-        rule.runOnIdle {
-            assertThat(invalidations).isEqualTo(1)
-        }
+        rule.runOnIdle { assertThat(invalidations).isEqualTo(1) }
     }
 
     @Test
@@ -385,9 +344,7 @@
         var size by mutableStateOf(10)
 
         var invalidations = 0
-        val onInvalidate: () -> Unit = {
-            invalidations++
-        }
+        val onInvalidate: () -> Unit = { invalidations++ }
 
         rule.setContent {
             ReusableContentHost(active) {
@@ -411,9 +368,7 @@
             size = 20
         }
 
-        rule.runOnIdle {
-            assertThat(invalidations).isEqualTo(2)
-        }
+        rule.runOnIdle { assertThat(invalidations).isEqualTo(2) }
     }
 
     @Test
@@ -421,16 +376,11 @@
         var reuseKey by mutableStateOf(0)
 
         var resetCalls = 0
-        val onReset: () -> Unit = {
-            resetCalls++
-        }
+        val onReset: () -> Unit = { resetCalls++ }
 
         rule.setContent {
             ReusableContent(reuseKey) {
-                Layout(
-                    modifier = DelegatingElement(onReset),
-                    measurePolicy = MeasurePolicy
-                )
+                Layout(modifier = DelegatingElement(onReset), measurePolicy = MeasurePolicy)
             }
         }
 
@@ -439,9 +389,7 @@
             reuseKey = 1
         }
 
-        rule.runOnIdle {
-            assertThat(resetCalls).isEqualTo(1)
-        }
+        rule.runOnIdle { assertThat(resetCalls).isEqualTo(1) }
     }
 
     @Test
@@ -459,10 +407,7 @@
         rule.setContent {
             SubcompositionReusableContentHost(active) {
                 ReusableContent(0) {
-                    Layout(
-                        modifier = LayerElement(layerBlock),
-                        measurePolicy = MeasurePolicy
-                    )
+                    Layout(modifier = LayerElement(layerBlock), measurePolicy = MeasurePolicy)
                 }
             }
         }
@@ -477,18 +422,14 @@
             counter++
         }
 
-        rule.runOnIdle {
-            active = true
-        }
+        rule.runOnIdle { active = true }
 
         rule.runOnIdle {
             assertThat(invalidations).isEqualTo(2)
             counter++
         }
 
-        rule.runOnIdle {
-            assertThat(invalidations).isEqualTo(3)
-        }
+        rule.runOnIdle { assertThat(invalidations).isEqualTo(3) }
     }
 
     @Test
@@ -506,10 +447,7 @@
         rule.setContent {
             ReusableContentHost(active) {
                 ReusableContent(0) {
-                    Layout(
-                        modifier = LayoutElement(measureBlock),
-                        measurePolicy = MeasurePolicy
-                    )
+                    Layout(modifier = LayoutElement(measureBlock), measurePolicy = MeasurePolicy)
                 }
             }
         }
@@ -524,18 +462,14 @@
             counter++
         }
 
-        rule.runOnIdle {
-            active = true
-        }
+        rule.runOnIdle { active = true }
 
         rule.runOnIdle {
             assertThat(invalidations).isEqualTo(2)
             counter++
         }
 
-        rule.runOnIdle {
-            assertThat(invalidations).isEqualTo(3)
-        }
+        rule.runOnIdle { assertThat(invalidations).isEqualTo(3) }
     }
 
     @Test
@@ -571,18 +505,14 @@
             counter++
         }
 
-        rule.runOnIdle {
-            active = true
-        }
+        rule.runOnIdle { active = true }
 
         rule.runOnIdle {
             assertThat(invalidations).isEqualTo(2)
             counter++
         }
 
-        rule.runOnIdle {
-            assertThat(invalidations).isEqualTo(3)
-        }
+        rule.runOnIdle { assertThat(invalidations).isEqualTo(3) }
     }
 
     @Test
@@ -599,10 +529,7 @@
 
         rule.setContent {
             ReusableContent(key) {
-                Layout(
-                    modifier = OldLayoutModifier(drawBlock),
-                    measurePolicy = MeasurePolicy
-                )
+                Layout(modifier = OldLayoutModifier(drawBlock), measurePolicy = MeasurePolicy)
             }
         }
 
@@ -616,9 +543,7 @@
             counter++
         }
 
-        rule.runOnIdle {
-            assertThat(invalidations).isEqualTo(2)
-        }
+        rule.runOnIdle { assertThat(invalidations).isEqualTo(2) }
     }
 
     @Test
@@ -636,10 +561,7 @@
         rule.setContent {
             SubcompositionReusableContentHost(active) {
                 ReusableContent(0) {
-                    Layout(
-                        modifier = DrawElement(drawBlock),
-                        measurePolicy = MeasurePolicy
-                    )
+                    Layout(modifier = DrawElement(drawBlock), measurePolicy = MeasurePolicy)
                 }
             }
         }
@@ -654,18 +576,14 @@
             counter++
         }
 
-        rule.runOnIdle {
-            active = true
-        }
+        rule.runOnIdle { active = true }
 
         rule.runOnIdle {
             assertThat(invalidations).isEqualTo(2)
             counter++
         }
 
-        rule.runOnIdle {
-            assertThat(invalidations).isEqualTo(3)
-        }
+        rule.runOnIdle { assertThat(invalidations).isEqualTo(3) }
     }
 
     @Test
@@ -683,10 +601,7 @@
         rule.setContent {
             SubcompositionReusableContentHost(active) {
                 ReusableContent(0) {
-                    Layout(
-                        modifier = OldDrawModifier(drawBlock),
-                        measurePolicy = MeasurePolicy
-                    )
+                    Layout(modifier = OldDrawModifier(drawBlock), measurePolicy = MeasurePolicy)
                 }
             }
         }
@@ -701,18 +616,14 @@
             counter++
         }
 
-        rule.runOnIdle {
-            active = true
-        }
+        rule.runOnIdle { active = true }
 
         rule.runOnIdle {
             assertThat(invalidations).isEqualTo(2)
             counter++
         }
 
-        rule.runOnIdle {
-            assertThat(invalidations).isEqualTo(3)
-        }
+        rule.runOnIdle { assertThat(invalidations).isEqualTo(3) }
     }
 
     @Test
@@ -728,12 +639,9 @@
         }
 
         rule.setContent {
-                ReusableContent(key) {
-                    Layout(
-                        modifier = OldDrawModifier(drawBlock),
-                        measurePolicy = MeasurePolicy
-                    )
-                }
+            ReusableContent(key) {
+                Layout(modifier = OldDrawModifier(drawBlock), measurePolicy = MeasurePolicy)
+            }
         }
 
         rule.runOnIdle {
@@ -746,9 +654,7 @@
             counter++
         }
 
-        rule.runOnIdle {
-            assertThat(invalidations).isEqualTo(2)
-        }
+        rule.runOnIdle { assertThat(invalidations).isEqualTo(2) }
     }
 
     @Test
@@ -766,10 +672,7 @@
         rule.setContent {
             ReusableContentHost(active) {
                 ReusableContent(0) {
-                    Layout(
-                        modifier = ObserverElement(observedBlock),
-                        measurePolicy = MeasurePolicy
-                    )
+                    Layout(modifier = ObserverElement(observedBlock), measurePolicy = MeasurePolicy)
                 }
             }
         }
@@ -784,18 +687,14 @@
             counter++
         }
 
-        rule.runOnIdle {
-            active = true
-        }
+        rule.runOnIdle { active = true }
 
         rule.runOnIdle {
             assertThat(invalidations).isEqualTo(2)
             counter++
         }
 
-        rule.runOnIdle {
-            assertThat(invalidations).isEqualTo(3)
-        }
+        rule.runOnIdle { assertThat(invalidations).isEqualTo(3) }
     }
 
     @Test
@@ -811,9 +710,9 @@
                 ReusableContent(0) {
                     @OptIn(ExperimentalComposeUiApi::class)
                     Layout(
-                        modifier = Modifier
-                            .modifierLocalProvider(key) { providedValue }
-                            .modifierLocalConsumer { receivedValue = key.current },
+                        modifier =
+                            Modifier.modifierLocalProvider(key) { providedValue }
+                                .modifierLocalConsumer { receivedValue = key.current },
                         measurePolicy = MeasurePolicy
                     )
                 }
@@ -825,17 +724,11 @@
             active = false
         }
 
-        rule.runOnIdle {
-            providedValue = 1
-        }
+        rule.runOnIdle { providedValue = 1 }
 
-        rule.runOnIdle {
-            active = true
-        }
+        rule.runOnIdle { active = true }
 
-        rule.runOnIdle {
-            assertThat(receivedValue).isEqualTo(1)
-        }
+        rule.runOnIdle { assertThat(receivedValue).isEqualTo(1) }
     }
 
     @Test
@@ -848,12 +741,14 @@
         rule.setContent {
             ReusableContentHost(active) {
                 ReusableContent(0) {
-                    Layout(content = {
-                        Layout(
-                            modifier = modifier.testTag("child"),
-                            measurePolicy = MeasurePolicy
-                        )
-                    }) { measurables, constraints ->
+                    Layout(
+                        content = {
+                            Layout(
+                                modifier = modifier.testTag("child"),
+                                measurePolicy = MeasurePolicy
+                            )
+                        }
+                    ) { measurables, constraints ->
                         val placeable = measurables.first().measure(constraints)
                         layout(placeable.width, placeable.height) {
                             childX.toString()
@@ -864,9 +759,7 @@
             }
         }
 
-        rule.runOnIdle {
-            active = false
-        }
+        rule.runOnIdle { active = false }
 
         rule.runOnIdle {
             active = true
@@ -875,7 +768,8 @@
             childX = 10
         }
 
-        rule.onNodeWithTag("child")
+        rule
+            .onNodeWithTag("child")
             .assertLeftPositionInRootIsEqualTo(with(rule.density) { 10.toDp() })
     }
 
@@ -886,14 +780,14 @@
 
         rule.setContent {
             ReusableContentHost(active) {
-                Layout(content = {
-                    Layout(
-                        modifier = Modifier
-                            .size(50.dp)
-                            .testTag("child"),
-                        measurePolicy = MeasurePolicy
-                    )
-                }) { measurables, constraints ->
+                Layout(
+                    content = {
+                        Layout(
+                            modifier = Modifier.size(50.dp).testTag("child"),
+                            measurePolicy = MeasurePolicy
+                        )
+                    }
+                ) { measurables, constraints ->
                     val placeable = measurables.first().measure(constraints)
                     layout(placeable.width, placeable.height) {
                         coordinates = this.coordinates
@@ -903,13 +797,9 @@
             }
         }
 
-        rule.runOnIdle {
-            active = false
-        }
+        rule.runOnIdle { active = false }
 
-        rule.runOnIdle {
-            assertThat(coordinates?.isAttached).isEqualTo(false)
-        }
+        rule.runOnIdle { assertThat(coordinates?.isAttached).isEqualTo(false) }
     }
 
     @SdkSuppress(minSdkVersion = Build.VERSION_CODES.O)
@@ -920,47 +810,35 @@
         rule.setContent {
             CompositionLocalProvider(LocalDensity provides Density(1f)) {
                 SubcompositionReusableContentHost(active) {
-                    Layout(content = {
-                        Canvas(
-                            modifier = Modifier
-                                .padding(5.dp)
-                                .size(5.dp)
-                                .graphicsLayer(clip = true)
-                        ) {
-                            drawRect(Color.Red, Offset(-5f, -5f), Size(15f, 15f))
-                        }
-                    }, modifier = Modifier
-                        .testTag("test")
-                        .drawBehind {
-                            drawRect(Color.Blue)
-                        }
+                    Layout(
+                        content = {
+                            Canvas(
+                                modifier =
+                                    Modifier.padding(5.dp).size(5.dp).graphicsLayer(clip = true)
+                            ) {
+                                drawRect(Color.Red, Offset(-5f, -5f), Size(15f, 15f))
+                            }
+                        },
+                        modifier = Modifier.testTag("test").drawBehind { drawRect(Color.Blue) }
                     ) { measurables, constraints ->
                         val placeable = measurables.first().measure(constraints)
-                        layout(placeable.width, placeable.height) {
-                            placeable.place(0, 0)
-                        }
+                        layout(placeable.width, placeable.height) { placeable.place(0, 0) }
                     }
                 }
             }
         }
 
-        rule.runOnIdle {
-            active = false
-        }
+        rule.runOnIdle { active = false }
 
-        rule.runOnIdle {
-            active = true
-        }
+        rule.runOnIdle { active = true }
 
-        rule.onNodeWithTag("test")
-            .captureToImage()
-            .assertPixels(IntSize(15, 15)) {
-                if (it.x in 5 until 10 && it.y in 5 until 10) {
-                    Color.Red
-                } else {
-                    Color.Blue
-                }
+        rule.onNodeWithTag("test").captureToImage().assertPixels(IntSize(15, 15)) {
+            if (it.x in 5 until 10 && it.y in 5 until 10) {
+                Color.Red
+            } else {
+                Color.Blue
             }
+        }
     }
 }
 
@@ -979,14 +857,15 @@
     val currentOnDetach by rememberUpdatedState(onDetach)
     val currentOnAttach by rememberUpdatedState(onAttach)
     Layout(
-        modifier = createModifier(
-            key = key,
-            onCreate = { currentOnCreate.invoke() },
-            onUpdate = { currentOnUpdate.invoke() },
-            onReset = { currentOnReset.invoke() },
-            onDetach = { currentOnDetach.invoke() },
-            onAttach = { currentOnAttach.invoke() },
-        ),
+        modifier =
+            createModifier(
+                key = key,
+                onCreate = { currentOnCreate.invoke() },
+                onUpdate = { currentOnUpdate.invoke() },
+                onReset = { currentOnReset.invoke() },
+                onDetach = { currentOnDetach.invoke() },
+                onAttach = { currentOnAttach.invoke() },
+            ),
         measurePolicy = MeasurePolicy
     )
 }
@@ -999,31 +878,31 @@
     onDetach: () -> Unit = {},
     onAttach: () -> Unit = {},
 ): Modifier {
-    class GenericModifierWithLifecycle(
-        val key: Any?
-    ) : ModifierNodeElement<Modifier.Node>() {
+    class GenericModifierWithLifecycle(val key: Any?) : ModifierNodeElement<Modifier.Node>() {
         override fun create(): Modifier.Node {
             onCreate()
             return object : Modifier.Node() {
                 override fun onReset() = onReset()
+
                 override fun onAttach() = onAttach()
+
                 override fun onDetach() = onDetach()
             }
         }
 
-        override fun update(node: Modifier.Node) { onUpdate() }
+        override fun update(node: Modifier.Node) {
+            onUpdate()
+        }
 
         override fun hashCode(): Int = "ModifierNodeReuseAndDeactivationTest".hashCode()
 
-        override fun equals(other: Any?) = (other === this) ||
-            (other is GenericModifierWithLifecycle && other.key == this.key)
+        override fun equals(other: Any?) =
+            (other === this) || (other is GenericModifierWithLifecycle && other.key == this.key)
     }
     return GenericModifierWithLifecycle(key)
 }
 
-private val MeasurePolicy = MeasurePolicy { _, _ ->
-    layout(100, 100) { }
-}
+private val MeasurePolicy = MeasurePolicy { _, _ -> layout(100, 100) {} }
 
 private data class StatelessElement(
     private val onInvalidate: () -> Unit,
@@ -1043,9 +922,7 @@
         ): MeasureResult {
             val placeable = measurable.measure(Constraints.fixed(size, size))
             onMeasure()
-            return layout(placeable.width, placeable.height) {
-                placeable.place(0, 0)
-            }
+            return layout(placeable.width, placeable.height) { placeable.place(0, 0) }
         }
     }
 }
@@ -1060,13 +937,14 @@
     }
 
     class Node(var onReset: () -> Unit) : DelegatingNode() {
-        private val inner = delegate(
-            object : Modifier.Node() {
-                override fun onReset() {
-                    this@Node.onReset.invoke()
+        private val inner =
+            delegate(
+                object : Modifier.Node() {
+                    override fun onReset() {
+                        this@Node.onReset.invoke()
+                    }
                 }
-            }
-        )
+            )
     }
 }
 
@@ -1086,9 +964,7 @@
         ): MeasureResult {
             val placeable = measurable.measure(constraints)
             return layout(placeable.width, placeable.height) {
-                placeable.placeWithLayer(0, 0) {
-                    layerBlock.invoke()
-                }
+                placeable.placeWithLayer(0, 0) { layerBlock.invoke() }
             }
         }
     }
@@ -1110,9 +986,7 @@
         }
 
         private fun observe() {
-            observeReads {
-                observedBlock()
-            }
+            observeReads { observedBlock() }
         }
 
         override fun onObservedReadsChanged() {
@@ -1137,9 +1011,7 @@
         ): MeasureResult {
             val placeable = measurable.measure(constraints)
             measureBlock.invoke()
-            return layout(placeable.width, placeable.height) {
-                placeable.place(0, 0)
-            }
+            return layout(placeable.width, placeable.height) { placeable.place(0, 0) }
         }
     }
 }
@@ -1153,9 +1025,7 @@
     ): MeasureResult {
         val placeable = measurable.measure(constraints)
         measureBlock.invoke()
-        return layout(placeable.width, placeable.height) {
-            placeable.place(0, 0)
-        }
+        return layout(placeable.width, placeable.height) { placeable.place(0, 0) }
     }
 }
 
@@ -1186,8 +1056,11 @@
 
 private object StatelessLayoutElement1 : ModifierNodeElement<StatelessLayoutModifier1>() {
     override fun create() = StatelessLayoutModifier1()
+
     override fun update(node: StatelessLayoutModifier1) {}
+
     override fun hashCode(): Int = 241
+
     override fun equals(other: Any?) = other === this
 }
 
@@ -1197,16 +1070,17 @@
         constraints: Constraints
     ): MeasureResult {
         val placeable = measurable.measure(constraints)
-        return layout(placeable.width, placeable.height) {
-            placeable.place(0, 0)
-        }
+        return layout(placeable.width, placeable.height) { placeable.place(0, 0) }
     }
 }
 
 private object StatelessLayoutElement2 : ModifierNodeElement<StatelessLayoutModifier2>() {
     override fun create() = StatelessLayoutModifier2()
+
     override fun update(node: StatelessLayoutModifier2) {}
+
     override fun hashCode(): Int = 242
+
     override fun equals(other: Any?) = other === this
 }
 
@@ -1216,8 +1090,6 @@
         constraints: Constraints
     ): MeasureResult {
         val placeable = measurable.measure(constraints)
-        return layout(placeable.width, placeable.height) {
-            placeable.place(0, 0)
-        }
+        return layout(placeable.width, placeable.height) { placeable.place(0, 0) }
     }
 }
diff --git a/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/node/CompositeKeyHashTest.kt b/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/node/CompositeKeyHashTest.kt
index e27dcef..bc32ce8 100644
--- a/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/node/CompositeKeyHashTest.kt
+++ b/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/node/CompositeKeyHashTest.kt
@@ -42,16 +42,13 @@
 @RunWith(AndroidJUnit4::class)
 @OptIn(ExperimentalComposeUiApi::class)
 class CompositeKeyHashTest {
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
     @Test
     fun nonZeroCompositeKeyHash() {
         // Arrange.
         val node = object : Modifier.Node() {}
-        rule.setContent {
-            Box(Modifier.elementOf(node))
-        }
+        rule.setContent { Box(Modifier.elementOf(node)) }
 
         // Act.
         val compositeKeyHash = rule.runOnIdle { node.requireLayoutNode().compositeKeyHash }
@@ -64,11 +61,7 @@
     fun parentAndChildLayoutNodesHaveDifferentCompositeKeyHashes() {
         // Arrange.
         val (parent, child) = List(3) { object : Modifier.Node() {} }
-        rule.setContent {
-            Box(Modifier.elementOf(parent)) {
-                Box(Modifier.elementOf(child))
-            }
-        }
+        rule.setContent { Box(Modifier.elementOf(parent)) { Box(Modifier.elementOf(child)) } }
 
         // Act.
         rule.waitForIdle()
@@ -105,12 +98,8 @@
         val (node1, node2) = List(3) { object : Modifier.Node() {} }
         rule.setContent {
             Row {
-                key(1) {
-                    Box(Modifier.elementOf(node1))
-                }
-                key(2) {
-                    Box(Modifier.elementOf(node2))
-                }
+                key(1) { Box(Modifier.elementOf(node1)) }
+                key(2) { Box(Modifier.elementOf(node2)) }
             }
         }
 
@@ -149,12 +138,8 @@
         val (node1, node2) = List(2) { object : Modifier.Node() {} }
         rule.setContent {
             Box {
-                key(1) {
-                    Box(Modifier.elementOf(node1))
-                }
-                key(2) {
-                    Box(Modifier.elementOf(node2))
-                }
+                key(1) { Box(Modifier.elementOf(node1)) }
+                key(2) { Box(Modifier.elementOf(node2)) }
             }
         }
 
@@ -173,12 +158,8 @@
         val (node1, node2) = List(2) { object : Modifier.Node() {} }
         rule.setContent {
             LazyColumn {
-                item {
-                    Box(Modifier.elementOf(node1))
-                }
-                item {
-                    Box(Modifier.elementOf(node2))
-                }
+                item { Box(Modifier.elementOf(node1)) }
+                item { Box(Modifier.elementOf(node2)) }
             }
         }
 
@@ -196,11 +177,7 @@
         // Arrange.
         val (node1, node2) = List(2) { object : Modifier.Node() {} }
         rule.setContent {
-            LazyColumn {
-                items(2) {
-                    Box(Modifier.elementOf(if (it == 0) node1 else node2))
-                }
-            }
+            LazyColumn { items(2) { Box(Modifier.elementOf(if (it == 0) node1 else node2)) } }
         }
 
         // Act.
@@ -235,10 +212,7 @@
         // Arrange.
         val node = object : Modifier.Node() {}
         rule.setContent {
-            AndroidView(
-                factory = { TextView(it) },
-                modifier = Modifier.elementOf(node)
-            )
+            AndroidView(factory = { TextView(it) }, modifier = Modifier.elementOf(node))
         }
 
         // Act.
@@ -275,7 +249,7 @@
             AndroidView(
                 factory = { TextView(it) },
                 modifier = Modifier.elementOf(node),
-                onReset = { }
+                onReset = {}
             )
         }
 
@@ -290,9 +264,7 @@
     fun Layout1() {
         // Arrange.
         var compositeKeyHash = 0
-        rule.setContent {
-            Layout1 { compositeKeyHash = it }
-        }
+        rule.setContent { Layout1 { compositeKeyHash = it } }
 
         // Assert.
         assertThat(compositeKeyHash).isNotEqualTo(0)
@@ -302,9 +274,7 @@
     fun Layout2() { // Add other overloads of Layout here.
         // Arrange.
         var compositeKeyHash = 0
-        rule.setContent {
-            Layout2 { compositeKeyHash = it }
-        }
+        rule.setContent { Layout2 { compositeKeyHash = it } }
 
         // Assert.
         assertThat(compositeKeyHash).isNotEqualTo(0)
@@ -314,9 +284,7 @@
     fun Layout3() { // Add other overloads of Layout here.
         // Arrange.
         var compositeKeyHash = 0
-        rule.setContent {
-            Layout3 { compositeKeyHash = it }
-        }
+        rule.setContent { Layout3 { compositeKeyHash = it } }
 
         // Assert.
         assertThat(compositeKeyHash).isNotEqualTo(0)
@@ -326,9 +294,7 @@
     fun Layout4() { // Add other overloads of Layout here.
         // Arrange.
         var compositeKeyHash = 0
-        rule.setContent {
-            Layout4 { compositeKeyHash = it }
-        }
+        rule.setContent { Layout4 { compositeKeyHash = it } }
 
         // Assert.
         assertThat(compositeKeyHash).isNotEqualTo(0)
@@ -344,9 +310,7 @@
             },
             modifier = Modifier.elementOf(node)
         )
-        SideEffect {
-            onSetCompositionKeyHash(node.requireLayoutNode().compositeKeyHash)
-        }
+        SideEffect { onSetCompositionKeyHash(node.requireLayoutNode().compositeKeyHash) }
     }
 
     @Composable
@@ -355,34 +319,26 @@
         Layout(
             contents = listOf({}, {}),
             measurePolicy = { measurables, constraints ->
-                measurables.forEach {
-                    it.forEach { measurable ->
-                        measurable.measure(constraints)
-                    }
-                }
+                measurables.forEach { it.forEach { measurable -> measurable.measure(constraints) } }
                 layout(0, 0) {}
             },
             modifier = Modifier.elementOf(node)
         )
-        SideEffect {
-            onSetCompositionKeyHash.invoke(node.requireLayoutNode().compositeKeyHash)
-        }
+        SideEffect { onSetCompositionKeyHash.invoke(node.requireLayoutNode().compositeKeyHash) }
     }
 
     @Composable
     private fun Layout3(onSetCompositionKeyHash: (Int) -> Unit) {
         val node = remember { object : Modifier.Node() {} }
         Layout(
-            content = { },
+            content = {},
             measurePolicy = { measurables, constraints ->
                 measurables.forEach { it.measure(constraints) }
                 layout(0, 0) {}
             },
             modifier = Modifier.elementOf(node)
         )
-        SideEffect {
-            onSetCompositionKeyHash.invoke(node.requireLayoutNode().compositeKeyHash)
-        }
+        SideEffect { onSetCompositionKeyHash.invoke(node.requireLayoutNode().compositeKeyHash) }
     }
 
     @Composable
@@ -390,15 +346,13 @@
         val node = remember { object : Modifier.Node() {} }
         @Suppress("DEPRECATION")
         MultiMeasureLayout(
-            content = { },
+            content = {},
             measurePolicy = { measurables, constraints ->
                 measurables.forEach { it.measure(constraints) }
                 layout(0, 0) {}
             },
             modifier = Modifier.elementOf(node)
         )
-        SideEffect {
-            onSetCompositionKeyHash.invoke(node.requireLayoutNode().compositeKeyHash)
-        }
+        SideEffect { onSetCompositionKeyHash.invoke(node.requireLayoutNode().compositeKeyHash) }
     }
 }
diff --git a/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/node/CompositionLocalConsumerModifierNodeTest.kt b/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/node/CompositionLocalConsumerModifierNodeTest.kt
index efa7400..a6df435 100644
--- a/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/node/CompositionLocalConsumerModifierNodeTest.kt
+++ b/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/node/CompositionLocalConsumerModifierNodeTest.kt
@@ -43,8 +43,7 @@
 @MediumTest
 @RunWith(Parameterized::class)
 class CompositionLocalConsumerModifierNodeTest(layoutComposableParam: LayoutComposableParam) {
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
     val testLayout: @Composable (modifier: Modifier) -> Unit = layoutComposableParam.layout
 
@@ -57,24 +56,24 @@
 
         @JvmStatic
         @Parameterized.Parameters(name = "{0}")
-        fun init() = listOf(
-            LayoutComposableParam("Layout") { modifier ->
-                Layout({}, modifier, EmptyBoxMeasurePolicy)
-            },
-            LayoutComposableParam("LayoutNoContent") { modifier ->
-                Layout(modifier, EmptyBoxMeasurePolicy)
-            },
-            LayoutComposableParam("MultiMeasureLayout") { modifier ->
-                @Suppress("DEPRECATION")
-                MultiMeasureLayout(modifier, {}, EmptyBoxMeasurePolicy)
-            },
-            LayoutComposableParam("AndroidView") { modifier ->
-                AndroidView(factory = { View(it) }, modifier)
-            },
-            LayoutComposableParam("ResettableAndroidView") { modifier ->
-                AndroidView(factory = { View(it) }, modifier, onReset = {})
-            },
-        )
+        fun init() =
+            listOf(
+                LayoutComposableParam("Layout") { modifier ->
+                    Layout({}, modifier, EmptyBoxMeasurePolicy)
+                },
+                LayoutComposableParam("LayoutNoContent") { modifier ->
+                    Layout(modifier, EmptyBoxMeasurePolicy)
+                },
+                LayoutComposableParam("MultiMeasureLayout") { modifier ->
+                    @Suppress("DEPRECATION") MultiMeasureLayout(modifier, {}, EmptyBoxMeasurePolicy)
+                },
+                LayoutComposableParam("AndroidView") { modifier ->
+                    AndroidView(factory = { View(it) }, modifier)
+                },
+                LayoutComposableParam("ResettableAndroidView") { modifier ->
+                    AndroidView(factory = { View(it) }, modifier, onReset = {})
+                },
+            )
     }
 
     class LayoutComposableParam(
@@ -87,55 +86,48 @@
     @Test
     fun defaultValueReturnedIfNotProvided() {
         var readValue = -1
-        val node = object : Modifier.Node(), DrawModifierNode,
-            CompositionLocalConsumerModifierNode {
-            override fun ContentDrawScope.draw() {
-                readValue = currentValueOf(localInt)
-                drawContent()
+        val node =
+            object : Modifier.Node(), DrawModifierNode, CompositionLocalConsumerModifierNode {
+                override fun ContentDrawScope.draw() {
+                    readValue = currentValueOf(localInt)
+                    drawContent()
+                }
             }
-        }
-        rule.setContent {
-            testLayout(elementOf { node })
-        }
+        rule.setContent { testLayout(elementOf { node }) }
 
-        rule.runOnIdle {
-            assertThat(readValue).isEqualTo(0)
-        }
+        rule.runOnIdle { assertThat(readValue).isEqualTo(0) }
     }
 
     @Test
     fun providedValueReturned() {
         var readValue = -1
-        val node = object : Modifier.Node(), DrawModifierNode,
-            CompositionLocalConsumerModifierNode {
-            override fun ContentDrawScope.draw() {
-                readValue = currentValueOf(localInt)
-                drawContent()
+        val node =
+            object : Modifier.Node(), DrawModifierNode, CompositionLocalConsumerModifierNode {
+                override fun ContentDrawScope.draw() {
+                    readValue = currentValueOf(localInt)
+                    drawContent()
+                }
             }
-        }
         rule.setContent {
-            CompositionLocalProvider(localInt provides 2) {
-                testLayout(elementOf { node })
-            }
+            CompositionLocalProvider(localInt provides 2) { testLayout(elementOf { node }) }
         }
 
-        rule.runOnIdle {
-            assertThat(readValue).isEqualTo(2)
-        }
+        rule.runOnIdle { assertThat(readValue).isEqualTo(2) }
     }
 
     @Test
     fun providedValueUpdatedReadsNewValue() {
         var readValue = -1
         var providedValue by mutableStateOf(2)
-        val node = object : Modifier.Node(), DrawModifierNode,
-            CompositionLocalConsumerModifierNode {
-            fun getValue(): Int = currentValueOf(localInt)
-            override fun ContentDrawScope.draw() {
-                readValue = getValue()
-                drawContent()
+        val node =
+            object : Modifier.Node(), DrawModifierNode, CompositionLocalConsumerModifierNode {
+                fun getValue(): Int = currentValueOf(localInt)
+
+                override fun ContentDrawScope.draw() {
+                    readValue = getValue()
+                    drawContent()
+                }
             }
-        }
         rule.setContent {
             CompositionLocalProvider(localInt provides providedValue) {
                 testLayout(elementOf { node })
@@ -157,55 +149,48 @@
     @Test
     fun defaultStaticValueReturnedIfNotProvided() {
         var readValue = -1
-        val node = object : Modifier.Node(), DrawModifierNode,
-            CompositionLocalConsumerModifierNode {
-            override fun ContentDrawScope.draw() {
-                readValue = currentValueOf(staticLocalInt)
-                drawContent()
+        val node =
+            object : Modifier.Node(), DrawModifierNode, CompositionLocalConsumerModifierNode {
+                override fun ContentDrawScope.draw() {
+                    readValue = currentValueOf(staticLocalInt)
+                    drawContent()
+                }
             }
-        }
-        rule.setContent {
-            testLayout(elementOf { node })
-        }
+        rule.setContent { testLayout(elementOf { node }) }
 
-        rule.runOnIdle {
-            assertThat(readValue).isEqualTo(0)
-        }
+        rule.runOnIdle { assertThat(readValue).isEqualTo(0) }
     }
 
     @Test
     fun providedStaticValueReturned() {
         var readValue = -1
-        val node = object : Modifier.Node(), DrawModifierNode,
-            CompositionLocalConsumerModifierNode {
-            override fun ContentDrawScope.draw() {
-                readValue = currentValueOf(staticLocalInt)
-                drawContent()
+        val node =
+            object : Modifier.Node(), DrawModifierNode, CompositionLocalConsumerModifierNode {
+                override fun ContentDrawScope.draw() {
+                    readValue = currentValueOf(staticLocalInt)
+                    drawContent()
+                }
             }
-        }
         rule.setContent {
-            CompositionLocalProvider(staticLocalInt provides 2) {
-                testLayout(elementOf { node })
-            }
+            CompositionLocalProvider(staticLocalInt provides 2) { testLayout(elementOf { node }) }
         }
 
-        rule.runOnIdle {
-            assertThat(readValue).isEqualTo(2)
-        }
+        rule.runOnIdle { assertThat(readValue).isEqualTo(2) }
     }
 
     @Test
     fun providedStaticValueUpdatedReadsNewValue() {
         var readValue = -1
         var providedValue by mutableStateOf(2)
-        val node = object : Modifier.Node(), DrawModifierNode,
-            CompositionLocalConsumerModifierNode {
-            fun getValue(): Int = currentValueOf(staticLocalInt)
-            override fun ContentDrawScope.draw() {
-                readValue = getValue()
-                drawContent()
+        val node =
+            object : Modifier.Node(), DrawModifierNode, CompositionLocalConsumerModifierNode {
+                fun getValue(): Int = currentValueOf(staticLocalInt)
+
+                override fun ContentDrawScope.draw() {
+                    readValue = getValue()
+                    drawContent()
+                }
             }
-        }
         rule.setContent {
             CompositionLocalProvider(staticLocalInt provides providedValue) {
                 testLayout(elementOf { node })
@@ -233,8 +218,7 @@
 
         var contentKey by mutableStateOf(1)
         val modifier = elementOf {
-            object : Modifier.Node(), DrawModifierNode,
-                CompositionLocalConsumerModifierNode {
+            object : Modifier.Node(), DrawModifierNode, CompositionLocalConsumerModifierNode {
                 override fun ContentDrawScope.draw() {
                     readValue = currentValueOf(localInt)
                     drawContent()
@@ -244,22 +228,16 @@
 
         rule.setContent {
             CompositionLocalProvider(localInt provides providedValue) {
-                ReusableContent(contentKey) {
-                    testLayout(modifier)
-                }
+                ReusableContent(contentKey) { testLayout(modifier) }
             }
         }
 
-        rule.runOnIdle {
-            assertThat(readValue).isEqualTo(42)
-        }
+        rule.runOnIdle { assertThat(readValue).isEqualTo(42) }
 
         contentKey++
         providedValue = 86
 
-        rule.runOnIdle {
-            assertThat(readValue).isEqualTo(86)
-        }
+        rule.runOnIdle { assertThat(readValue).isEqualTo(86) }
     }
 
     // Regression test for b/271875799
@@ -271,8 +249,7 @@
 
         var contentKey by mutableStateOf(1)
         val modifier = elementOf {
-            object : Modifier.Node(), DrawModifierNode,
-                CompositionLocalConsumerModifierNode {
+            object : Modifier.Node(), DrawModifierNode, CompositionLocalConsumerModifierNode {
                 override fun ContentDrawScope.draw() {
                     readValue = currentValueOf(staticLocalInt)
                     drawContent()
@@ -282,30 +259,28 @@
 
         rule.setContent {
             CompositionLocalProvider(staticLocalInt provides providedValue) {
-                ReusableContent(contentKey) {
-                    testLayout(modifier)
-                }
+                ReusableContent(contentKey) { testLayout(modifier) }
             }
         }
 
-        rule.runOnIdle {
-            assertThat(readValue).isEqualTo(32)
-        }
+        rule.runOnIdle { assertThat(readValue).isEqualTo(32) }
 
         contentKey++
         providedValue = 64
 
-        rule.runOnIdle {
-            assertThat(readValue).isEqualTo(64)
-        }
+        rule.runOnIdle { assertThat(readValue).isEqualTo(64) }
     }
 
     private inline fun <reified T : Modifier.Node> elementOf(
         crossinline create: () -> T
-    ): ModifierNodeElement<T> = object : ModifierNodeElement<T>() {
-        override fun create(): T = create()
-        override fun update(node: T) {}
-        override fun hashCode(): Int = System.identityHashCode(this)
-        override fun equals(other: Any?) = (other === this)
-    }
+    ): ModifierNodeElement<T> =
+        object : ModifierNodeElement<T>() {
+            override fun create(): T = create()
+
+            override fun update(node: T) {}
+
+            override fun hashCode(): Int = System.identityHashCode(this)
+
+            override fun equals(other: Any?) = (other === this)
+        }
 }
diff --git a/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/node/HotReloadTests.kt b/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/node/HotReloadTests.kt
index f9326295..35dd11c 100644
--- a/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/node/HotReloadTests.kt
+++ b/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/node/HotReloadTests.kt
@@ -43,8 +43,7 @@
 @MediumTest
 @RunWith(AndroidJUnit4::class)
 class HotReloadTests {
-    @get:Rule
-    val rule = createAndroidComposeRule<TestActivity>()
+    @get:Rule val rule = createAndroidComposeRule<TestActivity>()
 
     @Test
     fun composeLayoutNode() {
@@ -52,12 +51,13 @@
         rule.activityRule.scenario.onActivity { activity = it }
         var value = "First value"
 
-        @Composable fun semanticsNode(text: String, id: Int) {
-            Box(Modifier.testTag("text$id").semantics { contentDescription = text }) {
-            }
+        @Composable
+        fun semanticsNode(text: String, id: Int) {
+            Box(Modifier.testTag("text$id").semantics { contentDescription = text }) {}
         }
 
-        @Composable fun columnNode(content: @Composable () -> Unit) {
+        @Composable
+        fun columnNode(content: @Composable () -> Unit) {
             content()
         }
 
@@ -66,12 +66,8 @@
         // Set the content of the view
         rule.runOnUiThread {
             activity.setContent {
-                columnNode {
-                    semanticsNode(text = value, id = 103)
-                }
-                SideEffect {
-                    composeLatch.countDown()
-                }
+                columnNode { semanticsNode(text = value, id = 103) }
+                SideEffect { composeLatch.countDown() }
             }
         }
 
diff --git a/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/node/InvalidateSubtreeTest.kt b/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/node/InvalidateSubtreeTest.kt
index bffa21e..49d3c03 100644
--- a/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/node/InvalidateSubtreeTest.kt
+++ b/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/node/InvalidateSubtreeTest.kt
@@ -39,8 +39,7 @@
 @MediumTest
 @RunWith(AndroidJUnit4::class)
 class InvalidateSubtreeTest {
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
     @Test
     fun invalidateSubtreeNoLayers() {
@@ -52,11 +51,7 @@
             invalidate = { node.invalidateSubtree() }
         }
         rule.setContent {
-            Box(counter1) {
-                Box(counter2 then captureInvalidate) {
-                    Box(counter3.size(10.dp))
-                }
-            }
+            Box(counter1) { Box(counter2 then captureInvalidate) { Box(counter3.size(10.dp)) } }
         }
         rule.waitForIdle()
         assertThat(counter1.drawCount).isEqualTo(1)
@@ -69,9 +64,7 @@
         assertThat(counter3.measureCount).isEqualTo(1)
         assertThat(counter3.placeCount).isEqualTo(1)
 
-        rule.runOnUiThread {
-            invalidate()
-        }
+        rule.runOnUiThread { invalidate() }
         rule.waitForIdle()
 
         // There isn't a layer that can be invalidated, so we draw this twice also
@@ -97,9 +90,12 @@
             invalidate = { node.invalidateSubtree() }
         }
         rule.setContent {
-            Box(Modifier.graphicsLayer {} then counter1.graphicsLayer { }) {
-                Box(Modifier.graphicsLayer { } then
-                    counter2 then captureInvalidate.graphicsLayer { } then counter3
+            Box(Modifier.graphicsLayer {} then counter1.graphicsLayer {}) {
+                Box(
+                    Modifier.graphicsLayer {} then
+                        counter2 then
+                        captureInvalidate.graphicsLayer {} then
+                        counter3
                 ) {
                     Box(counter4.size(10.dp))
                 }
@@ -111,9 +107,7 @@
         assertThat(counter3.drawCount).isEqualTo(1)
         assertThat(counter4.drawCount).isEqualTo(1)
 
-        rule.runOnUiThread {
-            invalidate()
-        }
+        rule.runOnUiThread { invalidate() }
         rule.waitForIdle()
 
         assertThat(counter1.drawCount).isEqualTo(1)
@@ -126,6 +120,7 @@
         var measureCount = 0
         var placeCount = 0
         var drawCount = 0
+
         override fun MeasureScope.measure(
             measurable: Measurable,
             constraints: Constraints
@@ -147,8 +142,7 @@
     private class CaptureInvalidateCounterElement(
         private val onCreate: (node: Modifier.Node) -> Unit
     ) : ModifierNodeElement<Modifier.Node>() {
-        override fun create() = object : Modifier.Node() {}
-            .apply<Modifier.Node>(onCreate)
+        override fun create() = object : Modifier.Node() {}.apply<Modifier.Node>(onCreate)
 
         override fun update(node: Modifier.Node) {}
 
@@ -157,6 +151,7 @@
         }
 
         override fun hashCode() = 0
+
         override fun equals(other: Any?) = (other === this)
     }
 }
diff --git a/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/node/ModelReadsTest.kt b/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/node/ModelReadsTest.kt
index 42dc17d..81023c3 100644
--- a/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/node/ModelReadsTest.kt
+++ b/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/node/ModelReadsTest.kt
@@ -49,8 +49,7 @@
     @Suppress("DEPRECATION")
     @get:Rule
     val rule = androidx.test.rule.ActivityTestRule<TestActivity>(TestActivity::class.java)
-    @get:Rule
-    val excessiveAssertions = AndroidOwnerExtraAssertionsRule()
+    @get:Rule val excessiveAssertions = AndroidOwnerExtraAssertionsRule()
     private lateinit var activity: TestActivity
     private lateinit var latch: CountDownLatch
 
@@ -70,11 +69,12 @@
             activity.setContent {
                 Layout(
                     {},
-                    modifier = Modifier.drawBehind {
-                        // read from the model
-                        offset.value
-                        drawLatch.countDown()
-                    }
+                    modifier =
+                        Modifier.drawBehind {
+                            // read from the model
+                            offset.value
+                            drawLatch.countDown()
+                        }
                 ) { _, _ ->
                     layout(10, 10) {
                         // read from the model
@@ -89,18 +89,14 @@
 
         drawLatch = CountDownLatch(1)
         positionLatch = CountDownLatch(1)
-        rule.runOnUiThread {
-            offset.value = 7
-        }
+        rule.runOnUiThread { offset.value = 7 }
 
         assertTrue(drawLatch.await(1, TimeUnit.SECONDS))
         assertTrue(positionLatch.await(1, TimeUnit.SECONDS))
 
         drawLatch = CountDownLatch(1)
         positionLatch = CountDownLatch(1)
-        rule.runOnUiThread {
-            offset.value = 10
-        }
+        rule.runOnUiThread { offset.value = 10 }
 
         assertTrue(drawLatch.await(1, TimeUnit.SECONDS))
         assertTrue(positionLatch.await(1, TimeUnit.SECONDS))
@@ -117,11 +113,12 @@
             activity.setContent {
                 Layout(
                     {},
-                    modifier = Modifier.drawBehind {
-                        // read from the model
-                        drawModel.value
-                        drawLatch.countDown()
-                    }
+                    modifier =
+                        Modifier.drawBehind {
+                            // read from the model
+                            drawModel.value
+                            drawLatch.countDown()
+                        }
                 ) { _, _ ->
                     layout(10, 10) {
                         // read from the model
@@ -136,18 +133,14 @@
 
         drawLatch = CountDownLatch(1)
         positionLatch = CountDownLatch(1)
-        rule.runOnUiThread {
-            drawModel.value = 7
-        }
+        rule.runOnUiThread { drawModel.value = 7 }
 
         assertTrue(drawLatch.await(1, TimeUnit.SECONDS))
         assertFalse(positionLatch.await(200, TimeUnit.MILLISECONDS))
 
         drawLatch = CountDownLatch(1)
         positionLatch = CountDownLatch(1)
-        rule.runOnUiThread {
-            positionModel.value = 10
-        }
+        rule.runOnUiThread { positionModel.value = 10 }
 
         assertTrue(positionLatch.await(1, TimeUnit.SECONDS))
         assertFalse(drawLatch.await(200, TimeUnit.MILLISECONDS))
@@ -162,11 +155,12 @@
             activity.setContent {
                 Layout(
                     {},
-                    modifier = Modifier.drawBehind {
-                        // read from the model
-                        offset.value
-                        drawLatch.countDown()
-                    }
+                    modifier =
+                        Modifier.drawBehind {
+                            // read from the model
+                            offset.value
+                            drawLatch.countDown()
+                        }
                 ) { _, _ ->
                     measureLatch.countDown()
                     // read from the model
@@ -179,18 +173,14 @@
 
         measureLatch = CountDownLatch(1)
         drawLatch = CountDownLatch(1)
-        rule.runOnUiThread {
-            offset.value = 10
-        }
+        rule.runOnUiThread { offset.value = 10 }
 
         assertTrue(measureLatch.await(1, TimeUnit.SECONDS))
         assertTrue(drawLatch.await(1, TimeUnit.SECONDS))
 
         measureLatch = CountDownLatch(1)
         drawLatch = CountDownLatch(1)
-        rule.runOnUiThread {
-            offset.value = 15
-        }
+        rule.runOnUiThread { offset.value = 15 }
 
         assertTrue(measureLatch.await(1, TimeUnit.SECONDS))
         assertTrue(drawLatch.await(1, TimeUnit.SECONDS))
@@ -220,9 +210,7 @@
 
         measureLatch = CountDownLatch(1)
         positionLatch = CountDownLatch(1)
-        rule.runOnUiThread {
-            measureModel.value = 10
-        }
+        rule.runOnUiThread { measureModel.value = 10 }
 
         assertTrue(measureLatch.await(1, TimeUnit.SECONDS))
         // remeasuring automatically triggers relayout
@@ -230,9 +218,7 @@
 
         measureLatch = CountDownLatch(1)
         positionLatch = CountDownLatch(1)
-        rule.runOnUiThread {
-            positionModel.value = 15
-        }
+        rule.runOnUiThread { positionModel.value = 15 }
 
         assertFalse(measureLatch.await(200, TimeUnit.MILLISECONDS))
         assertTrue(positionLatch.await(1, TimeUnit.SECONDS))
@@ -246,15 +232,15 @@
             activity.setContent {
                 AtLeastSize(
                     10,
-                    modifier = Modifier.drawBehind {
-                        if (enabled.value) {
-                            // read the model
-                            model.value
+                    modifier =
+                        Modifier.drawBehind {
+                            if (enabled.value) {
+                                // read the model
+                                model.value
+                            }
+                            latch.countDown()
                         }
-                        latch.countDown()
-                    }
-                ) {
-                }
+                ) {}
             }
         }
         assertTrue(latch.await(1, TimeUnit.SECONDS))
@@ -310,13 +296,14 @@
         val model = mutableStateOf(0)
         rule.runOnUiThread {
             activity.setContent {
-                val modifier = if (enabled.value) {
-                    Modifier.drawBehind {
-                        // read the model
-                        model.value
-                        latch.countDown()
-                    }
-                } else Modifier
+                val modifier =
+                    if (enabled.value) {
+                        Modifier.drawBehind {
+                            // read the model
+                            model.value
+                            latch.countDown()
+                        }
+                    } else Modifier
                 AtLeastSize(10, modifier = modifier) {}
             }
         }
@@ -392,9 +379,7 @@
 
         latch = CountDownLatch(1)
 
-        rule.runOnUiThread {
-            model.value = 1
-        }
+        rule.runOnUiThread { model.value = 1 }
 
         assertTrue(latch.await(1, TimeUnit.SECONDS))
     }
@@ -435,9 +420,7 @@
         remeasureLatch = CountDownLatch(1)
         relayoutLatch = CountDownLatch(1)
 
-        rule.runOnUiThread {
-            relayoutModel.value = 1
-        }
+        rule.runOnUiThread { relayoutModel.value = 1 }
 
         assertTrue(remeasureLatch.await(1, TimeUnit.SECONDS))
         assertTrue(relayoutLatch.await(1, TimeUnit.SECONDS))
@@ -473,9 +456,7 @@
         remeasureLatch = CountDownLatch(1)
         relayoutLatch = CountDownLatch(1)
 
-        rule.runOnUiThread {
-            remeasureModel.value = 1
-        }
+        rule.runOnUiThread { remeasureModel.value = 1 }
 
         assertTrue(remeasureLatch.await(1, TimeUnit.SECONDS))
         assertTrue(relayoutLatch.await(1, TimeUnit.SECONDS))
@@ -504,9 +485,7 @@
 
         latch = CountDownLatch(1)
 
-        rule.runOnUiThread {
-            model.value = 1
-        }
+        rule.runOnUiThread { model.value = 1 }
 
         assertTrue(latch.await(1, TimeUnit.SECONDS))
     }
@@ -650,9 +629,7 @@
 
         assertTrue(latch.await(1, TimeUnit.HOURS))
 
-        rule.runOnUiThread {
-            assertEquals(1, parentLayoutsCount)
-        }
+        rule.runOnUiThread { assertEquals(1, parentLayoutsCount) }
     }
 
     @Test
@@ -660,31 +637,26 @@
         val model = mutableStateOf(0)
         var modifier by mutableStateOf(Modifier.layout(onMeasure = { latch.countDown() }))
         rule.runOnUiThread {
-            activity.setContent {
-                Layout({}, modifier) { _, _ ->
-                    layout(10, 10) {}
-                }
-            }
+            activity.setContent { Layout({}, modifier) { _, _ -> layout(10, 10) {} } }
         }
         assertTrue(latch.await(1, TimeUnit.SECONDS))
 
         latch = CountDownLatch(1)
         rule.runOnUiThread {
-            modifier = Modifier.layout(
-                onMeasure = {
-                    // read the model
-                    model.value
-                    latch.countDown()
-                }
-            )
+            modifier =
+                Modifier.layout(
+                    onMeasure = {
+                        // read the model
+                        model.value
+                        latch.countDown()
+                    }
+                )
         }
 
         assertTrue(latch.await(1, TimeUnit.SECONDS))
 
         latch = CountDownLatch(1)
-        rule.runOnUiThread {
-            model.value++
-        }
+        rule.runOnUiThread { model.value++ }
 
         assertTrue(latch.await(1, TimeUnit.SECONDS))
     }
@@ -694,31 +666,26 @@
         val model = mutableStateOf(0)
         var modifier by mutableStateOf(Modifier.layout(onLayout = { latch.countDown() }))
         rule.runOnUiThread {
-            activity.setContent {
-                Layout({}, modifier) { _, _ ->
-                    layout(10, 10) {}
-                }
-            }
+            activity.setContent { Layout({}, modifier) { _, _ -> layout(10, 10) {} } }
         }
         assertTrue(latch.await(1, TimeUnit.SECONDS))
 
         latch = CountDownLatch(1)
         rule.runOnUiThread {
-            modifier = Modifier.layout(
-                onLayout = {
-                    // read the model
-                    model.value
-                    latch.countDown()
-                }
-            )
+            modifier =
+                Modifier.layout(
+                    onLayout = {
+                        // read the model
+                        model.value
+                        latch.countDown()
+                    }
+                )
         }
 
         assertTrue(latch.await(1, TimeUnit.SECONDS))
 
         latch = CountDownLatch(1)
-        rule.runOnUiThread {
-            model.value++
-        }
+        rule.runOnUiThread { model.value++ }
 
         assertTrue(latch.await(1, TimeUnit.SECONDS))
     }
@@ -740,9 +707,7 @@
         assertTrue(latch.await(1, TimeUnit.SECONDS))
 
         latch = CountDownLatch(1)
-        rule.runOnUiThread {
-            state.value++
-        }
+        rule.runOnUiThread { state.value++ }
 
         assertTrue(latch.await(1, TimeUnit.SECONDS))
     }
@@ -763,15 +728,11 @@
         triggeredByEnableSwitch: Boolean = true
     ) {
         latch = CountDownLatch(1)
-        rule.runOnUiThread {
-            valueModel.value++
-        }
+        rule.runOnUiThread { valueModel.value++ }
         assertTrue(latch.await(1, TimeUnit.SECONDS))
 
         latch = CountDownLatch(1)
-        rule.runOnUiThread {
-            enableModel.value = false
-        }
+        rule.runOnUiThread { enableModel.value = false }
         if (triggeredByEnableSwitch) {
             assertTrue(latch.await(1, TimeUnit.SECONDS))
         } else {
@@ -779,9 +740,7 @@
         }
 
         latch = CountDownLatch(1)
-        rule.runOnUiThread {
-            valueModel.value++
-        }
+        rule.runOnUiThread { valueModel.value++ }
         assertFalse(latch.await(200, TimeUnit.MILLISECONDS))
     }
 }
diff --git a/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/node/ModifierNodeAncestorsTest.kt b/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/node/ModifierNodeAncestorsTest.kt
index 103de5d..c0ebf8f 100644
--- a/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/node/ModifierNodeAncestorsTest.kt
+++ b/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/node/ModifierNodeAncestorsTest.kt
@@ -31,21 +31,16 @@
 @SmallTest
 @RunWith(AndroidJUnit4::class)
 class ModifierNodeAncestorsTest {
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
     @Test
     fun noAncestors() {
         // Arrange.
         val node = object : Modifier.Node() {}
-        rule.setContent {
-            Box(Modifier.elementOf(node))
-        }
+        rule.setContent { Box(Modifier.elementOf(node)) }
 
         // Act.
-        val ancestors = rule.runOnIdle {
-            node.ancestors(Nodes.Any)
-        }
+        val ancestors = rule.runOnIdle { node.ancestors(Nodes.Any) }
 
         // Assert.
         assertThat(ancestors?.trimRootModifierNodes()).isEmpty()
@@ -55,14 +50,10 @@
     fun noMatchingAncestors() {
         // Arrange.
         val node = object : Modifier.Node() {}
-        rule.setContent {
-            Box(Modifier.elementOf(node))
-        }
+        rule.setContent { Box(Modifier.elementOf(node)) }
 
         // Act.
-        val ancestors = rule.runOnIdle {
-            node.ancestors(Nodes.GlobalPositionAware)
-        }
+        val ancestors = rule.runOnIdle { node.ancestors(Nodes.GlobalPositionAware) }
 
         // Assert.
         assertThat(ancestors).isNull()
@@ -74,17 +65,13 @@
         val (node, localAncestor1, localAncestor2) = List(3) { object : Modifier.Node() {} }
         rule.setContent {
             Box(
-                modifier = Modifier
-                    .elementOf(localAncestor2)
-                    .elementOf(localAncestor1)
-                    .elementOf(node)
+                modifier =
+                    Modifier.elementOf(localAncestor2).elementOf(localAncestor1).elementOf(node)
             )
         }
 
         // Act.
-        val result = rule.runOnIdle {
-            node.ancestors(Nodes.Any)
-        }
+        val result = rule.runOnIdle { node.ancestors(Nodes.Any) }
 
         // Assert.
         assertThat(result?.trimRootModifierNodes())
@@ -99,17 +86,13 @@
         val (localAncestor1, localAncestor2) = List(2) { object : Modifier.Node() {} }
 
         rule.setContent {
-            Box(
-                modifier = Modifier
-                    .elementOf(ancestor2)
-                    .elementOf(ancestor1)
-            ) {
+            Box(modifier = Modifier.elementOf(ancestor2).elementOf(ancestor1)) {
                 Box {
                     Box(
-                        modifier = Modifier
-                            .elementOf(localAncestor2)
-                            .elementOf(localAncestor1)
-                            .elementOf(node)
+                        modifier =
+                            Modifier.elementOf(localAncestor2)
+                                .elementOf(localAncestor1)
+                                .elementOf(node)
                     )
                 }
             }
@@ -117,9 +100,7 @@
         }
 
         // Act.
-        val result = rule.runOnIdle {
-            node.ancestors(Nodes.Any)
-        }
+        val result = rule.runOnIdle { node.ancestors(Nodes.Any) }
 
         // Assert.
         assertThat(result?.trimRootModifierNodes())
@@ -136,18 +117,15 @@
         val (localAncestor2, localAncestor3) = List(2) { object : Modifier.Node() {} }
         rule.setContent {
             Box(
-                modifier = Modifier
-                    .elementOf(ancestor4)
-                    .elementOf(ancestor3)
-                    .elementOf(ancestor2)
+                modifier = Modifier.elementOf(ancestor4).elementOf(ancestor3).elementOf(ancestor2)
             ) {
                 Box(Modifier.elementOf(ancestor1)) {
                     Box(
-                        modifier = Modifier
-                            .elementOf(localAncestor3)
-                            .elementOf(localAncestor2)
-                            .elementOf(localAncestor1)
-                            .elementOf(node)
+                        modifier =
+                            Modifier.elementOf(localAncestor3)
+                                .elementOf(localAncestor2)
+                                .elementOf(localAncestor1)
+                                .elementOf(node)
                     )
                 }
             }
@@ -160,9 +138,7 @@
         }
 
         // Act.
-        val result = rule.runOnIdle {
-            node.ancestors(Nodes.Any)
-        }
+        val result = rule.runOnIdle { node.ancestors(Nodes.Any) }
 
         // Assert.
         assertThat(result?.trimRootModifierNodes())
@@ -176,23 +152,11 @@
         val (ancestor1, ancestor2, ancestor3, ancestor4) = List(4) { FocusTargetNode() }
         val (node, other1, other2, other3) = List(4) { FocusTargetNode() }
         rule.setContent {
-            Box(
-                Modifier
-                    .elementOf(ancestor4)
-                    .elementOf(ancestor3)
-            ) {
+            Box(Modifier.elementOf(ancestor4).elementOf(ancestor3)) {
                 Box {
                     Box(Modifier.elementOf(other1))
-                    Box(
-                        Modifier
-                            .elementOf(ancestor2)
-                            .elementOf(ancestor1)
-                    ) {
-                        Box(
-                            Modifier
-                                .elementOf(node)
-                                .elementOf(other3)
-                        )
+                    Box(Modifier.elementOf(ancestor2).elementOf(ancestor1)) {
+                        Box(Modifier.elementOf(node).elementOf(other3))
                     }
                     Box(Modifier.elementOf(other2))
                 }
@@ -200,9 +164,7 @@
         }
 
         // Act.
-        val ancestors = rule.runOnIdle {
-            node.ancestors(Nodes.FocusTarget)
-        }
+        val ancestors = rule.runOnIdle { node.ancestors(Nodes.FocusTarget) }
 
         // Assert.
         // This test returns all ancestors, even the root focus node. so we drop that one.
diff --git a/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/node/ModifierNodeAttachOrderTest.kt b/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/node/ModifierNodeAttachOrderTest.kt
index 0496bbc..ac145b1 100644
--- a/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/node/ModifierNodeAttachOrderTest.kt
+++ b/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/node/ModifierNodeAttachOrderTest.kt
@@ -39,6 +39,7 @@
             log.add("update($field -> $value)")
             field = value
         }
+
     override fun onAttach() {
         log.add("attach($name)")
     }
@@ -71,8 +72,7 @@
 @SmallTest
 @RunWith(AndroidJUnit4::class)
 class ModifierNodeAttachOrderTest {
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
     @Test
     fun attachOrderInitialComposition() {
@@ -83,19 +83,16 @@
         val c = LoggerNode(log, "c")
         val d = LoggerNode(log, "d")
 
-        rule.setContent {
-            Box(modifierOf(a, b)) {
-                Box(modifierOf(c, d))
-            }
-        }
+        rule.setContent { Box(modifierOf(a, b)) { Box(modifierOf(c, d)) } }
 
         rule.runOnIdle {
-            assertThat(log).containsExactly(
-                "attach(a)",
-                "attach(b)",
-                "attach(c)",
-                "attach(d)",
-            )
+            assertThat(log)
+                .containsExactly(
+                    "attach(a)",
+                    "attach(b)",
+                    "attach(c)",
+                    "attach(d)",
+                )
         }
     }
 
@@ -112,30 +109,21 @@
         var parentChain by mutableStateOf<Modifier>(padding)
         var childChain by mutableStateOf<Modifier>(padding)
 
-        rule.setContent {
-            Box(parentChain) {
-                Box(childChain)
-            }
+        rule.setContent { Box(parentChain) { Box(childChain) } }
+
+        rule.runOnIdle {
+            parentChain = Modifier.elementOf(a).then(padding).elementOf(b)
+            childChain = Modifier.elementOf(c).then(padding).elementOf(d)
         }
 
         rule.runOnIdle {
-            parentChain = Modifier
-                .elementOf(a)
-                .then(padding)
-                .elementOf(b)
-            childChain = Modifier
-                .elementOf(c)
-                .then(padding)
-                .elementOf(d)
-        }
-
-        rule.runOnIdle {
-            assertThat(log).containsExactly(
-                "attach(a)",
-                "attach(b)",
-                "attach(c)",
-                "attach(d)",
-            )
+            assertThat(log)
+                .containsExactly(
+                    "attach(a)",
+                    "attach(b)",
+                    "attach(c)",
+                    "attach(d)",
+                )
         }
     }
 
@@ -143,52 +131,40 @@
     fun attachOrderWhenMiddleIsRemoved() {
         // Arrange.
         val log = mutableListOf<String>()
-        var parentChain by mutableStateOf<Modifier>(
-            Modifier
-                .logger(log, "a")
-                .logger(log, "b")
-                .logger(log, "c")
-        )
+        var parentChain by
+            mutableStateOf<Modifier>(Modifier.logger(log, "a").logger(log, "b").logger(log, "c"))
 
-        rule.setContent {
-            Box(parentChain)
-        }
+        rule.setContent { Box(parentChain) }
 
         rule.runOnIdle {
-            assertThat(log).containsExactly(
-                "attach(a)",
-                "attach(b)",
-                "attach(c)",
-            )
+            assertThat(log)
+                .containsExactly(
+                    "attach(a)",
+                    "attach(b)",
+                    "attach(c)",
+                )
             log.clear()
         }
 
-        rule.runOnIdle {
-            parentChain = Modifier
-                .logger(log, "a")
-                .logger(log, "c")
-        }
+        rule.runOnIdle { parentChain = Modifier.logger(log, "a").logger(log, "c") }
 
         rule.runOnIdle {
-            assertThat(log).containsExactly(
-                "detach(c)",
-                "update(b -> c)",
-            )
+            assertThat(log)
+                .containsExactly(
+                    "detach(c)",
+                    "update(b -> c)",
+                )
             log.clear()
         }
 
-        rule.runOnIdle {
-            parentChain = Modifier
-                .logger(log, "a")
-                .logger(log, "b")
-                .logger(log, "c")
-        }
+        rule.runOnIdle { parentChain = Modifier.logger(log, "a").logger(log, "b").logger(log, "c") }
 
         rule.runOnIdle {
-            assertThat(log).containsExactly(
-                "attach(c)",
-                "update(c -> b)",
-            )
+            assertThat(log)
+                .containsExactly(
+                    "attach(c)",
+                    "update(c -> b)",
+                )
             log.clear()
         }
     }
@@ -197,41 +173,38 @@
     fun addMultipleNodesInMiddle() {
         // Arrange.
         val log = mutableListOf<String>()
-        var parentChain by mutableStateOf<Modifier>(
-            Modifier
-                .logger(log, "a")
-                .padding(10)
-                .padding(10)
-                .logger(log, "z")
-        )
+        var parentChain by
+            mutableStateOf<Modifier>(
+                Modifier.logger(log, "a").padding(10).padding(10).logger(log, "z")
+            )
 
-        rule.setContent {
-            Box(parentChain)
-        }
+        rule.setContent { Box(parentChain) }
 
         rule.runOnIdle {
-            assertThat(log).containsExactly(
-                "attach(a)",
-                "attach(z)",
-            )
+            assertThat(log)
+                .containsExactly(
+                    "attach(a)",
+                    "attach(z)",
+                )
             log.clear()
         }
 
         rule.runOnIdle {
-            parentChain = Modifier
-                .logger(log, "a")
-                .padding(10)
-                .logger(log, "b")
-                .logger(log, "c")
-                .padding(10)
-                .logger(log, "z")
+            parentChain =
+                Modifier.logger(log, "a")
+                    .padding(10)
+                    .logger(log, "b")
+                    .logger(log, "c")
+                    .padding(10)
+                    .logger(log, "z")
         }
 
         rule.runOnIdle {
-            assertThat(log).containsExactly(
-                "attach(c)",
-                "attach(b)",
-            )
+            assertThat(log)
+                .containsExactly(
+                    "attach(c)",
+                    "attach(b)",
+                )
             log.clear()
         }
     }
@@ -240,65 +213,57 @@
     fun addMultipleNodesInMiddleMultipleLayouts() {
         // Arrange.
         val log = mutableListOf<String>()
-        var parentChain by mutableStateOf<Modifier>(
-            Modifier
-                .logger(log, "a")
-                .padding(10)
-                .padding(10)
-                .logger(log, "d")
-        )
+        var parentChain by
+            mutableStateOf<Modifier>(
+                Modifier.logger(log, "a").padding(10).padding(10).logger(log, "d")
+            )
 
-        var childChain by mutableStateOf<Modifier>(
-            Modifier
-                .logger(log, "e")
-                .padding(10)
-                .padding(10)
-                .logger(log, "h")
-        )
+        var childChain by
+            mutableStateOf<Modifier>(
+                Modifier.logger(log, "e").padding(10).padding(10).logger(log, "h")
+            )
 
-        rule.setContent {
-            Box(parentChain) {
-                Box(childChain)
-            }
-        }
+        rule.setContent { Box(parentChain) { Box(childChain) } }
 
         rule.runOnIdle {
-            assertThat(log).containsExactly(
-                "attach(a)",
-                "attach(d)",
-                "attach(e)",
-                "attach(h)",
-            )
+            assertThat(log)
+                .containsExactly(
+                    "attach(a)",
+                    "attach(d)",
+                    "attach(e)",
+                    "attach(h)",
+                )
             log.clear()
         }
 
         rule.runOnIdle {
-            parentChain = Modifier
-                .logger(log, "a")
-                .padding(10)
-                .logger(log, "b")
-                .logger(log, "c")
-                .padding(10)
-                .logger(log, "d")
+            parentChain =
+                Modifier.logger(log, "a")
+                    .padding(10)
+                    .logger(log, "b")
+                    .logger(log, "c")
+                    .padding(10)
+                    .logger(log, "d")
 
-            childChain = Modifier
-                .logger(log, "e")
-                .padding(10)
-                .logger(log, "f")
-                .logger(log, "g")
-                .padding(10)
-                .logger(log, "h")
+            childChain =
+                Modifier.logger(log, "e")
+                    .padding(10)
+                    .logger(log, "f")
+                    .logger(log, "g")
+                    .padding(10)
+                    .logger(log, "h")
         }
 
         rule.runOnIdle {
-            assertThat(log).containsExactly(
-                // parent updates first
-                "attach(c)",
-                "attach(b)",
-                // then child
-                "attach(g)",
-                "attach(f)",
-            )
+            assertThat(log)
+                .containsExactly(
+                    // parent updates first
+                    "attach(c)",
+                    "attach(b)",
+                    // then child
+                    "attach(g)",
+                    "attach(f)",
+                )
             log.clear()
         }
     }
@@ -309,32 +274,22 @@
         var active by mutableStateOf(true)
         var inBox by mutableStateOf(true)
         val content = movableContentOf {
-            SubcompositionReusableContentHost(active = active) {
-                BasicText("Hello World")
-            }
+            SubcompositionReusableContentHost(active = active) { BasicText("Hello World") }
         }
 
         rule.setContent {
             if (inBox) {
-                Box {
-                    content()
-                }
+                Box { content() }
             } else {
                 content()
             }
         }
 
-        rule.runOnIdle {
-            active = false
-        }
+        rule.runOnIdle { active = false }
 
-        rule.runOnIdle {
-            inBox = false
-        }
+        rule.runOnIdle { inBox = false }
 
-        rule.runOnIdle {
-            active = true
-        }
+        rule.runOnIdle { active = true }
 
         rule.waitForIdle()
     }
diff --git a/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/node/ModifierNodeChildTest.kt b/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/node/ModifierNodeChildTest.kt
index 47f895f..de961b7 100644
--- a/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/node/ModifierNodeChildTest.kt
+++ b/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/node/ModifierNodeChildTest.kt
@@ -30,21 +30,16 @@
 @SmallTest
 @RunWith(AndroidJUnit4::class)
 class ModifierNodeChildTest {
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
     @Test
     fun noChildren() {
         // Arrange.
         val node = object : Modifier.Node() {}
-        rule.setContent {
-            Box(Modifier.elementOf(node))
-        }
+        rule.setContent { Box(Modifier.elementOf(node)) }
 
         // Act.
-        val result = rule.runOnIdle {
-            node.child
-        }
+        val result = rule.runOnIdle { node.child }
 
         // Assert.
         assertThat(result.toString()).isEqualTo("<tail>")
@@ -55,17 +50,11 @@
         // Arrange.
         val (node, localChild1, localChild2) = List(3) { object : Modifier.Node() {} }
         rule.setContent {
-            Box(
-                Modifier.elementOf(node)
-                    .elementOf(localChild1)
-                    .elementOf(localChild2)
-            )
+            Box(Modifier.elementOf(node).elementOf(localChild1).elementOf(localChild2))
         }
 
         // Act.
-        val result = rule.runOnIdle {
-            node.child
-        }
+        val result = rule.runOnIdle { node.child }
 
         // Assert.
         assertThat(result).isEqualTo(localChild1)
@@ -75,18 +64,10 @@
     fun nonContiguousChild() {
         // Arrange.
         val (node, localChild) = List(2) { object : Modifier.Node() {} }
-        rule.setContent {
-            Box(
-                Modifier.elementOf(node)
-                    .otherModifier()
-                    .elementOf(localChild)
-            )
-        }
+        rule.setContent { Box(Modifier.elementOf(node).otherModifier().elementOf(localChild)) }
 
         // Act.
-        val result = rule.runOnIdle {
-            node.child
-        }
+        val result = rule.runOnIdle { node.child }
 
         // Assert.
         assertThat(result).isEqualTo(localChild)
@@ -97,19 +78,11 @@
         // Arrange.
         val (node, child1, child2) = List(3) { object : Modifier.Node() {} }
         rule.setContent {
-            Box(Modifier.elementOf(node)) {
-                Box(
-                    Modifier
-                        .elementOf(child1)
-                        .elementOf(child2)
-                )
-            }
+            Box(Modifier.elementOf(node)) { Box(Modifier.elementOf(child1).elementOf(child2)) }
         }
 
         // Act.
-        val result = rule.runOnIdle {
-            node.child
-        }
+        val result = rule.runOnIdle { node.child }
 
         // Assert.
         assertThat(result.toString()).isEqualTo("<tail>")
@@ -120,18 +93,12 @@
         val (node, child) = List(2) { object : Modifier.Node() {} }
         rule.setContent {
             Box(Modifier.elementOf(node)) {
-                Box {
-                    Box(Modifier.otherModifier()) {
-                        Box(Modifier.elementOf(child))
-                    }
-                }
+                Box { Box(Modifier.otherModifier()) { Box(Modifier.elementOf(child)) } }
             }
         }
 
         // Act.
-        val result = rule.runOnIdle {
-            node.child
-        }
+        val result = rule.runOnIdle { node.child }
 
         // Assert.
         assertThat(result).isEqualTo(child)
@@ -142,22 +109,11 @@
     fun withinCurrentLayoutNode_skipsUnAttachedChild() {
         // Arrange.
         val (node, child1, child2) = List(3) { object : Modifier.Node() {} }
-        rule.setContent {
-            Box(
-                Modifier
-                    .elementOf(node)
-                    .elementOf(child1)
-                    .elementOf(child2)
-            )
-        }
-        rule.runOnIdle {
-            child1.markAsDetached()
-        }
+        rule.setContent { Box(Modifier.elementOf(node).elementOf(child1).elementOf(child2)) }
+        rule.runOnIdle { child1.markAsDetached() }
 
         // Act.
-        val result = rule.runOnIdle {
-            node.child
-        }
+        val result = rule.runOnIdle { node.child }
 
         // Assert.
         assertThat(result).isEqualTo(child2)
diff --git a/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/node/ModifierNodeCoroutineScopeTest.kt b/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/node/ModifierNodeCoroutineScopeTest.kt
index aa3938b..e5d4e21 100644
--- a/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/node/ModifierNodeCoroutineScopeTest.kt
+++ b/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/node/ModifierNodeCoroutineScopeTest.kt
@@ -36,8 +36,7 @@
 @RunWith(AndroidJUnit4::class)
 class ModifierNodeCoroutineScopeTest {
 
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
     @Test
     fun detach_doesNotCaptureStackTrace() {
@@ -56,25 +55,24 @@
             }
         }
 
-        val testElement = object : ModifierNodeElement<TestNode>() {
-            override fun create(): TestNode = TestNode()
-            override fun update(node: TestNode) {}
+        val testElement =
+            object : ModifierNodeElement<TestNode>() {
+                override fun create(): TestNode = TestNode()
 
-            override fun hashCode(): Int = 0
-            override fun equals(other: Any?): Boolean = other === this
-        }
+                override fun update(node: TestNode) {}
+
+                override fun hashCode(): Int = 0
+
+                override fun equals(other: Any?): Boolean = other === this
+            }
 
         rule.setContent {
             if (shouldAttachNode) {
                 Box(Modifier.then(testElement))
             }
         }
-        rule.runOnIdle {
-            shouldAttachNode = false
-        }
+        rule.runOnIdle { shouldAttachNode = false }
 
-        rule.runOnIdle {
-            assertThat(exception!!.stackTrace).isEmpty()
-        }
+        rule.runOnIdle { assertThat(exception!!.stackTrace).isEmpty() }
     }
 }
diff --git a/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/node/ModifierNodeNearestAncestorTest.kt b/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/node/ModifierNodeNearestAncestorTest.kt
index 49f666f..1dac407 100644
--- a/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/node/ModifierNodeNearestAncestorTest.kt
+++ b/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/node/ModifierNodeNearestAncestorTest.kt
@@ -30,21 +30,16 @@
 @SmallTest
 @RunWith(AndroidJUnit4::class)
 class ModifierNodeNearestAncestorTest {
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
     @Test
     fun noAncestors() {
         // Arrange.
         val node = object : Modifier.Node() {}
-        rule.setContent {
-            Box(Modifier.elementOf(node))
-        }
+        rule.setContent { Box(Modifier.elementOf(node)) }
 
         // Act.
-        val result = rule.runOnIdle {
-            node.nearestAncestor(Nodes.GlobalPositionAware)
-        }
+        val result = rule.runOnIdle { node.nearestAncestor(Nodes.GlobalPositionAware) }
 
         // Assert.
         assertThat(result).isNull()
@@ -55,17 +50,11 @@
         // Arrange.
         val (ancestor, node) = List(2) { object : Modifier.Node() {} }
         rule.setContent {
-            Box(Modifier.elementOf(ancestor)) {
-                Box {
-                    Box(Modifier.elementOf(node))
-                }
-            }
+            Box(Modifier.elementOf(ancestor)) { Box { Box(Modifier.elementOf(node)) } }
         }
 
         // Act.
-        val result = rule.runOnIdle {
-            node.nearestAncestor(Nodes.Any)
-        }
+        val result = rule.runOnIdle { node.nearestAncestor(Nodes.Any) }
 
         // Assert.
         assertThat(result).isEqualTo(ancestor)
@@ -75,18 +64,10 @@
     fun nearestAncestorWithinCurrentLayoutNode_immediateParent() {
         // Arrange.
         val (ancestor, node) = List(2) { object : Modifier.Node() {} }
-        rule.setContent {
-            Box(
-                Modifier
-                    .elementOf(ancestor)
-                    .elementOf(node)
-            )
-        }
+        rule.setContent { Box(Modifier.elementOf(ancestor).elementOf(node)) }
 
         // Act.
-        val result = rule.runOnIdle {
-            node.nearestAncestor(Nodes.Any)
-        }
+        val result = rule.runOnIdle { node.nearestAncestor(Nodes.Any) }
 
         // Assert.
         assertThat(result).isEqualTo(ancestor)
@@ -96,18 +77,10 @@
     fun nearestAncestorWithinCurrentLayoutNode_nonContiguousAncestor() {
         // Arrange.
         val (ancestor, node) = List(2) { object : Modifier.Node() {} }
-        rule.setContent {
-            Box(
-                Modifier.elementOf(ancestor)
-                    .otherModifier()
-                    .elementOf(node)
-            )
-        }
+        rule.setContent { Box(Modifier.elementOf(ancestor).otherModifier().elementOf(node)) }
 
         // Act.
-        val result = rule.runOnIdle {
-            node.nearestAncestor(Nodes.Any)
-        }
+        val result = rule.runOnIdle { node.nearestAncestor(Nodes.Any) }
 
         // Assert.
         assertThat(result).isEqualTo(ancestor)
@@ -117,16 +90,10 @@
     fun nearestAncestorInDifferentLayoutNode_immediateParentLayoutNode() {
         // Arrange.
         val (ancestor, node) = List(2) { object : Modifier.Node() {} }
-        rule.setContent {
-            Box(Modifier.elementOf(ancestor)) {
-                Box(Modifier.elementOf(node))
-            }
-        }
+        rule.setContent { Box(Modifier.elementOf(ancestor)) { Box(Modifier.elementOf(node)) } }
 
         // Act.
-        val result = rule.runOnIdle {
-            node.nearestAncestor(Nodes.Any)
-        }
+        val result = rule.runOnIdle { node.nearestAncestor(Nodes.Any) }
 
         // Assert.
         assertThat(result).isEqualTo(ancestor)
@@ -137,22 +104,11 @@
     fun unattachedLocalAncestorIsSkipped() {
         // Arrange.
         val (ancestor1, ancestor2, node) = List(3) { object : Modifier.Node() {} }
-        rule.setContent {
-            Box(
-                Modifier
-                    .elementOf(ancestor2)
-                    .elementOf(ancestor1)
-                    .elementOf(node)
-            )
-        }
-        rule.runOnIdle {
-            ancestor1.markAsDetached()
-        }
+        rule.setContent { Box(Modifier.elementOf(ancestor2).elementOf(ancestor1).elementOf(node)) }
+        rule.runOnIdle { ancestor1.markAsDetached() }
 
         // Act.
-        val result = rule.runOnIdle {
-            node.nearestAncestor(Nodes.Any)
-        }
+        val result = rule.runOnIdle { node.nearestAncestor(Nodes.Any) }
 
         // Assert.
         assertThat(result).isEqualTo(ancestor2)
@@ -165,23 +121,13 @@
         val (ancestor, localAncestor, node) = List(3) { object : Modifier.Node() {} }
         rule.setContent {
             Box(Modifier.elementOf(ancestor)) {
-                Box {
-                    Box(
-                        Modifier
-                            .elementOf(localAncestor)
-                            .elementOf(node)
-                    )
-                }
+                Box { Box(Modifier.elementOf(localAncestor).elementOf(node)) }
             }
         }
-        rule.runOnIdle {
-            localAncestor.markAsDetached()
-        }
+        rule.runOnIdle { localAncestor.markAsDetached() }
 
         // Act.
-        val result = rule.runOnIdle {
-            node.nearestAncestor(Nodes.Any)
-        }
+        val result = rule.runOnIdle { node.nearestAncestor(Nodes.Any) }
 
         // Assert.
         assertThat(result).isEqualTo(ancestor)
@@ -193,22 +139,14 @@
         // Arrange.
         val (ancestor1, ancestor2, node) = List(3) { object : Modifier.Node() {} }
         rule.setContent {
-            Box(
-                Modifier
-                    .elementOf(ancestor2)
-                    .elementOf(ancestor1)
-            ) {
+            Box(Modifier.elementOf(ancestor2).elementOf(ancestor1)) {
                 Box(Modifier.elementOf(node))
             }
         }
-        rule.runOnIdle {
-            ancestor1.markAsDetached()
-        }
+        rule.runOnIdle { ancestor1.markAsDetached() }
 
         // Act.
-        val result = rule.runOnIdle {
-            node.nearestAncestor(Nodes.Any)
-        }
+        val result = rule.runOnIdle { node.nearestAncestor(Nodes.Any) }
 
         // Assert.
         assertThat(result).isEqualTo(ancestor2)
diff --git a/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/node/ModifierNodeVisitAncestorsTest.kt b/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/node/ModifierNodeVisitAncestorsTest.kt
index efcf7d6..a080f21 100644
--- a/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/node/ModifierNodeVisitAncestorsTest.kt
+++ b/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/node/ModifierNodeVisitAncestorsTest.kt
@@ -33,24 +33,17 @@
 @SmallTest
 @RunWith(AndroidJUnit4::class)
 class ModifierNodeVisitAncestorsTest {
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
     @Test
     fun noAncestors() {
         // Arrange.
         val node = object : Modifier.Node() {}
         val visitedAncestors = mutableListOf<Modifier.Node>()
-        rule.setContent {
-            Box(Modifier.elementOf(node))
-        }
+        rule.setContent { Box(Modifier.elementOf(node)) }
 
         // Act.
-        rule.runOnIdle {
-            node.visitAncestors(Nodes.Any) {
-                visitedAncestors.add(it)
-            }
-        }
+        rule.runOnIdle { node.visitAncestors(Nodes.Any) { visitedAncestors.add(it) } }
 
         // Assert.
         assertThat(visitedAncestors.trimRootModifierNodes()).isEmpty()
@@ -62,20 +55,11 @@
         val (node, localParent1, localParent2) = List(3) { object : Modifier.Node() {} }
         val visitedAncestors = mutableListOf<Modifier.Node>()
         rule.setContent {
-            Box(
-                Modifier
-                    .elementOf(localParent2)
-                    .elementOf(localParent1)
-                    .elementOf(node)
-            )
+            Box(Modifier.elementOf(localParent2).elementOf(localParent1).elementOf(node))
         }
 
         // Act.
-        rule.runOnIdle {
-            node.visitAncestors(Nodes.Any) {
-                visitedAncestors.add(it)
-            }
-        }
+        rule.runOnIdle { node.visitAncestors(Nodes.Any) { visitedAncestors.add(it) } }
 
         // Assert.
         assertThat(visitedAncestors.trimRootModifierNodes())
@@ -90,8 +74,7 @@
         val visitedAncestors = mutableListOf<Modifier.Node>()
         rule.setContent {
             Box(
-                Modifier
-                    .elementOf(localParent2)
+                Modifier.elementOf(localParent2)
                     .otherModifier()
                     .elementOf(localParent1)
                     .otherModifier()
@@ -100,11 +83,7 @@
         }
 
         // Act.
-        rule.runOnIdle {
-            node.visitAncestors(Nodes.Any) {
-                visitedAncestors.add(it)
-            }
-        }
+        rule.runOnIdle { node.visitAncestors(Nodes.Any) { visitedAncestors.add(it) } }
 
         // Assert.
         assertThat(visitedAncestors.trimRootModifierNodes())
@@ -120,28 +99,14 @@
         val visitedAncestors = mutableListOf<Modifier.Node>()
         rule.setContent {
             Box(Modifier.elementOf(ancestor3)) {
-                Box(
-                    Modifier
-                        .elementOf(ancestor2)
-                        .elementOf(ancestor1)
-                ) {
-                    Box {
-                        Box(
-                            Modifier
-                                .elementOf(localParent)
-                                .elementOf(node)
-                        )
-                    }
+                Box(Modifier.elementOf(ancestor2).elementOf(ancestor1)) {
+                    Box { Box(Modifier.elementOf(localParent).elementOf(node)) }
                 }
             }
         }
 
         // Act.
-        rule.runOnIdle {
-            node.visitAncestors(Nodes.Any) {
-                visitedAncestors.add(it)
-            }
-        }
+        rule.runOnIdle { node.visitAncestors(Nodes.Any) { visitedAncestors.add(it) } }
 
         // Assert.
         assertThat(visitedAncestors.trimRootModifierNodes())
@@ -160,15 +125,10 @@
         rule.setContent {
             Box(Modifier.elementOf(ancestor4)) {
                 Box(Modifier.elementOf(ancestor3)) {
-                    Box(
-                        Modifier
-                            .elementOf(ancestor2)
-                            .elementOf(ancestor1)
-                    ) {
+                    Box(Modifier.elementOf(ancestor2).elementOf(ancestor1)) {
                         Box {
                             Box(
-                                Modifier
-                                    .elementOf(localParent3)
+                                Modifier.elementOf(localParent3)
                                     .elementOf(localParent2)
                                     .elementOf(localParent1)
                                     .elementOf(node)
@@ -186,11 +146,7 @@
         }
 
         // Act.
-        rule.runOnIdle {
-            node.visitAncestors(Nodes.Any) {
-                visitedAncestors.add(it)
-            }
-        }
+        rule.runOnIdle { node.visitAncestors(Nodes.Any) { visitedAncestors.add(it) } }
 
         // Assert.
         assertThat(visitedAncestors.trimRootModifierNodes())
@@ -209,10 +165,10 @@
         var removeNode by mutableStateOf(false)
         rule.setContent {
             Box(
-                modifier = Modifier
-                    .elementOf(localParent2)
-                    .elementOf(localParent1)
-                    .then(if (removeNode) Modifier else Modifier.elementOf(detachableNode))
+                modifier =
+                    Modifier.elementOf(localParent2)
+                        .elementOf(localParent1)
+                        .then(if (removeNode) Modifier else Modifier.elementOf(detachableNode))
             )
         }
 
@@ -238,17 +194,10 @@
         var removeNode by mutableStateOf(false)
         rule.setContent {
             Box(Modifier.elementOf(ancestor4)) {
-                Box(
-                    Modifier
-                        .elementOf(ancestor3)
-                        .elementOf(ancestor2)
-                ) {
+                Box(Modifier.elementOf(ancestor3).elementOf(ancestor2)) {
                     Box(
-                        Modifier
-                            .elementOf(ancestor1)
-                            .then(
-                                if (removeNode) Modifier else Modifier.elementOf(detachableNode)
-                            )
+                        Modifier.elementOf(ancestor1)
+                            .then(if (removeNode) Modifier else Modifier.elementOf(detachableNode))
                     )
                 }
             }
diff --git a/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/node/ModifierNodeVisitChildrenTest.kt b/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/node/ModifierNodeVisitChildrenTest.kt
index 9ba4db0..2273b6a 100644
--- a/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/node/ModifierNodeVisitChildrenTest.kt
+++ b/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/node/ModifierNodeVisitChildrenTest.kt
@@ -31,24 +31,17 @@
 @RunWith(AndroidJUnit4::class)
 class ModifierNodeVisitChildrenTest {
 
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
     @Test
     fun noChildren() {
         // Arrange.
         val testNode = object : Modifier.Node() {}
         val visitedChildren = mutableListOf<Modifier.Node>()
-        rule.setContent {
-            Box(Modifier.elementOf(testNode))
-        }
+        rule.setContent { Box(Modifier.elementOf(testNode)) }
 
         // Act.
-        rule.runOnIdle {
-            testNode.visitChildren(Nodes.Any) {
-                visitedChildren.add(it)
-            }
-        }
+        rule.runOnIdle { testNode.visitChildren(Nodes.Any) { visitedChildren.add(it) } }
 
         // Assert.
         assertThat(visitedChildren).isEmpty()
@@ -59,21 +52,10 @@
         // Arrange.
         val (node, child1, child2) = List(3) { object : Modifier.Node() {} }
         val visitedChildren = mutableListOf<Modifier.Node>()
-        rule.setContent {
-            Box(
-                Modifier
-                    .elementOf(node)
-                    .elementOf(child1)
-                    .elementOf(child2)
-            )
-        }
+        rule.setContent { Box(Modifier.elementOf(node).elementOf(child1).elementOf(child2)) }
 
         // Act.
-        rule.runOnIdle {
-            node.visitChildren(Nodes.Any) {
-                visitedChildren.add(it)
-            }
-        }
+        rule.runOnIdle { node.visitChildren(Nodes.Any) { visitedChildren.add(it) } }
 
         // Assert.
         assertThat(visitedChildren).containsExactly(child1)
@@ -86,8 +68,7 @@
         val visitedChildren = mutableListOf<Modifier.Node>()
         rule.setContent {
             Box(
-                Modifier
-                    .elementOf(node)
+                Modifier.elementOf(node)
                     .otherModifier()
                     .elementOf(child1)
                     .otherModifier()
@@ -96,11 +77,7 @@
         }
 
         // Act.
-        rule.runOnIdle {
-            node.visitChildren(Nodes.Any) {
-                visitedChildren.add(it)
-            }
-        }
+        rule.runOnIdle { node.visitChildren(Nodes.Any) { visitedChildren.add(it) } }
 
         // Assert.
         assertThat(visitedChildren).containsExactly(child1)
@@ -114,27 +91,17 @@
         val visitedChildren = mutableListOf<Modifier.Node>()
         rule.setContent {
             Box(Modifier.elementOf(node)) {
-                Box(Modifier.elementOf(child1)) {
-                    Box(Modifier.elementOf(grandchild1))
-                }
-                Box(Modifier.elementOf(child2)) {
-                    Box(Modifier.elementOf(grandchild2))
-                }
+                Box(Modifier.elementOf(child1)) { Box(Modifier.elementOf(grandchild1)) }
+                Box(Modifier.elementOf(child2)) { Box(Modifier.elementOf(grandchild2)) }
                 Box(Modifier.elementOf(child3))
             }
         }
 
         // Act.
-        rule.runOnIdle {
-            node.visitChildren(Nodes.Any) {
-                visitedChildren.add(it)
-            }
-        }
+        rule.runOnIdle { node.visitChildren(Nodes.Any) { visitedChildren.add(it) } }
 
         // Assert.
-        assertThat(visitedChildren)
-            .containsExactly(child1, child2, child3)
-            .inOrder()
+        assertThat(visitedChildren).containsExactly(child1, child2, child3).inOrder()
     }
 
     @Ignore("b/278765590")
@@ -143,29 +110,14 @@
         // Arrange.
         val (node, child1, child2) = List(3) { object : Modifier.Node() {} }
         val visitedChildren = mutableListOf<Modifier.Node>()
-        rule.setContent {
-            Box(
-                Modifier
-                    .elementOf(node)
-                    .elementOf(child1)
-                    .elementOf(child2)
-            )
-        }
-        rule.runOnIdle {
-            child1.markAsDetached()
-        }
+        rule.setContent { Box(Modifier.elementOf(node).elementOf(child1).elementOf(child2)) }
+        rule.runOnIdle { child1.markAsDetached() }
 
         // Act.
-        rule.runOnIdle {
-            node.visitChildren(Nodes.Any) {
-                visitedChildren.add(it)
-            }
-        }
+        rule.runOnIdle { node.visitChildren(Nodes.Any) { visitedChildren.add(it) } }
 
         // Assert.
-        assertThat(visitedChildren)
-            .containsExactly(child2)
-            .inOrder()
+        assertThat(visitedChildren).containsExactly(child2).inOrder()
     }
 
     @Ignore("b/278765590")
@@ -192,16 +144,10 @@
         }
 
         // Act.
-        rule.runOnIdle {
-            node.visitChildren(Nodes.Any) {
-                visitedChildren.add(it)
-            }
-        }
+        rule.runOnIdle { node.visitChildren(Nodes.Any) { visitedChildren.add(it) } }
 
         // Assert.
-        assertThat(visitedChildren)
-            .containsExactly(child2, child4)
-            .inOrder()
+        assertThat(visitedChildren).containsExactly(child2, child4).inOrder()
     }
 
     private fun Modifier.otherModifier(): Modifier = this.then(Modifier)
diff --git a/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/node/ModifierNodeVisitLocalAncestorsTest.kt b/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/node/ModifierNodeVisitLocalAncestorsTest.kt
index e65f572..5ec88ba 100644
--- a/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/node/ModifierNodeVisitLocalAncestorsTest.kt
+++ b/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/node/ModifierNodeVisitLocalAncestorsTest.kt
@@ -30,24 +30,17 @@
 @SmallTest
 @RunWith(AndroidJUnit4::class)
 class ModifierNodeVisitLocalAncestorsTest {
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
     @Test
     fun noParents() {
         // Arrange.
         val node = object : Modifier.Node() {}
         val visitedAncestors = mutableListOf<Modifier.Node>()
-        rule.setContent {
-            Box(Modifier.elementOf(node))
-        }
+        rule.setContent { Box(Modifier.elementOf(node)) }
 
         // Act.
-        rule.runOnIdle {
-            node.visitLocalAncestors(Nodes.Any) {
-                visitedAncestors.add(it)
-            }
-        }
+        rule.runOnIdle { node.visitLocalAncestors(Nodes.Any) { visitedAncestors.add(it) } }
 
         // Assert.
         assertThat(visitedAncestors).isEmpty()
@@ -58,18 +51,10 @@
         // Arrange.
         val (node, parent) = List(2) { object : Modifier.Node() {} }
         val visitedAncestors = mutableListOf<Modifier.Node>()
-        rule.setContent {
-            Box(Modifier.elementOf(parent)) {
-                Box(Modifier.elementOf(node))
-            }
-        }
+        rule.setContent { Box(Modifier.elementOf(parent)) { Box(Modifier.elementOf(node)) } }
 
         // Act.
-        rule.runOnIdle {
-            node.visitLocalAncestors(Nodes.Any) {
-                visitedAncestors.add(it)
-            }
-        }
+        rule.runOnIdle { node.visitLocalAncestors(Nodes.Any) { visitedAncestors.add(it) } }
 
         // Assert.
         assertThat(visitedAncestors).isEmpty()
@@ -80,26 +65,13 @@
         // Arrange.
         val (node, ancestor1, ancestor2) = List(3) { object : Modifier.Node() {} }
         val visitedAncestors = mutableListOf<Modifier.Node>()
-        rule.setContent {
-            Box(
-                Modifier
-                    .elementOf(ancestor2)
-                    .elementOf(ancestor1)
-                    .elementOf(node)
-            )
-        }
+        rule.setContent { Box(Modifier.elementOf(ancestor2).elementOf(ancestor1).elementOf(node)) }
 
         // Act.
-        rule.runOnIdle {
-            node.visitLocalAncestors(Nodes.Any) {
-                visitedAncestors.add(it)
-            }
-        }
+        rule.runOnIdle { node.visitLocalAncestors(Nodes.Any) { visitedAncestors.add(it) } }
 
         // Assert.
-        assertThat(visitedAncestors)
-            .containsExactly(ancestor1, ancestor2)
-            .inOrder()
+        assertThat(visitedAncestors).containsExactly(ancestor1, ancestor2).inOrder()
     }
 
     @Test
@@ -107,21 +79,10 @@
         // Arrange.
         val (node, child, parent) = List(3) { object : Modifier.Node() {} }
         val visitedAncestors = mutableListOf<Modifier.Node>()
-        rule.setContent {
-            Box(
-                Modifier
-                    .elementOf(parent)
-                    .elementOf(node)
-                    .elementOf(child)
-            )
-        }
+        rule.setContent { Box(Modifier.elementOf(parent).elementOf(node).elementOf(child)) }
 
         // Act.
-        rule.runOnIdle {
-            node.visitLocalAncestors(Nodes.Any) {
-                visitedAncestors.add(it)
-            }
-        }
+        rule.runOnIdle { node.visitLocalAncestors(Nodes.Any) { visitedAncestors.add(it) } }
 
         // Assert.
         assertThat(visitedAncestors).containsExactly(parent)
@@ -134,8 +95,7 @@
         val visitedAncestors = mutableListOf<Modifier.Node>()
         rule.setContent {
             Box(
-                Modifier
-                    .elementOf(ancestor2)
+                Modifier.elementOf(ancestor2)
                     .otherModifier()
                     .elementOf(ancestor1)
                     .otherModifier()
@@ -144,16 +104,10 @@
         }
 
         // Act.
-        rule.runOnIdle {
-            node.visitLocalAncestors(Nodes.Any) {
-                visitedAncestors.add(it)
-            }
-        }
+        rule.runOnIdle { node.visitLocalAncestors(Nodes.Any) { visitedAncestors.add(it) } }
 
         // Assert.
-        assertThat(visitedAncestors)
-            .containsExactly(ancestor1, ancestor2)
-            .inOrder()
+        assertThat(visitedAncestors).containsExactly(ancestor1, ancestor2).inOrder()
     }
 
     @Ignore("b/278765590")
@@ -164,8 +118,7 @@
         val visitedAncestors = mutableListOf<Modifier.Node>()
         rule.setContent {
             Box(
-                Modifier
-                    .elementOf(ancestor3)
+                Modifier.elementOf(ancestor3)
                     .elementOf(ancestor2)
                     .elementOf(ancestor1)
                     .elementOf(node)
@@ -177,11 +130,7 @@
         }
 
         // Act.
-        rule.runOnIdle {
-            node.visitLocalAncestors(Nodes.Any) {
-                visitedAncestors.add(it)
-            }
-        }
+        rule.runOnIdle { node.visitLocalAncestors(Nodes.Any) { visitedAncestors.add(it) } }
 
         // Assert.
         assertThat(visitedAncestors).containsExactly(ancestor2)
diff --git a/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/node/ModifierNodeVisitLocalDescendantsTest.kt b/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/node/ModifierNodeVisitLocalDescendantsTest.kt
index be99799..aa5ce04 100644
--- a/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/node/ModifierNodeVisitLocalDescendantsTest.kt
+++ b/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/node/ModifierNodeVisitLocalDescendantsTest.kt
@@ -30,24 +30,17 @@
 @SmallTest
 @RunWith(AndroidJUnit4::class)
 class ModifierNodeVisitLocalDescendantsTest {
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
     @Test
     fun noChildren() {
         // Arrange.
         val testNode = object : Modifier.Node() {}
         val visitedDescendants = mutableListOf<Modifier.Node>()
-        rule.setContent {
-            Box(Modifier.elementOf(testNode))
-        }
+        rule.setContent { Box(Modifier.elementOf(testNode)) }
 
         // Act.
-        rule.runOnIdle {
-            testNode.visitLocalDescendants(Nodes.Any) {
-                visitedDescendants.add(it)
-            }
-        }
+        rule.runOnIdle { testNode.visitLocalDescendants(Nodes.Any) { visitedDescendants.add(it) } }
 
         // Assert.
         assertThat(visitedDescendants).isEmpty()
@@ -58,18 +51,10 @@
         // Arrange.
         val (node, child) = List(3) { object : Modifier.Node() {} }
         val visitedDescendants = mutableListOf<Modifier.Node>()
-        rule.setContent {
-            Box(Modifier.elementOf(node)) {
-                Box(Modifier.elementOf(child))
-            }
-        }
+        rule.setContent { Box(Modifier.elementOf(node)) { Box(Modifier.elementOf(child)) } }
 
         // Act.
-        rule.runOnIdle {
-            node.visitLocalDescendants(Nodes.Any) {
-                visitedDescendants.add(it)
-            }
-        }
+        rule.runOnIdle { node.visitLocalDescendants(Nodes.Any) { visitedDescendants.add(it) } }
 
         // Assert.
         assertThat(visitedDescendants).isEmpty()
@@ -80,26 +65,13 @@
         // Arrange.
         val (node, child1, child2) = List(3) { object : Modifier.Node() {} }
         val visitedDescendants = mutableListOf<Modifier.Node>()
-        rule.setContent {
-            Box(
-                Modifier
-                    .elementOf(node)
-                    .elementOf(child1)
-                    .elementOf(child2)
-            )
-        }
+        rule.setContent { Box(Modifier.elementOf(node).elementOf(child1).elementOf(child2)) }
 
         // Act.
-        rule.runOnIdle {
-            node.visitLocalDescendants(Nodes.Any) {
-                visitedDescendants.add(it)
-            }
-        }
+        rule.runOnIdle { node.visitLocalDescendants(Nodes.Any) { visitedDescendants.add(it) } }
 
         // Assert.
-        assertThat(visitedDescendants)
-            .containsExactly(child1, child2)
-            .inOrder()
+        assertThat(visitedDescendants).containsExactly(child1, child2).inOrder()
     }
 
     @Test
@@ -107,21 +79,10 @@
         // Arrange.
         val (node, child, parent) = List(3) { object : Modifier.Node() {} }
         val visitedDescendants = mutableListOf<Modifier.Node>()
-        rule.setContent {
-            Box(
-                Modifier
-                    .elementOf(parent)
-                    .elementOf(node)
-                    .elementOf(child)
-            )
-        }
+        rule.setContent { Box(Modifier.elementOf(parent).elementOf(node).elementOf(child)) }
 
         // Act.
-        rule.runOnIdle {
-            node.visitLocalDescendants(Nodes.Any) {
-                visitedDescendants.add(it)
-            }
-        }
+        rule.runOnIdle { node.visitLocalDescendants(Nodes.Any) { visitedDescendants.add(it) } }
 
         // Assert.
         assertThat(visitedDescendants).containsExactly(child)
@@ -134,8 +95,7 @@
         val visitedDescendants = mutableListOf<Modifier.Node>()
         rule.setContent {
             Box(
-                Modifier
-                    .elementOf(node)
+                Modifier.elementOf(node)
                     .otherModifier()
                     .elementOf(child1)
                     .otherModifier()
@@ -144,16 +104,10 @@
         }
 
         // Act.
-        rule.runOnIdle {
-            node.visitLocalDescendants(Nodes.Any) {
-                visitedDescendants.add(it)
-            }
-        }
+        rule.runOnIdle { node.visitLocalDescendants(Nodes.Any) { visitedDescendants.add(it) } }
 
         // Assert.
-        assertThat(visitedDescendants)
-            .containsExactly(child1, child2)
-            .inOrder()
+        assertThat(visitedDescendants).containsExactly(child1, child2).inOrder()
     }
 
     @Ignore("b/278765590")
@@ -164,8 +118,7 @@
         val visitedDescendants = mutableListOf<Modifier.Node>()
         rule.setContent {
             Box(
-                Modifier
-                    .elementOf(node)
+                Modifier.elementOf(node)
                     .elementOf(child1)
                     .elementOf(child2)
                     .elementOf(child3)
@@ -178,16 +131,10 @@
         }
 
         // Act.
-        rule.runOnIdle {
-            node.visitLocalDescendants(Nodes.Any) {
-                visitedDescendants.add(it)
-            }
-        }
+        rule.runOnIdle { node.visitLocalDescendants(Nodes.Any) { visitedDescendants.add(it) } }
 
         // Assert.
-        assertThat(visitedDescendants)
-            .containsExactly(child2)
-            .inOrder()
+        assertThat(visitedDescendants).containsExactly(child2).inOrder()
     }
 
     private fun Modifier.otherModifier(): Modifier = this.then(Modifier)
diff --git a/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/node/ModifierNodeVisitSelfAndChildrenTest.kt b/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/node/ModifierNodeVisitSelfAndChildrenTest.kt
index 7c0aa04..dcfc010 100644
--- a/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/node/ModifierNodeVisitSelfAndChildrenTest.kt
+++ b/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/node/ModifierNodeVisitSelfAndChildrenTest.kt
@@ -30,24 +30,17 @@
 @SmallTest
 @RunWith(AndroidJUnit4::class)
 class ModifierNodeVisitSelfAndChildrenTest {
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
     @Test
     fun noChildren() {
         // Arrange.
         val node = object : Modifier.Node() {}
         val visitedNodes = mutableListOf<Modifier.Node>()
-        rule.setContent {
-            Box(Modifier.elementOf(node))
-        }
+        rule.setContent { Box(Modifier.elementOf(node)) }
 
         // Act.
-        rule.runOnIdle {
-            node.visitSelfAndChildren(Nodes.Any) {
-                visitedNodes.add(it)
-            }
-        }
+        rule.runOnIdle { node.visitSelfAndChildren(Nodes.Any) { visitedNodes.add(it) } }
 
         // Assert.
         assertThat(visitedNodes).containsExactly(node)
@@ -58,25 +51,13 @@
         // Arrange.
         val (node, child) = List(2) { object : Modifier.Node() {} }
         val visitedNodes = mutableListOf<Modifier.Node>()
-        rule.setContent {
-            Box(
-                Modifier
-                    .elementOf(node)
-                    .elementOf(child)
-            )
-        }
+        rule.setContent { Box(Modifier.elementOf(node).elementOf(child)) }
 
         // Act.
-        rule.runOnIdle {
-            node.visitSelfAndChildren(Nodes.Any) {
-                visitedNodes.add(it)
-            }
-        }
+        rule.runOnIdle { node.visitSelfAndChildren(Nodes.Any) { visitedNodes.add(it) } }
 
         // Assert.
-        assertThat(visitedNodes)
-            .containsExactly(node, child)
-            .inOrder()
+        assertThat(visitedNodes).containsExactly(node, child).inOrder()
     }
 
     @Test
@@ -84,26 +65,13 @@
         // Arrange.
         val (node, child1, child2) = List(3) { object : Modifier.Node() {} }
         val visitedNodes = mutableListOf<Modifier.Node>()
-        rule.setContent {
-            Box(
-                Modifier
-                    .elementOf(node)
-                    .elementOf(child1)
-                    .elementOf(child2)
-            )
-        }
+        rule.setContent { Box(Modifier.elementOf(node).elementOf(child1).elementOf(child2)) }
 
         // Act.
-        rule.runOnIdle {
-            node.visitSelfAndChildren(Nodes.Any) {
-                visitedNodes.add(it)
-            }
-        }
+        rule.runOnIdle { node.visitSelfAndChildren(Nodes.Any) { visitedNodes.add(it) } }
 
         // Assert.
-        assertThat(visitedNodes)
-            .containsExactly(node, child1)
-            .inOrder()
+        assertThat(visitedNodes).containsExactly(node, child1).inOrder()
     }
 
     @Test
@@ -111,26 +79,13 @@
         // Arrange.
         val (node, child) = List(2) { object : Modifier.Node() {} }
         val visitedNodes = mutableListOf<Modifier.Node>()
-        rule.setContent {
-            Box(
-                Modifier
-                    .elementOf(node)
-                    .otherModifier()
-                    .elementOf(child)
-            )
-        }
+        rule.setContent { Box(Modifier.elementOf(node).otherModifier().elementOf(child)) }
 
         // Act.
-        rule.runOnIdle {
-            node.visitSelfAndChildren(Nodes.Any) {
-                visitedNodes.add(it)
-            }
-        }
+        rule.runOnIdle { node.visitSelfAndChildren(Nodes.Any) { visitedNodes.add(it) } }
 
         // Assert.
-        assertThat(visitedNodes)
-            .containsExactly(node, child)
-            .inOrder()
+        assertThat(visitedNodes).containsExactly(node, child).inOrder()
     }
 
     @Test
@@ -138,23 +93,13 @@
         // Arrange.
         val (node, child) = List(2) { object : Modifier.Node() {} }
         val visitedNodes = mutableListOf<Modifier.Node>()
-        rule.setContent {
-            Box(Modifier.elementOf(node)) {
-                Box(Modifier.elementOf(child))
-            }
-        }
+        rule.setContent { Box(Modifier.elementOf(node)) { Box(Modifier.elementOf(child)) } }
 
         // Act.
-        rule.runOnIdle {
-            node.visitSelfAndChildren(Nodes.Any) {
-                visitedNodes.add(it)
-            }
-        }
+        rule.runOnIdle { node.visitSelfAndChildren(Nodes.Any) { visitedNodes.add(it) } }
 
         // Assert.
-        assertThat(visitedNodes)
-            .containsExactly(node, child)
-            .inOrder()
+        assertThat(visitedNodes).containsExactly(node, child).inOrder()
     }
 
     @Test
@@ -170,16 +115,10 @@
         }
 
         // Act.
-        rule.runOnIdle {
-            node.visitSelfAndChildren(Nodes.Any) {
-                visitedNodes.add(it)
-            }
-        }
+        rule.runOnIdle { node.visitSelfAndChildren(Nodes.Any) { visitedNodes.add(it) } }
 
         // Assert.
-        assertThat(visitedNodes)
-            .containsExactly(node, child1, child2)
-            .inOrder()
+        assertThat(visitedNodes).containsExactly(node, child1, child2).inOrder()
     }
 
     @Test
@@ -190,23 +129,15 @@
         rule.setContent {
             Box(Modifier.elementOf(node)) {
                 Box(Modifier)
-                Box(Modifier.otherModifier()) {
-                    Box(Modifier.elementOf(child))
-                }
+                Box(Modifier.otherModifier()) { Box(Modifier.elementOf(child)) }
             }
         }
 
         // Act.
-        rule.runOnIdle {
-            node.visitSelfAndChildren(Nodes.Any) {
-                visitedNodes.add(it)
-            }
-        }
+        rule.runOnIdle { node.visitSelfAndChildren(Nodes.Any) { visitedNodes.add(it) } }
 
         // Assert.
-        assertThat(visitedNodes)
-            .containsExactly(node, child)
-            .inOrder()
+        assertThat(visitedNodes).containsExactly(node, child).inOrder()
     }
 
     @Test
@@ -216,27 +147,17 @@
         val visitedNodes = mutableListOf<Modifier.Node>()
         rule.setContent {
             Box(Modifier.elementOf(node)) {
-                Box {
-                    Box(Modifier.elementOf(child1))
-                }
-                Box(Modifier.otherModifier()) {
-                    Box(Modifier.elementOf(child2))
-                }
+                Box { Box(Modifier.elementOf(child1)) }
+                Box(Modifier.otherModifier()) { Box(Modifier.elementOf(child2)) }
                 Box(Modifier.elementOf(child3))
             }
         }
 
         // Act.
-        rule.runOnIdle {
-            node.visitSelfAndChildren(Nodes.Any) {
-                visitedNodes.add(it)
-            }
-        }
+        rule.runOnIdle { node.visitSelfAndChildren(Nodes.Any) { visitedNodes.add(it) } }
 
         // Assert.
-        assertThat(visitedNodes)
-            .containsExactly(node, child1, child2, child3)
-            .inOrder()
+        assertThat(visitedNodes).containsExactly(node, child1, child2, child3).inOrder()
     }
 
     @Ignore("b/278765590")
@@ -246,27 +167,10 @@
         val (child4, child5, child6, child7) = List(4) { object : Modifier.Node() {} }
         val visitedNodes = mutableListOf<Modifier.Node>()
         rule.setContent {
-            Box(
-                Modifier
-                    .elementOf(node)
-                    .elementOf(child1)
-            ) {
-                Box {
-                    Box(
-                        Modifier
-                            .elementOf(child2)
-                            .elementOf(child3)
-                    )
-                }
-                Box(Modifier.otherModifier()) {
-                    Box(Modifier.elementOf(child4))
-                }
-                Box(
-                    Modifier
-                        .elementOf(child5)
-                        .elementOf(child6)
-                        .elementOf(child7)
-                )
+            Box(Modifier.elementOf(node).elementOf(child1)) {
+                Box { Box(Modifier.elementOf(child2).elementOf(child3)) }
+                Box(Modifier.otherModifier()) { Box(Modifier.elementOf(child4)) }
+                Box(Modifier.elementOf(child5).elementOf(child6).elementOf(child7))
             }
         }
         rule.runOnIdle {
@@ -276,16 +180,10 @@
         }
 
         // Act.
-        rule.runOnIdle {
-            node.visitSelfAndChildren(Nodes.Any) {
-                visitedNodes.add(it)
-            }
-        }
+        rule.runOnIdle { node.visitSelfAndChildren(Nodes.Any) { visitedNodes.add(it) } }
 
         // Assert.
-        assertThat(visitedNodes)
-            .containsExactly(node, child3, child4, child5, child7)
-            .inOrder()
+        assertThat(visitedNodes).containsExactly(node, child3, child4, child5, child7).inOrder()
     }
 
     private fun Modifier.otherModifier(): Modifier = this.then(Modifier)
diff --git a/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/node/ModifierNodeVisitSubtreeIfTest.kt b/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/node/ModifierNodeVisitSubtreeIfTest.kt
index 2dda0cd..63f82d9 100644
--- a/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/node/ModifierNodeVisitSubtreeIfTest.kt
+++ b/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/node/ModifierNodeVisitSubtreeIfTest.kt
@@ -30,24 +30,17 @@
 @SmallTest
 @RunWith(AndroidJUnit4::class)
 class ModifierNodeVisitSubtreeIfTest {
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
     @Test
     fun noChildren() {
         // Arrange.
         val node = object : Modifier.Node() {}
         val visitedChildren = mutableListOf<Modifier.Node>()
-        rule.setContent {
-            Box(Modifier.elementOf(node))
-        }
+        rule.setContent { Box(Modifier.elementOf(node)) }
 
         // Act.
-        rule.runOnIdle {
-            node.visitSubtreeIf(Nodes.Any) {
-                visitedChildren.add(it)
-            }
-        }
+        rule.runOnIdle { node.visitSubtreeIf(Nodes.Any) { visitedChildren.add(it) } }
 
         // Assert.
         assertThat(visitedChildren).isEmpty()
@@ -63,9 +56,7 @@
             Box(Modifier.elementOf(node1)) {
                 Box(Modifier.elementOf(node2)) {
                     Box(Modifier.elementOf(node3))
-                    Box(Modifier.elementOf(node4)) {
-                        Box(Modifier.elementOf(node6))
-                    }
+                    Box(Modifier.elementOf(node4)) { Box(Modifier.elementOf(node6)) }
                     Box(Modifier.elementOf(node5))
                 }
             }
@@ -81,9 +72,7 @@
         }
 
         // Assert.
-        assertThat(visitedChildren)
-            .containsExactly(node2, node3, node4, node5)
-            .inOrder()
+        assertThat(visitedChildren).containsExactly(node2, node3, node4, node5).inOrder()
     }
 
     @Test
@@ -96,9 +85,7 @@
             Box(Modifier.elementOf(node1)) {
                 Box(Modifier.elementOf(node2)) {
                     Box(Modifier.elementOf(node3))
-                    Box(Modifier.elementOf(node4)) {
-                        Box(Modifier.elementOf(node6))
-                    }
+                    Box(Modifier.elementOf(node4)) { Box(Modifier.elementOf(node6)) }
                     Box(Modifier.elementOf(node5))
                 }
             }
@@ -113,9 +100,7 @@
         }
 
         // Assert.
-        assertThat(visitedChildren)
-            .containsExactly(node2, node3, node4, node6, node5)
-            .inOrder()
+        assertThat(visitedChildren).containsExactly(node2, node3, node4, node6, node5).inOrder()
     }
 
     @Test
@@ -125,32 +110,12 @@
         val (node6, node7, node8, node9, node10) = List(5) { object : Modifier.Node() {} }
         val visitedChildren = mutableListOf<Modifier.Node>()
         rule.setContent {
-            Box(
-                Modifier
-                    .elementOf(node1)
-                    .elementOf(node2)
-            ) {
-                Box(
-                    Modifier
-                        .elementOf(node3)
-                        .elementOf(node4)
-                ) {
-                    Box(
-                        Modifier
-                            .elementOf(node7)
-                            .elementOf(node8)
-                    )
+            Box(Modifier.elementOf(node1).elementOf(node2)) {
+                Box(Modifier.elementOf(node3).elementOf(node4)) {
+                    Box(Modifier.elementOf(node7).elementOf(node8))
                 }
-                Box(
-                    Modifier
-                        .elementOf(node5)
-                        .elementOf(node6)
-                ) {
-                    Box(
-                        Modifier
-                            .elementOf(node9)
-                            .elementOf(node10)
-                    )
+                Box(Modifier.elementOf(node5).elementOf(node6)) {
+                    Box(Modifier.elementOf(node9).elementOf(node10))
                 }
             }
         }
@@ -177,28 +142,12 @@
         val (node4, node5, node6, node7, node8) = List(5) { object : Modifier.Node() {} }
         val visitedChildren = mutableListOf<Modifier.Node>()
         rule.setContent {
-            Box(
-                Modifier
-                    .elementOf(parent)
-                    .elementOf(node)
-            ) {
-                Box(
-                    Modifier
-                        .elementOf(node1)
-                        .elementOf(node2)
-                ) {
-                    Box(Modifier.elementOf(node3)) {
-                        Box(Modifier.elementOf(node4))
-                    }
+            Box(Modifier.elementOf(parent).elementOf(node)) {
+                Box(Modifier.elementOf(node1).elementOf(node2)) {
+                    Box(Modifier.elementOf(node3)) { Box(Modifier.elementOf(node4)) }
                     Box(Modifier.elementOf(node5))
                 }
-                Box(Modifier.elementOf(node6)) {
-                    Box(
-                        Modifier
-                            .elementOf(node7)
-                            .elementOf(node8)
-                    )
-                }
+                Box(Modifier.elementOf(node6)) { Box(Modifier.elementOf(node7).elementOf(node8)) }
             }
         }
         rule.runOnIdle {
@@ -215,8 +164,6 @@
         }
 
         // Assert.
-        assertThat(visitedChildren)
-            .containsExactly(node1, node3, node4, node5)
-            .inOrder()
+        assertThat(visitedChildren).containsExactly(node1, node3, node4, node5).inOrder()
     }
 }
diff --git a/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/node/ModifierNodeVisitSubtreeTest.kt b/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/node/ModifierNodeVisitSubtreeTest.kt
index 53bf71c..59d8aed 100644
--- a/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/node/ModifierNodeVisitSubtreeTest.kt
+++ b/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/node/ModifierNodeVisitSubtreeTest.kt
@@ -30,24 +30,17 @@
 @SmallTest
 @RunWith(AndroidJUnit4::class)
 class ModifierNodeVisitSubtreeTest {
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
     @Test
     fun noChildren() {
         // Arrange.
         val node = object : Modifier.Node() {}
         val visitedChildren = mutableListOf<Modifier.Node>()
-        rule.setContent {
-            Box(Modifier.elementOf(node))
-        }
+        rule.setContent { Box(Modifier.elementOf(node)) }
 
         // Act.
-        rule.runOnIdle {
-            node.visitSubtree(Nodes.Any) {
-                visitedChildren.add(it)
-            }
-        }
+        rule.runOnIdle { node.visitSubtree(Nodes.Any) { visitedChildren.add(it) } }
 
         // Assert.
         assertThat(visitedChildren).isEmpty()
@@ -60,8 +53,7 @@
         val visitedChildren = mutableListOf<Modifier.Node>()
         rule.setContent {
             Box(
-                Modifier
-                    .elementOf(parent)
+                Modifier.elementOf(parent)
                     .elementOf(node)
                     .elementOf(localChild1)
                     .elementOf(localChild2)
@@ -69,11 +61,7 @@
         }
 
         // Act.
-        rule.runOnIdle {
-            node.visitSubtree(Nodes.Any) {
-                visitedChildren.add(it)
-            }
-        }
+        rule.runOnIdle { node.visitSubtree(Nodes.Any) { visitedChildren.add(it) } }
 
         // Assert.
         assertThat(visitedChildren).containsExactly(localChild1, localChild2).inOrder()
@@ -90,39 +78,16 @@
 
         val visitedChildren = mutableListOf<Modifier.Node>()
         rule.setContent {
-            Box(
-                Modifier
-                    .elementOf(node)
-                    .elementOf(child1)
-                    .elementOf(child2)
-            ) {
-                Box(
-                    Modifier
-                        .elementOf(child5)
-                        .elementOf(child6)
-                ) {
-                    Box(
-                        Modifier
-                            .elementOf(child7)
-                            .elementOf(child8)
-                    )
+            Box(Modifier.elementOf(node).elementOf(child1).elementOf(child2)) {
+                Box(Modifier.elementOf(child5).elementOf(child6)) {
+                    Box(Modifier.elementOf(child7).elementOf(child8))
                 }
-                Box {
-                    Box(
-                        Modifier
-                            .elementOf(child3)
-                            .elementOf(child4)
-                    )
-                }
+                Box { Box(Modifier.elementOf(child3).elementOf(child4)) }
             }
         }
 
         // Act.
-        rule.runOnIdle {
-            node.visitSubtree(Nodes.Any) {
-                visitedChildren.add(it)
-            }
-        }
+        rule.runOnIdle { node.visitSubtree(Nodes.Any) { visitedChildren.add(it) } }
 
         // Assert.
         assertThat(visitedChildren)
@@ -137,23 +102,12 @@
         val (node, localChild1, localChild2) = List(3) { object : Modifier.Node() {} }
         val visitedChildren = mutableListOf<Modifier.Node>()
         rule.setContent {
-            Box(
-                Modifier
-                    .elementOf(node)
-                    .elementOf(localChild1)
-                    .elementOf(localChild2)
-            )
+            Box(Modifier.elementOf(node).elementOf(localChild1).elementOf(localChild2))
         }
-        rule.runOnIdle {
-            localChild1.markAsDetached()
-        }
+        rule.runOnIdle { localChild1.markAsDetached() }
 
         // Act.
-        rule.runOnIdle {
-            node.visitSubtree(Nodes.Any) {
-                visitedChildren.add(it)
-            }
-        }
+        rule.runOnIdle { node.visitSubtree(Nodes.Any) { visitedChildren.add(it) } }
 
         // Assert.
         assertThat(visitedChildren).containsExactly(localChild2)
diff --git a/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/node/MyersDiffTests.kt b/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/node/MyersDiffTests.kt
index 8fb31f5..44e0c71 100644
--- a/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/node/MyersDiffTests.kt
+++ b/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/node/MyersDiffTests.kt
@@ -37,7 +37,8 @@
             Equals(x = 5, y = 0)
             Equals(x = 6, y = 1)
             Insert(3 at 2)
-            """.trimIndent(),
+            """
+                .trimIndent(),
             log.joinToString("\n")
         )
     }
@@ -55,7 +56,8 @@
             Equals(x = 2, y = 2)
             Remove(3 at 3)
             Remove(4 at 3)
-            """.trimIndent(),
+            """
+                .trimIndent(),
             log.joinToString("\n")
         )
     }
@@ -78,7 +80,8 @@
             Insert(7 at 6)
             Insert(8 at 7)
             Insert(9 at 8)
-            """.trimIndent(),
+            """
+                .trimIndent(),
             log.joinToString("\n")
         )
     }
@@ -102,17 +105,15 @@
             Equals(x = 8, y = 7)
             Equals(x = 9, y = 8)
             Equals(x = 10, y = 9)
-            """.trimIndent(),
+            """
+                .trimIndent(),
             log.joinToString("\n")
         )
     }
 
     @Test
     fun stringDiff() {
-        stringDiff(
-            "ihfiwjfowijefoiwjfe",
-            "ihfawwjwfowwijefwicwfe"
-        )
+        stringDiff("ihfiwjfowijefoiwjfe", "ihfawwjwfowwijefwicwfe")
 
         stringDiff("", "abcde")
 
@@ -130,15 +131,13 @@
             Insert(b at 1)
             Insert(b at 2)
             Insert(b at 3)
-            """.trimIndent()
+            """
+                .trimIndent()
         )
 
         stringDiff("abcd", "bcda")
 
-        stringDiff(
-            "abc",
-            "abccbacbac"
-        )
+        stringDiff("abc", "abccbacbac")
     }
 }
 
@@ -155,24 +154,28 @@
 fun <T> executeListDiff(x: List<T>, y: List<T>): DiffResult<T> {
     val log = mutableListOf<String>()
     val result = x.toMutableList()
-    executeDiff(x.size, y.size, object : DiffCallback {
-        override fun areItemsTheSame(oldIndex: Int, newIndex: Int): Boolean {
-            return x[oldIndex] == y[newIndex]
-        }
+    executeDiff(
+        x.size,
+        y.size,
+        object : DiffCallback {
+            override fun areItemsTheSame(oldIndex: Int, newIndex: Int): Boolean {
+                return x[oldIndex] == y[newIndex]
+            }
 
-        override fun insert(newIndex: Int) {
-            log.add("Insert(${y[newIndex]} at $newIndex)")
-            result.add(newIndex, y[newIndex])
-        }
+            override fun insert(newIndex: Int) {
+                log.add("Insert(${y[newIndex]} at $newIndex)")
+                result.add(newIndex, y[newIndex])
+            }
 
-        override fun remove(atIndex: Int, oldIndex: Int) {
-            log.add("Remove(${x[oldIndex]} at $atIndex)")
-            result.removeAt(atIndex)
-        }
+            override fun remove(atIndex: Int, oldIndex: Int) {
+                log.add("Remove(${x[oldIndex]} at $atIndex)")
+                result.removeAt(atIndex)
+            }
 
-        override fun same(oldIndex: Int, newIndex: Int) {
-            log.add("Equals(x = $oldIndex, y = $newIndex)")
+            override fun same(oldIndex: Int, newIndex: Int) {
+                log.add("Equals(x = $oldIndex, y = $newIndex)")
+            }
         }
-    })
+    )
     return DiffResult(result, log)
 }
diff --git a/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/node/NodeChainOwnerTests.kt b/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/node/NodeChainOwnerTests.kt
index da15bc0..2e38e40 100644
--- a/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/node/NodeChainOwnerTests.kt
+++ b/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/node/NodeChainOwnerTests.kt
@@ -15,6 +15,7 @@
  */
 
 @file:OptIn(ExperimentalComposeUiApi::class)
+
 package androidx.compose.ui.node
 
 import androidx.compose.foundation.layout.Box
@@ -39,8 +40,7 @@
 
 class NodeChainOwnerTests {
 
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
     @Test
     fun getModifierNode_returnsLayers_whenGraphicsLayerIsTail() {
@@ -48,16 +48,12 @@
             // box gets the root graphics layer applied to it
             Box {
                 // test this, with no graphicsLayers added externally
-                Layout(
-                    modifier = Modifier.testTag("tag").graphicsLayer(),
-                    EmptyMeasurePolicy())
+                Layout(modifier = Modifier.testTag("tag").graphicsLayer(), EmptyMeasurePolicy())
             }
         }
 
-        val modifierInfo = rule.onNodeWithTag("tag")
-            .fetchSemanticsNode()
-            .layoutInfo
-            .getModifierInfo()
+        val modifierInfo =
+            rule.onNodeWithTag("tag").fetchSemanticsNode().layoutInfo.getModifierInfo()
         assertThat(modifierInfo.mapNotNull { it.extra }).hasSize(1)
     }
 
@@ -69,14 +65,13 @@
                 // test this, with no graphicsLayers added externally
                 Layout(
                     modifier = Modifier.graphicsLayer().semantics {}.testTag("tag"),
-                    EmptyMeasurePolicy())
+                    EmptyMeasurePolicy()
+                )
             }
         }
 
-        val modifierInfo = rule.onNodeWithTag("tag")
-            .fetchSemanticsNode()
-            .layoutInfo
-            .getModifierInfo()
+        val modifierInfo =
+            rule.onNodeWithTag("tag").fetchSemanticsNode().layoutInfo.getModifierInfo()
         assertThat(modifierInfo.mapNotNull { it.extra }).hasSize(2)
     }
 
@@ -88,14 +83,13 @@
                 // test this, with no graphicsLayers added externally
                 Layout(
                     modifier = Modifier.graphicsLayer().size(30.dp).testTag("tag"),
-                    EmptyMeasurePolicy())
+                    EmptyMeasurePolicy()
+                )
             }
         }
 
-        val modifierInfo = rule.onNodeWithTag("tag")
-            .fetchSemanticsNode()
-            .layoutInfo
-            .getModifierInfo()
+        val modifierInfo =
+            rule.onNodeWithTag("tag").fetchSemanticsNode().layoutInfo.getModifierInfo()
         assertThat(modifierInfo.mapNotNull { it.extra }).hasSize(1)
     }
 }
diff --git a/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/node/NodeChainTester.kt b/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/node/NodeChainTester.kt
index 8cdbdc7..27c7a75 100644
--- a/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/node/NodeChainTester.kt
+++ b/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/node/NodeChainTester.kt
@@ -66,16 +66,13 @@
 
 class DiffLog {
     private val oplog = mutableListOf<DiffOp>()
+
     fun op(op: DiffOp) = oplog.add(op)
+
     fun clear() = oplog.clear()
 
     fun assertElementDiff(expected: String) {
-        Assert.assertEquals(
-            expected,
-            oplog.joinToString("\n") {
-                it.elementDiffString()
-            }
-        )
+        Assert.assertEquals(expected, oplog.joinToString("\n") { it.elementDiffString() })
     }
 
     fun debug(): String = buildString {
@@ -92,13 +89,12 @@
     val nodes: List<Modifier.Node>
         get() {
             val result = mutableListOf<Modifier.Node>()
-            chain.headToTailExclusive {
-                result.add(it)
-            }
+            chain.headToTailExclusive { result.add(it) }
             return result
         }
 
-    val aggregateChildMasks: List<Int> get() = nodes.map { it.aggregateChildKindSet }
+    val aggregateChildMasks: List<Int>
+        get() = nodes.map { it.aggregateChildKindSet }
 
     fun attach(): NodeChainTester {
         check(!layoutNode.isAttached)
@@ -123,9 +119,7 @@
     }
 
     fun validateAttached(): NodeChainTester {
-        chain.head.visitSubtree(Nodes.Any) {
-            check(it.isAttached)
-        }
+        chain.head.visitSubtree(Nodes.Any) { check(it.isAttached) }
         return this
     }
 
@@ -133,6 +127,7 @@
         chain.updateFrom(modifierOf(*modifiers))
         return this
     }
+
     fun withModifierNodes(vararg nodes: Modifier.Node): NodeChainTester {
         chain.updateFrom(modifierOf(*nodes))
         return this
@@ -202,6 +197,7 @@
     }
 
     abstract fun debug(): String
+
     class Same(
         private val oldIndex: Int,
         private val newIndex: Int,
@@ -210,13 +206,15 @@
         private val node: Modifier.Node,
         val updated: Boolean,
     ) : DiffOp(beforeEl, if (updated) "*" else " ", "Same") {
-        override fun debug() = """
+        override fun debug() =
+            """
             <$opString>
                 $beforeEl @ $oldIndex = $afterEl @ $newIndex
                 node: $node
                 updated? = $updated
             </$opString>
-        """.trimIndent()
+        """
+                .trimIndent()
     }
 
     class Insert(
@@ -226,13 +224,15 @@
         val child: Modifier.Node,
         private val inserted: Modifier.Node,
     ) : DiffOp(afterEl, "+", "Insert") {
-        override fun debug() = """
+        override fun debug() =
+            """
             <$opString>
                 $afterEl @ $newIndex (inserted at $oldIndex)
                 child = $child
                 inserted = $inserted
             </$opString>
-        """.trimIndent()
+        """
+                .trimIndent()
     }
 
     class Remove(
@@ -240,12 +240,14 @@
         private val beforeEl: Modifier.Element,
         private val beforeEntity: Modifier.Node,
     ) : DiffOp(beforeEl, "-", "Remove") {
-        override fun debug() = """
+        override fun debug() =
+            """
             <$opString>
                 $beforeEl @ $oldIndex
                 beforeEntity = $beforeEntity
             </$opString>
-        """.trimIndent()
+        """
+                .trimIndent()
     }
 }
 
@@ -268,17 +270,21 @@
 internal open class NodeModifierElementNode(val node: Modifier.Node) :
     ModifierNodeElement<Modifier.Node>() {
     override fun create(): Modifier.Node = node
-    override fun update(node: Modifier.Node) { }
+
+    override fun update(node: Modifier.Node) {}
+
     override fun hashCode(): Int = node.hashCode()
+
     override fun equals(other: Any?): Boolean {
         if (other !is NodeModifierElementNode) return false
         return other.node === node
     }
 }
 
-fun reusableModifier(name: String): Modifier.Element = object : Modifier.Element {
-    override fun toString(): String = name
-}
+fun reusableModifier(name: String): Modifier.Element =
+    object : Modifier.Element {
+        override fun toString(): String = name
+    }
 
 fun reusableModifiers(vararg names: String): List<Modifier.Element> {
     return names.map { reusableModifier(it) }
@@ -309,17 +315,11 @@
 }
 
 fun modifierD(params: Any? = null): Modifier.Element {
-    return object : TestElement<Modifier.Node>("d", params,
-        object : Modifier.Node() {}
-    ) {}
+    return object : TestElement<Modifier.Node>("d", params, object : Modifier.Node() {}) {}
 }
 
-fun managedModifier(
-    name: String,
-    params: Any? = null
-): ModifierNodeElement<*> = object : TestElement<Modifier.Node>(name, params,
-    object : Modifier.Node() {}
-) {}
+fun managedModifier(name: String, params: Any? = null): ModifierNodeElement<*> =
+    object : TestElement<Modifier.Node>(name, params, object : Modifier.Node() {}) {}
 
 private abstract class TestElement<T : Modifier.Node>(
     val modifierName: String,
@@ -327,7 +327,9 @@
     val node: T
 ) : ModifierNodeElement<T>() {
     override fun create(): T = node
+
     override fun update(node: T) {}
+
     override fun InspectorInfo.inspectableProperties() {
         name = modifierName
     }
@@ -372,57 +374,78 @@
     var semanticsChanged: Boolean = false
     val invalidatedLayers = mutableListOf<OwnedLayer>()
 
-    @InternalCoreApi
-    override var showLayoutBounds: Boolean = false
+    @InternalCoreApi override var showLayoutBounds: Boolean = false
     override val snapshotObserver = OwnerSnapshotObserver { it.invoke() }
     override val modifierLocalManager: ModifierLocalManager = ModifierLocalManager(this)
     override var measureIteration: Long = 0
     override val sharedDrawScope = LayoutNodeDrawScope()
     override val density: Density
         get() = Density(1f)
+
     override val layoutDirection: LayoutDirection
         get() = LayoutDirection.Ltr
+
     override val viewConfiguration: ViewConfiguration
         get() = TODO("Not yet implemented")
+
     override val rootForTest: RootForTest
         get() = TODO("Not yet implemented")
+
     override val hapticFeedBack: HapticFeedback
         get() = TODO("Not yet implemented")
+
     override val inputModeManager: InputModeManager
         get() = TODO("Not yet implemented")
+
     override val clipboardManager: ClipboardManager
         get() = TODO("Not yet implemented")
+
     override val accessibilityManager: AccessibilityManager
         get() = TODO("Not yet implemented")
+
     override val graphicsContext: GraphicsContext
         get() = TODO("Not yet implemented")
+
     override val textToolbar: TextToolbar
         get() = TODO("Not yet implemented")
+
     override val textInputService: TextInputService
         get() = TODO("Not yet implemented")
+
     override val pointerIconService: PointerIconService
         get() = TODO("Not yet implemented")
+
     override val focusOwner: FocusOwner
         get() = TODO("Not yet implemented")
+
     override val windowInfo: WindowInfo
         get() = TODO("Not yet implemented")
+
     override val fontFamilyResolver: FontFamily.Resolver
         get() = TODO("Not yet implemented")
+
     override val dragAndDropManager: DragAndDropManager
         get() = TODO("Not yet implemented")
+
     @OptIn(ExperimentalComposeUiApi::class)
     override val autofillTree: AutofillTree
         get() = TODO("Not yet implemented")
+
     @OptIn(ExperimentalComposeUiApi::class)
     override val autofill: Autofill?
         get() = TODO("Not yet implemented")
+
     override val semanticAutofill: SemanticAutofill?
         get() = TODO("Not yet implemented")
+
     override val softwareKeyboardController: SoftwareKeyboardController
         get() = TODO("Not yet implemented")
+
     override suspend fun textInputSession(
         session: suspend PlatformTextInputSessionScope.() -> Nothing
-    ): Nothing { TODO("Not yet implemented") }
+    ): Nothing {
+        TODO("Not yet implemented")
+    }
 
     override fun screenToLocal(positionOnScreen: Offset): Offset {
         TODO("Not yet implemented")
@@ -435,6 +458,7 @@
     override fun localToScreen(localTransform: Matrix) {
         TODO("Not yet implemented")
     }
+
     @Deprecated(
         "fontLoader is deprecated, use fontFamilyResolver",
         replaceWith = ReplaceWith("fontFamilyResolver")
@@ -466,26 +490,51 @@
     }
 
     override fun requestOnPositionedCallback(layoutNode: LayoutNode) {}
-    override fun onAttach(node: LayoutNode) { onAttachParams += node }
-    override fun onDetach(node: LayoutNode) { onDetachParams += node }
+
+    override fun onAttach(node: LayoutNode) {
+        onAttachParams += node
+    }
+
+    override fun onDetach(node: LayoutNode) {
+        onDetachParams += node
+    }
+
     override fun calculatePositionInWindow(localPosition: Offset): Offset =
         localPosition + position.toOffset()
+
     override fun calculateLocalPosition(positionInWindow: Offset): Offset =
         positionInWindow - position.toOffset()
+
     override fun requestFocus(): Boolean = false
+
     override fun measureAndLayout(sendPointerUpdate: Boolean) {}
+
     override fun measureAndLayout(layoutNode: LayoutNode, constraints: Constraints) {}
+
     override fun forceMeasureTheSubtree(layoutNode: LayoutNode, affectsLookahead: Boolean) {}
-    override fun registerOnEndApplyChangesListener(listener: () -> Unit) { listener() }
+
+    override fun registerOnEndApplyChangesListener(listener: () -> Unit) {
+        listener()
+    }
+
     override fun onEndApplyChanges() {}
-    override fun onSemanticsChange() { semanticsChanged = true }
-    override fun onLayoutChange(layoutNode: LayoutNode) { layoutChangeCount++ }
+
+    override fun onSemanticsChange() {
+        semanticsChanged = true
+    }
+
+    override fun onLayoutChange(layoutNode: LayoutNode) {
+        layoutChangeCount++
+    }
+
     override fun getFocusDirection(keyEvent: KeyEvent): FocusDirection? {
         TODO("Not yet implemented")
     }
+
     override fun registerOnLayoutCompletedListener(listener: Owner.OnLayoutCompletedListener) {
         TODO("Not yet implemented")
     }
+
     override fun createLayer(
         drawBlock: (Canvas, GraphicsLayer?) -> Unit,
         invalidateParentLayer: () -> Unit,
@@ -495,22 +544,40 @@
         val inverseTransform = Matrix()
         return object : OwnedLayer {
             override fun isInLayer(position: Offset) = true
+
             override fun move(position: IntOffset) {}
+
             override fun resize(size: IntSize) {}
+
             override fun drawLayer(canvas: Canvas, parentLayer: GraphicsLayer?) {
                 drawBlock(canvas, parentLayer)
             }
+
             override fun updateDisplayList() {}
-            override fun invalidate() { invalidatedLayers.add(this) }
+
+            override fun invalidate() {
+                invalidatedLayers.add(this)
+            }
+
             override fun destroy() {}
+
             override fun mapBounds(rect: MutableRect, inverse: Boolean) {}
-            override fun transform(matrix: Matrix) { matrix.timesAssign(transform) }
-            override fun inverseTransform(matrix: Matrix) { matrix.timesAssign(inverseTransform) }
+
+            override fun transform(matrix: Matrix) {
+                matrix.timesAssign(transform)
+            }
+
+            override fun inverseTransform(matrix: Matrix) {
+                matrix.timesAssign(inverseTransform)
+            }
+
             override fun mapOffset(point: Offset, inverse: Boolean) = point
+
             override fun reuseLayer(
                 drawBlock: (Canvas, GraphicsLayer?) -> Unit,
                 invalidateParentLayer: () -> Unit
             ) {}
+
             override fun updateLayerProperties(scope: ReusableGraphicsLayerScope) {
                 transform.reset()
                 // This is not expected to be 100% accurate
diff --git a/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/node/NodeChainTests.kt b/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/node/NodeChainTests.kt
index 99d5b96..f2f975f 100644
--- a/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/node/NodeChainTests.kt
+++ b/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/node/NodeChainTests.kt
@@ -24,15 +24,13 @@
 private class AttachedStateDebuggerNode() : Modifier.Node() {
 
     var localIsAttached: Boolean = false
+
     fun validateHierarchy() {
         check(isAttached)
-        visitAncestors(Nodes.Any) {
-            check(it.isAttached)
-        }
-        visitSubtree(Nodes.Any) {
-            check(it.isAttached)
-        }
+        visitAncestors(Nodes.Any) { check(it.isAttached) }
+        visitSubtree(Nodes.Any) { check(it.isAttached) }
     }
+
     override fun onAttach() {
         localIsAttached = true
         validateHierarchy()
@@ -49,10 +47,7 @@
     fun testAttachDetach() {
         val a = AttachedStateDebuggerNode()
         val b = AttachedStateDebuggerNode()
-        chainTester()
-            .attach()
-            .withModifierNodes(a, b)
-            .validateAttached()
+        chainTester().attach().withModifierNodes(a, b).validateAttached()
 
         check(a.localIsAttached)
         check(b.localIsAttached)
@@ -181,8 +176,10 @@
                  a
                 -b
                  c
-                """.trimIndent()
-            ).apply {
+                """
+                    .trimIndent()
+            )
+            .apply {
                 val (entA, entC) = nodes
                 withModifiers(a1, modifierD(), b1)
                 val (entA2, entB2) = nodes
@@ -195,11 +192,7 @@
     fun getModifierNode_returnsModifiers() {
         val a = modifierA()
         val b = modifierB()
-        val modifierInfo = chainTester()
-            .attach()
-            .withModifiers(a, b)
-            .chain
-            .getModifierInfo()
+        val modifierInfo = chainTester().attach().withModifiers(a, b).chain.getModifierInfo()
 
         assertThat(modifierInfo.map { it.modifier }).isEqualTo(listOf(a, b))
     }
diff --git a/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/node/NodeCoordinatorInitializationTest.kt b/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/node/NodeCoordinatorInitializationTest.kt
index 339a671..cad2dbd 100644
--- a/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/node/NodeCoordinatorInitializationTest.kt
+++ b/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/node/NodeCoordinatorInitializationTest.kt
@@ -37,8 +37,7 @@
 @MediumTest
 @RunWith(AndroidJUnit4::class)
 class NodeCoordinatorInitializationTest {
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
     @Test
     fun initializeIsCalledWhenFocusNodeIsCreated() {
@@ -46,18 +45,10 @@
         var focusState: FocusState? = null
 
         // Act.
-        rule.setContent {
-            Box(
-                Modifier
-                    .onFocusChanged { focusState = it }
-                    .focusTarget()
-            )
-        }
+        rule.setContent { Box(Modifier.onFocusChanged { focusState = it }.focusTarget()) }
 
         // Assert.
-        rule.runOnIdle {
-            assertThat(focusState).isNotNull()
-        }
+        rule.runOnIdle { assertThat(focusState).isNotNull() }
     }
 
     @OptIn(ExperimentalComposeUiApi::class)
@@ -67,9 +58,7 @@
         val pointerInputModifier = PointerInteropFilter()
 
         // Act.
-        rule.setContent {
-            Box(modifier = pointerInputModifier)
-        }
+        rule.setContent { Box(modifier = pointerInputModifier) }
 
         // Assert.
         rule.runOnIdle {
@@ -100,15 +89,12 @@
 
     @Test
     fun delegatedNodeGetsCoordinator() {
-        val node = object : DelegatingNode() {
-            val inner = delegate(
-                object : Modifier.Node() { }
-            )
-        }
+        val node =
+            object : DelegatingNode() {
+                val inner = delegate(object : Modifier.Node() {})
+            }
 
-        rule.setContent {
-            Box(modifier = Modifier.elementOf(node))
-        }
+        rule.setContent { Box(modifier = Modifier.elementOf(node)) }
 
         rule.runOnIdle {
             assertThat(node.isAttached).isTrue()
diff --git a/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/node/NodeUtils.kt b/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/node/NodeUtils.kt
index 592ab66..730223b 100644
--- a/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/node/NodeUtils.kt
+++ b/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/node/NodeUtils.kt
@@ -20,19 +20,22 @@
 import androidx.compose.ui.platform.InspectorInfo
 
 /**
- * Remove the root modifier nodes as they are not relevant from the perspective of the tests.
- * There are 5 nodes: FocusTargetNode, FocusPropertiesNode, KeyInputNode, RotaryInputNode,
- * SemanticsNode and DragAndDropNode.
+ * Remove the root modifier nodes as they are not relevant from the perspective of the tests. There
+ * are 5 nodes: FocusTargetNode, FocusPropertiesNode, KeyInputNode, RotaryInputNode, SemanticsNode
+ * and DragAndDropNode.
  */
 internal fun <T> List<T>.trimRootModifierNodes(): List<T> = dropLast(6)
 
 internal fun Modifier.elementOf(node: Modifier.Node): Modifier {
     return this.then(ElementOf { node })
 }
-private data class ElementOf<T : Modifier.Node>(
-    val factory: () -> T
-) : ModifierNodeElement<T>() {
+
+private data class ElementOf<T : Modifier.Node>(val factory: () -> T) : ModifierNodeElement<T>() {
     override fun create(): T = factory()
+
     override fun update(node: T) {}
-    override fun InspectorInfo.inspectableProperties() { name = "testNode" }
+
+    override fun InspectorInfo.inspectableProperties() {
+        name = "testNode"
+    }
 }
diff --git a/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/node/ObserverModifierNodeTest.kt b/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/node/ObserverModifierNodeTest.kt
index c6e8ea8..7835213 100644
--- a/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/node/ObserverModifierNodeTest.kt
+++ b/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/node/ObserverModifierNodeTest.kt
@@ -32,8 +32,7 @@
 @MediumTest
 @RunWith(AndroidJUnit4::class)
 class ObserverModifierNodeTest {
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
     @Test
     fun simplyObservingValue_doesNotTriggerCallback() {
@@ -41,9 +40,7 @@
         val value by mutableStateOf(1)
         var callbackInvoked = false
         val observerNode = TestObserverNode { callbackInvoked = true }
-        rule.setContent {
-            Box(Modifier.elementOf(observerNode))
-        }
+        rule.setContent { Box(Modifier.elementOf(observerNode)) }
 
         // Act.
         rule.runOnIdle {
@@ -52,9 +49,7 @@
         }
 
         // Assert.
-        rule.runOnIdle {
-            assertThat(callbackInvoked).isFalse()
-        }
+        rule.runOnIdle { assertThat(callbackInvoked).isFalse() }
     }
 
     @Test
@@ -63,9 +58,7 @@
         var value by mutableStateOf(1)
         var callbackInvoked = false
         val observerNode = TestObserverNode { callbackInvoked = true }
-        rule.setContent {
-            Box(Modifier.elementOf(observerNode))
-        }
+        rule.setContent { Box(Modifier.elementOf(observerNode)) }
 
         // Act.
         rule.runOnIdle {
@@ -77,9 +70,7 @@
         }
 
         // Assert.
-        rule.runOnIdle {
-            assertThat(callbackInvoked).isTrue()
-        }
+        rule.runOnIdle { assertThat(callbackInvoked).isTrue() }
     }
 
     @Test(expected = IllegalStateException::class)
@@ -99,9 +90,7 @@
         }
 
         // Assert.
-        rule.runOnIdle {
-            assertThat(callbackInvoked).isFalse()
-        }
+        rule.runOnIdle { assertThat(callbackInvoked).isFalse() }
     }
 
     @Test
@@ -111,9 +100,7 @@
         var callbackInvoked = false
         val observerNode = TestObserverNode { callbackInvoked = true }
         var attached by mutableStateOf(true)
-        rule.setContent {
-            Box(if (attached) Modifier.elementOf(observerNode) else Modifier)
-        }
+        rule.setContent { Box(if (attached) Modifier.elementOf(observerNode) else Modifier) }
 
         // Act.
         // Read value while not attached.
@@ -124,9 +111,7 @@
         rule.runOnIdle { value = 3 }
 
         // Assert.
-        rule.runOnIdle {
-            assertThat(callbackInvoked).isTrue()
-        }
+        rule.runOnIdle { assertThat(callbackInvoked).isTrue() }
     }
 
     @Test
@@ -136,9 +121,7 @@
         var callbackInvoked = false
         val observerNode = TestObserverNode { callbackInvoked = true }
         var attached by mutableStateOf(true)
-        rule.setContent {
-            Box(if (attached) Modifier.elementOf(observerNode) else Modifier)
-        }
+        rule.setContent { Box(if (attached) Modifier.elementOf(observerNode) else Modifier) }
 
         // Act.
         rule.runOnIdle {
@@ -146,16 +129,12 @@
             observerNode.observeReads { value.toString() }
         }
 
-        rule.runOnIdle {
-            attached = false
-        }
+        rule.runOnIdle { attached = false }
         // Write to the read value to trigger onObservedReadsChanged.
         rule.runOnIdle { value = 3 }
 
         // Assert.
-        rule.runOnIdle {
-            assertThat(callbackInvoked).isFalse()
-        }
+        rule.runOnIdle { assertThat(callbackInvoked).isFalse() }
     }
 
     class TestObserverNode(
diff --git a/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/node/RequireLayoutCoordinatesTest.kt b/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/node/RequireLayoutCoordinatesTest.kt
index 3d1a48d..7aca0c8 100644
--- a/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/node/RequireLayoutCoordinatesTest.kt
+++ b/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/node/RequireLayoutCoordinatesTest.kt
@@ -45,19 +45,12 @@
 @RunWith(AndroidJUnit4::class)
 class RequireLayoutCoordinatesTest {
 
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
     @Test
     fun requireLayoutCoordinates_throws_whenNotAttached() {
         lateinit var modifier: TestModifierNode
-        rule.setContent {
-            Box(
-                Modifier
-                    .then(TestModifier { modifier = it })
-                    .size(1.dp)
-            )
-        }
+        rule.setContent { Box(Modifier.then(TestModifier { modifier = it }).size(1.dp)) }
 
         rule.runOnIdle {
             assertIs<IllegalStateException>(modifier.coordinatesFromInit.exceptionOrNull())
@@ -69,8 +62,7 @@
         lateinit var modifier: TestModifierNode
         rule.setContent {
             Box(
-                Modifier
-                    .offset(10.dp, 20.dp)
+                Modifier.offset(10.dp, 20.dp)
                     .requiredSize(30.dp, 40.dp)
                     .then(TestModifier { modifier = it })
             )
@@ -94,10 +86,7 @@
         lateinit var modifier: TestModifierNode
         rule.setContent {
             Layout(
-                Modifier
-                    .requiredSize(10.dp)
-                    .then(TestModifier { modifier = it })
-                    .requiredSize(5.dp)
+                Modifier.requiredSize(10.dp).then(TestModifier { modifier = it }).requiredSize(5.dp)
             ) { _, _ ->
                 layout(2.dp.roundToPx(), 2.dp.roundToPx()) {}
             }
@@ -107,8 +96,7 @@
             val coordinates = assertNotNull(modifier.requireLayoutCoordinates())
 
             with(rule.density) {
-                assertThat(coordinates.size)
-                    .isEqualTo(IntSize(5.dp.roundToPx(), 5.dp.roundToPx()))
+                assertThat(coordinates.size).isEqualTo(IntSize(5.dp.roundToPx(), 5.dp.roundToPx()))
             }
         }
     }
@@ -119,8 +107,7 @@
         lateinit var modifier: TestModifierNode
         rule.setContent {
             Box(
-                Modifier
-                    .then(if (attachModifier) TestModifier { modifier = it } else Modifier)
+                Modifier.then(if (attachModifier) TestModifier { modifier = it } else Modifier)
                     .size(1.dp)
             )
         }
@@ -131,15 +118,12 @@
         attachModifier = false
 
         rule.runOnIdle {
-            assertFailsWith<IllegalStateException> {
-                modifier.requireLayoutCoordinates()
-            }
+            assertFailsWith<IllegalStateException> { modifier.requireLayoutCoordinates() }
         }
     }
 
-    private data class TestModifier(
-        val onModifier: (TestModifierNode) -> Unit
-    ) : ModifierNodeElement<TestModifierNode>() {
+    private data class TestModifier(val onModifier: (TestModifierNode) -> Unit) :
+        ModifierNodeElement<TestModifierNode>() {
         override fun create(): TestModifierNode = TestModifierNode().also(onModifier)
 
         override fun update(node: TestModifierNode) {}
diff --git a/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/node/RequireViewTest.kt b/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/node/RequireViewTest.kt
index eb60d8c..7c0d450 100644
--- a/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/node/RequireViewTest.kt
+++ b/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/node/RequireViewTest.kt
@@ -39,8 +39,7 @@
 @RunWith(AndroidJUnit4::class)
 class RequireViewTest {
 
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
     @Test
     fun requireView_returnsView() {
@@ -48,11 +47,7 @@
         lateinit var node: TestModifierNode
         rule.setContent {
             view = LocalView.current
-            Box(
-                Modifier
-                    .then(TestModifier(onNode = { node = it }))
-                    .size(1.dp)
-            )
+            Box(Modifier.then(TestModifier(onNode = { node = it })).size(1.dp))
         }
 
         rule.runOnIdle {
@@ -68,8 +63,7 @@
         lateinit var node: TestModifierNode
         rule.setContent {
             Box(
-                Modifier
-                    .then(if (attach) TestModifier(onNode = { node = it }) else Modifier)
+                Modifier.then(if (attach) TestModifier(onNode = { node = it }) else Modifier)
                     .size(1.dp)
             )
         }
@@ -77,25 +71,20 @@
         rule.waitForIdle()
         attach = false
 
-        rule.runOnIdle {
-            assertFailsWith<IllegalStateException> { node.requireView() }
-        }
+        rule.runOnIdle { assertFailsWith<IllegalStateException> { node.requireView() } }
     }
 
-    private data class TestModifier(
-        val onNode: (TestModifierNode) -> Unit
-    ) : ModifierNodeElement<TestModifierNode>() {
+    private data class TestModifier(val onNode: (TestModifierNode) -> Unit) :
+        ModifierNodeElement<TestModifierNode>() {
         override fun create(): TestModifierNode {
             return TestModifierNode(onNode)
         }
 
-        override fun update(node: TestModifierNode) {
-        }
+        override fun update(node: TestModifierNode) {}
     }
 
-    private class TestModifierNode(
-        private val onNode: (TestModifierNode) -> Unit
-    ) : Modifier.Node() {
+    private class TestModifierNode(private val onNode: (TestModifierNode) -> Unit) :
+        Modifier.Node() {
         override fun onAttach() {
             onNode(this)
         }
diff --git a/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/node/SharePointerInputWithSiblingTest.kt b/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/node/SharePointerInputWithSiblingTest.kt
index 1fac1b6..8515afd 100644
--- a/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/node/SharePointerInputWithSiblingTest.kt
+++ b/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/node/SharePointerInputWithSiblingTest.kt
@@ -42,8 +42,7 @@
 @RunWith(AndroidJUnit4::class)
 class SharePointerInputWithSiblingTest {
 
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
     @Test
     fun Drawer_drawerContentSharePointerInput_cantClickContent() {
@@ -56,19 +55,17 @@
             ModalDrawer(
                 drawerState = drawerState,
                 drawerContent = {
-                    Box(Modifier
-                        .fillMaxSize()
-                        .testTag("box1")
-                        .testPointerInput(sharePointerInputWithSibling = true) {
+                    Box(
+                        Modifier.fillMaxSize().testTag("box1").testPointerInput(
+                            sharePointerInputWithSibling = true
+                        ) {
                             box1Clicked = true
                         }
                     )
                 },
                 content = {
-                    Box(Modifier
-                        .fillMaxSize()
-                        .testTag("box2")
-                        .testPointerInput {
+                    Box(
+                        Modifier.fillMaxSize().testTag("box2").testPointerInput {
                             box2Clicked = true
                         }
                     )
@@ -88,18 +85,12 @@
 
         rule.setContent {
             Box(Modifier.size(50.dp)) {
-                Box(Modifier
-                    .fillMaxSize()
-                    .testTag("box1")
-                    .testPointerInput {
-                        box1Clicked = true
-                    }
-                )
+                Box(Modifier.fillMaxSize().testTag("box1").testPointerInput { box1Clicked = true })
 
-                Box(Modifier
-                    .fillMaxSize()
-                    .testTag("box2")
-                    .testPointerInput(sharePointerInputWithSibling = true) {
+                Box(
+                    Modifier.fillMaxSize().testTag("box2").testPointerInput(
+                        sharePointerInputWithSibling = true
+                    ) {
                         box2Clicked = true
                     }
                 )
@@ -117,22 +108,13 @@
         var box2Clicked = false
 
         rule.setContent {
-            Box(Modifier
-                .size(50.dp)
-                .testPointerInput(sharePointerInputWithSibling = false)
-            ) {
-                Box(Modifier
-                    .fillMaxSize()
-                    .testTag("box1")
-                    .testPointerInput {
-                        box1Clicked = true
-                    }
-                )
+            Box(Modifier.size(50.dp).testPointerInput(sharePointerInputWithSibling = false)) {
+                Box(Modifier.fillMaxSize().testTag("box1").testPointerInput { box1Clicked = true })
 
-                Box(Modifier
-                    .fillMaxSize()
-                    .testTag("box2")
-                    .testPointerInput(sharePointerInputWithSibling = true) {
+                Box(
+                    Modifier.fillMaxSize().testTag("box2").testPointerInput(
+                        sharePointerInputWithSibling = true
+                    ) {
                         box2Clicked = true
                     }
                 )
@@ -151,19 +133,13 @@
 
         rule.setContent {
             Box(Modifier.size(50.dp)) {
-                Box(Modifier
-                    .fillMaxSize()
-                    .testTag("box1")
-                    .testPointerInput {
-                        box1Clicked = true
-                    }
-                )
+                Box(Modifier.fillMaxSize().testTag("box1").testPointerInput { box1Clicked = true })
 
                 Box(Modifier.fillMaxSize()) {
-                    Box(Modifier
-                        .fillMaxSize()
-                        .testTag("box2")
-                        .testPointerInput(sharePointerInputWithSibling = true) {
+                    Box(
+                        Modifier.fillMaxSize().testTag("box2").testPointerInput(
+                            sharePointerInputWithSibling = true
+                        ) {
                             box2Clicked = true
                         }
                     )
@@ -183,19 +159,13 @@
 
         rule.setContent {
             Box(Modifier.size(50.dp)) {
-                Box(Modifier.fillMaxSize()
-                    .testTag("box1")
-                    .testPointerInput {
-                        box1Clicked = true
-                    }
-                )
+                Box(Modifier.fillMaxSize().testTag("box1").testPointerInput { box1Clicked = true })
 
-                Box(Modifier.fillMaxSize()
-                    .testPointerInput(sharePointerInputWithSibling = false)
-                ) {
-                    Box(Modifier.fillMaxSize()
-                        .testTag("box2")
-                        .testPointerInput(sharePointerInputWithSibling = true) {
+                Box(Modifier.fillMaxSize().testPointerInput(sharePointerInputWithSibling = false)) {
+                    Box(
+                        Modifier.fillMaxSize().testTag("box2").testPointerInput(
+                            sharePointerInputWithSibling = true
+                        ) {
                             box2Clicked = true
                         }
                     )
@@ -216,23 +186,20 @@
 
         rule.setContent {
             Box(Modifier.size(50.dp)) {
-                Box(Modifier.fillMaxSize()
-                    .testTag("box1")
-                    .testPointerInput {
-                        box1Clicked = true
-                    }
-                )
+                Box(Modifier.fillMaxSize().testTag("box1").testPointerInput { box1Clicked = true })
 
-                Box(Modifier.fillMaxSize()
-                    .testTag("box2")
-                    .testPointerInput(sharePointerInputWithSibling = false) {
+                Box(
+                    Modifier.fillMaxSize().testTag("box2").testPointerInput(
+                        sharePointerInputWithSibling = false
+                    ) {
                         box2Clicked = true
                     }
                 )
 
-                Box(Modifier.fillMaxSize()
-                    .testTag("box3")
-                    .testPointerInput(sharePointerInputWithSibling = true) {
+                Box(
+                    Modifier.fillMaxSize().testTag("box3").testPointerInput(
+                        sharePointerInputWithSibling = true
+                    ) {
                         box3Clicked = true
                     }
                 )
@@ -277,7 +244,7 @@
         onPointerEvent.invoke()
     }
 
-    override fun onCancelPointerInput() { }
+    override fun onCancelPointerInput() {}
 
     override fun sharePointerInputWithSiblings(): Boolean {
         return sharePointerInputWithSibling
diff --git a/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/node/TraversableModifierNodeTest.kt b/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/node/TraversableModifierNodeTest.kt
index 38f7e99..6a92f39 100644
--- a/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/node/TraversableModifierNodeTest.kt
+++ b/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/node/TraversableModifierNodeTest.kt
@@ -41,8 +41,7 @@
 @SmallTest
 @RunWith(AndroidJUnit4::class)
 class TraversableModifierNodeTest {
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
     private lateinit var parentNode: ClassOneWithSharedKeyTraversalNode
 
@@ -62,155 +61,143 @@
     /**
      * The UI hierarchy for this test is setup as:
      *
-     *  Parent Column (ClassOneWithSharedKeyTraversalNode)
-     *    ⤷ ChildA Row (ClassOneWithSharedKeyTraversalNode)
-     *        ⤷ GrandchildA Box (ClassOneWithSharedKeyTraversalNode)
-     *        ⤷ GrandchildB Box (ClassTwoWithSharedKeyTraversalNode)
-     *        ⤷ GrandchildC Box (ClassThreeWithOtherKeyTraversalNode)
+     * Parent Column (ClassOneWithSharedKeyTraversalNode) ⤷ ChildA Row
+     * (ClassOneWithSharedKeyTraversalNode) ⤷ GrandchildA Box (ClassOneWithSharedKeyTraversalNode) ⤷
+     * GrandchildB Box (ClassTwoWithSharedKeyTraversalNode) ⤷ GrandchildC Box
+     * (ClassThreeWithOtherKeyTraversalNode)
      *
-     *    ⤷ ChildB Row (ClassTwoWithSharedKeyTraversalNode)
-     *         ⤷ GrandchildD Box (ClassOneWithSharedKeyTraversalNode)
-     *         ⤷ GrandchildE Box (ClassTwoWithSharedKeyTraversalNode)
-     *         ⤷ GrandchildF Box (ClassThreeWithOtherKeyTraversalNode)
+     * ⤷ ChildB Row (ClassTwoWithSharedKeyTraversalNode) ⤷ GrandchildD Box
+     * (ClassOneWithSharedKeyTraversalNode) ⤷ GrandchildE Box (ClassTwoWithSharedKeyTraversalNode) ⤷
+     * GrandchildF Box (ClassThreeWithOtherKeyTraversalNode)
      *
-     *    ⤷ ChildC Row (ClassThreeWithOtherKeyTraversalNode)
-     *         ⤷ GrandchildG Box (ClassOneWithSharedKeyTraversalNode)
-     *         ⤷ GrandchildH Box (ClassTwoWithSharedKeyTraversalNode)
-     *         ⤷ GrandchildI Box (ClassThreeWithOtherKeyTraversalNode)
+     * ⤷ ChildC Row (ClassThreeWithOtherKeyTraversalNode) ⤷ GrandchildG Box
+     * (ClassOneWithSharedKeyTraversalNode) ⤷ GrandchildH Box (ClassTwoWithSharedKeyTraversalNode) ⤷
+     * GrandchildI Box (ClassThreeWithOtherKeyTraversalNode)
      *
-     *    ⤷ ChildD Row (ClassTwoWithSharedKeyTraversalNode)
-     *         ⤷ GrandchildJ Box (ClassOneWithSharedKeyTraversalNode)
-     *
+     * ⤷ ChildD Row (ClassTwoWithSharedKeyTraversalNode) ⤷ GrandchildJ Box
+     * (ClassOneWithSharedKeyTraversalNode)
      */
     @Composable
     private fun createUi() {
         Column(
-            modifier = Modifier
-                .fillMaxSize()
-                .background(Color.Red)
-                .testTraversalNodeClassOneWithSharedKey("Parent") {
+            modifier =
+                Modifier.fillMaxSize().background(Color.Red).testTraversalNodeClassOneWithSharedKey(
+                    "Parent"
+                ) {
                     parentNode = this
                 },
         ) {
             // Child A
             Row(
-                modifier = Modifier
-                    .fillMaxWidth()
-                    .background(Color.Green)
-                    .testTraversalNodeClassOneWithSharedKey("Child_A") {
-                        childA = this
-                    }
+                modifier =
+                    Modifier.fillMaxWidth()
+                        .background(Color.Green)
+                        .testTraversalNodeClassOneWithSharedKey("Child_A") { childA = this }
             ) {
                 Box(
-                    modifier = Modifier
-                        .size(30.dp)
-                        .background(Color.Blue)
-                        .testTraversalNodeClassOneWithSharedKey("Grandchild_A") {
-                            grandChildNodeA = this
-                        }
-                ) { }
+                    modifier =
+                        Modifier.size(30.dp)
+                            .background(Color.Blue)
+                            .testTraversalNodeClassOneWithSharedKey("Grandchild_A") {
+                                grandChildNodeA = this
+                            }
+                ) {}
                 Box(
-                    modifier = Modifier
-                        .size(30.dp)
-                        .background(Color.White)
-                        .testTraversalNodeClassTwoWithSharedKey("Grandchild_B") {
-                            grandChildNodeB = this
-                        }
-                ) { }
+                    modifier =
+                        Modifier.size(30.dp)
+                            .background(Color.White)
+                            .testTraversalNodeClassTwoWithSharedKey("Grandchild_B") {
+                                grandChildNodeB = this
+                            }
+                ) {}
                 Box(
-                    modifier = Modifier
-                        .size(30.dp)
-                        .background(Color.Black)
-                        .testTraversalNodeClassThreeWithOtherKey("Grandchild_C") {
-                            grandChildNodeC = this
-                        }
-                ) { }
+                    modifier =
+                        Modifier.size(30.dp)
+                            .background(Color.Black)
+                            .testTraversalNodeClassThreeWithOtherKey("Grandchild_C") {
+                                grandChildNodeC = this
+                            }
+                ) {}
             }
             // Child B
             Row(
-                modifier = Modifier
-                    .fillMaxWidth()
-                    .background(Color.Magenta)
-                    .testTraversalNodeClassTwoWithSharedKey("Child_B") {
-                        childB = this
-                    }
+                modifier =
+                    Modifier.fillMaxWidth()
+                        .background(Color.Magenta)
+                        .testTraversalNodeClassTwoWithSharedKey("Child_B") { childB = this }
             ) {
                 Box(
-                    modifier = Modifier
-                        .size(30.dp)
-                        .background(Color.Yellow)
-                        .testTraversalNodeClassOneWithSharedKey("Grandchild_D") {
-                            grandChildNodeD = this
-                        }
-                ) { }
+                    modifier =
+                        Modifier.size(30.dp)
+                            .background(Color.Yellow)
+                            .testTraversalNodeClassOneWithSharedKey("Grandchild_D") {
+                                grandChildNodeD = this
+                            }
+                ) {}
                 Box(
-                    modifier = Modifier
-                        .size(30.dp)
-                        .background(Color.Blue)
-                        .testTraversalNodeClassTwoWithSharedKey("Grandchild_E")
-                ) { }
+                    modifier =
+                        Modifier.size(30.dp)
+                            .background(Color.Blue)
+                            .testTraversalNodeClassTwoWithSharedKey("Grandchild_E")
+                ) {}
                 Box(
-                    modifier = Modifier
-                        .size(30.dp)
-                        .background(Color.Gray)
-                        .testTraversalNodeClassThreeWithOtherKey("Grandchild_F") {
-                            grandChildNodeF = this
-                        }
-                ) { }
+                    modifier =
+                        Modifier.size(30.dp)
+                            .background(Color.Gray)
+                            .testTraversalNodeClassThreeWithOtherKey("Grandchild_F") {
+                                grandChildNodeF = this
+                            }
+                ) {}
             }
             // Child C
             Row(
-                modifier = Modifier
-                    .fillMaxWidth()
-                    .background(Color.Cyan)
-                    .testTraversalNodeClassThreeWithOtherKey("Child_C") {
-                        childC = this
-                    }
+                modifier =
+                    Modifier.fillMaxWidth()
+                        .background(Color.Cyan)
+                        .testTraversalNodeClassThreeWithOtherKey("Child_C") { childC = this }
             ) {
                 Box(
-                    modifier = Modifier
-                        .size(30.dp)
-                        .background(Color.Blue)
-                        .testTraversalNodeClassOneWithSharedKey("Grandchild_G") {
-                            grandChildNodeG = this
-                        }
-                ) { }
+                    modifier =
+                        Modifier.size(30.dp)
+                            .background(Color.Blue)
+                            .testTraversalNodeClassOneWithSharedKey("Grandchild_G") {
+                                grandChildNodeG = this
+                            }
+                ) {}
                 Box(
-                    modifier = Modifier
-                        .size(30.dp)
-                        .background(Color.Magenta)
-                        .testTraversalNodeClassTwoWithSharedKey("Grandchild_H")
-                ) { }
+                    modifier =
+                        Modifier.size(30.dp)
+                            .background(Color.Magenta)
+                            .testTraversalNodeClassTwoWithSharedKey("Grandchild_H")
+                ) {}
                 Box(
-                    modifier = Modifier
-                        .size(30.dp)
-                        .background(Color.Black)
-                        .testTraversalNodeClassThreeWithOtherKey("Grandchild_I")
-                ) { }
+                    modifier =
+                        Modifier.size(30.dp)
+                            .background(Color.Black)
+                            .testTraversalNodeClassThreeWithOtherKey("Grandchild_I")
+                ) {}
             }
 
             // Child D
             Row(
-                modifier = Modifier
-                    .fillMaxWidth()
-                    .background(Color.Green)
-                    .testTraversalNodeClassTwoWithSharedKey("Child_D")
+                modifier =
+                    Modifier.fillMaxWidth()
+                        .background(Color.Green)
+                        .testTraversalNodeClassTwoWithSharedKey("Child_D")
             ) {
                 Box(
-                    modifier = Modifier
-                        .size(30.dp)
-                        .background(Color.Black)
-                        .testTraversalNodeClassOneWithSharedKey("Grandchild_J")
-                ) { }
+                    modifier =
+                        Modifier.size(30.dp)
+                            .background(Color.Black)
+                            .testTraversalNodeClassOneWithSharedKey("Grandchild_J")
+                ) {}
             }
         }
     }
 
     @Before
     fun setup() {
-        rule.setContent {
-            createUi()
-        }
+        rule.setContent { createUi() }
     }
 
     // *********** Nearest Traversable Ancestor Tests ***********
@@ -219,37 +206,25 @@
         var nearestAncestorNode: TraversableNode? = null
 
         // Starts at grandchild A (which has a parent and grandparent of the same class)
-        rule.runOnIdle {
-            nearestAncestorNode = grandChildNodeA.findNearestAncestor()
-        }
+        rule.runOnIdle { nearestAncestorNode = grandChildNodeA.findNearestAncestor() }
 
-        rule.runOnIdle {
-            Truth.assertThat(nearestAncestorNode).isEqualTo(childA)
-        }
+        rule.runOnIdle { Truth.assertThat(nearestAncestorNode).isEqualTo(childA) }
 
         // Starts at grandchild D (which has a parent of a different class + same key and
         // grandparent of the same class).
         nearestAncestorNode = null
 
-        rule.runOnIdle {
-            nearestAncestorNode = grandChildNodeD.findNearestAncestor()
-        }
+        rule.runOnIdle { nearestAncestorNode = grandChildNodeD.findNearestAncestor() }
 
-        rule.runOnIdle {
-            Truth.assertThat(nearestAncestorNode).isEqualTo(parentNode)
-        }
+        rule.runOnIdle { Truth.assertThat(nearestAncestorNode).isEqualTo(parentNode) }
 
         // Starts at grandchild G (which has a parent of a different class + different key and
         // a grandparent of the same class).
         nearestAncestorNode = null
 
-        rule.runOnIdle {
-            nearestAncestorNode = grandChildNodeG.findNearestAncestor()
-        }
+        rule.runOnIdle { nearestAncestorNode = grandChildNodeG.findNearestAncestor() }
 
-        rule.runOnIdle {
-            Truth.assertThat(nearestAncestorNode).isEqualTo(parentNode)
-        }
+        rule.runOnIdle { Truth.assertThat(nearestAncestorNode).isEqualTo(parentNode) }
     }
 
     @Test
@@ -258,25 +233,17 @@
 
         // Starts at grandchild B (which has a parent and grandparent of different class but the
         // same key). Neither should match.
-        rule.runOnIdle {
-            nearestAncestorNode = grandChildNodeB.findNearestAncestor()
-        }
+        rule.runOnIdle { nearestAncestorNode = grandChildNodeB.findNearestAncestor() }
 
-        rule.runOnIdle {
-            Truth.assertThat(nearestAncestorNode).isEqualTo(null)
-        }
+        rule.runOnIdle { Truth.assertThat(nearestAncestorNode).isEqualTo(null) }
 
         nearestAncestorNode = null
 
         // Starts at grandchild C (which has a parent and grandparent of different class and a
         // different key). Neither should match.
-        rule.runOnIdle {
-            nearestAncestorNode = grandChildNodeC.findNearestAncestor()
-        }
+        rule.runOnIdle { nearestAncestorNode = grandChildNodeC.findNearestAncestor() }
 
-        rule.runOnIdle {
-            Truth.assertThat(nearestAncestorNode).isEqualTo(null)
-        }
+        rule.runOnIdle { Truth.assertThat(nearestAncestorNode).isEqualTo(null) }
     }
 
     @Test
@@ -285,49 +252,37 @@
 
         // Starts from grandchild A with SHARED_TRAVERSAL_NODE_KEY.
         rule.runOnIdle {
-            nearestAncestorNode =
-                grandChildNodeA.findNearestAncestor(SHARED_TRAVERSAL_NODE_KEY)
+            nearestAncestorNode = grandChildNodeA.findNearestAncestor(SHARED_TRAVERSAL_NODE_KEY)
         }
 
-        rule.runOnIdle {
-            Truth.assertThat(nearestAncestorNode).isEqualTo(childA)
-        }
+        rule.runOnIdle { Truth.assertThat(nearestAncestorNode).isEqualTo(childA) }
 
         nearestAncestorNode = null
 
         // Starts from grandchild D with SHARED_TRAVERSAL_NODE_KEY.
         rule.runOnIdle {
-            nearestAncestorNode =
-                grandChildNodeD.findNearestAncestor(SHARED_TRAVERSAL_NODE_KEY)
+            nearestAncestorNode = grandChildNodeD.findNearestAncestor(SHARED_TRAVERSAL_NODE_KEY)
         }
 
-        rule.runOnIdle {
-            Truth.assertThat(nearestAncestorNode).isEqualTo(childB)
-        }
+        rule.runOnIdle { Truth.assertThat(nearestAncestorNode).isEqualTo(childB) }
 
         nearestAncestorNode = null
 
         // Starts from grandchild G with SHARED_TRAVERSAL_NODE_KEY.
         rule.runOnIdle {
-            nearestAncestorNode =
-                grandChildNodeG.findNearestAncestor(SHARED_TRAVERSAL_NODE_KEY)
+            nearestAncestorNode = grandChildNodeG.findNearestAncestor(SHARED_TRAVERSAL_NODE_KEY)
         }
 
-        rule.runOnIdle {
-            Truth.assertThat(nearestAncestorNode).isEqualTo(parentNode)
-        }
+        rule.runOnIdle { Truth.assertThat(nearestAncestorNode).isEqualTo(parentNode) }
 
         nearestAncestorNode = null
 
         // Starts from grandchild G with OTHER_TRAVERSAL_NODE_KEY.
         rule.runOnIdle {
-            nearestAncestorNode =
-                grandChildNodeG.findNearestAncestor(OTHER_TRAVERSAL_NODE_KEY)
+            nearestAncestorNode = grandChildNodeG.findNearestAncestor(OTHER_TRAVERSAL_NODE_KEY)
         }
 
-        rule.runOnIdle {
-            Truth.assertThat(nearestAncestorNode).isEqualTo(childC)
-        }
+        rule.runOnIdle { Truth.assertThat(nearestAncestorNode).isEqualTo(childC) }
     }
 
     @Test
@@ -336,49 +291,37 @@
 
         // Starts from grandchild A with OTHER_TRAVERSAL_NODE_KEY.
         rule.runOnIdle {
-            nearestAncestorNode =
-                grandChildNodeA.findNearestAncestor(OTHER_TRAVERSAL_NODE_KEY)
+            nearestAncestorNode = grandChildNodeA.findNearestAncestor(OTHER_TRAVERSAL_NODE_KEY)
         }
 
-        rule.runOnIdle {
-            Truth.assertThat(nearestAncestorNode).isEqualTo(null)
-        }
+        rule.runOnIdle { Truth.assertThat(nearestAncestorNode).isEqualTo(null) }
 
         nearestAncestorNode = null
 
         // Starts from grandchild B with OTHER_TRAVERSAL_NODE_KEY.
         rule.runOnIdle {
-            nearestAncestorNode =
-                grandChildNodeB.findNearestAncestor(OTHER_TRAVERSAL_NODE_KEY)
+            nearestAncestorNode = grandChildNodeB.findNearestAncestor(OTHER_TRAVERSAL_NODE_KEY)
         }
 
-        rule.runOnIdle {
-            Truth.assertThat(nearestAncestorNode).isEqualTo(null)
-        }
+        rule.runOnIdle { Truth.assertThat(nearestAncestorNode).isEqualTo(null) }
 
         nearestAncestorNode = null
 
         // Starts from grandchild C with OTHER_TRAVERSAL_NODE_KEY.
         rule.runOnIdle {
-            nearestAncestorNode =
-                grandChildNodeC.findNearestAncestor(OTHER_TRAVERSAL_NODE_KEY)
+            nearestAncestorNode = grandChildNodeC.findNearestAncestor(OTHER_TRAVERSAL_NODE_KEY)
         }
 
-        rule.runOnIdle {
-            Truth.assertThat(nearestAncestorNode).isEqualTo(null)
-        }
+        rule.runOnIdle { Truth.assertThat(nearestAncestorNode).isEqualTo(null) }
 
         nearestAncestorNode = null
 
         // Starts from grandchild F with OTHER_TRAVERSAL_NODE_KEY.
         rule.runOnIdle {
-            nearestAncestorNode =
-                grandChildNodeF.findNearestAncestor(OTHER_TRAVERSAL_NODE_KEY)
+            nearestAncestorNode = grandChildNodeF.findNearestAncestor(OTHER_TRAVERSAL_NODE_KEY)
         }
 
-        rule.runOnIdle {
-            Truth.assertThat(nearestAncestorNode).isEqualTo(null)
-        }
+        rule.runOnIdle { Truth.assertThat(nearestAncestorNode).isEqualTo(null) }
     }
 
     @Test
@@ -386,9 +329,7 @@
         var nearestAncestorNode: TraversableNode? = null
 
         // Starts from grandchild A with null key.
-        rule.runOnIdle {
-            nearestAncestorNode = grandChildNodeA.findNearestAncestor(null)
-        }
+        rule.runOnIdle { nearestAncestorNode = grandChildNodeA.findNearestAncestor(null) }
 
         rule.runOnIdle {
             // No ancestors have a key of null
@@ -398,24 +339,16 @@
         // Starts from grandchild D with null key.
         nearestAncestorNode = null
 
-        rule.runOnIdle {
-            nearestAncestorNode = grandChildNodeD.findNearestAncestor(null)
-        }
+        rule.runOnIdle { nearestAncestorNode = grandChildNodeD.findNearestAncestor(null) }
 
-        rule.runOnIdle {
-            Truth.assertThat(nearestAncestorNode).isEqualTo(null)
-        }
+        rule.runOnIdle { Truth.assertThat(nearestAncestorNode).isEqualTo(null) }
 
         // Starts from grandchild F with null key.
         nearestAncestorNode = null
 
-        rule.runOnIdle {
-            nearestAncestorNode = grandChildNodeF.findNearestAncestor(null)
-        }
+        rule.runOnIdle { nearestAncestorNode = grandChildNodeF.findNearestAncestor(null) }
 
-        rule.runOnIdle {
-            Truth.assertThat(nearestAncestorNode).isEqualTo(null)
-        }
+        rule.runOnIdle { Truth.assertThat(nearestAncestorNode).isEqualTo(null) }
     }
 
     // *********** Traverse Ancestors Tests ***********
@@ -432,9 +365,7 @@
             }
         }
 
-        rule.runOnIdle {
-            Truth.assertThat(sameClassAncestors).isEqualTo(2)
-        }
+        rule.runOnIdle { Truth.assertThat(sameClassAncestors).isEqualTo(2) }
 
         // Starts at grandchild D (which has a parent of a different class + same key and
         // grandparent of the same class).
@@ -448,9 +379,7 @@
             }
         }
 
-        rule.runOnIdle {
-            Truth.assertThat(sameClassAncestors).isEqualTo(1)
-        }
+        rule.runOnIdle { Truth.assertThat(sameClassAncestors).isEqualTo(1) }
 
         // Starts at grandchild G (which has a parent of a different class + different key and
         // a grandparent of the same class).
@@ -464,9 +393,7 @@
             }
         }
 
-        rule.runOnIdle {
-            Truth.assertThat(sameClassAncestors).isEqualTo(1)
-        }
+        rule.runOnIdle { Truth.assertThat(sameClassAncestors).isEqualTo(1) }
     }
 
     @Test
@@ -482,9 +409,7 @@
             }
         }
 
-        rule.runOnIdle {
-            Truth.assertThat(sameClassAncestors).isEqualTo(1)
-        }
+        rule.runOnIdle { Truth.assertThat(sameClassAncestors).isEqualTo(1) }
     }
 
     @Test
@@ -503,11 +428,9 @@
                     is ClassOneWithSharedKeyTraversalNode -> {
                         classOneWithSharedKeyTraversalNodeAncestors++
                     }
-
                     is ClassTwoWithSharedKeyTraversalNode -> {
                         classTwoWithSharedKeyTraversalNodeAncestors++
                     }
-
                     is ClassThreeWithOtherKeyTraversalNode -> {
                         classThreeWithOtherKeyTraversalNodeAncestors++
                     }
@@ -539,11 +462,9 @@
                     is ClassOneWithSharedKeyTraversalNode -> {
                         classOneWithSharedKeyTraversalNodeAncestors++
                     }
-
                     is ClassTwoWithSharedKeyTraversalNode -> {
                         classTwoWithSharedKeyTraversalNodeAncestors++
                     }
-
                     is ClassThreeWithOtherKeyTraversalNode -> {
                         classThreeWithOtherKeyTraversalNodeAncestors++
                     }
@@ -575,11 +496,9 @@
                     is ClassOneWithSharedKeyTraversalNode -> {
                         classOneWithSharedKeyTraversalNodeAncestors++
                     }
-
                     is ClassTwoWithSharedKeyTraversalNode -> {
                         classTwoWithSharedKeyTraversalNodeAncestors++
                     }
-
                     is ClassThreeWithOtherKeyTraversalNode -> {
                         classThreeWithOtherKeyTraversalNodeAncestors++
                     }
@@ -611,11 +530,9 @@
                     is ClassOneWithSharedKeyTraversalNode -> {
                         classOneWithSharedKeyTraversalNodeAncestors++
                     }
-
                     is ClassTwoWithSharedKeyTraversalNode -> {
                         classTwoWithSharedKeyTraversalNodeAncestors++
                     }
-
                     is ClassThreeWithOtherKeyTraversalNode -> {
                         classThreeWithOtherKeyTraversalNodeAncestors++
                     }
@@ -650,11 +567,9 @@
                     is ClassOneWithSharedKeyTraversalNode -> {
                         classOneWithSharedKeyTraversalNodeAncestors++
                     }
-
                     is ClassTwoWithSharedKeyTraversalNode -> {
                         classTwoWithSharedKeyTraversalNodeAncestors++
                     }
-
                     is ClassThreeWithOtherKeyTraversalNode -> {
                         classThreeWithOtherKeyTraversalNodeAncestors++
                     }
@@ -686,11 +601,9 @@
                     is ClassOneWithSharedKeyTraversalNode -> {
                         classOneWithSharedKeyTraversalNodeAncestors++
                     }
-
                     is ClassTwoWithSharedKeyTraversalNode -> {
                         classTwoWithSharedKeyTraversalNodeAncestors++
                     }
-
                     is ClassThreeWithOtherKeyTraversalNode -> {
                         classThreeWithOtherKeyTraversalNodeAncestors++
                     }
@@ -725,11 +638,9 @@
                     is ClassOneWithSharedKeyTraversalNode -> {
                         sameClassAncestors++
                     }
-
                     is ClassTwoWithSharedKeyTraversalNode -> {
                         sameKeyDifferentClassAncestors++
                     }
-
                     is ClassThreeWithOtherKeyTraversalNode -> {
                         differentKeyDifferentClassAncestors++
                     }
@@ -761,11 +672,9 @@
                     is ClassOneWithSharedKeyTraversalNode -> {
                         sameClassAncestors++
                     }
-
                     is ClassTwoWithSharedKeyTraversalNode -> {
                         sameKeyDifferentClassAncestors++
                     }
-
                     is ClassThreeWithOtherKeyTraversalNode -> {
                         differentKeyDifferentClassAncestors++
                     }
@@ -797,11 +706,9 @@
                     is ClassOneWithSharedKeyTraversalNode -> {
                         sameClassAncestors++
                     }
-
                     is ClassTwoWithSharedKeyTraversalNode -> {
                         sameKeyDifferentClassAncestors++
                     }
-
                     is ClassThreeWithOtherKeyTraversalNode -> {
                         differentKeyDifferentClassAncestors++
                     }
@@ -832,9 +739,7 @@
             }
         }
 
-        rule.runOnIdle {
-            Truth.assertThat(sameClassChildren).isEqualTo(1)
-        }
+        rule.runOnIdle { Truth.assertThat(sameClassChildren).isEqualTo(1) }
     }
 
     @Test
@@ -852,7 +757,6 @@
                     is ClassOneWithSharedKeyTraversalNode -> {
                         sameClassChildren++
                     }
-
                     is ClassTwoWithSharedKeyTraversalNode -> {
                         sameKeyDifferentClassChildren++
                     }
@@ -885,11 +789,9 @@
                     is ClassOneWithSharedKeyTraversalNode -> {
                         classOneWithSharedKeyTraversalNodeAncestors++
                     }
-
                     is ClassTwoWithSharedKeyTraversalNode -> {
                         classTwoWithSharedKeyTraversalNodeAncestors++
                     }
-
                     is ClassThreeWithOtherKeyTraversalNode -> {
                         classThreeWithOtherKeyTraversalNodeAncestors++
                     }
@@ -924,11 +826,9 @@
                     is ClassOneWithSharedKeyTraversalNode -> {
                         classOneWithSharedKeyTraversalNodeAncestors++
                     }
-
                     is ClassTwoWithSharedKeyTraversalNode -> {
                         classTwoWithSharedKeyTraversalNodeAncestors++
                     }
-
                     is ClassThreeWithOtherKeyTraversalNode -> {
                         classThreeWithOtherKeyTraversalNodeAncestors++
                     }
@@ -958,9 +858,7 @@
             }
         }
 
-        rule.runOnIdle {
-            Truth.assertThat(sameClassNodes).isEqualTo(5)
-        }
+        rule.runOnIdle { Truth.assertThat(sameClassNodes).isEqualTo(5) }
     }
 
     @Test
@@ -974,9 +872,7 @@
             }
         }
 
-        rule.runOnIdle {
-            Truth.assertThat(sameClassNodes).isEqualTo(4)
-        }
+        rule.runOnIdle { Truth.assertThat(sameClassNodes).isEqualTo(4) }
     }
 
     @Test
@@ -997,9 +893,7 @@
             }
         }
 
-        rule.runOnIdle {
-            Truth.assertThat(sameClassNodes).isEqualTo(4)
-        }
+        rule.runOnIdle { Truth.assertThat(sameClassNodes).isEqualTo(4) }
     }
 
     @Test
@@ -1018,11 +912,9 @@
                     is ClassOneWithSharedKeyTraversalNode -> {
                         sameClassNodes++
                     }
-
                     is ClassTwoWithSharedKeyTraversalNode -> {
                         sameKeyDifferentClassNodes++
                     }
-
                     else -> {
                         otherNodes++
                     }
@@ -1055,11 +947,9 @@
                     is ClassOneWithSharedKeyTraversalNode -> {
                         sameClassNodes++
                     }
-
                     is ClassTwoWithSharedKeyTraversalNode -> {
                         sameKeyDifferentClassNodes++
                     }
-
                     else -> {
                         otherNodes++
                     }
@@ -1092,11 +982,9 @@
                     is ClassOneWithSharedKeyTraversalNode -> {
                         sameClassNodes++
                     }
-
                     is ClassTwoWithSharedKeyTraversalNode -> {
                         sameKeyDifferentClassNodes++
                     }
-
                     else -> {
                         otherNodes++
                     }
@@ -1125,22 +1013,21 @@
             parentNode.traverseDescendants(SHARED_TRAVERSAL_NODE_KEY) {
                 totalMatchingNodes++
 
-                val action = when (it) {
-                    is ClassOneWithSharedKeyTraversalNode -> {
-                        sameClassNodes++
-                        TraverseDescendantsAction.SkipSubtreeAndContinueTraversal
+                val action =
+                    when (it) {
+                        is ClassOneWithSharedKeyTraversalNode -> {
+                            sameClassNodes++
+                            TraverseDescendantsAction.SkipSubtreeAndContinueTraversal
+                        }
+                        is ClassTwoWithSharedKeyTraversalNode -> {
+                            sameKeyDifferentClassNodes++
+                            TraverseDescendantsAction.ContinueTraversal
+                        }
+                        else -> {
+                            otherNodes++
+                            TraverseDescendantsAction.ContinueTraversal
+                        }
                     }
-
-                    is ClassTwoWithSharedKeyTraversalNode -> {
-                        sameKeyDifferentClassNodes++
-                        TraverseDescendantsAction.ContinueTraversal
-                    }
-
-                    else -> {
-                        otherNodes++
-                        TraverseDescendantsAction.ContinueTraversal
-                    }
-                }
                 action
             }
         }
@@ -1165,22 +1052,21 @@
             parentNode.traverseDescendants(SHARED_TRAVERSAL_NODE_KEY) {
                 totalMatchingNodes++
 
-                val action = when (it) {
-                    is ClassOneWithSharedKeyTraversalNode -> {
-                        sameClassNodes++
-                        TraverseDescendantsAction.CancelTraversal
+                val action =
+                    when (it) {
+                        is ClassOneWithSharedKeyTraversalNode -> {
+                            sameClassNodes++
+                            TraverseDescendantsAction.CancelTraversal
+                        }
+                        is ClassTwoWithSharedKeyTraversalNode -> {
+                            sameKeyDifferentClassNodes++
+                            TraverseDescendantsAction.ContinueTraversal
+                        }
+                        else -> {
+                            otherNodes++
+                            TraverseDescendantsAction.ContinueTraversal
+                        }
                     }
-
-                    is ClassTwoWithSharedKeyTraversalNode -> {
-                        sameKeyDifferentClassNodes++
-                        TraverseDescendantsAction.ContinueTraversal
-                    }
-
-                    else -> {
-                        otherNodes++
-                        TraverseDescendantsAction.ContinueTraversal
-                    }
-                }
                 action
             }
         }
@@ -1205,22 +1091,21 @@
             parentNode.traverseDescendants(SHARED_TRAVERSAL_NODE_KEY) {
                 totalMatchingNodes++
 
-                val action = when (it) {
-                    is ClassOneWithSharedKeyTraversalNode -> {
-                        sameClassNodes++
-                        TraverseDescendantsAction.ContinueTraversal
+                val action =
+                    when (it) {
+                        is ClassOneWithSharedKeyTraversalNode -> {
+                            sameClassNodes++
+                            TraverseDescendantsAction.ContinueTraversal
+                        }
+                        is ClassTwoWithSharedKeyTraversalNode -> {
+                            sameKeyDifferentClassNodes++
+                            TraverseDescendantsAction.SkipSubtreeAndContinueTraversal
+                        }
+                        else -> {
+                            otherNodes++
+                            TraverseDescendantsAction.ContinueTraversal
+                        }
                     }
-
-                    is ClassTwoWithSharedKeyTraversalNode -> {
-                        sameKeyDifferentClassNodes++
-                        TraverseDescendantsAction.SkipSubtreeAndContinueTraversal
-                    }
-
-                    else -> {
-                        otherNodes++
-                        TraverseDescendantsAction.ContinueTraversal
-                    }
-                }
                 action
             }
         }
@@ -1245,22 +1130,21 @@
             parentNode.traverseDescendants(SHARED_TRAVERSAL_NODE_KEY) {
                 totalMatchingNodes++
 
-                val action = when (it) {
-                    is ClassOneWithSharedKeyTraversalNode -> {
-                        sameClassNodes++
-                        TraverseDescendantsAction.ContinueTraversal
+                val action =
+                    when (it) {
+                        is ClassOneWithSharedKeyTraversalNode -> {
+                            sameClassNodes++
+                            TraverseDescendantsAction.ContinueTraversal
+                        }
+                        is ClassTwoWithSharedKeyTraversalNode -> {
+                            sameKeyDifferentClassNodes++
+                            TraverseDescendantsAction.CancelTraversal
+                        }
+                        else -> {
+                            otherNodes++
+                            TraverseDescendantsAction.ContinueTraversal
+                        }
                     }
-
-                    is ClassTwoWithSharedKeyTraversalNode -> {
-                        sameKeyDifferentClassNodes++
-                        TraverseDescendantsAction.CancelTraversal
-                    }
-
-                    else -> {
-                        otherNodes++
-                        TraverseDescendantsAction.ContinueTraversal
-                    }
-                }
                 action
             }
         }
@@ -1289,11 +1173,9 @@
                     is ClassOneWithSharedKeyTraversalNode -> {
                         classOneWithSharedKeyTraversalNodeAncestors++
                     }
-
                     is ClassTwoWithSharedKeyTraversalNode -> {
                         classTwoWithSharedKeyTraversalNodeAncestors++
                     }
-
                     is ClassThreeWithOtherKeyTraversalNode -> {
                         classThreeWithOtherKeyTraversalNodeAncestors++
                     }
@@ -1328,11 +1210,9 @@
                     is ClassOneWithSharedKeyTraversalNode -> {
                         classOneWithSharedKeyTraversalNodeAncestors++
                     }
-
                     is ClassTwoWithSharedKeyTraversalNode -> {
                         classTwoWithSharedKeyTraversalNodeAncestors++
                     }
-
                     is ClassThreeWithOtherKeyTraversalNode -> {
                         classThreeWithOtherKeyTraversalNodeAncestors++
                     }
@@ -1367,11 +1247,9 @@
                     is ClassOneWithSharedKeyTraversalNode -> {
                         sameClassNodes++
                     }
-
                     is ClassTwoWithSharedKeyTraversalNode -> {
                         sameKeyDifferentClassNodes++
                     }
-
                     is ClassThreeWithOtherKeyTraversalNode -> {
                         differentKeyDifferentClassNodes++
                     }
@@ -1405,11 +1283,9 @@
                     is ClassOneWithSharedKeyTraversalNode -> {
                         sameClassNodes++
                     }
-
                     is ClassTwoWithSharedKeyTraversalNode -> {
                         sameKeyDifferentClassNodes++
                     }
-
                     is ClassThreeWithOtherKeyTraversalNode -> {
                         differentKeyDifferentClassNodes++
                     }
@@ -1435,17 +1311,13 @@
 private fun Modifier.testTraversalNodeClassOneWithSharedKey(
     label: String,
     block: (ClassOneWithSharedKeyTraversalNode.() -> Unit)? = null
-) = this then TestTraversalModifierElementClassOneWithSharedKey(
-    label = label,
-    block = block
-)
+) = this then TestTraversalModifierElementClassOneWithSharedKey(label = label, block = block)
 
 private data class TestTraversalModifierElementClassOneWithSharedKey(
     val label: String,
     val block: (ClassOneWithSharedKeyTraversalNode.() -> Unit)?
 ) : ModifierNodeElement<ClassOneWithSharedKeyTraversalNode>() {
-    override fun create() =
-        ClassOneWithSharedKeyTraversalNode(label = label, block = block)
+    override fun create() = ClassOneWithSharedKeyTraversalNode(label = label, block = block)
 
     override fun update(node: ClassOneWithSharedKeyTraversalNode) {
         node.label = label
@@ -1475,9 +1347,7 @@
     override val traverseKey = SHARED_TRAVERSAL_NODE_KEY
 
     init {
-        block?.let {
-            it()
-        }
+        block?.let { it() }
     }
 
     override fun toString() =
@@ -1488,19 +1358,13 @@
 private fun Modifier.testTraversalNodeClassTwoWithSharedKey(
     label: String,
     block: (ClassTwoWithSharedKeyTraversalNode.() -> Unit)? = null
-) = this then TestTraversalModifierElementClassTwoWithSharedKey(
-    label = label,
-    block = block
-)
+) = this then TestTraversalModifierElementClassTwoWithSharedKey(label = label, block = block)
 
 private data class TestTraversalModifierElementClassTwoWithSharedKey(
     val label: String,
     val block: (ClassTwoWithSharedKeyTraversalNode.() -> Unit)?
 ) : ModifierNodeElement<ClassTwoWithSharedKeyTraversalNode>() {
-    override fun create() = ClassTwoWithSharedKeyTraversalNode(
-        label = label,
-        block = block
-    )
+    override fun create() = ClassTwoWithSharedKeyTraversalNode(label = label, block = block)
 
     override fun update(node: ClassTwoWithSharedKeyTraversalNode) {
         node.label = label
@@ -1517,15 +1381,12 @@
 private class ClassTwoWithSharedKeyTraversalNode(
     var label: String,
     var block: (ClassTwoWithSharedKeyTraversalNode.() -> Unit)?
-) :
-    Modifier.Node(), TraversableNode {
+) : Modifier.Node(), TraversableNode {
 
     override val traverseKey = SHARED_TRAVERSAL_NODE_KEY
 
     init {
-        block?.let {
-            it()
-        }
+        block?.let { it() }
     }
 
     override fun toString() =
@@ -1536,18 +1397,14 @@
 private fun Modifier.testTraversalNodeClassThreeWithOtherKey(
     label: String,
     block: (ClassThreeWithOtherKeyTraversalNode.() -> Unit)? = null
-) = this then TestTraversalModifierElementClassThreeWithOtherKey(
-    label = label,
-    block
-)
+) = this then TestTraversalModifierElementClassThreeWithOtherKey(label = label, block)
 
 private data class TestTraversalModifierElementClassThreeWithOtherKey(
     val label: String,
     val block: (ClassThreeWithOtherKeyTraversalNode.() -> Unit)?
 ) : ModifierNodeElement<ClassThreeWithOtherKeyTraversalNode>() {
 
-    override fun create() =
-        ClassThreeWithOtherKeyTraversalNode(label = label, block = block)
+    override fun create() = ClassThreeWithOtherKeyTraversalNode(label = label, block = block)
 
     override fun update(node: ClassThreeWithOtherKeyTraversalNode) {
         node.label = label
@@ -1568,9 +1425,7 @@
     override val traverseKey = OTHER_TRAVERSAL_NODE_KEY
 
     init {
-        block?.let {
-            it()
-        }
+        block?.let { it() }
     }
 
     override fun toString() =
diff --git a/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/owners/LifecycleOwnerInAppCompatActivityTest.kt b/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/owners/LifecycleOwnerInAppCompatActivityTest.kt
index 8ea1a4c..70f76d4 100644
--- a/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/owners/LifecycleOwnerInAppCompatActivityTest.kt
+++ b/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/owners/LifecycleOwnerInAppCompatActivityTest.kt
@@ -37,9 +37,8 @@
 class LifecycleOwnerInAppCompatActivityTest {
     @Suppress("DEPRECATION")
     @get:Rule
-    val activityTestRule = androidx.test.rule.ActivityTestRule<AppCompatActivity>(
-        AppCompatActivity::class.java
-    )
+    val activityTestRule =
+        androidx.test.rule.ActivityTestRule<AppCompatActivity>(AppCompatActivity::class.java)
     private lateinit var activity: AppCompatActivity
 
     @Before
diff --git a/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/owners/LifecycleOwnerInComponentActivityTest.kt b/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/owners/LifecycleOwnerInComponentActivityTest.kt
index 73ed014..07f6aeb 100644
--- a/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/owners/LifecycleOwnerInComponentActivityTest.kt
+++ b/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/owners/LifecycleOwnerInComponentActivityTest.kt
@@ -37,9 +37,8 @@
 class LifecycleOwnerInComponentActivityTest {
     @Suppress("DEPRECATION")
     @get:Rule
-    val activityTestRule = androidx.test.rule.ActivityTestRule<ComponentActivity>(
-        ComponentActivity::class.java
-    )
+    val activityTestRule =
+        androidx.test.rule.ActivityTestRule<ComponentActivity>(ComponentActivity::class.java)
     private lateinit var activity: ComponentActivity
 
     @Before
diff --git a/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/owners/LifecycleOwnerInFragmentTest.kt b/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/owners/LifecycleOwnerInFragmentTest.kt
index cae14f2..e2b57c7 100644
--- a/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/owners/LifecycleOwnerInFragmentTest.kt
+++ b/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/owners/LifecycleOwnerInFragmentTest.kt
@@ -43,9 +43,8 @@
 class LifecycleOwnerInFragment {
     @Suppress("DEPRECATION")
     @get:Rule
-    val activityTestRule = androidx.test.rule.ActivityTestRule<FragmentActivity>(
-        FragmentActivity::class.java
-    )
+    val activityTestRule =
+        androidx.test.rule.ActivityTestRule<FragmentActivity>(FragmentActivity::class.java)
     private lateinit var activity: FragmentActivity
 
     @Before
@@ -61,9 +60,7 @@
             val view = FragmentContainerView(activity)
             view.id = 100
             activity.setContentView(view)
-            activity.supportFragmentManager.beginTransaction()
-                .replace(100, fragment)
-                .commit()
+            activity.supportFragmentManager.beginTransaction().replace(100, fragment).commit()
         }
 
         assertTrue(fragment.latch.await(1, TimeUnit.SECONDS))
@@ -78,9 +75,7 @@
             val view = FragmentContainerView(activity)
             view.id = 100
             activity.setContentView(view)
-            activity.supportFragmentManager.beginTransaction()
-                .replace(100, fragment)
-                .commit()
+            activity.supportFragmentManager.beginTransaction().replace(100, fragment).commit()
         }
 
         assertTrue(fragment.latch.await(1, TimeUnit.SECONDS))
@@ -109,9 +104,7 @@
         activityTestRule.runOnUiThread {
             frameLayout.removeView(composeView)
             owner = null
-            activity.supportFragmentManager.beginTransaction()
-                .replace(100, fragment2)
-                .commit()
+            activity.supportFragmentManager.beginTransaction().replace(100, fragment2).commit()
         }
         assertTrue(fragment2.latch.await(1, TimeUnit.SECONDS))
 
@@ -135,12 +128,13 @@
         inflater: LayoutInflater,
         container: ViewGroup?,
         savedInstanceState: Bundle?
-    ) = ComposeView(requireContext()).apply {
-        setContent {
-            owner = LocalLifecycleOwner.current
-            latch.countDown()
+    ) =
+        ComposeView(requireContext()).apply {
+            setContent {
+                owner = LocalLifecycleOwner.current
+                latch.countDown()
+            }
         }
-    }
 }
 
 class TestFragmentFrameLayout : Fragment() {
diff --git a/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/owners/SavedStateRegistryOwnerInAppCompatActivityTest.kt b/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/owners/SavedStateRegistryOwnerInAppCompatActivityTest.kt
index f548965..650aec8 100644
--- a/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/owners/SavedStateRegistryOwnerInAppCompatActivityTest.kt
+++ b/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/owners/SavedStateRegistryOwnerInAppCompatActivityTest.kt
@@ -37,9 +37,7 @@
 class SavedStateRegistryOwnerInAppCompatActivityTest {
     @Suppress("DEPRECATION")
     @get:Rule
-    val activityTestRule = androidx.test.rule.ActivityTestRule(
-        AppCompatActivity::class.java
-    )
+    val activityTestRule = androidx.test.rule.ActivityTestRule(AppCompatActivity::class.java)
     private lateinit var activity: AppCompatActivity
 
     @Before
diff --git a/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/owners/SavedStateRegistryOwnerInComponentActivityTest.kt b/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/owners/SavedStateRegistryOwnerInComponentActivityTest.kt
index 648ac1d..037fc55 100644
--- a/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/owners/SavedStateRegistryOwnerInComponentActivityTest.kt
+++ b/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/owners/SavedStateRegistryOwnerInComponentActivityTest.kt
@@ -37,9 +37,7 @@
 class SavedStateRegistryOwnerInComponentActivityTest {
     @Suppress("DEPRECATION")
     @get:Rule
-    val activityTestRule = androidx.test.rule.ActivityTestRule(
-        ComponentActivity::class.java
-    )
+    val activityTestRule = androidx.test.rule.ActivityTestRule(ComponentActivity::class.java)
     private lateinit var activity: ComponentActivity
 
     @Before
diff --git a/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/owners/SavedStateRegistryOwnerInFragmentTest.kt b/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/owners/SavedStateRegistryOwnerInFragmentTest.kt
index 9f5f371..276bace 100644
--- a/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/owners/SavedStateRegistryOwnerInFragmentTest.kt
+++ b/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/owners/SavedStateRegistryOwnerInFragmentTest.kt
@@ -42,9 +42,7 @@
 class SavedStateRegistryOwnerInFragmentTest {
     @Suppress("DEPRECATION")
     @get:Rule
-    val activityTestRule = androidx.test.rule.ActivityTestRule(
-        FragmentActivity::class.java
-    )
+    val activityTestRule = androidx.test.rule.ActivityTestRule(FragmentActivity::class.java)
     private lateinit var activity: FragmentActivity
 
     @Before
@@ -60,9 +58,7 @@
             val view = FragmentContainerView(activity)
             view.id = 100
             activity.setContentView(view)
-            activity.supportFragmentManager.beginTransaction()
-                .replace(100, fragment)
-                .commit()
+            activity.supportFragmentManager.beginTransaction().replace(100, fragment).commit()
         }
         assertTrue(fragment.latch.await(1, TimeUnit.SECONDS))
         assertEquals(fragment.requireView().findViewTreeSavedStateRegistryOwner(), fragment.owner)
@@ -77,11 +73,12 @@
             inflater: LayoutInflater,
             container: ViewGroup?,
             savedInstanceState: Bundle?
-        ) = ComposeView(requireContext()).apply {
-            setContent {
-                owner = LocalSavedStateRegistryOwner.current
-                latch.countDown()
+        ) =
+            ComposeView(requireContext()).apply {
+                setContent {
+                    owner = LocalSavedStateRegistryOwner.current
+                    latch.countDown()
+                }
             }
-        }
     }
 }
diff --git a/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/platform/AndroidClipboardManagerTest.kt b/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/platform/AndroidClipboardManagerTest.kt
index 6934005..e6ab93e9 100644
--- a/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/platform/AndroidClipboardManagerTest.kt
+++ b/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/platform/AndroidClipboardManagerTest.kt
@@ -55,9 +55,7 @@
     @Test
     fun annotatedString_singleSpanStyle_convertToCharSequenceAndRecover() {
         val annotatedString = buildAnnotatedString {
-            withStyle(SpanStyle(color = Color.Yellow)) {
-                append("Hello ")
-            }
+            withStyle(SpanStyle(color = Color.Yellow)) { append("Hello ") }
             append("World")
         }
 
@@ -67,13 +65,9 @@
     @Test
     fun annotatedString_multipleSpanStyle_convertToCharSequenceAndRecover() {
         val annotatedString = buildAnnotatedString {
-            withStyle(SpanStyle(color = Color.Yellow)) {
-                append("Hello")
-            }
+            withStyle(SpanStyle(color = Color.Yellow)) { append("Hello") }
             append("World")
-            withStyle(SpanStyle(letterSpacing = 0.4.sp)) {
-                append("Hello")
-            }
+            withStyle(SpanStyle(letterSpacing = 0.4.sp)) { append("Hello") }
         }
 
         assertEncodeAndDecode(annotatedString)
@@ -83,9 +77,7 @@
     fun annotatedString_nestedSpanStyle_convertToCharSequenceAndRecover() {
         val annotatedString = buildAnnotatedString {
             withStyle(SpanStyle(letterSpacing = 0.4.sp)) {
-                withStyle(SpanStyle(color = Color.Yellow)) {
-                    append("Hello")
-                }
+                withStyle(SpanStyle(color = Color.Yellow)) { append("Hello") }
                 append("World")
             }
             append("Hello")
@@ -150,12 +142,8 @@
 
     @Test
     fun spanStyle_withTextGeometricTransform_encodeAndDecode() {
-        val spanStyle = SpanStyle(
-            textGeometricTransform = TextGeometricTransform(
-                scaleX = 1.5f,
-                skewX = 0.3f
-            )
-        )
+        val spanStyle =
+            SpanStyle(textGeometricTransform = TextGeometricTransform(scaleX = 1.5f, skewX = 0.3f))
         assertEncodeAndDecode(spanStyle)
     }
 
@@ -173,38 +161,27 @@
 
     @Test
     fun spanStyle_withShadow_encodeAndDecode() {
-        val spanStyle = SpanStyle(
-            shadow = Shadow(
-                color = Color.Cyan,
-                offset = Offset(1f, 2f),
-                blurRadius = 3f
-            )
-        )
+        val spanStyle =
+            SpanStyle(shadow = Shadow(color = Color.Cyan, offset = Offset(1f, 2f), blurRadius = 3f))
         assertEncodeAndDecode(spanStyle)
     }
 
     @Test
     fun spanStyle_withEverything_encodeAndDecode() {
-        val spanStyle = SpanStyle(
-            color = Color.Cyan,
-            fontSize = 16.sp,
-            fontWeight = FontWeight.ExtraLight,
-            fontSynthesis = FontSynthesis.Weight,
-            fontFeatureSettings = "smcp",
-            letterSpacing = 0.3.sp,
-            baselineShift = BaselineShift.Superscript,
-            textGeometricTransform = TextGeometricTransform(
-                scaleX = 1.1f,
-                skewX = 0.1f
-            ),
-            background = Color.Yellow,
-            textDecoration = TextDecoration.LineThrough,
-            shadow = Shadow(
+        val spanStyle =
+            SpanStyle(
                 color = Color.Cyan,
-                offset = Offset(1f, 2f),
-                blurRadius = 3f
+                fontSize = 16.sp,
+                fontWeight = FontWeight.ExtraLight,
+                fontSynthesis = FontSynthesis.Weight,
+                fontFeatureSettings = "smcp",
+                letterSpacing = 0.3.sp,
+                baselineShift = BaselineShift.Superscript,
+                textGeometricTransform = TextGeometricTransform(scaleX = 1.1f, skewX = 0.1f),
+                background = Color.Yellow,
+                textDecoration = TextDecoration.LineThrough,
+                shadow = Shadow(color = Color.Cyan, offset = Offset(1f, 2f), blurRadius = 3f)
             )
-        )
         assertEncodeAndDecode(spanStyle)
     }
 
@@ -303,8 +280,7 @@
         subject.setClip(null)
 
         val argumentCaptor = argumentCaptor<ClipData>()
-        verify(clipboardManager, times(1))
-            .setPrimaryClip(argumentCaptor.capture())
+        verify(clipboardManager, times(1)).setPrimaryClip(argumentCaptor.capture())
 
         assertThat(argumentCaptor.lastValue.itemCount).isEqualTo(1)
         assertThat(argumentCaptor.lastValue.getItemAt(0).uri).isEqualTo(null)
@@ -316,11 +292,12 @@
     @Test
     fun firstUriOrNull_returnsFirstItem_ifNotNull() {
         val uri = Uri.parse("http://example.com")
-        val clipData = mock<ClipData> {
-            on { itemCount } doReturn 2
-            on { getItemAt(0) } doReturn ClipData.Item(uri)
-            on { getItemAt(1) } doReturn ClipData.Item("Hello")
-        }
+        val clipData =
+            mock<ClipData> {
+                on { itemCount } doReturn 2
+                on { getItemAt(0) } doReturn ClipData.Item(uri)
+                on { getItemAt(1) } doReturn ClipData.Item("Hello")
+            }
 
         assertThat(clipData.toClipEntry().firstUriOrNull()).isEqualTo(uri)
     }
@@ -329,11 +306,12 @@
     @Test
     fun firstUriOrNull_returnsSecondItem_ifFirstIsNull() {
         val uri = Uri.parse("http://example.com")
-        val clipData = mock<ClipData> {
-            on { itemCount } doReturn 2
-            on { getItemAt(0) } doReturn ClipData.Item("Hello")
-            on { getItemAt(1) } doReturn ClipData.Item(uri)
-        }
+        val clipData =
+            mock<ClipData> {
+                on { itemCount } doReturn 2
+                on { getItemAt(0) } doReturn ClipData.Item("Hello")
+                on { getItemAt(1) } doReturn ClipData.Item(uri)
+            }
 
         assertThat(clipData.toClipEntry().firstUriOrNull()).isEqualTo(uri)
     }
@@ -341,11 +319,12 @@
     @OptIn(ExperimentalComposeUiApi::class)
     @Test
     fun firstUriOrNull_returnsNull_ifNoUri() {
-        val clipData = mock<ClipData> {
-            on { itemCount } doReturn 2
-            on { getItemAt(0) } doReturn ClipData.Item("Hello")
-            on { getItemAt(1) } doReturn ClipData.Item("World")
-        }
+        val clipData =
+            mock<ClipData> {
+                on { itemCount } doReturn 2
+                on { getItemAt(0) } doReturn ClipData.Item("Hello")
+                on { getItemAt(1) } doReturn ClipData.Item("World")
+            }
 
         assertThat(clipData.toClipEntry().firstUriOrNull()).isNull()
     }
diff --git a/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/platform/AndroidComposeViewScreenCoordinatesTest.kt b/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/platform/AndroidComposeViewScreenCoordinatesTest.kt
index 11ff2a4..4708c4b 100644
--- a/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/platform/AndroidComposeViewScreenCoordinatesTest.kt
+++ b/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/platform/AndroidComposeViewScreenCoordinatesTest.kt
@@ -57,8 +57,7 @@
 @RunWith(AndroidJUnit4::class)
 class AndroidComposeViewScreenCoordinatesTest {
 
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
     private lateinit var windowManager: WindowManager
     private lateinit var view: TestView
@@ -73,21 +72,21 @@
                     hostView.context.getSystemService(Context.WINDOW_SERVICE) as WindowManager
                 view = TestView(hostView)
                 @Suppress("DEPRECATION")
-                val layoutParams = LayoutParams().also {
-                    it.x = 0
-                    it.y = 0
-                    it.width = LayoutParams.WRAP_CONTENT
-                    it.height = LayoutParams.WRAP_CONTENT
-                    it.type = LayoutParams.TYPE_APPLICATION
-                    // Fullscreen to avoid accounting for system decorations.
-                    it.flags = LayoutParams.FLAG_LAYOUT_NO_LIMITS or LayoutParams.FLAG_FULLSCREEN
-                    it.gravity = Gravity.LEFT or Gravity.TOP
-                }
+                val layoutParams =
+                    LayoutParams().also {
+                        it.x = 0
+                        it.y = 0
+                        it.width = LayoutParams.WRAP_CONTENT
+                        it.height = LayoutParams.WRAP_CONTENT
+                        it.type = LayoutParams.TYPE_APPLICATION
+                        // Fullscreen to avoid accounting for system decorations.
+                        it.flags =
+                            LayoutParams.FLAG_LAYOUT_NO_LIMITS or LayoutParams.FLAG_FULLSCREEN
+                        it.gravity = Gravity.LEFT or Gravity.TOP
+                    }
                 windowManager.addView(view, layoutParams)
 
-                onDispose {
-                    windowManager.removeView(view)
-                }
+                onDispose { windowManager.removeView(view) }
             }
         }
     }
@@ -288,8 +287,7 @@
         @Composable
         override fun Content() {
             Box(
-                Modifier
-                    .background(Color.Blue)
+                Modifier.background(Color.Blue)
                     .layout { measurable, _ ->
                         val placeable = measurable.measure(Constraints.fixed(10, 10))
                         layout(
diff --git a/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/platform/AndroidComposeViewsInRecyclerViewTest.kt b/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/platform/AndroidComposeViewsInRecyclerViewTest.kt
index 179d68b..f48a5fe 100644
--- a/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/platform/AndroidComposeViewsInRecyclerViewTest.kt
+++ b/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/platform/AndroidComposeViewsInRecyclerViewTest.kt
@@ -44,25 +44,21 @@
 import org.junit.Test
 import org.junit.runner.RunWith
 
-/**
- * Used to check the size of the RecycledViewPool
- */
+/** Used to check the size of the RecycledViewPool */
 private const val MaxItemsInAnyTest = 100
 
 @LargeTest
 @RunWith(AndroidJUnit4::class)
 /**
- * Note: this test's structure largely parallels PoolingContainerRecyclerViewTest
- * (though there are notable implementation differences)
+ * Note: this test's structure largely parallels PoolingContainerRecyclerViewTest (though there are
+ * notable implementation differences)
  *
  * Consider if new tests added here should also be added there.
  */
 class AndroidComposeViewsRecyclerViewTest {
-    @get:Rule
-    val animationRule = AnimationDurationScaleRule.create()
+    @get:Rule val animationRule = AnimationDurationScaleRule.create()
 
-    @get:Rule
-    var activityRule = ActivityScenarioRule(ComponentActivity::class.java)
+    @get:Rule var activityRule = ActivityScenarioRule(ComponentActivity::class.java)
 
     lateinit var recyclerView: RecyclerView
     lateinit var container: FrameLayout
@@ -73,10 +69,11 @@
     fun setup() {
         activityRule.scenario.onActivity { activity ->
             container = FrameLayout(activity)
-            container.layoutParams = ViewGroup.LayoutParams(
-                ViewGroup.LayoutParams.MATCH_PARENT,
-                ViewGroup.LayoutParams.MATCH_PARENT
-            )
+            container.layoutParams =
+                ViewGroup.LayoutParams(
+                    ViewGroup.LayoutParams.MATCH_PARENT,
+                    ViewGroup.LayoutParams.MATCH_PARENT
+                )
             activity.setContentView(container)
             recyclerView = RecyclerView(activity)
             setUpRecyclerView(recyclerView)
@@ -89,11 +86,8 @@
             // Animators cause items to stick around and prevent clean rebinds, which we don't want,
             // since it makes testing this less straightforward.
             rv.itemAnimator = null
-            rv.layoutManager =
-                LinearLayoutManager(activity, RecyclerView.VERTICAL, false)
-            rv.layoutParams = FrameLayout.LayoutParams(
-                ViewGroup.LayoutParams.MATCH_PARENT, 100
-            )
+            rv.layoutManager = LinearLayoutManager(activity, RecyclerView.VERTICAL, false)
+            rv.layoutParams = FrameLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, 100)
         }
     }
 
@@ -104,7 +98,7 @@
             adapter = PoolingContainerTestAdapter(activity, 100)
             recyclerView.adapter = adapter
         }
-        instrumentation.runOnMainSync { }
+        instrumentation.runOnMainSync {}
 
         // All items created and bound
         assertThat(adapter.creations).isEqualTo(100)
@@ -112,7 +106,7 @@
         assertThat(adapter.binds).isEqualTo(100)
 
         instrumentation.runOnMainSync { adapter.notifyItemRangeChanged(0, 100) }
-        instrumentation.runOnMainSync { }
+        instrumentation.runOnMainSync {}
 
         // All items changed: no new creations, but all items rebound
         assertThat(adapter.creations).isEqualTo(100)
@@ -129,7 +123,7 @@
             recyclerView.adapter = adapter
         }
 
-        instrumentation.runOnMainSync { }
+        instrumentation.runOnMainSync {}
         assertThat(adapter.creations).isEqualTo(100)
         assertThat(adapter.compositions).isEqualTo(100)
         assertThat(adapter.releases).isEqualTo(0)
@@ -146,7 +140,7 @@
             adapter = PoolingContainerTestAdapter(activity, 100)
             recyclerView.adapter = adapter
         }
-        instrumentation.runOnMainSync { }
+        instrumentation.runOnMainSync {}
 
         // Initially added: all items created, no disposals
         assertThat(adapter.creations).isEqualTo(100)
@@ -182,14 +176,12 @@
             }
             recyclerView.adapter = adapter
         }
-        instrumentation.runOnMainSync { }
+        instrumentation.runOnMainSync {}
         assertThat(recyclerView.height).isEqualTo(100)
         assertThat(adapter.creations).isEqualTo(50)
 
         // Scroll to put some views into the shared pool
-        instrumentation.runOnMainSync {
-            recyclerView.smoothScrollBy(0, 100)
-        }
+        instrumentation.runOnMainSync { recyclerView.smoothScrollBy(0, 100) }
 
         recyclerView.awaitScrollIdle()
 
@@ -219,12 +211,10 @@
             recyclerView.adapter = adapter
         }
 
-        instrumentation.runOnMainSync { }
+        instrumentation.runOnMainSync {}
 
         // Scroll to put some views into the shared pool
-        instrumentation.runOnMainSync {
-            recyclerView.smoothScrollBy(0, 100)
-        }
+        instrumentation.runOnMainSync { recyclerView.smoothScrollBy(0, 100) }
 
         recyclerView.awaitScrollIdle()
 
@@ -244,23 +234,17 @@
     fun setAdapter_allDisposed() {
         // Replacing the adapter when it is the only adapter attached to the pool means that
         // the pool is cleared, so everything should be disposed.
-        doSetOrSwapTest(expectedDisposalsAfterBlock = 100) {
-            recyclerView.adapter = it
-        }
+        doSetOrSwapTest(expectedDisposalsAfterBlock = 100) { recyclerView.adapter = it }
     }
 
     @Test
     fun swapAdapter_noDisposals() {
-        doSetOrSwapTest(expectedDisposalsAfterBlock = 0) {
-            recyclerView.swapAdapter(it, false)
-        }
+        doSetOrSwapTest(expectedDisposalsAfterBlock = 0) { recyclerView.swapAdapter(it, false) }
     }
 
     @Test
     fun setAdapterToNull_allDisposed() {
-        doSetOrSwapTest(expectedDisposalsAfterBlock = 100) {
-            recyclerView.adapter = null
-        }
+        doSetOrSwapTest(expectedDisposalsAfterBlock = 100) { recyclerView.adapter = null }
     }
 
     private fun doSetOrSwapTest(
@@ -278,12 +262,10 @@
             }
             recyclerView.adapter = adapter
         }
-        instrumentation.runOnMainSync { }
+        instrumentation.runOnMainSync {}
 
         // Scroll to put some views into the shared pool
-        withContext(Dispatchers.Main) {
-            recyclerView.smoothScrollBy(0, 100)
-        }
+        withContext(Dispatchers.Main) { recyclerView.smoothScrollBy(0, 100) }
         recyclerView.awaitScrollIdle()
 
         assertThat(adapter.creations).isEqualTo(100)
@@ -320,7 +302,7 @@
             }
         }
 
-        instrumentation.runOnMainSync { }
+        instrumentation.runOnMainSync {}
 
         // All items created and bound
         assertThat(adapter.creations).isEqualTo(100)
@@ -332,7 +314,7 @@
             adapter.notifyItemRangeRemoved(0, 100)
             adapter.notifyItemRangeInserted(0, 100)
         }
-        instrumentation.runOnMainSync { }
+        instrumentation.runOnMainSync {}
 
         assertThat(adapter.creations).isEqualTo(200)
         assertThat(adapter.compositions).isEqualTo(200)
@@ -344,104 +326,108 @@
     }
 
     @Test
-    fun sharedViewPool() = runBlocking(Dispatchers.Main) {
-        val itemViewCacheSize = 2
-        container.removeAllViews()
-        val lp1 = LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, 0, 1f)
-        val lp2 = LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, 0, 1f)
-        val rv1: RecyclerView = recyclerView.also { it.layoutParams = lp1 }
-        lateinit var rv2: RecyclerView
-        lateinit var testContainer: LinearLayout
-        val pool = RecyclerView.RecycledViewPool()
-        lateinit var adapter1: PoolingContainerTestAdapter
-        lateinit var adapter2: PoolingContainerTestAdapter
-        activityRule.scenario.onActivity { activity ->
-            adapter1 = PoolingContainerTestAdapter(activity, 100, 10)
-            adapter2 = PoolingContainerTestAdapter(activity, 100, 10)
+    fun sharedViewPool() =
+        runBlocking(Dispatchers.Main) {
+            val itemViewCacheSize = 2
+            container.removeAllViews()
+            val lp1 = LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, 0, 1f)
+            val lp2 = LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, 0, 1f)
+            val rv1: RecyclerView = recyclerView.also { it.layoutParams = lp1 }
+            lateinit var rv2: RecyclerView
+            lateinit var testContainer: LinearLayout
+            val pool = RecyclerView.RecycledViewPool()
+            lateinit var adapter1: PoolingContainerTestAdapter
+            lateinit var adapter2: PoolingContainerTestAdapter
+            activityRule.scenario.onActivity { activity ->
+                adapter1 = PoolingContainerTestAdapter(activity, 100, 10)
+                adapter2 = PoolingContainerTestAdapter(activity, 100, 10)
 
-            rv2 = RecyclerView(activity).also { setUpRecyclerView(it); it.layoutParams = lp2 }
-            testContainer = LinearLayout(activity).also {
-                it.layoutParams = FrameLayout.LayoutParams(
-                    ViewGroup.LayoutParams.MATCH_PARENT,
-                    200
-                )
-                it.orientation = LinearLayout.VERTICAL
+                rv2 =
+                    RecyclerView(activity).also {
+                        setUpRecyclerView(it)
+                        it.layoutParams = lp2
+                    }
+                testContainer =
+                    LinearLayout(activity).also {
+                        it.layoutParams =
+                            FrameLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, 200)
+                        it.orientation = LinearLayout.VERTICAL
+                    }
+                rv1.setItemViewCacheSize(itemViewCacheSize)
+                rv2.setItemViewCacheSize(itemViewCacheSize)
+                rv1.adapter = adapter1
+                rv2.adapter = adapter2
+                testContainer.addView(rv1)
+                testContainer.addView(rv2)
+                container.addView(testContainer)
+                for (i in 0..9) {
+                    pool.setMaxRecycledViews(i, 10)
+                }
+                rv1.setRecycledViewPool(pool)
+                rv2.setRecycledViewPool(pool)
             }
-            rv1.setItemViewCacheSize(itemViewCacheSize)
-            rv2.setItemViewCacheSize(itemViewCacheSize)
-            rv1.adapter = adapter1
-            rv2.adapter = adapter2
-            testContainer.addView(rv1)
-            testContainer.addView(rv2)
-            container.addView(testContainer)
-            for (i in 0..9) {
-                pool.setMaxRecycledViews(i, 10)
-            }
-            rv1.setRecycledViewPool(pool)
-            rv2.setRecycledViewPool(pool)
+
+            awaitFrame()
+            awaitFrame()
+
+            assertThat(adapter1.creations).isEqualTo(10)
+            assertThat(adapter1.compositions).isEqualTo(10)
+
+            // Scroll to put some views into the shared pool
+            rv1.scrollBy(0, 100)
+
+            // The RV keeps a couple items in its view cache before returning them to the pool
+            val expectedRecycledItems = 10 - itemViewCacheSize
+            assertThat(pool.getRecycledViewCount(0)).isEqualTo(expectedRecycledItems)
+
+            // Nothing should have been disposed yet, everything should have gone to the pool
+            assertThat(adapter1.releases + adapter2.releases).isEqualTo(0)
+
+            val adapter1Creations = adapter1.creations
+            // There were 10, we scrolled 10 more into view, plus maybe prefetching
+            assertThat(adapter1Creations).isAtLeast(20)
+            val adapter1Compositions = adapter1.compositions
+            // Currently, prefetched views don't end up being composed, but that could change
+            assertThat(adapter1Compositions).isAtLeast(20)
+
+            // Remove the first RecyclerView
+            testContainer.removeView(rv1)
+            // get the relayout
+            awaitFrame()
+            awaitFrame()
+
+            // After the first RecyclerView is removed, we expect everything it created to be
+            // disposed,
+            // *except* for what's in the shared pool
+            assertThat(adapter1.creations).isEqualTo(adapter1Creations) // just checking
+            assertThat(adapter1Compositions).isEqualTo(adapter1.compositions) // just checking
+            assertThat(pool.size).isEqualTo(expectedRecycledItems)
+            // We need to check compositions, not creations, because if it's not composed, it won't
+            // be
+            // disposed.
+            assertThat(adapter1.releases).isEqualTo(adapter1.compositions - expectedRecycledItems)
+            assertThat(adapter2.creations).isEqualTo(20) // it's twice as tall with rv1 gone
+            assertThat(adapter2.compositions).isEqualTo(20) // it's twice as tall with rv1 gone
+            assertThat(adapter2.releases).isEqualTo(0) // it hasn't scrolled
+
+            testContainer.removeView(rv2)
+            awaitFrame()
+
+            assertThat(adapter1.creations).isEqualTo(adapter1Creations) // just to be really sure...
+            // double-check that nothing weird happened
+            assertThat(adapter1.compositions).isEqualTo(20)
+            // at this point they're all off
+            assertThat(adapter1.releases).isEqualTo(adapter1.compositions)
+            assertThat(adapter2.creations).isEqualTo(20) // again, just checking
+            assertThat(adapter2.compositions).isEqualTo(20) // again, just checking
+            assertThat(adapter2.releases).isEqualTo(20) // all of these should be gone too
         }
 
-        awaitFrame()
-        awaitFrame()
-
-        assertThat(adapter1.creations).isEqualTo(10)
-        assertThat(adapter1.compositions).isEqualTo(10)
-
-        // Scroll to put some views into the shared pool
-        rv1.scrollBy(0, 100)
-
-        // The RV keeps a couple items in its view cache before returning them to the pool
-        val expectedRecycledItems = 10 - itemViewCacheSize
-        assertThat(pool.getRecycledViewCount(0)).isEqualTo(expectedRecycledItems)
-
-        // Nothing should have been disposed yet, everything should have gone to the pool
-        assertThat(adapter1.releases + adapter2.releases).isEqualTo(0)
-
-        val adapter1Creations = adapter1.creations
-        // There were 10, we scrolled 10 more into view, plus maybe prefetching
-        assertThat(adapter1Creations).isAtLeast(20)
-        val adapter1Compositions = adapter1.compositions
-        // Currently, prefetched views don't end up being composed, but that could change
-        assertThat(adapter1Compositions).isAtLeast(20)
-
-        // Remove the first RecyclerView
-        testContainer.removeView(rv1)
-        // get the relayout
-        awaitFrame()
-        awaitFrame()
-
-        // After the first RecyclerView is removed, we expect everything it created to be disposed,
-        // *except* for what's in the shared pool
-        assertThat(adapter1.creations).isEqualTo(adapter1Creations) // just checking
-        assertThat(adapter1Compositions).isEqualTo(adapter1.compositions) // just checking
-        assertThat(pool.size).isEqualTo(expectedRecycledItems)
-        // We need to check compositions, not creations, because if it's not composed, it won't be
-        // disposed.
-        assertThat(adapter1.releases).isEqualTo(adapter1.compositions - expectedRecycledItems)
-        assertThat(adapter2.creations).isEqualTo(20) // it's twice as tall with rv1 gone
-        assertThat(adapter2.compositions).isEqualTo(20) // it's twice as tall with rv1 gone
-        assertThat(adapter2.releases).isEqualTo(0) // it hasn't scrolled
-
-        testContainer.removeView(rv2)
-        awaitFrame()
-
-        assertThat(adapter1.creations).isEqualTo(adapter1Creations) // just to be really sure...
-        // double-check that nothing weird happened
-        assertThat(adapter1.compositions).isEqualTo(20)
-        // at this point they're all off
-        assertThat(adapter1.releases).isEqualTo(adapter1.compositions)
-        assertThat(adapter2.creations).isEqualTo(20) // again, just checking
-        assertThat(adapter2.compositions).isEqualTo(20) // again, just checking
-        assertThat(adapter2.releases).isEqualTo(20) // all of these should be gone too
-    }
-
     @Test
     fun animationTest() = runBlocking {
         animationRule.setAnimationDurationScale(1f)
 
-        withContext(Dispatchers.Main) {
-            recyclerView.itemAnimator = DefaultItemAnimator()
-        }
+        withContext(Dispatchers.Main) { recyclerView.itemAnimator = DefaultItemAnimator() }
 
         lateinit var adapter: PoolingContainerTestAdapter
         activityRule.scenario.onActivity { activity ->
@@ -528,9 +514,7 @@
     override fun Content() {
         DisposableEffect(true) {
             adapter.compositions++
-            onDispose {
-                adapter.releases++
-            }
+            onDispose { adapter.releases++ }
         }
     }
 }
@@ -539,13 +523,14 @@
     val rv = this
     withContext(Dispatchers.Main) {
         suspendCancellableCoroutine<Unit> { continuation ->
-            val listener = object : RecyclerView.OnScrollListener() {
-                override fun onScrollStateChanged(recyclerView: RecyclerView, newState: Int) {
-                    if (newState == RecyclerView.SCROLL_STATE_IDLE) {
-                        continuation.resume(Unit)
+            val listener =
+                object : RecyclerView.OnScrollListener() {
+                    override fun onScrollStateChanged(recyclerView: RecyclerView, newState: Int) {
+                        if (newState == RecyclerView.SCROLL_STATE_IDLE) {
+                            continuation.resume(Unit)
+                        }
                     }
                 }
-            }
 
             rv.addOnScrollListener(listener)
 
@@ -562,10 +547,12 @@
     val rv = this
     withContext(Dispatchers.Main) {
         suspendCancellableCoroutine<Unit> { continuation ->
-            val animator = rv.itemAnimator ?: throw IllegalStateException(
-                "awaitItemAnimationsComplete() was called on a RecyclerView with no ItemAnimator." +
-                    " This may have been unintended."
-            )
+            val animator =
+                rv.itemAnimator
+                    ?: throw IllegalStateException(
+                        "awaitItemAnimationsComplete() was called on a RecyclerView with no ItemAnimator." +
+                            " This may have been unintended."
+                    )
             animator.isRunning { continuation.resume(Unit) }
         }
     }
diff --git a/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/platform/AndroidCompositionLocalTest.kt b/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/platform/AndroidCompositionLocalTest.kt
index fc5fdde..2dfbefd 100644
--- a/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/platform/AndroidCompositionLocalTest.kt
+++ b/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/platform/AndroidCompositionLocalTest.kt
@@ -35,8 +35,7 @@
 @MediumTest
 @RunWith(AndroidJUnit4::class)
 class AndroidCompositionLocalTest {
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
     private val context = InstrumentationRegistry.getInstrumentation().context
 
     @Test
@@ -44,20 +43,14 @@
         val expected = createFontFamilyResolver(context)
         var actual: FontFamily.Resolver? = null
         rule.setContent {
-            CompositionLocalProvider(
-                LocalFontFamilyResolver provides expected
-            ) {
+            CompositionLocalProvider(LocalFontFamilyResolver provides expected) {
                 Popup {
                     val popupResolver = LocalFontFamilyResolver.current
-                    SideEffect {
-                        actual = popupResolver
-                    }
+                    SideEffect { actual = popupResolver }
                 }
             }
         }
-        rule.runOnIdle {
-            assertThat(actual).isSameInstanceAs(expected)
-        }
+        rule.runOnIdle { assertThat(actual).isSameInstanceAs(expected) }
     }
 
     @Test
@@ -66,32 +59,22 @@
         var compositionCount = 0
         rule.setContent {
             view = LocalView.current
-            with(LocalConfiguration.current) {
-                compositionCount++
-            }
+            with(LocalConfiguration.current) { compositionCount++ }
         }
-        rule.runOnIdle {
-            assertThat(compositionCount).isEqualTo(1)
-        }
+        rule.runOnIdle { assertThat(compositionCount).isEqualTo(1) }
         val configuration = view.context.resources.configuration
         // Dispatch the same configuration: same instance and compares equal so we shouldn't
         // invalidate LocalConfiguration
         view.dispatchConfigurationChanged(configuration)
-        rule.runOnIdle {
-            assertThat(compositionCount).isEqualTo(1)
-        }
+        rule.runOnIdle { assertThat(compositionCount).isEqualTo(1) }
         configuration.densityDpi *= 2
         // Same instance but different fields, so we should invalidate LocalConfiguration
         view.dispatchConfigurationChanged(configuration)
-        rule.runOnIdle {
-            assertThat(compositionCount).isEqualTo(2)
-        }
+        rule.runOnIdle { assertThat(compositionCount).isEqualTo(2) }
         configuration.screenHeightDp *= 2
         // Same instance but different fields, so we should invalidate LocalConfiguration
         view.dispatchConfigurationChanged(configuration)
-        rule.runOnIdle {
-            assertThat(compositionCount).isEqualTo(3)
-        }
+        rule.runOnIdle { assertThat(compositionCount).isEqualTo(3) }
     }
 
     @Test
@@ -100,34 +83,24 @@
         var compositionCount = 0
         rule.setContent {
             view = LocalView.current
-            with(LocalConfiguration.current) {
-                compositionCount++
-            }
+            with(LocalConfiguration.current) { compositionCount++ }
         }
-        rule.runOnIdle {
-            assertThat(compositionCount).isEqualTo(1)
-        }
+        rule.runOnIdle { assertThat(compositionCount).isEqualTo(1) }
         val configuration = view.context.resources.configuration
         // Make a deep copy
         val configurationCopy = Configuration(configuration)
         // New instance, but compares equal, so we shouldn't invalidate LocalConfiguration
         view.dispatchConfigurationChanged(configurationCopy)
-        rule.runOnIdle {
-            assertThat(compositionCount).isEqualTo(1)
-        }
+        rule.runOnIdle { assertThat(compositionCount).isEqualTo(1) }
         // Make another deep copy and mutate its fields
         val configurationCopy2 = Configuration(configuration).apply { densityDpi *= 2 }
         // New instance and different fields, so we should invalidate LocalConfiguration
         view.dispatchConfigurationChanged(configurationCopy2)
-        rule.runOnIdle {
-            assertThat(compositionCount).isEqualTo(2)
-        }
+        rule.runOnIdle { assertThat(compositionCount).isEqualTo(2) }
         // Make another deep copy and mutate its fields
         val configurationCopy3 = Configuration(configurationCopy2).apply { screenHeightDp *= 2 }
         // New instance and different fields, so we should invalidate LocalConfiguration
         view.dispatchConfigurationChanged(configurationCopy3)
-        rule.runOnIdle {
-            assertThat(compositionCount).isEqualTo(3)
-        }
+        rule.runOnIdle { assertThat(compositionCount).isEqualTo(3) }
     }
 }
diff --git a/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/platform/AndroidFontResourceLoaderTest.kt b/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/platform/AndroidFontResourceLoaderTest.kt
index be76106..c2bd67d 100644
--- a/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/platform/AndroidFontResourceLoaderTest.kt
+++ b/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/platform/AndroidFontResourceLoaderTest.kt
@@ -36,13 +36,14 @@
     @Suppress("DEPRECATION")
     fun test_font_loading_from_res() {
         val loader = AndroidFontResourceLoader(context)
-        val typeface = loader.load(
-            Font(
-                resId = R.font.sample_font,
-                weight = FontWeight.Normal,
-                style = FontStyle.Normal
+        val typeface =
+            loader.load(
+                Font(
+                    resId = R.font.sample_font,
+                    weight = FontWeight.Normal,
+                    style = FontStyle.Normal
+                )
             )
-        )
         assertThat(typeface).isNotNull()
     }
 }
diff --git a/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/platform/AndroidOwnerExtraAssertionsRule.kt b/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/platform/AndroidOwnerExtraAssertionsRule.kt
index b2d1da8..a256168 100644
--- a/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/platform/AndroidOwnerExtraAssertionsRule.kt
+++ b/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/platform/AndroidOwnerExtraAssertionsRule.kt
@@ -21,18 +21,14 @@
 import org.junit.runner.Description
 import org.junit.runners.model.Statement
 
-/**
- * Enables extra assertions inside [Owner].
- */
+/** Enables extra assertions inside [Owner]. */
 class AndroidOwnerExtraAssertionsRule : TestRule {
 
     override fun apply(base: Statement, description: Description?): Statement {
         return ExtraValidationsStatement(base)
     }
 
-    inner class ExtraValidationsStatement(
-        private val base: Statement
-    ) : Statement() {
+    inner class ExtraValidationsStatement(private val base: Statement) : Statement() {
         override fun evaluate() {
             Owner.enableExtraAssertions = true
             try {
diff --git a/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/platform/AndroidUiDispatcherTest.kt b/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/platform/AndroidUiDispatcherTest.kt
index e550f57..ed2da31 100644
--- a/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/platform/AndroidUiDispatcherTest.kt
+++ b/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/platform/AndroidUiDispatcherTest.kt
@@ -58,8 +58,7 @@
 @LargeTest
 @RunWith(AndroidJUnit4::class)
 class AndroidUiDispatcherTest {
-    @get:Rule
-    val rule = activityScenarioRule<AppCompatActivity>()
+    @get:Rule val rule = activityScenarioRule<AppCompatActivity>()
 
     @Before
     fun setup() {
@@ -67,35 +66,36 @@
     }
 
     @Test
-    fun currentThreadIsMainOnMainThread() = runBlocking(Dispatchers.Main) {
-        assertSame(AndroidUiDispatcher.Main, AndroidUiDispatcher.CurrentThread)
-    }
+    fun currentThreadIsMainOnMainThread() =
+        runBlocking(Dispatchers.Main) {
+            assertSame(AndroidUiDispatcher.Main, AndroidUiDispatcher.CurrentThread)
+        }
 
     @Test
-    fun runsBeforeFrameCallback() = runBlocking(Dispatchers.Main) {
-        rule.scenario.onActivity {
-            // Force creation of decor view to ensure we have a frame scheduled
-            it.window.decorView
+    fun runsBeforeFrameCallback() =
+        runBlocking(Dispatchers.Main) {
+            rule.scenario.onActivity {
+                // Force creation of decor view to ensure we have a frame scheduled
+                it.window.decorView
+            }
+
+            var ranOnUiDispatcher = false
+            launch(AndroidUiDispatcher.Main) { ranOnUiDispatcher = true }
+
+            val choreographerResult = CompletableDeferred<Boolean>()
+            Choreographer.getInstance().postFrameCallback {
+                choreographerResult.complete(ranOnUiDispatcher)
+            }
+
+            assertTrue("UI dispatcher ran before choreographer frame", choreographerResult.await())
         }
 
-        var ranOnUiDispatcher = false
-        launch(AndroidUiDispatcher.Main) { ranOnUiDispatcher = true }
-
-        val choreographerResult = CompletableDeferred<Boolean>()
-        Choreographer.getInstance().postFrameCallback {
-            choreographerResult.complete(ranOnUiDispatcher)
-        }
-
-        assertTrue("UI dispatcher ran before choreographer frame", choreographerResult.await())
-    }
-
     /**
-     * Verify that [AndroidUiDispatcher] will run a resumed continuation before
-     * the next frame is drawn, even if that continuation is resumed during the dispatch of
-     * batched input. Batched input is dispatched during an atomic sequence of events handled
-     * by the [Choreographer] of input => animation callbacks => measure => layout => draw,
-     * which will cause dispatchers that schedule entirely based on [android.os.Handler] messages
-     * to miss the current frame.
+     * Verify that [AndroidUiDispatcher] will run a resumed continuation before the next frame is
+     * drawn, even if that continuation is resumed during the dispatch of batched input. Batched
+     * input is dispatched during an atomic sequence of events handled by the [Choreographer] of
+     * input => animation callbacks => measure => layout => draw, which will cause dispatchers that
+     * schedule entirely based on [android.os.Handler] messages to miss the current frame.
      *
      * This test also verifies that a call to [AndroidUiDispatcher.frameClock]'s
      * [MonotonicFrameClock.withFrameNanos] will resume in time to make the current frame if called
@@ -121,12 +121,8 @@
                         // Use the frame clock provided by AndroidUiDispatcher.Main
                         launch(AndroidUiDispatcher.Main) {
                             ranInputJobOnFrame.complete(preDrawCount)
-                            withFrameNanos {
-                                withFrameOnFrame.complete(preDrawCount)
-                            }
-                            withFrameNanos {
-                                withFrameSecondCall.complete(preDrawCount)
-                            }
+                            withFrameNanos { withFrameOnFrame.complete(preDrawCount) }
+                            withFrameNanos { withFrameSecondCall.complete(preDrawCount) }
                         }
                         invalidate()
                         true
@@ -184,58 +180,50 @@
     }
 
     /**
-     * Test that an AndroidUiDispatcher can be wrapped by another ContinuationInterceptor
-     * without breaking the MonotonicFrameClock's ability to coordinate with its
-     * original dispatcher.
+     * Test that an AndroidUiDispatcher can be wrapped by another ContinuationInterceptor without
+     * breaking the MonotonicFrameClock's ability to coordinate with its original dispatcher.
      *
      * Construct a situation where the Choreographer contains three frame callbacks:
      * 1) checkpoint 1
      * 2) the AndroidUiDispatcher awaiting-frame callback
-     * 3) checkpoint 2
-     * Confirm that a call to withFrameNanos made *after* these three frame callbacks
-     * are enqueued runs *before* checkpoint 2, indicating that it ran with the original
-     * dispatcher's awaiting-frame callback, even though we wrapped the dispatcher.
+     * 3) checkpoint 2 Confirm that a call to withFrameNanos made *after* these three frame
+     *    callbacks are enqueued runs *before* checkpoint 2, indicating that it ran with the
+     *    original dispatcher's awaiting-frame callback, even though we wrapped the dispatcher.
      */
     @Test
-    fun wrappedDispatcherPostsToDispatcherFrameClock() = runBlocking(Dispatchers.Main) {
-        val uiDispatcherContext = AndroidUiDispatcher.Main
-        val uiDispatcher = uiDispatcherContext[ContinuationInterceptor] as CoroutineDispatcher
-        val wrapperDispatcher = object : CoroutineDispatcher() {
-            override fun dispatch(context: CoroutineContext, block: Runnable) {
-                uiDispatcher.dispatch(context, block)
+    fun wrappedDispatcherPostsToDispatcherFrameClock() =
+        runBlocking(Dispatchers.Main) {
+            val uiDispatcherContext = AndroidUiDispatcher.Main
+            val uiDispatcher = uiDispatcherContext[ContinuationInterceptor] as CoroutineDispatcher
+            val wrapperDispatcher =
+                object : CoroutineDispatcher() {
+                    override fun dispatch(context: CoroutineContext, block: Runnable) {
+                        uiDispatcher.dispatch(context, block)
+                    }
+                }
+
+            val choreographer = Choreographer.getInstance()
+
+            val expectCount = AtomicInteger(1)
+            fun expect(value: Int) {
+                while (true) {
+                    val old = expectCount.get()
+                    if (old != value) fail("expected sequence $old but encountered $value")
+                    if (expectCount.compareAndSet(value, value + 1)) break
+                }
+            }
+
+            choreographer.postFrameCallback { expect(1) }
+
+            launch(uiDispatcherContext, start = CoroutineStart.UNDISPATCHED) {
+                withFrameNanos { expect(2) }
+            }
+
+            choreographer.postFrameCallback { expect(4) }
+
+            withContext(uiDispatcherContext + wrapperDispatcher) {
+                withFrameNanos { expect(3) }
+                expect(5)
             }
         }
-
-        val choreographer = Choreographer.getInstance()
-
-        val expectCount = AtomicInteger(1)
-        fun expect(value: Int) {
-            while (true) {
-                val old = expectCount.get()
-                if (old != value) fail("expected sequence $old but encountered $value")
-                if (expectCount.compareAndSet(value, value + 1)) break
-            }
-        }
-
-        choreographer.postFrameCallback {
-            expect(1)
-        }
-
-        launch(uiDispatcherContext, start = CoroutineStart.UNDISPATCHED) {
-            withFrameNanos {
-                expect(2)
-            }
-        }
-
-        choreographer.postFrameCallback {
-            expect(4)
-        }
-
-        withContext(uiDispatcherContext + wrapperDispatcher) {
-            withFrameNanos {
-                expect(3)
-            }
-            expect(5)
-        }
-    }
 }
diff --git a/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/platform/AndroidViewCompatTest.kt b/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/platform/AndroidViewCompatTest.kt
index 2549bf1..2a3b0b5 100644
--- a/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/platform/AndroidViewCompatTest.kt
+++ b/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/platform/AndroidViewCompatTest.kt
@@ -111,14 +111,11 @@
 import org.junit.Test
 import org.junit.runner.RunWith
 
-/**
- * Testing the support for Android Views in Compose UI.
- */
+/** Testing the support for Android Views in Compose UI. */
 @MediumTest
 @RunWith(AndroidJUnit4::class)
 class AndroidViewCompatTest {
-    @get:Rule
-    val rule = createAndroidComposeRule<TestActivity>()
+    @get:Rule val rule = createAndroidComposeRule<TestActivity>()
 
     private val tag = "TestTag"
 
@@ -131,30 +128,27 @@
             Align {
                 Layout(
                     modifier = Modifier.testTag("content"),
-                    content = @Composable {
-                        AndroidView(::ColoredSquareView) {
-                            it.size = squareSize.value
-                            it.ref = squareRef
+                    content =
+                        @Composable {
+                            AndroidView(::ColoredSquareView) {
+                                it.size = squareSize.value
+                                it.ref = squareRef
+                            }
                         }
-                    }
                 ) { measurables, constraints ->
                     assertEquals(1, measurables.size)
-                    val placeable = measurables.first().measure(
-                        constraints.copy(minWidth = 0, minHeight = 0)
-                    )
+                    val placeable =
+                        measurables.first().measure(constraints.copy(minWidth = 0, minHeight = 0))
                     assertEquals(placeable.width, expectedSize)
                     assertEquals(placeable.height, expectedSize)
-                    layout(constraints.maxWidth, constraints.maxHeight) {
-                        placeable.place(0, 0)
-                    }
+                    layout(constraints.maxWidth, constraints.maxHeight) { placeable.place(0, 0) }
                 }
             }
         }
         rule.onNodeWithTag("content").assertIsDisplayed()
         val squareView = squareRef.value
         assertNotNull(squareView)
-        Espresso
-            .onView(instanceOf(ColoredSquareView::class.java))
+        Espresso.onView(instanceOf(ColoredSquareView::class.java))
             .check(matches(isDescendantOfA(instanceOf(Owner::class.java))))
             .check(matches(`is`(squareView)))
 
@@ -164,8 +158,7 @@
             expectedSize = 200
         }
         rule.onNodeWithTag("content").assertIsDisplayed()
-        Espresso
-            .onView(instanceOf(ColoredSquareView::class.java))
+        Espresso.onView(instanceOf(ColoredSquareView::class.java))
             .check(matches(isDescendantOfA(instanceOf(Owner::class.java))))
             .check(matches(`is`(squareView)))
 
@@ -175,8 +168,7 @@
             expectedSize = 300
         }
         rule.onNodeWithTag("content").assertIsDisplayed()
-        Espresso
-            .onView(instanceOf(ColoredSquareView::class.java))
+        Espresso.onView(instanceOf(ColoredSquareView::class.java))
             .check(matches(isDescendantOfA(instanceOf(Owner::class.java))))
             .check(matches(`is`(squareView)))
     }
@@ -200,8 +192,7 @@
         }
         val squareView = squareRef.value
         assertNotNull(squareView)
-        Espresso
-            .onView(instanceOf(ColoredSquareView::class.java))
+        Espresso.onView(instanceOf(ColoredSquareView::class.java))
             .check(matches(isDescendantOfA(instanceOf(Owner::class.java))))
             .check(matches(`is`(squareView)))
         val expectedPixelColor = { position: IntOffset ->
@@ -211,7 +202,8 @@
                 Color.White
             }
         }
-        rule.onNodeWithTag("content")
+        rule
+            .onNodeWithTag("content")
             .assertIsDisplayed()
             .captureToImage()
             .assertPixels(expectedColorProvider = expectedPixelColor)
@@ -221,11 +213,11 @@
             colorModel.value = Color.Green
             expectedColor = Color.Green
         }
-        Espresso
-            .onView(instanceOf(ColoredSquareView::class.java))
+        Espresso.onView(instanceOf(ColoredSquareView::class.java))
             .check(matches(isDescendantOfA(instanceOf(Owner::class.java))))
             .check(matches(`is`(squareView)))
-        rule.onNodeWithTag("content")
+        rule
+            .onNodeWithTag("content")
             .assertIsDisplayed()
             .captureToImage()
             .assertPixels(expectedColorProvider = expectedPixelColor)
@@ -235,11 +227,11 @@
             colorModel.value = Color.Red
             expectedColor = Color.Red
         }
-        Espresso
-            .onView(instanceOf(ColoredSquareView::class.java))
+        Espresso.onView(instanceOf(ColoredSquareView::class.java))
             .check(matches(isDescendantOfA(instanceOf(Owner::class.java))))
             .check(matches(`is`(squareView)))
-        rule.onNodeWithTag("content")
+        rule
+            .onNodeWithTag("content")
             .assertIsDisplayed()
             .captureToImage()
             .assertPixels(expectedColorProvider = expectedPixelColor)
@@ -284,9 +276,7 @@
         testMeasurement_isDoneWithCorrectMeasureSpecs(
             MeasureSpec.makeMeasureSpec(25, MeasureSpec.EXACTLY),
             MeasureSpec.makeMeasureSpec(35, MeasureSpec.EXACTLY),
-            Constraints(
-                minWidth = 20, maxWidth = 30, minHeight = 35, maxHeight = 45
-            ),
+            Constraints(minWidth = 20, maxWidth = 30, minHeight = 35, maxHeight = 45),
             ViewGroup.LayoutParams(25, 35)
         )
     }
@@ -296,9 +286,7 @@
         testMeasurement_isDoneWithCorrectMeasureSpecs(
             MeasureSpec.makeMeasureSpec(20, MeasureSpec.EXACTLY),
             MeasureSpec.makeMeasureSpec(35, MeasureSpec.EXACTLY),
-            Constraints(
-                minWidth = 20, maxWidth = 30, minHeight = 35, maxHeight = 45
-            ),
+            Constraints(minWidth = 20, maxWidth = 30, minHeight = 35, maxHeight = 45),
             ViewGroup.LayoutParams(15, 25)
         )
     }
@@ -308,9 +296,7 @@
         testMeasurement_isDoneWithCorrectMeasureSpecs(
             MeasureSpec.makeMeasureSpec(30, MeasureSpec.EXACTLY),
             MeasureSpec.makeMeasureSpec(45, MeasureSpec.EXACTLY),
-            Constraints(
-                minWidth = 20, maxWidth = 30, minHeight = 35, maxHeight = 45
-            ),
+            Constraints(minWidth = 20, maxWidth = 30, minHeight = 35, maxHeight = 45),
             ViewGroup.LayoutParams(35, 50)
         )
     }
@@ -410,9 +396,7 @@
                 AndroidView(::MeasureSpecSaverView) { it.ref = viewRef }
             }
         }
-        rule.runOnUiThread {
-            constraintsHolder.value = Constraints(minWidth = 20, minHeight = 30)
-        }
+        rule.runOnUiThread { constraintsHolder.value = Constraints(minWidth = 20, minHeight = 30) }
 
         rule.runOnIdle {
             assertEquals(20, viewRef.value!!.minimumWidth)
@@ -434,11 +418,7 @@
             }
         }
         rule.setContent {
-            Layout(
-                content = {
-                    AndroidView(::MeasureSpecsSaver)
-                }
-            ) { measurables, _ ->
+            Layout(content = { AndroidView(::MeasureSpecsSaver) }) { measurables, _ ->
                 val view = measurables.first()
                 assertEquals(20, view.minIntrinsicWidth(70))
                 assertEquals(MeasureSpec.UNSPECIFIED, MeasureSpec.getMode(obtainedWidthMeasureSpec))
@@ -499,18 +479,15 @@
                 view.setBackgroundColor(android.graphics.Color.BLUE)
             }
         }
-        rule.onNodeWithTag("view").captureToImage()
-            .assertPixels(IntSize(size, size)) { Color.Blue }
+        rule.onNodeWithTag("view").captureToImage().assertPixels(IntSize(size, size)) { Color.Blue }
 
         rule.runOnIdle { size += 20 }
-        rule.runOnIdle { } // just wait for composition to finish
-        rule.onNodeWithTag("view").captureToImage()
-            .assertPixels(IntSize(size, size)) { Color.Blue }
+        rule.runOnIdle {} // just wait for composition to finish
+        rule.onNodeWithTag("view").captureToImage().assertPixels(IntSize(size, size)) { Color.Blue }
 
         rule.runOnIdle { size += 20 }
-        rule.runOnIdle { } // just wait for composition to finish
-        rule.onNodeWithTag("view").captureToImage()
-            .assertPixels(IntSize(size, size)) { Color.Blue }
+        rule.runOnIdle {} // just wait for composition to finish
+        rule.onNodeWithTag("view").captureToImage().assertPixels(IntSize(size, size)) { Color.Blue }
     }
 
     @Test
@@ -524,18 +501,17 @@
             Box(Modifier.onGloballyPositioned { outer = it.positionInWindow() }) {
                 val paddingDp = with(LocalDensity.current) { padding.toDp() }
                 Box(Modifier.padding(paddingDp)) {
-                    AndroidView(
-                        {
-                            ComposeView(it).apply {
-                                setContent {
-                                    Box(
-                                        Modifier.padding(paddingDp)
-                                            .onGloballyPositioned { inner = it.positionInWindow() }
-                                    )
-                                }
+                    AndroidView({
+                        ComposeView(it).apply {
+                            setContent {
+                                Box(
+                                    Modifier.padding(paddingDp).onGloballyPositioned {
+                                        inner = it.positionInWindow()
+                                    }
+                                )
                             }
                         }
-                    )
+                    })
                 }
             }
         }
@@ -568,18 +544,17 @@
                 Box {
                     val paddingDp = with(LocalDensity.current) { padding.toDp() }
                     Box(Modifier.padding(paddingDp)) {
-                        AndroidView(
-                            {
-                                ComposeView(it).apply {
-                                    setContent {
-                                        Box(
-                                            Modifier.padding(paddingDp)
-                                                .onGloballyPositioned { coordinates = it }
-                                        )
-                                    }
+                        AndroidView({
+                            ComposeView(it).apply {
+                                setContent {
+                                    Box(
+                                        Modifier.padding(paddingDp).onGloballyPositioned {
+                                            coordinates = it
+                                        }
+                                    )
                                 }
                             }
-                        )
+                        })
                     }
                 }
             }
@@ -588,9 +563,7 @@
 
         rule.runOnIdle { topView.visibility = View.GONE }
 
-        rule.runOnIdle {
-            assertEquals(100, startX - coordinates.positionInWindow().x.roundToInt())
-        }
+        rule.runOnIdle { assertEquals(100, startX - coordinates.positionInWindow().x.roundToInt()) }
     }
 
     @Test
@@ -600,15 +573,13 @@
         rule.setContent {
             if (composeContent) {
                 Box {
-                    AndroidView(
-                        {
-                            ComposeView(it).apply {
-                                setViewCompositionStrategy(
-                                    ViewCompositionStrategy.DisposeOnViewTreeLifecycleDestroyed
-                                )
-                            }
+                    AndroidView({
+                        ComposeView(it).apply {
+                            setViewCompositionStrategy(
+                                ViewCompositionStrategy.DisposeOnViewTreeLifecycleDestroyed
+                            )
                         }
-                    ) {
+                    }) {
                         it.setContent {
                             ComposeNode<LayoutNode, Applier<Any>>(
                                 factory = LayoutNode.Constructor,
@@ -624,26 +595,28 @@
         }
 
         Espresso.onView(
-            allOf(
-                withClassName(endsWith("AndroidComposeView")),
-                not(isDescendantOfA(withClassName(endsWith("AndroidComposeView"))))
+                allOf(
+                    withClassName(endsWith("AndroidComposeView")),
+                    not(isDescendantOfA(withClassName(endsWith("AndroidComposeView"))))
+                )
             )
-        ).check { view, exception ->
-            view as AndroidComposeView
-            // The root layout node should have one child, the Box.
-            if (view.root.children.size != 1) throw exception
-        }
+            .check { view, exception ->
+                view as AndroidComposeView
+                // The root layout node should have one child, the Box.
+                if (view.root.children.size != 1) throw exception
+            }
         var innerAndroidComposeView: AndroidComposeView? = null
         Espresso.onView(
-            allOf(
-                withClassName(endsWith("AndroidComposeView")),
-                isDescendantOfA(withClassName(endsWith("AndroidComposeView")))
+                allOf(
+                    withClassName(endsWith("AndroidComposeView")),
+                    isDescendantOfA(withClassName(endsWith("AndroidComposeView")))
+                )
             )
-        ).check { view, exception ->
-            innerAndroidComposeView = view as AndroidComposeView
-            // It should have one layout node child, the inner emitted LayoutNode.
-            if (view.root.children.size != 1) throw exception
-        }
+            .check { view, exception ->
+                innerAndroidComposeView = view as AndroidComposeView
+                // It should have one layout node child, the inner emitted LayoutNode.
+                if (view.root.children.size != 1) throw exception
+            }
         // The layout node and its AndroidComposeView should be attached.
         assertNotNull(innerAndroidComposeView)
         assertTrue(innerAndroidComposeView!!.isAttachedToWindow)
@@ -670,9 +643,7 @@
             composeView.layoutParams = FrameLayout.LayoutParams(size, size)
             root.addView(composeView)
             rule.activity.setContentView(root)
-            composeView.setContent {
-                AndroidView(::View, Modifier.size(10.dp))
-            }
+            composeView.setContent { AndroidView(::View, Modifier.size(10.dp)) }
         }
 
         Espresso.onView(withClassName(endsWith("AndroidViewsHandler"))).check { view, exception ->
@@ -702,9 +673,7 @@
             expectedColor = Color.Green
         }
 
-        rule.runOnUiThread {
-            assertTrue(squareView!!.drawnAfterLastColorChange)
-        }
+        rule.runOnUiThread { assertTrue(squareView!!.drawnAfterLastColorChange) }
     }
 
     @Test
@@ -726,12 +695,14 @@
                 null
             }
         }
-        rule.onNodeWithTag("box").captureToImage()
+        rule
+            .onNodeWithTag("box")
+            .captureToImage()
             .assertPixels(expectedColorProvider = offsetColorProvider)
-        rule.runOnUiThread {
-            offset = 100
-        }
-        rule.onNodeWithTag("box").captureToImage()
+        rule.runOnUiThread { offset = 100 }
+        rule
+            .onNodeWithTag("box")
+            .captureToImage()
             .assertPixels(expectedColorProvider = offsetColorProvider)
     }
 
@@ -775,9 +746,7 @@
                 invalidate()
             }
         }
-        rule.waitUntil(10000) {
-            view!!.draws == invalidatesDuringScroll + 1
-        }
+        rule.waitUntil(10000) { view!!.draws == invalidatesDuringScroll + 1 }
     }
 
     @Ignore // b/254573760
@@ -791,12 +760,13 @@
                 AndroidView(
                     factory = {
                         val webView = WebView(it)
-                        webView.webViewClient = object : WebViewClient() {
-                            override fun onPageCommitVisible(view: WebView?, url: String?) {
-                                super.onPageCommitVisible(view, url)
-                                latch.countDown()
+                        webView.webViewClient =
+                            object : WebViewClient() {
+                                override fun onPageCommitVisible(view: WebView?, url: String?) {
+                                    super.onPageCommitVisible(view, url)
+                                    latch.countDown()
+                                }
                             }
-                        }
                         webView.loadData("This is a test text", "text/html", "UTF-8")
                         webView
                     }
@@ -812,17 +782,9 @@
     fun testView_isNotLayoutRequested_afterFirstLayout() {
         var view: View? = null
 
-        rule.setContent {
-            AndroidView(
-                factory = { context ->
-                    View(context).also { view = it }
-                }
-            )
-        }
+        rule.setContent { AndroidView(factory = { context -> View(context).also { view = it } }) }
 
-        rule.runOnIdle {
-            assertFalse(view!!.isLayoutRequested)
-        }
+        rule.runOnIdle { assertFalse(view!!.isLayoutRequested) }
     }
 
     @OptIn(ExperimentalTestApi::class)
@@ -837,11 +799,8 @@
         }
 
         rule.runOnIdle {
-            assertThat(view.hoverEvents).containsExactly(
-                ACTION_HOVER_ENTER,
-                ACTION_HOVER_MOVE,
-                ACTION_HOVER_EXIT
-            )
+            assertThat(view.hoverEvents)
+                .containsExactly(ACTION_HOVER_ENTER, ACTION_HOVER_MOVE, ACTION_HOVER_EXIT)
         }
     }
 
@@ -860,15 +819,16 @@
         }
 
         rule.runOnIdle {
-            assertThat(view.touchEvents).containsExactly(
-                ACTION_DOWN,
-                ACTION_MOVE,
-                ACTION_POINTER_DOWN,
-                ACTION_MOVE,
-                ACTION_POINTER_UP,
-                ACTION_MOVE,
-                ACTION_UP
-            )
+            assertThat(view.touchEvents)
+                .containsExactly(
+                    ACTION_DOWN,
+                    ACTION_MOVE,
+                    ACTION_POINTER_DOWN,
+                    ACTION_MOVE,
+                    ACTION_POINTER_UP,
+                    ACTION_MOVE,
+                    ACTION_UP
+                )
         }
     }
 
@@ -883,9 +843,7 @@
                 modifier = Modifier.fillMaxSize().testTag(tag)
             )
         }
-        return rule.runOnIdle {
-            view
-        }
+        return rule.runOnIdle { view }
     }
 
     class ColoredSquareView(context: Context) : View(context) {
@@ -935,6 +893,7 @@
                 field = value
                 value?.value = this
             }
+
         var widthMeasureSpecRef: Ref<Int>? = null
         var heightMeasureSpecRef: Ref<Int>? = null
 
@@ -963,44 +922,42 @@
     }
 
     fun Modifier.layoutConstraints(childConstraints: Constraints): Modifier =
-        this.then(object : LayoutModifier {
-            override fun MeasureScope.measure(
-                measurable: Measurable,
-                constraints: Constraints
-            ): MeasureResult {
-                val placeable = measurable.measure(childConstraints)
-                return layout(placeable.width, placeable.height) {
-                    placeable.place(0, 0)
+        this.then(
+            object : LayoutModifier {
+                override fun MeasureScope.measure(
+                    measurable: Measurable,
+                    constraints: Constraints
+                ): MeasureResult {
+                    val placeable = measurable.measure(childConstraints)
+                    return layout(placeable.width, placeable.height) { placeable.place(0, 0) }
                 }
             }
-        })
+        )
 
     @Composable
-    fun Container(
-        modifier: Modifier = Modifier,
-        content: @Composable () -> Unit
-    ) {
+    fun Container(modifier: Modifier = Modifier, content: @Composable () -> Unit) {
         Layout(content, modifier) { measurables, constraints ->
             val placeable = measurables[0].measure(constraints)
-            layout(placeable.width, placeable.height) {
-                placeable.place(0, 0)
-            }
+            layout(placeable.width, placeable.height) { placeable.place(0, 0) }
         }
     }
 
-    private val noOpMeasurePolicy = object : LayoutNode.NoIntrinsicsMeasurePolicy("") {
-        override fun MeasureScope.measure(
-            measurables: List<Measurable>,
-            constraints: Constraints
-        ): MeasureResult {
-            return object : MeasureResult {
-                override val width = 0
-                override val height = 0
-                override val alignmentLines: Map<AlignmentLine, Int> get() = mapOf()
-                override fun placeChildren() {}
+    private val noOpMeasurePolicy =
+        object : LayoutNode.NoIntrinsicsMeasurePolicy("") {
+            override fun MeasureScope.measure(
+                measurables: List<Measurable>,
+                constraints: Constraints
+            ): MeasureResult {
+                return object : MeasureResult {
+                    override val width = 0
+                    override val height = 0
+                    override val alignmentLines: Map<AlignmentLine, Int>
+                        get() = mapOf()
+
+                    override fun placeChildren() {}
+                }
             }
         }
-    }
 
     private class CaptureEventsView(context: Context) : View(context) {
         val touchEvents = mutableListOf<Int>()
diff --git a/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/platform/ComposeViewOverlayTest.kt b/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/platform/ComposeViewOverlayTest.kt
index 4f703cb..27b70d1 100644
--- a/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/platform/ComposeViewOverlayTest.kt
+++ b/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/platform/ComposeViewOverlayTest.kt
@@ -46,11 +46,10 @@
 @RunWith(AndroidJUnit4::class)
 class ComposeViewOverlayTest {
     /**
-     * Note: this test does not use the compose rule to ensure default behavior
-     * of window-scoped Recomposer installation.
+     * Note: this test does not use the compose rule to ensure default behavior of window-scoped
+     * Recomposer installation.
      */
-    @get:Rule
-    val rule = activityScenarioRule<ComponentActivity>()
+    @get:Rule val rule = activityScenarioRule<ComponentActivity>()
 
     /**
      * Moving a ComposeView to an [android.view.ViewOverlay] means it won't have a correct parent
@@ -64,14 +63,12 @@
     fun testComposeViewMovedToOverlay() {
         var factoryCallCount = 0
         lateinit var createdRecomposer: Recomposer
-        WindowRecomposerPolicy.withFactory(
-            { view ->
-                factoryCallCount++
-                WindowRecomposerFactory.LifecycleAware.createRecomposer(view).also {
-                    createdRecomposer = it
-                }
+        WindowRecomposerPolicy.withFactory({ view ->
+            factoryCallCount++
+            WindowRecomposerFactory.LifecycleAware.createRecomposer(view).also {
+                createdRecomposer = it
             }
-        ) {
+        }) {
             val expectedText = "Hello, world"
             lateinit var composeView: ComposeView
             lateinit var contentAView: ViewGroup
@@ -81,30 +78,28 @@
             var consumedStage by mutableStateOf(-1)
             var compositionCount = 0
             rule.scenario.onActivity { activity ->
-                composeView = ComposeView(activity).apply {
-                    setContent {
-                        BasicText(expectedText)
-                        localLifecycleOwner = LocalLifecycleOwner.current
-                        consumedStage = publishedStage
-                        SideEffect {
-                            compositionCount++
+                composeView =
+                    ComposeView(activity).apply {
+                        setContent {
+                            BasicText(expectedText)
+                            localLifecycleOwner = LocalLifecycleOwner.current
+                            consumedStage = publishedStage
+                            SideEffect { compositionCount++ }
                         }
                     }
-                }
-                contentAView = FrameLayout(activity).apply {
-                    addView(composeView)
-                }
+                contentAView = FrameLayout(activity).apply { addView(composeView) }
                 contentBView = FrameLayout(activity)
-                val views = LinearLayout(activity).apply {
-                    addView(
-                        contentAView,
-                        LinearLayout.LayoutParams(0, ViewGroup.LayoutParams.MATCH_PARENT, 1f)
-                    )
-                    addView(
-                        contentBView,
-                        LinearLayout.LayoutParams(0, ViewGroup.LayoutParams.MATCH_PARENT, 1f)
-                    )
-                }
+                val views =
+                    LinearLayout(activity).apply {
+                        addView(
+                            contentAView,
+                            LinearLayout.LayoutParams(0, ViewGroup.LayoutParams.MATCH_PARENT, 1f)
+                        )
+                        addView(
+                            contentBView,
+                            LinearLayout.LayoutParams(0, ViewGroup.LayoutParams.MATCH_PARENT, 1f)
+                        )
+                    }
                 activity.setContentView(views)
             }
 
diff --git a/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/platform/ComposeViewSavedStateSizeTest.kt b/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/platform/ComposeViewSavedStateSizeTest.kt
index 0bc5185..bd59726 100644
--- a/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/platform/ComposeViewSavedStateSizeTest.kt
+++ b/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/platform/ComposeViewSavedStateSizeTest.kt
@@ -35,17 +35,14 @@
 
 class ComposeViewSavedStateSizeTest {
 
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
     @Test
     fun composeViewIsProducingEmptySavedState() {
         lateinit var view: View
         rule.setContent {
             view = LocalView.current
-            Box {
-                BasicText("hello world")
-            }
+            Box { BasicText("hello world") }
         }
 
         rule.runOnIdle {
@@ -61,18 +58,15 @@
         lateinit var view: View
         rule.setContent {
             view = LocalView.current
-            Box {
-                repeat(childCount) {
-                    Box(Modifier.graphicsLayer())
-                }
-            }
+            Box { repeat(childCount) { Box(Modifier.graphicsLayer()) } }
         }
 
-        val initialArray = rule.runOnIdle {
-            val array = SparseArray<Parcelable>()
-            view.saveHierarchyState(array)
-            array
-        }
+        val initialArray =
+            rule.runOnIdle {
+                val array = SparseArray<Parcelable>()
+                view.saveHierarchyState(array)
+                array
+            }
 
         childCount = 10
 
diff --git a/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/platform/ComposeViewTest.kt b/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/platform/ComposeViewTest.kt
index ee097a3..6a16f3f 100644
--- a/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/platform/ComposeViewTest.kt
+++ b/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/platform/ComposeViewTest.kt
@@ -31,8 +31,7 @@
 @MediumTest
 @RunWith(AndroidJUnit4::class)
 class ComposeViewTest {
-    @get:Rule
-    val rule = createAndroidComposeRule<TestActivity>()
+    @get:Rule val rule = createAndroidComposeRule<TestActivity>()
 
     @Test
     fun composeViewIsTransitionGroup() {
@@ -42,10 +41,9 @@
 
     @Test
     fun composeViewInflatesTransitionGroup() {
-        val view = rule.activity.layoutInflater.inflate(
-            R.layout.composeview_transition_group_false,
-            null
-        ) as ViewGroup
+        val view =
+            rule.activity.layoutInflater.inflate(R.layout.composeview_transition_group_false, null)
+                as ViewGroup
         assertFalse("XML overrides ComposeView.isTransitionGroup", view.isTransitionGroup)
     }
 }
diff --git a/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/platform/DisposableSaveableStateRegistryTest.kt b/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/platform/DisposableSaveableStateRegistryTest.kt
index e5e4927..88aee55 100644
--- a/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/platform/DisposableSaveableStateRegistryTest.kt
+++ b/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/platform/DisposableSaveableStateRegistryTest.kt
@@ -138,11 +138,7 @@
         assertTrue(registry.canBeSaved(Size(5, 5)))
         assertTrue(registry.canBeSaved(SizeF(5f, 5f)))
         assertTrue(
-            registry.canBeSaved(
-                SparseArray<Parcelable>().apply {
-                    put(5, CustomParcelable())
-                }
-            )
+            registry.canBeSaved(SparseArray<Parcelable>().apply { put(5, CustomParcelable()) })
         )
         assertTrue(registry.canBeSaved(arrayListOf("String")))
     }
@@ -172,7 +168,7 @@
         assertFalse(registry.canBeSaved(lambda))
         val lambdaWithArguments: (String, Int) -> Unit = { _, _ -> }
         assertFalse(registry.canBeSaved(lambdaWithArguments))
-        val lambdaWithReceiver: String.() -> Unit = { }
+        val lambdaWithReceiver: String.() -> Unit = {}
         assertFalse(registry.canBeSaved(lambdaWithReceiver))
     }
 
@@ -219,10 +215,12 @@
     companion object {
         @Suppress("unused")
         @JvmField
-        val CREATOR = object : Parcelable.Creator<CustomParcelable> {
-            override fun createFromParcel(parcel: Parcel) = CustomParcelable(parcel)
-            override fun newArray(size: Int) = arrayOfNulls<CustomParcelable?>(size)
-        }
+        val CREATOR =
+            object : Parcelable.Creator<CustomParcelable> {
+                override fun createFromParcel(parcel: Parcel) = CustomParcelable(parcel)
+
+                override fun newArray(size: Int) = arrayOfNulls<CustomParcelable?>(size)
+            }
     }
 }
 
@@ -245,20 +243,22 @@
     companion object {
         @Suppress("unused")
         @JvmField
-        val CREATOR = object : Parcelable.Creator<CustomParcelableFunction> {
-            override fun createFromParcel(parcel: Parcel) = CustomParcelableFunction(parcel)
-            override fun newArray(size: Int) = arrayOfNulls<CustomParcelableFunction?>(size)
-        }
+        val CREATOR =
+            object : Parcelable.Creator<CustomParcelableFunction> {
+                override fun createFromParcel(parcel: Parcel) = CustomParcelableFunction(parcel)
+
+                override fun newArray(size: Int) = arrayOfNulls<CustomParcelableFunction?>(size)
+            }
     }
 }
 
-private class TestOwner(
-    restoredBundle: Bundle? = null
-) : SavedStateRegistryOwner, LifecycleOwner by TestLifecycleOwner(Lifecycle.State.INITIALIZED) {
+private class TestOwner(restoredBundle: Bundle? = null) :
+    SavedStateRegistryOwner, LifecycleOwner by TestLifecycleOwner(Lifecycle.State.INITIALIZED) {
 
-    private val controller = SavedStateRegistryController.create(this).apply {
-        performRestore(restoredBundle ?: Bundle())
-    }
+    private val controller =
+        SavedStateRegistryController.create(this).apply {
+            performRestore(restoredBundle ?: Bundle())
+        }
 
     init {
         (lifecycle as LifecycleRegistry).currentState = Lifecycle.State.RESUMED
@@ -267,7 +267,5 @@
     override val savedStateRegistry: SavedStateRegistry
         get() = controller.savedStateRegistry
 
-    fun save() = Bundle().apply {
-        controller.performSave(this)
-    }
+    fun save() = Bundle().apply { controller.performSave(this) }
 }
diff --git a/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/platform/InspectableValueTest.kt b/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/platform/InspectableValueTest.kt
index 1cf6d5c..cfd9d0a 100644
--- a/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/platform/InspectableValueTest.kt
+++ b/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/platform/InspectableValueTest.kt
@@ -32,8 +32,7 @@
 import org.junit.Test
 
 class InspectableValueTest {
-    @get:Rule
-    val rule = createAndroidComposeRule<TestActivity>()
+    @get:Rule val rule = createAndroidComposeRule<TestActivity>()
 
     @Before
     fun before() {
@@ -46,23 +45,22 @@
     }
 
     @Suppress("DEPRECATION")
-    fun Modifier.simple(padding: Int, border: Dp) = inspectable(
-        debugInspectorInfo {
-            name = "simple"
-            properties["padding"] = padding
-            properties["border"] = border
+    fun Modifier.simple(padding: Int, border: Dp) =
+        inspectable(
+            debugInspectorInfo {
+                name = "simple"
+                properties["padding"] = padding
+                properties["border"] = border
+            }
+        ) {
+            padding(padding).border(border, color = Color.Blue)
         }
-    ) {
-        padding(padding).border(border, color = Color.Blue)
-    }
 
     @Test
     fun simpleLayoutTest() {
         val modifier = Modifier.simple(10, 3.dp).first() as InspectableValue
         assertThat(modifier.nameFallback).isEqualTo("simple")
-        assertThat(modifier.inspectableElements.asIterable()).containsExactly(
-            ValueElement("padding", 10),
-            ValueElement("border", 3.0.dp)
-        )
+        assertThat(modifier.inspectableElements.asIterable())
+            .containsExactly(ValueElement("padding", 10), ValueElement("border", 3.0.dp))
     }
 }
diff --git a/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/platform/LayoutIdTest.kt b/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/platform/LayoutIdTest.kt
index e452968..24bcd96 100644
--- a/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/platform/LayoutIdTest.kt
+++ b/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/platform/LayoutIdTest.kt
@@ -61,20 +61,11 @@
         val latch = CountDownLatch(1)
         rule.runOnUiThreadIR {
             activity.setContent {
-                Layout(
-                    {
-                        AtLeastSize(0, Modifier.layoutId("first"), content = {})
-                        Box(Modifier.layoutId("second")) {
-                            AtLeastSize(
-                                0,
-                                content = {}
-                            )
-                        }
-                        Box(Modifier.layoutId("third")) {
-                            AtLeastSize(0, content = {})
-                        }
-                    }
-                ) { measurables, _ ->
+                Layout({
+                    AtLeastSize(0, Modifier.layoutId("first"), content = {})
+                    Box(Modifier.layoutId("second")) { AtLeastSize(0, content = {}) }
+                    Box(Modifier.layoutId("third")) { AtLeastSize(0, content = {}) }
+                }) { measurables, _ ->
                     assertEquals(3, measurables.size)
                     assertEquals("first", measurables[0].layoutId)
                     assertEquals("second", measurables[1].layoutId)
diff --git a/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/platform/LocalSoftwareKeyboardControllerTest.kt b/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/platform/LocalSoftwareKeyboardControllerTest.kt
index a52b433..732e1db 100644
--- a/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/platform/LocalSoftwareKeyboardControllerTest.kt
+++ b/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/platform/LocalSoftwareKeyboardControllerTest.kt
@@ -44,8 +44,7 @@
 @RunWith(AndroidJUnit4::class)
 class LocalSoftwareKeyboardControllerTest {
 
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
     @Test
     fun whenButtonClicked_performsHide_realisticAppTestCase() {
@@ -54,9 +53,7 @@
         fun TestComposable() {
             val softwareKeyboardController = LocalSoftwareKeyboardController.current
             // Box instead of Button in this file for module dependency reasons
-            Box(Modifier.clickable { softwareKeyboardController?.hide() }) {
-                BasicText("Click Me")
-            }
+            Box(Modifier.clickable { softwareKeyboardController?.hide() }) { BasicText("Click Me") }
         }
 
         // arrange
@@ -73,9 +70,7 @@
         rule.onNodeWithText("Click Me").performClick()
 
         // assert
-        rule.runOnIdle {
-            verify(mockSoftwareKeyboardController).hide()
-        }
+        rule.runOnIdle { verify(mockSoftwareKeyboardController).hide() }
     }
 
     @Test
@@ -85,23 +80,16 @@
 
         rule.setContent {
             val controller = LocalSoftwareKeyboardController.current
-            SideEffect {
-                controller?.hide()
-            }
+            SideEffect { controller?.hide() }
         }
 
-        rule.runOnIdle {
-            verify(platformTextInputService, times(1))
-                .hideSoftwareKeyboard()
-        }
+        rule.runOnIdle { verify(platformTextInputService, times(1)).hideSoftwareKeyboard() }
     }
 
     @Test
     fun showHideSoftKeyboard_dontCrash_beforeSession() {
         var keyboardController: SoftwareKeyboardController? = null
-        rule.setContent {
-            keyboardController = LocalSoftwareKeyboardController.current
-        }
+        rule.setContent { keyboardController = LocalSoftwareKeyboardController.current }
         keyboardController!!.show()
         keyboardController!!.hide()
     }
diff --git a/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/platform/WindowInfoCompositionLocalTest.kt b/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/platform/WindowInfoCompositionLocalTest.kt
index 5da9f87..e543a0e 100644
--- a/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/platform/WindowInfoCompositionLocalTest.kt
+++ b/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/platform/WindowInfoCompositionLocalTest.kt
@@ -43,8 +43,7 @@
 @MediumTest
 @RunWith(AndroidJUnit4::class)
 class WindowInfoCompositionLocalTest {
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
     @FlakyTest(bugId = 173088588)
     @Test
@@ -81,9 +80,7 @@
             if (showPopup.value) {
                 Popup(
                     properties = PopupProperties(focusable = true),
-                    onDismissRequest = {
-                        showPopup.value = false
-                    }
+                    onDismissRequest = { showPopup.value = false }
                 ) {
                     BasicText("Popup Window")
                     popupWindowInfo = LocalWindowInfo.current
@@ -214,15 +211,18 @@
         }
         assertThat(keyModifiers.packedValue).isEqualTo(0)
 
-        (rule as AndroidComposeTestRule<*, *>).runOnUiThread {
-            ownerView.requestFocus()
-        }
+        (rule as AndroidComposeTestRule<*, *>).runOnUiThread { ownerView.requestFocus() }
 
         rule.runOnIdle {
-            val ctrlPressed = KeyEvent(
-                0, 0, KeyEvent.ACTION_DOWN,
-                KeyEvent.KEYCODE_CTRL_LEFT, 0, KeyEvent.META_CTRL_ON
-            )
+            val ctrlPressed =
+                KeyEvent(
+                    0,
+                    0,
+                    KeyEvent.ACTION_DOWN,
+                    KeyEvent.KEYCODE_CTRL_LEFT,
+                    0,
+                    KeyEvent.META_CTRL_ON
+                )
             ownerView.dispatchKeyEvent(ctrlPressed)
         }
 
@@ -230,25 +230,32 @@
         assertThat(keyModifiers.packedValue).isEqualTo(KeyEvent.META_CTRL_ON)
 
         rule.runOnIdle {
-            val altAndCtrlPressed = KeyEvent(
-                0, 0, KeyEvent.ACTION_DOWN,
-                KeyEvent.KEYCODE_ALT_LEFT, 0,
-                KeyEvent.META_CTRL_ON or KeyEvent.META_ALT_ON
-            )
+            val altAndCtrlPressed =
+                KeyEvent(
+                    0,
+                    0,
+                    KeyEvent.ACTION_DOWN,
+                    KeyEvent.KEYCODE_ALT_LEFT,
+                    0,
+                    KeyEvent.META_CTRL_ON or KeyEvent.META_ALT_ON
+                )
             ownerView.dispatchKeyEvent(altAndCtrlPressed)
         }
 
         rule.waitForIdle()
-        assertThat(keyModifiers.packedValue).isEqualTo(
-            KeyEvent.META_CTRL_ON or KeyEvent.META_ALT_ON
-        )
+        assertThat(keyModifiers.packedValue)
+            .isEqualTo(KeyEvent.META_CTRL_ON or KeyEvent.META_ALT_ON)
 
         rule.runOnIdle {
-            val altUnpressed = KeyEvent(
-                0, 0, KeyEvent.ACTION_UP,
-                KeyEvent.KEYCODE_ALT_LEFT, 0,
-                KeyEvent.META_CTRL_ON
-            )
+            val altUnpressed =
+                KeyEvent(
+                    0,
+                    0,
+                    KeyEvent.ACTION_UP,
+                    KeyEvent.KEYCODE_ALT_LEFT,
+                    0,
+                    KeyEvent.META_CTRL_ON
+                )
             ownerView.dispatchKeyEvent(altUnpressed)
         }
 
@@ -256,10 +263,7 @@
         assertThat(keyModifiers.packedValue).isEqualTo(KeyEvent.META_CTRL_ON)
 
         rule.runOnIdle {
-            val ctrlUnpressed = KeyEvent(
-                0, 0, KeyEvent.ACTION_UP,
-                KeyEvent.KEYCODE_CTRL_LEFT, 0, 0
-            )
+            val ctrlUnpressed = KeyEvent(0, 0, KeyEvent.ACTION_UP, KeyEvent.KEYCODE_CTRL_LEFT, 0, 0)
             ownerView.dispatchKeyEvent(ctrlUnpressed)
         }
 
diff --git a/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/platform/WindowInfoTest.kt b/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/platform/WindowInfoTest.kt
index 362847e..07a2e67 100644
--- a/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/platform/WindowInfoTest.kt
+++ b/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/platform/WindowInfoTest.kt
@@ -41,6 +41,7 @@
 
     class TestFragment : Fragment() {
         var isWindowFocused: Boolean? = null
+
         override fun onCreateView(
             inflater: LayoutInflater,
             container: ViewGroup?,
@@ -48,13 +49,15 @@
         ): View? {
             return container?.let {
                 ComposeView(container.context).apply {
-                    layoutParams = ViewGroup.LayoutParams(
-                        ViewGroup.LayoutParams.MATCH_PARENT,
-                        ViewGroup.LayoutParams.MATCH_PARENT
-                    )
+                    layoutParams =
+                        ViewGroup.LayoutParams(
+                            ViewGroup.LayoutParams.MATCH_PARENT,
+                            ViewGroup.LayoutParams.MATCH_PARENT
+                        )
                 }
             }
         }
+
         override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
             (view as ComposeView).setContent {
                 isWindowFocused = LocalWindowInfo.current.isWindowFocused
diff --git a/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/platform/WindowRecomposerTest.kt b/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/platform/WindowRecomposerTest.kt
index ebea1a2..ae8f90c 100644
--- a/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/platform/WindowRecomposerTest.kt
+++ b/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/platform/WindowRecomposerTest.kt
@@ -69,17 +69,18 @@
 class WindowRecomposerTest {
 
     /**
-     * Test that a Recomposer that doesn't shut down with the activity doesn't inadvertently
-     * keep a reference to the Activity
+     * Test that a Recomposer that doesn't shut down with the activity doesn't inadvertently keep a
+     * reference to the Activity
      */
     @kotlin.OptIn(DelicateCoroutinesApi::class, InternalComposeUiApi::class)
     @Test
     @LargeTest
     fun activityGarbageCollected() {
         val localRecomposer = Recomposer(AndroidUiDispatcher.Main)
-        val recomposerJob = GlobalScope.launch(AndroidUiDispatcher.Main) {
-            localRecomposer.runRecomposeAndApplyChanges()
-        }
+        val recomposerJob =
+            GlobalScope.launch(AndroidUiDispatcher.Main) {
+                localRecomposer.runRecomposeAndApplyChanges()
+            }
         lateinit var weakActivityRef: WeakReference<Activity>
         try {
             WindowRecomposerPolicy.withFactory({ localRecomposer }) {
@@ -88,33 +89,27 @@
                         weakActivityRef = WeakReference(activity)
                         activity.setContentView(
                             ComposeView(activity).apply {
-                                setContent {
-                                    Box(Modifier.background(Color.Blue).fillMaxSize())
-                                }
+                                setContent { Box(Modifier.background(Color.Blue).fillMaxSize()) }
                             }
                         )
                     }
                     assertNotNull(weakActivityRef.get())
                 }
-                repeat(10) {
-                    Runtime.getRuntime().gc()
-                }
+                repeat(10) { Runtime.getRuntime().gc() }
                 assertNull("expected Activity to have been collected", weakActivityRef.get())
             }
         } finally {
             localRecomposer.cancel()
-            runBlocking {
-                recomposerJob.join()
-            }
+            runBlocking { recomposerJob.join() }
         }
     }
 
     /**
-     * The Android framework may reuse the window decor views in some cases of activity
-     * recreation for configuration changes, notably during dynamic window resizing in
-     * multi-window modes. Confirm that the [windowRecomposer] extension returns a recomposer
-     * based in the content views, not in the decor itself, as this can cause a recomposer to
-     * become decoupled from its `DESTROYED` host lifecycle - the old Activity instance.
+     * The Android framework may reuse the window decor views in some cases of activity recreation
+     * for configuration changes, notably during dynamic window resizing in multi-window modes.
+     * Confirm that the [windowRecomposer] extension returns a recomposer based in the content
+     * views, not in the decor itself, as this can cause a recomposer to become decoupled from its
+     * `DESTROYED` host lifecycle - the old Activity instance.
      *
      * Regression test for https://issuetracker.google.com/issues/184293033
      */
@@ -124,9 +119,7 @@
         ActivityScenario.launch(ComponentActivity::class.java).use { scenario ->
             var firstRecomposer: Recomposer? = null
             scenario.onActivity {
-                it.setContent {
-                    BasicText("Hello, world")
-                }
+                it.setContent { BasicText("Hello, world") }
                 val contentParent = it.findViewById<ViewGroup>(android.R.id.content)
                 assertEquals("child count of @android:id/content", 1, contentParent.childCount)
                 firstRecomposer = contentParent[0].windowRecomposer
@@ -136,9 +129,7 @@
             scenario.onActivity {
                 // force removal of the old composition host view and don't reuse
                 it.setContentView(View(it))
-                it.setContent {
-                    BasicText("Hello, again!")
-                }
+                it.setContent { BasicText("Hello, again!") }
                 val contentParent = it.findViewById<ViewGroup>(android.R.id.content)
                 assertEquals("child count of @android:id/content", 1, contentParent.childCount)
                 secondRecomposer = contentParent[0].windowRecomposer
@@ -158,22 +149,21 @@
         lateinit var view: View
         ActivityScenario.launch(ComponentActivity::class.java).use { scenario ->
             scenario.onActivity { activity ->
-                view = ComposeView(activity).apply {
-                    setContent {
-                        val value by input.collectAsState()
-                        output = "one $value"
+                view =
+                    ComposeView(activity).apply {
+                        setContent {
+                            val value by input.collectAsState()
+                            output = "one $value"
+                        }
                     }
-                }
                 activity.setContentView(view)
             }
 
             delay(3_000)
 
             suspend fun assertOutput(expected: String) {
-                withTimeoutOrNull(1_000) {
-                    snapshotFlow { output }
-                        .first { it == expected }
-                } ?: fail("unexpected output; $output expected $expected")
+                withTimeoutOrNull(1_000) { snapshotFlow { output }.first { it == expected } }
+                    ?: fail("unexpected output; $output expected $expected")
             }
 
             assertOutput("one 0")
@@ -182,9 +172,7 @@
 
             assertOutput("one 1")
 
-            scenario.onActivity { activity ->
-                activity.setContentView(view)
-            }
+            scenario.onActivity { activity -> activity.setContentView(view) }
 
             assertOutput("one 1")
 
@@ -202,15 +190,11 @@
             val effectContext = CompletableDeferred<CoroutineContext>()
             scenario.onActivity { activity ->
                 val view = ComposeView(activity)
-                val recomposer = view.createLifecycleAwareWindowRecomposer(
-                    expectedElement,
-                    activity.lifecycle
-                )
+                val recomposer =
+                    view.createLifecycleAwareWindowRecomposer(expectedElement, activity.lifecycle)
                 view.setParentCompositionContext(recomposer)
                 view.setContent {
-                    LaunchedEffect(Unit) {
-                        effectContext.complete(coroutineContext)
-                    }
+                    LaunchedEffect(Unit) { effectContext.complete(coroutineContext) }
                 }
 
                 activity.setContentView(view)
@@ -228,18 +212,12 @@
             val lifecycleOwner = TestLifecycleOwner(Lifecycle.State.RESUMED)
             scenario.onActivity { activity ->
                 val view = View(activity)
-                recomposer = view.createLifecycleAwareWindowRecomposer(
-                    lifecycle = lifecycleOwner.lifecycle
-                )
+                recomposer =
+                    view.createLifecycleAwareWindowRecomposer(lifecycle = lifecycleOwner.lifecycle)
                 activity.setContentView(view)
                 (view.parent as ViewGroup).removeView(view)
             }
-            assertNotNull(
-                "recomposer did not join",
-                withTimeoutOrNull(3_000) {
-                    recomposer.join()
-                }
-            )
+            assertNotNull("recomposer did not join", withTimeoutOrNull(3_000) { recomposer.join() })
 
             // LifecycleRegistry enforces main thread checks for observerCount
             withContext(Dispatchers.Main) {
@@ -261,18 +239,12 @@
             scenario.onActivity { activity ->
                 val view = View(activity)
                 val lifecycleOwner = TestLifecycleOwner(Lifecycle.State.RESUMED)
-                recomposer = view.createLifecycleAwareWindowRecomposer(
-                    lifecycle = lifecycleOwner.lifecycle
-                )
+                recomposer =
+                    view.createLifecycleAwareWindowRecomposer(lifecycle = lifecycleOwner.lifecycle)
                 activity.setContentView(view)
                 lifecycleOwner.lifecycle.currentState = Lifecycle.State.DESTROYED
             }
-            assertNotNull(
-                "recomposer did not join",
-                withTimeoutOrNull(3_000) {
-                    recomposer.join()
-                }
-            )
+            assertNotNull("recomposer did not join", withTimeoutOrNull(3_000) { recomposer.join() })
         }
     }
 }
diff --git a/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/platform/WrapperTest.kt b/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/platform/WrapperTest.kt
index 72f913c..de0c6cf 100644
--- a/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/platform/WrapperTest.kt
+++ b/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/platform/WrapperTest.kt
@@ -40,7 +40,8 @@
 import org.junit.Test
 import org.junit.runner.RunWith
 
-@Composable private fun Wrapper(body: @Composable () -> Unit) {
+@Composable
+private fun Wrapper(body: @Composable () -> Unit) {
     body()
 }
 
@@ -75,7 +76,7 @@
                     }
                     DisposableEffect(Unit) {
                         scope.invalidate()
-                        onDispose { }
+                        onDispose {}
                     }
                 }
             }
@@ -96,11 +97,7 @@
             it.setContentView(view)
             view.setViewTreeLifecycleOwner(owner)
             view.setContent {
-                DisposableEffect(Unit) {
-                    onDispose {
-                        disposeLatch.countDown()
-                    }
-                }
+                DisposableEffect(Unit) { onDispose { disposeLatch.countDown() } }
                 composedLatch.countDown()
             }
         }
@@ -127,14 +124,10 @@
                 // the default recomposer factory will install itself at the content view
                 // and use the available ViewTreeLifecycleOwner there. The added layer of
                 // nesting here isolates *only* the ComposeView's lifecycle observation.
-                FrameLayout(it).apply {
-                    addView(view)
-                }
+                FrameLayout(it).apply { addView(view) }
             )
             view.setViewTreeLifecycleOwner(owner)
-            view.setContent {
-                composedLatch.countDown()
-            }
+            view.setContent { composedLatch.countDown() }
         }
 
         assertTrue(composedLatch.await(1, TimeUnit.SECONDS))
diff --git a/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/res/ColorResourcesTest.kt b/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/res/ColorResourcesTest.kt
index c36fcd7..e5a4960 100644
--- a/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/res/ColorResourcesTest.kt
+++ b/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/res/ColorResourcesTest.kt
@@ -33,8 +33,7 @@
 @SmallTest
 class ColorResourcesTest {
 
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
     @Test
     fun colorResourceTest() {
@@ -42,8 +41,7 @@
 
         rule.setContent {
             CompositionLocalProvider(LocalContext provides context) {
-                assertThat(colorResource(R.color.color_resource))
-                    .isEqualTo(Color(0x12345678))
+                assertThat(colorResource(R.color.color_resource)).isEqualTo(Color(0x12345678))
             }
         }
     }
diff --git a/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/res/PrimitiveResourcesTest.kt b/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/res/PrimitiveResourcesTest.kt
index 649b9a4..7f1dbc9 100644
--- a/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/res/PrimitiveResourcesTest.kt
+++ b/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/res/PrimitiveResourcesTest.kt
@@ -33,8 +33,7 @@
 @MediumTest
 class PrimitiveResourcesTest {
 
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
     @Test
     fun integerResourceTest() {
diff --git a/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/res/StringResourcesTest.kt b/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/res/StringResourcesTest.kt
index 15a390e..1b6acb4 100644
--- a/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/res/StringResourcesTest.kt
+++ b/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/res/StringResourcesTest.kt
@@ -46,8 +46,7 @@
     // Constant used for formatting string in test.
     private val FormatValue = 100
 
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
     @Test
     fun stringResource_not_localized_defaultLocale() {
@@ -70,8 +69,7 @@
     @Test
     fun stringResource_localized_defaultLocale() {
         rule.setContent {
-            assertThat(stringResource(R.string.localized))
-                .isEqualTo(DefaultLocalizedText)
+            assertThat(stringResource(R.string.localized)).isEqualTo(DefaultLocalizedText)
         }
     }
 
@@ -81,8 +79,7 @@
             DeviceConfigurationOverride(
                 DeviceConfigurationOverride.Locales(LocaleList(Locale("es-ES")))
             ) {
-                assertThat(stringResource(R.string.localized))
-                    .isEqualTo(SpanishLocalizedText)
+                assertThat(stringResource(R.string.localized)).isEqualTo(SpanishLocalizedText)
             }
         }
     }
diff --git a/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/scrollcapture/ScrollCaptureDrawTest.kt b/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/scrollcapture/ScrollCaptureDrawTest.kt
index fcaecc7..f8b62cdf 100644
--- a/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/scrollcapture/ScrollCaptureDrawTest.kt
+++ b/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/scrollcapture/ScrollCaptureDrawTest.kt
@@ -46,34 +46,30 @@
 @SdkSuppress(minSdkVersion = 31)
 class ScrollCaptureDrawTest {
 
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
     private val captureTester = ScrollCaptureTester(rule)
 
     @Test
-    fun capture_drawsScrollContents_fromTop_withCaptureHeight1px() = captureTester.runTest {
-        val scrollState = ScrollState(0)
-        captureTester.setContent {
-            TestContent(scrollState)
+    fun capture_drawsScrollContents_fromTop_withCaptureHeight1px() =
+        captureTester.runTest {
+            val scrollState = ScrollState(0)
+            captureTester.setContent { TestContent(scrollState) }
+            val target = captureTester.findCaptureTargets().single()
+            val bitmaps = captureTester.captureBitmapsVertically(target, captureHeight = 1)
+            assertThat(bitmaps).hasSize(27)
+            bitmaps.joinVerticallyToBitmap().use { joined ->
+                joined.assertRect(Rect(0, 0, 10, 9), Color.Red)
+                joined.assertRect(Rect(0, 10, 10, 18), Color.Blue)
+                joined.assertRect(Rect(0, 19, 10, 27), Color.Green)
+            }
         }
-        val target = captureTester.findCaptureTargets().single()
-        val bitmaps = captureTester.captureBitmapsVertically(target, captureHeight = 1)
-        assertThat(bitmaps).hasSize(27)
-        bitmaps.joinVerticallyToBitmap().use { joined ->
-            joined.assertRect(Rect(0, 0, 10, 9), Color.Red)
-            joined.assertRect(Rect(0, 10, 10, 18), Color.Blue)
-            joined.assertRect(Rect(0, 19, 10, 27), Color.Green)
-        }
-    }
 
     @Test
     fun capture_drawsScrollContents_fromTop_withCaptureHeightFullViewport() =
         captureTester.runTest {
             val scrollState = ScrollState(0)
-            captureTester.setContent {
-                TestContent(scrollState)
-            }
+            captureTester.setContent { TestContent(scrollState) }
             val target = captureTester.findCaptureTargets().single()
             val bitmaps = captureTester.captureBitmapsVertically(target, captureHeight = 10)
             assertThat(bitmaps).hasSize(3)
@@ -85,30 +81,27 @@
         }
 
     @Test
-    fun capture_drawsScrollContents_fromMiddle_withCaptureHeight1px() = captureTester.runTest {
-        val scrollState = ScrollState(0)
-        captureTester.setContent {
-            TestContent(scrollState)
-        }
+    fun capture_drawsScrollContents_fromMiddle_withCaptureHeight1px() =
+        captureTester.runTest {
+            val scrollState = ScrollState(0)
+            captureTester.setContent { TestContent(scrollState) }
 
-        scrollState.scrollTo(scrollState.maxValue / 2)
+            scrollState.scrollTo(scrollState.maxValue / 2)
 
-        val target = captureTester.findCaptureTargets().single()
-        val bitmaps = captureTester.captureBitmapsVertically(target, captureHeight = 1)
-        bitmaps.joinVerticallyToBitmap().use { joined ->
-            joined.assertRect(Rect(0, 0, 10, 9), Color.Red)
-            joined.assertRect(Rect(0, 10, 10, 18), Color.Blue)
-            joined.assertRect(Rect(0, 19, 10, 27), Color.Green)
+            val target = captureTester.findCaptureTargets().single()
+            val bitmaps = captureTester.captureBitmapsVertically(target, captureHeight = 1)
+            bitmaps.joinVerticallyToBitmap().use { joined ->
+                joined.assertRect(Rect(0, 0, 10, 9), Color.Red)
+                joined.assertRect(Rect(0, 10, 10, 18), Color.Blue)
+                joined.assertRect(Rect(0, 19, 10, 27), Color.Green)
+            }
         }
-    }
 
     @Test
     fun capture_drawsScrollContents_fromMiddle_withCaptureHeightFullViewport() =
         captureTester.runTest {
             val scrollState = ScrollState(0)
-            captureTester.setContent {
-                TestContent(scrollState)
-            }
+            captureTester.setContent { TestContent(scrollState) }
 
             scrollState.scrollTo(scrollState.maxValue / 2)
 
@@ -123,30 +116,27 @@
         }
 
     @Test
-    fun capture_drawsScrollContents_fromBottom_withCaptureHeight1px() = captureTester.runTest {
-        val scrollState = ScrollState(0)
-        captureTester.setContent {
-            TestContent(scrollState)
-        }
+    fun capture_drawsScrollContents_fromBottom_withCaptureHeight1px() =
+        captureTester.runTest {
+            val scrollState = ScrollState(0)
+            captureTester.setContent { TestContent(scrollState) }
 
-        scrollState.scrollTo(scrollState.maxValue)
+            scrollState.scrollTo(scrollState.maxValue)
 
-        val target = captureTester.findCaptureTargets().single()
-        val bitmaps = captureTester.captureBitmapsVertically(target, captureHeight = 1)
-        bitmaps.joinVerticallyToBitmap().use { joined ->
-            joined.assertRect(Rect(0, 0, 10, 9), Color.Red)
-            joined.assertRect(Rect(0, 10, 10, 18), Color.Blue)
-            joined.assertRect(Rect(0, 19, 10, 27), Color.Green)
+            val target = captureTester.findCaptureTargets().single()
+            val bitmaps = captureTester.captureBitmapsVertically(target, captureHeight = 1)
+            bitmaps.joinVerticallyToBitmap().use { joined ->
+                joined.assertRect(Rect(0, 0, 10, 9), Color.Red)
+                joined.assertRect(Rect(0, 10, 10, 18), Color.Blue)
+                joined.assertRect(Rect(0, 19, 10, 27), Color.Green)
+            }
         }
-    }
 
     @Test
     fun capture_drawsScrollContents_fromBottom_withCaptureHeightFullViewport() =
         captureTester.runTest {
             val scrollState = ScrollState(0)
-            captureTester.setContent {
-                TestContent(scrollState)
-            }
+            captureTester.setContent { TestContent(scrollState) }
 
             scrollState.scrollTo(scrollState.maxValue)
 
@@ -161,38 +151,34 @@
         }
 
     @Test
-    fun capture_resetsScrollPosition_from0() = captureTester.runTest {
-        val scrollState = ScrollState(0)
-        captureTester.setContent {
-            TestContent(scrollState)
+    fun capture_resetsScrollPosition_from0() =
+        captureTester.runTest {
+            val scrollState = ScrollState(0)
+            captureTester.setContent { TestContent(scrollState) }
+            val target = captureTester.findCaptureTargets().single()
+            val bitmaps = captureTester.captureBitmapsVertically(target, captureHeight = 10)
+            bitmaps.forEach { it.recycle() }
+            rule.awaitIdle()
+            assertThat(scrollState.value).isEqualTo(0)
         }
-        val target = captureTester.findCaptureTargets().single()
-        val bitmaps = captureTester.captureBitmapsVertically(target, captureHeight = 10)
-        bitmaps.forEach { it.recycle() }
-        rule.awaitIdle()
-        assertThat(scrollState.value).isEqualTo(0)
-    }
 
     @Test
-    fun capture_resetsScrollPosition_fromNonZero() = captureTester.runTest {
-        val scrollState = ScrollState(5)
-        captureTester.setContent {
-            TestContent(scrollState)
+    fun capture_resetsScrollPosition_fromNonZero() =
+        captureTester.runTest {
+            val scrollState = ScrollState(5)
+            captureTester.setContent { TestContent(scrollState) }
+            val target = captureTester.findCaptureTargets().single()
+            val bitmaps = captureTester.captureBitmapsVertically(target, captureHeight = 10)
+            bitmaps.forEach { it.recycle() }
+            rule.awaitIdle()
+            assertThat(scrollState.value).isEqualTo(5)
         }
-        val target = captureTester.findCaptureTargets().single()
-        val bitmaps = captureTester.captureBitmapsVertically(target, captureHeight = 10)
-        bitmaps.forEach { it.recycle() }
-        rule.awaitIdle()
-        assertThat(scrollState.value).isEqualTo(5)
-    }
 
     @Test
     fun capture_drawsScrollContents_fromTop_withCaptureHeightFullViewport_reverseScrolling() =
         captureTester.runTest {
             val scrollState = ScrollState(0)
-            captureTester.setContent {
-                TestContent(scrollState, reverseScrolling = true)
-            }
+            captureTester.setContent { TestContent(scrollState, reverseScrolling = true) }
             val target = captureTester.findCaptureTargets().single()
             val bitmaps = captureTester.captureBitmapsVertically(target, captureHeight = 10)
             assertThat(bitmaps).hasSize(3)
@@ -207,9 +193,7 @@
     fun capture_drawsScrollContents_fromMiddle_withCaptureHeightFullViewport_reverseScrolling() =
         captureTester.runTest {
             val scrollState = ScrollState(0)
-            captureTester.setContent {
-                TestContent(scrollState, reverseScrolling = true)
-            }
+            captureTester.setContent { TestContent(scrollState, reverseScrolling = true) }
 
             scrollState.scrollTo(scrollState.maxValue / 2)
 
@@ -227,9 +211,7 @@
     fun capture_drawsScrollContents_fromBottom_withCaptureHeightFullViewport_reverseScrolling() =
         captureTester.runTest {
             val scrollState = ScrollState(0)
-            captureTester.setContent {
-                TestContent(scrollState, reverseScrolling = true)
-            }
+            captureTester.setContent { TestContent(scrollState, reverseScrolling = true) }
 
             scrollState.scrollTo(scrollState.maxValue)
 
@@ -244,30 +226,28 @@
         }
 
     @Test
-    fun capture_resetsScrollPosition_from0_reverseScrolling() = captureTester.runTest {
-        val scrollState = ScrollState(0)
-        captureTester.setContent {
-            TestContent(scrollState, reverseScrolling = true)
+    fun capture_resetsScrollPosition_from0_reverseScrolling() =
+        captureTester.runTest {
+            val scrollState = ScrollState(0)
+            captureTester.setContent { TestContent(scrollState, reverseScrolling = true) }
+            val target = captureTester.findCaptureTargets().single()
+            val bitmaps = captureTester.captureBitmapsVertically(target, captureHeight = 10)
+            bitmaps.forEach { it.recycle() }
+            rule.awaitIdle()
+            assertThat(scrollState.value).isEqualTo(0)
         }
-        val target = captureTester.findCaptureTargets().single()
-        val bitmaps = captureTester.captureBitmapsVertically(target, captureHeight = 10)
-        bitmaps.forEach { it.recycle() }
-        rule.awaitIdle()
-        assertThat(scrollState.value).isEqualTo(0)
-    }
 
     @Test
-    fun capture_resetsScrollPosition_fromNonZero_reverseScrolling() = captureTester.runTest {
-        val scrollState = ScrollState(5)
-        captureTester.setContent {
-            TestContent(scrollState, reverseScrolling = true)
+    fun capture_resetsScrollPosition_fromNonZero_reverseScrolling() =
+        captureTester.runTest {
+            val scrollState = ScrollState(5)
+            captureTester.setContent { TestContent(scrollState, reverseScrolling = true) }
+            val target = captureTester.findCaptureTargets().single()
+            val bitmaps = captureTester.captureBitmapsVertically(target, captureHeight = 10)
+            bitmaps.forEach { it.recycle() }
+            rule.awaitIdle()
+            assertThat(scrollState.value).isEqualTo(5)
         }
-        val target = captureTester.findCaptureTargets().single()
-        val bitmaps = captureTester.captureBitmapsVertically(target, captureHeight = 10)
-        bitmaps.forEach { it.recycle() }
-        rule.awaitIdle()
-        assertThat(scrollState.value).isEqualTo(5)
-    }
 
     @Composable
     private fun TestContent(
@@ -276,28 +256,12 @@
     ) {
         with(LocalDensity.current) {
             Column(
-                Modifier
-                    .size(10.toDp())
+                Modifier.size(10.toDp())
                     .verticalScroll(scrollState, reverseScrolling = reverseScrolling)
             ) {
-                Box(
-                    Modifier
-                        .background(Color.Red)
-                        .height(9.toDp())
-                        .fillMaxWidth()
-                )
-                Box(
-                    Modifier
-                        .background(Color.Blue)
-                        .height(9.toDp())
-                        .fillMaxWidth()
-                )
-                Box(
-                    Modifier
-                        .background(Color.Green)
-                        .height(9.toDp())
-                        .fillMaxWidth()
-                )
+                Box(Modifier.background(Color.Red).height(9.toDp()).fillMaxWidth())
+                Box(Modifier.background(Color.Blue).height(9.toDp()).fillMaxWidth())
+                Box(Modifier.background(Color.Green).height(9.toDp()).fillMaxWidth())
             }
         }
     }
diff --git a/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/scrollcapture/ScrollCaptureIntegrationTest.kt b/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/scrollcapture/ScrollCaptureIntegrationTest.kt
index f4affa2..55bc110 100644
--- a/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/scrollcapture/ScrollCaptureIntegrationTest.kt
+++ b/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/scrollcapture/ScrollCaptureIntegrationTest.kt
@@ -58,280 +58,250 @@
 import org.junit.Test
 import org.junit.runner.RunWith
 
-/**
- * Tests real Foundation scrollable components' integration with scroll capture.
- */
+/** Tests real Foundation scrollable components' integration with scroll capture. */
 @MediumTest
 @RunWith(AndroidJUnit4::class)
 @SdkSuppress(minSdkVersion = 31)
 class ScrollCaptureIntegrationTest {
 
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
     private val captureTester = ScrollCaptureTester(rule)
 
     @Test
-    fun search_finds_verticalScrollModifier() = captureTester.runTest {
-        captureTester.setContent {
-            with(LocalDensity.current) {
-                Box(
-                    Modifier
-                        .size(10.toDp())
-                        .verticalScroll(rememberScrollState())
-                ) {
-                    Box(Modifier.size(100.toDp()))
-                }
-            }
-        }
-
-        val targets = captureTester.findCaptureTargets()
-        assertThat(targets).hasSize(1)
-        val target = targets.single()
-        assertThat(target.localVisibleRect.width()).isEqualTo(10)
-        assertThat(target.localVisibleRect.height()).isEqualTo(10)
-    }
-
-    @Test
-    fun search_doesNotFind_horizontalScrollModifier() = captureTester.runTest {
-        captureTester.setContent {
-            with(LocalDensity.current) {
-                Box(
-                    Modifier
-                        .size(10.toDp())
-                        .horizontalScroll(rememberScrollState())
-                ) {
-                    Box(Modifier.size(100.toDp()))
-                }
-            }
-        }
-
-        val targets = captureTester.findCaptureTargets()
-        assertThat(targets).isEmpty()
-    }
-
-    @Test
-    fun search_finds_LazyColumn() = captureTester.runTest {
-        captureTester.setContent {
-            with(LocalDensity.current) {
-                LazyColumn(Modifier.size(10.toDp())) {
-                    item {
+    fun search_finds_verticalScrollModifier() =
+        captureTester.runTest {
+            captureTester.setContent {
+                with(LocalDensity.current) {
+                    Box(Modifier.size(10.toDp()).verticalScroll(rememberScrollState())) {
                         Box(Modifier.size(100.toDp()))
                     }
                 }
             }
+
+            val targets = captureTester.findCaptureTargets()
+            assertThat(targets).hasSize(1)
+            val target = targets.single()
+            assertThat(target.localVisibleRect.width()).isEqualTo(10)
+            assertThat(target.localVisibleRect.height()).isEqualTo(10)
         }
 
-        val targets = captureTester.findCaptureTargets()
-        assertThat(targets).hasSize(1)
-        val target = targets.single()
-        assertThat(target.localVisibleRect.width()).isEqualTo(10)
-        assertThat(target.localVisibleRect.height()).isEqualTo(10)
-    }
-
     @Test
-    fun search_doesNotFind_LazyRow() = captureTester.runTest {
-        captureTester.setContent {
-            with(LocalDensity.current) {
-                LazyRow(Modifier.size(10.toDp())) {
-                    item {
+    fun search_doesNotFind_horizontalScrollModifier() =
+        captureTester.runTest {
+            captureTester.setContent {
+                with(LocalDensity.current) {
+                    Box(Modifier.size(10.toDp()).horizontalScroll(rememberScrollState())) {
                         Box(Modifier.size(100.toDp()))
                     }
                 }
             }
+
+            val targets = captureTester.findCaptureTargets()
+            assertThat(targets).isEmpty()
         }
 
-        val targets = captureTester.findCaptureTargets()
-        assertThat(targets).isEmpty()
-    }
-
     @Test
-    fun search_finds_LazyVerticalGrid() = captureTester.runTest {
-        captureTester.setContent {
-            with(LocalDensity.current) {
-                LazyVerticalGrid(
-                    columns = GridCells.Fixed(1),
-                    modifier = Modifier.size(10.toDp())
-                ) {
-                    item { Box(Modifier.size(100.toDp())) }
+    fun search_finds_LazyColumn() =
+        captureTester.runTest {
+            captureTester.setContent {
+                with(LocalDensity.current) {
+                    LazyColumn(Modifier.size(10.toDp())) { item { Box(Modifier.size(100.toDp())) } }
                 }
             }
+
+            val targets = captureTester.findCaptureTargets()
+            assertThat(targets).hasSize(1)
+            val target = targets.single()
+            assertThat(target.localVisibleRect.width()).isEqualTo(10)
+            assertThat(target.localVisibleRect.height()).isEqualTo(10)
         }
 
-        val targets = captureTester.findCaptureTargets()
-        assertThat(targets).hasSize(1)
-        val target = targets.single()
-        assertThat(target.localVisibleRect.width()).isEqualTo(10)
-        assertThat(target.localVisibleRect.height()).isEqualTo(10)
-    }
-
     @Test
-    fun search_finds_LazyVerticalStaggeredGrid() = captureTester.runTest {
-        captureTester.setContent {
-            with(LocalDensity.current) {
-                LazyVerticalStaggeredGrid(
-                    columns = StaggeredGridCells.Fixed(1),
-                    modifier = Modifier.size(10.toDp())
-                ) {
-                    item { Box(Modifier.size(100.toDp())) }
+    fun search_doesNotFind_LazyRow() =
+        captureTester.runTest {
+            captureTester.setContent {
+                with(LocalDensity.current) {
+                    LazyRow(Modifier.size(10.toDp())) { item { Box(Modifier.size(100.toDp())) } }
                 }
             }
-        }
 
-        val targets = captureTester.findCaptureTargets()
-        assertThat(targets).hasSize(1)
-        val target = targets.single()
-        assertThat(target.localVisibleRect.width()).isEqualTo(10)
-        assertThat(target.localVisibleRect.height()).isEqualTo(10)
-    }
+            val targets = captureTester.findCaptureTargets()
+            assertThat(targets).isEmpty()
+        }
 
     @Test
-    fun search_doesNotFind_TextField1_singleLine() = captureTester.runTest {
-        captureTester.setContent {
-            BasicTextField(
-                "really long value to ensure that the field will scroll horizontally",
-                onValueChange = {},
-                singleLine = true,
-                modifier = Modifier.width(5.dp),
-            )
-        }
+    fun search_finds_LazyVerticalGrid() =
+        captureTester.runTest {
+            captureTester.setContent {
+                with(LocalDensity.current) {
+                    LazyVerticalGrid(
+                        columns = GridCells.Fixed(1),
+                        modifier = Modifier.size(10.toDp())
+                    ) {
+                        item { Box(Modifier.size(100.toDp())) }
+                    }
+                }
+            }
 
-        val targets = captureTester.findCaptureTargets()
-        assertThat(targets.isEmpty())
-    }
+            val targets = captureTester.findCaptureTargets()
+            assertThat(targets).hasSize(1)
+            val target = targets.single()
+            assertThat(target.localVisibleRect.width()).isEqualTo(10)
+            assertThat(target.localVisibleRect.height()).isEqualTo(10)
+        }
 
     @Test
-    fun search_doesNotFind_TextField1_multiLine_scrollable() = captureTester.runTest {
-        captureTester.setContent {
-            BasicTextField(
-                "lots\n\nof\n\nnewlines\n\nto\n\nmake\n\nvertically\n\nscrollable",
-                onValueChange = {},
-                singleLine = false,
-                maxLines = 2
-            )
-        }
+    fun search_finds_LazyVerticalStaggeredGrid() =
+        captureTester.runTest {
+            captureTester.setContent {
+                with(LocalDensity.current) {
+                    LazyVerticalStaggeredGrid(
+                        columns = StaggeredGridCells.Fixed(1),
+                        modifier = Modifier.size(10.toDp())
+                    ) {
+                        item { Box(Modifier.size(100.toDp())) }
+                    }
+                }
+            }
 
-        val targets = captureTester.findCaptureTargets()
-        assertThat(targets.isEmpty())
-    }
+            val targets = captureTester.findCaptureTargets()
+            assertThat(targets).hasSize(1)
+            val target = targets.single()
+            assertThat(target.localVisibleRect.width()).isEqualTo(10)
+            assertThat(target.localVisibleRect.height()).isEqualTo(10)
+        }
 
     @Test
-    fun search_doesNotFind_TextField2_singleLine() = captureTester.runTest {
-        val state =
-            TextFieldState("really long value to ensure that the field will scroll horizontally")
-        captureTester.setContent {
-            BasicTextField(
-                state,
-                lineLimits = TextFieldLineLimits.SingleLine,
-                modifier = Modifier.width(5.dp),
-            )
-        }
+    fun search_doesNotFind_TextField1_singleLine() =
+        captureTester.runTest {
+            captureTester.setContent {
+                BasicTextField(
+                    "really long value to ensure that the field will scroll horizontally",
+                    onValueChange = {},
+                    singleLine = true,
+                    modifier = Modifier.width(5.dp),
+                )
+            }
 
-        val targets = captureTester.findCaptureTargets()
-        assertThat(targets.isEmpty())
-    }
+            val targets = captureTester.findCaptureTargets()
+            assertThat(targets.isEmpty())
+        }
 
     @Test
-    fun search_doesNotFind_TextField2_multiLine_scrollable() = captureTester.runTest {
-        val state =
-            TextFieldState("lots\n\nof\n\nnewlines\n\nto\n\nmake\n\nvertically\n\nscrollable")
-        captureTester.setContent {
-            BasicTextField(
-                state,
-                lineLimits = TextFieldLineLimits.MultiLine(maxHeightInLines = 2)
-            )
+    fun search_doesNotFind_TextField1_multiLine_scrollable() =
+        captureTester.runTest {
+            captureTester.setContent {
+                BasicTextField(
+                    "lots\n\nof\n\nnewlines\n\nto\n\nmake\n\nvertically\n\nscrollable",
+                    onValueChange = {},
+                    singleLine = false,
+                    maxLines = 2
+                )
+            }
+
+            val targets = captureTester.findCaptureTargets()
+            assertThat(targets.isEmpty())
         }
 
-        val targets = captureTester.findCaptureTargets()
-        assertThat(targets.isEmpty())
-    }
+    @Test
+    fun search_doesNotFind_TextField2_singleLine() =
+        captureTester.runTest {
+            val state =
+                TextFieldState(
+                    "really long value to ensure that the field will scroll horizontally"
+                )
+            captureTester.setContent {
+                BasicTextField(
+                    state,
+                    lineLimits = TextFieldLineLimits.SingleLine,
+                    modifier = Modifier.width(5.dp),
+                )
+            }
+
+            val targets = captureTester.findCaptureTargets()
+            assertThat(targets.isEmpty())
+        }
+
+    @Test
+    fun search_doesNotFind_TextField2_multiLine_scrollable() =
+        captureTester.runTest {
+            val state =
+                TextFieldState("lots\n\nof\n\nnewlines\n\nto\n\nmake\n\nvertically\n\nscrollable")
+            captureTester.setContent {
+                BasicTextField(
+                    state,
+                    lineLimits = TextFieldLineLimits.MultiLine(maxHeightInLines = 2)
+                )
+            }
+
+            val targets = captureTester.findCaptureTargets()
+            assertThat(targets.isEmpty())
+        }
 
     @OptIn(ExperimentalFoundationApi::class)
     @Test
-    fun capture_LazyColumn_stickyHeadersDisabled_byLayout() = captureTester.runTest {
-        val headerHeight = 5
-        val state = LazyListState()
-        var firstHeaderCoords by mutableStateOf<LayoutCoordinates?>(null, neverEqualPolicy())
-        var firstItemCoords by mutableStateOf<LayoutCoordinates?>(null, neverEqualPolicy())
+    fun capture_LazyColumn_stickyHeadersDisabled_byLayout() =
+        captureTester.runTest {
+            val headerHeight = 5
+            val state = LazyListState()
+            var firstHeaderCoords by mutableStateOf<LayoutCoordinates?>(null, neverEqualPolicy())
+            var firstItemCoords by mutableStateOf<LayoutCoordinates?>(null, neverEqualPolicy())
 
-        fun assertHeaderNotStuck() {
-            val headerBounds = firstHeaderCoords
-                ?.takeIf { it.isAttached }
-                ?.boundsInParent()
-                ?: return
-            val itemBounds = firstItemCoords
-                ?.takeIf { it.isAttached }
-                ?.boundsInParent()
-                ?: return
-            assertThat(headerBounds.bottom).isEqualTo(itemBounds.top)
-        }
+            fun assertHeaderNotStuck() {
+                val headerBounds =
+                    firstHeaderCoords?.takeIf { it.isAttached }?.boundsInParent() ?: return
+                val itemBounds =
+                    firstItemCoords?.takeIf { it.isAttached }?.boundsInParent() ?: return
+                assertThat(headerBounds.bottom).isEqualTo(itemBounds.top)
+            }
 
-        captureTester.setContent {
-            with(LocalDensity.current) {
-                LazyColumn(
-                    state = state,
-                    modifier = Modifier.size(10.toDp())
-                ) {
-                    stickyHeader {
-                        Box(
-                            Modifier
-                                .background(Color.Red)
-                                .fillMaxWidth()
-                                .height(headerHeight.toDp())
-                                .onGloballyPositioned { firstHeaderCoords = it }
-                        )
-                        DisposableEffect(Unit) {
-                            onDispose {
-                                firstHeaderCoords = null
-                            }
+            captureTester.setContent {
+                with(LocalDensity.current) {
+                    LazyColumn(state = state, modifier = Modifier.size(10.toDp())) {
+                        stickyHeader {
+                            Box(
+                                Modifier.background(Color.Red)
+                                    .fillMaxWidth()
+                                    .height(headerHeight.toDp())
+                                    .onGloballyPositioned { firstHeaderCoords = it }
+                            )
+                            DisposableEffect(Unit) { onDispose { firstHeaderCoords = null } }
                         }
-                    }
-                    item {
-                        Box(
-                            Modifier
-                                .background(Color.Green)
-                                .size(10.toDp())
-                                .onGloballyPositioned { firstItemCoords = it }
-                        )
-                        DisposableEffect(Unit) {
-                            onDispose {
-                                firstItemCoords = null
-                            }
+                        item {
+                            Box(
+                                Modifier.background(Color.Green)
+                                    .size(10.toDp())
+                                    .onGloballyPositioned { firstItemCoords = it }
+                            )
+                            DisposableEffect(Unit) { onDispose { firstItemCoords = null } }
                         }
-                    }
 
-                    stickyHeader {
-                        Box(
-                            Modifier
-                                .background(Color.Red)
-                                .fillMaxWidth()
-                                .height(headerHeight.toDp())
-                        )
-                    }
-                    item {
-                        Box(
-                            Modifier
-                                .background(Color.Green)
-                                .size(10.toDp())
-                        )
+                        stickyHeader {
+                            Box(
+                                Modifier.background(Color.Red)
+                                    .fillMaxWidth()
+                                    .height(headerHeight.toDp())
+                            )
+                        }
+                        item { Box(Modifier.background(Color.Green).size(10.toDp())) }
                     }
                 }
             }
-        }
 
-        // Sticky headers render correctly trivially when starting from the top, so we need to
-        // start a bit down the list.
-        rule.awaitIdle()
-        val scrolled = state.scrollBy(100f)
+            // Sticky headers render correctly trivially when starting from the top, so we need to
+            // start a bit down the list.
+            rule.awaitIdle()
+            val scrolled = state.scrollBy(100f)
 
-        val target = captureTester.findCaptureTargets().single()
-        captureTester.capture(target, captureWindowHeight = 1) {
-            repeat(scrolled.toInt()) {
-                shiftWindowBy(-1)
-                performCaptureDiscardingBitmap()
-                rule.awaitIdle()
-                assertHeaderNotStuck()
+            val target = captureTester.findCaptureTargets().single()
+            captureTester.capture(target, captureWindowHeight = 1) {
+                repeat(scrolled.toInt()) {
+                    shiftWindowBy(-1)
+                    performCaptureDiscardingBitmap()
+                    rule.awaitIdle()
+                    assertHeaderNotStuck()
+                }
             }
         }
-    }
 }
diff --git a/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/scrollcapture/ScrollCaptureTest.kt b/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/scrollcapture/ScrollCaptureTest.kt
index 9232f12..55110c8 100644
--- a/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/scrollcapture/ScrollCaptureTest.kt
+++ b/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/scrollcapture/ScrollCaptureTest.kt
@@ -64,312 +64,303 @@
 @SdkSuppress(minSdkVersion = 31)
 class ScrollCaptureTest {
 
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
     private val captureTester = ScrollCaptureTester(rule)
 
     @Test
-    fun search_findsScrollableTarget() = captureTester.runTest {
-        lateinit var coordinates: LayoutCoordinates
-        captureTester.setContent {
-            TestVerticalScrollable(
-                size = 10,
-                maxValue = 1f,
-                modifier = Modifier.onPlaced { coordinates = it }
-            )
-        }
-
-        val targets = captureTester.findCaptureTargets()
-        assertThat(targets).hasSize(1)
-        val target = targets.single()
-        assertThat(target.hint).isEqualTo(0)
-        assertThat(target.localVisibleRect).isEqualTo(Rect(0, 0, 10, 10))
-        assertThat(target.positionInWindow)
-            .isEqualTo(coordinates.positionInWindow().roundToPoint())
-        assertThat(target.scrollBounds).isEqualTo(Rect(0, 0, 10, 10))
-    }
-
-    @Test
-    fun search_usesTargetsCoordinates() = captureTester.runTest {
-        lateinit var coordinates: LayoutCoordinates
-        val padding = 15
-        captureTester.setContent {
-            Box(Modifier
-                .onPlaced { coordinates = it }
-                .padding(with(LocalDensity.current) { padding.toDp() })
-            ) {
-                TestVerticalScrollable(
-                    size = 10,
-                    maxValue = 1f,
-                )
-            }
-        }
-
-        val targets = captureTester.findCaptureTargets()
-        assertThat(targets).hasSize(1)
-        val target = targets.single()
-        // Relative to the View, i.e. the root of the composition.
-        assertThat(target.localVisibleRect)
-            .isEqualTo(Rect(padding, padding, padding + 10, padding + 10))
-        assertThat(target.positionInWindow)
-            .isEqualTo(
-                (coordinates.positionInWindow() +
-                    Offset(padding.toFloat(), padding.toFloat())
-                    ).roundToPoint()
-            )
-        assertThat(target.scrollBounds)
-            .isEqualTo(Rect(padding, padding, padding + 10, padding + 10))
-    }
-
-    @Test
-    fun search_findsLargestTarget_whenMultipleMatches() = captureTester.runTest {
-        val smallerSize = 10
-        val largerSize = 11
-        captureTester.setContent {
-            Column {
-                TestVerticalScrollable(size = smallerSize)
-                TestVerticalScrollable(size = largerSize)
-            }
-        }
-
-        val targets = captureTester.findCaptureTargets()
-        assertThat(targets).hasSize(1)
-        val target = targets.single()
-        assertThat(target.localVisibleRect)
-            .isEqualTo(Rect(0, smallerSize, largerSize, smallerSize + largerSize))
-    }
-
-    @Test
-    fun search_findsDeepestTarget() = captureTester.runTest {
-        captureTester.setContent {
-            TestVerticalScrollable(size = 11) {
-                TestVerticalScrollable(size = 10)
-            }
-        }
-
-        val targets = captureTester.findCaptureTargets()
-        assertThat(targets).hasSize(1)
-        val target = targets.single()
-        assertThat(target.localVisibleRect).isEqualTo(Rect(0, 0, 10, 10))
-    }
-
-    @Test
-    fun search_findsDeepestTarget_whenLargerParentSibling() = captureTester.runTest {
-        captureTester.setContent {
-            Column {
-                TestVerticalScrollable(size = 10) {
-                    TestVerticalScrollable(size = 9)
-                }
-                TestVerticalScrollable(size = 11)
-            }
-        }
-
-        val targets = captureTester.findCaptureTargets()
-        assertThat(targets).hasSize(1)
-        val target = targets.single()
-        assertThat(target.localVisibleRect).isEqualTo(Rect(0, 0, 9, 9))
-    }
-
-    @Test
-    fun search_findsDeepestLargestTarget_whenMultipleMatches() = captureTester.runTest {
-        captureTester.setContent {
-            Column {
-                TestVerticalScrollable(size = 10) {
-                    TestVerticalScrollable(size = 9)
-                }
-                TestVerticalScrollable(size = 10) {
-                    TestVerticalScrollable(size = 8)
-                }
-            }
-        }
-
-        val targets = captureTester.findCaptureTargets()
-        assertThat(targets).hasSize(1)
-        val target = targets.single()
-        assertThat(target.localVisibleRect).isEqualTo(Rect(0, 0, 9, 9))
-    }
-
-    @Test
-    fun search_usesClippedSize() = captureTester.runTest {
-        captureTester.setContent {
-            TestVerticalScrollable(size = 10) {
-                TestVerticalScrollable(size = 100)
-            }
-        }
-
-        val targets = captureTester.findCaptureTargets()
-        assertThat(targets).hasSize(1)
-        val target = targets.single()
-        assertThat(target.localVisibleRect).isEqualTo(Rect(0, 0, 10, 10))
-    }
-
-    @Test
-    fun search_doesNotFindTarget_whenInvisibleToUser() = captureTester.runTest {
-        captureTester.setContent {
-            TestVerticalScrollable(Modifier.semantics {
-                invisibleToUser()
-            })
-        }
-
-        val targets = captureTester.findCaptureTargets()
-        assertThat(targets).isEmpty()
-    }
-
-    @Test
-    fun search_doesNotFindTarget_whenZeroSize() = captureTester.runTest {
-        captureTester.setContent {
-            TestVerticalScrollable(Modifier.size(0.dp))
-        }
-
-        val targets = captureTester.findCaptureTargets()
-        assertThat(targets).isEmpty()
-    }
-
-    @Test
-    fun search_doesNotFindTarget_whenZeroMaxValue() = captureTester.runTest {
-        captureTester.setContent {
-            TestVerticalScrollable(maxValue = 0f)
-        }
-
-        val targets = captureTester.findCaptureTargets()
-        assertThat(targets).isEmpty()
-    }
-
-    @Test
-    fun search_doesNotFindTarget_whenNoScrollAxisRange() = captureTester.runTest {
-        captureTester.setContent {
-            Box(
-                Modifier
-                    .size(10.dp)
-                    .semantics {
-                        scrollByOffset { Offset.Zero }
-                    }
-            )
-        }
-
-        val targets = captureTester.findCaptureTargets()
-        assertThat(targets).isEmpty()
-    }
-
-    @Test
-    fun search_doesNotFindTarget_whenNoVerticalScrollAxisRange() = captureTester.runTest {
-        captureTester.setContent {
-            Box(
-                Modifier
-                    .size(10.dp)
-                    .semantics {
-                        scrollByOffset { Offset.Zero }
-                        horizontalScrollAxisRange = ScrollAxisRange(
-                            value = { 0f },
-                            maxValue = { 1f },
-                        )
-                    }
-            )
-        }
-
-        val targets = captureTester.findCaptureTargets()
-        assertThat(targets).isEmpty()
-    }
-
-    @Test
-    fun search_doesNotFindTarget_whenNoScrollByImmediately() = captureTester.runTest {
-        captureTester.setContent {
-            Box(
-                Modifier
-                    .size(10.dp)
-                    .semantics {
-                        verticalScrollAxisRange = ScrollAxisRange(
-                            value = { 0f },
-                            maxValue = { 1f },
-                        )
-                    }
-            )
-        }
-
-        val targets = captureTester.findCaptureTargets()
-        assertThat(targets).isEmpty()
-    }
-
-    @Test
-    fun callbackOnSearch_returnsViewportBounds() = captureTester.runTest {
-        lateinit var coordinates: LayoutCoordinates
-        val padding = 15
-        captureTester.setContent {
-            Box(Modifier
-                .onPlaced { coordinates = it }
-                .padding(with(LocalDensity.current) { padding.toDp() })
-            ) {
-                TestVerticalScrollable(
-                    size = 10,
-                    maxValue = 1f,
-                )
-            }
-        }
-
-        val callback = captureTester.findCaptureTargets().single().callback
-
-        launch {
-            val result = callback.onScrollCaptureSearch()
-
-            // Search result is in window coordinates.
-            assertThat(result).isEqualTo(
-                Rect(
-                    coordinates.positionInWindow().x.roundToInt() + padding,
-                    coordinates.positionInWindow().y.roundToInt() + padding,
-                    coordinates.positionInWindow().x.roundToInt() + padding + 10,
-                    coordinates.positionInWindow().y.roundToInt() + padding + 10
-                )
-            )
-        }
-    }
-
-    @Test
-    fun callbackOnImageCapture_scrollsBackwardsThenForwards() = captureTester.runTest {
-        expectingScrolls(rule) {
-            val size = 10
-            val captureHeight = size / 2
+    fun search_findsScrollableTarget() =
+        captureTester.runTest {
+            lateinit var coordinates: LayoutCoordinates
             captureTester.setContent {
                 TestVerticalScrollable(
-                    size = size,
-                    // Can't be a reference, see https://youtrack.jetbrains.com/issue/KT-49665
-                    onScrollByOffset = { respondToScrollExpectation(it) }
+                    size = 10,
+                    maxValue = 1f,
+                    modifier = Modifier.onPlaced { coordinates = it }
                 )
             }
 
-            val target = captureTester.findCaptureTargets().single()
-            captureTester.capture(target, captureHeight) {
-                // First request is at origin, no scrolling required.
-                assertThat(performCaptureDiscardingBitmap()).isEqualTo(Rect(0, 0, 10, 5))
-                assertNoPendingScrollRequests()
-
-                // Back one half-page, but only respond to part of it.
-                expectScrollRequest(Offset(0f, -5f), consume = Offset(0f, -4f))
-                shiftWindowBy(-5)
-                assertThat(performCaptureDiscardingBitmap()).isEqualTo(Rect(0, -4, 10, 0))
-
-                // Forward one half-page – already in viewport, no scrolling required.
-                shiftWindowBy(5)
-                assertThat(performCaptureDiscardingBitmap()).isEqualTo(Rect(0, 0, 10, 5))
-                assertNoPendingScrollRequests()
-
-                // Forward another half-page. This time we need to scroll.
-                expectScrollRequest(Offset(0f, 4f))
-                shiftWindowBy(5)
-                assertThat(performCaptureDiscardingBitmap()).isEqualTo(Rect(0, 5, 10, 10))
-
-                // Forward another half-page, scroll again so now we're past the original viewport.
-                expectScrollRequest(Offset(0f, 5f))
-                shiftWindowBy(5)
-                assertThat(performCaptureDiscardingBitmap()).isEqualTo(Rect(0, 10, 10, 15))
-
-                // When capture ends expect one last scroll request to reset to original offset.
-                // Note that this request will be made _after_ this capture{} lambda returns.
-                expectScrollRequest(Offset(0f, -5f))
-            }
-            assertNoPendingScrollRequests()
+            val targets = captureTester.findCaptureTargets()
+            assertThat(targets).hasSize(1)
+            val target = targets.single()
+            assertThat(target.hint).isEqualTo(0)
+            assertThat(target.localVisibleRect).isEqualTo(Rect(0, 0, 10, 10))
+            assertThat(target.positionInWindow)
+                .isEqualTo(coordinates.positionInWindow().roundToPoint())
+            assertThat(target.scrollBounds).isEqualTo(Rect(0, 0, 10, 10))
         }
-    }
+
+    @Test
+    fun search_usesTargetsCoordinates() =
+        captureTester.runTest {
+            lateinit var coordinates: LayoutCoordinates
+            val padding = 15
+            captureTester.setContent {
+                Box(
+                    Modifier.onPlaced { coordinates = it }
+                        .padding(with(LocalDensity.current) { padding.toDp() })
+                ) {
+                    TestVerticalScrollable(
+                        size = 10,
+                        maxValue = 1f,
+                    )
+                }
+            }
+
+            val targets = captureTester.findCaptureTargets()
+            assertThat(targets).hasSize(1)
+            val target = targets.single()
+            // Relative to the View, i.e. the root of the composition.
+            assertThat(target.localVisibleRect)
+                .isEqualTo(Rect(padding, padding, padding + 10, padding + 10))
+            assertThat(target.positionInWindow)
+                .isEqualTo(
+                    (coordinates.positionInWindow() + Offset(padding.toFloat(), padding.toFloat()))
+                        .roundToPoint()
+                )
+            assertThat(target.scrollBounds)
+                .isEqualTo(Rect(padding, padding, padding + 10, padding + 10))
+        }
+
+    @Test
+    fun search_findsLargestTarget_whenMultipleMatches() =
+        captureTester.runTest {
+            val smallerSize = 10
+            val largerSize = 11
+            captureTester.setContent {
+                Column {
+                    TestVerticalScrollable(size = smallerSize)
+                    TestVerticalScrollable(size = largerSize)
+                }
+            }
+
+            val targets = captureTester.findCaptureTargets()
+            assertThat(targets).hasSize(1)
+            val target = targets.single()
+            assertThat(target.localVisibleRect)
+                .isEqualTo(Rect(0, smallerSize, largerSize, smallerSize + largerSize))
+        }
+
+    @Test
+    fun search_findsDeepestTarget() =
+        captureTester.runTest {
+            captureTester.setContent {
+                TestVerticalScrollable(size = 11) { TestVerticalScrollable(size = 10) }
+            }
+
+            val targets = captureTester.findCaptureTargets()
+            assertThat(targets).hasSize(1)
+            val target = targets.single()
+            assertThat(target.localVisibleRect).isEqualTo(Rect(0, 0, 10, 10))
+        }
+
+    @Test
+    fun search_findsDeepestTarget_whenLargerParentSibling() =
+        captureTester.runTest {
+            captureTester.setContent {
+                Column {
+                    TestVerticalScrollable(size = 10) { TestVerticalScrollable(size = 9) }
+                    TestVerticalScrollable(size = 11)
+                }
+            }
+
+            val targets = captureTester.findCaptureTargets()
+            assertThat(targets).hasSize(1)
+            val target = targets.single()
+            assertThat(target.localVisibleRect).isEqualTo(Rect(0, 0, 9, 9))
+        }
+
+    @Test
+    fun search_findsDeepestLargestTarget_whenMultipleMatches() =
+        captureTester.runTest {
+            captureTester.setContent {
+                Column {
+                    TestVerticalScrollable(size = 10) { TestVerticalScrollable(size = 9) }
+                    TestVerticalScrollable(size = 10) { TestVerticalScrollable(size = 8) }
+                }
+            }
+
+            val targets = captureTester.findCaptureTargets()
+            assertThat(targets).hasSize(1)
+            val target = targets.single()
+            assertThat(target.localVisibleRect).isEqualTo(Rect(0, 0, 9, 9))
+        }
+
+    @Test
+    fun search_usesClippedSize() =
+        captureTester.runTest {
+            captureTester.setContent {
+                TestVerticalScrollable(size = 10) { TestVerticalScrollable(size = 100) }
+            }
+
+            val targets = captureTester.findCaptureTargets()
+            assertThat(targets).hasSize(1)
+            val target = targets.single()
+            assertThat(target.localVisibleRect).isEqualTo(Rect(0, 0, 10, 10))
+        }
+
+    @Test
+    fun search_doesNotFindTarget_whenInvisibleToUser() =
+        captureTester.runTest {
+            captureTester.setContent {
+                TestVerticalScrollable(Modifier.semantics { invisibleToUser() })
+            }
+
+            val targets = captureTester.findCaptureTargets()
+            assertThat(targets).isEmpty()
+        }
+
+    @Test
+    fun search_doesNotFindTarget_whenZeroSize() =
+        captureTester.runTest {
+            captureTester.setContent { TestVerticalScrollable(Modifier.size(0.dp)) }
+
+            val targets = captureTester.findCaptureTargets()
+            assertThat(targets).isEmpty()
+        }
+
+    @Test
+    fun search_doesNotFindTarget_whenZeroMaxValue() =
+        captureTester.runTest {
+            captureTester.setContent { TestVerticalScrollable(maxValue = 0f) }
+
+            val targets = captureTester.findCaptureTargets()
+            assertThat(targets).isEmpty()
+        }
+
+    @Test
+    fun search_doesNotFindTarget_whenNoScrollAxisRange() =
+        captureTester.runTest {
+            captureTester.setContent {
+                Box(Modifier.size(10.dp).semantics { scrollByOffset { Offset.Zero } })
+            }
+
+            val targets = captureTester.findCaptureTargets()
+            assertThat(targets).isEmpty()
+        }
+
+    @Test
+    fun search_doesNotFindTarget_whenNoVerticalScrollAxisRange() =
+        captureTester.runTest {
+            captureTester.setContent {
+                Box(
+                    Modifier.size(10.dp).semantics {
+                        scrollByOffset { Offset.Zero }
+                        horizontalScrollAxisRange =
+                            ScrollAxisRange(
+                                value = { 0f },
+                                maxValue = { 1f },
+                            )
+                    }
+                )
+            }
+
+            val targets = captureTester.findCaptureTargets()
+            assertThat(targets).isEmpty()
+        }
+
+    @Test
+    fun search_doesNotFindTarget_whenNoScrollByImmediately() =
+        captureTester.runTest {
+            captureTester.setContent {
+                Box(
+                    Modifier.size(10.dp).semantics {
+                        verticalScrollAxisRange =
+                            ScrollAxisRange(
+                                value = { 0f },
+                                maxValue = { 1f },
+                            )
+                    }
+                )
+            }
+
+            val targets = captureTester.findCaptureTargets()
+            assertThat(targets).isEmpty()
+        }
+
+    @Test
+    fun callbackOnSearch_returnsViewportBounds() =
+        captureTester.runTest {
+            lateinit var coordinates: LayoutCoordinates
+            val padding = 15
+            captureTester.setContent {
+                Box(
+                    Modifier.onPlaced { coordinates = it }
+                        .padding(with(LocalDensity.current) { padding.toDp() })
+                ) {
+                    TestVerticalScrollable(
+                        size = 10,
+                        maxValue = 1f,
+                    )
+                }
+            }
+
+            val callback = captureTester.findCaptureTargets().single().callback
+
+            launch {
+                val result = callback.onScrollCaptureSearch()
+
+                // Search result is in window coordinates.
+                assertThat(result)
+                    .isEqualTo(
+                        Rect(
+                            coordinates.positionInWindow().x.roundToInt() + padding,
+                            coordinates.positionInWindow().y.roundToInt() + padding,
+                            coordinates.positionInWindow().x.roundToInt() + padding + 10,
+                            coordinates.positionInWindow().y.roundToInt() + padding + 10
+                        )
+                    )
+            }
+        }
+
+    @Test
+    fun callbackOnImageCapture_scrollsBackwardsThenForwards() =
+        captureTester.runTest {
+            expectingScrolls(rule) {
+                val size = 10
+                val captureHeight = size / 2
+                captureTester.setContent {
+                    TestVerticalScrollable(
+                        size = size,
+                        // Can't be a reference, see https://youtrack.jetbrains.com/issue/KT-49665
+                        onScrollByOffset = { respondToScrollExpectation(it) }
+                    )
+                }
+
+                val target = captureTester.findCaptureTargets().single()
+                captureTester.capture(target, captureHeight) {
+                    // First request is at origin, no scrolling required.
+                    assertThat(performCaptureDiscardingBitmap()).isEqualTo(Rect(0, 0, 10, 5))
+                    assertNoPendingScrollRequests()
+
+                    // Back one half-page, but only respond to part of it.
+                    expectScrollRequest(Offset(0f, -5f), consume = Offset(0f, -4f))
+                    shiftWindowBy(-5)
+                    assertThat(performCaptureDiscardingBitmap()).isEqualTo(Rect(0, -4, 10, 0))
+
+                    // Forward one half-page – already in viewport, no scrolling required.
+                    shiftWindowBy(5)
+                    assertThat(performCaptureDiscardingBitmap()).isEqualTo(Rect(0, 0, 10, 5))
+                    assertNoPendingScrollRequests()
+
+                    // Forward another half-page. This time we need to scroll.
+                    expectScrollRequest(Offset(0f, 4f))
+                    shiftWindowBy(5)
+                    assertThat(performCaptureDiscardingBitmap()).isEqualTo(Rect(0, 5, 10, 10))
+
+                    // Forward another half-page, scroll again so now we're past the original
+                    // viewport.
+                    expectScrollRequest(Offset(0f, 5f))
+                    shiftWindowBy(5)
+                    assertThat(performCaptureDiscardingBitmap()).isEqualTo(Rect(0, 10, 10, 15))
+
+                    // When capture ends expect one last scroll request to reset to original offset.
+                    // Note that this request will be made _after_ this capture{} lambda returns.
+                    expectScrollRequest(Offset(0f, -5f))
+                }
+                assertNoPendingScrollRequests()
+            }
+        }
 
     @Test
     fun callbackOnImageCapture_scrollsBackwardsThenForwards_reverseScrolling() =
@@ -422,57 +413,57 @@
         }
 
     @Test
-    fun captureSession_setsScrollCaptureInProgress_inSameComposition() = captureTester.runTest {
-        var isScrollCaptureInProgressValue = false
-        captureTester.setContent {
-            isScrollCaptureInProgressValue = LocalScrollCaptureInProgress.current
-            TestVerticalScrollable(size = 10)
-        }
+    fun captureSession_setsScrollCaptureInProgress_inSameComposition() =
+        captureTester.runTest {
+            var isScrollCaptureInProgressValue = false
+            captureTester.setContent {
+                isScrollCaptureInProgressValue = LocalScrollCaptureInProgress.current
+                TestVerticalScrollable(size = 10)
+            }
 
-        rule.awaitIdle()
-        assertThat(isScrollCaptureInProgressValue).isFalse()
-
-        val target = captureTester.findCaptureTargets().single()
-        assertThat(isScrollCaptureInProgressValue).isFalse()
-        captureTester.capture(target, captureWindowHeight = 5) {
             rule.awaitIdle()
-            assertThat(isScrollCaptureInProgressValue).isTrue()
+            assertThat(isScrollCaptureInProgressValue).isFalse()
+
+            val target = captureTester.findCaptureTargets().single()
+            assertThat(isScrollCaptureInProgressValue).isFalse()
+            captureTester.capture(target, captureWindowHeight = 5) {
+                rule.awaitIdle()
+                assertThat(isScrollCaptureInProgressValue).isTrue()
+            }
+            rule.awaitIdle()
+            assertThat(isScrollCaptureInProgressValue).isFalse()
         }
-        rule.awaitIdle()
-        assertThat(isScrollCaptureInProgressValue).isFalse()
-    }
 
     @Test
-    fun captureSession_setsScrollCaptureInProgress_inSubComposition() = captureTester.runTest {
-        var isScrollCaptureInProgressValue = false
+    fun captureSession_setsScrollCaptureInProgress_inSubComposition() =
+        captureTester.runTest {
+            var isScrollCaptureInProgressValue = false
 
-        class ChildComposeView(context: Context) : AbstractComposeView(context) {
-            @Composable
-            override fun Content() {
-                isScrollCaptureInProgressValue = LocalScrollCaptureInProgress.current
+            class ChildComposeView(context: Context) : AbstractComposeView(context) {
+                @Composable
+                override fun Content() {
+                    isScrollCaptureInProgressValue = LocalScrollCaptureInProgress.current
+                }
             }
-        }
-        captureTester.setContent {
-            AndroidView(::ChildComposeView)
-            TestVerticalScrollable(size = 10)
-        }
+            captureTester.setContent {
+                AndroidView(::ChildComposeView)
+                TestVerticalScrollable(size = 10)
+            }
 
-        rule.awaitIdle()
-        assertThat(isScrollCaptureInProgressValue).isFalse()
-
-        val target = captureTester.findCaptureTargets().single()
-        assertThat(isScrollCaptureInProgressValue).isFalse()
-        captureTester.capture(target, captureWindowHeight = 5) {
             rule.awaitIdle()
-            assertThat(isScrollCaptureInProgressValue).isTrue()
-        }
-        rule.awaitIdle()
-        assertThat(isScrollCaptureInProgressValue).isFalse()
-    }
+            assertThat(isScrollCaptureInProgressValue).isFalse()
 
-    /**
-     * A component that publishes all the right semantics to be considered a scrollable.
-     */
+            val target = captureTester.findCaptureTargets().single()
+            assertThat(isScrollCaptureInProgressValue).isFalse()
+            captureTester.capture(target, captureWindowHeight = 5) {
+                rule.awaitIdle()
+                assertThat(isScrollCaptureInProgressValue).isTrue()
+            }
+            rule.awaitIdle()
+            assertThat(isScrollCaptureInProgressValue).isFalse()
+        }
+
+    /** A component that publishes all the right semantics to be considered a scrollable. */
     @Composable
     private fun TestVerticalScrollable(
         modifier: Modifier = Modifier,
@@ -492,12 +483,10 @@
                 )
             }
             Box(
-                modifier
-                    .size(size.toDp())
-                    .semantics {
-                        verticalScrollAxisRange = scrollAxisRange
-                        scrollByOffset(onScrollByOffset)
-                    },
+                modifier.size(size.toDp()).semantics {
+                    verticalScrollAxisRange = scrollAxisRange
+                    scrollByOffset(onScrollByOffset)
+                },
                 content = { content?.invoke() }
             )
         }
diff --git a/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/scrollcapture/ScrollCaptureTester.kt b/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/scrollcapture/ScrollCaptureTester.kt
index 8a1bf37..909d949 100644
--- a/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/scrollcapture/ScrollCaptureTester.kt
+++ b/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/scrollcapture/ScrollCaptureTester.kt
@@ -74,13 +74,11 @@
         val windowHeight: Int
 
         suspend fun performCapture(): CaptureResult
+
         fun shiftWindowBy(offset: Int)
     }
 
-    class CaptureResult(
-        val bitmap: Bitmap?,
-        val capturedRect: Rect
-    )
+    class CaptureResult(val bitmap: Bitmap?, val capturedRect: Rect)
 
     private var view: View? = null
 
@@ -100,9 +98,7 @@
         val latch = CountDownLatch(1)
         var result: Result<Unit>? = null
         scope.launch {
-            result = runCatching {
-                block()
-            }
+            result = runCatching { block() }
             latch.countDown()
         }
         rule.waitUntil("Test coroutine completed", timeoutMillis) { result != null }
@@ -117,9 +113,10 @@
     suspend fun findCaptureTargets(): List<ScrollCaptureTarget> {
         rule.awaitIdle()
         return withContext(AndroidUiDispatcher.Main) {
-            val view = checkNotNull(view as? AndroidComposeView) {
-                "Must call setContent on ScrollCaptureTester before capturing."
-            }
+            val view =
+                checkNotNull(view as? AndroidComposeView) {
+                    "Must call setContent on ScrollCaptureTester before capturing."
+                }
             val localVisibleRect = Rect().also(view::getLocalVisibleRect)
             val windowOffset = view.calculatePositionInWindow(Offset.Zero).roundToPoint()
             val targets = mutableListOf<ScrollCaptureTarget>()
@@ -132,74 +129,79 @@
      * Runs a capture session. [block] should call methods on [CaptureSessionScope] to incrementally
      * capture bitmaps of [target].
      *
-     * @param captureWindowHeight The height of the capture window. Must not be greater than viewport
-     * height.
+     * @param captureWindowHeight The height of the capture window. Must not be greater than
+     *   viewport height.
      */
     suspend fun <T> capture(
         target: ScrollCaptureTarget,
         captureWindowHeight: Int,
         block: suspend CaptureSessionScope.() -> T
-    ): T = withContext(AndroidUiDispatcher.Main) {
-        val callback = target.callback
-        // Use the bounds returned from the callback, not the ones from the target, because that's
-        // what the system does.
-        val scrollBounds = callback.onScrollCaptureSearch()
-        val captureWidth = scrollBounds.width()
-        requirePrecondition(captureWindowHeight <= scrollBounds.height()) {
-            "Expected windowSize ($captureWindowHeight) ≤ viewport height " +
-                "(${scrollBounds.height()})"
-        }
+    ): T =
+        withContext(AndroidUiDispatcher.Main) {
+            val callback = target.callback
+            // Use the bounds returned from the callback, not the ones from the target, because
+            // that's
+            // what the system does.
+            val scrollBounds = callback.onScrollCaptureSearch()
+            val captureWidth = scrollBounds.width()
+            requirePrecondition(captureWindowHeight <= scrollBounds.height()) {
+                "Expected windowSize ($captureWindowHeight) ≤ viewport height " +
+                    "(${scrollBounds.height()})"
+            }
 
-        val result = withSurfaceBitmaps(
-            captureWidth,
-            captureWindowHeight
-        ) { surface, bitmapsFromSurface ->
-            val session = ScrollCaptureSession(
-                surface,
-                scrollBounds,
-                target.positionInWindow
-            )
-            callback.onScrollCaptureStart(session)
+            val result =
+                withSurfaceBitmaps(captureWidth, captureWindowHeight) { surface, bitmapsFromSurface
+                    ->
+                    val session =
+                        ScrollCaptureSession(surface, scrollBounds, target.positionInWindow)
+                    callback.onScrollCaptureStart(session)
 
-            block(object : CaptureSessionScope {
-                private var captureOffset = Point(0, 0)
+                    block(
+                        object : CaptureSessionScope {
+                            private var captureOffset = Point(0, 0)
 
-                override val windowHeight: Int
-                    get() = captureWindowHeight
+                            override val windowHeight: Int
+                                get() = captureWindowHeight
 
-                override fun shiftWindowBy(offset: Int) {
-                    captureOffset = Point(0, captureOffset.y + offset)
-                }
+                            override fun shiftWindowBy(offset: Int) {
+                                captureOffset = Point(0, captureOffset.y + offset)
+                            }
 
-                override suspend fun performCapture(): CaptureResult {
-                    val requestedCaptureArea = Rect(
-                        captureOffset.x,
-                        captureOffset.y,
-                        captureOffset.x + captureWidth,
-                        captureOffset.y + captureWindowHeight
-                    )
-                    val resultCaptureArea =
-                        callback.onScrollCaptureImageRequest(session, requestedCaptureArea)
+                            override suspend fun performCapture(): CaptureResult {
+                                val requestedCaptureArea =
+                                    Rect(
+                                        captureOffset.x,
+                                        captureOffset.y,
+                                        captureOffset.x + captureWidth,
+                                        captureOffset.y + captureWindowHeight
+                                    )
+                                val resultCaptureArea =
+                                    callback.onScrollCaptureImageRequest(
+                                        session,
+                                        requestedCaptureArea
+                                    )
 
-                    // Empty results shouldn't produce an image.
-                    val bitmap = if (!resultCaptureArea.isEmpty) {
-                        bitmapsFromSurface.receiveWithTimeout(1_000) {
-                            "No bitmap received after 1 second for capture area " +
-                                resultCaptureArea
+                                // Empty results shouldn't produce an image.
+                                val bitmap =
+                                    if (!resultCaptureArea.isEmpty) {
+                                        bitmapsFromSurface.receiveWithTimeout(1_000) {
+                                            "No bitmap received after 1 second for capture area " +
+                                                resultCaptureArea
+                                        }
+                                    } else {
+                                        null
+                                    }
+                                return CaptureResult(
+                                    bitmap = bitmap,
+                                    capturedRect = resultCaptureArea
+                                )
+                            }
                         }
-                    } else {
-                        null
-                    }
-                    return CaptureResult(
-                        bitmap = bitmap,
-                        capturedRect = resultCaptureArea
                     )
                 }
-            })
+            callback.onScrollCaptureEnd()
+            return@withContext result
         }
-        callback.onScrollCaptureEnd()
-        return@withContext result
-    }
 
     /**
      * Creates a [Surface] passes it to [block] along with a channel that will receive all images
@@ -212,34 +214,37 @@
     ): T = coroutineScope {
         // ImageReader gives us the Surface that we'll provide to the session.
         ImageReader.newInstance(
-            width,
-            height,
-            PixelFormat.RGBA_8888,
-            // Each image is read, processed, and closed before the next request to draw is made,
-            // so we don't need multiple images.
-            /* maxImages= */ 1,
-            USAGE_GPU_SAMPLED_IMAGE or USAGE_GPU_COLOR_OUTPUT
-        ).use { imageReader ->
-            val bitmapsChannel = Channel<Bitmap>(capacity = Channel.RENDEZVOUS)
+                width,
+                height,
+                PixelFormat.RGBA_8888,
+                // Each image is read, processed, and closed before the next request to draw is
+                // made,
+                // so we don't need multiple images.
+                /* maxImages= */ 1,
+                USAGE_GPU_SAMPLED_IMAGE or USAGE_GPU_COLOR_OUTPUT
+            )
+            .use { imageReader ->
+                val bitmapsChannel = Channel<Bitmap>(capacity = Channel.RENDEZVOUS)
 
-            // Must register the OnImageAvailableListener before any code in block runs to avoid
-            // race conditions.
-            val imageCollectorJob = launch(start = CoroutineStart.UNDISPATCHED) {
-                imageReader.collectImages {
-                    val bitmap = it.toSoftwareBitmap()
-                    bitmapsChannel.send(bitmap)
+                // Must register the OnImageAvailableListener before any code in block runs to avoid
+                // race conditions.
+                val imageCollectorJob =
+                    launch(start = CoroutineStart.UNDISPATCHED) {
+                        imageReader.collectImages {
+                            val bitmap = it.toSoftwareBitmap()
+                            bitmapsChannel.send(bitmap)
+                        }
+                    }
+
+                try {
+                    block(imageReader.surface, bitmapsChannel)
+                } finally {
+                    // ImageReader has no signal that it's finished, so in the happy path we have to
+                    // stop the collector job explicitly.
+                    imageCollectorJob.cancel()
+                    bitmapsChannel.close()
                 }
             }
-
-            try {
-                block(imageReader.surface, bitmapsChannel)
-            } finally {
-                // ImageReader has no signal that it's finished, so in the happy path we have to
-                // stop the collector job explicitly.
-                imageCollectorJob.cancel()
-                bitmapsChannel.close()
-            }
-        }
     }
 
     /**
@@ -276,16 +281,15 @@
     }
 
     /**
-     * Helper function for converting an [Image] to a [Bitmap] by copying the hardware buffer into
-     * a software bitmap.
+     * Helper function for converting an [Image] to a [Bitmap] by copying the hardware buffer into a
+     * software bitmap.
      */
     private fun Image.toSoftwareBitmap(): Bitmap {
         val hardwareBuffer = checkPreconditionNotNull(hardwareBuffer) { "No hardware buffer" }
         hardwareBuffer.use {
-            val hardwareBitmap = Bitmap.wrapHardwareBuffer(
-                hardwareBuffer,
-                ColorSpace.get(ColorSpace.Named.SRGB)
-            ) ?: error("wrapHardwareBuffer returned null")
+            val hardwareBitmap =
+                Bitmap.wrapHardwareBuffer(hardwareBuffer, ColorSpace.get(ColorSpace.Named.SRGB))
+                    ?: error("wrapHardwareBuffer returned null")
             try {
                 return hardwareBitmap.copy(ARGB_8888, false)
             } finally {
@@ -306,29 +310,21 @@
 
 /**
  * Emulates (roughly) how the platform interacts with [ScrollCaptureCallback] to iteratively
- * assemble a screenshot of the entire contents of the [target]. Unlike the platform, this
- * method will not limit itself to a certain size, it always captures the entire scroll
- * contents, so tests should make sure to use small enough scroll contents or the test might
- * run out of memory.
+ * assemble a screenshot of the entire contents of the [target]. Unlike the platform, this method
+ * will not limit itself to a certain size, it always captures the entire scroll contents, so tests
+ * should make sure to use small enough scroll contents or the test might run out of memory.
  *
- * @param captureHeight The height of the capture window. Must not be greater than viewport
- * height.
+ * @param captureHeight The height of the capture window. Must not be greater than viewport height.
  */
 @RequiresApi(31)
 suspend fun ScrollCaptureTester.captureBitmapsVertically(
     target: ScrollCaptureTarget,
     captureHeight: Int
-): List<Bitmap> = capture(target, captureHeight) {
-    buildList {
-        captureAllFromTop(::add)
-    }
-}
+): List<Bitmap> = capture(target, captureHeight) { buildList { captureAllFromTop(::add) } }
 
 @RequiresApi(31)
 internal suspend fun ScrollCaptureTester.CaptureSessionScope.performCaptureDiscardingBitmap() =
-    performCapture()
-        .also { it.bitmap?.recycle() }
-        .capturedRect
+    performCapture().also { it.bitmap?.recycle() }.capturedRect
 
 @RequiresApi(31)
 suspend fun ScrollCaptureTester.CaptureSessionScope.captureAllFromTop(
@@ -374,20 +370,18 @@
 }
 
 /**
- * Helper for calling [ScrollCaptureCallback.onScrollCaptureSearch] from a suspend function.
- * The [CancellationSignal] and continuation callback are generated from the coroutine.
+ * Helper for calling [ScrollCaptureCallback.onScrollCaptureSearch] from a suspend function. The
+ * [CancellationSignal] and continuation callback are generated from the coroutine.
  */
 @RequiresApi(31)
 suspend fun ScrollCaptureCallback.onScrollCaptureSearch(): Rect =
     suspendCancellableCoroutine { continuation ->
-        onScrollCaptureSearch(continuation.createCancellationSignal()) {
-            continuation.resume(it)
-        }
+        onScrollCaptureSearch(continuation.createCancellationSignal()) { continuation.resume(it) }
     }
 
 /**
- * Helper for calling [ScrollCaptureCallback.onScrollCaptureStart] from a suspend function.
- * The [CancellationSignal] and continuation callback are generated from the coroutine.
+ * Helper for calling [ScrollCaptureCallback.onScrollCaptureStart] from a suspend function. The
+ * [CancellationSignal] and continuation callback are generated from the coroutine.
  */
 @RequiresApi(31)
 suspend fun ScrollCaptureCallback.onScrollCaptureStart(session: ScrollCaptureSession) {
@@ -407,33 +401,25 @@
     session: ScrollCaptureSession,
     captureArea: Rect
 ): Rect = suspendCancellableCoroutine { continuation ->
-    onScrollCaptureImageRequest(
-        session,
-        continuation.createCancellationSignal(),
-        captureArea
-    ) {
+    onScrollCaptureImageRequest(session, continuation.createCancellationSignal(), captureArea) {
         continuation.resume(it)
     }
 }
 
 /**
- * Helper for calling [ScrollCaptureCallback.onScrollCaptureEnd] from a suspend function.
- * The [CancellationSignal] and continuation callback are generated from the coroutine.
+ * Helper for calling [ScrollCaptureCallback.onScrollCaptureEnd] from a suspend function. The
+ * [CancellationSignal] and continuation callback are generated from the coroutine.
  */
 @RequiresApi(31)
 suspend fun ScrollCaptureCallback.onScrollCaptureEnd() {
-    suspendCancellableCoroutine { continuation ->
-        onScrollCaptureEnd {
-            continuation.resume(Unit)
-        }
-    }
+    suspendCancellableCoroutine { continuation -> onScrollCaptureEnd { continuation.resume(Unit) } }
 }
 
 fun Offset.roundToPoint(): Point = Point(x.roundToInt(), y.roundToInt())
 
 /**
- * Creates a [CancellationSignal] and wires up cancellation bidirectionally to the coroutine's
- * job: cancelling either one will automatically cancel the other.
+ * Creates a [CancellationSignal] and wires up cancellation bidirectionally to the coroutine's job:
+ * cancelling either one will automatically cancel the other.
  */
 private fun CancellableContinuation<*>.createCancellationSignal(): CancellationSignal {
     val signal = CancellationSignal()
diff --git a/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/scrollcapture/ScrollExpecter.kt b/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/scrollcapture/ScrollExpecter.kt
index 744e4d9..7e4cadb 100644
--- a/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/scrollcapture/ScrollExpecter.kt
+++ b/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/scrollcapture/ScrollExpecter.kt
@@ -56,10 +56,7 @@
     }
 
     @OptIn(ExperimentalCoroutinesApi::class)
-    suspend fun expectScrollRequest(
-        expectedOffset: Offset,
-        consume: Offset = expectedOffset
-    ) {
+    suspend fun expectScrollRequest(expectedOffset: Offset, consume: Offset = expectedOffset) {
         coroutineScope.launch {
             val request = select {
                 scrollRequests.onReceive { it }
@@ -80,8 +77,10 @@
                     request.getOrNull()?.let(::add)
                 } while (request.isSuccess)
             }
-            fail("Expected no scroll requests, but had ${requests.size}: " +
-                requests.joinToString { it.requestedOffset.toString() })
+            fail(
+                "Expected no scroll requests, but had ${requests.size}: " +
+                    requests.joinToString { it.requestedOffset.toString() }
+            )
         }
     }
 
diff --git a/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/semantics/SemanticsTests.kt b/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/semantics/SemanticsTests.kt
index 4602282..95e8e8b 100644
--- a/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/semantics/SemanticsTests.kt
+++ b/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/semantics/SemanticsTests.kt
@@ -85,8 +85,7 @@
 class SemanticsTests {
     private val TestTag = "semantics-test-tag"
 
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
     @Before
     fun before() {
@@ -119,145 +118,134 @@
         val paneTitleString = "test PaneTitle string"
 
         rule.setContent {
-            Surface {
-                Box(
-                    Modifier
-                        .testTag(TestTag)
-                        .semantics { paneTitle = paneTitleString }
-                ) {}
-            }
+            Surface { Box(Modifier.testTag(TestTag).semantics { paneTitle = paneTitleString }) {} }
         }
 
-        rule.onNodeWithTag(TestTag)
+        rule
+            .onNodeWithTag(TestTag)
             .assert(
                 SemanticsMatcher("unmerged paneTitle property") {
                     it.unmergedConfig.getOrNull(SemanticsProperties.PaneTitle) == paneTitleString
                 }
             )
 
-        rule.onNodeWithTag(TestTag)
-            .assert(SemanticsMatcher.expectValue(
-                SemanticsProperties.PaneTitle, paneTitleString))
+        rule
+            .onNodeWithTag(TestTag)
+            .assert(SemanticsMatcher.expectValue(SemanticsProperties.PaneTitle, paneTitleString))
     }
 
     @Test
     fun isTraversalGroupProperty_unmergedConfig() {
         rule.setContent {
-            Surface(
-                Modifier.testTag(TestTag)
-            ) {
+            Surface(Modifier.testTag(TestTag)) {
                 Text("Hello World", modifier = Modifier.padding(8.dp))
             }
         }
 
-        rule.onNodeWithTag(TestTag)
+        rule
+            .onNodeWithTag(TestTag)
             .assert(
                 SemanticsMatcher("unmerged traversalGroup property") {
                     it.unmergedConfig.getOrNull(SemanticsProperties.IsTraversalGroup) == true
                 }
             )
 
-        rule.onNodeWithTag(TestTag)
-            .assert(SemanticsMatcher.expectValue(
-                SemanticsProperties.IsTraversalGroup, true))
+        rule
+            .onNodeWithTag(TestTag)
+            .assert(SemanticsMatcher.expectValue(SemanticsProperties.IsTraversalGroup, true))
     }
 
     @Test
     fun traversalIndexProperty_unmergedConfig() {
         rule.setContent {
-            Box(Modifier
-                .semantics { traversalIndex = 0f }
-                .testTag(TestTag)
-            ) {
+            Box(Modifier.semantics { traversalIndex = 0f }.testTag(TestTag)) {
                 Text("Hello World", modifier = Modifier.padding(8.dp))
             }
         }
 
-        rule.onNodeWithTag(TestTag)
+        rule
+            .onNodeWithTag(TestTag)
             .assert(
                 SemanticsMatcher("unmerged traversalIndex property") {
                     // Using unmerged config here since `traversalIndex` doesn't depend on `config`
                     it.unmergedConfig.getOrNull(SemanticsProperties.TraversalIndex) == 0f
                 }
             )
-        rule.onNodeWithTag(TestTag)
-            .assert(SemanticsMatcher.expectValue(
-                SemanticsProperties.TraversalIndex, 0f))
+        rule
+            .onNodeWithTag(TestTag)
+            .assert(SemanticsMatcher.expectValue(SemanticsProperties.TraversalIndex, 0f))
     }
 
     @Test
     fun traversalIndexPropertyNull() {
         rule.setContent {
-            Box(Modifier
-                .testTag(TestTag)
-            ) {
+            Box(Modifier.testTag(TestTag)) {
                 Text("Hello World", modifier = Modifier.padding(8.dp))
             }
         }
 
         // If traversalIndex is not explicitly set, the default value is zero, but
         // only considered so when sorting in the DelegateCompat file
-        rule.onNodeWithTag(TestTag)
-            .assertDoesNotHaveProperty(SemanticsProperties.TraversalIndex)
+        rule.onNodeWithTag(TestTag).assertDoesNotHaveProperty(SemanticsProperties.TraversalIndex)
     }
 
     @Test
     @Suppress("DEPRECATION")
     fun isContainerPropertyDeprecated() {
         rule.setContent {
-            Box(Modifier
-                .testTag(TestTag)
-                .semantics { isContainer = true }
-            ) {
+            Box(Modifier.testTag(TestTag).semantics { isContainer = true }) {
                 Text("Hello World", modifier = Modifier.padding(8.dp))
             }
         }
 
         // Since `isContainer` has been deprecated, setting that property will actually set
         // `isTraversalGroup` instead, but `IsContainer` can still be used to retrieve the value
-        rule.onNodeWithTag(TestTag)
+        rule
+            .onNodeWithTag(TestTag)
             .assert(
                 SemanticsMatcher("container property") {
                     it.unmergedConfig.getOrNull(SemanticsProperties.IsContainer) == true
                 }
             )
-        rule.onNodeWithTag(TestTag)
-            .assert(SemanticsMatcher.expectValue(
-                SemanticsProperties.IsTraversalGroup, true))
+        rule
+            .onNodeWithTag(TestTag)
+            .assert(SemanticsMatcher.expectValue(SemanticsProperties.IsTraversalGroup, true))
     }
 
     @Test
     fun contentTypeProperty() {
         rule.setContent {
-            Box(Modifier
-                .testTag(TestTag)
-                .semantics { testProperty = ContentType.Username.toString() }
+            Box(
+                Modifier.testTag(TestTag).semantics {
+                    testProperty = ContentType.Username.toString()
+                }
             )
         }
 
-        rule.onNodeWithTag(TestTag)
+        rule
+            .onNodeWithTag(TestTag)
             .assertUnmergedTestPropertyEquals(ContentType.Username.toString())
 
-        rule.onNodeWithTag(TestTag)
-            .assertTestPropertyEquals(ContentType.Username.toString())
+        rule.onNodeWithTag(TestTag).assertTestPropertyEquals(ContentType.Username.toString())
     }
 
     @Test
     fun contentDataTypeProperty() {
         rule.setContent {
             Surface {
-                Box(Modifier
-                    .testTag(TestTag)
-                    .semantics { testProperty = ContentDataType.Text.toString() }
+                Box(
+                    Modifier.testTag(TestTag).semantics {
+                        testProperty = ContentDataType.Text.toString()
+                    }
                 )
             }
         }
 
-        rule.onNodeWithTag(TestTag)
+        rule
+            .onNodeWithTag(TestTag)
             .assertUnmergedTestPropertyEquals(ContentDataType.Text.toString())
 
-        rule.onNodeWithTag(TestTag)
-            .assertTestPropertyEquals(ContentDataType.Text.toString())
+        rule.onNodeWithTag(TestTag).assertTestPropertyEquals(ContentDataType.Text.toString())
     }
 
     @Test
@@ -269,20 +257,19 @@
         val child2 = "grandchild2"
         rule.setContent {
             SimpleTestLayout(
-                Modifier.testTag(TestTag)
-                    .semantics(mergeDescendants = true) { testProperty = root }
+                Modifier.testTag(TestTag).semantics(mergeDescendants = true) { testProperty = root }
             ) {
                 SimpleTestLayout(Modifier.semantics { testProperty = child1 }) {
-                    SimpleTestLayout(Modifier.semantics { testProperty = grandchild1 }) { }
-                    SimpleTestLayout(Modifier.semantics { testProperty = grandchild2 }) { }
+                    SimpleTestLayout(Modifier.semantics { testProperty = grandchild1 }) {}
+                    SimpleTestLayout(Modifier.semantics { testProperty = grandchild2 }) {}
                 }
-                SimpleTestLayout(Modifier.semantics { testProperty = child2 }) { }
+                SimpleTestLayout(Modifier.semantics { testProperty = child2 }) {}
             }
         }
 
-        rule.onNodeWithTag(TestTag).assertTestPropertyEquals(
-            "$root, $child1, $grandchild1, $grandchild2, $child2"
-        )
+        rule
+            .onNodeWithTag(TestTag)
+            .assertTestPropertyEquals("$root, $child1, $grandchild1, $grandchild2, $child2")
     }
 
     @Test
@@ -293,9 +280,9 @@
         val label2 = "bar"
         rule.setContent {
             SimpleTestLayout(Modifier.semantics(mergeDescendants = true) {}.testTag(tag1)) {
-                SimpleTestLayout(Modifier.semantics { testProperty = label1 }) { }
+                SimpleTestLayout(Modifier.semantics { testProperty = label1 }) {}
                 SimpleTestLayout(Modifier.semantics(mergeDescendants = true) {}.testTag(tag2)) {
-                    SimpleTestLayout(Modifier.semantics { testProperty = label2 }) { }
+                    SimpleTestLayout(Modifier.semantics { testProperty = label2 }) {}
                 }
             }
         }
@@ -313,11 +300,11 @@
         val label3 = "hi"
         rule.setContent {
             SimpleTestLayout(Modifier.semantics(mergeDescendants = true) {}.testTag(tag1)) {
-                SimpleTestLayout(Modifier.semantics { testProperty = label1 }) { }
+                SimpleTestLayout(Modifier.semantics { testProperty = label1 }) {}
                 SimpleTestLayout(Modifier.semantics(mergeDescendants = true) {}.testTag(tag2)) {
-                    SimpleTestLayout(Modifier.semantics { testProperty = label2 }) { }
+                    SimpleTestLayout(Modifier.semantics { testProperty = label2 }) {}
                 }
-                SimpleTestLayout(Modifier.semantics { testProperty = label3 }) { }
+                SimpleTestLayout(Modifier.semantics { testProperty = label3 }) {}
             }
         }
 
@@ -334,18 +321,19 @@
         val label3 = "baz"
         rule.setContent {
             SimpleTestLayout(Modifier.semantics(mergeDescendants = true) {}.testTag(tag1)) {
-                SimpleTestLayout(Modifier.semantics { testProperty = label1 }) { }
+                SimpleTestLayout(Modifier.semantics { testProperty = label1 }) {}
                 SimpleTestLayout(Modifier.clearAndSetSemantics {}) {
-                    SimpleTestLayout(Modifier.semantics { testProperty = label2 }) { }
+                    SimpleTestLayout(Modifier.semantics { testProperty = label2 }) {}
                 }
                 SimpleTestLayout(Modifier.clearAndSetSemantics { testProperty = label3 }) {
-                    SimpleTestLayout(Modifier.semantics { testProperty = label2 }) { }
+                    SimpleTestLayout(Modifier.semantics { testProperty = label2 }) {}
                 }
                 SimpleTestLayout(
-                    Modifier.semantics(mergeDescendants = true) {}.testTag(tag2)
+                    Modifier.semantics(mergeDescendants = true) {}
+                        .testTag(tag2)
                         .clearAndSetSemantics { text = AnnotatedString(label1) }
                 ) {
-                    SimpleTestLayout(Modifier.semantics { text = AnnotatedString(label2) }) { }
+                    SimpleTestLayout(Modifier.semantics { text = AnnotatedString(label2) }) {}
                 }
             }
         }
@@ -365,7 +353,7 @@
                 Modifier.testTag(tag1).clearAndSetSemantics { testProperty = label4 }
             ) {
                 SimpleTestLayout(Modifier.semantics(true) { testProperty = label1 }) {
-                    SimpleTestLayout(Modifier.semantics { testProperty = label2 }) { }
+                    SimpleTestLayout(Modifier.semantics { testProperty = label2 }) {}
                 }
             }
         }
@@ -383,13 +371,11 @@
         rule.setContent {
             SimpleTestLayout(Modifier.semantics(mergeDescendants = true) {}.testTag(tag1)) {
                 SimpleTestLayout(
-                    Modifier
-                        .clearAndSetSemantics { testProperty = label1 }
+                    Modifier.clearAndSetSemantics { testProperty = label1 }
                         .semantics { text = AnnotatedString(label2) }
                 ) {}
                 SimpleTestLayout(
-                    Modifier
-                        .semantics { testProperty = label3 }
+                    Modifier.semantics { testProperty = label3 }
                         .clearAndSetSemantics { text = AnnotatedString(label3) }
                 ) {}
             }
@@ -410,7 +396,7 @@
     @Test
     fun clearAndSetSemantics_children() {
         rule.setContent {
-            Column(Modifier.testTag("tag").semantics(true) { }.clearAndSetSemantics { }) {
+            Column(Modifier.testTag("tag").semantics(true) {}.clearAndSetSemantics {}) {
                 val size = Modifier.size(100.dp)
                 Box(size.semantics { contentDescription = "box 1" })
                 Box(size.clearAndSetSemantics { contentDescription = "box 2" }) {}
@@ -434,10 +420,10 @@
     @Test
     fun higherUpSemanticsOverridePropertiesOfLowerSemanticsOnSameNode() {
         rule.setContent {
-            Box(Modifier
-                .testTag("tag")
-                .semantics { contentDescription = "high" }
-                .semantics { contentDescription = "low" }
+            Box(
+                Modifier.testTag("tag")
+                    .semantics { contentDescription = "high" }
+                    .semantics { contentDescription = "low" }
             )
         }
 
@@ -483,8 +469,7 @@
         val tag = "tag1"
         rule.setContent {
             SimpleTestLayout(
-                Modifier
-                    .offset(10.dp, 10.dp)
+                Modifier.offset(10.dp, 10.dp)
                     .clickable(role = Role.Button, onClick = {})
                     .testTag(tag)
             ) {
@@ -511,7 +496,7 @@
         rule.setContent {
             SimpleTestLayout(Modifier.semantics(mergeDescendants = true) {}.testTag(TestTag)) {
                 if (showSubtree.value) {
-                    SimpleTestLayout(Modifier.semantics { testProperty = label }) { }
+                    SimpleTestLayout(Modifier.semantics { testProperty = label }) {}
                 }
             }
         }
@@ -520,8 +505,7 @@
 
         rule.runOnIdle { showSubtree.value = false }
 
-        rule.onNodeWithTag(TestTag)
-            .assert(SemanticsMatcher.keyNotDefined(TestProperty))
+        rule.onNodeWithTag(TestTag).assert(SemanticsMatcher.keyNotDefined(TestProperty))
 
         rule.onAllNodesWithText(label).assertCountEquals(0)
     }
@@ -533,22 +517,21 @@
         val showNewNode = mutableStateOf(false)
         rule.setContent {
             SimpleTestLayout(Modifier.semantics(mergeDescendants = true) {}.testTag(TestTag)) {
-                SimpleTestLayout(Modifier.semantics { testProperty = label }) { }
+                SimpleTestLayout(Modifier.semantics { testProperty = label }) {}
                 if (showNewNode.value) {
-                    SimpleTestLayout(Modifier.semantics { stateDescription = value }) { }
+                    SimpleTestLayout(Modifier.semantics { stateDescription = value }) {}
                 }
             }
         }
 
-        rule.onNodeWithTag(TestTag)
+        rule
+            .onNodeWithTag(TestTag)
             .assertTestPropertyEquals(label)
             .assertDoesNotHaveProperty(SemanticsProperties.StateDescription)
 
         rule.runOnIdle { showNewNode.value = true }
 
-        rule.onNodeWithTag(TestTag)
-            .assertTestPropertyEquals(label)
-            .assertValueEquals(value)
+        rule.onNodeWithTag(TestTag).assertTestPropertyEquals(label).assertValueEquals(value)
     }
 
     @Test
@@ -558,16 +541,14 @@
         rule.setContent {
             SimpleTestLayout(Modifier.testTag(TestTag)) {
                 if (showSubtree.value) {
-                    SimpleTestLayout(Modifier.semantics { contentDescription = label }) { }
+                    SimpleTestLayout(Modifier.semantics { contentDescription = label }) {}
                 }
             }
         }
 
         rule.onAllNodesWithContentDescription(label).assertCountEquals(1)
 
-        rule.runOnIdle {
-            showSubtree.value = false
-        }
+        rule.runOnIdle { showSubtree.value = false }
 
         rule.onAllNodesWithContentDescription(label).assertCountEquals(0)
     }
@@ -669,12 +650,13 @@
         rule.setContent {
             SimpleTestLayout(Modifier.testTag(TestTag)) {
                 SimpleTestLayout(Modifier.semantics(mergeDescendants = true) {}) {
-                    SimpleTestLayout(Modifier.semantics { contentDescription = label }) { }
+                    SimpleTestLayout(Modifier.semantics { contentDescription = label }) {}
                 }
             }
         }
 
-        rule.onNodeWithTag(TestTag)
+        rule
+            .onNodeWithTag(TestTag)
             .assertDoesNotHaveProperty(SemanticsProperties.ContentDescription)
         rule.onNodeWithContentDescription(label) // assert exists
     }
@@ -694,8 +676,8 @@
                     contentDescription = if (isAfter.value) afterLabel else beforeLabel
                 }
             ) {
-                SimpleTestLayout(Modifier.semantics { }) { }
-                SimpleTestLayout(Modifier.semantics { }) { }
+                SimpleTestLayout(Modifier.semantics {}) {}
+                SimpleTestLayout(Modifier.semantics {}) {}
             }
         }
 
@@ -719,11 +701,7 @@
 
         val isAfter = mutableStateOf(false)
 
-        val content: @Composable () -> Unit = {
-            SimpleTestLayout {
-                nodeCount++
-            }
-        }
+        val content: @Composable () -> Unit = { SimpleTestLayout { nodeCount++ } }
 
         rule.setContent {
             SimpleTestLayout(
@@ -758,17 +736,13 @@
         val actionLabel = "copy"
         rule.setContent {
             SimpleTestLayout(
-                Modifier
-                    .testTag(TestTag)
-                    .semantics {
-                        copyText(label = actionLabel, action = null)
-                    }
-                    .semantics {
-                        copyText { true }
-                    }
+                Modifier.testTag(TestTag)
+                    .semantics { copyText(label = actionLabel, action = null) }
+                    .semantics { copyText { true } }
             ) {}
         }
-        rule.onNodeWithTag(TestTag)
+        rule
+            .onNodeWithTag(TestTag)
             .assert(
                 SemanticsMatcher("collapse copyText") {
                     it.config.getOrNull(SemanticsActions.CopyText)?.label == actionLabel &&
@@ -782,17 +756,13 @@
         val actionLabel = "copy"
         rule.setContent {
             SimpleTestLayout(
-                Modifier
-                    .testTag(TestTag)
-                    .semantics {
-                        copyText { false }
-                    }
-                    .semantics {
-                        copyText(label = actionLabel, action = { true })
-                    }
+                Modifier.testTag(TestTag)
+                    .semantics { copyText { false } }
+                    .semantics { copyText(label = actionLabel, action = { true }) }
             ) {}
         }
-        rule.onNodeWithTag(TestTag)
+        rule
+            .onNodeWithTag(TestTag)
             .assert(
                 SemanticsMatcher("collapse copyText") {
                     it.config.getOrNull(SemanticsActions.CopyText)?.label == actionLabel &&
@@ -806,15 +776,13 @@
         val actionLabel = "send"
         rule.setContent {
             SimpleTestLayout(
-                Modifier
-                    .testTag(TestTag)
-                    .semantics {
-                        onClick(label = actionLabel, action = null)
-                    }
+                Modifier.testTag(TestTag)
+                    .semantics { onClick(label = actionLabel, action = null) }
                     .clickable {}
             ) {}
         }
-        rule.onNodeWithTag(TestTag)
+        rule
+            .onNodeWithTag(TestTag)
             .assert(
                 SemanticsMatcher("collapse onClick") {
                     it.config.getOrNull(SemanticsActions.OnClick)?.label == actionLabel &&
@@ -828,15 +796,15 @@
         val actionLabel = "send"
         rule.setContent {
             SimpleTestLayout(
-                Modifier
-                    .testTag(TestTag)
+                Modifier.testTag(TestTag)
                     .semantics(mergeDescendants = true) {
                         onClick(label = actionLabel, action = null)
                     }
                     .clickable {}
             ) {}
         }
-        rule.onNodeWithTag(TestTag)
+        rule
+            .onNodeWithTag(TestTag)
             .assert(
                 SemanticsMatcher("collapse onClick") {
                     it.config.getOrNull(SemanticsActions.OnClick)?.label == actionLabel &&
@@ -850,16 +818,15 @@
         val actionLabel = "show more"
         rule.setContent {
             SimpleTestLayout(
-                Modifier
-                    .testTag(TestTag)
-                    .semantics(mergeDescendants = true) {
-                        expand(label = actionLabel, action = null)
-                    }
+                Modifier.testTag(TestTag).semantics(mergeDescendants = true) {
+                    expand(label = actionLabel, action = null)
+                }
             ) {
                 SimpleTestLayout(Modifier.semantics { expand { true } }) {}
             }
         }
-        rule.onNodeWithTag(TestTag)
+        rule
+            .onNodeWithTag(TestTag)
             .assert(
                 SemanticsMatcher("merge expand action") {
                     it.config.getOrNull(SemanticsActions.Expand)?.label == actionLabel &&
@@ -873,18 +840,15 @@
         val actionLabel = "show more"
         rule.setContent {
             SimpleTestLayout(
-                Modifier
-                    .testTag(TestTag)
-                    .semantics(mergeDescendants = true) {
-                        expand { false }
-                    }
+                Modifier.testTag(TestTag).semantics(mergeDescendants = true) { expand { false } }
             ) {
                 SimpleTestLayout(
                     Modifier.semantics { expand(label = actionLabel, action = { true }) }
                 ) {}
             }
         }
-        rule.onNodeWithTag(TestTag)
+        rule
+            .onNodeWithTag(TestTag)
             .assert(
                 SemanticsMatcher("merge expand action") {
                     it.config.getOrNull(SemanticsActions.Expand)?.label == actionLabel &&
@@ -898,16 +862,13 @@
         val actionLabel = "show less"
         rule.setContent {
             SimpleTestLayout(
-                Modifier
-                    .testTag(TestTag)
-                    .semantics {
-                        collapse(label = actionLabel, action = null)
-                    }
+                Modifier.testTag(TestTag).semantics { collapse(label = actionLabel, action = null) }
             ) {
                 SimpleTestLayout(Modifier.semantics { collapse { true } }) {}
             }
         }
-        rule.onNodeWithTag(TestTag)
+        rule
+            .onNodeWithTag(TestTag)
             .assert(
                 SemanticsMatcher("merge collapse action") {
                     it.config.getOrNull(SemanticsActions.Collapse)?.label == actionLabel &&
@@ -921,16 +882,13 @@
         val actionLabel = "send"
         rule.setContent {
             SimpleTestLayout(
-                Modifier
-                    .testTag(TestTag)
-                    .semantics {
-                        onClick(label = actionLabel, action = null)
-                    }
+                Modifier.testTag(TestTag).semantics { onClick(label = actionLabel, action = null) }
             ) {
                 SimpleTestLayout(Modifier.clickable {}) {}
             }
         }
-        rule.onNodeWithTag(TestTag)
+        rule
+            .onNodeWithTag(TestTag)
             .assert(
                 SemanticsMatcher("merge onClick") {
                     it.config.getOrNull(SemanticsActions.OnClick)?.label == actionLabel &&
@@ -944,16 +902,15 @@
         val actionLabel = "send"
         rule.setContent {
             SimpleTestLayout(
-                Modifier
-                    .testTag(TestTag)
-                    .semantics(mergeDescendants = true) {
-                        onClick(label = actionLabel, action = null)
-                    }
+                Modifier.testTag(TestTag).semantics(mergeDescendants = true) {
+                    onClick(label = actionLabel, action = null)
+                }
             ) {
                 SimpleTestLayout(Modifier.clickable {}) {}
             }
         }
-        rule.onNodeWithTag(TestTag)
+        rule
+            .onNodeWithTag(TestTag)
             .assert(
                 SemanticsMatcher("merge onClick") {
                     it.config.getOrNull(SemanticsActions.OnClick)?.label == actionLabel &&
@@ -974,14 +931,14 @@
 
             assertThat(modifier.nameFallback).isEqualTo("semantics")
             assertThat(modifier.valueOverride).isNull()
-            assertThat(modifier.inspectableElements.asIterable()).containsExactly(
-                ValueElement("mergeDescendants", true),
-                ValueElement("properties", mapOf(
-                    "PaneTitle" to "testTitle",
-                    "Focused" to false,
-                    "Role" to Role.Image
-                ))
-            )
+            assertThat(modifier.inspectableElements.asIterable())
+                .containsExactly(
+                    ValueElement("mergeDescendants", true),
+                    ValueElement(
+                        "properties",
+                        mapOf("PaneTitle" to "testTitle", "Focused" to false, "Role" to Role.Image)
+                    )
+                )
         }
     }
 
@@ -990,67 +947,39 @@
         val child1 = "child1"
         val child2 = "child2"
         rule.setContent {
-            SimpleTestLayout(
-                Modifier.testTag(TestTag)
-            ) {
-                SimpleTestLayout(
-                    Modifier.zIndex(1f).semantics { testTag = child1 }
-                ) {}
-                SimpleTestLayout(Modifier.semantics { testTag = child2 }) { }
+            SimpleTestLayout(Modifier.testTag(TestTag)) {
+                SimpleTestLayout(Modifier.zIndex(1f).semantics { testTag = child1 }) {}
+                SimpleTestLayout(Modifier.semantics { testTag = child2 }) {}
             }
         }
 
         val root = rule.onNodeWithTag(TestTag).fetchSemanticsNode("can't find node $TestTag")
         assertEquals(2, root.children.size)
-        assertEquals(
-            child2,
-            root.children[0].config.getOrNull(SemanticsProperties.TestTag)
-        )
-        assertEquals(
-            child1,
-            root.children[1].config.getOrNull(SemanticsProperties.TestTag)
-        )
+        assertEquals(child2, root.children[0].config.getOrNull(SemanticsProperties.TestTag))
+        assertEquals(child1, root.children[1].config.getOrNull(SemanticsProperties.TestTag))
     }
 
     @Test
     fun delegatedSemanticsPropertiesGetRead() {
-        val node = object : DelegatingNode() {
-            val inner = delegate(SemanticsMod {
-                contentDescription = "hello world"
-            })
-        }
+        val node =
+            object : DelegatingNode() {
+                val inner = delegate(SemanticsMod { contentDescription = "hello world" })
+            }
 
-        rule.setContent {
-            Box(
-                Modifier
-                    .testTag(TestTag)
-                    .elementFor(node)
-            )
-        }
+        rule.setContent { Box(Modifier.testTag(TestTag).elementFor(node)) }
 
-        rule
-            .onNodeWithTag(TestTag)
-            .assertContentDescriptionEquals("hello world")
+        rule.onNodeWithTag(TestTag).assertContentDescriptionEquals("hello world")
     }
 
     @Test
     fun multipleDelegatesGetCombined() {
-        val node = object : DelegatingNode() {
-            val a = delegate(SemanticsMod {
-                contentDescription = "hello world"
-            })
-            val b = delegate(SemanticsMod {
-                testProperty = "bar"
-            })
-        }
+        val node =
+            object : DelegatingNode() {
+                val a = delegate(SemanticsMod { contentDescription = "hello world" })
+                val b = delegate(SemanticsMod { testProperty = "bar" })
+            }
 
-        rule.setContent {
-            Box(
-                Modifier
-                    .testTag(TestTag)
-                    .elementFor(node)
-            )
-        }
+        rule.setContent { Box(Modifier.testTag(TestTag).elementFor(node)) }
 
         rule
             .onNodeWithTag(TestTag)
@@ -1062,20 +991,9 @@
     fun testBoundInParent() {
         rule.setContent {
             with(LocalDensity.current) {
-                Box(
-                    Modifier
-                        .size(100.toDp())
-                        .padding(10.toDp(), 20.toDp())
-                        .semantics {}
-                ) {
-                    Box(
-                        Modifier
-                            .size(10.toDp())
-                            .offset(20.toDp(), 30.toDp())
-                    ) {
-                        Box(Modifier
-                            .size(1.toDp())
-                            .testTag(TestTag)) {}
+                Box(Modifier.size(100.toDp()).padding(10.toDp(), 20.toDp()).semantics {}) {
+                    Box(Modifier.size(10.toDp()).offset(20.toDp(), 30.toDp())) {
+                        Box(Modifier.size(1.toDp()).testTag(TestTag)) {}
                     }
                 }
             }
@@ -1084,29 +1002,16 @@
         rule.waitForIdle()
 
         val bounds = rule.onNodeWithTag(TestTag, true).fetchSemanticsNode().boundsInParent
-        assertEquals(
-            Rect(20.0f, 30.0f, 21.0f, 31.0f),
-            bounds
-        )
+        assertEquals(Rect(20.0f, 30.0f, 21.0f, 31.0f), bounds)
     }
 
     @Test
     fun testBoundInParent_boundInRootWhenNoParent() {
         rule.setContent {
             with(LocalDensity.current) {
-                Box(
-                    Modifier
-                        .size(100.toDp())
-                        .padding(10.toDp(), 20.toDp())
-                ) {
-                    Box(
-                        Modifier
-                            .size(10.toDp())
-                            .offset(20.toDp(), 30.toDp())
-                    ) {
-                        Box(Modifier
-                            .size(1.toDp())
-                            .testTag(TestTag)) {}
+                Box(Modifier.size(100.toDp()).padding(10.toDp(), 20.toDp())) {
+                    Box(Modifier.size(10.toDp()).offset(20.toDp(), 30.toDp())) {
+                        Box(Modifier.size(1.toDp()).testTag(TestTag)) {}
                     }
                 }
             }
@@ -1115,26 +1020,15 @@
         rule.waitForIdle()
 
         val bounds = rule.onNodeWithTag(TestTag, true).fetchSemanticsNode().boundsInParent
-        assertEquals(
-            Rect(30.0f, 50.0f, 31.0f, 51.0f),
-            bounds
-        )
+        assertEquals(Rect(30.0f, 50.0f, 31.0f, 51.0f), bounds)
     }
 
     @Test
     fun testRegenerateSemanticsId() {
         var reuseKey by mutableStateOf(0)
-        rule.setContent {
-            ReusableContent(reuseKey) {
-                Box(
-                    Modifier.testTag(TestTag)
-                )
-            }
-        }
+        rule.setContent { ReusableContent(reuseKey) { Box(Modifier.testTag(TestTag)) } }
         val oldId = rule.onNodeWithTag(TestTag).fetchSemanticsNode().id
-        rule.runOnIdle {
-            reuseKey = 1
-        }
+        rule.runOnIdle { reuseKey = 1 }
         val newId = rule.onNodeWithTag(TestTag).fetchSemanticsNode().id
 
         assertNotEquals(oldId, newId)
@@ -1142,23 +1036,16 @@
 
     @Test
     fun testSetTextSubstitution_annotatedString() {
-        rule.setContent {
-            Surface {
-                Text(
-                    AnnotatedString("hello"),
-                    Modifier
-                        .testTag(TestTag)
-                )
-            }
-        }
+        rule.setContent { Surface { Text(AnnotatedString("hello"), Modifier.testTag(TestTag)) } }
 
         val config = rule.onNodeWithTag(TestTag, true).fetchSemanticsNode().config
-        assertEquals(null,
-            config.getOrNull(SemanticsProperties.IsShowingTextSubstitution))
+        assertEquals(null, config.getOrNull(SemanticsProperties.IsShowingTextSubstitution))
 
         rule.runOnUiThread {
-            config.getOrNull(SemanticsActions.SetTextSubstitution)?.action?.invoke(
-                AnnotatedString("bonjour"))
+            config
+                .getOrNull(SemanticsActions.SetTextSubstitution)
+                ?.action
+                ?.invoke(AnnotatedString("bonjour"))
         }
 
         rule.waitForIdle()
@@ -1167,10 +1054,11 @@
         // SetTextSubstitution doesn't trigger text update
         assertThat(newConfig.getOrNull(SemanticsProperties.Text))
             .containsExactly(AnnotatedString("hello"))
-        assertEquals(AnnotatedString("bonjour"),
-            newConfig.getOrNull(SemanticsProperties.TextSubstitution))
-        assertEquals(false,
-            newConfig.getOrNull(SemanticsProperties.IsShowingTextSubstitution))
+        assertEquals(
+            AnnotatedString("bonjour"),
+            newConfig.getOrNull(SemanticsProperties.TextSubstitution)
+        )
+        assertEquals(false, newConfig.getOrNull(SemanticsProperties.IsShowingTextSubstitution))
 
         rule.runOnUiThread {
             config.getOrNull(SemanticsActions.ShowTextSubstitution)?.action?.invoke(true)
@@ -1182,31 +1070,25 @@
         // ShowTextSubstitution triggers text update
         assertThat(newConfig.getOrNull(SemanticsProperties.Text))
             .containsExactly(AnnotatedString("hello"))
-        assertEquals(AnnotatedString("bonjour"),
-            newConfig.getOrNull(SemanticsProperties.TextSubstitution))
-        assertEquals(true,
-            newConfig.getOrNull(SemanticsProperties.IsShowingTextSubstitution))
+        assertEquals(
+            AnnotatedString("bonjour"),
+            newConfig.getOrNull(SemanticsProperties.TextSubstitution)
+        )
+        assertEquals(true, newConfig.getOrNull(SemanticsProperties.IsShowingTextSubstitution))
     }
 
     @Test
     fun testSetTextSubstitution_simpleString() {
-        rule.setContent {
-            Surface {
-                Text(
-                    "hello",
-                    Modifier
-                        .testTag(TestTag)
-                )
-            }
-        }
+        rule.setContent { Surface { Text("hello", Modifier.testTag(TestTag)) } }
 
         val config = rule.onNodeWithTag(TestTag, true).fetchSemanticsNode().config
-        assertEquals(null,
-            config.getOrNull(SemanticsProperties.IsShowingTextSubstitution))
+        assertEquals(null, config.getOrNull(SemanticsProperties.IsShowingTextSubstitution))
 
         rule.runOnUiThread {
-            config.getOrNull(SemanticsActions.SetTextSubstitution)?.action?.invoke(
-                AnnotatedString("bonjour"))
+            config
+                .getOrNull(SemanticsActions.SetTextSubstitution)
+                ?.action
+                ?.invoke(AnnotatedString("bonjour"))
         }
 
         rule.waitForIdle()
@@ -1215,10 +1097,11 @@
         // SetTextSubstitution doesn't trigger text update
         assertThat(newConfig.getOrNull(SemanticsProperties.Text))
             .containsExactly(AnnotatedString("hello"))
-        assertEquals(AnnotatedString("bonjour"),
-            newConfig.getOrNull(SemanticsProperties.TextSubstitution))
-        assertEquals(false,
-            newConfig.getOrNull(SemanticsProperties.IsShowingTextSubstitution))
+        assertEquals(
+            AnnotatedString("bonjour"),
+            newConfig.getOrNull(SemanticsProperties.TextSubstitution)
+        )
+        assertEquals(false, newConfig.getOrNull(SemanticsProperties.IsShowingTextSubstitution))
 
         rule.runOnUiThread {
             config.getOrNull(SemanticsActions.ShowTextSubstitution)?.action?.invoke(true)
@@ -1230,24 +1113,22 @@
         // ShowTextSubstitution triggers text update
         assertThat(newConfig.getOrNull(SemanticsProperties.Text))
             .containsExactly(AnnotatedString("hello"))
-        assertEquals(AnnotatedString("bonjour"),
-            newConfig.getOrNull(SemanticsProperties.TextSubstitution))
-        assertEquals(true,
-            newConfig.getOrNull(SemanticsProperties.IsShowingTextSubstitution))
+        assertEquals(
+            AnnotatedString("bonjour"),
+            newConfig.getOrNull(SemanticsProperties.TextSubstitution)
+        )
+        assertEquals(true, newConfig.getOrNull(SemanticsProperties.IsShowingTextSubstitution))
     }
 
     @Test
     fun testGetTextSizeFromTextLayoutResult() {
         var density = Float.NaN
         rule.setContent {
-            with(LocalDensity.current) {
-                density = 1.sp.toPx()
-            }
+            with(LocalDensity.current) { density = 1.sp.toPx() }
             Surface {
                 Text(
                     AnnotatedString("hello"),
-                    Modifier
-                        .testTag(TestTag),
+                    Modifier.testTag(TestTag),
                     fontSize = 14.sp,
                 )
             }
@@ -1257,8 +1138,8 @@
 
         val textLayoutResult: TextLayoutResult
         val textLayoutResults = mutableListOf<TextLayoutResult>()
-        val getLayoutResult = config[SemanticsActions.GetTextLayoutResult]
-            .action?.invoke(textLayoutResults)
+        val getLayoutResult =
+            config[SemanticsActions.GetTextLayoutResult].action?.invoke(textLayoutResults)
 
         assertEquals(true, getLayoutResult)
 
@@ -1274,43 +1155,40 @@
     assert(SemanticsMatcher.keyNotDefined(property))
 }
 
-private val TestProperty = SemanticsPropertyKey<String>("TestProperty") { parent, child ->
-    if (parent == null) child else "$parent, $child"
-}
+private val TestProperty =
+    SemanticsPropertyKey<String>("TestProperty") { parent, child ->
+        if (parent == null) child else "$parent, $child"
+    }
 
 internal var SemanticsPropertyReceiver.testProperty by TestProperty
 
-private fun SemanticsNodeInteraction.assertUnmergedTestPropertyEquals(value: String) = assert(
-    SemanticsMatcher(value) {
-        it.unmergedConfig.getOrNull(TestProperty) == value
-    }
-)
+private fun SemanticsNodeInteraction.assertUnmergedTestPropertyEquals(value: String) =
+    assert(SemanticsMatcher(value) { it.unmergedConfig.getOrNull(TestProperty) == value })
 
-internal fun SemanticsNodeInteraction.assertTestPropertyEquals(value: String) = assert(
-    SemanticsMatcher.expectValue(TestProperty, value)
-)
+internal fun SemanticsNodeInteraction.assertTestPropertyEquals(value: String) =
+    assert(SemanticsMatcher.expectValue(TestProperty, value))
 
 // Falsely mark the layout counter stable to avoid influencing recomposition behavior
-@Stable
-private class Counter(var count: Int)
+@Stable private class Counter(var count: Int)
 
 @Composable
 private fun CountingLayout(modifier: Modifier, counter: Counter) {
     Layout(
         modifier = modifier,
         content = {},
-        measurePolicy = remember {
-            MeasurePolicy { _, constraints ->
-                counter.count++
-                layout(constraints.minWidth, constraints.minHeight) {}
+        measurePolicy =
+            remember {
+                MeasurePolicy { _, constraints ->
+                    counter.count++
+                    layout(constraints.minWidth, constraints.minHeight) {}
+                }
             }
-        }
     )
 }
 
 /**
  * A simple test layout that does the bare minimum required to lay out an arbitrary number of
- * children reasonably.  Useful for Semantics hierarchy testing
+ * children reasonably. Useful for Semantics hierarchy testing
  */
 @Composable
 private fun SimpleTestLayout(modifier: Modifier = Modifier, content: @Composable () -> Unit) {
@@ -1318,21 +1196,14 @@
         if (measurables.isEmpty()) {
             layout(constraints.minWidth, constraints.minHeight) {}
         } else {
-            val placeables = measurables.map {
-                it.measure(constraints)
-            }
-            val (width, height) = with(placeables.filterNotNull()) {
-                Pair(
-                    max(
-                        maxByOrNull { it.width }?.width ?: 0,
-                        constraints.minWidth
-                    ),
-                    max(
-                        maxByOrNull { it.height }?.height ?: 0,
-                        constraints.minHeight
+            val placeables = measurables.map { it.measure(constraints) }
+            val (width, height) =
+                with(placeables.filterNotNull()) {
+                    Pair(
+                        max(maxByOrNull { it.width }?.width ?: 0, constraints.minWidth),
+                        max(maxByOrNull { it.height }?.height ?: 0, constraints.minHeight)
                     )
-                )
-            }
+                }
             layout(width, height) {
                 for (placeable in placeables) {
                     placeable.placeRelative(0, 0)
@@ -1363,26 +1234,23 @@
         val looseConstraints = constraints.copy(minWidth = 0, minHeight = 0)
 
         layout(layoutWidth, layoutHeight) {
-            val placeablesOne = subcompose(TestSlot.First, contentOne).fastMap {
-                it.measure(looseConstraints)
-            }
+            val placeablesOne =
+                subcompose(TestSlot.First, contentOne).fastMap { it.measure(looseConstraints) }
 
-            val placeablesTwo = subcompose(TestSlot.Second, contentTwo).fastMap {
-                it.measure(looseConstraints)
-            }
+            val placeablesTwo =
+                subcompose(TestSlot.Second, contentTwo).fastMap { it.measure(looseConstraints) }
 
             // Placing to control drawing order to match default elevation of each placeable
-            placeablesOne.fastForEach {
-                it.place(positionOne.x.toInt(), positionOne.y.toInt())
-            }
-            placeablesTwo.fastForEach {
-                it.place(positionTwo.x.toInt(), positionTwo.y.toInt())
-            }
+            placeablesOne.fastForEach { it.place(positionOne.x.toInt(), positionOne.y.toInt()) }
+            placeablesTwo.fastForEach { it.place(positionTwo.x.toInt(), positionTwo.y.toInt()) }
         }
     }
 }
 
-private enum class TestSlot { First, Second }
+private enum class TestSlot {
+    First,
+    Second
+}
 
 internal fun SemanticsMod(
     mergeDescendants: Boolean = false,
@@ -1401,5 +1269,6 @@
 
 internal data class NodeElement(val node: Modifier.Node) : ModifierNodeElement<Modifier.Node>() {
     override fun create(): Modifier.Node = node
+
     override fun update(node: Modifier.Node) {}
 }
diff --git a/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/test/TestActivity.kt b/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/test/TestActivity.kt
index cfccdda..7d70538 100644
--- a/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/test/TestActivity.kt
+++ b/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/test/TestActivity.kt
@@ -65,10 +65,9 @@
 }
 
 /**
- * We have a ViewLayer that doesn't use reflection that won't be activated on
- * any Google devices, so we must trigger it directly. Here, we use it on all P
- * devices. The normal ViewLayer is used on L devices. RenderNodeLayer is used
- * on all other devices.
+ * We have a ViewLayer that doesn't use reflection that won't be activated on any Google devices, so
+ * we must trigger it directly. Here, we use it on all P devices. The normal ViewLayer is used on L
+ * devices. RenderNodeLayer is used on all other devices.
  */
 internal fun setViewLayerTypeForApi28() {
     if (Build.VERSION.SDK_INT == Build.VERSION_CODES.P) {
diff --git a/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/text/TextMeasurerHelperTest.kt b/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/text/TextMeasurerHelperTest.kt
index 0b655a3..adc819d 100644
--- a/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/text/TextMeasurerHelperTest.kt
+++ b/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/text/TextMeasurerHelperTest.kt
@@ -39,8 +39,7 @@
 @RunWith(AndroidJUnit4::class)
 class TextMeasurerHelperTest {
 
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
     val context = InstrumentationRegistry.getInstrumentation().targetContext
 
@@ -50,9 +49,7 @@
         val measurers = mutableSetOf<TextMeasurer>()
 
         rule.setContent {
-            CompositionLocalProvider(
-                LocalFontFamilyResolver provides fontFamilyResolver.value
-            ) {
+            CompositionLocalProvider(LocalFontFamilyResolver provides fontFamilyResolver.value) {
                 val textMeasurer = rememberTextMeasurer()
                 measurers.add(textMeasurer)
             }
@@ -73,9 +70,7 @@
         val measurers = mutableSetOf<TextMeasurer>()
 
         rule.setContent {
-            CompositionLocalProvider(
-                LocalDensity provides density.value
-            ) {
+            CompositionLocalProvider(LocalDensity provides density.value) {
                 val textMeasurer = rememberTextMeasurer()
                 measurers.add(textMeasurer)
             }
@@ -94,9 +89,7 @@
         val measurers = mutableSetOf<TextMeasurer>()
 
         rule.setContent {
-            CompositionLocalProvider(
-                LocalLayoutDirection provides layoutDirection.value
-            ) {
+            CompositionLocalProvider(LocalLayoutDirection provides layoutDirection.value) {
                 val textMeasurer = rememberTextMeasurer()
                 measurers.add(textMeasurer)
             }
diff --git a/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/text/input/AndroidPlatformTextInputSessionTest.kt b/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/text/input/AndroidPlatformTextInputSessionTest.kt
index 5f19f2f..ce7e3bf 100644
--- a/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/text/input/AndroidPlatformTextInputSessionTest.kt
+++ b/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/text/input/AndroidPlatformTextInputSessionTest.kt
@@ -46,36 +46,39 @@
     private var hideKeyboardCalls = 0
 
     private val view = View(InstrumentationRegistry.getInstrumentation().context)
-    private val inputService = TextInputService(object : PlatformTextInputService {
-        override fun startInput() {
-            startInputCalls++
-        }
+    private val inputService =
+        TextInputService(
+            object : PlatformTextInputService {
+                override fun startInput() {
+                    startInputCalls++
+                }
 
-        override fun stopInput() {
-            stopInputCalls++
-        }
+                override fun stopInput() {
+                    stopInputCalls++
+                }
 
-        override fun showSoftwareKeyboard() {
-            showKeyboardCalls++
-        }
+                override fun showSoftwareKeyboard() {
+                    showKeyboardCalls++
+                }
 
-        override fun hideSoftwareKeyboard() {
-            hideKeyboardCalls++
-        }
+                override fun hideSoftwareKeyboard() {
+                    hideKeyboardCalls++
+                }
 
-        override fun startInput(
-            value: TextFieldValue,
-            imeOptions: ImeOptions,
-            onEditCommand: (List<EditCommand>) -> Unit,
-            onImeActionPerformed: (ImeAction) -> Unit
-        ) {
-            fail("Not supported")
-        }
+                override fun startInput(
+                    value: TextFieldValue,
+                    imeOptions: ImeOptions,
+                    onEditCommand: (List<EditCommand>) -> Unit,
+                    onImeActionPerformed: (ImeAction) -> Unit
+                ) {
+                    fail("Not supported")
+                }
 
-        override fun updateState(oldValue: TextFieldValue?, newValue: TextFieldValue) {
-            fail("not supported")
-        }
-    })
+                override fun updateState(oldValue: TextFieldValue?, newValue: TextFieldValue) {
+                    fail("not supported")
+                }
+            }
+        )
 
     @Test
     fun keyboardNotShown_whenStartInputMethodNotCalled() = runTest {
@@ -88,9 +91,7 @@
     fun keyboardShown_whenStartInputMethodCalled() = runTest {
         val session = AndroidPlatformTextInputSession(view, inputService, coroutineScope = this)
 
-        launch {
-            session.startInputMethod(TestInputMethodRequest(view))
-        }
+        launch { session.startInputMethod(TestInputMethodRequest(view)) }
         advanceUntilIdle()
 
         assertThat(startInputCalls).isEqualTo(1)
@@ -102,9 +103,7 @@
     @Test
     fun keyboardHidden_whenInnerSessionCanceled() = runTest {
         val session = AndroidPlatformTextInputSession(view, inputService, coroutineScope = this)
-        val sessionJob = launch {
-            session.startInputMethod(TestInputMethodRequest(view))
-        }
+        val sessionJob = launch { session.startInputMethod(TestInputMethodRequest(view)) }
         advanceUntilIdle()
 
         sessionJob.cancel()
@@ -132,14 +131,10 @@
     @Test
     fun keyboardNotHidden_whenInnerSessionInterrupted() = runTest {
         val session = AndroidPlatformTextInputSession(view, inputService, coroutineScope = this)
-        launch {
-            session.startInputMethod(TestInputMethodRequest(view))
-        }
+        launch { session.startInputMethod(TestInputMethodRequest(view)) }
         advanceUntilIdle()
 
-        launch {
-            session.startInputMethod(TestInputMethodRequest(view))
-        }
+        launch { session.startInputMethod(TestInputMethodRequest(view)) }
         advanceUntilIdle()
 
         assertThat(startInputCalls).isEqualTo(2)
diff --git a/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/text/input/InterceptPlatformTextInputTest.kt b/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/text/input/InterceptPlatformTextInputTest.kt
index 623cd16..381c357 100644
--- a/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/text/input/InterceptPlatformTextInputTest.kt
+++ b/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/text/input/InterceptPlatformTextInputTest.kt
@@ -84,8 +84,7 @@
 @RunWith(AndroidJUnit4::class)
 class InterceptPlatformTextInputTest {
 
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
     private lateinit var testNode: TestNode
     private lateinit var coroutineScope: CoroutineScope
@@ -97,23 +96,15 @@
         val testRequest = TaggedRequest()
         val interceptor = PlatformTextInputInterceptor { request, _ ->
             lastRequest = request
-            suspendCancellableCoroutine {
-                lastContinuation = it
-            }
+            suspendCancellableCoroutine { lastContinuation = it }
         }
-        setContent {
-            InterceptPlatformTextInput(interceptor) {
-                FakeTextField()
-            }
-        }
+        setContent { InterceptPlatformTextInput(interceptor) { FakeTextField() } }
 
         rule.runOnIdle {
             coroutineScope.launch {
                 testNode.establishTextInputSession {
                     // This context should be propagated to startInputMethod.
-                    withContext(CoroutineName("original")) {
-                        startInputMethod(testRequest)
-                    }
+                    withContext(CoroutineName("original")) { startInputMethod(testRequest) }
                 }
             }
         }
@@ -135,15 +126,11 @@
             }
         }
         val parentInterceptor = PlatformTextInputInterceptor { _, _ ->
-            suspendCancellableCoroutine {
-                lastContinuation = it
-            }
+            suspendCancellableCoroutine { lastContinuation = it }
         }
         setContent {
             InterceptPlatformTextInput(parentInterceptor) {
-                InterceptPlatformTextInput(childInterceptor) {
-                    FakeTextField()
-                }
+                InterceptPlatformTextInput(childInterceptor) { FakeTextField() }
             }
         }
 
@@ -151,9 +138,7 @@
             coroutineScope.launch {
                 testNode.establishTextInputSession {
                     // This context should be propagated to startInputMethod.
-                    withContext(CoroutineName("original")) {
-                        startInputMethod(testRequest)
-                    }
+                    withContext(CoroutineName("original")) { startInputMethod(testRequest) }
                 }
             }
         }
@@ -172,11 +157,7 @@
         val interceptor = PlatformTextInputInterceptor { _, _ ->
             throw ExpectedException().also { thrownException = it }
         }
-        setContent {
-            InterceptPlatformTextInput(interceptor) {
-                FakeTextField()
-            }
-        }
+        setContent { InterceptPlatformTextInput(interceptor) { FakeTextField() } }
 
         var exceptionFromInputNode: ExpectedException? = null
         rule.runOnIdle {
@@ -217,17 +198,13 @@
         }
         setContent {
             InterceptPlatformTextInput(parentInterceptor) {
-                InterceptPlatformTextInput(childInterceptor) {
-                    FakeTextField()
-                }
+                InterceptPlatformTextInput(childInterceptor) { FakeTextField() }
             }
         }
 
         rule.runOnIdle {
             coroutineScope.launch {
-                testNode.establishTextInputSession {
-                    startInputMethod(testRequest)
-                }
+                testNode.establishTextInputSession { startInputMethod(testRequest) }
             }
         }
         // Let the session start.
@@ -256,9 +233,7 @@
                 expect(1)
                 // If we don't use NonCancellable, join will immediately throw when it tries to
                 // suspend since this context is already cancelled.
-                withContext(NonCancellable) {
-                    finishInterceptor1FinallyTrigger.join()
-                }
+                withContext(NonCancellable) { finishInterceptor1FinallyTrigger.join() }
                 expect(3)
             }
         }
@@ -267,17 +242,11 @@
             awaitCancellation()
         }
         var interceptor by mutableStateOf(interceptor1)
-        setContent {
-            InterceptPlatformTextInput(interceptor) {
-                FakeTextField()
-            }
-        }
+        setContent { InterceptPlatformTextInput(interceptor) { FakeTextField() } }
 
         rule.runOnIdle {
             coroutineScope.launch {
-                testNode.establishTextInputSession {
-                    startInputMethod(TaggedRequest())
-                }
+                testNode.establishTextInputSession { startInputMethod(TaggedRequest()) }
             }
         }
 
@@ -291,40 +260,33 @@
             finishInterceptor1FinallyTrigger.complete()
         }
 
-        rule.runOnIdle {
-            expect(5)
-        }
+        rule.runOnIdle { expect(5) }
     }
 
     @Test
     fun interceptor_doesntCancelDownstream_whenChangedDuringSession() {
         var downstreamSessionCancelled = false
         var session2Started = false
-        val interceptor1 = PlatformTextInputInterceptor { _, _ ->
-            awaitCancellation()
-        }
+        val interceptor1 = PlatformTextInputInterceptor { _, _ -> awaitCancellation() }
         val interceptor2 = PlatformTextInputInterceptor { _, _ ->
             session2Started = true
             awaitCancellation()
         }
         var interceptor by mutableStateOf(interceptor1)
-        setContent {
-            InterceptPlatformTextInput(interceptor) {
-                FakeTextField()
-            }
-        }
+        setContent { InterceptPlatformTextInput(interceptor) { FakeTextField() } }
 
-        val sessionJob = rule.runOnIdle {
-            coroutineScope.launch {
-                testNode.establishTextInputSession {
-                    try {
-                        startInputMethod(TaggedRequest())
-                    } finally {
-                        downstreamSessionCancelled = true
+        val sessionJob =
+            rule.runOnIdle {
+                coroutineScope.launch {
+                    testNode.establishTextInputSession {
+                        try {
+                            startInputMethod(TaggedRequest())
+                        } finally {
+                            downstreamSessionCancelled = true
+                        }
                     }
                 }
             }
-        }
 
         rule.runOnIdle {
             assertTrue(sessionJob.isActive)
@@ -356,17 +318,13 @@
         setContent {
             InterceptPlatformTextInput(rootInterceptor) {
                 InterceptPlatformTextInput(interceptor1) {
-                    InterceptPlatformTextInput(interceptor2) {
-                        FakeTextField()
-                    }
+                    InterceptPlatformTextInput(interceptor2) { FakeTextField() }
                 }
             }
         }
         rule.runOnIdle {
             coroutineScope.launch {
-                testNode.establishTextInputSession {
-                    startInputMethod(TaggedRequest("original"))
-                }
+                testNode.establishTextInputSession { startInputMethod(TaggedRequest("original")) }
             }
         }
 
@@ -384,9 +342,7 @@
         }
         setContent {
             InterceptPlatformTextInput(interceptor) {
-                Dialog(onDismissRequest = {}) {
-                    FakeTextField()
-                }
+                Dialog(onDismissRequest = {}) { FakeTextField() }
             }
         }
 
@@ -410,9 +366,7 @@
             init {
                 ComposeView(context).also {
                     addView(it)
-                    it.setContent {
-                        FakeTextField()
-                    }
+                    it.setContent { FakeTextField() }
                 }
             }
         }
@@ -426,11 +380,11 @@
         }
         setContent {
             InterceptPlatformTextInput(interceptor) {
-                AndroidView(factory = { context ->
-                    FakeTextFieldAndroidView(context).also {
-                        innerAndroidView = it
+                AndroidView(
+                    factory = { context ->
+                        FakeTextFieldAndroidView(context).also { innerAndroidView = it }
                     }
-                })
+                )
             }
         }
 
@@ -458,16 +412,12 @@
         val interceptor = PlatformTextInputInterceptor { _, _ -> awaitCancellation() }
         setContent {
             hostView = LocalView.current
-            InterceptPlatformTextInput(interceptor) {
-                FakeTextField()
-            }
+            InterceptPlatformTextInput(interceptor) { FakeTextField() }
         }
 
         rule.runOnIdle {
             coroutineScope.launch {
-                testNode.establishTextInputSession {
-                    startInputMethod(TaggedRequest())
-                }
+                testNode.establishTextInputSession { startInputMethod(TaggedRequest()) }
             }
         }
         // Let the session start.
@@ -495,36 +445,28 @@
         var currentInterceptor by mutableStateOf(interceptor1)
         setContent {
             InterceptPlatformTextInput(parentInterceptor) {
-                InterceptPlatformTextInput(currentInterceptor) {
-                    FakeTextField()
-                }
+                InterceptPlatformTextInput(currentInterceptor) { FakeTextField() }
             }
         }
 
-        val testJob = rule.runOnIdle {
-            coroutineScope.launch {
-                testNode.establishTextInputSession {
-                    // This context should be propagated to startInputMethod.
-                    startInputMethod(TaggedRequest("root"))
+        val testJob =
+            rule.runOnIdle {
+                coroutineScope.launch {
+                    testNode.establishTextInputSession {
+                        // This context should be propagated to startInputMethod.
+                        startInputMethod(TaggedRequest("root"))
+                    }
                 }
             }
-        }
         // Let the session start.
-        rule.runOnIdle {
-            assertThat(requests).containsExactly("one wrapping root").inOrder()
-        }
+        rule.runOnIdle { assertThat(requests).containsExactly("one wrapping root").inOrder() }
 
         currentInterceptor = interceptor2
 
         // Let the session restart.
-        rule.waitUntil {
-            requests.size == 2
-        }
+        rule.waitUntil { requests.size == 2 }
         rule.runOnIdle {
-            assertThat(requests).containsExactly(
-                "one wrapping root",
-                "two wrapping root"
-            ).inOrder()
+            assertThat(requests).containsExactly("one wrapping root", "two wrapping root").inOrder()
 
             // Root request shouldn't be cancelled.
             assertTrue(testJob.isActive)
@@ -553,33 +495,30 @@
         }
         setContent {
             InterceptPlatformTextInput(parentInterceptor) {
-                InterceptPlatformTextInput(interceptor) {
-                    FakeTextField()
-                }
+                InterceptPlatformTextInput(interceptor) { FakeTextField() }
             }
         }
-        val testJob = rule.runOnIdle {
-            coroutineScope.launch {
-                testNode.establishTextInputSession {
-                    // This context should be propagated to startInputMethod.
-                    startInputMethod(TaggedRequest("root"))
+        val testJob =
+            rule.runOnIdle {
+                coroutineScope.launch {
+                    testNode.establishTextInputSession {
+                        // This context should be propagated to startInputMethod.
+                        startInputMethod(TaggedRequest("root"))
+                    }
                 }
             }
-        }
         // Let the session start.
-        rule.runOnIdle {
-            assertThat(requests).isEmpty()
-        }
+        rule.runOnIdle { assertThat(requests).isEmpty() }
 
         assertTrue(requestTrigger.trySend(0).isSuccess)
 
-        rule.waitUntil {
-            requests.size == 1
-        }
+        rule.waitUntil { requests.size == 1 }
         rule.runOnIdle {
-            assertThat(requests).containsExactly(
-                "0 wrapping root",
-            ).inOrder()
+            assertThat(requests)
+                .containsExactly(
+                    "0 wrapping root",
+                )
+                .inOrder()
 
             // Root request shouldn't be cancelled.
             assertTrue(testJob.isActive)
@@ -587,14 +526,14 @@
 
         assertTrue(requestTrigger.trySend(1).isSuccess)
 
-        rule.waitUntil {
-            requests.size == 2
-        }
+        rule.waitUntil { requests.size == 2 }
         rule.runOnIdle {
-            assertThat(requests).containsExactly(
-                "0 wrapping root",
-                "1 wrapping root",
-            ).inOrder()
+            assertThat(requests)
+                .containsExactly(
+                    "0 wrapping root",
+                    "1 wrapping root",
+                )
+                .inOrder()
 
             // Root request shouldn't be cancelled.
             assertTrue(testJob.isActive)
@@ -608,9 +547,7 @@
             InterceptPlatformTextInput(
                 content = content,
                 interceptor = { request, nextHandler ->
-                    withContext(CoroutineName(name)) {
-                        nextHandler.startInputMethod(request)
-                    }
+                    withContext(CoroutineName(name)) { nextHandler.startInputMethod(request) }
                 }
             )
         }
@@ -623,16 +560,12 @@
         var name by mutableStateOf("one")
         setContent {
             InterceptPlatformTextInput(rootInterceptor) {
-                NamedSessionInterceptor(name) {
-                    FakeTextField()
-                }
+                NamedSessionInterceptor(name) { FakeTextField() }
             }
         }
         rule.runOnIdle {
             coroutineScope.launch {
-                testNode.establishTextInputSession {
-                    startInputMethod(TaggedRequest())
-                }
+                testNode.establishTextInputSession { startInputMethod(TaggedRequest()) }
             }
         }
 
@@ -641,9 +574,7 @@
             name = "two"
         }
 
-        rule.runOnIdle {
-            assertThat(lastSessionContext[CoroutineName]?.name).isEqualTo("two")
-        }
+        rule.runOnIdle { assertThat(lastSessionContext[CoroutineName]?.name).isEqualTo("two") }
     }
 
     private fun setContent(content: @Composable () -> Unit) {
@@ -655,11 +586,7 @@
 
     @Composable
     private fun FakeTextField(modifier: Modifier = Modifier) {
-        Box(
-            modifier
-                .then(TestElement { testNode = it })
-                .size(1.dp)
-        )
+        Box(modifier.then(TestElement { testNode = it }).size(1.dp))
     }
 
     private tailrec fun View.isSameOrDescendentOf(expectedParent: ViewGroup): Boolean {
@@ -669,18 +596,17 @@
         return myParent.isSameOrDescendentOf(expectedParent)
     }
 
-    private data class TestElement(
-        val onNode: (TestNode) -> Unit
-    ) : ModifierNodeElement<TestNode>() {
+    private data class TestElement(val onNode: (TestNode) -> Unit) :
+        ModifierNodeElement<TestNode>() {
         override fun create(): TestNode = TestNode(onNode)
+
         override fun update(node: TestNode) {
             node.onNode = onNode
         }
     }
 
-    private class TestNode(
-        var onNode: (TestNode) -> Unit
-    ) : Modifier.Node(), PlatformTextInputModifierNode {
+    private class TestNode(var onNode: (TestNode) -> Unit) :
+        Modifier.Node(), PlatformTextInputModifierNode {
 
         override fun onAttach() {
             onNode(this)
@@ -702,7 +628,9 @@
             TODO("Not yet implemented")
 
         override fun getSelectedText(flags: Int): CharSequence = TODO("Not yet implemented")
+
         override fun getCursorCapsMode(reqModes: Int): Int = TODO("Not yet implemented")
+
         override fun getExtractedText(request: ExtractedTextRequest?, flags: Int): ExtractedText =
             TODO("Not yet implemented")
 
@@ -717,25 +645,34 @@
         override fun setComposingText(text: CharSequence?, newCursorPosition: Int): Boolean =
             TODO("Not yet implemented")
 
-        override fun setComposingRegion(start: Int, end: Int): Boolean =
-            TODO("Not yet implemented")
+        override fun setComposingRegion(start: Int, end: Int): Boolean = TODO("Not yet implemented")
 
         override fun finishComposingText(): Boolean = TODO("Not yet implemented")
+
         override fun commitText(text: CharSequence?, newCursorPosition: Int): Boolean =
             TODO("Not yet implemented")
 
         override fun commitCompletion(text: CompletionInfo?): Boolean = TODO("Not yet implemented")
+
         override fun commitCorrection(correctionInfo: CorrectionInfo?): Boolean =
             TODO("Not yet implemented")
 
         override fun setSelection(start: Int, end: Int): Boolean = TODO("Not yet implemented")
+
         override fun performEditorAction(editorAction: Int): Boolean = TODO("Not yet implemented")
+
         override fun performContextMenuAction(id: Int): Boolean = TODO("Not yet implemented")
+
         override fun beginBatchEdit(): Boolean = TODO("Not yet implemented")
+
         override fun endBatchEdit(): Boolean = TODO("Not yet implemented")
+
         override fun sendKeyEvent(event: KeyEvent?): Boolean = TODO("Not yet implemented")
+
         override fun clearMetaKeyStates(states: Int): Boolean = TODO("Not yet implemented")
+
         override fun reportFullscreenMode(enabled: Boolean): Boolean = TODO("Not yet implemented")
+
         override fun performPrivateCommand(action: String?, data: Bundle?): Boolean =
             TODO("Not yet implemented")
 
@@ -743,7 +680,9 @@
             TODO("Not yet implemented")
 
         override fun getHandler(): Handler = TODO("Not yet implemented")
+
         override fun closeConnection(): Unit = TODO("Not yet implemented")
+
         override fun commitContent(
             inputContentInfo: InputContentInfo,
             flags: Int,
diff --git a/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/text/input/NullableInputConnectionWrapperTest.kt b/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/text/input/NullableInputConnectionWrapperTest.kt
index 952e014..fbebdf2 100644
--- a/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/text/input/NullableInputConnectionWrapperTest.kt
+++ b/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/text/input/NullableInputConnectionWrapperTest.kt
@@ -56,10 +56,8 @@
     @Test
     fun delegatesCommitContentToDelegate() {
         val ic = NullableInputConnectionWrapper(delegate, onConnectionClosed = {})
-        val contentInfo = InputContentInfo(
-            Uri.parse("content://example.com"),
-            ClipDescription("", emptyArray())
-        )
+        val contentInfo =
+            InputContentInfo(Uri.parse("content://example.com"), ClipDescription("", emptyArray()))
         ic.commitContent(contentInfo, 42, null)
         verify(delegate).commitContent(contentInfo, 42, null)
     }
@@ -68,10 +66,7 @@
     @Test
     fun closeConnectionInvokesCallback() {
         var closeCalls = 0
-        val ic = NullableInputConnectionWrapper(
-            delegate,
-            onConnectionClosed = { closeCalls++ }
-        )
+        val ic = NullableInputConnectionWrapper(delegate, onConnectionClosed = { closeCalls++ })
         assertThat(closeCalls).isEqualTo(0)
 
         ic.closeConnection()
@@ -82,25 +77,17 @@
     @Test
     fun multipleCloseConnectionsInvokesCallbackOnlyOnce() {
         var closeCalls = 0
-        val ic = NullableInputConnectionWrapper(
-            delegate,
-            onConnectionClosed = { closeCalls++ }
-        )
+        val ic = NullableInputConnectionWrapper(delegate, onConnectionClosed = { closeCalls++ })
         assertThat(closeCalls).isEqualTo(0)
 
-        repeat(5) {
-            ic.closeConnection()
-        }
+        repeat(5) { ic.closeConnection() }
         assertThat(closeCalls).isEqualTo(1)
     }
 
     @Test
     fun disposeDelegateDoesNotInvokeCallback() {
         var closeCalls = 0
-        val ic = NullableInputConnectionWrapper(
-            delegate,
-            onConnectionClosed = { closeCalls++ }
-        )
+        val ic = NullableInputConnectionWrapper(delegate, onConnectionClosed = { closeCalls++ })
         assertThat(closeCalls).isEqualTo(0)
 
         ic.disposeDelegate()
diff --git a/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/text/input/PlatformTextInputMethodTestOverrideTest.kt b/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/text/input/PlatformTextInputMethodTestOverrideTest.kt
index 98ec4e2..518eb6b 100644
--- a/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/text/input/PlatformTextInputMethodTestOverrideTest.kt
+++ b/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/text/input/PlatformTextInputMethodTestOverrideTest.kt
@@ -53,8 +53,7 @@
 @RunWith(AndroidJUnit4::class)
 class PlatformTextInputMethodTestOverrideTest {
 
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
     private lateinit var testNode: TestNode
     private lateinit var hostView: View
@@ -66,31 +65,29 @@
         val testRequest = PlatformTextInputMethodRequest { fail("not needed") }
         val coroutineName = "this is a test"
 
-        val testHandler = object : PlatformTextInputSession {
-            override val view: View
-                get() = fail("not needed")
+        val testHandler =
+            object : PlatformTextInputSession {
+                override val view: View
+                    get() = fail("not needed")
 
-            override suspend fun startInputMethod(
-                request: PlatformTextInputMethodRequest
-            ): Nothing {
-                lastRequest = request
-                suspendCancellableCoroutine<Nothing> {
-                    lastContinuation = it
+                override suspend fun startInputMethod(
+                    request: PlatformTextInputMethodRequest
+                ): Nothing {
+                    lastRequest = request
+                    suspendCancellableCoroutine<Nothing> { lastContinuation = it }
                 }
             }
-        }
         setContent(testHandler)
 
-        val testJob = rule.runOnIdle {
-            launch {
-                testNode.establishTextInputSession {
-                    // This context should be propagated to startInputMethod.
-                    withContext(CoroutineName(coroutineName)) {
-                        startInputMethod(testRequest)
+        val testJob =
+            rule.runOnIdle {
+                launch {
+                    testNode.establishTextInputSession {
+                        // This context should be propagated to startInputMethod.
+                        withContext(CoroutineName(coroutineName)) { startInputMethod(testRequest) }
                     }
                 }
             }
-        }
         // Let the session start.
         testScheduler.advanceUntilIdle()
 
@@ -103,23 +100,21 @@
     fun overrideBlocksSystemHandler() = runTest {
         val testRequest = PlatformTextInputMethodRequest { fail("not needed") }
 
-        val testHandler = object : PlatformTextInputSession {
-            override val view: View
-                get() = fail("not needed")
+        val testHandler =
+            object : PlatformTextInputSession {
+                override val view: View
+                    get() = fail("not needed")
 
-            override suspend fun startInputMethod(
-                request: PlatformTextInputMethodRequest
-            ): Nothing = awaitCancellation()
-        }
+                override suspend fun startInputMethod(
+                    request: PlatformTextInputMethodRequest
+                ): Nothing = awaitCancellation()
+            }
         setContent(testHandler)
 
-        val testJob = rule.runOnIdle {
-            launch {
-                testNode.establishTextInputSession {
-                    startInputMethod(testRequest)
-                }
+        val testJob =
+            rule.runOnIdle {
+                launch { testNode.establishTextInputSession { startInputMethod(testRequest) } }
             }
-        }
         // Let the session start.
         testScheduler.advanceUntilIdle()
 
@@ -134,27 +129,22 @@
         rule.setContent {
             hostView = LocalView.current
             PlatformTextInputMethodTestOverride(sessionHandler = testHandler) {
-                Box(
-                    Modifier
-                        .size(1.dp)
-                        .then(TestElement { testNode = it })
-                )
+                Box(Modifier.size(1.dp).then(TestElement { testNode = it }))
             }
         }
     }
 
-    private data class TestElement(
-        val onNode: (TestNode) -> Unit
-    ) : ModifierNodeElement<TestNode>() {
+    private data class TestElement(val onNode: (TestNode) -> Unit) :
+        ModifierNodeElement<TestNode>() {
         override fun create(): TestNode = TestNode(onNode)
+
         override fun update(node: TestNode) {
             node.onNode = onNode
         }
     }
 
-    private class TestNode(
-        var onNode: (TestNode) -> Unit
-    ) : Modifier.Node(), PlatformTextInputModifierNode {
+    private class TestNode(var onNode: (TestNode) -> Unit) :
+        Modifier.Node(), PlatformTextInputModifierNode {
 
         override fun onAttach() {
             onNode(this)
diff --git a/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/text/input/PlatformTextInputViewIntegrationTest.kt b/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/text/input/PlatformTextInputViewIntegrationTest.kt
index 8eba172..c4ad2bf 100644
--- a/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/text/input/PlatformTextInputViewIntegrationTest.kt
+++ b/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/text/input/PlatformTextInputViewIntegrationTest.kt
@@ -48,8 +48,7 @@
 @RunWith(AndroidJUnit4::class)
 class PlatformTextInputViewIntegrationTest {
 
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
     private lateinit var hostView: AndroidComposeView
     private lateinit var coroutineScope: CoroutineScope
@@ -58,6 +57,7 @@
 
     // Used for ordering tests.
     private var expected = 0
+
     private fun expect(value: Int) {
         assertThat(expected).isEqualTo(value)
         expected++
@@ -90,24 +90,16 @@
     @Test
     fun checkIsTextEditor_returnsFalse_whenNoSessionActive() {
         setupContent()
-        rule.runOnIdle {
-            assertThat(hostView.onCheckIsTextEditor()).isFalse()
-        }
+        rule.runOnIdle { assertThat(hostView.onCheckIsTextEditor()).isFalse() }
     }
 
     @Test
     fun checkIsTextEditor_returnsFalse_whenNoInnerSessionActive() {
         setupContent()
 
-        coroutineScope.launch {
-            node1.establishTextInputSession {
-                awaitCancellation()
-            }
-        }
+        coroutineScope.launch { node1.establishTextInputSession { awaitCancellation() } }
 
-        rule.runOnIdle {
-            assertThat(hostView.onCheckIsTextEditor()).isFalse()
-        }
+        rule.runOnIdle { assertThat(hostView.onCheckIsTextEditor()).isFalse() }
     }
 
     @Test
@@ -115,52 +107,37 @@
         setupContent()
 
         coroutineScope.launch {
-            node1.establishTextInputSession {
-                startInputMethod(TestInputMethodRequest(view))
-            }
+            node1.establishTextInputSession { startInputMethod(TestInputMethodRequest(view)) }
         }
 
-        rule.runOnIdle {
-            assertThat(hostView.onCheckIsTextEditor()).isTrue()
-        }
+        rule.runOnIdle { assertThat(hostView.onCheckIsTextEditor()).isTrue() }
 
         // Handoff session to another node.
-        val sessionJob = coroutineScope.launch {
-            node2.establishTextInputSession {
-                startInputMethod(TestInputMethodRequest(view))
+        val sessionJob =
+            coroutineScope.launch {
+                node2.establishTextInputSession { startInputMethod(TestInputMethodRequest(view)) }
             }
-        }
 
         rule.runOnIdle {
             assertThat(hostView.onCheckIsTextEditor()).isTrue()
             sessionJob.cancel()
         }
 
-        rule.runOnIdle {
-            assertThat(hostView.onCheckIsTextEditor()).isFalse()
-        }
+        rule.runOnIdle { assertThat(hostView.onCheckIsTextEditor()).isFalse() }
     }
 
     @Test
     fun createInputConnection_returnsNull_whenNoSessionActive() {
         setupContent()
-        rule.runOnIdle {
-            assertThat(hostView.onCreateInputConnection(EditorInfo())).isNull()
-        }
+        rule.runOnIdle { assertThat(hostView.onCreateInputConnection(EditorInfo())).isNull() }
     }
 
     @Test
     fun createInputConnection_returnsNull_whenNoInnerSessionActive() {
         setupContent()
-        coroutineScope.launch {
-            node1.establishTextInputSession {
-                awaitCancellation()
-            }
-        }
+        coroutineScope.launch { node1.establishTextInputSession { awaitCancellation() } }
 
-        rule.runOnIdle {
-            assertThat(hostView.onCreateInputConnection(EditorInfo())).isNull()
-        }
+        rule.runOnIdle { assertThat(hostView.onCreateInputConnection(EditorInfo())).isNull() }
     }
 
     @Test
@@ -171,12 +148,17 @@
         val request2Texts = mutableListOf<String>()
         coroutineScope.launch {
             node2.establishTextInputSession {
-                startInputMethod(object : TestInputMethodRequest(view) {
-                    override fun commitText(text: CharSequence?, newCursorPosition: Int): Boolean {
-                        request1Texts += text.toString()
-                        return true
+                startInputMethod(
+                    object : TestInputMethodRequest(view) {
+                        override fun commitText(
+                            text: CharSequence?,
+                            newCursorPosition: Int
+                        ): Boolean {
+                            request1Texts += text.toString()
+                            return true
+                        }
                     }
-                })
+                )
             }
         }
 
@@ -184,36 +166,37 @@
             val connection1 = hostView.onCreateInputConnection(editorInfo)
             assertNotNull(connection1)
             connection1.commitText("hello", 1)
-            assertThat(request1Texts).containsExactly("hello")
-                .inOrder()
+            assertThat(request1Texts).containsExactly("hello").inOrder()
             assertThat(request2Texts).isEmpty()
         }
 
-        val sessionJob = coroutineScope.launch {
-            node1.establishTextInputSession {
-                startInputMethod(object : TestInputMethodRequest(view) {
-                    override fun commitText(text: CharSequence?, newCursorPosition: Int): Boolean {
-                        request2Texts += text.toString()
-                        return true
-                    }
-                })
+        val sessionJob =
+            coroutineScope.launch {
+                node1.establishTextInputSession {
+                    startInputMethod(
+                        object : TestInputMethodRequest(view) {
+                            override fun commitText(
+                                text: CharSequence?,
+                                newCursorPosition: Int
+                            ): Boolean {
+                                request2Texts += text.toString()
+                                return true
+                            }
+                        }
+                    )
+                }
             }
-        }
         rule.runOnIdle {
             val connection2 = hostView.onCreateInputConnection(editorInfo)
             assertNotNull(connection2)
             connection2.commitText("world", 1)
-            assertThat(request1Texts).containsExactly("hello")
-                .inOrder()
-            assertThat(request2Texts).containsExactly("world")
-                .inOrder()
+            assertThat(request1Texts).containsExactly("hello").inOrder()
+            assertThat(request2Texts).containsExactly("world").inOrder()
 
             sessionJob.cancel()
         }
 
-        rule.runOnIdle {
-            assertThat(hostView.onCreateInputConnection(editorInfo)).isNull()
-        }
+        rule.runOnIdle { assertThat(hostView.onCreateInputConnection(editorInfo)).isNull() }
     }
 
     @Test
@@ -225,14 +208,16 @@
                 node1.establishTextInputSession {
                     expect(1)
                     try {
-                        startInputMethod(object : TestInputMethodRequest(view) {
-                            override fun createInputConnection(
-                                outAttributes: EditorInfo
-                            ): InputConnection {
-                                expect(2)
-                                return super.createInputConnection(outAttributes)
+                        startInputMethod(
+                            object : TestInputMethodRequest(view) {
+                                override fun createInputConnection(
+                                    outAttributes: EditorInfo
+                                ): InputConnection {
+                                    expect(2)
+                                    return super.createInputConnection(outAttributes)
+                                }
                             }
-                        })
+                        )
                     } catch (e: CancellationException) {
                         expect(4)
                         throw e
@@ -244,9 +229,7 @@
             }
         }
 
-        rule.runOnIdle {
-            assertThat(hostView.onCreateInputConnection(EditorInfo())).isNotNull()
-        }
+        rule.runOnIdle { assertThat(hostView.onCreateInputConnection(EditorInfo())).isNotNull() }
 
         coroutineScope.launch {
             expect(3)
@@ -256,9 +239,7 @@
             }
         }
 
-        rule.runOnIdle {
-            expect(7)
-        }
+        rule.runOnIdle { expect(7) }
     }
 
     // closeConnection is only supported on API 24+
@@ -266,30 +247,31 @@
     @Test
     fun connectionClosed_whenOuterSessionCanceled() {
         setupContent()
-        val sessionJob = coroutineScope.launch {
-            try {
-                node1.establishTextInputSession {
-                    try {
-                        startInputMethod(object : TestInputMethodRequest(view) {
-                            override fun closeConnection() {
-                                expect(1)
-                            }
-                        })
-                    } catch (e: CancellationException) {
-                        expect(2)
-                        throw e
+        val sessionJob =
+            coroutineScope.launch {
+                try {
+                    node1.establishTextInputSession {
+                        try {
+                            startInputMethod(
+                                object : TestInputMethodRequest(view) {
+                                    override fun closeConnection() {
+                                        expect(1)
+                                    }
+                                }
+                            )
+                        } catch (e: CancellationException) {
+                            expect(2)
+                            throw e
+                        }
                     }
+                } catch (e: CancellationException) {
+                    expect(3)
+                    throw e
                 }
-            } catch (e: CancellationException) {
-                expect(3)
-                throw e
             }
-        }
         expect(0)
 
-        rule.runOnIdle {
-            assertThat(hostView.onCreateInputConnection(EditorInfo())).isNotNull()
-        }
+        rule.runOnIdle { assertThat(hostView.onCreateInputConnection(EditorInfo())).isNotNull() }
 
         rule.runOnIdle {
             sessionJob.cancel()
@@ -308,18 +290,20 @@
                 node1.establishTextInputSession {
                     expect(1)
                     try {
-                        startInputMethod(object : TestInputMethodRequest(view) {
-                            override fun createInputConnection(
-                                outAttributes: EditorInfo
-                            ): InputConnection {
-                                expect(2)
-                                return super.createInputConnection(outAttributes)
-                            }
+                        startInputMethod(
+                            object : TestInputMethodRequest(view) {
+                                override fun createInputConnection(
+                                    outAttributes: EditorInfo
+                                ): InputConnection {
+                                    expect(2)
+                                    return super.createInputConnection(outAttributes)
+                                }
 
-                            override fun closeConnection() {
-                                expect(4)
+                                override fun closeConnection() {
+                                    expect(4)
+                                }
                             }
-                        })
+                        )
                     } catch (e: CancellationException) {
                         expect(5)
                         throw e
@@ -331,9 +315,7 @@
             }
         }
 
-        rule.runOnIdle {
-            assertThat(hostView.onCreateInputConnection(EditorInfo())).isNotNull()
-        }
+        rule.runOnIdle { assertThat(hostView.onCreateInputConnection(EditorInfo())).isNotNull() }
 
         coroutineScope.launch {
             expect(3)
@@ -343,9 +325,7 @@
             }
         }
 
-        rule.runOnIdle {
-            expect(8)
-        }
+        rule.runOnIdle { expect(8) }
     }
 
     @Test
@@ -358,14 +338,16 @@
                 launch(start = CoroutineStart.UNDISPATCHED) {
                     expect(2)
                     try {
-                        startInputMethod(object : TestInputMethodRequest(view) {
-                            override fun createInputConnection(
-                                outAttributes: EditorInfo
-                            ): InputConnection {
-                                expect(3)
-                                return super.createInputConnection(outAttributes)
+                        startInputMethod(
+                            object : TestInputMethodRequest(view) {
+                                override fun createInputConnection(
+                                    outAttributes: EditorInfo
+                                ): InputConnection {
+                                    expect(3)
+                                    return super.createInputConnection(outAttributes)
+                                }
                             }
-                        })
+                        )
                     } catch (e: CancellationException) {
                         expect(5)
                         throw e
@@ -383,9 +365,7 @@
             }
         }
 
-        rule.runOnIdle {
-            expect(6)
-        }
+        rule.runOnIdle { expect(6) }
     }
 
     // closeConnection is only supported on API 24+
@@ -398,11 +378,13 @@
             node1.establishTextInputSession {
                 sessionJob = launch {
                     try {
-                        startInputMethod(object : TestInputMethodRequest(view) {
-                            override fun closeConnection() {
-                                expect(1)
+                        startInputMethod(
+                            object : TestInputMethodRequest(view) {
+                                override fun closeConnection() {
+                                    expect(1)
+                                }
                             }
-                        })
+                        )
                     } catch (e: CancellationException) {
                         expect(2)
                         throw e
@@ -413,9 +395,7 @@
         }
         expect(0)
 
-        rule.runOnIdle {
-            assertThat(hostView.onCreateInputConnection(EditorInfo())).isNotNull()
-        }
+        rule.runOnIdle { assertThat(hostView.onCreateInputConnection(EditorInfo())).isNotNull() }
 
         rule.runOnIdle {
             sessionJob.cancel()
@@ -435,18 +415,20 @@
                 launch(start = CoroutineStart.UNDISPATCHED) {
                     expect(2)
                     try {
-                        startInputMethod(object : TestInputMethodRequest(view) {
-                            override fun createInputConnection(
-                                outAttributes: EditorInfo
-                            ): InputConnection {
-                                expect(3)
-                                return super.createInputConnection(outAttributes)
-                            }
+                        startInputMethod(
+                            object : TestInputMethodRequest(view) {
+                                override fun createInputConnection(
+                                    outAttributes: EditorInfo
+                                ): InputConnection {
+                                    expect(3)
+                                    return super.createInputConnection(outAttributes)
+                                }
 
-                            override fun closeConnection() {
-                                expect(5)
+                                override fun closeConnection() {
+                                    expect(5)
+                                }
                             }
-                        })
+                        )
                     } catch (e: CancellationException) {
                         expect(6)
                         throw e
@@ -464,9 +446,7 @@
             }
         }
 
-        rule.runOnIdle {
-            expect(7)
-        }
+        rule.runOnIdle { expect(7) }
     }
 
     // closeConnection is only supported on API 24+
@@ -475,6 +455,7 @@
     fun connectionClosed_whenCreateConnectionCalledAgain() {
         class TestConnection(view: View) : BaseInputConnection(view, true) {
             var closeCalls = 0
+
             override fun closeConnection() {
                 closeCalls++
                 super.closeConnection()
@@ -483,13 +464,12 @@
 
         setupContent()
         val connections = mutableListOf<TestConnection>()
-        val sessionJob = coroutineScope.launch {
-            node1.establishTextInputSession {
-                startInputMethod {
-                    TestConnection(view).also { connections += it }
+        val sessionJob =
+            coroutineScope.launch {
+                node1.establishTextInputSession {
+                    startInputMethod { TestConnection(view).also { connections += it } }
                 }
             }
-        }
 
         rule.runOnIdle {
             assertThat(connections).isEmpty()
@@ -516,9 +496,7 @@
             assertThat(connection3.closeCalls).isEqualTo(0)
         }
 
-        rule.runOnIdle {
-            assertThat(sessionJob.isActive).isTrue()
-        }
+        rule.runOnIdle { assertThat(sessionJob.isActive).isTrue() }
     }
 
     @SdkSuppress(minSdkVersion = 24)
@@ -526,14 +504,13 @@
     fun innerSessionCanceled_whenIsolatedFromOuterSession_whenConnectionClosed() {
         setupContent()
         lateinit var innerJob: Job
-        val outerJob = coroutineScope.launch {
-            node1.establishTextInputSession {
-                innerJob = launch {
-                    startInputMethod(TestInputMethodRequest(view))
+        val outerJob =
+            coroutineScope.launch {
+                node1.establishTextInputSession {
+                    innerJob = launch { startInputMethod(TestInputMethodRequest(view)) }
+                    awaitCancellation()
                 }
-                awaitCancellation()
             }
-        }
 
         rule.runOnIdle {
             val connection = checkNotNull(hostView.onCreateInputConnection(EditorInfo()))
@@ -553,11 +530,10 @@
     @Test
     fun cancellationPropagates_whenConnectionClosed() {
         setupContent()
-        val sessionJob = coroutineScope.launch {
-            node1.establishTextInputSession {
-                startInputMethod(TestInputMethodRequest(view))
+        val sessionJob =
+            coroutineScope.launch {
+                node1.establishTextInputSession { startInputMethod(TestInputMethodRequest(view)) }
             }
-        }
 
         rule.runOnIdle {
             val connection = checkNotNull(hostView.onCreateInputConnection(EditorInfo()))
@@ -565,9 +541,7 @@
             connection.closeConnection()
         }
 
-        rule.runOnIdle {
-            assertThat(sessionJob.isActive).isFalse()
-        }
+        rule.runOnIdle { assertThat(sessionJob.isActive).isFalse() }
     }
 
     @Test
@@ -576,28 +550,32 @@
         coroutineScope.launch {
             node1.establishTextInputSession {
                 launch(start = CoroutineStart.UNDISPATCHED) {
-                    startInputMethod(object : TestInputMethodRequest(view) {
-                        override fun createInputConnection(
-                            outAttributes: EditorInfo
-                        ): InputConnection {
-                            expect(1)
-                            return super.createInputConnection(outAttributes)
+                    startInputMethod(
+                        object : TestInputMethodRequest(view) {
+                            override fun createInputConnection(
+                                outAttributes: EditorInfo
+                            ): InputConnection {
+                                expect(1)
+                                return super.createInputConnection(outAttributes)
+                            }
                         }
-                    })
+                    )
                 }
 
                 expect(0)
                 val connection1 = hostView.onCreateInputConnection(EditorInfo())
 
                 launch(start = CoroutineStart.UNDISPATCHED) {
-                    startInputMethod(object : TestInputMethodRequest(view) {
-                        override fun createInputConnection(
-                            outAttributes: EditorInfo
-                        ): InputConnection {
-                            expect(3)
-                            return super.createInputConnection(outAttributes)
+                    startInputMethod(
+                        object : TestInputMethodRequest(view) {
+                            override fun createInputConnection(
+                                outAttributes: EditorInfo
+                            ): InputConnection {
+                                expect(3)
+                                return super.createInputConnection(outAttributes)
+                            }
                         }
-                    })
+                    )
                 }
 
                 expect(2)
@@ -608,9 +586,7 @@
             }
         }
 
-        rule.runOnIdle {
-            expect(4)
-        }
+        rule.runOnIdle { expect(4) }
     }
 
     @Test
@@ -619,11 +595,13 @@
         coroutineScope.launch {
             node1.establishTextInputSession {
                 launch {
-                    startInputMethod(object : TestInputMethodRequest(view) {
-                        override fun createInputConnection(
-                            outAttributes: EditorInfo
-                        ): InputConnection = BaseInputConnection(view, true)
-                    })
+                    startInputMethod(
+                        object : TestInputMethodRequest(view) {
+                            override fun createInputConnection(
+                                outAttributes: EditorInfo
+                            ): InputConnection = BaseInputConnection(view, true)
+                        }
+                    )
                 }
                 awaitCancellation()
             }
@@ -646,18 +624,17 @@
         }
     }
 
-    private data class TestElement(
-        val onNode: (PlatformTextInputModifierNode) -> Unit
-    ) : ModifierNodeElement<TestNode>() {
+    private data class TestElement(val onNode: (PlatformTextInputModifierNode) -> Unit) :
+        ModifierNodeElement<TestNode>() {
         override fun create(): TestNode = TestNode(onNode)
+
         override fun update(node: TestNode) {
             node.onNode = onNode
         }
     }
 
-    private class TestNode(
-        var onNode: (PlatformTextInputModifierNode) -> Unit
-    ) : Modifier.Node(), PlatformTextInputModifierNode {
+    private class TestNode(var onNode: (PlatformTextInputModifierNode) -> Unit) :
+        Modifier.Node(), PlatformTextInputModifierNode {
 
         override fun onAttach() {
             onNode(this)
diff --git a/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/text/input/TestInputMethodRequest.kt b/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/text/input/TestInputMethodRequest.kt
index 4a0a8d1..604855c 100644
--- a/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/text/input/TestInputMethodRequest.kt
+++ b/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/text/input/TestInputMethodRequest.kt
@@ -22,8 +22,8 @@
 import android.view.inputmethod.InputConnection
 import androidx.compose.ui.platform.PlatformTextInputMethodRequest
 
-internal open class TestInputMethodRequest(view: View) : BaseInputConnection(view, false),
-    PlatformTextInputMethodRequest {
+internal open class TestInputMethodRequest(view: View) :
+    BaseInputConnection(view, false), PlatformTextInputMethodRequest {
 
     override fun createInputConnection(outAttributes: EditorInfo): InputConnection {
         return this
diff --git a/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/viewinterop/AndroidViewTest.kt b/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/viewinterop/AndroidViewTest.kt
index eb67b4f..08ff5f4 100644
--- a/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/viewinterop/AndroidViewTest.kt
+++ b/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/viewinterop/AndroidViewTest.kt
@@ -144,17 +144,12 @@
 @RunWith(AndroidJUnit4::class)
 @OptIn(ExperimentalComposeUiApi::class)
 class AndroidViewTest {
-    @get:Rule
-    val rule = createAndroidComposeRule<TestActivity>()
+    @get:Rule val rule = createAndroidComposeRule<TestActivity>()
 
     @Test
     fun androidViewWithConstructor() {
-        rule.setContent {
-            AndroidView({ TextView(it).apply { text = "Test" } })
-        }
-        Espresso
-            .onView(instanceOf(TextView::class.java))
-            .check(matches(isDisplayed()))
+        rule.setContent { AndroidView({ TextView(it).apply { text = "Test" } }) }
+        Espresso.onView(instanceOf(TextView::class.java)).check(matches(isDisplayed()))
     }
 
     @Test
@@ -162,9 +157,7 @@
         rule.setContent {
             AndroidView({ LayoutInflater.from(it).inflate(R.layout.test_layout, null) })
         }
-        Espresso
-            .onView(instanceOf(RelativeLayout::class.java))
-            .check(matches(isDisplayed()))
+        Espresso.onView(instanceOf(RelativeLayout::class.java)).check(matches(isDisplayed()))
     }
 
     @Test
@@ -175,28 +168,24 @@
         rule.setContent {
             AndroidView(
                 factory = {
-                    val view: View = LayoutInflater.from(it)
-                        .inflate(R.layout.test_multiple_invalidation_layout, null)
+                    val view: View =
+                        LayoutInflater.from(it)
+                            .inflate(R.layout.test_multiple_invalidation_layout, null)
                     customView = view.findViewById<InvalidatedTextView>(R.id.custom_draw_view)
                     customView!!.timesToInvalidate = timesToInvalidate
-                    customView!!.onDraw = {
-                        ++drawCount
-                    }
+                    customView!!.onDraw = { ++drawCount }
                     view
-                })
+                }
+            )
         }
         // the first drawn was not caused by invalidation, thus add it to expected draw count.
         var expectedDraws = timesToInvalidate + 1
-        repeat(expectedDraws) {
-            rule.mainClock.advanceTimeByFrame()
-        }
+        repeat(expectedDraws) { rule.mainClock.advanceTimeByFrame() }
 
         // Ensure we wait until the time advancement actually happened as sometimes we can race if
         // we use runOnIdle directly making the test fail, so providing a big enough timeout to
         // give plenty of time for the frame advancement to happen.
-        rule.waitUntil(3000) {
-            drawCount == expectedDraws
-        }
+        rule.waitUntil(3000) { drawCount == expectedDraws }
 
         rule.runOnIdle {
             // Verify that we only drew once per invalidation
@@ -209,45 +198,44 @@
     fun androidViewWithViewTest() {
         lateinit var frameLayout: FrameLayout
         rule.activityRule.scenario.onActivity { activity ->
-            frameLayout = FrameLayout(activity).apply {
-                layoutParams = ViewGroup.LayoutParams(300, 300)
-            }
+            frameLayout =
+                FrameLayout(activity).apply { layoutParams = ViewGroup.LayoutParams(300, 300) }
         }
-        rule.setContent {
-            AndroidView({ frameLayout })
-        }
-        Espresso
-            .onView(equalTo(frameLayout))
-            .check(matches(isDisplayed()))
+        rule.setContent { AndroidView({ frameLayout }) }
+        Espresso.onView(equalTo(frameLayout)).check(matches(isDisplayed()))
     }
 
     @Test
     @SdkSuppress(minSdkVersion = Build.VERSION_CODES.R)
     fun androidViewAccessibilityDelegate() {
         rule.setContent {
-             AndroidView({ TextView(it).apply { text = "Test"; setScreenReaderFocusable(true) } })
+            AndroidView({
+                TextView(it).apply {
+                    text = "Test"
+                    setScreenReaderFocusable(true)
+                }
+            })
         }
-        Espresso
-            .onView(instanceOf(TextView::class.java))
-            .check(matches(isDisplayed()))
-            .check { view, exception ->
-                val viewParent = view.getParent()
-                if (viewParent !is View) {
-                    throw exception
-                }
-                val delegate = viewParent.getAccessibilityDelegate()
-                if (viewParent.getAccessibilityDelegate() == null) {
-                    throw exception
-                }
-                val info: AccessibilityNodeInfo = AccessibilityNodeInfo()
-                delegate.onInitializeAccessibilityNodeInfo(view, info)
-                if (!info.isVisibleToUser()) {
-                    throw exception
-                }
-                if (!info.isScreenReaderFocusable()) {
-                    throw exception
-                }
+        Espresso.onView(instanceOf(TextView::class.java)).check(matches(isDisplayed())).check {
+            view,
+            exception ->
+            val viewParent = view.getParent()
+            if (viewParent !is View) {
+                throw exception
             }
+            val delegate = viewParent.getAccessibilityDelegate()
+            if (viewParent.getAccessibilityDelegate() == null) {
+                throw exception
+            }
+            val info: AccessibilityNodeInfo = AccessibilityNodeInfo()
+            delegate.onInitializeAccessibilityNodeInfo(view, info)
+            if (!info.isVisibleToUser()) {
+                throw exception
+            }
+            if (!info.isScreenReaderFocusable()) {
+                throw exception
+            }
+        }
     }
 
     @Test
@@ -257,8 +245,7 @@
                 LayoutInflater.from(it).inflate(R.layout.test_layout, FrameLayout(it), false)
             })
         }
-        Espresso
-            .onView(withClassName(endsWith("RelativeLayout")))
+        Espresso.onView(withClassName(endsWith("RelativeLayout")))
             .check(matches(isDisplayed()))
             .check { view, exception ->
                 if (view.layoutParams.width != 300.dp.toPx(view.context.resources.displayMetrics)) {
@@ -274,9 +261,8 @@
     fun androidViewProperlyDetached() {
         lateinit var frameLayout: FrameLayout
         rule.activityRule.scenario.onActivity { activity ->
-            frameLayout = FrameLayout(activity).apply {
-                layoutParams = ViewGroup.LayoutParams(300, 300)
-            }
+            frameLayout =
+                FrameLayout(activity).apply { layoutParams = ViewGroup.LayoutParams(300, 300) }
         }
         var emit by mutableStateOf(true)
         rule.setContent {
@@ -298,9 +284,7 @@
         }
 
         // Assert view reattached when added back to the composition hierarchy
-        rule.runOnIdle {
-            assertThat(frameLayout.parent).isNotNull()
-        }
+        rule.runOnIdle { assertThat(frameLayout.parent).isNotNull() }
     }
 
     @Test
@@ -319,9 +303,7 @@
 
             activity.setContentView(root)
             root.addView(composeView)
-            composeView.setContent {
-                AndroidView({ viewInsideCompose })
-            }
+            composeView.setContent { AndroidView({ viewInsideCompose }) }
         }
 
         var viewInsideComposeHolder: ViewGroup? = null
@@ -353,8 +335,7 @@
                 Modifier.requiredSize(size)
             )
         }
-        Espresso
-            .onView(instanceOf(RelativeLayout::class.java))
+        Espresso.onView(instanceOf(RelativeLayout::class.java))
             .check(matches(isDisplayed()))
             .check { view, exception ->
                 val expectedSize = size.toPx(view.context.resources.displayMetrics)
@@ -368,22 +349,16 @@
     fun androidViewWithView_modifierIsApplied() {
         val size = 20.dp
         lateinit var frameLayout: FrameLayout
-        rule.activityRule.scenario.onActivity { activity ->
-            frameLayout = FrameLayout(activity)
-        }
-        rule.setContent {
-            AndroidView({ frameLayout }, Modifier.requiredSize(size))
-        }
+        rule.activityRule.scenario.onActivity { activity -> frameLayout = FrameLayout(activity) }
+        rule.setContent { AndroidView({ frameLayout }, Modifier.requiredSize(size)) }
 
-        Espresso
-            .onView(equalTo(frameLayout))
-            .check(matches(isDisplayed()))
-            .check { view, exception ->
-                val expectedSize = size.toPx(view.context.resources.displayMetrics)
-                if (view.width != expectedSize || view.height != expectedSize) {
-                    throw exception
-                }
+        Espresso.onView(equalTo(frameLayout)).check(matches(isDisplayed())).check { view, exception
+            ->
+            val expectedSize = size.toPx(view.context.resources.displayMetrics)
+            if (view.width != expectedSize || view.height != expectedSize) {
+                throw exception
             }
+        }
     }
 
     @Test
@@ -393,20 +368,14 @@
         val size = 300
         lateinit var frameLayout: FrameLayout
         rule.activityRule.scenario.onActivity { activity ->
-            frameLayout = FrameLayout(activity).apply {
-                layoutParams = ViewGroup.LayoutParams(size, size)
-            }
+            frameLayout =
+                FrameLayout(activity).apply { layoutParams = ViewGroup.LayoutParams(size, size) }
         }
         rule.setContent {
-            AndroidView({ frameLayout },
-                Modifier
-                    .testTag("view")
-                    .background(color = Color.Blue))
+            AndroidView({ frameLayout }, Modifier.testTag("view").background(color = Color.Blue))
         }
 
-        rule.onNodeWithTag("view").captureToImage().assertPixels(IntSize(size, size)) {
-            Color.Blue
-        }
+        rule.onNodeWithTag("view").captureToImage().assertPixels(IntSize(size, size)) { Color.Blue }
     }
 
     @Test
@@ -418,8 +387,7 @@
                 Modifier.requiredSize(size.value)
             )
         }
-        Espresso
-            .onView(instanceOf(RelativeLayout::class.java))
+        Espresso.onView(instanceOf(RelativeLayout::class.java))
             .check(matches(isDisplayed()))
             .check { view, exception ->
                 val expectedSize = size.value.toPx(view.context.resources.displayMetrics)
@@ -428,8 +396,7 @@
                 }
             }
         rule.runOnIdle { size.value = 30.dp }
-        Espresso
-            .onView(instanceOf(RelativeLayout::class.java))
+        Espresso.onView(instanceOf(RelativeLayout::class.java))
             .check(matches(isDisplayed()))
             .check { view, exception ->
                 val expectedSize = size.value.toPx(view.context.resources.displayMetrics)
@@ -442,26 +409,12 @@
     @Test
     fun androidView_notDetachedFromWindowTwice() {
         // Should not crash.
-        rule.setContent {
-            Box {
-                AndroidView(::ComposeView) {
-                    it.setContent {
-                        Box(Modifier)
-                    }
-                }
-            }
-        }
+        rule.setContent { Box { AndroidView(::ComposeView) { it.setContent { Box(Modifier) } } } }
     }
 
     @Test
     fun androidView_updateIsRanInitially() {
-        rule.setContent {
-            Box {
-                AndroidView(::UpdateTestView) { view ->
-                    view.counter = 1
-                }
-            }
-        }
+        rule.setContent { Box { AndroidView(::UpdateTestView) { view -> view.counter = 1 } } }
 
         onView(instanceOf(UpdateTestView::class.java)).check { view, _ ->
             assertIs<UpdateTestView>(view)
@@ -473,13 +426,7 @@
     fun androidView_updateObservesMultipleStateChanges() {
         var counter by mutableStateOf(1)
 
-        rule.setContent {
-            Box {
-                AndroidView(::UpdateTestView) { view ->
-                    view.counter = counter
-                }
-            }
-        }
+        rule.setContent { Box { AndroidView(::UpdateTestView) { view -> view.counter = counter } } }
 
         counter = 2
         onView(instanceOf(UpdateTestView::class.java)).check { view, _ ->
@@ -510,11 +457,7 @@
                 onDispose {}
             }
 
-            Box {
-                AndroidView(::UpdateTestView) { view ->
-                    view.counter = counter
-                }
-            }
+            Box { AndroidView(::UpdateTestView) { view -> view.counter = counter } }
         }
 
         onView(instanceOf(UpdateTestView::class.java)).check { view, _ ->
@@ -528,15 +471,9 @@
         var counter by mutableStateOf(1)
 
         rule.setContent {
-            LaunchedEffect(Unit) {
-                counter = 2
-            }
+            LaunchedEffect(Unit) { counter = 2 }
 
-            Box {
-                AndroidView(::UpdateTestView) { view ->
-                    view.counter = counter
-                }
-            }
+            Box { AndroidView(::UpdateTestView) { view -> view.counter = counter } }
         }
 
         onView(instanceOf(UpdateTestView::class.java)).check { view, _ ->
@@ -552,16 +489,10 @@
         rule.setContent {
             LaunchedEffect(Unit) {
                 counter = 2
-                withFrameNanos {
-                    counter = 3
-                }
+                withFrameNanos { counter = 3 }
             }
 
-            Box {
-                AndroidView(::UpdateTestView) { view ->
-                    view.counter = counter
-                }
-            }
+            Box { AndroidView(::UpdateTestView) { view -> view.counter = counter } }
         }
 
         onView(instanceOf(UpdateTestView::class.java)).check { view, _ ->
@@ -576,10 +507,8 @@
         var obtainedSize: IntSize = IntSize.Zero
         rule.setContent {
             Box {
-                AndroidView(
-                    ::View,
-                    Modifier.onGloballyPositioned { obtainedSize = it.size }
-                ) { view ->
+                AndroidView(::View, Modifier.onGloballyPositioned { obtainedSize = it.size }) { view
+                    ->
                     view.layoutParams = ViewGroup.LayoutParams(size, size)
                 }
             }
@@ -588,9 +517,7 @@
             assertThat(obtainedSize).isEqualTo(IntSize(size, size))
             size = 40
         }
-        rule.runOnIdle {
-            assertThat(obtainedSize).isEqualTo(IntSize(size, size))
-        }
+        rule.runOnIdle { assertThat(obtainedSize).isEqualTo(IntSize(size, size)) }
     }
 
     @Test
@@ -602,11 +529,9 @@
             CompositionLocalProvider(LocalDensity provides density) {
                 AndroidView(
                     { FrameLayout(it) },
-                    Modifier
-                        .requiredSize(size)
-                        .onGloballyPositioned {
-                            assertThat(it.size).isEqualTo(IntSize(sizeIpx, sizeIpx))
-                        }
+                    Modifier.requiredSize(size).onGloballyPositioned {
+                        assertThat(it.size).isEqualTo(IntSize(sizeIpx, sizeIpx))
+                    }
                 )
             }
         }
@@ -618,14 +543,11 @@
         lateinit var parentComposeView: ComposeView
         lateinit var compositionChildView: View
         rule.activityRule.scenario.onActivity { activity ->
-            parentComposeView = ComposeView(activity).apply {
-                setContent {
-                    AndroidView(::View) {
-                        compositionChildView = it
-                    }
+            parentComposeView =
+                ComposeView(activity).apply {
+                    setContent { AndroidView(::View) { compositionChildView = it } }
+                    activity.setContentView(this)
                 }
-                activity.setContentView(this)
-            }
         }
         rule.runOnIdle {
             assertThat(compositionChildView.findViewTreeCompositionContext())
@@ -642,17 +564,13 @@
                 AndroidView(
                     factory = {
                         ComposeView(it).apply {
-                            setContent {
-                                childComposedAmbientValue = ambient.current
-                            }
+                            setContent { childComposedAmbientValue = ambient.current }
                         }
                     }
                 )
             }
         }
-        rule.runOnIdle {
-            assertThat(childComposedAmbientValue).isEqualTo("setByParent")
-        }
+        rule.runOnIdle { assertThat(childComposedAmbientValue).isEqualTo("setByParent") }
     }
 
     @Test
@@ -700,11 +618,7 @@
         var childViewTreeLifecycleOwner: LifecycleOwner? = null
 
         rule.setContent {
-            LocalLifecycleOwner.current.also {
-                SideEffect {
-                    parentLifecycleOwner = it
-                }
-            }
+            LocalLifecycleOwner.current.also { SideEffect { parentLifecycleOwner = it } }
 
             CompositionLocalProvider(LocalLifecycleOwner provides compositionLifecycleOwner) {
                 AndroidView(
@@ -739,9 +653,7 @@
 
         rule.setContent {
             LocalSavedStateRegistryOwner.current.also {
-                SideEffect {
-                    parentSavedStateRegistryOwner = it
-                }
+                SideEffect { parentSavedStateRegistryOwner = it }
             }
 
             CompositionLocalProvider(
@@ -774,11 +686,12 @@
         var factoryRunCount = 0
         rule.setContent {
             val view = remember { View(rule.activity) }
-            AndroidView({ ++factoryRunCount; view })
+            AndroidView({
+                ++factoryRunCount
+                view
+            })
         }
-        rule.runOnIdle {
-            assertThat(factoryRunCount).isEqualTo(1)
-        }
+        rule.runOnIdle { assertThat(factoryRunCount).isEqualTo(1) }
     }
 
     @Test
@@ -789,9 +702,15 @@
             val view = remember { View(rule.activity) }
             AndroidView(
                 if (first) {
-                    { ++factoryRunCount; view }
+                    {
+                        ++factoryRunCount
+                        view
+                    }
                 } else {
-                    { ++factoryRunCount; view }
+                    {
+                        ++factoryRunCount
+                        view
+                    }
                 }
             )
         }
@@ -799,9 +718,7 @@
             assertThat(factoryRunCount).isEqualTo(1)
             first = false
         }
-        rule.runOnIdle {
-            assertThat(factoryRunCount).isEqualTo(1)
-        }
+        rule.runOnIdle { assertThat(factoryRunCount).isEqualTo(1) }
     }
 
     @Ignore
@@ -812,18 +729,12 @@
         val sizeDp = with(rule.density) { size.toDp() }
         rule.setContent {
             Column {
-                Box(
-                    Modifier
-                        .size(sizeDp)
-                        .background(Color.Blue)
-                        .testTag("box"))
+                Box(Modifier.size(sizeDp).background(Color.Blue).testTag("box"))
                 AndroidView(factory = { SurfaceView(it) })
             }
         }
 
-        rule.onNodeWithTag("box").captureToImage().assertPixels(IntSize(size, size)) {
-            Color.Blue
-        }
+        rule.onNodeWithTag("box").captureToImage().assertPixels(IntSize(size, size)) { Color.Blue }
     }
 
     @Test
@@ -840,20 +751,19 @@
             }
         }
 
-        onView(instanceOf(TextView::class.java))
-            .check(matches(isDisplayed()))
+        onView(instanceOf(TextView::class.java)).check(matches(isDisplayed()))
 
         assertEquals("onRelease() was called unexpectedly", 0, releaseCount)
 
         showContent = false
 
-        onView(instanceOf(TextView::class.java))
-            .check(doesNotExist())
+        onView(instanceOf(TextView::class.java)).check(doesNotExist())
 
         assertEquals(
             "onRelease() should be called exactly once after " +
                 "removing the view from the composition hierarchy",
-            1, releaseCount
+            1,
+            releaseCount
         )
     }
 
@@ -869,9 +779,7 @@
         ) {
             val saveableStateHolder = rememberSaveableStateHolder()
             Box(modifier) {
-                saveableStateHolder.SaveableStateProvider(currentScreen) {
-                    content(currentScreen)
-                }
+                saveableStateHolder.SaveableStateProvider(currentScreen) { content(currentScreen) }
             }
         }
 
@@ -894,51 +802,41 @@
 
         rule.runOnIdle { screen = "screen2" }
         rule.runOnIdle { screen = "screen1" }
-        rule.runOnIdle {
-            assertThat(result).isEqualTo("testValue")
-        }
+        rule.runOnIdle { assertThat(result).isEqualTo("testValue") }
     }
 
     @Test
     @SdkSuppress(minSdkVersion = Build.VERSION_CODES.O)
     fun androidView_noClip() {
         rule.setContent {
-            Box(
-                Modifier
-                    .fillMaxSize()
-                    .background(Color.White)) {
+            Box(Modifier.fillMaxSize().background(Color.White)) {
                 with(LocalDensity.current) {
-                    Box(
-                        Modifier
-                            .requiredSize(150.toDp())
-                            .testTag("box")) {
+                    Box(Modifier.requiredSize(150.toDp()).testTag("box")) {
                         Box(
-                            Modifier
-                                .size(100.toDp(), 100.toDp())
-                                .align(AbsoluteAlignment.TopLeft)
+                            Modifier.size(100.toDp(), 100.toDp()).align(AbsoluteAlignment.TopLeft)
                         ) {
-                            AndroidView(factory = { context ->
-                                object : View(context) {
-                                    init {
-                                        clipToOutline = false
-                                    }
+                            AndroidView(
+                                factory = { context ->
+                                    object : View(context) {
+                                        init {
+                                            clipToOutline = false
+                                        }
 
-                                    override fun onDraw(canvas: Canvas) {
-                                        val paint = Paint()
-                                        paint.color = Color.Blue.toArgb()
-                                        paint.style = Paint.Style.FILL
-                                        canvas.drawRect(0f, 0f, 150f, 150f, paint)
+                                        override fun onDraw(canvas: Canvas) {
+                                            val paint = Paint()
+                                            paint.color = Color.Blue.toArgb()
+                                            paint.style = Paint.Style.FILL
+                                            canvas.drawRect(0f, 0f, 150f, 150f, paint)
+                                        }
                                     }
                                 }
-                            })
+                            )
                         }
                     }
                 }
             }
         }
-        rule.onNodeWithTag("box").captureToImage().assertPixels(IntSize(150, 150)) {
-            Color.Blue
-        }
+        rule.onNodeWithTag("box").captureToImage().assertPixels(IntSize(150, 150)) { Color.Blue }
     }
 
     @Test
@@ -953,8 +851,7 @@
             }
         }
 
-        onView(instanceOf(TextView::class.java))
-            .check(matches(isDisplayed()))
+        onView(instanceOf(TextView::class.java)).check(matches(isDisplayed()))
 
         assertEquals(
             "AndroidView did not experience the expected lifecycle when " +
@@ -1050,8 +947,7 @@
         lifecycleEvents.clear()
         attached = false
 
-        onView(instanceOf(TextView::class.java))
-            .check(doesNotExist())
+        onView(instanceOf(TextView::class.java)).check(doesNotExist())
 
         assertEquals(
             "AndroidView did not experience the expected lifecycle when " +
@@ -1074,8 +970,7 @@
             }
         }
 
-        onView(instanceOf(TextView::class.java))
-            .check(matches(isDisplayed()))
+        onView(instanceOf(TextView::class.java)).check(matches(isDisplayed()))
 
         assertEquals(
             "AndroidView did not experience the expected lifecycle when " +
@@ -1094,8 +989,7 @@
         lifecycleEvents.clear()
         attached = false
 
-        onView(instanceOf(TextView::class.java))
-            .check(doesNotExist())
+        onView(instanceOf(TextView::class.java)).check(doesNotExist())
 
         assertEquals(
             "AndroidView did not experience the expected lifecycle when " +
@@ -1107,8 +1001,7 @@
         lifecycleEvents.clear()
         attached = true
 
-        onView(instanceOf(TextView::class.java))
-            .check(matches(isDisplayed()))
+        onView(instanceOf(TextView::class.java)).check(matches(isDisplayed()))
 
         assertEquals(
             "AndroidView did not experience the expected lifecycle when " +
@@ -1154,8 +1047,7 @@
         lifecycleEvents.clear()
         active = false
 
-        onView(instanceOf(TextView::class.java))
-            .check(doesNotExist())
+        onView(instanceOf(TextView::class.java)).check(doesNotExist())
 
         assertEquals(
             "AndroidView did not experience the expected lifecycle when " +
@@ -1167,8 +1059,7 @@
         lifecycleEvents.clear()
         emit = false
 
-        onView(instanceOf(TextView::class.java))
-            .check(doesNotExist())
+        onView(instanceOf(TextView::class.java)).check(doesNotExist())
 
         assertEquals(
             "AndroidView did not experience the expected lifecycle when " +
@@ -1191,8 +1082,7 @@
             }
         }
 
-        onView(instanceOf(TextView::class.java))
-            .check(matches(isDisplayed()))
+        onView(instanceOf(TextView::class.java)).check(matches(isDisplayed()))
 
         assertEquals(
             "AndroidView did not experience the expected lifecycle when " +
@@ -1211,8 +1101,7 @@
         lifecycleEvents.clear()
         includeViewInComposition = false
 
-        onView(instanceOf(TextView::class.java))
-            .check(doesNotExist())
+        onView(instanceOf(TextView::class.java)).check(doesNotExist())
 
         assertEquals(
             "AndroidView did not experience the expected lifecycle when " +
@@ -1262,8 +1151,7 @@
             .check(matches(withText("Test")))
 
         assertEquals(
-            "AndroidView did not experience the expected lifecycle when " +
-                "reused in composition",
+            "AndroidView did not experience the expected lifecycle when " + "reused in composition",
             listOf(OnReset, OnUpdate),
             lifecycleEvents
         )
@@ -1306,10 +1194,7 @@
         assertEquals(
             "AndroidView did not experience the expected lifecycle when " +
                 "its host transitioned from RESUMED to CREATED while the view was attached",
-            listOf(
-                ViewLifecycleEvent(ON_PAUSE),
-                ViewLifecycleEvent(ON_STOP)
-            ),
+            listOf(ViewLifecycleEvent(ON_PAUSE), ViewLifecycleEvent(ON_STOP)),
             lifecycleEvents
         )
 
@@ -1320,10 +1205,7 @@
         assertEquals(
             "AndroidView did not experience the expected lifecycle when " +
                 "its host transitioned from CREATED to RESUMED while the view was attached",
-            listOf(
-                ViewLifecycleEvent(ON_START),
-                ViewLifecycleEvent(ON_RESUME)
-            ),
+            listOf(ViewLifecycleEvent(ON_START), ViewLifecycleEvent(ON_RESUME)),
             lifecycleEvents
         )
     }
@@ -1364,8 +1246,7 @@
         lifecycleEvents.clear()
         attach = false
 
-        onView(instanceOf(TextView::class.java))
-            .check(doesNotExist())
+        onView(instanceOf(TextView::class.java)).check(doesNotExist())
 
         assertEquals(
             "AndroidView did not experience the expected lifecycle when " +
@@ -1398,12 +1279,13 @@
         var attached by mutableStateOf(true)
         rule.setContent {
             ReusableContentHost(attached) {
-                val content = @Composable {
-                    ReusableAndroidViewWithLifecycleTracking(
-                        factory = { TextView(it).apply { text = "Test" } },
-                        onLifecycleEvent = lifecycleEvents::add
-                    )
-                }
+                val content =
+                    @Composable {
+                        ReusableAndroidViewWithLifecycleTracking(
+                            factory = { TextView(it).apply { text = "Test" } },
+                            onLifecycleEvent = lifecycleEvents::add
+                        )
+                    }
 
                 // Placing items when they are in reused state is not supported for now.
                 // Reusing only happens in SubcomposeLayout atm which never places reused nodes
@@ -1439,8 +1321,7 @@
         lifecycleEvents.clear()
         attached = false
 
-        onView(instanceOf(TextView::class.java))
-            .check(doesNotExist())
+        onView(instanceOf(TextView::class.java)).check(doesNotExist())
 
         assertEquals(
             "AndroidView did not experience the expected lifecycle when " +
@@ -1456,10 +1337,7 @@
         assertEquals(
             "AndroidView did not receive callbacks when its host transitioned from " +
                 "RESUMED to CREATED while the view was detached",
-            listOf(
-                ViewLifecycleEvent(ON_PAUSE),
-                ViewLifecycleEvent(ON_STOP)
-            ),
+            listOf(ViewLifecycleEvent(ON_PAUSE), ViewLifecycleEvent(ON_STOP)),
             lifecycleEvents
         )
 
@@ -1470,10 +1348,7 @@
         assertEquals(
             "AndroidView did not receive callbacks when its host transitioned from " +
                 "CREATED to RESUMED while the view was detached",
-            listOf(
-                ViewLifecycleEvent(ON_START),
-                ViewLifecycleEvent(ON_RESUME)
-            ),
+            listOf(ViewLifecycleEvent(ON_START), ViewLifecycleEvent(ON_RESUME)),
             lifecycleEvents
         )
     }
@@ -1487,9 +1362,7 @@
             val movableContext = remember {
                 movableContentOf {
                     ReusableAndroidViewWithLifecycleTracking(
-                        factory = { context ->
-                            StateSavingView(context, "")
-                        },
+                        factory = { context -> StateSavingView(context, "") },
                         onLifecycleEvent = lifecycleEvents::add
                     )
                 }
@@ -1499,9 +1372,7 @@
                 repeat(10) { slot ->
                     key(slot) {
                         if (slot == slotWithContent) {
-                            ReusableContent(Unit) {
-                                movableContext()
-                            }
+                            ReusableContent(Unit) { movableContext() }
                         } else {
                             Text("Slot $slot")
                         }
@@ -1512,11 +1383,7 @@
 
         rule.activityRule.withActivity {
             val view = findViewById<StateSavingView>(StateSavingView.ID)
-            assertEquals(
-                "View didn't have the expected initial value",
-                "",
-                view.value
-            )
+            assertEquals("View didn't have the expected initial value", "", view.value)
             view.value = "Value 1"
         }
 
@@ -1541,21 +1408,14 @@
         assertEquals(
             "AndroidView experienced unexpected lifecycle events when " +
                 "moved in the composition",
-            listOf(
-                OnViewDetach,
-                OnViewAttach
-            ),
+            listOf(OnViewDetach, OnViewAttach),
             lifecycleEvents
         )
 
         // Check that the state of the view is retained
         rule.activityRule.withActivity {
             val view = findViewById<StateSavingView>(StateSavingView.ID)
-            assertEquals(
-                "View didn't retain its state across reuse",
-                "Value 1",
-                view.value
-            )
+            assertEquals("View didn't retain its state across reuse", "Value 1", view.value)
         }
     }
 
@@ -1570,9 +1430,9 @@
                             factory = { context ->
                                 StateSavingView(context, "screen1 first value")
                             },
-                            update = { },
-                            onReset = { },
-                            onRelease = { }
+                            update = {},
+                            onReset = {},
+                            onRelease = {}
                         )
                     }
                 }
@@ -1618,24 +1478,17 @@
         val columnHeightDp = with(rule.density) { columnHeight.toDp() }
         var viewSize = IntSize.Zero
         rule.setContent {
-            Column(
-                Modifier
-                    .height(columnHeightDp)
-                    .fillMaxWidth()) {
+            Column(Modifier.height(columnHeightDp).fillMaxWidth()) {
                 AndroidView(
                     factory = { View(it) },
-                    modifier = Modifier
-                        .weight(1f)
-                        .onGloballyPositioned { viewSize = it.size }
+                    modifier = Modifier.weight(1f).onGloballyPositioned { viewSize = it.size }
                 )
 
                 Box(Modifier.height(columnHeightDp / 4))
             }
         }
 
-        rule.runOnIdle {
-            assertEquals(columnHeight * 3 / 4, viewSize.height)
-        }
+        rule.runOnIdle { assertEquals(columnHeight * 3 / 4, viewSize.height) }
     }
 
     @Test
@@ -1646,9 +1499,7 @@
         val viewSize = with(rule.density) { viewSizeDp.roundToPx() }
         rule.setContent {
             AndroidView(
-                modifier = Modifier
-                    .testTag("wrapper")
-                    .heightIn(max = viewSizeDp),
+                modifier = Modifier.testTag("wrapper").heightIn(max = viewSizeDp),
                 factory = {
                     object : View(it) {
                         override fun dispatchDraw(canvas: Canvas) {
@@ -1664,16 +1515,14 @@
             )
         }
 
-        rule.onNodeWithTag("wrapper")
-            .assertHeightIsEqualTo(viewSizeDp)
+        rule.onNodeWithTag("wrapper").assertHeightIsEqualTo(viewSizeDp)
 
         rule.runOnUiThread {
             drawCount = 0
             view?.visibility = View.GONE
         }
 
-        rule.onNodeWithTag("wrapper")
-            .assertHeightIsEqualTo(0.dp)
+        rule.onNodeWithTag("wrapper").assertHeightIsEqualTo(0.dp)
         assertEquals(0, drawCount)
     }
 
@@ -1685,35 +1534,27 @@
         rule.setContent {
             Column {
                 AndroidView(
-                    modifier = Modifier
-                        .testTag("wrapper")
-                        .heightIn(max = viewSizeDp),
-                    factory = {
-                        View(it)
-                    },
+                    modifier = Modifier.testTag("wrapper").heightIn(max = viewSizeDp),
+                    factory = { View(it) },
                     update = {
                         view = it
                         it.layoutParams = ViewGroup.LayoutParams(viewSize, WRAP_CONTENT)
                     },
                 )
 
-                Box(
-                    Modifier
-                        .size(viewSizeDp)
-                        .testTag("box")
-                )
+                Box(Modifier.size(viewSizeDp).testTag("box"))
             }
         }
 
-        rule.onNodeWithTag("box")
+        rule
+            .onNodeWithTag("box")
             .assertTopPositionInRootIsEqualTo(viewSizeDp)
             .assertLeftPositionInRootIsEqualTo(0.dp)
 
-        rule.runOnUiThread {
-            view?.visibility = View.GONE
-        }
+        rule.runOnUiThread { view?.visibility = View.GONE }
 
-        rule.onNodeWithTag("box")
+        rule
+            .onNodeWithTag("box")
             .assertTopPositionInRootIsEqualTo(0.dp)
             .assertLeftPositionInRootIsEqualTo(0.dp)
     }
@@ -1810,9 +1651,9 @@
         crossinline factory: (Context) -> T,
         noinline onLifecycleEvent: @DisallowComposableCalls (AndroidViewLifecycleEvent) -> Unit,
         modifier: Modifier = Modifier,
-        crossinline update: (T) -> Unit = { },
-        crossinline reuse: (T) -> Unit = { },
-        crossinline release: (T) -> Unit = { }
+        crossinline update: (T) -> Unit = {},
+        crossinline reuse: (T) -> Unit = {},
+        crossinline release: (T) -> Unit = {}
     ) {
         AndroidView(
             factory = {
@@ -1864,15 +1705,16 @@
         object OnCreate : AndroidViewLifecycleEvent()
 
         object OnUpdate : AndroidViewLifecycleEvent()
+
         object OnReset : AndroidViewLifecycleEvent()
+
         object OnRelease : AndroidViewLifecycleEvent()
 
         object OnViewAttach : AndroidViewLifecycleEvent()
+
         object OnViewDetach : AndroidViewLifecycleEvent()
 
-        data class ViewLifecycleEvent(
-            val event: Lifecycle.Event
-        ) : AndroidViewLifecycleEvent() {
+        data class ViewLifecycleEvent(val event: Lifecycle.Event) : AndroidViewLifecycleEvent() {
             override fun toString() = "ViewLifecycleEvent($event)"
         }
     }
@@ -1913,11 +1755,7 @@
     }
 
     private fun Dp.toPx(displayMetrics: DisplayMetrics) =
-        TypedValue.applyDimension(
-            TypedValue.COMPLEX_UNIT_DIP,
-            value,
-            displayMetrics
-        ).roundToInt()
+        TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, value, displayMetrics).roundToInt()
 
     private class RequestLayoutTrackingFrameLayout(context: Context) : FrameLayout(context) {
         var requestLayoutCalled = false
diff --git a/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/viewinterop/ComposeViewTest.kt b/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/viewinterop/ComposeViewTest.kt
index 2abf888..6b157ea 100644
--- a/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/viewinterop/ComposeViewTest.kt
+++ b/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/viewinterop/ComposeViewTest.kt
@@ -93,8 +93,7 @@
 @MediumTest
 @RunWith(AndroidJUnit4::class)
 class ComposeViewTest {
-    @get:Rule
-    val rule = createAndroidComposeRule<ComponentActivity>()
+    @get:Rule val rule = createAndroidComposeRule<ComponentActivity>()
 
     @FlakyTest(bugId = 256017578)
     @Test
@@ -102,22 +101,20 @@
         rule.activityRule.scenario.onActivity { activity ->
             val composeView = ComposeView(activity)
             activity.setContentView(composeView)
-            composeView.setContent {
-                BasicText("Hello, World!", Modifier.testTag("text"))
+            composeView.setContent { BasicText("Hello, World!", Modifier.testTag("text")) }
+        }
+        Espresso.onView(instanceOf(ComposeView::class.java)).check(matches(isDisplayed())).check {
+            view,
+            _ ->
+            view as ViewGroup
+            assertTrue("has children", view.childCount > 0)
+            if (Build.VERSION.SDK_INT >= 23) {
+                assertEquals(
+                    "androidx.compose.ui.platform.ComposeView",
+                    view.getAccessibilityClassName()
+                )
             }
         }
-        Espresso.onView(instanceOf(ComposeView::class.java))
-            .check(matches(isDisplayed()))
-            .check { view, _ ->
-                view as ViewGroup
-                assertTrue("has children", view.childCount > 0)
-                if (Build.VERSION.SDK_INT >= 23) {
-                    assertEquals(
-                        "androidx.compose.ui.platform.ComposeView",
-                        view.getAccessibilityClassName()
-                    )
-                }
-            }
 
         rule.onNodeWithTag("text").assertTextEquals("Hello, World!")
     }
@@ -128,18 +125,14 @@
         rule.activityRule.scenario.onActivity { activity ->
             val composeView = ComposeView(activity).also { it.id = id }
             activity.setContentView(composeView)
-            composeView.setContent {
-                BasicText("Hello", Modifier.testTag("text"))
-            }
+            composeView.setContent { BasicText("Hello", Modifier.testTag("text")) }
         }
 
         rule.onNodeWithTag("text").assertTextEquals("Hello")
 
         rule.activityRule.scenario.onActivity { activity ->
             val composeView: ComposeView = activity.findViewById(id)
-            composeView.setContent {
-                BasicText("World", Modifier.testTag("text"))
-            }
+            composeView.setContent { BasicText("World", Modifier.testTag("text")) }
         }
 
         rule.onNodeWithTag("text").assertTextEquals("World")
@@ -151,13 +144,14 @@
             var installed = false
             var disposed = false
             val testView = TestComposeView(activity)
-            val strategy = object : ViewCompositionStrategy {
-                override fun installFor(view: AbstractComposeView): () -> Unit {
-                    installed = true
-                    assertSame("correct view provided", testView, view)
-                    return { disposed = true }
+            val strategy =
+                object : ViewCompositionStrategy {
+                    override fun installFor(view: AbstractComposeView): () -> Unit {
+                        installed = true
+                        assertSame("correct view provided", testView, view)
+                        return { disposed = true }
+                    }
                 }
-            }
             testView.setViewCompositionStrategy(strategy)
             assertTrue("strategy should be installed", installed)
             assertFalse("strategy should not be disposed", disposed)
@@ -182,16 +176,15 @@
     fun disposeOnLifecycleDestroyedStrategy() {
         var composeViewCapture: ComposeView? = null
         rule.activityRule.scenario.onActivity { activity ->
-            val composeView = ComposeView(activity).also {
-                it.setViewCompositionStrategy(
-                    ViewCompositionStrategy.DisposeOnLifecycleDestroyed(activity)
-                )
-                composeViewCapture = it
-            }
+            val composeView =
+                ComposeView(activity).also {
+                    it.setViewCompositionStrategy(
+                        ViewCompositionStrategy.DisposeOnLifecycleDestroyed(activity)
+                    )
+                    composeViewCapture = it
+                }
             activity.setContentView(composeView)
-            composeView.setContent {
-                BasicText("Hello", Modifier.testTag("text"))
-            }
+            composeView.setContent { BasicText("Hello", Modifier.testTag("text")) }
         }
 
         rule.onNodeWithTag("text").assertTextEquals("Hello")
@@ -208,16 +201,15 @@
     fun disposeOnViewTreeLifecycleDestroyedStrategy_setBeforeAttached() {
         var composeViewCapture: ComposeView? = null
         rule.activityRule.scenario.onActivity { activity ->
-            val composeView = ComposeView(activity).also {
-                it.setViewCompositionStrategy(
-                    ViewCompositionStrategy.DisposeOnViewTreeLifecycleDestroyed
-                )
-                composeViewCapture = it
-            }
+            val composeView =
+                ComposeView(activity).also {
+                    it.setViewCompositionStrategy(
+                        ViewCompositionStrategy.DisposeOnViewTreeLifecycleDestroyed
+                    )
+                    composeViewCapture = it
+                }
             activity.setContentView(composeView)
-            composeView.setContent {
-                BasicText("Hello", Modifier.testTag("text"))
-            }
+            composeView.setContent { BasicText("Hello", Modifier.testTag("text")) }
         }
 
         rule.onNodeWithTag("text").assertTextEquals("Hello")
@@ -241,9 +233,7 @@
             composeView.setViewCompositionStrategy(
                 ViewCompositionStrategy.DisposeOnViewTreeLifecycleDestroyed
             )
-            composeView.setContent {
-                BasicText("Hello", Modifier.testTag("text"))
-            }
+            composeView.setContent { BasicText("Hello", Modifier.testTag("text")) }
         }
 
         rule.onNodeWithTag("text").assertTextEquals("Hello")
@@ -267,19 +257,14 @@
             activity.setContentView(composeView, ViewGroup.LayoutParams(100, 100))
             composeView.setContent {
                 Box(
-                    Modifier
-                        .testTag("box")
-                        .fillMaxSize()
-                        .onGloballyPositioned {
-                            val position = IntArray(2)
-                            composeView.getLocationOnScreen(position)
-                            globalBounds = it
-                                .boundsInWindow()
-                                .translate(
-                                    -position[0].toFloat(), -position[1].toFloat()
-                                )
-                            latch.countDown()
-                        }
+                    Modifier.testTag("box").fillMaxSize().onGloballyPositioned {
+                        val position = IntArray(2)
+                        composeView.getLocationOnScreen(position)
+                        globalBounds =
+                            it.boundsInWindow()
+                                .translate(-position[0].toFloat(), -position[1].toFloat())
+                        latch.countDown()
+                    }
                 )
             }
         }
@@ -295,18 +280,18 @@
             Box(Modifier.fillMaxSize()) {
                 with(LocalDensity.current) {
                     Box(
-                        Modifier
-                            .size(10.toDp())
+                        Modifier.size(10.toDp())
                             .offset(1.toDp(), 2.toDp())
                             .align(AbsoluteAlignment.TopLeft)
                             .onGloballyPositioned {
                                 val rect = it.boundsInWindow()
-                                boundsInWindow = IntRect(
-                                    rect.left.roundToInt(),
-                                    rect.top.roundToInt(),
-                                    rect.right.roundToInt(),
-                                    rect.bottom.roundToInt()
-                                )
+                                boundsInWindow =
+                                    IntRect(
+                                        rect.left.roundToInt(),
+                                        rect.top.roundToInt(),
+                                        rect.right.roundToInt(),
+                                        rect.bottom.roundToInt()
+                                    )
                             }
                     )
                 }
@@ -343,18 +328,18 @@
             Box(Modifier.fillMaxSize()) {
                 with(LocalDensity.current) {
                     Box(
-                        Modifier
-                            .size(10.toDp())
+                        Modifier.size(10.toDp())
                             .offset(offset.x.toDp(), offset.y.toDp())
                             .align(AbsoluteAlignment.TopLeft)
                             .onGloballyPositioned {
                                 val rect = it.boundsInWindow()
-                                boundsInWindow = IntRect(
-                                    rect.left.roundToInt(),
-                                    rect.top.roundToInt(),
-                                    rect.right.roundToInt(),
-                                    rect.bottom.roundToInt()
-                                )
+                                boundsInWindow =
+                                    IntRect(
+                                        rect.left.roundToInt(),
+                                        rect.top.roundToInt(),
+                                        rect.right.roundToInt(),
+                                        rect.bottom.roundToInt()
+                                    )
                             }
                     )
                 }
@@ -432,18 +417,18 @@
             Box(Modifier.fillMaxSize()) {
                 with(LocalDensity.current) {
                     Box(
-                        Modifier
-                            .size(10.toDp())
+                        Modifier.size(10.toDp())
                             .offset(offset.x.toDp(), offset.y.toDp())
                             .align(AbsoluteAlignment.TopLeft)
                             .onGloballyPositioned {
                                 val rect = it.boundsInWindow()
-                                boundsInWindow = IntRect(
-                                    rect.left.roundToInt(),
-                                    rect.top.roundToInt(),
-                                    rect.right.roundToInt(),
-                                    rect.bottom.roundToInt()
-                                )
+                                boundsInWindow =
+                                    IntRect(
+                                        rect.left.roundToInt(),
+                                        rect.top.roundToInt(),
+                                        rect.right.roundToInt(),
+                                        rect.bottom.roundToInt()
+                                    )
                             }
                     )
                 }
@@ -506,17 +491,11 @@
     fun throwsOnAddView() {
         rule.activityRule.scenario.onActivity { activity ->
             with(TestComposeView(activity)) {
-                assertUnsupported("addView(View)") {
-                    addView(View(activity))
-                }
+                assertUnsupported("addView(View)") { addView(View(activity)) }
 
-                assertUnsupported("addView(View, int)") {
-                    addView(View(activity), 0)
-                }
+                assertUnsupported("addView(View, int)") { addView(View(activity), 0) }
 
-                assertUnsupported("addView(View, int, int)") {
-                    addView(View(activity), 0, 0)
-                }
+                assertUnsupported("addView(View, int, int)") { addView(View(activity), 0, 0) }
 
                 assertUnsupported("addView(View, LayoutParams)") {
                     addView(View(activity), ViewGroup.LayoutParams(0, 0))
@@ -538,8 +517,8 @@
     }
 
     /**
-     * Regression test for https://issuetracker.google.com/issues/181463117
-     * Ensures that [ComposeView] can be constructed and attached a window even if View calls
+     * Regression test for https://issuetracker.google.com/issues/181463117 Ensures that
+     * [ComposeView] can be constructed and attached a window even if View calls
      * [View.onRtlPropertiesChanged] in its constructor before subclass constructors run.
      * (AndroidComposeView is sensitive to this.)
      */
@@ -550,11 +529,8 @@
         rule.activityRule.scenario.onActivity { activity ->
             result = runCatching {
                 activity.setContentView(
-                    ComposeView(
-                        ContextThemeWrapper(activity, R.style.Theme_WithScrollbarAttrSet)
-                    ).apply {
-                        setContent {}
-                    }
+                    ComposeView(ContextThemeWrapper(activity, R.style.Theme_WithScrollbarAttrSet))
+                        .apply { setContent {} }
                 )
             }
         }
@@ -570,21 +546,15 @@
             ScrollableAndNonScrollable(vertical = true)
         }
 
-        rule.onNodeWithTag(SCROLLABLE_FIRST_TAG)
-            .performScrollTo()
+        rule.onNodeWithTag(SCROLLABLE_FIRST_TAG).performScrollTo()
 
         // No down event yet, should not be scrollable in any direction
-        rule.runOnIdle {
-            composeView.assertCanScroll()
-        }
+        rule.runOnIdle { composeView.assertCanScroll() }
 
         // Send a down event.
-        rule.onNodeWithTag(SCROLLABLE_TAG)
-            .performTouchInput { down(center) }
+        rule.onNodeWithTag(SCROLLABLE_TAG).performTouchInput { down(center) }
 
-        rule.runOnIdle {
-            composeView.assertCanScroll(down = true)
-        }
+        rule.runOnIdle { composeView.assertCanScroll(down = true) }
     }
 
     @Ignore // b/260006789
@@ -596,23 +566,15 @@
             ScrollableAndNonScrollable(vertical = true)
         }
 
-        rule.onNodeWithTag(SCROLLABLE_LAST_TAG)
-            .performScrollTo()
+        rule.onNodeWithTag(SCROLLABLE_LAST_TAG).performScrollTo()
 
         // No down event yet, should not be scrollable in any direction
-        rule.runOnIdle {
-            composeView.assertCanScroll()
-        }
+        rule.runOnIdle { composeView.assertCanScroll() }
 
         // Send a down event.
-        rule.onNodeWithTag(SCROLLABLE_TAG)
-            .performTouchInput {
-                down(center)
-            }
+        rule.onNodeWithTag(SCROLLABLE_TAG).performTouchInput { down(center) }
 
-        rule.runOnIdle {
-            composeView.assertCanScroll(up = true)
-        }
+        rule.runOnIdle { composeView.assertCanScroll(up = true) }
     }
 
     @Ignore // b/260006789
@@ -625,18 +587,13 @@
         }
 
         // No down event yet, should not be scrollable in any direction
-        rule.runOnIdle {
-            composeView.assertCanScroll()
-        }
+        rule.runOnIdle { composeView.assertCanScroll() }
 
         // Send a down event.
-        rule.onNodeWithTag(NON_SCROLLABLE_TAG)
-            .performTouchInput { down(center) }
+        rule.onNodeWithTag(NON_SCROLLABLE_TAG).performTouchInput { down(center) }
 
         // No down event yet, should not be scrollable in any direction
-        rule.runOnIdle {
-            composeView.assertCanScroll()
-        }
+        rule.runOnIdle { composeView.assertCanScroll() }
     }
 
     @Ignore // b/260006789
@@ -648,21 +605,15 @@
             ScrollableAndNonScrollable(vertical = false)
         }
 
-        rule.onNodeWithTag(SCROLLABLE_FIRST_TAG)
-            .performScrollTo()
+        rule.onNodeWithTag(SCROLLABLE_FIRST_TAG).performScrollTo()
 
         // No down event yet, should not be scrollable in any direction
-        rule.runOnIdle {
-            composeView.assertCanScroll()
-        }
+        rule.runOnIdle { composeView.assertCanScroll() }
 
         // Send a down event.
-        rule.onNodeWithTag(SCROLLABLE_TAG)
-            .performTouchInput { down(center) }
+        rule.onNodeWithTag(SCROLLABLE_TAG).performTouchInput { down(center) }
 
-        rule.runOnIdle {
-            composeView.assertCanScroll(right = true)
-        }
+        rule.runOnIdle { composeView.assertCanScroll(right = true) }
     }
 
     @Test
@@ -673,21 +624,15 @@
             ScrollableAndNonScrollable(vertical = false)
         }
 
-        rule.onNodeWithTag(SCROLLABLE_LAST_TAG)
-            .performScrollTo()
+        rule.onNodeWithTag(SCROLLABLE_LAST_TAG).performScrollTo()
 
         // No down event yet, should not be scrollable in any direction
-        rule.runOnIdle {
-            composeView.assertCanScroll()
-        }
+        rule.runOnIdle { composeView.assertCanScroll() }
 
         // Send a down event.
-        rule.onNodeWithTag(SCROLLABLE_TAG)
-            .performTouchInput { down(center) }
+        rule.onNodeWithTag(SCROLLABLE_TAG).performTouchInput { down(center) }
 
-        rule.runOnIdle {
-            composeView.assertCanScroll(left = true)
-        }
+        rule.runOnIdle { composeView.assertCanScroll(left = true) }
     }
 
     @Test
@@ -699,18 +644,13 @@
         }
 
         // No down event yet, should not be scrollable in any direction
-        rule.runOnIdle {
-            composeView.assertCanScroll()
-        }
+        rule.runOnIdle { composeView.assertCanScroll() }
 
         // Send a down event.
-        rule.onNodeWithTag(NON_SCROLLABLE_TAG)
-            .performTouchInput { down(center) }
+        rule.onNodeWithTag(NON_SCROLLABLE_TAG).performTouchInput { down(center) }
 
         // No down event yet, should not be scrollable in any direction
-        rule.runOnIdle {
-            composeView.assertCanScroll()
-        }
+        rule.runOnIdle { composeView.assertCanScroll() }
     }
 
     /**
@@ -743,48 +683,39 @@
         rule.setContent {
             with(LocalDensity.current) {
                 AndroidView(
-                    modifier = Modifier
-                        .requiredSize(61.toDp())
-                        .padding(10.toDp()),
+                    modifier = Modifier.requiredSize(61.toDp()).padding(10.toDp()),
                     factory = { context ->
                         FrameLayout(context).apply {
                             setPadding(10)
-                            addView(ComposeView(context).apply {
-                                setContent {
-                                    // Query the inner android view, not the outer one.
-                                    composeView = LocalView.current
-                                    Box(
-                                        Modifier
-                                            .padding(10.toDp())
-                                            .testTag(SCROLLABLE_TAG)
-                                            .horizontalScroll(rememberScrollState())
-                                            // Give it something to scroll.
-                                            .requiredSize(100.dp)
-                                    )
+                            addView(
+                                ComposeView(context).apply {
+                                    setContent {
+                                        // Query the inner android view, not the outer one.
+                                        composeView = LocalView.current
+                                        Box(
+                                            Modifier.padding(10.toDp())
+                                                .testTag(SCROLLABLE_TAG)
+                                                .horizontalScroll(rememberScrollState())
+                                                // Give it something to scroll.
+                                                .requiredSize(100.dp)
+                                        )
+                                    }
                                 }
-                            })
+                            )
                         }
                     }
                 )
             }
         }
 
-        val scrollable = rule.onNodeWithTag(SCROLLABLE_TAG)
-            .fetchSemanticsNode()
+        val scrollable = rule.onNodeWithTag(SCROLLABLE_TAG).fetchSemanticsNode()
         assertEquals(IntSize(1, 1), scrollable.size)
 
-        rule.runOnIdle {
-            composeView.assertCanScroll()
-        }
+        rule.runOnIdle { composeView.assertCanScroll() }
 
-        rule.onNodeWithTag(SCROLLABLE_TAG)
-            .performTouchInput {
-                down(center)
-            }
+        rule.onNodeWithTag(SCROLLABLE_TAG).performTouchInput { down(center) }
 
-        rule.runOnIdle {
-            composeView.assertCanScroll(right = true)
-        }
+        rule.runOnIdle { composeView.assertCanScroll(right = true) }
     }
 
     @Test
@@ -801,24 +732,16 @@
         val newDensity = density.density * 2f
 
         rule.runOnUiThread {
-            assertEquals(
-                composeView.width,
-                with(density) { 100.dp.roundToPx() }
-            )
+            assertEquals(composeView.width, with(density) { 100.dp.roundToPx() })
 
             rule.activity.resources.displayMetrics.density = newDensity
-            val newConfig = Configuration().apply {
-                setTo(rule.activity.resources.configuration)
-            }
+            val newConfig = Configuration().apply { setTo(rule.activity.resources.configuration) }
             composeView.dispatchConfigurationChanged(newConfig)
         }
 
         rule.runOnIdle {
             assertEquals(currentDensity.density, newDensity)
-            assertEquals(
-                composeView.width,
-                with(Density(newDensity)) { 100.dp.roundToPx() }
-            )
+            assertEquals(composeView.width, with(Density(newDensity)) { 100.dp.roundToPx() })
         }
 
         rule.runOnUiThread {
@@ -845,10 +768,7 @@
     assertEquals(down, canScrollVertically(1))
 }
 
-private inline fun ViewGroup.assertUnsupported(
-    testName: String,
-    test: ViewGroup.() -> Unit
-) {
+private inline fun ViewGroup.assertUnsupported(testName: String, test: ViewGroup.() -> Unit) {
     var exception: Throwable? = null
     try {
         test()
@@ -866,35 +786,22 @@
     @Composable
     fun layout(size: Dp, content: @Composable (Modifier) -> Unit) {
         if (vertical) {
-            Column(Modifier.requiredSize(size)) {
-                content(
-                    Modifier
-                        .weight(1f)
-                        .fillMaxWidth())
-            }
+            Column(Modifier.requiredSize(size)) { content(Modifier.weight(1f).fillMaxWidth()) }
         } else {
-            Row(Modifier.requiredSize(100.dp)) {
-                content(
-                    Modifier
-                        .weight(1f)
-                        .fillMaxHeight())
-            }
+            Row(Modifier.requiredSize(100.dp)) { content(Modifier.weight(1f).fillMaxHeight()) }
         }
     }
 
     val scrollState = rememberScrollState(0)
-    val scrollModifier = if (vertical) {
-        Modifier.verticalScroll(scrollState)
-    } else {
-        Modifier.horizontalScroll(scrollState)
-    }
+    val scrollModifier =
+        if (vertical) {
+            Modifier.verticalScroll(scrollState)
+        } else {
+            Modifier.horizontalScroll(scrollState)
+        }
 
     layout(100.dp) { modifier ->
-        Box(
-            modifier
-                .testTag(SCROLLABLE_TAG)
-                .then(scrollModifier)
-        ) {
+        Box(modifier.testTag(SCROLLABLE_TAG).then(scrollModifier)) {
             layout(10000.dp) {
                 Box(Modifier.testTag(SCROLLABLE_FIRST_TAG))
                 // Give the scrollable some content that actually requires scrolling.
@@ -906,9 +813,7 @@
     }
 }
 
-private class TestComposeView(
-    context: Context
-) : AbstractComposeView(context) {
+private class TestComposeView(context: Context) : AbstractComposeView(context) {
 
     @Composable
     override fun Content() {
diff --git a/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/viewinterop/EditTextInteropTest.kt b/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/viewinterop/EditTextInteropTest.kt
index afda8a0..2266242 100644
--- a/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/viewinterop/EditTextInteropTest.kt
+++ b/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/viewinterop/EditTextInteropTest.kt
@@ -32,8 +32,7 @@
 @MediumTest
 @RunWith(AndroidJUnit4::class)
 class EditTextInteropTest {
-    @get:Rule
-    val rule = createAndroidComposeRule<TestActivity>()
+    @get:Rule val rule = createAndroidComposeRule<TestActivity>()
 
     @Test
     fun hardwareKeyInEmbeddedView() {
@@ -43,15 +42,19 @@
         rule.setContent {
             ownerView = LocalView.current
             AndroidView({
-                EditText(it).apply { width = 500; editText = this }
+                EditText(it).apply {
+                    width = 500
+                    editText = this
+                }
             })
         }
         rule.runOnIdle { editText.requestFocus() }
 
         // Act.
-        val keyConsumed = rule.runOnIdle {
-            ownerView.dispatchKeyEvent(KeyEvent(KeyEvent.ACTION_UP, KeyEvent.KEYCODE_A))
-        }
+        val keyConsumed =
+            rule.runOnIdle {
+                ownerView.dispatchKeyEvent(KeyEvent(KeyEvent.ACTION_UP, KeyEvent.KEYCODE_A))
+            }
 
         // Assert.
         // TODO(b/171997891): Right now we just assert that we reach here without crashing. Once we
diff --git a/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/viewinterop/FocusSearchBackwardInteropTest.kt b/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/viewinterop/FocusSearchBackwardInteropTest.kt
index c2220bf..9dd73b0 100644
--- a/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/viewinterop/FocusSearchBackwardInteropTest.kt
+++ b/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/viewinterop/FocusSearchBackwardInteropTest.kt
@@ -60,8 +60,7 @@
 @RunWith(Parameterized::class)
 class FocusSearchBackwardInteropTest(private val moveFocusProgrammatically: Boolean) {
 
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
     private lateinit var focusManager: FocusManager
     private lateinit var view: View
@@ -76,9 +75,7 @@
     @Test
     fun singleFocusableComposable() {
         // Arrange.
-        setContent {
-            FocusableComponent(composable)
-        }
+        setContent { FocusableComponent(composable) }
 
         // Act.
         rule.focusSearchBackward()
@@ -90,17 +87,13 @@
     @Test
     fun singleFocusableView() {
         // Arrange.
-        setContent {
-            AndroidView({ FocusableView(it).apply { view = this } })
-        }
+        setContent { AndroidView({ FocusableView(it).apply { view = this } }) }
 
         // Act.
         rule.focusSearchBackward()
 
         // Assert.
-        rule.runOnIdle {
-            assertThat(view.isFocused).isTrue()
-        }
+        rule.runOnIdle { assertThat(view.isFocused).isTrue() }
     }
 
     @Test
@@ -108,9 +101,7 @@
         // Arrange.
         setContent {
             AndroidView({
-                LinearLayout(it).apply {
-                    addView(FocusableView(it).apply { view = this })
-                }
+                LinearLayout(it).apply { addView(FocusableView(it).apply { view = this }) }
             })
         }
 
@@ -202,18 +193,19 @@
             AndroidView({ context ->
                 LinearLayout(context).apply {
                     addView(FocusableView(context).apply { view2 = this })
-                    addView(ComposeView(context).apply {
-                        setContent {
-                            Row(
-                                Modifier
-                                    .testTag(composable)
-                                    .onFocusChanged { isComposableFocused = it.isFocused }
-                                    .focusable()
-                            ) {
-                                AndroidView({ FocusableView(it).apply { view1 = this } })
+                    addView(
+                        ComposeView(context).apply {
+                            setContent {
+                                Row(
+                                    Modifier.testTag(composable)
+                                        .onFocusChanged { isComposableFocused = it.isFocused }
+                                        .focusable()
+                                ) {
+                                    AndroidView({ FocusableView(it).apply { view1 = this } })
+                                }
                             }
                         }
-                    })
+                    )
                 }
             })
         }
@@ -260,11 +252,7 @@
             AndroidView({
                 LinearLayout(it).apply {
                     addView(FocusableView(it).apply { view2 = this })
-                    addView(
-                        ComposeView(it).apply {
-                            setContent { FocusableComponent(composable) }
-                        }
-                    )
+                    addView(ComposeView(it).apply { setContent { FocusableComponent(composable) } })
                     addView(FocusableView(it).apply { view1 = this })
                 }
             })
@@ -667,8 +655,7 @@
         if (moveFocusProgrammatically) {
             runOnUiThread { focusManager.moveFocus(FocusDirection.Previous) }
         } else {
-            InstrumentationRegistry
-                .getInstrumentation()
+            InstrumentationRegistry.getInstrumentation()
                 .sendKeySync(KeyEvent(0L, 0L, ACTION_DOWN, Key.Tab.nativeKeyCode, 0, Shift))
         }
     }
diff --git a/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/viewinterop/FocusSearchDownInteropTest.kt b/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/viewinterop/FocusSearchDownInteropTest.kt
index b96dda8..57282e8 100644
--- a/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/viewinterop/FocusSearchDownInteropTest.kt
+++ b/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/viewinterop/FocusSearchDownInteropTest.kt
@@ -55,8 +55,7 @@
 @MediumTest
 @RunWith(Parameterized::class)
 class FocusSearchDownInteropTest(private val moveFocusProgrammatically: Boolean) {
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
     private lateinit var focusManager: FocusManager
     private lateinit var view: View
@@ -71,9 +70,7 @@
     @Test
     fun singleFocusableComposable() {
         // Arrange.
-        setContent {
-            FocusableComponent(composable)
-        }
+        setContent { FocusableComponent(composable) }
 
         // Act.
         rule.focusSearchDown()
@@ -85,17 +82,13 @@
     @Test
     fun singleFocusableView() {
         // Arrange.
-        setContent {
-            AndroidView({ FocusableView(it).apply { view = this } })
-        }
+        setContent { AndroidView({ FocusableView(it).apply { view = this } }) }
 
         // Act.
         rule.focusSearchDown()
 
         // Assert.
-        rule.runOnIdle {
-            assertThat(view.isFocused).isTrue()
-        }
+        rule.runOnIdle { assertThat(view.isFocused).isTrue() }
     }
 
     @Test
@@ -194,18 +187,19 @@
             AndroidView({ context ->
                 LinearLayout(context).apply {
                     orientation = VERTICAL
-                    addView(ComposeView(context).apply {
-                        setContent {
-                            Column(
-                                Modifier
-                                    .testTag(composable)
-                                    .onFocusChanged { isComposableFocused = it.isFocused }
-                                    .focusable()
-                            ) {
-                                AndroidView({ FocusableView(it).apply { view1 = this } })
+                    addView(
+                        ComposeView(context).apply {
+                            setContent {
+                                Column(
+                                    Modifier.testTag(composable)
+                                        .onFocusChanged { isComposableFocused = it.isFocused }
+                                        .focusable()
+                                ) {
+                                    AndroidView({ FocusableView(it).apply { view1 = this } })
+                                }
                             }
                         }
-                    })
+                    )
                     addView(FocusableView(context).apply { view2 = this })
                 }
             })
@@ -258,11 +252,7 @@
                 LinearLayout(it).apply {
                     orientation = VERTICAL
                     addView(FocusableView(it).apply { view1 = this })
-                    addView(
-                        ComposeView(it).apply {
-                            setContent { FocusableComponent(composable) }
-                        }
-                    )
+                    addView(ComposeView(it).apply { setContent { FocusableComponent(composable) } })
                     addView(FocusableView(it).apply { view2 = this })
                 }
             })
@@ -660,8 +650,7 @@
         if (moveFocusProgrammatically) {
             runOnUiThread { focusManager.moveFocus(FocusDirection.Down) }
         } else {
-            InstrumentationRegistry
-                .getInstrumentation()
+            InstrumentationRegistry.getInstrumentation()
                 .sendKeySync(KeyEvent(KeyEvent.ACTION_DOWN, Key.DirectionDown.nativeKeyCode))
         }
     }
diff --git a/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/viewinterop/FocusSearchForwardInteropTest.kt b/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/viewinterop/FocusSearchForwardInteropTest.kt
index 1d22244..a599981 100644
--- a/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/viewinterop/FocusSearchForwardInteropTest.kt
+++ b/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/viewinterop/FocusSearchForwardInteropTest.kt
@@ -57,8 +57,7 @@
 @MediumTest
 @RunWith(Parameterized::class)
 class FocusSearchForwardInteropTest(private val moveFocusProgrammatically: Boolean) {
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
     private lateinit var focusManager: FocusManager
     private lateinit var view: View
@@ -73,9 +72,7 @@
     @Test
     fun singleFocusableComposable() {
         // Arrange.
-        setContent {
-            FocusableComponent(composable)
-        }
+        setContent { FocusableComponent(composable) }
 
         // Act.
         rule.focusSearchForward()
@@ -87,17 +84,13 @@
     @Test
     fun singleFocusableView() {
         // Arrange.
-        setContent {
-            AndroidView({ FocusableView(it).apply { view = this } })
-        }
+        setContent { AndroidView({ FocusableView(it).apply { view = this } }) }
 
         // Act.
         rule.focusSearchForward()
 
         // Assert.
-        rule.runOnIdle {
-            assertThat(view.isFocused).isTrue()
-        }
+        rule.runOnIdle { assertThat(view.isFocused).isTrue() }
     }
 
     @Test
@@ -105,9 +98,7 @@
         // Arrange.
         setContent {
             AndroidView({
-                LinearLayout(it).apply {
-                    addView(FocusableView(it).apply { view = this })
-                }
+                LinearLayout(it).apply { addView(FocusableView(it).apply { view = this }) }
             })
         }
 
@@ -193,18 +184,19 @@
         setContent {
             AndroidView({ context ->
                 LinearLayout(context).apply {
-                    addView(ComposeView(context).apply {
-                        setContent {
-                            Row(
-                                Modifier
-                                    .testTag(composable)
-                                    .onFocusChanged { isComposableFocused = it.isFocused }
-                                    .focusable()
-                            ) {
-                                AndroidView({ FocusableView(it).apply { view1 = this } })
+                    addView(
+                        ComposeView(context).apply {
+                            setContent {
+                                Row(
+                                    Modifier.testTag(composable)
+                                        .onFocusChanged { isComposableFocused = it.isFocused }
+                                        .focusable()
+                                ) {
+                                    AndroidView({ FocusableView(it).apply { view1 = this } })
+                                }
                             }
                         }
-                    })
+                    )
                     addView(FocusableView(context).apply { view2 = this })
                 }
             })
@@ -250,11 +242,7 @@
             AndroidView({
                 LinearLayout(it).apply {
                     addView(FocusableView(it).apply { view1 = this })
-                    addView(
-                        ComposeView(it).apply {
-                            setContent { FocusableComponent(composable) }
-                        }
-                    )
+                    addView(ComposeView(it).apply { setContent { FocusableComponent(composable) } })
                     addView(FocusableView(it).apply { view2 = this })
                 }
             })
@@ -648,8 +636,7 @@
         if (moveFocusProgrammatically) {
             runOnUiThread { focusManager.moveFocus(FocusDirection.Next) }
         } else {
-            InstrumentationRegistry
-                .getInstrumentation()
+            InstrumentationRegistry.getInstrumentation()
                 .sendKeySync(AndroidKeyEvent(ACTION_DOWN, Key.Tab.nativeKeyCode))
         }
     }
diff --git a/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/viewinterop/FocusSearchInteropTest.kt b/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/viewinterop/FocusSearchInteropTest.kt
index c1c9fff..d132dbb 100644
--- a/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/viewinterop/FocusSearchInteropTest.kt
+++ b/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/viewinterop/FocusSearchInteropTest.kt
@@ -46,15 +46,12 @@
 @MediumTest
 @RunWith(Parameterized::class)
 class FocusSearchInteropTest(private val keyEvent: AndroidKeyEvent) {
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
     @Test
     fun singleFocusableComposable() {
         // Arrange.
-        rule.setContent {
-            Box(Modifier.testTag(Tag).size(10.dp).focusable())
-        }
+        rule.setContent { Box(Modifier.testTag(Tag).size(10.dp).focusable()) }
 
         // Act.
         rule.waitForIdle()
@@ -68,20 +65,14 @@
     fun singleFocusableView() {
         // Arrange.
         lateinit var embeddedView: View
-        rule.setContent {
-            AndroidView({
-                FocusableView(it).apply { embeddedView = this }
-            })
-        }
+        rule.setContent { AndroidView({ FocusableView(it).apply { embeddedView = this } }) }
 
         // Act.
         rule.waitForIdle()
         InstrumentationRegistry.getInstrumentation().sendKeySync(keyEvent)
 
         // Assert.
-        rule.runOnIdle {
-            assertThat(embeddedView.isFocused).isTrue()
-        }
+        rule.runOnIdle { assertThat(embeddedView.isFocused).isTrue() }
     }
 
     private fun FocusableView(context: Context): View {
@@ -95,13 +86,14 @@
     companion object {
         @JvmStatic
         @Parameterized.Parameters(name = "key = {0}")
-        fun initParameters() = listOf(
-            AndroidKeyEvent(ACTION_DOWN, Key.DirectionUp.nativeKeyCode),
-            AndroidKeyEvent(ACTION_DOWN, Key.DirectionDown.nativeKeyCode),
-            AndroidKeyEvent(ACTION_DOWN, Key.DirectionLeft.nativeKeyCode),
-            AndroidKeyEvent(ACTION_DOWN, Key.DirectionRight.nativeKeyCode),
-            AndroidKeyEvent(ACTION_DOWN, Key.Tab.nativeKeyCode),
-            AndroidKeyEvent(0L, 0L, ACTION_DOWN, Key.Tab.nativeKeyCode, META_SHIFT_ON),
-        )
+        fun initParameters() =
+            listOf(
+                AndroidKeyEvent(ACTION_DOWN, Key.DirectionUp.nativeKeyCode),
+                AndroidKeyEvent(ACTION_DOWN, Key.DirectionDown.nativeKeyCode),
+                AndroidKeyEvent(ACTION_DOWN, Key.DirectionLeft.nativeKeyCode),
+                AndroidKeyEvent(ACTION_DOWN, Key.DirectionRight.nativeKeyCode),
+                AndroidKeyEvent(ACTION_DOWN, Key.Tab.nativeKeyCode),
+                AndroidKeyEvent(0L, 0L, ACTION_DOWN, Key.Tab.nativeKeyCode, META_SHIFT_ON),
+            )
     }
 }
diff --git a/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/viewinterop/FocusSearchLeftInteropTest.kt b/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/viewinterop/FocusSearchLeftInteropTest.kt
index fdfa90e..aa67089 100644
--- a/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/viewinterop/FocusSearchLeftInteropTest.kt
+++ b/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/viewinterop/FocusSearchLeftInteropTest.kt
@@ -57,8 +57,7 @@
 @MediumTest
 @RunWith(Parameterized::class)
 class FocusSearchLeftInteropTest(private val moveFocusProgrammatically: Boolean) {
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
     private lateinit var focusManager: FocusManager
     private lateinit var view: View
@@ -73,9 +72,7 @@
     @Test
     fun singleFocusableComposable() {
         // Arrange.
-        setContent {
-            FocusableComponent(composable)
-        }
+        setContent { FocusableComponent(composable) }
 
         // Act.
         rule.focusSearchLeft()
@@ -87,17 +84,13 @@
     @Test
     fun singleFocusableView() {
         // Arrange.
-        setContent {
-            AndroidView({ FocusableView(it).apply { view = this } })
-        }
+        setContent { AndroidView({ FocusableView(it).apply { view = this } }) }
 
         // Act.
         rule.focusSearchLeft()
 
         // Assert.
-        rule.runOnIdle {
-            assertThat(view.isFocused).isTrue()
-        }
+        rule.runOnIdle { assertThat(view.isFocused).isTrue() }
     }
 
     @Test
@@ -202,18 +195,19 @@
                 LinearLayout(context).apply {
                     orientation = HORIZONTAL
                     addView(FocusableView(context).apply { view2 = this })
-                    addView(ComposeView(context).apply {
-                        setContent {
-                            Row(
-                                Modifier
-                                    .testTag(composable)
-                                    .onFocusChanged { isComposableFocused = it.isFocused }
-                                    .focusable()
-                            ) {
-                                AndroidView({ FocusableView(it).apply { view1 = this } })
+                    addView(
+                        ComposeView(context).apply {
+                            setContent {
+                                Row(
+                                    Modifier.testTag(composable)
+                                        .onFocusChanged { isComposableFocused = it.isFocused }
+                                        .focusable()
+                                ) {
+                                    AndroidView({ FocusableView(it).apply { view1 = this } })
+                                }
                             }
                         }
-                    })
+                    )
                 }
             })
         }
@@ -265,11 +259,7 @@
                 LinearLayout(it).apply {
                     orientation = HORIZONTAL
                     addView(FocusableView(it).apply { view2 = this })
-                    addView(
-                        ComposeView(it).apply {
-                            setContent { FocusableComponent(composable) }
-                        }
-                    )
+                    addView(ComposeView(it).apply { setContent { FocusableComponent(composable) } })
                     addView(FocusableView(it).apply { view1 = this })
                 }
             })
@@ -677,8 +667,7 @@
         if (moveFocusProgrammatically) {
             runOnUiThread { focusManager.moveFocus(FocusDirection.Left) }
         } else {
-            InstrumentationRegistry
-                .getInstrumentation()
+            InstrumentationRegistry.getInstrumentation()
                 .sendKeySync(KeyEvent(KeyEvent.ACTION_DOWN, Key.DirectionLeft.nativeKeyCode))
         }
     }
diff --git a/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/viewinterop/FocusSearchRightInteropTest.kt b/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/viewinterop/FocusSearchRightInteropTest.kt
index 2d3eee6..6233adb 100644
--- a/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/viewinterop/FocusSearchRightInteropTest.kt
+++ b/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/viewinterop/FocusSearchRightInteropTest.kt
@@ -55,8 +55,7 @@
 @MediumTest
 @RunWith(Parameterized::class)
 class FocusSearchRightInteropTest(private val moveFocusProgrammatically: Boolean) {
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
     private lateinit var focusManager: FocusManager
     private lateinit var view: View
@@ -71,9 +70,7 @@
     @Test
     fun singleFocusableComposable() {
         // Arrange.
-        setContent {
-            FocusableComponent(composable)
-        }
+        setContent { FocusableComponent(composable) }
 
         // Act.
         rule.focusSearchRight()
@@ -85,17 +82,13 @@
     @Test
     fun singleFocusableView() {
         // Arrange.
-        setContent {
-            AndroidView({ FocusableView(it).apply { view = this } })
-        }
+        setContent { AndroidView({ FocusableView(it).apply { view = this } }) }
 
         // Act.
         rule.focusSearchRight()
 
         // Assert.
-        rule.runOnIdle {
-            assertThat(view.isFocused).isTrue()
-        }
+        rule.runOnIdle { assertThat(view.isFocused).isTrue() }
     }
 
     @Test
@@ -194,18 +187,19 @@
             AndroidView({ context ->
                 LinearLayout(context).apply {
                     orientation = HORIZONTAL
-                    addView(ComposeView(context).apply {
-                        setContent {
-                            Row(
-                                Modifier
-                                    .testTag(composable)
-                                    .onFocusChanged { isComposableFocused = it.isFocused }
-                                    .focusable()
-                            ) {
-                                AndroidView({ FocusableView(it).apply { view1 = this } })
+                    addView(
+                        ComposeView(context).apply {
+                            setContent {
+                                Row(
+                                    Modifier.testTag(composable)
+                                        .onFocusChanged { isComposableFocused = it.isFocused }
+                                        .focusable()
+                                ) {
+                                    AndroidView({ FocusableView(it).apply { view1 = this } })
+                                }
                             }
                         }
-                    })
+                    )
                     addView(FocusableView(context).apply { view2 = this })
                 }
             })
@@ -258,11 +252,7 @@
                 LinearLayout(it).apply {
                     orientation = HORIZONTAL
                     addView(FocusableView(it).apply { view1 = this })
-                    addView(
-                        ComposeView(it).apply {
-                            setContent { FocusableComponent(composable) }
-                        }
-                    )
+                    addView(ComposeView(it).apply { setContent { FocusableComponent(composable) } })
                     addView(FocusableView(it).apply { view2 = this })
                 }
             })
@@ -660,8 +650,7 @@
         if (moveFocusProgrammatically) {
             runOnUiThread { focusManager.moveFocus(FocusDirection.Right) }
         } else {
-            InstrumentationRegistry
-                .getInstrumentation()
+            InstrumentationRegistry.getInstrumentation()
                 .sendKeySync(KeyEvent(KeyEvent.ACTION_DOWN, Key.DirectionRight.nativeKeyCode))
         }
     }
diff --git a/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/viewinterop/FocusSearchUpInteropTest.kt b/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/viewinterop/FocusSearchUpInteropTest.kt
index 506bd1e..a6aec19 100644
--- a/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/viewinterop/FocusSearchUpInteropTest.kt
+++ b/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/viewinterop/FocusSearchUpInteropTest.kt
@@ -58,8 +58,7 @@
 @MediumTest
 @RunWith(Parameterized::class)
 class FocusSearchUpInteropTest(private val moveFocusProgrammatically: Boolean) {
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
     private lateinit var focusManager: FocusManager
     private lateinit var view: View
@@ -74,9 +73,7 @@
     @Test
     fun singleFocusableComposable() {
         // Arrange.
-        setContent {
-            FocusableComponent(composable)
-        }
+        setContent { FocusableComponent(composable) }
 
         // Act.
         rule.focusSearchUp()
@@ -88,17 +85,13 @@
     @Test
     fun singleFocusableView() {
         // Arrange.
-        setContent {
-            AndroidView({ FocusableView(it).apply { view = this } })
-        }
+        setContent { AndroidView({ FocusableView(it).apply { view = this } }) }
 
         // Act.
         rule.focusSearchUp()
 
         // Assert.
-        rule.runOnIdle {
-            assertThat(view.isFocused).isTrue()
-        }
+        rule.runOnIdle { assertThat(view.isFocused).isTrue() }
     }
 
     @Test
@@ -204,18 +197,19 @@
                 LinearLayout(context).apply {
                     orientation = VERTICAL
                     addView(FocusableView(context).apply { view2 = this })
-                    addView(ComposeView(context).apply {
-                        setContent {
-                            Column(
-                                Modifier
-                                    .testTag(composable)
-                                    .onFocusChanged { isComposableFocused = it.isFocused }
-                                    .focusable()
-                            ) {
-                                AndroidView({ FocusableView(it).apply { view1 = this } })
+                    addView(
+                        ComposeView(context).apply {
+                            setContent {
+                                Column(
+                                    Modifier.testTag(composable)
+                                        .onFocusChanged { isComposableFocused = it.isFocused }
+                                        .focusable()
+                                ) {
+                                    AndroidView({ FocusableView(it).apply { view1 = this } })
+                                }
                             }
                         }
-                    })
+                    )
                 }
             })
         }
@@ -267,11 +261,7 @@
                 LinearLayout(it).apply {
                     orientation = VERTICAL
                     addView(FocusableView(it).apply { view2 = this })
-                    addView(
-                        ComposeView(it).apply {
-                            setContent { FocusableComponent(composable) }
-                        }
-                    )
+                    addView(ComposeView(it).apply { setContent { FocusableComponent(composable) } })
                     addView(FocusableView(it).apply { view1 = this })
                 }
             })
@@ -679,8 +669,7 @@
         if (moveFocusProgrammatically) {
             runOnUiThread { focusManager.moveFocus(FocusDirection.Up) }
         } else {
-            InstrumentationRegistry
-                .getInstrumentation()
+            InstrumentationRegistry.getInstrumentation()
                 .sendKeySync(KeyEvent(KeyEvent.ACTION_DOWN, Key.DirectionUp.nativeKeyCode))
         }
     }
diff --git a/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/viewinterop/FocusWrapperTest.kt b/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/viewinterop/FocusWrapperTest.kt
index 3d124e3..fa99c4f 100644
--- a/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/viewinterop/FocusWrapperTest.kt
+++ b/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/viewinterop/FocusWrapperTest.kt
@@ -37,8 +37,7 @@
 @MediumTest
 @RunWith(AndroidJUnit4::class)
 class FocusWrapperTest {
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
     @Test
     fun hostViewIsNotFocused_whenViewIsFocused() {
@@ -55,9 +54,7 @@
         }
 
         // Act.
-        rule.runOnIdle {
-            view.requestFocus()
-        }
+        rule.runOnIdle { view.requestFocus() }
 
         // Assert.
         rule.runOnIdle {
diff --git a/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/viewinterop/InvalidatedTextView.kt b/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/viewinterop/InvalidatedTextView.kt
index 08276eb..fcb7514 100644
--- a/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/viewinterop/InvalidatedTextView.kt
+++ b/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/viewinterop/InvalidatedTextView.kt
@@ -22,11 +22,11 @@
 import android.widget.TextView
 
 /**
- * Custom view that represents a TextView that invalidates itself during every draw which
- * is mainly used for testing invalidation paths.
+ * Custom view that represents a TextView that invalidates itself during every draw which is mainly
+ * used for testing invalidation paths.
  *
- * The view invalidates up to the amount of times specified in [timesToInvalidate] then it will
- * no longer invalidate upon drawing.
+ * The view invalidates up to the amount of times specified in [timesToInvalidate] then it will no
+ * longer invalidate upon drawing.
  */
 class InvalidatedTextView : TextView {
     var timesDrawn: Int = 0
@@ -34,12 +34,14 @@
     var onDraw: () -> Unit = {}
 
     constructor(context: Context?) : super(context)
+
     constructor(context: Context?, attrs: AttributeSet?) : super(context, attrs)
-    constructor(context: Context?, attrs: AttributeSet?, defStyleAttr: Int) : super(
-        context,
-        attrs,
-        defStyleAttr
-    )
+
+    constructor(
+        context: Context?,
+        attrs: AttributeSet?,
+        defStyleAttr: Int
+    ) : super(context, attrs, defStyleAttr)
 
     override fun draw(canvas: Canvas) {
         if (timesDrawn < timesToInvalidate) {
diff --git a/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/viewinterop/NestedScrollInteropConnectionTest.kt b/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/viewinterop/NestedScrollInteropConnectionTest.kt
index 3d01d37..3640894 100644
--- a/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/viewinterop/NestedScrollInteropConnectionTest.kt
+++ b/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/viewinterop/NestedScrollInteropConnectionTest.kt
@@ -61,8 +61,7 @@
 @RunWith(AndroidJUnit4::class)
 class NestedScrollInteropConnectionTest {
 
-    @get:Rule
-    val rule = createAndroidComposeRule<ComponentActivity>()
+    @get:Rule val rule = createAndroidComposeRule<ComponentActivity>()
     private val deltaCollectorNestedScrollConnection = InspectableNestedScrollConnection()
 
     private val nestedScrollParentView by lazy {
@@ -87,9 +86,7 @@
         createViewComposeActivity { TestListWithNestedScroll(items) }
 
         // act: scroll compose side
-        rule.onNodeWithTag(MainListTestTag).performTouchInput {
-            swipeUp()
-        }
+        rule.onNodeWithTag(MainListTestTag).performTouchInput { swipeUp() }
 
         // assert: compose list is scrolled
         rule.onNodeWithTag(topItemTag).assertDoesNotExist()
@@ -119,11 +116,12 @@
         // assert: check delta on view side
         rule.runOnIdle {
             assertThat(
-                abs(
-                    nestedScrollParentView.offeredToParentOffset.y -
-                        deltaCollectorNestedScrollConnection.offeredFromChild.y
+                    abs(
+                        nestedScrollParentView.offeredToParentOffset.y -
+                            deltaCollectorNestedScrollConnection.offeredFromChild.y
+                    )
                 )
-            ).isAtMost(ScrollRoundingErrorTolerance)
+                .isAtMost(ScrollRoundingErrorTolerance)
 
             assertThat(deltaCollectorNestedScrollConnection.consumedDownChain)
                 .isEqualTo(Offset.Zero)
@@ -135,16 +133,10 @@
     fun swipeNoOpComposeScrollable_insideNestedScrollingParentView_shouldNotScrollView() {
         // arrange
 
-        createViewComposeActivity {
-            TestListWithNestedScroll(
-                items, Modifier
-            )
-        }
+        createViewComposeActivity { TestListWithNestedScroll(items, Modifier) }
 
         // act: scroll compose side
-        rule.onNodeWithTag(MainListTestTag).performTouchInput {
-            swipeUp()
-        }
+        rule.onNodeWithTag(MainListTestTag).performTouchInput { swipeUp() }
 
         // assert: compose list is scrolled
         rule.onNodeWithTag(topItemTag).assertDoesNotExist()
@@ -156,9 +148,7 @@
         createViewComposeActivity(enableInterop = false) { TestListWithNestedScroll(items) }
 
         // act: scroll compose side
-        rule.onNodeWithTag(MainListTestTag).performTouchInput {
-            swipeUp()
-        }
+        rule.onNodeWithTag(MainListTestTag).performTouchInput { swipeUp() }
 
         // assert: compose list is scrolled
         rule.onNodeWithTag(topItemTag).assertDoesNotExist()
@@ -240,8 +230,8 @@
         rule.runOnIdle {
             val appBarScrollDeltaPixels = appBarScrollDelta.value * rule.density.density * -1
             val offeredToParent = nestedScrollParentView.offeredToParentOffset.y
-            val availableToParent = deltaCollectorNestedScrollConnection.offeredFromChild.y +
-                appBarScrollDeltaPixels
+            val availableToParent =
+                deltaCollectorNestedScrollConnection.offeredFromChild.y + appBarScrollDeltaPixels
             assertThat(offeredToParent - availableToParent).isAtMost(ScrollRoundingErrorTolerance)
         }
     }
@@ -298,9 +288,8 @@
         val velocityAvailableInCompose =
             abs(deltaCollectorNestedScrollConnection.velocityOfferedFromChild.y)
         rule.runOnIdle {
-            assertThat(velocityOfferedInView - velocityAvailableInCompose).isEqualTo(
-                VelocityRoundingErrorTolerance
-            )
+            assertThat(velocityOfferedInView - velocityAvailableInCompose)
+                .isEqualTo(VelocityRoundingErrorTolerance)
         }
     }
 
@@ -328,9 +317,8 @@
         val velocityConsumedByChildren =
             abs(deltaCollectorNestedScrollConnection.velocityConsumedDownChain.y)
         rule.runOnIdle {
-            assertThat(abs(velocityUnconsumedOffset - velocityConsumedByChildren)).isAtMost(
-                VelocityRoundingErrorTolerance
-            )
+            assertThat(abs(velocityUnconsumedOffset - velocityConsumedByChildren))
+                .isAtMost(VelocityRoundingErrorTolerance)
         }
     }
 
@@ -339,14 +327,11 @@
         enableInterop: Boolean = true,
         content: @Composable () -> Unit
     ) {
-        rule
-            .activityRule
-            .scenario
-            .createActivityWithComposeContent(
-                layout = R.layout.test_nested_scroll_coordinator_layout,
-                enableInterop = enableInterop,
-                content = content
-            )
+        rule.activityRule.scenario.createActivityWithComposeContent(
+            layout = R.layout.test_nested_scroll_coordinator_layout,
+            enableInterop = enableInterop,
+            content = content
+        )
     }
 }
 
@@ -357,20 +342,15 @@
 @Composable
 private fun TestListWithNestedScroll(items: List<String>, modifier: Modifier = Modifier) {
     Box(modifier) {
-        LazyColumn(Modifier.testTag(MainListTestTag)) {
-            items(items) { TestItem(it) }
-        }
+        LazyColumn(Modifier.testTag(MainListTestTag)) { items(items) { TestItem(it) } }
     }
 }
 
 @Composable
 private fun TestItem(item: String) {
     Box(
-        modifier = Modifier
-            .padding(16.dp)
-            .height(56.dp)
-            .fillMaxWidth()
-            .testTag(item), contentAlignment = Alignment.Center
+        modifier = Modifier.padding(16.dp).height(56.dp).fillMaxWidth().testTag(item),
+        contentAlignment = Alignment.Center
     ) {
         BasicText(item)
     }
diff --git a/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/viewinterop/NestedScrollInteropTestHelper.kt b/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/viewinterop/NestedScrollInteropTestHelper.kt
index 6122079..bdcd0fe 100644
--- a/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/viewinterop/NestedScrollInteropTestHelper.kt
+++ b/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/viewinterop/NestedScrollInteropTestHelper.kt
@@ -61,17 +61,11 @@
 internal class NestedScrollInteropAdapter :
     RecyclerView.Adapter<NestedScrollInteropAdapter.SimpleTextViewHolder>() {
     val items = (1..200).map { it.toString() }
-    override fun onCreateViewHolder(
-        parent: ViewGroup,
-        viewType: Int
-    ): SimpleTextViewHolder {
+
+    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): SimpleTextViewHolder {
         return SimpleTextViewHolder(
             LayoutInflater.from(parent.context)
-                .inflate(
-                    R.layout.android_in_compose_nested_scroll_interop_list_item,
-                    parent,
-                    false
-                )
+                .inflate(R.layout.android_in_compose_nested_scroll_interop_list_item, parent, false)
         )
     }
 
@@ -132,10 +126,8 @@
     }
 }
 
-internal class TestNestedScrollParentView(
-    context: Context,
-    attrs: AttributeSet
-) : CoordinatorLayout(context, attrs) {
+internal class TestNestedScrollParentView(context: Context, attrs: AttributeSet) :
+    CoordinatorLayout(context, attrs) {
 
     private val unconsumed = IntArray(2)
     val unconsumedOffset: Offset
@@ -237,6 +229,7 @@
 
     val deltaConsumed
         get() = consumedByRecyclerView.toOffset()
+
     val velocityConsumed
         get() = velocityConsumedByRecyclerView.toComposeVelocity()
 
@@ -257,10 +250,7 @@
 }
 
 @Composable
-internal fun NestedScrollInteropTestApp(
-    modifier: Modifier = Modifier,
-    content: (Context) -> View
-) {
+internal fun NestedScrollInteropTestApp(modifier: Modifier = Modifier, content: (Context) -> View) {
     Box(modifier.fillMaxSize().testTag(OuterBoxLayout)) {
         AndroidView(content, modifier = Modifier.testTag(AndroidViewContainer))
     }
@@ -281,30 +271,24 @@
             .apply {
                 with(findViewById<ComposeView>(R.id.compose_view)) {
                     setContent {
-                        Box(modifier = outerModifier) {
-                            ComposeInViewWithNestedScrollInterop()
-                        }
+                        Box(modifier = outerModifier) { ComposeInViewWithNestedScrollInterop() }
                     }
                 }
-            }.also {
-                ViewCompat.setNestedScrollingEnabled(it, enabled)
             }
+            .also { ViewCompat.setNestedScrollingEnabled(it, enabled) }
     }
 }
 
 @Composable
 internal fun ComposeInViewWithNestedScrollInterop() {
     LazyColumn(
-        modifier = Modifier.nestedScroll(rememberNestedScrollInteropConnection())
-            .testTag(MainTestList)
+        modifier =
+            Modifier.nestedScroll(rememberNestedScrollInteropConnection()).testTag(MainTestList)
     ) {
         items(200) { item ->
             Box(
-                modifier = Modifier
-                    .padding(16.dp)
-                    .height(56.dp)
-                    .fillMaxWidth()
-                    .background(Color.Gray),
+                modifier =
+                    Modifier.padding(16.dp).height(56.dp).fillMaxWidth().background(Color.Gray),
                 contentAlignment = Alignment.Center
             ) {
                 Text(item.toString())
@@ -325,28 +309,24 @@
             .inflate(R.layout.android_in_compose_nested_scroll_interop, null)
             .apply {
                 with(findViewById<RecyclerView>(R.id.main_list)) {
-                    layoutManager = LinearLayoutManager(
-                        context,
-                        RecyclerView.VERTICAL,
-                        false
-                    )
+                    layoutManager = LinearLayoutManager(context, RecyclerView.VERTICAL, false)
                     adapter = NestedScrollInteropAdapter()
                     setOnScrollChangeListener { _, _, _, oldX, oldY ->
                         recyclerViewConsumptionTracker.trackDeltaConsumption(oldX, oldY)
                     }
-                    onFlingListener = object : RecyclerView.OnFlingListener() {
-                        override fun onFling(velocityX: Int, velocityY: Int): Boolean {
-                            recyclerViewConsumptionTracker.trackVelocityConsumed(
-                                velocityX,
-                                velocityY
-                            )
-                            return false
+                    onFlingListener =
+                        object : RecyclerView.OnFlingListener() {
+                            override fun onFling(velocityX: Int, velocityY: Int): Boolean {
+                                recyclerViewConsumptionTracker.trackVelocityConsumed(
+                                    velocityX,
+                                    velocityY
+                                )
+                                return false
+                            }
                         }
-                    }
                 }
-            }.also {
-                ViewCompat.setNestedScrollingEnabled(it, enabled)
             }
+            .also { ViewCompat.setNestedScrollingEnabled(it, enabled) }
     }
 }
 
@@ -361,12 +341,11 @@
         activity.setContentView(layout)
         with(activity.findViewById<ComposeView>(R.id.compose_view)) {
             setContent {
-                val nestedScrollInterop = if (enableInterop) modifier.nestedScroll(
-                    rememberNestedScrollInteropConnection()
-                ) else modifier
-                Box(nestedScrollInterop) {
-                    content()
-                }
+                val nestedScrollInterop =
+                    if (enableInterop)
+                        modifier.nestedScroll(rememberNestedScrollInteropConnection())
+                    else modifier
+                Box(nestedScrollInterop) { content() }
             }
         }
     }
@@ -375,22 +354,20 @@
 
 @Composable
 internal fun RecyclerViewAndroidView(interopEnabled: Boolean) {
-    AndroidView(factory = { context ->
-        LayoutInflater.from(context)
-            .inflate(R.layout.android_in_compose_nested_scroll_interop, null)
-            .apply {
-                with(findViewById<RecyclerView>(R.id.main_list)) {
-                    layoutManager = LinearLayoutManager(
-                        context,
-                        RecyclerView.VERTICAL,
-                        false
-                    )
-                    adapter = NestedScrollInteropAdapter()
+    AndroidView(
+        factory = { context ->
+            LayoutInflater.from(context)
+                .inflate(R.layout.android_in_compose_nested_scroll_interop, null)
+                .apply {
+                    with(findViewById<RecyclerView>(R.id.main_list)) {
+                        layoutManager = LinearLayoutManager(context, RecyclerView.VERTICAL, false)
+                        adapter = NestedScrollInteropAdapter()
+                    }
                 }
-            }.also {
-                ViewCompat.setNestedScrollingEnabled(it, interopEnabled)
-            }
-    }, modifier = Modifier.testTag(AndroidViewContainer))
+                .also { ViewCompat.setNestedScrollingEnabled(it, interopEnabled) }
+        },
+        modifier = Modifier.testTag(AndroidViewContainer)
+    )
 }
 
 private fun IntArray.toOffset() = Offset(this[0].toFloat(), this[1].toFloat())
@@ -408,7 +385,5 @@
     return Velocity(this[0] * -1f, this[1] * -1f)
 }
 
-internal fun abs(velocity: Velocity) = Velocity(
-    kotlin.math.abs(velocity.x),
-    kotlin.math.abs(velocity.y)
-)
+internal fun abs(velocity: Velocity) =
+    Velocity(kotlin.math.abs(velocity.x), kotlin.math.abs(velocity.y))
diff --git a/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/viewinterop/NestedScrollInteropThreeFoldTest.kt b/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/viewinterop/NestedScrollInteropThreeFoldTest.kt
index 9f23cb0..6a99078 100644
--- a/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/viewinterop/NestedScrollInteropThreeFoldTest.kt
+++ b/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/viewinterop/NestedScrollInteropThreeFoldTest.kt
@@ -47,8 +47,7 @@
 @RunWith(AndroidJUnit4::class)
 class NestedScrollInteropThreeFoldTest {
 
-    @get:Rule
-    val rule = createAndroidComposeRule<ComponentActivity>()
+    @get:Rule val rule = createAndroidComposeRule<ComponentActivity>()
 
     private val nestedScrollParentView by lazy {
         rule.activity.findViewById<TestNestedScrollParentView>(R.id.main_layout)
@@ -70,21 +69,14 @@
     fun nestedScrollInteropIsOff_CVC_shouldNotPropagateCorrectly() {
         // arrange
         rule.setContent {
-            NestedScrollDeepNested(
-                modifier = Modifier.nestedScroll(connection),
-                enabled = false
-            )
+            NestedScrollDeepNested(modifier = Modifier.nestedScroll(connection), enabled = false)
         }
 
         // act
-        rule.onNodeWithTag(MainTestList).performTouchInput {
-            swipeUp()
-        }
+        rule.onNodeWithTag(MainTestList).performTouchInput { swipeUp() }
 
         // assert
-        rule.runOnIdle {
-            assertThat(connection.offeredFromChild).isEqualTo(Offset.Zero)
-        }
+        rule.runOnIdle { assertThat(connection.offeredFromChild).isEqualTo(Offset.Zero) }
     }
 
     @Test
@@ -98,35 +90,24 @@
         }
 
         // act
-        rule.onNodeWithTag(AndroidViewContainer).performTouchInput {
-            swipeUp()
-        }
+        rule.onNodeWithTag(AndroidViewContainer).performTouchInput { swipeUp() }
 
         // assert
-        rule.runOnIdle {
-            assertThat(connection.offeredFromChild).isEqualTo(Offset.Zero)
-        }
+        rule.runOnIdle { assertThat(connection.offeredFromChild).isEqualTo(Offset.Zero) }
     }
 
     @Test
     fun nestedScrollInteropIsOn_CVC_shouldPropagateCorrectly() {
         // arrange
         rule.setContent {
-            NestedScrollDeepNested(
-                modifier = Modifier.nestedScroll(connection),
-                enabled = true
-            )
+            NestedScrollDeepNested(modifier = Modifier.nestedScroll(connection), enabled = true)
         }
 
         // act
-        rule.onNodeWithTag(MainTestList).performTouchInput {
-            swipeUp()
-        }
+        rule.onNodeWithTag(MainTestList).performTouchInput { swipeUp() }
 
         // assert
-        rule.runOnIdle {
-            assertThat(connection.offeredFromChild).isNotEqualTo(Offset.Zero)
-        }
+        rule.runOnIdle { assertThat(connection.offeredFromChild).isNotEqualTo(Offset.Zero) }
     }
 
     @Test
@@ -140,14 +121,10 @@
         }
 
         // act
-        rule.onNodeWithTag(AndroidViewContainer).performTouchInput {
-            swipeUp()
-        }
+        rule.onNodeWithTag(AndroidViewContainer).performTouchInput { swipeUp() }
 
         // assert
-        rule.runOnIdle {
-            assertThat(connection.offeredFromChild).isNotEqualTo(Offset.Zero)
-        }
+        rule.runOnIdle { assertThat(connection.offeredFromChild).isNotEqualTo(Offset.Zero) }
     }
 
     @Test
@@ -162,9 +139,7 @@
         }
 
         // act
-        rule.onNodeWithTag(MainTestList).performTouchInput {
-            swipeUp()
-        }
+        rule.onNodeWithTag(MainTestList).performTouchInput { swipeUp() }
 
         // assert
         rule.runOnIdle {
@@ -184,15 +159,12 @@
         }
 
         // act
-        rule.onNodeWithTag(AndroidViewContainer).performTouchInput {
-            swipeUp()
-        }
+        rule.onNodeWithTag(AndroidViewContainer).performTouchInput { swipeUp() }
 
         // assert
         rule.waitForIdle()
         assertThat(allConsumingConnection.offeredFromChild).isNotEqualTo(Offset.Zero)
-        onView(withId(R.id.fab))
-            .check(matches((isDisplayed())))
+        onView(withId(R.id.fab)).check(matches((isDisplayed())))
     }
 
     @Test
@@ -201,17 +173,14 @@
         val secondaryInspectableConnection = InspectableNestedScrollConnection()
         rule.setContent {
             NestedScrollDeepNested(
-                modifier = Modifier
-                    .nestedScroll(secondaryInspectableConnection),
+                modifier = Modifier.nestedScroll(secondaryInspectableConnection),
                 enabled = true,
                 connection = connection
             )
         }
 
         // act
-        rule.onNodeWithTag(MainTestList).performTouchInput {
-            swipeUp()
-        }
+        rule.onNodeWithTag(MainTestList).performTouchInput { swipeUp() }
 
         // assert
         rule.runOnIdle {
@@ -226,23 +195,21 @@
         val secondaryInspectableConnection = InspectableNestedScrollConnection()
         rule.setContent {
             NestedScrollDeepNested(
-                modifier = Modifier
-                    .nestedScroll(secondaryInspectableConnection),
+                modifier = Modifier.nestedScroll(secondaryInspectableConnection),
                 enabled = true,
                 connection = connection
             )
         }
 
         // act
-        rule.onNodeWithTag(MainTestList).performTouchInput {
-            swipeUp()
-        }
+        rule.onNodeWithTag(MainTestList).performTouchInput { swipeUp() }
 
         // assert
         rule.runOnIdle {
-            assertThat(secondaryInspectableConnection.velocityOfferedFromChild).isEqualTo(
-                connection.velocityConsumedDownChain + connection.velocityNotConsumedByChild
-            )
+            assertThat(secondaryInspectableConnection.velocityOfferedFromChild)
+                .isEqualTo(
+                    connection.velocityConsumedDownChain + connection.velocityNotConsumedByChild
+                )
         }
     }
 
@@ -257,15 +224,12 @@
         }
 
         // act
-        rule.onNodeWithTag(AndroidViewContainer).performTouchInput {
-            swipeUp()
-        }
+        rule.onNodeWithTag(AndroidViewContainer).performTouchInput { swipeUp() }
 
         // assert
         rule.runOnIdle {
-            assertThat(abs(nestedScrollParentView.velocityOfferedToParentOffset)).isEqualTo(
-                abs(connection.velocityConsumedDownChain)
-            )
+            assertThat(abs(nestedScrollParentView.velocityOfferedToParentOffset))
+                .isEqualTo(abs(connection.velocityConsumedDownChain))
         }
     }
 
@@ -275,14 +239,11 @@
         outerModifier: Modifier = Modifier,
         content: @Composable () -> Unit
     ) {
-        rule
-            .activityRule
-            .scenario
-            .createActivityWithComposeContent(
-                layout = R.layout.test_nested_scroll_coordinator_layout,
-                enableInterop = enableInterop,
-                content = content,
-                modifier = outerModifier
-            )
+        rule.activityRule.scenario.createActivityWithComposeContent(
+            layout = R.layout.test_nested_scroll_coordinator_layout,
+            enableInterop = enableInterop,
+            content = content,
+            modifier = outerModifier
+        )
     }
 }
diff --git a/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/viewinterop/NestedScrollInteropViewHolderTest.kt b/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/viewinterop/NestedScrollInteropViewHolderTest.kt
index 9f35c31..09b9198 100644
--- a/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/viewinterop/NestedScrollInteropViewHolderTest.kt
+++ b/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/viewinterop/NestedScrollInteropViewHolderTest.kt
@@ -45,8 +45,7 @@
 @SdkSuppress(minSdkVersion = Build.VERSION_CODES.M)
 @RunWith(AndroidJUnit4::class)
 class NestedScrollInteropViewHolderTest {
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
     private val connection = InspectableNestedScrollConnection()
     private val recyclerViewConsumptionTracker = RecyclerViewConsumptionTracker()
@@ -69,14 +68,11 @@
         }
 
         // act
-        onView(withId(R.id.main_list)).perform(
-            scrollToPosition<NestedScrollInteropAdapter.SimpleTextViewHolder>(20)
-        )
+        onView(withId(R.id.main_list))
+            .perform(scrollToPosition<NestedScrollInteropAdapter.SimpleTextViewHolder>(20))
 
         // assert
-        rule.runOnIdle {
-            assertThat(connection.offeredFromChild).isEqualTo(Offset.Zero)
-        }
+        rule.runOnIdle { assertThat(connection.offeredFromChild).isEqualTo(Offset.Zero) }
     }
 
     @Test
@@ -94,9 +90,7 @@
         onView(withId(R.id.main_layout)).perform(swipeUp())
 
         // assert
-        rule.runOnIdle {
-            assertThat(connection.offeredFromChild).isNotEqualTo(Offset.Zero)
-        }
+        rule.runOnIdle { assertThat(connection.offeredFromChild).isNotEqualTo(Offset.Zero) }
     }
 
     @Test
@@ -158,9 +152,7 @@
         }
 
         // act
-        Espresso.onView(withId(R.id.main_list)).perform(
-            swipeUp()
-        )
+        Espresso.onView(withId(R.id.main_list)).perform(swipeUp())
 
         // assert
         rule.runOnIdle {
diff --git a/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/viewinterop/PoolingContainerComposeTest.kt b/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/viewinterop/PoolingContainerComposeTest.kt
index 5385d1d..d09ba78 100644
--- a/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/viewinterop/PoolingContainerComposeTest.kt
+++ b/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/viewinterop/PoolingContainerComposeTest.kt
@@ -37,9 +37,7 @@
 @MediumTest
 @RunWith(AndroidJUnit4::class)
 class PoolingContainerComposeTest {
-    @Rule
-    @JvmField
-    var activityRule = ActivityScenarioRule(ComponentActivity::class.java)
+    @Rule @JvmField var activityRule = ActivityScenarioRule(ComponentActivity::class.java)
 
     @Test
     fun addToLifecycleContainer_removeFromLifecycleContainer_addToOtherContainer_thenRemove() {
@@ -141,12 +139,14 @@
             activity.setContentView(R.layout.pooling_container_compose_test)
             val lifecycleContainer: ViewGroup = activity.findViewById(R.id.lifecycleContainer)
             val composeView = DisposalCountingComposeView(activity)
-            composeView.setViewCompositionStrategy(object : ViewCompositionStrategy {
-                override fun installFor(view: AbstractComposeView): () -> Unit {
-                    // do nothing
-                    return {}
+            composeView.setViewCompositionStrategy(
+                object : ViewCompositionStrategy {
+                    override fun installFor(view: AbstractComposeView): () -> Unit {
+                        // do nothing
+                        return {}
+                    }
                 }
-            })
+            )
 
             lifecycleContainer.isPoolingContainer = true
 
@@ -175,9 +175,7 @@
         override fun Content() {
             DisposableEffect(true) {
                 compositions++
-                onDispose {
-                    disposals++
-                }
+                onDispose { disposals++ }
             }
         }
     }
diff --git a/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/viewinterop/VelocityTrackingListParityTest.kt b/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/viewinterop/VelocityTrackingListParityTest.kt
index aa834f1..e3dcf8d 100644
--- a/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/viewinterop/VelocityTrackingListParityTest.kt
+++ b/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/viewinterop/VelocityTrackingListParityTest.kt
@@ -64,8 +64,7 @@
 @RunWith(AndroidJUnit4::class)
 class VelocityTrackingListParityTest {
 
-    @get:Rule
-    val rule = createAndroidComposeRule<ComponentActivity>()
+    @get:Rule val rule = createAndroidComposeRule<ComponentActivity>()
 
     private var layoutManager: LinearLayoutManager? = null
     private var latestComposeVelocity = 0f
@@ -113,8 +112,8 @@
         rule.runOnIdle {
             val currentTopInCompose = state.firstVisibleItemIndex
             val diff = (currentTopInCompose - childAtTheTopOfView).absoluteValue
-            val message = "Compose=$currentTopInCompose View=$childAtTheTopOfView " +
-                "Difference was=$diff"
+            val message =
+                "Compose=$currentTopInCompose View=$childAtTheTopOfView " + "Difference was=$diff"
             assertTrue(message) { diff <= ItemDifferenceThreshold }
         }
     }
@@ -155,8 +154,8 @@
         rule.runOnIdle {
             val currentTopInCompose = state.firstVisibleItemIndex
             val diff = (currentTopInCompose - childAtTheTopOfView).absoluteValue
-            val message = "Compose=$currentTopInCompose View=$childAtTheTopOfView " +
-                "Difference was=$diff"
+            val message =
+                "Compose=$currentTopInCompose View=$childAtTheTopOfView " + "Difference was=$diff"
             assertTrue(message) { diff <= ItemDifferenceThreshold }
         }
     }
@@ -197,8 +196,8 @@
         rule.runOnIdle {
             val currentTopInCompose = state.firstVisibleItemIndex
             val diff = (currentTopInCompose - childAtTheTopOfView).absoluteValue
-            val message = "Compose=$currentTopInCompose View=$childAtTheTopOfView " +
-                "Difference was=$diff"
+            val message =
+                "Compose=$currentTopInCompose View=$childAtTheTopOfView " + "Difference was=$diff"
             assertTrue(message) { diff <= ItemDifferenceThreshold }
         }
     }
@@ -239,8 +238,8 @@
         rule.runOnIdle {
             val currentTopInCompose = state.firstVisibleItemIndex
             val diff = (currentTopInCompose - childAtTheTopOfView).absoluteValue
-            val message = "Compose=$currentTopInCompose View=$childAtTheTopOfView " +
-                "Difference was=$diff"
+            val message =
+                "Compose=$currentTopInCompose View=$childAtTheTopOfView " + "Difference was=$diff"
             assertTrue(message) { diff <= ItemDifferenceThreshold }
         }
     }
@@ -281,8 +280,8 @@
         rule.runOnIdle {
             val currentTopInCompose = state.firstVisibleItemIndex
             val diff = (currentTopInCompose - childAtTheTopOfView).absoluteValue
-            val message = "Compose=$currentTopInCompose View=$childAtTheTopOfView " +
-                "Difference was=$diff"
+            val message =
+                "Compose=$currentTopInCompose View=$childAtTheTopOfView " + "Difference was=$diff"
             assertTrue(message) { diff <= ItemDifferenceThreshold }
         }
     }
@@ -323,21 +322,18 @@
         rule.runOnIdle {
             val currentTopInCompose = state.firstVisibleItemIndex
             val diff = (currentTopInCompose - childAtTheTopOfView).absoluteValue
-            val message = "Compose=$currentTopInCompose View=$childAtTheTopOfView " +
-                "Difference was=$diff"
+            val message =
+                "Compose=$currentTopInCompose View=$childAtTheTopOfView " + "Difference was=$diff"
             assertTrue(message) { diff <= ItemDifferenceThreshold }
         }
     }
 
     private fun createActivity(state: LazyListState) {
-        rule
-            .activityRule
-            .scenario
-            .createActivityWithComposeContent(R.layout.android_compose_lists_fling) {
-                TestComposeList(
-                    state
-                )
-            }
+        rule.activityRule.scenario.createActivityWithComposeContent(
+            R.layout.android_compose_lists_fling
+        ) {
+            TestComposeList(state)
+        }
     }
 
     private fun ActivityScenario<*>.createActivityWithComposeContent(
@@ -347,9 +343,7 @@
         onActivity { activity ->
             activity.setTheme(R.style.Theme_MaterialComponents_Light)
             activity.setContentView(layout)
-            with(activity.findViewById<ComposeView>(R.id.compose_view)) {
-                setContent(content)
-            }
+            with(activity.findViewById<ComposeView>(R.id.compose_view)) { setContent(content) }
 
             activity.findViewById<RecyclerView>(R.id.view_list)?.let {
                 it.adapter = ListAdapter()
@@ -357,11 +351,16 @@
                     LinearLayoutManager(activity, LinearLayoutManager.VERTICAL, false).also {
                         this@VelocityTrackingListParityTest.layoutManager = it
                     }
-                it.addOnScrollListener(object : OnScrollListener() {
-                    override fun onScrollStateChanged(recyclerView: RecyclerView, newState: Int) {
-                        latestRVState = newState
+                it.addOnScrollListener(
+                    object : OnScrollListener() {
+                        override fun onScrollStateChanged(
+                            recyclerView: RecyclerView,
+                            newState: Int
+                        ) {
+                            latestRVState = newState
+                        }
                     }
-                })
+                )
             }
 
             activity.findViewById<ComposeView>(R.id.compose_view).visibility = View.GONE
@@ -375,9 +374,7 @@
     private fun composeView(): ComposeView = rule.activity.findViewById(R.id.compose_view)
 
     private fun checkVisibility(view: View, visibility: Int) {
-        assertTrue {
-            view.visibility == visibility
-        }
+        assertTrue { view.visibility == visibility }
     }
 }
 
@@ -385,12 +382,7 @@
 fun TestComposeList(state: LazyListState) {
     LazyColumn(Modifier.fillMaxSize(), state = state) {
         items(1000) {
-            Box(
-                modifier = Modifier
-                    .fillMaxWidth()
-                    .height(64.dp)
-                    .background(Color.Black)
-            ) {
+            Box(modifier = Modifier.fillMaxWidth().height(64.dp).background(Color.Black)) {
                 Text(text = it.toString(), color = Color.White)
             }
         }
@@ -399,6 +391,7 @@
 
 private class ListAdapter : RecyclerView.Adapter<ListViewHolder>() {
     val items = (0 until 1000).map { it.toString() }
+
     override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ListViewHolder {
         return ListViewHolder(
             LayoutInflater.from(parent.context)
@@ -434,13 +427,14 @@
     val rv = this
     withContext(Dispatchers.Main) {
         suspendCancellableCoroutine<Unit> { continuation ->
-            val listener = object : OnScrollListener() {
-                override fun onScrollStateChanged(recyclerView: RecyclerView, newState: Int) {
-                    if (newState == RecyclerView.SCROLL_STATE_IDLE) {
-                        continuation.resume(Unit)
+            val listener =
+                object : OnScrollListener() {
+                    override fun onScrollStateChanged(recyclerView: RecyclerView, newState: Int) {
+                        if (newState == RecyclerView.SCROLL_STATE_IDLE) {
+                            continuation.resume(Unit)
+                        }
                     }
                 }
-            }
 
             rv.addOnScrollListener(listener)
 
diff --git a/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/viewinterop/VelocityTrackingParityTest.kt b/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/viewinterop/VelocityTrackingParityTest.kt
index 0ac8510..8bb202b 100644
--- a/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/viewinterop/VelocityTrackingParityTest.kt
+++ b/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/viewinterop/VelocityTrackingParityTest.kt
@@ -80,8 +80,7 @@
 @RunWith(AndroidJUnit4::class)
 class VelocityTrackingParityTest {
 
-    @get:Rule
-    val rule = createAndroidComposeRule<ComponentActivity>()
+    @get:Rule val rule = createAndroidComposeRule<ComponentActivity>()
 
     private val draggableView: VelocityTrackingView
         get() = rule.activity.findViewById(R.id.draggable_view)
@@ -306,16 +305,11 @@
     }
 
     private fun createActivity(twoDimensional: Boolean = false) {
-        rule
-            .activityRule
-            .scenario
-            .createActivityWithComposeContent(
-                R.layout.velocity_tracker_compose_vs_view
-            ) {
-                TestComposeDraggable(twoDimensional) {
-                    latestComposeVelocity = it
-                }
-            }
+        rule.activityRule.scenario.createActivityWithComposeContent(
+            R.layout.velocity_tracker_compose_vs_view
+        ) {
+            TestComposeDraggable(twoDimensional) { latestComposeVelocity = it }
+        }
     }
 
     private fun checkVisibility(view: View, visibility: Int) = assertTrue {
@@ -403,10 +397,7 @@
     start: CoordinatesProvider,
     end: CoordinatesProvider
 ): GeneralSwipeAction {
-    return GeneralSwipeAction(
-        swiper, start, end,
-        Press.FINGER
-    )
+    return GeneralSwipeAction(swiper, start, end, Press.FINGER)
 }
 
 @Composable
@@ -414,20 +405,21 @@
     twoDimensional: Boolean = false,
     onDragStopped: (velocity: Velocity) -> Unit
 ) {
-    val viewConfiguration = object : ViewConfiguration by LocalViewConfiguration.current {
-        override val maximumFlingVelocity: Float get() = Float.MAX_VALUE // unlimited
-    }
+    val viewConfiguration =
+        object : ViewConfiguration by LocalViewConfiguration.current {
+            override val maximumFlingVelocity: Float
+                get() = Float.MAX_VALUE // unlimited
+        }
     CompositionLocalProvider(LocalViewConfiguration provides viewConfiguration) {
         Box(
-            Modifier
-                .fillMaxSize()
+            Modifier.fillMaxSize()
                 .background(Color.Black)
                 .then(
                     if (twoDimensional) {
                         Modifier.draggable2D(onDragStopped)
                     } else {
                         Modifier.draggable(
-                            rememberDraggableState(onDelta = { }),
+                            rememberDraggableState(onDelta = {}),
                             onDragStopped = { onDragStopped.invoke(Velocity(0.0f, it)) },
                             orientation = Orientation.Vertical
                         )
@@ -443,10 +435,7 @@
             awaitEachGesture {
                 val tracker = androidx.compose.ui.input.pointer.util.VelocityTracker()
                 val initialDown =
-                    awaitFirstDown(
-                        requireUnconsumed = false,
-                        pass = PointerEventPass.Initial
-                    )
+                    awaitFirstDown(requireUnconsumed = false, pass = PointerEventPass.Initial)
                 tracker.addPointerInputChange(initialDown)
 
                 awaitTouchSlopOrCancellation(initialDown.id) { change, _ ->
@@ -454,17 +443,14 @@
                     change.consume()
                 }
 
-                val lastEvent = awaitDragOrUp(initialDown.id) {
-                    tracker.addPointerInputChange(it)
-                    it.consume()
-                    it.positionChangedIgnoreConsumed()
-                }
-                lastEvent?.let {
-                    tracker.addPointerInputChange(it)
-                }
-                onDragStopped(
-                    tracker.calculateVelocity()
-                )
+                val lastEvent =
+                    awaitDragOrUp(initialDown.id) {
+                        tracker.addPointerInputChange(it)
+                        it.consume()
+                        it.positionChangedIgnoreConsumed()
+                    }
+                lastEvent?.let { tracker.addPointerInputChange(it) }
+                onDragStopped(tracker.calculateVelocity())
             }
         }
     }
@@ -481,20 +467,18 @@
             visibility = View.GONE
         }
 
-        activity.findViewById<VelocityTrackingView>(R.id.draggable_view)?.visibility =
-            View.VISIBLE
+        activity.findViewById<VelocityTrackingView>(R.id.draggable_view)?.visibility = View.VISIBLE
     }
     moveToState(Lifecycle.State.RESUMED)
 }
 
-/**
- * A view that adds data to a VelocityTracker.
- */
+/** A view that adds data to a VelocityTracker. */
 private class VelocityTrackingView(context: Context, attributeSet: AttributeSet) :
     View(context, attributeSet) {
     private val tracker = VelocityTracker.obtain()
     var latestVelocity: Velocity = Velocity.Zero
     val motionEvents = mutableListOf<MotionEvent?>()
+
     override fun onTouchEvent(event: MotionEvent?): Boolean {
         motionEvents.add(MotionEvent.obtain(event))
         when (event?.action) {
@@ -503,11 +487,8 @@
                 latestVelocity = Velocity(tracker.xVelocity, tracker.yVelocity)
                 tracker.clear()
             }
-
-            MotionEvent.ACTION_DOWN, MotionEvent.ACTION_MOVE -> tracker.addMovement(
-                event
-            )
-
+            MotionEvent.ACTION_DOWN,
+            MotionEvent.ACTION_MOVE -> tracker.addMovement(event)
             else -> {
                 tracker.clear()
                 latestVelocity = Velocity.Zero
@@ -521,9 +502,7 @@
     }
 }
 
-/**
- * Checks the contents of [events] represents a swipe gesture.
- */
+/** Checks the contents of [events] represents a swipe gesture. */
 internal fun isValidGesture(events: List<MotionEvent>): Boolean {
     val down = events.filter { it.action == MotionEvent.ACTION_DOWN }
     val move = events.filter { it.action == MotionEvent.ACTION_MOVE }
@@ -534,9 +513,7 @@
 // 1% tolerance
 private const val VelocityDifferenceTolerance = 0.1f
 
-/**
- * Copied from androidx.test.espresso.action.Swipe
- */
+/** Copied from androidx.test.espresso.action.Swipe */
 internal data class SwiperWithTime(val gestureDurationMs: Int) : Swiper {
     override fun sendSwipe(
         uiController: UiController,
@@ -579,11 +556,7 @@
     private fun interpolate(start: FloatArray, end: FloatArray, steps: Int): Array<FloatArray> {
         checkElementIndex(1, start.size)
         checkElementIndex(1, end.size)
-        val res = Array(steps) {
-            FloatArray(
-                2
-            )
-        }
+        val res = Array(steps) { FloatArray(2) }
         for (i in 1 until steps + 1) {
             res[i - 1][0] = start[0] + (end[0] - start[0]) * i / (steps + 2f)
             res[i - 1][1] = start[1] + (end[1] - start[1]) * i / (steps + 2f)
diff --git a/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/window/DialogScreenshotTest.kt b/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/window/DialogScreenshotTest.kt
index 8fbb979..06616e45 100644
--- a/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/window/DialogScreenshotTest.kt
+++ b/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/window/DialogScreenshotTest.kt
@@ -44,26 +44,24 @@
 @SdkSuppress(minSdkVersion = Build.VERSION_CODES.O)
 class DialogScreenshotTest {
 
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
-    @get:Rule
-    val screenshotRule = AndroidXScreenshotTestRule(GOLDEN_UI)
+    @get:Rule val screenshotRule = AndroidXScreenshotTestRule(GOLDEN_UI)
 
     @Test
     fun dialogWithNoElevation() {
         rule.setContent {
             Dialog(onDismissRequest = {}) {
                 Box(
-                    Modifier
-                        .graphicsLayer(shape = RoundedCornerShape(percent = 15), clip = true)
+                    Modifier.graphicsLayer(shape = RoundedCornerShape(percent = 15), clip = true)
                         .size(200.dp)
                         .background(Color(0xFFA896B0))
                 )
             }
         }
 
-        rule.onNode(isDialog())
+        rule
+            .onNode(isDialog())
             .captureToImage()
             .assertAgainstGolden(screenshotRule, "dialogWithNoElevation")
     }
@@ -74,8 +72,7 @@
             Dialog(onDismissRequest = {}) {
                 val elevation = with(LocalDensity.current) { 8.dp.toPx() }
                 Box(
-                    Modifier
-                        .graphicsLayer(
+                    Modifier.graphicsLayer(
                             shadowElevation = elevation,
                             shape = RoundedCornerShape(percent = 15),
                             clip = true
@@ -86,7 +83,8 @@
             }
         }
 
-        rule.onNode(isDialog())
+        rule
+            .onNode(isDialog())
             .captureToImage()
             .assertAgainstGolden(
                 screenshotRule,
diff --git a/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/window/DialogSecureFlagTest.kt b/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/window/DialogSecureFlagTest.kt
index 01dd14d..9474e56 100644
--- a/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/window/DialogSecureFlagTest.kt
+++ b/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/window/DialogSecureFlagTest.kt
@@ -46,19 +46,18 @@
     }
 
     @get:Rule
-    val rule = createAndroidComposeRule(
-        if (setSecureFlagOnActivity) {
-            ActivityWithFlagSecure::class.java
-        } else {
-            ComponentActivity::class.java
-        }
-    )
+    val rule =
+        createAndroidComposeRule(
+            if (setSecureFlagOnActivity) {
+                ActivityWithFlagSecure::class.java
+            } else {
+                ComponentActivity::class.java
+            }
+        )
 
     @Test
     fun noFlagSetOnDialog() {
-        rule.setContent {
-            TestDialog(DialogProperties())
-        }
+        rule.setContent { TestDialog(DialogProperties()) }
 
         if (setSecureFlagOnActivity) {
             // Flag was inherited from the Activity
@@ -71,9 +70,7 @@
 
     @Test
     fun forcedFlagOnDialogToDisabled() {
-        rule.setContent {
-            TestDialog(DialogProperties(securePolicy = SecureFlagPolicy.SecureOff))
-        }
+        rule.setContent { TestDialog(DialogProperties(securePolicy = SecureFlagPolicy.SecureOff)) }
 
         // This tests that we also override the flag from the Activity
         assertThat(isSecureFlagEnabledForDialog()).isFalse()
@@ -81,21 +78,17 @@
 
     @Test
     fun forcedFlagOnDialogToEnabled() {
-        rule.setContent {
-            TestDialog(DialogProperties(securePolicy = SecureFlagPolicy.SecureOn))
-        }
+        rule.setContent { TestDialog(DialogProperties(securePolicy = SecureFlagPolicy.SecureOn)) }
 
         assertThat(isSecureFlagEnabledForDialog()).isTrue()
     }
 
     @Test
     fun toggleFlagOnDialog() {
-        var properties: DialogProperties
-        by mutableStateOf(DialogProperties(securePolicy = SecureFlagPolicy.SecureOff))
+        var properties: DialogProperties by
+            mutableStateOf(DialogProperties(securePolicy = SecureFlagPolicy.SecureOff))
 
-        rule.setContent {
-            TestDialog(properties)
-        }
+        rule.setContent { TestDialog(properties) }
 
         assertThat(isSecureFlagEnabledForDialog()).isFalse()
 
@@ -111,19 +104,14 @@
     @Composable
     fun TestDialog(dialogProperties: DialogProperties) {
         SimpleContainer {
-            Dialog(
-                onDismissRequest = { },
-                properties = dialogProperties
-            ) {
+            Dialog(onDismissRequest = {}, properties = dialogProperties) {
                 SimpleContainer(Modifier.size(50.dp), content = {})
             }
         }
     }
 
     private fun isSecureFlagEnabledForDialog(): Boolean {
-        val owner = rule
-            .onNode(isDialog())
-            .fetchSemanticsNode("").root as View
+        val owner = rule.onNode(isDialog()).fetchSemanticsNode("").root as View
         return (owner.rootView.layoutParams as WindowManager.LayoutParams).flags and
             WindowManager.LayoutParams.FLAG_SECURE != 0
     }
diff --git a/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/window/DialogTest.kt b/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/window/DialogTest.kt
index f53a959..20b3ad9 100644
--- a/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/window/DialogTest.kt
+++ b/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/window/DialogTest.kt
@@ -58,8 +58,7 @@
 @MediumTest
 @RunWith(AndroidJUnit4::class)
 class DialogTest {
-    @get:Rule
-    val rule = createAndroidComposeRule<TestActivity>()
+    @get:Rule val rule = createAndroidComposeRule<TestActivity>()
 
     private val defaultText = "dialogText"
 
@@ -69,9 +68,7 @@
             val showDialog = remember { mutableStateOf(true) }
 
             if (showDialog.value) {
-                Dialog(onDismissRequest = {}) {
-                    BasicText(defaultText)
-                }
+                Dialog(onDismissRequest = {}) { BasicText(defaultText) }
             }
         }
 
@@ -89,22 +86,17 @@
             val text = remember { mutableStateOf(textBeforeClick) }
 
             if (showDialog.value) {
-                Dialog(
-                    onDismissRequest = {
-                        showDialog.value = false
-                    }
-                ) {
+                Dialog(onDismissRequest = { showDialog.value = false }) {
                     BasicText(
                         text = text.value,
-                        modifier = Modifier.clickable {
-                            text.value = textAfterClick
-                        }
+                        modifier = Modifier.clickable { text.value = textAfterClick }
                     )
                 }
             }
         }
 
-        rule.onNodeWithText(textBeforeClick)
+        rule
+            .onNodeWithText(textBeforeClick)
             .assertIsDisplayed()
             // Click inside the dialog
             .performClick()
@@ -122,13 +114,7 @@
             val showDialog = remember { mutableStateOf(true) }
 
             if (showDialog.value) {
-                Dialog(
-                    onDismissRequest = {
-                        showDialog.value = false
-                    }
-                ) {
-                    BasicText(defaultText)
-                }
+                Dialog(onDismissRequest = { showDialog.value = false }) { BasicText(defaultText) }
             }
         }
 
@@ -136,9 +122,11 @@
 
         // Click outside the dialog to dismiss it
         val outsideX = 0
-        val outsideY = with(rule.density) {
-            rule.onAllNodes(isRoot()).onFirst().getUnclippedBoundsInRoot().height.roundToPx() / 2
-        }
+        val outsideY =
+            with(rule.density) {
+                rule.onAllNodes(isRoot()).onFirst().getUnclippedBoundsInRoot().height.roundToPx() /
+                    2
+            }
         UiDevice.getInstance(getInstrumentation()).click(outsideX, outsideY)
 
         rule.onNodeWithText(defaultText).assertDoesNotExist()
@@ -150,9 +138,7 @@
             val showDialog = remember { mutableStateOf(true) }
 
             if (showDialog.value) {
-                Dialog(onDismissRequest = {}) {
-                    BasicText(defaultText)
-                }
+                Dialog(onDismissRequest = {}) { BasicText(defaultText) }
             }
         }
 
@@ -160,9 +146,11 @@
 
         // Click outside the dialog to try to dismiss it
         val outsideX = 0
-        val outsideY = with(rule.density) {
-            rule.onAllNodes(isRoot()).onFirst().getUnclippedBoundsInRoot().height.roundToPx() / 2
-        }
+        val outsideY =
+            with(rule.density) {
+                rule.onAllNodes(isRoot()).onFirst().getUnclippedBoundsInRoot().height.roundToPx() /
+                    2
+            }
         UiDevice.getInstance(getInstrumentation()).click(outsideX, outsideY)
 
         // The Dialog should still be visible
@@ -176,9 +164,7 @@
 
             if (showDialog.value) {
                 Dialog(
-                    onDismissRequest = {
-                        showDialog.value = false
-                    },
+                    onDismissRequest = { showDialog.value = false },
                     properties = DialogProperties(dismissOnClickOutside = false)
                 ) {
                     BasicText(defaultText)
@@ -190,9 +176,11 @@
 
         // Click outside the dialog to try to dismiss it
         val outsideX = 0
-        val outsideY = with(rule.density) {
-            rule.onAllNodes(isRoot()).onFirst().getUnclippedBoundsInRoot().height.roundToPx() / 2
-        }
+        val outsideY =
+            with(rule.density) {
+                rule.onAllNodes(isRoot()).onFirst().getUnclippedBoundsInRoot().height.roundToPx() /
+                    2
+            }
         UiDevice.getInstance(getInstrumentation()).click(outsideX, outsideY)
 
         // The Dialog should still be visible
@@ -205,13 +193,7 @@
             val showDialog = remember { mutableStateOf(true) }
 
             if (showDialog.value) {
-                Dialog(
-                    onDismissRequest = {
-                        showDialog.value = false
-                    }
-                ) {
-                    BasicText(defaultText)
-                }
+                Dialog(onDismissRequest = { showDialog.value = false }) { BasicText(defaultText) }
             }
         }
 
@@ -229,9 +211,7 @@
             val showDialog = remember { mutableStateOf(true) }
 
             if (showDialog.value) {
-                Dialog(onDismissRequest = {}) {
-                    BasicText(defaultText)
-                }
+                Dialog(onDismissRequest = {}) { BasicText(defaultText) }
             }
         }
 
@@ -251,9 +231,7 @@
 
             if (showDialog.value) {
                 Dialog(
-                    onDismissRequest = {
-                        showDialog.value = false
-                    },
+                    onDismissRequest = { showDialog.value = false },
                     properties = DialogProperties(dismissOnBackPress = false)
                 ) {
                     BasicText(defaultText)
@@ -287,9 +265,7 @@
                 Dialog(onDismissRequest = {}) {
                     val clickCount = remember { mutableStateOf(0) }
                     BasicText(clickCountPrefix + clickCount.value)
-                    BackHandler {
-                        clickCount.value++
-                    }
+                    BackHandler { clickCount.value++ }
                 }
             }
         }
@@ -308,14 +284,10 @@
         var value = 0f
         rule.setContent {
             CompositionLocalProvider(compositionLocal provides 1f) {
-                Dialog(onDismissRequest = {}) {
-                    value = compositionLocal.current
-                }
+                Dialog(onDismissRequest = {}) { value = compositionLocal.current }
             }
         }
-        rule.runOnIdle {
-            assertEquals(1f, value)
-        }
+        rule.runOnIdle { assertEquals(1f, value) }
     }
 
     @Test
@@ -334,10 +306,11 @@
             }
         }
         rule.runOnIdle {
-            Truth.assertThat(box1Width).isEqualTo(
-                (rule.activity.resources.configuration.screenWidthDp * rule.density.density)
-                    .roundToInt()
-            )
+            Truth.assertThat(box1Width)
+                .isEqualTo(
+                    (rule.activity.resources.configuration.screenWidthDp * rule.density.density)
+                        .roundToInt()
+                )
             Truth.assertThat(box2Width).isLessThan(box1Width)
         }
     }
diff --git a/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/window/DialogWithInsetsTest.kt b/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/window/DialogWithInsetsTest.kt
index e814e01..eb39967 100644
--- a/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/window/DialogWithInsetsTest.kt
+++ b/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/window/DialogWithInsetsTest.kt
@@ -52,12 +52,9 @@
 @MediumTest
 @RunWith(AndroidJUnit4::class)
 class DialogWithInsetsTest {
-    @get:Rule
-    val rule = createAndroidComposeRule<ActivityWithInsets>()
+    @get:Rule val rule = createAndroidComposeRule<ActivityWithInsets>()
 
-    /**
-     * Make sure that insets are available in the Dialog.
-     */
+    /** Make sure that insets are available in the Dialog. */
     @OptIn(ExperimentalComposeUiApi::class)
     @Test
     fun dialogSupportsWindowInsets() {
@@ -78,30 +75,20 @@
                     }
                 }
                 val density = LocalDensity.current
-                imeInsets = Insets.of(
-                    WindowInsets.ime.getLeft(density, LayoutDirection.Ltr),
-                    WindowInsets.ime.getTop(density),
-                    WindowInsets.ime.getRight(density, LayoutDirection.Ltr),
-                    WindowInsets.ime.getBottom(density),
-                )
-                Box(
-                    Modifier
-                        .fillMaxSize()
-                        .background(Color.White)
-                        .imePadding()
-                ) {
-                    Box(
-                        Modifier
-                            .fillMaxSize()
-                            .onSizeChanged {
-                                dialogSize = it
-                            }) {
+                imeInsets =
+                    Insets.of(
+                        WindowInsets.ime.getLeft(density, LayoutDirection.Ltr),
+                        WindowInsets.ime.getTop(density),
+                        WindowInsets.ime.getRight(density, LayoutDirection.Ltr),
+                        WindowInsets.ime.getBottom(density),
+                    )
+                Box(Modifier.fillMaxSize().background(Color.White).imePadding()) {
+                    Box(Modifier.fillMaxSize().onSizeChanged { dialogSize = it }) {
                         TextField(
                             value = "Hello World",
-                            onValueChange = { },
-                            modifier = Modifier
-                                .focusRequester(focusRequester)
-                                .align(Alignment.Center)
+                            onValueChange = {},
+                            modifier =
+                                Modifier.focusRequester(focusRequester).align(Alignment.Center)
                         )
                     }
                 }
@@ -125,14 +112,10 @@
         }
 
         // show the IME
-        rule.runOnUiThread {
-            focusRequester.requestFocus()
-        }
+        rule.runOnUiThread { focusRequester.requestFocus() }
 
         rule.waitForIdle()
-        rule.runOnUiThread {
-            controller.show(WindowInsetsCompat.Type.ime())
-        }
+        rule.runOnUiThread { controller.show(WindowInsetsCompat.Type.ime()) }
 
         val applied = insetsAppliedLatch.await(1, TimeUnit.SECONDS)
 
@@ -143,9 +126,7 @@
             return
         }
 
-        rule.waitUntil {
-            dialogSize != originalSize
-        }
+        rule.waitUntil { dialogSize != originalSize }
         rule.waitForIdle()
         assertNotEquals(Insets.NONE, imeInsets)
     }
diff --git a/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/window/PopupAlignmentTest.kt b/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/window/PopupAlignmentTest.kt
index 38fdc55..130d66d 100644
--- a/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/window/PopupAlignmentTest.kt
+++ b/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/window/PopupAlignmentTest.kt
@@ -47,8 +47,7 @@
 @RunWith(AndroidJUnit4::class)
 class PopupAlignmentTest {
 
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
     private val testTag = "testedPopup"
     private val offset = IntOffset(10, 10)
@@ -295,10 +294,7 @@
 
     // TODO(b/140215440): Some tests are calling the OnChildPosition method inside the Popup too
     //  many times
-    private fun createPopupWithAlignmentRule(
-        alignment: Alignment,
-        isRtl: Boolean = false
-    ) {
+    private fun createPopupWithAlignmentRule(alignment: Alignment, isRtl: Boolean = false) {
         val measureLatch = CountDownLatch(1)
 
         with(rule.density) {
@@ -312,10 +308,7 @@
                 val composeView = LocalView.current
                 val positionArray = IntArray(2)
                 composeView.getLocationOnScreen(positionArray)
-                composeViewAbsolutePos = IntOffset(
-                    positionArray[0],
-                    positionArray[1]
-                )
+                composeViewAbsolutePos = IntOffset(positionArray[0], positionArray[1])
 
                 // Align the parent of the popup on the top left corner, this results in the global
                 // position of the parent to be (0, 0)
@@ -325,14 +318,16 @@
                         SimpleContainer(width = parentWidthDp, height = parentHeightDp) {
                             PopupTestTag(testTag) {
                                 Popup(alignment = alignment, offset = offset) {
-                                    // This is called after the OnChildPosition method in Popup() which
+                                    // This is called after the OnChildPosition method in Popup()
+                                    // which
                                     // updates the popup to its final position
                                     SimpleContainer(
                                         width = popupWidthDp,
                                         height = popupHeightDp,
-                                        modifier = Modifier.onGloballyPositioned {
-                                            measureLatch.countDown()
-                                        },
+                                        modifier =
+                                            Modifier.onGloballyPositioned {
+                                                measureLatch.countDown()
+                                            },
                                         content = {}
                                     )
                                 }
@@ -355,24 +350,27 @@
 
             // The layout is as large as possible for bounded constraints,
             // or wrap content otherwise.
-            val layoutWidth = if (constraints.hasBoundedWidth) {
-                constraints.maxWidth
-            } else {
-                placeable?.width ?: constraints.minWidth
-            }
-            val layoutHeight = if (constraints.hasBoundedHeight) {
-                constraints.maxHeight
-            } else {
-                placeable?.height ?: constraints.minHeight
-            }
+            val layoutWidth =
+                if (constraints.hasBoundedWidth) {
+                    constraints.maxWidth
+                } else {
+                    placeable?.width ?: constraints.minWidth
+                }
+            val layoutHeight =
+                if (constraints.hasBoundedHeight) {
+                    constraints.maxHeight
+                } else {
+                    placeable?.height ?: constraints.minHeight
+                }
 
             layout(layoutWidth, layoutHeight) {
                 if (placeable != null) {
-                    val position = Alignment.TopStart.align(
-                        IntSize(placeable.width, placeable.height),
-                        IntSize(layoutWidth, layoutHeight),
-                        layoutDirection
-                    )
+                    val position =
+                        Alignment.TopStart.align(
+                            IntSize(placeable.width, placeable.height),
+                            IntSize(layoutWidth, layoutHeight),
+                            layoutDirection
+                        )
                     placeable.placeRelative(position.x, position.y)
                 }
             }
diff --git a/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/window/PopupDismissTest.kt b/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/window/PopupDismissTest.kt
index 4550550..c12e513 100644
--- a/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/window/PopupDismissTest.kt
+++ b/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/window/PopupDismissTest.kt
@@ -59,8 +59,7 @@
         fun initParameters(): Array<Any> = arrayOf(true, false)
     }
 
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
     @Test
     fun clickOutsideToDismiss() {
@@ -79,19 +78,22 @@
             Box(Modifier.fillMaxSize()) {
                 BasicText(
                     text = AnnotatedString("Button"),
-                    modifier = Modifier
-                        .clickable { btnClicksCounter++ }
-                        .onGloballyPositioned {
-                            // UiDevice needs screen relative coordinates
-                            @Suppress("DEPRECATION")
-                            btnPos = it.localToRoot(Offset.Zero)
-                        }
+                    modifier =
+                        Modifier.clickable { btnClicksCounter++ }
+                            .onGloballyPositioned {
+                                // UiDevice needs screen relative coordinates
+                                @Suppress("DEPRECATION")
+                                btnPos = it.localToRoot(Offset.Zero)
+                            }
                 )
 
                 Popup(
                     alignment = Alignment.Center,
                     properties = PopupProperties(focusable = focusable),
-                    onDismissRequest = { dismissCounter++; latch.countDown() }
+                    onDismissRequest = {
+                        dismissCounter++
+                        latch.countDown()
+                    }
                 ) {
                     Box(Modifier.size(100.dp, 100.dp)) {
                         BasicText(text = "Popup", style = TextStyle(textAlign = TextAlign.Center))
diff --git a/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/window/PopupLayoutTest.kt b/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/window/PopupLayoutTest.kt
index 08e9912..5b5afe1 100644
--- a/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/window/PopupLayoutTest.kt
+++ b/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/window/PopupLayoutTest.kt
@@ -45,17 +45,16 @@
 import org.junit.runner.RunWith
 
 /**
- * Tests for the internal [PopupLayout] view used by [Popup].
- * When adding new tests, consider writing the tests against the [Popup] composable directly first,
- * since that's the public API, and only adding tests here if the tests need to interact in ways
- * that aren't easily supported by the compose test APIs.
+ * Tests for the internal [PopupLayout] view used by [Popup]. When adding new tests, consider
+ * writing the tests against the [Popup] composable directly first, since that's the public API, and
+ * only adding tests here if the tests need to interact in ways that aren't easily supported by the
+ * compose test APIs.
  */
 @MediumTest
 @RunWith(AndroidJUnit4::class)
 class PopupLayoutTest {
 
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
     @Test
     fun canCalculatePosition_onlyWhenSizeAndCoordinatesAreAvailable() {
@@ -79,16 +78,18 @@
     @Test
     fun positionUpdated_whenCoordinatesUpdated() {
         val coordinates = MutableLayoutCoordinates()
-        val layout = createPopupLayout(
-            positionProvider = object : PopupPositionProvider {
-                override fun calculatePosition(
-                    anchorBounds: IntRect,
-                    windowSize: IntSize,
-                    layoutDirection: LayoutDirection,
-                    popupContentSize: IntSize
-                ): IntOffset = anchorBounds.topLeft
-            },
-        )
+        val layout =
+            createPopupLayout(
+                positionProvider =
+                    object : PopupPositionProvider {
+                        override fun calculatePosition(
+                            anchorBounds: IntRect,
+                            windowSize: IntSize,
+                            layoutDirection: LayoutDirection,
+                            popupContentSize: IntSize
+                        ): IntOffset = anchorBounds.topLeft
+                    },
+            )
         layout.popupContentSize = IntSize.Zero
 
         assertThat(layout.params.x).isEqualTo(0)
@@ -104,25 +105,28 @@
     @Test
     fun positionNotUpdated_whenCoordinatesUpdated_withSameParentBounds() {
         var paramUpdateCount = 0
-        val layout = createPopupLayout(
-            positionProvider = object : PopupPositionProvider {
-                override fun calculatePosition(
-                    anchorBounds: IntRect,
-                    windowSize: IntSize,
-                    layoutDirection: LayoutDirection,
-                    popupContentSize: IntSize
-                ): IntOffset = anchorBounds.topLeft
-            },
-            popupLayoutHelper = object : NoopPopupLayoutHelper() {
-                override fun updateViewLayout(
-                    windowManager: WindowManager,
-                    popupView: View,
-                    params: ViewGroup.LayoutParams
-                ) {
-                    paramUpdateCount++
-                }
-            }
-        )
+        val layout =
+            createPopupLayout(
+                positionProvider =
+                    object : PopupPositionProvider {
+                        override fun calculatePosition(
+                            anchorBounds: IntRect,
+                            windowSize: IntSize,
+                            layoutDirection: LayoutDirection,
+                            popupContentSize: IntSize
+                        ): IntOffset = anchorBounds.topLeft
+                    },
+                popupLayoutHelper =
+                    object : NoopPopupLayoutHelper() {
+                        override fun updateViewLayout(
+                            windowManager: WindowManager,
+                            popupView: View,
+                            params: ViewGroup.LayoutParams
+                        ) {
+                            paramUpdateCount++
+                        }
+                    }
+            )
 
         // Set size before coordinates to match the order that the compose runtime uses.
         layout.popupContentSize = IntSize.Zero
@@ -140,25 +144,28 @@
     @Test
     fun positionNotUpdated_onParentBoundsUpdateRequested_withSameParentBounds() {
         var paramUpdateCount = 0
-        val layout = createPopupLayout(
-            positionProvider = object : PopupPositionProvider {
-                override fun calculatePosition(
-                    anchorBounds: IntRect,
-                    windowSize: IntSize,
-                    layoutDirection: LayoutDirection,
-                    popupContentSize: IntSize
-                ): IntOffset = anchorBounds.topLeft
-            },
-            popupLayoutHelper = object : NoopPopupLayoutHelper() {
-                override fun updateViewLayout(
-                    windowManager: WindowManager,
-                    popupView: View,
-                    params: ViewGroup.LayoutParams
-                ) {
-                    paramUpdateCount++
-                }
-            }
-        )
+        val layout =
+            createPopupLayout(
+                positionProvider =
+                    object : PopupPositionProvider {
+                        override fun calculatePosition(
+                            anchorBounds: IntRect,
+                            windowSize: IntSize,
+                            layoutDirection: LayoutDirection,
+                            popupContentSize: IntSize
+                        ): IntOffset = anchorBounds.topLeft
+                    },
+                popupLayoutHelper =
+                    object : NoopPopupLayoutHelper() {
+                        override fun updateViewLayout(
+                            windowManager: WindowManager,
+                            popupView: View,
+                            params: ViewGroup.LayoutParams
+                        ) {
+                            paramUpdateCount++
+                        }
+                    }
+            )
 
         // Set size before coordinates to match the order that the compose runtime uses.
         layout.popupContentSize = IntSize.Zero
@@ -175,25 +182,28 @@
     fun positionUpdated_onParentBoundsUpdateRequested_withDifferentParentBounds() {
         var paramUpdateCount = 0
         val coordinates = MutableLayoutCoordinates()
-        val layout = createPopupLayout(
-            positionProvider = object : PopupPositionProvider {
-                override fun calculatePosition(
-                    anchorBounds: IntRect,
-                    windowSize: IntSize,
-                    layoutDirection: LayoutDirection,
-                    popupContentSize: IntSize
-                ): IntOffset = anchorBounds.topLeft
-            },
-            popupLayoutHelper = object : NoopPopupLayoutHelper() {
-                override fun updateViewLayout(
-                    windowManager: WindowManager,
-                    popupView: View,
-                    params: ViewGroup.LayoutParams
-                ) {
-                    paramUpdateCount++
-                }
-            }
-        )
+        val layout =
+            createPopupLayout(
+                positionProvider =
+                    object : PopupPositionProvider {
+                        override fun calculatePosition(
+                            anchorBounds: IntRect,
+                            windowSize: IntSize,
+                            layoutDirection: LayoutDirection,
+                            popupContentSize: IntSize
+                        ): IntOffset = anchorBounds.topLeft
+                    },
+                popupLayoutHelper =
+                    object : NoopPopupLayoutHelper() {
+                        override fun updateViewLayout(
+                            windowManager: WindowManager,
+                            popupView: View,
+                            params: ViewGroup.LayoutParams
+                        ) {
+                            paramUpdateCount++
+                        }
+                    }
+            )
 
         // Set size before coordinates to match the order that the compose runtime uses.
         layout.popupContentSize = IntSize.Zero
@@ -212,18 +222,20 @@
     @Test
     fun positionUpdated_whenStateReadInPositionProviderChanged() {
         var offset by mutableStateOf(IntOffset.Zero)
-        val layout = createPopupLayout(
-            // The state observer is only active while attached.
-            attachToWindow = { true },
-            positionProvider = object : PopupPositionProvider {
-                override fun calculatePosition(
-                    anchorBounds: IntRect,
-                    windowSize: IntSize,
-                    layoutDirection: LayoutDirection,
-                    popupContentSize: IntSize
-                ): IntOffset = offset
-            },
-        )
+        val layout =
+            createPopupLayout(
+                // The state observer is only active while attached.
+                attachToWindow = { true },
+                positionProvider =
+                    object : PopupPositionProvider {
+                        override fun calculatePosition(
+                            anchorBounds: IntRect,
+                            windowSize: IntSize,
+                            layoutDirection: LayoutDirection,
+                            popupContentSize: IntSize
+                        ): IntOffset = offset
+                    },
+            )
         layout.popupContentSize = IntSize.Zero
         // Need to calculate position at least once to do initial observation.
         layout.updateParentLayoutCoordinates(MutableLayoutCoordinates())
@@ -245,18 +257,20 @@
     fun positionNotUpdated_whenStateReadInPositionProviderChanged_whileDetached() {
         var offset by mutableStateOf(IntOffset.Zero)
         var attachToWindow by mutableStateOf(true)
-        val layout = createPopupLayout(
-            // The state observer is only active while attached.
-            attachToWindow = { attachToWindow },
-            positionProvider = object : PopupPositionProvider {
-                override fun calculatePosition(
-                    anchorBounds: IntRect,
-                    windowSize: IntSize,
-                    layoutDirection: LayoutDirection,
-                    popupContentSize: IntSize
-                ): IntOffset = offset
-            },
-        )
+        val layout =
+            createPopupLayout(
+                // The state observer is only active while attached.
+                attachToWindow = { attachToWindow },
+                positionProvider =
+                    object : PopupPositionProvider {
+                        override fun calculatePosition(
+                            anchorBounds: IntRect,
+                            windowSize: IntSize,
+                            layoutDirection: LayoutDirection,
+                            popupContentSize: IntSize
+                        ): IntOffset = offset
+                    },
+            )
         layout.popupContentSize = IntSize.Zero
         // Need to calculate position at least once to do initial observation.
         layout.updateParentLayoutCoordinates(MutableLayoutCoordinates())
@@ -278,16 +292,18 @@
     @Test
     fun positionNotUpdated_whenDetached() {
         val coordinates = MutableLayoutCoordinates(isAttached = false)
-        val layout = createPopupLayout(
-            positionProvider = object : PopupPositionProvider {
-                override fun calculatePosition(
-                    anchorBounds: IntRect,
-                    windowSize: IntSize,
-                    layoutDirection: LayoutDirection,
-                    popupContentSize: IntSize
-                ): IntOffset = anchorBounds.topLeft
-            },
-        )
+        val layout =
+            createPopupLayout(
+                positionProvider =
+                    object : PopupPositionProvider {
+                        override fun calculatePosition(
+                            anchorBounds: IntRect,
+                            windowSize: IntSize,
+                            layoutDirection: LayoutDirection,
+                            popupContentSize: IntSize
+                        ): IntOffset = anchorBounds.topLeft
+                    },
+            )
         layout.popupContentSize = IntSize.Zero
 
         assertThat(layout.params.x).isEqualTo(0)
@@ -313,15 +329,16 @@
             val view = LocalView.current
             remember {
                 PopupLayout(
-                    onDismissRequest = onDismissRequest,
-                    properties = properties,
-                    testTag = "test popup",
-                    composeView = view,
-                    density = density,
-                    initialPositionProvider = positionProvider,
-                    popupId = UUID.randomUUID(),
-                    popupLayoutHelper = popupLayoutHelper
-                ).also { layout = it }
+                        onDismissRequest = onDismissRequest,
+                        properties = properties,
+                        testTag = "test popup",
+                        composeView = view,
+                        density = density,
+                        initialPositionProvider = positionProvider,
+                        popupId = UUID.randomUUID(),
+                        popupLayoutHelper = popupLayoutHelper
+                    )
+                    .also { layout = it }
             }
 
             if (attachToWindow()) {
@@ -329,9 +346,7 @@
                     val windowManager =
                         view.context.getSystemService(Context.WINDOW_SERVICE) as WindowManager
                     windowManager.addView(layout, WindowManager.LayoutParams())
-                    onDispose {
-                        windowManager.removeView(layout)
-                    }
+                    onDispose { windowManager.removeView(layout) }
                 }
             }
         }
@@ -339,14 +354,15 @@
     }
 
     private companion object {
-        val ZeroPositionProvider = object : PopupPositionProvider {
-            override fun calculatePosition(
-                anchorBounds: IntRect,
-                windowSize: IntSize,
-                layoutDirection: LayoutDirection,
-                popupContentSize: IntSize
-            ): IntOffset = IntOffset.Zero
-        }
+        val ZeroPositionProvider =
+            object : PopupPositionProvider {
+                override fun calculatePosition(
+                    anchorBounds: IntRect,
+                    windowSize: IntSize,
+                    layoutDirection: LayoutDirection,
+                    popupContentSize: IntSize
+                ): IntOffset = IntOffset.Zero
+            }
 
         val NoopLayoutCoordinates: LayoutCoordinates = MutableLayoutCoordinates()
 
@@ -354,9 +370,8 @@
          * An implementation of [LayoutCoordinates] that allows explicitly setting values but only
          * supports the minimum required subset of operations that [PopupLayout] uses.
          */
-        private class MutableLayoutCoordinates(
-            override var isAttached: Boolean = true
-        ) : LayoutCoordinates {
+        private class MutableLayoutCoordinates(override var isAttached: Boolean = true) :
+            LayoutCoordinates {
             override var size: IntSize = IntSize.Zero
             override val providedAlignmentLines: Set<AlignmentLine> = emptySet()
             override var parentLayoutCoordinates: LayoutCoordinates? = null
diff --git a/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/window/PopupSecureFlagTest.kt b/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/window/PopupSecureFlagTest.kt
index 97c6c59..2cb05558 100644
--- a/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/window/PopupSecureFlagTest.kt
+++ b/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/window/PopupSecureFlagTest.kt
@@ -50,21 +50,20 @@
     }
 
     @get:Rule
-    val rule = createAndroidComposeRule(
-        if (setSecureFlagOnActivity) {
-            ActivityWithFlagSecure::class.java
-        } else {
-            ComponentActivity::class.java
-        }
-    )
+    val rule =
+        createAndroidComposeRule(
+            if (setSecureFlagOnActivity) {
+                ActivityWithFlagSecure::class.java
+            } else {
+                ComponentActivity::class.java
+            }
+        )
 
     private val testTag = "testedPopup"
 
     @Test
     fun noFlagSetOnPopup() {
-        rule.setContent {
-            TestPopup(PopupProperties())
-        }
+        rule.setContent { TestPopup(PopupProperties()) }
 
         if (setSecureFlagOnActivity) {
             // Flag was inherited from the Activity
@@ -77,9 +76,7 @@
 
     @Test
     fun forcedFlagOnPopupToDisabled() {
-        rule.setContent {
-            TestPopup(PopupProperties(securePolicy = SecureFlagPolicy.SecureOff))
-        }
+        rule.setContent { TestPopup(PopupProperties(securePolicy = SecureFlagPolicy.SecureOff)) }
 
         // This tests that we also override the flag from the Activity
         assertThat(isSecureFlagEnabledForPopup()).isFalse()
@@ -87,21 +84,17 @@
 
     @Test
     fun forcedFlagOnPopupToEnabled() {
-        rule.setContent {
-            TestPopup(PopupProperties(securePolicy = SecureFlagPolicy.SecureOn))
-        }
+        rule.setContent { TestPopup(PopupProperties(securePolicy = SecureFlagPolicy.SecureOn)) }
 
         assertThat(isSecureFlagEnabledForPopup()).isTrue()
     }
 
     @Test
     fun toggleFlagOnPopup() {
-        var properties: PopupProperties
-        by mutableStateOf(PopupProperties(securePolicy = SecureFlagPolicy.SecureOff))
+        var properties: PopupProperties by
+            mutableStateOf(PopupProperties(securePolicy = SecureFlagPolicy.SecureOff))
 
-        rule.setContent {
-            TestPopup(properties)
-        }
+        rule.setContent { TestPopup(properties) }
 
         assertThat(isSecureFlagEnabledForPopup()).isFalse()
 
@@ -116,40 +109,44 @@
 
     @Test
     fun toggleFlagOnPopup_customFlagsOverload() {
-        var properties: PopupProperties by mutableStateOf(
-            PopupProperties(
-                flags = WindowManager.LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH,
-                inheritSecurePolicy = false,
+        var properties: PopupProperties by
+            mutableStateOf(
+                PopupProperties(
+                    flags = WindowManager.LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH,
+                    inheritSecurePolicy = false,
+                )
             )
-        )
 
-        rule.setContent {
-            TestPopup(properties)
-        }
+        rule.setContent { TestPopup(properties) }
 
         assertThat(isSecureFlagEnabledForPopup()).isFalse()
 
         // Toggle flag
-        properties = PopupProperties(
-            flags = WindowManager.LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH or
-                WindowManager.LayoutParams.FLAG_SECURE,
-            inheritSecurePolicy = false,
-        )
+        properties =
+            PopupProperties(
+                flags =
+                    WindowManager.LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH or
+                        WindowManager.LayoutParams.FLAG_SECURE,
+                inheritSecurePolicy = false,
+            )
         assertThat(isSecureFlagEnabledForPopup()).isTrue()
 
         // Set to inherit
-        properties = PopupProperties(
-            flags = WindowManager.LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH,
-            inheritSecurePolicy = true,
-        )
+        properties =
+            PopupProperties(
+                flags = WindowManager.LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH,
+                inheritSecurePolicy = true,
+            )
         assertThat(isSecureFlagEnabledForPopup()).isEqualTo(setSecureFlagOnActivity)
 
         // Check that inherited value overrides `flags` value
-        properties = PopupProperties(
-            flags = WindowManager.LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH or
-                WindowManager.LayoutParams.FLAG_SECURE,
-            inheritSecurePolicy = true,
-        )
+        properties =
+            PopupProperties(
+                flags =
+                    WindowManager.LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH or
+                        WindowManager.LayoutParams.FLAG_SECURE,
+                inheritSecurePolicy = true,
+            )
         assertThat(isSecureFlagEnabledForPopup()).isEqualTo(setSecureFlagOnActivity)
     }
 
@@ -157,10 +154,7 @@
     fun TestPopup(popupProperties: PopupProperties) {
         SimpleContainer {
             PopupTestTag(testTag) {
-                Popup(
-                    alignment = Alignment.Center,
-                    properties = popupProperties
-                ) {
+                Popup(alignment = Alignment.Center, properties = popupProperties) {
                     SimpleContainer(Modifier.size(50.dp), content = {})
                 }
             }
@@ -169,7 +163,7 @@
 
     private fun isSecureFlagEnabledForPopup(): Boolean {
         // Make sure that current measurement/drawing is finished
-        rule.runOnIdle { }
+        rule.runOnIdle {}
         val popupMatcher = PopupLayoutMatcher(testTag)
         Espresso.onView(CoreMatchers.instanceOf(Owner::class.java))
             .inRoot(popupMatcher)
diff --git a/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/window/PopupTest.kt b/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/window/PopupTest.kt
index cf421ef..da69e38 100644
--- a/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/window/PopupTest.kt
+++ b/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/window/PopupTest.kt
@@ -78,8 +78,7 @@
 @RunWith(AndroidJUnit4::class)
 class PopupTest {
 
-    @get:Rule
-    val rule = createAndroidComposeRule<TestActivity>()
+    @get:Rule val rule = createAndroidComposeRule<TestActivity>()
 
     private val testTag = "testedPopup"
     private val offset = IntOffset(10, 10)
@@ -102,22 +101,14 @@
 
     @Test
     fun hasActualSize() {
-        val popupWidthDp = with(rule.density) {
-            popupSize.width.toDp()
-        }
-        val popupHeightDp = with(rule.density) {
-            popupSize.height.toDp()
-        }
+        val popupWidthDp = with(rule.density) { popupSize.width.toDp() }
+        val popupHeightDp = with(rule.density) { popupSize.height.toDp() }
 
         rule.setContent {
             SimpleContainer {
                 PopupTestTag(testTag) {
                     Popup(alignment = Alignment.Center) {
-                        SimpleContainer(
-                            width = popupWidthDp,
-                            height = popupHeightDp,
-                            content = {}
-                        )
+                        SimpleContainer(width = popupWidthDp, height = popupHeightDp, content = {})
                     }
                 }
             }
@@ -137,10 +128,7 @@
 
             // TODO(b/141101446): Find a way to match the window used by the popup
             override fun matchesSafely(item: Root?): Boolean {
-                val isPopup = item != null && isPopupLayout(
-                    item.decorView,
-                    testTag
-                )
+                val isPopup = item != null && isPopupLayout(item.decorView, testTag)
                 if (isPopup) {
                     popupsFound++
                 }
@@ -161,10 +149,10 @@
                         // This is called after the OnChildPosition method in Popup() which
                         // updates the popup to its final position
                         Box(
-                            modifier = Modifier.requiredWidth(200.dp).requiredHeight(200.dp)
-                                .onGloballyPositioned {
-                                    measureLatch.countDown()
-                                }
+                            modifier =
+                                Modifier.requiredWidth(200.dp)
+                                    .requiredHeight(200.dp)
+                                    .onGloballyPositioned { measureLatch.countDown() }
                         ) {}
                     }
                 }
@@ -173,7 +161,7 @@
         measureLatch.await(1, TimeUnit.SECONDS)
 
         fun assertSinglePopupExists() {
-            rule.runOnIdle { }
+            rule.runOnIdle {}
             val counterMatcher = PopupsCounterMatcher()
             Espresso.onView(instanceOf(Owner::class.java))
                 .inRoot(counterMatcher)
@@ -184,9 +172,7 @@
 
         assertSinglePopupExists()
 
-        rule.runOnUiThread {
-            focusable = true
-        }
+        rule.runOnUiThread { focusable = true }
 
         // If we have a leak, this will crash on multiple popups found
         assertSinglePopupExists()
@@ -194,24 +180,22 @@
 
     @Test
     fun hasViewTreeLifecycleOwner() {
-        rule.setContent {
-            PopupTestTag(testTag) {
-                Popup {}
-            }
-        }
+        rule.setContent { PopupTestTag(testTag) { Popup {} } }
 
         Espresso.onView(instanceOf(Owner::class.java))
             .inRoot(PopupLayoutMatcher(testTag))
             .check(
-                matches(object : TypeSafeMatcher<View>() {
-                    override fun describeTo(description: Description?) {
-                        description?.appendText("view.findViewTreeLifecycleOwner() != null")
-                    }
+                matches(
+                    object : TypeSafeMatcher<View>() {
+                        override fun describeTo(description: Description?) {
+                            description?.appendText("view.findViewTreeLifecycleOwner() != null")
+                        }
 
-                    override fun matchesSafely(item: View): Boolean {
-                        return item.findViewTreeLifecycleOwner() != null
+                        override fun matchesSafely(item: View): Boolean {
+                            return item.findViewTreeLifecycleOwner() != null
+                        }
                     }
-                })
+                )
             )
     }
 
@@ -221,14 +205,10 @@
         var value = 0f
         rule.setContent {
             CompositionLocalProvider(compositionLocal provides 1f) {
-                Popup {
-                    value = compositionLocal.current
-                }
+                Popup { value = compositionLocal.current }
             }
         }
-        rule.runOnIdle {
-            assertThat(value).isEqualTo(1f)
-        }
+        rule.runOnIdle { assertThat(value).isEqualTo(1f) }
     }
 
     @Test
@@ -236,14 +216,10 @@
         var value = LayoutDirection.Ltr
         rule.setContent {
             CompositionLocalProvider(LocalLayoutDirection provides LayoutDirection.Rtl) {
-                Popup {
-                    value = LocalLayoutDirection.current
-                }
+                Popup { value = LocalLayoutDirection.current }
             }
         }
-        rule.runOnIdle {
-            assertThat(value).isEqualTo(LayoutDirection.Rtl)
-        }
+        rule.runOnIdle { assertThat(value).isEqualTo(LayoutDirection.Rtl) }
     }
 
     @Test
@@ -264,9 +240,11 @@
 
         // Click outside the popup
         val outsideX = 0
-        val outsideY = with(rule.density) {
-            rule.onAllNodes(isRoot()).onFirst().getUnclippedBoundsInRoot().height.roundToPx() / 2
-        }
+        val outsideY =
+            with(rule.density) {
+                rule.onAllNodes(isRoot()).onFirst().getUnclippedBoundsInRoot().height.roundToPx() /
+                    2
+            }
         UiDevice.getInstance(getInstrumentation()).click(outsideX, outsideY)
 
         // Popup should not exist
@@ -280,10 +258,11 @@
             Box(Modifier.fillMaxSize()) {
                 if (showPopup) {
                     Popup(
-                        properties = PopupProperties(
-                            // Needs to be focusable to intercept back press
-                            focusable = true
-                        ),
+                        properties =
+                            PopupProperties(
+                                // Needs to be focusable to intercept back press
+                                focusable = true
+                            ),
                         alignment = Alignment.Center,
                         onDismissRequest = { showPopup = false }
                     ) {
@@ -324,9 +303,11 @@
 
         // Click outside the popup
         val outsideX = 0
-        val outsideY = with(rule.density) {
-            rule.onAllNodes(isRoot()).onFirst().getUnclippedBoundsInRoot().height.roundToPx() / 2
-        }
+        val outsideY =
+            with(rule.density) {
+                rule.onAllNodes(isRoot()).onFirst().getUnclippedBoundsInRoot().height.roundToPx() /
+                    2
+            }
         UiDevice.getInstance(getInstrumentation()).click(outsideX, outsideY)
 
         // Popup should still be visible
@@ -340,11 +321,12 @@
             Box(Modifier.fillMaxSize()) {
                 if (showPopup) {
                     Popup(
-                        properties = PopupProperties(
-                            // Needs to be focusable to intercept back press
-                            focusable = true,
-                            dismissOnBackPress = false
-                        ),
+                        properties =
+                            PopupProperties(
+                                // Needs to be focusable to intercept back press
+                                focusable = true,
+                                dismissOnBackPress = false
+                            ),
                         alignment = Alignment.Center,
                         onDismissRequest = { showPopup = false }
                     ) {
@@ -368,18 +350,17 @@
         var box1Width = 0
         var box2Width = 0
         rule.setContent {
-            Popup {
-                Box(Modifier.fillMaxSize().onSizeChanged { box1Width = it.width })
-            }
+            Popup { Box(Modifier.fillMaxSize().onSizeChanged { box1Width = it.width }) }
             Popup(properties = PopupProperties(usePlatformDefaultWidth = true)) {
                 Box(Modifier.fillMaxSize().onSizeChanged { box2Width = it.width })
             }
         }
         rule.runOnIdle {
-            assertThat(box1Width).isEqualTo(
-                (rule.activity.resources.configuration.screenWidthDp * rule.density.density)
-                    .roundToInt()
-            )
+            assertThat(box1Width)
+                .isEqualTo(
+                    (rule.activity.resources.configuration.screenWidthDp * rule.density.density)
+                        .roundToInt()
+                )
             assertThat(box2Width).isLessThan(box1Width)
         }
     }
@@ -391,9 +372,7 @@
         var actualWidth = 0
 
         rule.setContent {
-            Popup(
-                properties = PopupProperties(usePlatformDefaultWidth = usePlatformDefaultWidth)
-            ) {
+            Popup(properties = PopupProperties(usePlatformDefaultWidth = usePlatformDefaultWidth)) {
                 Box(Modifier.size(width, 150.dp).onSizeChanged { actualWidth = it.width })
             }
         }
@@ -419,18 +398,20 @@
 
     @Test
     fun customFlags() {
-        val flags = WindowManager.LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH or
-            WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS or
-            WindowManager.LayoutParams.FLAG_IGNORE_CHEEK_PRESSES or
-            WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM
+        val flags =
+            WindowManager.LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH or
+                WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS or
+                WindowManager.LayoutParams.FLAG_IGNORE_CHEEK_PRESSES or
+                WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM
 
         rule.setContent {
             PopupTestTag(testTag) {
                 Popup(
-                    properties = PopupProperties(
-                        flags = flags,
-                        inheritSecurePolicy = false,
-                    )
+                    properties =
+                        PopupProperties(
+                            flags = flags,
+                            inheritSecurePolicy = false,
+                        )
                 ) {
                     Box(Modifier.size(50.dp))
                 }
@@ -438,7 +419,7 @@
         }
 
         // Make sure that current measurement/drawing is finished
-        rule.runOnIdle { }
+        rule.runOnIdle {}
         val popupMatcher = PopupLayoutMatcher(testTag)
         Espresso.onView(instanceOf(Owner::class.java))
             .inRoot(popupMatcher)
@@ -450,13 +431,7 @@
 
     @Test
     fun didNotMeasureTooSmallLast() {
-        rule.setContent {
-            PopupTestTag(testTag) {
-                Popup {
-                    Box(Modifier.fillMaxWidth())
-                }
-            }
-        }
+        rule.setContent { PopupTestTag(testTag) { Popup { Box(Modifier.fillMaxWidth()) } } }
 
         rule.popupMatches(
             testTag,
@@ -487,9 +462,7 @@
                 }
             }
         }
-        rule.runOnIdle {
-            assertThat(measurements).isEqualTo(1)
-        }
+        rule.runOnIdle { assertThat(measurements).isEqualTo(1) }
     }
 
     @Test
@@ -499,9 +472,7 @@
         var size by mutableStateOf(size1)
         rule.setContent {
             PopupTestTag(testTag) {
-                Popup {
-                    Box(Modifier.size(with(rule.density) { size.toDp() }))
-                }
+                Popup { Box(Modifier.size(with(rule.density) { size.toDp() })) }
             }
         }
         rule.popupMatches(testTag, matchesSize(20, 20))
@@ -515,22 +486,20 @@
         rule.setContent {
             AndroidView(
                 factory = { context ->
-                    FrameLayout(context).apply {
-                        addView(ComposeView(context).apply {
-                            setContent {
-                                Box {
-                                    Popup { Box(Modifier.size(20.dp)) }
+                    FrameLayout(context)
+                        .apply {
+                            addView(
+                                ComposeView(context).apply {
+                                    setContent { Box { Popup { Box(Modifier.size(20.dp)) } } }
                                 }
-                            }
-                        })
-                    }.also { parent = it }
+                            )
+                        }
+                        .also { parent = it }
                 }
             )
         }
 
-        rule.runOnIdle {
-            parent!!.removeAllViews()
-        }
+        rule.runOnIdle { parent!!.removeAllViews() }
 
         rule.waitForIdle()
 
diff --git a/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/window/PopupTestUtils.kt b/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/window/PopupTestUtils.kt
index b6cbe5c..0f6acd4 100644
--- a/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/window/PopupTestUtils.kt
+++ b/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/window/PopupTestUtils.kt
@@ -43,7 +43,7 @@
 // TODO(b/139861182): Remove all of this and provide helpers on rule
 internal fun ComposeTestRule.popupMatches(popupTestTag: String, viewMatcher: Matcher<in View>) {
     // Make sure that current measurement/drawing is finished
-    runOnIdle { }
+    runOnIdle {}
     Espresso.onView(CoreMatchers.instanceOf(Owner::class.java))
         .inRoot(PopupLayoutMatcher(popupTestTag))
         .check(ViewAssertions.matches(viewMatcher))
@@ -78,9 +78,7 @@
     }
 }
 
-/**
- * A Container Box implementation used for selection children and handle layout
- */
+/** A Container Box implementation used for selection children and handle layout */
 @Composable
 internal fun SimpleContainer(
     modifier: Modifier = Modifier,
@@ -89,47 +87,44 @@
     content: @Composable () -> Unit
 ) {
     Layout(content, modifier) { measurables, incomingConstraints ->
-        val containerConstraints = incomingConstraints
-            .constrain(
-                Constraints().copy(
-                    width?.roundToPx() ?: 0,
-                    width?.roundToPx() ?: Constraints.Infinity,
-                    height?.roundToPx() ?: 0,
-                    height?.roundToPx() ?: Constraints.Infinity
-                )
+        val containerConstraints =
+            incomingConstraints.constrain(
+                Constraints()
+                    .copy(
+                        width?.roundToPx() ?: 0,
+                        width?.roundToPx() ?: Constraints.Infinity,
+                        height?.roundToPx() ?: 0,
+                        height?.roundToPx() ?: Constraints.Infinity
+                    )
             )
         val childConstraints = containerConstraints.copy(minWidth = 0, minHeight = 0)
         var placeable: Placeable? = null
-        val containerWidth = if (
-            containerConstraints.hasFixedWidth
-        ) {
-            containerConstraints.maxWidth
-        } else {
-            placeable = measurables.firstOrNull()?.measure(childConstraints)
-            max((placeable?.width ?: 0), containerConstraints.minWidth)
-        }
-        val containerHeight = if (
-            containerConstraints.hasFixedHeight
-        ) {
-            containerConstraints.maxHeight
-        } else {
-            if (placeable == null) {
+        val containerWidth =
+            if (containerConstraints.hasFixedWidth) {
+                containerConstraints.maxWidth
+            } else {
                 placeable = measurables.firstOrNull()?.measure(childConstraints)
+                max((placeable?.width ?: 0), containerConstraints.minWidth)
             }
-            max((placeable?.height ?: 0), containerConstraints.minHeight)
-        }
+        val containerHeight =
+            if (containerConstraints.hasFixedHeight) {
+                containerConstraints.maxHeight
+            } else {
+                if (placeable == null) {
+                    placeable = measurables.firstOrNull()?.measure(childConstraints)
+                }
+                max((placeable?.height ?: 0), containerConstraints.minHeight)
+            }
         layout(containerWidth, containerHeight) {
             val p = placeable ?: measurables.firstOrNull()?.measure(childConstraints)
             p?.let {
-                val position = Alignment.Center.align(
-                    IntSize(it.width, it.height),
-                    IntSize(containerWidth, containerHeight),
-                    layoutDirection
-                )
-                it.placeRelative(
-                    position.x,
-                    position.y
-                )
+                val position =
+                    Alignment.Center.align(
+                        IntSize(it.width, it.height),
+                        IntSize(containerWidth, containerHeight),
+                        layoutDirection
+                    )
+                it.placeRelative(position.x, position.y)
             }
         }
     }
diff --git a/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/window/PositionInWindowTest.kt b/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/window/PositionInWindowTest.kt
index 1fb465c..71928c5 100644
--- a/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/window/PositionInWindowTest.kt
+++ b/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/window/PositionInWindowTest.kt
@@ -64,8 +64,7 @@
 @RunWith(AndroidJUnit4::class)
 class PositionInWindowTest {
 
-    @get:Rule
-    val rule = createAndroidComposeRule<TestActivity>()
+    @get:Rule val rule = createAndroidComposeRule<TestActivity>()
 
     lateinit var activity: ComponentActivity
 
@@ -122,12 +121,10 @@
         rule.setContent {
             with(LocalDensity.current) {
                 Box(
-                    Modifier
-                        .requiredSize(10.toDp())
-                        .onGloballyPositioned {
-                            coordinates = it
-                            latch.countDown()
-                        }
+                    Modifier.requiredSize(10.toDp()).onGloballyPositioned {
+                        coordinates = it
+                        latch.countDown()
+                    }
                 )
             }
         }
@@ -191,8 +188,7 @@
             curScrollYField.isAccessible = true
             curScrollYField.set(viewRootImpl, -10)
 
-            @Suppress("BanThreadSleep")
-            Thread.sleep(1) // advance clock so cached value isn't used
+            @Suppress("BanThreadSleep") Thread.sleep(1) // advance clock so cached value isn't used
             val newPosition = coordinates!!.positionInWindow()
             assertThat(newPosition.y).isEqualTo(position.y + 10)
         }
@@ -215,9 +211,7 @@
         }
 
         var position = Offset.Zero
-        rule.runOnIdle {
-            position = coordinates!!.positionInWindow()
-        }
+        rule.runOnIdle { position = coordinates!!.positionInWindow() }
 
         rule.runOnIdle {
             val decorView = activity.window.decorView as ViewGroup
@@ -260,13 +254,10 @@
             }
         }
 
-        rule.onNodeWithTag(smallBoxTag)
-            .performTouchInput {
-                swipe(Offset.Zero, Offset(endOffsetPx, endOffsetPx))
-            }
-
-        rule.runOnIdle {
-            assertThat(offset).isEqualTo(Offset(endOffsetPx, endOffsetPx))
+        rule.onNodeWithTag(smallBoxTag).performTouchInput {
+            swipe(Offset.Zero, Offset(endOffsetPx, endOffsetPx))
         }
+
+        rule.runOnIdle { assertThat(offset).isEqualTo(Offset(endOffsetPx, endOffsetPx)) }
     }
 }
diff --git a/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/autofill/AndroidAutofill.android.kt b/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/autofill/AndroidAutofill.android.kt
index 23ef7d8..aac3f61 100644
--- a/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/autofill/AndroidAutofill.android.kt
+++ b/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/autofill/AndroidAutofill.android.kt
@@ -38,16 +38,20 @@
 @RequiresApi(Build.VERSION_CODES.O)
 internal class AndroidAutofill(val view: View, val autofillTree: AutofillTree) : Autofill {
 
-    val autofillManager = view.context.getSystemService(AutofillManager::class.java)
-        ?: error("Autofill service could not be located.")
+    val autofillManager =
+        view.context.getSystemService(AutofillManager::class.java)
+            ?: error("Autofill service could not be located.")
 
-    init { view.importantForAutofill = View.IMPORTANT_FOR_AUTOFILL_YES }
+    init {
+        view.importantForAutofill = View.IMPORTANT_FOR_AUTOFILL_YES
+    }
 
     override fun requestAutofillForNode(autofillNode: AutofillNode) {
-        val boundingBox = autofillNode.boundingBox
-            ?: error("requestAutofill called before onChildPositioned()")
+        val boundingBox =
+            autofillNode.boundingBox ?: error("requestAutofill called before onChildPositioned()")
 
-        // TODO(b/138731416): Find out what happens when notifyViewEntered() is called multiple times
+        // TODO(b/138731416): Find out what happens when notifyViewEntered() is called multiple
+        // times
         // before calling notifyViewExited().
         autofillManager.notifyViewEntered(
             view,
@@ -82,11 +86,7 @@
 
     for ((id, autofillNode) in autofillTree.children) {
         AutofillApi26Helper.newChild(root, index)?.also { child ->
-            AutofillApi26Helper.setAutofillId(
-                child,
-                AutofillApi26Helper.getAutofillId(root)!!,
-                id
-            )
+            AutofillApi26Helper.setAutofillId(child, AutofillApi26Helper.getAutofillId(root)!!, id)
             AutofillApi26Helper.setId(child, id, view.context.packageName, null, null)
             AutofillApi26Helper.setAutofillType(child, ContentDataType.Text.dataType)
             AutofillApi26Helper.setAutofillHints(
@@ -117,9 +117,7 @@
     }
 }
 
-/**
- * Triggers onFill() in response to a request from the autofill framework.
- */
+/** Triggers onFill() in response to a request from the autofill framework. */
 @ExperimentalComposeUiApi
 @RequiresApi(Build.VERSION_CODES.O)
 internal fun AndroidAutofill.performAutofill(values: SparseArray<AutofillValue>) {
@@ -127,14 +125,13 @@
         val itemId = values.keyAt(index)
         val value = values[itemId]
         when {
-            AutofillApi26Helper.isText(value) -> autofillTree.performAutofill(
-                itemId,
-                AutofillApi26Helper.textValue(value).toString()
-            )
-            AutofillApi26Helper.isDate(value) ->
-                TODO("b/138604541: Add onFill() callback for date")
-            AutofillApi26Helper.isList(value) ->
-                TODO("b/138604541: Add onFill() callback for list")
+            AutofillApi26Helper.isText(value) ->
+                autofillTree.performAutofill(
+                    itemId,
+                    AutofillApi26Helper.textValue(value).toString()
+                )
+            AutofillApi26Helper.isDate(value) -> TODO("b/138604541: Add onFill() callback for date")
+            AutofillApi26Helper.isList(value) -> TODO("b/138604541: Add onFill() callback for list")
             AutofillApi26Helper.isToggle(value) ->
                 TODO("b/138604541:  Add onFill() callback for toggle")
         }
diff --git a/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/autofill/AndroidAutofillType.android.kt b/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/autofill/AndroidAutofillType.android.kt
index 94a5b9a..d8df206 100644
--- a/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/autofill/AndroidAutofillType.android.kt
+++ b/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/autofill/AndroidAutofillType.android.kt
@@ -102,45 +102,44 @@
         return androidAutofillType
     }
 
-/**
- * Maps each [AutofillType] to one of the  autofill hints in [androidx.autofill.HintConstants]
- */
+/** Maps each [AutofillType] to one of the autofill hints in [androidx.autofill.HintConstants] */
 @ExperimentalComposeUiApi
-private val androidAutofillTypes: HashMap<AutofillType, String> = hashMapOf(
-    EmailAddress to AUTOFILL_HINT_EMAIL_ADDRESS,
-    Username to AUTOFILL_HINT_USERNAME,
-    Password to AUTOFILL_HINT_PASSWORD,
-    NewUsername to AUTOFILL_HINT_NEW_USERNAME,
-    NewPassword to AUTOFILL_HINT_NEW_PASSWORD,
-    PostalAddress to AUTOFILL_HINT_POSTAL_ADDRESS,
-    PostalCode to AUTOFILL_HINT_POSTAL_CODE,
-    CreditCardNumber to AUTOFILL_HINT_CREDIT_CARD_NUMBER,
-    CreditCardSecurityCode to AUTOFILL_HINT_CREDIT_CARD_SECURITY_CODE,
-    CreditCardExpirationDate to AUTOFILL_HINT_CREDIT_CARD_EXPIRATION_DATE,
-    CreditCardExpirationMonth to AUTOFILL_HINT_CREDIT_CARD_EXPIRATION_MONTH,
-    CreditCardExpirationYear to AUTOFILL_HINT_CREDIT_CARD_EXPIRATION_YEAR,
-    CreditCardExpirationDay to AUTOFILL_HINT_CREDIT_CARD_EXPIRATION_DAY,
-    AddressCountry to AUTOFILL_HINT_POSTAL_ADDRESS_COUNTRY,
-    AddressRegion to AUTOFILL_HINT_POSTAL_ADDRESS_REGION,
-    AddressLocality to AUTOFILL_HINT_POSTAL_ADDRESS_LOCALITY,
-    AddressStreet to AUTOFILL_HINT_POSTAL_ADDRESS_STREET_ADDRESS,
-    AddressAuxiliaryDetails to AUTOFILL_HINT_POSTAL_ADDRESS_EXTENDED_ADDRESS,
-    PostalCodeExtended to AUTOFILL_HINT_POSTAL_ADDRESS_EXTENDED_POSTAL_CODE,
-    PersonFullName to AUTOFILL_HINT_PERSON_NAME,
-    PersonFirstName to AUTOFILL_HINT_PERSON_NAME_GIVEN,
-    PersonLastName to AUTOFILL_HINT_PERSON_NAME_FAMILY,
-    PersonMiddleName to AUTOFILL_HINT_PERSON_NAME_MIDDLE,
-    PersonMiddleInitial to AUTOFILL_HINT_PERSON_NAME_MIDDLE_INITIAL,
-    PersonNamePrefix to AUTOFILL_HINT_PERSON_NAME_PREFIX,
-    PersonNameSuffix to AUTOFILL_HINT_PERSON_NAME_SUFFIX,
-    PhoneNumber to AUTOFILL_HINT_PHONE_NUMBER,
-    PhoneNumberDevice to AUTOFILL_HINT_PHONE_NUMBER_DEVICE,
-    PhoneCountryCode to AUTOFILL_HINT_PHONE_COUNTRY_CODE,
-    PhoneNumberNational to AUTOFILL_HINT_PHONE_NATIONAL,
-    Gender to AUTOFILL_HINT_GENDER,
-    BirthDateFull to AUTOFILL_HINT_BIRTH_DATE_FULL,
-    BirthDateDay to AUTOFILL_HINT_BIRTH_DATE_DAY,
-    BirthDateMonth to AUTOFILL_HINT_BIRTH_DATE_MONTH,
-    BirthDateYear to AUTOFILL_HINT_BIRTH_DATE_YEAR,
-    SmsOtpCode to AUTOFILL_HINT_SMS_OTP
-)
+private val androidAutofillTypes: HashMap<AutofillType, String> =
+    hashMapOf(
+        EmailAddress to AUTOFILL_HINT_EMAIL_ADDRESS,
+        Username to AUTOFILL_HINT_USERNAME,
+        Password to AUTOFILL_HINT_PASSWORD,
+        NewUsername to AUTOFILL_HINT_NEW_USERNAME,
+        NewPassword to AUTOFILL_HINT_NEW_PASSWORD,
+        PostalAddress to AUTOFILL_HINT_POSTAL_ADDRESS,
+        PostalCode to AUTOFILL_HINT_POSTAL_CODE,
+        CreditCardNumber to AUTOFILL_HINT_CREDIT_CARD_NUMBER,
+        CreditCardSecurityCode to AUTOFILL_HINT_CREDIT_CARD_SECURITY_CODE,
+        CreditCardExpirationDate to AUTOFILL_HINT_CREDIT_CARD_EXPIRATION_DATE,
+        CreditCardExpirationMonth to AUTOFILL_HINT_CREDIT_CARD_EXPIRATION_MONTH,
+        CreditCardExpirationYear to AUTOFILL_HINT_CREDIT_CARD_EXPIRATION_YEAR,
+        CreditCardExpirationDay to AUTOFILL_HINT_CREDIT_CARD_EXPIRATION_DAY,
+        AddressCountry to AUTOFILL_HINT_POSTAL_ADDRESS_COUNTRY,
+        AddressRegion to AUTOFILL_HINT_POSTAL_ADDRESS_REGION,
+        AddressLocality to AUTOFILL_HINT_POSTAL_ADDRESS_LOCALITY,
+        AddressStreet to AUTOFILL_HINT_POSTAL_ADDRESS_STREET_ADDRESS,
+        AddressAuxiliaryDetails to AUTOFILL_HINT_POSTAL_ADDRESS_EXTENDED_ADDRESS,
+        PostalCodeExtended to AUTOFILL_HINT_POSTAL_ADDRESS_EXTENDED_POSTAL_CODE,
+        PersonFullName to AUTOFILL_HINT_PERSON_NAME,
+        PersonFirstName to AUTOFILL_HINT_PERSON_NAME_GIVEN,
+        PersonLastName to AUTOFILL_HINT_PERSON_NAME_FAMILY,
+        PersonMiddleName to AUTOFILL_HINT_PERSON_NAME_MIDDLE,
+        PersonMiddleInitial to AUTOFILL_HINT_PERSON_NAME_MIDDLE_INITIAL,
+        PersonNamePrefix to AUTOFILL_HINT_PERSON_NAME_PREFIX,
+        PersonNameSuffix to AUTOFILL_HINT_PERSON_NAME_SUFFIX,
+        PhoneNumber to AUTOFILL_HINT_PHONE_NUMBER,
+        PhoneNumberDevice to AUTOFILL_HINT_PHONE_NUMBER_DEVICE,
+        PhoneCountryCode to AUTOFILL_HINT_PHONE_COUNTRY_CODE,
+        PhoneNumberNational to AUTOFILL_HINT_PHONE_NATIONAL,
+        Gender to AUTOFILL_HINT_GENDER,
+        BirthDateFull to AUTOFILL_HINT_BIRTH_DATE_FULL,
+        BirthDateDay to AUTOFILL_HINT_BIRTH_DATE_DAY,
+        BirthDateMonth to AUTOFILL_HINT_BIRTH_DATE_MONTH,
+        BirthDateYear to AUTOFILL_HINT_BIRTH_DATE_YEAR,
+        SmsOtpCode to AUTOFILL_HINT_SMS_OTP
+    )
diff --git a/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/autofill/AndroidSemanticAutofill.android.kt b/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/autofill/AndroidSemanticAutofill.android.kt
index ecfbaef..cf45f4f 100644
--- a/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/autofill/AndroidSemanticAutofill.android.kt
+++ b/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/autofill/AndroidSemanticAutofill.android.kt
@@ -90,8 +90,8 @@
     // current and previous trees in onSemanticsChange(). We use SemanticsNodeCopy here because
     // SemanticsNode's children are dynamically generated and always reflect the current children.
     // We need to keep a copy of its old structure for comparison.
-    private var previousSemanticsNodes:
-        MutableIntObjectMap<SemanticsNodeCopy> = mutableIntObjectMapOf()
+    private var previousSemanticsNodes: MutableIntObjectMap<SemanticsNodeCopy> =
+        mutableIntObjectMapOf()
     private var previousSemanticsRoot =
         SemanticsNodeCopy(view.semanticsOwner.unmergedRootSemanticsNode, intObjectMapOf())
     private var checkingForSemanticsChanges = false
@@ -104,15 +104,14 @@
     internal var _TEMP_AUTOFILL_FLAG = false
 
     /**
-     * Delay before dispatching a recurring accessibility event in milliseconds.
-     * This delay guarantees that a recurring event will be send at most once
-     * during the [SendRecurringAutofillEventsIntervalMillis] time
-     * frame.
+     * Delay before dispatching a recurring accessibility event in milliseconds. This delay
+     * guarantees that a recurring event will be send at most once during the
+     * [SendRecurringAutofillEventsIntervalMillis] time frame.
      */
     internal var SendRecurringAutofillEventsIntervalMillis = 100L
 
-    internal var currentSemanticsNodes:
-        IntObjectMap<SemanticsNodeWithAdjustedBounds> = intObjectMapOf()
+    internal var currentSemanticsNodes: IntObjectMap<SemanticsNodeWithAdjustedBounds> =
+        intObjectMapOf()
         get() {
             if (currentSemanticsNodesInvalidated) { // first instance of retrieving all nodes
                 currentSemanticsNodesInvalidated = false
@@ -141,9 +140,7 @@
                 SemanticsNodeCopy(value.semanticsNode, currentSemanticsNodes)
         }
         previousSemanticsRoot =
-            SemanticsNodeCopy(
-                view.semanticsOwner.unmergedRootSemanticsNode, currentSemanticsNodes
-            )
+            SemanticsNodeCopy(view.semanticsOwner.unmergedRootSemanticsNode, currentSemanticsNodes)
     }
 
     private val autofillChangeChecker = Runnable {
@@ -161,9 +158,10 @@
             // We do this search because the new configuration is set as a whole, so we
             // can't indicate which property is changed when setting the new configuration.
             val previousNode = previousSemanticsNodes[id]
-            val currNode = checkPreconditionNotNull(newSemanticsNodes[id]?.semanticsNode) {
-                "no value for specified key"
-            }
+            val currNode =
+                checkPreconditionNotNull(newSemanticsNodes[id]?.semanticsNode) {
+                    "no value for specified key"
+                }
 
             if (previousNode == null) {
                 return@forEachKey
@@ -173,10 +171,8 @@
             // the previous and current values.
 
             // Check Editable Text —————————
-            val previousText = previousNode.unmergedConfig
-                .getOrNull(EditableText)?.text
-            val newText = currNode.unmergedConfig
-                .getOrNull(EditableText)?.text
+            val previousText = previousNode.unmergedConfig.getOrNull(EditableText)?.text
+            val newText = currNode.unmergedConfig.getOrNull(EditableText)?.text
             if (previousText != newText && newText != null) {
                 notifyAutofillValueChanged(id, newText)
             }
@@ -193,10 +189,8 @@
 
             // Check Visibility —————————
             if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O_MR1) {
-                val previousInvisible = previousNode.unmergedConfig
-                    .contains(InvisibleToUser)
-                val currInvisible = currNode.unmergedConfig
-                    .contains(InvisibleToUser)
+                val previousInvisible = previousNode.unmergedConfig.contains(InvisibleToUser)
+                val currInvisible = currNode.unmergedConfig.contains(InvisibleToUser)
                 if (previousInvisible != currInvisible) {
                     notifyVisibilityChanged(id, currInvisible)
                 }
@@ -231,15 +225,15 @@
     }
 
     private fun notifyAutofillValueChanged(semanticsId: Int, newAutofillValue: Any) {
-        val currSemanticsNode =
-            currentSemanticsNodes[semanticsId]?.semanticsNode
-        val currDataType =
-            currSemanticsNode?.unmergedConfig?.getOrNull(SemanticsContentDataType)
+        val currSemanticsNode = currentSemanticsNodes[semanticsId]?.semanticsNode
+        val currDataType = currSemanticsNode?.unmergedConfig?.getOrNull(SemanticsContentDataType)
 
         when (currDataType) {
-            ContentDataType.Text -> autofillManager.notifyValueChanged(
-                semanticsId, AutofillValue.forText(newAutofillValue.toString())
-            )
+            ContentDataType.Text ->
+                autofillManager.notifyValueChanged(
+                    semanticsId,
+                    AutofillValue.forText(newAutofillValue.toString())
+                )
             ContentDataType.Date ->
                 TODO("b/138604541: Add Autofill support for ContentDataType.Date")
             ContentDataType.List ->
@@ -253,7 +247,7 @@
     }
 
     private fun notifyVisibilityChanged(semanticsId: Int, isInvisible: Boolean) {
-       autofillManager.notifyViewVisibilityChanged(semanticsId, !isInvisible)
+        autofillManager.notifyViewVisibilityChanged(semanticsId, !isInvisible)
     }
 
     override fun notifyAutofillCommit() {
@@ -264,8 +258,11 @@
         // Use mapping to find lambda corresponding w semanticsNodeId,
         // then invoke the lambda. This will change the field text.
         val currSemanticsNode = currentSemanticsNodes[toFillId]?.semanticsNode
-        currSemanticsNode?.unmergedConfig?.getOrNull(OnAutofillText)
-            ?.action?.invoke(AnnotatedString(autofillValue))
+        currSemanticsNode
+            ?.unmergedConfig
+            ?.getOrNull(OnAutofillText)
+            ?.action
+            ?.invoke(AnnotatedString(autofillValue))
     }
 
     companion object {
@@ -283,7 +280,8 @@
                     when (event) {
                         EVENT_INPUT_SHOWN -> "Autofill popup was shown."
                         EVENT_INPUT_HIDDEN -> "Autofill popup was hidden."
-                        EVENT_INPUT_UNAVAILABLE -> """
+                        EVENT_INPUT_UNAVAILABLE ->
+                            """
                         |Autofill popup isn't shown because autofill is not available.
                         |
                         |Did you set up autofill?
@@ -294,24 +292,21 @@
                         |1. Go to Settings > System > Languages&input > Advanced
                         |2. Click on the settings icon next to the Autofill Service
                         |3. Add your account
-                        """.trimMargin()
+                        """
+                                .trimMargin()
                         else -> "Unknown status event."
                     }
                 )
             }
 
-            /**
-             * Registers the autofill debug callback.
-             */
+            /** Registers the autofill debug callback. */
             @ExperimentalComposeUiApi
             @DoNotInline
             fun register(semanticAutofill: AndroidSemanticAutofill) {
                 semanticAutofill.autofillManager.autofillManager.registerCallback(this)
             }
 
-            /**
-             * Unregisters the autofill debug callback.
-             */
+            /** Unregisters the autofill debug callback. */
             @ExperimentalComposeUiApi
             @DoNotInline
             fun unregister(semanticAutofill: AndroidSemanticAutofill) {
@@ -324,57 +319,44 @@
 @RequiresApi(Build.VERSION_CODES.O)
 internal fun AndroidSemanticAutofill.populateViewStructure(root: ViewStructure) {
     // Add child nodes. The function returns the index to the first item.
-    val count = currentSemanticsNodes.count { _, semanticsNodeWithAdjustedBounds ->
-        // TODO(333102566): remove the `isRelatedToAutofill` check below
-        //  for heuristics based autofill support.
-        semanticsNodeWithAdjustedBounds.semanticsNode.unmergedConfig.contains(ContentType) ||
-            semanticsNodeWithAdjustedBounds
-                .semanticsNode.unmergedConfig.contains(SemanticsContentDataType)
-    }
+    val count =
+        currentSemanticsNodes.count { _, semanticsNodeWithAdjustedBounds ->
+            // TODO(333102566): remove the `isRelatedToAutofill` check below
+            //  for heuristics based autofill support.
+            semanticsNodeWithAdjustedBounds.semanticsNode.unmergedConfig.contains(ContentType) ||
+                semanticsNodeWithAdjustedBounds.semanticsNode.unmergedConfig.contains(
+                    SemanticsContentDataType
+                )
+        }
     var index = AutofillApi26Helper.addChildCount(root, count)
 
     // Iterate through currentSemanticsNodes, finding autofill-related nodes
     // and call corresponding APIs on the viewStructure as listed above
     currentSemanticsNodes.forEach { semanticsId, adjustedNode ->
-        if (adjustedNode.semanticsNode.unmergedConfig.contains(ContentType) ||
-            adjustedNode.semanticsNode.unmergedConfig.contains(SemanticsContentDataType)) {
+        if (
+            adjustedNode.semanticsNode.unmergedConfig.contains(ContentType) ||
+                adjustedNode.semanticsNode.unmergedConfig.contains(SemanticsContentDataType)
+        ) {
             AutofillApi26Helper.newChild(root, index)?.also { child ->
                 AutofillApi26Helper.setAutofillId(
                     child,
                     AutofillApi26Helper.getAutofillId(root)!!,
                     semanticsId
                 )
-                AutofillApi26Helper.setId(
-                    child,
-                    semanticsId,
-                    view.context.packageName,
-                    null,
-                    null
-                )
+                AutofillApi26Helper.setId(child, semanticsId, view.context.packageName, null, null)
 
-                adjustedNode.semanticsNode.unmergedConfig
-                    .getOrNull(SemanticsContentDataType)
-                    ?.let {
-                    AutofillApi26Helper.setAutofillTypeForViewStruct(child,
-                        it
-                    )
+                adjustedNode.semanticsNode.unmergedConfig.getOrNull(SemanticsContentDataType)?.let {
+                    AutofillApi26Helper.setAutofillTypeForViewStruct(child, it)
                 }
 
                 adjustedNode.semanticsNode.unmergedConfig
                     .getOrNull(ContentType)
                     ?.contentHints
                     ?.toTypedArray()
-                    ?.let {
-                    AutofillApi26Helper.setAutofillHints(
-                        child,
-                        it
-                    )
-                }
+                    ?.let { AutofillApi26Helper.setAutofillHints(child, it) }
 
                 adjustedNode.adjustedBounds.run {
-                    AutofillApi26Helper.setDimens(
-                        child, left, top, 0, 0, width(), height()
-                    )
+                    AutofillApi26Helper.setDimens(child, left, top, 0, 0, width(), height())
                 }
 
                 adjustedNode.semanticsNode.populateViewStructure(child)
@@ -388,27 +370,13 @@
 @RequiresApi(Build.VERSION_CODES.O)
 internal fun SemanticsNode.populateViewStructure(child: ViewStructure) {
     // ———————— Interactions (clicking, checking, selecting, etc.)
-    AutofillApi26Helper.setClickable(
-        child,
-        unmergedConfig.contains(OnClick)
-    )
-    AutofillApi26Helper.setCheckable(
-        child,
-        unmergedConfig.contains(ToggleableState)
-    )
+    AutofillApi26Helper.setClickable(child, unmergedConfig.contains(OnClick))
+    AutofillApi26Helper.setCheckable(child, unmergedConfig.contains(ToggleableState))
     AutofillApi26Helper.setEnabled(child, (!config.contains(Disabled)))
-    AutofillApi26Helper.setFocused(
-        child,
-        unmergedConfig.getOrNull(Focused) == true
-    )
+    AutofillApi26Helper.setFocused(child, unmergedConfig.getOrNull(Focused) == true)
     AutofillApi26Helper.setFocusable(child, unmergedConfig.contains(Focused))
-    AutofillApi26Helper.setLongClickable(
-        child,
-        unmergedConfig.contains(OnLongClick)
-    )
-    unmergedConfig.getOrNull(Selected)?.let {
-        AutofillApi26Helper.setSelected(child, it)
-    }
+    AutofillApi26Helper.setLongClickable(child, unmergedConfig.contains(OnLongClick))
+    unmergedConfig.getOrNull(Selected)?.let { AutofillApi26Helper.setSelected(child, it) }
 
     unmergedConfig.getOrNull(ToggleableState)?.let {
         AutofillApi26Helper.setChecked(child, it == On)
@@ -418,10 +386,8 @@
     // ———————— Visibility, elevation, alpha
     AutofillApi26Helper.setVisibility(
         child,
-        if (!isTransparent && !unmergedConfig.contains(InvisibleToUser))
-            View.VISIBLE
-        else
-            View.INVISIBLE
+        if (!isTransparent && !unmergedConfig.contains(InvisibleToUser)) View.VISIBLE
+        else View.INVISIBLE
     )
 
     // TODO(335726351): will call the below method when b/335726351 has been fulfilled and
@@ -431,9 +397,7 @@
     // ———————— Text, role, content description
     config.getOrNull(Text)?.let { textList ->
         var concatenatedText = ""
-        textList.fastForEach { text ->
-            concatenatedText += text.text + "\n"
-        }
+        textList.fastForEach { text -> concatenatedText += text.text + "\n" }
         AutofillApi26Helper.setText(child, concatenatedText)
         AutofillApi26Helper.setClassName(child, TextClassName)
     }
@@ -458,11 +422,10 @@
         // autofill. (This data is used when we save autofilled values.)
         unmergedConfig.getOrNull(Text)?.let { textList ->
             var concatenatedText = ""
-            textList.fastForEach { text ->
-                concatenatedText += text.text + "\n"
-            }
+            textList.fastForEach { text -> concatenatedText += text.text + "\n" }
             AutofillApi26Helper.setAutofillValue(
-                child, AutofillApi26Helper.getAutofillTextValue(concatenatedText)
+                child,
+                AutofillApi26Helper.getAutofillTextValue(concatenatedText)
             )
         }
     }
@@ -510,7 +473,7 @@
         val value = values[itemId]
         when {
             AutofillApi26Helper.isText(value) -> // passing in the autofillID
-                onTextFillHelper(itemId, AutofillApi26Helper.textValue(value).toString())
+            onTextFillHelper(itemId, AutofillApi26Helper.textValue(value).toString())
             AutofillApi26Helper.isDate(value) ->
                 TODO("b/138604541: Add Autofill support for ContentDataType.Date")
             AutofillApi26Helper.isList(value) ->
@@ -521,61 +484,38 @@
     }
 }
 
-/**
- * Wrapper for the final AutofillManager class. This can be mocked in testing.
- */
+/** Wrapper for the final AutofillManager class. This can be mocked in testing. */
 @RequiresApi(Build.VERSION_CODES.O)
 internal interface AutofillManagerWrapper {
     val autofillManager: AutofillManager
 
-    fun notifyViewEntered(
-        semanticsId: Int,
-        bounds: Rect
-    )
+    fun notifyViewEntered(semanticsId: Int, bounds: Rect)
 
-    fun notifyViewExited(
-        semanticsId: Int
-    )
+    fun notifyViewExited(semanticsId: Int)
 
-    fun notifyValueChanged(
-        semanticsId: Int,
-        autofillValue: AutofillValue
-    )
+    fun notifyValueChanged(semanticsId: Int, autofillValue: AutofillValue)
 
-    fun notifyViewVisibilityChanged(
-        semanticsId: Int,
-        isVisible: Boolean
-    )
+    fun notifyViewVisibilityChanged(semanticsId: Int, isVisible: Boolean)
 
     fun commit()
 }
 
 @RequiresApi(Build.VERSION_CODES.O)
 private class AutofillManagerWrapperImpl(val view: AndroidComposeView) : AutofillManagerWrapper {
-    override val autofillManager = view.context.getSystemService(AutofillManager::class.java)
-        ?: error("Autofill service could not be located.")
+    override val autofillManager =
+        view.context.getSystemService(AutofillManager::class.java)
+            ?: error("Autofill service could not be located.")
 
     override fun notifyViewEntered(semanticsId: Int, bounds: Rect) {
-        autofillManager.notifyViewEntered(
-            view,
-            semanticsId,
-            bounds
-        )
+        autofillManager.notifyViewEntered(view, semanticsId, bounds)
     }
 
     override fun notifyViewExited(semanticsId: Int) {
-        autofillManager.notifyViewExited(
-            view,
-            semanticsId
-        )
+        autofillManager.notifyViewExited(view, semanticsId)
     }
 
     override fun notifyValueChanged(semanticsId: Int, autofillValue: AutofillValue) {
-        autofillManager.notifyValueChanged(
-            view,
-            semanticsId,
-            autofillValue
-        )
+        autofillManager.notifyValueChanged(view, semanticsId, autofillValue)
     }
 
     override fun notifyViewVisibilityChanged(semanticsId: Int, isVisible: Boolean) {
diff --git a/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/autofill/AutofillCallback.android.kt b/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/autofill/AutofillCallback.android.kt
index a7b4d15..6d3f8f1 100644
--- a/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/autofill/AutofillCallback.android.kt
+++ b/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/autofill/AutofillCallback.android.kt
@@ -27,8 +27,8 @@
 /**
  * Autofill Manager callback.
  *
- * This callback is called when we receive autofill events. It adds some logs that can be useful
- * for debug purposes.
+ * This callback is called when we receive autofill events. It adds some logs that can be useful for
+ * debug purposes.
  */
 @RequiresApi(Build.VERSION_CODES.O)
 internal object AutofillCallback : AutofillManager.AutofillCallback() {
@@ -39,7 +39,8 @@
             when (event) {
                 EVENT_INPUT_SHOWN -> "Autofill popup was shown."
                 EVENT_INPUT_HIDDEN -> "Autofill popup was hidden."
-                EVENT_INPUT_UNAVAILABLE -> """
+                EVENT_INPUT_UNAVAILABLE ->
+                    """
                         |Autofill popup isn't shown because autofill is not available.
                         |
                         |Did you set up autofill?
@@ -50,24 +51,21 @@
                         |1. Go to Settings > System > Languages&input > Advanced
                         |2. Click on the settings icon next to the Autofill Service
                         |3. Add your account
-                        """.trimMargin()
+                        """
+                        .trimMargin()
                 else -> "Unknown status event."
             }
         )
     }
 
-    /**
-     * Registers the autofill debug callback.
-     */
+    /** Registers the autofill debug callback. */
     @ExperimentalComposeUiApi
     @DoNotInline
     fun register(autofill: AndroidAutofill) {
         autofill.autofillManager.registerCallback(this)
     }
 
-    /**
-     * Unregisters the autofill debug callback.
-     */
+    /** Unregisters the autofill debug callback. */
     @ExperimentalComposeUiApi
     @DoNotInline
     fun unregister(autofill: AndroidAutofill) {
diff --git a/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/autofill/AutofillUtils.android.kt b/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/autofill/AutofillUtils.android.kt
index 3632bad..fbfd6d5e 100644
--- a/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/autofill/AutofillUtils.android.kt
+++ b/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/autofill/AutofillUtils.android.kt
@@ -27,22 +27,21 @@
 import androidx.compose.ui.semantics.Role
 
 /**
- * This class is here to ensure that the classes that use this API will get verified and can be
- * AOT compiled. It is expected that this class will soft-fail verification, but the classes
- * which use this method will pass.
+ * This class is here to ensure that the classes that use this API will get verified and can be AOT
+ * compiled. It is expected that this class will soft-fail verification, but the classes which use
+ * this method will pass.
  */
 @RequiresApi(28)
 internal object AutofillApi28Helper {
     @RequiresApi(28)
     @DoNotInline
-    fun setMaxTextLength(structure: ViewStructure, length: Int) =
-        structure.setMaxTextLength(length)
+    fun setMaxTextLength(structure: ViewStructure, length: Int) = structure.setMaxTextLength(length)
 }
 
 /**
- * This class is here to ensure that the classes that use this API will get verified and can be
- * AOT compiled. It is expected that this class will soft-fail verification, but the classes
- * which use this method will pass.
+ * This class is here to ensure that the classes that use this API will get verified and can be AOT
+ * compiled. It is expected that this class will soft-fail verification, but the classes which use
+ * this method will pass.
  */
 @RequiresApi(27)
 internal object AutofillApi27Helper {
@@ -59,21 +58,19 @@
 }
 
 /**
- * This class is here to ensure that the classes that use this API will get verified and can be
- * AOT compiled. It is expected that this class will soft-fail verification, but the classes
- * which use this method will pass.
+ * This class is here to ensure that the classes that use this API will get verified and can be AOT
+ * compiled. It is expected that this class will soft-fail verification, but the classes which use
+ * this method will pass.
  */
 @RequiresApi(26)
 internal object AutofillApi26Helper {
     @RequiresApi(26)
     @DoNotInline
-    fun newChild(structure: ViewStructure, index: Int): ViewStructure? =
-        structure.newChild(index)
+    fun newChild(structure: ViewStructure, index: Int): ViewStructure? = structure.newChild(index)
 
     @RequiresApi(26)
     @DoNotInline
-    fun addChildCount(structure: ViewStructure, num: Int) =
-        structure.addChildCount(num)
+    fun addChildCount(structure: ViewStructure, num: Int) = structure.addChildCount(num)
 
     @RequiresApi(26)
     @DoNotInline
@@ -97,25 +94,15 @@
         height: Int
     ) = structure.setDimens(left, top, scrollX, scrollY, width, height)
 
-    @RequiresApi(26)
-    @DoNotInline
-    fun getAutofillId(structure: ViewStructure) = structure.autofillId
+    @RequiresApi(26) @DoNotInline fun getAutofillId(structure: ViewStructure) = structure.autofillId
 
-    @RequiresApi(26)
-    @DoNotInline
-    fun isDate(value: AutofillValue) = value.isDate
+    @RequiresApi(26) @DoNotInline fun isDate(value: AutofillValue) = value.isDate
 
-    @RequiresApi(26)
-    @DoNotInline
-    fun isList(value: AutofillValue) = value.isList
+    @RequiresApi(26) @DoNotInline fun isList(value: AutofillValue) = value.isList
 
-    @RequiresApi(26)
-    @DoNotInline
-    fun isText(value: AutofillValue) = value.isText
+    @RequiresApi(26) @DoNotInline fun isText(value: AutofillValue) = value.isText
 
-    @RequiresApi(26)
-    @DoNotInline
-    fun isToggle(value: AutofillValue) = value.isToggle
+    @RequiresApi(26) @DoNotInline fun isToggle(value: AutofillValue) = value.isToggle
 
     @RequiresApi(26)
     @DoNotInline
@@ -148,8 +135,7 @@
 
     @RequiresApi(26)
     @DoNotInline
-    fun setChecked(structure: ViewStructure, checked: Boolean) =
-        structure.setChecked(checked)
+    fun setChecked(structure: ViewStructure, checked: Boolean) = structure.setChecked(checked)
 
     @RequiresApi(26)
     @DoNotInline
@@ -196,8 +182,7 @@
 
     @RequiresApi(26)
     @DoNotInline
-    fun setOpaque(structure: ViewStructure, isOpaque: Boolean) =
-        structure.setOpaque(isOpaque)
+    fun setOpaque(structure: ViewStructure, isOpaque: Boolean) = structure.setOpaque(isOpaque)
 
     @RequiresApi(26)
     @DoNotInline
@@ -223,9 +208,7 @@
     @DoNotInline
     fun booleanValue(value: AutofillValue): Boolean = value.toggleValue
 
-    @RequiresApi(26)
-    @DoNotInline
-    fun listValue(value: AutofillValue): Int = value.listValue
+    @RequiresApi(26) @DoNotInline fun listValue(value: AutofillValue): Int = value.listValue
 
     @RequiresApi(26)
     @DoNotInline
@@ -236,13 +219,14 @@
     @RequiresApi(26)
     @DoNotInline
     fun setAutofillTypeForViewStruct(child: ViewStructure, dataType: ContentDataType) {
-        val autofillType = when (dataType) {
-            ContentDataType.Text -> View.AUTOFILL_TYPE_TEXT
-            ContentDataType.Date -> View.AUTOFILL_TYPE_DATE
-            ContentDataType.Toggle -> View.AUTOFILL_TYPE_TOGGLE
-            ContentDataType.List -> View.AUTOFILL_TYPE_LIST
-            else -> View.AUTOFILL_TYPE_NONE
-        }
+        val autofillType =
+            when (dataType) {
+                ContentDataType.Text -> View.AUTOFILL_TYPE_TEXT
+                ContentDataType.Date -> View.AUTOFILL_TYPE_DATE
+                ContentDataType.Toggle -> View.AUTOFILL_TYPE_TOGGLE
+                ContentDataType.List -> View.AUTOFILL_TYPE_LIST
+                else -> View.AUTOFILL_TYPE_NONE
+            }
         setAutofillType(child, autofillType)
     }
 }
diff --git a/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/autofill/ContentDataType.android.kt b/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/autofill/ContentDataType.android.kt
index 7ef3295..0d6f9dd 100644
--- a/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/autofill/ContentDataType.android.kt
+++ b/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/autofill/ContentDataType.android.kt
@@ -26,15 +26,13 @@
 // actual typealias NativeContentDataType = Int
 
 @JvmInline
-internal actual value class ContentDataType actual constructor(
-    val dataType: Int
-) {
-        internal actual companion object {
-            actual val Text = ContentDataType(AUTOFILL_TYPE_TEXT)
-            actual val List = ContentDataType(AUTOFILL_TYPE_LIST)
-            actual val Date = ContentDataType(AUTOFILL_TYPE_DATE)
-            actual val Toggle = ContentDataType(AUTOFILL_TYPE_TOGGLE)
-            actual val None = ContentDataType(AUTOFILL_TYPE_NONE)
+internal actual value class ContentDataType actual constructor(val dataType: Int) {
+    internal actual companion object {
+        actual val Text = ContentDataType(AUTOFILL_TYPE_TEXT)
+        actual val List = ContentDataType(AUTOFILL_TYPE_LIST)
+        actual val Date = ContentDataType(AUTOFILL_TYPE_DATE)
+        actual val Toggle = ContentDataType(AUTOFILL_TYPE_TOGGLE)
+        actual val None = ContentDataType(AUTOFILL_TYPE_NONE)
 
         internal fun from(value: Int): ContentDataType {
             return when (value) {
diff --git a/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/autofill/ContentType.android.kt b/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/autofill/ContentType.android.kt
index d38a437b0..3789395 100644
--- a/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/autofill/ContentType.android.kt
+++ b/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/autofill/ContentType.android.kt
@@ -71,12 +71,10 @@
         actual val PostalCode = ContentType(AUTOFILL_HINT_POSTAL_CODE)
         actual val CreditCardNumber = ContentType(AUTOFILL_HINT_CREDIT_CARD_NUMBER)
         actual val CreditCardSecurityCode = ContentType(AUTOFILL_HINT_CREDIT_CARD_SECURITY_CODE)
-        actual val CreditCardExpirationDate =
-            ContentType(AUTOFILL_HINT_CREDIT_CARD_EXPIRATION_DATE)
+        actual val CreditCardExpirationDate = ContentType(AUTOFILL_HINT_CREDIT_CARD_EXPIRATION_DATE)
         actual val CreditCardExpirationMonth =
             ContentType(AUTOFILL_HINT_CREDIT_CARD_EXPIRATION_MONTH)
-        actual val CreditCardExpirationYear =
-            ContentType(AUTOFILL_HINT_CREDIT_CARD_EXPIRATION_YEAR)
+        actual val CreditCardExpirationYear = ContentType(AUTOFILL_HINT_CREDIT_CARD_EXPIRATION_YEAR)
         actual val CreditCardExpirationDay = ContentType(AUTOFILL_HINT_CREDIT_CARD_EXPIRATION_DAY)
         actual val AddressCountry = ContentType(AUTOFILL_HINT_POSTAL_ADDRESS_COUNTRY)
         actual val AddressRegion = ContentType(AUTOFILL_HINT_POSTAL_ADDRESS_REGION)
diff --git a/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/contentcapture/AndroidContentCaptureManager.android.kt b/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/contentcapture/AndroidContentCaptureManager.android.kt
index 23e60dd..6eb7a73 100644
--- a/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/contentcapture/AndroidContentCaptureManager.android.kt
+++ b/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/contentcapture/AndroidContentCaptureManager.android.kt
@@ -71,26 +71,29 @@
     var onContentCaptureSession: () -> ContentCaptureSessionCompat?
 ) : ContentCaptureManager, DefaultLifecycleObserver, View.OnAttachStateChangeListener {
 
-    @VisibleForTesting
-    internal var contentCaptureSession: ContentCaptureSessionCompat? = null
+    @VisibleForTesting internal var contentCaptureSession: ContentCaptureSessionCompat? = null
     private val bufferedAppearedNodes = MutableIntObjectMap<ViewStructureCompat>()
     private val bufferedDisappearedNodes = MutableIntSet()
 
     /**
-     * Delay before dispatching a recurring accessibility event in milliseconds.
-     * This delay guarantees that a recurring event will be send at most once
-     * during the [SendRecurringContentCaptureEventsIntervalMillis] time
-     * frame.
+     * Delay before dispatching a recurring accessibility event in milliseconds. This delay
+     * guarantees that a recurring event will be send at most once during the
+     * [SendRecurringContentCaptureEventsIntervalMillis] time frame.
      */
     private var SendRecurringContentCaptureEventsIntervalMillis = 100L
 
     /**
      * Indicates whether the translated information is show or hide in the [AndroidComposeView].
      *
-     * See [ViewTranslationCallback](https://cs.android.com/android/platform/superproject/+/refs/heads/master:frameworks/base/core/java/android/view/translation/ViewTranslationCallback.java)
+     * See
+     * [ViewTranslationCallback](https://cs.android.com/android/platform/superproject/+/refs/heads/master:frameworks/base/core/java/android/view/translation/ViewTranslationCallback.java)
      * for more details of the View translation API.
      */
-    private enum class TranslateStatus { SHOW_ORIGINAL, SHOW_TRANSLATED }
+    private enum class TranslateStatus {
+        SHOW_ORIGINAL,
+        SHOW_TRANSLATED
+    }
+
     private var translateStatus = TranslateStatus.SHOW_ORIGINAL
 
     private var currentSemanticsNodesInvalidated = true
@@ -99,12 +102,12 @@
     internal val handler = Handler(Looper.getMainLooper())
 
     /**
-     * Up to date semantics nodes in pruned semantics tree. It always reflects the current
-     * semantics tree. They key is the virtual view id(the root node has a key of
+     * Up to date semantics nodes in pruned semantics tree. It always reflects the current semantics
+     * tree. They key is the virtual view id(the root node has a key of
      * AccessibilityNodeProviderCompat.HOST_VIEW_ID and other node has a key of its id).
      */
-    internal var currentSemanticsNodes:
-        IntObjectMap<SemanticsNodeWithAdjustedBounds> = intObjectMapOf()
+    internal var currentSemanticsNodes: IntObjectMap<SemanticsNodeWithAdjustedBounds> =
+        intObjectMapOf()
         get() {
             if (currentSemanticsNodesInvalidated) { // first instance of retrieving all nodes
                 currentSemanticsNodesInvalidated = false
@@ -113,14 +116,15 @@
             }
             return field
         }
+
     private var currentSemanticsNodesSnapshotTimestampMillis = 0L
 
     // previousSemanticsNodes holds the previous pruned semantics tree so that we can compare the
     // current and previous trees in onSemanticsChange(). We use SemanticsNodeCopy here because
     // SemanticsNode's children are dynamically generated and always reflect the current children.
     // We need to keep a copy of its old structure for comparison.
-    private var previousSemanticsNodes:
-        MutableIntObjectMap<SemanticsNodeCopy> = mutableIntObjectMapOf()
+    private var previousSemanticsNodes: MutableIntObjectMap<SemanticsNodeCopy> =
+        mutableIntObjectMapOf()
     private var previousSemanticsRoot =
         SemanticsNodeCopy(view.semanticsOwner.unmergedRootSemanticsNode, intObjectMapOf())
     private var checkingForSemanticsChanges = false
@@ -149,17 +153,14 @@
         checkingForSemanticsChanges = false
     }
 
-    override fun onViewAttachedToWindow(v: View) {
-    }
+    override fun onViewAttachedToWindow(v: View) {}
 
     override fun onViewDetachedFromWindow(v: View) {
         handler.removeCallbacks(contentCaptureChangeChecker)
         contentCaptureSession = null
     }
 
-    /**
-     * True if any content capture service enabled in the system.
-     */
+    /** True if any content capture service enabled in the system. */
     @OptIn(ExperimentalComposeUiApi::class)
     internal val isEnabled: Boolean
         get() = ContentCaptureManager.isEnabled && contentCaptureSession != null
@@ -252,9 +253,10 @@
 
         newNode.replacedChildren.fastForEach { child ->
             if (currentSemanticsNodes.contains(child.id)) {
-                val prevNode = checkPreconditionNotNull(previousSemanticsNodes[child.id]) {
-                    "node not present in pruned tree before this change"
-                }
+                val prevNode =
+                    checkPreconditionNotNull(previousSemanticsNodes[child.id]) {
+                        "node not present in pruned tree before this change"
+                    }
                 sendSemanticsStructureChangeEvents(child, prevNode)
             }
         }
@@ -266,8 +268,7 @@
     ) {
         // Iterate the new tree to notify content capture appear
         newNode.replacedChildren.fastForEach { child ->
-            if (currentSemanticsNodes.contains(child.id) &&
-                !oldNode.children.contains(child.id)) {
+            if (currentSemanticsNodes.contains(child.id) && !oldNode.children.contains(child.id)) {
                 updateBuffersOnAppeared(child)
             }
         }
@@ -279,11 +280,14 @@
         }
 
         newNode.replacedChildren.fastForEach { child ->
-            if (currentSemanticsNodes.contains(child.id) &&
-                previousSemanticsNodes.contains(child.id)) {
-                val prevNodeCopy = checkPreconditionNotNull(previousSemanticsNodes[child.id]) {
-                    "node not present in pruned tree before this change"
-                }
+            if (
+                currentSemanticsNodes.contains(child.id) &&
+                    previousSemanticsNodes.contains(child.id)
+            ) {
+                val prevNodeCopy =
+                    checkPreconditionNotNull(previousSemanticsNodes[child.id]) {
+                        "node not present in pruned tree before this change"
+                    }
                 sendContentCaptureStructureChangeEvents(child, prevNodeCopy)
             }
         }
@@ -297,16 +301,17 @@
             // We do doing this search because the new configuration is set as a whole, so we
             // can't indicate which property is changed when setting the new configuration.
             val oldNode = previousSemanticsNodes[id]
-            val newNode = checkPreconditionNotNull(newSemanticsNodes[id]?.semanticsNode) {
-                "no value for specified key"
-            }
+            val newNode =
+                checkPreconditionNotNull(newSemanticsNodes[id]?.semanticsNode) {
+                    "no value for specified key"
+                }
 
             // Content capture requires events to be sent when an item is added/removed.
             if (oldNode == null) {
                 for (entry in newNode.unmergedConfig) {
                     if (entry.key != SemanticsProperties.Text) continue
-                    val newText = newNode.unmergedConfig.getOrNull(SemanticsProperties.Text)
-                        ?.firstOrNull()
+                    val newText =
+                        newNode.unmergedConfig.getOrNull(SemanticsProperties.Text)?.firstOrNull()
                     sendContentCaptureTextUpdateEvent(newNode.id, newText.toString())
                 }
                 return@forEachKey
@@ -315,10 +320,14 @@
             for (entry in newNode.unmergedConfig) {
                 when (entry.key) {
                     SemanticsProperties.Text -> {
-                        val oldText = oldNode.unmergedConfig.getOrNull(SemanticsProperties.Text)
-                            ?.firstOrNull()
-                        val newText = newNode.unmergedConfig.getOrNull(SemanticsProperties.Text)
-                            ?.firstOrNull()
+                        val oldText =
+                            oldNode.unmergedConfig
+                                .getOrNull(SemanticsProperties.Text)
+                                ?.firstOrNull()
+                        val newText =
+                            newNode.unmergedConfig
+                                .getOrNull(SemanticsProperties.Text)
+                                ?.firstOrNull()
                         if (oldText != newText) {
                             sendContentCaptureTextUpdateEvent(newNode.id, newText.toString())
                         }
@@ -347,9 +356,7 @@
                 SemanticsNodeCopy(value.semanticsNode, currentSemanticsNodes)
         }
         previousSemanticsRoot =
-            SemanticsNodeCopy(
-                view.semanticsOwner.unmergedRootSemanticsNode, currentSemanticsNodes
-            )
+            SemanticsNodeCopy(view.semanticsOwner.unmergedRootSemanticsNode, currentSemanticsNodes)
     }
 
     // Analogous to notifySubtreeAccessibilityStateChangedIfNeeded
@@ -367,13 +374,14 @@
 
         val rootAutofillId = ViewCompatShims.getAutofillId(view) ?: return null
         val parentNode = parent
-        val parentAutofillId = if (parentNode != null) {
-            session.newAutofillId(parentNode.id.toLong()) ?: return null
-        } else {
-            rootAutofillId.toAutofillId()
-        }
-        val structure = session.newVirtualViewStructure(
-            parentAutofillId, id.toLong()) ?: return null
+        val parentAutofillId =
+            if (parentNode != null) {
+                session.newAutofillId(parentNode.id.toLong()) ?: return null
+            } else {
+                rootAutofillId.toAutofillId()
+            }
+        val structure =
+            session.newVirtualViewStructure(parentAutofillId, id.toLong()) ?: return null
 
         val configuration = this.unmergedConfig
         if (configuration.contains(SemanticsProperties.Password)) {
@@ -384,7 +392,8 @@
         // This timestamp in the extra bundle is the equivalent substitution.
         structure.extras?.putLong(
             "android.view.contentcapture.EventTimestamp",
-            currentSemanticsNodesSnapshotTimestampMillis)
+            currentSemanticsNodesSnapshotTimestampMillis
+        )
 
         configuration.getOrNull(SemanticsProperties.TestTag)?.let {
             // Treat test tag as resourceId
@@ -412,9 +421,7 @@
         }
 
         with(boundsInParent) {
-            structure.setDimens(
-                left.toInt(), top.toInt(), 0, 0, width.toInt(), height.toInt()
-            )
+            structure.setDimens(left.toInt(), top.toInt(), 0, 0, width.toInt(), height.toInt())
         }
         return structure
     }
@@ -452,19 +459,19 @@
 
         if (bufferedAppearedNodes.isNotEmpty()) {
             session.notifyViewsAppeared(
-                mutableListOf<ViewStructureCompat>().apply {
-                    bufferedAppearedNodes.forEachValue { add(it) }
-                }
-                .fastMap { it.toViewStructure() })
+                mutableListOf<ViewStructureCompat>()
+                    .apply { bufferedAppearedNodes.forEachValue { add(it) } }
+                    .fastMap { it.toViewStructure() }
+            )
             bufferedAppearedNodes.clear()
         }
         if (bufferedDisappearedNodes.isNotEmpty()) {
             session.notifyViewsDisappeared(
-                mutableListOf<Int>().apply {
-                    bufferedDisappearedNodes.forEach { add(it) }
-                }
-                .fastMap { it.toLong() }
-                .toLongArray())
+                mutableListOf<Int>()
+                    .apply { bufferedDisappearedNodes.forEach { add(it) } }
+                    .fastMap { it.toLong() }
+                    .toLongArray()
+            )
             bufferedDisappearedNodes.clear()
         }
     }
@@ -485,21 +492,19 @@
             return
         }
         bufferContentCaptureViewDisappeared(node.id)
-        node.replacedChildren.fastForEach {
-                child -> updateBuffersOnDisappeared(child)
-        }
+        node.replacedChildren.fastForEach { child -> updateBuffersOnDisappeared(child) }
     }
 
     private fun updateTranslationOnAppeared(node: SemanticsNode) {
         val config = node.unmergedConfig
-        val isShowingTextSubstitution = config.getOrNull(
-            SemanticsProperties.IsShowingTextSubstitution)
+        val isShowingTextSubstitution =
+            config.getOrNull(SemanticsProperties.IsShowingTextSubstitution)
 
-        if (translateStatus == TranslateStatus.SHOW_ORIGINAL &&
-            isShowingTextSubstitution == true) {
+        if (translateStatus == TranslateStatus.SHOW_ORIGINAL && isShowingTextSubstitution == true) {
             config.getOrNull(SemanticsActions.ShowTextSubstitution)?.action?.invoke(false)
-        } else if (translateStatus == TranslateStatus.SHOW_TRANSLATED &&
-            isShowingTextSubstitution == false) {
+        } else if (
+            translateStatus == TranslateStatus.SHOW_TRANSLATED && isShowingTextSubstitution == false
+        ) {
             config.getOrNull(SemanticsActions.ShowTextSubstitution)?.action?.invoke(true)
         }
     }
@@ -526,9 +531,7 @@
         currentSemanticsNodes.forEachValue { node ->
             val config = node.semanticsNode.unmergedConfig
             if (config.getOrNull(SemanticsProperties.IsShowingTextSubstitution) == false) {
-                config.getOrNull(SemanticsActions.ShowTextSubstitution)?.action?.invoke(
-                    true
-                )
+                config.getOrNull(SemanticsActions.ShowTextSubstitution)?.action?.invoke(true)
             }
         }
     }
@@ -537,9 +540,7 @@
         currentSemanticsNodes.forEachValue { node ->
             val config = node.semanticsNode.unmergedConfig
             if (config.getOrNull(SemanticsProperties.IsShowingTextSubstitution) == true) {
-                config.getOrNull(SemanticsActions.ShowTextSubstitution)?.action?.invoke(
-                    false
-                )
+                config.getOrNull(SemanticsActions.ShowTextSubstitution)?.action?.invoke(false)
             }
         }
     }
@@ -566,20 +567,26 @@
         ) {
 
             virtualIds.forEach {
-                val node = contentCaptureManager.currentSemanticsNodes[it.toInt()]
-                    ?.semanticsNode ?: return@forEach
-                val requestBuilder = ViewTranslationRequest.Builder(
-                    contentCaptureManager.view.autofillId,
-                    node.id.toLong()
-                )
+                val node =
+                    contentCaptureManager.currentSemanticsNodes[it.toInt()]?.semanticsNode
+                        ?: return@forEach
+                val requestBuilder =
+                    ViewTranslationRequest.Builder(
+                        contentCaptureManager.view.autofillId,
+                        node.id.toLong()
+                    )
 
-                val text = AnnotatedString(
-                    node.unmergedConfig.getOrNull(SemanticsProperties.Text)
-                        ?.fastJoinToString("\n") ?: return@forEach)
+                val text =
+                    AnnotatedString(
+                        node.unmergedConfig
+                            .getOrNull(SemanticsProperties.Text)
+                            ?.fastJoinToString("\n") ?: return@forEach
+                    )
 
                 requestBuilder.setValue(
                     ViewTranslationRequest.ID_TEXT,
-                    TranslationRequestValue.forText(text))
+                    TranslationRequestValue.forText(text)
+                )
                 requestsCollector.accept(requestBuilder.build())
             }
         }
@@ -599,9 +606,7 @@
             if (Looper.getMainLooper().thread == Thread.currentThread()) {
                 doTranslation(contentCaptureManager, response)
             } else {
-                contentCaptureManager.view.post {
-                    doTranslation(contentCaptureManager, response)
-                }
+                contentCaptureManager.view.post { doTranslation(contentCaptureManager, response) }
             }
         }
 
@@ -611,13 +616,13 @@
         ) {
             for (key in response.keyIterator()) {
                 response.get(key)?.getValue(ViewTranslationRequest.ID_TEXT)?.text?.let {
-                    contentCaptureManager.currentSemanticsNodes[key.toInt()]
-                        ?.semanticsNode
-                        ?.let { semanticsNode ->
-                            semanticsNode.unmergedConfig
-                                .getOrNull(SemanticsActions.SetTextSubstitution)?.action
-                                ?.invoke(AnnotatedString(it.toString()))
-                        }
+                    contentCaptureManager.currentSemanticsNodes[key.toInt()]?.semanticsNode?.let {
+                        semanticsNode ->
+                        semanticsNode.unmergedConfig
+                            .getOrNull(SemanticsActions.SetTextSubstitution)
+                            ?.action
+                            ?.invoke(AnnotatedString(it.toString()))
+                    }
                 }
             }
         }
@@ -643,7 +648,8 @@
         response: LongSparseArray<ViewTranslationResponse?>
     ) {
         ViewTranslationHelperMethods.onVirtualViewTranslationResponses(
-            contentCaptureManager, response
+            contentCaptureManager,
+            response
         )
     }
 }
diff --git a/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/contentcapture/ContentCaptureManager.android.kt b/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/contentcapture/ContentCaptureManager.android.kt
index 9fd784a..a3c47b5 100644
--- a/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/contentcapture/ContentCaptureManager.android.kt
+++ b/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/contentcapture/ContentCaptureManager.android.kt
@@ -24,8 +24,8 @@
         /**
          * A flag to force disable the content capture feature.
          *
-         * If you find any issues with the new feature, flip this flag to true to confirm they are newly
-         * introduced then file a bug.
+         * If you find any issues with the new feature, flip this flag to true to confirm they are
+         * newly introduced then file a bug.
          */
         @Suppress("OPT_IN_MARKER_ON_WRONG_TARGET", "NullAnnotationGroup")
         @get:ExperimentalComposeUiApi
diff --git a/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/draganddrop/ComposeDragShadowBuilder.android.kt b/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/draganddrop/ComposeDragShadowBuilder.android.kt
index e89949b..e976b80 100644
--- a/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/draganddrop/ComposeDragShadowBuilder.android.kt
+++ b/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/draganddrop/ComposeDragShadowBuilder.android.kt
@@ -27,8 +27,8 @@
 import androidx.compose.ui.unit.LayoutDirection
 
 /**
- * Draws a drag shadow for a [View.DragShadowBuilder] with the DrawScope lambda
- * provided by [drawDragDecoration].
+ * Draws a drag shadow for a [View.DragShadowBuilder] with the DrawScope lambda provided by
+ * [drawDragDecoration].
  */
 internal class ComposeDragShadowBuilder(
     private val density: Density,
@@ -36,27 +36,23 @@
     private val drawDragDecoration: DrawScope.() -> Unit,
 ) : View.DragShadowBuilder() {
 
-    override fun onProvideShadowMetrics(
-        outShadowSize: Point,
-        outShadowTouchPoint: Point
-    ) = with(density) {
-        outShadowSize.set(
-            decorationSize.width.toDp().roundToPx(),
-            decorationSize.height.toDp().roundToPx()
-        )
-        outShadowTouchPoint.set(
-            outShadowSize.x / 2,
-            outShadowSize.y / 2
-        )
-    }
+    override fun onProvideShadowMetrics(outShadowSize: Point, outShadowTouchPoint: Point) =
+        with(density) {
+            outShadowSize.set(
+                decorationSize.width.toDp().roundToPx(),
+                decorationSize.height.toDp().roundToPx()
+            )
+            outShadowTouchPoint.set(outShadowSize.x / 2, outShadowSize.y / 2)
+        }
 
     override fun onDrawShadow(canvas: AndroidCanvas) {
-        CanvasDrawScope().draw(
-            density = density,
-            size = decorationSize,
-            layoutDirection = LayoutDirection.Ltr,
-            canvas = Canvas(canvas),
-            block = drawDragDecoration,
-        )
+        CanvasDrawScope()
+            .draw(
+                density = density,
+                size = decorationSize,
+                layoutDirection = LayoutDirection.Ltr,
+                canvas = Canvas(canvas),
+                block = drawDragDecoration,
+            )
     }
 }
diff --git a/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/draganddrop/DragAndDrop.android.kt b/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/draganddrop/DragAndDrop.android.kt
index 1d5e136..aab0a34 100644
--- a/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/draganddrop/DragAndDrop.android.kt
+++ b/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/draganddrop/DragAndDrop.android.kt
@@ -22,41 +22,35 @@
 import androidx.compose.ui.geometry.Offset
 
 /**
- * [DragAndDropTransferData] representation for the Android platform.
- * It provides the [ClipData] required for drag and drop.
+ * [DragAndDropTransferData] representation for the Android platform. It provides the [ClipData]
+ * required for drag and drop.
  */
 actual class DragAndDropTransferData(
-    /**
-     * The [ClipData] being transferred.
-     */
+    /** The [ClipData] being transferred. */
     val clipData: ClipData,
     /**
      * Optional local state for the DnD operation
+     *
      * @see [View.startDragAndDrop]
      */
     val localState: Any? = null,
     /**
      * Flags for the drag and drop operation.
+     *
      * @see [View.startDragAndDrop]
      */
     val flags: Int = 0,
 )
 
-/**
- * Android [DragAndDropEvent] which delegates to a [DragEvent]
- */
+/** Android [DragAndDropEvent] which delegates to a [DragEvent] */
 actual class DragAndDropEvent(
     internal val dragEvent: DragEvent,
 )
 
-/**
- * Returns the backing [DragEvent] to read platform specific data
- */
+/** Returns the backing [DragEvent] to read platform specific data */
 fun DragAndDropEvent.toAndroidDragEvent(): DragEvent = this.dragEvent
 
-/**
- * The mime types present in a [DragAndDropEvent]
- */
+/** The mime types present in a [DragAndDropEvent] */
 // TODO (TJ) make this expect/actual when desktop implements
 fun DragAndDropEvent.mimeTypes(): Set<String> {
     val clipDescription = dragEvent.clipDescription ?: return emptySet()
@@ -68,7 +62,4 @@
 }
 
 internal actual val DragAndDropEvent.positionInRoot: Offset
-    get() = Offset(
-        x = dragEvent.x,
-        y = dragEvent.y
-    )
+    get() = Offset(x = dragEvent.x, y = dragEvent.y)
diff --git a/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/focus/FocusInteropUtils.android.kt b/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/focus/FocusInteropUtils.android.kt
index f9ed473..30518ce 100644
--- a/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/focus/FocusInteropUtils.android.kt
+++ b/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/focus/FocusInteropUtils.android.kt
@@ -30,23 +30,21 @@
     }
 }
 
-/**
- * Converts an android focus direction to a compose [focus direction][FocusDirection].
- */
-internal fun toFocusDirection(androidDirection: Int): FocusDirection? = when (androidDirection) {
-    ViewGroup.FOCUS_UP -> FocusDirection.Up
-    ViewGroup.FOCUS_DOWN -> FocusDirection.Down
-    ViewGroup.FOCUS_LEFT -> FocusDirection.Left
-    ViewGroup.FOCUS_RIGHT -> FocusDirection.Right
-    ViewGroup.FOCUS_FORWARD -> FocusDirection.Next
-    ViewGroup.FOCUS_BACKWARD -> FocusDirection.Previous
-    else -> null
-}
+/** Converts an android focus direction to a compose [focus direction][FocusDirection]. */
+internal fun toFocusDirection(androidDirection: Int): FocusDirection? =
+    when (androidDirection) {
+        ViewGroup.FOCUS_UP -> FocusDirection.Up
+        ViewGroup.FOCUS_DOWN -> FocusDirection.Down
+        ViewGroup.FOCUS_LEFT -> FocusDirection.Left
+        ViewGroup.FOCUS_RIGHT -> FocusDirection.Right
+        ViewGroup.FOCUS_FORWARD -> FocusDirection.Next
+        ViewGroup.FOCUS_BACKWARD -> FocusDirection.Previous
+        else -> null
+    }
 
-/**
- * Converts a compose [focus direction][FocusDirection] to an android focus direction.
- */
-internal fun FocusDirection.toAndroidFocusDirection(): Int? = when (this) {
+/** Converts a compose [focus direction][FocusDirection] to an android focus direction. */
+internal fun FocusDirection.toAndroidFocusDirection(): Int? =
+    when (this) {
         FocusDirection.Up -> ViewGroup.FOCUS_UP
         FocusDirection.Down -> ViewGroup.FOCUS_DOWN
         FocusDirection.Left -> ViewGroup.FOCUS_LEFT
@@ -56,9 +54,7 @@
         else -> null
     }
 
-/**
- * Convert an Android layout direction to a compose [layout direction][LayoutDirection].
- */
+/** Convert an Android layout direction to a compose [layout direction][LayoutDirection]. */
 internal fun toLayoutDirection(androidLayoutDirection: Int): LayoutDirection? {
     return when (androidLayoutDirection) {
         android.util.LayoutDirection.LTR -> LayoutDirection.Ltr
@@ -67,9 +63,7 @@
     }
 }
 
-/**
- * Returns the bounding rect of the view in the current window.
- */
+/** Returns the bounding rect of the view in the current window. */
 internal fun View.calculateBoundingRect(): androidx.compose.ui.geometry.Rect {
     val focusedAndroidBounds = tempCoordinates.also { getLocationInWindow(it) }
     return androidx.compose.ui.geometry.Rect(
@@ -87,14 +81,15 @@
         isFocused -> true
         isFocusable && !hasFocus() -> requestFocus(direction, rect)
         this is AndroidComposeView -> requestFocus(direction, rect)
-        rect != null -> FocusFinder.getInstance()
-            .findNextFocusFromRect(this, rect, direction)?.requestFocus(direction, rect)
-            ?: requestFocus(direction, rect)
+        rect != null ->
+            FocusFinder.getInstance()
+                .findNextFocusFromRect(this, rect, direction)
+                ?.requestFocus(direction, rect) ?: requestFocus(direction, rect)
         else -> {
             val focusedView = if (hasFocus()) findFocus() else null
             FocusFinder.getInstance()
-                .findNextFocus(this, focusedView, direction)?.requestFocus(direction)
-                ?: requestFocus(direction)
+                .findNextFocus(this, focusedView, direction)
+                ?.requestFocus(direction) ?: requestFocus(direction)
         }
     }
 }
diff --git a/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/graphics/vector/compat/AndroidVectorResources.android.kt b/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/graphics/vector/compat/AndroidVectorResources.android.kt
index 0cb7728..1e1a884 100644
--- a/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/graphics/vector/compat/AndroidVectorResources.android.kt
+++ b/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/graphics/vector/compat/AndroidVectorResources.android.kt
@@ -16,23 +16,22 @@
 
 package androidx.compose.ui.graphics.vector.compat
 
-/**
- * Constants used to resolve VectorDrawable attributes during xml inflation
- */
+/** Constants used to resolve VectorDrawable attributes during xml inflation */
 internal object AndroidVectorResources {
 
     // Resources ID generated in the latest R.java for framework.
-    val STYLEABLE_VECTOR_DRAWABLE_TYPE_ARRAY = intArrayOf(
-        android.R.attr.name,
-        android.R.attr.tint,
-        android.R.attr.height,
-        android.R.attr.width,
-        android.R.attr.alpha,
-        android.R.attr.autoMirrored,
-        android.R.attr.tintMode,
-        android.R.attr.viewportWidth,
-        android.R.attr.viewportHeight
-    )
+    val STYLEABLE_VECTOR_DRAWABLE_TYPE_ARRAY =
+        intArrayOf(
+            android.R.attr.name,
+            android.R.attr.tint,
+            android.R.attr.height,
+            android.R.attr.width,
+            android.R.attr.alpha,
+            android.R.attr.autoMirrored,
+            android.R.attr.tintMode,
+            android.R.attr.viewportWidth,
+            android.R.attr.viewportHeight
+        )
     val STYLEABLE_VECTOR_DRAWABLE_ALPHA = 4
     val STYLEABLE_VECTOR_DRAWABLE_AUTO_MIRRORED = 5
     val STYLEABLE_VECTOR_DRAWABLE_HEIGHT = 2
@@ -42,16 +41,17 @@
     val STYLEABLE_VECTOR_DRAWABLE_VIEWPORT_HEIGHT = 8
     val STYLEABLE_VECTOR_DRAWABLE_VIEWPORT_WIDTH = 7
     val STYLEABLE_VECTOR_DRAWABLE_WIDTH = 3
-    val STYLEABLE_VECTOR_DRAWABLE_GROUP = intArrayOf(
-        android.R.attr.name,
-        android.R.attr.pivotX,
-        android.R.attr.pivotY,
-        android.R.attr.scaleX,
-        android.R.attr.scaleY,
-        android.R.attr.rotation,
-        android.R.attr.translateX,
-        android.R.attr.translateY
-    )
+    val STYLEABLE_VECTOR_DRAWABLE_GROUP =
+        intArrayOf(
+            android.R.attr.name,
+            android.R.attr.pivotX,
+            android.R.attr.pivotY,
+            android.R.attr.scaleX,
+            android.R.attr.scaleY,
+            android.R.attr.rotation,
+            android.R.attr.translateX,
+            android.R.attr.translateY
+        )
     val STYLEABLE_VECTOR_DRAWABLE_GROUP_NAME = 0
     val STYLEABLE_VECTOR_DRAWABLE_GROUP_PIVOT_X = 1
     val STYLEABLE_VECTOR_DRAWABLE_GROUP_PIVOT_Y = 2
@@ -60,23 +60,25 @@
     val STYLEABLE_VECTOR_DRAWABLE_GROUP_SCALE_Y = 4
     val STYLEABLE_VECTOR_DRAWABLE_GROUP_TRANSLATE_X = 6
     val STYLEABLE_VECTOR_DRAWABLE_GROUP_TRANSLATE_Y = 7
-    val STYLEABLE_VECTOR_DRAWABLE_PATH = intArrayOf(
-        android.R.attr.name,
-        android.R.attr.fillColor,
-        android.R.attr.pathData,
-        android.R.attr.strokeColor,
-        android.R.attr.strokeWidth,
-        android.R.attr.trimPathStart,
-        android.R.attr.trimPathEnd,
-        android.R.attr.trimPathOffset,
-        android.R.attr.strokeLineCap,
-        android.R.attr.strokeLineJoin,
-        android.R.attr.strokeMiterLimit,
-        android.R.attr.strokeAlpha,
-        android.R.attr.fillAlpha,
-        // android.R.attr.fillType is in API level 24+ use hardcoded value to extract the attribute if it exists
-        0x101051E
-    )
+    val STYLEABLE_VECTOR_DRAWABLE_PATH =
+        intArrayOf(
+            android.R.attr.name,
+            android.R.attr.fillColor,
+            android.R.attr.pathData,
+            android.R.attr.strokeColor,
+            android.R.attr.strokeWidth,
+            android.R.attr.trimPathStart,
+            android.R.attr.trimPathEnd,
+            android.R.attr.trimPathOffset,
+            android.R.attr.strokeLineCap,
+            android.R.attr.strokeLineJoin,
+            android.R.attr.strokeMiterLimit,
+            android.R.attr.strokeAlpha,
+            android.R.attr.fillAlpha,
+            // android.R.attr.fillType is in API level 24+ use hardcoded value to extract the
+            // attribute if it exists
+            0x101051E
+        )
     val STYLEABLE_VECTOR_DRAWABLE_PATH_FILL_ALPHA = 12
     val STYLEABLE_VECTOR_DRAWABLE_PATH_FILL_COLOR = 1
     val STYLEABLE_VECTOR_DRAWABLE_PATH_NAME = 0
diff --git a/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/graphics/vector/compat/XmlVectorParser.android.kt b/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/graphics/vector/compat/XmlVectorParser.android.kt
index a489ab9..0dc3d09 100644
--- a/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/graphics/vector/compat/XmlVectorParser.android.kt
+++ b/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/graphics/vector/compat/XmlVectorParser.android.kt
@@ -79,13 +79,12 @@
     }
 
 internal fun XmlPullParser.isAtEnd(): Boolean =
-    eventType == XmlPullParser.END_DOCUMENT ||
-        (depth < 1 && eventType == XmlPullParser.END_TAG)
+    eventType == XmlPullParser.END_DOCUMENT || (depth < 1 && eventType == XmlPullParser.END_TAG)
 
 /**
  * @param nestedGroups The number of additionally nested VectorGroups to represent clip paths.
  * @return The number of nested VectorGroups that are not `<group>` in XML, but represented as
- * VectorGroup in the [builder]. These are also popped when this function sees `</group>`.
+ *   VectorGroup in the [builder]. These are also popped when this function sees `</group>`.
  */
 internal fun AndroidVectorParser.parseCurrentVectorNode(
     res: Resources,
@@ -111,9 +110,7 @@
         }
         XmlPullParser.END_TAG -> {
             if (SHAPE_GROUP == xmlParser.name) {
-                repeat(nestedGroups + 1) {
-                    builder.clearGroup()
-                }
+                repeat(nestedGroups + 1) { builder.clearGroup() }
                 return 0
             }
         }
@@ -121,9 +118,7 @@
     return nestedGroups
 }
 
-/**
- * Helper method to seek to the first tag within the VectorDrawable xml asset
- */
+/** Helper method to seek to the first tag within the VectorDrawable xml asset */
 @Throws(XmlPullParserException::class)
 internal fun XmlPullParser.seekToStartTag(): XmlPullParser {
     var type = next()
@@ -136,38 +131,43 @@
     }
     return this
 }
+
 internal fun AndroidVectorParser.createVectorImageBuilder(
     res: Resources,
     theme: Resources.Theme?,
     attrs: AttributeSet
 ): ImageVector.Builder {
-    val vectorAttrs = obtainAttributes(
-        res,
-        theme,
-        attrs,
-        AndroidVectorResources.STYLEABLE_VECTOR_DRAWABLE_TYPE_ARRAY
-    )
+    val vectorAttrs =
+        obtainAttributes(
+            res,
+            theme,
+            attrs,
+            AndroidVectorResources.STYLEABLE_VECTOR_DRAWABLE_TYPE_ARRAY
+        )
 
-    val autoMirror = getNamedBoolean(
-        vectorAttrs,
-        "autoMirrored",
-        AndroidVectorResources.STYLEABLE_VECTOR_DRAWABLE_AUTO_MIRRORED,
-        false
-    )
+    val autoMirror =
+        getNamedBoolean(
+            vectorAttrs,
+            "autoMirrored",
+            AndroidVectorResources.STYLEABLE_VECTOR_DRAWABLE_AUTO_MIRRORED,
+            false
+        )
 
-    val viewportWidth = getNamedFloat(
-        vectorAttrs,
-        "viewportWidth",
-        AndroidVectorResources.STYLEABLE_VECTOR_DRAWABLE_VIEWPORT_WIDTH,
-        0.0f
-    )
+    val viewportWidth =
+        getNamedFloat(
+            vectorAttrs,
+            "viewportWidth",
+            AndroidVectorResources.STYLEABLE_VECTOR_DRAWABLE_VIEWPORT_WIDTH,
+            0.0f
+        )
 
-    val viewportHeight = getNamedFloat(
-        vectorAttrs,
-        "viewportHeight",
-        AndroidVectorResources.STYLEABLE_VECTOR_DRAWABLE_VIEWPORT_HEIGHT,
-        0.0f
-    )
+    val viewportHeight =
+        getNamedFloat(
+            vectorAttrs,
+            "viewportHeight",
+            AndroidVectorResources.STYLEABLE_VECTOR_DRAWABLE_VIEWPORT_HEIGHT,
+            0.0f
+        )
 
     if (viewportWidth <= 0) {
         throw XmlPullParserException(
@@ -179,60 +179,57 @@
         )
     }
 
-    val defaultWidth = getDimension(
-        vectorAttrs,
-        AndroidVectorResources.STYLEABLE_VECTOR_DRAWABLE_WIDTH, 0.0f
-    )
-    val defaultHeight = getDimension(
-        vectorAttrs,
-        AndroidVectorResources.STYLEABLE_VECTOR_DRAWABLE_HEIGHT, 0.0f
-    )
+    val defaultWidth =
+        getDimension(vectorAttrs, AndroidVectorResources.STYLEABLE_VECTOR_DRAWABLE_WIDTH, 0.0f)
+    val defaultHeight =
+        getDimension(vectorAttrs, AndroidVectorResources.STYLEABLE_VECTOR_DRAWABLE_HEIGHT, 0.0f)
 
-    val tintColor = if (
-        vectorAttrs.hasValue(AndroidVectorResources.STYLEABLE_VECTOR_DRAWABLE_TINT)
-    ) {
-        val value = TypedValue()
-        vectorAttrs.getValue(AndroidVectorResources.STYLEABLE_VECTOR_DRAWABLE_TINT, value)
-        // Unable to parse theme attributes outside of the framework here.
-        // This is a similar limitation to VectorDrawableCompat's parsing logic within
-        // updateStateFromTypedArray as TypedArray#extractThemeAttrs is not a public API
-        // ignore tint colors provided from the theme itself.
-        if (value.type == TypedValue.TYPE_ATTRIBUTE) {
-            Color.Unspecified
-        } else {
-            val tintColorStateList = getNamedColorStateList(
-                vectorAttrs, theme, "tint",
-                AndroidVectorResources.STYLEABLE_VECTOR_DRAWABLE_TINT
-            )
-            if (tintColorStateList != null) {
-                Color(tintColorStateList.defaultColor)
-            } else {
+    val tintColor =
+        if (vectorAttrs.hasValue(AndroidVectorResources.STYLEABLE_VECTOR_DRAWABLE_TINT)) {
+            val value = TypedValue()
+            vectorAttrs.getValue(AndroidVectorResources.STYLEABLE_VECTOR_DRAWABLE_TINT, value)
+            // Unable to parse theme attributes outside of the framework here.
+            // This is a similar limitation to VectorDrawableCompat's parsing logic within
+            // updateStateFromTypedArray as TypedArray#extractThemeAttrs is not a public API
+            // ignore tint colors provided from the theme itself.
+            if (value.type == TypedValue.TYPE_ATTRIBUTE) {
                 Color.Unspecified
+            } else {
+                val tintColorStateList =
+                    getNamedColorStateList(
+                        vectorAttrs,
+                        theme,
+                        "tint",
+                        AndroidVectorResources.STYLEABLE_VECTOR_DRAWABLE_TINT
+                    )
+                if (tintColorStateList != null) {
+                    Color(tintColorStateList.defaultColor)
+                } else {
+                    Color.Unspecified
+                }
             }
+        } else {
+            Color.Unspecified
         }
-    } else {
-        Color.Unspecified
-    }
 
-    val blendModeValue = getInt(
-        vectorAttrs,
-        AndroidVectorResources.STYLEABLE_VECTOR_DRAWABLE_TINT_MODE, -1
-    )
-    val tintBlendMode = if (blendModeValue != -1) {
-        when (blendModeValue) {
-            3 -> BlendMode.SrcOver
-            5 -> BlendMode.SrcIn
-            9 -> BlendMode.SrcAtop
-            // b/73224934 PorterDuff Multiply maps to Skia Modulate so actually
-            // return BlendMode.MODULATE here
-            14 -> BlendMode.Modulate
-            15 -> BlendMode.Screen
-            16 -> BlendMode.Plus
-            else -> BlendMode.SrcIn
+    val blendModeValue =
+        getInt(vectorAttrs, AndroidVectorResources.STYLEABLE_VECTOR_DRAWABLE_TINT_MODE, -1)
+    val tintBlendMode =
+        if (blendModeValue != -1) {
+            when (blendModeValue) {
+                3 -> BlendMode.SrcOver
+                5 -> BlendMode.SrcIn
+                9 -> BlendMode.SrcAtop
+                // b/73224934 PorterDuff Multiply maps to Skia Modulate so actually
+                // return BlendMode.MODULATE here
+                14 -> BlendMode.Modulate
+                15 -> BlendMode.Screen
+                16 -> BlendMode.Plus
+                else -> BlendMode.SrcIn
+            }
+        } else {
+            BlendMode.SrcIn
         }
-    } else {
-        BlendMode.SrcIn
-    }
 
     val defaultWidthDp = (defaultWidth / res.displayMetrics.density).dp
     val defaultHeightDp = (defaultHeight / res.displayMetrics.density).dp
@@ -257,12 +254,8 @@
     attrs: AttributeSet,
     builder: ImageVector.Builder
 ) {
-    val a = obtainAttributes(
-        res,
-        theme,
-        attrs,
-        AndroidVectorResources.STYLEABLE_VECTOR_DRAWABLE_PATH
-    )
+    val a =
+        obtainAttributes(res, theme, attrs, AndroidVectorResources.STYLEABLE_VECTOR_DRAWABLE_PATH)
 
     val hasPathData = TypedArrayUtils.hasAttribute(xmlParser, "pathData")
     if (!hasPathData) {
@@ -271,88 +264,107 @@
         throw IllegalArgumentException("No path data available")
     }
 
-    val name: String = getString(
-        a, AndroidVectorResources.STYLEABLE_VECTOR_DRAWABLE_PATH_NAME
-    ) ?: ""
+    val name: String =
+        getString(a, AndroidVectorResources.STYLEABLE_VECTOR_DRAWABLE_PATH_NAME) ?: ""
 
     val pathStr = getString(a, AndroidVectorResources.STYLEABLE_VECTOR_DRAWABLE_PATH_PATH_DATA)
-    val pathData: List<PathNode> = if (pathStr == null) {
-        EmptyPath
-    } else {
-        pathParser.pathStringToNodes(pathStr)
-    }
+    val pathData: List<PathNode> =
+        if (pathStr == null) {
+            EmptyPath
+        } else {
+            pathParser.pathStringToNodes(pathStr)
+        }
 
-    val fillColor = getNamedComplexColor(
-        a,
-        theme,
-        "fillColor",
-        AndroidVectorResources.STYLEABLE_VECTOR_DRAWABLE_PATH_FILL_COLOR, 0
-    )
-    val fillAlpha = getNamedFloat(
-        a,
-        "fillAlpha",
-        AndroidVectorResources.STYLEABLE_VECTOR_DRAWABLE_PATH_FILL_ALPHA, 1.0f
-    )
-    val lineCap = getNamedInt(
-        a,
-        "strokeLineCap",
-        AndroidVectorResources.STYLEABLE_VECTOR_DRAWABLE_PATH_STROKE_LINE_CAP, -1
-    )
+    val fillColor =
+        getNamedComplexColor(
+            a,
+            theme,
+            "fillColor",
+            AndroidVectorResources.STYLEABLE_VECTOR_DRAWABLE_PATH_FILL_COLOR,
+            0
+        )
+    val fillAlpha =
+        getNamedFloat(
+            a,
+            "fillAlpha",
+            AndroidVectorResources.STYLEABLE_VECTOR_DRAWABLE_PATH_FILL_ALPHA,
+            1.0f
+        )
+    val lineCap =
+        getNamedInt(
+            a,
+            "strokeLineCap",
+            AndroidVectorResources.STYLEABLE_VECTOR_DRAWABLE_PATH_STROKE_LINE_CAP,
+            -1
+        )
     val strokeLineCap = getStrokeLineCap(lineCap, StrokeCap.Butt)
-    val lineJoin = getNamedInt(
-        a,
-        "strokeLineJoin",
-        AndroidVectorResources.STYLEABLE_VECTOR_DRAWABLE_PATH_STROKE_LINE_JOIN, -1
-    )
-    val strokeLineJoin =
-        getStrokeLineJoin(lineJoin, StrokeJoin.Bevel)
-    val strokeMiterLimit = getNamedFloat(
-        a,
-        "strokeMiterLimit",
-        AndroidVectorResources.STYLEABLE_VECTOR_DRAWABLE_PATH_STROKE_MITER_LIMIT,
-        1.0f
-    )
-    val strokeColor = getNamedComplexColor(
-        a,
-        theme,
-        "strokeColor",
-        AndroidVectorResources.STYLEABLE_VECTOR_DRAWABLE_PATH_STROKE_COLOR, 0
-    )
-    val strokeAlpha = getNamedFloat(
-        a,
-        "strokeAlpha",
-        AndroidVectorResources.STYLEABLE_VECTOR_DRAWABLE_PATH_STROKE_ALPHA, 1.0f
-    )
-    val strokeLineWidth = getNamedFloat(
-        a,
-        "strokeWidth",
-        AndroidVectorResources.STYLEABLE_VECTOR_DRAWABLE_PATH_STROKE_WIDTH, 1.0f
-    )
+    val lineJoin =
+        getNamedInt(
+            a,
+            "strokeLineJoin",
+            AndroidVectorResources.STYLEABLE_VECTOR_DRAWABLE_PATH_STROKE_LINE_JOIN,
+            -1
+        )
+    val strokeLineJoin = getStrokeLineJoin(lineJoin, StrokeJoin.Bevel)
+    val strokeMiterLimit =
+        getNamedFloat(
+            a,
+            "strokeMiterLimit",
+            AndroidVectorResources.STYLEABLE_VECTOR_DRAWABLE_PATH_STROKE_MITER_LIMIT,
+            1.0f
+        )
+    val strokeColor =
+        getNamedComplexColor(
+            a,
+            theme,
+            "strokeColor",
+            AndroidVectorResources.STYLEABLE_VECTOR_DRAWABLE_PATH_STROKE_COLOR,
+            0
+        )
+    val strokeAlpha =
+        getNamedFloat(
+            a,
+            "strokeAlpha",
+            AndroidVectorResources.STYLEABLE_VECTOR_DRAWABLE_PATH_STROKE_ALPHA,
+            1.0f
+        )
+    val strokeLineWidth =
+        getNamedFloat(
+            a,
+            "strokeWidth",
+            AndroidVectorResources.STYLEABLE_VECTOR_DRAWABLE_PATH_STROKE_WIDTH,
+            1.0f
+        )
 
-    val trimPathEnd = getNamedFloat(
-        a,
-        "trimPathEnd",
-        AndroidVectorResources.STYLEABLE_VECTOR_DRAWABLE_PATH_TRIM_PATH_END, 1.0f
-    )
-    val trimPathOffset = getNamedFloat(
-        a,
-        "trimPathOffset",
-        AndroidVectorResources.STYLEABLE_VECTOR_DRAWABLE_PATH_TRIM_PATH_OFFSET,
-        0.0f
-    )
-    val trimPathStart = getNamedFloat(
-        a,
-        "trimPathStart",
-        AndroidVectorResources.STYLEABLE_VECTOR_DRAWABLE_PATH_TRIM_PATH_START,
-        0.0f
-    )
+    val trimPathEnd =
+        getNamedFloat(
+            a,
+            "trimPathEnd",
+            AndroidVectorResources.STYLEABLE_VECTOR_DRAWABLE_PATH_TRIM_PATH_END,
+            1.0f
+        )
+    val trimPathOffset =
+        getNamedFloat(
+            a,
+            "trimPathOffset",
+            AndroidVectorResources.STYLEABLE_VECTOR_DRAWABLE_PATH_TRIM_PATH_OFFSET,
+            0.0f
+        )
+    val trimPathStart =
+        getNamedFloat(
+            a,
+            "trimPathStart",
+            AndroidVectorResources.STYLEABLE_VECTOR_DRAWABLE_PATH_TRIM_PATH_START,
+            0.0f
+        )
 
-    val fillRule = getNamedInt(
-        a,
-        "fillType",
-        AndroidVectorResources.STYLEABLE_VECTOR_DRAWABLE_PATH_TRIM_PATH_FILLTYPE,
-        FILL_TYPE_WINDING
-    )
+    val fillRule =
+        getNamedInt(
+            a,
+            "fillType",
+            AndroidVectorResources.STYLEABLE_VECTOR_DRAWABLE_PATH_TRIM_PATH_FILLTYPE,
+            FILL_TYPE_WINDING
+        )
 
     a.recycle()
 
@@ -377,6 +389,7 @@
         trimPathOffset
     )
 }
+
 private fun obtainBrushFromComplexColor(complexColor: ComplexColorCompat): Brush? =
     if (complexColor.willDraw()) {
         val shader = complexColor.shader
@@ -395,44 +408,34 @@
     attrs: AttributeSet,
     builder: ImageVector.Builder
 ) {
-    val a = obtainAttributes(
-        res,
-        theme,
-        attrs,
-        AndroidVectorResources.STYLEABLE_VECTOR_DRAWABLE_CLIP_PATH,
-    )
+    val a =
+        obtainAttributes(
+            res,
+            theme,
+            attrs,
+            AndroidVectorResources.STYLEABLE_VECTOR_DRAWABLE_CLIP_PATH,
+        )
 
-    val name: String = getString(
-        a,
-        AndroidVectorResources.STYLEABLE_VECTOR_DRAWABLE_CLIP_PATH_NAME
-    ) ?: ""
-    val pathStr = getString(
-        a,
-        AndroidVectorResources.STYLEABLE_VECTOR_DRAWABLE_CLIP_PATH_PATH_DATA
-    )
+    val name: String =
+        getString(a, AndroidVectorResources.STYLEABLE_VECTOR_DRAWABLE_CLIP_PATH_NAME) ?: ""
+    val pathStr = getString(a, AndroidVectorResources.STYLEABLE_VECTOR_DRAWABLE_CLIP_PATH_PATH_DATA)
     val pathData = if (pathStr == null) EmptyPath else pathParser.pathStringToNodes(pathStr)
     a.recycle()
 
     // <clip-path> is parsed out as an additional VectorGroup.
     // This allows us to replicate the behavior of VectorDrawable where <clip-path> only affects
     // <path> that comes after it in <group>.
-    builder.addGroup(
-        name = name,
-        clipPathData = pathData
-    )
+    builder.addGroup(name = name, clipPathData = pathData)
 }
+
 internal fun AndroidVectorParser.parseGroup(
     res: Resources,
     theme: Resources.Theme?,
     attrs: AttributeSet,
     builder: ImageVector.Builder
 ) {
-    val a = obtainAttributes(
-        res,
-        theme,
-        attrs,
-        AndroidVectorResources.STYLEABLE_VECTOR_DRAWABLE_GROUP
-    )
+    val a =
+        obtainAttributes(res, theme, attrs, AndroidVectorResources.STYLEABLE_VECTOR_DRAWABLE_GROUP)
 
     // Account for any configuration changes.
     // mChangingConfigurations |= Utils.getChangingConfigurations(a);
@@ -441,57 +444,54 @@
     // mThemeAttrs = null // TODO TINT THEME Not supported yet a.extractThemeAttrs();
 
     // This is added in API 11
-    val rotate = getNamedFloat(
-        a,
-        "rotation",
-        AndroidVectorResources.STYLEABLE_VECTOR_DRAWABLE_GROUP_ROTATION,
-        DefaultRotation
-    )
+    val rotate =
+        getNamedFloat(
+            a,
+            "rotation",
+            AndroidVectorResources.STYLEABLE_VECTOR_DRAWABLE_GROUP_ROTATION,
+            DefaultRotation
+        )
 
-    val pivotX = getFloat(
-        a,
-        AndroidVectorResources.STYLEABLE_VECTOR_DRAWABLE_GROUP_PIVOT_X,
-        DefaultPivotX
-    )
-    val pivotY = getFloat(
-        a,
-        AndroidVectorResources.STYLEABLE_VECTOR_DRAWABLE_GROUP_PIVOT_Y,
-        DefaultPivotY
-    )
+    val pivotX =
+        getFloat(a, AndroidVectorResources.STYLEABLE_VECTOR_DRAWABLE_GROUP_PIVOT_X, DefaultPivotX)
+    val pivotY =
+        getFloat(a, AndroidVectorResources.STYLEABLE_VECTOR_DRAWABLE_GROUP_PIVOT_Y, DefaultPivotY)
 
     // This is added in API 11
-    val scaleX = getNamedFloat(
-        a,
-        "scaleX",
-        AndroidVectorResources.STYLEABLE_VECTOR_DRAWABLE_GROUP_SCALE_X,
-        DefaultScaleX
-    )
+    val scaleX =
+        getNamedFloat(
+            a,
+            "scaleX",
+            AndroidVectorResources.STYLEABLE_VECTOR_DRAWABLE_GROUP_SCALE_X,
+            DefaultScaleX
+        )
 
     // This is added in API 11
-    val scaleY = getNamedFloat(
-        a,
-        "scaleY",
-        AndroidVectorResources.STYLEABLE_VECTOR_DRAWABLE_GROUP_SCALE_Y,
-        DefaultScaleY
-    )
+    val scaleY =
+        getNamedFloat(
+            a,
+            "scaleY",
+            AndroidVectorResources.STYLEABLE_VECTOR_DRAWABLE_GROUP_SCALE_Y,
+            DefaultScaleY
+        )
 
-    val translateX = getNamedFloat(
-        a,
-        "translateX",
-        AndroidVectorResources.STYLEABLE_VECTOR_DRAWABLE_GROUP_TRANSLATE_X,
-        DefaultTranslationX
-    )
-    val translateY = getNamedFloat(
-        a,
-        "translateY",
-        AndroidVectorResources.STYLEABLE_VECTOR_DRAWABLE_GROUP_TRANSLATE_Y,
-        DefaultTranslationY
-    )
+    val translateX =
+        getNamedFloat(
+            a,
+            "translateX",
+            AndroidVectorResources.STYLEABLE_VECTOR_DRAWABLE_GROUP_TRANSLATE_X,
+            DefaultTranslationX
+        )
+    val translateY =
+        getNamedFloat(
+            a,
+            "translateY",
+            AndroidVectorResources.STYLEABLE_VECTOR_DRAWABLE_GROUP_TRANSLATE_Y,
+            DefaultTranslationY
+        )
 
-    val name: String = getString(
-        a,
-        AndroidVectorResources.STYLEABLE_VECTOR_DRAWABLE_GROUP_NAME
-    ) ?: ""
+    val name: String =
+        getString(a, AndroidVectorResources.STYLEABLE_VECTOR_DRAWABLE_GROUP_NAME) ?: ""
 
     a.recycle()
 
@@ -509,29 +509,24 @@
 }
 
 /**
- * Class responsible for parsing vector graphics attributes and keeping track of
- * which attributes depend on a configuration parameter.
- * This is used to determine which cached vector graphics objects can be pruned
- * during a configuration change as the vector graphic would need to be reloaded
- * if a corresponding configuration parameter changed.
+ * Class responsible for parsing vector graphics attributes and keeping track of which attributes
+ * depend on a configuration parameter. This is used to determine which cached vector graphics
+ * objects can be pruned during a configuration change as the vector graphic would need to be
+ * reloaded if a corresponding configuration parameter changed.
  *
- * For example, if the fill color for a path was dependent on the orientation of the device
- * the config flag would include the value [android.content.pm.ActivityInfo.CONFIG_ORIENTATION]
+ * For example, if the fill color for a path was dependent on the orientation of the device the
+ * config flag would include the value [android.content.pm.ActivityInfo.CONFIG_ORIENTATION]
  */
-internal data class AndroidVectorParser(
-    val xmlParser: XmlPullParser,
-    var config: Int = 0
-) {
-    @JvmField
-    internal val pathParser = PathParser()
+internal data class AndroidVectorParser(val xmlParser: XmlPullParser, var config: Int = 0) {
+    @JvmField internal val pathParser = PathParser()
 
     private fun updateConfig(resConfig: Int) {
         config = config or resConfig
     }
 
     /**
-     * Helper method to parse the attributre set update the configuration flags this
-     * that these attributes may depend on
+     * Helper method to parse the attributre set update the configuration flags this that these
+     * attributes may depend on
      */
     fun obtainAttributes(
         res: Resources,
@@ -539,20 +534,14 @@
         set: AttributeSet,
         attrs: IntArray
     ): TypedArray {
-        val typedArray = TypedArrayUtils.obtainAttributes(
-            res,
-            theme,
-            set,
-            attrs
-        )
+        val typedArray = TypedArrayUtils.obtainAttributes(res, theme, set, attrs)
         updateConfig(typedArray.changingConfigurations)
         return typedArray
     }
 
     /**
-     * Helper method to parse an int with the given resource identifier and
-     * attribute name as well as update the configuration flags this
-     * int may depend on.
+     * Helper method to parse an int with the given resource identifier and attribute name as well
+     * as update the configuration flags this int may depend on.
      */
     fun getNamedInt(
         typedArray: TypedArray,
@@ -561,22 +550,15 @@
         defaultValue: Int
     ): Int {
         with(typedArray) {
-            val result = TypedArrayUtils.getNamedInt(
-                this,
-                xmlParser,
-                attrName,
-                resId,
-                defaultValue
-            )
+            val result = TypedArrayUtils.getNamedInt(this, xmlParser, attrName, resId, defaultValue)
             updateConfig(changingConfigurations)
             return result
         }
     }
 
     /**
-     * Helper method to parse a float with the given resource identifier and
-     * attribute name as well as update the configuration flags this
-     * float may depend on.
+     * Helper method to parse a float with the given resource identifier and attribute name as well
+     * as update the configuration flags this float may depend on.
      */
     fun getNamedFloat(
         typedArray: TypedArray,
@@ -585,22 +567,16 @@
         defaultValue: Float
     ): Float {
         with(typedArray) {
-            val result = TypedArrayUtils.getNamedFloat(
-                this,
-                xmlParser,
-                attrName,
-                resId,
-                defaultValue
-            )
+            val result =
+                TypedArrayUtils.getNamedFloat(this, xmlParser, attrName, resId, defaultValue)
             updateConfig(changingConfigurations)
             return result
         }
     }
 
     /**
-     * Helper method to parse a boolean with the given resource identifier and
-     * attribute name as well as update the configuration flags this
-     * float may depend on.
+     * Helper method to parse a boolean with the given resource identifier and attribute name as
+     * well as update the configuration flags this float may depend on.
      */
     fun getNamedBoolean(
         typedArray: TypedArray,
@@ -609,36 +585,28 @@
         defaultValue: Boolean
     ): Boolean {
         with(typedArray) {
-            val result = TypedArrayUtils.getNamedBoolean(
-                this,
-                xmlParser,
-                attrName,
-                resId,
-                defaultValue
-            )
+            val result =
+                TypedArrayUtils.getNamedBoolean(this, xmlParser, attrName, resId, defaultValue)
             updateConfig(changingConfigurations)
             return result
         }
     }
 
     /**
-     * Helper method to parse a float with the given resource identifier
-     * and update the configuration flags this float may depend on.
+     * Helper method to parse a float with the given resource identifier and update the
+     * configuration flags this float may depend on.
      */
     fun getFloat(typedArray: TypedArray, index: Int, defaultValue: Float): Float {
         with(typedArray) {
-            val result = getFloat(
-                index,
-                defaultValue
-            )
+            val result = getFloat(index, defaultValue)
             updateConfig(changingConfigurations)
             return result
         }
     }
 
     /**
-     * Helper method to parse an int with the given resource identifier
-     * and update the configuration flags this int may depend on.
+     * Helper method to parse an int with the given resource identifier and update the configuration
+     * flags this int may depend on.
      */
     fun getInt(typedArray: TypedArray, index: Int, defaultValue: Int): Int {
         with(typedArray) {
@@ -649,8 +617,8 @@
     }
 
     /**
-     * Helper method to parse a String with the given resource identifier
-     * and update the configuration flags this String may depend on.
+     * Helper method to parse a String with the given resource identifier and update the
+     * configuration flags this String may depend on.
      */
     fun getString(typedArray: TypedArray, index: Int): String? {
         with(typedArray) {
@@ -661,8 +629,8 @@
     }
 
     /**
-     * Helper method to parse a dimension with the given resource identifier
-     * and update the configuration flags this dimension may depend on.
+     * Helper method to parse a dimension with the given resource identifier and update the
+     * configuration flags this dimension may depend on.
      */
     fun getDimension(typedArray: TypedArray, index: Int, defValue: Float): Float {
         with(typedArray) {
@@ -673,9 +641,8 @@
     }
 
     /**
-     * Helper method to parse a ComplexColor with the given resource identifier
-     * and name as well as update the configuration flags this
-     * ComplexColor may depend on.
+     * Helper method to parse a ComplexColor with the given resource identifier and name as well as
+     * update the configuration flags this ComplexColor may depend on.
      */
     fun getNamedComplexColor(
         typedArray: TypedArray,
@@ -685,22 +652,23 @@
         @ColorInt defaultValue: Int
     ): ComplexColorCompat {
         with(typedArray) {
-            val result = TypedArrayUtils.getNamedComplexColor(
-                this,
-                xmlParser,
-                theme,
-                attrName,
-                resId, defaultValue
-            )
+            val result =
+                TypedArrayUtils.getNamedComplexColor(
+                    this,
+                    xmlParser,
+                    theme,
+                    attrName,
+                    resId,
+                    defaultValue
+                )
             updateConfig(changingConfigurations)
             return result
         }
     }
 
     /**
-     * Helper method to parse a ColorStateList with the given resource identifier
-     * and name as well as update the configuration flags this
-     * ColorStateList may depend on.
+     * Helper method to parse a ColorStateList with the given resource identifier and name as well
+     * as update the configuration flags this ColorStateList may depend on.
      */
     fun getNamedColorStateList(
         typedArray: TypedArray,
@@ -709,13 +677,14 @@
         @StyleableRes resId: Int
     ): ColorStateList? {
         with(typedArray) {
-            val result = TypedArrayUtils.getNamedColorStateList(
-                typedArray,
-                xmlParser,
-                theme,
-                attrName,
-                resId
-            )
+            val result =
+                TypedArrayUtils.getNamedColorStateList(
+                    typedArray,
+                    xmlParser,
+                    theme,
+                    attrName,
+                    resId
+                )
             updateConfig(changingConfigurations)
             return result
         }
diff --git a/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/hapticfeedback/PlatformHapticFeedback.android.kt b/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/hapticfeedback/PlatformHapticFeedback.android.kt
index cd263ef..cfb1627 100644
--- a/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/hapticfeedback/PlatformHapticFeedback.android.kt
+++ b/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/hapticfeedback/PlatformHapticFeedback.android.kt
@@ -19,15 +19,10 @@
 import android.view.HapticFeedbackConstants
 import android.view.View
 
-/**
- * Android implementation for [HapticFeedback]
- */
-internal class PlatformHapticFeedback(private val view: View) :
-    HapticFeedback {
+/** Android implementation for [HapticFeedback] */
+internal class PlatformHapticFeedback(private val view: View) : HapticFeedback {
 
-    override fun performHapticFeedback(
-        hapticFeedbackType: HapticFeedbackType
-    ) {
+    override fun performHapticFeedback(hapticFeedbackType: HapticFeedbackType) {
         when (hapticFeedbackType) {
             HapticFeedbackType.LongPress ->
                 view.performHapticFeedback(HapticFeedbackConstants.LONG_PRESS)
@@ -38,9 +33,8 @@
 }
 
 internal actual object PlatformHapticFeedbackType {
-    actual val LongPress: HapticFeedbackType = HapticFeedbackType(
-        HapticFeedbackConstants.LONG_PRESS
-    )
+    actual val LongPress: HapticFeedbackType =
+        HapticFeedbackType(HapticFeedbackConstants.LONG_PRESS)
     actual val TextHandleMove: HapticFeedbackType =
         HapticFeedbackType(HapticFeedbackConstants.TEXT_HANDLE_MOVE)
 }
diff --git a/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/input/key/Key.android.kt b/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/input/key/Key.android.kt
index 2c2d80e..f1ea657 100644
--- a/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/input/key/Key.android.kt
+++ b/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/input/key/Key.android.kt
@@ -39,18 +39,16 @@
         /**
          * Soft Left key.
          *
-         * Usually situated below the display on phones and used as a multi-function
-         * feature key for selecting a software defined function shown on the bottom left
-         * of the display.
+         * Usually situated below the display on phones and used as a multi-function feature key for
+         * selecting a software defined function shown on the bottom left of the display.
          */
         actual val SoftLeft = Key(KeyEvent.KEYCODE_SOFT_LEFT)
 
         /**
          * Soft Right key.
          *
-         * Usually situated below the display on phones and used as a multi-function
-         * feature key for selecting a software defined function shown on the bottom right
-         * of the display.
+         * Usually situated below the display on phones and used as a multi-function feature key for
+         * selecting a software defined function shown on the bottom right of the display.
          */
         actual val SoftRight = Key(KeyEvent.KEYCODE_SOFT_RIGHT)
 
@@ -176,7 +174,7 @@
          */
         actual val VolumeDown = Key(KeyEvent.KEYCODE_VOLUME_DOWN)
 
-        /** Power key.  */
+        /** Power key. */
         actual val Power = Key(KeyEvent.KEYCODE_POWER)
 
         /**
@@ -407,16 +405,16 @@
         /**
          * Home Movement key.
          *
-         * Used for scrolling or moving the cursor around to the start of a line
-         * or to the top of a list.
+         * Used for scrolling or moving the cursor around to the start of a line or to the top of a
+         * list.
          */
         actual val MoveHome = Key(KeyEvent.KEYCODE_MOVE_HOME)
 
         /**
          * End Movement key.
          *
-         * Used for scrolling or moving the cursor around to the end of a line
-         * or to the bottom of a list.
+         * Used for scrolling or moving the cursor around to the end of a line or to the bottom of a
+         * list.
          */
         actual val MoveEnd = Key(KeyEvent.KEYCODE_MOVE_END)
 
@@ -463,8 +461,7 @@
         /**
          * Number modifier key.
          *
-         * Used to enter numeric symbols.
-         * This key is not Num Lock; it is more like  [AltLeft].
+         * Used to enter numeric symbols. This key is not Num Lock; it is more like [AltLeft].
          */
         actual val Number = Key(KeyEvent.KEYCODE_NUM)
 
@@ -514,96 +511,96 @@
         /**
          * A Button key.
          *
-         * On a game controller, the A button should be either the button labeled A
-         * or the first button on the bottom row of controller buttons.
+         * On a game controller, the A button should be either the button labeled A or the first
+         * button on the bottom row of controller buttons.
          */
         actual val ButtonA = Key(KeyEvent.KEYCODE_BUTTON_A)
 
         /**
          * B Button key.
          *
-         * On a game controller, the B button should be either the button labeled B
-         * or the second button on the bottom row of controller buttons.
+         * On a game controller, the B button should be either the button labeled B or the second
+         * button on the bottom row of controller buttons.
          */
         actual val ButtonB = Key(KeyEvent.KEYCODE_BUTTON_B)
 
         /**
          * C Button key.
          *
-         * On a game controller, the C button should be either the button labeled C
-         * or the third button on the bottom row of controller buttons.
+         * On a game controller, the C button should be either the button labeled C or the third
+         * button on the bottom row of controller buttons.
          */
         actual val ButtonC = Key(KeyEvent.KEYCODE_BUTTON_C)
 
         /**
          * X Button key.
          *
-         * On a game controller, the X button should be either the button labeled X
-         * or the first button on the upper row of controller buttons.
+         * On a game controller, the X button should be either the button labeled X or the first
+         * button on the upper row of controller buttons.
          */
         actual val ButtonX = Key(KeyEvent.KEYCODE_BUTTON_X)
 
         /**
          * Y Button key.
          *
-         * On a game controller, the Y button should be either the button labeled Y
-         * or the second button on the upper row of controller buttons.
+         * On a game controller, the Y button should be either the button labeled Y or the second
+         * button on the upper row of controller buttons.
          */
         actual val ButtonY = Key(KeyEvent.KEYCODE_BUTTON_Y)
 
         /**
          * Z Button key.
          *
-         * On a game controller, the Z button should be either the button labeled Z
-         * or the third button on the upper row of controller buttons.
+         * On a game controller, the Z button should be either the button labeled Z or the third
+         * button on the upper row of controller buttons.
          */
         actual val ButtonZ = Key(KeyEvent.KEYCODE_BUTTON_Z)
 
         /**
          * L1 Button key.
          *
-         * On a game controller, the L1 button should be either the button labeled L1 (or L)
-         * or the top left trigger button.
+         * On a game controller, the L1 button should be either the button labeled L1 (or L) or the
+         * top left trigger button.
          */
         actual val ButtonL1 = Key(KeyEvent.KEYCODE_BUTTON_L1)
 
         /**
          * R1 Button key.
          *
-         * On a game controller, the R1 button should be either the button labeled R1 (or R)
-         * or the top right trigger button.
+         * On a game controller, the R1 button should be either the button labeled R1 (or R) or the
+         * top right trigger button.
          */
         actual val ButtonR1 = Key(KeyEvent.KEYCODE_BUTTON_R1)
 
         /**
          * L2 Button key.
          *
-         * On a game controller, the L2 button should be either the button labeled L2
-         * or the bottom left trigger button.
+         * On a game controller, the L2 button should be either the button labeled L2 or the bottom
+         * left trigger button.
          */
         actual val ButtonL2 = Key(KeyEvent.KEYCODE_BUTTON_L2)
 
         /**
          * R2 Button key.
          *
-         * On a game controller, the R2 button should be either the button labeled R2
-         * or the bottom right trigger button.
+         * On a game controller, the R2 button should be either the button labeled R2 or the bottom
+         * right trigger button.
          */
         actual val ButtonR2 = Key(KeyEvent.KEYCODE_BUTTON_R2)
 
         /**
          * Left Thumb Button key.
          *
-         * On a game controller, the left thumb button indicates that the left (or only)
-         * joystick is pressed.
+         * On a game controller, the left thumb button indicates that the left (or only) joystick is
+         * pressed.
          */
         actual val ButtonThumbLeft = Key(KeyEvent.KEYCODE_BUTTON_THUMBL)
 
         /**
          * Right Thumb Button key.
          *
-         * On a game controller, the right thumb button indicates that the right
-         * joystick is pressed.
+         * On a game controller, the right thumb button indicates that the right joystick is
+         * pressed.
          */
         actual val ButtonThumbRight = Key(KeyEvent.KEYCODE_BUTTON_THUMBR)
 
@@ -722,8 +719,8 @@
         /**
          * Num Lock key.
          *
-         * This is the Num Lock key; it is different from [Number].
-         * This key alters the behavior of other keys on the numeric keypad.
+         * This is the Num Lock key; it is different from [Number]. This key alters the behavior of
+         * other keys on the numeric keypad.
          */
         actual val NumLock = Key(KeyEvent.KEYCODE_NUM_LOCK)
 
@@ -874,16 +871,16 @@
          *
          * Mutes the speaker, unlike [MicrophoneMute].
          *
-         * This key should normally be implemented as a toggle such that the first press
-         * mutes the speaker and the second press restores the original volume.
+         * This key should normally be implemented as a toggle such that the first press mutes the
+         * speaker and the second press restores the original volume.
          */
         actual val VolumeMute = Key(KeyEvent.KEYCODE_VOLUME_MUTE)
 
         /**
          * Info key.
          *
-         * Common on TV remotes to show additional information related to what is
-         * currently being viewed.
+         * Common on TV remotes to show additional information related to what is currently being
+         * viewed.
          */
         actual val Info = Key(KeyEvent.KEYCODE_INFO)
 
@@ -917,8 +914,8 @@
         /**
          * Window key.
          *
-         * On TV remotes, toggles picture-in-picture mode or other windowing functions.
-         * On Android Wear devices, triggers a display offset.
+         * On TV remotes, toggles picture-in-picture mode or other windowing functions. On Android
+         * Wear devices, triggers a display offset.
          */
         actual val Window = Key(KeyEvent.KEYCODE_WINDOW)
 
@@ -1037,18 +1034,18 @@
         /**
          * Language Switch key.
          *
-         * Toggles the current input language such as switching between English and Japanese on
-         * a QWERTY keyboard.  On some devices, the same function may be performed by
-         * pressing Shift+Space.
+         * Toggles the current input language such as switching between English and Japanese on a
+         * QWERTY keyboard. On some devices, the same function may be performed by pressing
+         * Shift+Space.
          */
         actual val LanguageSwitch = Key(KeyEvent.KEYCODE_LANGUAGE_SWITCH)
 
         /**
          * Manner Mode key.
          *
-         * Toggles silent or vibrate mode on and off to make the device behave more politely
-         * in certain settings such as on a crowded train.  On some devices, the key may only
-         * operate when long-pressed.
+         * Toggles silent or vibrate mode on and off to make the device behave more politely in
+         * certain settings such as on a crowded train. On some devices, the key may only operate
+         * when long-pressed.
          */
         actual val MannerMode = Key(KeyEvent.KEYCODE_MANNER_MODE)
 
@@ -1114,7 +1111,7 @@
         /**
          * Assist key.
          *
-         * Launches the global assist activity.  Not delivered to applications.
+         * Launches the global assist activity. Not delivered to applications.
          */
         actual val Assist = Key(KeyEvent.KEYCODE_ASSIST)
 
@@ -1135,28 +1132,27 @@
         /**
          * Sleep key.
          *
-         * Puts the device to sleep. Behaves somewhat like [Power] but it
-         * has no effect if the device is already asleep.
+         * Puts the device to sleep. Behaves somewhat like [Power] but it has no effect if the
+         * device is already asleep.
          */
         actual val Sleep = Key(KeyEvent.KEYCODE_SLEEP)
 
         /**
          * Wakeup key.
          *
-         * Wakes up the device.  Behaves somewhat like [Power] but it
-         * has no effect if the device is already awake.
+         * Wakes up the device. Behaves somewhat like [Power] but it has no effect if the device is
+         * already awake.
          */
         actual val WakeUp = Key(KeyEvent.KEYCODE_WAKEUP)
 
-        /** Put device to sleep unless a wakelock is held.  */
+        /** Put device to sleep unless a wakelock is held. */
         actual val SoftSleep = Key(KeyEvent.KEYCODE_SOFT_SLEEP)
 
         /**
          * Pairing key.
          *
-         * Initiates peripheral pairing mode. Useful for pairing remote control
-         * devices or game controllers, especially if no other input mode is
-         * available.
+         * Initiates peripheral pairing mode. Useful for pairing remote control devices or game
+         * controllers, especially if no other input mode is available.
          */
         actual val Pairing = Key(KeyEvent.KEYCODE_PAIRING)
 
@@ -1198,9 +1194,9 @@
         /**
          * Number entry key.
          *
-         * Initiates to enter multi-digit channel number when each digit key is assigned
-         * for selecting separate channel. Corresponds to Number Entry Mode (0x1D) of CEC
-         * User Control Code.
+         * Initiates to enter multi-digit channel number when each digit key is assigned for
+         * selecting separate channel. Corresponds to Number Entry Mode (0x1D) of CEC User Control
+         * Code.
          */
         actual val TvNumberEntry = Key(KeyEvent.KEYCODE_TV_NUMBER_ENTRY)
 
@@ -1361,16 +1357,16 @@
         /**
          * Media context menu key.
          *
-         * Goes to the context menu of media contents. Corresponds to Media Context-sensitive
-         * Menu (0x11) of CEC User Control Code.
+         * Goes to the context menu of media contents. Corresponds to Media Context-sensitive Menu
+         * (0x11) of CEC User Control Code.
          */
         actual val TvMediaContextMenu = Key(KeyEvent.KEYCODE_TV_MEDIA_CONTEXT_MENU)
 
         /**
          * Timer programming key.
          *
-         * Goes to the timer recording menu. Corresponds to Timer Programming (0x54) of
-         * CEC User Control Code.
+         * Goes to the timer recording menu. Corresponds to Timer Programming (0x54) of CEC User
+         * Control Code.
          */
         actual val TvTimerProgramming = Key(KeyEvent.KEYCODE_TV_TIMER_PROGRAMMING)
 
@@ -1403,8 +1399,8 @@
         actual val ThumbsDown = Key(KeyEvent.KEYCODE_THUMBS_DOWN)
 
         /**
-         * Used to switch current [account][android.accounts.Account] that is
-         * consuming content. May be consumed by system to set account globally.
+         * Used to switch current [account][android.accounts.Account] that is consuming content. May
+         * be consumed by system to set account globally.
          */
         actual val ProfileSwitch = Key(KeyEvent.KEYCODE_PROFILE_SWITCH)
     }
@@ -1412,9 +1408,7 @@
     actual override fun toString(): String = "Key code: $keyCode"
 }
 
-/**
- * The native keycode corresponding to this [Key].
- */
+/** The native keycode corresponding to this [Key]. */
 val Key.nativeKeyCode: Int
     get() = unpackInt1(keyCode)
 
diff --git a/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/input/key/KeyEvent.android.kt b/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/input/key/KeyEvent.android.kt
index 5d86bc3..b3f92ab 100644
--- a/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/input/key/KeyEvent.android.kt
+++ b/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/input/key/KeyEvent.android.kt
@@ -23,9 +23,7 @@
 import androidx.compose.ui.input.key.KeyEventType.Companion.KeyUp
 import androidx.compose.ui.input.key.KeyEventType.Companion.Unknown
 
-/**
- * The native Android [KeyEvent][NativeKeyEvent].
- */
+/** The native Android [KeyEvent][NativeKeyEvent]. */
 actual typealias NativeKeyEvent = android.view.KeyEvent
 
 /**
@@ -37,23 +35,23 @@
     get() = Key(nativeKeyEvent.keyCode)
 
 /**
- * The UTF16 value corresponding to the key event that was pressed. The unicode character
- * takes into account any meta keys that are pressed (eg. Pressing shift results in capital
- * alphabets). The UTF16 value uses the
- * [U+n notation][http://www.unicode.org/reports/tr27/#notation] of the Unicode Standard.
+ * The UTF16 value corresponding to the key event that was pressed. The unicode character takes into
+ * account any meta keys that are pressed (eg. Pressing shift results in capital alphabets). The
+ * UTF16 value uses the [U+n notation][http://www.unicode.org/reports/tr27/#notation] of the Unicode
+ * Standard.
  *
- * An [Int] is used instead of a [Char] so that we can support supplementary characters. The
- * Unicode Standard allows for characters whose representation requires more than 16 bits.
- * The range of legal code points is U+0000 to U+10FFFF, known as Unicode scalar value.
+ * An [Int] is used instead of a [Char] so that we can support supplementary characters. The Unicode
+ * Standard allows for characters whose representation requires more than 16 bits. The range of
+ * legal code points is U+0000 to U+10FFFF, known as Unicode scalar value.
  *
- * The set of characters from U+0000 to U+FFFF is sometimes referred to as the Basic
- * Multilingual Plane (BMP). Characters whose code points are greater than U+FFFF are called
- * supplementary characters. In this representation, supplementary characters are represented
- * as a pair of char values, the first from the high-surrogates range, (\uD800-\uDBFF), the
- * second from the low-surrogates range (\uDC00-\uDFFF).
+ * The set of characters from U+0000 to U+FFFF is sometimes referred to as the Basic Multilingual
+ * Plane (BMP). Characters whose code points are greater than U+FFFF are called supplementary
+ * characters. In this representation, supplementary characters are represented as a pair of char
+ * values, the first from the high-surrogates range, (\uD800-\uDBFF), the second from the
+ * low-surrogates range (\uDC00-\uDFFF).
  *
- * If the return value has bit [KeyCharacterMap.COMBINING_ACCENT] set, the key is a "dead key"
- * that should be combined with another to actually produce a character -- see
+ * If the return value has bit [KeyCharacterMap.COMBINING_ACCENT] set, the key is a "dead key" that
+ * should be combined with another to actually produce a character -- see
  * [KeyCharacterMap.getDeadChar] -- after masking with [KeyCharacterMap.COMBINING_ACCENT_MASK].
  */
 actual val KeyEvent.utf16CodePoint: Int
@@ -65,11 +63,12 @@
  * @sample androidx.compose.ui.samples.KeyEventTypeSample
  */
 actual val KeyEvent.type: KeyEventType
-    get() = when (nativeKeyEvent.action) {
-        ACTION_DOWN -> KeyDown
-        ACTION_UP -> KeyUp
-        else -> Unknown
-    }
+    get() =
+        when (nativeKeyEvent.action) {
+            ACTION_DOWN -> KeyDown
+            ACTION_UP -> KeyUp
+            else -> Unknown
+        }
 
 /**
  * Indicates whether the Alt key is pressed.
diff --git a/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/input/pointer/InternalPointerEvent.android.kt b/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/input/pointer/InternalPointerEvent.android.kt
index ebe21d4..195f161 100644
--- a/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/input/pointer/InternalPointerEvent.android.kt
+++ b/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/input/pointer/InternalPointerEvent.android.kt
@@ -22,7 +22,8 @@
 import androidx.compose.ui.util.fastFirstOrNull
 
 @OptIn(InternalCoreApi::class)
-internal actual class InternalPointerEvent actual constructor(
+internal actual class InternalPointerEvent
+actual constructor(
     actual val changes: LongSparseArray<PointerInputChange>,
     val pointerInputEvent: PointerInputEvent
 ) {
@@ -30,9 +31,7 @@
         get() = pointerInputEvent.motionEvent
 
     actual fun activeHoverEvent(pointerId: PointerId): Boolean =
-        pointerInputEvent.pointers.fastFirstOrNull {
-            it.id == pointerId
-        }?.activeHover ?: false
+        pointerInputEvent.pointers.fastFirstOrNull { it.id == pointerId }?.activeHover ?: false
 
     actual var suppressMovementConsumption: Boolean = false
 }
diff --git a/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/input/pointer/MotionEventAdapter.android.kt b/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/input/pointer/MotionEventAdapter.android.kt
index 114f1e5..9d62b33 100644
--- a/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/input/pointer/MotionEventAdapter.android.kt
+++ b/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/input/pointer/MotionEventAdapter.android.kt
@@ -41,9 +41,7 @@
 import androidx.compose.ui.ExperimentalComposeUiApi
 import androidx.compose.ui.geometry.Offset
 
-/**
- * Converts Android framework [MotionEvent]s into Compose [PointerInputEvent]s.
- */
+/** Converts Android framework [MotionEvent]s into Compose [PointerInputEvent]s. */
 internal class MotionEventAdapter {
 
     private var nextId = 0L
@@ -52,8 +50,7 @@
      * Whenever a new MotionEvent pointer is added, we create a new PointerId that is associated
      * with it. This holds that association.
      */
-    @VisibleForTesting
-    internal val motionEventToComposePointerIdMap = SparseLongArray()
+    @VisibleForTesting internal val motionEventToComposePointerIdMap = SparseLongArray()
 
     private val activeHoverIds = SparseBooleanArray()
 
@@ -66,8 +63,8 @@
     private var previousToolType = -1
 
     /**
-     * The previous event's source. This is used in combination with [previousToolType] to
-     * determine when a different device was used to send events.
+     * The previous event's source. This is used in combination with [previousToolType] to determine
+     * when a different device was used to send events.
      */
     private var previousSource = -1
 
@@ -79,7 +76,6 @@
      * internal state.
      *
      * @param motionEvent The MotionEvent to process.
-     *
      * @return The PointerInputEvent or null if the event action was ACTION_CANCEL.
      */
     internal fun convertToPointerInputEvent(
@@ -96,8 +92,10 @@
 
         addFreshIds(motionEvent)
 
-        val isHover = action == ACTION_HOVER_ENTER ||
-            action == ACTION_HOVER_MOVE || action == ACTION_HOVER_EXIT
+        val isHover =
+            action == ACTION_HOVER_ENTER ||
+                action == ACTION_HOVER_MOVE ||
+                action == ACTION_HOVER_EXIT
 
         val isScroll = action == ACTION_SCROLL
 
@@ -106,11 +104,12 @@
             activeHoverIds.put(hoverId, true)
         }
 
-        val upIndex = when (action) {
-            ACTION_UP -> 0
-            ACTION_POINTER_UP -> motionEvent.actionIndex
-            else -> -1
-        }
+        val upIndex =
+            when (action) {
+                ACTION_UP -> 0
+                ACTION_POINTER_UP -> motionEvent.actionIndex
+                else -> -1
+            }
 
         pointers.clear()
 
@@ -133,25 +132,19 @@
 
         removeStaleIds(motionEvent)
 
-        return PointerInputEvent(
-            motionEvent.eventTime,
-            pointers,
-            motionEvent
-        )
+        return PointerInputEvent(motionEvent.eventTime, pointers, motionEvent)
     }
 
     /**
-     * An ACTION_DOWN or ACTION_POINTER_DOWN was received, but not handled, so the stream should
-     * be considered ended.
+     * An ACTION_DOWN or ACTION_POINTER_DOWN was received, but not handled, so the stream should be
+     * considered ended.
      */
     fun endStream(pointerId: Int) {
         activeHoverIds.delete(pointerId)
         motionEventToComposePointerIdMap.delete(pointerId)
     }
 
-    /**
-     * Add any new pointer IDs.
-     */
+    /** Add any new pointer IDs. */
     private fun addFreshIds(motionEvent: MotionEvent) {
         when (motionEvent.actionMasked) {
             ACTION_HOVER_ENTER -> {
@@ -160,7 +153,6 @@
                     motionEventToComposePointerIdMap.put(pointerId, nextId++)
                 }
             }
-
             ACTION_DOWN,
             ACTION_POINTER_DOWN -> {
                 val actionIndex = motionEvent.actionIndex
@@ -176,8 +168,8 @@
     }
 
     /**
-     * Remove any raised pointers if they didn't previously hover. Anything that hovers
-     * will stay until a different event causes it to be removed.
+     * Remove any raised pointers if they didn't previously hover. Anything that hovers will stay
+     * until a different event causes it to be removed.
      */
     private fun removeStaleIds(motionEvent: MotionEvent) {
         when (motionEvent.actionMasked) {
@@ -217,20 +209,21 @@
 
     private fun getComposePointerId(motionEventPointerId: Int): PointerId {
         val pointerIndex = motionEventToComposePointerIdMap.indexOfKey(motionEventPointerId)
-        val id = if (pointerIndex >= 0) {
-            motionEventToComposePointerIdMap.valueAt(pointerIndex)
-        } else {
-            // An unexpected pointer was added or we may have previously removed it
-            val newId = nextId++
-            motionEventToComposePointerIdMap.put(motionEventPointerId, newId)
-            newId
-        }
+        val id =
+            if (pointerIndex >= 0) {
+                motionEventToComposePointerIdMap.valueAt(pointerIndex)
+            } else {
+                // An unexpected pointer was added or we may have previously removed it
+                val newId = nextId++
+                motionEventToComposePointerIdMap.put(motionEventPointerId, newId)
+                newId
+            }
         return PointerId(id)
     }
 
     /**
-     * When the device has changed (noted by source and tool type), we don't need to track
-     * any of the previous pointers.
+     * When the device has changed (noted by source and tool type), we don't need to track any of
+     * the previous pointers.
      */
     private fun clearOnDeviceChange(motionEvent: MotionEvent) {
         if (motionEvent.pointerCount != 1) {
@@ -247,9 +240,7 @@
         }
     }
 
-    /**
-     * Creates a new PointerInputEventData.
-     */
+    /** Creates a new PointerInputEventData. */
     @OptIn(ExperimentalComposeUiApi::class)
     private fun createPointerInputEventData(
         positionCalculator: PositionCalculator,
@@ -276,14 +267,15 @@
         } else {
             rawPosition = positionCalculator.localToScreen(position)
         }
-        val toolType = when (motionEvent.getToolType(index)) {
-            TOOL_TYPE_UNKNOWN -> PointerType.Unknown
-            TOOL_TYPE_FINGER -> PointerType.Touch
-            TOOL_TYPE_STYLUS -> PointerType.Stylus
-            TOOL_TYPE_MOUSE -> PointerType.Mouse
-            TOOL_TYPE_ERASER -> PointerType.Eraser
-            else -> PointerType.Unknown
-        }
+        val toolType =
+            when (motionEvent.getToolType(index)) {
+                TOOL_TYPE_UNKNOWN -> PointerType.Unknown
+                TOOL_TYPE_FINGER -> PointerType.Touch
+                TOOL_TYPE_STYLUS -> PointerType.Stylus
+                TOOL_TYPE_MOUSE -> PointerType.Mouse
+                TOOL_TYPE_ERASER -> PointerType.Eraser
+                else -> PointerType.Unknown
+            }
 
         val historical = ArrayList<HistoricalChange>(motionEvent.historySize)
         with(motionEvent) {
@@ -292,38 +284,41 @@
                 val y = getHistoricalY(index, pos)
                 if (x.isFinite() && y.isFinite()) {
                     val originalEventPosition = Offset(x, y) // hit path will convert to local
-                    val historicalChange = HistoricalChange(
-                        getHistoricalEventTime(pos),
-                        originalEventPosition,
-                        originalEventPosition
-                    )
+                    val historicalChange =
+                        HistoricalChange(
+                            getHistoricalEventTime(pos),
+                            originalEventPosition,
+                            originalEventPosition
+                        )
                     historical.add(historicalChange)
                 }
             }
         }
-        val scrollDelta = if (motionEvent.actionMasked == ACTION_SCROLL) {
-            val x = motionEvent.getAxisValue(MotionEvent.AXIS_HSCROLL)
-            val y = motionEvent.getAxisValue(MotionEvent.AXIS_VSCROLL)
-            // NOTE: we invert the y scroll offset because android is special compared to other
-            // platforms and uses the opposite sign for vertical mouse wheel scrolls. In order to
-            // support better x-platform mouse scroll, we invert the y-offset to be in line with
-            // desktop and web.
-            //
-            // This looks more natural, because when we scroll mouse wheel up,
-            // we move the wheel point (that touches the finger) up. And if we work in the usual
-            // coordinate system, it means we move that point by "-1".
-            //
-            // Web also behaves this way. See deltaY:
-            // https://developer.mozilla.org/en-US/docs/Web/API/Element/wheel_event
-            // https://jsfiddle.net/27zwteog
-            // (wheelDelta on the other hand is deprecated and inverted)
-            //
-            // We then add 0f to prevent injecting -0.0f into the pipeline, which can be
-            // problematic when doing comparisons.
-            Offset(x, -y + 0f)
-        } else {
-            Offset.Zero
-        }
+        val scrollDelta =
+            if (motionEvent.actionMasked == ACTION_SCROLL) {
+                val x = motionEvent.getAxisValue(MotionEvent.AXIS_HSCROLL)
+                val y = motionEvent.getAxisValue(MotionEvent.AXIS_VSCROLL)
+                // NOTE: we invert the y scroll offset because android is special compared to other
+                // platforms and uses the opposite sign for vertical mouse wheel scrolls. In order
+                // to
+                // support better x-platform mouse scroll, we invert the y-offset to be in line with
+                // desktop and web.
+                //
+                // This looks more natural, because when we scroll mouse wheel up,
+                // we move the wheel point (that touches the finger) up. And if we work in the usual
+                // coordinate system, it means we move that point by "-1".
+                //
+                // Web also behaves this way. See deltaY:
+                // https://developer.mozilla.org/en-US/docs/Web/API/Element/wheel_event
+                // https://jsfiddle.net/27zwteog
+                // (wheelDelta on the other hand is deprecated and inverted)
+                //
+                // We then add 0f to prevent injecting -0.0f into the pipeline, which can be
+                // problematic when doing comparisons.
+                Offset(x, -y + 0f)
+            } else {
+                Offset.Zero
+            }
 
         val activeHover = activeHoverIds.get(motionEvent.getPointerId(index), false)
         return PointerInputEventData(
@@ -343,9 +338,9 @@
 }
 
 /**
- * This class is here to ensure that the classes that use this API will get verified and can be
- * AOT compiled. It is expected that this class will soft-fail verification, but the classes
- * which use this method will pass.
+ * This class is here to ensure that the classes that use this API will get verified and can be AOT
+ * compiled. It is expected that this class will soft-fail verification, but the classes which use
+ * this method will pass.
  */
 @RequiresApi(Build.VERSION_CODES.Q)
 private object MotionEventHelper {
diff --git a/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/input/pointer/PointerEvent.android.kt b/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/input/pointer/PointerEvent.android.kt
index abce6ff..5e84515 100644
--- a/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/input/pointer/PointerEvent.android.kt
+++ b/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/input/pointer/PointerEvent.android.kt
@@ -24,24 +24,20 @@
 import androidx.compose.ui.util.fastForEach
 
 internal actual typealias NativePointerButtons = Int
+
 internal actual typealias NativePointerKeyboardModifiers = Int
 
-/**
- * Describes a pointer input change event that has occurred at a particular point in time.
- */
-actual class PointerEvent internal actual constructor(
-    /**
-     * The changes.
-     */
+/** Describes a pointer input change event that has occurred at a particular point in time. */
+actual class PointerEvent
+internal actual constructor(
+    /** The changes. */
     actual val changes: List<PointerInputChange>,
     internal val internalPointerEvent: InternalPointerEvent?
 ) {
     internal val motionEvent: MotionEvent?
         get() = internalPointerEvent?.motionEvent
 
-    /**
-     * @param changes The changes.
-     */
+    /** @param changes The changes. */
     actual constructor(changes: List<PointerInputChange>) : this(changes, null)
 
     actual val buttons = PointerButtons(motionEvent?.buttonState ?: 0)
@@ -64,7 +60,6 @@
                 MotionEvent.ACTION_HOVER_ENTER -> PointerEventType.Enter
                 MotionEvent.ACTION_HOVER_EXIT -> PointerEventType.Exit
                 ACTION_SCROLL -> PointerEventType.Scroll
-
                 else -> PointerEventType.Unknown
             }
         }
@@ -85,35 +80,34 @@
 
     // only because PointerEvent was a data class
     @OptIn(ExperimentalComposeUiApi::class)
-    fun copy(
-        changes: List<PointerInputChange>,
-        motionEvent: MotionEvent?
-    ): PointerEvent = when (motionEvent) {
-        null -> PointerEvent(changes, null)
-        this.motionEvent -> PointerEvent(changes, internalPointerEvent)
-        else -> {
-            val changesArray = LongSparseArray<PointerInputChange>(changes.size)
-            val pointerEventData = ArrayList<PointerInputEventData>(changes.size)
-            changes.fastForEach { change ->
-                changesArray.put(change.id.value, change)
-                pointerEventData += PointerInputEventData(
-                    change.id,
-                    change.uptimeMillis,
-                    change.position,
-                    change.position,
-                    change.pressed,
-                    change.pressure,
-                    change.type,
-                    this.internalPointerEvent?.activeHoverEvent(change.id) == true
-                )
-            }
+    fun copy(changes: List<PointerInputChange>, motionEvent: MotionEvent?): PointerEvent =
+        when (motionEvent) {
+            null -> PointerEvent(changes, null)
+            this.motionEvent -> PointerEvent(changes, internalPointerEvent)
+            else -> {
+                val changesArray = LongSparseArray<PointerInputChange>(changes.size)
+                val pointerEventData = ArrayList<PointerInputEventData>(changes.size)
+                changes.fastForEach { change ->
+                    changesArray.put(change.id.value, change)
+                    pointerEventData +=
+                        PointerInputEventData(
+                            change.id,
+                            change.uptimeMillis,
+                            change.position,
+                            change.position,
+                            change.pressed,
+                            change.pressure,
+                            change.type,
+                            this.internalPointerEvent?.activeHoverEvent(change.id) == true
+                        )
+                }
 
-            val pointerInputEvent =
-                PointerInputEvent(motionEvent.eventTime, pointerEventData, motionEvent)
-            val event = InternalPointerEvent(changesArray, pointerInputEvent)
-            PointerEvent(changes, event)
+                val pointerInputEvent =
+                    PointerInputEvent(motionEvent.eventTime, pointerEventData, motionEvent)
+                val event = InternalPointerEvent(changesArray, pointerInputEvent)
+                PointerEvent(changes, event)
+            }
         }
-    }
 }
 
 internal actual fun EmptyPointerKeyboardModifiers() = PointerKeyboardModifiers(0)
@@ -122,8 +116,8 @@
     get() = packedValue and (MotionEvent.BUTTON_PRIMARY or MotionEvent.BUTTON_STYLUS_PRIMARY) != 0
 
 actual val PointerButtons.isSecondaryPressed: Boolean
-    get() = packedValue and
-        (MotionEvent.BUTTON_SECONDARY or MotionEvent.BUTTON_STYLUS_SECONDARY) != 0
+    get() =
+        packedValue and (MotionEvent.BUTTON_SECONDARY or MotionEvent.BUTTON_STYLUS_SECONDARY) != 0
 
 actual val PointerButtons.isTertiaryPressed: Boolean
     get() = packedValue and MotionEvent.BUTTON_TERTIARY != 0
@@ -138,7 +132,9 @@
     when (buttonIndex) {
         0 -> isPrimaryPressed
         1 -> isSecondaryPressed
-        2, 3, 4 -> packedValue and (1 shl buttonIndex) != 0
+        2,
+        3,
+        4 -> packedValue and (1 shl buttonIndex) != 0
         else -> packedValue and (1 shl (buttonIndex + 2)) != 0
     }
 
diff --git a/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/input/pointer/PointerIcon.android.kt b/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/input/pointer/PointerIcon.android.kt
index d0ab04a..b884769 100644
--- a/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/input/pointer/PointerIcon.android.kt
+++ b/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/input/pointer/PointerIcon.android.kt
@@ -21,8 +21,7 @@
 import android.view.PointerIcon.TYPE_HAND
 import android.view.PointerIcon.TYPE_TEXT
 
-internal class AndroidPointerIconType(val type: Int) :
-    PointerIcon {
+internal class AndroidPointerIconType(val type: Int) : PointerIcon {
     override fun equals(other: Any?): Boolean {
         if (this === other) return true
         if (javaClass != other?.javaClass) return false
@@ -43,8 +42,7 @@
     }
 }
 
-internal class AndroidPointerIcon(val pointerIcon: android.view.PointerIcon) :
-    PointerIcon {
+internal class AndroidPointerIcon(val pointerIcon: android.view.PointerIcon) : PointerIcon {
     override fun equals(other: Any?): Boolean {
         if (this === other) return true
         if (javaClass != other?.javaClass) return false
@@ -63,17 +61,12 @@
     }
 }
 
-/**
- * Creates [PointerIcon] from [android.view.PointerIcon]
- */
+/** Creates [PointerIcon] from [android.view.PointerIcon] */
 fun PointerIcon(pointerIcon: android.view.PointerIcon): PointerIcon =
     AndroidPointerIcon(pointerIcon)
 
-/**
- * Creates [PointerIcon] from pointer icon type (see [android.view.PointerIcon.getSystemIcon]
- */
-fun PointerIcon(pointerIconType: Int): PointerIcon =
-    AndroidPointerIconType(pointerIconType)
+/** Creates [PointerIcon] from pointer icon type (see [android.view.PointerIcon.getSystemIcon] */
+fun PointerIcon(pointerIconType: Int): PointerIcon = AndroidPointerIconType(pointerIconType)
 
 internal actual val pointerIconDefault: PointerIcon = AndroidPointerIconType(TYPE_DEFAULT)
 internal actual val pointerIconCrosshair: PointerIcon = AndroidPointerIconType(TYPE_CROSSHAIR)
diff --git a/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/input/pointer/PointerInteropFilter.android.kt b/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/input/pointer/PointerInteropFilter.android.kt
index 8d5b474..d5cbc2d 100644
--- a/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/input/pointer/PointerInteropFilter.android.kt
+++ b/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/input/pointer/PointerInteropFilter.android.kt
@@ -42,25 +42,23 @@
 
 /**
  * A special PointerInputModifier that provides access to the underlying [MotionEvent]s originally
- * dispatched to Compose. Prefer [pointerInput] and use this only for interoperation with
- * existing code that consumes [MotionEvent]s.
+ * dispatched to Compose. Prefer [pointerInput] and use this only for interoperation with existing
+ * code that consumes [MotionEvent]s.
  *
  * While the main intent of this Modifier is to allow arbitrary code to access the original
  * [MotionEvent] dispatched to Compose, for completeness, analogs are provided to allow arbitrary
  * code to interact with the system as if it were an Android View.
  *
  * This includes 2 APIs,
- *
  * 1. [onTouchEvent] has a Boolean return type which is akin to the return type of
- * [View.onTouchEvent]. If the provided [onTouchEvent] returns true, it will continue to receive
- * the event stream (unless the event stream has been intercepted) and if it returns false, it will
- * not.
- *
- * 2. [requestDisallowInterceptTouchEvent] is a lambda that you can optionally provide so that
- * you can later call it (yes, in this case, you call the lambda that you provided) which is akin
- * to calling [ViewParent.requestDisallowInterceptTouchEvent]. When this is called, any
- * associated ancestors in the tree that abide by the contract will act accordingly and will not
- * intercept the even stream.
+ *    [View.onTouchEvent]. If the provided [onTouchEvent] returns true, it will continue to receive
+ *    the event stream (unless the event stream has been intercepted) and if it returns false, it
+ *    will not.
+ * 2. [requestDisallowInterceptTouchEvent] is a lambda that you can optionally provide so that you
+ *    can later call it (yes, in this case, you call the lambda that you provided) which is akin to
+ *    calling [ViewParent.requestDisallowInterceptTouchEvent]. When this is called, any associated
+ *    ancestors in the tree that abide by the contract will act accordingly and will not intercept
+ *    the even stream.
  *
  * @see [View.onTouchEvent]
  * @see [ViewParent.requestDisallowInterceptTouchEvent]
@@ -69,18 +67,21 @@
 fun Modifier.pointerInteropFilter(
     requestDisallowInterceptTouchEvent: (RequestDisallowInterceptTouchEvent)? = null,
     onTouchEvent: (MotionEvent) -> Boolean
-): Modifier = composed(
-    inspectorInfo = debugInspectorInfo {
-        name = "pointerInteropFilter"
-        properties["requestDisallowInterceptTouchEvent"] = requestDisallowInterceptTouchEvent
-        properties["onTouchEvent"] = onTouchEvent
+): Modifier =
+    composed(
+        inspectorInfo =
+            debugInspectorInfo {
+                name = "pointerInteropFilter"
+                properties["requestDisallowInterceptTouchEvent"] =
+                    requestDisallowInterceptTouchEvent
+                properties["onTouchEvent"] = onTouchEvent
+            }
+    ) {
+        val filter = remember { PointerInteropFilter() }
+        filter.onTouchEvent = onTouchEvent
+        filter.requestDisallowInterceptTouchEvent = requestDisallowInterceptTouchEvent
+        filter
     }
-) {
-    val filter = remember { PointerInteropFilter() }
-    filter.onTouchEvent = onTouchEvent
-    filter.requestDisallowInterceptTouchEvent = requestDisallowInterceptTouchEvent
-    filter
-}
 
 /**
  * Function that can be passed to [pointerInteropFilter] and then later invoked which provides an
@@ -96,8 +97,8 @@
 }
 
 /**
- * Similar to the 2 argument overload of [pointerInteropFilter], but connects
- * directly to an [AndroidViewHolder] for more seamless interop with Android.
+ * Similar to the 2 argument overload of [pointerInteropFilter], but connects directly to an
+ * [AndroidViewHolder] for more seamless interop with Android.
  */
 @ExperimentalComposeUiApi
 internal fun Modifier.pointerInteropFilter(view: AndroidViewHolder): Modifier {
@@ -129,35 +130,34 @@
  * The stateful part of pointerInteropFilter that manages the interop with Android.
  *
  * The intent of this PointerInputModifier is to allow Android Views and PointerInputModifiers to
- * interact seamlessly despite the differences in the 2 systems. Below is a detailed explanation
- * for how the interop is accomplished.
+ * interact seamlessly despite the differences in the 2 systems. Below is a detailed explanation for
+ * how the interop is accomplished.
  *
  * When the type of event is not a movement event, we dispatch to the Android View as soon as
- * possible (during [PointerEventPass.Initial]) so that the Android View can react to down
- * and up events before Compose PointerInputModifiers normally would.
+ * possible (during [PointerEventPass.Initial]) so that the Android View can react to down and up
+ * events before Compose PointerInputModifiers normally would.
  *
  * When the type of event is a movement event, we dispatch to the Android View during
- * [PointerEventPass.Final] to allow Compose PointerInputModifiers to react to movement first,
- * which mimics a parent [ViewGroup] intercepting the event stream.
+ * [PointerEventPass.Final] to allow Compose PointerInputModifiers to react to movement first, which
+ * mimics a parent [ViewGroup] intercepting the event stream.
  *
- * Whenever we are about to call [onTouchEvent], we check to see if anything in Compose
- * consumed any aspect of the pointer input changes, and if they did, we intercept the stream and
- * dispatch ACTION_CANCEL to the Android View if they have already returned true for a call to
+ * Whenever we are about to call [onTouchEvent], we check to see if anything in Compose consumed any
+ * aspect of the pointer input changes, and if they did, we intercept the stream and dispatch
+ * ACTION_CANCEL to the Android View if they have already returned true for a call to
  * View#dispatchTouchEvent(...).
  *
- * If we do call [onTouchEvent], and it returns true, we consume all of the changes so that
- * nothing in Compose also responds.
+ * If we do call [onTouchEvent], and it returns true, we consume all of the changes so that nothing
+ * in Compose also responds.
  *
- * If the [requestDisallowInterceptTouchEvent] is provided and called with true, we simply dispatch move
- * events during [PointerEventPass.Initial] so that normal PointerInputModifiers don't get a
- * chance to consume first.  Note:  This does mean that it is possible for a Compose
- * PointerInputModifier to "intercept" even after requestDisallowInterceptTouchEvent has been
- * called because consumption can occur during [PointerEventPass.Initial].  This may seem
- * like a flaw, but in reality, any PointerInputModifier that consumes that aggressively would
- * likely only do so after some consumption already occurred on a later pass, and this ability to
- * do so is on par with a [ViewGroup]'s ability to override [ViewGroup.dispatchTouchEvent]
- * instead of overriding the more usual [ViewGroup.onTouchEvent] and [ViewGroup
- * .onInterceptTouchEvent].
+ * If the [requestDisallowInterceptTouchEvent] is provided and called with true, we simply dispatch
+ * move events during [PointerEventPass.Initial] so that normal PointerInputModifiers don't get a
+ * chance to consume first. Note: This does mean that it is possible for a Compose
+ * PointerInputModifier to "intercept" even after requestDisallowInterceptTouchEvent has been called
+ * because consumption can occur during [PointerEventPass.Initial]. This may seem like a flaw, but
+ * in reality, any PointerInputModifier that consumes that aggressively would likely only do so
+ * after some consumption already occurred on a later pass, and this ability to do so is on par with
+ * a [ViewGroup]'s ability to override [ViewGroup.dispatchTouchEvent] instead of overriding the more
+ * usual [ViewGroup.onTouchEvent] and [ViewGroup .onInterceptTouchEvent].
  *
  * If [requestDisallowInterceptTouchEvent] is later called with false (the Android equivalent of
  * calling [ViewParent.requestDisallowInterceptTouchEvent] is exceedingly rare), we revert back to
@@ -178,24 +178,21 @@
             field = value
             field?.pointerInteropFilter = this
         }
+
     internal var disallowIntercept = false
 
-    /**
-     * The 3 possible states
-     */
+    /** The 3 possible states */
     private enum class DispatchToViewState {
-        /**
-         * We have yet to dispatch a new event stream to the child Android View.
-         */
+        /** We have yet to dispatch a new event stream to the child Android View. */
         Unknown,
         /**
-         * We have dispatched to the child Android View and it wants to continue to receive
-         * events for the current event stream.
+         * We have dispatched to the child Android View and it wants to continue to receive events
+         * for the current event stream.
          */
         Dispatching,
         /**
-         * We intercepted the event stream, or the Android View no longer wanted to receive
-         * events for the current event stream.
+         * We intercepted the event stream, or the Android View no longer wanted to receive events
+         * for the current event stream.
          */
         NotDispatching
     }
@@ -219,10 +216,11 @@
                 // we dispatch to Android as early as possible.  If the event is a move event and
                 // we can still intercept, we dispatch to Android after we have a chance to
                 // intercept due to movement.
-                val dispatchDuringInitialTunnel = disallowIntercept ||
-                    changes.fastAny {
-                        it.changedToDownIgnoreConsumed() || it.changedToUpIgnoreConsumed()
-                    }
+                val dispatchDuringInitialTunnel =
+                    disallowIntercept ||
+                        changes.fastAny {
+                            it.changedToDownIgnoreConsumed() || it.changedToUpIgnoreConsumed()
+                        }
 
                 if (state !== DispatchToViewState.NotDispatching) {
                     if (pass == PointerEventPass.Initial && dispatchDuringInitialTunnel) {
@@ -245,18 +243,14 @@
                 // If we are still dispatching to the Android View, we have to send them a
                 // cancel event, otherwise, we should not.
                 if (state === DispatchToViewState.Dispatching) {
-                    emptyCancelMotionEventScope(
-                        SystemClock.uptimeMillis()
-                    ) { motionEvent ->
+                    emptyCancelMotionEventScope(SystemClock.uptimeMillis()) { motionEvent ->
                         onTouchEvent(motionEvent)
                     }
                     reset()
                 }
             }
 
-            /**
-             * Resets all of our state to be ready for a "new event stream".
-             */
+            /** Resets all of our state to be ready for a "new event stream". */
             private fun reset() {
                 state = DispatchToViewState.Unknown
                 disallowIntercept = false
@@ -298,11 +292,12 @@
                         if (motionEvent.actionMasked == MotionEvent.ACTION_DOWN) {
                             // If the action is ACTION_DOWN, we care about the return value of
                             // onTouchEvent and use it to set our initial dispatching state.
-                            state = if (onTouchEvent(motionEvent)) {
-                                DispatchToViewState.Dispatching
-                            } else {
-                                DispatchToViewState.NotDispatching
-                            }
+                            state =
+                                if (onTouchEvent(motionEvent)) {
+                                    DispatchToViewState.Dispatching
+                                } else {
+                                    DispatchToViewState.NotDispatching
+                                }
                         } else {
                             // Otherwise, we don't care about the return value. This is intended
                             // to be in accordance with how the Android View system works.
@@ -311,9 +306,7 @@
                     }
                     if (state === DispatchToViewState.Dispatching) {
                         // If the Android View claimed the event, consume all changes.
-                        changes.fastForEach {
-                            it.consume()
-                        }
+                        changes.fastForEach { it.consume() }
                         pointerEvent.internalPointerEvent?.suppressMovementConsumption =
                             !disallowIntercept
                     }
diff --git a/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/input/pointer/PointerInteropUtils.android.kt b/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/input/pointer/PointerInteropUtils.android.kt
index f9cc561..6dba30c 100644
--- a/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/input/pointer/PointerInteropUtils.android.kt
+++ b/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/input/pointer/PointerInteropUtils.android.kt
@@ -28,10 +28,7 @@
  * @param offset The offset to be applied to the resulting [MotionEvent].
  * @param block The block to be executed with the resulting [MotionEvent].
  */
-internal fun PointerEvent.toMotionEventScope(
-    offset: Offset,
-    block: (MotionEvent) -> Unit
-) {
+internal fun PointerEvent.toMotionEventScope(offset: Offset, block: (MotionEvent) -> Unit) {
     toMotionEventScope(offset, block, false)
 }
 
@@ -41,10 +38,7 @@
  * @param offset The offset to be applied to the resulting [MotionEvent].
  * @param block The block to be executed with the resulting [MotionEvent].
  */
-internal fun PointerEvent.toCancelMotionEventScope(
-    offset: Offset,
-    block: (MotionEvent) -> Unit
-) {
+internal fun PointerEvent.toCancelMotionEventScope(offset: Offset, block: (MotionEvent) -> Unit) {
     toMotionEventScope(offset, block, true)
 }
 
@@ -53,8 +47,7 @@
     block: (MotionEvent) -> Unit
 ) {
     // Does what ViewGroup does when it needs to send a minimal ACTION_CANCEL event.
-    val motionEvent =
-        MotionEvent.obtain(nowMillis, nowMillis, ACTION_CANCEL, 0.0f, 0.0f, 0)
+    val motionEvent = MotionEvent.obtain(nowMillis, nowMillis, ACTION_CANCEL, 0.0f, 0.0f, 0)
     motionEvent.source = InputDevice.SOURCE_UNKNOWN
     block(motionEvent)
     motionEvent.recycle()
@@ -66,9 +59,7 @@
     cancel: Boolean
 ) {
     val motionEvent = motionEvent
-    requireNotNull(motionEvent) {
-        "The PointerEvent receiver cannot have a null MotionEvent."
-    }
+    requireNotNull(motionEvent) { "The PointerEvent receiver cannot have a null MotionEvent." }
 
     motionEvent.apply {
         val oldAction = action
diff --git a/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/input/rotary/RotaryScrollEvent.android.kt b/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/input/rotary/RotaryScrollEvent.android.kt
index 8c3e583..e4b5079 100644
--- a/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/input/rotary/RotaryScrollEvent.android.kt
+++ b/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/input/rotary/RotaryScrollEvent.android.kt
@@ -22,16 +22,17 @@
  * Some Wear OS devices contain a physical rotating side button, or a rotating bezel. When the user
  * turns the button or rotates the bezel, a [RotaryScrollEvent] is sent to the item in focus.
  */
-actual class RotaryScrollEvent internal constructor(
+actual class RotaryScrollEvent
+internal constructor(
     /**
-     * The amount to scroll (in pixels) in response to a [RotaryScrollEvent] in a container that
-     * can scroll vertically.
+     * The amount to scroll (in pixels) in response to a [RotaryScrollEvent] in a container that can
+     * scroll vertically.
      */
     actual val verticalScrollPixels: Float,
 
     /**
-     * The amount to scroll (in pixels) in response to a [RotaryScrollEvent] in a container that
-     * can scroll horizontally.
+     * The amount to scroll (in pixels) in response to a [RotaryScrollEvent] in a container that can
+     * scroll horizontally.
      */
     actual val horizontalScrollPixels: Float,
 
@@ -41,26 +42,26 @@
      */
     actual val uptimeMillis: Long,
 
-    /**
-     * The id for the input device that this event came from
-     */
+    /** The id for the input device that this event came from */
     val inputDeviceId: Int
 ) {
-    override fun equals(other: Any?): Boolean = other is RotaryScrollEvent &&
-        other.verticalScrollPixels == verticalScrollPixels &&
-        other.horizontalScrollPixels == horizontalScrollPixels &&
-        other.uptimeMillis == uptimeMillis &&
-        other.inputDeviceId == inputDeviceId
+    override fun equals(other: Any?): Boolean =
+        other is RotaryScrollEvent &&
+            other.verticalScrollPixels == verticalScrollPixels &&
+            other.horizontalScrollPixels == horizontalScrollPixels &&
+            other.uptimeMillis == uptimeMillis &&
+            other.inputDeviceId == inputDeviceId
 
-    override fun hashCode(): Int = 0
-        .let { verticalScrollPixels.hashCode() }
-        .let { 31 * it + horizontalScrollPixels.hashCode() }
-        .let { 31 * it + uptimeMillis.hashCode() }
-        .let { 31 * it + inputDeviceId.hashCode() }
+    override fun hashCode(): Int =
+        0.let { verticalScrollPixels.hashCode() }
+            .let { 31 * it + horizontalScrollPixels.hashCode() }
+            .let { 31 * it + uptimeMillis.hashCode() }
+            .let { 31 * it + inputDeviceId.hashCode() }
 
-    override fun toString(): String = "RotaryScrollEvent(" +
-        "verticalScrollPixels=$verticalScrollPixels," +
-        "horizontalScrollPixels=$horizontalScrollPixels," +
-        "uptimeMillis=$uptimeMillis," +
-        "deviceId=$inputDeviceId)"
+    override fun toString(): String =
+        "RotaryScrollEvent(" +
+            "verticalScrollPixels=$verticalScrollPixels," +
+            "horizontalScrollPixels=$horizontalScrollPixels," +
+            "uptimeMillis=$uptimeMillis," +
+            "deviceId=$inputDeviceId)"
 }
diff --git a/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/layout/GraphicLayerInfo.android.kt b/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/layout/GraphicLayerInfo.android.kt
index 42f3285..3e78fa4 100644
--- a/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/layout/GraphicLayerInfo.android.kt
+++ b/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/layout/GraphicLayerInfo.android.kt
@@ -18,20 +18,17 @@
 
 import kotlin.jvm.JvmDefaultWithCompatibility
 
-/**
- * The info about the graphics layers used by tooling.
- */
+/** The info about the graphics layers used by tooling. */
 @JvmDefaultWithCompatibility
 interface GraphicLayerInfo {
     /**
-     * The ID of the layer. This is used by tooling to match a layer to the associated
-     * LayoutNode.
+     * The ID of the layer. This is used by tooling to match a layer to the associated LayoutNode.
      */
     val layerId: Long
 
     /**
-     * The uniqueDrawingId of the owner view of this graphics layer. This is used by
-     * tooling to match a layer to the associated owner AndroidComposeView.
+     * The uniqueDrawingId of the owner view of this graphics layer. This is used by tooling to
+     * match a layer to the associated owner AndroidComposeView.
      */
     val ownerViewId: Long
         get() = 0
diff --git a/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/node/UiApplier.android.kt b/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/node/UiApplier.android.kt
index c516421..ef4b85e 100644
--- a/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/node/UiApplier.android.kt
+++ b/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/node/UiApplier.android.kt
@@ -18,9 +18,7 @@
 
 import androidx.compose.runtime.AbstractApplier
 
-internal class UiApplier(
-    root: LayoutNode
-) : AbstractApplier<LayoutNode>(root) {
+internal class UiApplier(root: LayoutNode) : AbstractApplier<LayoutNode>(root) {
 
     override fun insertTopDown(index: Int, instance: LayoutNode) {
         // Ignored. Insert is performed in [insertBottomUp] to build the tree bottom-up to avoid
diff --git a/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/node/ViewInterop.android.kt b/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/node/ViewInterop.android.kt
index 14c132f..c66c924 100644
--- a/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/node/ViewInterop.android.kt
+++ b/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/node/ViewInterop.android.kt
@@ -22,17 +22,22 @@
 import androidx.compose.ui.util.fastFirstOrNull
 import androidx.compose.ui.util.fastForEach
 
-// TODO(b/150806128): We should decide if we want to make this public API or not. Right now it is needed
+// TODO(b/150806128): We should decide if we want to make this public API or not. Right now it is
+// needed
 //  for convenient LayoutParams usage in compose with views.
 @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
 interface ViewAdapter {
     val id: Int
+
     fun willInsert(view: View, parent: ViewGroup)
+
     fun didInsert(view: View, parent: ViewGroup)
+
     fun didUpdate(view: View, parent: ViewGroup)
 }
 
-// TODO(b/150806128): We should decide if we want to make this public API or not. Right now it is needed
+// TODO(b/150806128): We should decide if we want to make this public API or not. Right now it is
+// needed
 //  for convenient LayoutParams usage in compose with views.
 @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
 fun <T : ViewAdapter> View.getOrAddAdapter(id: Int, factory: () -> T): T {
@@ -44,8 +49,7 @@
     val adapters = mutableListOf<ViewAdapter>()
 
     inline fun <T : ViewAdapter> get(id: Int, factory: () -> T): T {
-        @Suppress("UNCHECKED_CAST")
-        val existing = adapters.fastFirstOrNull { it.id == id } as? T
+        @Suppress("UNCHECKED_CAST") val existing = adapters.fastFirstOrNull { it.id == id } as? T
         if (existing != null) return existing
         val next = factory()
         adapters.add(next)
diff --git a/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/platform/AccessibilityIterators.android.kt b/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/platform/AccessibilityIterators.android.kt
index de00860..269684f 100644
--- a/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/platform/AccessibilityIterators.android.kt
+++ b/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/platform/AccessibilityIterators.android.kt
@@ -26,8 +26,7 @@
 import java.util.Locale
 
 /**
- * This class contains the implementation of text segment iterators
- * for accessibility support.
+ * This class contains the implementation of text segment iterators for accessibility support.
  *
  * Note: We want to be able to iterator over [SemanticsProperties.ContentDescription] of any
  * component.
@@ -35,10 +34,9 @@
 internal class AccessibilityIterators {
 
     interface TextSegmentIterator {
-        /**
-         * Given the current position, returning the start and end of next element in an array.
-         */
+        /** Given the current position, returning the start and end of next element in an array. */
         fun following(current: Int): IntArray?
+
         /**
          * Given the current position, returning the start and end of previous element in an array.
          */
@@ -69,6 +67,7 @@
         AbstractTextSegmentIterator() {
         companion object {
             private var instance: CharacterTextSegmentIterator? = null
+
             fun getInstance(locale: Locale): CharacterTextSegmentIterator {
                 if (instance == null) {
                     instance = CharacterTextSegmentIterator(locale)
@@ -241,8 +240,7 @@
         }
 
         private fun isStartBoundary(index: Int): Boolean {
-            return isLetterOrDigit(index) &&
-                (index == 0 || !isLetterOrDigit(index - 1))
+            return isLetterOrDigit(index) && (index == 0 || !isLetterOrDigit(index - 1))
         }
 
         private fun isEndBoundary(index: Int): Boolean {
@@ -283,9 +281,7 @@
             if (start < 0) {
                 start = 0
             }
-            while (start < textLength && text[start] == '\n' &&
-                !isStartBoundary(start)
-            ) {
+            while (start < textLength && text[start] == '\n' && !isStartBoundary(start)) {
                 start++
             }
             if (start >= textLength) {
@@ -324,17 +320,13 @@
         }
 
         private fun isStartBoundary(index: Int): Boolean {
-            return (
-                text[index] != '\n' &&
-                    (index == 0 || text[index - 1] == '\n')
-                )
+            return (text[index] != '\n' && (index == 0 || text[index - 1] == '\n'))
         }
 
         private fun isEndBoundary(index: Int): Boolean {
-            return (
-                index > 0 && text[index - 1] != '\n' &&
-                    (index == text.length || text[index] == '\n')
-                )
+            return (index > 0 &&
+                text[index - 1] != '\n' &&
+                (index == text.length || text[index] == '\n'))
         }
     }
 
@@ -367,16 +359,17 @@
             if (current >= text.length) {
                 return null
             }
-            val nextLine = if (current < 0) {
-                layoutResult.getLineForOffset(0)
-            } else {
-                val currentLine = layoutResult.getLineForOffset(current)
-                if (getLineEdgeIndex(currentLine, DirectionStart) == current) {
-                    currentLine
+            val nextLine =
+                if (current < 0) {
+                    layoutResult.getLineForOffset(0)
                 } else {
-                    currentLine + 1
+                    val currentLine = layoutResult.getLineForOffset(current)
+                    if (getLineEdgeIndex(currentLine, DirectionStart) == current) {
+                        currentLine
+                    } else {
+                        currentLine + 1
+                    }
                 }
-            }
             if (nextLine >= layoutResult.lineCount) {
                 return null
             }
@@ -393,16 +386,17 @@
             if (current <= 0) {
                 return null
             }
-            val previousLine = if (current > text.length) {
-                layoutResult.getLineForOffset(text.length)
-            } else {
-                val currentLine = layoutResult.getLineForOffset(current)
-                if (getLineEdgeIndex(currentLine, DirectionEnd) + 1 == current) {
-                    currentLine
+            val previousLine =
+                if (current > text.length) {
+                    layoutResult.getLineForOffset(text.length)
                 } else {
-                    currentLine - 1
+                    val currentLine = layoutResult.getLineForOffset(current)
+                    if (getLineEdgeIndex(currentLine, DirectionEnd) + 1 == current) {
+                        currentLine
+                    } else {
+                        currentLine - 1
+                    }
                 }
-            }
             if (previousLine < 0) {
                 return null
             }
@@ -428,6 +422,7 @@
             private var pageInstance: PageTextSegmentIterator? = null
             private val DirectionStart = ResolvedTextDirection.Rtl
             private val DirectionEnd = ResolvedTextDirection.Ltr
+
             fun getInstance(): PageTextSegmentIterator {
                 if (pageInstance == null) {
                     pageInstance = PageTextSegmentIterator()
@@ -472,9 +467,10 @@
             //                    - mView.getTotalPaddingBottom();
             val nextPageStartY = currentLineTop + pageHeight
             val lastLineTop = layoutResult.getLineTop(layoutResult.lineCount - 1)
-            val currentPageEndLine = if (nextPageStartY < lastLineTop)
-                layoutResult.getLineForVerticalPosition(nextPageStartY) - 1
-            else layoutResult.lineCount - 1
+            val currentPageEndLine =
+                if (nextPageStartY < lastLineTop)
+                    layoutResult.getLineForVerticalPosition(nextPageStartY) - 1
+                else layoutResult.lineCount - 1
 
             val end = getLineEdgeIndex(currentPageEndLine, DirectionEnd) + 1
 
@@ -506,8 +502,9 @@
             //  final int pageHeight = mTempRect.height() - mView.getTotalPaddingTop()
             //                    - mView.getTotalPaddingBottom();
             val previousPageEndY = currentLineTop - pageHeight
-            var currentPageStartLine = if (previousPageEndY > 0)
-                layoutResult.getLineForVerticalPosition(previousPageEndY) else 0
+            var currentPageStartLine =
+                if (previousPageEndY > 0) layoutResult.getLineForVerticalPosition(previousPageEndY)
+                else 0
             // If we're at the end of text, we're at the end of the current line rather than the
             // start of the next line, so we should move up one fewer lines than we would otherwise.
             if (end == text.length && (currentPageStartLine < currentLine)) {
diff --git a/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/platform/AndroidAccessibilityManager.android.kt b/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/platform/AndroidAccessibilityManager.android.kt
index 25ea785..5090ca5 100644
--- a/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/platform/AndroidAccessibilityManager.android.kt
+++ b/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/platform/AndroidAccessibilityManager.android.kt
@@ -21,17 +21,17 @@
 import androidx.annotation.DoNotInline
 import androidx.annotation.RequiresApi
 
-/**
- * Android implementation for [AccessibilityManager].
- */
+/** Android implementation for [AccessibilityManager]. */
 internal class AndroidAccessibilityManager(context: Context) : AccessibilityManager {
     private companion object {
         const val FlagContentIcons = 1
         const val FlagContentText = 2
         const val FlagContentControls = 4
     }
-    private val accessibilityManager = context.getSystemService(Context.ACCESSIBILITY_SERVICE) as
-        android.view.accessibility.AccessibilityManager
+
+    private val accessibilityManager =
+        context.getSystemService(Context.ACCESSIBILITY_SERVICE)
+            as android.view.accessibility.AccessibilityManager
 
     override fun calculateRecommendedTimeoutMillis(
         originalTimeoutMillis: Long,
@@ -53,11 +53,12 @@
             uiContentFlags = uiContentFlags or FlagContentControls
         }
         return if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
-            val recommended = Api29Impl.getRecommendedTimeoutMillis(
-                accessibilityManager,
-                originalTimeoutMillis.toInt(),
-                uiContentFlags
-            )
+            val recommended =
+                Api29Impl.getRecommendedTimeoutMillis(
+                    accessibilityManager,
+                    originalTimeoutMillis.toInt(),
+                    uiContentFlags
+                )
             if (recommended == Int.MAX_VALUE) {
                 Long.MAX_VALUE
             } else {
@@ -72,9 +73,9 @@
 }
 
 /**
- * This class is here to ensure that the classes that use this API will get verified and can be
- * AOT compiled. It is expected that this class will soft-fail verification, but the classes
- * which use this method will pass.
+ * This class is here to ensure that the classes that use this API will get verified and can be AOT
+ * compiled. It is expected that this class will soft-fail verification, but the classes which use
+ * this method will pass.
  */
 @RequiresApi(Build.VERSION_CODES.Q)
 internal object Api29Impl {
diff --git a/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/platform/AndroidClipboardManager.android.kt b/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/platform/AndroidClipboardManager.android.kt
index 2be06a2..6fdcb29 100644
--- a/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/platform/AndroidClipboardManager.android.kt
+++ b/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/platform/AndroidClipboardManager.android.kt
@@ -47,23 +47,20 @@
 
 private const val PLAIN_TEXT_LABEL = "plain text"
 
-/**
- * Android implementation for [ClipboardManager].
- */
-internal class AndroidClipboardManager internal constructor(
-    private val clipboardManager: android.content.ClipboardManager
-) : ClipboardManager {
+/** Android implementation for [ClipboardManager]. */
+internal class AndroidClipboardManager
+internal constructor(private val clipboardManager: android.content.ClipboardManager) :
+    ClipboardManager {
 
-    internal constructor(context: Context) : this(
+    internal constructor(
+        context: Context
+    ) : this(
         context.getSystemService(Context.CLIPBOARD_SERVICE) as android.content.ClipboardManager
     )
 
     override fun setText(annotatedString: AnnotatedString) {
         clipboardManager.setPrimaryClip(
-            ClipData.newPlainText(
-                PLAIN_TEXT_LABEL,
-                annotatedString.convertToCharSequence()
-            )
+            ClipData.newPlainText(PLAIN_TEXT_LABEL, annotatedString.convertToCharSequence())
         )
     }
 
@@ -78,8 +75,7 @@
         }
     }
 
-    override fun hasText() =
-        clipboardManager.primaryClipDescription?.hasMimeType("text/*") ?: false
+    override fun hasText() = clipboardManager.primaryClipDescription?.hasMimeType("text/*") ?: false
 
     override fun getClip(): ClipEntry? {
         return clipboardManager.primaryClip?.let(::ClipEntry)
@@ -101,9 +97,7 @@
         get() = clipboardManager
 }
 
-/**
- * Android specific class that contains the primary clip in [android.content.ClipboardManager].
- */
+/** Android specific class that contains the primary clip in [android.content.ClipboardManager]. */
 // Defining this class not as a typealias but a wrapper gives us flexibility in the future to
 // add more functionality in it.
 actual class ClipEntry(val clipData: ClipData) {
@@ -181,9 +175,9 @@
 }
 
 /**
- * A helper class used to encode SpanStyles into bytes.
- * Each field of SpanStyle is assigned with an ID. And if a field is not null or Unspecified, it
- * will be encoded. Otherwise, it will simply be omitted to save space.
+ * A helper class used to encode SpanStyles into bytes. Each field of SpanStyle is assigned with an
+ * ID. And if a field is not null or Unspecified, it will be encoded. Otherwise, it will simply be
+ * omitted to save space.
  */
 internal class EncodeHelper {
     private var parcel = Parcel.obtain()
@@ -263,12 +257,13 @@
     }
 
     fun encode(textUnit: TextUnit) {
-        val typeCode = when (textUnit.type) {
-            TextUnitType.Unspecified -> UNIT_TYPE_UNSPECIFIED
-            TextUnitType.Sp -> UNIT_TYPE_SP
-            TextUnitType.Em -> UNIT_TYPE_EM
-            else -> UNIT_TYPE_UNSPECIFIED
-        }
+        val typeCode =
+            when (textUnit.type) {
+                TextUnitType.Unspecified -> UNIT_TYPE_UNSPECIFIED
+                TextUnitType.Sp -> UNIT_TYPE_SP
+                TextUnitType.Em -> UNIT_TYPE_EM
+                else -> UNIT_TYPE_UNSPECIFIED
+            }
         encode(typeCode)
         if (textUnit.type != TextUnitType.Unspecified) {
             encode(textUnit.value)
@@ -290,13 +285,14 @@
     }
 
     fun encode(fontSynthesis: FontSynthesis) {
-        val value = when (fontSynthesis) {
-            FontSynthesis.None -> FONT_SYNTHESIS_NONE
-            FontSynthesis.All -> FONT_SYNTHESIS_ALL
-            FontSynthesis.Weight -> FONT_SYNTHESIS_WEIGHT
-            FontSynthesis.Style -> FONT_SYNTHESIS_STYLE
-            else -> FONT_SYNTHESIS_NONE
-        }
+        val value =
+            when (fontSynthesis) {
+                FontSynthesis.None -> FONT_SYNTHESIS_NONE
+                FontSynthesis.All -> FONT_SYNTHESIS_ALL
+                FontSynthesis.Weight -> FONT_SYNTHESIS_WEIGHT
+                FontSynthesis.Style -> FONT_SYNTHESIS_STYLE
+                else -> FONT_SYNTHESIS_NONE
+            }
         encode(value)
     }
 
@@ -341,9 +337,7 @@
     }
 }
 
-/**
- * The helper class to decode SpanStyle from a string encoded by [EncodeHelper].
- */
+/** The helper class to decode SpanStyle from a string encoded by [EncodeHelper]. */
 internal class DecodeHelper(string: String) {
     private val parcel = Parcel.obtain()
 
@@ -388,8 +382,7 @@
                     } else {
                         break
                     }
-                FONT_FEATURE_SETTINGS_ID ->
-                    mutableSpanStyle.fontFeatureSettings = decodeString()
+                FONT_FEATURE_SETTINGS_ID -> mutableSpanStyle.fontFeatureSettings = decodeString()
                 LETTER_SPACING_ID ->
                     if (dataAvailable() >= TEXT_UNIT_SIZE) {
                         mutableSpanStyle.letterSpacing = decodeTextUnit()
@@ -438,11 +431,12 @@
 
     @OptIn(ExperimentalUnitApi::class)
     fun decodeTextUnit(): TextUnit {
-        val type = when (decodeByte()) {
-            UNIT_TYPE_SP -> TextUnitType.Sp
-            UNIT_TYPE_EM -> TextUnitType.Em
-            else -> TextUnitType.Unspecified
-        }
+        val type =
+            when (decodeByte()) {
+                UNIT_TYPE_SP -> TextUnitType.Sp
+                UNIT_TYPE_EM -> TextUnitType.Em
+                else -> TextUnitType.Unspecified
+            }
         if (type == TextUnitType.Unspecified) {
             return TextUnit.Unspecified
         }
@@ -478,10 +472,7 @@
     }
 
     private fun decodeTextGeometricTransform(): TextGeometricTransform {
-        return TextGeometricTransform(
-            scaleX = decodeFloat(),
-            skewX = decodeFloat()
-        )
+        return TextGeometricTransform(scaleX = decodeFloat(), skewX = decodeFloat())
     }
 
     private fun decodeTextDecoration(): TextDecoration {
diff --git a/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/platform/AndroidComposeView.android.kt b/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/platform/AndroidComposeView.android.kt
index 0885d55..8ea64b4 100644
--- a/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/platform/AndroidComposeView.android.kt
+++ b/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/platform/AndroidComposeView.android.kt
@@ -212,20 +212,19 @@
 import java.util.function.Consumer
 import kotlin.coroutines.CoroutineContext
 
-/**
- * Allows tests to inject a custom [PlatformTextInputService].
- */
+/** Allows tests to inject a custom [PlatformTextInputService]. */
 internal var platformTextInputServiceInterceptor:
-        (PlatformTextInputService) -> PlatformTextInputService = { it }
+    (PlatformTextInputService) -> PlatformTextInputService =
+    {
+        it
+    }
 
 private const val ONE_FRAME_120_HERTZ_IN_MILLISECONDS = 8L
 
 @Suppress("ViewConstructor", "VisibleForTests", "ConstPropertyName", "NullAnnotationGroup")
 @OptIn(ExperimentalComposeUiApi::class, InternalComposeUiApi::class)
-internal class AndroidComposeView(
-    context: Context,
-    coroutineContext: CoroutineContext
-) : ViewGroup(context), Owner, ViewRootForTest, PositionCalculator, DefaultLifecycleObserver {
+internal class AndroidComposeView(context: Context, coroutineContext: CoroutineContext) :
+    ViewGroup(context), Owner, ViewRootForTest, PositionCalculator, DefaultLifecycleObserver {
 
     /**
      * Remembers the position of the last pointer input event that was down. This position will be
@@ -235,18 +234,19 @@
     private var lastDownPointerPosition: Offset = Offset.Unspecified
 
     /**
-     * Signal that AndroidComposeView's superclass constructors have finished running.
-     * If this is false, it's because the runtime's default uninitialized value is currently
-     * visible and AndroidComposeView's constructor hasn't started running yet. In this state
-     * other expected invariants do not hold, e.g. property delegates may not be initialized.
-     * View/ViewGroup have a history of calling non-final methods in their constructors that
-     * can lead to this case, e.g. [onRtlPropertiesChanged].
+     * Signal that AndroidComposeView's superclass constructors have finished running. If this is
+     * false, it's because the runtime's default uninitialized value is currently visible and
+     * AndroidComposeView's constructor hasn't started running yet. In this state other expected
+     * invariants do not hold, e.g. property delegates may not be initialized. View/ViewGroup have a
+     * history of calling non-final methods in their constructors that can lead to this case, e.g.
+     * [onRtlPropertiesChanged].
      */
     private var superclassInitComplete = true
 
     override val sharedDrawScope = LayoutNodeDrawScope()
 
-    override val view: View get() = this
+    override val view: View
+        get() = this
 
     override var density by mutableStateOf(Density(context), referentialEqualityPolicy())
         private set
@@ -254,14 +254,15 @@
     private val rootSemanticsNode = EmptySemanticsModifier()
     private val semanticsModifier = EmptySemanticsElement(rootSemanticsNode)
 
-    override val focusOwner: FocusOwner = FocusOwnerImpl(
-        onRequestApplyChangesListener = ::registerOnEndApplyChangesListener,
-        onRequestFocusForOwner = ::onRequestFocusForOwner,
-        onMoveFocusInterop = ::onMoveFocusInChildren,
-        onClearFocusForOwner = ::onClearFocusForOwner,
-        onFocusRectInterop = ::onFetchFocusRect,
-        onLayoutDirection = ::layoutDirection
-    )
+    override val focusOwner: FocusOwner =
+        FocusOwnerImpl(
+            onRequestApplyChangesListener = ::registerOnEndApplyChangesListener,
+            onRequestFocusForOwner = ::onRequestFocusForOwner,
+            onMoveFocusInterop = ::onMoveFocusInChildren,
+            onClearFocusForOwner = ::onClearFocusForOwner,
+            onFocusRectInterop = ::onFetchFocusRect,
+            onLayoutDirection = ::layoutDirection
+        )
 
     private val dragAndDropModifierOnDragListener = DragAndDropModifierOnDragListener(::startDrag)
 
@@ -313,13 +314,14 @@
             checkNotNull(focusDirection.toAndroidFocusDirection()) { "Invalid focus direction" }
         val focusedRect = onFetchFocusRect()?.toAndroidRect()
 
-        val nextView = FocusFinder.getInstance().let {
-            if (focusedRect == null) {
-                it.findNextFocus(this, findFocus(), direction)
-            } else {
-                it.findNextFocusFromRect(this, focusedRect, direction)
+        val nextView =
+            FocusFinder.getInstance().let {
+                if (focusedRect == null) {
+                    it.findNextFocus(this, findFocus(), direction)
+                } else {
+                    it.findNextFocusFromRect(this, focusedRect, direction)
+                }
             }
-        }
         return nextView?.requestInteropFocus(direction, focusedRect) ?: false
     }
 
@@ -327,102 +329,109 @@
     // has focus, the rect returned by focusOwner would be the bounds of the focus target
     // surrounding the embedded view. For a more accurate focus rect, we use the bounds of the
     // focused sub-view.
-    private fun onFetchFocusRect(): androidx.compose.ui.geometry.Rect? = if (isFocused) {
-        focusOwner.getFocusRect()
-    } else {
-        findFocus()?.calculateBoundingRect()
-    }
+    private fun onFetchFocusRect(): androidx.compose.ui.geometry.Rect? =
+        if (isFocused) {
+            focusOwner.getFocusRect()
+        } else {
+            findFocus()?.calculateBoundingRect()
+        }
 
     // TODO(b/177931787) : Consider creating a KeyInputManager like we have for FocusManager so
     //  that this common logic can be used by all owners.
-    private val keyInputModifier = Modifier.onKeyEvent { keyEvent ->
+    private val keyInputModifier =
+        Modifier.onKeyEvent { keyEvent ->
+            val focusDirection = getFocusDirection(keyEvent)
+            if (focusDirection == null || keyEvent.type != KeyDown) return@onKeyEvent false
 
-        val focusDirection = getFocusDirection(keyEvent)
-        if (focusDirection == null || keyEvent.type != KeyDown) return@onKeyEvent false
+            val focusedRect = onFetchFocusRect()
 
-        val focusedRect = onFetchFocusRect()
+            // Consume the key event if we moved focus or if focus search or requestFocus is
+            // cancelled.
+            val focusWasMovedOrCancelled =
+                focusOwner.focusSearch(focusDirection, focusedRect) {
+                    it.requestFocus(focusDirection) ?: true
+                } ?: true
+            if (focusWasMovedOrCancelled) return@onKeyEvent true
 
-        // Consume the key event if we moved focus or if focus search or requestFocus is cancelled.
-        val focusWasMovedOrCancelled = focusOwner.focusSearch(focusDirection, focusedRect) {
-            it.requestFocus(focusDirection) ?: true
-        } ?: true
-        if (focusWasMovedOrCancelled) return@onKeyEvent true
+            // For 2D focus search, we don't need to wrap around, so we just return false. If there
+            // are
+            // items after this view that haven't been visited, they will be visited when the
+            // unconsumed key event triggers a focus search.
+            if (!focusDirection.is1dFocusSearch()) return@onKeyEvent false
 
-        // For 2D focus search, we don't need to wrap around, so we just return false. If there are
-        // items after this view that haven't been visited, they will be visited when the
-        // unconsumed key event triggers a focus search.
-        if (!focusDirection.is1dFocusSearch()) return@onKeyEvent false
+            // For 1D focus search, we use FocusFinder to find the next view that is not a child of
+            // this view. We don't return false because we don't want to re-visit sub-views. They
+            // will
+            // instead be visited when the AndroidView around them gets a moveFocus(Enter)).
+            val androidDirection =
+                checkNotNull(focusDirection.toAndroidFocusDirection()) { "Invalid focus direction" }
+            val androidRect = checkNotNull(focusedRect?.toAndroidRect()) { "Invalid rect" }
 
-        // For 1D focus search, we use FocusFinder to find the next view that is not a child of
-        // this view. We don't return false because we don't want to re-visit sub-views. They will
-        // instead be visited when the AndroidView around them gets a moveFocus(Enter)).
-        val androidDirection = checkNotNull(focusDirection.toAndroidFocusDirection()) {
-            "Invalid focus direction"
+            val nextView = findNextNonChildView(androidDirection).takeIf { it != this }
+            if (nextView != null && nextView.requestInteropFocus(androidDirection, androidRect)) {
+                return@onKeyEvent true
+            }
+
+            // Focus finder couldn't find another view. We manually wrap around since focus remained
+            // on this view.
+            val clearedFocusSuccessfully =
+                focusOwner.clearFocus(
+                    force = false,
+                    refreshFocusEvents = true,
+                    clearOwnerFocus = false,
+                    focusDirection = focusDirection
+                )
+
+            // Consume the key event if clearFocus was cancelled.
+            if (!clearedFocusSuccessfully) return@onKeyEvent true
+
+            // Perform wrap-around focus search by running a focus search after clearing focus.
+            return@onKeyEvent focusOwner.focusSearch(focusDirection, null) {
+                it.requestFocus(focusDirection) ?: true
+            } ?: true
         }
-        val androidRect = checkNotNull(focusedRect?.toAndroidRect()) { "Invalid rect" }
-
-        val nextView = findNextNonChildView(androidDirection).takeIf { it != this }
-        if (nextView != null && nextView.requestInteropFocus(androidDirection, androidRect)) {
-            return@onKeyEvent true
-        }
-
-        // Focus finder couldn't find another view. We manually wrap around since focus remained
-        // on this view.
-        val clearedFocusSuccessfully = focusOwner.clearFocus(
-            force = false,
-            refreshFocusEvents = true,
-            clearOwnerFocus = false,
-            focusDirection = focusDirection
-        )
-
-        // Consume the key event if clearFocus was cancelled.
-        if (!clearedFocusSuccessfully) return@onKeyEvent true
-
-        // Perform wrap-around focus search by running a focus search after clearing focus.
-        return@onKeyEvent focusOwner.focusSearch(focusDirection, null) {
-            it.requestFocus(focusDirection) ?: true
-        } ?: true
-    }
 
     private fun findNextNonChildView(direction: Int): View? {
         var currentView: View? = this
         while (currentView != null) {
-            currentView = FocusFinder
-                .getInstance()
-                .findNextFocus(rootView as ViewGroup, currentView, direction)
+            currentView =
+                FocusFinder.getInstance()
+                    .findNextFocus(rootView as ViewGroup, currentView, direction)
             if (currentView != null && !containsDescendant(currentView)) return currentView
         }
         return null
     }
 
-    private val rotaryInputModifier = Modifier.onRotaryScrollEvent {
-        // TODO(b/210748692): call focusManager.moveFocus() in response to rotary events.
-        false
-    }
+    private val rotaryInputModifier =
+        Modifier.onRotaryScrollEvent {
+            // TODO(b/210748692): call focusManager.moveFocus() in response to rotary events.
+            false
+        }
 
     private val canvasHolder = CanvasHolder()
 
-    override val root = LayoutNode().also {
-        it.measurePolicy = RootMeasurePolicy
-        it.density = density
-        // Composed modifiers cannot be added here directly
-        it.modifier = Modifier
-            .then(semanticsModifier)
-            .then(rotaryInputModifier)
-            .then(keyInputModifier)
-            .then(focusOwner.modifier)
-            .then(dragAndDropModifierOnDragListener.modifier)
-    }
+    override val root =
+        LayoutNode().also {
+            it.measurePolicy = RootMeasurePolicy
+            it.density = density
+            // Composed modifiers cannot be added here directly
+            it.modifier =
+                Modifier.then(semanticsModifier)
+                    .then(rotaryInputModifier)
+                    .then(keyInputModifier)
+                    .then(focusOwner.modifier)
+                    .then(dragAndDropModifierOnDragListener.modifier)
+        }
 
     override val rootForTest: RootForTest = this
 
     override val semanticsOwner: SemanticsOwner = SemanticsOwner(root, rootSemanticsNode)
-    private val composeAccessibilityDelegate =
-        AndroidComposeViewAccessibilityDelegateCompat(this)
-    internal var contentCaptureManager = AndroidContentCaptureManager(
-        view = this,
-        onContentCaptureSession = ::getContentCaptureSessionCompat
-    )
+    private val composeAccessibilityDelegate = AndroidComposeViewAccessibilityDelegateCompat(this)
+    internal var contentCaptureManager =
+        AndroidContentCaptureManager(
+            view = this,
+            onContentCaptureSession = ::getContentCaptureSessionCompat
+        )
 
     /**
      * Provide accessibility manager to the user. Use the Android version of accessibility manager.
@@ -456,25 +465,23 @@
 
     /**
      * Used for updating LocalConfiguration when configuration changes - consume LocalConfiguration
-     * instead of changing this observer if you are writing a component that adapts to
-     * configuration changes.
+     * instead of changing this observer if you are writing a component that adapts to configuration
+     * changes.
      */
     var configurationChangeObserver: (Configuration) -> Unit = {}
 
     private val _autofill = if (autofillSupported()) AndroidAutofill(this, autofillTree) else null
 
     // Used as a CompositionLocal for performing autofill.
-    override val autofill: Autofill? get() = _autofill
+    override val autofill: Autofill?
+        get() = _autofill
 
     // Used as a CompositionLocal for performing semantic autofill.
-    override val semanticAutofill = if (autofillSupported())
-        AndroidSemanticAutofill(this) else null
+    override val semanticAutofill = if (autofillSupported()) AndroidSemanticAutofill(this) else null
 
     private var observationClearRequested = false
 
-    /**
-     * Provide clipboard manager to the user. Use the Android version of clipboard manager.
-     */
+    /** Provide clipboard manager to the user. Use the Android version of clipboard manager. */
     override val clipboardManager = AndroidClipboardManager(context)
 
     override val snapshotObserver = OwnerSnapshotObserver { command ->
@@ -503,6 +510,7 @@
             }
             return _androidViewsHandler!!
         }
+
     private var viewLayersContainer: DrawChildContainer? = null
 
     // The constraints being used by the last onMeasure. It is set to null in onLayout. It allows
@@ -516,7 +524,9 @@
 
     private val measureAndLayoutDelegate = MeasureAndLayoutDelegate(root)
 
-    override val measureIteration: Long get() = measureAndLayoutDelegate.measureIteration
+    override val measureIteration: Long
+        get() = measureAndLayoutDelegate.measureIteration
+
     override val viewConfiguration: ViewConfiguration =
         AndroidViewConfiguration(android.view.ViewConfiguration.get(context))
 
@@ -530,14 +540,13 @@
     private val viewToWindowMatrix = Matrix()
     private val windowToViewMatrix = Matrix()
 
-    @VisibleForTesting
-    internal var lastMatrixRecalculationAnimationTime = -1L
+    @VisibleForTesting internal var lastMatrixRecalculationAnimationTime = -1L
     private var forceUseMatrixCache = false
 
     /**
-     * On some devices, the `getLocationOnScreen()` returns `(0, 0)` even when the Window
-     * is offset in special circumstances. This contains the screen coordinates of the containing
-     * Window the last time the [viewToWindowMatrix] and [windowToViewMatrix] were recalculated.
+     * On some devices, the `getLocationOnScreen()` returns `(0, 0)` even when the Window is offset
+     * in special circumstances. This contains the screen coordinates of the containing Window the
+     * last time the [viewToWindowMatrix] and [windowToViewMatrix] were recalculated.
      */
     private var windowPosition = Offset.Infinite
 
@@ -551,8 +560,8 @@
     // workaround for b/271579465 to avoid unnecessary extra recompositions when this is mutated
     // before setContent is called.
     /**
-     * Current [ViewTreeOwners]. Use [setOnViewTreeOwnersAvailable] if you want to
-     * execute your code when the object will be created.
+     * Current [ViewTreeOwners]. Use [setOnViewTreeOwnersAvailable] if you want to execute your code
+     * when the object will be created.
      */
     val viewTreeOwners: ViewTreeOwners? by derivedStateOf { _viewTreeOwners }
 
@@ -562,20 +571,19 @@
     // inside the window (we are interested not only in the event when our parent positioned us
     // on a different position, but also in the position of each of the grandparents as all these
     // positions add up to final global position)
-    private val globalLayoutListener = ViewTreeObserver.OnGlobalLayoutListener {
-        updatePositionCacheAndDispatch()
-    }
+    private val globalLayoutListener =
+        ViewTreeObserver.OnGlobalLayoutListener { updatePositionCacheAndDispatch() }
 
     // executed when a scrolling container like ScrollView of RecyclerView performed the scroll,
     // this could affect our global position
-    private val scrollChangedListener = ViewTreeObserver.OnScrollChangedListener {
-        updatePositionCacheAndDispatch()
-    }
+    private val scrollChangedListener =
+        ViewTreeObserver.OnScrollChangedListener { updatePositionCacheAndDispatch() }
 
     // executed whenever the touch mode changes.
-    private val touchModeChangeListener = ViewTreeObserver.OnTouchModeChangeListener { touchMode ->
-        _inputModeManager.inputMode = if (touchMode) Touch else Keyboard
-    }
+    private val touchModeChangeListener =
+        ViewTreeObserver.OnTouchModeChangeListener { touchMode ->
+            _inputModeManager.inputMode = if (touchMode) Touch else Keyboard
+        }
 
     private val legacyTextInputServiceAndroid = TextInputServiceAndroid(view, this)
 
@@ -596,16 +604,17 @@
 
     override suspend fun textInputSession(
         session: suspend PlatformTextInputSessionScope.() -> Nothing
-    ): Nothing = textInputSessionMutex.withSessionCancellingPrevious(
-        sessionInitializer = {
-            AndroidPlatformTextInputSession(
-                view = this,
-                textInputService = textInputService,
-                coroutineScope = it
-            )
-        },
-        session = session
-    )
+    ): Nothing =
+        textInputSessionMutex.withSessionCancellingPrevious(
+            sessionInitializer = {
+                AndroidPlatformTextInputSession(
+                    view = this,
+                    textInputService = textInputService,
+                    coroutineScope = it
+                )
+            },
+            session = session
+        )
 
     @Deprecated(
         "fontLoader is deprecated, use fontFamilyResolver",
@@ -616,10 +625,8 @@
 
     // Backed by mutableStateOf so that the local provider recomposes when it changes
     // FontFamily.Resolver is not guaranteed to be stable or immutable, hence referential check
-    override var fontFamilyResolver: FontFamily.Resolver by mutableStateOf(
-        createFontFamilyResolver(context),
-        referentialEqualityPolicy()
-    )
+    override var fontFamilyResolver: FontFamily.Resolver by
+        mutableStateOf(createFontFamilyResolver(context), referentialEqualityPolicy())
         private set
 
     // keeps track of changes in font weight adjustment to update fontFamilyResolver
@@ -630,41 +637,40 @@
         get() = if (SDK_INT >= S) fontWeightAdjustment else 0
 
     // Backed by mutableStateOf so that the ambient provider recomposes when it changes
-    override var layoutDirection by mutableStateOf(
-        // We don't use the attached View's layout direction here since that layout direction may not
-        // be resolved since composables may be composed without attaching to the RootViewImpl.
-        // In Jetpack Compose, use the locale layout direction (i.e. layoutDirection came from
-        // configuration) as a default layout direction.
-        toLayoutDirection(context.resources.configuration.layoutDirection) ?: LayoutDirection.Ltr
-    )
+    override var layoutDirection by
+        mutableStateOf(
+            // We don't use the attached View's layout direction here since that layout direction
+            // may not
+            // be resolved since composables may be composed without attaching to the RootViewImpl.
+            // In Jetpack Compose, use the locale layout direction (i.e. layoutDirection came from
+            // configuration) as a default layout direction.
+            toLayoutDirection(context.resources.configuration.layoutDirection)
+                ?: LayoutDirection.Ltr
+        )
         private set
 
-    /**
-     * Provide haptic feedback to the user. Use the Android version of haptic feedback.
-     */
-    override val hapticFeedBack: HapticFeedback =
-        PlatformHapticFeedback(this)
+    /** Provide haptic feedback to the user. Use the Android version of haptic feedback. */
+    override val hapticFeedBack: HapticFeedback = PlatformHapticFeedback(this)
 
-    /**
-     * Provide an instance of [InputModeManager] which is available as a CompositionLocal.
-     */
-    private val _inputModeManager = InputModeManagerImpl(
-        initialInputMode = if (isInTouchMode) Touch else Keyboard,
-        onRequestInputModeChange = {
-            when (it) {
-                // Android doesn't support programmatically switching to touch mode, so we
-                // don't do anything, but just return true if we are already in touch mode.
-                Touch -> isInTouchMode
+    /** Provide an instance of [InputModeManager] which is available as a CompositionLocal. */
+    private val _inputModeManager =
+        InputModeManagerImpl(
+            initialInputMode = if (isInTouchMode) Touch else Keyboard,
+            onRequestInputModeChange = {
+                when (it) {
+                    // Android doesn't support programmatically switching to touch mode, so we
+                    // don't do anything, but just return true if we are already in touch mode.
+                    Touch -> isInTouchMode
 
-                // If we are already in keyboard mode, we return true, otherwise, we call
-                // requestFocusFromTouch, which puts the system in non-touch mode.
-                Keyboard -> if (isInTouchMode) requestFocusFromTouch() else true
-
-                else -> false
+                    // If we are already in keyboard mode, we return true, otherwise, we call
+                    // requestFocusFromTouch, which puts the system in non-touch mode.
+                    Keyboard -> if (isInTouchMode) requestFocusFromTouch() else true
+                    else -> false
+                }
             }
-        }
-    )
-    override val inputModeManager: InputModeManager get() = _inputModeManager
+        )
+    override val inputModeManager: InputModeManager
+        get() = _inputModeManager
 
     override val modifierLocalManager: ModifierLocalManager = ModifierLocalManager(this)
 
@@ -675,58 +681,60 @@
     override val textToolbar: TextToolbar = AndroidTextToolbar(this)
 
     /**
-     * When the first event for a mouse is ACTION_DOWN, an ACTION_HOVER_ENTER is never sent.
-     * This means that we won't receive an `Enter` event for the first mouse. In order to prevent
-     * this problem, we track whether or not the previous event was with the mouse inside and
-     * if not, we can create a simulated mouse enter event to force an enter.
+     * When the first event for a mouse is ACTION_DOWN, an ACTION_HOVER_ENTER is never sent. This
+     * means that we won't receive an `Enter` event for the first mouse. In order to prevent this
+     * problem, we track whether or not the previous event was with the mouse inside and if not, we
+     * can create a simulated mouse enter event to force an enter.
      */
     private var previousMotionEvent: MotionEvent? = null
 
-    /**
-     * The time of the last layout. This is used to send a synthetic MotionEvent.
-     */
+    /** The time of the last layout. This is used to send a synthetic MotionEvent. */
     private var relayoutTime = 0L
 
     /**
-     * A cache for OwnedLayers. Recreating ViewLayers is expensive, so we avoid it as much
-     * as possible. This also helps a little with RenderNodeLayers as well.
+     * A cache for OwnedLayers. Recreating ViewLayers is expensive, so we avoid it as much as
+     * possible. This also helps a little with RenderNodeLayers as well.
      */
     private val layerCache = WeakCache<OwnedLayer>()
 
-    /**
-     * List of lambdas to be called when [onEndApplyChanges] is called.
-     */
+    /** List of lambdas to be called when [onEndApplyChanges] is called. */
     private val endApplyChangesListeners = mutableVectorOf<(() -> Unit)?>()
 
     /**
-     * Runnable used to update the pointer position after layout. If
-     * another pointer event comes in before this runs, this Runnable will be removed and
-     * not executed.
+     * Runnable used to update the pointer position after layout. If another pointer event comes in
+     * before this runs, this Runnable will be removed and not executed.
      */
-    private val resendMotionEventRunnable = object : Runnable {
-        override fun run() {
-            removeCallbacks(this)
-            val lastMotionEvent = previousMotionEvent
-            if (lastMotionEvent != null) {
-                val wasMouseEvent = lastMotionEvent.getToolType(0) == TOOL_TYPE_MOUSE
-                val action = lastMotionEvent.actionMasked
-                val resend = if (wasMouseEvent) {
-                    action != ACTION_HOVER_EXIT && action != ACTION_UP
-                } else {
-                    action != ACTION_UP
-                }
-                if (resend) {
-                    val newAction =
-                        if (action == ACTION_HOVER_MOVE || action == ACTION_HOVER_ENTER) {
-                            ACTION_HOVER_MOVE
+    private val resendMotionEventRunnable =
+        object : Runnable {
+            override fun run() {
+                removeCallbacks(this)
+                val lastMotionEvent = previousMotionEvent
+                if (lastMotionEvent != null) {
+                    val wasMouseEvent = lastMotionEvent.getToolType(0) == TOOL_TYPE_MOUSE
+                    val action = lastMotionEvent.actionMasked
+                    val resend =
+                        if (wasMouseEvent) {
+                            action != ACTION_HOVER_EXIT && action != ACTION_UP
                         } else {
-                            ACTION_MOVE
+                            action != ACTION_UP
                         }
-                    sendSimulatedEvent(lastMotionEvent, newAction, relayoutTime, forceHover = false)
+                    if (resend) {
+                        val newAction =
+                            if (action == ACTION_HOVER_MOVE || action == ACTION_HOVER_ENTER) {
+                                ACTION_HOVER_MOVE
+                            } else {
+                                ACTION_MOVE
+                            }
+                        sendSimulatedEvent(
+                            lastMotionEvent,
+                            newAction,
+                            relayoutTime,
+                            forceHover = false
+                        )
+                    }
                 }
             }
         }
-    }
 
     /**
      * If an [ACTION_HOVER_EXIT] event is received, it could be because an [ACTION_DOWN] is coming
@@ -743,20 +751,17 @@
         sendMotionEvent(lastEvent)
     }
 
-    /**
-     * Set to `true` when [sendHoverExitEvent] has been posted.
-     */
+    /** Set to `true` when [sendHoverExitEvent] has been posted. */
     private var hoverExitReceived = false
 
-    /**
-     * Callback for [measureAndLayout] to update the pointer position 150ms after layout.
-     */
+    /** Callback for [measureAndLayout] to update the pointer position 150ms after layout. */
     private val resendMotionEventOnLayout: () -> Unit = {
         val lastEvent = previousMotionEvent
         if (lastEvent != null) {
             when (lastEvent.actionMasked) {
                 // We currently only care about hover events being updated when layout changes
-                ACTION_HOVER_ENTER, ACTION_HOVER_MOVE -> {
+                ACTION_HOVER_ENTER,
+                ACTION_HOVER_MOVE -> {
                     relayoutTime = SystemClock.uptimeMillis()
                     post(resendMotionEventRunnable)
                 }
@@ -769,12 +774,10 @@
 
     /**
      * Keyboard modifiers state might be changed when window is not focused, so window doesn't
-     * receive any key events.
-     * This flag is set when window focus changes. Then we can rely on it when handling the
-     * first movementEvent to get the actual keyboard modifiers state from it.
-     * After window gains focus, the first motionEvent.metaState (after focus gained) is used
-     * to update windowInfo.keyboardModifiers.
-     * See [onWindowFocusChanged] and [sendMotionEvent]
+     * receive any key events. This flag is set when window focus changes. Then we can rely on it
+     * when handling the first movementEvent to get the actual keyboard modifiers state from it.
+     * After window gains focus, the first motionEvent.metaState (after focus gained) is used to
+     * update windowInfo.keyboardModifiers. See [onWindowFocusChanged] and [sendMotionEvent]
      */
     private var keyboardModifiersRequireUpdate = false
 
@@ -815,11 +818,12 @@
 
     private val scrollCapture = if (SDK_INT >= 31) ScrollCapture() else null
     internal val scrollCaptureInProgress: Boolean
-        get() = if (SDK_INT >= 31) {
-            scrollCapture?.scrollCaptureInProgress ?: false
-        } else {
-            false
-        }
+        get() =
+            if (SDK_INT >= 31) {
+                scrollCapture?.scrollCaptureInProgress ?: false
+            } else {
+                false
+            }
 
     override fun onScrollCaptureSearch(
         localVisibleRect: Rect,
@@ -886,8 +890,7 @@
 
         return super.requestFocus(
             focusDirection?.toAndroidFocusDirection() ?: FOCUS_DOWN,
-            @Suppress("DEPRECATION")
-            previouslyFocusedRect?.toAndroidRect()
+            @Suppress("DEPRECATION") previouslyFocusedRect?.toAndroidRect()
         )
     }
 
@@ -923,11 +926,9 @@
         }
     }
 
-    /**
-     * This function is used by the testing framework to send key events.
-     */
+    /** This function is used by the testing framework to send key events. */
     override fun sendKeyEvent(keyEvent: KeyEvent): Boolean =
-    // First dispatch the key event to mimic the event being intercepted before it is sent to
+        // First dispatch the key event to mimic the event being intercepted before it is sent to
         // the soft keyboard.
         focusOwner.dispatchInterceptedSoftKeyboardEvent(keyEvent) ||
             // Next, send the key event to the Soft Keyboard.
@@ -936,24 +937,26 @@
             // Finally, dispatch the key event to onPreKeyEvent/onKeyEvent listeners.
             focusOwner.dispatchKeyEvent(keyEvent)
 
-    override fun dispatchKeyEvent(event: AndroidKeyEvent): Boolean = if (isFocused) {
-        // Focus lies within the Compose hierarchy, so we dispatch the key event to the
-        // appropriate place.
-        _windowInfo.keyboardModifiers = PointerKeyboardModifiers(event.metaState)
-        // If the event is not consumed, use the default implementation.
-        focusOwner.dispatchKeyEvent(KeyEvent(event)) || super.dispatchKeyEvent(event)
-    } else {
-        // This Owner has a focused child view, which is a view interoperability use case,
-        // so we use the default ViewGroup behavior which will route tke key event to the
-        // focused child view.
-        focusOwner.dispatchKeyEvent(
-            keyEvent = KeyEvent(event),
-            onFocusedItem = {
-                // TODO(b/320510084): Add tests to verify that embedded views receive key events.
-                super.dispatchKeyEvent(event)
-            }
-        )
-    }
+    override fun dispatchKeyEvent(event: AndroidKeyEvent): Boolean =
+        if (isFocused) {
+            // Focus lies within the Compose hierarchy, so we dispatch the key event to the
+            // appropriate place.
+            _windowInfo.keyboardModifiers = PointerKeyboardModifiers(event.metaState)
+            // If the event is not consumed, use the default implementation.
+            focusOwner.dispatchKeyEvent(KeyEvent(event)) || super.dispatchKeyEvent(event)
+        } else {
+            // This Owner has a focused child view, which is a view interoperability use case,
+            // so we use the default ViewGroup behavior which will route tke key event to the
+            // focused child view.
+            focusOwner.dispatchKeyEvent(
+                keyEvent = KeyEvent(event),
+                onFocusedItem = {
+                    // TODO(b/320510084): Add tests to verify that embedded views receive key
+                    // events.
+                    super.dispatchKeyEvent(event)
+                }
+            )
+        }
 
     override fun dispatchKeyEventPreIme(event: AndroidKeyEvent): Boolean {
         return (isFocused && focusOwner.dispatchInterceptedSoftKeyboardEvent(KeyEvent(event))) ||
@@ -976,19 +979,16 @@
      * accessibility events in milliseconds.
      */
     override fun setAccessibilityEventBatchIntervalMillis(intervalMillis: Long) {
-        composeAccessibilityDelegate.SendRecurringAccessibilityEventsIntervalMillis =
-            intervalMillis
+        composeAccessibilityDelegate.SendRecurringAccessibilityEventsIntervalMillis = intervalMillis
 
         if (SDK_INT >= 26) {
             // TODO(333102566): add a setAutofillEventBatchIntervalMillis instead of using the
             // accessibility interval here.
-            semanticAutofill?.SendRecurringAutofillEventsIntervalMillis =
-                intervalMillis
+            semanticAutofill?.SendRecurringAutofillEventsIntervalMillis = intervalMillis
         }
     }
 
-    override fun onAttach(node: LayoutNode) {
-    }
+    override fun onAttach(node: LayoutNode) {}
 
     override fun onDetach(node: LayoutNode) {
         measureAndLayoutDelegate.onNodeDetached(node)
@@ -1035,17 +1035,16 @@
         decorationSize: Size,
         drawDragDecoration: DrawScope.() -> Unit,
     ): Boolean {
-        val density = with(context.resources) {
-            Density(
-                density = displayMetrics.density,
-                fontScale = configuration.fontScale
+        val density =
+            with(context.resources) {
+                Density(density = displayMetrics.density, fontScale = configuration.fontScale)
+            }
+        val shadowBuilder =
+            ComposeDragShadowBuilder(
+                density = density,
+                decorationSize = decorationSize,
+                drawDragDecoration = drawDragDecoration,
             )
-        }
-        val shadowBuilder = ComposeDragShadowBuilder(
-            density = density,
-            decorationSize = decorationSize,
-            drawDragDecoration = drawDragDecoration,
-        )
         @Suppress("DEPRECATION")
         return if (SDK_INT >= N) {
             AndroidComposeViewStartDragAndDropN.startDragAndDrop(
@@ -1083,14 +1082,18 @@
         // `traversalAfter` from a non-sealed instance of an ANI
         when (extraDataKey) {
             composeAccessibilityDelegate.ExtraDataTestTraversalBeforeVal -> {
-                composeAccessibilityDelegate.idToBeforeMap
-                    .getOrDefault(virtualViewId, -1)
-                    .let { if (it != -1) { info.extras.putInt(extraDataKey, it) } }
+                composeAccessibilityDelegate.idToBeforeMap.getOrDefault(virtualViewId, -1).let {
+                    if (it != -1) {
+                        info.extras.putInt(extraDataKey, it)
+                    }
+                }
             }
             composeAccessibilityDelegate.ExtraDataTestTraversalAfterVal -> {
-                composeAccessibilityDelegate.idToAfterMap
-                    .getOrDefault(virtualViewId, -1)
-                    .let { if (it != -1) { info.extras.putInt(extraDataKey, it) } }
+                composeAccessibilityDelegate.idToAfterMap.getOrDefault(virtualViewId, -1).let {
+                    if (it != -1) {
+                        info.extras.putInt(extraDataKey, it)
+                    }
+                }
             }
             else -> {}
         }
@@ -1105,7 +1108,10 @@
         addView(
             child,
             -1,
-            generateDefaultLayoutParams().also { it.width = width; it.height = height }
+            generateDefaultLayoutParams().also {
+                it.width = width
+                it.height = height
+            }
         )
 
     override fun addView(child: View?, params: LayoutParams?) = addView(child, -1, params)
@@ -1116,17 +1122,12 @@
      * container views, such as [viewLayersContainer].
      */
     override fun addView(child: View?, index: Int, params: LayoutParams?) {
-        addViewInLayout(
-            child,
-            index,
-            params,
-            /* preventRequestLayout = */ true
-        )
+        addViewInLayout(child, index, params, /* preventRequestLayout= */ true)
     }
 
     /**
-     * Called to inform the owner that a new Android [View] was [attached][Owner.onAttach]
-     * to the hierarchy.
+     * Called to inform the owner that a new Android [View] was [attached][Owner.onAttach] to the
+     * hierarchy.
      */
     fun addAndroidView(view: AndroidViewHolder, layoutNode: LayoutNode) {
         androidViewsHandler.holderToLayoutNode[view] = layoutNode
@@ -1153,11 +1154,12 @@
                         info.isVisibleToUser = false
                     }
 
-                    var parentId = layoutNode
-                        .findClosestParentNode { it.nodes.has(Nodes.Semantics) }
-                        ?.semanticsId
-                    if (parentId == null ||
-                        parentId == semanticsOwner.unmergedRootSemanticsNode.id
+                    var parentId =
+                        layoutNode
+                            .findClosestParentNode { it.nodes.has(Nodes.Semantics) }
+                            ?.semanticsId
+                    if (
+                        parentId == null || parentId == semanticsOwner.unmergedRootSemanticsNode.id
                     ) {
                         parentId = AccessibilityNodeProviderCompat.HOST_VIEW_ID
                     }
@@ -1179,7 +1181,8 @@
                             info.setTraversalBefore(thisView, beforeId)
                         }
                         addExtraDataToAccessibilityNodeInfoHelper(
-                            semanticsId, info.unwrap(),
+                            semanticsId,
+                            info.unwrap(),
                             composeAccessibilityDelegate.ExtraDataTestTraversalBeforeVal
                         )
                     }
@@ -1194,7 +1197,8 @@
                             info.setTraversalAfter(thisView, afterId)
                         }
                         addExtraDataToAccessibilityNodeInfoHelper(
-                            semanticsId, info.unwrap(),
+                            semanticsId,
+                            info.unwrap(),
                             composeAccessibilityDelegate.ExtraDataTestTraversalAfterVal
                         )
                     }
@@ -1204,8 +1208,8 @@
     }
 
     /**
-     * Called to inform the owner that an Android [View] was [detached][Owner.onDetach]
-     * from the hierarchy.
+     * Called to inform the owner that an Android [View] was [detached][Owner.onDetach] from the
+     * hierarchy.
      */
     fun removeAndroidView(view: AndroidViewHolder) {
         registerOnEndApplyChangesListener {
@@ -1217,9 +1221,7 @@
         }
     }
 
-    /**
-     * Called to ask the owner to draw a child Android [View] to [canvas].
-     */
+    /** Called to ask the owner to draw a child Android [View] to [canvas]. */
     fun drawAndroidView(view: AndroidViewHolder, canvas: android.graphics.Canvas) {
         androidViewsHandler.drawView(view, canvas)
     }
@@ -1233,9 +1235,10 @@
                 // this will cause inconsistency as the Compose content will already have the
                 // new size, but the View hierarchy will react only on the next frame.
                 var node = nodeToRemeasure
-                while (node != null &&
-                    node.measuredByParent == UsageByParent.InMeasureBlock &&
-                    node.childSizeCanAffectParentSize()
+                while (
+                    node != null &&
+                        node.measuredByParent == UsageByParent.InMeasureBlock &&
+                        node.childSizeCanAffectParentSize()
                 ) {
                     node = node.parent
                 }
@@ -1266,8 +1269,9 @@
 
     override fun measureAndLayout(sendPointerUpdate: Boolean) {
         // only run the logic when we have something pending
-        if (measureAndLayoutDelegate.hasPendingMeasureOrLayout ||
-            measureAndLayoutDelegate.hasPendingOnPositionedCallbacks
+        if (
+            measureAndLayoutDelegate.hasPendingMeasureOrLayout ||
+                measureAndLayoutDelegate.hasPendingOnPositionedCallbacks
         ) {
             trace("AndroidOwner:measureAndLayout") {
                 val resend = if (sendPointerUpdate) resendMotionEventOnLayout else null
@@ -1303,13 +1307,15 @@
         scheduleMeasureAndLayout: Boolean
     ) {
         if (affectsLookahead) {
-            if (measureAndLayoutDelegate.requestLookaheadRemeasure(layoutNode, forceRequest) &&
-                scheduleMeasureAndLayout
+            if (
+                measureAndLayoutDelegate.requestLookaheadRemeasure(layoutNode, forceRequest) &&
+                    scheduleMeasureAndLayout
             ) {
                 scheduleMeasureAndLayout(layoutNode)
             }
-        } else if (measureAndLayoutDelegate.requestRemeasure(layoutNode, forceRequest) &&
-            scheduleMeasureAndLayout
+        } else if (
+            measureAndLayoutDelegate.requestRemeasure(layoutNode, forceRequest) &&
+                scheduleMeasureAndLayout
         ) {
             scheduleMeasureAndLayout(layoutNode)
         }
@@ -1424,8 +1430,7 @@
         measureAndLayoutDelegate.dispatchOnPositionedCallbacks(forceDispatch = positionChanged)
     }
 
-    override fun onDraw(canvas: android.graphics.Canvas) {
-    }
+    override fun onDraw(canvas: android.graphics.Canvas) {}
 
     override fun createLayer(
         drawBlock: (canvas: Canvas, parentLayer: GraphicsLayer?) -> Unit,
@@ -1465,11 +1470,7 @@
         // until ART allows things on the unsupported list on P.
         if (isHardwareAccelerated && SDK_INT >= M && isRenderNodeCompatible) {
             try {
-                return RenderNodeLayer(
-                    this,
-                    drawBlock,
-                    invalidateParentLayer
-                )
+                return RenderNodeLayer(this, drawBlock, invalidateParentLayer)
             } catch (_: Throwable) {
                 isRenderNodeCompatible = false
             }
@@ -1480,24 +1481,26 @@
                 // ViewLayer.shouldUseDispatchDraw will be true.
                 ViewLayer.updateDisplayList(View(context))
             }
-            viewLayersContainer = if (ViewLayer.shouldUseDispatchDraw) {
-                DrawChildContainer(context)
-            } else {
-                ViewLayerContainer(context)
-            }
+            viewLayersContainer =
+                if (ViewLayer.shouldUseDispatchDraw) {
+                    DrawChildContainer(context)
+                } else {
+                    ViewLayerContainer(context)
+                }
             addView(viewLayersContainer)
         }
         return ViewLayer(this, viewLayersContainer!!, drawBlock, invalidateParentLayer)
     }
 
     /**
-     * Return [layer] to the layer cache. It can be reused in [createLayer] after this.
-     * Returns `true` if it was recycled or `false` if it will be discarded.
+     * Return [layer] to the layer cache. It can be reused in [createLayer] after this. Returns
+     * `true` if it was recycled or `false` if it will be discarded.
      */
     internal fun recycle(layer: OwnedLayer): Boolean {
-        val cacheValue = viewLayersContainer == null ||
-            ViewLayer.shouldUseDispatchDraw ||
-            SDK_INT >= M // L throws during RenderThread when reusing the Views.
+        val cacheValue =
+            viewLayersContainer == null ||
+                ViewLayer.shouldUseDispatchDraw ||
+                SDK_INT >= M // L throws during RenderThread when reusing the Views.
         if (cacheValue) {
             layerCache.push(layer)
         }
@@ -1538,10 +1541,15 @@
             // trigger the composable to get focus (so the composable can handle key events to
             // move focus or scroll content). Remember, composables can't receive key events without
             // focus.
-            DirectionUp, PageUp -> Up
-            DirectionDown, PageDown -> Down
-            DirectionCenter, Key.Enter, NumPadEnter -> Enter
-            Back, Escape -> Exit
+            DirectionUp,
+            PageUp -> Up
+            DirectionDown,
+            PageDown -> Down
+            DirectionCenter,
+            Key.Enter,
+            NumPadEnter -> Enter
+            Back,
+            Escape -> Exit
             else -> null
         }
     }
@@ -1607,15 +1615,16 @@
         } else if (!isDrawingContent) {
             dirtyLayers += layer
         } else {
-            val postponed = postponedDirtyLayers
-                ?: mutableListOf<OwnedLayer>().also { postponedDirtyLayers = it }
+            val postponed =
+                postponedDirtyLayers
+                    ?: mutableListOf<OwnedLayer>().also { postponedDirtyLayers = it }
             postponed += layer
         }
     }
 
     /**
-     * The callback to be executed when [viewTreeOwners] is created and not-null anymore.
-     * Note that this callback will be fired inline when it is already available
+     * The callback to be executed when [viewTreeOwners] is created and not-null anymore. Note that
+     * this callback will be fired inline when it is already available
      */
     fun setOnViewTreeOwnersAvailable(callback: (ViewTreeOwners) -> Unit) {
         val viewTreeOwners = viewTreeOwners
@@ -1636,17 +1645,13 @@
         composeAccessibilityDelegate.boundsUpdatesEventLoop()
     }
 
-    /**
-     * Walks the entire LayoutNode sub-hierarchy and marks all nodes as needing measurement.
-     */
+    /** Walks the entire LayoutNode sub-hierarchy and marks all nodes as needing measurement. */
     private fun invalidateLayoutNodeMeasurement(node: LayoutNode) {
         measureAndLayoutDelegate.requestRemeasure(node)
         node.forEachChild { invalidateLayoutNodeMeasurement(it) }
     }
 
-    /**
-     * Walks the entire LayoutNode sub-hierarchy and marks all layers as needing to be redrawn.
-     */
+    /** Walks the entire LayoutNode sub-hierarchy and marks all layers as needing to be redrawn. */
     private fun invalidateLayers(node: LayoutNode) {
         node.invalidateLayers()
         node.forEachChild { invalidateLayers(it) }
@@ -1676,14 +1681,11 @@
         val oldViewTreeOwners = viewTreeOwners
         // We need to change the ViewTreeOwner if there isn't one yet (null)
         // or if either the lifecycleOwner or savedStateRegistryOwner has changed.
-        val resetViewTreeOwner = oldViewTreeOwners == null ||
-            (
-                (lifecycleOwner != null && savedStateRegistryOwner != null) &&
-                    (
-                        lifecycleOwner !== oldViewTreeOwners.lifecycleOwner ||
-                            savedStateRegistryOwner !== oldViewTreeOwners.lifecycleOwner
-                        )
-                )
+        val resetViewTreeOwner =
+            oldViewTreeOwners == null ||
+                ((lifecycleOwner != null && savedStateRegistryOwner != null) &&
+                    (lifecycleOwner !== oldViewTreeOwners.lifecycleOwner ||
+                        savedStateRegistryOwner !== oldViewTreeOwners.lifecycleOwner))
         if (resetViewTreeOwner) {
             if (lifecycleOwner == null) {
                 throw IllegalStateException(
@@ -1698,10 +1700,11 @@
             }
             oldViewTreeOwners?.lifecycleOwner?.lifecycle?.removeObserver(this)
             lifecycleOwner.lifecycle.addObserver(this)
-            val viewTreeOwners = ViewTreeOwners(
-                lifecycleOwner = lifecycleOwner,
-                savedStateRegistryOwner = savedStateRegistryOwner
-            )
+            val viewTreeOwners =
+                ViewTreeOwners(
+                    lifecycleOwner = lifecycleOwner,
+                    savedStateRegistryOwner = savedStateRegistryOwner
+                )
             _viewTreeOwners = viewTreeOwners
             onViewTreeOwnersAvailable?.invoke(viewTreeOwners)
             onViewTreeOwnersAvailable = null
@@ -1709,9 +1712,10 @@
 
         _inputModeManager.inputMode = if (isInTouchMode) Touch else Keyboard
 
-        val lifecycle = checkPreconditionNotNull(viewTreeOwners?.lifecycleOwner?.lifecycle) {
-            "No lifecycle owner exists"
-        }
+        val lifecycle =
+            checkPreconditionNotNull(viewTreeOwners?.lifecycleOwner?.lifecycle) {
+                "No lifecycle owner exists"
+            }
         lifecycle.addObserver(this)
         lifecycle.addObserver(contentCaptureManager)
         viewTreeObserver.addOnGlobalLayoutListener(globalLayoutListener)
@@ -1726,9 +1730,10 @@
     override fun onDetachedFromWindow() {
         super.onDetachedFromWindow()
         snapshotObserver.stopObserving()
-        val lifecycle = checkPreconditionNotNull(viewTreeOwners?.lifecycleOwner?.lifecycle) {
-            "No lifecycle owner exists"
-        }
+        val lifecycle =
+            checkPreconditionNotNull(viewTreeOwners?.lifecycleOwner?.lifecycle) {
+                "No lifecycle owner exists"
+            }
         lifecycle.removeObserver(contentCaptureManager)
         lifecycle.removeObserver(this)
         ifDebug {
@@ -1772,7 +1777,9 @@
         requestsCollector: Consumer<ViewTranslationRequest?>
     ) {
         contentCaptureManager.onCreateVirtualViewTranslationRequests(
-            virtualIds, supportedFormats, requestsCollector
+            virtualIds,
+            supportedFormats,
+            requestsCollector
         )
     }
 
@@ -1780,9 +1787,7 @@
     override fun onVirtualViewTranslationResponses(
         response: LongSparseArray<ViewTranslationResponse?>
     ) {
-        contentCaptureManager.onVirtualViewTranslationResponses(
-            contentCaptureManager, response
-        )
+        contentCaptureManager.onVirtualViewTranslationResponses(contentCaptureManager, response)
     }
 
     override fun dispatchGenericMotionEvent(motionEvent: MotionEvent): Boolean {
@@ -1800,15 +1805,14 @@
         }
 
         return when (motionEvent.actionMasked) {
-            ACTION_SCROLL -> when {
-                isBadMotionEvent(motionEvent) || !isAttachedToWindow ->
-                    super.dispatchGenericMotionEvent(motionEvent)
-
-                motionEvent.isFromSource(SOURCE_ROTARY_ENCODER) -> handleRotaryEvent(motionEvent)
-
-                else -> handleMotionEvent(motionEvent).dispatchedToAPointerInputModifier
-            }
-
+            ACTION_SCROLL ->
+                when {
+                    isBadMotionEvent(motionEvent) || !isAttachedToWindow ->
+                        super.dispatchGenericMotionEvent(motionEvent)
+                    motionEvent.isFromSource(SOURCE_ROTARY_ENCODER) ->
+                        handleRotaryEvent(motionEvent)
+                    else -> handleMotionEvent(motionEvent).dispatchedToAPointerInputModifier
+                }
             else -> super.dispatchGenericMotionEvent(motionEvent)
         }
     }
@@ -1820,8 +1824,8 @@
             // pointer
             removeCallbacks(sendHoverExitEvent)
             val lastEvent = previousMotionEvent!!
-            if (motionEvent.actionMasked != ACTION_DOWN ||
-                hasChangedDevices(motionEvent, lastEvent)
+            if (
+                motionEvent.actionMasked != ACTION_DOWN || hasChangedDevices(motionEvent, lastEvent)
             ) {
                 sendHoverExitEvent.run()
             } else {
@@ -1851,12 +1855,14 @@
     private fun handleRotaryEvent(event: MotionEvent): Boolean {
         val config = android.view.ViewConfiguration.get(context)
         val axisValue = -event.getAxisValue(AXIS_SCROLL)
-        val rotaryEvent = RotaryScrollEvent(
-            verticalScrollPixels = axisValue * getScaledVerticalScrollFactor(config, context),
-            horizontalScrollPixels = axisValue * getScaledHorizontalScrollFactor(config, context),
-            uptimeMillis = event.eventTime,
-            inputDeviceId = event.deviceId
-        )
+        val rotaryEvent =
+            RotaryScrollEvent(
+                verticalScrollPixels = axisValue * getScaledVerticalScrollFactor(config, context),
+                horizontalScrollPixels =
+                    axisValue * getScaledHorizontalScrollFactor(config, context),
+                uptimeMillis = event.eventTime,
+                inputDeviceId = event.deviceId
+            )
         return focusOwner.dispatchRotaryEvent(rotaryEvent)
     }
 
@@ -1866,97 +1872,106 @@
             recalculateWindowPosition(motionEvent)
             forceUseMatrixCache = true
             measureAndLayout(sendPointerUpdate = false)
-            val result = trace("AndroidOwner:onTouch") {
-                val action = motionEvent.actionMasked
-                val lastEvent = previousMotionEvent
+            val result =
+                trace("AndroidOwner:onTouch") {
+                    val action = motionEvent.actionMasked
+                    val lastEvent = previousMotionEvent
 
-                val wasMouseEvent = lastEvent?.getToolType(0) == TOOL_TYPE_MOUSE
-                if (lastEvent != null &&
-                    hasChangedDevices(motionEvent, lastEvent)
-                ) {
-                    if (isDevicePressEvent(lastEvent)) {
-                        // Send a cancel event
-                        pointerInputEventProcessor.processCancel()
-                    } else if (lastEvent.actionMasked != ACTION_HOVER_EXIT && wasMouseEvent) {
-                        // The mouse cursor disappeared without sending an ACTION_HOVER_EXIT, so
-                        // we have to send that event.
-                        sendSimulatedEvent(lastEvent, ACTION_HOVER_EXIT, lastEvent.eventTime)
-                    }
-                }
-
-                val isMouseEvent = motionEvent.getToolType(0) == TOOL_TYPE_MOUSE
-
-                if (!wasMouseEvent &&
-                    isMouseEvent &&
-                    action != ACTION_CANCEL &&
-                    action != ACTION_HOVER_ENTER &&
-                    isInBounds(motionEvent)
-                ) {
-                    // We didn't previously have an enter event and we're getting our first
-                    // mouse event. Send a simulated enter event so that we have a consistent
-                    // enter/exit.
-                    sendSimulatedEvent(motionEvent, ACTION_HOVER_ENTER, motionEvent.eventTime)
-                }
-                lastEvent?.recycle()
-
-                // If the previous MotionEvent was an ACTION_HOVER_EXIT, we need to check if it
-                // was a synthetic MotionEvent generated by the platform for an ACTION_DOWN event
-                // or not.
-                //
-                // If it was synthetic, we do nothing, because we want to keep the existing cache
-                // of "Hit" Modifier.Node(s) from the previous hover events, so we can reuse them
-                // once an ACTION_UP event is triggered and we return to the same hover state
-                // (cache improves performance for this frequent event sequence with a mouse).
-                //
-                // If it was NOT synthetic, we end the event stream in MotionEventAdapter and clear
-                // the hit cache used in PointerInputEventProcessor (specifically, the
-                // HitPathTracker cache inside PointerInputEventProcessor), so events in this new
-                // stream do not trigger Modifier.Node(s) hit by the previous stream.
-                if (previousMotionEvent?.action == ACTION_HOVER_EXIT) {
-                    val previousEventDefaultPointerId =
-                        previousMotionEvent?.getPointerId(0) ?: -1
-
-                    // New ACTION_HOVER_ENTER, so this should be considered a new stream
-                    if (motionEvent.action == ACTION_HOVER_ENTER && motionEvent.historySize == 0) {
-                        if (previousEventDefaultPointerId >= 0) {
-                            motionEventAdapter.endStream(previousEventDefaultPointerId)
+                    val wasMouseEvent = lastEvent?.getToolType(0) == TOOL_TYPE_MOUSE
+                    if (lastEvent != null && hasChangedDevices(motionEvent, lastEvent)) {
+                        if (isDevicePressEvent(lastEvent)) {
+                            // Send a cancel event
+                            pointerInputEventProcessor.processCancel()
+                        } else if (lastEvent.actionMasked != ACTION_HOVER_EXIT && wasMouseEvent) {
+                            // The mouse cursor disappeared without sending an ACTION_HOVER_EXIT, so
+                            // we have to send that event.
+                            sendSimulatedEvent(lastEvent, ACTION_HOVER_EXIT, lastEvent.eventTime)
                         }
-                    } else if (motionEvent.action == ACTION_DOWN && motionEvent.historySize == 0) {
-                        val previousX = previousMotionEvent?.x ?: Float.NaN
-                        val previousY = previousMotionEvent?.y ?: Float.NaN
+                    }
 
-                        val currentX = motionEvent.x
-                        val currentY = motionEvent.y
+                    val isMouseEvent = motionEvent.getToolType(0) == TOOL_TYPE_MOUSE
 
-                        val previousAndCurrentCoordinatesDoNotMatch =
-                            (previousX != currentX || previousY != currentY)
+                    if (
+                        !wasMouseEvent &&
+                            isMouseEvent &&
+                            action != ACTION_CANCEL &&
+                            action != ACTION_HOVER_ENTER &&
+                            isInBounds(motionEvent)
+                    ) {
+                        // We didn't previously have an enter event and we're getting our first
+                        // mouse event. Send a simulated enter event so that we have a consistent
+                        // enter/exit.
+                        sendSimulatedEvent(motionEvent, ACTION_HOVER_ENTER, motionEvent.eventTime)
+                    }
+                    lastEvent?.recycle()
 
-                        val previousEventTime = previousMotionEvent?.eventTime ?: -1L
+                    // If the previous MotionEvent was an ACTION_HOVER_EXIT, we need to check if it
+                    // was a synthetic MotionEvent generated by the platform for an ACTION_DOWN
+                    // event
+                    // or not.
+                    //
+                    // If it was synthetic, we do nothing, because we want to keep the existing
+                    // cache
+                    // of "Hit" Modifier.Node(s) from the previous hover events, so we can reuse
+                    // them
+                    // once an ACTION_UP event is triggered and we return to the same hover state
+                    // (cache improves performance for this frequent event sequence with a mouse).
+                    //
+                    // If it was NOT synthetic, we end the event stream in MotionEventAdapter and
+                    // clear
+                    // the hit cache used in PointerInputEventProcessor (specifically, the
+                    // HitPathTracker cache inside PointerInputEventProcessor), so events in this
+                    // new
+                    // stream do not trigger Modifier.Node(s) hit by the previous stream.
+                    if (previousMotionEvent?.action == ACTION_HOVER_EXIT) {
+                        val previousEventDefaultPointerId =
+                            previousMotionEvent?.getPointerId(0) ?: -1
 
-                        val previousAndCurrentEventTimesDoNotMatch =
-                            previousEventTime != motionEvent.eventTime
-
-                        // A synthetically created Hover Exit event will always have the same x,
-                        // y, and timestamp as the down event it proceeds.
-                        val previousHoverEventWasNotSyntheticallyProducedFromADownEvent =
-                            previousAndCurrentCoordinatesDoNotMatch ||
-                            previousAndCurrentEventTimesDoNotMatch
-
-                        if (previousHoverEventWasNotSyntheticallyProducedFromADownEvent) {
-                            // This should be considered a new stream, and we should
-                            // reset everything.
+                        // New ACTION_HOVER_ENTER, so this should be considered a new stream
+                        if (
+                            motionEvent.action == ACTION_HOVER_ENTER && motionEvent.historySize == 0
+                        ) {
                             if (previousEventDefaultPointerId >= 0) {
                                 motionEventAdapter.endStream(previousEventDefaultPointerId)
                             }
-                            pointerInputEventProcessor.clearPreviouslyHitModifierNodes()
+                        } else if (
+                            motionEvent.action == ACTION_DOWN && motionEvent.historySize == 0
+                        ) {
+                            val previousX = previousMotionEvent?.x ?: Float.NaN
+                            val previousY = previousMotionEvent?.y ?: Float.NaN
+
+                            val currentX = motionEvent.x
+                            val currentY = motionEvent.y
+
+                            val previousAndCurrentCoordinatesDoNotMatch =
+                                (previousX != currentX || previousY != currentY)
+
+                            val previousEventTime = previousMotionEvent?.eventTime ?: -1L
+
+                            val previousAndCurrentEventTimesDoNotMatch =
+                                previousEventTime != motionEvent.eventTime
+
+                            // A synthetically created Hover Exit event will always have the same x,
+                            // y, and timestamp as the down event it proceeds.
+                            val previousHoverEventWasNotSyntheticallyProducedFromADownEvent =
+                                previousAndCurrentCoordinatesDoNotMatch ||
+                                    previousAndCurrentEventTimesDoNotMatch
+
+                            if (previousHoverEventWasNotSyntheticallyProducedFromADownEvent) {
+                                // This should be considered a new stream, and we should
+                                // reset everything.
+                                if (previousEventDefaultPointerId >= 0) {
+                                    motionEventAdapter.endStream(previousEventDefaultPointerId)
+                                }
+                                pointerInputEventProcessor.clearPreviouslyHitModifierNodes()
+                            }
                         }
                     }
+
+                    previousMotionEvent = MotionEvent.obtainNoHistory(motionEvent)
+
+                    sendMotionEvent(motionEvent)
                 }
-
-                previousMotionEvent = MotionEvent.obtainNoHistory(motionEvent)
-
-                sendMotionEvent(motionEvent)
-            }
             return result
         } finally {
             forceUseMatrixCache = false
@@ -1964,8 +1979,7 @@
     }
 
     private fun hasChangedDevices(event: MotionEvent, lastEvent: MotionEvent): Boolean {
-        return lastEvent.source != event.source ||
-            lastEvent.getToolType(0) != event.getToolType(0)
+        return lastEvent.source != event.source || lastEvent.getToolType(0) != event.getToolType(0)
     }
 
     private fun isDevicePressEvent(event: MotionEvent): Boolean {
@@ -1976,12 +1990,13 @@
             ACTION_POINTER_UP, // means that there is at least one remaining pointer
             ACTION_DOWN,
             ACTION_MOVE -> true
-//            ACTION_SCROLL, // We've already checked for buttonState, so it must not be down
-//            ACTION_HOVER_ENTER,
-//            ACTION_HOVER_MOVE,
-//            ACTION_HOVER_EXIT,
-//            ACTION_UP,
-//            ACTION_CANCEL,
+            //            ACTION_SCROLL, // We've already checked for buttonState, so it must not be
+            // down
+            //            ACTION_HOVER_ENTER,
+            //            ACTION_HOVER_MOVE,
+            //            ACTION_HOVER_EXIT,
+            //            ACTION_UP,
+            //            ACTION_CANCEL,
             else -> false
         }
     }
@@ -1992,26 +2007,24 @@
             keyboardModifiersRequireUpdate = false
             _windowInfo.keyboardModifiers = PointerKeyboardModifiers(motionEvent.metaState)
         }
-        val pointerInputEvent =
-            motionEventAdapter.convertToPointerInputEvent(motionEvent, this)
+        val pointerInputEvent = motionEventAdapter.convertToPointerInputEvent(motionEvent, this)
         return if (pointerInputEvent != null) {
             // Cache the last position of the last pointer to go down so we can check if
             // it's in a scrollable region in canScroll{Vertically|Horizontally}. Those
             // methods use semantics data, and because semantics coordinates are local to
             // this view, the pointer _position_, not _positionOnScreen_, is the offset that
             // needs to be cached.
-            pointerInputEvent.pointers.fastLastOrNull { it.down }?.position?.let {
-                lastDownPointerPosition = it
-            }
+            pointerInputEvent.pointers
+                .fastLastOrNull { it.down }
+                ?.position
+                ?.let { lastDownPointerPosition = it }
 
-            val result = pointerInputEventProcessor.process(
-                pointerInputEvent,
-                this,
-                isInBounds(motionEvent)
-            )
+            val result =
+                pointerInputEventProcessor.process(pointerInputEvent, this, isInBounds(motionEvent))
             val action = motionEvent.actionMasked
-            if ((action == ACTION_DOWN || action == ACTION_POINTER_DOWN) &&
-                !result.dispatchedToAPointerInputModifier
+            if (
+                (action == ACTION_DOWN || action == ACTION_POINTER_DOWN) &&
+                    !result.dispatchedToAPointerInputModifier
             ) {
                 // We aren't handling the pointer, so the event stream has ended for us.
                 // The next time we receive a pointer event, it should be considered a new
@@ -2021,10 +2034,7 @@
             result
         } else {
             pointerInputEventProcessor.processCancel()
-            ProcessResult(
-                dispatchedToAPointerInputModifier = false,
-                anyMovementConsumed = false
-            )
+            ProcessResult(dispatchedToAPointerInputModifier = false, anyMovementConsumed = false)
         }
     }
 
@@ -2036,11 +2046,13 @@
         forceHover: Boolean = true
     ) {
         // don't send any events for pointers that are "up" unless they support hover
-        val upIndex = when (motionEvent.actionMasked) {
-            ACTION_UP -> if (action == ACTION_HOVER_ENTER || action == ACTION_HOVER_EXIT) -1 else 0
-            ACTION_POINTER_UP -> motionEvent.actionIndex
-            else -> -1
-        }
+        val upIndex =
+            when (motionEvent.actionMasked) {
+                ACTION_UP ->
+                    if (action == ACTION_HOVER_ENTER || action == ACTION_HOVER_EXIT) -1 else 0
+                ACTION_POINTER_UP -> motionEvent.actionIndex
+                else -> -1
+            }
         val pointerCount = motionEvent.pointerCount - if (upIndex >= 0) 1 else 0
         if (pointerCount == 0) {
             return
@@ -2059,42 +2071,39 @@
         }
         val buttonState = if (forceHover) 0 else motionEvent.buttonState
 
-        val downTime = if (motionEvent.downTime == motionEvent.eventTime) {
-            eventTime
-        } else {
-            motionEvent.downTime
-        }
-        val event = MotionEvent.obtain(
-            /* downTime */ downTime,
-            /* eventTime */ eventTime,
-            /* action */ action,
-            /* pointerCount */ pointerCount,
-            /* pointerProperties */ pointerProperties,
-            /* pointerCoords */ pointerCoords,
-            /* metaState */ motionEvent.metaState,
-            /* buttonState */ buttonState,
-            /* xPrecision */ motionEvent.xPrecision,
-            /* yPrecision */ motionEvent.yPrecision,
-            /* deviceId */ motionEvent.deviceId,
-            /* edgeFlags */ motionEvent.edgeFlags,
-            /* source */ motionEvent.source,
-            /* flags */ motionEvent.flags
-        )
-        val pointerInputEvent =
-            motionEventAdapter.convertToPointerInputEvent(event, this)!!
+        val downTime =
+            if (motionEvent.downTime == motionEvent.eventTime) {
+                eventTime
+            } else {
+                motionEvent.downTime
+            }
+        val event =
+            MotionEvent.obtain(
+                /* downTime */ downTime,
+                /* eventTime */ eventTime,
+                /* action */ action,
+                /* pointerCount */ pointerCount,
+                /* pointerProperties */ pointerProperties,
+                /* pointerCoords */ pointerCoords,
+                /* metaState */ motionEvent.metaState,
+                /* buttonState */ buttonState,
+                /* xPrecision */ motionEvent.xPrecision,
+                /* yPrecision */ motionEvent.yPrecision,
+                /* deviceId */ motionEvent.deviceId,
+                /* edgeFlags */ motionEvent.edgeFlags,
+                /* source */ motionEvent.source,
+                /* flags */ motionEvent.flags
+            )
+        val pointerInputEvent = motionEventAdapter.convertToPointerInputEvent(event, this)!!
 
-        pointerInputEventProcessor.process(
-            pointerInputEvent,
-            this,
-            true
-        )
+        pointerInputEventProcessor.process(pointerInputEvent, this, true)
         event.recycle()
     }
 
     /**
      * This method is required to correctly support swipe-to-dismiss layouts on WearOS, which search
-     * their children for scrollable views to determine whether or not to intercept touch events –
-     * a sort of simplified nested scrolling mechanism.
+     * their children for scrollable views to determine whether or not to intercept touch events – a
+     * sort of simplified nested scrolling mechanism.
      *
      * Because a composition may contain many scrollable and non-scrollable areas, and this method
      * doesn't know which part of the view the caller cares about, it uses the
@@ -2116,10 +2125,7 @@
     override fun localToScreen(localPosition: Offset): Offset {
         recalculateWindowPosition()
         val local = viewToWindowMatrix.map(localPosition)
-        return Offset(
-            local.x + windowPosition.x,
-            local.y + windowPosition.y
-        )
+        return Offset(local.x + windowPosition.x, local.y + windowPosition.y)
     }
 
     override fun localToScreen(localTransform: Matrix) {
@@ -2159,20 +2165,17 @@
     }
 
     /**
-     * Recalculates the window position based on the [motionEvent]'s coordinates and
-     * screen coordinates. Some devices give false positions for [getLocationOnScreen] in
-     * some unusual circumstances, so a different mechanism must be used to determine the
-     * actual position.
+     * Recalculates the window position based on the [motionEvent]'s coordinates and screen
+     * coordinates. Some devices give false positions for [getLocationOnScreen] in some unusual
+     * circumstances, so a different mechanism must be used to determine the actual position.
      */
     private fun recalculateWindowPosition(motionEvent: MotionEvent) {
         lastMatrixRecalculationAnimationTime = AnimationUtils.currentAnimationTimeMillis()
         recalculateWindowViewTransforms()
         val positionInWindow = viewToWindowMatrix.map(Offset(motionEvent.x, motionEvent.y))
 
-        windowPosition = Offset(
-            motionEvent.rawX - positionInWindow.x,
-            motionEvent.rawY - positionInWindow.y
-        )
+        windowPosition =
+            Offset(motionEvent.rawX - positionInWindow.x, motionEvent.rawY - positionInWindow.y)
     }
 
     private fun recalculateWindowViewTransforms() {
@@ -2181,8 +2184,9 @@
     }
 
     override fun onCheckIsTextEditor(): Boolean {
-        val parentSession = textInputSessionMutex.currentSession
-            ?: return legacyTextInputServiceAndroid.isEditorFocused()
+        val parentSession =
+            textInputSessionMutex.currentSession
+                ?: return legacyTextInputServiceAndroid.isEditorFocused()
         // Don't bring this up before the ?: – establishTextInputSession has been called, but
         // startInputMethod has not, we're not a text editor until the session is cancelled or
         // startInputMethod is called.
@@ -2190,8 +2194,9 @@
     }
 
     override fun onCreateInputConnection(outAttrs: EditorInfo): InputConnection? {
-        val parentSession = textInputSessionMutex.currentSession
-            ?: return legacyTextInputServiceAndroid.createInputConnection(outAttrs)
+        val parentSession =
+            textInputSessionMutex.currentSession
+                ?: return legacyTextInputServiceAndroid.createInputConnection(outAttrs)
         // Don't bring this up before the ?: - if this returns null, we SHOULD NOT fall back to
         // the legacy input system.
         return parentSession.createInputConnection(outAttrs)
@@ -2265,7 +2270,6 @@
                     return false
                 }
             }
-
             ACTION_HOVER_MOVE ->
                 // Check if we're receiving this when we've already handled it elsewhere
                 if (!isPositionChanged(event)) {
@@ -2277,17 +2281,19 @@
     }
 
     private fun isBadMotionEvent(event: MotionEvent): Boolean {
-        var eventInvalid = !event.x.isFinite() ||
-            !event.y.isFinite() ||
-            !event.rawX.isFinite() ||
-            !event.rawY.isFinite()
+        var eventInvalid =
+            !event.x.isFinite() ||
+                !event.y.isFinite() ||
+                !event.rawX.isFinite() ||
+                !event.rawY.isFinite()
 
         if (!eventInvalid) {
             // First event x,y is checked above if block, so we can skip index 0.
             for (index in 1 until event.pointerCount) {
-                eventInvalid = !event.getX(index).isFinite() ||
-                    !event.getY(index).isFinite() ||
-                    (SDK_INT >= Q && !isValidMotionEvent(event, index))
+                eventInvalid =
+                    !event.getX(index).isFinite() ||
+                        !event.getY(index).isFinite() ||
+                        (SDK_INT >= Q && !isValidMotionEvent(event, index))
 
                 if (eventInvalid) break
             }
@@ -2301,8 +2307,10 @@
             return true
         }
         val lastEvent = previousMotionEvent
-        return lastEvent == null || lastEvent.pointerCount != event.pointerCount ||
-            event.rawX != lastEvent.rawX || event.rawY != lastEvent.rawY
+        return lastEvent == null ||
+            lastEvent.pointerCount != event.pointerCount ||
+            event.rawX != lastEvent.rawX ||
+            event.rawY != lastEvent.rawY
     }
 
     private fun findViewByAccessibilityIdRootedAtCurrentView(
@@ -2310,18 +2318,19 @@
         currentView: View
     ): View? {
         if (SDK_INT < Q) {
-            val getAccessibilityViewIdMethod = Class.forName("android.view.View")
-                .getDeclaredMethod("getAccessibilityViewId")
+            val getAccessibilityViewIdMethod =
+                Class.forName("android.view.View").getDeclaredMethod("getAccessibilityViewId")
             getAccessibilityViewIdMethod.isAccessible = true
             if (getAccessibilityViewIdMethod.invoke(currentView) == accessibilityId) {
                 return currentView
             }
             if (currentView is ViewGroup) {
                 for (i in 0 until currentView.childCount) {
-                    val foundView = findViewByAccessibilityIdRootedAtCurrentView(
-                        accessibilityId,
-                        currentView.getChildAt(i)
-                    )
+                    val foundView =
+                        findViewByAccessibilityIdRootedAtCurrentView(
+                            accessibilityId,
+                            currentView.getChildAt(i)
+                        )
                     if (foundView != null) {
                         return foundView
                     }
@@ -2352,11 +2361,11 @@
 
     /**
      * This overrides an @hide method in ViewGroup. Because of the @hide, the override keyword
-     * cannot be used, but the override works anyway because the ViewGroup method is not final.
-     * In Android P and earlier, the call path is
+     * cannot be used, but the override works anyway because the ViewGroup method is not final. In
+     * Android P and earlier, the call path is
      * AccessibilityInteractionController#findViewByAccessibilityId ->
-     * View#findViewByAccessibilityId -> ViewGroup#findViewByAccessibilityIdTraversal. In Android
-     * Q and later, AccessibilityInteractionController#findViewByAccessibilityId uses
+     * View#findViewByAccessibilityId -> ViewGroup#findViewByAccessibilityIdTraversal. In Android Q
+     * and later, AccessibilityInteractionController#findViewByAccessibilityId uses
      * AccessibilityNodeIdManager and findViewByAccessibilityIdTraversal is only used by autofill.
      */
     @Suppress("BanHideTag")
@@ -2369,8 +2378,9 @@
             // ViewGroup#findViewByAccessibilityIdTraversal signature is changed or removed, we can
             // simply return null here because there will be no call to this method.
             return if (SDK_INT >= Q) {
-                val findViewByAccessibilityIdTraversalMethod = Class.forName("android.view.View")
-                    .getDeclaredMethod("findViewByAccessibilityIdTraversal", Int::class.java)
+                val findViewByAccessibilityIdTraversalMethod =
+                    Class.forName("android.view.View")
+                        .getDeclaredMethod("findViewByAccessibilityIdTraversal", Int::class.java)
                 findViewByAccessibilityIdTraversalMethod.isAccessible = true
                 findViewByAccessibilityIdTraversalMethod.invoke(this, accessibilityId) as? View
             } else {
@@ -2382,8 +2392,7 @@
     }
 
     override val isLifecycleInResumedState: Boolean
-        get() = viewTreeOwners?.lifecycleOwner
-            ?.lifecycle?.currentState == Lifecycle.State.RESUMED
+        get() = viewTreeOwners?.lifecycleOwner?.lifecycle?.currentState == Lifecycle.State.RESUMED
 
     override fun shouldDelayChildPressedState(): Boolean = false
 
@@ -2393,32 +2402,28 @@
 
         // TODO(mount): replace with ViewCompat.isShowingLayoutBounds() when it becomes available.
         @Suppress("BanUncheckedReflection")
-        private fun getIsShowingLayoutBounds(): Boolean = try {
-            if (systemPropertiesClass == null) {
-                systemPropertiesClass = Class.forName("android.os.SystemProperties")
-                getBooleanMethod = systemPropertiesClass?.getDeclaredMethod(
-                    "getBoolean",
-                    String::class.java,
-                    Boolean::class.java
-                )
+        private fun getIsShowingLayoutBounds(): Boolean =
+            try {
+                if (systemPropertiesClass == null) {
+                    systemPropertiesClass = Class.forName("android.os.SystemProperties")
+                    getBooleanMethod =
+                        systemPropertiesClass?.getDeclaredMethod(
+                            "getBoolean",
+                            String::class.java,
+                            Boolean::class.java
+                        )
+                }
+                getBooleanMethod?.invoke(null, "debug.layout", false) as? Boolean ?: false
+            } catch (e: Exception) {
+                false
             }
-            getBooleanMethod?.invoke(null, "debug.layout", false) as? Boolean ?: false
-        } catch (e: Exception) {
-            false
-        }
     }
 
-    /**
-     * Combines objects populated via ViewTree*Owner
-     */
+    /** Combines objects populated via ViewTree*Owner */
     class ViewTreeOwners(
-        /**
-         * The [LifecycleOwner] associated with this owner.
-         */
+        /** The [LifecycleOwner] associated with this owner. */
         val lifecycleOwner: LifecycleOwner,
-        /**
-         * The [SavedStateRegistryOwner] associated with this owner.
-         */
+        /** The [SavedStateRegistryOwner] associated with this owner. */
         val savedStateRegistryOwner: SavedStateRegistryOwner
     )
 }
@@ -2446,8 +2451,8 @@
 
 /**
  * These classes are here to ensure that the classes that use this API will get verified and can be
- * AOT compiled. It is expected that this class will soft-fail verification, but the classes
- * which use this method will pass.
+ * AOT compiled. It is expected that this class will soft-fail verification, but the classes which
+ * use this method will pass.
  */
 @RequiresApi(O)
 private object AndroidComposeViewVerificationHelperMethodsO {
@@ -2465,19 +2470,17 @@
     @DoNotInline
     @RequiresApi(N)
     fun setPointerIcon(view: View, icon: PointerIcon?) {
-        val iconToSet = when (icon) {
-            is AndroidPointerIcon ->
-                icon.pointerIcon
-
-            is AndroidPointerIconType ->
-                android.view.PointerIcon.getSystemIcon(view.context, icon.type)
-
-            else ->
-                android.view.PointerIcon.getSystemIcon(
-                    view.context,
-                    android.view.PointerIcon.TYPE_DEFAULT
-                )
-        }
+        val iconToSet =
+            when (icon) {
+                is AndroidPointerIcon -> icon.pointerIcon
+                is AndroidPointerIconType ->
+                    android.view.PointerIcon.getSystemIcon(view.context, icon.type)
+                else ->
+                    android.view.PointerIcon.getSystemIcon(
+                        view.context,
+                        android.view.PointerIcon.TYPE_DEFAULT
+                    )
+            }
 
         if (view.pointerIcon != iconToSet) {
             view.pointerIcon = iconToSet
@@ -2509,9 +2512,7 @@
     }
 }
 
-/**
- * Sets this [Matrix] to be the result of this * [other]
- */
+/** Sets this [Matrix] to be the result of this * [other] */
 private fun Matrix.preTransform(other: Matrix) {
     val v00 = dot(other, 0, this, 0)
     val v01 = dot(other, 0, this, 1)
@@ -2547,9 +2548,7 @@
     this[3, 3] = v33
 }
 
-/**
- * Like [android.graphics.Matrix.preTranslate], for a Compose [Matrix]
- */
+/** Like [android.graphics.Matrix.preTranslate], for a Compose [Matrix] */
 private fun Matrix.preTranslate(x: Float, y: Float, tmpMatrix: Matrix) {
     tmpMatrix.reset()
     tmpMatrix.translate(x, y)
@@ -2632,9 +2631,7 @@
         preTransform(tmpMatrix)
     }
 
-    /**
-     * Like [android.graphics.Matrix.preTranslate], for a Compose [Matrix]
-     */
+    /** Like [android.graphics.Matrix.preTranslate], for a Compose [Matrix] */
     private fun Matrix.preTranslate(x: Float, y: Float) {
         preTranslate(x, y, tmpMatrix)
     }
@@ -2656,51 +2653,49 @@
         view: View,
         transferData: DragAndDropTransferData,
         dragShadowBuilder: ComposeDragShadowBuilder
-    ): Boolean = view.startDragAndDrop(
-        transferData.clipData,
-        dragShadowBuilder,
-        transferData.localState,
-        transferData.flags,
-    )
+    ): Boolean =
+        view.startDragAndDrop(
+            transferData.clipData,
+            dragShadowBuilder,
+            transferData.localState,
+            transferData.flags,
+        )
 }
 
-/**
- * A Class that provides access [View.OnDragListener] APIs for a [DragAndDropNode].
- */
+/** A Class that provides access [View.OnDragListener] APIs for a [DragAndDropNode]. */
 private class DragAndDropModifierOnDragListener(
-    private val startDrag: (
-        transferData: DragAndDropTransferData,
-        decorationSize: Size,
-        drawDragDecoration: DrawScope.() -> Unit
-    ) -> Boolean
+    private val startDrag:
+        (
+            transferData: DragAndDropTransferData,
+            decorationSize: Size,
+            drawDragDecoration: DrawScope.() -> Unit
+        ) -> Boolean
 ) : View.OnDragListener, DragAndDropManager {
 
     private val rootDragAndDropNode = DragAndDropNode { null }
 
     /**
-     * A collection [DragAndDropModifierNode] instances that registered interested in a
-     * drag and drop session by returning true in [DragAndDropModifierNode.onStarted].
+     * A collection [DragAndDropModifierNode] instances that registered interested in a drag and
+     * drop session by returning true in [DragAndDropModifierNode.onStarted].
      */
     private val interestedNodes = ArraySet<DragAndDropModifierNode>()
 
-    override val modifier: Modifier = object : ModifierNodeElement<DragAndDropNode>() {
-        override fun create() = rootDragAndDropNode
+    override val modifier: Modifier =
+        object : ModifierNodeElement<DragAndDropNode>() {
+            override fun create() = rootDragAndDropNode
 
-        override fun update(node: DragAndDropNode) = Unit
+            override fun update(node: DragAndDropNode) = Unit
 
-        override fun InspectorInfo.inspectableProperties() {
-            name = "RootDragAndDropNode"
+            override fun InspectorInfo.inspectableProperties() {
+                name = "RootDragAndDropNode"
+            }
+
+            override fun hashCode(): Int = rootDragAndDropNode.hashCode()
+
+            override fun equals(other: Any?) = other === this
         }
 
-        override fun hashCode(): Int = rootDragAndDropNode.hashCode()
-
-        override fun equals(other: Any?) = other === this
-    }
-
-    override fun onDrag(
-        view: View,
-        event: DragEvent
-    ): Boolean {
+    override fun onDrag(view: View, event: DragEvent): Boolean {
         val dragAndDropEvent = DragAndDropEvent(dragEvent = event)
         return when (event.action) {
             DragEvent.ACTION_DRAG_STARTED -> {
@@ -2708,29 +2703,23 @@
                 interestedNodes.forEach { it.onStarted(dragAndDropEvent) }
                 accepted
             }
-
             DragEvent.ACTION_DROP -> rootDragAndDropNode.onDrop(dragAndDropEvent)
-
             DragEvent.ACTION_DRAG_ENTERED -> {
                 rootDragAndDropNode.onEntered(dragAndDropEvent)
                 false
             }
-
             DragEvent.ACTION_DRAG_LOCATION -> {
                 rootDragAndDropNode.onMoved(dragAndDropEvent)
                 false
             }
-
             DragEvent.ACTION_DRAG_EXITED -> {
                 rootDragAndDropNode.onExited(dragAndDropEvent)
                 false
             }
-
             DragEvent.ACTION_DRAG_ENDED -> {
                 rootDragAndDropNode.onEnded(dragAndDropEvent)
                 false
             }
-
             else -> false
         }
     }
@@ -2739,11 +2728,12 @@
         transferData: DragAndDropTransferData,
         decorationSize: Size,
         drawDragDecoration: DrawScope.() -> Unit,
-    ): Boolean = startDrag(
-        transferData,
-        decorationSize,
-        drawDragDecoration,
-    )
+    ): Boolean =
+        startDrag(
+            transferData,
+            decorationSize,
+            drawDragDecoration,
+        )
 
     override fun registerNodeInterest(node: DragAndDropModifierNode) {
         interestedNodes.add(node)
diff --git a/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/platform/AndroidComposeViewAccessibilityDelegateCompat.android.kt b/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/platform/AndroidComposeViewAccessibilityDelegateCompat.android.kt
index cd278a2..ea06e69 100644
--- a/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/platform/AndroidComposeViewAccessibilityDelegateCompat.android.kt
+++ b/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/platform/AndroidComposeViewAccessibilityDelegateCompat.android.kt
@@ -146,14 +146,12 @@
         const val ExtraDataIdKey = "androidx.compose.ui.semantics.id"
 
         /**
-         * Intent size limitations prevent sending over a megabyte of data. Limit
-         * text length to 100K characters - 200KB.
+         * Intent size limitations prevent sending over a megabyte of data. Limit text length to
+         * 100K characters - 200KB.
          */
         const val ParcelSafeTextLength = 100000
 
-        /**
-         * The undefined cursor position.
-         */
+        /** The undefined cursor position. */
         const val AccessibilityCursorPositionUndefined = -1
 
         // 20 is taken from AbsSeekbar.java.
@@ -164,48 +162,48 @@
          * traversed event could be resulted from the same traverse action.
          */
         const val TextTraversedEventTimeoutMillis: Long = 1000
-        private val AccessibilityActionsResourceIds = intListOf(
-            R.id.accessibility_custom_action_0,
-            R.id.accessibility_custom_action_1,
-            R.id.accessibility_custom_action_2,
-            R.id.accessibility_custom_action_3,
-            R.id.accessibility_custom_action_4,
-            R.id.accessibility_custom_action_5,
-            R.id.accessibility_custom_action_6,
-            R.id.accessibility_custom_action_7,
-            R.id.accessibility_custom_action_8,
-            R.id.accessibility_custom_action_9,
-            R.id.accessibility_custom_action_10,
-            R.id.accessibility_custom_action_11,
-            R.id.accessibility_custom_action_12,
-            R.id.accessibility_custom_action_13,
-            R.id.accessibility_custom_action_14,
-            R.id.accessibility_custom_action_15,
-            R.id.accessibility_custom_action_16,
-            R.id.accessibility_custom_action_17,
-            R.id.accessibility_custom_action_18,
-            R.id.accessibility_custom_action_19,
-            R.id.accessibility_custom_action_20,
-            R.id.accessibility_custom_action_21,
-            R.id.accessibility_custom_action_22,
-            R.id.accessibility_custom_action_23,
-            R.id.accessibility_custom_action_24,
-            R.id.accessibility_custom_action_25,
-            R.id.accessibility_custom_action_26,
-            R.id.accessibility_custom_action_27,
-            R.id.accessibility_custom_action_28,
-            R.id.accessibility_custom_action_29,
-            R.id.accessibility_custom_action_30,
-            R.id.accessibility_custom_action_31
-        )
+        private val AccessibilityActionsResourceIds =
+            intListOf(
+                R.id.accessibility_custom_action_0,
+                R.id.accessibility_custom_action_1,
+                R.id.accessibility_custom_action_2,
+                R.id.accessibility_custom_action_3,
+                R.id.accessibility_custom_action_4,
+                R.id.accessibility_custom_action_5,
+                R.id.accessibility_custom_action_6,
+                R.id.accessibility_custom_action_7,
+                R.id.accessibility_custom_action_8,
+                R.id.accessibility_custom_action_9,
+                R.id.accessibility_custom_action_10,
+                R.id.accessibility_custom_action_11,
+                R.id.accessibility_custom_action_12,
+                R.id.accessibility_custom_action_13,
+                R.id.accessibility_custom_action_14,
+                R.id.accessibility_custom_action_15,
+                R.id.accessibility_custom_action_16,
+                R.id.accessibility_custom_action_17,
+                R.id.accessibility_custom_action_18,
+                R.id.accessibility_custom_action_19,
+                R.id.accessibility_custom_action_20,
+                R.id.accessibility_custom_action_21,
+                R.id.accessibility_custom_action_22,
+                R.id.accessibility_custom_action_23,
+                R.id.accessibility_custom_action_24,
+                R.id.accessibility_custom_action_25,
+                R.id.accessibility_custom_action_26,
+                R.id.accessibility_custom_action_27,
+                R.id.accessibility_custom_action_28,
+                R.id.accessibility_custom_action_29,
+                R.id.accessibility_custom_action_30,
+                R.id.accessibility_custom_action_31
+            )
     }
 
     // TODO(b/272068594): The current tests assert whether this variable was set. We should instead
     //  assert the behavior that is affected based on the value set here. (Eg, If we have a
     //  previously hovered item, we send a hover exit event when a new item is hovered).
     /** Virtual view id for the currently hovered logical item. */
-    @VisibleForTesting
-    internal var hoveredVirtualViewId = InvalidId
+    @VisibleForTesting internal var hoveredVirtualViewId = InvalidId
 
     // We could use UiAutomation.OnAccessibilityEventListener, but the tests were
     // flaky, so we use this callback to test accessibility events.
@@ -224,19 +222,19 @@
         }
 
     /**
-     * Delay before dispatching a recurring accessibility event in milliseconds.
-     * This delay guarantees that a recurring event will be send at most once
-     * during the [SendRecurringAccessibilityEventsIntervalMillis] time
-     * frame.
+     * Delay before dispatching a recurring accessibility event in milliseconds. This delay
+     * guarantees that a recurring event will be send at most once during the
+     * [SendRecurringAccessibilityEventsIntervalMillis] time frame.
      */
     internal var SendRecurringAccessibilityEventsIntervalMillis = 100L
 
     private val enabledStateListener = AccessibilityStateChangeListener { enabled ->
-        enabledServices = if (enabled) {
-            accessibilityManager.getEnabledAccessibilityServiceList(FEEDBACK_ALL_MASK)
-        } else {
-            emptyList()
-        }
+        enabledServices =
+            if (enabled) {
+                accessibilityManager.getEnabledAccessibilityServiceList(FEEDBACK_ALL_MASK)
+            } else {
+                emptyList()
+            }
     }
 
     private val touchExplorationStateListener = TouchExplorationStateChangeListener {
@@ -251,18 +249,20 @@
      * doesn't appear in the list of enabled services)
      */
     internal val isEnabled: Boolean
-        get() = accessibilityForceEnabledForTesting ||
-            // checking the list allows us to filter out the UIAutomator which doesn't appear in it
-            (accessibilityManager.isEnabled && enabledServices.isNotEmpty())
+        get() =
+            accessibilityForceEnabledForTesting ||
+                // checking the list allows us to filter out the UIAutomator which doesn't appear in
+                // it
+                (accessibilityManager.isEnabled && enabledServices.isNotEmpty())
 
     /**
      * True if accessibility service with the touch exploration (e.g. Talkback) is enabled in the
-     * system.
-     * Note that UIAutomator doesn't request touch exploration therefore returns false
+     * system. Note that UIAutomator doesn't request touch exploration therefore returns false
      */
     private val isTouchExplorationEnabled
-        get() = accessibilityForceEnabledForTesting ||
-            (accessibilityManager.isEnabled && accessibilityManager.isTouchExplorationEnabled)
+        get() =
+            accessibilityForceEnabledForTesting ||
+                (accessibilityManager.isEnabled && accessibilityManager.isTouchExplorationEnabled)
 
     private val handler = Handler(Looper.getMainLooper())
     private var nodeProvider = ComposeAccessibilityNodeProvider()
@@ -299,24 +299,26 @@
     private var pendingTextTraversedEvent: PendingTextTraversedEvent? = null
 
     /**
-     * Up to date semantics nodes in pruned semantics tree. It always reflects the current
-     * semantics tree. They key is the virtual view id(the root node has a key of
+     * Up to date semantics nodes in pruned semantics tree. It always reflects the current semantics
+     * tree. They key is the virtual view id(the root node has a key of
      * AccessibilityNodeProviderCompat.HOST_VIEW_ID and other node has a key of its id).
      */
-    private var currentSemanticsNodes:
-        IntObjectMap<SemanticsNodeWithAdjustedBounds> = intObjectMapOf()
+    private var currentSemanticsNodes: IntObjectMap<SemanticsNodeWithAdjustedBounds> =
+        intObjectMapOf()
         get() {
             if (currentSemanticsNodesInvalidated) { // first instance of retrieving all nodes
                 currentSemanticsNodesInvalidated = false
-                field = trace("generateCurrentSemanticsNodes") {
-                    view.semanticsOwner.getAllUncoveredSemanticsNodesToIntObjectMap()
-                }
+                field =
+                    trace("generateCurrentSemanticsNodes") {
+                        view.semanticsOwner.getAllUncoveredSemanticsNodesToIntObjectMap()
+                    }
                 if (isEnabled) {
                     trace("setTraversalValues") { setTraversalValues() }
                 }
             }
             return field
         }
+
     private var paneDisplayed = MutableIntSet()
 
     internal var idToBeforeMap = MutableIntIntMap()
@@ -342,22 +344,24 @@
 
     init {
         // Remove callbacks that rely on view being attached to a window when we become detached.
-        view.addOnAttachStateChangeListener(object : View.OnAttachStateChangeListener {
-            override fun onViewAttachedToWindow(view: View) {
-                with(accessibilityManager) {
-                    addAccessibilityStateChangeListener(enabledStateListener)
-                    addTouchExplorationStateChangeListener(touchExplorationStateListener)
+        view.addOnAttachStateChangeListener(
+            object : View.OnAttachStateChangeListener {
+                override fun onViewAttachedToWindow(view: View) {
+                    with(accessibilityManager) {
+                        addAccessibilityStateChangeListener(enabledStateListener)
+                        addTouchExplorationStateChangeListener(touchExplorationStateListener)
+                    }
                 }
-            }
 
-            override fun onViewDetachedFromWindow(view: View) {
-                handler.removeCallbacks(semanticsChangeChecker)
-                with(accessibilityManager) {
-                    removeAccessibilityStateChangeListener(enabledStateListener)
-                    removeTouchExplorationStateChangeListener(touchExplorationStateListener)
+                override fun onViewDetachedFromWindow(view: View) {
+                    handler.removeCallbacks(semanticsChangeChecker)
+                    with(accessibilityManager) {
+                        removeAccessibilityStateChangeListener(enabledStateListener)
+                        removeTouchExplorationStateChangeListener(touchExplorationStateListener)
+                    }
                 }
             }
-        })
+        )
     }
 
     /**
@@ -366,14 +370,10 @@
      * this delegate.
      *
      * @param direction The direction to check for scrolling: <0 means scrolling left or up, >0
-     * means scrolling right or down.
+     *   means scrolling right or down.
      * @param position The position in the view to check in view-local coordinates.
      */
-    internal fun canScroll(
-        vertical: Boolean,
-        direction: Int,
-        position: Offset
-    ): Boolean {
+    internal fun canScroll(vertical: Boolean, direction: Int, position: Offset): Boolean {
         // Workaround for access from bg thread, it is not supported by semantics (b/298159434)
         if (Looper.getMainLooper().thread != Thread.currentThread()) {
             return false
@@ -391,10 +391,11 @@
         // No down event has occurred yet which gives us a location to hit test.
         if (position == Offset.Unspecified || !position.isValid()) return false
 
-        val scrollRangeProperty = when (vertical) {
-            true -> SemanticsProperties.VerticalScrollAxisRange
-            false -> SemanticsProperties.HorizontalScrollAxisRange
-        }
+        val scrollRangeProperty =
+            when (vertical) {
+                true -> SemanticsProperties.VerticalScrollAxisRange
+                false -> SemanticsProperties.HorizontalScrollAxisRange
+            }
 
         var foundNode = false
         currentSemanticsNodes.forEachValue { node ->
@@ -407,8 +408,9 @@
             }
 
             // Using `unmergedConfig` here is okay since we iterate through all nodes anyway
-            val scrollRange = node.semanticsNode.unmergedConfig.getOrNull(scrollRangeProperty)
-                ?: return@forEachValue
+            val scrollRange =
+                node.semanticsNode.unmergedConfig.getOrNull(scrollRangeProperty)
+                    ?: return@forEachValue
 
             // A node simply having scrollable semantics doesn't mean it's necessarily scrollable
             // in the given direction – it must also not be scrolled to its limit in that direction.
@@ -437,26 +439,27 @@
 
     private fun createNodeInfo(virtualViewId: Int): AccessibilityNodeInfoCompat? {
         trace("checkIfDestroyed") {
-            if (view.viewTreeOwners?.lifecycleOwner?.lifecycle?.currentState ==
-                Lifecycle.State.DESTROYED
+            if (
+                view.viewTreeOwners?.lifecycleOwner?.lifecycle?.currentState ==
+                    Lifecycle.State.DESTROYED
             ) {
                 return null
             }
         }
-        val info: AccessibilityNodeInfoCompat = trace("createAccessibilityNodeInfoObject") {
-            AccessibilityNodeInfoCompat.obtain()
-        }
-        val semanticsNodeWithAdjustedBounds = trace("calculateNodeWithAdjustedBounds") {
-            currentSemanticsNodes[virtualViewId]
-        } ?: return null
+        val info: AccessibilityNodeInfoCompat =
+            trace("createAccessibilityNodeInfoObject") { AccessibilityNodeInfoCompat.obtain() }
+        val semanticsNodeWithAdjustedBounds =
+            trace("calculateNodeWithAdjustedBounds") { currentSemanticsNodes[virtualViewId] }
+                ?: return null
         val semanticsNode: SemanticsNode = semanticsNodeWithAdjustedBounds.semanticsNode
         trace("setParentForAccessibility") {
             if (virtualViewId == AccessibilityNodeProviderCompat.HOST_VIEW_ID) {
                 info.setParent(view.getParentForAccessibility() as? View)
             } else {
-                var parentId = checkPreconditionNotNull(semanticsNode.parent?.id) {
-                    "semanticsNode $virtualViewId has null parent"
-                }
+                var parentId =
+                    checkPreconditionNotNull(semanticsNode.parent?.id) {
+                        "semanticsNode $virtualViewId has null parent"
+                    }
                 if (parentId == view.semanticsOwner.unmergedRootSemanticsNode.id) {
                     parentId = AccessibilityNodeProviderCompat.HOST_VIEW_ID
                 }
@@ -574,9 +577,7 @@
         val rowGroupings = ArrayList<Pair<Rect, MutableList<SemanticsNode>>>()
 
         // check to see if this entry overlaps with any groupings in rowGroupings
-        fun placedEntryRowOverlaps(
-            node: SemanticsNode
-        ): Boolean {
+        fun placedEntryRowOverlaps(node: SemanticsNode): Boolean {
             // Conversion to long is needed in order to utilize `until`, which has no float ver
             val entryTopCoord = node.boundsInWindow.top
             val entryBottomCoord = node.boundsInWindow.bottom
@@ -585,17 +586,20 @@
             for (currIndex in 0..rowGroupings.lastIndex) {
                 val currRect = rowGroupings[currIndex].first
                 val groupIsEmpty = currRect.top >= currRect.bottom
-                val groupOverlapsEntry = !entryIsEmpty && !groupIsEmpty &&
-                    max(entryTopCoord, currRect.top) < min(entryBottomCoord, currRect.bottom)
+                val groupOverlapsEntry =
+                    !entryIsEmpty &&
+                        !groupIsEmpty &&
+                        max(entryTopCoord, currRect.top) < min(entryBottomCoord, currRect.bottom)
 
                 // If it overlaps with this row group, update cover and add node
                 if (groupOverlapsEntry) {
-                    val newRect = currRect.intersect(
-                        0f,
-                        entryTopCoord,
-                        Float.POSITIVE_INFINITY,
-                        entryBottomCoord
-                    )
+                    val newRect =
+                        currRect.intersect(
+                            0f,
+                            entryTopCoord,
+                            Float.POSITIVE_INFINITY,
+                            entryBottomCoord
+                        )
                     // Replace the cover rectangle, copying over the old list of nodes
                     rowGroupings[currIndex] = Pair(newRect, rowGroupings[currIndex].second)
                     // Add current node
@@ -631,8 +635,10 @@
         // Kotlin `sortWith` should just pull out the highest traversal indices, but keep everything
         // else in place. If the element does not have a `traversalIndex` then `0f` will be used.
         returnList.sortWith { a, b ->
-            a.unmergedConfig.getOrElse(SemanticsProperties.TraversalIndex) { 0f }.compareTo(
-                b.unmergedConfig.getOrElse(SemanticsProperties.TraversalIndex) { 0f }) }
+            a.unmergedConfig
+                .getOrElse(SemanticsProperties.TraversalIndex) { 0f }
+                .compareTo(b.unmergedConfig.getOrElse(SemanticsProperties.TraversalIndex) { 0f })
+        }
 
         var i = 0
         // Afterwards, go in and add the containers' children.
@@ -674,15 +680,16 @@
         val isTraversalGroup =
             currNode.unmergedConfig.getOrElse(SemanticsProperties.IsTraversalGroup) { false }
 
-        if ((isTraversalGroup || isScreenReaderFocusable(currNode)) &&
-            currentSemanticsNodes.containsKey(currNode.id)) {
+        if (
+            (isTraversalGroup || isScreenReaderFocusable(currNode)) &&
+                currentSemanticsNodes.containsKey(currNode.id)
+        ) {
             geometryList.add(currNode)
         }
         if (isTraversalGroup) {
             // Recurse and record the container's children, sorted
-            containerMapToChildren[currNode.id] = subtreeSortedByGeometryGrouping(
-                currRTL, currNode.children.toMutableList()
-            )
+            containerMapToChildren[currNode.id] =
+                subtreeSortedByGeometryGrouping(currRTL, currNode.children.toMutableList())
         } else {
             // Otherwise, continue adding children to the list that'll be sorted regardless of
             // hierarchy
@@ -695,8 +702,8 @@
     /**
      * This function prepares a subtree for `sortByGeometryGroupings` by retrieving all
      * non-container nodes and adding them to the list to be geometrically sorted. We recurse on
-     * containers (if they exist) and add their sorted children to an optional mapping.
-     * The list to be sorted and child mapping is passed into `sortByGeometryGroupings`.
+     * containers (if they exist) and add their sorted children to an optional mapping. The list to
+     * be sorted and child mapping is passed into `sortByGeometryGroupings`.
      */
     private fun subtreeSortedByGeometryGrouping(
         layoutIsRtl: Boolean,
@@ -720,13 +727,11 @@
         idToAfterMap.clear()
 
         val hostSemanticsNode =
-            currentSemanticsNodes[AccessibilityNodeProviderCompat.HOST_VIEW_ID]
-                ?.semanticsNode!!
+            currentSemanticsNodes[AccessibilityNodeProviderCompat.HOST_VIEW_ID]?.semanticsNode!!
         val hostLayoutIsRtl = hostSemanticsNode.isRtl
 
-        val semanticsOrderList = subtreeSortedByGeometryGrouping(
-            hostLayoutIsRtl, mutableListOf(hostSemanticsNode)
-        )
+        val semanticsOrderList =
+            subtreeSortedByGeometryGrouping(hostLayoutIsRtl, mutableListOf(hostSemanticsNode))
 
         // Iterate through our ordered list, and creating a mapping of current node to next node ID
         // We'll later read through this and set traversal order with IdToBeforeMap
@@ -738,14 +743,14 @@
         }
     }
 
-    private fun isScreenReaderFocusable(
-        node: SemanticsNode
-    ): Boolean {
+    private fun isScreenReaderFocusable(node: SemanticsNode): Boolean {
         val nodeContentDescriptionOrNull =
             node.unmergedConfig.getOrNull(SemanticsProperties.ContentDescription)?.firstOrNull()
-        val isSpeakingNode = nodeContentDescriptionOrNull != null ||
-            getInfoText(node) != null || getInfoStateDescriptionOrNull(node) != null ||
-            getInfoIsCheckable(node)
+        val isSpeakingNode =
+            nodeContentDescriptionOrNull != null ||
+                getInfoText(node) != null ||
+                getInfoStateDescriptionOrNull(node) != null ||
+                getInfoIsCheckable(node)
 
         return node.unmergedConfig.isMergingSemanticsOfDescendants ||
             node.isUnmergedLeafNode && isSpeakingNode
@@ -770,9 +775,10 @@
                     val className = role.toLegacyClassName()
                     // Images are often minor children of larger widgets, so we only want to
                     // announce the Image role when the image itself is focusable.
-                    if (role != Role.Image ||
-                        semanticsNode.isUnmergedLeafNode ||
-                        semanticsNode.unmergedConfig.isMergingSemanticsOfDescendants
+                    if (
+                        role != Role.Image ||
+                            semanticsNode.isUnmergedLeafNode ||
+                            semanticsNode.unmergedConfig.isMergingSemanticsOfDescendants
                     ) {
                         info.className = className
                     }
@@ -823,9 +829,8 @@
         setStateDescription(semanticsNode, info)
         setIsCheckable(semanticsNode, info)
 
-        val toggleState = semanticsNode.unmergedConfig.getOrNull(
-            SemanticsProperties.ToggleableState
-        )
+        val toggleState =
+            semanticsNode.unmergedConfig.getOrNull(SemanticsProperties.ToggleableState)
         toggleState?.let {
             if (toggleState == ToggleableState.On) {
                 info.isChecked = true
@@ -842,25 +847,27 @@
             }
         }
 
-        if (!semanticsNode.unmergedConfig.isMergingSemanticsOfDescendants ||
-            // we don't emit fake nodes for nodes without children, therefore we should assign
-            // content description for such nodes
-            semanticsNode.replacedChildren.isEmpty()
+        if (
+            !semanticsNode.unmergedConfig.isMergingSemanticsOfDescendants ||
+                // we don't emit fake nodes for nodes without children, therefore we should assign
+                // content description for such nodes
+                semanticsNode.replacedChildren.isEmpty()
         ) {
             info.contentDescription =
-                semanticsNode.unmergedConfig.getOrNull(SemanticsProperties.ContentDescription)
+                semanticsNode.unmergedConfig
+                    .getOrNull(SemanticsProperties.ContentDescription)
                     ?.firstOrNull()
         }
 
-        // Map testTag to resourceName if testTagsAsResourceId == true (which can be set by an ancestor)
+        // Map testTag to resourceName if testTagsAsResourceId == true (which can be set by an
+        // ancestor)
         val testTag = semanticsNode.unmergedConfig.getOrNull(SemanticsProperties.TestTag)
         if (testTag != null) {
             var testTagsAsResourceId = false
             var current: SemanticsNode? = semanticsNode
             while (current != null) {
-                if (current.unmergedConfig.contains(
-                        SemanticsPropertiesAndroid.TestTagsAsResourceId
-                    )
+                if (
+                    current.unmergedConfig.contains(SemanticsPropertiesAndroid.TestTagsAsResourceId)
                 ) {
                     testTagsAsResourceId =
                         current.unmergedConfig[SemanticsPropertiesAndroid.TestTagsAsResourceId]
@@ -897,11 +904,12 @@
         info.isVisibleToUser = semanticsNode.isVisible
 
         semanticsNode.unmergedConfig.getOrNull(SemanticsProperties.LiveRegion)?.let {
-            info.liveRegion = when (it) {
-                LiveRegionMode.Polite -> ACCESSIBILITY_LIVE_REGION_POLITE
-                LiveRegionMode.Assertive -> ACCESSIBILITY_LIVE_REGION_ASSERTIVE
-                else -> ACCESSIBILITY_LIVE_REGION_POLITE
-            }
+            info.liveRegion =
+                when (it) {
+                    LiveRegionMode.Polite -> ACCESSIBILITY_LIVE_REGION_POLITE
+                    LiveRegionMode.Assertive -> ACCESSIBILITY_LIVE_REGION_ASSERTIVE
+                    else -> ACCESSIBILITY_LIVE_REGION_POLITE
+                }
         }
         info.isClickable = false
         semanticsNode.unmergedConfig.getOrNull(SemanticsActions.OnClick)?.let {
@@ -913,10 +921,7 @@
             info.isClickable = !isRadioButtonOrTab || (isRadioButtonOrTab && !isSelected)
             if (semanticsNode.enabled() && info.isClickable) {
                 info.addAction(
-                    AccessibilityActionCompat(
-                        AccessibilityNodeInfoCompat.ACTION_CLICK,
-                        it.label
-                    )
+                    AccessibilityActionCompat(AccessibilityNodeInfoCompat.ACTION_CLICK, it.label)
                 )
             }
         }
@@ -936,38 +941,26 @@
         // The config will contain this action only if there is a text selection at the moment.
         semanticsNode.unmergedConfig.getOrNull(SemanticsActions.CopyText)?.let {
             info.addAction(
-                AccessibilityActionCompat(
-                    AccessibilityNodeInfoCompat.ACTION_COPY,
-                    it.label
-                )
+                AccessibilityActionCompat(AccessibilityNodeInfoCompat.ACTION_COPY, it.label)
             )
         }
         if (semanticsNode.enabled()) {
             semanticsNode.unmergedConfig.getOrNull(SemanticsActions.SetText)?.let {
                 info.addAction(
-                    AccessibilityActionCompat(
-                        AccessibilityNodeInfoCompat.ACTION_SET_TEXT,
-                        it.label
-                    )
+                    AccessibilityActionCompat(AccessibilityNodeInfoCompat.ACTION_SET_TEXT, it.label)
                 )
             }
 
             semanticsNode.unmergedConfig.getOrNull(SemanticsActions.OnImeAction)?.let {
                 info.addAction(
-                    AccessibilityActionCompat(
-                        android.R.id.accessibilityActionImeEnter,
-                        it.label
-                    )
+                    AccessibilityActionCompat(android.R.id.accessibilityActionImeEnter, it.label)
                 )
             }
 
             // The config will contain this action only if there is a text selection at the moment.
             semanticsNode.unmergedConfig.getOrNull(SemanticsActions.CutText)?.let {
                 info.addAction(
-                    AccessibilityActionCompat(
-                        AccessibilityNodeInfoCompat.ACTION_CUT,
-                        it.label
-                    )
+                    AccessibilityActionCompat(AccessibilityNodeInfoCompat.ACTION_CUT, it.label)
                 )
             }
 
@@ -1008,25 +1001,27 @@
                     AccessibilityNodeInfoCompat.MOVEMENT_GRANULARITY_WORD or
                     AccessibilityNodeInfoCompat.MOVEMENT_GRANULARITY_PARAGRAPH
             // We only traverse the text when contentDescription is not set.
-            val contentDescription = semanticsNode.unmergedConfig.getOrNull(
-                SemanticsProperties.ContentDescription
-            )
-            if (contentDescription.isNullOrEmpty() &&
-                semanticsNode.unmergedConfig.contains(SemanticsActions.GetTextLayoutResult) &&
-                // Talkback does not handle below granularities for text field (which includes
-                // label/hint) when text field is not in focus
-                !semanticsNode.excludeLineAndPageGranularities()
+            val contentDescription =
+                semanticsNode.unmergedConfig.getOrNull(SemanticsProperties.ContentDescription)
+            if (
+                contentDescription.isNullOrEmpty() &&
+                    semanticsNode.unmergedConfig.contains(SemanticsActions.GetTextLayoutResult) &&
+                    // Talkback does not handle below granularities for text field (which includes
+                    // label/hint) when text field is not in focus
+                    !semanticsNode.excludeLineAndPageGranularities()
             ) {
-                info.movementGranularities = info.movementGranularities or
-                    AccessibilityNodeInfoCompat.MOVEMENT_GRANULARITY_LINE or
-                    AccessibilityNodeInfoCompat.MOVEMENT_GRANULARITY_PAGE
+                info.movementGranularities =
+                    info.movementGranularities or
+                        AccessibilityNodeInfoCompat.MOVEMENT_GRANULARITY_LINE or
+                        AccessibilityNodeInfoCompat.MOVEMENT_GRANULARITY_PAGE
             }
         }
         if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
             val extraDataKeys: MutableList<String> = mutableListOf()
             extraDataKeys.add(ExtraDataIdKey)
-            if (!info.text.isNullOrEmpty() &&
-                semanticsNode.unmergedConfig.contains(SemanticsActions.GetTextLayoutResult)
+            if (
+                !info.text.isNullOrEmpty() &&
+                    semanticsNode.unmergedConfig.contains(SemanticsActions.GetTextLayoutResult)
             ) {
                 extraDataKeys.add(EXTRA_DATA_TEXT_CHARACTER_LOCATION_KEY)
             }
@@ -1046,23 +1041,27 @@
                 info.className = "android.widget.ProgressBar"
             }
             if (rangeInfo !== ProgressBarRangeInfo.Indeterminate) {
-                info.rangeInfo = AccessibilityNodeInfoCompat.RangeInfoCompat.obtain(
-                    AccessibilityNodeInfoCompat.RangeInfoCompat.RANGE_TYPE_FLOAT,
-                    rangeInfo.range.start,
-                    rangeInfo.range.endInclusive,
-                    rangeInfo.current
-                )
+                info.rangeInfo =
+                    AccessibilityNodeInfoCompat.RangeInfoCompat.obtain(
+                        AccessibilityNodeInfoCompat.RangeInfoCompat.RANGE_TYPE_FLOAT,
+                        rangeInfo.range.start,
+                        rangeInfo.range.endInclusive,
+                        rangeInfo.current
+                    )
             }
-            if (semanticsNode.unmergedConfig.contains(SemanticsActions.SetProgress) &&
-                semanticsNode.enabled()
+            if (
+                semanticsNode.unmergedConfig.contains(SemanticsActions.SetProgress) &&
+                    semanticsNode.enabled()
             ) {
-                if (rangeInfo.current <
-                    rangeInfo.range.endInclusive.coerceAtLeast(rangeInfo.range.start)
+                if (
+                    rangeInfo.current <
+                        rangeInfo.range.endInclusive.coerceAtLeast(rangeInfo.range.start)
                 ) {
                     info.addAction(AccessibilityActionCompat.ACTION_SCROLL_FORWARD)
                 }
-                if (rangeInfo.current >
-                    rangeInfo.range.start.coerceAtMost(rangeInfo.range.endInclusive)
+                if (
+                    rangeInfo.current >
+                        rangeInfo.range.start.coerceAtMost(rangeInfo.range.endInclusive)
                 ) {
                     info.addAction(AccessibilityActionCompat.ACTION_SCROLL_BACKWARD)
                 }
@@ -1154,28 +1153,19 @@
         if (semanticsNode.enabled()) {
             semanticsNode.unmergedConfig.getOrNull(SemanticsActions.Expand)?.let {
                 info.addAction(
-                    AccessibilityActionCompat(
-                        AccessibilityNodeInfoCompat.ACTION_EXPAND,
-                        it.label
-                    )
+                    AccessibilityActionCompat(AccessibilityNodeInfoCompat.ACTION_EXPAND, it.label)
                 )
             }
 
             semanticsNode.unmergedConfig.getOrNull(SemanticsActions.Collapse)?.let {
                 info.addAction(
-                    AccessibilityActionCompat(
-                        AccessibilityNodeInfoCompat.ACTION_COLLAPSE,
-                        it.label
-                    )
+                    AccessibilityActionCompat(AccessibilityNodeInfoCompat.ACTION_COLLAPSE, it.label)
                 )
             }
 
             semanticsNode.unmergedConfig.getOrNull(SemanticsActions.Dismiss)?.let {
                 info.addAction(
-                    AccessibilityActionCompat(
-                        AccessibilityNodeInfoCompat.ACTION_DISMISS,
-                        it.label
-                    )
+                    AccessibilityActionCompat(AccessibilityNodeInfoCompat.ACTION_DISMISS, it.label)
                 )
             }
 
@@ -1189,15 +1179,17 @@
                 }
                 val currentActionIdToLabel = SparseArrayCompat<CharSequence>()
                 val currentLabelToActionId = mutableObjectIntMapOf<CharSequence>()
-                // If this virtual node had custom action id assignment before, we try to keep the id
+                // If this virtual node had custom action id assignment before, we try to keep the
+                // id
                 // unchanged for the same action (identified by action label). This way, we can
                 // minimize the influence of custom action change between custom actions are
                 // presented to the user and actually performed.
                 if (labelToActionId.containsKey(virtualViewId)) {
                     val oldLabelToActionId = labelToActionId[virtualViewId]
-                    val availableIds = mutableIntListOf().apply {
-                        AccessibilityActionsResourceIds.forEach { add(it) }
-                    }
+                    val availableIds =
+                        mutableIntListOf().apply {
+                            AccessibilityActionsResourceIds.forEach { add(it) }
+                        }
                     val unassignedActions = mutableListOf<CustomAccessibilityAction>()
                     customActions.fastForEach { action ->
                         if (oldLabelToActionId!!.contains(action.label)) {
@@ -1244,7 +1236,10 @@
                 info.setTraversalBefore(view, beforeId)
             }
             addExtraDataToAccessibilityNodeInfoHelper(
-                virtualViewId, info, ExtraDataTestTraversalBeforeVal, null
+                virtualViewId,
+                info,
+                ExtraDataTestTraversalBeforeVal,
+                null
             )
         }
 
@@ -1257,7 +1252,10 @@
             if (afterView != null) {
                 info.setTraversalAfter(afterView)
                 addExtraDataToAccessibilityNodeInfoHelper(
-                    virtualViewId, info, ExtraDataTestTraversalAfterVal, null
+                    virtualViewId,
+                    info,
+                    ExtraDataTestTraversalAfterVal,
+                    null
                 )
             }
         }
@@ -1271,9 +1269,7 @@
         }
     }
 
-    private fun getInfoStateDescriptionOrNull(
-        node: SemanticsNode
-    ): String? {
+    private fun getInfoStateDescriptionOrNull(node: SemanticsNode): String? {
         var stateDescription = node.unmergedConfig.getOrNull(SemanticsProperties.StateDescription)
         val toggleState = node.unmergedConfig.getOrNull(SemanticsProperties.ToggleableState)
         val role = node.unmergedConfig.getOrNull(SemanticsProperties.Role)
@@ -1288,7 +1284,6 @@
                         stateDescription = view.context.resources.getString(R.string.state_on)
                     }
                 }
-
                 ToggleableState.Off -> {
                     // Unfortunately, talkback has a bug of using "not checked", so we set state
                     // description here
@@ -1296,11 +1291,9 @@
                         stateDescription = view.context.resources.getString(R.string.state_off)
                     }
                 }
-
                 ToggleableState.Indeterminate -> {
                     if (stateDescription == null) {
-                        stateDescription =
-                            view.context.resources.getString(R.string.indeterminate)
+                        stateDescription = view.context.resources.getString(R.string.indeterminate)
                     }
                 }
             }
@@ -1313,18 +1306,18 @@
                     // If a radio entry (radio button + text) is selectable, it won't have the role
                     // RadioButton, so if we use info.isCheckable/info.isChecked, talkback will say
                     // "checked/not checked" instead "selected/note selected".
-                    stateDescription = if (it) {
-                        view.context.resources.getString(R.string.selected)
-                    } else {
-                        view.context.resources.getString(R.string.not_selected)
-                    }
+                    stateDescription =
+                        if (it) {
+                            view.context.resources.getString(R.string.selected)
+                        } else {
+                            view.context.resources.getString(R.string.not_selected)
+                        }
                 }
             }
         }
 
         // Check if a node has progress bar range info and retrieve description accordingly
-        val rangeInfo =
-            node.unmergedConfig.getOrNull(SemanticsProperties.ProgressBarRangeInfo)
+        val rangeInfo = node.unmergedConfig.getOrNull(SemanticsProperties.ProgressBarRangeInfo)
         rangeInfo?.let {
             // let's set state description here and use state description change events.
             // otherwise, we need to send out type_view_selected event, as the old android
@@ -1333,18 +1326,20 @@
             if (rangeInfo !== ProgressBarRangeInfo.Indeterminate) {
                 if (stateDescription == null) {
                     val valueRange = rangeInfo.range
-                    val progress = (
-                        if (valueRange.endInclusive - valueRange.start == 0f) 0f
-                        else (rangeInfo.current - valueRange.start) /
-                            (valueRange.endInclusive - valueRange.start)
-                        ).fastCoerceIn(0f, 1f)
+                    val progress =
+                        (if (valueRange.endInclusive - valueRange.start == 0f) 0f
+                            else
+                                (rangeInfo.current - valueRange.start) /
+                                    (valueRange.endInclusive - valueRange.start))
+                            .fastCoerceIn(0f, 1f)
 
                     // We only display 0% or 100% when it is exactly 0% or 100%.
-                    val percent = when (progress) {
-                        0f -> 0
-                        1f -> 100
-                        else -> (progress * 100).fastRoundToInt().coerceIn(1, 99)
-                    }
+                    val percent =
+                        when (progress) {
+                            0f -> 0
+                            1f -> 100
+                            else -> (progress * 100).fastRoundToInt().coerceIn(1, 99)
+                        }
                     stateDescription =
                         view.context.resources.getString(R.string.template_percent, percent)
                 }
@@ -1361,9 +1356,9 @@
     }
 
     /**
-     * Empty text field should not be ignored by the TB so we set a state description.
-     * When there is a speakable child, like a label or a placeholder text, setting this state
-     * description is redundant
+     * Empty text field should not be ignored by the TB so we set a state description. When there is
+     * a speakable child, like a label or a placeholder text, setting this state description is
+     * redundant
      */
     private fun createStateDescriptionForTextField(node: SemanticsNode): String? {
         val mergedConfig = node.copyWithMergingEnabled().config
@@ -1383,16 +1378,12 @@
         info.stateDescription = getInfoStateDescriptionOrNull(node)
     }
 
-    private fun getInfoIsCheckable(
-        node: SemanticsNode
-    ): Boolean {
+    private fun getInfoIsCheckable(node: SemanticsNode): Boolean {
         var isCheckable = false
         val toggleState = node.unmergedConfig.getOrNull(SemanticsProperties.ToggleableState)
         val role = node.unmergedConfig.getOrNull(SemanticsProperties.Role)
 
-        toggleState?.let {
-            isCheckable = true
-        }
+        toggleState?.let { isCheckable = true }
 
         node.unmergedConfig.getOrNull(SemanticsProperties.Selected)?.let {
             if (role != Role.Tab) {
@@ -1403,18 +1394,13 @@
         return isCheckable
     }
 
-    private fun setIsCheckable(
-        node: SemanticsNode,
-        info: AccessibilityNodeInfoCompat
-    ) {
+    private fun setIsCheckable(node: SemanticsNode, info: AccessibilityNodeInfoCompat) {
         info.isCheckable = getInfoIsCheckable(node)
     }
 
     // This needs to be here instead of around line 3000 because we need access to the `view`
     // that is inside the `AndroidComposeViewAccessibilityDelegateCompat` class
-    private fun getInfoText(
-        node: SemanticsNode
-    ): AnnotatedString? {
+    private fun getInfoText(node: SemanticsNode): AnnotatedString? {
         val editableTextToAssign = node.unmergedConfig.getTextForTextField()
         val textToAssign = node.unmergedConfig.getOrNull(SemanticsProperties.Text)?.firstOrNull()
         return editableTextToAssign ?: textToAssign
@@ -1452,14 +1438,13 @@
 
     /**
      * Attempts to give accessibility focus to a virtual view.
-     * <p>
-     * A virtual view will not actually take focus if
-     * {@link AccessibilityManager#isEnabled()} returns false,
-     * {@link AccessibilityManager#isTouchExplorationEnabled()} returns false,
-     * or the view already has accessibility focus.
      *
-     * @param virtualViewId The id of the virtual view on which to place
-     *            accessibility focus.
+     * <p>
+     * A virtual view will not actually take focus if {@link AccessibilityManager#isEnabled()}
+     * returns false, {@link AccessibilityManager#isTouchExplorationEnabled()} returns false, or the
+     * view already has accessibility focus.
+     *
+     * @param virtualViewId The id of the virtual view on which to place accessibility focus.
      * @return Whether this virtual view actually took accessibility focus.
      */
     private fun requestAccessibilityFocus(virtualViewId: Int): Boolean {
@@ -1491,12 +1476,12 @@
     }
 
     /**
-     * Populates an event of the specified type with information about an item
-     * and attempts to send it up through the view hierarchy.
-     * <p>
-     * You should call this method after performing a user action that normally
-     * fires an accessibility event, such as clicking on an item.
+     * Populates an event of the specified type with information about an item and attempts to send
+     * it up through the view hierarchy.
      *
+     * <p>
+     * You should call this method after performing a user action that normally fires an
+     * accessibility event, such as clicking on an item.
      * <pre>public performItemClick(T item) {
      *   ...
      *   sendEventForVirtualView(item.id, AccessibilityEvent.TYPE_VIEW_CLICKED)
@@ -1542,8 +1527,9 @@
             return false
         }
 
-        if (event.eventType == AccessibilityEvent.TYPE_WINDOW_CONTENT_CHANGED ||
-            event.eventType == AccessibilityEvent.TYPE_VIEW_ACCESSIBILITY_FOCUSED
+        if (
+            event.eventType == AccessibilityEvent.TYPE_WINDOW_CONTENT_CHANGED ||
+                event.eventType == AccessibilityEvent.TYPE_VIEW_ACCESSIBILITY_FOCUSED
         ) {
             sendingFocusAffectingEvent = true
         }
@@ -1555,21 +1541,18 @@
     }
 
     /**
-     * Constructs and returns an {@link AccessibilityEvent} populated with
-     * information about the specified item.
+     * Constructs and returns an {@link AccessibilityEvent} populated with information about the
+     * specified item.
      *
-     * @param virtualViewId The virtual view id for the item for which to
-     *            construct an event.
+     * @param virtualViewId The virtual view id for the item for which to construct an event.
      * @param eventType The type of event to construct.
-     * @return An {@link AccessibilityEvent} populated with information about
-     *         the specified item.
+     * @return An {@link AccessibilityEvent} populated with information about the specified item.
      */
     @Suppress("DEPRECATION")
     @VisibleForTesting
     private fun createEvent(virtualViewId: Int, eventType: Int): AccessibilityEvent {
-        val event: AccessibilityEvent = trace("obtainAccessibilityEvent") {
-            AccessibilityEvent.obtain(eventType)
-        }
+        val event: AccessibilityEvent =
+            trace("obtainAccessibilityEvent") { AccessibilityEvent.obtain(eventType) }
         event.isEnabled = true
         event.className = ClassName
 
@@ -1595,22 +1578,19 @@
         itemCount: Int?,
         text: CharSequence?
     ): AccessibilityEvent {
-        return createEvent(
-            virtualViewId,
-            AccessibilityEvent.TYPE_VIEW_TEXT_SELECTION_CHANGED
-        ).apply {
-            fromIndex?.let { this.fromIndex = it }
-            toIndex?.let { this.toIndex = it }
-            itemCount?.let { this.itemCount = it }
-            text?.let { this.text.add(it) }
-        }
+        return createEvent(virtualViewId, AccessibilityEvent.TYPE_VIEW_TEXT_SELECTION_CHANGED)
+            .apply {
+                fromIndex?.let { this.fromIndex = it }
+                toIndex?.let { this.toIndex = it }
+                itemCount?.let { this.itemCount = it }
+                text?.let { this.text.add(it) }
+            }
     }
 
     /**
      * Attempts to clear accessibility focus from a virtual view.
      *
-     * @param virtualViewId The id of the virtual view from which to clear
-     *            accessibility focus.
+     * @param virtualViewId The id of the virtual view from which to clear accessibility focus.
      * @return Whether this virtual view actually cleared accessibility focus.
      */
     private fun clearAccessibilityFocus(virtualViewId: Int): Boolean {
@@ -1627,46 +1607,46 @@
         return false
     }
 
-    private fun performActionHelper(
-        virtualViewId: Int,
-        action: Int,
-        arguments: Bundle?
-    ): Boolean {
+    private fun performActionHelper(virtualViewId: Int, action: Int, arguments: Bundle?): Boolean {
         val node = currentSemanticsNodes[virtualViewId]?.semanticsNode ?: return false
 
         // Actions can be performed when disabled.
         when (action) {
             AccessibilityNodeInfoCompat.ACTION_ACCESSIBILITY_FOCUS ->
                 return requestAccessibilityFocus(virtualViewId)
-
             AccessibilityNodeInfoCompat.ACTION_CLEAR_ACCESSIBILITY_FOCUS ->
                 return clearAccessibilityFocus(virtualViewId)
-
             AccessibilityNodeInfoCompat.ACTION_NEXT_AT_MOVEMENT_GRANULARITY,
             AccessibilityNodeInfoCompat.ACTION_PREVIOUS_AT_MOVEMENT_GRANULARITY -> {
                 if (arguments != null) {
-                    val granularity = arguments.getInt(
-                        AccessibilityNodeInfoCompat.ACTION_ARGUMENT_MOVEMENT_GRANULARITY_INT
-                    )
-                    val extendSelection = arguments.getBoolean(
-                        AccessibilityNodeInfoCompat.ACTION_ARGUMENT_EXTEND_SELECTION_BOOLEAN
-                    )
+                    val granularity =
+                        arguments.getInt(
+                            AccessibilityNodeInfoCompat.ACTION_ARGUMENT_MOVEMENT_GRANULARITY_INT
+                        )
+                    val extendSelection =
+                        arguments.getBoolean(
+                            AccessibilityNodeInfoCompat.ACTION_ARGUMENT_EXTEND_SELECTION_BOOLEAN
+                        )
                     return traverseAtGranularity(
-                        node, granularity,
+                        node,
+                        granularity,
                         action == AccessibilityNodeInfoCompat.ACTION_NEXT_AT_MOVEMENT_GRANULARITY,
                         extendSelection
                     )
                 }
                 return false
             }
-
             AccessibilityNodeInfoCompat.ACTION_SET_SELECTION -> {
-                val start = arguments?.getInt(
-                    AccessibilityNodeInfoCompat.ACTION_ARGUMENT_SELECTION_START_INT, -1
-                ) ?: -1
-                val end = arguments?.getInt(
-                    AccessibilityNodeInfoCompat.ACTION_ARGUMENT_SELECTION_END_INT, -1
-                ) ?: -1
+                val start =
+                    arguments?.getInt(
+                        AccessibilityNodeInfoCompat.ACTION_ARGUMENT_SELECTION_START_INT,
+                        -1
+                    ) ?: -1
+                val end =
+                    arguments?.getInt(
+                        AccessibilityNodeInfoCompat.ACTION_ARGUMENT_SELECTION_END_INT,
+                        -1
+                    ) ?: -1
                 // Note: This is a little different from current android framework implementation.
                 val success = setAccessibilitySelection(node, start, end, false)
                 // Text selection changed event already updates the cache. so this may not be
@@ -1679,11 +1659,9 @@
                 }
                 return success
             }
-
             AccessibilityNodeInfoCompat.ACTION_COPY -> {
-                return node.unmergedConfig.getOrNull(
-                    SemanticsActions.CopyText
-                )?.action?.invoke() ?: false
+                return node.unmergedConfig.getOrNull(SemanticsActions.CopyText)?.action?.invoke()
+                    ?: false
             }
         }
 
@@ -1699,12 +1677,10 @@
                 sendEventForVirtualView(virtualViewId, AccessibilityEvent.TYPE_VIEW_CLICKED)
                 return result ?: false
             }
-
             AccessibilityNodeInfoCompat.ACTION_LONG_CLICK -> {
                 return node.unmergedConfig.getOrNull(SemanticsActions.OnLongClick)?.action?.invoke()
                     ?: false
             }
-
             AccessibilityNodeInfoCompat.ACTION_SCROLL_FORWARD,
             AccessibilityNodeInfoCompat.ACTION_SCROLL_BACKWARD,
             android.R.id.accessibilityActionScrollDown,
@@ -1730,11 +1706,12 @@
                     if (rangeInfo != null && setProgressAction != null) {
                         val max = rangeInfo.range.endInclusive.coerceAtLeast(rangeInfo.range.start)
                         val min = rangeInfo.range.start.coerceAtMost(rangeInfo.range.endInclusive)
-                        var increment = if (rangeInfo.steps > 0) {
-                            (max - min) / (rangeInfo.steps + 1)
-                        } else {
-                            (max - min) / AccessibilitySliderStepsCount
-                        }
+                        var increment =
+                            if (rangeInfo.steps > 0) {
+                                (max - min) / (rangeInfo.steps + 1)
+                            } else {
+                                (max - min) / AccessibilitySliderStepsCount
+                            }
                         if (scrollBackward) {
                             increment = -increment
                         }
@@ -1775,14 +1752,16 @@
                     // normal scrollable vs pageable scrollable. If a node can handle
                     // page actions it will scroll by a full page.
                     if (xScrollState.canScroll(amountToScroll)) {
-                        val canPageHorizontally = node.unmergedConfig.contains(PageLeft) ||
-                            node.unmergedConfig.contains(PageRight)
+                        val canPageHorizontally =
+                            node.unmergedConfig.contains(PageLeft) ||
+                                node.unmergedConfig.contains(PageRight)
                         return if (canPageHorizontally) {
-                            val horizontalPageAction = if (amountToScroll > 0) {
-                                node.unmergedConfig.getOrNull(PageRight)
-                            } else {
-                                node.unmergedConfig.getOrNull(PageLeft)
-                            }
+                            val horizontalPageAction =
+                                if (amountToScroll > 0) {
+                                    node.unmergedConfig.getOrNull(PageRight)
+                                } else {
+                                    node.unmergedConfig.getOrNull(PageLeft)
+                                }
                             horizontalPageAction?.action?.invoke() ?: false
                         } else {
                             scrollAction.action?.invoke(amountToScroll, 0f) ?: false
@@ -1805,14 +1784,16 @@
                     // normal scrollable vs pageable scrollable. If a node can handle
                     // page actions it will scroll by a full page.
                     if (yScrollState.canScroll(amountToScroll)) {
-                        val canPageVertically = node.unmergedConfig.contains(PageUp) ||
-                            node.unmergedConfig.contains(PageDown)
+                        val canPageVertically =
+                            node.unmergedConfig.contains(PageUp) ||
+                                node.unmergedConfig.contains(PageDown)
                         return if (canPageVertically) {
-                            val verticalPageAction = if (amountToScroll > 0) {
-                                node.unmergedConfig.getOrNull(PageDown)
-                            } else {
-                                node.unmergedConfig.getOrNull(PageUp)
-                            }
+                            val verticalPageAction =
+                                if (amountToScroll > 0) {
+                                    node.unmergedConfig.getOrNull(PageDown)
+                                } else {
+                                    node.unmergedConfig.getOrNull(PageUp)
+                                }
                             verticalPageAction?.action?.invoke() ?: false
                         } else {
                             scrollAction.action?.invoke(0f, amountToScroll) ?: false
@@ -1822,44 +1803,46 @@
 
                 return false
             }
-
             android.R.id.accessibilityActionPageUp -> {
                 val pageAction = node.unmergedConfig.getOrNull(SemanticsActions.PageUp)
                 return pageAction?.action?.invoke() ?: false
             }
-
             android.R.id.accessibilityActionPageDown -> {
                 val pageAction = node.unmergedConfig.getOrNull(SemanticsActions.PageDown)
                 return pageAction?.action?.invoke() ?: false
             }
-
             android.R.id.accessibilityActionPageLeft -> {
                 val pageAction = node.unmergedConfig.getOrNull(SemanticsActions.PageLeft)
                 return pageAction?.action?.invoke() ?: false
             }
-
             android.R.id.accessibilityActionPageRight -> {
                 val pageAction = node.unmergedConfig.getOrNull(SemanticsActions.PageRight)
                 return pageAction?.action?.invoke() ?: false
             }
-
             android.R.id.accessibilityActionSetProgress -> {
-                if (arguments == null || !arguments.containsKey(
-                        AccessibilityNodeInfoCompat.ACTION_ARGUMENT_PROGRESS_VALUE
-                    )
+                if (
+                    arguments == null ||
+                        !arguments.containsKey(
+                            AccessibilityNodeInfoCompat.ACTION_ARGUMENT_PROGRESS_VALUE
+                        )
                 ) {
                     return false
                 }
-                return node.unmergedConfig.getOrNull(SemanticsActions.SetProgress)?.action?.invoke(
-                    arguments.getFloat(AccessibilityNodeInfoCompat.ACTION_ARGUMENT_PROGRESS_VALUE)
-                ) ?: false
+                return node.unmergedConfig
+                    .getOrNull(SemanticsActions.SetProgress)
+                    ?.action
+                    ?.invoke(
+                        arguments.getFloat(
+                            AccessibilityNodeInfoCompat.ACTION_ARGUMENT_PROGRESS_VALUE
+                        )
+                    ) ?: false
             }
-
             AccessibilityNodeInfoCompat.ACTION_FOCUS -> {
-                return node.unmergedConfig.getOrNull(SemanticsActions.RequestFocus)
-                    ?.action?.invoke() ?: false
+                return node.unmergedConfig
+                    .getOrNull(SemanticsActions.RequestFocus)
+                    ?.action
+                    ?.invoke() ?: false
             }
-
             AccessibilityNodeInfoCompat.ACTION_CLEAR_FOCUS -> {
                 return if (node.unmergedConfig.getOrNull(SemanticsProperties.Focused) == true) {
                     view.focusOwner.clearFocus(
@@ -1873,62 +1856,53 @@
                     false
                 }
             }
-
             AccessibilityNodeInfoCompat.ACTION_SET_TEXT -> {
-                val text = arguments?.getString(
-                    AccessibilityNodeInfoCompat.ACTION_ARGUMENT_SET_TEXT_CHARSEQUENCE
-                )
-                return node.unmergedConfig.getOrNull(SemanticsActions.SetText)
-                    ?.action?.invoke(AnnotatedString(text ?: "")) ?: false
+                val text =
+                    arguments?.getString(
+                        AccessibilityNodeInfoCompat.ACTION_ARGUMENT_SET_TEXT_CHARSEQUENCE
+                    )
+                return node.unmergedConfig
+                    .getOrNull(SemanticsActions.SetText)
+                    ?.action
+                    ?.invoke(AnnotatedString(text ?: "")) ?: false
             }
-
             android.R.id.accessibilityActionImeEnter -> {
-                return node.unmergedConfig.getOrNull(SemanticsActions.OnImeAction)
-                    ?.action?.invoke() ?: false
+                return node.unmergedConfig.getOrNull(SemanticsActions.OnImeAction)?.action?.invoke()
+                    ?: false
             }
-
             AccessibilityNodeInfoCompat.ACTION_PASTE -> {
-                return node.unmergedConfig.getOrNull(
-                    SemanticsActions.PasteText
-                )?.action?.invoke() ?: false
+                return node.unmergedConfig.getOrNull(SemanticsActions.PasteText)?.action?.invoke()
+                    ?: false
             }
-
             AccessibilityNodeInfoCompat.ACTION_CUT -> {
-                return node.unmergedConfig.getOrNull(
-                    SemanticsActions.CutText
-                )?.action?.invoke() ?: false
+                return node.unmergedConfig.getOrNull(SemanticsActions.CutText)?.action?.invoke()
+                    ?: false
             }
-
             AccessibilityNodeInfoCompat.ACTION_EXPAND -> {
-                return node.unmergedConfig.getOrNull(
-                    SemanticsActions.Expand
-                )?.action?.invoke() ?: false
+                return node.unmergedConfig.getOrNull(SemanticsActions.Expand)?.action?.invoke()
+                    ?: false
             }
-
             AccessibilityNodeInfoCompat.ACTION_COLLAPSE -> {
-                return node.unmergedConfig.getOrNull(
-                    SemanticsActions.Collapse
-                )?.action?.invoke() ?: false
+                return node.unmergedConfig.getOrNull(SemanticsActions.Collapse)?.action?.invoke()
+                    ?: false
             }
-
             AccessibilityNodeInfoCompat.ACTION_DISMISS -> {
-                return node.unmergedConfig.getOrNull(
-                    SemanticsActions.Dismiss
-                )?.action?.invoke() ?: false
+                return node.unmergedConfig.getOrNull(SemanticsActions.Dismiss)?.action?.invoke()
+                    ?: false
             }
-
             android.R.id.accessibilityActionShowOnScreen -> {
-                // TODO(b/190865803): Consider scrolling nested containers instead of only the first one.
+                // TODO(b/190865803): Consider scrolling nested containers instead of only the first
+                // one.
                 var scrollableAncestor: SemanticsNode? = node.parent
-                var scrollAction = scrollableAncestor?.unmergedConfig
-                    ?.getOrNull(SemanticsActions.ScrollBy)
+                var scrollAction =
+                    scrollableAncestor?.unmergedConfig?.getOrNull(SemanticsActions.ScrollBy)
                 while (scrollableAncestor != null) {
                     if (scrollAction != null) {
                         break
                     }
                     scrollableAncestor = scrollableAncestor.parent
-                    scrollAction = scrollableAncestor?.unmergedConfig
-                        ?.getOrNull(SemanticsActions.ScrollBy)
+                    scrollAction =
+                        scrollableAncestor?.unmergedConfig?.getOrNull(SemanticsActions.ScrollBy)
                 }
                 if (scrollableAncestor == null) {
                     return false
@@ -1937,15 +1911,20 @@
                 // TalkBack expects the minimum amount of movement to fully reveal the node.
                 // First, get the viewport and the target bounds in root coordinates
                 val viewportInParent = scrollableAncestor.layoutInfo.coordinates.boundsInParent()
-                val parentInRoot = scrollableAncestor.layoutInfo.coordinates
-                    .parentLayoutCoordinates?.positionInRoot() ?: Offset.Zero
+                val parentInRoot =
+                    scrollableAncestor.layoutInfo.coordinates.parentLayoutCoordinates
+                        ?.positionInRoot() ?: Offset.Zero
                 val viewport = viewportInParent.translate(parentInRoot)
                 val target = Rect(node.positionInRoot, node.size.toSize())
 
-                val xScrollState = scrollableAncestor.unmergedConfig
-                    .getOrNull(SemanticsProperties.HorizontalScrollAxisRange)
-                val yScrollState = scrollableAncestor.unmergedConfig
-                    .getOrNull(SemanticsProperties.VerticalScrollAxisRange)
+                val xScrollState =
+                    scrollableAncestor.unmergedConfig.getOrNull(
+                        SemanticsProperties.HorizontalScrollAxisRange
+                    )
+                val yScrollState =
+                    scrollableAncestor.unmergedConfig.getOrNull(
+                        SemanticsProperties.VerticalScrollAxisRange
+                    )
 
                 // Given the desired scroll value to align either side of the target with the
                 // viewport, what delta should we go with?
@@ -1993,24 +1972,30 @@
         // This extra is just for testing: needed a way to retrieve `traversalBefore` and
         // `traversalAfter` from a non-sealed instance of an ANI
         if (extraDataKey == ExtraDataTestTraversalBeforeVal) {
-            idToBeforeMap
-                .getOrDefault(virtualViewId, -1)
-                .let { if (it != -1) { info.extras.putInt(extraDataKey, it) } }
+            idToBeforeMap.getOrDefault(virtualViewId, -1).let {
+                if (it != -1) {
+                    info.extras.putInt(extraDataKey, it)
+                }
+            }
         } else if (extraDataKey == ExtraDataTestTraversalAfterVal) {
-            idToAfterMap
-                .getOrDefault(virtualViewId, -1)
-                .let { if (it != -1) { info.extras.putInt(extraDataKey, it) } }
-        } else if (node.unmergedConfig.contains(SemanticsActions.GetTextLayoutResult) &&
-            arguments != null && extraDataKey == EXTRA_DATA_TEXT_CHARACTER_LOCATION_KEY
+            idToAfterMap.getOrDefault(virtualViewId, -1).let {
+                if (it != -1) {
+                    info.extras.putInt(extraDataKey, it)
+                }
+            }
+        } else if (
+            node.unmergedConfig.contains(SemanticsActions.GetTextLayoutResult) &&
+                arguments != null &&
+                extraDataKey == EXTRA_DATA_TEXT_CHARACTER_LOCATION_KEY
         ) {
-            val positionInfoStartIndex = arguments.getInt(
-                EXTRA_DATA_TEXT_CHARACTER_LOCATION_ARG_START_INDEX, -1
-            )
-            val positionInfoLength = arguments.getInt(
-                EXTRA_DATA_TEXT_CHARACTER_LOCATION_ARG_LENGTH, -1
-            )
-            if ((positionInfoLength <= 0) || (positionInfoStartIndex < 0) ||
-                (positionInfoStartIndex >= (text?.length ?: Int.MAX_VALUE))
+            val positionInfoStartIndex =
+                arguments.getInt(EXTRA_DATA_TEXT_CHARACTER_LOCATION_ARG_START_INDEX, -1)
+            val positionInfoLength =
+                arguments.getInt(EXTRA_DATA_TEXT_CHARACTER_LOCATION_ARG_LENGTH, -1)
+            if (
+                (positionInfoLength <= 0) ||
+                    (positionInfoStartIndex < 0) ||
+                    (positionInfoStartIndex >= (text?.length ?: Int.MAX_VALUE))
             ) {
                 Log.e(LogTag, "Invalid arguments for accessibility character locations")
                 return
@@ -2028,8 +2013,10 @@
                 boundingRects.add(boundsOnScreen)
             }
             info.extras.putParcelableArray(extraDataKey, boundingRects.toTypedArray())
-        } else if (node.unmergedConfig.contains(SemanticsProperties.TestTag) &&
-            arguments != null && extraDataKey == ExtraDataTestTagKey
+        } else if (
+            node.unmergedConfig.contains(SemanticsProperties.TestTag) &&
+                arguments != null &&
+                extraDataKey == ExtraDataTestTagKey
         ) {
             val testTag = node.unmergedConfig.getOrNull(SemanticsProperties.TestTag)
             if (testTag != null) {
@@ -2046,15 +2033,15 @@
         val textNodeBoundsInRoot = textNode.boundsInRoot
 
         // Only visible or partially visible locations are used.
-        val visibleBounds = if (boundsInRoot.overlaps(textNodeBoundsInRoot)) {
-            boundsInRoot.intersect(textNodeBoundsInRoot)
-        } else {
-            null
-        }
+        val visibleBounds =
+            if (boundsInRoot.overlaps(textNodeBoundsInRoot)) {
+                boundsInRoot.intersect(textNodeBoundsInRoot)
+            } else {
+                null
+            }
 
         return if (visibleBounds != null) {
-            val topLeftInScreen =
-                view.localToScreen(Offset(visibleBounds.left, visibleBounds.top))
+            val topLeftInScreen = view.localToScreen(Offset(visibleBounds.left, visibleBounds.top))
             val bottomRightInScreen =
                 view.localToScreen(Offset(visibleBounds.right, visibleBounds.bottom))
             RectF(
@@ -2069,12 +2056,11 @@
     }
 
     /**
-     * Dispatches hover {@link android.view.MotionEvent}s to the virtual view hierarchy when
-     * the Explore by Touch feature is enabled.
-     * <p>
-     * This method should be called by overriding
-     * {@link View#dispatchHoverEvent}:
+     * Dispatches hover {@link android.view.MotionEvent}s to the virtual view hierarchy when the
+     * Explore by Touch feature is enabled.
      *
+     * <p>
+     * This method should be called by overriding {@link View#dispatchHoverEvent}:
      * <pre>&#64;Override
      * public boolean dispatchHoverEvent(MotionEvent event) {
      *   if (mHelper.dispatchHoverEvent(this, event) {
@@ -2093,7 +2079,8 @@
         }
 
         when (event.action) {
-            MotionEvent.ACTION_HOVER_MOVE, MotionEvent.ACTION_HOVER_ENTER -> {
+            MotionEvent.ACTION_HOVER_MOVE,
+            MotionEvent.ACTION_HOVER_ENTER -> {
                 val virtualViewId = hitTestSemanticsAt(event.x, event.y)
                 // The android views could be view groups, so the event must be dispatched to the
                 // views. Android ViewGroup.java will take care of synthesizing hover enter/exit
@@ -2105,20 +2092,17 @@
                 updateHoveredVirtualView(virtualViewId)
                 return if (virtualViewId == InvalidId) handled else true
             }
-
             MotionEvent.ACTION_HOVER_EXIT -> {
                 return when {
                     hoveredVirtualViewId != InvalidId -> {
                         updateHoveredVirtualView(InvalidId)
                         true
                     }
-
                     else -> {
                         view.androidViewsHandler.dispatchGenericMotionEvent(event)
                     }
                 }
             }
-
             else -> {
                 return false
             }
@@ -2126,8 +2110,8 @@
     }
 
     /**
-     * Hit test the layout tree for semantics wrappers.
-     * The return value is a virtual view id, or InvalidId if an embedded Android View was hit.
+     * Hit test the layout tree for semantics wrappers. The return value is a virtual view id, or
+     * InvalidId if an embedded Android View was hit.
      */
     @VisibleForTesting
     internal fun hitTestSemanticsAt(x: Float, y: Float): Int {
@@ -2151,13 +2135,10 @@
             // Do not 'find' invisible nodes when exploring by touch. This will prevent us from
             // sending events for invisible nodes
             if (semanticsNode.isVisible) {
-                val androidView = view
-                    .androidViewsHandler
-                    .layoutNodeToHolder[layoutNode]
+                val androidView = view.androidViewsHandler.layoutNodeToHolder[layoutNode]
                 if (androidView == null) {
-                    virtualViewId = semanticsNodeIdToAccessibilityVirtualNodeId(
-                        layoutNode.semanticsId
-                    )
+                    virtualViewId =
+                        semanticsNodeIdToAccessibilityVirtualNodeId(layoutNode.semanticsId)
                 }
             }
         }
@@ -2165,12 +2146,11 @@
     }
 
     /**
-     * Sets the currently hovered item, sending hover accessibility events as
-     * necessary to maintain the correct state.
+     * Sets the currently hovered item, sending hover accessibility events as necessary to maintain
+     * the correct state.
      *
-     * @param virtualViewId The virtual view id for the item currently being
-     *            hovered, or {@link #InvalidId} if no item is hovered within
-     *            the parent view.
+     * @param virtualViewId The virtual view id for the item currently being hovered, or
+     *   {@link #InvalidId} if no item is hovered within the parent view.
      */
     private fun updateHoveredVirtualView(virtualViewId: Int) {
         if (hoveredVirtualViewId == virtualViewId) {
@@ -2193,9 +2173,9 @@
     }
 
     /**
-     * Trims the text to [size] length. Returns the string as it is if the length is
-     * smaller than [size]. If chars at [size] - 1 and [size] is a surrogate
-     * pair, returns a CharSequence of length [size] - 1.
+     * Trims the text to [size] length. Returns the string as it is if the length is smaller than
+     * [size]. If chars at [size] - 1 and [size] is a surrogate pair, returns a CharSequence of
+     * length [size] - 1.
      *
      * @param size length of the result, should be greater than 0
      */
@@ -2209,8 +2189,7 @@
         if (Character.isHighSurrogate(text[size - 1]) && Character.isLowSurrogate(text[size])) {
             len = size - 1
         }
-        @Suppress("UNCHECKED_CAST")
-        return text.subSequence(0, len) as T
+        @Suppress("UNCHECKED_CAST") return text.subSequence(0, len) as T
     }
 
     // TODO (in a separate cl): Called when the SemanticsNode with id semanticsNodeId disappears.
@@ -2266,8 +2245,10 @@
                         // up to date anymore.
                         // After the subtree events are sent, accessibility services will get the
                         // current visible/invisible state. We also try to do semantics tree diffing
-                        // to send out the proper accessibility events and update our copy here so that
-                        // our incremental changes (represented by accessibility events) are consistent
+                        // to send out the proper accessibility events and update our copy here so
+                        // that
+                        // our incremental changes (represented by accessibility events) are
+                        // consistent
                         // with accessibility services. That is: change - notify - new change -
                         // notify, if we don't do the tree diffing and update our copy here, we will
                         // combine old change and new change, which is missing finer-grained
@@ -2309,9 +2290,7 @@
         }
     }
 
-    private fun sendTypeViewScrolledAccessibilityEvent(
-        layoutNode: LayoutNode
-    ) {
+    private fun sendTypeViewScrolledAccessibilityEvent(layoutNode: LayoutNode) {
         // The node may be no longer available while we were waiting so check
         // again.
         if (!layoutNode.isAttached) {
@@ -2329,10 +2308,7 @@
             return
         }
 
-        val event = createEvent(
-            id,
-            AccessibilityEvent.TYPE_VIEW_SCROLLED
-        )
+        val event = createEvent(id, AccessibilityEvent.TYPE_VIEW_SCROLLED)
         pendingHorizontalScroll?.let {
             event.scrollX = it.value().toInt()
             event.maxScrollX = it.maxValue().toInt()
@@ -2366,20 +2342,22 @@
         }
 
         // When we finally send the event, make sure it is an accessibility-focusable node.
-        val id = trace("GetSemanticsNode") {
-            var semanticsNode = if (layoutNode.nodes.has(Nodes.Semantics))
-                layoutNode
-            else
-                layoutNode.findClosestParentNode { it.nodes.has(Nodes.Semantics) }
+        val id =
+            trace("GetSemanticsNode") {
+                var semanticsNode =
+                    if (layoutNode.nodes.has(Nodes.Semantics)) layoutNode
+                    else layoutNode.findClosestParentNode { it.nodes.has(Nodes.Semantics) }
 
-            val config = semanticsNode?.collapsedSemantics ?: return
-            if (!config.isMergingSemanticsOfDescendants) {
-                semanticsNode.findClosestParentNode {
-                    it.collapsedSemantics?.isMergingSemanticsOfDescendants == true
-                }?.let { semanticsNode = it }
+                val config = semanticsNode?.collapsedSemantics ?: return
+                if (!config.isMergingSemanticsOfDescendants) {
+                    semanticsNode
+                        .findClosestParentNode {
+                            it.collapsedSemantics?.isMergingSemanticsOfDescendants == true
+                        }
+                        ?.let { semanticsNode = it }
+                }
+                semanticsNode?.semanticsId ?: return
             }
-            semanticsNode?.semanticsId ?: return
-        }
 
         if (!subtreeChangedSemanticsNodesIds.add(id)) {
             return
@@ -2406,9 +2384,7 @@
         trace("sendSemanticsPropertyChangeEvents") {
             sendSemanticsPropertyChangeEvents(currentSemanticsNodes)
         }
-        trace("updateSemanticsNodesCopyAndPanes") {
-            updateSemanticsNodesCopyAndPanes()
-        }
+        trace("updateSemanticsNodesCopyAndPanes") { updateSemanticsNodesCopyAndPanes() }
     }
 
     private fun updateSemanticsNodesCopyAndPanes() {
@@ -2416,23 +2392,27 @@
         val toRemove = MutableIntSet()
         paneDisplayed.forEach { id ->
             val currentNode = currentSemanticsNodes[id]?.semanticsNode
-            if (currentNode == null ||
-                !currentNode.unmergedConfig.contains(SemanticsProperties.PaneTitle)) {
+            if (
+                currentNode == null ||
+                    !currentNode.unmergedConfig.contains(SemanticsProperties.PaneTitle)
+            ) {
                 toRemove.add(id)
                 sendPaneChangeEvents(
                     id,
                     AccessibilityEventCompat.CONTENT_CHANGE_TYPE_PANE_DISAPPEARED,
-                    previousSemanticsNodes[id]?.unmergedConfig?.getOrNull(
-                        SemanticsProperties.PaneTitle
-                    )
+                    previousSemanticsNodes[id]
+                        ?.unmergedConfig
+                        ?.getOrNull(SemanticsProperties.PaneTitle)
                 )
             }
         }
         paneDisplayed.removeAll(toRemove)
         previousSemanticsNodes.clear()
         currentSemanticsNodes.forEach { key, value ->
-            if (value.semanticsNode.unmergedConfig.contains(SemanticsProperties.PaneTitle) &&
-                paneDisplayed.add(key)) {
+            if (
+                value.semanticsNode.unmergedConfig.contains(SemanticsProperties.PaneTitle) &&
+                    paneDisplayed.add(key)
+            ) {
                 sendPaneChangeEvents(
                     key,
                     AccessibilityEventCompat.CONTENT_CHANGE_TYPE_PANE_APPEARED,
@@ -2455,21 +2435,24 @@
             // We do doing this search because the new configuration is set as a whole, so we
             // can't indicate which property is changed when setting the new configuration.
             val oldNode = previousSemanticsNodes[id] ?: return@forEachKey
-            val newNode = checkPreconditionNotNull(newSemanticsNodes[id]?.semanticsNode) {
-                "no value for specified key"
-            }
+            val newNode =
+                checkPreconditionNotNull(newSemanticsNodes[id]?.semanticsNode) {
+                    "no value for specified key"
+                }
 
             var propertyChanged = false
 
             for (entry in newNode.unmergedConfig) {
                 var newlyObservingScroll = false
-                if (entry.key == SemanticsProperties.HorizontalScrollAxisRange ||
-                    entry.key == SemanticsProperties.VerticalScrollAxisRange
+                if (
+                    entry.key == SemanticsProperties.HorizontalScrollAxisRange ||
+                        entry.key == SemanticsProperties.VerticalScrollAxisRange
                 ) {
                     newlyObservingScroll = registerScrollingId(id, oldScrollObservationScopes)
                 }
-                if (!newlyObservingScroll &&
-                    entry.value == oldNode.unmergedConfig.getOrNull(entry.key)
+                if (
+                    !newlyObservingScroll &&
+                        entry.value == oldNode.unmergedConfig.getOrNull(entry.key)
                 ) {
                     continue
                 }
@@ -2487,8 +2470,8 @@
                             )
                         }
                     }
-
-                    SemanticsProperties.StateDescription, SemanticsProperties.ToggleableState -> {
+                    SemanticsProperties.StateDescription,
+                    SemanticsProperties.ToggleableState -> {
                         sendEventForVirtualView(
                             semanticsNodeIdToAccessibilityVirtualNodeId(id),
                             AccessibilityEvent.TYPE_WINDOW_CONTENT_CHANGED,
@@ -2503,7 +2486,6 @@
                             AccessibilityEventCompat.CONTENT_CHANGE_TYPE_UNDEFINED
                         )
                     }
-
                     SemanticsProperties.ProgressBarRangeInfo -> {
                         sendEventForVirtualView(
                             semanticsNodeIdToAccessibilityVirtualNodeId(id),
@@ -2519,30 +2501,36 @@
                             AccessibilityEventCompat.CONTENT_CHANGE_TYPE_UNDEFINED
                         )
                     }
-
                     SemanticsProperties.Selected -> {
                         // The assumption is among widgets using SemanticsProperties.Selected, only
                         // Tab is using AccessibilityNodeInfo#isSelected, and all others are using
                         // AccessibilityNodeInfo#isCheckable and setting
                         // AccessibilityNodeInfo#stateDescription in this delegate.
-                        if (newNode.unmergedConfig.getOrNull(SemanticsProperties.Role)
-                            == Role.Tab) {
-                            if (newNode.unmergedConfig.getOrNull(SemanticsProperties.Selected)
-                                == true) {
-                                val event = createEvent(
-                                    semanticsNodeIdToAccessibilityVirtualNodeId(id),
-                                    AccessibilityEvent.TYPE_VIEW_SELECTED
-                                )
+                        if (
+                            newNode.unmergedConfig.getOrNull(SemanticsProperties.Role) == Role.Tab
+                        ) {
+                            if (
+                                newNode.unmergedConfig.getOrNull(SemanticsProperties.Selected) ==
+                                    true
+                            ) {
+                                val event =
+                                    createEvent(
+                                        semanticsNodeIdToAccessibilityVirtualNodeId(id),
+                                        AccessibilityEvent.TYPE_VIEW_SELECTED
+                                    )
                                 // Here we use the merged node. Because we specifically are using
                                 // the merged node, we must also use the merged version of the
                                 // SemanticsConfiguration via `config` instead of `unmergedConfig`
                                 // as the rest of the file uses.
                                 val mergedNode = newNode.copyWithMergingEnabled()
-                                val contentDescription = mergedNode.config.getOrNull(
-                                    SemanticsProperties.ContentDescription
-                                )?.fastJoinToString(",")
-                                val text = mergedNode.config.getOrNull(SemanticsProperties.Text)
-                                    ?.fastJoinToString(",")
+                                val contentDescription =
+                                    mergedNode.config
+                                        .getOrNull(SemanticsProperties.ContentDescription)
+                                        ?.fastJoinToString(",")
+                                val text =
+                                    mergedNode.config
+                                        .getOrNull(SemanticsProperties.Text)
+                                        ?.fastJoinToString(",")
                                 contentDescription?.let { event.contentDescription = it }
                                 text?.let { event.text.add(it) }
                                 sendEvent(event)
@@ -2570,7 +2558,6 @@
                             )
                         }
                     }
-
                     SemanticsProperties.ContentDescription -> {
                         sendEventForVirtualView(
                             semanticsNodeIdToAccessibilityVirtualNodeId(id),
@@ -2579,7 +2566,6 @@
                             entry.value as List<String>
                         )
                     }
-
                     SemanticsProperties.EditableText -> {
                         if (newNode.unmergedConfig.contains(SemanticsActions.SetText)) {
 
@@ -2602,8 +2588,9 @@
                             // abcdabcd vs
                             //     abcd
                             while (endCount < minLength - startCount) {
-                                if (oldText[oldTextLen - 1 - endCount] !=
-                                    newText[newTextLen - 1 - endCount]
+                                if (
+                                    oldText[oldTextLen - 1 - endCount] !=
+                                        newText[newTextLen - 1 - endCount]
                                 ) {
                                     break
                                 }
@@ -2621,38 +2608,43 @@
 
                             // (b/247891690) We won't send a text change event when we only toggle
                             // the password visibility of the node
-                            val becamePasswordNode = oldNodeIsTextfield &&
-                                !oldNodeIsPassword && newNodeIsPassword
-                            val becameNotPasswordNode = oldNodeIsTextfield &&
-                                oldNodeIsPassword && !newNodeIsPassword
-                            val event = if (becamePasswordNode || becameNotPasswordNode) {
-                                // (b/247891690) password visibility toggle is handled by a
-                                // selection event. Because internally Talkback already has the
-                                // correct cursor position, there will be no announcement.
-                                // Therefore we first send the "cursor reset" event with the
-                                // selection at (0, 0) and right after that we will send the event
-                                // with the correct cursor position. This behaves similarly to the
-                                // View-based material EditText which also sends two selection
-                                // events
-                                createTextSelectionChangedEvent(
-                                    virtualViewId = semanticsNodeIdToAccessibilityVirtualNodeId(id),
-                                    fromIndex = 0,
-                                    toIndex = 0,
-                                    itemCount = newTextLen,
-                                    text = trimmedNewText
-                                )
-                            } else {
-                                createEvent(
-                                    semanticsNodeIdToAccessibilityVirtualNodeId(id),
-                                    AccessibilityEvent.TYPE_VIEW_TEXT_CHANGED
-                                ).apply {
-                                    this.fromIndex = startCount
-                                    this.removedCount = removedCount
-                                    this.addedCount = addedCount
-                                    this.beforeText = oldText
-                                    this.text.add(trimmedNewText)
+                            val becamePasswordNode =
+                                oldNodeIsTextfield && !oldNodeIsPassword && newNodeIsPassword
+                            val becameNotPasswordNode =
+                                oldNodeIsTextfield && oldNodeIsPassword && !newNodeIsPassword
+                            val event =
+                                if (becamePasswordNode || becameNotPasswordNode) {
+                                    // (b/247891690) password visibility toggle is handled by a
+                                    // selection event. Because internally Talkback already has the
+                                    // correct cursor position, there will be no announcement.
+                                    // Therefore we first send the "cursor reset" event with the
+                                    // selection at (0, 0) and right after that we will send the
+                                    // event
+                                    // with the correct cursor position. This behaves similarly to
+                                    // the
+                                    // View-based material EditText which also sends two selection
+                                    // events
+                                    createTextSelectionChangedEvent(
+                                        virtualViewId =
+                                            semanticsNodeIdToAccessibilityVirtualNodeId(id),
+                                        fromIndex = 0,
+                                        toIndex = 0,
+                                        itemCount = newTextLen,
+                                        text = trimmedNewText
+                                    )
+                                } else {
+                                    createEvent(
+                                            semanticsNodeIdToAccessibilityVirtualNodeId(id),
+                                            AccessibilityEvent.TYPE_VIEW_TEXT_CHANGED
+                                        )
+                                        .apply {
+                                            this.fromIndex = startCount
+                                            this.removedCount = removedCount
+                                            this.addedCount = addedCount
+                                            this.beforeText = oldText
+                                            this.text.add(trimmedNewText)
+                                        }
                                 }
-                            }
                             event.className = TextFieldClassName
                             sendEvent(event)
 
@@ -2678,31 +2670,32 @@
                         val newText = newNode.unmergedConfig.getTextForTextField()?.text ?: ""
                         val textRange =
                             newNode.unmergedConfig[SemanticsProperties.TextSelectionRange]
-                        val event = createTextSelectionChangedEvent(
-                            semanticsNodeIdToAccessibilityVirtualNodeId(id),
-                            textRange.start,
-                            textRange.end,
-                            newText.length,
-                            trimToSize(newText, ParcelSafeTextLength)
-                        )
+                        val event =
+                            createTextSelectionChangedEvent(
+                                semanticsNodeIdToAccessibilityVirtualNodeId(id),
+                                textRange.start,
+                                textRange.end,
+                                newText.length,
+                                trimToSize(newText, ParcelSafeTextLength)
+                            )
                         sendEvent(event)
                         sendPendingTextTraversedAtGranularityEvent(newNode.id)
                     }
-
                     SemanticsProperties.HorizontalScrollAxisRange,
                     SemanticsProperties.VerticalScrollAxisRange -> {
                         notifySubtreeAccessibilityStateChangedIfNeeded(newNode.layoutNode)
 
                         val scope = scrollObservationScopes.findById(id)!!
-                        scope.horizontalScrollAxisRange = newNode.unmergedConfig.getOrNull(
-                            SemanticsProperties.HorizontalScrollAxisRange
-                        )
-                        scope.verticalScrollAxisRange = newNode.unmergedConfig.getOrNull(
-                            SemanticsProperties.VerticalScrollAxisRange
-                        )
+                        scope.horizontalScrollAxisRange =
+                            newNode.unmergedConfig.getOrNull(
+                                SemanticsProperties.HorizontalScrollAxisRange
+                            )
+                        scope.verticalScrollAxisRange =
+                            newNode.unmergedConfig.getOrNull(
+                                SemanticsProperties.VerticalScrollAxisRange
+                            )
                         scheduleScrollEventIfNeeded(scope)
                     }
-
                     SemanticsProperties.Focused -> {
                         if (entry.value as Boolean) {
                             sendEvent(
@@ -2721,20 +2714,15 @@
                             AccessibilityEvent.CONTENT_CHANGE_TYPE_UNDEFINED
                         )
                     }
-
                     CustomActions -> {
                         val actions = newNode.unmergedConfig[CustomActions]
                         val oldActions = oldNode.unmergedConfig.getOrNull(CustomActions)
                         if (oldActions != null) {
                             // Suppose actions with the same label should be deduped.
                             val labels = mutableSetOf<String>()
-                            actions.fastForEach { action ->
-                                labels.add(action.label)
-                            }
+                            actions.fastForEach { action -> labels.add(action.label) }
                             val oldLabels = mutableSetOf<String>()
-                            oldActions.fastForEach { action ->
-                                oldLabels.add(action.label)
-                            }
+                            oldActions.fastForEach { action -> oldLabels.add(action.label) }
                             propertyChanged =
                                 !(labels.containsAll(oldLabels) && oldLabels.containsAll(labels))
                         } else if (actions.isNotEmpty()) {
@@ -2744,12 +2732,14 @@
                     // TODO(b/151840490) send the correct events for certain properties, like view
                     //  selected.
                     else -> {
-                        propertyChanged = if (entry.value is AccessibilityAction<*>) {
-                            !(entry.value as AccessibilityAction<*>)
-                                .accessibilityEquals(oldNode.unmergedConfig.getOrNull(entry.key))
-                        } else {
-                            true
-                        }
+                        propertyChanged =
+                            if (entry.value is AccessibilityAction<*>) {
+                                !(entry.value as AccessibilityAction<*>).accessibilityEquals(
+                                    oldNode.unmergedConfig.getOrNull(entry.key)
+                                )
+                            } else {
+                                true
+                            }
                     }
                 }
             }
@@ -2788,19 +2778,20 @@
     ): Boolean {
         var newlyObservingScroll = false
         val oldScope = oldScrollObservationScopes.findById(id)
-        val newScope = if (oldScope != null) {
-            oldScope
-        } else {
-            newlyObservingScroll = true
-            ScrollObservationScope(
-                semanticsNodeId = id,
-                allScopes = scrollObservationScopes,
-                oldXValue = null,
-                oldYValue = null,
-                horizontalScrollAxisRange = null,
-                verticalScrollAxisRange = null
-            )
-        }
+        val newScope =
+            if (oldScope != null) {
+                oldScope
+            } else {
+                newlyObservingScroll = true
+                ScrollObservationScope(
+                    semanticsNodeId = id,
+                    allScopes = scrollObservationScopes,
+                    oldXValue = null,
+                    oldYValue = null,
+                    horizontalScrollAxisRange = null,
+                    verticalScrollAxisRange = null
+                )
+            }
         scrollObservationScopes.add(newScope)
         return newlyObservingScroll
     }
@@ -2818,21 +2809,24 @@
             val oldXValue = scrollObservationScope.oldXValue
             val oldYValue = scrollObservationScope.oldYValue
 
-            val deltaX = if (newXState != null && oldXValue != null) {
-                newXState.value() - oldXValue
-            } else {
-                0f
-            }
-            val deltaY = if (newYState != null && oldYValue != null) {
-                newYState.value() - oldYValue
-            } else {
-                0f
-            }
+            val deltaX =
+                if (newXState != null && oldXValue != null) {
+                    newXState.value() - oldXValue
+                } else {
+                    0f
+                }
+            val deltaY =
+                if (newYState != null && oldYValue != null) {
+                    newYState.value() - oldYValue
+                } else {
+                    0f
+                }
 
             if (deltaX != 0f || deltaY != 0f) {
-                val scrollerId = semanticsNodeIdToAccessibilityVirtualNodeId(
-                    scrollObservationScope.semanticsNodeId
-                )
+                val scrollerId =
+                    semanticsNodeIdToAccessibilityVirtualNodeId(
+                        scrollObservationScope.semanticsNodeId
+                    )
 
                 // Refresh the current "green box" bounds and invalidate the View to tell
                 // ViewRootImpl to redraw it at its latest position.
@@ -2875,15 +2869,12 @@
         }
     }
 
-    private fun sendPaneChangeEvents(
-        semanticsNodeId: Int,
-        contentChangeType: Int,
-        title: String?
-    ) {
-        val event = createEvent(
-            semanticsNodeIdToAccessibilityVirtualNodeId(semanticsNodeId),
-            AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED
-        )
+    private fun sendPaneChangeEvents(semanticsNodeId: Int, contentChangeType: Int, title: String?) {
+        val event =
+            createEvent(
+                semanticsNodeIdToAccessibilityVirtualNodeId(semanticsNodeId),
+                AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED
+            )
         event.contentChangeTypes = contentChangeType
         if (title != null) {
             event.text.add(title)
@@ -2919,7 +2910,9 @@
         newNode.replacedChildren.fastForEach { child ->
             if (currentSemanticsNodes.contains(child.id)) {
                 sendAccessibilitySemanticsStructureChangeEvents(
-                    child, previousSemanticsNodes[child.id]!!)
+                    child,
+                    previousSemanticsNodes[child.id]!!
+                )
             }
         }
     }
@@ -2951,8 +2944,9 @@
         if (current == AccessibilityCursorPositionUndefined) {
             current = if (forward) 0 else text.length
         }
-        val range = (if (forward) iterator.following(current) else iterator.preceding(current))
-            ?: return false
+        val range =
+            (if (forward) iterator.following(current) else iterator.preceding(current))
+                ?: return false
         val segmentStart = range[0]
         val segmentEnd = range[1]
         var selectionStart: Int
@@ -2968,17 +2962,17 @@
             selectionEnd = selectionStart
         }
         val action =
-            if (forward)
-                AccessibilityNodeInfoCompat.ACTION_NEXT_AT_MOVEMENT_GRANULARITY
+            if (forward) AccessibilityNodeInfoCompat.ACTION_NEXT_AT_MOVEMENT_GRANULARITY
             else AccessibilityNodeInfoCompat.ACTION_PREVIOUS_AT_MOVEMENT_GRANULARITY
-        pendingTextTraversedEvent = PendingTextTraversedEvent(
-            node,
-            action,
-            granularity,
-            segmentStart,
-            segmentEnd,
-            SystemClock.uptimeMillis()
-        )
+        pendingTextTraversedEvent =
+            PendingTextTraversedEvent(
+                node,
+                action,
+                granularity,
+                segmentStart,
+                segmentEnd,
+                SystemClock.uptimeMillis()
+            )
         setAccessibilitySelection(node, selectionStart, selectionEnd, true)
         return true
     }
@@ -2990,10 +2984,11 @@
                 return
             }
             if (SystemClock.uptimeMillis() - it.traverseTime <= TextTraversedEventTimeoutMillis) {
-                val event = createEvent(
-                    semanticsNodeIdToAccessibilityVirtualNodeId(it.node.id),
-                    AccessibilityEvent.TYPE_VIEW_TEXT_TRAVERSED_AT_MOVEMENT_GRANULARITY
-                )
+                val event =
+                    createEvent(
+                        semanticsNodeIdToAccessibilityVirtualNodeId(it.node.id),
+                        AccessibilityEvent.TYPE_VIEW_TEXT_TRAVERSED_AT_MOVEMENT_GRANULARITY
+                    )
                 event.fromIndex = it.fromIndex
                 event.toIndex = it.toIndex
                 event.action = it.action
@@ -3018,29 +3013,29 @@
             // Hide all selection controllers used for adjusting selection
             // since we are doing so explicitly by other means and these
             // controllers interact with how selection behaves. From TextView.java.
-            return node.unmergedConfig[SemanticsActions.SetSelection].action?.invoke(
-                start,
-                end,
-                traversalMode
-            ) ?: false
+            return node.unmergedConfig[SemanticsActions.SetSelection]
+                .action
+                ?.invoke(start, end, traversalMode) ?: false
         }
         if (start == end && end == accessibilityCursorPosition) {
             return false
         }
         val text = getIterableTextForAccessibility(node) ?: return false
-        accessibilityCursorPosition = if (start >= 0 && start == end && end <= text.length) {
-            start
-        } else {
-            AccessibilityCursorPositionUndefined
-        }
+        accessibilityCursorPosition =
+            if (start >= 0 && start == end && end <= text.length) {
+                start
+            } else {
+                AccessibilityCursorPositionUndefined
+            }
         val nonEmptyText = text.isNotEmpty()
-        val event = createTextSelectionChangedEvent(
-            semanticsNodeIdToAccessibilityVirtualNodeId(node.id),
-            if (nonEmptyText) accessibilityCursorPosition else null,
-            if (nonEmptyText) accessibilityCursorPosition else null,
-            if (nonEmptyText) text.length else null,
-            text
-        )
+        val event =
+            createTextSelectionChangedEvent(
+                semanticsNodeIdToAccessibilityVirtualNodeId(node.id),
+                if (nonEmptyText) accessibilityCursorPosition else null,
+                if (nonEmptyText) accessibilityCursorPosition else null,
+                if (nonEmptyText) text.length else null,
+                text
+            )
         sendEvent(event)
         sendPendingTextTraversedAtGranularityEvent(node.id)
         return true
@@ -3049,8 +3044,9 @@
     /** Returns selection start and end indices in original text */
     private fun getAccessibilitySelectionStart(node: SemanticsNode): Int {
         // If there is ContentDescription, it will be used instead of text during traversal.
-        if (!node.unmergedConfig.contains(SemanticsProperties.ContentDescription) &&
-            node.unmergedConfig.contains(SemanticsProperties.TextSelectionRange)
+        if (
+            !node.unmergedConfig.contains(SemanticsProperties.ContentDescription) &&
+                node.unmergedConfig.contains(SemanticsProperties.TextSelectionRange)
         ) {
             return node.unmergedConfig[SemanticsProperties.TextSelectionRange].start
         }
@@ -3059,8 +3055,9 @@
 
     private fun getAccessibilitySelectionEnd(node: SemanticsNode): Int {
         // If there is ContentDescription, it will be used instead of text during traversal.
-        if (!node.unmergedConfig.contains(SemanticsProperties.ContentDescription) &&
-            node.unmergedConfig.contains(SemanticsProperties.TextSelectionRange)
+        if (
+            !node.unmergedConfig.contains(SemanticsProperties.ContentDescription) &&
+                node.unmergedConfig.contains(SemanticsProperties.TextSelectionRange)
         ) {
             return node.unmergedConfig[SemanticsProperties.TextSelectionRange].end
         }
@@ -3088,24 +3085,23 @@
         @Suppress("DEPRECATION")
         when (granularity) {
             AccessibilityNodeInfoCompat.MOVEMENT_GRANULARITY_CHARACTER -> {
-                iterator = AccessibilityIterators.CharacterTextSegmentIterator.getInstance(
-                    view.context.resources.configuration.locale
-                )
+                iterator =
+                    AccessibilityIterators.CharacterTextSegmentIterator.getInstance(
+                        view.context.resources.configuration.locale
+                    )
                 iterator.initialize(text)
             }
-
             AccessibilityNodeInfoCompat.MOVEMENT_GRANULARITY_WORD -> {
-                iterator = AccessibilityIterators.WordTextSegmentIterator.getInstance(
-                    view.context.resources.configuration.locale
-                )
+                iterator =
+                    AccessibilityIterators.WordTextSegmentIterator.getInstance(
+                        view.context.resources.configuration.locale
+                    )
                 iterator.initialize(text)
             }
-
             AccessibilityNodeInfoCompat.MOVEMENT_GRANULARITY_PARAGRAPH -> {
                 iterator = AccessibilityIterators.ParagraphTextSegmentIterator.getInstance()
                 iterator.initialize(text)
             }
-
             AccessibilityNodeInfoCompat.MOVEMENT_GRANULARITY_LINE,
             AccessibilityNodeInfoCompat.MOVEMENT_GRANULARITY_PAGE -> {
                 // Line and page granularity are only for static text or text field.
@@ -3122,7 +3118,6 @@
                     iterator.initialize(text, textLayoutResult, node)
                 }
             }
-
             else -> return null
         }
         return iterator
@@ -3142,8 +3137,7 @@
         // Note in android framework, TextView set this to its text. This is changed to
         // prioritize content description, even for Text.
         if (node.unmergedConfig.contains(SemanticsProperties.ContentDescription)) {
-            return node.unmergedConfig[SemanticsProperties.ContentDescription]
-                .fastJoinToString(",")
+            return node.unmergedConfig[SemanticsProperties.ContentDescription].fastJoinToString(",")
         }
 
         if (node.unmergedConfig.contains(SemanticsActions.SetText)) {
@@ -3168,11 +3162,7 @@
             }
         }
 
-        override fun performAction(
-            virtualViewId: Int,
-            action: Int,
-            arguments: Bundle?
-        ): Boolean {
+        override fun performAction(virtualViewId: Int, action: Int, arguments: Bundle?): Boolean {
             return performActionHelper(virtualViewId, action, arguments)
         }
 
@@ -3194,10 +3184,7 @@
     private object Api24Impl {
         @DoNotInline
         @JvmStatic
-        fun addSetProgressAction(
-            info: AccessibilityNodeInfoCompat,
-            semanticsNode: SemanticsNode
-        ) {
+        fun addSetProgressAction(info: AccessibilityNodeInfoCompat, semanticsNode: SemanticsNode) {
             if (semanticsNode.enabled()) {
                 semanticsNode.unmergedConfig.getOrNull(SemanticsActions.SetProgress)?.let {
                     info.addAction(
@@ -3215,17 +3202,11 @@
     private object Api29Impl {
         @JvmStatic
         @DoNotInline
-        fun addPageActions(
-            info: AccessibilityNodeInfoCompat,
-            semanticsNode: SemanticsNode
-        ) {
+        fun addPageActions(info: AccessibilityNodeInfoCompat, semanticsNode: SemanticsNode) {
             if (semanticsNode.enabled()) {
                 semanticsNode.unmergedConfig.getOrNull(SemanticsActions.PageUp)?.let {
                     info.addAction(
-                        AccessibilityActionCompat(
-                            android.R.id.accessibilityActionPageUp,
-                            it.label
-                        )
+                        AccessibilityActionCompat(android.R.id.accessibilityActionPageUp, it.label)
                     )
                 }
                 semanticsNode.unmergedConfig.getOrNull(SemanticsActions.PageDown)?.let {
@@ -3274,20 +3255,25 @@
     return false
 }
 
-private val SemanticsNode.isRtl get() = layoutInfo.layoutDirection == LayoutDirection.Rtl
+private val SemanticsNode.isRtl
+    get() = layoutInfo.layoutDirection == LayoutDirection.Rtl
 
 private fun SemanticsNode.excludeLineAndPageGranularities(): Boolean {
     // text field that is not in focus
-    if (unmergedConfig.contains(SemanticsActions.SetText) &&
-        unmergedConfig.getOrNull(SemanticsProperties.Focused) != true) return true
+    if (
+        unmergedConfig.contains(SemanticsActions.SetText) &&
+            unmergedConfig.getOrNull(SemanticsProperties.Focused) != true
+    )
+        return true
 
     // text nodes that are part of the 'merged' text field, for example hint or label.
-    val ancestor = layoutNode.findClosestParentNode {
-        // looking for text field merging node
-        val ancestorSemanticsConfiguration = it.collapsedSemantics
-        ancestorSemanticsConfiguration?.isMergingSemanticsOfDescendants == true &&
-            ancestorSemanticsConfiguration.contains(SemanticsActions.SetText)
-    }
+    val ancestor =
+        layoutNode.findClosestParentNode {
+            // looking for text field merging node
+            val ancestorSemanticsConfiguration = it.collapsedSemantics
+            ancestorSemanticsConfiguration?.isMergingSemanticsOfDescendants == true &&
+                ancestorSemanticsConfiguration.contains(SemanticsActions.SetText)
+        }
     return ancestor != null &&
         ancestor.collapsedSemantics?.getOrNull(SemanticsProperties.Focused) != true
 }
@@ -3305,10 +3291,12 @@
 
 @Deprecated(
     message = "Use ContentCapture.isEnabled instead",
-    replaceWith = ReplaceWith(
-        expression = "!ContentCaptureManager.isEnabled",
-        imports = ["androidx.compose.ui.contentcapture.ContentCaptureManager.Companion.isEnabled"]
-    ),
+    replaceWith =
+        ReplaceWith(
+            expression = "!ContentCaptureManager.isEnabled",
+            imports =
+                ["androidx.compose.ui.contentcapture.ContentCaptureManager.Companion.isEnabled"]
+        ),
     level = DeprecationLevel.WARNING
 )
 @Suppress("GetterSetterNames", "OPT_IN_MARKER_ON_WRONG_TARGET", "NullAnnotationGroup")
@@ -3318,4 +3306,6 @@
 @ExperimentalComposeUiApi
 var DisableContentCapture: Boolean
     get() = ContentCaptureManager.isEnabled
-    set(value) { ContentCaptureManager.isEnabled = value }
+    set(value) {
+        ContentCaptureManager.isEnabled = value
+    }
diff --git a/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/platform/AndroidCompositionLocals.android.kt b/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/platform/AndroidCompositionLocals.android.kt
index 04e204c..b865c80 100644
--- a/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/platform/AndroidCompositionLocals.android.kt
+++ b/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/platform/AndroidCompositionLocals.android.kt
@@ -42,47 +42,34 @@
  * The Android [Configuration]. The [Configuration] is useful for determining how to organize the
  * UI.
  */
-val LocalConfiguration = compositionLocalOf<Configuration> {
-    noLocalProvidedFor("LocalConfiguration")
-}
+val LocalConfiguration =
+    compositionLocalOf<Configuration> { noLocalProvidedFor("LocalConfiguration") }
 
-/**
- * Provides a [Context] that can be used by Android applications.
- */
-val LocalContext = staticCompositionLocalOf<Context> {
-    noLocalProvidedFor("LocalContext")
-}
+/** Provides a [Context] that can be used by Android applications. */
+val LocalContext = staticCompositionLocalOf<Context> { noLocalProvidedFor("LocalContext") }
 
-internal val LocalImageVectorCache = staticCompositionLocalOf<ImageVectorCache> {
-    noLocalProvidedFor("LocalImageVectorCache")
-}
+internal val LocalImageVectorCache =
+    staticCompositionLocalOf<ImageVectorCache> { noLocalProvidedFor("LocalImageVectorCache") }
 
-internal val LocalResourceIdCache = staticCompositionLocalOf<ResourceIdCache> {
-    noLocalProvidedFor("LocalResourceIdCache")
-}
+internal val LocalResourceIdCache =
+    staticCompositionLocalOf<ResourceIdCache> { noLocalProvidedFor("LocalResourceIdCache") }
 
-/**
- * The CompositionLocal containing the current [LifecycleOwner].
- */
- @Deprecated(
+/** The CompositionLocal containing the current [LifecycleOwner]. */
+@Deprecated(
     "Moved to lifecycle-runtime-compose library in androidx.lifecycle.compose package.",
     ReplaceWith("androidx.lifecycle.compose.LocalLifecycleOwner"),
- )
-val LocalLifecycleOwner get() = LocalLifecycleOwner
+)
+val LocalLifecycleOwner
+    get() = LocalLifecycleOwner
 
-/**
- * The CompositionLocal containing the current [SavedStateRegistryOwner].
- */
-val LocalSavedStateRegistryOwner = staticCompositionLocalOf<SavedStateRegistryOwner> {
-    noLocalProvidedFor("LocalSavedStateRegistryOwner")
-}
+/** The CompositionLocal containing the current [SavedStateRegistryOwner]. */
+val LocalSavedStateRegistryOwner =
+    staticCompositionLocalOf<SavedStateRegistryOwner> {
+        noLocalProvidedFor("LocalSavedStateRegistryOwner")
+    }
 
-/**
- * The CompositionLocal containing the current Compose [View].
- */
-val LocalView = staticCompositionLocalOf<View> {
-    noLocalProvidedFor("LocalView")
-}
+/** The CompositionLocal containing the current Compose [View]. */
+val LocalView = staticCompositionLocalOf<View> { noLocalProvidedFor("LocalView") }
 
 @Composable
 @OptIn(ExperimentalComposeUiApi::class)
@@ -94,25 +81,21 @@
     val context = view.context
     // Make a deep copy to compare to later, since the same configuration object will be mutated
     // as part of configuration changes
-    var configuration by remember {
-        mutableStateOf(Configuration(context.resources.configuration))
-    }
+    var configuration by remember { mutableStateOf(Configuration(context.resources.configuration)) }
 
     owner.configurationChangeObserver = { configuration = Configuration(it) }
 
     val uriHandler = remember { AndroidUriHandler(context) }
-    val viewTreeOwners = owner.viewTreeOwners ?: throw IllegalStateException(
-        "Called when the ViewTreeOwnersAvailability is not yet in Available state"
-    )
+    val viewTreeOwners =
+        owner.viewTreeOwners
+            ?: throw IllegalStateException(
+                "Called when the ViewTreeOwnersAvailability is not yet in Available state"
+            )
 
     val saveableStateRegistry = remember {
         DisposableSaveableStateRegistry(view, viewTreeOwners.savedStateRegistryOwner)
     }
-    DisposableEffect(Unit) {
-        onDispose {
-            saveableStateRegistry.dispose()
-        }
-    }
+    DisposableEffect(Unit) { onDispose { saveableStateRegistry.dispose() } }
 
     val imageVectorCache = obtainImageVectorCache(context, configuration)
     val resourceIdCache = obtainResourceIdCache(context)
@@ -129,11 +112,7 @@
         LocalResourceIdCache provides resourceIdCache,
         LocalProvidableScrollCaptureInProgress provides scrollCaptureInProgress,
     ) {
-        ProvideCommonCompositionLocals(
-            owner = owner,
-            uriHandler = uriHandler,
-            content = content
-        )
+        ProvideCommonCompositionLocals(owner = owner, uriHandler = uriHandler, content = content)
     }
 }
 
@@ -158,9 +137,7 @@
     }
     DisposableEffect(resourceIdCache) {
         context.applicationContext.registerComponentCallbacks(callbacks)
-        onDispose {
-            context.applicationContext.unregisterComponentCallbacks(callbacks)
-        }
+        onDispose { context.applicationContext.unregisterComponentCallbacks(callbacks) }
     }
     return resourceIdCache
 }
@@ -194,9 +171,7 @@
     }
     DisposableEffect(imageVectorCache) {
         context.applicationContext.registerComponentCallbacks(callbacks)
-        onDispose {
-            context.applicationContext.unregisterComponentCallbacks(callbacks)
-        }
+        onDispose { context.applicationContext.unregisterComponentCallbacks(callbacks) }
     }
     return imageVectorCache
 }
diff --git a/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/platform/AndroidFontResourceLoader.android.kt b/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/platform/AndroidFontResourceLoader.android.kt
index eb48e82..f8db271 100644
--- a/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/platform/AndroidFontResourceLoader.android.kt
+++ b/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/platform/AndroidFontResourceLoader.android.kt
@@ -25,18 +25,14 @@
 import androidx.compose.ui.text.font.ResourceFont
 import androidx.core.content.res.ResourcesCompat
 
-/**
- * Android implementation for [Font.ResourceLoader]. It is designed to load only [ResourceFont].
- */
+/** Android implementation for [Font.ResourceLoader]. It is designed to load only [ResourceFont]. */
 @Suppress("DEPRECATION", "OverridingDeprecatedMember")
 @Deprecated(
     "Replaced with PlatformFontLoader during the introduction of async fonts, all" +
         " usages should be replaced",
     ReplaceWith("PlatformFontLoader"),
 )
-internal class AndroidFontResourceLoader(
-    private val context: Context
-) : Font.ResourceLoader {
+internal class AndroidFontResourceLoader(private val context: Context) : Font.ResourceLoader {
 
     @Deprecated(
         "Replaced by FontFamily.Resolver, this method should not be called",
@@ -56,9 +52,9 @@
 }
 
 /**
- * This class is here to ensure that the classes that use this API will get verified and can be
- * AOT compiled. It is expected that this class will soft-fail verification, but the classes
- * which use this method will pass.
+ * This class is here to ensure that the classes that use this API will get verified and can be AOT
+ * compiled. It is expected that this class will soft-fail verification, but the classes which use
+ * this method will pass.
  */
 @RequiresApi(26)
 private object AndroidFontResourceLoaderHelper {
diff --git a/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/platform/AndroidPlatformTextInputSession.android.kt b/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/platform/AndroidPlatformTextInputSession.android.kt
index ed817a3..6fc34fa 100644
--- a/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/platform/AndroidPlatformTextInputSession.android.kt
+++ b/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/platform/AndroidPlatformTextInputSession.android.kt
@@ -36,12 +36,12 @@
  *
  * On Android there are three levels of input sessions:
  * 1. [PlatformTextInputModifierNode.establishTextInputSession]: The app is performing some
- *   initialization before requesting the keyboard.
+ *    initialization before requesting the keyboard.
  * 2. [PlatformTextInputSession.startInputMethod]: The app has requested the keyboard with a
- *   particular implementation for [View.onCreateInputConnection] represented by a
- *   [PlatformTextInputMethodRequest].
- * 3. [View.onCreateInputConnection]: The system has responded to the keyboard request by asking
- *   the view for a new [InputConnection].
+ *    particular implementation for [View.onCreateInputConnection] represented by a
+ *    [PlatformTextInputMethodRequest].
+ * 3. [View.onCreateInputConnection]: The system has responded to the keyboard request by asking the
+ *    view for a new [InputConnection].
  *
  * Each of these sessions is a parent of the next, in terms of lifetime and cancellation.
  *
@@ -55,9 +55,7 @@
     private val textInputService: TextInputService,
     private val coroutineScope: CoroutineScope
 ) : PlatformTextInputSessionScope, CoroutineScope by coroutineScope {
-    /**
-     * Coordinates between calls to [startInputMethod].
-     */
+    /** Coordinates between calls to [startInputMethod]. */
     private val methodSessionMutex = SessionMutex<InputMethodSession>()
 
     /**
@@ -70,9 +68,7 @@
     override suspend fun startInputMethod(request: PlatformTextInputMethodRequest): Nothing =
         methodSessionMutex.withSessionCancellingPrevious(
             sessionInitializer = { coroutineScope ->
-                InputMethodSession(request, onConnectionClosed = {
-                    coroutineScope.cancel()
-                })
+                InputMethodSession(request, onConnectionClosed = { coroutineScope.cancel() })
             }
         ) { methodSession ->
             @Suppress("RemoveExplicitTypeArguments")
@@ -118,7 +114,8 @@
     private var connection: NullableInputConnectionWrapper? = null
     private var disposed = false
 
-    val isActive: Boolean get() = !disposed
+    val isActive: Boolean
+        get() = !disposed
 
     /**
      * Creates a new [InputConnection] and initializes [outAttrs] by calling this session's
@@ -135,11 +132,10 @@
 
             val connectionDelegate = request.createInputConnection(outAttrs)
             return NullableInputConnectionWrapper(
-                delegate = connectionDelegate,
-                onConnectionClosed = onConnectionClosed
-            ).also {
-                connection = it
-            }
+                    delegate = connectionDelegate,
+                    onConnectionClosed = onConnectionClosed
+                )
+                .also { connection = it }
         }
     }
 
diff --git a/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/platform/AndroidTextToolbar.android.kt b/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/platform/AndroidTextToolbar.android.kt
index 6849410..9e9d4b6 100644
--- a/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/platform/AndroidTextToolbar.android.kt
+++ b/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/platform/AndroidTextToolbar.android.kt
@@ -26,16 +26,11 @@
 import androidx.compose.ui.platform.actionmodecallback.PrimaryTextActionModeCallback
 import androidx.compose.ui.platform.actionmodecallback.TextActionModeCallback
 
-/**
- * Android implementation for [TextToolbar].
- */
+/** Android implementation for [TextToolbar]. */
 internal class AndroidTextToolbar(private val view: View) : TextToolbar {
     private var actionMode: ActionMode? = null
-    private val textActionModeCallback: TextActionModeCallback = TextActionModeCallback(
-        onActionModeDestroy = {
-            actionMode = null
-        }
-    )
+    private val textActionModeCallback: TextActionModeCallback =
+        TextActionModeCallback(onActionModeDestroy = { actionMode = null })
     override var status: TextToolbarStatus = TextToolbarStatus.Hidden
         private set
 
@@ -53,17 +48,16 @@
         textActionModeCallback.onSelectAllRequested = onSelectAllRequested
         if (actionMode == null) {
             status = TextToolbarStatus.Shown
-            actionMode = if (Build.VERSION.SDK_INT >= 23) {
-                TextToolbarHelperMethods.startActionMode(
-                    view,
-                    FloatingTextActionModeCallback(textActionModeCallback),
-                    ActionMode.TYPE_FLOATING
-                )
-            } else {
-                view.startActionMode(
-                    PrimaryTextActionModeCallback(textActionModeCallback)
-                )
-            }
+            actionMode =
+                if (Build.VERSION.SDK_INT >= 23) {
+                    TextToolbarHelperMethods.startActionMode(
+                        view,
+                        FloatingTextActionModeCallback(textActionModeCallback),
+                        ActionMode.TYPE_FLOATING
+                    )
+                } else {
+                    view.startActionMode(PrimaryTextActionModeCallback(textActionModeCallback))
+                }
         } else {
             actionMode?.invalidate()
         }
@@ -77,9 +71,9 @@
 }
 
 /**
- * This class is here to ensure that the classes that use this API will get verified and can be
- * AOT compiled. It is expected that this class will soft-fail verification, but the classes
- * which use this method will pass.
+ * This class is here to ensure that the classes that use this API will get verified and can be AOT
+ * compiled. It is expected that this class will soft-fail verification, but the classes which use
+ * this method will pass.
  */
 @RequiresApi(23)
 internal object TextToolbarHelperMethods {
@@ -90,10 +84,7 @@
         actionModeCallback: ActionMode.Callback,
         type: Int
     ): ActionMode? {
-        return view.startActionMode(
-            actionModeCallback,
-            type
-        )
+        return view.startActionMode(actionModeCallback, type)
     }
 
     @RequiresApi(23)
diff --git a/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/platform/AndroidUiDispatcher.android.kt b/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/platform/AndroidUiDispatcher.android.kt
index 387b2244..4e4f5ce 100644
--- a/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/platform/AndroidUiDispatcher.android.kt
+++ b/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/platform/AndroidUiDispatcher.android.kt
@@ -27,9 +27,9 @@
 
 /**
  * A [CoroutineDispatcher] that will perform dispatch during a [handler] callback or
- * [choreographer]'s animation frame stage, whichever comes first. Use [Main] to obtain
- * a dispatcher for the process's main thread (i.e. the activity thread) or [CurrentThread]
- * to obtain a dispatcher for the current thread.
+ * [choreographer]'s animation frame stage, whichever comes first. Use [Main] to obtain a dispatcher
+ * for the process's main thread (i.e. the activity thread) or [CurrentThread] to obtain a
+ * dispatcher for the current thread.
  */
 // Implementation note: the constructor is private to direct users toward the companion object
 // accessors for the main/current threads. A choreographer must be obtained from its current
@@ -38,10 +38,9 @@
 // not marked as async will adversely affect dispatch behavior but not to the point of
 // incorrectness; more operations would be deferred to the choreographer frame as racing handler
 // messages would wait behind a frame barrier.
-class AndroidUiDispatcher private constructor(
-    val choreographer: Choreographer,
-    private val handler: android.os.Handler
-) : CoroutineDispatcher() {
+class AndroidUiDispatcher
+private constructor(val choreographer: Choreographer, private val handler: android.os.Handler) :
+    CoroutineDispatcher() {
 
     // Guards all properties in this class
     private val lock = Any()
@@ -52,27 +51,26 @@
     private var scheduledTrampolineDispatch = false
     private var scheduledFrameDispatch = false
 
-    private val dispatchCallback = object : Choreographer.FrameCallback, Runnable {
-        override fun run() {
-            performTrampolineDispatch()
-            synchronized(lock) {
-                if (toRunOnFrame.isEmpty()) {
-                    choreographer.removeFrameCallback(this)
-                    scheduledFrameDispatch = false
+    private val dispatchCallback =
+        object : Choreographer.FrameCallback, Runnable {
+            override fun run() {
+                performTrampolineDispatch()
+                synchronized(lock) {
+                    if (toRunOnFrame.isEmpty()) {
+                        choreographer.removeFrameCallback(this)
+                        scheduledFrameDispatch = false
+                    }
                 }
             }
+
+            override fun doFrame(frameTimeNanos: Long) {
+                handler.removeCallbacks(this)
+                performTrampolineDispatch()
+                performFrameDispatch(frameTimeNanos)
+            }
         }
 
-        override fun doFrame(frameTimeNanos: Long) {
-            handler.removeCallbacks(this)
-            performTrampolineDispatch()
-            performFrameDispatch(frameTimeNanos)
-        }
-    }
-
-    private fun nextTask(): Runnable? = synchronized(lock) {
-        toRunTrampolined.removeFirstOrNull()
-    }
+    private fun nextTask(): Runnable? = synchronized(lock) { toRunTrampolined.removeFirstOrNull() }
 
     private fun performTrampolineDispatch() {
         do {
@@ -96,14 +94,15 @@
     }
 
     private fun performFrameDispatch(frameTimeNanos: Long) {
-        val toRun = synchronized(lock) {
-            if (!scheduledFrameDispatch) return
-            scheduledFrameDispatch = false
-            val result = toRunOnFrame
-            toRunOnFrame = spareToRunOnFrame
-            spareToRunOnFrame = result
-            result
-        }
+        val toRun =
+            synchronized(lock) {
+                if (!scheduledFrameDispatch) return
+                scheduledFrameDispatch = false
+                val result = toRunOnFrame
+                toRunOnFrame = spareToRunOnFrame
+                spareToRunOnFrame = result
+                result
+            }
         for (i in 0 until toRun.size) {
             // This callback will not and must not throw, see AndroidUiFrameClock
             toRun[i].doFrame(frameTimeNanos)
@@ -122,14 +121,12 @@
     }
 
     internal fun removeFrameCallback(callback: Choreographer.FrameCallback) {
-        synchronized(lock) {
-            toRunOnFrame.remove(callback)
-        }
+        synchronized(lock) { toRunOnFrame.remove(callback) }
     }
 
     /**
-     * A [MonotonicFrameClock] associated with this [AndroidUiDispatcher]'s [choreographer]
-     * that may be used to await [Choreographer] frame dispatch.
+     * A [MonotonicFrameClock] associated with this [AndroidUiDispatcher]'s [choreographer] that may
+     * be used to await [Choreographer] frame dispatch.
      */
     val frameClock: MonotonicFrameClock = AndroidUiFrameClock(choreographer, this)
 
@@ -153,37 +150,42 @@
          * process's main thread.
          */
         val Main: CoroutineContext by lazy {
-            val dispatcher = AndroidUiDispatcher(
-                if (isMainThread()) Choreographer.getInstance()
-                else runBlocking(Dispatchers.Main) { Choreographer.getInstance() },
-                HandlerCompat.createAsync(Looper.getMainLooper())
-            )
+            val dispatcher =
+                AndroidUiDispatcher(
+                    if (isMainThread()) Choreographer.getInstance()
+                    else runBlocking(Dispatchers.Main) { Choreographer.getInstance() },
+                    HandlerCompat.createAsync(Looper.getMainLooper())
+                )
 
             dispatcher + dispatcher.frameClock
         }
 
         private val currentThread: ThreadLocal<CoroutineContext> =
             object : ThreadLocal<CoroutineContext>() {
-                override fun initialValue(): CoroutineContext = AndroidUiDispatcher(
-                    Choreographer.getInstance(),
-                    HandlerCompat.createAsync(
-                        Looper.myLooper()
-                            ?: error("no Looper on this thread")
-                    )
-                ).let { it + it.frameClock }
+                override fun initialValue(): CoroutineContext =
+                    AndroidUiDispatcher(
+                            Choreographer.getInstance(),
+                            HandlerCompat.createAsync(
+                                Looper.myLooper() ?: error("no Looper on this thread")
+                            )
+                        )
+                        .let { it + it.frameClock }
             }
 
         /**
          * The canonical [CoroutineContext] containing the [AndroidUiDispatcher] and its
-         * [frameClock] for the calling thread. Returns [Main] if accessed from the process's
-         * main thread.
+         * [frameClock] for the calling thread. Returns [Main] if accessed from the process's main
+         * thread.
          *
-         * Throws [IllegalStateException] if the calling thread does not have
-         * both a [Choreographer] and an active [Looper].
+         * Throws [IllegalStateException] if the calling thread does not have both a [Choreographer]
+         * and an active [Looper].
          */
-        val CurrentThread: CoroutineContext get() = if (isMainThread()) Main else {
-            currentThread.get() ?: error("no AndroidUiDispatcher for this thread")
-        }
+        val CurrentThread: CoroutineContext
+            get() =
+                if (isMainThread()) Main
+                else {
+                    currentThread.get() ?: error("no AndroidUiDispatcher for this thread")
+                }
     }
 }
 
diff --git a/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/platform/AndroidUiFrameClock.android.kt b/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/platform/AndroidUiFrameClock.android.kt
index cbb4b7f..35bec5d 100644
--- a/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/platform/AndroidUiFrameClock.android.kt
+++ b/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/platform/AndroidUiFrameClock.android.kt
@@ -21,25 +21,23 @@
 import kotlin.coroutines.coroutineContext
 import kotlinx.coroutines.suspendCancellableCoroutine
 
-class AndroidUiFrameClock internal constructor(
+class AndroidUiFrameClock
+internal constructor(
     val choreographer: Choreographer,
     private val dispatcher: AndroidUiDispatcher?
 ) : androidx.compose.runtime.MonotonicFrameClock {
 
-    constructor(
-        choreographer: Choreographer
-    ) : this(choreographer, null)
+    constructor(choreographer: Choreographer) : this(choreographer, null)
 
-    override suspend fun <R> withFrameNanos(
-        onFrame: (Long) -> R
-    ): R {
-        val uiDispatcher = dispatcher
-            ?: coroutineContext[ContinuationInterceptor] as? AndroidUiDispatcher
+    override suspend fun <R> withFrameNanos(onFrame: (Long) -> R): R {
+        val uiDispatcher =
+            dispatcher ?: coroutineContext[ContinuationInterceptor] as? AndroidUiDispatcher
         return suspendCancellableCoroutine { co ->
             // Important: this callback won't throw, and AndroidUiDispatcher counts on it.
-            val callback = Choreographer.FrameCallback { frameTimeNanos ->
-                co.resumeWith(runCatching { onFrame(frameTimeNanos) })
-            }
+            val callback =
+                Choreographer.FrameCallback { frameTimeNanos ->
+                    co.resumeWith(runCatching { onFrame(frameTimeNanos) })
+                }
 
             // If we're on an AndroidUiDispatcher then we post callback to happen *after*
             // the greedy trampoline dispatch is complete.
diff --git a/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/platform/AndroidUriHandler.android.kt b/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/platform/AndroidUriHandler.android.kt
index 75d3d6e..a6a59c9 100644
--- a/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/platform/AndroidUriHandler.android.kt
+++ b/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/platform/AndroidUriHandler.android.kt
@@ -27,7 +27,7 @@
      * Open given URL in browser
      *
      * @throws IllegalArgumentException when given [uri] is invalid and/or can't be handled by the
-     * system
+     *   system
      */
     override fun openUri(uri: String) {
         try {
diff --git a/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/platform/AndroidViewConfiguration.android.kt b/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/platform/AndroidViewConfiguration.android.kt
index 99ec228..146a0ee 100644
--- a/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/platform/AndroidViewConfiguration.android.kt
+++ b/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/platform/AndroidViewConfiguration.android.kt
@@ -26,9 +26,8 @@
  * A [ViewConfiguration] with Android's default configurations. Derived from
  * [android.view.ViewConfiguration]
  */
-class AndroidViewConfiguration(
-    private val viewConfiguration: android.view.ViewConfiguration
-) : ViewConfiguration {
+class AndroidViewConfiguration(private val viewConfiguration: android.view.ViewConfiguration) :
+    ViewConfiguration {
     override val longPressTimeoutMillis: Long
         get() = android.view.ViewConfiguration.getLongPressTimeout().toLong()
 
@@ -42,21 +41,23 @@
         get() = viewConfiguration.scaledTouchSlop.toFloat()
 
     override val handwritingSlop: Float
-        get() = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.UPSIDE_DOWN_CAKE) {
-            getScaledHandwritingSlop(viewConfiguration)
-        } else {
-            super.handwritingSlop
-        }
+        get() =
+            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.UPSIDE_DOWN_CAKE) {
+                getScaledHandwritingSlop(viewConfiguration)
+            } else {
+                super.handwritingSlop
+            }
 
     override val maximumFlingVelocity: Float
         get() = viewConfiguration.scaledMaximumFlingVelocity.toFloat()
 
     override val handwritingGestureLineMargin: Float
-        get() = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.UPSIDE_DOWN_CAKE) {
-            getScaledHandwritingGestureLineMargin(viewConfiguration)
-        } else {
-            super.handwritingGestureLineMargin
-        }
+        get() =
+            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.UPSIDE_DOWN_CAKE) {
+                getScaledHandwritingGestureLineMargin(viewConfiguration)
+            } else {
+                super.handwritingGestureLineMargin
+            }
 }
 
 @RequiresApi(Build.VERSION_CODES.UPSIDE_DOWN_CAKE)
diff --git a/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/platform/AndroidViewsHandler.android.kt b/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/platform/AndroidViewsHandler.android.kt
index 99a9765..40eb0306 100644
--- a/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/platform/AndroidViewsHandler.android.kt
+++ b/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/platform/AndroidViewsHandler.android.kt
@@ -29,10 +29,9 @@
 import androidx.compose.ui.viewinterop.AndroidViewHolder
 
 /**
- * Used by [AndroidComposeView] to handle the Android [View]s attached to its hierarchy.
- * The [AndroidComposeView] has one direct [AndroidViewsHandler], which is responsible
- * of intercepting [requestLayout]s, [onMeasure]s, [invalidate]s, etc. sent from or towards
- * children.
+ * Used by [AndroidComposeView] to handle the Android [View]s attached to its hierarchy. The
+ * [AndroidComposeView] has one direct [AndroidViewsHandler], which is responsible of intercepting
+ * [requestLayout]s, [onMeasure]s, [invalidate]s, etc. sent from or towards children.
  */
 internal class AndroidViewsHandler(context: Context) : ViewGroup(context) {
     init {
@@ -71,7 +70,7 @@
     // No call to super to avoid invalidating the AndroidComposeView and the handler, and rely on
     // component nodes logic. The layer invalidation will have been already done by the holder.
     @SuppressLint("MissingSuperCall")
-    override fun onDescendantInvalidated(child: View, target: View) { }
+    override fun onDescendantInvalidated(child: View, target: View) {}
 
     override fun invalidateChildInParent(location: IntArray?, dirty: Rect?) = null
 
@@ -104,6 +103,5 @@
 
     // We don't want the AndroidComposeView drawing the holder and its children. All draw
     // calls should come through AndroidViewHolder or ViewLayer.
-    override fun dispatchDraw(canvas: Canvas) {
-    }
+    override fun dispatchDraw(canvas: Canvas) {}
 }
diff --git a/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/platform/ComposeView.android.kt b/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/platform/ComposeView.android.kt
index a9cbda7e..d2ab361 100644
--- a/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/platform/ComposeView.android.kt
+++ b/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/platform/ComposeView.android.kt
@@ -37,26 +37,25 @@
 import java.lang.ref.WeakReference
 
 /**
- * Base class for custom [android.view.View]s implemented using Jetpack Compose UI.
- * Subclasses should implement the [Content] function with the appropriate content.
- * Calls to [addView] and its variants and overloads will fail with [IllegalStateException].
+ * Base class for custom [android.view.View]s implemented using Jetpack Compose UI. Subclasses
+ * should implement the [Content] function with the appropriate content. Calls to [addView] and its
+ * variants and overloads will fail with [IllegalStateException].
  *
- * By default, the composition is disposed according to [ViewCompositionStrategy.Default].
- * Call [disposeComposition] to dispose of the underlying composition earlier, or if the view is
- * never initially attached to a window. (The requirement to dispose of the composition explicitly
- * in the event that the view is never (re)attached is temporary.)
+ * By default, the composition is disposed according to [ViewCompositionStrategy.Default]. Call
+ * [disposeComposition] to dispose of the underlying composition earlier, or if the view is never
+ * initially attached to a window. (The requirement to dispose of the composition explicitly in the
+ * event that the view is never (re)attached is temporary.)
  *
- * [AbstractComposeView] only supports being added into view hierarchies propagating [LifecycleOwner]
- * and [SavedStateRegistryOwner] via [androidx.lifecycle.setViewTreeLifecycleOwner] and
- * [androidx.savedstate.setViewTreeSavedStateRegistryOwner]. In most cases you will already have
+ * [AbstractComposeView] only supports being added into view hierarchies propagating
+ * [LifecycleOwner] and [SavedStateRegistryOwner] via [androidx.lifecycle.setViewTreeLifecycleOwner]
+ * and [androidx.savedstate.setViewTreeSavedStateRegistryOwner]. In most cases you will already have
  * it set up correctly as [androidx.activity.ComponentActivity], [androidx.fragment.app.Fragment]
  * and [androidx.navigation.NavController] will provide the correct values.
  */
-abstract class AbstractComposeView @JvmOverloads constructor(
-    context: Context,
-    attrs: AttributeSet? = null,
-    defStyleAttr: Int = 0
-) : ViewGroup(context, attrs, defStyleAttr) {
+abstract class AbstractComposeView
+@JvmOverloads
+constructor(context: Context, attrs: AttributeSet? = null, defStyleAttr: Int = 0) :
+    ViewGroup(context, attrs, defStyleAttr) {
 
     init {
         clipChildren = false
@@ -64,21 +63,19 @@
     }
 
     /**
-     * The first time we successfully locate this we'll save it here.
-     * If this View moves to the [android.view.ViewOverlay] we won't be able
-     * to find view tree dependencies; this happens when using transition APIs
-     * to animate views out in particular.
+     * The first time we successfully locate this we'll save it here. If this View moves to the
+     * [android.view.ViewOverlay] we won't be able to find view tree dependencies; this happens when
+     * using transition APIs to animate views out in particular.
      *
      * We only ever set this when we're attached to a window.
      */
     private var cachedViewTreeCompositionContext: WeakReference<CompositionContext>? = null
 
     /**
-     * The [getWindowToken] of the window this view was last attached to.
-     * If we become attached to a new window we clear [cachedViewTreeCompositionContext]
-     * so that we might appeal to the (possibly lazily created) [windowRecomposer]
-     * if [findViewTreeCompositionContext] can't locate one instead of using the previous
-     * [cachedViewTreeCompositionContext].
+     * The [getWindowToken] of the window this view was last attached to. If we become attached to a
+     * new window we clear [cachedViewTreeCompositionContext] so that we might appeal to the
+     * (possibly lazily created) [windowRecomposer] if [findViewTreeCompositionContext] can't locate
+     * one instead of using the previous [cachedViewTreeCompositionContext].
      */
     private var previousAttachedWindowToken: IBinder? = null
         set(value) {
@@ -91,8 +88,8 @@
     private var composition: Composition? = null
 
     /**
-     * The explicitly set [CompositionContext] to use as the parent of compositions created
-     * for this view. Set by [setParentCompositionContext].
+     * The explicitly set [CompositionContext] to use as the parent of compositions created for this
+     * view. Set by [setParentCompositionContext].
      *
      * If set to a non-null value [cachedViewTreeCompositionContext] will be cleared.
      */
@@ -117,9 +114,9 @@
         }
 
     /**
-     * Set the [CompositionContext] that should be the parent of this view's composition.
-     * If [parent] is `null` it will be determined automatically from the window the view is
-     * attached to.
+     * Set the [CompositionContext] that should be the parent of this view's composition. If
+     * [parent] is `null` it will be determined automatically from the window the view is attached
+     * to.
      */
     fun setParentCompositionContext(parent: CompositionContext?) {
         parentContext = parent
@@ -132,11 +129,11 @@
         ViewCompositionStrategy.Default.installFor(this)
 
     /**
-     * Set the strategy for managing disposal of this View's internal composition.
-     * Defaults to [ViewCompositionStrategy.Default].
+     * Set the strategy for managing disposal of this View's internal composition. Defaults to
+     * [ViewCompositionStrategy.Default].
      *
-     * This View's composition is a live resource that must be disposed to ensure that
-     * long-lived references to it do not persist
+     * This View's composition is a live resource that must be disposed to ensure that long-lived
+     * references to it do not persist
      *
      * See [ViewCompositionStrategy] for more information.
      */
@@ -146,19 +143,19 @@
     }
 
     /**
-     * If `true`, this View's composition will be created when it becomes attached to a
-     * window for the first time. Defaults to `true`.
+     * If `true`, this View's composition will be created when it becomes attached to a window for
+     * the first time. Defaults to `true`.
      *
-     * Subclasses may choose to override this property to prevent this eager initial composition
-     * in cases where the view's content is not yet ready. Initial composition will still occur
-     * when this view is first measured.
+     * Subclasses may choose to override this property to prevent this eager initial composition in
+     * cases where the view's content is not yet ready. Initial composition will still occur when
+     * this view is first measured.
      */
     protected open val shouldCreateCompositionOnAttachedToWindow: Boolean
         get() = true
 
     /**
-     * Enables the display of visual layout bounds for the Compose UI content of this view.
-     * This is typically configured using the system developer setting for "Show layout bounds."
+     * Enables the display of visual layout bounds for the Compose UI content of this view. This is
+     * typically configured using the system developer setting for "Show layout bounds."
      */
     @OptIn(InternalCoreApi::class)
     @InternalComposeUiApi
@@ -167,28 +164,21 @@
     var showLayoutBounds: Boolean = false
         set(value) {
             field = value
-            getChildAt(0)?.let {
-                (it as Owner).showLayoutBounds = value
-            }
+            getChildAt(0)?.let { (it as Owner).showLayoutBounds = value }
         }
 
     /**
-     * The Jetpack Compose UI content for this view.
-     * Subclasses must implement this method to provide content. Initial composition will
-     * occur when the view becomes attached to a window or when [createComposition] is called,
-     * whichever comes first.
+     * The Jetpack Compose UI content for this view. Subclasses must implement this method to
+     * provide content. Initial composition will occur when the view becomes attached to a window or
+     * when [createComposition] is called, whichever comes first.
      */
-    @Composable
-    @UiComposable
-    abstract fun Content()
+    @Composable @UiComposable abstract fun Content()
 
     /**
-     * Perform initial composition for this view.
-     * Once this method is called or the view becomes attached to a window,
-     * either [disposeComposition] must be called or the
-     * [LifecycleOwner] returned by [findViewTreeLifecycleOwner] must
-     * reach the [Lifecycle.State.DESTROYED] state for the composition to be cleaned up
-     * properly. (This restriction is temporary.)
+     * Perform initial composition for this view. Once this method is called or the view becomes
+     * attached to a window, either [disposeComposition] must be called or the [LifecycleOwner]
+     * returned by [findViewTreeLifecycleOwner] must reach the [Lifecycle.State.DESTROYED] state for
+     * the composition to be cleaned up properly. (This restriction is temporary.)
      *
      * If this method is called when the composition has already been created it has no effect.
      *
@@ -204,6 +194,7 @@
     }
 
     private var creatingComposition = false
+
     private fun checkAddView() {
         if (!creatingComposition) {
             throw UnsupportedOperationException(
@@ -214,50 +205,48 @@
     }
 
     /**
-     * `true` if the [CompositionContext] can be considered to be "alive" for the purposes
-     * of locally caching it in case the view is placed into a ViewOverlay.
-     * [Recomposer]s that are in the [Recomposer.State.ShuttingDown] state or lower should
-     * not be cached or reusedif currently cached, as they will never recompose content.
+     * `true` if the [CompositionContext] can be considered to be "alive" for the purposes of
+     * locally caching it in case the view is placed into a ViewOverlay. [Recomposer]s that are in
+     * the [Recomposer.State.ShuttingDown] state or lower should not be cached or reusedif currently
+     * cached, as they will never recompose content.
      */
     private val CompositionContext.isAlive: Boolean
         get() = this !is Recomposer || currentState.value > Recomposer.State.ShuttingDown
 
     /**
-     * Cache this [CompositionContext] in [cachedViewTreeCompositionContext] if it [isAlive]
-     * and return the [CompositionContext] itself either way.
+     * Cache this [CompositionContext] in [cachedViewTreeCompositionContext] if it [isAlive] and
+     * return the [CompositionContext] itself either way.
      */
     private fun CompositionContext.cacheIfAlive(): CompositionContext = also { context ->
-        context.takeIf { it.isAlive }
-            ?.let { cachedViewTreeCompositionContext = WeakReference(it) }
+        context.takeIf { it.isAlive }?.let { cachedViewTreeCompositionContext = WeakReference(it) }
     }
 
     /**
-     * Determine the correct [CompositionContext] to use as the parent of this view's
-     * composition. This can result in caching a looked-up [CompositionContext] for use
-     * later. See [cachedViewTreeCompositionContext] for more details.
+     * Determine the correct [CompositionContext] to use as the parent of this view's composition.
+     * This can result in caching a looked-up [CompositionContext] for use later. See
+     * [cachedViewTreeCompositionContext] for more details.
      *
      * If [cachedViewTreeCompositionContext] is available but [findViewTreeCompositionContext]
-     * cannot find a parent context, we will use the cached context if present before appealing
-     * to the [windowRecomposer], as [windowRecomposer] can lazily create a recomposer.
-     * If we're reattached to the same window and [findViewTreeCompositionContext] can't find the
-     * context that [windowRecomposer] would install, we might be in the [getOverlay] of some
-     * part of the view hierarchy to animate the disappearance of this and other views. We still
-     * need to be able to compose/recompose in this state without creating a brand new recomposer
-     * to do it, as well as still locate any view tree dependencies.
+     * cannot find a parent context, we will use the cached context if present before appealing to
+     * the [windowRecomposer], as [windowRecomposer] can lazily create a recomposer. If we're
+     * reattached to the same window and [findViewTreeCompositionContext] can't find the context
+     * that [windowRecomposer] would install, we might be in the [getOverlay] of some part of the
+     * view hierarchy to animate the disappearance of this and other views. We still need to be able
+     * to compose/recompose in this state without creating a brand new recomposer to do it, as well
+     * as still locate any view tree dependencies.
      */
-    private fun resolveParentCompositionContext() = parentContext
-        ?: findViewTreeCompositionContext()?.cacheIfAlive()
-        ?: cachedViewTreeCompositionContext?.get()?.takeIf { it.isAlive }
-        ?: windowRecomposer.cacheIfAlive()
+    private fun resolveParentCompositionContext() =
+        parentContext
+            ?: findViewTreeCompositionContext()?.cacheIfAlive()
+            ?: cachedViewTreeCompositionContext?.get()?.takeIf { it.isAlive }
+            ?: windowRecomposer.cacheIfAlive()
 
     @Suppress("DEPRECATION") // Still using ViewGroup.setContent for now
     private fun ensureCompositionCreated() {
         if (composition == null) {
             try {
                 creatingComposition = true
-                composition = setContent(resolveParentCompositionContext()) {
-                    Content()
-                }
+                composition = setContent(resolveParentCompositionContext()) { Content() }
             } finally {
                 creatingComposition = false
             }
@@ -265,9 +254,8 @@
     }
 
     /**
-     * Dispose of the underlying composition and [requestLayout].
-     * A new composition will be created if [createComposition] is called or when needed to
-     * lay out this view.
+     * Dispose of the underlying composition and [requestLayout]. A new composition will be created
+     * if [createComposition] is called or when needed to lay out this view.
      */
     fun disposeComposition() {
         composition?.dispose()
@@ -276,10 +264,11 @@
     }
 
     /**
-     * `true` if this View is host to an active Compose UI composition.
-     * An active composition may consume resources.
+     * `true` if this View is host to an active Compose UI composition. An active composition may
+     * consume resources.
      */
-    val hasComposition: Boolean get() = composition != null
+    val hasComposition: Boolean
+        get() = composition != null
 
     override fun onAttachedToWindow() {
         super.onAttachedToWindow()
@@ -326,12 +315,13 @@
         right: Int,
         bottom: Int
     ) {
-        getChildAt(0)?.layout(
-            paddingLeft,
-            paddingTop,
-            right - left - paddingRight,
-            bottom - top - paddingBottom
-        )
+        getChildAt(0)
+            ?.layout(
+                paddingLeft,
+                paddingTop,
+                right - left - paddingRight,
+                bottom - top - paddingBottom
+            )
     }
 
     override fun onRtlPropertiesChanged(layoutDirection: Int) {
@@ -410,25 +400,24 @@
 }
 
 /**
- * A [android.view.View] that can host Jetpack Compose UI content.
- * Use [setContent] to supply the content composable function for the view.
+ * A [android.view.View] that can host Jetpack Compose UI content. Use [setContent] to supply the
+ * content composable function for the view.
  *
- * By default, the composition is disposed according to [ViewCompositionStrategy.Default].
- * Call [disposeComposition] to dispose of the underlying composition earlier, or if the view is
- * never initially attached to a window. (The requirement to dispose of the composition explicitly
- * in the event that the view is never (re)attached is temporary.)
+ * By default, the composition is disposed according to [ViewCompositionStrategy.Default]. Call
+ * [disposeComposition] to dispose of the underlying composition earlier, or if the view is never
+ * initially attached to a window. (The requirement to dispose of the composition explicitly in the
+ * event that the view is never (re)attached is temporary.)
  *
- * [ComposeView] only supports being added into view hierarchies propagating [LifecycleOwner]
- * and [SavedStateRegistryOwner] via [androidx.lifecycle.setViewTreeLifecycleOwner] and
- * [androidx.savedstate.setViewTreeSavedStateRegistryOwner]. In most cases you will already have
- * it set up correctly as [androidx.activity.ComponentActivity], [androidx.fragment.app.Fragment]
- * and [androidx.navigation.NavController] will provide the correct values.
+ * [ComposeView] only supports being added into view hierarchies propagating [LifecycleOwner] and
+ * [SavedStateRegistryOwner] via [androidx.lifecycle.setViewTreeLifecycleOwner] and
+ * [androidx.savedstate.setViewTreeSavedStateRegistryOwner]. In most cases you will already have it
+ * set up correctly as [androidx.activity.ComponentActivity], [androidx.fragment.app.Fragment] and
+ * [androidx.navigation.NavController] will provide the correct values.
  */
-class ComposeView @JvmOverloads constructor(
-    context: Context,
-    attrs: AttributeSet? = null,
-    defStyleAttr: Int = 0
-) : AbstractComposeView(context, attrs, defStyleAttr) {
+class ComposeView
+@JvmOverloads
+constructor(context: Context, attrs: AttributeSet? = null, defStyleAttr: Int = 0) :
+    AbstractComposeView(context, attrs, defStyleAttr) {
 
     private val content = mutableStateOf<(@Composable () -> Unit)?>(null)
 
@@ -446,9 +435,9 @@
     }
 
     /**
-     * Set the Jetpack Compose UI content for this view.
-     * Initial composition will occur when the view becomes attached to a window or when
-     * [createComposition] is called, whichever comes first.
+     * Set the Jetpack Compose UI content for this view. Initial composition will occur when the
+     * view becomes attached to a window or when [createComposition] is called, whichever comes
+     * first.
      */
     fun setContent(content: @Composable () -> Unit) {
         shouldCreateCompositionOnAttachedToWindow = true
diff --git a/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/platform/DeviceRenderNode.android.kt b/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/platform/DeviceRenderNode.android.kt
index dd01402..47ad0f7 100644
--- a/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/platform/DeviceRenderNode.android.kt
+++ b/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/platform/DeviceRenderNode.android.kt
@@ -24,8 +24,8 @@
 import androidx.compose.ui.graphics.RenderEffect
 
 /**
- * RenderNode on Q+ and RenderNode on M-P devices have different APIs. This interface
- * unifies the access so that [RenderNodeLayer] can be used for both.
+ * RenderNode on Q+ and RenderNode on M-P devices have different APIs. This interface unifies the
+ * access so that [RenderNodeLayer] can be used for both.
  */
 internal interface DeviceRenderNode {
     val uniqueId: Long
@@ -56,23 +56,27 @@
     var compositingStrategy: CompositingStrategy
 
     fun setOutline(outline: Outline?)
+
     fun setPosition(left: Int, top: Int, right: Int, bottom: Int): Boolean
+
     fun offsetLeftAndRight(offset: Int)
+
     fun offsetTopAndBottom(offset: Int)
-    fun record(
-        canvasHolder: CanvasHolder,
-        clipPath: Path?,
-        drawBlock: (Canvas) -> Unit
-    )
+
+    fun record(canvasHolder: CanvasHolder, clipPath: Path?, drawBlock: (Canvas) -> Unit)
+
     fun getMatrix(matrix: android.graphics.Matrix)
+
     fun getInverseMatrix(matrix: android.graphics.Matrix)
+
     fun drawInto(canvas: android.graphics.Canvas)
+
     fun setHasOverlappingRendering(hasOverlappingRendering: Boolean): Boolean
 
     /**
-     * Debugging method used to dump the underlying parameters of the backing RenderNode
-     * on the platform. This is used for testing purposes to avoid having to query the
-     * RenderNode directly and potentially crashing on certain multiplatform configurations
+     * Debugging method used to dump the underlying parameters of the backing RenderNode on the
+     * platform. This is used for testing purposes to avoid having to query the RenderNode directly
+     * and potentially crashing on certain multiplatform configurations
      */
     fun dumpRenderNodeData(): DeviceRenderNodeData
 
@@ -80,12 +84,12 @@
 }
 
 /**
- * Data class representing the actual parameters of the platform RenderNode in
- * the [DeviceRenderNode] implementation. Before RenderNode was made public API, the parameter
- * inputs were inconsistent across platform versions. This class is used to verify the result
- * of the internal RenderNode values for testing purposes based on the consistent inputs provided
- * as part of the Layer API. For example, [cameraDistance] is negative on RenderNode implementations
- * prior to Q.
+ * Data class representing the actual parameters of the platform RenderNode in the
+ * [DeviceRenderNode] implementation. Before RenderNode was made public API, the parameter inputs
+ * were inconsistent across platform versions. This class is used to verify the result of the
+ * internal RenderNode values for testing purposes based on the consistent inputs provided as part
+ * of the Layer API. For example, [cameraDistance] is negative on RenderNode implementations prior
+ * to Q.
  */
 internal data class DeviceRenderNodeData(
     val uniqueId: Long,
diff --git a/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/platform/DisposableSaveableStateRegistry.android.kt b/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/platform/DisposableSaveableStateRegistry.android.kt
index e029bb1..02dd53b 100644
--- a/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/platform/DisposableSaveableStateRegistry.android.kt
+++ b/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/platform/DisposableSaveableStateRegistry.android.kt
@@ -35,9 +35,7 @@
 import androidx.savedstate.SavedStateRegistryOwner
 import java.io.Serializable
 
-/**
- * Creates [DisposableSaveableStateRegistry] associated with these [view] and [owner].
- */
+/** Creates [DisposableSaveableStateRegistry] associated with these [view] and [owner]. */
 internal fun DisposableSaveableStateRegistry(
     view: View,
     owner: SavedStateRegistryOwner
@@ -60,10 +58,9 @@
  *
  * To provide a namespace we require unique [id]. We can't use the default way of doing it when we
  * have unique id on [AbstractComposeView] because we dynamically create [AbstractComposeView]s and
- * there is no way to have a unique id given there are could be any number of
- * [AbstractComposeView]s inside the same Activity. If we use [View.generateViewId]
- * this id will not survive Activity recreation. But it is reasonable to ask our users to have an
- * unique id on [AbstractComposeView].
+ * there is no way to have a unique id given there are could be any number of [AbstractComposeView]s
+ * inside the same Activity. If we use [View.generateViewId] this id will not survive Activity
+ * recreation. But it is reasonable to ask our users to have an unique id on [AbstractComposeView].
  */
 internal fun DisposableSaveableStateRegistry(
     id: String,
@@ -75,21 +72,20 @@
     val bundle = androidxRegistry.consumeRestoredStateForKey(key)
     val restored: Map<String, List<Any?>>? = bundle?.toMap()
 
-    val saveableStateRegistry = SaveableStateRegistry(restored) {
-        canBeSavedToBundle(it)
-    }
-    val registered = try {
-        androidxRegistry.registerSavedStateProvider(key) {
-            saveableStateRegistry.performSave().toBundle()
+    val saveableStateRegistry = SaveableStateRegistry(restored) { canBeSavedToBundle(it) }
+    val registered =
+        try {
+            androidxRegistry.registerSavedStateProvider(key) {
+                saveableStateRegistry.performSave().toBundle()
+            }
+            true
+        } catch (ignore: IllegalArgumentException) {
+            // this means there are two AndroidComposeViews composed into different parents with the
+            // same view id. currently we will just not save/restore state for the second
+            // AndroidComposeView.
+            // TODO: we should verify our strategy for such cases and improve it. b/162397322
+            false
         }
-        true
-    } catch (ignore: IllegalArgumentException) {
-        // this means there are two AndroidComposeViews composed into different parents with the
-        // same view id. currently we will just not save/restore state for the second
-        // AndroidComposeView.
-        // TODO: we should verify our strategy for such cases and improve it. b/162397322
-        false
-    }
     return DisposableSaveableStateRegistry(saveableStateRegistry) {
         if (registered) {
             androidxRegistry.unregisterSavedStateProvider(key)
@@ -97,9 +93,7 @@
     }
 }
 
-/**
- * [SaveableStateRegistry] which can be disposed using [dispose].
- */
+/** [SaveableStateRegistry] which can be disposed using [dispose]. */
 internal class DisposableSaveableStateRegistry(
     saveableStateRegistry: SaveableStateRegistry,
     private val onDispose: () -> Unit
@@ -110,15 +104,14 @@
     }
 }
 
-/**
- * Checks that [value] can be stored inside [Bundle].
- */
+/** Checks that [value] can be stored inside [Bundle]. */
 private fun canBeSavedToBundle(value: Any): Boolean {
     // SnapshotMutableStateImpl is Parcelable, but we do extra checks
     if (value is SnapshotMutableState<*>) {
-        if (value.policy === neverEqualPolicy<Any?>() ||
-            value.policy === structuralEqualityPolicy<Any?>() ||
-            value.policy === referentialEqualityPolicy<Any?>()
+        if (
+            value.policy === neverEqualPolicy<Any?>() ||
+                value.policy === structuralEqualityPolicy<Any?>() ||
+                value.policy === referentialEqualityPolicy<Any?>()
         ) {
             val stateValue = value.value
             return if (stateValue == null) true else canBeSavedToBundle(stateValue)
@@ -147,24 +140,24 @@
  *
  * This classes implement Serializable:
  * - Arrays (DoubleArray, BooleanArray, IntArray, LongArray, ByteArray, FloatArray, ShortArray,
- * CharArray, Array<Parcelable, Array<String>)
+ *   CharArray, Array<Parcelable, Array<String>)
  * - ArrayList
- * - Primitives (Boolean, Int, Long, Double, Float, Byte, Short, Char) will be boxed when casted
- * to Any, and all the boxed classes implements Serializable.
- * This class implements Parcelable:
+ * - Primitives (Boolean, Int, Long, Double, Float, Byte, Short, Char) will be boxed when casted to
+ *   Any, and all the boxed classes implements Serializable. This class implements Parcelable:
  * - Bundle
  *
  * Note: it is simplified copy of the array from SavedStateHandle (lifecycle-viewmodel-savedstate).
  */
-private val AcceptableClasses = arrayOf(
-    Serializable::class.java,
-    Parcelable::class.java,
-    String::class.java,
-    SparseArray::class.java,
-    Binder::class.java,
-    Size::class.java,
-    SizeF::class.java
-)
+private val AcceptableClasses =
+    arrayOf(
+        Serializable::class.java,
+        Parcelable::class.java,
+        String::class.java,
+        SparseArray::class.java,
+        Binder::class.java,
+        Size::class.java,
+        SizeF::class.java
+    )
 
 @Suppress("DEPRECATION")
 private fun Bundle.toMap(): Map<String, List<Any?>>? {
@@ -180,10 +173,7 @@
     val bundle = Bundle()
     forEach { (key, list) ->
         val arrayList = if (list is ArrayList<Any?>) list else ArrayList(list)
-        bundle.putParcelableArrayList(
-            key,
-            arrayList as ArrayList<Parcelable?>
-        )
+        bundle.putParcelableArrayList(key, arrayList as ArrayList<Parcelable?>)
     }
     return bundle
 }
diff --git a/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/platform/GlobalSnapshotManager.android.kt b/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/platform/GlobalSnapshotManager.android.kt
index a328e1d..adc5219 100644
--- a/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/platform/GlobalSnapshotManager.android.kt
+++ b/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/platform/GlobalSnapshotManager.android.kt
@@ -25,15 +25,15 @@
 import kotlinx.coroutines.launch
 
 /**
- * Platform-specific mechanism for starting a monitor of global snapshot state writes
- * in order to schedule the periodic dispatch of snapshot apply notifications.
- * This process should remain platform-specific; it is tied to the threading and update model of
- * a particular platform and framework target.
+ * Platform-specific mechanism for starting a monitor of global snapshot state writes in order to
+ * schedule the periodic dispatch of snapshot apply notifications. This process should remain
+ * platform-specific; it is tied to the threading and update model of a particular platform and
+ * framework target.
  *
  * Composition bootstrapping mechanisms for a particular platform/framework should call
- * [ensureStarted] during setup to initialize periodic global snapshot notifications.
- * For Android, these notifications are always sent on [AndroidUiDispatcher.Main]. Other platforms
- * may establish different policies for these notifications.
+ * [ensureStarted] during setup to initialize periodic global snapshot notifications. For Android,
+ * these notifications are always sent on [AndroidUiDispatcher.Main]. Other platforms may establish
+ * different policies for these notifications.
  */
 internal object GlobalSnapshotManager {
     private val started = AtomicBoolean(false)
diff --git a/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/platform/GraphicsLayerOwnerLayer.android.kt b/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/platform/GraphicsLayerOwnerLayer.android.kt
index a4ae829..8c69b20 100644
--- a/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/platform/GraphicsLayerOwnerLayer.android.kt
+++ b/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/platform/GraphicsLayerOwnerLayer.android.kt
@@ -76,8 +76,8 @@
     private var transformOrigin: TransformOrigin = TransformOrigin.Center
     private var outline: Outline? = null
     /**
-     * Optional paint used when the RenderNode is rendered on a software backed
-     * canvas and is somewhat transparent (i.e. alpha less than 1.0f)
+     * Optional paint used when the RenderNode is rendered on a software backed canvas and is
+     * somewhat transparent (i.e. alpha less than 1.0f)
      */
     private var softwareLayerPaint: Paint? = null
 
@@ -136,10 +136,11 @@
             if (transformOrigin == TransformOrigin.Center) {
                 graphicsLayer.pivotOffset = Offset.Unspecified
             } else {
-                graphicsLayer.pivotOffset = Offset(
-                    transformOrigin.pivotFractionX * size.width,
-                    transformOrigin.pivotFractionY * size.height
-                )
+                graphicsLayer.pivotOffset =
+                    Offset(
+                        transformOrigin.pivotFractionX * size.width,
+                        transformOrigin.pivotFractionY * size.height
+                    )
             }
         }
         if (maybeChangedFields and Fields.Clip != 0) {
@@ -149,12 +150,13 @@
             graphicsLayer.renderEffect = scope.renderEffect
         }
         if (maybeChangedFields and Fields.CompositingStrategy != 0) {
-            graphicsLayer.compositingStrategy = when (scope.compositingStrategy) {
-                OldCompositingStrategy.Auto -> CompositingStrategy.Auto
-                OldCompositingStrategy.Offscreen -> CompositingStrategy.Offscreen
-                OldCompositingStrategy.ModulateAlpha -> CompositingStrategy.ModulateAlpha
-                else -> throw IllegalStateException("Not supported composition strategy")
-            }
+            graphicsLayer.compositingStrategy =
+                when (scope.compositingStrategy) {
+                    OldCompositingStrategy.Auto -> CompositingStrategy.Auto
+                    OldCompositingStrategy.Offscreen -> CompositingStrategy.Offscreen
+                    OldCompositingStrategy.ModulateAlpha -> CompositingStrategy.ModulateAlpha
+                    else -> throw IllegalStateException("Not supported composition strategy")
+                }
         }
 
         var outlineChanged = false
@@ -233,10 +235,11 @@
     override fun updateDisplayList() {
         if (isDirty) {
             if (transformOrigin != TransformOrigin.Center && graphicsLayer.size != size) {
-                graphicsLayer.pivotOffset = Offset(
-                    transformOrigin.pivotFractionX * size.width,
-                    transformOrigin.pivotFractionY * size.height
-                )
+                graphicsLayer.pivotOffset =
+                    Offset(
+                        transformOrigin.pivotFractionX * size.width,
+                        transformOrigin.pivotFractionY * size.height
+                    )
             }
             graphicsLayer.record(density, layoutDirection, size, recordLambda)
             isDirty = false
@@ -292,9 +295,10 @@
         drawBlock: (canvas: Canvas, parentLayer: GraphicsLayer?) -> Unit,
         invalidateParentLayer: () -> Unit
     ) {
-        val context = requireNotNull(context) {
-            "currently reuse is only supported when we manage the layer lifecycle"
-        }
+        val context =
+            requireNotNull(context) {
+                "currently reuse is only supported when we manage the layer lifecycle"
+            }
 
         // recreate a layer
         graphicsLayer = context.createGraphicsLayer()
@@ -344,20 +348,26 @@
         }
     }
 
-    private fun updateMatrix() = with(graphicsLayer) {
-        val (x, y) = if (pivotOffset.isUnspecified) {
-            this@GraphicsLayerOwnerLayer.size.toSize().center
-        } else {
-            pivotOffset
-        }
+    private fun updateMatrix() =
+        with(graphicsLayer) {
+            val (x, y) =
+                if (pivotOffset.isUnspecified) {
+                    this@GraphicsLayerOwnerLayer.size.toSize().center
+                } else {
+                    pivotOffset
+                }
 
-        matrixCache.resetToPivotedTransform(
-            x, y,
-            translationX, translationY, 1.0f,
-            rotationX,
-            rotationY,
-            rotationZ,
-            scaleX, scaleY
-        )
-    }
+            matrixCache.resetToPivotedTransform(
+                x,
+                y,
+                translationX,
+                translationY,
+                1.0f,
+                rotationX,
+                rotationY,
+                rotationZ,
+                scaleX,
+                scaleY
+            )
+        }
 }
diff --git a/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/platform/LayerMatrixCache.android.kt b/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/platform/LayerMatrixCache.android.kt
index 97f9ad4..dd372bc 100644
--- a/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/platform/LayerMatrixCache.android.kt
+++ b/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/platform/LayerMatrixCache.android.kt
@@ -24,9 +24,9 @@
  * Helper class to cache a [Matrix] and inverse [Matrix], allowing the instance to be reused until
  * the Layer's properties have changed, causing it to call [invalidate].
  *
- * This allows us to avoid repeated calls to [AndroidMatrix.getValues], which calls
- * an expensive native method (nGetValues). If we know the matrix hasn't changed, we can just
- * re-use it without needing to read and update values.
+ * This allows us to avoid repeated calls to [AndroidMatrix.getValues], which calls an expensive
+ * native method (nGetValues). If we know the matrix hasn't changed, we can just re-use it without
+ * needing to read and update values.
  */
 internal class LayerMatrixCache<T>(
     private val getMatrix: (target: T, matrix: AndroidMatrix) -> Unit
@@ -42,8 +42,8 @@
 
     /**
      * Ensures that the internal matrix will be updated next time [calculateMatrix] or
-     * [calculateInverseMatrix] is called - this should be called when something that will
-     * change the matrix calculation has happened.
+     * [calculateInverseMatrix] is called - this should be called when something that will change
+     * the matrix calculation has happened.
      */
     fun invalidate() {
         isDirty = true
@@ -54,16 +54,12 @@
      * Returns the cached [Matrix], updating it if required (if [invalidate] was previously called).
      */
     fun calculateMatrix(target: T): Matrix {
-        val matrix = matrixCache ?: Matrix().also {
-            matrixCache = it
-        }
+        val matrix = matrixCache ?: Matrix().also { matrixCache = it }
         if (!isDirty) {
             return matrix
         }
 
-        val cachedMatrix = androidMatrixCache ?: AndroidMatrix().also {
-            androidMatrixCache = it
-        }
+        val cachedMatrix = androidMatrixCache ?: AndroidMatrix().also { androidMatrixCache = it }
 
         getMatrix(target, cachedMatrix)
 
@@ -84,9 +80,7 @@
      * when scaling is 0.
      */
     fun calculateInverseMatrix(target: T): Matrix? {
-        val matrix = inverseMatrixCache ?: Matrix().also {
-            inverseMatrixCache = it
-        }
+        val matrix = inverseMatrixCache ?: Matrix().also { inverseMatrixCache = it }
         if (isInverseDirty) {
             val normalMatrix = calculateMatrix(target)
             isInverseValid = normalMatrix.invertTo(matrix)
diff --git a/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/platform/NestedScrollInteropConnection.android.kt b/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/platform/NestedScrollInteropConnection.android.kt
index d579246..e135cca 100644
--- a/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/platform/NestedScrollInteropConnection.android.kt
+++ b/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/platform/NestedScrollInteropConnection.android.kt
@@ -34,20 +34,18 @@
 import kotlin.math.floor
 
 /**
- * Adapts nested scroll from View to Compose. This class is used by [ComposeView] to bridge
- * nested scrolling across View and Compose. It acts as both:
+ * Adapts nested scroll from View to Compose. This class is used by [ComposeView] to bridge nested
+ * scrolling across View and Compose. It acts as both:
  * 1) [androidx.core.view.NestedScrollingChild3] by using an instance of
- * [NestedScrollingChildHelper] to dispatch scroll deltas up to a consuming parent on the view side.
+ *    [NestedScrollingChildHelper] to dispatch scroll deltas up to a consuming parent on the view
+ *    side.
  * 2) [NestedScrollingChildHelper] by implementing this interface it should be able to receive
- * deltas from dispatching children on the Compose side.
+ *    deltas from dispatching children on the Compose side.
  */
-internal class NestedScrollInteropConnection(
-    private val view: View
-) : NestedScrollConnection {
+internal class NestedScrollInteropConnection(private val view: View) : NestedScrollConnection {
 
-    private val nestedScrollChildHelper = NestedScrollingChildHelper(view).apply {
-        isNestedScrollingEnabled = true
-    }
+    private val nestedScrollChildHelper =
+        NestedScrollingChildHelper(view).apply { isNestedScrollingEnabled = true }
 
     private val consumedScrollCache = IntArray(2)
 
@@ -59,11 +57,7 @@
 
     override fun onPreScroll(available: Offset, source: NestedScrollSource): Offset {
         // Using the return of startNestedScroll to determine if nested scrolling will happen.
-        if (nestedScrollChildHelper.startNestedScroll(
-                available.scrollAxes,
-                source.toViewType()
-            )
-        ) {
+        if (nestedScrollChildHelper.startNestedScroll(available.scrollAxes, source.toViewType())) {
             // reuse
             consumedScrollCache.fill(0)
 
@@ -87,11 +81,7 @@
         source: NestedScrollSource
     ): Offset {
         // Using the return of startNestedScroll to determine if nested scrolling will happen.
-        if (nestedScrollChildHelper.startNestedScroll(
-                available.scrollAxes,
-                source.toViewType()
-            )
-        ) {
+        if (nestedScrollChildHelper.startNestedScroll(available.scrollAxes, source.toViewType())) {
             consumedScrollCache.fill(0)
 
             nestedScrollChildHelper.dispatchNestedScroll(
@@ -112,15 +102,17 @@
 
     override suspend fun onPreFling(available: Velocity): Velocity {
 
-        val result = if (nestedScrollChildHelper.dispatchNestedPreFling(
-                available.x.toViewVelocity(),
-                available.y.toViewVelocity(),
-            )
-        ) {
-            available
-        } else {
-            Velocity.Zero
-        }
+        val result =
+            if (
+                nestedScrollChildHelper.dispatchNestedPreFling(
+                    available.x.toViewVelocity(),
+                    available.y.toViewVelocity(),
+                )
+            ) {
+                available
+            } else {
+                Velocity.Zero
+            }
 
         interruptOngoingScrolls()
 
@@ -128,16 +120,18 @@
     }
 
     override suspend fun onPostFling(consumed: Velocity, available: Velocity): Velocity {
-        val result = if (nestedScrollChildHelper.dispatchNestedFling(
-                available.x.toViewVelocity(),
-                available.y.toViewVelocity(),
-                true
-            )
-        ) {
-            available
-        } else {
-            Velocity.Zero
-        }
+        val result =
+            if (
+                nestedScrollChildHelper.dispatchNestedFling(
+                    available.x.toViewVelocity(),
+                    available.y.toViewVelocity(),
+                    true
+                )
+            ) {
+                available
+            } else {
+                Velocity.Zero
+            }
 
         interruptOngoingScrolls()
 
@@ -173,25 +167,28 @@
  * conversions.
  */
 private fun toOffset(consumed: IntArray, available: Offset): Offset {
-    val offsetX = if (available.x >= 0) {
-        consumed[0].reverseAxis().coerceAtMost(available.x)
-    } else {
-        consumed[0].reverseAxis().coerceAtLeast(available.x)
-    }
+    val offsetX =
+        if (available.x >= 0) {
+            consumed[0].reverseAxis().coerceAtMost(available.x)
+        } else {
+            consumed[0].reverseAxis().coerceAtLeast(available.x)
+        }
 
-    val offsetY = if (available.y >= 0) {
-        consumed[1].reverseAxis().coerceAtMost(available.y)
-    } else {
-        consumed[1].reverseAxis().coerceAtLeast(available.y)
-    }
+    val offsetY =
+        if (available.y >= 0) {
+            consumed[1].reverseAxis().coerceAtMost(available.y)
+        } else {
+            consumed[1].reverseAxis().coerceAtLeast(available.y)
+        }
 
     return Offset(offsetX, offsetY)
 }
 
-private fun NestedScrollSource.toViewType(): Int = when (this) {
-    NestedScrollSource.UserInput -> TYPE_TOUCH
-    else -> TYPE_NON_TOUCH
-}
+private fun NestedScrollSource.toViewType(): Int =
+    when (this) {
+        NestedScrollSource.UserInput -> TYPE_TOUCH
+        else -> TYPE_NON_TOUCH
+    }
 
 // TODO (levima) Maybe use a more accurate threshold?
 private const val ScrollingAxesThreshold = 0.5f
@@ -213,12 +210,11 @@
     }
 
 /**
- * Create and [remember] the [NestedScrollConnection] that enables Nested Scroll Interop
- * between a View parent that implements [androidx.core.view.NestedScrollingParent3] and a
- * Compose child. This should be used in conjunction with a
- * [androidx.compose.ui.input.nestedscroll.nestedScroll] modifier. Nested Scroll is enabled by
- * default on the compose side and you can use this connection to enable both nested scroll on the
- * view side and to add glue logic between View and compose.
+ * Create and [remember] the [NestedScrollConnection] that enables Nested Scroll Interop between a
+ * View parent that implements [androidx.core.view.NestedScrollingParent3] and a Compose child. This
+ * should be used in conjunction with a [androidx.compose.ui.input.nestedscroll.nestedScroll]
+ * modifier. Nested Scroll is enabled by default on the compose side and you can use this connection
+ * to enable both nested scroll on the view side and to add glue logic between View and compose.
  *
  * Note that this only covers the use case where a cooperating parent is used. A cooperating parent
  * is one that implements NestedScrollingParent3, a key layout that does that is
@@ -227,12 +223,10 @@
  * @param hostView The View that hosts the compose scrollable, this is usually a ComposeView.
  *
  * Learn how to enable nested scroll interop:
- * @sample androidx.compose.ui.samples.ComposeInCooperatingViewNestedScrollInteropSample
  *
+ * @sample androidx.compose.ui.samples.ComposeInCooperatingViewNestedScrollInteropSample
  */
 @Composable
 fun rememberNestedScrollInteropConnection(
     hostView: View = LocalView.current
-): NestedScrollConnection = remember(hostView) {
-    NestedScrollInteropConnection(hostView)
-}
+): NestedScrollConnection = remember(hostView) { NestedScrollInteropConnection(hostView) }
diff --git a/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/platform/OutlineResolver.android.kt b/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/platform/OutlineResolver.android.kt
index 30d26a5..9f26185 100644
--- a/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/platform/OutlineResolver.android.kt
+++ b/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/platform/OutlineResolver.android.kt
@@ -30,74 +30,61 @@
 import androidx.compose.ui.graphics.asAndroidPath
 import androidx.compose.ui.util.fastRoundToInt
 
-/**
- * Resolves the [AndroidOutline] from the [Outline] of an [androidx.compose.ui.node.OwnedLayer].
- */
+/** Resolves the [AndroidOutline] from the [Outline] of an [androidx.compose.ui.node.OwnedLayer]. */
 internal class OutlineResolver {
 
     /**
-     * Flag to determine if the shape specified on the outline is supported.
-     * On older API levels, concave shapes are not allowed
+     * Flag to determine if the shape specified on the outline is supported. On older API levels,
+     * concave shapes are not allowed
      */
     private var isSupportedOutline = true
 
-    /**
-     * The Android Outline that is used in the layer.
-     */
+    /** The Android Outline that is used in the layer. */
     private val cachedOutline = AndroidOutline().apply { alpha = 1f }
 
-    /**
-     * The [Outline] of the Layer.
-     */
+    /** The [Outline] of the Layer. */
     private var outline: Outline? = null
 
     /**
-     * Asymmetric rounded rectangles need to use a Path. This caches that Path so that
-     * a new one doesn't have to be generated each time.
+     * Asymmetric rounded rectangles need to use a Path. This caches that Path so that a new one
+     * doesn't have to be generated each time.
      */
     // TODO(andreykulikov): Make Outline API reuse the Path when generating.
     private var cachedRrectPath: Path? = null // for temporary allocation in rounded rects
 
     /**
-     * The outline Path when a non-conforming (rect or symmetric rounded rect) Outline
-     * is used. This Path is necessary when [usePathForClip] is true to indicate the
-     * Path to clip in [clipPath].
+     * The outline Path when a non-conforming (rect or symmetric rounded rect) Outline is used. This
+     * Path is necessary when [usePathForClip] is true to indicate the Path to clip in [clipPath].
      */
     private var outlinePath: Path? = null
 
     /**
-     * True when there's been an update that caused a change in the path and the Outline
-     * has to be reevaluated.
+     * True when there's been an update that caused a change in the path and the Outline has to be
+     * reevaluated.
      */
     internal var cacheIsDirty = false
         private set
 
     /**
-     * True when Outline cannot clip the content and the path should be used instead.
-     * This is when an asymmetric rounded rect or general Path is used in the outline.
-     * This is false when a Rect or a symmetric RoundRect is used in the outline.
+     * True when Outline cannot clip the content and the path should be used instead. This is when
+     * an asymmetric rounded rect or general Path is used in the outline. This is false when a Rect
+     * or a symmetric RoundRect is used in the outline.
      */
     private var usePathForClip = false
 
-    /**
-     * Scratch path used for manually clipping in software backed canvases
-     */
+    /** Scratch path used for manually clipping in software backed canvases */
     private var tmpPath: Path? = null
 
-    /**
-     * Scratch [RoundRect] used for manually clipping round rects in software backed canvases
-     */
+    /** Scratch [RoundRect] used for manually clipping round rects in software backed canvases */
     private var tmpRoundRect: RoundRect? = null
 
     /**
-     * Radius value used for symmetric rounded shapes. For rectangular or path based outlines
-     * this value is 0f
+     * Radius value used for symmetric rounded shapes. For rectangular or path based outlines this
+     * value is 0f
      */
     private var roundedCornerRadius: Float = 0f
 
-    /**
-     * Returns the Android Outline to be used in the layer.
-     */
+    /** Returns the Android Outline to be used in the layer. */
     val androidOutline: AndroidOutline?
         get() {
             updateCache()
@@ -105,20 +92,20 @@
         }
 
     /**
-     * Determines if the particular outline shape or path supports clipping.
-     * True for rect or symmetrical round rects.
-     * This method is used to determine if the framework can handle clipping to the outline
-     * for a particular shape. If not, then the clipped path must be applied directly to the canvas.
+     * Determines if the particular outline shape or path supports clipping. True for rect or
+     * symmetrical round rects. This method is used to determine if the framework can handle
+     * clipping to the outline for a particular shape. If not, then the clipped path must be applied
+     * directly to the canvas.
      */
     val outlineClipSupported: Boolean
         get() = !usePathForClip
 
     /**
-     * Returns the path used to manually clip regardless if the layer supports clipping or not.
-     * In some cases (i.e. software rendering) clipping must be done manually.
-     * Consumers should query whether or not the layer will handle clipping with
-     * [outlineClipSupported] first before applying the clip manually.
-     * Or when rendering in software, the clip path provided here must always be clipped manually.
+     * Returns the path used to manually clip regardless if the layer supports clipping or not. In
+     * some cases (i.e. software rendering) clipping must be done manually. Consumers should query
+     * whether or not the layer will handle clipping with [outlineClipSupported] first before
+     * applying the clip manually. Or when rendering in software, the clip path provided here must
+     * always be clipped manually.
      */
     val clipPath: Path?
         get() {
@@ -127,29 +114,24 @@
         }
 
     /**
-     * Returns the top left offset for a rectangular, or rounded rect outline (regardless if it
-     * is symmetric or asymmetric)
-     * For path based outlines this returns [Offset.Zero]
+     * Returns the top left offset for a rectangular, or rounded rect outline (regardless if it is
+     * symmetric or asymmetric) For path based outlines this returns [Offset.Zero]
      */
     private var rectTopLeft: Offset = Offset.Zero
 
     /**
-     * Returns the size for a rectangular, or rounded rect outline (regardless if it
-     * is symmetric or asymmetric)
+     * Returns the size for a rectangular, or rounded rect outline (regardless if it is symmetric or
+     * asymmetric)
      */
     private var rectSize: Size = Size.Zero
 
-    /**
-     * True when we are going to clip or have a non-zero elevation for shadows.
-     */
+    /** True when we are going to clip or have a non-zero elevation for shadows. */
     private var outlineNeeded = false
 
     private var tmpTouchPointPath: Path? = null
     private var tmpOpPath: Path? = null
 
-    /**
-     * Updates the values of the outline. Returns `true` when the shape has changed.
-     */
+    /** Updates the values of the outline. Returns `true` when the shape has changed. */
     fun update(
         outline: Outline?,
         alpha: Float,
@@ -172,9 +154,7 @@
         return outlineChanged
     }
 
-    /**
-     * Returns true if there is a outline and [position] is outside the outline.
-     */
+    /** Returns true if there is a outline and [position] is outside the outline. */
     fun isInOutline(position: Offset): Boolean {
         if (!outlineNeeded) {
             return true
@@ -185,10 +165,9 @@
     }
 
     /**
-     * Manually applies the clip to the provided canvas based on the given outline.
-     * This is used in scenarios where clipping must be applied manually either because
-     * the outline cannot be clipped automatically for specific shapes or if the
-     * layer is being rendered in software
+     * Manually applies the clip to the provided canvas based on the given outline. This is used in
+     * scenarios where clipping must be applied manually either because the outline cannot be
+     * clipped automatically for specific shapes or if the layer is being rendered in software
      */
     fun clipToOutline(canvas: Canvas) {
         // If we have a clip path that means we are clipping to an arbitrary path or
@@ -204,15 +183,18 @@
             if (roundedCornerRadius > 0f) {
                 var roundRectClipPath = tmpPath
                 var roundRect = tmpRoundRect
-                if (roundRectClipPath == null ||
-                    !roundRect.isSameBounds(rectTopLeft, rectSize, roundedCornerRadius)) {
-                    roundRect = RoundRect(
-                        left = rectTopLeft.x,
-                        top = rectTopLeft.y,
-                        right = rectTopLeft.x + rectSize.width,
-                        bottom = rectTopLeft.y + rectSize.height,
-                        cornerRadius = CornerRadius(roundedCornerRadius)
-                    )
+                if (
+                    roundRectClipPath == null ||
+                        !roundRect.isSameBounds(rectTopLeft, rectSize, roundedCornerRadius)
+                ) {
+                    roundRect =
+                        RoundRect(
+                            left = rectTopLeft.x,
+                            top = rectTopLeft.y,
+                            right = rectTopLeft.x + rectSize.width,
+                            bottom = rectTopLeft.y + rectSize.height,
+                            cornerRadius = CornerRadius(roundedCornerRadius)
+                        )
                     if (roundRectClipPath == null) {
                         roundRectClipPath = Path()
                     } else {
@@ -243,8 +225,9 @@
             cacheIsDirty = false
             usePathForClip = false
             val outline = outline
-            if (outline != null && outlineNeeded &&
-                rectSize.width > 0.0f && rectSize.height > 0.0f) {
+            if (
+                outline != null && outlineNeeded && rectSize.width > 0.0f && rectSize.height > 0.0f
+            ) {
                 // Always assume the outline type is supported
                 // The methods to configure the outline will determine/update the flag
                 // if it not supported on the API level
diff --git a/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/platform/PlatformTextInputMethodRequest.android.kt b/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/platform/PlatformTextInputMethodRequest.android.kt
index 2813d78..0297a8d 100644
--- a/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/platform/PlatformTextInputMethodRequest.android.kt
+++ b/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/platform/PlatformTextInputMethodRequest.android.kt
@@ -32,23 +32,22 @@
      * This method makes stricter ordering guarantees about the lifetime of the returned
      * [InputConnection] than Android does, to make working with connections simpler. Namely, it
      * guarantees:
-     *  - For a given [PlatformTextInputMethodRequest] instance, only one [InputConnection] will
-     *    ever be active at a time.
-     *  - References to an [InputConnection] will be cleared as soon as the connection becomes
-     *    inactive. Even if Android leaks its reference to the connection, the connection returned
-     *    from this method will not be leaked.
-     *  - On API levels that support [InputConnection.closeConnection] (24+), a connection will
-     *    always be closed before a new connection is requested.
+     * - For a given [PlatformTextInputMethodRequest] instance, only one [InputConnection] will ever
+     *   be active at a time.
+     * - References to an [InputConnection] will be cleared as soon as the connection becomes
+     *   inactive. Even if Android leaks its reference to the connection, the connection returned
+     *   from this method will not be leaked.
+     * - On API levels that support [InputConnection.closeConnection] (24+), a connection will
+     *   always be closed before a new connection is requested.
      *
      * Android may call [View.onCreateInputConnection] multiple times for the same session – each
      * system call will result in a 1:1 call to this method, although the old connection will always
      * be closed first.
      *
      * @param outAttributes The [EditorInfo] from [View.onCreateInputConnection].
-     *
      * @return The [InputConnection] that will be used to talk to the IME as long as the session is
-     * active. This connection will not receive any calls after the requesting coroutine is
-     * cancelled.
+     *   active. This connection will not receive any calls after the requesting coroutine is
+     *   cancelled.
      */
     fun createInputConnection(outAttributes: EditorInfo): InputConnection
 }
diff --git a/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/platform/RenderNodeApi23.android.kt b/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/platform/RenderNodeApi23.android.kt
index 681b0c5..887c78d 100644
--- a/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/platform/RenderNodeApi23.android.kt
+++ b/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/platform/RenderNodeApi23.android.kt
@@ -30,10 +30,10 @@
 import androidx.compose.ui.graphics.RenderEffect
 
 /**
- * RenderNode on M-O devices, where RenderNode isn't officially supported. This class uses
- * a hidden android.view.RenderNode API that we have stubs for in the ui-android-stubs module.
- * This implementation has higher performance than the View implementation by both avoiding
- * reflection and using the lower overhead RenderNode instead of Views.
+ * RenderNode on M-O devices, where RenderNode isn't officially supported. This class uses a hidden
+ * android.view.RenderNode API that we have stubs for in the ui-android-stubs module. This
+ * implementation has higher performance than the View implementation by both avoiding reflection
+ * and using the lower overhead RenderNode instead of Views.
  */
 @RequiresApi(Build.VERSION_CODES.M)
 internal class RenderNodeApi23(val ownerView: AndroidComposeView) : DeviceRenderNode {
@@ -46,8 +46,7 @@
             // This is only to force loading the DisplayListCanvas class and causing the
             // MRenderNode to fail with a NoClassDefFoundError during construction instead of
             // later.
-            @Suppress("UNUSED_VARIABLE")
-            val displayListCanvas: DisplayListCanvas? = null
+            @Suppress("UNUSED_VARIABLE") val displayListCanvas: DisplayListCanvas? = null
 
             // Ensure that we can access properties of the RenderNode. We want to force an
             // exception here if there is a problem accessing any of these so that we can
@@ -81,14 +80,18 @@
         }
     }
 
-    override val uniqueId: Long get() = 0
+    override val uniqueId: Long
+        get() = 0
 
     override var left: Int = 0
     override var top: Int = 0
     override var right: Int = 0
     override var bottom: Int = 0
-    override val width: Int get() = right - left
-    override val height: Int get() = bottom - top
+    override val width: Int
+        get() = right - left
+
+    override val height: Int
+        get() = bottom - top
 
     // API level 23 does not support RenderEffect so keep the field around for consistency
     // however, it will not be applied to the rendered result. Consumers are encouraged
@@ -232,10 +235,11 @@
             internalCompositingStrategy = value
         }
 
-    internal fun getLayerType(): Int = when (internalCompositingStrategy) {
-        CompositingStrategy.Offscreen -> View.LAYER_TYPE_HARDWARE
-        else -> View.LAYER_TYPE_NONE
-    }
+    internal fun getLayerType(): Int =
+        when (internalCompositingStrategy) {
+            CompositingStrategy.Offscreen -> View.LAYER_TYPE_HARDWARE
+            else -> View.LAYER_TYPE_NONE
+        }
 
     internal fun hasOverlappingRendering(): Boolean = renderNode.hasOverlappingRendering()
 
@@ -266,11 +270,7 @@
         renderNode.offsetTopAndBottom(offset)
     }
 
-    override fun record(
-        canvasHolder: CanvasHolder,
-        clipPath: Path?,
-        drawBlock: (Canvas) -> Unit
-    ) {
+    override fun record(canvasHolder: CanvasHolder, clipPath: Path?, drawBlock: (Canvas) -> Unit) {
         val canvas = renderNode.start(width, height)
         canvasHolder.drawInto(canvas) {
             if (clipPath != null) {
diff --git a/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/platform/RenderNodeApi29.android.kt b/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/platform/RenderNodeApi29.android.kt
index bddbb59..04cde59 100644
--- a/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/platform/RenderNodeApi29.android.kt
+++ b/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/platform/RenderNodeApi29.android.kt
@@ -26,9 +26,7 @@
 import androidx.compose.ui.graphics.Path
 import androidx.compose.ui.graphics.RenderEffect
 
-/**
- * RenderNode on Q+ devices, where it is officially supported.
- */
+/** RenderNode on Q+ devices, where it is officially supported. */
 @RequiresApi(Build.VERSION_CODES.Q)
 internal class RenderNodeApi29(val ownerView: AndroidComposeView) : DeviceRenderNode {
     private val renderNode = RenderNode("Compose")
@@ -41,14 +39,26 @@
 
     internal fun hasOverlappingRendering(): Boolean = renderNode.hasOverlappingRendering()
 
-    override val uniqueId: Long get() = renderNode.uniqueId
+    override val uniqueId: Long
+        get() = renderNode.uniqueId
 
-    override val left: Int get() = renderNode.left
-    override val top: Int get() = renderNode.top
-    override val right: Int get() = renderNode.right
-    override val bottom: Int get() = renderNode.bottom
-    override val width: Int get() = renderNode.width
-    override val height: Int get() = renderNode.height
+    override val left: Int
+        get() = renderNode.left
+
+    override val top: Int
+        get() = renderNode.top
+
+    override val right: Int
+        get() = renderNode.right
+
+    override val bottom: Int
+        get() = renderNode.bottom
+
+    override val width: Int
+        get() = renderNode.width
+
+    override val height: Int
+        get() = renderNode.height
 
     override var scaleX: Float
         get() = renderNode.scaleX
@@ -196,11 +206,7 @@
         renderNode.offsetTopAndBottom(offset)
     }
 
-    override fun record(
-        canvasHolder: CanvasHolder,
-        clipPath: Path?,
-        drawBlock: (Canvas) -> Unit
-    ) {
+    override fun record(canvasHolder: CanvasHolder, clipPath: Path?, drawBlock: (Canvas) -> Unit) {
         canvasHolder.drawInto(renderNode.beginRecording()) {
             if (clipPath != null) {
                 save()
diff --git a/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/platform/RenderNodeLayer.android.kt b/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/platform/RenderNodeLayer.android.kt
index 2e6c0be..63081a2 100644
--- a/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/platform/RenderNodeLayer.android.kt
+++ b/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/platform/RenderNodeLayer.android.kt
@@ -37,9 +37,7 @@
 import androidx.compose.ui.unit.IntOffset
 import androidx.compose.ui.unit.IntSize
 
-/**
- * RenderNode implementation of OwnedLayer.
- */
+/** RenderNode implementation of OwnedLayer. */
 @RequiresApi(Build.VERSION_CODES.M)
 internal class RenderNodeLayer(
     val ownerView: AndroidComposeView,
@@ -49,9 +47,7 @@
     private var drawBlock: ((canvas: Canvas, parentLayer: GraphicsLayer?) -> Unit)? = drawBlock
     private var invalidateParentLayer: (() -> Unit)? = invalidateParentLayer
 
-    /**
-     * True when the RenderNodeLayer has been invalidated and not yet drawn.
-     */
+    /** True when the RenderNodeLayer has been invalidated and not yet drawn. */
     private var isDirty = false
         set(value) {
             if (value != field) {
@@ -59,13 +55,14 @@
                 ownerView.notifyLayerIsDirty(this, value)
             }
         }
+
     private val outlineResolver = OutlineResolver()
     private var isDestroyed = false
     private var drawnWithZ = false
 
     /**
-     * Optional paint used when the RenderNode is rendered on a software backed
-     * canvas and is somewhat transparent (i.e. alpha less than 1.0f)
+     * Optional paint used when the RenderNode is rendered on a software backed canvas and is
+     * somewhat transparent (i.e. alpha less than 1.0f)
      */
     private var softwareLayerPaint: Paint? = null
 
@@ -74,31 +71,34 @@
     private val canvasHolder = CanvasHolder()
 
     /**
-     * Local copy of the transform origin as GraphicsLayerModifier can be implemented
-     * as a model object. Update this field within [updateLayerProperties] and use it
-     * in [resize] or other methods
+     * Local copy of the transform origin as GraphicsLayerModifier can be implemented as a model
+     * object. Update this field within [updateLayerProperties] and use it in [resize] or other
+     * methods
      */
     private var transformOrigin: TransformOrigin = TransformOrigin.Center
 
-    private val renderNode = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
-        RenderNodeApi29(ownerView)
-    } else {
-        RenderNodeApi23(ownerView)
-    }.apply {
-        setHasOverlappingRendering(true)
-        // in compose the default is to not clip.
-        clipToBounds = false
-    }
+    private val renderNode =
+        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
+                RenderNodeApi29(ownerView)
+            } else {
+                RenderNodeApi23(ownerView)
+            }
+            .apply {
+                setHasOverlappingRendering(true)
+                // in compose the default is to not clip.
+                clipToBounds = false
+            }
 
     override val layerId: Long
         get() = renderNode.uniqueId
 
     override val ownerViewId: Long
-        get() = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
-            UniqueDrawingIdApi29.getUniqueDrawingId(ownerView)
-        } else {
-            -1
-        }
+        get() =
+            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
+                UniqueDrawingIdApi29.getUniqueDrawingId(ownerView)
+            } else {
+                -1
+            }
 
     @RequiresApi(29)
     private object UniqueDrawingIdApi29 {
@@ -166,13 +166,14 @@
         if (maybeChangedFields and Fields.CompositingStrategy != 0) {
             renderNode.compositingStrategy = scope.compositingStrategy
         }
-        val shapeChanged = outlineResolver.update(
-            scope.outline,
-            scope.alpha,
-            clipToOutline,
-            scope.shadowElevation,
-            scope.size,
-        )
+        val shapeChanged =
+            outlineResolver.update(
+                scope.outline,
+                scope.alpha,
+                clipToOutline,
+                scope.shadowElevation,
+                scope.size,
+            )
         if (outlineResolver.cacheIsDirty) {
             renderNode.setOutline(outlineResolver.androidOutline)
         }
@@ -212,7 +213,8 @@
         val height = size.height
         renderNode.pivotX = transformOrigin.pivotFractionX * width
         renderNode.pivotY = transformOrigin.pivotFractionY * height
-        if (renderNode.setPosition(
+        if (
+            renderNode.setPosition(
                 renderNode.left,
                 renderNode.top,
                 renderNode.left + width,
@@ -250,9 +252,8 @@
     }
 
     /**
-     * This only triggers the system so that it knows that some kind of painting
-     * must happen without actually causing the layer to be invalidated and have
-     * to re-record its drawing.
+     * This only triggers the system so that it knows that some kind of painting must happen without
+     * actually causing the layer to be invalidated and have to re-record its drawing.
      */
     private fun triggerRepaint() {
         // onDescendantInvalidated is only supported on O+
@@ -283,15 +284,11 @@
             // If there is alpha applied, we must render into an offscreen buffer to
             // properly blend the contents of this layer against the background content
             if (renderNode.alpha < 1.0f) {
-                val paint = (softwareLayerPaint ?: Paint().also { softwareLayerPaint = it })
-                    .apply { alpha = renderNode.alpha }
-                androidCanvas.saveLayer(
-                    left,
-                    top,
-                    right,
-                    bottom,
-                    paint.asFrameworkPaint()
-                )
+                val paint =
+                    (softwareLayerPaint ?: Paint().also { softwareLayerPaint = it }).apply {
+                        alpha = renderNode.alpha
+                    }
+                androidCanvas.saveLayer(left, top, right, bottom, paint.asFrameworkPaint())
             } else {
                 canvas.save()
             }
@@ -307,8 +304,8 @@
     }
 
     /**
-     * Manually clips the content of the RenderNodeLayer in the provided canvas.
-     * This is used only in software rendered use cases
+     * Manually clips the content of the RenderNodeLayer in the provided canvas. This is used only
+     * in software rendered use cases
      */
     private fun clipRenderNode(canvas: Canvas) {
         if (renderNode.clipToOutline || renderNode.clipToBounds) {
@@ -318,15 +315,14 @@
 
     override fun updateDisplayList() {
         if (isDirty || !renderNode.hasDisplayList) {
-            val clipPath = if (renderNode.clipToOutline && !outlineResolver.outlineClipSupported) {
-                outlineResolver.clipPath
-            } else {
-                null
-            }
-            drawBlock?.let { drawBlock ->
-                renderNode.record(canvasHolder, clipPath) {
-                    drawBlock(it, null)
+            val clipPath =
+                if (renderNode.clipToOutline && !outlineResolver.outlineClipSupported) {
+                    outlineResolver.clipPath
+                } else {
+                    null
                 }
+            drawBlock?.let { drawBlock ->
+                renderNode.record(canvasHolder, clipPath) { drawBlock(it, null) }
             }
             isDirty = false
         }
@@ -396,9 +392,9 @@
 }
 
 /**
- * This class is here to ensure that the classes that use this API will get verified and can be
- * AOT compiled. It is expected that this class will soft-fail verification, but the classes
- * which use this method will pass.
+ * This class is here to ensure that the classes that use this API will get verified and can be AOT
+ * compiled. It is expected that this class will soft-fail verification, but the classes which use
+ * this method will pass.
  */
 @RequiresApi(Build.VERSION_CODES.O)
 internal object WrapperRenderNodeLayerHelperMethods {
diff --git a/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/platform/SemanticsUtils.android.kt b/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/platform/SemanticsUtils.android.kt
index 9e94664..e2a6f0e 100644
--- a/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/platform/SemanticsUtils.android.kt
+++ b/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/platform/SemanticsUtils.android.kt
@@ -39,8 +39,8 @@
 import androidx.core.view.accessibility.AccessibilityNodeProviderCompat
 
 /**
- * A snapshot of the semantics node. The children here is fixed and are taken from the time
- * this node is constructed. While a SemanticsNode always contains the up-to-date children.
+ * A snapshot of the semantics node. The children here is fixed and are taken from the time this
+ * node is constructed. While a SemanticsNode always contains the up-to-date children.
  */
 internal class SemanticsNodeCopy(
     semanticsNode: SemanticsNode,
@@ -60,8 +60,11 @@
 
 internal fun getTextLayoutResult(configuration: SemanticsConfiguration): TextLayoutResult? {
     val textLayoutResults = mutableListOf<TextLayoutResult>()
-    val getLayoutResult = configuration.getOrNull(SemanticsActions.GetTextLayoutResult)
-        ?.action?.invoke(textLayoutResults) ?: return null
+    val getLayoutResult =
+        configuration
+            .getOrNull(SemanticsActions.GetTextLayoutResult)
+            ?.action
+            ?.invoke(textLayoutResults) ?: return null
     return if (getLayoutResult) {
         textLayoutResults[0]
     } else {
@@ -72,8 +75,11 @@
 @SuppressLint("PrimitiveInCollection")
 internal fun getScrollViewportLength(configuration: SemanticsConfiguration): Float? {
     val viewPortCalculationsResult = mutableListOf<Float>()
-    val actionResult = configuration.getOrNull(SemanticsActions.GetScrollViewportLength)
-        ?.action?.invoke(viewPortCalculationsResult) ?: return null
+    val actionResult =
+        configuration
+            .getOrNull(SemanticsActions.GetScrollViewportLength)
+            ?.action
+            ?.invoke(viewPortCalculationsResult) ?: return null
     return if (actionResult) {
         viewPortCalculationsResult[0]
     } else {
@@ -83,7 +89,7 @@
 
 /**
  * These objects are used as snapshot observation scopes for the purpose of sending accessibility
- * scroll events whenever the scroll offset changes.  There is one per scroller and their lifecycle
+ * scroll events whenever the scroll offset changes. There is one per scroller and their lifecycle
  * is the same as the scroller's lifecycle in the semantics tree.
  */
 internal class ScrollObservationScope(
@@ -94,7 +100,8 @@
     var horizontalScrollAxisRange: ScrollAxisRange?,
     var verticalScrollAxisRange: ScrollAxisRange?
 ) : OwnerScope {
-    override val isValidOwnerScope get() = allScopes.contains(this)
+    override val isValidOwnerScope
+        get() = allScopes.contains(this)
 }
 
 internal fun List<ScrollObservationScope>.findById(id: Int): ScrollObservationScope? {
@@ -122,17 +129,13 @@
 
 internal val DefaultFakeNodeBounds = Rect(0f, 0f, 10f, 10f)
 
-/**
- * Semantics node with adjusted bounds for the uncovered(by siblings) part.
- */
+/** Semantics node with adjusted bounds for the uncovered(by siblings) part. */
 internal class SemanticsNodeWithAdjustedBounds(
     val semanticsNode: SemanticsNode,
     val adjustedBounds: android.graphics.Rect
 )
 
-/**
- * This function retrieves the View corresponding to a semanticsId, if it exists.
- */
+/** This function retrieves the View corresponding to a semanticsId, if it exists. */
 internal fun AndroidViewsHandler.semanticsIdToView(id: Int): View? =
     layoutNodeToHolder.entries.firstOrNull { it.key.semanticsId == id }?.value
 
@@ -146,8 +149,7 @@
 // of `getAllUncoveredSemanticsNodesToMap` as it does now.
 /**
  * Finds pruned [SemanticsNode]s in the tree owned by this [SemanticsOwner]. A semantics node
- * completely covered by siblings drawn on top of it will be pruned. Return the results in a
- * map.
+ * completely covered by siblings drawn on top of it will be pruned. Return the results in a map.
  */
 internal fun SemanticsOwner.getAllUncoveredSemanticsNodesToIntObjectMap():
     IntObjectMap<SemanticsNodeWithAdjustedBounds> {
@@ -157,20 +159,22 @@
         return nodes
     }
 
-    val unaccountedSpace = with(root.boundsInRoot) {
-        Region(
-            left.fastRoundToInt(),
-            top.fastRoundToInt(),
-            right.fastRoundToInt(),
-            bottom.fastRoundToInt()
-        )
-    }
+    val unaccountedSpace =
+        with(root.boundsInRoot) {
+            Region(
+                left.fastRoundToInt(),
+                top.fastRoundToInt(),
+                right.fastRoundToInt(),
+                bottom.fastRoundToInt()
+            )
+        }
 
     fun findAllSemanticNodesRecursive(currentNode: SemanticsNode, region: Region) {
         val notAttachedOrPlaced =
             !currentNode.layoutNode.isPlaced || !currentNode.layoutNode.isAttached
-        if ((unaccountedSpace.isEmpty && currentNode.id != root.id) ||
-            (notAttachedOrPlaced && !currentNode.isFake)
+        if (
+            (unaccountedSpace.isEmpty && currentNode.id != root.id) ||
+                (notAttachedOrPlaced && !currentNode.isFake)
         ) {
             return
         }
@@ -182,11 +186,12 @@
 
         region.set(left, top, right, bottom)
 
-        val virtualViewId = if (currentNode.id == root.id) {
-            AccessibilityNodeProviderCompat.HOST_VIEW_ID
-        } else {
-            currentNode.id
-        }
+        val virtualViewId =
+            if (currentNode.id == root.id) {
+                AccessibilityNodeProviderCompat.HOST_VIEW_ID
+            } else {
+                currentNode.id
+            }
         if (region.op(unaccountedSpace, Region.Op.INTERSECT)) {
             nodes[virtualViewId] = SemanticsNodeWithAdjustedBounds(currentNode, region.bounds)
             // Children could be drawn outside of parent, but we are using clipped bounds for
@@ -204,23 +209,26 @@
             if (currentNode.isFake) {
                 val parentNode = currentNode.parent
                 // use parent bounds for fake node
-                val boundsForFakeNode = if (parentNode?.layoutInfo?.isPlaced == true) {
-                    parentNode.boundsInRoot
-                } else {
-                    DefaultFakeNodeBounds
-                }
-                nodes[virtualViewId] = SemanticsNodeWithAdjustedBounds(
-                    currentNode,
-                    android.graphics.Rect(
-                        boundsForFakeNode.left.fastRoundToInt(),
-                        boundsForFakeNode.top.fastRoundToInt(),
-                        boundsForFakeNode.right.fastRoundToInt(),
-                        boundsForFakeNode.bottom.fastRoundToInt(),
+                val boundsForFakeNode =
+                    if (parentNode?.layoutInfo?.isPlaced == true) {
+                        parentNode.boundsInRoot
+                    } else {
+                        DefaultFakeNodeBounds
+                    }
+                nodes[virtualViewId] =
+                    SemanticsNodeWithAdjustedBounds(
+                        currentNode,
+                        android.graphics.Rect(
+                            boundsForFakeNode.left.fastRoundToInt(),
+                            boundsForFakeNode.top.fastRoundToInt(),
+                            boundsForFakeNode.right.fastRoundToInt(),
+                            boundsForFakeNode.bottom.fastRoundToInt(),
+                        )
                     )
-                )
             } else if (virtualViewId == AccessibilityNodeProviderCompat.HOST_VIEW_ID) {
                 // Root view might have WRAP_CONTENT layout params in which case it will have zero
-                // bounds if there is no other content with semantics. But we need to always send the
+                // bounds if there is no other content with semantics. But we need to always send
+                // the
                 // root view info as there are some other apps (e.g. Google Assistant) that depend
                 // on accessibility info
                 nodes[virtualViewId] = SemanticsNodeWithAdjustedBounds(currentNode, region.bounds)
diff --git a/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/platform/ViewCompositionStrategy.android.kt b/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/platform/ViewCompositionStrategy.android.kt
index ef2ede5..89f0a01 100644
--- a/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/platform/ViewCompositionStrategy.android.kt
+++ b/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/platform/ViewCompositionStrategy.android.kt
@@ -30,15 +30,15 @@
 import androidx.lifecycle.findViewTreeLifecycleOwner
 
 /**
- * A strategy for managing the underlying Composition of Compose UI [View]s such as
- * [ComposeView] and [AbstractComposeView]. See [AbstractComposeView.setViewCompositionStrategy].
+ * A strategy for managing the underlying Composition of Compose UI [View]s such as [ComposeView]
+ * and [AbstractComposeView]. See [AbstractComposeView.setViewCompositionStrategy].
  *
- * Compose views involve ongoing work and registering the composition with external
- * event sources. These registrations can cause the composition to remain live and
- * ineligible for garbage collection for long after the host View may have been abandoned.
- * These resources and registrations can be released manually at any time by calling
- * [AbstractComposeView.disposeComposition] and a new composition will be created automatically
- * when needed. A [ViewCompositionStrategy] defines a strategy for disposing the composition
+ * Compose views involve ongoing work and registering the composition with external event sources.
+ * These registrations can cause the composition to remain live and ineligible for garbage
+ * collection for long after the host View may have been abandoned. These resources and
+ * registrations can be released manually at any time by calling
+ * [AbstractComposeView.disposeComposition] and a new composition will be created automatically when
+ * needed. A [ViewCompositionStrategy] defines a strategy for disposing the composition
  * automatically at an appropriate time.
  *
  * By default, Compose UI views are configured to [Default].
@@ -46,16 +46,16 @@
 interface ViewCompositionStrategy {
 
     /**
-     * Install this strategy for [view] and return a function that will uninstall it later.
-     * This function should not be called directly; it is called by
+     * Install this strategy for [view] and return a function that will uninstall it later. This
+     * function should not be called directly; it is called by
      * [AbstractComposeView.setViewCompositionStrategy] after uninstalling the previous strategy.
      */
     fun installFor(view: AbstractComposeView): () -> Unit
 
     /**
-     * This companion object may be used to define extension factory functions for other
-     * strategies to aid in discovery via autocomplete. e.g.:
-     * `fun ViewCompositionStrategy.Companion.MyStrategy(): MyStrategy`
+     * This companion object may be used to define extension factory functions for other strategies
+     * to aid in discovery via autocomplete. e.g.: `fun
+     * ViewCompositionStrategy.Companion.MyStrategy(): MyStrategy`
      */
     companion object {
         /**
@@ -83,15 +83,16 @@
     // Be careful not to do anything that would break that.
     object DisposeOnDetachedFromWindowOrReleasedFromPool : ViewCompositionStrategy {
         override fun installFor(view: AbstractComposeView): () -> Unit {
-            val listener = object : View.OnAttachStateChangeListener {
-                override fun onViewAttachedToWindow(v: View) {}
+            val listener =
+                object : View.OnAttachStateChangeListener {
+                    override fun onViewAttachedToWindow(v: View) {}
 
-                override fun onViewDetachedFromWindow(v: View) {
-                    if (!view.isWithinPoolingContainer) {
-                        view.disposeComposition()
+                    override fun onViewDetachedFromWindow(v: View) {
+                        if (!view.isWithinPoolingContainer) {
+                            view.disposeComposition()
+                        }
                     }
                 }
-            }
             view.addOnAttachStateChangeListener(listener)
 
             val poolingContainerListener = PoolingContainerListener { view.disposeComposition() }
@@ -107,22 +108,22 @@
     /**
      * [ViewCompositionStrategy] that disposes the composition whenever the view becomes detached
      * from a window. If the user of a Compose UI view never explicitly calls
-     * [AbstractComposeView.createComposition], this strategy is always safe and will always
-     * clean up composition resources with no explicit action required - just use the view like
-     * any other View and let garbage collection do the rest. (If
-     * [AbstractComposeView.createComposition] is called while the view is detached from a window,
-     * [AbstractComposeView.disposeComposition] must be called manually if the view is not later
-     * attached to a window.)
+     * [AbstractComposeView.createComposition], this strategy is always safe and will always clean
+     * up composition resources with no explicit action required - just use the view like any other
+     * View and let garbage collection do the rest. (If [AbstractComposeView.createComposition] is
+     * called while the view is detached from a window, [AbstractComposeView.disposeComposition]
+     * must be called manually if the view is not later attached to a window.)
      */
     object DisposeOnDetachedFromWindow : ViewCompositionStrategy {
         override fun installFor(view: AbstractComposeView): () -> Unit {
-            val listener = object : View.OnAttachStateChangeListener {
-                override fun onViewAttachedToWindow(v: View) {}
+            val listener =
+                object : View.OnAttachStateChangeListener {
+                    override fun onViewAttachedToWindow(v: View) {}
 
-                override fun onViewDetachedFromWindow(v: View) {
-                    view.disposeComposition()
+                    override fun onViewDetachedFromWindow(v: View) {
+                        view.disposeComposition()
+                    }
                 }
-            }
             view.addOnAttachStateChangeListener(listener)
             return { view.removeOnAttachStateChangeListener(listener) }
         }
@@ -133,9 +134,7 @@
      * [destroyed][Lifecycle.Event.ON_DESTROY]. This strategy is appropriate for Compose UI views
      * that share a 1-1 relationship with a known [LifecycleOwner].
      */
-    class DisposeOnLifecycleDestroyed(
-        private val lifecycle: Lifecycle
-    ) : ViewCompositionStrategy {
+    class DisposeOnLifecycleDestroyed(private val lifecycle: Lifecycle) : ViewCompositionStrategy {
         constructor(lifecycleOwner: LifecycleOwner) : this(lifecycleOwner.lifecycle)
 
         override fun installFor(view: AbstractComposeView): () -> Unit =
@@ -143,35 +142,37 @@
     }
 
     /**
-     * [ViewCompositionStrategy] that disposes the composition when the
-     * [LifecycleOwner] returned by [findViewTreeLifecycleOwner] of the next window
-     * the view is attached to is [destroyed][Lifecycle.Event.ON_DESTROY].
-     * This strategy is appropriate for Compose UI views that share a 1-1 relationship with
-     * their closest [LifecycleOwner], such as a Fragment view.
+     * [ViewCompositionStrategy] that disposes the composition when the [LifecycleOwner] returned by
+     * [findViewTreeLifecycleOwner] of the next window the view is attached to is
+     * [destroyed][Lifecycle.Event.ON_DESTROY]. This strategy is appropriate for Compose UI views
+     * that share a 1-1 relationship with their closest [LifecycleOwner], such as a Fragment view.
      */
     object DisposeOnViewTreeLifecycleDestroyed : ViewCompositionStrategy {
         override fun installFor(view: AbstractComposeView): () -> Unit {
             if (view.isAttachedToWindow) {
-                val lco = checkPreconditionNotNull(view.findViewTreeLifecycleOwner()) {
-                    "View tree for $view has no ViewTreeLifecycleOwner"
-                }
+                val lco =
+                    checkPreconditionNotNull(view.findViewTreeLifecycleOwner()) {
+                        "View tree for $view has no ViewTreeLifecycleOwner"
+                    }
                 return installForLifecycle(view, lco.lifecycle)
             } else {
                 // We change this reference after we successfully attach
                 var disposer: () -> Unit
-                val listener = object : View.OnAttachStateChangeListener {
-                    override fun onViewAttachedToWindow(v: View) {
-                        val lco = checkPreconditionNotNull(view.findViewTreeLifecycleOwner()) {
-                            "View tree for $view has no ViewTreeLifecycleOwner"
+                val listener =
+                    object : View.OnAttachStateChangeListener {
+                        override fun onViewAttachedToWindow(v: View) {
+                            val lco =
+                                checkPreconditionNotNull(view.findViewTreeLifecycleOwner()) {
+                                    "View tree for $view has no ViewTreeLifecycleOwner"
+                                }
+                            disposer = installForLifecycle(view, lco.lifecycle)
+
+                            // Ensure this runs only once
+                            view.removeOnAttachStateChangeListener(this)
                         }
-                        disposer = installForLifecycle(view, lco.lifecycle)
 
-                        // Ensure this runs only once
-                        view.removeOnAttachStateChangeListener(this)
+                        override fun onViewDetachedFromWindow(v: View) {}
                     }
-
-                    override fun onViewDetachedFromWindow(v: View) {}
-                }
                 view.addOnAttachStateChangeListener(listener)
                 disposer = { view.removeOnAttachStateChangeListener(listener) }
                 return { disposer() }
diff --git a/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/platform/ViewLayer.android.kt b/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/platform/ViewLayer.android.kt
index 824f2ce..6d9e45c 100644
--- a/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/platform/ViewLayer.android.kt
+++ b/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/platform/ViewLayer.android.kt
@@ -42,9 +42,7 @@
 import java.lang.reflect.Field
 import java.lang.reflect.Method
 
-/**
- * View implementation of OwnedLayer.
- */
+/** View implementation of OwnedLayer. */
 internal class ViewLayer(
     val ownerView: AndroidComposeView,
     val container: DrawChildContainer,
@@ -58,12 +56,14 @@
     // Value of the layerModifier's clipToBounds property
     private var clipToBounds = false
     private var clipBoundsCache: android.graphics.Rect? = null
-    private val manualClipPath: Path? get() =
-        if (!clipToOutline || outlineResolver.outlineClipSupported) {
-            null
-        } else {
-            outlineResolver.clipPath
-        }
+    private val manualClipPath: Path?
+        get() =
+            if (!clipToOutline || outlineResolver.outlineClipSupported) {
+                null
+            } else {
+                outlineResolver.clipPath
+            }
+
     var isInvalidated = false
         private set(value) {
             if (value != field) {
@@ -71,15 +71,16 @@
                 ownerView.notifyLayerIsDirty(this, value)
             }
         }
+
     private var drawnWithZ = false
     private val canvasHolder = CanvasHolder()
 
     private val matrixCache = LayerMatrixCache(getMatrix)
 
     /**
-     * Local copy of the transform origin as GraphicsLayerModifier can be implemented
-     * as a model object. Update this field within [updateLayerProperties] and use it
-     * in [resize] or other methods
+     * Local copy of the transform origin as GraphicsLayerModifier can be implemented as a model
+     * object. Update this field within [updateLayerProperties] and use it in [resize] or other
+     * methods
      */
     private var mTransformOrigin: TransformOrigin = TransformOrigin.Center
 
@@ -93,11 +94,12 @@
     override val layerId: Long = generateViewId().toLong()
 
     override val ownerViewId: Long
-        get() = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
-            UniqueDrawingIdApi29.getUniqueDrawingId(ownerView)
-        } else {
-            -1
-        }
+        get() =
+            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
+                UniqueDrawingIdApi29.getUniqueDrawingId(ownerView)
+            } else {
+                -1
+            }
 
     @RequiresApi(29)
     private object UniqueDrawingIdApi29 {
@@ -168,13 +170,14 @@
             resetClipBounds()
             this.clipToOutline = clipToOutline
         }
-        val shapeChanged = outlineResolver.update(
-            scope.outline,
-            scope.alpha,
-            clipToOutline,
-            scope.shadowElevation,
-            scope.size
-        )
+        val shapeChanged =
+            outlineResolver.update(
+                scope.outline,
+                scope.alpha,
+                clipToOutline,
+                scope.shadowElevation,
+                scope.size
+            )
         if (outlineResolver.cacheIsDirty) {
             updateOutlineResolver()
         }
@@ -209,22 +212,21 @@
         }
 
         if (maybeChangedFields and Fields.CompositingStrategy != 0) {
-            mHasOverlappingRendering = when (scope.compositingStrategy) {
-                CompositingStrategy.Offscreen -> {
-                    setLayerType(LAYER_TYPE_HARDWARE, null)
-                    true
+            mHasOverlappingRendering =
+                when (scope.compositingStrategy) {
+                    CompositingStrategy.Offscreen -> {
+                        setLayerType(LAYER_TYPE_HARDWARE, null)
+                        true
+                    }
+                    CompositingStrategy.ModulateAlpha -> {
+                        setLayerType(LAYER_TYPE_NONE, null)
+                        false
+                    }
+                    else -> { // CompositingStrategy.Auto
+                        setLayerType(LAYER_TYPE_NONE, null)
+                        true
+                    }
                 }
-
-                CompositingStrategy.ModulateAlpha -> {
-                    setLayerType(LAYER_TYPE_NONE, null)
-                    false
-                }
-
-                else -> { // CompositingStrategy.Auto
-                    setLayerType(LAYER_TYPE_NONE, null)
-                    true
-                }
-            }
         }
         mutatedFields = scope.mutatedFields
     }
@@ -248,24 +250,26 @@
     }
 
     private fun updateOutlineResolver() {
-        this.outlineProvider = if (outlineResolver.androidOutline != null) {
-            OutlineProvider
-        } else {
-            null
-        }
+        this.outlineProvider =
+            if (outlineResolver.androidOutline != null) {
+                OutlineProvider
+            } else {
+                null
+            }
     }
 
     private fun resetClipBounds() {
-        this.clipBounds = if (clipToBounds) {
-            if (clipBoundsCache == null) {
-                clipBoundsCache = android.graphics.Rect(0, 0, width, height)
+        this.clipBounds =
+            if (clipToBounds) {
+                if (clipBoundsCache == null) {
+                    clipBoundsCache = android.graphics.Rect(0, 0, width, height)
+                } else {
+                    clipBoundsCache!!.set(0, 0, width, height)
+                }
+                clipBoundsCache
             } else {
-                clipBoundsCache!!.set(0, 0, width, height)
+                null
             }
-            clipBoundsCache
-        } else {
-            null
-        }
     }
 
     override fun resize(size: IntSize) {
@@ -331,8 +335,7 @@
         }
     }
 
-    override fun onLayout(changed: Boolean, l: Int, t: Int, r: Int, b: Int) {
-    }
+    override fun onLayout(changed: Boolean, l: Int, t: Int, r: Int, b: Int) {}
 
     override fun destroy() {
         isInvalidated = false
@@ -415,12 +418,13 @@
             matrix.set(newMatrix)
         }
 
-        val OutlineProvider = object : ViewOutlineProvider() {
-            override fun getOutline(view: View, outline: android.graphics.Outline) {
-                view as ViewLayer
-                outline.set(view.outlineResolver.androidOutline!!)
+        val OutlineProvider =
+            object : ViewOutlineProvider() {
+                override fun getOutline(view: View, outline: android.graphics.Outline) {
+                    view as ViewLayer
+                    outline.set(view.outlineResolver.androidOutline!!)
+                }
             }
-        }
         private var updateDisplayListIfDirtyMethod: Method? = null
         private var recreateDisplayList: Field? = null
         var hasRetrievedMethod = false
@@ -440,23 +444,27 @@
                         recreateDisplayList =
                             View::class.java.getDeclaredField("mRecreateDisplayList")
                     } else {
-                        val getDeclaredMethod = Class::class.java.getDeclaredMethod(
-                            "getDeclaredMethod",
-                            String::class.java,
-                            arrayOf<Class<*>>()::class.java
-                        )
-                        updateDisplayListIfDirtyMethod = getDeclaredMethod.invoke(
-                            View::class.java,
-                            "updateDisplayListIfDirty", emptyArray<Class<*>>()
-                        ) as Method?
-                        val getDeclaredField = Class::class.java.getDeclaredMethod(
-                            "getDeclaredField",
-                            String::class.java
-                        )
-                        recreateDisplayList = getDeclaredField.invoke(
-                            View::class.java,
-                            "mRecreateDisplayList"
-                        ) as Field?
+                        val getDeclaredMethod =
+                            Class::class
+                                .java
+                                .getDeclaredMethod(
+                                    "getDeclaredMethod",
+                                    String::class.java,
+                                    arrayOf<Class<*>>()::class.java
+                                )
+                        updateDisplayListIfDirtyMethod =
+                            getDeclaredMethod.invoke(
+                                View::class.java,
+                                "updateDisplayListIfDirty",
+                                emptyArray<Class<*>>()
+                            ) as Method?
+                        val getDeclaredField =
+                            Class::class
+                                .java
+                                .getDeclaredMethod("getDeclaredField", String::class.java)
+                        recreateDisplayList =
+                            getDeclaredField.invoke(View::class.java, "mRecreateDisplayList")
+                                as Field?
                     }
                     updateDisplayListIfDirtyMethod?.isAccessible = true
                     recreateDisplayList?.isAccessible = true
diff --git a/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/platform/ViewLayerContainer.android.kt b/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/platform/ViewLayerContainer.android.kt
index 6716cc4..57093d7 100644
--- a/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/platform/ViewLayerContainer.android.kt
+++ b/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/platform/ViewLayerContainer.android.kt
@@ -23,26 +23,20 @@
 import androidx.compose.ui.graphics.Canvas
 import androidx.compose.ui.graphics.nativeCanvas
 
-/**
- * The container we will use for [ViewLayer]s.
- */
+/** The container we will use for [ViewLayer]s. */
 internal class ViewLayerContainer(context: Context) : DrawChildContainer(context) {
     override fun dispatchDraw(canvas: android.graphics.Canvas) {
         // we draw our children as part of AndroidComposeView.dispatchDraw
     }
 
     /**
-     * We control our own child Views and we don't want the View system to force updating
-     * the display lists.
-     * We override hidden protected method from ViewGroup
+     * We control our own child Views and we don't want the View system to force updating the
+     * display lists. We override hidden protected method from ViewGroup
      */
-    protected fun dispatchGetDisplayList() {
-    }
+    protected fun dispatchGetDisplayList() {}
 }
 
-/**
- * The container we will use for [ViewLayer]s when [ViewLayer.shouldUseDispatchDraw] is true.
- */
+/** The container we will use for [ViewLayer]s when [ViewLayer.shouldUseDispatchDraw] is true. */
 internal open class DrawChildContainer(context: Context) : ViewGroup(context) {
     private var isDrawing = false
 
@@ -91,8 +85,8 @@
     }
 
     /**
-     * We don't want to advertise children to the transition system. ViewLayers shouldn't be
-     * watched for add/remove for transitions purposes.
+     * We don't want to advertise children to the transition system. ViewLayers shouldn't be watched
+     * for add/remove for transitions purposes.
      */
     override fun getChildCount(): Int = if (isDrawing) super.getChildCount() else 0
 
diff --git a/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/platform/ViewRootForInspector.android.kt b/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/platform/ViewRootForInspector.android.kt
index f4a2b32..a72c360 100644
--- a/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/platform/ViewRootForInspector.android.kt
+++ b/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/platform/ViewRootForInspector.android.kt
@@ -20,9 +20,8 @@
 import kotlin.jvm.JvmDefaultWithCompatibility
 
 /**
- * The marker interface to be implemented by [View]s that are initialized from Compose.
- * Examples are: DialogWrapper, PopupLayout, ViewFactoryHolder.
- * To be used by the inspector.
+ * The marker interface to be implemented by [View]s that are initialized from Compose. Examples
+ * are: DialogWrapper, PopupLayout, ViewFactoryHolder. To be used by the inspector.
  */
 @JvmDefaultWithCompatibility
 interface ViewRootForInspector {
diff --git a/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/platform/ViewRootForTest.android.kt b/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/platform/ViewRootForTest.android.kt
index 77445b1..f2c9113 100644
--- a/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/platform/ViewRootForTest.android.kt
+++ b/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/platform/ViewRootForTest.android.kt
@@ -21,39 +21,30 @@
 import androidx.compose.ui.node.RootForTest
 
 /**
- * The marker interface to be implemented by the [View] backing the composition.
- * To be used in tests.
+ * The marker interface to be implemented by the [View] backing the composition. To be used in
+ * tests.
  */
 @VisibleForTesting
 interface ViewRootForTest : RootForTest {
 
-    /**
-     * The view backing this Owner.
-     */
+    /** The view backing this Owner. */
     val view: View
 
-    /**
-     * Returns true when the associated LifecycleOwner is in the resumed state
-     */
+    /** Returns true when the associated LifecycleOwner is in the resumed state */
     val isLifecycleInResumedState: Boolean
 
-    /**
-     * Whether the Owner has pending layout work.
-     */
+    /** Whether the Owner has pending layout work. */
     val hasPendingMeasureOrLayout: Boolean
 
-    /**
-     * Called to invalidate the Android [View] sub-hierarchy handled by this [View].
-     */
+    /** Called to invalidate the Android [View] sub-hierarchy handled by this [View]. */
     fun invalidateDescendants()
 
     companion object {
         /**
          * Called after an View implementing [ViewRootForTest] is created. Used by
-         * AndroidComposeTestRule to keep track of all attached ComposeViews. Not to be
-         * set or used by any other component.
+         * AndroidComposeTestRule to keep track of all attached ComposeViews. Not to be set or used
+         * by any other component.
          */
-        @VisibleForTesting
-        var onViewCreatedCallback: ((ViewRootForTest) -> Unit)? = null
+        @VisibleForTesting var onViewCreatedCallback: ((ViewRootForTest) -> Unit)? = null
     }
 }
diff --git a/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/platform/WeakCache.android.kt b/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/platform/WeakCache.android.kt
index d3bfe77..05fcb89e 100644
--- a/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/platform/WeakCache.android.kt
+++ b/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/platform/WeakCache.android.kt
@@ -22,16 +22,16 @@
 import java.lang.ref.WeakReference
 
 /**
- * A simple collection that keeps values as [WeakReference]s.
- * Elements are added with [push] and removed with [pop].
+ * A simple collection that keeps values as [WeakReference]s. Elements are added with [push] and
+ * removed with [pop].
  */
 internal class WeakCache<T> {
     private val values = mutableVectorOf<Reference<T>>()
     private val referenceQueue = ReferenceQueue<T>()
 
     /**
-     * Add [element] to the collection as a [WeakReference]. It will be removed when
-     * garbage collected or from [pop].
+     * Add [element] to the collection as a [WeakReference]. It will be removed when garbage
+     * collected or from [pop].
      */
     fun push(element: T) {
         clearWeakReferences()
@@ -39,8 +39,8 @@
     }
 
     /**
-     * Remove an element from the collection and return it. If no element is
-     * available, `null` is returned.
+     * Remove an element from the collection and return it. If no element is available, `null` is
+     * returned.
      */
     fun pop(): T? {
         clearWeakReferences()
@@ -55,8 +55,8 @@
     }
 
     /**
-     * The number of elements currently in the collection. This may change between
-     * calls if the references have been garbage collected.
+     * The number of elements currently in the collection. This may change between calls if the
+     * references have been garbage collected.
      */
     val size: Int
         get() {
@@ -68,8 +68,7 @@
         do {
             val item: Reference<out T>? = referenceQueue.poll()
             if (item != null) {
-                @Suppress("UNCHECKED_CAST")
-                values.remove(item as Reference<T>)
+                @Suppress("UNCHECKED_CAST") values.remove(item as Reference<T>)
             }
         } while (item != null)
     }
diff --git a/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/platform/WindowRecomposer.android.kt b/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/platform/WindowRecomposer.android.kt
index da10086..60a4ec0 100644
--- a/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/platform/WindowRecomposer.android.kt
+++ b/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/platform/WindowRecomposer.android.kt
@@ -61,10 +61,9 @@
 import kotlinx.coroutines.launch
 
 /**
- * The [CompositionContext] that should be used as a parent for compositions at or below
- * this view in the hierarchy. Set to non-`null` to provide a [CompositionContext]
- * for compositions created by child views, or `null` to fall back to any [CompositionContext]
- * provided by ancestor views.
+ * The [CompositionContext] that should be used as a parent for compositions at or below this view
+ * in the hierarchy. Set to non-`null` to provide a [CompositionContext] for compositions created by
+ * child views, or `null` to fall back to any [CompositionContext] provided by ancestor views.
  *
  * See [findViewTreeCompositionContext].
  */
@@ -75,11 +74,10 @@
     }
 
 /**
- * Returns the parent [CompositionContext] for this point in the view hierarchy, or `null`
- * if none can be found.
+ * Returns the parent [CompositionContext] for this point in the view hierarchy, or `null` if none
+ * can be found.
  *
- * See [compositionContext] to get or set the parent [CompositionContext] for
- * a specific view.
+ * See [compositionContext] to get or set the parent [CompositionContext] for a specific view.
  */
 fun View.findViewTreeCompositionContext(): CompositionContext? {
     var found: CompositionContext? = compositionContext
@@ -112,43 +110,43 @@
 
             // TODO: Switch to callbackFlow when it becomes stable
             flow {
-                resolver.registerContentObserver(animationScaleUri, false, contentObserver)
-                try {
-                    for (value in channel) {
-                        val newValue = Settings.Global.getFloat(
-                            applicationContext.contentResolver,
-                            Settings.Global.ANIMATOR_DURATION_SCALE,
-                            1f
-                        )
-                        emit(newValue)
+                    resolver.registerContentObserver(animationScaleUri, false, contentObserver)
+                    try {
+                        for (value in channel) {
+                            val newValue =
+                                Settings.Global.getFloat(
+                                    applicationContext.contentResolver,
+                                    Settings.Global.ANIMATOR_DURATION_SCALE,
+                                    1f
+                                )
+                            emit(newValue)
+                        }
+                    } finally {
+                        resolver.unregisterContentObserver(contentObserver)
                     }
-                } finally {
-                    resolver.unregisterContentObserver(contentObserver)
                 }
-            }.stateIn(
-                MainScope(),
-                SharingStarted.WhileSubscribed(),
-                Settings.Global.getFloat(
-                    applicationContext.contentResolver,
-                    Settings.Global.ANIMATOR_DURATION_SCALE,
-                    1f
+                .stateIn(
+                    MainScope(),
+                    SharingStarted.WhileSubscribed(),
+                    Settings.Global.getFloat(
+                        applicationContext.contentResolver,
+                        Settings.Global.ANIMATOR_DURATION_SCALE,
+                        1f
+                    )
                 )
-            )
         }
     }
 }
 
-/**
- * A factory for creating an Android window-scoped [Recomposer]. See [createRecomposer].
- */
+/** A factory for creating an Android window-scoped [Recomposer]. See [createRecomposer]. */
 @InternalComposeUiApi
 fun interface WindowRecomposerFactory {
     /**
      * Get a [Recomposer] for the window where [windowRootView] is at the root of the window's
      * [View] hierarchy. The factory is responsible for establishing a policy for
-     * [shutting down][Recomposer.cancel] the returned [Recomposer]. [windowRootView] will
-     * hold a hard reference to the returned [Recomposer] until it [joins][Recomposer.join]
-     * after shutting down.
+     * [shutting down][Recomposer.cancel] the returned [Recomposer]. [windowRootView] will hold a
+     * hard reference to the returned [Recomposer] until it [joins][Recomposer.join] after shutting
+     * down.
      */
     fun createRecomposer(windowRootView: View): Recomposer
 
@@ -156,14 +154,13 @@
         /**
          * A [WindowRecomposerFactory] that creates **lifecycle-aware** [Recomposer]s.
          *
-         * Returned [Recomposer]s will be bound to the
-         * [LifecycleOwner] returned by [findViewTreeLifecycleOwner] registered
-         * at the [root][View.getRootView] of the view hierarchy and run
-         * [recomposition][Recomposer.runRecomposeAndApplyChanges] and composition effects on the
-         * [AndroidUiDispatcher.CurrentThread] for the window's UI thread. The associated
-         * [MonotonicFrameClock] will only produce frames when the [Lifecycle] is at least
-         * [Lifecycle.State.STARTED], causing animations and other uses of [MonotonicFrameClock]
-         * APIs to suspend until a **visible** frame will be produced.
+         * Returned [Recomposer]s will be bound to the [LifecycleOwner] returned by
+         * [findViewTreeLifecycleOwner] registered at the [root][View.getRootView] of the view
+         * hierarchy and run [recomposition][Recomposer.runRecomposeAndApplyChanges] and composition
+         * effects on the [AndroidUiDispatcher.CurrentThread] for the window's UI thread. The
+         * associated [MonotonicFrameClock] will only produce frames when the [Lifecycle] is at
+         * least [Lifecycle.State.STARTED], causing animations and other uses of
+         * [MonotonicFrameClock] APIs to suspend until a **visible** frame will be produced.
          */
         @OptIn(ExperimentalComposeUiApi::class)
         val LifecycleAware: WindowRecomposerFactory = WindowRecomposerFactory { rootView ->
@@ -175,16 +172,14 @@
 @InternalComposeUiApi
 object WindowRecomposerPolicy {
 
-    private val factory = AtomicReference<WindowRecomposerFactory>(
-        WindowRecomposerFactory.LifecycleAware
-    )
+    private val factory =
+        AtomicReference<WindowRecomposerFactory>(WindowRecomposerFactory.LifecycleAware)
 
     // Don't expose the actual AtomicReference as @PublishedApi; we might convert to atomicfu later
     @Suppress("ShowingMemberInHiddenClass")
     @PublishedApi
-    internal fun getAndSetFactory(
-        factory: WindowRecomposerFactory
-    ): WindowRecomposerFactory = this.factory.getAndSet(factory)
+    internal fun getAndSetFactory(factory: WindowRecomposerFactory): WindowRecomposerFactory =
+        this.factory.getAndSet(factory)
 
     @Suppress("ShowingMemberInHiddenClass")
     @PublishedApi
@@ -197,10 +192,7 @@
         this.factory.set(factory)
     }
 
-    inline fun <R> withFactory(
-        factory: WindowRecomposerFactory,
-        block: () -> R
-    ): R {
+    inline fun <R> withFactory(factory: WindowRecomposerFactory, block: () -> R): R {
         var cause: Throwable? = null
         val oldFactory = getAndSetFactory(factory)
         return try {
@@ -210,10 +202,11 @@
             throw t
         } finally {
             if (!compareAndSetFactory(factory, oldFactory)) {
-                val err = IllegalStateException(
-                    "WindowRecomposerFactory was set to unexpected value; cannot safely restore " +
-                        "old state"
-                )
+                val err =
+                    IllegalStateException(
+                        "WindowRecomposerFactory was set to unexpected value; cannot safely restore " +
+                            "old state"
+                    )
                 if (cause == null) throw err
                 cause.addSuppressed(err)
                 throw cause
@@ -228,27 +221,31 @@
 
         // If the Recomposer shuts down, unregister it so that a future request for a window
         // recomposer will consult the factory for a new one.
-        val unsetJob = GlobalScope.launch(
-            rootView.handler.asCoroutineDispatcher("windowRecomposer cleanup").immediate
-        ) {
-            try {
-                newRecomposer.join()
-            } finally {
-                // Unset if the view is detached. (See below for the attach state change listener.)
-                // Since this is in a finally in this coroutine, even if this job is cancelled we
-                // will resume on the window's UI thread and perform this manipulation there.
-                val viewTagRecomposer = rootView.compositionContext
-                if (viewTagRecomposer === newRecomposer) {
-                    rootView.compositionContext = null
+        val unsetJob =
+            GlobalScope.launch(
+                rootView.handler.asCoroutineDispatcher("windowRecomposer cleanup").immediate
+            ) {
+                try {
+                    newRecomposer.join()
+                } finally {
+                    // Unset if the view is detached. (See below for the attach state change
+                    // listener.)
+                    // Since this is in a finally in this coroutine, even if this job is cancelled
+                    // we
+                    // will resume on the window's UI thread and perform this manipulation there.
+                    val viewTagRecomposer = rootView.compositionContext
+                    if (viewTagRecomposer === newRecomposer) {
+                        rootView.compositionContext = null
+                    }
                 }
             }
-        }
 
         // If the root view is detached, cancel the await for recomposer shutdown above.
         // This will also unset the tag reference to this recomposer during its cleanup.
         rootView.addOnAttachStateChangeListener(
             object : View.OnAttachStateChangeListener {
                 override fun onViewAttachedToWindow(v: View) {}
+
                 override fun onViewDetachedFromWindow(v: View) {
                     v.removeOnAttachStateChangeListener(this)
                     // cancel the job to clean up the view tags.
@@ -265,9 +262,9 @@
 }
 
 /**
- * Find the "content child" for this view. The content child is the view that is either
- * a direct child of the view with id [android.R.id.content] (and was therefore set as a
- * content view into an activity or dialog window) or the root view of the window.
+ * Find the "content child" for this view. The content child is the view that is either a direct
+ * child of the view with id [android.R.id.content] (and was therefore set as a content view into an
+ * activity or dialog window) or the root view of the window.
  *
  * This is used as opposed to [View.getRootView] as the Android framework can reuse an activity
  * window's decor views across activity recreation events. Since a window recomposer is associated
@@ -287,9 +284,9 @@
     }
 
 /**
- * Get or lazily create a [Recomposer] for this view's window. The view must be attached
- * to a window with the [LifecycleOwner] returned by [findViewTreeLifecycleOwner] registered at
- * the root to access this property.
+ * Get or lazily create a [Recomposer] for this view's window. The view must be attached to a window
+ * with the [LifecycleOwner] returned by [findViewTreeLifecycleOwner] registered at the root to
+ * access this property.
  */
 @OptIn(InternalComposeUiApi::class)
 internal val View.windowRecomposer: Recomposer
@@ -306,22 +303,22 @@
     }
 
 /**
- * Create a [Lifecycle] and [window attachment][View.isAttachedToWindow]-aware [Recomposer] for
- * this [View] with the same behavior as [WindowRecomposerFactory.LifecycleAware].
+ * Create a [Lifecycle] and [window attachment][View.isAttachedToWindow]-aware [Recomposer] for this
+ * [View] with the same behavior as [WindowRecomposerFactory.LifecycleAware].
  *
  * [coroutineContext] will override any [CoroutineContext] elements from the default configuration
  * normally used for this content view. The default [CoroutineContext] contains
- * [AndroidUiDispatcher.CurrentThread]; this function should only be called from the UI thread
- * of this [View] or its intended UI thread if it is currently detached.
+ * [AndroidUiDispatcher.CurrentThread]; this function should only be called from the UI thread of
+ * this [View] or its intended UI thread if it is currently detached.
  *
- * If [lifecycle] is `null` or not supplied the [LifecycleOwner] returned by [findViewTreeLifecycleOwner]
- * will be used; if a non-null [lifecycle] is not provided and a ViewTreeLifecycleOwner is not present
- * an [IllegalStateException] will be thrown.
+ * If [lifecycle] is `null` or not supplied the [LifecycleOwner] returned by
+ * [findViewTreeLifecycleOwner] will be used; if a non-null [lifecycle] is not provided and a
+ * ViewTreeLifecycleOwner is not present an [IllegalStateException] will be thrown.
  *
  * The returned [Recomposer] will be [cancelled][Recomposer.cancel] when this [View] is detached
  * from a window or if its determined [Lifecycle] is [destroyed][Lifecycle.Event.ON_DESTROY].
- * Recomposition and associated [frame-based][MonotonicFrameClock] effects may be throttled
- * or paused while the [Lifecycle] is not at least [Lifecycle.State.STARTED].
+ * Recomposition and associated [frame-based][MonotonicFrameClock] effects may be throttled or
+ * paused while the [Lifecycle] is not at least [Lifecycle.State.STARTED].
  */
 @ExperimentalComposeUiApi
 fun View.createLifecycleAwareWindowRecomposer(
@@ -330,25 +327,25 @@
 ): Recomposer {
     // Only access AndroidUiDispatcher.CurrentThread if we would use an element from it,
     // otherwise prevent lazy initialization.
-    val baseContext = if (coroutineContext[ContinuationInterceptor] == null ||
-        coroutineContext[MonotonicFrameClock] == null
-    ) {
-        AndroidUiDispatcher.CurrentThread + coroutineContext
-    } else coroutineContext
-    val pausableClock = baseContext[MonotonicFrameClock]?.let {
-        PausableMonotonicFrameClock(it).apply { pause() }
-    }
+    val baseContext =
+        if (
+            coroutineContext[ContinuationInterceptor] == null ||
+                coroutineContext[MonotonicFrameClock] == null
+        ) {
+            AndroidUiDispatcher.CurrentThread + coroutineContext
+        } else coroutineContext
+    val pausableClock =
+        baseContext[MonotonicFrameClock]?.let { PausableMonotonicFrameClock(it).apply { pause() } }
 
     var systemDurationScaleSettingConsumer: MotionDurationScaleImpl? = null
-    val motionDurationScale = baseContext[MotionDurationScale] ?: MotionDurationScaleImpl().also {
-        systemDurationScaleSettingConsumer = it
-    }
+    val motionDurationScale =
+        baseContext[MotionDurationScale]
+            ?: MotionDurationScaleImpl().also { systemDurationScaleSettingConsumer = it }
 
     val contextWithClockAndMotionScale =
         baseContext + (pausableClock ?: EmptyCoroutineContext) + motionDurationScale
-    val recomposer = Recomposer(contextWithClockAndMotionScale).also {
-        it.pauseCompositionFrameClock()
-    }
+    val recomposer =
+        Recomposer(contextWithClockAndMotionScale).also { it.pauseCompositionFrameClock() }
     val runRecomposeScope = CoroutineScope(contextWithClockAndMotionScale)
     val viewTreeLifecycle =
         checkPreconditionNotNull(lifecycle ?: findViewTreeLifecycleOwner()?.lifecycle) {
@@ -362,6 +359,7 @@
     addOnAttachStateChangeListener(
         object : View.OnAttachStateChangeListener {
             override fun onViewAttachedToWindow(v: View) {}
+
             override fun onViewDetachedFromWindow(v: View) {
                 removeOnAttachStateChangeListener(this)
                 recomposer.cancel()
@@ -370,10 +368,7 @@
     )
     viewTreeLifecycle.addObserver(
         object : LifecycleEventObserver {
-            override fun onStateChanged(
-                source: LifecycleOwner,
-                event: Lifecycle.Event
-            ) {
+            override fun onStateChanged(source: LifecycleOwner, event: Lifecycle.Event) {
                 val self = this
                 when (event) {
                     Lifecycle.Event.ON_CREATE -> {
@@ -382,17 +377,17 @@
                         runRecomposeScope.launch(start = CoroutineStart.UNDISPATCHED) {
                             var durationScaleJob: Job? = null
                             try {
-                                durationScaleJob = systemDurationScaleSettingConsumer?.let {
-                                    val durationScaleStateFlow = getAnimationScaleFlowFor(
-                                        context.applicationContext
-                                    )
-                                    it.scaleFactor = durationScaleStateFlow.value
-                                    launch {
-                                        durationScaleStateFlow.collect { scaleFactor ->
-                                            it.scaleFactor = scaleFactor
+                                durationScaleJob =
+                                    systemDurationScaleSettingConsumer?.let {
+                                        val durationScaleStateFlow =
+                                            getAnimationScaleFlowFor(context.applicationContext)
+                                        it.scaleFactor = durationScaleStateFlow.value
+                                        launch {
+                                            durationScaleStateFlow.collect { scaleFactor ->
+                                                it.scaleFactor = scaleFactor
+                                            }
                                         }
                                     }
-                                }
                                 recomposer.runRecomposeAndApplyChanges()
                             } finally {
                                 durationScaleJob?.cancel()
diff --git a/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/platform/Wrapper.android.kt b/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/platform/Wrapper.android.kt
index f51dcad..089a705 100644
--- a/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/platform/Wrapper.android.kt
+++ b/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/platform/Wrapper.android.kt
@@ -43,20 +43,17 @@
 internal actual fun createSubcomposition(
     container: LayoutNode,
     parent: CompositionContext
-): ReusableComposition = ReusableComposition(
-    UiApplier(container),
-    parent
-)
+): ReusableComposition = ReusableComposition(UiApplier(container), parent)
 
 /**
  * Composes the given composable into the given view.
  *
- * The new composition can be logically "linked" to an existing one, by providing a
- * [parent]. This will ensure that invalidations and CompositionLocals will flow through
- * the two compositions as if they were not separate.
+ * The new composition can be logically "linked" to an existing one, by providing a [parent]. This
+ * will ensure that invalidations and CompositionLocals will flow through the two compositions as if
+ * they were not separate.
  *
- * Note that this [ViewGroup] should have an unique id for the saved instance state mechanism to
- * be able to save and restore the values used within the composition. See [View.setId].
+ * Note that this [ViewGroup] should have an unique id for the saved instance state mechanism to be
+ * able to save and restore the values used within the composition. See [View.setId].
  *
  * @param parent The [Recomposer] or parent composition reference.
  * @param content Composable that will be the content of the view.
@@ -70,10 +67,12 @@
         if (childCount > 0) {
             getChildAt(0) as? AndroidComposeView
         } else {
-            removeAllViews(); null
-        } ?: AndroidComposeView(context, parent.effectCoroutineContext).also {
-            addView(it.view, DefaultLayoutParams)
+            removeAllViews()
+            null
         }
+            ?: AndroidComposeView(context, parent.effectCoroutineContext).also {
+                addView(it.view, DefaultLayoutParams)
+            }
     return doSetContent(composeView, parent, content)
 }
 
@@ -89,11 +88,11 @@
         )
     }
     val original = Composition(UiApplier(owner.root), parent)
-    val wrapped = owner.view.getTag(R.id.wrapped_composition_tag)
-        as? WrappedComposition
-        ?: WrappedComposition(owner, original).also {
-            owner.view.setTag(R.id.wrapped_composition_tag, it)
-        }
+    val wrapped =
+        owner.view.getTag(R.id.wrapped_composition_tag) as? WrappedComposition
+            ?: WrappedComposition(owner, original).also {
+                owner.view.setTag(R.id.wrapped_composition_tag, it)
+            }
     wrapped.setContent(content)
 
     // When the CoroutineContext between the owner and parent doesn't match, we need to reset it
@@ -108,10 +107,8 @@
     return wrapped
 }
 
-private class WrappedComposition(
-    val owner: AndroidComposeView,
-    val original: Composition
-) : Composition, LifecycleEventObserver, CompositionServices {
+private class WrappedComposition(val owner: AndroidComposeView, val original: Composition) :
+    Composition, LifecycleEventObserver, CompositionServices {
 
     private var disposed = false
     private var addedToLifecycle: Lifecycle? = null
@@ -128,11 +125,10 @@
                     lifecycle.addObserver(this)
                 } else if (lifecycle.currentState.isAtLeast(Lifecycle.State.CREATED)) {
                     original.setContent {
-
                         @Suppress("UNCHECKED_CAST")
                         val inspectionTable =
-                            owner.getTag(R.id.inspection_slot_table_set) as?
-                                MutableSet<CompositionData>
+                            owner.getTag(R.id.inspection_slot_table_set)
+                                as? MutableSet<CompositionData>
                                 ?: (owner.parent as? View)?.getTag(R.id.inspection_slot_table_set)
                                     as? MutableSet<CompositionData>
                         if (inspectionTable != null) {
@@ -141,12 +137,8 @@
                         }
 
                         // TODO(mnuzen): Combine the two boundsUpdatesLoop() into one LaunchedEffect
-                        LaunchedEffect(owner) {
-                            owner.boundsUpdatesAccessibilityEventLoop()
-                        }
-                        LaunchedEffect(owner) {
-                            owner.boundsUpdatesContentCaptureEventLoop()
-                        }
+                        LaunchedEffect(owner) { owner.boundsUpdatesAccessibilityEventLoop() }
+                        LaunchedEffect(owner) { owner.boundsUpdatesContentCaptureEventLoop() }
 
                         CompositionLocalProvider(LocalInspectionTables provides inspectionTable) {
                             ProvideAndroidCompositionLocals(owner, content)
@@ -166,8 +158,11 @@
         original.dispose()
     }
 
-    override val hasInvalidations get() = original.hasInvalidations
-    override val isDisposed: Boolean get() = original.isDisposed
+    override val hasInvalidations
+        get() = original.hasInvalidations
+
+    override val isDisposed: Boolean
+        get() = original.isDisposed
 
     override fun onStateChanged(source: LifecycleOwner, event: Lifecycle.Event) {
         if (event == Lifecycle.Event.ON_DESTROY) {
@@ -183,7 +178,5 @@
         (original as? CompositionServices)?.getCompositionService(key)
 }
 
-private val DefaultLayoutParams = ViewGroup.LayoutParams(
-    ViewGroup.LayoutParams.WRAP_CONTENT,
-    ViewGroup.LayoutParams.WRAP_CONTENT
-)
+private val DefaultLayoutParams =
+    ViewGroup.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT)
diff --git a/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/platform/accessibility/CollectionInfo.android.kt b/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/platform/accessibility/CollectionInfo.android.kt
index 9a9447e..b51837eb 100644
--- a/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/platform/accessibility/CollectionInfo.android.kt
+++ b/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/platform/accessibility/CollectionInfo.android.kt
@@ -96,14 +96,15 @@
 
         if (groupedChildren.isNotEmpty()) {
             val isHorizontal = calculateIfHorizontallyStacked(groupedChildren)
-            val itemInfo = AccessibilityNodeInfoCompat.CollectionItemInfoCompat.obtain(
-                if (isHorizontal) 0 else index,
-                1,
-                if (isHorizontal) index else 0,
-                1,
-                false,
-                node.config.getOrElse(SemanticsProperties.Selected) { false }
-            )
+            val itemInfo =
+                AccessibilityNodeInfoCompat.CollectionItemInfoCompat.obtain(
+                    if (isHorizontal) 0 else index,
+                    1,
+                    if (isHorizontal) index else 0,
+                    1,
+                    false,
+                    node.config.getOrElse(SemanticsProperties.Selected) { false }
+                )
             if (itemInfo != null) {
                 info.setCollectionItemInfo(itemInfo)
             }
@@ -119,20 +120,23 @@
 private fun calculateIfHorizontallyStacked(items: List<SemanticsNode>): Boolean {
     if (items.count() < 2) return true
 
-    val deltas = items.fastZipWithNext { el1, el2 ->
-        Offset(
-            abs(el1.boundsInRoot.center.x - el2.boundsInRoot.center.x),
-            abs(el1.boundsInRoot.center.y - el2.boundsInRoot.center.y)
-        )
-    }
-    val (deltaX, deltaY) = when (deltas.count()) {
-        1 -> deltas.first()
-        else -> deltas.fastReduce { result, element -> result + element }
-    }
+    val deltas =
+        items.fastZipWithNext { el1, el2 ->
+            Offset(
+                abs(el1.boundsInRoot.center.x - el2.boundsInRoot.center.x),
+                abs(el1.boundsInRoot.center.y - el2.boundsInRoot.center.y)
+            )
+        }
+    val (deltaX, deltaY) =
+        when (deltas.count()) {
+            1 -> deltas.first()
+            else -> deltas.fastReduce { result, element -> result + element }
+        }
     return deltaY < deltaX
 }
 
-private val CollectionInfo.isLazyCollection get() = rowCount < 0 || columnCount < 0
+private val CollectionInfo.isLazyCollection
+    get() = rowCount < 0 || columnCount < 0
 
 private fun CollectionInfo.toAccessibilityCollectionInfo() =
     AccessibilityNodeInfoCompat.CollectionInfoCompat.obtain(
diff --git a/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/platform/actionmodecallback/FloatingTextActionModeCallback.android.kt b/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/platform/actionmodecallback/FloatingTextActionModeCallback.android.kt
index faa36c9..b340ab4 100644
--- a/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/platform/actionmodecallback/FloatingTextActionModeCallback.android.kt
+++ b/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/platform/actionmodecallback/FloatingTextActionModeCallback.android.kt
@@ -24,9 +24,8 @@
 import androidx.annotation.RequiresApi
 
 @RequiresApi(23)
-internal class FloatingTextActionModeCallback(
-    private val callback: TextActionModeCallback
-) : ActionMode.Callback2() {
+internal class FloatingTextActionModeCallback(private val callback: TextActionModeCallback) :
+    ActionMode.Callback2() {
     override fun onActionItemClicked(mode: ActionMode?, item: MenuItem?): Boolean {
         return callback.onActionItemClicked(mode, item)
     }
@@ -43,17 +42,8 @@
         callback.onDestroyActionMode()
     }
 
-    override fun onGetContentRect(
-        mode: ActionMode?,
-        view: View?,
-        outRect: Rect?
-    ) {
+    override fun onGetContentRect(mode: ActionMode?, view: View?, outRect: Rect?) {
         val rect = callback.rect
-        outRect?.set(
-            rect.left.toInt(),
-            rect.top.toInt(),
-            rect.right.toInt(),
-            rect.bottom.toInt()
-        )
+        outRect?.set(rect.left.toInt(), rect.top.toInt(), rect.right.toInt(), rect.bottom.toInt())
     }
 }
diff --git a/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/platform/actionmodecallback/PrimaryTextActionModeCallback.android.kt b/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/platform/actionmodecallback/PrimaryTextActionModeCallback.android.kt
index 9d711b6..3d004e8 100644
--- a/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/platform/actionmodecallback/PrimaryTextActionModeCallback.android.kt
+++ b/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/platform/actionmodecallback/PrimaryTextActionModeCallback.android.kt
@@ -20,9 +20,8 @@
 import android.view.Menu
 import android.view.MenuItem
 
-internal class PrimaryTextActionModeCallback(
-    private val callback: TextActionModeCallback
-) : ActionMode.Callback {
+internal class PrimaryTextActionModeCallback(private val callback: TextActionModeCallback) :
+    ActionMode.Callback {
     override fun onActionItemClicked(mode: ActionMode?, item: MenuItem?): Boolean {
         return callback.onActionItemClicked(mode, item)
     }
diff --git a/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/platform/actionmodecallback/TextActionModeCallback.android.kt b/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/platform/actionmodecallback/TextActionModeCallback.android.kt
index a1d60a6..acfebed 100644
--- a/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/platform/actionmodecallback/TextActionModeCallback.android.kt
+++ b/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/platform/actionmodecallback/TextActionModeCallback.android.kt
@@ -34,18 +34,10 @@
         requireNotNull(menu) { "onCreateActionMode requires a non-null menu" }
         requireNotNull(mode) { "onCreateActionMode requires a non-null mode" }
 
-        onCopyRequested?.let {
-            addMenuItem(menu, MenuItemOption.Copy)
-        }
-        onPasteRequested?.let {
-            addMenuItem(menu, MenuItemOption.Paste)
-        }
-        onCutRequested?.let {
-            addMenuItem(menu, MenuItemOption.Cut)
-        }
-        onSelectAllRequested?.let {
-            addMenuItem(menu, MenuItemOption.SelectAll)
-        }
+        onCopyRequested?.let { addMenuItem(menu, MenuItemOption.Copy) }
+        onPasteRequested?.let { addMenuItem(menu, MenuItemOption.Paste) }
+        onCutRequested?.let { addMenuItem(menu, MenuItemOption.Cut) }
+        onSelectAllRequested?.let { addMenuItem(menu, MenuItemOption.SelectAll) }
         return true
     }
 
@@ -82,15 +74,12 @@
     }
 
     internal fun addMenuItem(menu: Menu, item: MenuItemOption) {
-        menu.add(0, item.id, item.order, item.titleResource)
+        menu
+            .add(0, item.id, item.order, item.titleResource)
             .setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM)
     }
 
-    private fun addOrRemoveMenuItem(
-        menu: Menu,
-        item: MenuItemOption,
-        callback: (() -> Unit)?
-    ) {
+    private fun addOrRemoveMenuItem(menu: Menu, item: MenuItemOption, callback: (() -> Unit)?) {
         when {
             callback != null && menu.findItem(item.id) == null -> addMenuItem(menu, item)
             callback == null && menu.findItem(item.id) != null -> menu.removeItem(item.id)
@@ -105,15 +94,14 @@
     SelectAll(3);
 
     val titleResource: Int
-        get() = when (this) {
-            Copy -> android.R.string.copy
-            Paste -> android.R.string.paste
-            Cut -> android.R.string.cut
-            SelectAll -> android.R.string.selectAll
-        }
+        get() =
+            when (this) {
+                Copy -> android.R.string.copy
+                Paste -> android.R.string.paste
+                Cut -> android.R.string.cut
+                SelectAll -> android.R.string.selectAll
+            }
 
-    /**
-     * This item will be shown before all items that have order greater than this value.
-     */
+    /** This item will be shown before all items that have order greater than this value. */
     val order = id
 }
diff --git a/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/res/ColorResources.android.kt b/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/res/ColorResources.android.kt
index 257c8b5..1bc45f1 100644
--- a/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/res/ColorResources.android.kt
+++ b/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/res/ColorResources.android.kt
@@ -39,8 +39,7 @@
     return if (Build.VERSION.SDK_INT >= 23) {
         ColorResourceHelper.getColor(context, id)
     } else {
-        @Suppress("DEPRECATION")
-        Color(context.resources.getColor(id))
+        @Suppress("DEPRECATION") Color(context.resources.getColor(id))
     }
 }
 
diff --git a/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/res/FontResources.android.kt b/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/res/FontResources.android.kt
index 9203d2b..7fcd09b 100644
--- a/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/res/FontResources.android.kt
+++ b/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/res/FontResources.android.kt
@@ -29,11 +29,10 @@
 private val cacheLock = Object()
 
 /**
- * This cache is expected to be used for SystemFontFamily or LoadedFontFamily.
- * FontFamily instance cannot be used as the file based FontFamily.
+ * This cache is expected to be used for SystemFontFamily or LoadedFontFamily. FontFamily instance
+ * cannot be used as the file based FontFamily.
  */
-@GuardedBy("cacheLock")
-private val syncLoadedTypefaces = mutableMapOf<FontFamily, Typeface>()
+@GuardedBy("cacheLock") private val syncLoadedTypefaces = mutableMapOf<FontFamily, Typeface>()
 
 /**
  * Synchronously load an font from [FontFamily].
@@ -46,9 +45,8 @@
 @ReadOnlyComposable
 @Deprecated(
     "Prefer to preload fonts using FontFamily.Resolver.",
-    replaceWith = ReplaceWith(
-        "FontFamily.Resolver.preload(fontFamily, Font.AndroidResourceLoader(context))"
-    ),
+    replaceWith =
+        ReplaceWith("FontFamily.Resolver.preload(fontFamily, Font.AndroidResourceLoader(context))"),
     level = DeprecationLevel.WARNING
 )
 fun fontResource(fontFamily: FontFamily): Typeface {
@@ -58,17 +56,14 @@
 @Suppress("DEPRECATION")
 @Deprecated(
     "Prefer to preload fonts using FontFamily.Resolver.",
-    replaceWith = ReplaceWith(
-        "FontFamily.Resolver.preload(fontFamily, Font.AndroidResourceLoader(context))"
-    ),
+    replaceWith =
+        ReplaceWith("FontFamily.Resolver.preload(fontFamily, Font.AndroidResourceLoader(context))"),
     level = DeprecationLevel.WARNING
 )
 private fun fontResourceFromContext(context: Context, a: FontFamily): Typeface {
     if (a is SystemFontFamily || a is LoadedFontFamily) {
         synchronized(cacheLock) {
-            return syncLoadedTypefaces.getOrPut(a) {
-                Typeface(context, a)
-            }
+            return syncLoadedTypefaces.getOrPut(a) { Typeface(context, a) }
         }
     } else {
         return Typeface(context, a)
diff --git a/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/res/ImageResources.android.kt b/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/res/ImageResources.android.kt
index e679a116..90930e7 100644
--- a/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/res/ImageResources.android.kt
+++ b/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/res/ImageResources.android.kt
@@ -29,9 +29,9 @@
 /**
  * Load an ImageBitmap from an image resource.
  *
- * This function is intended to be used for when low-level ImageBitmap-specific
- * functionality is required.  For simply displaying onscreen, the vector/bitmap-agnostic
- * [painterResource] is recommended instead.
+ * This function is intended to be used for when low-level ImageBitmap-specific functionality is
+ * required. For simply displaying onscreen, the vector/bitmap-agnostic [painterResource] is
+ * recommended instead.
  *
  * @return Loaded image file represented as an [ImageBitmap]
  */
@@ -42,9 +42,9 @@
 /**
  * Load an ImageBitmap from an image resource.
  *
- * This function is intended to be used for when low-level ImageBitmap-specific
- * functionality is required.  For simply displaying onscreen, the vector/bitmap-agnostic
- * [painterResource] is recommended instead.
+ * This function is intended to be used for when low-level ImageBitmap-specific functionality is
+ * required. For simply displaying onscreen, the vector/bitmap-agnostic [painterResource] is
+ * recommended instead.
  *
  * @param id the resource identifier
  * @return the decoded image data associated with the resource
diff --git a/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/res/PainterResources.android.kt b/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/res/PainterResources.android.kt
index 57370ff..6587316 100644
--- a/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/res/PainterResources.android.kt
+++ b/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/res/PainterResources.android.kt
@@ -37,21 +37,21 @@
 /**
  * Create a [Painter] from an Android resource id. This can load either an instance of
  * [BitmapPainter] or [VectorPainter] for [ImageBitmap] based assets or vector based assets
- * respectively. The resources with the given id must point to either fully rasterized
- * images (ex. PNG or JPG files) or VectorDrawable xml assets. API based xml Drawables
- * are not supported here.
+ * respectively. The resources with the given id must point to either fully rasterized images (ex.
+ * PNG or JPG files) or VectorDrawable xml assets. API based xml Drawables are not supported here.
  *
  * Example:
+ *
  * @sample androidx.compose.ui.samples.PainterResourceSample
  *
- * Alternative Drawable implementations can be used with compose by calling
- * [drawIntoCanvas] and drawing with the Android framework canvas provided through [nativeCanvas]
+ * Alternative Drawable implementations can be used with compose by calling [drawIntoCanvas] and
+ * drawing with the Android framework canvas provided through [nativeCanvas]
  *
  * Example:
+ *
  * @sample androidx.compose.ui.samples.AndroidDrawableInDrawScopeSample
  *
  * @param id Resources object to query the image file from
- *
  * @return [Painter] used for drawing the loaded resource
  */
 @Composable
@@ -71,17 +71,16 @@
         rememberVectorPainter(imageVector)
     } else {
         // Otherwise load the bitmap resource
-        val imageBitmap = remember(path, id, context.theme) {
-            loadImageBitmapResource(path, res, id)
-        }
+        val imageBitmap =
+            remember(path, id, context.theme) { loadImageBitmapResource(path, res, id) }
         BitmapPainter(imageBitmap)
     }
 }
 
 /**
- * Helper method to validate that the xml resource is a vector drawable then load
- * the ImageVector. Because this throws exceptions we cannot have this implementation as part of
- * the composable implementation it is invoked in.
+ * Helper method to validate that the xml resource is a vector drawable then load the ImageVector.
+ * Because this throws exceptions we cannot have this implementation as part of the composable
+ * implementation it is invoked in.
  */
 @Composable
 private fun loadVectorResource(
@@ -105,9 +104,9 @@
 }
 
 /**
- * Helper method to validate the asset resource is a supported resource type and returns
- * an ImageBitmap resource. Because this throws exceptions we cannot have this implementation
- * as part of the composable implementation it is invoked in.
+ * Helper method to validate the asset resource is a supported resource type and returns an
+ * ImageBitmap resource. Because this throws exceptions we cannot have this implementation as part
+ * of the composable implementation it is invoked in.
  */
 private fun loadImageBitmapResource(path: CharSequence, res: Resources, id: Int): ImageBitmap {
     try {
@@ -117,13 +116,9 @@
     }
 }
 
-/**
- * [Throwable] that is thrown in situations where a resource failed to load.
- */
-class ResourceResolutionException(
-    message: String,
-    cause: Throwable
-) : RuntimeException(message, cause)
+/** [Throwable] that is thrown in situations where a resource failed to load. */
+class ResourceResolutionException(message: String, cause: Throwable) :
+    RuntimeException(message, cause)
 
 private const val errorMessage =
     "Only VectorDrawables and rasterized asset types are supported ex. PNG, JPG, WEBP"
diff --git a/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/res/Resources.android.kt b/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/res/Resources.android.kt
index ef5d021..f8a2c21 100644
--- a/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/res/Resources.android.kt
+++ b/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/res/Resources.android.kt
@@ -41,14 +41,11 @@
     private val resIdPathMap = MutableIntObjectMap<TypedValue>()
 
     /**
-     * Resolve the path of the provided resource identifier within the given resources object.
-     * This first checks its internal cache before attempting to resolve the resource with the
-     * Android resource system
+     * Resolve the path of the provided resource identifier within the given resources object. This
+     * first checks its internal cache before attempting to resolve the resource with the Android
+     * resource system
      */
-    fun resolveResourcePath(
-        res: Resources,
-        @DrawableRes id: Int
-    ): TypedValue {
+    fun resolveResourcePath(res: Resources, @DrawableRes id: Int): TypedValue {
         synchronized(this) {
             var value = resIdPathMap[id]
             if (value == null) {
@@ -61,8 +58,6 @@
     }
 
     fun clear() {
-        synchronized(this) {
-            resIdPathMap.clear()
-        }
+        synchronized(this) { resIdPathMap.clear() }
     }
 }
diff --git a/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/res/VectorResources.android.kt b/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/res/VectorResources.android.kt
index 61ae249..7a40e2c 100644
--- a/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/res/VectorResources.android.kt
+++ b/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/res/VectorResources.android.kt
@@ -37,9 +37,9 @@
 /**
  * Load an ImageVector from a vector resource.
  *
- * This function is intended to be used for when low-level ImageVector-specific
- * functionality is required.  For simply displaying onscreen, the vector/bitmap-agnostic
- * [painterResource] is recommended instead.
+ * This function is intended to be used for when low-level ImageVector-specific functionality is
+ * required. For simply displaying onscreen, the vector/bitmap-agnostic [painterResource] is
+ * recommended instead.
  *
  * @param id the resource identifier
  * @return the vector data associated with the resource
@@ -50,9 +50,7 @@
     val res = resources()
     val theme = context.theme
 
-    return remember(id, res, theme, res.configuration) {
-        vectorResource(theme, res, id)
-    }
+    return remember(id, res, theme, res.configuration) { vectorResource(theme, res, id) }
 }
 
 @Throws(XmlPullParserException::class)
@@ -65,16 +63,17 @@
     res.getValue(resId, value, true)
 
     return loadVectorResourceInner(
-        theme,
-        res,
-        res.getXml(resId).apply { seekToStartTag() },
-        value.changingConfigurations
-    ).imageVector
+            theme,
+            res,
+            res.getXml(resId).apply { seekToStartTag() },
+            value.changingConfigurations
+        )
+        .imageVector
 }
 
 /**
- * Helper method that parses a vector asset from the given [XmlResourceParser] position.
- * This method assumes the parser is already been positioned to the start tag
+ * Helper method that parses a vector asset from the given [XmlResourceParser] position. This method
+ * assumes the parser is already been positioned to the start tag
  */
 @Throws(XmlPullParserException::class)
 internal fun loadVectorResourceInner(
@@ -89,41 +88,28 @@
 
     var nestedGroups = 0
     while (!parser.isAtEnd()) {
-        nestedGroups = resourceParser.parseCurrentVectorNode(
-            res,
-            attrs,
-            theme,
-            builder,
-            nestedGroups
-        )
+        nestedGroups =
+            resourceParser.parseCurrentVectorNode(res, attrs, theme, builder, nestedGroups)
         parser.next()
     }
     return ImageVectorCache.ImageVectorEntry(builder.build(), changingConfigurations)
 }
 
 /**
- * Object responsible for caching [ImageVector] instances
- * based on the given theme and drawable resource identifier
+ * Object responsible for caching [ImageVector] instances based on the given theme and drawable
+ * resource identifier
  */
 internal class ImageVectorCache {
 
-    /**
-     * Key that binds the corresponding theme with the resource identifier for the vector asset
-     */
-    data class Key(
-        val theme: Resources.Theme,
-        val id: Int
-    )
+    /** Key that binds the corresponding theme with the resource identifier for the vector asset */
+    data class Key(val theme: Resources.Theme, val id: Int)
 
     /**
-     * Tuple that contains the [ImageVector] as well as the corresponding configuration flags
-     * that the [ImageVector] depends on. That is if there is a configuration change that updates
-     * the parameters in the flag, this vector should be regenerated from the current configuration
+     * Tuple that contains the [ImageVector] as well as the corresponding configuration flags that
+     * the [ImageVector] depends on. That is if there is a configuration change that updates the
+     * parameters in the flag, this vector should be regenerated from the current configuration
      */
-    data class ImageVectorEntry(
-        val imageVector: ImageVector,
-        val configFlags: Int
-    )
+    data class ImageVectorEntry(val imageVector: ImageVector, val configFlags: Int)
 
     private val map = HashMap<Key, WeakReference<ImageVectorEntry>>()
 
@@ -134,8 +120,9 @@
         while (it.hasNext()) {
             val entry = it.next()
             val imageVectorEntry = entry.value.get()
-            if (imageVectorEntry == null ||
-                Configuration.needNewResources(configChanges, imageVectorEntry.configFlags)
+            if (
+                imageVectorEntry == null ||
+                    Configuration.needNewResources(configChanges, imageVectorEntry.configFlags)
             ) {
                 it.remove()
             }
diff --git a/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/scrollcapture/ComposeScrollCaptureCallback.android.kt b/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/scrollcapture/ComposeScrollCaptureCallback.android.kt
index 66ad43f..9544073 100644
--- a/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/scrollcapture/ComposeScrollCaptureCallback.android.kt
+++ b/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/scrollcapture/ComposeScrollCaptureCallback.android.kt
@@ -53,9 +53,9 @@
 /**
  * Implementation of [ScrollCaptureCallback] that captures Compose scroll containers.
  *
- * This callback interacts with the scroll container via semantics, namely [ScrollByOffset],
- * and supports any container that publishes that action – whether the size of the scroll contents
- * are known or not (e.g. `LazyColumn`). Pixels are captured by drawing the node directly after each
+ * This callback interacts with the scroll container via semantics, namely [ScrollByOffset], and
+ * supports any container that publishes that action – whether the size of the scroll contents are
+ * known or not (e.g. `LazyColumn`). Pixels are captured by drawing the node directly after each
  * scroll operation.
  */
 @RequiresApi(31)
@@ -68,24 +68,27 @@
     // Don't animate scrollByOffset calls.
     private val coroutineScope = coroutineScope + DisableAnimationMotionDurationScale
 
-    private val scrollTracker = RelativeScroller(
-        viewportSize = viewportBoundsInWindow.height,
-        scrollBy = { delta ->
-            val scrollByOffset = checkPreconditionNotNull(node.scrollCaptureScrollByAction)
-            val reverseScrolling = node.unmergedConfig[VerticalScrollAxisRange].reverseScrolling
+    private val scrollTracker =
+        RelativeScroller(
+            viewportSize = viewportBoundsInWindow.height,
+            scrollBy = { delta ->
+                val scrollByOffset = checkPreconditionNotNull(node.scrollCaptureScrollByAction)
+                val reverseScrolling = node.unmergedConfig[VerticalScrollAxisRange].reverseScrolling
 
-            val actualDelta = if (reverseScrolling) -delta else delta
-            if (DEBUG) Log.d(
-                TAG, "scrolling by delta $actualDelta " +
-                    "(reverseScrolling=$reverseScrolling, requested delta=$delta)"
-            )
+                val actualDelta = if (reverseScrolling) -delta else delta
+                if (DEBUG)
+                    Log.d(
+                        TAG,
+                        "scrolling by delta $actualDelta " +
+                            "(reverseScrolling=$reverseScrolling, requested delta=$delta)"
+                    )
 
-            // This action may animate, ensure any calls to this RelativeScroll are done with a
-            // coroutine context that disables animations.
-            val consumed = scrollByOffset(Offset(0f, actualDelta))
-            if (reverseScrolling) -consumed.y else consumed.y
-        }
-    )
+                // This action may animate, ensure any calls to this RelativeScroll are done with a
+                // coroutine context that disables animations.
+                val consumed = scrollByOffset(Offset(0f, actualDelta))
+                if (reverseScrolling) -consumed.y else consumed.y
+            }
+        )
 
     /** Only used when [DEBUG] is true. */
     private var requestCount = 0
@@ -136,10 +139,8 @@
         val viewportClippedMin = scrollTracker.mapOffsetToViewport(targetMin)
         val viewportClippedMax = scrollTracker.mapOffsetToViewport(targetMax)
         if (DEBUG) Log.d(TAG, "drawing viewport $viewportClippedMin..$viewportClippedMax")
-        val viewportClippedRect = captureArea.copy(
-            top = viewportClippedMin,
-            bottom = viewportClippedMax
-        )
+        val viewportClippedRect =
+            captureArea.copy(top = viewportClippedMin, bottom = viewportClippedMax)
 
         if (viewportClippedMin == viewportClippedMax) {
             // Requested capture area is outside the bounds of scrollable content,
@@ -148,9 +149,10 @@
         }
 
         // Draw a single frame of the content to a buffer that we can stamp out.
-        val coordinator = checkNotNull(node.findCoordinatorToGetBounds()) {
-            "Could not find coordinator for semantics node."
-        }
+        val coordinator =
+            checkNotNull(node.findCoordinatorToGetBounds()) {
+                "Could not find coordinator for semantics node."
+            }
 
         val androidCanvas = session.surface.lockHardwareCanvas()
         try {
@@ -196,28 +198,25 @@
     private fun AndroidCanvas.drawDebugBackground() {
         drawColor(
             androidx.compose.ui.graphics.Color.hsl(
-                hue = Random.nextFloat() * 360f,
-                saturation = 0.75f,
-                lightness = 0.5f,
-                alpha = 1f
-            ).toArgb()
+                    hue = Random.nextFloat() * 360f,
+                    saturation = 0.75f,
+                    lightness = 0.5f,
+                    alpha = 1f
+                )
+                .toArgb()
         )
     }
 
     private fun AndroidCanvas.drawDebugOverlay() {
         val circleRadius = 20f
-        val circlePaint = Paint().apply {
-            color = Color.RED
-            textSize = 48f
-        }
+        val circlePaint =
+            Paint().apply {
+                color = Color.RED
+                textSize = 48f
+            }
         drawCircle(0f, 0f, circleRadius, circlePaint)
         drawCircle(width.toFloat(), 0f, circleRadius, circlePaint)
-        drawCircle(
-            width.toFloat(),
-            height.toFloat(),
-            circleRadius,
-            circlePaint
-        )
+        drawCircle(width.toFloat(), height.toFloat(), circleRadius, circlePaint)
         drawCircle(0f, height.toFloat(), circleRadius, circlePaint)
 
         drawText(requestCount.toString(), width / 2f, height / 2f, circlePaint)
@@ -226,6 +225,7 @@
 
     interface ScrollCaptureSessionListener {
         fun onSessionStarted()
+
         fun onSessionEnded()
     }
 }
@@ -240,9 +240,7 @@
             signal.cancel()
         }
     }
-    signal.setOnCancelListener {
-        job.cancel()
-    }
+    signal.setOnCancelListener { job.cancel() }
     return job
 }
 
@@ -295,9 +293,7 @@
         return (offset - scrollAmount.roundToInt()).coerceIn(0, viewportSize)
     }
 
-    /**
-     * Try to scroll to [offset] pixels past the original scroll position.
-     */
+    /** Try to scroll to [offset] pixels past the original scroll position. */
     suspend fun scrollTo(offset: Float) {
         scrollBy(offset - scrollAmount)
     }
@@ -305,10 +301,8 @@
     private suspend fun scrollBy(delta: Float) {
         val consumed = scrollBy.invoke(delta)
         scrollAmount += consumed
-        if (DEBUG) Log.d(
-            TAG,
-            "scrolled $consumed of requested $delta, after scrollAmount=$scrollAmount"
-        )
+        if (DEBUG)
+            Log.d(TAG, "scrolled $consumed of requested $delta, after scrollAmount=$scrollAmount")
     }
 }
 
diff --git a/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/scrollcapture/ScrollCapture.android.kt b/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/scrollcapture/ScrollCapture.android.kt
index 1062dbc..7e32b2b 100644
--- a/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/scrollcapture/ScrollCapture.android.kt
+++ b/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/scrollcapture/ScrollCapture.android.kt
@@ -45,9 +45,7 @@
 import kotlin.coroutines.CoroutineContext
 import kotlinx.coroutines.CoroutineScope
 
-/**
- * Separate class to host the implementation of scroll capture for dex verification.
- */
+/** Separate class to host the implementation of scroll capture for dex verification. */
 @RequiresApi(31)
 internal class ScrollCapture : ComposeScrollCaptureCallback.ScrollCaptureSessionListener {
 
@@ -86,31 +84,33 @@
 
         // Sort to find the deepest node with the biggest bounds in the dimension(s) that the node
         // supports scrolling in.
-        candidates.sortWith(compareBy(
-            { it.depth },
-            { it.viewportBoundsInWindow.height },
-        ))
+        candidates.sortWith(
+            compareBy(
+                { it.depth },
+                { it.viewportBoundsInWindow.height },
+            )
+        )
         val candidate = candidates.lastOrNull() ?: return
 
         // If we found a candidate, create a capture callback for it and give it to the system.
         val coroutineScope = CoroutineScope(coroutineContext)
-        val callback = ComposeScrollCaptureCallback(
-            node = candidate.node,
-            viewportBoundsInWindow = candidate.viewportBoundsInWindow,
-            coroutineScope = coroutineScope,
-            listener = this
-        )
+        val callback =
+            ComposeScrollCaptureCallback(
+                node = candidate.node,
+                viewportBoundsInWindow = candidate.viewportBoundsInWindow,
+                coroutineScope = coroutineScope,
+                listener = this
+            )
         val localVisibleRectOfCandidate = candidate.coordinates.boundsInRoot()
         val windowOffsetOfCandidate = candidate.viewportBoundsInWindow.topLeft
         targets.accept(
             ScrollCaptureTarget(
-                view,
-                localVisibleRectOfCandidate.roundToIntRect().toAndroidRect(),
-                windowOffsetOfCandidate.let { Point(it.x, it.y) },
-                callback
-            ).apply {
-                scrollBounds = candidate.viewportBoundsInWindow.toAndroidRect()
-            }
+                    view,
+                    localVisibleRectOfCandidate.roundToIntRect().toAndroidRect(),
+                    windowOffsetOfCandidate.let { Point(it.x, it.y) },
+                    callback
+                )
+                .apply { scrollBounds = candidate.viewportBoundsInWindow.toAndroidRect() }
         )
     }
 
@@ -138,9 +138,11 @@
             return@visitDescendants false
         }
 
-        val nodeCoordinates = checkPreconditionNotNull(node.findCoordinatorToGetBounds()) {
-            "Expected semantics node to have a coordinator."
-        }.coordinates
+        val nodeCoordinates =
+            checkPreconditionNotNull(node.findCoordinatorToGetBounds()) {
+                    "Expected semantics node to have a coordinator."
+                }
+                .coordinates
 
         // Zero-sized nodes can't be candidates, and by definition would clip all their children so
         // they and their descendants can't be candidates either.
@@ -199,7 +201,7 @@
  * Visits all the descendants of this [SemanticsNode].
  *
  * @param onNode Function called for each [SemanticsNode]. Iff this function returns true, the
- * children of the current node will be visited.
+ *   children of the current node will be visited.
  */
 private inline fun SemanticsNode.visitDescendants(onNode: (SemanticsNode) -> Boolean) {
     val nodes = mutableVectorOf<SemanticsNode>()
@@ -213,11 +215,12 @@
     }
 }
 
-private fun SemanticsNode.getChildrenForSearch() = getChildren(
-    includeDeactivatedNodes = false,
-    includeReplacedSemantics = false,
-    includeFakeNodes = false
-)
+private fun SemanticsNode.getChildrenForSearch() =
+    getChildren(
+        includeDeactivatedNodes = false,
+        includeReplacedSemantics = false,
+        includeFakeNodes = false
+    )
 
 /**
  * Information about a potential [ScrollCaptureTarget] needed to both select the final candidate and
diff --git a/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/semantics/SemanticsProperties.android.kt b/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/semantics/SemanticsProperties.android.kt
index e585134..f400b3d 100644
--- a/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/semantics/SemanticsProperties.android.kt
+++ b/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/semantics/SemanticsProperties.android.kt
@@ -20,33 +20,33 @@
 
 @ExperimentalComposeUiApi
 object SemanticsPropertiesAndroid {
-    /**
-     * @see SemanticsPropertyReceiver.testTagsAsResourceId
-     */
+    /** @see SemanticsPropertyReceiver.testTagsAsResourceId */
     @Suppress("OPT_IN_MARKER_ON_WRONG_TARGET")
     @get:ExperimentalComposeUiApi
     @ExperimentalComposeUiApi
-    val TestTagsAsResourceId = SemanticsPropertyKey<Boolean>(
-        name = "TestTagsAsResourceId",
-        isImportantForAccessibility = false,
-        mergePolicy = { parentValue, _ -> parentValue }
-    )
+    val TestTagsAsResourceId =
+        SemanticsPropertyKey<Boolean>(
+            name = "TestTagsAsResourceId",
+            isImportantForAccessibility = false,
+            mergePolicy = { parentValue, _ -> parentValue }
+        )
 }
 
 /**
  * Configuration toggle to map testTags to resource-id.
  *
- * This provides a way of filling in AccessibilityNodeInfo.viewIdResourceName, which in the View System
- * is populated based on the resource string in the XML.
+ * This provides a way of filling in AccessibilityNodeInfo.viewIdResourceName, which in the View
+ * System is populated based on the resource string in the XML.
  *
  * testTags are also provided in AccessibilityNodeInfo.extras under key
- * "androidx.compose.ui.semantics.testTag". However, when using UIAutomator or on Android 7 and below,
- * extras are not available, so a more backwards-compatible way of making testTags available to
- * accessibility-tree-based integration tests is sometimes needed. resource-id was the most natural
- * property to repurpose for this.
+ * "androidx.compose.ui.semantics.testTag". However, when using UIAutomator or on Android 7 and
+ * below, extras are not available, so a more backwards-compatible way of making testTags available
+ * to accessibility-tree-based integration tests is sometimes needed. resource-id was the most
+ * natural property to repurpose for this.
  *
- * This property applies to a semantics subtree. For example, if it's set to true on the root semantics
- * node of the app (and no child nodes set it back to false), then every testTag will be mapped.
+ * This property applies to a semantics subtree. For example, if it's set to true on the root
+ * semantics node of the app (and no child nodes set it back to false), then every testTag will be
+ * mapped.
  */
 @Suppress("OPT_IN_MARKER_ON_WRONG_TARGET")
 @get:ExperimentalComposeUiApi
diff --git a/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/text/input/CursorAnchorInfoBuilder.android.kt b/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/text/input/CursorAnchorInfoBuilder.android.kt
index c8dd87a..9946391 100644
--- a/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/text/input/CursorAnchorInfoBuilder.android.kt
+++ b/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/text/input/CursorAnchorInfoBuilder.android.kt
@@ -147,10 +147,9 @@
     val endOffsetTransformed = offsetMapping.originalToTransformed(endOffset)
     val array = FloatArray((endOffsetTransformed - startOffsetTransformed) * 4)
     textLayoutResult.multiParagraph.fillBoundingBoxes(
-        TextRange(
-            startOffsetTransformed,
-            endOffsetTransformed
-        ), array, 0
+        TextRange(startOffsetTransformed, endOffsetTransformed),
+        array,
+        0
     )
 
     for (offset in startOffset until endOffset) {
@@ -175,7 +174,7 @@
         }
         if (
             !innerTextFieldBounds.containsInclusive(rect.left, rect.top) ||
-            !innerTextFieldBounds.containsInclusive(rect.right, rect.bottom)
+                !innerTextFieldBounds.containsInclusive(rect.right, rect.bottom)
         ) {
             flags = flags or CursorAnchorInfo.FLAG_HAS_INVISIBLE_REGION
         }
diff --git a/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/text/input/CursorAnchorInfoController.android.kt b/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/text/input/CursorAnchorInfoController.android.kt
index a1e97b8..8a920e0 100644
--- a/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/text/input/CursorAnchorInfoController.android.kt
+++ b/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/text/input/CursorAnchorInfoController.android.kt
@@ -29,8 +29,7 @@
 )
 internal class CursorAnchorInfoController(
     private val rootPositionCalculator: PositionCalculator,
-    @Suppress("DEPRECATION")
-    private val inputMethodManager: InputMethodManager
+    @Suppress("DEPRECATION") private val inputMethodManager: InputMethodManager
 ) {
     private val lock = Any()
 
@@ -45,7 +44,7 @@
     private var textFieldValue: TextFieldValue? = null
     private var textLayoutResult: TextLayoutResult? = null
     private var offsetMapping: OffsetMapping? = null
-    private var textFieldToRootTransform: (Matrix) -> Unit = { }
+    private var textFieldToRootTransform: (Matrix) -> Unit = {}
     private var innerTextFieldBounds: Rect? = null
     private var decorationBoxBounds: Rect? = null
 
@@ -77,20 +76,21 @@
         includeCharacterBounds: Boolean,
         includeEditorBounds: Boolean,
         includeLineBounds: Boolean
-    ) = synchronized(lock) {
-        this.includeInsertionMarker = includeInsertionMarker
-        this.includeCharacterBounds = includeCharacterBounds
-        this.includeEditorBounds = includeEditorBounds
-        this.includeLineBounds = includeLineBounds
+    ) =
+        synchronized(lock) {
+            this.includeInsertionMarker = includeInsertionMarker
+            this.includeCharacterBounds = includeCharacterBounds
+            this.includeEditorBounds = includeEditorBounds
+            this.includeLineBounds = includeLineBounds
 
-        if (immediate) {
-            hasPendingImmediateRequest = true
-            if (textFieldValue != null) {
-                updateCursorAnchorInfo()
+            if (immediate) {
+                hasPendingImmediateRequest = true
+                if (textFieldValue != null) {
+                    updateCursorAnchorInfo()
+                }
             }
+            monitorEnabled = monitor
         }
-        monitorEnabled = monitor
-    }
 
     /**
      * Notify the controller of layout and position changes.
@@ -112,18 +112,19 @@
         textFieldToRootTransform: (Matrix) -> Unit,
         innerTextFieldBounds: Rect,
         decorationBoxBounds: Rect
-    ) = synchronized(lock) {
-        this.textFieldValue = textFieldValue
-        this.offsetMapping = offsetMapping
-        this.textLayoutResult = textLayoutResult
-        this.textFieldToRootTransform = textFieldToRootTransform
-        this.innerTextFieldBounds = innerTextFieldBounds
-        this.decorationBoxBounds = decorationBoxBounds
+    ) =
+        synchronized(lock) {
+            this.textFieldValue = textFieldValue
+            this.offsetMapping = offsetMapping
+            this.textLayoutResult = textLayoutResult
+            this.textFieldToRootTransform = textFieldToRootTransform
+            this.innerTextFieldBounds = innerTextFieldBounds
+            this.decorationBoxBounds = decorationBoxBounds
 
-        if (hasPendingImmediateRequest || monitorEnabled) {
-            updateCursorAnchorInfo()
+            if (hasPendingImmediateRequest || monitorEnabled) {
+                updateCursorAnchorInfo()
+            }
         }
-    }
 
     /**
      * Invalidate the last received layout and position data.
@@ -132,14 +133,15 @@
      * position data is no longer valid. [CursorAnchorInfo] updates will not be sent until new
      * layout and position data is received.
      */
-    fun invalidate() = synchronized(lock) {
-        textFieldValue = null
-        offsetMapping = null
-        textLayoutResult = null
-        textFieldToRootTransform = { }
-        innerTextFieldBounds = null
-        decorationBoxBounds = null
-    }
+    fun invalidate() =
+        synchronized(lock) {
+            textFieldValue = null
+            offsetMapping = null
+            textLayoutResult = null
+            textFieldToRootTransform = {}
+            innerTextFieldBounds = null
+            decorationBoxBounds = null
+        }
 
     private fun updateCursorAnchorInfo() {
         if (!inputMethodManager.isActive()) return
diff --git a/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/text/input/InputEventCallback2.android.kt b/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/text/input/InputEventCallback2.android.kt
index 975dffe..3d3307c 100644
--- a/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/text/input/InputEventCallback2.android.kt
+++ b/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/text/input/InputEventCallback2.android.kt
@@ -20,9 +20,7 @@
 
 import android.view.KeyEvent
 
-/**
- * An interface of listening IME events.
- */
+/** An interface of listening IME events. */
 @Deprecated(
     "Only exists to support the legacy TextInputService APIs. It is not used by any Compose " +
         "code. A copy of this class in foundation is used by the legacy BasicTextField."
@@ -42,9 +40,7 @@
      */
     fun onImeAction(imeAction: ImeAction)
 
-    /**
-     * Called when IME triggered a KeyEvent
-     */
+    /** Called when IME triggered a KeyEvent */
     fun onKeyEvent(event: KeyEvent)
 
     /**
diff --git a/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/text/input/InputMethodManager.android.kt b/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/text/input/InputMethodManager.android.kt
index 11a6a71..e5a17d3 100644
--- a/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/text/input/InputMethodManager.android.kt
+++ b/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/text/input/InputMethodManager.android.kt
@@ -36,10 +36,7 @@
 
     fun hideSoftInput()
 
-    fun updateExtractedText(
-        token: Int,
-        extractedText: ExtractedText
-    )
+    fun updateExtractedText(token: Int, extractedText: ExtractedText)
 
     fun updateSelection(
         selectionStart: Int,
@@ -52,8 +49,8 @@
 }
 
 /**
- * Wrapper class to prevent depending on getSystemService and final InputMethodManager.
- * Let's us test TextInputServiceAndroid class.
+ * Wrapper class to prevent depending on getSystemService and final InputMethodManager. Let's us
+ * test TextInputServiceAndroid class.
  */
 @Suppress("DEPRECATION")
 @Deprecated(
@@ -62,13 +59,13 @@
 )
 internal class InputMethodManagerImpl(private val view: View) : InputMethodManager {
 
-    private val imm by lazy(LazyThreadSafetyMode.NONE) {
-        view.context.getSystemService(Context.INPUT_METHOD_SERVICE)
-            as android.view.inputmethod.InputMethodManager
-    }
+    private val imm by
+        lazy(LazyThreadSafetyMode.NONE) {
+            view.context.getSystemService(Context.INPUT_METHOD_SERVICE)
+                as android.view.inputmethod.InputMethodManager
+        }
 
-    private val softwareKeyboardControllerCompat =
-        SoftwareKeyboardControllerCompat(view)
+    private val softwareKeyboardControllerCompat = SoftwareKeyboardControllerCompat(view)
 
     override fun isActive(): Boolean = imm.isActive(view)
 
@@ -88,10 +85,7 @@
         softwareKeyboardControllerCompat.hide()
     }
 
-    override fun updateExtractedText(
-        token: Int,
-        extractedText: ExtractedText
-    ) {
+    override fun updateExtractedText(token: Int, extractedText: ExtractedText) {
         imm.updateExtractedText(view, token, extractedText)
     }
 
diff --git a/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/text/input/NullableInputConnectionWrapper.android.kt b/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/text/input/NullableInputConnectionWrapper.android.kt
index 522b0171..c2956a7 100644
--- a/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/text/input/NullableInputConnectionWrapper.android.kt
+++ b/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/text/input/NullableInputConnectionWrapper.android.kt
@@ -37,50 +37,39 @@
  * Creates a [NullableInputConnectionWrapper] – see the kdoc on that interface for more info.
  *
  * @param delegate The [InputConnection] that will receive all calls on this object until
- * `disposeDelegate` or `closeConnection` are called.
+ *   `disposeDelegate` or `closeConnection` are called.
  * @param onConnectionClosed A callback that will be invoked the first time `closeConnection` is
- * called. Will not be invoked by `disposeDelegate`, and will not be invoked if `disposeDelegate` is
- * called before `closeConnection`.
+ *   called. Will not be invoked by `disposeDelegate`, and will not be invoked if `disposeDelegate`
+ *   is called before `closeConnection`.
  */
 internal fun NullableInputConnectionWrapper(
     delegate: InputConnection,
     onConnectionClosed: () -> Unit
-): NullableInputConnectionWrapper = when {
-    Build.VERSION.SDK_INT >= 34 -> NullableInputConnectionWrapperApi34(
-        delegate,
-        onConnectionClosed
-    )
-
-    Build.VERSION.SDK_INT >= 25 -> NullableInputConnectionWrapperApi25(
-        delegate,
-        onConnectionClosed
-    )
-
-    Build.VERSION.SDK_INT >= 24 -> NullableInputConnectionWrapperApi24(
-        delegate,
-        onConnectionClosed
-    )
-
-    else -> NullableInputConnectionWrapperApi21(
-        delegate,
-        onConnectionClosed
-    )
-}
+): NullableInputConnectionWrapper =
+    when {
+        Build.VERSION.SDK_INT >= 34 ->
+            NullableInputConnectionWrapperApi34(delegate, onConnectionClosed)
+        Build.VERSION.SDK_INT >= 25 ->
+            NullableInputConnectionWrapperApi25(delegate, onConnectionClosed)
+        Build.VERSION.SDK_INT >= 24 ->
+            NullableInputConnectionWrapperApi24(delegate, onConnectionClosed)
+        else -> NullableInputConnectionWrapperApi21(delegate, onConnectionClosed)
+    }
 
 /**
  * An [InputConnection] that will delegate all calls to a delegate [InputConnection]. This is
  * similar to the platform `InputConnectionWrapper` class, but no-ops when the delegate is null
  * instead of throwing.
  *
- * This class allows the PlatformTextInput system to make stronger guarantees about the lifetime
- * of [InputConnection]s – see [PlatformTextInputMethodRequest.createInputConnection] for
- * documentation about what these guarantees are.
+ * This class allows the PlatformTextInput system to make stronger guarantees about the lifetime of
+ * [InputConnection]s – see [PlatformTextInputMethodRequest.createInputConnection] for documentation
+ * about what these guarantees are.
  *
  * This class has two responsibilities besides basic delegation:
- *  - Clear its reference to its delegate as eagerly as possible, so even if this instance is leaked
- *    by the system the underlying [InputConnection] is not.
- *  - Ensure that [InputConnection.closeConnection] is invoked on the delegate on every API level
- *    where it's available (24+), as soon as possible.
+ * - Clear its reference to its delegate as eagerly as possible, so even if this instance is leaked
+ *   by the system the underlying [InputConnection] is not.
+ * - Ensure that [InputConnection.closeConnection] is invoked on the delegate on every API level
+ *   where it's available (24+), as soon as possible.
  */
 internal sealed interface NullableInputConnectionWrapper : InputConnection {
     /**
@@ -129,8 +118,7 @@
     override fun deleteSurroundingText(p0: Int, p1: Int): Boolean =
         delegate?.deleteSurroundingText(p0, p1) ?: false
 
-    override fun deleteSurroundingTextInCodePoints(p0: Int, p1: Int): Boolean =
-        false
+    override fun deleteSurroundingTextInCodePoints(p0: Int, p1: Int): Boolean = false
 
     override fun setComposingText(p0: CharSequence?, p1: Int): Boolean =
         delegate?.setComposingText(p0, p1) ?: false
@@ -177,12 +165,9 @@
     override fun getHandler(): Handler? = null
 
     // Only supported on higher API level.
-    override fun commitContent(p0: InputContentInfo, p1: Int, p2: Bundle?): Boolean =
-        false
+    override fun commitContent(p0: InputContentInfo, p1: Int, p2: Bundle?): Boolean = false
 
-    /**
-     * Support method to invoke [InputConnection.closeConnection] on supported API levels.
-     */
+    /** Support method to invoke [InputConnection.closeConnection] on supported API levels. */
     protected open fun closeDelegate(delegate: InputConnection) {}
 }
 
@@ -228,6 +213,5 @@
     final override fun previewHandwritingGesture(
         gesture: PreviewableHandwritingGesture,
         cancellationSignal: CancellationSignal?
-    ): Boolean =
-        delegate?.previewHandwritingGesture(gesture, cancellationSignal) ?: false
+    ): Boolean = delegate?.previewHandwritingGesture(gesture, cancellationSignal) ?: false
 }
diff --git a/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/text/input/RecordingInputConnection.android.kt b/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/text/input/RecordingInputConnection.android.kt
index aa392b7..40ac26b 100644
--- a/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/text/input/RecordingInputConnection.android.kt
+++ b/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/text/input/RecordingInputConnection.android.kt
@@ -47,8 +47,7 @@
 )
 internal class RecordingInputConnection(
     initState: TextFieldValue,
-    @Suppress("DEPRECATION")
-    val eventCallback: InputEventCallback2,
+    @Suppress("DEPRECATION") val eventCallback: InputEventCallback2,
     val autoCorrect: Boolean
 ) : InputConnection {
 
@@ -58,7 +57,9 @@
     // The input state.
     internal var mTextFieldValue: TextFieldValue = initState
         set(value) {
-            if (DEBUG) { logDebug("mTextFieldValue : $field -> $value") }
+            if (DEBUG) {
+                logDebug("mTextFieldValue : $field -> $value")
+            }
             field = value
         }
 
@@ -98,12 +99,13 @@
      */
     fun updateInputState(
         state: TextFieldValue,
-        @Suppress("DEPRECATION")
-        inputMethodManager: InputMethodManager,
+        @Suppress("DEPRECATION") inputMethodManager: InputMethodManager,
     ) {
         if (!isActive) return
 
-        if (DEBUG) { logDebug("RecordingInputConnection.updateInputState: $state") }
+        if (DEBUG) {
+            logDebug("RecordingInputConnection.updateInputState: $state")
+        }
 
         mTextFieldValue = state
 
@@ -125,7 +127,10 @@
             )
         }
         inputMethodManager.updateSelection(
-            state.selection.min, state.selection.max, compositionStart, compositionEnd
+            state.selection.min,
+            state.selection.max,
+            compositionStart,
+            compositionEnd
         )
     }
 
@@ -144,7 +149,9 @@
     // /////////////////////////////////////////////////////////////////////////////////////////////
 
     override fun beginBatchEdit(): Boolean = ensureActive {
-        if (DEBUG) { logDebug("beginBatchEdit()") }
+        if (DEBUG) {
+            logDebug("beginBatchEdit()")
+        }
         return beginBatchEditInternal()
     }
 
@@ -154,7 +161,9 @@
     }
 
     override fun endBatchEdit(): Boolean {
-        if (DEBUG) { logDebug("endBatchEdit()") }
+        if (DEBUG) {
+            logDebug("endBatchEdit()")
+        }
         return endBatchEditInternal()
     }
 
@@ -168,7 +177,9 @@
     }
 
     override fun closeConnection() {
-        if (DEBUG) { logDebug("closeConnection()") }
+        if (DEBUG) {
+            logDebug("closeConnection()")
+        }
         editCommands.clear()
         batchDepth = 0
         isActive = false
@@ -180,12 +191,16 @@
     // /////////////////////////////////////////////////////////////////////////////////////////////
 
     override fun commitText(text: CharSequence?, newCursorPosition: Int): Boolean = ensureActive {
-        if (DEBUG) { logDebug("commitText(\"$text\", $newCursorPosition)") }
+        if (DEBUG) {
+            logDebug("commitText(\"$text\", $newCursorPosition)")
+        }
         addEditCommandWithBatch(CommitTextCommand(text.toString(), newCursorPosition))
     }
 
     override fun setComposingRegion(start: Int, end: Int): Boolean = ensureActive {
-        if (DEBUG) { logDebug("setComposingRegion($start, $end)") }
+        if (DEBUG) {
+            logDebug("setComposingRegion($start, $end)")
+        }
         addEditCommandWithBatch(SetComposingRegionCommand(start, end))
     }
 
@@ -210,25 +225,33 @@
 
     override fun deleteSurroundingText(beforeLength: Int, afterLength: Int): Boolean =
         ensureActive {
-            if (DEBUG) { logDebug("deleteSurroundingText($beforeLength, $afterLength)") }
+            if (DEBUG) {
+                logDebug("deleteSurroundingText($beforeLength, $afterLength)")
+            }
             addEditCommandWithBatch(DeleteSurroundingTextCommand(beforeLength, afterLength))
             return true
         }
 
     override fun setSelection(start: Int, end: Int): Boolean = ensureActive {
-        if (DEBUG) { logDebug("setSelection($start, $end)") }
+        if (DEBUG) {
+            logDebug("setSelection($start, $end)")
+        }
         addEditCommandWithBatch(SetSelectionCommand(start, end))
         return true
     }
 
     override fun finishComposingText(): Boolean = ensureActive {
-        if (DEBUG) { logDebug("finishComposingText()") }
+        if (DEBUG) {
+            logDebug("finishComposingText()")
+        }
         addEditCommandWithBatch(FinishComposingTextCommand())
         return true
     }
 
     override fun sendKeyEvent(event: KeyEvent): Boolean = ensureActive {
-        if (DEBUG) { logDebug("sendKeyEvent($event)") }
+        if (DEBUG) {
+            logDebug("sendKeyEvent($event)")
+        }
         eventCallback.onKeyEvent(event)
         return true
     }
@@ -240,26 +263,33 @@
     override fun getTextBeforeCursor(maxChars: Int, flags: Int): CharSequence {
         // TODO(b/135556699) should return styled text
         val result = mTextFieldValue.getTextBeforeSelection(maxChars).toString()
-        if (DEBUG) { logDebug("getTextBeforeCursor($maxChars, $flags): $result") }
+        if (DEBUG) {
+            logDebug("getTextBeforeCursor($maxChars, $flags): $result")
+        }
         return result
     }
 
     override fun getTextAfterCursor(maxChars: Int, flags: Int): CharSequence {
         // TODO(b/135556699) should return styled text
         val result = mTextFieldValue.getTextAfterSelection(maxChars).toString()
-        if (DEBUG) { logDebug("getTextAfterCursor($maxChars, $flags): $result") }
+        if (DEBUG) {
+            logDebug("getTextAfterCursor($maxChars, $flags): $result")
+        }
         return result
     }
 
     override fun getSelectedText(flags: Int): CharSequence? {
         // https://source.chromium.org/chromium/chromium/src/+/master:content/public/android/java/src/org/chromium/content/browser/input/TextInputState.java;l=56;drc=0e20d1eb38227949805a4c0e9d5cdeddc8d23637
-        val result: CharSequence? = if (mTextFieldValue.selection.collapsed) {
-            null
-        } else {
-            // TODO(b/135556699) should return styled text
-            mTextFieldValue.getSelectedText().toString()
+        val result: CharSequence? =
+            if (mTextFieldValue.selection.collapsed) {
+                null
+            } else {
+                // TODO(b/135556699) should return styled text
+                mTextFieldValue.getSelectedText().toString()
+            }
+        if (DEBUG) {
+            logDebug("getSelectedText($flags): $result")
         }
-        if (DEBUG) { logDebug("getSelectedText($flags): $result") }
         return result
     }
 
@@ -318,7 +348,9 @@
     }
 
     override fun getExtractedText(request: ExtractedTextRequest?, flags: Int): ExtractedText {
-        if (DEBUG) { logDebug("getExtractedText($request, $flags)") }
+        if (DEBUG) {
+            logDebug("getExtractedText($request, $flags)")
+        }
         extractedTextMonitorMode = (flags and InputConnection.GET_EXTRACTED_TEXT_MONITOR) != 0
         if (extractedTextMonitorMode) {
             currentExtractedTextRequestToken = request?.token ?: 0
@@ -329,7 +361,6 @@
         if (DEBUG) {
             with(extractedText) {
                 logDebug(
-
                     "getExtractedText() return: text: \"$text\"" +
                         ",partialStartOffset $partialStartOffset" +
                         ",partialEndOffset $partialEndOffset" +
@@ -348,7 +379,9 @@
     // /////////////////////////////////////////////////////////////////////////////////////////////
 
     override fun performContextMenuAction(id: Int): Boolean = ensureActive {
-        if (DEBUG) { logDebug("performContextMenuAction($id)") }
+        if (DEBUG) {
+            logDebug("performContextMenuAction($id)")
+        }
         when (id) {
             android.R.id.selectAll -> {
                 addEditCommandWithBatch(SetSelectionCommand(0, mTextFieldValue.text.length))
@@ -374,20 +407,23 @@
     }
 
     override fun performEditorAction(editorAction: Int): Boolean = ensureActive {
-        if (DEBUG) { logDebug("performEditorAction($editorAction)") }
-        val imeAction = when (editorAction) {
-            EditorInfo.IME_ACTION_UNSPECIFIED -> ImeAction.Default
-            EditorInfo.IME_ACTION_DONE -> ImeAction.Done
-            EditorInfo.IME_ACTION_SEND -> ImeAction.Send
-            EditorInfo.IME_ACTION_SEARCH -> ImeAction.Search
-            EditorInfo.IME_ACTION_PREVIOUS -> ImeAction.Previous
-            EditorInfo.IME_ACTION_NEXT -> ImeAction.Next
-            EditorInfo.IME_ACTION_GO -> ImeAction.Go
-            else -> {
-                Log.w(TAG, "IME sends unsupported Editor Action: $editorAction")
-                ImeAction.Default
-            }
+        if (DEBUG) {
+            logDebug("performEditorAction($editorAction)")
         }
+        val imeAction =
+            when (editorAction) {
+                EditorInfo.IME_ACTION_UNSPECIFIED -> ImeAction.Default
+                EditorInfo.IME_ACTION_DONE -> ImeAction.Done
+                EditorInfo.IME_ACTION_SEND -> ImeAction.Send
+                EditorInfo.IME_ACTION_SEARCH -> ImeAction.Search
+                EditorInfo.IME_ACTION_PREVIOUS -> ImeAction.Previous
+                EditorInfo.IME_ACTION_NEXT -> ImeAction.Next
+                EditorInfo.IME_ACTION_GO -> ImeAction.Go
+                else -> {
+                    Log.w(TAG, "IME sends unsupported Editor Action: $editorAction")
+                    ImeAction.Default
+                }
+            }
         eventCallback.onImeAction(imeAction)
         return true
     }
@@ -397,49 +433,65 @@
     // /////////////////////////////////////////////////////////////////////////////////////////////
 
     override fun commitCompletion(text: CompletionInfo?): Boolean = ensureActive {
-        if (DEBUG) { logDebug("commitCompletion(${text?.text})") }
+        if (DEBUG) {
+            logDebug("commitCompletion(${text?.text})")
+        }
         // We don't support this callback.
         // The API documents says this should return if the input connection is no longer valid, but
         // The Chromium implementation already returning false, so assuming it is safe to return
         // false if not supported.
-        // see https://cs.chromium.org/chromium/src/content/public/android/java/src/org/chromium/content/browser/input/ThreadedInputConnection.java
+        // see
+        // https://cs.chromium.org/chromium/src/content/public/android/java/src/org/chromium/content/browser/input/ThreadedInputConnection.java
         return false
     }
 
     override fun commitCorrection(correctionInfo: CorrectionInfo?): Boolean = ensureActive {
-        if (DEBUG) { logDebug("commitCorrection($correctionInfo),autoCorrect:$autoCorrect") }
+        if (DEBUG) {
+            logDebug("commitCorrection($correctionInfo),autoCorrect:$autoCorrect")
+        }
         // Should add an event here so that we can implement the autocorrect highlight
         // Bug: 170647219
         return autoCorrect
     }
 
     override fun getHandler(): Handler? {
-        if (DEBUG) { logDebug("getHandler()") }
+        if (DEBUG) {
+            logDebug("getHandler()")
+        }
         return null // Returns null means using default Handler
     }
 
     override fun clearMetaKeyStates(states: Int): Boolean = ensureActive {
-        if (DEBUG) { logDebug("clearMetaKeyStates($states)") }
+        if (DEBUG) {
+            logDebug("clearMetaKeyStates($states)")
+        }
         // We don't support this callback.
         // The API documents says this should return if the input connection is no longer valid, but
         // The Chromium implementation already returning false, so assuming it is safe to return
         // false if not supported.
-        // see https://cs.chromium.org/chromium/src/content/public/android/java/src/org/chromium/content/browser/input/ThreadedInputConnection.java
+        // see
+        // https://cs.chromium.org/chromium/src/content/public/android/java/src/org/chromium/content/browser/input/ThreadedInputConnection.java
         return false
     }
 
     override fun reportFullscreenMode(enabled: Boolean): Boolean {
-        if (DEBUG) { logDebug("reportFullscreenMode($enabled)") }
+        if (DEBUG) {
+            logDebug("reportFullscreenMode($enabled)")
+        }
         return false // This value is ignored according to the API docs.
     }
 
     override fun getCursorCapsMode(reqModes: Int): Int {
-        if (DEBUG) { logDebug("getCursorCapsMode($reqModes)") }
+        if (DEBUG) {
+            logDebug("getCursorCapsMode($reqModes)")
+        }
         return TextUtils.getCapsMode(mTextFieldValue.text, mTextFieldValue.selection.min, reqModes)
     }
 
     override fun performPrivateCommand(action: String?, data: Bundle?): Boolean = ensureActive {
-        if (DEBUG) { logDebug("performPrivateCommand($action, $data)") }
+        if (DEBUG) {
+            logDebug("performPrivateCommand($action, $data)")
+        }
         return true // API doc says we should return true even if we didn't understand the command.
     }
 
@@ -448,11 +500,15 @@
         flags: Int,
         opts: Bundle?
     ): Boolean = ensureActive {
-        if (DEBUG) { logDebug("commitContent($inputContentInfo, $flags, $opts)") }
+        if (DEBUG) {
+            logDebug("commitContent($inputContentInfo, $flags, $opts)")
+        }
         return false // We don't accept any contents.
     }
 
     private fun logDebug(message: String) {
-        if (DEBUG) { Log.d(TAG, "$DEBUG_CLASS.$message, $isActive") }
+        if (DEBUG) {
+            Log.d(TAG, "$DEBUG_CLASS.$message, $isActive")
+        }
     }
 }
diff --git a/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/text/input/TextInputServiceAndroid.android.kt b/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/text/input/TextInputServiceAndroid.android.kt
index b3ac11e..5f7bebe 100644
--- a/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/text/input/TextInputServiceAndroid.android.kt
+++ b/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/text/input/TextInputServiceAndroid.android.kt
@@ -49,7 +49,7 @@
  * Provide Android specific input service with the Operating System.
  *
  * @param inputCommandProcessorExecutor [Executor] used to schedule the [processInputCommands]
- * function when a input command is first requested for a frame.
+ *   function when a input command is first requested for a frame.
  */
 @Deprecated(
     "Only exists to support the legacy TextInputService APIs. It is not used by any Compose " +
@@ -70,7 +70,7 @@
         StartInput,
         StopInput,
         ShowKeyboard,
-        HideKeyboard;
+        HideKeyboard
     }
 
     /**
@@ -80,8 +80,8 @@
     private var editorHasFocus = false
 
     /**
-     *  The following three observers are set when the editable composable has initiated the input
-     *  session
+     * The following three observers are set when the editable composable has initiated the input
+     * session
      */
     private var onEditCommand: (List<EditCommand>) -> Unit = {}
     private var onImeActionPerformed: (ImeAction) -> Unit = {}
@@ -89,6 +89,7 @@
     // Visible for testing
     internal var state = TextFieldValue(text = "", selection = TextRange.Zero)
         private set
+
     private var imeOptions = ImeOptions.Default
 
     // RecordingInputConnection has strong reference to the View through TextInputServiceAndroid and
@@ -98,9 +99,8 @@
     private var ics = mutableListOf<WeakReference<RecordingInputConnection>>()
 
     // used for sendKeyEvent delegation
-    private val baseInputConnection by lazy(LazyThreadSafetyMode.NONE) {
-        BaseInputConnection(view, false)
-    }
+    private val baseInputConnection by
+        lazy(LazyThreadSafetyMode.NONE) { BaseInputConnection(view, false) }
 
     private var focusedRect: AndroidRect? = null
 
@@ -116,7 +116,10 @@
     private val textInputCommandQueue = mutableVectorOf<TextInputCommand>()
     private var frameCallback: Runnable? = null
 
-    constructor(view: View, positionCalculator: PositionCalculator) : this(
+    constructor(
+        view: View,
+        positionCalculator: PositionCalculator
+    ) : this(
         view,
         positionCalculator,
         InputMethodManagerImpl(view),
@@ -128,9 +131,7 @@
         }
     }
 
-    /**
-     * Creates new input connection.
-     */
+    /** Creates new input connection. */
     fun createInputConnection(outAttrs: EditorInfo): InputConnection? {
         if (!editorHasFocus) {
             return null
@@ -140,59 +141,59 @@
         outAttrs.updateWithEmojiCompat()
 
         return RecordingInputConnection(
-            initState = state,
-            autoCorrect = imeOptions.autoCorrect,
-            eventCallback = object : InputEventCallback2 {
-                override fun onEditCommands(editCommands: List<EditCommand>) {
-                    onEditCommand(editCommands)
-                }
+                initState = state,
+                autoCorrect = imeOptions.autoCorrect,
+                eventCallback =
+                    object : InputEventCallback2 {
+                        override fun onEditCommands(editCommands: List<EditCommand>) {
+                            onEditCommand(editCommands)
+                        }
 
-                override fun onImeAction(imeAction: ImeAction) {
-                    onImeActionPerformed(imeAction)
-                }
+                        override fun onImeAction(imeAction: ImeAction) {
+                            onImeActionPerformed(imeAction)
+                        }
 
-                override fun onKeyEvent(event: KeyEvent) {
-                    baseInputConnection.sendKeyEvent(event)
-                }
+                        override fun onKeyEvent(event: KeyEvent) {
+                            baseInputConnection.sendKeyEvent(event)
+                        }
 
-                override fun onRequestCursorAnchorInfo(
-                    immediate: Boolean,
-                    monitor: Boolean,
-                    includeInsertionMarker: Boolean,
-                    includeCharacterBounds: Boolean,
-                    includeEditorBounds: Boolean,
-                    includeLineBounds: Boolean
-                ) {
-                    cursorAnchorInfoController.requestUpdate(
-                        immediate,
-                        monitor,
-                        includeInsertionMarker,
-                        includeCharacterBounds,
-                        includeEditorBounds,
-                        includeLineBounds
-                    )
-                }
+                        override fun onRequestCursorAnchorInfo(
+                            immediate: Boolean,
+                            monitor: Boolean,
+                            includeInsertionMarker: Boolean,
+                            includeCharacterBounds: Boolean,
+                            includeEditorBounds: Boolean,
+                            includeLineBounds: Boolean
+                        ) {
+                            cursorAnchorInfoController.requestUpdate(
+                                immediate,
+                                monitor,
+                                includeInsertionMarker,
+                                includeCharacterBounds,
+                                includeEditorBounds,
+                                includeLineBounds
+                            )
+                        }
 
-                override fun onConnectionClosed(inputConnection: RecordingInputConnection) {
-                    for (i in 0 until ics.size) {
-                        if (ics[i].get() == inputConnection) {
-                            ics.removeAt(i)
-                            return // No duplicated instances should be in the list.
+                        override fun onConnectionClosed(inputConnection: RecordingInputConnection) {
+                            for (i in 0 until ics.size) {
+                                if (ics[i].get() == inputConnection) {
+                                    ics.removeAt(i)
+                                    return // No duplicated instances should be in the list.
+                                }
+                            }
                         }
                     }
+            )
+            .also {
+                ics.add(WeakReference(it))
+                if (DEBUG) {
+                    Log.d(TAG, "$DEBUG_CLASS.createInputConnection: $ics")
                 }
             }
-        ).also {
-            ics.add(WeakReference(it))
-            if (DEBUG) {
-                Log.d(TAG, "$DEBUG_CLASS.createInputConnection: $ics")
-            }
-        }
     }
 
-    /**
-     * Returns true if some editable component is focused.
-     */
+    /** Returns true if some editable component is focused. */
     fun isEditorFocused(): Boolean = editorHasFocus
 
     override fun startInput(
@@ -259,10 +260,12 @@
     private fun sendInputCommand(command: TextInputCommand) {
         textInputCommandQueue += command
         if (frameCallback == null) {
-            frameCallback = Runnable {
-                frameCallback = null
-                processInputCommands()
-            }.also(inputCommandProcessorExecutor::execute)
+            frameCallback =
+                Runnable {
+                        frameCallback = null
+                        processInputCommands()
+                    }
+                    .also(inputCommandProcessorExecutor::execute)
         }
     }
 
@@ -293,7 +296,6 @@
                     // showing.
                     showKeyboard = true
                 }
-
                 StopInput -> {
                     startInput = false
                     // It also doesn't make sense to keep the keyboard visible if it's not
@@ -305,7 +307,6 @@
                     // https://docs.google.com/document/d/1o-y3NkfFPCBhfDekdVEEl41tqtjjqs8jOss6txNgqaw/edit?resourcekey=0-o728aLn51uXXnA4Pkpe88Q#heading=h.ieacosb5rizm
                     showKeyboard = false
                 }
-
                 ShowKeyboard,
                 HideKeyboard -> {
                     // Any keyboard visibility commands sent after input is stopped but before
@@ -358,8 +359,9 @@
         // If the selection has changed from the last time, we need to update selection even though
         // the oldValue in EditBuffer is already in sync with the newValue.
         // Same holds for composition b/207800945
-        val needUpdateSelection = (this.state.selection != newValue.selection) ||
-            this.state.composition != newValue.composition
+        val needUpdateSelection =
+            (this.state.selection != newValue.selection) ||
+                this.state.composition != newValue.composition
         this.state = newValue
         // update the latest TextFieldValue in InputConnection
         for (i in 0 until ics.size) {
@@ -383,11 +385,13 @@
             return
         }
 
-        val restartInput = oldValue?.let {
-            it.text != newValue.text ||
-                // when selection is the same but composition has changed, need to reset the input.
-                (it.selection == newValue.selection && it.composition != newValue.composition)
-        } ?: false
+        val restartInput =
+            oldValue?.let {
+                it.text != newValue.text ||
+                    // when selection is the same but composition has changed, need to reset the
+                    // input.
+                    (it.selection == newValue.selection && it.composition != newValue.composition)
+            } ?: false
 
         if (DEBUG) {
             Log.d(TAG, "$DEBUG_CLASS.updateState: restart($restartInput), state: $state")
@@ -404,12 +408,13 @@
 
     @Deprecated("This method should not be called, used BringIntoViewRequester instead.")
     override fun notifyFocusedRect(rect: Rect) {
-        focusedRect = AndroidRect(
-            rect.left.roundToInt(),
-            rect.top.roundToInt(),
-            rect.right.roundToInt(),
-            rect.bottom.roundToInt()
-        )
+        focusedRect =
+            AndroidRect(
+                rect.left.roundToInt(),
+                rect.top.roundToInt(),
+                rect.right.roundToInt(),
+                rect.bottom.roundToInt()
+            )
 
         // Requesting rectangle too early after obtaining focus may bring view into wrong place
         // probably due to transient IME inset change. We don't know the correct timing of calling
@@ -461,42 +466,39 @@
     }
 }
 
-/**
- * Call to update EditorInfo correctly when EmojiCompat is configured.
- */
+/** Call to update EditorInfo correctly when EmojiCompat is configured. */
 private fun EditorInfo.updateWithEmojiCompat() {
-    if (!EmojiCompat.isConfigured()) { return }
+    if (!EmojiCompat.isConfigured()) {
+        return
+    }
 
     EmojiCompat.get().updateEditorInfo(this)
 }
 
-/**
- * Fills necessary info of EditorInfo.
- */
+/** Fills necessary info of EditorInfo. */
 internal fun EditorInfo.update(imeOptions: ImeOptions, textFieldValue: TextFieldValue) {
-    this.imeOptions = when (imeOptions.imeAction) {
-        ImeAction.Default -> {
-            if (imeOptions.singleLine) {
-                // this is the last resort to enable single line
-                // Android IME still show return key even if multi line is not send
-                // TextView.java#onCreateInputConnection
-                EditorInfo.IME_ACTION_DONE
-            } else {
-                EditorInfo.IME_ACTION_UNSPECIFIED
+    this.imeOptions =
+        when (imeOptions.imeAction) {
+            ImeAction.Default -> {
+                if (imeOptions.singleLine) {
+                    // this is the last resort to enable single line
+                    // Android IME still show return key even if multi line is not send
+                    // TextView.java#onCreateInputConnection
+                    EditorInfo.IME_ACTION_DONE
+                } else {
+                    EditorInfo.IME_ACTION_UNSPECIFIED
+                }
             }
+            ImeAction.None -> EditorInfo.IME_ACTION_NONE
+            ImeAction.Go -> EditorInfo.IME_ACTION_GO
+            ImeAction.Next -> EditorInfo.IME_ACTION_NEXT
+            ImeAction.Previous -> EditorInfo.IME_ACTION_PREVIOUS
+            ImeAction.Search -> EditorInfo.IME_ACTION_SEARCH
+            ImeAction.Send -> EditorInfo.IME_ACTION_SEND
+            ImeAction.Done -> EditorInfo.IME_ACTION_DONE
+            else -> error("invalid ImeAction")
         }
-        ImeAction.None -> EditorInfo.IME_ACTION_NONE
-        ImeAction.Go -> EditorInfo.IME_ACTION_GO
-        ImeAction.Next -> EditorInfo.IME_ACTION_NEXT
-        ImeAction.Previous -> EditorInfo.IME_ACTION_PREVIOUS
-        ImeAction.Search -> EditorInfo.IME_ACTION_SEARCH
-        ImeAction.Send -> EditorInfo.IME_ACTION_SEND
-        ImeAction.Done -> EditorInfo.IME_ACTION_DONE
-        else -> error("invalid ImeAction")
-    }
-    imeOptions.platformImeOptions?.privateImeOptions?.let {
-        privateImeOptions = it
-    }
+    imeOptions.platformImeOptions?.privateImeOptions?.let { privateImeOptions = it }
     when (imeOptions.keyboardType) {
         KeyboardType.Text -> this.inputType = InputType.TYPE_CLASS_TEXT
         KeyboardType.Ascii -> {
@@ -511,16 +513,14 @@
             this.inputType =
                 InputType.TYPE_CLASS_TEXT or EditorInfo.TYPE_TEXT_VARIATION_EMAIL_ADDRESS
         KeyboardType.Password -> {
-            this.inputType =
-                InputType.TYPE_CLASS_TEXT or EditorInfo.TYPE_TEXT_VARIATION_PASSWORD
+            this.inputType = InputType.TYPE_CLASS_TEXT or EditorInfo.TYPE_TEXT_VARIATION_PASSWORD
         }
         KeyboardType.NumberPassword -> {
             this.inputType =
                 InputType.TYPE_CLASS_NUMBER or EditorInfo.TYPE_NUMBER_VARIATION_PASSWORD
         }
         KeyboardType.Decimal -> {
-            this.inputType =
-                InputType.TYPE_CLASS_NUMBER or EditorInfo.TYPE_NUMBER_FLAG_DECIMAL
+            this.inputType = InputType.TYPE_CLASS_NUMBER or EditorInfo.TYPE_NUMBER_FLAG_DECIMAL
         }
         else -> error("Invalid Keyboard Type")
     }
diff --git a/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/viewinterop/AndroidView.android.kt b/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/viewinterop/AndroidView.android.kt
index 744a9a9..77bb59f 100644
--- a/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/viewinterop/AndroidView.android.kt
+++ b/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/viewinterop/AndroidView.android.kt
@@ -67,14 +67,14 @@
  * completes.
  *
  * [AndroidView] is commonly needed for using Views that are infeasible to be reimplemented in
- * Compose and there is no corresponding Compose API. Common examples for the moment are
- * WebView, SurfaceView, AdView, etc.
+ * Compose and there is no corresponding Compose API. Common examples for the moment are WebView,
+ * SurfaceView, AdView, etc.
  *
  * This overload of [AndroidView] does not automatically pool or reuse Views. If placed inside of a
  * reusable container (including inside a [LazyRow][androidx.compose.foundation.lazy.LazyRow] or
  * [LazyColumn][androidx.compose.foundation.lazy.LazyColumn]), the View instances will always be
- * discarded and recreated if the composition hierarchy containing the AndroidView changes, even
- * if its group structure did not change and the View could have conceivably been reused.
+ * discarded and recreated if the composition hierarchy containing the AndroidView changes, even if
+ * its group structure did not change and the View could have conceivably been reused.
  *
  * To opt-in for View reuse, call the overload of [AndroidView] that accepts an `onReset` callback,
  * and provide a non-null implementation for this callback. Since it is expensive to discard and
@@ -82,14 +82,14 @@
  * especially when building a scrolling list of [AndroidViews][AndroidView]. It is highly
  * recommended to opt-in to View reuse when possible.
  *
- * [AndroidView] will not clip its content to the layout bounds. Use [View.setClipToOutline] on
- * the child View to clip the contents, if desired. Developers will likely want to do this with
- * all subclasses of SurfaceView to keep its contents contained.
+ * [AndroidView] will not clip its content to the layout bounds. Use [View.setClipToOutline] on the
+ * child View to clip the contents, if desired. Developers will likely want to do this with all
+ * subclasses of SurfaceView to keep its contents contained.
  *
  * [AndroidView] has nested scroll interop capabilities if the containing view has nested scroll
- * enabled. This means this Composable can dispatch scroll deltas if it is placed inside a
- * container that participates in nested scroll. For more information on how to enable
- * nested scroll interop:
+ * enabled. This means this Composable can dispatch scroll deltas if it is placed inside a container
+ * that participates in nested scroll. For more information on how to enable nested scroll interop:
+ *
  * @sample androidx.compose.ui.samples.ViewInComposeNestedScrollInteropSample
  *
  * @sample androidx.compose.ui.samples.AndroidViewSample
@@ -97,7 +97,7 @@
  * @param factory The block creating the [View] to be composed.
  * @param modifier The modifier to be applied to the layout.
  * @param update A callback to be invoked after the layout is inflated and upon recomposition to
- * update the information and state of the view.
+ *   update the information and state of the view.
  */
 @Composable
 @UiComposable
@@ -106,12 +106,7 @@
     modifier: Modifier = Modifier,
     update: (T) -> Unit = NoOpUpdate
 ) {
-    AndroidView(
-        factory = factory,
-        modifier = modifier,
-        update = update,
-        onRelease = NoOpUpdate
-    )
+    AndroidView(factory = factory, modifier = modifier, update = update, onRelease = NoOpUpdate)
 }
 
 /**
@@ -124,17 +119,17 @@
  * completes.
  *
  * [AndroidView] is commonly needed for using Views that are infeasible to be reimplemented in
- * Compose and there is no corresponding Compose API. Common examples for the moment are
- * WebView, SurfaceView, AdView, etc.
+ * Compose and there is no corresponding Compose API. Common examples for the moment are WebView,
+ * SurfaceView, AdView, etc.
  *
  * By default, [AndroidView] does not automatically pool or reuse Views. If placed inside of a
  * reusable container (including inside a [LazyRow][androidx.compose.foundation.lazy.LazyRow] or
  * [LazyColumn][androidx.compose.foundation.lazy.LazyColumn]), the View instances will always be
- * discarded and recreated if the composition hierarchy containing the AndroidView changes, even
- * if its group structure did not change and the View could have conceivably been reused.
+ * discarded and recreated if the composition hierarchy containing the AndroidView changes, even if
+ * its group structure did not change and the View could have conceivably been reused.
  *
- * Views are eligible for reuse if [AndroidView] is given a non-null [onReset] callback. Since
- * it is expensive to discard and recreate View instances, reusing Views can lead to noticeable
+ * Views are eligible for reuse if [AndroidView] is given a non-null [onReset] callback. Since it is
+ * expensive to discard and recreate View instances, reusing Views can lead to noticeable
  * performance improvements — especially when building a scrolling list of
  * [AndroidViews][AndroidView]. It is highly recommended to specify an [onReset] implementation and
  * opt-in to View reuse when possible.
@@ -142,14 +137,14 @@
  * When [onReset] is specified, [View] instances may be reused when hosted inside of a container
  * that supports reusable elements. Reuse occurs when compatible instances of [AndroidView] are
  * inserted and removed during recomposition. Two instances of `AndroidView` are considered
- * compatible if they are invoked with the same composable group structure. The most common
- * scenario where this happens is in lazy layout APIs like `LazyRow` and `LazyColumn`, which
- * can reuse layout nodes (and Views, in this case) between items when scrolling.
+ * compatible if they are invoked with the same composable group structure. The most common scenario
+ * where this happens is in lazy layout APIs like `LazyRow` and `LazyColumn`, which can reuse layout
+ * nodes (and Views, in this case) between items when scrolling.
  *
  * [onReset] is invoked on the UI thread when the View will be reused, signaling that the View
- * should be prepared to appear in a new context in the composition hierarchy. This callback
- * is invoked before [update] and may be used to reset any transient View state like animations or
- * user input.
+ * should be prepared to appear in a new context in the composition hierarchy. This callback is
+ * invoked before [update] and may be used to reset any transient View state like animations or user
+ * input.
  *
  * Note that [onReset] may not be immediately followed by a call to [update]. Compose may
  * temporarily detach the View from the composition hierarchy if it is deactivated but not released
@@ -157,8 +152,8 @@
  * currently active or inside of a [movable content][androidx.compose.runtime.movableContentOf]
  * block that is being moved. If this happens, the View will be removed from its parent, but
  * retained by Compose so that it may be reused if its content host becomes active again. If the
- * View never becomes active again and is instead discarded entirely, the [onReset] callback will
- * be invoked directly from this deactivated state when Compose releases the View.
+ * View never becomes active again and is instead discarded entirely, the [onReset] callback will be
+ * invoked directly from this deactivated state when Compose releases the View.
  *
  * If you need to observe whether the View is currently used in the composition hierarchy, you may
  * observe whether it is attached via [View.addOnAttachStateChangeListener]. The View may also
@@ -167,19 +162,19 @@
  * be used until the View is attached.
  *
  * When the View is removed from the composition permanently, [onRelease] will be invoked (also on
- * the UI thread). Once this callback returns, Compose will never attempt to reuse the previous
- * View instance regardless of whether an [onReset] implementation was provided. If the View is
- * needed again in the future, a new instance will be created, with a fresh lifecycle that begins
- * by calling the [factory].
+ * the UI thread). Once this callback returns, Compose will never attempt to reuse the previous View
+ * instance regardless of whether an [onReset] implementation was provided. If the View is needed
+ * again in the future, a new instance will be created, with a fresh lifecycle that begins by
+ * calling the [factory].
  *
- * [AndroidView] will not clip its content to the layout bounds. Use [View.setClipToOutline] on
- * the child View to clip the contents, if desired. Developers will likely want to do this with
- * all subclasses of SurfaceView to keep its contents contained.
+ * [AndroidView] will not clip its content to the layout bounds. Use [View.setClipToOutline] on the
+ * child View to clip the contents, if desired. Developers will likely want to do this with all
+ * subclasses of SurfaceView to keep its contents contained.
  *
  * [AndroidView] has nested scroll interop capabilities if the containing view has nested scroll
- * enabled. This means this Composable can dispatch scroll deltas if it is placed inside a
- * container that participates in nested scroll. For more information on how to enable
- * nested scroll interop:
+ * enabled. This means this Composable can dispatch scroll deltas if it is placed inside a container
+ * that participates in nested scroll. For more information on how to enable nested scroll interop:
+ *
  * @sample androidx.compose.ui.samples.ViewInComposeNestedScrollInteropSample
  *
  * @sample androidx.compose.ui.samples.AndroidViewSample
@@ -191,15 +186,15 @@
  * @param factory The block creating the [View] to be composed.
  * @param modifier The modifier to be applied to the layout.
  * @param onReset A callback invoked as a signal that the view is about to be attached to the
- * composition hierarchy in a different context than its original creation. This callback is invoked
- * before [update] and should prepare the view for general reuse. If `null` or not specified, the
- * `AndroidView` instance will not support reuse, and the View instance will always be discarded
- * whenever the AndroidView is moved or removed from the composition hierarchy.
+ *   composition hierarchy in a different context than its original creation. This callback is
+ *   invoked before [update] and should prepare the view for general reuse. If `null` or not
+ *   specified, the `AndroidView` instance will not support reuse, and the View instance will always
+ *   be discarded whenever the AndroidView is moved or removed from the composition hierarchy.
  * @param onRelease A callback invoked as a signal that this view instance has exited the
- * composition hierarchy entirely and will not be reused again. Any additional resources used by the
- * View should be freed at this time.
+ *   composition hierarchy entirely and will not be reused again. Any additional resources used by
+ *   the View should be freed at this time.
  * @param update A callback to be invoked after the layout is inflated and upon recomposition to
- * update the information and state of the view.
+ *   update the information and state of the view.
  */
 @Composable
 @UiComposable
@@ -262,9 +257,7 @@
 }
 
 @Composable
-private fun <T : View> createAndroidViewNodeFactory(
-    factory: (Context) -> T
-): () -> LayoutNode {
+private fun <T : View> createAndroidViewNodeFactory(factory: (Context) -> T): () -> LayoutNode {
     val compositeKeyHash = currentCompositeKeyHash
     val context = LocalContext.current
     val parentReference = rememberCompositionContext()
@@ -273,13 +266,14 @@
 
     return {
         ViewFactoryHolder(
-            context = context,
-            factory = factory,
-            parentContext = parentReference,
-            saveStateRegistry = stateRegistry,
-            compositeKeyHash = compositeKeyHash,
-            owner = ownerView as Owner
-        ).layoutNode
+                context = context,
+                factory = factory,
+                parentContext = parentReference,
+                saveStateRegistry = stateRegistry,
+                compositeKeyHash = compositeKeyHash,
+                owner = ownerView as Owner
+            )
+            .layoutNode
     }
 }
 
@@ -296,17 +290,15 @@
     set(modifier) { requireViewFactoryHolder<T>().modifier = it }
     set(density) { requireViewFactoryHolder<T>().density = it }
     set(lifecycleOwner) { requireViewFactoryHolder<T>().lifecycleOwner = it }
-    set(savedStateRegistryOwner) {
-        requireViewFactoryHolder<T>().savedStateRegistryOwner = it
-    }
+    set(savedStateRegistryOwner) { requireViewFactoryHolder<T>().savedStateRegistryOwner = it }
     set(layoutDirection) {
-        requireViewFactoryHolder<T>().layoutDirection = when (it) {
-            LayoutDirection.Ltr -> android.util.LayoutDirection.LTR
-            LayoutDirection.Rtl -> android.util.LayoutDirection.RTL
-        }
+        requireViewFactoryHolder<T>().layoutDirection =
+            when (it) {
+                LayoutDirection.Ltr -> android.util.LayoutDirection.LTR
+                LayoutDirection.Rtl -> android.util.LayoutDirection.RTL
+            }
     }
-    @OptIn(ExperimentalComposeUiApi::class)
-    set(compositeKeyHash, SetCompositeKeyHash)
+    @OptIn(ExperimentalComposeUiApi::class) set(compositeKeyHash, SetCompositeKeyHash)
 }
 
 @Suppress("UNCHECKED_CAST", "ExceptionMessage")
@@ -315,12 +307,11 @@
     return checkPreconditionNotNull(interopViewFactoryHolder) as ViewFactoryHolder<T>
 }
 
-/**
- * An empty update block used by [AndroidView].
- */
+/** An empty update block used by [AndroidView]. */
 val NoOpUpdate: View.() -> Unit = {}
 
-internal class ViewFactoryHolder<T : View> private constructor(
+internal class ViewFactoryHolder<T : View>
+private constructor(
     context: Context,
     parentContext: CompositionContext? = null,
     private val typedView: T,
@@ -329,7 +320,8 @@
     private val saveStateRegistry: SaveableStateRegistry?,
     private val compositeKeyHash: Int,
     owner: Owner,
-) : AndroidViewHolder(context, parentContext, compositeKeyHash, dispatcher, typedView, owner),
+) :
+    AndroidViewHolder(context, parentContext, compositeKeyHash, dispatcher, typedView, owner),
     ViewRootForInspector {
 
     constructor(
@@ -348,7 +340,8 @@
         owner = owner,
     )
 
-    override val viewRoot: View get() = this
+    override val viewRoot: View
+        get() = this
 
     private val saveStateKey: String
 
@@ -363,8 +356,8 @@
         saveStateKey = compositeKeyHash.toString()
 
         @Suppress("UNCHECKED_CAST")
-        val savedState = saveStateRegistry
-            ?.consumeRestored(saveStateKey) as? SparseArray<Parcelable>
+        val savedState =
+            saveStateRegistry?.consumeRestored(saveStateKey) as? SparseArray<Parcelable>
         savedState?.let { typedView.restoreHierarchyState(it) }
         registerSaveStateProvider()
     }
@@ -392,11 +385,10 @@
 
     private fun registerSaveStateProvider() {
         if (saveStateRegistry != null) {
-            savableRegistryEntry = saveStateRegistry.registerProvider(saveStateKey) {
-                SparseArray<Parcelable>().apply {
-                    typedView.saveHierarchyState(this)
+            savableRegistryEntry =
+                saveStateRegistry.registerProvider(saveStateKey) {
+                    SparseArray<Parcelable>().apply { typedView.saveHierarchyState(this) }
                 }
-            }
         }
     }
 
diff --git a/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/viewinterop/AndroidViewHolder.android.kt b/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/viewinterop/AndroidViewHolder.android.kt
index 6789cf6..04d4925 100644
--- a/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/viewinterop/AndroidViewHolder.android.kt
+++ b/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/viewinterop/AndroidViewHolder.android.kt
@@ -68,9 +68,9 @@
 import kotlinx.coroutines.launch
 
 /**
- * A base class used to host a [View] inside Compose.
- * This API is not designed to be used directly, but rather using the [AndroidView] and
- * `AndroidViewBinding` APIs, which are built on top of [AndroidViewHolder].
+ * A base class used to host a [View] inside Compose. This API is not designed to be used directly,
+ * but rather using the [AndroidView] and `AndroidViewBinding` APIs, which are built on top of
+ * [AndroidViewHolder].
  *
  * @param view The view hosted by this holder.
  * @param owner The [Owner] of the composition that this holder lives in.
@@ -89,29 +89,24 @@
         // Any [Abstract]ComposeViews that are descendants of this view will host
         // subcompositions of the host composition.
         // UiApplier doesn't supply this, only AndroidView.
-        parentContext?.let {
-            compositionContext = it
-        }
+        parentContext?.let { compositionContext = it }
         // We save state ourselves, depending on composition.
         isSaveFromParentEnabled = false
 
-        @Suppress("LeakingThis")
-        addView(view)
+        @Suppress("LeakingThis") addView(view)
     }
 
     // Keep nullable to match the `expect` declaration of InteropViewFactoryHolder
-    @Suppress("RedundantNullableReturnType")
-    fun getInteropView(): InteropView? = view
+    @Suppress("RedundantNullableReturnType") fun getInteropView(): InteropView? = view
 
-    /**
-     * The update logic of the [View].
-     */
+    /** The update logic of the [View]. */
     var update: () -> Unit = {}
         protected set(value) {
             field = value
             hasUpdateBlock = true
             runUpdate()
         }
+
     private var hasUpdateBlock = false
 
     var reset: () -> Unit = {}
@@ -120,9 +115,7 @@
     var release: () -> Unit = {}
         protected set
 
-    /**
-     * The modifier of the `LayoutNode` corresponding to this [View].
-     */
+    /** The modifier of the `LayoutNode` corresponding to this [View]. */
     var modifier: Modifier = Modifier
         set(value) {
             if (value !== field) {
@@ -133,9 +126,7 @@
 
     internal var onModifierChanged: ((Modifier) -> Unit)? = null
 
-    /**
-     * The screen density of the layout.
-     */
+    /** The screen density of the layout. */
     var density: Density = Density(1f)
         set(value) {
             if (value !== field) {
@@ -186,9 +177,7 @@
         }
     }
 
-    private val runInvalidate: () -> Unit = {
-        layoutNode.invalidateLayer()
-    }
+    private val runInvalidate: () -> Unit = { layoutNode.invalidateLayer() }
 
     internal var onRequestDisallowInterceptTouchEvent: ((Boolean) -> Unit)? = null
 
@@ -337,8 +326,8 @@
     }
 
     /**
-     * A [LayoutNode] tree representation for this Android [View] holder.
-     * The [LayoutNode] will proxy the Compose core calls to the [View].
+     * A [LayoutNode] tree representation for this Android [View] holder. The [LayoutNode] will
+     * proxy the Compose core calls to the [View].
      */
     val layoutNode: LayoutNode = run {
         // Prepare layout node that proxies measure and layout passes to the View.
@@ -346,25 +335,27 @@
         @OptIn(InternalComposeUiApi::class)
         layoutNode.interopViewFactoryHolder = this@AndroidViewHolder
 
-        val coreModifier = Modifier
-            .nestedScroll(NoOpScrollConnection, dispatcher)
-            .semantics(true) {}
-            .pointerInteropFilter(this)
-            .drawBehind {
-                drawIntoCanvas { canvas ->
-                    if (view.visibility != GONE) {
-                        isDrawing = true
-                        (layoutNode.owner as? AndroidComposeView)
-                            ?.drawAndroidView(this@AndroidViewHolder, canvas.nativeCanvas)
-                        isDrawing = false
+        val coreModifier =
+            Modifier.nestedScroll(NoOpScrollConnection, dispatcher)
+                .semantics(true) {}
+                .pointerInteropFilter(this)
+                .drawBehind {
+                    drawIntoCanvas { canvas ->
+                        if (view.visibility != GONE) {
+                            isDrawing = true
+                            (layoutNode.owner as? AndroidComposeView)?.drawAndroidView(
+                                this@AndroidViewHolder,
+                                canvas.nativeCanvas
+                            )
+                            isDrawing = false
+                        }
                     }
                 }
-            }
-            .onGloballyPositioned {
-                // The global position of this LayoutNode can change with it being replaced. For
-                // these cases, we need to inform the View.
-                layoutAccordingTo(layoutNode)
-            }
+                .onGloballyPositioned {
+                    // The global position of this LayoutNode can change with it being replaced. For
+                    // these cases, we need to inform the View.
+                    layoutAccordingTo(layoutNode)
+                }
         layoutNode.compositeKeyHash = compositeKeyHash
         layoutNode.modifier = modifier.then(coreModifier)
         onModifierChanged = { layoutNode.modifier = it.then(coreModifier) }
@@ -381,75 +372,74 @@
             removeAllViewsInLayout()
         }
 
-        layoutNode.measurePolicy = object : MeasurePolicy {
-            override fun MeasureScope.measure(
-                measurables: List<Measurable>,
-                constraints: Constraints
-            ): MeasureResult {
-                if (childCount == 0) {
-                    return layout(constraints.minWidth, constraints.minHeight) {}
-                }
+        layoutNode.measurePolicy =
+            object : MeasurePolicy {
+                override fun MeasureScope.measure(
+                    measurables: List<Measurable>,
+                    constraints: Constraints
+                ): MeasureResult {
+                    if (childCount == 0) {
+                        return layout(constraints.minWidth, constraints.minHeight) {}
+                    }
 
-                if (constraints.minWidth != 0) {
-                    getChildAt(0).minimumWidth = constraints.minWidth
-                }
-                if (constraints.minHeight != 0) {
-                    getChildAt(0).minimumHeight = constraints.minHeight
-                }
+                    if (constraints.minWidth != 0) {
+                        getChildAt(0).minimumWidth = constraints.minWidth
+                    }
+                    if (constraints.minHeight != 0) {
+                        getChildAt(0).minimumHeight = constraints.minHeight
+                    }
 
-                measure(
-                    obtainMeasureSpec(
-                        constraints.minWidth,
-                        constraints.maxWidth,
-                        layoutParams!!.width
-                    ),
-                    obtainMeasureSpec(
-                        constraints.minHeight,
-                        constraints.maxHeight,
-                        layoutParams!!.height
+                    measure(
+                        obtainMeasureSpec(
+                            constraints.minWidth,
+                            constraints.maxWidth,
+                            layoutParams!!.width
+                        ),
+                        obtainMeasureSpec(
+                            constraints.minHeight,
+                            constraints.maxHeight,
+                            layoutParams!!.height
+                        )
                     )
-                )
-                return layout(measuredWidth, measuredHeight) {
-                    layoutAccordingTo(layoutNode)
+                    return layout(measuredWidth, measuredHeight) { layoutAccordingTo(layoutNode) }
+                }
+
+                override fun IntrinsicMeasureScope.minIntrinsicWidth(
+                    measurables: List<IntrinsicMeasurable>,
+                    height: Int
+                ) = intrinsicWidth(height)
+
+                override fun IntrinsicMeasureScope.maxIntrinsicWidth(
+                    measurables: List<IntrinsicMeasurable>,
+                    height: Int
+                ) = intrinsicWidth(height)
+
+                private fun intrinsicWidth(height: Int): Int {
+                    measure(
+                        MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED),
+                        obtainMeasureSpec(0, height, layoutParams!!.height)
+                    )
+                    return measuredWidth
+                }
+
+                override fun IntrinsicMeasureScope.minIntrinsicHeight(
+                    measurables: List<IntrinsicMeasurable>,
+                    width: Int
+                ) = intrinsicHeight(width)
+
+                override fun IntrinsicMeasureScope.maxIntrinsicHeight(
+                    measurables: List<IntrinsicMeasurable>,
+                    width: Int
+                ) = intrinsicHeight(width)
+
+                private fun intrinsicHeight(width: Int): Int {
+                    measure(
+                        obtainMeasureSpec(0, width, layoutParams!!.width),
+                        MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED)
+                    )
+                    return measuredHeight
                 }
             }
-
-            override fun IntrinsicMeasureScope.minIntrinsicWidth(
-                measurables: List<IntrinsicMeasurable>,
-                height: Int
-            ) = intrinsicWidth(height)
-
-            override fun IntrinsicMeasureScope.maxIntrinsicWidth(
-                measurables: List<IntrinsicMeasurable>,
-                height: Int
-            ) = intrinsicWidth(height)
-
-            private fun intrinsicWidth(height: Int): Int {
-                measure(
-                    MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED),
-                    obtainMeasureSpec(0, height, layoutParams!!.height)
-                )
-                return measuredWidth
-            }
-
-            override fun IntrinsicMeasureScope.minIntrinsicHeight(
-                measurables: List<IntrinsicMeasurable>,
-                width: Int
-            ) = intrinsicHeight(width)
-
-            override fun IntrinsicMeasureScope.maxIntrinsicHeight(
-                measurables: List<IntrinsicMeasurable>,
-                width: Int
-            ) = intrinsicHeight(width)
-
-            private fun intrinsicHeight(width: Int): Int {
-                measure(
-                    obtainMeasureSpec(0, width, layoutParams!!.width),
-                    MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED)
-                )
-                return measuredHeight
-            }
-        }
         layoutNode
     }
 
@@ -457,29 +447,27 @@
      * Intersects [Constraints] and [View] LayoutParams to obtain the suitable [View.MeasureSpec]
      * for measuring the [View].
      */
-    private fun obtainMeasureSpec(
-        min: Int,
-        max: Int,
-        preferred: Int
-    ): Int = when {
-        preferred >= 0 || min == max -> {
-            // Fixed size due to fixed size layout param or fixed constraints.
-            MeasureSpec.makeMeasureSpec(preferred.coerceIn(min, max), MeasureSpec.EXACTLY)
+    private fun obtainMeasureSpec(min: Int, max: Int, preferred: Int): Int =
+        when {
+            preferred >= 0 || min == max -> {
+                // Fixed size due to fixed size layout param or fixed constraints.
+                MeasureSpec.makeMeasureSpec(preferred.coerceIn(min, max), MeasureSpec.EXACTLY)
+            }
+            preferred == LayoutParams.WRAP_CONTENT && max != Constraints.Infinity -> {
+                // Wrap content layout param with finite max constraint. If max constraint is
+                // infinite,
+                // we will measure the child with UNSPECIFIED.
+                MeasureSpec.makeMeasureSpec(max, MeasureSpec.AT_MOST)
+            }
+            preferred == LayoutParams.MATCH_PARENT && max != Constraints.Infinity -> {
+                // Match parent layout param, so we force the child to fill the available space.
+                MeasureSpec.makeMeasureSpec(max, MeasureSpec.EXACTLY)
+            }
+            else -> {
+                // max constraint is infinite and layout param is WRAP_CONTENT or MATCH_PARENT.
+                MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED)
+            }
         }
-        preferred == LayoutParams.WRAP_CONTENT && max != Constraints.Infinity -> {
-            // Wrap content layout param with finite max constraint. If max constraint is infinite,
-            // we will measure the child with UNSPECIFIED.
-            MeasureSpec.makeMeasureSpec(max, MeasureSpec.AT_MOST)
-        }
-        preferred == LayoutParams.MATCH_PARENT && max != Constraints.Infinity -> {
-            // Match parent layout param, so we force the child to fill the available space.
-            MeasureSpec.makeMeasureSpec(max, MeasureSpec.EXACTLY)
-        }
-        else -> {
-            // max constraint is infinite and layout param is WRAP_CONTENT or MATCH_PARENT.
-            MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED)
-        }
-    }
 
     // TODO: b/203141462 - consume whether the AndroidView() is inside a scrollable container, and
     //  use that to set this. In the meantime set true as the defensive default.
@@ -560,15 +548,9 @@
         val viewVelocity = Velocity(velocityX.toComposeVelocity(), velocityY.toComposeVelocity())
         dispatcher.coroutineScope.launch {
             if (!consumed) {
-                dispatcher.dispatchPostFling(
-                    consumed = Velocity.Zero,
-                    available = viewVelocity
-                )
+                dispatcher.dispatchPostFling(consumed = Velocity.Zero, available = viewVelocity)
             } else {
-                dispatcher.dispatchPostFling(
-                    consumed = viewVelocity,
-                    available = Velocity.Zero
-                )
+                dispatcher.dispatchPostFling(consumed = viewVelocity, available = Velocity.Zero)
             }
         }
         return false
@@ -577,9 +559,7 @@
     override fun onNestedPreFling(target: View, velocityX: Float, velocityY: Float): Boolean {
         if (!isNestedScrollingEnabled) return false
         val toBeConsumed = Velocity(velocityX.toComposeVelocity(), velocityY.toComposeVelocity())
-        dispatcher.coroutineScope.launch {
-            dispatcher.dispatchPreFling(toBeConsumed)
-        }
+        dispatcher.coroutineScope.launch { dispatcher.dispatchPreFling(toBeConsumed) }
         return false
     }
 
@@ -604,8 +584,8 @@
 private const val Unmeasured = Int.MIN_VALUE
 
 /**
- * No-op Connection required by nested scroll modifier. This is No-op because we don't want
- * to influence nested scrolling with it and it is required by [Modifier.nestedScroll].
+ * No-op Connection required by nested scroll modifier. This is No-op because we don't want to
+ * influence nested scrolling with it and it is required by [Modifier.nestedScroll].
  */
 private val NoOpScrollConnection = object : NestedScrollConnection {}
 
@@ -613,7 +593,8 @@
 
 private fun Float.toComposeVelocity(): Float = this * -1f
 
-private fun toNestedScrollSource(type: Int): NestedScrollSource = when (type) {
-    ViewCompat.TYPE_TOUCH -> NestedScrollSource.UserInput
-    else -> NestedScrollSource.SideEffect
-}
+private fun toNestedScrollSource(type: Int): NestedScrollSource =
+    when (type) {
+        ViewCompat.TYPE_TOUCH -> NestedScrollSource.UserInput
+        else -> NestedScrollSource.SideEffect
+    }
diff --git a/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/viewinterop/FocusGroupNode.android.kt b/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/viewinterop/FocusGroupNode.android.kt
index 70ee1e8..7a2b54c 100644
--- a/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/viewinterop/FocusGroupNode.android.kt
+++ b/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/viewinterop/FocusGroupNode.android.kt
@@ -45,13 +45,14 @@
 import androidx.compose.ui.node.visitLocalDescendants
 import androidx.compose.ui.platform.InspectorInfo
 
-internal fun Modifier.focusInteropModifier(): Modifier = this
-    // Focus Group to intercept focus enter/exit.
-    .then(FocusGroupPropertiesElement)
-    .focusTarget()
-    // Focus Target to make the embedded view focusable.
-    .then(FocusTargetPropertiesElement)
-    .focusTarget()
+internal fun Modifier.focusInteropModifier(): Modifier =
+    this
+        // Focus Group to intercept focus enter/exit.
+        .then(FocusGroupPropertiesElement)
+        .focusTarget()
+        // Focus Target to make the embedded view focusable.
+        .then(FocusTargetPropertiesElement)
+        .focusTarget()
 
 private class FocusTargetPropertiesNode : Modifier.Node(), FocusPropertiesModifierNode {
     override fun applyFocusProperties(focusProperties: FocusProperties) {
@@ -59,8 +60,11 @@
     }
 }
 
-private class FocusGroupPropertiesNode : Modifier.Node(), FocusPropertiesModifierNode,
-    ViewTreeObserver.OnGlobalFocusChangeListener, View.OnAttachStateChangeListener {
+private class FocusGroupPropertiesNode :
+    Modifier.Node(),
+    FocusPropertiesModifierNode,
+    ViewTreeObserver.OnGlobalFocusChangeListener,
+    View.OnAttachStateChangeListener {
     var focusedChild: View? = null
 
     override fun applyFocusProperties(focusProperties: FocusProperties) {
@@ -80,10 +84,11 @@
         val focusOwner = requireOwner().focusOwner
         val hostView = requireOwner() as View
 
-        val targetViewFocused = embeddedView.requestInteropFocus(
-            direction = focusDirection.toAndroidFocusDirection(),
-            rect = getCurrentlyFocusedRect(focusOwner, hostView, embeddedView)
-        )
+        val targetViewFocused =
+            embeddedView.requestInteropFocus(
+                direction = focusDirection.toAndroidFocusDirection(),
+                rect = getCurrentlyFocusedRect(focusOwner, hostView, embeddedView)
+            )
         return if (targetViewFocused) Default else @OptIn(ExperimentalComposeUiApi::class) Cancel
     }
 
@@ -103,17 +108,17 @@
         val focusedRect = getCurrentlyFocusedRect(focusOwner, hostView, embeddedView)
         val androidFocusDirection = focusDirection.toAndroidFocusDirection() ?: FOCUS_DOWN
 
-        val nextView = with(FocusFinder.getInstance()) {
-            if (focusedChild != null) {
-                findNextFocus(hostView as ViewGroup, focusedChild, androidFocusDirection)
-            } else {
-                findNextFocusFromRect(hostView as ViewGroup, focusedRect, androidFocusDirection)
+        val nextView =
+            with(FocusFinder.getInstance()) {
+                if (focusedChild != null) {
+                    findNextFocus(hostView as ViewGroup, focusedChild, androidFocusDirection)
+                } else {
+                    findNextFocusFromRect(hostView as ViewGroup, focusedRect, androidFocusDirection)
+                }
             }
-        }
         if (nextView != null && embeddedView.containsDescendant(nextView)) {
             nextView.requestFocus(androidFocusDirection, focusedRect)
-            @OptIn(ExperimentalComposeUiApi::class)
-            return Cancel
+            @OptIn(ExperimentalComposeUiApi::class) return Cancel
         } else {
             check(hostView.requestFocus()) { "host view did not take focus" }
             return Default
@@ -190,19 +195,32 @@
         v.viewTreeObserver.removeOnGlobalFocusChangeListener(this)
     }
 }
+
 private object FocusGroupPropertiesElement : ModifierNodeElement<FocusGroupPropertiesNode>() {
     override fun create(): FocusGroupPropertiesNode = FocusGroupPropertiesNode()
+
     override fun update(node: FocusGroupPropertiesNode) {}
-    override fun InspectorInfo.inspectableProperties() { name = "FocusGroupProperties" }
+
+    override fun InspectorInfo.inspectableProperties() {
+        name = "FocusGroupProperties"
+    }
+
     override fun hashCode() = "FocusGroupProperties".hashCode()
+
     override fun equals(other: Any?) = other === this
 }
 
 private object FocusTargetPropertiesElement : ModifierNodeElement<FocusTargetPropertiesNode>() {
     override fun create(): FocusTargetPropertiesNode = FocusTargetPropertiesNode()
+
     override fun update(node: FocusTargetPropertiesNode) {}
-    override fun InspectorInfo.inspectableProperties() { name = "FocusTargetProperties" }
+
+    override fun InspectorInfo.inspectableProperties() {
+        name = "FocusTargetProperties"
+    }
+
     override fun hashCode() = "FocusTargetProperties".hashCode()
+
     override fun equals(other: Any?) = other === this
 }
 
diff --git a/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/window/AndroidDialog.android.kt b/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/window/AndroidDialog.android.kt
index 28754ba..37bbfc5 100644
--- a/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/window/AndroidDialog.android.kt
+++ b/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/window/AndroidDialog.android.kt
@@ -70,22 +70,23 @@
 /**
  * Properties used to customize the behavior of a [Dialog].
  *
- * @property dismissOnBackPress whether the dialog can be dismissed by pressing the back button.
- * If true, pressing the back button will call onDismissRequest.
+ * @property dismissOnBackPress whether the dialog can be dismissed by pressing the back button. If
+ *   true, pressing the back button will call onDismissRequest.
  * @property dismissOnClickOutside whether the dialog can be dismissed by clicking outside the
- * dialog's bounds. If true, clicking outside the dialog will call onDismissRequest.
+ *   dialog's bounds. If true, clicking outside the dialog will call onDismissRequest.
  * @property securePolicy Policy for setting [WindowManager.LayoutParams.FLAG_SECURE] on the
- * dialog's window.
+ *   dialog's window.
  * @property usePlatformDefaultWidth Whether the width of the dialog's content should be limited to
- * the platform default, which is smaller than the screen width.
+ *   the platform default, which is smaller than the screen width.
  * @property decorFitsSystemWindows Sets [WindowCompat.setDecorFitsSystemWindows] value. Set to
- * `false` to use WindowInsets. If `false`, the
- * [soft input mode][WindowManager.LayoutParams.softInputMode] will be changed to
- * [WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE] and `android:windowIsFloating` is
- * set to `false` for Android [R][Build.VERSION_CODES.R] and earlier.
+ *   `false` to use WindowInsets. If `false`, the
+ *   [soft input mode][WindowManager.LayoutParams.softInputMode] will be changed to
+ *   [WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE] and `android:windowIsFloating` is set to
+ *   `false` for Android [R][Build.VERSION_CODES.R] and earlier.
  */
 @Immutable
-actual class DialogProperties constructor(
+actual class DialogProperties
+constructor(
     actual val dismissOnBackPress: Boolean = true,
     actual val dismissOnClickOutside: Boolean = true,
     val securePolicy: SecureFlagPolicy = SecureFlagPolicy.Inherit,
@@ -143,13 +144,13 @@
 /**
  * Opens a dialog with the given content.
  *
- * A dialog is a small window that prompts the user to make a decision or enter
- * additional information. A dialog does not fill the screen and is normally used
- * for modal events that require users to take an action before they can proceed.
+ * A dialog is a small window that prompts the user to make a decision or enter additional
+ * information. A dialog does not fill the screen and is normally used for modal events that require
+ * users to take an action before they can proceed.
  *
- * The dialog is visible as long as it is part of the composition hierarchy.
- * In order to let the user dismiss the Dialog, the implementation of [onDismissRequest] should
- * contain a way to remove the dialog from the composition hierarchy.
+ * The dialog is visible as long as it is part of the composition hierarchy. In order to let the
+ * user dismiss the Dialog, the implementation of [onDismissRequest] should contain a way to remove
+ * the dialog from the composition hierarchy.
  *
  * Example usage:
  *
@@ -171,26 +172,22 @@
     val composition = rememberCompositionContext()
     val currentContent by rememberUpdatedState(content)
     val dialogId = rememberSaveable { UUID.randomUUID() }
-    val dialog = remember(view, density) {
-        DialogWrapper(
-            onDismissRequest,
-            properties,
-            view,
-            layoutDirection,
-            density,
-            dialogId
-        ).apply {
-            setContent(composition) {
-                // TODO(b/159900354): draw a scrim and add margins around the Compose Dialog, and
-                //  consume clicks so they can't pass through to the underlying UI
-                DialogLayout(
-                    Modifier.semantics { dialog() },
-                ) {
-                    currentContent()
+    val dialog =
+        remember(view, density) {
+            DialogWrapper(onDismissRequest, properties, view, layoutDirection, density, dialogId)
+                .apply {
+                    setContent(composition) {
+                        // TODO(b/159900354): draw a scrim and add margins around the Compose
+                        // Dialog, and
+                        //  consume clicks so they can't pass through to the underlying UI
+                        DialogLayout(
+                            Modifier.semantics { dialog() },
+                        ) {
+                            currentContent()
+                        }
+                    }
                 }
-            }
         }
-    }
 
     DisposableEffect(dialog) {
         dialog.show()
@@ -220,10 +217,8 @@
 }
 
 @Suppress("ViewConstructor")
-private class DialogLayout(
-    context: Context,
-    override val window: Window
-) : AbstractComposeView(context), DialogWindowProvider {
+private class DialogLayout(context: Context, override val window: Window) :
+    AbstractComposeView(context), DialogWindowProvider {
 
     private var content: @Composable () -> Unit by mutableStateOf({})
 
@@ -291,20 +286,23 @@
     layoutDirection: LayoutDirection,
     density: Density,
     dialogId: UUID
-) : ComponentDialog(
-    /**
-     * [Window.setClipToOutline] is only available from 22+, but the style attribute exists on 21.
-     * So use a wrapped context that sets this attribute for compatibility back to 21.
-     */
-    ContextThemeWrapper(
-        composeView.context,
-        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S || properties.decorFitsSystemWindows) {
-            R.style.DialogWindowTheme
-        } else {
-            R.style.FloatingDialogWindowTheme
-        }
-    )
-),
+) :
+    ComponentDialog(
+        /**
+         * [Window.setClipToOutline] is only available from 22+, but the style attribute exists
+         * on 21. So use a wrapped context that sets this attribute for compatibility back to 21.
+         */
+        ContextThemeWrapper(
+            composeView.context,
+            if (
+                Build.VERSION.SDK_INT >= Build.VERSION_CODES.S || properties.decorFitsSystemWindows
+            ) {
+                R.style.DialogWindowTheme
+            } else {
+                R.style.FloatingDialogWindowTheme
+            }
+        )
+    ),
     ViewRootForInspector {
 
     private val dialogLayout: DialogLayout
@@ -313,7 +311,8 @@
     // elevation, so high values of maxSupportedElevation break accessibility services: b/232788477.
     private val maxSupportedElevation = 8.dp
 
-    override val subCompositionView: AbstractComposeView get() = dialogLayout
+    override val subCompositionView: AbstractComposeView
+        get() = dialogLayout
 
     private val defaultSoftInputMode: Int
 
@@ -325,28 +324,33 @@
         window.setBackgroundDrawableResource(android.R.color.transparent)
         @OptIn(ExperimentalComposeUiApi::class)
         WindowCompat.setDecorFitsSystemWindows(window, properties.decorFitsSystemWindows)
-        dialogLayout = DialogLayout(context, window).apply {
-            // Set unique id for AbstractComposeView. This allows state restoration for the state
-            // defined inside the Dialog via rememberSaveable()
-            setTag(R.id.compose_view_saveable_id_tag, "Dialog:$dialogId")
-            // Enable children to draw their shadow by not clipping them
-            clipChildren = false
-            // Allocate space for elevation
-            with(density) { elevation = maxSupportedElevation.toPx() }
-            // Simple outline to force window manager to allocate space for shadow.
-            // Note that the outline affects clickable area for the dismiss listener. In case of
-            // shapes like circle the area for dismiss might be to small (rectangular outline
-            // consuming clicks outside of the circle).
-            outlineProvider = object : ViewOutlineProvider() {
-                override fun getOutline(view: View, result: Outline) {
-                    result.setRect(0, 0, view.width, view.height)
-                    // We set alpha to 0 to hide the view's shadow and let the composable to draw
-                    // its own shadow. This still enables us to get the extra space needed in the
-                    // surface.
-                    result.alpha = 0f
-                }
+        dialogLayout =
+            DialogLayout(context, window).apply {
+                // Set unique id for AbstractComposeView. This allows state restoration for the
+                // state
+                // defined inside the Dialog via rememberSaveable()
+                setTag(R.id.compose_view_saveable_id_tag, "Dialog:$dialogId")
+                // Enable children to draw their shadow by not clipping them
+                clipChildren = false
+                // Allocate space for elevation
+                with(density) { elevation = maxSupportedElevation.toPx() }
+                // Simple outline to force window manager to allocate space for shadow.
+                // Note that the outline affects clickable area for the dismiss listener. In case of
+                // shapes like circle the area for dismiss might be to small (rectangular outline
+                // consuming clicks outside of the circle).
+                outlineProvider =
+                    object : ViewOutlineProvider() {
+                        override fun getOutline(view: View, result: Outline) {
+                            result.setRect(0, 0, view.width, view.height)
+                            // We set alpha to 0 to hide the view's shadow and let the composable to
+                            // draw
+                            // its own shadow. This still enables us to get the extra space needed
+                            // in the
+                            // surface.
+                            result.alpha = 0f
+                        }
+                    }
             }
-        }
 
         /**
          * Disables clipping for [this] and all its descendant [ViewGroup]s until we reach a
@@ -385,10 +389,11 @@
     }
 
     private fun setLayoutDirection(layoutDirection: LayoutDirection) {
-        dialogLayout.layoutDirection = when (layoutDirection) {
-            LayoutDirection.Ltr -> android.util.LayoutDirection.LTR
-            LayoutDirection.Rtl -> android.util.LayoutDirection.RTL
-        }
+        dialogLayout.layoutDirection =
+            when (layoutDirection) {
+                LayoutDirection.Ltr -> android.util.LayoutDirection.LTR
+                LayoutDirection.Rtl -> android.util.LayoutDirection.RTL
+            }
     }
 
     // TODO(b/159900354): Make the Android Dialog full screen and the scrim fully transparent
@@ -459,19 +464,11 @@
 }
 
 @Composable
-private fun DialogLayout(
-    modifier: Modifier = Modifier,
-    content: @Composable () -> Unit
-) {
-    Layout(
-        content = content,
-        modifier = modifier
-    ) { measurables, constraints ->
+private fun DialogLayout(modifier: Modifier = Modifier, content: @Composable () -> Unit) {
+    Layout(content = content, modifier = modifier) { measurables, constraints ->
         val placeables = measurables.fastMap { it.measure(constraints) }
         val width = placeables.fastMaxBy { it.width }?.width ?: constraints.minWidth
         val height = placeables.fastMaxBy { it.height }?.height ?: constraints.minHeight
-        layout(width, height) {
-            placeables.fastForEach { it.placeRelative(0, 0) }
-        }
+        layout(width, height) { placeables.fastForEach { it.placeRelative(0, 0) } }
     }
 }
diff --git a/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/window/AndroidPopup.android.kt b/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/window/AndroidPopup.android.kt
index 36c9254..ba9f34c 100644
--- a/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/window/AndroidPopup.android.kt
+++ b/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/window/AndroidPopup.android.kt
@@ -93,25 +93,26 @@
  * Properties used to customize the behavior of a [Popup].
  *
  * @property flags Behavioral flags of the popup, which will be passed to the popup window's
- * [WindowManager.LayoutParams]. See [WindowManager.LayoutParams.flags] for customization options.
- * If [inheritSecurePolicy] is true, the value of the [WindowManager.LayoutParams.FLAG_SECURE]
- * bit will not be determined until the popup is constructed.
+ *   [WindowManager.LayoutParams]. See [WindowManager.LayoutParams.flags] for customization options.
+ *   If [inheritSecurePolicy] is true, the value of the [WindowManager.LayoutParams.FLAG_SECURE] bit
+ *   will not be determined until the popup is constructed.
  * @property inheritSecurePolicy Whether [WindowManager.LayoutParams.FLAG_SECURE] should be set
- * according to [SecureFlagPolicy.Inherit]. Other [SecureFlagPolicy] behaviors should be set via
- * [flags] directly.
- * @property dismissOnBackPress Whether the popup can be dismissed by pressing the back button.
- * If true, pressing the back button will call onDismissRequest. Note that the popup must be
- * [focusable] in order to receive key events such as the back button. If the popup is not
- * [focusable], then this property does nothing.
+ *   according to [SecureFlagPolicy.Inherit]. Other [SecureFlagPolicy] behaviors should be set via
+ *   [flags] directly.
+ * @property dismissOnBackPress Whether the popup can be dismissed by pressing the back button. If
+ *   true, pressing the back button will call onDismissRequest. Note that the popup must be
+ *   [focusable] in order to receive key events such as the back button. If the popup is not
+ *   [focusable], then this property does nothing.
  * @property dismissOnClickOutside Whether the popup can be dismissed by clicking outside the
- * popup's bounds. If true, clicking outside the popup will call onDismissRequest.
- * @property excludeFromSystemGesture A flag to check whether to set the systemGestureExclusionRects.
- * The default is true.
+ *   popup's bounds. If true, clicking outside the popup will call onDismissRequest.
+ * @property excludeFromSystemGesture A flag to check whether to set the
+ *   systemGestureExclusionRects. The default is true.
  * @property usePlatformDefaultWidth Whether the width of the popup's content should be limited to
- * the platform default, which is smaller than the screen width.
+ *   the platform default, which is smaller than the screen width.
  */
 @Immutable
-actual class PopupProperties constructor(
+actual class PopupProperties
+constructor(
     internal val flags: Int,
     internal val inheritSecurePolicy: Boolean = true,
     actual val dismissOnBackPress: Boolean = true,
@@ -124,7 +125,7 @@
         dismissOnBackPress: Boolean,
         dismissOnClickOutside: Boolean,
         clippingEnabled: Boolean,
-    ) : this (
+    ) : this(
         focusable = focusable,
         dismissOnBackPress = dismissOnBackPress,
         dismissOnClickOutside = dismissOnClickOutside,
@@ -140,7 +141,7 @@
         securePolicy: SecureFlagPolicy = SecureFlagPolicy.Inherit,
         excludeFromSystemGesture: Boolean = true,
         clippingEnabled: Boolean = true,
-    ) : this (
+    ) : this(
         focusable = focusable,
         dismissOnBackPress = dismissOnBackPress,
         dismissOnClickOutside = dismissOnClickOutside,
@@ -155,23 +156,23 @@
      * multiplatform and maintain backwards compatibility. Consider the overload that takes a
      * [flags] parameter if more precise control over the popup flags is desired.
      *
-     * @param focusable Whether the popup is focusable. When true, the popup will receive IME
-     * events and key presses, such as when the back button is pressed.
-     * @param dismissOnBackPress Whether the popup can be dismissed by pressing the back button.
-     * If true, pressing the back button will call onDismissRequest. Note that [focusable] must be
-     * set to true in order to receive key events such as the back button. If the popup is not
-     * focusable, then this property does nothing.
+     * @param focusable Whether the popup is focusable. When true, the popup will receive IME events
+     *   and key presses, such as when the back button is pressed.
+     * @param dismissOnBackPress Whether the popup can be dismissed by pressing the back button. If
+     *   true, pressing the back button will call onDismissRequest. Note that [focusable] must be
+     *   set to true in order to receive key events such as the back button. If the popup is not
+     *   focusable, then this property does nothing.
      * @param dismissOnClickOutside Whether the popup can be dismissed by clicking outside the
-     * popup's bounds. If true, clicking outside the popup will call onDismissRequest.
+     *   popup's bounds. If true, clicking outside the popup will call onDismissRequest.
      * @param securePolicy Policy for setting [WindowManager.LayoutParams.FLAG_SECURE] on the
-     * popup's window.
+     *   popup's window.
      * @param excludeFromSystemGesture A flag to check whether to set the
-     * systemGestureExclusionRects. The default is true.
+     *   systemGestureExclusionRects. The default is true.
      * @param clippingEnabled Whether to allow the popup window to extend beyond the bounds of the
-     * screen. By default the window is clipped to the screen boundaries. Setting this to false will
-     * allow windows to be accurately positioned. The default value is true.
+     *   screen. By default the window is clipped to the screen boundaries. Setting this to false
+     *   will allow windows to be accurately positioned. The default value is true.
      * @param usePlatformDefaultWidth Whether the width of the popup's content should be limited to
-     * the platform default, which is smaller than the screen width.
+     *   the platform default, which is smaller than the screen width.
      */
     constructor(
         focusable: Boolean = false,
@@ -181,7 +182,7 @@
         excludeFromSystemGesture: Boolean = true,
         clippingEnabled: Boolean = true,
         usePlatformDefaultWidth: Boolean = false,
-    ) : this (
+    ) : this(
         flags = createFlags(focusable, securePolicy, clippingEnabled),
         inheritSecurePolicy = securePolicy == SecureFlagPolicy.Inherit,
         dismissOnBackPress = dismissOnBackPress,
@@ -191,25 +192,25 @@
     )
 
     /**
-     * Whether the popup is focusable. When true, the popup will receive IME events and key
-     * presses, such as when the back button is pressed.
+     * Whether the popup is focusable. When true, the popup will receive IME events and key presses,
+     * such as when the back button is pressed.
      */
     actual val focusable: Boolean
         get() = (flags and WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE) == 0
 
-    /**
-     * Policy for how [WindowManager.LayoutParams.FLAG_SECURE] is set on the popup's window.
-     */
+    /** Policy for how [WindowManager.LayoutParams.FLAG_SECURE] is set on the popup's window. */
     val securePolicy: SecureFlagPolicy
-        get() = when {
-            inheritSecurePolicy -> SecureFlagPolicy.Inherit
-            (flags and WindowManager.LayoutParams.FLAG_SECURE) == 0 -> SecureFlagPolicy.SecureOff
-            else -> SecureFlagPolicy.SecureOn
-        }
+        get() =
+            when {
+                inheritSecurePolicy -> SecureFlagPolicy.Inherit
+                (flags and WindowManager.LayoutParams.FLAG_SECURE) == 0 ->
+                    SecureFlagPolicy.SecureOff
+                else -> SecureFlagPolicy.SecureOn
+            }
 
     /**
-     * Whether the popup window is clipped to the screen boundaries, or allowed to extend beyond
-     * the bounds of the screen.
+     * Whether the popup window is clipped to the screen boundaries, or allowed to extend beyond the
+     * bounds of the screen.
      */
     actual val clippingEnabled: Boolean
         get() = (flags and WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS) == 0
@@ -242,19 +243,19 @@
 /**
  * Opens a popup with the given content.
  *
- * A popup is a floating container that appears on top of the current activity.
- * It is especially useful for non-modal UI surfaces that remain hidden until they
- * are needed, for example floating menus like Cut/Copy/Paste.
+ * A popup is a floating container that appears on top of the current activity. It is especially
+ * useful for non-modal UI surfaces that remain hidden until they are needed, for example floating
+ * menus like Cut/Copy/Paste.
  *
- * The popup is positioned relative to its parent, using the [alignment] and [offset].
- * The popup is visible as long as it is part of the composition hierarchy.
+ * The popup is positioned relative to its parent, using the [alignment] and [offset]. The popup is
+ * visible as long as it is part of the composition hierarchy.
  *
  * @sample androidx.compose.ui.samples.PopupSample
  *
  * @param alignment The alignment relative to the parent.
  * @param offset An offset from the original aligned position of the popup. Offset respects the
- * Ltr/Rtl context, thus in Ltr it will be added to the original aligned position and in Rtl it
- * will be subtracted from it.
+ *   Ltr/Rtl context, thus in Ltr it will be added to the original aligned position and in Rtl it
+ *   will be subtracted from it.
  * @param onDismissRequest Executes when the user clicks outside of the popup.
  * @param properties [PopupProperties] for further customization of this popup's behavior.
  * @param content The content to be displayed inside the popup.
@@ -267,12 +268,8 @@
     properties: PopupProperties,
     content: @Composable () -> Unit
 ) {
-    val popupPositioner = remember(alignment, offset) {
-        AlignmentOffsetPositionProvider(
-            alignment,
-            offset
-        )
-    }
+    val popupPositioner =
+        remember(alignment, offset) { AlignmentOffsetPositionProvider(alignment, offset) }
 
     Popup(
         popupPositionProvider = popupPositioner,
@@ -310,30 +307,30 @@
     val popupId = rememberSaveable { UUID.randomUUID() }
     val popupLayout = remember {
         PopupLayout(
-            onDismissRequest = onDismissRequest,
-            properties = properties,
-            testTag = testTag,
-            composeView = view,
-            density = density,
-            initialPositionProvider = popupPositionProvider,
-            popupId = popupId
-        ).apply {
-            setContent(parentComposition) {
-                SimpleStack(
-                    Modifier
-                        .semantics { this.popup() }
-                        // Get the size of the content
-                        .onSizeChanged {
-                            popupContentSize = it
-                            updatePosition()
-                        }
-                        // Hide the popup while we can't position it correctly
-                        .alpha(if (canCalculatePosition) 1f else 0f)
-                ) {
-                    currentContent()
+                onDismissRequest = onDismissRequest,
+                properties = properties,
+                testTag = testTag,
+                composeView = view,
+                density = density,
+                initialPositionProvider = popupPositionProvider,
+                popupId = popupId
+            )
+            .apply {
+                setContent(parentComposition) {
+                    SimpleStack(
+                        Modifier.semantics { this.popup() }
+                            // Get the size of the content
+                            .onSizeChanged {
+                                popupContentSize = it
+                                updatePosition()
+                            }
+                            // Hide the popup while we can't position it correctly
+                            .alpha(if (canCalculatePosition) 1f else 0f)
+                    ) {
+                        currentContent()
+                    }
                 }
             }
-        }
     }
 
     DisposableEffect(popupLayout) {
@@ -384,8 +381,8 @@
     // Get the parent's position, size and layout direction
     Layout(
         content = {},
-        modifier = Modifier
-            .onGloballyPositioned { childCoordinates ->
+        modifier =
+            Modifier.onGloballyPositioned { childCoordinates ->
                 // This callback is best-effort – the screen coordinates of this layout node can
                 // change at any time without this callback being fired (e.g. during IME visibility
                 // change). For that reason, updating the position in this callback is not
@@ -440,9 +437,7 @@
             0 -> layout(0, 0) {}
             1 -> {
                 val p = measurables[0].measure(constraints)
-                layout(p.width, p.height) {
-                    p.placeRelative(0, 0)
-                }
+                layout(p.width, p.height) { p.placeRelative(0, 0) }
             }
             else -> {
                 val placeables = measurables.fastMap { it.measure(constraints) }
@@ -478,18 +473,17 @@
     density: Density,
     initialPositionProvider: PopupPositionProvider,
     popupId: UUID,
-    private val popupLayoutHelper: PopupLayoutHelper = if (Build.VERSION.SDK_INT >= 29) {
-        PopupLayoutHelperImpl29()
-    } else {
-        PopupLayoutHelperImpl()
-    }
-) : AbstractComposeView(composeView.context),
-    ViewRootForInspector {
+    private val popupLayoutHelper: PopupLayoutHelper =
+        if (Build.VERSION.SDK_INT >= 29) {
+            PopupLayoutHelperImpl29()
+        } else {
+            PopupLayoutHelperImpl()
+        }
+) : AbstractComposeView(composeView.context), ViewRootForInspector {
     private val windowManager =
         composeView.context.getSystemService(Context.WINDOW_SERVICE) as WindowManager
 
-    @VisibleForTesting
-    internal val params = createLayoutParams()
+    @VisibleForTesting internal val params = createLayoutParams()
 
     /** The logic of positioning the popup relative to its parent. */
     var positionProvider = initialPositionProvider
@@ -512,17 +506,22 @@
     // The window visible frame used for the last popup position calculation.
     private val previousWindowVisibleFrame = Rect()
 
-    override val subCompositionView: AbstractComposeView get() = this
+    override val subCompositionView: AbstractComposeView
+        get() = this
 
-    private val snapshotStateObserver = SnapshotStateObserver(onChangedExecutor = { command ->
-        // This is the same executor logic used by AndroidComposeView's OwnerSnapshotObserver, which
-        // drives most of the state observation in compose UI.
-        if (handler?.looper === Looper.myLooper()) {
-            command()
-        } else {
-            handler?.post(command)
-        }
-    })
+    private val snapshotStateObserver =
+        SnapshotStateObserver(
+            onChangedExecutor = { command ->
+                // This is the same executor logic used by AndroidComposeView's
+                // OwnerSnapshotObserver, which
+                // drives most of the state observation in compose UI.
+                if (handler?.looper === Looper.myLooper()) {
+                    command()
+                } else {
+                    handler?.post(command)
+                }
+            }
+        )
 
     private var backCallback: Any? = null
 
@@ -543,14 +542,17 @@
         // Note that the outline affects clickable area for the dismiss listener. In case of shapes
         // like circle the area for dismiss might be to small (rectangular outline consuming clicks
         // outside of the circle).
-        outlineProvider = object : ViewOutlineProvider() {
-            override fun getOutline(view: View, result: Outline) {
-                result.setRect(0, 0, view.width, view.height)
-                // We set alpha to 0 to hide the view's shadow and let the composable to draw its
-                // own shadow. This still enables us to get the extra space needed in the surface.
-                result.alpha = 0f
+        outlineProvider =
+            object : ViewOutlineProvider() {
+                override fun getOutline(view: View, result: Outline) {
+                    result.setRect(0, 0, view.width, view.height)
+                    // We set alpha to 0 to hide the view's shadow and let the composable to draw
+                    // its
+                    // own shadow. This still enables us to get the extra space needed in the
+                    // surface.
+                    result.alpha = 0f
+                }
             }
-        }
     }
 
     private var content: @Composable () -> Unit by mutableStateOf({})
@@ -625,9 +627,7 @@
             return (context.resources.configuration.screenHeightDp * density).fastRoundToInt()
         }
 
-    /**
-     * Taken from PopupWindow
-     */
+    /** Taken from PopupWindow */
     override fun dispatchKeyEvent(event: KeyEvent): Boolean {
         if (event.keyCode == KeyEvent.KEYCODE_BACK && properties.dismissOnBackPress) {
             if (keyDispatcherState == null) {
@@ -694,8 +694,8 @@
     }
 
     /**
-     * Updates the [LayoutCoordinates] object that is used by [updateParentBounds] to calculate
-     * the position of the popup. If the new [LayoutCoordinates] reports new parent bounds, calls
+     * Updates the [LayoutCoordinates] object that is used by [updateParentBounds] to calculate the
+     * position of the popup. If the new [LayoutCoordinates] reports new parent bounds, calls
      * [updatePosition].
      */
     fun updateParentLayoutCoordinates(parentLayoutCoordinates: LayoutCoordinates) {
@@ -704,9 +704,9 @@
     }
 
     /**
-     * Used by [pollForLocationOnScreenChange] to read the [composeView]'s absolute position
-     * on screen. The array is stored as a field instead of allocated in the method because it's
-     * called on every frame.
+     * Used by [pollForLocationOnScreenChange] to read the [composeView]'s absolute position on
+     * screen. The array is stored as a field instead of allocated in the method because it's called
+     * on every frame.
      */
     private val locationOnScreen = IntArray(2)
 
@@ -749,27 +749,27 @@
         }
     }
 
-    /**
-     * Updates the position of the popup based on current position properties.
-     */
+    /** Updates the position of the popup based on current position properties. */
     fun updatePosition() {
         val parentBounds = parentBounds ?: return
         val popupContentSize = popupContentSize ?: return
 
-        val windowSize = previousWindowVisibleFrame.let {
-            popupLayoutHelper.getWindowVisibleDisplayFrame(composeView, it)
-            val bounds = it.toIntBounds()
-            IntSize(width = bounds.width, height = bounds.height)
-        }
+        val windowSize =
+            previousWindowVisibleFrame.let {
+                popupLayoutHelper.getWindowVisibleDisplayFrame(composeView, it)
+                val bounds = it.toIntBounds()
+                IntSize(width = bounds.width, height = bounds.height)
+            }
 
         var popupPosition = IntOffset.Zero
         snapshotStateObserver.observeReads(this, onCommitAffectingPopupPosition) {
-            popupPosition = positionProvider.calculatePosition(
-                parentBounds,
-                windowSize,
-                parentLayoutDirection,
-                popupContentSize
-            )
+            popupPosition =
+                positionProvider.calculatePosition(
+                    parentBounds,
+                    windowSize,
+                    parentLayoutDirection,
+                    popupContentSize
+                )
         }
 
         params.x = popupPosition.x
@@ -784,17 +784,15 @@
         popupLayoutHelper.updateViewLayout(windowManager, this, params)
     }
 
-    /**
-     * Remove the view from the [WindowManager].
-     */
+    /** Remove the view from the [WindowManager]. */
     fun dismiss() {
         setViewTreeLifecycleOwner(null)
         windowManager.removeViewImmediate(this)
     }
 
     /**
-     * Handles touch screen motion events and calls [onDismissRequest] when the
-     * users clicks outside the popup.
+     * Handles touch screen motion events and calls [onDismissRequest] when the users clicks outside
+     * the popup.
      */
     override fun onTouchEvent(event: MotionEvent?): Boolean {
         if (!properties.dismissOnClickOutside) {
@@ -804,8 +802,9 @@
         // matter whether we return true or false as some upper layer decides on whether the
         // event is propagated to other windows or not. So for focusable the event is consumed but
         // for not focusable it is propagated to other windows.
-        if ((event?.action == MotionEvent.ACTION_DOWN) &&
-            ((event.x < 0) || (event.x >= width) || (event.y < 0) || (event.y >= height))
+        if (
+            (event?.action == MotionEvent.ACTION_DOWN) &&
+                ((event.x < 0) || (event.x >= width) || (event.y < 0) || (event.y >= height))
         ) {
             onDismissRequest?.invoke()
             return true
@@ -824,16 +823,15 @@
 
     // Sets the "real" layout direction for our content that we obtain from the parent composition.
     private fun superSetLayoutDirection(layoutDirection: LayoutDirection) {
-        val direction = when (layoutDirection) {
-            LayoutDirection.Ltr -> android.util.LayoutDirection.LTR
-            LayoutDirection.Rtl -> android.util.LayoutDirection.RTL
-        }
+        val direction =
+            when (layoutDirection) {
+                LayoutDirection.Ltr -> android.util.LayoutDirection.LTR
+                LayoutDirection.Rtl -> android.util.LayoutDirection.RTL
+            }
         super.setLayoutDirection(direction)
     }
 
-    /**
-     * Initialize the LayoutParams specific to [android.widget.PopupWindow].
-     */
+    /** Initialize the LayoutParams specific to [android.widget.PopupWindow]. */
     private fun createLayoutParams(): WindowManager.LayoutParams {
         return WindowManager.LayoutParams().apply {
             // Start to position the popup in the top left corner, a new position will be calculated
@@ -871,17 +869,20 @@
 private object Api33Impl {
     @JvmStatic
     @DoNotInline
-    fun createBackCallback(onDismissRequest: (() -> Unit)?) =
-        OnBackInvokedCallback { onDismissRequest?.invoke() }
+    fun createBackCallback(onDismissRequest: (() -> Unit)?) = OnBackInvokedCallback {
+        onDismissRequest?.invoke()
+    }
 
     @JvmStatic
     @DoNotInline
     fun maybeRegisterBackCallback(view: View, backCallback: Any?) {
         if (backCallback is OnBackInvokedCallback) {
-            view.findOnBackInvokedDispatcher()?.registerOnBackInvokedCallback(
-                OnBackInvokedDispatcher.PRIORITY_OVERLAY,
-                backCallback
-            )
+            view
+                .findOnBackInvokedDispatcher()
+                ?.registerOnBackInvokedCallback(
+                    OnBackInvokedDispatcher.PRIORITY_OVERLAY,
+                    backCallback
+                )
         }
     }
 
@@ -901,7 +902,9 @@
 @VisibleForTesting
 internal interface PopupLayoutHelper {
     fun getWindowVisibleDisplayFrame(composeView: View, outRect: Rect)
+
     fun setGestureExclusionRects(composeView: View, width: Int, height: Int)
+
     fun updateViewLayout(
         windowManager: WindowManager,
         popupView: View,
@@ -930,14 +933,7 @@
 @RequiresApi(29)
 private class PopupLayoutHelperImpl29 : PopupLayoutHelperImpl() {
     override fun setGestureExclusionRects(composeView: View, width: Int, height: Int) {
-        composeView.systemGestureExclusionRects = mutableListOf(
-            Rect(
-                0,
-                0,
-                width,
-                height
-            )
-        )
+        composeView.systemGestureExclusionRects = mutableListOf(Rect(0, 0, width, height))
     }
 }
 
@@ -951,20 +947,16 @@
 
 private fun PopupProperties.flagsWithSecureFlagInherited(
     isParentFlagSecureEnabled: Boolean,
-): Int = when {
-    this.inheritSecurePolicy && isParentFlagSecureEnabled ->
-        this.flags or WindowManager.LayoutParams.FLAG_SECURE
-    this.inheritSecurePolicy && !isParentFlagSecureEnabled ->
-        this.flags and WindowManager.LayoutParams.FLAG_SECURE.inv()
-    else -> this.flags
-}
+): Int =
+    when {
+        this.inheritSecurePolicy && isParentFlagSecureEnabled ->
+            this.flags or WindowManager.LayoutParams.FLAG_SECURE
+        this.inheritSecurePolicy && !isParentFlagSecureEnabled ->
+            this.flags and WindowManager.LayoutParams.FLAG_SECURE.inv()
+        else -> this.flags
+    }
 
-private fun Rect.toIntBounds() = IntRect(
-    left = left,
-    top = top,
-    right = right,
-    bottom = bottom
-)
+private fun Rect.toIntBounds() = IntRect(left = left, top = top, right = right, bottom = bottom)
 
 /**
  * Returns whether the given view is an underlying decor view of a popup. If the given testTag is
diff --git a/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/window/SecureFlagPolicy.android.kt b/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/window/SecureFlagPolicy.android.kt
index 4046a63..58785b3 100644
--- a/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/window/SecureFlagPolicy.android.kt
+++ b/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/window/SecureFlagPolicy.android.kt
@@ -18,9 +18,7 @@
 
 import android.view.WindowManager
 
-/**
- * Policy on setting [WindowManager.LayoutParams.FLAG_SECURE] on a window.
- */
+/** Policy on setting [WindowManager.LayoutParams.FLAG_SECURE] on a window. */
 enum class SecureFlagPolicy {
     /**
      * Inherit [WindowManager.LayoutParams.FLAG_SECURE] from the parent window and pass it on the
diff --git a/compose/ui/ui/src/androidUnitTest/kotlin/androidx/compose/ui/ComposedModifierTest.kt b/compose/ui/ui/src/androidUnitTest/kotlin/androidx/compose/ui/ComposedModifierTest.kt
index 444cf73..8fef1b6 100644
--- a/compose/ui/ui/src/androidUnitTest/kotlin/androidx/compose/ui/ComposedModifierTest.kt
+++ b/compose/ui/ui/src/androidUnitTest/kotlin/androidx/compose/ui/ComposedModifierTest.kt
@@ -41,10 +41,11 @@
 
 fun <T> Modifier.testTag(name: String, value: T) = this then TestTagModifier(name, value)
 
-fun <T> Modifier.getTestTag(name: String, default: T): T = foldIn(default) { acc, element ->
-    @Suppress("UNCHECKED_CAST")
-    if (element is TestTagModifier<*> && element.name == name) element.value as T else acc
-}
+fun <T> Modifier.getTestTag(name: String, default: T): T =
+    foldIn(default) { acc, element ->
+        @Suppress("UNCHECKED_CAST")
+        if (element is TestTagModifier<*> && element.name == name) element.value as T else acc
+    }
 
 @Suppress("UnnecessaryComposedModifier")
 @OptIn(InternalComposeApi::class)
@@ -54,58 +55,56 @@
      * Confirm that a [composed] modifier correctly constructs separate instances when materialized
      */
     @Test
-    fun materializeComposedModifier() = runBlocking(TestFrameClock()) {
-        // Note: assumes single-threaded composition
-        var counter = 0
-        val sourceMod = Modifier.testTag("static", 0)
-            .composed { testTag("dynamic", ++counter) }
+    fun materializeComposedModifier() =
+        runBlocking(TestFrameClock()) {
+            // Note: assumes single-threaded composition
+            var counter = 0
+            val sourceMod = Modifier.testTag("static", 0).composed { testTag("dynamic", ++counter) }
 
-        withRunningRecomposer { recomposer ->
-            lateinit var firstMaterialized: Modifier
-            lateinit var secondMaterialized: Modifier
-            compose(recomposer) {
-                firstMaterialized = currentComposer.materialize(sourceMod)
-                secondMaterialized = currentComposer.materialize(sourceMod)
+            withRunningRecomposer { recomposer ->
+                lateinit var firstMaterialized: Modifier
+                lateinit var secondMaterialized: Modifier
+                compose(recomposer) {
+                    firstMaterialized = currentComposer.materialize(sourceMod)
+                    secondMaterialized = currentComposer.materialize(sourceMod)
+                }
+
+                assertNotEquals("I recomposed some modifiers", 0, counter)
+
+                assertEquals(
+                    "first static value equal to source",
+                    sourceMod.getTestTag("static", Int.MIN_VALUE),
+                    firstMaterialized.getTestTag("static", Int.MAX_VALUE)
+                )
+                assertEquals(
+                    "second static value equal to source",
+                    sourceMod.getTestTag("static", Int.MIN_VALUE),
+                    secondMaterialized.getTestTag("static", Int.MAX_VALUE)
+                )
+                assertEquals(
+                    "dynamic value not present in source",
+                    Int.MIN_VALUE,
+                    sourceMod.getTestTag("dynamic", Int.MIN_VALUE)
+                )
+                assertNotEquals(
+                    "dynamic value present in first materialized",
+                    Int.MIN_VALUE,
+                    firstMaterialized.getTestTag("dynamic", Int.MIN_VALUE)
+                )
+                assertNotEquals(
+                    "dynamic value present in second materialized",
+                    Int.MIN_VALUE,
+                    firstMaterialized.getTestTag("dynamic", Int.MIN_VALUE)
+                )
+                assertNotEquals(
+                    "first and second dynamic values must be unequal",
+                    firstMaterialized.getTestTag("dynamic", Int.MIN_VALUE),
+                    secondMaterialized.getTestTag("dynamic", Int.MIN_VALUE)
+                )
             }
-
-            assertNotEquals("I recomposed some modifiers", 0, counter)
-
-            assertEquals(
-                "first static value equal to source",
-                sourceMod.getTestTag("static", Int.MIN_VALUE),
-                firstMaterialized.getTestTag("static", Int.MAX_VALUE)
-            )
-            assertEquals(
-                "second static value equal to source",
-                sourceMod.getTestTag("static", Int.MIN_VALUE),
-                secondMaterialized.getTestTag("static", Int.MAX_VALUE)
-            )
-            assertEquals(
-                "dynamic value not present in source",
-                Int.MIN_VALUE,
-                sourceMod.getTestTag("dynamic", Int.MIN_VALUE)
-            )
-            assertNotEquals(
-                "dynamic value present in first materialized",
-                Int.MIN_VALUE,
-                firstMaterialized.getTestTag("dynamic", Int.MIN_VALUE)
-            )
-            assertNotEquals(
-                "dynamic value present in second materialized",
-                Int.MIN_VALUE,
-                firstMaterialized.getTestTag("dynamic", Int.MIN_VALUE)
-            )
-            assertNotEquals(
-                "first and second dynamic values must be unequal",
-                firstMaterialized.getTestTag("dynamic", Int.MIN_VALUE),
-                secondMaterialized.getTestTag("dynamic", Int.MIN_VALUE)
-            )
         }
-    }
 
-    /**
-     * Confirm that recomposition occurs on invalidation
-     */
+    /** Confirm that recomposition occurs on invalidation */
     @Test
     fun recomposeComposedModifier() = runBlocking {
         // Manually invalidate the composition of the modifier instead of using mutableStateOf
@@ -113,18 +112,17 @@
         var value = 0
         lateinit var scope: RecomposeScope
 
-        val sourceMod = Modifier.composed {
-            scope = currentRecomposeScope
-            testTag("changing", value)
-        }
+        val sourceMod =
+            Modifier.composed {
+                scope = currentRecomposeScope
+                testTag("changing", value)
+            }
 
         val frameClock = TestFrameClock()
         withContext(frameClock) {
             withRunningRecomposer { recomposer ->
                 lateinit var materialized: Modifier
-                compose(recomposer) {
-                    materialized = currentComposer.materialize(sourceMod)
-                }
+                compose(recomposer) { materialized = currentComposer.materialize(sourceMod) }
 
                 assertEquals(
                     "initial composition value",
@@ -148,11 +146,12 @@
     @Test
     fun rememberComposedModifier() = runBlocking {
         lateinit var scope: RecomposeScope
-        val sourceMod = Modifier.composed {
-            scope = currentRecomposeScope
-            val state = remember { Any() }
-            testTag("remembered", state)
-        }
+        val sourceMod =
+            Modifier.composed {
+                scope = currentRecomposeScope
+                val state = remember { Any() }
+                testTag("remembered", state)
+            }
 
         val frameClock = TestFrameClock()
 
@@ -181,20 +180,14 @@
 
     @Test
     fun nestedComposedModifiers() = runBlocking {
-        val mod = Modifier.composed {
-            composed {
-                testTag("nested", 10)
-            }
-        }
+        val mod = Modifier.composed { composed { testTag("nested", 10) } }
 
         val frameClock = TestFrameClock()
 
         withContext(frameClock) {
             withRunningRecomposer { recomposer ->
                 lateinit var materialized: Modifier
-                compose(recomposer) {
-                    materialized = currentComposer.materialize(mod)
-                }
+                compose(recomposer) { materialized = currentComposer.materialize(mod) }
 
                 assertEquals(
                     "fully unwrapped composed modifier value",
@@ -330,16 +323,8 @@
 }
 
 @OptIn(InternalComposeApi::class)
-fun compose(
-    recomposer: Recomposer,
-    block: @Composable () -> Unit
-): Composition {
-    return Composition(
-        EmptyApplier(),
-        recomposer
-    ).apply {
-        setContent(block)
-    }
+fun compose(recomposer: Recomposer, block: @Composable () -> Unit): Composition {
+    return Composition(EmptyApplier(), recomposer).apply { setContent(block) }
 }
 
 internal class TestFrameClock : MonotonicFrameClock {
@@ -355,19 +340,26 @@
 
 class EmptyApplier : Applier<Unit> {
     override val current: Unit = Unit
+
     override fun down(node: Unit) {}
+
     override fun up() {}
+
     override fun insertTopDown(index: Int, instance: Unit) {
         error("Unexpected")
     }
+
     override fun insertBottomUp(index: Int, instance: Unit) {
         error("Unexpected")
     }
+
     override fun remove(index: Int, count: Int) {
         error("Unexpected")
     }
+
     override fun move(from: Int, to: Int, count: Int) {
         error("Unexpected")
     }
+
     override fun clear() {}
 }
diff --git a/compose/ui/ui/src/androidUnitTest/kotlin/androidx/compose/ui/ModifierTest.kt b/compose/ui/ui/src/androidUnitTest/kotlin/androidx/compose/ui/ModifierTest.kt
index 9fe5cc6..74a9e6c 100644
--- a/compose/ui/ui/src/androidUnitTest/kotlin/androidx/compose/ui/ModifierTest.kt
+++ b/compose/ui/ui/src/androidUnitTest/kotlin/androidx/compose/ui/ModifierTest.kt
@@ -27,12 +27,10 @@
     @Test
     fun wrapElementChain() {
         val chain = SampleModifier(1) then SampleModifier(2) then SampleModifier(3)
-        val forwards = chain.foldIn(emptyList<Int>()) { acc, e ->
-            acc + (e as SampleModifier).value
-        }
-        val backwards = chain.foldOut(emptyList<Int>()) { e, acc ->
-            acc + (e as SampleModifier).value
-        }
+        val forwards =
+            chain.foldIn(emptyList<Int>()) { acc, e -> acc + (e as SampleModifier).value }
+        val backwards =
+            chain.foldOut(emptyList<Int>()) { e, acc -> acc + (e as SampleModifier).value }
         assertEquals("1-3 folded in (forwards)", listOf(1, 2, 3), forwards)
         assertEquals("1-3 folded out (backwards)", listOf(3, 2, 1), backwards)
     }
diff --git a/compose/ui/ui/src/androidUnitTest/kotlin/androidx/compose/ui/SessionMutexTest.kt b/compose/ui/ui/src/androidUnitTest/kotlin/androidx/compose/ui/SessionMutexTest.kt
index fef684c..e93a48c 100644
--- a/compose/ui/ui/src/androidUnitTest/kotlin/androidx/compose/ui/SessionMutexTest.kt
+++ b/compose/ui/ui/src/androidUnitTest/kotlin/androidx/compose/ui/SessionMutexTest.kt
@@ -126,12 +126,13 @@
 
     @Test
     fun currentSessionIsClearedAfterSessionIsCancelled() = runTest {
-        val sessionJob = launch(start = CoroutineStart.UNDISPATCHED) {
-            mutex.withSessionCancellingPrevious(
-                sessionInitializer = { TestSession(it, "hello") },
-                session = { awaitCancellation() }
-            )
-        }
+        val sessionJob =
+            launch(start = CoroutineStart.UNDISPATCHED) {
+                mutex.withSessionCancellingPrevious(
+                    sessionInitializer = { TestSession(it, "hello") },
+                    session = { awaitCancellation() }
+                )
+            }
         assertThat(mutex.currentSession).isNotNull()
         assertThat(mutex.currentSession!!.value).isEqualTo("hello")
 
@@ -167,10 +168,11 @@
 
     @Test
     fun sessionReturnValue() = runTest {
-        val result = mutex.withSessionCancellingPrevious(
-            sessionInitializer = ::TestSession,
-            session = { "hello" }
-        )
+        val result =
+            mutex.withSessionCancellingPrevious(
+                sessionInitializer = ::TestSession,
+                session = { "hello" }
+            )
         assertThat(result).isEqualTo("hello")
     }
 
@@ -178,9 +180,7 @@
     fun sessionInitializerValueIsPassedToSession() = runTest {
         mutex.withSessionCancellingPrevious(
             sessionInitializer = { TestSession(it, "hello") },
-            session = {
-                assertThat(it.value).isEqualTo("hello")
-            }
+            session = { assertThat(it.value).isEqualTo("hello") }
         )
     }
 
@@ -227,10 +227,7 @@
         advanceUntilIdle()
         assertThat(firstSessionJob.isCompleted).isFalse()
 
-        mutex.withSessionCancellingPrevious(
-            sessionInitializer = ::TestSession,
-            session = {}
-        )
+        mutex.withSessionCancellingPrevious(sessionInitializer = ::TestSession, session = {})
 
         assertThat(firstSessionJob.isCancelled).isTrue()
     }
@@ -250,9 +247,7 @@
                     expect(0)
                     suspendCancellableCoroutine<Nothing> { continuation ->
                         // This is ran synchronously by whoever calls cancel.
-                        continuation.invokeOnCancellation {
-                            expect(3)
-                        }
+                        continuation.invokeOnCancellation { expect(3) }
                     }
                 }
             )
@@ -265,9 +260,7 @@
                     expect(2)
                     TestSession(it)
                 },
-                session = {
-                    expect(5)
-                }
+                session = { expect(5) }
             )
         }
 
@@ -306,9 +299,7 @@
                 expect(1)
                 TestSession(it)
             },
-            session = {
-                expect(3)
-            }
+            session = { expect(3) }
         )
 
         expect(4)
@@ -327,9 +318,7 @@
                     try {
                         awaitCancellation()
                     } finally {
-                        withContext(NonCancellable) {
-                            finalizer.join()
-                        }
+                        withContext(NonCancellable) { finalizer.join() }
                     }
                 }
             )
@@ -342,9 +331,7 @@
                     secondSessionInitialized = true
                     TestSession(it)
                 },
-                session = {
-                    secondSessionStarted = true
-                }
+                session = { secondSessionStarted = true }
             )
         }
 
@@ -373,10 +360,7 @@
         return false
     }
 
-    private data class TestSession(
-        val coroutineScope: CoroutineScope,
-        var value: String = ""
-    )
+    private data class TestSession(val coroutineScope: CoroutineScope, var value: String = "")
 
     private class TestException : RuntimeException()
 }
diff --git a/compose/ui/ui/src/androidUnitTest/kotlin/androidx/compose/ui/autofill/AndroidContentTypeTest.kt b/compose/ui/ui/src/androidUnitTest/kotlin/androidx/compose/ui/autofill/AndroidContentTypeTest.kt
index b6fde14..a831af7 100644
--- a/compose/ui/ui/src/androidUnitTest/kotlin/androidx/compose/ui/autofill/AndroidContentTypeTest.kt
+++ b/compose/ui/ui/src/androidUnitTest/kotlin/androidx/compose/ui/autofill/AndroidContentTypeTest.kt
@@ -206,8 +206,7 @@
 
     @Test
     fun personFirstName() {
-        assertThat(PersonFirstName)
-            .isEqualTo(ContentType.from(AUTOFILL_HINT_PERSON_NAME_GIVEN))
+        assertThat(PersonFirstName).isEqualTo(ContentType.from(AUTOFILL_HINT_PERSON_NAME_GIVEN))
     }
 
     @Test
diff --git a/compose/ui/ui/src/androidUnitTest/kotlin/androidx/compose/ui/autofill/AndroidPerformAutofillTest.kt b/compose/ui/ui/src/androidUnitTest/kotlin/androidx/compose/ui/autofill/AndroidPerformAutofillTest.kt
index 204ad58a..462a20f 100644
--- a/compose/ui/ui/src/androidUnitTest/kotlin/androidx/compose/ui/autofill/AndroidPerformAutofillTest.kt
+++ b/compose/ui/ui/src/androidUnitTest/kotlin/androidx/compose/ui/autofill/AndroidPerformAutofillTest.kt
@@ -51,15 +51,18 @@
         // Arrange.
         val expectedValue = "Name"
         var autofilledValue = ""
-        val autofillNode = AutofillNode(
-            onFill = { autofilledValue = it },
-            autofillTypes = listOf(AutofillType.PersonFullName),
-            boundingBox = Rect(0f, 0f, 0f, 0f)
-        )
+        val autofillNode =
+            AutofillNode(
+                onFill = { autofilledValue = it },
+                autofillTypes = listOf(AutofillType.PersonFullName),
+                boundingBox = Rect(0f, 0f, 0f, 0f)
+            )
         autofillTree += autofillNode
 
-        val autofillValues = SparseArray<AutofillValue>()
-            .apply { append(autofillNode.id, AutofillValue.forText(expectedValue)) }
+        val autofillValues =
+            SparseArray<AutofillValue>().apply {
+                append(autofillNode.id, AutofillValue.forText(expectedValue))
+            }
 
         // Act.
         androidAutofill.performAutofill(autofillValues)
@@ -73,15 +76,18 @@
         // Arrange.
         val expectedValue = "email@google.com"
         var autofilledValue = ""
-        val autofillNode = AutofillNode(
-            onFill = { autofilledValue = it },
-            autofillTypes = listOf(AutofillType.EmailAddress),
-            boundingBox = Rect(0f, 0f, 0f, 0f)
-        )
+        val autofillNode =
+            AutofillNode(
+                onFill = { autofilledValue = it },
+                autofillTypes = listOf(AutofillType.EmailAddress),
+                boundingBox = Rect(0f, 0f, 0f, 0f)
+            )
         autofillTree += autofillNode
 
-        val autofillValues = SparseArray<AutofillValue>()
-            .apply { append(autofillNode.id, AutofillValue.forText(expectedValue)) }
+        val autofillValues =
+            SparseArray<AutofillValue>().apply {
+                append(autofillNode.id, AutofillValue.forText(expectedValue))
+            }
 
         // Act.
         androidAutofill.performAutofill(autofillValues)
diff --git a/compose/ui/ui/src/androidUnitTest/kotlin/androidx/compose/ui/autofill/AndroidPopulateViewStructureTest.kt b/compose/ui/ui/src/androidUnitTest/kotlin/androidx/compose/ui/autofill/AndroidPopulateViewStructureTest.kt
index f56a090..12bd75d 100644
--- a/compose/ui/ui/src/androidUnitTest/kotlin/androidx/compose/ui/autofill/AndroidPopulateViewStructureTest.kt
+++ b/compose/ui/ui/src/androidUnitTest/kotlin/androidx/compose/ui/autofill/AndroidPopulateViewStructureTest.kt
@@ -32,10 +32,7 @@
 
 @OptIn(ExperimentalComposeUiApi::class)
 @RunWith(RobolectricTestRunner::class)
-@Config(
-    manifest = Config.NONE,
-    minSdk = 26
-)
+@Config(manifest = Config.NONE, minSdk = 26)
 class AndroidPopulateViewStructureTest {
     private val autofillTree = AutofillTree()
     private lateinit var androidAutofill: AndroidAutofill
@@ -66,11 +63,12 @@
     @Test
     fun populateViewStructure_oneChild() {
         // Arrange.
-        val autofillNode = AutofillNode(
-            onFill = {},
-            autofillTypes = listOf(AutofillType.PersonFullName),
-            boundingBox = Rect(0f, 0f, 0f, 0f)
-        )
+        val autofillNode =
+            AutofillNode(
+                onFill = {},
+                autofillTypes = listOf(AutofillType.PersonFullName),
+                boundingBox = Rect(0f, 0f, 0f, 0f)
+            )
         autofillTree += autofillNode
 
         // Act.
@@ -78,36 +76,39 @@
         androidAutofill.populateViewStructure(viewStructure)
 
         // Assert.
-        assertThat(viewStructure).isEqualTo(
-            FakeAndroidViewStructure().apply {
-                children.add(
-                    FakeAndroidViewStructure().apply {
-                        virtualId = autofillNode.id
-                        packageName = currentPackage
-                        setAutofillType(View.AUTOFILL_TYPE_TEXT)
-                        setAutofillHints(arrayOf(AUTOFILL_HINT_PERSON_NAME))
-                        setDimens(0, 0, 0, 0, 0, 0)
-                    }
-                )
-            }
-        )
+        assertThat(viewStructure)
+            .isEqualTo(
+                FakeAndroidViewStructure().apply {
+                    children.add(
+                        FakeAndroidViewStructure().apply {
+                            virtualId = autofillNode.id
+                            packageName = currentPackage
+                            setAutofillType(View.AUTOFILL_TYPE_TEXT)
+                            setAutofillHints(arrayOf(AUTOFILL_HINT_PERSON_NAME))
+                            setDimens(0, 0, 0, 0, 0, 0)
+                        }
+                    )
+                }
+            )
     }
 
     @Test
     fun populateViewStructure_twoChildren() {
         // Arrange.
-        val nameAutofillNode = AutofillNode(
-            onFill = {},
-            autofillTypes = listOf(AutofillType.PersonFullName),
-            boundingBox = Rect(0f, 0f, 0f, 0f)
-        )
+        val nameAutofillNode =
+            AutofillNode(
+                onFill = {},
+                autofillTypes = listOf(AutofillType.PersonFullName),
+                boundingBox = Rect(0f, 0f, 0f, 0f)
+            )
         autofillTree += nameAutofillNode
 
-        val emailAutofillNode = AutofillNode(
-            onFill = {},
-            autofillTypes = listOf(AutofillType.EmailAddress),
-            boundingBox = Rect(0f, 0f, 0f, 0f)
-        )
+        val emailAutofillNode =
+            AutofillNode(
+                onFill = {},
+                autofillTypes = listOf(AutofillType.EmailAddress),
+                boundingBox = Rect(0f, 0f, 0f, 0f)
+            )
         autofillTree += emailAutofillNode
 
         // Act.
@@ -115,27 +116,28 @@
         androidAutofill.populateViewStructure(viewStructure)
 
         // Assert.
-        assertThat(viewStructure).isEqualTo(
-            FakeAndroidViewStructure().apply {
-                children.add(
-                    FakeAndroidViewStructure().apply {
-                        virtualId = nameAutofillNode.id
-                        packageName = currentPackage
-                        setAutofillType(View.AUTOFILL_TYPE_TEXT)
-                        setAutofillHints(arrayOf(AUTOFILL_HINT_PERSON_NAME))
-                        setDimens(0, 0, 0, 0, 0, 0)
-                    }
-                )
-                children.add(
-                    FakeAndroidViewStructure().apply {
-                        virtualId = emailAutofillNode.id
-                        packageName = currentPackage
-                        setAutofillType(View.AUTOFILL_TYPE_TEXT)
-                        setAutofillHints(arrayOf(View.AUTOFILL_HINT_EMAIL_ADDRESS))
-                        setDimens(0, 0, 0, 0, 0, 0)
-                    }
-                )
-            }
-        )
+        assertThat(viewStructure)
+            .isEqualTo(
+                FakeAndroidViewStructure().apply {
+                    children.add(
+                        FakeAndroidViewStructure().apply {
+                            virtualId = nameAutofillNode.id
+                            packageName = currentPackage
+                            setAutofillType(View.AUTOFILL_TYPE_TEXT)
+                            setAutofillHints(arrayOf(AUTOFILL_HINT_PERSON_NAME))
+                            setDimens(0, 0, 0, 0, 0, 0)
+                        }
+                    )
+                    children.add(
+                        FakeAndroidViewStructure().apply {
+                            virtualId = emailAutofillNode.id
+                            packageName = currentPackage
+                            setAutofillType(View.AUTOFILL_TYPE_TEXT)
+                            setAutofillHints(arrayOf(View.AUTOFILL_HINT_EMAIL_ADDRESS))
+                            setDimens(0, 0, 0, 0, 0, 0)
+                        }
+                    )
+                }
+            )
     }
 }
diff --git a/compose/ui/ui/src/androidUnitTest/kotlin/androidx/compose/ui/autofill/AutofillNodeTest.kt b/compose/ui/ui/src/androidUnitTest/kotlin/androidx/compose/ui/autofill/AutofillNodeTest.kt
index 31faf0a..48d3121b 100644
--- a/compose/ui/ui/src/androidUnitTest/kotlin/androidx/compose/ui/autofill/AutofillNodeTest.kt
+++ b/compose/ui/ui/src/androidUnitTest/kotlin/androidx/compose/ui/autofill/AutofillNodeTest.kt
@@ -36,10 +36,7 @@
 
 @OptIn(ExperimentalComposeUiApi::class)
 @RunWith(RobolectricTestRunner::class)
-@Config(
-    shadows = [ShadowAutofillManager::class],
-    minSdk = 26
-)
+@Config(shadows = [ShadowAutofillManager::class], minSdk = 26)
 class AutofillNodeTest {
     private lateinit var androidAutofill: AndroidAutofill
     private lateinit var autofillManager: ShadowAutofillManager
@@ -52,9 +49,10 @@
         view = View(activity)
         activity.setContentView(view)
 
-        autofillManager = Shadow.extract<ShadowAutofillManager>(
-            activity.getSystemService(AutofillManager::class.java)
-        )
+        autofillManager =
+            Shadow.extract<ShadowAutofillManager>(
+                activity.getSystemService(AutofillManager::class.java)
+            )
 
         androidAutofill = AndroidAutofill(view, autofillTree)
     }
@@ -80,9 +78,8 @@
         androidAutofill.requestAutofillForNode(autofillNode)
 
         // Assert.
-        assertThat(autofillManager.viewEnteredStats).containsExactly(
-            ShadowAutofillManager.NotifyViewEntered(view, autofillNode.id, bounds)
-        )
+        assertThat(autofillManager.viewEnteredStats)
+            .containsExactly(ShadowAutofillManager.NotifyViewEntered(view, autofillNode.id, bounds))
     }
 
     @Test
@@ -91,14 +88,15 @@
         val autofillNode = AutofillNode(onFill = {})
 
         // Act and assert.
-        val exception = Assert.assertThrows(IllegalStateException::class.java) {
-            androidAutofill.requestAutofillForNode(autofillNode)
-        }
+        val exception =
+            Assert.assertThrows(IllegalStateException::class.java) {
+                androidAutofill.requestAutofillForNode(autofillNode)
+            }
 
         // Assert some more.
-        assertThat(exception).hasMessageThat().isEqualTo(
-            "requestAutofill called before onChildPositioned()"
-        )
+        assertThat(exception)
+            .hasMessageThat()
+            .isEqualTo("requestAutofill called before onChildPositioned()")
     }
 
     @Test
@@ -110,15 +108,15 @@
         androidAutofill.cancelAutofillForNode(autofillNode)
 
         // Assert.
-        assertThat(autofillManager.viewExitedStats).containsExactly(
-            ShadowAutofillManager.NotifyViewExited(view, autofillNode.id)
-        )
+        assertThat(autofillManager.viewExitedStats)
+            .containsExactly(ShadowAutofillManager.NotifyViewExited(view, autofillNode.id))
     }
 }
 
 @Implements(value = AutofillManager::class, minSdk = 26)
 internal class ShadowAutofillManager {
     data class NotifyViewEntered(val view: View, val virtualId: Int, val rect: Rect)
+
     data class NotifyViewExited(val view: View, val virtualId: Int)
 
     val viewEnteredStats = mutableListOf<NotifyViewEntered>()
diff --git a/compose/ui/ui/src/androidUnitTest/kotlin/androidx/compose/ui/autofill/FakeViewStructure.kt b/compose/ui/ui/src/androidUnitTest/kotlin/androidx/compose/ui/autofill/FakeViewStructure.kt
index e240645..9f8a51b 100644
--- a/compose/ui/ui/src/androidUnitTest/kotlin/androidx/compose/ui/autofill/FakeViewStructure.kt
+++ b/compose/ui/ui/src/androidUnitTest/kotlin/androidx/compose/ui/autofill/FakeViewStructure.kt
@@ -39,16 +39,12 @@
  * @param children A list of [ViewStructure]s that are children of the current [ViewStructure].
  * @param bounds The bounds (Dimensions) of the component represented by this [ViewStructure].
  * @param autofillId The [autofillId] for the parent component. The same autofillId is used for
- * other child components.
- * @param autofillType The data type. Can be one of the following:
- * [View.AUTOFILL_TYPE_DATE],
- * [View.AUTOFILL_TYPE_LIST],
- * [View.AUTOFILL_TYPE_TEXT],
- * [View.AUTOFILL_TYPE_TOGGLE] or
- * [View.AUTOFILL_TYPE_NONE].
+ *   other child components.
+ * @param autofillType The data type. Can be one of the following: [View.AUTOFILL_TYPE_DATE],
+ *   [View.AUTOFILL_TYPE_LIST], [View.AUTOFILL_TYPE_TEXT], [View.AUTOFILL_TYPE_TOGGLE] or
+ *   [View.AUTOFILL_TYPE_NONE].
  * @param autofillHints The autofill hint. If this value not specified, we use heuristics to
- * determine what data to use while performing autofill.
- *
+ *   determine what data to use while performing autofill.
  */
 @RequiresApi(Build.VERSION_CODES.O)
 internal data class FakeAndroidViewStructure(
@@ -64,8 +60,7 @@
 ) : ViewStructure() {
 
     internal companion object {
-        @GuardedBy("this")
-        private var previousId = 0
+        @GuardedBy("this") private var previousId = 0
         private val NO_SESSION = 0
 
         @Synchronized
@@ -123,112 +118,193 @@
         this.bounds = Rect(left, top, width - left, height - top)
     }
 
-    override fun equals(other: Any?) = other is FakeAndroidViewStructure &&
-        other.virtualId == virtualId &&
-        other.packageName == packageName &&
-        other.typeName == typeName &&
-        other.entryName == entryName &&
-        other.autofillType == autofillType &&
-        other.autofillHints.contentEquals(autofillHints) &&
-        other.bounds.contentEquals(bounds) &&
-        other.children == children
+    override fun equals(other: Any?) =
+        other is FakeAndroidViewStructure &&
+            other.virtualId == virtualId &&
+            other.packageName == packageName &&
+            other.typeName == typeName &&
+            other.entryName == entryName &&
+            other.autofillType == autofillType &&
+            other.autofillHints.contentEquals(autofillHints) &&
+            other.bounds.contentEquals(bounds) &&
+            other.children == children
 
     override fun hashCode() = super.hashCode()
 
     // Unimplemented methods.
 
-    override fun setOpaque(p0: Boolean) { TODO("not implemented") }
+    override fun setOpaque(p0: Boolean) {
+        TODO("not implemented")
+    }
 
-    override fun setHint(p0: CharSequence?) { TODO("not implemented") }
+    override fun setHint(p0: CharSequence?) {
+        TODO("not implemented")
+    }
 
-    override fun setElevation(p0: Float) { TODO("not implemented") }
+    override fun setElevation(p0: Float) {
+        TODO("not implemented")
+    }
 
-    override fun getText(): CharSequence { TODO("not implemented") }
+    override fun getText(): CharSequence {
+        TODO("not implemented")
+    }
 
-    override fun setText(p0: CharSequence?) { TODO("not implemented") }
+    override fun setText(p0: CharSequence?) {
+        TODO("not implemented")
+    }
 
-    override fun setText(p0: CharSequence?, p1: Int, p2: Int) { TODO("not implemented") }
+    override fun setText(p0: CharSequence?, p1: Int, p2: Int) {
+        TODO("not implemented")
+    }
 
-    override fun asyncCommit() { TODO("not implemented") }
+    override fun asyncCommit() {
+        TODO("not implemented")
+    }
 
-    override fun setEnabled(p0: Boolean) { TODO("not implemented") }
+    override fun setEnabled(p0: Boolean) {
+        TODO("not implemented")
+    }
 
-    override fun setLocaleList(p0: LocaleList?) { TODO("not implemented") }
+    override fun setLocaleList(p0: LocaleList?) {
+        TODO("not implemented")
+    }
 
-    override fun setChecked(p0: Boolean) { TODO("not implemented") }
+    override fun setChecked(p0: Boolean) {
+        TODO("not implemented")
+    }
 
-    override fun setContextClickable(p0: Boolean) { TODO("not implemented") }
+    override fun setContextClickable(p0: Boolean) {
+        TODO("not implemented")
+    }
 
-    override fun setAccessibilityFocused(p0: Boolean) { TODO("not implemented") }
+    override fun setAccessibilityFocused(p0: Boolean) {
+        TODO("not implemented")
+    }
 
-    override fun setAlpha(p0: Float) { TODO("not implemented") }
+    override fun setAlpha(p0: Float) {
+        TODO("not implemented")
+    }
 
-    override fun setTransformation(p0: Matrix?) { TODO("not implemented") }
+    override fun setTransformation(p0: Matrix?) {
+        TODO("not implemented")
+    }
 
-    override fun setClassName(p0: String?) { TODO("not implemented") }
+    override fun setClassName(p0: String?) {
+        TODO("not implemented")
+    }
 
-    override fun setLongClickable(p0: Boolean) { TODO("not implemented") }
+    override fun setLongClickable(p0: Boolean) {
+        TODO("not implemented")
+    }
 
-    override fun getHint(): CharSequence { TODO("not implemented") }
+    override fun getHint(): CharSequence {
+        TODO("not implemented")
+    }
 
-    override fun setInputType(p0: Int) { TODO("not implemented") }
+    override fun setInputType(p0: Int) {
+        TODO("not implemented")
+    }
 
-    override fun setWebDomain(p0: String?) { TODO("not implemented") }
+    override fun setWebDomain(p0: String?) {
+        TODO("not implemented")
+    }
 
-    override fun setAutofillOptions(p0: Array<out CharSequence>?) { TODO("not implemented") }
+    override fun setAutofillOptions(p0: Array<out CharSequence>?) {
+        TODO("not implemented")
+    }
 
-    override fun setTextStyle(p0: Float, p1: Int, p2: Int, p3: Int) { TODO("not implemented") }
+    override fun setTextStyle(p0: Float, p1: Int, p2: Int, p3: Int) {
+        TODO("not implemented")
+    }
 
-    override fun setVisibility(p0: Int) { TODO("not implemented") }
+    override fun setVisibility(p0: Int) {
+        TODO("not implemented")
+    }
 
-    override fun setHtmlInfo(p0: HtmlInfo) { TODO("not implemented") }
+    override fun setHtmlInfo(p0: HtmlInfo) {
+        TODO("not implemented")
+    }
 
-    override fun setTextLines(p0: IntArray?, p1: IntArray?) { TODO("not implemented") }
+    override fun setTextLines(p0: IntArray?, p1: IntArray?) {
+        TODO("not implemented")
+    }
 
-    override fun getExtras(): Bundle { TODO("not implemented") }
+    override fun getExtras(): Bundle {
+        TODO("not implemented")
+    }
 
-    override fun setClickable(p0: Boolean) { TODO("not implemented") }
+    override fun setClickable(p0: Boolean) {
+        TODO("not implemented")
+    }
 
-    override fun newHtmlInfoBuilder(p0: String): HtmlInfo.Builder { TODO("not implemented") }
+    override fun newHtmlInfoBuilder(p0: String): HtmlInfo.Builder {
+        TODO("not implemented")
+    }
 
-    override fun getTextSelectionEnd(): Int { TODO("not implemented") }
+    override fun getTextSelectionEnd(): Int {
+        TODO("not implemented")
+    }
 
-    override fun setAutofillId(p0: AutofillId) { TODO("not implemented") }
+    override fun setAutofillId(p0: AutofillId) {
+        TODO("not implemented")
+    }
 
-    override fun hasExtras(): Boolean { TODO("not implemented") }
+    override fun hasExtras(): Boolean {
+        TODO("not implemented")
+    }
 
-    override fun setActivated(p0: Boolean) { TODO("not implemented") }
+    override fun setActivated(p0: Boolean) {
+        TODO("not implemented")
+    }
 
-    override fun setFocused(p0: Boolean) { TODO("not implemented") }
+    override fun setFocused(p0: Boolean) {
+        TODO("not implemented")
+    }
 
-    override fun getTextSelectionStart(): Int { TODO("not implemented") }
+    override fun getTextSelectionStart(): Int {
+        TODO("not implemented")
+    }
 
-    override fun setChildCount(p0: Int) { TODO("not implemented") }
+    override fun setChildCount(p0: Int) {
+        TODO("not implemented")
+    }
 
-    override fun setAutofillValue(p0: AutofillValue?) { TODO("not implemented") }
+    override fun setAutofillValue(p0: AutofillValue?) {
+        TODO("not implemented")
+    }
 
-    override fun setContentDescription(p0: CharSequence?) { TODO("not implemented") }
+    override fun setContentDescription(p0: CharSequence?) {
+        TODO("not implemented")
+    }
 
-    override fun setFocusable(p0: Boolean) { TODO("not implemented") }
+    override fun setFocusable(p0: Boolean) {
+        TODO("not implemented")
+    }
 
-    override fun setCheckable(p0: Boolean) { TODO("not implemented") }
+    override fun setCheckable(p0: Boolean) {
+        TODO("not implemented")
+    }
 
-    override fun asyncNewChild(p0: Int): ViewStructure { TODO("not implemented") }
+    override fun asyncNewChild(p0: Int): ViewStructure {
+        TODO("not implemented")
+    }
 
-    override fun setSelected(p0: Boolean) { TODO("not implemented") }
+    override fun setSelected(p0: Boolean) {
+        TODO("not implemented")
+    }
 
-    override fun setDataIsSensitive(p0: Boolean) { TODO("not implemented") }
+    override fun setDataIsSensitive(p0: Boolean) {
+        TODO("not implemented")
+    }
 }
 
-private fun Rect?.contentEquals(other: Rect?) = when {
-    (other == null && this == null) -> true
-    (other == null || this == null) -> false
-    else ->
-        other.left == left &&
-            other.right == right &&
-            other.bottom == bottom &&
-            other.top == top
-}
+private fun Rect?.contentEquals(other: Rect?) =
+    when {
+        (other == null && this == null) -> true
+        (other == null || this == null) -> false
+        else ->
+            other.left == left && other.right == right && other.bottom == bottom && other.top == top
+    }
 
 /** Obtains a parcel and then recycles it correctly whether an exception is thrown or not. */
 private fun useParcel(block: (Parcel) -> Unit) {
diff --git a/compose/ui/ui/src/androidUnitTest/kotlin/androidx/compose/ui/focus/FocusChangedModifierTest.kt b/compose/ui/ui/src/androidUnitTest/kotlin/androidx/compose/ui/focus/FocusChangedModifierTest.kt
index 85ae7c6..747da95 100644
--- a/compose/ui/ui/src/androidUnitTest/kotlin/androidx/compose/ui/focus/FocusChangedModifierTest.kt
+++ b/compose/ui/ui/src/androidUnitTest/kotlin/androidx/compose/ui/focus/FocusChangedModifierTest.kt
@@ -42,8 +42,7 @@
         val modifier = Modifier.onFocusChanged(onFocusChange) as InspectableValue
         assertThat(modifier.nameFallback).isEqualTo("onFocusChanged")
         assertThat(modifier.valueOverride).isNull()
-        assertThat(modifier.inspectableElements.asIterable()).containsExactly(
-            ValueElement("onFocusChanged", onFocusChange)
-        )
+        assertThat(modifier.inspectableElements.asIterable())
+            .containsExactly(ValueElement("onFocusChanged", onFocusChange))
     }
 }
diff --git a/compose/ui/ui/src/androidUnitTest/kotlin/androidx/compose/ui/focus/FocusEventModifierTest.kt b/compose/ui/ui/src/androidUnitTest/kotlin/androidx/compose/ui/focus/FocusEventModifierTest.kt
index 788320b..b1888ef 100644
--- a/compose/ui/ui/src/androidUnitTest/kotlin/androidx/compose/ui/focus/FocusEventModifierTest.kt
+++ b/compose/ui/ui/src/androidUnitTest/kotlin/androidx/compose/ui/focus/FocusEventModifierTest.kt
@@ -42,8 +42,7 @@
         val modifier = Modifier.onFocusEvent(onFocusEvent) as InspectableValue
         assertThat(modifier.nameFallback).isEqualTo("onFocusEvent")
         assertThat(modifier.valueOverride).isNull()
-        assertThat(modifier.inspectableElements.asIterable()).containsExactly(
-            ValueElement("onFocusEvent", onFocusEvent)
-        )
+        assertThat(modifier.inspectableElements.asIterable())
+            .containsExactly(ValueElement("onFocusEvent", onFocusEvent))
     }
 }
diff --git a/compose/ui/ui/src/androidUnitTest/kotlin/androidx/compose/ui/focus/FocusRequesterModifierTest.kt b/compose/ui/ui/src/androidUnitTest/kotlin/androidx/compose/ui/focus/FocusRequesterModifierTest.kt
index eaefcb7b..25c3b49 100644
--- a/compose/ui/ui/src/androidUnitTest/kotlin/androidx/compose/ui/focus/FocusRequesterModifierTest.kt
+++ b/compose/ui/ui/src/androidUnitTest/kotlin/androidx/compose/ui/focus/FocusRequesterModifierTest.kt
@@ -42,8 +42,7 @@
         val modifier = Modifier.focusRequester(focusRequester) as InspectableValue
         assertThat(modifier.nameFallback).isEqualTo("focusRequester")
         assertThat(modifier.valueOverride).isNull()
-        assertThat(modifier.inspectableElements.asIterable()).containsExactly(
-            ValueElement("focusRequester", focusRequester)
-        )
+        assertThat(modifier.inspectableElements.asIterable())
+            .containsExactly(ValueElement("focusRequester", focusRequester))
     }
 }
diff --git a/compose/ui/ui/src/androidUnitTest/kotlin/androidx/compose/ui/gesture/scrollorientationlocking/PolyFitLeastSquaresTest.kt b/compose/ui/ui/src/androidUnitTest/kotlin/androidx/compose/ui/gesture/scrollorientationlocking/PolyFitLeastSquaresTest.kt
index 4727854..6821928 100644
--- a/compose/ui/ui/src/androidUnitTest/kotlin/androidx/compose/ui/gesture/scrollorientationlocking/PolyFitLeastSquaresTest.kt
+++ b/compose/ui/ui/src/androidUnitTest/kotlin/androidx/compose/ui/gesture/scrollorientationlocking/PolyFitLeastSquaresTest.kt
@@ -212,15 +212,11 @@
         polyFitLeastSquares_degreeIsNegative_throwsIllegalArgumentException(-5)
     }
 
-    private fun polyFitLeastSquares_degreeIsNegative_throwsIllegalArgumentException(
-        degree: Int
-    ) {
+    private fun polyFitLeastSquares_degreeIsNegative_throwsIllegalArgumentException(degree: Int) {
         val x = floatArrayOf(0f, 1f)
         val y = floatArrayOf(0f, 1f)
 
-        val throwable = catchThrowable {
-            polyFitLeastSquares(x, y, x.size, degree)
-        }
+        val throwable = catchThrowable { polyFitLeastSquares(x, y, x.size, degree) }
 
         assertThat(throwable is IllegalArgumentException).isTrue()
     }
@@ -230,9 +226,7 @@
         val x = floatArrayOf()
         val y = floatArrayOf()
 
-        val throwable = catchThrowable {
-            polyFitLeastSquares(x, y, x.size, 1)
-        }
+        val throwable = catchThrowable { polyFitLeastSquares(x, y, x.size, 1) }
 
         assertThat(throwable is IllegalArgumentException).isTrue()
     }
@@ -259,10 +253,7 @@
         return exception
     }
 
-    private fun assertIsCloseToEquals(
-        actual: FloatArray,
-        expected: FloatArray
-    ) {
+    private fun assertIsCloseToEquals(actual: FloatArray, expected: FloatArray) {
         assertThat(expected.size).isEqualTo(expected.size)
         expected.forEachIndexed() { index, value ->
             assertThat(actual[index]).isWithin(.00001f).of(value)
diff --git a/compose/ui/ui/src/androidUnitTest/kotlin/androidx/compose/ui/graphics/GraphicsLayerScopeTest.kt b/compose/ui/ui/src/androidUnitTest/kotlin/androidx/compose/ui/graphics/GraphicsLayerScopeTest.kt
index 3e005d1..20c33bd 100644
--- a/compose/ui/ui/src/androidUnitTest/kotlin/androidx/compose/ui/graphics/GraphicsLayerScopeTest.kt
+++ b/compose/ui/ui/src/androidUnitTest/kotlin/androidx/compose/ui/graphics/GraphicsLayerScopeTest.kt
@@ -48,13 +48,14 @@
         scope.rotationZ = 5f
         scope.cameraDistance = 5f
         scope.transformOrigin = TransformOrigin(0.7f, 0.1f)
-        scope.shape = object : Shape {
-            override fun createOutline(
-                size: Size,
-                layoutDirection: LayoutDirection,
-                density: Density
-            ) = Outline.Rectangle(size.toRect())
-        }
+        scope.shape =
+            object : Shape {
+                override fun createOutline(
+                    size: Size,
+                    layoutDirection: LayoutDirection,
+                    density: Density
+                ) = Outline.Rectangle(size.toRect())
+            }
         scope.clip = true
         scope.size = Size(100f, 200f)
         scope.reset()
diff --git a/compose/ui/ui/src/androidUnitTest/kotlin/androidx/compose/ui/graphics/vector/ImageVectorBuilderTest.kt b/compose/ui/ui/src/androidUnitTest/kotlin/androidx/compose/ui/graphics/vector/ImageVectorBuilderTest.kt
index af80fc4..f5e1e6d 100644
--- a/compose/ui/ui/src/androidUnitTest/kotlin/androidx/compose/ui/graphics/vector/ImageVectorBuilderTest.kt
+++ b/compose/ui/ui/src/androidUnitTest/kotlin/androidx/compose/ui/graphics/vector/ImageVectorBuilderTest.kt
@@ -27,55 +27,62 @@
 
     @Test
     fun dslAndBuilderAreEqual() {
-        val builderFunctionVector = builder().apply {
-            addGroup(name = "Vector", pivotX = 0.2f, pivotY = 0.4f)
-            addPath(
-                listOf(PathNode.LineTo(10f, 10f), PathNode.Close)
-            )
-            addPath(
-                listOf(
-                    PathNode.HorizontalTo(20f),
-                    PathNode.RelativeReflectiveCurveTo(40f, 40f, 10f, 10f),
-                    PathNode.Close
-                )
-            )
-            clearGroup()
-        }.build()
+        val builderFunctionVector =
+            builder()
+                .apply {
+                    addGroup(name = "Vector", pivotX = 0.2f, pivotY = 0.4f)
+                    addPath(listOf(PathNode.LineTo(10f, 10f), PathNode.Close))
+                    addPath(
+                        listOf(
+                            PathNode.HorizontalTo(20f),
+                            PathNode.RelativeReflectiveCurveTo(40f, 40f, 10f, 10f),
+                            PathNode.Close
+                        )
+                    )
+                    clearGroup()
+                }
+                .build()
 
-        val dslFunctionVector = builder().apply {
-            group(name = "Vector", pivotX = 0.2f, pivotY = 0.4f) {
-                path {
-                    lineTo(10f, 10f)
-                    close()
+        val dslFunctionVector =
+            builder()
+                .apply {
+                    group(name = "Vector", pivotX = 0.2f, pivotY = 0.4f) {
+                        path {
+                            lineTo(10f, 10f)
+                            close()
+                        }
+                        path {
+                            horizontalLineTo(20f)
+                            reflectiveCurveToRelative(40f, 40f, 10f, 10f)
+                            close()
+                        }
+                    }
                 }
-                path {
-                    horizontalLineTo(20f)
-                    reflectiveCurveToRelative(40f, 40f, 10f, 10f)
-                    close()
-                }
-            }
-        }.build()
+                .build()
 
         Truth.assertThat(dslFunctionVector).isEqualTo(builderFunctionVector)
     }
 
     @Test
     fun testAddGroup() {
-        val imageVector = builder().apply {
-            addGroup("group1")
-            addPath(name = "path1", pathData = emptyList())
-            addGroup("group2")
-            addPath(name = "path2", pathData = emptyList())
-            clearGroup()
-            addGroup("group3")
-            addPath(name = "path3", pathData = emptyList())
-            addPath(name = "path4", pathData = emptyList())
-            clearGroup()
-            clearGroup()
-            addGroup(name = "group4")
-            addPath(name = "path5", pathData = emptyList())
-            // intentionally avoid popping group as build will pop all groups to the root
-        }.build()
+        val imageVector =
+            builder()
+                .apply {
+                    addGroup("group1")
+                    addPath(name = "path1", pathData = emptyList())
+                    addGroup("group2")
+                    addPath(name = "path2", pathData = emptyList())
+                    clearGroup()
+                    addGroup("group3")
+                    addPath(name = "path3", pathData = emptyList())
+                    addPath(name = "path4", pathData = emptyList())
+                    clearGroup()
+                    clearGroup()
+                    addGroup(name = "group4")
+                    addPath(name = "path5", pathData = emptyList())
+                    // intentionally avoid popping group as build will pop all groups to the root
+                }
+                .build()
 
         val root = imageVector.root
         Truth.assertThat(root.size).isEqualTo(2)
@@ -114,9 +121,10 @@
     }
 }
 
-private fun builder() = ImageVector.Builder(
-    defaultWidth = 10.dp,
-    defaultHeight = 10.dp,
-    viewportWidth = 10f,
-    viewportHeight = 10f
-)
+private fun builder() =
+    ImageVector.Builder(
+        defaultWidth = 10.dp,
+        defaultHeight = 10.dp,
+        viewportWidth = 10f,
+        viewportHeight = 10f
+    )
diff --git a/compose/ui/ui/src/androidUnitTest/kotlin/androidx/compose/ui/hapticfeedback/HapticFeedbackTest.kt b/compose/ui/ui/src/androidUnitTest/kotlin/androidx/compose/ui/hapticfeedback/HapticFeedbackTest.kt
index 260344e..0c72231 100644
--- a/compose/ui/ui/src/androidUnitTest/kotlin/androidx/compose/ui/hapticfeedback/HapticFeedbackTest.kt
+++ b/compose/ui/ui/src/androidUnitTest/kotlin/androidx/compose/ui/hapticfeedback/HapticFeedbackTest.kt
@@ -35,10 +35,7 @@
 
         hapticFeedBack.performHapticFeedback(HapticFeedbackType.TextHandleMove)
 
-        verify(
-            view,
-            times(1)
-        ).performHapticFeedback(HapticFeedbackConstants.TEXT_HANDLE_MOVE)
+        verify(view, times(1)).performHapticFeedback(HapticFeedbackConstants.TEXT_HANDLE_MOVE)
     }
 
     @Test
@@ -48,9 +45,6 @@
 
         hapticFeedBack.performHapticFeedback(HapticFeedbackType.LongPress)
 
-        verify(
-            view,
-            times(1)
-        ).performHapticFeedback(HapticFeedbackConstants.LONG_PRESS)
+        verify(view, times(1)).performHapticFeedback(HapticFeedbackConstants.LONG_PRESS)
     }
 }
diff --git a/compose/ui/ui/src/androidUnitTest/kotlin/androidx/compose/ui/input/RecordingInputConnectionInactiveTest.kt b/compose/ui/ui/src/androidUnitTest/kotlin/androidx/compose/ui/input/RecordingInputConnectionInactiveTest.kt
index 2e53e33..2f6ab36 100644
--- a/compose/ui/ui/src/androidUnitTest/kotlin/androidx/compose/ui/input/RecordingInputConnectionInactiveTest.kt
+++ b/compose/ui/ui/src/androidUnitTest/kotlin/androidx/compose/ui/input/RecordingInputConnectionInactiveTest.kt
@@ -137,39 +137,40 @@
         assertThat(ic.commitContent(mock(), 0, mock())).isFalse()
     }
 
-    private fun defaultInputConnection() = RecordingInputConnection(
-        initState = TextFieldValue("", TextRange.Zero),
-        eventCallback = mock(),
-        autoCorrect = true
-    )
+    private fun defaultInputConnection() =
+        RecordingInputConnection(
+            initState = TextFieldValue("", TextRange.Zero),
+            eventCallback = mock(),
+            autoCorrect = true
+        )
 
-// The following InputConnection functions does not have well defined inactive input
-// connection behavior, keeping them commented as a reference.
-//    @Test
-//    fun getTextBeforeCursor(){
-//        assertThat(ic.getTextBeforeCursor(mock(), mock())).isEqualTo("")
-//    }
-//
-//    @Test
-//    fun getTextAfterCursor() {
-//        assertThat(ic.getTextAfterCursor(mock(), mock())).isEqualTo("")
-//    }
-//
-//    @Test
-//    fun getSelectedText() {
-//        assertThat(ic.getSelectedText(mock(), mock())).isEqualTo("")
-//    }
-//
-//    @Test
-//    fun getCursorCapsMode() {
-//        assertThat(ic.getCursorCapsMode(mock())).isEqualTo(0)
-//    }
-//    @Test
-//    fun getExtractedText() {
-//        assertThat(ic.getExtractedText(mock(), mock())).isEqualTo(0)
-//    }
-//    @Test
-//    fun getHandler() {
-//        assertThat(ic.handler).isFalse()
-//    }
+    // The following InputConnection functions does not have well defined inactive input
+    // connection behavior, keeping them commented as a reference.
+    //    @Test
+    //    fun getTextBeforeCursor(){
+    //        assertThat(ic.getTextBeforeCursor(mock(), mock())).isEqualTo("")
+    //    }
+    //
+    //    @Test
+    //    fun getTextAfterCursor() {
+    //        assertThat(ic.getTextAfterCursor(mock(), mock())).isEqualTo("")
+    //    }
+    //
+    //    @Test
+    //    fun getSelectedText() {
+    //        assertThat(ic.getSelectedText(mock(), mock())).isEqualTo("")
+    //    }
+    //
+    //    @Test
+    //    fun getCursorCapsMode() {
+    //        assertThat(ic.getCursorCapsMode(mock())).isEqualTo(0)
+    //    }
+    //    @Test
+    //    fun getExtractedText() {
+    //        assertThat(ic.getExtractedText(mock(), mock())).isEqualTo(0)
+    //    }
+    //    @Test
+    //    fun getHandler() {
+    //        assertThat(ic.handler).isFalse()
+    //    }
 }
diff --git a/compose/ui/ui/src/androidUnitTest/kotlin/androidx/compose/ui/input/RecordingInputConnectionUpdateTextFieldValueTest.kt b/compose/ui/ui/src/androidUnitTest/kotlin/androidx/compose/ui/input/RecordingInputConnectionUpdateTextFieldValueTest.kt
index 9760583..3ccb605 100644
--- a/compose/ui/ui/src/androidUnitTest/kotlin/androidx/compose/ui/input/RecordingInputConnectionUpdateTextFieldValueTest.kt
+++ b/compose/ui/ui/src/androidUnitTest/kotlin/androidx/compose/ui/input/RecordingInputConnectionUpdateTextFieldValueTest.kt
@@ -47,11 +47,12 @@
     @Before
     fun setup() {
         mCallback = mock()
-        ic = RecordingInputConnection(
-            initState = TextFieldValue("", TextRange.Zero),
-            eventCallback = mCallback,
-            autoCorrect = true
-        )
+        ic =
+            RecordingInputConnection(
+                initState = TextFieldValue("", TextRange.Zero),
+                eventCallback = mCallback,
+                autoCorrect = true
+            )
     }
 
     @Test
diff --git a/compose/ui/ui/src/androidUnitTest/kotlin/androidx/compose/ui/input/key/KeyInputModifierTest.kt b/compose/ui/ui/src/androidUnitTest/kotlin/androidx/compose/ui/input/key/KeyInputModifierTest.kt
index 5df94e5..a059d88 100644
--- a/compose/ui/ui/src/androidUnitTest/kotlin/androidx/compose/ui/input/key/KeyInputModifierTest.kt
+++ b/compose/ui/ui/src/androidUnitTest/kotlin/androidx/compose/ui/input/key/KeyInputModifierTest.kt
@@ -43,9 +43,8 @@
         val modifier = Modifier.onKeyEvent(onKeyEvent).first() as InspectableValue
         assertThat(modifier.nameFallback).isEqualTo("onKeyEvent")
         assertThat(modifier.valueOverride).isNull()
-        assertThat(modifier.inspectableElements.asIterable()).containsExactly(
-            ValueElement("onKeyEvent", onKeyEvent)
-        )
+        assertThat(modifier.inspectableElements.asIterable())
+            .containsExactly(ValueElement("onKeyEvent", onKeyEvent))
     }
 
     @Test
@@ -54,8 +53,7 @@
         val modifier = Modifier.onPreviewKeyEvent(onPreviewKeyEvent).first() as InspectableValue
         assertThat(modifier.nameFallback).isEqualTo("onPreviewKeyEvent")
         assertThat(modifier.valueOverride).isNull()
-        assertThat(modifier.inspectableElements.asIterable()).containsExactly(
-            ValueElement("onPreviewKeyEvent", onPreviewKeyEvent)
-        )
+        assertThat(modifier.inspectableElements.asIterable())
+            .containsExactly(ValueElement("onPreviewKeyEvent", onPreviewKeyEvent))
     }
 }
diff --git a/compose/ui/ui/src/androidUnitTest/kotlin/androidx/compose/ui/input/pointer/PointerInputTest.kt b/compose/ui/ui/src/androidUnitTest/kotlin/androidx/compose/ui/input/pointer/PointerInputTest.kt
index ec0e9b0..527687c 100644
--- a/compose/ui/ui/src/androidUnitTest/kotlin/androidx/compose/ui/input/pointer/PointerInputTest.kt
+++ b/compose/ui/ui/src/androidUnitTest/kotlin/androidx/compose/ui/input/pointer/PointerInputTest.kt
@@ -79,37 +79,22 @@
         val pointerInputChange3 =
             createPointerInputChange(0f, 0f, true, 0f, 0f, true, 0f, 0f, false)
 
-        assertThat(
-            pointerInputChange1.changedToDownIgnoreConsumed(),
-            `is`(false)
-        )
-        assertThat(
-            pointerInputChange2.changedToDownIgnoreConsumed(),
-            `is`(false)
-        )
-        assertThat(
-            pointerInputChange3.changedToDownIgnoreConsumed(),
-            `is`(false)
-        )
+        assertThat(pointerInputChange1.changedToDownIgnoreConsumed(), `is`(false))
+        assertThat(pointerInputChange2.changedToDownIgnoreConsumed(), `is`(false))
+        assertThat(pointerInputChange3.changedToDownIgnoreConsumed(), `is`(false))
     }
 
     @Test
     fun changedToDownIgnoreConsumed_changedNotConsumed_returnsTrue() {
         val pointerInputChange =
             createPointerInputChange(0f, 0f, true, 0f, 0f, false, 0f, 0f, false)
-        assertThat(
-            pointerInputChange.changedToDownIgnoreConsumed(),
-            `is`(true)
-        )
+        assertThat(pointerInputChange.changedToDownIgnoreConsumed(), `is`(true))
     }
 
     @Test
     fun changedToDownIgnoreConsumed_changedConsumed_returnsTrue() {
         val pointerInputChange = createPointerInputChange(0f, 0f, true, 0f, 0f, false, 0f, 0f, true)
-        assertThat(
-            pointerInputChange.changedToDownIgnoreConsumed(),
-            `is`(true)
-        )
+        assertThat(pointerInputChange.changedToDownIgnoreConsumed(), `is`(true))
     }
 
     @Test
@@ -148,37 +133,22 @@
         val pointerInputChange3 =
             createPointerInputChange(0f, 0f, true, 0f, 0f, true, 0f, 0f, false)
 
-        assertThat(
-            pointerInputChange1.changedToUpIgnoreConsumed(),
-            `is`(false)
-        )
-        assertThat(
-            pointerInputChange2.changedToUpIgnoreConsumed(),
-            `is`(false)
-        )
-        assertThat(
-            pointerInputChange3.changedToUpIgnoreConsumed(),
-            `is`(false)
-        )
+        assertThat(pointerInputChange1.changedToUpIgnoreConsumed(), `is`(false))
+        assertThat(pointerInputChange2.changedToUpIgnoreConsumed(), `is`(false))
+        assertThat(pointerInputChange3.changedToUpIgnoreConsumed(), `is`(false))
     }
 
     @Test
     fun changedToUpIgnoreConsumed_changedNotConsumed_returnsTrue() {
         val pointerInputChange =
             createPointerInputChange(0f, 0f, false, 0f, 0f, true, 0f, 0f, false)
-        assertThat(
-            pointerInputChange.changedToUpIgnoreConsumed(),
-            `is`(true)
-        )
+        assertThat(pointerInputChange.changedToUpIgnoreConsumed(), `is`(true))
     }
 
     @Test
     fun changedToUpIgnoreConsumed_changedConsumed_returnsTrue() {
         val pointerInputChange = createPointerInputChange(0f, 0f, false, 0f, 0f, true, 0f, 0f, true)
-        assertThat(
-            pointerInputChange.changedToUpIgnoreConsumed(),
-            `is`(true)
-        )
+        assertThat(pointerInputChange.changedToUpIgnoreConsumed(), `is`(true))
     }
 
     // TODO(shepshapard): Test more variations of positions?
@@ -187,40 +157,28 @@
     fun positionChange_didNotChange_returnsZeroOffset() {
         val pointerInputChange =
             createPointerInputChange(11f, 13f, true, 11f, 13f, true, 0f, 0f, false)
-        assertThat(
-            pointerInputChange.positionChange(),
-            `is`(equalTo(Offset.Zero))
-        )
+        assertThat(pointerInputChange.positionChange(), `is`(equalTo(Offset.Zero)))
     }
 
     @Test
     fun positionChange_changedNotConsumed_returnsFullOffset() {
         val pointerInputChange =
             createPointerInputChange(8f, 16f, true, 2f, 4f, true, 0f, 0f, false)
-        assertThat(
-            pointerInputChange.positionChange(),
-            `is`(equalTo(Offset(6f, 12f)))
-        )
+        assertThat(pointerInputChange.positionChange(), `is`(equalTo(Offset(6f, 12f))))
     }
 
     @Test
     fun positionChange_changedFullConsumed_returnsZeroOffset() {
         val pointerInputChange =
             createPointerInputChange(8f, 16f, true, 2f, 4f, true, 6f, 12f, false)
-        assertThat(
-            pointerInputChange.positionChange(),
-            `is`(equalTo(Offset.Zero))
-        )
+        assertThat(pointerInputChange.positionChange(), `is`(equalTo(Offset.Zero)))
     }
 
     @Test
     fun positionChangeIgnoreConsumed_didNotChange_returnsZeroOffset() {
         val pointerInputChange =
             createPointerInputChange(11f, 13f, true, 11f, 13f, true, 0f, 0f, false)
-        assertThat(
-            pointerInputChange.positionChangeIgnoreConsumed(),
-            `is`(equalTo(Offset.Zero))
-        )
+        assertThat(pointerInputChange.positionChangeIgnoreConsumed(), `is`(equalTo(Offset.Zero)))
     }
 
     @Test
@@ -278,70 +236,49 @@
     fun positionChangedIgnoreConsumed_didNotChange_returnsFalse() {
         val pointerInputChange =
             createPointerInputChange(11f, 13f, true, 11f, 13f, true, 0f, 0f, false)
-        assertThat(
-            pointerInputChange.positionChangedIgnoreConsumed(),
-            `is`(false)
-        )
+        assertThat(pointerInputChange.positionChangedIgnoreConsumed(), `is`(false))
     }
 
     @Test
     fun positionChangedIgnoreConsumed_changedNotConsumed_returnsTrue() {
         val pointerInputChange =
             createPointerInputChange(8f, 16f, true, 2f, 4f, true, 0f, 0f, false)
-        assertThat(
-            pointerInputChange.positionChangedIgnoreConsumed(),
-            `is`(true)
-        )
+        assertThat(pointerInputChange.positionChangedIgnoreConsumed(), `is`(true))
     }
 
     @Test
     fun positionChangedIgnoreConsumed_changedPartiallyConsumed_returnsTrue() {
         val pointerInputChange =
             createPointerInputChange(8f, 16f, true, 2f, 4f, true, 5f, 9f, false)
-        assertThat(
-            pointerInputChange.positionChangedIgnoreConsumed(),
-            `is`(true)
-        )
+        assertThat(pointerInputChange.positionChangedIgnoreConsumed(), `is`(true))
     }
 
     @Test
     fun positionChangedIgnoreConsumed_changedFullConsumed_returnsTrue() {
         val pointerInputChange =
             createPointerInputChange(8f, 16f, true, 2f, 4f, true, 6f, 12f, false)
-        assertThat(
-            pointerInputChange.positionChangedIgnoreConsumed(),
-            `is`(true)
-        )
+        assertThat(pointerInputChange.positionChangedIgnoreConsumed(), `is`(true))
     }
 
     @Test
     fun anyPositionChangeConsumed_changedNotConsumed_returnsFalse() {
         val pointerInputChange =
             createPointerInputChange(8f, 16f, true, 2f, 4f, true, 0f, 0f, false)
-        assertThat(
-            pointerInputChange.isConsumed,
-            `is`(false)
-        )
+        assertThat(pointerInputChange.isConsumed, `is`(false))
     }
 
     @Test
     fun anyPositionChangeConsumed_changedPartiallyConsumed_returnsTrue() {
         val pointerInputChange =
             createPointerInputChange(8f, 16f, true, 2f, 4f, true, 5f, 9f, false)
-        assertThat(
-            pointerInputChange.isConsumed,
-            `is`(true)
-        )
+        assertThat(pointerInputChange.isConsumed, `is`(true))
     }
 
     @Test
     fun anyPositionChangeConsumed_changedFullConsumed_returnsTrue() {
         val pointerInputChange =
             createPointerInputChange(8f, 16f, true, 2f, 4f, true, 6f, 12f, false)
-        assertThat(
-            pointerInputChange.isConsumed,
-            `is`(true)
-        )
+        assertThat(pointerInputChange.isConsumed, `is`(true))
     }
 
     @Test
@@ -418,11 +355,9 @@
         val pointerInputChange1 =
             createPointerInputChange(8f, 16f, true, 2f, 4f, true, 0f, 0f, false)
 
-        val pointerInputChangeResult1 =
-            pointerInputChange1.deepCopy().apply { consume() }
+        val pointerInputChangeResult1 = pointerInputChange1.deepCopy().apply { consume() }
 
-        PointerInputChangeSubject
-            .assertThat(pointerInputChangeResult1).positionChangeConsumed()
+        PointerInputChangeSubject.assertThat(pointerInputChangeResult1).positionChangeConsumed()
     }
 
     @Test
@@ -435,10 +370,8 @@
         val actual1 = pointerInputChange1.apply { consume() }
         val actual2 = pointerInputChange2.apply { consume() }
 
-        PointerInputChangeSubject
-            .assertThat(actual1).positionChangeConsumed()
-        PointerInputChangeSubject
-            .assertThat(actual2).positionChangeConsumed()
+        PointerInputChangeSubject.assertThat(actual1).positionChangeConsumed()
+        PointerInputChangeSubject.assertThat(actual2).positionChangeConsumed()
     }
 
     @Test
@@ -559,10 +492,8 @@
     }
 }
 
-private class PointerInputChangeSubject(
-    metaData: FailureMetadata,
-    val actual: PointerInputChange
-) : Subject(metaData, actual) {
+private class PointerInputChangeSubject(metaData: FailureMetadata, val actual: PointerInputChange) :
+    Subject(metaData, actual) {
 
     companion object {
 
@@ -590,27 +521,24 @@
     }
 
     fun positionChangeConsumed() {
-        check("consumed.positionChangeConsumed")
-            .that(actual.isConsumed)
-            .isEqualTo(true)
+        check("consumed.positionChangeConsumed").that(actual.isConsumed).isEqualTo(true)
     }
 
     fun positionChangeNotConsumed() {
-        check("consumed.positionChange not Consumed")
-            .that(actual.isConsumed)
-            .isEqualTo(false)
+        check("consumed.positionChange not Consumed").that(actual.isConsumed).isEqualTo(false)
     }
 }
 
-private fun PointerInputChange.deepCopy(): PointerInputChange = PointerInputChange(
-    id = this.id,
-    uptimeMillis = this.uptimeMillis,
-    position = this.position,
-    pressed = this.pressed,
-    previousUptimeMillis = this.previousUptimeMillis,
-    previousPosition = this.previousPosition,
-    previousPressed = this.previousPressed,
-    isInitiallyConsumed = this.isConsumed,
-    type = this.type,
-    scrollDelta = this.scrollDelta
-)
+private fun PointerInputChange.deepCopy(): PointerInputChange =
+    PointerInputChange(
+        id = this.id,
+        uptimeMillis = this.uptimeMillis,
+        position = this.position,
+        pressed = this.pressed,
+        previousUptimeMillis = this.previousUptimeMillis,
+        previousPosition = this.previousPosition,
+        previousPressed = this.previousPressed,
+        isInitiallyConsumed = this.isConsumed,
+        type = this.type,
+        scrollDelta = this.scrollDelta
+    )
diff --git a/compose/ui/ui/src/androidUnitTest/kotlin/androidx/compose/ui/input/pointer/util/VelocityTracker1DTest.kt b/compose/ui/ui/src/androidUnitTest/kotlin/androidx/compose/ui/input/pointer/util/VelocityTracker1DTest.kt
index 7c1c957..c943df8 100644
--- a/compose/ui/ui/src/androidUnitTest/kotlin/androidx/compose/ui/input/pointer/util/VelocityTracker1DTest.kt
+++ b/compose/ui/ui/src/androidUnitTest/kotlin/androidx/compose/ui/input/pointer/util/VelocityTracker1DTest.kt
@@ -46,11 +46,12 @@
             VelocityTrackingTestCase(
                 differentialDataPoints = false,
                 dataPoints = listOf(DataPointAtTime(1, 5f), DataPointAtTime(2, 15f)),
-                expectedVelocities = listOf(
-                    ExpectedVelocity(Strategy.Impulse, 10000f),
-                    // 3 is the minimum number of data points for Lsq2, so expect a 0 velocity.
-                    ExpectedVelocity(Strategy.Lsq2, 0f),
-                )
+                expectedVelocities =
+                    listOf(
+                        ExpectedVelocity(Strategy.Impulse, 10000f),
+                        // 3 is the minimum number of data points for Lsq2, so expect a 0 velocity.
+                        ExpectedVelocity(Strategy.Lsq2, 0f),
+                    )
             )
         )
     }
@@ -71,18 +72,20 @@
         checkTestCase(
             VelocityTrackingTestCase(
                 differentialDataPoints = false,
-                dataPoints = listOf(
-                    DataPointAtTime(25, 25f),
-                    DataPointAtTime(50, 50f),
-                    DataPointAtTime(100, 100f),
-                ),
+                dataPoints =
+                    listOf(
+                        DataPointAtTime(25, 25f),
+                        DataPointAtTime(50, 50f),
+                        DataPointAtTime(100, 100f),
+                    ),
                 // Expect 0 velocities, as the pointer will be considered to have stopped moving,
                 // due to the (100-50)=40ms gap from the last data point (i.e. it's effectively
                 // a data set with only 1 data point).
-                expectedVelocities = listOf(
-                    ExpectedVelocity(Strategy.Lsq2, 0f),
-                    ExpectedVelocity(Strategy.Impulse, 0f)
-                ),
+                expectedVelocities =
+                    listOf(
+                        ExpectedVelocity(Strategy.Lsq2, 0f),
+                        ExpectedVelocity(Strategy.Impulse, 0f)
+                    ),
             )
         )
     }
@@ -92,17 +95,16 @@
         checkTestCase(
             VelocityTrackingTestCase(
                 differentialDataPoints = true,
-                dataPoints = listOf(
-                    DataPointAtTime(25, 25f),
-                    DataPointAtTime(50, 50f),
-                    DataPointAtTime(100, 100f),
-                ),
+                dataPoints =
+                    listOf(
+                        DataPointAtTime(25, 25f),
+                        DataPointAtTime(50, 50f),
+                        DataPointAtTime(100, 100f),
+                    ),
                 // Expect 0 velocities, as the pointer will be considered to have stopped moving,
                 // due to the (100-50)=40ms gap from the last data point (i.e. it's effectively
                 // a data set with only 1 data point).
-                expectedVelocities = listOf(
-                    ExpectedVelocity(Strategy.Impulse, 0f)
-                ),
+                expectedVelocities = listOf(ExpectedVelocity(Strategy.Impulse, 0f)),
             )
         )
     }
@@ -113,11 +115,12 @@
         checkTestCase(
             VelocityTrackingTestCase(
                 differentialDataPoints = false,
-                dataPoints = listOf(
-                    DataPointAtTime(0, 273f),
-                    DataPointAtTime(1, 273f),
-                    DataPointAtTime(2, 273f),
-                ),
+                dataPoints =
+                    listOf(
+                        DataPointAtTime(0, 273f),
+                        DataPointAtTime(1, 273f),
+                        DataPointAtTime(2, 273f),
+                    ),
                 expectedVelocities = listOf(ExpectedVelocity(Strategy.Impulse, 0f))
             ),
         )
@@ -128,11 +131,12 @@
         checkTestCase(
             VelocityTrackingTestCase(
                 differentialDataPoints = true,
-                dataPoints = listOf(
-                    DataPointAtTime(0, 0f),
-                    DataPointAtTime(1, 0f),
-                    DataPointAtTime(2, 0f),
-                ),
+                dataPoints =
+                    listOf(
+                        DataPointAtTime(0, 0f),
+                        DataPointAtTime(1, 0f),
+                        DataPointAtTime(2, 0f),
+                    ),
                 expectedVelocities = listOf(ExpectedVelocity(Strategy.Impulse, 0f))
             ),
         )
@@ -204,12 +208,13 @@
         checkTestCase(
             VelocityTrackingTestCase(
                 differentialDataPoints = false,
-                dataPoints = listOf(
-                    DataPointAtTime(0, 0f),
-                    DataPointAtTime(10, 5f),
-                    DataPointAtTime(20, 10f),
-                    DataPointAtTime(30, 15f),
-                ),
+                dataPoints =
+                    listOf(
+                        DataPointAtTime(0, 0f),
+                        DataPointAtTime(10, 5f),
+                        DataPointAtTime(20, 10f),
+                        DataPointAtTime(30, 15f),
+                    ),
                 expectedVelocities = listOf(ExpectedVelocity(Strategy.Impulse, 500f)),
             )
         )
@@ -221,11 +226,12 @@
         checkTestCase(
             VelocityTrackingTestCase(
                 differentialDataPoints = true,
-                dataPoints = listOf(
-                    DataPointAtTime(10, 5f),
-                    DataPointAtTime(20, 5f),
-                    DataPointAtTime(30, 5f),
-                ),
+                dataPoints =
+                    listOf(
+                        DataPointAtTime(10, 5f),
+                        DataPointAtTime(20, 5f),
+                        DataPointAtTime(30, 5f),
+                    ),
                 expectedVelocities = listOf(ExpectedVelocity(Strategy.Impulse, 500f)),
             )
         )
@@ -237,11 +243,12 @@
         checkTestCase(
             VelocityTrackingTestCase(
                 differentialDataPoints = false,
-                dataPoints = listOf(
-                    DataPointAtTime(0, -20f),
-                    DataPointAtTime(10, -15f),
-                    DataPointAtTime(20, -10f),
-                ),
+                dataPoints =
+                    listOf(
+                        DataPointAtTime(0, -20f),
+                        DataPointAtTime(10, -15f),
+                        DataPointAtTime(20, -10f),
+                    ),
                 expectedVelocities = listOf(ExpectedVelocity(Strategy.Impulse, 500f)),
             )
         )
@@ -253,11 +260,12 @@
         checkTestCase(
             VelocityTrackingTestCase(
                 differentialDataPoints = false,
-                dataPoints = listOf(
-                    DataPointAtTime(0, -5f),
-                    DataPointAtTime(10, 0f),
-                    DataPointAtTime(20, 5f),
-                ),
+                dataPoints =
+                    listOf(
+                        DataPointAtTime(0, -5f),
+                        DataPointAtTime(10, 0f),
+                        DataPointAtTime(20, 5f),
+                    ),
                 expectedVelocities = listOf(ExpectedVelocity(Strategy.Impulse, 500f)),
             )
         )
@@ -269,11 +277,12 @@
         checkTestCase(
             VelocityTrackingTestCase(
                 differentialDataPoints = false,
-                dataPoints = listOf(
-                    DataPointAtTime(0, 0f),
-                    DataPointAtTime(10, -5f),
-                    DataPointAtTime(20, -10f),
-                ),
+                dataPoints =
+                    listOf(
+                        DataPointAtTime(0, 0f),
+                        DataPointAtTime(10, -5f),
+                        DataPointAtTime(20, -10f),
+                    ),
                 expectedVelocities = listOf(ExpectedVelocity(Strategy.Impulse, -500f)),
             )
         )
@@ -285,11 +294,12 @@
         checkTestCase(
             VelocityTrackingTestCase(
                 differentialDataPoints = true,
-                dataPoints = listOf(
-                    DataPointAtTime(0, 5f),
-                    DataPointAtTime(10, -5f),
-                    DataPointAtTime(20, -5f),
-                ),
+                dataPoints =
+                    listOf(
+                        DataPointAtTime(0, 5f),
+                        DataPointAtTime(10, -5f),
+                        DataPointAtTime(20, -5f),
+                    ),
                 expectedVelocities = listOf(ExpectedVelocity(Strategy.Impulse, -500f)),
             )
         )
@@ -301,11 +311,12 @@
         checkTestCase(
             VelocityTrackingTestCase(
                 differentialDataPoints = false,
-                dataPoints = listOf(
-                    DataPointAtTime(0, 20f),
-                    DataPointAtTime(10, 15f),
-                    DataPointAtTime(20, 10f),
-                ),
+                dataPoints =
+                    listOf(
+                        DataPointAtTime(0, 20f),
+                        DataPointAtTime(10, 15f),
+                        DataPointAtTime(20, 10f),
+                    ),
                 expectedVelocities = listOf(ExpectedVelocity(Strategy.Impulse, -500f)),
             )
         )
@@ -317,11 +328,12 @@
         checkTestCase(
             VelocityTrackingTestCase(
                 differentialDataPoints = false,
-                dataPoints = listOf(
-                    DataPointAtTime(0, 5f),
-                    DataPointAtTime(10, 0f),
-                    DataPointAtTime(20, -5f),
-                ),
+                dataPoints =
+                    listOf(
+                        DataPointAtTime(0, 5f),
+                        DataPointAtTime(10, 0f),
+                        DataPointAtTime(20, -5f),
+                    ),
                 expectedVelocities = listOf(ExpectedVelocity(Strategy.Impulse, -500f)),
             )
         )
@@ -335,19 +347,20 @@
         checkTestCase(
             VelocityTrackingTestCase(
                 differentialDataPoints = false,
-                dataPoints = listOf(
-                    DataPointAtTime(0, 0f),
-                    DataPointAtTime(10, 0f),
-                    DataPointAtTime(20, 0f),
-                    DataPointAtTime(30, 0f),
-                    DataPointAtTime(40, 0f),
-                    DataPointAtTime(50, 0f),
-                    DataPointAtTime(60, 20f),
-                    DataPointAtTime(70, 40f),
-                    DataPointAtTime(80, 60f),
-                    DataPointAtTime(90, 80f),
-                    DataPointAtTime(100, 100f),
-                ),
+                dataPoints =
+                    listOf(
+                        DataPointAtTime(0, 0f),
+                        DataPointAtTime(10, 0f),
+                        DataPointAtTime(20, 0f),
+                        DataPointAtTime(30, 0f),
+                        DataPointAtTime(40, 0f),
+                        DataPointAtTime(50, 0f),
+                        DataPointAtTime(60, 20f),
+                        DataPointAtTime(70, 40f),
+                        DataPointAtTime(80, 60f),
+                        DataPointAtTime(90, 80f),
+                        DataPointAtTime(100, 100f),
+                    ),
                 expectedVelocities = listOf(ExpectedVelocity(Strategy.Impulse, 2000f))
             ),
         )
@@ -361,13 +374,14 @@
         checkTestCase(
             VelocityTrackingTestCase(
                 differentialDataPoints = false,
-                dataPoints = listOf(
-                    DataPointAtTime(0, 0f),
-                    DataPointAtTime(30, 0f),
-                    DataPointAtTime(40, 0f),
-                    DataPointAtTime(70, 40f),
-                    DataPointAtTime(100, 100f),
-                ),
+                dataPoints =
+                    listOf(
+                        DataPointAtTime(0, 0f),
+                        DataPointAtTime(30, 0f),
+                        DataPointAtTime(40, 0f),
+                        DataPointAtTime(70, 40f),
+                        DataPointAtTime(100, 100f),
+                    ),
                 expectedVelocities = listOf(ExpectedVelocity(Strategy.Impulse, 2018.2f))
             )
         )
@@ -379,19 +393,20 @@
         checkTestCase(
             VelocityTrackingTestCase(
                 differentialDataPoints = false,
-                dataPoints = listOf(
-                    DataPointAtTime(0, 0f),
-                    DataPointAtTime(10, 10f),
-                    DataPointAtTime(20, 20f),
-                    DataPointAtTime(30, 30f),
-                    DataPointAtTime(40, 40f),
-                    DataPointAtTime(50, 50f),
-                    DataPointAtTime(60, 50f),
-                    DataPointAtTime(70, 50f),
-                    DataPointAtTime(80, 50f),
-                    DataPointAtTime(90, 50f),
-                    DataPointAtTime(100, 50f),
-                ),
+                dataPoints =
+                    listOf(
+                        DataPointAtTime(0, 0f),
+                        DataPointAtTime(10, 10f),
+                        DataPointAtTime(20, 20f),
+                        DataPointAtTime(30, 30f),
+                        DataPointAtTime(40, 40f),
+                        DataPointAtTime(50, 50f),
+                        DataPointAtTime(60, 50f),
+                        DataPointAtTime(70, 50f),
+                        DataPointAtTime(80, 50f),
+                        DataPointAtTime(90, 50f),
+                        DataPointAtTime(100, 50f),
+                    ),
                 expectedVelocities = listOf(ExpectedVelocity(Strategy.Impulse, 0f))
             )
         )
@@ -403,11 +418,12 @@
         checkTestCase(
             VelocityTrackingTestCase(
                 differentialDataPoints = false,
-                dataPoints = listOf(
-                    DataPointAtTime(0, 0f),
-                    DataPointAtTime(50, 50f),
-                    DataPointAtTime(100, 50f),
-                ),
+                dataPoints =
+                    listOf(
+                        DataPointAtTime(0, 0f),
+                        DataPointAtTime(50, 50f),
+                        DataPointAtTime(100, 50f),
+                    ),
                 expectedVelocities = listOf(ExpectedVelocity(Strategy.Impulse, 0f))
             ),
         )
@@ -418,41 +434,42 @@
         checkTestCase(
             VelocityTrackingTestCase(
                 differentialDataPoints = true,
-                dataPoints = listOf(
-                    DataPointAtTime(2580534, -0.0334f),
-                    DataPointAtTime(2580549, -0.1336f),
-                    DataPointAtTime(2580566, -0.2505f),
-                    DataPointAtTime(2580581, -0.1837f),
-                    DataPointAtTime(2580597, -0.2672f),
-                    DataPointAtTime(2580613, -0.5511f),
-                    DataPointAtTime(2580635, -0.6012f),
-                    DataPointAtTime(2580661, -0.4509f),
-                    DataPointAtTime(2580683, -0.4175f),
-                    DataPointAtTime(2580705, -0.1503f),
-                    DataPointAtTime(2580722, -0.0167f),
-                    DataPointAtTime(2580786, 0.0501f),
-                    DataPointAtTime(2580801, 0.1503f),
-                    DataPointAtTime(2580822, 0.3006f),
-                    DataPointAtTime(2580838, 0.3006f),
-                    DataPointAtTime(2580854, 0.4008f),
-                    DataPointAtTime(2580869, 0.5177f),
-                    DataPointAtTime(2580886, 0.501f),
-                    DataPointAtTime(2580905, 0.3507f),
-                    DataPointAtTime(2580921, 0.3507f),
-                    DataPointAtTime(2580937, 0.0668f),
-                    DataPointAtTime(2580974, 0.0167f),
-                    DataPointAtTime(2581034, -0.0668f),
-                    DataPointAtTime(2581049, -0.1169f),
-                    DataPointAtTime(2581070, -0.3173f),
-                    DataPointAtTime(2581086, -0.2004f),
-                    DataPointAtTime(2581101, -0.2338f),
-                    DataPointAtTime(2581118, -0.4175f),
-                    DataPointAtTime(2581134, -0.4175f),
-                    DataPointAtTime(2581150, -0.3674f),
-                    DataPointAtTime(2581166, -0.2672f),
-                    DataPointAtTime(2581181, -0.1503f),
-                    DataPointAtTime(2581199, -0.0668f),
-                ),
+                dataPoints =
+                    listOf(
+                        DataPointAtTime(2580534, -0.0334f),
+                        DataPointAtTime(2580549, -0.1336f),
+                        DataPointAtTime(2580566, -0.2505f),
+                        DataPointAtTime(2580581, -0.1837f),
+                        DataPointAtTime(2580597, -0.2672f),
+                        DataPointAtTime(2580613, -0.5511f),
+                        DataPointAtTime(2580635, -0.6012f),
+                        DataPointAtTime(2580661, -0.4509f),
+                        DataPointAtTime(2580683, -0.4175f),
+                        DataPointAtTime(2580705, -0.1503f),
+                        DataPointAtTime(2580722, -0.0167f),
+                        DataPointAtTime(2580786, 0.0501f),
+                        DataPointAtTime(2580801, 0.1503f),
+                        DataPointAtTime(2580822, 0.3006f),
+                        DataPointAtTime(2580838, 0.3006f),
+                        DataPointAtTime(2580854, 0.4008f),
+                        DataPointAtTime(2580869, 0.5177f),
+                        DataPointAtTime(2580886, 0.501f),
+                        DataPointAtTime(2580905, 0.3507f),
+                        DataPointAtTime(2580921, 0.3507f),
+                        DataPointAtTime(2580937, 0.0668f),
+                        DataPointAtTime(2580974, 0.0167f),
+                        DataPointAtTime(2581034, -0.0668f),
+                        DataPointAtTime(2581049, -0.1169f),
+                        DataPointAtTime(2581070, -0.3173f),
+                        DataPointAtTime(2581086, -0.2004f),
+                        DataPointAtTime(2581101, -0.2338f),
+                        DataPointAtTime(2581118, -0.4175f),
+                        DataPointAtTime(2581134, -0.4175f),
+                        DataPointAtTime(2581150, -0.3674f),
+                        DataPointAtTime(2581166, -0.2672f),
+                        DataPointAtTime(2581181, -0.1503f),
+                        DataPointAtTime(2581199, -0.0668f),
+                    ),
                 expectedVelocities = listOf(ExpectedVelocity(Strategy.Impulse, -9.73f))
             )
         )
@@ -464,16 +481,17 @@
         checkTestCase(
             VelocityTrackingTestCase(
                 differentialDataPoints = true,
-                dataPoints = listOf(
-                    DataPointAtTime(224598, -0.0501f),
-                    DataPointAtTime(224621, -0.1336f),
-                    DataPointAtTime(224645, -0.5511f),
-                    DataPointAtTime(224669, -0.8016f),
-                    DataPointAtTime(224687, -1.0354f),
-                    DataPointAtTime(224706, -0.4843f),
-                    DataPointAtTime(224738, -0.334f),
-                    DataPointAtTime(224754, -0.0835f)
-                ),
+                dataPoints =
+                    listOf(
+                        DataPointAtTime(224598, -0.0501f),
+                        DataPointAtTime(224621, -0.1336f),
+                        DataPointAtTime(224645, -0.5511f),
+                        DataPointAtTime(224669, -0.8016f),
+                        DataPointAtTime(224687, -1.0354f),
+                        DataPointAtTime(224706, -0.4843f),
+                        DataPointAtTime(224738, -0.334f),
+                        DataPointAtTime(224754, -0.0835f)
+                    ),
                 expectedVelocities = listOf(ExpectedVelocity(Strategy.Impulse, -27.86f))
             )
         )
@@ -484,16 +502,17 @@
         checkTestCase(
             VelocityTrackingTestCase(
                 differentialDataPoints = true,
-                dataPoints = listOf(
-                    DataPointAtTime(269606, 0.0501f),
-                    DataPointAtTime(269626, 0.2171f),
-                    DataPointAtTime(269641, 0.2672f),
-                    DataPointAtTime(269658, 0.2672f),
-                    DataPointAtTime(269674, 0.2672f),
-                    DataPointAtTime(269690, 0.3674f),
-                    DataPointAtTime(269706, 0.5511f),
-                    DataPointAtTime(269722, 0.501f),
-                ),
+                dataPoints =
+                    listOf(
+                        DataPointAtTime(269606, 0.0501f),
+                        DataPointAtTime(269626, 0.2171f),
+                        DataPointAtTime(269641, 0.2672f),
+                        DataPointAtTime(269658, 0.2672f),
+                        DataPointAtTime(269674, 0.2672f),
+                        DataPointAtTime(269690, 0.3674f),
+                        DataPointAtTime(269706, 0.5511f),
+                        DataPointAtTime(269722, 0.501f),
+                    ),
                 expectedVelocities = listOf(ExpectedVelocity(Strategy.Impulse, 31.92f))
             )
         )
@@ -504,15 +523,16 @@
         checkTestCase(
             VelocityTrackingTestCase(
                 differentialDataPoints = false,
-                dataPoints = listOf(
-                    DataPointAtTime(0, 271f),
-                    DataPointAtTime(16, 269.786346f),
-                    DataPointAtTime(35, 267.983063f),
-                    DataPointAtTime(52, 262.638397f),
-                    DataPointAtTime(68, 266.138824f),
-                    DataPointAtTime(85, 274.79245f),
-                    DataPointAtTime(96, 274.79245f),
-                ),
+                dataPoints =
+                    listOf(
+                        DataPointAtTime(0, 271f),
+                        DataPointAtTime(16, 269.786346f),
+                        DataPointAtTime(35, 267.983063f),
+                        DataPointAtTime(52, 262.638397f),
+                        DataPointAtTime(68, 266.138824f),
+                        DataPointAtTime(85, 274.79245f),
+                        DataPointAtTime(96, 274.79245f),
+                    ),
                 expectedVelocities = listOf(ExpectedVelocity(Strategy.Impulse, 623.57f))
             )
         )
@@ -523,15 +543,16 @@
         checkTestCase(
             VelocityTrackingTestCase(
                 differentialDataPoints = false,
-                dataPoints = listOf(
-                    DataPointAtTime(0, 96f),
-                    DataPointAtTime(16, 106.922775f),
-                    DataPointAtTime(35, 156.660034f),
-                    DataPointAtTime(52, 220.339081f),
-                    DataPointAtTime(68, 331.581116f),
-                    DataPointAtTime(85, 428.113159f),
-                    DataPointAtTime(96, 428.113159f),
-                ),
+                dataPoints =
+                    listOf(
+                        DataPointAtTime(0, 96f),
+                        DataPointAtTime(16, 106.922775f),
+                        DataPointAtTime(35, 156.660034f),
+                        DataPointAtTime(52, 220.339081f),
+                        DataPointAtTime(68, 331.581116f),
+                        DataPointAtTime(85, 428.113159f),
+                        DataPointAtTime(96, 428.113159f),
+                    ),
                 expectedVelocities = listOf(ExpectedVelocity(Strategy.Impulse, 5970.73f))
             )
         )
@@ -542,28 +563,30 @@
         checkTestCase(
             VelocityTrackingTestCase(
                 differentialDataPoints = false,
-                dataPoints = listOf(
-                    DataPointAtTime(235089067, 528.0f),
-                    DataPointAtTime(235089084, 527.0f),
-                    DataPointAtTime(235089093, 527.0f),
-                    DataPointAtTime(235089095, 527.0f),
-                    DataPointAtTime(235089101, 527.0f),
-                    DataPointAtTime(235089110, 528.0f),
-                    DataPointAtTime(235089112, 528.25f),
-                    DataPointAtTime(235089118, 531.0f),
-                    DataPointAtTime(235089126, 535.0f),
-                    DataPointAtTime(235089129, 536.33f),
-                    DataPointAtTime(235089135, 540.0f),
-                    DataPointAtTime(235089144, 546.0f),
-                    DataPointAtTime(235089146, 547.21f),
-                    DataPointAtTime(235089152, 553.0f),
-                    DataPointAtTime(235089160, 559.0f),
-                    DataPointAtTime(235089162, 560.66f),
-                ),
-                expectedVelocities = listOf(
-                    ExpectedVelocity(Strategy.Impulse, 764.34f),
-                    ExpectedVelocity(Strategy.Lsq2, 951.69f),
-                )
+                dataPoints =
+                    listOf(
+                        DataPointAtTime(235089067, 528.0f),
+                        DataPointAtTime(235089084, 527.0f),
+                        DataPointAtTime(235089093, 527.0f),
+                        DataPointAtTime(235089095, 527.0f),
+                        DataPointAtTime(235089101, 527.0f),
+                        DataPointAtTime(235089110, 528.0f),
+                        DataPointAtTime(235089112, 528.25f),
+                        DataPointAtTime(235089118, 531.0f),
+                        DataPointAtTime(235089126, 535.0f),
+                        DataPointAtTime(235089129, 536.33f),
+                        DataPointAtTime(235089135, 540.0f),
+                        DataPointAtTime(235089144, 546.0f),
+                        DataPointAtTime(235089146, 547.21f),
+                        DataPointAtTime(235089152, 553.0f),
+                        DataPointAtTime(235089160, 559.0f),
+                        DataPointAtTime(235089162, 560.66f),
+                    ),
+                expectedVelocities =
+                    listOf(
+                        ExpectedVelocity(Strategy.Impulse, 764.34f),
+                        ExpectedVelocity(Strategy.Lsq2, 951.69f),
+                    )
             )
         )
     }
@@ -573,28 +596,30 @@
         checkTestCase(
             VelocityTrackingTestCase(
                 differentialDataPoints = false,
-                dataPoints = listOf(
-                    DataPointAtTime(235089067, 983.0f),
-                    DataPointAtTime(235089084, 981.0f),
-                    DataPointAtTime(235089093, 977.0f),
-                    DataPointAtTime(235089095, 975.93f),
-                    DataPointAtTime(235089101, 970.0f),
-                    DataPointAtTime(235089110, 960.0f),
-                    DataPointAtTime(235089112, 957.51f),
-                    DataPointAtTime(235089118, 946.0f),
-                    DataPointAtTime(235089126, 931.0f),
-                    DataPointAtTime(235089129, 926.02f),
-                    DataPointAtTime(235089135, 914.0f),
-                    DataPointAtTime(235089144, 896.0f),
-                    DataPointAtTime(235089146, 892.36f),
-                    DataPointAtTime(235089152, 877.0f),
-                    DataPointAtTime(235089160, 851.0f),
-                    DataPointAtTime(235089162, 843.82f),
-                ),
-                expectedVelocities = listOf(
-                    ExpectedVelocity(Strategy.Impulse, -3604.82f),
-                    ExpectedVelocity(Strategy.Lsq2, -3044.96f),
-                )
+                dataPoints =
+                    listOf(
+                        DataPointAtTime(235089067, 983.0f),
+                        DataPointAtTime(235089084, 981.0f),
+                        DataPointAtTime(235089093, 977.0f),
+                        DataPointAtTime(235089095, 975.93f),
+                        DataPointAtTime(235089101, 970.0f),
+                        DataPointAtTime(235089110, 960.0f),
+                        DataPointAtTime(235089112, 957.51f),
+                        DataPointAtTime(235089118, 946.0f),
+                        DataPointAtTime(235089126, 931.0f),
+                        DataPointAtTime(235089129, 926.02f),
+                        DataPointAtTime(235089135, 914.0f),
+                        DataPointAtTime(235089144, 896.0f),
+                        DataPointAtTime(235089146, 892.36f),
+                        DataPointAtTime(235089152, 877.0f),
+                        DataPointAtTime(235089160, 851.0f),
+                        DataPointAtTime(235089162, 843.82f),
+                    ),
+                expectedVelocities =
+                    listOf(
+                        ExpectedVelocity(Strategy.Impulse, -3604.82f),
+                        ExpectedVelocity(Strategy.Lsq2, -3044.96f),
+                    )
             )
         )
     }
@@ -606,21 +631,23 @@
         checkTestCase(
             VelocityTrackingTestCase(
                 differentialDataPoints = false,
-                dataPoints = listOf(
-                    DataPointAtTime(920922, 561.0f),
-                    DataPointAtTime(920930, 559.0f),
-                    DataPointAtTime(920938, 559.0f),
-                    DataPointAtTime(920947, 562.91f),
-                    DataPointAtTime(920955, 577.0f),
-                    DataPointAtTime(920963, 596.87f),
-                    DataPointAtTime(920972, 631.0f),
-                    DataPointAtTime(920980, 671.31f),
-                    DataPointAtTime(920989, 715.0f),
-                ),
-                expectedVelocities = listOf(
-                    ExpectedVelocity(Strategy.Impulse, 5670.32f),
-                    ExpectedVelocity(Strategy.Lsq2, 5991.87f),
-                )
+                dataPoints =
+                    listOf(
+                        DataPointAtTime(920922, 561.0f),
+                        DataPointAtTime(920930, 559.0f),
+                        DataPointAtTime(920938, 559.0f),
+                        DataPointAtTime(920947, 562.91f),
+                        DataPointAtTime(920955, 577.0f),
+                        DataPointAtTime(920963, 596.87f),
+                        DataPointAtTime(920972, 631.0f),
+                        DataPointAtTime(920980, 671.31f),
+                        DataPointAtTime(920989, 715.0f),
+                    ),
+                expectedVelocities =
+                    listOf(
+                        ExpectedVelocity(Strategy.Impulse, 5670.32f),
+                        ExpectedVelocity(Strategy.Lsq2, 5991.87f),
+                    )
             )
         )
     }
@@ -632,21 +659,23 @@
         checkTestCase(
             VelocityTrackingTestCase(
                 differentialDataPoints = false,
-                dataPoints = listOf(
-                    DataPointAtTime(920922, 1412.0f),
-                    DataPointAtTime(920930, 1377.0f),
-                    DataPointAtTime(920938, 1371.0f),
-                    DataPointAtTime(920947, 1342.68f),
-                    DataPointAtTime(920955, 1272.0f),
-                    DataPointAtTime(920963, 1190.54f),
-                    DataPointAtTime(920972, 1093.0f),
-                    DataPointAtTime(920980, 994.68f),
-                    DataPointAtTime(920989, 903.0f),
-                ),
-                expectedVelocities = listOf(
-                    ExpectedVelocity(Strategy.Impulse, -13021.10f),
-                    ExpectedVelocity(Strategy.Lsq2, -15094f),
-                )
+                dataPoints =
+                    listOf(
+                        DataPointAtTime(920922, 1412.0f),
+                        DataPointAtTime(920930, 1377.0f),
+                        DataPointAtTime(920938, 1371.0f),
+                        DataPointAtTime(920947, 1342.68f),
+                        DataPointAtTime(920955, 1272.0f),
+                        DataPointAtTime(920963, 1190.54f),
+                        DataPointAtTime(920972, 1093.0f),
+                        DataPointAtTime(920980, 994.68f),
+                        DataPointAtTime(920989, 903.0f),
+                    ),
+                expectedVelocities =
+                    listOf(
+                        ExpectedVelocity(Strategy.Impulse, -13021.10f),
+                        ExpectedVelocity(Strategy.Lsq2, -15094f),
+                    )
             )
         )
     }
@@ -670,11 +699,8 @@
                     VelocityTrackingTestCase(
                         differentialDataPoints = false,
                         dataPoints = xDataPoints,
-                        expectedVelocities = listOf(
-                            ExpectedVelocity(
-                                strategy, expected2DVelocities[i].first
-                            )
-                        )
+                        expectedVelocities =
+                            listOf(ExpectedVelocity(strategy, expected2DVelocities[i].first))
                     ),
                 )
                 // Check velocity along the Y axis
@@ -682,11 +708,8 @@
                     VelocityTrackingTestCase(
                         differentialDataPoints = false,
                         dataPoints = yDataPoints,
-                        expectedVelocities = listOf(
-                            ExpectedVelocity(
-                                strategy, expected2DVelocities[i].second
-                            )
-                        )
+                        expectedVelocities =
+                            listOf(ExpectedVelocity(strategy, expected2DVelocities[i].second))
                     ),
                 )
                 xDataPoints = mutableListOf()
@@ -699,21 +722,22 @@
     @OptIn(ExperimentalComposeUiApi::class)
     @Test
     fun testsFromThe2DVelocityTrackerTest_noClamping_impulse() {
-        val expected2DVelocities = listOf(
-            Pair(118.8f, 799f),
-            Pair(214.5f, 855.8f),
-            Pair(-50.5f, 182.2f),
-            Pair(628.5f, -2127.9f),
-            Pair(120.72147f, -2970.8f),
-            Pair(537.3f, 2236.1f),
-            Pair(450.44498f, 1786.9f),
-            Pair(430.9f, -2648.1f),
-            Pair(248.4f, -2723.7f),
-            Pair(285.7f, -2929.3f),
-            Pair(322.6f, 2369.8f),
-            Pair(1024.00f, 4477.2f),
-            Pair(629.8f, 3802.5f)
-        )
+        val expected2DVelocities =
+            listOf(
+                Pair(118.8f, 799f),
+                Pair(214.5f, 855.8f),
+                Pair(-50.5f, 182.2f),
+                Pair(628.5f, -2127.9f),
+                Pair(120.72147f, -2970.8f),
+                Pair(537.3f, 2236.1f),
+                Pair(450.44498f, 1786.9f),
+                Pair(430.9f, -2648.1f),
+                Pair(248.4f, -2723.7f),
+                Pair(285.7f, -2929.3f),
+                Pair(322.6f, 2369.8f),
+                Pair(1024.00f, 4477.2f),
+                Pair(629.8f, 3802.5f)
+            )
 
         var xDataPoints: MutableList<DataPointAtTime> = mutableListOf()
         var yDataPoints: MutableList<DataPointAtTime> = mutableListOf()
@@ -731,11 +755,8 @@
                     VelocityTrackingTestCase(
                         differentialDataPoints = false,
                         dataPoints = xDataPoints,
-                        expectedVelocities = listOf(
-                            ExpectedVelocity(
-                                strategy, expected2DVelocities[i].first
-                            )
-                        )
+                        expectedVelocities =
+                            listOf(ExpectedVelocity(strategy, expected2DVelocities[i].first))
                     ),
                 )
                 // Check velocity along the Y axis
@@ -743,11 +764,8 @@
                     VelocityTrackingTestCase(
                         differentialDataPoints = false,
                         dataPoints = yDataPoints,
-                        expectedVelocities = listOf(
-                            ExpectedVelocity(
-                                strategy, expected2DVelocities[i].second
-                            )
-                        )
+                        expectedVelocities =
+                            listOf(ExpectedVelocity(strategy, expected2DVelocities[i].second))
                     ),
                 )
                 xDataPoints = mutableListOf()
@@ -760,9 +778,7 @@
     @Test
     fun calculateVelocityWithMaxValue_valueShouldBeGreaterThanZero() {
         val tracker = VelocityTracker1D()
-        assertThrows(IllegalStateException::class.java) {
-            tracker.calculateVelocity(-1f)
-        }
+        assertThrows(IllegalStateException::class.java) { tracker.calculateVelocity(-1f) }
     }
 
     @Test
@@ -781,11 +797,8 @@
                     VelocityTrackingTestCase(
                         differentialDataPoints = false,
                         dataPoints = xDataPoints,
-                        expectedVelocities = listOf(
-                            ExpectedVelocity(
-                                Strategy.Lsq2, expected2DVelocities[i].first
-                            )
-                        ),
+                        expectedVelocities =
+                            listOf(ExpectedVelocity(Strategy.Lsq2, expected2DVelocities[i].first)),
                         maximumVelocity = maximumVelocity
                     ),
                 )
@@ -794,11 +807,8 @@
                     VelocityTrackingTestCase(
                         differentialDataPoints = false,
                         dataPoints = yDataPoints,
-                        expectedVelocities = listOf(
-                            ExpectedVelocity(
-                                Strategy.Lsq2, expected2DVelocities[i].second
-                            )
-                        ),
+                        expectedVelocities =
+                            listOf(ExpectedVelocity(Strategy.Lsq2, expected2DVelocities[i].second)),
                         maximumVelocity = maximumVelocity
                     ),
                 )
@@ -811,26 +821,23 @@
 
     private fun checkTestCase(testCase: VelocityTrackingTestCase) {
         testCase.expectedVelocities.forEach { expectedVelocity ->
-            val tracker = VelocityTracker1D(
-                testCase.differentialDataPoints,
-                expectedVelocity.strategy
-            )
-            testCase.dataPoints.forEach {
-                tracker.addDataPoint(it.time, it.dataPoint)
-            }
+            val tracker =
+                VelocityTracker1D(testCase.differentialDataPoints, expectedVelocity.strategy)
+            testCase.dataPoints.forEach { tracker.addDataPoint(it.time, it.dataPoint) }
 
-            val clampedVelocity = if (expectedVelocity.velocity == 0.0f) {
-                0.0f
-            } else if (expectedVelocity.velocity > 0) {
-                expectedVelocity.velocity.coerceAtMost(testCase.maximumVelocity)
-            } else {
-                expectedVelocity.velocity.coerceAtLeast(-testCase.maximumVelocity)
-            }
+            val clampedVelocity =
+                if (expectedVelocity.velocity == 0.0f) {
+                    0.0f
+                } else if (expectedVelocity.velocity > 0) {
+                    expectedVelocity.velocity.coerceAtMost(testCase.maximumVelocity)
+                } else {
+                    expectedVelocity.velocity.coerceAtLeast(-testCase.maximumVelocity)
+                }
 
             assertWithMessage(
-                "Wrong velocity for data points: ${testCase.dataPoints}" +
-                    "\nExpected velocity: {$clampedVelocity}"
-            )
+                    "Wrong velocity for data points: ${testCase.dataPoints}" +
+                        "\nExpected velocity: {$clampedVelocity}"
+                )
                 .that(tracker.calculateVelocity(testCase.maximumVelocity))
                 .isWithin(abs(clampedVelocity) * Tolerance)
                 .of(clampedVelocity)
diff --git a/compose/ui/ui/src/androidUnitTest/kotlin/androidx/compose/ui/input/pointer/util/VelocityTrackerTest.kt b/compose/ui/ui/src/androidUnitTest/kotlin/androidx/compose/ui/input/pointer/util/VelocityTrackerTest.kt
index d0a159a..902896f 100644
--- a/compose/ui/ui/src/androidUnitTest/kotlin/androidx/compose/ui/input/pointer/util/VelocityTrackerTest.kt
+++ b/compose/ui/ui/src/androidUnitTest/kotlin/androidx/compose/ui/input/pointer/util/VelocityTrackerTest.kt
@@ -85,17 +85,9 @@
                 tracker.addPosition(it.uptime, it.position)
             } else {
                 if (VelocityTrackerStrategyUseImpulse) {
-                    checkVelocity(
-                        tracker.calculateVelocity(),
-                        629.05634f,
-                        3802.5518f
-                    )
+                    checkVelocity(tracker.calculateVelocity(), 629.05634f, 3802.5518f)
                 } else {
-                    checkVelocity(
-                        tracker.calculateVelocity(),
-                        649.48932102748f,
-                        3890.30505589076f
-                    )
+                    checkVelocity(tracker.calculateVelocity(), 649.48932102748f, 3890.30505589076f)
                 }
 
                 tracker.resetTracking()
@@ -112,20 +104,14 @@
     @Test
     fun calculateVelocity_onePosition_returnsZero() {
         val tracker = VelocityTracker()
-        tracker.addPosition(
-            velocityEventData[0].uptime,
-            velocityEventData[0].position
-        )
+        tracker.addPosition(velocityEventData[0].uptime, velocityEventData[0].position)
         assertThat(tracker.calculateVelocity()).isEqualTo(Velocity.Zero)
     }
 
     @Test
     fun resetTracking_resetsTracking() {
         val tracker = VelocityTracker()
-        tracker.addPosition(
-            velocityEventData[0].uptime,
-            velocityEventData[0].position
-        )
+        tracker.addPosition(velocityEventData[0].uptime, velocityEventData[0].position)
 
         tracker.resetTracking()
 
@@ -151,1650 +137,1613 @@
 }
 
 /**
- * This extracts the inline PxPosition to a separate function so that velocityEventData
- * creation doesn't make the function too long for dex.
+ * This extracts the inline PxPosition to a separate function so that velocityEventData creation
+ * doesn't make the function too long for dex.
  */
 private fun createPxPosition(width: Float, height: Float) = Offset(width, height)
 
-internal class PointerInputData(
-    val uptime: Long,
-    val position: Offset,
-    val down: Boolean
-)
+internal class PointerInputData(val uptime: Long, val position: Offset, val down: Boolean)
 
 // Expected velocities for "velocityEventData". See below.
 @OptIn(ExperimentalComposeUiApi::class)
-internal val expected2DVelocities = if (VelocityTrackerStrategyUseImpulse) {
+internal val expected2DVelocities =
+    if (VelocityTrackerStrategyUseImpulse) {
+        listOf(
+            Pair(118.8f, 799f),
+            Pair(214.5f, 855.8f),
+            Pair(-50.5f, 182.2f),
+            Pair(628.5f, -2127.9f),
+            Pair(120.72147f, -2970.8f),
+            Pair(537.3f, 2236.1f),
+            Pair(450.44498f, 1786.9f),
+            Pair(430.9f, -2648.1f),
+            Pair(248.4f, -2723.7f),
+            Pair(285.7f, -2929.3f),
+            Pair(322.6f, 2369.8f),
+            Pair(1024.00f, 4477.2f),
+            Pair(629.8f, 3802.5f)
+        )
+    } else {
+        listOf(
+            Pair(219.59280094228163f, 1304.701682306001f),
+            Pair(355.71046950050845f, 967.2112857054104f),
+            Pair(12.657970884022308f, -36.90447839251946f),
+            Pair(714.1399654786744f, -2561.534447931869f),
+            Pair(-19.668121066218564f, -2910.105747052462f),
+            Pair(646.8690114934209f, 2976.977762577527f),
+            Pair(396.6988447819592f, 2106.225572911095f),
+            Pair(298.31594440044495f, -3660.8315955215294f),
+            Pair(-1.7334232785165882f, -3288.13174127454f),
+            Pair(384.6361280392334f, -2645.6612524779835f),
+            Pair(176.37900397918557f, 2711.2542876273264f),
+            Pair(396.9328560260098f, 4280.651578291764f),
+            Pair(-71.51939428321249f, 3716.7385187526947f)
+        )
+    }
+
+internal val velocityEventData: List<PointerInputData> =
     listOf(
-        Pair(118.8f, 799f),
-        Pair(214.5f, 855.8f),
-        Pair(-50.5f, 182.2f),
-        Pair(628.5f, -2127.9f),
-        Pair(120.72147f, -2970.8f),
-        Pair(537.3f, 2236.1f),
-        Pair(450.44498f, 1786.9f),
-        Pair(430.9f, -2648.1f),
-        Pair(248.4f, -2723.7f),
-        Pair(285.7f, -2929.3f),
-        Pair(322.6f, 2369.8f),
-        Pair(1024.00f, 4477.2f),
-        Pair(629.8f, 3802.5f)
+        PointerInputData(
+            uptime = 216690896L,
+            down = true,
+            position = createPxPosition(270f, 538.2857055664062f)
+        ),
+        PointerInputData(
+            uptime = 216690906L,
+            down = true,
+            position = createPxPosition(270f, 538.2857055664062f)
+        ),
+        PointerInputData(
+            uptime = 216690951L,
+            down = true,
+            position = createPxPosition(270f, 530.8571166992188f)
+        ),
+        PointerInputData(
+            uptime = 216690959L,
+            down = true,
+            position = createPxPosition(270f, 526.8571166992188f)
+        ),
+        PointerInputData(
+            uptime = 216690967L,
+            down = true,
+            position = createPxPosition(270f, 521.4285888671875f)
+        ),
+        PointerInputData(
+            uptime = 216690975L,
+            down = true,
+            position = createPxPosition(270f, 515.4285888671875f)
+        ),
+        PointerInputData(
+            uptime = 216690983L,
+            down = true,
+            position = createPxPosition(270f, 506.8571472167969f)
+        ),
+        PointerInputData(
+            uptime = 216690991L,
+            down = true,
+            position = createPxPosition(268.8571472167969f, 496f)
+        ),
+        PointerInputData(
+            uptime = 216690998L,
+            down = true,
+            position = createPxPosition(267.4285583496094f, 483.1428527832031f)
+        ),
+        PointerInputData(
+            uptime = 216691006L,
+            down = true,
+            position = createPxPosition(266.28570556640625f, 469.71429443359375f)
+        ),
+        PointerInputData(
+            uptime = 216691014L,
+            down = true,
+            position = createPxPosition(265.4285583496094f, 456.8571472167969f)
+        ),
+        PointerInputData(
+            uptime = 216691021L,
+            down = true,
+            position = createPxPosition(264.28570556640625f, 443.71429443359375f)
+        ),
+        PointerInputData(
+            uptime = 216691029L,
+            down = true,
+            position = createPxPosition(264f, 431.71429443359375f)
+        ),
+        PointerInputData(
+            uptime = 216691036L,
+            down = true,
+            position = createPxPosition(263.4285583496094f, 421.1428527832031f)
+        ),
+        PointerInputData(
+            uptime = 216691044L,
+            down = true,
+            position = createPxPosition(263.4285583496094f, 412.5714416503906f)
+        ),
+        PointerInputData(
+            uptime = 216691052L,
+            down = true,
+            position = createPxPosition(263.4285583496094f, 404.5714416503906f)
+        ),
+        PointerInputData(
+            uptime = 216691060L,
+            down = true,
+            position = createPxPosition(263.4285583496094f, 396.5714416503906f)
+        ),
+        PointerInputData(
+            uptime = 216691068L,
+            down = true,
+            position = createPxPosition(264.5714416503906f, 390f)
+        ),
+        PointerInputData(
+            uptime = 216691075L,
+            down = true,
+            position = createPxPosition(265.1428527832031f, 384.8571472167969f)
+        ),
+        PointerInputData(
+            uptime = 216691083L,
+            down = true,
+            position = createPxPosition(266f, 380.28570556640625f)
+        ),
+        PointerInputData(
+            uptime = 216691091L,
+            down = true,
+            position = createPxPosition(266.5714416503906f, 376.28570556640625f)
+        ),
+        PointerInputData(
+            uptime = 216691098L,
+            down = true,
+            position = createPxPosition(267.1428527832031f, 373.1428527832031f)
+        ),
+        PointerInputData(
+            uptime = 216691106L,
+            down = true,
+            position = createPxPosition(267.71429443359375f, 370.28570556640625f)
+        ),
+        PointerInputData(
+            uptime = 216691114L,
+            down = true,
+            position = createPxPosition(268.28570556640625f, 367.71429443359375f)
+        ),
+        PointerInputData(
+            uptime = 216691121L,
+            down = true,
+            position = createPxPosition(268.5714416503906f, 366f)
+        ),
+        PointerInputData(
+            uptime = 216691130L,
+            down = true,
+            position = createPxPosition(268.8571472167969f, 364.5714416503906f)
+        ),
+        PointerInputData(
+            uptime = 216691137L,
+            down = true,
+            position = createPxPosition(269.1428527832031f, 363.71429443359375f)
+        ),
+        PointerInputData(
+            uptime = 216691145L,
+            down = true,
+            position = createPxPosition(269.1428527832031f, 362.8571472167969f)
+        ),
+        PointerInputData(
+            uptime = 216691153L,
+            down = true,
+            position = createPxPosition(269.4285583496094f, 362.8571472167969f)
+        ),
+        PointerInputData(
+            uptime = 216691168L,
+            down = true,
+            position = createPxPosition(268.5714416503906f, 365.4285583496094f)
+        ),
+        PointerInputData(
+            uptime = 216691176L,
+            down = true,
+            position = createPxPosition(267.1428527832031f, 370.28570556640625f)
+        ),
+        PointerInputData(
+            uptime = 216691183L,
+            down = true,
+            position = createPxPosition(265.4285583496094f, 376.8571472167969f)
+        ),
+        PointerInputData(
+            uptime = 216691191L,
+            down = true,
+            position = createPxPosition(263.1428527832031f, 385.71429443359375f)
+        ),
+        PointerInputData(
+            uptime = 216691199L,
+            down = true,
+            position = createPxPosition(261.4285583496094f, 396.5714416503906f)
+        ),
+        PointerInputData(
+            uptime = 216691207L,
+            down = true,
+            position = createPxPosition(259.71429443359375f, 408.5714416503906f)
+        ),
+        PointerInputData(
+            uptime = 216691215L,
+            down = true,
+            position = createPxPosition(258.28570556640625f, 419.4285583496094f)
+        ),
+        PointerInputData(
+            uptime = 216691222L,
+            down = true,
+            position = createPxPosition(257.4285583496094f, 428.5714416503906f)
+        ),
+        PointerInputData(
+            uptime = 216691230L,
+            down = true,
+            position = createPxPosition(256.28570556640625f, 436f)
+        ),
+        PointerInputData(
+            uptime = 216691238L,
+            down = true,
+            position = createPxPosition(255.7142791748047f, 442f)
+        ),
+        PointerInputData(
+            uptime = 216691245L,
+            down = true,
+            position = createPxPosition(255.14285278320312f, 447.71429443359375f)
+        ),
+        PointerInputData(
+            uptime = 216691253L,
+            down = true,
+            position = createPxPosition(254.85714721679688f, 453.1428527832031f)
+        ),
+        PointerInputData(
+            uptime = 216691261L,
+            down = true,
+            position = createPxPosition(254.57142639160156f, 458.5714416503906f)
+        ),
+        PointerInputData(
+            uptime = 216691268L,
+            down = true,
+            position = createPxPosition(254.2857208251953f, 463.71429443359375f)
+        ),
+        PointerInputData(
+            uptime = 216691276L,
+            down = true,
+            position = createPxPosition(254.2857208251953f, 470.28570556640625f)
+        ),
+        PointerInputData(
+            uptime = 216691284L,
+            down = true,
+            position = createPxPosition(254.2857208251953f, 477.71429443359375f)
+        ),
+        PointerInputData(
+            uptime = 216691292L,
+            down = true,
+            position = createPxPosition(255.7142791748047f, 487.1428527832031f)
+        ),
+        PointerInputData(
+            uptime = 216691300L,
+            down = true,
+            position = createPxPosition(256.8571472167969f, 498.5714416503906f)
+        ),
+        PointerInputData(
+            uptime = 216691307L,
+            down = true,
+            position = createPxPosition(258.28570556640625f, 507.71429443359375f)
+        ),
+        PointerInputData(
+            uptime = 216691315L,
+            down = true,
+            position = createPxPosition(259.4285583496094f, 516f)
+        ),
+        PointerInputData(
+            uptime = 216691323L,
+            down = true,
+            position = createPxPosition(260.28570556640625f, 521.7142944335938f)
+        ),
+        PointerInputData(
+            uptime = 216691338L,
+            down = false,
+            position = createPxPosition(260.28570556640625f, 521.7142944335938f)
+        ),
+        PointerInputData(
+            uptime = 216691573L,
+            down = true,
+            position = createPxPosition(266f, 327.4285583496094f)
+        ),
+        PointerInputData(
+            uptime = 216691588L,
+            down = true,
+            position = createPxPosition(266f, 327.4285583496094f)
+        ),
+        PointerInputData(
+            uptime = 216691626L,
+            down = true,
+            position = createPxPosition(261.1428527832031f, 337.1428527832031f)
+        ),
+        PointerInputData(
+            uptime = 216691634L,
+            down = true,
+            position = createPxPosition(258.28570556640625f, 343.1428527832031f)
+        ),
+        PointerInputData(
+            uptime = 216691642L,
+            down = true,
+            position = createPxPosition(254.57142639160156f, 354f)
+        ),
+        PointerInputData(
+            uptime = 216691650L,
+            down = true,
+            position = createPxPosition(250.2857208251953f, 368.28570556640625f)
+        ),
+        PointerInputData(
+            uptime = 216691657L,
+            down = true,
+            position = createPxPosition(247.42857360839844f, 382.8571472167969f)
+        ),
+        PointerInputData(
+            uptime = 216691665L,
+            down = true,
+            position = createPxPosition(245.14285278320312f, 397.4285583496094f)
+        ),
+        PointerInputData(
+            uptime = 216691673L,
+            down = true,
+            position = createPxPosition(243.14285278320312f, 411.71429443359375f)
+        ),
+        PointerInputData(
+            uptime = 216691680L,
+            down = true,
+            position = createPxPosition(242.2857208251953f, 426.28570556640625f)
+        ),
+        PointerInputData(
+            uptime = 216691688L,
+            down = true,
+            position = createPxPosition(241.7142791748047f, 440.5714416503906f)
+        ),
+        PointerInputData(
+            uptime = 216691696L,
+            down = true,
+            position = createPxPosition(241.7142791748047f, 454.5714416503906f)
+        ),
+        PointerInputData(
+            uptime = 216691703L,
+            down = true,
+            position = createPxPosition(242.57142639160156f, 467.71429443359375f)
+        ),
+        PointerInputData(
+            uptime = 216691712L,
+            down = true,
+            position = createPxPosition(243.42857360839844f, 477.4285583496094f)
+        ),
+        PointerInputData(
+            uptime = 216691720L,
+            down = true,
+            position = createPxPosition(244.85714721679688f, 485.71429443359375f)
+        ),
+        PointerInputData(
+            uptime = 216691727L,
+            down = true,
+            position = createPxPosition(246.2857208251953f, 493.1428527832031f)
+        ),
+        PointerInputData(
+            uptime = 216691735L,
+            down = true,
+            position = createPxPosition(248f, 499.71429443359375f)
+        ),
+        PointerInputData(
+            uptime = 216691750L,
+            down = false,
+            position = createPxPosition(248f, 499.71429443359375f)
+        ),
+        PointerInputData(
+            uptime = 216692255L,
+            down = true,
+            position = createPxPosition(249.42857360839844f, 351.4285583496094f)
+        ),
+        PointerInputData(
+            uptime = 216692270L,
+            down = true,
+            position = createPxPosition(249.42857360839844f, 351.4285583496094f)
+        ),
+        PointerInputData(
+            uptime = 216692309L,
+            down = true,
+            position = createPxPosition(246.2857208251953f, 361.71429443359375f)
+        ),
+        PointerInputData(
+            uptime = 216692317L,
+            down = true,
+            position = createPxPosition(244f, 368.5714416503906f)
+        ),
+        PointerInputData(
+            uptime = 216692325L,
+            down = true,
+            position = createPxPosition(241.42857360839844f, 377.71429443359375f)
+        ),
+        PointerInputData(
+            uptime = 216692333L,
+            down = true,
+            position = createPxPosition(237.7142791748047f, 391.71429443359375f)
+        ),
+        PointerInputData(
+            uptime = 216692340L,
+            down = true,
+            position = createPxPosition(235.14285278320312f, 406.5714416503906f)
+        ),
+        PointerInputData(
+            uptime = 216692348L,
+            down = true,
+            position = createPxPosition(232.57142639160156f, 421.4285583496094f)
+        ),
+        PointerInputData(
+            uptime = 216692356L,
+            down = true,
+            position = createPxPosition(230.2857208251953f, 436.5714416503906f)
+        ),
+        PointerInputData(
+            uptime = 216692363L,
+            down = true,
+            position = createPxPosition(228.2857208251953f, 451.71429443359375f)
+        ),
+        PointerInputData(
+            uptime = 216692371L,
+            down = true,
+            position = createPxPosition(227.42857360839844f, 466f)
+        ),
+        PointerInputData(
+            uptime = 216692378L,
+            down = true,
+            position = createPxPosition(226.2857208251953f, 479.71429443359375f)
+        ),
+        PointerInputData(
+            uptime = 216692387L,
+            down = true,
+            position = createPxPosition(225.7142791748047f, 491.71429443359375f)
+        ),
+        PointerInputData(
+            uptime = 216692395L,
+            down = true,
+            position = createPxPosition(225.14285278320312f, 501.71429443359375f)
+        ),
+        PointerInputData(
+            uptime = 216692402L,
+            down = true,
+            position = createPxPosition(224.85714721679688f, 509.1428527832031f)
+        ),
+        PointerInputData(
+            uptime = 216692410L,
+            down = true,
+            position = createPxPosition(224.57142639160156f, 514.8571166992188f)
+        ),
+        PointerInputData(
+            uptime = 216692418L,
+            down = true,
+            position = createPxPosition(224.2857208251953f, 519.4285888671875f)
+        ),
+        PointerInputData(
+            uptime = 216692425L,
+            down = true,
+            position = createPxPosition(224f, 523.4285888671875f)
+        ),
+        PointerInputData(
+            uptime = 216692433L,
+            down = true,
+            position = createPxPosition(224f, 527.1428833007812f)
+        ),
+        PointerInputData(
+            uptime = 216692441L,
+            down = true,
+            position = createPxPosition(224f, 530.5714111328125f)
+        ),
+        PointerInputData(
+            uptime = 216692448L,
+            down = true,
+            position = createPxPosition(224f, 533.1428833007812f)
+        ),
+        PointerInputData(
+            uptime = 216692456L,
+            down = true,
+            position = createPxPosition(224f, 535.4285888671875f)
+        ),
+        PointerInputData(
+            uptime = 216692464L,
+            down = true,
+            position = createPxPosition(223.7142791748047f, 536.8571166992188f)
+        ),
+        PointerInputData(
+            uptime = 216692472L,
+            down = true,
+            position = createPxPosition(223.7142791748047f, 538.2857055664062f)
+        ),
+        PointerInputData(
+            uptime = 216692487L,
+            down = false,
+            position = createPxPosition(223.7142791748047f, 538.2857055664062f)
+        ),
+        PointerInputData(
+            uptime = 216692678L,
+            down = true,
+            position = createPxPosition(221.42857360839844f, 526.2857055664062f)
+        ),
+        PointerInputData(
+            uptime = 216692701L,
+            down = true,
+            position = createPxPosition(220.57142639160156f, 514.8571166992188f)
+        ),
+        PointerInputData(
+            uptime = 216692708L,
+            down = true,
+            position = createPxPosition(220.2857208251953f, 508f)
+        ),
+        PointerInputData(
+            uptime = 216692716L,
+            down = true,
+            position = createPxPosition(220.2857208251953f, 498f)
+        ),
+        PointerInputData(
+            uptime = 216692724L,
+            down = true,
+            position = createPxPosition(221.14285278320312f, 484.28570556640625f)
+        ),
+        PointerInputData(
+            uptime = 216692732L,
+            down = true,
+            position = createPxPosition(221.7142791748047f, 469.4285583496094f)
+        ),
+        PointerInputData(
+            uptime = 216692740L,
+            down = true,
+            position = createPxPosition(223.42857360839844f, 453.1428527832031f)
+        ),
+        PointerInputData(
+            uptime = 216692748L,
+            down = true,
+            position = createPxPosition(225.7142791748047f, 436.28570556640625f)
+        ),
+        PointerInputData(
+            uptime = 216692755L,
+            down = true,
+            position = createPxPosition(229.14285278320312f, 418.28570556640625f)
+        ),
+        PointerInputData(
+            uptime = 216692763L,
+            down = true,
+            position = createPxPosition(232.85714721679688f, 400.28570556640625f)
+        ),
+        PointerInputData(
+            uptime = 216692770L,
+            down = true,
+            position = createPxPosition(236.85714721679688f, 382.5714416503906f)
+        ),
+        PointerInputData(
+            uptime = 216692778L,
+            down = true,
+            position = createPxPosition(241.14285278320312f, 366f)
+        ),
+        PointerInputData(
+            uptime = 216692786L,
+            down = true,
+            position = createPxPosition(244.85714721679688f, 350.28570556640625f)
+        ),
+        PointerInputData(
+            uptime = 216692793L,
+            down = true,
+            position = createPxPosition(249.14285278320312f, 335.4285583496094f)
+        ),
+        PointerInputData(
+            uptime = 216692809L,
+            down = false,
+            position = createPxPosition(249.14285278320312f, 335.4285583496094f)
+        ),
+        PointerInputData(
+            uptime = 216693222L,
+            down = true,
+            position = createPxPosition(224f, 545.4285888671875f)
+        ),
+        PointerInputData(
+            uptime = 216693245L,
+            down = true,
+            position = createPxPosition(224f, 545.4285888671875f)
+        ),
+        PointerInputData(
+            uptime = 216693275L,
+            down = true,
+            position = createPxPosition(222.85714721679688f, 535.1428833007812f)
+        ),
+        PointerInputData(
+            uptime = 216693284L,
+            down = true,
+            position = createPxPosition(222.85714721679688f, 528.8571166992188f)
+        ),
+        PointerInputData(
+            uptime = 216693291L,
+            down = true,
+            position = createPxPosition(222.2857208251953f, 518.5714111328125f)
+        ),
+        PointerInputData(
+            uptime = 216693299L,
+            down = true,
+            position = createPxPosition(222f, 503.4285583496094f)
+        ),
+        PointerInputData(
+            uptime = 216693307L,
+            down = true,
+            position = createPxPosition(222f, 485.4285583496094f)
+        ),
+        PointerInputData(
+            uptime = 216693314L,
+            down = true,
+            position = createPxPosition(221.7142791748047f, 464f)
+        ),
+        PointerInputData(
+            uptime = 216693322L,
+            down = true,
+            position = createPxPosition(222.2857208251953f, 440.28570556640625f)
+        ),
+        PointerInputData(
+            uptime = 216693337L,
+            down = false,
+            position = createPxPosition(222.2857208251953f, 440.28570556640625f)
+        ),
+        PointerInputData(uptime = 216693985L, down = true, position = createPxPosition(208f, 544f)),
+        PointerInputData(
+            uptime = 216694047L,
+            down = true,
+            position = createPxPosition(208.57142639160156f, 532.2857055664062f)
+        ),
+        PointerInputData(
+            uptime = 216694054L,
+            down = true,
+            position = createPxPosition(208.85714721679688f, 525.7142944335938f)
+        ),
+        PointerInputData(
+            uptime = 216694062L,
+            down = true,
+            position = createPxPosition(208.85714721679688f, 515.1428833007812f)
+        ),
+        PointerInputData(
+            uptime = 216694070L,
+            down = true,
+            position = createPxPosition(208f, 501.4285583496094f)
+        ),
+        PointerInputData(
+            uptime = 216694077L,
+            down = true,
+            position = createPxPosition(207.42857360839844f, 487.1428527832031f)
+        ),
+        PointerInputData(
+            uptime = 216694085L,
+            down = true,
+            position = createPxPosition(206.57142639160156f, 472.8571472167969f)
+        ),
+        PointerInputData(
+            uptime = 216694092L,
+            down = true,
+            position = createPxPosition(206.57142639160156f, 458.8571472167969f)
+        ),
+        PointerInputData(
+            uptime = 216694100L,
+            down = true,
+            position = createPxPosition(206.57142639160156f, 446f)
+        ),
+        PointerInputData(
+            uptime = 216694108L,
+            down = true,
+            position = createPxPosition(206.57142639160156f, 434.28570556640625f)
+        ),
+        PointerInputData(
+            uptime = 216694116L,
+            down = true,
+            position = createPxPosition(207.14285278320312f, 423.71429443359375f)
+        ),
+        PointerInputData(
+            uptime = 216694124L,
+            down = true,
+            position = createPxPosition(208.57142639160156f, 412.8571472167969f)
+        ),
+        PointerInputData(
+            uptime = 216694131L,
+            down = true,
+            position = createPxPosition(209.7142791748047f, 402.28570556640625f)
+        ),
+        PointerInputData(
+            uptime = 216694139L,
+            down = true,
+            position = createPxPosition(211.7142791748047f, 393.1428527832031f)
+        ),
+        PointerInputData(
+            uptime = 216694147L,
+            down = true,
+            position = createPxPosition(213.42857360839844f, 385.1428527832031f)
+        ),
+        PointerInputData(
+            uptime = 216694154L,
+            down = true,
+            position = createPxPosition(215.42857360839844f, 378.28570556640625f)
+        ),
+        PointerInputData(
+            uptime = 216694162L,
+            down = true,
+            position = createPxPosition(217.42857360839844f, 371.71429443359375f)
+        ),
+        PointerInputData(
+            uptime = 216694169L,
+            down = true,
+            position = createPxPosition(219.42857360839844f, 366f)
+        ),
+        PointerInputData(
+            uptime = 216694177L,
+            down = true,
+            position = createPxPosition(221.42857360839844f, 360.8571472167969f)
+        ),
+        PointerInputData(
+            uptime = 216694185L,
+            down = true,
+            position = createPxPosition(223.42857360839844f, 356.5714416503906f)
+        ),
+        PointerInputData(
+            uptime = 216694193L,
+            down = true,
+            position = createPxPosition(225.14285278320312f, 352.28570556640625f)
+        ),
+        PointerInputData(
+            uptime = 216694201L,
+            down = true,
+            position = createPxPosition(226.85714721679688f, 348.5714416503906f)
+        ),
+        PointerInputData(
+            uptime = 216694209L,
+            down = true,
+            position = createPxPosition(228.2857208251953f, 346f)
+        ),
+        PointerInputData(
+            uptime = 216694216L,
+            down = true,
+            position = createPxPosition(229.14285278320312f, 343.71429443359375f)
+        ),
+        PointerInputData(uptime = 216694224L, down = true, position = createPxPosition(230f, 342f)),
+        PointerInputData(
+            uptime = 216694232L,
+            down = true,
+            position = createPxPosition(230.57142639160156f, 340.5714416503906f)
+        ),
+        PointerInputData(
+            uptime = 216694239L,
+            down = true,
+            position = createPxPosition(230.85714721679688f, 339.71429443359375f)
+        ),
+        PointerInputData(
+            uptime = 216694247L,
+            down = true,
+            position = createPxPosition(230.85714721679688f, 339.4285583496094f)
+        ),
+        PointerInputData(
+            uptime = 216694262L,
+            down = true,
+            position = createPxPosition(230.2857208251953f, 342f)
+        ),
+        PointerInputData(
+            uptime = 216694270L,
+            down = true,
+            position = createPxPosition(228.85714721679688f, 346.28570556640625f)
+        ),
+        PointerInputData(
+            uptime = 216694278L,
+            down = true,
+            position = createPxPosition(227.14285278320312f, 352.5714416503906f)
+        ),
+        PointerInputData(
+            uptime = 216694286L,
+            down = true,
+            position = createPxPosition(225.42857360839844f, 359.4285583496094f)
+        ),
+        PointerInputData(
+            uptime = 216694294L,
+            down = true,
+            position = createPxPosition(223.7142791748047f, 367.71429443359375f)
+        ),
+        PointerInputData(
+            uptime = 216694301L,
+            down = true,
+            position = createPxPosition(222.57142639160156f, 376f)
+        ),
+        PointerInputData(
+            uptime = 216694309L,
+            down = true,
+            position = createPxPosition(221.42857360839844f, 384.28570556640625f)
+        ),
+        PointerInputData(
+            uptime = 216694317L,
+            down = true,
+            position = createPxPosition(220.85714721679688f, 392.28570556640625f)
+        ),
+        PointerInputData(
+            uptime = 216694324L,
+            down = true,
+            position = createPxPosition(220f, 400.5714416503906f)
+        ),
+        PointerInputData(
+            uptime = 216694332L,
+            down = true,
+            position = createPxPosition(219.14285278320312f, 409.71429443359375f)
+        ),
+        PointerInputData(
+            uptime = 216694339L,
+            down = true,
+            position = createPxPosition(218.85714721679688f, 419.1428527832031f)
+        ),
+        PointerInputData(
+            uptime = 216694348L,
+            down = true,
+            position = createPxPosition(218.2857208251953f, 428.8571472167969f)
+        ),
+        PointerInputData(
+            uptime = 216694356L,
+            down = true,
+            position = createPxPosition(218.2857208251953f, 438.8571472167969f)
+        ),
+        PointerInputData(
+            uptime = 216694363L,
+            down = true,
+            position = createPxPosition(218.2857208251953f, 447.71429443359375f)
+        ),
+        PointerInputData(
+            uptime = 216694371L,
+            down = true,
+            position = createPxPosition(218.2857208251953f, 455.71429443359375f)
+        ),
+        PointerInputData(
+            uptime = 216694379L,
+            down = true,
+            position = createPxPosition(219.14285278320312f, 462.8571472167969f)
+        ),
+        PointerInputData(
+            uptime = 216694386L,
+            down = true,
+            position = createPxPosition(220f, 469.4285583496094f)
+        ),
+        PointerInputData(
+            uptime = 216694394L,
+            down = true,
+            position = createPxPosition(221.14285278320312f, 475.4285583496094f)
+        ),
+        PointerInputData(
+            uptime = 216694401L,
+            down = true,
+            position = createPxPosition(222f, 480.5714416503906f)
+        ),
+        PointerInputData(
+            uptime = 216694409L,
+            down = true,
+            position = createPxPosition(222.85714721679688f, 485.4285583496094f)
+        ),
+        PointerInputData(
+            uptime = 216694417L,
+            down = true,
+            position = createPxPosition(224f, 489.71429443359375f)
+        ),
+        PointerInputData(
+            uptime = 216694425L,
+            down = true,
+            position = createPxPosition(224.85714721679688f, 492.8571472167969f)
+        ),
+        PointerInputData(
+            uptime = 216694433L,
+            down = true,
+            position = createPxPosition(225.42857360839844f, 495.4285583496094f)
+        ),
+        PointerInputData(
+            uptime = 216694440L,
+            down = true,
+            position = createPxPosition(226f, 497.1428527832031f)
+        ),
+        PointerInputData(
+            uptime = 216694448L,
+            down = true,
+            position = createPxPosition(226.2857208251953f, 498.28570556640625f)
+        ),
+        PointerInputData(
+            uptime = 216694456L,
+            down = true,
+            position = createPxPosition(226.2857208251953f, 498.8571472167969f)
+        ),
+        PointerInputData(
+            uptime = 216694471L,
+            down = true,
+            position = createPxPosition(226.2857208251953f, 498.28570556640625f)
+        ),
+        PointerInputData(
+            uptime = 216694479L,
+            down = true,
+            position = createPxPosition(226.2857208251953f, 496.5714416503906f)
+        ),
+        PointerInputData(
+            uptime = 216694486L,
+            down = true,
+            position = createPxPosition(226.2857208251953f, 493.71429443359375f)
+        ),
+        PointerInputData(
+            uptime = 216694494L,
+            down = true,
+            position = createPxPosition(226.2857208251953f, 490f)
+        ),
+        PointerInputData(
+            uptime = 216694502L,
+            down = true,
+            position = createPxPosition(226.2857208251953f, 486f)
+        ),
+        PointerInputData(
+            uptime = 216694510L,
+            down = true,
+            position = createPxPosition(226.2857208251953f, 480.5714416503906f)
+        ),
+        PointerInputData(
+            uptime = 216694518L,
+            down = true,
+            position = createPxPosition(226.2857208251953f, 475.71429443359375f)
+        ),
+        PointerInputData(
+            uptime = 216694525L,
+            down = true,
+            position = createPxPosition(226.2857208251953f, 468.8571472167969f)
+        ),
+        PointerInputData(
+            uptime = 216694533L,
+            down = true,
+            position = createPxPosition(226.2857208251953f, 461.4285583496094f)
+        ),
+        PointerInputData(
+            uptime = 216694541L,
+            down = true,
+            position = createPxPosition(226.2857208251953f, 452.5714416503906f)
+        ),
+        PointerInputData(
+            uptime = 216694548L,
+            down = true,
+            position = createPxPosition(226.57142639160156f, 442.28570556640625f)
+        ),
+        PointerInputData(
+            uptime = 216694556L,
+            down = true,
+            position = createPxPosition(226.57142639160156f, 432.28570556640625f)
+        ),
+        PointerInputData(
+            uptime = 216694564L,
+            down = true,
+            position = createPxPosition(226.85714721679688f, 423.4285583496094f)
+        ),
+        PointerInputData(
+            uptime = 216694571L,
+            down = true,
+            position = createPxPosition(227.42857360839844f, 416f)
+        ),
+        PointerInputData(
+            uptime = 216694580L,
+            down = true,
+            position = createPxPosition(227.7142791748047f, 410f)
+        ),
+        PointerInputData(
+            uptime = 216694587L,
+            down = true,
+            position = createPxPosition(228.2857208251953f, 404.28570556640625f)
+        ),
+        PointerInputData(
+            uptime = 216694595L,
+            down = true,
+            position = createPxPosition(228.85714721679688f, 399.71429443359375f)
+        ),
+        PointerInputData(
+            uptime = 216694603L,
+            down = true,
+            position = createPxPosition(229.14285278320312f, 395.4285583496094f)
+        ),
+        PointerInputData(
+            uptime = 216694610L,
+            down = true,
+            position = createPxPosition(229.42857360839844f, 392.28570556640625f)
+        ),
+        PointerInputData(
+            uptime = 216694618L,
+            down = true,
+            position = createPxPosition(229.7142791748047f, 390f)
+        ),
+        PointerInputData(
+            uptime = 216694625L,
+            down = true,
+            position = createPxPosition(229.7142791748047f, 388f)
+        ),
+        PointerInputData(
+            uptime = 216694633L,
+            down = true,
+            position = createPxPosition(229.7142791748047f, 386.8571472167969f)
+        ),
+        PointerInputData(
+            uptime = 216694641L,
+            down = true,
+            position = createPxPosition(229.7142791748047f, 386.28570556640625f)
+        ),
+        PointerInputData(
+            uptime = 216694648L,
+            down = true,
+            position = createPxPosition(229.7142791748047f, 386f)
+        ),
+        PointerInputData(
+            uptime = 216694657L,
+            down = true,
+            position = createPxPosition(228.85714721679688f, 386f)
+        ),
+        PointerInputData(uptime = 216694665L, down = true, position = createPxPosition(228f, 388f)),
+        PointerInputData(
+            uptime = 216694672L,
+            down = true,
+            position = createPxPosition(226f, 392.5714416503906f)
+        ),
+        PointerInputData(
+            uptime = 216694680L,
+            down = true,
+            position = createPxPosition(224f, 397.71429443359375f)
+        ),
+        PointerInputData(
+            uptime = 216694688L,
+            down = true,
+            position = createPxPosition(222f, 404.28570556640625f)
+        ),
+        PointerInputData(
+            uptime = 216694695L,
+            down = true,
+            position = createPxPosition(219.7142791748047f, 411.1428527832031f)
+        ),
+        PointerInputData(
+            uptime = 216694703L,
+            down = true,
+            position = createPxPosition(218.2857208251953f, 418f)
+        ),
+        PointerInputData(
+            uptime = 216694710L,
+            down = true,
+            position = createPxPosition(217.14285278320312f, 425.4285583496094f)
+        ),
+        PointerInputData(
+            uptime = 216694718L,
+            down = true,
+            position = createPxPosition(215.7142791748047f, 433.4285583496094f)
+        ),
+        PointerInputData(
+            uptime = 216694726L,
+            down = true,
+            position = createPxPosition(214.85714721679688f, 442.28570556640625f)
+        ),
+        PointerInputData(uptime = 216694734L, down = true, position = createPxPosition(214f, 454f)),
+        PointerInputData(
+            uptime = 216694742L,
+            down = true,
+            position = createPxPosition(214f, 469.4285583496094f)
+        ),
+        PointerInputData(
+            uptime = 216694749L,
+            down = true,
+            position = createPxPosition(215.42857360839844f, 485.4285583496094f)
+        ),
+        PointerInputData(
+            uptime = 216694757L,
+            down = true,
+            position = createPxPosition(217.7142791748047f, 502.8571472167969f)
+        ),
+        PointerInputData(
+            uptime = 216694765L,
+            down = true,
+            position = createPxPosition(221.14285278320312f, 521.4285888671875f)
+        ),
+        PointerInputData(
+            uptime = 216694772L,
+            down = true,
+            position = createPxPosition(224.57142639160156f, 541.1428833007812f)
+        ),
+        PointerInputData(
+            uptime = 216694780L,
+            down = true,
+            position = createPxPosition(229.14285278320312f, 561.1428833007812f)
+        ),
+        PointerInputData(
+            uptime = 216694788L,
+            down = true,
+            position = createPxPosition(233.42857360839844f, 578.8571166992188f)
+        ),
+        PointerInputData(
+            uptime = 216694802L,
+            down = false,
+            position = createPxPosition(233.42857360839844f, 578.8571166992188f)
+        ),
+        PointerInputData(
+            uptime = 216695344L,
+            down = true,
+            position = createPxPosition(253.42857360839844f, 310.5714416503906f)
+        ),
+        PointerInputData(
+            uptime = 216695352L,
+            down = true,
+            position = createPxPosition(253.42857360839844f, 310.5714416503906f)
+        ),
+        PointerInputData(
+            uptime = 216695359L,
+            down = true,
+            position = createPxPosition(252.85714721679688f, 318f)
+        ),
+        PointerInputData(
+            uptime = 216695367L,
+            down = true,
+            position = createPxPosition(251.14285278320312f, 322f)
+        ),
+        PointerInputData(
+            uptime = 216695375L,
+            down = true,
+            position = createPxPosition(248.85714721679688f, 327.1428527832031f)
+        ),
+        PointerInputData(
+            uptime = 216695382L,
+            down = true,
+            position = createPxPosition(246f, 334.8571472167969f)
+        ),
+        PointerInputData(
+            uptime = 216695390L,
+            down = true,
+            position = createPxPosition(242.57142639160156f, 344.5714416503906f)
+        ),
+        PointerInputData(
+            uptime = 216695397L,
+            down = true,
+            position = createPxPosition(238.85714721679688f, 357.4285583496094f)
+        ),
+        PointerInputData(
+            uptime = 216695406L,
+            down = true,
+            position = createPxPosition(235.7142791748047f, 371.71429443359375f)
+        ),
+        PointerInputData(
+            uptime = 216695414L,
+            down = true,
+            position = createPxPosition(232.2857208251953f, 386.8571472167969f)
+        ),
+        PointerInputData(
+            uptime = 216695421L,
+            down = true,
+            position = createPxPosition(229.42857360839844f, 402f)
+        ),
+        PointerInputData(
+            uptime = 216695429L,
+            down = true,
+            position = createPxPosition(227.42857360839844f, 416.8571472167969f)
+        ),
+        PointerInputData(
+            uptime = 216695437L,
+            down = true,
+            position = createPxPosition(226.2857208251953f, 431.4285583496094f)
+        ),
+        PointerInputData(
+            uptime = 216695444L,
+            down = true,
+            position = createPxPosition(226.2857208251953f, 446f)
+        ),
+        PointerInputData(
+            uptime = 216695452L,
+            down = true,
+            position = createPxPosition(227.7142791748047f, 460.28570556640625f)
+        ),
+        PointerInputData(
+            uptime = 216695459L,
+            down = true,
+            position = createPxPosition(230f, 475.1428527832031f)
+        ),
+        PointerInputData(
+            uptime = 216695467L,
+            down = true,
+            position = createPxPosition(232.2857208251953f, 489.71429443359375f)
+        ),
+        PointerInputData(
+            uptime = 216695475L,
+            down = true,
+            position = createPxPosition(235.7142791748047f, 504f)
+        ),
+        PointerInputData(
+            uptime = 216695490L,
+            down = false,
+            position = createPxPosition(235.7142791748047f, 504f)
+        ),
+        PointerInputData(
+            uptime = 216695885L,
+            down = true,
+            position = createPxPosition(238.85714721679688f, 524f)
+        ),
+        PointerInputData(
+            uptime = 216695908L,
+            down = true,
+            position = createPxPosition(236.2857208251953f, 515.7142944335938f)
+        ),
+        PointerInputData(
+            uptime = 216695916L,
+            down = true,
+            position = createPxPosition(234.85714721679688f, 509.1428527832031f)
+        ),
+        PointerInputData(
+            uptime = 216695924L,
+            down = true,
+            position = createPxPosition(232.57142639160156f, 498.5714416503906f)
+        ),
+        PointerInputData(
+            uptime = 216695931L,
+            down = true,
+            position = createPxPosition(230.57142639160156f, 483.71429443359375f)
+        ),
+        PointerInputData(
+            uptime = 216695939L,
+            down = true,
+            position = createPxPosition(229.14285278320312f, 466.5714416503906f)
+        ),
+        PointerInputData(
+            uptime = 216695947L,
+            down = true,
+            position = createPxPosition(229.14285278320312f, 446.5714416503906f)
+        ),
+        PointerInputData(
+            uptime = 216695955L,
+            down = true,
+            position = createPxPosition(230.57142639160156f, 424.8571472167969f)
+        ),
+        PointerInputData(
+            uptime = 216695963L,
+            down = true,
+            position = createPxPosition(232.57142639160156f, 402.28570556640625f)
+        ),
+        PointerInputData(
+            uptime = 216695970L,
+            down = true,
+            position = createPxPosition(235.14285278320312f, 380f)
+        ),
+        PointerInputData(
+            uptime = 216695978L,
+            down = true,
+            position = createPxPosition(238.57142639160156f, 359.4285583496094f)
+        ),
+        PointerInputData(
+            uptime = 216695993L,
+            down = false,
+            position = createPxPosition(238.57142639160156f, 359.4285583496094f)
+        ),
+        PointerInputData(
+            uptime = 216696429L,
+            down = true,
+            position = createPxPosition(238.2857208251953f, 568.5714111328125f)
+        ),
+        PointerInputData(uptime = 216696459L, down = true, position = createPxPosition(234f, 560f)),
+        PointerInputData(
+            uptime = 216696467L,
+            down = true,
+            position = createPxPosition(231.42857360839844f, 553.1428833007812f)
+        ),
+        PointerInputData(
+            uptime = 216696475L,
+            down = true,
+            position = createPxPosition(228.2857208251953f, 543.1428833007812f)
+        ),
+        PointerInputData(
+            uptime = 216696483L,
+            down = true,
+            position = createPxPosition(225.42857360839844f, 528.8571166992188f)
+        ),
+        PointerInputData(
+            uptime = 216696491L,
+            down = true,
+            position = createPxPosition(223.14285278320312f, 512.2857055664062f)
+        ),
+        PointerInputData(
+            uptime = 216696498L,
+            down = true,
+            position = createPxPosition(222f, 495.4285583496094f)
+        ),
+        PointerInputData(
+            uptime = 216696506L,
+            down = true,
+            position = createPxPosition(221.7142791748047f, 477.4285583496094f)
+        ),
+        PointerInputData(
+            uptime = 216696514L,
+            down = true,
+            position = createPxPosition(221.7142791748047f, 458.28570556640625f)
+        ),
+        PointerInputData(
+            uptime = 216696521L,
+            down = true,
+            position = createPxPosition(223.14285278320312f, 438f)
+        ),
+        PointerInputData(
+            uptime = 216696529L,
+            down = true,
+            position = createPxPosition(224.2857208251953f, 416.28570556640625f)
+        ),
+        PointerInputData(
+            uptime = 216696544L,
+            down = false,
+            position = createPxPosition(224.2857208251953f, 416.28570556640625f)
+        ),
+        PointerInputData(
+            uptime = 216696974L,
+            down = true,
+            position = createPxPosition(218.57142639160156f, 530.5714111328125f)
+        ),
+        PointerInputData(
+            uptime = 216697012L,
+            down = true,
+            position = createPxPosition(220.2857208251953f, 522f)
+        ),
+        PointerInputData(
+            uptime = 216697020L,
+            down = true,
+            position = createPxPosition(221.14285278320312f, 517.7142944335938f)
+        ),
+        PointerInputData(
+            uptime = 216697028L,
+            down = true,
+            position = createPxPosition(222.2857208251953f, 511.71429443359375f)
+        ),
+        PointerInputData(
+            uptime = 216697036L,
+            down = true,
+            position = createPxPosition(224f, 504.28570556640625f)
+        ),
+        PointerInputData(
+            uptime = 216697044L,
+            down = true,
+            position = createPxPosition(227.14285278320312f, 490.5714416503906f)
+        ),
+        PointerInputData(
+            uptime = 216697052L,
+            down = true,
+            position = createPxPosition(229.42857360839844f, 474f)
+        ),
+        PointerInputData(
+            uptime = 216697059L,
+            down = true,
+            position = createPxPosition(231.42857360839844f, 454.5714416503906f)
+        ),
+        PointerInputData(
+            uptime = 216697067L,
+            down = true,
+            position = createPxPosition(233.7142791748047f, 431.1428527832031f)
+        ),
+        PointerInputData(
+            uptime = 216697082L,
+            down = false,
+            position = createPxPosition(233.7142791748047f, 431.1428527832031f)
+        ),
+        PointerInputData(
+            uptime = 216697435L,
+            down = true,
+            position = createPxPosition(257.1428527832031f, 285.1428527832031f)
+        ),
+        PointerInputData(
+            uptime = 216697465L,
+            down = true,
+            position = createPxPosition(251.7142791748047f, 296.8571472167969f)
+        ),
+        PointerInputData(
+            uptime = 216697473L,
+            down = true,
+            position = createPxPosition(248.2857208251953f, 304f)
+        ),
+        PointerInputData(
+            uptime = 216697481L,
+            down = true,
+            position = createPxPosition(244.57142639160156f, 314.8571472167969f)
+        ),
+        PointerInputData(
+            uptime = 216697489L,
+            down = true,
+            position = createPxPosition(240.2857208251953f, 329.1428527832031f)
+        ),
+        PointerInputData(
+            uptime = 216697497L,
+            down = true,
+            position = createPxPosition(236.85714721679688f, 345.1428527832031f)
+        ),
+        PointerInputData(
+            uptime = 216697505L,
+            down = true,
+            position = createPxPosition(233.7142791748047f, 361.4285583496094f)
+        ),
+        PointerInputData(
+            uptime = 216697512L,
+            down = true,
+            position = createPxPosition(231.14285278320312f, 378.28570556640625f)
+        ),
+        PointerInputData(
+            uptime = 216697520L,
+            down = true,
+            position = createPxPosition(229.42857360839844f, 395.4285583496094f)
+        ),
+        PointerInputData(
+            uptime = 216697528L,
+            down = true,
+            position = createPxPosition(229.42857360839844f, 412.8571472167969f)
+        ),
+        PointerInputData(
+            uptime = 216697535L,
+            down = true,
+            position = createPxPosition(230.85714721679688f, 430.8571472167969f)
+        ),
+        PointerInputData(
+            uptime = 216697543L,
+            down = true,
+            position = createPxPosition(233.42857360839844f, 449.71429443359375f)
+        ),
+        PointerInputData(
+            uptime = 216697558L,
+            down = false,
+            position = createPxPosition(233.42857360839844f, 449.71429443359375f)
+        ),
+        PointerInputData(
+            uptime = 216697749L,
+            down = true,
+            position = createPxPosition(246f, 311.4285583496094f)
+        ),
+        PointerInputData(
+            uptime = 216697780L,
+            down = true,
+            position = createPxPosition(244.57142639160156f, 318.28570556640625f)
+        ),
+        PointerInputData(
+            uptime = 216697787L,
+            down = true,
+            position = createPxPosition(243.14285278320312f, 325.4285583496094f)
+        ),
+        PointerInputData(
+            uptime = 216697795L,
+            down = true,
+            position = createPxPosition(241.42857360839844f, 336f)
+        ),
+        PointerInputData(
+            uptime = 216697803L,
+            down = true,
+            position = createPxPosition(239.7142791748047f, 351.1428527832031f)
+        ),
+        PointerInputData(
+            uptime = 216697811L,
+            down = true,
+            position = createPxPosition(238.2857208251953f, 368.5714416503906f)
+        ),
+        PointerInputData(
+            uptime = 216697819L,
+            down = true,
+            position = createPxPosition(238f, 389.4285583496094f)
+        ),
+        PointerInputData(
+            uptime = 216697826L,
+            down = true,
+            position = createPxPosition(239.14285278320312f, 412f)
+        ),
+        PointerInputData(
+            uptime = 216697834L,
+            down = true,
+            position = createPxPosition(242.2857208251953f, 438f)
+        ),
+        PointerInputData(
+            uptime = 216697842L,
+            down = true,
+            position = createPxPosition(247.42857360839844f, 466.8571472167969f)
+        ),
+        PointerInputData(
+            uptime = 216697849L,
+            down = true,
+            position = createPxPosition(254.2857208251953f, 497.71429443359375f)
+        ),
+        PointerInputData(
+            uptime = 216697864L,
+            down = false,
+            position = createPxPosition(254.2857208251953f, 497.71429443359375f)
+        ),
+        PointerInputData(uptime = 216698321L, down = true, position = createPxPosition(250f, 306f)),
+        PointerInputData(uptime = 216698328L, down = true, position = createPxPosition(250f, 306f)),
+        PointerInputData(
+            uptime = 216698344L,
+            down = true,
+            position = createPxPosition(249.14285278320312f, 314f)
+        ),
+        PointerInputData(
+            uptime = 216698351L,
+            down = true,
+            position = createPxPosition(247.42857360839844f, 319.4285583496094f)
+        ),
+        PointerInputData(
+            uptime = 216698359L,
+            down = true,
+            position = createPxPosition(245.14285278320312f, 326.8571472167969f)
+        ),
+        PointerInputData(
+            uptime = 216698366L,
+            down = true,
+            position = createPxPosition(241.7142791748047f, 339.4285583496094f)
+        ),
+        PointerInputData(
+            uptime = 216698374L,
+            down = true,
+            position = createPxPosition(238.57142639160156f, 355.71429443359375f)
+        ),
+        PointerInputData(
+            uptime = 216698382L,
+            down = true,
+            position = createPxPosition(236.2857208251953f, 374.28570556640625f)
+        ),
+        PointerInputData(
+            uptime = 216698390L,
+            down = true,
+            position = createPxPosition(235.14285278320312f, 396.5714416503906f)
+        ),
+        PointerInputData(
+            uptime = 216698398L,
+            down = true,
+            position = createPxPosition(236.57142639160156f, 421.4285583496094f)
+        ),
+        PointerInputData(
+            uptime = 216698406L,
+            down = true,
+            position = createPxPosition(241.14285278320312f, 451.4285583496094f)
+        ),
+        PointerInputData(
+            uptime = 216698421L,
+            down = false,
+            position = createPxPosition(241.14285278320312f, 451.4285583496094f)
+        )
     )
-} else {
+
+internal val interruptedVelocityEventData: List<PointerInputData> =
     listOf(
-        Pair(219.59280094228163f, 1304.701682306001f),
-        Pair(355.71046950050845f, 967.2112857054104f),
-        Pair(12.657970884022308f, -36.90447839251946f),
-        Pair(714.1399654786744f, -2561.534447931869f),
-        Pair(-19.668121066218564f, -2910.105747052462f),
-        Pair(646.8690114934209f, 2976.977762577527f),
-        Pair(396.6988447819592f, 2106.225572911095f),
-        Pair(298.31594440044495f, -3660.8315955215294f),
-        Pair(-1.7334232785165882f, -3288.13174127454f),
-        Pair(384.6361280392334f, -2645.6612524779835f),
-        Pair(176.37900397918557f, 2711.2542876273264f),
-        Pair(396.9328560260098f, 4280.651578291764f),
-        Pair(-71.51939428321249f, 3716.7385187526947f)
+        PointerInputData(uptime = 216698321L, down = true, position = createPxPosition(250f, 306f)),
+        PointerInputData(uptime = 216698328L, down = true, position = createPxPosition(250f, 306f)),
+        PointerInputData(
+            uptime = 216698344L,
+            down = true,
+            position = createPxPosition(249.14285278320312f, 314f)
+        ),
+        PointerInputData(
+            uptime = 216698351L,
+            down = true,
+            position = createPxPosition(247.42857360839844f, 319.4285583496094f)
+        ),
+        PointerInputData(
+            uptime = 216698359L,
+            down = true,
+            position = createPxPosition(245.14285278320312f, 326.8571472167969f)
+        ),
+        PointerInputData(
+            uptime = 216698366L,
+            down = true,
+            position = createPxPosition(241.7142791748047f, 339.4285583496094f)
+        ),
+
+        // The pointer "stops" here because we've introduced a 40+ms gap
+        // in the move event stream. See kAssumePointerMoveStoppedMilliseconds
+        // in velocity_tracker.dart.
+
+        PointerInputData(
+            uptime = (216698374L + 40),
+            down = true,
+            position = createPxPosition(238.57142639160156f, 355.71429443359375f)
+        ),
+        PointerInputData(
+            uptime = (216698382L + 40),
+            down = true,
+            position = createPxPosition(236.2857208251953f, 374.28570556640625f)
+        ),
+        PointerInputData(
+            uptime = (216698390L + 40),
+            down = true,
+            position = createPxPosition(235.14285278320312f, 396.5714416503906f)
+        ),
+        PointerInputData(
+            uptime = (216698398L + 40),
+            down = true,
+            position = createPxPosition(236.57142639160156f, 421.4285583496094f)
+        ),
+        PointerInputData(
+            uptime = (216698406L + 40),
+            down = true,
+            position = createPxPosition(241.14285278320312f, 451.4285583496094f)
+        ),
+        PointerInputData(
+            uptime = (216698421L + 40),
+            down = false,
+            position = createPxPosition(241.14285278320312f, 451.4285583496094f)
+        )
     )
-}
-
-internal val velocityEventData: List<PointerInputData> = listOf(
-    PointerInputData(
-        uptime = 216690896L,
-        down = true,
-        position = createPxPosition(270f, 538.2857055664062f)
-    ),
-    PointerInputData(
-        uptime = 216690906L,
-        down = true,
-        position = createPxPosition(270f, 538.2857055664062f)
-    ),
-    PointerInputData(
-        uptime = 216690951L,
-        down = true,
-        position = createPxPosition(270f, 530.8571166992188f)
-    ),
-    PointerInputData(
-        uptime = 216690959L,
-        down = true,
-        position = createPxPosition(270f, 526.8571166992188f)
-    ),
-    PointerInputData(
-        uptime = 216690967L,
-        down = true,
-        position = createPxPosition(270f, 521.4285888671875f)
-    ),
-    PointerInputData(
-        uptime = 216690975L,
-        down = true,
-        position = createPxPosition(270f, 515.4285888671875f)
-    ),
-    PointerInputData(
-        uptime = 216690983L,
-        down = true,
-        position = createPxPosition(270f, 506.8571472167969f)
-    ),
-    PointerInputData(
-        uptime = 216690991L,
-        down = true,
-        position = createPxPosition(268.8571472167969f, 496f)
-    ),
-    PointerInputData(
-        uptime = 216690998L,
-        down = true,
-        position = createPxPosition(267.4285583496094f, 483.1428527832031f)
-    ),
-    PointerInputData(
-        uptime = 216691006L,
-        down = true,
-        position = createPxPosition(266.28570556640625f, 469.71429443359375f)
-    ),
-    PointerInputData(
-        uptime = 216691014L,
-        down = true,
-        position = createPxPosition(265.4285583496094f, 456.8571472167969f)
-    ),
-    PointerInputData(
-        uptime = 216691021L,
-        down = true,
-        position = createPxPosition(264.28570556640625f, 443.71429443359375f)
-    ),
-    PointerInputData(
-        uptime = 216691029L,
-        down = true,
-        position = createPxPosition(264f, 431.71429443359375f)
-    ),
-    PointerInputData(
-        uptime = 216691036L,
-        down = true,
-        position = createPxPosition(263.4285583496094f, 421.1428527832031f)
-    ),
-    PointerInputData(
-        uptime = 216691044L,
-        down = true,
-        position = createPxPosition(263.4285583496094f, 412.5714416503906f)
-    ),
-    PointerInputData(
-        uptime = 216691052L,
-        down = true,
-        position = createPxPosition(263.4285583496094f, 404.5714416503906f)
-    ),
-    PointerInputData(
-        uptime = 216691060L,
-        down = true,
-        position = createPxPosition(263.4285583496094f, 396.5714416503906f)
-    ),
-    PointerInputData(
-        uptime = 216691068L,
-        down = true,
-        position = createPxPosition(264.5714416503906f, 390f)
-    ),
-    PointerInputData(
-        uptime = 216691075L,
-        down = true,
-        position = createPxPosition(265.1428527832031f, 384.8571472167969f)
-    ),
-    PointerInputData(
-        uptime = 216691083L,
-        down = true,
-        position = createPxPosition(266f, 380.28570556640625f)
-    ),
-    PointerInputData(
-        uptime = 216691091L,
-        down = true,
-        position = createPxPosition(266.5714416503906f, 376.28570556640625f)
-    ),
-    PointerInputData(
-        uptime = 216691098L,
-        down = true,
-        position = createPxPosition(267.1428527832031f, 373.1428527832031f)
-    ),
-    PointerInputData(
-        uptime = 216691106L,
-        down = true,
-        position = createPxPosition(267.71429443359375f, 370.28570556640625f)
-    ),
-    PointerInputData(
-        uptime = 216691114L,
-        down = true,
-        position = createPxPosition(268.28570556640625f, 367.71429443359375f)
-    ),
-    PointerInputData(
-        uptime = 216691121L,
-        down = true,
-        position = createPxPosition(268.5714416503906f, 366f)
-    ),
-    PointerInputData(
-        uptime = 216691130L,
-        down = true,
-        position = createPxPosition(268.8571472167969f, 364.5714416503906f)
-    ),
-    PointerInputData(
-        uptime = 216691137L,
-        down = true,
-        position = createPxPosition(269.1428527832031f, 363.71429443359375f)
-    ),
-    PointerInputData(
-        uptime = 216691145L,
-        down = true,
-        position = createPxPosition(269.1428527832031f, 362.8571472167969f)
-    ),
-    PointerInputData(
-        uptime = 216691153L,
-        down = true,
-        position = createPxPosition(269.4285583496094f, 362.8571472167969f)
-    ),
-    PointerInputData(
-        uptime = 216691168L,
-        down = true,
-        position = createPxPosition(268.5714416503906f, 365.4285583496094f)
-    ),
-    PointerInputData(
-        uptime = 216691176L,
-        down = true,
-        position = createPxPosition(267.1428527832031f, 370.28570556640625f)
-    ),
-    PointerInputData(
-        uptime = 216691183L,
-        down = true,
-        position = createPxPosition(265.4285583496094f, 376.8571472167969f)
-    ),
-    PointerInputData(
-        uptime = 216691191L,
-        down = true,
-        position = createPxPosition(263.1428527832031f, 385.71429443359375f)
-    ),
-    PointerInputData(
-        uptime = 216691199L,
-        down = true,
-        position = createPxPosition(261.4285583496094f, 396.5714416503906f)
-    ),
-    PointerInputData(
-        uptime = 216691207L,
-        down = true,
-        position = createPxPosition(259.71429443359375f, 408.5714416503906f)
-    ),
-    PointerInputData(
-        uptime = 216691215L,
-        down = true,
-        position = createPxPosition(258.28570556640625f, 419.4285583496094f)
-    ),
-    PointerInputData(
-        uptime = 216691222L,
-        down = true,
-        position = createPxPosition(257.4285583496094f, 428.5714416503906f)
-    ),
-    PointerInputData(
-        uptime = 216691230L,
-        down = true,
-        position = createPxPosition(256.28570556640625f, 436f)
-    ),
-    PointerInputData(
-        uptime = 216691238L,
-        down = true,
-        position = createPxPosition(255.7142791748047f, 442f)
-    ),
-    PointerInputData(
-        uptime = 216691245L,
-        down = true,
-        position = createPxPosition(255.14285278320312f, 447.71429443359375f)
-    ),
-    PointerInputData(
-        uptime = 216691253L,
-        down = true,
-        position = createPxPosition(254.85714721679688f, 453.1428527832031f)
-    ),
-    PointerInputData(
-        uptime = 216691261L,
-        down = true,
-        position = createPxPosition(254.57142639160156f, 458.5714416503906f)
-    ),
-    PointerInputData(
-        uptime = 216691268L,
-        down = true,
-        position = createPxPosition(254.2857208251953f, 463.71429443359375f)
-    ),
-    PointerInputData(
-        uptime = 216691276L,
-        down = true,
-        position = createPxPosition(254.2857208251953f, 470.28570556640625f)
-    ),
-    PointerInputData(
-        uptime = 216691284L,
-        down = true,
-        position = createPxPosition(254.2857208251953f, 477.71429443359375f)
-    ),
-    PointerInputData(
-        uptime = 216691292L,
-        down = true,
-        position = createPxPosition(255.7142791748047f, 487.1428527832031f)
-    ),
-    PointerInputData(
-        uptime = 216691300L,
-        down = true,
-        position = createPxPosition(256.8571472167969f, 498.5714416503906f)
-    ),
-    PointerInputData(
-        uptime = 216691307L,
-        down = true,
-        position = createPxPosition(258.28570556640625f, 507.71429443359375f)
-    ),
-    PointerInputData(
-        uptime = 216691315L,
-        down = true,
-        position = createPxPosition(259.4285583496094f, 516f)
-    ),
-    PointerInputData(
-        uptime = 216691323L,
-        down = true,
-        position = createPxPosition(260.28570556640625f, 521.7142944335938f)
-    ),
-    PointerInputData(
-        uptime = 216691338L,
-        down = false,
-        position = createPxPosition(260.28570556640625f, 521.7142944335938f)
-    ),
-    PointerInputData(
-        uptime = 216691573L,
-        down = true,
-        position = createPxPosition(266f, 327.4285583496094f)
-    ),
-    PointerInputData(
-        uptime = 216691588L,
-        down = true,
-        position = createPxPosition(266f, 327.4285583496094f)
-    ),
-    PointerInputData(
-        uptime = 216691626L,
-        down = true,
-        position = createPxPosition(261.1428527832031f, 337.1428527832031f)
-    ),
-    PointerInputData(
-        uptime = 216691634L,
-        down = true,
-        position = createPxPosition(258.28570556640625f, 343.1428527832031f)
-    ),
-    PointerInputData(
-        uptime = 216691642L,
-        down = true,
-        position = createPxPosition(254.57142639160156f, 354f)
-    ),
-    PointerInputData(
-        uptime = 216691650L,
-        down = true,
-        position = createPxPosition(250.2857208251953f, 368.28570556640625f)
-    ),
-    PointerInputData(
-        uptime = 216691657L,
-        down = true,
-        position = createPxPosition(247.42857360839844f, 382.8571472167969f)
-    ),
-    PointerInputData(
-        uptime = 216691665L,
-        down = true,
-        position = createPxPosition(245.14285278320312f, 397.4285583496094f)
-    ),
-    PointerInputData(
-        uptime = 216691673L,
-        down = true,
-        position = createPxPosition(243.14285278320312f, 411.71429443359375f)
-    ),
-    PointerInputData(
-        uptime = 216691680L,
-        down = true,
-        position = createPxPosition(242.2857208251953f, 426.28570556640625f)
-    ),
-    PointerInputData(
-        uptime = 216691688L,
-        down = true,
-        position = createPxPosition(241.7142791748047f, 440.5714416503906f)
-    ),
-    PointerInputData(
-        uptime = 216691696L,
-        down = true,
-        position = createPxPosition(241.7142791748047f, 454.5714416503906f)
-    ),
-    PointerInputData(
-        uptime = 216691703L,
-        down = true,
-        position = createPxPosition(242.57142639160156f, 467.71429443359375f)
-    ),
-    PointerInputData(
-        uptime = 216691712L,
-        down = true,
-        position = createPxPosition(243.42857360839844f, 477.4285583496094f)
-    ),
-    PointerInputData(
-        uptime = 216691720L,
-        down = true,
-        position = createPxPosition(244.85714721679688f, 485.71429443359375f)
-    ),
-    PointerInputData(
-        uptime = 216691727L,
-        down = true,
-        position = createPxPosition(246.2857208251953f, 493.1428527832031f)
-    ),
-    PointerInputData(
-        uptime = 216691735L,
-        down = true,
-        position = createPxPosition(248f, 499.71429443359375f)
-    ),
-    PointerInputData(
-        uptime = 216691750L,
-        down = false,
-        position = createPxPosition(248f, 499.71429443359375f)
-    ),
-    PointerInputData(
-        uptime = 216692255L,
-        down = true,
-        position = createPxPosition(249.42857360839844f, 351.4285583496094f)
-    ),
-    PointerInputData(
-        uptime = 216692270L,
-        down = true,
-        position = createPxPosition(249.42857360839844f, 351.4285583496094f)
-    ),
-    PointerInputData(
-        uptime = 216692309L,
-        down = true,
-        position = createPxPosition(246.2857208251953f, 361.71429443359375f)
-    ),
-    PointerInputData(
-        uptime = 216692317L,
-        down = true,
-        position = createPxPosition(244f, 368.5714416503906f)
-    ),
-    PointerInputData(
-        uptime = 216692325L,
-        down = true,
-        position = createPxPosition(241.42857360839844f, 377.71429443359375f)
-    ),
-    PointerInputData(
-        uptime = 216692333L,
-        down = true,
-        position = createPxPosition(237.7142791748047f, 391.71429443359375f)
-    ),
-    PointerInputData(
-        uptime = 216692340L,
-        down = true,
-        position = createPxPosition(235.14285278320312f, 406.5714416503906f)
-    ),
-    PointerInputData(
-        uptime = 216692348L,
-        down = true,
-        position = createPxPosition(232.57142639160156f, 421.4285583496094f)
-    ),
-    PointerInputData(
-        uptime = 216692356L,
-        down = true,
-        position = createPxPosition(230.2857208251953f, 436.5714416503906f)
-    ),
-    PointerInputData(
-        uptime = 216692363L,
-        down = true,
-        position = createPxPosition(228.2857208251953f, 451.71429443359375f)
-    ),
-    PointerInputData(
-        uptime = 216692371L,
-        down = true,
-        position = createPxPosition(227.42857360839844f, 466f)
-    ),
-    PointerInputData(
-        uptime = 216692378L,
-        down = true,
-        position = createPxPosition(226.2857208251953f, 479.71429443359375f)
-    ),
-    PointerInputData(
-        uptime = 216692387L,
-        down = true,
-        position = createPxPosition(225.7142791748047f, 491.71429443359375f)
-    ),
-    PointerInputData(
-        uptime = 216692395L,
-        down = true,
-        position = createPxPosition(225.14285278320312f, 501.71429443359375f)
-    ),
-    PointerInputData(
-        uptime = 216692402L,
-        down = true,
-        position = createPxPosition(224.85714721679688f, 509.1428527832031f)
-    ),
-    PointerInputData(
-        uptime = 216692410L,
-        down = true,
-        position = createPxPosition(224.57142639160156f, 514.8571166992188f)
-    ),
-    PointerInputData(
-        uptime = 216692418L,
-        down = true,
-        position = createPxPosition(224.2857208251953f, 519.4285888671875f)
-    ),
-    PointerInputData(
-        uptime = 216692425L,
-        down = true,
-        position = createPxPosition(224f, 523.4285888671875f)
-    ),
-    PointerInputData(
-        uptime = 216692433L,
-        down = true,
-        position = createPxPosition(224f, 527.1428833007812f)
-    ),
-    PointerInputData(
-        uptime = 216692441L,
-        down = true,
-        position = createPxPosition(224f, 530.5714111328125f)
-    ),
-    PointerInputData(
-        uptime = 216692448L,
-        down = true,
-        position = createPxPosition(224f, 533.1428833007812f)
-    ),
-    PointerInputData(
-        uptime = 216692456L,
-        down = true,
-        position = createPxPosition(224f, 535.4285888671875f)
-    ),
-    PointerInputData(
-        uptime = 216692464L,
-        down = true,
-        position = createPxPosition(223.7142791748047f, 536.8571166992188f)
-    ),
-    PointerInputData(
-        uptime = 216692472L,
-        down = true,
-        position = createPxPosition(223.7142791748047f, 538.2857055664062f)
-    ),
-    PointerInputData(
-        uptime = 216692487L,
-        down = false,
-        position = createPxPosition(223.7142791748047f, 538.2857055664062f)
-    ),
-    PointerInputData(
-        uptime = 216692678L,
-        down = true,
-        position = createPxPosition(221.42857360839844f, 526.2857055664062f)
-    ),
-    PointerInputData(
-        uptime = 216692701L,
-        down = true,
-        position = createPxPosition(220.57142639160156f, 514.8571166992188f)
-    ),
-    PointerInputData(
-        uptime = 216692708L,
-        down = true,
-        position = createPxPosition(220.2857208251953f, 508f)
-    ),
-    PointerInputData(
-        uptime = 216692716L,
-        down = true,
-        position = createPxPosition(220.2857208251953f, 498f)
-    ),
-    PointerInputData(
-        uptime = 216692724L,
-        down = true,
-        position = createPxPosition(221.14285278320312f, 484.28570556640625f)
-    ),
-    PointerInputData(
-        uptime = 216692732L,
-        down = true,
-        position = createPxPosition(221.7142791748047f, 469.4285583496094f)
-    ),
-    PointerInputData(
-        uptime = 216692740L,
-        down = true,
-        position = createPxPosition(223.42857360839844f, 453.1428527832031f)
-    ),
-    PointerInputData(
-        uptime = 216692748L,
-        down = true,
-        position = createPxPosition(225.7142791748047f, 436.28570556640625f)
-    ),
-    PointerInputData(
-        uptime = 216692755L,
-        down = true,
-        position = createPxPosition(229.14285278320312f, 418.28570556640625f)
-    ),
-    PointerInputData(
-        uptime = 216692763L,
-        down = true,
-        position = createPxPosition(232.85714721679688f, 400.28570556640625f)
-    ),
-    PointerInputData(
-        uptime = 216692770L,
-        down = true,
-        position = createPxPosition(236.85714721679688f, 382.5714416503906f)
-    ),
-    PointerInputData(
-        uptime = 216692778L,
-        down = true,
-        position = createPxPosition(241.14285278320312f, 366f)
-    ),
-    PointerInputData(
-        uptime = 216692786L,
-        down = true,
-        position = createPxPosition(244.85714721679688f, 350.28570556640625f)
-    ),
-    PointerInputData(
-        uptime = 216692793L,
-        down = true,
-        position = createPxPosition(249.14285278320312f, 335.4285583496094f)
-    ),
-    PointerInputData(
-        uptime = 216692809L,
-        down = false,
-        position = createPxPosition(249.14285278320312f, 335.4285583496094f)
-    ),
-    PointerInputData(
-        uptime = 216693222L,
-        down = true,
-        position = createPxPosition(224f, 545.4285888671875f)
-    ),
-    PointerInputData(
-        uptime = 216693245L,
-        down = true,
-        position = createPxPosition(224f, 545.4285888671875f)
-    ),
-    PointerInputData(
-        uptime = 216693275L,
-        down = true,
-        position = createPxPosition(222.85714721679688f, 535.1428833007812f)
-    ),
-    PointerInputData(
-        uptime = 216693284L,
-        down = true,
-        position = createPxPosition(222.85714721679688f, 528.8571166992188f)
-    ),
-    PointerInputData(
-        uptime = 216693291L,
-        down = true,
-        position = createPxPosition(222.2857208251953f, 518.5714111328125f)
-    ),
-    PointerInputData(
-        uptime = 216693299L,
-        down = true,
-        position = createPxPosition(222f, 503.4285583496094f)
-    ),
-    PointerInputData(
-        uptime = 216693307L,
-        down = true,
-        position = createPxPosition(222f, 485.4285583496094f)
-    ),
-    PointerInputData(
-        uptime = 216693314L,
-        down = true,
-        position = createPxPosition(221.7142791748047f, 464f)
-    ),
-    PointerInputData(
-        uptime = 216693322L,
-        down = true,
-        position = createPxPosition(222.2857208251953f, 440.28570556640625f)
-    ),
-    PointerInputData(
-        uptime = 216693337L,
-        down = false,
-        position = createPxPosition(222.2857208251953f, 440.28570556640625f)
-    ),
-    PointerInputData(
-        uptime = 216693985L,
-        down = true,
-        position = createPxPosition(208f, 544f)
-    ),
-    PointerInputData(
-        uptime = 216694047L,
-        down = true,
-        position = createPxPosition(208.57142639160156f, 532.2857055664062f)
-    ),
-    PointerInputData(
-        uptime = 216694054L,
-        down = true,
-        position = createPxPosition(208.85714721679688f, 525.7142944335938f)
-    ),
-    PointerInputData(
-        uptime = 216694062L,
-        down = true,
-        position = createPxPosition(208.85714721679688f, 515.1428833007812f)
-    ),
-    PointerInputData(
-        uptime = 216694070L,
-        down = true,
-        position = createPxPosition(208f, 501.4285583496094f)
-    ),
-    PointerInputData(
-        uptime = 216694077L,
-        down = true,
-        position = createPxPosition(207.42857360839844f, 487.1428527832031f)
-    ),
-    PointerInputData(
-        uptime = 216694085L,
-        down = true,
-        position = createPxPosition(206.57142639160156f, 472.8571472167969f)
-    ),
-    PointerInputData(
-        uptime = 216694092L,
-        down = true,
-        position = createPxPosition(206.57142639160156f, 458.8571472167969f)
-    ),
-    PointerInputData(
-        uptime = 216694100L,
-        down = true,
-        position = createPxPosition(206.57142639160156f, 446f)
-    ),
-    PointerInputData(
-        uptime = 216694108L,
-        down = true,
-        position = createPxPosition(206.57142639160156f, 434.28570556640625f)
-    ),
-    PointerInputData(
-        uptime = 216694116L,
-        down = true,
-        position = createPxPosition(207.14285278320312f, 423.71429443359375f)
-    ),
-    PointerInputData(
-        uptime = 216694124L,
-        down = true,
-        position = createPxPosition(208.57142639160156f, 412.8571472167969f)
-    ),
-    PointerInputData(
-        uptime = 216694131L,
-        down = true,
-        position = createPxPosition(209.7142791748047f, 402.28570556640625f)
-    ),
-    PointerInputData(
-        uptime = 216694139L,
-        down = true,
-        position = createPxPosition(211.7142791748047f, 393.1428527832031f)
-    ),
-    PointerInputData(
-        uptime = 216694147L,
-        down = true,
-        position = createPxPosition(213.42857360839844f, 385.1428527832031f)
-    ),
-    PointerInputData(
-        uptime = 216694154L,
-        down = true,
-        position = createPxPosition(215.42857360839844f, 378.28570556640625f)
-    ),
-    PointerInputData(
-        uptime = 216694162L,
-        down = true,
-        position = createPxPosition(217.42857360839844f, 371.71429443359375f)
-    ),
-    PointerInputData(
-        uptime = 216694169L,
-        down = true,
-        position = createPxPosition(219.42857360839844f, 366f)
-    ),
-    PointerInputData(
-        uptime = 216694177L,
-        down = true,
-        position = createPxPosition(221.42857360839844f, 360.8571472167969f)
-    ),
-    PointerInputData(
-        uptime = 216694185L,
-        down = true,
-        position = createPxPosition(223.42857360839844f, 356.5714416503906f)
-    ),
-    PointerInputData(
-        uptime = 216694193L,
-        down = true,
-        position = createPxPosition(225.14285278320312f, 352.28570556640625f)
-    ),
-    PointerInputData(
-        uptime = 216694201L,
-        down = true,
-        position = createPxPosition(226.85714721679688f, 348.5714416503906f)
-    ),
-    PointerInputData(
-        uptime = 216694209L,
-        down = true,
-        position = createPxPosition(228.2857208251953f, 346f)
-    ),
-    PointerInputData(
-        uptime = 216694216L,
-        down = true,
-        position = createPxPosition(229.14285278320312f, 343.71429443359375f)
-    ),
-    PointerInputData(
-        uptime = 216694224L,
-        down = true,
-        position = createPxPosition(230f, 342f)
-    ),
-    PointerInputData(
-        uptime = 216694232L,
-        down = true,
-        position = createPxPosition(230.57142639160156f, 340.5714416503906f)
-    ),
-    PointerInputData(
-        uptime = 216694239L,
-        down = true,
-        position = createPxPosition(230.85714721679688f, 339.71429443359375f)
-    ),
-    PointerInputData(
-        uptime = 216694247L,
-        down = true,
-        position = createPxPosition(230.85714721679688f, 339.4285583496094f)
-    ),
-    PointerInputData(
-        uptime = 216694262L,
-        down = true,
-        position = createPxPosition(230.2857208251953f, 342f)
-    ),
-    PointerInputData(
-        uptime = 216694270L,
-        down = true,
-        position = createPxPosition(228.85714721679688f, 346.28570556640625f)
-    ),
-    PointerInputData(
-        uptime = 216694278L,
-        down = true,
-        position = createPxPosition(227.14285278320312f, 352.5714416503906f)
-    ),
-    PointerInputData(
-        uptime = 216694286L,
-        down = true,
-        position = createPxPosition(225.42857360839844f, 359.4285583496094f)
-    ),
-    PointerInputData(
-        uptime = 216694294L,
-        down = true,
-        position = createPxPosition(223.7142791748047f, 367.71429443359375f)
-    ),
-    PointerInputData(
-        uptime = 216694301L,
-        down = true,
-        position = createPxPosition(222.57142639160156f, 376f)
-    ),
-    PointerInputData(
-        uptime = 216694309L,
-        down = true,
-        position = createPxPosition(221.42857360839844f, 384.28570556640625f)
-    ),
-    PointerInputData(
-        uptime = 216694317L,
-        down = true,
-        position = createPxPosition(220.85714721679688f, 392.28570556640625f)
-    ),
-    PointerInputData(
-        uptime = 216694324L,
-        down = true,
-        position = createPxPosition(220f, 400.5714416503906f)
-    ),
-    PointerInputData(
-        uptime = 216694332L,
-        down = true,
-        position = createPxPosition(219.14285278320312f, 409.71429443359375f)
-    ),
-    PointerInputData(
-        uptime = 216694339L,
-        down = true,
-        position = createPxPosition(218.85714721679688f, 419.1428527832031f)
-    ),
-    PointerInputData(
-        uptime = 216694348L,
-        down = true,
-        position = createPxPosition(218.2857208251953f, 428.8571472167969f)
-    ),
-    PointerInputData(
-        uptime = 216694356L,
-        down = true,
-        position = createPxPosition(218.2857208251953f, 438.8571472167969f)
-    ),
-    PointerInputData(
-        uptime = 216694363L,
-        down = true,
-        position = createPxPosition(218.2857208251953f, 447.71429443359375f)
-    ),
-    PointerInputData(
-        uptime = 216694371L,
-        down = true,
-        position = createPxPosition(218.2857208251953f, 455.71429443359375f)
-    ),
-    PointerInputData(
-        uptime = 216694379L,
-        down = true,
-        position = createPxPosition(219.14285278320312f, 462.8571472167969f)
-    ),
-    PointerInputData(
-        uptime = 216694386L,
-        down = true,
-        position = createPxPosition(220f, 469.4285583496094f)
-    ),
-    PointerInputData(
-        uptime = 216694394L,
-        down = true,
-        position = createPxPosition(221.14285278320312f, 475.4285583496094f)
-    ),
-    PointerInputData(
-        uptime = 216694401L,
-        down = true,
-        position = createPxPosition(222f, 480.5714416503906f)
-    ),
-    PointerInputData(
-        uptime = 216694409L,
-        down = true,
-        position = createPxPosition(222.85714721679688f, 485.4285583496094f)
-    ),
-    PointerInputData(
-        uptime = 216694417L,
-        down = true,
-        position = createPxPosition(224f, 489.71429443359375f)
-    ),
-    PointerInputData(
-        uptime = 216694425L,
-        down = true,
-        position = createPxPosition(224.85714721679688f, 492.8571472167969f)
-    ),
-    PointerInputData(
-        uptime = 216694433L,
-        down = true,
-        position = createPxPosition(225.42857360839844f, 495.4285583496094f)
-    ),
-    PointerInputData(
-        uptime = 216694440L,
-        down = true,
-        position = createPxPosition(226f, 497.1428527832031f)
-    ),
-    PointerInputData(
-        uptime = 216694448L,
-        down = true,
-        position = createPxPosition(226.2857208251953f, 498.28570556640625f)
-    ),
-    PointerInputData(
-        uptime = 216694456L,
-        down = true,
-        position = createPxPosition(226.2857208251953f, 498.8571472167969f)
-    ),
-    PointerInputData(
-        uptime = 216694471L,
-        down = true,
-        position = createPxPosition(226.2857208251953f, 498.28570556640625f)
-    ),
-    PointerInputData(
-        uptime = 216694479L,
-        down = true,
-        position = createPxPosition(226.2857208251953f, 496.5714416503906f)
-    ),
-    PointerInputData(
-        uptime = 216694486L,
-        down = true,
-        position = createPxPosition(226.2857208251953f, 493.71429443359375f)
-    ),
-    PointerInputData(
-        uptime = 216694494L,
-        down = true,
-        position = createPxPosition(226.2857208251953f, 490f)
-    ),
-    PointerInputData(
-        uptime = 216694502L,
-        down = true,
-        position = createPxPosition(226.2857208251953f, 486f)
-    ),
-    PointerInputData(
-        uptime = 216694510L,
-        down = true,
-        position = createPxPosition(226.2857208251953f, 480.5714416503906f)
-    ),
-    PointerInputData(
-        uptime = 216694518L,
-        down = true,
-        position = createPxPosition(226.2857208251953f, 475.71429443359375f)
-    ),
-    PointerInputData(
-        uptime = 216694525L,
-        down = true,
-        position = createPxPosition(226.2857208251953f, 468.8571472167969f)
-    ),
-    PointerInputData(
-        uptime = 216694533L,
-        down = true,
-        position = createPxPosition(226.2857208251953f, 461.4285583496094f)
-    ),
-    PointerInputData(
-        uptime = 216694541L,
-        down = true,
-        position = createPxPosition(226.2857208251953f, 452.5714416503906f)
-    ),
-    PointerInputData(
-        uptime = 216694548L,
-        down = true,
-        position = createPxPosition(226.57142639160156f, 442.28570556640625f)
-    ),
-    PointerInputData(
-        uptime = 216694556L,
-        down = true,
-        position = createPxPosition(226.57142639160156f, 432.28570556640625f)
-    ),
-    PointerInputData(
-        uptime = 216694564L,
-        down = true,
-        position = createPxPosition(226.85714721679688f, 423.4285583496094f)
-    ),
-    PointerInputData(
-        uptime = 216694571L,
-        down = true,
-        position = createPxPosition(227.42857360839844f, 416f)
-    ),
-    PointerInputData(
-        uptime = 216694580L,
-        down = true,
-        position = createPxPosition(227.7142791748047f, 410f)
-    ),
-    PointerInputData(
-        uptime = 216694587L,
-        down = true,
-        position = createPxPosition(228.2857208251953f, 404.28570556640625f)
-    ),
-    PointerInputData(
-        uptime = 216694595L,
-        down = true,
-        position = createPxPosition(228.85714721679688f, 399.71429443359375f)
-    ),
-    PointerInputData(
-        uptime = 216694603L,
-        down = true,
-        position = createPxPosition(229.14285278320312f, 395.4285583496094f)
-    ),
-    PointerInputData(
-        uptime = 216694610L,
-        down = true,
-        position = createPxPosition(229.42857360839844f, 392.28570556640625f)
-    ),
-    PointerInputData(
-        uptime = 216694618L,
-        down = true,
-        position = createPxPosition(229.7142791748047f, 390f)
-    ),
-    PointerInputData(
-        uptime = 216694625L,
-        down = true,
-        position = createPxPosition(229.7142791748047f, 388f)
-    ),
-    PointerInputData(
-        uptime = 216694633L,
-        down = true,
-        position = createPxPosition(229.7142791748047f, 386.8571472167969f)
-    ),
-    PointerInputData(
-        uptime = 216694641L,
-        down = true,
-        position = createPxPosition(229.7142791748047f, 386.28570556640625f)
-    ),
-    PointerInputData(
-        uptime = 216694648L,
-        down = true,
-        position = createPxPosition(229.7142791748047f, 386f)
-    ),
-    PointerInputData(
-        uptime = 216694657L,
-        down = true,
-        position = createPxPosition(228.85714721679688f, 386f)
-    ),
-    PointerInputData(
-        uptime = 216694665L,
-        down = true,
-        position = createPxPosition(228f, 388f)
-    ),
-    PointerInputData(
-        uptime = 216694672L,
-        down = true,
-        position = createPxPosition(226f, 392.5714416503906f)
-    ),
-    PointerInputData(
-        uptime = 216694680L,
-        down = true,
-        position = createPxPosition(224f, 397.71429443359375f)
-    ),
-    PointerInputData(
-        uptime = 216694688L,
-        down = true,
-        position = createPxPosition(222f, 404.28570556640625f)
-    ),
-    PointerInputData(
-        uptime = 216694695L,
-        down = true,
-        position = createPxPosition(219.7142791748047f, 411.1428527832031f)
-    ),
-    PointerInputData(
-        uptime = 216694703L,
-        down = true,
-        position = createPxPosition(218.2857208251953f, 418f)
-    ),
-    PointerInputData(
-        uptime = 216694710L,
-        down = true,
-        position = createPxPosition(217.14285278320312f, 425.4285583496094f)
-    ),
-    PointerInputData(
-        uptime = 216694718L,
-        down = true,
-        position = createPxPosition(215.7142791748047f, 433.4285583496094f)
-    ),
-    PointerInputData(
-        uptime = 216694726L,
-        down = true,
-        position = createPxPosition(214.85714721679688f, 442.28570556640625f)
-    ),
-    PointerInputData(
-        uptime = 216694734L,
-        down = true,
-        position = createPxPosition(214f, 454f)
-    ),
-    PointerInputData(
-        uptime = 216694742L,
-        down = true,
-        position = createPxPosition(214f, 469.4285583496094f)
-    ),
-    PointerInputData(
-        uptime = 216694749L,
-        down = true,
-        position = createPxPosition(215.42857360839844f, 485.4285583496094f)
-    ),
-    PointerInputData(
-        uptime = 216694757L,
-        down = true,
-        position = createPxPosition(217.7142791748047f, 502.8571472167969f)
-    ),
-    PointerInputData(
-        uptime = 216694765L,
-        down = true,
-        position = createPxPosition(221.14285278320312f, 521.4285888671875f)
-    ),
-    PointerInputData(
-        uptime = 216694772L,
-        down = true,
-        position = createPxPosition(224.57142639160156f, 541.1428833007812f)
-    ),
-    PointerInputData(
-        uptime = 216694780L,
-        down = true,
-        position = createPxPosition(229.14285278320312f, 561.1428833007812f)
-    ),
-    PointerInputData(
-        uptime = 216694788L,
-        down = true,
-        position = createPxPosition(233.42857360839844f, 578.8571166992188f)
-    ),
-    PointerInputData(
-        uptime = 216694802L,
-        down = false,
-        position = createPxPosition(233.42857360839844f, 578.8571166992188f)
-    ),
-    PointerInputData(
-        uptime = 216695344L,
-        down = true,
-        position = createPxPosition(253.42857360839844f, 310.5714416503906f)
-    ),
-    PointerInputData(
-        uptime = 216695352L,
-        down = true,
-        position = createPxPosition(253.42857360839844f, 310.5714416503906f)
-    ),
-    PointerInputData(
-        uptime = 216695359L,
-        down = true,
-        position = createPxPosition(252.85714721679688f, 318f)
-    ),
-    PointerInputData(
-        uptime = 216695367L,
-        down = true,
-        position = createPxPosition(251.14285278320312f, 322f)
-    ),
-    PointerInputData(
-        uptime = 216695375L,
-        down = true,
-        position = createPxPosition(248.85714721679688f, 327.1428527832031f)
-    ),
-    PointerInputData(
-        uptime = 216695382L,
-        down = true,
-        position = createPxPosition(246f, 334.8571472167969f)
-    ),
-    PointerInputData(
-        uptime = 216695390L,
-        down = true,
-        position = createPxPosition(242.57142639160156f, 344.5714416503906f)
-    ),
-    PointerInputData(
-        uptime = 216695397L,
-        down = true,
-        position = createPxPosition(238.85714721679688f, 357.4285583496094f)
-    ),
-    PointerInputData(
-        uptime = 216695406L,
-        down = true,
-        position = createPxPosition(235.7142791748047f, 371.71429443359375f)
-    ),
-    PointerInputData(
-        uptime = 216695414L,
-        down = true,
-        position = createPxPosition(232.2857208251953f, 386.8571472167969f)
-    ),
-    PointerInputData(
-        uptime = 216695421L,
-        down = true,
-        position = createPxPosition(229.42857360839844f, 402f)
-    ),
-    PointerInputData(
-        uptime = 216695429L,
-        down = true,
-        position = createPxPosition(227.42857360839844f, 416.8571472167969f)
-    ),
-    PointerInputData(
-        uptime = 216695437L,
-        down = true,
-        position = createPxPosition(226.2857208251953f, 431.4285583496094f)
-    ),
-    PointerInputData(
-        uptime = 216695444L,
-        down = true,
-        position = createPxPosition(226.2857208251953f, 446f)
-    ),
-    PointerInputData(
-        uptime = 216695452L,
-        down = true,
-        position = createPxPosition(227.7142791748047f, 460.28570556640625f)
-    ),
-    PointerInputData(
-        uptime = 216695459L,
-        down = true,
-        position = createPxPosition(230f, 475.1428527832031f)
-    ),
-    PointerInputData(
-        uptime = 216695467L,
-        down = true,
-        position = createPxPosition(232.2857208251953f, 489.71429443359375f)
-    ),
-    PointerInputData(
-        uptime = 216695475L,
-        down = true,
-        position = createPxPosition(235.7142791748047f, 504f)
-    ),
-    PointerInputData(
-        uptime = 216695490L,
-        down = false,
-        position = createPxPosition(235.7142791748047f, 504f)
-    ),
-    PointerInputData(
-        uptime = 216695885L,
-        down = true,
-        position = createPxPosition(238.85714721679688f, 524f)
-    ),
-    PointerInputData(
-        uptime = 216695908L,
-        down = true,
-        position = createPxPosition(236.2857208251953f, 515.7142944335938f)
-    ),
-    PointerInputData(
-        uptime = 216695916L,
-        down = true,
-        position = createPxPosition(234.85714721679688f, 509.1428527832031f)
-    ),
-    PointerInputData(
-        uptime = 216695924L,
-        down = true,
-        position = createPxPosition(232.57142639160156f, 498.5714416503906f)
-    ),
-    PointerInputData(
-        uptime = 216695931L,
-        down = true,
-        position = createPxPosition(230.57142639160156f, 483.71429443359375f)
-    ),
-    PointerInputData(
-        uptime = 216695939L,
-        down = true,
-        position = createPxPosition(229.14285278320312f, 466.5714416503906f)
-    ),
-    PointerInputData(
-        uptime = 216695947L,
-        down = true,
-        position = createPxPosition(229.14285278320312f, 446.5714416503906f)
-    ),
-    PointerInputData(
-        uptime = 216695955L,
-        down = true,
-        position = createPxPosition(230.57142639160156f, 424.8571472167969f)
-    ),
-    PointerInputData(
-        uptime = 216695963L,
-        down = true,
-        position = createPxPosition(232.57142639160156f, 402.28570556640625f)
-    ),
-    PointerInputData(
-        uptime = 216695970L,
-        down = true,
-        position = createPxPosition(235.14285278320312f, 380f)
-    ),
-    PointerInputData(
-        uptime = 216695978L,
-        down = true,
-        position = createPxPosition(238.57142639160156f, 359.4285583496094f)
-    ),
-    PointerInputData(
-        uptime = 216695993L,
-        down = false,
-        position = createPxPosition(238.57142639160156f, 359.4285583496094f)
-    ),
-    PointerInputData(
-        uptime = 216696429L,
-        down = true,
-        position = createPxPosition(238.2857208251953f, 568.5714111328125f)
-    ),
-    PointerInputData(
-        uptime = 216696459L,
-        down = true,
-        position = createPxPosition(234f, 560f)
-    ),
-    PointerInputData(
-        uptime = 216696467L,
-        down = true,
-        position = createPxPosition(231.42857360839844f, 553.1428833007812f)
-    ),
-    PointerInputData(
-        uptime = 216696475L,
-        down = true,
-        position = createPxPosition(228.2857208251953f, 543.1428833007812f)
-    ),
-    PointerInputData(
-        uptime = 216696483L,
-        down = true,
-        position = createPxPosition(225.42857360839844f, 528.8571166992188f)
-    ),
-    PointerInputData(
-        uptime = 216696491L,
-        down = true,
-        position = createPxPosition(223.14285278320312f, 512.2857055664062f)
-    ),
-    PointerInputData(
-        uptime = 216696498L,
-        down = true,
-        position = createPxPosition(222f, 495.4285583496094f)
-    ),
-    PointerInputData(
-        uptime = 216696506L,
-        down = true,
-        position = createPxPosition(221.7142791748047f, 477.4285583496094f)
-    ),
-    PointerInputData(
-        uptime = 216696514L,
-        down = true,
-        position = createPxPosition(221.7142791748047f, 458.28570556640625f)
-    ),
-    PointerInputData(
-        uptime = 216696521L,
-        down = true,
-        position = createPxPosition(223.14285278320312f, 438f)
-    ),
-    PointerInputData(
-        uptime = 216696529L,
-        down = true,
-        position = createPxPosition(224.2857208251953f, 416.28570556640625f)
-    ),
-    PointerInputData(
-        uptime = 216696544L,
-        down = false,
-        position = createPxPosition(224.2857208251953f, 416.28570556640625f)
-    ),
-    PointerInputData(
-        uptime = 216696974L,
-        down = true,
-        position = createPxPosition(218.57142639160156f, 530.5714111328125f)
-    ),
-    PointerInputData(
-        uptime = 216697012L,
-        down = true,
-        position = createPxPosition(220.2857208251953f, 522f)
-    ),
-    PointerInputData(
-        uptime = 216697020L,
-        down = true,
-        position = createPxPosition(221.14285278320312f, 517.7142944335938f)
-    ),
-    PointerInputData(
-        uptime = 216697028L,
-        down = true,
-        position = createPxPosition(222.2857208251953f, 511.71429443359375f)
-    ),
-    PointerInputData(
-        uptime = 216697036L,
-        down = true,
-        position = createPxPosition(224f, 504.28570556640625f)
-    ),
-    PointerInputData(
-        uptime = 216697044L,
-        down = true,
-        position = createPxPosition(227.14285278320312f, 490.5714416503906f)
-    ),
-    PointerInputData(
-        uptime = 216697052L,
-        down = true,
-        position = createPxPosition(229.42857360839844f, 474f)
-    ),
-    PointerInputData(
-        uptime = 216697059L,
-        down = true,
-        position = createPxPosition(231.42857360839844f, 454.5714416503906f)
-    ),
-    PointerInputData(
-        uptime = 216697067L,
-        down = true,
-        position = createPxPosition(233.7142791748047f, 431.1428527832031f)
-    ),
-    PointerInputData(
-        uptime = 216697082L,
-        down = false,
-        position = createPxPosition(233.7142791748047f, 431.1428527832031f)
-    ),
-    PointerInputData(
-        uptime = 216697435L,
-        down = true,
-        position = createPxPosition(257.1428527832031f, 285.1428527832031f)
-    ),
-    PointerInputData(
-        uptime = 216697465L,
-        down = true,
-        position = createPxPosition(251.7142791748047f, 296.8571472167969f)
-    ),
-    PointerInputData(
-        uptime = 216697473L,
-        down = true,
-        position = createPxPosition(248.2857208251953f, 304f)
-    ),
-    PointerInputData(
-        uptime = 216697481L,
-        down = true,
-        position = createPxPosition(244.57142639160156f, 314.8571472167969f)
-    ),
-    PointerInputData(
-        uptime = 216697489L,
-        down = true,
-        position = createPxPosition(240.2857208251953f, 329.1428527832031f)
-    ),
-    PointerInputData(
-        uptime = 216697497L,
-        down = true,
-        position = createPxPosition(236.85714721679688f, 345.1428527832031f)
-    ),
-    PointerInputData(
-        uptime = 216697505L,
-        down = true,
-        position = createPxPosition(233.7142791748047f, 361.4285583496094f)
-    ),
-    PointerInputData(
-        uptime = 216697512L,
-        down = true,
-        position = createPxPosition(231.14285278320312f, 378.28570556640625f)
-    ),
-    PointerInputData(
-        uptime = 216697520L,
-        down = true,
-        position = createPxPosition(229.42857360839844f, 395.4285583496094f)
-    ),
-    PointerInputData(
-        uptime = 216697528L,
-        down = true,
-        position = createPxPosition(229.42857360839844f, 412.8571472167969f)
-    ),
-    PointerInputData(
-        uptime = 216697535L,
-        down = true,
-        position = createPxPosition(230.85714721679688f, 430.8571472167969f)
-    ),
-    PointerInputData(
-        uptime = 216697543L,
-        down = true,
-        position = createPxPosition(233.42857360839844f, 449.71429443359375f)
-    ),
-    PointerInputData(
-        uptime = 216697558L,
-        down = false,
-        position = createPxPosition(233.42857360839844f, 449.71429443359375f)
-    ),
-    PointerInputData(
-        uptime = 216697749L,
-        down = true,
-        position = createPxPosition(246f, 311.4285583496094f)
-    ),
-    PointerInputData(
-        uptime = 216697780L,
-        down = true,
-        position = createPxPosition(244.57142639160156f, 318.28570556640625f)
-    ),
-    PointerInputData(
-        uptime = 216697787L,
-        down = true,
-        position = createPxPosition(243.14285278320312f, 325.4285583496094f)
-    ),
-    PointerInputData(
-        uptime = 216697795L,
-        down = true,
-        position = createPxPosition(241.42857360839844f, 336f)
-    ),
-    PointerInputData(
-        uptime = 216697803L,
-        down = true,
-        position = createPxPosition(239.7142791748047f, 351.1428527832031f)
-    ),
-    PointerInputData(
-        uptime = 216697811L,
-        down = true,
-        position = createPxPosition(238.2857208251953f, 368.5714416503906f)
-    ),
-    PointerInputData(
-        uptime = 216697819L,
-        down = true,
-        position = createPxPosition(238f, 389.4285583496094f)
-    ),
-    PointerInputData(
-        uptime = 216697826L,
-        down = true,
-        position = createPxPosition(239.14285278320312f, 412f)
-    ),
-    PointerInputData(
-        uptime = 216697834L,
-        down = true,
-        position = createPxPosition(242.2857208251953f, 438f)
-    ),
-    PointerInputData(
-        uptime = 216697842L,
-        down = true,
-        position = createPxPosition(247.42857360839844f, 466.8571472167969f)
-    ),
-    PointerInputData(
-        uptime = 216697849L,
-        down = true,
-        position = createPxPosition(254.2857208251953f, 497.71429443359375f)
-    ),
-    PointerInputData(
-        uptime = 216697864L,
-        down = false,
-        position = createPxPosition(254.2857208251953f, 497.71429443359375f)
-    ),
-    PointerInputData(
-        uptime = 216698321L,
-        down = true,
-        position = createPxPosition(250f, 306f)
-    ),
-    PointerInputData(
-        uptime = 216698328L,
-        down = true,
-        position = createPxPosition(250f, 306f)
-    ),
-    PointerInputData(
-        uptime = 216698344L,
-        down = true,
-        position = createPxPosition(249.14285278320312f, 314f)
-    ),
-    PointerInputData(
-        uptime = 216698351L,
-        down = true,
-        position = createPxPosition(247.42857360839844f, 319.4285583496094f)
-    ),
-    PointerInputData(
-        uptime = 216698359L,
-        down = true,
-        position = createPxPosition(245.14285278320312f, 326.8571472167969f)
-    ),
-    PointerInputData(
-        uptime = 216698366L,
-        down = true,
-        position = createPxPosition(241.7142791748047f, 339.4285583496094f)
-    ),
-    PointerInputData(
-        uptime = 216698374L,
-        down = true,
-        position = createPxPosition(238.57142639160156f, 355.71429443359375f)
-    ),
-    PointerInputData(
-        uptime = 216698382L,
-        down = true,
-        position = createPxPosition(236.2857208251953f, 374.28570556640625f)
-    ),
-    PointerInputData(
-        uptime = 216698390L,
-        down = true,
-        position = createPxPosition(235.14285278320312f, 396.5714416503906f)
-    ),
-    PointerInputData(
-        uptime = 216698398L,
-        down = true,
-        position = createPxPosition(236.57142639160156f, 421.4285583496094f)
-    ),
-    PointerInputData(
-        uptime = 216698406L,
-        down = true,
-        position = createPxPosition(241.14285278320312f, 451.4285583496094f)
-    ),
-    PointerInputData(
-        uptime = 216698421L,
-        down = false,
-        position = createPxPosition(241.14285278320312f, 451.4285583496094f)
-    )
-)
-
-internal val interruptedVelocityEventData: List<PointerInputData> = listOf(
-    PointerInputData(
-        uptime = 216698321L,
-        down = true,
-        position = createPxPosition(250f, 306f)
-    ),
-    PointerInputData(
-        uptime = 216698328L,
-        down = true,
-        position = createPxPosition(250f, 306f)
-    ),
-    PointerInputData(
-        uptime = 216698344L,
-        down = true,
-        position = createPxPosition(249.14285278320312f, 314f)
-    ),
-    PointerInputData(
-        uptime = 216698351L,
-        down = true,
-        position = createPxPosition(247.42857360839844f, 319.4285583496094f)
-    ),
-    PointerInputData(
-        uptime = 216698359L,
-        down = true,
-        position = createPxPosition(245.14285278320312f, 326.8571472167969f)
-    ),
-    PointerInputData(
-        uptime = 216698366L,
-        down = true,
-        position = createPxPosition(241.7142791748047f, 339.4285583496094f)
-    ),
-
-// The pointer "stops" here because we've introduced a 40+ms gap
-// in the move event stream. See kAssumePointerMoveStoppedMilliseconds
-// in velocity_tracker.dart.
-
-    PointerInputData(
-        uptime = (216698374L + 40),
-        down = true,
-        position = createPxPosition(238.57142639160156f, 355.71429443359375f)
-    ),
-    PointerInputData(
-        uptime = (216698382L + 40),
-        down = true,
-        position = createPxPosition(236.2857208251953f, 374.28570556640625f)
-    ),
-    PointerInputData(
-        uptime = (216698390L + 40),
-        down = true,
-        position = createPxPosition(235.14285278320312f, 396.5714416503906f)
-    ),
-    PointerInputData(
-        uptime = (216698398L + 40),
-        down = true,
-        position = createPxPosition(236.57142639160156f, 421.4285583496094f)
-    ),
-    PointerInputData(
-        uptime = (216698406L + 40),
-        down = true,
-        position = createPxPosition(241.14285278320312f, 451.4285583496094f)
-    ),
-    PointerInputData(
-        uptime = (216698421L + 40),
-        down = false,
-        position = createPxPosition(241.14285278320312f, 451.4285583496094f)
-    )
-)
diff --git a/compose/ui/ui/src/androidUnitTest/kotlin/androidx/compose/ui/layout/AlignmentTest.kt b/compose/ui/ui/src/androidUnitTest/kotlin/androidx/compose/ui/layout/AlignmentTest.kt
index 1d03d24..1d54661 100644
--- a/compose/ui/ui/src/androidUnitTest/kotlin/androidx/compose/ui/layout/AlignmentTest.kt
+++ b/compose/ui/ui/src/androidUnitTest/kotlin/androidx/compose/ui/layout/AlignmentTest.kt
@@ -143,115 +143,61 @@
 
     @Test
     fun testAlign_top() {
-        assertEquals(
-            0,
-            Alignment.Top.align(0, space1D)
-        )
+        assertEquals(0, Alignment.Top.align(0, space1D))
     }
 
     @Test
     fun testAlign_centerVertically() {
-        assertEquals(
-            50,
-            Alignment.CenterVertically.align(0, space1D)
-        )
+        assertEquals(50, Alignment.CenterVertically.align(0, space1D))
     }
 
     @Test
     fun testAlign_bottom() {
-        assertEquals(
-            100,
-            Alignment.Bottom.align(0, space1D)
-        )
+        assertEquals(100, Alignment.Bottom.align(0, space1D))
     }
 
     @Test
     fun testAlign_start() {
-        assertEquals(
-            0,
-            Alignment.Start.align(0, space1D, LayoutDirection.Ltr)
-        )
-        assertEquals(
-            100,
-            Alignment.Start.align(0, space1D, LayoutDirection.Rtl)
-        )
+        assertEquals(0, Alignment.Start.align(0, space1D, LayoutDirection.Ltr))
+        assertEquals(100, Alignment.Start.align(0, space1D, LayoutDirection.Rtl))
     }
 
     @Test
     fun testAlign_centerHorizontally() {
-        assertEquals(
-            50,
-            Alignment.CenterHorizontally.align(0, space1D, LayoutDirection.Ltr)
-        )
-        assertEquals(
-            50,
-            Alignment.CenterHorizontally.align(0, space1D, LayoutDirection.Rtl)
-        )
+        assertEquals(50, Alignment.CenterHorizontally.align(0, space1D, LayoutDirection.Ltr))
+        assertEquals(50, Alignment.CenterHorizontally.align(0, space1D, LayoutDirection.Rtl))
     }
 
     @Test
     fun testAlign_end() {
-        assertEquals(
-            100,
-            Alignment.End.align(0, space1D, LayoutDirection.Ltr)
-        )
-        assertEquals(
-            0,
-            Alignment.End.align(0, space1D, LayoutDirection.Rtl)
-        )
+        assertEquals(100, Alignment.End.align(0, space1D, LayoutDirection.Ltr))
+        assertEquals(0, Alignment.End.align(0, space1D, LayoutDirection.Rtl))
     }
 
     @Test
     fun testAlign_custom2D() {
         val alignment = BiasAlignment(-0.5f, 0.5f)
-        assertEquals(
-            IntOffset(25, 75),
-            alignment.align(IntSize.Zero, space, LayoutDirection.Ltr)
-        )
-        assertEquals(
-            IntOffset(75, 75),
-            alignment.align(IntSize.Zero, space, LayoutDirection.Rtl)
-        )
+        assertEquals(IntOffset(25, 75), alignment.align(IntSize.Zero, space, LayoutDirection.Ltr))
+        assertEquals(IntOffset(75, 75), alignment.align(IntSize.Zero, space, LayoutDirection.Rtl))
     }
 
     @Test
     fun testAlign_custom1D() {
-        assertEquals(
-            75,
-            BiasAlignment.Horizontal(0.5f).align(0, space1D, LayoutDirection.Ltr)
-        )
-        assertEquals(
-            25,
-            BiasAlignment.Horizontal(0.5f).align(0, space1D, LayoutDirection.Rtl)
-        )
-        assertEquals(
-            25,
-            BiasAlignment.Vertical(-0.5f).align(0, space1D)
-        )
+        assertEquals(75, BiasAlignment.Horizontal(0.5f).align(0, space1D, LayoutDirection.Ltr))
+        assertEquals(25, BiasAlignment.Horizontal(0.5f).align(0, space1D, LayoutDirection.Rtl))
+        assertEquals(25, BiasAlignment.Vertical(-0.5f).align(0, space1D))
     }
 
     @Test
     fun testAbsoluteAlign_left() {
-        assertEquals(
-            0,
-            AbsoluteAlignment.Left.align(0, space1D, LayoutDirection.Ltr)
-        )
-        assertEquals(
-            0,
-            AbsoluteAlignment.Left.align(0, space1D, LayoutDirection.Rtl)
-        )
+        assertEquals(0, AbsoluteAlignment.Left.align(0, space1D, LayoutDirection.Ltr))
+        assertEquals(0, AbsoluteAlignment.Left.align(0, space1D, LayoutDirection.Rtl))
     }
 
     @Test
     fun testAbsoluteAlign_right() {
-        assertEquals(
-            100,
-            AbsoluteAlignment.Right.align(0, space1D, LayoutDirection.Ltr)
-        )
-        assertEquals(
-            100,
-            AbsoluteAlignment.Right.align(0, space1D, LayoutDirection.Rtl)
-        )
+        assertEquals(100, AbsoluteAlignment.Right.align(0, space1D, LayoutDirection.Ltr))
+        assertEquals(100, AbsoluteAlignment.Right.align(0, space1D, LayoutDirection.Rtl))
     }
 
     @Test
@@ -329,14 +275,8 @@
     @Test
     fun testAbsoluteAlign_custom2D() {
         val alignment = BiasAbsoluteAlignment(-0.5f, 0.5f)
-        assertEquals(
-            IntOffset(25, 75),
-            alignment.align(IntSize.Zero, space, LayoutDirection.Ltr)
-        )
-        assertEquals(
-            IntOffset(25, 75),
-            alignment.align(IntSize.Zero, space, LayoutDirection.Rtl)
-        )
+        assertEquals(IntOffset(25, 75), alignment.align(IntSize.Zero, space, LayoutDirection.Ltr))
+        assertEquals(IntOffset(25, 75), alignment.align(IntSize.Zero, space, LayoutDirection.Rtl))
     }
 
     @Test
diff --git a/compose/ui/ui/src/androidUnitTest/kotlin/androidx/compose/ui/layout/ConstraintsTest.kt b/compose/ui/ui/src/androidUnitTest/kotlin/androidx/compose/ui/layout/ConstraintsTest.kt
index a9e5e8b..0615423 100644
--- a/compose/ui/ui/src/androidUnitTest/kotlin/androidx/compose/ui/layout/ConstraintsTest.kt
+++ b/compose/ui/ui/src/androidUnitTest/kotlin/androidx/compose/ui/layout/ConstraintsTest.kt
@@ -128,18 +128,10 @@
     @Test
     fun constrain_constraints() {
         val constraints = Constraints(5, 10, 5, 10)
-        Constraints(4, 11, 4, 11).constrain(constraints).assertEquals(
-            5, 10, 5, 10
-        )
-        Constraints(7, 9, 7, 9).constrain(constraints).assertEquals(
-            7, 9, 7, 9
-        )
-        Constraints(2, 3, 2, 3).constrain(constraints).assertEquals(
-            3, 3, 3, 3
-        )
-        Constraints(10, 11, 10, 11).constrain(constraints).assertEquals(
-            10, 10, 10, 10
-        )
+        Constraints(4, 11, 4, 11).constrain(constraints).assertEquals(5, 10, 5, 10)
+        Constraints(7, 9, 7, 9).constrain(constraints).assertEquals(7, 9, 7, 9)
+        Constraints(2, 3, 2, 3).constrain(constraints).assertEquals(3, 3, 3, 3)
+        Constraints(10, 11, 10, 11).constrain(constraints).assertEquals(10, 10, 10, 10)
     }
 
     @Test
@@ -165,12 +157,8 @@
     @Test
     fun offset() {
         val constraints = Constraints(2, 2, 5, 5)
-        constraints.offset(horizontal = 2, vertical = 3).assertEquals(
-            4, 4, 8, 8
-        )
-        constraints.offset(horizontal = -7, vertical = -7).assertEquals(
-            0, 0, 0, 0
-        )
+        constraints.offset(horizontal = 2, vertical = 3).assertEquals(4, 4, 8, 8)
+        constraints.offset(horizontal = -7, vertical = -7).assertEquals(0, 0, 0, 0)
     }
 
     @Test
@@ -229,37 +217,37 @@
         assertEquals(Constraints.Infinity, constraints3.maxHeight)
         assertEquals(250_001, constraints3.maxWidth)
 
-        val constraints4 =
-            Constraints.fitPrioritizingWidth(30_000, 30_001, 60_000, 60_001)
+        val constraints4 = Constraints.fitPrioritizingWidth(30_000, 30_001, 60_000, 60_001)
         assertEquals(30_000, constraints4.minWidth)
         assertEquals(30_001, constraints4.maxWidth)
         assertEquals(60_000, constraints4.minHeight)
         assertEquals(60_001, constraints4.maxHeight)
 
-        val constraints5 =
-            Constraints.fitPrioritizingWidth(60_000, 60_001, 30_000, 30_001)
+        val constraints5 = Constraints.fitPrioritizingWidth(60_000, 60_001, 30_000, 30_001)
         assertEquals(60_000, constraints5.minWidth)
         assertEquals(60_001, constraints5.maxWidth)
         assertEquals(30_000, constraints5.minHeight)
         assertEquals(30_001, constraints5.maxHeight)
 
-        val constraints6 = Constraints.fitPrioritizingWidth(
-            30_000,
-            Constraints.Infinity,
-            60_000,
-            Constraints.Infinity
-        )
+        val constraints6 =
+            Constraints.fitPrioritizingWidth(
+                30_000,
+                Constraints.Infinity,
+                60_000,
+                Constraints.Infinity
+            )
         assertEquals(30_000, constraints6.minWidth)
         assertEquals(Constraints.Infinity, constraints6.maxWidth)
         assertEquals(60_000, constraints6.minHeight)
         assertEquals(Constraints.Infinity, constraints6.maxHeight)
 
-        val constraints7 = Constraints.fitPrioritizingWidth(
-            60_000,
-            Constraints.Infinity,
-            30_000,
-            Constraints.Infinity
-        )
+        val constraints7 =
+            Constraints.fitPrioritizingWidth(
+                60_000,
+                Constraints.Infinity,
+                30_000,
+                Constraints.Infinity
+            )
         assertEquals(60_000, constraints7.minWidth)
         assertEquals(Constraints.Infinity, constraints7.maxWidth)
         assertEquals(30_000, constraints7.minHeight)
@@ -279,12 +267,13 @@
         assertEquals(maxFocus, constraints1.maxWidth)
         assertEquals(maxNonFocus, constraints1.maxHeight)
 
-        val constraints2 = Constraints.fitPrioritizingWidth(
-            maxFocus,
-            Constraints.Infinity,
-            maxNonFocus,
-            Constraints.Infinity
-        )
+        val constraints2 =
+            Constraints.fitPrioritizingWidth(
+                maxFocus,
+                Constraints.Infinity,
+                maxNonFocus,
+                Constraints.Infinity
+            )
         assertEquals(maxFocus, constraints2.minWidth)
         assertEquals(Constraints.Infinity, constraints2.maxWidth)
         assertEquals(maxNonFocus, constraints2.minHeight)
@@ -297,12 +286,13 @@
         assertEquals(maxFocus, constraints3.minHeight)
         assertEquals(maxFocus, constraints3.maxHeight)
 
-        val constraints4 = Constraints.fitPrioritizingWidth(
-            maxNonFocus,
-            Constraints.Infinity,
-            maxFocus,
-            Constraints.Infinity
-        )
+        val constraints4 =
+            Constraints.fitPrioritizingWidth(
+                maxNonFocus,
+                Constraints.Infinity,
+                maxFocus,
+                Constraints.Infinity
+            )
         assertEquals(maxNonFocus, constraints4.minWidth)
         assertEquals(Constraints.Infinity, constraints4.maxWidth)
         assertEquals(maxFocus, constraints4.minHeight)
@@ -315,12 +305,13 @@
         assertEquals(minFocus, constraints5.maxWidth)
         assertEquals(minNonFocus, constraints5.maxHeight)
 
-        val constraints6 = Constraints.fitPrioritizingWidth(
-            minFocus,
-            Constraints.Infinity,
-            minNonFocus,
-            Constraints.Infinity
-        )
+        val constraints6 =
+            Constraints.fitPrioritizingWidth(
+                minFocus,
+                Constraints.Infinity,
+                minNonFocus,
+                Constraints.Infinity
+            )
         assertEquals(minFocus, constraints6.minWidth)
         assertEquals(Constraints.Infinity, constraints6.maxWidth)
         assertEquals(minNonFocus, constraints6.minHeight)
@@ -333,12 +324,13 @@
         assertEquals(minFocus, constraints7.minHeight)
         assertEquals(minFocus, constraints7.maxHeight)
 
-        val constraints8 = Constraints.fitPrioritizingWidth(
-            minNonFocus,
-            Constraints.Infinity,
-            minFocus,
-            Constraints.Infinity
-        )
+        val constraints8 =
+            Constraints.fitPrioritizingWidth(
+                minNonFocus,
+                Constraints.Infinity,
+                minFocus,
+                Constraints.Infinity
+            )
         assertEquals(minNonFocus, constraints8.minWidth)
         assertEquals(Constraints.Infinity, constraints8.maxWidth)
         assertEquals(minFocus, constraints8.minHeight)
@@ -358,12 +350,13 @@
         assertEquals(maxFocus, constraints1.maxWidth)
         assertEquals(maxNonFocus, constraints1.maxHeight)
 
-        val constraints2 = Constraints.fitPrioritizingWidth(
-            1_000_000,
-            Constraints.Infinity,
-            1_000_000,
-            Constraints.Infinity
-        )
+        val constraints2 =
+            Constraints.fitPrioritizingWidth(
+                1_000_000,
+                Constraints.Infinity,
+                1_000_000,
+                Constraints.Infinity
+            )
         assertEquals(maxFocus, constraints2.minWidth)
         assertEquals(Constraints.Infinity, constraints2.maxWidth)
         assertEquals(maxNonFocus, constraints2.minHeight)
@@ -376,12 +369,13 @@
         assertEquals(maxFocus, constraints3.minHeight)
         assertEquals(maxFocus, constraints3.maxHeight)
 
-        val constraints4 = Constraints.fitPrioritizingWidth(
-            minNonFocus,
-            Constraints.Infinity,
-            1_000_000,
-            Constraints.Infinity
-        )
+        val constraints4 =
+            Constraints.fitPrioritizingWidth(
+                minNonFocus,
+                Constraints.Infinity,
+                1_000_000,
+                Constraints.Infinity
+            )
         assertEquals(minNonFocus, constraints4.minWidth)
         assertEquals(Constraints.Infinity, constraints4.maxWidth)
         assertEquals(minFocus, constraints4.minHeight)
@@ -394,45 +388,49 @@
         val maxNonFocus = (1 shl 13) - 2
         val minFocus = (1 shl 16) - 2
         val minNonFocus = (1 shl 15) - 2
-        val constraints1 = Constraints.fitPrioritizingHeight(
-            1_000_000,
-            1_000_000,
-            1_000_000,
-            1_000_000,
-        )
+        val constraints1 =
+            Constraints.fitPrioritizingHeight(
+                1_000_000,
+                1_000_000,
+                1_000_000,
+                1_000_000,
+            )
         assertEquals(maxNonFocus, constraints1.minWidth)
         assertEquals(maxNonFocus, constraints1.maxWidth)
         assertEquals(maxFocus, constraints1.minHeight)
         assertEquals(maxFocus, constraints1.maxHeight)
 
-        val constraints2 = Constraints.fitPrioritizingHeight(
-            1_000_000,
-            Constraints.Infinity,
-            1_000_000,
-            Constraints.Infinity,
-        )
+        val constraints2 =
+            Constraints.fitPrioritizingHeight(
+                1_000_000,
+                Constraints.Infinity,
+                1_000_000,
+                Constraints.Infinity,
+            )
         assertEquals(maxNonFocus, constraints2.minWidth)
         assertEquals(Constraints.Infinity, constraints2.maxWidth)
         assertEquals(maxFocus, constraints2.minHeight)
         assertEquals(Constraints.Infinity, constraints2.maxHeight)
 
-        val constraints3 = Constraints.fitPrioritizingHeight(
-            1_000_000,
-            1_000_000,
-            0,
-            Constraints.Infinity,
-        )
+        val constraints3 =
+            Constraints.fitPrioritizingHeight(
+                1_000_000,
+                1_000_000,
+                0,
+                Constraints.Infinity,
+            )
         assertEquals(maxFocus, constraints3.minWidth)
         assertEquals(maxFocus, constraints3.maxWidth)
         assertEquals(0, constraints3.minHeight)
         assertEquals(Constraints.Infinity, constraints3.maxHeight)
 
-        val constraints4 = Constraints.fitPrioritizingHeight(
-            1_000_000,
-            Constraints.Infinity,
-            minNonFocus,
-            Constraints.Infinity,
-        )
+        val constraints4 =
+            Constraints.fitPrioritizingHeight(
+                1_000_000,
+                Constraints.Infinity,
+                minNonFocus,
+                Constraints.Infinity,
+            )
         assertEquals(minNonFocus, constraints4.minHeight)
         assertEquals(Constraints.Infinity, constraints4.maxHeight)
         assertEquals(minFocus, constraints4.minWidth)
@@ -445,12 +443,13 @@
         minHeight: Int = 0,
         maxHeight: Int = Constraints.Infinity
     ) {
-        val constraints = Constraints(
-            minWidth = minWidth,
-            minHeight = minHeight,
-            maxWidth = maxWidth,
-            maxHeight = maxHeight
-        )
+        val constraints =
+            Constraints(
+                minWidth = minWidth,
+                minHeight = minHeight,
+                maxWidth = maxWidth,
+                maxHeight = maxHeight
+            )
         assertEquals(minWidth, constraints.minWidth)
         assertEquals(minHeight, constraints.minHeight)
         assertEquals(maxWidth, constraints.maxWidth)
@@ -464,8 +463,10 @@
         maxHeight: Int
     ) {
         assertTrue(
-            this.minWidth == minWidth && this.maxWidth == maxWidth &&
-                this.minHeight == minHeight && this.maxHeight == maxHeight
+            this.minWidth == minWidth &&
+                this.maxWidth == maxWidth &&
+                this.minHeight == minHeight &&
+                this.maxHeight == maxHeight
         )
     }
 
diff --git a/compose/ui/ui/src/androidUnitTest/kotlin/androidx/compose/ui/layout/ContentScaleTest.kt b/compose/ui/ui/src/androidUnitTest/kotlin/androidx/compose/ui/layout/ContentScaleTest.kt
index 6743d68..5c4612a 100644
--- a/compose/ui/ui/src/androidUnitTest/kotlin/androidx/compose/ui/layout/ContentScaleTest.kt
+++ b/compose/ui/ui/src/androidUnitTest/kotlin/androidx/compose/ui/layout/ContentScaleTest.kt
@@ -27,60 +27,66 @@
 
     @Test
     fun testScaleNone() {
-        val scale = ContentScale.None.computeScaleFactor(
-            srcSize = Size(100.0f, 100.0f),
-            dstSize = Size(200.0f, 200.0f)
-        )
+        val scale =
+            ContentScale.None.computeScaleFactor(
+                srcSize = Size(100.0f, 100.0f),
+                dstSize = Size(200.0f, 200.0f)
+            )
         assertEquals(1.0f, scale.scaleX)
         assertEquals(1.0f, scale.scaleY)
     }
 
     @Test
     fun testContentScaleFit() {
-        val scale = ContentScale.Fit.computeScaleFactor(
-            srcSize = Size(200.0f, 100.0f),
-            dstSize = Size(100.0f, 200.0f)
-        )
+        val scale =
+            ContentScale.Fit.computeScaleFactor(
+                srcSize = Size(200.0f, 100.0f),
+                dstSize = Size(100.0f, 200.0f)
+            )
         assertEquals(.5f, scale.scaleX)
         assertEquals(.5f, scale.scaleY)
     }
 
     @Test
     fun testContentScaleFillWidth() {
-        val scale = ContentScale.FillWidth.computeScaleFactor(
-            srcSize = Size(400.0f, 100.0f),
-            dstSize = Size(100.0f, 200.0f)
-        )
+        val scale =
+            ContentScale.FillWidth.computeScaleFactor(
+                srcSize = Size(400.0f, 100.0f),
+                dstSize = Size(100.0f, 200.0f)
+            )
         assertEquals(0.25f, scale.scaleX)
         assertEquals(0.25f, scale.scaleY)
     }
 
     @Test
     fun testScaleFillHeight() {
-        val scale = ContentScale.FillHeight.computeScaleFactor(
-            srcSize = Size(400.0f, 100.0f),
-            dstSize = Size(100.0f, 200.0f)
-        )
+        val scale =
+            ContentScale.FillHeight.computeScaleFactor(
+                srcSize = Size(400.0f, 100.0f),
+                dstSize = Size(100.0f, 200.0f)
+            )
         assertEquals(2.0f, scale.scaleX)
         assertEquals(2.0f, scale.scaleY)
     }
 
     @Test
     fun testContentScaleCrop() {
-        val scale = ContentScale.Crop.computeScaleFactor(
-            srcSize = Size(400.0f, 100.0f),
-            dstSize = Size(100.0f, 200.0f)
-        )
+        val scale =
+            ContentScale.Crop.computeScaleFactor(
+                srcSize = Size(400.0f, 100.0f),
+                dstSize = Size(100.0f, 200.0f)
+            )
         assertEquals(2.0f, scale.scaleX)
         assertEquals(2.0f, scale.scaleY)
     }
 
     @Test
     fun testContentScaleInside() {
-        val scale = ContentScale.Inside.computeScaleFactor(
-            srcSize = Size(400.0f, 100.0f),
-            dstSize = Size(100.0f, 200.0f)
-        )
+        val scale =
+            ContentScale.Inside.computeScaleFactor(
+                srcSize = Size(400.0f, 100.0f),
+                dstSize = Size(100.0f, 200.0f)
+            )
         assertEquals(0.25f, scale.scaleX)
         assertEquals(0.25f, scale.scaleY)
     }
@@ -88,50 +94,55 @@
     @Test
     fun testContentScaleInsideLargeDst() {
         // If the src is smaller than the destination, ensure no scaling is done
-        val scale = ContentScale.Inside.computeScaleFactor(
-            srcSize = Size(400.0f, 100.0f),
-            dstSize = Size(900.0f, 200.0f)
-        )
+        val scale =
+            ContentScale.Inside.computeScaleFactor(
+                srcSize = Size(400.0f, 100.0f),
+                dstSize = Size(900.0f, 200.0f)
+            )
         assertEquals(1.0f, scale.scaleX)
         assertEquals(1.0f, scale.scaleY)
     }
 
     @Test
     fun testContentFitInsideLargeDst() {
-        val scale = ContentScale.Fit.computeScaleFactor(
-            srcSize = Size(400.0f, 100.0f),
-            dstSize = Size(900.0f, 200.0f)
-        )
+        val scale =
+            ContentScale.Fit.computeScaleFactor(
+                srcSize = Size(400.0f, 100.0f),
+                dstSize = Size(900.0f, 200.0f)
+            )
         assertEquals(2.0f, scale.scaleX)
         assertEquals(2.0f, scale.scaleY)
     }
 
     @Test
     fun testContentScaleCropWidth() {
-        val scale = ContentScale.Crop.computeScaleFactor(
-            srcSize = Size(100.0f, 400.0f),
-            dstSize = Size(200.0f, 200.0f)
-        )
+        val scale =
+            ContentScale.Crop.computeScaleFactor(
+                srcSize = Size(100.0f, 400.0f),
+                dstSize = Size(200.0f, 200.0f)
+            )
         assertEquals(2.00f, scale.scaleX)
         assertEquals(2.00f, scale.scaleY)
     }
 
     @Test
     fun testContentScaleCropHeight() {
-        val scale = ContentScale.Crop.computeScaleFactor(
-            srcSize = Size(300.0f, 100.0f),
-            dstSize = Size(200.0f, 200.0f)
-        )
+        val scale =
+            ContentScale.Crop.computeScaleFactor(
+                srcSize = Size(300.0f, 100.0f),
+                dstSize = Size(200.0f, 200.0f)
+            )
         assertEquals(2.00f, scale.scaleX)
         assertEquals(2.00f, scale.scaleY)
     }
 
     @Test
     fun testContentScaleFillBoundsUp() {
-        val scale = ContentScale.FillBounds.computeScaleFactor(
-            srcSize = Size(100f, 100f),
-            dstSize = Size(300f, 700f)
-        )
+        val scale =
+            ContentScale.FillBounds.computeScaleFactor(
+                srcSize = Size(100f, 100f),
+                dstSize = Size(300f, 700f)
+            )
         assertEquals(3.0f, scale.scaleX)
         assertEquals(7.0f, scale.scaleY)
     }
diff --git a/compose/ui/ui/src/androidUnitTest/kotlin/androidx/compose/ui/modifier/ModifierLocalMapTest.kt b/compose/ui/ui/src/androidUnitTest/kotlin/androidx/compose/ui/modifier/ModifierLocalMapTest.kt
index 9aa0d93..0d0c0fe 100644
--- a/compose/ui/ui/src/androidUnitTest/kotlin/androidx/compose/ui/modifier/ModifierLocalMapTest.kt
+++ b/compose/ui/ui/src/androidUnitTest/kotlin/androidx/compose/ui/modifier/ModifierLocalMapTest.kt
@@ -22,7 +22,8 @@
 import kotlin.test.Test
 
 class ModifierLocalMapTest {
-    @Test fun `empty modifier local map`() {
+    @Test
+    fun `empty modifier local map`() {
         // Act.
         val modifierLocalMap = modifierLocalMapOf()
 
@@ -30,7 +31,8 @@
         assertThat(modifierLocalMap).isEqualTo(EmptyMap)
     }
 
-    @Test fun `modifier local map with a single null entry`() {
+    @Test
+    fun `modifier local map with a single null entry`() {
         // Arrange.
         val modifierLocal = modifierLocalOf { "" }
 
@@ -41,7 +43,9 @@
         assertThat(modifierLocalMap).isInstanceOf(SingleLocalMap::class.java)
         assertThat(modifierLocalMap[modifierLocal]).isNull()
     }
-    @Test fun `modifier local map with two null entries`() {
+
+    @Test
+    fun `modifier local map with two null entries`() {
         // Arrange.
         val stringModifierLocal = modifierLocalOf<String?> { "" }
         val colorModifierLocal = modifierLocalOf<Color?> { Color.Unspecified }
@@ -55,7 +59,8 @@
         assertThat(modifierLocalMap[colorModifierLocal]).isNull()
     }
 
-    @Test fun `modifier local map with three null entries`() {
+    @Test
+    fun `modifier local map with three null entries`() {
         // Arrange.
         val stringModifierLocal = modifierLocalOf { "" }
         val colorModifierLocal = modifierLocalOf { Color.Unspecified }
@@ -72,7 +77,8 @@
         assertThat(modifierLocalMap[directionModifierLocal]).isNull()
     }
 
-    @Test fun `modifier local map with a single entry`() {
+    @Test
+    fun `modifier local map with a single entry`() {
         // Arrange.
         val modifierLocal = modifierLocalOf { "" }
 
@@ -84,16 +90,15 @@
         assertThat(modifierLocalMap[modifierLocal]).isEqualTo("single")
     }
 
-    @Test fun `modifier local map with two values`() {
+    @Test
+    fun `modifier local map with two values`() {
         // Arrange.
         val stringModifierLocal = modifierLocalOf { "" }
         val colorModifierLocal = modifierLocalOf { Color.Unspecified }
 
         // Act.
-        val modifierLocalMap = modifierLocalMapOf(
-            stringModifierLocal to "first",
-            colorModifierLocal to Color.Red
-        )
+        val modifierLocalMap =
+            modifierLocalMapOf(stringModifierLocal to "first", colorModifierLocal to Color.Red)
 
         // Assert.
         assertThat(modifierLocalMap).isInstanceOf(MultiLocalMap::class.java)
@@ -101,18 +106,20 @@
         assertThat(modifierLocalMap[colorModifierLocal]).isEqualTo(Color.Red)
     }
 
-    @Test fun `modifier local map with three values`() {
+    @Test
+    fun `modifier local map with three values`() {
         // Arrange.
         val stringModifierLocal = modifierLocalOf { "" }
         val colorModifierLocal = modifierLocalOf { Color.Unspecified }
         val directionModifierLocal = modifierLocalOf { LayoutDirection.Ltr }
 
         // Act.
-        val modifierLocalMap = modifierLocalMapOf(
-            stringModifierLocal to "first",
-            colorModifierLocal to Color.Red,
-            directionModifierLocal to LayoutDirection.Rtl
-        )
+        val modifierLocalMap =
+            modifierLocalMapOf(
+                stringModifierLocal to "first",
+                colorModifierLocal to Color.Red,
+                directionModifierLocal to LayoutDirection.Rtl
+            )
 
         // Assert.
         assertThat(modifierLocalMap).isInstanceOf(MultiLocalMap::class.java)
diff --git a/compose/ui/ui/src/androidUnitTest/kotlin/androidx/compose/ui/node/DelegatingNodeTest.kt b/compose/ui/ui/src/androidUnitTest/kotlin/androidx/compose/ui/node/DelegatingNodeTest.kt
index 30c59065..c1363c7 100644
--- a/compose/ui/ui/src/androidUnitTest/kotlin/androidx/compose/ui/node/DelegatingNodeTest.kt
+++ b/compose/ui/ui/src/androidUnitTest/kotlin/androidx/compose/ui/node/DelegatingNodeTest.kt
@@ -33,8 +33,7 @@
 
     @Test
     fun testKindSetIncludesDelegates() {
-        assertThat(DelegatedWrapper { DrawMod() }.kindSet)
-            .isEqualTo(Nodes.Any or Nodes.Draw)
+        assertThat(DelegatedWrapper { DrawMod() }.kindSet).isEqualTo(Nodes.Any or Nodes.Draw)
     }
 
     @Test
@@ -60,8 +59,9 @@
         assert(chain.has(Nodes.Semantics))
 
         assert(a.kindSet == Nodes.Any or Nodes.Draw)
-        assert(a.aggregateChildKindSet ==
-            Nodes.Any or Nodes.Draw or Nodes.Layout or Nodes.Semantics)
+        assert(
+            a.aggregateChildKindSet == Nodes.Any or Nodes.Draw or Nodes.Layout or Nodes.Semantics
+        )
 
         assert(b.kindSet == Nodes.Any or Nodes.Layout)
         assert(b.aggregateChildKindSet == Nodes.Any or Nodes.Layout or Nodes.Semantics)
@@ -82,13 +82,15 @@
     fun testNestedDelegatesHaveNodePointersCorrectlyUpdated() {
         val d = DrawMod()
         val c = DrawMod()
-        val b = object : DelegatingNode() {
-            val c = delegate(c)
-        }
-        val a = object : DelegatingNode() {
-            val b = delegate(b)
-            val d = delegate(d)
-        }
+        val b =
+            object : DelegatingNode() {
+                val c = delegate(c)
+            }
+        val a =
+            object : DelegatingNode() {
+                val b = delegate(b)
+                val d = delegate(d)
+            }
 
         assert(a.node === a)
         assert(b.node === a)
@@ -106,12 +108,14 @@
 
     @Test
     fun testAsKindReturnsSelf() {
-        val node = object : DrawModifierNode, DelegatingNode() {
-            val wrapped = delegate(DrawMod())
-            override fun ContentDrawScope.draw() {
-                with(wrapped) { draw() }
+        val node =
+            object : DrawModifierNode, DelegatingNode() {
+                val wrapped = delegate(DrawMod())
+
+                override fun ContentDrawScope.draw() {
+                    with(wrapped) { draw() }
+                }
             }
-        }
         assert(node.isKind(Nodes.Draw))
         assert(node.asKind(Nodes.Draw) is DrawModifierNode)
         assert(node.asKind(Nodes.Draw) === node)
@@ -119,10 +123,11 @@
 
     @Test
     fun testAsKindMultipleDelegatesReturnsLast() {
-        val node = object : DelegatingNode() {
-            val first = delegate(DrawMod())
-            val second = delegate(DrawMod())
-        }
+        val node =
+            object : DelegatingNode() {
+                val first = delegate(DrawMod())
+                val second = delegate(DrawMod())
+            }
         assert(node.isKind(Nodes.Draw))
         assert(node.asKind(Nodes.Draw) is DrawModifierNode)
         assert(node.asKind(Nodes.Draw) === node.second)
@@ -130,42 +135,46 @@
 
     @Test
     fun testDispatchForMultipleDelegatesSameKind() {
-        val node = object : DelegatingNode() {
-            val first = delegate(DelegatedWrapper { DrawMod("first") })
-            val second = delegate(DrawMod("second"))
-        }
+        val node =
+            object : DelegatingNode() {
+                val first = delegate(DelegatedWrapper { DrawMod("first") })
+                val second = delegate(DrawMod("second"))
+            }
         assertDispatchOrder(node, Nodes.Draw, node.first.wrapped, node.second)
     }
 
     @Test
     fun testDispatchForSelfOnlyDispatchesToSelf() {
-        val node = object : DrawModifierNode, DelegatingNode() {
-            val wrapped = delegate(DrawMod())
-            override fun ContentDrawScope.draw() {
-                with(wrapped) { draw() }
+        val node =
+            object : DrawModifierNode, DelegatingNode() {
+                val wrapped = delegate(DrawMod())
+
+                override fun ContentDrawScope.draw() {
+                    with(wrapped) { draw() }
+                }
             }
-        }
         assertDispatchOrder(node, Nodes.Draw, node)
     }
 
     @Test
     fun testDispatchNestedSelfStops() {
-        val node = object : DelegatingNode() {
-            val first = delegate(DrawMod())
-            val second = delegate(DrawMod())
-            val third = delegate(object : DrawModifierNode, DelegatingNode() {
+        val node =
+            object : DelegatingNode() {
                 val first = delegate(DrawMod())
                 val second = delegate(DrawMod())
-                override fun ContentDrawScope.draw() {
-                    with(first) { draw() }
-                }
-            })
-        }
-        assertDispatchOrder(node, Nodes.Draw,
-            node.first,
-            node.second,
-            node.third
-        )
+                val third =
+                    delegate(
+                        object : DrawModifierNode, DelegatingNode() {
+                            val first = delegate(DrawMod())
+                            val second = delegate(DrawMod())
+
+                            override fun ContentDrawScope.draw() {
+                                with(first) { draw() }
+                            }
+                        }
+                    )
+            }
+        assertDispatchOrder(node, Nodes.Draw, node.first, node.second, node.third)
     }
 
     @Test
@@ -202,12 +211,14 @@
         val recorder = Recorder()
         x.visitSubtree(Nodes.Draw, recorder)
         assertThat(recorder.recorded)
-            .isEqualTo(listOf(
-                a.wrapped,
-                b,
-                d,
-                c.wrapped,
-            ))
+            .isEqualTo(
+                listOf(
+                    a.wrapped,
+                    b,
+                    d,
+                    c.wrapped,
+                )
+            )
     }
 
     @Test
@@ -217,22 +228,18 @@
         val b = DrawMod("b")
         val c = DelegatedWrapper { DrawMod("c") }
         val d = DrawMod("d")
-        layout(a) {
-            layout(b) {
-                layout(c) {
-                    layout(d, x)
-                }
-            }
-        }
+        layout(a) { layout(b) { layout(c) { layout(d, x) } } }
         val recorder = Recorder()
         x.visitAncestors(Nodes.Draw, block = recorder)
         assertThat(recorder.recorded)
-            .isEqualTo(listOf(
-                d,
-                c.wrapped,
-                b,
-                a.wrapped,
-            ))
+            .isEqualTo(
+                listOf(
+                    d,
+                    c.wrapped,
+                    b,
+                    a.wrapped,
+                )
+            )
     }
 
     @Test
@@ -346,8 +353,9 @@
         assert(a.kindSet == Nodes.Any or Nodes.Layout)
         assert(b.kindSet == Nodes.Any or Nodes.Semantics)
         assert(c.kindSet == Nodes.Any or Nodes.Draw)
-        assert(a.aggregateChildKindSet ==
-            Nodes.Any or Nodes.Draw or Nodes.Semantics or Nodes.Layout)
+        assert(
+            a.aggregateChildKindSet == Nodes.Any or Nodes.Draw or Nodes.Semantics or Nodes.Layout
+        )
         assert(b.aggregateChildKindSet == Nodes.Any or Nodes.Draw or Nodes.Semantics)
         assert(c.aggregateChildKindSet == Nodes.Any or Nodes.Draw)
 
@@ -412,8 +420,9 @@
         assert(chain.has(Nodes.Semantics))
         assert(chain.has(Nodes.Layout))
         assert(node.kindSet == Nodes.Any or Nodes.Draw or Nodes.Semantics or Nodes.Layout)
-        assert(node.aggregateChildKindSet ==
-            Nodes.Any or Nodes.Draw or Nodes.Semantics or Nodes.Layout)
+        assert(
+            node.aggregateChildKindSet == Nodes.Any or Nodes.Draw or Nodes.Semantics or Nodes.Layout
+        )
 
         node.undelegateUnprotected(draw)
         assert(!chain.has(Nodes.Draw))
@@ -464,8 +473,9 @@
         assert(chain.has(Nodes.Semantics))
         assert(chain.has(Nodes.Layout))
         assert(node.kindSet == Nodes.Any or Nodes.Draw or Nodes.Semantics or Nodes.Layout)
-        assert(node.aggregateChildKindSet ==
-            Nodes.Any or Nodes.Draw or Nodes.Semantics or Nodes.Layout)
+        assert(
+            node.aggregateChildKindSet == Nodes.Any or Nodes.Draw or Nodes.Semantics or Nodes.Layout
+        )
 
         sem.undelegateUnprotected(lm)
         assert(chain.has(Nodes.Draw))
@@ -517,11 +527,12 @@
 
     @Test
     fun testInvalidateInsertedNode() {
-        val node = object : DelegatingNode() {
-            val draw = delegate(DrawMod())
-            val layout = delegate(LayoutMod())
-            val semantics = delegate(SemanticsMod())
-        }
+        val node =
+            object : DelegatingNode() {
+                val draw = delegate(DrawMod())
+                val layout = delegate(LayoutMod())
+                val semantics = delegate(SemanticsMod())
+            }
         val chain = layout(node)
         chain.clearInvalidations()
 
@@ -534,13 +545,10 @@
 
     @Test
     fun testNestedNodeInvalidation() {
-        val node = object : DelegatingNode() {
-            val wrapped = delegate(
-                DelegatedWrapper {
-                    DelegatedWrapper { DrawMod() }
-                }
-            )
-        }
+        val node =
+            object : DelegatingNode() {
+                val wrapped = delegate(DelegatedWrapper { DelegatedWrapper { DrawMod() } })
+            }
         val chain = layout(node)
         chain.clearInvalidations()
 
@@ -553,9 +561,10 @@
 
     @Test
     fun testDelegateUndelegateCausesInvalidationsForDelegateKindsOnly() {
-        val node = object : DelegatingNode() {
-            val semantics = delegate(SemanticsMod())
-        }
+        val node =
+            object : DelegatingNode() {
+                val semantics = delegate(SemanticsMod())
+            }
         val chain = layout(node)
         chain.clearInvalidations()
 
@@ -666,15 +675,16 @@
     @Test
     fun testDelegateInAttachUndelegateInDetach() {
         val b = DrawMod()
-        val a = object : DelegatingNode() {
-            override fun onAttach() {
-                delegate(b)
-            }
+        val a =
+            object : DelegatingNode() {
+                override fun onAttach() {
+                    delegate(b)
+                }
 
-            override fun onDetach() {
-                undelegate(b)
+                override fun onDetach() {
+                    undelegate(b)
+                }
             }
-        }
 
         // not attached yet or delegated yet
         assert(!a.isAttached)
@@ -716,11 +726,12 @@
     @Test
     fun testDelegateInAttach() {
         val b = DrawMod()
-        val a = object : DelegatingNode() {
-            override fun onAttach() {
-                delegate(b)
+        val a =
+            object : DelegatingNode() {
+                override fun onAttach() {
+                    delegate(b)
+                }
             }
-        }
 
         // not attached yet or delegated yet
         assert(!a.isAttached)
@@ -807,15 +818,18 @@
 
 internal data class NodeElement(val node: Modifier.Node) : ModifierNodeElement<Modifier.Node>() {
     override fun create(): Modifier.Node = node
+
     override fun update(node: Modifier.Node) {}
 }
 
 class Recorder : (Any) -> Unit {
     val recorded = mutableListOf<Any>()
+
     override fun invoke(p1: Any) {
         recorded.add(p1)
     }
 }
+
 internal class LayoutScopeImpl(val layout: LayoutNode) : LayoutScope {
     override fun layout(vararg modifiers: Modifier.Node, block: LayoutScope.() -> Unit) {
         val ln = LayoutNode()
@@ -828,8 +842,10 @@
         LayoutScopeImpl(ln).block()
     }
 }
+
 interface LayoutScope {
     fun layout(vararg modifiers: Modifier.Node) = layout(*modifiers) {}
+
     fun layout(vararg modifiers: Modifier.Node, block: LayoutScope.() -> Unit)
 }
 
@@ -839,21 +855,21 @@
     vararg expected: T
 ) {
     val dispatches = mutableListOf<T>()
-    node.dispatchForKind(kind) {
-        dispatches.add(it)
-    }
+    node.dispatchForKind(kind) { dispatches.add(it) }
     assertThat(dispatches.toTypedArray()).isEqualTo(expected)
 }
 
 class DrawMod(val id: String = "") : DrawModifierNode, Modifier.Node() {
     override fun ContentDrawScope.draw() {}
+
     override fun toString(): String {
         return "DrawMod($id)"
     }
 }
 
 class SemanticsMod(val id: String = "") : SemanticsModifierNode, Modifier.Node() {
-    override fun SemanticsPropertyReceiver.applySemantics() { }
+    override fun SemanticsPropertyReceiver.applySemantics() {}
+
     override fun toString(): String {
         return "SemanticsMod($id)"
     }
@@ -865,10 +881,9 @@
         constraints: Constraints
     ): MeasureResult {
         val placeable = measurable.measure(constraints)
-        return layout(placeable.width, placeable.height) {
-            placeable.place(0, 0)
-        }
+        return layout(placeable.width, placeable.height) { placeable.place(0, 0) }
     }
+
     override fun toString(): String {
         return "LayoutMod($id)"
     }
@@ -876,6 +891,7 @@
 
 class DelegatedWrapper<T : Modifier.Node>(fn: () -> T) : DelegatingNode() {
     val wrapped = delegate(fn())
+
     override fun toString(): String = "Wrapped<$wrapped>"
 }
 
@@ -883,9 +899,7 @@
     if (!isKind(kind)) return null
     if (this is T) return this
     if (this is DelegatingNode) {
-        forEachDelegateBreadthFirst {
-            if (it is T) return it
-        }
+        forEachDelegateBreadthFirst { if (it is T) return it }
     }
     return null
 }
diff --git a/compose/ui/ui/src/androidUnitTest/kotlin/androidx/compose/ui/node/HitTestResultTest.kt b/compose/ui/ui/src/androidUnitTest/kotlin/androidx/compose/ui/node/HitTestResultTest.kt
index f23209c..8353e97 100644
--- a/compose/ui/ui/src/androidUnitTest/kotlin/androidx/compose/ui/node/HitTestResultTest.kt
+++ b/compose/ui/ui/src/androidUnitTest/kotlin/androidx/compose/ui/node/HitTestResultTest.kt
@@ -28,9 +28,7 @@
     fun testHit() {
         val hitTestResult = HitTestResult()
         hitTestResult.hit("Hello", true) {
-            hitTestResult.hit("World", true) {
-                assertThat(hitTestResult.hasHit()).isFalse()
-            }
+            hitTestResult.hit("World", true) { assertThat(hitTestResult.hasHit()).isFalse() }
             assertThat(hitTestResult.hasHit()).isTrue()
         }
         assertThat(hitTestResult.hasHit()).isTrue()
@@ -51,9 +49,7 @@
     fun testHitClipped() {
         val hitTestResult = HitTestResult()
         hitTestResult.hit("Hello", false) {
-            hitTestResult.hit("World", false) {
-                assertThat(hitTestResult.hasHit()).isFalse()
-            }
+            hitTestResult.hit("World", false) { assertThat(hitTestResult.hasHit()).isFalse() }
             assertThat(hitTestResult.hasHit()).isFalse()
         }
         assertThat(hitTestResult.hasHit()).isFalse()
@@ -74,7 +70,7 @@
     fun testHitInMinimumTouchTarget() {
         val hitTestResult = HitTestResult()
         hitTestResult.hitInMinimumTouchTarget("Hello", 1f, true) {
-            hitTestResult.hitInMinimumTouchTarget("World", 2f, false) { }
+            hitTestResult.hitInMinimumTouchTarget("World", 2f, false) {}
             assertThat(hitTestResult.hasHit()).isFalse()
             assertThat(hitTestResult.isHitInMinimumTouchTargetBetter(1.5f, false)).isTrue()
             assertThat(hitTestResult.isHitInMinimumTouchTargetBetter(2.5f, false)).isFalse()
@@ -88,7 +84,7 @@
         assertThat(hitTestResult[0]).isEqualTo(SNode("Hello"))
         assertThat(hitTestResult[1]).isEqualTo(SNode("World"))
 
-        hitTestResult.hitInMinimumTouchTarget("Baz", 0.5f, false) { }
+        hitTestResult.hitInMinimumTouchTarget("Baz", 0.5f, false) {}
         assertThat(hitTestResult.hasHit()).isFalse()
         assertThat(hitTestResult).hasSize(1)
         assertThat(hitTestResult[0]).isEqualTo(SNode("Baz"))
@@ -98,9 +94,7 @@
     fun testHasHit() {
         val hitTestResult = HitTestResult()
         hitTestResult.hitInMinimumTouchTarget("Hello", 1f, true) {
-            hitTestResult.hit("World", true) {
-                assertThat(hitTestResult.hasHit()).isFalse()
-            }
+            hitTestResult.hit("World", true) { assertThat(hitTestResult.hasHit()).isFalse() }
             assertThat(hitTestResult.hasHit()).isTrue()
         }
         assertThat(hitTestResult.hasHit()).isTrue()
@@ -109,8 +103,7 @@
     @Test
     fun testEasySpeculativeHit() {
         val hitTestResult = HitTestResult()
-        hitTestResult.speculativeHit("Hello", 1f, true) {
-        }
+        hitTestResult.speculativeHit("Hello", 1f, true) {}
         assertThat(hitTestResult).hasSize(0)
 
         hitTestResult.speculativeHit("Hello", 1f, true) {
@@ -129,10 +122,9 @@
     @Test
     fun testSpeculativeHitWithMove() {
         val hitTestResult = HitTestResult()
-        hitTestResult.hitInMinimumTouchTarget("Foo", 1.5f, true) { }
+        hitTestResult.hitInMinimumTouchTarget("Foo", 1.5f, true) {}
 
-        hitTestResult.speculativeHit("Hello", 1f, true) {
-        }
+        hitTestResult.speculativeHit("Hello", 1f, true) {}
 
         assertThat(hitTestResult).hasSize(1)
         assertThat(hitTestResult[0]).isEqualTo(SNode("Foo"))
@@ -153,7 +145,7 @@
     @Test
     fun testSpeculateHitWithDeepHit() {
         val hitTestResult = HitTestResult()
-        hitTestResult.hitInMinimumTouchTarget("Foo", 1.5f, true) { }
+        hitTestResult.hitInMinimumTouchTarget("Foo", 1.5f, true) {}
 
         hitTestResult.speculativeHit("Hello", 2f, true) {
             hitTestResult.hitInMinimumTouchTarget("World", 1f, true) {}
@@ -235,9 +227,8 @@
     @Test
     fun testIterator() {
         val hitTestResult = fillHitTestResult()
-        assertThat(hitTestResult.toList()).isEqualTo(
-            nodeListOf("Hello", "World", "this", "is", "great")
-        )
+        assertThat(hitTestResult.toList())
+            .isEqualTo(nodeListOf("Hello", "World", "this", "is", "great"))
     }
 
     @Test
@@ -347,28 +338,17 @@
 
         hitTestResult.siblingHits {
             hitTestResult.hit("Hello", true) {
-                hitTestResult.siblingHits {
-                    hitTestResult.hit("World", true) {}
-                }
+                hitTestResult.siblingHits { hitTestResult.hit("World", true) {} }
             }
             hitTestResult.acceptHits()
             hitTestResult.hit("this", true) {
-                hitTestResult.siblingHits {
-                    hitTestResult.hit("is", true) {}
-                }
+                hitTestResult.siblingHits { hitTestResult.hit("is", true) {} }
             }
             hitTestResult.acceptHits()
             hitTestResult.hit("great", true) {}
         }
-        assertThat(hitTestResult.toList()).isEqualTo(
-            nodeListOf(
-                "Hello",
-                "World",
-                "this",
-                "is",
-                "great"
-            )
-        )
+        assertThat(hitTestResult.toList())
+            .isEqualTo(nodeListOf("Hello", "World", "this", "is", "great"))
     }
 
     private fun fillHitTestResult(last: String? = null): HitTestResult {
@@ -378,9 +358,7 @@
                 hitTestResult.hit("this", true) {
                     hitTestResult.hit("is", true) {
                         hitTestResult.hit("great", true) {
-                            last?.let {
-                                hitTestResult.hit(it, true) {}
-                            }
+                            last?.let { hitTestResult.hit(it, true) {} }
                         }
                     }
                 }
@@ -391,6 +369,7 @@
 }
 
 internal fun nodeListOf(vararg strings: String) = strings.map { SNode(it) }
+
 internal fun HitTestResult.hit(string: String, isInLayer: Boolean, childHitTest: () -> Unit) {
     hit(SNode(string), isInLayer, childHitTest)
 }
@@ -410,6 +389,9 @@
 ) = speculativeHit(SNode(string), distanceFromEdge, isInLayer, childHitTest)
 
 internal fun HitTestResult.contains(string: String) = contains(SNode(string))
+
 internal fun HitTestResult.indexOf(string: String) = indexOf(SNode(string))
+
 internal fun HitTestResult.lastIndexOf(string: String) = lastIndexOf(SNode(string))
+
 internal data class SNode(val string: String) : Modifier.Node()
diff --git a/compose/ui/ui/src/androidUnitTest/kotlin/androidx/compose/ui/node/HitTestSharePointerInputWithSiblingTest.kt b/compose/ui/ui/src/androidUnitTest/kotlin/androidx/compose/ui/node/HitTestSharePointerInputWithSiblingTest.kt
index 36b2ec8..ca3e0f8 100644
--- a/compose/ui/ui/src/androidUnitTest/kotlin/androidx/compose/ui/node/HitTestSharePointerInputWithSiblingTest.kt
+++ b/compose/ui/ui/src/androidUnitTest/kotlin/androidx/compose/ui/node/HitTestSharePointerInputWithSiblingTest.kt
@@ -33,10 +33,11 @@
         val pointerInputModifier1 = FakePointerInputModifierNode(sharePointerWithSiblings = true)
         val pointerInputModifier2 = FakePointerInputModifierNode(sharePointerWithSiblings = true)
 
-        val outerNode = LayoutNode(0, 0, 1, 1) {
-            childNode(0, 0, 1, 1, pointerInputModifier1.toModifier())
-            childNode(0, 0, 1, 1, pointerInputModifier2.toModifier())
-        }
+        val outerNode =
+            LayoutNode(0, 0, 1, 1) {
+                childNode(0, 0, 1, 1, pointerInputModifier1.toModifier())
+                childNode(0, 0, 1, 1, pointerInputModifier2.toModifier())
+            }
 
         val hit = mutableListOf<Modifier.Node>()
 
@@ -51,11 +52,12 @@
         val pointerInputModifier2 = FakePointerInputModifierNode(sharePointerWithSiblings = false)
         val pointerInputModifier3 = FakePointerInputModifierNode(sharePointerWithSiblings = true)
 
-        val outerNode = LayoutNode(0, 0, 1, 1) {
-            childNode(0, 0, 1, 1, pointerInputModifier1.toModifier())
-            childNode(0, 0, 1, 1, pointerInputModifier2.toModifier())
-            childNode(0, 0, 1, 1, pointerInputModifier3.toModifier())
-        }
+        val outerNode =
+            LayoutNode(0, 0, 1, 1) {
+                childNode(0, 0, 1, 1, pointerInputModifier1.toModifier())
+                childNode(0, 0, 1, 1, pointerInputModifier2.toModifier())
+                childNode(0, 0, 1, 1, pointerInputModifier3.toModifier())
+            }
 
         val hit = mutableListOf<Modifier.Node>()
 
@@ -70,21 +72,21 @@
         val pointerInputModifier2 = FakePointerInputModifierNode(sharePointerWithSiblings = true)
         val pointerInputModifier3 = FakePointerInputModifierNode(sharePointerWithSiblings = true)
 
-        val outerNode = LayoutNode(0, 0, 1, 1) {
-            childNode(0, 0, 1, 1, pointerInputModifier1.toModifier()) {
-                childNode(0, 0, 1, 1, pointerInputModifier2.toModifier())
-                childNode(0, 0, 1, 1, pointerInputModifier3.toModifier())
+        val outerNode =
+            LayoutNode(0, 0, 1, 1) {
+                childNode(0, 0, 1, 1, pointerInputModifier1.toModifier()) {
+                    childNode(0, 0, 1, 1, pointerInputModifier2.toModifier())
+                    childNode(0, 0, 1, 1, pointerInputModifier3.toModifier())
+                }
             }
-        }
 
         val hit = mutableListOf<Modifier.Node>()
 
         outerNode.hitTest(Offset(0f, 0f), hit)
 
         // The parent node doesn't share pointer events, the two children can still share events.
-        assertThat(hit).isEqualTo(
-            listOf(pointerInputModifier1, pointerInputModifier3, pointerInputModifier2)
-        )
+        assertThat(hit)
+            .isEqualTo(listOf(pointerInputModifier1, pointerInputModifier3, pointerInputModifier2))
     }
 
     @Test
@@ -92,12 +94,11 @@
         val pointerInputModifier1 = FakePointerInputModifierNode(sharePointerWithSiblings = true)
         val pointerInputModifier2 = FakePointerInputModifierNode(sharePointerWithSiblings = true)
 
-        val outerNode = LayoutNode(0, 0, 1, 1) {
-            childNode(0, 0, 1, 1, pointerInputModifier1.toModifier())
-            childNode(0, 0, 1, 1) {
-                childNode(0, 0, 1, 1, pointerInputModifier2.toModifier())
+        val outerNode =
+            LayoutNode(0, 0, 1, 1) {
+                childNode(0, 0, 1, 1, pointerInputModifier1.toModifier())
+                childNode(0, 0, 1, 1) { childNode(0, 0, 1, 1, pointerInputModifier2.toModifier()) }
             }
-        }
 
         val hit = mutableListOf<Modifier.Node>()
 
@@ -112,12 +113,13 @@
         val pointerInputModifier2 = FakePointerInputModifierNode(sharePointerWithSiblings = false)
         val pointerInputModifier3 = FakePointerInputModifierNode(sharePointerWithSiblings = true)
 
-        val outerNode = LayoutNode(0, 0, 1, 1) {
-            childNode(0, 0, 1, 1, pointerInputModifier1.toModifier())
-            childNode(0, 0, 1, 1, pointerInputModifier2.toModifier()) {
-                childNode(0, 0, 1, 1, pointerInputModifier3.toModifier())
+        val outerNode =
+            LayoutNode(0, 0, 1, 1) {
+                childNode(0, 0, 1, 1, pointerInputModifier1.toModifier())
+                childNode(0, 0, 1, 1, pointerInputModifier2.toModifier()) {
+                    childNode(0, 0, 1, 1, pointerInputModifier3.toModifier())
+                }
             }
-        }
 
         val hit = mutableListOf<Modifier.Node>()
 
@@ -133,15 +135,12 @@
         val pointerInputModifier2 = FakePointerInputModifierNode(sharePointerWithSiblings = false)
         val pointerInputModifier3 = FakePointerInputModifierNode(sharePointerWithSiblings = true)
 
-        val outerNode = LayoutNode(0, 0, 1, 1) {
-            childNode(0, 0, 1, 1, pointerInputModifier1.toModifier())
-            childNode(0, 0, 1, 1) {
-                childNode(0, 0, 1, 1, pointerInputModifier2.toModifier())
+        val outerNode =
+            LayoutNode(0, 0, 1, 1) {
+                childNode(0, 0, 1, 1, pointerInputModifier1.toModifier())
+                childNode(0, 0, 1, 1) { childNode(0, 0, 1, 1, pointerInputModifier2.toModifier()) }
+                childNode(0, 0, 1, 1) { childNode(0, 0, 1, 1, pointerInputModifier3.toModifier()) }
             }
-            childNode(0, 0, 1, 1) {
-                childNode(0, 0, 1, 1, pointerInputModifier3.toModifier())
-            }
-        }
 
         val hit = mutableListOf<Modifier.Node>()
 
@@ -158,9 +157,7 @@
     bottom: Int,
     block: LayoutNode.() -> Unit
 ): LayoutNode {
-    val root = LayoutNode(left, top, right, bottom).apply {
-        attach(MockOwner())
-    }
+    val root = LayoutNode(left, top, right, bottom).apply { attach(MockOwner()) }
 
     block.invoke(root)
     return root
@@ -185,21 +182,20 @@
     return object : ModifierNodeElement<FakePointerInputModifierNode>() {
         override fun create(): FakePointerInputModifierNode = this@toModifier
 
-        override fun update(node: FakePointerInputModifierNode) { }
+        override fun update(node: FakePointerInputModifierNode) {}
 
         override fun hashCode(): Int {
             return if (this@toModifier.sharePointerWithSiblings) 1 else 0
         }
 
         override fun equals(other: Any?): Boolean {
-           return this@toModifier.sharePointerWithSiblings
+            return this@toModifier.sharePointerWithSiblings
         }
     }
 }
 
-private class FakePointerInputModifierNode(
-    var sharePointerWithSiblings: Boolean = false
-) : Modifier.Node(), PointerInputModifierNode {
+private class FakePointerInputModifierNode(var sharePointerWithSiblings: Boolean = false) :
+    Modifier.Node(), PointerInputModifierNode {
     override fun onPointerEvent(
         pointerEvent: PointerEvent,
         pass: PointerEventPass,
diff --git a/compose/ui/ui/src/androidUnitTest/kotlin/androidx/compose/ui/node/LayoutNodeTest.kt b/compose/ui/ui/src/androidUnitTest/kotlin/androidx/compose/ui/node/LayoutNodeTest.kt
index dbc43d5..bdcddab 100644
--- a/compose/ui/ui/src/androidUnitTest/kotlin/androidx/compose/ui/node/LayoutNodeTest.kt
+++ b/compose/ui/ui/src/androidUnitTest/kotlin/androidx/compose/ui/node/LayoutNodeTest.kt
@@ -643,9 +643,7 @@
     fun testRemoveNegativeIndex() {
         val node = LayoutNode()
         node.insertAt(0, LayoutNode())
-        Assert.assertThrows(IndexOutOfBoundsException::class.java) {
-            node.removeAt(-1, 1)
-        }
+        Assert.assertThrows(IndexOutOfBoundsException::class.java) { node.removeAt(-1, 1) }
     }
 
     // LayoutNode should error when removing at index > count
@@ -653,9 +651,7 @@
     fun testRemoveBeyondIndex() {
         val node = LayoutNode()
         node.insertAt(0, LayoutNode())
-        Assert.assertThrows(NullPointerException::class.java) {
-            node.removeAt(1, 1)
-        }
+        Assert.assertThrows(NullPointerException::class.java) { node.removeAt(1, 1) }
     }
 
     // LayoutNode should error when removing at count < 0
@@ -663,9 +659,7 @@
     fun testRemoveNegativeCount() {
         val node = LayoutNode()
         node.insertAt(0, LayoutNode())
-        Assert.assertThrows(IllegalArgumentException::class.java) {
-            node.removeAt(0, -1)
-        }
+        Assert.assertThrows(IllegalArgumentException::class.java) { node.removeAt(0, -1) }
     }
 
     // LayoutNode should error when removing at count > entry count
@@ -673,18 +667,14 @@
     fun testRemoveWithIndexBeyondSize() {
         val node = LayoutNode()
         node.insertAt(0, LayoutNode())
-        Assert.assertThrows(NullPointerException::class.java) {
-            node.removeAt(0, 2)
-        }
+        Assert.assertThrows(NullPointerException::class.java) { node.removeAt(0, 2) }
     }
 
     // LayoutNode should error when there aren't enough items
     @Test
     fun testRemoveWithIndexEqualToSize() {
         val node = LayoutNode()
-        Assert.assertThrows(NullPointerException::class.java) {
-            node.removeAt(0, 1)
-        }
+        Assert.assertThrows(NullPointerException::class.java) { node.removeAt(0, 1) }
     }
 
     // LayoutNode should allow removing two items
@@ -701,7 +691,7 @@
     @Test
     fun modifierSetBeforeLayoutNodeAttached() {
         val layoutNode = LayoutNode()
-        val layoutModifier = Modifier.graphicsLayer { }
+        val layoutModifier = Modifier.graphicsLayer {}
 
         layoutNode.modifier = layoutModifier
         // Changes should not be applied yet
@@ -720,7 +710,7 @@
     @Test
     fun modifierSetAfterLayoutNodeAttached() {
         val layoutNode = LayoutNode()
-        val layoutModifier = Modifier.graphicsLayer { }
+        val layoutModifier = Modifier.graphicsLayer {}
         layoutNode.attach(MockOwner())
 
         layoutNode.modifier = layoutModifier
@@ -736,7 +726,7 @@
     @Test
     fun coordinatesAttachedWhenLayoutNodeAttached() {
         val layoutNode = LayoutNode()
-        val layoutModifier = Modifier.graphicsLayer { }
+        val layoutModifier = Modifier.graphicsLayer {}
         layoutNode.modifier = layoutModifier
         assertFalse(layoutNode.coordinates.isAttached)
         assertFalse(layoutNode.coordinates.isAttached)
@@ -753,13 +743,13 @@
     fun nodeCoordinatorSameWithReplacementModifier() {
         val layoutNode = LayoutNode()
         layoutNode.attach(MockOwner())
-        val layoutModifier = Modifier.graphicsLayer { }
+        val layoutModifier = Modifier.graphicsLayer {}
 
         layoutNode.modifier = layoutModifier
         val oldNodeCoordinator = layoutNode.outerCoordinator
         assertTrue(oldNodeCoordinator.isAttached)
 
-        layoutNode.modifier = Modifier.graphicsLayer { }
+        layoutNode.modifier = Modifier.graphicsLayer {}
         val newNodeCoordinator = layoutNode.outerCoordinator
         assertSame(newNodeCoordinator, oldNodeCoordinator)
     }
@@ -773,10 +763,8 @@
                 drawContent()
             }
 
-            override fun MeasureScope.measure(
-                measurable: Measurable,
-                constraints: Constraints
-            ) = layout(0, 0) {}
+            override fun MeasureScope.measure(measurable: Measurable, constraints: Constraints) =
+                layout(0, 0) {}
         }
 
         val layoutNode = LayoutNode()
@@ -796,9 +784,7 @@
     fun nodeCoordinatorAttachedWhenLayoutNodeAttached() {
         val layoutNode = LayoutNode()
         // 2 modifiers at the start
-        val layoutModifier = Modifier
-            .graphicsLayer { }
-            .graphicsLayer { }
+        val layoutModifier = Modifier.graphicsLayer {}.graphicsLayer {}
 
         layoutNode.modifier = layoutModifier
         var oldNodeCoordinator = layoutNode.outerCoordinator
@@ -818,11 +804,12 @@
         val newNodeCoordinator = layoutNode.outerCoordinator
 
         // one can be reused, but we don't care which one
-        val notReused = if (newNodeCoordinator == oldNodeCoordinator) {
-            oldInnerNodeCoordinator
-        } else {
-            oldNodeCoordinator
-        }
+        val notReused =
+            if (newNodeCoordinator == oldNodeCoordinator) {
+                oldInnerNodeCoordinator
+            } else {
+                oldNodeCoordinator
+            }
         assertTrue(newNodeCoordinator.isAttached)
         assertFalse(notReused.isAttached)
     }
@@ -831,7 +818,7 @@
     fun nodeCoordinatorParentLayoutCoordinates() {
         val layoutNode = LayoutNode()
         val layoutNode2 = LayoutNode()
-        val layoutModifier = Modifier.graphicsLayer { }
+        val layoutModifier = Modifier.graphicsLayer {}
         layoutNode.modifier = layoutModifier
         layoutNode2.insertAt(0, layoutNode)
         layoutNode2.attach(MockOwner())
@@ -850,29 +837,24 @@
     fun nodeCoordinatorParentCoordinates() {
         val layoutNode = LayoutNode()
         val layoutNode2 = LayoutNode()
-        val layoutModifier = object : LayoutModifier {
-            override fun MeasureScope.measure(
-                measurable: Measurable,
-                constraints: Constraints
-            ): MeasureResult {
-                TODO("Not yet implemented")
+        val layoutModifier =
+            object : LayoutModifier {
+                override fun MeasureScope.measure(
+                    measurable: Measurable,
+                    constraints: Constraints
+                ): MeasureResult {
+                    TODO("Not yet implemented")
+                }
             }
-        }
-        val drawModifier = Modifier.drawBehind { }
+        val drawModifier = Modifier.drawBehind {}
         layoutNode.modifier = layoutModifier.then(drawModifier)
         layoutNode2.insertAt(0, layoutNode)
         layoutNode2.attach(MockOwner())
 
         val layoutModifierWrapper = layoutNode.outerCoordinator
 
-        assertEquals(
-            layoutModifierWrapper,
-            layoutNode.innerCoordinator.parentCoordinates
-        )
-        assertEquals(
-            layoutNode2.innerCoordinator,
-            layoutModifierWrapper.parentCoordinates
-        )
+        assertEquals(layoutModifierWrapper, layoutNode.innerCoordinator.parentCoordinates)
+        assertEquals(layoutNode2.innerCoordinator, layoutModifierWrapper.parentCoordinates)
     }
 
     @Test
@@ -900,14 +882,13 @@
         parent.attach(MockOwner())
         val child = ZeroSizedLayoutNode()
         parent.insertAt(0, child)
-        child.modifier = Modifier.graphicsLayer {
-            translationX = 5f
-            translationY = 2f
-        }
-        parent.outerCoordinator
-            .measure(listOf(parent.outerCoordinator), Constraints())
-        child.outerCoordinator
-            .measure(listOf(child.outerCoordinator), Constraints())
+        child.modifier =
+            Modifier.graphicsLayer {
+                translationX = 5f
+                translationY = 2f
+            }
+        parent.outerCoordinator.measure(listOf(parent.outerCoordinator), Constraints())
+        child.outerCoordinator.measure(listOf(child.outerCoordinator), Constraints())
         parent.place(0, 0)
         child.place(0, 0)
 
@@ -929,13 +910,9 @@
         parent.attach(MockOwner())
         val child = ZeroSizedLayoutNode()
         parent.insertAt(0, child)
-        child.modifier = Modifier.graphicsLayer {
-            rotationZ = 90f
-        }
-        parent.outerCoordinator
-            .measure(listOf(parent.outerCoordinator), Constraints())
-        child.outerCoordinator
-            .measure(listOf(child.outerCoordinator), Constraints())
+        child.modifier = Modifier.graphicsLayer { rotationZ = 90f }
+        parent.outerCoordinator.measure(listOf(parent.outerCoordinator), Constraints())
+        child.outerCoordinator.measure(listOf(child.outerCoordinator), Constraints())
         parent.place(0, 0)
         child.place(0, 0)
 
@@ -957,13 +934,9 @@
         parent.attach(MockOwner())
         val child = ZeroSizedLayoutNode()
         parent.insertAt(0, child)
-        child.modifier = Modifier.graphicsLayer {
-            scaleX = 0f
-        }
-        parent.outerCoordinator
-            .measure(listOf(parent.outerCoordinator), Constraints())
-        child.outerCoordinator
-            .measure(listOf(child.outerCoordinator), Constraints())
+        child.modifier = Modifier.graphicsLayer { scaleX = 0f }
+        parent.outerCoordinator.measure(listOf(parent.outerCoordinator), Constraints())
+        child.outerCoordinator.measure(listOf(child.outerCoordinator), Constraints())
         parent.place(0, 0)
         child.place(0, 0)
 
@@ -1003,24 +976,23 @@
         parent.attach(MockOwner())
         val child1 = ZeroSizedLayoutNode()
         parent.insertAt(0, child1)
-        child1.modifier = Modifier.graphicsLayer {
-            scaleX = 0.5f
-            scaleY = 0.25f
-            transformOrigin = TransformOrigin(0f, 0f)
-        }
+        child1.modifier =
+            Modifier.graphicsLayer {
+                scaleX = 0.5f
+                scaleY = 0.25f
+                transformOrigin = TransformOrigin(0f, 0f)
+            }
         val child2 = ZeroSizedLayoutNode()
         parent.insertAt(0, child2)
-        child2.modifier = Modifier.graphicsLayer {
-            scaleX = 5f
-            scaleY = 2f
-            transformOrigin = TransformOrigin(0f, 0f)
-        }
-        parent.outerCoordinator
-            .measure(listOf(parent.outerCoordinator), Constraints())
-        child1.outerCoordinator
-            .measure(listOf(child1.outerCoordinator), Constraints())
-        child2.outerCoordinator
-            .measure(listOf(child2.outerCoordinator), Constraints())
+        child2.modifier =
+            Modifier.graphicsLayer {
+                scaleX = 5f
+                scaleY = 2f
+                transformOrigin = TransformOrigin(0f, 0f)
+            }
+        parent.outerCoordinator.measure(listOf(parent.outerCoordinator), Constraints())
+        child1.outerCoordinator.measure(listOf(child1.outerCoordinator), Constraints())
+        child2.outerCoordinator.measure(listOf(child2.outerCoordinator), Constraints())
         parent.place(0, 0)
         child1.place(100, 200)
         child2.place(5, 11)
@@ -1077,10 +1049,7 @@
     fun hitTest_pointerInBounds_pointerInputFilterHit() {
         val pointerInputFilter: PointerInputFilter = mockPointerInputFilter()
         val layoutNode =
-            LayoutNode(
-                0, 0, 1, 1,
-                PointerInputModifierImpl(pointerInputFilter)
-            ).apply {
+            LayoutNode(0, 0, 1, 1, PointerInputModifierImpl(pointerInputFilter)).apply {
                 attach(MockOwner())
             }
         val hit = mutableListOf<Modifier.Node>()
@@ -1095,12 +1064,14 @@
         val pointerInputFilter: PointerInputFilter = mockPointerInputFilter()
         val layoutNode =
             LayoutNode(
-                0, 0, 1, 1,
-                PointerInputModifierImpl(pointerInputFilter),
-                DpSize(48.dp, 48.dp)
-            ).apply {
-                attach(MockOwner())
-            }
+                    0,
+                    0,
+                    1,
+                    1,
+                    PointerInputModifierImpl(pointerInputFilter),
+                    DpSize(48.dp, 48.dp)
+                )
+                .apply { attach(MockOwner()) }
         val hit = mutableListOf<Modifier.Node>()
 
         layoutNode.hitTest(Offset(-3f, 3f), hit, true)
@@ -1113,12 +1084,14 @@
         val pointerInputFilter: PointerInputFilter = mockPointerInputFilter()
         val layoutNode =
             LayoutNode(
-                0, 0, 1000, 1,
-                PointerInputModifierImpl(pointerInputFilter),
-                DpSize(48.dp, 48.dp)
-            ).apply {
-                attach(MockOwner())
-            }
+                    0,
+                    0,
+                    1000,
+                    1,
+                    PointerInputModifierImpl(pointerInputFilter),
+                    DpSize(48.dp, 48.dp)
+                )
+                .apply { attach(MockOwner()) }
         val hit = mutableListOf<Modifier.Node>()
 
         layoutNode.hitTest(Offset(0f, 3f), hit, true)
@@ -1131,12 +1104,14 @@
         val pointerInputFilter: PointerInputFilter = mockPointerInputFilter()
         val layoutNode =
             LayoutNode(
-                0, 0, 1, 1000,
-                PointerInputModifierImpl(pointerInputFilter),
-                DpSize(48.dp, 48.dp)
-            ).apply {
-                attach(MockOwner())
-            }
+                    0,
+                    0,
+                    1,
+                    1000,
+                    PointerInputModifierImpl(pointerInputFilter),
+                    DpSize(48.dp, 48.dp)
+                )
+                .apply { attach(MockOwner()) }
         val hit = mutableListOf<Modifier.Node>()
 
         layoutNode.hitTest(Offset(3f, 0f), hit, true)
@@ -1148,11 +1123,15 @@
     fun hitTest_pointerInMinimumTouchTarget_pointerInputFilterHit_nestedNodes() {
         val pointerInputFilter: PointerInputFilter = mockPointerInputFilter()
         val outerNode = LayoutNode(0, 0, 1, 1).apply { attach(MockOwner()) }
-        val layoutNode = LayoutNode(
-            0, 0, 1, 1,
-            PointerInputModifierImpl(pointerInputFilter),
-            DpSize(48.dp, 48.dp)
-        )
+        val layoutNode =
+            LayoutNode(
+                0,
+                0,
+                1,
+                1,
+                PointerInputModifierImpl(pointerInputFilter),
+                DpSize(48.dp, 48.dp)
+            )
         outerNode.add(layoutNode)
         layoutNode.onNodePlaced()
         val hit = mutableListOf<Modifier.Node>()
@@ -1165,15 +1144,12 @@
     @Test
     fun hitTest_pointerInputFilterHit_outsideParent() {
         val outerPointerInputFilter: PointerInputFilter = mockPointerInputFilter()
-        val outerNode = LayoutNode(
-            0, 0, 10, 10,
-            PointerInputModifierImpl(outerPointerInputFilter)
-        ).apply { attach(MockOwner()) }
+        val outerNode =
+            LayoutNode(0, 0, 10, 10, PointerInputModifierImpl(outerPointerInputFilter)).apply {
+                attach(MockOwner())
+            }
         val pointerInputFilter: PointerInputFilter = mockPointerInputFilter()
-        val layoutNode = LayoutNode(
-            20, 20, 30, 30,
-            PointerInputModifierImpl(pointerInputFilter)
-        )
+        val layoutNode = LayoutNode(20, 20, 30, 30, PointerInputModifierImpl(pointerInputFilter))
         outerNode.add(layoutNode)
         layoutNode.onNodePlaced()
         val hit = mutableListOf<Modifier.Node>()
@@ -1185,18 +1161,14 @@
 
     @Test
     fun hitTest_pointerInputFilterHit_outsideParent_interceptOutOfBoundsChildEvents() {
-        val outerPointerInputFilter: PointerInputFilter = mockPointerInputFilter(
-            interceptChildEvents = true
-        )
-        val outerNode = LayoutNode(
-            0, 0, 10, 10,
-            PointerInputModifierImpl(outerPointerInputFilter)
-        ).apply { attach(MockOwner()) }
+        val outerPointerInputFilter: PointerInputFilter =
+            mockPointerInputFilter(interceptChildEvents = true)
+        val outerNode =
+            LayoutNode(0, 0, 10, 10, PointerInputModifierImpl(outerPointerInputFilter)).apply {
+                attach(MockOwner())
+            }
         val pointerInputFilter: PointerInputFilter = mockPointerInputFilter()
-        val layoutNode = LayoutNode(
-            20, 20, 30, 30,
-            PointerInputModifierImpl(pointerInputFilter)
-        )
+        val layoutNode = LayoutNode(20, 20, 30, 30, PointerInputModifierImpl(pointerInputFilter))
         outerNode.add(layoutNode)
         layoutNode.onNodePlaced()
         val hit = mutableListOf<Modifier.Node>()
@@ -1209,18 +1181,26 @@
     @Test
     fun hitTest_pointerInMinimumTouchTarget_closestHit() {
         val pointerInputFilter1: PointerInputFilter = mockPointerInputFilter()
-        val layoutNode1 = LayoutNode(
-            0, 0, 5, 5,
-            PointerInputModifierImpl(pointerInputFilter1),
-            DpSize(48.dp, 48.dp)
-        )
+        val layoutNode1 =
+            LayoutNode(
+                0,
+                0,
+                5,
+                5,
+                PointerInputModifierImpl(pointerInputFilter1),
+                DpSize(48.dp, 48.dp)
+            )
 
         val pointerInputFilter2: PointerInputFilter = mockPointerInputFilter()
-        val layoutNode2 = LayoutNode(
-            6, 6, 11, 11,
-            PointerInputModifierImpl(pointerInputFilter2),
-            DpSize(48.dp, 48.dp)
-        )
+        val layoutNode2 =
+            LayoutNode(
+                6,
+                6,
+                11,
+                11,
+                PointerInputModifierImpl(pointerInputFilter2),
+                DpSize(48.dp, 48.dp)
+            )
         val outerNode = LayoutNode(0, 0, 11, 11).apply { attach(MockOwner()) }
         outerNode.add(layoutNode1)
         outerNode.add(layoutNode2)
@@ -1271,9 +1251,9 @@
     }
 
     /**
-     * When a child is in the minimum touch target area, but the parent is big enough to not
-     * worry about minimum touch target, the child should still be able to be hit outside the
-     * parent's bounds.
+     * When a child is in the minimum touch target area, but the parent is big enough to not worry
+     * about minimum touch target, the child should still be able to be hit outside the parent's
+     * bounds.
      */
     @Test
     fun hitTest_pointerInMinimumTouchTarget_inChild_closestHit() {
@@ -1284,11 +1264,10 @@
     }
 
     /**
-     * When a child is in the minimum touch target area, but the parent is big enough to not
-     * worry about minimum touch target, the child should still be able to be hit outside the
-     * parent's bounds. This is different from
-     * [hitTest_pointerInMinimumTouchTarget_inChild_closestHit] because the node with the nested
-     * child is after the other node.
+     * When a child is in the minimum touch target area, but the parent is big enough to not worry
+     * about minimum touch target, the child should still be able to be hit outside the parent's
+     * bounds. This is different from [hitTest_pointerInMinimumTouchTarget_inChild_closestHit]
+     * because the node with the nested child is after the other node.
      */
     @Test
     fun hitTest_pointerInMinimumTouchTarget_inChildOver_closestHit() {
@@ -1302,27 +1281,39 @@
         block: (outerNode: LayoutNode, nodeWithChild: LayoutNode, soloNode: LayoutNode) -> Unit
     ) {
         val pointerInputFilter1: PointerInputFilter = mockPointerInputFilter()
-        val layoutNode1 = LayoutNode(
-            5, 5, 10, 10,
-            PointerInputModifierImpl(pointerInputFilter1),
-            DpSize(48.dp, 48.dp)
-        )
+        val layoutNode1 =
+            LayoutNode(
+                5,
+                5,
+                10,
+                10,
+                PointerInputModifierImpl(pointerInputFilter1),
+                DpSize(48.dp, 48.dp)
+            )
 
         val pointerInputFilter2: PointerInputFilter =
             mockPointerInputFilter(interceptChildEvents = true)
-        val layoutNode2 = LayoutNode(
-            0, 0, 10, 10,
-            PointerInputModifierImpl(pointerInputFilter2),
-            DpSize(48.dp, 48.dp)
-        )
+        val layoutNode2 =
+            LayoutNode(
+                0,
+                0,
+                10,
+                10,
+                PointerInputModifierImpl(pointerInputFilter2),
+                DpSize(48.dp, 48.dp)
+            )
         layoutNode2.add(layoutNode1)
 
         val pointerInputFilter3: PointerInputFilter = mockPointerInputFilter()
-        val layoutNode3 = LayoutNode(
-            12, 12, 17, 17,
-            PointerInputModifierImpl(pointerInputFilter3),
-            DpSize(48.dp, 48.dp)
-        )
+        val layoutNode3 =
+            LayoutNode(
+                12,
+                12,
+                17,
+                17,
+                PointerInputModifierImpl(pointerInputFilter3),
+                DpSize(48.dp, 48.dp)
+            )
 
         val outerNode = LayoutNode(0, 0, 20, 20).apply { attach(MockOwner()) }
         block(outerNode, layoutNode2, layoutNode3)
@@ -1348,17 +1339,26 @@
     @Test
     fun hitTest_pointerInMinimumTouchTarget_closestHitWithOverlap() {
         val pointerInputFilter1: PointerInputFilter = mockPointerInputFilter()
-        val layoutNode1 = LayoutNode(
-            0, 0, 5, 5, PointerInputModifierImpl(pointerInputFilter1),
-            DpSize(48.dp, 48.dp)
-        )
+        val layoutNode1 =
+            LayoutNode(
+                0,
+                0,
+                5,
+                5,
+                PointerInputModifierImpl(pointerInputFilter1),
+                DpSize(48.dp, 48.dp)
+            )
 
         val pointerInputFilter2: PointerInputFilter = mockPointerInputFilter()
-        val layoutNode2 = LayoutNode(
-            4, 4, 9, 9,
-            PointerInputModifierImpl(pointerInputFilter2),
-            DpSize(48.dp, 48.dp)
-        )
+        val layoutNode2 =
+            LayoutNode(
+                4,
+                4,
+                9,
+                9,
+                PointerInputModifierImpl(pointerInputFilter2),
+                DpSize(48.dp, 48.dp)
+            )
         val outerNode = LayoutNode(0, 0, 9, 9).apply { attach(MockOwner()) }
         outerNode.add(layoutNode1)
         outerNode.add(layoutNode2)
@@ -1383,15 +1383,12 @@
     @Test
     fun hitTestSemantics_pointerInMinimumTouchTarget_pointerInputFilterHit() {
         val semanticsConfiguration = SemanticsConfiguration()
-        val semanticsModifier = object : SemanticsModifier {
-            override val semanticsConfiguration: SemanticsConfiguration = semanticsConfiguration
-        }
+        val semanticsModifier =
+            object : SemanticsModifier {
+                override val semanticsConfiguration: SemanticsConfiguration = semanticsConfiguration
+            }
         val layoutNode =
-            LayoutNode(
-                0, 0, 1, 1,
-                semanticsModifier,
-                DpSize(48.dp, 48.dp)
-            ).apply {
+            LayoutNode(0, 0, 1, 1, semanticsModifier, DpSize(48.dp, 48.dp)).apply {
                 attach(MockOwner())
             }
         val hit = HitTestResult()
@@ -1399,15 +1396,16 @@
         layoutNode.hitTestSemantics(Offset(-3f, 3f), hit)
 
         assertThat(hit).hasSize(1)
-//        assertThat(hit[0].modifier).isEqualTo(semanticsModifier)
+        //        assertThat(hit[0].modifier).isEqualTo(semanticsModifier)
     }
 
     @Test
     fun hitTestSemantics_pointerInMinimumTouchTarget_pointerInputFilterHit_nestedNodes() {
         val semanticsConfiguration = SemanticsConfiguration()
-        val semanticsModifier = object : SemanticsModifier {
-            override val semanticsConfiguration: SemanticsConfiguration = semanticsConfiguration
-        }
+        val semanticsModifier =
+            object : SemanticsModifier {
+                override val semanticsConfiguration: SemanticsConfiguration = semanticsConfiguration
+            }
         val outerNode = LayoutNode(0, 0, 1, 1).apply { attach(MockOwner()) }
         val layoutNode = LayoutNode(0, 0, 1, 1, semanticsModifier, DpSize(48.dp, 48.dp))
         outerNode.add(layoutNode)
@@ -1422,16 +1420,18 @@
 
     @Test
     fun hitTestSemantics_pointerInMinimumTouchTarget_closestHit() {
-        val semanticsNode1 = object : SemanticsModifierNode, Modifier.Node() {
-            override fun SemanticsPropertyReceiver.applySemantics() { }
-        }
-        val semanticsNode2 = object : SemanticsModifierNode, Modifier.Node() {
-            override fun SemanticsPropertyReceiver.applySemantics() { }
-        }
-        data class TestSemanticsElement(
-            private val node: Modifier.Node
-        ) : ModifierNodeElement<Modifier.Node>() {
+        val semanticsNode1 =
+            object : SemanticsModifierNode, Modifier.Node() {
+                override fun SemanticsPropertyReceiver.applySemantics() {}
+            }
+        val semanticsNode2 =
+            object : SemanticsModifierNode, Modifier.Node() {
+                override fun SemanticsPropertyReceiver.applySemantics() {}
+            }
+        data class TestSemanticsElement(private val node: Modifier.Node) :
+            ModifierNodeElement<Modifier.Node>() {
             override fun create() = node
+
             override fun update(node: Modifier.Node) {}
         }
         val semanticsElement1 = TestSemanticsElement(semanticsNode1)
@@ -1490,12 +1490,14 @@
     @Test
     fun hitTestSemantics_pointerInMinimumTouchTarget_closestHitWithOverlap() {
         val semanticsConfiguration = SemanticsConfiguration()
-        val semanticsModifier1 = object : SemanticsModifier {
-            override val semanticsConfiguration: SemanticsConfiguration = semanticsConfiguration
-        }
-        val semanticsModifier2 = object : SemanticsModifier {
-            override val semanticsConfiguration: SemanticsConfiguration = semanticsConfiguration
-        }
+        val semanticsModifier1 =
+            object : SemanticsModifier {
+                override val semanticsConfiguration: SemanticsConfiguration = semanticsConfiguration
+            }
+        val semanticsModifier2 =
+            object : SemanticsModifier {
+                override val semanticsConfiguration: SemanticsConfiguration = semanticsConfiguration
+            }
         val layoutNode1 = LayoutNode(0, 0, 5, 5, semanticsModifier1, DpSize(48.dp, 48.dp))
         val layoutNode2 = LayoutNode(4, 4, 9, 9, semanticsModifier2, DpSize(48.dp, 48.dp))
         val outerNode = LayoutNode(0, 0, 11, 11).apply { attach(MockOwner()) }
@@ -1523,10 +1525,7 @@
     fun hitTest_pointerOutOfBounds_nothingHit() {
         val pointerInputFilter: PointerInputFilter = mockPointerInputFilter()
         val layoutNode =
-            LayoutNode(
-                0, 0, 1, 1,
-                PointerInputModifierImpl(pointerInputFilter)
-            ).apply {
+            LayoutNode(0, 0, 1, 1, PointerInputModifierImpl(pointerInputFilter)).apply {
                 attach(MockOwner())
             }
         val hit = mutableListOf<Modifier.Node>()
@@ -1551,12 +1550,14 @@
         val pointerInputFilter: PointerInputFilter = mockPointerInputFilter()
         val layoutNode =
             LayoutNode(
-                0, 0, 1, 1,
-                PointerInputModifierImpl(pointerInputFilter),
-                minimumTouchTargetSize = DpSize(4.dp, 8.dp)
-            ).apply {
-                attach(MockOwner())
-            }
+                    0,
+                    0,
+                    1,
+                    1,
+                    PointerInputModifierImpl(pointerInputFilter),
+                    minimumTouchTargetSize = DpSize(4.dp, 8.dp)
+                )
+                .apply { attach(MockOwner()) }
         val hit = mutableListOf<Modifier.Node>()
 
         layoutNode.hitTest(Offset(-3f, -5f), hit)
@@ -1597,40 +1598,25 @@
         val parentPointerInputFilter: PointerInputFilter = mockPointerInputFilter()
 
         val childLayoutNode =
-            LayoutNode(
-                100, 100, 200, 200,
-                PointerInputModifierImpl(
-                    childPointerInputFilter
-                )
-            )
+            LayoutNode(100, 100, 200, 200, PointerInputModifierImpl(childPointerInputFilter))
         val middleLayoutNode: LayoutNode =
-            LayoutNode(
-                100, 100, 400, 400,
-                PointerInputModifierImpl(
-                    middlePointerInputFilter
-                )
-            ).apply {
-                insertAt(0, childLayoutNode)
-            }
+            LayoutNode(100, 100, 400, 400, PointerInputModifierImpl(middlePointerInputFilter))
+                .apply { insertAt(0, childLayoutNode) }
         val parentLayoutNode: LayoutNode =
-            LayoutNode(
-                0, 0, 500, 500,
-                PointerInputModifierImpl(
-                    parentPointerInputFilter
-                )
-            ).apply {
+            LayoutNode(0, 0, 500, 500, PointerInputModifierImpl(parentPointerInputFilter)).apply {
                 insertAt(0, middleLayoutNode)
                 attach(MockOwner())
             }
         middleLayoutNode.onNodePlaced()
         childLayoutNode.onNodePlaced()
 
-        val offset = when (numberOfChildrenHit) {
-            3 -> Offset(250f, 250f)
-            2 -> Offset(150f, 150f)
-            1 -> Offset(50f, 50f)
-            else -> throw IllegalStateException()
-        }
+        val offset =
+            when (numberOfChildrenHit) {
+                3 -> Offset(250f, 250f)
+                2 -> Offset(150f, 150f)
+                1 -> Offset(50f, 50f)
+                else -> throw IllegalStateException()
+            }
 
         val hit = mutableListOf<Modifier.Node>()
 
@@ -1650,43 +1636,19 @@
                             childPointerInputFilter
                         )
                     )
-
             2 ->
                 assertThat(hit.toFilters())
-                    .isEqualTo(
-                        listOf(
-                            parentPointerInputFilter,
-                            middlePointerInputFilter
-                        )
-                    )
-
-            1 ->
-                assertThat(hit.toFilters())
-                    .isEqualTo(
-                        listOf(
-                            parentPointerInputFilter
-                        )
-                    )
-
+                    .isEqualTo(listOf(parentPointerInputFilter, middlePointerInputFilter))
+            1 -> assertThat(hit.toFilters()).isEqualTo(listOf(parentPointerInputFilter))
             else -> throw IllegalStateException()
         }
     }
 
     /**
      * This test creates a layout of this shape:
-     *
-     *  -------------
-     *  |     |     |
-     *  |  t  |     |
-     *  |     |     |
-     *  |-----|     |
-     *  |           |
-     *  |     |-----|
-     *  |     |     |
-     *  |     |  t  |
-     *  |     |     |
-     *  -------------
-     *
+     * -------------
+     * | | | | t | | | | | |-----| | | | | |-----| | | | | | t | | | |
+     * -------------
      * Where there is one child in the top right and one in the bottom left, and 2 pointers where
      * one in the top left and one in the bottom right.
      */
@@ -1699,26 +1661,17 @@
         val childPointerInputFilter2: PointerInputFilter = mockPointerInputFilter()
 
         val childLayoutNode1 =
-            LayoutNode(
-                0, 0, 50, 50,
-                PointerInputModifierImpl(
-                    childPointerInputFilter1
-                )
-            )
+            LayoutNode(0, 0, 50, 50, PointerInputModifierImpl(childPointerInputFilter1))
 
         val childLayoutNode2 =
-            LayoutNode(
-                50, 50, 100, 100,
-                PointerInputModifierImpl(
-                    childPointerInputFilter2
-                )
-            )
+            LayoutNode(50, 50, 100, 100, PointerInputModifierImpl(childPointerInputFilter2))
 
-        val parentLayoutNode = LayoutNode(0, 0, 100, 100).apply {
-            insertAt(0, childLayoutNode1)
-            insertAt(1, childLayoutNode2)
-            attach(MockOwner())
-        }
+        val parentLayoutNode =
+            LayoutNode(0, 0, 100, 100).apply {
+                insertAt(0, childLayoutNode1)
+                insertAt(1, childLayoutNode2)
+                attach(MockOwner())
+            }
         childLayoutNode1.onNodePlaced()
         childLayoutNode2.onNodePlaced()
 
@@ -1741,22 +1694,10 @@
 
     /**
      * This test creates a layout of this shape:
-     *
-     *  ---------------
-     *  | t      |    |
-     *  |        |    |
-     *  |  |-------|  |
-     *  |  | t     |  |
-     *  |  |       |  |
-     *  |  |       |  |
-     *  |--|  |-------|
-     *  |  |  | t     |
-     *  |  |  |       |
-     *  |  |  |       |
-     *  |  |--|       |
-     *  |     |       |
-     *  ---------------
-     *
+     * ---------------
+     * | t | | | | | | |-------| | | | t | | | | | | | | | | |--| |-------| | | | t | | | | | | | |
+     * | | |--| | | | |
+     * ---------------
      * There are 3 staggered children and 3 pointers, the first is on child 1, the second is on
      * child 2 in a space that overlaps child 1, and the third is in a space in child 3 that
      * overlaps child 2.
@@ -1769,35 +1710,21 @@
         val childPointerInputFilter3: PointerInputFilter = mockPointerInputFilter()
 
         val childLayoutNode1 =
-            LayoutNode(
-                0, 0, 100, 100,
-                PointerInputModifierImpl(
-                    childPointerInputFilter1
-                )
-            )
+            LayoutNode(0, 0, 100, 100, PointerInputModifierImpl(childPointerInputFilter1))
 
         val childLayoutNode2 =
-            LayoutNode(
-                50, 50, 150, 150,
-                PointerInputModifierImpl(
-                    childPointerInputFilter2
-                )
-            )
+            LayoutNode(50, 50, 150, 150, PointerInputModifierImpl(childPointerInputFilter2))
 
         val childLayoutNode3 =
-            LayoutNode(
-                100, 100, 200, 200,
-                PointerInputModifierImpl(
-                    childPointerInputFilter3
-                )
-            )
+            LayoutNode(100, 100, 200, 200, PointerInputModifierImpl(childPointerInputFilter3))
 
-        val parentLayoutNode = LayoutNode(0, 0, 200, 200).apply {
-            insertAt(0, childLayoutNode1)
-            insertAt(1, childLayoutNode2)
-            insertAt(2, childLayoutNode3)
-            attach(MockOwner())
-        }
+        val parentLayoutNode =
+            LayoutNode(0, 0, 200, 200).apply {
+                insertAt(0, childLayoutNode1)
+                insertAt(1, childLayoutNode2)
+                insertAt(2, childLayoutNode3)
+                attach(MockOwner())
+            }
         childLayoutNode1.onNodePlaced()
         childLayoutNode2.onNodePlaced()
         childLayoutNode3.onNodePlaced()
@@ -1821,21 +1748,9 @@
 
     /**
      * This test creates a layout of this shape:
-     *
-     *  ---------------
-     *  |             |
-     *  |      t      |
-     *  |             |
-     *  |  |-------|  |
-     *  |  |       |  |
-     *  |  |   t   |  |
-     *  |  |       |  |
-     *  |  |-------|  |
-     *  |             |
-     *  |      t      |
-     *  |             |
-     *  ---------------
-     *
+     * ---------------
+     * | | | t | | | | |-------| | | | | | | | t | | | | | | | |-------| | | | | t | | |
+     * ---------------
      * There are 2 children with one over the other and 3 pointers: the first is on background
      * child, the second is on the foreground child, and the third is again on the background child.
      */
@@ -1845,24 +1760,17 @@
         val childPointerInputFilter1: PointerInputFilter = mockPointerInputFilter()
         val childPointerInputFilter2: PointerInputFilter = mockPointerInputFilter()
 
-        val childLayoutNode1 = LayoutNode(
-            0, 0, 100, 150,
-            PointerInputModifierImpl(
-                childPointerInputFilter1
-            )
-        )
-        val childLayoutNode2 = LayoutNode(
-            25, 50, 75, 100,
-            PointerInputModifierImpl(
-                childPointerInputFilter2
-            )
-        )
+        val childLayoutNode1 =
+            LayoutNode(0, 0, 100, 150, PointerInputModifierImpl(childPointerInputFilter1))
+        val childLayoutNode2 =
+            LayoutNode(25, 50, 75, 100, PointerInputModifierImpl(childPointerInputFilter2))
 
-        val parentLayoutNode = LayoutNode(0, 0, 150, 150).apply {
-            insertAt(0, childLayoutNode1)
-            insertAt(1, childLayoutNode2)
-            attach(MockOwner())
-        }
+        val parentLayoutNode =
+            LayoutNode(0, 0, 150, 150).apply {
+                insertAt(0, childLayoutNode1)
+                insertAt(1, childLayoutNode2)
+                attach(MockOwner())
+            }
         childLayoutNode1.onNodePlaced()
         childLayoutNode2.onNodePlaced()
 
@@ -1889,17 +1797,9 @@
 
     /**
      * This test creates a layout of this shape:
-     *
-     *  -----------------
-     *  |               |
-     *  |   |-------|   |
-     *  |   |       |   |
-     *  | t |   t   | t |
-     *  |   |       |   |
-     *  |   |-------|   |
-     *  |               |
-     *  -----------------
-     *
+     * -----------------
+     * | | | |-------| | | | | | | t | t | t | | | | | | |-------| | | |
+     * -----------------
      * There are 2 children with one over the other and 3 pointers: the first is on background
      * child, the second is on the foreground child, and the third is again on the background child.
      */
@@ -1909,24 +1809,17 @@
         val childPointerInputFilter1: PointerInputFilter = mockPointerInputFilter()
         val childPointerInputFilter2: PointerInputFilter = mockPointerInputFilter()
 
-        val childLayoutNode1 = LayoutNode(
-            0, 0, 150, 100,
-            PointerInputModifierImpl(
-                childPointerInputFilter1
-            )
-        )
-        val childLayoutNode2 = LayoutNode(
-            50, 25, 100, 75,
-            PointerInputModifierImpl(
-                childPointerInputFilter2
-            )
-        )
+        val childLayoutNode1 =
+            LayoutNode(0, 0, 150, 100, PointerInputModifierImpl(childPointerInputFilter1))
+        val childLayoutNode2 =
+            LayoutNode(50, 25, 100, 75, PointerInputModifierImpl(childPointerInputFilter2))
 
-        val parentLayoutNode = LayoutNode(0, 0, 150, 150).apply {
-            insertAt(0, childLayoutNode1)
-            insertAt(1, childLayoutNode2)
-            attach(MockOwner())
-        }
+        val parentLayoutNode =
+            LayoutNode(0, 0, 150, 150).apply {
+                insertAt(0, childLayoutNode1)
+                insertAt(1, childLayoutNode2)
+                attach(MockOwner())
+            }
         childLayoutNode2.onNodePlaced()
         childLayoutNode1.onNodePlaced()
 
@@ -1952,23 +1845,13 @@
     }
 
     /**
-     * This test creates a layout of this shape:
-     *     0   1   2   3   4
-     *   .........   .........
-     * 0 .     t .   . t     .
-     *   .   |---|---|---|   .
-     * 1 . t | t |   | t | t .
-     *   ....|---|   |---|....
-     * 2     |           |
-     *   ....|---|   |---|....
-     * 3 . t | t |   | t | t .
-     *   .   |---|---|---|   .
-     * 4 .     t .   . t     .
-     *   .........   .........
+     * This test creates a layout of this shape: 0 1 2 3 4 ......... ......... 0 . t . . t . .
+     * |---|---|---| . 1 . t | t | | t | t . ....|---| |---|.... 2 | | ....|---| |---|.... 3 . t | t
+     * | | t | t . . |---|---|---| . 4 . t . . t . ......... .........
      *
      * 4 LayoutNodes with PointerInputModifiers that are clipped by their parent LayoutNode. 4
-     * touches touch just inside the parent LayoutNode and inside the child LayoutNodes. 8
-     * touches touch just outside the parent LayoutNode but inside the child LayoutNodes.
+     * touches touch just inside the parent LayoutNode and inside the child LayoutNodes. 8 touches
+     * touch just outside the parent LayoutNode but inside the child LayoutNodes.
      *
      * Because layout node bounds are not used to clip pointer input hit testing, all pointers
      * should hit.
@@ -1983,70 +1866,31 @@
         val pointerInputFilter3: PointerInputFilter = mockPointerInputFilter()
         val pointerInputFilter4: PointerInputFilter = mockPointerInputFilter()
 
-        val layoutNode1 = LayoutNode(
-            -1, -1, 1, 1,
-            PointerInputModifierImpl(
-                pointerInputFilter1
-            )
-        )
-        val layoutNode2 = LayoutNode(
-            2, -1, 4, 1,
-            PointerInputModifierImpl(
-                pointerInputFilter2
-            )
-        )
-        val layoutNode3 = LayoutNode(
-            -1, 2, 1, 4,
-            PointerInputModifierImpl(
-                pointerInputFilter3
-            )
-        )
-        val layoutNode4 = LayoutNode(
-            2, 2, 4, 4,
-            PointerInputModifierImpl(
-                pointerInputFilter4
-            )
-        )
+        val layoutNode1 = LayoutNode(-1, -1, 1, 1, PointerInputModifierImpl(pointerInputFilter1))
+        val layoutNode2 = LayoutNode(2, -1, 4, 1, PointerInputModifierImpl(pointerInputFilter2))
+        val layoutNode3 = LayoutNode(-1, 2, 1, 4, PointerInputModifierImpl(pointerInputFilter3))
+        val layoutNode4 = LayoutNode(2, 2, 4, 4, PointerInputModifierImpl(pointerInputFilter4))
 
-        val parentLayoutNode = LayoutNode(1, 1, 4, 4).apply {
-            insertAt(0, layoutNode1)
-            insertAt(1, layoutNode2)
-            insertAt(2, layoutNode3)
-            insertAt(3, layoutNode4)
-            attach(MockOwner())
-        }
+        val parentLayoutNode =
+            LayoutNode(1, 1, 4, 4).apply {
+                insertAt(0, layoutNode1)
+                insertAt(1, layoutNode2)
+                insertAt(2, layoutNode3)
+                insertAt(3, layoutNode4)
+                attach(MockOwner())
+            }
         layoutNode1.onNodePlaced()
         layoutNode2.onNodePlaced()
         layoutNode3.onNodePlaced()
         layoutNode4.onNodePlaced()
 
-        val offsetsThatHit1 =
-            listOf(
-                Offset(0f, 1f),
-                Offset(1f, 0f),
-                Offset(1f, 1f)
-            )
+        val offsetsThatHit1 = listOf(Offset(0f, 1f), Offset(1f, 0f), Offset(1f, 1f))
 
-        val offsetsThatHit2 =
-            listOf(
-                Offset(3f, 0f),
-                Offset(3f, 1f),
-                Offset(4f, 1f)
-            )
+        val offsetsThatHit2 = listOf(Offset(3f, 0f), Offset(3f, 1f), Offset(4f, 1f))
 
-        val offsetsThatHit3 =
-            listOf(
-                Offset(0f, 3f),
-                Offset(1f, 3f),
-                Offset(1f, 4f)
-            )
+        val offsetsThatHit3 = listOf(Offset(0f, 3f), Offset(1f, 3f), Offset(1f, 4f))
 
-        val offsetsThatHit4 =
-            listOf(
-                Offset(3f, 3f),
-                Offset(3f, 4f),
-                Offset(4f, 3f)
-            )
+        val offsetsThatHit4 = listOf(Offset(3f, 3f), Offset(3f, 4f), Offset(4f, 3f))
 
         val hit = mutableListOf<Modifier.Node>()
 
@@ -2087,20 +1931,11 @@
         val pointerInputFilter3: PointerInputFilter = mockPointerInputFilter()
 
         val modifier =
-            PointerInputModifierImpl(
-                pointerInputFilter1
-            ) then PointerInputModifierImpl(
-                pointerInputFilter2
-            ) then PointerInputModifierImpl(
-                pointerInputFilter3
-            )
+            PointerInputModifierImpl(pointerInputFilter1) then
+                PointerInputModifierImpl(pointerInputFilter2) then
+                PointerInputModifierImpl(pointerInputFilter3)
 
-        val layoutNode = LayoutNode(
-            25, 50, 75, 100,
-            modifier
-        ).apply {
-            attach(MockOwner())
-        }
+        val layoutNode = LayoutNode(25, 50, 75, 100, modifier).apply { attach(MockOwner()) }
 
         val offset1 = Offset(50f, 75f)
 
@@ -2112,13 +1947,8 @@
 
         // Assert.
 
-        assertThat(hit.toFilters()).isEqualTo(
-            listOf(
-                pointerInputFilter1,
-                pointerInputFilter2,
-                pointerInputFilter3
-            )
-        )
+        assertThat(hit.toFilters())
+            .isEqualTo(listOf(pointerInputFilter1, pointerInputFilter2, pointerInputFilter3))
     }
 
     @Test
@@ -2128,24 +1958,13 @@
 
         val pointerInputFilter: PointerInputFilter = mockPointerInputFilter()
 
-        val layoutNode1 =
-            LayoutNode(
-                1, 5, 500, 500,
-                PointerInputModifierImpl(
-                    pointerInputFilter
-                )
-            )
-        val layoutNode2: LayoutNode = LayoutNode(2, 6, 500, 500).apply {
-            insertAt(0, layoutNode1)
-        }
-        val layoutNode3: LayoutNode = LayoutNode(3, 7, 500, 500).apply {
-            insertAt(0, layoutNode2)
-        }
-        val layoutNode4: LayoutNode = LayoutNode(4, 8, 500, 500).apply {
-            insertAt(0, layoutNode3)
-        }.apply {
-            attach(MockOwner())
-        }
+        val layoutNode1 = LayoutNode(1, 5, 500, 500, PointerInputModifierImpl(pointerInputFilter))
+        val layoutNode2: LayoutNode = LayoutNode(2, 6, 500, 500).apply { insertAt(0, layoutNode1) }
+        val layoutNode3: LayoutNode = LayoutNode(3, 7, 500, 500).apply { insertAt(0, layoutNode2) }
+        val layoutNode4: LayoutNode =
+            LayoutNode(4, 8, 500, 500)
+                .apply { insertAt(0, layoutNode3) }
+                .apply { attach(MockOwner()) }
         layoutNode3.onNodePlaced()
         layoutNode2.onNodePlaced()
         layoutNode1.onNodePlaced()
@@ -2172,37 +1991,32 @@
         val pointerInputFilter3: PointerInputFilter = mockPointerInputFilter()
         val pointerInputFilter4: PointerInputFilter = mockPointerInputFilter()
 
-        val layoutNode1 = LayoutNode(
-            1, 6, 500, 500,
-            PointerInputModifierImpl(
-                pointerInputFilter1
-            ) then PointerInputModifierImpl(
-                pointerInputFilter2
+        val layoutNode1 =
+            LayoutNode(
+                1,
+                6,
+                500,
+                500,
+                PointerInputModifierImpl(pointerInputFilter1) then
+                    PointerInputModifierImpl(pointerInputFilter2)
             )
-        )
-        val layoutNode2: LayoutNode = LayoutNode(2, 7, 500, 500).apply {
-            insertAt(0, layoutNode1)
-        }
+        val layoutNode2: LayoutNode = LayoutNode(2, 7, 500, 500).apply { insertAt(0, layoutNode1) }
         val layoutNode3 =
             LayoutNode(
-                3, 8, 500, 500,
-                PointerInputModifierImpl(
-                    pointerInputFilter3
-                ) then PointerInputModifierImpl(
-                    pointerInputFilter4
+                    3,
+                    8,
+                    500,
+                    500,
+                    PointerInputModifierImpl(pointerInputFilter3) then
+                        PointerInputModifierImpl(pointerInputFilter4)
                 )
-            ).apply {
-                insertAt(0, layoutNode2)
-            }
+                .apply { insertAt(0, layoutNode2) }
 
-        val layoutNode4: LayoutNode = LayoutNode(4, 9, 500, 500).apply {
-            insertAt(0, layoutNode3)
-        }
-        val layoutNode5: LayoutNode = LayoutNode(5, 10, 500, 500).apply {
-            insertAt(0, layoutNode4)
-        }.apply {
-            attach(MockOwner())
-        }
+        val layoutNode4: LayoutNode = LayoutNode(4, 9, 500, 500).apply { insertAt(0, layoutNode3) }
+        val layoutNode5: LayoutNode =
+            LayoutNode(5, 10, 500, 500)
+                .apply { insertAt(0, layoutNode4) }
+                .apply { attach(MockOwner()) }
         layoutNode4.onNodePlaced()
         layoutNode3.onNodePlaced()
         layoutNode2.onNodePlaced()
@@ -2218,14 +2032,15 @@
 
         // Assert.
 
-        assertThat(hit.toFilters()).isEqualTo(
-            listOf(
-                pointerInputFilter3,
-                pointerInputFilter4,
-                pointerInputFilter1,
-                pointerInputFilter2
+        assertThat(hit.toFilters())
+            .isEqualTo(
+                listOf(
+                    pointerInputFilter3,
+                    pointerInputFilter4,
+                    pointerInputFilter1,
+                    pointerInputFilter2
+                )
             )
-        )
     }
 
     @Test
@@ -2234,24 +2049,15 @@
         val pointerInputFilter1: PointerInputFilter = mockPointerInputFilter()
         val pointerInputFilter2: PointerInputFilter = mockPointerInputFilter()
 
-        val layoutNode1 = LayoutNode(
-            0, 0, 100, 100,
-            PointerInputModifierImpl(
-                pointerInputFilter1
-            )
-        )
-        val layoutNode2 = LayoutNode(
-            0, 0, 100, 100,
-            PointerInputModifierImpl(
-                pointerInputFilter2
-            )
-        )
+        val layoutNode1 = LayoutNode(0, 0, 100, 100, PointerInputModifierImpl(pointerInputFilter1))
+        val layoutNode2 = LayoutNode(0, 0, 100, 100, PointerInputModifierImpl(pointerInputFilter2))
 
-        val parentLayoutNode = LayoutNode(0, 0, 100, 100).apply {
-            insertAt(0, layoutNode1)
-            insertAt(1, layoutNode2)
-            attach(MockOwner())
-        }
+        val parentLayoutNode =
+            LayoutNode(0, 0, 100, 100).apply {
+                insertAt(0, layoutNode1)
+                insertAt(1, layoutNode2)
+                attach(MockOwner())
+            }
         layoutNode1.onNodePlaced()
         layoutNode2.onNodePlaced()
 
@@ -2273,14 +2079,10 @@
 
         val pointerInputFilter: PointerInputFilter = mockPointerInputFilter()
 
-        val layoutNode = LayoutNode(
-            0, 0, 0, 0,
-            PointerInputModifierImpl(
-                pointerInputFilter
-            )
-        ).apply {
-            attach(MockOwner())
-        }
+        val layoutNode =
+            LayoutNode(0, 0, 0, 0, PointerInputModifierImpl(pointerInputFilter)).apply {
+                attach(MockOwner())
+            }
 
         val offset = Offset.Zero
 
@@ -2301,33 +2103,13 @@
         val pointerInputFilter1: PointerInputFilter = mockPointerInputFilter()
         val pointerInputFilter2: PointerInputFilter = mockPointerInputFilter()
 
-        val parent = LayoutNode(
-            0, 0, 2, 2
-        ).apply {
-            attach(
-                MockOwner().apply {
-                    measureIteration = 1L
-                }
-            )
-        }
+        val parent =
+            LayoutNode(0, 0, 2, 2).apply { attach(MockOwner().apply { measureIteration = 1L }) }
         parent.insertAt(
             0,
-            LayoutNode(
-                0, 0, 2, 2,
-                PointerInputModifierImpl(
-                    pointerInputFilter1
-                ).zIndex(1f)
-            )
+            LayoutNode(0, 0, 2, 2, PointerInputModifierImpl(pointerInputFilter1).zIndex(1f))
         )
-        parent.insertAt(
-            1,
-            LayoutNode(
-                0, 0, 2, 2,
-                PointerInputModifierImpl(
-                    pointerInputFilter2
-                )
-            )
-        )
+        parent.insertAt(1, LayoutNode(0, 0, 2, 2, PointerInputModifierImpl(pointerInputFilter2)))
         parent.remeasure()
         parent.replace()
 
@@ -2370,18 +2152,14 @@
         val measureLambda1: MeasureScope.(Measurable, Constraints) -> MeasureResult =
             { measurable, constraints ->
                 val placeable = measurable.measure(constraints)
-                layout(placeable.width, placeable.height) {
-                    placeable.place(0, 0)
-                }
+                layout(placeable.width, placeable.height) { placeable.place(0, 0) }
             }
         val modifier1 = Modifier.layout(measureLambda1)
 
         val measureLambda2: MeasureScope.(Measurable, Constraints) -> MeasureResult =
             { measurable, constraints ->
                 val placeable = measurable.measure(constraints)
-                layout(placeable.width, placeable.height) {
-                    placeable.place(1, 1)
-                }
+                layout(placeable.width, placeable.height) { placeable.place(1, 1) }
             }
         val modifier2 = Modifier.layout(measureLambda2)
 
@@ -2391,26 +2169,30 @@
 
         assertEquals(
             measureLambda1,
-            ((root.outerCoordinator as LayoutModifierNodeCoordinator)
-                .layoutModifierNode as LayoutModifierImpl).measureBlock
+            ((root.outerCoordinator as LayoutModifierNodeCoordinator).layoutModifierNode
+                    as LayoutModifierImpl)
+                .measureBlock
         )
         assertEquals(
             measureLambda2,
-            ((root.outerCoordinator.wrapped as LayoutModifierNodeCoordinator)
-                .layoutModifierNode as LayoutModifierImpl).measureBlock
+            ((root.outerCoordinator.wrapped as LayoutModifierNodeCoordinator).layoutModifierNode
+                    as LayoutModifierImpl)
+                .measureBlock
         )
 
         root.modifier = modifier2.then(modifier1)
 
         assertEquals(
             measureLambda1,
-            ((root.outerCoordinator.wrapped as LayoutModifierNodeCoordinator)
-                .layoutModifierNode as LayoutModifierImpl).measureBlock
+            ((root.outerCoordinator.wrapped as LayoutModifierNodeCoordinator).layoutModifierNode
+                    as LayoutModifierImpl)
+                .measureBlock
         )
         assertEquals(
             measureLambda2,
-            ((root.outerCoordinator as LayoutModifierNodeCoordinator)
-                .layoutModifierNode as LayoutModifierImpl).measureBlock
+            ((root.outerCoordinator as LayoutModifierNodeCoordinator).layoutModifierNode
+                    as LayoutModifierImpl)
+                .measureBlock
         )
     }
 
@@ -2419,12 +2201,15 @@
         val node = LayoutNode(20, 20, 100, 100)
         val owner = MockOwner()
         node.attach(owner)
-        node.innerCoordinator.measureResult = object : MeasureResult {
-            override val width = 50
-            override val height = 50
-            override val alignmentLines: Map<AlignmentLine, Int> get() = mapOf()
-            override fun placeChildren() {}
-        }
+        node.innerCoordinator.measureResult =
+            object : MeasureResult {
+                override val width = 50
+                override val height = 50
+                override val alignmentLines: Map<AlignmentLine, Int>
+                    get() = mapOf()
+
+                override fun placeChildren() {}
+            }
         assertEquals(1, owner.layoutChangeCount)
         node.place(0, 0)
         assertEquals(2, owner.layoutChangeCount)
@@ -2438,9 +2223,7 @@
         assertEquals(0, owner.layoutChangeCount)
         node.innerCoordinator.updateLayerBlock({ scaleX = 0.5f })
         assertEquals(1, owner.layoutChangeCount)
-        repeat(2) {
-            node.innerCoordinator.updateLayerBlock({ scaleX = 1f })
-        }
+        repeat(2) { node.innerCoordinator.updateLayerBlock({ scaleX = 1f }) }
         assertEquals(2, owner.layoutChangeCount)
         node.innerCoordinator.updateLayerBlock(null)
         assertEquals(3, owner.layoutChangeCount)
@@ -2448,27 +2231,24 @@
 
     @Test
     fun reuseModifiersThatImplementMultipleModifierInterfaces() {
-        val drawAndLayoutModifier: Modifier = object : DrawModifier, LayoutModifier {
-            override fun MeasureScope.measure(
-                measurable: Measurable,
-                constraints: Constraints
-            ): MeasureResult {
-                val placeable = measurable.measure(constraints)
-                return layout(placeable.width, placeable.height) {
-                    placeable.placeRelative(IntOffset.Zero)
+        val drawAndLayoutModifier: Modifier =
+            object : DrawModifier, LayoutModifier {
+                override fun MeasureScope.measure(
+                    measurable: Measurable,
+                    constraints: Constraints
+                ): MeasureResult {
+                    val placeable = measurable.measure(constraints)
+                    return layout(placeable.width, placeable.height) {
+                        placeable.placeRelative(IntOffset.Zero)
+                    }
+                }
+
+                override fun ContentDrawScope.draw() {
+                    drawContent()
                 }
             }
-
-            override fun ContentDrawScope.draw() {
-                drawContent()
-            }
-        }
-        val a = Modifier
-            .then(EmptyLayoutModifier())
-            .then(drawAndLayoutModifier)
-        val b = Modifier
-            .then(EmptyLayoutModifier())
-            .then(drawAndLayoutModifier)
+        val a = Modifier.then(EmptyLayoutModifier()).then(drawAndLayoutModifier)
+        val b = Modifier.then(EmptyLayoutModifier()).then(drawAndLayoutModifier)
         val node = LayoutNode(20, 20, 100, 100)
         val owner = MockOwner()
         node.attach(owner)
@@ -2481,12 +2261,10 @@
     @Test
     fun nodeCoordinator_alpha() {
         val root = LayoutNode().apply { this.modifier = Modifier.drawBehind {} }
-        val layoutNode1 = LayoutNode().apply {
-            this.modifier = Modifier
-                .graphicsLayer { }
-                .graphicsLayer { }
-                .drawBehind {}
-        }
+        val layoutNode1 =
+            LayoutNode().apply {
+                this.modifier = Modifier.graphicsLayer {}.graphicsLayer {}.drawBehind {}
+            }
         val layoutNode2 = LayoutNode().apply { this.modifier = Modifier.drawBehind {} }
         val owner = MockOwner()
 
@@ -2495,12 +2273,8 @@
         root.attach(owner)
 
         // provide alpha to the graphics layer
-        layoutNode1.outerCoordinator.wrapped!!.updateLayerBlock({
-            alpha = 0f
-        })
-        layoutNode1.outerCoordinator.wrapped!!.wrapped!!.updateLayerBlock({
-            alpha = 0.5f
-        })
+        layoutNode1.outerCoordinator.wrapped!!.updateLayerBlock({ alpha = 0f })
+        layoutNode1.outerCoordinator.wrapped!!.wrapped!!.updateLayerBlock({ alpha = 0.5f })
 
         assertFalse(layoutNode1.outerCoordinator.isTransparent())
         assertTrue(layoutNode1.innerCoordinator.isTransparent())
@@ -2529,9 +2303,7 @@
         constraints: Constraints
     ): MeasureResult {
         val placeable = measurable.measure(constraints)
-        return layout(placeable.width, placeable.height) {
-            placeable.placeRelative(IntOffset.Zero)
-        }
+        return layout(placeable.width, placeable.height) { placeable.placeRelative(IntOffset.Zero) }
     }
 }
 
@@ -2548,16 +2320,22 @@
 
     override val rootForTest: RootForTest
         get() = TODO("Not yet implemented")
+
     override val hapticFeedBack: HapticFeedback
         get() = TODO("Not yet implemented")
+
     override val inputModeManager: InputModeManager
         get() = TODO("Not yet implemented")
+
     override val clipboardManager: ClipboardManager
         get() = TODO("Not yet implemented")
+
     override val accessibilityManager: AccessibilityManager
         get() = TODO("Not yet implemented")
+
     override val graphicsContext: GraphicsContext
         get() = TODO("Not yet implemented")
+
     override val textToolbar: TextToolbar
         get() = TODO("Not yet implemented")
 
@@ -2568,18 +2346,25 @@
     @OptIn(ExperimentalComposeUiApi::class)
     override val autofill: Autofill?
         get() = TODO("Not yet implemented")
+
     override val semanticAutofill: SemanticAutofill
         get() = TODO("Not yet implemented")
+
     override val density: Density
         get() = Density(1f)
+
     override val textInputService: TextInputService
         get() = TODO("Not yet implemented")
+
     override val softwareKeyboardController: SoftwareKeyboardController
         get() = TODO("Not yet implemented")
+
     override val pointerIconService: PointerIconService
         get() = TODO("Not yet implemented")
+
     override val focusOwner: FocusOwner
         get() = TODO("Not yet implemented")
+
     override val windowInfo: WindowInfo
         get() = TODO("Not yet implemented")
 
@@ -2590,15 +2375,18 @@
     @Suppress("DEPRECATION")
     override val fontLoader: Font.ResourceLoader
         get() = TODO("Not yet implemented")
+
     override val fontFamilyResolver: FontFamily.Resolver
         get() = TODO("Not yet implemented")
+
     override val layoutDirection: LayoutDirection
         get() = LayoutDirection.Ltr
-    @InternalCoreApi
-    override var showLayoutBounds: Boolean = false
+
+    @InternalCoreApi override var showLayoutBounds: Boolean = false
     override val snapshotObserver = OwnerSnapshotObserver { it.invoke() }
     override val modifierLocalManager: ModifierLocalManager = ModifierLocalManager(this)
-    override val dragAndDropManager: DragAndDropManager get() = TODO("Not yet implemented")
+    override val dragAndDropManager: DragAndDropManager
+        get() = TODO("Not yet implemented")
 
     override fun onRequestMeasure(
         layoutNode: LayoutNode,
@@ -2624,8 +2412,7 @@
         layoutNode.markLayoutPending()
     }
 
-    override fun requestOnPositionedCallback(layoutNode: LayoutNode) {
-    }
+    override fun requestOnPositionedCallback(layoutNode: LayoutNode) {}
 
     override fun onAttach(node: LayoutNode) {
         onAttachParams += node
@@ -2643,21 +2430,17 @@
 
     override fun requestFocus(): Boolean = false
 
-    override fun measureAndLayout(sendPointerUpdate: Boolean) {
-    }
+    override fun measureAndLayout(sendPointerUpdate: Boolean) {}
 
-    override fun measureAndLayout(layoutNode: LayoutNode, constraints: Constraints) {
-    }
+    override fun measureAndLayout(layoutNode: LayoutNode, constraints: Constraints) {}
 
-    override fun forceMeasureTheSubtree(layoutNode: LayoutNode, affectsLookahead: Boolean) {
-    }
+    override fun forceMeasureTheSubtree(layoutNode: LayoutNode, affectsLookahead: Boolean) {}
 
     override fun registerOnEndApplyChangesListener(listener: () -> Unit) {
         listener()
     }
 
-    override fun onEndApplyChanges() {
-    }
+    override fun onEndApplyChanges() {}
 
     override fun registerOnLayoutCompletedListener(listener: Owner.OnLayoutCompletedListener) {
         TODO("Not yet implemented")
@@ -2702,34 +2485,28 @@
 
             override fun isInLayer(position: Offset) = true
 
-            override fun move(position: IntOffset) {
-            }
+            override fun move(position: IntOffset) {}
 
-            override fun resize(size: IntSize) {
-            }
+            override fun resize(size: IntSize) {}
 
             override fun drawLayer(canvas: Canvas, parentLayer: GraphicsLayer?) {
                 drawBlock(canvas, null)
             }
 
-            override fun updateDisplayList() {
-            }
+            override fun updateDisplayList() {}
 
             override fun invalidate() {
                 invalidatedLayers.add(this)
             }
 
-            override fun destroy() {
-            }
+            override fun destroy() {}
 
-            override fun mapBounds(rect: MutableRect, inverse: Boolean) {
-            }
+            override fun mapBounds(rect: MutableRect, inverse: Boolean) {}
 
             override fun reuseLayer(
                 drawBlock: (Canvas, GraphicsLayer?) -> Unit,
                 invalidateParentLayer: () -> Unit
-            ) {
-            }
+            ) {}
 
             override fun transform(matrix: Matrix) {
                 matrix.timesAssign(transform)
@@ -2744,6 +2521,7 @@
     }
 
     var semanticsChanged: Boolean = false
+
     override fun onSemanticsChange() {
         semanticsChanged = true
     }
@@ -2780,55 +2558,57 @@
     y2: Int,
     modifier: Modifier = Modifier,
     minimumTouchTargetSize: DpSize = DpSize.Zero
-) = LayoutNode().apply {
-    this.viewConfiguration = TestViewConfiguration(minimumTouchTargetSize = minimumTouchTargetSize)
-    this.modifier = modifier
-    measurePolicy = object : LayoutNode.NoIntrinsicsMeasurePolicy("not supported") {
-        override fun MeasureScope.measure(
-            measurables: List<Measurable>,
-            constraints: Constraints
-        ): MeasureResult =
-            layout(x2 - x, y2 - y) {
-                measurables.forEach { it.measure(constraints).place(0, 0) }
+) =
+    LayoutNode().apply {
+        this.viewConfiguration =
+            TestViewConfiguration(minimumTouchTargetSize = minimumTouchTargetSize)
+        this.modifier = modifier
+        measurePolicy =
+            object : LayoutNode.NoIntrinsicsMeasurePolicy("not supported") {
+                override fun MeasureScope.measure(
+                    measurables: List<Measurable>,
+                    constraints: Constraints
+                ): MeasureResult =
+                    layout(x2 - x, y2 - y) {
+                        measurables.forEach { it.measure(constraints).place(0, 0) }
+                    }
             }
-    }
-    attach(MockOwner())
-    markMeasurePending()
-    remeasure(Constraints())
-    var wrapper: NodeCoordinator? = outerCoordinator
-    while (wrapper != null) {
-        wrapper.measureResult = innerCoordinator.measureResult
-        wrapper = (wrapper as? NodeCoordinator)?.wrapped
-    }
-    place(x, y)
-    detach()
-}
-
-private fun mockPointerInputFilter(
-    interceptChildEvents: Boolean = false
-): PointerInputFilter = object : PointerInputFilter() {
-    override fun onPointerEvent(
-        pointerEvent: PointerEvent,
-        pass: PointerEventPass,
-        bounds: IntSize
-    ) {
+        attach(MockOwner())
+        markMeasurePending()
+        remeasure(Constraints())
+        var wrapper: NodeCoordinator? = outerCoordinator
+        while (wrapper != null) {
+            wrapper.measureResult = innerCoordinator.measureResult
+            wrapper = (wrapper as? NodeCoordinator)?.wrapped
+        }
+        place(x, y)
+        detach()
     }
 
-    override fun onCancel() {
-    }
+private fun mockPointerInputFilter(interceptChildEvents: Boolean = false): PointerInputFilter =
+    object : PointerInputFilter() {
+        override fun onPointerEvent(
+            pointerEvent: PointerEvent,
+            pass: PointerEventPass,
+            bounds: IntSize
+        ) {}
 
-    override val interceptOutOfBoundsChildEvents: Boolean
-        get() = interceptChildEvents
-}
+        override fun onCancel() {}
+
+        override val interceptOutOfBoundsChildEvents: Boolean
+            get() = interceptChildEvents
+    }
 
 // This returns the corresponding modifier that produced the PointerInputNode. This is only
 // possible for PointerInputNodes that are BackwardsCompatNodes and once we refactor the
 // pointerInput modifier to use Modifier.Nodes directly, the tests that use this should be rewritten
 fun PointerInputModifierNode.toFilter(): PointerInputFilter {
-    val node = this as? BackwardsCompatNode
-        ?: error("Incorrectly assumed PointerInputNode was a BackwardsCompatNode")
-    val modifier = node.element as? PointerInputModifier
-        ?: error("Incorrectly assumed Modifier.Element was a PointerInputModifier")
+    val node =
+        this as? BackwardsCompatNode
+            ?: error("Incorrectly assumed PointerInputNode was a BackwardsCompatNode")
+    val modifier =
+        node.element as? PointerInputModifier
+            ?: error("Incorrectly assumed Modifier.Element was a PointerInputModifier")
     return modifier.pointerInputFilter
 }
 
@@ -2840,8 +2620,9 @@
 // Nodes that are BackwardsCompatNodes and once we refactor semantics / pointer input to use
 // Modifier.Nodes directly, the tests that use this should be rewritten
 fun DelegatableNode.toModifier(): Modifier.Element {
-    val node = node as? BackwardsCompatNode
-        ?: error("Incorrectly assumed Modifier.Node was a BackwardsCompatNode")
+    val node =
+        node as? BackwardsCompatNode
+            ?: error("Incorrectly assumed Modifier.Node was a BackwardsCompatNode")
     return node.element
 }
 
diff --git a/compose/ui/ui/src/androidUnitTest/kotlin/androidx/compose/ui/node/ModifierLocalConsumerEntityTest.kt b/compose/ui/ui/src/androidUnitTest/kotlin/androidx/compose/ui/node/ModifierLocalConsumerEntityTest.kt
index 84d9749..f371029 100644
--- a/compose/ui/ui/src/androidUnitTest/kotlin/androidx/compose/ui/node/ModifierLocalConsumerEntityTest.kt
+++ b/compose/ui/ui/src/androidUnitTest/kotlin/androidx/compose/ui/node/ModifierLocalConsumerEntityTest.kt
@@ -106,9 +106,9 @@
         receivedValue = ""
 
         // Act.
-        changeModifier(Modifier.modifierLocalConsumer {
-            receivedValue = ModifierLocalString.current
-        })
+        changeModifier(
+            Modifier.modifierLocalConsumer { receivedValue = ModifierLocalString.current }
+        )
 
         // Assert.
         assertThat(receivedValue).isEqualTo(default)
@@ -134,9 +134,9 @@
         // Arrange.
         var receivedValue = ""
         TestBox(
-            modifier = Modifier
-                .modifierLocalProvider(ModifierLocalString) { "Initial Value" }
-                .modifierLocalConsumer { receivedValue = ModifierLocalString.current }
+            modifier =
+                Modifier.modifierLocalProvider(ModifierLocalString) { "Initial Value" }
+                    .modifierLocalConsumer { receivedValue = ModifierLocalString.current }
         )
 
         // Assert.
@@ -149,9 +149,9 @@
         val providedValue = "Provided Value"
         lateinit var receivedValue: String
         TestBox(
-            modifier = Modifier
-                .modifierLocalProvider(ModifierLocalString) { providedValue }
-                .modifierLocalConsumer { receivedValue = ModifierLocalString.current }
+            modifier =
+                Modifier.modifierLocalProvider(ModifierLocalString) { providedValue }
+                    .modifierLocalConsumer { receivedValue = ModifierLocalString.current }
         )
         // Act.
         attach()
@@ -168,16 +168,14 @@
         var providedValue by mutableStateOf(initialValue)
         lateinit var receivedValue: String
         TestBox(
-            modifier = Modifier
-                .modifierLocalProvider(ModifierLocalString) { providedValue }
-                .modifierLocalConsumer { receivedValue = ModifierLocalString.current }
+            modifier =
+                Modifier.modifierLocalProvider(ModifierLocalString) { providedValue }
+                    .modifierLocalConsumer { receivedValue = ModifierLocalString.current }
         )
         attach()
 
         // Act.
-        Snapshot.withMutableSnapshot {
-            providedValue = finalValue
-        }
+        Snapshot.withMutableSnapshot { providedValue = finalValue }
 
         // Assert.
         assertThat(receivedValue).isEqualTo(finalValue)
@@ -191,18 +189,16 @@
         var providedValue by mutableStateOf(initialValue)
         lateinit var receivedValue: String
         TestBox(
-            modifier = Modifier
-                .modifierLocalProvider(ModifierLocalString) { providedValue }
-                .modifierLocalConsumer { receivedValue = ModifierLocalString.current }
+            modifier =
+                Modifier.modifierLocalProvider(ModifierLocalString) { providedValue }
+                    .modifierLocalConsumer { receivedValue = ModifierLocalString.current }
         )
         attach()
         detach()
         receivedValue = ""
 
         // Act.
-        Snapshot.withMutableSnapshot {
-            providedValue = finalValue
-        }
+        Snapshot.withMutableSnapshot { providedValue = finalValue }
 
         // Assert.
         assertThat(receivedValue).isEmpty()
@@ -213,18 +209,18 @@
         // Arrange.
         lateinit var receivedValue: String
         TestBox(
-            modifier = Modifier
-                .modifierLocalProvider(ModifierLocalString) { "Provided Value" }
-                .modifierLocalConsumer { receivedValue = ModifierLocalString.current }
+            modifier =
+                Modifier.modifierLocalProvider(ModifierLocalString) { "Provided Value" }
+                    .modifierLocalConsumer { receivedValue = ModifierLocalString.current }
         )
         attach()
         detach()
         receivedValue = ""
 
         // Act.
-        changeModifier(Modifier.modifierLocalConsumer {
-            receivedValue = ModifierLocalString.current
-        })
+        changeModifier(
+            Modifier.modifierLocalConsumer { receivedValue = ModifierLocalString.current }
+        )
 
         // Assert.
         assertThat(receivedValue).isEmpty()
@@ -236,17 +232,16 @@
         val providedValue = "Provided Value"
         lateinit var receivedValue: String
         TestBox(
-            modifier = Modifier
-                .modifierLocalProvider(ModifierLocalString) { providedValue }
-                .modifierLocalConsumer { receivedValue = ModifierLocalString.current }
+            modifier =
+                Modifier.modifierLocalProvider(ModifierLocalString) { providedValue }
+                    .modifierLocalConsumer { receivedValue = ModifierLocalString.current }
         )
         attach()
         receivedValue = ""
 
         // Act.
         changeModifier(
-            Modifier
-                .modifierLocalProvider(ModifierLocalString) { providedValue }
+            Modifier.modifierLocalProvider(ModifierLocalString) { providedValue }
                 .modifierLocalConsumer { receivedValue = ModifierLocalString.current }
         )
 
@@ -259,9 +254,9 @@
         // Arrange.
         lateinit var receivedValue: String
         TestBox(
-            modifier = Modifier
-                .modifierLocalProvider(ModifierLocalString) { "Provided Value" }
-                .modifierLocalConsumer { receivedValue = ModifierLocalString.current }
+            modifier =
+                Modifier.modifierLocalProvider(ModifierLocalString) { "Provided Value" }
+                    .modifierLocalConsumer { receivedValue = ModifierLocalString.current }
         )
         attach()
         receivedValue = ""
@@ -301,12 +296,13 @@
     private class FakeOwner : Owner {
         val listeners = mutableVectorOf<() -> Unit>()
 
-        @OptIn(InternalCoreApi::class)
-        override var showLayoutBounds: Boolean = false
+        @OptIn(InternalCoreApi::class) override var showLayoutBounds: Boolean = false
         override val snapshotObserver: OwnerSnapshotObserver = OwnerSnapshotObserver { it.invoke() }
 
         override val modifierLocalManager: ModifierLocalManager = ModifierLocalManager(this)
-        override val dragAndDropManager: DragAndDropManager get() = TODO("Not yet implemented")
+        override val dragAndDropManager: DragAndDropManager
+            get() = TODO("Not yet implemented")
+
         override val coroutineContext: CoroutineContext =
             Executors.newFixedThreadPool(3).asCoroutineDispatcher()
 
@@ -329,8 +325,7 @@
             affectsLookahead: Boolean,
             forceRequest: Boolean,
             scheduleMeasureAndLayout: Boolean
-        ) {
-        }
+        ) {}
 
         override fun onAttach(node: LayoutNode) =
             node.forEachNodeCoordinator { it.onLayoutNodeAttach() }
@@ -339,32 +334,46 @@
 
         override val root: LayoutNode
             get() = TODO("Not yet implemented")
+
         override val sharedDrawScope: LayoutNodeDrawScope
             get() = TODO("Not yet implemented")
+
         override val rootForTest: RootForTest
             get() = TODO("Not yet implemented")
+
         override val hapticFeedBack: HapticFeedback
             get() = TODO("Not yet implemented")
+
         override val inputModeManager: InputModeManager
             get() = TODO("Not yet implemented")
+
         override val clipboardManager: ClipboardManager
             get() = TODO("Not yet implemented")
+
         override val accessibilityManager: AccessibilityManager
             get() = TODO("Not yet implemented")
+
         override val graphicsContext: GraphicsContext
             get() = TODO("Not yet implemented")
+
         override val textToolbar: TextToolbar
             get() = TODO("Not yet implemented")
+
         override val density: Density
             get() = TODO("Not yet implemented")
+
         override val textInputService: TextInputService
             get() = TODO("Not yet implemented")
+
         override val softwareKeyboardController: SoftwareKeyboardController
             get() = TODO("Not yet implemented")
+
         override val pointerIconService: PointerIconService
             get() = TODO("Not yet implemented")
+
         override val focusOwner: FocusOwner
             get() = TODO("Not yet implemented")
+
         override val windowInfo: WindowInfo
             get() = TODO("Not yet implemented")
 
@@ -375,18 +384,25 @@
         @Suppress("DEPRECATION")
         override val fontLoader: Font.ResourceLoader
             get() = TODO("Not yet implemented")
+
         override val fontFamilyResolver: FontFamily.Resolver
             get() = TODO("Not yet implemented")
+
         override val layoutDirection: LayoutDirection
             get() = TODO("Not yet implemented")
+
         override val measureIteration: Long
             get() = TODO("Not yet implemented")
+
         override val viewConfiguration: ViewConfiguration
             get() = TODO("Not yet implemented")
+
         override val autofillTree: AutofillTree
             get() = TODO("Not yet implemented")
+
         override val autofill: Autofill
             get() = TODO("Not yet implemented")
+
         override val semanticAutofill: SemanticAutofill
             get() = TODO("Not yet implemented")
 
@@ -406,17 +422,13 @@
             TODO("Not yet implemented")
         }
 
-        override fun calculatePositionInWindow(localPosition: Offset) =
-            TODO("Not yet implemented")
+        override fun calculatePositionInWindow(localPosition: Offset) = TODO("Not yet implemented")
 
-        override fun calculateLocalPosition(positionInWindow: Offset) =
-            TODO("Not yet implemented")
+        override fun calculateLocalPosition(positionInWindow: Offset) = TODO("Not yet implemented")
 
-        override fun requestFocus() =
-            TODO("Not yet implemented")
+        override fun requestFocus() = TODO("Not yet implemented")
 
-        override fun measureAndLayout(sendPointerUpdate: Boolean) =
-            TODO("Not yet implemented")
+        override fun measureAndLayout(sendPointerUpdate: Boolean) = TODO("Not yet implemented")
 
         override fun measureAndLayout(layoutNode: LayoutNode, constraints: Constraints) {
             TODO("Not yet implemented")
@@ -425,14 +437,11 @@
         override fun forceMeasureTheSubtree(layoutNode: LayoutNode, affectsLookahead: Boolean) =
             TODO("Not yet implemented")
 
-        override fun onSemanticsChange() =
-            TODO("Not yet implemented")
+        override fun onSemanticsChange() = TODO("Not yet implemented")
 
-        override fun onLayoutChange(layoutNode: LayoutNode) =
-            TODO("Not yet implemented")
+        override fun onLayoutChange(layoutNode: LayoutNode) = TODO("Not yet implemented")
 
-        override fun getFocusDirection(keyEvent: KeyEvent) =
-            TODO("Not yet implemented")
+        override fun getFocusDirection(keyEvent: KeyEvent) = TODO("Not yet implemented")
 
         override suspend fun textInputSession(
             session: suspend PlatformTextInputSessionScope.() -> Nothing
diff --git a/compose/ui/ui/src/androidUnitTest/kotlin/androidx/compose/ui/node/ModifierNodeElementTest.kt b/compose/ui/ui/src/androidUnitTest/kotlin/androidx/compose/ui/node/ModifierNodeElementTest.kt
index d0f0cf0..d612110 100644
--- a/compose/ui/ui/src/androidUnitTest/kotlin/androidx/compose/ui/node/ModifierNodeElementTest.kt
+++ b/compose/ui/ui/src/androidUnitTest/kotlin/androidx/compose/ui/node/ModifierNodeElementTest.kt
@@ -37,32 +37,37 @@
             inputParameter: Boolean
         ) : ModifierNodeElement<Modifier.Node>() {
             var classProperty = 0
+
             override fun create() = object : Modifier.Node() {}
+
             override fun update(node: Modifier.Node) {}
+
             // We don't use equals or hashCode in this test, so bad implementations are okay.
             override fun hashCode() = 0
+
             override fun equals(other: Any?) = (this === other)
         }
 
-        val modifier = AElement(
-            string = "parameter 1",
-            int = 12345,
-            map = mapOf("key" to "value"),
-            inputParameter = true
-        ).apply {
-            classProperty = 42
-        }
+        val modifier =
+            AElement(
+                    string = "parameter 1",
+                    int = 12345,
+                    map = mapOf("key" to "value"),
+                    inputParameter = true
+                )
+                .apply { classProperty = 42 }
 
         assertEquals(
             "The modifier's inspectable value was not automatically populated as expected",
             expectedName = "AElement",
             expectedValue = null,
-            expectedProperties = listOf(
-                ValueElement("classProperty", 42),
-                ValueElement("int", 12345),
-                ValueElement("map", mapOf("key" to "value")),
-                ValueElement("string", "parameter 1"),
-            ),
+            expectedProperties =
+                listOf(
+                    ValueElement("classProperty", 42),
+                    ValueElement("int", 12345),
+                    ValueElement("map", mapOf("key" to "value")),
+                    ValueElement("string", "parameter 1"),
+                ),
             actual = modifier
         )
     }
@@ -75,17 +80,9 @@
         expectedProperties: List<ValueElement> = emptyList(),
         actual: InspectableValue
     ) {
-        assertEquals(
-            "$message (unexpected name)",
-            expectedName,
-            actual.nameFallback
-        )
+        assertEquals("$message (unexpected name)", expectedName, actual.nameFallback)
 
-        assertEquals(
-            "$message (unexpected value)",
-            expectedValue,
-            actual.valueOverride
-        )
+        assertEquals("$message (unexpected value)", expectedValue, actual.valueOverride)
 
         assertEquals(
             "$message (unexpected properties)",
diff --git a/compose/ui/ui/src/androidUnitTest/kotlin/androidx/compose/ui/node/NestedVectorStackTest.kt b/compose/ui/ui/src/androidUnitTest/kotlin/androidx/compose/ui/node/NestedVectorStackTest.kt
index 3b08674..951cb3d 100644
--- a/compose/ui/ui/src/androidUnitTest/kotlin/androidx/compose/ui/node/NestedVectorStackTest.kt
+++ b/compose/ui/ui/src/androidUnitTest/kotlin/androidx/compose/ui/node/NestedVectorStackTest.kt
@@ -31,9 +31,7 @@
         stack.push(mutableVectorOf(1, 2, 3))
         stack.push(mutableVectorOf(4, 5, 6))
 
-        Truth
-            .assertThat(stack.enumerate())
-            .isEqualTo(listOf(6, 5, 4, 3, 2, 1))
+        Truth.assertThat(stack.enumerate()).isEqualTo(listOf(6, 5, 4, 3, 2, 1))
     }
 
     @Test
@@ -47,9 +45,7 @@
 
         Truth.assertThat(stack.pop()).isEqualTo(6)
 
-        Truth
-            .assertThat(stack.enumerate())
-            .isEqualTo(listOf(5, 4, 2, 1))
+        Truth.assertThat(stack.enumerate()).isEqualTo(listOf(5, 4, 2, 1))
     }
 
     @Test
@@ -65,9 +61,7 @@
 
         Truth.assertThat(stack.pop()).isEqualTo(6)
 
-        Truth
-            .assertThat(stack.enumerate())
-            .isEqualTo(listOf(5, 4))
+        Truth.assertThat(stack.enumerate()).isEqualTo(listOf(5, 4))
     }
 }
 
diff --git a/compose/ui/ui/src/androidUnitTest/kotlin/androidx/compose/ui/platform/ClipboardManagerTest.kt b/compose/ui/ui/src/androidUnitTest/kotlin/androidx/compose/ui/platform/ClipboardManagerTest.kt
index 35fd899..c666a6b 100644
--- a/compose/ui/ui/src/androidUnitTest/kotlin/androidx/compose/ui/platform/ClipboardManagerTest.kt
+++ b/compose/ui/ui/src/androidUnitTest/kotlin/androidx/compose/ui/platform/ClipboardManagerTest.kt
@@ -41,17 +41,17 @@
     }
 }
 
-fun FakeClipboardManager(
-    initialText: String? = null
-) = object : ClipboardManager {
-    private var currentText: AnnotatedString? = initialText?.let { AnnotatedString(it) }
-    override fun setText(annotatedString: AnnotatedString) {
-        currentText = annotatedString
+fun FakeClipboardManager(initialText: String? = null) =
+    object : ClipboardManager {
+        private var currentText: AnnotatedString? = initialText?.let { AnnotatedString(it) }
+
+        override fun setText(annotatedString: AnnotatedString) {
+            currentText = annotatedString
+        }
+
+        override fun getText(): AnnotatedString? = currentText
+
+        override fun getClip(): ClipEntry? = null
+
+        override fun setClip(clipEntry: ClipEntry?) = Unit
     }
-
-    override fun getText(): AnnotatedString? = currentText
-
-    override fun getClip(): ClipEntry? = null
-
-    override fun setClip(clipEntry: ClipEntry?) = Unit
-}
diff --git a/compose/ui/ui/src/androidUnitTest/kotlin/androidx/compose/ui/platform/WindowInfoTest.kt b/compose/ui/ui/src/androidUnitTest/kotlin/androidx/compose/ui/platform/WindowInfoTest.kt
index 07ce625..c99c7df 100644
--- a/compose/ui/ui/src/androidUnitTest/kotlin/androidx/compose/ui/platform/WindowInfoTest.kt
+++ b/compose/ui/ui/src/androidUnitTest/kotlin/androidx/compose/ui/platform/WindowInfoTest.kt
@@ -68,9 +68,7 @@
         val wi = WindowInfoImpl()
 
         var last: PointerKeyboardModifiers? = null
-        launch(Job()) {
-            snapshotFlow { wi.keyboardModifiers }.collect { last = it }
-        }
+        launch(Job()) { snapshotFlow { wi.keyboardModifiers }.collect { last = it } }
         testScheduler.runCurrent()
         assertThat(last).isEqualTo(EmptyPointerKeyboardModifiers())
 
diff --git a/compose/ui/ui/src/androidUnitTest/kotlin/androidx/compose/ui/text/TextActionModeCallbackTest.kt b/compose/ui/ui/src/androidUnitTest/kotlin/androidx/compose/ui/text/TextActionModeCallbackTest.kt
index 9a2a069..23ce37c 100644
--- a/compose/ui/ui/src/androidUnitTest/kotlin/androidx/compose/ui/text/TextActionModeCallbackTest.kt
+++ b/compose/ui/ui/src/androidUnitTest/kotlin/androidx/compose/ui/text/TextActionModeCallbackTest.kt
@@ -38,9 +38,7 @@
 class TextActionModeCallbackTest {
     @Test
     fun addMenuItem_correctValues() {
-        val callback = TextActionModeCallback(
-            onCopyRequested = { /* copy */ }
-        )
+        val callback = TextActionModeCallback(onCopyRequested = { /* copy */ })
         val menu = ItemTrackingFakeMenu()
         callback.addMenuItem(menu, MenuItemOption.Copy)
 
@@ -205,7 +203,9 @@
     private val testOrder: Int,
     private val testTitleRes: Int
 ) : MenuItem {
-    constructor(menuItemOption: MenuItemOption) : this(
+    constructor(
+        menuItemOption: MenuItemOption
+    ) : this(
         testId = menuItemOption.id,
         testOrder = menuItemOption.order,
         testTitleRes = menuItemOption.titleResource
@@ -333,8 +333,7 @@
         TODO("Not yet implemented")
     }
 
-    override fun setShowAsAction(actionEnum: Int) {
-    }
+    override fun setShowAsAction(actionEnum: Int) {}
 
     override fun setShowAsActionFlags(actionEnum: Int): MenuItem {
         TODO("Not yet implemented")
diff --git a/compose/ui/ui/src/androidUnitTest/kotlin/androidx/compose/ui/text/input/TextInputServiceAndroidCommandDebouncingTest.kt b/compose/ui/ui/src/androidUnitTest/kotlin/androidx/compose/ui/text/input/TextInputServiceAndroidCommandDebouncingTest.kt
index 19ff239..f27a52f 100644
--- a/compose/ui/ui/src/androidUnitTest/kotlin/androidx/compose/ui/text/input/TextInputServiceAndroidCommandDebouncingTest.kt
+++ b/compose/ui/ui/src/androidUnitTest/kotlin/androidx/compose/ui/text/input/TextInputServiceAndroidCommandDebouncingTest.kt
@@ -42,9 +42,13 @@
     private val view = mock<View>()
     private val inputMethodManager = TestInputMethodManager()
     private val executor = Executor { runnable -> scope.launch { runnable.run() } }
-    private val service = TextInputServiceAndroid(
-        view, mock(), inputMethodManager, inputCommandProcessorExecutor = executor
-    )
+    private val service =
+        TextInputServiceAndroid(
+            view,
+            mock(),
+            inputMethodManager,
+            inputCommandProcessorExecutor = executor
+        )
     private val dispatcher = StandardTestDispatcher()
     private val scope = TestScope(dispatcher + Job())
 
@@ -162,9 +166,7 @@
 
     @Test
     fun multipleShowCallsAreDebounced() {
-        repeat(10) {
-            service.showSoftwareKeyboard()
-        }
+        repeat(10) { service.showSoftwareKeyboard() }
         scope.advanceUntilIdle()
 
         assertThat(inputMethodManager.showSoftInputCalls).isEqualTo(1)
@@ -172,9 +174,7 @@
 
     @Test
     fun multipleHideCallsAreDebounced() {
-        repeat(10) {
-            service.hideSoftwareKeyboard()
-        }
+        repeat(10) { service.hideSoftwareKeyboard() }
         scope.advanceUntilIdle()
 
         assertThat(inputMethodManager.hideSoftInputCalls).isEqualTo(1)
@@ -301,18 +301,15 @@
             hideSoftInputCalls++
         }
 
-        override fun updateExtractedText(token: Int, extractedText: ExtractedText) {
-        }
+        override fun updateExtractedText(token: Int, extractedText: ExtractedText) {}
 
         override fun updateSelection(
             selectionStart: Int,
             selectionEnd: Int,
             compositionStart: Int,
             compositionEnd: Int
-        ) {
-        }
+        ) {}
 
-        override fun updateCursorAnchorInfo(cursorAnchorInfo: CursorAnchorInfo) {
-        }
+        override fun updateCursorAnchorInfo(cursorAnchorInfo: CursorAnchorInfo) {}
     }
 }
diff --git a/compose/ui/ui/src/androidUnitTest/kotlin/androidx/compose/ui/window/PopupPositionProviderTest.kt b/compose/ui/ui/src/androidUnitTest/kotlin/androidx/compose/ui/window/PopupPositionProviderTest.kt
index cb80640..cda0107 100644
--- a/compose/ui/ui/src/androidUnitTest/kotlin/androidx/compose/ui/window/PopupPositionProviderTest.kt
+++ b/compose/ui/ui/src/androidUnitTest/kotlin/androidx/compose/ui/window/PopupPositionProviderTest.kt
@@ -252,11 +252,6 @@
         val popupSize = IntSize(40, 20)
 
         return AlignmentOffsetPositionProvider(alignment, offset)
-            .calculatePosition(
-                anchorBounds,
-                windowSize,
-                layoutDir,
-                popupSize
-            )
+            .calculatePosition(anchorBounds, windowSize, layoutDir, popupSize)
     }
 }
diff --git a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/Alignment.kt b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/Alignment.kt
index 1226144..deb3ad6 100644
--- a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/Alignment.kt
+++ b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/Alignment.kt
@@ -34,9 +34,9 @@
 @Stable
 fun interface Alignment {
     /**
-     * Calculates the position of a box of size [size] relative to the top left corner of an area
-     * of size [space]. The returned offset can be negative or larger than `space - size`,
-     * meaning that the box will be positioned partially or completely outside the area.
+     * Calculates the position of a box of size [size] relative to the top left corner of an area of
+     * size [space]. The returned offset can be negative or larger than `space - size`, meaning that
+     * the box will be positioned partially or completely outside the area.
      */
     fun align(size: IntSize, space: IntSize, layoutDirection: LayoutDirection): IntOffset
 
@@ -48,126 +48,91 @@
     @Stable
     fun interface Horizontal {
         /**
-         * Calculates the horizontal position of a box of width [size] relative to the left
-         * side of an area of width [space]. The returned offset can be negative or larger than
-         * `space - size` meaning that the box will be positioned partially or completely outside
-         * the area.
+         * Calculates the horizontal position of a box of width [size] relative to the left side of
+         * an area of width [space]. The returned offset can be negative or larger than `space -
+         * size` meaning that the box will be positioned partially or completely outside the area.
          */
         fun align(size: Int, space: Int, layoutDirection: LayoutDirection): Int
     }
 
     /**
      * An interface to calculate the position of a box of a certain height inside an available
-     * height. [Alignment.Vertical] is often used to define the vertical alignment of a
-     * layout inside a parent layout.
+     * height. [Alignment.Vertical] is often used to define the vertical alignment of a layout
+     * inside a parent layout.
      */
     @Stable
     fun interface Vertical {
         /**
-         * Calculates the vertical position of a box of height [size] relative to the top edge of
-         * an area of height [space]. The returned offset can be negative or larger than
-         * `space - size` meaning that the box will be positioned partially or completely outside
-         * the area.
+         * Calculates the vertical position of a box of height [size] relative to the top edge of an
+         * area of height [space]. The returned offset can be negative or larger than `space - size`
+         * meaning that the box will be positioned partially or completely outside the area.
          */
         fun align(size: Int, space: Int): Int
     }
 
-    /**
-     * A collection of common [Alignment]s aware of layout direction.
-     */
+    /** A collection of common [Alignment]s aware of layout direction. */
     companion object {
         // 2D Alignments.
-        @Stable
-        val TopStart: Alignment = BiasAlignment(-1f, -1f)
-        @Stable
-        val TopCenter: Alignment = BiasAlignment(0f, -1f)
-        @Stable
-        val TopEnd: Alignment = BiasAlignment(1f, -1f)
-        @Stable
-        val CenterStart: Alignment = BiasAlignment(-1f, 0f)
-        @Stable
-        val Center: Alignment = BiasAlignment(0f, 0f)
-        @Stable
-        val CenterEnd: Alignment = BiasAlignment(1f, 0f)
-        @Stable
-        val BottomStart: Alignment = BiasAlignment(-1f, 1f)
-        @Stable
-        val BottomCenter: Alignment = BiasAlignment(0f, 1f)
-        @Stable
-        val BottomEnd: Alignment = BiasAlignment(1f, 1f)
+        @Stable val TopStart: Alignment = BiasAlignment(-1f, -1f)
+        @Stable val TopCenter: Alignment = BiasAlignment(0f, -1f)
+        @Stable val TopEnd: Alignment = BiasAlignment(1f, -1f)
+        @Stable val CenterStart: Alignment = BiasAlignment(-1f, 0f)
+        @Stable val Center: Alignment = BiasAlignment(0f, 0f)
+        @Stable val CenterEnd: Alignment = BiasAlignment(1f, 0f)
+        @Stable val BottomStart: Alignment = BiasAlignment(-1f, 1f)
+        @Stable val BottomCenter: Alignment = BiasAlignment(0f, 1f)
+        @Stable val BottomEnd: Alignment = BiasAlignment(1f, 1f)
 
         // 1D Alignment.Verticals.
-        @Stable
-        val Top: Vertical = BiasAlignment.Vertical(-1f)
-        @Stable
-        val CenterVertically: Vertical = BiasAlignment.Vertical(0f)
-        @Stable
-        val Bottom: Vertical = BiasAlignment.Vertical(1f)
+        @Stable val Top: Vertical = BiasAlignment.Vertical(-1f)
+        @Stable val CenterVertically: Vertical = BiasAlignment.Vertical(0f)
+        @Stable val Bottom: Vertical = BiasAlignment.Vertical(1f)
 
         // 1D Alignment.Horizontals.
-        @Stable
-        val Start: Horizontal = BiasAlignment.Horizontal(-1f)
-        @Stable
-        val CenterHorizontally: Horizontal = BiasAlignment.Horizontal(0f)
-        @Stable
-        val End: Horizontal = BiasAlignment.Horizontal(1f)
+        @Stable val Start: Horizontal = BiasAlignment.Horizontal(-1f)
+        @Stable val CenterHorizontally: Horizontal = BiasAlignment.Horizontal(0f)
+        @Stable val End: Horizontal = BiasAlignment.Horizontal(1f)
     }
 }
 
-/**
- * A collection of common [Alignment]s unaware of the layout direction.
- */
+/** A collection of common [Alignment]s unaware of the layout direction. */
 object AbsoluteAlignment {
     // 2D AbsoluteAlignments.
-    @Stable
-    val TopLeft: Alignment = BiasAbsoluteAlignment(-1f, -1f)
-    @Stable
-    val TopRight: Alignment = BiasAbsoluteAlignment(1f, -1f)
-    @Stable
-    val CenterLeft: Alignment = BiasAbsoluteAlignment(-1f, 0f)
-    @Stable
-    val CenterRight: Alignment = BiasAbsoluteAlignment(1f, 0f)
-    @Stable
-    val BottomLeft: Alignment = BiasAbsoluteAlignment(-1f, 1f)
-    @Stable
-    val BottomRight: Alignment = BiasAbsoluteAlignment(1f, 1f)
+    @Stable val TopLeft: Alignment = BiasAbsoluteAlignment(-1f, -1f)
+    @Stable val TopRight: Alignment = BiasAbsoluteAlignment(1f, -1f)
+    @Stable val CenterLeft: Alignment = BiasAbsoluteAlignment(-1f, 0f)
+    @Stable val CenterRight: Alignment = BiasAbsoluteAlignment(1f, 0f)
+    @Stable val BottomLeft: Alignment = BiasAbsoluteAlignment(-1f, 1f)
+    @Stable val BottomRight: Alignment = BiasAbsoluteAlignment(1f, 1f)
 
     // 1D BiasAbsoluteAlignment.Horizontals.
-    @Stable
-    val Left: Alignment.Horizontal = BiasAbsoluteAlignment.Horizontal(-1f)
-    @Stable
-    val Right: Alignment.Horizontal = BiasAbsoluteAlignment.Horizontal(1f)
+    @Stable val Left: Alignment.Horizontal = BiasAbsoluteAlignment.Horizontal(-1f)
+    @Stable val Right: Alignment.Horizontal = BiasAbsoluteAlignment.Horizontal(1f)
 }
 
 /**
  * An [Alignment] specified by bias: for example, a bias of -1 represents alignment to the
- * start/top, a bias of 0 will represent centering, and a bias of 1 will represent end/bottom.
- * Any value can be specified to obtain an alignment. Inside the [-1, 1] range, the obtained
- * alignment will position the aligned size fully inside the available space, while outside the
- * range it will the aligned size will be positioned partially or completely outside.
+ * start/top, a bias of 0 will represent centering, and a bias of 1 will represent end/bottom. Any
+ * value can be specified to obtain an alignment. Inside the [-1, 1] range, the obtained alignment
+ * will position the aligned size fully inside the available space, while outside the range it will
+ * the aligned size will be positioned partially or completely outside.
  *
  * @see BiasAbsoluteAlignment
  * @see Alignment
  */
 @Immutable
-data class BiasAlignment(
-    val horizontalBias: Float,
-    val verticalBias: Float
-) : Alignment {
-    override fun align(
-        size: IntSize,
-        space: IntSize,
-        layoutDirection: LayoutDirection
-    ): IntOffset {
+data class BiasAlignment(val horizontalBias: Float, val verticalBias: Float) : Alignment {
+    override fun align(size: IntSize, space: IntSize, layoutDirection: LayoutDirection): IntOffset {
         // Convert to Px first and only round at the end, to avoid rounding twice while calculating
         // the new positions
         val centerX = (space.width - size.width).toFloat() / 2f
         val centerY = (space.height - size.height).toFloat() / 2f
-        val resolvedHorizontalBias = if (layoutDirection == LayoutDirection.Ltr) {
-            horizontalBias
-        } else {
-            -1 * horizontalBias
-        }
+        val resolvedHorizontalBias =
+            if (layoutDirection == LayoutDirection.Ltr) {
+                horizontalBias
+            } else {
+                -1 * horizontalBias
+            }
 
         val x = centerX * (1 + resolvedHorizontalBias)
         val y = centerY * (1 + verticalBias)
@@ -176,8 +141,8 @@
 
     /**
      * An [Alignment.Horizontal] specified by bias: for example, a bias of -1 represents alignment
-     * to the start, a bias of 0 will represent centering, and a bias of 1 will represent end.
-     * Any value can be specified to obtain an alignment. Inside the [-1, 1] range, the obtained
+     * to the start, a bias of 0 will represent centering, and a bias of 1 will represent end. Any
+     * value can be specified to obtain an alignment. Inside the [-1, 1] range, the obtained
      * alignment will position the aligned size fully inside the available space, while outside the
      * range it will the aligned size will be positioned partially or completely outside.
      *
@@ -196,9 +161,9 @@
     }
 
     /**
-     * An [Alignment.Vertical] specified by bias: for example, a bias of -1 represents alignment
-     * to the top, a bias of 0 will represent centering, and a bias of 1 will represent bottom.
-     * Any value can be specified to obtain an alignment. Inside the [-1, 1] range, the obtained
+     * An [Alignment.Vertical] specified by bias: for example, a bias of -1 represents alignment to
+     * the top, a bias of 0 will represent centering, and a bias of 1 will represent bottom. Any
+     * value can be specified to obtain an alignment. Inside the [-1, 1] range, the obtained
      * alignment will position the aligned size fully inside the available space, while outside the
      * range it will the aligned size will be positioned partially or completely outside.
      *
@@ -216,20 +181,17 @@
 }
 
 /**
- * An [Alignment] specified by bias: for example, a bias of -1 represents alignment to the
- * left/top, a bias of 0 will represent centering, and a bias of 1 will represent right/bottom.
- * Any value can be specified to obtain an alignment. Inside the [-1, 1] range, the obtained
- * alignment will position the aligned size fully inside the available space, while outside the
- * range it will the aligned size will be positioned partially or completely outside.
+ * An [Alignment] specified by bias: for example, a bias of -1 represents alignment to the left/top,
+ * a bias of 0 will represent centering, and a bias of 1 will represent right/bottom. Any value can
+ * be specified to obtain an alignment. Inside the [-1, 1] range, the obtained alignment will
+ * position the aligned size fully inside the available space, while outside the range it will the
+ * aligned size will be positioned partially or completely outside.
  *
  * @see AbsoluteAlignment
  * @see Alignment
  */
 @Immutable
-data class BiasAbsoluteAlignment(
-    val horizontalBias: Float,
-    val verticalBias: Float
-) : Alignment {
+data class BiasAbsoluteAlignment(val horizontalBias: Float, val verticalBias: Float) : Alignment {
     /**
      * Returns the position of a 2D point in a container of a given size, according to this
      * [BiasAbsoluteAlignment]. The position will not be mirrored in Rtl context.
@@ -248,8 +210,8 @@
 
     /**
      * An [Alignment.Horizontal] specified by bias: for example, a bias of -1 represents alignment
-     * to the left, a bias of 0 will represent centering, and a bias of 1 will represent right.
-     * Any value can be specified to obtain an alignment. Inside the [-1, 1] range, the obtained
+     * to the left, a bias of 0 will represent centering, and a bias of 1 will represent right. Any
+     * value can be specified to obtain an alignment. Inside the [-1, 1] range, the obtained
      * alignment will position the aligned size fully inside the available space, while outside the
      * range it will the aligned size will be positioned partially or completely outside.
      *
@@ -258,9 +220,8 @@
     @Immutable
     data class Horizontal(val bias: Float) : Alignment.Horizontal {
         /**
-         * Returns the position of a 2D point in a container of a given size,
-         * according to this [BiasAbsoluteAlignment.Horizontal]. This position will not be
-         * mirrored in Rtl context.
+         * Returns the position of a 2D point in a container of a given size, according to this
+         * [BiasAbsoluteAlignment.Horizontal]. This position will not be mirrored in Rtl context.
          */
         override fun align(size: Int, space: Int, layoutDirection: LayoutDirection): Int {
             // Convert to Px first and only round at the end, to avoid rounding twice while
diff --git a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/AtomicReference.kt b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/AtomicReference.kt
index 3e4b826..748d110 100644
--- a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/AtomicReference.kt
+++ b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/AtomicReference.kt
@@ -18,7 +18,10 @@
 
 internal expect class AtomicReference<V>(value: V) {
     fun get(): V
+
     fun set(value: V)
+
     fun getAndSet(value: V): V
+
     fun compareAndSet(expect: V, newValue: V): Boolean
 }
diff --git a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/ComposedModifier.kt b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/ComposedModifier.kt
index b2cc2fd..6741458 100644
--- a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/ComposedModifier.kt
+++ b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/ComposedModifier.kt
@@ -28,19 +28,21 @@
 
 /**
  * Declare a just-in-time composition of a [Modifier] that will be composed for each element it
- * modifies. [composed] may be used to implement **stateful modifiers** that have
- * instance-specific state for each modified element, allowing the same [Modifier] instance to be
- * safely reused for multiple elements while maintaining element-specific state.
+ * modifies. [composed] may be used to implement **stateful modifiers** that have instance-specific
+ * state for each modified element, allowing the same [Modifier] instance to be safely reused for
+ * multiple elements while maintaining element-specific state.
  *
  * If [inspectorInfo] is specified this modifier will be visible to tools during development.
  * Specify the name and arguments of the original modifier.
  *
  * Example usage:
+ *
  * @sample androidx.compose.ui.samples.InspectorInfoInComposedModifierSample
+ *
  * @sample androidx.compose.ui.samples.InspectorInfoInComposedModifierWithArgumentsSample
  *
- * [materialize] must be called to create instance-specific modifiers if you are directly
- * applying a [Modifier] to an element tree node.
+ * [materialize] must be called to create instance-specific modifiers if you are directly applying a
+ * [Modifier] to an element tree node.
  */
 fun Modifier.composed(
     inspectorInfo: InspectorInfo.() -> Unit = NoInspectorInfo,
@@ -49,24 +51,26 @@
 
 /**
  * Declare a just-in-time composition of a [Modifier] that will be composed for each element it
- * modifies. [composed] may be used to implement **stateful modifiers** that have
- * instance-specific state for each modified element, allowing the same [Modifier] instance to be
- * safely reused for multiple elements while maintaining element-specific state.
+ * modifies. [composed] may be used to implement **stateful modifiers** that have instance-specific
+ * state for each modified element, allowing the same [Modifier] instance to be safely reused for
+ * multiple elements while maintaining element-specific state.
  *
- * When keys are provided, [composed] produces a [Modifier] that will compare [equals] to
- * another modifier constructed with the same keys in order to take advantage of caching and
- * skipping optimizations. [fullyQualifiedName] should be the fully-qualified `import` name for
- * your modifier factory function, e.g. `com.example.myapp.ui.fancyPadding`.
+ * When keys are provided, [composed] produces a [Modifier] that will compare [equals] to another
+ * modifier constructed with the same keys in order to take advantage of caching and skipping
+ * optimizations. [fullyQualifiedName] should be the fully-qualified `import` name for your modifier
+ * factory function, e.g. `com.example.myapp.ui.fancyPadding`.
  *
  * If [inspectorInfo] is specified this modifier will be visible to tools during development.
  * Specify the name and arguments of the original modifier.
  *
  * Example usage:
+ *
  * @sample androidx.compose.ui.samples.InspectorInfoInComposedModifierSample
+ *
  * @sample androidx.compose.ui.samples.InspectorInfoInComposedModifierWithArgumentsSample
  *
- * [materialize] must be called to create instance-specific modifiers if you are directly
- * applying a [Modifier] to an element tree node.
+ * [materialize] must be called to create instance-specific modifiers if you are directly applying a
+ * [Modifier] to an element tree node.
  */
 @ExperimentalComposeUiApi
 fun Modifier.composed(
@@ -74,30 +78,30 @@
     key1: Any?,
     inspectorInfo: InspectorInfo.() -> Unit = NoInspectorInfo,
     factory: @Composable Modifier.() -> Modifier
-): Modifier = this.then(
-    KeyedComposedModifier1(fullyQualifiedName, key1, inspectorInfo, factory)
-)
+): Modifier = this.then(KeyedComposedModifier1(fullyQualifiedName, key1, inspectorInfo, factory))
 
 /**
  * Declare a just-in-time composition of a [Modifier] that will be composed for each element it
- * modifies. [composed] may be used to implement **stateful modifiers** that have
- * instance-specific state for each modified element, allowing the same [Modifier] instance to be
- * safely reused for multiple elements while maintaining element-specific state.
+ * modifies. [composed] may be used to implement **stateful modifiers** that have instance-specific
+ * state for each modified element, allowing the same [Modifier] instance to be safely reused for
+ * multiple elements while maintaining element-specific state.
  *
- * When keys are provided, [composed] produces a [Modifier] that will compare [equals] to
- * another modifier constructed with the same keys in order to take advantage of caching and
- * skipping optimizations. [fullyQualifiedName] should be the fully-qualified `import` name for
- * your modifier factory function, e.g. `com.example.myapp.ui.fancyPadding`.
+ * When keys are provided, [composed] produces a [Modifier] that will compare [equals] to another
+ * modifier constructed with the same keys in order to take advantage of caching and skipping
+ * optimizations. [fullyQualifiedName] should be the fully-qualified `import` name for your modifier
+ * factory function, e.g. `com.example.myapp.ui.fancyPadding`.
  *
  * If [inspectorInfo] is specified this modifier will be visible to tools during development.
  * Specify the name and arguments of the original modifier.
  *
  * Example usage:
+ *
  * @sample androidx.compose.ui.samples.InspectorInfoInComposedModifierSample
+ *
  * @sample androidx.compose.ui.samples.InspectorInfoInComposedModifierWithArgumentsSample
  *
- * [materialize] must be called to create instance-specific modifiers if you are directly
- * applying a [Modifier] to an element tree node.
+ * [materialize] must be called to create instance-specific modifiers if you are directly applying a
+ * [Modifier] to an element tree node.
  */
 @ExperimentalComposeUiApi
 fun Modifier.composed(
@@ -106,30 +110,31 @@
     key2: Any?,
     inspectorInfo: InspectorInfo.() -> Unit = NoInspectorInfo,
     factory: @Composable Modifier.() -> Modifier
-): Modifier = this.then(
-    KeyedComposedModifier2(fullyQualifiedName, key1, key2, inspectorInfo, factory)
-)
+): Modifier =
+    this.then(KeyedComposedModifier2(fullyQualifiedName, key1, key2, inspectorInfo, factory))
 
 /**
  * Declare a just-in-time composition of a [Modifier] that will be composed for each element it
- * modifies. [composed] may be used to implement **stateful modifiers** that have
- * instance-specific state for each modified element, allowing the same [Modifier] instance to be
- * safely reused for multiple elements while maintaining element-specific state.
+ * modifies. [composed] may be used to implement **stateful modifiers** that have instance-specific
+ * state for each modified element, allowing the same [Modifier] instance to be safely reused for
+ * multiple elements while maintaining element-specific state.
  *
- * When keys are provided, [composed] produces a [Modifier] that will compare [equals] to
- * another modifier constructed with the same keys in order to take advantage of caching and
- * skipping optimizations. [fullyQualifiedName] should be the fully-qualified `import` name for
- * your modifier factory function, e.g. `com.example.myapp.ui.fancyPadding`.
+ * When keys are provided, [composed] produces a [Modifier] that will compare [equals] to another
+ * modifier constructed with the same keys in order to take advantage of caching and skipping
+ * optimizations. [fullyQualifiedName] should be the fully-qualified `import` name for your modifier
+ * factory function, e.g. `com.example.myapp.ui.fancyPadding`.
  *
  * If [inspectorInfo] is specified this modifier will be visible to tools during development.
  * Specify the name and arguments of the original modifier.
  *
  * Example usage:
+ *
  * @sample androidx.compose.ui.samples.InspectorInfoInComposedModifierSample
+ *
  * @sample androidx.compose.ui.samples.InspectorInfoInComposedModifierWithArgumentsSample
  *
- * [materialize] must be called to create instance-specific modifiers if you are directly
- * applying a [Modifier] to an element tree node.
+ * [materialize] must be called to create instance-specific modifiers if you are directly applying a
+ * [Modifier] to an element tree node.
  */
 @ExperimentalComposeUiApi
 fun Modifier.composed(
@@ -139,30 +144,31 @@
     key3: Any?,
     inspectorInfo: InspectorInfo.() -> Unit = NoInspectorInfo,
     factory: @Composable Modifier.() -> Modifier
-): Modifier = this.then(
-    KeyedComposedModifier3(fullyQualifiedName, key1, key2, key3, inspectorInfo, factory)
-)
+): Modifier =
+    this.then(KeyedComposedModifier3(fullyQualifiedName, key1, key2, key3, inspectorInfo, factory))
 
 /**
  * Declare a just-in-time composition of a [Modifier] that will be composed for each element it
- * modifies. [composed] may be used to implement **stateful modifiers** that have
- * instance-specific state for each modified element, allowing the same [Modifier] instance to be
- * safely reused for multiple elements while maintaining element-specific state.
+ * modifies. [composed] may be used to implement **stateful modifiers** that have instance-specific
+ * state for each modified element, allowing the same [Modifier] instance to be safely reused for
+ * multiple elements while maintaining element-specific state.
  *
- * When keys are provided, [composed] produces a [Modifier] that will compare [equals] to
- * another modifier constructed with the same keys in order to take advantage of caching and
- * skipping optimizations. [fullyQualifiedName] should be the fully-qualified `import` name for
- * your modifier factory function, e.g. `com.example.myapp.ui.fancyPadding`.
+ * When keys are provided, [composed] produces a [Modifier] that will compare [equals] to another
+ * modifier constructed with the same keys in order to take advantage of caching and skipping
+ * optimizations. [fullyQualifiedName] should be the fully-qualified `import` name for your modifier
+ * factory function, e.g. `com.example.myapp.ui.fancyPadding`.
  *
  * If [inspectorInfo] is specified this modifier will be visible to tools during development.
  * Specify the name and arguments of the original modifier.
  *
  * Example usage:
+ *
  * @sample androidx.compose.ui.samples.InspectorInfoInComposedModifierSample
+ *
  * @sample androidx.compose.ui.samples.InspectorInfoInComposedModifierWithArgumentsSample
  *
- * [materialize] must be called to create instance-specific modifiers if you are directly
- * applying a [Modifier] to an element tree node.
+ * [materialize] must be called to create instance-specific modifiers if you are directly applying a
+ * [Modifier] to an element tree node.
  */
 @ExperimentalComposeUiApi
 fun Modifier.composed(
@@ -184,8 +190,9 @@
     inspectorInfo: InspectorInfo.() -> Unit,
     factory: @Composable Modifier.() -> Modifier
 ) : ComposedModifier(inspectorInfo, factory) {
-    override fun equals(other: Any?) = other is KeyedComposedModifier1 &&
-        fqName == other.fqName && key1 == other.key1
+    override fun equals(other: Any?) =
+        other is KeyedComposedModifier1 && fqName == other.fqName && key1 == other.key1
+
     override fun hashCode(): Int = 31 * fqName.hashCode() + key1.hashCode()
 }
 
@@ -197,8 +204,11 @@
     inspectorInfo: InspectorInfo.() -> Unit,
     factory: @Composable Modifier.() -> Modifier
 ) : ComposedModifier(inspectorInfo, factory) {
-    override fun equals(other: Any?) = other is KeyedComposedModifier2 &&
-        fqName == other.fqName && key1 == other.key1 && key2 == other.key2
+    override fun equals(other: Any?) =
+        other is KeyedComposedModifier2 &&
+            fqName == other.fqName &&
+            key1 == other.key1 &&
+            key2 == other.key2
 
     override fun hashCode(): Int {
         var result = fqName.hashCode()
@@ -217,8 +227,12 @@
     inspectorInfo: InspectorInfo.() -> Unit,
     factory: @Composable Modifier.() -> Modifier
 ) : ComposedModifier(inspectorInfo, factory) {
-    override fun equals(other: Any?) = other is KeyedComposedModifier3 &&
-        fqName == other.fqName && key1 == other.key1 && key2 == other.key2 && key3 == other.key3
+    override fun equals(other: Any?) =
+        other is KeyedComposedModifier3 &&
+            fqName == other.fqName &&
+            key1 == other.key1 &&
+            key2 == other.key2 &&
+            key3 == other.key3
 
     override fun hashCode(): Int {
         var result = fqName.hashCode()
@@ -236,15 +250,16 @@
     inspectorInfo: InspectorInfo.() -> Unit,
     factory: @Composable Modifier.() -> Modifier
 ) : ComposedModifier(inspectorInfo, factory) {
-    override fun equals(other: Any?) = other is KeyedComposedModifierN &&
-        fqName == other.fqName && keys.contentEquals(other.keys)
+    override fun equals(other: Any?) =
+        other is KeyedComposedModifierN && fqName == other.fqName && keys.contentEquals(other.keys)
+
     override fun hashCode() = 31 * fqName.hashCode() + keys.contentHashCode()
 }
 
 /**
  * Materialize any instance-specific [composed modifiers][composed] for applying to a raw tree node.
- * Call right before setting the returned modifier on an emitted node.
- * You almost certainly do not need to call this function directly.
+ * Call right before setting the returned modifier on an emitted node. You almost certainly do not
+ * need to call this function directly.
  */
 @Suppress("ModifierFactoryExtensionFunction")
 // "materialize" JVM name is taken below to solve a backwards-incompatibility
@@ -272,18 +287,19 @@
     // Random number for fake group key. Chosen by fair die roll.
     startReplaceableGroup(0x48ae8da7)
 
-    val result = modifier.foldIn<Modifier>(Modifier) { acc, element ->
-        acc.then(
-            if (element is ComposedModifier) {
-                @Suppress("UNCHECKED_CAST")
-                val factory = element.factory as Modifier.(Composer, Int) -> Modifier
-                val composedMod = factory(Modifier, this, 0)
-                materializeImpl(composedMod)
-            } else {
-                element
-            }
-        )
-    }
+    val result =
+        modifier.foldIn<Modifier>(Modifier) { acc, element ->
+            acc.then(
+                if (element is ComposedModifier) {
+                    @Suppress("UNCHECKED_CAST")
+                    val factory = element.factory as Modifier.(Composer, Int) -> Modifier
+                    val composedMod = factory(Modifier, this, 0)
+                    materializeImpl(composedMod)
+                } else {
+                    element
+                }
+            )
+        }
 
     endReplaceableGroup()
     return result
@@ -300,6 +316,7 @@
             field = value
             requireLayoutNode().compositionLocalMap = value
         }
+
     override fun onAttach() {
         requireLayoutNode().compositionLocalMap = map
     }
@@ -310,24 +327,29 @@
  * into LayoutNodes that were created by inlined code of older versions of the Layout composable.
  * More details can be found at https://issuetracker.google.com/275067189
  */
-internal class CompositionLocalMapInjectionElement(
-    val map: CompositionLocalMap
-) : ModifierNodeElement<CompositionLocalMapInjectionNode>() {
+internal class CompositionLocalMapInjectionElement(val map: CompositionLocalMap) :
+    ModifierNodeElement<CompositionLocalMapInjectionNode>() {
     override fun create() = CompositionLocalMapInjectionNode(map)
-    override fun update(node: CompositionLocalMapInjectionNode) { node.map = map }
+
+    override fun update(node: CompositionLocalMapInjectionNode) {
+        node.map = map
+    }
+
     override fun hashCode(): Int = map.hashCode()
+
     override fun equals(other: Any?): Boolean {
         return other is CompositionLocalMapInjectionElement && other.map == map
     }
+
     override fun InspectorInfo.inspectableProperties() {
         name = "<Injected CompositionLocalMap>"
     }
 }
 
 /**
- * This function exists solely for solving a backwards-incompatibility with older compilations
- * that used an older version of the `Layout` composable. New code paths should not call this.
- * More details can be found at https://issuetracker.google.com/275067189
+ * This function exists solely for solving a backwards-incompatibility with older compilations that
+ * used an older version of the `Layout` composable. New code paths should not call this. More
+ * details can be found at https://issuetracker.google.com/275067189
  */
 @Suppress("ModifierFactoryExtensionFunction")
 @JvmName("materialize")
@@ -344,8 +366,6 @@
 internal fun Composer.materializeWithCompositionLocalInjectionInternal(
     modifier: Modifier
 ): Modifier {
-    return if (modifier === Modifier)
-        modifier
-    else
-        materialize(CompositionLocalMapInjectionElement(currentCompositionLocalMap).then(modifier))
+    return if (modifier === Modifier) modifier
+    else materialize(CompositionLocalMapInjectionElement(currentCompositionLocalMap).then(modifier))
 }
diff --git a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/Expect.kt b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/Expect.kt
index 46900a3..abdd7c1 100644
--- a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/Expect.kt
+++ b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/Expect.kt
@@ -35,6 +35,4 @@
  */
 // TODO: For non-JVM platforms, you can revive the kotlin-reflect implementation from
 //  https://android-review.googlesource.com/c/platform/frameworks/support/+/2441379
-internal expect fun InspectorInfo.tryPopulateReflectively(
-    element: ModifierNodeElement<*>
-)
+internal expect fun InspectorInfo.tryPopulateReflectively(element: ModifierNodeElement<*>)
diff --git a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/Modifier.kt b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/Modifier.kt
index e6e4c44..e7dc8b0 100644
--- a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/Modifier.kt
+++ b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/Modifier.kt
@@ -24,7 +24,6 @@
 import androidx.compose.ui.node.NodeCoordinator
 import androidx.compose.ui.node.NodeKind
 import androidx.compose.ui.node.ObserverNodeOwnerScope
-import androidx.compose.ui.node.invalidateDraw
 import androidx.compose.ui.node.requireOwner
 import kotlinx.coroutines.CancellationException
 import kotlinx.coroutines.CoroutineScope
@@ -34,13 +33,12 @@
 private val EmptyStackTraceElements = emptyArray<StackTraceElement>()
 
 /**
- * Used in place of the standard Job cancellation pathway to avoid reflective
- * javaClass.simpleName lookups to build the exception message and stack trace collection.
- * Remove if these are changed in kotlinx.coroutines.
+ * Used in place of the standard Job cancellation pathway to avoid reflective javaClass.simpleName
+ * lookups to build the exception message and stack trace collection. Remove if these are changed in
+ * kotlinx.coroutines.
  */
-private class ModifierNodeDetachedCancellationException : CancellationException(
-    "The Modifier.Node was detached"
-) {
+private class ModifierNodeDetachedCancellationException :
+    CancellationException("The Modifier.Node was detached") {
     override fun fillInStackTrace(): Throwable {
         // Avoid null.clone() on Android <= 6.0 when accessing stackTrace
         stackTrace = EmptyStackTraceElements
@@ -64,23 +62,22 @@
  * appear first will be applied first.
  *
  * Composables that accept a [Modifier] as a parameter to be applied to the whole component
- * represented by the composable function should name the parameter `modifier` and
- * assign the parameter a default value of [Modifier]. It should appear as the first
- * optional parameter in the parameter list; after all required parameters (except for trailing
- * lambda parameters) but before any other parameters with default values. Any default modifiers
- * desired by a composable function should come after the `modifier` parameter's value in the
- * composable function's implementation, keeping [Modifier] as the default parameter value.
- * For example:
+ * represented by the composable function should name the parameter `modifier` and assign the
+ * parameter a default value of [Modifier]. It should appear as the first optional parameter in the
+ * parameter list; after all required parameters (except for trailing lambda parameters) but before
+ * any other parameters with default values. Any default modifiers desired by a composable function
+ * should come after the `modifier` parameter's value in the composable function's implementation,
+ * keeping [Modifier] as the default parameter value. For example:
  *
  * @sample androidx.compose.ui.samples.ModifierParameterSample
  *
- * The pattern above allows default modifiers to still be applied as part of the chain
- * if a caller also supplies unrelated modifiers.
+ * The pattern above allows default modifiers to still be applied as part of the chain if a caller
+ * also supplies unrelated modifiers.
  *
- * Composables that accept modifiers to be applied to a specific subcomponent `foo`
- * should name the parameter `fooModifier` and follow the same guidelines above for default values
- * and behavior. Subcomponent modifiers should be grouped together and follow the parent
- * composable's modifier. For example:
+ * Composables that accept modifiers to be applied to a specific subcomponent `foo` should name the
+ * parameter `fooModifier` and follow the same guidelines above for default values and behavior.
+ * Subcomponent modifiers should be grouped together and follow the parent composable's modifier.
+ * For example:
  *
  * @sample androidx.compose.ui.samples.SubcomponentModifierSample
  */
@@ -90,35 +87,33 @@
 interface Modifier {
 
     /**
-     * Accumulates a value starting with [initial] and applying [operation] to the current value
-     * and each element from outside in.
+     * Accumulates a value starting with [initial] and applying [operation] to the current value and
+     * each element from outside in.
      *
      * Elements wrap one another in a chain from left to right; an [Element] that appears to the
-     * left of another in a `+` expression or in [operation]'s parameter order affects all
-     * of the elements that appear after it. [foldIn] may be used to accumulate a value starting
-     * from the parent or head of the modifier chain to the final wrapped child.
+     * left of another in a `+` expression or in [operation]'s parameter order affects all of the
+     * elements that appear after it. [foldIn] may be used to accumulate a value starting from the
+     * parent or head of the modifier chain to the final wrapped child.
      */
     fun <R> foldIn(initial: R, operation: (R, Element) -> R): R
 
     /**
-     * Accumulates a value starting with [initial] and applying [operation] to the current value
-     * and each element from inside out.
+     * Accumulates a value starting with [initial] and applying [operation] to the current value and
+     * each element from inside out.
      *
      * Elements wrap one another in a chain from left to right; an [Element] that appears to the
-     * left of another in a `+` expression or in [operation]'s parameter order affects all
-     * of the elements that appear after it. [foldOut] may be used to accumulate a value starting
-     * from the child or tail of the modifier chain up to the parent or head of the chain.
+     * left of another in a `+` expression or in [operation]'s parameter order affects all of the
+     * elements that appear after it. [foldOut] may be used to accumulate a value starting from the
+     * child or tail of the modifier chain up to the parent or head of the chain.
      */
     fun <R> foldOut(initial: R, operation: (Element, R) -> R): R
 
-    /**
-     * Returns `true` if [predicate] returns true for any [Element] in this [Modifier].
-     */
+    /** Returns `true` if [predicate] returns true for any [Element] in this [Modifier]. */
     fun any(predicate: (Element) -> Boolean): Boolean
 
     /**
-     * Returns `true` if [predicate] returns true for all [Element]s in this [Modifier] or if
-     * this [Modifier] contains no [Element]s.
+     * Returns `true` if [predicate] returns true for all [Element]s in this [Modifier] or if this
+     * [Modifier] contains no [Element]s.
      */
     fun all(predicate: (Element) -> Boolean): Boolean
 
@@ -130,9 +125,7 @@
     infix fun then(other: Modifier): Modifier =
         if (other === Modifier) this else CombinedModifier(this, other)
 
-    /**
-     * A single element contained within a [Modifier] chain.
-     */
+    /** A single element contained within a [Modifier] chain. */
     @JvmDefaultWithCompatibility
     interface Element : Modifier {
         override fun <R> foldIn(initial: R, operation: (R, Element) -> R): R =
@@ -203,12 +196,13 @@
          * @throws IllegalStateException If called while the node is not attached.
          */
         val coroutineScope: CoroutineScope
-            get() = scope ?: CoroutineScope(
-                requireOwner().coroutineContext +
-                    Job(parent = requireOwner().coroutineContext[Job])
-            ).also {
-                scope = it
-            }
+            get() =
+                scope
+                    ?: CoroutineScope(
+                            requireOwner().coroutineContext +
+                                Job(parent = requireOwner().coroutineContext[Job])
+                        )
+                        .also { scope = it }
 
         internal var kindSet: Int = 0
 
@@ -222,15 +216,15 @@
         internal var ownerScope: ObserverNodeOwnerScope? = null
         internal var coordinator: NodeCoordinator? = null
             private set
+
         internal var insertedNodeAwaitingAttachForInvalidation = false
         internal var updatedNodeAwaitingAttachForInvalidation = false
         private var onAttachRunExpected = false
         private var onDetachRunExpected = false
         /**
          * Indicates that the node is attached to a [androidx.compose.ui.layout.Layout] which is
-         * part of the UI tree.
-         * This will get set to true right before [onAttach] is called, and set to false right
-         * after [onDetach] is called.
+         * part of the UI tree. This will get set to true right before [onAttach] is called, and set
+         * to false right after [onDetach] is called.
          *
          * @see onAttach
          * @see onDetach
@@ -241,15 +235,15 @@
         /**
          * If this property returns `true`, then nodes will be automatically invalidated after the
          * modifier update completes (For example, if the returned Node is a [DrawModifierNode], its
-         * [DrawModifierNode.invalidateDraw] function will be invoked automatically as part of
-         * auto invalidation).
+         * [DrawModifierNode.invalidateDraw] function will be invoked automatically as part of auto
+         * invalidation).
          *
          * This is enabled by default, and provides a convenient mechanism to schedule invalidation
          * and apply changes made to the modifier. You may choose to set this to `false` if your
          * modifier has auto-invalidatable properties that do not frequently require invalidation to
          * improve performance by skipping unnecessary invalidation. If `autoInvalidate` is set to
-         * `false`, you must call the appropriate invalidate functions manually when the modifier
-         * is updated or else the updates may not be reflected in the UI appropriately.
+         * `false`, you must call the appropriate invalidate functions manually when the modifier is
+         * updated or else the updates may not be reflected in the UI appropriately.
          */
         @Suppress("GetterSetterNames")
         @get:Suppress("GetterSetterNames")
@@ -276,8 +270,8 @@
             checkPrecondition(isAttached) {
                 "Must run markAsAttached() prior to runAttachLifecycle"
             }
-            checkPrecondition(onAttachRunExpected) { "Must run runAttachLifecycle() only once " +
-                "after markAsAttached()"
+            checkPrecondition(onAttachRunExpected) {
+                "Must run runAttachLifecycle() only once " + "after markAsAttached()"
             }
             onAttachRunExpected = false
             onAttach()
@@ -319,16 +313,14 @@
         }
 
         /**
-         * Called when the node is attached to a [androidx.compose.ui.layout.Layout] which is
-         * part of the UI tree.
-         * When called, `node` is guaranteed to be non-null. You can call sideEffect,
-         * coroutineScope, etc.
-         * This is not guaranteed to get called at a time where the rest of the Modifier.Nodes in
-         * the hierarchy are "up to date". For instance, at the time of calling onAttach for this
-         * node, another node may be in the tree that will be detached by the time Compose has
-         * finished applying changes. As a result, if you need to guarantee that the state of the
-         * tree is "final" for this round of changes, you should use the [sideEffect] API to
-         * schedule the calculation to be done at that time.
+         * Called when the node is attached to a [androidx.compose.ui.layout.Layout] which is part
+         * of the UI tree. When called, `node` is guaranteed to be non-null. You can call
+         * sideEffect, coroutineScope, etc. This is not guaranteed to get called at a time where the
+         * rest of the Modifier.Nodes in the hierarchy are "up to date". For instance, at the time
+         * of calling onAttach for this node, another node may be in the tree that will be detached
+         * by the time Compose has finished applying changes. As a result, if you need to guarantee
+         * that the state of the tree is "final" for this round of changes, you should use the
+         * [sideEffect] API to schedule the calculation to be done at that time.
          */
         open fun onAttach() {}
 
@@ -343,13 +335,14 @@
         open fun onDetach() {}
 
         /**
-         * Called when the node is about to be moved to a pool of layouts ready to be reused.
-         * For example it happens when the node is part of the item of LazyColumn after this item
-         * is scrolled out of the viewport. This means this node could be in future reused for a
-         * [androidx.compose.ui.layout.Layout] displaying a semantically different content when
-         * the list will be populating a new item.
+         * Called when the node is about to be moved to a pool of layouts ready to be reused. For
+         * example it happens when the node is part of the item of LazyColumn after this item is
+         * scrolled out of the viewport. This means this node could be in future reused for a
+         * [androidx.compose.ui.layout.Layout] displaying a semantically different content when the
+         * list will be populating a new item.
          *
-         * Use this callback to reset some local item specific state, like "is my component focused".
+         * Use this callback to reset some local item specific state, like "is my component
+         * focused".
          *
          * This callback is called while the node is attached. Right after this callback the node
          * will be detached and later reattached when reused.
@@ -375,9 +368,9 @@
     }
 
     /**
-     * The companion object `Modifier` is the empty, default, or starter [Modifier]
-     * that contains no [elements][Element]. Use it to create a new [Modifier] using
-     * modifier extension factory functions:
+     * The companion object `Modifier` is the empty, default, or starter [Modifier] that contains no
+     * [elements][Element]. Use it to create a new [Modifier] using modifier extension factory
+     * functions:
      *
      * @sample androidx.compose.ui.samples.ModifierUsageSample
      *
@@ -389,22 +382,24 @@
     // modifier extension factory expression.
     companion object : Modifier {
         override fun <R> foldIn(initial: R, operation: (R, Element) -> R): R = initial
+
         override fun <R> foldOut(initial: R, operation: (Element, R) -> R): R = initial
+
         override fun any(predicate: (Element) -> Boolean): Boolean = false
+
         override fun all(predicate: (Element) -> Boolean): Boolean = true
+
         override infix fun then(other: Modifier): Modifier = other
+
         override fun toString() = "Modifier"
     }
 }
 
 /**
- * A node in a [Modifier] chain. A CombinedModifier always contains at least two elements;
- * a Modifier [outer] that wraps around the Modifier [inner].
+ * A node in a [Modifier] chain. A CombinedModifier always contains at least two elements; a
+ * Modifier [outer] that wraps around the Modifier [inner].
  */
-class CombinedModifier(
-    internal val outer: Modifier,
-    internal val inner: Modifier
-) : Modifier {
+class CombinedModifier(internal val outer: Modifier, internal val inner: Modifier) : Modifier {
     override fun <R> foldIn(initial: R, operation: (R, Modifier.Element) -> R): R =
         inner.foldIn(outer.foldIn(initial, operation), operation)
 
@@ -422,7 +417,10 @@
 
     override fun hashCode(): Int = outer.hashCode() + 31 * inner.hashCode()
 
-    override fun toString() = "[" + foldIn("") { acc, element ->
-        if (acc.isEmpty()) element.toString() else "$acc, $element"
-    } + "]"
+    override fun toString() =
+        "[" +
+            foldIn("") { acc, element ->
+                if (acc.isEmpty()) element.toString() else "$acc, $element"
+            } +
+            "]"
 }
diff --git a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/MotionDurationScale.kt b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/MotionDurationScale.kt
index 2fe23c8..9f33938 100644
--- a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/MotionDurationScale.kt
+++ b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/MotionDurationScale.kt
@@ -36,15 +36,15 @@
     /**
      * Defines the multiplier for the duration of the motion. This value should be non-negative.
      *
-     * A [scaleFactor] of 1.0f would play the motion in real time. 0f would cause motion to
-     * finish in the next frame callback. Larger [scaleFactor] will result
-     * in longer durations for the motion/animation (i.e. slower animation). For example,
-     * a [scaleFactor] of 10f would cause an animation with a duration of 100ms to finish in
-     * 1000ms.
+     * A [scaleFactor] of 1.0f would play the motion in real time. 0f would cause motion to finish
+     * in the next frame callback. Larger [scaleFactor] will result in longer durations for the
+     * motion/animation (i.e. slower animation). For example, a [scaleFactor] of 10f would cause an
+     * animation with a duration of 100ms to finish in 1000ms.
      */
     val scaleFactor: Float
 
-    override val key: CoroutineContext.Key<*> get() = Key
+    override val key: CoroutineContext.Key<*>
+        get() = Key
 
     companion object Key : CoroutineContext.Key<MotionDurationScale>
 }
diff --git a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/SessionMutex.kt b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/SessionMutex.kt
index cf9c06d..5083ab2 100644
--- a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/SessionMutex.kt
+++ b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/SessionMutex.kt
@@ -24,45 +24,39 @@
 import kotlinx.coroutines.job
 
 /**
- * Helper class for coordinating between mutually-exclusive sessions. A session is represented as
- * an object of type [T] and a coroutine [Job] whose lifetime is tied to the session.
+ * Helper class for coordinating between mutually-exclusive sessions. A session is represented as an
+ * object of type [T] and a coroutine [Job] whose lifetime is tied to the session.
  *
- * Only one session can be active at a time. When a new session is started, the old session will
- * be cancelled and allowed to finish any cancellation tasks (e.g. `finally` blocks) before the
- * new session's coroutine starts.
+ * Only one session can be active at a time. When a new session is started, the old session will be
+ * cancelled and allowed to finish any cancellation tasks (e.g. `finally` blocks) before the new
+ * session's coroutine starts.
  */
 @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
 @InternalComposeUiApi
 @JvmInline
-value class SessionMutex<T> private constructor(
-    private val currentSessionHolder: AtomicReference<Session<T>?>
-) {
+value class SessionMutex<T>
+private constructor(private val currentSessionHolder: AtomicReference<Session<T>?>) {
     constructor() : this(AtomicReference(null))
 
-    /**
-     * Returns the current session object.
-     */
+    /** Returns the current session object. */
     val currentSession: T?
         get() = currentSessionHolder.get()?.value
 
     /**
-     * Cancels any existing session and then calls [session].
-     * [session] will in turn be cancelled if this method is called again before it returns.
+     * Cancels any existing session and then calls [session]. [session] will in turn be cancelled if
+     * this method is called again before it returns.
      *
      * @param sessionInitializer Called immediately to create the new session object, before
-     * cancelling the previous session. Receives a [CoroutineScope] that has the same context as
-     * [session] will get.
+     *   cancelling the previous session. Receives a [CoroutineScope] that has the same context as
+     *   [session] will get.
      * @param session Called with the return value from [sessionInitializer] after cancelling the
-     * previous session.
+     *   previous session.
      */
     suspend fun <R> withSessionCancellingPrevious(
         sessionInitializer: (CoroutineScope) -> T,
         session: suspend (data: T) -> R
     ): R = coroutineScope {
-        val newSession = Session(
-            job = coroutineContext.job,
-            value = sessionInitializer(this)
-        )
+        val newSession = Session(job = coroutineContext.job, value = sessionInitializer(this))
         currentSessionHolder.getAndSet(newSession)?.job?.cancelAndJoin()
         try {
             return@coroutineScope session(newSession.value)
diff --git a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/ZIndexModifier.kt b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/ZIndexModifier.kt
index 4468b73..9dc1b51 100644
--- a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/ZIndexModifier.kt
+++ b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/ZIndexModifier.kt
@@ -26,25 +26,26 @@
 import androidx.compose.ui.unit.Constraints
 
 /**
- * Creates a modifier that controls the drawing order for the children of the same layout parent.
- * A child with larger [zIndex] will be drawn on top of all the children with smaller [zIndex].
- * When children have the same [zIndex] the original order in which the parent placed the
- * children is used.
+ * Creates a modifier that controls the drawing order for the children of the same layout parent. A
+ * child with larger [zIndex] will be drawn on top of all the children with smaller [zIndex]. When
+ * children have the same [zIndex] the original order in which the parent placed the children is
+ * used.
  *
- * Note that if there would be multiple [zIndex] modifiers applied for the same layout
- * the sum of their values will be used as the final zIndex. If no [zIndex] were applied for the
- * layout then the default zIndex is 0.
+ * Note that if there would be multiple [zIndex] modifiers applied for the same layout the sum of
+ * their values will be used as the final zIndex. If no [zIndex] were applied for the layout then
+ * the default zIndex is 0.
  *
  * @sample androidx.compose.ui.samples.ZIndexModifierSample
  */
-@Stable
-fun Modifier.zIndex(zIndex: Float): Modifier = this then ZIndexElement(zIndex = zIndex)
+@Stable fun Modifier.zIndex(zIndex: Float): Modifier = this then ZIndexElement(zIndex = zIndex)
 
 internal data class ZIndexElement(val zIndex: Float) : ModifierNodeElement<ZIndexNode>() {
     override fun create() = ZIndexNode(zIndex)
+
     override fun update(node: ZIndexNode) {
         node.zIndex = zIndex
     }
+
     override fun InspectorInfo.inspectableProperties() {
         name = "zIndex"
         properties["zIndex"] = zIndex
@@ -57,9 +58,7 @@
         constraints: Constraints
     ): MeasureResult {
         val placeable = measurable.measure(constraints)
-        return layout(placeable.width, placeable.height) {
-            placeable.place(0, 0, zIndex = zIndex)
-        }
+        return layout(placeable.width, placeable.height) { placeable.place(0, 0, zIndex = zIndex) }
     }
 
     override fun toString(): String = "ZIndexModifier(zIndex=$zIndex)"
diff --git a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/autofill/Autofill.kt b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/autofill/Autofill.kt
index 13d2354..3c41205 100644
--- a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/autofill/Autofill.kt
+++ b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/autofill/Autofill.kt
@@ -50,22 +50,19 @@
 }
 
 /**
- * Every autofillable composable will have an [AutofillNode]. (An autofill node will be created
- * for every semantics node that adds autofill properties). This node is used to request/cancel
+ * Every autofillable composable will have an [AutofillNode]. (An autofill node will be created for
+ * every semantics node that adds autofill properties). This node is used to request/cancel
  * autofill, and it holds the [onFill] lambda which is called by the autofill framework.
  *
  * @property autofillTypes A list of autofill types for this node. These types are conveyed to the
- * autofill framework and it is used to call [onFill] with the appropriate value. If you don't set
- * this property, the autofill framework will use heuristics to guess the type. This property is a
- * list because some fields can have multiple types. For instance, userid in a login form can
- * either be a username or an email address. TODO(b/138731416): Check with the autofill service
- * team if the order matters, and how duplicate types are handled.
- *
- * @property boundingBox The screen coordinates of the composable being autofilled.
- * This data is used by the autofill framework to decide where to show the autofill popup.
- *
+ *   autofill framework and it is used to call [onFill] with the appropriate value. If you don't set
+ *   this property, the autofill framework will use heuristics to guess the type. This property is a
+ *   list because some fields can have multiple types. For instance, userid in a login form can
+ *   either be a username or an email address. TODO(b/138731416): Check with the autofill service
+ *   team if the order matters, and how duplicate types are handled.
+ * @property boundingBox The screen coordinates of the composable being autofilled. This data is
+ *   used by the autofill framework to decide where to show the autofill popup.
  * @property onFill The callback that is called by the autofill framework to perform autofill.
- *
  * @property id A virtual id that is automatically generated for each node.
  */
 @ExperimentalComposeUiApi
@@ -78,8 +75,7 @@
         /*@GuardedBy("this")*/
         private var previousId = 0
 
-        private fun generateId() =
-            synchronized(this) { ++previousId }
+        private fun generateId() = synchronized(this) { ++previousId }
     }
 
     val id: Int = generateId()
diff --git a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/autofill/AutofillTree.kt b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/autofill/AutofillTree.kt
index e200bc6..0ff1cfd 100644
--- a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/autofill/AutofillTree.kt
+++ b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/autofill/AutofillTree.kt
@@ -20,9 +20,9 @@
 
 /**
  * The autofill tree is a temporary data structure that is used before the Semantics Tree is
- * implemented. This data structure is used by compose components to set autofill
- * hints (via [AutofillNode]s). It is also used  by the autofill framework to communicate with
- * Compose components (by calling [performAutofill]).
+ * implemented. This data structure is used by compose components to set autofill hints (via
+ * [AutofillNode]s). It is also used by the autofill framework to communicate with Compose
+ * components (by calling [performAutofill]).
  *
  * The [AutofillTree] will be replaced by Autofill Semantics (b/138604305).
  *
@@ -31,21 +31,17 @@
  */
 @ExperimentalComposeUiApi
 class AutofillTree {
-    /**
-     * A map which contains [AutofillNode]s, where every node represents an autofillable field.
-     */
+    /** A map which contains [AutofillNode]s, where every node represents an autofillable field. */
     val children: MutableMap<Int, AutofillNode> = mutableMapOf()
 
-    /**
-     * Add the specified [AutofillNode] to the [AutofillTree].
-     */
+    /** Add the specified [AutofillNode] to the [AutofillTree]. */
     operator fun plusAssign(autofillNode: AutofillNode) {
         children[autofillNode.id] = autofillNode
     }
 
     /**
-     * The autofill framework uses this function to 'fill' the [AutofillNode] represented by
-     * [id] with the specified [value].
+     * The autofill framework uses this function to 'fill' the [AutofillNode] represented by [id]
+     * with the specified [value].
      */
     fun performAutofill(id: Int, value: String) = children[id]?.onFill?.invoke(value)
 }
diff --git a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/autofill/AutofillType.kt b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/autofill/AutofillType.kt
index 5b26487..562d3da 100644
--- a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/autofill/AutofillType.kt
+++ b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/autofill/AutofillType.kt
@@ -22,24 +22,18 @@
  * Autofill type information.
  *
  * Autofill services use the [AutofillType] to determine what value to use to autofill fields
- * associated with this type. If the [AutofillType] is not specified, the autofill services have
- * to use heuristics to determine the right value to use while autofilling the corresponding field.
+ * associated with this type. If the [AutofillType] is not specified, the autofill services have to
+ * use heuristics to determine the right value to use while autofilling the corresponding field.
  */
 @ExperimentalComposeUiApi
 enum class AutofillType {
-    /**
-     * Indicates that the associated component can be autofilled with an email address.
-     */
+    /** Indicates that the associated component can be autofilled with an email address. */
     EmailAddress,
 
-    /**
-     * Indicates that the associated component can be autofilled with a username.
-     */
+    /** Indicates that the associated component can be autofilled with a username. */
     Username,
 
-    /**
-     * Indicates that the associated component can be autofilled with a password.
-     */
+    /** Indicates that the associated component can be autofilled with a password. */
     Password,
 
     /**
@@ -54,19 +48,13 @@
      */
     NewPassword,
 
-    /**
-     * Indicates that the associated component can be autofilled with a postal address.
-     */
+    /** Indicates that the associated component can be autofilled with a postal address. */
     PostalAddress,
 
-    /**
-     * Indicates that the associated component can be autofilled with a postal code.
-     */
+    /** Indicates that the associated component can be autofilled with a postal code. */
     PostalCode,
 
-    /**
-     * Indicates that the associated component can be autofilled with a credit card number.
-     */
+    /** Indicates that the associated component can be autofilled with a credit card number. */
     CreditCardNumber,
 
     /**
@@ -86,8 +74,7 @@
     CreditCardExpirationMonth,
 
     /**
-     * Indicates that the associated component can be autofilled with a credit card expiration
-     * year.
+     * Indicates that the associated component can be autofilled with a credit card expiration year.
      */
     CreditCardExpirationYear,
 
@@ -96,14 +83,10 @@
      */
     CreditCardExpirationDay,
 
-    /**
-     * Indicates that the associated component can be autofilled with a country name/code.
-     */
+    /** Indicates that the associated component can be autofilled with a country name/code. */
     AddressCountry,
 
-    /**
-     * Indicates that the associated component can be autofilled with a region/state.
-     */
+    /** Indicates that the associated component can be autofilled with a region/state. */
     AddressRegion,
 
     /**
@@ -112,28 +95,21 @@
      */
     AddressLocality,
 
-    /**
-     * Indicates that the associated component can be autofilled with a street address.
-     */
+    /** Indicates that the associated component can be autofilled with a street address. */
     AddressStreet,
 
-    /**
-     * Indicates that the associated component can be autofilled with auxiliary address details.
-     */
+    /** Indicates that the associated component can be autofilled with auxiliary address details. */
     AddressAuxiliaryDetails,
 
     /**
      * Indicates that the associated component can be autofilled with an extended ZIP/POSTAL code.
      *
-     * Example: In forms that split the U.S. ZIP+4 Code with nine digits 99999-9999 into two
-     * fields annotate the delivery route code with this hint.
+     * Example: In forms that split the U.S. ZIP+4 Code with nine digits 99999-9999 into two fields
+     * annotate the delivery route code with this hint.
      */
     PostalCodeExtended,
 
-    /**
-     * Indicates that the associated component can be autofilled with a person's full name.
-     *
-     */
+    /** Indicates that the associated component can be autofilled with a person's full name. */
     PersonFullName,
 
     /**
@@ -146,37 +122,29 @@
      */
     PersonLastName,
 
-    /**
-     * Indicates that the associated component can be autofilled with a person's middle name.
-     */
+    /** Indicates that the associated component can be autofilled with a person's middle name. */
     PersonMiddleName,
 
-    /**
-     * Indicates that the associated component can be autofilled with a person's middle initial.
-     */
+    /** Indicates that the associated component can be autofilled with a person's middle initial. */
     PersonMiddleInitial,
 
-    /**
-     * Indicates that the associated component can be autofilled with a person's name prefix.
-     */
+    /** Indicates that the associated component can be autofilled with a person's name prefix. */
     PersonNamePrefix,
 
-    /**
-     * Indicates that the associated component can be autofilled with a person's name suffix.
-     */
+    /** Indicates that the associated component can be autofilled with a person's name suffix. */
     PersonNameSuffix,
 
     /**
-     * Indicates that the associated component can be autofilled with a phone number with
-     * country code.
+     * Indicates that the associated component can be autofilled with a phone number with country
+     * code.
      *
      * Example: +1 123-456-7890
      */
     PhoneNumber,
 
     /**
-     * Indicates that the associated component can be autofilled with the current device's phone number
-     * usually for Sign Up / OTP flows.
+     * Indicates that the associated component can be autofilled with the current device's phone
+     * number usually for Sign Up / OTP flows.
      */
     PhoneNumberDevice,
 
@@ -186,34 +154,24 @@
     PhoneCountryCode,
 
     /**
-     * Indicates that the associated component can be autofilled with a phone number without
-     * country code.
+     * Indicates that the associated component can be autofilled with a phone number without country
+     * code.
      */
     PhoneNumberNational,
 
-    /**
-     * Indicates that the associated component can be autofilled with a gender.
-     */
+    /** Indicates that the associated component can be autofilled with a gender. */
     Gender,
 
-    /**
-     * Indicates that the associated component can be autofilled with a full birth date.
-     */
+    /** Indicates that the associated component can be autofilled with a full birth date. */
     BirthDateFull,
 
-    /**
-     * Indicates that the associated component can be autofilled with a birth day(of the month).
-     */
+    /** Indicates that the associated component can be autofilled with a birth day(of the month). */
     BirthDateDay,
 
-    /**
-     * Indicates that the associated component can be autofilled with a birth day(of the month).
-     */
+    /** Indicates that the associated component can be autofilled with a birth day(of the month). */
     BirthDateMonth,
 
-    /**
-     * Indicates that the associated component can be autofilled with a birth year.
-     */
+    /** Indicates that the associated component can be autofilled with a birth year. */
     BirthDateYear,
 
     /**
diff --git a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/autofill/ContentType.kt b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/autofill/ContentType.kt
index c9a0cde..cdcf667 100644
--- a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/autofill/ContentType.kt
+++ b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/autofill/ContentType.kt
@@ -20,63 +20,53 @@
  * Content type information.
  *
  * Autofill services use the [ContentType] to determine what value to use to autofill fields
- * associated with this type. If the [ContentType] is not specified, the autofill services have
- * to use heuristics to determine the right value to use while autofilling the corresponding field.
+ * associated with this type. If the [ContentType] is not specified, the autofill services have to
+ * use heuristics to determine the right value to use while autofilling the corresponding field.
  */
 // TODO(b/333102566): When Autofill goes live for Compose,
 //  these classes will need to be made public.
 internal expect class ContentType private constructor(contentHint: String) {
 
     internal companion object {
-        /**
-         * Indicates that the associated component can be autofilled with an email address.
-         */
+        /** Indicates that the associated component can be autofilled with an email address. */
         val EmailAddress: ContentType
 
-        /**
-         * Indicates that the associated component can be autofilled with a username.
-         */
+        /** Indicates that the associated component can be autofilled with a username. */
         val Username: ContentType
 
-        /**
-         * Indicates that the associated component can be autofilled with a password.
-         */
+        /** Indicates that the associated component can be autofilled with a password. */
         val Password: ContentType
 
         /**
-         * Indicates that the associated component can be interpreted as a newly created username for
-         * save/update.
+         * Indicates that the associated component can be interpreted as a newly created username
+         * for save/update.
          */
         val NewUsername: ContentType
 
         /**
-         * Indicates that the associated component can be interpreted as a newly created password for
-         * save/update.
+         * Indicates that the associated component can be interpreted as a newly created password
+         * for save/update.
          */
         val NewPassword: ContentType
 
-        /**
-         * Indicates that the associated component can be autofilled with a postal address.
-         */
+        /** Indicates that the associated component can be autofilled with a postal address. */
         val PostalAddress: ContentType
 
-        /**
-         * Indicates that the associated component can be autofilled with a postal code.
-         */
+        /** Indicates that the associated component can be autofilled with a postal code. */
         val PostalCode: ContentType
 
-        /**
-         * Indicates that the associated component can be autofilled with a credit card number.
-         */
+        /** Indicates that the associated component can be autofilled with a credit card number. */
         val CreditCardNumber: ContentType
 
         /**
-         * Indicates that the associated component can be autofilled with a credit card security code.
+         * Indicates that the associated component can be autofilled with a credit card security
+         * code.
          */
         val CreditCardSecurityCode: ContentType
 
         /**
-         * Indicates that the associated component can be autofilled with a credit card expiration date.
+         * Indicates that the associated component can be autofilled with a credit card expiration
+         * date.
          */
         val CreditCardExpirationDate: ContentType
 
@@ -93,18 +83,15 @@
         val CreditCardExpirationYear: ContentType
 
         /**
-         * Indicates that the associated component can be autofilled with a credit card expiration day.
+         * Indicates that the associated component can be autofilled with a credit card expiration
+         * day.
          */
         val CreditCardExpirationDay: ContentType
 
-        /**
-         * Indicates that the associated component can be autofilled with a country name/code.
-         */
+        /** Indicates that the associated component can be autofilled with a country name/code. */
         val AddressCountry: ContentType
 
-        /**
-         * Indicates that the associated component can be autofilled with a region/state.
-         */
+        /** Indicates that the associated component can be autofilled with a region/state. */
         val AddressRegion: ContentType
 
         /**
@@ -113,9 +100,7 @@
          */
         val AddressLocality: ContentType
 
-        /**
-         * Indicates that the associated component can be autofilled with a street address.
-         */
+        /** Indicates that the associated component can be autofilled with a street address. */
         val AddressStreet: ContentType
 
         /**
@@ -124,26 +109,26 @@
         val AddressAuxiliaryDetails: ContentType
 
         /**
-         * Indicates that the associated component can be autofilled with an extended ZIP/POSTAL code.
+         * Indicates that the associated component can be autofilled with an extended ZIP/POSTAL
+         * code.
          *
          * Example: In forms that split the U.S. ZIP+4 Code with nine digits 99999-9999 into two
          * fields annotate the delivery route code with this hint.
          */
         val PostalCodeExtended: ContentType
 
-        /**
-         * Indicates that the associated component can be autofilled with a person's full name.
-         *
-         */
+        /** Indicates that the associated component can be autofilled with a person's full name. */
         val PersonFullName: ContentType
 
         /**
-         * Indicates that the associated component can be autofilled with a person's first/given name.
+         * Indicates that the associated component can be autofilled with a person's first/given
+         * name.
          */
         val PersonFirstName: ContentType
 
         /**
-         * Indicates that the associated component can be autofilled with a person's last/family name.
+         * Indicates that the associated component can be autofilled with a person's last/family
+         * name.
          */
         val PersonLastName: ContentType
 
@@ -176,13 +161,14 @@
         val PhoneNumber: ContentType
 
         /**
-         * Indicates that the associated component can be autofilled with the current device's phone number
-         * usually for Sign Up / OTP flows.
+         * Indicates that the associated component can be autofilled with the current device's phone
+         * number usually for Sign Up / OTP flows.
          */
         val PhoneNumberDevice: ContentType
 
         /**
-         * Indicates that the associated component can be autofilled with a phone number's country code.
+         * Indicates that the associated component can be autofilled with a phone number's country
+         * code.
          */
         val PhoneCountryCode: ContentType
 
@@ -192,14 +178,10 @@
          */
         val PhoneNumberNational: ContentType
 
-        /**
-         * Indicates that the associated component can be autofilled with a gender.
-         */
+        /** Indicates that the associated component can be autofilled with a gender. */
         val Gender: ContentType
 
-        /**
-         * Indicates that the associated component can be autofilled with a full birth date.
-         */
+        /** Indicates that the associated component can be autofilled with a full birth date. */
         val BirthDateFull: ContentType
 
         /**
@@ -212,13 +194,12 @@
          */
         val BirthDateMonth: ContentType
 
-        /**
-         * Indicates that the associated component can be autofilled with a birth year.
-         */
+        /** Indicates that the associated component can be autofilled with a birth year. */
         val BirthDateYear: ContentType
 
         /**
-         * Indicates that the associated component can be autofilled with a SMS One Time Password (OTP).
+         * Indicates that the associated component can be autofilled with a SMS One Time Password
+         * (OTP).
          */
         val SmsOtpCode: ContentType
 
diff --git a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/draganddrop/DragAndDrop.kt b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/draganddrop/DragAndDrop.kt
index c1fcba0..ff75eb9 100644
--- a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/draganddrop/DragAndDrop.kt
+++ b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/draganddrop/DragAndDrop.kt
@@ -19,54 +19,45 @@
 import androidx.compose.ui.geometry.Offset
 
 /**
- * Definition for a type representing transferable data. It could be a remote URI,
- * rich text data on the clip board, a local file, or more.
+ * Definition for a type representing transferable data. It could be a remote URI, rich text data on
+ * the clip board, a local file, or more.
  */
 expect class DragAndDropTransferData
 
-/**
- * A representation of an event sent by the platform during a drag and drop operation.
- */
+/** A representation of an event sent by the platform during a drag and drop operation. */
 expect class DragAndDropEvent
 
 /**
- * Returns the position of this [DragAndDropEvent] relative to the root Compose View in the
- * layout hierarchy.
+ * Returns the position of this [DragAndDropEvent] relative to the root Compose View in the layout
+ * hierarchy.
  */
 internal expect val DragAndDropEvent.positionInRoot: Offset
 
-/**
- * Provides a means of receiving a transfer data from a drag and drop session.
- */
+/** Provides a means of receiving a transfer data from a drag and drop session. */
 interface DragAndDropTarget {
 
     /**
      * An item has been dropped inside this [DragAndDropTarget].
      *
      * @return true to indicate that the [DragAndDropEvent] was consumed; false indicates it was
-     * rejected.
+     *   rejected.
      */
     fun onDrop(event: DragAndDropEvent): Boolean
 
-    /** A drag and drop session has just been started and this [DragAndDropTarget] is eligible
-     * to receive it. This gives an opportunity to set the state for a [DragAndDropTarget] in
+    /**
+     * A drag and drop session has just been started and this [DragAndDropTarget] is eligible to
+     * receive it. This gives an opportunity to set the state for a [DragAndDropTarget] in
      * preparation for consuming a drag and drop session.
      */
     fun onStarted(event: DragAndDropEvent) = Unit
 
-    /**
-     * An item being dropped has entered into the bounds of this [DragAndDropTarget].
-     */
+    /** An item being dropped has entered into the bounds of this [DragAndDropTarget]. */
     fun onEntered(event: DragAndDropEvent) = Unit
 
-    /**
-     * An item being dropped has moved within the bounds of this [DragAndDropTarget].
-     */
+    /** An item being dropped has moved within the bounds of this [DragAndDropTarget]. */
     fun onMoved(event: DragAndDropEvent) = Unit
 
-    /**
-     * An item being dropped has moved outside the bounds of this [DragAndDropTarget].
-     */
+    /** An item being dropped has moved outside the bounds of this [DragAndDropTarget]. */
     fun onExited(event: DragAndDropEvent) = Unit
 
     /**
diff --git a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/draganddrop/DragAndDropManager.kt b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/draganddrop/DragAndDropManager.kt
index 0735927..ae06107 100644
--- a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/draganddrop/DragAndDropManager.kt
+++ b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/draganddrop/DragAndDropManager.kt
@@ -23,26 +23,22 @@
 internal interface DragAndDropManager {
 
     /**
-     * A [Modifier] that can be added to the [Owners][androidx.compose.ui.node.Owner] modifier
-     * list that contains the modifiers required by drag and drop.
-     * (Eg, a root drag and drop modifier).
+     * A [Modifier] that can be added to the [Owners][androidx.compose.ui.node.Owner] modifier list
+     * that contains the modifiers required by drag and drop. (Eg, a root drag and drop modifier).
      */
     val modifier: Modifier
 
     /**
      * Initiates a drag-and-drop operation for transferring data.
      *
-     * @param transferData the data to be transferred after successful completion of the
-     * drag and drop gesture.
-     *
+     * @param transferData the data to be transferred after successful completion of the drag and
+     *   drop gesture.
      * @param decorationSize the size of the drag decoration to be drawn.
-     *
      * @param drawDragDecoration provides the visual representation of the item dragged during the
-     * drag and drop gesture.
-     *
-     * @return true if the method completes successfully, or false if it fails anywhere.
-     * Returning false means the system was unable to do a drag because of another
-     * ongoing operation or some other reasons.
+     *   drag and drop gesture.
+     * @return true if the method completes successfully, or false if it fails anywhere. Returning
+     *   false means the system was unable to do a drag because of another ongoing operation or some
+     *   other reasons.
      */
     fun drag(
         transferData: DragAndDropTransferData,
@@ -51,14 +47,14 @@
     ): Boolean
 
     /**
-     * Called to notify this [DragAndDropManager] that a [DragAndDropModifierNode] is interested
-     * in receiving events for a particular drag and drop session.
+     * Called to notify this [DragAndDropManager] that a [DragAndDropModifierNode] is interested in
+     * receiving events for a particular drag and drop session.
      */
     fun registerNodeInterest(node: DragAndDropModifierNode)
 
     /**
-     * Called to check if a [DragAndDropModifierNode] has previously registered interest for a
-     * drag and drop session.
+     * Called to check if a [DragAndDropModifierNode] has previously registered interest for a drag
+     * and drop session.
      */
     fun isInterestedNode(node: DragAndDropModifierNode): Boolean
 }
diff --git a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/draganddrop/DragAndDropNode.kt b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/draganddrop/DragAndDropNode.kt
index 552889f..20dba97 100644
--- a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/draganddrop/DragAndDropNode.kt
+++ b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/draganddrop/DragAndDropNode.kt
@@ -33,21 +33,19 @@
 import androidx.compose.ui.node.traverseDescendants
 
 /**
- * A [Modifier.Node] providing low level access to platform drag and drop operations.
- * In most cases, you will want to delegate to the [DragAndDropModifierNode] returned by
- * the eponymous factory method.
+ * A [Modifier.Node] providing low level access to platform drag and drop operations. In most cases,
+ * you will want to delegate to the [DragAndDropModifierNode] returned by the eponymous factory
+ * method.
  */
 interface DragAndDropModifierNode : DelegatableNode, DragAndDropTarget {
     /**
      * Begins a drag and drop session for transferring data.
      *
-     * @param transferData the data to be transferred after successful completion of the
-     * drag and drop gesture.
-     *
+     * @param transferData the data to be transferred after successful completion of the drag and
+     *   drop gesture.
      * @param decorationSize the size of the drag decoration to be drawn.
-     *
      * @param drawDragDecoration provides the visual representation of the item dragged during the
-     * drag and drop gesture.
+     *   drag and drop gesture.
      */
     fun drag(
         transferData: DragAndDropTransferData,
@@ -58,16 +56,14 @@
     /**
      * The entry point to register interest in a drag and drop session for receiving data.
      *
-     * @return true to indicate interest in the contents of a drag and drop session, false
-     * indicates no interest. If false is returned, this [Modifier] will not receive any
-     * [DragAndDropTarget] events.
+     * @return true to indicate interest in the contents of a drag and drop session, false indicates
+     *   no interest. If false is returned, this [Modifier] will not receive any [DragAndDropTarget]
+     *   events.
      *
-     * All [DragAndDropModifierNode] instances in the hierarchy will be given an opportunity
-     * to participate in a drag and drop session via this method.
+     * All [DragAndDropModifierNode] instances in the hierarchy will be given an opportunity to
+     * participate in a drag and drop session via this method.
      */
-    fun acceptDragAndDropTransfer(
-        startEvent: DragAndDropEvent
-    ): Boolean
+    fun acceptDragAndDropTransfer(startEvent: DragAndDropEvent): Boolean
 }
 
 /**
@@ -82,48 +78,44 @@
  * sessions by calling [DragAndDropModifierNode.drag].
  *
  * @param shouldStartDragAndDrop allows for inspecting the start [DragAndDropEvent] for a given
- * session to decide whether or not the provided [DragAndDropTarget] would like to receive from it.
- *
+ *   session to decide whether or not the provided [DragAndDropTarget] would like to receive from
+ *   it.
  * @param target allows for receiving events and transfer data from a given drag and drop session.
- *
  */
 fun DragAndDropModifierNode(
     shouldStartDragAndDrop: (event: DragAndDropEvent) -> Boolean,
     target: DragAndDropTarget
 ): DragAndDropModifierNode = DragAndDropNode { startEvent ->
-    if (shouldStartDragAndDrop(startEvent)) target
-    else null
+    if (shouldStartDragAndDrop(startEvent)) target else null
 }
 
 /**
- * Core implementation of drag and drop. This [Modifier.Node] implements tree traversal for
- * drag and drop, as well as hit testing and propagation of events for drag or drop gestures.
+ * Core implementation of drag and drop. This [Modifier.Node] implements tree traversal for drag and
+ * drop, as well as hit testing and propagation of events for drag or drop gestures.
  *
  * It uses the [DragAndDropEvent] as a representation of a single mutable drag and drop session.
  *
- * The implementation implicitly maintains a sorted tree of nodes where the order of traversal
- * is determined by the proximity to the last event. That is, after finding a receiving node,
- * the next event will follow the same path the previous event did unless a fork is found and
- * another node should receive the event.
+ * The implementation implicitly maintains a sorted tree of nodes where the order of traversal is
+ * determined by the proximity to the last event. That is, after finding a receiving node, the next
+ * event will follow the same path the previous event did unless a fork is found and another node
+ * should receive the event.
  *
- * This optimizes traversal for the common case of move events where the event remains within
- * a single node, or moves to a sibling of the node.
+ * This optimizes traversal for the common case of move events where the event remains within a
+ * single node, or moves to a sibling of the node.
  */
 internal class DragAndDropNode(
     private val onDragAndDropStart: (event: DragAndDropEvent) -> DragAndDropTarget?
-) : Modifier.Node(),
-    TraversableNode,
-    DragAndDropModifierNode {
+) : Modifier.Node(), TraversableNode, DragAndDropModifierNode {
     companion object {
         private object DragAndDropTraversableKey
     }
 
     override val traverseKey: Any = DragAndDropTraversableKey
 
-    /** Child currently receiving drag gestures for dropping into **/
+    /** Child currently receiving drag gestures for dropping into * */
     private var lastChildDragAndDropModifierNode: DragAndDropModifierNode? = null
 
-    /** This as a drop target if eligible for processing **/
+    /** This as a drop target if eligible for processing * */
     private var thisDragAndDropTarget: DragAndDropTarget? = null
 
     // start Node
@@ -142,11 +134,13 @@
         decorationSize: Size,
         drawDragDecoration: DrawScope.() -> Unit,
     ) {
-        requireOwner().dragAndDropManager.drag(
-            transferData = transferData,
-            decorationSize = decorationSize,
-            drawDragDecoration = drawDragDecoration
-        )
+        requireOwner()
+            .dragAndDropManager
+            .drag(
+                transferData = transferData,
+                decorationSize = decorationSize,
+                drawDragDecoration = drawDragDecoration
+            )
     }
 
     override fun acceptDragAndDropTransfer(startEvent: DragAndDropEvent): Boolean {
@@ -196,16 +190,18 @@
 
     override fun onMoved(event: DragAndDropEvent) {
         val currentChildNode: DragAndDropModifierNode? = lastChildDragAndDropModifierNode
-        val newChildNode: DragAndDropModifierNode? = when {
-            // Moved within child.
-            currentChildNode?.contains(event.positionInRoot) == true -> currentChildNode
-            // Position is now outside active child, maybe it entered a different one.
-            else -> firstDescendantOrNull { child ->
-                // Only dispatch to children who previously accepted the onStart gesture
-                requireOwner().dragAndDropManager.isInterestedNode(child) &&
-                    child.contains(event.positionInRoot)
+        val newChildNode: DragAndDropModifierNode? =
+            when {
+                // Moved within child.
+                currentChildNode?.contains(event.positionInRoot) == true -> currentChildNode
+                // Position is now outside active child, maybe it entered a different one.
+                else ->
+                    firstDescendantOrNull { child ->
+                        // Only dispatch to children who previously accepted the onStart gesture
+                        requireOwner().dragAndDropManager.isInterestedNode(child) &&
+                            child.contains(event.positionInRoot)
+                    }
             }
-        }
 
         when {
             // Left us and went to a child.
@@ -235,7 +231,6 @@
     override fun onChanged(event: DragAndDropEvent) {
         when (val self = thisDragAndDropTarget) {
             null -> lastChildDragAndDropModifierNode?.onChanged(event = event)
-
             else -> self.onChanged(event = event)
         }
     }
@@ -249,7 +244,6 @@
     override fun onDrop(event: DragAndDropEvent): Boolean {
         return when (val currentChildDropTarget = lastChildDragAndDropModifierNode) {
             null -> thisDragAndDropTarget?.onDrop(event = event) ?: false
-
             else -> currentChildDropTarget.onDrop(event = event)
         }
     }
@@ -275,9 +269,7 @@
     onMoved(event = event)
 }
 
-/**
- * Hit test for a [DragAndDropNode].
- */
+/** Hit test for a [DragAndDropNode]. */
 private fun DragAndDropModifierNode.contains(position: Offset): Boolean {
     if (!node.isAttached) return false
     val currentCoordinates = requireLayoutNode().coordinates
diff --git a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/draw/Alpha.kt b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/draw/Alpha.kt
index 1bc2cb7..643ed6f 100644
--- a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/draw/Alpha.kt
+++ b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/draw/Alpha.kt
@@ -23,19 +23,18 @@
 /**
  * Draw content with modified alpha that may be less than 1.
  *
- * Usage of this API renders this composable into a separate graphics layer.
- * Note when an alpha less than 1.0f is provided, contents are implicitly clipped
- * to their bounds. This is because an intermediate compositing layer is created to
- * render contents into first before being drawn into the destination with the desired alpha.
- * This layer is sized to the bounds of the composable this modifier is configured on, and contents
- * outside of these bounds are omitted.
+ * Usage of this API renders this composable into a separate graphics layer. Note when an alpha less
+ * than 1.0f is provided, contents are implicitly clipped to their bounds. This is because an
+ * intermediate compositing layer is created to render contents into first before being drawn into
+ * the destination with the desired alpha. This layer is sized to the bounds of the composable this
+ * modifier is configured on, and contents outside of these bounds are omitted.
  *
+ * @param alpha the fraction of children's alpha value and must be between `0` and `1`, inclusive.
  * @see graphicsLayer
  *
  * Example usage:
- * @sample androidx.compose.ui.samples.AlphaSample
  *
- * @param alpha the fraction of children's alpha value and must be between `0` and `1`, inclusive.
+ * @sample androidx.compose.ui.samples.AlphaSample
  */
 @Stable
 fun Modifier.alpha(
diff --git a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/draw/Blur.kt b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/draw/Blur.kt
index 7eda4d8..acd7da2 100644
--- a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/draw/Blur.kt
+++ b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/draw/Blur.kt
@@ -28,46 +28,42 @@
 import androidx.compose.ui.unit.dp
 
 /**
- * Determines the strategy used to render pixels in the blurred result that may extend beyond
- * the bounds of the original input.
+ * Determines the strategy used to render pixels in the blurred result that may extend beyond the
+ * bounds of the original input.
  *
- * [BlurredEdgeTreatment] will clip the blur result to the boundaries of the
- * original content and optionally specified [shape].
+ * [BlurredEdgeTreatment] will clip the blur result to the boundaries of the original content and
+ * optionally specified [shape].
  *
  * Sampling of pixels outside of content bounds will have the same value as the pixels at the
- * closest edge.
- * This is recommended for blurring content that does not contain transparent pixels
- * and ensuring the blurred result does not extend beyond the original bounds (ex. blurring
- * an image)
+ * closest edge. This is recommended for blurring content that does not contain transparent pixels
+ * and ensuring the blurred result does not extend beyond the original bounds (ex. blurring an
+ * image)
  *
  * @see TileMode.Clamp
  *
  * Alternatively using [BlurredEdgeTreatment.Unbounded] will not clip the blur result to the
- * boundaries of the original content. Sampling of pixels outside of the content bounds
- * will sample transparent black instead.
- * This is recommended for blurring content that is intended to render outside of the
- * original bounds and may contain transparent pixels in the original bounds (ex. blurring
- * an arbitrary shape or text)
+ * boundaries of the original content. Sampling of pixels outside of the content bounds will sample
+ * transparent black instead. This is recommended for blurring content that is intended to render
+ * outside of the original bounds and may contain transparent pixels in the original bounds (ex.
+ * blurring an arbitrary shape or text)
  *
  * @see TileMode.Decal
-*/
+ */
 @Immutable
 @kotlin.jvm.JvmInline
 value class BlurredEdgeTreatment(val shape: Shape?) {
 
     companion object {
 
-        /**
-         * Bounded [BlurredEdgeTreatment] that clips content bounds to a rectangular shape
-         */
+        /** Bounded [BlurredEdgeTreatment] that clips content bounds to a rectangular shape */
         val Rectangle = BlurredEdgeTreatment(RectangleShape)
 
         /**
-         * Do not clip the blur result to the boundaries of the original content.
-         * Sampling of pixels outside of the content bounds will sample transparent black instead.
-         * This is recommended for blurring content that is intended to render outside of the
-         * original bounds and may contain transparent pixels in the original bounds (ex. blurring
-         * an arbitrary shape or text)
+         * Do not clip the blur result to the boundaries of the original content. Sampling of pixels
+         * outside of the content bounds will sample transparent black instead. This is recommended
+         * for blurring content that is intended to render outside of the original bounds and may
+         * contain transparent pixels in the original bounds (ex. blurring an arbitrary shape or
+         * text)
          *
          * @see TileMode.Decal
          */
@@ -79,20 +75,21 @@
  * Draw content blurred with the specified radii. Note this effect is only supported on Android 12
  * and above. Attempts to use this Modifier on older Android versions will be ignored.
  *
- * Usage of this API renders the corresponding composable into a separate graphics layer.
- * Because the blurred content renders a larger area by the blur radius, this layer is explicitly
- * clipped to the content bounds. It is recommended introduce additional space around the drawn
- * content by the specified blur radius to remain within the content bounds.
- *
- * @see graphicsLayer
- *
- * Example usage:
- * @sample androidx.compose.ui.samples.BlurSample
- * @sample androidx.compose.ui.samples.ImageBlurSample
+ * Usage of this API renders the corresponding composable into a separate graphics layer. Because
+ * the blurred content renders a larger area by the blur radius, this layer is explicitly clipped to
+ * the content bounds. It is recommended introduce additional space around the drawn content by the
+ * specified blur radius to remain within the content bounds.
  *
  * @param radiusX Radius of the blur along the x axis
  * @param radiusY Radius of the blur along the y axis
  * @param edgeTreatment Strategy used to render pixels outside of bounds of the original input
+ * @see graphicsLayer
+ *
+ * Example usage:
+ *
+ * @sample androidx.compose.ui.samples.BlurSample
+ *
+ * @sample androidx.compose.ui.samples.ImageBlurSample
  */
 @Stable
 fun Modifier.blur(
@@ -132,19 +129,20 @@
  * Draw content blurred with the specified radii. Note this effect is only supported on Android 12
  * and above. Attempts to use this Modifier on older Android versions will be ignored.
  *
- * Usage of this API renders the corresponding composable into a separate graphics layer.
- * Because the blurred content renders a larger area by the blur radius, this layer is explicitly
- * clipped to the content bounds. It is recommended introduce additional space around the drawn
- * content by the specified blur radius to remain within the content bounds.
- *
- * @see graphicsLayer
- *
- * Example usage:
- * @sample androidx.compose.ui.samples.BlurSample
- * @sample androidx.compose.ui.samples.ImageBlurSample
+ * Usage of this API renders the corresponding composable into a separate graphics layer. Because
+ * the blurred content renders a larger area by the blur radius, this layer is explicitly clipped to
+ * the content bounds. It is recommended introduce additional space around the drawn content by the
+ * specified blur radius to remain within the content bounds.
  *
  * @param radius Radius of the blur along both the x and y axis
  * @param edgeTreatment Strategy used to render pixels outside of bounds of the original input
+ * @see graphicsLayer
+ *
+ * Example usage:
+ *
+ * @sample androidx.compose.ui.samples.BlurSample
+ *
+ * @sample androidx.compose.ui.samples.ImageBlurSample
  */
 @Stable
 fun Modifier.blur(
diff --git a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/draw/Clip.kt b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/draw/Clip.kt
index 45e4290..83abd55 100644
--- a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/draw/Clip.kt
+++ b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/draw/Clip.kt
@@ -21,16 +21,12 @@
 import androidx.compose.ui.graphics.Shape
 import androidx.compose.ui.graphics.graphicsLayer
 
-/**
- * Clip the content to the bounds of a layer defined at this modifier.
- */
-@Stable
-fun Modifier.clipToBounds() = graphicsLayer(clip = true)
+/** Clip the content to the bounds of a layer defined at this modifier. */
+@Stable fun Modifier.clipToBounds() = graphicsLayer(clip = true)
 
 /**
  * Clip the content to [shape].
  *
  * @param shape the content will be clipped to this [Shape].
  */
-@Stable
-fun Modifier.clip(shape: Shape) = graphicsLayer(shape = shape, clip = true)
+@Stable fun Modifier.clip(shape: Shape) = graphicsLayer(shape = shape, clip = true)
diff --git a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/draw/DrawModifier.kt b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/draw/DrawModifier.kt
index 9c4aca2..5dbf144 100644
--- a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/draw/DrawModifier.kt
+++ b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/draw/DrawModifier.kt
@@ -47,9 +47,7 @@
 import androidx.compose.ui.unit.toIntSize
 import androidx.compose.ui.unit.toSize
 
-/**
- * A [Modifier.Element] that draws into the space of the layout.
- */
+/** A [Modifier.Element] that draws into the space of the layout. */
 @JvmDefaultWithCompatibility
 interface DrawModifier : Modifier.Element {
 
@@ -57,18 +55,17 @@
 }
 
 /**
- * [DrawModifier] implementation that supports building a cache of objects
- * to be referenced across draw calls
+ * [DrawModifier] implementation that supports building a cache of objects to be referenced across
+ * draw calls
  */
 @JvmDefaultWithCompatibility
 interface DrawCacheModifier : DrawModifier {
 
     /**
-     * Callback invoked to re-build objects to be re-used across draw calls.
-     * This is useful to conditionally recreate objects only if the size of the
-     * drawing environment changes, or if state parameters that are inputs
-     * to objects change. This method is guaranteed to be called before
-     * [DrawModifier.draw].
+     * Callback invoked to re-build objects to be re-used across draw calls. This is useful to
+     * conditionally recreate objects only if the size of the drawing environment changes, or if
+     * state parameters that are inputs to objects change. This method is guaranteed to be called
+     * before [DrawModifier.draw].
      *
      * @param params The params to be used to build the cache.
      */
@@ -81,32 +78,21 @@
  * @see DrawCacheModifier.onBuildCache
  */
 interface BuildDrawCacheParams {
-    /**
-     * The current size of the drawing environment
-     */
+    /** The current size of the drawing environment */
     val size: Size
 
-    /**
-     * The current layout direction.
-     */
+    /** The current layout direction. */
     val layoutDirection: LayoutDirection
 
-    /**
-     * The current screen density to provide the ability to convert between
-     */
+    /** The current screen density to provide the ability to convert between */
     val density: Density
 }
 
-/**
- * Draw into a [Canvas] behind the modified content.
- */
-fun Modifier.drawBehind(
-    onDraw: DrawScope.() -> Unit
-) = this then DrawBehindElement(onDraw)
+/** Draw into a [Canvas] behind the modified content. */
+fun Modifier.drawBehind(onDraw: DrawScope.() -> Unit) = this then DrawBehindElement(onDraw)
 
-private data class DrawBehindElement(
-    val onDraw: DrawScope.() -> Unit
-) : ModifierNodeElement<DrawBackgroundModifier>() {
+private data class DrawBehindElement(val onDraw: DrawScope.() -> Unit) :
+    ModifierNodeElement<DrawBackgroundModifier>() {
     override fun create() = DrawBackgroundModifier(onDraw)
 
     override fun update(node: DrawBackgroundModifier) {
@@ -119,9 +105,8 @@
     }
 }
 
-internal class DrawBackgroundModifier(
-    var onDraw: DrawScope.() -> Unit
-) : Modifier.Node(), DrawModifierNode {
+internal class DrawBackgroundModifier(var onDraw: DrawScope.() -> Unit) :
+    Modifier.Node(), DrawModifierNode {
 
     override fun ContentDrawScope.draw() {
         onDraw()
@@ -130,27 +115,26 @@
 }
 
 /**
- * Draw into a [DrawScope] with content that is persisted across
- * draw calls as long as the size of the drawing area is the same or
- * any state objects that are read have not changed. In the event that
- * the drawing area changes, or the underlying state values that are being read
- * change, this method is invoked again to recreate objects to be used during drawing
+ * Draw into a [DrawScope] with content that is persisted across draw calls as long as the size of
+ * the drawing area is the same or any state objects that are read have not changed. In the event
+ * that the drawing area changes, or the underlying state values that are being read change, this
+ * method is invoked again to recreate objects to be used during drawing
  *
- * For example, a [androidx.compose.ui.graphics.LinearGradient] that is to occupy the full
- * bounds of the drawing area can be created once the size has been defined and referenced
- * for subsequent draw calls without having to re-allocate.
+ * For example, a [androidx.compose.ui.graphics.LinearGradient] that is to occupy the full bounds of
+ * the drawing area can be created once the size has been defined and referenced for subsequent draw
+ * calls without having to re-allocate.
  *
  * @sample androidx.compose.ui.samples.DrawWithCacheModifierSample
+ *
  * @sample androidx.compose.ui.samples.DrawWithCacheModifierStateParameterSample
+ *
  * @sample androidx.compose.ui.samples.DrawWithCacheContentSample
  */
-fun Modifier.drawWithCache(
-    onBuildDrawCache: CacheDrawScope.() -> DrawResult
-) = this then DrawWithCacheElement(onBuildDrawCache)
+fun Modifier.drawWithCache(onBuildDrawCache: CacheDrawScope.() -> DrawResult) =
+    this then DrawWithCacheElement(onBuildDrawCache)
 
-private data class DrawWithCacheElement(
-    val onBuildDrawCache: CacheDrawScope.() -> DrawResult
-) : ModifierNodeElement<CacheDrawModifierNodeImpl>() {
+private data class DrawWithCacheElement(val onBuildDrawCache: CacheDrawScope.() -> DrawResult) :
+    ModifierNodeElement<CacheDrawModifierNodeImpl>() {
     override fun create(): CacheDrawModifierNodeImpl {
         return CacheDrawModifierNodeImpl(CacheDrawScope(), onBuildDrawCache)
     }
@@ -181,9 +165,9 @@
 }
 
 /**
- * Wrapper [GraphicsContext] implementation that maintains a list of the [GraphicsLayer]
- * instances that were created through this instance so it can release only those [GraphicsLayer]s
- * when it is disposed of within the corresponding Modifier is disposed
+ * Wrapper [GraphicsContext] implementation that maintains a list of the [GraphicsLayer] instances
+ * that were created through this instance so it can release only those [GraphicsLayer]s when it is
+ * disposed of within the corresponding Modifier is disposed
  */
 private class ScopedGraphicsContext : GraphicsContext {
 
@@ -240,17 +224,20 @@
         cacheDrawScope.graphicsContextProvider = { graphicsContext }
     }
 
-    override val density: Density get() = requireDensity()
-    override val layoutDirection: LayoutDirection get() = requireLayoutDirection()
-    override val size: Size get() = requireCoordinator(Nodes.LayoutAware).size.toSize()
+    override val density: Density
+        get() = requireDensity()
+
+    override val layoutDirection: LayoutDirection
+        get() = requireLayoutDirection()
+
+    override val size: Size
+        get() = requireCoordinator(Nodes.LayoutAware).size.toSize()
 
     val graphicsContext: GraphicsContext
         get() {
             var localGraphicsContext = cachedGraphicsContext
             if (localGraphicsContext == null) {
-                localGraphicsContext = ScopedGraphicsContext().also {
-                    cachedGraphicsContext = it
-                }
+                localGraphicsContext = ScopedGraphicsContext().also { cachedGraphicsContext = it }
             }
             if (localGraphicsContext.graphicsContext == null) {
                 localGraphicsContext.graphicsContext = requireGraphicsContext()
@@ -315,21 +302,19 @@
     internal var contentDrawScope: ContentDrawScope? = null
     internal var graphicsContextProvider: (() -> GraphicsContext)? = null
 
-    /**
-     * Provides the dimensions of the current drawing environment
-     */
-    val size: Size get() = cacheParams.size
+    /** Provides the dimensions of the current drawing environment */
+    val size: Size
+        get() = cacheParams.size
+
+    /** Provides the [LayoutDirection]. */
+    val layoutDirection: LayoutDirection
+        get() = cacheParams.layoutDirection
 
     /**
-     * Provides the [LayoutDirection].
-     */
-    val layoutDirection: LayoutDirection get() = cacheParams.layoutDirection
-
-    /**
-     * Returns a managed [GraphicsLayer] instance. This [GraphicsLayer] maybe newly created
-     * or return a previously allocated instance. Consumers are not expected to release this
-     * instance as it is automatically recycled upon invalidation of the CacheDrawScope and released
-     * when the [DrawCacheModifier] is detached.
+     * Returns a managed [GraphicsLayer] instance. This [GraphicsLayer] maybe newly created or
+     * return a previously allocated instance. Consumers are not expected to release this instance
+     * as it is automatically recycled upon invalidation of the CacheDrawScope and released when the
+     * [DrawCacheModifier] is detached.
      */
     fun obtainGraphicsLayer(): GraphicsLayer =
         graphicsContextProvider!!.invoke().createGraphicsLayer()
@@ -343,31 +328,28 @@
         layoutDirection: LayoutDirection = this@CacheDrawScope.layoutDirection,
         size: IntSize = this@CacheDrawScope.size.toIntSize(),
         block: ContentDrawScope.() -> Unit
-    ) = record(density, layoutDirection, size) {
-        val contentDrawScope = this@CacheDrawScope.contentDrawScope!!
-        drawIntoCanvas { canvas ->
-            contentDrawScope.draw(
-                density,
-                layoutDirection,
-                canvas,
-                Size(size.width.toFloat(), size.height.toFloat())
-            ) {
-                block(contentDrawScope)
+    ) =
+        record(density, layoutDirection, size) {
+            val contentDrawScope = this@CacheDrawScope.contentDrawScope!!
+            drawIntoCanvas { canvas ->
+                contentDrawScope.draw(
+                    density,
+                    layoutDirection,
+                    canvas,
+                    Size(size.width.toFloat(), size.height.toFloat())
+                ) {
+                    block(contentDrawScope)
+                }
             }
         }
-    }
 
-    /**
-     * Issue drawing commands to be executed before the layout content is drawn
-     */
+    /** Issue drawing commands to be executed before the layout content is drawn */
     fun onDrawBehind(block: DrawScope.() -> Unit): DrawResult = onDrawWithContent {
         block()
         drawContent()
     }
 
-    /**
-     * Issue drawing commands before or after the layout's drawing contents
-     */
+    /** Issue drawing commands before or after the layout's drawing contents */
     fun onDrawWithContent(block: ContentDrawScope.() -> Unit): DrawResult {
         return DrawResult(block).also { drawResult = it }
     }
@@ -386,22 +368,20 @@
 }
 
 /**
- * Holder to a callback to be invoked during draw operations. This lambda
- * captures and reuses parameters defined within the CacheDrawScope receiver scope lambda.
+ * Holder to a callback to be invoked during draw operations. This lambda captures and reuses
+ * parameters defined within the CacheDrawScope receiver scope lambda.
  */
 class DrawResult internal constructor(internal var block: ContentDrawScope.() -> Unit)
 
 /**
- * Creates a [DrawModifier] that allows the developer to draw before or after the layout's
- * contents. It also allows the modifier to adjust the layout's canvas.
+ * Creates a [DrawModifier] that allows the developer to draw before or after the layout's contents.
+ * It also allows the modifier to adjust the layout's canvas.
  */
-fun Modifier.drawWithContent(
-    onDraw: ContentDrawScope.() -> Unit
-): Modifier = this then DrawWithContentElement(onDraw)
+fun Modifier.drawWithContent(onDraw: ContentDrawScope.() -> Unit): Modifier =
+    this then DrawWithContentElement(onDraw)
 
-private data class DrawWithContentElement(
-    val onDraw: ContentDrawScope.() -> Unit
-) : ModifierNodeElement<DrawWithContentModifier>() {
+private data class DrawWithContentElement(val onDraw: ContentDrawScope.() -> Unit) :
+    ModifierNodeElement<DrawWithContentModifier>() {
     override fun create() = DrawWithContentModifier(onDraw)
 
     override fun update(node: DrawWithContentModifier) {
@@ -414,9 +394,8 @@
     }
 }
 
-private class DrawWithContentModifier(
-    var onDraw: ContentDrawScope.() -> Unit
-) : Modifier.Node(), DrawModifierNode {
+private class DrawWithContentModifier(var onDraw: ContentDrawScope.() -> Unit) :
+    Modifier.Node(), DrawModifierNode {
 
     override fun ContentDrawScope.draw() {
         onDraw()
diff --git a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/draw/PainterModifier.kt b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/draw/PainterModifier.kt
index f387981..b1637e8 100644
--- a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/draw/PainterModifier.kt
+++ b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/draw/PainterModifier.kt
@@ -36,7 +36,6 @@
 import androidx.compose.ui.node.LayoutModifierNode
 import androidx.compose.ui.node.ModifierNodeElement
 import androidx.compose.ui.node.invalidateDraw
-import androidx.compose.ui.node.invalidateLayer
 import androidx.compose.ui.node.invalidateMeasurement
 import androidx.compose.ui.platform.InspectorInfo
 import androidx.compose.ui.unit.Constraints
@@ -65,14 +64,16 @@
     contentScale: ContentScale = ContentScale.Inside,
     alpha: Float = DefaultAlpha,
     colorFilter: ColorFilter? = null
-) = this then PainterElement(
-    painter = painter,
-    sizeToIntrinsics = sizeToIntrinsics,
-    alignment = alignment,
-    contentScale = contentScale,
-    alpha = alpha,
-    colorFilter = colorFilter
-)
+) =
+    this then
+        PainterElement(
+            painter = painter,
+            sizeToIntrinsics = sizeToIntrinsics,
+            alignment = alignment,
+            contentScale = contentScale,
+            alpha = alpha,
+            colorFilter = colorFilter
+        )
 
 /**
  * Customized [ModifierNodeElement] for painting content using [painter].
@@ -106,8 +107,9 @@
     }
 
     override fun update(node: PainterNode) {
-        val intrinsicsChanged = node.sizeToIntrinsics != sizeToIntrinsics ||
-            (sizeToIntrinsics && node.painter.intrinsicSize != painter.intrinsicSize)
+        val intrinsicsChanged =
+            node.sizeToIntrinsics != sizeToIntrinsics ||
+                (sizeToIntrinsics && node.painter.intrinsicSize != painter.intrinsicSize)
 
         node.painter = painter
         node.sizeToIntrinsics = sizeToIntrinsics
@@ -136,14 +138,13 @@
 }
 
 /**
- * [DrawModifier] used to draw the provided [Painter] followed by the contents
- * of the component itself
+ * [DrawModifier] used to draw the provided [Painter] followed by the contents of the component
+ * itself
  *
- *
- * IMPORTANT NOTE: This class sets [androidx.compose.ui.Modifier.Node.shouldAutoInvalidate]
- * to false which means it MUST invalidate both draw and the layout. It invalidates both in the
- * [PainterElement.update] method through [LayoutModifierNode.invalidateLayer]
- * (invalidates draw) and [LayoutModifierNode.invalidateLayout] (invalidates layout).
+ * IMPORTANT NOTE: This class sets [androidx.compose.ui.Modifier.Node.shouldAutoInvalidate] to false
+ * which means it MUST invalidate both draw and the layout. It invalidates both in the
+ * [PainterElement.update] method through [LayoutModifierNode.invalidateLayer] (invalidates draw)
+ * and [LayoutModifierNode.invalidateLayout] (invalidates layout).
  */
 private class PainterNode(
     var painter: Painter,
@@ -155,9 +156,8 @@
 ) : LayoutModifierNode, Modifier.Node(), DrawModifierNode {
 
     /**
-     * Helper property to determine if we should size content to the intrinsic
-     * size of the Painter or not. This is only done if [sizeToIntrinsics] is true
-     * and the Painter has an intrinsic size
+     * Helper property to determine if we should size content to the intrinsic size of the Painter
+     * or not. This is only done if [sizeToIntrinsics] is true and the Painter has an intrinsic size
      */
     private val useIntrinsicSize: Boolean
         get() = sizeToIntrinsics && painter.intrinsicSize.isSpecified
@@ -170,9 +170,7 @@
         constraints: Constraints
     ): MeasureResult {
         val placeable = measurable.measure(modifyConstraints(constraints))
-        return layout(placeable.width, placeable.height) {
-            placeable.placeRelative(0, 0)
-        }
+        return layout(placeable.width, placeable.height) { placeable.placeRelative(0, 0) }
     }
 
     override fun IntrinsicMeasureScope.minIntrinsicWidth(
@@ -231,17 +229,19 @@
         return if (!useIntrinsicSize) {
             dstSize
         } else {
-            val srcWidth = if (!painter.intrinsicSize.hasSpecifiedAndFiniteWidth()) {
-                dstSize.width
-            } else {
-                painter.intrinsicSize.width
-            }
+            val srcWidth =
+                if (!painter.intrinsicSize.hasSpecifiedAndFiniteWidth()) {
+                    dstSize.width
+                } else {
+                    painter.intrinsicSize.width
+                }
 
-            val srcHeight = if (!painter.intrinsicSize.hasSpecifiedAndFiniteHeight()) {
-                dstSize.height
-            } else {
-                painter.intrinsicSize.height
-            }
+            val srcHeight =
+                if (!painter.intrinsicSize.hasSpecifiedAndFiniteHeight()) {
+                    dstSize.height
+                } else {
+                    painter.intrinsicSize.height
+                }
 
             val srcSize = Size(srcWidth, srcHeight)
             if (dstSize.width != 0f && dstSize.height != 0f) {
@@ -286,9 +286,8 @@
         // and ContentScale
         val constrainedWidth = constraints.constrainWidth(intrinsicWidth)
         val constrainedHeight = constraints.constrainHeight(intrinsicHeight)
-        val scaledSize = calculateScaledSize(
-            Size(constrainedWidth.toFloat(), constrainedHeight.toFloat())
-        )
+        val scaledSize =
+            calculateScaledSize(Size(constrainedWidth.toFloat(), constrainedHeight.toFloat()))
 
         // For both width and height constraints, consume the minimum of the scaled width
         // and the maximum constraint as some scale types can scale larger than the maximum
@@ -303,33 +302,37 @@
 
     override fun ContentDrawScope.draw() {
         val intrinsicSize = painter.intrinsicSize
-        val srcWidth = if (intrinsicSize.hasSpecifiedAndFiniteWidth()) {
-            intrinsicSize.width
-        } else {
-            size.width
-        }
+        val srcWidth =
+            if (intrinsicSize.hasSpecifiedAndFiniteWidth()) {
+                intrinsicSize.width
+            } else {
+                size.width
+            }
 
-        val srcHeight = if (intrinsicSize.hasSpecifiedAndFiniteHeight()) {
-            intrinsicSize.height
-        } else {
-            size.height
-        }
+        val srcHeight =
+            if (intrinsicSize.hasSpecifiedAndFiniteHeight()) {
+                intrinsicSize.height
+            } else {
+                size.height
+            }
 
         val srcSize = Size(srcWidth, srcHeight)
 
         // Compute the offset to translate the content based on the given alignment
         // and size to draw based on the ContentScale parameter
-        val scaledSize = if (size.width != 0f && size.height != 0f) {
-            srcSize * contentScale.computeScaleFactor(srcSize, size)
-        } else {
-            Size.Zero
-        }
+        val scaledSize =
+            if (size.width != 0f && size.height != 0f) {
+                srcSize * contentScale.computeScaleFactor(srcSize, size)
+            } else {
+                Size.Zero
+            }
 
-        val alignedPosition = alignment.align(
-            IntSize(scaledSize.width.fastRoundToInt(), scaledSize.height.fastRoundToInt()),
-            IntSize(size.width.fastRoundToInt(), size.height.fastRoundToInt()),
-            layoutDirection
-        )
+        val alignedPosition =
+            alignment.align(
+                IntSize(scaledSize.width.fastRoundToInt(), scaledSize.height.fastRoundToInt()),
+                IntSize(size.width.fastRoundToInt(), size.height.fastRoundToInt()),
+                layoutDirection
+            )
 
         val dx = alignedPosition.x.toFloat()
         val dy = alignedPosition.y.toFloat()
@@ -339,9 +342,7 @@
         // Individual Painter implementations should be responsible for scaling their drawing
         // content accordingly to fit within the drawing area.
         translate(dx, dy) {
-            with(painter) {
-                draw(size = scaledSize, alpha = alpha, colorFilter = colorFilter)
-            }
+            with(painter) { draw(size = scaledSize, alpha = alpha, colorFilter = colorFilter) }
         }
 
         // Maintain the same pattern as Modifier.drawBehind to allow chaining of DrawModifiers
@@ -349,6 +350,7 @@
     }
 
     private fun Size.hasSpecifiedAndFiniteWidth() = this != Size.Unspecified && width.isFinite()
+
     private fun Size.hasSpecifiedAndFiniteHeight() = this != Size.Unspecified && height.isFinite()
 
     override fun toString(): String =
diff --git a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/draw/Rotate.kt b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/draw/Rotate.kt
index 4e98780..4dcc81f 100644
--- a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/draw/Rotate.kt
+++ b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/draw/Rotate.kt
@@ -26,9 +26,11 @@
  * direction
  *
  * Usage of this API renders this composable into a separate graphics layer.
+ *
  * @see graphicsLayer
  *
  * Example usage:
+ *
  * @sample androidx.compose.ui.samples.RotateSample
  */
 @Stable
diff --git a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/draw/Scale.kt b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/draw/Scale.kt
index 8f2f7f5..65efbb9 100644
--- a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/draw/Scale.kt
+++ b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/draw/Scale.kt
@@ -21,18 +21,19 @@
 import androidx.compose.ui.graphics.graphicsLayer
 
 /**
- * Scale the contents of the composable by the following scale factors along the horizontal
- * and vertical axis respectively. Negative scale factors can be used to mirror content
- * across the corresponding horizontal or vertical axis.
+ * Scale the contents of the composable by the following scale factors along the horizontal and
+ * vertical axis respectively. Negative scale factors can be used to mirror content across the
+ * corresponding horizontal or vertical axis.
  *
  * Example usage:
+ *
  * @sample androidx.compose.ui.samples.ScaleNonUniformSample
  *
  * Usage of this API renders this composable into a separate graphics layer
- * @see graphicsLayer
  *
  * @param scaleX Multiplier to scale content along the horizontal axis
  * @param scaleY Multiplier to scale content along the vertical axis
+ * @see graphicsLayer
  */
 @Stable
 fun Modifier.scale(scaleX: Float, scaleY: Float) =
@@ -46,12 +47,12 @@
  * Scale the contents of both the horizontal and vertical axis uniformly by the same scale factor.
  *
  * Usage of this API renders this composable into a separate graphics layer
+ *
+ * @param scale Multiplier to scale content along the horizontal and vertical axis
  * @see graphicsLayer
  *
  * Example usage:
- * @sample androidx.compose.ui.samples.ScaleUniformSample
  *
- * @param scale Multiplier to scale content along the horizontal and vertical axis
+ * @sample androidx.compose.ui.samples.ScaleUniformSample
  */
-@Stable
-fun Modifier.scale(scale: Float) = scale(scale, scale)
+@Stable fun Modifier.scale(scale: Float) = scale(scale, scale)
diff --git a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/draw/Shadow.kt b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/draw/Shadow.kt
index e48553d..1365dd3 100644
--- a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/draw/Shadow.kt
+++ b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/draw/Shadow.kt
@@ -31,25 +31,25 @@
 import androidx.compose.ui.unit.dp
 
 /**
- * Creates a [graphicsLayer] that draws a shadow. The [elevation] defines the visual
- * depth of the physical object. The physical object has a shape specified by [shape].
+ * Creates a [graphicsLayer] that draws a shadow. The [elevation] defines the visual depth of the
+ * physical object. The physical object has a shape specified by [shape].
  *
  * If the passed [shape] is concave the shadow will not be drawn on Android versions less than 10.
  *
- * Note that [elevation] is only affecting the shadow size and doesn't change the drawing order.
- * Use a [androidx.compose.ui.zIndex] modifier if you want to draw the elements with larger
- * [elevation] after all the elements with a smaller one.
+ * Note that [elevation] is only affecting the shadow size and doesn't change the drawing order. Use
+ * a [androidx.compose.ui.zIndex] modifier if you want to draw the elements with larger [elevation]
+ * after all the elements with a smaller one.
  *
  * Usage of this API renders this composable into a separate graphics layer
+ *
+ * @param elevation The elevation for the shadow in pixels
+ * @param shape Defines a shape of the physical object
+ * @param clip When active, the content drawing clips to the shape.
  * @see graphicsLayer
  *
  * Example usage:
  *
  * @sample androidx.compose.ui.samples.ShadowSample
- *
- * @param elevation The elevation for the shadow in pixels
- * @param shape Defines a shape of the physical object
- * @param clip When active, the content drawing clips to the shape.
  */
 @Deprecated(
     "Replace with shadow which accepts ambientColor and spotColor parameters",
@@ -64,39 +64,40 @@
     elevation: Dp,
     shape: Shape = RectangleShape,
     clip: Boolean = elevation > 0.dp
-) = shadow(
-    elevation,
-    shape,
-    clip,
-    DefaultShadowColor,
-    DefaultShadowColor,
-)
+) =
+    shadow(
+        elevation,
+        shape,
+        clip,
+        DefaultShadowColor,
+        DefaultShadowColor,
+    )
 
 /**
- * Creates a [graphicsLayer] that draws a shadow. The [elevation] defines the visual
- * depth of the physical object. The physical object has a shape specified by [shape].
+ * Creates a [graphicsLayer] that draws a shadow. The [elevation] defines the visual depth of the
+ * physical object. The physical object has a shape specified by [shape].
  *
  * If the passed [shape] is concave the shadow will not be drawn on Android versions less than 10.
  *
- * Note that [elevation] is only affecting the shadow size and doesn't change the drawing order.
- * Use a [androidx.compose.ui.zIndex] modifier if you want to draw the elements with larger
- * [elevation] after all the elements with a smaller one.
+ * Note that [elevation] is only affecting the shadow size and doesn't change the drawing order. Use
+ * a [androidx.compose.ui.zIndex] modifier if you want to draw the elements with larger [elevation]
+ * after all the elements with a smaller one.
  *
- * Note that this parameter is only supported on Android 9 (Pie) and above. On older versions,
- * this property always returns [Color.Black] and setting new values is ignored.
+ * Note that this parameter is only supported on Android 9 (Pie) and above. On older versions, this
+ * property always returns [Color.Black] and setting new values is ignored.
  *
  * Usage of this API renders this composable into a separate graphics layer
- * @see graphicsLayer
- *
- * Example usage:
- *
- * @sample androidx.compose.ui.samples.ShadowSample
  *
  * @param elevation The elevation for the shadow in pixels
  * @param shape Defines a shape of the physical object
  * @param clip When active, the content drawing clips to the shape.
  * @param ambientColor Color of the ambient shadow drawn when [elevation] > 0f
  * @param spotColor Color of the spot shadow that is drawn when [elevation] > 0f
+ * @see graphicsLayer
+ *
+ * Example usage:
+ *
+ * @sample androidx.compose.ui.samples.ShadowSample
  */
 @Stable
 fun Modifier.shadow(
@@ -105,11 +106,12 @@
     clip: Boolean = elevation > 0.dp,
     ambientColor: Color = DefaultShadowColor,
     spotColor: Color = DefaultShadowColor,
-) = if (elevation > 0.dp || clip) {
-    this then ShadowGraphicsLayerElement(elevation, shape, clip, ambientColor, spotColor)
-} else {
-    this
-}
+) =
+    if (elevation > 0.dp || clip) {
+        this then ShadowGraphicsLayerElement(elevation, shape, clip, ambientColor, spotColor)
+    } else {
+        this
+    }
 
 internal data class ShadowGraphicsLayerElement(
     val elevation: Dp,
@@ -126,6 +128,7 @@
         this.ambientShadowColor = this@ShadowGraphicsLayerElement.ambientColor
         this.spotShadowColor = this@ShadowGraphicsLayerElement.spotColor
     }
+
     override fun create() = BlockGraphicsLayerModifier(createBlock())
 
     override fun update(node: BlockGraphicsLayerModifier) {
diff --git a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/focus/BeyondBoundsLayout.kt b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/focus/BeyondBoundsLayout.kt
index 71cdeb1..542d2e3 100644
--- a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/focus/BeyondBoundsLayout.kt
+++ b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/focus/BeyondBoundsLayout.kt
@@ -43,15 +43,16 @@
     }
 
     return beyondBoundsLayoutParent?.layout(
-        direction = when (direction) {
-            FocusDirection.Up -> Above
-            FocusDirection.Down -> Below
-            FocusDirection.Left -> Left
-            FocusDirection.Right -> Right
-            FocusDirection.Next -> After
-            FocusDirection.Previous -> Before
-            else -> error("Unsupported direction for beyond bounds layout")
-        },
+        direction =
+            when (direction) {
+                FocusDirection.Up -> Above
+                FocusDirection.Down -> Below
+                FocusDirection.Left -> Left
+                FocusDirection.Right -> Right
+                FocusDirection.Next -> After
+                FocusDirection.Previous -> Before
+                else -> error("Unsupported direction for beyond bounds layout")
+            },
         block = block
     )
 }
diff --git a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/focus/FocusChangedModifier.kt b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/focus/FocusChangedModifier.kt
index 623ca09..8492470 100644
--- a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/focus/FocusChangedModifier.kt
+++ b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/focus/FocusChangedModifier.kt
@@ -21,8 +21,8 @@
 import androidx.compose.ui.platform.InspectorInfo
 
 /**
- * Add this modifier to a component to observe focus state events. [onFocusChanged] is invoked
- * when the focus state changes. The [onFocusChanged] modifier listens to the state of the first
+ * Add this modifier to a component to observe focus state events. [onFocusChanged] is invoked when
+ * the focus state changes. The [onFocusChanged] modifier listens to the state of the first
  * [focusTarget] following this modifier.
  *
  * @sample androidx.compose.ui.samples.FocusableSample
@@ -30,13 +30,11 @@
  * Note: If you want to be notified every time the internal focus state is written to (even if it
  * hasn't changed), use [onFocusEvent] instead.
  */
-fun Modifier.onFocusChanged(
-    onFocusChanged: (FocusState) -> Unit
-): Modifier = this then FocusChangedElement(onFocusChanged)
+fun Modifier.onFocusChanged(onFocusChanged: (FocusState) -> Unit): Modifier =
+    this then FocusChangedElement(onFocusChanged)
 
-private data class FocusChangedElement(
-    val onFocusChanged: (FocusState) -> Unit
-) : ModifierNodeElement<FocusChangedNode>() {
+private data class FocusChangedElement(val onFocusChanged: (FocusState) -> Unit) :
+    ModifierNodeElement<FocusChangedNode>() {
     override fun create() = FocusChangedNode(onFocusChanged)
 
     override fun update(node: FocusChangedNode) {
@@ -49,10 +47,10 @@
     }
 }
 
-private class FocusChangedNode(
-    var onFocusChanged: (FocusState) -> Unit
-) : FocusEventModifierNode, Modifier.Node() {
+private class FocusChangedNode(var onFocusChanged: (FocusState) -> Unit) :
+    FocusEventModifierNode, Modifier.Node() {
     private var focusState: FocusState? = null
+
     override fun onFocusEvent(focusState: FocusState) {
         if (this.focusState != focusState) {
             this.focusState = focusState
diff --git a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/focus/FocusDirection.kt b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/focus/FocusDirection.kt
index 42d75cd..4e4b334 100644
--- a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/focus/FocusDirection.kt
+++ b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/focus/FocusDirection.kt
@@ -19,8 +19,7 @@
 import androidx.compose.ui.ExperimentalComposeUiApi
 
 /**
- * The [FocusDirection] is used to specify the direction for a [FocusManager.moveFocus]
- * request.
+ * The [FocusDirection] is used to specify the direction for a [FocusManager.moveFocus] request.
  *
  * @sample androidx.compose.ui.samples.MoveFocusSample
  */
@@ -35,66 +34,64 @@
             Right -> "Right"
             Up -> "Up"
             Down -> "Down"
-            @OptIn(ExperimentalComposeUiApi::class)
-            Enter -> "Enter"
-            @OptIn(ExperimentalComposeUiApi::class)
-            Exit -> "Exit"
+            @OptIn(ExperimentalComposeUiApi::class) Enter -> "Enter"
+            @OptIn(ExperimentalComposeUiApi::class) Exit -> "Exit"
             else -> "Invalid FocusDirection"
         }
     }
 
     companion object {
         /**
-         *  Direction used in [FocusManager.moveFocus] to indicate that you are searching for the
-         *  next focusable item.
+         * Direction used in [FocusManager.moveFocus] to indicate that you are searching for the
+         * next focusable item.
          *
-         *  @sample androidx.compose.ui.samples.MoveFocusSample
+         * @sample androidx.compose.ui.samples.MoveFocusSample
          */
         val Next: FocusDirection = FocusDirection(1)
 
         /**
-         *  Direction used in [FocusManager.moveFocus] to indicate that you are searching for the
-         *  previous focusable item.
+         * Direction used in [FocusManager.moveFocus] to indicate that you are searching for the
+         * previous focusable item.
          *
-         *  @sample androidx.compose.ui.samples.MoveFocusSample
+         * @sample androidx.compose.ui.samples.MoveFocusSample
          */
         val Previous: FocusDirection = FocusDirection(2)
 
         /**
-         *  Direction used in [FocusManager.moveFocus] to indicate that you are searching for the
-         *  next focusable item to the left of the currently focused item.
+         * Direction used in [FocusManager.moveFocus] to indicate that you are searching for the
+         * next focusable item to the left of the currently focused item.
          *
-         *  @sample androidx.compose.ui.samples.MoveFocusSample
+         * @sample androidx.compose.ui.samples.MoveFocusSample
          */
         val Left: FocusDirection = FocusDirection(3)
 
         /**
-         *  Direction used in [FocusManager.moveFocus] to indicate that you are searching for the
-         *  next focusable item to the right of the currently focused item.
+         * Direction used in [FocusManager.moveFocus] to indicate that you are searching for the
+         * next focusable item to the right of the currently focused item.
          *
-         *  @sample androidx.compose.ui.samples.MoveFocusSample
+         * @sample androidx.compose.ui.samples.MoveFocusSample
          */
         val Right: FocusDirection = FocusDirection(4)
 
         /**
-         *  Direction used in [FocusManager.moveFocus] to indicate that you are searching for the
-         *  next focusable item that is above the currently focused item.
+         * Direction used in [FocusManager.moveFocus] to indicate that you are searching for the
+         * next focusable item that is above the currently focused item.
          *
-         *  @sample androidx.compose.ui.samples.MoveFocusSample
+         * @sample androidx.compose.ui.samples.MoveFocusSample
          */
         val Up: FocusDirection = FocusDirection(5)
 
         /**
-         *  Direction used in [FocusManager.moveFocus] to indicate that you are searching for the
-         *  next focusable item that is below the currently focused item.
+         * Direction used in [FocusManager.moveFocus] to indicate that you are searching for the
+         * next focusable item that is below the currently focused item.
          *
-         *  @sample androidx.compose.ui.samples.MoveFocusSample
+         * @sample androidx.compose.ui.samples.MoveFocusSample
          */
         val Down: FocusDirection = FocusDirection(6)
 
         /**
-         *  Direction used in [FocusManager.moveFocus] to indicate that you are searching for the
-         *  next focusable item that is a child of the currently focused item.
+         * Direction used in [FocusManager.moveFocus] to indicate that you are searching for the
+         * next focusable item that is a child of the currently focused item.
          */
         @Suppress("OPT_IN_MARKER_ON_WRONG_TARGET")
         @get:ExperimentalComposeUiApi
@@ -102,8 +99,8 @@
         val Enter: FocusDirection = FocusDirection(7)
 
         /**
-         *  Direction used in [FocusManager.moveFocus] to indicate that you want to move focus to
-         *  the parent of the currently focused item.
+         * Direction used in [FocusManager.moveFocus] to indicate that you want to move focus to the
+         * parent of the currently focused item.
          */
         @Suppress("OPT_IN_MARKER_ON_WRONG_TARGET")
         @get:ExperimentalComposeUiApi
diff --git a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/focus/FocusEventModifier.kt b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/focus/FocusEventModifier.kt
index c5d5e85..424e616 100644
--- a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/focus/FocusEventModifier.kt
+++ b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/focus/FocusEventModifier.kt
@@ -20,28 +20,20 @@
 import androidx.compose.ui.node.ModifierNodeElement
 import androidx.compose.ui.platform.InspectorInfo
 
-/**
- * A [modifier][Modifier.Element] that can be used to observe focus state events.
- */
+/** A [modifier][Modifier.Element] that can be used to observe focus state events. */
 @Deprecated("Use FocusEventModifierNode instead")
 @JvmDefaultWithCompatibility
 interface FocusEventModifier : Modifier.Element {
-    /**
-     * A callback that is called whenever the focus system raises events.
-     */
+    /** A callback that is called whenever the focus system raises events. */
     fun onFocusEvent(focusState: FocusState)
 }
 
-/**
- * Add this modifier to a component to observe focus state events.
- */
-fun Modifier.onFocusEvent(
-    onFocusEvent: (FocusState) -> Unit
-): Modifier = this then FocusEventElement(onFocusEvent)
+/** Add this modifier to a component to observe focus state events. */
+fun Modifier.onFocusEvent(onFocusEvent: (FocusState) -> Unit): Modifier =
+    this then FocusEventElement(onFocusEvent)
 
-private data class FocusEventElement(
-    val onFocusEvent: (FocusState) -> Unit
-) : ModifierNodeElement<FocusEventNode>() {
+private data class FocusEventElement(val onFocusEvent: (FocusState) -> Unit) :
+    ModifierNodeElement<FocusEventNode>() {
     override fun create() = FocusEventNode(onFocusEvent)
 
     override fun update(node: FocusEventNode) {
@@ -54,9 +46,8 @@
     }
 }
 
-private class FocusEventNode(
-    var onFocusEvent: (FocusState) -> Unit
-) : FocusEventModifierNode, Modifier.Node() {
+private class FocusEventNode(var onFocusEvent: (FocusState) -> Unit) :
+    FocusEventModifierNode, Modifier.Node() {
 
     override fun onFocusEvent(focusState: FocusState) {
         this.onFocusEvent.invoke(focusState)
diff --git a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/focus/FocusEventModifierNode.kt b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/focus/FocusEventModifierNode.kt
index 4d51d46..76245d5 100644
--- a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/focus/FocusEventModifierNode.kt
+++ b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/focus/FocusEventModifierNode.kt
@@ -47,7 +47,9 @@
     visitSelfAndChildren(Nodes.FocusTarget) {
         when (val focusState = it.focusState) {
             // If we find a focused child, we use that child's state as the aggregated state.
-            Active, ActiveParent, Captured -> return focusState
+            Active,
+            ActiveParent,
+            Captured -> return focusState
             // We use the Inactive state only if we don't have a focused child.
             // ie. we ignore this child if another child provides aggregated state.
             Inactive -> return@visitSelfAndChildren
diff --git a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/focus/FocusInvalidationManager.kt b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/focus/FocusInvalidationManager.kt
index 43655dd..5961594 100644
--- a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/focus/FocusInvalidationManager.kt
+++ b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/focus/FocusInvalidationManager.kt
@@ -24,9 +24,9 @@
 import androidx.compose.ui.node.visitSelfAndChildren
 
 /**
- * The [FocusInvalidationManager] allows us to schedule focus related nodes for invalidation.
- * These nodes are invalidated after onApplyChanges. It does this by registering an
- * onApplyChangesListener when nodes are scheduled for invalidation.
+ * The [FocusInvalidationManager] allows us to schedule focus related nodes for invalidation. These
+ * nodes are invalidated after onApplyChanges. It does this by registering an onApplyChangesListener
+ * when nodes are scheduled for invalidation.
  */
 internal class FocusInvalidationManager(
     private val onRequestApplyChangesListener: (() -> Unit) -> Unit,
@@ -51,8 +51,8 @@
 
     fun hasPendingInvalidation(): Boolean {
         return focusTargetNodes.isNotEmpty() ||
-                focusPropertiesNodes.isNotEmpty() ||
-                focusEventNodes.isNotEmpty()
+            focusPropertiesNodes.isNotEmpty() ||
+            focusEventNodes.isNotEmpty()
     }
 
     private fun <T> MutableScatterSet<T>.scheduleInvalidation(node: T) {
@@ -134,8 +134,9 @@
 
             val preInvalidationState = it.focusState
             it.invalidateFocus()
-            if (preInvalidationState != it.focusState ||
-                it in focusTargetsWithInvalidatedFocusEvents
+            if (
+                preInvalidationState != it.focusState ||
+                    it in focusTargetsWithInvalidatedFocusEvents
             ) {
                 it.refreshFocusEventNodes()
             }
diff --git a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/focus/FocusManager.kt b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/focus/FocusManager.kt
index 97c3657..a0eff64 100644
--- a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/focus/FocusManager.kt
+++ b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/focus/FocusManager.kt
@@ -24,10 +24,10 @@
      * Call this function to clear focus from the currently focused component, and set the focus to
      * the root focus modifier.
      *
-     *  @param force: Whether we should forcefully clear focus regardless of whether we have
-     *  any components that have Captured focus.
+     * @param force: Whether we should forcefully clear focus regardless of whether we have any
+     *   components that have Captured focus.
      *
-     *  @sample androidx.compose.ui.samples.ClearFocusSample
+     * @sample androidx.compose.ui.samples.ClearFocusSample
      */
     fun clearFocus(force: Boolean = false)
 
diff --git a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/focus/FocusModifier.kt b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/focus/FocusModifier.kt
index 830c957..a8246c0 100644
--- a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/focus/FocusModifier.kt
+++ b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/focus/FocusModifier.kt
@@ -21,21 +21,19 @@
 /**
  * Add this modifier to a component to make it focusable.
  *
- * Focus state is stored within this modifier. The bounds of this modifier reflect the bounds of
- * the focus box.
+ * Focus state is stored within this modifier. The bounds of this modifier reflect the bounds of the
+ * focus box.
  *
  * Note: This is a low level modifier. Before using this consider using
- * [Modifier.focusable()][androidx.compose.foundation.focusable]. It uses a [focusTarget] in
- * its implementation. [Modifier.focusable()][androidx.compose.foundation.focusable] adds semantics
- * that are needed for accessibility.
+ * [Modifier.focusable()][androidx.compose.foundation.focusable]. It uses a [focusTarget] in its
+ * implementation. [Modifier.focusable()][androidx.compose.foundation.focusable] adds semantics that
+ * are needed for accessibility.
  *
  * @sample androidx.compose.ui.samples.FocusableSampleUsingLowerLevelFocusTarget
  */
 fun Modifier.focusTarget(): Modifier = this then FocusTargetNode.FocusTargetElement
 
-/**
- * Add this modifier to a component to make it focusable.
- */
+/** Add this modifier to a component to make it focusable. */
 @Deprecated(
     "Replaced by focusTarget",
     ReplaceWith("focusTarget()", "androidx.compose.ui.focus.focusTarget")
diff --git a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/focus/FocusOrderModifier.kt b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/focus/FocusOrderModifier.kt
index bddecb6..249ce09 100644
--- a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/focus/FocusOrderModifier.kt
+++ b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/focus/FocusOrderModifier.kt
@@ -29,12 +29,11 @@
 interface FocusOrderModifier : Modifier.Element {
 
     /**
-     * Populates the [next][FocusOrder.next] / [left][FocusOrder.left] /
-     * [right][FocusOrder.right] / [up][FocusOrder.up] / [down][FocusOrder.down] items if
-     * you don't want to use the default focus traversal order.
+     * Populates the [next][FocusOrder.next] / [left][FocusOrder.left] / [right][FocusOrder.right] /
+     * [up][FocusOrder.up] / [down][FocusOrder.down] items if you don't want to use the default
+     * focus traversal order.
      */
-    @Suppress("DEPRECATION")
-    fun populateFocusOrder(focusOrder: FocusOrder)
+    @Suppress("DEPRECATION") fun populateFocusOrder(focusOrder: FocusOrder)
 }
 
 /**
@@ -44,8 +43,7 @@
  */
 @Deprecated("Use FocusProperties instead")
 class FocusOrder internal constructor(private val focusProperties: FocusProperties) {
-    @Suppress("unused")
-    constructor() : this(FocusPropertiesImpl())
+    @Suppress("unused") constructor() : this(FocusPropertiesImpl())
 
     /**
      * A custom item to be used when the user requests a focus moves to the "next" item.
@@ -70,9 +68,9 @@
         }
 
     /**
-     *  A custom item to be used when the user moves focus "up".
+     * A custom item to be used when the user moves focus "up".
      *
-     *  @sample androidx.compose.ui.samples.CustomFocusOrderSample
+     * @sample androidx.compose.ui.samples.CustomFocusOrderSample
      */
     var up: FocusRequester
         get() = focusProperties.up
@@ -81,9 +79,9 @@
         }
 
     /**
-     *  A custom item to be used when the user moves focus "down".
+     * A custom item to be used when the user moves focus "down".
      *
-     *  @sample androidx.compose.ui.samples.CustomFocusOrderSample
+     * @sample androidx.compose.ui.samples.CustomFocusOrderSample
      */
     var down: FocusRequester
         get() = focusProperties.down
@@ -126,8 +124,8 @@
         }
 
     /**
-     * A custom item to be used when the user requests a focus moves to the "right" in LTR mode
-     * and "left" in RTL mode.
+     * A custom item to be used when the user requests a focus moves to the "right" in LTR mode and
+     * "left" in RTL mode.
      *
      * @sample androidx.compose.ui.samples.CustomFocusOrderSample
      */
@@ -141,10 +139,10 @@
 /**
  * Use this modifier to specify a custom focus traversal order.
  *
- * @param focusOrderReceiver Specifies [FocusRequester]s that are used when the user wants
- * to move the current focus to the [next][FocusOrder.next] item, or wants to move
- * focus [left][FocusOrder.left], [right][FocusOrder.right], [up][FocusOrder.up] or
- * [down][FocusOrder.down].
+ * @param focusOrderReceiver Specifies [FocusRequester]s that are used when the user wants to move
+ *   the current focus to the [next][FocusOrder.next] item, or wants to move focus
+ *   [left][FocusOrder.left], [right][FocusOrder.right], [up][FocusOrder.up] or
+ *   [down][FocusOrder.down].
  *
  * @sample androidx.compose.ui.samples.CustomFocusOrderSample
  */
@@ -156,8 +154,7 @@
     )
 )
 fun Modifier.focusOrder(
-    @Suppress("DEPRECATION")
-    focusOrderReceiver: FocusOrder.() -> Unit
+    @Suppress("DEPRECATION") focusOrderReceiver: FocusOrder.() -> Unit
 ): Modifier {
     val scope = FocusOrderToProperties(focusOrderReceiver)
     return focusProperties { scope.apply(this) }
@@ -188,19 +185,15 @@
 )
 fun Modifier.focusOrder(
     focusRequester: FocusRequester,
-    @Suppress("DEPRECATION")
-    focusOrderReceiver: FocusOrder.() -> Unit
+    @Suppress("DEPRECATION") focusOrderReceiver: FocusOrder.() -> Unit
 ): Modifier {
     val scope = FocusOrderToProperties(focusOrderReceiver)
-    return this
-        .focusRequester(focusRequester)
-        .focusProperties { scope.apply(this) }
+    return this.focusRequester(focusRequester).focusProperties { scope.apply(this) }
 }
 
 @Suppress("DEPRECATION")
-internal class FocusOrderToProperties(
-    val focusOrderReceiver: FocusOrder.() -> Unit
-) : FocusPropertiesScope {
+internal class FocusOrderToProperties(val focusOrderReceiver: FocusOrder.() -> Unit) :
+    FocusPropertiesScope {
     override fun apply(focusProperties: FocusProperties) {
         focusOrderReceiver(FocusOrder(focusProperties))
     }
diff --git a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/focus/FocusOwner.kt b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/focus/FocusOwner.kt
index d3329ac..4f4d655 100644
--- a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/focus/FocusOwner.kt
+++ b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/focus/FocusOwner.kt
@@ -21,14 +21,12 @@
 import androidx.compose.ui.input.key.KeyEvent
 import androidx.compose.ui.input.rotary.RotaryScrollEvent
 
-/**
- * The focus owner provides some internal APIs that are not exposed by focus manager.
- */
+/** The focus owner provides some internal APIs that are not exposed by focus manager. */
 internal interface FocusOwner : FocusManager {
 
     /**
-     * A [Modifier] that can be added to the [Owners][androidx.compose.ui.node.Owner] modifier
-     * list that contains the modifiers required by the focus system. (Eg, a root focus modifier).
+     * A [Modifier] that can be added to the [Owners][androidx.compose.ui.node.Owner] modifier list
+     * that contains the modifiers required by the focus system. (Eg, a root focus modifier).
      */
     val modifier: Modifier
 
@@ -41,15 +39,13 @@
     val focusTransactionManager: FocusTransactionManager
 
     /**
-     * This function is called to ask the owner to request focus from the framework.
-     * eg. If a composable calls requestFocus and the root view does not have focus, this function
-     * can be used to request focus for the view.
+     * This function is called to ask the owner to request focus from the framework. eg. If a
+     * composable calls requestFocus and the root view does not have focus, this function can be
+     * used to request focus for the view.
      *
      * @param focusDirection If this focus request was triggered by a call to moveFocus or using the
-     * keyboard, provide the owner with the direction of focus change.
-     *
+     *   keyboard, provide the owner with the direction of focus change.
      * @param previouslyFocusedRect The bounds of the currently focused item.
-     *
      * @return true if the owner successfully requested focus from the framework. False otherwise.
      */
     fun requestFocusForOwner(focusDirection: FocusDirection?, previouslyFocusedRect: Rect?): Boolean
@@ -59,13 +55,10 @@
      * parameters.
      *
      * @param focusDirection the direction to search for the focus target.
-     *
      * @param focusedRect the bounds of the currently focused item.
-     *
      * @param onFound This lambda is called with the focus search result.
-     *
      * @return true, if a suitable [FocusTargetNode] was found, false if no [FocusTargetNode] was
-     * found, and null if the focus search was cancelled.
+     *   found, and null if the focus search was cancelled.
      */
     fun focusSearch(
         focusDirection: FocusDirection,
@@ -75,41 +68,36 @@
 
     /**
      * The [Owner][androidx.compose.ui.node.Owner] calls this function when it gains focus. This
-     * informs the [focus manager][FocusOwnerImpl] that the
-     * [Owner][androidx.compose.ui.node.Owner] gained focus, and that it should propagate this
-     * focus to one of the focus modifiers in the component hierarchy.
+     * informs the [focus manager][FocusOwnerImpl] that the [Owner][androidx.compose.ui.node.Owner]
+     * gained focus, and that it should propagate this focus to one of the focus modifiers in the
+     * component hierarchy.
      *
      * @param focusDirection the direction to search for the focus target.
-     *
      * @param previouslyFocusedRect the bounds of the currently focused item.
-     *
      * @return true, if a suitable [FocusTargetNode] was found and it took focus, false if no
-     * [FocusTargetNode] was found or if the focus search was cancelled.
+     *   [FocusTargetNode] was found or if the focus search was cancelled.
      */
     fun takeFocus(focusDirection: FocusDirection, previouslyFocusedRect: Rect?): Boolean
 
     /**
      * The [Owner][androidx.compose.ui.node.Owner] calls this function when it loses focus. This
-     * informs the [focus manager][FocusOwnerImpl] that the
-     * [Owner][androidx.compose.ui.node.Owner] lost focus, and that it should clear focus from
-     * all the focus modifiers in the component hierarchy.
+     * informs the [focus manager][FocusOwnerImpl] that the [Owner][androidx.compose.ui.node.Owner]
+     * lost focus, and that it should clear focus from all the focus modifiers in the component
+     * hierarchy.
      */
     fun releaseFocus()
 
     /**
      * Call this function to set the focus to the root focus modifier.
      *
-     * @param force: Whether we should forcefully clear focus regardless of whether we have
-     * any components that have captured focus.
-     *
-     * @param refreshFocusEvents: Whether we should send an event up the hierarchy to update
-     * the associated onFocusEvent nodes.
-     *
+     * @param force: Whether we should forcefully clear focus regardless of whether we have any
+     *   components that have captured focus.
+     * @param refreshFocusEvents: Whether we should send an event up the hierarchy to update the
+     *   associated onFocusEvent nodes.
      * @param clearOwnerFocus whether we should also clear focus from the owner. This is usually
-     * true, unless focus is being temporarily cleared (eg. to implement focus wrapping).
-     *
+     *   true, unless focus is being temporarily cleared (eg. to implement focus wrapping).
      * @param focusDirection The focus direction of the focus transaction that triggered this clear
-     * focus.
+     *   focus.
      *
      * This could be used to clear focus when a user clicks on empty space outside a focusable
      * component.
@@ -121,9 +109,7 @@
         focusDirection: FocusDirection
     ): Boolean
 
-    /**
-     * Searches for the currently focused item, and returns its coordinates as a rect.
-     */
+    /** Searches for the currently focused item, and returns its coordinates as a rect. */
     fun getFocusRect(): Rect?
 
     /**
@@ -133,41 +119,28 @@
      * invoke onFocusedItem before we call onKeyEvent on all the parents.
      *
      * @param keyEvent the key event to be dispatched
-     *
      * @param onFocusedItem the block that is run after calling onPreviewKeyEvents on all the
-     * parents. Returning true will consume the event and prevent the event from propagating
-     * to the onKeyEvent modifiers on parents. This is used to dispatch key events to embedded
-     * sub-views.
+     *   parents. Returning true will consume the event and prevent the event from propagating to
+     *   the onKeyEvent modifiers on parents. This is used to dispatch key events to embedded
+     *   sub-views.
      */
     fun dispatchKeyEvent(keyEvent: KeyEvent, onFocusedItem: () -> Boolean = { false }): Boolean
 
-    /**
-     * Dispatches an intercepted soft keyboard key event through the compose hierarchy.
-     */
+    /** Dispatches an intercepted soft keyboard key event through the compose hierarchy. */
     fun dispatchInterceptedSoftKeyboardEvent(keyEvent: KeyEvent): Boolean
 
-    /**
-     * Dispatches a rotary scroll event through the compose hierarchy.
-     */
+    /** Dispatches a rotary scroll event through the compose hierarchy. */
     fun dispatchRotaryEvent(event: RotaryScrollEvent): Boolean
 
-    /**
-     * Schedule a FocusTarget node to be invalidated after onApplyChanges.
-     */
+    /** Schedule a FocusTarget node to be invalidated after onApplyChanges. */
     fun scheduleInvalidation(node: FocusTargetNode)
 
-    /**
-     * Schedule a FocusEvent node to be invalidated after onApplyChanges.
-     */
+    /** Schedule a FocusEvent node to be invalidated after onApplyChanges. */
     fun scheduleInvalidation(node: FocusEventModifierNode)
 
-    /**
-     * Schedule a FocusProperties node to be invalidated after onApplyChanges.
-     */
+    /** Schedule a FocusProperties node to be invalidated after onApplyChanges. */
     fun scheduleInvalidation(node: FocusPropertiesModifierNode)
 
-    /**
-     * The focus state of the root focus node.
-     */
+    /** The focus state of the root focus node. */
     val rootState: FocusState
 }
diff --git a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/focus/FocusOwnerImpl.kt b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/focus/FocusOwnerImpl.kt
index 03b9d4d..85474d3 100644
--- a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/focus/FocusOwnerImpl.kt
+++ b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/focus/FocusOwnerImpl.kt
@@ -49,8 +49,8 @@
 import androidx.compose.ui.util.fastForEachReversed
 
 /**
- * The focus manager is used by different [Owner][androidx.compose.ui.node.Owner] implementations
- * to control focus.
+ * The focus manager is used by different [Owner][androidx.compose.ui.node.Owner] implementations to
+ * control focus.
  */
 internal class FocusOwnerImpl(
     onRequestApplyChangesListener: (() -> Unit) -> Unit,
@@ -64,44 +64,47 @@
 
     internal var rootFocusNode = FocusTargetNode()
 
-    private val focusInvalidationManager = FocusInvalidationManager(
-        onRequestApplyChangesListener,
-        ::invalidateOwnerFocusState
-    )
+    private val focusInvalidationManager =
+        FocusInvalidationManager(onRequestApplyChangesListener, ::invalidateOwnerFocusState)
 
     override val focusTransactionManager: FocusTransactionManager = FocusTransactionManager()
 
     /**
-     * A [Modifier] that can be added to the [Owners][androidx.compose.ui.node.Owner] modifier
-     * list that contains the modifiers required by the focus system. (Eg, a root focus modifier).
+     * A [Modifier] that can be added to the [Owners][androidx.compose.ui.node.Owner] modifier list
+     * that contains the modifiers required by the focus system. (Eg, a root focus modifier).
      */
     // TODO(b/168831247): return an empty Modifier when there are no focusable children.
-    override val modifier: Modifier = Modifier
-        // The root focus target is not focusable, and acts like a focus group.
-        //  We could save an allocation here by making FocusTargetNode implement
-        //  FocusPropertiesModifierNode but to do that we would have to allocate
-        //  a focus properties object. This way only the root node has this extra allocation.
-        .focusProperties { canFocus = false }
-        .then(
-            object : ModifierNodeElement<FocusTargetNode>() {
-                override fun create() = rootFocusNode
-                override fun update(node: FocusTargetNode) {}
-                override fun InspectorInfo.inspectableProperties() { name = "RootFocusTarget" }
-                override fun hashCode(): Int = rootFocusNode.hashCode()
-                override fun equals(other: Any?) = other === this
-            }
-        )
+    override val modifier: Modifier =
+        Modifier
+            // The root focus target is not focusable, and acts like a focus group.
+            //  We could save an allocation here by making FocusTargetNode implement
+            //  FocusPropertiesModifierNode but to do that we would have to allocate
+            //  a focus properties object. This way only the root node has this extra allocation.
+            .focusProperties { canFocus = false }
+            .then(
+                object : ModifierNodeElement<FocusTargetNode>() {
+                    override fun create() = rootFocusNode
+
+                    override fun update(node: FocusTargetNode) {}
+
+                    override fun InspectorInfo.inspectableProperties() {
+                        name = "RootFocusTarget"
+                    }
+
+                    override fun hashCode(): Int = rootFocusNode.hashCode()
+
+                    override fun equals(other: Any?) = other === this
+                }
+            )
 
     /**
-     * This function is called to ask the owner to request focus from the framework.
-     * eg. If a composable calls requestFocus and the root view does not have focus, this function
-     * can be used to request focus for the view.
+     * This function is called to ask the owner to request focus from the framework. eg. If a
+     * composable calls requestFocus and the root view does not have focus, this function can be
+     * used to request focus for the view.
      *
      * @param focusDirection If this focus request was triggered by a call to moveFocus or using the
-     * keyboard, provide the owner with the direction of focus change.
-     *
+     *   keyboard, provide the owner with the direction of focus change.
      * @param previouslyFocusedRect The bounds of the currently focused item.
-     *
      * @return true if the owner successfully requested focus from the framework. False otherwise.
      */
     override fun requestFocusForOwner(
@@ -120,16 +123,14 @@
 
     /**
      * The [Owner][androidx.compose.ui.node.Owner] calls this function when it gains focus. This
-     * informs the [focus manager][FocusOwnerImpl] that the
-     * [Owner][androidx.compose.ui.node.Owner] gained focus, and that it should propagate this
-     * focus to one of the focus modifiers in the component hierarchy.
+     * informs the [focus manager][FocusOwnerImpl] that the [Owner][androidx.compose.ui.node.Owner]
+     * gained focus, and that it should propagate this focus to one of the focus modifiers in the
+     * component hierarchy.
      *
      * @param focusDirection the direction to search for the focus target.
-     *
      * @param previouslyFocusedRect the bounds of the currently focused item.
-     *
      * @return true, if a suitable [FocusTargetNode] was found and it took focus, false if no
-     * [FocusTargetNode] was found or if the focus search was cancelled.
+     *   [FocusTargetNode] was found or if the focus search was cancelled.
      */
     override fun takeFocus(focusDirection: FocusDirection, previouslyFocusedRect: Rect?): Boolean {
         return focusSearch(focusDirection, previouslyFocusedRect) {
@@ -139,9 +140,9 @@
 
     /**
      * The [Owner][androidx.compose.ui.node.Owner] calls this function when it loses focus. This
-     * informs the [focus manager][FocusOwnerImpl] that the
-     * [Owner][androidx.compose.ui.node.Owner] lost focus, and that it should clear focus from
-     * all the focus modifiers in the component hierarchy.
+     * informs the [focus manager][FocusOwnerImpl] that the [Owner][androidx.compose.ui.node.Owner]
+     * lost focus, and that it should clear focus from all the focus modifiers in the component
+     * hierarchy.
      */
     override fun releaseFocus() {
         focusTransactionManager.withExistingTransaction {
@@ -152,8 +153,8 @@
     /**
      * Call this function to set the focus to the root focus modifier.
      *
-     * @param force: Whether we should forcefully clear focus regardless of whether we have
-     * any components that have captured focus.
+     * @param force: Whether we should forcefully clear focus regardless of whether we have any
+     *   components that have captured focus.
      *
      * This could be used to clear focus when a user clicks on empty space outside a focusable
      * component.
@@ -173,18 +174,25 @@
         clearOwnerFocus: Boolean,
         focusDirection: FocusDirection
     ): Boolean {
-        val clearedFocusSuccessfully = focusTransactionManager.withNewTransaction(
-            onCancelled = { return@withNewTransaction }
-        ) {
-            if (!force) {
-                // Don't clear focus if an item on the focused path has a custom exit specified.
-                when (rootFocusNode.performCustomClearFocus(focusDirection)) {
-                    Redirected, Cancelled, RedirectCancelled -> return@withNewTransaction false
-                    None -> { /* Do nothing. */ }
+        val clearedFocusSuccessfully =
+            focusTransactionManager.withNewTransaction(
+                onCancelled = {
+                    return@withNewTransaction
                 }
+            ) {
+                if (!force) {
+                    // Don't clear focus if an item on the focused path has a custom exit specified.
+                    when (rootFocusNode.performCustomClearFocus(focusDirection)) {
+                        Redirected,
+                        Cancelled,
+                        RedirectCancelled -> return@withNewTransaction false
+                        None -> {
+                            /* Do nothing. */
+                        }
+                    }
+                }
+                return@withNewTransaction rootFocusNode.clearFocus(force, refreshFocusEvents)
             }
-            return@withNewTransaction rootFocusNode.clearFocus(force, refreshFocusEvents)
-        }
 
         if (clearedFocusSuccessfully && clearOwnerFocus) {
             onClearFocusForOwner.invoke()
@@ -199,10 +207,11 @@
      */
     override fun moveFocus(focusDirection: FocusDirection): Boolean {
         var requestFocusSuccess: Boolean? = false
-        val focusSearchSuccess = focusSearch(focusDirection, onFocusRectInterop()) {
-            requestFocusSuccess = it.requestFocus(focusDirection)
-            requestFocusSuccess ?: false
-        }
+        val focusSearchSuccess =
+            focusSearch(focusDirection, onFocusRectInterop()) {
+                requestFocusSuccess = it.requestFocus(focusDirection)
+                requestFocusSuccess ?: false
+            }
 
         // If focus search was cancelled, or if focus search succeeded but request focus was
         // cancelled, it implies that moveFocus() failed.
@@ -213,12 +222,13 @@
 
         // To wrap focus around, we clear focus and request initial focus.
         if (focusDirection.is1dFocusSearch()) {
-            val clearFocus = clearFocus(
-                force = false,
-                refreshFocusEvents = true,
-                clearOwnerFocus = false,
-                focusDirection = focusDirection
-            )
+            val clearFocus =
+                clearFocus(
+                    force = false,
+                    refreshFocusEvents = true,
+                    clearOwnerFocus = false,
+                    focusDirection = focusDirection
+                )
             return clearFocus && takeFocus(focusDirection, previouslyFocusedRect = null)
         }
 
@@ -233,15 +243,17 @@
         focusedRect: Rect?,
         onFound: (FocusTargetNode) -> Boolean
     ): Boolean? {
-        val source = rootFocusNode.findActiveFocusNode()?.also {
-            // Check if a custom focus traversal order is specified.
-            when (val customDest = it.customFocusSearch(focusDirection, onLayoutDirection())) {
-                @OptIn(ExperimentalComposeUiApi::class)
-                Cancel -> return null
-                Default -> { /* Do Nothing */ }
-                else -> return customDest.findFocusTargetNode(onFound)
+        val source =
+            rootFocusNode.findActiveFocusNode()?.also {
+                // Check if a custom focus traversal order is specified.
+                when (val customDest = it.customFocusSearch(focusDirection, onLayoutDirection())) {
+                    @OptIn(ExperimentalComposeUiApi::class) Cancel -> return null
+                    Default -> {
+                        /* Do Nothing */
+                    }
+                    else -> return customDest.findFocusTargetNode(onFound)
+                }
             }
-        }
 
         return rootFocusNode.focusSearch(focusDirection, onLayoutDirection(), focusedRect) {
             when (it) {
@@ -252,9 +264,7 @@
         }
     }
 
-    /**
-     * Dispatches a key event through the compose hierarchy.
-     */
+    /** Dispatches a key event through the compose hierarchy. */
     override fun dispatchKeyEvent(keyEvent: KeyEvent, onFocusedItem: () -> Boolean): Boolean {
         check(!focusInvalidationManager.hasPendingInvalidation()) {
             "Dispatching key event while focus system is invalidated."
@@ -263,8 +273,9 @@
         if (!validateKeyEvent(keyEvent)) return false
 
         val activeFocusTarget = rootFocusNode.findActiveFocusNode()
-        val focusedKeyInputNode = activeFocusTarget?.lastLocalKeyInputNode()
-            ?: activeFocusTarget?.nearestAncestorIncludingSelf(Nodes.KeyInput)?.node
+        val focusedKeyInputNode =
+            activeFocusTarget?.lastLocalKeyInputNode()
+                ?: activeFocusTarget?.nearestAncestorIncludingSelf(Nodes.KeyInput)?.node
 
         focusedKeyInputNode?.traverseAncestorsIncludingSelf(
             type = Nodes.KeyInput,
@@ -281,8 +292,10 @@
             "Dispatching intercepted soft keyboard event while focus system is invalidated."
         }
 
-        val focusedSoftKeyboardInterceptionNode = rootFocusNode.findActiveFocusNode()
-            ?.nearestAncestorIncludingSelf(Nodes.SoftKeyboardKeyInput)
+        val focusedSoftKeyboardInterceptionNode =
+            rootFocusNode
+                .findActiveFocusNode()
+                ?.nearestAncestorIncludingSelf(Nodes.SoftKeyboardKeyInput)
 
         focusedSoftKeyboardInterceptionNode?.traverseAncestorsIncludingSelf(
             type = Nodes.SoftKeyboardKeyInput,
@@ -293,16 +306,14 @@
         return false
     }
 
-    /**
-     * Dispatches a rotary scroll event through the compose hierarchy.
-     */
+    /** Dispatches a rotary scroll event through the compose hierarchy. */
     override fun dispatchRotaryEvent(event: RotaryScrollEvent): Boolean {
         check(!focusInvalidationManager.hasPendingInvalidation()) {
             "Dispatching rotary event while focus system is invalidated."
         }
 
-        val focusedRotaryInputNode = rootFocusNode.findActiveFocusNode()
-            ?.nearestAncestorIncludingSelf(Nodes.RotaryInput)
+        val focusedRotaryInputNode =
+            rootFocusNode.findActiveFocusNode()?.nearestAncestorIncludingSelf(Nodes.RotaryInput)
 
         focusedRotaryInputNode?.traverseAncestorsIncludingSelf(
             type = Nodes.RotaryInput,
@@ -361,9 +372,7 @@
         return null
     }
 
-    /**
-     * Searches for the currently focused item, and returns its coordinates as a rect.
-     */
+    /** Searches for the currently focused item, and returns its coordinates as a rect. */
     override fun getFocusRect(): Rect? {
         return rootFocusNode.findActiveFocusNode()?.focusRect()
     }
@@ -387,11 +396,11 @@
         when (keyEvent.type) {
             KeyDown -> {
                 // It's probably rare for more than 3 hardware keys to be pressed simultaneously.
-                val keysCurrentlyDown = keysCurrentlyDown ?: MutableLongSet(initialCapacity = 3)
-                    .also { keysCurrentlyDown = it }
+                val keysCurrentlyDown =
+                    keysCurrentlyDown
+                        ?: MutableLongSet(initialCapacity = 3).also { keysCurrentlyDown = it }
                 keysCurrentlyDown += keyCode
             }
-
             KeyUp -> {
                 if (keysCurrentlyDown?.contains(keyCode) != true) {
                     // An UP event for a key that was never DOWN is invalid, ignore it.
@@ -399,7 +408,7 @@
                 }
                 keysCurrentlyDown?.remove(keyCode)
             }
-            // Always process Unknown event types.
+        // Always process Unknown event types.
         }
         return true
     }
@@ -407,10 +416,12 @@
 
 /**
  * focus search in the Android framework wraps around for 1D focus search, but not for 2D focus
- * search. This is a helper function that can be used to determine whether we should wrap around
- * or not.
+ * search. This is a helper function that can be used to determine whether we should wrap around or
+ * not.
  */
-internal fun FocusDirection.is1dFocusSearch(): Boolean = when (this) {
-    Next, Previous -> true
-    else -> false
-}
+internal fun FocusDirection.is1dFocusSearch(): Boolean =
+    when (this) {
+        Next,
+        Previous -> true
+        else -> false
+    }
diff --git a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/focus/FocusProperties.kt b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/focus/FocusProperties.kt
index 9e7a64d..68390f9 100644
--- a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/focus/FocusProperties.kt
+++ b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/focus/FocusProperties.kt
@@ -54,18 +54,18 @@
         set(_) {}
 
     /**
-     *  A custom item to be used when the user moves focus "up".
+     * A custom item to be used when the user moves focus "up".
      *
-     *  @sample androidx.compose.ui.samples.CustomFocusOrderSample
+     * @sample androidx.compose.ui.samples.CustomFocusOrderSample
      */
     var up: FocusRequester
         get() = FocusRequester.Default
         set(_) {}
 
     /**
-     *  A custom item to be used when the user moves focus "down".
+     * A custom item to be used when the user moves focus "down".
      *
-     *  @sample androidx.compose.ui.samples.CustomFocusOrderSample
+     * @sample androidx.compose.ui.samples.CustomFocusOrderSample
      */
     var down: FocusRequester
         get() = FocusRequester.Default
@@ -100,8 +100,8 @@
         set(_) {}
 
     /**
-     * A custom item to be used when the user requests a focus moves to the "right" in LTR mode
-     * and "left" in RTL mode.
+     * A custom item to be used when the user requests a focus moves to the "right" in LTR mode and
+     * "left" in RTL mode.
      *
      * @sample androidx.compose.ui.samples.CustomFocusOrderSample
      */
@@ -111,15 +111,14 @@
 
     /**
      * A custom item to be used when the user requests focus to move focus in
-     * ([FocusDirection.Enter]). An automatic [Enter][FocusDirection.Enter]"
-     * can be triggered when we move focus to a focus group that is not itself focusable. In this
-     * case, users can use the  the focus direction that triggered the move in to determine the
-     * next item to be focused on.
+     * ([FocusDirection.Enter]). An automatic [Enter][FocusDirection.Enter]" can be triggered when
+     * we move focus to a focus group that is not itself focusable. In this case, users can use the
+     * the focus direction that triggered the move in to determine the next item to be focused on.
      *
      * When you set the [enter] property, provide a lambda that takes the FocusDirection that
-     * triggered the enter as an input, and provides a [FocusRequester] as an output. You can
-     * return a custom destination by providing a [FocusRequester] attached to that destination,
-     * a [Cancel][FocusRequester.Cancel] to cancel the focus enter or
+     * triggered the enter as an input, and provides a [FocusRequester] as an output. You can return
+     * a custom destination by providing a [FocusRequester] attached to that destination, a
+     * [Cancel][FocusRequester.Cancel] to cancel the focus enter or
      * [Default][FocusRequester.Default] to use the default focus enter behavior.
      *
      * @sample androidx.compose.ui.samples.CustomFocusEnterSample
@@ -133,16 +132,16 @@
         set(_) {}
 
     /**
-     * A custom item to be used when the user requests focus to move out ([FocusDirection.Exit]).
-     * An automatic [Exit][FocusDirection.Exit] can be triggered when we move focus outside the edge
-     * of a parent. In this case, users can use the  the focus direction that triggered the move out
-     * to determine the next focus destination.
+     * A custom item to be used when the user requests focus to move out ([FocusDirection.Exit]). An
+     * automatic [Exit][FocusDirection.Exit] can be triggered when we move focus outside the edge of
+     * a parent. In this case, users can use the the focus direction that triggered the move out to
+     * determine the next focus destination.
      *
      * When you set the [exit] property, provide a lambda that takes the FocusDirection that
-     * triggered the exit as an input, and provides a [FocusRequester] as an output. You can
-     * return a custom destination by providing a [FocusRequester] attached to that destination,
-     * a [Cancel][FocusRequester.Cancel] to cancel the focus exit or
-     * [Default][FocusRequester.Default] to use the default focus exit behavior.
+     * triggered the exit as an input, and provides a [FocusRequester] as an output. You can return
+     * a custom destination by providing a [FocusRequester] attached to that destination, a
+     * [Cancel][FocusRequester.Cancel] to cancel the focus exit or [Default][FocusRequester.Default]
+     * to use the default focus exit behavior.
      *
      * @sample androidx.compose.ui.samples.CustomFocusExitSample
      */
@@ -172,18 +171,16 @@
 }
 
 /**
- * This modifier allows you to specify properties that are accessible to [focusTarget]s further
- * down the modifier chain or on child layout nodes.
+ * This modifier allows you to specify properties that are accessible to [focusTarget]s further down
+ * the modifier chain or on child layout nodes.
  *
  * @sample androidx.compose.ui.samples.FocusPropertiesSample
  */
-fun Modifier.focusProperties(
-    scope: FocusProperties.() -> Unit
-): Modifier = this then FocusPropertiesElement(scope)
+fun Modifier.focusProperties(scope: FocusProperties.() -> Unit): Modifier =
+    this then FocusPropertiesElement(scope)
 
-private data class FocusPropertiesElement(
-    val scope: FocusPropertiesScope
-) : ModifierNodeElement<FocusPropertiesNode>() {
+private data class FocusPropertiesElement(val scope: FocusPropertiesScope) :
+    ModifierNodeElement<FocusPropertiesNode>() {
     override fun create() = FocusPropertiesNode(scope)
 
     override fun update(node: FocusPropertiesNode) {
diff --git a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/focus/FocusPropertiesModifierNode.kt b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/focus/FocusPropertiesModifierNode.kt
index 0359bb4..44d5519 100644
--- a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/focus/FocusPropertiesModifierNode.kt
+++ b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/focus/FocusPropertiesModifierNode.kt
@@ -25,10 +25,10 @@
  */
 interface FocusPropertiesModifierNode : DelegatableNode {
     /**
-     * A parent can modify the focus properties associated with the nearest
-     * [FocusTargetNode] child node. If a [FocusTargetNode] has multiple parent
-     * [FocusPropertiesModifierNode]s, properties set by a parent higher up in the hierarchy
-     * overwrite properties set by those that are lower in the hierarchy.
+     * A parent can modify the focus properties associated with the nearest [FocusTargetNode] child
+     * node. If a [FocusTargetNode] has multiple parent [FocusPropertiesModifierNode]s, properties
+     * set by a parent higher up in the hierarchy overwrite properties set by those that are lower
+     * in the hierarchy.
      */
     fun applyFocusProperties(focusProperties: FocusProperties)
 }
diff --git a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/focus/FocusRequester.kt b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/focus/FocusRequester.kt
index 7ed63b7..1d3656f 100644
--- a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/focus/FocusRequester.kt
+++ b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/focus/FocusRequester.kt
@@ -24,7 +24,8 @@
 import androidx.compose.ui.node.Nodes
 import androidx.compose.ui.node.visitChildren
 
-private const val FocusRequesterNotInitialized = """
+private const val FocusRequesterNotInitialized =
+    """
    FocusRequester is not initialized. Here are some possible fixes:
 
    1. Remember the FocusRequester: val focusRequester = remember { FocusRequester() }
@@ -33,15 +34,16 @@
    response to some event. Eg Modifier.clickable { focusRequester.requestFocus() }
 """
 
-private const val InvalidFocusRequesterInvocation = """
+private const val InvalidFocusRequesterInvocation =
+    """
     Please check whether the focusRequester is FocusRequester.Cancel or FocusRequester.Default
     before invoking any functions on the focusRequester.
 """
 
 /**
  * The [FocusRequester] is used in conjunction with
- * [Modifier.focusRequester][androidx.compose.ui.focus.focusRequester] to send requests to
- * change focus.
+ * [Modifier.focusRequester][androidx.compose.ui.focus.focusRequester] to send requests to change
+ * focus.
  *
  * @sample androidx.compose.ui.samples.RequestFocusSample
  *
@@ -53,8 +55,8 @@
     internal val focusRequesterNodes: MutableVector<FocusRequesterModifierNode> = mutableVectorOf()
 
     /**
-     * Use this function to request focus. If the system grants focus to a component associated
-     * with this [FocusRequester], its [onFocusChanged] modifiers will receive a [FocusState] object
+     * Use this function to request focus. If the system grants focus to a component associated with
+     * this [FocusRequester], its [onFocusChanged] modifiers will receive a [FocusState] object
      * where [FocusState.isFocused] is true.
      *
      * @sample androidx.compose.ui.samples.RequestFocusSample
@@ -80,15 +82,15 @@
     /**
      * Deny requests to clear focus.
      *
-     * Use this function to send a request to capture focus. If a component captures focus,
-     * it will send a [FocusState] object to its associated [onFocusChanged]
-     * modifiers where [FocusState.isCaptured]() == true.
+     * Use this function to send a request to capture focus. If a component captures focus, it will
+     * send a [FocusState] object to its associated [onFocusChanged] modifiers where
+     * [FocusState.isCaptured]() == true.
      *
      * When a component is in a Captured state, all focus requests from other components are
      * declined.
      *
-     * @return true if the focus was successfully captured by one of the
-     * [focus][focusTarget] modifiers associated with this [FocusRequester]. False otherwise.
+     * @return true if the focus was successfully captured by one of the [focus][focusTarget]
+     *   modifiers associated with this [FocusRequester]. False otherwise.
      *
      * @sample androidx.compose.ui.samples.CaptureFocusSample
      */
@@ -103,16 +105,16 @@
     }
 
     /**
-     * Use this function to send a request to free focus when one of the components associated
-     * with this [FocusRequester] is in a Captured state. If a component frees focus,
-     * it will send a [FocusState] object to its associated [onFocusChanged]
-     * modifiers where [FocusState.isCaptured]() == false.
+     * Use this function to send a request to free focus when one of the components associated with
+     * this [FocusRequester] is in a Captured state. If a component frees focus, it will send a
+     * [FocusState] object to its associated [onFocusChanged] modifiers where
+     * [FocusState.isCaptured]() == false.
      *
      * When a component is in a Captured state, all focus requests from other components are
-     * declined.
-     *.
+     * declined. .
+     *
      * @return true if the captured focus was successfully released. i.e. At the end of this
-     * operation, one of the components associated with this [focusRequester] freed focus.
+     *   operation, one of the components associated with this [focusRequester] freed focus.
      *
      * @sample androidx.compose.ui.samples.CaptureFocusSample
      */
@@ -132,26 +134,24 @@
      * child by making a call to [restoreFocusedChild].
      *
      * @return true if the focus target associated with this [FocusRequester] has a focused child
-     * and we successfully saved a reference to it.
+     *   and we successfully saved a reference to it.
      *
      * @sample androidx.compose.ui.samples.RestoreFocusSample
      */
     @ExperimentalComposeUiApi
     fun saveFocusedChild(): Boolean {
         check(focusRequesterNodes.isNotEmpty()) { FocusRequesterNotInitialized }
-        focusRequesterNodes.forEach {
-            if (it.saveFocusedChild()) return true
-        }
+        focusRequesterNodes.forEach { if (it.saveFocusedChild()) return true }
         return false
     }
 
     /**
      * Use this function to restore focus to one of the children of the node pointed to by this
-     * [FocusRequester]. This restores focus to a previously focused child that was saved
-     * by using [saveFocusedChild].
+     * [FocusRequester]. This restores focus to a previously focused child that was saved by using
+     * [saveFocusedChild].
      *
      * @return true if we successfully restored focus to one of the children of the [focusTarget]
-     * associated with this [FocusRequester]
+     *   associated with this [FocusRequester]
      *
      * @sample androidx.compose.ui.samples.RestoreFocusSample
      */
@@ -159,17 +159,15 @@
     fun restoreFocusedChild(): Boolean {
         check(focusRequesterNodes.isNotEmpty()) { FocusRequesterNotInitialized }
         var success = false
-        focusRequesterNodes.forEach {
-            success = it.restoreFocusedChild() || success
-        }
+        focusRequesterNodes.forEach { success = it.restoreFocusedChild() || success }
         return success
     }
 
     companion object {
         /**
          * Default [focusRequester], which when used in [Modifier.focusProperties][focusProperties]
-         * implies that we want to use the default system focus order, that is based on the
-         * position of the items on the screen.
+         * implies that we want to use the default system focus order, that is based on the position
+         * of the items on the screen.
          */
         val Default = FocusRequester()
 
@@ -192,20 +190,35 @@
          */
         object FocusRequesterFactory {
             operator fun component1() = FocusRequester()
+
             operator fun component2() = FocusRequester()
+
             operator fun component3() = FocusRequester()
+
             operator fun component4() = FocusRequester()
+
             operator fun component5() = FocusRequester()
+
             operator fun component6() = FocusRequester()
+
             operator fun component7() = FocusRequester()
+
             operator fun component8() = FocusRequester()
+
             operator fun component9() = FocusRequester()
+
             operator fun component10() = FocusRequester()
+
             operator fun component11() = FocusRequester()
+
             operator fun component12() = FocusRequester()
+
             operator fun component13() = FocusRequester()
+
             operator fun component14() = FocusRequester()
+
             operator fun component15() = FocusRequester()
+
             operator fun component16() = FocusRequester()
         }
 
@@ -221,11 +234,12 @@
     /**
      * This function searches down the hierarchy and calls [onFound] for all focus nodes associated
      * with this [FocusRequester].
+     *
      * @param onFound the callback that is run when the child is found.
      * @return false if no focus nodes were found or if the FocusRequester is
-     * [FocusRequester.Cancel]. Returns null if the FocusRequester is [FocusRequester.Default].
-     * Otherwise returns a logical or of the result of calling [onFound] for each focus node
-     * associated with this [FocusRequester].
+     *   [FocusRequester.Cancel]. Returns null if the FocusRequester is [FocusRequester.Default].
+     *   Otherwise returns a logical or of the result of calling [onFound] for each focus node
+     *   associated with this [FocusRequester].
      */
     @ExperimentalComposeUiApi
     private inline fun findFocusTarget(onFound: (FocusTargetNode) -> Boolean): Boolean {
diff --git a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/focus/FocusRequesterModifier.kt b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/focus/FocusRequesterModifier.kt
index fd83e71..1fd0a57 100644
--- a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/focus/FocusRequesterModifier.kt
+++ b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/focus/FocusRequesterModifier.kt
@@ -48,9 +48,8 @@
 fun Modifier.focusRequester(focusRequester: FocusRequester): Modifier =
     this then FocusRequesterElement(focusRequester)
 
-private data class FocusRequesterElement(
-    val focusRequester: FocusRequester
-) : ModifierNodeElement<FocusRequesterNode>() {
+private data class FocusRequesterElement(val focusRequester: FocusRequester) :
+    ModifierNodeElement<FocusRequesterNode>() {
     override fun create() = FocusRequesterNode(focusRequester)
 
     override fun update(node: FocusRequesterNode) {
@@ -65,9 +64,8 @@
     }
 }
 
-private class FocusRequesterNode(
-    var focusRequester: FocusRequester
-) : FocusRequesterModifierNode, Modifier.Node() {
+private class FocusRequesterNode(var focusRequester: FocusRequester) :
+    FocusRequesterModifierNode, Modifier.Node() {
     override fun onAttach() {
         super.onAttach()
         focusRequester.focusRequesterNodes += this
diff --git a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/focus/FocusRequesterModifierNode.kt b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/focus/FocusRequesterModifierNode.kt
index 3dd6673..cdf573a 100644
--- a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/focus/FocusRequesterModifierNode.kt
+++ b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/focus/FocusRequesterModifierNode.kt
@@ -24,15 +24,15 @@
 import androidx.compose.ui.node.visitSelfAndChildren
 
 /**
- * Implement this interface to create a modifier node that can be used to request changes in
- * the focus state of a [FocusTargetNode] down the hierarchy.
+ * Implement this interface to create a modifier node that can be used to request changes in the
+ * focus state of a [FocusTargetNode] down the hierarchy.
  */
 interface FocusRequesterModifierNode : DelegatableNode
 
 /**
- * Use this function to request focus. If the system grants focus to a component associated
- * with this [FocusRequester], its [onFocusChanged] modifiers will receive a [FocusState] object
- * where [FocusState.isFocused] is true.
+ * Use this function to request focus. If the system grants focus to a component associated with
+ * this [FocusRequester], its [onFocusChanged] modifiers will receive a [FocusState] object where
+ * [FocusState.isFocused] is true.
  *
  * @sample androidx.compose.ui.samples.RequestFocusSample
  */
@@ -42,9 +42,7 @@
         return if (focusTarget.fetchFocusProperties().canFocus) {
             focusTarget.requestFocus()
         } else {
-            focusTarget.findChildCorrespondingToFocusEnter(Enter) {
-                it.requestFocus()
-            }
+            focusTarget.findChildCorrespondingToFocusEnter(Enter) { it.requestFocus() }
         }
     }
     return false
@@ -53,15 +51,14 @@
 /**
  * Deny requests to clear focus.
  *
- * Use this function to send a request to capture focus. If a component captures focus,
- * it will send a [FocusState] object to its associated [onFocusChanged]
- * modifiers where [FocusState.isCaptured]() == true.
+ * Use this function to send a request to capture focus. If a component captures focus, it will send
+ * a [FocusState] object to its associated [onFocusChanged] modifiers where
+ * [FocusState.isCaptured]() == true.
  *
- * When a component is in a Captured state, all focus requests from other components are
- * declined.
+ * When a component is in a Captured state, all focus requests from other components are declined.
  *
- * @return true if the focus was successfully captured by one of the
- * [focus][focusTarget] modifiers associated with this [FocusRequester]. False otherwise.
+ * @return true if the focus was successfully captured by one of the [focus][focusTarget] modifiers
+ *   associated with this [FocusRequester]. False otherwise.
  *
  * @sample androidx.compose.ui.samples.CaptureFocusSample
  */
@@ -75,33 +72,29 @@
 }
 
 /**
- * Use this function to send a request to free focus when one of the components associated
- * with this [FocusRequester] is in a Captured state. If a component frees focus,
- * it will send a [FocusState] object to its associated [onFocusChanged]
- * modifiers where [FocusState.isCaptured]() == false.
+ * Use this function to send a request to free focus when one of the components associated with this
+ * [FocusRequester] is in a Captured state. If a component frees focus, it will send a [FocusState]
+ * object to its associated [onFocusChanged] modifiers where [FocusState.isCaptured]() == false.
  *
- * When a component is in a Captured state, all focus requests from other components are
- * declined.
- *.
- * @return true if the captured focus was successfully released. i.e. At the end of this
- * operation, one of the components associated with this [focusRequester] freed focus.
+ * When a component is in a Captured state, all focus requests from other components are declined. .
+ *
+ * @return true if the captured focus was successfully released. i.e. At the end of this operation,
+ *   one of the components associated with this [focusRequester] freed focus.
  *
  * @sample androidx.compose.ui.samples.CaptureFocusSample
  */
 fun FocusRequesterModifierNode.freeFocus(): Boolean {
-    visitSelfAndChildren(Nodes.FocusTarget) {
-        if (it.freeFocus()) return true
-    }
+    visitSelfAndChildren(Nodes.FocusTarget) { if (it.freeFocus()) return true }
     return false
 }
 
 /**
- * Use this function to request the focus target to save a reference to the currently focused
- * child in its saved instance state. After calling this, focus can be restored to the saved child
- * by making a call to [restoreFocusedChild].
+ * Use this function to request the focus target to save a reference to the currently focused child
+ * in its saved instance state. After calling this, focus can be restored to the saved child by
+ * making a call to [restoreFocusedChild].
  *
- * @return true if the focus target associated with this node has a focused child
- * and we successfully saved a reference to it.
+ * @return true if the focus target associated with this node has a focused child and we
+ *   successfully saved a reference to it.
  */
 @ExperimentalComposeUiApi
 fun FocusRequesterModifierNode.saveFocusedChild(): Boolean {
@@ -115,24 +108,24 @@
 
 /**
  * Use this function to restore focus to one of the children of the node pointed to by this
- * [FocusRequester]. This restores focus to a previously focused child that was saved
- * by using [saveFocusedChild].
+ * [FocusRequester]. This restores focus to a previously focused child that was saved by using
+ * [saveFocusedChild].
  *
  * @return true if we successfully restored focus to one of the children of the [focusTarget]
- * associated with this node.
+ *   associated with this node.
  */
 @ExperimentalComposeUiApi
 fun FocusRequesterModifierNode.restoreFocusedChild(): Boolean {
-    visitSelfAndChildren(Nodes.FocusTarget) {
-        if (it.restoreFocusedChild()) return true
-    }
+    visitSelfAndChildren(Nodes.FocusTarget) { if (it.restoreFocusedChild()) return true }
     return false
 }
 
 // TODO: Consider making this public, or make findActiveFocusTargetModifierNode public.
 internal fun FocusRequesterModifierNode.pinFocusedChild(): PinnedHandle? {
     visitSelfAndChildren(Nodes.FocusTarget) {
-        it.pinFocusedChild()?.let { return it }
+        it.pinFocusedChild()?.let {
+            return it
+        }
     }
     return null
 }
diff --git a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/focus/FocusRestorer.kt b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/focus/FocusRestorer.kt
index dba12f9..3fd6a4d 100644
--- a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/focus/FocusRestorer.kt
+++ b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/focus/FocusRestorer.kt
@@ -39,8 +39,9 @@
     visitChildren(Nodes.FocusTarget) {
         if (it.focusState.hasFocus) {
             previouslyFocusedChildHash = it.requireLayoutNode().compositeKeyHash
-            currentValueOf(LocalSaveableStateRegistry)
-                ?.registerProvider(PrevFocusedChild) { previouslyFocusedChildHash }
+            currentValueOf(LocalSaveableStateRegistry)?.registerProvider(PrevFocusedChild) {
+                previouslyFocusedChildHash
+            }
             return true
         }
     }
@@ -58,8 +59,8 @@
     if (previouslyFocusedChildHash == 0) return false
     visitChildren(Nodes.FocusTarget) {
         // TODO(b/278765590): Find the root issue why visitChildren returns unattached nodes.
-        if (it.isAttached &&
-            it.requireLayoutNode().compositeKeyHash == previouslyFocusedChildHash
+        if (
+            it.isAttached && it.requireLayoutNode().compositeKeyHash == previouslyFocusedChildHash
         ) {
             return it.restoreFocusedChild() || it.requestFocus()
         }
@@ -73,33 +74,31 @@
 
 // TODO: Move focusRestorer to foundation after saveFocusedChild and restoreFocusedChild are stable.
 /**
- * This modifier can be used to save and restore focus to a focus group.
- * When focus leaves the focus group, it stores a reference to the item that was previously focused.
- * Then when focus re-enters this focus group, it restores focus to the previously focused item.
+ * This modifier can be used to save and restore focus to a focus group. When focus leaves the focus
+ * group, it stores a reference to the item that was previously focused. Then when focus re-enters
+ * this focus group, it restores focus to the previously focused item.
  *
  * @param onRestoreFailed callback provides a lambda that is invoked if focus restoration fails.
- * This lambda can be used to return a custom fallback item by providing a [FocusRequester]
- * attached to that item. This can be used to customize the initially focused item.
+ *   This lambda can be used to return a custom fallback item by providing a [FocusRequester]
+ *   attached to that item. This can be used to customize the initially focused item.
  *
  * @sample androidx.compose.ui.samples.FocusRestorerSample
+ *
  * @sample androidx.compose.ui.samples.FocusRestorerCustomFallbackSample
  */
 @ExperimentalComposeUiApi
-fun Modifier.focusRestorer(
-    onRestoreFailed: (() -> FocusRequester)? = null
-): Modifier = this then FocusRestorerElement(onRestoreFailed)
+fun Modifier.focusRestorer(onRestoreFailed: (() -> FocusRequester)? = null): Modifier =
+    this then FocusRestorerElement(onRestoreFailed)
 
-internal class FocusRestorerNode(
-    var onRestoreFailed: (() -> FocusRequester)?
-) : CompositionLocalConsumerModifierNode,
+internal class FocusRestorerNode(var onRestoreFailed: (() -> FocusRequester)?) :
+    CompositionLocalConsumerModifierNode,
     FocusPropertiesModifierNode,
     FocusRequesterModifierNode,
     Modifier.Node() {
 
     private var pinnedHandle: PinnedHandle? = null
     private val onExit: (FocusDirection) -> FocusRequester = {
-        @OptIn(ExperimentalComposeUiApi::class)
-        saveFocusedChild()
+        @OptIn(ExperimentalComposeUiApi::class) saveFocusedChild()
         pinnedHandle?.release()
         pinnedHandle = pinFocusedChild()
         Default
@@ -128,9 +127,8 @@
     }
 }
 
-private data class FocusRestorerElement(
-    val onRestoreFailed: (() -> FocusRequester)?
-) : ModifierNodeElement<FocusRestorerNode>() {
+private data class FocusRestorerElement(val onRestoreFailed: (() -> FocusRequester)?) :
+    ModifierNodeElement<FocusRestorerNode>() {
     override fun create() = FocusRestorerNode(onRestoreFailed)
 
     override fun update(node: FocusRestorerNode) {
diff --git a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/focus/FocusState.kt b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/focus/FocusState.kt
index b9bc81f..d706476 100644
--- a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/focus/FocusState.kt
+++ b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/focus/FocusState.kt
@@ -17,8 +17,8 @@
 package androidx.compose.ui.focus
 
 /**
- * The focus state of a [FocusTargetNode]. Use [onFocusChanged] or [onFocusEvent] modifiers
- * to access [FocusState].
+ * The focus state of a [FocusTargetNode]. Use [onFocusChanged] or [onFocusEvent] modifiers to
+ * access [FocusState].
  *
  * @sample androidx.compose.ui.samples.FocusableSample
  */
@@ -40,17 +40,17 @@
     val hasFocus: Boolean
 
     /**
-     * Whether focus is captured or not. A focusable component is in a captured state when it
-     * wants to hold onto focus. (Eg. when a text field has an invalid phone number). When we are
-     * in a captured state, clicking on other focusable items does not clear focus from the
-     * currently focused item.
+     * Whether focus is captured or not. A focusable component is in a captured state when it wants
+     * to hold onto focus. (Eg. when a text field has an invalid phone number). When we are in a
+     * captured state, clicking on other focusable items does not clear focus from the currently
+     * focused item.
      *
-     * You can capture focus by calling [focusRequester.captureFocus()][captureFocus] and free
-     * focus by calling [focusRequester.freeFocus()][freeFocus].
+     * You can capture focus by calling [focusRequester.captureFocus()][captureFocus] and free focus
+     * by calling [focusRequester.freeFocus()][freeFocus].
      *
-     *  @return true if focus is captured, false otherwise.
+     * @return true if focus is captured, false otherwise.
      *
-     *  @sample androidx.compose.ui.samples.CaptureFocusSample
+     * @sample androidx.compose.ui.samples.CaptureFocusSample
      */
     val isCaptured: Boolean
 }
@@ -64,32 +64,41 @@
     ActiveParent,
 
     /**
-     * The focusable component is currently active (has focus), and is in a state where
-     * it does not want to give up focus. (Eg. a text field with an invalid phone number).
+     * The focusable component is currently active (has focus), and is in a state where it does not
+     * want to give up focus. (Eg. a text field with an invalid phone number).
      */
     Captured,
 
     /**
-     * The focusable component does not receive any key events. (ie it is not active, nor are any
-     * of its descendants active).
+     * The focusable component does not receive any key events. (ie it is not active, nor are any of
+     * its descendants active).
      */
     Inactive;
 
     override val isFocused: Boolean
-        get() = when (this) {
-            Captured, Active -> true
-            ActiveParent, Inactive -> false
-        }
+        get() =
+            when (this) {
+                Captured,
+                Active -> true
+                ActiveParent,
+                Inactive -> false
+            }
 
     override val hasFocus: Boolean
-        get() = when (this) {
-            Active, ActiveParent, Captured -> true
-            Inactive -> false
-        }
+        get() =
+            when (this) {
+                Active,
+                ActiveParent,
+                Captured -> true
+                Inactive -> false
+            }
 
     override val isCaptured: Boolean
-        get() = when (this) {
-            Captured -> true
-            Active, ActiveParent, Inactive -> false
-        }
+        get() =
+            when (this) {
+                Captured -> true
+                Active,
+                ActiveParent,
+                Inactive -> false
+            }
 }
diff --git a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/focus/FocusTargetModifierNode.kt b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/focus/FocusTargetModifierNode.kt
index f80d68f..ea4f6d3 100644
--- a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/focus/FocusTargetModifierNode.kt
+++ b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/focus/FocusTargetModifierNode.kt
@@ -19,21 +19,18 @@
 import androidx.compose.ui.ExperimentalComposeUiApi
 import androidx.compose.ui.node.DelegatableNode
 
-/**
- * This modifier node can be used to create a modifier that makes a component focusable.
- */
+/** This modifier node can be used to create a modifier that makes a component focusable. */
 sealed interface FocusTargetModifierNode : DelegatableNode {
     /**
      * The [FocusState] associated with this [FocusTargetModifierNode]. When you implement a
      * [FocusTargetModifierNode], instead of implementing [FocusEventModifierNode], you can get the
      * state by accessing this variable.
      */
-    @ExperimentalComposeUiApi
-    val focusState: FocusState
+    @ExperimentalComposeUiApi val focusState: FocusState
 }
 
 /**
- * This modifier node can be used to create a modifier that makes a component focusable.
- * Use a different instance of [FocusTargetModifierNode] for each focusable component.
+ * This modifier node can be used to create a modifier that makes a component focusable. Use a
+ * different instance of [FocusTargetModifierNode] for each focusable component.
  */
 fun FocusTargetModifierNode(): FocusTargetModifierNode = FocusTargetNode()
diff --git a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/focus/FocusTargetNode.kt b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/focus/FocusTargetNode.kt
index a035084..43c0070b 100644
--- a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/focus/FocusTargetNode.kt
+++ b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/focus/FocusTargetNode.kt
@@ -57,13 +57,12 @@
 
     @OptIn(ExperimentalComposeUiApi::class)
     override var focusState: FocusStateImpl
-        get() = focusTransactionManager?.run { uncommittedFocusState }
-            ?: committedFocusState
-            ?: Inactive
+        get() =
+            focusTransactionManager?.run { uncommittedFocusState }
+                ?: committedFocusState
+                ?: Inactive
         set(value) {
-            with(requireTransactionManager()) {
-                uncommittedFocusState = value
-            }
+            with(requireTransactionManager()) { uncommittedFocusState = value }
         }
 
     var previouslyFocusedChildHash: Int = 0
@@ -77,9 +76,7 @@
         if (previousFocusState != focusState) refreshFocusEventNodes()
     }
 
-    /**
-     * Clears focus if this focus target has it.
-     */
+    /** Clears focus if this focus target has it. */
     override fun onDetach() {
         //  Note: this is called after onEndApplyChanges, so we can't schedule any nodes for
         //  invalidation here. If we do, they will be run on the next onEndApplyChanges.
@@ -87,13 +84,16 @@
             // Clear focus from the current FocusTarget.
             // This currently clears focus from the entire hierarchy, but we can change the
             // implementation so that focus is sent to the immediate focus parent.
-            Active, Captured -> {
-                requireOwner().focusOwner.clearFocus(
-                    force = true,
-                    refreshFocusEvents = true,
-                    clearOwnerFocus = false,
-                    focusDirection = @OptIn(ExperimentalComposeUiApi::class) Exit
-                )
+            Active,
+            Captured -> {
+                requireOwner()
+                    .focusOwner
+                    .clearFocus(
+                        force = true,
+                        refreshFocusEvents = true,
+                        clearOwnerFocus = false,
+                        focusDirection = @OptIn(ExperimentalComposeUiApi::class) Exit
+                    )
                 // We don't clear the owner's focus yet, because this could trigger an initial
                 // focus scenario after the focus is cleared. Instead, we schedule invalidation
                 // after onApplyChanges. The FocusInvalidationManager contains the invalidation
@@ -111,8 +111,8 @@
 
     /**
      * Visits parent [FocusPropertiesModifierNode]s and runs
-     * [FocusPropertiesModifierNode.applyFocusProperties] on each parent.
-     * This effectively collects an aggregated focus state.
+     * [FocusPropertiesModifierNode.applyFocusProperties] on each parent. This effectively collects
+     * an aggregated focus state.
      */
     internal fun fetchFocusProperties(): FocusProperties {
         val properties = FocusPropertiesImpl()
@@ -125,11 +125,11 @@
     /**
      * Fetch custom enter destination associated with this [focusTarget].
      *
-     * Custom focus enter properties are specified as a lambda. If the user runs code in this
-     * lambda that triggers a focus search, or some other focus change that causes focus to leave
-     * the sub-hierarchy associated with this node, we could end up in a loop as that operation
-     * will trigger another invocation of the lambda associated with the focus exit property.
-     * This function prevents that re-entrant scenario by ensuring there is only one concurrent
+     * Custom focus enter properties are specified as a lambda. If the user runs code in this lambda
+     * that triggers a focus search, or some other focus change that causes focus to leave the
+     * sub-hierarchy associated with this node, we could end up in a loop as that operation will
+     * trigger another invocation of the lambda associated with the focus exit property. This
+     * function prevents that re-entrant scenario by ensuring there is only one concurrent
      * invocation of this lambda.
      */
     internal inline fun fetchCustomEnter(
@@ -140,9 +140,7 @@
             isProcessingCustomEnter = true
             try {
                 @OptIn(ExperimentalComposeUiApi::class)
-                fetchFocusProperties().enter(focusDirection).also {
-                    if (it !== Default) block(it)
-                }
+                fetchFocusProperties().enter(focusDirection).also { if (it !== Default) block(it) }
             } finally {
                 isProcessingCustomEnter = false
             }
@@ -152,11 +150,11 @@
     /**
      * Fetch custom exit destination associated with this [focusTarget].
      *
-     * Custom focus exit properties are specified as a lambda. If the user runs code in this
-     * lambda that triggers a focus search, or some other focus change that causes focus to leave
-     * the sub-hierarchy associated with this node, we could end up in a loop as that operation
-     * will trigger another invocation of the lambda associated with the focus exit property.
-     * This function prevents that re-entrant scenario by ensuring there is only one concurrent
+     * Custom focus exit properties are specified as a lambda. If the user runs code in this lambda
+     * that triggers a focus search, or some other focus change that causes focus to leave the
+     * sub-hierarchy associated with this node, we could end up in a loop as that operation will
+     * trigger another invocation of the lambda associated with the focus exit property. This
+     * function prevents that re-entrant scenario by ensuring there is only one concurrent
      * invocation of this lambda.
      */
     internal inline fun fetchCustomExit(
@@ -167,9 +165,7 @@
             isProcessingCustomExit = true
             try {
                 @OptIn(ExperimentalComposeUiApi::class)
-                fetchFocusProperties().exit(focusDirection).also {
-                    if (it !== Default) block(it)
-                }
+                fetchFocusProperties().exit(focusDirection).also { if (it !== Default) block(it) }
             } finally {
                 isProcessingCustomExit = false
             }
@@ -178,9 +174,10 @@
 
     internal fun commitFocusState() {
         with(requireTransactionManager()) {
-            committedFocusState = checkPreconditionNotNull(uncommittedFocusState) {
-                "committing a node that was not updated in the current transaction"
-            }
+            committedFocusState =
+                checkPreconditionNotNull(uncommittedFocusState) {
+                    "committing a node that was not updated in the current transaction"
+                }
         }
     }
 
@@ -190,17 +187,16 @@
             // Clear focus from the current FocusTarget.
             // This currently clears focus from the entire hierarchy, but we can change the
             // implementation so that focus is sent to the immediate focus parent.
-            Active, Captured -> {
+            Active,
+            Captured -> {
                 lateinit var focusProperties: FocusProperties
-                observeReads {
-                    focusProperties = fetchFocusProperties()
-                }
+                observeReads { focusProperties = fetchFocusProperties() }
                 if (!focusProperties.canFocus) {
                     requireOwner().focusOwner.clearFocus(force = true)
                 }
             }
-
-            ActiveParent, Inactive -> {}
+            ActiveParent,
+            Inactive -> {}
         }
     }
 
@@ -214,6 +210,7 @@
         }
 
         override fun hashCode() = "focusTarget".hashCode()
+
         override fun equals(other: Any?) = other === this
     }
 
@@ -227,7 +224,9 @@
 
                 return when (it.focusState) {
                     ActiveParent -> true
-                    Active, Captured, Inactive -> false
+                    Active,
+                    Captured,
+                    Inactive -> false
                 }
             }
             return false
@@ -238,7 +237,9 @@
                 if (!it.isInitialized()) return@visitSubtreeIf true
 
                 return when (it.focusState) {
-                    Active, ActiveParent, Captured -> true
+                    Active,
+                    ActiveParent,
+                    Captured -> true
                     Inactive -> false
                 }
             }
diff --git a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/focus/FocusTransactionManager.kt b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/focus/FocusTransactionManager.kt
index ab8d02b..2563f39 100644
--- a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/focus/FocusTransactionManager.kt
+++ b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/focus/FocusTransactionManager.kt
@@ -21,10 +21,9 @@
 import androidx.compose.ui.internal.checkPreconditionNotNull
 
 /**
- * This manager provides a way to ensure that only one focus transaction is running at a time.
- * We use this to prevent re-entrant focus operations. Starting a new transaction automatically
- * cancels the previous transaction and reverts any focus state changes made during that
- * transaction.
+ * This manager provides a way to ensure that only one focus transaction is running at a time. We
+ * use this to prevent re-entrant focus operations. Starting a new transaction automatically cancels
+ * the previous transaction and reverts any focus state changes made during that transaction.
  */
 internal class FocusTransactionManager {
     private val states = mutableScatterMapOf<FocusTargetNode, FocusStateImpl>()
@@ -40,38 +39,41 @@
     inline fun <T> withNewTransaction(
         noinline onCancelled: (() -> Unit)? = null,
         block: () -> T
-    ): T = try {
-        if (ongoingTransaction) cancelTransaction()
-        beginTransaction()
-        onCancelled?.let { cancellationListener += it }
-        block()
-    } finally {
-        commitTransaction()
-    }
+    ): T =
+        try {
+            if (ongoingTransaction) cancelTransaction()
+            beginTransaction()
+            onCancelled?.let { cancellationListener += it }
+            block()
+        } finally {
+            commitTransaction()
+        }
 
     /**
-     * If another transaction is ongoing, this runs the specified [block] within that
-     * transaction, and it commits any changes to focus state at the end of that transaction. If
-     * there is no ongoing transaction, this will start a new transaction. If an [onCancelled]
-     * lambda is specified, it will be called if this transaction is cancelled by a new invocation
-     * to [withNewTransaction].
+     * If another transaction is ongoing, this runs the specified [block] within that transaction,
+     * and it commits any changes to focus state at the end of that transaction. If there is no
+     * ongoing transaction, this will start a new transaction. If an [onCancelled] lambda is
+     * specified, it will be called if this transaction is cancelled by a new invocation to
+     * [withNewTransaction].
      */
     inline fun <T> withExistingTransaction(
         noinline onCancelled: (() -> Unit)? = null,
         block: () -> T
     ): T {
         onCancelled?.let { cancellationListener += it }
-        return if (ongoingTransaction) block() else try {
-            beginTransaction()
-            block()
-        } finally {
-            commitTransaction()
-        }
+        return if (ongoingTransaction) block()
+        else
+            try {
+                beginTransaction()
+                block()
+            } finally {
+                commitTransaction()
+            }
     }
 
     /**
-     * The focus state for the specified [node][FocusTargetNode] if the state was changed during
-     * the current transaction.
+     * The focus state for the specified [node][FocusTargetNode] if the state was changed during the
+     * current transaction.
      */
     var FocusTargetNode.uncommittedFocusState: FocusStateImpl?
         get() = states[this]
@@ -84,9 +86,7 @@
     }
 
     private fun commitTransaction() {
-        states.forEachKey { focusTargetNode ->
-            focusTargetNode.commitFocusState()
-        }
+        states.forEachKey { focusTargetNode -> focusTargetNode.commitFocusState() }
         states.clear()
         ongoingTransaction = false
         cancellationListener.clear()
diff --git a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/focus/FocusTransactions.kt b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/focus/FocusTransactions.kt
index 2538659..afb1016 100644
--- a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/focus/FocusTransactions.kt
+++ b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/focus/FocusTransactions.kt
@@ -35,9 +35,9 @@
 /**
  * Request focus for this node.
  *
- * In Compose, the parent [FocusNode][FocusTargetNode] controls focus for its focusable
- * children. Calling this function will send a focus request to this
- * [FocusNode][FocusTargetNode]'s parent [FocusNode][FocusTargetNode].
+ * In Compose, the parent [FocusNode][FocusTargetNode] controls focus for its focusable children.
+ * Calling this function will send a focus request to this [FocusNode][FocusTargetNode]'s parent
+ * [FocusNode][FocusTargetNode].
  */
 @OptIn(ExperimentalComposeUiApi::class)
 internal fun FocusTargetNode.requestFocus(): Boolean = requestFocus(Enter) ?: false
@@ -49,7 +49,8 @@
         when (performCustomRequestFocus(focusDirection)) {
             None -> performRequestFocus()
             Redirected -> true
-            Cancelled, RedirectCancelled -> null
+            Cancelled,
+            RedirectCancelled -> null
         }
     }
 }
@@ -57,28 +58,30 @@
 /**
  * This function performs the request focus action.
  *
- * Note: Do not call this directly, consider using [requestFocus], which will check if any
- * custom focus [enter][FocusProperties.enter] and [exit][FocusProperties.exit]
+ * Note: Do not call this directly, consider using [requestFocus], which will check if any custom
+ * focus [enter][FocusProperties.enter] and [exit][FocusProperties.exit]
  * [properties][FocusProperties] have been specified.
  */
 internal fun FocusTargetNode.performRequestFocus(): Boolean {
-   val success = when (focusState) {
-        Active, Captured -> true
-        ActiveParent -> clearChildFocus() && grantFocus()
-        Inactive -> {
-            val parent = nearestAncestor(FocusTarget)
-            if (parent != null) {
-                val prevState = parent.focusState
-                val success = parent.requestFocusForChild(this)
-                if (success && prevState !== parent.focusState) {
-                    parent.refreshFocusEventNodes()
+    val success =
+        when (focusState) {
+            Active,
+            Captured -> true
+            ActiveParent -> clearChildFocus() && grantFocus()
+            Inactive -> {
+                val parent = nearestAncestor(FocusTarget)
+                if (parent != null) {
+                    val prevState = parent.focusState
+                    val success = parent.requestFocusForChild(this)
+                    if (success && prevState !== parent.focusState) {
+                        parent.refreshFocusEventNodes()
+                    }
+                    success
+                } else {
+                    requestFocusForOwner() && grantFocus()
                 }
-                success
-            } else {
-                requestFocusForOwner() && grantFocus()
             }
         }
-    }
     if (success) refreshFocusEventNodes()
     return success
 }
@@ -86,90 +89,91 @@
 /**
  * Deny requests to clear focus.
  *
- * This is used when a component wants to hold onto focus (eg. A phone number field with an
- * invalid number.
+ * This is used when a component wants to hold onto focus (eg. A phone number field with an invalid
+ * number.
  *
  * @return true if the focus was successfully captured. False otherwise.
  */
-internal fun FocusTargetNode.captureFocus() = requireTransactionManager().withNewTransaction {
-    when (focusState) {
-        Active -> {
-            focusState = Captured
-            refreshFocusEventNodes()
-            true
+internal fun FocusTargetNode.captureFocus() =
+    requireTransactionManager().withNewTransaction {
+        when (focusState) {
+            Active -> {
+                focusState = Captured
+                refreshFocusEventNodes()
+                true
+            }
+            Captured -> true
+            ActiveParent,
+            Inactive -> false
         }
-        Captured -> true
-        ActiveParent, Inactive -> false
     }
-}
 
 /**
  * When the node is in the [Captured] state, it rejects all requests to clear focus. Calling
- * [freeFocus] puts the node in the [Active] state, where it is no longer preventing other
- * nodes from requesting focus.
+ * [freeFocus] puts the node in the [Active] state, where it is no longer preventing other nodes
+ * from requesting focus.
  *
  * @return true if the captured focus was released. False Otherwise.
  */
-internal fun FocusTargetNode.freeFocus() = requireTransactionManager().withNewTransaction {
-    when (focusState) {
-        Captured -> {
-            focusState = Active
-            refreshFocusEventNodes()
-            true
+internal fun FocusTargetNode.freeFocus() =
+    requireTransactionManager().withNewTransaction {
+        when (focusState) {
+            Captured -> {
+                focusState = Active
+                refreshFocusEventNodes()
+                true
+            }
+            Active -> true
+            ActiveParent,
+            Inactive -> false
         }
-        Active -> true
-        ActiveParent, Inactive -> false
     }
-}
 
 /**
  * This function clears focus from this node.
  *
- * Note: This function should only be called by a parent [focus node][FocusTargetNode] to
- * clear focus from one of its child [focus node][FocusTargetNode]s. It does not change the
- * state of the parent.
+ * Note: This function should only be called by a parent [focus node][FocusTargetNode] to clear
+ * focus from one of its child [focus node][FocusTargetNode]s. It does not change the state of the
+ * parent.
  */
 internal fun FocusTargetNode.clearFocus(
     forced: Boolean = false,
     refreshFocusEvents: Boolean
-): Boolean = when (focusState) {
-    Active -> {
-        focusState = Inactive
-        if (refreshFocusEvents) refreshFocusEventNodes()
-        true
-    }
-    /**
-     * If the node is [ActiveParent], we need to clear focus from the [Active] descendant
-     * first, before clearing focus from this node.
-     */
-    ActiveParent -> if (clearChildFocus(forced, refreshFocusEvents)) {
-        focusState = Inactive
-        if (refreshFocusEvents) refreshFocusEventNodes()
-        true
-    } else {
-        false
-    }
-
-    /**
-     * If the node is [Captured], deny requests to clear focus, except for a forced clear.
-     */
-    Captured -> {
-        if (forced) {
+): Boolean =
+    when (focusState) {
+        Active -> {
             focusState = Inactive
             if (refreshFocusEvents) refreshFocusEventNodes()
+            true
         }
-        forced
+        /**
+         * If the node is [ActiveParent], we need to clear focus from the [Active] descendant first,
+         * before clearing focus from this node.
+         */
+        ActiveParent ->
+            if (clearChildFocus(forced, refreshFocusEvents)) {
+                focusState = Inactive
+                if (refreshFocusEvents) refreshFocusEventNodes()
+                true
+            } else {
+                false
+            }
+
+        /** If the node is [Captured], deny requests to clear focus, except for a forced clear. */
+        Captured -> {
+            if (forced) {
+                focusState = Inactive
+                if (refreshFocusEvents) refreshFocusEventNodes()
+            }
+            forced
+        }
+        /** Nothing to do if the node is not focused. */
+        Inactive -> true
     }
-    /**
-     * Nothing to do if the node is not focused.
-     */
-    Inactive -> true
-}
 
 /**
- * This function grants focus to this node.
- * Note: This is a private function that just changes the state of this node and does not affect any
- * other nodes in the hierarchy.
+ * This function grants focus to this node. Note: This is a private function that just changes the
+ * state of this node and does not affect any other nodes in the hierarchy.
  */
 private fun FocusTargetNode.grantFocus(): Boolean {
     // When we grant focus to this node, we need to observe changes to the canFocus property.
@@ -177,8 +181,12 @@
     observeReads { fetchFocusProperties() }
     // No Focused Children, or we don't want to propagate focus to children.
     when (focusState) {
-        Inactive, ActiveParent -> focusState = Active
-        Active, Captured -> { /* Already focused. */ }
+        Inactive,
+        ActiveParent -> focusState = Active
+        Active,
+        Captured -> {
+            /* Already focused. */
+        }
     }
     return true
 }
@@ -190,8 +198,7 @@
 ): Boolean = activeChild?.clearFocus(forced, refreshFocusEvents) ?: true
 
 /**
- * Focusable children of this [focus node][FocusTargetNode] can use this function to request
- * focus.
+ * Focusable children of this [focus node][FocusTargetNode] can use this function to request focus.
  *
  * @param childNode: The node that is requesting focus.
  * @return true if focus was granted, false otherwise.
@@ -205,9 +212,7 @@
 
     return when (focusState) {
         // If this node is [Active], it can give focus to the requesting child.
-        Active -> childNode.grantFocus().also { success ->
-            if (success) focusState = ActiveParent
-        }
+        Active -> childNode.grantFocus().also { success -> if (success) focusState = ActiveParent }
         // If this node is [ActiveParent] ie, one of the parent's descendants is [Active],
         // remove focus from the currently focused child and grant it to the requesting child.
         ActiveParent -> {
@@ -255,15 +260,20 @@
     return requireNotNull(activeChild) { "ActiveParent with no focused child" }
 }
 
-internal enum class CustomDestinationResult { None, Cancelled, Redirected, RedirectCancelled }
+internal enum class CustomDestinationResult {
+    None,
+    Cancelled,
+    Redirected,
+    RedirectCancelled
+}
 
 internal fun FocusTargetNode.performCustomRequestFocus(
     focusDirection: FocusDirection
 ): CustomDestinationResult {
     when (focusState) {
-        Active, Captured -> return None
-        ActiveParent ->
-            return requireActiveChild().performCustomClearFocus(focusDirection)
+        Active,
+        Captured -> return None
+        ActiveParent -> return requireActiveChild().performCustomClearFocus(focusDirection)
         Inactive -> {
             val focusParent = nearestAncestor(FocusTarget) ?: return None
             return when (focusParent.focusState) {
@@ -280,13 +290,15 @@
 
 internal fun FocusTargetNode.performCustomClearFocus(
     focusDirection: FocusDirection
-): CustomDestinationResult = when (focusState) {
-    Active, Inactive -> None
-    Captured -> Cancelled
-    ActiveParent ->
-        requireActiveChild().performCustomClearFocus(focusDirection).takeUnless { it == None }
-            ?: performCustomExit(focusDirection)
-}
+): CustomDestinationResult =
+    when (focusState) {
+        Active,
+        Inactive -> None
+        Captured -> Cancelled
+        ActiveParent ->
+            requireActiveChild().performCustomClearFocus(focusDirection).takeUnless { it == None }
+                ?: performCustomExit(focusDirection)
+    }
 
 @OptIn(ExperimentalComposeUiApi::class)
 private fun FocusTargetNode.performCustomEnter(
diff --git a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/focus/FocusTraversal.kt b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/focus/FocusTraversal.kt
index 7660e54..eca06ec 100644
--- a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/focus/FocusTraversal.kt
+++ b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/focus/FocusTraversal.kt
@@ -45,7 +45,7 @@
  * children.
  *
  * @param focusDirection the focus direction passed to [FocusManager.moveFocus] that triggered this
- * focus search.
+ *   focus search.
  * @param layoutDirection the current system [LayoutDirection].
  */
 @OptIn(ExperimentalComposeUiApi::class)
@@ -59,28 +59,26 @@
         Previous -> focusProperties.previous
         Up -> focusProperties.up
         Down -> focusProperties.down
-        Left -> when (layoutDirection) {
-            Ltr -> focusProperties.start
-            Rtl -> focusProperties.end
-        }.takeUnless { it === Default } ?: focusProperties.left
-        Right -> when (layoutDirection) {
-            Ltr -> focusProperties.end
-            Rtl -> focusProperties.start
-        }.takeUnless { it === Default } ?: focusProperties.right
+        Left ->
+            when (layoutDirection) {
+                Ltr -> focusProperties.start
+                Rtl -> focusProperties.end
+            }.takeUnless { it === Default } ?: focusProperties.left
+        Right ->
+            when (layoutDirection) {
+                Ltr -> focusProperties.end
+                Rtl -> focusProperties.start
+            }.takeUnless { it === Default } ?: focusProperties.right
         // TODO(b/183746982): add focus order API for "In" and "Out".
         //  Developers can to specify a custom "In" to specify which child should be visited when
         //  the user presses dPad center. (They can also redirect the "In" to some other item).
         //  Developers can specify a custom "Out" to specify which composable should take focus
         //  when the user presses the back button.
-        @OptIn(ExperimentalComposeUiApi::class)
-        Enter -> {
-            @OptIn(ExperimentalComposeUiApi::class)
-            focusProperties.enter(focusDirection)
+        @OptIn(ExperimentalComposeUiApi::class) Enter -> {
+            @OptIn(ExperimentalComposeUiApi::class) focusProperties.enter(focusDirection)
         }
-        @OptIn(ExperimentalComposeUiApi::class)
-        Exit -> {
-            @OptIn(ExperimentalComposeUiApi::class)
-            focusProperties.exit(focusDirection)
+        @OptIn(ExperimentalComposeUiApi::class) Exit -> {
+            @OptIn(ExperimentalComposeUiApi::class) focusProperties.exit(focusDirection)
         }
         else -> error("invalid FocusDirection")
     }
@@ -94,7 +92,7 @@
  * @param previouslyFocusedRect The bounds of the previously focused item.
  * @param onFound This lambda is invoked if focus search finds the next focus node.
  * @return if no focus node is found, we return false. If we receive a cancel, we return null
- * otherwise we return the result of [onFound].
+ *   otherwise we return the result of [onFound].
  */
 @OptIn(ExperimentalComposeUiApi::class)
 internal fun FocusTargetNode.focusSearch(
@@ -104,38 +102,41 @@
     onFound: (FocusTargetNode) -> Boolean
 ): Boolean? {
     return when (focusDirection) {
-        Next, Previous -> oneDimensionalFocusSearch(focusDirection, onFound)
-        Left, Right, Up, Down ->
-            twoDimensionalFocusSearch(focusDirection, previouslyFocusedRect, onFound)
-        @OptIn(ExperimentalComposeUiApi::class)
-        Enter -> {
+        Next,
+        Previous -> oneDimensionalFocusSearch(focusDirection, onFound)
+        Left,
+        Right,
+        Up,
+        Down -> twoDimensionalFocusSearch(focusDirection, previouslyFocusedRect, onFound)
+        @OptIn(ExperimentalComposeUiApi::class) Enter -> {
             // we search among the children of the active item.
-            val direction = when (layoutDirection) { Rtl -> Left; Ltr -> Right }
+            val direction =
+                when (layoutDirection) {
+                    Rtl -> Left
+                    Ltr -> Right
+                }
             findActiveFocusNode()
                 ?.twoDimensionalFocusSearch(direction, previouslyFocusedRect, onFound)
         }
-        @OptIn(ExperimentalComposeUiApi::class)
-        Exit -> findActiveFocusNode()?.findNonDeactivatedParent().let {
-            if (it == null || it == this) false else onFound.invoke(it)
-        }
+        @OptIn(ExperimentalComposeUiApi::class) Exit ->
+            findActiveFocusNode()?.findNonDeactivatedParent().let {
+                if (it == null || it == this) false else onFound.invoke(it)
+            }
         else -> error("Focus search invoked with invalid FocusDirection $focusDirection")
     }
 }
 
 /**
- * Returns the bounding box of the focus layout area in the root or [Rect.Zero] if the
- * FocusModifier has not had a layout.
+ * Returns the bounding box of the focus layout area in the root or [Rect.Zero] if the FocusModifier
+ * has not had a layout.
  */
-internal fun FocusTargetNode.focusRect(): Rect = coordinator?.let {
-    it.findRootCoordinates().localBoundingBoxOf(it, clipBounds = false)
-} ?: Rect.Zero
+internal fun FocusTargetNode.focusRect(): Rect =
+    coordinator?.let { it.findRootCoordinates().localBoundingBoxOf(it, clipBounds = false) }
+        ?: Rect.Zero
 
-/**
- * Whether this node should be considered when searching for the next item during a traversal.
- */
+/** Whether this node should be considered when searching for the next item during a traversal. */
 internal val FocusTargetNode.isEligibleForFocusSearch: Boolean
-    get() = coordinator?.layoutNode?.isPlaced == true &&
-        coordinator?.layoutNode?.isAttached == true
+    get() = coordinator?.layoutNode?.isPlaced == true && coordinator?.layoutNode?.isAttached == true
 
 internal val FocusTargetNode.activeChild: FocusTargetNode?
     get() {
@@ -143,7 +144,9 @@
         visitChildren(Nodes.FocusTarget) {
             if (!it.node.isAttached) return@visitChildren
             when (it.focusState) {
-                Active, ActiveParent, Captured -> return it
+                Active,
+                ActiveParent,
+                Captured -> return it
                 Inactive -> return@visitChildren
             }
         }
@@ -152,10 +155,13 @@
 
 internal fun FocusTargetNode.findActiveFocusNode(): FocusTargetNode? {
     when (focusState) {
-        Active, Captured -> return this
+        Active,
+        Captured -> return this
         ActiveParent -> {
             visitChildren(Nodes.FocusTarget) { node ->
-                node.findActiveFocusNode()?.let { return it }
+                node.findActiveFocusNode()?.let {
+                    return it
+                }
             }
             return null
         }
@@ -165,8 +171,6 @@
 
 @Suppress("ModifierFactoryExtensionFunction", "ModifierFactoryReturnType")
 private fun FocusTargetNode.findNonDeactivatedParent(): FocusTargetNode? {
-    visitAncestors(Nodes.FocusTarget) {
-        if (it.fetchFocusProperties().canFocus) return it
-    }
+    visitAncestors(Nodes.FocusTarget) { if (it.fetchFocusProperties().canFocus) return it }
     return null
 }
diff --git a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/focus/OneDimensionalFocusSearch.kt b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/focus/OneDimensionalFocusSearch.kt
index ca78216..5517b88 100644
--- a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/focus/OneDimensionalFocusSearch.kt
+++ b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/focus/OneDimensionalFocusSearch.kt
@@ -40,59 +40,64 @@
 internal fun FocusTargetNode.oneDimensionalFocusSearch(
     direction: FocusDirection,
     onFound: (FocusTargetNode) -> Boolean
-): Boolean = when (direction) {
-    Next -> forwardFocusSearch(onFound)
-    Previous -> backwardFocusSearch(onFound)
-    else -> error(InvalidFocusDirection)
-}
-
-private fun FocusTargetNode.forwardFocusSearch(
-    onFound: (FocusTargetNode) -> Boolean
-): Boolean = when (focusState) {
-    ActiveParent -> {
-        val focusedChild = activeChild ?: error(NoActiveChild)
-        focusedChild.forwardFocusSearch(onFound) ||
-            generateAndSearchChildren(focusedChild, Next, onFound)
+): Boolean =
+    when (direction) {
+        Next -> forwardFocusSearch(onFound)
+        Previous -> backwardFocusSearch(onFound)
+        else -> error(InvalidFocusDirection)
     }
-    Active, Captured -> pickChildForForwardSearch(onFound)
-    Inactive -> if (fetchFocusProperties().canFocus) {
-        onFound.invoke(this)
-    } else {
-        pickChildForForwardSearch(onFound)
-    }
-}
 
-private fun FocusTargetNode.backwardFocusSearch(
-    onFound: (FocusTargetNode) -> Boolean
-): Boolean = when (focusState) {
-    ActiveParent -> {
-        val focusedChild = activeChild ?: error(NoActiveChild)
-
-        // Unlike forwardFocusSearch, backwardFocusSearch visits the children before the parent.
-        when (focusedChild.focusState) {
-            ActiveParent -> focusedChild.backwardFocusSearch(onFound) ||
-                generateAndSearchChildren(focusedChild, Previous, onFound) ||
-                (focusedChild.fetchFocusProperties().canFocus && onFound.invoke(focusedChild))
-
-            // Since this item "is focused", it means we already visited all its children.
-            // So just search among its siblings.
-            Active, Captured -> generateAndSearchChildren(focusedChild, Previous, onFound)
-
-            Inactive -> error(NoActiveChild)
+private fun FocusTargetNode.forwardFocusSearch(onFound: (FocusTargetNode) -> Boolean): Boolean =
+    when (focusState) {
+        ActiveParent -> {
+            val focusedChild = activeChild ?: error(NoActiveChild)
+            focusedChild.forwardFocusSearch(onFound) ||
+                generateAndSearchChildren(focusedChild, Next, onFound)
         }
+        Active,
+        Captured -> pickChildForForwardSearch(onFound)
+        Inactive ->
+            if (fetchFocusProperties().canFocus) {
+                onFound.invoke(this)
+            } else {
+                pickChildForForwardSearch(onFound)
+            }
     }
-    // BackwardFocusSearch is invoked at the root, and so it searches among siblings of the
-    // ActiveParent for a child that is focused. If we encounter an active node (instead of an
-    // ActiveParent) or a deactivated node (instead of a deactivated parent), it indicates
-    // that the hierarchy does not have focus. ie. this is the initial focus state.
-    // So we pick one of the children as the result.
-    Active, Captured -> pickChildForBackwardSearch(onFound)
 
-    // If we encounter an inactive node, we attempt to pick one of its children before picking
-    // this node (backward search visits the children before the parent).
-    Inactive -> pickChildForBackwardSearch(onFound) ||
-        if (fetchFocusProperties().canFocus) onFound.invoke(this) else false
-}
+private fun FocusTargetNode.backwardFocusSearch(onFound: (FocusTargetNode) -> Boolean): Boolean =
+    when (focusState) {
+        ActiveParent -> {
+            val focusedChild = activeChild ?: error(NoActiveChild)
+
+            // Unlike forwardFocusSearch, backwardFocusSearch visits the children before the parent.
+            when (focusedChild.focusState) {
+                ActiveParent ->
+                    focusedChild.backwardFocusSearch(onFound) ||
+                        generateAndSearchChildren(focusedChild, Previous, onFound) ||
+                        (focusedChild.fetchFocusProperties().canFocus &&
+                            onFound.invoke(focusedChild))
+
+                // Since this item "is focused", it means we already visited all its children.
+                // So just search among its siblings.
+                Active,
+                Captured -> generateAndSearchChildren(focusedChild, Previous, onFound)
+                Inactive -> error(NoActiveChild)
+            }
+        }
+        // BackwardFocusSearch is invoked at the root, and so it searches among siblings of the
+        // ActiveParent for a child that is focused. If we encounter an active node (instead of an
+        // ActiveParent) or a deactivated node (instead of a deactivated parent), it indicates
+        // that the hierarchy does not have focus. ie. this is the initial focus state.
+        // So we pick one of the children as the result.
+        Active,
+        Captured -> pickChildForBackwardSearch(onFound)
+
+        // If we encounter an inactive node, we attempt to pick one of its children before picking
+        // this node (backward search visits the children before the parent).
+        Inactive ->
+            pickChildForBackwardSearch(onFound) ||
+                if (fetchFocusProperties().canFocus) onFound.invoke(this) else false
+    }
 
 // Search among your children for the next child.
 // If the next child is not found, generate more children by requesting a beyondBoundsLayout.
@@ -125,17 +130,19 @@
     check(focusState == ActiveParent) {
         "This function should only be used within a parent that has focus."
     }
-    val children = MutableVector<FocusTargetNode>().apply {
-        visitChildren(Nodes.FocusTarget) { add(it) }
-    }
+    val children =
+        MutableVector<FocusTargetNode>().apply { visitChildren(Nodes.FocusTarget) { add(it) } }
     children.sortWith(FocusableChildrenComparator)
     when (direction) {
-        Next -> children.forEachItemAfter(focusedItem) { child ->
-            if (child.isEligibleForFocusSearch && child.forwardFocusSearch(onFound)) return true
-        }
-        Previous -> children.forEachItemBefore(focusedItem) { child ->
-            if (child.isEligibleForFocusSearch && child.backwardFocusSearch(onFound)) return true
-        }
+        Next ->
+            children.forEachItemAfter(focusedItem) { child ->
+                if (child.isEligibleForFocusSearch && child.forwardFocusSearch(onFound)) return true
+            }
+        Previous ->
+            children.forEachItemBefore(focusedItem) { child ->
+                if (child.isEligibleForFocusSearch && child.backwardFocusSearch(onFound))
+                    return true
+            }
         else -> error(InvalidFocusDirection)
     }
 
@@ -151,9 +158,8 @@
 private fun FocusTargetNode.pickChildForForwardSearch(
     onFound: (FocusTargetNode) -> Boolean
 ): Boolean {
-    val children = MutableVector<FocusTargetNode>().apply {
-        visitChildren(Nodes.FocusTarget) { add(it) }
-    }
+    val children =
+        MutableVector<FocusTargetNode>().apply { visitChildren(Nodes.FocusTarget) { add(it) } }
     children.sortWith(FocusableChildrenComparator)
     return children.any { it.isEligibleForFocusSearch && it.forwardFocusSearch(onFound) }
 }
@@ -161,9 +167,8 @@
 private fun FocusTargetNode.pickChildForBackwardSearch(
     onFound: (FocusTargetNode) -> Boolean
 ): Boolean {
-    val children = MutableVector<FocusTargetNode>().apply {
-        visitChildren(Nodes.FocusTarget) { add(it) }
-    }
+    val children =
+        MutableVector<FocusTargetNode>().apply { visitChildren(Nodes.FocusTarget) { add(it) } }
     children.sortWith(FocusableChildrenComparator)
     children.forEachReversed {
         if (it.isEligibleForFocusSearch && it.backwardFocusSearch(onFound)) {
@@ -208,9 +213,9 @@
 /**
  * We use this comparator to sort the focus modifiers in place order.
  *
- * We want to visit the nodes in placement order instead of composition order.
- * This is because components like LazyList reuse nodes without re-composing them, but it always
- * re-places nodes that are reused.
+ * We want to visit the nodes in placement order instead of composition order. This is because
+ * components like LazyList reuse nodes without re-composing them, but it always re-places nodes
+ * that are reused.
  *
  * Instead of sorting the items, we could just look for the next largest place order index in linear
  * time. However if the next item is deactivated, not eligible for focus search or none of its
@@ -219,10 +224,7 @@
  * the items makes the next focus search more efficient.
  */
 private object FocusableChildrenComparator : Comparator<FocusTargetNode> {
-    override fun compare(
-        focusTarget1: FocusTargetNode?,
-        focusTarget2: FocusTargetNode?
-    ): Int {
+    override fun compare(focusTarget1: FocusTargetNode?, focusTarget2: FocusTargetNode?): Int {
         requireNotNull(focusTarget1) { "compare requires non-null focus targets" }
         requireNotNull(focusTarget2) { "compare requires non-null focus targets" }
 
diff --git a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/focus/TwoDimensionalFocusSearch.kt b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/focus/TwoDimensionalFocusSearch.kt
index 257dcf8..664167d 100644
--- a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/focus/TwoDimensionalFocusSearch.kt
+++ b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/focus/TwoDimensionalFocusSearch.kt
@@ -39,15 +39,15 @@
 private const val NoActiveChild = "ActiveParent must have a focusedChild"
 
 /**
- *  Perform a search among the immediate children of this [node][FocusTargetNode] in the
- *  specified [direction][FocusDirection] and return the node that is to be focused next. If one
- *  of the children is currently focused, we start from that point and search in the specified
- *  [direction][FocusDirection]. If none of the children are currently focused, we pick the
- *  top-left or bottom right based on the specified [direction][FocusDirection].
+ * Perform a search among the immediate children of this [node][FocusTargetNode] in the specified
+ * [direction][FocusDirection] and return the node that is to be focused next. If one of the
+ * children is currently focused, we start from that point and search in the specified
+ * [direction][FocusDirection]. If none of the children are currently focused, we pick the top-left
+ * or bottom right based on the specified [direction][FocusDirection].
  *
- *  @return The value of [onFound] if a [focusTarget] was found, false if no [focusTarget] was
- *  found, and null if focus search was cancelled using [FocusRequester.Cancel] or if a custom
- *  focus search destination didn't point to any [focusTarget].
+ * @return The value of [onFound] if a [focusTarget] was found, false if no [focusTarget] was found,
+ *   and null if focus search was cancelled using [FocusRequester.Cancel] or if a custom focus
+ *   search destination didn't point to any [focusTarget].
  */
 internal fun FocusTargetNode.twoDimensionalFocusSearch(
     direction: FocusDirection,
@@ -55,13 +55,14 @@
     onFound: (FocusTargetNode) -> Boolean
 ): Boolean? {
     when (focusState) {
-        Inactive -> return if (fetchFocusProperties().canFocus) {
-            onFound.invoke(this)
-        } else if (previouslyFocusedRect == null) {
-            findChildCorrespondingToFocusEnter(direction, onFound)
-        } else {
-            searchChildren(previouslyFocusedRect, direction, onFound)
-        }
+        Inactive ->
+            return if (fetchFocusProperties().canFocus) {
+                onFound.invoke(this)
+            } else if (previouslyFocusedRect == null) {
+                findChildCorrespondingToFocusEnter(direction, onFound)
+            } else {
+                searchChildren(previouslyFocusedRect, direction, onFound)
+            }
         ActiveParent -> {
             val focusedChild = activeChild ?: error(NoActiveChild)
             // For 2D focus search we only search among siblings. You have to use DPad Center or
@@ -70,11 +71,14 @@
             // children and search among the siblings of the focused item by calling
             // "searchChildren" on this node.
             when (focusedChild.focusState) {
-
                 ActiveParent -> {
                     // If the focusedChild is an intermediate parent, we search among its children.
-                    val found = focusedChild
-                        .twoDimensionalFocusSearch(direction, previouslyFocusedRect, onFound)
+                    val found =
+                        focusedChild.twoDimensionalFocusSearch(
+                            direction,
+                            previouslyFocusedRect,
+                            onFound
+                        )
                     if (found != false) return found
 
                     // We search among the siblings of the parent.
@@ -85,15 +89,18 @@
                     )
                 }
                 // Search for the next eligible sibling.
-                Active, Captured -> return generateAndSearchChildren(
-                    previouslyFocusedRect ?: focusedChild.focusRect(),
-                    direction,
-                    onFound
-                )
+                Active,
+                Captured ->
+                    return generateAndSearchChildren(
+                        previouslyFocusedRect ?: focusedChild.focusRect(),
+                        direction,
+                        onFound
+                    )
                 Inactive -> error(NoActiveChild)
             }
         }
-        Active, Captured -> {
+        Active,
+        Captured -> {
             // The 2-D focus search starts from the root. If we reached here, it means that there
             // was no intermediate node that was ActiveParent. This is an initial focus scenario.
             // We need to search among this node's children to find the best focus candidate.
@@ -103,9 +110,10 @@
 }
 
 /**
- * Search through the children and find a child that corresponds to a moveFocus(Enter).
- * An enter can be triggered explicitly by using the DPadCenter or can be triggered
- * implicitly when we encounter a focus group during focus search.
+ * Search through the children and find a child that corresponds to a moveFocus(Enter). An enter can
+ * be triggered explicitly by using the DPadCenter or can be triggered implicitly when we encounter
+ * a focus group during focus search.
+ *
  * @param direction The [direction][FocusDirection] that triggered Focus Enter.
  * @param onFound the callback that is run when the child is found.
  * @return true if we find a suitable child, false otherwise.
@@ -126,20 +134,24 @@
     // For the purpose of choosing an appropriate child, we convert moveFocus(Enter)
     // to Left or Right based on LayoutDirection. If this was an implicit enter, we use the
     // direction that triggered the implicit enter.
-    val requestedDirection = when (direction) {
-        // TODO(b/244528858) choose different items for moveFocus(Enter) based on LayoutDirection.
-        @OptIn(ExperimentalComposeUiApi::class)
-        Enter -> Right
-        else -> direction
-    }
+    val requestedDirection =
+        when (direction) {
+            // TODO(b/244528858) choose different items for moveFocus(Enter) based on
+            // LayoutDirection.
+            @OptIn(ExperimentalComposeUiApi::class) Enter -> Right
+            else -> direction
+        }
 
     // To start the search, we pick one of the four corners of this node as the initially
     // focused rectangle.
-    val initialFocusRect = when (requestedDirection) {
-        Right, Down -> focusRect().topLeft()
-        Left, Up -> focusRect().bottomRight()
-        else -> error(InvalidFocusDirection)
-    }
+    val initialFocusRect =
+        when (requestedDirection) {
+            Right,
+            Down -> focusRect().topLeft()
+            Left,
+            Up -> focusRect().bottomRight()
+            else -> error(InvalidFocusDirection)
+        }
     val nextCandidate = focusableChildren.findBestCandidate(initialFocusRect, requestedDirection)
     return nextCandidate?.let { onFound.invoke(it) } ?: false
 }
@@ -171,15 +183,16 @@
     direction: FocusDirection,
     onFound: (FocusTargetNode) -> Boolean
 ): Boolean {
-    val children = MutableVector<FocusTargetNode>().apply {
-        visitChildren(Nodes.FocusTarget) {
-            // TODO(b/278765590): Find the root issue why visitChildren returns unattached nodes.
-            if (it.isAttached) this.add(it)
+    val children =
+        MutableVector<FocusTargetNode>().apply {
+            visitChildren(Nodes.FocusTarget) {
+                // TODO(b/278765590): Find the root issue why visitChildren returns unattached
+                // nodes.
+                if (it.isAttached) this.add(it)
+            }
         }
-    }
     while (children.isNotEmpty()) {
-        val nextItem = children.findBestCandidate(focusedItem, direction)
-            ?: return false
+        val nextItem = children.findBestCandidate(focusedItem, direction) ?: return false
 
         // If the result is not deactivated, this is a valid next item.
         if (nextItem.fetchFocusProperties().canFocus) return onFound.invoke(nextItem)
@@ -195,9 +208,8 @@
 }
 
 /**
- * Returns all [FocusTargetNode] children that are not Deactivated. Any
- * child that is deactivated will add activated children instead, unless the deactivated
- * node has a custom Enter specified.
+ * Returns all [FocusTargetNode] children that are not Deactivated. Any child that is deactivated
+ * will add activated children instead, unless the deactivated node has a custom Enter specified.
  */
 private fun DelegatableNode.collectAccessibleChildren(
     accessibleChildren: MutableVector<FocusTargetNode>
@@ -224,13 +236,14 @@
     direction: FocusDirection
 ): FocusTargetNode? {
     // Pick an impossible rectangle as the initial best candidate Rect.
-    var bestCandidate = when (direction) {
-        Left -> focusRect.translate(focusRect.width + 1, 0f)
-        Right -> focusRect.translate(-(focusRect.width + 1), 0f)
-        Up -> focusRect.translate(0f, focusRect.height + 1)
-        Down -> focusRect.translate(0f, -(focusRect.height + 1))
-        else -> error(InvalidFocusDirection)
-    }
+    var bestCandidate =
+        when (direction) {
+            Left -> focusRect.translate(focusRect.width + 1, 0f)
+            Right -> focusRect.translate(-(focusRect.width + 1), 0f)
+            Up -> focusRect.translate(0f, focusRect.height + 1)
+            Down -> focusRect.translate(0f, -(focusRect.height + 1))
+            else -> error(InvalidFocusDirection)
+        }
 
     var searchResult: FocusTargetNode? = null
     forEach { candidateNode ->
@@ -259,36 +272,45 @@
     // rect is at least partially to the direction of (e.g left of) from source. Includes an edge
     // case for an empty rect (which is used in some cases when searching from a point on the
     // screen).
-    fun Rect.isCandidate() = when (direction) {
-        Left -> (focusedRect.right > right || focusedRect.left >= right) && focusedRect.left > left
-        Right -> (focusedRect.left < left || focusedRect.right <= left) && focusedRect.right < right
-        Up -> (focusedRect.bottom > bottom || focusedRect.top >= bottom) && focusedRect.top > top
-        Down -> (focusedRect.top < top || focusedRect.bottom <= top) && focusedRect.bottom < bottom
-        else -> error(InvalidFocusDirection)
-    }
+    fun Rect.isCandidate() =
+        when (direction) {
+            Left ->
+                (focusedRect.right > right || focusedRect.left >= right) && focusedRect.left > left
+            Right ->
+                (focusedRect.left < left || focusedRect.right <= left) && focusedRect.right < right
+            Up ->
+                (focusedRect.bottom > bottom || focusedRect.top >= bottom) && focusedRect.top > top
+            Down ->
+                (focusedRect.top < top || focusedRect.bottom <= top) && focusedRect.bottom < bottom
+            else -> error(InvalidFocusDirection)
+        }
 
     // The distance from the edge furthest in the given direction of source to the edge nearest
     // in the given direction of dest. If the dest is not in the direction from source, return 0.
     fun Rect.majorAxisDistance(): Float {
-        val majorAxisDistance = when (direction) {
-            Left -> focusedRect.left - right
-            Right -> left - focusedRect.right
-            Up -> focusedRect.top - bottom
-            Down -> top - focusedRect.bottom
-            else -> error(InvalidFocusDirection)
-        }
+        val majorAxisDistance =
+            when (direction) {
+                Left -> focusedRect.left - right
+                Right -> left - focusedRect.right
+                Up -> focusedRect.top - bottom
+                Down -> top - focusedRect.bottom
+                else -> error(InvalidFocusDirection)
+            }
         return max(0.0f, majorAxisDistance)
     }
 
     // Find the distance on the minor axis w.r.t the direction to the nearest edge of the
     // destination rectangle.
-    fun Rect.minorAxisDistance() = when (direction) {
-        // the distance between the center verticals
-        Left, Right -> (focusedRect.top + focusedRect.height / 2) - (top + height / 2)
-        // the distance between the center horizontals
-        Up, Down -> (focusedRect.left + focusedRect.width / 2) - (left + width / 2)
-        else -> error(InvalidFocusDirection)
-    }
+    fun Rect.minorAxisDistance() =
+        when (direction) {
+            // the distance between the center verticals
+            Left,
+            Right -> (focusedRect.top + focusedRect.height / 2) - (top + height / 2)
+            // the distance between the center horizontals
+            Up,
+            Down -> (focusedRect.left + focusedRect.width / 2) - (left + width / 2)
+            else -> error(InvalidFocusDirection)
+        }
 
     // Fudge-factor opportunity: how to calculate distance given major and minor axis distances.
     // Warning: This fudge factor is finely tuned, run all focus tests if you dare tweak it.
@@ -310,7 +332,6 @@
 
         // if currentCandidate is better, then the proposedCandidate can't be.
         beamBeats(focusedRect, currentCandidate, proposedCandidate, direction) -> false
-
         else -> weightedDistance(proposedCandidate) < weightedDistance(currentCandidate)
     }
 }
@@ -318,41 +339,42 @@
 /**
  * A rectangle may be a better candidate by virtue of being exclusively in the beam of the source
  * rect.
+ *
  * @return Whether rect1 is a better candidate than rect2 by virtue of it being in the source's
- * beam.
+ *   beam.
  */
-private fun beamBeats(
-    source: Rect,
-    rect1: Rect,
-    rect2: Rect,
-    direction: FocusDirection
-): Boolean {
+private fun beamBeats(source: Rect, rect1: Rect, rect2: Rect, direction: FocusDirection): Boolean {
     // Do the "beams" w.r.t the given direction's axis of rect1 and rect2 overlap?
-    fun Rect.inSourceBeam() = when (direction) {
-        Left, Right -> this.bottom > source.top && this.top < source.bottom
-        Up, Down -> this.right > source.left && this.left < source.right
-        else -> error(InvalidFocusDirection)
-    }
+    fun Rect.inSourceBeam() =
+        when (direction) {
+            Left,
+            Right -> this.bottom > source.top && this.top < source.bottom
+            Up,
+            Down -> this.right > source.left && this.left < source.right
+            else -> error(InvalidFocusDirection)
+        }
 
     // Whether the rect is in the direction of search.
-    fun Rect.isInDirectionOfSearch() = when (direction) {
-        Left -> source.left >= right
-        Right -> source.right <= left
-        Up -> source.top >= bottom
-        Down -> source.bottom <= top
-        else -> error(InvalidFocusDirection)
-    }
+    fun Rect.isInDirectionOfSearch() =
+        when (direction) {
+            Left -> source.left >= right
+            Right -> source.right <= left
+            Up -> source.top >= bottom
+            Down -> source.bottom <= top
+            else -> error(InvalidFocusDirection)
+        }
 
     // The distance from the edge furthest in the given direction of source to the edge nearest
     // in the given direction of dest. If the dest is not in the direction from source, return 0.
     fun Rect.majorAxisDistance(): Float {
-        val majorAxisDistance = when (direction) {
-            Left -> source.left - right
-            Right -> left - source.right
-            Up -> source.top - bottom
-            Down -> top - source.bottom
-            else -> error(InvalidFocusDirection)
-        }
+        val majorAxisDistance =
+            when (direction) {
+                Left -> source.left - right
+                Right -> left - source.right
+                Up -> source.top - bottom
+                Down -> top - source.bottom
+                else -> error(InvalidFocusDirection)
+            }
         return max(0.0f, majorAxisDistance)
     }
 
@@ -360,13 +382,14 @@
     // edge of dest. If the dest is not in the direction from source, return 1 (to break ties
     // with Rect.majorAxisDistance).
     fun Rect.majorAxisDistanceToFarEdge(): Float {
-        val majorAxisDistance = when (direction) {
-            Left -> source.left - left
-            Right -> right - source.right
-            Up -> source.top - top
-            Down -> bottom - source.bottom
-            else -> error(InvalidFocusDirection)
-        }
+        val majorAxisDistance =
+            when (direction) {
+                Left -> source.left - left
+                Right -> right - source.right
+                Up -> source.top - top
+                Down -> bottom - source.bottom
+                else -> error(InvalidFocusDirection)
+            }
         return max(1.0f, majorAxisDistance)
     }
 
@@ -390,6 +413,7 @@
 }
 
 private fun Rect.topLeft() = Rect(left, top, left, top)
+
 private fun Rect.bottomRight() = Rect(right, bottom, right, bottom)
 
 // Find the active descendant.
diff --git a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/graphics/GraphicsLayerModifier.kt b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/graphics/GraphicsLayerModifier.kt
index 80c4ea8..de9fb2e 100644
--- a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/graphics/GraphicsLayerModifier.kt
+++ b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/graphics/GraphicsLayerModifier.kt
@@ -31,12 +31,12 @@
 import androidx.compose.ui.unit.Constraints
 
 /**
- * A [Modifier.Element] that makes content draw into a draw layer. The draw layer can be
- * invalidated separately from parents. A [graphicsLayer] should be used when the content
- * updates independently from anything above it to minimize the invalidated content.
+ * A [Modifier.Element] that makes content draw into a draw layer. The draw layer can be invalidated
+ * separately from parents. A [graphicsLayer] should be used when the content updates independently
+ * from anything above it to minimize the invalidated content.
  *
- * [graphicsLayer] can also be used to apply effects to content, such as scaling ([scaleX], [scaleY]),
- * rotation ([rotationX], [rotationY], [rotationZ]), opacity ([alpha]), shadow
+ * [graphicsLayer] can also be used to apply effects to content, such as scaling ([scaleX],
+ * [scaleY]), rotation ([rotationX], [rotationY], [rotationZ]), opacity ([alpha]), shadow
  * ([shadowElevation], [shape]), and clipping ([clip], [shape]).
  *
  * Note that if you provide a non-zero [shadowElevation] and if the passed [shape] is concave the
@@ -44,13 +44,13 @@
  *
  * Also note that alpha values less than 1.0f will have their contents implicitly clipped to their
  * bounds. This is because an intermediate compositing layer is created to render contents into
- * first before being drawn into the destination with the desired alpha.
- * This layer is sized to the bounds of the composable this modifier is configured on, and contents
- * outside of these bounds are omitted.
+ * first before being drawn into the destination with the desired alpha. This layer is sized to the
+ * bounds of the composable this modifier is configured on, and contents outside of these bounds are
+ * omitted.
  *
  * If the layer parameters are backed by a [androidx.compose.runtime.State] or an animated value
- * prefer an overload with a lambda block on [GraphicsLayerScope] as reading a state inside the block
- * will only cause the layer properties update without triggering recomposition and relayout.
+ * prefer an overload with a lambda block on [GraphicsLayerScope] as reading a state inside the
+ * block will only cause the layer properties update without triggering recomposition and relayout.
  *
  * @sample androidx.compose.ui.samples.ChangeOpacity
  *
@@ -71,12 +71,13 @@
 @Deprecated(
     "Replace with graphicsLayer that consumes an optional RenderEffect parameter and " +
         "shadow color parameters",
-    replaceWith = ReplaceWith(
-        "Modifier.graphicsLayer(scaleX, scaleY, alpha, translationX, translationY, " +
-            "shadowElevation, rotationX, rotationY, rotationZ, cameraDistance, transformOrigin, " +
-            "shape, clip, null, DefaultShadowColor, DefaultShadowColor)",
-        "androidx.compose.ui.graphics"
-    ),
+    replaceWith =
+        ReplaceWith(
+            "Modifier.graphicsLayer(scaleX, scaleY, alpha, translationX, translationY, " +
+                "shadowElevation, rotationX, rotationY, rotationZ, cameraDistance, transformOrigin, " +
+                "shape, clip, null, DefaultShadowColor, DefaultShadowColor)",
+            "androidx.compose.ui.graphics"
+        ),
     level = DeprecationLevel.HIDDEN
 )
 @Stable
@@ -94,30 +95,31 @@
     transformOrigin: TransformOrigin = TransformOrigin.Center,
     shape: Shape = RectangleShape,
     clip: Boolean = false
-) = graphicsLayer(
-    scaleX = scaleX,
-    scaleY = scaleY,
-    alpha = alpha,
-    translationX = translationX,
-    translationY = translationY,
-    shadowElevation = shadowElevation,
-    rotationX = rotationX,
-    rotationY = rotationY,
-    rotationZ = rotationZ,
-    cameraDistance = cameraDistance,
-    transformOrigin = transformOrigin,
-    shape = shape,
-    clip = clip,
-    renderEffect = null
-)
+) =
+    graphicsLayer(
+        scaleX = scaleX,
+        scaleY = scaleY,
+        alpha = alpha,
+        translationX = translationX,
+        translationY = translationY,
+        shadowElevation = shadowElevation,
+        rotationX = rotationX,
+        rotationY = rotationY,
+        rotationZ = rotationZ,
+        cameraDistance = cameraDistance,
+        transformOrigin = transformOrigin,
+        shape = shape,
+        clip = clip,
+        renderEffect = null
+    )
 
 /**
- * A [Modifier.Element] that makes content draw into a draw layer. The draw layer can be
- * invalidated separately from parents. A [graphicsLayer] should be used when the content
- * updates independently from anything above it to minimize the invalidated content.
+ * A [Modifier.Element] that makes content draw into a draw layer. The draw layer can be invalidated
+ * separately from parents. A [graphicsLayer] should be used when the content updates independently
+ * from anything above it to minimize the invalidated content.
  *
- * [graphicsLayer] can also be used to apply effects to content, such as scaling ([scaleX], [scaleY]),
- * rotation ([rotationX], [rotationY], [rotationZ]), opacity ([alpha]), shadow
+ * [graphicsLayer] can also be used to apply effects to content, such as scaling ([scaleX],
+ * [scaleY]), rotation ([rotationX], [rotationY], [rotationZ]), opacity ([alpha]), shadow
  * ([shadowElevation], [shape]), clipping ([clip], [shape]), as well as altering the result of the
  * layer with [RenderEffect].
  *
@@ -126,13 +128,13 @@
  *
  * Also note that alpha values less than 1.0f will have their contents implicitly clipped to their
  * bounds. This is because an intermediate compositing layer is created to render contents into
- * first before being drawn into the destination with the desired alpha.
- * This layer is sized to the bounds of the composable this modifier is configured on, and contents
- * outside of these bounds are omitted.
+ * first before being drawn into the destination with the desired alpha. This layer is sized to the
+ * bounds of the composable this modifier is configured on, and contents outside of these bounds are
+ * omitted.
  *
  * If the layer parameters are backed by a [androidx.compose.runtime.State] or an animated value
- * prefer an overload with a lambda block on [GraphicsLayerScope] as reading a state inside the block
- * will only cause the layer properties update without triggering recomposition and relayout.
+ * prefer an overload with a lambda block on [GraphicsLayerScope] as reading a state inside the
+ * block will only cause the layer properties update without triggering recomposition and relayout.
  *
  * @sample androidx.compose.ui.samples.ChangeOpacity
  *
@@ -153,12 +155,13 @@
  */
 @Deprecated(
     "Replace with graphicsLayer that consumes shadow color parameters",
-    replaceWith = ReplaceWith(
-        "Modifier.graphicsLayer(scaleX, scaleY, alpha, translationX, translationY, " +
-            "shadowElevation, rotationX, rotationY, rotationZ, cameraDistance, transformOrigin, " +
-            "shape, clip, null, DefaultShadowColor, DefaultShadowColor)",
-        "androidx.compose.ui.graphics"
-    ),
+    replaceWith =
+        ReplaceWith(
+            "Modifier.graphicsLayer(scaleX, scaleY, alpha, translationX, translationY, " +
+                "shadowElevation, rotationX, rotationY, rotationZ, cameraDistance, transformOrigin, " +
+                "shape, clip, null, DefaultShadowColor, DefaultShadowColor)",
+            "androidx.compose.ui.graphics"
+        ),
     level = DeprecationLevel.HIDDEN
 )
 @Stable
@@ -177,33 +180,34 @@
     shape: Shape = RectangleShape,
     clip: Boolean = false,
     renderEffect: RenderEffect? = null
-) = graphicsLayer(
-    scaleX = scaleX,
-    scaleY = scaleY,
-    alpha = alpha,
-    translationX = translationX,
-    translationY = translationY,
-    shadowElevation = shadowElevation,
-    ambientShadowColor = DefaultShadowColor,
-    spotShadowColor = DefaultShadowColor,
-    rotationX = rotationX,
-    rotationY = rotationY,
-    rotationZ = rotationZ,
-    cameraDistance = cameraDistance,
-    transformOrigin = transformOrigin,
-    shape = shape,
-    clip = clip,
-    renderEffect = renderEffect,
-    compositingStrategy = CompositingStrategy.Auto
-)
+) =
+    graphicsLayer(
+        scaleX = scaleX,
+        scaleY = scaleY,
+        alpha = alpha,
+        translationX = translationX,
+        translationY = translationY,
+        shadowElevation = shadowElevation,
+        ambientShadowColor = DefaultShadowColor,
+        spotShadowColor = DefaultShadowColor,
+        rotationX = rotationX,
+        rotationY = rotationY,
+        rotationZ = rotationZ,
+        cameraDistance = cameraDistance,
+        transformOrigin = transformOrigin,
+        shape = shape,
+        clip = clip,
+        renderEffect = renderEffect,
+        compositingStrategy = CompositingStrategy.Auto
+    )
 
 /**
- * A [Modifier.Element] that makes content draw into a draw layer. The draw layer can be
- * invalidated separately from parents. A [graphicsLayer] should be used when the content
- * updates independently from anything above it to minimize the invalidated content.
+ * A [Modifier.Element] that makes content draw into a draw layer. The draw layer can be invalidated
+ * separately from parents. A [graphicsLayer] should be used when the content updates independently
+ * from anything above it to minimize the invalidated content.
  *
- * [graphicsLayer] can also be used to apply effects to content, such as scaling ([scaleX], [scaleY]),
- * rotation ([rotationX], [rotationY], [rotationZ]), opacity ([alpha]), shadow
+ * [graphicsLayer] can also be used to apply effects to content, such as scaling ([scaleX],
+ * [scaleY]), rotation ([rotationX], [rotationY], [rotationZ]), opacity ([alpha]), shadow
  * ([shadowElevation], [shape]), clipping ([clip], [shape]), as well as altering the result of the
  * layer with [RenderEffect]. Shadow color and ambient colors can be modified by configuring the
  * [spotShadowColor] and [ambientShadowColor] respectively.
@@ -213,13 +217,13 @@
  *
  * Also note that alpha values less than 1.0f will have their contents implicitly clipped to their
  * bounds. This is because an intermediate compositing layer is created to render contents into
- * first before being drawn into the destination with the desired alpha.
- * This layer is sized to the bounds of the composable this modifier is configured on, and contents
- * outside of these bounds are omitted.
+ * first before being drawn into the destination with the desired alpha. This layer is sized to the
+ * bounds of the composable this modifier is configured on, and contents outside of these bounds are
+ * omitted.
  *
  * If the layer parameters are backed by a [androidx.compose.runtime.State] or an animated value
- * prefer an overload with a lambda block on [GraphicsLayerScope] as reading a state inside the block
- * will only cause the layer properties update without triggering recomposition and relayout.
+ * prefer an overload with a lambda block on [GraphicsLayerScope] as reading a state inside the
+ * block will only cause the layer properties update without triggering recomposition and relayout.
  *
  * @sample androidx.compose.ui.samples.ChangeOpacity
  *
@@ -242,12 +246,13 @@
  */
 @Deprecated(
     "Replace with graphicsLayer that consumes a compositing strategy",
-    replaceWith = ReplaceWith(
-        "Modifier.graphicsLayer(scaleX, scaleY, alpha, translationX, translationY, " +
-            "shadowElevation, rotationX, rotationY, rotationZ, cameraDistance, transformOrigin, " +
-            "shape, clip, null, DefaultShadowColor, DefaultShadowColor, CompositingStrategy.Auto)",
-        "androidx.compose.ui.graphics"
-    ),
+    replaceWith =
+        ReplaceWith(
+            "Modifier.graphicsLayer(scaleX, scaleY, alpha, translationX, translationY, " +
+                "shadowElevation, rotationX, rotationY, rotationZ, cameraDistance, transformOrigin, " +
+                "shape, clip, null, DefaultShadowColor, DefaultShadowColor, CompositingStrategy.Auto)",
+            "androidx.compose.ui.graphics"
+        ),
     level = DeprecationLevel.HIDDEN
 )
 @Stable
@@ -268,39 +273,40 @@
     renderEffect: RenderEffect? = null,
     ambientShadowColor: Color = DefaultShadowColor,
     spotShadowColor: Color = DefaultShadowColor,
-) = graphicsLayer(
-    scaleX,
-    scaleY,
-    alpha,
-    translationX,
-    translationY,
-    shadowElevation,
-    rotationX,
-    rotationY,
-    rotationZ,
-    cameraDistance,
-    transformOrigin,
-    shape,
-    clip,
-    renderEffect,
-    ambientShadowColor,
-    spotShadowColor,
-    CompositingStrategy.Auto
-)
+) =
+    graphicsLayer(
+        scaleX,
+        scaleY,
+        alpha,
+        translationX,
+        translationY,
+        shadowElevation,
+        rotationX,
+        rotationY,
+        rotationZ,
+        cameraDistance,
+        transformOrigin,
+        shape,
+        clip,
+        renderEffect,
+        ambientShadowColor,
+        spotShadowColor,
+        CompositingStrategy.Auto
+    )
 
 /**
- * A [Modifier.Element] that makes content draw into a draw layer. The draw layer can be
- * invalidated separately from parents. A [graphicsLayer] should be used when the content
- * updates independently from anything above it to minimize the invalidated content.
+ * A [Modifier.Element] that makes content draw into a draw layer. The draw layer can be invalidated
+ * separately from parents. A [graphicsLayer] should be used when the content updates independently
+ * from anything above it to minimize the invalidated content.
  *
- * [graphicsLayer] can also be used to apply effects to content, such as scaling ([scaleX], [scaleY]),
- * rotation ([rotationX], [rotationY], [rotationZ]), opacity ([alpha]), shadow
+ * [graphicsLayer] can also be used to apply effects to content, such as scaling ([scaleX],
+ * [scaleY]), rotation ([rotationX], [rotationY], [rotationZ]), opacity ([alpha]), shadow
  * ([shadowElevation], [shape]), clipping ([clip], [shape]), as well as altering the result of the
  * layer with [RenderEffect]. Shadow color and ambient colors can be modified by configuring the
  * [spotShadowColor] and [ambientShadowColor] respectively.
  *
- * [CompositingStrategy] determines whether or not the contents of this layer are rendered into
- * an offscreen buffer. This is useful in order to optimize alpha usages with
+ * [CompositingStrategy] determines whether or not the contents of this layer are rendered into an
+ * offscreen buffer. This is useful in order to optimize alpha usages with
  * [CompositingStrategy.ModulateAlpha] which will skip the overhead of an offscreen buffer but can
  * generate different rendering results depending on whether or not the contents of the layer are
  * overlapping. Similarly leveraging [CompositingStrategy.Offscreen] is useful in situations where
@@ -310,17 +316,17 @@
  * shadow will not be drawn on Android versions less than 10.
  *
  * Also note that alpha values less than 1.0f will have their contents implicitly clipped to their
- * bounds unless [CompositingStrategy.ModulateAlpha] is specified.
- * This is because an intermediate compositing layer is created to render contents into
- * first before being drawn into the destination with the desired alpha.
- * This layer is sized to the bounds of the composable this modifier is configured on, and contents
- * outside of these bounds are omitted.
+ * bounds unless [CompositingStrategy.ModulateAlpha] is specified. This is because an intermediate
+ * compositing layer is created to render contents into first before being drawn into the
+ * destination with the desired alpha. This layer is sized to the bounds of the composable this
+ * modifier is configured on, and contents outside of these bounds are omitted.
  *
  * If the layer parameters are backed by a [androidx.compose.runtime.State] or an animated value
- * prefer an overload with a lambda block on [GraphicsLayerScope] as reading a state inside the block
- * will only cause the layer properties update without triggering recomposition and relayout.
+ * prefer an overload with a lambda block on [GraphicsLayerScope] as reading a state inside the
+ * block will only cause the layer properties update without triggering recomposition and relayout.
  *
  * @sample androidx.compose.ui.samples.ChangeOpacity
+ *
  * @sample androidx.compose.ui.samples.CompositingStrategyModulateAlpha
  *
  * @param scaleX see [GraphicsLayerScope.scaleX]
@@ -360,25 +366,27 @@
     ambientShadowColor: Color = DefaultShadowColor,
     spotShadowColor: Color = DefaultShadowColor,
     compositingStrategy: CompositingStrategy = CompositingStrategy.Auto
-) = this then GraphicsLayerElement(
-    scaleX,
-    scaleY,
-    alpha,
-    translationX,
-    translationY,
-    shadowElevation,
-    rotationX,
-    rotationY,
-    rotationZ,
-    cameraDistance,
-    transformOrigin,
-    shape,
-    clip,
-    renderEffect,
-    ambientShadowColor,
-    spotShadowColor,
-    compositingStrategy
-)
+) =
+    this then
+        GraphicsLayerElement(
+            scaleX,
+            scaleY,
+            alpha,
+            translationX,
+            translationY,
+            shadowElevation,
+            rotationX,
+            rotationY,
+            rotationZ,
+            cameraDistance,
+            transformOrigin,
+            shape,
+            clip,
+            renderEffect,
+            ambientShadowColor,
+            spotShadowColor,
+            compositingStrategy
+        )
 
 private data class GraphicsLayerElement(
     val scaleX: Float,
@@ -465,15 +473,14 @@
 }
 
 /**
- * A [Modifier.Node] that makes content draw into a draw layer. The draw layer can be
- * invalidated separately from parents. A [graphicsLayer] should be used when the content
- * updates independently from anything above it to minimize the invalidated content.
+ * A [Modifier.Node] that makes content draw into a draw layer. The draw layer can be invalidated
+ * separately from parents. A [graphicsLayer] should be used when the content updates independently
+ * from anything above it to minimize the invalidated content.
  *
  * [graphicsLayer] can be used to apply effects to content, such as scaling, rotation, opacity,
- * shadow, and clipping.
- * Prefer this version when you have layer properties backed by a
- * [androidx.compose.runtime.State] or an animated value as reading a state inside [block] will
- * only cause the layer properties update without triggering recomposition and relayout.
+ * shadow, and clipping. Prefer this version when you have layer properties backed by a
+ * [androidx.compose.runtime.State] or an animated value as reading a state inside [block] will only
+ * cause the layer properties update without triggering recomposition and relayout.
  *
  * @sample androidx.compose.ui.samples.AnimateFadeIn
  *
@@ -484,63 +491,60 @@
     this then BlockGraphicsLayerElement(block)
 
 /**
- * Determines when to render the contents of a layer into an offscreen buffer before
- * being drawn to the destination.
+ * Determines when to render the contents of a layer into an offscreen buffer before being drawn to
+ * the destination.
  */
 @Immutable
 @kotlin.jvm.JvmInline
-value class CompositingStrategy internal constructor(
-    @Suppress("unused") private val value: Int
-) {
+value class CompositingStrategy internal constructor(@Suppress("unused") private val value: Int) {
 
     companion object {
 
         /**
          * Rendering to an offscreen buffer will be determined automatically by the rest of the
-         * graphicsLayer parameters. This is the default behavior.
-         * For example, whenever an alpha value less than 1.0f is provided on [Modifier.graphicsLayer],
-         * a compositing layer is created automatically to first render the contents fully opaque,
-         * then draw this offscreen buffer to the destination with the corresponding alpha. This is
-         * necessary for correctness otherwise alpha applied to individual drawing instructions that
-         * overlap will have a different result than expected. Additionally usage of [RenderEffect]
-         * on the graphicsLayer will also render into an intermediate offscreen buffer before
-         * being drawn into the destination.
+         * graphicsLayer parameters. This is the default behavior. For example, whenever an alpha
+         * value less than 1.0f is provided on [Modifier.graphicsLayer], a compositing layer is
+         * created automatically to first render the contents fully opaque, then draw this offscreen
+         * buffer to the destination with the corresponding alpha. This is necessary for correctness
+         * otherwise alpha applied to individual drawing instructions that overlap will have a
+         * different result than expected. Additionally usage of [RenderEffect] on the graphicsLayer
+         * will also render into an intermediate offscreen buffer before being drawn into the
+         * destination.
          */
         val Auto = CompositingStrategy(0)
 
         /**
          * Rendering of content will always be rendered into an offscreen buffer first then drawn to
-         * the destination regardless of the other parameters configured on the graphics
-         * layer. This is useful for leveraging different blending algorithms for masking content.
-         * For example, the contents can be drawn into this graphics layer and masked out by drawing
-         * additional shapes with [BlendMode.Clear]
+         * the destination regardless of the other parameters configured on the graphics layer. This
+         * is useful for leveraging different blending algorithms for masking content. For example,
+         * the contents can be drawn into this graphics layer and masked out by drawing additional
+         * shapes with [BlendMode.Clear]
          */
         val Offscreen = CompositingStrategy(1)
 
         /**
          * Modulates alpha for each of the drawing instructions recorded within the graphicsLayer.
-         * This avoids usage of an offscreen buffer for purposes of alpha rendering.
-         * [ModulateAlpha] is more efficient than [Auto] in performance in scenarios where an alpha
-         * value less than 1.0f is provided. Otherwise the performance is similar to that of [Auto].
-         * However, this can provide different results than [Auto] if there is overlapping content
-         * within the layer and alpha is applied. This should only be used if the contents of the layer
-         * are known well in advance and are expected to not be overlapping.
+         * This avoids usage of an offscreen buffer for purposes of alpha rendering. [ModulateAlpha]
+         * is more efficient than [Auto] in performance in scenarios where an alpha value less than
+         * 1.0f is provided. Otherwise the performance is similar to that of [Auto]. However, this
+         * can provide different results than [Auto] if there is overlapping content within the
+         * layer and alpha is applied. This should only be used if the contents of the layer are
+         * known well in advance and are expected to not be overlapping.
          */
         val ModulateAlpha = CompositingStrategy(2)
     }
 }
 
 /**
- * A [Modifier.Element] that adds a draw layer such that tooling can identify an element
- * in the drawn image.
+ * A [Modifier.Element] that adds a draw layer such that tooling can identify an element in the
+ * drawn image.
  */
 @Stable
 fun Modifier.toolingGraphicsLayer() =
     if (isDebugInspectorInfoEnabled) this.then(Modifier.graphicsLayer()) else this
 
-private data class BlockGraphicsLayerElement(
-    val block: GraphicsLayerScope.() -> Unit
-) : ModifierNodeElement<BlockGraphicsLayerModifier>() {
+private data class BlockGraphicsLayerElement(val block: GraphicsLayerScope.() -> Unit) :
+    ModifierNodeElement<BlockGraphicsLayerModifier>() {
     override fun create() = BlockGraphicsLayerModifier(block)
 
     override fun update(node: BlockGraphicsLayerModifier) {
@@ -559,16 +563,16 @@
 ) : LayoutModifierNode, Modifier.Node() {
 
     /**
-     * We can skip remeasuring as we only need to rerun the placement block. we request it
-     * manually in the update block.
+     * We can skip remeasuring as we only need to rerun the placement block. we request it manually
+     * in the update block.
      */
-    override val shouldAutoInvalidate: Boolean get() = false
+    override val shouldAutoInvalidate: Boolean
+        get() = false
 
     fun invalidateLayerBlock() {
-        requireCoordinator(Nodes.Layout).wrapped?.updateLayerBlock(
-            layerBlock,
-            forceUpdateLayerParameters = true
-        )
+        requireCoordinator(Nodes.Layout)
+            .wrapped
+            ?.updateLayerBlock(layerBlock, forceUpdateLayerParameters = true)
     }
 
     override fun MeasureScope.measure(
@@ -581,9 +585,7 @@
         }
     }
 
-    override fun toString(): String =
-        "BlockGraphicsLayerModifier(" +
-            "block=$layerBlock)"
+    override fun toString(): String = "BlockGraphicsLayerModifier(" + "block=$layerBlock)"
 }
 
 private class SimpleGraphicsLayerModifier(
@@ -607,10 +609,11 @@
 ) : LayoutModifierNode, Modifier.Node() {
 
     /**
-     * We can skip remeasuring as we only need to rerun the placement block. we request it
-     * manually in the update block.
+     * We can skip remeasuring as we only need to rerun the placement block. we request it manually
+     * in the update block.
      */
-    override val shouldAutoInvalidate: Boolean get() = false
+    override val shouldAutoInvalidate: Boolean
+        get() = false
 
     private var layerBlock: GraphicsLayerScope.() -> Unit = {
         scaleX = this@SimpleGraphicsLayerModifier.scaleX
@@ -633,10 +636,9 @@
     }
 
     fun invalidateLayerBlock() {
-        requireCoordinator(Nodes.Layout).wrapped?.updateLayerBlock(
-            this.layerBlock,
-            forceUpdateLayerParameters = true
-        )
+        requireCoordinator(Nodes.Layout)
+            .wrapped
+            ?.updateLayerBlock(this.layerBlock, forceUpdateLayerParameters = true)
     }
 
     override fun MeasureScope.measure(
diff --git a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/graphics/GraphicsLayerScope.kt b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/graphics/GraphicsLayerScope.kt
index ca8fd83..e815be1 100644
--- a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/graphics/GraphicsLayerScope.kt
+++ b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/graphics/GraphicsLayerScope.kt
@@ -29,14 +29,10 @@
 import androidx.compose.ui.unit.Density
 import androidx.compose.ui.unit.LayoutDirection
 
-/**
- * Default camera distance for all layers
- */
+/** Default camera distance for all layers */
 const val DefaultCameraDistance = 8.0f
 
-/**
- * Default ambient shadow color for all layers.
- */
+/** Default ambient shadow color for all layers. */
 val DefaultShadowColor = Color.Black
 
 /**
@@ -47,42 +43,32 @@
 @JvmDefaultWithCompatibility
 @PlacementScopeMarker
 interface GraphicsLayerScope : Density {
-    /**
-     * The horizontal scale of the drawn area. Default value is `1`.
-     */
+    /** The horizontal scale of the drawn area. Default value is `1`. */
     var scaleX: Float
 
-    /**
-     * The vertical scale of the drawn area. Default value is `1`.
-     */
+    /** The vertical scale of the drawn area. Default value is `1`. */
     var scaleY: Float
 
     /**
-     * The alpha of the drawn area. Setting this to something other than `1`
-     * will cause the drawn contents to be translucent and setting it to `0` will
-     * cause it to be fully invisible. Default value is `1` and the range is between
-     * `0` and `1`.
+     * The alpha of the drawn area. Setting this to something other than `1` will cause the drawn
+     * contents to be translucent and setting it to `0` will cause it to be fully invisible. Default
+     * value is `1` and the range is between `0` and `1`.
      */
     /*@setparam:FloatRange(from = 0.0, to = 1.0)*/
     var alpha: Float
 
-    /**
-     * Horizontal pixel offset of the layer relative to its left bound. Default value is `0`.
-     */
+    /** Horizontal pixel offset of the layer relative to its left bound. Default value is `0`. */
     var translationX: Float
 
-    /**
-     * Vertical pixel offset of the layer relative to its top bound. Default value is `0`
-     */
+    /** Vertical pixel offset of the layer relative to its top bound. Default value is `0` */
     var translationY: Float
 
     /**
-     * Sets the elevation for the shadow in pixels. With the [shadowElevation] > 0f and
-     * [shape] set, a shadow is produced. Default value is `0` and the value must not be
-     * negative.
+     * Sets the elevation for the shadow in pixels. With the [shadowElevation] > 0f and [shape] set,
+     * a shadow is produced. Default value is `0` and the value must not be negative.
      *
-     * Note that if you provide a non-zero [shadowElevation] and if the passed [shape] is concave the
-     * shadow will not be drawn on Android versions less than 10.
+     * Note that if you provide a non-zero [shadowElevation] and if the passed [shape] is concave
+     * the shadow will not be drawn on Android versions less than 10.
      */
     /*@setparam:FloatRange(from = 0.0)*/
     var shadowElevation: Float
@@ -93,8 +79,8 @@
      * By default the shadow color is black. Generally, this color will be opaque so the intensity
      * of the shadow is consistent between different graphics layers with different colors.
      *
-     * The opacity of the final ambient shadow is a function of the shadow caster height, the
-     * alpha channel of the [ambientShadowColor] (typically opaque), and the
+     * The opacity of the final ambient shadow is a function of the shadow caster height, the alpha
+     * channel of the [ambientShadowColor] (typically opaque), and the
      * [android.R.attr.ambientShadowAlpha] theme attribute.
      *
      * Note that this parameter is only supported on Android 9 (Pie) and above. On older versions,
@@ -105,8 +91,7 @@
     var ambientShadowColor: Color
         get() = DefaultShadowColor
         // Keep the parameter name so current.txt maintains it for named parameter usage
-        @Suppress("UNUSED_PARAMETER")
-        set(ambientShadowColor) {}
+        @Suppress("UNUSED_PARAMETER") set(ambientShadowColor) {}
 
     /**
      * Sets the color of the spot shadow that is drawn when [shadowElevation] > 0f.
@@ -114,9 +99,9 @@
      * By default the shadow color is black. Generally, this color will be opaque so the intensity
      * of the shadow is consistent between different graphics layers with different colors.
      *
-     * The opacity of the final spot shadow is a function of the shadow caster height, the
-     * alpha channel of the [spotShadowColor] (typically opaque), and the
-     * [android.R.attr.spotShadowAlpha] theme attribute.
+     * The opacity of the final spot shadow is a function of the shadow caster height, the alpha
+     * channel of the [spotShadowColor] (typically opaque), and the [android.R.attr.spotShadowAlpha]
+     * theme attribute.
      *
      * Note that this parameter is only supported on Android 9 (Pie) and above. On older versions,
      * this property always returns [Color.Black] and setting new values is ignored.
@@ -126,8 +111,7 @@
     var spotShadowColor: Color
         get() = DefaultShadowColor
         // Keep the parameter name so current.txt maintains it for named parameter usage
-        @Suppress("UNUSED_PARAMETER")
-        set(spotShadowColor) {}
+        @Suppress("UNUSED_PARAMETER") set(spotShadowColor) {}
 
     /**
      * The rotation, in degrees, of the contents around the horizontal axis in degrees. Default
@@ -136,100 +120,89 @@
     var rotationX: Float
 
     /**
-     * The rotation, in degrees, of the contents around the vertical axis in degrees. Default
-     * value is `0`.
+     * The rotation, in degrees, of the contents around the vertical axis in degrees. Default value
+     * is `0`.
      */
     var rotationY: Float
 
     /**
-     * The rotation, in degrees, of the contents around the Z axis in degrees. Default value is
-     * `0`.
+     * The rotation, in degrees, of the contents around the Z axis in degrees. Default value is `0`.
      */
     var rotationZ: Float
 
     /**
-     * Sets the distance along the Z axis (orthogonal to the X/Y plane on which
-     * layers are drawn) from the camera to this layer. The camera's distance
-     * affects 3D transformations, for instance rotations around the X and Y
-     * axis. If the rotationX or rotationY properties are changed and this view is
-     * large (more than half the size of the screen), it is recommended to always
-     * use a camera distance that's greater than the height (X axis rotation) or
-     * the width (Y axis rotation) of this view.
+     * Sets the distance along the Z axis (orthogonal to the X/Y plane on which layers are drawn)
+     * from the camera to this layer. The camera's distance affects 3D transformations, for instance
+     * rotations around the X and Y axis. If the rotationX or rotationY properties are changed and
+     * this view is large (more than half the size of the screen), it is recommended to always use a
+     * camera distance that's greater than the height (X axis rotation) or the width (Y axis
+     * rotation) of this view.
      *
-     * The distance of the camera from the drawing plane can have an affect on the
-     * perspective distortion of the layer when it is rotated around the x or y axis.
-     * For example, a large distance will result in a large viewing angle, and there
-     * will not be much perspective distortion of the view as it rotates. A short
-     * distance may cause much more perspective distortion upon rotation, and can
-     * also result in some drawing artifacts if the rotated view ends up partially
-     * behind the camera (which is why the recommendation is to use a distance at
+     * The distance of the camera from the drawing plane can have an affect on the perspective
+     * distortion of the layer when it is rotated around the x or y axis. For example, a large
+     * distance will result in a large viewing angle, and there will not be much perspective
+     * distortion of the view as it rotates. A short distance may cause much more perspective
+     * distortion upon rotation, and can also result in some drawing artifacts if the rotated view
+     * ends up partially behind the camera (which is why the recommendation is to use a distance at
      * least as far as the size of the view, if the view is to be rotated.)
      *
-     * The distance is expressed in pixels and must always be positive.
-     * Default value is [DefaultCameraDistance]
+     * The distance is expressed in pixels and must always be positive. Default value is
+     * [DefaultCameraDistance]
      */
     /*@setparam:FloatRange(from = 0.0)*/
     var cameraDistance: Float
 
     /**
-     * Offset percentage along the x and y axis for which contents are rotated and scaled.
-     * The default value of 0.5f, 0.5f indicates the pivot point will be at the midpoint of the
-     * left and right as well as the top and bottom bounds of the layer.
-     * Default value is [TransformOrigin.Center]
+     * Offset percentage along the x and y axis for which contents are rotated and scaled. The
+     * default value of 0.5f, 0.5f indicates the pivot point will be at the midpoint of the left and
+     * right as well as the top and bottom bounds of the layer. Default value is
+     * [TransformOrigin.Center]
      */
     var transformOrigin: TransformOrigin
 
     /**
-     * The [Shape] of the layer. When [shadowElevation] is non-zero a shadow is produced using
-     * this [shape]. When [clip] is `true` contents will be clipped to this [shape].
-     * When clipping, the content will be redrawn when the [shape] changes.
-     * Default value is [RectangleShape]
+     * The [Shape] of the layer. When [shadowElevation] is non-zero a shadow is produced using this
+     * [shape]. When [clip] is `true` contents will be clipped to this [shape]. When clipping, the
+     * content will be redrawn when the [shape] changes. Default value is [RectangleShape]
      */
     var shape: Shape
 
-    /**
-     * Set to `true` to clip the content to the [shape].
-     * Default value is `false`
-     */
-    @Suppress("GetterSetterNames")
-    @get:Suppress("GetterSetterNames")
-    var clip: Boolean
+    /** Set to `true` to clip the content to the [shape]. Default value is `false` */
+    @Suppress("GetterSetterNames") @get:Suppress("GetterSetterNames") var clip: Boolean
 
     /**
-     * Configure the [RenderEffect] to apply to this [GraphicsLayerScope].
-     * This will apply a visual effect to the results of the [GraphicsLayerScope] before it is
-     * drawn. For example if [BlurEffect] is provided, the contents will be drawn in a separate
-     * layer, then this layer will be blurred when this [GraphicsLayerScope] is drawn.
+     * Configure the [RenderEffect] to apply to this [GraphicsLayerScope]. This will apply a visual
+     * effect to the results of the [GraphicsLayerScope] before it is drawn. For example if
+     * [BlurEffect] is provided, the contents will be drawn in a separate layer, then this layer
+     * will be blurred when this [GraphicsLayerScope] is drawn.
      *
-     * Note this parameter is only supported on Android 12
-     * and above. Attempts to use this Modifier on older Android versions will be ignored.
+     * Note this parameter is only supported on Android 12 and above. Attempts to use this Modifier
+     * on older Android versions will be ignored.
      */
     var renderEffect: RenderEffect?
         get() = null
         set(_) {}
 
     /**
-     * Determines the [CompositingStrategy] used to render the contents of this graphicsLayer
-     * into an offscreen buffer first before rendering to the destination
+     * Determines the [CompositingStrategy] used to render the contents of this graphicsLayer into
+     * an offscreen buffer first before rendering to the destination
      */
     var compositingStrategy: CompositingStrategy
         get() = CompositingStrategy.Auto
         // Keep the parameter name so current.txt maintains it for named parameter usage
-        @Suppress("UNUSED_PARAMETER")
-        set(compositingStrategy) {}
+        @Suppress("UNUSED_PARAMETER") set(compositingStrategy) {}
 
     /**
-     * [Size] of the graphicsLayer represented in pixels. Drawing commands can extend beyond
-     * the size specified, however, if the graphicsLayer is promoted to an offscreen rasterization
+     * [Size] of the graphicsLayer represented in pixels. Drawing commands can extend beyond the
+     * size specified, however, if the graphicsLayer is promoted to an offscreen rasterization
      * layer, any content rendered outside of the specified size will be clipped.
      */
     val size: Size
         get() = Size.Unspecified
 }
 
-private class GraphicsContextObserver(
-    private val graphicsContext: GraphicsContext
-) : RememberObserver {
+private class GraphicsContextObserver(private val graphicsContext: GraphicsContext) :
+    RememberObserver {
 
     val graphicsLayer = graphicsContext.createGraphicsLayer()
 
@@ -247,8 +220,8 @@
 }
 
 /**
- * Create a new [GraphicsLayer] instance that will automatically be released when the Composable
- * is disposed.
+ * Create a new [GraphicsLayer] instance that will automatically be released when the Composable is
+ * disposed.
  *
  * @return a GraphicsLayer instance
  */
@@ -259,9 +232,7 @@
     return remember { GraphicsContextObserver(graphicsContext) }.graphicsLayer
 }
 
-/**
- * Creates simple [GraphicsLayerScope].
- */
+/** Creates simple [GraphicsLayerScope]. */
 fun GraphicsLayerScope(): GraphicsLayerScope = ReusableGraphicsLayerScope()
 
 internal object Fields {
@@ -283,15 +254,16 @@
     const val CompositingStrategy: Int = 0b1 shl 15
     const val RenderEffect: Int = 0b1 shl 17
 
-    const val MatrixAffectingFields = ScaleX or
-        ScaleY or
-        TranslationX or
-        TranslationY or
-        TransformOrigin or
-        RotationX or
-        RotationY or
-        RotationZ or
-        CameraDistance
+    const val MatrixAffectingFields =
+        ScaleX or
+            ScaleY or
+            TranslationX or
+            TranslationY or
+            TransformOrigin or
+            RotationX or
+            RotationY or
+            RotationZ or
+            CameraDistance
 }
 
 internal class ReusableGraphicsLayerScope : GraphicsLayerScope {
@@ -304,6 +276,7 @@
                 field = value
             }
         }
+
     override var scaleY: Float = 1f
         set(value) {
             if (field != value) {
@@ -311,6 +284,7 @@
                 field = value
             }
         }
+
     override var alpha: Float = 1f
         set(value) {
             if (field != value) {
@@ -318,6 +292,7 @@
                 field = value
             }
         }
+
     override var translationX: Float = 0f
         set(value) {
             if (field != value) {
@@ -325,6 +300,7 @@
                 field = value
             }
         }
+
     override var translationY: Float = 0f
         set(value) {
             if (field != value) {
@@ -332,6 +308,7 @@
                 field = value
             }
         }
+
     override var shadowElevation: Float = 0f
         set(value) {
             if (field != value) {
@@ -339,6 +316,7 @@
                 field = value
             }
         }
+
     override var ambientShadowColor: Color = DefaultShadowColor
         set(value) {
             if (field != value) {
@@ -346,6 +324,7 @@
                 field = value
             }
         }
+
     override var spotShadowColor: Color = DefaultShadowColor
         set(value) {
             if (field != value) {
@@ -353,6 +332,7 @@
                 field = value
             }
         }
+
     override var rotationX: Float = 0f
         set(value) {
             if (field != value) {
@@ -360,6 +340,7 @@
                 field = value
             }
         }
+
     override var rotationY: Float = 0f
         set(value) {
             if (field != value) {
@@ -367,6 +348,7 @@
                 field = value
             }
         }
+
     override var rotationZ: Float = 0f
         set(value) {
             if (field != value) {
@@ -374,6 +356,7 @@
                 field = value
             }
         }
+
     override var cameraDistance: Float = DefaultCameraDistance
         set(value) {
             if (field != value) {
@@ -381,6 +364,7 @@
                 field = value
             }
         }
+
     override var transformOrigin: TransformOrigin = TransformOrigin.Center
         set(value) {
             if (field != value) {
@@ -388,6 +372,7 @@
                 field = value
             }
         }
+
     override var shape: Shape = RectangleShape
         set(value) {
             if (field != value) {
@@ -395,6 +380,7 @@
                 field = value
             }
         }
+
     override var clip: Boolean = false
         set(value) {
             if (field != value) {
@@ -402,6 +388,7 @@
                 field = value
             }
         }
+
     override var compositingStrategy: CompositingStrategy = CompositingStrategy.Auto
         set(value) {
             if (field != value) {
@@ -409,6 +396,7 @@
                 field = value
             }
         }
+
     override var size: Size = Size.Unspecified
 
     internal var graphicsDensity: Density = Density(1.0f)
@@ -430,8 +418,7 @@
         }
 
     internal var outline: Outline? = null
-        @VisibleForTesting
-        internal set
+        @VisibleForTesting internal set
 
     fun reset() {
         scaleX = 1f
diff --git a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/graphics/TransformOrigin.kt b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/graphics/TransformOrigin.kt
index 8780fc5..0201d54 100644
--- a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/graphics/TransformOrigin.kt
+++ b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/graphics/TransformOrigin.kt
@@ -23,48 +23,39 @@
 import androidx.compose.ui.util.unpackFloat2
 
 /**
- * Constructs a [TransformOrigin] from the given fractional values from the Layer's
- * width and height
+ * Constructs a [TransformOrigin] from the given fractional values from the Layer's width and height
  */
 fun TransformOrigin(pivotFractionX: Float, pivotFractionY: Float): TransformOrigin =
     TransformOrigin(packFloats(pivotFractionX, pivotFractionY))
 
-/**
- * A two-dimensional position represented as a fraction of the Layer's width and height
- */
+/** A two-dimensional position represented as a fraction of the Layer's width and height */
 @Immutable
 @kotlin.jvm.JvmInline
 value class TransformOrigin internal constructor(@PublishedApi internal val packedValue: Long) {
 
     /**
-     * Return the position along the x-axis that should be used as the
-     * origin for rotation and scale transformations. This is represented as a fraction
-     * of the width of the content. A value of 0.5f represents the midpoint between the left
-     * and right bounds of the content
+     * Return the position along the x-axis that should be used as the origin for rotation and scale
+     * transformations. This is represented as a fraction of the width of the content. A value of
+     * 0.5f represents the midpoint between the left and right bounds of the content
      */
     val pivotFractionX: Float
         get() = unpackFloat1(packedValue)
 
     /**
-     * Return the position along the y-axis that should be used as the
-     * origin for rotation and scale transformations. This is represented as a fraction
-     * of the height of the content. A value of 0.5f represents the midpoint between the top
-     * and bottom bounds of the content
+     * Return the position along the y-axis that should be used as the origin for rotation and scale
+     * transformations. This is represented as a fraction of the height of the content. A value of
+     * 0.5f represents the midpoint between the top and bottom bounds of the content
      */
     val pivotFractionY: Float
         get() = unpackFloat2(packedValue)
 
-    @Suppress("NOTHING_TO_INLINE")
-    @Stable
-    inline operator fun component1(): Float = pivotFractionX
+    @Suppress("NOTHING_TO_INLINE") @Stable inline operator fun component1(): Float = pivotFractionX
 
-    @Suppress("NOTHING_TO_INLINE")
-    @Stable
-    inline operator fun component2(): Float = pivotFractionY
+    @Suppress("NOTHING_TO_INLINE") @Stable inline operator fun component2(): Float = pivotFractionY
 
     /**
-     * Returns a copy of this TransformOrigin instance optionally overriding the
-     * pivotFractionX or pivotFractionY parameter
+     * Returns a copy of this TransformOrigin instance optionally overriding the pivotFractionX or
+     * pivotFractionY parameter
      */
     fun copy(
         pivotFractionX: Float = this.pivotFractionX,
@@ -74,8 +65,8 @@
     companion object {
 
         /**
-         * [TransformOrigin] constant to indicate that the center of the content should
-         * be used for rotation and scale transformations
+         * [TransformOrigin] constant to indicate that the center of the content should be used for
+         * rotation and scale transformations
          */
         val Center = TransformOrigin(0.5f, 0.5f)
     }
diff --git a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/graphics/vector/DrawCache.kt b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/graphics/vector/DrawCache.kt
index 7af3edc..63aecae 100644
--- a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/graphics/vector/DrawCache.kt
+++ b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/graphics/vector/DrawCache.kt
@@ -31,12 +31,11 @@
 import androidx.compose.ui.unit.toSize
 
 /**
- * Creates a drawing environment that directs its drawing commands to an [ImageBitmap]
- * which can be drawn directly in another [DrawScope] instance. This is useful to cache
- * complicated drawing commands across frames especially if the content has not changed.
- * Additionally some drawing operations such as rendering paths are done purely in
- * software so it is beneficial to cache the result and render the contents
- * directly through a texture as done by [DrawScope.drawImage]
+ * Creates a drawing environment that directs its drawing commands to an [ImageBitmap] which can be
+ * drawn directly in another [DrawScope] instance. This is useful to cache complicated drawing
+ * commands across frames especially if the content has not changed. Additionally some drawing
+ * operations such as rendering paths are done purely in software so it is beneficial to cache the
+ * result and render the contents directly through a texture as done by [DrawScope.drawImage]
  */
 internal class DrawCache {
 
@@ -51,8 +50,8 @@
 
     /**
      * Draw the contents of the lambda with receiver scope into an [ImageBitmap] with the provided
-     * size. If the same size is provided across calls, the same [ImageBitmap] instance is
-     * re-used and the contents are cleared out before drawing content in it again
+     * size. If the same size is provided across calls, the same [ImageBitmap] instance is re-used
+     * and the contents are cleared out before drawing content in it again
      */
     fun drawCachedImage(
         config: ImageBitmapConfig,
@@ -65,11 +64,12 @@
         this.layoutDirection = layoutDirection
         var targetImage = mCachedImage
         var targetCanvas = cachedCanvas
-        if (targetImage == null ||
-            targetCanvas == null ||
-            size.width > targetImage.width ||
-            size.height > targetImage.height ||
-            this.config != config
+        if (
+            targetImage == null ||
+                targetCanvas == null ||
+                size.width > targetImage.width ||
+                size.height > targetImage.height ||
+                this.config != config
         ) {
             targetImage = ImageBitmap(size.width, size.height, config = config)
             targetCanvas = Canvas(targetImage)
@@ -86,14 +86,8 @@
         targetImage.prepareToDraw()
     }
 
-    /**
-     * Draw the cached content into the provided [DrawScope] instance
-     */
-    fun drawInto(
-        target: DrawScope,
-        alpha: Float = 1.0f,
-        colorFilter: ColorFilter? = null
-    ) {
+    /** Draw the cached content into the provided [DrawScope] instance */
+    fun drawInto(target: DrawScope, alpha: Float = 1.0f, colorFilter: ColorFilter? = null) {
         val targetImage = mCachedImage
         checkPrecondition(targetImage != null) {
             "drawCachedImage must be invoked first before attempting to draw the result " +
diff --git a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/graphics/vector/ImageVector.kt b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/graphics/vector/ImageVector.kt
index b678844..0c90209 100644
--- a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/graphics/vector/ImageVector.kt
+++ b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/graphics/vector/ImageVector.kt
@@ -28,30 +28,25 @@
 import androidx.compose.ui.unit.Dp
 
 /**
- * Vector graphics object that is generated as a result of [ImageVector.Builder]
- * It can be composed and rendered by passing it as an argument to [rememberVectorPainter]
+ * Vector graphics object that is generated as a result of [ImageVector.Builder] It can be composed
+ * and rendered by passing it as an argument to [rememberVectorPainter]
  */
 @Immutable
-class ImageVector internal constructor(
+class ImageVector
+internal constructor(
 
-    /**
-     * Name of the Vector asset
-     */
+    /** Name of the Vector asset */
     val name: String,
 
-    /**
-     * Intrinsic width of the vector asset in [Dp]
-     */
+    /** Intrinsic width of the vector asset in [Dp] */
     val defaultWidth: Dp,
 
-    /**
-     * Intrinsic height of the vector asset in [Dp]
-     */
+    /** Intrinsic height of the vector asset in [Dp] */
     val defaultHeight: Dp,
 
     /**
-     *  Used to define the width of the viewport space. Viewport is basically the virtual canvas
-     *  where the paths are drawn on.
+     * Used to define the width of the viewport space. Viewport is basically the virtual canvas
+     * where the paths are drawn on.
      */
     val viewportWidth: Float,
 
@@ -61,24 +56,16 @@
      */
     val viewportHeight: Float,
 
-    /**
-     * Root group of the vector asset that contains all the child groups and paths
-     */
+    /** Root group of the vector asset that contains all the child groups and paths */
     val root: VectorGroup,
 
-    /**
-     * Optional tint color to be applied to the vector graphic
-     */
+    /** Optional tint color to be applied to the vector graphic */
     val tintColor: Color,
 
-    /**
-     * Blend mode used to apply [tintColor]
-     */
+    /** Blend mode used to apply [tintColor] */
     val tintBlendMode: BlendMode,
 
-    /**
-     * Determines if the vector asset should automatically be mirrored for right to left locales
-     */
+    /** Determines if the vector asset should automatically be mirrored for right to left locales */
     val autoMirror: Boolean,
 
     /**
@@ -88,35 +75,27 @@
     internal val genId: Int = generateImageVectorId(),
 ) {
     /**
-     * Builder used to construct a Vector graphic tree.
-     * This is useful for caching the result of expensive operations used to construct
-     * a vector graphic for compose.
-     * For example, the vector graphic could be serialized and downloaded from a server and represented
-     * internally in a ImageVector before it is composed through [rememberVectorPainter]
-     * The generated ImageVector is recommended to be memoized across composition calls to avoid
-     * doing redundant work
+     * Builder used to construct a Vector graphic tree. This is useful for caching the result of
+     * expensive operations used to construct a vector graphic for compose. For example, the vector
+     * graphic could be serialized and downloaded from a server and represented internally in a
+     * ImageVector before it is composed through [rememberVectorPainter] The generated ImageVector
+     * is recommended to be memoized across composition calls to avoid doing redundant work
      */
     @Suppress("MissingGetterMatchingBuilder")
     class Builder(
 
-        /**
-         * Name of the vector asset
-         */
+        /** Name of the vector asset */
         private val name: String = DefaultGroupName,
 
-        /**
-         * Intrinsic width of the Vector in [Dp]
-         */
+        /** Intrinsic width of the Vector in [Dp] */
         private val defaultWidth: Dp,
 
-        /**
-         * Intrinsic height of the Vector in [Dp]
-         */
+        /** Intrinsic height of the Vector in [Dp] */
         private val defaultHeight: Dp,
 
         /**
-         *  Used to define the width of the viewport space. Viewport is basically the virtual canvas
-         *  where the paths are drawn on.
+         * Used to define the width of the viewport space. Viewport is basically the virtual canvas
+         * where the paths are drawn on.
          */
         private val viewportWidth: Float,
 
@@ -126,14 +105,10 @@
          */
         private val viewportHeight: Float,
 
-        /**
-         * Optional color used to tint the entire vector image
-         */
+        /** Optional color used to tint the entire vector image */
         private val tintColor: Color = Color.Unspecified,
 
-        /**
-         * Blend mode used to apply the tint color
-         */
+        /** Blend mode used to apply the tint color */
         private val tintBlendMode: BlendMode = BlendMode.SrcIn,
 
         /**
@@ -144,51 +119,41 @@
 
         // Secondary constructor to maintain API compatibility that defaults autoMirror to false
         @Deprecated(
-            "Replace with ImageVector.Builder that consumes an optional auto " +
-                "mirror parameter",
-            replaceWith = ReplaceWith(
-                "Builder(name, defaultWidth, defaultHeight, viewportWidth, " +
-                    "viewportHeight, tintColor, tintBlendMode, false)",
-                "androidx.compose.ui.graphics.vector"
-            ),
+            "Replace with ImageVector.Builder that consumes an optional auto " + "mirror parameter",
+            replaceWith =
+                ReplaceWith(
+                    "Builder(name, defaultWidth, defaultHeight, viewportWidth, " +
+                        "viewportHeight, tintColor, tintBlendMode, false)",
+                    "androidx.compose.ui.graphics.vector"
+                ),
             DeprecationLevel.HIDDEN
         )
         constructor(
-            /**
-             * Name of the vector asset
-             */
+            /** Name of the vector asset */
             name: String = DefaultGroupName,
 
-            /**
-             * Intrinsic width of the Vector in [Dp]
-             */
+            /** Intrinsic width of the Vector in [Dp] */
             defaultWidth: Dp,
 
-            /**
-             * Intrinsic height of the Vector in [Dp]
-             */
+            /** Intrinsic height of the Vector in [Dp] */
             defaultHeight: Dp,
 
             /**
-             *  Used to define the width of the viewport space. Viewport is basically the virtual
-             *  canvas where the paths are drawn on.
+             * Used to define the width of the viewport space. Viewport is basically the virtual
+             * canvas where the paths are drawn on.
              */
             viewportWidth: Float,
 
             /**
-             * Used to define the height of the viewport space. Viewport is basically the virtual canvas
-             * where the paths are drawn on.
+             * Used to define the height of the viewport space. Viewport is basically the virtual
+             * canvas where the paths are drawn on.
              */
             viewportHeight: Float,
 
-            /**
-             * Optional color used to tint the entire vector image
-             */
+            /** Optional color used to tint the entire vector image */
             tintColor: Color = Color.Unspecified,
 
-            /**
-             * Blend mode used to apply the tint color
-             */
+            /** Blend mode used to apply the tint color */
             tintBlendMode: BlendMode = BlendMode.SrcIn
         ) : this(
             name,
@@ -225,7 +190,6 @@
          * @param translationX the translation in virtual pixels to apply along the x-axis
          * @param translationY the translation in virtual pixels to apply along the y-axis
          * @param clipPathData the path information used to clip the content within the group
-         *
          * @return This ImageVector.Builder instance as a convenience for chaining calls
          */
         @Suppress("MissingGetterMatchingBuilder")
@@ -241,24 +205,26 @@
             clipPathData: List<PathNode> = EmptyPath
         ): Builder {
             ensureNotConsumed()
-            val group = GroupParams(
-                name,
-                rotate,
-                pivotX,
-                pivotY,
-                scaleX,
-                scaleY,
-                translationX,
-                translationY,
-                clipPathData
-            )
+            val group =
+                GroupParams(
+                    name,
+                    rotate,
+                    pivotX,
+                    pivotY,
+                    scaleX,
+                    scaleY,
+                    translationX,
+                    translationY,
+                    clipPathData
+                )
             nodes.push(group)
             return this
         }
 
         /**
-         * Pops the topmost VectorGroup from this ImageVector.Builder. This is used to indicate
-         * that no additional ImageVector nodes will be added to the current VectorGroup
+         * Pops the topmost VectorGroup from this ImageVector.Builder. This is used to indicate that
+         * no additional ImageVector nodes will be added to the current VectorGroup
+         *
          * @return This ImageVector.Builder instance as a convenience for chaining calls
          */
         fun clearGroup(): Builder {
@@ -269,8 +235,8 @@
         }
 
         /**
-         * Add a path to the ImageVector graphic. This represents a leaf node in the ImageVector graphics
-         * tree structure
+         * Add a path to the ImageVector graphic. This represents a leaf node in the ImageVector
+         * graphics tree structure
          *
          * @param pathData path information to render the shape of the path
          * @param pathFillType rule to determine how the interior of the path is to be calculated
@@ -284,14 +250,14 @@
          * @param strokeLineJoin specifies the linejoin for a stroked path
          * @param strokeLineMiter specifies the miter limit for a stroked path
          * @param trimPathStart specifies the fraction of the path to trim from the start in the
-         * range from 0 to 1. Values outside the range will wrap around the length of the path.
-         * Default is 0.
-         * @param trimPathEnd specifies the fraction of the path to trim from the end in the
-         * range from 0 to 1. Values outside the range will wrap around the length of the path.
-         * Default is 1.
+         *   range from 0 to 1. Values outside the range will wrap around the length of the path.
+         *   Default is 0.
+         * @param trimPathEnd specifies the fraction of the path to trim from the end in the range
+         *   from 0 to 1. Values outside the range will wrap around the length of the path. Default
+         *   is 1.
          * @param trimPathOffset specifies the fraction to shift the path trim region in the range
-         * from 0 to 1. Values outside the range will wrap around the length of the path. Default is 0.
-         *
+         *   from 0 to 1. Values outside the range will wrap around the length of the path. Default
+         *   is 0.
          * @return This ImageVector.Builder instance as a convenience for chaining calls
          */
         @Suppress("MissingGetterMatchingBuilder")
@@ -336,6 +302,7 @@
         /**
          * Construct a ImageVector. This concludes the creation process of a ImageVector graphic
          * This builder cannot be re-used to create additional ImageVector instances
+         *
          * @return The newly created ImageVector instance
          */
         fun build(): ImageVector {
@@ -345,26 +312,25 @@
                 clearGroup()
             }
 
-            val vectorImage = ImageVector(
-                name,
-                defaultWidth,
-                defaultHeight,
-                viewportWidth,
-                viewportHeight,
-                root.asVectorGroup(),
-                tintColor,
-                tintBlendMode,
-                autoMirror
-            )
+            val vectorImage =
+                ImageVector(
+                    name,
+                    defaultWidth,
+                    defaultHeight,
+                    viewportWidth,
+                    viewportHeight,
+                    root.asVectorGroup(),
+                    tintColor,
+                    tintBlendMode,
+                    autoMirror
+                )
 
             isConsumed = true
 
             return vectorImage
         }
 
-        /**
-         * Throws IllegalStateException if the ImageVector.Builder has already been consumed
-         */
+        /** Throws IllegalStateException if the ImageVector.Builder has already been consumed */
         private fun ensureNotConsumed() {
             checkPrecondition(!isConsumed) {
                 "ImageVector.Builder is single use, create a new instance " +
@@ -373,9 +339,8 @@
         }
 
         /**
-         * Helper method to create an immutable VectorGroup object
-         * from an set of GroupParams which represent a group
-         * that is in the middle of being constructed
+         * Helper method to create an immutable VectorGroup object from an set of GroupParams which
+         * represent a group that is in the middle of being constructed
          */
         private fun GroupParams.asVectorGroup(): VectorGroup =
             VectorGroup(
@@ -392,8 +357,8 @@
             )
 
         /**
-         * Internal helper class to help assist with in progress creation of
-         * a vector group before creating the immutable result
+         * Internal helper class to help assist with in progress creation of a vector group before
+         * creating the immutable result
          */
         private class GroupParams(
             var name: String = DefaultGroupName,
@@ -452,63 +417,43 @@
 sealed class VectorNode
 
 /**
- * Defines a group of paths or subgroups, plus transformation information.
- * The transformations are defined in the same coordinates as the viewport.
- * The transformations are applied in the order of scale, rotate then translate.
+ * Defines a group of paths or subgroups, plus transformation information. The transformations are
+ * defined in the same coordinates as the viewport. The transformations are applied in the order of
+ * scale, rotate then translate.
  *
  * This is constructed as part of the result of [ImageVector.Builder] construction
  */
 @Immutable
-class VectorGroup internal constructor(
-    /**
-     * Name of the corresponding group
-     */
+class VectorGroup
+internal constructor(
+    /** Name of the corresponding group */
     val name: String = DefaultGroupName,
 
-    /**
-     * Rotation of the group in degrees
-     */
+    /** Rotation of the group in degrees */
     val rotation: Float = DefaultRotation,
 
-    /**
-     * X coordinate of the pivot point to rotate or scale the group
-     */
+    /** X coordinate of the pivot point to rotate or scale the group */
     val pivotX: Float = DefaultPivotX,
 
-    /**
-     * Y coordinate of the pivot point to rotate or scale the group
-     */
+    /** Y coordinate of the pivot point to rotate or scale the group */
     val pivotY: Float = DefaultPivotY,
 
-    /**
-     * Scale factor in the X-axis to apply to the group
-     */
+    /** Scale factor in the X-axis to apply to the group */
     val scaleX: Float = DefaultScaleX,
 
-    /**
-     * Scale factor in the Y-axis to apply to the group
-     */
+    /** Scale factor in the Y-axis to apply to the group */
     val scaleY: Float = DefaultScaleY,
 
-    /**
-     * Translation in virtual pixels to apply along the x-axis
-     */
+    /** Translation in virtual pixels to apply along the x-axis */
     val translationX: Float = DefaultTranslationX,
 
-    /**
-     * Translation in virtual pixels to apply along the y-axis
-     */
+    /** Translation in virtual pixels to apply along the y-axis */
     val translationY: Float = DefaultTranslationY,
 
-    /**
-     * Path information used to clip the content within the group
-     */
+    /** Path information used to clip the content within the group */
     val clipPathData: List<PathNode> = EmptyPath,
 
-    /**
-     * Child Vector nodes that are part of this group, this can contain
-     * paths or other groups
-     */
+    /** Child Vector nodes that are part of this group, this can contain paths or other groups */
     private val children: List<VectorNode> = emptyList()
 ) : VectorNode(), Iterable<VectorNode> {
 
@@ -564,51 +509,36 @@
 }
 
 /**
- * Leaf node of a Vector graphics tree. This specifies a path shape and parameters
- * to color and style the shape itself
+ * Leaf node of a Vector graphics tree. This specifies a path shape and parameters to color and
+ * style the shape itself
  *
  * This is constructed as part of the result of [ImageVector.Builder] construction
  */
 @Immutable
-class VectorPath internal constructor(
-    /**
-     * Name of the corresponding path
-     */
+class VectorPath
+internal constructor(
+    /** Name of the corresponding path */
     val name: String = DefaultPathName,
 
-    /**
-     * Path information to render the shape of the path
-     */
+    /** Path information to render the shape of the path */
     val pathData: List<PathNode>,
 
-    /**
-     * Rule to determine how the interior of the path is to be calculated
-     */
+    /** Rule to determine how the interior of the path is to be calculated */
     val pathFillType: PathFillType,
 
-    /**
-     *  Specifies the color or gradient used to fill the path
-     */
+    /** Specifies the color or gradient used to fill the path */
     val fill: Brush? = null,
 
-    /**
-     * Opacity to fill the path
-     */
+    /** Opacity to fill the path */
     val fillAlpha: Float = 1.0f,
 
-    /**
-     * Specifies the color or gradient used to fill the stroke
-     */
+    /** Specifies the color or gradient used to fill the stroke */
     val stroke: Brush? = null,
 
-    /**
-     * Opacity to stroke the path
-     */
+    /** Opacity to stroke the path */
     val strokeAlpha: Float = 1.0f,
 
-    /**
-     * Width of the line to stroke the path
-     */
+    /** Width of the line to stroke the path */
     val strokeLineWidth: Float = DefaultStrokeLineWidth,
 
     /**
@@ -621,20 +551,18 @@
      */
     val strokeLineJoin: StrokeJoin = DefaultStrokeLineJoin,
 
-    /**
-     * Specifies the miter limit for a stroked path, the default is 4
-     */
+    /** Specifies the miter limit for a stroked path, the default is 4 */
     val strokeLineMiter: Float = DefaultStrokeLineMiter,
 
     /**
-     * Specifies the fraction of the path to trim from the start, in the range from 0 to 1.
-     * The default is 0.
+     * Specifies the fraction of the path to trim from the start, in the range from 0 to 1. The
+     * default is 0.
      */
     val trimPathStart: Float = DefaultTrimPathStart,
 
     /**
-     * Specifies the fraction of the path to trim from the end, in the range from 0 to 1.
-     * The default is 1.
+     * Specifies the fraction of the path to trim from the end, in the range from 0 to 1. The
+     * default is 1.
      */
     val trimPathEnd: Float = DefaultTrimPathEnd,
 
@@ -703,7 +631,7 @@
  * @param strokeLineJoin specifies the linejoin for a stroked path
  * @param strokeLineMiter specifies the miter limit for a stroked path
  * @param pathFillType specifies the winding rule that decides how the interior of a [Path] is
- * calculated.
+ *   calculated.
  * @param pathBuilder [PathBuilder] lambda for adding [PathNode]s to this path.
  */
 inline fun ImageVector.Builder.path(
@@ -718,19 +646,20 @@
     strokeLineMiter: Float = DefaultStrokeLineMiter,
     pathFillType: PathFillType = DefaultFillType,
     pathBuilder: PathBuilder.() -> Unit
-) = addPath(
-    PathData(pathBuilder),
-    pathFillType,
-    name,
-    fill,
-    fillAlpha,
-    stroke,
-    strokeAlpha,
-    strokeLineWidth,
-    strokeLineCap,
-    strokeLineJoin,
-    strokeLineMiter
-)
+) =
+    addPath(
+        PathData(pathBuilder),
+        pathFillType,
+        name,
+        fill,
+        fillAlpha,
+        stroke,
+        strokeAlpha,
+        strokeLineWidth,
+        strokeLineCap,
+        strokeLineJoin,
+        strokeLineMiter
+    )
 
 /**
  * DSL extension for adding a [VectorGroup] to [this].
@@ -760,17 +689,7 @@
     clipPathData: List<PathNode> = EmptyPath,
     block: ImageVector.Builder.() -> Unit
 ) = apply {
-    addGroup(
-        name,
-        rotate,
-        pivotX,
-        pivotY,
-        scaleX,
-        scaleY,
-        translationX,
-        translationY,
-        clipPathData
-    )
+    addGroup(name, rotate, pivotX, pivotY, scaleX, scaleY, translationX, translationY, clipPathData)
     block()
     clearGroup()
 }
diff --git a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/graphics/vector/Vector.kt b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/graphics/vector/Vector.kt
index fd2d8fb..a9f8a5f 100644
--- a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/graphics/vector/Vector.kt
+++ b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/graphics/vector/Vector.kt
@@ -69,21 +69,23 @@
 val DefaultTintColor = Color.Transparent
 val DefaultFillType = PathFillType.NonZero
 
-inline fun PathData(block: PathBuilder.() -> Unit) = with(PathBuilder()) {
-    block()
-    nodes
-}
+inline fun PathData(block: PathBuilder.() -> Unit) =
+    with(PathBuilder()) {
+        block()
+        nodes
+    }
 
-fun addPathNodes(pathStr: String?) = if (pathStr == null) {
-    EmptyPath
-} else {
-    PathParser().parsePathString(pathStr).toNodes()
-}
+fun addPathNodes(pathStr: String?) =
+    if (pathStr == null) {
+        EmptyPath
+    } else {
+        PathParser().parsePathString(pathStr).toNodes()
+    }
 
 sealed class VNode {
     /**
-     * Callback invoked whenever the node in the vector tree is modified in a way that would
-     * change the output of the Vector
+     * Callback invoked whenever the node in the vector tree is modified in a way that would change
+     * the output of the Vector
      */
     internal open var invalidateListener: ((VNode) -> Unit)? = null
 
@@ -97,9 +99,7 @@
 internal class VectorComponent(val root: GroupComponent) : VNode() {
 
     init {
-        root.invalidateListener = {
-            doInvalidate()
-        }
+        root.invalidateListener = { doInvalidate() }
     }
 
     var name: String = DefaultGroupName
@@ -131,34 +131,33 @@
     private var rootScaleX = 1f
     private var rootScaleY = 1f
 
-    /**
-     * Cached lambda used to avoid allocating the lambda on each draw invocation
-     */
+    /** Cached lambda used to avoid allocating the lambda on each draw invocation */
     private val drawVectorBlock: DrawScope.() -> Unit = {
-        with(root) {
-            scale(rootScaleX, rootScaleY, pivot = Offset.Zero) {
-                draw()
-            }
-        }
+        with(root) { scale(rootScaleX, rootScaleY, pivot = Offset.Zero) { draw() } }
     }
 
     fun DrawScope.draw(alpha: Float, colorFilter: ColorFilter?) {
         // If the content of the vector has changed, or we are drawing a different size
         // update the cached image to ensure we are scaling the vector appropriately
         val isOneColor = root.isTintable && root.tintColor.isSpecified
-        val targetImageConfig = if (isOneColor && intrinsicColorFilter.tintableWithAlphaMask() &&
-            colorFilter.tintableWithAlphaMask()) {
-            ImageBitmapConfig.Alpha8
-        } else {
-            ImageBitmapConfig.Argb8888
-        }
+        val targetImageConfig =
+            if (
+                isOneColor &&
+                    intrinsicColorFilter.tintableWithAlphaMask() &&
+                    colorFilter.tintableWithAlphaMask()
+            ) {
+                ImageBitmapConfig.Alpha8
+            } else {
+                ImageBitmapConfig.Argb8888
+            }
 
         if (isDirty || previousDrawSize != size || targetImageConfig != cacheBitmapConfig) {
-            tintFilter = if (targetImageConfig == ImageBitmapConfig.Alpha8) {
-                ColorFilter.tint(root.tintColor)
-            } else {
-                null
-            }
+            tintFilter =
+                if (targetImageConfig == ImageBitmapConfig.Alpha8) {
+                    ColorFilter.tint(root.tintColor)
+                } else {
+                    null
+                }
             rootScaleX = size.width / viewportSize.width
             rootScaleY = size.height / viewportSize.height
             cacheDrawScope.drawCachedImage(
@@ -171,13 +170,14 @@
             isDirty = false
             previousDrawSize = size
         }
-        val targetFilter = if (colorFilter != null) {
-            colorFilter
-        } else if (intrinsicColorFilter != null) {
-            intrinsicColorFilter
-        } else {
-            tintFilter
-        }
+        val targetFilter =
+            if (colorFilter != null) {
+                colorFilter
+            } else if (intrinsicColorFilter != null) {
+                intrinsicColorFilter
+            } else {
+                tintFilter
+            }
         cacheDrawScope.drawInto(this, alpha, targetFilter)
     }
 
@@ -363,9 +363,8 @@
     private val children = mutableListOf<VNode>()
 
     /**
-     * Flag to determine if the contents of this group can be rendered with a single color
-     * This is true if all the paths and groups within this group can be rendered with the
-     * same color
+     * Flag to determine if the contents of this group can be rendered with a single color This is
+     * true if all the paths and groups within this group can be rendered with the same color
      */
     var isTintable = true
         private set
@@ -378,9 +377,9 @@
         private set
 
     /**
-     * Helper method to inspect whether the provided brush matches the current color of paths
-     * within the group in order to help determine if only an alpha channel bitmap can be allocated
-     * and tinted in order to save on memory overhead.
+     * Helper method to inspect whether the provided brush matches the current color of paths within
+     * the group in order to help determine if only an alpha channel bitmap can be allocated and
+     * tinted in order to save on memory overhead.
      */
     private fun markTintForBrush(brush: Brush?) {
         if (!isTintable) {
@@ -398,9 +397,9 @@
     }
 
     /**
-     * Helper method to inspect whether the provided color matches the current color of paths
-     * within the group in order to help determine if only an alpha channel bitmap can be allocated
-     * and tinted in order to save on memory overhead.
+     * Helper method to inspect whether the provided color matches the current color of paths within
+     * the group in order to help determine if only an alpha channel bitmap can be allocated and
+     * tinted in order to save on memory overhead.
      */
     private fun markTintForColor(color: Color) {
         if (!isTintable) {
@@ -613,38 +612,30 @@
                 clipPath(targetClip)
             }
         }) {
-            children.fastForEach { node ->
-                with(node) {
-                    this@draw.draw()
-                }
-            }
+            children.fastForEach { node -> with(node) { this@draw.draw() } }
         }
     }
 
     override fun toString(): String {
         val sb = StringBuilder().append("VGroup: ").append(name)
-        children.fastForEach { node ->
-            sb.append("\t").append(node.toString()).append("\n")
-        }
+        children.fastForEach { node -> sb.append("\t").append(node.toString()).append("\n") }
         return sb.toString()
     }
 }
 
 /**
- * helper method to verify if the rgb channels are equal excluding comparison of the alpha
- * channel
+ * helper method to verify if the rgb channels are equal excluding comparison of the alpha channel
  */
 internal fun Color.rgbEqual(other: Color) =
-    this.red == other.red &&
-        this.green == other.green &&
-        this.blue == other.blue
+    this.red == other.red && this.green == other.green && this.blue == other.blue
 
 /**
- * Helper method to determine if a particular ColorFilter will generate the same output
- * if the bitmap has an Alpha8 or ARGB8888 configuration
+ * Helper method to determine if a particular ColorFilter will generate the same output if the
+ * bitmap has an Alpha8 or ARGB8888 configuration
  */
-internal fun ColorFilter?.tintableWithAlphaMask() = if (this is BlendModeColorFilter) {
-    this.blendMode == BlendMode.SrcIn || this.blendMode == BlendMode.SrcOver
-} else {
-    this == null
-}
+internal fun ColorFilter?.tintableWithAlphaMask() =
+    if (this is BlendModeColorFilter) {
+        this.blendMode == BlendMode.SrcIn || this.blendMode == BlendMode.SrcOver
+    } else {
+        this == null
+    }
diff --git a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/graphics/vector/VectorCompose.kt b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/graphics/vector/VectorCompose.kt
index 51eac4b..96d083e 100644
--- a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/graphics/vector/VectorCompose.kt
+++ b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/graphics/vector/VectorCompose.kt
@@ -90,9 +90,9 @@
  * @param strokeLineJoin The [StrokeJoin] of [stroke]. See [Stroke.join] for details.
  * @param strokeLineMiter The stroke miter value. See [Stroke.miter] for details.
  * @param trimPathStart The fraction of the path that specifies the start of the clipped region of
- * the path. See [PathMeasure.getSegment].
+ *   the path. See [PathMeasure.getSegment].
  * @param trimPathEnd The fraction of the path that specifies the end of the clipped region of the
- * path. See [PathMeasure.getSegment].
+ *   path. See [PathMeasure.getSegment].
  * @param trimPathOffset The amount to offset both [trimPathStart] and [trimPathEnd].
  */
 @Composable
diff --git a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/graphics/vector/VectorPainter.kt b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/graphics/vector/VectorPainter.kt
index 3071bfc..3472a63 100644
--- a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/graphics/vector/VectorPainter.kt
+++ b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/graphics/vector/VectorPainter.kt
@@ -42,23 +42,20 @@
 import androidx.compose.ui.unit.LayoutDirection
 import androidx.compose.ui.util.packFloats
 
-/**
- * Default identifier for the root group if a Vector graphic
- */
+/** Default identifier for the root group if a Vector graphic */
 const val RootGroupName = "VectorRootGroup"
 
 /**
- * Create a [VectorPainter] with the Vector defined by the provided
- * sub-composition
+ * Create a [VectorPainter] with the Vector defined by the provided sub-composition
  *
  * @param [defaultWidth] Intrinsic width of the Vector in [Dp]
  * @param [defaultHeight] Intrinsic height of the Vector in [Dp]
  * @param [viewportWidth] Width of the viewport space. The viewport is the virtual canvas where
- * paths are drawn on.
- *  This parameter is optional. Not providing it will use the [defaultWidth] converted to pixels
+ *   paths are drawn on. This parameter is optional. Not providing it will use the [defaultWidth]
+ *   converted to pixels
  * @param [viewportHeight] Height of the viewport space. The viewport is the virtual canvas where
- * paths are drawn on.
- *  This parameter is optional. Not providing it will use the [defaultHeight] converted to pixels
+ *   paths are drawn on. This parameter is optional. Not providing it will use the [defaultHeight]
+ *   converted to pixels
  * @param [name] optional identifier used to identify the root of this vector graphic
  * @param [tintColor] optional color used to tint the root group of this vector graphic
  * @param [tintBlendMode] BlendMode used in combination with [tintColor]
@@ -66,11 +63,12 @@
  */
 @Deprecated(
     "Replace rememberVectorPainter graphicsLayer that consumes the auto mirror flag",
-    replaceWith = ReplaceWith(
-        "rememberVectorPainter(defaultWidth, defaultHeight, viewportWidth, " +
-            "viewportHeight, name, tintColor, tintBlendMode, false, content)",
-        "androidx.compose.ui.graphics.vector"
-    )
+    replaceWith =
+        ReplaceWith(
+            "rememberVectorPainter(defaultWidth, defaultHeight, viewportWidth, " +
+                "viewportHeight, name, tintColor, tintBlendMode, false, content)",
+            "androidx.compose.ui.graphics.vector"
+        )
 )
 @Composable
 @ComposableOpenTarget(-1)
@@ -104,16 +102,16 @@
  * @param [defaultWidth] Intrinsic width of the Vector in [Dp]
  * @param [defaultHeight] Intrinsic height of the Vector in [Dp]
  * @param [viewportWidth] Width of the viewport space. The viewport is the virtual canvas where
- * paths are drawn on.
- *  This parameter is optional. Not providing it will use the [defaultWidth] converted to pixels
+ *   paths are drawn on. This parameter is optional. Not providing it will use the [defaultWidth]
+ *   converted to pixels
  * @param [viewportHeight] Height of the viewport space. The viewport is the virtual canvas where
- * paths are drawn on.
- *  This parameter is optional. Not providing it will use the [defaultHeight] converted to pixels
+ *   paths are drawn on. This parameter is optional. Not providing it will use the [defaultHeight]
+ *   converted to pixels
  * @param [name] optional identifier used to identify the root of this vector graphic
  * @param [tintColor] optional color used to tint the root group of this vector graphic
  * @param [tintBlendMode] BlendMode used in combination with [tintColor]
  * @param [autoMirror] Determines if the contents of the Vector should be mirrored for right to left
- * layouts.
+ *   layouts.
  * @param [content] Composable used to define the structure and contents of the vector graphic
  */
 @Composable
@@ -132,39 +130,36 @@
     val density = LocalDensity.current
     val defaultSize = density.obtainSizePx(defaultWidth, defaultHeight)
     val viewport = obtainViewportSize(defaultSize, viewportWidth, viewportHeight)
-    val intrinsicColorFilter = remember(tintColor, tintBlendMode) {
-        createColorFilter(tintColor, tintBlendMode)
-    }
-    return remember { VectorPainter() }.apply {
-        configureVectorPainter(
-            defaultSize = defaultSize,
-            viewportSize = viewport,
-            name = name,
-            intrinsicColorFilter = intrinsicColorFilter,
-            autoMirror = autoMirror
-        )
-        val compositionContext = rememberCompositionContext()
-        this.composition = remember(viewportWidth, viewportHeight, content) {
-            val curComp = this.composition
-            val next = if (curComp == null || curComp.isDisposed) {
-                Composition(
-                    VectorApplier(this.vector.root),
-                    compositionContext
-                )
-            } else {
-                curComp
-            }
-            next.setContent {
-                content(viewport.width, viewport.height)
-            }
-            next
+    val intrinsicColorFilter =
+        remember(tintColor, tintBlendMode) { createColorFilter(tintColor, tintBlendMode) }
+    return remember { VectorPainter() }
+        .apply {
+            configureVectorPainter(
+                defaultSize = defaultSize,
+                viewportSize = viewport,
+                name = name,
+                intrinsicColorFilter = intrinsicColorFilter,
+                autoMirror = autoMirror
+            )
+            val compositionContext = rememberCompositionContext()
+            this.composition =
+                remember(viewportWidth, viewportHeight, content) {
+                    val curComp = this.composition
+                    val next =
+                        if (curComp == null || curComp.isDisposed) {
+                            Composition(VectorApplier(this.vector.root), compositionContext)
+                        } else {
+                            curComp
+                        }
+                    next.setContent { content(viewport.width, viewport.height) }
+                    next
+                }
         }
-    }
 }
 
 /**
- * Create a [VectorPainter] with the given [ImageVector]. This will create a
- * sub-composition of the vector hierarchy given the tree structure in [ImageVector]
+ * Create a [VectorPainter] with the given [ImageVector]. This will create a sub-composition of the
+ * vector hierarchy given the tree structure in [ImageVector]
  *
  * @param [image] ImageVector used to create a vector graphic sub-composition
  */
@@ -176,17 +171,14 @@
         createVectorPainterFromImageVector(
             density,
             image,
-            GroupComponent().apply {
-                createGroupComponent(image.root)
-            }
+            GroupComponent().apply { createGroupComponent(image.root) }
         )
     }
 }
 
 /**
- * [Painter] implementation that abstracts the drawing of a Vector graphic.
- * This can be represented by either a [ImageVector] or a programmatic
- * composition of a vector
+ * [Painter] implementation that abstracts the drawing of a Vector graphic. This can be represented
+ * by either a [ImageVector] or a programmatic composition of a vector
  */
 class VectorPainter internal constructor(root: GroupComponent = GroupComponent()) : Painter() {
 
@@ -194,9 +186,7 @@
 
     internal var autoMirror by mutableStateOf(false)
 
-    /**
-     * configures the intrinsic tint that may be defined on a VectorPainter
-     */
+    /** configures the intrinsic tint that may be defined on a VectorPainter */
     internal var intrinsicColorFilter: ColorFilter?
         get() = vector.intrinsicColorFilter
         set(value) {
@@ -215,13 +205,14 @@
             vector.name = value
         }
 
-    internal val vector = VectorComponent(root).apply {
-        invalidateCallback = {
-            if (drawCount == invalidateCount) {
-                invalidateCount++
+    internal val vector =
+        VectorComponent(root).apply {
+            invalidateCallback = {
+                if (drawCount == invalidateCount) {
+                    invalidateCount++
+                }
             }
         }
-    }
 
     internal val bitmapConfig: ImageBitmapConfig
         get() = vector.cacheBitmapConfig
@@ -243,9 +234,7 @@
         with(vector) {
             val filter = currentColorFilter ?: intrinsicColorFilter
             if (autoMirror && layoutDirection == LayoutDirection.Rtl) {
-                mirror {
-                    draw(currentAlpha, filter)
-                }
+                mirror { draw(currentAlpha, filter) }
             } else {
                 draw(currentAlpha, filter)
             }
@@ -271,33 +260,48 @@
 }
 
 /**
- * Represents one of the properties for PathComponent or GroupComponent that can be overwritten
- * when it is composed and drawn with [RenderVectorGroup].
+ * Represents one of the properties for PathComponent or GroupComponent that can be overwritten when
+ * it is composed and drawn with [RenderVectorGroup].
  */
 sealed class VectorProperty<T> {
     object Rotation : VectorProperty<Float>()
+
     object PivotX : VectorProperty<Float>()
+
     object PivotY : VectorProperty<Float>()
+
     object ScaleX : VectorProperty<Float>()
+
     object ScaleY : VectorProperty<Float>()
+
     object TranslateX : VectorProperty<Float>()
+
     object TranslateY : VectorProperty<Float>()
+
     object PathData : VectorProperty<List<PathNode>>()
+
     object Fill : VectorProperty<Brush?>()
+
     object FillAlpha : VectorProperty<Float>()
+
     object Stroke : VectorProperty<Brush?>()
+
     object StrokeLineWidth : VectorProperty<Float>()
+
     object StrokeAlpha : VectorProperty<Float>()
+
     object TrimPathStart : VectorProperty<Float>()
+
     object TrimPathEnd : VectorProperty<Float>()
+
     object TrimPathOffset : VectorProperty<Float>()
 }
 
 /**
  * Holds a set of values that overwrite the original property values of an [ImageVector]. This
- * allows you to dynamically change any of the property values provided as [VectorProperty].
- * This can be passed to [RenderVectorGroup] to alter some property values when the [VectorGroup]
- * is rendered.
+ * allows you to dynamically change any of the property values provided as [VectorProperty]. This
+ * can be passed to [RenderVectorGroup] to alter some property values when the [VectorGroup] is
+ * rendered.
  */
 @JvmDefaultWithCompatibility
 interface VectorConfig {
@@ -307,24 +311,21 @@
 }
 
 private fun Density.obtainSizePx(defaultWidth: Dp, defaultHeight: Dp) =
-        Size(defaultWidth.toPx(), defaultHeight.toPx())
+    Size(defaultWidth.toPx(), defaultHeight.toPx())
 
 /**
- * Helper method to calculate the viewport size. If the viewport width/height are not specified
- * this falls back on the default size provided
+ * Helper method to calculate the viewport size. If the viewport width/height are not specified this
+ * falls back on the default size provided
  */
-private fun obtainViewportSize(
-    defaultSize: Size,
-    viewportWidth: Float,
-    viewportHeight: Float
-) = Size(
+private fun obtainViewportSize(defaultSize: Size, viewportWidth: Float, viewportHeight: Float) =
+    Size(
         if (viewportWidth.isNaN()) defaultSize.width else viewportWidth,
         if (viewportHeight.isNaN()) defaultSize.height else viewportHeight
     )
 
 /**
- * Helper method to conditionally create a ColorFilter to tint contents if [tintColor] is
- * specified, that is [Color.isSpecified] returns true
+ * Helper method to conditionally create a ColorFilter to tint contents if [tintColor] is specified,
+ * that is [Color.isSpecified] returns true
  */
 private fun createColorFilter(tintColor: Color, tintBlendMode: BlendMode): ColorFilter? =
     if (tintColor.isSpecified) {
@@ -333,9 +334,7 @@
         null
     }
 
-/**
- * Helper method to configure the properties of a VectorPainter that maybe re-used
- */
+/** Helper method to configure the properties of a VectorPainter that maybe re-used */
 internal fun VectorPainter.configureVectorPainter(
     defaultSize: Size,
     viewportSize: Size,
@@ -343,74 +342,73 @@
     intrinsicColorFilter: ColorFilter?,
     autoMirror: Boolean = false,
 ): VectorPainter = apply {
-        this.size = defaultSize
-        this.autoMirror = autoMirror
-        this.intrinsicColorFilter = intrinsicColorFilter
-        this.viewportSize = viewportSize
-        this.name = name
-    }
+    this.size = defaultSize
+    this.autoMirror = autoMirror
+    this.intrinsicColorFilter = intrinsicColorFilter
+    this.viewportSize = viewportSize
+    this.name = name
+}
 
-/**
- * Helper method to create a VectorPainter instance from an ImageVector
- */
+/** Helper method to create a VectorPainter instance from an ImageVector */
 internal fun createVectorPainterFromImageVector(
     density: Density,
     imageVector: ImageVector,
     root: GroupComponent
 ): VectorPainter {
     val defaultSize = density.obtainSizePx(imageVector.defaultWidth, imageVector.defaultHeight)
-    val viewport = obtainViewportSize(
-        defaultSize,
-        imageVector.viewportWidth,
-        imageVector.viewportHeight
-    )
-    return VectorPainter(root).configureVectorPainter(
-        defaultSize = defaultSize,
-        viewportSize = viewport,
-        name = imageVector.name,
-        intrinsicColorFilter = createColorFilter(imageVector.tintColor, imageVector.tintBlendMode),
-        autoMirror = imageVector.autoMirror
-    )
+    val viewport =
+        obtainViewportSize(defaultSize, imageVector.viewportWidth, imageVector.viewportHeight)
+    return VectorPainter(root)
+        .configureVectorPainter(
+            defaultSize = defaultSize,
+            viewportSize = viewport,
+            name = imageVector.name,
+            intrinsicColorFilter =
+                createColorFilter(imageVector.tintColor, imageVector.tintBlendMode),
+            autoMirror = imageVector.autoMirror
+        )
 }
 
 /**
- * statically create a a GroupComponent from the VectorGroup representation provided from
- * an [ImageVector] instance
+ * statically create a a GroupComponent from the VectorGroup representation provided from an
+ * [ImageVector] instance
  */
 internal fun GroupComponent.createGroupComponent(currentGroup: VectorGroup): GroupComponent {
     for (index in 0 until currentGroup.size) {
         val vectorNode = currentGroup[index]
         if (vectorNode is VectorPath) {
-            val pathComponent = PathComponent().apply {
-                pathData = vectorNode.pathData
-                pathFillType = vectorNode.pathFillType
-                name = vectorNode.name
-                fill = vectorNode.fill
-                fillAlpha = vectorNode.fillAlpha
-                stroke = vectorNode.stroke
-                strokeAlpha = vectorNode.strokeAlpha
-                strokeLineWidth = vectorNode.strokeLineWidth
-                strokeLineCap = vectorNode.strokeLineCap
-                strokeLineJoin = vectorNode.strokeLineJoin
-                strokeLineMiter = vectorNode.strokeLineMiter
-                trimPathStart = vectorNode.trimPathStart
-                trimPathEnd = vectorNode.trimPathEnd
-                trimPathOffset = vectorNode.trimPathOffset
-            }
+            val pathComponent =
+                PathComponent().apply {
+                    pathData = vectorNode.pathData
+                    pathFillType = vectorNode.pathFillType
+                    name = vectorNode.name
+                    fill = vectorNode.fill
+                    fillAlpha = vectorNode.fillAlpha
+                    stroke = vectorNode.stroke
+                    strokeAlpha = vectorNode.strokeAlpha
+                    strokeLineWidth = vectorNode.strokeLineWidth
+                    strokeLineCap = vectorNode.strokeLineCap
+                    strokeLineJoin = vectorNode.strokeLineJoin
+                    strokeLineMiter = vectorNode.strokeLineMiter
+                    trimPathStart = vectorNode.trimPathStart
+                    trimPathEnd = vectorNode.trimPathEnd
+                    trimPathOffset = vectorNode.trimPathOffset
+                }
             insertAt(index, pathComponent)
         } else if (vectorNode is VectorGroup) {
-            val groupComponent = GroupComponent().apply {
-                name = vectorNode.name
-                rotation = vectorNode.rotation
-                scaleX = vectorNode.scaleX
-                scaleY = vectorNode.scaleY
-                translationX = vectorNode.translationX
-                translationY = vectorNode.translationY
-                pivotX = vectorNode.pivotX
-                pivotY = vectorNode.pivotY
-                clipPathData = vectorNode.clipPathData
-                createGroupComponent(vectorNode)
-            }
+            val groupComponent =
+                GroupComponent().apply {
+                    name = vectorNode.name
+                    rotation = vectorNode.rotation
+                    scaleX = vectorNode.scaleX
+                    scaleY = vectorNode.scaleY
+                    translationX = vectorNode.translationX
+                    translationY = vectorNode.translationY
+                    pivotX = vectorNode.pivotX
+                    pivotY = vectorNode.pivotY
+                    clipPathData = vectorNode.clipPathData
+                    createGroupComponent(vectorNode)
+                }
             insertAt(index, groupComponent)
         }
     }
@@ -422,95 +420,48 @@
  *
  * @param group The vector group to render.
  * @param configs An optional map of [VectorConfig] to provide animation values. The keys are the
- * node names. The values are [VectorConfig] for that node.
+ *   node names. The values are [VectorConfig] for that node.
  */
 @Composable
-fun RenderVectorGroup(
-    group: VectorGroup,
-    configs: Map<String, VectorConfig> = emptyMap()
-) {
+fun RenderVectorGroup(group: VectorGroup, configs: Map<String, VectorConfig> = emptyMap()) {
     for (vectorNode in group) {
         if (vectorNode is VectorPath) {
             val config = configs[vectorNode.name] ?: object : VectorConfig {}
             Path(
-                pathData = config.getOrDefault(
-                    VectorProperty.PathData,
-                    vectorNode.pathData
-                ),
+                pathData = config.getOrDefault(VectorProperty.PathData, vectorNode.pathData),
                 pathFillType = vectorNode.pathFillType,
                 name = vectorNode.name,
-                fill = config.getOrDefault(
-                    VectorProperty.Fill,
-                    vectorNode.fill
-                ),
-                fillAlpha = config.getOrDefault(
-                    VectorProperty.FillAlpha,
-                    vectorNode.fillAlpha
-                ),
-                stroke = config.getOrDefault(
-                    VectorProperty.Stroke,
-                    vectorNode.stroke
-                ),
-                strokeAlpha = config.getOrDefault(
-                    VectorProperty.StrokeAlpha,
-                    vectorNode.strokeAlpha
-                ),
-                strokeLineWidth = config.getOrDefault(
-                    VectorProperty.StrokeLineWidth,
-                    vectorNode.strokeLineWidth
-                ),
+                fill = config.getOrDefault(VectorProperty.Fill, vectorNode.fill),
+                fillAlpha = config.getOrDefault(VectorProperty.FillAlpha, vectorNode.fillAlpha),
+                stroke = config.getOrDefault(VectorProperty.Stroke, vectorNode.stroke),
+                strokeAlpha =
+                    config.getOrDefault(VectorProperty.StrokeAlpha, vectorNode.strokeAlpha),
+                strokeLineWidth =
+                    config.getOrDefault(VectorProperty.StrokeLineWidth, vectorNode.strokeLineWidth),
                 strokeLineCap = vectorNode.strokeLineCap,
                 strokeLineJoin = vectorNode.strokeLineJoin,
                 strokeLineMiter = vectorNode.strokeLineMiter,
-                trimPathStart = config.getOrDefault(
-                    VectorProperty.TrimPathStart,
-                    vectorNode.trimPathStart
-                ),
-                trimPathEnd = config.getOrDefault(
-                    VectorProperty.TrimPathEnd,
-                    vectorNode.trimPathEnd
-                ),
-                trimPathOffset = config.getOrDefault(
-                    VectorProperty.TrimPathOffset,
-                    vectorNode.trimPathOffset
-                )
+                trimPathStart =
+                    config.getOrDefault(VectorProperty.TrimPathStart, vectorNode.trimPathStart),
+                trimPathEnd =
+                    config.getOrDefault(VectorProperty.TrimPathEnd, vectorNode.trimPathEnd),
+                trimPathOffset =
+                    config.getOrDefault(VectorProperty.TrimPathOffset, vectorNode.trimPathOffset)
             )
         } else if (vectorNode is VectorGroup) {
             val config = configs[vectorNode.name] ?: object : VectorConfig {}
             Group(
                 name = vectorNode.name,
-                rotation = config.getOrDefault(
-                    VectorProperty.Rotation,
-                    vectorNode.rotation
-                ),
-                scaleX = config.getOrDefault(
-                    VectorProperty.ScaleX,
-                    vectorNode.scaleX
-                ),
-                scaleY = config.getOrDefault(
-                    VectorProperty.ScaleY,
-                    vectorNode.scaleY
-                ),
-                translationX = config.getOrDefault(
-                    VectorProperty.TranslateX,
-                    vectorNode.translationX
-                ),
-                translationY = config.getOrDefault(
-                    VectorProperty.TranslateY,
-                    vectorNode.translationY
-                ),
-                pivotX = config.getOrDefault(
-                    VectorProperty.PivotX,
-                    vectorNode.pivotX
-                ),
-                pivotY = config.getOrDefault(
-                    VectorProperty.PivotY,
-                    vectorNode.pivotY
-                ),
-                clipPathData = config.getOrDefault(
-                    VectorProperty.PathData,
-                    vectorNode.clipPathData
-                )
+                rotation = config.getOrDefault(VectorProperty.Rotation, vectorNode.rotation),
+                scaleX = config.getOrDefault(VectorProperty.ScaleX, vectorNode.scaleX),
+                scaleY = config.getOrDefault(VectorProperty.ScaleY, vectorNode.scaleY),
+                translationX =
+                    config.getOrDefault(VectorProperty.TranslateX, vectorNode.translationX),
+                translationY =
+                    config.getOrDefault(VectorProperty.TranslateY, vectorNode.translationY),
+                pivotX = config.getOrDefault(VectorProperty.PivotX, vectorNode.pivotX),
+                pivotY = config.getOrDefault(VectorProperty.PivotY, vectorNode.pivotY),
+                clipPathData = config.getOrDefault(VectorProperty.PathData, vectorNode.clipPathData)
             ) {
                 RenderVectorGroup(group = vectorNode, configs = configs)
             }
diff --git a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/hapticfeedback/HapticFeedback.kt b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/hapticfeedback/HapticFeedback.kt
index 234ac09..2a9b0ae 100644
--- a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/hapticfeedback/HapticFeedback.kt
+++ b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/hapticfeedback/HapticFeedback.kt
@@ -16,12 +16,8 @@
 
 package androidx.compose.ui.hapticfeedback
 
-/**
- * Interface for haptic feedback.
- */
+/** Interface for haptic feedback. */
 interface HapticFeedback {
-    /**
-     * Provide haptic feedback to the user.
-     */
+    /** Provide haptic feedback to the user. */
     fun performHapticFeedback(hapticFeedbackType: HapticFeedbackType)
 }
diff --git a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/hapticfeedback/HapticFeedbackType.kt b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/hapticfeedback/HapticFeedbackType.kt
index 65e8fac..62029cf1 100644
--- a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/hapticfeedback/HapticFeedbackType.kt
+++ b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/hapticfeedback/HapticFeedbackType.kt
@@ -33,15 +33,13 @@
 
     companion object {
         /**
-         * The user has performed a long press on an object that is resulting
-         * in an action being performed.
+         * The user has performed a long press on an object that is resulting in an action being
+         * performed.
          */
         val LongPress
             get() = PlatformHapticFeedbackType.LongPress
 
-        /**
-         * The user has performed a selection/insertion handle move on text field.
-         */
+        /** The user has performed a selection/insertion handle move on text field. */
         val TextHandleMove
             get() = PlatformHapticFeedbackType.TextHandleMove
 
diff --git a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/input/InputModeManager.kt b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/input/InputModeManager.kt
index d070126..67c343a 100644
--- a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/input/InputModeManager.kt
+++ b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/input/InputModeManager.kt
@@ -23,12 +23,10 @@
 
 /**
  * The [InputModeManager] is accessible as a CompositionLocal, that provides the current
- *  [InputMode].
+ * [InputMode].
  */
 interface InputModeManager {
-    /**
-     * The current [InputMode].
-     */
+    /** The current [InputMode]. */
     val inputMode: InputMode
 
     /**
@@ -37,30 +35,24 @@
      * @param inputMode The requested [InputMode].
      * @return true if the system is in the requested mode, after processing this request.
      */
-    @ExperimentalComposeUiApi
-    fun requestInputMode(inputMode: InputMode): Boolean
+    @ExperimentalComposeUiApi fun requestInputMode(inputMode: InputMode): Boolean
 }
 
-/**
- * This value is used to represent the InputMode that the system is currently in.
- */
+/** This value is used to represent the InputMode that the system is currently in. */
 @kotlin.jvm.JvmInline
 value class InputMode internal constructor(@Suppress("unused") private val value: Int) {
-    override fun toString() = when (this) {
-        Touch -> "Touch"
-        Keyboard -> "Keyboard"
-        else -> "Error"
-    }
+    override fun toString() =
+        when (this) {
+            Touch -> "Touch"
+            Keyboard -> "Keyboard"
+            else -> "Error"
+        }
 
     companion object {
-        /**
-         * The system is put into [Touch] mode when a user touches the screen.
-         */
+        /** The system is put into [Touch] mode when a user touches the screen. */
         val Touch = InputMode(1)
 
-        /**
-         * The system is put into [Keyboard] mode when a user presses a hardware key.
-         */
+        /** The system is put into [Keyboard] mode when a user presses a hardware key. */
         val Keyboard = InputMode(2)
     }
 }
diff --git a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/input/key/Key.kt b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/input/key/Key.kt
index 55d48e5..0552464 100644
--- a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/input/key/Key.kt
+++ b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/input/key/Key.kt
@@ -20,7 +20,7 @@
  * Represents keys on a keyboard.
  *
  * @param keyCode a Long value representing the key pressed. Note: This keycode can be used to
- * uniquely identify a hardware key. It is different from the native keycode.
+ *   uniquely identify a hardware key. It is different from the native keycode.
  *
  * @sample androidx.compose.ui.samples.KeyEventIsAltPressedSample
  */
@@ -33,18 +33,16 @@
         /**
          * Soft Left key.
          *
-         * Usually situated below the display on phones and used as a multi-function
-         * feature key for selecting a software defined function shown on the bottom left
-         * of the display.
+         * Usually situated below the display on phones and used as a multi-function feature key for
+         * selecting a software defined function shown on the bottom left of the display.
          */
         val SoftLeft: Key
 
         /**
          * Soft Right key.
          *
-         * Usually situated below the display on phones and used as a multi-function
-         * feature key for selecting a software defined function shown on the bottom right
-         * of the display.
+         * Usually situated below the display on phones and used as a multi-function feature key for
+         * selecting a software defined function shown on the bottom right of the display.
          */
         val SoftRight: Key
 
@@ -170,7 +168,7 @@
          */
         val VolumeDown: Key
 
-        /** Power key.  */
+        /** Power key. */
         val Power: Key
 
         /**
@@ -401,16 +399,16 @@
         /**
          * Home Movement key.
          *
-         * Used for scrolling or moving the cursor around to the start of a line
-         * or to the top of a list.
+         * Used for scrolling or moving the cursor around to the start of a line or to the top of a
+         * list.
          */
         val MoveHome: Key
 
         /**
          * End Movement key.
          *
-         * Used for scrolling or moving the cursor around to the end of a line
-         * or to the bottom of a list.
+         * Used for scrolling or moving the cursor around to the end of a line or to the bottom of a
+         * list.
          */
         val MoveEnd: Key
 
@@ -457,8 +455,7 @@
         /**
          * Number modifier key.
          *
-         * Used to enter numeric symbols.
-         * This key is not Num Lock; it is more like  [AltLeft].
+         * Used to enter numeric symbols. This key is not Num Lock; it is more like [AltLeft].
          */
         val Number: Key
 
@@ -508,96 +505,96 @@
         /**
          * A Button key.
          *
-         * On a game controller, the A button should be either the button labeled A
-         * or the first button on the bottom row of controller buttons.
+         * On a game controller, the A button should be either the button labeled A or the first
+         * button on the bottom row of controller buttons.
          */
         val ButtonA: Key
 
         /**
          * B Button key.
          *
-         * On a game controller, the B button should be either the button labeled B
-         * or the second button on the bottom row of controller buttons.
+         * On a game controller, the B button should be either the button labeled B or the second
+         * button on the bottom row of controller buttons.
          */
         val ButtonB: Key
 
         /**
          * C Button key.
          *
-         * On a game controller, the C button should be either the button labeled C
-         * or the third button on the bottom row of controller buttons.
+         * On a game controller, the C button should be either the button labeled C or the third
+         * button on the bottom row of controller buttons.
          */
         val ButtonC: Key
 
         /**
          * X Button key.
          *
-         * On a game controller, the X button should be either the button labeled X
-         * or the first button on the upper row of controller buttons.
+         * On a game controller, the X button should be either the button labeled X or the first
+         * button on the upper row of controller buttons.
          */
         val ButtonX: Key
 
         /**
          * Y Button key.
          *
-         * On a game controller, the Y button should be either the button labeled Y
-         * or the second button on the upper row of controller buttons.
+         * On a game controller, the Y button should be either the button labeled Y or the second
+         * button on the upper row of controller buttons.
          */
         val ButtonY: Key
 
         /**
          * Z Button key.
          *
-         * On a game controller, the Z button should be either the button labeled Z
-         * or the third button on the upper row of controller buttons.
+         * On a game controller, the Z button should be either the button labeled Z or the third
+         * button on the upper row of controller buttons.
          */
         val ButtonZ: Key
 
         /**
          * L1 Button key.
          *
-         * On a game controller, the L1 button should be either the button labeled L1 (or L)
-         * or the top left trigger button.
+         * On a game controller, the L1 button should be either the button labeled L1 (or L) or the
+         * top left trigger button.
          */
         val ButtonL1: Key
 
         /**
          * R1 Button key.
          *
-         * On a game controller, the R1 button should be either the button labeled R1 (or R)
-         * or the top right trigger button.
+         * On a game controller, the R1 button should be either the button labeled R1 (or R) or the
+         * top right trigger button.
          */
         val ButtonR1: Key
 
         /**
          * L2 Button key.
          *
-         * On a game controller, the L2 button should be either the button labeled L2
-         * or the bottom left trigger button.
+         * On a game controller, the L2 button should be either the button labeled L2 or the bottom
+         * left trigger button.
          */
         val ButtonL2: Key
 
         /**
          * R2 Button key.
          *
-         * On a game controller, the R2 button should be either the button labeled R2
-         * or the bottom right trigger button.
+         * On a game controller, the R2 button should be either the button labeled R2 or the bottom
+         * right trigger button.
          */
         val ButtonR2: Key
 
         /**
          * Left Thumb Button key.
          *
-         * On a game controller, the left thumb button indicates that the left (or only)
-         * joystick is pressed.
+         * On a game controller, the left thumb button indicates that the left (or only) joystick is
+         * pressed.
          */
         val ButtonThumbLeft: Key
 
         /**
          * Right Thumb Button key.
          *
-         * On a game controller, the right thumb button indicates that the right
-         * joystick is pressed.
+         * On a game controller, the right thumb button indicates that the right joystick is
+         * pressed.
          */
         val ButtonThumbRight: Key
 
@@ -716,8 +713,8 @@
         /**
          * Num Lock key.
          *
-         * This is the Num Lock key; it is different from [Number].
-         * This key alters the behavior of other keys on the numeric keypad.
+         * This is the Num Lock key; it is different from [Number]. This key alters the behavior of
+         * other keys on the numeric keypad.
          */
         val NumLock: Key
 
@@ -868,16 +865,16 @@
          *
          * Mutes the speaker, unlike [MicrophoneMute].
          *
-         * This key should normally be implemented as a toggle such that the first press
-         * mutes the speaker and the second press restores the original volume.
+         * This key should normally be implemented as a toggle such that the first press mutes the
+         * speaker and the second press restores the original volume.
          */
         val VolumeMute: Key
 
         /**
          * Info key.
          *
-         * Common on TV remotes to show additional information related to what is
-         * currently being viewed.
+         * Common on TV remotes to show additional information related to what is currently being
+         * viewed.
          */
         val Info: Key
 
@@ -911,8 +908,8 @@
         /**
          * Window key.
          *
-         * On TV remotes, toggles picture-in-picture mode or other windowing functions.
-         * On Android Wear devices, triggers a display offset.
+         * On TV remotes, toggles picture-in-picture mode or other windowing functions. On Android
+         * Wear devices, triggers a display offset.
          */
         val Window: Key
 
@@ -1031,18 +1028,18 @@
         /**
          * Language Switch key.
          *
-         * Toggles the current input language such as switching between English and Japanese on
-         * a QWERTY keyboard.  On some devices, the same function may be performed by
-         * pressing Shift+Space.
+         * Toggles the current input language such as switching between English and Japanese on a
+         * QWERTY keyboard. On some devices, the same function may be performed by pressing
+         * Shift+Space.
          */
         val LanguageSwitch: Key
 
         /**
          * Manner Mode key.
          *
-         * Toggles silent or vibrate mode on and off to make the device behave more politely
-         * in certain settings such as on a crowded train.  On some devices, the key may only
-         * operate when long-pressed.
+         * Toggles silent or vibrate mode on and off to make the device behave more politely in
+         * certain settings such as on a crowded train. On some devices, the key may only operate
+         * when long-pressed.
          */
         val MannerMode: Key
 
@@ -1108,7 +1105,7 @@
         /**
          * Assist key.
          *
-         * Launches the global assist activity.  Not delivered to applications.
+         * Launches the global assist activity. Not delivered to applications.
          */
         val Assist: Key
 
@@ -1129,28 +1126,27 @@
         /**
          * Sleep key.
          *
-         * Puts the device to sleep. Behaves somewhat like [Power] but it
-         * has no effect if the device is already asleep.
+         * Puts the device to sleep. Behaves somewhat like [Power] but it has no effect if the
+         * device is already asleep.
          */
         val Sleep: Key
 
         /**
          * Wakeup key.
          *
-         * Wakes up the device.  Behaves somewhat like [Power] but it
-         * has no effect if the device is already awake.
+         * Wakes up the device. Behaves somewhat like [Power] but it has no effect if the device is
+         * already awake.
          */
         val WakeUp: Key
 
-        /** Put device to sleep unless a wakelock is held.  */
+        /** Put device to sleep unless a wakelock is held. */
         val SoftSleep: Key
 
         /**
          * Pairing key.
          *
-         * Initiates peripheral pairing mode. Useful for pairing remote control
-         * devices or game controllers, especially if no other input mode is
-         * available.
+         * Initiates peripheral pairing mode. Useful for pairing remote control devices or game
+         * controllers, especially if no other input mode is available.
          */
         val Pairing: Key
 
@@ -1192,9 +1188,9 @@
         /**
          * Number entry key.
          *
-         * Initiates to enter multi-digit channel number when each digit key is assigned
-         * for selecting separate channel. Corresponds to Number Entry Mode (0x1D) of CEC
-         * User Control Code.
+         * Initiates to enter multi-digit channel number when each digit key is assigned for
+         * selecting separate channel. Corresponds to Number Entry Mode (0x1D) of CEC User Control
+         * Code.
          */
         val TvNumberEntry: Key
 
@@ -1355,16 +1351,16 @@
         /**
          * Media context menu key.
          *
-         * Goes to the context menu of media contents. Corresponds to Media Context-sensitive
-         * Menu (0x11) of CEC User Control Code.
+         * Goes to the context menu of media contents. Corresponds to Media Context-sensitive Menu
+         * (0x11) of CEC User Control Code.
          */
         val TvMediaContextMenu: Key
 
         /**
          * Timer programming key.
          *
-         * Goes to the timer recording menu. Corresponds to Timer Programming (0x54) of
-         * CEC User Control Code.
+         * Goes to the timer recording menu. Corresponds to Timer Programming (0x54) of CEC User
+         * Control Code.
          */
         val TvTimerProgramming: Key
 
@@ -1397,8 +1393,8 @@
         val ThumbsDown: Key
 
         /**
-         * Used to switch current [account][android.accounts.Account] that is
-         * consuming content. May be consumed by system to set account globally.
+         * Used to switch current [account][android.accounts.Account] that is consuming content. May
+         * be consumed by system to set account globally.
          */
         val ProfileSwitch: Key
     }
diff --git a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/input/key/KeyEvent.kt b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/input/key/KeyEvent.kt
index 450600fa..1ce8d72 100644
--- a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/input/key/KeyEvent.kt
+++ b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/input/key/KeyEvent.kt
@@ -16,22 +16,19 @@
 
 package androidx.compose.ui.input.key
 
-/**
- * The native platform-specific keyboard key event.
- */
+/** The native platform-specific keyboard key event. */
 expect class NativeKeyEvent
 
 /**
  * When a user presses a key on a hardware keyboard, a [KeyEvent] is sent to the item that is
  * currently focused. Any parent composable can intercept this [key event][KeyEvent] on its way to
- * the focused item by using [Modifier.onPreviewKeyEvent()]][onPreviewKeyEvent]. If the item is
- * not consumed, it returns back to each parent and can be intercepted by using
+ * the focused item by using [Modifier.onPreviewKeyEvent()]][onPreviewKeyEvent]. If the item is not
+ * consumed, it returns back to each parent and can be intercepted by using
  * [Modifier.onKeyEvent()]][onKeyEvent].
  *
  * @sample androidx.compose.ui.samples.KeyEventSample
  */
-@kotlin.jvm.JvmInline
-value class KeyEvent(val nativeKeyEvent: NativeKeyEvent)
+@kotlin.jvm.JvmInline value class KeyEvent(val nativeKeyEvent: NativeKeyEvent)
 
 /**
  * The key that was pressed.
@@ -41,20 +38,20 @@
 expect val KeyEvent.key: Key
 
 /**
- * The UTF16 value corresponding to the key event that was pressed. The unicode character
- * takes into account any meta keys that are pressed (eg. Pressing shift results in capital
- * alphabets). The UTF16 value uses the
- * [U+n notation][http://www.unicode.org/reports/tr27/#notation] of the Unicode Standard.
+ * The UTF16 value corresponding to the key event that was pressed. The unicode character takes into
+ * account any meta keys that are pressed (eg. Pressing shift results in capital alphabets). The
+ * UTF16 value uses the [U+n notation][http://www.unicode.org/reports/tr27/#notation] of the Unicode
+ * Standard.
  *
- * An [Int] is used instead of a [Char] so that we can support supplementary characters. The
- * Unicode Standard allows for characters whose representation requires more than 16 bits.
- * The range of legal code points is U+0000 to U+10FFFF, known as Unicode scalar value.
+ * An [Int] is used instead of a [Char] so that we can support supplementary characters. The Unicode
+ * Standard allows for characters whose representation requires more than 16 bits. The range of
+ * legal code points is U+0000 to U+10FFFF, known as Unicode scalar value.
  *
- * The set of characters from U+0000 to U+FFFF is sometimes referred to as the Basic
- * Multilingual Plane (BMP). Characters whose code points are greater than U+FFFF are called
- * supplementary characters. In this representation, supplementary characters are represented
- * as a pair of char values, the first from the high-surrogates range, (\uD800-\uDBFF), the
- * second from the low-surrogates range (\uDC00-\uDFFF).
+ * The set of characters from U+0000 to U+FFFF is sometimes referred to as the Basic Multilingual
+ * Plane (BMP). Characters whose code points are greater than U+FFFF are called supplementary
+ * characters. In this representation, supplementary characters are represented as a pair of char
+ * values, the first from the high-surrogates range, (\uD800-\uDBFF), the second from the
+ * low-surrogates range (\uDC00-\uDFFF).
  */
 expect val KeyEvent.utf16CodePoint: Int
 
diff --git a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/input/key/KeyInputModifier.kt b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/input/key/KeyInputModifier.kt
index 7e8cff6..04c9f7a 100644
--- a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/input/key/KeyInputModifier.kt
+++ b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/input/key/KeyInputModifier.kt
@@ -21,34 +21,32 @@
 import androidx.compose.ui.platform.InspectorInfo
 
 /**
- * Adding this [modifier][Modifier] to the [modifier][Modifier] parameter of a component will
- * allow it to intercept hardware key events when it (or one of its children) is focused.
+ * Adding this [modifier][Modifier] to the [modifier][Modifier] parameter of a component will allow
+ * it to intercept hardware key events when it (or one of its children) is focused.
  *
  * @param onKeyEvent This callback is invoked when the user interacts with the hardware keyboard.
- * While implementing this callback, return true to stop propagation of this event. If you return
- * false, the key event will be sent to this [onKeyEvent]'s parent.
+ *   While implementing this callback, return true to stop propagation of this event. If you return
+ *   false, the key event will be sent to this [onKeyEvent]'s parent.
  *
  * @sample androidx.compose.ui.samples.KeyEventSample
  */
-fun Modifier.onKeyEvent(
-    onKeyEvent: (KeyEvent) -> Boolean
-): Modifier = this then KeyInputElement(onKeyEvent = onKeyEvent, onPreKeyEvent = null)
+fun Modifier.onKeyEvent(onKeyEvent: (KeyEvent) -> Boolean): Modifier =
+    this then KeyInputElement(onKeyEvent = onKeyEvent, onPreKeyEvent = null)
 
 /**
- * Adding this [modifier][Modifier] to the [modifier][Modifier] parameter of a component will
- * allow it to intercept hardware key events when it (or one of its children) is focused.
+ * Adding this [modifier][Modifier] to the [modifier][Modifier] parameter of a component will allow
+ * it to intercept hardware key events when it (or one of its children) is focused.
  *
  * @param onPreviewKeyEvent This callback is invoked when the user interacts with the hardware
- * keyboard. It gives ancestors of a focused component the chance to intercept a [KeyEvent].
- * Return true to stop propagation of this event. If you return false, the key event will be sent
- * to this [onPreviewKeyEvent]'s child. If none of the children consume the event, it will be
- * sent back up to the root [KeyInputModifierNode] using the onKeyEvent callback.
+ *   keyboard. It gives ancestors of a focused component the chance to intercept a [KeyEvent].
+ *   Return true to stop propagation of this event. If you return false, the key event will be sent
+ *   to this [onPreviewKeyEvent]'s child. If none of the children consume the event, it will be sent
+ *   back up to the root [KeyInputModifierNode] using the onKeyEvent callback.
  *
  * @sample androidx.compose.ui.samples.KeyEventSample
  */
-fun Modifier.onPreviewKeyEvent(
-    onPreviewKeyEvent: (KeyEvent) -> Boolean
-): Modifier = this then KeyInputElement(onKeyEvent = null, onPreKeyEvent = onPreviewKeyEvent)
+fun Modifier.onPreviewKeyEvent(onPreviewKeyEvent: (KeyEvent) -> Boolean): Modifier =
+    this then KeyInputElement(onKeyEvent = null, onPreKeyEvent = onPreviewKeyEvent)
 
 private data class KeyInputElement(
     val onKeyEvent: ((KeyEvent) -> Boolean)?,
@@ -78,5 +76,6 @@
     var onPreEvent: ((KeyEvent) -> Boolean)?
 ) : KeyInputModifierNode, Modifier.Node() {
     override fun onKeyEvent(event: KeyEvent): Boolean = this.onEvent?.invoke(event) ?: false
+
     override fun onPreKeyEvent(event: KeyEvent): Boolean = this.onPreEvent?.invoke(event) ?: false
 }
diff --git a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/input/key/KeyInputModifierNode.kt b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/input/key/KeyInputModifierNode.kt
index 550c5c4..12b14c1 100644
--- a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/input/key/KeyInputModifierNode.kt
+++ b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/input/key/KeyInputModifierNode.kt
@@ -30,18 +30,18 @@
 interface KeyInputModifierNode : DelegatableNode {
 
     /**
-     * This function is called when a [KeyEvent] is received by this node during the upward
-     * pass. While implementing this callback, return true to stop propagation of this event. If you
+     * This function is called when a [KeyEvent] is received by this node during the upward pass.
+     * While implementing this callback, return true to stop propagation of this event. If you
      * return false, the key event will be sent to this [KeyInputModifierNode]'s parent.
      */
     fun onKeyEvent(event: KeyEvent): Boolean
 
     /**
-     * This function is called when a [KeyEvent] is received by this node during the
-     * downward pass. It gives ancestors of a focused component the chance to intercept an event.
-     * Return true to stop propagation of this event. If you return false, the event will be sent
-     * to this [KeyInputModifierNode]'s child. If none of the children consume the event,
-     * it will be sent back up to the root using the [onKeyEvent] function.
+     * This function is called when a [KeyEvent] is received by this node during the downward pass.
+     * It gives ancestors of a focused component the chance to intercept an event. Return true to
+     * stop propagation of this event. If you return false, the event will be sent to this
+     * [KeyInputModifierNode]'s child. If none of the children consume the event, it will be sent
+     * back up to the root using the [onKeyEvent] function.
      */
     fun onPreKeyEvent(event: KeyEvent): Boolean
 }
diff --git a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/input/key/SoftKeyboardInterceptionModifierNode.kt b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/input/key/SoftKeyboardInterceptionModifierNode.kt
index ceec4f7..833803e 100644
--- a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/input/key/SoftKeyboardInterceptionModifierNode.kt
+++ b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/input/key/SoftKeyboardInterceptionModifierNode.kt
@@ -23,32 +23,31 @@
 /**
  * Implement this interface to create a [Modifier.Node] that can intercept hardware Key events
  * before they are sent to the software keyboard. This can be used to intercept key input from a
- * DPad, or physical keyboard connected to the device and is not applicable to input that is sent
- * to the soft keyboard via spell check or autocomplete.
+ * DPad, or physical keyboard connected to the device and is not applicable to input that is sent to
+ * the soft keyboard via spell check or autocomplete.
  *
  * The event is routed to the focused item. Before reaching the focused item,
- * [onPreInterceptKeyBeforeSoftKeyboard] is called for parents of the focused item.
- * If the parents don't consume the event, [onPreSoftwareKeyboardKeyEvent]() is
- * called for the focused item. If the event is still not consumed,
- * [onInterceptKeyBeforeSoftKeyboard] is called on the focused item's parents.
+ * [onPreInterceptKeyBeforeSoftKeyboard] is called for parents of the focused item. If the parents
+ * don't consume the event, [onPreSoftwareKeyboardKeyEvent]() is called for the focused item. If the
+ * event is still not consumed, [onInterceptKeyBeforeSoftKeyboard] is called on the focused item's
+ * parents.
  */
 @ExperimentalComposeUiApi
 interface SoftKeyboardInterceptionModifierNode : DelegatableNode {
     /**
-     * This function is called when a [KeyEvent] is received by this node during the upward
-     * pass. While implementing this callback, return true to stop propagation of this event.
-     * If you return false, the key event will be sent to this
-     * [SoftKeyboardInterceptionModifierNode]'s parent.
+     * This function is called when a [KeyEvent] is received by this node during the upward pass.
+     * While implementing this callback, return true to stop propagation of this event. If you
+     * return false, the key event will be sent to this [SoftKeyboardInterceptionModifierNode]'s
+     * parent.
      */
     fun onInterceptKeyBeforeSoftKeyboard(event: KeyEvent): Boolean
 
     /**
-     * This function is called when a [KeyEvent] is received by this node during the
-     * downward pass. It gives ancestors of a focused component the chance to intercept an event.
-     * Return true to stop propagation of this event. If you return false, the event will be sent
-     * to this [SoftKeyboardInterceptionModifierNode]'s child. If none of the children consume
-     * the event, it will be sent back up to the root using the [onPreInterceptKeyBeforeSoftKeyboard]
-     * function.
+     * This function is called when a [KeyEvent] is received by this node during the downward pass.
+     * It gives ancestors of a focused component the chance to intercept an event. Return true to
+     * stop propagation of this event. If you return false, the event will be sent to this
+     * [SoftKeyboardInterceptionModifierNode]'s child. If none of the children consume the event, it
+     * will be sent back up to the root using the [onPreInterceptKeyBeforeSoftKeyboard] function.
      */
     fun onPreInterceptKeyBeforeSoftKeyboard(event: KeyEvent): Boolean
 }
diff --git a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/input/key/SoftwareKeyboardInterceptionModifier.kt b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/input/key/SoftwareKeyboardInterceptionModifier.kt
index 6c2ea62..ea7075b 100644
--- a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/input/key/SoftwareKeyboardInterceptionModifier.kt
+++ b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/input/key/SoftwareKeyboardInterceptionModifier.kt
@@ -22,59 +22,61 @@
 import androidx.compose.ui.platform.InspectorInfo
 
 /**
- * Adding this [modifier][Modifier] to the [modifier][Modifier] parameter of a component will
- * allow it to intercept hardware key events before they are sent to the software keyboard. This
- * can be used to intercept key input from a DPad, or physical keyboard connected to the device and
- * is not applicable to input that is sent to the soft keyboard via spell check or autocomplete.
+ * Adding this [modifier][Modifier] to the [modifier][Modifier] parameter of a component will allow
+ * it to intercept hardware key events before they are sent to the software keyboard. This can be
+ * used to intercept key input from a DPad, or physical keyboard connected to the device and is not
+ * applicable to input that is sent to the soft keyboard via spell check or autocomplete.
  *
- * @param onInterceptKeyBeforeSoftKeyboard This callback is invoked when the user interacts with
- * the hardware keyboard. While implementing this callback, return true to stop propagation of this
- * event. If you return false, the key event will be sent to this
- * [SoftKeyboardInterceptionModifierNode]'s parent, and ultimately to the software keyboard.
+ * @param onInterceptKeyBeforeSoftKeyboard This callback is invoked when the user interacts with the
+ *   hardware keyboard. While implementing this callback, return true to stop propagation of this
+ *   event. If you return false, the key event will be sent to this
+ *   [SoftKeyboardInterceptionModifierNode]'s parent, and ultimately to the software keyboard.
  *
  * @sample androidx.compose.ui.samples.KeyEventSample
  */
 @ExperimentalComposeUiApi
 fun Modifier.onInterceptKeyBeforeSoftKeyboard(
     onInterceptKeyBeforeSoftKeyboard: (KeyEvent) -> Boolean
-): Modifier = this then SoftKeyboardInterceptionElement(
-    onKeyEvent = onInterceptKeyBeforeSoftKeyboard,
-    onPreKeyEvent = null
-)
+): Modifier =
+    this then
+        SoftKeyboardInterceptionElement(
+            onKeyEvent = onInterceptKeyBeforeSoftKeyboard,
+            onPreKeyEvent = null
+        )
 
 /**
- * Adding this [modifier][Modifier] to the [modifier][Modifier] parameter of a component will
- * allow it to intercept hardware key events before they are sent to the software keyboard. This
- * can be used to intercept key input from a DPad, or physical keyboard connected to the device and
- * is not applicable to input that is sent to the soft keyboard via spell check or autocomplete.
- * This modifier is similar to [onInterceptKeyBeforeSoftKeyboard], but allows a parent composable
- * to intercept the hardware key event before any child.
+ * Adding this [modifier][Modifier] to the [modifier][Modifier] parameter of a component will allow
+ * it to intercept hardware key events before they are sent to the software keyboard. This can be
+ * used to intercept key input from a DPad, or physical keyboard connected to the device and is not
+ * applicable to input that is sent to the soft keyboard via spell check or autocomplete. This
+ * modifier is similar to [onInterceptKeyBeforeSoftKeyboard], but allows a parent composable to
+ * intercept the hardware key event before any child.
  *
- * @param onPreInterceptKeyBeforeSoftKeyboard This callback is invoked when the user interacts
- * with the hardware keyboard. It gives ancestors of a focused component the chance to intercept a
- * [KeyEvent]. Return true to stop propagation of this event. If you return false, the key event
- * will be sent to this [SoftKeyboardInterceptionModifierNode]'s child. If none of the children
- * consume the event, it will be sent back up to the root [KeyInputModifierNode] using the
- * onKeyEvent callback, and ultimately to the software keyboard.
+ * @param onPreInterceptKeyBeforeSoftKeyboard This callback is invoked when the user interacts with
+ *   the hardware keyboard. It gives ancestors of a focused component the chance to intercept a
+ *   [KeyEvent]. Return true to stop propagation of this event. If you return false, the key event
+ *   will be sent to this [SoftKeyboardInterceptionModifierNode]'s child. If none of the children
+ *   consume the event, it will be sent back up to the root [KeyInputModifierNode] using the
+ *   onKeyEvent callback, and ultimately to the software keyboard.
  *
  * @sample androidx.compose.ui.samples.KeyEventSample
  */
 @ExperimentalComposeUiApi
 fun Modifier.onPreInterceptKeyBeforeSoftKeyboard(
     onPreInterceptKeyBeforeSoftKeyboard: (KeyEvent) -> Boolean,
-): Modifier = this then SoftKeyboardInterceptionElement(
-    onKeyEvent = null,
-    onPreKeyEvent = onPreInterceptKeyBeforeSoftKeyboard
-)
+): Modifier =
+    this then
+        SoftKeyboardInterceptionElement(
+            onKeyEvent = null,
+            onPreKeyEvent = onPreInterceptKeyBeforeSoftKeyboard
+        )
 
 private data class SoftKeyboardInterceptionElement(
     val onKeyEvent: ((KeyEvent) -> Boolean)?,
     val onPreKeyEvent: ((KeyEvent) -> Boolean)?
 ) : ModifierNodeElement<InterceptedKeyInputNode>() {
-    override fun create() = InterceptedKeyInputNode(
-        onEvent = onKeyEvent,
-        onPreEvent = onPreKeyEvent
-    )
+    override fun create() =
+        InterceptedKeyInputNode(onEvent = onKeyEvent, onPreEvent = onPreKeyEvent)
 
     override fun update(node: InterceptedKeyInputNode) {
         node.onEvent = onKeyEvent
@@ -100,6 +102,7 @@
 ) : SoftKeyboardInterceptionModifierNode, Modifier.Node() {
     override fun onInterceptKeyBeforeSoftKeyboard(event: KeyEvent): Boolean =
         onEvent?.invoke(event) ?: false
+
     override fun onPreInterceptKeyBeforeSoftKeyboard(event: KeyEvent): Boolean =
         onPreEvent?.invoke(event) ?: false
 }
diff --git a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/input/nestedscroll/NestedScrollModifier.kt b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/input/nestedscroll/NestedScrollModifier.kt
index 3672fd2..55dfc8f 100644
--- a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/input/nestedscroll/NestedScrollModifier.kt
+++ b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/input/nestedscroll/NestedScrollModifier.kt
@@ -28,13 +28,13 @@
 /**
  * Interface to connect to the nested scroll system.
  *
- * Pass this connection to the [nestedScroll] modifier to participate in the nested scroll
- * hierarchy and to receive nested scroll events when they are dispatched by the scrolling child
- * (scrolling child - the element that actually receives scrolling events and dispatches them via
+ * Pass this connection to the [nestedScroll] modifier to participate in the nested scroll hierarchy
+ * and to receive nested scroll events when they are dispatched by the scrolling child (scrolling
+ * child - the element that actually receives scrolling events and dispatches them via
  * [NestedScrollDispatcher]).
  *
- * @see NestedScrollDispatcher to learn how to dispatch nested scroll events to become a
- * scrolling child
+ * @see NestedScrollDispatcher to learn how to dispatch nested scroll events to become a scrolling
+ *   child
  * @see nestedScroll to attach this connection to the nested scroll system
  */
 @JvmDefaultWithCompatibility
@@ -46,10 +46,8 @@
      *
      * @param available the delta available to consume for pre scroll
      * @param source the source of the scroll event
-     *
-     * @see NestedScrollSource
-     *
      * @return the amount this connection consumed
+     * @see NestedScrollSource
      */
     fun onPreScroll(available: Offset, source: NestedScrollSource): Offset = Offset.Zero
 
@@ -60,24 +58,18 @@
      * @param consumed the amount that was consumed by all nested scroll nodes below the hierarchy
      * @param available the amount of delta available for this connection to consume
      * @param source source of the scroll
-     *
-     * @see NestedScrollSource
-     *
      * @return the amount that was consumed by this connection
+     * @see NestedScrollSource
      */
-    fun onPostScroll(
-        consumed: Offset,
-        available: Offset,
-        source: NestedScrollSource
-    ): Offset = Offset.Zero
+    fun onPostScroll(consumed: Offset, available: Offset, source: NestedScrollSource): Offset =
+        Offset.Zero
 
     /**
-     * Pre fling event chain. Called by children when they are about to perform fling to
-     * allow parents to intercept and consume part of the initial velocity
+     * Pre fling event chain. Called by children when they are about to perform fling to allow
+     * parents to intercept and consume part of the initial velocity
      *
-     * @param available the velocity which is available to pre consume and with which the child
-     * is about to fling
-     *
+     * @param available the velocity which is available to pre consume and with which the child is
+     *   about to fling
      * @return the amount this connection wants to consume and take from the child
      */
     suspend fun onPreFling(available: Velocity): Velocity = Velocity.Zero
@@ -88,7 +80,7 @@
      *
      * @param consumed the amount of velocity consumed by the child
      * @param available the amount of velocity left for a parent to fling after the child (if
-     * desired)
+     *   desired)
      * @return the amount of velocity consumed by the fling operation in this connection
      */
     suspend fun onPostFling(consumed: Velocity, available: Velocity): Velocity {
@@ -100,8 +92,8 @@
  * Nested scroll events dispatcher to notify the nested scroll system about the scrolling events
  * that are happening on the element.
  *
- * If the element/modifier itself is able to receive scroll events (from the touch, fling,
- * mouse, etc) and it would like to respect nested scrolling by notifying elements above, it should
+ * If the element/modifier itself is able to receive scroll events (from the touch, fling, mouse,
+ * etc) and it would like to respect nested scrolling by notifying elements above, it should
  * properly dispatch nested scroll events when being scrolled
  *
  * It is important to dispatch these events at the right time, provide valid information to the
@@ -133,19 +125,21 @@
      * [IllegalStateException].
      *
      * @throws IllegalStateException when this field is accessed before the [nestedScroll] modifier
-     * with this [NestedScrollDispatcher] provided knows its nested scroll parent. Should be safe
-     * to access after the initial composition commits.
+     *   with this [NestedScrollDispatcher] provided knows its nested scroll parent. Should be safe
+     *   to access after the initial composition commits.
      */
     val coroutineScope: CoroutineScope
         /**
-         * @throws IllegalStateException when this field is accessed before the [nestedScroll] modifier
-         * with this [NestedScrollDispatcher] provided knows its nested scroll parent. Should be safe
-         * to access after the initial composition commits.
+         * @throws IllegalStateException when this field is accessed before the [nestedScroll]
+         *   modifier with this [NestedScrollDispatcher] provided knows its nested scroll parent.
+         *   Should be safe to access after the initial composition commits.
          */
-        get() = calculateNestedScrollScope.invoke() ?: throw IllegalStateException(
-            "in order to access nested coroutine scope you need to attach dispatcher to the " +
-                "`Modifier.nestedScroll` first."
-        )
+        get() =
+            calculateNestedScrollScope.invoke()
+                ?: throw IllegalStateException(
+                    "in order to access nested coroutine scope you need to attach dispatcher to the " +
+                        "`Modifier.nestedScroll` first."
+                )
 
     /**
      * Parent to be set when attached to nested scrolling chain. `null` is valid and means there no
@@ -160,9 +154,8 @@
      *
      * @param available the delta arrived from a scroll event
      * @param source the source of the scroll event
-     *
      * @return total delta that is pre-consumed by all ancestors in the chain. This delta is
-     * unavailable for this node to consume, so it should adjust the consumption accordingly
+     *   unavailable for this node to consume, so it should adjust the consumption accordingly
      */
     fun dispatchPreScroll(available: Offset, source: NestedScrollSource): Offset {
         return parent?.onPreScroll(available, source) ?: Offset.Zero
@@ -170,14 +163,13 @@
 
     /**
      * Dispatch nested post-scrolling pass. This triggers [NestedScrollConnection.onPostScroll] on
-     * all the ancestors giving them possibility to react of the scroll deltas that are left
-     * after the dispatching node itself and other [NestedScrollConnection]s below consumed the
-     * desired amount.
+     * all the ancestors giving them possibility to react of the scroll deltas that are left after
+     * the dispatching node itself and other [NestedScrollConnection]s below consumed the desired
+     * amount.
      *
      * @param consumed the amount that this node consumed already
      * @param available the amount of delta left for ancestors
      * @param source source of the scroll
-     *
      * @return the amount of scroll that was consumed by all ancestors
      */
     fun dispatchPostScroll(
@@ -189,29 +181,27 @@
     }
 
     /**
-     * Dispatch pre fling pass and suspend until all the interested participants performed
-     * velocity pre consumption. This triggers [NestedScrollConnection.onPreFling] on all the
-     * ancestors giving them a possibility to react on the fling that is about to happen and
-     * consume part of the velocity.
+     * Dispatch pre fling pass and suspend until all the interested participants performed velocity
+     * pre consumption. This triggers [NestedScrollConnection.onPreFling] on all the ancestors
+     * giving them a possibility to react on the fling that is about to happen and consume part of
+     * the velocity.
      *
      * @param available velocity from the scroll evens that this node is about to fling with
-     *
      * @return total velocity that is pre-consumed by all ancestors in the chain. This velocity is
-     * unavailable for this node to consume, so it should adjust the consumption accordingly
+     *   unavailable for this node to consume, so it should adjust the consumption accordingly
      */
     suspend fun dispatchPreFling(available: Velocity): Velocity {
         return parent?.onPreFling(available) ?: Velocity.Zero
     }
 
     /**
-     * Dispatch post fling pass and suspend until all the interested participants performed
-     * velocity process. This triggers [NestedScrollConnection.onPostFling] on all the ancestors,
-     * giving them possibility to react of the velocity that is left after the dispatching node
-     * itself flung with the desired amount.
+     * Dispatch post fling pass and suspend until all the interested participants performed velocity
+     * process. This triggers [NestedScrollConnection.onPostFling] on all the ancestors, giving them
+     * possibility to react of the velocity that is left after the dispatching node itself flung
+     * with the desired amount.
      *
      * @param consumed velocity already consumed by this node
      * @param available velocity that is left for ancestors to consume
-     *
      * @return velocity that has been consumed by all the ancestors
      */
     suspend fun dispatchPostFling(consumed: Velocity, available: Velocity): Velocity {
@@ -219,20 +209,15 @@
     }
 }
 
-/**
- * Possible sources of scroll events in the [NestedScrollConnection]
- */
+/** Possible sources of scroll events in the [NestedScrollConnection] */
 @kotlin.jvm.JvmInline
-value class NestedScrollSource internal constructor(
-    @Suppress("unused") private val value: Int
-) {
+value class NestedScrollSource internal constructor(@Suppress("unused") private val value: Int) {
     override fun toString(): String {
         @Suppress("DEPRECATION")
         return when (this) {
             UserInput -> "UserInput"
             SideEffect -> "SideEffect"
-            @OptIn(ExperimentalComposeUiApi::class)
-            Relocate -> "Relocate"
+            @OptIn(ExperimentalComposeUiApi::class) Relocate -> "Relocate"
             else -> "Invalid"
         }
     }
@@ -251,51 +236,46 @@
          */
         val SideEffect: NestedScrollSource = NestedScrollSource(2)
 
-        /**
-         * Dragging via mouse/touch/etc events.
-         */
+        /** Dragging via mouse/touch/etc events. */
         @Deprecated(
             "This has been replaced by UserInput.",
-            replaceWith = ReplaceWith(
-                "NestedScrollSource.UserInput",
-                "import androidx.compose.ui.input.nestedscroll." +
-                    "NestedScrollSource.Companion.UserInput"
-            )
+            replaceWith =
+                ReplaceWith(
+                    "NestedScrollSource.UserInput",
+                    "import androidx.compose.ui.input.nestedscroll." +
+                        "NestedScrollSource.Companion.UserInput"
+                )
         )
         val Drag: NestedScrollSource = UserInput
 
-        /**
-         * Flinging after the drag has ended with velocity.
-         */
+        /** Flinging after the drag has ended with velocity. */
         @Deprecated(
             "This has been replaced by SideEffect.",
-            replaceWith = ReplaceWith(
-                "NestedScrollSource.SideEffect",
-                "import androidx.compose.ui.input.nestedscroll." +
-                    "NestedScrollSource.Companion.SideEffect"
-            )
+            replaceWith =
+                ReplaceWith(
+                    "NestedScrollSource.SideEffect",
+                    "import androidx.compose.ui.input.nestedscroll." +
+                        "NestedScrollSource.Companion.SideEffect"
+                )
         )
         val Fling: NestedScrollSource = SideEffect
 
-        /**
-         * Relocating when a component asks parents to scroll to bring it into view.
-         */
+        /** Relocating when a component asks parents to scroll to bring it into view. */
         @Suppress("OPT_IN_MARKER_ON_WRONG_TARGET")
         @get:ExperimentalComposeUiApi
         @ExperimentalComposeUiApi
         @Deprecated("Do not use. Will be removed in the future.")
         val Relocate: NestedScrollSource = NestedScrollSource(3)
 
-        /**
-         * Scrolling via mouse wheel.
-         */
+        /** Scrolling via mouse wheel. */
         @Deprecated(
             "This has been replaced by UserInput.",
-            replaceWith = ReplaceWith(
-                "NestedScrollSource.UserInput",
-                "import androidx.compose.ui.input.nestedscroll." +
-                    "NestedScrollSource.Companion.UserInput"
-            )
+            replaceWith =
+                ReplaceWith(
+                    "NestedScrollSource.UserInput",
+                    "import androidx.compose.ui.input.nestedscroll." +
+                        "NestedScrollSource.Companion.UserInput"
+                )
         )
         val Wheel: NestedScrollSource = UserInput
     }
@@ -314,48 +294,45 @@
  * nested scrolling without being directly scrollable.
  *
  * Here's the collapsing toolbar example that participates in a chain, but doesn't dispatch:
+ *
  * @sample androidx.compose.ui.samples.NestedScrollConnectionSample
  *
  * On the other side, dispatch via [NestedScrollDispatcher] is optional. It's needed if a component
  * is able to receive and react to the drag/fling events and you want this components to be able to
  * notify parents when scroll occurs, resulting in better overall coordination.
  *
- * Here's the example of the component that is draggable and dispatches nested scroll to
- * participate in the nested scroll chain:
+ * Here's the example of the component that is draggable and dispatches nested scroll to participate
+ * in the nested scroll chain:
+ *
  * @sample androidx.compose.ui.samples.NestedScrollDispatcherSample
  *
  * **Note:** It is recommended to reuse [NestedScrollConnection] and [NestedScrollDispatcher]
- * objects
- * between recompositions since different object will cause nested scroll graph to be
+ * objects between recompositions since different object will cause nested scroll graph to be
  * recalculated unnecessary.
  *
  * There are 4 main phases in nested scrolling system:
- *
  * 1. Pre-scroll. This callback is triggered when the descendant is about to perform a scroll
- * operation and gives parent an opportunity to consume part of child's delta beforehand. This
- * pass should happen every time scrollable components receives delta and dispatches it via
- * [NestedScrollDispatcher]. Dispatching child should take into account how much all ancestors
- * above the hierarchy consumed and adjust the consumption accordingly.
- *
- * 2. Post-scroll. This callback is triggered when the descendant consumed the delta already
- * (after taking into account what parents pre-consumed in 1.) and wants to notify the ancestors
- * with the amount of delta unconsumed. This pass should happen every time scrollable components
- * receives delta and dispatches it via [NestedScrollDispatcher]. Any parent that receives
- * [NestedScrollConnection.onPostScroll] should consume no more than `left` and return the amount
- * consumed.
- *
- * 3. Pre-fling. Pass that happens when the scrolling descendant stopped dragging and about to
- * fling with the some velocity. This callback allows ancestors to consume part of the velocity.
- * This pass should happen before the fling itself happens. Similar to pre-scroll, parent can
- * consume part of the velocity and nodes below (including the dispatching child) should adjust
- * their logic to accommodate only the velocity left.
- *
+ *    operation and gives parent an opportunity to consume part of child's delta beforehand. This
+ *    pass should happen every time scrollable components receives delta and dispatches it via
+ *    [NestedScrollDispatcher]. Dispatching child should take into account how much all ancestors
+ *    above the hierarchy consumed and adjust the consumption accordingly.
+ * 2. Post-scroll. This callback is triggered when the descendant consumed the delta already (after
+ *    taking into account what parents pre-consumed in 1.) and wants to notify the ancestors with
+ *    the amount of delta unconsumed. This pass should happen every time scrollable components
+ *    receives delta and dispatches it via [NestedScrollDispatcher]. Any parent that receives
+ *    [NestedScrollConnection.onPostScroll] should consume no more than `left` and return the amount
+ *    consumed.
+ * 3. Pre-fling. Pass that happens when the scrolling descendant stopped dragging and about to fling
+ *    with the some velocity. This callback allows ancestors to consume part of the velocity. This
+ *    pass should happen before the fling itself happens. Similar to pre-scroll, parent can consume
+ *    part of the velocity and nodes below (including the dispatching child) should adjust their
+ *    logic to accommodate only the velocity left.
  * 4. Post-fling. Pass that happens after the scrolling descendant stopped flinging and wants to
- * notify ancestors about that fact, providing velocity left to consume as a part of this. This
- * pass should happen after the fling itself happens on the scrolling child. Ancestors of the
- * dispatching node will have opportunity to fling themselves with the `velocityLeft` provided.
- * Parent must call `notifySelfFinish` callback in order to continue the propagation of the
- * velocity that is left to ancestors above.
+ *    notify ancestors about that fact, providing velocity left to consume as a part of this. This
+ *    pass should happen after the fling itself happens on the scrolling child. Ancestors of the
+ *    dispatching node will have opportunity to fling themselves with the `velocityLeft` provided.
+ *    Parent must call `notifySelfFinish` callback in order to continue the propagation of the
+ *    velocity that is left to ancestors above.
  *
  * [androidx.compose.foundation.lazy.LazyColumn], [androidx.compose.foundation.verticalScroll] and
  * [androidx.compose.foundation.gestures.scrollable] have build in support for nested scrolling,
@@ -365,9 +342,9 @@
  * screen direction (x and y coordinates) rather than being locked to a specific orientation.
  *
  * @param connection connection to the nested scroll system to participate in the event chaining,
- * receiving events when scrollable descendant is being scrolled.
- * @param dispatcher object to be attached to the nested scroll system on which `dispatch*`
- * methods can be called to notify ancestors within nested scroll system about scrolling happening
+ *   receiving events when scrollable descendant is being scrolled.
+ * @param dispatcher object to be attached to the nested scroll system on which `dispatch*` methods
+ *   can be called to notify ancestors within nested scroll system about scrolling happening
  */
 fun Modifier.nestedScroll(
     connection: NestedScrollConnection,
diff --git a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/input/nestedscroll/NestedScrollNode.kt b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/input/nestedscroll/NestedScrollNode.kt
index c1a3460..432daec 100644
--- a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/input/nestedscroll/NestedScrollNode.kt
+++ b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/input/nestedscroll/NestedScrollNode.kt
@@ -25,8 +25,8 @@
 import kotlinx.coroutines.CoroutineScope
 
 /**
- * This creates a Nested Scroll Modifier node that can be delegated to. In most case you should
- * use [Modifier.nestedScroll] since that implementation also uses this. Use this factory to create
+ * This creates a Nested Scroll Modifier node that can be delegated to. In most case you should use
+ * [Modifier.nestedScroll] since that implementation also uses this. Use this factory to create
  * nodes that can be delegated to.
  */
 fun nestedScrollModifierNode(
@@ -36,9 +36,7 @@
     return NestedScrollNode(connection, dispatcher)
 }
 
-/**
- * NestedScroll using ModifierLocal as implementation.
- */
+/** NestedScroll using ModifierLocal as implementation. */
 internal class NestedScrollNode(
     var connection: NestedScrollConnection,
     dispatcher: NestedScrollDispatcher?
@@ -52,10 +50,7 @@
     }
 
     internal val parentNestedScrollNode: NestedScrollNode?
-        get() = if (isAttached)
-            findNearestAncestor()
-        else
-            null
+        get() = if (isAttached) findNearestAncestor() else null
 
     private val parentConnection: NestedScrollConnection?
         get() = if (isAttached) parentNestedScrollNode else null
@@ -63,17 +58,15 @@
     override val traverseKey: Any = "androidx.compose.ui.input.nestedscroll.NestedScrollNode"
 
     private val nestedCoroutineScope: CoroutineScope
-        get() = parentNestedScrollNode?.nestedCoroutineScope
-            ?: resolvedDispatcher.scope
-            ?: throw IllegalStateException(
-                "in order to access nested coroutine scope you need to attach dispatcher to the " +
-                    "`Modifier.nestedScroll` first."
-            )
+        get() =
+            parentNestedScrollNode?.nestedCoroutineScope
+                ?: resolvedDispatcher.scope
+                ?: throw IllegalStateException(
+                    "in order to access nested coroutine scope you need to attach dispatcher to the " +
+                        "`Modifier.nestedScroll` first."
+                )
 
-    override fun onPreScroll(
-        available: Offset,
-        source: NestedScrollSource
-    ): Offset {
+    override fun onPreScroll(available: Offset, source: NestedScrollSource): Offset {
         val parentPreConsumed = parentConnection?.onPreScroll(available, source) ?: Offset.Zero
         val selfPreConsumed = connection.onPreScroll(available - parentPreConsumed, source)
         return parentPreConsumed + selfPreConsumed
@@ -85,11 +78,12 @@
         source: NestedScrollSource
     ): Offset {
         val selfConsumed = connection.onPostScroll(consumed, available, source)
-        val parentConsumed = parentConnection?.onPostScroll(
-            consumed + selfConsumed,
-            available - selfConsumed,
-            source
-        ) ?: Offset.Zero
+        val parentConsumed =
+            parentConnection?.onPostScroll(
+                consumed + selfConsumed,
+                available - selfConsumed,
+                source
+            ) ?: Offset.Zero
         return selfConsumed + parentConsumed
     }
 
@@ -102,10 +96,9 @@
     override suspend fun onPostFling(consumed: Velocity, available: Velocity): Velocity {
 
         val selfConsumed = connection.onPostFling(consumed, available)
-        val parentConsumed = parentConnection?.onPostFling(
-            consumed + selfConsumed,
-            available - selfConsumed
-        ) ?: Velocity.Zero
+        val parentConsumed =
+            parentConnection?.onPostFling(consumed + selfConsumed, available - selfConsumed)
+                ?: Velocity.Zero
         return selfConsumed + parentConsumed
     }
 
@@ -139,8 +132,8 @@
     }
 
     /**
-     * If the node changes (onAttach) or if the dispatcher changes (node.update). We'll need
-     * to reset the dispatcher properties accordingly.
+     * If the node changes (onAttach) or if the dispatcher changes (node.update). We'll need to
+     * reset the dispatcher properties accordingly.
      */
     private fun updateDispatcherFields() {
         resolvedDispatcher.nestedScrollNode = this
@@ -151,8 +144,7 @@
     private fun resetDispatcherFields() {
         // only null this out if the modifier local node is what we set it to, since it is possible
         // it has already been reused in a different node
-        if (resolvedDispatcher.nestedScrollNode === this)
-            resolvedDispatcher.nestedScrollNode = null
+        if (resolvedDispatcher.nestedScrollNode === this) resolvedDispatcher.nestedScrollNode = null
     }
 
     internal fun updateNode(
diff --git a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/input/pointer/HitPathTracker.kt b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/input/pointer/HitPathTracker.kt
index d84b8d3..85e3814 100644
--- a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/input/pointer/HitPathTracker.kt
+++ b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/input/pointer/HitPathTracker.kt
@@ -38,7 +38,7 @@
  * [PointerInputChange]s can be dispatched to the [PointerInputFilter]s in a hierarchical fashion.
  *
  * @property rootCoordinates the root [LayoutCoordinates] that [PointerInputChange]s will be
- * relative to.
+ *   relative to.
  */
 internal class HitPathTracker(private val rootCoordinates: LayoutCoordinates) {
 
@@ -56,10 +56,10 @@
      * If [pointerInputNodes] is empty, nothing will be added.
      *
      * @param pointerId The id of the pointer that was hit tested against [PointerInputFilter]s
-     * @param pointerInputNodes The [PointerInputFilter]s that were hit by [pointerId].  Must be
-     * ordered from ancestor to descendant.
+     * @param pointerInputNodes The [PointerInputFilter]s that were hit by [pointerId]. Must be
+     *   ordered from ancestor to descendant.
      * @param prunePointerIdsAndChangesNotInNodesList Prune [PointerId]s (and associated changes)
-     * that are NOT in the pointerInputNodes parameter from the cached tree of ParentNode/Node.
+     *   that are NOT in the pointerInputNodes parameter from the cached tree of ParentNode/Node.
      */
     fun addHitPath(
         pointerId: PointerId,
@@ -74,9 +74,7 @@
             val pointerInputNode = pointerInputNodes[i]
 
             if (merging) {
-                val node = parent.children.firstOrNull {
-                    it.modifierNode == pointerInputNode
-                }
+                val node = parent.children.firstOrNull { it.modifierNode == pointerInputNode }
 
                 if (node != null) {
                     node.markIsIn()
@@ -93,9 +91,7 @@
                 }
             }
             // TODO(lmr): i wonder if Node here and PointerInputNode ought to be the same thing?
-            val node = Node(pointerInputNode).apply {
-                pointerIds.add(pointerId)
-            }
+            val node = Node(pointerInputNode).apply { pointerIds.add(pointerId) }
 
             val mutableObjectList =
                 hitPointerIdsAndNodes.getOrPut(pointerId.value) { mutableObjectListOf() }
@@ -125,28 +121,29 @@
      * Dispatches [internalPointerEvent] through the hierarchy.
      *
      * @param internalPointerEvent The change to dispatch.
-     *
      * @return whether this event was dispatched to a [PointerInputFilter]
      */
     fun dispatchChanges(
         internalPointerEvent: InternalPointerEvent,
         isInBounds: Boolean = true
     ): Boolean {
-        val changed = root.buildCache(
-            internalPointerEvent.changes,
-            rootCoordinates,
-            internalPointerEvent,
-            isInBounds
-        )
+        val changed =
+            root.buildCache(
+                internalPointerEvent.changes,
+                rootCoordinates,
+                internalPointerEvent,
+                isInBounds
+            )
         if (!changed) {
             return false
         }
-        var dispatchHit = root.dispatchMainEventPass(
-            internalPointerEvent.changes,
-            rootCoordinates,
-            internalPointerEvent,
-            isInBounds
-        )
+        var dispatchHit =
+            root.dispatchMainEventPass(
+                internalPointerEvent.changes,
+                rootCoordinates,
+                internalPointerEvent,
+                isInBounds
+            )
         dispatchHit = root.dispatchFinalEventPass(internalPointerEvent) || dispatchHit
 
         return dispatchHit
@@ -167,9 +164,7 @@
         clearPreviouslyHitModifierNodeCache()
     }
 
-    /**
-     * Removes detached Pointer Input Modifier Nodes.
-     */
+    /** Removes detached Pointer Input Modifier Nodes. */
     // TODO(shepshapard): Ideally, we can process the detaching of PointerInputFilters at the time
     //  that either their associated LayoutNode is removed from the three, or their
     //  associated PointerInputModifier is removed from a LayoutNode.
@@ -179,7 +174,7 @@
 }
 
 /**
- * Represents a parent node in the [HitPathTracker]'s tree.  This primarily exists because the tree
+ * Represents a parent node in the [HitPathTracker]'s tree. This primarily exists because the tree
  * necessarily has a root that is very similar to all other nodes, except that it does not track any
  * pointer or [PointerInputFilter] information.
  */
@@ -196,12 +191,9 @@
     ): Boolean {
         var changed = false
         children.forEach {
-            changed = it.buildCache(
-                changes,
-                parentCoordinates,
-                internalPointerEvent,
-                isInBounds
-            ) || changed
+            changed =
+                it.buildCache(changes, parentCoordinates, internalPointerEvent, isInBounds) ||
+                    changed
         }
         return changed
     }
@@ -212,10 +204,10 @@
      * [changes] and other properties needed in all passes should be cached inside this method so
      * they can be reused in [dispatchFinalEventPass], since the passes happen consecutively.
      *
-     * @param changes the map containing [PointerInputChange]s that will be dispatched to
-     * relevant [PointerInputFilter]s
-     * @param parentCoordinates the [LayoutCoordinates] the positional information in [changes]
-     * is relative to
+     * @param changes the map containing [PointerInputChange]s that will be dispatched to relevant
+     *   [PointerInputFilter]s
+     * @param parentCoordinates the [LayoutCoordinates] the positional information in [changes] is
+     *   relative to
      * @param internalPointerEvent the [InternalPointerEvent] needed to construct [PointerEvent]s
      */
     open fun dispatchMainEventPass(
@@ -226,12 +218,13 @@
     ): Boolean {
         var dispatched = false
         children.forEach {
-            dispatched = it.dispatchMainEventPass(
-                changes,
-                parentCoordinates,
-                internalPointerEvent,
-                isInBounds
-            ) || dispatched
+            dispatched =
+                it.dispatchMainEventPass(
+                    changes,
+                    parentCoordinates,
+                    internalPointerEvent,
+                    isInBounds
+                ) || dispatched
         }
         return dispatched
     }
@@ -251,16 +244,12 @@
         return dispatched
     }
 
-    /**
-     * Dispatches the cancel event to all child [Node]s.
-     */
+    /** Dispatches the cancel event to all child [Node]s. */
     open fun dispatchCancel() {
         children.forEach { it.dispatchCancel() }
     }
 
-    /**
-     * Removes all child nodes.
-     */
+    /** Removes all child nodes. */
     fun clear() {
         children.clear()
     }
@@ -269,14 +258,10 @@
         pointerIdValue: Long,
         hitNodes: MutableObjectList<Node>
     ) {
-        children.forEach {
-            it.removeInvalidPointerIdsAndChanges(pointerIdValue, hitNodes)
-        }
+        children.forEach { it.removeInvalidPointerIdsAndChanges(pointerIdValue, hitNodes) }
     }
 
-    /**
-     * Removes all child [Node]s that are no longer attached to the compose tree.
-     */
+    /** Removes all child [Node]s that are no longer attached to the compose tree. */
     fun removeDetachedPointerInputModifierNodes() {
         var index = 0
         while (index < children.size) {
@@ -341,9 +326,7 @@
             }
         }
 
-        children.forEach {
-            it.removeInvalidPointerIdsAndChanges(pointerIdValue, hitNodes)
-        }
+        children.forEach { it.removeInvalidPointerIdsAndChanges(pointerIdValue, hitNodes) }
     }
 
     override fun dispatchMainEventPass(
@@ -417,9 +400,9 @@
 
     /**
      * Calculates cached properties that will be stored in this [Node] for the duration of both
-     * [dispatchMainEventPass] and [dispatchFinalEventPass]. This allows us to avoid repeated
-     * work between passes, and within passes, as these properties won't change during the
-     * overall dispatch.
+     * [dispatchMainEventPass] and [dispatchFinalEventPass]. This allows us to avoid repeated work
+     * between passes, and within passes, as these properties won't change during the overall
+     * dispatch.
      *
      * @see clearCache
      */
@@ -430,19 +413,12 @@
         isInBounds: Boolean
     ): Boolean {
         val childChanged =
-            super.buildCache(
-                changes,
-                parentCoordinates,
-                internalPointerEvent,
-                isInBounds
-            )
+            super.buildCache(changes, parentCoordinates, internalPointerEvent, isInBounds)
 
         // Avoid future work if we know this node will no-op
         if (!modifierNode.isAttached) return true
 
-        modifierNode.dispatchForKind(Nodes.PointerInput) {
-            coordinates = it.layoutCoordinates
-        }
+        modifierNode.dispatchForKind(Nodes.PointerInput) { coordinates = it.layoutCoordinates }
 
         @OptIn(ExperimentalComposeUiApi::class)
         for (j in 0 until changes.size()) {
@@ -477,17 +453,16 @@
                         }
                     }
 
-                    relevantChanges.put(keyValue, change.copy(
-                        previousPosition = coordinates!!.localPositionOf(
-                            parentCoordinates,
-                            prevPosition
-                        ),
-                        currentPosition = coordinates!!.localPositionOf(
-                            parentCoordinates,
-                            currentPosition
-                        ),
-                        historical = historical
-                    ))
+                    relevantChanges.put(
+                        keyValue,
+                        change.copy(
+                            previousPosition =
+                                coordinates!!.localPositionOf(parentCoordinates, prevPosition),
+                            currentPosition =
+                                coordinates!!.localPositionOf(parentCoordinates, currentPosition),
+                            historical = historical
+                        )
+                    )
                 }
             }
         }
@@ -512,9 +487,8 @@
         }
         val event = PointerEvent(changesList, internalPointerEvent)
 
-        val activeHoverChange = event.changes.fastFirstOrNull {
-            internalPointerEvent.activeHoverEvent(it.id)
-        }
+        val activeHoverChange =
+            event.changes.fastFirstOrNull { internalPointerEvent.activeHoverEvent(it.id) }
 
         if (activeHoverChange != null) {
             if (!isInBounds) {
@@ -525,18 +499,18 @@
                 @Suppress("DEPRECATION")
                 isIn = !activeHoverChange.isOutOfBounds(size)
             }
-            if (isIn != wasIn &&
-                (
-                    event.type == PointerEventType.Move ||
+            if (
+                isIn != wasIn &&
+                    (event.type == PointerEventType.Move ||
                         event.type == PointerEventType.Enter ||
-                        event.type == PointerEventType.Exit
-                    )
+                        event.type == PointerEventType.Exit)
             ) {
-                event.type = if (isIn) {
-                    PointerEventType.Enter
-                } else {
-                    PointerEventType.Exit
-                }
+                event.type =
+                    if (isIn) {
+                        PointerEventType.Enter
+                    } else {
+                        PointerEventType.Exit
+                    }
             } else if (event.type == PointerEventType.Enter && wasIn && !hasExited) {
                 event.type = PointerEventType.Move // We already knew that it was in.
             } else if (event.type == PointerEventType.Exit && isIn && activeHoverChange.pressed) {
@@ -544,8 +518,10 @@
             }
         }
 
-        val changed = childChanged || event.type != PointerEventType.Move ||
-            hasPositionChanged(pointerEvent, event)
+        val changed =
+            childChanged ||
+                event.type != PointerEventType.Move ||
+                hasPositionChanged(pointerEvent, event)
         pointerEvent = event
         return changed
     }
@@ -565,8 +541,8 @@
     }
 
     /**
-     * Resets cached properties in case this node will continue to track different [pointerIds]
-     * than the ones we built the cache for, instead of being removed.
+     * Resets cached properties in case this node will continue to track different [pointerIds] than
+     * the ones we built the cache for, instead of being removed.
      *
      * @see buildCache
      */
@@ -580,9 +556,7 @@
      *
      * @return whether [block] was called
      */
-    private inline fun dispatchIfNeeded(
-        block: () -> Unit
-    ): Boolean {
+    private inline fun dispatchIfNeeded(block: () -> Unit): Boolean {
         // If there are no relevant changes, there is nothing to process so return false.
         if (relevantChanges.isEmpty()) return false
         // If the input filter is not attached, avoid dispatching
@@ -598,14 +572,11 @@
     //  essentially "no", but given that an order can be consistent... maybe we might as well
     //  set an arbitrary standard and stick to it so user expectations are maintained.
     /**
-     * Does a depth first traversal and invokes [PointerInputFilter.onCancel] during
-     * backtracking.
+     * Does a depth first traversal and invokes [PointerInputFilter.onCancel] during backtracking.
      */
     override fun dispatchCancel() {
         children.forEach { it.dispatchCancel() }
-        modifierNode.dispatchForKind(Nodes.PointerInput) {
-            it.onCancelPointerInput()
-        }
+        modifierNode.dispatchForKind(Nodes.PointerInput) { it.onCancelPointerInput() }
     }
 
     fun markIsIn() {
@@ -627,8 +598,7 @@
             val nonHoverEventStream = !internalPointerEvent.activeHoverEvent(change.id)
             val outsideArea = !isIn
 
-            val removePointerId =
-                (released && nonHoverEventStream) || (released && outsideArea)
+            val removePointerId = (released && nonHoverEventStream) || (released && outsideArea)
 
             if (removePointerId) {
                 pointerIds.remove(change.id)
diff --git a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/input/pointer/InternalPointerInput.kt b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/input/pointer/InternalPointerInput.kt
index 28b0bd7..7e4bcef 100644
--- a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/input/pointer/InternalPointerInput.kt
+++ b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/input/pointer/InternalPointerInput.kt
@@ -57,9 +57,9 @@
 /**
  * Represents a pointer input event internally.
  *
- * [PointerInputChange]s are stored in a map so that as this internal event traverses the tree,
- * it is efficient to split the changes between those that are relevant to the sub tree and those
- * that are not.
+ * [PointerInputChange]s are stored in a map so that as this internal event traverses the tree, it
+ * is efficient to split the changes between those that are relevant to the sub tree and those that
+ * are not.
  */
 @OptIn(InternalCoreApi::class)
 internal expect class InternalPointerEvent(
@@ -69,9 +69,10 @@
     val changes: LongSparseArray<PointerInputChange>
 
     /**
-     * Embedded Android Views may consume an event and [ProcessResult] should not
-     * return that the position change was consumed because of this.
+     * Embedded Android Views may consume an event and [ProcessResult] should not return that the
+     * position change was consumed because of this.
      */
     var suppressMovementConsumption: Boolean
+
     fun activeHoverEvent(pointerId: PointerId): Boolean
 }
diff --git a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/input/pointer/PointerEvent.kt b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/input/pointer/PointerEvent.kt
index 04a0bce..74065db 100644
--- a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/input/pointer/PointerEvent.kt
+++ b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/input/pointer/PointerEvent.kt
@@ -28,17 +28,15 @@
 import androidx.compose.ui.layout.LayoutCoordinates
 import androidx.compose.ui.unit.IntSize
 
-/**
- * A [Modifier.Element] that can interact with pointer input.
- */
+/** A [Modifier.Element] that can interact with pointer input. */
 @JvmDefaultWithCompatibility
 interface PointerInputModifier : Modifier.Element {
     val pointerInputFilter: PointerInputFilter
 }
 
 /**
- * A PointerInputFilter represents a single entity that receives [PointerInputChange]s),
- * interprets them, and consumes the aspects of the changes that it is react to such that other
+ * A PointerInputFilter represents a single entity that receives [PointerInputChange]s), interprets
+ * them, and consumes the aspects of the changes that it is react to such that other
  * PointerInputFilters don't also react to them.
  */
 abstract class PointerInputFilter {
@@ -50,22 +48,17 @@
      * [PointerInputChange.consume].
      *
      * @param pointerEvent The list of [PointerInputChange]s with positions relative to this
-     * [PointerInputFilter].
+     *   [PointerInputFilter].
      * @param pass The [PointerEventPass] in which this function is being called.
      * @param bounds The width and height associated with this [PointerInputFilter].
-     *
      * @see PointerInputChange
      * @see PointerEventPass
      */
-    abstract fun onPointerEvent(
-        pointerEvent: PointerEvent,
-        pass: PointerEventPass,
-        bounds: IntSize
-    )
+    abstract fun onPointerEvent(pointerEvent: PointerEvent, pass: PointerEventPass, bounds: IntSize)
 
     /**
      * Invoked to notify the handler that no more calls to [PointerInputFilter] will be made, until
-     * at least new pointers exist.  This can occur for a few reasons:
+     * at least new pointers exist. This can occur for a few reasons:
      * 1. Android dispatches ACTION_CANCEL to Compose.
      * 2. This [PointerInputFilter] is no longer associated with a LayoutNode.
      * 3. This [PointerInputFilter]'s associated LayoutNode is no longer in the composition tree.
@@ -74,9 +67,7 @@
 
     internal var layoutCoordinates: LayoutCoordinates? = null
 
-    /**
-     * The layout size assigned to this [PointerInputFilter].
-     */
+    /** The layout size assigned to this [PointerInputFilter]. */
     val size: IntSize
         get() = layoutCoordinates?.size ?: IntSize.Zero
 
@@ -85,55 +76,44 @@
     /**
      * Intercept pointer input that children receive even if the pointer is out of bounds.
      *
-     * If `true`, and a child has been moved out of this layout and receives an event, this
-     * will receive that event. If `false`, a child receiving pointer input outside of the
-     * bounds of this layout will not trigger any events in this.
+     * If `true`, and a child has been moved out of this layout and receives an event, this will
+     * receive that event. If `false`, a child receiving pointer input outside of the bounds of this
+     * layout will not trigger any events in this.
      */
     open val interceptOutOfBoundsChildEvents: Boolean
         get() = false
 
     /**
-     * If `false`, then this [PointerInputFilter] will not allow siblings under it to respond
-     * to events. If `true`, this will have the first chance to respond and the next sibling
-     * under will then get a chance to respond as well. This trigger acts at the Layout
-     * level, so if any [PointerInputFilter]s on a Layout has [shareWithSiblings] set to `true`
-     * then the Layout will share with siblings.
+     * If `false`, then this [PointerInputFilter] will not allow siblings under it to respond to
+     * events. If `true`, this will have the first chance to respond and the next sibling under will
+     * then get a chance to respond as well. This trigger acts at the Layout level, so if any
+     * [PointerInputFilter]s on a Layout has [shareWithSiblings] set to `true` then the Layout will
+     * share with siblings.
      */
     @Suppress("OPT_IN_MARKER_ON_WRONG_TARGET")
     open val shareWithSiblings: Boolean
         get() = false
 }
 
-/**
- * Describes a pointer input change event that has occurred at a particular point in time.
- */
-expect class PointerEvent internal constructor(
+/** Describes a pointer input change event that has occurred at a particular point in time. */
+expect class PointerEvent
+internal constructor(
     changes: List<PointerInputChange>,
     internalPointerEvent: InternalPointerEvent?
 ) {
-    /**
-     * @param changes The changes.
-     */
+    /** @param changes The changes. */
     constructor(changes: List<PointerInputChange>)
 
-    /**
-     * The changes.
-     */
+    /** The changes. */
     val changes: List<PointerInputChange>
 
-    /**
-     * The state of buttons (e.g. mouse or stylus buttons) during this event.
-     */
+    /** The state of buttons (e.g. mouse or stylus buttons) during this event. */
     val buttons: PointerButtons
 
-    /**
-     * The state of modifier keys during this event.
-     */
+    /** The state of modifier keys during this event. */
     val keyboardModifiers: PointerKeyboardModifiers
 
-    /**
-     * The primary reason the [PointerEvent] was sent.
-     */
+    /** The primary reason the [PointerEvent] was sent. */
     var type: PointerEventType
         internal set
 }
@@ -141,27 +121,23 @@
 // TODO mark internal once https://youtrack.jetbrains.com/issue/KT-36695 is fixed
 /* internal */ expect class NativePointerButtons
 
-/**
- * Contains the state of pointer buttons (e.g. mouse and stylus buttons).
- */
-@kotlin.jvm.JvmInline
-value class PointerButtons(internal val packedValue: NativePointerButtons)
+/** Contains the state of pointer buttons (e.g. mouse and stylus buttons). */
+@kotlin.jvm.JvmInline value class PointerButtons(internal val packedValue: NativePointerButtons)
 
 /**
- * `true` when the primary button (left mouse button) is pressed or `false` when
- * it isn't pressed.
+ * `true` when the primary button (left mouse button) is pressed or `false` when it isn't pressed.
  */
 expect val PointerButtons.isPrimaryPressed: Boolean
 
 /**
- * `true` when the secondary button (right mouse button) is pressed or `false` when
- * it isn't pressed.
+ * `true` when the secondary button (right mouse button) is pressed or `false` when it isn't
+ * pressed.
  */
 expect val PointerButtons.isSecondaryPressed: Boolean
 
 /**
- * `true` when the tertiary button (middle mouse button) is pressed or `false` when
- * it isn't pressed.
+ * `true` when the tertiary button (middle mouse button) is pressed or `false` when it isn't
+ * pressed.
  */
 expect val PointerButtons.isTertiaryPressed: Boolean
 
@@ -184,9 +160,7 @@
  */
 expect fun PointerButtons.isPressed(buttonIndex: Int): Boolean
 
-/**
- * Returns `true` if any button is pressed or `false` if all buttons are released.
- */
+/** Returns `true` if any button is pressed or `false` if all buttons are released. */
 expect val PointerButtons.areAnyPressed: Boolean
 
 /**
@@ -203,8 +177,8 @@
 /* internal */ expect class NativePointerKeyboardModifiers
 
 /**
- * Contains the state of modifier keys, such as Shift, Control, and Alt, as well as the state
- * of the lock keys, such as Caps Lock and Num Lock.
+ * Contains the state of modifier keys, such as Shift, Control, and Alt, as well as the state of the
+ * lock keys, such as Caps Lock and Num Lock.
  */
 @kotlin.jvm.JvmInline
 value class PointerKeyboardModifiers(internal val packedValue: NativePointerKeyboardModifiers)
@@ -212,14 +186,12 @@
 // helps initialize `WindowInfo.keyboardModifiers` with a non-null value
 internal expect fun EmptyPointerKeyboardModifiers(): PointerKeyboardModifiers
 
-/**
- * `true` when the Control key is pressed.
- */
+/** `true` when the Control key is pressed. */
 expect val PointerKeyboardModifiers.isCtrlPressed: Boolean
 
 /**
- * `true` when the Meta key is pressed. This is commonly associated with the Windows or Command
- * key on some keyboards.
+ * `true` when the Meta key is pressed. This is commonly associated with the Windows or Command key
+ * on some keyboards.
  */
 expect val PointerKeyboardModifiers.isMetaPressed: Boolean
 
@@ -229,200 +201,165 @@
  */
 expect val PointerKeyboardModifiers.isAltPressed: Boolean
 
-/**
- * `true` when the AltGraph key is pressed.
- */
+/** `true` when the AltGraph key is pressed. */
 expect val PointerKeyboardModifiers.isAltGraphPressed: Boolean
 
-/**
- * `true` when the Sym key is pressed.
- */
+/** `true` when the Sym key is pressed. */
 expect val PointerKeyboardModifiers.isSymPressed: Boolean
 
-/**
- * `true` when the Shift key is pressed.
- */
+/** `true` when the Shift key is pressed. */
 expect val PointerKeyboardModifiers.isShiftPressed: Boolean
 
-/**
- * `true` when the Function key is pressed.
- */
+/** `true` when the Function key is pressed. */
 expect val PointerKeyboardModifiers.isFunctionPressed: Boolean
 
-/**
- * `true` when the keyboard's Caps Lock is on.
- */
+/** `true` when the keyboard's Caps Lock is on. */
 expect val PointerKeyboardModifiers.isCapsLockOn: Boolean
 
-/**
- * `true` when the keyboard's Scroll Lock is on.
- */
+/** `true` when the keyboard's Scroll Lock is on. */
 expect val PointerKeyboardModifiers.isScrollLockOn: Boolean
 
-/**
- * `true` when the keyboard's Num Lock is on.
- */
+/** `true` when the keyboard's Num Lock is on. */
 expect val PointerKeyboardModifiers.isNumLockOn: Boolean
 
-/**
- * The device type that produces a [PointerInputChange], such as a mouse or stylus.
- */
+/** The device type that produces a [PointerInputChange], such as a mouse or stylus. */
 @kotlin.jvm.JvmInline
 value class PointerType private constructor(private val value: Int) {
 
-    override fun toString(): String = when (value) {
-        1 -> "Touch"
-        2 -> "Mouse"
-        3 -> "Stylus"
-        4 -> "Eraser"
-        else -> "Unknown"
-    }
+    override fun toString(): String =
+        when (value) {
+            1 -> "Touch"
+            2 -> "Mouse"
+            3 -> "Stylus"
+            4 -> "Eraser"
+            else -> "Unknown"
+        }
 
     companion object {
-        /**
-         * An unknown device type or the device type isn't relevant.
-         */
+        /** An unknown device type or the device type isn't relevant. */
         val Unknown = PointerType(0)
 
-        /**
-         * Touch (finger) input.
-         */
+        /** Touch (finger) input. */
         val Touch = PointerType(1)
 
-        /**
-         * A mouse pointer.
-         */
+        /** A mouse pointer. */
         val Mouse = PointerType(2)
 
-        /**
-         * A stylus.
-         */
+        /** A stylus. */
         val Stylus = PointerType(3)
 
-        /**
-         * An eraser or an inverted stylus.
-         */
+        /** An eraser or an inverted stylus. */
         val Eraser = PointerType(4)
     }
 }
 
-/**
- * Indicates the primary reason that the [PointerEvent] was sent.
- */
+/** Indicates the primary reason that the [PointerEvent] was sent. */
 @kotlin.jvm.JvmInline
 value class PointerEventType private constructor(internal val value: Int) {
     companion object {
-        /**
-         * An unknown reason for the event.
-         */
+        /** An unknown reason for the event. */
         val Unknown = PointerEventType(0)
 
-        /**
-         * A button on the device was pressed or a new pointer was detected.
-         */
+        /** A button on the device was pressed or a new pointer was detected. */
         val Press = PointerEventType(1)
 
-        /**
-         * A button on the device was released or a pointer was raised.
-         */
+        /** A button on the device was released or a pointer was raised. */
         val Release = PointerEventType(2)
 
-        /**
-         * The cursor or one or more touch pointers was moved.
-         */
+        /** The cursor or one or more touch pointers was moved. */
         val Move = PointerEventType(3)
 
         /**
          * The cursor has entered the input region. This will only be sent after the cursor is
          * hovering when in the input region.
          *
-         * For example, the user's cursor is outside the input region and presses the button
-         * prior to entering the input region. The [Enter] event will be sent when the button
-         * is released inside the input region.
+         * For example, the user's cursor is outside the input region and presses the button prior
+         * to entering the input region. The [Enter] event will be sent when the button is released
+         * inside the input region.
          */
         val Enter = PointerEventType(4)
 
         /**
-         * A cursor device or elevated stylus exited the input region. This will only follow
-         * an [Enter] event, so if a cursor with the button pressed enters and exits region,
-         * neither [Enter] nor [Exit] will be sent for the input region. However, if a cursor
-         * enters the input region, then a button is pressed, then the cursor exits and reenters,
-         * [Enter], [Exit], and [Enter] will be received.
+         * A cursor device or elevated stylus exited the input region. This will only follow an
+         * [Enter] event, so if a cursor with the button pressed enters and exits region, neither
+         * [Enter] nor [Exit] will be sent for the input region. However, if a cursor enters the
+         * input region, then a button is pressed, then the cursor exits and reenters, [Enter],
+         * [Exit], and [Enter] will be received.
          */
         val Exit = PointerEventType(5)
 
         /**
-         * A scroll event was sent. This can happen, for example, due to a mouse scroll wheel.
-         * This event indicates that the [PointerInputChange.scrollDelta]'s [Offset] is non-zero.
+         * A scroll event was sent. This can happen, for example, due to a mouse scroll wheel. This
+         * event indicates that the [PointerInputChange.scrollDelta]'s [Offset] is non-zero.
          */
         val Scroll = PointerEventType(6)
     }
 
-    override fun toString(): String = when (this) {
-        Press -> "Press"
-        Release -> "Release"
-        Move -> "Move"
-        Enter -> "Enter"
-        Exit -> "Exit"
-        Scroll -> "Scroll"
-        else -> "Unknown"
-    }
+    override fun toString(): String =
+        when (this) {
+            Press -> "Press"
+            Release -> "Release"
+            Move -> "Move"
+            Enter -> "Enter"
+            Exit -> "Exit"
+            Scroll -> "Scroll"
+            else -> "Unknown"
+        }
 }
 
 /**
  * Describes a change that has occurred for a particular pointer, as well as how much of the change
  * has been consumed (meaning, used by a node in the UI).
  *
- * The [position] represents the position of the pointer relative to the element that
- * this [PointerInputChange] is being dispatched to.
+ * The [position] represents the position of the pointer relative to the element that this
+ * [PointerInputChange] is being dispatched to.
  *
  * Note 1: A [PointerEvent]'s [PointerEventType] is the cause of an event and the associated
- * [PointerInputChange]'s properties reflecting that. Most of those are exclusive, in other words,
- * a Press/Release [PointerEventType] will not cause a scrollDelta change and a
- * Scroll [PointerEventType] will not cause a pressed or previousPressed change. However, either a
- * a Scroll or a Press/Release may contain a position change in its [PointerInputChange]s.
- * (You can imagine one finger moving while another is lifted up.)
+ * [PointerInputChange]'s properties reflecting that. Most of those are exclusive, in other words, a
+ * Press/Release [PointerEventType] will not cause a scrollDelta change and a Scroll
+ * [PointerEventType] will not cause a pressed or previousPressed change. However, either a a Scroll
+ * or a Press/Release may contain a position change in its [PointerInputChange]s. (You can imagine
+ * one finger moving while another is lifted up.)
  *
  * Examples of [PointerEventType] and the associated [PointerInputChange] property changes:
- *  - Press -> press will change (position may change) but scroll delta will not.
- *  - Release -> press will change (position may change) but scroll delta will not.
- *  - Move -> position will change but press and scroll delta will not.
- *  - Scroll -> scroll delta will change (position may change) but press will not.
+ * - Press -> press will change (position may change) but scroll delta will not.
+ * - Release -> press will change (position may change) but scroll delta will not.
+ * - Move -> position will change but press and scroll delta will not.
+ * - Scroll -> scroll delta will change (position may change) but press will not.
  *
  * Note 2: The [position] values can be outside the actual bounds of the element itself meaning the
  * numbers can be negative or larger than the element bounds.
  *
- * The [previousPosition] represents the position of the pointer offset to the current
- * position of the pointer relative to the screen.
+ * The [previousPosition] represents the position of the pointer offset to the current position of
+ * the pointer relative to the screen.
  *
- * This means that [position] and [previousPosition] can always be used to understand how
- * much a pointer has moved relative to an element, even if that element is moving along with the
- * changes to the pointer.  For example, if a pointer touches a 1x1 pixel box in the middle,
- * [position] will report a position of (0, 0) when dispatched to it.  If the next event
- * moves x position 5 pixels, [position] will report (5, 0) and [previousPosition] will
- * report (0, 0). If the box moves all 5 pixels, and the next event represents the pointer moving
- * along the x axis for 5 more pixels, [position] will again report (5, 0) and
- * [previousPosition] will report (0, 0).
+ * This means that [position] and [previousPosition] can always be used to understand how much a
+ * pointer has moved relative to an element, even if that element is moving along with the changes
+ * to the pointer. For example, if a pointer touches a 1x1 pixel box in the middle, [position] will
+ * report a position of (0, 0) when dispatched to it. If the next event moves x position 5 pixels,
+ * [position] will report (5, 0) and [previousPosition] will report (0, 0). If the box moves all 5
+ * pixels, and the next event represents the pointer moving along the x axis for 5 more pixels,
+ * [position] will again report (5, 0) and [previousPosition] will report (0, 0).
  *
  * @param id The unique id of the pointer associated with this [PointerInputChange].
  * @param uptimeMillis The time of the current pointer event, in milliseconds. The start (`0`) time
- * is platform-dependent
- * @param position The [Offset] of the current pointer event, relative to the containing
- * element (values can be negative or larger than the element bounds).
- * @param pressed `true` if the pointer event is considered "pressed." For example, finger
- * touching the screen or a mouse button is pressed [pressed] would be `true`.
+ *   is platform-dependent
+ * @param position The [Offset] of the current pointer event, relative to the containing element
+ *   (values can be negative or larger than the element bounds).
+ * @param pressed `true` if the pointer event is considered "pressed." For example, finger touching
+ *   the screen or a mouse button is pressed [pressed] would be `true`.
  * @param pressure The pressure of the of the pointer event
  * @param previousUptimeMillis The [uptimeMillis] of the previous pointer event
- * @param previousPosition The [Offset] of the previous pointer event, offset to the
- * [position] and relative to the containing element.
- * @param previousPressed `true` if the pointer event was considered "pressed." For example , if
- * a finger was touching the screen or a mouse button was pressed, [previousPressed] would be
- * `true`.
- * @param isInitiallyConsumed whether the change was consumed from the start or not. This value
- * can change over time as change is propagated through the pointer handlers. To query the
- * actual status of the change use [isConsumed]
- * @param type The device type that produced the event, such as [mouse][PointerType.Mouse],
- * or [touch][PointerType.Touch].git
+ * @param previousPosition The [Offset] of the previous pointer event, offset to the [position] and
+ *   relative to the containing element.
+ * @param previousPressed `true` if the pointer event was considered "pressed." For example , if a
+ *   finger was touching the screen or a mouse button was pressed, [previousPressed] would be
+ *   `true`.
+ * @param isInitiallyConsumed whether the change was consumed from the start or not. This value can
+ *   change over time as change is propagated through the pointer handlers. To query the actual
+ *   status of the change use [isConsumed]
+ * @param type The device type that produced the event, such as [mouse][PointerType.Mouse], or
+ *   [touch][PointerType.Touch].git
  * @param scrollDelta The amount of scroll wheel movement in the horizontal and vertical directions.
  */
 @Immutable
@@ -466,11 +403,12 @@
 
     @Deprecated(
         level = DeprecationLevel.HIDDEN,
-        replaceWith = ReplaceWith(
-            "this(id, uptimeMillis, position, pressed, previousUptimeMillis," +
-                " previousPosition, previousPressed," +
-                " consumed.downChange || consumed.positionChange, type, Offset.Zero)"
-        ),
+        replaceWith =
+            ReplaceWith(
+                "this(id, uptimeMillis, position, pressed, previousUptimeMillis," +
+                    " previousPosition, previousPressed," +
+                    " consumed.downChange || consumed.positionChange, type, Offset.Zero)"
+            ),
         message = "Use another constructor with `scrollDelta` and without `ConsumedData` instead"
     )
     @Suppress("DEPRECATION")
@@ -531,8 +469,8 @@
     }
 
     /**
-     * Optional high-frequency pointer moves in between the last two dispatched events.
-     * Can be used for extra accuracy when touchscreen rate exceeds framerate.
+     * Optional high-frequency pointer moves in between the last two dispatched events. Can be used
+     * for extra accuracy when touchscreen rate exceeds framerate.
      */
     // With these experimental annotations, the API can be either cleanly removed or
     // stabilized. It doesn't appear in current.txt; and in experimental_current.txt,
@@ -543,8 +481,7 @@
     val historical: List<HistoricalChange>
         get() = _historical ?: listOf()
 
-    @OptIn(ExperimentalComposeUiApi::class)
-    private var _historical: List<HistoricalChange>? = null
+    @OptIn(ExperimentalComposeUiApi::class) private var _historical: List<HistoricalChange>? = null
 
     internal var originalEventPosition: Offset = Offset.Zero
 
@@ -579,10 +516,11 @@
     @OptIn(ExperimentalComposeUiApi::class)
     @Deprecated(
         level = DeprecationLevel.HIDDEN,
-        replaceWith = ReplaceWith(
-            "copy(id,currentTime, currentPosition, currentPressed, previousTime," +
-                "previousPosition, previousPressed, consumed, type, this.scrollDelta)"
-        ),
+        replaceWith =
+            ReplaceWith(
+                "copy(id,currentTime, currentPosition, currentPressed, previousTime," +
+                    "previousPosition, previousPressed, consumed, type, this.scrollDelta)"
+            ),
         message = "Use another copy() method with scrollDelta parameter instead"
     )
     @Suppress("DEPRECATION")
@@ -596,23 +534,23 @@
         previousPressed: Boolean = this.previousPressed,
         consumed: ConsumedData = this.consumed,
         type: PointerType = this.type,
-    ): PointerInputChange = PointerInputChange(
-        id,
-        currentTime,
-        currentPosition,
-        currentPressed,
-        this.pressure,
-        previousTime,
-        previousPosition,
-        previousPressed,
-        consumed.downChange || consumed.positionChange,
-        type,
-        this.historical,
-        this.scrollDelta,
-        this.originalEventPosition,
-    ).also {
-        this.consumed = consumed
-    }
+    ): PointerInputChange =
+        PointerInputChange(
+                id,
+                currentTime,
+                currentPosition,
+                currentPressed,
+                this.pressure,
+                previousTime,
+                previousPosition,
+                previousPressed,
+                consumed.downChange || consumed.positionChange,
+                type,
+                this.historical,
+                this.scrollDelta,
+                this.originalEventPosition,
+            )
+            .also { this.consumed = consumed }
 
     /**
      * Make a shallow copy of the [PointerInputChange]
@@ -634,19 +572,20 @@
         previousPressed: Boolean = this.previousPressed,
         type: PointerType = this.type,
         scrollDelta: Offset = this.scrollDelta
-    ): PointerInputChange = copy(
-        id = id,
-        currentTime = currentTime,
-        currentPosition = currentPosition,
-        currentPressed = currentPressed,
-        pressure = this.pressure,
-        previousTime = previousTime,
-        previousPosition = previousPosition,
-        previousPressed = previousPressed,
-        type = type,
-        historical = this.historical,
-        scrollDelta = scrollDelta
-    )
+    ): PointerInputChange =
+        copy(
+            id = id,
+            currentTime = currentTime,
+            currentPosition = currentPosition,
+            currentPressed = currentPressed,
+            pressure = this.pressure,
+            previousTime = previousTime,
+            previousPosition = previousPosition,
+            previousPressed = previousPressed,
+            type = type,
+            historical = this.historical,
+            scrollDelta = scrollDelta
+        )
 
     @OptIn(ExperimentalComposeUiApi::class)
     @Suppress("DEPRECATION")
@@ -654,10 +593,11 @@
         "Partial consumption has been deprecated. Use copy() instead without `consumed` " +
             "parameter to create a shallow copy or a constructor to create a new " +
             "PointerInputChange",
-        replaceWith = ReplaceWith(
-            "copy(id, currentTime, currentPosition, currentPressed, previousTime, " +
-                "previousPosition, previousPressed, type, scrollDelta)"
-        )
+        replaceWith =
+            ReplaceWith(
+                "copy(id, currentTime, currentPosition, currentPressed, previousTime, " +
+                    "previousPosition, previousPressed, type, scrollDelta)"
+            )
     )
     fun copy(
         id: PointerId = this.id,
@@ -670,23 +610,23 @@
         consumed: ConsumedData,
         type: PointerType = this.type,
         scrollDelta: Offset = this.scrollDelta
-    ): PointerInputChange = PointerInputChange(
-        id,
-        currentTime,
-        currentPosition,
-        currentPressed,
-        this.pressure,
-        previousTime,
-        previousPosition,
-        previousPressed,
-        consumed.downChange || consumed.positionChange,
-        type,
-        this.historical,
-        scrollDelta,
-        this.originalEventPosition,
-    ).also {
-        this.consumed = consumed
-    }
+    ): PointerInputChange =
+        PointerInputChange(
+                id,
+                currentTime,
+                currentPosition,
+                currentPressed,
+                this.pressure,
+                previousTime,
+                previousPosition,
+                previousPressed,
+                consumed.downChange || consumed.positionChange,
+                type,
+                this.historical,
+                scrollDelta,
+                this.originalEventPosition,
+            )
+            .also { this.consumed = consumed }
 
     /**
      * Make a shallow copy of the [PointerInputChange]
@@ -709,23 +649,23 @@
         previousPressed: Boolean = this.previousPressed,
         type: PointerType = this.type,
         scrollDelta: Offset = this.scrollDelta
-    ): PointerInputChange = PointerInputChange(
-        id,
-        currentTime,
-        currentPosition,
-        currentPressed,
-        pressure,
-        previousTime,
-        previousPosition,
-        previousPressed,
-        isInitiallyConsumed = false, // doesn't matter, we will pass a holder anyway
-        type,
-        historical = this.historical,
-        scrollDelta,
-        this.originalEventPosition,
-    ).also {
-        it.consumed = this.consumed
-    }
+    ): PointerInputChange =
+        PointerInputChange(
+                id,
+                currentTime,
+                currentPosition,
+                currentPressed,
+                pressure,
+                previousTime,
+                previousPosition,
+                previousPressed,
+                isInitiallyConsumed = false, // doesn't matter, we will pass a holder anyway
+                type,
+                historical = this.historical,
+                scrollDelta,
+                this.originalEventPosition,
+            )
+            .also { it.consumed = this.consumed }
 
     /**
      * Make a shallow copy of the [PointerInputChange]
@@ -748,19 +688,20 @@
         type: PointerType = this.type,
         historical: List<HistoricalChange>,
         scrollDelta: Offset = this.scrollDelta
-    ): PointerInputChange = copy(
-        id = id,
-        currentTime = currentTime,
-        currentPosition = currentPosition,
-        currentPressed = currentPressed,
-        pressure = this.pressure,
-        previousTime = previousTime,
-        previousPosition = previousPosition,
-        previousPressed = previousPressed,
-        type = type,
-        historical = historical,
-        scrollDelta = scrollDelta
-    )
+    ): PointerInputChange =
+        copy(
+            id = id,
+            currentTime = currentTime,
+            currentPosition = currentPosition,
+            currentPressed = currentPressed,
+            pressure = this.pressure,
+            previousTime = previousTime,
+            previousPosition = previousPosition,
+            previousPressed = previousPressed,
+            type = type,
+            historical = historical,
+            scrollDelta = scrollDelta
+        )
 
     /**
      * Make a shallow copy of the [PointerInputChange]
@@ -784,23 +725,23 @@
         type: PointerType = this.type,
         historical: List<HistoricalChange> = this.historical,
         scrollDelta: Offset = this.scrollDelta
-    ): PointerInputChange = PointerInputChange(
-        id,
-        currentTime,
-        currentPosition,
-        currentPressed,
-        pressure,
-        previousTime,
-        previousPosition,
-        previousPressed,
-        isInitiallyConsumed = false, // doesn't matter, we will pass a holder anyway
-        type,
-        historical,
-        scrollDelta,
-        originalEventPosition = this.originalEventPosition,
-    ).also {
-        it.consumed = this.consumed
-    }
+    ): PointerInputChange =
+        PointerInputChange(
+                id,
+                currentTime,
+                currentPosition,
+                currentPressed,
+                pressure,
+                previousTime,
+                previousPosition,
+                previousPressed,
+                isInitiallyConsumed = false, // doesn't matter, we will pass a holder anyway
+                type,
+                historical,
+                scrollDelta,
+                originalEventPosition = this.originalEventPosition,
+            )
+            .also { it.consumed = this.consumed }
 
     @OptIn(ExperimentalComposeUiApi::class)
     override fun toString(): String {
@@ -822,20 +763,16 @@
 /**
  * Data structure for "historical" pointer moves.
  *
- * Optional high-frequency pointer moves in between the last two dispatched events:
- * can be used for extra accuracy when touchscreen rate exceeds framerate.
+ * Optional high-frequency pointer moves in between the last two dispatched events: can be used for
+ * extra accuracy when touchscreen rate exceeds framerate.
  *
- * @param uptimeMillis The time of the historical pointer event, in milliseconds. In between
- * the current and previous pointer event times.
- * @param position The [Offset] of the historical pointer event, relative to the containing
- * element.
+ * @param uptimeMillis The time of the historical pointer event, in milliseconds. In between the
+ *   current and previous pointer event times.
+ * @param position The [Offset] of the historical pointer event, relative to the containing element.
  */
 @Immutable
 @ExperimentalComposeUiApi
-class HistoricalChange(
-    val uptimeMillis: Long,
-    val position: Offset
-) {
+class HistoricalChange(val uptimeMillis: Long, val position: Offset) {
     internal var originalEventPosition: Offset = Offset.Zero
         private set
 
@@ -848,8 +785,7 @@
     }
 
     override fun toString(): String {
-        return "HistoricalChange(uptimeMillis=$uptimeMillis, " +
-            "position=$position)"
+        return "HistoricalChange(uptimeMillis=$uptimeMillis, " + "position=$position)"
     }
 }
 
@@ -858,8 +794,7 @@
  *
  * @param value The actual value of the id.
  */
-@kotlin.jvm.JvmInline
-value class PointerId(val value: Long)
+@kotlin.jvm.JvmInline value class PointerId(val value: Long)
 
 /**
  * Describes what aspects of a change has been consumed.
@@ -871,14 +806,17 @@
 class ConsumedData(
     @Suppress("GetterSetterNames")
     @get:Suppress("GetterSetterNames")
-    @Deprecated("Partial consumption was deprecated. Use PointerEvent.isConsumed " +
-        "and PointerEvent.consume() instead.")
+    @Deprecated(
+        "Partial consumption was deprecated. Use PointerEvent.isConsumed " +
+            "and PointerEvent.consume() instead."
+    )
     var positionChange: Boolean = false,
-
     @Suppress("GetterSetterNames")
     @get:Suppress("GetterSetterNames")
-    @Deprecated("Partial consumption was deprecated. Use PointerEvent.isConsumed " +
-        "and PointerEvent.consume() instead.")
+    @Deprecated(
+        "Partial consumption was deprecated. Use PointerEvent.isConsumed " +
+            "and PointerEvent.consume() instead."
+    )
     var downChange: Boolean = false
 )
 
@@ -886,44 +824,44 @@
  * The enumeration of passes where [PointerInputChange] traverses up and down the UI tree.
  *
  * PointerInputChanges traverse throw the hierarchy in the following passes:
- *
  * 1. [Initial]: Down the tree from ancestor to descendant.
  * 2. [Main]: Up the tree from descendant to ancestor.
  * 3. [Final]: Down the tree from ancestor to descendant.
  *
  * These passes serve the following purposes:
- *
- * 1. Initial: Allows ancestors to consume aspects of [PointerInputChange] before descendants.
- * This is where, for example, a scroller may block buttons from getting tapped by other fingers
- * once scrolling has started.
+ * 1. Initial: Allows ancestors to consume aspects of [PointerInputChange] before descendants. This
+ *    is where, for example, a scroller may block buttons from getting tapped by other fingers once
+ *    scrolling has started.
  * 2. Main: The primary pass where gesture filters should react to and consume aspects of
- * [PointerInputChange]s. This is the primary path where descendants will interact with
- * [PointerInputChange]s before parents. This allows for buttons to respond to a tap before a
- * container of the bottom to respond to a tap.
+ *    [PointerInputChange]s. This is the primary path where descendants will interact with
+ *    [PointerInputChange]s before parents. This allows for buttons to respond to a tap before a
+ *    container of the bottom to respond to a tap.
  * 3. Final: This pass is where children can learn what aspects of [PointerInputChange]s were
- * consumed by parents during the [Main] pass. For example, this is how a button determines that
- * it should no longer respond to fingers lifting off of it because a parent scroller has
- * consumed movement in a [PointerInputChange].
+ *    consumed by parents during the [Main] pass. For example, this is how a button determines that
+ *    it should no longer respond to fingers lifting off of it because a parent scroller has
+ *    consumed movement in a [PointerInputChange].
  */
 enum class PointerEventPass {
-    Initial, Main, Final
+    Initial,
+    Main,
+    Final
 }
 
 /**
- * True if this [PointerInputChange] represents a pointer coming in contact with the screen and
- * that change has not been consumed.
+ * True if this [PointerInputChange] represents a pointer coming in contact with the screen and that
+ * change has not been consumed.
  */
 fun PointerInputChange.changedToDown() = !isConsumed && !previousPressed && pressed
 
 /**
- * True if this [PointerInputChange] represents a pointer coming in contact with the screen,
- * whether or not that change has been consumed.
+ * True if this [PointerInputChange] represents a pointer coming in contact with the screen, whether
+ * or not that change has been consumed.
  */
 fun PointerInputChange.changedToDownIgnoreConsumed() = !previousPressed && pressed
 
 /**
- * True if this [PointerInputChange] represents a pointer breaking contact with the screen and
- * that change has not been consumed.
+ * True if this [PointerInputChange] represents a pointer breaking contact with the screen and that
+ * change has not been consumed.
  */
 fun PointerInputChange.changedToUp() = !isConsumed && previousPressed && !pressed
 
@@ -941,8 +879,8 @@
     this.positionChangeInternal(false) != Offset.Companion.Zero
 
 /**
- * True if this [PointerInputChange] represents a pointer moving on the screen ignoring how much
- * of that movement may have been consumed.
+ * True if this [PointerInputChange] represents a pointer moving on the screen ignoring how much of
+ * that movement may have been consumed.
  */
 fun PointerInputChange.positionChangedIgnoreConsumed() =
     this.positionChangeInternal(true) != Offset.Companion.Zero
@@ -953,8 +891,8 @@
 fun PointerInputChange.positionChange() = this.positionChangeInternal(false)
 
 /**
- * The distance that the pointer has moved on the screen, ignoring the fact that it might have
- * been consumed.
+ * The distance that the pointer has moved on the screen, ignoring the fact that it might have been
+ * consumed.
  */
 fun PointerInputChange.positionChangeIgnoreConsumed() = this.positionChangeInternal(true)
 
@@ -967,18 +905,14 @@
     return if (!ignoreConsumed && isConsumed) Offset.Zero else offset
 }
 
-/**
- * True if this [PointerInputChange]'s movement has been consumed.
- */
+/** True if this [PointerInputChange]'s movement has been consumed. */
 @Deprecated(
     "Partial consumption has been deprecated. Use isConsumed instead",
     replaceWith = ReplaceWith("isConsumed")
 )
 fun PointerInputChange.positionChangeConsumed() = isConsumed
 
-/**
- * True if any aspect of this [PointerInputChange] has been consumed.
- */
+/** True if any aspect of this [PointerInputChange] has been consumed. */
 @Deprecated(
     "Partial consumption has been deprecated. Use isConsumed instead",
     replaceWith = ReplaceWith("isConsumed")
@@ -999,9 +933,7 @@
     }
 }
 
-/**
- * Consume position change if there is any
- */
+/** Consume position change if there is any */
 @Deprecated(
     "Partial consumption has been deprecated. Use consume() instead.",
     replaceWith = ReplaceWith("if (positionChange() != Offset.Zero) consume()")
@@ -1012,18 +944,15 @@
     }
 }
 
-/**
- * Consumes all changes associated with the [PointerInputChange]
- */
+/** Consumes all changes associated with the [PointerInputChange] */
 @Deprecated("Use consume() instead", replaceWith = ReplaceWith("consume()"))
 fun PointerInputChange.consumeAllChanges() {
     consume()
 }
 
 /**
- * Returns `true` if the pointer has moved outside of the region of
- * `(0, 0, size.width, size.height)` or `false` if the current pointer is up or it is inside the
- * given bounds.
+ * Returns `true` if the pointer has moved outside of the region of `(0, 0, size.width,
+ * size.height)` or `false` if the current pointer is up or it is inside the given bounds.
  */
 @Deprecated(
     message = "Use isOutOfBounds() that supports minimum touch target",
@@ -1039,16 +968,15 @@
 }
 
 /**
- * Returns `true` if the pointer has moved outside of the pointer region. For Touch
- * events, this is (-extendedTouchPadding.width, -extendedTouchPadding.height,
- * size.width + extendedTouchPadding.width, size.height + extendedTouchPadding.height) and
- * for other events, this is `(0, 0, size.width, size.height)`. Returns`false` if the
- * current pointer is up or it is inside the pointer region.
+ * Returns `true` if the pointer has moved outside of the pointer region. For Touch events, this is
+ * (-extendedTouchPadding.width, -extendedTouchPadding.height, size.width +
+ * extendedTouchPadding.width, size.height + extendedTouchPadding.height) and for other events, this
+ * is `(0, 0, size.width, size.height)`. Returns`false` if the current pointer is up or it is inside
+ * the pointer region.
  */
 fun PointerInputChange.isOutOfBounds(size: IntSize, extendedTouchPadding: Size): Boolean {
     if (type != PointerType.Touch) {
-        @Suppress("DEPRECATION")
-        return isOutOfBounds(size)
+        @Suppress("DEPRECATION") return isOutOfBounds(size)
     }
     val position = position
     val x = position.x
diff --git a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/input/pointer/PointerIcon.kt b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/input/pointer/PointerIcon.kt
index 61e45fa..a7695fd 100644
--- a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/input/pointer/PointerIcon.kt
+++ b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/input/pointer/PointerIcon.kt
@@ -31,9 +31,7 @@
 import androidx.compose.ui.platform.LocalPointerIconService
 import androidx.compose.ui.unit.IntSize
 
-/**
- * Represents a pointer icon to use in [Modifier.pointerHoverIcon]
- */
+/** Represents a pointer icon to use in [Modifier.pointerHoverIcon] */
 @Stable
 interface PointerIcon {
 
@@ -64,27 +62,26 @@
 
 internal interface PointerIconService {
     fun getIcon(): PointerIcon
+
     fun setIcon(value: PointerIcon?)
 }
 
 /**
  * Modifier that lets a developer define a pointer icon to display when the cursor is hovered over
- * the element. When [overrideDescendants] is set to true, descendants cannot override the
- * pointer icon using this modifier.
+ * the element. When [overrideDescendants] is set to true, descendants cannot override the pointer
+ * icon using this modifier.
  *
  * @sample androidx.compose.ui.samples.PointerIconSample
  *
  * @param icon The icon to set
  * @param overrideDescendants when false (by default) descendants are able to set their own pointer
- * icon. If true, no descendants under this parent are eligible to change the icon (it will be set
- * to the this [the parent's] icon).
+ *   icon. If true, no descendants under this parent are eligible to change the icon (it will be set
+ *   to the this [the parent's] icon).
  */
 @Stable
 fun Modifier.pointerHoverIcon(icon: PointerIcon, overrideDescendants: Boolean = false) =
-    this then PointerHoverIconModifierElement(
-        icon = icon,
-        overrideDescendants = overrideDescendants
-    )
+    this then
+        PointerHoverIconModifierElement(icon = icon, overrideDescendants = overrideDescendants)
 
 internal data class PointerHoverIconModifierElement(
     val icon: PointerIcon,
@@ -116,7 +113,8 @@
 internal class PointerHoverIconModifierNode(
     icon: PointerIcon,
     overrideDescendants: Boolean = false
-) : Modifier.Node(),
+) :
+    Modifier.Node(),
     TraversableNode,
     PointerInputModifierNode,
     CompositionLocalConsumerModifierNode {
@@ -220,12 +218,13 @@
             traverseDescendants {
                 // Descendant in bounds has rights to the icon (and has already set it),
                 // so we ignore.
-                val continueTraversal = if (it.cursorInBoundsOfNode) {
-                    hasIconRightsOverDescendants = false
-                    TraverseDescendantsAction.CancelTraversal
-                } else {
-                    TraverseDescendantsAction.ContinueTraversal
-                }
+                val continueTraversal =
+                    if (it.cursorInBoundsOfNode) {
+                        hasIconRightsOverDescendants = false
+                        TraverseDescendantsAction.CancelTraversal
+                    } else {
+                        TraverseDescendantsAction.ContinueTraversal
+                    }
                 continueTraversal
             }
         }
@@ -282,9 +281,7 @@
         var pointerHoverIconModifierNode: PointerHoverIconModifierNode = this
 
         if (!overrideDescendants) {
-            findDescendantNodeWithCursorInBounds()?.let {
-                pointerHoverIconModifierNode = it
-            }
+            findDescendantNodeWithCursorInBounds()?.let { pointerHoverIconModifierNode = it }
         }
 
         pointerHoverIconModifierNode.displayIcon()
@@ -294,8 +291,7 @@
         var pointerHoverIconModifierNode: PointerHoverIconModifierNode? = null
 
         traverseAncestors {
-            if (it.overrideDescendants &&
-                it.cursorInBoundsOfNode) {
+            if (it.overrideDescendants && it.cursorInBoundsOfNode) {
                 pointerHoverIconModifierNode = it
             }
             // continue traversal
@@ -316,12 +312,14 @@
             if (pointerHoverIconModifierNode == null && it.cursorInBoundsOfNode) {
                 pointerHoverIconModifierNode = it
 
-            // We should only assign a node that override its descendants if there was a node
-            // below it where the mouse was in bounds meaning the pointerHoverIconModifierNode
-            // will not be null.
-            } else if (pointerHoverIconModifierNode != null &&
-                it.overrideDescendants &&
-                it.cursorInBoundsOfNode) {
+                // We should only assign a node that override its descendants if there was a node
+                // below it where the mouse was in bounds meaning the pointerHoverIconModifierNode
+                // will not be null.
+            } else if (
+                pointerHoverIconModifierNode != null &&
+                    it.overrideDescendants &&
+                    it.cursorInBoundsOfNode
+            ) {
                 pointerHoverIconModifierNode = it
             }
 
diff --git a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/input/pointer/PointerInputEventProcessor.kt b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/input/pointer/PointerInputEventProcessor.kt
index e514e78..27a010d 100644
--- a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/input/pointer/PointerInputEventProcessor.kt
+++ b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/input/pointer/PointerInputEventProcessor.kt
@@ -27,6 +27,7 @@
 
 internal interface PositionCalculator {
     fun screenToLocal(positionOnScreen: Offset): Offset
+
     fun localToScreen(localPosition: Offset): Offset
 
     /**
@@ -36,9 +37,7 @@
     fun localToScreen(localTransform: Matrix)
 }
 
-/**
- * The core element that receives [PointerInputEvent]s and process them in Compose UI.
- */
+/** The core element that receives [PointerInputEvent]s and process them in Compose UI. */
 internal class PointerInputEventProcessor(val root: LayoutNode) {
 
     private val hitPathTracker = HitPathTracker(root.coordinates)
@@ -46,8 +45,8 @@
     private val hitResult = HitTestResult()
 
     /**
-     * [process] doesn't currently support reentrancy. This prevents reentrant calls
-     * from causing a crash with an early exit.
+     * [process] doesn't currently support reentrancy. This prevents reentrant calls from causing a
+     * crash with an early exit.
      */
     private var isProcessing = false
 
@@ -55,15 +54,12 @@
      * Receives [PointerInputEvent]s and process them through the tree rooted on [root].
      *
      * @param pointerEvent The [PointerInputEvent] to process.
-     *
      * @return the result of processing.
-     *
      * @see ProcessResult
      * @see PointerInputEvent
      */
     fun process(
-        @OptIn(InternalCoreApi::class)
-        pointerEvent: PointerInputEvent,
+        @OptIn(InternalCoreApi::class) pointerEvent: PointerInputEvent,
         positionCalculator: PositionCalculator,
         isInBounds: Boolean = true
     ): ProcessResult {
@@ -106,7 +102,7 @@
                             // Note: We do not do this for hover because hover relies on those
                             // non hit PointerIds to trigger hover exit events.
                             prunePointerIdsAndChangesNotInNodesList =
-                            pointerInputChange.changedToDownIgnoreConsumed()
+                                pointerInputChange.changedToDownIgnoreConsumed()
                         )
                         hitResult.clear()
                     }
@@ -119,19 +115,20 @@
             val dispatchedToSomething =
                 hitPathTracker.dispatchChanges(internalPointerEvent, isInBounds)
 
-            val anyMovementConsumed = if (internalPointerEvent.suppressMovementConsumption) {
-                false
-            } else {
-                var result = false
-                for (i in 0 until internalPointerEvent.changes.size()) {
-                    val event = internalPointerEvent.changes.valueAt(i)
-                    if (event.positionChangedIgnoreConsumed() && event.isConsumed) {
-                        result = true
-                        break
+            val anyMovementConsumed =
+                if (internalPointerEvent.suppressMovementConsumption) {
+                    false
+                } else {
+                    var result = false
+                    for (i in 0 until internalPointerEvent.changes.size()) {
+                        val event = internalPointerEvent.changes.valueAt(i)
+                        if (event.positionChangedIgnoreConsumed() && event.isConsumed) {
+                            result = true
+                            break
+                        }
                     }
+                    result
                 }
-                result
-            }
 
             return ProcessResult(dispatchedToSomething, anyMovementConsumed)
         } finally {
@@ -164,16 +161,12 @@
     }
 }
 
-/**
- * Produces [InternalPointerEvent]s by tracking changes between [PointerInputEvent]s
- */
+/** Produces [InternalPointerEvent]s by tracking changes between [PointerInputEvent]s */
 @OptIn(InternalCoreApi::class, ExperimentalComposeUiApi::class)
 private class PointerInputChangeEventProducer {
     private val previousPointerInputData: LongSparseArray<PointerInputData> = LongSparseArray()
 
-    /**
-     * Produces [InternalPointerEvent]s by tracking changes between [PointerInputEvent]s
-     */
+    /** Produces [InternalPointerEvent]s by tracking changes between [PointerInputEvent]s */
     fun produce(
         pointerInputEvent: PointerInputEvent,
         positionCalculator: PositionCalculator
@@ -194,11 +187,11 @@
             } else {
                 previousTime = previousData.uptime
                 previousDown = previousData.down
-                previousPosition =
-                    positionCalculator.screenToLocal(previousData.positionOnScreen)
+                previousPosition = positionCalculator.screenToLocal(previousData.positionOnScreen)
             }
 
-            changes.put(it.id.value,
+            changes.put(
+                it.id.value,
                 PointerInputChange(
                     it.id,
                     it.uptime,
@@ -216,12 +209,10 @@
                 )
             )
             if (it.down) {
-                previousPointerInputData.put(it.id.value, PointerInputData(
-                    it.uptime,
-                    it.positionOnScreen,
-                    it.down,
-                    it.type
-                ))
+                previousPointerInputData.put(
+                    it.id.value,
+                    PointerInputData(it.uptime, it.positionOnScreen, it.down, it.type)
+                )
             } else {
                 previousPointerInputData.remove(it.id.value)
             }
@@ -230,9 +221,7 @@
         return InternalPointerEvent(changes, pointerInputEvent)
     }
 
-    /**
-     * Clears all tracked information.
-     */
+    /** Clears all tracked information. */
     fun clear() {
         previousPointerInputData.clear()
     }
@@ -245,9 +234,7 @@
     )
 }
 
-/**
- * The result of a call to [PointerInputEventProcessor.process].
- */
+/** The result of a call to [PointerInputEventProcessor.process]. */
 // TODO(shepshpard): Not sure if storing these values in a int is most efficient overall.
 @kotlin.jvm.JvmInline
 internal value class ProcessResult(private val value: Int) {
@@ -262,7 +249,7 @@
  * Constructs a new ProcessResult.
  *
  * @param dispatchedToAPointerInputModifier True if the dispatch resulted in at least 1
- * [PointerInputModifier] receiving the event.
+ *   [PointerInputModifier] receiving the event.
  * @param anyMovementConsumed True if any movement occurred and was consumed.
  */
 internal fun ProcessResult(
diff --git a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/input/pointer/PointerInputTestUtil.kt b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/input/pointer/PointerInputTestUtil.kt
index a1b543ad..3b7eacf 100644
--- a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/input/pointer/PointerInputTestUtil.kt
+++ b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/input/pointer/PointerInputTestUtil.kt
@@ -31,22 +31,21 @@
     y: Float = 0f,
     historicalData: List<HistoricalChange>? = null
 ): PointerInputChange {
-    val pointerInputChange = PointerInputChange(
-        PointerId(id),
-        durationMillis,
-        Offset(x, y),
-        true,
-        pressure = 1f,
-        durationMillis,
-        Offset(x, y),
-        false,
-        isInitiallyConsumed = false
-    )
+    val pointerInputChange =
+        PointerInputChange(
+            PointerId(id),
+            durationMillis,
+            Offset(x, y),
+            true,
+            pressure = 1f,
+            durationMillis,
+            Offset(x, y),
+            false,
+            isInitiallyConsumed = false
+        )
 
     if (!historicalData.isNullOrEmpty()) {
-        return pointerInputChange.copy(
-            historical = historicalData
-        )
+        return pointerInputChange.copy(historical = historicalData)
     }
 
     return pointerInputChange
@@ -94,9 +93,7 @@
         isInitiallyConsumed = false
     )
 
-/**
- * A function used to react to and modify [PointerInputChange]s.
- */
+/** A function used to react to and modify [PointerInputChange]s. */
 internal typealias PointerInputHandler = (PointerEvent, PointerEventPass, IntSize) -> Unit
 
 /**
@@ -106,15 +103,12 @@
 internal fun PointerInputHandler.invokeOverAllPasses(
     pointerEvent: PointerEvent,
     size: IntSize = IntSize(Int.MAX_VALUE, Int.MAX_VALUE)
-) = invokeOverPasses(
-    pointerEvent,
-    listOf(
-        PointerEventPass.Initial,
-        PointerEventPass.Main,
-        PointerEventPass.Final
-    ),
-    size = size
-)
+) =
+    invokeOverPasses(
+        pointerEvent,
+        listOf(PointerEventPass.Initial, PointerEventPass.Main, PointerEventPass.Final),
+        size = size
+    )
 
 // TODO(shepshapard): Rename to invokeOverPass
 /**
@@ -151,7 +145,5 @@
 ) {
     require(pointerEvent.changes.isNotEmpty()) { "invokeOverPasses called with no changes" }
     require(pointerEventPasses.isNotEmpty()) { "invokeOverPasses called with no passes" }
-    pointerEventPasses.fastForEach {
-        this.invoke(pointerEvent, it, size)
-    }
+    pointerEventPasses.fastForEach { this.invoke(pointerEvent, it, size) }
 }
diff --git a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/input/pointer/SuspendingPointerInputFilter.kt b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/input/pointer/SuspendingPointerInputFilter.kt
index 421f11a..929e693 100644
--- a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/input/pointer/SuspendingPointerInputFilter.kt
+++ b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/input/pointer/SuspendingPointerInputFilter.kt
@@ -52,18 +52,18 @@
  * Receiver scope for awaiting pointer events in a call to
  * [PointerInputScope.awaitPointerEventScope].
  *
- * This is a restricted suspension scope. Code in this scope is always called un-dispatched and
- * may only suspend for calls to [awaitPointerEvent]. These functions
- * resume synchronously and the caller may mutate the result **before** the next await call to
- * affect the next stage of the input processing pipeline.
+ * This is a restricted suspension scope. Code in this scope is always called un-dispatched and may
+ * only suspend for calls to [awaitPointerEvent]. These functions resume synchronously and the
+ * caller may mutate the result **before** the next await call to affect the next stage of the input
+ * processing pipeline.
  */
 @RestrictsSuspension
 @JvmDefaultWithCompatibility
 interface AwaitPointerEventScope : Density {
     /**
-     * The measured size of the pointer input region. Input events will be reported with
-     * a coordinate space of (0, 0) to (size.width, size,height) as the input region, with
-     * (0, 0) indicating the upper left corner.
+     * The measured size of the pointer input region. Input events will be reported with a
+     * coordinate space of (0, 0) to (size.width, size,height) as the input region, with (0, 0)
+     * indicating the upper left corner.
      */
     val size: IntSize
 
@@ -74,33 +74,27 @@
     val extendedTouchPadding: Size
         get() = Size.Zero
 
-    /**
-     * The [PointerEvent] from the most recent touch event.
-     */
+    /** The [PointerEvent] from the most recent touch event. */
     val currentEvent: PointerEvent
 
-    /**
-     * The [ViewConfiguration] used to tune gesture detectors.
-     */
+    /** The [ViewConfiguration] used to tune gesture detectors. */
     val viewConfiguration: ViewConfiguration
 
     /**
-     * Suspend until a [PointerEvent] is reported to the specified input [pass].
-     * [pass] defaults to [PointerEventPass.Main].
+     * Suspend until a [PointerEvent] is reported to the specified input [pass]. [pass] defaults to
+     * [PointerEventPass.Main].
      *
-     * [awaitPointerEvent] resumes **synchronously** in the restricted suspension scope. This
-     * means that callers can react immediately to input after [awaitPointerEvent] returns
-     * and affect both the current frame and the next handler or phase of the input processing
-     * pipeline. Callers should mutate the returned [PointerEvent] before awaiting
-     * another event to consume aspects of the event before the next stage of input processing runs.
+     * [awaitPointerEvent] resumes **synchronously** in the restricted suspension scope. This means
+     * that callers can react immediately to input after [awaitPointerEvent] returns and affect both
+     * the current frame and the next handler or phase of the input processing pipeline. Callers
+     * should mutate the returned [PointerEvent] before awaiting another event to consume aspects of
+     * the event before the next stage of input processing runs.
      */
-    suspend fun awaitPointerEvent(
-        pass: PointerEventPass = PointerEventPass.Main
-    ): PointerEvent
+    suspend fun awaitPointerEvent(pass: PointerEventPass = PointerEventPass.Main): PointerEvent
 
     /**
-     * Runs [block] and returns the result of [block] or `null` if [timeMillis] has passed
-     * before [timeMillis].
+     * Runs [block] and returns the result of [block] or `null` if [timeMillis] has passed before
+     * [timeMillis].
      */
     suspend fun <T> withTimeoutOrNull(
         timeMillis: Long,
@@ -130,30 +124,28 @@
 @JvmDefaultWithCompatibility
 interface PointerInputScope : Density {
     /**
-     * The measured size of the pointer input region. Input events will be reported with
-     * a coordinate space of (0, 0) to (size.width, size,height) as the input region, with
-     * (0, 0) indicating the upper left corner.
+     * The measured size of the pointer input region. Input events will be reported with a
+     * coordinate space of (0, 0) to (size.width, size,height) as the input region, with (0, 0)
+     * indicating the upper left corner.
      */
     val size: IntSize
 
     /**
-     * The additional space applied to each side of the layout area when the layout is smaller
-     * than [ViewConfiguration.minimumTouchTargetSize].
+     * The additional space applied to each side of the layout area when the layout is smaller than
+     * [ViewConfiguration.minimumTouchTargetSize].
      */
     val extendedTouchPadding: Size
         get() = Size.Zero
 
-    /**
-     * The [ViewConfiguration] used to tune gesture detectors.
-     */
+    /** The [ViewConfiguration] used to tune gesture detectors. */
     val viewConfiguration: ViewConfiguration
 
     /**
      * Intercept pointer input that children receive even if the pointer is out of bounds.
      *
-     * If `true`, and a child has been moved out of this layout and receives an event, this
-     * will receive that event. If `false`, a child receiving pointer input outside of the
-     * bounds of this layout will not trigger any events in this.
+     * If `true`, and a child has been moved out of this layout and receives an event, this will
+     * receive that event. If `false`, a child receiving pointer input outside of the bounds of this
+     * layout will not trigger any events in this.
      */
     @Suppress("GetterSetterNames")
     @get:Suppress("GetterSetterNames")
@@ -162,17 +154,15 @@
         set(_) {}
 
     /**
-     * Suspend and install a pointer input [block] that can await input events and respond to
-     * them immediately. A call to [awaitPointerEventScope] will resume with [block]'s result after
-     * it completes.
+     * Suspend and install a pointer input [block] that can await input events and respond to them
+     * immediately. A call to [awaitPointerEventScope] will resume with [block]'s result after it
+     * completes.
      *
      * More than one [awaitPointerEventScope] can run concurrently in the same [PointerInputScope]
      * by using [kotlinx.coroutines.launch]. [block]s are dispatched to in the order in which they
      * were installed.
      */
-    suspend fun <R> awaitPointerEventScope(
-        block: suspend AwaitPointerEventScope.() -> R
-    ): R
+    suspend fun <R> awaitPointerEventScope(block: suspend AwaitPointerEventScope.() -> R): R
 }
 
 @Suppress("ConstPropertyName")
@@ -188,132 +178,115 @@
  */
 // This deprecated-error function shadows the varargs overload so that the varargs version
 // is not used without key parameters.
-@Suppress(
-    "UNUSED_PARAMETER",
-    "UnusedReceiverParameter",
-    "ModifierFactoryUnreferencedReceiver"
-)
+@Suppress("UNUSED_PARAMETER", "UnusedReceiverParameter", "ModifierFactoryUnreferencedReceiver")
 @Deprecated(PointerInputModifierNoParamError, level = DeprecationLevel.ERROR)
-fun Modifier.pointerInput(
-    block: suspend PointerInputScope.() -> Unit
-): Modifier = error(PointerInputModifierNoParamError)
+fun Modifier.pointerInput(block: suspend PointerInputScope.() -> Unit): Modifier =
+    error(PointerInputModifierNoParamError)
 
 /**
  * Create a modifier for processing pointer input within the region of the modified element.
  *
  * [pointerInput] [block]s may call [PointerInputScope.awaitPointerEventScope] to install a pointer
- * input handler that can [AwaitPointerEventScope.awaitPointerEvent] to receive and consume
- * pointer input events. Extension functions on [PointerInputScope] or [AwaitPointerEventScope]
- * may be defined to perform higher-level gesture detection. The pointer input handling [block]
- * will be cancelled and **re-started** when [pointerInput] is recomposed with a different [key1].
+ * input handler that can [AwaitPointerEventScope.awaitPointerEvent] to receive and consume pointer
+ * input events. Extension functions on [PointerInputScope] or [AwaitPointerEventScope] may be
+ * defined to perform higher-level gesture detection. The pointer input handling [block] will be
+ * cancelled and **re-started** when [pointerInput] is recomposed with a different [key1].
  *
- * When a [pointerInput] modifier is created by composition, if [block] captures any local
- * variables to operate on, two patterns are common for working with changes to those variables
- * depending on the desired behavior.
+ * When a [pointerInput] modifier is created by composition, if [block] captures any local variables
+ * to operate on, two patterns are common for working with changes to those variables depending on
+ * the desired behavior.
  *
- * Specifying the captured value as a [key][key1] parameter will cause [block] to cancel
- * and restart from the beginning if the value changes:
+ * Specifying the captured value as a [key][key1] parameter will cause [block] to cancel and restart
+ * from the beginning if the value changes:
  *
  * @sample androidx.compose.ui.samples.keyedPointerInputModifier
  *
- * If [block] should **not** restart when a captured value is changed but the value should still
- * be updated for its next use, use
+ * If [block] should **not** restart when a captured value is changed but the value should still be
+ * updated for its next use, use
  * [rememberUpdatedState][androidx.compose.runtime.rememberUpdatedState] to update a value holder
  * that is accessed by [block]:
  *
  * @sample androidx.compose.ui.samples.rememberedUpdatedParameterPointerInputModifier
  *
- * ***Note*** Any removal operations on Android Views from `pointerInput` should wrap the `block`
- * in a `post { }` block to guarantee the event dispatch completes before executing the removal.
- * (You do not need to do this when removing a composable because Compose guarantees it completes
- * via the snapshot state system.)
+ * ***Note*** Any removal operations on Android Views from `pointerInput` should wrap the `block` in
+ * a `post { }` block to guarantee the event dispatch completes before executing the removal. (You
+ * do not need to do this when removing a composable because Compose guarantees it completes via the
+ * snapshot state system.)
  */
-fun Modifier.pointerInput(
-    key1: Any?,
-    block: suspend PointerInputScope.() -> Unit
-): Modifier = this then SuspendPointerInputElement(
-    key1 = key1,
-    pointerInputHandler = block
-)
+fun Modifier.pointerInput(key1: Any?, block: suspend PointerInputScope.() -> Unit): Modifier =
+    this then SuspendPointerInputElement(key1 = key1, pointerInputHandler = block)
 
 /**
  * Create a modifier for processing pointer input within the region of the modified element.
  *
  * [pointerInput] [block]s may call [PointerInputScope.awaitPointerEventScope] to install a pointer
- * input handler that can [AwaitPointerEventScope.awaitPointerEvent] to receive and consume
- * pointer input events. Extension functions on [PointerInputScope] or [AwaitPointerEventScope]
- * may be defined to perform higher-level gesture detection. The pointer input handling [block]
- * will be cancelled and **re-started** when [pointerInput] is recomposed with a different [key1] or
- * [key2].
+ * input handler that can [AwaitPointerEventScope.awaitPointerEvent] to receive and consume pointer
+ * input events. Extension functions on [PointerInputScope] or [AwaitPointerEventScope] may be
+ * defined to perform higher-level gesture detection. The pointer input handling [block] will be
+ * cancelled and **re-started** when [pointerInput] is recomposed with a different [key1] or [key2].
  *
- * When a [pointerInput] modifier is created by composition, if [block] captures any local
- * variables to operate on, two patterns are common for working with changes to those variables
- * depending on the desired behavior.
+ * When a [pointerInput] modifier is created by composition, if [block] captures any local variables
+ * to operate on, two patterns are common for working with changes to those variables depending on
+ * the desired behavior.
  *
- * Specifying the captured value as a [key][key1] parameter will cause [block] to cancel
- * and restart from the beginning if the value changes:
+ * Specifying the captured value as a [key][key1] parameter will cause [block] to cancel and restart
+ * from the beginning if the value changes:
  *
  * @sample androidx.compose.ui.samples.keyedPointerInputModifier
  *
- * If [block] should **not** restart when a captured value is changed but the value should still
- * be updated for its next use, use
+ * If [block] should **not** restart when a captured value is changed but the value should still be
+ * updated for its next use, use
  * [rememberUpdatedState][androidx.compose.runtime.rememberUpdatedState] to update a value holder
  * that is accessed by [block]:
  *
  * @sample androidx.compose.ui.samples.rememberedUpdatedParameterPointerInputModifier
  *
- * ***Note*** Any removal operations on Android Views from `pointerInput` should wrap the `block`
- * in a `post { }` block to guarantee the event dispatch completes before executing the removal.
- * (You do not need to do this when removing a composable because Compose guarantees it completes
- * via the snapshot state system.)
+ * ***Note*** Any removal operations on Android Views from `pointerInput` should wrap the `block` in
+ * a `post { }` block to guarantee the event dispatch completes before executing the removal. (You
+ * do not need to do this when removing a composable because Compose guarantees it completes via the
+ * snapshot state system.)
  */
 fun Modifier.pointerInput(
     key1: Any?,
     key2: Any?,
     block: suspend PointerInputScope.() -> Unit
-): Modifier = this then SuspendPointerInputElement(
-    key1 = key1,
-    key2 = key2,
-    pointerInputHandler = block
-)
+): Modifier =
+    this then SuspendPointerInputElement(key1 = key1, key2 = key2, pointerInputHandler = block)
 
 /**
  * Create a modifier for processing pointer input within the region of the modified element.
  *
  * [pointerInput] [block]s may call [PointerInputScope.awaitPointerEventScope] to install a pointer
- * input handler that can [AwaitPointerEventScope.awaitPointerEvent] to receive and consume
- * pointer input events. Extension functions on [PointerInputScope] or [AwaitPointerEventScope]
- * may be defined to perform higher-level gesture detection. The pointer input handling [block]
- * will be cancelled and **re-started** when [pointerInput] is recomposed with any different [keys].
+ * input handler that can [AwaitPointerEventScope.awaitPointerEvent] to receive and consume pointer
+ * input events. Extension functions on [PointerInputScope] or [AwaitPointerEventScope] may be
+ * defined to perform higher-level gesture detection. The pointer input handling [block] will be
+ * cancelled and **re-started** when [pointerInput] is recomposed with any different [keys].
  *
- * When a [pointerInput] modifier is created by composition, if [block] captures any local
- * variables to operate on, two patterns are common for working with changes to those variables
- * depending on the desired behavior.
+ * When a [pointerInput] modifier is created by composition, if [block] captures any local variables
+ * to operate on, two patterns are common for working with changes to those variables depending on
+ * the desired behavior.
  *
- * Specifying the captured value as a [key][keys] parameter will cause [block] to cancel
- * and restart from the beginning if the value changes:
+ * Specifying the captured value as a [key][keys] parameter will cause [block] to cancel and restart
+ * from the beginning if the value changes:
  *
  * @sample androidx.compose.ui.samples.keyedPointerInputModifier
  *
- * If [block] should **not** restart when a captured value is changed but the value should still
- * be updated for its next use, use
+ * If [block] should **not** restart when a captured value is changed but the value should still be
+ * updated for its next use, use
  * [rememberUpdatedState][androidx.compose.runtime.rememberUpdatedState] to update a value holder
  * that is accessed by [block]:
  *
  * @sample androidx.compose.ui.samples.rememberedUpdatedParameterPointerInputModifier
  *
- * ***Note*** Any removal operations on Android Views from `pointerInput` should wrap the `block`
- * in a `post { }` block to guarantee the event dispatch completes before executing the removal.
- * (You do not need to do this when removing a composable because Compose guarantees it completes
- * via the snapshot state system.)
+ * ***Note*** Any removal operations on Android Views from `pointerInput` should wrap the `block` in
+ * a `post { }` block to guarantee the event dispatch completes before executing the removal. (You
+ * do not need to do this when removing a composable because Compose guarantees it completes via the
+ * snapshot state system.)
  */
 fun Modifier.pointerInput(
     vararg keys: Any?,
     block: suspend PointerInputScope.() -> Unit
-): Modifier = this then SuspendPointerInputElement(
-    keys = keys,
-    pointerInputHandler = block
-)
+): Modifier = this then SuspendPointerInputElement(keys = keys, pointerInputHandler = block)
 
 internal class SuspendPointerInputElement(
     val key1: Any? = null,
@@ -377,8 +350,8 @@
 /**
  * Extends [PointerInputModifierNode] with a handler to execute asynchronously when an event occurs
  * and a function to reset that handler (cancels the existing coroutine and essentially resets the
- * handler's execution).
- * Note: The handler still executes lazily, meaning nothing will be done until a new event comes in.
+ * handler's execution). Note: The handler still executes lazily, meaning nothing will be done until
+ * a new event comes in.
  */
 sealed interface SuspendingPointerInputModifierNode : PointerInputModifierNode {
     /**
@@ -388,26 +361,25 @@
     var pointerInputHandler: suspend PointerInputScope.() -> Unit
 
     /**
-     * Resets the underlying coroutine used to run the handler for input pointer events. This
-     * should be called whenever a large change has been made that forces the gesture detection to
-     * be completely invalid.
+     * Resets the underlying coroutine used to run the handler for input pointer events. This should
+     * be called whenever a large change has been made that forces the gesture detection to be
+     * completely invalid.
      *
-     * For example, if [pointerInputHandler] has different modes for detecting a gesture
-     * (long press, double click, etc.), and by switching the modes, any currently-running gestures
-     * are no longer valid.
+     * For example, if [pointerInputHandler] has different modes for detecting a gesture (long
+     * press, double click, etc.), and by switching the modes, any currently-running gestures are no
+     * longer valid.
      */
     fun resetPointerInputHandler()
 }
 
 /**
- * Implementation notes:
- * This class does a lot of lifting. [PointerInputModifierNode] receives, interprets, and, consumes
- * [PointerInputChange]s while the state (and the coroutineScope used to execute
- * [pointerInputHandler]) is retained in [Modifier.Node].
+ * Implementation notes: This class does a lot of lifting. [PointerInputModifierNode] receives,
+ * interprets, and, consumes [PointerInputChange]s while the state (and the coroutineScope used to
+ * execute [pointerInputHandler]) is retained in [Modifier.Node].
  *
  * [SuspendingPointerInputModifierNodeImpl] implements the [PointerInputScope] used to offer the
- * [Modifier.pointerInput] DSL and provides the [Density] from [LocalDensity] lazily from the
- * layout node when it is needed.
+ * [Modifier.pointerInput] DSL and provides the [Density] from [LocalDensity] lazily from the layout
+ * node when it is needed.
  *
  * Note: The coroutine that executes the passed pointer event handler is launched lazily when the
  * first event is fired (making it more efficient) and is cancelled via resetPointerInputHandler().
@@ -417,10 +389,7 @@
     private var key2: Any? = null,
     private var keys: Array<out Any?>? = null,
     pointerInputHandler: suspend PointerInputScope.() -> Unit
-) : Modifier.Node(),
-    SuspendingPointerInputModifierNode,
-    PointerInputScope,
-    Density {
+) : Modifier.Node(), SuspendingPointerInputModifierNode, PointerInputScope, Density {
 
     internal fun update(
         key1: Any?,
@@ -489,10 +458,9 @@
         mutableVectorOf<SuspendingPointerInputModifierNodeImpl.PointerEventHandlerCoroutine<*>>()
 
     /**
-     * Scratch list for dispatching to handlers for a particular phase.
-     * Used to hold a copy of the contents of [pointerHandlers] during dispatch so that
-     * resumed continuations may add/remove handlers without affecting the current dispatch pass.
-     * Must only access on the UI thread.
+     * Scratch list for dispatching to handlers for a particular phase. Used to hold a copy of the
+     * contents of [pointerHandlers] during dispatch so that resumed continuations may add/remove
+     * handlers without affecting the current dispatch pass. Must only access on the UI thread.
      */
     private val dispatchingPointerHandlers =
         mutableVectorOf<SuspendingPointerInputModifierNodeImpl.PointerEventHandlerCoroutine<*>>()
@@ -506,9 +474,8 @@
     private var lastPointerEvent: PointerEvent? = null
 
     /**
-     * The size of the bounds of this input filter. Normally [PointerInputFilter.size] can
-     * be used, but for tests, it is better to not rely on something set to an `internal`
-     * method.
+     * The size of the bounds of this input filter. Normally [PointerInputFilter.size] can be used,
+     * but for tests, it is better to not rely on something set to an `internal` method.
      */
     private var boundsSize: IntSize = IntSize.Zero
 
@@ -541,12 +508,11 @@
 
     /**
      * This cancels the existing coroutine and essentially resets pointerInputHandler's execution.
-     * Note, the pointerInputHandler still executes lazily, meaning nothing will be done again
-     * until a new event comes in.
-     * More details: This is triggered from a LayoutNode if the Density or ViewConfiguration change
-     * (in an older implementation using composed, these values were used as keys so it would reset
-     * everything when either change, we do that manually now through this function). It is also
-     * used for testing.
+     * Note, the pointerInputHandler still executes lazily, meaning nothing will be done again until
+     * a new event comes in. More details: This is triggered from a LayoutNode if the Density or
+     * ViewConfiguration change (in an older implementation using composed, these values were used
+     * as keys so it would reset everything when either change, we do that manually now through this
+     * function). It is also used for testing.
      */
     override fun resetPointerInputHandler() {
         val localJob = pointerInputJob
@@ -557,29 +523,25 @@
     }
 
     /**
-     * Snapshot the current [pointerHandlers] and run [block] on each one.
-     * May not be called reentrant or concurrent with itself.
+     * Snapshot the current [pointerHandlers] and run [block] on each one. May not be called
+     * reentrant or concurrent with itself.
      *
      * Dispatches from first to last registered for [PointerEventPass.Initial] and
-     * [PointerEventPass.Final]; dispatches from last to first for [PointerEventPass.Main].
-     * This corresponds to the down/up/down dispatch behavior of each of these passes along
-     * the hit test path through the Compose UI layout hierarchy.
+     * [PointerEventPass.Final]; dispatches from last to first for [PointerEventPass.Main]. This
+     * corresponds to the down/up/down dispatch behavior of each of these passes along the hit test
+     * path through the Compose UI layout hierarchy.
      */
     private inline fun forEachCurrentPointerHandler(
         pass: PointerEventPass,
         block: (SuspendingPointerInputModifierNodeImpl.PointerEventHandlerCoroutine<*>) -> Unit
     ) {
         // Copy handlers to avoid mutating the collection during dispatch
-        synchronized(pointerHandlers) {
-            dispatchingPointerHandlers.addAll(pointerHandlers)
-        }
+        synchronized(pointerHandlers) { dispatchingPointerHandlers.addAll(pointerHandlers) }
         try {
             when (pass) {
-                PointerEventPass.Initial, PointerEventPass.Final ->
-                    dispatchingPointerHandlers.forEach(block)
-
-                PointerEventPass.Main ->
-                    dispatchingPointerHandlers.forEachReversed(block)
+                PointerEventPass.Initial,
+                PointerEventPass.Final -> dispatchingPointerHandlers.forEach(block)
+                PointerEventPass.Main -> dispatchingPointerHandlers.forEachReversed(block)
             }
         } finally {
             dispatchingPointerHandlers.clear()
@@ -587,16 +549,11 @@
     }
 
     /**
-     * Dispatch [pointerEvent] for [pass] to all [pointerHandlers] currently registered when
-     * the call begins.
+     * Dispatch [pointerEvent] for [pass] to all [pointerHandlers] currently registered when the
+     * call begins.
      */
-    private fun dispatchPointerEvent(
-        pointerEvent: PointerEvent,
-        pass: PointerEventPass
-    ) {
-        forEachCurrentPointerHandler(pass) {
-            it.offerPointerEvent(pointerEvent, pass)
-        }
+    private fun dispatchPointerEvent(pointerEvent: PointerEvent, pass: PointerEventPass) {
+        forEachCurrentPointerHandler(pass) { it.offerPointerEvent(pointerEvent, pass) }
     }
 
     override fun onPointerEvent(
@@ -612,16 +569,16 @@
         // Coroutine lazily launches when first event comes in.
         if (pointerInputJob == null) {
             // 'start = CoroutineStart.UNDISPATCHED' required so handler doesn't miss first event.
-            pointerInputJob = coroutineScope.launch(start = CoroutineStart.UNDISPATCHED) {
-                pointerInputHandler()
-            }
+            pointerInputJob =
+                coroutineScope.launch(start = CoroutineStart.UNDISPATCHED) { pointerInputHandler() }
         }
 
         dispatchPointerEvent(pointerEvent, pass)
 
-        lastPointerEvent = pointerEvent.takeIf { event ->
-            !event.changes.fastAll { it.changedToUpIgnoreConsumed() }
-        }
+        lastPointerEvent =
+            pointerEvent.takeIf { event ->
+                !event.changes.fastAll { it.changedToUpIgnoreConsumed() }
+            }
     }
 
     override fun onCancelPointerInput() {
@@ -633,19 +590,20 @@
         if (lastEvent.changes.fastAll { !it.pressed }) {
             return // There aren't any pressed pointers, so we don't need to send any events.
         }
-        val newChanges = lastEvent.changes.fastMapNotNull { old ->
-            PointerInputChange(
-                id = old.id,
-                position = old.position,
-                uptimeMillis = old.uptimeMillis,
-                pressed = false,
-                pressure = old.pressure,
-                previousPosition = old.position,
-                previousUptimeMillis = old.uptimeMillis,
-                previousPressed = old.pressed,
-                isInitiallyConsumed = old.pressed
-            )
-        }
+        val newChanges =
+            lastEvent.changes.fastMapNotNull { old ->
+                PointerInputChange(
+                    id = old.id,
+                    position = old.position,
+                    uptimeMillis = old.uptimeMillis,
+                    pressed = false,
+                    pressure = old.pressure,
+                    previousPosition = old.position,
+                    previousUptimeMillis = old.uptimeMillis,
+                    previousPressed = old.pressed,
+                    isInitiallyConsumed = old.pressed
+                )
+            }
 
         val cancelEvent = PointerEvent(newChanges)
 
@@ -690,13 +648,14 @@
      * Implementation of the inner coroutine created to run a single call to
      * [awaitPointerEventScope].
      *
-     * [PointerEventHandlerCoroutine] implements [AwaitPointerEventScope] to provide the
-     * input handler DSL, and [Continuation] so that it can wrap [completion] and remove the
+     * [PointerEventHandlerCoroutine] implements [AwaitPointerEventScope] to provide the input
+     * handler DSL, and [Continuation] so that it can wrap [completion] and remove the
      * [ContinuationInterceptor] from the calling context and run un-dispatched.
      */
     private inner class PointerEventHandlerCoroutine<R>(
         private val completion: Continuation<R>,
-    ) : AwaitPointerEventScope,
+    ) :
+        AwaitPointerEventScope,
         Density by this@SuspendingPointerInputModifierNodeImpl,
         Continuation<R> {
 
@@ -705,10 +664,13 @@
 
         override val currentEvent: PointerEvent
             get() = this@SuspendingPointerInputModifierNodeImpl.currentEvent
+
         override val size: IntSize
             get() = this@SuspendingPointerInputModifierNodeImpl.boundsSize
+
         override val viewConfiguration: ViewConfiguration
             get() = this@SuspendingPointerInputModifierNodeImpl.viewConfiguration
+
         override val extendedTouchPadding: Size
             get() = this@SuspendingPointerInputModifierNodeImpl.extendedTouchPadding
 
@@ -732,18 +694,15 @@
 
         // Implementation of Continuation; clean up and resume our wrapped continuation.
         override fun resumeWith(result: Result<R>) {
-            synchronized(pointerHandlers) {
-                pointerHandlers -= this
-            }
+            synchronized(pointerHandlers) { pointerHandlers -= this }
             completion.resumeWith(result)
         }
 
-        override suspend fun awaitPointerEvent(
-            pass: PointerEventPass
-        ): PointerEvent = suspendCancellableCoroutine { continuation ->
-            awaitPass = pass
-            pointerAwaiter = continuation
-        }
+        override suspend fun awaitPointerEvent(pass: PointerEventPass): PointerEvent =
+            suspendCancellableCoroutine { continuation ->
+                awaitPass = pass
+                pointerAwaiter = continuation
+            }
 
         override suspend fun <T> withTimeoutOrNull(
             timeMillis: Long,
@@ -766,18 +725,19 @@
                 )
             }
 
-            val job = coroutineScope.launch {
-                // Delay twice because the timeout continuation needs to be lower-priority than
-                // input events, not treated fairly in FIFO order. The second
-                // micro-delay reposts it to the back of the queue, after any input events
-                // that were posted but not processed during the first delay.
-                delay(timeMillis - 1)
-                delay(1)
+            val job =
+                coroutineScope.launch {
+                    // Delay twice because the timeout continuation needs to be lower-priority than
+                    // input events, not treated fairly in FIFO order. The second
+                    // micro-delay reposts it to the back of the queue, after any input events
+                    // that were posted but not processed during the first delay.
+                    delay(timeMillis - 1)
+                    delay(1)
 
-                pointerAwaiter?.resumeWithException(
-                    PointerEventTimeoutCancellationException(timeMillis)
-                )
-            }
+                    pointerAwaiter?.resumeWithException(
+                        PointerEventTimeoutCancellationException(timeMillis)
+                    )
+                }
             try {
                 return block()
             } finally {
@@ -790,12 +750,11 @@
 private val EmptyStackTraceElements = emptyArray<StackTraceElement>()
 
 /**
- * An exception thrown from [AwaitPointerEventScope.withTimeout] when the execution time
- * of the coroutine is too long.
+ * An exception thrown from [AwaitPointerEventScope.withTimeout] when the execution time of the
+ * coroutine is too long.
  */
-class PointerEventTimeoutCancellationException(
-    time: Long
-) : CancellationException("Timed out waiting for $time ms") {
+class PointerEventTimeoutCancellationException(time: Long) :
+    CancellationException("Timed out waiting for $time ms") {
     override fun fillInStackTrace(): Throwable {
         // Avoid null.clone() on Android <= 6.0 when accessing stackTrace
         stackTrace = EmptyStackTraceElements
@@ -804,9 +763,9 @@
 }
 
 /**
- * Used in place of the standard Job cancellation pathway to avoid reflective
- * javaClass.simpleName lookups to build the exception message and stack trace collection.
- * Remove if these are changed in kotlinx.coroutines.
+ * Used in place of the standard Job cancellation pathway to avoid reflective javaClass.simpleName
+ * lookups to build the exception message and stack trace collection. Remove if these are changed in
+ * kotlinx.coroutines.
  */
 private class PointerInputResetException : CancellationException("Pointer input was reset") {
     override fun fillInStackTrace(): Throwable {
@@ -817,9 +776,9 @@
 }
 
 /**
- * Also used in place of standard Job cancellation pathway; since we control this code path
- * we shouldn't need to worry about other code calling addSuppressed on this exception
- * so a singleton instance is used
+ * Also used in place of standard Job cancellation pathway; since we control this code path we
+ * shouldn't need to worry about other code calling addSuppressed on this exception so a singleton
+ * instance is used
  */
 private object CancelTimeoutCancellationException : CancellationException() {
     override fun fillInStackTrace(): Throwable {
diff --git a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/input/pointer/util/PointerIdArray.kt b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/input/pointer/util/PointerIdArray.kt
index 96c7925..d664f85 100644
--- a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/input/pointer/util/PointerIdArray.kt
+++ b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/input/pointer/util/PointerIdArray.kt
@@ -19,10 +19,10 @@
 import androidx.compose.ui.input.pointer.PointerId
 
 /**
- * This collection is specifically for dealing with [PointerId] values. We know that they
- * contain [Long] values, so we store them in an underlying LongArray. We want to be able to
- * resize the array if there are many ids to be stored, so we recreate the internal LongArray
- * as necessary (since LongArray is not itself resizable).
+ * This collection is specifically for dealing with [PointerId] values. We know that they contain
+ * [Long] values, so we store them in an underlying LongArray. We want to be able to resize the
+ * array if there are many ids to be stored, so we recreate the internal LongArray as necessary
+ * (since LongArray is not itself resizable).
  */
 internal class PointerIdArray {
 
@@ -35,10 +35,10 @@
         private set
 
     /**
-     * The ids are stored as Long values in a LongArray. LongArray is not resizable, and we may
-     * need to expand this array if there are many pointer ids in use at any given time, so we
-     * keep the LongArray private and resize the PointerIdArray by allocating a larger LongArray
-     * (and copying existing values to it) as necessary.
+     * The ids are stored as Long values in a LongArray. LongArray is not resizable, and we may need
+     * to expand this array if there are many pointer ids in use at any given time, so we keep the
+     * LongArray private and resize the PointerIdArray by allocating a larger LongArray (and copying
+     * existing values to it) as necessary.
      *
      * By default, we allocate the underlying array with 2 elements, since it is uncommon (though
      * possible) to have more than two ids at a time.
@@ -46,8 +46,8 @@
     private var internalArray = LongArray(2)
 
     /**
-     * Returns the PointerId at the given index.
-     * This getter allows use of [] syntax to retrieve values.
+     * Returns the PointerId at the given index. This getter allows use of [] syntax to retrieve
+     * values.
      */
     operator fun get(index: Int): PointerId {
         return PointerId(internalArray[index])
@@ -65,8 +65,8 @@
     /**
      * Removes a [PointerId] with the given value from this array, if it exists.
      *
-     * @return true if a [PointerId] with the value [pointerIdValue] was in the array,
-     * false otherwise
+     * @return true if a [PointerId] with the value [pointerIdValue] was in the array, false
+     *   otherwise
      */
     fun remove(pointerIdValue: Long): Boolean {
         for (i in 0 until size) {
@@ -79,8 +79,8 @@
     }
 
     /**
-     * Removes the [PointerId] at the given index value, if the index is less than the size
-     * of the array.
+     * Removes the [PointerId] at the given index value, if the index is less than the size of the
+     * array.
      *
      * @return true if a [PointerId] at that index was removed, false otherwise
      */
@@ -95,9 +95,7 @@
         return false
     }
 
-    /**
-     * Returns the current size of the array
-     */
+    /** Returns the current size of the array */
     fun isEmpty() = size == 0
 
     /**
@@ -123,10 +121,10 @@
     }
 
     /**
-     * Sets the value at the given index to a [PointerId] with the value [value].
-     * The index must be less than or equal to the current size of the array. If it is
-     * equal to the size of the array, the storage in the array will be expanded to
-     * ensure that the item can be added to the end of it.
+     * Sets the value at the given index to a [PointerId] with the value [value]. The index must be
+     * less than or equal to the current size of the array. If it is equal to the size of the array,
+     * the storage in the array will be expanded to ensure that the item can be added to the end of
+     * it.
      */
     operator fun set(index: Int, value: Long) {
         if (index >= internalArray.size) {
@@ -138,33 +136,26 @@
     }
 
     /**
-     * Sets the value at the given index to [pointerId].
-     * The index must be less than or equal to the current size of the array. If it is
-     * equal to the size of the array, the storage in the array will be expanded to
-     * ensure that the item can be added to the end of it.
+     * Sets the value at the given index to [pointerId]. The index must be less than or equal to the
+     * current size of the array. If it is equal to the size of the array, the storage in the array
+     * will be expanded to ensure that the item can be added to the end of it.
      */
     operator fun set(index: Int, pointerId: PointerId) {
         set(index, pointerId.value)
     }
 
-    /**
-     * Clears the array. The new [size] of the array will be 0.
-     */
+    /** Clears the array. The new [size] of the array will be 0. */
     fun clear() {
         // No need to clear, just reset the size. Elements beyond the current size are ignored.
         size = 0
     }
 
-    /**
-     * Returns true if [pointerId] is in the array, false otherwise
-     */
+    /** Returns true if [pointerId] is in the array, false otherwise */
     fun contains(pointerId: PointerId): Boolean {
         return contains(pointerId.value)
     }
 
-    /**
-     * Returns true if a [PointerId] with the given value is in the array, false otherwise
-     */
+    /** Returns true if a [PointerId] with the given value is in the array, false otherwise */
     fun contains(pointerIdValue: Long): Boolean {
         for (i in 0 until size) {
             if (internalArray[i] == pointerIdValue) return true
@@ -172,8 +163,7 @@
         return false
     }
 
-    /**
-     * Returns index of last item in array
-     */
-    inline val lastIndex: Int get() = size - 1
+    /** Returns index of last item in array */
+    inline val lastIndex: Int
+        get() = size - 1
 }
diff --git a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/input/pointer/util/VelocityTracker.kt b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/input/pointer/util/VelocityTracker.kt
index d2d5104..abdc020 100644
--- a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/input/pointer/util/VelocityTracker.kt
+++ b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/input/pointer/util/VelocityTracker.kt
@@ -41,21 +41,20 @@
  *
  * The input data is provided by calling [addPosition]. Adding data is cheap.
  *
- * To obtain a velocity, call [calculateVelocity]. This will compute the velocity
- * based on the data added so far. Only call this when you need to use the velocity,
- * as it is comparatively expensive.
+ * To obtain a velocity, call [calculateVelocity]. This will compute the velocity based on the data
+ * added so far. Only call this when you need to use the velocity, as it is comparatively expensive.
  *
- * The quality of the velocity estimation will be better if more data points
- * have been received.
+ * The quality of the velocity estimation will be better if more data points have been received.
  */
 class VelocityTracker {
 
     @OptIn(ExperimentalComposeUiApi::class)
-    private val strategy = if (VelocityTrackerStrategyUseImpulse) {
-        VelocityTracker1D.Strategy.Impulse
-    } else {
-        VelocityTracker1D.Strategy.Lsq2 // non-differential, Lsq2 1D velocity tracker
-    }
+    private val strategy =
+        if (VelocityTrackerStrategyUseImpulse) {
+            VelocityTracker1D.Strategy.Impulse
+        } else {
+            VelocityTracker1D.Strategy.Lsq2 // non-differential, Lsq2 1D velocity tracker
+        }
     private val xVelocityTracker = VelocityTracker1D(strategy = strategy)
     private val yVelocityTracker = VelocityTracker1D(strategy = strategy)
 
@@ -80,8 +79,8 @@
     /**
      * Computes the estimated velocity of the pointer at the time of the last provided data point.
      *
-     * The velocity calculated will not be limited. Unlike [calculateVelocity(maximumVelocity)]
-     * the resulting velocity won't be limited.
+     * The velocity calculated will not be limited. Unlike [calculateVelocity(maximumVelocity)] the
+     * resulting velocity won't be limited.
      *
      * This can be expensive. Only call this when you need the velocity.
      */
@@ -91,15 +90,14 @@
     /**
      * Computes the estimated velocity of the pointer at the time of the last provided data point.
      *
-     * The method allows specifying the maximum absolute value for the calculated
-     * velocity. If the absolute value of the calculated velocity exceeds the specified
-     * maximum, the return value will be clamped down to the maximum. For example, if
-     * the absolute maximum velocity is specified as "20", a calculated velocity of "25"
-     * will be returned as "20", and a velocity of "-30" will be returned as "-20".
+     * The method allows specifying the maximum absolute value for the calculated velocity. If the
+     * absolute value of the calculated velocity exceeds the specified maximum, the return value
+     * will be clamped down to the maximum. For example, if the absolute maximum velocity is
+     * specified as "20", a calculated velocity of "25" will be returned as "20", and a velocity of
+     * "-30" will be returned as "-20".
      *
-     * @param maximumVelocity the absolute values of the X and Y maximum velocities to
-     * be returned in units/second. `units` is the units of the positions provided to this
-     * VelocityTracker.
+     * @param maximumVelocity the absolute values of the X and Y maximum velocities to be returned
+     *   in units/second. `units` is the units of the positions provided to this VelocityTracker.
      */
     fun calculateVelocity(maximumVelocity: Velocity): Velocity {
         checkPrecondition(maximumVelocity.x > 0f && maximumVelocity.y > 0) {
@@ -110,9 +108,7 @@
         return Velocity(velocityX, velocityY)
     }
 
-    /**
-     * Clears the tracked positions added by [addPosition].
-     */
+    /** Clears the tracked positions added by [addPosition]. */
     fun resetTracking() {
         xVelocityTracker.resetTracking()
         yVelocityTracker.resetTracking()
@@ -128,7 +124,8 @@
  * Note: for calculating touch-related or other 2 dimensional/planar velocities, please use
  * [VelocityTracker], which handles velocity tracking across both X and Y dimensions at once.
  */
-class VelocityTracker1D internal constructor(
+class VelocityTracker1D
+internal constructor(
     // whether the data points added to the tracker represent differential values
     // (i.e. change in the  tracked object's displacement since the previous data point).
     // If false, it means that the data points added to the tracker will be considered as absolute
@@ -160,15 +157,16 @@
      * data points is when tracking velocity for an object whose positions on a geometrical axis
      * over different instances of time are known.
      *
-     * @param isDataDifferential [true] if the data ponits provided to the constructed tracker
-     * are differential. [false] otherwise.
+     * @param isDataDifferential [true] if the data ponits provided to the constructed tracker are
+     *   differential. [false] otherwise.
      */
     constructor(isDataDifferential: Boolean) : this(isDataDifferential, Strategy.Impulse)
 
-    private val minSampleSize: Int = when (strategy) {
-        Strategy.Impulse -> 2
-        Strategy.Lsq2 -> 3
-    }
+    private val minSampleSize: Int =
+        when (strategy) {
+            Strategy.Impulse -> 2
+            Strategy.Lsq2 -> 3
+        }
 
     /**
      * A strategy used for velocity calculation. Each strategy has a different philosophy that could
@@ -177,9 +175,8 @@
      */
     internal enum class Strategy {
         /**
-         * Least squares strategy. Polynomial fit at degree 2.
-         * Note that the implementation of this strategy currently supports only non-differential
-         * data points.
+         * Least squares strategy. Polynomial fit at degree 2. Note that the implementation of this
+         * strategy currently supports only non-differential data points.
          */
         Lsq2,
 
@@ -205,8 +202,8 @@
      * Adds a data point for velocity calculation at a given time, [timeMillis]. The data ponit
      * represents an amount of a change in position (for differential data points), or an absolute
      * position (for non-differential data points). Whether or not the tracker handles differential
-     * data points is decided by [isDataDifferential], which is set once and finally during
-     * the construction of the tracker.
+     * data points is decided by [isDataDifferential], which is set once and finally during the
+     * construction of the tracker.
      *
      * Use the same units for the data points provided. For example, having some data points in `cm`
      * and some in `m` will result in incorrect velocity calculations, as this method (and the
@@ -220,8 +217,8 @@
     /**
      * Computes the estimated velocity at the time of the last provided data point.
      *
-     * The units of velocity will be `units/second`, where `units` is the units of the data
-     * points provided via [addDataPoint].
+     * The units of velocity will be `units/second`, where `units` is the units of the data points
+     * provided via [addDataPoint].
      *
      * This can be expensive. Only call this when you need the velocity.
      */
@@ -242,13 +239,13 @@
             val sample: DataPointAtTime = samples[index] ?: break
 
             val age: Float = (newestSample.time - sample.time).toFloat()
-            val delta: Float =
-                abs(sample.time - previousSample.time).toFloat()
-            previousSample = if (strategy == Strategy.Lsq2 || isDataDifferential) {
-                sample
-            } else {
-                newestSample
-            }
+            val delta: Float = abs(sample.time - previousSample.time).toFloat()
+            previousSample =
+                if (strategy == Strategy.Lsq2 || isDataDifferential) {
+                    sample
+                } else {
+                    newestSample
+                }
             if (age > HorizonMilliseconds || delta > AssumePointerMoveStoppedMilliseconds) {
                 break
             }
@@ -266,7 +263,6 @@
                 Strategy.Impulse -> {
                     calculateImpulseVelocity(dataPoints, time, sampleCount, isDataDifferential)
                 }
-
                 Strategy.Lsq2 -> {
                     calculateLeastSquaresVelocity(dataPoints, time, sampleCount)
                 }
@@ -281,14 +277,14 @@
     /**
      * Computes the estimated velocity at the time of the last provided data point.
      *
-     * The method allows specifying the maximum absolute value for the calculated
-     * velocity. If the absolute value of the calculated velocity exceeds the specified
-     * maximum, the return value will be clamped down to the maximum. For example, if
-     * the absolute maximum velocity is specified as "20", a calculated velocity of "25"
-     * will be returned as "20", and a velocity of "-30" will be returned as "-20".
+     * The method allows specifying the maximum absolute value for the calculated velocity. If the
+     * absolute value of the calculated velocity exceeds the specified maximum, the return value
+     * will be clamped down to the maximum. For example, if the absolute maximum velocity is
+     * specified as "20", a calculated velocity of "25" will be returned as "20", and a velocity of
+     * "-30" will be returned as "-20".
      *
      * @param maximumVelocity the absolute value of the maximum velocity to be returned in
-     * units/second, where `units` is the units of the positions provided to this VelocityTracker.
+     *   units/second, where `units` is the units of the positions provided to this VelocityTracker.
      */
     fun calculateVelocity(maximumVelocity: Float): Float {
         checkPrecondition(maximumVelocity > 0f) {
@@ -305,9 +301,7 @@
         }
     }
 
-    /**
-     * Clears data points added by [addDataPoint].
-     */
+    /** Clears data points added by [addDataPoint]. */
     fun resetTracking() {
         samples.fill(element = null)
         index = 0
@@ -327,13 +321,7 @@
         // x = 0, and that happens to be the last timestamp that we end up
         // passing to polyFitLeastSquares.
         return try {
-            polyFitLeastSquares(
-                time,
-                dataPoints,
-                sampleCount,
-                2,
-                reusableVelocityCoefficients
-            )[1]
+            polyFitLeastSquares(time, dataPoints, sampleCount, 2, reusableVelocityCoefficients)[1]
         } catch (exception: IllegalArgumentException) {
             0f
         }
@@ -341,8 +329,8 @@
 }
 
 /**
- * Extension to simplify either creating a new [DataPointAtTime] at an array index (if the index
- * was never populated), or to update an existing [DataPointAtTime] (if the index had an existing
+ * Extension to simplify either creating a new [DataPointAtTime] at an array index (if the index was
+ * never populated), or to update an existing [DataPointAtTime] (if the index had an existing
  * element). This helps to have zero allocations on average, and avoid performance hit that can be
  * caused by creating lots of objects.
  */
@@ -359,15 +347,14 @@
 /**
  * Track the positions and timestamps inside this event change.
  *
- * For optimal tracking, this should be called for the DOWN event and all MOVE
- * events, including any touch-slop-captured MOVE event.
+ * For optimal tracking, this should be called for the DOWN event and all MOVE events, including any
+ * touch-slop-captured MOVE event.
  *
- * Since Compose uses relative positions inside PointerInputChange, this should be
- * taken into consideration when using this method. Right now, we use the first down
- * to initialize an accumulator and use subsequent deltas to simulate an actual movement
- * from relative positions in PointerInputChange. This is required because VelocityTracker
- * requires data that can be fit into a curve, which might not happen with relative positions
- * inside a moving target for instance.
+ * Since Compose uses relative positions inside PointerInputChange, this should be taken into
+ * consideration when using this method. Right now, we use the first down to initialize an
+ * accumulator and use subsequent deltas to simulate an actual movement from relative positions in
+ * PointerInputChange. This is required because VelocityTracker requires data that can be fit into a
+ * curve, which might not happen with relative positions inside a moving target for instance.
  *
  * @param event Pointer change to track.
  */
@@ -384,9 +371,7 @@
     // coordinates.
     @OptIn(ExperimentalComposeUiApi::class)
     if (!event.changedToUpIgnoreConsumed()) {
-        event.historical.fastForEach {
-            addPosition(it.uptimeMillis, it.originalEventPosition)
-        }
+        event.historical.fastForEach { addPosition(it.uptimeMillis, it.originalEventPosition) }
         addPosition(event.uptimeMillis, event.originalEventPosition)
     }
 
@@ -401,8 +386,8 @@
 internal data class DataPointAtTime(var time: Long, var dataPoint: Float)
 
 /**
- *  TODO (shepshapard): If we want to support varying weights for each position, we could accept a
- *  3rd FloatArray of weights for each point and use them instead of the [DefaultWeight].
+ * TODO (shepshapard): If we want to support varying weights for each position, we could accept a
+ * 3rd FloatArray of weights for each point and use them instead of the [DefaultWeight].
  */
 private const val DefaultWeight = 1f
 
@@ -416,10 +401,9 @@
  *
  * Throws an IllegalArgumentException if:
  * <ul>
- *   <li>[degree] is not a positive integer.
- *   <li>[sampleCount] is zero.
+ * <li>[degree] is not a positive integer.
+ * <li>[sampleCount] is zero.
  * </ul>
- *
  */
 internal fun polyFitLeastSquares(
     /** The x-coordinates of each data point. */
@@ -518,79 +502,65 @@
 
 /**
  * Calculates velocity based on the Impulse strategy. The provided [time] entries are in "ms", and
- * should be provided in reverse chronological order. The returned velocity is in "units/ms",
- * where "units" is unit of the [dataPoints].
+ * should be provided in reverse chronological order. The returned velocity is in "units/ms", where
+ * "units" is unit of the [dataPoints].
  *
  * Calculates the resulting velocity based on the total immpulse provided by the data ponits.
  *
  * The moving object in these calculations is the touchscreen (if we are calculating touch
- * velocity), or any input device from which the data points are generated. We refer to this
- * object as the "subject" below.
+ * velocity), or any input device from which the data points are generated. We refer to this object
+ * as the "subject" below.
  *
  * Initial condition is discussed below, but for now suppose that v(t=0) = 0
  *
- * The kinetic energy of the object at the release is E=0.5*m*v^2
- * Then vfinal = sqrt(2E/m). The goal is to calculate E.
+ * The kinetic energy of the object at the release is E=0.5*m*v^2 Then vfinal = sqrt(2E/m). The goal
+ * is to calculate E.
  *
  * The kinetic energy at the release is equal to the total work done on the object by the finger.
  * The total work W is the sum of all dW along the path.
  *
- * dW = F*dx, where dx is the piece of path traveled.
- * Force is change of momentum over time, F = dp/dt = m dv/dt.
- * Then substituting:
- * dW = m (dv/dt) * dx = m * v * dv
+ * dW = F*dx, where dx is the piece of path traveled. Force is change of momentum over time, F =
+ * dp/dt = m dv/dt. Then substituting: dW = m (dv/dt) * dx = m * v * dv
  *
- * Summing along the path, we get:
- * W = sum(dW) = sum(m * v * dv) = m * sum(v * dv)
- * Since the mass stays constant, the equation for final velocity is:
- * vfinal = sqrt(2*sum(v * dv))
+ * Summing along the path, we get: W = sum(dW) = sum(m * v * dv) = m * sum(v * dv) Since the mass
+ * stays constant, the equation for final velocity is: vfinal = sqrt(2*sum(v * dv))
  *
- * Here,
- * dv : change of velocity = (v[i+1]-v[i])
- * dx : change of distance = (x[i+1]-x[i])
- * dt : change of time = (t[i+1]-t[i])
- * v : instantaneous velocity = dx/dt
+ * Here, dv : change of velocity = (v[i+1]-v[i]) dx : change of distance = (x[i+1]-x[i]) dt : change
+ * of time = (t[i+1]-t[i]) v : instantaneous velocity = dx/dt
  *
- * The final formula is:
- * vfinal = sqrt(2) * sqrt(sum((v[i]-v[i-1])*|v[i]|)) for all i
- * The absolute value is needed to properly account for the sign. If the velocity over a
- * particular segment descreases, then this indicates braking, which means that negative
- * work was done. So for two positive, but decreasing, velocities, this contribution would be
- * negative and will cause a smaller final velocity.
+ * The final formula is: vfinal = sqrt(2) * sqrt(sum((v[i]-v[i-1])*|v[i]|)) for all i The absolute
+ * value is needed to properly account for the sign. If the velocity over a particular segment
+ * descreases, then this indicates braking, which means that negative work was done. So for two
+ * positive, but decreasing, velocities, this contribution would be negative and will cause a
+ * smaller final velocity.
  *
- * Initial condition
- * There are two ways to deal with initial condition:
- * 1) Assume that v(0) = 0, which would mean that the subject is initially at rest.
- * This is not entirely accurate. We are only taking the past X ms of touch data, where X is
- * currently equal to 100. However, a touch event that created a fling probably lasted for longer
- * than that, which would mean that the user has already been interacting with the subject, and
- * it has probably already been moving.
- * 2) Assume that the subject has already been moving at a certain velocity, calculate this
- * initial velocity and the equivalent energy, and start with this initial energy.
- * Consider an example where we have the following data, consisting of 3 points:
- *                 time: t0, t1, t2
- *                 x   : x0, x1, x2
- *                 v   :  0, v1, v2
- * Here is what will happen in each of these scenarios:
+ * Initial condition There are two ways to deal with initial condition:
+ * 1) Assume that v(0) = 0, which would mean that the subject is initially at rest. This is not
+ *    entirely accurate. We are only taking the past X ms of touch data, where X is currently equal
+ *    to 100. However, a touch event that created a fling probably lasted for longer than that,
+ *    which would mean that the user has already been interacting with the subject, and it has
+ *    probably already been moving.
+ * 2) Assume that the subject has already been moving at a certain velocity, calculate this initial
+ *    velocity and the equivalent energy, and start with this initial energy. Consider an example
+ *    where we have the following data, consisting of 3 points: time: t0, t1, t2 x : x0, x1, x2 v :
+ *    0, v1, v2 Here is what will happen in each of these scenarios:
  * 1) By directly applying the formula above with the v(0) = 0 boundary condition, we will get
- * vfinal = sqrt(2*(|v1|*(v1-v0) + |v2|*(v2-v1))). This can be simplified since v0=0
- * vfinal = sqrt(2*(|v1|*v1 + |v2|*(v2-v1))) = sqrt(2*(v1^2 + |v2|*(v2 - v1)))
- * since velocity is a real number
+ *    vfinal = sqrt(2*(|v1|*(v1-v0) + |v2|*(v2-v1))). This can be simplified since v0=0 vfinal =
+ *    sqrt(2*(|v1|*v1 + |v2|*(v2-v1))) = sqrt(2*(v1^2 + |v2|*(v2 - v1))) since velocity is a real
+ *    number
  * 2) If we treat the subject as already moving, then it must already have an energy (per mass)
- * equal to 1/2*v1^2. Then the initial energy should be 1/2*v1*2, and only the second segment
- * will contribute to the total kinetic energy (since we can effectively consider that v0=v1).
- * This will give the following expression for the final velocity:
- * vfinal = sqrt(2*(1/2*v1^2 + |v2|*(v2-v1)))
- * This analysis can be generalized to an arbitrary number of samples.
+ *    equal to 1/2*v1^2. Then the initial energy should be 1/2*v1*2, and only the second segment
+ *    will contribute to the total kinetic energy (since we can effectively consider that v0=v1).
+ *    This will give the following expression for the final velocity: vfinal = sqrt(2*(1/2*v1^2 +
+ *    |v2|*(v2-v1))) This analysis can be generalized to an arbitrary number of samples.
  *
+ * Comparing the two equations above, we see that the only mathematical difference is the factor of
+ * 1/2 in front of the first velocity term. This boundary condition would allow for the "proper"
+ * calculation of the case when all of the samples are equally spaced in time and distance, which
+ * should suggest a constant velocity.
  *
- * Comparing the two equations above, we see that the only mathematical difference
- * is the factor of 1/2 in front of the first velocity term.
- * This boundary condition would allow for the "proper" calculation of the case when all of the
- * samples are equally spaced in time and distance, which should suggest a constant velocity.
- *
- * Note that approach 2) is sensitive to the proper ordering of the data in time, since
- * the boundary condition must be applied to the oldest sample to be accurate.
+ * Note that approach 2) is sensitive to the proper ordering of the data in time, since the boundary
+ * condition must be applied to the oldest sample to be accurate.
  *
  * NOTE: [sampleCount] MUST be >= 2
  */
@@ -610,8 +580,7 @@
             continue
         }
         val dataPointsDelta =
-            if (isDataDifferential) -dataPoints[i - 1]
-            else dataPoints[i] - dataPoints[i - 1]
+            if (isDataDifferential) -dataPoints[i - 1] else dataPoints[i] - dataPoints[i - 1]
         val vCurr = dataPointsDelta / (currentTime - nextTime)
         val vPrev = kineticEnergyToVelocity(work)
         work += (vCurr - vPrev) * abs(vCurr)
@@ -623,9 +592,8 @@
 }
 
 /**
- * Calculates the velocity for a given [kineticEnergy], using the formula:
- *          Kinetic Energy = 0.5 * mass * (velocity)^2
- * where a mass of "1" is used.
+ * Calculates the velocity for a given [kineticEnergy], using the formula: Kinetic Energy = 0.5 *
+ * mass * (velocity)^2 where a mass of "1" is used.
  */
 @Suppress("NOTHING_TO_INLINE")
 private inline fun kineticEnergyToVelocity(kineticEnergy: Float): Float {
@@ -642,8 +610,7 @@
     return result
 }
 
-@Suppress("NOTHING_TO_INLINE")
-private inline fun FloatArray.norm(): Float = sqrt(this.dot(this))
+@Suppress("NOTHING_TO_INLINE") private inline fun FloatArray.norm(): Float = sqrt(this.dot(this))
 
 private typealias Matrix = Array<FloatArray>
 
@@ -659,11 +626,10 @@
 }
 
 /**
- * Selecting flag to enable impulse strategy for the velocity trackers.
- * This is an experiment flag and will be removed once the experiments with the fix a finished. The
- * final goal is that we will use the true path once the flag is removed. If you find any issues
- * with the new fix, flip this flag to false to confirm they are newly introduced then file a bug.
- * Tracking bug: (b/318621681)
+ * Selecting flag to enable impulse strategy for the velocity trackers. This is an experiment flag
+ * and will be removed once the experiments with the fix a finished. The final goal is that we will
+ * use the true path once the flag is removed. If you find any issues with the new fix, flip this
+ * flag to false to confirm they are newly introduced then file a bug. Tracking bug: (b/318621681)
  */
 @Suppress("GetterSetterNames", "OPT_IN_MARKER_ON_WRONG_TARGET")
 @get:Suppress("GetterSetterNames")
diff --git a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/input/rotary/RotaryInputModifier.kt b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/input/rotary/RotaryInputModifier.kt
index d722547..993a03d 100644
--- a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/input/rotary/RotaryInputModifier.kt
+++ b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/input/rotary/RotaryInputModifier.kt
@@ -21,45 +21,42 @@
 import androidx.compose.ui.platform.InspectorInfo
 
 /**
- * Adding this [modifier][Modifier] to the [modifier][Modifier] parameter of a component will
- * allow it to intercept [RotaryScrollEvent]s if it (or one of its children) is focused.
+ * Adding this [modifier][Modifier] to the [modifier][Modifier] parameter of a component will allow
+ * it to intercept [RotaryScrollEvent]s if it (or one of its children) is focused.
  *
- * @param onRotaryScrollEvent This callback is invoked when the user interacts with the
- * rotary side button or the bezel on a wear device. While implementing this callback, return true
- * to stop propagation of this event. If you return false, the event will be sent to this
- * [onRotaryScrollEvent]'s parent.
- *
+ * @param onRotaryScrollEvent This callback is invoked when the user interacts with the rotary side
+ *   button or the bezel on a wear device. While implementing this callback, return true to stop
+ *   propagation of this event. If you return false, the event will be sent to this
+ *   [onRotaryScrollEvent]'s parent.
  * @return true if the event is consumed, false otherwise.
  *
- * Here is an example of a scrollable container that scrolls in response to
- * [RotaryScrollEvent]s.
+ * Here is an example of a scrollable container that scrolls in response to [RotaryScrollEvent]s.
+ *
  * @sample androidx.compose.ui.samples.RotaryEventSample
  *
- * This sample demonstrates how a parent can add an [onRotaryScrollEvent] modifier to gain
- * access to a [RotaryScrollEvent] when a child does not consume it:
+ * This sample demonstrates how a parent can add an [onRotaryScrollEvent] modifier to gain access to
+ * a [RotaryScrollEvent] when a child does not consume it:
+ *
  * @sample androidx.compose.ui.samples.PreRotaryEventSample
  */
-fun Modifier.onRotaryScrollEvent(
-    onRotaryScrollEvent: (RotaryScrollEvent) -> Boolean
-): Modifier = this then RotaryInputElement(
-    onRotaryScrollEvent = onRotaryScrollEvent,
-    onPreRotaryScrollEvent = null
-)
+fun Modifier.onRotaryScrollEvent(onRotaryScrollEvent: (RotaryScrollEvent) -> Boolean): Modifier =
+    this then
+        RotaryInputElement(onRotaryScrollEvent = onRotaryScrollEvent, onPreRotaryScrollEvent = null)
 
 /**
- * Adding this [modifier][Modifier] to the [modifier][Modifier] parameter of a component will
- * allow it to intercept [RotaryScrollEvent]s if it (or one of its children) is focused.
+ * Adding this [modifier][Modifier] to the [modifier][Modifier] parameter of a component will allow
+ * it to intercept [RotaryScrollEvent]s if it (or one of its children) is focused.
  *
- * @param onPreRotaryScrollEvent This callback is invoked when the user interacts with the
- * rotary button on a wear device. It gives ancestors of a focused component the chance to
- * intercept a [RotaryScrollEvent].
+ * @param onPreRotaryScrollEvent This callback is invoked when the user interacts with the rotary
+ *   button on a wear device. It gives ancestors of a focused component the chance to intercept a
+ *   [RotaryScrollEvent].
  *
- * When the user rotates the side button on a wear device, a [RotaryScrollEvent] is sent to
- * the focused item. Before reaching the focused item, this event starts at the root composable,
- * and propagates down the hierarchy towards the focused item. It invokes any
- * [onPreRotaryScrollEvent]s it encounters on ancestors of the focused item. After reaching
- * the focused item, the event propagates up the hierarchy back towards the parent. It invokes any
- * [onRotaryScrollEvent]s it encounters on its way back.
+ * When the user rotates the side button on a wear device, a [RotaryScrollEvent] is sent to the
+ * focused item. Before reaching the focused item, this event starts at the root composable, and
+ * propagates down the hierarchy towards the focused item. It invokes any [onPreRotaryScrollEvent]s
+ * it encounters on ancestors of the focused item. After reaching the focused item, the event
+ * propagates up the hierarchy back towards the parent. It invokes any [onRotaryScrollEvent]s it
+ * encounters on its way back.
  *
  * Return true to indicate that you consumed the event and want to stop propagation of this event.
  *
@@ -69,19 +66,19 @@
  */
 fun Modifier.onPreRotaryScrollEvent(
     onPreRotaryScrollEvent: (RotaryScrollEvent) -> Boolean
-): Modifier = this then RotaryInputElement(
-    onRotaryScrollEvent = null,
-    onPreRotaryScrollEvent = onPreRotaryScrollEvent
-)
+): Modifier =
+    this then
+        RotaryInputElement(
+            onRotaryScrollEvent = null,
+            onPreRotaryScrollEvent = onPreRotaryScrollEvent
+        )
 
 private data class RotaryInputElement(
     val onRotaryScrollEvent: ((RotaryScrollEvent) -> Boolean)?,
     val onPreRotaryScrollEvent: ((RotaryScrollEvent) -> Boolean)?
 ) : ModifierNodeElement<RotaryInputNode>() {
-    override fun create() = RotaryInputNode(
-        onEvent = onRotaryScrollEvent,
-        onPreEvent = onPreRotaryScrollEvent
-    )
+    override fun create() =
+        RotaryInputNode(onEvent = onRotaryScrollEvent, onPreEvent = onPreRotaryScrollEvent)
 
     override fun update(node: RotaryInputNode) {
         node.onEvent = onRotaryScrollEvent
@@ -104,8 +101,8 @@
     var onEvent: ((RotaryScrollEvent) -> Boolean)?,
     var onPreEvent: ((RotaryScrollEvent) -> Boolean)?
 ) : RotaryInputModifierNode, Modifier.Node() {
-    override fun onRotaryScrollEvent(event: RotaryScrollEvent) =
-        onEvent?.invoke(event) ?: false
+    override fun onRotaryScrollEvent(event: RotaryScrollEvent) = onEvent?.invoke(event) ?: false
+
     override fun onPreRotaryScrollEvent(event: RotaryScrollEvent) =
         onPreEvent?.invoke(event) ?: false
 }
diff --git a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/input/rotary/RotaryInputModifierNode.kt b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/input/rotary/RotaryInputModifierNode.kt
index d59566c..acc92f5 100644
--- a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/input/rotary/RotaryInputModifierNode.kt
+++ b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/input/rotary/RotaryInputModifierNode.kt
@@ -38,9 +38,9 @@
     /**
      * This function is called when a [RotaryScrollEvent] is received by this node during the
      * downward pass. It gives ancestors of a focused component the chance to intercept an event.
-     * Return true to stop propagation of this event. If you return false, the event will be sent
-     * to this [RotaryInputModifierNode]'s child. If none of the children consume the event,
-     * it will be sent back up to the root using the [onRotaryScrollEvent] function.
+     * Return true to stop propagation of this event. If you return false, the event will be sent to
+     * this [RotaryInputModifierNode]'s child. If none of the children consume the event, it will be
+     * sent back up to the root using the [onRotaryScrollEvent] function.
      */
     fun onPreRotaryScrollEvent(event: RotaryScrollEvent): Boolean
 }
diff --git a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/input/rotary/RotaryScrollEvent.kt b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/input/rotary/RotaryScrollEvent.kt
index 10ec62d..599468d 100644
--- a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/input/rotary/RotaryScrollEvent.kt
+++ b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/input/rotary/RotaryScrollEvent.kt
@@ -16,19 +16,17 @@
 
 package androidx.compose.ui.input.rotary
 
-/**
- * This event represents a rotary input event.
- */
+/** This event represents a rotary input event. */
 expect class RotaryScrollEvent {
     /**
-     * The amount to scroll (in pixels) in response to a [RotaryScrollEvent] in a container that
-     * can scroll vertically.
+     * The amount to scroll (in pixels) in response to a [RotaryScrollEvent] in a container that can
+     * scroll vertically.
      */
     val verticalScrollPixels: Float
 
     /**
-     * The amount to scroll (in pixels) in response to a [RotaryScrollEvent] in a container that
-     * can scroll horizontally.
+     * The amount to scroll (in pixels) in response to a [RotaryScrollEvent] in a container that can
+     * scroll horizontally.
      */
     val horizontalScrollPixels: Float
 
diff --git a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/internal/InlineClassHelper.kt b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/internal/InlineClassHelper.kt
index 693613b..cae8d987 100644
--- a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/internal/InlineClassHelper.kt
+++ b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/internal/InlineClassHelper.kt
@@ -39,9 +39,7 @@
 @Suppress("BanInlineOptIn")
 @OptIn(ExperimentalContracts::class)
 internal inline fun checkPrecondition(value: Boolean, lazyMessage: () -> String) {
-    contract {
-        returns() implies value
-    }
+    contract { returns() implies value }
     if (!value) {
         throwIllegalStateException(lazyMessage())
     }
@@ -50,9 +48,7 @@
 @Suppress("NOTHING_TO_INLINE", "BanInlineOptIn")
 @OptIn(ExperimentalContracts::class)
 internal inline fun checkPrecondition(value: Boolean) {
-    contract {
-        returns() implies value
-    }
+    contract { returns() implies value }
     if (!value) {
         throwIllegalStateException("Check failed.")
     }
@@ -63,9 +59,7 @@
 @Suppress("BanInlineOptIn")
 @OptIn(ExperimentalContracts::class)
 internal inline fun <T : Any> checkPreconditionNotNull(value: T?, lazyMessage: () -> String): T {
-    contract {
-        returns() implies (value != null)
-    }
+    contract { returns() implies (value != null) }
 
     if (value == null) {
         throwIllegalStateExceptionForNullCheck(lazyMessage())
@@ -78,9 +72,7 @@
 @Suppress("NOTHING_TO_INLINE", "BanInlineOptIn")
 @OptIn(ExperimentalContracts::class)
 internal inline fun <T : Any> checkPreconditionNotNull(value: T?): T {
-    contract {
-        returns() implies (value != null)
-    }
+    contract { returns() implies (value != null) }
 
     if (value == null) {
         throwIllegalStateExceptionForNullCheck("Required value was null.")
@@ -93,9 +85,7 @@
 @Suppress("BanInlineOptIn")
 @OptIn(ExperimentalContracts::class) // same opt-in as using Kotlin's require()
 internal inline fun requirePrecondition(value: Boolean, lazyMessage: () -> String) {
-    contract {
-        returns() implies value
-    }
+    contract { returns() implies value }
     if (!value) {
         throwIllegalArgumentException(lazyMessage())
     }
diff --git a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/layout/AlignmentLine.kt b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/layout/AlignmentLine.kt
index d0e1a7d..856319e 100644
--- a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/layout/AlignmentLine.kt
+++ b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/layout/AlignmentLine.kt
@@ -22,25 +22,25 @@
 
 /**
  * Defines an offset line that can be used by parent layouts to align and position their children.
- * Text baselines are representative examples of [AlignmentLine]s. For example, they can be used
- * by `Row`, to align its children by baseline, or by `paddingFrom` to achieve a layout
- * with a specific distance from the top to the baseline of the text content. [AlignmentLine]s
- * can be understood as an abstraction over text baselines.
+ * Text baselines are representative examples of [AlignmentLine]s. For example, they can be used by
+ * `Row`, to align its children by baseline, or by `paddingFrom` to achieve a layout with a specific
+ * distance from the top to the baseline of the text content. [AlignmentLine]s can be understood as
+ * an abstraction over text baselines.
  *
- * When a layout provides a value for a particular [AlignmentLine], this can be read by the
- * parents of the layout after measuring, using the [Placeable.get] operator on the corresponding
+ * When a layout provides a value for a particular [AlignmentLine], this can be read by the parents
+ * of the layout after measuring, using the [Placeable.get] operator on the corresponding
  * [Placeable] instance. Based on the position of the [AlignmentLine], the parents can then decide
  * the positioning of the children.
  *
  * Note that when a layout provides a value for an [AlignmentLine], this will be automatically
- * inherited by the layout's parent, which will offset the value by the position of the child
- * within itself. This way, nested layout hierarchies are able to preserve the [AlignmentLine]s
- * defined for deeply nested children, making it possible for non-direct parents to use these for
- * positioning and alignment. When a layout inherits multiple values for the same [AlignmentLine]
- * from different children, the position of the line within the layout will be computed by merging
- * the children values using the provided [merger]. If a layout provides a value for an
- * [AlignmentLine], this will always be the position of the line, regardless of the values
- * provided by children for the same line.
+ * inherited by the layout's parent, which will offset the value by the position of the child within
+ * itself. This way, nested layout hierarchies are able to preserve the [AlignmentLine]s defined for
+ * deeply nested children, making it possible for non-direct parents to use these for positioning
+ * and alignment. When a layout inherits multiple values for the same [AlignmentLine] from different
+ * children, the position of the line within the layout will be computed by merging the children
+ * values using the provided [merger]. If a layout provides a value for an [AlignmentLine], this
+ * will always be the position of the line, regardless of the values provided by children for the
+ * same line.
  *
  * [AlignmentLine]s cannot be created directly, please create [VerticalAlignmentLine] or
  * [HorizontalAlignmentLine] instances instead.
@@ -51,30 +51,26 @@
  * @see HorizontalAlignmentLine
  */
 @Immutable
-sealed class AlignmentLine(
-    internal val merger: (Int, Int) -> Int
-) {
+sealed class AlignmentLine(internal val merger: (Int, Int) -> Int) {
     companion object {
-        /**
-         * Constant representing that an [AlignmentLine] has not been provided.
-         */
+        /** Constant representing that an [AlignmentLine] has not been provided. */
         const val Unspecified = Int.MIN_VALUE
     }
 }
 
 /**
- * Merges two values of the current [alignment line][AlignmentLine].
- * This is used when a layout inherits multiple values for the same [AlignmentLine]
- * from different children, so the position of the line within the layout will be computed
- * by merging the children values using the provided [AlignmentLine.merger].
+ * Merges two values of the current [alignment line][AlignmentLine]. This is used when a layout
+ * inherits multiple values for the same [AlignmentLine] from different children, so the position of
+ * the line within the layout will be computed by merging the children values using the provided
+ * [AlignmentLine.merger].
  */
 internal fun AlignmentLine.merge(position1: Int, position2: Int) = merger(position1, position2)
 
 /**
  * A vertical [AlignmentLine]. Defines a vertical offset line that can be used by parent layouts
  * usually to align or position their children horizontally. The positions of the alignment lines
- * will be automatically inherited by parent layouts from their content, and the [merger] will
- * be used to merge multiple line positions when more than one child provides a specific
+ * will be automatically inherited by parent layouts from their content, and the [merger] will be
+ * used to merge multiple line positions when more than one child provides a specific
  * [AlignmentLine]. See [AlignmentLine] for more details.
  *
  * @param merger How to merge two alignment line values defined by different children
@@ -84,13 +80,12 @@
 /**
  * A horizontal [AlignmentLine]. Defines an horizontal offset line that can be used by parent
  * layouts usually to align or position their children vertically. Text baselines (`FirstBaseline`
- * and `LastBaseline`) are representative examples of [HorizontalAlignmentLine]s. For example,
- * they can be used by `Row`, to align its children by baseline, or by `paddingFrom` to
- * achieve a layout with a specific from the top to the baseline of the text content.
- * The positions of the alignment lines will be automatically inherited by parent layouts from
- * their content, and the [merger] will be used to merge multiple line positions when more
- * than one child provides a specific [HorizontalAlignmentLine]. See [AlignmentLine]
- * for more details.
+ * and `LastBaseline`) are representative examples of [HorizontalAlignmentLine]s. For example, they
+ * can be used by `Row`, to align its children by baseline, or by `paddingFrom` to achieve a layout
+ * with a specific from the top to the baseline of the text content. The positions of the alignment
+ * lines will be automatically inherited by parent layouts from their content, and the [merger] will
+ * be used to merge multiple line positions when more than one child provides a specific
+ * [HorizontalAlignmentLine]. See [AlignmentLine] for more details.
  *
  * @param merger How to merge two alignment line values defined by different children
  */
diff --git a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/layout/ApproachLayoutModifierNode.kt b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/layout/ApproachLayoutModifierNode.kt
index 0f58b93..5f4462d 100644
--- a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/layout/ApproachLayoutModifierNode.kt
+++ b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/layout/ApproachLayoutModifierNode.kt
@@ -26,11 +26,11 @@
  * calculated in the lookahead pass. This can be particularly helpful when the destination layout is
  * anticipated to change drastically and would consequently result in visual disruptions.
  *
- * In order to create a smooth approach, an interpolation (often through animations) can be used
- * in [approachMeasure] to interpolate the measurement or placement from a previously recorded size
- * and/or position to the destination/target size and/or position. The destination size is
- * available in [ApproachMeasureScope] as [ApproachMeasureScope.lookaheadSize]. And the target
- * position can also be acquired in [ApproachMeasureScope] during placement by using
+ * In order to create a smooth approach, an interpolation (often through animations) can be used in
+ * [approachMeasure] to interpolate the measurement or placement from a previously recorded size
+ * and/or position to the destination/target size and/or position. The destination size is available
+ * in [ApproachMeasureScope] as [ApproachMeasureScope.lookaheadSize]. And the target position can
+ * also be acquired in [ApproachMeasureScope] during placement by using
  * [LookaheadScope.localLookaheadPositionOf] with the layout's
  * [Placeable.PlacementScope.coordinates]. The sample code below illustrates how that can be
  * achieved.
@@ -38,8 +38,8 @@
  * During the lookahead pass, [measure] will be invoked. By default [measure] simply passes the
  * incoming constraints to its child, and returns the child measure result to parent without any
  * modification. The default behavior for [measure] is simply a pass through of constraints and
- * measure results without modification. This can be overridden as needed. [approachMeasure]
- * will be invoked during the approach pass after lookahead.
+ * measure results without modification. This can be overridden as needed. [approachMeasure] will be
+ * invoked during the approach pass after lookahead.
  *
  * [isMeasurementApproachInProgress] signals whether the measurement is in progress of approaching
  * destination size. It will be queried after the destination has been determined by the lookahead
@@ -53,11 +53,10 @@
  * destination position has been determined by lookahead pass, and before the placement phase in
  * [approachMeasure].
  *
- * **IMPORTANT**:
- * When both [isMeasurementApproachInProgress] and [isPlacementApproachInProgress] become false, the
- * approach is considered complete. Approach pass will subsequently snap the measurement and
- * placement to lookahead measurement and placement. Once approach is complete, [approachMeasure]
- * may never be invoked until either [isMeasurementApproachInProgress] or
+ * **IMPORTANT**: When both [isMeasurementApproachInProgress] and [isPlacementApproachInProgress]
+ * become false, the approach is considered complete. Approach pass will subsequently snap the
+ * measurement and placement to lookahead measurement and placement. Once approach is complete,
+ * [approachMeasure] may never be invoked until either [isMeasurementApproachInProgress] or
  * [isPlacementApproachInProgress] becomes true again. Therefore it is important to ensure
  * [approachMeasure] and [measure] result in the same measurement and placement when the approach is
  * complete. Otherwise, there may be visual discontinuity when we snap the measurement and placement
@@ -85,8 +84,8 @@
 
     /**
      * [isPlacementApproachInProgress] indicates whether the position is approaching destination
-     * defined by the lookahead, hence it's a signal to the system for whether additional
-     * approach placements are necessary. [isPlacementApproachInProgress] will be invoked after the
+     * defined by the lookahead, hence it's a signal to the system for whether additional approach
+     * placements are necessary. [isPlacementApproachInProgress] will be invoked after the
      * destination position has been determined by lookahead pass, and before the placement phase in
      * [approachMeasure].
      *
@@ -105,27 +104,23 @@
     override fun MeasureScope.measure(
         measurable: Measurable,
         constraints: Constraints
-    ): MeasureResult = measurable.measure(constraints).run {
-        layout(width, height) {
-            place(0, 0)
-        }
-    }
+    ): MeasureResult = measurable.measure(constraints).run { layout(width, height) { place(0, 0) } }
 
     /**
      * [approachMeasure] defines how the measurement and placement of the layout approach the
      * destination size and position. In order to achieve a smooth approach from the current size
-     * and position to the destination, an interpolation (often through animations) can be used
-     * in [approachMeasure] to interpolate the measurement or placement from a previously recorded
-     * size and position to the destination/target size and position. The destination size is
-     * available in [ApproachMeasureScope] as [ApproachMeasureScope.lookaheadSize]. And the target
-     * position can also be acquired in [ApproachMeasureScope] during placement by using
+     * and position to the destination, an interpolation (often through animations) can be used in
+     * [approachMeasure] to interpolate the measurement or placement from a previously recorded size
+     * and position to the destination/target size and position. The destination size is available
+     * in [ApproachMeasureScope] as [ApproachMeasureScope.lookaheadSize]. And the target position
+     * can also be acquired in [ApproachMeasureScope] during placement by using
      * [LookaheadScope.localLookaheadPositionOf] with the layout's
      * [Placeable.PlacementScope.coordinates]. Please see sample code below for how that can be
      * achieved.
      *
      * Note: [approachMeasure] is only guaranteed to be invoked when either
-     * [isMeasurementApproachInProgress] or [isMeasurementApproachInProgress] is true. Otherwise, the
-     * system will consider the approach complete (i.e. destination reached) and may skip the
+     * [isMeasurementApproachInProgress] or [isMeasurementApproachInProgress] is true. Otherwise,
+     * the system will consider the approach complete (i.e. destination reached) and may skip the
      * approach pass when possible.
      *
      * @sample androidx.compose.ui.samples.LookaheadLayoutCoordinatesSample
@@ -135,63 +130,59 @@
         constraints: Constraints
     ): MeasureResult
 
-    /**
-     * The function used to calculate minIntrinsicWidth for the approach pass changes.
-     */
+    /** The function used to calculate minIntrinsicWidth for the approach pass changes. */
     fun ApproachIntrinsicMeasureScope.minApproachIntrinsicWidth(
         measurable: IntrinsicMeasurable,
         height: Int
-    ): Int = NodeMeasuringIntrinsics.minWidth(
-        NodeMeasuringIntrinsics.ApproachMeasureBlock { intrinsicMeasurable, constraints ->
-            approachMeasure(intrinsicMeasurable, constraints)
-        },
-        this,
-        measurable,
-        height
-    )
+    ): Int =
+        NodeMeasuringIntrinsics.minWidth(
+            NodeMeasuringIntrinsics.ApproachMeasureBlock { intrinsicMeasurable, constraints ->
+                approachMeasure(intrinsicMeasurable, constraints)
+            },
+            this,
+            measurable,
+            height
+        )
 
-    /**
-     * The function used to calculate minIntrinsicHeight for the approach pass changes.
-     */
+    /** The function used to calculate minIntrinsicHeight for the approach pass changes. */
     fun ApproachIntrinsicMeasureScope.minApproachIntrinsicHeight(
         measurable: IntrinsicMeasurable,
         width: Int
-    ): Int = NodeMeasuringIntrinsics.minHeight(
-        NodeMeasuringIntrinsics.ApproachMeasureBlock { intrinsicMeasurable, constraints ->
-            approachMeasure(intrinsicMeasurable, constraints)
-        },
-        this,
-        measurable,
-        width
-    )
+    ): Int =
+        NodeMeasuringIntrinsics.minHeight(
+            NodeMeasuringIntrinsics.ApproachMeasureBlock { intrinsicMeasurable, constraints ->
+                approachMeasure(intrinsicMeasurable, constraints)
+            },
+            this,
+            measurable,
+            width
+        )
 
-    /**
-     * The function used to calculate maxIntrinsicWidth for the approach pass changes.
-     */
+    /** The function used to calculate maxIntrinsicWidth for the approach pass changes. */
     fun ApproachIntrinsicMeasureScope.maxApproachIntrinsicWidth(
         measurable: IntrinsicMeasurable,
         height: Int
-    ): Int = NodeMeasuringIntrinsics.maxWidth(
-        NodeMeasuringIntrinsics.ApproachMeasureBlock { intrinsicMeasurable, constraints ->
-            approachMeasure(intrinsicMeasurable, constraints)
-        },
-        this,
-        measurable,
-        height
-    )
+    ): Int =
+        NodeMeasuringIntrinsics.maxWidth(
+            NodeMeasuringIntrinsics.ApproachMeasureBlock { intrinsicMeasurable, constraints ->
+                approachMeasure(intrinsicMeasurable, constraints)
+            },
+            this,
+            measurable,
+            height
+        )
 
-    /**
-     * The function used to calculate maxIntrinsicHeight for the approach pass changes.
-     */
+    /** The function used to calculate maxIntrinsicHeight for the approach pass changes. */
     fun ApproachIntrinsicMeasureScope.maxApproachIntrinsicHeight(
         measurable: IntrinsicMeasurable,
         width: Int
-    ): Int = NodeMeasuringIntrinsics.maxHeight(
-        NodeMeasuringIntrinsics.ApproachMeasureBlock { intrinsicMeasurable, constraints ->
-            approachMeasure(intrinsicMeasurable, constraints)
-        },
-        this,
-        measurable,
-        width
-    )
+    ): Int =
+        NodeMeasuringIntrinsics.maxHeight(
+            NodeMeasuringIntrinsics.ApproachMeasureBlock { intrinsicMeasurable, constraints ->
+                approachMeasure(intrinsicMeasurable, constraints)
+            },
+            this,
+            measurable,
+            width
+        )
 }
diff --git a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/layout/ApproachMeasureScope.kt b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/layout/ApproachMeasureScope.kt
index 94e83fc..64bffde 100644
--- a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/layout/ApproachMeasureScope.kt
+++ b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/layout/ApproachMeasureScope.kt
@@ -25,14 +25,10 @@
 import androidx.compose.ui.unit.Constraints
 import androidx.compose.ui.unit.IntSize
 
-/**
- * The receiver scope of a layout's intrinsic approach measurements lambdas.
- */
+/** The receiver scope of a layout's intrinsic approach measurements lambdas. */
 sealed interface ApproachIntrinsicMeasureScope : IntrinsicMeasureScope {
 
-    /**
-     * Constraints used to measure the layout in the lookahead pass.
-     */
+    /** Constraints used to measure the layout in the lookahead pass. */
     val lookaheadConstraints: Constraints
 
     /**
@@ -44,14 +40,14 @@
 }
 
 /**
- * [ApproachMeasureScope] provides access to lookahead results to allow
- * [ApproachLayoutModifierNode] to leverage lookahead results to define how
- * measurements and placements approach their destination.
+ * [ApproachMeasureScope] provides access to lookahead results to allow [ApproachLayoutModifierNode]
+ * to leverage lookahead results to define how measurements and placements approach their
+ * destination.
  *
- * [ApproachMeasureScope.lookaheadSize] provides the target size of the layout.
- * By knowing the target size and position, layout adjustments such as animations can be defined
- * in [ApproachLayoutModifierNode] to morph the layout gradually in both size and position
- * to arrive at its precalculated bounds.
+ * [ApproachMeasureScope.lookaheadSize] provides the target size of the layout. By knowing the
+ * target size and position, layout adjustments such as animations can be defined in
+ * [ApproachLayoutModifierNode] to morph the layout gradually in both size and position to arrive at
+ * its precalculated bounds.
  */
 sealed interface ApproachMeasureScope : ApproachIntrinsicMeasureScope, MeasureScope
 
@@ -60,9 +56,11 @@
     var approachNode: ApproachLayoutModifierNode,
 ) : ApproachMeasureScope, MeasureScope by coordinator, LookaheadScope {
     override val lookaheadConstraints: Constraints
-        get() = requireNotNull(coordinator.lookaheadConstraints) {
-            "Error: Lookahead constraints requested before lookahead measure."
-        }
+        get() =
+            requireNotNull(coordinator.lookaheadConstraints) {
+                "Error: Lookahead constraints requested before lookahead measure."
+            }
+
     override val lookaheadSize: IntSize
         get() = coordinator.lookaheadDelegate!!.measureResult.let { IntSize(it.width, it.height) }
 
@@ -85,7 +83,7 @@
             }
             return if (lookaheadRoot.isVirtualLookaheadRoot) {
                 lookaheadRoot.parent?.innerCoordinator
-                // Root node is in a lookahead scope
+                    // Root node is in a lookahead scope
                     ?: lookaheadRoot.children[0].outerCoordinator
             } else {
                 lookaheadRoot.outerCoordinator
@@ -104,9 +102,9 @@
             override val width = width
             override val height = height
 
-            @Suppress("PrimitiveInCollection")
-            override val alignmentLines = alignmentLines
+            @Suppress("PrimitiveInCollection") override val alignmentLines = alignmentLines
             override val rulers = rulers
+
             override fun placeChildren() {
                 coordinator.placementScope.placementBlock()
             }
diff --git a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/layout/BeyondBoundsLayout.kt b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/layout/BeyondBoundsLayout.kt
index ce50b33..9c32421 100644
--- a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/layout/BeyondBoundsLayout.kt
+++ b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/layout/BeyondBoundsLayout.kt
@@ -21,51 +21,44 @@
 import kotlin.jvm.JvmInline
 
 /**
- * A modifier local that provides access to a [BeyondBoundsLayout] that a child can use to
- * ask a parent to layout more items that are beyond its visible bounds.
+ * A modifier local that provides access to a [BeyondBoundsLayout] that a child can use to ask a
+ * parent to layout more items that are beyond its visible bounds.
  */
 val ModifierLocalBeyondBoundsLayout: ProvidableModifierLocal<BeyondBoundsLayout?> =
-    modifierLocalOf { null }
+    modifierLocalOf {
+        null
+    }
 
 /**
  * Layout extra items in the specified direction.
  *
  * A [BeyondBoundsLayout] instance can be obtained by consuming the
- * [BeyondBoundsLayout modifier local][ModifierLocalBeyondBoundsLayout].
- * It can be used to send a request to layout more items in a particular
- * [direction][LayoutDirection]. This can be useful when composition or layout is determined lazily,
- * as with a LazyColumn. The request is received by any parent up the hierarchy that provides this
- * modifier local.
+ * [BeyondBoundsLayout modifier local][ModifierLocalBeyondBoundsLayout]. It can be used to send a
+ * request to layout more items in a particular [direction][LayoutDirection]. This can be useful
+ * when composition or layout is determined lazily, as with a LazyColumn. The request is received by
+ * any parent up the hierarchy that provides this modifier local.
  */
 interface BeyondBoundsLayout {
     /**
-     * Send a request to layout more items in the specified
-     * [direction][LayoutDirection]. The request is received by a parent up the
-     * hierarchy. The parent adds one item at a time and calls [block] after each item is added.
-     * The parent continues adding new items as long as [block] returns null. Once you have all
-     * the items you need, you can perform some operation and return a non-null value. Returning
-     * this value stops the laying out of beyond bounds items. (Note that you have to return a
-     * non-null value stop iterating).
+     * Send a request to layout more items in the specified [direction][LayoutDirection]. The
+     * request is received by a parent up the hierarchy. The parent adds one item at a time and
+     * calls [block] after each item is added. The parent continues adding new items as long as
+     * [block] returns null. Once you have all the items you need, you can perform some operation
+     * and return a non-null value. Returning this value stops the laying out of beyond bounds
+     * items. (Note that you have to return a non-null value stop iterating).
      *
      * @param direction The direction from the visible bounds in which more items are requested.
      * @param block Continue to layout more items until this block returns a non null item.
-     * @return The value returned by the last run of [block]. If we layout all the available
-     * items then the returned value is null. When this function returns all the beyond bounds items
-     * may be disposed. Therefore you have to perform any custom logic within the [block] and return
-     * the value you need.
+     * @return The value returned by the last run of [block]. If we layout all the available items
+     *   then the returned value is null. When this function returns all the beyond bounds items may
+     *   be disposed. Therefore you have to perform any custom logic within the [block] and return
+     *   the value you need.
      */
-    fun <T> layout(
-        direction: LayoutDirection,
-        block: BeyondBoundsScope.() -> T?
-    ): T?
+    fun <T> layout(direction: LayoutDirection, block: BeyondBoundsScope.() -> T?): T?
 
-    /**
-     * The scope used in [BeyondBoundsLayout.layout].
-     */
+    /** The scope used in [BeyondBoundsLayout.layout]. */
     interface BeyondBoundsScope {
-        /**
-         * Whether we have more content to lay out in the specified direction.
-         */
+        /** Whether we have more content to lay out in the specified direction. */
         val hasMoreContent: Boolean
     }
 
@@ -74,9 +67,7 @@
      * to be laid.
      */
     @JvmInline
-    value class LayoutDirection internal constructor(
-        @Suppress("unused") private val value: Int
-    ) {
+    value class LayoutDirection internal constructor(@Suppress("unused") private val value: Int) {
         companion object {
             /**
              * Direction used in [BeyondBoundsLayout.layout] to request the layout of extra items
@@ -89,13 +80,13 @@
              */
             val After = LayoutDirection(2)
             /**
-             * Direction used in [BeyondBoundsLayout.layout] to request the layout of extra items
-             * to the left of the current bounds.
+             * Direction used in [BeyondBoundsLayout.layout] to request the layout of extra items to
+             * the left of the current bounds.
              */
             val Left = LayoutDirection(3)
             /**
-             * Direction used in [BeyondBoundsLayout.layout] to request the layout of extra items
-             * to the right of the current bounds.
+             * Direction used in [BeyondBoundsLayout.layout] to request the layout of extra items to
+             * the right of the current bounds.
              */
             val Right = LayoutDirection(4)
             /**
@@ -110,14 +101,15 @@
             val Below = LayoutDirection(6)
         }
 
-        override fun toString(): String = when (this) {
-            Before -> "Before"
-            After -> "After"
-            Left -> "Left"
-            Right -> "Right"
-            Above -> "Above"
-            Below -> "Below"
-            else -> "invalid LayoutDirection"
-        }
+        override fun toString(): String =
+            when (this) {
+                Before -> "Before"
+                After -> "After"
+                Left -> "Left"
+                Right -> "Right"
+                Above -> "Above"
+                Below -> "Below"
+                else -> "invalid LayoutDirection"
+            }
     }
 }
diff --git a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/layout/ContentScale.kt b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/layout/ContentScale.kt
index 44e9e8c..d6ce074 100644
--- a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/layout/ContentScale.kt
+++ b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/layout/ContentScale.kt
@@ -22,21 +22,17 @@
 import kotlin.math.max
 import kotlin.math.min
 
-/**
- * Represents a rule to apply to scale a source rectangle to be inscribed into a destination
- */
+/** Represents a rule to apply to scale a source rectangle to be inscribed into a destination */
 @Stable
 interface ContentScale {
 
     /**
-     * Computes the scale factor to apply to the horizontal and vertical axes independently
-     * of one another to fit the source appropriately with the given destination
+     * Computes the scale factor to apply to the horizontal and vertical axes independently of one
+     * another to fit the source appropriately with the given destination
      */
     fun computeScaleFactor(srcSize: Size, dstSize: Size): ScaleFactor
 
-    /**
-     * Companion object containing commonly used [ContentScale] implementations
-     */
+    /** Companion object containing commonly used [ContentScale] implementations */
     companion object {
 
         /**
@@ -48,12 +44,11 @@
          * provides similar behavior to [android.widget.ImageView.ScaleType.CENTER_CROP]
          */
         @Stable
-        val Crop = object : ContentScale {
-            override fun computeScaleFactor(srcSize: Size, dstSize: Size): ScaleFactor =
-                computeFillMaxDimension(srcSize, dstSize).let {
-                    ScaleFactor(it, it)
-                }
-        }
+        val Crop =
+            object : ContentScale {
+                override fun computeScaleFactor(srcSize: Size, dstSize: Size): ScaleFactor =
+                    computeFillMaxDimension(srcSize, dstSize).let { ScaleFactor(it, it) }
+            }
 
         /**
          * Scale the source uniformly (maintaining the source's aspect ratio) so that both
@@ -64,12 +59,11 @@
          * provides similar behavior to [android.widget.ImageView.ScaleType.FIT_CENTER]
          */
         @Stable
-        val Fit = object : ContentScale {
-            override fun computeScaleFactor(srcSize: Size, dstSize: Size): ScaleFactor =
-                computeFillMinDimension(srcSize, dstSize).let {
-                    ScaleFactor(it, it)
-                }
-        }
+        val Fit =
+            object : ContentScale {
+                override fun computeScaleFactor(srcSize: Size, dstSize: Size): ScaleFactor =
+                    computeFillMinDimension(srcSize, dstSize).let { ScaleFactor(it, it) }
+            }
 
         /**
          * Scale the source maintaining the aspect ratio so that the bounds match the destination
@@ -77,74 +71,65 @@
          * the width.
          */
         @Stable
-        val FillHeight = object : ContentScale {
-            override fun computeScaleFactor(srcSize: Size, dstSize: Size): ScaleFactor =
-                computeFillHeight(srcSize, dstSize).let {
-                    ScaleFactor(it, it)
-                }
-        }
+        val FillHeight =
+            object : ContentScale {
+                override fun computeScaleFactor(srcSize: Size, dstSize: Size): ScaleFactor =
+                    computeFillHeight(srcSize, dstSize).let { ScaleFactor(it, it) }
+            }
 
         /**
-         * Scale the source maintaining the aspect ratio so that the bounds match the
-         * destination width. This can cover a larger area than the destination if the width is
-         * larger than the height.
+         * Scale the source maintaining the aspect ratio so that the bounds match the destination
+         * width. This can cover a larger area than the destination if the width is larger than the
+         * height.
          */
         @Stable
-        val FillWidth = object : ContentScale {
-            override fun computeScaleFactor(srcSize: Size, dstSize: Size): ScaleFactor =
-                computeFillWidth(srcSize, dstSize).let {
-                    ScaleFactor(it, it)
-                }
-        }
+        val FillWidth =
+            object : ContentScale {
+                override fun computeScaleFactor(srcSize: Size, dstSize: Size): ScaleFactor =
+                    computeFillWidth(srcSize, dstSize).let { ScaleFactor(it, it) }
+            }
 
         /**
-         * Scale the source to maintain the aspect ratio to be inside the destination bounds
-         * if the source is larger than the destination. If the source is smaller than or equal
-         * to the destination in both dimensions, this behaves similarly to [None]. This will
-         * always be contained within the bounds of the destination.
+         * Scale the source to maintain the aspect ratio to be inside the destination bounds if the
+         * source is larger than the destination. If the source is smaller than or equal to the
+         * destination in both dimensions, this behaves similarly to [None]. This will always be
+         * contained within the bounds of the destination.
          *
          * This [ContentScale] implementation in combination with usage of [Alignment.Center]
          * provides similar behavior to [android.widget.ImageView.ScaleType.CENTER_INSIDE]
          */
         @Stable
-        val Inside = object : ContentScale {
+        val Inside =
+            object : ContentScale {
 
-            override fun computeScaleFactor(srcSize: Size, dstSize: Size): ScaleFactor {
-                return if (srcSize.width <= dstSize.width &&
-                    srcSize.height <= dstSize.height
-                ) {
-                    ScaleFactor(1.0f, 1.0f)
-                } else {
-                    computeFillMinDimension(srcSize, dstSize).let {
-                        ScaleFactor(it, it)
+                override fun computeScaleFactor(srcSize: Size, dstSize: Size): ScaleFactor {
+                    return if (srcSize.width <= dstSize.width && srcSize.height <= dstSize.height) {
+                        ScaleFactor(1.0f, 1.0f)
+                    } else {
+                        computeFillMinDimension(srcSize, dstSize).let { ScaleFactor(it, it) }
                     }
                 }
             }
-        }
 
-        /**
-         * Do not apply any scaling to the source
-         */
-        @Stable
-        val None = FixedScale(1.0f)
+        /** Do not apply any scaling to the source */
+        @Stable val None = FixedScale(1.0f)
 
-        /**
-         * Scale horizontal and vertically non-uniformly to fill the destination bounds.
-         */
+        /** Scale horizontal and vertically non-uniformly to fill the destination bounds. */
         @Stable
-        val FillBounds = object : ContentScale {
-            override fun computeScaleFactor(srcSize: Size, dstSize: Size): ScaleFactor =
-                ScaleFactor(
-                    computeFillWidth(srcSize, dstSize),
-                    computeFillHeight(srcSize, dstSize)
-                )
-        }
+        val FillBounds =
+            object : ContentScale {
+                override fun computeScaleFactor(srcSize: Size, dstSize: Size): ScaleFactor =
+                    ScaleFactor(
+                        computeFillWidth(srcSize, dstSize),
+                        computeFillHeight(srcSize, dstSize)
+                    )
+            }
     }
 }
 
 /**
- * [ContentScale] implementation that always scales the dimension by the provided
- * fixed floating point value
+ * [ContentScale] implementation that always scales the dimension by the provided fixed floating
+ * point value
  */
 @Immutable
 data class FixedScale(val value: Float) : ContentScale {
@@ -164,8 +149,6 @@
     return min(widthScale, heightScale)
 }
 
-private fun computeFillWidth(srcSize: Size, dstSize: Size): Float =
-    dstSize.width / srcSize.width
+private fun computeFillWidth(srcSize: Size, dstSize: Size): Float = dstSize.width / srcSize.width
 
-private fun computeFillHeight(srcSize: Size, dstSize: Size): Float =
-    dstSize.height / srcSize.height
+private fun computeFillHeight(srcSize: Size, dstSize: Size): Float = dstSize.height / srcSize.height
diff --git a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/layout/IntrinsicMeasurable.kt b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/layout/IntrinsicMeasurable.kt
index a8269da..0bee13c 100644
--- a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/layout/IntrinsicMeasurable.kt
+++ b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/layout/IntrinsicMeasurable.kt
@@ -17,36 +17,32 @@
 package androidx.compose.ui.layout
 
 /**
- * A part of the composition that can be measured. This represents a layout.
- * The instance should never be stored.
+ * A part of the composition that can be measured. This represents a layout. The instance should
+ * never be stored.
  */
 interface IntrinsicMeasurable {
-    /**
-     * Data provided by the [ParentDataModifier].
-     */
+    /** Data provided by the [ParentDataModifier]. */
     val parentData: Any?
 
     /**
-     * Calculates the minimum width that the layout can be such that
-     * the content of the layout will be painted correctly.
+     * Calculates the minimum width that the layout can be such that the content of the layout will
+     * be painted correctly.
      */
     fun minIntrinsicWidth(height: Int): Int
 
     /**
-     * Calculates the smallest width beyond which increasing the width never
-     * decreases the height.
+     * Calculates the smallest width beyond which increasing the width never decreases the height.
      */
     fun maxIntrinsicWidth(height: Int): Int
 
     /**
-     * Calculates the minimum height that the layout can be such that
-     * the content of the layout will be painted correctly.
+     * Calculates the minimum height that the layout can be such that the content of the layout will
+     * be painted correctly.
      */
     fun minIntrinsicHeight(width: Int): Int
 
     /**
-     * Calculates the smallest height beyond which increasing the height never
-     * decreases the width.
+     * Calculates the smallest height beyond which increasing the height never decreases the width.
      */
     fun maxIntrinsicHeight(width: Int): Int
 }
diff --git a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/layout/IntrinsicMeasureScope.kt b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/layout/IntrinsicMeasureScope.kt
index a039b3b..d7a74b2 100644
--- a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/layout/IntrinsicMeasureScope.kt
+++ b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/layout/IntrinsicMeasureScope.kt
@@ -19,20 +19,18 @@
 import androidx.compose.ui.unit.Density
 import androidx.compose.ui.unit.LayoutDirection
 
-/**
- * The receiver scope of a layout's intrinsic measurements lambdas.
- */
+/** The receiver scope of a layout's intrinsic measurements lambdas. */
 interface IntrinsicMeasureScope : Density {
     /**
-     * The [LayoutDirection] of the `Layout` or `LayoutModifier` using the measure scope
-     * to measure their children.
+     * The [LayoutDirection] of the `Layout` or `LayoutModifier` using the measure scope to measure
+     * their children.
      */
     val layoutDirection: LayoutDirection
 
     /**
-     * This indicates whether the ongoing measurement is for lookahead pass.
-     * [IntrinsicMeasureScope] implementations, especially [MeasureScope] implementations should
-     * override this flag to reflect whether the measurement is intended for lookahead pass.
+     * This indicates whether the ongoing measurement is for lookahead pass. [IntrinsicMeasureScope]
+     * implementations, especially [MeasureScope] implementations should override this flag to
+     * reflect whether the measurement is intended for lookahead pass.
      *
      * @sample androidx.compose.ui.samples.animateContentSizeAfterLookaheadPass
      */
diff --git a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/layout/Layout.kt b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/layout/Layout.kt
index 70d6cec..9085f7d 100644
--- a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/layout/Layout.kt
+++ b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/layout/Layout.kt
@@ -45,25 +45,26 @@
 import androidx.compose.ui.util.fastForEach
 
 /**
- * [Layout] is the main core component for layout. It can be used to measure and position
- * zero or more layout children.
+ * [Layout] is the main core component for layout. It can be used to measure and position zero or
+ * more layout children.
  *
- * The measurement, layout and intrinsic measurement behaviours of this layout will be defined
- * by the [measurePolicy] instance. See [MeasurePolicy] for more details.
+ * The measurement, layout and intrinsic measurement behaviours of this layout will be defined by
+ * the [measurePolicy] instance. See [MeasurePolicy] for more details.
  *
- * For a composable able to define its content according to the incoming constraints,
- * see [androidx.compose.foundation.layout.BoxWithConstraints].
+ * For a composable able to define its content according to the incoming constraints, see
+ * [androidx.compose.foundation.layout.BoxWithConstraints].
  *
  * Example usage:
+ *
  * @sample androidx.compose.ui.samples.LayoutUsage
  *
  * Example usage with custom intrinsic measurements:
+ *
  * @sample androidx.compose.ui.samples.LayoutWithProvidedIntrinsicsUsage
  *
  * @param content The children composable to be laid out.
  * @param modifier Modifiers to be applied to the layout.
  * @param measurePolicy The policy defining the measurement and positioning of the layout.
- *
  * @see Layout
  * @see MeasurePolicy
  * @see androidx.compose.foundation.layout.BoxWithConstraints
@@ -84,8 +85,7 @@
         update = {
             set(measurePolicy, SetMeasurePolicy)
             set(localMap, SetResolvedCompositionLocals)
-            @OptIn(ExperimentalComposeUiApi::class)
-            set(compositeKeyHash, SetCompositeKeyHash)
+            @OptIn(ExperimentalComposeUiApi::class) set(compositeKeyHash, SetCompositeKeyHash)
             set(materialized, SetModifier)
         },
         content = content
@@ -96,21 +96,22 @@
  * [Layout] is the main core component for layout for "leaf" nodes. It can be used to measure and
  * position zero children.
  *
- * The measurement, layout and intrinsic measurement behaviours of this layout will be defined
- * by the [measurePolicy] instance. See [MeasurePolicy] for more details.
+ * The measurement, layout and intrinsic measurement behaviours of this layout will be defined by
+ * the [measurePolicy] instance. See [MeasurePolicy] for more details.
  *
- * For a composable able to define its content according to the incoming constraints,
- * see [androidx.compose.foundation.layout.BoxWithConstraints].
+ * For a composable able to define its content according to the incoming constraints, see
+ * [androidx.compose.foundation.layout.BoxWithConstraints].
  *
  * Example usage:
+ *
  * @sample androidx.compose.ui.samples.LayoutUsage
  *
  * Example usage with custom intrinsic measurements:
+ *
  * @sample androidx.compose.ui.samples.LayoutWithProvidedIntrinsicsUsage
  *
  * @param modifier Modifiers to be applied to the layout.
  * @param measurePolicy The policy defining the measurement and positioning of the layout.
- *
  * @see Layout
  * @see MeasurePolicy
  * @see androidx.compose.foundation.layout.BoxWithConstraints
@@ -118,10 +119,7 @@
 @Suppress("NOTHING_TO_INLINE")
 @Composable
 @UiComposable
-inline fun Layout(
-    modifier: Modifier = Modifier,
-    measurePolicy: MeasurePolicy
-) {
+inline fun Layout(modifier: Modifier = Modifier, measurePolicy: MeasurePolicy) {
     val compositeKeyHash = currentCompositeKeyHash
     val materialized = currentComposer.materialize(modifier)
     val localMap = currentComposer.currentCompositionLocalMap
@@ -131,33 +129,32 @@
             set(measurePolicy, SetMeasurePolicy)
             set(localMap, SetResolvedCompositionLocals)
             set(materialized, SetModifier)
-            @OptIn(ExperimentalComposeUiApi::class)
-            set(compositeKeyHash, SetCompositeKeyHash)
+            @OptIn(ExperimentalComposeUiApi::class) set(compositeKeyHash, SetCompositeKeyHash)
         },
     )
 }
 
 /**
- * [Layout] is the main core component for layout. It can be used to measure and position
- * zero or more layout children.
+ * [Layout] is the main core component for layout. It can be used to measure and position zero or
+ * more layout children.
  *
  * This overload accepts a list of multiple composable content lambdas, which allows treating
- * measurables put into different content lambdas differently - measure policy will provide
- * a list of lists of Measurables, not just a single list. Such list has the same size
- * as the list of contents passed into [Layout] and contains the list of measurables
- * of the corresponding content lambda in the same order.
+ * measurables put into different content lambdas differently - measure policy will provide a list
+ * of lists of Measurables, not just a single list. Such list has the same size as the list of
+ * contents passed into [Layout] and contains the list of measurables of the corresponding content
+ * lambda in the same order.
  *
  * Note that layouts emitted as part of all [contents] lambdas will be added as a direct children
  * for this [Layout]. This means that if you set a custom z index on some children, the drawing
  * order will be calculated as if they were all provided as part of one lambda.
  *
  * Example usage:
+ *
  * @sample androidx.compose.ui.samples.LayoutWithMultipleContentsUsage
  *
  * @param contents The list of children composable contents to be laid out.
  * @param modifier Modifiers to be applied to the layout.
  * @param measurePolicy The policy defining the measurement and positioning of the layout.
- *
  * @see Layout for a simpler use case when you have only one content lambda.
  */
 @Suppress("ComposableLambdaParameterPosition", "NOTHING_TO_INLINE")
@@ -184,8 +181,7 @@
         ReusableComposeNode<ComposeUiNode, Applier<Any>>(
             factory = ComposeUiNode.VirtualConstructor,
             update = {
-                @OptIn(ExperimentalComposeUiApi::class)
-                set(compositeKeyHash, SetCompositeKeyHash)
+                @OptIn(ExperimentalComposeUiApi::class) set(compositeKeyHash, SetCompositeKeyHash)
             },
             content = content
         )
@@ -194,8 +190,8 @@
 
 /**
  * This function uses a JVM-Name because the original name now has a different implementation for
- * backwards compatibility [materializerOfWithCompositionLocalInjection].
- * More details can be found at https://issuetracker.google.com/275067189
+ * backwards compatibility [materializerOfWithCompositionLocalInjection]. More details can be found
+ * at https://issuetracker.google.com/275067189
  */
 @PublishedApi
 @JvmName("modifierMaterializerOf")
@@ -206,15 +202,14 @@
     val materialized = currentComposer.materialize(modifier)
     update {
         set(materialized, SetModifier)
-        @OptIn(ExperimentalComposeUiApi::class)
-        set(compositeKeyHash, SetCompositeKeyHash)
+        @OptIn(ExperimentalComposeUiApi::class) set(compositeKeyHash, SetCompositeKeyHash)
     }
 }
 
 /**
- * This function exists solely for solving a backwards-incompatibility with older compilations
- * that used an older version of the `Layout` composable. New code paths should not call this.
- * More details can be found at https://issuetracker.google.com/275067189
+ * This function exists solely for solving a backwards-incompatibility with older compilations that
+ * used an older version of the `Layout` composable. New code paths should not call this. More
+ * details can be found at https://issuetracker.google.com/275067189
  */
 @JvmName("materializerOf")
 @Deprecated(
@@ -229,8 +224,7 @@
     val materialized = currentComposer.materializeWithCompositionLocalInjectionInternal(modifier)
     update {
         set(materialized, SetModifier)
-        @OptIn(ExperimentalComposeUiApi::class)
-        set(compositeKeyHash, SetCompositeKeyHash)
+        @OptIn(ExperimentalComposeUiApi::class) set(compositeKeyHash, SetCompositeKeyHash)
     }
 }
 
@@ -255,45 +249,39 @@
         update = {
             set(measurePolicy, SetMeasurePolicy)
             set(localMap, SetResolvedCompositionLocals)
-            @Suppress("DEPRECATION")
-            init { this.canMultiMeasure = true }
+            @Suppress("DEPRECATION") init { this.canMultiMeasure = true }
             set(materialized, SetModifier)
-            @OptIn(ExperimentalComposeUiApi::class)
-            set(compositeKeyHash, SetCompositeKeyHash)
+            @OptIn(ExperimentalComposeUiApi::class) set(compositeKeyHash, SetCompositeKeyHash)
         },
         content = content
     )
 }
 
-/**
- * Used to return a fixed sized item for intrinsics measurements in [Layout]
- */
+/** Used to return a fixed sized item for intrinsics measurements in [Layout] */
 private class FixedSizeIntrinsicsPlaceable(width: Int, height: Int) : Placeable() {
     init {
         measuredSize = IntSize(width, height)
     }
 
     override fun get(alignmentLine: AlignmentLine): Int = AlignmentLine.Unspecified
+
     override fun placeAt(
         position: IntOffset,
         zIndex: Float,
         layerBlock: (GraphicsLayerScope.() -> Unit)?
-    ) {
-    }
+    ) {}
 }
 
-/**
- * Identifies an [IntrinsicMeasurable] as a min or max intrinsic measurement.
- */
+/** Identifies an [IntrinsicMeasurable] as a min or max intrinsic measurement. */
 internal enum class IntrinsicMinMax {
-    Min, Max
+    Min,
+    Max
 }
 
-/**
- * Identifies an [IntrinsicMeasurable] as a width or height intrinsic measurement.
- */
+/** Identifies an [IntrinsicMeasurable] as a width or height intrinsic measurement. */
 internal enum class IntrinsicWidthHeight {
-    Width, Height
+    Width,
+    Height
 }
 
 // A large value to use as a replacement for Infinity with DefaultIntrinisicMeasurable.
@@ -305,10 +293,9 @@
 internal const val LargeDimension = (1 shl 15) - 1
 
 /**
- * A wrapper around a [Measurable] for intrinsic measurements in [Layout]. Consumers of
- * [Layout] don't identify intrinsic methods, but we can give a reasonable implementation
- * by using their [measure], substituting the intrinsics gathering method
- * for the [Measurable.measure] call.
+ * A wrapper around a [Measurable] for intrinsic measurements in [Layout]. Consumers of [Layout]
+ * don't identify intrinsic methods, but we can give a reasonable implementation by using their
+ * [measure], substituting the intrinsics gathering method for the [Measurable.measure] call.
  */
 internal class DefaultIntrinsicMeasurable(
     val measurable: IntrinsicMeasurable,
@@ -320,21 +307,22 @@
 
     override fun measure(constraints: Constraints): Placeable {
         if (widthHeight == IntrinsicWidthHeight.Width) {
-            val width = if (minMax == IntrinsicMinMax.Max) {
-                measurable.maxIntrinsicWidth(constraints.maxHeight)
-            } else {
-                measurable.minIntrinsicWidth(constraints.maxHeight)
-            }
+            val width =
+                if (minMax == IntrinsicMinMax.Max) {
+                    measurable.maxIntrinsicWidth(constraints.maxHeight)
+                } else {
+                    measurable.minIntrinsicWidth(constraints.maxHeight)
+                }
             // Can't use infinity for height, so use a large number
-            val height =
-                if (constraints.hasBoundedHeight) constraints.maxHeight else LargeDimension
+            val height = if (constraints.hasBoundedHeight) constraints.maxHeight else LargeDimension
             return FixedSizeIntrinsicsPlaceable(width, height)
         }
-        val height = if (minMax == IntrinsicMinMax.Max) {
-            measurable.maxIntrinsicHeight(constraints.maxWidth)
-        } else {
-            measurable.minIntrinsicHeight(constraints.maxWidth)
-        }
+        val height =
+            if (minMax == IntrinsicMinMax.Max) {
+                measurable.maxIntrinsicHeight(constraints.maxWidth)
+            } else {
+                measurable.minIntrinsicHeight(constraints.maxWidth)
+            }
         // Can't use infinity for width, so use a large number
         val width = if (constraints.hasBoundedWidth) constraints.maxWidth else LargeDimension
         return FixedSizeIntrinsicsPlaceable(width, height)
@@ -378,10 +366,13 @@
         return object : MeasureResult {
             override val width: Int
                 get() = w
+
             override val height: Int
                 get() = h
+
             override val alignmentLines: Map<AlignmentLine, Int>
                 get() = alignmentLines
+
             override val rulers: (RulerScope.() -> Unit)?
                 get() = rulers
 
@@ -410,10 +401,13 @@
         return object : MeasureResult {
             override val width: Int
                 get() = w
+
             override val height: Int
                 get() = h
+
             override val alignmentLines: Map<AlignmentLine, Int>
                 get() = alignmentLines
+
             override val rulers: (RulerScope.() -> Unit)?
                 get() = rulers
 
diff --git a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/layout/LayoutCoordinates.kt b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/layout/LayoutCoordinates.kt
index 309a44a..b9032bd 100644
--- a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/layout/LayoutCoordinates.kt
+++ b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/layout/LayoutCoordinates.kt
@@ -26,35 +26,25 @@
 import androidx.compose.ui.util.fastMaxOf
 import androidx.compose.ui.util.fastMinOf
 
-/**
- * A holder of the measured bounds for the [Layout].
- */
+/** A holder of the measured bounds for the [Layout]. */
 @JvmDefaultWithCompatibility
 interface LayoutCoordinates {
-    /**
-     * The size of this layout in the local coordinates space.
-     */
+    /** The size of this layout in the local coordinates space. */
     val size: IntSize
 
-    /**
-     * The alignment lines provided for this layout, not including inherited lines.
-     */
+    /** The alignment lines provided for this layout, not including inherited lines. */
     val providedAlignmentLines: Set<AlignmentLine>
 
-    /**
-     * The coordinates of the parent layout. Null if there is no parent.
-     */
+    /** The coordinates of the parent layout. Null if there is no parent. */
     val parentLayoutCoordinates: LayoutCoordinates?
 
     /**
-     * The coordinates of the parent layout modifier or parent layout if there is no
-     * parent layout modifier, or `null` if there is no parent.
+     * The coordinates of the parent layout modifier or parent layout if there is no parent layout
+     * modifier, or `null` if there is no parent.
      */
     val parentCoordinates: LayoutCoordinates?
 
-    /**
-     * Returns false if the corresponding layout was detached from the hierarchy.
-     */
+    /** Returns false if the corresponding layout was detached from the hierarchy. */
     val isAttached: Boolean
 
     /**
@@ -78,7 +68,8 @@
      * @see localPositionOf
      */
     @Suppress("GetterSetterNames") // Preferred name
-    val introducesMotionFrameOfReference: Boolean get() = false
+    val introducesMotionFrameOfReference: Boolean
+        get() = false
 
     /**
      * Converts [relativeToScreen] relative to the device's screen's origin into an [Offset]
@@ -93,8 +84,8 @@
     fun localToScreen(relativeToLocal: Offset): Offset = Offset.Unspecified
 
     /**
-     * Converts [relativeToWindow] relative to the window's origin into an [Offset] relative to
-     * this layout.
+     * Converts [relativeToWindow] relative to the window's origin into an [Offset] relative to this
+     * layout.
      */
     fun windowToLocal(relativeToWindow: Offset): Offset
 
@@ -104,29 +95,24 @@
      */
     fun localToWindow(relativeToLocal: Offset): Offset
 
-    /**
-     * Converts a local position within this layout into an offset from the root composable.
-     */
+    /** Converts a local position within this layout into an offset from the root composable. */
     fun localToRoot(relativeToLocal: Offset): Offset
 
     /**
      * Converts an [relativeToSource] in [sourceCoordinates] space into local coordinates.
-     * [sourceCoordinates] may be any [LayoutCoordinates] that belong to the same
-     * compose layout hierarchy.
+     * [sourceCoordinates] may be any [LayoutCoordinates] that belong to the same compose layout
+     * hierarchy.
      *
      * By default, includes the [Offset] when [introducesMotionFrameOfReference] is `true`. But you
      * may exclude it from the calculation by using the overload that takes
      * `includeMotionFrameOfReference` and passing it as `false`.
      */
-    fun localPositionOf(
-        sourceCoordinates: LayoutCoordinates,
-        relativeToSource: Offset
-    ): Offset
+    fun localPositionOf(sourceCoordinates: LayoutCoordinates, relativeToSource: Offset): Offset
 
     /**
      * Converts an [relativeToSource] in [sourceCoordinates] space into local coordinates.
-     * [sourceCoordinates] may be any [LayoutCoordinates] that belong to the same
-     * compose layout hierarchy.
+     * [sourceCoordinates] may be any [LayoutCoordinates] that belong to the same compose layout
+     * hierarchy.
      *
      * Use [includeMotionFrameOfReference] to decide whether to include the [Offset] of any
      * `LayoutCoordinate` that returns `true` in the [includeMotionFrameOfReference] flag.
@@ -146,23 +132,21 @@
     }
 
     /**
-     * Returns the bounding box of [sourceCoordinates] in the local coordinates.
-     * If [clipBounds] is `true`, any clipping that occurs between [sourceCoordinates] and
-     * this layout will affect the returned bounds, and can even result in an empty rectangle
-     * if clipped regions do not overlap. If [clipBounds] is false, the bounding box of
-     * [sourceCoordinates] will be converted to local coordinates irrespective of any clipping
-     * applied between the layouts.
+     * Returns the bounding box of [sourceCoordinates] in the local coordinates. If [clipBounds] is
+     * `true`, any clipping that occurs between [sourceCoordinates] and this layout will affect the
+     * returned bounds, and can even result in an empty rectangle if clipped regions do not overlap.
+     * If [clipBounds] is false, the bounding box of [sourceCoordinates] will be converted to local
+     * coordinates irrespective of any clipping applied between the layouts.
      *
-     * When rotation or scaling is applied, the bounding box of the rotated or scaled value
-     * will be computed in the local coordinates. For example, if a 40 pixels x 20 pixel layout
-     * is rotated 90 degrees, the bounding box will be 20 pixels x 40 pixels in its parent's
-     * coordinates.
+     * When rotation or scaling is applied, the bounding box of the rotated or scaled value will be
+     * computed in the local coordinates. For example, if a 40 pixels x 20 pixel layout is rotated
+     * 90 degrees, the bounding box will be 20 pixels x 40 pixels in its parent's coordinates.
      */
     fun localBoundingBoxOf(sourceCoordinates: LayoutCoordinates, clipBounds: Boolean = true): Rect
 
     /**
-     * Modifies [matrix] to be a transform to convert a coordinate in [sourceCoordinates]
-     * to a coordinate in `this` [LayoutCoordinates].
+     * Modifies [matrix] to be a transform to convert a coordinate in [sourceCoordinates] to a
+     * coordinate in `this` [LayoutCoordinates].
      */
     @Suppress("DocumentExceptions")
     fun transformFrom(sourceCoordinates: LayoutCoordinates, matrix: Matrix) {
@@ -183,37 +167,28 @@
     }
 
     /**
-     * Returns the position in pixels of an [alignment line][AlignmentLine],
-     * or [AlignmentLine.Unspecified] if the line is not provided.
+     * Returns the position in pixels of an [alignment line][AlignmentLine], or
+     * [AlignmentLine.Unspecified] if the line is not provided.
      */
     operator fun get(alignmentLine: AlignmentLine): Int
 }
 
-/**
- * The position of this layout inside the root composable.
- */
+/** The position of this layout inside the root composable. */
 fun LayoutCoordinates.positionInRoot(): Offset = localToRoot(Offset.Zero)
 
-/**
- * The position of this layout relative to the window.
- */
+/** The position of this layout relative to the window. */
 fun LayoutCoordinates.positionInWindow(): Offset = localToWindow(Offset.Zero)
 
 /**
- * The position of this layout on the device's screen.
- * Returns [Offset.Unspecified] if the conversion cannot be performed.
+ * The position of this layout on the device's screen. Returns [Offset.Unspecified] if the
+ * conversion cannot be performed.
  */
 fun LayoutCoordinates.positionOnScreen(): Offset = localToScreen(Offset.Zero)
 
-/**
- * The boundaries of this layout inside the root composable.
- */
-fun LayoutCoordinates.boundsInRoot(): Rect =
-    findRootCoordinates().localBoundingBoxOf(this)
+/** The boundaries of this layout inside the root composable. */
+fun LayoutCoordinates.boundsInRoot(): Rect = findRootCoordinates().localBoundingBoxOf(this)
 
-/**
- * The boundaries of this layout relative to the window's origin.
- */
+/** The boundaries of this layout relative to the window's origin. */
 fun LayoutCoordinates.boundsInWindow(): Rect {
     val root = findRootCoordinates()
     val rootWidth = root.size.width.toFloat()
@@ -253,17 +228,14 @@
     return Rect(left, top, right, bottom)
 }
 
-/**
- * Returns the position of the top-left in the parent's content area or (0, 0)
- * for the root.
- */
+/** Returns the position of the top-left in the parent's content area or (0, 0) for the root. */
 fun LayoutCoordinates.positionInParent(): Offset =
     parentLayoutCoordinates?.localPositionOf(this, Offset.Zero) ?: Offset.Zero
 
 /**
- * Returns the bounding box of the child in the parent's content area, including any clipping
- * done with respect to the parent. For the root, the bounds is positioned at (0, 0) and sized
- * to the size of the root.
+ * Returns the bounding box of the child in the parent's content area, including any clipping done
+ * with respect to the parent. For the root, the bounds is positioned at (0, 0) and sized to the
+ * size of the root.
  */
 fun LayoutCoordinates.boundsInParent(): Rect =
     parentLayoutCoordinates?.localBoundingBoxOf(this)
diff --git a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/layout/LayoutId.kt b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/layout/LayoutId.kt
index 693195a..dd09b37 100644
--- a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/layout/LayoutId.kt
+++ b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/layout/LayoutId.kt
@@ -27,14 +27,13 @@
  * Tag the element with [layoutId] to identify the element within its parent.
  *
  * Example usage:
+ *
  * @sample androidx.compose.ui.samples.LayoutTagChildrenUsage
  */
-@Stable
-fun Modifier.layoutId(layoutId: Any) = this then LayoutIdElement(layoutId = layoutId)
+@Stable fun Modifier.layoutId(layoutId: Any) = this then LayoutIdElement(layoutId = layoutId)
 
-private data class LayoutIdElement(
-    private val layoutId: Any
-) : ModifierNodeElement<LayoutIdModifier>() {
+private data class LayoutIdElement(private val layoutId: Any) :
+    ModifierNodeElement<LayoutIdModifier>() {
     override fun create() = LayoutIdModifier(layoutId)
 
     override fun update(node: LayoutIdModifier) {
@@ -49,8 +48,8 @@
 
 /**
  * A [ParentDataModifierNode] which tags the target with the given [id][layoutId]. The provided tag
- * will act as parent data, and can be used for example by parent layouts to associate
- * composable children to [Measurable]s when doing layout, as shown below.
+ * will act as parent data, and can be used for example by parent layouts to associate composable
+ * children to [Measurable]s when doing layout, as shown below.
  */
 internal class LayoutIdModifier(
     layoutId: Any,
@@ -65,20 +64,21 @@
 }
 
 /**
- * Can be implemented by values used as parent data to make them usable as tags.
- * If a parent data value implements this interface, it can then be returned when querying
- * [Measurable.layoutId] for the corresponding child.
+ * Can be implemented by values used as parent data to make them usable as tags. If a parent data
+ * value implements this interface, it can then be returned when querying [Measurable.layoutId] for
+ * the corresponding child.
  */
 interface LayoutIdParentData {
     val layoutId: Any
 }
 
 /**
- * Retrieves the tag associated to a composable with the [Modifier.layoutId] modifier.
- * For a parent data value to be returned by this property when not using the [Modifier.layoutId]
- * modifier, the parent data value should implement the [LayoutIdParentData] interface.
+ * Retrieves the tag associated to a composable with the [Modifier.layoutId] modifier. For a parent
+ * data value to be returned by this property when not using the [Modifier.layoutId] modifier, the
+ * parent data value should implement the [LayoutIdParentData] interface.
  *
  * Example usage:
+ *
  * @sample androidx.compose.ui.samples.LayoutTagChildrenUsage
  */
 val Measurable.layoutId: Any?
diff --git a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/layout/LayoutInfo.kt b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/layout/LayoutInfo.kt
index 133418b..1cae860 100644
--- a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/layout/LayoutInfo.kt
+++ b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/layout/LayoutInfo.kt
@@ -27,73 +27,51 @@
 interface LayoutInfo {
 
     /**
-     * This returns a new List of [Modifier]s and the coordinates and any extra information
-     * that may be useful. This is used for tooling to retrieve layout modifier and layer
-     * information.
+     * This returns a new List of [Modifier]s and the coordinates and any extra information that may
+     * be useful. This is used for tooling to retrieve layout modifier and layer information.
      */
     fun getModifierInfo(): List<ModifierInfo>
 
-    /**
-     * The measured width of this layout and all of its modifiers.
-     */
+    /** The measured width of this layout and all of its modifiers. */
     val width: Int
 
-    /**
-     * The measured height of this layout and all of its modifiers.
-     */
+    /** The measured height of this layout and all of its modifiers. */
     val height: Int
 
-    /**
-     * Coordinates of just the contents of the layout, after being affected by all modifiers.
-     */
+    /** Coordinates of just the contents of the layout, after being affected by all modifiers. */
     val coordinates: LayoutCoordinates
 
-    /**
-     * Whether or not this layout and all of its parents have been placed in the hierarchy.
-     */
+    /** Whether or not this layout and all of its parents have been placed in the hierarchy. */
     val isPlaced: Boolean
 
-    /**
-     * Parent of this layout.
-     */
+    /** Parent of this layout. */
     val parentInfo: LayoutInfo?
 
-    /**
-     * The density in use for this layout.
-     */
+    /** The density in use for this layout. */
     val density: Density
 
-    /**
-     * The layout direction in use for this layout.
-     */
+    /** The layout direction in use for this layout. */
     val layoutDirection: LayoutDirection
 
-    /**
-     * The [ViewConfiguration] in use for this layout.
-     */
+    /** The [ViewConfiguration] in use for this layout. */
     val viewConfiguration: ViewConfiguration
 
-    /**
-     * Returns true if this layout is currently a part of the layout tree.
-     */
+    /** Returns true if this layout is currently a part of the layout tree. */
     val isAttached: Boolean
 
-    /**
-     * Unique and stable id representing this node to the semantics system.
-     */
+    /** Unique and stable id representing this node to the semantics system. */
     val semanticsId: Int
 
     /**
      * True if the node is deactivated. For example, the children of
-     * [androidx.compose.ui.layout.SubcomposeLayout] which are retained to be reused in future
-     * are considered deactivated.
+     * [androidx.compose.ui.layout.SubcomposeLayout] which are retained to be reused in future are
+     * considered deactivated.
      */
-    val isDeactivated: Boolean get() = false
+    val isDeactivated: Boolean
+        get() = false
 }
 
-/**
- * Used by tooling to examine the modifiers on a [LayoutInfo].
- */
+/** Used by tooling to examine the modifiers on a [LayoutInfo]. */
 class ModifierInfo(
     val modifier: Modifier,
     val coordinates: LayoutCoordinates,
diff --git a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/layout/LayoutModifier.kt b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/layout/LayoutModifier.kt
index 8f7fe23..7097439 100644
--- a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/layout/LayoutModifier.kt
+++ b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/layout/LayoutModifier.kt
@@ -27,11 +27,11 @@
 import androidx.compose.ui.unit.IntSize
 
 /**
- * A [Modifier.Element] that changes how its wrapped content is measured and laid out.
- * It has the same measurement and layout functionality as the [androidx.compose.ui.layout.Layout]
- * component, while wrapping exactly one layout due to it being a modifier. In contrast,
- * the [androidx.compose.ui.layout.Layout] component is used to define the layout behavior of
- * multiple children.
+ * A [Modifier.Element] that changes how its wrapped content is measured and laid out. It has the
+ * same measurement and layout functionality as the [androidx.compose.ui.layout.Layout] component,
+ * while wrapping exactly one layout due to it being a modifier. In contrast, the
+ * [androidx.compose.ui.layout.Layout] component is used to define the layout behavior of multiple
+ * children.
  *
  * @sample androidx.compose.ui.samples.LayoutModifierSample
  *
@@ -40,76 +40,36 @@
 @JvmDefaultWithCompatibility
 interface LayoutModifier : Modifier.Element {
     /**
-     * The function used to measure the modifier. The [measurable] corresponds to the
-     * wrapped content, and it can be measured with the desired constraints according
-     * to the logic of the [LayoutModifier]. The modifier needs to choose its own
-     * size, which can depend on the size chosen by the wrapped content (the obtained
-     * [Placeable]), if the wrapped content was measured. The size needs to be returned
-     * as part of a [MeasureResult], alongside the placement logic of the
-     * [Placeable], which defines how the wrapped content should be positioned inside
-     * the [LayoutModifier]. A convenient way to create the [MeasureResult]
-     * is to use the [MeasureScope.layout] factory function.
+     * The function used to measure the modifier. The [measurable] corresponds to the wrapped
+     * content, and it can be measured with the desired constraints according to the logic of the
+     * [LayoutModifier]. The modifier needs to choose its own size, which can depend on the size
+     * chosen by the wrapped content (the obtained [Placeable]), if the wrapped content was
+     * measured. The size needs to be returned as part of a [MeasureResult], alongside the placement
+     * logic of the [Placeable], which defines how the wrapped content should be positioned inside
+     * the [LayoutModifier]. A convenient way to create the [MeasureResult] is to use the
+     * [MeasureScope.layout] factory function.
      *
      * A [LayoutModifier] uses the same measurement and layout concepts and principles as a
      * [Layout], the only difference is that they apply to exactly one child. For a more detailed
      * explanation of measurement and layout, see [MeasurePolicy].
      */
-    fun MeasureScope.measure(
-        measurable: Measurable,
-        constraints: Constraints
-    ): MeasureResult
+    fun MeasureScope.measure(measurable: Measurable, constraints: Constraints): MeasureResult
 
-    /**
-     * The function used to calculate [IntrinsicMeasurable.minIntrinsicWidth].
-     */
-    fun IntrinsicMeasureScope.minIntrinsicWidth(
-        measurable: IntrinsicMeasurable,
-        height: Int
-    ): Int = MeasuringIntrinsics.minWidth(
-        this@LayoutModifier,
-        this,
-        measurable,
-        height
-    )
+    /** The function used to calculate [IntrinsicMeasurable.minIntrinsicWidth]. */
+    fun IntrinsicMeasureScope.minIntrinsicWidth(measurable: IntrinsicMeasurable, height: Int): Int =
+        MeasuringIntrinsics.minWidth(this@LayoutModifier, this, measurable, height)
 
-    /**
-     * The lambda used to calculate [IntrinsicMeasurable.minIntrinsicHeight].
-     */
-    fun IntrinsicMeasureScope.minIntrinsicHeight(
-        measurable: IntrinsicMeasurable,
-        width: Int
-    ): Int = MeasuringIntrinsics.minHeight(
-        this@LayoutModifier,
-        this,
-        measurable,
-        width
-    )
+    /** The lambda used to calculate [IntrinsicMeasurable.minIntrinsicHeight]. */
+    fun IntrinsicMeasureScope.minIntrinsicHeight(measurable: IntrinsicMeasurable, width: Int): Int =
+        MeasuringIntrinsics.minHeight(this@LayoutModifier, this, measurable, width)
 
-    /**
-     * The function used to calculate [IntrinsicMeasurable.maxIntrinsicWidth].
-     */
-    fun IntrinsicMeasureScope.maxIntrinsicWidth(
-        measurable: IntrinsicMeasurable,
-        height: Int
-    ): Int = MeasuringIntrinsics.maxWidth(
-        this@LayoutModifier,
-        this,
-        measurable,
-        height
-    )
+    /** The function used to calculate [IntrinsicMeasurable.maxIntrinsicWidth]. */
+    fun IntrinsicMeasureScope.maxIntrinsicWidth(measurable: IntrinsicMeasurable, height: Int): Int =
+        MeasuringIntrinsics.maxWidth(this@LayoutModifier, this, measurable, height)
 
-    /**
-     * The lambda used to calculate [IntrinsicMeasurable.maxIntrinsicHeight].
-     */
-    fun IntrinsicMeasureScope.maxIntrinsicHeight(
-        measurable: IntrinsicMeasurable,
-        width: Int
-    ): Int = MeasuringIntrinsics.maxHeight(
-        this@LayoutModifier,
-        this,
-        measurable,
-        width
-    )
+    /** The lambda used to calculate [IntrinsicMeasurable.maxIntrinsicHeight]. */
+    fun IntrinsicMeasureScope.maxIntrinsicHeight(measurable: IntrinsicMeasurable, width: Int): Int =
+        MeasuringIntrinsics.maxHeight(this@LayoutModifier, this, measurable, width)
 }
 
 // TODO(popam): deduplicate from the copy-pasted logic of Layout.kt without making it public
@@ -120,16 +80,18 @@
         intrinsicMeasurable: IntrinsicMeasurable,
         h: Int
     ): Int {
-        val measurable = DefaultIntrinsicMeasurable(
-            intrinsicMeasurable,
-            IntrinsicMinMax.Min,
-            IntrinsicWidthHeight.Width
-        )
+        val measurable =
+            DefaultIntrinsicMeasurable(
+                intrinsicMeasurable,
+                IntrinsicMinMax.Min,
+                IntrinsicWidthHeight.Width
+            )
         val constraints = Constraints(maxHeight = h)
-        val layoutResult = with(modifier) {
-            IntrinsicsMeasureScope(intrinsicMeasureScope, intrinsicMeasureScope.layoutDirection)
-                .measure(measurable, constraints)
-        }
+        val layoutResult =
+            with(modifier) {
+                IntrinsicsMeasureScope(intrinsicMeasureScope, intrinsicMeasureScope.layoutDirection)
+                    .measure(measurable, constraints)
+            }
         return layoutResult.width
     }
 
@@ -139,16 +101,18 @@
         intrinsicMeasurable: IntrinsicMeasurable,
         w: Int
     ): Int {
-        val measurable = DefaultIntrinsicMeasurable(
-            intrinsicMeasurable,
-            IntrinsicMinMax.Min,
-            IntrinsicWidthHeight.Height
-        )
+        val measurable =
+            DefaultIntrinsicMeasurable(
+                intrinsicMeasurable,
+                IntrinsicMinMax.Min,
+                IntrinsicWidthHeight.Height
+            )
         val constraints = Constraints(maxWidth = w)
-        val layoutResult = with(modifier) {
-            IntrinsicsMeasureScope(intrinsicMeasureScope, intrinsicMeasureScope.layoutDirection)
-                .measure(measurable, constraints)
-        }
+        val layoutResult =
+            with(modifier) {
+                IntrinsicsMeasureScope(intrinsicMeasureScope, intrinsicMeasureScope.layoutDirection)
+                    .measure(measurable, constraints)
+            }
         return layoutResult.height
     }
 
@@ -158,16 +122,18 @@
         intrinsicMeasurable: IntrinsicMeasurable,
         h: Int
     ): Int {
-        val measurable = DefaultIntrinsicMeasurable(
-            intrinsicMeasurable,
-            IntrinsicMinMax.Max,
-            IntrinsicWidthHeight.Width
-        )
+        val measurable =
+            DefaultIntrinsicMeasurable(
+                intrinsicMeasurable,
+                IntrinsicMinMax.Max,
+                IntrinsicWidthHeight.Width
+            )
         val constraints = Constraints(maxHeight = h)
-        val layoutResult = with(modifier) {
-            IntrinsicsMeasureScope(intrinsicMeasureScope, intrinsicMeasureScope.layoutDirection)
-                .measure(measurable, constraints)
-        }
+        val layoutResult =
+            with(modifier) {
+                IntrinsicsMeasureScope(intrinsicMeasureScope, intrinsicMeasureScope.layoutDirection)
+                    .measure(measurable, constraints)
+            }
         return layoutResult.width
     }
 
@@ -177,16 +143,18 @@
         intrinsicMeasurable: IntrinsicMeasurable,
         w: Int
     ): Int {
-        val measurable = DefaultIntrinsicMeasurable(
-            intrinsicMeasurable,
-            IntrinsicMinMax.Max,
-            IntrinsicWidthHeight.Height
-        )
+        val measurable =
+            DefaultIntrinsicMeasurable(
+                intrinsicMeasurable,
+                IntrinsicMinMax.Max,
+                IntrinsicWidthHeight.Height
+            )
         val constraints = Constraints(maxWidth = w)
-        val layoutResult = with(modifier) {
-            IntrinsicsMeasureScope(intrinsicMeasureScope, intrinsicMeasureScope.layoutDirection)
-                .measure(measurable, constraints)
-        }
+        val layoutResult =
+            with(modifier) {
+                IntrinsicsMeasureScope(intrinsicMeasureScope, intrinsicMeasureScope.layoutDirection)
+                    .measure(measurable, constraints)
+            }
         return layoutResult.height
     }
 
@@ -200,20 +168,22 @@
 
         override fun measure(constraints: Constraints): Placeable {
             if (widthHeight == IntrinsicWidthHeight.Width) {
-                val width = if (minMax == IntrinsicMinMax.Max) {
-                    measurable.maxIntrinsicWidth(constraints.maxHeight)
-                } else {
-                    measurable.minIntrinsicWidth(constraints.maxHeight)
-                }
+                val width =
+                    if (minMax == IntrinsicMinMax.Max) {
+                        measurable.maxIntrinsicWidth(constraints.maxHeight)
+                    } else {
+                        measurable.minIntrinsicWidth(constraints.maxHeight)
+                    }
                 val height =
                     if (constraints.hasBoundedHeight) constraints.maxHeight else LargeDimension
                 return EmptyPlaceable(width, height)
             }
-            val height = if (minMax == IntrinsicMinMax.Max) {
-                measurable.maxIntrinsicHeight(constraints.maxWidth)
-            } else {
-                measurable.minIntrinsicHeight(constraints.maxWidth)
-            }
+            val height =
+                if (minMax == IntrinsicMinMax.Max) {
+                    measurable.maxIntrinsicHeight(constraints.maxWidth)
+                } else {
+                    measurable.minIntrinsicHeight(constraints.maxWidth)
+                }
             val width = if (constraints.hasBoundedWidth) constraints.maxWidth else LargeDimension
             return EmptyPlaceable(width, height)
         }
@@ -241,16 +211,23 @@
         }
 
         override fun get(alignmentLine: AlignmentLine): Int = AlignmentLine.Unspecified
+
         override fun placeAt(
             position: IntOffset,
             zIndex: Float,
             layerBlock: (GraphicsLayerScope.() -> Unit)?
-        ) {
-        }
+        ) {}
     }
 
-    private enum class IntrinsicMinMax { Min, Max }
-    private enum class IntrinsicWidthHeight { Width, Height }
+    private enum class IntrinsicMinMax {
+        Min,
+        Max
+    }
+
+    private enum class IntrinsicWidthHeight {
+        Width,
+        Height
+    }
 }
 
 /**
@@ -266,9 +243,8 @@
  *
  * @see androidx.compose.ui.layout.LayoutModifier
  */
-fun Modifier.layout(
-    measure: MeasureScope.(Measurable, Constraints) -> MeasureResult
-) = this then LayoutElement(measure)
+fun Modifier.layout(measure: MeasureScope.(Measurable, Constraints) -> MeasureResult) =
+    this then LayoutElement(measure)
 
 private data class LayoutElement(
     val measure: MeasureScope.(Measurable, Constraints) -> MeasureResult
@@ -288,10 +264,8 @@
 internal class LayoutModifierImpl(
     var measureBlock: MeasureScope.(Measurable, Constraints) -> MeasureResult
 ) : LayoutModifierNode, Modifier.Node() {
-    override fun MeasureScope.measure(
-        measurable: Measurable,
-        constraints: Constraints
-    ) = measureBlock(measurable, constraints)
+    override fun MeasureScope.measure(measurable: Measurable, constraints: Constraints) =
+        measureBlock(measurable, constraints)
 
     override fun toString(): String {
         return "LayoutModifierImpl(measureBlock=$measureBlock)"
diff --git a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/layout/LookaheadLayoutCoordinates.kt b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/layout/LookaheadLayoutCoordinates.kt
index 86e1054..2ea18aa 100644
--- a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/layout/LookaheadLayoutCoordinates.kt
+++ b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/layout/LookaheadLayoutCoordinates.kt
@@ -36,6 +36,7 @@
 
     override val size: IntSize
         get() = lookaheadDelegate.let { IntSize(it.width, it.height) }
+
     override val providedAlignmentLines: Set<AlignmentLine>
         get() = coordinator.providedAlignmentLines
 
@@ -46,6 +47,7 @@
                 it.lookaheadDelegate?.coordinates
             }
         }
+
     override val parentCoordinates: LayoutCoordinates?
         get() {
             checkPrecondition(isAttached) { NodeCoordinator.ExpectAttachedLayoutCoordinates }
@@ -59,10 +61,11 @@
         get() = lookaheadDelegate.isPlacedUnderMotionFrameOfReference
 
     private val lookaheadOffset: Offset
-        get() = lookaheadDelegate.rootLookaheadDelegate.let {
-            localPositionOf(it.coordinates, Offset.Zero) -
-                coordinator.localPositionOf(it.coordinator, Offset.Zero)
-        }
+        get() =
+            lookaheadDelegate.rootLookaheadDelegate.let {
+                localPositionOf(it.coordinates, Offset.Zero) -
+                    coordinator.localPositionOf(it.coordinator, Offset.Zero)
+            }
 
     override fun screenToLocal(relativeToScreen: Offset): Offset =
         coordinator.screenToLocal(relativeToScreen) + lookaheadOffset
@@ -82,11 +85,12 @@
     override fun localPositionOf(
         sourceCoordinates: LayoutCoordinates,
         relativeToSource: Offset
-    ): Offset = localPositionOf(
-        sourceCoordinates = sourceCoordinates,
-        relativeToSource = relativeToSource,
-        includeMotionFrameOfReference = true
-    )
+    ): Offset =
+        localPositionOf(
+            sourceCoordinates = sourceCoordinates,
+            relativeToSource = relativeToSource,
+            includeMotionFrameOfReference = true
+        )
 
     override fun localPositionOf(
         sourceCoordinates: LayoutCoordinates,
@@ -100,57 +104,64 @@
 
             return commonAncestor.lookaheadDelegate?.let { ancestor ->
                 // Common ancestor is in lookahead
-                val sourceInCommonAncestor = source.positionIn(
-                    ancestor = ancestor,
-                    excludingAgnosticOffset = !includeMotionFrameOfReference
-                ) + relativeToSource.round()
+                val sourceInCommonAncestor =
+                    source.positionIn(
+                        ancestor = ancestor,
+                        excludingAgnosticOffset = !includeMotionFrameOfReference
+                    ) + relativeToSource.round()
 
-                val lookaheadPosInAncestor = lookaheadDelegate.positionIn(
-                    ancestor = ancestor,
-                    excludingAgnosticOffset = !includeMotionFrameOfReference
-                )
+                val lookaheadPosInAncestor =
+                    lookaheadDelegate.positionIn(
+                        ancestor = ancestor,
+                        excludingAgnosticOffset = !includeMotionFrameOfReference
+                    )
 
                 (sourceInCommonAncestor - lookaheadPosInAncestor).toOffset()
-            } ?: commonAncestor.let {
-                // The two coordinates are in two separate LookaheadLayouts
-                val sourceRoot = source.rootLookaheadDelegate
-
-                val sourcePosition = source.positionIn(
-                    ancestor = sourceRoot,
-                    excludingAgnosticOffset = !includeMotionFrameOfReference
-                ) + sourceRoot.position + relativeToSource.round()
-
-                val rootDelegate = lookaheadDelegate.rootLookaheadDelegate
-                val lookaheadPosition = lookaheadDelegate.positionIn(
-                    ancestor = rootDelegate,
-                    excludingAgnosticOffset = !includeMotionFrameOfReference
-                ) + rootDelegate.position
-
-                val relativePosition = (sourcePosition - lookaheadPosition).toOffset()
-
-                rootDelegate.coordinator.wrappedBy!!.localPositionOf(
-                    sourceCoordinates = sourceRoot.coordinator.wrappedBy!!,
-                    relativeToSource = relativePosition,
-                    includeMotionFrameOfReference = includeMotionFrameOfReference
-                )
             }
+                ?: commonAncestor.let {
+                    // The two coordinates are in two separate LookaheadLayouts
+                    val sourceRoot = source.rootLookaheadDelegate
+
+                    val sourcePosition =
+                        source.positionIn(
+                            ancestor = sourceRoot,
+                            excludingAgnosticOffset = !includeMotionFrameOfReference
+                        ) + sourceRoot.position + relativeToSource.round()
+
+                    val rootDelegate = lookaheadDelegate.rootLookaheadDelegate
+                    val lookaheadPosition =
+                        lookaheadDelegate.positionIn(
+                            ancestor = rootDelegate,
+                            excludingAgnosticOffset = !includeMotionFrameOfReference
+                        ) + rootDelegate.position
+
+                    val relativePosition = (sourcePosition - lookaheadPosition).toOffset()
+
+                    rootDelegate.coordinator.wrappedBy!!.localPositionOf(
+                        sourceCoordinates = sourceRoot.coordinator.wrappedBy!!,
+                        relativeToSource = relativePosition,
+                        includeMotionFrameOfReference = includeMotionFrameOfReference
+                    )
+                }
         } else {
             val rootDelegate = lookaheadDelegate.rootLookaheadDelegate
             // This is a case of mixed coordinates where `this` is lookahead coords, and
             // `sourceCoordinates` isn't. Therefore we'll break this into two parts:
             // local position in lookahead coords space && local position in regular layout coords
             // space.
-            val localLookaheadPos = localPositionOf(
-                sourceCoordinates = rootDelegate.lookaheadLayoutCoordinates,
-                relativeToSource = relativeToSource,
-                includeMotionFrameOfReference = includeMotionFrameOfReference
-            )
+            val localLookaheadPos =
+                localPositionOf(
+                    sourceCoordinates = rootDelegate.lookaheadLayoutCoordinates,
+                    relativeToSource = relativeToSource,
+                    includeMotionFrameOfReference = includeMotionFrameOfReference
+                )
 
-            val localPos = rootDelegate.coordinator.coordinates.localPositionOf(
-                sourceCoordinates = sourceCoordinates,
-                relativeToSource = Offset.Zero,
-                includeMotionFrameOfReference = includeMotionFrameOfReference
-            )
+            val localPos =
+                rootDelegate.coordinator.coordinates.localPositionOf(
+                    sourceCoordinates = sourceCoordinates,
+                    relativeToSource = Offset.Zero,
+                    includeMotionFrameOfReference = includeMotionFrameOfReference
+                )
             return localLookaheadPos + localPos
         }
     }
diff --git a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/layout/LookaheadScope.kt b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/layout/LookaheadScope.kt
index fe25ec8..a9a1d49 100644
--- a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/layout/LookaheadScope.kt
+++ b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/layout/LookaheadScope.kt
@@ -32,19 +32,18 @@
 
 /**
  * [LookaheadScope] creates a scope in which all layouts will first determine their destination
- * layout through a lookahead pass, followed by an _approach_ pass to run the measurement
- * and placement approach defined in [approachLayout] or [ApproachLayoutModifierNode], in order to
+ * layout through a lookahead pass, followed by an _approach_ pass to run the measurement and
+ * placement approach defined in [approachLayout] or [ApproachLayoutModifierNode], in order to
  * gradually reach the destination.
  *
- * Note: [LookaheadScope] does not introduce a new [Layout] to the [content] passed in.
- * All the [Layout]s in the [content] will have the same parent as they would without
- * [LookaheadScope].
+ * Note: [LookaheadScope] does not introduce a new [Layout] to the [content] passed in. All the
+ * [Layout]s in the [content] will have the same parent as they would without [LookaheadScope].
  *
  * @sample androidx.compose.ui.samples.LookaheadLayoutCoordinatesSample
- * @see ApproachLayoutModifierNode
- * @see approachLayout
  *
  * @param content The child composable to be laid out.
+ * @see ApproachLayoutModifierNode
+ * @see approachLayout
  */
 @UiComposable
 @Composable
@@ -56,14 +55,10 @@
             init { isVirtualLookaheadRoot = true }
             set(scope) { scope ->
                 // This internal lambda will be invoked during placement.
-                scope.scopeCoordinates = {
-                    parent!!.innerCoordinator.coordinates
-                }
+                scope.scopeCoordinates = { parent!!.innerCoordinator.coordinates }
             }
         },
-        content = {
-            scope.content()
-        }
+        content = { scope.content() }
     )
 }
 
@@ -72,11 +67,11 @@
  * in the lookahead pass. This can be particularly helpful when the destination layout is
  * anticipated to change drastically and would consequently result in visual disruptions.
  *
- * In order to create a smooth approach, an interpolation (often through animations) can be used
- * in [approachMeasure] to interpolate the measurement or placement from a previously recorded size
- * and/or position to the destination/target size and/or position. The destination size is
- * available in [ApproachMeasureScope] as [ApproachMeasureScope.lookaheadSize]. And the target
- * position can also be acquired in [ApproachMeasureScope] during placement by using
+ * In order to create a smooth approach, an interpolation (often through animations) can be used in
+ * [approachMeasure] to interpolate the measurement or placement from a previously recorded size
+ * and/or position to the destination/target size and/or position. The destination size is available
+ * in [ApproachMeasureScope] as [ApproachMeasureScope.lookaheadSize]. And the target position can
+ * also be acquired in [ApproachMeasureScope] during placement by using
  * [LookaheadScope.localLookaheadPositionOf] with the layout's
  * [Placeable.PlacementScope.coordinates]. The sample code below illustrates how that can be
  * achieved.
@@ -97,42 +92,48 @@
  * system may skip approach pass until additional approach passes are necessary as indicated by
  * [isMeasurementApproachInProgress] and [isPlacementApproachInProgress].
  *
- * **IMPORTANT**:
- * It is important to be accurate in [isPlacementApproachInProgress] and
+ * **IMPORTANT**: It is important to be accurate in [isPlacementApproachInProgress] and
  * [isMeasurementApproachInProgress]. A prolonged indication of incomplete approach will prevent the
  * system from potentially skipping approach pass when possible.
  *
  * @see ApproachLayoutModifierNode
+ *
  * @sample androidx.compose.ui.samples.approachLayoutSample
  */
 fun Modifier.approachLayout(
     isMeasurementApproachInProgress: (lookaheadSize: IntSize) -> Boolean,
-    isPlacementApproachInProgress: Placeable.PlacementScope.(
-        lookaheadCoordinates: LayoutCoordinates
-    ) -> Boolean = defaultPlacementApproachInProgress,
-    approachMeasure: ApproachMeasureScope.(
-        measurable: Measurable,
-        constraints: Constraints,
-    ) -> MeasureResult,
-): Modifier = this then ApproachLayoutElement(
-    isMeasurementApproachInProgress = isMeasurementApproachInProgress,
-    isPlacementApproachInProgress = isPlacementApproachInProgress,
-    approachMeasure = approachMeasure
-)
+    isPlacementApproachInProgress:
+        Placeable.PlacementScope.(lookaheadCoordinates: LayoutCoordinates) -> Boolean =
+        defaultPlacementApproachInProgress,
+    approachMeasure:
+        ApproachMeasureScope.(
+            measurable: Measurable,
+            constraints: Constraints,
+        ) -> MeasureResult,
+): Modifier =
+    this then
+        ApproachLayoutElement(
+            isMeasurementApproachInProgress = isMeasurementApproachInProgress,
+            isPlacementApproachInProgress = isPlacementApproachInProgress,
+            approachMeasure = approachMeasure
+        )
 
-private val defaultPlacementApproachInProgress: Placeable.PlacementScope.(
-    lookaheadCoordinates: LayoutCoordinates
-) -> Boolean = { false }
+private val defaultPlacementApproachInProgress:
+    Placeable.PlacementScope.(lookaheadCoordinates: LayoutCoordinates) -> Boolean =
+    {
+        false
+    }
 
 private data class ApproachLayoutElement(
-    val approachMeasure: ApproachMeasureScope.(
-        measurable: Measurable,
-        constraints: Constraints,
-    ) -> MeasureResult,
+    val approachMeasure:
+        ApproachMeasureScope.(
+            measurable: Measurable,
+            constraints: Constraints,
+        ) -> MeasureResult,
     val isMeasurementApproachInProgress: (IntSize) -> Boolean,
-    val isPlacementApproachInProgress: Placeable.PlacementScope.(
-        lookaheadCoordinates: LayoutCoordinates
-    ) -> Boolean = defaultPlacementApproachInProgress,
+    val isPlacementApproachInProgress:
+        Placeable.PlacementScope.(lookaheadCoordinates: LayoutCoordinates) -> Boolean =
+        defaultPlacementApproachInProgress,
 ) : ModifierNodeElement<ApproachLayoutModifierNodeImpl>() {
     override fun create() =
         ApproachLayoutModifierNodeImpl(
@@ -156,13 +157,13 @@
 }
 
 private class ApproachLayoutModifierNodeImpl(
-    var measureBlock: ApproachMeasureScope.(
-        measurable: Measurable,
-        constraints: Constraints,
-    ) -> MeasureResult,
+    var measureBlock:
+        ApproachMeasureScope.(
+            measurable: Measurable,
+            constraints: Constraints,
+        ) -> MeasureResult,
     var isMeasurementApproachInProgress: (IntSize) -> Boolean,
-    var isPlacementApproachInProgress:
-    Placeable.PlacementScope.(LayoutCoordinates) -> Boolean,
+    var isPlacementApproachInProgress: Placeable.PlacementScope.(LayoutCoordinates) -> Boolean,
 ) : ApproachLayoutModifierNode, Modifier.Node() {
     override fun isMeasurementApproachInProgress(lookaheadSize: IntSize): Boolean {
         return isMeasurementApproachInProgress.invoke(lookaheadSize)
@@ -184,10 +185,10 @@
 
 /**
  * [LookaheadScope] provides a receiver scope for all (direct and indirect) child layouts in
- * [LookaheadScope]. This receiver scope allows access to [lookaheadScopeCoordinates] from
- * any child's [Placeable.PlacementScope]. It also allows any child to convert
- * [LayoutCoordinates] (which can be retrieved in [Placeable.PlacementScope]) to
- * [LayoutCoordinates] in lookahead coordinate space using [toLookaheadCoordinates].
+ * [LookaheadScope]. This receiver scope allows access to [lookaheadScopeCoordinates] from any
+ * child's [Placeable.PlacementScope]. It also allows any child to convert [LayoutCoordinates]
+ * (which can be retrieved in [Placeable.PlacementScope]) to [LayoutCoordinates] in lookahead
+ * coordinate space using [toLookaheadCoordinates].
  *
  * @sample androidx.compose.ui.samples.LookaheadLayoutCoordinatesSample
  */
@@ -199,21 +200,20 @@
     fun LayoutCoordinates.toLookaheadCoordinates(): LayoutCoordinates
 
     /**
-     * Returns the [LayoutCoordinates] of the [LookaheadScope]. This is
-     * only accessible from [Placeable.PlacementScope] (i.e. during placement time).
+     * Returns the [LayoutCoordinates] of the [LookaheadScope]. This is only accessible from
+     * [Placeable.PlacementScope] (i.e. during placement time).
      *
-     * Note: The returned coordinates is **not** coordinates in the lookahead coordinate space.
-     * If the lookahead coordinates of the lookaheadScope is needed, suggest converting the
-     * returned coordinates using [toLookaheadCoordinates].
+     * Note: The returned coordinates is **not** coordinates in the lookahead coordinate space. If
+     * the lookahead coordinates of the lookaheadScope is needed, suggest converting the returned
+     * coordinates using [toLookaheadCoordinates].
      */
     val Placeable.PlacementScope.lookaheadScopeCoordinates: LayoutCoordinates
 
     /**
-     * Converts [relativeToSource] in [sourceCoordinates]'s lookahead coordinate space into
-     * local lookahead coordinates. This is a convenient method for 1) converting both [this]
-     * coordinates and [sourceCoordinates] into lookahead space coordinates using
-     * [toLookaheadCoordinates], and 2) invoking [LayoutCoordinates.localPositionOf] with the
-     * converted coordinates.
+     * Converts [relativeToSource] in [sourceCoordinates]'s lookahead coordinate space into local
+     * lookahead coordinates. This is a convenient method for 1) converting both [this] coordinates
+     * and [sourceCoordinates] into lookahead space coordinates using [toLookaheadCoordinates],
+     * and 2) invoking [LayoutCoordinates.localPositionOf] with the converted coordinates.
      *
      * For layouts where [LayoutCoordinates.introducesMotionFrameOfReference] returns `true` (placed
      * under [Placeable.PlacementScope.withMotionFrameOfReferencePlacement]) you may pass
@@ -224,17 +224,16 @@
         sourceCoordinates: LayoutCoordinates,
         relativeToSource: Offset = Offset.Zero,
         includeMotionFrameOfReference: Boolean = true,
-    ): Offset = localLookaheadPositionOf(
-        coordinates = this,
-        sourceCoordinates = sourceCoordinates,
-        relativeToSource = relativeToSource,
-        includeMotionFrameOfReference = includeMotionFrameOfReference
-    )
+    ): Offset =
+        localLookaheadPositionOf(
+            coordinates = this,
+            sourceCoordinates = sourceCoordinates,
+            relativeToSource = relativeToSource,
+            includeMotionFrameOfReference = includeMotionFrameOfReference
+        )
 }
 
-/**
- * Internal implementation to handle [LookaheadScope.localLookaheadPositionOf].
- */
+/** Internal implementation to handle [LookaheadScope.localLookaheadPositionOf]. */
 internal fun LookaheadScope.localLookaheadPositionOf(
     coordinates: LayoutCoordinates,
     sourceCoordinates: LayoutCoordinates,
@@ -266,9 +265,8 @@
     }
 }
 
-internal class LookaheadScopeImpl(
-    var scopeCoordinates: (() -> LayoutCoordinates)? = null
-) : LookaheadScope {
+internal class LookaheadScopeImpl(var scopeCoordinates: (() -> LayoutCoordinates)? = null) :
+    LookaheadScope {
     override fun LayoutCoordinates.toLookaheadCoordinates(): LayoutCoordinates {
         return this as? LookaheadLayoutCoordinates
             ?: (this as NodeCoordinator).let {
diff --git a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/layout/Measurable.kt b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/layout/Measurable.kt
index a5efa15..915a97a 100644
--- a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/layout/Measurable.kt
+++ b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/layout/Measurable.kt
@@ -19,13 +19,13 @@
 import androidx.compose.ui.unit.Constraints
 
 /**
- * A part of the composition that can be measured. This represents a layout.
- * The instance should never be stored.
+ * A part of the composition that can be measured. This represents a layout. The instance should
+ * never be stored.
  */
 interface Measurable : IntrinsicMeasurable {
     /**
-     * Measures the layout with [constraints], returning a [Placeable] layout that has its new
-     * size. A [Measurable] can only be measured once inside a layout pass.
+     * Measures the layout with [constraints], returning a [Placeable] layout that has its new size.
+     * A [Measurable] can only be measured once inside a layout pass.
      */
     fun measure(constraints: Constraints): Placeable
 }
diff --git a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/layout/MeasurePolicy.kt b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/layout/MeasurePolicy.kt
index 60a02be..696fccc 100644
--- a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/layout/MeasurePolicy.kt
+++ b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/layout/MeasurePolicy.kt
@@ -30,25 +30,24 @@
  *
  * See [Layout] samples for examples of how to use [MeasurePolicy].
  *
- * Intrinsic measurement methods define the intrinsic size of the layout. These can be queried
- * by the layout's parent in order to obtain, in specific cases, more information about
- * the size of the layout in the absence of specific constraints:
+ * Intrinsic measurement methods define the intrinsic size of the layout. These can be queried by
+ * the layout's parent in order to obtain, in specific cases, more information about the size of the
+ * layout in the absence of specific constraints:
+ * - [minIntrinsicWidth] defines the minimum width this layout can take, given a specific height,
+ *   such that the content of the layout will be painted correctly
+ * - [minIntrinsicHeight] defines the minimum height this layout can take, given a specific width,
+ *   such that the content of the layout will be painted correctly
+ * - [maxIntrinsicWidth] defines the minimum width such that increasing it further will not decrease
+ *   the minimum intrinsic height
+ * - [maxIntrinsicHeight] defines the minimum height such that increasing it further will not
+ *   decrease the minimum intrinsic width
  *
- * - [minIntrinsicWidth] defines the minimum width this layout can take, given
- *   a specific height, such that the content of the layout will be painted correctly
- * - [minIntrinsicHeight] defines the minimum height this layout can take, given
- *   a specific width, such that the content of the layout will be painted correctly
- * - [maxIntrinsicWidth] defines the minimum width such that increasing it further
- *   will not decrease the minimum intrinsic height
- * - [maxIntrinsicHeight] defines the minimum height such that increasing it further
- *   will not decrease the minimum intrinsic width
- *
- * Most layout scenarios do not require querying intrinsic measurements. Therefore, when writing
- * a custom layout, it is common to only define the actual measurement, as most of the times
- * the intrinsic measurements of the layout will not be queried. Moreover, intrinsic measurement
- * methods have default implementations that make a best effort attempt to calculate the intrinsic
- * measurements by reusing the [measure] method. Note this will not be correct for all layouts,
- * but can be a convenient approximation.
+ * Most layout scenarios do not require querying intrinsic measurements. Therefore, when writing a
+ * custom layout, it is common to only define the actual measurement, as most of the times the
+ * intrinsic measurements of the layout will not be queried. Moreover, intrinsic measurement methods
+ * have default implementations that make a best effort attempt to calculate the intrinsic
+ * measurements by reusing the [measure] method. Note this will not be correct for all layouts, but
+ * can be a convenient approximation.
  *
  * Intrinsic measurements can be useful when the layout system enforcement of no more than one
  * measurement per child is limiting. Layouts that use them are the `preferredWidth(IntrinsicSize)`
@@ -71,41 +70,38 @@
      * the [MeasureResult.placeChildren] of the returned [MeasureResult]. Therefore the parent needs
      * to measure its children with appropriate [Constraints], such that whatever valid sizes
      * children choose, they can be laid out correctly according to the parent's layout algorithm.
-     * This is because there is no measurement negotiation between the parent and children:
-     * once a child chooses its size, the parent needs to handle it correctly.
+     * This is because there is no measurement negotiation between the parent and children: once a
+     * child chooses its size, the parent needs to handle it correctly.
      *
      * Note that a child is allowed to choose a size that does not satisfy its constraints. However,
      * when this happens, the placeable's [width][Placeable.width] and [height][Placeable.height]
-     * will not represent the real size of the child, but rather the size coerced in the
-     * child's constraints. Therefore, it is common for parents to assume in their layout
-     * algorithm that its children will always respect the constraints. When this
-     * does not happen in reality, the position assigned to the child will be
-     * automatically offset to be centered on the space assigned by the parent under
-     * the assumption that constraints were respected. Rarely, when a parent really needs to know
-     * the true size of the child, they can read this from the placeable's
-     * [Placeable.measuredWidth] and [Placeable.measuredHeight].
+     * will not represent the real size of the child, but rather the size coerced in the child's
+     * constraints. Therefore, it is common for parents to assume in their layout algorithm that its
+     * children will always respect the constraints. When this does not happen in reality, the
+     * position assigned to the child will be automatically offset to be centered on the space
+     * assigned by the parent under the assumption that constraints were respected. Rarely, when a
+     * parent really needs to know the true size of the child, they can read this from the
+     * placeable's [Placeable.measuredWidth] and [Placeable.measuredHeight].
      *
-     * [MeasureResult] objects are usually created using the [MeasureScope.layout]
-     * factory, which takes the calculated size of this layout, its alignment lines, and a block
-     * defining the positioning of the children layouts.
+     * [MeasureResult] objects are usually created using the [MeasureScope.layout] factory, which
+     * takes the calculated size of this layout, its alignment lines, and a block defining the
+     * positioning of the children layouts.
      */
-    fun MeasureScope.measure(
-        measurables: List<Measurable>,
-        constraints: Constraints
-    ): MeasureResult
+    fun MeasureScope.measure(measurables: List<Measurable>, constraints: Constraints): MeasureResult
 
     /**
-     * The function used to calculate [IntrinsicMeasurable.minIntrinsicWidth]. It represents
-     * the minimum width this layout can take, given a specific height, such that the content
-     * of the layout can be painted correctly.
+     * The function used to calculate [IntrinsicMeasurable.minIntrinsicWidth]. It represents the
+     * minimum width this layout can take, given a specific height, such that the content of the
+     * layout can be painted correctly.
      */
     fun IntrinsicMeasureScope.minIntrinsicWidth(
         measurables: List<IntrinsicMeasurable>,
         height: Int
     ): Int {
-        val mapped = measurables.fastMap {
-            DefaultIntrinsicMeasurable(it, IntrinsicMinMax.Min, IntrinsicWidthHeight.Width)
-        }
+        val mapped =
+            measurables.fastMap {
+                DefaultIntrinsicMeasurable(it, IntrinsicMinMax.Min, IntrinsicWidthHeight.Width)
+            }
         val constraints = Constraints(maxHeight = height)
         val layoutReceiver = IntrinsicsMeasureScope(this, layoutDirection)
         val layoutResult = layoutReceiver.measure(mapped, constraints)
@@ -113,17 +109,18 @@
     }
 
     /**
-     * The function used to calculate [IntrinsicMeasurable.minIntrinsicHeight]. It represents
-     * the minimum height this layout can take, given a specific width, such that the content
-     * of the layout will be painted correctly.
+     * The function used to calculate [IntrinsicMeasurable.minIntrinsicHeight]. It represents the
+     * minimum height this layout can take, given a specific width, such that the content of the
+     * layout will be painted correctly.
      */
     fun IntrinsicMeasureScope.minIntrinsicHeight(
         measurables: List<IntrinsicMeasurable>,
         width: Int
     ): Int {
-        val mapped = measurables.fastMap {
-            DefaultIntrinsicMeasurable(it, IntrinsicMinMax.Min, IntrinsicWidthHeight.Height)
-        }
+        val mapped =
+            measurables.fastMap {
+                DefaultIntrinsicMeasurable(it, IntrinsicMinMax.Min, IntrinsicWidthHeight.Height)
+            }
         val constraints = Constraints(maxWidth = width)
         val layoutReceiver = IntrinsicsMeasureScope(this, layoutDirection)
         val layoutResult = layoutReceiver.measure(mapped, constraints)
@@ -138,9 +135,10 @@
         measurables: List<IntrinsicMeasurable>,
         height: Int
     ): Int {
-        val mapped = measurables.fastMap {
-            DefaultIntrinsicMeasurable(it, IntrinsicMinMax.Max, IntrinsicWidthHeight.Width)
-        }
+        val mapped =
+            measurables.fastMap {
+                DefaultIntrinsicMeasurable(it, IntrinsicMinMax.Max, IntrinsicWidthHeight.Width)
+            }
         val constraints = Constraints(maxHeight = height)
         val layoutReceiver = IntrinsicsMeasureScope(this, layoutDirection)
         val layoutResult = layoutReceiver.measure(mapped, constraints)
@@ -155,9 +153,10 @@
         measurables: List<IntrinsicMeasurable>,
         width: Int
     ): Int {
-        val mapped = measurables.fastMap {
-            DefaultIntrinsicMeasurable(it, IntrinsicMinMax.Max, IntrinsicWidthHeight.Height)
-        }
+        val mapped =
+            measurables.fastMap {
+                DefaultIntrinsicMeasurable(it, IntrinsicMinMax.Max, IntrinsicWidthHeight.Height)
+            }
         val constraints = Constraints(maxWidth = width)
         val layoutReceiver = IntrinsicsMeasureScope(this, layoutDirection)
         val layoutResult = layoutReceiver.measure(mapped, constraints)
diff --git a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/layout/MeasureResult.kt b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/layout/MeasureResult.kt
index 21a2f93..a2b16cc 100644
--- a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/layout/MeasureResult.kt
+++ b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/layout/MeasureResult.kt
@@ -1,28 +1,23 @@
 package androidx.compose.ui.layout
 
 /**
- * Interface holding the size and alignment lines of the measured layout, as well as the
- * children positioning logic.
- * [placeChildren] is the function used for positioning children. [Placeable.placeAt] should
- * be called on children inside [placeChildren].
- * The alignment lines can be used by the parent layouts to decide layout, and can be queried
- * using the [Placeable.get] operator. Note that alignment lines will be inherited by parent
- * layouts, such that indirect parents will be able to query them as well.
+ * Interface holding the size and alignment lines of the measured layout, as well as the children
+ * positioning logic. [placeChildren] is the function used for positioning children.
+ * [Placeable.placeAt] should be called on children inside [placeChildren]. The alignment lines can
+ * be used by the parent layouts to decide layout, and can be queried using the [Placeable.get]
+ * operator. Note that alignment lines will be inherited by parent layouts, such that indirect
+ * parents will be able to query them as well.
  */
 interface MeasureResult {
-    /**
-     * The measured width of the layout, in pixels.
-     */
+    /** The measured width of the layout, in pixels. */
     val width: Int
 
-    /**
-     * The measured height of the layout, in pixels.
-     */
+    /** The measured height of the layout, in pixels. */
     val height: Int
 
     /**
-     * Alignment lines that can be used by parents to align this layout. This only includes
-     * the alignment lines of this layout and not children.
+     * Alignment lines that can be used by parents to align this layout. This only includes the
+     * alignment lines of this layout and not children.
      */
     val alignmentLines: Map<AlignmentLine, Int>
 
@@ -34,8 +29,8 @@
         get() = null
 
     /**
-     * A method used to place children of this layout. It may also be used to measure children
-     * that were not needed for determining the size of this layout.
+     * A method used to place children of this layout. It may also be used to measure children that
+     * were not needed for determining the size of this layout.
      */
     fun placeChildren()
 }
diff --git a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/layout/MeasureScope.kt b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/layout/MeasureScope.kt
index 7d4c90e..36e7ea8 100644
--- a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/layout/MeasureScope.kt
+++ b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/layout/MeasureScope.kt
@@ -22,21 +22,19 @@
 import androidx.compose.ui.unit.Density
 import androidx.compose.ui.unit.LayoutDirection
 
-@DslMarker
-annotation class MeasureScopeMarker
+@DslMarker annotation class MeasureScopeMarker
 
 /**
- * The receiver scope of a layout's measure lambda. The return value of the
- * measure lambda is [MeasureResult], which should be returned by [layout]
+ * The receiver scope of a layout's measure lambda. The return value of the measure lambda is
+ * [MeasureResult], which should be returned by [layout]
  */
 @MeasureScopeMarker
 @JvmDefaultWithCompatibility
 interface MeasureScope : IntrinsicMeasureScope {
     /**
-     * Sets the size and alignment lines of the measured layout, as well as
-     * the positioning block that defines the children positioning logic.
-     * The [placementBlock] is a lambda used for positioning children. [Placeable.placeAt] should
-     * be called on children inside placementBlock.
+     * Sets the size and alignment lines of the measured layout, as well as the positioning block
+     * that defines the children positioning logic. The [placementBlock] is a lambda used for
+     * positioning children. [Placeable.placeAt] should be called on children inside placementBlock.
      * The [alignmentLines] can be used by the parent layouts to decide layout, and can be queried
      * using the [Placeable.get] operator. Note that alignment lines will be inherited by parent
      * layouts, such that indirect parents will be able to query them as well.
@@ -54,10 +52,9 @@
     ) = layout(width, height, alignmentLines, null, placementBlock)
 
     /**
-     * Sets the size and alignment lines of the measured layout, as well as
-     * the positioning block that defines the children positioning logic.
-     * The [placementBlock] is a lambda used for positioning children. [Placeable.placeAt] should
-     * be called on children inside placementBlock.
+     * Sets the size and alignment lines of the measured layout, as well as the positioning block
+     * that defines the children positioning logic. The [placementBlock] is a lambda used for
+     * positioning children. [Placeable.placeAt] should be called on children inside placementBlock.
      * The [alignmentLines] can be used by the parent layouts to decide layout, and can be queried
      * using the [Placeable.get] operator. Note that alignment lines will be inherited by parent
      * layouts, such that indirect parents will be able to query them as well.
@@ -82,16 +79,14 @@
             override val height = height
             override val alignmentLines = alignmentLines
             override val rulers = rulers
+
             override fun placeChildren() {
                 // This isn't called from anywhere inside the compose framework. This might
                 // be called by tests or external frameworks.
                 if (this@MeasureScope is LookaheadCapablePlaceable) {
                     placementScope.placementBlock()
                 } else {
-                    SimplePlacementScope(
-                        width,
-                        layoutDirection
-                    ).placementBlock()
+                    SimplePlacementScope(width, layoutDirection).placementBlock()
                 }
             }
         }
@@ -99,8 +94,8 @@
 }
 
 /**
- * This is used by the default implementation of [MeasureScope.layout] and will never be called
- * by any implementation of [MeasureScope] in the compose framework.
+ * This is used by the default implementation of [MeasureScope.layout] and will never be called by
+ * any implementation of [MeasureScope] in the compose framework.
  */
 private class SimplePlacementScope(
     override val parentWidth: Int,
@@ -108,8 +103,9 @@
 ) : Placeable.PlacementScope()
 
 /**
- * A scope used in [MeasureScope.layout] for the `rulers` parameter to allow a layout to
- * define [Ruler] values for children.
+ * A scope used in [MeasureScope.layout] for the `rulers` parameter to allow a layout to define
+ * [Ruler] values for children.
+ *
  * @sample androidx.compose.ui.samples.RulerProducerUsage
  */
 @MeasureScopeMarker
@@ -120,14 +116,12 @@
      */
     val coordinates: LayoutCoordinates
 
-    /**
-     * Provides a constant value for a [Ruler].
-     */
+    /** Provides a constant value for a [Ruler]. */
     infix fun Ruler.provides(value: Float)
 
     /**
-     * Provides a [VerticalRuler] value that is relative to the left side in an LTR layout
-     * or right side on an RTL layout.
+     * Provides a [VerticalRuler] value that is relative to the left side in an LTR layout or right
+     * side on an RTL layout.
      */
     infix fun VerticalRuler.providesRelative(value: Float)
 }
diff --git a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/layout/Measured.kt b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/layout/Measured.kt
index 64f312a..034a943 100644
--- a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/layout/Measured.kt
+++ b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/layout/Measured.kt
@@ -16,28 +16,21 @@
 
 package androidx.compose.ui.layout
 
-/**
- * A [Measured] corresponds to a layout that has been measured by its parent layout.
- */
+/** A [Measured] corresponds to a layout that has been measured by its parent layout. */
 interface Measured {
-    /**
-     * The measured width of the layout. This might not respect the measurement constraints.
-     */
+    /** The measured width of the layout. This might not respect the measurement constraints. */
     val measuredWidth: Int
 
-    /**
-     * The measured height of the layout. This might not respect the measurement constraints.
-     */
+    /** The measured height of the layout. This might not respect the measurement constraints. */
     val measuredHeight: Int
 
-    /**
-     * Data provided by the [ParentDataModifier] applied to the layout.
-     */
-    val parentData: Any? get() = null
+    /** Data provided by the [ParentDataModifier] applied to the layout. */
+    val parentData: Any?
+        get() = null
 
     /**
-     * Returns the position of an [alignment line][AlignmentLine],
-     * or [AlignmentLine.Unspecified] if the line is not provided.
+     * Returns the position of an [alignment line][AlignmentLine], or [AlignmentLine.Unspecified] if
+     * the line is not provided.
      */
     operator fun get(alignmentLine: AlignmentLine): Int
 }
diff --git a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/layout/MultiContentMeasurePolicy.kt b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/layout/MultiContentMeasurePolicy.kt
index a7d54c4..9d0ab6e 100644
--- a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/layout/MultiContentMeasurePolicy.kt
+++ b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/layout/MultiContentMeasurePolicy.kt
@@ -27,29 +27,28 @@
  *
  * This interface is identical to [MeasurePolicy], but provides you with a list of lists of
  * [Measurable]s which allows to threat children put into different content lambdas differently.
- * Such list has the same size as the list of contents passed into [Layout] and contains the list
- * of [Measurable]s of the corresponding content lambda in the same order.
+ * Such list has the same size as the list of contents passed into [Layout] and contains the list of
+ * [Measurable]s of the corresponding content lambda in the same order.
  *
- * Intrinsic measurement methods define the intrinsic size of the layout. These can be queried
- * by the layout's parent in order to obtain, in specific cases, more information about
- * the size of the layout in the absence of specific constraints:
- * - [minIntrinsicWidth] defines the minimum width this layout can take, given
- *   a specific height, such that the content of the layout will be painted correctly
- * - [minIntrinsicHeight] defines the minimum height this layout can take, given
- *   a specific width, such that the content of the layout will be painted correctly
- * - [maxIntrinsicWidth] defines the minimum width such that increasing it further
- *   will not decrease the minimum intrinsic height
- * - [maxIntrinsicHeight] defines the minimum height such that increasing it further
- *   will not decrease the minimum intrinsic width
- * Most layout scenarios do not require querying intrinsic measurements. Therefore, when writing
- * a custom layout, it is common to only define the actual measurement, as most of the times
- * the intrinsic measurements of the layout will not be queried. Moreover, intrinsic measurement
- * methods have default implementations that make a best effort attempt to calculate the intrinsic
- * measurements by reusing the [measure] method. Note this will not be correct for all layouts,
- * but can be a convenient approximation.
- * Intrinsic measurements can be useful when the layout system enforcement of no more than one
- * measurement per child is limiting. Layouts that use them are the `preferredWidth(IntrinsicSize)`
- * and `preferredHeight(IntrinsicSize)` modifiers. See their samples for when they can be useful.
+ * Intrinsic measurement methods define the intrinsic size of the layout. These can be queried by
+ * the layout's parent in order to obtain, in specific cases, more information about the size of the
+ * layout in the absence of specific constraints:
+ * - [minIntrinsicWidth] defines the minimum width this layout can take, given a specific height,
+ *   such that the content of the layout will be painted correctly
+ * - [minIntrinsicHeight] defines the minimum height this layout can take, given a specific width,
+ *   such that the content of the layout will be painted correctly
+ * - [maxIntrinsicWidth] defines the minimum width such that increasing it further will not decrease
+ *   the minimum intrinsic height
+ * - [maxIntrinsicHeight] defines the minimum height such that increasing it further will not
+ *   decrease the minimum intrinsic width Most layout scenarios do not require querying intrinsic
+ *   measurements. Therefore, when writing a custom layout, it is common to only define the actual
+ *   measurement, as most of the times the intrinsic measurements of the layout will not be queried.
+ *   Moreover, intrinsic measurement methods have default implementations that make a best effort
+ *   attempt to calculate the intrinsic measurements by reusing the [measure] method. Note this will
+ *   not be correct for all layouts, but can be a convenient approximation. Intrinsic measurements
+ *   can be useful when the layout system enforcement of no more than one measurement per child is
+ *   limiting. Layouts that use them are the `preferredWidth(IntrinsicSize)` and
+ *   `preferredHeight(IntrinsicSize)` modifiers. See their samples for when they can be useful.
  *
  * @see Layout
  * @see MeasurePolicy
@@ -60,35 +59,34 @@
      * The function that defines the measurement and layout. Each [Measurable] in the [measurables]
      * lists corresponds to a layout child of the layout, and children can be measured using the
      * [Measurable.measure] method. This method takes the [Constraints] which the child should
-     * respect; different children can be measured with different constraints.
-     * Measuring a child returns a [Placeable], which reveals the size chosen by the child as a
-     * result of its own measurement. According to the children sizes, the parent defines the
-     * position of the children, by [placing][Placeable.PlacementScope.place] the [Placeable]s in
-     * the [MeasureResult.placeChildren] of the returned [MeasureResult]. Therefore the parent needs
-     * to measure its children with appropriate [Constraints], such that whatever valid sizes
-     * children choose, they can be laid out correctly according to the parent's layout algorithm.
-     * This is because there is no measurement negotiation between the parent and children:
-     * once a child chooses its size, the parent needs to handle it correctly.
+     * respect; different children can be measured with different constraints. Measuring a child
+     * returns a [Placeable], which reveals the size chosen by the child as a result of its own
+     * measurement. According to the children sizes, the parent defines the position of the
+     * children, by [placing][Placeable.PlacementScope.place] the [Placeable]s in the
+     * [MeasureResult.placeChildren] of the returned [MeasureResult]. Therefore the parent needs to
+     * measure its children with appropriate [Constraints], such that whatever valid sizes children
+     * choose, they can be laid out correctly according to the parent's layout algorithm. This is
+     * because there is no measurement negotiation between the parent and children: once a child
+     * chooses its size, the parent needs to handle it correctly.
      *
      * It is identical to [MeasurePolicy.measure], but provides you with a list of lists of
-     * [Measurable]s which allows to threat children put into different content lambdas
-     * differently. Such list has the same size as the list of contents passed into [Layout] and
-     * contains the list of [Measurable]s of the corresponding content lambda in the same order.
+     * [Measurable]s which allows to threat children put into different content lambdas differently.
+     * Such list has the same size as the list of contents passed into [Layout] and contains the
+     * list of [Measurable]s of the corresponding content lambda in the same order.
      *
      * Note that a child is allowed to choose a size that does not satisfy its constraints. However,
      * when this happens, the placeable's [width][Placeable.width] and [height][Placeable.height]
-     * will not represent the real size of the child, but rather the size coerced in the
-     * child's constraints. Therefore, it is common for parents to assume in their layout
-     * algorithm that its children will always respect the constraints. When this
-     * does not happen in reality, the position assigned to the child will be
-     * automatically offset to be centered on the space assigned by the parent under
-     * the assumption that constraints were respected. Rarely, when a parent really needs to know
-     * the true size of the child, they can read this from the placeable's
-     * [Placeable.measuredWidth] and [Placeable.measuredHeight].
+     * will not represent the real size of the child, but rather the size coerced in the child's
+     * constraints. Therefore, it is common for parents to assume in their layout algorithm that its
+     * children will always respect the constraints. When this does not happen in reality, the
+     * position assigned to the child will be automatically offset to be centered on the space
+     * assigned by the parent under the assumption that constraints were respected. Rarely, when a
+     * parent really needs to know the true size of the child, they can read this from the
+     * placeable's [Placeable.measuredWidth] and [Placeable.measuredHeight].
      *
-     * [MeasureResult] objects are usually created using the [MeasureScope.layout]
-     * factory, which takes the calculated size of this layout, its alignment lines, and a block
-     * defining the positioning of the children layouts.
+     * [MeasureResult] objects are usually created using the [MeasureScope.layout] factory, which
+     * takes the calculated size of this layout, its alignment lines, and a block defining the
+     * positioning of the children layouts.
      */
     fun MeasureScope.measure(
         measurables: List<List<Measurable>>,
@@ -96,12 +94,12 @@
     ): MeasureResult
 
     /**
-     * The function used to calculate [IntrinsicMeasurable.minIntrinsicWidth]. It represents
-     * the minimum width this layout can take, given a specific height, such that the content
-     * of the layout can be painted correctly.
+     * The function used to calculate [IntrinsicMeasurable.minIntrinsicWidth]. It represents the
+     * minimum width this layout can take, given a specific height, such that the content of the
+     * layout can be painted correctly.
      *
-     * It is identical to [MeasurePolicy.minIntrinsicWidth], but provides you with a list of
-     * lists of [Measurable]s which allows to threat children put into different content lambdas
+     * It is identical to [MeasurePolicy.minIntrinsicWidth], but provides you with a list of lists
+     * of [Measurable]s which allows to threat children put into different content lambdas
      * differently. Such list has the same size as the list of contents passed into [Layout] and
      * contains the list of [Measurable]s of the corresponding content lambda in the same order.
      */
@@ -109,11 +107,12 @@
         measurables: List<List<IntrinsicMeasurable>>,
         height: Int
     ): Int {
-        val mapped = measurables.fastMap { list ->
-            list.fastMap {
-                DefaultIntrinsicMeasurable(it, IntrinsicMinMax.Min, IntrinsicWidthHeight.Width)
+        val mapped =
+            measurables.fastMap { list ->
+                list.fastMap {
+                    DefaultIntrinsicMeasurable(it, IntrinsicMinMax.Min, IntrinsicWidthHeight.Width)
+                }
             }
-        }
         val constraints = Constraints(maxHeight = height)
         val layoutReceiver = IntrinsicsMeasureScope(this, layoutDirection)
         val layoutResult = layoutReceiver.measure(mapped, constraints)
@@ -121,12 +120,12 @@
     }
 
     /**
-     * The function used to calculate [IntrinsicMeasurable.minIntrinsicHeight]. It represents
-     * the minimum height this layout can take, given a specific width, such that the content
-     * of the layout will be painted correctly.
+     * The function used to calculate [IntrinsicMeasurable.minIntrinsicHeight]. It represents the
+     * minimum height this layout can take, given a specific width, such that the content of the
+     * layout will be painted correctly.
      *
-     * It is identical to [MeasurePolicy.minIntrinsicHeight], but provides you with a list of
-     * lists of [Measurable]s which allows to threat children put into different content lambdas
+     * It is identical to [MeasurePolicy.minIntrinsicHeight], but provides you with a list of lists
+     * of [Measurable]s which allows to threat children put into different content lambdas
      * differently. Such list has the same size as the list of contents passed into [Layout] and
      * contains the list of [Measurable]s of the corresponding content lambda in the same order.
      */
@@ -134,11 +133,12 @@
         measurables: List<List<IntrinsicMeasurable>>,
         width: Int
     ): Int {
-        val mapped = measurables.fastMap { list ->
-            list.fastMap {
-                DefaultIntrinsicMeasurable(it, IntrinsicMinMax.Min, IntrinsicWidthHeight.Height)
+        val mapped =
+            measurables.fastMap { list ->
+                list.fastMap {
+                    DefaultIntrinsicMeasurable(it, IntrinsicMinMax.Min, IntrinsicWidthHeight.Height)
+                }
             }
-        }
         val constraints = Constraints(maxWidth = width)
         val layoutReceiver = IntrinsicsMeasureScope(this, layoutDirection)
         val layoutResult = layoutReceiver.measure(mapped, constraints)
@@ -149,8 +149,8 @@
      * The function used to calculate [IntrinsicMeasurable.maxIntrinsicWidth]. It represents the
      * minimum width such that increasing it further will not decrease the minimum intrinsic height.
      *
-     * It is identical to [MeasurePolicy.maxIntrinsicWidth], but provides you with a list of
-     * lists of [Measurable]s which allows to threat children put into different content lambdas
+     * It is identical to [MeasurePolicy.maxIntrinsicWidth], but provides you with a list of lists
+     * of [Measurable]s which allows to threat children put into different content lambdas
      * differently. Such list has the same size as the list of contents passed into [Layout] and
      * contains the list of [Measurable]s of the corresponding content lambda in the same order.
      */
@@ -158,11 +158,12 @@
         measurables: List<List<IntrinsicMeasurable>>,
         height: Int
     ): Int {
-        val mapped = measurables.fastMap { list ->
-            list.fastMap {
-                DefaultIntrinsicMeasurable(it, IntrinsicMinMax.Max, IntrinsicWidthHeight.Width)
+        val mapped =
+            measurables.fastMap { list ->
+                list.fastMap {
+                    DefaultIntrinsicMeasurable(it, IntrinsicMinMax.Max, IntrinsicWidthHeight.Width)
+                }
             }
-        }
         val constraints = Constraints(maxHeight = height)
         val layoutReceiver = IntrinsicsMeasureScope(this, layoutDirection)
         val layoutResult = layoutReceiver.measure(mapped, constraints)
@@ -173,8 +174,8 @@
      * The function used to calculate [IntrinsicMeasurable.maxIntrinsicHeight]. It represents the
      * minimum height such that increasing it further will not decrease the minimum intrinsic width.
      *
-     * It is identical to [MeasurePolicy.maxIntrinsicHeight], but provides you with a list of
-     * lists of [Measurable]s which allows to threat children put into different content lambdas
+     * It is identical to [MeasurePolicy.maxIntrinsicHeight], but provides you with a list of lists
+     * of [Measurable]s which allows to threat children put into different content lambdas
      * differently. Such list has the same size as the list of contents passed into [Layout] and
      * contains the list of [Measurable]s of the corresponding content lambda in the same order.
      */
@@ -182,11 +183,12 @@
         measurables: List<List<IntrinsicMeasurable>>,
         width: Int
     ): Int {
-        val mapped = measurables.fastMap { list ->
-            list.fastMap {
-                DefaultIntrinsicMeasurable(it, IntrinsicMinMax.Max, IntrinsicWidthHeight.Height)
+        val mapped =
+            measurables.fastMap { list ->
+                list.fastMap {
+                    DefaultIntrinsicMeasurable(it, IntrinsicMinMax.Max, IntrinsicWidthHeight.Height)
+                }
             }
-        }
         val constraints = Constraints(maxWidth = width)
         val layoutReceiver = IntrinsicsMeasureScope(this, layoutDirection)
         val layoutResult = layoutReceiver.measure(mapped, constraints)
@@ -195,45 +197,43 @@
 }
 
 @PublishedApi
-internal fun createMeasurePolicy(
-    measurePolicy: MultiContentMeasurePolicy
-): MeasurePolicy = MultiContentMeasurePolicyImpl(measurePolicy)
+internal fun createMeasurePolicy(measurePolicy: MultiContentMeasurePolicy): MeasurePolicy =
+    MultiContentMeasurePolicyImpl(measurePolicy)
 
-internal data class MultiContentMeasurePolicyImpl(
-    val measurePolicy: MultiContentMeasurePolicy
-) : MeasurePolicy {
-    override fun MeasureScope.measure(
-        measurables: List<Measurable>,
-        constraints: Constraints
-    ) = with(measurePolicy) {
-        measure(getChildrenOfVirtualChildren(this@measure), constraints)
-    }
+internal data class MultiContentMeasurePolicyImpl(val measurePolicy: MultiContentMeasurePolicy) :
+    MeasurePolicy {
+    override fun MeasureScope.measure(measurables: List<Measurable>, constraints: Constraints) =
+        with(measurePolicy) { measure(getChildrenOfVirtualChildren(this@measure), constraints) }
 
     override fun IntrinsicMeasureScope.minIntrinsicWidth(
         measurables: List<IntrinsicMeasurable>,
         height: Int
-    ) = with(measurePolicy) {
-        minIntrinsicWidth(getChildrenOfVirtualChildren(this@minIntrinsicWidth), height)
-    }
+    ) =
+        with(measurePolicy) {
+            minIntrinsicWidth(getChildrenOfVirtualChildren(this@minIntrinsicWidth), height)
+        }
 
     override fun IntrinsicMeasureScope.minIntrinsicHeight(
         measurables: List<IntrinsicMeasurable>,
         width: Int
-    ) = with(measurePolicy) {
-        minIntrinsicHeight(getChildrenOfVirtualChildren(this@minIntrinsicHeight), width)
-    }
+    ) =
+        with(measurePolicy) {
+            minIntrinsicHeight(getChildrenOfVirtualChildren(this@minIntrinsicHeight), width)
+        }
 
     override fun IntrinsicMeasureScope.maxIntrinsicWidth(
         measurables: List<IntrinsicMeasurable>,
         height: Int
-    ) = with(measurePolicy) {
-        maxIntrinsicWidth(getChildrenOfVirtualChildren(this@maxIntrinsicWidth), height)
-    }
+    ) =
+        with(measurePolicy) {
+            maxIntrinsicWidth(getChildrenOfVirtualChildren(this@maxIntrinsicWidth), height)
+        }
 
     override fun IntrinsicMeasureScope.maxIntrinsicHeight(
         measurables: List<IntrinsicMeasurable>,
         width: Int
-    ) = with(measurePolicy) {
-        maxIntrinsicHeight(getChildrenOfVirtualChildren(this@maxIntrinsicHeight), width)
-    }
+    ) =
+        with(measurePolicy) {
+            maxIntrinsicHeight(getChildrenOfVirtualChildren(this@maxIntrinsicHeight), width)
+        }
 }
diff --git a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/layout/OnGloballyPositionedModifier.kt b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/layout/OnGloballyPositionedModifier.kt
index 065c55e..59778bc 100644
--- a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/layout/OnGloballyPositionedModifier.kt
+++ b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/layout/OnGloballyPositionedModifier.kt
@@ -24,28 +24,26 @@
 import androidx.compose.ui.platform.InspectorInfo
 
 /**
- * Invoke [onGloballyPositioned] with the [LayoutCoordinates] of the element when the
- * global position of the content may have changed.
- * Note that it will be called **after** a composition when the coordinates are finalized.
+ * Invoke [onGloballyPositioned] with the [LayoutCoordinates] of the element when the global
+ * position of the content may have changed. Note that it will be called **after** a composition
+ * when the coordinates are finalized.
  *
  * This callback will be invoked at least once when the [LayoutCoordinates] are available, and every
  * time the element's position changes within the window. However, it is not guaranteed to be
  * invoked every time the position _relative to the screen_ of the modified element changes. For
- * example, the system may move the contents inside a window around without firing a callback.
- * If you are using the [LayoutCoordinates] to calculate position on the screen, and not just inside
+ * example, the system may move the contents inside a window around without firing a callback. If
+ * you are using the [LayoutCoordinates] to calculate position on the screen, and not just inside
  * the window, you may not receive a callback.
  *
  * Usage example:
+ *
  * @sample androidx.compose.ui.samples.OnGloballyPositioned
  */
 @Stable
-fun Modifier.onGloballyPositioned(
-    onGloballyPositioned: (LayoutCoordinates) -> Unit
-) = this then OnGloballyPositionedElement(onGloballyPositioned)
+fun Modifier.onGloballyPositioned(onGloballyPositioned: (LayoutCoordinates) -> Unit) =
+    this then OnGloballyPositionedElement(onGloballyPositioned)
 
-private class OnGloballyPositionedElement(
-    val onGloballyPositioned: (LayoutCoordinates) -> Unit
-) :
+private class OnGloballyPositionedElement(val onGloballyPositioned: (LayoutCoordinates) -> Unit) :
     ModifierNodeElement<OnGloballyPositionedNode>() {
     override fun create(): OnGloballyPositionedNode {
         return OnGloballyPositionedNode(onGloballyPositioned)
@@ -71,29 +69,29 @@
     }
 }
 
-private class OnGloballyPositionedNode(
-    var callback: (LayoutCoordinates) -> Unit
-) : Modifier.Node(), GlobalPositionAwareModifierNode {
+private class OnGloballyPositionedNode(var callback: (LayoutCoordinates) -> Unit) :
+    Modifier.Node(), GlobalPositionAwareModifierNode {
     override fun onGloballyPositioned(coordinates: LayoutCoordinates) {
         callback(coordinates)
     }
 }
 
 /**
- * A modifier whose [onGloballyPositioned] is called with the final LayoutCoordinates of the
- * Layout when the global position of the content may have changed.
- * Note that it will be called after a composition when the coordinates are finalized.
+ * A modifier whose [onGloballyPositioned] is called with the final LayoutCoordinates of the Layout
+ * when the global position of the content may have changed. Note that it will be called after a
+ * composition when the coordinates are finalized.
  *
  * Usage example:
+ *
  * @sample androidx.compose.ui.samples.OnGloballyPositioned
  */
 @JvmDefaultWithCompatibility
 interface OnGloballyPositionedModifier : Modifier.Element {
     /**
-     * Called with the final LayoutCoordinates of the Layout after measuring.
-     * Note that it will be called after a composition when the coordinates are finalized.
-     * The position in the modifier chain makes no difference in either
-     * the [LayoutCoordinates] argument or when the [onGloballyPositioned] is called.
+     * Called with the final LayoutCoordinates of the Layout after measuring. Note that it will be
+     * called after a composition when the coordinates are finalized. The position in the modifier
+     * chain makes no difference in either the [LayoutCoordinates] argument or when the
+     * [onGloballyPositioned] is called.
      */
     fun onGloballyPositioned(coordinates: LayoutCoordinates)
 }
diff --git a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/layout/OnPlacedModifier.kt b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/layout/OnPlacedModifier.kt
index fcfda60..b2b14c9 100644
--- a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/layout/OnPlacedModifier.kt
+++ b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/layout/OnPlacedModifier.kt
@@ -25,19 +25,16 @@
 
 /**
  * Invoke [onPlaced] after the parent [LayoutModifier] and parent layout has been placed and before
- * child [LayoutModifier] is placed. This allows child [LayoutModifier] to adjust its
- * own placement based on where the parent is.
+ * child [LayoutModifier] is placed. This allows child [LayoutModifier] to adjust its own placement
+ * based on where the parent is.
  *
  * @sample androidx.compose.ui.samples.OnPlaced
  */
 @Stable
-fun Modifier.onPlaced(
-    onPlaced: (LayoutCoordinates) -> Unit
-) = this then OnPlacedElement(onPlaced)
+fun Modifier.onPlaced(onPlaced: (LayoutCoordinates) -> Unit) = this then OnPlacedElement(onPlaced)
 
-private data class OnPlacedElement(
-    val onPlaced: (LayoutCoordinates) -> Unit
-) : ModifierNodeElement<OnPlacedNode>() {
+private data class OnPlacedElement(val onPlaced: (LayoutCoordinates) -> Unit) :
+    ModifierNodeElement<OnPlacedNode>() {
     override fun create() = OnPlacedNode(callback = onPlaced)
 
     override fun update(node: OnPlacedNode) {
@@ -50,9 +47,8 @@
     }
 }
 
-private class OnPlacedNode(
-    var callback: (LayoutCoordinates) -> Unit
-) : LayoutAwareModifierNode, Modifier.Node() {
+private class OnPlacedNode(var callback: (LayoutCoordinates) -> Unit) :
+    LayoutAwareModifierNode, Modifier.Node() {
 
     override fun onPlaced(coordinates: LayoutCoordinates) {
         callback(coordinates)
@@ -61,16 +57,16 @@
 
 /**
  * A modifier whose [onPlaced] is called after the parent [LayoutModifier] and parent layout has
- * been placed and before child [LayoutModifier] is placed. This allows child
- * [LayoutModifier] to adjust its own placement based on where the parent is.
+ * been placed and before child [LayoutModifier] is placed. This allows child [LayoutModifier] to
+ * adjust its own placement based on where the parent is.
  *
  * @sample androidx.compose.ui.samples.OnPlaced
  */
 @JvmDefaultWithCompatibility
 interface OnPlacedModifier : Modifier.Element {
     /**
-     * [onPlaced] is called after parent [LayoutModifier] and parent layout gets placed and
-     * before any child [LayoutModifier] is placed.
+     * [onPlaced] is called after parent [LayoutModifier] and parent layout gets placed and before
+     * any child [LayoutModifier] is placed.
      *
      * [coordinates] provides [LayoutCoordinates] of the [OnPlacedModifier]. Placement in both
      * parent [LayoutModifier] and parent layout can be calculated using the [LayoutCoordinates].
diff --git a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/layout/OnRemeasuredModifier.kt b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/layout/OnRemeasuredModifier.kt
index a6b2e22..803277a 100644
--- a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/layout/OnRemeasuredModifier.kt
+++ b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/layout/OnRemeasuredModifier.kt
@@ -39,16 +39,15 @@
  * enable the size of one component to affect the size of another.
  *
  * Example usage:
+ *
  * @sample androidx.compose.ui.samples.OnSizeChangedSample
  */
 @Stable
-fun Modifier.onSizeChanged(
-    onSizeChanged: (IntSize) -> Unit
-) = this.then(OnSizeChangedModifier(onSizeChanged = onSizeChanged))
+fun Modifier.onSizeChanged(onSizeChanged: (IntSize) -> Unit) =
+    this.then(OnSizeChangedModifier(onSizeChanged = onSizeChanged))
 
-private class OnSizeChangedModifier(
-    private val onSizeChanged: (IntSize) -> Unit
-) : ModifierNodeElement<OnSizeChangedNode>() {
+private class OnSizeChangedModifier(private val onSizeChanged: (IntSize) -> Unit) :
+    ModifierNodeElement<OnSizeChangedNode>() {
     override fun create(): OnSizeChangedNode = OnSizeChangedNode(onSizeChanged)
 
     override fun update(node: OnSizeChangedNode) {
@@ -72,9 +71,8 @@
     }
 }
 
-private class OnSizeChangedNode(
-    private var onSizeChanged: (IntSize) -> Unit
-) : Modifier.Node(), LayoutAwareModifierNode {
+private class OnSizeChangedNode(private var onSizeChanged: (IntSize) -> Unit) :
+    Modifier.Node(), LayoutAwareModifierNode {
     // When onSizeChanged changes, we want to invalidate so onRemeasured is called again
     override val shouldAutoInvalidate: Boolean = true
     private var previousSize = IntSize(Int.MIN_VALUE, Int.MIN_VALUE)
@@ -95,16 +93,15 @@
 }
 
 /**
- * A modifier whose [onRemeasured] is called when the layout content is remeasured. The
- * most common usage is [onSizeChanged].
+ * A modifier whose [onRemeasured] is called when the layout content is remeasured. The most common
+ * usage is [onSizeChanged].
  *
  * Example usage:
+ *
  * @sample androidx.compose.ui.samples.OnSizeChangedSample
  */
 @JvmDefaultWithCompatibility
 interface OnRemeasuredModifier : Modifier.Element {
-    /**
-     * Called after a layout's contents have been remeasured.
-     */
+    /** Called after a layout's contents have been remeasured. */
     fun onRemeasured(size: IntSize)
 }
diff --git a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/layout/ParentDataModifier.kt b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/layout/ParentDataModifier.kt
index 9811bae..10a8ed6 100644
--- a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/layout/ParentDataModifier.kt
+++ b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/layout/ParentDataModifier.kt
@@ -21,10 +21,10 @@
 import androidx.compose.ui.unit.Density
 
 /**
- * A [Modifier] that provides data to the parent [Layout]. This can be read from within the
- * the [Layout] during measurement and positioning, via [IntrinsicMeasurable.parentData].
- * The parent data is commonly used to inform the parent how the child [Layout] should be measured
- * and positioned.
+ * A [Modifier] that provides data to the parent [Layout]. This can be read from within the the
+ * [Layout] during measurement and positioning, via [IntrinsicMeasurable.parentData]. The parent
+ * data is commonly used to inform the parent how the child [Layout] should be measured and
+ * positioned.
  */
 @JvmDefaultWithCompatibility
 interface ParentDataModifier : Modifier.Element {
diff --git a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/layout/PinnableContainer.kt b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/layout/PinnableContainer.kt
index 4874d63..4130c3f 100644
--- a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/layout/PinnableContainer.kt
+++ b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/layout/PinnableContainer.kt
@@ -29,8 +29,8 @@
 /**
  * Represents a container which can be pinned when the content of this container is important.
  *
- * For example, each item of lazy list represents one [PinnableContainer], and if this
- * container is pinned, this item will not be disposed when scrolled out of the viewport.
+ * For example, each item of lazy list represents one [PinnableContainer], and if this container is
+ * pinned, this item will not be disposed when scrolled out of the viewport.
  *
  * Pinning a currently focused item so the focus is not lost is one of the examples when this
  * functionality can be useful.
@@ -43,23 +43,21 @@
     /**
      * Allows to pin this container when the associated content is considered important.
      *
-     * For example, if this [PinnableContainer] is an item of lazy list pinning will mean
-     * this item will not be disposed when scrolled out of the viewport.
+     * For example, if this [PinnableContainer] is an item of lazy list pinning will mean this item
+     * will not be disposed when scrolled out of the viewport.
      *
      * Don't forget to call [PinnedHandle.release] when this content is not important anymore.
      */
     fun pin(): PinnedHandle
 
-    /**
-     * This is an object returned by [pin] which allows to release the pinning.
-     */
+    /** This is an object returned by [pin] which allows to release the pinning. */
     @Suppress("NotCloseable")
     fun interface PinnedHandle {
         /**
          * Releases the pin.
          *
-         * For example, if this [PinnableContainer] is an item of lazy list releasing the
-         * pinning will allow lazy list to stop composing the item when it is not visible.
+         * For example, if this [PinnableContainer] is an item of lazy list releasing the pinning
+         * will allow lazy list to stop composing the item when it is not visible.
          */
         fun release()
     }
diff --git a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/layout/Placeable.kt b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/layout/Placeable.kt
index b761596c..4c26b36 100644
--- a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/layout/Placeable.kt
+++ b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/layout/Placeable.kt
@@ -27,8 +27,8 @@
 import androidx.compose.ui.unit.LayoutDirection
 
 /**
- * A [Placeable] corresponds to a child layout that can be positioned by its
- * parent layout. Most [Placeable]s are the result of a [Measurable.measure] call.
+ * A [Placeable] corresponds to a child layout that can be positioned by its parent layout. Most
+ * [Placeable]s are the result of a [Measurable.measure] call.
  *
  * A `Placeable` should never be stored between measure calls.
  */
@@ -36,38 +36,34 @@
     /**
      * The width, in pixels, of the measured layout, as seen by the parent. This will usually
      * coincide with the measured width of the layout (aka the `width` value passed into
-     * [MeasureScope.layout]), but can be different if the layout does not respect its
-     * incoming constraints: in these cases the width will be coerced inside the min and
-     * max width constraints - to access the actual width that the layout measured itself to,
-     * use [measuredWidth].
+     * [MeasureScope.layout]), but can be different if the layout does not respect its incoming
+     * constraints: in these cases the width will be coerced inside the min and max width
+     * constraints - to access the actual width that the layout measured itself to, use
+     * [measuredWidth].
      */
     var width: Int = 0
         private set
 
     /**
      * The height, in pixels, of the measured layout, as seen by the parent. This will usually
-     * coincide with the measured height of the layout (aka the `height` value passed
-     * into [MeasureScope.layout]), but can be different if the layout does not respect its
-     * incoming constraints: in these cases the height will be coerced inside the min and
-     * max height constraints - to access the actual height that the layout measured itself to,
-     * use [measuredHeight].
+     * coincide with the measured height of the layout (aka the `height` value passed into
+     * [MeasureScope.layout]), but can be different if the layout does not respect its incoming
+     * constraints: in these cases the height will be coerced inside the min and max height
+     * constraints - to access the actual height that the layout measured itself to, use
+     * [measuredHeight].
      */
     var height: Int = 0
         private set
 
-    /**
-     * The measured width of the layout. This might not respect the measurement constraints.
-     */
-    override val measuredWidth: Int get() = measuredSize.width
+    /** The measured width of the layout. This might not respect the measurement constraints. */
+    override val measuredWidth: Int
+        get() = measuredSize.width
 
-    /**
-     * The measured height of the layout. This might not respect the measurement constraints.
-     */
-    override val measuredHeight: Int get() = measuredSize.height
+    /** The measured height of the layout. This might not respect the measurement constraints. */
+    override val measuredHeight: Int
+        get() = measuredSize.height
 
-    /**
-     * The measured size of this Placeable. This might not respect [measurementConstraints].
-     */
+    /** The measured size of this Placeable. This might not respect [measurementConstraints]. */
     protected var measuredSize: IntSize = IntSize(0, 0)
         set(value) {
             if (field != value) {
@@ -77,14 +73,16 @@
         }
 
     private fun onMeasuredSizeChanged() {
-        width = measuredSize.width.coerceIn(
-            measurementConstraints.minWidth,
-            measurementConstraints.maxWidth
-        )
-        height = measuredSize.height.coerceIn(
-            measurementConstraints.minHeight,
-            measurementConstraints.maxHeight
-        )
+        width =
+            measuredSize.width.coerceIn(
+                measurementConstraints.minWidth,
+                measurementConstraints.maxWidth
+            )
+        height =
+            measuredSize.height.coerceIn(
+                measurementConstraints.minHeight,
+                measurementConstraints.maxHeight
+            )
         apparentToRealOffset =
             IntOffset((width - measuredSize.width) / 2, (height - measuredSize.height) / 2)
     }
@@ -94,12 +92,12 @@
      *
      * @param position position in the parent's coordinate system.
      * @param zIndex controls the drawing order for the [Placeable]. A [Placeable] with larger
-     * [zIndex] will be drawn on top of all the children with smaller [zIndex]. When children
-     * have the same [zIndex] the order in which the items were placed is used.
-     * @param layerBlock when non-null this [Placeable] should be placed with an introduced
-     * graphic layer. You can configure any layer property available on [GraphicsLayerScope] via
-     * this block. Also if the [Placeable] will be placed with a new [position] next time only the
-     * graphic layer will be moved without requiring to redrawn the [Placeable] content.
+     *   [zIndex] will be drawn on top of all the children with smaller [zIndex]. When children have
+     *   the same [zIndex] the order in which the items were placed is used.
+     * @param layerBlock when non-null this [Placeable] should be placed with an introduced graphic
+     *   layer. You can configure any layer property available on [GraphicsLayerScope] via this
+     *   block. Also if the [Placeable] will be placed with a new [position] next time only the
+     *   graphic layer will be moved without requiring to redrawn the [Placeable] content.
      */
     protected abstract fun placeAt(
         position: IntOffset,
@@ -112,23 +110,17 @@
      *
      * @param position position in the parent's coordinate system.
      * @param zIndex controls the drawing order for the [Placeable]. A [Placeable] with larger
-     * [zIndex] will be drawn on top of all the children with smaller [zIndex]. When children
-     * have the same [zIndex] the order in which the items were placed is used.
-     * @param layer [GraphicsLayer] to place this placeable with. If the [Placeable] will be
-     * placed with a new [position] next time only the graphic layer will be moved without
-     * requiring to redrawn the [Placeable] content.
+     *   [zIndex] will be drawn on top of all the children with smaller [zIndex]. When children have
+     *   the same [zIndex] the order in which the items were placed is used.
+     * @param layer [GraphicsLayer] to place this placeable with. If the [Placeable] will be placed
+     *   with a new [position] next time only the graphic layer will be moved without requiring to
+     *   redrawn the [Placeable] content.
      */
-    protected open fun placeAt(
-        position: IntOffset,
-        zIndex: Float,
-        layer: GraphicsLayer
-    ) {
+    protected open fun placeAt(position: IntOffset, zIndex: Float, layer: GraphicsLayer) {
         placeAt(position, zIndex, null)
     }
 
-    /**
-     * The constraints used for the measurement made to obtain this [Placeable].
-     */
+    /** The constraints used for the measurement made to obtain this [Placeable]. */
     protected var measurementConstraints: Constraints = DefaultConstraints
         set(value) {
             if (field != value) {
@@ -148,29 +140,28 @@
     /**
      * Receiver scope that permits explicit placement of a [Placeable].
      *
-     * While a [Placeable] may be placed at any time, this explicit receiver scope is used
-     * to discourage placement outside of [MeasureScope.layout] positioning blocks.
-     * This permits Compose UI to perform additional layout optimizations allowing repositioning
-     * a [Placeable] without remeasuring its original [Measurable] if factors contributing to its
-     * potential measurement have not changed.
-     * The scope also allows automatic mirroring of children positions in RTL layout direction
-     * contexts using the [placeRelative] methods available in the scope. If the automatic
-     * mirroring is not desired, [place] should be used instead.
+     * While a [Placeable] may be placed at any time, this explicit receiver scope is used to
+     * discourage placement outside of [MeasureScope.layout] positioning blocks. This permits
+     * Compose UI to perform additional layout optimizations allowing repositioning a [Placeable]
+     * without remeasuring its original [Measurable] if factors contributing to its potential
+     * measurement have not changed. The scope also allows automatic mirroring of children positions
+     * in RTL layout direction contexts using the [placeRelative] methods available in the scope. If
+     * the automatic mirroring is not desired, [place] should be used instead.
      */
     // TODO(b/150276678): using the PlacementScope to place outside the layout pass is not working.
     @PlacementScopeMarker
     abstract class PlacementScope {
         /**
-         * Keeps the parent layout node's width to make the automatic mirroring of the position
-         * in RTL environment. If the value is zero, than the [Placeable] will be be placed to
-         * the original position (position will not be mirrored).
+         * Keeps the parent layout node's width to make the automatic mirroring of the position in
+         * RTL environment. If the value is zero, than the [Placeable] will be be placed to the
+         * original position (position will not be mirrored).
          */
         protected abstract val parentWidth: Int
 
         /**
          * Keeps the layout direction of the parent of the placeable that is being places using
-         * current [PlacementScope]. Used to support automatic position mirroring for convenient
-         * RTL support in custom layouts.
+         * current [PlacementScope]. Used to support automatic position mirroring for convenient RTL
+         * support in custom layouts.
          */
         protected abstract val parentLayoutDirection: LayoutDirection
 
@@ -182,9 +173,9 @@
          * When [coordinates] is `null`, there will always be a follow-up placement call in which
          * [coordinates] is not-`null`.
          *
-         * If you read a position from the coordinates during the placement block the block
-         * will be automatically re-executed when the parent layout changes a position. If you
-         * don't read it the placement block execution can be skipped as an optimization.
+         * If you read a position from the coordinates during the placement block the block will be
+         * automatically re-executed when the parent layout changes a position. If you don't read it
+         * the placement block execution can be skipped as an optimization.
          *
          * @sample androidx.compose.ui.samples.PlacementScopeCoordinatesSample
          */
@@ -195,89 +186,86 @@
          * Returns the value for this [Ruler] or [defaultValue] if it wasn't
          * [provided][RulerScope.provides]. [Ruler] values are unavailable while calculating
          * [AlignmentLine]s.
+         *
          * @sample androidx.compose.ui.samples.RulerConsumerUsage
          */
         open fun Ruler.current(defaultValue: Float): Float = defaultValue
 
         /**
-         * Place a [Placeable] at [position] in its parent's coordinate system.
-         * If the layout direction is right-to-left, the given [position] will be horizontally
-         * mirrored so that the position of the [Placeable] implicitly reacts to RTL layout
-         * direction contexts.
-         * If this method is used outside the [MeasureScope.layout] positioning block, the
-         * automatic position mirroring will not happen and the [Placeable] will be placed at the
-         * given [position], similar to the [place] method.
+         * Place a [Placeable] at [position] in its parent's coordinate system. If the layout
+         * direction is right-to-left, the given [position] will be horizontally mirrored so that
+         * the position of the [Placeable] implicitly reacts to RTL layout direction contexts. If
+         * this method is used outside the [MeasureScope.layout] positioning block, the automatic
+         * position mirroring will not happen and the [Placeable] will be placed at the given
+         * [position], similar to the [place] method.
          *
          * @param position position in the parent's coordinate system.
          * @param zIndex controls the drawing order for the [Placeable]. A [Placeable] with larger
-         * [zIndex] will be drawn on top of all the children with smaller [zIndex]. When children
-         * have the same [zIndex] the order in which the items were placed is used.
+         *   [zIndex] will be drawn on top of all the children with smaller [zIndex]. When children
+         *   have the same [zIndex] the order in which the items were placed is used.
          */
         fun Placeable.placeRelative(position: IntOffset, zIndex: Float = 0f) =
             placeAutoMirrored(position, zIndex, null)
 
         /**
-         * Place a [Placeable] at [x], [y] in its parent's coordinate system.
-         * If the layout direction is right-to-left, the given position will be horizontally
-         * mirrored so that the position of the [Placeable] implicitly reacts to RTL layout
-         * direction contexts.
-         * If this method is used outside the [MeasureScope.layout] positioning block, the
-         * automatic position mirroring will not happen and the [Placeable] will be placed at the
-         * given position, similar to the [place] method.
+         * Place a [Placeable] at [x], [y] in its parent's coordinate system. If the layout
+         * direction is right-to-left, the given position will be horizontally mirrored so that the
+         * position of the [Placeable] implicitly reacts to RTL layout direction contexts. If this
+         * method is used outside the [MeasureScope.layout] positioning block, the automatic
+         * position mirroring will not happen and the [Placeable] will be placed at the given
+         * position, similar to the [place] method.
          *
          * @param x x coordinate in the parent's coordinate system.
          * @param y y coordinate in the parent's coordinate system.
          * @param zIndex controls the drawing order for the [Placeable]. A [Placeable] with larger
-         * [zIndex] will be drawn on top of all the children with smaller [zIndex]. When children
-         * have the same [zIndex] the order in which the items were placed is used.
+         *   [zIndex] will be drawn on top of all the children with smaller [zIndex]. When children
+         *   have the same [zIndex] the order in which the items were placed is used.
          */
         fun Placeable.placeRelative(x: Int, y: Int, zIndex: Float = 0f) =
             placeAutoMirrored(IntOffset(x, y), zIndex, null)
 
         /**
-         * Place a [Placeable] at [x], [y] in its parent's coordinate system.
-         * Unlike [placeRelative], the given position will not implicitly react in RTL layout direction
+         * Place a [Placeable] at [x], [y] in its parent's coordinate system. Unlike
+         * [placeRelative], the given position will not implicitly react in RTL layout direction
          * contexts.
          *
          * @param x x coordinate in the parent's coordinate system.
          * @param y y coordinate in the parent's coordinate system.
          * @param zIndex controls the drawing order for the [Placeable]. A [Placeable] with larger
-         * [zIndex] will be drawn on top of all the children with smaller [zIndex]. When children
-         * have the same [zIndex] the order in which the items were placed is used.
+         *   [zIndex] will be drawn on top of all the children with smaller [zIndex]. When children
+         *   have the same [zIndex] the order in which the items were placed is used.
          */
         fun Placeable.place(x: Int, y: Int, zIndex: Float = 0f) =
             placeApparentToRealOffset(IntOffset(x, y), zIndex, null)
 
         /**
-         * Place a [Placeable] at [position] in its parent's coordinate system.
-         * Unlike [placeRelative], the given [position] will not implicitly react in RTL layout direction
+         * Place a [Placeable] at [position] in its parent's coordinate system. Unlike
+         * [placeRelative], the given [position] will not implicitly react in RTL layout direction
          * contexts.
          *
          * @param position position in the parent's coordinate system.
          * @param zIndex controls the drawing order for the [Placeable]. A [Placeable] with larger
-         * [zIndex] will be drawn on top of all the children with smaller [zIndex]. When children
-         * have the same [zIndex] the order in which the items were placed is used.
+         *   [zIndex] will be drawn on top of all the children with smaller [zIndex]. When children
+         *   have the same [zIndex] the order in which the items were placed is used.
          */
         fun Placeable.place(position: IntOffset, zIndex: Float = 0f) =
             placeApparentToRealOffset(position, zIndex, null)
 
         /**
          * Place a [Placeable] at [position] in its parent's coordinate system with an introduced
-         * graphic layer.
-         * If the layout direction is right-to-left, the given [position] will be horizontally
-         * mirrored so that the position of the [Placeable] implicitly reacts to RTL layout
-         * direction contexts.
-         * If this method is used outside the [MeasureScope.layout] positioning block, the
-         * automatic position mirroring will not happen and the [Placeable] will be placed at the
-         * given [position], similar to the [place] method.
+         * graphic layer. If the layout direction is right-to-left, the given [position] will be
+         * horizontally mirrored so that the position of the [Placeable] implicitly reacts to RTL
+         * layout direction contexts. If this method is used outside the [MeasureScope.layout]
+         * positioning block, the automatic position mirroring will not happen and the [Placeable]
+         * will be placed at the given [position], similar to the [place] method.
          *
          * @param position position in the parent's coordinate system.
          * @param zIndex controls the drawing order for the [Placeable]. A [Placeable] with larger
-         * [zIndex] will be drawn on top of all the children with smaller [zIndex]. When children
-         * have the same [zIndex] the order in which the items were placed is used.
-         * @param layerBlock You can configure any layer property available on [GraphicsLayerScope] via
-         * this block. If the [Placeable] will be placed with a new [position] next time only the
-         * graphic layer will be moved without requiring to redrawn the [Placeable] content.
+         *   [zIndex] will be drawn on top of all the children with smaller [zIndex]. When children
+         *   have the same [zIndex] the order in which the items were placed is used.
+         * @param layerBlock You can configure any layer property available on [GraphicsLayerScope]
+         *   via this block. If the [Placeable] will be placed with a new [position] next time only
+         *   the graphic layer will be moved without requiring to redrawn the [Placeable] content.
          */
         fun Placeable.placeRelativeWithLayer(
             position: IntOffset,
@@ -287,22 +275,20 @@
 
         /**
          * Place a [Placeable] at [x], [y] in its parent's coordinate system with an introduced
-         * graphic layer.
-         * If the layout direction is right-to-left, the given position will be horizontally
-         * mirrored so that the position of the [Placeable] implicitly reacts to RTL layout
-         * direction contexts.
-         * If this method is used outside the [MeasureScope.layout] positioning block, the
-         * automatic position mirroring will not happen and the [Placeable] will be placed at the
-         * given position, similar to the [place] method.
+         * graphic layer. If the layout direction is right-to-left, the given position will be
+         * horizontally mirrored so that the position of the [Placeable] implicitly reacts to RTL
+         * layout direction contexts. If this method is used outside the [MeasureScope.layout]
+         * positioning block, the automatic position mirroring will not happen and the [Placeable]
+         * will be placed at the given position, similar to the [place] method.
          *
          * @param x x coordinate in the parent's coordinate system.
          * @param y y coordinate in the parent's coordinate system.
          * @param zIndex controls the drawing order for the [Placeable]. A [Placeable] with larger
-         * [zIndex] will be drawn on top of all the children with smaller [zIndex]. When children
-         * have the same [zIndex] the order in which the items were placed is used.
-         * @param layerBlock You can configure any layer property available on [GraphicsLayerScope] via
-         * this block. If the [Placeable] will be placed with a new [x] or [y] next time only the
-         * graphic layer will be moved without requiring to redrawn the [Placeable] content.
+         *   [zIndex] will be drawn on top of all the children with smaller [zIndex]. When children
+         *   have the same [zIndex] the order in which the items were placed is used.
+         * @param layerBlock You can configure any layer property available on [GraphicsLayerScope]
+         *   via this block. If the [Placeable] will be placed with a new [x] or [y] next time only
+         *   the graphic layer will be moved without requiring to redrawn the [Placeable] content.
          */
         fun Placeable.placeRelativeWithLayer(
             x: Int,
@@ -313,18 +299,17 @@
 
         /**
          * Place a [Placeable] at [x], [y] in its parent's coordinate system with an introduced
-         * graphic layer.
-         * Unlike [placeRelative], the given position will not implicitly react in RTL layout direction
-         * contexts.
+         * graphic layer. Unlike [placeRelative], the given position will not implicitly react in
+         * RTL layout direction contexts.
          *
          * @param x x coordinate in the parent's coordinate system.
          * @param y y coordinate in the parent's coordinate system.
          * @param zIndex controls the drawing order for the [Placeable]. A [Placeable] with larger
-         * [zIndex] will be drawn on top of all the children with smaller [zIndex]. When children
-         * have the same [zIndex] the order in which the items were placed is used.
-         * @param layerBlock You can configure any layer property available on [GraphicsLayerScope] via
-         * this block. If the [Placeable] will be placed with a new [x] or [y] next time only the
-         * graphic layer will be moved without requiring to redrawn the [Placeable] content.
+         *   [zIndex] will be drawn on top of all the children with smaller [zIndex]. When children
+         *   have the same [zIndex] the order in which the items were placed is used.
+         * @param layerBlock You can configure any layer property available on [GraphicsLayerScope]
+         *   via this block. If the [Placeable] will be placed with a new [x] or [y] next time only
+         *   the graphic layer will be moved without requiring to redrawn the [Placeable] content.
          */
         fun Placeable.placeWithLayer(
             x: Int,
@@ -335,17 +320,16 @@
 
         /**
          * Place a [Placeable] at [position] in its parent's coordinate system with an introduced
-         * graphic layer.
-         * Unlike [placeRelative], the given [position] will not implicitly react in RTL layout direction
-         * contexts.
+         * graphic layer. Unlike [placeRelative], the given [position] will not implicitly react in
+         * RTL layout direction contexts.
          *
          * @param position position in the parent's coordinate system.
          * @param zIndex controls the drawing order for the [Placeable]. A [Placeable] with larger
-         * [zIndex] will be drawn on top of all the children with smaller [zIndex]. When children
-         * have the same [zIndex] the order in which the items were placed is used.
-         * @param layerBlock You can configure any layer property available on [GraphicsLayerScope] via
-         * this block. If the [Placeable] will be placed with a new [position] next time only the
-         * graphic layer will be moved without requiring to redrawn the [Placeable] content.
+         *   [zIndex] will be drawn on top of all the children with smaller [zIndex]. When children
+         *   have the same [zIndex] the order in which the items were placed is used.
+         * @param layerBlock You can configure any layer property available on [GraphicsLayerScope]
+         *   via this block. If the [Placeable] will be placed with a new [position] next time only
+         *   the graphic layer will be moved without requiring to redrawn the [Placeable] content.
          */
         fun Placeable.placeWithLayer(
             position: IntOffset,
@@ -355,18 +339,17 @@
 
         /**
          * Place a [Placeable] at [x], [y] in its parent's coordinate system with an introduced
-         * graphic layer.
-         * Unlike [placeRelative], the given position will not implicitly react in RTL layout direction
-         * contexts.
+         * graphic layer. Unlike [placeRelative], the given position will not implicitly react in
+         * RTL layout direction contexts.
          *
          * @param x x coordinate in the parent's coordinate system.
          * @param y y coordinate in the parent's coordinate system.
          * @param zIndex controls the drawing order for the [Placeable]. A [Placeable] with larger
-         * [zIndex] will be drawn on top of all the children with smaller [zIndex]. When children
-         * have the same [zIndex] the order in which the items were placed is used.
+         *   [zIndex] will be drawn on top of all the children with smaller [zIndex]. When children
+         *   have the same [zIndex] the order in which the items were placed is used.
          * @param layer [GraphicsLayer] to place this placeable with. If the [Placeable] will be
-         * placed with a new [x] or [y] next time only the graphic layer will be moved without
-         * requiring to redrawn the [Placeable] content.
+         *   placed with a new [x] or [y] next time only the graphic layer will be moved without
+         *   requiring to redrawn the [Placeable] content.
          */
         fun Placeable.placeWithLayer(
             x: Int,
@@ -377,17 +360,16 @@
 
         /**
          * Place a [Placeable] at [position] in its parent's coordinate system with an introduced
-         * graphic layer.
-         * Unlike [placeRelative], the given [position] will not implicitly react in RTL layout direction
-         * contexts.
+         * graphic layer. Unlike [placeRelative], the given [position] will not implicitly react in
+         * RTL layout direction contexts.
          *
          * @param position position in the parent's coordinate system.
          * @param zIndex controls the drawing order for the [Placeable]. A [Placeable] with larger
-         * [zIndex] will be drawn on top of all the children with smaller [zIndex]. When children
-         * have the same [zIndex] the order in which the items were placed is used.
+         *   [zIndex] will be drawn on top of all the children with smaller [zIndex]. When children
+         *   have the same [zIndex] the order in which the items were placed is used.
          * @param layer [GraphicsLayer] to place this placeable with. If the [Placeable] will be
-         * placed with a new [position] next time only the graphic layer will be moved without
-         * requiring to redrawn the [Placeable] content.
+         *   placed with a new [position] next time only the graphic layer will be moved without
+         *   requiring to redrawn the [Placeable] content.
          */
         fun Placeable.placeWithLayer(
             position: IntOffset,
@@ -397,22 +379,20 @@
 
         /**
          * Place a [Placeable] at [x], [y] in its parent's coordinate system with an introduced
-         * graphic layer.
-         * If the layout direction is right-to-left, the given position will be horizontally
-         * mirrored so that the position of the [Placeable] implicitly reacts to RTL layout
-         * direction contexts.
-         * If this method is used outside the [MeasureScope.layout] positioning block, the
-         * automatic position mirroring will not happen and the [Placeable] will be placed at the
-         * given position, similar to the [place] method.
+         * graphic layer. If the layout direction is right-to-left, the given position will be
+         * horizontally mirrored so that the position of the [Placeable] implicitly reacts to RTL
+         * layout direction contexts. If this method is used outside the [MeasureScope.layout]
+         * positioning block, the automatic position mirroring will not happen and the [Placeable]
+         * will be placed at the given position, similar to the [place] method.
          *
          * @param x x coordinate in the parent's coordinate system.
          * @param y y coordinate in the parent's coordinate system.
          * @param zIndex controls the drawing order for the [Placeable]. A [Placeable] with larger
-         * [zIndex] will be drawn on top of all the children with smaller [zIndex]. When children
-         * have the same [zIndex] the order in which the items were placed is used.
+         *   [zIndex] will be drawn on top of all the children with smaller [zIndex]. When children
+         *   have the same [zIndex] the order in which the items were placed is used.
          * @param layer [GraphicsLayer] to place this placeable with. If the [Placeable] will be
-         * placed with a new [x] or [y] next time only the graphic layer will be moved without
-         * requiring to redrawn the [Placeable] content.
+         *   placed with a new [x] or [y] next time only the graphic layer will be moved without
+         *   requiring to redrawn the [Placeable] content.
          */
         fun Placeable.placeRelativeWithLayer(
             x: Int,
@@ -423,21 +403,19 @@
 
         /**
          * Place a [Placeable] at [position] in its parent's coordinate system with an introduced
-         * graphic layer.
-         * If the layout direction is right-to-left, the given [position] will be horizontally
-         * mirrored so that the position of the [Placeable] implicitly reacts to RTL layout
-         * direction contexts.
-         * If this method is used outside the [MeasureScope.layout] positioning block, the
-         * automatic position mirroring will not happen and the [Placeable] will be placed at the
-         * given [position], similar to the [place] method.
+         * graphic layer. If the layout direction is right-to-left, the given [position] will be
+         * horizontally mirrored so that the position of the [Placeable] implicitly reacts to RTL
+         * layout direction contexts. If this method is used outside the [MeasureScope.layout]
+         * positioning block, the automatic position mirroring will not happen and the [Placeable]
+         * will be placed at the given [position], similar to the [place] method.
          *
          * @param position position in the parent's coordinate system.
          * @param zIndex controls the drawing order for the [Placeable]. A [Placeable] with larger
-         * [zIndex] will be drawn on top of all the children with smaller [zIndex]. When children
-         * have the same [zIndex] the order in which the items were placed is used.
+         *   [zIndex] will be drawn on top of all the children with smaller [zIndex]. When children
+         *   have the same [zIndex] the order in which the items were placed is used.
          * @param layer [GraphicsLayer] to place this placeable with. If the [Placeable] will be
-         * placed with a new [position] next time only the graphic layer will be moved without
-         * requiring to redrawn the [Placeable] content.
+         *   placed with a new [position] next time only the graphic layer will be moved without
+         *   requiring to redrawn the [Placeable] content.
          */
         fun Placeable.placeRelativeWithLayer(
             position: IntOffset,
@@ -539,26 +517,20 @@
     }
 }
 
-/**
- * Block on [GraphicsLayerScope] which applies the default layer parameters.
- */
+/** Block on [GraphicsLayerScope] which applies the default layer parameters. */
 private val DefaultLayerBlock: GraphicsLayerScope.() -> Unit = {}
 
 private val DefaultConstraints = Constraints()
 
 internal fun PlacementScope(
     lookaheadCapablePlaceable: LookaheadCapablePlaceable
-): Placeable.PlacementScope =
-    LookaheadCapablePlacementScope(lookaheadCapablePlaceable)
+): Placeable.PlacementScope = LookaheadCapablePlacementScope(lookaheadCapablePlaceable)
 
 internal fun PlacementScope(owner: Owner): Placeable.PlacementScope = OuterPlacementScope(owner)
 
-/**
- * PlacementScope used by almost all parts of Compose.
- */
-private class LookaheadCapablePlacementScope(
-    private val within: LookaheadCapablePlaceable
-) : Placeable.PlacementScope() {
+/** PlacementScope used by almost all parts of Compose. */
+private class LookaheadCapablePlacementScope(private val within: LookaheadCapablePlaceable) :
+    Placeable.PlacementScope() {
     override val parentWidth: Int
         get() = within.measuredWidth
 
@@ -580,9 +552,7 @@
         within.findRulerValue(this, defaultValue)
 }
 
-/**
- * The PlacementScope that is used at the root of the compose layout hierarchy.
- */
+/** The PlacementScope that is used at the root of the compose layout hierarchy. */
 private class OuterPlacementScope(val owner: Owner) : Placeable.PlacementScope() {
     override val parentWidth: Int
         get() = owner.root.width
diff --git a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/layout/PlacementScopeMarker.kt b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/layout/PlacementScopeMarker.kt
index 4ad7aec..1273877 100644
--- a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/layout/PlacementScopeMarker.kt
+++ b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/layout/PlacementScopeMarker.kt
@@ -15,5 +15,4 @@
  */
 package androidx.compose.ui.layout
 
-@DslMarker
-annotation class PlacementScopeMarker
+@DslMarker annotation class PlacementScopeMarker
diff --git a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/layout/RemeasurementModifier.kt b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/layout/RemeasurementModifier.kt
index 4ca870e..1a39a50 100644
--- a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/layout/RemeasurementModifier.kt
+++ b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/layout/RemeasurementModifier.kt
@@ -20,8 +20,8 @@
 import androidx.compose.ui.internal.JvmDefaultWithCompatibility
 
 /**
- * A [Modifier.Element] that provides a [Remeasurement] object associated with the layout node
- * the modifier is applied to.
+ * A [Modifier.Element] that provides a [Remeasurement] object associated with the layout node the
+ * modifier is applied to.
  */
 @JvmDefaultWithCompatibility
 interface RemeasurementModifier : Modifier.Element {
@@ -29,15 +29,15 @@
      * This method is executed when the modifier is attached to the layout node.
      *
      * @param remeasurement [Remeasurement] object associated with the layout node the modifier is
-     * applied to.
+     *   applied to.
      */
     fun onRemeasurementAvailable(remeasurement: Remeasurement)
 }
 
 /**
  * This object is associated with a layout node and allows to execute some extra measure/layout
- * actions which are needed for some complex layouts. In most cases you don't need it as
- * measuring and layout should be correctly working automatically for most cases.
+ * actions which are needed for some complex layouts. In most cases you don't need it as measuring
+ * and layout should be correctly working automatically for most cases.
  */
 interface Remeasurement {
     /**
diff --git a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/layout/RootMeasurePolicy.kt b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/layout/RootMeasurePolicy.kt
index 7c76766..5752aa8b 100644
--- a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/layout/RootMeasurePolicy.kt
+++ b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/layout/RootMeasurePolicy.kt
@@ -23,9 +23,8 @@
 import androidx.compose.ui.util.fastForEach
 import androidx.compose.ui.util.fastMap
 
-internal object RootMeasurePolicy : LayoutNode.NoIntrinsicsMeasurePolicy(
-    "Undefined intrinsics block and it is required"
-) {
+internal object RootMeasurePolicy :
+    LayoutNode.NoIntrinsicsMeasurePolicy("Undefined intrinsics block and it is required") {
     override fun MeasureScope.measure(
         measurables: List<Measurable>,
         constraints: Constraints
@@ -44,9 +43,7 @@
                 }
             }
             else -> {
-                val placeables = measurables.fastMap {
-                    it.measure(constraints)
-                }
+                val placeables = measurables.fastMap { it.measure(constraints) }
                 var maxWidth = 0
                 var maxHeight = 0
                 placeables.fastForEach { placeable ->
@@ -57,9 +54,7 @@
                     constraints.constrainWidth(maxWidth),
                     constraints.constrainHeight(maxHeight)
                 ) {
-                    placeables.fastForEach { placeable ->
-                        placeable.placeRelativeWithLayer(0, 0)
-                    }
+                    placeables.fastForEach { placeable -> placeable.placeRelativeWithLayer(0, 0) }
                 }
             }
         }
diff --git a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/layout/Ruler.kt b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/layout/Ruler.kt
index 413e5564..a7c2715 100644
--- a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/layout/Ruler.kt
+++ b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/layout/Ruler.kt
@@ -38,10 +38,10 @@
 }
 
 /**
- * A vertical [Ruler]. Defines a line that can be used by parent layouts
- * to align or position their children horizontally. The position of the ruler
- * can be retrieved with [Placeable.PlacementScope.current] and can be set with
- * [MeasureScope.layout] using [RulerScope.provides] or [RulerScope.providesRelative].
+ * A vertical [Ruler]. Defines a line that can be used by parent layouts to align or position their
+ * children horizontally. The position of the ruler can be retrieved with
+ * [Placeable.PlacementScope.current] and can be set with [MeasureScope.layout] using
+ * [RulerScope.provides] or [RulerScope.providesRelative].
  */
 class VerticalRuler() : Ruler() {
     override fun calculateCoordinate(
@@ -55,10 +55,10 @@
 }
 
 /**
- * A horizontal [Ruler]. Defines a line that can be used by parent layouts
- * to align or position their children vertically. The position of the ruler
- * can be retrieved with [Placeable.PlacementScope.current] and can be set with
- * [MeasureScope.layout] using [RulerScope.provides].
+ * A horizontal [Ruler]. Defines a line that can be used by parent layouts to align or position
+ * their children vertically. The position of the ruler can be retrieved with
+ * [Placeable.PlacementScope.current] and can be set with [MeasureScope.layout] using
+ * [RulerScope.provides].
  */
 class HorizontalRuler : Ruler() {
     override fun calculateCoordinate(
diff --git a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/layout/ScaleFactor.kt b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/layout/ScaleFactor.kt
index 3ea416f..e8db3e5 100644
--- a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/layout/ScaleFactor.kt
+++ b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/layout/ScaleFactor.kt
@@ -25,22 +25,15 @@
 import androidx.compose.ui.util.unpackFloat1
 import androidx.compose.ui.util.unpackFloat2
 
-/**
- * Constructs a [ScaleFactor] from the given x and y scale values
- */
-@Stable
-fun ScaleFactor(scaleX: Float, scaleY: Float) = ScaleFactor(packFloats(scaleX, scaleY))
+/** Constructs a [ScaleFactor] from the given x and y scale values */
+@Stable fun ScaleFactor(scaleX: Float, scaleY: Float) = ScaleFactor(packFloats(scaleX, scaleY))
 
-/**
- * Holds 2 dimensional scaling factors for horizontal and vertical axes
- */
+/** Holds 2 dimensional scaling factors for horizontal and vertical axes */
 @Immutable
 @kotlin.jvm.JvmInline
 value class ScaleFactor internal constructor(@PublishedApi internal val packedValue: Long) {
 
-    /**
-     * Returns the scale factor to apply along the horizontal axis
-     */
+    /** Returns the scale factor to apply along the horizontal axis */
     @Stable
     val scaleX: Float
         get() {
@@ -52,9 +45,7 @@
             return unpackFloat1(packedValue)
         }
 
-    /**
-     * Returns the scale factor to apply along the vertical axis
-     */
+    /** Returns the scale factor to apply along the vertical axis */
     @Stable
     val scaleY: Float
         get() {
@@ -66,17 +57,13 @@
             return unpackFloat2(packedValue)
         }
 
-    @Suppress("NOTHING_TO_INLINE")
-    @Stable
-    inline operator fun component1(): Float = scaleX
+    @Suppress("NOTHING_TO_INLINE") @Stable inline operator fun component1(): Float = scaleX
 
-    @Suppress("NOTHING_TO_INLINE")
-    @Stable
-    inline operator fun component2(): Float = scaleY
+    @Suppress("NOTHING_TO_INLINE") @Stable inline operator fun component2(): Float = scaleY
 
     /**
-     * Returns a copy of this ScaleFactor instance optionally overriding the
-     * scaleX or scaleY parameters
+     * Returns a copy of this ScaleFactor instance optionally overriding the scaleX or scaleY
+     * parameters
      */
     fun copy(scaleX: Float = this.scaleX, scaleY: Float = this.scaleY) = ScaleFactor(scaleX, scaleY)
 
@@ -85,16 +72,14 @@
      *
      * Returns a [ScaleFactor] with scale x and y values multiplied by the operand
      */
-    @Stable
-    operator fun times(operand: Float) = ScaleFactor(scaleX * operand, scaleY * operand)
+    @Stable operator fun times(operand: Float) = ScaleFactor(scaleX * operand, scaleY * operand)
 
     /**
      * Division operator.
      *
      * Returns a [ScaleFactor] with scale x and y values divided by the operand
      */
-    @Stable
-    operator fun div(operand: Float) = ScaleFactor(scaleX / operand, scaleY / operand)
+    @Stable operator fun div(operand: Float) = ScaleFactor(scaleX / operand, scaleY / operand)
 
     override fun toString() = "ScaleFactor(${scaleX.roundToTenths()}, ${scaleY.roundToTenths()})"
 
@@ -102,11 +87,10 @@
 
         /**
          * A ScaleFactor whose [scaleX] and [scaleY] parameters are unspecified. This is a sentinel
-         * value used to initialize a non-null parameter.
-         * Access to scaleX or scaleY on an unspecified size is not allowed
+         * value used to initialize a non-null parameter. Access to scaleX or scaleY on an
+         * unspecified size is not allowed
          */
-        @Stable
-        val Unspecified = ScaleFactor(Float.NaN, Float.NaN)
+        @Stable val Unspecified = ScaleFactor(Float.NaN, Float.NaN)
     }
 }
 
@@ -115,31 +99,28 @@
     val decimal = shifted - shifted.toInt()
     // Kotlin's round operator rounds 0.5f down to 0. Manually compare against
     // 0.5f and round up if necessary
-    val roundedShifted = if (decimal >= 0.5f) {
-        shifted.toInt() + 1
-    } else {
-        shifted.toInt()
-    }
+    val roundedShifted =
+        if (decimal >= 0.5f) {
+            shifted.toInt() + 1
+        } else {
+            shifted.toInt()
+        }
     return roundedShifted.toFloat() / 10
 }
 
-/**
- * `false` when this is [ScaleFactor.Unspecified].
- */
+/** `false` when this is [ScaleFactor.Unspecified]. */
 @Stable
 inline val ScaleFactor.isSpecified: Boolean
     get() = packedValue != ScaleFactor.Unspecified.packedValue
 
-/**
- * `true` when this is [ScaleFactor.Unspecified].
- */
+/** `true` when this is [ScaleFactor.Unspecified]. */
 @Stable
 inline val ScaleFactor.isUnspecified: Boolean
     get() = packedValue == ScaleFactor.Unspecified.packedValue
 
 /**
- * If this [ScaleFactor] [isSpecified] then this is returned, otherwise [block] is executed
- * and its result is returned.
+ * If this [ScaleFactor] [isSpecified] then this is returned, otherwise [block] is executed and its
+ * result is returned.
  */
 inline fun ScaleFactor.takeOrElse(block: () -> ScaleFactor): ScaleFactor =
     if (isSpecified) this else block()
@@ -155,14 +136,13 @@
     Size(this.width * scaleFactor.scaleX, this.height * scaleFactor.scaleY)
 
 /**
- * Multiplication operator with [Size] with reverse parameter types to maintain
- * commutative properties of multiplication
+ * Multiplication operator with [Size] with reverse parameter types to maintain commutative
+ * properties of multiplication
  *
  * Return a new [Size] with the width and height multiplied by the [ScaleFactor.scaleX] and
  * [ScaleFactor.scaleY] respectively
  */
-@Stable
-operator fun ScaleFactor.times(size: Size): Size = size * this
+@Stable operator fun ScaleFactor.times(size: Size): Size = size * this
 
 /**
  * Division operator with [Size]
@@ -177,17 +157,15 @@
 /**
  * Linearly interpolate between two [ScaleFactor] parameters
  *
- * The [fraction] argument represents position on the timeline, with 0.0 meaning
- * that the interpolation has not started, returning [start] (or something
- * equivalent to [start]), 1.0 meaning that the interpolation has finished,
- * returning [stop] (or something equivalent to [stop]), and values in between
- * meaning that the interpolation is at the relevant point on the timeline
- * between [start] and [stop]. The interpolation can be extrapolated beyond 0.0 and
- * 1.0, so negative values and values greater than 1.0 are valid (and can
- * easily be generated by curves).
+ * The [fraction] argument represents position on the timeline, with 0.0 meaning that the
+ * interpolation has not started, returning [start] (or something equivalent to [start]), 1.0
+ * meaning that the interpolation has finished, returning [stop] (or something equivalent to
+ * [stop]), and values in between meaning that the interpolation is at the relevant point on the
+ * timeline between [start] and [stop]. The interpolation can be extrapolated beyond 0.0 and 1.0, so
+ * negative values and values greater than 1.0 are valid (and can easily be generated by curves).
  *
- * Values for [fraction] are usually obtained from an [Animation<Float>], such as
- * an `AnimationController`.
+ * Values for [fraction] are usually obtained from an [Animation<Float>], such as an
+ * `AnimationController`.
  */
 @Stable
 fun lerp(start: ScaleFactor, stop: ScaleFactor, fraction: Float): ScaleFactor {
diff --git a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/layout/SubcomposeLayout.kt b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/layout/SubcomposeLayout.kt
index b72e48b..f90fccf 100644
--- a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/layout/SubcomposeLayout.kt
+++ b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/layout/SubcomposeLayout.kt
@@ -54,18 +54,18 @@
 import androidx.compose.ui.util.fastForEach
 
 /**
- * Analogue of [Layout] which allows to subcompose the actual content during the measuring stage
- * for example to use the values calculated during the measurement as params for the composition
- * of the children.
+ * Analogue of [Layout] which allows to subcompose the actual content during the measuring stage for
+ * example to use the values calculated during the measurement as params for the composition of the
+ * children.
  *
  * Possible use cases:
  * * You need to know the constraints passed by the parent during the composition and can't solve
- * your use case with just custom [Layout] or [LayoutModifier].
- * See [androidx.compose.foundation.layout.BoxWithConstraints].
+ *   your use case with just custom [Layout] or [LayoutModifier]. See
+ *   [androidx.compose.foundation.layout.BoxWithConstraints].
  * * You want to use the size of one child during the composition of the second child.
- * * You want to compose your items lazily based on the available size. For example you have a
- * list of 100 items and instead of composing all of them you only compose the ones which are
- * currently visible(say 5 of them) and compose next items when the component is scrolled.
+ * * You want to compose your items lazily based on the available size. For example you have a list
+ *   of 100 items and instead of composing all of them you only compose the ones which are currently
+ *   visible(say 5 of them) and compose next items when the component is scrolled.
  *
  * @sample androidx.compose.ui.samples.SubcomposeLayoutSample
  *
@@ -85,18 +85,18 @@
 }
 
 /**
- * Analogue of [Layout] which allows to subcompose the actual content during the measuring stage
- * for example to use the values calculated during the measurement as params for the composition
- * of the children.
+ * Analogue of [Layout] which allows to subcompose the actual content during the measuring stage for
+ * example to use the values calculated during the measurement as params for the composition of the
+ * children.
  *
  * Possible use cases:
  * * You need to know the constraints passed by the parent during the composition and can't solve
- * your use case with just custom [Layout] or [LayoutModifier].
- * See [androidx.compose.foundation.layout.BoxWithConstraints].
+ *   your use case with just custom [Layout] or [LayoutModifier]. See
+ *   [androidx.compose.foundation.layout.BoxWithConstraints].
  * * You want to use the size of one child during the composition of the second child.
- * * You want to compose your items lazily based on the available size. For example you have a
- * list of 100 items and instead of composing all of them you only compose the ones which are
- * currently visible(say 5 of them) and compose next items when the component is scrolled.
+ * * You want to compose your items lazily based on the available size. For example you have a list
+ *   of 100 items and instead of composing all of them you only compose the ones which are currently
+ *   visible(say 5 of them) and compose next items when the component is scrolled.
  *
  * @sample androidx.compose.ui.samples.SubcomposeLayoutSample
  *
@@ -123,14 +123,11 @@
             set(measurePolicy, state.setMeasurePolicy)
             set(localMap, SetResolvedCompositionLocals)
             set(materialized, SetModifier)
-            @OptIn(ExperimentalComposeUiApi::class)
-            set(compositeKeyHash, SetCompositeKeyHash)
+            @OptIn(ExperimentalComposeUiApi::class) set(compositeKeyHash, SetCompositeKeyHash)
         }
     )
     if (!currentComposer.skipping) {
-        SideEffect {
-            state.forceRecomposeChildren()
-        }
+        SideEffect { state.forceRecomposeChildren() }
     }
 }
 
@@ -143,17 +140,17 @@
      * Performs subcomposition of the provided [content] with given [slotId].
      *
      * @param slotId unique id which represents the slot we are composing into. If you have fixed
-     * amount or slots you can use enums as slot ids, or if you have a list of items maybe an
-     * index in the list or some other unique key can work. To be able to correctly match the
-     * content between remeasures you should provide the object which is equals to the one you
-     * used during the previous measuring.
-     * @param content the composable content which defines the slot. It could emit multiple
-     * layouts, in this case the returned list of [Measurable]s will have multiple elements.
-     * **Note:** When a [SubcomposeLayout] is in a [LookaheadScope], the subcomposition only
-     * happens during the lookahead pass. In the post-lookahead/main pass, [subcompose] will
-     * return the list of [Measurable]s that were subcomposed during the lookahead pass. If the
-     * structure of the subtree emitted from [content] is dependent on incoming constraints,
-     * consider using constraints received from the lookahead pass for both passes.
+     *   amount or slots you can use enums as slot ids, or if you have a list of items maybe an
+     *   index in the list or some other unique key can work. To be able to correctly match the
+     *   content between remeasures you should provide the object which is equals to the one you
+     *   used during the previous measuring.
+     * @param content the composable content which defines the slot. It could emit multiple layouts,
+     *   in this case the returned list of [Measurable]s will have multiple elements. **Note:** When
+     *   a [SubcomposeLayout] is in a [LookaheadScope], the subcomposition only happens during the
+     *   lookahead pass. In the post-lookahead/main pass, [subcompose] will return the list of
+     *   [Measurable]s that were subcomposed during the lookahead pass. If the structure of the
+     *   subtree emitted from [content] is dependent on incoming constraints, consider using
+     *   constraints received from the lookahead pass for both passes.
      */
     fun subcompose(slotId: Any?, content: @Composable () -> Unit): List<Measurable>
 }
@@ -163,21 +160,17 @@
  *
  * [slotReusePolicy] the policy defining what slots should be retained to be reused later.
  */
-class SubcomposeLayoutState(
-    private val slotReusePolicy: SubcomposeSlotReusePolicy
-) {
-    /**
-     * State used by [SubcomposeLayout].
-     */
+class SubcomposeLayoutState(private val slotReusePolicy: SubcomposeSlotReusePolicy) {
+    /** State used by [SubcomposeLayout]. */
     constructor() : this(NoOpSubcomposeSlotReusePolicy)
 
     /**
      * State used by [SubcomposeLayout].
      *
      * @param maxSlotsToRetainForReuse when non-zero the layout will keep active up to this count
-     * slots which we were used but not used anymore instead of disposing them. Later when you try to
-     * compose a new slot instead of creating a completely new slot the layout would reuse the
-     * previous slot which allows to do less work especially if the slot contents are similar.
+     *   slots which we were used but not used anymore instead of disposing them. Later when you try
+     *   to compose a new slot instead of creating a completely new slot the layout would reuse the
+     *   previous slot which allows to do less work especially if the slot contents are similar.
      */
     @Deprecated(
         "This constructor is deprecated",
@@ -186,39 +179,41 @@
             "androidx.compose.ui.layout.SubcomposeSlotReusePolicy"
         )
     )
-    constructor(maxSlotsToRetainForReuse: Int) : this(
-        SubcomposeSlotReusePolicy(maxSlotsToRetainForReuse)
-    )
+    constructor(
+        maxSlotsToRetainForReuse: Int
+    ) : this(SubcomposeSlotReusePolicy(maxSlotsToRetainForReuse))
 
     private var _state: LayoutNodeSubcompositionsState? = null
     private val state: LayoutNodeSubcompositionsState
-        get() = requireNotNull(_state) {
-            "SubcomposeLayoutState is not attached to SubcomposeLayout"
-        }
+        get() =
+            requireNotNull(_state) { "SubcomposeLayoutState is not attached to SubcomposeLayout" }
 
     // Pre-allocated lambdas to update LayoutNode
     internal val setRoot: LayoutNode.(SubcomposeLayoutState) -> Unit = {
         _state =
-            subcompositionsState ?: LayoutNodeSubcompositionsState(this, slotReusePolicy).also {
-                subcompositionsState = it
-            }
+            subcompositionsState
+                ?: LayoutNodeSubcompositionsState(this, slotReusePolicy).also {
+                    subcompositionsState = it
+                }
         state.makeSureStateIsConsistent()
         state.slotReusePolicy = slotReusePolicy
     }
-    internal val setCompositionContext:
-        LayoutNode.(CompositionContext) -> Unit =
-        { state.compositionContext = it }
+    internal val setCompositionContext: LayoutNode.(CompositionContext) -> Unit = {
+        state.compositionContext = it
+    }
     internal val setMeasurePolicy:
         LayoutNode.((SubcomposeMeasureScope.(Constraints) -> MeasureResult)) -> Unit =
-        { measurePolicy = state.createMeasurePolicy(it) }
+        {
+            measurePolicy = state.createMeasurePolicy(it)
+        }
 
     /**
      * Composes the content for the given [slotId]. This makes the next scope.subcompose(slotId)
      * call during the measure pass faster as the content is already composed.
      *
      * If the [slotId] was precomposed already but after the future calculations ended up to not be
-     * needed anymore (meaning this slotId is not going to be used during the measure pass
-     * anytime soon) you can use [PrecomposedSlotHandle.dispose] on a returned object to dispose the
+     * needed anymore (meaning this slotId is not going to be used during the measure pass anytime
+     * soon) you can use [PrecomposedSlotHandle.dispose] on a returned object to dispose the
      * content.
      *
      * @param slotId unique id which represents the slot we are composing into.
@@ -230,27 +225,24 @@
 
     internal fun forceRecomposeChildren() = state.forceRecomposeChildren()
 
-    /**
-     * Instance of this interface is returned by [precompose] function.
-     */
+    /** Instance of this interface is returned by [precompose] function. */
     interface PrecomposedSlotHandle {
 
         /**
-         * This function allows to dispose the content for the slot which was precomposed
-         * previously via [precompose].
+         * This function allows to dispose the content for the slot which was precomposed previously
+         * via [precompose].
          *
          * If this slot was already used during the regular measure pass via
          * [SubcomposeMeasureScope.subcompose] this function will do nothing.
          *
-         * This could be useful if after the future calculations this item is not anymore expected to
-         * be used during the measure pass anytime soon.
+         * This could be useful if after the future calculations this item is not anymore expected
+         * to be used during the measure pass anytime soon.
          */
         fun dispose()
 
-        /**
-         * The amount of placeables composed into this slot.
-         */
-        val placeablesCount: Int get() = 0
+        /** The amount of placeables composed into this slot. */
+        val placeablesCount: Int
+            get() = 0
 
         /**
          * Performs synchronous measure of the placeable at the given [index].
@@ -267,18 +259,15 @@
          * See [androidx.compose.ui.node.traverseDescendants] for the complete semantics of this
          * function.
          */
-        fun traverseDescendants(
-            key: Any?,
-            block: (TraversableNode) -> TraverseDescendantsAction
-        ) {}
+        fun traverseDescendants(key: Any?, block: (TraversableNode) -> TraverseDescendantsAction) {}
     }
 }
 
 /**
- * This policy allows [SubcomposeLayout] to retain some of slots which we were used but not
- * used anymore instead of disposing them. Next time when you try to compose a new slot instead of
- * creating a completely new slot the layout would reuse the kept slot. This allows to do less
- * work especially if the slot contents are similar.
+ * This policy allows [SubcomposeLayout] to retain some of slots which we were used but not used
+ * anymore instead of disposing them. Next time when you try to compose a new slot instead of
+ * creating a completely new slot the layout would reuse the kept slot. This allows to do less work
+ * especially if the slot contents are similar.
  */
 interface SubcomposeSlotReusePolicy {
     /**
@@ -288,9 +277,9 @@
     fun getSlotsToRetain(slotIds: SlotIdsSet)
 
     /**
-     * Returns true if the content previously composed with [reusableSlotId] is compatible with
-     * the content which is going to be composed for [slotId].
-     * Slots could be considered incompatible if they display completely different types of the UI.
+     * Returns true if the content previously composed with [reusableSlotId] is compatible with the
+     * content which is going to be composed for [slotId]. Slots could be considered incompatible if
+     * they display completely different types of the UI.
      */
     fun areCompatible(slotId: Any?, reusableSlotId: Any?): Boolean
 
@@ -299,9 +288,8 @@
      *
      * This class works exactly as [MutableSet], but doesn't allow to add new items in it.
      */
-    class SlotIdsSet internal constructor(
-        private val set: MutableSet<Any?> = mutableSetOf()
-    ) : Collection<Any?> by set {
+    class SlotIdsSet internal constructor(private val set: MutableSet<Any?> = mutableSetOf()) :
+        Collection<Any?> by set {
 
         internal fun add(slotId: Any?) = set.add(slotId)
 
@@ -342,9 +330,7 @@
          */
         fun retainAll(predicate: (Any?) -> Boolean): Boolean = set.retainAll(predicate)
 
-        /**
-         * Removes all slot ids from this set.
-         */
+        /** Removes all slot ids from this set. */
         fun clear() = set.clear()
     }
 }
@@ -358,13 +344,13 @@
     FixedCountSubcomposeSlotReusePolicy(maxSlotsToRetainForReuse)
 
 /**
- * The inner state containing all the information about active slots and their compositions.
- * It is stored inside LayoutNode object as in fact we need to keep 1-1 mapping between this state
- * and the node: when we compose a slot we first create a virtual LayoutNode child to this node
- * and then save the extra information inside this state.
- * Keeping this state inside LayoutNode also helps us to retain the pool of reusable slots even
- * when a new SubcomposeLayoutState is applied to SubcomposeLayout and even when the
- * SubcomposeLayout's LayoutNode is reused via the ReusableComposeNode mechanism.
+ * The inner state containing all the information about active slots and their compositions. It is
+ * stored inside LayoutNode object as in fact we need to keep 1-1 mapping between this state and the
+ * node: when we compose a slot we first create a virtual LayoutNode child to this node and then
+ * save the extra information inside this state. Keeping this state inside LayoutNode also helps us
+ * to retain the pool of reusable slots even when a new SubcomposeLayoutState is applied to
+ * SubcomposeLayout and even when the SubcomposeLayout's LayoutNode is reused via the
+ * ReusableComposeNode mechanism.
  */
 internal class LayoutNodeSubcompositionsState(
     private val root: LayoutNode,
@@ -402,11 +388,11 @@
     /**
      * `root.foldedChildren` list consist of:
      * 1) all the active children (used during the last measure pass)
-     * 2) `reusableCount` nodes in the middle of the list which were active and stopped being
-     * used. now we keep them (up to `maxCountOfSlotsToReuse`) in order to reuse next time we
-     * will need to compose a new item
-     * 4) `precomposedCount` nodes in the end of the list which were precomposed and
-     * are waiting to be used during the next measure passes.
+     * 2) `reusableCount` nodes in the middle of the list which were active and stopped being used.
+     *    now we keep them (up to `maxCountOfSlotsToReuse`) in order to reuse next time we will need
+     *    to compose a new item
+     * 4) `precomposedCount` nodes in the end of the list which were precomposed and are waiting to
+     *    be used during the next measure passes.
      */
     private var reusableCount = 0
     private var precomposedCount = 0
@@ -427,25 +413,25 @@
         makeSureStateIsConsistent()
         val layoutState = root.layoutState
         checkPrecondition(
-            layoutState == LayoutState.Measuring || layoutState == LayoutState.LayingOut ||
+            layoutState == LayoutState.Measuring ||
+                layoutState == LayoutState.LayingOut ||
                 layoutState == LayoutState.LookaheadMeasuring ||
                 layoutState == LayoutState.LookaheadLayingOut
         ) {
             "subcompose can only be used inside the measure or layout blocks"
         }
 
-        val node = slotIdToNode.getOrPut(slotId) {
-            val precomposed = precomposeMap.remove(slotId)
-            if (precomposed != null) {
-                @Suppress("ExceptionMessage")
-                checkPrecondition(precomposedCount > 0)
-                precomposedCount--
-                precomposed
-            } else {
-                takeNodeFromReusables(slotId)
-                    ?: createNodeAt(currentIndex)
+        val node =
+            slotIdToNode.getOrPut(slotId) {
+                val precomposed = precomposeMap.remove(slotId)
+                if (precomposed != null) {
+                    @Suppress("ExceptionMessage") checkPrecondition(precomposedCount > 0)
+                    precomposedCount--
+                    precomposed
+                } else {
+                    takeNodeFromReusables(slotId) ?: createNodeAt(currentIndex)
+                }
             }
-        }
 
         if (root.foldedChildren.getOrNull(currentIndex) !== node) {
             // the node has a new index in the list
@@ -470,9 +456,7 @@
     }
 
     private fun subcompose(node: LayoutNode, slotId: Any?, content: @Composable () -> Unit) {
-        val nodeState = nodeToNodeState.getOrPut(node) {
-            NodeState(slotId, {})
-        }
+        val nodeState = nodeToNodeState.getOrPut(node) { NodeState(slotId, {}) }
         val hasPendingChanges = nodeState.composition?.hasInvalidations ?: true
         if (nodeState.content !== content || hasPendingChanges || nodeState.forceRecompose) {
             nodeState.content = content
@@ -485,15 +469,15 @@
         Snapshot.withoutReadObservation {
             ignoreRemeasureRequests {
                 val content = nodeState.content
-                nodeState.composition = subcomposeInto(
-                    existing = nodeState.composition,
-                    container = node,
-                    parent = compositionContext ?: error("parent composition reference not set"),
-                    reuseContent = nodeState.forceReuse,
-                    composable = {
-                        ReusableContentHost(nodeState.active, content)
-                    }
-                )
+                nodeState.composition =
+                    subcomposeInto(
+                        existing = nodeState.composition,
+                        container = node,
+                        parent =
+                            compositionContext ?: error("parent composition reference not set"),
+                        reuseContent = nodeState.forceReuse,
+                        composable = { ReusableContentHost(nodeState.active, content) }
+                    )
                 nodeState.forceReuse = false
             }
         }
@@ -507,10 +491,10 @@
         composable: @Composable () -> Unit
     ): ReusableComposition {
         return if (existing == null || existing.isDisposed) {
-            createSubcomposition(container, parent)
-        } else {
-            existing
-        }
+                createSubcomposition(container, parent)
+            } else {
+                existing
+            }
             .apply {
                 if (!reuseContent) {
                     setContent(composable)
@@ -605,9 +589,7 @@
 
     private fun disposeCurrentNodes() {
         root.ignoreRemeasureRequests {
-            nodeToNodeState.values.forEach {
-                it.composition?.dispose()
-            }
+            nodeToNodeState.values.forEach { it.composition?.dispose() }
             root.removeAll()
         }
 
@@ -640,9 +622,7 @@
 
     private fun LayoutNode.resetLayoutState() {
         measurePassDelegate.measuredByParent = UsageByParent.NotUsed
-        lookaheadPassDelegate?.let {
-            it.measuredByParent = UsageByParent.NotUsed
-        }
+        lookaheadPassDelegate?.let { it.measuredByParent = UsageByParent.NotUsed }
     }
 
     private fun takeNodeFromReusables(slotId: Any?): LayoutNode? {
@@ -750,21 +730,23 @@
     private inline fun createMeasureResult(
         result: MeasureResult,
         crossinline placeChildrenBlock: () -> Unit
-    ) = object : MeasureResult by result {
-        override fun placeChildren() {
-            placeChildrenBlock()
+    ) =
+        object : MeasureResult by result {
+            override fun placeChildren() {
+                placeChildrenBlock()
+            }
         }
-    }
 
-    private val NoIntrinsicsMessage = "Asking for intrinsic measurements of SubcomposeLayout " +
-        "layouts is not supported. This includes components that are built on top of " +
-        "SubcomposeLayout, such as lazy lists, BoxWithConstraints, TabRow, etc. To mitigate " +
-        "this:\n" +
-        "- if intrinsic measurements are used to achieve 'match parent' sizing, consider " +
-        "replacing the parent of the component with a custom layout which controls the order in " +
-        "which children are measured, making intrinsic measurement not needed\n" +
-        "- adding a size modifier to the component, in order to fast return the queried " +
-        "intrinsic measurement."
+    private val NoIntrinsicsMessage =
+        "Asking for intrinsic measurements of SubcomposeLayout " +
+            "layouts is not supported. This includes components that are built on top of " +
+            "SubcomposeLayout, such as lazy lists, BoxWithConstraints, TabRow, etc. To mitigate " +
+            "this:\n" +
+            "- if intrinsic measurements are used to achieve 'match parent' sizing, consider " +
+            "replacing the parent of the component with a custom layout which controls the order in " +
+            "which children are measured, making intrinsic measurement not needed\n" +
+            "- adding a size modifier to the component, in order to fast return the queried " +
+            "intrinsic measurement."
 
     fun precompose(slotId: Any?, content: @Composable () -> Unit): PrecomposedSlotHandle {
         if (!root.isAttached) {
@@ -776,20 +758,19 @@
         if (!slotIdToNode.containsKey(slotId)) {
             // Yield ownership of PrecomposedHandle from postLookahead to the caller of precompose
             postLookaheadPrecomposeSlotHandleMap.remove(slotId)
-            val node = precomposeMap.getOrPut(slotId) {
-                val reusedNode = takeNodeFromReusables(slotId)
-                if (reusedNode != null) {
-                    // now move this node to the end where we keep precomposed items
-                    val nodeIndex = root.foldedChildren.indexOf(reusedNode)
-                    move(nodeIndex, root.foldedChildren.size, 1)
-                    precomposedCount++
-                    reusedNode
-                } else {
-                    createNodeAt(root.foldedChildren.size).also {
+            val node =
+                precomposeMap.getOrPut(slotId) {
+                    val reusedNode = takeNodeFromReusables(slotId)
+                    if (reusedNode != null) {
+                        // now move this node to the end where we keep precomposed items
+                        val nodeIndex = root.foldedChildren.indexOf(reusedNode)
+                        move(nodeIndex, root.foldedChildren.size, 1)
                         precomposedCount++
+                        reusedNode
+                    } else {
+                        createNodeAt(root.foldedChildren.size).also { precomposedCount++ }
                     }
                 }
-            }
             subcompose(node, slotId, content)
         }
         return object : PrecomposedSlotHandle {
@@ -844,9 +825,7 @@
         if (reusableCount != childCount) {
             // only invalidate children if there are any non-reused ones
             // in other cases, all of them are going to be invalidated later anyways
-            nodeToNodeState.forEach { (_, nodeState) ->
-                nodeState.forceRecompose = true
-            }
+            nodeToNodeState.forEach { (_, nodeState) -> nodeState.forceRecompose = true }
 
             if (!root.measurePending) {
                 root.requestRemeasure()
@@ -854,16 +833,13 @@
         }
     }
 
-    private fun createNodeAt(index: Int) = LayoutNode(isVirtual = true).also { node ->
-        ignoreRemeasureRequests {
-            root.insertAt(index, node)
+    private fun createNodeAt(index: Int) =
+        LayoutNode(isVirtual = true).also { node ->
+            ignoreRemeasureRequests { root.insertAt(index, node) }
         }
-    }
 
     private fun move(from: Int, to: Int, count: Int = 1) {
-        ignoreRemeasureRequests {
-            root.move(from, to, count)
-        }
+        ignoreRemeasureRequests { root.move(from, to, count) }
     }
 
     private inline fun ignoreRemeasureRequests(block: () -> Unit) =
@@ -879,7 +855,9 @@
         var activeState = mutableStateOf(true)
         var active: Boolean
             get() = activeState.value
-            set(value) { activeState.value = value }
+            set(value) {
+                activeState.value = value
+            }
     }
 
     private inner class Scope : SubcomposeMeasureScope {
@@ -888,8 +866,9 @@
         override var density: Float = 0f
         override var fontScale: Float = 0f
         override val isLookingAhead: Boolean
-            get() = root.layoutState == LayoutState.LookaheadLayingOut ||
-                root.layoutState == LayoutState.LookaheadMeasuring
+            get() =
+                root.layoutState == LayoutState.LookaheadLayingOut ||
+                    root.layoutState == LayoutState.LookaheadMeasuring
 
         override fun subcompose(slotId: Any?, content: @Composable () -> Unit) =
             this@LayoutNodeSubcompositionsState.subcompose(slotId, content)
@@ -905,10 +884,13 @@
             return object : MeasureResult {
                 override val width: Int
                     get() = width
+
                 override val height: Int
                     get() = height
+
                 override val alignmentLines: Map<AlignmentLine, Int>
                     get() = alignmentLines
+
                 override val rulers: (RulerScope.() -> Unit)?
                     get() = rulers
 
@@ -929,9 +911,9 @@
     private inner class PostLookaheadMeasureScopeImpl :
         SubcomposeMeasureScope, MeasureScope by scope {
         /**
-         * This function retrieves [Measurable]s created for [slotId] based on
-         * the subcomposition that happened in the lookahead pass. If [slotId] was not subcomposed
-         * in the lookahead pass, [subcompose] will return an [emptyList].
+         * This function retrieves [Measurable]s created for [slotId] based on the subcomposition
+         * that happened in the lookahead pass. If [slotId] was not subcomposed in the lookahead
+         * pass, [subcompose] will return an [emptyList].
          */
         override fun subcompose(slotId: Any?, content: @Composable () -> Unit): List<Measurable> {
             val measurables = slotIdToNode[slotId]?.childMeasurables
@@ -958,9 +940,7 @@
         currentPostLookaheadIndex++
         if (!precomposeMap.contains(slotId)) {
             // Not composed yet
-            precompose(slotId, content).also {
-                postLookaheadPrecomposeSlotHandleMap[slotId] = it
-            }
+            precompose(slotId, content).also { postLookaheadPrecomposeSlotHandleMap[slotId] = it }
             if (root.layoutState == LayoutState.LayingOut) {
                 root.requestLookaheadRelayout(true)
             } else {
@@ -976,13 +956,13 @@
     }
 }
 
-private val ReusedSlotId = object {
-    override fun toString(): String = "ReusedSlotId"
-}
+private val ReusedSlotId =
+    object {
+        override fun toString(): String = "ReusedSlotId"
+    }
 
-private class FixedCountSubcomposeSlotReusePolicy(
-    private val maxSlotsToRetainForReuse: Int
-) : SubcomposeSlotReusePolicy {
+private class FixedCountSubcomposeSlotReusePolicy(private val maxSlotsToRetainForReuse: Int) :
+    SubcomposeSlotReusePolicy {
 
     override fun getSlotsToRetain(slotIds: SubcomposeSlotReusePolicy.SlotIdsSet) {
         if (slotIds.size > maxSlotsToRetainForReuse) {
diff --git a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/layout/TestModifierUpdater.kt b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/layout/TestModifierUpdater.kt
index bc53f49..6dad752 100644
--- a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/layout/TestModifierUpdater.kt
+++ b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/layout/TestModifierUpdater.kt
@@ -56,8 +56,7 @@
         factory = LayoutNode.Constructor,
         update = {
             set(measurePolicy, SetMeasurePolicy)
-            @OptIn(ExperimentalComposeUiApi::class)
-            set(compositeKeyHash, SetCompositeKeyHash)
+            @OptIn(ExperimentalComposeUiApi::class) set(compositeKeyHash, SetCompositeKeyHash)
             init { onAttached(TestModifierUpdater(this)) }
         }
     )
diff --git a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/modifier/ModifierLocal.kt b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/modifier/ModifierLocal.kt
index 34662c8..84d1d28 100644
--- a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/modifier/ModifierLocal.kt
+++ b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/modifier/ModifierLocal.kt
@@ -26,10 +26,10 @@
  *
  * One must create a [ModifierLocal] instance, which can be referenced by consumers statically.
  * [ModifierLocal] instances themselves hold no data, and can be thought of as a type-safe
- * identifier for the data being passed to other modifiers to the right of the providing
- * modifier or down the tree. [ModifierLocal] factory functions take a single parameter: a
- * factory to create a default value in cases where a [ModifierLocal] is used without a Provider.
- * If this is a situation you would rather not handle, you can throw an error in this factory.
+ * identifier for the data being passed to other modifiers to the right of the providing modifier or
+ * down the tree. [ModifierLocal] factory functions take a single parameter: a factory to create a
+ * default value in cases where a [ModifierLocal] is used without a Provider. If this is a situation
+ * you would rather not handle, you can throw an error in this factory.
  *
  * To add a value that can be accessed by other modifiers, create an instance of a
  * [ProvidableModifierLocal] and add it to the tree by using a [modifierLocalProvider]. Now other
@@ -40,15 +40,14 @@
  * @see modifierLocalProvider
  * @see modifierLocalConsumer
  */
-@Stable
-sealed class ModifierLocal<T> constructor(internal val defaultFactory: () -> T)
+@Stable sealed class ModifierLocal<T> constructor(internal val defaultFactory: () -> T)
 
 /**
  * [ProvidableModifierLocal]s are [ModifierLocal]s that can be used to provide values using a
  * [ModifierLocalProvider].
  *
- * When you create an instance of a [ProvidableModifierLocal], and want to prevent users of
- * your library from providing new values but want to allow the values to be consumed, expose a
+ * When you create an instance of a [ProvidableModifierLocal], and want to prevent users of your
+ * library from providing new values but want to allow the values to be consumed, expose a
  * [ModifierLocal] instead.
  *
  * @see ModifierLocal
@@ -63,8 +62,8 @@
  * Creates a [ProvidableModifierLocal] and specifies a default factory.
  *
  * @param defaultFactory a factory to create a default value in cases where a [ModifierLocal] is
- * consumed without a Provider. If this is a situation you would rather not handle, you can throw
- * an error in this factory.
+ *   consumed without a Provider. If this is a situation you would rather not handle, you can throw
+ *   an error in this factory.
  *
  * Here are examples where a modifier can communicate with another in the same modifier chain:
  *
@@ -95,15 +94,15 @@
     ProvidableModifierLocal(defaultFactory)
 
 /**
- * This scope gives us access to modifier locals that are provided by other modifiers to the left
- * of this modifier, or above this modifier in the layout tree.
+ * This scope gives us access to modifier locals that are provided by other modifiers to the left of
+ * this modifier, or above this modifier in the layout tree.
  *
  * @see modifierLocalOf
  */
 interface ModifierLocalReadScope {
     /**
-     * Read a [ModifierLocal] that was provided by other modifiers to the left of this modifier,
-     * or above this modifier in the layout tree.
+     * Read a [ModifierLocal] that was provided by other modifiers to the left of this modifier, or
+     * above this modifier in the layout tree.
      */
     val <T> ModifierLocal<T>.current: T
 }
diff --git a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/modifier/ModifierLocalConsumer.kt b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/modifier/ModifierLocalConsumer.kt
index e7bb4b1..698c3c5 100644
--- a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/modifier/ModifierLocalConsumer.kt
+++ b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/modifier/ModifierLocalConsumer.kt
@@ -32,8 +32,8 @@
 @JvmDefaultWithCompatibility
 interface ModifierLocalConsumer : Modifier.Element {
     /**
-     * This function is called whenever one of the consumed values has changed.
-     * This could be called in response to the modifier being added, removed or re-ordered.
+     * This function is called whenever one of the consumed values has changed. This could be called
+     * in response to the modifier being added, removed or re-ordered.
      */
     fun onModifierLocalsUpdated(scope: ModifierLocalReadScope)
 }
diff --git a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/modifier/ModifierLocalManager.kt b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/modifier/ModifierLocalManager.kt
index 68e7866..fa99c21 100644
--- a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/modifier/ModifierLocalManager.kt
+++ b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/modifier/ModifierLocalManager.kt
@@ -32,9 +32,8 @@
  * ModiferLocalProviders get added/removed in the tree somewhere dynamically. This can be quite
  * costly, so we attempt to do this in a way where we don't waste time on nodes that are being
  * inserted for the first time and thus don't have any consumers below them that need to be
- * invalidated, and also ignore the case where a provider is being detached because a chunk of UI
- * is being removed, meaning that no consumers below them are going to be around to be updated
- * anyway.
+ * invalidated, and also ignore the case where a provider is being detached because a chunk of UI is
+ * being removed, meaning that no consumers below them are going to be around to be updated anyway.
  *
  * I think we need to have a bigger discussion around what modifier locals should look like in the
  * Modifer.Node world.
diff --git a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/modifier/ModifierLocalModifierNode.kt b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/modifier/ModifierLocalModifierNode.kt
index 0fec577..2bcf8ec 100644
--- a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/modifier/ModifierLocalModifierNode.kt
+++ b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/modifier/ModifierLocalModifierNode.kt
@@ -34,21 +34,21 @@
  */
 sealed class ModifierLocalMap {
     internal abstract operator fun <T> set(key: ModifierLocal<T>, value: T)
+
     internal abstract operator fun <T> get(key: ModifierLocal<T>): T?
+
     internal abstract operator fun contains(key: ModifierLocal<*>): Boolean
 }
 
-internal class SingleLocalMap(
-    private val key: ModifierLocal<*>
-) : ModifierLocalMap() {
+internal class SingleLocalMap(private val key: ModifierLocal<*>) : ModifierLocalMap() {
     private var value: Any? by mutableStateOf(null)
+
     internal fun forceValue(value: Any?) {
         this.value = value
     }
 
     override operator fun <T> set(key: ModifierLocal<T>, value: T) {
-        @Suppress("ExceptionMessage")
-        checkPrecondition(key === this.key)
+        @Suppress("ExceptionMessage") checkPrecondition(key === this.key)
         this.value = value
     }
 
@@ -61,9 +61,7 @@
     override operator fun contains(key: ModifierLocal<*>): Boolean = key === this.key
 }
 
-internal class BackwardsCompatLocalMap(
-    var element: ModifierLocalProvider<*>
-) : ModifierLocalMap() {
+internal class BackwardsCompatLocalMap(var element: ModifierLocalProvider<*>) : ModifierLocalMap() {
     override operator fun <T> set(key: ModifierLocal<T>, value: T) {
         error("Set is not allowed on a backwards compat provider")
     }
@@ -93,8 +91,7 @@
     }
 
     override operator fun <T> get(key: ModifierLocal<T>): T? {
-        @Suppress("UNCHECKED_CAST")
-        return map[key] as? T?
+        @Suppress("UNCHECKED_CAST") return map[key] as? T?
     }
 
     override operator fun contains(key: ModifierLocal<*>): Boolean = map.containsKey(key)
@@ -102,7 +99,9 @@
 
 internal object EmptyMap : ModifierLocalMap() {
     override fun <T> set(key: ModifierLocal<T>, value: T) = error("")
+
     override fun <T> get(key: ModifierLocal<T>): T = error("")
+
     override fun contains(key: ModifierLocal<*>): Boolean = false
 }
 
@@ -110,8 +109,8 @@
  * A [androidx.compose.ui.Modifier.Node] that is capable of consuming and providing [ModifierLocal]
  * values.
  *
- * This is the [androidx.compose.ui.Modifier.Node] equivalent of the [ModifierLocalConsumer]
- * and [ModifierLocalProvider] interfaces.
+ * This is the [androidx.compose.ui.Modifier.Node] equivalent of the [ModifierLocalConsumer] and
+ * [ModifierLocalProvider] interfaces.
  *
  * @sample androidx.compose.ui.samples.JustReadingOrProvidingModifierLocalNodeSample
  *
@@ -135,12 +134,13 @@
      * @see modifierLocalMapOf
      * @see provide
      */
-    val providedValues: ModifierLocalMap get() = EmptyMap
+    val providedValues: ModifierLocalMap
+        get() = EmptyMap
 
     /**
      * This method will cause this node to provide a new [value] for [key]. This can be called at
-     * any time on the UI thread, but in order to use this API, [providedValues] must be
-     * implemented and [key] must be a key that was included in it.
+     * any time on the UI thread, but in order to use this API, [providedValues] must be implemented
+     * and [key] must be a key that was included in it.
      *
      * By providing this new value, any [ModifierLocalModifierNode] below it in the tree will read
      * this [value] when reading [current], until another [ModifierLocalModifierNode] provides a
@@ -159,8 +159,8 @@
     }
 
     /**
-     * Read a [ModifierLocal] that was provided by other modifiers to the left of this modifier,
-     * or above this modifier in the layout tree.
+     * Read a [ModifierLocal] that was provided by other modifiers to the left of this modifier, or
+     * above this modifier in the layout tree.
      */
     override val <T> ModifierLocal<T>.current: T
         get() {
@@ -170,51 +170,38 @@
             val key = this
             visitAncestors(Nodes.Locals) {
                 if (it.providedValues.contains(key)) {
-                    @Suppress("UNCHECKED_CAST")
-                    return it.providedValues[key] as T
+                    @Suppress("UNCHECKED_CAST") return it.providedValues[key] as T
                 }
             }
             return key.defaultFactory()
         }
 }
 
-/**
- * Creates an empty [ModifierLocalMap]
- */
+/** Creates an empty [ModifierLocalMap] */
 fun modifierLocalMapOf(): ModifierLocalMap = EmptyMap
 
-/**
- * Creates a [ModifierLocalMap] with a single key and value initialized to null.
- */
-fun <T> modifierLocalMapOf(
-    key: ModifierLocal<T>
-): ModifierLocalMap = SingleLocalMap(key)
+/** Creates a [ModifierLocalMap] with a single key and value initialized to null. */
+fun <T> modifierLocalMapOf(key: ModifierLocal<T>): ModifierLocalMap = SingleLocalMap(key)
 
 /**
  * Creates a [ModifierLocalMap] with a single key and value. The provided [entry] should have
  * [Pair::first] be the [ModifierLocal] key, and the [Pair::second] be the corresponding value.
  */
-fun <T> modifierLocalMapOf(
-    entry: Pair<ModifierLocal<T>, T>
-): ModifierLocalMap = SingleLocalMap(entry.first).also { it[entry.first] = entry.second }
+fun <T> modifierLocalMapOf(entry: Pair<ModifierLocal<T>, T>): ModifierLocalMap =
+    SingleLocalMap(entry.first).also { it[entry.first] = entry.second }
 
-/**
- * Creates a [ModifierLocalMap] with several keys, all initialized with values of null
- */
+/** Creates a [ModifierLocalMap] with several keys, all initialized with values of null */
 fun modifierLocalMapOf(
     key1: ModifierLocal<*>,
     key2: ModifierLocal<*>,
     vararg keys: ModifierLocal<*>
-): ModifierLocalMap = MultiLocalMap(
-    key1 to null,
-    key2 to null,
-    *keys.map { it to null }.toTypedArray()
-)
+): ModifierLocalMap =
+    MultiLocalMap(key1 to null, key2 to null, *keys.map { it to null }.toTypedArray())
 
 /**
  * Creates a [ModifierLocalMap] with multiple keys and values. The provided [entries] should have
- * each item's [Pair::first] be the [ModifierLocal] key, and the [Pair::second] be the
- * corresponding value.
+ * each item's [Pair::first] be the [ModifierLocal] key, and the [Pair::second] be the corresponding
+ * value.
  */
 fun modifierLocalMapOf(
     entry1: Pair<ModifierLocal<*>, Any>,
@@ -227,15 +214,12 @@
     message = "Use a different overloaded version of this function",
     level = DeprecationLevel.HIDDEN
 )
-fun modifierLocalMapOf(
-    vararg keys: ModifierLocal<*>
-): ModifierLocalMap = when (keys.size) {
+fun modifierLocalMapOf(vararg keys: ModifierLocal<*>): ModifierLocalMap =
+    when (keys.size) {
         0 -> EmptyMap
         1 -> SingleLocalMap(keys.first())
-        else -> MultiLocalMap(
-            keys.first() to null,
-            *keys.drop(1).fastMap { it to null }.toTypedArray()
-        )
+        else ->
+            MultiLocalMap(keys.first() to null, *keys.drop(1).fastMap { it to null }.toTypedArray())
     }
 
 // b/280116113.
@@ -243,10 +227,9 @@
     message = "Use a different overloaded version of this function",
     level = DeprecationLevel.HIDDEN
 )
-fun modifierLocalMapOf(
-    vararg entries: Pair<ModifierLocal<*>, Any>
-): ModifierLocalMap = when (entries.size) {
-    0 -> EmptyMap
-    1 -> MultiLocalMap(entries.first())
-    else -> MultiLocalMap(entries.first(), *entries.drop(1).toTypedArray())
-}
+fun modifierLocalMapOf(vararg entries: Pair<ModifierLocal<*>, Any>): ModifierLocalMap =
+    when (entries.size) {
+        0 -> EmptyMap
+        1 -> MultiLocalMap(entries.first())
+        else -> MultiLocalMap(entries.first(), *entries.drop(1).toTypedArray())
+    }
diff --git a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/modifier/ModifierLocalProvider.kt b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/modifier/ModifierLocalProvider.kt
index 39894e1..94dd8f4 100644
--- a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/modifier/ModifierLocalProvider.kt
+++ b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/modifier/ModifierLocalProvider.kt
@@ -27,15 +27,15 @@
 
 /**
  * A Modifier that can be used to provide [ModifierLocal]s that can be read by other modifiers to
- * the right of this modifier, or modifiers that are children of the layout node that this
- * modifier is attached to.
+ * the right of this modifier, or modifiers that are children of the layout node that this modifier
+ * is attached to.
  */
 @Stable
 @JvmDefaultWithCompatibility
 interface ModifierLocalProvider<T> : Modifier.Element {
     /**
-     * Each [ModifierLocalProvider] stores a [ModifierLocal] instance that can be used as a key
-     * by a [ModifierLocalConsumer] to read the provided value.
+     * Each [ModifierLocalProvider] stores a [ModifierLocal] instance that can be used as a key by a
+     * [ModifierLocalConsumer] to read the provided value.
      */
     val key: ProvidableModifierLocal<T>
 
@@ -48,13 +48,14 @@
 
 /**
  * A Modifier that can be used to provide [ModifierLocal]s that can be read by other modifiers to
- * the right of this modifier, or modifiers that are children of the layout node that this
- * modifier is attached to.
+ * the right of this modifier, or modifiers that are children of the layout node that this modifier
+ * is attached to.
  */
 @ExperimentalComposeUiApi
 fun <T> Modifier.modifierLocalProvider(key: ProvidableModifierLocal<T>, value: () -> T): Modifier {
     return this.then(
-        object : ModifierLocalProvider<T>,
+        object :
+            ModifierLocalProvider<T>,
             InspectorValueInfo(
                 debugInspectorInfo {
                     name = "modifierLocalProvider"
diff --git a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/node/BackwardsCompatNode.kt b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/node/BackwardsCompatNode.kt
index 60a2b48..0f72c37 100644
--- a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/node/BackwardsCompatNode.kt
+++ b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/node/BackwardsCompatNode.kt
@@ -68,9 +68,9 @@
 import androidx.compose.ui.unit.toSize
 
 /**
- * This entity will end up implementing all of the entity type interfaces, but its [kindSet]
- * will only be set to the expected values based on the interface(s) that the modifier element that
- * it has implements. This is nice because it will be one class that simply delegates / pipes
+ * This entity will end up implementing all of the entity type interfaces, but its [kindSet] will
+ * only be set to the expected values based on the interface(s) that the modifier element that it
+ * has implements. This is nice because it will be one class that simply delegates / pipes
  * everything to the modifier instance, but those interfaces should only be called in the cases
  * where the modifier would have been previously.
  */
@@ -116,9 +116,7 @@
         val element = element
         if (isKind(Nodes.Locals)) {
             if (element is ModifierLocalProvider<*>) {
-                requireOwner()
-                    .modifierLocalManager
-                    .removedProvider(this, element.key)
+                requireOwner().modifierLocalManager.removedProvider(this, element.key)
             }
             if (element is ModifierLocalConsumer) {
                 element.onModifierLocalsUpdated(DetachedModifierLocalReadScope)
@@ -180,15 +178,16 @@
                 lastOnPlacedCoordinates = null
                 val isChainUpdate = isChainUpdate()
                 if (isChainUpdate) {
-                    requireOwner().registerOnLayoutCompletedListener(
-                        object : Owner.OnLayoutCompletedListener {
-                            override fun onLayoutComplete() {
-                                if (lastOnPlacedCoordinates == null) {
-                                    onPlaced(requireCoordinator(Nodes.LayoutAware))
+                    requireOwner()
+                        .registerOnLayoutCompletedListener(
+                            object : Owner.OnLayoutCompletedListener {
+                                override fun onLayoutComplete() {
+                                    if (lastOnPlacedCoordinates == null) {
+                                        onPlaced(requireCoordinator(Nodes.LayoutAware))
+                                    }
                                 }
                             }
-                        }
-                    )
+                        )
                 }
             }
         }
@@ -216,8 +215,12 @@
     }
 
     // BuildDrawCacheParams
-    override val density get() = requireLayoutNode().density
-    override val layoutDirection: LayoutDirection get() = requireLayoutNode().layoutDirection
+    override val density
+        get() = requireLayoutNode().density
+
+    override val layoutDirection: LayoutDirection
+        get() = requireLayoutNode().layoutDirection
+
     override val size: Size
         get() {
             return requireCoordinator(Nodes.LayoutAware).size.toSize()
@@ -234,11 +237,9 @@
     private fun updateDrawCache() {
         val element = element
         if (element is DrawCacheModifier) {
-            requireOwner()
-                .snapshotObserver
-                .observeReads(this, onDrawCacheReadsChanged) {
-                    element.onBuildCache(this)
-                }
+            requireOwner().snapshotObserver.observeReads(this, onDrawCacheReadsChanged) {
+                element.onBuildCache(this)
+            }
         }
         invalidateCache = false
     }
@@ -250,7 +251,8 @@
 
     private var _providedValues: BackwardsCompatLocalMap? = null
     var readValues = hashSetOf<ModifierLocal<*>>()
-    override val providedValues: ModifierLocalMap get() = _providedValues ?: modifierLocalMapOf()
+    override val providedValues: ModifierLocalMap
+        get() = _providedValues ?: modifierLocalMapOf()
 
     override val <T> ModifierLocal<T>.current: T
         get() {
@@ -258,8 +260,7 @@
             readValues.add(key)
             visitAncestors(Nodes.Locals) {
                 if (it.providedValues.contains(key)) {
-                    @Suppress("UNCHECKED_CAST")
-                    return it.providedValues[key] as T
+                    @Suppress("UNCHECKED_CAST") return it.providedValues[key] as T
                 }
             }
             return key.defaultFactory()
@@ -268,10 +269,7 @@
     fun updateModifierLocalConsumer() {
         if (isAttached) {
             readValues.clear()
-            requireOwner().snapshotObserver.observeReads(
-                this,
-                updateModifierLocalConsumer
-            ) {
+            requireOwner().snapshotObserver.observeReads(this, updateModifierLocalConsumer) {
                 (element as ModifierLocalConsumer).onModifierLocalsUpdated(this)
             }
         }
@@ -281,9 +279,7 @@
         val providedValues = _providedValues
         if (providedValues != null && providedValues.contains(element.key)) {
             providedValues.element = element
-            requireOwner()
-                .modifierLocalManager
-                .updatedProvider(this, element.key)
+            requireOwner().modifierLocalManager.updatedProvider(this, element.key)
         } else {
             _providedValues = BackwardsCompatLocalMap(element)
             // we only need to notify the modifierLocalManager of an inserted provider
@@ -295,51 +291,40 @@
             // chain is being attached for the first time.
             val isChainUpdate = isChainUpdate()
             if (isChainUpdate) {
-                requireOwner()
-                    .modifierLocalManager
-                    .insertedProvider(this, element.key)
+                requireOwner().modifierLocalManager.insertedProvider(this, element.key)
             }
         }
     }
 
-    override val isValidOwnerScope: Boolean get() = isAttached
+    override val isValidOwnerScope: Boolean
+        get() = isAttached
 
     override fun MeasureScope.measure(
         measurable: Measurable,
         constraints: Constraints
     ): MeasureResult {
-        return with(element as LayoutModifier) {
-            measure(measurable, constraints)
-        }
+        return with(element as LayoutModifier) { measure(measurable, constraints) }
     }
 
     override fun IntrinsicMeasureScope.minIntrinsicWidth(
         measurable: IntrinsicMeasurable,
         height: Int
-    ): Int = with(element as LayoutModifier) {
-        minIntrinsicWidth(measurable, height)
-    }
+    ): Int = with(element as LayoutModifier) { minIntrinsicWidth(measurable, height) }
 
     override fun IntrinsicMeasureScope.minIntrinsicHeight(
         measurable: IntrinsicMeasurable,
         width: Int
-    ): Int = with(element as LayoutModifier) {
-        minIntrinsicHeight(measurable, width)
-    }
+    ): Int = with(element as LayoutModifier) { minIntrinsicHeight(measurable, width) }
 
     override fun IntrinsicMeasureScope.maxIntrinsicWidth(
         measurable: IntrinsicMeasurable,
         height: Int
-    ): Int = with(element as LayoutModifier) {
-        maxIntrinsicWidth(measurable, height)
-    }
+    ): Int = with(element as LayoutModifier) { maxIntrinsicWidth(measurable, height) }
 
     override fun IntrinsicMeasureScope.maxIntrinsicHeight(
         measurable: IntrinsicMeasurable,
         width: Int
-    ): Int = with(element as LayoutModifier) {
-        maxIntrinsicHeight(measurable, width)
-    }
+    ): Int = with(element as LayoutModifier) { maxIntrinsicHeight(measurable, width) }
 
     override fun ContentDrawScope.draw() {
         val element = element
@@ -368,15 +353,11 @@
     }
 
     override fun onCancelPointerInput() {
-        with(element as PointerInputModifier) {
-            pointerInputFilter.onCancel()
-        }
+        with(element as PointerInputModifier) { pointerInputFilter.onCancel() }
     }
 
     override fun sharePointerInputWithSiblings(): Boolean {
-        return with(element as PointerInputModifier) {
-            pointerInputFilter.shareWithSiblings
-        }
+        return with(element as PointerInputModifier) { pointerInputFilter.shareWithSiblings }
     }
 
     override fun interceptOutOfBoundsChildEvents(): Boolean {
@@ -386,9 +367,7 @@
     }
 
     override fun Density.modifyParentData(parentData: Any?): Any? {
-        return with(element as ParentDataModifier) {
-            modifyParentData(parentData)
-        }
+        return with(element as ParentDataModifier) { modifyParentData(parentData) }
     }
 
     override fun onGloballyPositioned(coordinates: LayoutCoordinates) {
@@ -403,6 +382,7 @@
     }
 
     private var lastOnPlacedCoordinates: LayoutCoordinates? = null
+
     override fun onPlaced(coordinates: LayoutCoordinates) {
         lastOnPlacedCoordinates = coordinates
         val element = element
@@ -425,21 +405,19 @@
             "applyFocusProperties called on wrong node"
         }
 
-        @Suppress("DEPRECATION")
-        focusOrderModifier.populateFocusOrder(FocusOrder(focusProperties))
+        @Suppress("DEPRECATION") focusOrderModifier.populateFocusOrder(FocusOrder(focusProperties))
     }
 
     override fun toString(): String = element.toString()
 }
 
-private val DetachedModifierLocalReadScope = object : ModifierLocalReadScope {
-    override val <T> ModifierLocal<T>.current: T
-        get() = defaultFactory()
-}
+private val DetachedModifierLocalReadScope =
+    object : ModifierLocalReadScope {
+        override val <T> ModifierLocal<T>.current: T
+            get() = defaultFactory()
+    }
 
-private val onDrawCacheReadsChanged = { it: BackwardsCompatNode ->
-    it.onDrawCacheReadsChanged()
-}
+private val onDrawCacheReadsChanged = { it: BackwardsCompatNode -> it.onDrawCacheReadsChanged() }
 
 private val updateModifierLocalConsumer = { it: BackwardsCompatNode ->
     it.updateModifierLocalConsumer()
diff --git a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/node/ComposeUiNode.kt b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/node/ComposeUiNode.kt
index f55bfb5..e6f45e8 100644
--- a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/node/ComposeUiNode.kt
+++ b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/node/ComposeUiNode.kt
@@ -24,9 +24,7 @@
 import androidx.compose.ui.unit.Density
 import androidx.compose.ui.unit.LayoutDirection
 
-/**
- * Interface extracted from LayoutNode to not mark the whole LayoutNode class as @PublishedApi.
- */
+/** Interface extracted from LayoutNode to not mark the whole LayoutNode class as @PublishedApi. */
 @PublishedApi
 internal interface ComposeUiNode {
     var measurePolicy: MeasurePolicy
@@ -35,29 +33,27 @@
     var modifier: Modifier
     var viewConfiguration: ViewConfiguration
     var compositionLocalMap: CompositionLocalMap
-    @ExperimentalComposeUiApi
-    var compositeKeyHash: Int
+    @ExperimentalComposeUiApi var compositeKeyHash: Int
 
-    /**
-     * Object of pre-allocated lambdas used to make use with ComposeNode allocation-less.
-     */
+    /** Object of pre-allocated lambdas used to make use with ComposeNode allocation-less. */
     companion object {
         val Constructor: () -> ComposeUiNode = LayoutNode.Constructor
         val VirtualConstructor: () -> ComposeUiNode = { LayoutNode(isVirtual = true) }
         val SetModifier: ComposeUiNode.(Modifier) -> Unit = { this.modifier = it }
         val SetDensity: ComposeUiNode.(Density) -> Unit = { this.density = it }
-        val SetResolvedCompositionLocals: ComposeUiNode.(CompositionLocalMap) -> Unit =
-            { this.compositionLocalMap = it }
-        val SetMeasurePolicy: ComposeUiNode.(MeasurePolicy) -> Unit =
-            { this.measurePolicy = it }
-        val SetLayoutDirection: ComposeUiNode.(LayoutDirection) -> Unit =
-            { this.layoutDirection = it }
-        val SetViewConfiguration: ComposeUiNode.(ViewConfiguration) -> Unit =
-            { this.viewConfiguration = it }
+        val SetResolvedCompositionLocals: ComposeUiNode.(CompositionLocalMap) -> Unit = {
+            this.compositionLocalMap = it
+        }
+        val SetMeasurePolicy: ComposeUiNode.(MeasurePolicy) -> Unit = { this.measurePolicy = it }
+        val SetLayoutDirection: ComposeUiNode.(LayoutDirection) -> Unit = {
+            this.layoutDirection = it
+        }
+        val SetViewConfiguration: ComposeUiNode.(ViewConfiguration) -> Unit = {
+            this.viewConfiguration = it
+        }
         @get:ExperimentalComposeUiApi
         @Suppress("OPT_IN_MARKER_ON_WRONG_TARGET")
         @ExperimentalComposeUiApi
-        val SetCompositeKeyHash: ComposeUiNode.(Int) -> Unit =
-            { this.compositeKeyHash = it }
+        val SetCompositeKeyHash: ComposeUiNode.(Int) -> Unit = { this.compositeKeyHash = it }
     }
 }
diff --git a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/node/CompositionLocalConsumerModifierNode.kt b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/node/CompositionLocalConsumerModifierNode.kt
index e1a9ac3..151bfea 100644
--- a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/node/CompositionLocalConsumerModifierNode.kt
+++ b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/node/CompositionLocalConsumerModifierNode.kt
@@ -43,18 +43,18 @@
  * Compose. Modifiers are not able to recompose in the same way that a Composable can, and therefore
  * can't receive updates arbitrarily for a CompositionLocal.
  *
- * Because CompositionLocals may change arbitrarily, it is strongly recommended to ensure that
- * the composition local is observed instead of being read once. If you call [currentValueOf]
- * inside of a modifier callback like [LayoutModifierNode.measure] or [DrawModifierNode.draw],
- * then Compose will track the CompositionLocal read. This happens automatically, because these
- * Compose UI phases take place in a snapshot observer that tracks which states are read. If the
- * value of the CompositionLocal changes, and it was read inside of the measure or draw phase,
- * then that phase will automatically be invalidated.
+ * Because CompositionLocals may change arbitrarily, it is strongly recommended to ensure that the
+ * composition local is observed instead of being read once. If you call [currentValueOf] inside of
+ * a modifier callback like [LayoutModifierNode.measure] or [DrawModifierNode.draw], then Compose
+ * will track the CompositionLocal read. This happens automatically, because these Compose UI phases
+ * take place in a snapshot observer that tracks which states are read. If the value of the
+ * CompositionLocal changes, and it was read inside of the measure or draw phase, then that phase
+ * will automatically be invalidated.
  *
- * For all other reads of a CompositionLocal, this function will **not** notify you when the
- * value of the local changes. [Modifier.Node] classes that also implement [ObserverModifierNode]
- * may observe CompositionLocals arbitrarily by performing the lookup in an [observeReads] block.
- * To continue observing values of the CompositionLocal, it must be read again in an [observeReads]
+ * For all other reads of a CompositionLocal, this function will **not** notify you when the value
+ * of the local changes. [Modifier.Node] classes that also implement [ObserverModifierNode] may
+ * observe CompositionLocals arbitrarily by performing the lookup in an [observeReads] block. To
+ * continue observing values of the CompositionLocal, it must be read again in an [observeReads]
  * block during or after the [ObserverModifierNode.onObservedReadsChanged] callback is invoked. See
  * below for an example of how to implement this observation pattern.
  *
@@ -65,9 +65,9 @@
  * [detached][Modifier.Node.onDetach].
  *
  * @param local The CompositionLocal to get the current value of
- * @return The value provided by the nearest [CompositionLocalProvider] component that
- * invokes, directly or indirectly, the composable function that this modifier is attached to.
- * If [local] was never provided, its default value will be returned instead.
+ * @return The value provided by the nearest [CompositionLocalProvider] component that invokes,
+ *   directly or indirectly, the composable function that this modifier is attached to. If [local]
+ *   was never provided, its default value will be returned instead.
  */
 fun <T> CompositionLocalConsumerModifierNode.currentValueOf(local: CompositionLocal<T>): T {
     checkPrecondition(node.isAttached) {
diff --git a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/node/DelegatableNode.kt b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/node/DelegatableNode.kt
index 45c7b33..ffc88f5 100644
--- a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/node/DelegatableNode.kt
+++ b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/node/DelegatableNode.kt
@@ -43,7 +43,8 @@
     val node: Modifier.Node
 }
 
-internal val DelegatableNode.isDelegationRoot: Boolean get() = node === this
+internal val DelegatableNode.isDelegationRoot: Boolean
+    get() = node === this
 
 // TREE TRAVERSAL APIS
 // For now, traversing the node tree and layout node tree will be kept out of public API.
@@ -128,19 +129,14 @@
 }
 
 private fun MutableVector<Modifier.Node>.addLayoutNodeChildren(node: Modifier.Node) {
-    node.requireLayoutNode()._children.forEachReversed {
-        add(it.nodes.head)
-    }
+    node.requireLayoutNode()._children.forEachReversed { add(it.nodes.head) }
 }
 
 internal inline fun DelegatableNode.visitChildren(mask: Int, block: (Modifier.Node) -> Unit) {
     check(node.isAttached) { "visitChildren called on an unattached node" }
     val branches = mutableVectorOf<Modifier.Node>()
     val child = node.child
-    if (child == null)
-        branches.addLayoutNodeChildren(node)
-    else
-        branches.add(child)
+    if (child == null) branches.addLayoutNodeChildren(node) else branches.add(child)
     while (branches.isNotEmpty()) {
         val branch = branches.removeAt(branches.lastIndex)
         if (branch.aggregateChildKindSet and mask == 0) {
@@ -167,10 +163,7 @@
     checkPrecondition(node.isAttached) { "visitSubtreeIf called on an unattached node" }
     val branches = mutableVectorOf<Modifier.Node>()
     val child = node.child
-    if (child == null)
-        branches.addLayoutNodeChildren(node)
-    else
-        branches.add(child)
+    if (child == null) branches.addLayoutNodeChildren(node) else branches.add(child)
     outer@ while (branches.isNotEmpty()) {
         val branch = branches.removeAt(branches.size - 1)
         if (branch.aggregateChildKindSet and mask != 0) {
@@ -190,11 +183,7 @@
 internal inline fun DelegatableNode.visitLocalDescendants(
     mask: Int,
     block: (Modifier.Node) -> Unit
-) = visitLocalDescendants(
-    mask = mask,
-    includeSelf = false,
-    block = block
-)
+) = visitLocalDescendants(mask = mask, includeSelf = false, block = block)
 
 internal inline fun DelegatableNode.visitLocalDescendants(
     mask: Int,
@@ -213,10 +202,7 @@
     }
 }
 
-internal inline fun DelegatableNode.visitLocalAncestors(
-    mask: Int,
-    block: (Modifier.Node) -> Unit
-) {
+internal inline fun DelegatableNode.visitLocalAncestors(mask: Int, block: (Modifier.Node) -> Unit) {
     checkPrecondition(node.isAttached) { "visitLocalAncestors called on an unattached node" }
     var next = node.parent
     while (next != null) {
@@ -230,23 +216,17 @@
 internal inline fun <reified T> DelegatableNode.visitSelfAndLocalDescendants(
     type: NodeKind<T>,
     block: (T) -> Unit
-) = visitLocalDescendants(mask = type.mask, includeSelf = true) {
-    it.dispatchForKind(type, block)
-}
+) = visitLocalDescendants(mask = type.mask, includeSelf = true) { it.dispatchForKind(type, block) }
 
 internal inline fun <reified T> DelegatableNode.visitLocalDescendants(
     type: NodeKind<T>,
     block: (T) -> Unit
-) = visitLocalDescendants(type.mask) {
-    it.dispatchForKind(type, block)
-}
+) = visitLocalDescendants(type.mask) { it.dispatchForKind(type, block) }
 
 internal inline fun <reified T> DelegatableNode.visitLocalAncestors(
     type: NodeKind<T>,
     block: (T) -> Unit
-) = visitLocalAncestors(type.mask) {
-    it.dispatchForKind(type, block)
-}
+) = visitLocalAncestors(type.mask) { it.dispatchForKind(type, block) }
 
 internal inline fun <reified T> DelegatableNode.visitAncestors(
     type: NodeKind<T>,
@@ -268,9 +248,7 @@
     }
 }
 
-internal inline fun <reified T> DelegatableNode.ancestors(
-    type: NodeKind<T>
-): List<T>? {
+internal inline fun <reified T> DelegatableNode.ancestors(type: NodeKind<T>): List<T>? {
     var result: MutableList<T>? = null
     visitAncestors(type) {
         if (result == null) result = mutableListOf()
@@ -307,45 +285,37 @@
 internal inline fun <reified T> DelegatableNode.visitSubtreeIf(
     type: NodeKind<T>,
     block: (T) -> Boolean
-) = visitSubtreeIf(type.mask) foo@{ node ->
-    node.dispatchForKind(type) {
-        if (!block(it)) return@foo false
+) =
+    visitSubtreeIf(type.mask) foo@{ node ->
+        node.dispatchForKind(type) { if (!block(it)) return@foo false }
+        true
     }
-    true
-}
 
 internal fun DelegatableNode.has(type: NodeKind<*>): Boolean =
     node.aggregateChildKindSet and type.mask != 0
 
 internal fun DelegatableNode.requireCoordinator(kind: NodeKind<*>): NodeCoordinator {
     val coordinator = node.coordinator!!
-    return if (coordinator.tail !== this)
-        coordinator
-    else if (kind.includeSelfInTraversal)
-        coordinator.wrapped!!
-    else
-        coordinator
+    return if (coordinator.tail !== this) coordinator
+    else if (kind.includeSelfInTraversal) coordinator.wrapped!! else coordinator
 }
 
 internal fun DelegatableNode.requireLayoutNode(): LayoutNode =
     checkPreconditionNotNull(node.coordinator) {
-        "Cannot obtain node coordinator. Is the Modifier.Node attached?"
-    }.layoutNode
+            "Cannot obtain node coordinator. Is the Modifier.Node attached?"
+        }
+        .layoutNode
 
 internal fun DelegatableNode.requireOwner(): Owner =
-    checkPreconditionNotNull(requireLayoutNode().owner) {
-        "This node does not have an owner."
-    }
+    checkPreconditionNotNull(requireLayoutNode().owner) { "This node does not have an owner." }
 
 /**
- * Returns the current [Density] of the LayoutNode that this [DelegatableNode] is attached to.
- * If the node is not attached, this function will throw an [IllegalStateException].
+ * Returns the current [Density] of the LayoutNode that this [DelegatableNode] is attached to. If
+ * the node is not attached, this function will throw an [IllegalStateException].
  */
 fun DelegatableNode.requireDensity(): Density = requireLayoutNode().density
 
-/**
- * Returns the current [GraphicsContext] of the [Owner]
- */
+/** Returns the current [GraphicsContext] of the [Owner] */
 fun DelegatableNode.requireGraphicsContext(): GraphicsContext = requireOwner().graphicsContext
 
 /**
@@ -361,25 +331,23 @@
  * implement [LayoutAwareModifierNode].
  *
  * @throws IllegalStateException When either this node is not attached, or the [LayoutCoordinates]
- * object is not attached.
+ *   object is not attached.
  */
 fun DelegatableNode.requireLayoutCoordinates(): LayoutCoordinates {
     checkPrecondition(node.isAttached) {
         "Cannot get LayoutCoordinates, Modifier.Node is not attached."
     }
     val coordinates = requireCoordinator(Nodes.Layout).coordinates
-    checkPrecondition(coordinates.isAttached) {
-        "LayoutCoordinates is not attached."
-    }
+    checkPrecondition(coordinates.isAttached) { "LayoutCoordinates is not attached." }
     return coordinates
 }
 
 /**
  * Invalidates the subtree of this layout, including layout, drawing, parent data, etc.
  *
- * Calling this method can be a relatively expensive operation as it will cause the
- * entire subtree to relayout and redraw instead of just parts that
- * are otherwise invalidated. Its use should be limited to structural changes.
+ * Calling this method can be a relatively expensive operation as it will cause the entire subtree
+ * to relayout and redraw instead of just parts that are otherwise invalidated. Its use should be
+ * limited to structural changes.
  */
 fun DelegatableNode.invalidateSubtree() {
     if (node.isAttached) {
@@ -397,17 +365,21 @@
         var node: Modifier.Node? = delegate
         while (node != null) {
             if (node is LayoutModifierNode) return node
-            node = if (node is DelegatingNode && node.isKind(Nodes.Layout)) {
-                // NOTE: we can only do this here because we are enforcing that a delegating node
-                // only behaves as a single LayoutModifierNode, not multiple, so we know that if
-                // the node is of kind "Layout", then one of its delegates has to be a
-                // LayoutModifierNode and *none of the other delegates of its parent can be*. As a
-                // result, we can avoid allocating a collection here and instead just dive down into
-                // this delegate directly.
-                node.delegate
-            } else {
-                node.child
-            }
+            node =
+                if (node is DelegatingNode && node.isKind(Nodes.Layout)) {
+                    // NOTE: we can only do this here because we are enforcing that a delegating
+                    // node
+                    // only behaves as a single LayoutModifierNode, not multiple, so we know that if
+                    // the node is of kind "Layout", then one of its delegates has to be a
+                    // LayoutModifierNode and *none of the other delegates of its parent can be*. As
+                    // a
+                    // result, we can avoid allocating a collection here and instead just dive down
+                    // into
+                    // this delegate directly.
+                    node.delegate
+                } else {
+                    node.child
+                }
         }
     }
     return null
@@ -468,6 +440,5 @@
 }
 
 private fun MutableVector<Modifier.Node>?.pop(): Modifier.Node? {
-    return if (this == null || isEmpty()) null
-    else removeAt(size - 1)
+    return if (this == null || isEmpty()) null else removeAt(size - 1)
 }
diff --git a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/node/DelegatingNode.kt b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/node/DelegatingNode.kt
index 099e391..5d7e36e 100644
--- a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/node/DelegatingNode.kt
+++ b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/node/DelegatingNode.kt
@@ -26,9 +26,13 @@
  * This can be useful to compose multiple node implementations into one.
  *
  * @sample androidx.compose.ui.samples.DelegatedNodeSampleExplicit
+ *
  * @sample androidx.compose.ui.samples.DelegatedNodeSampleImplicit
+ *
  * @sample androidx.compose.ui.samples.LazyDelegationExample
+ *
  * @sample androidx.compose.ui.samples.ConditionalDelegationExample
+ *
  * @sample androidx.compose.ui.samples.DelegateInAttachSample
  *
  * @see DelegatingNode
@@ -39,13 +43,11 @@
      * This is the kindSet of the node if it had no delegates. This will never change, but kindSet
      * might, so we cache this value to be able to more efficiently recalculate the kindSet
      */
-    @Suppress("LeakingThis")
-    internal val selfKindSet: Int = calculateNodeKindSetFrom(this)
+    @Suppress("LeakingThis") internal val selfKindSet: Int = calculateNodeKindSetFrom(this)
+
     override fun updateCoordinator(coordinator: NodeCoordinator?) {
         super.updateCoordinator(coordinator)
-        forEachImmediateDelegate {
-            it.updateCoordinator(coordinator)
-        }
+        forEachImmediateDelegate { it.updateCoordinator(coordinator) }
     }
 
     internal var delegate: Modifier.Node? = null
@@ -53,31 +55,29 @@
     @TestOnly
     internal fun <T : DelegatableNode> delegateUnprotected(delegatableNode: T): T =
         delegate(delegatableNode)
-    @TestOnly
-    internal fun undelegateUnprotected(instance: DelegatableNode) = undelegate(instance)
+
+    @TestOnly internal fun undelegateUnprotected(instance: DelegatableNode) = undelegate(instance)
 
     override fun setAsDelegateTo(owner: Modifier.Node) {
         super.setAsDelegateTo(owner)
         // At this point _this_ node is being delegated to, however _this_ node may also
         // have delegates of its own, and their current `node` pointers need to be updated
         // so that they point to the right node in the tree.
-        forEachImmediateDelegate {
-            it.setAsDelegateTo(owner)
-        }
+        forEachImmediateDelegate { it.setAsDelegateTo(owner) }
     }
 
     /**
-     * In order to properly delegate work to another [Modifier.Node], the delegated instance must
-     * be created and returned inside of a [delegate] call. Doing this will
-     * ensure that the created node instance follows all of the right lifecycles and is properly
-     * discoverable in this position of the node tree.
+     * In order to properly delegate work to another [Modifier.Node], the delegated instance must be
+     * created and returned inside of a [delegate] call. Doing this will ensure that the created
+     * node instance follows all of the right lifecycles and is properly discoverable in this
+     * position of the node tree.
      *
      * By using [delegate], the [delegatableNode] parameter is returned from this function for
      * convenience.
      *
      * This method can be called from within an `init` block, however the returned delegated node
-     * will not be attached until the delegating node is attached. If [delegate] is called after
-     * the delegating node is already attached, the returned delegated node will be attached.
+     * will not be attached until the delegating node is attached. If [delegate] is called after the
+     * delegating node is already attached, the returned delegated node will be attached.
      */
     protected fun <T : DelegatableNode> delegate(delegatableNode: T): T {
         val delegateNode = delegatableNode.node
@@ -262,17 +262,13 @@
     }
 
     override fun runAttachLifecycle() {
-        forEachImmediateDelegate {
-            it.runAttachLifecycle()
-        }
+        forEachImmediateDelegate { it.runAttachLifecycle() }
         super.runAttachLifecycle()
     }
 
     override fun runDetachLifecycle() {
         super.runDetachLifecycle()
-        forEachImmediateDelegate {
-            it.runDetachLifecycle()
-        }
+        forEachImmediateDelegate { it.runDetachLifecycle() }
     }
 
     override fun markAsDetached() {
diff --git a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/node/DepthSortedSet.kt b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/node/DepthSortedSet.kt
index 86f4490..1e49dce 100644
--- a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/node/DepthSortedSet.kt
+++ b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/node/DepthSortedSet.kt
@@ -19,33 +19,31 @@
 import androidx.compose.ui.internal.checkPrecondition
 
 /**
- * The set of [LayoutNode]s which orders items by their [LayoutNode.depth] and
- * allows modifications(additions and removals) while we iterate through it via [popEach].
- * While [LayoutNode] is added to the set it should always be:
+ * The set of [LayoutNode]s which orders items by their [LayoutNode.depth] and allows
+ * modifications(additions and removals) while we iterate through it via [popEach]. While
+ * [LayoutNode] is added to the set it should always be:
  * 1) attached [LayoutNode.isAttached] == true
- * 2) maintaining the same [LayoutNode.depth]
- * as any of this modifications can break the comparator's contract which can cause
- * to not find the item in the tree set, which we previously added.
+ * 2) maintaining the same [LayoutNode.depth] as any of this modifications can break the
+ *    comparator's contract which can cause to not find the item in the tree set, which we
+ *    previously added.
  */
-internal class DepthSortedSet(
-    private val extraAssertions: Boolean
-) {
+internal class DepthSortedSet(private val extraAssertions: Boolean) {
     // stores the depth used when the node was added into the set so we can assert it wasn't
     // changed since then. we need to enforce this as changing the depth can break the contract
     // used in comparator for building the tree in TreeSet.
     // Created and used only when extraAssertions == true
-    private val mapOfOriginalDepth by lazy(LazyThreadSafetyMode.NONE) {
-        mutableMapOf<LayoutNode, Int>()
-    }
-    private val DepthComparator: Comparator<LayoutNode> = object : Comparator<LayoutNode> {
-        override fun compare(l1: LayoutNode, l2: LayoutNode): Int {
-            val depthDiff = l1.depth.compareTo(l2.depth)
-            if (depthDiff != 0) {
-                return depthDiff
+    private val mapOfOriginalDepth by
+        lazy(LazyThreadSafetyMode.NONE) { mutableMapOf<LayoutNode, Int>() }
+    private val DepthComparator: Comparator<LayoutNode> =
+        object : Comparator<LayoutNode> {
+            override fun compare(l1: LayoutNode, l2: LayoutNode): Int {
+                val depthDiff = l1.depth.compareTo(l2.depth)
+                if (depthDiff != 0) {
+                    return depthDiff
+                }
+                return l1.hashCode().compareTo(l2.hashCode())
             }
-            return l1.hashCode().compareTo(l2.hashCode())
         }
-    }
     private val set = TreeSet(DepthComparator)
 
     fun contains(node: LayoutNode): Boolean {
@@ -98,8 +96,7 @@
 
     fun isEmpty(): Boolean = set.isEmpty()
 
-    @Suppress("NOTHING_TO_INLINE")
-    inline fun isNotEmpty(): Boolean = !isEmpty()
+    @Suppress("NOTHING_TO_INLINE") inline fun isNotEmpty(): Boolean = !isEmpty()
 
     override fun toString(): String {
         return set.toString()
@@ -123,9 +120,7 @@
         }
     }
 
-    /**
-     * Checks if the node exists in either set.
-     */
+    /** Checks if the node exists in either set. */
     fun contains(node: LayoutNode): Boolean = lookaheadSet.contains(node) || set.contains(node)
 
     /**
@@ -150,11 +145,12 @@
     }
 
     fun remove(node: LayoutNode, affectsLookahead: Boolean): Boolean {
-        val contains = if (affectsLookahead) {
-            lookaheadSet.remove(node)
-        } else {
-            set.remove(node)
-        }
+        val contains =
+            if (affectsLookahead) {
+                lookaheadSet.remove(node)
+            } else {
+                set.remove(node)
+            }
         return contains
     }
 
@@ -171,8 +167,8 @@
     }
 
     /**
-     * Pops nodes that require lookahead remeasurement/replacement first until the lookaheadSet
-     * is empty, before handling nodes that only require invalidation for the main pass.
+     * Pops nodes that require lookahead remeasurement/replacement first until the lookaheadSet is
+     * empty, before handling nodes that only require invalidation for the main pass.
      */
     inline fun popEach(crossinline block: (node: LayoutNode, affectsLookahead: Boolean) -> Unit) {
         while (isNotEmpty()) {
@@ -183,6 +179,7 @@
     }
 
     fun isEmpty(): Boolean = set.isEmpty() && lookaheadSet.isEmpty()
+
     fun isEmpty(affectsLookahead: Boolean): Boolean =
         if (affectsLookahead) lookaheadSet.isEmpty() else set.isEmpty()
 
diff --git a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/node/DrawModifierNode.kt b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/node/DrawModifierNode.kt
index 99cd8b2..319313c 100644
--- a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/node/DrawModifierNode.kt
+++ b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/node/DrawModifierNode.kt
@@ -29,12 +29,12 @@
  */
 interface DrawModifierNode : DelegatableNode {
     fun ContentDrawScope.draw()
+
     fun onMeasureResultChanged() {}
 }
 
 /**
- * Invalidates this modifier's draw layer, ensuring that a draw pass will
- * be run on the next frame.
+ * Invalidates this modifier's draw layer, ensuring that a draw pass will be run on the next frame.
  */
 fun DrawModifierNode.invalidateDraw() {
     if (node.isAttached) {
diff --git a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/node/GlobalPositionAwareModifierNode.kt b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/node/GlobalPositionAwareModifierNode.kt
index 3265083..cb565b6 100644
--- a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/node/GlobalPositionAwareModifierNode.kt
+++ b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/node/GlobalPositionAwareModifierNode.kt
@@ -21,24 +21,26 @@
 
 /**
  * A [androidx.compose.ui.Modifier.Node] whose [onGloballyPositioned] is called with the final
- * LayoutCoordinates of the Layout when the global position of the content may have changed.
- * Note that it will be called after a composition when the coordinates are finalized.
+ * LayoutCoordinates of the Layout when the global position of the content may have changed. Note
+ * that it will be called after a composition when the coordinates are finalized.
  *
  * This is the [androidx.compose.ui.Modifier.Node] equivalent of
  * [androidx.compose.ui.layout.OnGloballyPositionedModifier]
  *
  * Usage example:
+ *
  * @sample androidx.compose.ui.samples.OnGloballyPositioned
+ *
  * @sample androidx.compose.ui.samples.GlobalPositionAwareModifierNodeSample
  *
  * @see LayoutCoordinates
  */
 interface GlobalPositionAwareModifierNode : DelegatableNode {
     /**
-     * Called with the final LayoutCoordinates of the Layout after measuring.
-     * Note that it will be called after a composition when the coordinates are finalized.
-     * The position in the modifier chain makes no difference in either
-     * the [LayoutCoordinates] argument or when the [onGloballyPositioned] is called.
+     * Called with the final LayoutCoordinates of the Layout after measuring. Note that it will be
+     * called after a composition when the coordinates are finalized. The position in the modifier
+     * chain makes no difference in either the [LayoutCoordinates] argument or when the
+     * [onGloballyPositioned] is called.
      */
     fun onGloballyPositioned(coordinates: LayoutCoordinates)
 }
diff --git a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/node/HitTestResult.kt b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/node/HitTestResult.kt
index 0203f66..13325d8 100644
--- a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/node/HitTestResult.kt
+++ b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/node/HitTestResult.kt
@@ -23,8 +23,8 @@
 
 /**
  * This tracks the hit test results to allow for minimum touch target and single-pass hit testing.
- * If there is a hit at the minimum touch target, searching for a hit within the layout bounds
- * can still continue, but the near miss is still tracked.
+ * If there is a hit at the minimum touch target, searching for a hit within the layout bounds can
+ * still continue, but the near miss is still tracked.
  *
  * The List<T> interface should only be used after hit testing has completed.
  *
@@ -43,8 +43,8 @@
     var shouldSharePointerInputWithSibling = true
 
     /**
-     * `true` when there has been a direct hit within touch bounds ([hit] called) or
-     * `false` otherwise.
+     * `true` when there has been a direct hit within touch bounds ([hit] called) or `false`
+     * otherwise.
      */
     fun hasHit(): Boolean {
         val distance = findBestHitDistance()
@@ -52,8 +52,8 @@
     }
 
     /**
-     * Accepts all hits for a child and moves the hit depth. This should only be called
-     * within [siblingHits] to allow multiple siblings to have hit results.
+     * Accepts all hits for a child and moves the hit depth. This should only be called within
+     * [siblingHits] to allow multiple siblings to have hit results.
      */
     fun acceptHits() {
         hitDepth = size - 1
@@ -92,8 +92,8 @@
     }
 
     /**
-     * Records [node] as a hit, adding it to the [HitTestResult] or replacing the existing one.
-     * Runs [childHitTest] to do further hit testing for children.
+     * Records [node] as a hit, adding it to the [HitTestResult] or replacing the existing one. Runs
+     * [childHitTest] to do further hit testing for children.
      */
     fun hit(node: Modifier.Node, isInLayer: Boolean, childHitTest: () -> Unit) {
         hitInMinimumTouchTarget(node, -1f, isInLayer, childHitTest)
@@ -103,8 +103,8 @@
     }
 
     /**
-     * Records [node] as a hit with [distanceFromEdge] distance, replacing any existing record.
-     * Runs [childHitTest] to do further hit testing for children.
+     * Records [node] as a hit with [distanceFromEdge] distance, replacing any existing record. Runs
+     * [childHitTest] to do further hit testing for children.
      */
     fun hitInMinimumTouchTarget(
         node: Modifier.Node,
@@ -124,10 +124,9 @@
     }
 
     /**
-     * Temporarily records [node] as a hit with [distanceFromEdge] distance and calls
-     * [childHitTest] to record hits for children. If no children have hits, then
-     * the hit is discarded. If a child had a hit, then [node] replaces an existing
-     * hit.
+     * Temporarily records [node] as a hit with [distanceFromEdge] distance and calls [childHitTest]
+     * to record hits for children. If no children have hits, then the hit is discarded. If a child
+     * had a hit, then [node] replaces an existing hit.
      */
     fun speculativeHit(
         node: Modifier.Node,
@@ -176,9 +175,8 @@
     }
 
     /**
-     * Allow multiple sibling children to have a target hit within a Layout.
-     * Use [acceptHits] within [block] to mark a child's hits as accepted and
-     * proceed to hit test more children.
+     * Allow multiple sibling children to have a target hit within a Layout. Use [acceptHits] within
+     * [block] to mark a child's hits as accepted and proceed to hit test more children.
      */
     inline fun siblingHits(block: () -> Unit) {
         val depth = hitDepth
@@ -237,9 +235,7 @@
     override fun subList(fromIndex: Int, toIndex: Int): List<Modifier.Node> =
         SubList(fromIndex, toIndex)
 
-    /**
-     * Clears all entries to make an empty list.
-     */
+    /** Clears all entries to make an empty list. */
     fun clear() {
         hitDepth = -1
         resizeToHitDepth()
@@ -266,10 +262,7 @@
         override fun previousIndex(): Int = index - minIndex - 1
     }
 
-    private inner class SubList(
-        val minIndex: Int,
-        val maxIndex: Int
-    ) : List<Modifier.Node> {
+    private inner class SubList(val minIndex: Int, val maxIndex: Int) : List<Modifier.Node> {
         override val size: Int
             get() = maxIndex - minIndex
 
diff --git a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/node/InnerNodeCoordinator.kt b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/node/InnerNodeCoordinator.kt
index 3b79baa..e3a05b1 100644
--- a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/node/InnerNodeCoordinator.kt
+++ b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/node/InnerNodeCoordinator.kt
@@ -42,6 +42,7 @@
     // has been run on the tail node, then we can assume that it is a chain update. Importantly,
     // this is different than using isAttached.
     var attachHasBeenRun = false
+
     override fun toString(): String {
         return "<tail>"
     }
@@ -55,15 +56,11 @@
     }
 }
 
-internal class InnerNodeCoordinator(
-    layoutNode: LayoutNode
-) : NodeCoordinator(layoutNode) {
-    @OptIn(ExperimentalComposeUiApi::class)
-    override val tail = TailModifierNode()
+internal class InnerNodeCoordinator(layoutNode: LayoutNode) : NodeCoordinator(layoutNode) {
+    @OptIn(ExperimentalComposeUiApi::class) override val tail = TailModifierNode()
 
     init {
-        @OptIn(ExperimentalComposeUiApi::class)
-        tail.updateCoordinator(this)
+        @OptIn(ExperimentalComposeUiApi::class) tail.updateCoordinator(this)
     }
 
     override var lookaheadDelegate: LookaheadDelegate? =
@@ -74,42 +71,35 @@
         // Lookahead measure
         override fun measure(constraints: Constraints): Placeable =
             performingMeasure(constraints) {
-                // before rerunning the user's measure block reset previous measuredByParent for children
+                // before rerunning the user's measure block reset previous measuredByParent for
+                // children
                 layoutNode.forEachChild {
-                    it.lookaheadPassDelegate!!.measuredByParent =
-                        LayoutNode.UsageByParent.NotUsed
+                    it.lookaheadPassDelegate!!.measuredByParent = LayoutNode.UsageByParent.NotUsed
                 }
-                val measureResult = with(layoutNode.measurePolicy) {
-                    measure(
-                        layoutNode.childLookaheadMeasurables,
-                        constraints
-                    )
-                }
+                val measureResult =
+                    with(layoutNode.measurePolicy) {
+                        measure(layoutNode.childLookaheadMeasurables, constraints)
+                    }
                 measureResult
             }
 
         override fun calculateAlignmentLine(alignmentLine: AlignmentLine): Int {
-            return (alignmentLinesOwner
-                .calculateAlignmentLines()[alignmentLine] ?: AlignmentLine.Unspecified).also {
-                cachedAlignmentLinesMap[alignmentLine] = it
-            }
+            return (alignmentLinesOwner.calculateAlignmentLines()[alignmentLine]
+                    ?: AlignmentLine.Unspecified)
+                .also { cachedAlignmentLinesMap[alignmentLine] = it }
         }
 
         override fun placeChildren() {
             layoutNode.lookaheadPassDelegate!!.onNodePlaced()
         }
 
-        override fun minIntrinsicWidth(height: Int) =
-            layoutNode.minLookaheadIntrinsicWidth(height)
+        override fun minIntrinsicWidth(height: Int) = layoutNode.minLookaheadIntrinsicWidth(height)
 
-        override fun minIntrinsicHeight(width: Int) =
-            layoutNode.minLookaheadIntrinsicHeight(width)
+        override fun minIntrinsicHeight(width: Int) = layoutNode.minLookaheadIntrinsicHeight(width)
 
-        override fun maxIntrinsicWidth(height: Int) =
-            layoutNode.maxLookaheadIntrinsicWidth(height)
+        override fun maxIntrinsicWidth(height: Int) = layoutNode.maxLookaheadIntrinsicWidth(height)
 
-        override fun maxIntrinsicHeight(width: Int) =
-            layoutNode.maxLookaheadIntrinsicHeight(width)
+        override fun maxIntrinsicHeight(width: Int) = layoutNode.maxLookaheadIntrinsicHeight(width)
     }
 
     override fun ensureLookaheadDelegateCreated() {
@@ -119,43 +109,36 @@
     }
 
     override fun measure(constraints: Constraints): Placeable {
-        @Suppress("NAME_SHADOWING") val constraints =
+        @Suppress("NAME_SHADOWING")
+        val constraints =
             if (forceMeasureWithLookaheadConstraints) {
                 lookaheadDelegate!!.constraints
             } else {
                 constraints
             }
         return performingMeasure(constraints) {
-            // before rerunning the user's measure block reset previous measuredByParent for children
+            // before rerunning the user's measure block reset previous measuredByParent for
+            // children
             layoutNode.forEachChild {
                 it.measurePassDelegate.measuredByParent = LayoutNode.UsageByParent.NotUsed
             }
 
-            measureResult = with(layoutNode.measurePolicy) {
-                measure(layoutNode.childMeasurables, constraints)
-            }
+            measureResult =
+                with(layoutNode.measurePolicy) { measure(layoutNode.childMeasurables, constraints) }
             onMeasured()
             this
         }
     }
 
-    override fun minIntrinsicWidth(height: Int) =
-        layoutNode.minIntrinsicWidth(height)
+    override fun minIntrinsicWidth(height: Int) = layoutNode.minIntrinsicWidth(height)
 
-    override fun minIntrinsicHeight(width: Int) =
-        layoutNode.minIntrinsicHeight(width)
+    override fun minIntrinsicHeight(width: Int) = layoutNode.minIntrinsicHeight(width)
 
-    override fun maxIntrinsicWidth(height: Int) =
-        layoutNode.maxIntrinsicWidth(height)
+    override fun maxIntrinsicWidth(height: Int) = layoutNode.maxIntrinsicWidth(height)
 
-    override fun maxIntrinsicHeight(width: Int) =
-        layoutNode.maxIntrinsicHeight(width)
+    override fun maxIntrinsicHeight(width: Int) = layoutNode.maxIntrinsicHeight(width)
 
-    override fun placeAt(
-        position: IntOffset,
-        zIndex: Float,
-        layer: GraphicsLayer
-    ) {
+    override fun placeAt(position: IntOffset, zIndex: Float, layer: GraphicsLayer) {
         super.placeAt(position, zIndex, layer)
         onAfterPlaceAt()
     }
@@ -184,8 +167,7 @@
 
     override fun calculateAlignmentLine(alignmentLine: AlignmentLine): Int {
         return lookaheadDelegate?.calculateAlignmentLine(alignmentLine)
-            ?: alignmentLinesOwner
-                .calculateAlignmentLines()[alignmentLine]
+            ?: alignmentLinesOwner.calculateAlignmentLines()[alignmentLine]
             ?: AlignmentLine.Unspecified
     }
 
@@ -215,8 +197,9 @@
         if (hitTestSource.shouldHitTestChildren(layoutNode)) {
             if (withinLayerBounds(pointerPosition)) {
                 hitTestChildren = true
-            } else if (isTouchEvent &&
-                distanceInMinimumTouchTarget(pointerPosition, minimumTouchTargetSize).isFinite()
+            } else if (
+                isTouchEvent &&
+                    distanceInMinimumTouchTarget(pointerPosition, minimumTouchTargetSize).isFinite()
             ) {
                 inLayer = false
                 hitTestChildren = true
@@ -225,7 +208,8 @@
 
         if (hitTestChildren) {
             hitTestResult.siblingHits {
-                // Any because as soon as true is returned, we know we have found a hit path and we must
+                // Any because as soon as true is returned, we know we have found a hit path and we
+                // must
                 // not add hit results on different paths so we should not even go looking.
                 layoutNode.zSortedChildren.reversedAny { child ->
                     if (child.isPlaced) {
@@ -256,10 +240,11 @@
     }
 
     internal companion object {
-        val innerBoundsPaint = Paint().also { paint ->
-            paint.color = Color.Red
-            paint.strokeWidth = 1f
-            paint.style = PaintingStyle.Stroke
-        }
+        val innerBoundsPaint =
+            Paint().also { paint ->
+                paint.color = Color.Red
+                paint.strokeWidth = 1f
+                paint.style = PaintingStyle.Stroke
+            }
     }
 }
diff --git a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/node/InternalCoreApi.kt b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/node/InternalCoreApi.kt
index 57e2bfb..e0ab046 100644
--- a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/node/InternalCoreApi.kt
+++ b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/node/InternalCoreApi.kt
@@ -18,8 +18,11 @@
 
 @RequiresOptIn(message = "This API is internal to library.")
 @Target(
-    AnnotationTarget.CLASS, AnnotationTarget.FUNCTION, AnnotationTarget.PROPERTY,
-    AnnotationTarget.PROPERTY_GETTER, AnnotationTarget.PROPERTY_SETTER
+    AnnotationTarget.CLASS,
+    AnnotationTarget.FUNCTION,
+    AnnotationTarget.PROPERTY,
+    AnnotationTarget.PROPERTY_GETTER,
+    AnnotationTarget.PROPERTY_SETTER
 )
 @Retention(AnnotationRetention.BINARY)
 annotation class InternalCoreApi
diff --git a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/node/IntrinsicsPolicy.kt b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/node/IntrinsicsPolicy.kt
index bcd4eb4..cec5af0 100644
--- a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/node/IntrinsicsPolicy.kt
+++ b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/node/IntrinsicsPolicy.kt
@@ -22,9 +22,9 @@
 import androidx.compose.ui.layout.MeasurePolicy
 
 /**
- * Calculates intrinsic measurements. The queries are backed by state depending on the layout
- * node's [MeasurePolicy], such that when the policy is changing, ancestors depending on the
- * result of these intrinsic measurements have their own layout recalculated.
+ * Calculates intrinsic measurements. The queries are backed by state depending on the layout node's
+ * [MeasurePolicy], such that when the policy is changing, ancestors depending on the result of
+ * these intrinsic measurements have their own layout recalculated.
  */
 internal class IntrinsicsPolicy(val layoutNode: LayoutNode, policy: MeasurePolicy) {
     private var measurePolicyState: MeasurePolicy by mutableStateOf(policy)
@@ -33,47 +33,55 @@
         measurePolicyState = measurePolicy
     }
 
-    fun minIntrinsicWidth(height: Int) = with(measurePolicyState) {
-        layoutNode.outerCoordinator.minIntrinsicWidth(layoutNode.childMeasurables, height)
-    }
+    fun minIntrinsicWidth(height: Int) =
+        with(measurePolicyState) {
+            layoutNode.outerCoordinator.minIntrinsicWidth(layoutNode.childMeasurables, height)
+        }
 
-    fun minIntrinsicHeight(width: Int) = with(measurePolicyState) {
-        layoutNode.outerCoordinator.minIntrinsicHeight(layoutNode.childMeasurables, width)
-    }
+    fun minIntrinsicHeight(width: Int) =
+        with(measurePolicyState) {
+            layoutNode.outerCoordinator.minIntrinsicHeight(layoutNode.childMeasurables, width)
+        }
 
-    fun maxIntrinsicWidth(height: Int) = with(measurePolicyState) {
-        layoutNode.outerCoordinator.maxIntrinsicWidth(layoutNode.childMeasurables, height)
-    }
+    fun maxIntrinsicWidth(height: Int) =
+        with(measurePolicyState) {
+            layoutNode.outerCoordinator.maxIntrinsicWidth(layoutNode.childMeasurables, height)
+        }
 
-    fun maxIntrinsicHeight(width: Int) = with(measurePolicyState) {
-        layoutNode.outerCoordinator.maxIntrinsicHeight(layoutNode.childMeasurables, width)
-    }
+    fun maxIntrinsicHeight(width: Int) =
+        with(measurePolicyState) {
+            layoutNode.outerCoordinator.maxIntrinsicHeight(layoutNode.childMeasurables, width)
+        }
 
-    fun minLookaheadIntrinsicWidth(height: Int) = with(measurePolicyState) {
-        layoutNode.outerCoordinator.minIntrinsicWidth(
-            layoutNode.childLookaheadMeasurables,
-            height
-        )
-    }
+    fun minLookaheadIntrinsicWidth(height: Int) =
+        with(measurePolicyState) {
+            layoutNode.outerCoordinator.minIntrinsicWidth(
+                layoutNode.childLookaheadMeasurables,
+                height
+            )
+        }
 
-    fun minLookaheadIntrinsicHeight(width: Int) = with(measurePolicyState) {
-        layoutNode.outerCoordinator.minIntrinsicHeight(
-            layoutNode.childLookaheadMeasurables,
-            width
-        )
-    }
+    fun minLookaheadIntrinsicHeight(width: Int) =
+        with(measurePolicyState) {
+            layoutNode.outerCoordinator.minIntrinsicHeight(
+                layoutNode.childLookaheadMeasurables,
+                width
+            )
+        }
 
-    fun maxLookaheadIntrinsicWidth(height: Int) = with(measurePolicyState) {
-        layoutNode.outerCoordinator.maxIntrinsicWidth(
-            layoutNode.childLookaheadMeasurables,
-            height
-        )
-    }
+    fun maxLookaheadIntrinsicWidth(height: Int) =
+        with(measurePolicyState) {
+            layoutNode.outerCoordinator.maxIntrinsicWidth(
+                layoutNode.childLookaheadMeasurables,
+                height
+            )
+        }
 
-    fun maxLookaheadIntrinsicHeight(width: Int) = with(measurePolicyState) {
-        layoutNode.outerCoordinator.maxIntrinsicHeight(
-            layoutNode.childLookaheadMeasurables,
-            width
-        )
-    }
+    fun maxLookaheadIntrinsicHeight(width: Int) =
+        with(measurePolicyState) {
+            layoutNode.outerCoordinator.maxIntrinsicHeight(
+                layoutNode.childLookaheadMeasurables,
+                width
+            )
+        }
 }
diff --git a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/node/LayoutAwareModifierNode.kt b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/node/LayoutAwareModifierNode.kt
index 48a6883..6718c52 100644
--- a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/node/LayoutAwareModifierNode.kt
+++ b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/node/LayoutAwareModifierNode.kt
@@ -30,15 +30,18 @@
  * [androidx.compose.ui.layout.OnPlacedModifier]
  *
  * Example usage:
+ *
  * @sample androidx.compose.ui.samples.OnSizeChangedSample
+ *
  * @sample androidx.compose.ui.samples.OnPlaced
+ *
  * @sample androidx.compose.ui.samples.LayoutAwareModifierNodeSample
  */
 interface LayoutAwareModifierNode : DelegatableNode {
     /**
-     * [onPlaced] is called after the parent [LayoutModifier] and parent layout has
-     * been placed and before child [LayoutModifier] is placed. This allows child
-     * [LayoutModifier] to adjust its own placement based on where the parent is.
+     * [onPlaced] is called after the parent [LayoutModifier] and parent layout has been placed and
+     * before child [LayoutModifier] is placed. This allows child [LayoutModifier] to adjust its own
+     * placement based on where the parent is.
      *
      * If you only need to access the current [LayoutCoordinates] at a single point in time from
      * outside this method, use [currentLayoutCoordinates].
@@ -46,8 +49,8 @@
     fun onPlaced(coordinates: LayoutCoordinates) {}
 
     /**
-     * This method is called when the layout content is remeasured. The
-     * most common usage is [onSizeChanged].
+     * This method is called when the layout content is remeasured. The most common usage is
+     * [onSizeChanged].
      */
     fun onRemeasured(size: IntSize) {}
 }
diff --git a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/node/LayoutModifierNode.kt b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/node/LayoutModifierNode.kt
index 641eaae..0acd408 100644
--- a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/node/LayoutModifierNode.kt
+++ b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/node/LayoutModifierNode.kt
@@ -36,11 +36,11 @@
 import androidx.compose.ui.unit.IntSize
 
 /**
- * A [Modifier.Node] that changes how its wrapped content is measured and laid out.
- * It has the same measurement and layout functionality as the [androidx.compose.ui.layout.Layout]
- * component, while wrapping exactly one layout due to it being a modifier. In contrast,
- * the [androidx.compose.ui.layout.Layout] component is used to define the layout behavior of
- * multiple children.
+ * A [Modifier.Node] that changes how its wrapped content is measured and laid out. It has the same
+ * measurement and layout functionality as the [androidx.compose.ui.layout.Layout] component, while
+ * wrapping exactly one layout due to it being a modifier. In contrast, the
+ * [androidx.compose.ui.layout.Layout] component is used to define the layout behavior of multiple
+ * children.
  *
  * This is the [androidx.compose.ui.Modifier.Node] equivalent of
  * [androidx.compose.ui.layout.LayoutModifier]
@@ -51,93 +51,64 @@
  */
 interface LayoutModifierNode : DelegatableNode {
     /**
-     * The function used to measure the modifier. The [measurable] corresponds to the
-     * wrapped content, and it can be measured with the desired constraints according
-     * to the logic of the [LayoutModifierNode]. The modifier needs to choose its own
-     * size, which can depend on the size chosen by the wrapped content (the obtained
-     * [Placeable]), if the wrapped content was measured. The size needs to be returned
-     * as part of a [MeasureResult], alongside the placement logic of the
-     * [Placeable], which defines how the wrapped content should be positioned inside
-     * the [LayoutModifierNode]. A convenient way to create the [MeasureResult]
-     * is to use the [MeasureScope.layout] factory function.
+     * The function used to measure the modifier. The [measurable] corresponds to the wrapped
+     * content, and it can be measured with the desired constraints according to the logic of the
+     * [LayoutModifierNode]. The modifier needs to choose its own size, which can depend on the size
+     * chosen by the wrapped content (the obtained [Placeable]), if the wrapped content was
+     * measured. The size needs to be returned as part of a [MeasureResult], alongside the placement
+     * logic of the [Placeable], which defines how the wrapped content should be positioned inside
+     * the [LayoutModifierNode]. A convenient way to create the [MeasureResult] is to use the
+     * [MeasureScope.layout] factory function.
      *
      * A [LayoutModifierNode] uses the same measurement and layout concepts and principles as a
      * [androidx.compose.ui.layout.Layout], the only difference is that they apply to exactly one
      * child. For a more detailed explanation of measurement and layout, see
      * [androidx.compose.ui.layout.MeasurePolicy].
      */
-    fun MeasureScope.measure(
-        measurable: Measurable,
-        constraints: Constraints
-    ): MeasureResult
+    fun MeasureScope.measure(measurable: Measurable, constraints: Constraints): MeasureResult
 
-    /**
-     * The function used to calculate [IntrinsicMeasurable.minIntrinsicWidth].
-     */
-    fun IntrinsicMeasureScope.minIntrinsicWidth(
-        measurable: IntrinsicMeasurable,
-        height: Int
-    ): Int = NodeMeasuringIntrinsics.minWidth(
-        { intrinsicMeasurable, constraints ->
-            measure(intrinsicMeasurable, constraints)
-        },
-        this,
-        measurable,
-        height
-    )
+    /** The function used to calculate [IntrinsicMeasurable.minIntrinsicWidth]. */
+    fun IntrinsicMeasureScope.minIntrinsicWidth(measurable: IntrinsicMeasurable, height: Int): Int =
+        NodeMeasuringIntrinsics.minWidth(
+            { intrinsicMeasurable, constraints -> measure(intrinsicMeasurable, constraints) },
+            this,
+            measurable,
+            height
+        )
 
-    /**
-     * The lambda used to calculate [IntrinsicMeasurable.minIntrinsicHeight].
-     */
-    fun IntrinsicMeasureScope.minIntrinsicHeight(
-        measurable: IntrinsicMeasurable,
-        width: Int
-    ): Int = NodeMeasuringIntrinsics.minHeight(
-        { intrinsicMeasurable, constraints ->
-            measure(intrinsicMeasurable, constraints)
-        },
-        this,
-        measurable,
-        width
-    )
+    /** The lambda used to calculate [IntrinsicMeasurable.minIntrinsicHeight]. */
+    fun IntrinsicMeasureScope.minIntrinsicHeight(measurable: IntrinsicMeasurable, width: Int): Int =
+        NodeMeasuringIntrinsics.minHeight(
+            { intrinsicMeasurable, constraints -> measure(intrinsicMeasurable, constraints) },
+            this,
+            measurable,
+            width
+        )
 
-    /**
-     * The function used to calculate [IntrinsicMeasurable.maxIntrinsicWidth].
-     */
-    fun IntrinsicMeasureScope.maxIntrinsicWidth(
-        measurable: IntrinsicMeasurable,
-        height: Int
-    ): Int {
+    /** The function used to calculate [IntrinsicMeasurable.maxIntrinsicWidth]. */
+    fun IntrinsicMeasureScope.maxIntrinsicWidth(measurable: IntrinsicMeasurable, height: Int): Int {
         return NodeMeasuringIntrinsics.maxWidth(
-            { intrinsicMeasurable, constraints ->
-                measure(intrinsicMeasurable, constraints)
-            },
+            { intrinsicMeasurable, constraints -> measure(intrinsicMeasurable, constraints) },
             this,
             measurable,
             height
         )
     }
 
-    /**
-     * The lambda used to calculate [IntrinsicMeasurable.maxIntrinsicHeight].
-     */
-    fun IntrinsicMeasureScope.maxIntrinsicHeight(
-        measurable: IntrinsicMeasurable,
-        width: Int
-    ): Int = NodeMeasuringIntrinsics.maxHeight(
-        { intrinsicMeasurable, constraints ->
-            measure(intrinsicMeasurable, constraints)
-        },
-        this,
-        measurable,
-        width
-    )
+    /** The lambda used to calculate [IntrinsicMeasurable.maxIntrinsicHeight]. */
+    fun IntrinsicMeasureScope.maxIntrinsicHeight(measurable: IntrinsicMeasurable, width: Int): Int =
+        NodeMeasuringIntrinsics.maxHeight(
+            { intrinsicMeasurable, constraints -> measure(intrinsicMeasurable, constraints) },
+            this,
+            measurable,
+            width
+        )
 }
 
 /**
- * Performs the node remeasuring synchronously even if the node was not marked as needs
- * remeasure before. Useful for cases like when during scrolling you need to re-execute the
- * measure block to consume the scroll offset and remeasure your children in a blocking way.
+ * Performs the node remeasuring synchronously even if the node was not marked as needs remeasure
+ * before. Useful for cases like when during scrolling you need to re-execute the measure block to
+ * consume the scroll offset and remeasure your children in a blocking way.
  */
 fun LayoutModifierNode.remeasureSync() = requireLayoutNode().forceRemeasure()
 
@@ -145,18 +116,17 @@
  * This will invalidate the current node's layer, and ensure that the layer is redrawn for the next
  * frame.
  */
-fun LayoutModifierNode.invalidateLayer() =
-    requireCoordinator(Nodes.Layout).invalidateLayer()
+fun LayoutModifierNode.invalidateLayer() = requireCoordinator(Nodes.Layout).invalidateLayer()
 
 /**
- * This will invalidate the current node's placement result, and ensure that relayout
- * (the placement block rerun) of this node will happen for the next frame .
+ * This will invalidate the current node's placement result, and ensure that relayout (the placement
+ * block rerun) of this node will happen for the next frame .
  */
 fun LayoutModifierNode.invalidatePlacement() = requireLayoutNode().requestRelayout()
 
 /**
- * This invalidates the current node's measure result, and ensures that a re-measurement
- * (the measurement block rerun) of this node will happen for the next frame.
+ * This invalidates the current node's measure result, and ensures that a re-measurement (the
+ * measurement block rerun) of this node will happen for the next frame.
  */
 fun LayoutModifierNode.invalidateMeasurement() = requireLayoutNode().invalidateMeasurements()
 
@@ -182,18 +152,21 @@
         intrinsicMeasurable: IntrinsicMeasurable,
         h: Int
     ): Int {
-        val measurable = DefaultIntrinsicMeasurable(
-            intrinsicMeasurable,
-            IntrinsicMinMax.Min,
-            IntrinsicWidthHeight.Width
-        )
+        val measurable =
+            DefaultIntrinsicMeasurable(
+                intrinsicMeasurable,
+                IntrinsicMinMax.Min,
+                IntrinsicWidthHeight.Width
+            )
         val constraints = Constraints(maxHeight = h)
-        val layoutResult = with(measureBlock) {
-            ApproachIntrinsicsMeasureScope(
-                intrinsicMeasureScope,
-                intrinsicMeasureScope.layoutDirection
-            ).measure(measurable, constraints)
-        }
+        val layoutResult =
+            with(measureBlock) {
+                ApproachIntrinsicsMeasureScope(
+                        intrinsicMeasureScope,
+                        intrinsicMeasureScope.layoutDirection
+                    )
+                    .measure(measurable, constraints)
+            }
         return layoutResult.width
     }
 
@@ -203,18 +176,21 @@
         intrinsicMeasurable: IntrinsicMeasurable,
         w: Int
     ): Int {
-        val measurable = DefaultIntrinsicMeasurable(
-            intrinsicMeasurable,
-            IntrinsicMinMax.Min,
-            IntrinsicWidthHeight.Height
-        )
+        val measurable =
+            DefaultIntrinsicMeasurable(
+                intrinsicMeasurable,
+                IntrinsicMinMax.Min,
+                IntrinsicWidthHeight.Height
+            )
         val constraints = Constraints(maxWidth = w)
-        val layoutResult = with(measureBlock) {
-            ApproachIntrinsicsMeasureScope(
-                intrinsicMeasureScope,
-                intrinsicMeasureScope.layoutDirection
-            ).measure(measurable, constraints)
-        }
+        val layoutResult =
+            with(measureBlock) {
+                ApproachIntrinsicsMeasureScope(
+                        intrinsicMeasureScope,
+                        intrinsicMeasureScope.layoutDirection
+                    )
+                    .measure(measurable, constraints)
+            }
         return layoutResult.height
     }
 
@@ -224,18 +200,21 @@
         intrinsicMeasurable: IntrinsicMeasurable,
         h: Int
     ): Int {
-        val measurable = DefaultIntrinsicMeasurable(
-            intrinsicMeasurable,
-            IntrinsicMinMax.Max,
-            IntrinsicWidthHeight.Width
-        )
+        val measurable =
+            DefaultIntrinsicMeasurable(
+                intrinsicMeasurable,
+                IntrinsicMinMax.Max,
+                IntrinsicWidthHeight.Width
+            )
         val constraints = Constraints(maxHeight = h)
-        val layoutResult = with(measureBlock) {
-            ApproachIntrinsicsMeasureScope(
-                intrinsicMeasureScope,
-                intrinsicMeasureScope.layoutDirection
-            ).measure(measurable, constraints)
-        }
+        val layoutResult =
+            with(measureBlock) {
+                ApproachIntrinsicsMeasureScope(
+                        intrinsicMeasureScope,
+                        intrinsicMeasureScope.layoutDirection
+                    )
+                    .measure(measurable, constraints)
+            }
         return layoutResult.width
     }
 
@@ -245,18 +224,21 @@
         intrinsicMeasurable: IntrinsicMeasurable,
         w: Int
     ): Int {
-        val measurable = DefaultIntrinsicMeasurable(
-            intrinsicMeasurable,
-            IntrinsicMinMax.Max,
-            IntrinsicWidthHeight.Height
-        )
+        val measurable =
+            DefaultIntrinsicMeasurable(
+                intrinsicMeasurable,
+                IntrinsicMinMax.Max,
+                IntrinsicWidthHeight.Height
+            )
         val constraints = Constraints(maxWidth = w)
-        val layoutResult = with(measureBlock) {
-            ApproachIntrinsicsMeasureScope(
-                intrinsicMeasureScope,
-                intrinsicMeasureScope.layoutDirection
-            ).measure(measurable, constraints)
-        }
+        val layoutResult =
+            with(measureBlock) {
+                ApproachIntrinsicsMeasureScope(
+                        intrinsicMeasureScope,
+                        intrinsicMeasureScope.layoutDirection
+                    )
+                    .measure(measurable, constraints)
+            }
         return layoutResult.height
     }
 
@@ -266,18 +248,17 @@
         intrinsicMeasurable: IntrinsicMeasurable,
         h: Int
     ): Int {
-        val measurable = DefaultIntrinsicMeasurable(
-            intrinsicMeasurable,
-            IntrinsicMinMax.Min,
-            IntrinsicWidthHeight.Width
-        )
+        val measurable =
+            DefaultIntrinsicMeasurable(
+                intrinsicMeasurable,
+                IntrinsicMinMax.Min,
+                IntrinsicWidthHeight.Width
+            )
         val constraints = Constraints(maxHeight = h)
         val layoutResult =
             with(measureBlock) {
-                IntrinsicsMeasureScope(
-                    intrinsicMeasureScope,
-                    intrinsicMeasureScope.layoutDirection
-                ).measure(measurable, constraints)
+                IntrinsicsMeasureScope(intrinsicMeasureScope, intrinsicMeasureScope.layoutDirection)
+                    .measure(measurable, constraints)
             }
 
         return layoutResult.width
@@ -289,16 +270,18 @@
         intrinsicMeasurable: IntrinsicMeasurable,
         w: Int
     ): Int {
-        val measurable = DefaultIntrinsicMeasurable(
-            intrinsicMeasurable,
-            IntrinsicMinMax.Min,
-            IntrinsicWidthHeight.Height
-        )
+        val measurable =
+            DefaultIntrinsicMeasurable(
+                intrinsicMeasurable,
+                IntrinsicMinMax.Min,
+                IntrinsicWidthHeight.Height
+            )
         val constraints = Constraints(maxWidth = w)
-        val layoutResult = with(measureBlock) {
-            IntrinsicsMeasureScope(intrinsicMeasureScope, intrinsicMeasureScope.layoutDirection)
-                .measure(measurable, constraints)
-        }
+        val layoutResult =
+            with(measureBlock) {
+                IntrinsicsMeasureScope(intrinsicMeasureScope, intrinsicMeasureScope.layoutDirection)
+                    .measure(measurable, constraints)
+            }
         return layoutResult.height
     }
 
@@ -308,16 +291,18 @@
         intrinsicMeasurable: IntrinsicMeasurable,
         h: Int
     ): Int {
-        val measurable = DefaultIntrinsicMeasurable(
-            intrinsicMeasurable,
-            IntrinsicMinMax.Max,
-            IntrinsicWidthHeight.Width
-        )
+        val measurable =
+            DefaultIntrinsicMeasurable(
+                intrinsicMeasurable,
+                IntrinsicMinMax.Max,
+                IntrinsicWidthHeight.Width
+            )
         val constraints = Constraints(maxHeight = h)
-        val layoutResult = with(measureBlock) {
-            IntrinsicsMeasureScope(intrinsicMeasureScope, intrinsicMeasureScope.layoutDirection)
-                .measure(measurable, constraints)
-        }
+        val layoutResult =
+            with(measureBlock) {
+                IntrinsicsMeasureScope(intrinsicMeasureScope, intrinsicMeasureScope.layoutDirection)
+                    .measure(measurable, constraints)
+            }
         return layoutResult.width
     }
 
@@ -327,16 +312,18 @@
         intrinsicMeasurable: IntrinsicMeasurable,
         w: Int
     ): Int {
-        val measurable = DefaultIntrinsicMeasurable(
-            intrinsicMeasurable,
-            IntrinsicMinMax.Max,
-            IntrinsicWidthHeight.Height
-        )
+        val measurable =
+            DefaultIntrinsicMeasurable(
+                intrinsicMeasurable,
+                IntrinsicMinMax.Max,
+                IntrinsicWidthHeight.Height
+            )
         val constraints = Constraints(maxWidth = w)
-        val layoutResult = with(measureBlock) {
-            IntrinsicsMeasureScope(intrinsicMeasureScope, intrinsicMeasureScope.layoutDirection)
-                .measure(measurable, constraints)
-        }
+        val layoutResult =
+            with(measureBlock) {
+                IntrinsicsMeasureScope(intrinsicMeasureScope, intrinsicMeasureScope.layoutDirection)
+                    .measure(measurable, constraints)
+            }
         return layoutResult.height
     }
 
@@ -350,20 +337,22 @@
 
         override fun measure(constraints: Constraints): Placeable {
             if (widthHeight == IntrinsicWidthHeight.Width) {
-                val width = if (minMax == IntrinsicMinMax.Max) {
-                    measurable.maxIntrinsicWidth(constraints.maxHeight)
-                } else {
-                    measurable.minIntrinsicWidth(constraints.maxHeight)
-                }
+                val width =
+                    if (minMax == IntrinsicMinMax.Max) {
+                        measurable.maxIntrinsicWidth(constraints.maxHeight)
+                    } else {
+                        measurable.minIntrinsicWidth(constraints.maxHeight)
+                    }
                 val height =
                     if (constraints.hasBoundedHeight) constraints.maxHeight else LargeDimension
                 return EmptyPlaceable(width, height)
             }
-            val height = if (minMax == IntrinsicMinMax.Max) {
-                measurable.maxIntrinsicHeight(constraints.maxWidth)
-            } else {
-                measurable.minIntrinsicHeight(constraints.maxWidth)
-            }
+            val height =
+                if (minMax == IntrinsicMinMax.Max) {
+                    measurable.maxIntrinsicHeight(constraints.maxWidth)
+                } else {
+                    measurable.minIntrinsicHeight(constraints.maxWidth)
+                }
             val width = if (constraints.hasBoundedWidth) constraints.maxWidth else LargeDimension
             return EmptyPlaceable(width, height)
         }
@@ -391,14 +380,21 @@
         }
 
         override fun get(alignmentLine: AlignmentLine): Int = AlignmentLine.Unspecified
+
         override fun placeAt(
             position: IntOffset,
             zIndex: Float,
             layerBlock: (GraphicsLayerScope.() -> Unit)?
-        ) {
-        }
+        ) {}
     }
 
-    private enum class IntrinsicMinMax { Min, Max }
-    private enum class IntrinsicWidthHeight { Width, Height }
+    private enum class IntrinsicMinMax {
+        Min,
+        Max
+    }
+
+    private enum class IntrinsicWidthHeight {
+        Width,
+        Height
+    }
 }
diff --git a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/node/LayoutModifierNodeCoordinator.kt b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/node/LayoutModifierNodeCoordinator.kt
index 336fd64..13d6356 100644
--- a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/node/LayoutModifierNodeCoordinator.kt
+++ b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/node/LayoutModifierNodeCoordinator.kt
@@ -48,9 +48,9 @@
                 // the node to not be ApproachLayoutModifierNode in most cases.
                 if (value.node.isKind(Nodes.ApproachMeasure)) {
                     value as ApproachLayoutModifierNode
-                    approachMeasureScope = approachMeasureScope?.also {
-                        it.approachNode = value
-                    } ?: ApproachMeasureScopeImpl(this, value)
+                    approachMeasureScope =
+                        approachMeasureScope?.also { it.approachNode = value }
+                            ?: ApproachMeasureScopeImpl(this, value)
                 } else {
                     approachMeasureScope = null
                 }
@@ -61,7 +61,8 @@
     override val tail: Modifier.Node
         get() = layoutModifierNode.node
 
-    val wrappedNonNull: NodeCoordinator get() = wrapped!!
+    val wrappedNonNull: NodeCoordinator
+        get() = wrapped!!
 
     internal var lookaheadConstraints: Constraints? = null
 
@@ -69,11 +70,11 @@
         if (layoutNode.lookaheadRoot != null) LookaheadDelegateForLayoutModifierNode() else null
 
     /**
-     * Lazily initialized IntermediateMeasureScope. This is only initialized when the
-     * current modifier is an ApproachLayoutModifierNode.
+     * Lazily initialized IntermediateMeasureScope. This is only initialized when the current
+     * modifier is an ApproachLayoutModifierNode.
      */
     private var approachMeasureScope: ApproachMeasureScopeImpl? =
-    // Opt for a cheaper type check (via bit operation) before casting, as we anticipate
+        // Opt for a cheaper type check (via bit operation) before casting, as we anticipate
         // the node to not be ApproachLayoutModifierNode in most cases.
         if (measureNode.node.isKind(Nodes.ApproachMeasure)) {
             ApproachMeasureScopeImpl(this, measureNode as ApproachLayoutModifierNode)
@@ -81,8 +82,8 @@
 
     /**
      * LookaheadDelegate impl for when the modifier is any [LayoutModifier] except
-     * IntermediateLayoutModifier. This impl will invoke [LayoutModifier.measure] for
-     * the lookahead measurement.
+     * IntermediateLayoutModifier. This impl will invoke [LayoutModifier.measure] for the lookahead
+     * measurement.
      */
     private inner class LookaheadDelegateForLayoutModifierNode :
         LookaheadDelegate(this@LayoutModifierNodeCoordinator) {
@@ -147,46 +148,48 @@
 
     override fun measure(constraints: Constraints): Placeable {
         @Suppress("NAME_SHADOWING")
-        val constraints = if (forceMeasureWithLookaheadConstraints) {
-            requireNotNull(lookaheadConstraints) {
-                "Lookahead constraints cannot be null in approach pass."
-            }
-        } else {
-            constraints
-        }
-        performingMeasure(constraints) {
-            measureResult = approachMeasureScope?.let { scope ->
-                // approachMeasureScope is created/updated when layoutModifierNode is set. An
-                // ApproachLayoutModifierNode will lead to a non-null approachMeasureScope.
-                with(scope.approachNode) {
-                    scope.approachMeasureRequired = isMeasurementApproachInProgress(
-                        scope.lookaheadSize
-                    ) || constraints != lookaheadConstraints
-                    if (!scope.approachMeasureRequired) {
-                        // In the future we'll skip the invocation of this measure block when
-                        // no approach is needed. For now, we'll ignore the constraints change
-                        // in the measure block when it's declared approach complete.
-                        wrappedNonNull.forceMeasureWithLookaheadConstraints = true
-                    }
-                    val result = scope.approachMeasure(wrappedNonNull, constraints)
-                    wrappedNonNull.forceMeasureWithLookaheadConstraints = false
-                    val reachedLookaheadSize = result.width == lookaheadDelegate!!.width &&
-                        result.height == lookaheadDelegate!!.height
-                    if (!scope.approachMeasureRequired &&
-                        wrappedNonNull.size == wrappedNonNull.lookaheadDelegate?.size &&
-                        !reachedLookaheadSize
-                    ) {
-                        object : MeasureResult by result {
-                            override val width = lookaheadDelegate!!.width
-                            override val height = lookaheadDelegate!!.height
-                        }
-                    } else {
-                        result
-                    }
+        val constraints =
+            if (forceMeasureWithLookaheadConstraints) {
+                requireNotNull(lookaheadConstraints) {
+                    "Lookahead constraints cannot be null in approach pass."
                 }
-            } ?: with(layoutModifierNode) {
-                measure(wrappedNonNull, constraints)
+            } else {
+                constraints
             }
+        performingMeasure(constraints) {
+            measureResult =
+                approachMeasureScope?.let { scope ->
+                    // approachMeasureScope is created/updated when layoutModifierNode is set. An
+                    // ApproachLayoutModifierNode will lead to a non-null approachMeasureScope.
+                    with(scope.approachNode) {
+                        scope.approachMeasureRequired =
+                            isMeasurementApproachInProgress(scope.lookaheadSize) ||
+                                constraints != lookaheadConstraints
+                        if (!scope.approachMeasureRequired) {
+                            // In the future we'll skip the invocation of this measure block when
+                            // no approach is needed. For now, we'll ignore the constraints change
+                            // in the measure block when it's declared approach complete.
+                            wrappedNonNull.forceMeasureWithLookaheadConstraints = true
+                        }
+                        val result = scope.approachMeasure(wrappedNonNull, constraints)
+                        wrappedNonNull.forceMeasureWithLookaheadConstraints = false
+                        val reachedLookaheadSize =
+                            result.width == lookaheadDelegate!!.width &&
+                                result.height == lookaheadDelegate!!.height
+                        if (
+                            !scope.approachMeasureRequired &&
+                                wrappedNonNull.size == wrappedNonNull.lookaheadDelegate?.size &&
+                                !reachedLookaheadSize
+                        ) {
+                            object : MeasureResult by result {
+                                override val width = lookaheadDelegate!!.width
+                                override val height = lookaheadDelegate!!.height
+                            }
+                        } else {
+                            result
+                        }
+                    }
+                } ?: with(layoutModifierNode) { measure(wrappedNonNull, constraints) }
             this@LayoutModifierNodeCoordinator
         }
         onMeasured()
@@ -198,42 +201,30 @@
             with(approachNode) {
                 minApproachIntrinsicWidth(this@LayoutModifierNodeCoordinator.wrappedNonNull, height)
             }
-        } ?: with(layoutModifierNode) {
-            minIntrinsicWidth(wrappedNonNull, height)
-        }
+        } ?: with(layoutModifierNode) { minIntrinsicWidth(wrappedNonNull, height) }
 
     override fun maxIntrinsicWidth(height: Int): Int =
         approachMeasureScope?.run {
             with(approachNode) {
                 maxApproachIntrinsicWidth(this@LayoutModifierNodeCoordinator.wrappedNonNull, height)
             }
-        } ?: with(layoutModifierNode) {
-            maxIntrinsicWidth(wrappedNonNull, height)
-        }
+        } ?: with(layoutModifierNode) { maxIntrinsicWidth(wrappedNonNull, height) }
 
     override fun minIntrinsicHeight(width: Int): Int =
         approachMeasureScope?.run {
             with(approachNode) {
                 minApproachIntrinsicHeight(this@LayoutModifierNodeCoordinator.wrappedNonNull, width)
             }
-        } ?: with(layoutModifierNode) {
-            minIntrinsicHeight(wrappedNonNull, width)
-        }
+        } ?: with(layoutModifierNode) { minIntrinsicHeight(wrappedNonNull, width) }
 
     override fun maxIntrinsicHeight(width: Int): Int =
         approachMeasureScope?.run {
             with(approachNode) {
                 maxApproachIntrinsicHeight(this@LayoutModifierNodeCoordinator.wrappedNonNull, width)
             }
-        } ?: with(layoutModifierNode) {
-            maxIntrinsicHeight(wrappedNonNull, width)
-        }
+        } ?: with(layoutModifierNode) { maxIntrinsicHeight(wrappedNonNull, width) }
 
-    override fun placeAt(
-        position: IntOffset,
-        zIndex: Float,
-        layer: GraphicsLayer
-    ) {
+    override fun placeAt(position: IntOffset, zIndex: Float, layer: GraphicsLayer) {
         super.placeAt(position, zIndex, layer)
         onAfterPlaceAt()
     }
@@ -257,13 +248,15 @@
         onPlaced()
         approachMeasureScope?.let {
             with(it.approachNode) {
-                val approachComplete = with(placementScope) {
-                    !isPlacementApproachInProgress(
-                        lookaheadDelegate!!.lookaheadLayoutCoordinates
-                    ) && !it.approachMeasureRequired &&
-                        size == lookaheadDelegate?.size &&
-                        wrappedNonNull.size == wrappedNonNull.lookaheadDelegate?.size
-                }
+                val approachComplete =
+                    with(placementScope) {
+                        !isPlacementApproachInProgress(
+                            lookaheadDelegate!!.lookaheadLayoutCoordinates
+                        ) &&
+                            !it.approachMeasureRequired &&
+                            size == lookaheadDelegate?.size &&
+                            wrappedNonNull.size == wrappedNonNull.lookaheadDelegate?.size
+                    }
                 wrappedNonNull.forcePlaceWithLookaheadOffset = approachComplete
             }
         }
@@ -284,11 +277,12 @@
     }
 
     internal companion object {
-        val modifierBoundsPaint = Paint().also { paint ->
-            paint.color = Color.Blue
-            paint.strokeWidth = 1f
-            paint.style = PaintingStyle.Stroke
-        }
+        val modifierBoundsPaint =
+            Paint().also { paint ->
+                paint.color = Color.Blue
+                paint.strokeWidth = 1f
+                paint.style = PaintingStyle.Stroke
+            }
     }
 }
 
diff --git a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/node/LayoutNode.kt b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/node/LayoutNode.kt
index 16bd1ca..c3b299b 100644
--- a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/node/LayoutNode.kt
+++ b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/node/LayoutNode.kt
@@ -68,16 +68,12 @@
 import androidx.compose.ui.viewinterop.InteropView
 import androidx.compose.ui.viewinterop.InteropViewFactoryHolder
 
-/**
- * Enable to log changes to the LayoutNode tree.  This logging is quite chatty.
- */
+/** Enable to log changes to the LayoutNode tree. This logging is quite chatty. */
 private const val DebugChanges = false
 
 private val DefaultDensity = Density(1f)
 
-/**
- * An element in the layout hierarchy, built with compose UI.
- */
+/** An element in the layout hierarchy, built with compose UI. */
 @OptIn(InternalComposeUiApi::class)
 internal class LayoutNode(
     // Virtual LayoutNode is the temporary concept allows us to a node which is not a real node,
@@ -91,7 +87,8 @@
     // The unique semantics ID that is used by all semantics modifiers attached to this LayoutNode.
     // TODO(b/281907968): Implement this with a getter that returns the compositeKeyHash.
     override var semanticsId: Int = generateSemanticsId()
-) : ComposeNodeLifecycleCallback,
+) :
+    ComposeNodeLifecycleCallback,
     Remeasurement,
     OwnerScope,
     LayoutInfo,
@@ -108,8 +105,8 @@
     internal var isVirtualLookaheadRoot: Boolean = false
 
     /**
-     * This lookaheadRoot references the closest root to the LayoutNode, not the top-level
-     * lookahead root.
+     * This lookaheadRoot references the closest root to the LayoutNode, not the top-level lookahead
+     * root.
      */
     internal var lookaheadRoot: LayoutNode? = null
         private set(newRoot) {
@@ -117,9 +114,7 @@
                 field = newRoot
                 if (newRoot != null) {
                     layoutDelegate.ensureLookaheadDelegateCreated()
-                    forEachCoordinatorIncludingInner {
-                        it.ensureLookaheadDelegateCreated()
-                    }
+                    forEachCoordinatorIncludingInner { it.ensureLookaheadDelegateCreated() }
                 }
                 invalidateMeasurements()
             }
@@ -131,10 +126,12 @@
     private var virtualChildrenCount = 0
 
     // the list of nodes containing the virtual children as is
-    private val _foldedChildren = MutableVectorWithMutationTracking(mutableVectorOf<LayoutNode>()) {
-        layoutDelegate.markChildrenDirty()
-    }
-    internal val foldedChildren: List<LayoutNode> get() = _foldedChildren.asList()
+    private val _foldedChildren =
+        MutableVectorWithMutationTracking(mutableVectorOf<LayoutNode>()) {
+            layoutDelegate.markChildrenDirty()
+        }
+    internal val foldedChildren: List<LayoutNode>
+        get() = _foldedChildren.asList()
 
     // the list of nodes where the virtual children are unfolded (their children are represented
     // as our direct children)
@@ -143,9 +140,8 @@
     private fun recreateUnfoldedChildrenIfDirty() {
         if (unfoldedVirtualChildrenListDirty) {
             unfoldedVirtualChildrenListDirty = false
-            val unfoldedChildren = _unfoldedChildren ?: mutableVectorOf<LayoutNode>().also {
-                _unfoldedChildren = it
-            }
+            val unfoldedChildren =
+                _unfoldedChildren ?: mutableVectorOf<LayoutNode>().also { _unfoldedChildren = it }
             unfoldedChildren.clear()
             _foldedChildren.forEach {
                 if (it.isVirtual) {
@@ -167,6 +163,7 @@
     // when the list of our children is modified it will be set to true if we are a virtual node
     // or it will be set to true on a parent if the parent is a virtual node
     private var unfoldedVirtualChildrenListDirty = false
+
     private fun invalidateUnfoldedVirtualChildren() {
         if (virtualChildrenCount > 0) {
             unfoldedVirtualChildrenListDirty = true
@@ -191,9 +188,7 @@
             }
         }
 
-    /**
-     * Update children if the list is not up to date.
-     */
+    /** Update children if the list is not up to date. */
     internal fun updateChildrenIfDirty() {
         if (virtualChildrenCount > 0) {
             recreateUnfoldedChildrenIfDirty()
@@ -201,17 +196,17 @@
     }
 
     inline fun forEachChild(block: (LayoutNode) -> Unit) = _children.forEach(block)
+
     inline fun forEachChildIndexed(block: (Int, LayoutNode) -> Unit) =
         _children.forEachIndexed(block)
 
-    /**
-     * The children of this LayoutNode, controlled by [insertAt], [move], and [removeAt].
-     */
-    internal val children: List<LayoutNode> get() = _children.asMutableList()
+    /** The children of this LayoutNode, controlled by [insertAt], [move], and [removeAt]. */
+    internal val children: List<LayoutNode>
+        get() = _children.asMutableList()
 
     /**
-     * The parent node in the LayoutNode hierarchy. This is `null` when the [LayoutNode]
-     * is not attached to a hierarchy or is the root of the hierarchy.
+     * The parent node in the LayoutNode hierarchy. This is `null` when the [LayoutNode] is not
+     * attached to a hierarchy or is the root of the hierarchy.
      */
     private var _foldedParent: LayoutNode? = null
 
@@ -227,9 +222,7 @@
             return parent
         }
 
-    /**
-     * The view system [Owner]. This `null` until [attach] is called
-     */
+    /** The view system [Owner]. This `null` until [attach] is called */
     internal var owner: Owner? = null
         private set
 
@@ -243,10 +236,11 @@
     override fun getInteropView(): InteropView? = interopViewFactoryHolder?.getInteropView()
 
     /**
-     * Returns true if this [LayoutNode] currently has an [LayoutNode.owner].  Semantically,
-     * this means that the LayoutNode is currently a part of a component tree.
+     * Returns true if this [LayoutNode] currently has an [LayoutNode.owner]. Semantically, this
+     * means that the LayoutNode is currently a part of a component tree.
      */
-    override val isAttached: Boolean get() = owner != null
+    override val isAttached: Boolean
+        get() = owner != null
 
     /**
      * The tree depth of the [LayoutNode]. This is valid only when it is attached to a hierarchy.
@@ -256,15 +250,15 @@
     /**
      * The layout state the node is currently in.
      *
-     * The mutation of [layoutState] is confined to [LayoutNode], and is therefore read-only
-     * outside LayoutNode. This makes the state machine easier to reason about.
+     * The mutation of [layoutState] is confined to [LayoutNode], and is therefore read-only outside
+     * LayoutNode. This makes the state machine easier to reason about.
      */
     internal val layoutState
         get() = layoutDelegate.layoutState
 
     /**
-     * The lookahead pass delegate for the [LayoutNode]. This should only be used for measure
-     * and layout related impl during *lookahead*. For the actual measure & layout, use
+     * The lookahead pass delegate for the [LayoutNode]. This should only be used for measure and
+     * layout related impl during *lookahead*. For the actual measure & layout, use
      * [measurePassDelegate].
      */
     internal val lookaheadPassDelegate
@@ -277,9 +271,7 @@
     internal val measurePassDelegate
         get() = layoutDelegate.measurePassDelegate
 
-    /**
-     * [requestRemeasure] calls will be ignored while this flag is true.
-     */
+    /** [requestRemeasure] calls will be ignored while this flag is true. */
     private var ignoreRemeasureRequests = false
 
     /**
@@ -289,13 +281,17 @@
     internal fun insertAt(index: Int, instance: LayoutNode) {
         checkPrecondition(instance._foldedParent == null) {
             "Cannot insert $instance because it already has a parent." +
-                " This tree: " + debugTreeToString() +
-                " Other tree: " + instance._foldedParent?.debugTreeToString()
+                " This tree: " +
+                debugTreeToString() +
+                " Other tree: " +
+                instance._foldedParent?.debugTreeToString()
         }
         checkPrecondition(instance.owner == null) {
             "Cannot insert $instance because it already has an owner." +
-                " This tree: " + debugTreeToString() +
-                " Other tree: " + instance.debugTreeToString()
+                " This tree: " +
+                debugTreeToString() +
+                " Other tree: " +
+                instance.debugTreeToString()
         }
 
         if (DebugChanges) {
@@ -329,13 +325,9 @@
         }
     }
 
-    /**
-     * Removes one or more children, starting at [index].
-     */
+    /** Removes one or more children, starting at [index]. */
     internal fun removeAt(index: Int, count: Int) {
-        requirePrecondition(count >= 0) {
-            "count ($count) must be greater than 0"
-        }
+        requirePrecondition(count >= 0) { "count ($count) must be greater than 0" }
         for (i in index + count - 1 downTo index) {
             // Call detach callbacks before removing from _foldedChildren, so the child is still
             // visible to parents traversing downwards, such as when clearing focus.
@@ -347,9 +339,7 @@
         }
     }
 
-    /**
-     * Removes all children.
-     */
+    /** Removes all children. */
     internal fun removeAll() {
         for (i in _foldedChildren.size - 1 downTo 0) {
             onChildRemoved(_foldedChildren[i])
@@ -373,9 +363,7 @@
 
         if (child.isVirtual) {
             virtualChildrenCount--
-            child._foldedChildren.forEach {
-                it.outerCoordinator.wrappedBy = null
-            }
+            child._foldedChildren.forEach { it.outerCoordinator.wrappedBy = null }
         }
         invalidateUnfoldedVirtualChildren()
         onZSortedChildrenInvalidated()
@@ -384,9 +372,9 @@
     /**
      * Moves [count] elements starting at index [from] to index [to]. The [to] index is related to
      * the position before the change, so, for example, to move an element at position 1 to after
-     * the element at position 2, [from] should be `1` and [to] should be `3`. If the elements
-     * were LayoutNodes A B C D E, calling `move(1, 3, 1)` would result in the LayoutNodes
-     * being reordered to A C B D E.
+     * the element at position 2, [from] should be `1` and [to] should be `3`. If the elements were
+     * LayoutNodes A B C D E, calling `move(1, 3, 1)` would result in the LayoutNodes being
+     * reordered to A C B D E.
      */
     internal fun move(from: Int, to: Int, count: Int) {
         if (from == to) {
@@ -412,6 +400,7 @@
     }
 
     private var _collapsedSemantics: SemanticsConfiguration? = null
+
     internal fun invalidateSemantics() {
         _collapsedSemantics = null
         // TODO(lmr): this ends up scheduling work that diffs the entire tree, but we should
@@ -446,8 +435,8 @@
         }
 
     /**
-     * Set the [Owner] of this LayoutNode. This LayoutNode must not already be attached.
-     * [owner] must match its [parent].[owner].
+     * Set the [Owner] of this LayoutNode. This LayoutNode must not already be attached. [owner]
+     * must match its [parent].[owner].
      */
     internal fun attach(owner: Owner) {
         checkPrecondition(this.owner == null) {
@@ -455,8 +444,10 @@
         }
         checkPrecondition(_foldedParent == null || _foldedParent?.owner == owner) {
             "Attaching to a different owner($owner) than the parent's owner(${parent?.owner})." +
-                " This tree: " + debugTreeToString() +
-                " Parent tree: " + _foldedParent?.debugTreeToString()
+                " This tree: " +
+                debugTreeToString() +
+                " Parent tree: " +
+                _foldedParent?.debugTreeToString()
         }
         val parent = this.parent
         if (parent == null) {
@@ -496,9 +487,7 @@
         if (!isDeactivated) {
             nodes.markAsAttached()
         }
-        _foldedChildren.forEach { child ->
-            child.attach(owner)
-        }
+        _foldedChildren.forEach { child -> child.attach(owner) }
         if (!isDeactivated) {
             nodes.runAttachLifecycle()
         }
@@ -516,8 +505,8 @@
     }
 
     /**
-     * Remove the LayoutNode from the [Owner]. The [owner] must not be `null` before this call
-     * and its [parent]'s [owner] must be `null` before calling this. This will also [detach] all
+     * Remove the LayoutNode from the [Owner]. The [owner] must not be `null` before this call and
+     * its [parent]'s [owner] must be `null` before calling this. This will also [detach] all
      * children. After executing, the [owner] will be `null`.
      */
     internal fun detach() {
@@ -539,11 +528,7 @@
             invalidateSemantics()
         }
         nodes.runDetachLifecycle()
-        ignoreRemeasureRequests {
-            _foldedChildren.forEach { child ->
-                child.detach()
-            }
-        }
+        ignoreRemeasureRequests { _foldedChildren.forEach { child -> child.detach() } }
         nodes.markAsDetached()
         owner.onDetach(this)
         this.owner = null
@@ -559,9 +544,8 @@
 
     /**
      * Returns the children list sorted by their [LayoutNode.zIndex] first (smaller first) and the
-     * order they were placed via [Placeable.placeAt] by parent (smaller first).
-     * Please note that this list contains not placed items as well, so you have to manually
-     * filter them.
+     * order they were placed via [Placeable.placeAt] by parent (smaller first). Please note that
+     * this list contains not placed items as well, so you have to manually filter them.
      *
      * Note that the object is reused so you shouldn't save it for later.
      */
@@ -595,9 +579,7 @@
             return innerContentConstraints.hasFixedWidth && innerContentConstraints.hasFixedHeight
         }
 
-    /**
-     * Call this method from the debugger to see a dump of the LayoutNode tree structure
-     */
+    /** Call this method from the debugger to see a dump of the LayoutNode tree structure */
     @Suppress("unused")
     private fun debugTreeToString(depth: Int = 0): String {
         val tree = StringBuilder()
@@ -608,9 +590,7 @@
         tree.append(toString())
         tree.append('\n')
 
-        forEachChild { child ->
-            tree.append(child.debugTreeToString(depth + 1))
-        }
+        forEachChild { child -> tree.append(child.debugTreeToString(depth + 1)) }
 
         var treeString = tree.toString()
         if (depth == 0) {
@@ -643,9 +623,7 @@
         ) = error(error)
     }
 
-    /**
-     * Blocks that define the measurement and intrinsic measurement of the layout.
-     */
+    /** Blocks that define the measurement and intrinsic measurement of the layout. */
     override var measurePolicy: MeasurePolicy = ErrorMeasurePolicy
         set(value) {
             if (field != value) {
@@ -656,16 +634,15 @@
         }
 
     /**
-     * The intrinsic measurements of this layout, backed up by states to trigger
-     * correct remeasurement for layouts using the intrinsics of this layout
-     * when the [measurePolicy] is changing.
+     * The intrinsic measurements of this layout, backed up by states to trigger correct
+     * remeasurement for layouts using the intrinsics of this layout when the [measurePolicy] is
+     * changing.
      */
     private var intrinsicsPolicy: IntrinsicsPolicy? = null
 
     private fun getOrCreateIntrinsicsPolicy(): IntrinsicsPolicy {
-        return intrinsicsPolicy ?: IntrinsicsPolicy(this, measurePolicy).also {
-            intrinsicsPolicy = it
-        }
+        return intrinsicsPolicy
+            ?: IntrinsicsPolicy(this, measurePolicy).also { intrinsicsPolicy = it }
     }
 
     fun minLookaheadIntrinsicWidth(height: Int) =
@@ -680,21 +657,15 @@
     fun maxLookaheadIntrinsicHeight(width: Int) =
         getOrCreateIntrinsicsPolicy().maxLookaheadIntrinsicHeight(width)
 
-    fun minIntrinsicWidth(height: Int) =
-        getOrCreateIntrinsicsPolicy().minIntrinsicWidth(height)
+    fun minIntrinsicWidth(height: Int) = getOrCreateIntrinsicsPolicy().minIntrinsicWidth(height)
 
-    fun minIntrinsicHeight(width: Int) =
-        getOrCreateIntrinsicsPolicy().minIntrinsicHeight(width)
+    fun minIntrinsicHeight(width: Int) = getOrCreateIntrinsicsPolicy().minIntrinsicHeight(width)
 
-    fun maxIntrinsicWidth(height: Int) =
-        getOrCreateIntrinsicsPolicy().maxIntrinsicWidth(height)
+    fun maxIntrinsicWidth(height: Int) = getOrCreateIntrinsicsPolicy().maxIntrinsicWidth(height)
 
-    fun maxIntrinsicHeight(width: Int) =
-        getOrCreateIntrinsicsPolicy().maxIntrinsicHeight(width)
+    fun maxIntrinsicHeight(width: Int) = getOrCreateIntrinsicsPolicy().maxIntrinsicHeight(width)
 
-    /**
-     * The screen density to be used by this layout.
-     */
+    /** The screen density to be used by this layout. */
     override var density: Density = DefaultDensity
         set(value) {
             if (field != value) {
@@ -714,9 +685,7 @@
             }
         }
 
-    /**
-     * The layout direction of the layout node.
-     */
+    /** The layout direction of the layout node. */
     override var layoutDirection: LayoutDirection = LayoutDirection.Ltr
         set(value) {
             if (field != value) {
@@ -736,9 +705,7 @@
             if (field != value) {
                 field = value
 
-                nodes.headToTail(type = PointerInput) {
-                    it.onViewConfigurationChange()
-                }
+                nodes.headToTail(type = PointerInput) { it.onViewConfigurationChange() }
             }
         }
 
@@ -759,7 +726,8 @@
         }
 
     private fun onDensityOrLayoutDirectionChanged() {
-        // TODO(b/242120396): it seems like we need to update some densities in the node coordinators here
+        // TODO(b/242120396): it seems like we need to update some densities in the node
+        // coordinators here
         // measure/layout modifiers on the node
         invalidateMeasurements()
         // draw modifiers on the node
@@ -768,9 +736,7 @@
         invalidateLayers()
     }
 
-    /**
-     * The measured width of this layout and all of its [modifier]s. Shortcut for `size.width`.
-     */
+    /** The measured width of this layout and all of its [modifier]s. Shortcut for `size.width`. */
     override val width: Int
         get() = layoutDelegate.width
 
@@ -781,10 +747,11 @@
         get() = layoutDelegate.height
 
     internal val alignmentLinesRequired: Boolean
-        get() = layoutDelegate.run {
-            alignmentLinesOwner.alignmentLines.required ||
-                lookaheadAlignmentLinesOwner?.alignmentLines?.required == true
-        }
+        get() =
+            layoutDelegate.run {
+                alignmentLinesOwner.alignmentLines.required ||
+                    lookaheadAlignmentLinesOwner?.alignmentLines?.required == true
+            }
 
     internal val mDrawScope: LayoutNodeDrawScope
         get() = requireOwner().sharedDrawScope
@@ -806,32 +773,26 @@
      * The order in which this node was placed by its parent during the previous `layoutChildren`.
      * Before the placement the order is set to [NotPlacedPlaceOrder] to all the children. Then
      * every placed node assigns this variable to [parent]s MeasurePassDelegate's
-     * nextChildPlaceOrder and increments this counter. Not placed items will still
-     * have [NotPlacedPlaceOrder] set.
+     * nextChildPlaceOrder and increments this counter. Not placed items will still have
+     * [NotPlacedPlaceOrder] set.
      */
     internal val placeOrder: Int
         get() = measurePassDelegate.placeOrder
 
-    /**
-     * Remembers how the node was measured by the parent.
-     */
+    /** Remembers how the node was measured by the parent. */
     internal val measuredByParent: UsageByParent
         get() = measurePassDelegate.measuredByParent
 
-    /**
-     * Remembers how the node was measured by the parent in lookahead.
-     */
+    /** Remembers how the node was measured by the parent in lookahead. */
     internal val measuredByParentInLookahead: UsageByParent
         get() = lookaheadPassDelegate?.measuredByParent ?: UsageByParent.NotUsed
 
-    /**
-     * Remembers how the node was measured using intrinsics by an ancestor.
-     */
+    /** Remembers how the node was measured using intrinsics by an ancestor. */
     internal var intrinsicsUsageByParent: UsageByParent = UsageByParent.NotUsed
 
     /**
-     * We must cache a previous value of [intrinsicsUsageByParent] because measurement
-     * is sometimes skipped. When it is skipped, the subtree must be restored to this value.
+     * We must cache a previous value of [intrinsicsUsageByParent] because measurement is sometimes
+     * skipped. When it is skipped, the subtree must be restored to this value.
      */
     private var previousIntrinsicsUsageByParent: UsageByParent = UsageByParent.NotUsed
 
@@ -841,27 +802,24 @@
     internal val nodes = NodeChain(this)
     internal val innerCoordinator: NodeCoordinator
         get() = nodes.innerCoordinator
+
     internal val layoutDelegate = LayoutNodeLayoutDelegate(this)
     internal val outerCoordinator: NodeCoordinator
         get() = nodes.outerCoordinator
 
     /**
-     * zIndex defines the drawing order of the LayoutNode. Children with larger zIndex are drawn
-     * on top of others (the original order is used for the nodes with the same zIndex).
-     * Default zIndex is 0. We use sum of the values passed as zIndex to place() by the
-     * parent layout and all the applied modifiers.
+     * zIndex defines the drawing order of the LayoutNode. Children with larger zIndex are drawn on
+     * top of others (the original order is used for the nodes with the same zIndex). Default zIndex
+     * is 0. We use sum of the values passed as zIndex to place() by the parent layout and all the
+     * applied modifiers.
      */
     private val zIndex: Float
         get() = measurePassDelegate.zIndex
 
-    /**
-     * The inner state associated with [androidx.compose.ui.layout.SubcomposeLayout].
-     */
+    /** The inner state associated with [androidx.compose.ui.layout.SubcomposeLayout]. */
     internal var subcompositionsState: LayoutNodeSubcompositionsState? = null
 
-    /**
-     * The inner-most layer coordinator. Used for performance for NodeCoordinator.findLayer().
-     */
+    /** The inner-most layer coordinator. Used for performance for NodeCoordinator.findLayer(). */
     private var _innerLayerCoordinator: NodeCoordinator? = null
     internal var innerLayerCoordinatorIsDirty = true
     private val innerLayerCoordinator: NodeCoordinator?
@@ -902,20 +860,17 @@
 
     private var _modifier: Modifier = Modifier
     private var pendingModifier: Modifier? = null
-    internal val applyingModifierOnAttach get() = pendingModifier != null
+    internal val applyingModifierOnAttach
+        get() = pendingModifier != null
 
-    /**
-     * The [Modifier] currently applied to this node.
-     */
+    /** The [Modifier] currently applied to this node. */
     override var modifier: Modifier
         get() = _modifier
         set(value) {
             requirePrecondition(!isVirtual || modifier === Modifier) {
                 "Modifiers are not supported on virtual LayoutNodes"
             }
-            requirePrecondition(!isDeactivated) {
-                "modifier is updated when deactivated"
-            }
+            requirePrecondition(!isDeactivated) { "modifier is updated when deactivated" }
             if (isAttached) {
                 applyModifier(value)
             } else {
@@ -946,20 +901,15 @@
     override val coordinates: LayoutCoordinates
         get() = innerCoordinator
 
-    /**
-     * Callback to be executed whenever the [LayoutNode] is attached to a new [Owner].
-     */
+    /** Callback to be executed whenever the [LayoutNode] is attached to a new [Owner]. */
     internal var onAttach: ((Owner) -> Unit)? = null
 
-    /**
-     * Callback to be executed whenever the [LayoutNode] is detached from an [Owner].
-     */
+    /** Callback to be executed whenever the [LayoutNode] is detached from an [Owner]. */
     internal var onDetach: ((Owner) -> Unit)? = null
 
     /**
-     * Flag used by [OnPositionedDispatcher] to identify LayoutNodes that have already
-     * had their [OnGloballyPositionedModifier]'s dispatch called so that they aren't called
-     * multiple times.
+     * Flag used by [OnPositionedDispatcher] to identify LayoutNodes that have already had their
+     * [OnGloballyPositionedModifier]'s dispatch called so that they aren't called multiple times.
      */
     internal var needsOnPositionedDispatch = false
 
@@ -974,9 +924,7 @@
         }
     }
 
-    /**
-     * Place this layout node again on the same position it was placed last time
-     */
+    /** Place this layout node again on the same position it was placed last time */
     internal fun replace() {
         if (intrinsicsUsageByParent == UsageByParent.NotUsed) {
             // This LayoutNode may have asked children for intrinsics. If so, we should
@@ -1002,14 +950,12 @@
      * Carries out a hit test on the [PointerInputModifier]s associated with this [LayoutNode] and
      * all [PointerInputModifier]s on all descendant [LayoutNode]s.
      *
-     * If [pointerPosition] is within the bounds of any tested
-     * [PointerInputModifier]s, the [PointerInputModifier] is added to [hitTestResult]
-     * and true is returned.
+     * If [pointerPosition] is within the bounds of any tested [PointerInputModifier]s, the
+     * [PointerInputModifier] is added to [hitTestResult] and true is returned.
      *
-     * @param pointerPosition The tested pointer position, which is relative to
-     * the LayoutNode.
-     * @param hitTestResult The collection that the hit [PointerInputFilter]s will be
-     * added to if hit.
+     * @param pointerPosition The tested pointer position, which is relative to the LayoutNode.
+     * @param hitTestResult The collection that the hit [PointerInputFilter]s will be added to if
+     *   hit.
      */
     internal fun hitTest(
         pointerPosition: Offset,
@@ -1063,14 +1009,11 @@
                     }
                 }
             }
-
             else -> throw IllegalStateException("Unexpected state ${it.layoutState}")
         }
     }
 
-    /**
-     * Used to request a new measurement + layout pass from the owner.
-     */
+    /** Used to request a new measurement + layout pass from the owner. */
     internal fun requestRemeasure(
         forceRequest: Boolean = false,
         scheduleMeasureAndLayout: Boolean = true,
@@ -1090,8 +1033,8 @@
     }
 
     /**
-     * Used to request a new lookahead measurement, lookahead layout, and subsequently
-     * measure and layout from the owner.
+     * Used to request a new lookahead measurement, lookahead layout, and subsequently measure and
+     * layout from the owner.
      */
     internal fun requestLookaheadRemeasure(
         forceRequest: Boolean = false,
@@ -1150,9 +1093,7 @@
         ignoreRemeasureRequests = false
     }
 
-    /**
-     * Used to request a new layout pass from the owner.
-     */
+    /** Used to request a new layout pass from the owner. */
     internal fun requestRelayout(forceRequest: Boolean = false) {
         if (!isVirtual) {
             owner?.onRequestRelayout(this, forceRequest = forceRequest)
@@ -1178,19 +1119,14 @@
     }
 
     /**
-     * This returns a new List of Modifiers and the coordinates and any extra information
-     * that may be useful. This is used for tooling to retrieve layout modifier and layer
-     * information.
+     * This returns a new List of Modifiers and the coordinates and any extra information that may
+     * be useful. This is used for tooling to retrieve layout modifier and layer information.
      */
     override fun getModifierInfo(): List<ModifierInfo> = nodes.getModifierInfo()
 
-    /**
-     * Invalidates layers defined on this LayoutNode.
-     */
+    /** Invalidates layers defined on this LayoutNode. */
     internal fun invalidateLayers() {
-        forEachCoordinator { coordinator ->
-            coordinator.layer?.invalidate()
-        }
+        forEachCoordinator { coordinator -> coordinator.layer?.invalidate() }
         innerCoordinator.layer?.invalidate()
     }
 
@@ -1206,12 +1142,8 @@
         }
     }
 
-    /**
-     * Return true if the measured size has been changed
-     */
-    internal fun remeasure(
-        constraints: Constraints? = layoutDelegate.lastConstraints
-    ): Boolean {
+    /** Return true if the measured size has been changed */
+    internal fun remeasure(constraints: Constraints? = layoutDelegate.lastConstraints): Boolean {
         return if (constraints != null) {
             if (intrinsicsUsageByParent == UsageByParent.NotUsed) {
                 // This LayoutNode may have asked children for intrinsics. If so, we should
@@ -1225,20 +1157,19 @@
     }
 
     /**
-     * Tracks whether another measure pass is needed for the LayoutNode.
-     * Mutation to [measurePending] is confined to LayoutNodeLayoutDelegate.
-     * It can only be set true from outside of LayoutNode via [markMeasurePending].
-     * It is cleared (i.e. set false) during the measure pass (
-     * i.e. in [LayoutNodeLayoutDelegate.performMeasure]).
+     * Tracks whether another measure pass is needed for the LayoutNode. Mutation to
+     * [measurePending] is confined to LayoutNodeLayoutDelegate. It can only be set true from
+     * outside of LayoutNode via [markMeasurePending]. It is cleared (i.e. set false) during the
+     * measure pass ( i.e. in [LayoutNodeLayoutDelegate.performMeasure]).
      */
     internal val measurePending: Boolean
         get() = layoutDelegate.measurePending
 
     /**
-     * Tracks whether another layout pass is needed for the LayoutNode.
-     * Mutation to [layoutPending] is confined to LayoutNode. It can only be set true from outside
-     * of LayoutNode via [markLayoutPending]. It is cleared (i.e. set false) during the layout pass
-     * (i.e. in layoutChildren).
+     * Tracks whether another layout pass is needed for the LayoutNode. Mutation to [layoutPending]
+     * is confined to LayoutNode. It can only be set true from outside of LayoutNode via
+     * [markLayoutPending]. It is cleared (i.e. set false) during the layout pass (i.e. in
+     * layoutChildren).
      */
     internal val layoutPending: Boolean
         get() = layoutDelegate.layoutPending
@@ -1249,19 +1180,13 @@
     internal val lookaheadLayoutPending: Boolean
         get() = layoutDelegate.lookaheadLayoutPending
 
-    /**
-     * Marks the layoutNode dirty for another layout pass.
-     */
+    /** Marks the layoutNode dirty for another layout pass. */
     internal fun markLayoutPending() = layoutDelegate.markLayoutPending()
 
-    /**
-     * Marks the layoutNode dirty for another measure pass.
-     */
+    /** Marks the layoutNode dirty for another measure pass. */
     internal fun markMeasurePending() = layoutDelegate.markMeasurePending()
 
-    /**
-     * Marks the layoutNode dirty for another lookahead layout pass.
-     */
+    /** Marks the layoutNode dirty for another lookahead layout pass. */
     internal fun markLookaheadLayoutPending() = layoutDelegate.markLookaheadLayoutPending()
 
     fun invalidateSubtree(isRootOfInvalidation: Boolean = true) {
@@ -1270,18 +1195,13 @@
         }
         invalidateSemantics()
         requestRemeasure()
-        nodes.headToTail(Nodes.Layout) {
-            it.requireCoordinator(Nodes.Layout).layer?.invalidate()
-        }
+        nodes.headToTail(Nodes.Layout) { it.requireCoordinator(Nodes.Layout).layer?.invalidate() }
         // TODO: invalidate parent data
         _children.forEach { it.invalidateSubtree(false) }
     }
 
-    /**
-     * Marks the layoutNode dirty for another lookahead measure pass.
-     */
-    internal fun markLookaheadMeasurePending() =
-        layoutDelegate.markLookaheadMeasurePending()
+    /** Marks the layoutNode dirty for another lookahead measure pass. */
+    internal fun markLookaheadMeasurePending() = layoutDelegate.markLookaheadMeasurePending()
 
     override fun forceRemeasure() {
         // we do not schedule measure and layout as we are going to call it manually right after
@@ -1299,14 +1219,10 @@
     }
 
     override fun onLayoutComplete() {
-        innerCoordinator.visitNodes(Nodes.LayoutAware) {
-            it.onPlaced(innerCoordinator)
-        }
+        innerCoordinator.visitNodes(Nodes.LayoutAware) { it.onPlaced(innerCoordinator) }
     }
 
-    /**
-     * Calls [block] on all [LayoutModifierNodeCoordinator]s in the NodeCoordinator chain.
-     */
+    /** Calls [block] on all [LayoutModifierNodeCoordinator]s in the NodeCoordinator chain. */
     internal inline fun forEachCoordinator(block: (LayoutModifierNodeCoordinator) -> Unit) {
         var coordinator: NodeCoordinator? = outerCoordinator
         val inner = innerCoordinator
@@ -1316,9 +1232,7 @@
         }
     }
 
-    /**
-     * Calls [block] on all [NodeCoordinator]s in the NodeCoordinator chain.
-     */
+    /** Calls [block] on all [NodeCoordinator]s in the NodeCoordinator chain. */
     internal inline fun forEachCoordinatorIncludingInner(block: (NodeCoordinator) -> Unit) {
         var delegate: NodeCoordinator? = outerCoordinator
         val final = innerCoordinator.wrapped
@@ -1342,15 +1256,14 @@
     }
 
     /**
-     * Walks the subtree and clears all [intrinsicsUsageByParent] that this
-     * LayoutNode's measurement used intrinsics on.
+     * Walks the subtree and clears all [intrinsicsUsageByParent] that this LayoutNode's measurement
+     * used intrinsics on.
      *
-     * The layout that asks for intrinsics of its children is the node to call this to request
-     * all of its subtree to be cleared.
+     * The layout that asks for intrinsics of its children is the node to call this to request all
+     * of its subtree to be cleared.
      *
-     * We can't do clearing as part of measure() because the child's measure()
-     * call is normally done after the intrinsics is requested and we don't want
-     * to clear the usage at that point.
+     * We can't do clearing as part of measure() because the child's measure() call is normally done
+     * after the intrinsics is requested and we don't want to clear the usage at that point.
      */
     internal fun clearSubtreeIntrinsicsUsage() {
         // save the usage in case we short-circuit the measure call
@@ -1364,15 +1277,14 @@
     }
 
     /**
-     * Walks the subtree and clears all [intrinsicsUsageByParent] that this
-     * LayoutNode's layout block used intrinsics on.
+     * Walks the subtree and clears all [intrinsicsUsageByParent] that this LayoutNode's layout
+     * block used intrinsics on.
      *
-     * The layout that asks for intrinsics of its children is the node to call this to request
-     * all of its subtree to be cleared.
+     * The layout that asks for intrinsics of its children is the node to call this to request all
+     * of its subtree to be cleared.
      *
-     * We can't do clearing as part of measure() because the child's measure()
-     * call is normally done after the intrinsics is requested and we don't want
-     * to clear the usage at that point.
+     * We can't do clearing as part of measure() because the child's measure() call is normally done
+     * after the intrinsics is requested and we don't want to clear the usage at that point.
      */
     private fun clearSubtreePlacementIntrinsicsUsage() {
         // save the usage in case we short-circuit the measure call
@@ -1386,8 +1298,8 @@
     }
 
     /**
-     * For a subtree that skips measurement, this resets the [intrinsicsUsageByParent]
-     * to what it was prior to [clearSubtreeIntrinsicsUsage].
+     * For a subtree that skips measurement, this resets the [intrinsicsUsageByParent] to what it
+     * was prior to [clearSubtreeIntrinsicsUsage].
      */
     internal fun resetSubtreeIntrinsicsUsage() {
         forEachChild {
@@ -1441,81 +1353,70 @@
 
     internal companion object {
         private val ErrorMeasurePolicy: NoIntrinsicsMeasurePolicy =
-            object : NoIntrinsicsMeasurePolicy(
-                error = "Undefined intrinsics block and it is required"
-            ) {
+            object :
+                NoIntrinsicsMeasurePolicy(error = "Undefined intrinsics block and it is required") {
                 override fun MeasureScope.measure(
                     measurables: List<Measurable>,
                     constraints: Constraints
                 ) = error("Undefined measure and it is required")
             }
 
-        /**
-         * Constant used by [placeOrder].
-         */
-        @Suppress("ConstPropertyName")
-        internal const val NotPlacedPlaceOrder = Int.MAX_VALUE
+        /** Constant used by [placeOrder]. */
+        @Suppress("ConstPropertyName") internal const val NotPlacedPlaceOrder = Int.MAX_VALUE
 
-        /**
-         * Pre-allocated constructor to be used with ComposeNode
-         */
+        /** Pre-allocated constructor to be used with ComposeNode */
         internal val Constructor: () -> LayoutNode = { LayoutNode() }
 
         /**
-         * All of these values are only used in tests. The real ViewConfiguration should
-         * be set in Layout()
+         * All of these values are only used in tests. The real ViewConfiguration should be set in
+         * Layout()
          */
-        internal val DummyViewConfiguration = object : ViewConfiguration {
-            override val longPressTimeoutMillis: Long
-                get() = 400L
-            override val doubleTapTimeoutMillis: Long
-                get() = 300L
-            override val doubleTapMinTimeMillis: Long
-                get() = 40L
-            override val touchSlop: Float
-                get() = 16f
-            override val minimumTouchTargetSize: DpSize
-                get() = DpSize.Zero
-        }
+        internal val DummyViewConfiguration =
+            object : ViewConfiguration {
+                override val longPressTimeoutMillis: Long
+                    get() = 400L
 
-        /**
-         * Comparator allowing to sort nodes by zIndex and placement order.
-         */
-        internal val ZComparator = Comparator<LayoutNode> { node1, node2 ->
-            if (node1.zIndex == node2.zIndex) {
-                // if zIndex is the same we use the placement order
-                node1.placeOrder.compareTo(node2.placeOrder)
-            } else {
-                node1.zIndex.compareTo(node2.zIndex)
+                override val doubleTapTimeoutMillis: Long
+                    get() = 300L
+
+                override val doubleTapMinTimeMillis: Long
+                    get() = 40L
+
+                override val touchSlop: Float
+                    get() = 16f
+
+                override val minimumTouchTargetSize: DpSize
+                    get() = DpSize.Zero
             }
-        }
+
+        /** Comparator allowing to sort nodes by zIndex and placement order. */
+        internal val ZComparator =
+            Comparator<LayoutNode> { node1, node2 ->
+                if (node1.zIndex == node2.zIndex) {
+                    // if zIndex is the same we use the placement order
+                    node1.placeOrder.compareTo(node2.placeOrder)
+                } else {
+                    node1.zIndex.compareTo(node2.zIndex)
+                }
+            }
     }
 
     /**
      * Describes the current state the [LayoutNode] is in. A [LayoutNode] is expected to be in
-     * [LookaheadMeasuring] first, followed by [LookaheadLayingOut] if it is in a
-     * LookaheadScope. After the lookahead is finished, [Measuring] and then [LayingOut] will
-     * happen as needed.
+     * [LookaheadMeasuring] first, followed by [LookaheadLayingOut] if it is in a LookaheadScope.
+     * After the lookahead is finished, [Measuring] and then [LayingOut] will happen as needed.
      */
     internal enum class LayoutState {
-        /**
-         * Node is currently being measured.
-         */
+        /** Node is currently being measured. */
         Measuring,
 
-        /**
-         * Node is being measured in lookahead.
-         */
+        /** Node is being measured in lookahead. */
         LookaheadMeasuring,
 
-        /**
-         * Node is currently being laid out.
-         */
+        /** Node is currently being laid out. */
         LayingOut,
 
-        /**
-         * Node is being laid out in lookahead.
-         */
+        /** Node is being laid out in lookahead. */
         LookaheadLayingOut,
 
         /**
@@ -1532,21 +1433,16 @@
     }
 }
 
-/**
- * Returns [LayoutNode.owner] or throws if it is null.
- */
+/** Returns [LayoutNode.owner] or throws if it is null. */
 internal fun LayoutNode.requireOwner(): Owner {
     val owner = owner
-    checkPreconditionNotNull(owner) {
-        "LayoutNode should be attached to an owner"
-    }
+    checkPreconditionNotNull(owner) { "LayoutNode should be attached to an owner" }
     return owner
 }
 
 /**
- * Inserts a child [LayoutNode] at a last index. If this LayoutNode [LayoutNode.isAttached]
- * then [child] will become [LayoutNode.isAttached] also. [child] must have a `null`
- * [LayoutNode.parent].
+ * Inserts a child [LayoutNode] at a last index. If this LayoutNode [LayoutNode.isAttached] then
+ * [child] will become [LayoutNode.isAttached] also. [child] must have a `null` [LayoutNode.parent].
  */
 internal fun LayoutNode.add(child: LayoutNode) {
     insertAt(children.size, child)
diff --git a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/node/LayoutNodeAlignmentLines.kt b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/node/LayoutNodeAlignmentLines.kt
index a9ec09d..a4d667fb 100644
--- a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/node/LayoutNodeAlignmentLines.kt
+++ b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/node/LayoutNodeAlignmentLines.kt
@@ -24,14 +24,10 @@
 import androidx.compose.ui.util.fastRoundToInt
 
 internal sealed class AlignmentLines(val alignmentLinesOwner: AlignmentLinesOwner) {
-    /**
-     * `true` when the alignment lines needs to be recalculated because they might have changed.
-     */
+    /** `true` when the alignment lines needs to be recalculated because they might have changed. */
     internal var dirty = true
 
-    /**
-     * `true` when the alignment lines were used by the parent during measurement.
-     */
+    /** `true` when the alignment lines were used by the parent during measurement. */
     internal var usedDuringParentMeasurement = false
 
     /**
@@ -40,28 +36,22 @@
      */
     internal var usedDuringParentLayout = false
 
-    /**
-     * `true` when the alignment lines were used by the parent during the last completed layout.
-     */
+    /** `true` when the alignment lines were used by the parent during the last completed layout. */
     internal var previousUsedDuringParentLayout = false
 
-    /**
-     * `true` when the alignment lines were used by the modifier of the node during measurement.
-     */
+    /** `true` when the alignment lines were used by the modifier of the node during measurement. */
     internal var usedByModifierMeasurement = false
 
-    /**
-     * `true` when the alignment lines were used by the modifier of the node during measurement.
-     */
+    /** `true` when the alignment lines were used by the modifier of the node during measurement. */
     internal var usedByModifierLayout = false
 
-    /**
-     * `true` when the direct parent or our modifier relies on our alignment lines.
-     */
+    /** `true` when the direct parent or our modifier relies on our alignment lines. */
     internal val queried
-        get() = usedDuringParentMeasurement ||
-            previousUsedDuringParentLayout || usedByModifierMeasurement ||
-            usedByModifierLayout
+        get() =
+            usedDuringParentMeasurement ||
+                previousUsedDuringParentLayout ||
+                usedByModifierMeasurement ||
+                usedByModifierLayout
 
     /**
      * The closest layout node ancestor who was asked for alignment lines, either by the parent or
@@ -84,35 +74,35 @@
      * alignmentUsedBy* of the layout nodes in the hierarchy.
      */
     fun recalculateQueryOwner() {
-        queryOwner = if (queried) {
-            alignmentLinesOwner
-        } else {
-            val parent = alignmentLinesOwner.parentAlignmentLinesOwner ?: return
-            val parentQueryOwner = parent.alignmentLines.queryOwner
-            if (parentQueryOwner != null && parentQueryOwner.alignmentLines.queried) {
-                parentQueryOwner
+        queryOwner =
+            if (queried) {
+                alignmentLinesOwner
             } else {
-                val owner = queryOwner
-                if (owner == null || owner.alignmentLines.queried) return
-                owner.parentAlignmentLinesOwner?.alignmentLines?.recalculateQueryOwner()
-                owner.parentAlignmentLinesOwner?.alignmentLines?.queryOwner
+                val parent = alignmentLinesOwner.parentAlignmentLinesOwner ?: return
+                val parentQueryOwner = parent.alignmentLines.queryOwner
+                if (parentQueryOwner != null && parentQueryOwner.alignmentLines.queried) {
+                    parentQueryOwner
+                } else {
+                    val owner = queryOwner
+                    if (owner == null || owner.alignmentLines.queried) return
+                    owner.parentAlignmentLinesOwner?.alignmentLines?.recalculateQueryOwner()
+                    owner.parentAlignmentLinesOwner?.alignmentLines?.queryOwner
+                }
             }
-        }
     }
 
-    /**
-     * The alignment lines of this layout, inherited + intrinsic
-     */
+    /** The alignment lines of this layout, inherited + intrinsic */
     private val alignmentLineMap: MutableMap<AlignmentLine, Int> = hashMapOf()
 
     fun getLastCalculation(): Map<AlignmentLine, Int> = alignmentLineMap
 
     protected abstract val NodeCoordinator.alignmentLinesMap: Map<AlignmentLine, Int>
+
     protected abstract fun NodeCoordinator.getPositionFor(alignmentLine: AlignmentLine): Int
 
     /**
-     * Returns the alignment line value for a given alignment line without affecting whether
-     * the flag for whether the alignment line was read.
+     * Returns the alignment line value for a given alignment line without affecting whether the
+     * flag for whether the alignment line was read.
      */
     private fun addAlignmentLine(
         alignmentLine: AlignmentLine,
@@ -131,25 +121,23 @@
             }
         }
 
-        val positionInContainer = (if (alignmentLine is HorizontalAlignmentLine) {
-            position.y
-        } else {
-            position.x
-        }).fastRoundToInt()
+        val positionInContainer =
+            (if (alignmentLine is HorizontalAlignmentLine) {
+                    position.y
+                } else {
+                    position.x
+                })
+                .fastRoundToInt()
         // If the line was already provided by a previous child, merge the values.
-        alignmentLineMap[alignmentLine] = if (alignmentLine in alignmentLineMap) {
-            alignmentLine.merge(
-                alignmentLineMap.getValue(alignmentLine),
+        alignmentLineMap[alignmentLine] =
+            if (alignmentLine in alignmentLineMap) {
+                alignmentLine.merge(alignmentLineMap.getValue(alignmentLine), positionInContainer)
+            } else {
                 positionInContainer
-            )
-        } else {
-            positionInContainer
-        }
+            }
     }
 
-    /**
-     * Recalculate alignment lines from all the children.
-     */
+    /** Recalculate alignment lines from all the children. */
     fun recalculate() {
         alignmentLineMap.clear()
         alignmentLinesOwner.forEachChildAlignmentLinesOwner { childOwner ->
@@ -177,9 +165,7 @@
         dirty = false
     }
 
-    /**
-     * Reset all the internal states.
-     */
+    /** Reset all the internal states. */
     internal fun reset() {
         dirty = true
         usedDuringParentMeasurement = false
@@ -211,12 +197,9 @@
     protected abstract fun NodeCoordinator.calculatePositionInParent(position: Offset): Offset
 }
 
-/**
- * AlignmentLines impl that are specific to non-lookahead pass.
- */
-internal class LayoutNodeAlignmentLines(
-    alignmentLinesOwner: AlignmentLinesOwner
-) : AlignmentLines(alignmentLinesOwner) {
+/** AlignmentLines impl that are specific to non-lookahead pass. */
+internal class LayoutNodeAlignmentLines(alignmentLinesOwner: AlignmentLinesOwner) :
+    AlignmentLines(alignmentLinesOwner) {
 
     override val NodeCoordinator.alignmentLinesMap: Map<AlignmentLine, Int>
         get() = measureResult.alignmentLines
@@ -228,12 +211,9 @@
         toParentPosition(position)
 }
 
-/**
- * AlignmentLines impl that are specific to lookahead pass.
- */
-internal class LookaheadAlignmentLines(
-    alignmentLinesOwner: AlignmentLinesOwner
-) : AlignmentLines(alignmentLinesOwner) {
+/** AlignmentLines impl that are specific to lookahead pass. */
+internal class LookaheadAlignmentLines(alignmentLinesOwner: AlignmentLinesOwner) :
+    AlignmentLines(alignmentLinesOwner) {
 
     override val NodeCoordinator.alignmentLinesMap: Map<AlignmentLine, Int>
         get() = lookaheadDelegate!!.measureResult.alignmentLines
diff --git a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/node/LayoutNodeDrawScope.kt b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/node/LayoutNodeDrawScope.kt
index 32679aa..b9e3c73 100644
--- a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/node/LayoutNodeDrawScope.kt
+++ b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/node/LayoutNodeDrawScope.kt
@@ -29,13 +29,12 @@
 import androidx.compose.ui.unit.toSize
 
 /**
- * [ContentDrawScope] implementation that extracts density and layout direction information
- * from the given NodeCoordinator
+ * [ContentDrawScope] implementation that extracts density and layout direction information from the
+ * given NodeCoordinator
  */
 @OptIn(ExperimentalComposeUiApi::class)
-internal class LayoutNodeDrawScope(
-    val canvasDrawScope: CanvasDrawScope = CanvasDrawScope()
-) : DrawScope by canvasDrawScope, ContentDrawScope {
+internal class LayoutNodeDrawScope(val canvasDrawScope: CanvasDrawScope = CanvasDrawScope()) :
+    DrawScope by canvasDrawScope, ContentDrawScope {
 
     // NOTE, currently a single ComponentDrawScope is shared across composables
     // which done to allocate a single set of Paint objects and re-use them across
@@ -61,10 +60,8 @@
                 //  but we should think about the right ways to handle this as this is very error
                 //  prone i think
                 val coordinator = drawNode.requireCoordinator(Nodes.Draw)
-                val nextCoordinator = if (coordinator.tail === drawNode.node)
-                    coordinator.wrapped!!
-                else
-                    coordinator
+                val nextCoordinator =
+                    if (coordinator.tail === drawNode.node) coordinator.wrapped!! else coordinator
                 nextCoordinator.performDraw(canvas, drawContext.graphicsLayer)
             }
         }
@@ -85,9 +82,7 @@
         drawNode: Modifier.Node,
         layer: GraphicsLayer?
     ) {
-        drawNode.dispatchForKind(Nodes.Draw) {
-            drawDirect(canvas, size, coordinator, it, layer)
-        }
+        drawNode.dispatchForKind(Nodes.Draw) { drawDirect(canvas, size, coordinator, it, layer) }
     }
 
     internal fun drawDirect(
@@ -99,16 +94,8 @@
     ) {
         val previousDrawNode = this.drawNode
         this.drawNode = drawNode
-        canvasDrawScope.draw(
-            coordinator,
-            coordinator.layoutDirection,
-            canvas,
-            size,
-            layer
-        ) {
-            with(drawNode) {
-                this@LayoutNodeDrawScope.draw()
-            }
+        canvasDrawScope.draw(coordinator, coordinator.layoutDirection, canvas, size, layer) {
+            with(drawNode) { this@LayoutNodeDrawScope.draw() }
         }
         this.drawNode = previousDrawNode
     }
diff --git a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/node/LayoutNodeLayoutDelegate.kt b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/node/LayoutNodeLayoutDelegate.kt
index 1d1c3d9..f9cd9b0 100644
--- a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/node/LayoutNodeLayoutDelegate.kt
+++ b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/node/LayoutNodeLayoutDelegate.kt
@@ -42,12 +42,16 @@
 ) {
     val outerCoordinator: NodeCoordinator
         get() = layoutNode.nodes.outerCoordinator
+
     val lastConstraints: Constraints?
         get() = measurePassDelegate.lastConstraints
+
     val lastLookaheadConstraints: Constraints?
         get() = lookaheadPassDelegate?.lastConstraints
+
     internal val height: Int
         get() = measurePassDelegate.height
+
     internal val width: Int
         get() = measurePassDelegate.width
 
@@ -69,113 +73,106 @@
         private set
 
     /**
-     * Tracks whether another measure pass is needed for the LayoutNodeLayoutDelegate.
-     * Mutation to [measurePending] is confined to LayoutNodeLayoutDelegate. It can only be set true
-     * from outside of this class via [markMeasurePending]. It is cleared (i.e. set false) during
-     * the measure pass (i.e. in [performMeasure]).
+     * Tracks whether another measure pass is needed for the LayoutNodeLayoutDelegate. Mutation to
+     * [measurePending] is confined to LayoutNodeLayoutDelegate. It can only be set true from
+     * outside of this class via [markMeasurePending]. It is cleared (i.e. set false) during the
+     * measure pass (i.e. in [performMeasure]).
      */
     internal var measurePending: Boolean = false
         private set
 
     /**
-     * Tracks whether another layout pass is needed for the LayoutNodeLayoutDelegate.
-     * Mutation to [layoutPending] is confined to this class. It can only be set true from outside
-     * of this class via [markLayoutPending]. It is cleared (i.e. set false) during the layout pass
-     * (i.e. in [MeasurePassDelegate.layoutChildren]).
+     * Tracks whether another layout pass is needed for the LayoutNodeLayoutDelegate. Mutation to
+     * [layoutPending] is confined to this class. It can only be set true from outside of this class
+     * via [markLayoutPending]. It is cleared (i.e. set false) during the layout pass (i.e. in
+     * [MeasurePassDelegate.layoutChildren]).
      */
     internal var layoutPending: Boolean = false
         private set
 
     /**
-     * Tracks whether another layout pass is needed for the LayoutNodeLayoutDelegate
-     * for the purposes of calculating alignment lines. After calculating alignment lines, if
-     * the [Placeable.PlacementScope.coordinates] have been accessed, there is no need to
-     * rerun layout for further alignment lines checks, but [layoutPending] will indicate
-     * that the normal placement still needs to be run.
+     * Tracks whether another layout pass is needed for the LayoutNodeLayoutDelegate for the
+     * purposes of calculating alignment lines. After calculating alignment lines, if the
+     * [Placeable.PlacementScope.coordinates] have been accessed, there is no need to rerun layout
+     * for further alignment lines checks, but [layoutPending] will indicate that the normal
+     * placement still needs to be run.
      */
     private var layoutPendingForAlignment = false
 
     /**
      * Tracks whether another lookahead measure pass is needed for the LayoutNodeLayoutDelegate.
-     * Mutation to [lookaheadMeasurePending] is confined to LayoutNodeLayoutDelegate. It can only
-     * be set true from outside of this class via [markLookaheadMeasurePending]. It is cleared
-     * (i.e. set false) during the lookahead measure pass (i.e. in [performLookaheadMeasure]).
+     * Mutation to [lookaheadMeasurePending] is confined to LayoutNodeLayoutDelegate. It can only be
+     * set true from outside of this class via [markLookaheadMeasurePending]. It is cleared (i.e.
+     * set false) during the lookahead measure pass (i.e. in [performLookaheadMeasure]).
      */
     internal var lookaheadMeasurePending: Boolean = false
         private set
 
     /**
      * Tracks whether another lookahead layout pass is needed for the LayoutNodeLayoutDelegate.
-     * Mutation to [lookaheadLayoutPending] is confined to this class. It can only be set true
-     * from outside of this class via [markLookaheadLayoutPending]. It is cleared (i.e. set false)
-     * during the layout pass (i.e. in [LookaheadPassDelegate.layoutChildren]).
+     * Mutation to [lookaheadLayoutPending] is confined to this class. It can only be set true from
+     * outside of this class via [markLookaheadLayoutPending]. It is cleared (i.e. set false) during
+     * the layout pass (i.e. in [LookaheadPassDelegate.layoutChildren]).
      */
     internal var lookaheadLayoutPending: Boolean = false
         private set
 
     /**
-     * Tracks whether another lookahead layout pass is needed for the LayoutNodeLayoutDelegate
-     * for the purposes of calculating alignment lines. After calculating alignment lines, if
-     * the [Placeable.PlacementScope.coordinates] have been accessed, there is no need to
-     * rerun layout for further alignment lines checks, but [lookaheadLayoutPending] will indicate
-     * that the normal placement still needs to be run.
+     * Tracks whether another lookahead layout pass is needed for the LayoutNodeLayoutDelegate for
+     * the purposes of calculating alignment lines. After calculating alignment lines, if the
+     * [Placeable.PlacementScope.coordinates] have been accessed, there is no need to rerun layout
+     * for further alignment lines checks, but [lookaheadLayoutPending] will indicate that the
+     * normal placement still needs to be run.
      */
     private var lookaheadLayoutPendingForAlignment = false
 
     /**
-     * The counter on a parent node which is used by its children to understand the order in
-     * which they were placed in the lookahead pass.
+     * The counter on a parent node which is used by its children to understand the order in which
+     * they were placed in the lookahead pass.
      */
     private var nextChildLookaheadPlaceOrder: Int = 0
 
     /**
-     * The counter on a parent node which is used by its children to understand the order in
-     * which they were placed in the main pass.
+     * The counter on a parent node which is used by its children to understand the order in which
+     * they were placed in the main pass.
      */
     private var nextChildPlaceOrder: Int = 0
 
-    /**
-     * Marks the layoutNode dirty for another layout pass.
-     */
+    /** Marks the layoutNode dirty for another layout pass. */
     internal fun markLayoutPending() {
         layoutPending = true
         layoutPendingForAlignment = true
     }
 
-    /**
-     * Marks the layoutNode dirty for another measure pass.
-     */
+    /** Marks the layoutNode dirty for another measure pass. */
     internal fun markMeasurePending() {
         measurePending = true
     }
 
-    /**
-     * Marks the layoutNode dirty for another lookahead layout pass.
-     */
+    /** Marks the layoutNode dirty for another lookahead layout pass. */
     internal fun markLookaheadLayoutPending() {
         lookaheadLayoutPending = true
         lookaheadLayoutPendingForAlignment = true
     }
 
-    /**
-     * Marks the layoutNode dirty for another lookahead measure pass.
-     */
+    /** Marks the layoutNode dirty for another lookahead measure pass. */
     internal fun markLookaheadMeasurePending() {
         lookaheadMeasurePending = true
     }
 
     internal val alignmentLinesOwner: AlignmentLinesOwner
         get() = measurePassDelegate
+
     internal val lookaheadAlignmentLinesOwner: AlignmentLinesOwner?
         get() = lookaheadPassDelegate
 
     /**
-     * This is used to track when the [Placeable.PlacementScope.coordinates] have been
-     * accessed while placement is run. When the coordinates are accessed during an alignment
-     * line query, it indicates that the placement is not final and must be run again so that
-     * the correct positioning is done. If the coordinates are not accessed during an alignment
-     * lines query (and it isn't just a [LookaheadCapablePlaceable.isShallowPlacing]),
-     * then the placement can be considered final and doesn't have to be run again.
+     * This is used to track when the [Placeable.PlacementScope.coordinates] have been accessed
+     * while placement is run. When the coordinates are accessed during an alignment line query, it
+     * indicates that the placement is not final and must be run again so that the correct
+     * positioning is done. If the coordinates are not accessed during an alignment lines query (and
+     * it isn't just a [LookaheadCapablePlaceable.isShallowPlacing]), then the placement can be
+     * considered final and doesn't have to be run again.
      *
      * Also, if coordinates are accessed during placement, then a change in parent coordinates
      * requires placement to be run again.
@@ -215,9 +212,9 @@
         }
 
     /**
-     * The number of children with [coordinatesAccessedDuringPlacement] or have
-     * descendants with [coordinatesAccessedDuringPlacement]. This also includes
-     * this, if [coordinatesAccessedDuringPlacement] is `true`.
+     * The number of children with [coordinatesAccessedDuringPlacement] or have descendants with
+     * [coordinatesAccessedDuringPlacement]. This also includes this, if
+     * [coordinatesAccessedDuringPlacement] is `true`.
      */
     var childrenAccessingCoordinatesDuringPlacement = 0
         set(value) {
@@ -236,9 +233,7 @@
             }
         }
 
-    /**
-     * Equivalent flag of [coordinatesAccessedDuringPlacement] but for [lookaheadPassDelegate].
-     */
+    /** Equivalent flag of [coordinatesAccessedDuringPlacement] but for [lookaheadPassDelegate]. */
     var lookaheadCoordinatesAccessedDuringPlacement = false
         set(value) {
             val oldValue = field
@@ -338,8 +333,8 @@
      * [MeasurePassDelegate] manages the measure/layout and alignmentLine related queries for the
      * actual measure/layout pass.
      */
-    inner class MeasurePassDelegate : Measurable, Placeable(), AlignmentLinesOwner,
-        MotionReferencePlacementDelegate {
+    inner class MeasurePassDelegate :
+        Measurable, Placeable(), AlignmentLinesOwner, MotionReferencePlacementDelegate {
         /**
          * Is true during [replace] invocation. Helps to differentiate between the cases when our
          * parent is measuring us during the measure block, and when we are remeasured individually
@@ -356,11 +351,11 @@
             private set
 
         /**
-         * The order in which this node was placed by its parent during the previous `layoutChildren`.
-         * Before the placement the order is set to [NotPlacedPlaceOrder] to all the children. Then
-         * every placed node assigns this variable to parent's LayoutNodeLayoutDelegate's
-         * nextChildPlaceOrder and increments this counter. Not placed items will still have
-         * [NotPlacedPlaceOrder] set.
+         * The order in which this node was placed by its parent during the previous
+         * `layoutChildren`. Before the placement the order is set to [NotPlacedPlaceOrder] to all
+         * the children. Then every placed node assigns this variable to parent's
+         * LayoutNodeLayoutDelegate's nextChildPlaceOrder and increments this counter. Not placed
+         * items will still have [NotPlacedPlaceOrder] set.
          */
         internal var placeOrder: Int = NotPlacedPlaceOrder
             private set
@@ -368,11 +363,12 @@
         private var measuredOnce = false
         private var placedOnce = false
         val lastConstraints: Constraints?
-            get() = if (measuredOnce) {
-                measurementConstraints
-            } else {
-                null
-            }
+            get() =
+                if (measuredOnce) {
+                    measurementConstraints
+                } else {
+                    null
+                }
 
         internal var measuredByParent: LayoutNode.UsageByParent = LayoutNode.UsageByParent.NotUsed
         internal var duringAlignmentLinesQuery = false
@@ -387,14 +383,18 @@
             private set
 
         /**
-         * Whether or not this [LayoutNode] and all of its parents have been placed in the hierarchy.
+         * Whether or not this [LayoutNode] and all of its parents have been placed in the
+         * hierarchy.
          */
         override var isPlaced: Boolean = false
             internal set
+
         var isPlacedByParent: Boolean = false
             internal set
+
         override val innerCoordinator: NodeCoordinator
             get() = layoutNode.innerCoordinator
+
         override val alignmentLines: AlignmentLines = LayoutNodeAlignmentLines(this)
 
         private val _childDelegates = MutableVector<MeasurePassDelegate>()
@@ -423,9 +423,7 @@
 
         private val layoutChildrenBlock: () -> Unit = {
             clearPlaceOrder()
-            forEachChildAlignmentLinesOwner {
-                it.alignmentLines.usedDuringParentLayout = false
-            }
+            forEachChildAlignmentLinesOwner { it.alignmentLines.usedDuringParentLayout = false }
             innerCoordinator.measureResult.placeChildren()
 
             checkChildrenPlaceOrderForUpdates()
@@ -444,9 +442,11 @@
             }
             // as a result of the previous operation we can figure out a child has been resized
             // and we need to be remeasured, not relaid out
-            if (layoutPendingForAlignment ||
-                (!duringAlignmentLinesQuery && !innerCoordinator.isPlacingForAlignment &&
-                    layoutPending)
+            if (
+                layoutPendingForAlignment ||
+                    (!duringAlignmentLinesQuery &&
+                        !innerCoordinator.isPlacingForAlignment &&
+                        layoutPending)
             ) {
                 layoutPending = false
                 val oldLayoutState = layoutState
@@ -462,9 +462,7 @@
                 }
                 layoutState = oldLayoutState
 
-                if (innerCoordinator.isPlacingForAlignment &&
-                    coordinatesAccessedDuringPlacement
-                ) {
+                if (innerCoordinator.isPlacingForAlignment && coordinatesAccessedDuringPlacement) {
                     requestLayout()
                 }
                 layoutPendingForAlignment = false
@@ -502,9 +500,7 @@
                     // nodes are not placed with a layer anymore, so the layers should be released
                     it.releaseLayer()
                 }
-                forEachChildDelegate {
-                    it.markSubtreeAsNotPlaced()
-                }
+                forEachChildDelegate { it.markSubtreeAsNotPlaced() }
             }
         }
 
@@ -520,7 +516,8 @@
                         requestLookaheadRemeasure(forceRequest = true)
                     }
                 }
-                // invalidate all the nodes layers that were invalidated while the node was not placed
+                // invalidate all the nodes layers that were invalidated while the node was not
+                // placed
                 forEachCoordinatorIncludingInner {
                     if (it.lastLayerDrawingWasSkipped) {
                         it.invalidateLayer()
@@ -550,8 +547,9 @@
         private var placeOuterCoordinatorZIndex = 0f
 
         private val placeOuterCoordinatorBlock: () -> Unit = {
-            val scope = outerCoordinator.wrappedBy?.placementScope
-                ?: layoutNode.requireOwner().placementScope
+            val scope =
+                outerCoordinator.wrappedBy?.placementScope
+                    ?: layoutNode.requireOwner().placementScope
             with(scope) {
                 val layerBlock = placeOuterCoordinatorLayerBlock
                 val layer = placeOuterCoordinatorLayer
@@ -576,17 +574,13 @@
             }
         }
 
-        /**
-         * Invoked when the parent placed the node. It will trigger the layout.
-         */
+        /** Invoked when the parent placed the node. It will trigger the layout. */
         internal fun onNodePlaced() {
             onNodePlacedCalled = true
             val parent = layoutNode.parent
 
             var newZIndex = innerCoordinator.zIndex
-            layoutNode.forEachCoordinator {
-                newZIndex += it.zIndex
-            }
+            layoutNode.forEachCoordinator { newZIndex += it.zIndex }
             if (newZIndex != zIndex) {
                 zIndex = newZIndex
                 parent?.onZSortedChildrenInvalidated()
@@ -606,8 +600,8 @@
             }
 
             if (parent != null) {
-                if (!relayoutWithoutParentInProgress &&
-                    parent.layoutState == LayoutState.LayingOut
+                if (
+                    !relayoutWithoutParentInProgress && parent.layoutState == LayoutState.LayingOut
                 ) {
                     // the parent is currently placing its children
                     checkPrecondition(placeOrder == NotPlacedPlaceOrder) {
@@ -644,14 +638,10 @@
         }
 
         private inline fun forEachChildDelegate(block: (MeasurePassDelegate) -> Unit) {
-            layoutNode.forEachChild {
-                block(it.measurePassDelegate)
-            }
+            layoutNode.forEachChild { block(it.measurePassDelegate) }
         }
 
-        /**
-         * The function to be executed when the parent layout measures its children.
-         */
+        /** The function to be executed when the parent layout measures its children. */
         override fun measure(constraints: Constraints): Placeable {
             if (layoutNode.intrinsicsUsageByParent == LayoutNode.UsageByParent.NotUsed) {
                 // This LayoutNode may have asked children for intrinsics. If so, we should
@@ -673,9 +663,7 @@
             return this
         }
 
-        /**
-         * Return true if the measured size has been changed
-         */
+        /** Return true if the measured size has been changed */
         fun remeasure(constraints: Constraints): Boolean {
             requirePrecondition(!layoutNode.isDeactivated) {
                 "measure is called on a deactivated node"
@@ -683,8 +671,8 @@
             val owner = layoutNode.requireOwner()
             val parent = layoutNode.parent
             @Suppress("Deprecation")
-            layoutNode.canMultiMeasure = layoutNode.canMultiMeasure ||
-                (parent != null && parent.canMultiMeasure)
+            layoutNode.canMultiMeasure =
+                layoutNode.canMultiMeasure || (parent != null && parent.canMultiMeasure)
             if (layoutNode.measurePending || measurementConstraints != constraints) {
                 alignmentLines.usedByModifierMeasurement = false
                 forEachChildAlignmentLinesOwner {
@@ -694,15 +682,18 @@
                 val outerPreviousMeasuredSize = outerCoordinator.size
                 measurementConstraints = constraints
                 performMeasure(constraints)
-                val sizeChanged = outerCoordinator.size != outerPreviousMeasuredSize ||
-                    outerCoordinator.width != width ||
-                    outerCoordinator.height != height
-                // We are using the coerced coordinator size here to avoid double offset in layout coop.
+                val sizeChanged =
+                    outerCoordinator.size != outerPreviousMeasuredSize ||
+                        outerCoordinator.width != width ||
+                        outerCoordinator.height != height
+                // We are using the coerced coordinator size here to avoid double offset in layout
+                // coop.
                 measuredSize = IntSize(outerCoordinator.width, outerCoordinator.height)
                 return sizeChanged
             } else {
                 // this node doesn't require being remeasured. however in order to make sure we have
-                // the final size we need to also make sure the whole subtree is remeasured as it can
+                // the final size we need to also make sure the whole subtree is remeasured as it
+                // can
                 // trigger extra remeasure request on our node. we do it now in order to report the
                 // final measured size to our parent without doing extra pass later.
                 owner.forceMeasureTheSubtree(layoutNode)
@@ -719,19 +710,19 @@
                 checkPrecondition(
                     measuredByParent == LayoutNode.UsageByParent.NotUsed ||
                         @Suppress("DEPRECATION") node.canMultiMeasure
-                ) { MeasuredTwiceErrorMessage }
-                measuredByParent = when (parent.layoutState) {
-                    LayoutState.Measuring ->
-                        LayoutNode.UsageByParent.InMeasureBlock
-
-                    LayoutState.LayingOut ->
-                        LayoutNode.UsageByParent.InLayoutBlock
-
-                    else -> throw IllegalStateException(
-                        "Measurable could be only measured from the parent's measure or layout" +
-                            " block. Parents state is ${parent.layoutState}"
-                    )
+                ) {
+                    MeasuredTwiceErrorMessage
                 }
+                measuredByParent =
+                    when (parent.layoutState) {
+                        LayoutState.Measuring -> LayoutNode.UsageByParent.InMeasureBlock
+                        LayoutState.LayingOut -> LayoutNode.UsageByParent.InLayoutBlock
+                        else ->
+                            throw IllegalStateException(
+                                "Measurable could be only measured from the parent's measure or layout" +
+                                    " block. Parents state is ${parent.layoutState}"
+                            )
+                    }
             } else {
                 // when we measure the root it is like the virtual parent is currently laying out
                 measuredByParent = LayoutNode.UsageByParent.NotUsed
@@ -742,8 +733,11 @@
         // double offseting for layout cooperation. However, this means that here we need
         // to override these getters to make the measured values correct in Measured.
         // TODO(popam): clean this up
-        override val measuredWidth: Int get() = outerCoordinator.measuredWidth
-        override val measuredHeight: Int get() = outerCoordinator.measuredHeight
+        override val measuredWidth: Int
+            get() = outerCoordinator.measuredWidth
+
+        override val measuredHeight: Int
+            get() = outerCoordinator.measuredHeight
 
         override fun get(alignmentLine: AlignmentLine): Int {
             if (layoutNode.parent?.layoutState == LayoutState.Measuring) {
@@ -765,11 +759,7 @@
             placeSelf(position, zIndex, layerBlock, null)
         }
 
-        override fun placeAt(
-            position: IntOffset,
-            zIndex: Float,
-            layer: GraphicsLayer
-        ) {
+        override fun placeAt(position: IntOffset, zIndex: Float, layer: GraphicsLayer) {
             placeSelf(position, zIndex, null, layer)
         }
 
@@ -801,9 +791,10 @@
         ) {
             isPlacedByParent = true
             if (position != lastPosition || needsCoordinatesUpdate) {
-                if (coordinatesAccessedDuringModifierPlacement ||
-                    coordinatesAccessedDuringPlacement ||
-                    needsCoordinatesUpdate
+                if (
+                    coordinatesAccessedDuringModifierPlacement ||
+                        coordinatesAccessedDuringPlacement ||
+                        needsCoordinatesUpdate
                 ) {
                     layoutPending = true
                     needsCoordinatesUpdate = false
@@ -811,20 +802,20 @@
                 notifyChildrenUsingCoordinatesWhilePlacing()
             }
             // This can actually be called as soon as LookaheadMeasure is done, but devs may expect
-            // certain placement results (e.g. LayoutCoordinates) to be valid when lookahead placement
+            // certain placement results (e.g. LayoutCoordinates) to be valid when lookahead
+            // placement
             // takes place. If that's not the case, it will make sense to move this right after
             // lookahead measure, before place.
             if (layoutNode.isOutMostLookaheadRoot()) {
                 // Lookahead placement first
-                val scope = outerCoordinator.wrappedBy?.placementScope
-                    ?: layoutNode.requireOwner().placementScope
+                val scope =
+                    outerCoordinator.wrappedBy?.placementScope
+                        ?: layoutNode.requireOwner().placementScope
                 with(scope) {
                     lookaheadPassDelegate!!.let {
                         // Since this is the root of the lookahead delegate tree, no parent will
                         // reset the place order, therefore we have to do it manually.
-                        layoutNode.parent?.run {
-                            layoutDelegate.nextChildLookaheadPlaceOrder = 0
-                        }
+                        layoutNode.parent?.run { layoutDelegate.nextChildLookaheadPlaceOrder = 0 }
                         it.placeOrder = NotPlacedPlaceOrder
                         it.place(position.x, position.y)
                     }
@@ -869,7 +860,9 @@
                 placeOuterCoordinatorZIndex = zIndex
                 placeOuterCoordinatorLayer = layer
                 owner.snapshotObserver.observeLayoutModifierSnapshotReads(
-                    layoutNode, affectsLookahead = false, block = placeOuterCoordinatorBlock
+                    layoutNode,
+                    affectsLookahead = false,
+                    block = placeOuterCoordinatorBlock
                 )
             }
 
@@ -928,17 +921,20 @@
             // constraints/sizes.
             layoutNode.requestRemeasure()
 
-            // Mark the intrinsics size has been used by the parent if it hasn't already been marked.
+            // Mark the intrinsics size has been used by the parent if it hasn't already been
+            // marked.
             val parent = layoutNode.parent
-            if (parent != null &&
-                layoutNode.intrinsicsUsageByParent == LayoutNode.UsageByParent.NotUsed
+            if (
+                parent != null &&
+                    layoutNode.intrinsicsUsageByParent == LayoutNode.UsageByParent.NotUsed
             ) {
-                layoutNode.intrinsicsUsageByParent = when (parent.layoutState) {
-                    LayoutState.Measuring -> LayoutNode.UsageByParent.InMeasureBlock
-                    LayoutState.LayingOut -> LayoutNode.UsageByParent.InLayoutBlock
-                    // Called from parent's intrinsic measurement
-                    else -> parent.intrinsicsUsageByParent
-                }
+                layoutNode.intrinsicsUsageByParent =
+                    when (parent.layoutState) {
+                        LayoutState.Measuring -> LayoutNode.UsageByParent.InMeasureBlock
+                        LayoutState.LayingOut -> LayoutNode.UsageByParent.InLayoutBlock
+                        // Called from parent's intrinsic measurement
+                        else -> parent.intrinsicsUsageByParent
+                    }
             }
         }
 
@@ -960,7 +956,8 @@
                 if (layoutState == LayoutState.Measuring) {
                     alignmentLines.usedByModifierMeasurement = true
                     // We quickly transition to layoutPending as we need the alignment lines now.
-                    // Later we will see that we also laid out as part of measurement and will skip layout.
+                    // Later we will see that we also laid out as part of measurement and will skip
+                    // layout.
                     if (alignmentLines.dirty) markLayoutPending()
                 } else {
                     // Note this can also happen for onGloballyPositioned queries.
@@ -977,9 +974,7 @@
             get() = layoutNode.parent?.layoutDelegate?.alignmentLinesOwner
 
         override fun forEachChildAlignmentLinesOwner(block: (AlignmentLinesOwner) -> Unit) {
-            layoutNode.forEachChild {
-                block(it.layoutDelegate.alignmentLinesOwner)
-            }
+            layoutNode.forEachChild { block(it.layoutDelegate.alignmentLinesOwner) }
         }
 
         override fun requestLayout() {
@@ -991,22 +986,23 @@
         }
 
         /**
-         * This is called any time a placement has done that changes the position during the
-         * layout pass. If any child is looking at their own coordinates to know how to
-         * place children, it will be invalided.
+         * This is called any time a placement has done that changes the position during the layout
+         * pass. If any child is looking at their own coordinates to know how to place children, it
+         * will be invalided.
          *
-         * Note that this is called for every changed position. While not many layouts
-         * look at their coordinates, if there is one, it will cause all position changes
-         * from an ancestor to call down the hierarchy. If this becomes expensive (e.g. many
-         * parents change their position on the same frame), it might be worth using a flag
-         * so that this call becomes cheap after the first one.
+         * Note that this is called for every changed position. While not many layouts look at their
+         * coordinates, if there is one, it will cause all position changes from an ancestor to call
+         * down the hierarchy. If this becomes expensive (e.g. many parents change their position on
+         * the same frame), it might be worth using a flag so that this call becomes cheap after the
+         * first one.
          */
         fun notifyChildrenUsingCoordinatesWhilePlacing() {
             if (childrenAccessingCoordinatesDuringPlacement > 0) {
                 layoutNode.forEachChild { child ->
                     val childLayoutDelegate = child.layoutDelegate
-                    val accessed = childLayoutDelegate.coordinatesAccessedDuringPlacement ||
-                        childLayoutDelegate.coordinatesAccessedDuringModifierPlacement
+                    val accessed =
+                        childLayoutDelegate.coordinatesAccessedDuringPlacement ||
+                            childLayoutDelegate.coordinatesAccessedDuringModifierPlacement
                     if (accessed && !childLayoutDelegate.layoutPending) {
                         child.requestRelayout()
                     }
@@ -1023,25 +1019,21 @@
          * children are not yet measured even if they are supposed to be measured in the measure
          * block of our parent.
          *
-         * Example:
-         * val child = Layout(...)
-         * Layout(child) { measurable, constraints ->
-         *    val placeable = measurable.first().measure(constraints)
-         *    layout(placeable.width, placeable.height) {
-         *       placeable.place(0, 0)
-         *    }
-         * }
-         * And now some set of changes scheduled remeasure for child and relayout for parent.
+         * Example: val child = Layout(...) Layout(child) { measurable, constraints -> val placeable
+         * = measurable.first().measure(constraints) layout(placeable.width, placeable.height) {
+         * placeable.place(0, 0) } } And now some set of changes scheduled remeasure for child and
+         * relayout for parent.
          *
-         * During the [MeasureAndLayoutDelegate.measureAndLayout] we will start with the parent as it
-         * has lower depth. Inside the layout block we will call placeable.width which is currently
-         * dirty as the child was scheduled to remeasure. This callback will ensure it never happens
-         * and pre-remeasure everything required for this layoutChildren().
+         * During the [MeasureAndLayoutDelegate.measureAndLayout] we will start with the parent as
+         * it has lower depth. Inside the layout block we will call placeable.width which is
+         * currently dirty as the child was scheduled to remeasure. This callback will ensure it
+         * never happens and pre-remeasure everything required for this layoutChildren().
          */
         private fun onBeforeLayoutChildren() {
             layoutNode.forEachChild {
-                if (it.measurePending &&
-                    it.measuredByParent == LayoutNode.UsageByParent.InMeasureBlock
+                if (
+                    it.measurePending &&
+                        it.measuredByParent == LayoutNode.UsageByParent.InMeasureBlock
                 ) {
                     if (it.remeasure()) {
                         layoutNode.requestRemeasure()
@@ -1066,10 +1058,8 @@
                 when (intrinsicsUsageByParent) {
                     LayoutNode.UsageByParent.InMeasureBlock ->
                         intrinsicsUsingParent.requestRemeasure(forceRequest)
-
                     LayoutNode.UsageByParent.InLayoutBlock ->
                         intrinsicsUsingParent.requestRelayout(forceRequest)
-
                     else -> error("Intrinsics isn't used by the parent")
                 }
             }
@@ -1090,30 +1080,29 @@
          */
         fun measureBasedOnLookahead() {
             val lookaheadDelegate = lookaheadPassDelegate
-            val parent = checkPreconditionNotNull(layoutNode.parent) {
-                "layoutNode parent is not set"
-            }
+            val parent =
+                checkPreconditionNotNull(layoutNode.parent) { "layoutNode parent is not set" }
             checkPreconditionNotNull(lookaheadDelegate) { "invalid lookaheadDelegate" }
-            if (lookaheadDelegate.measuredByParent == LayoutNode.UsageByParent.InMeasureBlock &&
-                parent.layoutState == LayoutState.Measuring
+            if (
+                lookaheadDelegate.measuredByParent == LayoutNode.UsageByParent.InMeasureBlock &&
+                    parent.layoutState == LayoutState.Measuring
             ) {
                 measure(lookaheadDelegate.lastConstraints!!)
             } else if (
                 lookaheadDelegate.measuredByParent == LayoutNode.UsageByParent.InLayoutBlock &&
-                parent.layoutState == LayoutState.LayingOut
+                    parent.layoutState == LayoutState.LayingOut
             ) {
                 measure(lookaheadDelegate.lastConstraints!!)
             }
         }
 
         /**
-         * Places the [MeasurePassDelegate] at the same position with the same zIndex and
-         * layerBlock as lookahead.
+         * Places the [MeasurePassDelegate] at the same position with the same zIndex and layerBlock
+         * as lookahead.
          */
         fun placeBasedOnLookahead() {
-            val lookaheadDelegate = checkPreconditionNotNull(lookaheadPassDelegate) {
-                "invalid lookaheadDelegate"
-            }
+            val lookaheadDelegate =
+                checkPreconditionNotNull(lookaheadPassDelegate) { "invalid lookaheadDelegate" }
             placeSelf(
                 lookaheadDelegate.lastPosition,
                 lookaheadDelegate.lastZIndex,
@@ -1124,11 +1113,11 @@
     }
 
     /**
-     * [LookaheadPassDelegate] manages the measure/layout and alignmentLine related queries for
-     * the lookahead pass.
+     * [LookaheadPassDelegate] manages the measure/layout and alignmentLine related queries for the
+     * lookahead pass.
      */
-    inner class LookaheadPassDelegate : Placeable(), Measurable, AlignmentLinesOwner,
-        MotionReferencePlacementDelegate {
+    inner class LookaheadPassDelegate :
+        Placeable(), Measurable, AlignmentLinesOwner, MotionReferencePlacementDelegate {
 
         /**
          * Is true during [replace] invocation. Helps to differentiate between the cases when our
@@ -1157,14 +1146,17 @@
         internal var measuredByParent = LayoutNode.UsageByParent.NotUsed
         internal val measurePassDelegate: MeasurePassDelegate
             get() = this@LayoutNodeLayoutDelegate.measurePassDelegate
+
         internal var duringAlignmentLinesQuery: Boolean = false
         internal var placedOnce: Boolean = false
         private var measuredOnce: Boolean = false
         val lastConstraints: Constraints?
             get() = lookaheadConstraints
+
         private var lookaheadConstraints: Constraints? = null
         internal var lastPosition: IntOffset = IntOffset.Zero
             private set
+
         internal var lastZIndex: Float = 0f
             private set
 
@@ -1178,15 +1170,14 @@
 
         override val innerCoordinator: NodeCoordinator
             get() = layoutNode.innerCoordinator
+
         override val alignmentLines: AlignmentLines = LookaheadAlignmentLines(this)
 
         private val _childDelegates = MutableVector<LookaheadPassDelegate>()
 
         internal var childDelegatesDirty: Boolean = true
 
-        /**
-         * [Measurable]s provided to layout during lookahead pass.
-         */
+        /** [Measurable]s provided to layout during lookahead pass. */
         internal val childDelegates: List<LookaheadPassDelegate>
             get() {
                 layoutNode.children.let {
@@ -1204,9 +1195,7 @@
             private set
 
         private inline fun forEachChildDelegate(block: (LookaheadPassDelegate) -> Unit) =
-            layoutNode.forEachChild {
-                block(it.layoutDelegate.lookaheadPassDelegate!!)
-            }
+            layoutNode.forEachChild { block(it.layoutDelegate.lookaheadPassDelegate!!) }
 
         override fun layoutChildren() {
             layingOutChildren = true
@@ -1218,9 +1207,11 @@
             val lookaheadDelegate = innerCoordinator.lookaheadDelegate!!
             // as a result of the previous operation we can figure out a child has been resized
             // and we need to be remeasured, not relaid out
-            if (lookaheadLayoutPendingForAlignment ||
-                (!duringAlignmentLinesQuery && !lookaheadDelegate.isPlacingForAlignment &&
-                    lookaheadLayoutPending)
+            if (
+                lookaheadLayoutPendingForAlignment ||
+                    (!duringAlignmentLinesQuery &&
+                        !lookaheadDelegate.isPlacingForAlignment &&
+                        lookaheadLayoutPending)
             ) {
                 lookaheadLayoutPending = false
                 val oldLayoutState = layoutState
@@ -1251,8 +1242,9 @@
                     }
                 }
                 layoutState = oldLayoutState
-                if (lookaheadCoordinatesAccessedDuringPlacement &&
-                    lookaheadDelegate.isPlacingForAlignment
+                if (
+                    lookaheadCoordinatesAccessedDuringPlacement &&
+                        lookaheadDelegate.isPlacingForAlignment
                 ) {
                     requestLayout()
                 }
@@ -1292,7 +1284,8 @@
                     // Mark alignments used by modifier
                     alignmentLines.usedByModifierMeasurement = true
                     // We quickly transition to layoutPending as we need the alignment lines now.
-                    // Later we will see that we also laid out as part of measurement and will skip layout.
+                    // Later we will see that we also laid out as part of measurement and will skip
+                    // layout.
                     if (alignmentLines.dirty) markLookaheadLayoutPending()
                 } else {
                     // Note this can also happen for onGloballyPositioned queries.
@@ -1309,9 +1302,7 @@
             get() = layoutNode.parent?.layoutDelegate?.lookaheadAlignmentLinesOwner
 
         override fun forEachChildAlignmentLinesOwner(block: (AlignmentLinesOwner) -> Unit) {
-            layoutNode.forEachChild {
-                block(it.layoutDelegate.lookaheadAlignmentLinesOwner!!)
-            }
+            layoutNode.forEachChild { block(it.layoutDelegate.lookaheadAlignmentLinesOwner!!) }
         }
 
         override fun requestLayout() {
@@ -1327,11 +1318,11 @@
          * lookahead layout pass. If any child is looking at their own coordinates to know how to
          * place children, it will be invalided.
          *
-         * Note that this is called for every changed position. While not many layouts
-         * look at their coordinates, if there is one, it will cause all position changes
-         * from an ancestor to call down the hierarchy. If this becomes expensive (e.g. many
-         * parents change their position on the same frame), it might be worth using a flag
-         * so that this call becomes cheap after the first one.
+         * Note that this is called for every changed position. While not many layouts look at their
+         * coordinates, if there is one, it will cause all position changes from an ancestor to call
+         * down the hierarchy. If this becomes expensive (e.g. many parents change their position on
+         * the same frame), it might be worth using a flag so that this call becomes cheap after the
+         * first one.
          */
         fun notifyChildrenUsingLookaheadCoordinatesWhilePlacing() {
             if (childrenAccessingLookaheadCoordinatesDuringPlacement > 0) {
@@ -1350,8 +1341,9 @@
         }
 
         override fun measure(constraints: Constraints): Placeable {
-            if (layoutNode.parent?.layoutState == LayoutState.LookaheadMeasuring ||
-                layoutNode.parent?.layoutState == LayoutState.LookaheadLayingOut
+            if (
+                layoutNode.parent?.layoutState == LayoutState.LookaheadMeasuring ||
+                    layoutNode.parent?.layoutState == LayoutState.LookaheadLayingOut
             ) {
                 detachedFromParentLookaheadPass = false
             }
@@ -1377,19 +1369,21 @@
                 checkPrecondition(
                     measuredByParent == LayoutNode.UsageByParent.NotUsed ||
                         @Suppress("DEPRECATION") node.canMultiMeasure
-                ) { MeasuredTwiceErrorMessage }
-                measuredByParent = when (parent.layoutState) {
-                    LayoutState.LookaheadMeasuring, LayoutState.Measuring ->
-                        LayoutNode.UsageByParent.InMeasureBlock
-
-                    LayoutState.LayingOut, LayoutState.LookaheadLayingOut ->
-                        LayoutNode.UsageByParent.InLayoutBlock
-
-                    else -> throw IllegalStateException(
-                        "Measurable could be only measured from the parent's measure or layout" +
-                            " block. Parents state is ${parent.layoutState}"
-                    )
+                ) {
+                    MeasuredTwiceErrorMessage
                 }
+                measuredByParent =
+                    when (parent.layoutState) {
+                        LayoutState.LookaheadMeasuring,
+                        LayoutState.Measuring -> LayoutNode.UsageByParent.InMeasureBlock
+                        LayoutState.LayingOut,
+                        LayoutState.LookaheadLayingOut -> LayoutNode.UsageByParent.InLayoutBlock
+                        else ->
+                            throw IllegalStateException(
+                                "Measurable could be only measured from the parent's measure or layout" +
+                                    " block. Parents state is ${parent.layoutState}"
+                            )
+                    }
             } else {
                 measuredByParent = LayoutNode.UsageByParent.NotUsed
             }
@@ -1406,8 +1400,8 @@
             }
             val parent = layoutNode.parent
             @Suppress("Deprecation")
-            layoutNode.canMultiMeasure = layoutNode.canMultiMeasure ||
-                (parent != null && parent.canMultiMeasure)
+            layoutNode.canMultiMeasure =
+                layoutNode.canMultiMeasure || (parent != null && parent.canMultiMeasure)
             if (layoutNode.lookaheadMeasurePending || lookaheadConstraints != constraints) {
                 lookaheadConstraints = constraints
                 measurementConstraints = constraints
@@ -1418,10 +1412,8 @@
                 // Copy out the previous size before performing lookahead measure. If never
                 // measured, set the last size to negative instead of Zero in anticipation for zero
                 // being a valid lookahead size.
-                val lastLookaheadSize = if (measuredOnce)
-                    measuredSize
-                else
-                    IntSize(Int.MIN_VALUE, Int.MIN_VALUE)
+                val lastLookaheadSize =
+                    if (measuredOnce) measuredSize else IntSize(Int.MIN_VALUE, Int.MIN_VALUE)
                 measuredOnce = true
                 val lookaheadDelegate = outerCoordinator.lookaheadDelegate
                 checkPrecondition(lookaheadDelegate != null) {
@@ -1430,8 +1422,9 @@
 
                 performLookaheadMeasure(constraints)
                 measuredSize = IntSize(lookaheadDelegate.width, lookaheadDelegate.height)
-                val sizeChanged = lastLookaheadSize.width != lookaheadDelegate.width ||
-                    lastLookaheadSize.height != lookaheadDelegate.height
+                val sizeChanged =
+                    lastLookaheadSize.width != lookaheadDelegate.width ||
+                        lastLookaheadSize.height != lookaheadDelegate.height
                 return sizeChanged
             } else {
                 // this node doesn't require being remeasured. however in order to make sure we have
@@ -1454,11 +1447,7 @@
             placeSelf(position, zIndex, layerBlock, null)
         }
 
-        override fun placeAt(
-            position: IntOffset,
-            zIndex: Float,
-            layer: GraphicsLayer
-        ) {
+        override fun placeAt(position: IntOffset, zIndex: Float, layer: GraphicsLayer) {
             placeSelf(position, zIndex, null, layer)
         }
 
@@ -1485,8 +1474,9 @@
             placedOnce = true
             onNodePlacedCalled = false
             if (position != lastPosition) {
-                if (lookaheadCoordinatesAccessedDuringModifierPlacement ||
-                    lookaheadCoordinatesAccessedDuringPlacement
+                if (
+                    lookaheadCoordinatesAccessedDuringModifierPlacement ||
+                        lookaheadCoordinatesAccessedDuringPlacement
                 ) {
                     lookaheadLayoutPending = true
                 }
@@ -1501,14 +1491,13 @@
                 lookaheadCoordinatesAccessedDuringModifierPlacement = false
                 alignmentLines.usedByModifierLayout = false
                 owner.snapshotObserver.observeLayoutModifierSnapshotReads(layoutNode) {
-                    val scope = if (layoutNode.isOutMostLookaheadRoot()) {
-                        outerCoordinator.wrappedBy?.placementScope
-                    } else {
-                        outerCoordinator.wrappedBy?.lookaheadDelegate?.placementScope
-                    } ?: owner.placementScope
-                    with(scope) {
-                        outerCoordinator.lookaheadDelegate!!.place(position)
-                    }
+                    val scope =
+                        if (layoutNode.isOutMostLookaheadRoot()) {
+                            outerCoordinator.wrappedBy?.placementScope
+                        } else {
+                            outerCoordinator.wrappedBy?.lookaheadDelegate?.placementScope
+                        } ?: owner.placementScope
+                    with(scope) { outerCoordinator.lookaheadDelegate!!.place(position) }
                 }
             }
             lastPosition = position
@@ -1522,8 +1511,11 @@
         // double offseting for layout cooperation. However, this means that here we need
         // to override these getters to make the measured values correct in Measured.
         // TODO(popam): clean this up
-        override val measuredWidth: Int get() = outerCoordinator.lookaheadDelegate!!.measuredWidth
-        override val measuredHeight: Int get() = outerCoordinator.lookaheadDelegate!!.measuredHeight
+        override val measuredWidth: Int
+            get() = outerCoordinator.lookaheadDelegate!!.measuredWidth
+
+        override val measuredHeight: Int
+            get() = outerCoordinator.lookaheadDelegate!!.measuredHeight
 
         override fun get(alignmentLine: AlignmentLine): Int {
             if (layoutNode.parent?.layoutState == LayoutState.LookaheadMeasuring) {
@@ -1568,17 +1560,20 @@
             // constraints/sizes.
             layoutNode.requestLookaheadRemeasure()
 
-            // Mark the intrinsics size has been used by the parent if it hasn't already been marked.
+            // Mark the intrinsics size has been used by the parent if it hasn't already been
+            // marked.
             val parent = layoutNode.parent
-            if (parent != null &&
-                layoutNode.intrinsicsUsageByParent == LayoutNode.UsageByParent.NotUsed
+            if (
+                parent != null &&
+                    layoutNode.intrinsicsUsageByParent == LayoutNode.UsageByParent.NotUsed
             ) {
-                layoutNode.intrinsicsUsageByParent = when (parent.layoutState) {
-                    LayoutState.Measuring -> LayoutNode.UsageByParent.InMeasureBlock
-                    LayoutState.LayingOut -> LayoutNode.UsageByParent.InLayoutBlock
-                    // Called from parent's intrinsic measurement
-                    else -> parent.intrinsicsUsageByParent
-                }
+                layoutNode.intrinsicsUsageByParent =
+                    when (parent.layoutState) {
+                        LayoutState.Measuring -> LayoutNode.UsageByParent.InMeasureBlock
+                        LayoutState.LayingOut -> LayoutNode.UsageByParent.InLayoutBlock
+                        // Called from parent's intrinsic measurement
+                        else -> parent.intrinsicsUsageByParent
+                    }
             }
         }
 
@@ -1602,14 +1597,12 @@
                         } else {
                             intrinsicsUsingParent.requestRemeasure(forceRequest)
                         }
-
                     LayoutNode.UsageByParent.InLayoutBlock ->
                         if (intrinsicsUsingParent.lookaheadRoot != null) {
                             intrinsicsUsingParent.requestLookaheadRelayout(forceRequest)
                         } else {
                             intrinsicsUsingParent.requestRelayout(forceRequest)
                         }
-
                     else -> error("Intrinsics isn't used by the parent")
                 }
             }
@@ -1643,9 +1636,10 @@
                 }
             }
             if (parent != null) {
-                if (!relayoutWithoutParentInProgress &&
-                    (parent.layoutState == LayoutState.LayingOut ||
-                        parent.layoutState == LayoutState.LookaheadLayingOut)
+                if (
+                    !relayoutWithoutParentInProgress &&
+                        (parent.layoutState == LayoutState.LayingOut ||
+                            parent.layoutState == LayoutState.LookaheadLayingOut)
                 ) {
                     // the parent is currently placing its children
                     checkPrecondition(placeOrder == NotPlacedPlaceOrder) {
@@ -1690,8 +1684,10 @@
             }
 
             layoutNode.forEachChild {
-                // this child was placed during the previous parent's layoutChildren(). this means that
-                // before the parent became not placed this child was placed. we need to restore that
+                // this child was placed during the previous parent's layoutChildren(). this means
+                // that
+                // before the parent became not placed this child was placed. we need to restore
+                // that
                 if (it.placeOrder != NotPlacedPlaceOrder) {
                     it.lookaheadPassDelegate!!.markNodeAndSubtreeAsPlaced()
                     it.rescheduleRemeasureOrRelayout(it)
@@ -1706,27 +1702,24 @@
          * children are not yet measured even if they are supposed to be measured in the measure
          * block of our parent.
          *
-         * Example:
-         * val child = Layout(...)
-         * Layout(child) { measurable, constraints ->
-         *    val placeable = measurable.first().measure(constraints)
-         *    layout(placeable.width, placeable.height) {
-         *       placeable.place(0, 0)
-         *    }
-         * }
-         * And now some set of changes scheduled remeasure for child and relayout for parent.
+         * Example: val child = Layout(...) Layout(child) { measurable, constraints -> val placeable
+         * = measurable.first().measure(constraints) layout(placeable.width, placeable.height) {
+         * placeable.place(0, 0) } } And now some set of changes scheduled remeasure for child and
+         * relayout for parent.
          *
-         * During the [MeasureAndLayoutDelegate.measureAndLayout] we will start with the parent as it
-         * has lower depth. Inside the layout block we will call placeable.width which is currently
-         * dirty as the child was scheduled to remeasure. This callback will ensure it never happens
-         * and pre-remeasure everything required for this layoutChildren().
+         * During the [MeasureAndLayoutDelegate.measureAndLayout] we will start with the parent as
+         * it has lower depth. Inside the layout block we will call placeable.width which is
+         * currently dirty as the child was scheduled to remeasure. This callback will ensure it
+         * never happens and pre-remeasure everything required for this layoutChildren().
          */
         private fun onBeforeLayoutChildren() {
             layoutNode.forEachChild {
-                if (it.lookaheadMeasurePending &&
-                    it.measuredByParentInLookahead == LayoutNode.UsageByParent.InMeasureBlock
+                if (
+                    it.lookaheadMeasurePending &&
+                        it.measuredByParentInLookahead == LayoutNode.UsageByParent.InMeasureBlock
                 ) {
-                    if (it.layoutDelegate.lookaheadPassDelegate!!.remeasure(
+                    if (
+                        it.layoutDelegate.lookaheadPassDelegate!!.remeasure(
                             it.layoutDelegate.lastLookaheadConstraints!!
                         )
                     ) {
@@ -1762,8 +1755,8 @@
     }
 
     /**
-     * Performs measure with the given constraints and perform necessary state mutations before
-     * and after the measurement.
+     * Performs measure with the given constraints and perform necessary state mutations before and
+     * after the measurement.
      */
     private fun performMeasure(constraints: Constraints) {
         checkPrecondition(layoutState == LayoutState.Idle) {
@@ -1772,11 +1765,10 @@
         layoutState = LayoutState.Measuring
         measurePending = false
         performMeasureConstraints = constraints
-        layoutNode.requireOwner().snapshotObserver.observeMeasureSnapshotReads(
-            layoutNode,
-            affectsLookahead = false,
-            performMeasureBlock
-        )
+        layoutNode
+            .requireOwner()
+            .snapshotObserver
+            .observeMeasureSnapshotReads(layoutNode, affectsLookahead = false, performMeasureBlock)
         // The resulting layout state might be Ready. This can happen when the layout node's
         // own modifier is querying an alignment line during measurement, therefore we
         // need to also layout the layout node.
@@ -1786,9 +1778,7 @@
         }
     }
 
-    private fun performLookaheadMeasure(
-        constraints: Constraints
-    ) {
+    private fun performLookaheadMeasure(constraints: Constraints) {
         layoutState = LayoutState.LookaheadMeasuring
         lookaheadMeasurePending = false
         layoutNode.requireOwner().snapshotObserver.observeMeasureSnapshotReads(layoutNode) {
@@ -1843,8 +1833,8 @@
 }
 
 /**
- * Returns if the we are at the lookahead root of the tree, by checking if the parent is
- * has a lookahead root.
+ * Returns if the we are at the lookahead root of the tree, by checking if the parent is has a
+ * lookahead root.
  */
 internal fun LayoutNode.isOutMostLookaheadRoot(): Boolean =
     lookaheadRoot != null &&
@@ -1861,10 +1851,7 @@
             destination[i] = transform(layoutNode)
         }
     }
-    destination.removeRange(
-        children.size,
-        destination.size
-    )
+    destination.removeRange(children.size, destination.size)
 }
 
 private const val MeasuredTwiceErrorMessage: String =
@@ -1883,14 +1870,10 @@
  * measure/layout pass.
  */
 internal interface AlignmentLinesOwner : Measurable {
-    /**
-     * Whether the AlignmentLinesOwner has been placed.
-     */
+    /** Whether the AlignmentLinesOwner has been placed. */
     val isPlaced: Boolean
 
-    /**
-     * InnerNodeCoordinator of the LayoutNode that the AlignmentLinesOwner operates on.
-     */
+    /** InnerNodeCoordinator of the LayoutNode that the AlignmentLinesOwner operates on. */
     val innerCoordinator: NodeCoordinator
 
     /**
@@ -1905,9 +1888,7 @@
      */
     fun layoutChildren()
 
-    /**
-     * Recalculate the alignment lines if dirty, and layout children as needed.
-     */
+    /** Recalculate the alignment lines if dirty, and layout children as needed. */
     fun calculateAlignmentLines(): Map<AlignmentLine, Int>
 
     /**
@@ -1924,15 +1905,14 @@
 
     /**
      * Depending on which pass the [AlignmentLinesOwner] is created for, this could mean
-     * requestLookaheadLayout() for the lookahead pass, or requestLayout() for post-
-     * lookahead pass.
+     * requestLookaheadLayout() for the lookahead pass, or requestLayout() for post- lookahead pass.
      */
     fun requestLayout()
 
     /**
      * Depending on which pass the [AlignmentLinesOwner] is created for, this could mean
-     * requestLookaheadMeasure() for the lookahead pass, or requestMeasure() for post-
-     * lookahead pass.
+     * requestLookaheadMeasure() for the lookahead pass, or requestMeasure() for post- lookahead
+     * pass.
      */
     fun requestMeasure()
 }
@@ -1950,8 +1930,8 @@
      * [LookaheadCapablePlaceable.isPlacedUnderMotionFrameOfReference] flag updated to the given
      * value.
      *
-     * The placeable should be tagged such that its corresponding coordinates reflect the
-     * flag in [androidx.compose.ui.layout.LayoutCoordinates.introducesMotionFrameOfReference]. Note that
+     * The placeable should be tagged such that its corresponding coordinates reflect the flag in
+     * [androidx.compose.ui.layout.LayoutCoordinates.introducesMotionFrameOfReference]. Note that
      * when it's placed on the current frame of reference, it means it doesn't introduce a new frame
      * of reference.
      *
diff --git a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/node/LayoutTreeConsistencyChecker.kt b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/node/LayoutTreeConsistencyChecker.kt
index d29a142..0e8e58f 100644
--- a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/node/LayoutTreeConsistencyChecker.kt
+++ b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/node/LayoutTreeConsistencyChecker.kt
@@ -21,8 +21,8 @@
 
 /**
  * There are some contracts between the tree of LayoutNodes and the state of AndroidComposeView
- * which is hard to enforce but important to maintain. This method is intended to do the
- * work only during our tests and will iterate through the tree to validate the states consistency.
+ * which is hard to enforce but important to maintain. This method is intended to do the work only
+ * during our tests and will iterate through the tree to validate the states consistency.
  */
 internal class LayoutTreeConsistencyChecker(
     private val root: LayoutNode,
@@ -52,11 +52,12 @@
     private fun LayoutNode.consistentLayoutState(): Boolean {
         val parent = this.parent
         val parentLayoutState = parent?.layoutState
-        if (isPlaced ||
-            placeOrder != LayoutNode.NotPlacedPlaceOrder && parent?.isPlaced == true
-        ) {
-            if (measurePending && postponedMeasureRequests
-                    .fastFirstOrNull { it.node == this && !it.isLookahead } != null
+        if (isPlaced || placeOrder != LayoutNode.NotPlacedPlaceOrder && parent?.isPlaced == true) {
+            if (
+                measurePending &&
+                    postponedMeasureRequests.fastFirstOrNull {
+                        it.node == this && !it.isLookahead
+                    } != null
             ) {
                 // this node is waiting to be measured by parent or if this will not happen
                 // `onRequestMeasure` will be called for all items in `postponedMeasureRequests`
@@ -84,8 +85,11 @@
             }
         }
         if (isPlacedInLookahead == true) {
-            if (lookaheadMeasurePending && postponedMeasureRequests
-                    .fastFirstOrNull { it.node == this && it.isLookahead } != null
+            if (
+                lookaheadMeasurePending &&
+                    postponedMeasureRequests.fastFirstOrNull {
+                        it.node == this && it.isLookahead
+                    } != null
             ) {
                 // this node is waiting to be lookahead measured by parent or if this will not
                 // happen `onRequestLookaheadMeasure` will be called for all items in
diff --git a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/node/LookaheadDelegate.kt b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/node/LookaheadDelegate.kt
index 71f265d..0d48db4 100644
--- a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/node/LookaheadDelegate.kt
+++ b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/node/LookaheadDelegate.kt
@@ -39,11 +39,11 @@
 import androidx.compose.ui.unit.LayoutDirection
 
 /**
- * This is the base class for NodeCoordinator and LookaheadDelegate. The common
- * functionalities between the two are extracted here.
+ * This is the base class for NodeCoordinator and LookaheadDelegate. The common functionalities
+ * between the two are extracted here.
  */
-internal abstract class LookaheadCapablePlaceable : Placeable(), MeasureScopeWithLayoutNode,
-    MotionReferencePlacementDelegate {
+internal abstract class LookaheadCapablePlaceable :
+    Placeable(), MeasureScopeWithLayoutNode, MotionReferencePlacementDelegate {
     abstract val position: IntOffset
     abstract val child: LookaheadCapablePlaceable?
     abstract val parent: LookaheadCapablePlaceable?
@@ -62,62 +62,65 @@
 
     val rulerScope: RulerScope
         get() {
-            return _rulerScope ?: object : RulerScope {
-                override val coordinates: LayoutCoordinates
-                    get() {
-                        this@LookaheadCapablePlaceable.layoutNode.layoutDelegate.onCoordinatesUsed()
-                        return this@LookaheadCapablePlaceable.coordinates
+            return _rulerScope
+                ?: object : RulerScope {
+                    override val coordinates: LayoutCoordinates
+                        get() {
+                            this@LookaheadCapablePlaceable.layoutNode.layoutDelegate
+                                .onCoordinatesUsed()
+                            return this@LookaheadCapablePlaceable.coordinates
+                        }
+
+                    override fun Ruler.provides(value: Float) {
+                        this@LookaheadCapablePlaceable.provideRulerValue(this, value)
                     }
 
-                override fun Ruler.provides(value: Float) {
-                    this@LookaheadCapablePlaceable.provideRulerValue(this, value)
-                }
+                    override fun VerticalRuler.providesRelative(value: Float) {
+                        this@LookaheadCapablePlaceable.provideRelativeRulerValue(this, value)
+                    }
 
-                override fun VerticalRuler.providesRelative(value: Float) {
-                    this@LookaheadCapablePlaceable.provideRelativeRulerValue(this, value)
-                }
+                    override val density: Float
+                        get() = this@LookaheadCapablePlaceable.density
 
-                override val density: Float
-                    get() = this@LookaheadCapablePlaceable.density
-                override val fontScale: Float
-                    get() = this@LookaheadCapablePlaceable.fontScale
-            }
+                    override val fontScale: Float
+                        get() = this@LookaheadCapablePlaceable.fontScale
+                }
         }
 
     final override fun get(alignmentLine: AlignmentLine): Int {
         if (!hasMeasureResult) return AlignmentLine.Unspecified
         val measuredPosition = calculateAlignmentLine(alignmentLine)
         if (measuredPosition == AlignmentLine.Unspecified) return AlignmentLine.Unspecified
-        return measuredPosition + if (alignmentLine is VerticalAlignmentLine) {
-            apparentToRealOffset.x
-        } else {
-            apparentToRealOffset.y
-        }
+        return measuredPosition +
+            if (alignmentLine is VerticalAlignmentLine) {
+                apparentToRealOffset.x
+            } else {
+                apparentToRealOffset.y
+            }
     }
 
     abstract fun calculateAlignmentLine(alignmentLine: AlignmentLine): Int
 
     /**
-     * True when the coordinator is running its own placing block to obtain the position
-     * in parent, but is not interested in the position of children.
+     * True when the coordinator is running its own placing block to obtain the position in parent,
+     * but is not interested in the position of children.
      */
     internal var isShallowPlacing: Boolean = false
     internal abstract val measureResult: MeasureResult
+
     internal abstract fun replace()
+
     abstract val alignmentLinesOwner: AlignmentLinesOwner
 
     /**
-     * Used to indicate that this placement pass is for the purposes of calculating an
-     * alignment line. If it is, then
-     * [LayoutNodeLayoutDelegate.coordinatesAccessedDuringPlacement] will be changed
-     * when [Placeable.PlacementScope.coordinates] is accessed to indicate that the placement
-     * is not finalized and must be run again.
+     * Used to indicate that this placement pass is for the purposes of calculating an alignment
+     * line. If it is, then [LayoutNodeLayoutDelegate.coordinatesAccessedDuringPlacement] will be
+     * changed when [Placeable.PlacementScope.coordinates] is accessed to indicate that the
+     * placement is not finalized and must be run again.
      */
     internal var isPlacingForAlignment = false
 
-    /**
-     * [PlacementScope] used to place children.
-     */
+    /** [PlacementScope] used to place children. */
     val placementScope = PlacementScope(this)
 
     protected fun NodeCoordinator.invalidateAlignmentLinesFromPositionChange() {
@@ -137,7 +140,8 @@
     // For comparing before and after running the ruler lambda
     private var rulerValuesCache: MutableObjectFloatMap<Ruler>? = null
     private var rulerReaders:
-        MutableScatterMap<Ruler, MutableScatterSet<WeakReference<LayoutNode>>>? = null
+        MutableScatterMap<Ruler, MutableScatterSet<WeakReference<LayoutNode>>>? =
+        null
 
     fun findRulerValue(ruler: Ruler, defaultValue: Float): Float {
         if (isPlacingForAlignment) {
@@ -160,17 +164,14 @@
     }
 
     private fun addRulerReader(layoutNode: LayoutNode, ruler: Ruler) {
-        rulerReaders?.forEachValue { set ->
-            set.removeIf { it.get()?.isAttached != true }
-        }
+        rulerReaders?.forEachValue { set -> set.removeIf { it.get()?.isAttached != true } }
         rulerReaders?.removeIf { _, value -> value.isEmpty() }
-        val readerMap = rulerReaders
-            ?: MutableScatterMap<Ruler, MutableScatterSet<WeakReference<LayoutNode>>>().also {
-                rulerReaders = it
-            }
-        val readers = readerMap.getOrPut(ruler) {
-            MutableScatterSet()
-        }
+        val readerMap =
+            rulerReaders
+                ?: MutableScatterMap<Ruler, MutableScatterSet<WeakReference<LayoutNode>>>().also {
+                    rulerReaders = it
+                }
+        val readers = readerMap.getOrPut(ruler) { MutableScatterSet() }
         readers += WeakReference(layoutNode)
     }
 
@@ -212,10 +213,13 @@
         return object : MeasureResult {
             override val width: Int
                 get() = width
+
             override val height: Int
                 get() = height
+
             override val alignmentLines: Map<AlignmentLine, Int>
                 get() = alignmentLines
+
             override val rulers: (RulerScope.() -> Unit)?
                 get() = rulers
 
@@ -248,11 +252,9 @@
                 rulerReaders.clear()
             }
         } else {
-            val oldValues = rulerValuesCache ?: MutableObjectFloatMap<Ruler>().also {
-                rulerValuesCache = it
-            }
-            val newValues =
-                rulerValues ?: MutableObjectFloatMap<Ruler>().also { rulerValues = it }
+            val oldValues =
+                rulerValuesCache ?: MutableObjectFloatMap<Ruler>().also { rulerValuesCache = it }
+            val newValues = rulerValues ?: MutableObjectFloatMap<Ruler>().also { rulerValues = it }
             oldValues.putAll(newValues)
             newValues.clear()
             // capture the new values
@@ -306,16 +308,16 @@
 
     fun provideRelativeRulerValue(ruler: Ruler, value: Float) {
         val rulerValues = rulerValues ?: MutableObjectFloatMap<Ruler>().also { rulerValues = it }
-        rulerValues[ruler] = if (layoutDirection == LayoutDirection.Ltr) {
-            value
-        } else {
-            width - value
-        }
+        rulerValues[ruler] =
+            if (layoutDirection == LayoutDirection.Ltr) {
+                value
+            } else {
+                width - value
+            }
     }
 
     companion object {
-        private val onCommitAffectingRuler:
-                (PlaceableResult) -> Unit = { result ->
+        private val onCommitAffectingRuler: (PlaceableResult) -> Unit = { result ->
             if (result.isValidOwnerScope) {
                 result.placeable.captureRulers(result)
             }
@@ -349,26 +351,37 @@
 ) : Measurable, LookaheadCapablePlaceable() {
     override val child: LookaheadCapablePlaceable?
         get() = coordinator.wrapped?.lookaheadDelegate
+
     override val hasMeasureResult: Boolean
         get() = _measureResult != null
+
     override var position = IntOffset.Zero
     private var oldAlignmentLines: MutableMap<AlignmentLine, Int>? = null
     override val measureResult: MeasureResult
-        get() = _measureResult ?: error(
-            "LookaheadDelegate has not been measured yet when measureResult is requested."
-        )
+        get() =
+            _measureResult
+                ?: error(
+                    "LookaheadDelegate has not been measured yet when measureResult is requested."
+                )
+
     override val isLookingAhead: Boolean
         get() = true
+
     override val layoutDirection: LayoutDirection
         get() = coordinator.layoutDirection
+
     override val density: Float
         get() = coordinator.density
+
     override val fontScale: Float
         get() = coordinator.fontScale
+
     override val parent: LookaheadCapablePlaceable?
         get() = coordinator.wrappedBy?.lookaheadDelegate
+
     override val layoutNode: LayoutNode
         get() = coordinator.layoutNode
+
     override val coordinates: LayoutCoordinates
         get() = lookaheadLayoutCoordinates
 
@@ -384,20 +397,21 @@
 
     private var _measureResult: MeasureResult? = null
         set(result) {
-            result?.let {
-                measuredSize = IntSize(it.width, it.height)
-            } ?: run { measuredSize = IntSize.Zero }
+            result?.let { measuredSize = IntSize(it.width, it.height) }
+                ?: run { measuredSize = IntSize.Zero }
             if (field != result && result != null) {
                 // We do not simply compare against old.alignmentLines in case this is a
                 // MutableStateMap and the same instance might be passed.
-                if ((!oldAlignmentLines.isNullOrEmpty() || result.alignmentLines.isNotEmpty()) &&
-                    result.alignmentLines != oldAlignmentLines
+                if (
+                    (!oldAlignmentLines.isNullOrEmpty() || result.alignmentLines.isNotEmpty()) &&
+                        result.alignmentLines != oldAlignmentLines
                 ) {
                     alignmentLinesOwner.alignmentLines.onAlignmentsChanged()
 
                     @Suppress("PrimitiveInCollection")
-                    val oldLines = oldAlignmentLines
-                        ?: (mutableMapOf<AlignmentLine, Int>().also { oldAlignmentLines = it })
+                    val oldLines =
+                        oldAlignmentLines
+                            ?: (mutableMapOf<AlignmentLine, Int>().also { oldAlignmentLines = it })
                     oldLines.clear()
                     oldLines.putAll(result.alignmentLines)
                 }
@@ -444,10 +458,7 @@
         measureResult.placeChildren()
     }
 
-    inline fun performingMeasure(
-        constraints: Constraints,
-        block: () -> MeasureResult
-    ): Placeable {
+    inline fun performingMeasure(constraints: Constraints, block: () -> MeasureResult): Placeable {
         measurementConstraints = constraints
         _measureResult = block()
         return this
@@ -479,8 +490,9 @@
         var aggregatedOffset = IntOffset.Zero
         var lookaheadDelegate = this
         while (lookaheadDelegate != ancestor) {
-            if (!lookaheadDelegate.isPlacedUnderMotionFrameOfReference ||
-                !excludingAgnosticOffset) {
+            if (
+                !lookaheadDelegate.isPlacedUnderMotionFrameOfReference || !excludingAgnosticOffset
+            ) {
                 aggregatedOffset += lookaheadDelegate.position
             }
             lookaheadDelegate = lookaheadDelegate.coordinator.wrappedBy!!.lookaheadDelegate!!
diff --git a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/node/MeasureAndLayoutDelegate.kt b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/node/MeasureAndLayoutDelegate.kt
index d348f9c..622270a 100644
--- a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/node/MeasureAndLayoutDelegate.kt
+++ b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/node/MeasureAndLayoutDelegate.kt
@@ -39,24 +39,18 @@
  * [measureAndLayout] execution.
  */
 internal class MeasureAndLayoutDelegate(private val root: LayoutNode) {
-    /**
-     * LayoutNodes that need measure or layout.
-     */
+    /** LayoutNodes that need measure or layout. */
     private val relayoutNodes = DepthSortedSetsForDifferentPasses(Owner.enableExtraAssertions)
 
-    /**
-     * Whether any LayoutNode needs measure or layout.
-     */
-    val hasPendingMeasureOrLayout get() = relayoutNodes.isNotEmpty()
+    /** Whether any LayoutNode needs measure or layout. */
+    val hasPendingMeasureOrLayout
+        get() = relayoutNodes.isNotEmpty()
 
-    /**
-     * Whether any on positioned callbacks need to be dispatched
-     */
-    val hasPendingOnPositionedCallbacks get() = onPositionedDispatcher.isNotEmpty()
+    /** Whether any on positioned callbacks need to be dispatched */
+    val hasPendingOnPositionedCallbacks
+        get() = onPositionedDispatcher.isNotEmpty()
 
-    /**
-     * Flag to indicate that we're currently measuring.
-     */
+    /** Flag to indicate that we're currently measuring. */
     private var duringMeasureLayout = false
     /**
      * True when we are currently executing a full measure/layout pass, which mean we will iterate
@@ -64,14 +58,10 @@
      */
     private var duringFullMeasureLayoutPass = false
 
-    /**
-     * Dispatches on positioned callbacks.
-     */
+    /** Dispatches on positioned callbacks. */
     private val onPositionedDispatcher = OnPositionedDispatcher()
 
-    /**
-     * List of listeners that must be called after layout has completed.
-     */
+    /** List of listeners that must be called after layout has completed. */
     private val onLayoutCompletedListeners = mutableVectorOf<Owner.OnLayoutCompletedListener>()
 
     /**
@@ -89,17 +79,15 @@
 
     /**
      * Stores the list of [LayoutNode]s scheduled to be remeasured in the next measure/layout pass.
-     * We were unable to mark them as needsRemeasure=true previously as this request happened
-     * during the previous measure/layout pass and they were already measured as part of it.
-     * See [requestRemeasure] for more details.
+     * We were unable to mark them as needsRemeasure=true previously as this request happened during
+     * the previous measure/layout pass and they were already measured as part of it. See
+     * [requestRemeasure] for more details.
      */
     private val postponedMeasureRequests = mutableVectorOf<PostponedRequest>()
 
     private var rootConstraints: Constraints? = null
 
-    /**
-     * @param constraints The constraints to measure the root [LayoutNode] with
-     */
+    /** @param constraints The constraints to measure the root [LayoutNode] with */
     fun updateRootConstraints(constraints: Constraints) {
         if (rootConstraints != constraints) {
             requirePrecondition(!duringMeasureLayout) {
@@ -129,11 +117,11 @@
      * Requests lookahead remeasure for this [layoutNode] and nodes affected by its measure result
      *
      * Note: This should only be called on a [LayoutNode] in the subtree defined in a
-     * LookaheadScope. The caller is responsible for checking with [LayoutNode.lookaheadRoot]
-     * is valid (i.e. non-null) before calling this method.
+     * LookaheadScope. The caller is responsible for checking with [LayoutNode.lookaheadRoot] is
+     * valid (i.e. non-null) before calling this method.
      *
-     * @return true if the [measureAndLayout] execution should be scheduled as a result
-     * of the request.
+     * @return true if the [measureAndLayout] execution should be scheduled as a result of the
+     *   request.
      */
     fun requestLookaheadRemeasure(layoutNode: LayoutNode, forced: Boolean = false): Boolean {
         checkPrecondition(layoutNode.lookaheadRoot != null) {
@@ -146,8 +134,9 @@
                 // we're currently measuring it, let's swallow.
                 false
             }
-
-            Measuring, LookaheadLayingOut, LayingOut -> {
+            Measuring,
+            LookaheadLayingOut,
+            LayingOut -> {
                 // requestLookaheadRemeasure is currently laying out and it is incorrect to
                 // request lookahead remeasure now, let's postpone it.
                 postponedMeasureRequests.add(
@@ -156,7 +145,6 @@
                 consistencyChecker?.assertConsistent()
                 false
             }
-
             Idle -> {
                 if (layoutNode.lookaheadMeasurePending && !forced) {
                     false
@@ -168,14 +156,15 @@
                     if (layoutNode.isDeactivated) {
                         false
                     } else {
-                        if ((layoutNode.isPlacedInLookahead == true ||
+                        if (
+                            (layoutNode.isPlacedInLookahead == true ||
                                 layoutNode.canAffectParentInLookahead) &&
-                            layoutNode.parent?.lookaheadMeasurePending != true
+                                layoutNode.parent?.lookaheadMeasurePending != true
                         ) {
                             relayoutNodes.add(layoutNode, true)
                         } else if (
                             (layoutNode.isPlaced || layoutNode.canAffectParent) &&
-                            layoutNode.parent?.measurePending != true
+                                layoutNode.parent?.measurePending != true
                         ) {
                             relayoutNodes.add(layoutNode, false)
                         }
@@ -189,20 +178,21 @@
     /**
      * Requests remeasure for this [layoutNode] and nodes affected by its measure result.
      *
-     * @return true if the [measureAndLayout] execution should be scheduled as a result
-     * of the request.
+     * @return true if the [measureAndLayout] execution should be scheduled as a result of the
+     *   request.
      */
     fun requestRemeasure(layoutNode: LayoutNode, forced: Boolean = false): Boolean =
         when (layoutNode.layoutState) {
-            Measuring, LookaheadMeasuring -> {
+            Measuring,
+            LookaheadMeasuring -> {
                 // requestMeasure has already been called for this node or
                 // we're currently measuring it, let's swallow. example when it happens: we compose
                 // DataNode inside BoxWithConstraints, this calls onRequestMeasure on DataNode's
                 // parent, but this parent is BoxWithConstraints which is currently measuring.
                 false
             }
-
-            LookaheadLayingOut, LayingOut -> {
+            LookaheadLayingOut,
+            LayingOut -> {
                 // requestMeasure is currently laying out and it is incorrect to request remeasure
                 // now, let's postpone it.
                 postponedMeasureRequests.add(
@@ -211,7 +201,6 @@
                 consistencyChecker?.assertConsistent()
                 false
             }
-
             Idle -> {
                 if (layoutNode.measurePending && !forced) {
                     false
@@ -238,22 +227,25 @@
     /**
      * Requests lookahead relayout for this [layoutNode] and nodes affected by its position.
      *
-     * @return true if the [measureAndLayout] execution should be scheduled as a result
-     * of the request.
+     * @return true if the [measureAndLayout] execution should be scheduled as a result of the
+     *   request.
      */
     fun requestLookaheadRelayout(layoutNode: LayoutNode, forced: Boolean = false): Boolean =
         when (layoutNode.layoutState) {
-            LookaheadMeasuring, LookaheadLayingOut -> {
+            LookaheadMeasuring,
+            LookaheadLayingOut -> {
                 // Don't need to do anything else since the parent is already scheduled
                 // for a lookahead relayout (lookahead measure will trigger lookahead
                 // relayout), or lookahead layout is in process right now
                 consistencyChecker?.assertConsistent()
                 false
             }
-
-            Measuring, LayingOut, Idle -> {
-                if ((layoutNode.lookaheadMeasurePending || layoutNode.lookaheadLayoutPending) &&
-                    !forced
+            Measuring,
+            LayingOut,
+            Idle -> {
+                if (
+                    (layoutNode.lookaheadMeasurePending || layoutNode.lookaheadLayoutPending) &&
+                        !forced
                 ) {
                     // Don't need to do anything else since the parent is already scheduled
                     // for a lookahead relayout (lookahead measure will trigger lookahead
@@ -271,13 +263,16 @@
                         false
                     } else {
                         val parent = layoutNode.parent
-                        if (layoutNode.isPlacedInLookahead == true &&
-                            parent?.lookaheadMeasurePending != true &&
-                            parent?.lookaheadLayoutPending != true
+                        if (
+                            layoutNode.isPlacedInLookahead == true &&
+                                parent?.lookaheadMeasurePending != true &&
+                                parent?.lookaheadLayoutPending != true
                         ) {
                             relayoutNodes.add(layoutNode, true)
-                        } else if (layoutNode.isPlaced &&
-                            parent?.layoutPending != true && parent?.measurePending != true
+                        } else if (
+                            layoutNode.isPlaced &&
+                                parent?.layoutPending != true &&
+                                parent?.measurePending != true
                         ) {
                             relayoutNodes.add(layoutNode, false)
                         }
@@ -290,21 +285,25 @@
     /**
      * Requests relayout for this [layoutNode] and nodes affected by its position.
      *
-     * @return true if the [measureAndLayout] execution should be scheduled as a result
-     * of the request.
+     * @return true if the [measureAndLayout] execution should be scheduled as a result of the
+     *   request.
      */
     fun requestRelayout(layoutNode: LayoutNode, forced: Boolean = false): Boolean =
         when (layoutNode.layoutState) {
-            Measuring, LookaheadMeasuring, LookaheadLayingOut, LayingOut -> {
+            Measuring,
+            LookaheadMeasuring,
+            LookaheadLayingOut,
+            LayingOut -> {
                 // don't need to do anything else since the parent is already scheduled
                 // for a relayout (measure will trigger relayout), or is laying out right now
                 consistencyChecker?.assertConsistent()
                 false
             }
-
             Idle -> {
-                if (!forced && (layoutNode.isPlaced == layoutNode.isPlacedByParent) &&
-                    (layoutNode.measurePending || layoutNode.layoutPending)
+                if (
+                    !forced &&
+                        (layoutNode.isPlaced == layoutNode.isPlacedByParent) &&
+                        (layoutNode.measurePending || layoutNode.layoutPending)
                 ) {
                     // don't need to do anything else since the parent is already scheduled
                     // for a relayout (measure will trigger relayout), or is laying out right now
@@ -331,23 +330,20 @@
             }
         }
 
-    /**
-     * Request that [layoutNode] and children should call their position change callbacks.
-     */
+    /** Request that [layoutNode] and children should call their position change callbacks. */
     fun requestOnPositionedCallback(layoutNode: LayoutNode) {
         onPositionedDispatcher.onNodePositioned(layoutNode)
     }
 
-    /**
-     * @return true if the [LayoutNode] size has been changed.
-     */
+    /** @return true if the [LayoutNode] size has been changed. */
     private fun doLookaheadRemeasure(layoutNode: LayoutNode, constraints: Constraints?): Boolean {
         if (layoutNode.lookaheadRoot == null) return false
-        val lookaheadSizeChanged = if (constraints != null) {
-            layoutNode.lookaheadRemeasure(constraints)
-        } else {
-            layoutNode.lookaheadRemeasure()
-        }
+        val lookaheadSizeChanged =
+            if (constraints != null) {
+                layoutNode.lookaheadRemeasure(constraints)
+            } else {
+                layoutNode.lookaheadRemeasure()
+            }
 
         val parent = layoutNode.parent
         if (lookaheadSizeChanged && parent != null) {
@@ -363,11 +359,12 @@
     }
 
     private fun doRemeasure(layoutNode: LayoutNode, constraints: Constraints?): Boolean {
-        val sizeChanged = if (constraints != null) {
-            layoutNode.remeasure(constraints)
-        } else {
-            layoutNode.remeasure()
-        }
+        val sizeChanged =
+            if (constraints != null) {
+                layoutNode.remeasure(constraints)
+            } else {
+                layoutNode.remeasure()
+            }
         val parent = layoutNode.parent
         if (sizeChanged && parent != null) {
             if (layoutNode.measuredByParent == InMeasureBlock) {
@@ -400,19 +397,21 @@
     }
 
     /**
-     * Only does measurement from the root without doing any placement. This is intended
-     * to be called to determine only how large the root is with minimal effort.
+     * Only does measurement from the root without doing any placement. This is intended to be
+     * called to determine only how large the root is with minimal effort.
      */
     fun measureOnly() {
         if (relayoutNodes.isNotEmpty()) {
             performMeasureAndLayout(fullPass = false) {
                 if (!relayoutNodes.isEmpty(affectsLookahead = true)) {
                     if (root.lookaheadRoot != null) {
-                        // This call will walk the tree to look for lookaheadMeasurePending nodes and
+                        // This call will walk the tree to look for lookaheadMeasurePending nodes
+                        // and
                         // do a lookahead remeasure for those nodes only.
                         remeasureOnly(root, affectsLookahead = true)
                     } else {
-                        // First do a lookahead remeasure pass for all the lookaheadMeasurePending nodes,
+                        // First do a lookahead remeasure pass for all the lookaheadMeasurePending
+                        // nodes,
                         // followed by a remeasure pass for the rest of the tree.
                         remeasureLookaheadRootsInSubtree(root)
                     }
@@ -449,8 +448,9 @@
             // we don't check for the layoutState as even if the node doesn't need remeasure
             // it could be remeasured because the constraints changed.
             val lookaheadSizeChanged = doLookaheadRemeasure(layoutNode, constraints)
-            if ((lookaheadSizeChanged || layoutNode.lookaheadLayoutPending) &&
-                layoutNode.isPlacedInLookahead == true
+            if (
+                (lookaheadSizeChanged || layoutNode.lookaheadLayoutPending) &&
+                    layoutNode.isPlacedInLookahead == true
             ) {
                 layoutNode.lookaheadReplace()
             }
@@ -487,9 +487,7 @@
         requirePrecondition(root.isAttached) {
             "performMeasureAndLayout called with unattached root"
         }
-        requirePrecondition(root.isPlaced) {
-            "performMeasureAndLayout called with unplaced root"
-        }
+        requirePrecondition(root.isPlaced) { "performMeasureAndLayout called with unplaced root" }
         requirePrecondition(!duringMeasureLayout) {
             "performMeasureAndLayout called during measure layout"
         }
@@ -517,15 +515,15 @@
     }
 
     /**
-     * Does actual remeasure and relayout on the node if it is required.
-     * The [layoutNode] should be already removed from [relayoutNodes] before running it.
+     * Does actual remeasure and relayout on the node if it is required. The [layoutNode] should be
+     * already removed from [relayoutNodes] before running it.
      *
-     * When [affectsLookahead] is false, we'll skip lookahead measure & layout, and only measure
-     * and layout as needed. This is needed because we don't want [forceMeasureTheSubtree] that
-     * doesn't affect lookahead to leak into lookahead and start doing lookahead measure/layout.
-     * That would prevent some of the lookahead remeasure/relayout requests from being properly
-     * handled as the starting node of [forceMeasureTheSubtree] would be in
-     * [LayoutNode.LayoutState.Measuring] until it returns.
+     * When [affectsLookahead] is false, we'll skip lookahead measure & layout, and only measure and
+     * layout as needed. This is needed because we don't want [forceMeasureTheSubtree] that doesn't
+     * affect lookahead to leak into lookahead and start doing lookahead measure/layout. That would
+     * prevent some of the lookahead remeasure/relayout requests from being properly handled as the
+     * starting node of [forceMeasureTheSubtree] would be in [LayoutNode.LayoutState.Measuring]
+     * until it returns.
      *
      * Note, when [affectsLookahead] is true, we will only do lookahead measure and layout.
      *
@@ -541,12 +539,13 @@
             // we don't remeasure or relayout deactivated nodes.
             return false
         }
-        if (layoutNode.isPlaced || // the root node doesn't have isPlacedByParent = true
-            layoutNode.isPlacedByParent ||
-            layoutNode.canAffectParent ||
-            layoutNode.isPlacedInLookahead == true ||
-            layoutNode.canAffectParentInLookahead ||
-            layoutNode.alignmentLinesRequired
+        if (
+            layoutNode.isPlaced || // the root node doesn't have isPlacedByParent = true
+                layoutNode.isPlacedByParent ||
+                layoutNode.canAffectParent ||
+                layoutNode.isPlacedInLookahead == true ||
+                layoutNode.canAffectParentInLookahead ||
+                layoutNode.alignmentLinesRequired
         ) {
             val constraints = if (layoutNode === root) rootConstraints!! else null
             if (affectsLookahead) {
@@ -555,8 +554,9 @@
                     sizeChanged = doLookaheadRemeasure(layoutNode, constraints)
                 }
                 if (relayoutNeeded) {
-                    if ((sizeChanged || layoutNode.lookaheadLayoutPending) &&
-                        layoutNode.isPlacedInLookahead == true
+                    if (
+                        (sizeChanged || layoutNode.lookaheadLayoutPending) &&
+                            layoutNode.isPlacedInLookahead == true
                     ) {
                         layoutNode.lookaheadReplace()
                     }
@@ -567,8 +567,9 @@
                 }
                 if (relayoutNeeded) {
                     if (layoutNode.layoutPending) {
-                        val isPlacedByPlacedParent = layoutNode === root ||
-                            (layoutNode.parent?.isPlaced == true && layoutNode.isPlacedByParent)
+                        val isPlacedByPlacedParent =
+                            layoutNode === root ||
+                                (layoutNode.parent?.isPlaced == true && layoutNode.isPlacedByParent)
                         if (isPlacedByPlacedParent) {
                             if (layoutNode === root) {
                                 layoutNode.place(0, 0)
@@ -624,11 +625,11 @@
     }
 
     /**
-     * Makes sure the passed [layoutNode] and its subtree has the final sizes.
-     * The nodes which can potentially affect the parent size will be remeasured.
+     * Makes sure the passed [layoutNode] and its subtree has the final sizes. The nodes which can
+     * potentially affect the parent size will be remeasured.
      *
-     * The node or some of the nodes in its subtree can still be kept unmeasured if they are
-     * not placed and don't affect the parent size. See [requestRemeasure] for details.
+     * The node or some of the nodes in its subtree can still be kept unmeasured if they are not
+     * placed and don't affect the parent size. See [requestRemeasure] for details.
      */
     fun forceMeasureTheSubtree(layoutNode: LayoutNode, affectsLookahead: Boolean) {
         // if there is nothing in `relayoutNodes` everything is remeasured.
@@ -650,8 +651,8 @@
     }
 
     private fun onlyRemeasureIfScheduled(node: LayoutNode, affectsLookahead: Boolean) {
-        if (node.measurePending(affectsLookahead) &&
-            relayoutNodes.contains(node, affectsLookahead)
+        if (
+            node.measurePending(affectsLookahead) && relayoutNodes.contains(node, affectsLookahead)
         ) {
             // we don't need to run relayout as part of this logic. so the node will
             // not be removed from `relayoutNodes` in order to be visited again during
@@ -664,8 +665,9 @@
     private fun forceMeasureTheSubtreeInternal(layoutNode: LayoutNode, affectsLookahead: Boolean) {
         layoutNode.forEachChild { child ->
             // only proceed if child's size can affect the parent size
-            if (!affectsLookahead && child.measureAffectsParent ||
-                affectsLookahead && child.measureAffectsParentLookahead
+            if (
+                !affectsLookahead && child.measureAffectsParent ||
+                    affectsLookahead && child.measureAffectsParentLookahead
             ) {
                 // When LookaheadRoot's parent gets forceMeasureSubtree call, we need to check
                 // both lookahead invalidation and non-lookahead invalidation, just like a measure()
@@ -705,8 +707,8 @@
      * Dispatch [OnPositionedModifier] callbacks for the nodes affected by the previous
      * [measureAndLayout] execution.
      *
-     * @param forceDispatch true means the whole tree should dispatch the callback (for example
-     * when the global position of the Owner has been changed)
+     * @param forceDispatch true means the whole tree should dispatch the callback (for example when
+     *   the global position of the Owner has been changed)
      */
     fun dispatchOnPositionedCallbacks(forceDispatch: Boolean = false) {
         if (forceDispatch) {
@@ -716,8 +718,8 @@
     }
 
     /**
-     * Removes [node] from the list of LayoutNodes being scheduled for the remeasure/relayout as
-     * it was detached.
+     * Removes [node] from the list of LayoutNodes being scheduled for the remeasure/relayout as it
+     * was detached.
      */
     fun onNodeDetached(node: LayoutNode) {
         relayoutNodes.remove(node)
@@ -725,8 +727,9 @@
     }
 
     private val LayoutNode.measureAffectsParent
-        get() = (measuredByParent == InMeasureBlock ||
-            layoutDelegate.alignmentLinesOwner.alignmentLines.required)
+        get() =
+            (measuredByParent == InMeasureBlock ||
+                layoutDelegate.alignmentLinesOwner.alignmentLines.required)
 
     private val LayoutNode.canAffectParent
         get() = measurePending && measureAffectsParent
@@ -735,8 +738,9 @@
         get() = lookaheadMeasurePending && measureAffectsParentLookahead
 
     private val LayoutNode.measureAffectsParentLookahead
-        get() = (measuredByParentInLookahead == InMeasureBlock ||
-            layoutDelegate.lookaheadAlignmentLinesOwner?.alignmentLines?.required == true)
+        get() =
+            (measuredByParentInLookahead == InMeasureBlock ||
+                layoutDelegate.lookaheadAlignmentLinesOwner?.alignmentLines?.required == true)
 
     private fun LayoutNode.measurePending(affectsLookahead: Boolean) =
         if (affectsLookahead) lookaheadMeasurePending else measurePending
diff --git a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/node/MeasureBlocks.kt b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/node/MeasureBlocks.kt
index 351ac71..6f266c4 100644
--- a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/node/MeasureBlocks.kt
+++ b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/node/MeasureBlocks.kt
@@ -26,8 +26,7 @@
 @Deprecated("MeasureBlocks was deprecated. Please use MeasurePolicy instead.")
 internal interface MeasureBlocks {
     /**
-     * The function used to measure the child. It must call [MeasureScope.layout] before
-     * completing.
+     * The function used to measure the child. It must call [MeasureScope.layout] before completing.
      */
     fun measure(
         measureScope: MeasureScope,
@@ -35,36 +34,28 @@
         constraints: Constraints
     ): MeasureResult
 
-    /**
-     * The function used to calculate [IntrinsicMeasurable.minIntrinsicWidth].
-     */
+    /** The function used to calculate [IntrinsicMeasurable.minIntrinsicWidth]. */
     fun minIntrinsicWidth(
         intrinsicMeasureScope: IntrinsicMeasureScope,
         measurables: List<IntrinsicMeasurable>,
         h: Int
     ): Int
 
-    /**
-     * The lambda used to calculate [IntrinsicMeasurable.minIntrinsicHeight].
-     */
+    /** The lambda used to calculate [IntrinsicMeasurable.minIntrinsicHeight]. */
     fun minIntrinsicHeight(
         intrinsicMeasureScope: IntrinsicMeasureScope,
         measurables: List<IntrinsicMeasurable>,
         w: Int
     ): Int
 
-    /**
-     * The function used to calculate [IntrinsicMeasurable.maxIntrinsicWidth].
-     */
+    /** The function used to calculate [IntrinsicMeasurable.maxIntrinsicWidth]. */
     fun maxIntrinsicWidth(
         intrinsicMeasureScope: IntrinsicMeasureScope,
         measurables: List<IntrinsicMeasurable>,
         h: Int
     ): Int
 
-    /**
-     * The lambda used to calculate [IntrinsicMeasurable.maxIntrinsicHeight].
-     */
+    /** The lambda used to calculate [IntrinsicMeasurable.maxIntrinsicHeight]. */
     fun maxIntrinsicHeight(
         intrinsicMeasureScope: IntrinsicMeasureScope,
         measurables: List<IntrinsicMeasurable>,
diff --git a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/node/MeasureScopeWithLayoutNode.kt b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/node/MeasureScopeWithLayoutNode.kt
index 58eb96e..a401a78 100644
--- a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/node/MeasureScopeWithLayoutNode.kt
+++ b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/node/MeasureScopeWithLayoutNode.kt
@@ -36,8 +36,10 @@
 
 private fun LayoutNode.isInLookaheadPass(): Boolean {
     return when (layoutState) {
-        LayoutState.LookaheadMeasuring, LayoutState.LookaheadLayingOut -> true
-        LayoutState.Measuring, LayoutState.LayingOut -> false
+        LayoutState.LookaheadMeasuring,
+        LayoutState.LookaheadLayingOut -> true
+        LayoutState.Measuring,
+        LayoutState.LayingOut -> false
         LayoutState.Idle -> {
             // idle means intrinsics are being asked, we need to check the parent
             requireNotNull(parent) { "no parent for idle node" }.isInLookaheadPass()
diff --git a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/node/ModifierNodeElement.kt b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/node/ModifierNodeElement.kt
index 009aaf0..d5bb36a 100644
--- a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/node/ModifierNodeElement.kt
+++ b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/node/ModifierNodeElement.kt
@@ -31,6 +31,7 @@
  * necessary to create and maintain an instance of the associated [Modifier.Node] type.
  *
  * @sample androidx.compose.ui.samples.ModifierNodeElementSample
+ *
  * @sample androidx.compose.ui.samples.SemanticsModifierNodeSample
  *
  * @see Modifier.Node
@@ -40,12 +41,14 @@
 
     private var _inspectorValues: InspectorInfo? = null
     private val inspectorValues: InspectorInfo
-        get() = _inspectorValues ?: InspectorInfo()
-            .apply {
-                name = this@ModifierNodeElement::class.simpleName
-                inspectableProperties()
-            }
-            .also { _inspectorValues = it }
+        get() =
+            _inspectorValues
+                ?: InspectorInfo()
+                    .apply {
+                        name = this@ModifierNodeElement::class.simpleName
+                        inspectableProperties()
+                    }
+                    .also { _inspectorValues = it }
 
     final override val nameFallback: String?
         get() = inspectorValues.name
diff --git a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/node/MutableVectorWithMutationTracking.kt b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/node/MutableVectorWithMutationTracking.kt
index 5312521..10e3cf9 100644
--- a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/node/MutableVectorWithMutationTracking.kt
+++ b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/node/MutableVectorWithMutationTracking.kt
@@ -19,8 +19,8 @@
 import androidx.compose.runtime.collection.MutableVector
 
 /**
- * This class tracks the mutation to the provided [vector] through the provided methods.
- * On mutation, the [onVectorMutated] lambda will be invoked.
+ * This class tracks the mutation to the provided [vector] through the provided methods. On
+ * mutation, the [onVectorMutated] lambda will be invoked.
  */
 internal class MutableVectorWithMutationTracking<T>(
     val vector: MutableVector<T>,
@@ -40,9 +40,7 @@
     }
 
     fun removeAt(index: Int): T {
-        return vector.removeAt(index).also {
-            onVectorMutated()
-        }
+        return vector.removeAt(index).also { onVectorMutated() }
     }
 
     inline fun forEach(block: (T) -> Unit) = vector.forEach(block)
diff --git a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/node/MyersDiff.kt b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/node/MyersDiff.kt
index acc16332..ad1b286 100644
--- a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/node/MyersDiff.kt
+++ b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/node/MyersDiff.kt
@@ -23,8 +23,11 @@
 
 internal interface DiffCallback {
     fun areItemsTheSame(oldIndex: Int, newIndex: Int): Boolean
+
     fun insert(newIndex: Int)
+
     fun remove(atIndex: Int, oldIndex: Int)
+
     fun same(oldIndex: Int, newIndex: Int)
 }
 
@@ -33,13 +36,11 @@
 /**
  * Calculates the list of update operations that can covert one list into the other one.
  *
- *
  * If your old and new lists are sorted by the same constraint and items never move (swap
- * positions), you can disable move detection which takes `O(N^2)` time where
- * N is the number of added, moved, removed items.
+ * positions), you can disable move detection which takes `O(N^2)` time where N is the number of
+ * added, moved, removed items.
  *
  * @param cb The callback that acts as a gateway to the backing list data
- *
  * @return A LongStack that contains the diagonals which are used by [applyDiff] to update the list
  */
 private fun calculateDiff(
@@ -66,12 +67,7 @@
         val oldEnd = stack.pop()
         val oldStart = stack.pop()
 
-        val found = midPoint(
-            oldStart,
-            oldEnd,
-            newStart,
-            newEnd,
-            cb, forward, backward, snake.data)
+        val found = midPoint(oldStart, oldEnd, newStart, newEnd, cb, forward, backward, snake.data)
 
         if (found) {
             // if it has a diagonal, save it
@@ -138,9 +134,7 @@
     applyDiff(diagonals, callback)
 }
 
-/**
- * Finds a middle snake in the given range.
- */
+/** Finds a middle snake in the given range. */
 private fun midPoint(
     oldStart: Int,
     oldEnd: Int,
@@ -160,19 +154,11 @@
     forward[1] = oldStart
     backward[1] = oldEnd
     for (d in 0 until max) {
-        val found = forward(
-            oldStart,
-            oldEnd,
-            newStart,
-            newEnd, cb, forward, backward, d, snake)
+        val found = forward(oldStart, oldEnd, newStart, newEnd, cb, forward, backward, d, snake)
         if (found) {
             return true
         }
-        val found2 = backward(
-            oldStart,
-            oldEnd,
-            newStart,
-            newEnd, cb, forward, backward, d, snake)
+        val found2 = backward(oldStart, oldEnd, newStart, newEnd, cb, forward, backward, d, snake)
         if (found2) {
             return true
         }
@@ -313,35 +299,31 @@
 }
 
 /**
- * Snakes represent a match between two lists. It is optionally prefixed or postfixed with an
- * add androidx.compose.ui.node.or remove operation. See the Myers' paper for details.
+ * Snakes represent a match between two lists. It is optionally prefixed or postfixed with an add
+ * androidx.compose.ui.node.or remove operation. See the Myers' paper for details.
  */
 @JvmInline
 private value class Snake(val data: IntArray) {
-    /**
-     * Position in the old list
-     */
-    val startX: Int get() = data[0]
+    /** Position in the old list */
+    val startX: Int
+        get() = data[0]
 
-    /**
-     * Position in the new list
-     */
-    val startY: Int get() = data[1]
+    /** Position in the new list */
+    val startY: Int
+        get() = data[1]
 
-    /**
-     * End position in the old list, exclusive
-     */
-    val endX: Int get() = data[2]
+    /** End position in the old list, exclusive */
+    val endX: Int
+        get() = data[2]
 
-    /**
-     * End position in the new list, exclusive
-     */
-    val endY: Int get() = data[3]
+    /** End position in the new list, exclusive */
+    val endY: Int
+        get() = data[3]
 
-    /**
-     * True if this snake was created in the reverse search, false otherwise.
-     */
-    val reverse: Boolean get() = data[4] != 0
+    /** True if this snake was created in the reverse search, false otherwise. */
+    val reverse: Boolean
+        get() = data[4] != 0
+
     val diagonalSize: Int
         get() = min(endX - startX, endY - startY)
 
@@ -352,8 +334,8 @@
         get() = endY - startY > endX - startX
 
     /**
-     * Extract the diagonal of the snake to make reasoning easier for the rest of the
-     * algorithm where we try to produce a path and also find moves.
+     * Extract the diagonal of the snake to make reasoning easier for the rest of the algorithm
+     * where we try to produce a path and also find moves.
      */
     fun addDiagonalToStack(diagonals: IntStack) {
         if (hasAdditionOrRemoval) {
@@ -394,14 +376,15 @@
 }
 
 /**
- * Array wrapper w/ negative index support.
- * We use this array instead of a regular array so that algorithm is easier to read without
- * too many offsets when accessing the "k" array in the algorithm.
+ * Array wrapper w/ negative index support. We use this array instead of a regular array so that
+ * algorithm is easier to read without too many offsets when accessing the "k" array in the
+ * algorithm.
  */
 @JvmInline
 private value class CenteredArray(private val data: IntArray) {
 
-    private val mid: Int get() = data.size / 2
+    private val mid: Int
+        get() = data.size / 2
 
     operator fun get(index: Int): Int = data[index + mid]
 
@@ -415,7 +398,9 @@
     private var lastIndex = 0
 
     operator fun get(index: Int): Int = stack[index]
-    val size: Int get() = lastIndex
+
+    val size: Int
+        get() = lastIndex
 
     fun pushRange(
         oldStart: Int,
diff --git a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/node/NestedVectorStack.kt b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/node/NestedVectorStack.kt
index dd0f8de..7f93d07 100644
--- a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/node/NestedVectorStack.kt
+++ b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/node/NestedVectorStack.kt
@@ -30,9 +30,7 @@
     }
 
     fun pop(): T {
-        check(size > 0) {
-            "Cannot call pop() on an empty stack. Guard with a call to isNotEmpty()"
-        }
+        check(size > 0) { "Cannot call pop() on an empty stack. Guard with a call to isNotEmpty()" }
         val indexOfVector = size - 1
         val indexOfItem = currentIndexes[indexOfVector]
         val vector = vectors[indexOfVector]!!
diff --git a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/node/NodeChain.kt b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/node/NodeChain.kt
index ba32617..e5bba49 100644
--- a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/node/NodeChain.kt
+++ b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/node/NodeChain.kt
@@ -27,21 +27,27 @@
 import androidx.compose.ui.internal.checkPreconditionNotNull
 import androidx.compose.ui.layout.ModifierInfo
 
-private val SentinelHead = object : Modifier.Node() {
-    override fun toString() = "<Head>"
-}.apply {
-    aggregateChildKindSet = 0.inv()
-}
+private val SentinelHead =
+    object : Modifier.Node() {
+            override fun toString() = "<Head>"
+        }
+        .apply { aggregateChildKindSet = 0.inv() }
 
 internal class NodeChain(val layoutNode: LayoutNode) {
     internal val innerCoordinator = InnerNodeCoordinator(layoutNode)
     internal var outerCoordinator: NodeCoordinator = innerCoordinator
         private set
+
     internal val tail: Modifier.Node = innerCoordinator.tail
     internal var head: Modifier.Node = tail
         private set
-    private val isUpdating: Boolean get() = head === SentinelHead
-    private val aggregateChildKindSet: Int get() = head.aggregateChildKindSet
+
+    private val isUpdating: Boolean
+        get() = head === SentinelHead
+
+    private val aggregateChildKindSet: Int
+        get() = head.aggregateChildKindSet
+
     private var current: MutableVector<Modifier.Element>? = null
     private var buffer: MutableVector<Modifier.Element>? = null
     private var cachedDiffer: Differ? = null
@@ -57,9 +63,9 @@
      * head", and keep [head] pointing to the actual head.
      *
      * TODO: Now that we run the diff from head to tail, this may not be as helpful as it once was.
-     *  Consider removing this and trimChain entirely. If we don't, we should at least refactor to
-     *  make SentinelHead not a shared global mutable object, and instead just allocate one per
-     *  owner or one per chain.
+     *   Consider removing this and trimChain entirely. If we don't, we should at least refactor to
+     *   make SentinelHead not a shared global mutable object, and instead just allocate one per
+     *   owner or one per chain.
      */
     private fun padChain(): Modifier.Node {
         checkPrecondition(head !== SentinelHead) { "padChain called on already padded chain" }
@@ -88,12 +94,12 @@
      * created/disposed/updated during this call.
      *
      * This method will attempt to optimize for the common scenario of the modifier chain being of
-     * equal size and each element being able to be reused from the prior one. In most cases this
-     * is what recomposition will result in, provided modifiers weren't conditionally provided. In
-     * the cases where the modifier is not of equal length to the prior value, or modifiers of
-     * different reuse types ended up in the same position, this method will deopt into a slower
-     * path which will perform a diff on the modifier chain and execute a minimal number of
-     * insertions and deletions.
+     * equal size and each element being able to be reused from the prior one. In most cases this is
+     * what recomposition will result in, provided modifiers weren't conditionally provided. In the
+     * cases where the modifier is not of equal length to the prior value, or modifiers of different
+     * reuse types ended up in the same position, this method will deopt into a slower path which
+     * will perform a diff on the modifier chain and execute a minimal number of insertions and
+     * deletions.
      */
     internal fun updateFrom(m: Modifier) {
         // If we run the diff and there are no structural changes, we can avoid looping through the
@@ -219,9 +225,7 @@
      * lifecycles, calling the detach lifecycles, and calling [markAsDetached].
      */
     internal fun resetState() {
-        tailToHead {
-            if (it.isAttached) it.reset()
-        }
+        tailToHead { if (it.isAttached) it.reset() }
         runDetachLifecycle()
         markAsDetached()
     }
@@ -232,17 +236,18 @@
         while (node != null) {
             val layoutmod = node.asLayoutModifierNode()
             if (layoutmod != null) {
-                val next = if (node.coordinator != null) {
-                    val c = node.coordinator as LayoutModifierNodeCoordinator
-                    val prevNode = c.layoutModifierNode
-                    c.layoutModifierNode = layoutmod
-                    if (prevNode !== node) c.onLayoutModifierNodeChanged()
-                    c
-                } else {
-                    val c = LayoutModifierNodeCoordinator(layoutNode, layoutmod)
-                    node.updateCoordinator(c)
-                    c
-                }
+                val next =
+                    if (node.coordinator != null) {
+                        val c = node.coordinator as LayoutModifierNodeCoordinator
+                        val prevNode = c.layoutModifierNode
+                        c.layoutModifierNode = layoutmod
+                        if (prevNode !== node) c.onLayoutModifierNodeChanged()
+                        c
+                    } else {
+                        val c = LayoutModifierNodeCoordinator(layoutNode, layoutmod)
+                        node.updateCoordinator(c)
+                        c
+                    }
                 coordinator.wrappedBy = next
                 next.wrapped = coordinator
                 coordinator = next
@@ -279,9 +284,7 @@
      * lifecycle is called, all nodes in the hierarchy are marked as attached.
      */
     fun markAsAttached() {
-        headToTail {
-            it.markAsAttached()
-        }
+        headToTail { it.markAsAttached() }
     }
 
     /**
@@ -307,18 +310,18 @@
     }
 
     /**
-     * This returns a new List of Modifiers and the coordinates and any extra information
-     * that may be useful. This is used for tooling to retrieve layout modifier and layer
-     * information.
+     * This returns a new List of Modifiers and the coordinates and any extra information that may
+     * be useful. This is used for tooling to retrieve layout modifier and layer information.
      */
     fun getModifierInfo(): List<ModifierInfo> {
         val current = current ?: return listOf()
         val infoList = MutableVector<ModifierInfo>(current.size)
         var i = 0
         headToTailExclusive { node ->
-            val coordinator = requireNotNull(node.coordinator) {
-                "getModifierInfo called on node with no coordinator"
-            }
+            val coordinator =
+                requireNotNull(node.coordinator) {
+                    "getModifierInfo called on node with no coordinator"
+                }
             // placeWithLayer puts the layer on the _next_ coordinator
             //
             // - If the last node does placeWithLayer, the layer is on the innerCoordinator
@@ -328,20 +331,24 @@
             // -- this exists for ui-inspector and must remain stable due to a non-same-version
             // release dependency on tree structure.
             val currentNodeLayer = coordinator.layer
-            val innerNodeLayer = innerCoordinator.layer.takeIf {
-                // emit the innerCoordinator only if it's different than current coordinator and
-                // this is the last node
+            val innerNodeLayer =
+                innerCoordinator.layer.takeIf {
+                    // emit the innerCoordinator only if it's different than current coordinator and
+                    // this is the last node
 
-                // note: this logic will correctly handle the case where a Modifier.Node as the last
-                // element in the chain calls placeWithLayer. However, it does also cause an emit
-                // when .graphicsLayer is the last element in the chain as well - was previously
-                // depended upon by ui-tooling to avoid seeing the Crossfade layer.
+                    // note: this logic will correctly handle the case where a Modifier.Node as the
+                    // last
+                    // element in the chain calls placeWithLayer. However, it does also cause an
+                    // emit
+                    // when .graphicsLayer is the last element in the chain as well - was previously
+                    // depended upon by ui-tooling to avoid seeing the Crossfade layer.
 
-                // Going forward, as a contract, all layers will be emitted. And UI-tooling should
-                // not gain a new dependency on omitted layers.
-                val localChild = node.child
-                localChild === tail && node.coordinator !== localChild.coordinator
-            }
+                    // Going forward, as a contract, all layers will be emitted. And UI-tooling
+                    // should
+                    // not gain a new dependency on omitted layers.
+                    val localChild = node.child
+                    localChild === tail && node.coordinator !== localChild.coordinator
+                }
             val layer = currentNodeLayer ?: innerNodeLayer
             infoList += ModifierInfo(current[i++], coordinator, layer)
         }
@@ -349,15 +356,11 @@
     }
 
     internal fun markAsDetached() {
-        tailToHead {
-            if (it.isAttached) it.markAsDetached()
-        }
+        tailToHead { if (it.isAttached) it.markAsDetached() }
     }
 
     internal fun runDetachLifecycle() {
-        tailToHead {
-            if (it.isAttached) it.runDetachLifecycle()
-        }
+        tailToHead { if (it.isAttached) it.runDetachLifecycle() }
     }
 
     private fun getDiffer(
@@ -371,13 +374,14 @@
         @Suppress("IfThenToElvis")
         return if (current == null) {
             Differ(
-                head,
-                offset,
-                before,
-                after,
-                // TODO: is this always true?
-                shouldAttachOnInsert,
-            ).also { cachedDiffer = it }
+                    head,
+                    offset,
+                    before,
+                    after,
+                    // TODO: is this always true?
+                    shouldAttachOnInsert,
+                )
+                .also { cachedDiffer = it }
         } else {
             current.also {
                 it.node = head
@@ -411,10 +415,8 @@
         var shouldAttachOnInsert: Boolean,
     ) : DiffCallback {
         override fun areItemsTheSame(oldIndex: Int, newIndex: Int): Boolean {
-            return actionForModifiers(
-                before[offset + oldIndex],
-                after[offset + newIndex]
-            ) != ActionReplace
+            return actionForModifiers(before[offset + oldIndex], after[offset + newIndex]) !=
+                ActionReplace
         }
 
         override fun insert(newIndex: Int) {
@@ -505,21 +507,17 @@
             inserted: Modifier.Node
         )
 
-        fun nodeRemoved(
-            oldIndex: Int,
-            element: Modifier.Element,
-            node: Modifier.Node
-        )
+        fun nodeRemoved(oldIndex: Int, element: Modifier.Element, node: Modifier.Node)
     }
 
     /**
      * This method utilizes a modified Myers Diff Algorithm which will diff the two modifier chains
      * and execute a minimal number of insertions/deletions. We make no attempt to execute "moves"
-     * as part of this diff. If a modifier moves that is no different than it being inserted in
-     * the new location and removed in the old location.
+     * as part of this diff. If a modifier moves that is no different than it being inserted in the
+     * new location and removed in the old location.
      *
      * @param tail - The Node that corresponds to the _end_ of the [before] list. This Node is
-     * expected to have an up to date [aggregateChildKindSet].
+     *   expected to have an up to date [aggregateChildKindSet].
      */
     private fun structuralUpdate(
         offset: Int,
@@ -546,16 +544,15 @@
     }
 
     /**
-     * This removes [node] from the current linked list.
-     * For example:
+     * This removes [node] from the current linked list. For example:
      *
      *      Head... -> parent -> node -> child -> ...Tail
      *
-     *  gets transformed into a list of the following shape:
+     * gets transformed into a list of the following shape:
      *
      *      Head... -> parent -> child -> ...Tail
      *
-     *  @return The parent of the removed [node]
+     * @return The parent of the removed [node]
      */
     private fun removeNode(node: Modifier.Node): Modifier.Node {
         val child = node.child
@@ -575,12 +572,14 @@
         element: Modifier.Element,
         child: Modifier.Node,
     ): Modifier.Node {
-        val node = when (element) {
-            is ModifierNodeElement<*> -> element.create().also {
-                it.kindSet = calculateNodeKindSetFromIncludingDelegates(it)
+        val node =
+            when (element) {
+                is ModifierNodeElement<*> ->
+                    element.create().also {
+                        it.kindSet = calculateNodeKindSetFromIncludingDelegates(it)
+                    }
+                else -> BackwardsCompatNode(element)
             }
-            else -> BackwardsCompatNode(element)
-        }
         checkPrecondition(!node.isAttached) {
             "createAndInsertNodeAsParent called on an attached node"
         }
@@ -589,16 +588,15 @@
     }
 
     /**
-     * This inserts [node] as the parent of [child] in the current linked list.
-     * For example:
+     * This inserts [node] as the parent of [child] in the current linked list. For example:
      *
      *      Head... -> child -> ...Tail
      *
-     *  gets transformed into a list of the following shape:
+     * gets transformed into a list of the following shape:
      *
      *      Head... -> node -> child -> ...Tail
      *
-     *  @return The inserted [node]
+     * @return The inserted [node]
      */
     private fun insertParent(node: Modifier.Node, child: Modifier.Node): Modifier.Node {
         val theParent = child.parent
@@ -615,12 +613,14 @@
         element: Modifier.Element,
         parent: Modifier.Node,
     ): Modifier.Node {
-        val node = when (element) {
-            is ModifierNodeElement<*> -> element.create().also {
-                it.kindSet = calculateNodeKindSetFromIncludingDelegates(it)
+        val node =
+            when (element) {
+                is ModifierNodeElement<*> ->
+                    element.create().also {
+                        it.kindSet = calculateNodeKindSetFromIncludingDelegates(it)
+                    }
+                else -> BackwardsCompatNode(element)
             }
-            else -> BackwardsCompatNode(element)
-        }
         checkPrecondition(!node.isAttached) {
             "A ModifierNodeElement cannot return an already attached node from create() "
         }
@@ -629,16 +629,15 @@
     }
 
     /**
-     * This inserts [node] as the child of [parent] in the current linked list.
-     * For example:
+     * This inserts [node] as the child of [parent] in the current linked list. For example:
      *
      *      Head... -> parent -> ...Tail
      *
-     *  gets transformed into a list of the following shape:
+     * gets transformed into a list of the following shape:
      *
      *      Head... -> parent -> node -> ...Tail
      *
-     *  @return The inserted [node]
+     * @return The inserted [node]
      */
     private fun insertChild(node: Modifier.Node, parent: Modifier.Node): Modifier.Node {
         val theChild = parent.child
@@ -651,11 +650,7 @@
         return node
     }
 
-    private fun updateNode(
-        prev: Modifier.Element,
-        next: Modifier.Element,
-        node: Modifier.Node
-    ) {
+    private fun updateNode(prev: Modifier.Element, next: Modifier.Element, node: Modifier.Node) {
         when {
             prev is ModifierNodeElement<*> && next is ModifierNodeElement<*> -> {
                 next.updateUnsafe(node)
@@ -683,20 +678,13 @@
 
     // TRAVERSAL
 
-    internal inline fun <reified T> firstFromHead(
-        type: NodeKind<T>,
-        block: (T) -> Boolean
-    ): T? {
-        headToTail(type) {
-            if (block(it)) return it
-        }
+    internal inline fun <reified T> firstFromHead(type: NodeKind<T>, block: (T) -> Boolean): T? {
+        headToTail(type) { if (block(it)) return it }
         return null
     }
 
     internal inline fun <reified T> headToTail(type: NodeKind<T>, block: (T) -> Unit) {
-        headToTail(type.mask) {
-            it.dispatchForKind(type, block)
-        }
+        headToTail(type.mask) { it.dispatchForKind(type, block) }
     }
 
     internal inline fun headToTail(mask: Int, block: (Modifier.Node) -> Unit) {
@@ -711,8 +699,8 @@
 
     /**
      * Traverses the linked list from head to tail, running [block] on each Node as it goes. If
-     * [block] returns true, it will stop traversing and return true. If [block] returns false,
-     * it will continue.
+     * [block] returns true, it will stop traversing and return true. If [block] returns false, it
+     * will continue.
      *
      * @return Returns true if [block] ever returned true, false otherwise.
      */
@@ -733,9 +721,7 @@
     }
 
     internal inline fun <reified T> tailToHead(type: NodeKind<T>, block: (T) -> Unit) {
-        tailToHead(type.mask) {
-            it.dispatchForKind(type, block)
-        }
+        tailToHead(type.mask) { it.dispatchForKind(type, block) }
     }
 
     internal inline fun tailToHead(mask: Int, block: (Modifier.Node) -> Unit) {
@@ -810,11 +796,8 @@
     }
 }
 
-private fun <T : Modifier.Node> ModifierNodeElement<T>.updateUnsafe(
-    node: Modifier.Node
-) {
-    @Suppress("UNCHECKED_CAST")
-    update(node as T)
+private fun <T : Modifier.Node> ModifierNodeElement<T>.updateUnsafe(node: Modifier.Node) {
+    @Suppress("UNCHECKED_CAST") update(node as T)
 }
 
 private fun Modifier.fillVector(
@@ -830,12 +813,18 @@
                 stack.add(next.outer)
             }
             is Modifier.Element -> result.add(next)
-            // some other androidx.compose.ui.node.Modifier implementation that we don't know about...
+            // some other androidx.compose.ui.node.Modifier implementation that we don't know
+            // about...
             // late-allocate the predicate only once for the entire stack
-            else -> next.all(predicate ?: { element: Modifier.Element ->
-                result.add(element)
-                true
-            }.also { predicate = it })
+            else ->
+                next.all(
+                    predicate
+                        ?: { element: Modifier.Element ->
+                                result.add(element)
+                                true
+                            }
+                            .also { predicate = it }
+                )
         }
     }
     return result
diff --git a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/node/NodeCoordinator.kt b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/node/NodeCoordinator.kt
index dd3720d..77fa83e 100644
--- a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/node/NodeCoordinator.kt
+++ b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/node/NodeCoordinator.kt
@@ -52,16 +52,10 @@
 import androidx.compose.ui.unit.plus
 import androidx.compose.ui.unit.toSize
 
-/**
- * Measurable and Placeable type that has a position.
- */
+/** Measurable and Placeable type that has a position. */
 internal abstract class NodeCoordinator(
     override val layoutNode: LayoutNode,
-) :
-    LookaheadCapablePlaceable(),
-    Measurable,
-    LayoutCoordinates,
-    OwnerScope {
+) : LookaheadCapablePlaceable(), Measurable, LayoutCoordinates, OwnerScope {
 
     internal var forcePlaceWithLookaheadOffset: Boolean = false
     internal var forceMeasureWithLookaheadConstraints: Boolean = false
@@ -112,9 +106,7 @@
     }
 
     inline fun <reified T> visitNodes(type: NodeKind<T>, block: (T) -> Unit) {
-        visitNodes(type.mask, type.includeSelfInTraversal) {
-            it.dispatchForKind(type, block)
-        }
+        visitNodes(type.mask, type.includeSelfInTraversal) { it.dispatchForKind(type, block) }
     }
 
     private fun hasNode(type: NodeKind<*>): Boolean {
@@ -122,21 +114,26 @@
     }
 
     fun head(type: NodeKind<*>): Modifier.Node? {
-        visitNodes(type.mask, type.includeSelfInTraversal) { return it }
+        visitNodes(type.mask, type.includeSelfInTraversal) {
+            return it
+        }
         return null
     }
 
     // Size exposed to LayoutCoordinates.
-    final override val size: IntSize get() = measuredSize
+    final override val size: IntSize
+        get() = measuredSize
 
     private var isClipping: Boolean = false
 
     protected var layerBlock: (GraphicsLayerScope.() -> Unit)? = null
         private set
+
     private var layerDensity: Density = layoutNode.density
     private var layerLayoutDirection: LayoutDirection = layoutNode.layoutDirection
 
     private var lastLayerAlpha: Float = 0.8f
+
     fun isTransparent(): Boolean {
         if (layer != null && lastLayerAlpha <= 0f) return true
         return this.wrappedBy?.isTransparent() ?: return false
@@ -175,14 +172,16 @@
                 }
                 // We do not simply compare against old.alignmentLines in case this is a
                 // MutableStateMap and the same instance might be passed.
-                if ((!oldAlignmentLines.isNullOrEmpty() || value.alignmentLines.isNotEmpty()) &&
-                    value.alignmentLines != oldAlignmentLines
+                if (
+                    (!oldAlignmentLines.isNullOrEmpty() || value.alignmentLines.isNotEmpty()) &&
+                        value.alignmentLines != oldAlignmentLines
                 ) {
                     alignmentLinesOwner.alignmentLines.onAlignmentsChanged()
 
                     @Suppress("PrimitiveInCollection")
-                    val oldLines = oldAlignmentLines
-                        ?: (mutableMapOf<AlignmentLine, Int>().also { oldAlignmentLines = it })
+                    val oldLines =
+                        oldAlignmentLines
+                            ?: (mutableMapOf<AlignmentLine, Int>().also { oldAlignmentLines = it })
                     oldLines.clear()
                     oldLines.putAll(value.alignmentLines)
                 }
@@ -214,8 +213,8 @@
         }
 
     /**
-     * Called when the width or height of [measureResult] change. The object instance pointed to
-     * by [measureResult] may or may not have changed.
+     * Called when the width or height of [measureResult] change. The object instance pointed to by
+     * [measureResult] may or may not have changed.
      */
     protected open fun onMeasureResultChanged(width: Int, height: Int) {
         val layer = layer
@@ -231,9 +230,7 @@
         if (layerBlock != null) {
             updateLayerParameters(invokeOnLayoutChange = false)
         }
-        visitNodes(Nodes.Draw) {
-            it.onMeasureResultChanged()
-        }
+        visitNodes(Nodes.Draw) { it.onMeasureResultChanged() }
         layoutNode.owner?.onLayoutChange(layoutNode)
     }
 
@@ -286,18 +283,16 @@
 
     private var _rectCache: MutableRect? = null
     protected val rectCache: MutableRect
-        get() = _rectCache ?: MutableRect(0f, 0f, 0f, 0f).also {
-            _rectCache = it
-        }
+        get() = _rectCache ?: MutableRect(0f, 0f, 0f, 0f).also { _rectCache = it }
 
-    private val snapshotObserver get() = layoutNode.requireOwner().snapshotObserver
+    private val snapshotObserver
+        get() = layoutNode.requireOwner().snapshotObserver
 
-    /**
-     * The current layer's positional attributes.
-     */
+    /** The current layer's positional attributes. */
     private var layerPositionalProperties: LayerPositionalProperties? = null
 
-    internal val lastMeasurementConstraints: Constraints get() = measurementConstraints
+    internal val lastMeasurementConstraints: Constraints
+        get() = measurementConstraints
 
     protected inline fun performingMeasure(
         constraints: Constraints,
@@ -310,16 +305,12 @@
     fun onMeasured() {
         if (hasNode(Nodes.LayoutAware)) {
             Snapshot.withoutReadObservation {
-                visitNodes(Nodes.LayoutAware) {
-                    it.onRemeasured(measuredSize)
-                }
+                visitNodes(Nodes.LayoutAware) { it.onRemeasured(measuredSize) }
             }
         }
     }
 
-    /**
-     * Places the modified child.
-     */
+    /** Places the modified child. */
     /*@CallSuper*/
     override fun placeAt(
         position: IntOffset,
@@ -333,11 +324,7 @@
         }
     }
 
-    override fun placeAt(
-        position: IntOffset,
-        zIndex: Float,
-        layer: GraphicsLayer
-    ) {
+    override fun placeAt(position: IntOffset, zIndex: Float, layer: GraphicsLayer) {
         if (forcePlaceWithLookaheadOffset) {
             placeSelf(lookaheadDelegate!!.position, zIndex, null, layer)
         } else {
@@ -362,14 +349,14 @@
                 this.explicitLayer = explicitLayer
             }
             if (layer == null) {
-                layer = layoutNode.requireOwner().createLayer(
-                    drawBlock,
-                    invalidateParentLayer,
-                    explicitLayer
-                ).apply {
-                    resize(measuredSize)
-                    move(position)
-                }
+                layer =
+                    layoutNode
+                        .requireOwner()
+                        .createLayer(drawBlock, invalidateParentLayer, explicitLayer)
+                        .apply {
+                            resize(measuredSize)
+                            move(position)
+                        }
                 layoutNode.innerLayerCoordinatorIsDirty = true
                 invalidateParentLayer()
             }
@@ -425,9 +412,7 @@
         placeSelf(position + apparentToRealOffset, zIndex, layerBlock, layer)
     }
 
-    /**
-     * Draws the content of the LayoutNode
-     */
+    /** Draws the content of the LayoutNode */
     fun draw(canvas: Canvas, graphicsLayer: GraphicsLayer?) {
         val layer = layer
         if (layer != null) {
@@ -456,17 +441,15 @@
     }
 
     fun onPlaced() {
-        visitNodes(Nodes.LayoutAware) {
-            it.onPlaced(this)
-        }
+        visitNodes(Nodes.LayoutAware) { it.onPlaced(this) }
     }
 
     // implementation of draw block passed to the OwnedLayer
     @Suppress("LiftReturnOrAssignment")
     private val drawBlock: (Canvas, GraphicsLayer?) -> Unit = { canvas, parentLayer ->
-            if (layoutNode.isPlaced) {
-                snapshotObserver.observeReads(this, onCommitAffectingLayer) {
-                    drawContainedDrawModifiers(canvas, parentLayer)
+        if (layoutNode.isPlaced) {
+            snapshotObserver.observeReads(this, onCommitAffectingLayer) {
+                drawContainedDrawModifiers(canvas, parentLayer)
             }
             lastLayerDrawingWasSkipped = false
         } else {
@@ -485,21 +468,22 @@
             "layerBlock can't be provided when explicitLayer is provided"
         }
         val layoutNode = layoutNode
-        val updateParameters = forceUpdateLayerParameters || this.layerBlock !== layerBlock ||
-            layerDensity != layoutNode.density || layerLayoutDirection != layoutNode.layoutDirection
+        val updateParameters =
+            forceUpdateLayerParameters ||
+                this.layerBlock !== layerBlock ||
+                layerDensity != layoutNode.density ||
+                layerLayoutDirection != layoutNode.layoutDirection
         this.layerDensity = layoutNode.density
         this.layerLayoutDirection = layoutNode.layoutDirection
 
         if (layoutNode.isAttached && layerBlock != null) {
             this.layerBlock = layerBlock
             if (layer == null) {
-                layer = layoutNode.requireOwner().createLayer(
-                    drawBlock,
-                    invalidateParentLayer
-                ).apply {
-                    resize(measuredSize)
-                    move(position)
-                }
+                layer =
+                    layoutNode.requireOwner().createLayer(drawBlock, invalidateParentLayer).apply {
+                        resize(measuredSize)
+                        move(position)
+                    }
                 updateLayerParameters()
                 layoutNode.innerLayerCoordinatorIsDirty = true
                 invalidateParentLayer()
@@ -528,9 +512,10 @@
         }
         val layer = layer
         if (layer != null) {
-            val layerBlock = checkPreconditionNotNull(layerBlock) {
-                "updateLayerParameters requires a non-null layerBlock"
-            }
+            val layerBlock =
+                checkPreconditionNotNull(layerBlock) {
+                    "updateLayerParameters requires a non-null layerBlock"
+                }
             graphicsLayerScope.reset()
             graphicsLayerScope.graphicsDensity = layoutNode.density
             graphicsLayerScope.layoutDirection = layoutNode.layoutDirection
@@ -539,8 +524,9 @@
                 layerBlock.invoke(graphicsLayerScope)
                 graphicsLayerScope.updateOutline()
             }
-            val layerPositionalProperties = layerPositionalProperties
-                ?: LayerPositionalProperties().also { layerPositionalProperties = it }
+            val layerPositionalProperties =
+                layerPositionalProperties
+                    ?: LayerPositionalProperties().also { layerPositionalProperties = it }
             layerPositionalProperties.copyFrom(graphicsLayerScope)
             layer.updateLayerProperties(graphicsLayerScope)
             isClipping = graphicsLayerScope.clip
@@ -553,9 +539,7 @@
         }
     }
 
-    private val invalidateParentLayer: () -> Unit = {
-        wrappedBy?.invalidateLayer()
-    }
+    private val invalidateParentLayer: () -> Unit = { wrappedBy?.invalidateLayer() }
 
     /**
      * True when the last drawing of this layer didn't draw the real content as the LayoutNode
@@ -579,15 +563,15 @@
      * Executes a hit test for this [NodeCoordinator].
      *
      * @param hitTestSource The hit test specifics for pointer input or semantics
-     * @param pointerPosition The tested pointer position, which is relative to
-     * the [NodeCoordinator].
+     * @param pointerPosition The tested pointer position, which is relative to the
+     *   [NodeCoordinator].
      * @param hitTestResult The parent [HitTestResult] that any hit should be added to.
-     * @param isTouchEvent `true` if this is from a touch source. Touch sources allow for
-     * minimum touch target. Semantics hit tests always treat hits as needing minimum touch target.
+     * @param isTouchEvent `true` if this is from a touch source. Touch sources allow for minimum
+     *   touch target. Semantics hit tests always treat hits as needing minimum touch target.
      * @param isInLayer `true` if the touch event is in the layer of this and all parents or `false`
-     * if it is outside the layer, but within the minimum touch target of the edge of the layer.
-     * This can only be `false` when [isTouchEvent] is `true` or else a layer miss means the event
-     * will be clipped out.
+     *   if it is outside the layer, but within the minimum touch target of the edge of the layer.
+     *   This can only be `false` when [isTouchEvent] is `true` or else a layer miss means the event
+     *   will be clipped out.
      */
     fun hitTest(
         hitTestSource: HitTestSource,
@@ -603,8 +587,9 @@
             if (isTouchEvent) {
                 val distanceFromEdge =
                     distanceInMinimumTouchTarget(pointerPosition, minimumTouchTargetSize)
-                if (distanceFromEdge.isFinite() &&
-                    hitTestResult.isHitInMinimumTouchTargetBetter(distanceFromEdge, false)
+                if (
+                    distanceFromEdge.isFinite() &&
+                        hitTestResult.isHitInMinimumTouchTargetBetter(distanceFromEdge, false)
                 ) {
                     head.hitNear(
                         hitTestSource,
@@ -620,20 +605,17 @@
             hitTestChild(hitTestSource, pointerPosition, hitTestResult, isTouchEvent, isInLayer)
         } else if (isPointerInBounds(pointerPosition)) {
             // A real hit
-            head.hit(
-                hitTestSource,
-                pointerPosition,
-                hitTestResult,
-                isTouchEvent,
-                isInLayer
-            )
+            head.hit(hitTestSource, pointerPosition, hitTestResult, isTouchEvent, isInLayer)
         } else {
-            val distanceFromEdge = if (!isTouchEvent) Float.POSITIVE_INFINITY else {
-                distanceInMinimumTouchTarget(pointerPosition, minimumTouchTargetSize)
-            }
+            val distanceFromEdge =
+                if (!isTouchEvent) Float.POSITIVE_INFINITY
+                else {
+                    distanceInMinimumTouchTarget(pointerPosition, minimumTouchTargetSize)
+                }
 
-            if (distanceFromEdge.isFinite() &&
-                hitTestResult.isHitInMinimumTouchTargetBetter(distanceFromEdge, isInLayer)
+            if (
+                distanceFromEdge.isFinite() &&
+                    hitTestResult.isHitInMinimumTouchTargetBetter(distanceFromEdge, isInLayer)
             ) {
                 // Hit closer than existing handlers, so just record it
                 head.hitNear(
@@ -658,8 +640,7 @@
     }
 
     /**
-     * The [NodeCoordinator] had a hit in bounds and can record any children in the
-     * [hitTestResult].
+     * The [NodeCoordinator] had a hit in bounds and can record any children in the [hitTestResult].
      */
     private fun Modifier.Node?.hit(
         hitTestSource: HitTestSource,
@@ -679,8 +660,8 @@
     }
 
     /**
-     * The [NodeCoordinator] had a hit [distanceFromEdge] from the bounds and it is within
-     * the minimum touch target distance, so it should be recorded as such in the [hitTestResult].
+     * The [NodeCoordinator] had a hit [distanceFromEdge] from the bounds and it is within the
+     * minimum touch target distance, so it should be recorded as such in the [hitTestResult].
      */
     private fun Modifier.Node?.hitNear(
         hitTestSource: HitTestSource,
@@ -694,26 +675,23 @@
             hitTestChild(hitTestSource, pointerPosition, hitTestResult, isTouchEvent, isInLayer)
         } else {
             // Hit closer than existing handlers, so just record it
-            hitTestResult.hitInMinimumTouchTarget(
-                this,
-                distanceFromEdge,
-                isInLayer
-            ) {
-                nextUntil(hitTestSource.entityType(), Nodes.Layout).hitNear(
-                    hitTestSource,
-                    pointerPosition,
-                    hitTestResult,
-                    isTouchEvent,
-                    isInLayer,
-                    distanceFromEdge
-                )
+            hitTestResult.hitInMinimumTouchTarget(this, distanceFromEdge, isInLayer) {
+                nextUntil(hitTestSource.entityType(), Nodes.Layout)
+                    .hitNear(
+                        hitTestSource,
+                        pointerPosition,
+                        hitTestResult,
+                        isTouchEvent,
+                        isInLayer,
+                        distanceFromEdge
+                    )
             }
         }
     }
 
     /**
-     * The [NodeCoordinator] had a miss, but it hasn't been clipped out. The child must be
-     * checked to see if it hit.
+     * The [NodeCoordinator] had a miss, but it hasn't been clipped out. The child must be checked
+     * to see if it hit.
      */
     private fun Modifier.Node?.speculativeHit(
         hitTestSource: HitTestSource,
@@ -728,12 +706,20 @@
         } else if (hitTestSource.interceptOutOfBoundsChildEvents(this)) {
             // We only want to replace the existing touch target if there are better
             // hits in the children
-            hitTestResult.speculativeHit(
-                this,
-                distanceFromEdge,
-                isInLayer
-            ) {
-                nextUntil(hitTestSource.entityType(), Nodes.Layout).speculativeHit(
+            hitTestResult.speculativeHit(this, distanceFromEdge, isInLayer) {
+                nextUntil(hitTestSource.entityType(), Nodes.Layout)
+                    .speculativeHit(
+                        hitTestSource,
+                        pointerPosition,
+                        hitTestResult,
+                        isTouchEvent,
+                        isInLayer,
+                        distanceFromEdge
+                    )
+            }
+        } else {
+            nextUntil(hitTestSource.entityType(), Nodes.Layout)
+                .speculativeHit(
                     hitTestSource,
                     pointerPosition,
                     hitTestResult,
@@ -741,22 +727,10 @@
                     isInLayer,
                     distanceFromEdge
                 )
-            }
-        } else {
-            nextUntil(hitTestSource.entityType(), Nodes.Layout).speculativeHit(
-                hitTestSource,
-                pointerPosition,
-                hitTestResult,
-                isTouchEvent,
-                isInLayer,
-                distanceFromEdge
-            )
         }
     }
 
-    /**
-     * Do a [hitTest] on the children of this [NodeCoordinator].
-     */
+    /** Do a [hitTest] on the children of this [NodeCoordinator]. */
     open fun hitTestChild(
         hitTestSource: HitTestSource,
         pointerPosition: Offset,
@@ -779,9 +753,7 @@
         }
     }
 
-    /**
-     * Returns the bounds of this [NodeCoordinator], including the minimum touch target.
-     */
+    /** Returns the bounds of this [NodeCoordinator], including the minimum touch target. */
     fun touchBoundsInRoot(): Rect {
         if (!isAttached) {
             return Rect.Zero
@@ -830,8 +802,9 @@
     override fun windowToLocal(relativeToWindow: Offset): Offset {
         checkPrecondition(isAttached) { ExpectAttachedLayoutCoordinates }
         val root = findRootCoordinates()
-        val positionInRoot = layoutNode.requireOwner()
-            .calculateLocalPosition(relativeToWindow) - root.positionInRoot()
+        val positionInRoot =
+            layoutNode.requireOwner().calculateLocalPosition(relativeToWindow) -
+                root.positionInRoot()
         return localPositionOf(root, positionInRoot)
     }
 
@@ -847,11 +820,12 @@
     override fun localPositionOf(
         sourceCoordinates: LayoutCoordinates,
         relativeToSource: Offset
-    ): Offset = localPositionOf(
-        sourceCoordinates = sourceCoordinates,
-        relativeToSource = relativeToSource,
-        includeMotionFrameOfReference = true
-    )
+    ): Offset =
+        localPositionOf(
+            sourceCoordinates = sourceCoordinates,
+            relativeToSource = relativeToSource,
+            includeMotionFrameOfReference = true
+        )
 
     override fun localPositionOf(
         sourceCoordinates: LayoutCoordinates,
@@ -976,11 +950,7 @@
         )
     }
 
-    private fun ancestorToLocal(
-        ancestor: NodeCoordinator,
-        rect: MutableRect,
-        clipBounds: Boolean
-    ) {
+    private fun ancestorToLocal(ancestor: NodeCoordinator, rect: MutableRect, clipBounds: Boolean) {
         if (ancestor === this) {
             return
         }
@@ -1040,23 +1010,23 @@
                 position - this.position
             }
         val layer = layer
-        return layer?.mapOffset(relativeToPosition, inverse = true)
-            ?: relativeToPosition
+        return layer?.mapOffset(relativeToPosition, inverse = true) ?: relativeToPosition
     }
 
     protected fun drawBorder(canvas: Canvas, paint: Paint) {
-        val rect = Rect(
-            left = 0.5f,
-            top = 0.5f,
-            right = measuredSize.width.toFloat() - 0.5f,
-            bottom = measuredSize.height.toFloat() - 0.5f
-        )
+        val rect =
+            Rect(
+                left = 0.5f,
+                top = 0.5f,
+                right = measuredSize.width.toFloat() - 0.5f,
+                bottom = measuredSize.height.toFloat() - 0.5f
+            )
         canvas.drawRect(rect, paint)
     }
 
     /**
-     * This will be called when the [LayoutNode] associated with this [NodeCoordinator] is
-     * attached to the [Owner].
+     * This will be called when the [LayoutNode] associated with this [NodeCoordinator] is attached
+     * to the [Owner].
      */
     fun onLayoutNodeAttach() {
         // this call will update the parameters of the layer (alpha, scale, etc)
@@ -1066,8 +1036,8 @@
     }
 
     /**
-     * This will be called when the [LayoutNode] associated with this [NodeCoordinator] is
-     * released or when the [NodeCoordinator] is released (will not be used anymore).
+     * This will be called when the [LayoutNode] associated with this [NodeCoordinator] is released
+     * or when the [NodeCoordinator] is released (will not be used anymore).
      */
     fun onRelease() {
         released = true
@@ -1082,9 +1052,9 @@
     }
 
     /**
-     * Modifies bounds to be in the parent NodeCoordinator's coordinates, including clipping,
-     * if [clipBounds] is true. If [clipToMinimumTouchTargetSize] is true and the layer clips,
-     * then the clip bounds are extended to allow minimum touch target extended area.
+     * Modifies bounds to be in the parent NodeCoordinator's coordinates, including clipping, if
+     * [clipBounds] is true. If [clipToMinimumTouchTargetSize] is true and the layer clips, then the
+     * clip bounds are extended to allow minimum touch target extended area.
      */
     internal fun rectInParent(
         bounds: MutableRect,
@@ -1099,7 +1069,10 @@
                     val horz = minTouch.width / 2f
                     val vert = minTouch.height / 2f
                     bounds.intersect(
-                        -horz, -vert, size.width.toFloat() + horz, size.height.toFloat() + vert
+                        -horz,
+                        -vert,
+                        size.width.toFloat() + horz,
+                        size.height.toFloat() + vert
                     )
                 } else if (clipBounds) {
                     bounds.intersect(0f, 0f, size.width.toFloat(), size.height.toFloat())
@@ -1121,8 +1094,8 @@
     }
 
     /**
-     * Modifies bounds in the parent's coordinates to be in this NodeCoordinator's
-     * coordinates, including clipping, if [clipBounds] is true.
+     * Modifies bounds in the parent's coordinates to be in this NodeCoordinator's coordinates,
+     * including clipping, if [clipBounds] is true.
      */
     private fun fromParentRect(bounds: MutableRect, clipBounds: Boolean) {
         val x = position.x
@@ -1163,9 +1136,7 @@
         return x >= 0f && y >= 0f && x < measuredWidth && y < measuredHeight
     }
 
-    /**
-     * Invalidates the layer that this coordinator will draw into.
-     */
+    /** Invalidates the layer that this coordinator will draw into. */
     open fun invalidateLayer() {
         val layer = layer
         if (layer != null) {
@@ -1189,9 +1160,7 @@
         if (ancestor1 === ancestor2) {
             val otherNode = other.tail
             // They are on the same node, but we don't know which is the deeper of the two
-            tail.visitLocalAncestors(Nodes.Layout.mask) {
-                if (it === otherNode) return other
-            }
+            tail.visitLocalAncestors(Nodes.Layout.mask) { if (it === otherNode) return other }
             return this
         }
 
@@ -1245,9 +1214,9 @@
     }
 
     /**
-     * Returns the additional amount on the horizontal and vertical dimensions that
-     * this extends beyond [width] and [height] on all sides. This takes into account
-     * [minimumTouchTargetSize] and [measuredSize] vs. [width] and [height].
+     * Returns the additional amount on the horizontal and vertical dimensions that this extends
+     * beyond [width] and [height] on all sides. This takes into account [minimumTouchTargetSize]
+     * and [measuredSize] vs. [width] and [height].
      */
     protected fun calculateMinimumTouchTargetPadding(minimumTouchTargetSize: Size): Size {
         val widthDiff = minimumTouchTargetSize.width - measuredWidth.toFloat()
@@ -1256,16 +1225,17 @@
     }
 
     /**
-     * The distance within the [minimumTouchTargetSize] of [pointerPosition] to the layout
-     * size. If [pointerPosition] isn't within [minimumTouchTargetSize], then
-     * [Float.POSITIVE_INFINITY] is returned.
+     * The distance within the [minimumTouchTargetSize] of [pointerPosition] to the layout size. If
+     * [pointerPosition] isn't within [minimumTouchTargetSize], then [Float.POSITIVE_INFINITY] is
+     * returned.
      */
     protected fun distanceInMinimumTouchTarget(
         pointerPosition: Offset,
         minimumTouchTargetSize: Size
     ): Float {
-        if (measuredWidth >= minimumTouchTargetSize.width &&
-            measuredHeight >= minimumTouchTargetSize.height
+        if (
+            measuredWidth >= minimumTouchTargetSize.width &&
+                measuredHeight >= minimumTouchTargetSize.height
         ) {
             // this layout is big enough that it doesn't qualify for minimum touch targets
             return Float.POSITIVE_INFINITY
@@ -1274,8 +1244,8 @@
         val (width, height) = calculateMinimumTouchTargetPadding(minimumTouchTargetSize)
         val offsetFromEdge = offsetFromEdge(pointerPosition)
 
-        return if ((width > 0f || height > 0f) &&
-            offsetFromEdge.x <= width && offsetFromEdge.y <= height
+        return if (
+            (width > 0f || height > 0f) && offsetFromEdge.x <= width && offsetFromEdge.y <= height
         ) {
             offsetFromEdge.getDistanceSquared()
         } else {
@@ -1284,31 +1254,27 @@
     }
 
     /**
-     * [LayoutNode.hitTest] and [LayoutNode.hitTestSemantics] are very similar, but the data
-     * used in their implementations are different. This extracts the differences between the
-     * two methods into a single interface.
+     * [LayoutNode.hitTest] and [LayoutNode.hitTestSemantics] are very similar, but the data used in
+     * their implementations are different. This extracts the differences between the two methods
+     * into a single interface.
      */
     internal interface HitTestSource {
-        /**
-         * Returns the [NodeKind] for the hit test target.
-         */
+        /** Returns the [NodeKind] for the hit test target. */
         fun entityType(): NodeKind<*>
 
         /**
-         * Pointer input hit tests can intercept child hits when enabled. This returns `true`
-         * if the modifier has requested intercepting.
+         * Pointer input hit tests can intercept child hits when enabled. This returns `true` if the
+         * modifier has requested intercepting.
          */
         fun interceptOutOfBoundsChildEvents(node: Modifier.Node): Boolean
 
         /**
-         * Returns false if the parent layout node has a state that suppresses
-         * hit testing of its children.
+         * Returns false if the parent layout node has a state that suppresses hit testing of its
+         * children.
          */
         fun shouldHitTestChildren(parentLayoutNode: LayoutNode): Boolean
 
-        /**
-         * Calls a hit test on [layoutNode].
-         */
+        /** Calls a hit test on [layoutNode]. */
         fun childHitTest(
             layoutNode: LayoutNode,
             pointerPosition: Offset,
@@ -1319,8 +1285,8 @@
     }
 
     internal companion object {
-        const val ExpectAttachedLayoutCoordinates = "LayoutCoordinate operations are only valid " +
-            "when isAttached is true"
+        const val ExpectAttachedLayoutCoordinates =
+            "LayoutCoordinate operations are only valid " + "when isAttached is true"
         const val UnmeasuredError = "Asking for measurement result of unmeasured layout modifier"
         private val onCommitAffectingLayerParams: (NodeCoordinator) -> Unit = { coordinator ->
             if (coordinator.isValidOwnerScope) {
@@ -1337,8 +1303,10 @@
                         val layoutNode = coordinator.layoutNode
                         val layoutDelegate = layoutNode.layoutDelegate
                         if (layoutDelegate.childrenAccessingCoordinatesDuringPlacement > 0) {
-                            if (layoutDelegate.coordinatesAccessedDuringModifierPlacement ||
-                                layoutDelegate.coordinatesAccessedDuringPlacement) {
+                            if (
+                                layoutDelegate.coordinatesAccessedDuringModifierPlacement ||
+                                    layoutDelegate.coordinatesAccessedDuringPlacement
+                            ) {
                                 layoutNode.requestRelayout()
                             }
                             layoutDelegate.measurePassDelegate
@@ -1359,9 +1327,7 @@
         // reentrancy.
         private val tmpMatrix = Matrix()
 
-        /**
-         * Hit testing specifics for pointer input.
-         */
+        /** Hit testing specifics for pointer input. */
         val PointerInputSource =
             object : HitTestSource {
                 override fun entityType() = Nodes.PointerInput
@@ -1384,9 +1350,7 @@
                 ) = layoutNode.hitTest(pointerPosition, hitTestResult, isTouchEvent, isInLayer)
             }
 
-        /**
-         * Hit testing specifics for semantics.
-         */
+        /** Hit testing specifics for semantics. */
         val SemanticsSource =
             object : HitTestSource {
                 override fun entityType() = Nodes.Semantics
@@ -1402,19 +1366,20 @@
                     hitTestResult: HitTestResult,
                     isTouchEvent: Boolean,
                     isInLayer: Boolean
-                ) = layoutNode.hitTestSemantics(
-                    pointerPosition,
-                    hitTestResult,
-                    isTouchEvent,
-                    isInLayer
-                )
+                ) =
+                    layoutNode.hitTestSemantics(
+                        pointerPosition,
+                        hitTestResult,
+                        isTouchEvent,
+                        isInLayer
+                    )
             }
     }
 }
 
 /**
- * These are the components of a layer that changes the position and may lead
- * to an OnGloballyPositionedCallback.
+ * These are the components of a layer that changes the position and may lead to an
+ * OnGloballyPositionedCallback.
  */
 private class LayerPositionalProperties {
     private var scaleX: Float = 1f
@@ -1464,10 +1429,7 @@
     }
 }
 
-private fun DelegatableNode.nextUntil(
-    type: NodeKind<*>,
-    stopType: NodeKind<*>
-): Modifier.Node? {
+private fun DelegatableNode.nextUntil(type: NodeKind<*>, stopType: NodeKind<*>): Modifier.Node? {
     val child = node.child ?: return null
     if (child.aggregateChildKindSet and type.mask == 0) return null
     var next: Modifier.Node? = child
diff --git a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/node/NodeKind.kt b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/node/NodeKind.kt
index 893c692..f334636 100644
--- a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/node/NodeKind.kt
+++ b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/node/NodeKind.kt
@@ -49,6 +49,7 @@
 @JvmInline
 internal value class NodeKind<T>(val mask: Int) {
     inline infix fun or(other: NodeKind<*>): Int = mask or other.mask
+
     inline infix fun or(other: Int): Int = mask or other
 }
 
@@ -71,43 +72,76 @@
 @OptIn(ExperimentalComposeUiApi::class)
 internal object Nodes {
     @JvmStatic
-    inline val Any get() = NodeKind<Modifier.Node>(0b1 shl 0)
+    inline val Any
+        get() = NodeKind<Modifier.Node>(0b1 shl 0)
+
     @JvmStatic
-    inline val Layout get() = NodeKind<LayoutModifierNode>(0b1 shl 1)
+    inline val Layout
+        get() = NodeKind<LayoutModifierNode>(0b1 shl 1)
+
     @JvmStatic
-    inline val Draw get() = NodeKind<DrawModifierNode>(0b1 shl 2)
+    inline val Draw
+        get() = NodeKind<DrawModifierNode>(0b1 shl 2)
+
     @JvmStatic
-    inline val Semantics get() = NodeKind<SemanticsModifierNode>(0b1 shl 3)
+    inline val Semantics
+        get() = NodeKind<SemanticsModifierNode>(0b1 shl 3)
+
     @JvmStatic
-    inline val PointerInput get() = NodeKind<PointerInputModifierNode>(0b1 shl 4)
+    inline val PointerInput
+        get() = NodeKind<PointerInputModifierNode>(0b1 shl 4)
+
     @JvmStatic
-    inline val Locals get() = NodeKind<ModifierLocalModifierNode>(0b1 shl 5)
+    inline val Locals
+        get() = NodeKind<ModifierLocalModifierNode>(0b1 shl 5)
+
     @JvmStatic
-    inline val ParentData get() = NodeKind<ParentDataModifierNode>(0b1 shl 6)
+    inline val ParentData
+        get() = NodeKind<ParentDataModifierNode>(0b1 shl 6)
+
     @JvmStatic
-    inline val LayoutAware get() = NodeKind<LayoutAwareModifierNode>(0b1 shl 7)
+    inline val LayoutAware
+        get() = NodeKind<LayoutAwareModifierNode>(0b1 shl 7)
+
     @JvmStatic
-    inline val GlobalPositionAware get() = NodeKind<GlobalPositionAwareModifierNode>(0b1 shl 8)
+    inline val GlobalPositionAware
+        get() = NodeKind<GlobalPositionAwareModifierNode>(0b1 shl 8)
+
     @JvmStatic
-    inline val ApproachMeasure get() = NodeKind<ApproachLayoutModifierNode>(0b1 shl 9)
+    inline val ApproachMeasure
+        get() = NodeKind<ApproachLayoutModifierNode>(0b1 shl 9)
+
     @JvmStatic
-    inline val FocusTarget get() = NodeKind<FocusTargetNode>(0b1 shl 10)
+    inline val FocusTarget
+        get() = NodeKind<FocusTargetNode>(0b1 shl 10)
+
     @JvmStatic
-    inline val FocusProperties get() = NodeKind<FocusPropertiesModifierNode>(0b1 shl 11)
+    inline val FocusProperties
+        get() = NodeKind<FocusPropertiesModifierNode>(0b1 shl 11)
+
     @JvmStatic
-    inline val FocusEvent get() = NodeKind<FocusEventModifierNode>(0b1 shl 12)
+    inline val FocusEvent
+        get() = NodeKind<FocusEventModifierNode>(0b1 shl 12)
+
     @JvmStatic
-    inline val KeyInput get() = NodeKind<KeyInputModifierNode>(0b1 shl 13)
+    inline val KeyInput
+        get() = NodeKind<KeyInputModifierNode>(0b1 shl 13)
+
     @JvmStatic
-    inline val RotaryInput get() = NodeKind<RotaryInputModifierNode>(0b1 shl 14)
+    inline val RotaryInput
+        get() = NodeKind<RotaryInputModifierNode>(0b1 shl 14)
+
     @JvmStatic
     inline val CompositionLocalConsumer
         get() = NodeKind<CompositionLocalConsumerModifierNode>(0b1 shl 15)
+
     @JvmStatic
     inline val SoftKeyboardKeyInput
         get() = NodeKind<SoftKeyboardInterceptionModifierNode>(0b1 shl 17)
+
     @JvmStatic
-    inline val Traversable get() = NodeKind<TraversableNode>(0b1 shl 18)
+    inline val Traversable
+        get() = NodeKind<TraversableNode>(0b1 shl 18)
     // ...
 }
 
@@ -125,10 +159,7 @@
     if (element is PointerInputModifier) {
         mask = mask or Nodes.PointerInput
     }
-    if (
-        element is ModifierLocalConsumer ||
-        element is ModifierLocalProvider<*>
-    ) {
+    if (element is ModifierLocalConsumer || element is ModifierLocalProvider<*>) {
         mask = mask or Nodes.Locals
     }
     @Suppress("DEPRECATION")
@@ -145,16 +176,14 @@
     if (element is ParentDataModifier) {
         mask = mask or Nodes.ParentData
     }
-    if (
-        element is OnPlacedModifier ||
-        element is OnRemeasuredModifier
-    ) {
+    if (element is OnPlacedModifier || element is OnRemeasuredModifier) {
         mask = mask or Nodes.LayoutAware
     }
     return mask
 }
 
 private val classToKindSetMap = mutableObjectIntMapOf<Any>()
+
 @OptIn(ExperimentalComposeUiApi::class)
 internal fun calculateNodeKindSetFrom(node: Modifier.Node): Int {
     // This function does not take delegates into account, as a result, the kindSet will never
@@ -218,12 +247,9 @@
     }
 }
 
-@Suppress("ConstPropertyName")
-private const val Updated = 0
-@Suppress("ConstPropertyName")
-private const val Inserted = 1
-@Suppress("ConstPropertyName")
-private const val Removed = 2
+@Suppress("ConstPropertyName") private const val Updated = 0
+@Suppress("ConstPropertyName") private const val Inserted = 1
+@Suppress("ConstPropertyName") private const val Removed = 2
 
 internal fun autoInvalidateRemovedNode(node: Modifier.Node) {
     checkPrecondition(node.isAttached) { "autoInvalidateRemovedNode called on unattached node" }
@@ -298,8 +324,8 @@
     }
     if (
         Nodes.FocusProperties in selfKindSet &&
-        node is FocusPropertiesModifierNode &&
-        node.specifiesCanFocusProperty()
+            node is FocusPropertiesModifierNode &&
+            node.specifiesCanFocusProperty()
     ) {
         when (phase) {
             Removed -> node.scheduleInvalidationOfAssociatedFocusTargets()
@@ -338,9 +364,15 @@
     private var canFocusValue: Boolean? = null
     override var canFocus: Boolean
         get() = checkPreconditionNotNull(canFocusValue) { "canFocus is read before it is written" }
-        set(value) { canFocusValue = value }
+        set(value) {
+            canFocusValue = value
+        }
+
     fun isCanFocusSet(): Boolean = canFocusValue != null
-    fun reset() { canFocusValue = null }
+
+    fun reset() {
+        canFocusValue = null
+    }
 }
 
 internal fun calculateNodeKindSetFromIncludingDelegates(node: Modifier.Node): Int {
diff --git a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/node/ObserverModifierNode.kt b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/node/ObserverModifierNode.kt
index 9b2fa6f..04f6fb8 100644
--- a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/node/ObserverModifierNode.kt
+++ b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/node/ObserverModifierNode.kt
@@ -20,23 +20,22 @@
 
 /**
  * [Modifier.Node]s that implement ObserverNode can provide their own implementation of
- * [onObservedReadsChanged] that will be called in response to changes to snapshot objects
- * read within an [observeReads] block.
+ * [onObservedReadsChanged] that will be called in response to changes to snapshot objects read
+ * within an [observeReads] block.
  */
 interface ObserverModifierNode : DelegatableNode {
 
     /**
-     * This callback is called when any values that are read within the [observeReads] block
-     * change. It is called after the snapshot is committed. [onObservedReadsChanged] is called on
-     * the UI thread, and only called once in response to snapshot observation. To continue
-     * observing further updates, you need to call [observeReads] again.
+     * This callback is called when any values that are read within the [observeReads] block change.
+     * It is called after the snapshot is committed. [onObservedReadsChanged] is called on the UI
+     * thread, and only called once in response to snapshot observation. To continue observing
+     * further updates, you need to call [observeReads] again.
      */
     fun onObservedReadsChanged()
 }
 
-internal class ObserverNodeOwnerScope(
-    internal val observerNode: ObserverModifierNode
-) : OwnerScope {
+internal class ObserverNodeOwnerScope(internal val observerNode: ObserverModifierNode) :
+    OwnerScope {
     override val isValidOwnerScope: Boolean
         get() = observerNode.node.isAttached
 
@@ -54,9 +53,11 @@
  */
 fun <T> T.observeReads(block: () -> Unit) where T : Modifier.Node, T : ObserverModifierNode {
     val target = ownerScope ?: ObserverNodeOwnerScope(this).also { ownerScope = it }
-    requireOwner().snapshotObserver.observeReads(
-        target = target,
-        onChanged = ObserverNodeOwnerScope.OnObserveReadsChanged,
-        block = block
-    )
+    requireOwner()
+        .snapshotObserver
+        .observeReads(
+            target = target,
+            onChanged = ObserverNodeOwnerScope.OnObserveReadsChanged,
+            block = block
+        )
 }
diff --git a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/node/OnPositionedDispatcher.kt b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/node/OnPositionedDispatcher.kt
index 7f5ef02..b0ae0cd 100644
--- a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/node/OnPositionedDispatcher.kt
+++ b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/node/OnPositionedDispatcher.kt
@@ -19,8 +19,8 @@
 import androidx.compose.runtime.collection.mutableVectorOf
 
 /**
- * Tracks the nodes being positioned and dispatches OnPositioned callbacks when we finished
- * the measure/layout pass.
+ * Tracks the nodes being positioned and dispatches OnPositioned callbacks when we finished the
+ * measure/layout pass.
  */
 internal class OnPositionedDispatcher {
     private val layoutNodes = mutableVectorOf<LayoutNode>()
@@ -76,9 +76,7 @@
         layoutNode.dispatchOnPositionedCallbacks()
         layoutNode.needsOnPositionedDispatch = false
 
-        layoutNode.forEachChild { child ->
-            dispatchHierarchy(child)
-        }
+        layoutNode.forEachChild { child -> dispatchHierarchy(child) }
     }
 
     internal companion object {
diff --git a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/node/OwnedLayer.kt b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/node/OwnedLayer.kt
index 602a375..6090fdb 100644
--- a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/node/OwnedLayer.kt
+++ b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/node/OwnedLayer.kt
@@ -25,77 +25,60 @@
 import androidx.compose.ui.unit.IntOffset
 import androidx.compose.ui.unit.IntSize
 
-/**
- * A layer returned by [Owner.createLayer] to separate drawn content.
- */
+/** A layer returned by [Owner.createLayer] to separate drawn content. */
 internal interface OwnedLayer {
 
-    /**
-     * Applies the new layer properties, causing this layer to be redrawn.
-     */
+    /** Applies the new layer properties, causing this layer to be redrawn. */
     fun updateLayerProperties(scope: ReusableGraphicsLayerScope)
 
     /**
-     * Returns `false` if [position] is outside the clipped region or `true` if clipping
-     * is disabled or it is within the clipped region.
+     * Returns `false` if [position] is outside the clipped region or `true` if clipping is disabled
+     * or it is within the clipped region.
      */
     fun isInLayer(position: Offset): Boolean
 
-    /**
-     * Changes the position of the layer contents.
-     */
+    /** Changes the position of the layer contents. */
     fun move(position: IntOffset)
 
-    /**
-     * Changes the size of the layer's drawn area.
-     */
+    /** Changes the size of the layer's drawn area. */
     fun resize(size: IntSize)
 
-    /**
-     * Causes the layer to be drawn into [canvas]
-     */
+    /** Causes the layer to be drawn into [canvas] */
     fun drawLayer(canvas: Canvas, parentLayer: GraphicsLayer?)
 
-    /**
-     * Updates the drawing on the current canvas.
-     */
+    /** Updates the drawing on the current canvas. */
     fun updateDisplayList()
 
-    /**
-     * Asks to the layer to redraw itself without forcing all of its parents to redraw.
-     */
+    /** Asks to the layer to redraw itself without forcing all of its parents to redraw. */
     fun invalidate()
 
-    /**
-     * Indicates that the layer is no longer needed.
-     */
+    /** Indicates that the layer is no longer needed. */
     fun destroy()
 
     /**
-     * Transforms [point] to this layer's bounds, returning an [Offset] with the transformed x
-     * and y values.
+     * Transforms [point] to this layer's bounds, returning an [Offset] with the transformed x and y
+     * values.
      *
      * @param point the [Offset] to transform to this layer's bounds
      * @param inverse whether to invert this layer's transform [Matrix] first, such as when
-     * converting an offset in a parent layer to be in this layer's coordinates.
+     *   converting an offset in a parent layer to be in this layer's coordinates.
      */
     fun mapOffset(point: Offset, inverse: Boolean): Offset
 
     /**
-     * Transforms the provided [rect] to this layer's bounds, then updates [rect] to match the
-     * new bounds after the transform.
+     * Transforms the provided [rect] to this layer's bounds, then updates [rect] to match the new
+     * bounds after the transform.
      *
      * @param rect the bounds to transform to this layer's bounds, and then mutate with the
-     * resulting value
+     *   resulting value
      * @param inverse whether to invert this layer's transform [Matrix] first, such as when
-     * converting bounds in a parent layer to be in this layer's coordinates.
+     *   converting bounds in a parent layer to be in this layer's coordinates.
      */
     fun mapBounds(rect: MutableRect, inverse: Boolean)
 
     /**
-     * Reuse this layer after it was [destroy]ed, setting the new
-     * [drawBlock] and [invalidateParentLayer] values. The layer will be reinitialized
-     * as new after this call.
+     * Reuse this layer after it was [destroy]ed, setting the new [drawBlock] and
+     * [invalidateParentLayer] values. The layer will be reinitialized as new after this call.
      */
     fun reuseLayer(
         drawBlock: (canvas: Canvas, parentLayer: GraphicsLayer?) -> Unit,
@@ -103,14 +86,14 @@
     )
 
     /**
-     * Calculates the transform from the parent to the local coordinates and multiplies
-     * [matrix] by the transform.
+     * Calculates the transform from the parent to the local coordinates and multiplies [matrix] by
+     * the transform.
      */
     fun transform(matrix: Matrix)
 
     /**
-     * Calculates the transform from the layer to the parent and multiplies [matrix] by
-     * the transform.
+     * Calculates the transform from the layer to the parent and multiplies [matrix] by the
+     * transform.
      */
     fun inverseTransform(matrix: Matrix)
 }
diff --git a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/node/Owner.kt b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/node/Owner.kt
index 023a588..6569e8b 100644
--- a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/node/Owner.kt
+++ b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/node/Owner.kt
@@ -46,7 +46,6 @@
 import androidx.compose.ui.platform.TextToolbar
 import androidx.compose.ui.platform.ViewConfiguration
 import androidx.compose.ui.platform.WindowInfo
-import androidx.compose.ui.platform.establishTextInputSession
 import androidx.compose.ui.text.font.Font
 import androidx.compose.ui.text.font.FontFamily
 import androidx.compose.ui.text.input.TextInputService
@@ -55,30 +54,23 @@
 import androidx.compose.ui.unit.LayoutDirection
 import kotlin.coroutines.CoroutineContext
 import kotlinx.coroutines.Job
-import kotlinx.coroutines.cancelAndJoin
 
 /**
- * Owner implements the connection to the underlying view system. On Android, this connects
- * to Android [views][android.view.View] and all layout, draw, input, and accessibility is hooked
+ * Owner implements the connection to the underlying view system. On Android, this connects to
+ * Android [views][android.view.View] and all layout, draw, input, and accessibility is hooked
  * through them.
  */
 internal interface Owner : PositionCalculator {
 
-    /**
-     * The root layout node in the component tree.
-     */
+    /** The root layout node in the component tree. */
     val root: LayoutNode
 
-    /**
-     * Draw scope reused for drawing speed up.
-     */
+    /** Draw scope reused for drawing speed up. */
     val sharedDrawScope: LayoutNodeDrawScope
 
     val rootForTest: RootForTest
 
-    /**
-     * Provide haptic feedback to the user. Use the Android version of haptic feedback.
-     */
+    /** Provide haptic feedback to the user. Use the Android version of haptic feedback. */
     val hapticFeedBack: HapticFeedback
 
     /**
@@ -87,9 +79,7 @@
      */
     val inputModeManager: InputModeManager
 
-    /**
-     * Provide clipboard manager to the user. Use the Android version of clipboard manager.
-     */
+    /** Provide clipboard manager to the user. Use the Android version of clipboard manager. */
     val clipboardManager: ClipboardManager
 
     /**
@@ -104,16 +94,15 @@
      */
     val graphicsContext: GraphicsContext
 
-    /**
-     * Provide toolbar for text-related actions, such as copy, paste, cut etc.
-     */
+    /** Provide toolbar for text-related actions, such as copy, paste, cut etc. */
     val textToolbar: TextToolbar
 
     /**
-     *  A data structure used to store autofill information. It is used by components that want to
-     *  provide autofill semantics.
-     *  TODO(ralu): Replace with SemanticsTree. This is a temporary hack until we have a semantics
-     *  tree implemented.
+     * A data structure used to store autofill information. It is used by components that want to
+     * provide autofill semantics.
+     *
+     * TODO(ralu): Replace with SemanticsTree. This is a temporary hack until we have a semantics
+     *   tree implemented.
      */
     @Suppress("OPT_IN_MARKER_ON_WRONG_TARGET")
     @get:ExperimentalComposeUiApi
@@ -143,14 +132,10 @@
 
     val pointerIconService: PointerIconService
 
-    /**
-     * Provide a focus owner that controls focus within Compose.
-     */
+    /** Provide a focus owner that controls focus within Compose. */
     val focusOwner: FocusOwner
 
-    /**
-     * Provide information about the window that hosts this [Owner].
-     */
+    /** Provide information about the window that hosts this [Owner]. */
     val windowInfo: WindowInfo
 
     @Deprecated(
@@ -164,13 +149,9 @@
 
     val layoutDirection: LayoutDirection
 
-    /**
-     * `true` when layout should draw debug bounds.
-     */
+    /** `true` when layout should draw debug bounds. */
     var showLayoutBounds: Boolean
-        @RestrictTo(RestrictTo.Scope.LIBRARY)
-        @InternalCoreApi
-        set
+        @RestrictTo(RestrictTo.Scope.LIBRARY) @InternalCoreApi set
 
     /**
      * Called by [LayoutNode] to request the Owner a new measurement+layout. [forceRequest] defines
@@ -187,12 +168,11 @@
     )
 
     /**
-     * Called by [LayoutNode] to request the Owner a new layout. [forceRequest] defines
-     * whether the node should bypass the logic that would reject relayout requests, and therefore
-     * force the relayout request to be evaluated even when it's already pending measure/layout.
+     * Called by [LayoutNode] to request the Owner a new layout. [forceRequest] defines whether the
+     * node should bypass the logic that would reject relayout requests, and therefore force the
+     * relayout request to be evaluated even when it's already pending measure/layout.
      *
-     * [affectsLookahead] specifies whether this relayout request is for the lookahead pass
-     * pass.
+     * [affectsLookahead] specifies whether this relayout request is for the lookahead pass pass.
      */
     fun onRequestRelayout(
         layoutNode: LayoutNode,
@@ -207,9 +187,9 @@
     fun requestOnPositionedCallback(layoutNode: LayoutNode)
 
     /**
-     * Called by [LayoutNode] when it is attached to the view system and now has an owner.
-     * This is used by [Owner] to track which nodes are associated with it. It will only be
-     * called when [node] is not already attached to an owner.
+     * Called by [LayoutNode] when it is attached to the view system and now has an owner. This is
+     * used by [Owner] to track which nodes are associated with it. It will only be called when
+     * [node] is not already attached to an owner.
      */
     fun onAttach(node: LayoutNode)
 
@@ -221,16 +201,16 @@
     fun onDetach(node: LayoutNode)
 
     /**
-     * Returns the position relative to the containing window of the [localPosition],
-     * the position relative to the [Owner]. If the [Owner] is rotated, scaled, or otherwise
-     * transformed relative to the window, this will not be a simple translation.
+     * Returns the position relative to the containing window of the [localPosition], the position
+     * relative to the [Owner]. If the [Owner] is rotated, scaled, or otherwise transformed relative
+     * to the window, this will not be a simple translation.
      */
     fun calculatePositionInWindow(localPosition: Offset): Offset
 
     /**
-     * Returns the position relative to the [Owner] of the [positionInWindow],
-     * the position relative to the window. If the [Owner] is rotated, scaled, or otherwise
-     * transformed relative to the window, this will not be a simple translation.
+     * Returns the position relative to the [Owner] of the [positionInWindow], the position relative
+     * to the window. If the [Owner] is rotated, scaled, or otherwise transformed relative to the
+     * window, this will not be a simple translation.
      */
     fun calculateLocalPosition(positionInWindow: Offset): Offset
 
@@ -254,14 +234,10 @@
      */
     fun measureAndLayout(layoutNode: LayoutNode, constraints: Constraints)
 
-    /**
-     * Makes sure the passed [layoutNode] and its subtree is remeasured and has the final sizes.
-     */
+    /** Makes sure the passed [layoutNode] and its subtree is remeasured and has the final sizes. */
     fun forceMeasureTheSubtree(layoutNode: LayoutNode, affectsLookahead: Boolean = false)
 
-    /**
-     * Creates an [OwnedLayer] which will be drawing the passed [drawBlock].
-     */
+    /** Creates an [OwnedLayer] which will be drawing the passed [drawBlock]. */
     fun createLayer(
         drawBlock: (canvas: Canvas, parentLayer: GraphicsLayer?) -> Unit,
         invalidateParentLayer: () -> Unit,
@@ -269,27 +245,21 @@
     ): OwnedLayer
 
     /**
-     * The semantics have changed. This function will be called when a SemanticsNode is added to
-     * or deleted from the Semantics tree. It will also be called when a SemanticsNode in the
-     * Semantics tree has some property change.
+     * The semantics have changed. This function will be called when a SemanticsNode is added to or
+     * deleted from the Semantics tree. It will also be called when a SemanticsNode in the Semantics
+     * tree has some property change.
      */
     fun onSemanticsChange()
 
-    /**
-     * The position and/or size of the [layoutNode] changed.
-     */
+    /** The position and/or size of the [layoutNode] changed. */
     fun onLayoutChange(layoutNode: LayoutNode)
 
-    /**
-     * The [FocusDirection] represented by the specified keyEvent.
-     */
+    /** The [FocusDirection] represented by the specified keyEvent. */
     fun getFocusDirection(keyEvent: KeyEvent): FocusDirection?
 
     val measureIteration: Long
 
-    /**
-     * The [ViewConfiguration] to use in the application.
-     */
+    /** The [ViewConfiguration] to use in the application. */
     val viewConfiguration: ViewConfiguration
 
     /**
@@ -300,33 +270,26 @@
 
     val modifierLocalManager: ModifierLocalManager
 
-    /**
-     * CoroutineContext for launching coroutines in Modifier Nodes.
-     */
+    /** CoroutineContext for launching coroutines in Modifier Nodes. */
     val coroutineContext: CoroutineContext
 
-    /**
-     * The scope used to place the outermost layout.
-     */
+    /** The scope used to place the outermost layout. */
     val placementScope: Placeable.PlacementScope
         get() = PlacementScope(this) // default implementation for test owners
 
     /**
-     * Registers a call to be made when the [Applier.onEndChanges] is called. [listener]
-     * should be called in [onEndApplyChanges] and then removed after being called.
+     * Registers a call to be made when the [Applier.onEndChanges] is called. [listener] should be
+     * called in [onEndApplyChanges] and then removed after being called.
      */
     fun registerOnEndApplyChangesListener(listener: () -> Unit)
 
     /**
-     * Called when [Applier.onEndChanges] executes. This must call all listeners registered
-     * in [registerOnEndApplyChangesListener] and then remove them so that they are not
-     * called again.
+     * Called when [Applier.onEndChanges] executes. This must call all listeners registered in
+     * [registerOnEndApplyChangesListener] and then remove them so that they are not called again.
      */
     fun onEndApplyChanges()
 
-    /**
-     * [listener] will be notified after the current or next layout has finished.
-     */
+    /** [listener] will be notified after the current or next layout has finished. */
     fun registerOnLayoutCompletedListener(listener: OnLayoutCompletedListener)
 
     val dragAndDropManager: DragAndDropManager
@@ -345,8 +308,8 @@
 
     companion object {
         /**
-         * Enables additional (and expensive to do in production) assertions. Useful to be set
-         * to true during the tests covering our core logic.
+         * Enables additional (and expensive to do in production) assertions. Useful to be set to
+         * true during the tests covering our core logic.
          */
         var enableExtraAssertions: Boolean = false
     }
diff --git a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/node/OwnerSnapshotObserver.kt b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/node/OwnerSnapshotObserver.kt
index 4a23ed0..4e080de 100644
--- a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/node/OwnerSnapshotObserver.kt
+++ b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/node/OwnerSnapshotObserver.kt
@@ -69,9 +69,7 @@
         }
     }
 
-    /**
-     * Observe snapshot reads during layout of [node], executed in [block].
-     */
+    /** Observe snapshot reads during layout of [node], executed in [block]. */
     internal fun observeLayoutSnapshotReads(
         node: LayoutNode,
         affectsLookahead: Boolean = true,
@@ -84,9 +82,7 @@
         }
     }
 
-    /**
-     * Observe snapshot reads during layout of [node]'s LayoutModifiers, executed in [block].
-     */
+    /** Observe snapshot reads during layout of [node]'s LayoutModifiers, executed in [block]. */
     internal fun observeLayoutModifierSnapshotReads(
         node: LayoutNode,
         affectsLookahead: Boolean = true,
@@ -99,9 +95,7 @@
         }
     }
 
-    /**
-     * Observe snapshot reads during measure of [node], executed in [block].
-     */
+    /** Observe snapshot reads during measure of [node], executed in [block]. */
     internal fun observeMeasureSnapshotReads(
         node: LayoutNode,
         affectsLookahead: Boolean = true,
@@ -114,16 +108,13 @@
         }
     }
 
-    internal fun observeSemanticsReads(
-        node: LayoutNode,
-        block: () -> Unit
-    ) {
+    internal fun observeSemanticsReads(node: LayoutNode, block: () -> Unit) {
         observeReads(node, onCommitAffectingSemantics, block)
     }
 
     /**
-     * Observe snapshot reads for any target, allowing consumers to determine how to respond
-     * to state changes.
+     * Observe snapshot reads for any target, allowing consumers to determine how to respond to
+     * state changes.
      */
     internal fun <T : OwnerScope> observeReads(
         target: T,
diff --git a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/node/ParentDataModifierNode.kt b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/node/ParentDataModifierNode.kt
index 03dd713..6f35a2c 100644
--- a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/node/ParentDataModifierNode.kt
+++ b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/node/ParentDataModifierNode.kt
@@ -22,10 +22,10 @@
 import androidx.compose.ui.unit.Density
 
 /**
- * A [Modifier.Node] that provides data to the parent [Layout]. This can be read from within the
- * the [Layout] during measurement and positioning, via [IntrinsicMeasurable.parentData].
- * The parent data is commonly used to inform the parent how the child [Layout] should be measured
- * and positioned.
+ * A [Modifier.Node] that provides data to the parent [Layout]. This can be read from within the the
+ * [Layout] during measurement and positioning, via [IntrinsicMeasurable.parentData]. The parent
+ * data is commonly used to inform the parent how the child [Layout] should be measured and
+ * positioned.
  *
  * This is the [androidx.compose.ui.Modifier.Node] equivalent of
  * [androidx.compose.ui.layout.ParentDataModifier]
diff --git a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/node/PointerInputModifierNode.kt b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/node/PointerInputModifierNode.kt
index 900175e..b4a7c7b 100644
--- a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/node/PointerInputModifierNode.kt
+++ b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/node/PointerInputModifierNode.kt
@@ -25,8 +25,8 @@
 import androidx.compose.ui.unit.IntSize
 
 /**
- * A [androidx.compose.ui.Modifier.Node] that receives [PointerInputChange]s,
- * interprets them, and consumes the aspects of the changes that it is react to such that other
+ * A [androidx.compose.ui.Modifier.Node] that receives [PointerInputChange]s, interprets them, and
+ * consumes the aspects of the changes that it is react to such that other
  * [PointerInputModifierNode]s don't also react to them.
  *
  * This is the [androidx.compose.ui.Modifier.Node] equivalent of
@@ -42,44 +42,39 @@
      * [PointerInputChange.consume].
      *
      * @param pointerEvent The list of [PointerInputChange]s with positions relative to this
-     * [PointerInputModifierNode].
+     *   [PointerInputModifierNode].
      * @param pass The [PointerEventPass] in which this function is being called.
      * @param bounds The width and height associated with this [PointerInputModifierNode].
-     *
      * @see PointerInputChange
      * @see PointerEventPass
      */
-    fun onPointerEvent(
-        pointerEvent: PointerEvent,
-        pass: PointerEventPass,
-        bounds: IntSize
-    )
+    fun onPointerEvent(pointerEvent: PointerEvent, pass: PointerEventPass, bounds: IntSize)
 
     /**
      * Invoked to notify the handler that no more calls to [PointerInputModifierNode] will be made,
-     * until at least new pointers exist.  This can occur for a few reasons:
+     * until at least new pointers exist. This can occur for a few reasons:
      * 1. Android dispatches ACTION_CANCEL to Compose.
      * 2. This [PointerInputModifierNode] is no longer associated with a LayoutNode.
      * 3. This [PointerInputModifierNode]'s associated LayoutNode is no longer in the composition
-     * tree.
+     *    tree.
      */
     fun onCancelPointerInput()
 
     /**
      * Intercept pointer input that children receive even if the pointer is out of bounds.
      *
-     * If `true`, and a child has been moved out of this layout and receives an event, this
-     * will receive that event. If `false`, a child receiving pointer input outside of the
-     * bounds of this layout will not trigger any events in this.
+     * If `true`, and a child has been moved out of this layout and receives an event, this will
+     * receive that event. If `false`, a child receiving pointer input outside of the bounds of this
+     * layout will not trigger any events in this.
      */
     fun interceptOutOfBoundsChildEvents(): Boolean = false
 
     /**
      * If `false`, then this [PointerInputModifierNode] will not allow siblings under it to respond
-     * to events. If `true`, this will have the first chance to respond and the next sibling
-     * under will then get a chance to respond as well. This trigger acts at the Layout
-     * level, so if any [PointerInputModifierNode]s on a Layout has
-     * [sharePointerInputWithSiblings] set to `true` then the Layout will share with siblings.
+     * to events. If `true`, this will have the first chance to respond and the next sibling under
+     * will then get a chance to respond as well. This trigger acts at the Layout level, so if any
+     * [PointerInputModifierNode]s on a Layout has [sharePointerInputWithSiblings] set to `true`
+     * then the Layout will share with siblings.
      */
     fun sharePointerInputWithSiblings(): Boolean = false
 
@@ -87,14 +82,14 @@
      * Invoked when the density (pixels per inch for the screen) changes. This can impact the
      * location of pointer input events (x and y) and can affect things like touch slop detection.
      *
-     * Developers will need to restart the gesture detection handling pointer input in order for
-     * the event locations to remain accurate.
+     * Developers will need to restart the gesture detection handling pointer input in order for the
+     * event locations to remain accurate.
      *
      * The default implementation will do that by calling [onCancelPointerInput].
      *
      * [SuspendingPointerInputModifierNode] offers a more specific interface to allow only
-     * cancelling the coroutine for more control. See [SuspendingPointerInputModifierNodeImpl]
-     * for a concrete example.
+     * cancelling the coroutine for more control. See [SuspendingPointerInputModifierNodeImpl] for a
+     * concrete example.
      */
     fun onDensityChange() {
         onCancelPointerInput()
@@ -102,17 +97,17 @@
 
     /**
      * Invoked when the view configuration (touch slop size, minimum touch target, tap timing)
-     * changes which means the composable UI the pointer input block is tied to has
-     * changed and the new UI might impact the location of pointer input events (x and y).
+     * changes which means the composable UI the pointer input block is tied to has changed and the
+     * new UI might impact the location of pointer input events (x and y).
      *
-     * Developers will need to restart the gesture detection that handles pointer input in order
-     * for the events locations to remain accurate.
+     * Developers will need to restart the gesture detection that handles pointer input in order for
+     * the events locations to remain accurate.
      *
      * The default implementation will do that by calling [onCancelPointerInput].
      *
      * [SuspendingPointerInputModifierNode] offers a more specific interface to allow only
-     * cancelling the coroutine for more control. See [SuspendingPointerInputModifierNodeImpl]
-     * for a concrete example.
+     * cancelling the coroutine for more control. See [SuspendingPointerInputModifierNodeImpl] for a
+     * concrete example.
      */
     fun onViewConfigurationChange() {
         onCancelPointerInput()
diff --git a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/node/Ref.kt b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/node/Ref.kt
index 7fb6b14..a55150e 100644
--- a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/node/Ref.kt
+++ b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/node/Ref.kt
@@ -16,9 +16,7 @@
 
 package androidx.compose.ui.node
 
-/**
- * Value holder general purpose class.
- */
+/** Value holder general purpose class. */
 class Ref<T> {
     var value: T? = null
 }
diff --git a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/node/RootForTest.kt b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/node/RootForTest.kt
index 10048f9..8f41761 100644
--- a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/node/RootForTest.kt
+++ b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/node/RootForTest.kt
@@ -25,25 +25,17 @@
 import androidx.compose.ui.unit.Density
 
 /**
- * The marker interface to be implemented by the root backing the composition.
- * To be used in tests.
+ * The marker interface to be implemented by the root backing the composition. To be used in tests.
  */
 interface RootForTest {
-    /**
-     * Current device density.
-     */
+    /** Current device density. */
     val density: Density
 
-    /**
-     * Semantics owner for this root. Manages all the semantics nodes.
-     */
+    /** Semantics owner for this root. Manages all the semantics nodes. */
     val semanticsOwner: SemanticsOwner
 
-    /**
-     * The service handling text input.
-     */
-    @Deprecated("Use PlatformTextInputModifierNode instead.")
-    val textInputService: TextInputService
+    /** The service handling text input. */
+    @Deprecated("Use PlatformTextInputModifierNode instead.") val textInputService: TextInputService
 
     /**
      * Send this [KeyEvent] to the focused component in this [Owner].
@@ -57,19 +49,17 @@
      *
      * @param enable force enable accessibility if true.
      */
-    @ExperimentalComposeUiApi
-    fun forceAccessibilityForTesting(enable: Boolean) { }
+    @ExperimentalComposeUiApi fun forceAccessibilityForTesting(enable: Boolean) {}
 
     /**
      * Set the time interval between sending accessibility events in milliseconds.
      *
      * This is the delay before dispatching a recurring accessibility event in milliseconds. It
-     * delays the loop that sends events to the accessibility and content capture framework
-     * in batches. A recurring event will be sent at most once during the
-     * [intervalMillis] timeframe. The default time delay is 100 milliseconds.
+     * delays the loop that sends events to the accessibility and content capture framework in
+     * batches. A recurring event will be sent at most once during the [intervalMillis] timeframe.
+     * The default time delay is 100 milliseconds.
      */
-    @ExperimentalComposeUiApi
-    fun setAccessibilityEventBatchIntervalMillis(intervalMillis: Long) { }
+    @ExperimentalComposeUiApi fun setAccessibilityEventBatchIntervalMillis(intervalMillis: Long) {}
 
     /**
      * Requests another layout (measure + placement) pass be performed for any nodes that need it.
@@ -81,6 +71,5 @@
      * fast as possible (i.e. without waiting for the choreographer to schedule them) in order to
      * get to idle, e.g. during a `waitForIdle` call.
      */
-    @ExperimentalComposeUiApi
-    fun measureAndLayoutForTest() {}
+    @ExperimentalComposeUiApi fun measureAndLayoutForTest() {}
 }
diff --git a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/node/SemanticsModifierNode.kt b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/node/SemanticsModifierNode.kt
index 3b50fbd..dd3e2f8 100644
--- a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/node/SemanticsModifierNode.kt
+++ b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/node/SemanticsModifierNode.kt
@@ -28,8 +28,8 @@
 import androidx.compose.ui.semantics.getOrNull
 
 /**
- * A [Modifier.Node] that adds semantics key/value for use in testing,
- * accessibility, and similar use cases.
+ * A [Modifier.Node] that adds semantics key/value for use in testing, accessibility, and similar
+ * use cases.
  *
  * This is the [androidx.compose.ui.Modifier.Node] equivalent of
  * [androidx.compose.ui.semantics.SemanticsModifier]
@@ -38,29 +38,27 @@
     /**
      * Clears the semantics of all the descendant nodes and sets new semantics.
      *
-     * In the merged semantics tree, this clears the semantic information provided
-     * by the node's descendants (but not those of the layout node itself, if any)
-     * In the unmerged tree, the semantics node is marked with
-     * "[SemanticsConfiguration.isClearingSemantics]", but nothing is actually cleared.
+     * In the merged semantics tree, this clears the semantic information provided by the node's
+     * descendants (but not those of the layout node itself, if any) In the unmerged tree, the
+     * semantics node is marked with "[SemanticsConfiguration.isClearingSemantics]", but nothing is
+     * actually cleared.
      *
      * Compose's default semantics provide baseline usability for screen-readers, but this can be
-     * used to provide a more polished screen-reader experience: for example, clearing the
-     * semantics of a group of tiny buttons, and setting equivalent actions on the card
-     * containing them.
+     * used to provide a more polished screen-reader experience: for example, clearing the semantics
+     * of a group of tiny buttons, and setting equivalent actions on the card containing them.
      */
     @get:Suppress("GetterSetterNames")
     val shouldClearDescendantSemantics: Boolean
         get() = false
 
     /**
-     * Whether the semantic information provided by this node and
-     * its descendants should be treated as one logical entity.
-     * Most commonly set on screen-reader-focusable items such as buttons or form fields.
-     * In the merged semantics tree, all descendant nodes (except those themselves marked
-     * [shouldMergeDescendantSemantics]) will disappear from the tree, and their properties
+     * Whether the semantic information provided by this node and its descendants should be treated
+     * as one logical entity. Most commonly set on screen-reader-focusable items such as buttons or
+     * form fields. In the merged semantics tree, all descendant nodes (except those themselves
+     * marked [shouldMergeDescendantSemantics]) will disappear from the tree, and their properties
      * will get merged into the parent's configuration (using a merging algorithm that varies based
-     * on the type of property -- for example, text properties will get concatenated, separated
-     * by commas). In the unmerged semantics tree, the node is simply marked with
+     * on the type of property -- for example, text properties will get concatenated, separated by
+     * commas). In the unmerged semantics tree, the node is simply marked with
      * [SemanticsConfiguration.isMergingSemanticsOfDescendants].
      */
     @get:Suppress("GetterSetterNames")
@@ -71,20 +69,20 @@
      * Add semantics key/value pairs to the layout node, for use in testing, accessibility, etc.
      *
      * The [SemanticsPropertyReceiver] provides "key = value"-style setters for any
-     * [SemanticsPropertyKey]. Additionally, chaining multiple semantics modifiers is
-     * also a supported style.
+     * [SemanticsPropertyKey]. Additionally, chaining multiple semantics modifiers is also a
+     * supported style.
      *
      * The resulting semantics produce two [SemanticsNode] trees:
      *
      * The "unmerged tree" rooted at [SemanticsOwner.unmergedRootSemanticsNode] has one
-     * [SemanticsNode] per layout node which has any [SemanticsModifierNode] on it.  This
-     * [SemanticsNode] contains all the properties set in all the [SemanticsModifierNode]s on
-     * that node.
+     * [SemanticsNode] per layout node which has any [SemanticsModifierNode] on it. This
+     * [SemanticsNode] contains all the properties set in all the [SemanticsModifierNode]s on that
+     * node.
      *
      * The "merged tree" rooted at [SemanticsOwner.rootSemanticsNode] has equal-or-fewer nodes: it
      * simplifies the structure based on [shouldMergeDescendantSemantics] and
-     * [shouldClearDescendantSemantics].  For most purposes (especially accessibility, or the
-     * testing of accessibility), the merged semantics tree should be used.
+     * [shouldClearDescendantSemantics]. For most purposes (especially accessibility, or the testing
+     * of accessibility), the merged semantics tree should be used.
      */
     fun SemanticsPropertyReceiver.applySemantics()
 }
diff --git a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/node/TraversableNode.kt b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/node/TraversableNode.kt
index 5706acb..c9ab864 100644
--- a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/node/TraversableNode.kt
+++ b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/node/TraversableNode.kt
@@ -31,10 +31,10 @@
     companion object {
         /**
          * Tree traversal actions for the traverseDescendantsIf related functions:
-         *  - Continue - continue the traversal
-         *  - SkipSubtreeAndContinue - continue the traversal BUT skip the matching node's subtree
-         *  (this is a rarer case)
-         *  - CancelTraversal - cancels the traversal (returns from function call)
+         * - Continue - continue the traversal
+         * - SkipSubtreeAndContinue - continue the traversal BUT skip the matching node's subtree
+         *   (this is a rarer case)
+         * - CancelTraversal - cancels the traversal (returns from function call)
          *
          * To see examples of all the actions, see TraversableModifierNodeTest. For a return/cancel
          * example specifically, see
@@ -49,12 +49,8 @@
 }
 
 // *********** Nearest Traversable Ancestor methods ***********
-/**
- * Finds the nearest traversable ancestor with a matching [key].
- */
-fun DelegatableNode.findNearestAncestor(
-    key: Any?
-): TraversableNode? {
+/** Finds the nearest traversable ancestor with a matching [key]. */
+fun DelegatableNode.findNearestAncestor(key: Any?): TraversableNode? {
     visitAncestors(Nodes.Traversable) {
         if (key == it.traverseKey) {
             return it
@@ -63,14 +59,11 @@
     return null
 }
 
-/**
- * Finds the nearest ancestor of the same class and key.
- */
+/** Finds the nearest ancestor of the same class and key. */
 fun <T> T.findNearestAncestor(): T? where T : TraversableNode {
     visitAncestors(Nodes.Traversable) {
         if (this.traverseKey == it.traverseKey && areObjectsOfSameType(this, it)) {
-            @Suppress("UNCHECKED_CAST")
-            return it as T
+            @Suppress("UNCHECKED_CAST") return it as T
         }
     }
     return null
@@ -80,21 +73,19 @@
 /**
  * Executes [block] for all ancestors with a matching [key].
  *
- * Note: The parameter [block]'s return boolean value will determine if the traversal will
- * continue (true = continue, false = cancel).
+ * Note: The parameter [block]'s return boolean value will determine if the traversal will continue
+ * (true = continue, false = cancel).
  *
- *  @sample androidx.compose.ui.samples.traverseAncestorsWithKeyDemo
+ * @sample androidx.compose.ui.samples.traverseAncestorsWithKeyDemo
  */
-fun DelegatableNode.traverseAncestors(
-    key: Any?,
-    block: (TraversableNode) -> Boolean
-) {
+fun DelegatableNode.traverseAncestors(key: Any?, block: (TraversableNode) -> Boolean) {
     visitAncestors(Nodes.Traversable) {
-        val continueTraversal = if (key == it.traverseKey) {
-            block(it)
-        } else {
-            true
-        }
+        val continueTraversal =
+            if (key == it.traverseKey) {
+                block(it)
+            } else {
+                true
+            }
         if (!continueTraversal) return
     }
 }
@@ -102,17 +93,16 @@
 /**
  * Executes [block] for all ancestors of the same class and key.
  *
- * Note: The parameter [block]'s return boolean value will determine if the traversal will
- * continue (true = continue, false = cancel).
+ * Note: The parameter [block]'s return boolean value will determine if the traversal will continue
+ * (true = continue, false = cancel).
  *
- *  @sample androidx.compose.ui.samples.traverseAncestorsDemo
+ * @sample androidx.compose.ui.samples.traverseAncestorsDemo
  */
 fun <T> T.traverseAncestors(block: (T) -> Boolean) where T : TraversableNode {
     visitAncestors(Nodes.Traversable) {
         val continueTraversal =
             if (this.traverseKey == it.traverseKey && areObjectsOfSameType(this, it)) {
-                @Suppress("UNCHECKED_CAST")
-                block(it as T)
+                @Suppress("UNCHECKED_CAST") block(it as T)
             } else {
                 true
             }
@@ -129,18 +119,16 @@
  * Note 2: The parameter [block]'s return boolean value will determine if the traversal will
  * continue (true = continue, false = cancel).
  *
- *  @sample androidx.compose.ui.samples.traverseChildrenWithKeyDemo
+ * @sample androidx.compose.ui.samples.traverseChildrenWithKeyDemo
  */
-fun DelegatableNode.traverseChildren(
-    key: Any?,
-    block: (TraversableNode) -> Boolean
-) {
+fun DelegatableNode.traverseChildren(key: Any?, block: (TraversableNode) -> Boolean) {
     visitChildren(Nodes.Traversable) {
-        val continueTraversal = if (key == it.traverseKey) {
-            block(it)
-        } else {
-            true
-        }
+        val continueTraversal =
+            if (key == it.traverseKey) {
+                block(it)
+            } else {
+                true
+            }
         if (!continueTraversal) return
     }
 }
@@ -153,14 +141,13 @@
  * Note 2: The parameter [block]'s return boolean value will determine if the traversal will
  * continue (true = continue, false = cancel).
  *
- *  @sample androidx.compose.ui.samples.traverseChildrenDemo
+ * @sample androidx.compose.ui.samples.traverseChildrenDemo
  */
 fun <T> T.traverseChildren(block: (T) -> Boolean) where T : TraversableNode {
     visitChildren(Nodes.Traversable) {
         val continueTraversal =
             if (this.traverseKey == it.traverseKey && areObjectsOfSameType(this, it)) {
-                @Suppress("UNCHECKED_CAST")
-                block(it as T)
+                @Suppress("UNCHECKED_CAST") block(it as T)
             } else {
                 true
             }
@@ -178,18 +165,19 @@
  * Note 2: The parameter [block]'s return value [TraverseDescendantsAction] will determine the next
  * step in the traversal.
  *
- *  @sample androidx.compose.ui.samples.traverseDescendantsWithKeyDemo
+ * @sample androidx.compose.ui.samples.traverseDescendantsWithKeyDemo
  */
 fun DelegatableNode.traverseDescendants(
     key: Any?,
     block: (TraversableNode) -> TraverseDescendantsAction
 ) {
     visitSubtreeIf(Nodes.Traversable) {
-        val action = if (key == it.traverseKey) {
-            block(it)
-        } else {
-            TraverseDescendantsAction.ContinueTraversal
-        }
+        val action =
+            if (key == it.traverseKey) {
+                block(it)
+            } else {
+                TraverseDescendantsAction.ContinueTraversal
+            }
         if (action == TraverseDescendantsAction.CancelTraversal) return
 
         // visitSubtreeIf() requires a true to continue down the subtree and a false if you
@@ -202,20 +190,19 @@
 /**
  * Conditionally executes [block] for each descendant of the same class.
  *
- * Note 1: For nodes that do not have the same key, it will continue to execute the [block] for
- * the descendants below that non-matching node (where there may be a node that matches).
+ * Note 1: For nodes that do not have the same key, it will continue to execute the [block] for the
+ * descendants below that non-matching node (where there may be a node that matches).
  *
- * Note 2: The parameter [block]'s return value [TraverseDescendantsAction] will determine the
- * next step in the traversal.
+ * Note 2: The parameter [block]'s return value [TraverseDescendantsAction] will determine the next
+ * step in the traversal.
  *
- *  @sample androidx.compose.ui.samples.traverseDescendantsDemo
+ * @sample androidx.compose.ui.samples.traverseDescendantsDemo
  */
 fun <T> T.traverseDescendants(block: (T) -> TraverseDescendantsAction) where T : TraversableNode {
     visitSubtreeIf(Nodes.Traversable) {
         val action =
             if (this.traverseKey == it.traverseKey && areObjectsOfSameType(this, it)) {
-                @Suppress("UNCHECKED_CAST")
-                block(it as T)
+                @Suppress("UNCHECKED_CAST") block(it as T)
             } else {
                 TraverseDescendantsAction.ContinueTraversal
             }
diff --git a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/node/TreeSet.kt b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/node/TreeSet.kt
index c717323..1f106db 100644
--- a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/node/TreeSet.kt
+++ b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/node/TreeSet.kt
@@ -18,8 +18,12 @@
 
 internal expect class TreeSet<E>(comparator: Comparator<in E>) {
     fun add(element: E): Boolean
+
     fun remove(element: E): Boolean
+
     fun first(): E
+
     fun contains(element: E): Boolean
+
     fun isEmpty(): Boolean
 }
diff --git a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/platform/AccessibilityManager.kt b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/platform/AccessibilityManager.kt
index 2c64953..1194941 100644
--- a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/platform/AccessibilityManager.kt
+++ b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/platform/AccessibilityManager.kt
@@ -18,26 +18,26 @@
 
 import androidx.compose.ui.internal.JvmDefaultWithCompatibility
 
-/**
- * Interface for managing accessibility.
- */
+/** Interface for managing accessibility. */
 @JvmDefaultWithCompatibility
 interface AccessibilityManager {
 
     /**
      * Calculate the recommended timeout for changes to the UI needed by this user. Controls should
      * remain on the screen for at least this long to give users time to react. Some users may need
-     * extra time to review the controls, or to reach them, or to activate assistive technology
-     * to activate the controls automatically.
+     * extra time to review the controls, or to reach them, or to activate assistive technology to
+     * activate the controls automatically.
+     *
      * <p>
-     * Use the boolean parameters to indicate contents of UI. For example, set [containsIcons]
-     * and [containsText] to true for message notification which contains icons and text, or set
+     * Use the boolean parameters to indicate contents of UI. For example, set [containsIcons] and
+     * [containsText] to true for message notification which contains icons and text, or set
      * [containsText] and [containsControls] to true for button dialog which contains text and
      * button controls.
+     *
      * <p/>
      *
-     * @param originalTimeoutMillis The timeout appropriate for users with no accessibility needs
-     * in milliseconds.
+     * @param originalTimeoutMillis The timeout appropriate for users with no accessibility needs in
+     *   milliseconds.
      * @param containsIcons The contents of UI contain icons.
      * @param containsText The contents of UI contain text.
      * @param containsControls The contents of UI contain controls.
diff --git a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/platform/AtomicInt.kt b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/platform/AtomicInt.kt
index 85057e0..bdfde87 100644
--- a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/platform/AtomicInt.kt
+++ b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/platform/AtomicInt.kt
@@ -18,5 +18,6 @@
 
 internal expect class AtomicInt(value: Int) {
     fun addAndGet(delta: Int): Int
+
     fun compareAndSet(expected: Int, new: Int): Boolean
 }
diff --git a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/platform/ClipboardManager.kt b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/platform/ClipboardManager.kt
index 265d070..43d63f2 100644
--- a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/platform/ClipboardManager.kt
+++ b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/platform/ClipboardManager.kt
@@ -18,30 +18,24 @@
 
 import androidx.compose.ui.text.AnnotatedString
 
-/**
- * Interface for managing the Clipboard.
- */
+/** Interface for managing the Clipboard. */
 interface ClipboardManager {
     /**
      * This method put the text into the Clipboard.
      *
      * @param annotatedString The [AnnotatedString] to be put into Clipboard.
      */
-    @Suppress("GetterSetterNames")
-    fun setText(annotatedString: AnnotatedString)
+    @Suppress("GetterSetterNames") fun setText(annotatedString: AnnotatedString)
 
     /**
      * This method get the text from the Clipboard.
      *
-     * @return The text in the Clipboard.
-     * It could be null due to 2 reasons: 1. Clipboard is empty; 2. Cannot convert the
-     * [CharSequence] text in Clipboard to [AnnotatedString].
+     * @return The text in the Clipboard. It could be null due to 2 reasons: 1. Clipboard is
+     *   empty; 2. Cannot convert the [CharSequence] text in Clipboard to [AnnotatedString].
      */
     fun getText(): AnnotatedString?
 
-    /**
-     * This method returns true if there is a text in the Clipboard, false otherwise.
-     */
+    /** This method returns true if there is a text in the Clipboard, false otherwise. */
     fun hasText(): Boolean = getText()?.isNotEmpty() == true
 
     /**
@@ -59,16 +53,15 @@
      * Puts the given [clipEntry] in platform's ClipboardManager.
      *
      * @param clipEntry Platform specific clip object that either holds data or links to it. Pass
-     * null to clear the clipboard.
+     *   null to clear the clipboard.
      */
-    @Suppress("GetterSetterNames")
-    fun setClip(clipEntry: ClipEntry?) = Unit
+    @Suppress("GetterSetterNames") fun setClip(clipEntry: ClipEntry?) = Unit
 
     /**
      * Returns the native clipboard that exposes the full functionality of platform clipboard.
      *
      * @throws UnsupportedOperationException If the current platform does not offer a native
-     * Clipboard interface.
+     *   Clipboard interface.
      */
     val nativeClipboard: NativeClipboard
         get() {
@@ -76,9 +69,7 @@
         }
 }
 
-/**
- * Platform specific protocol that expresses an item in the native Clipboard.
- */
+/** Platform specific protocol that expresses an item in the native Clipboard. */
 expect class ClipEntry {
 
     /**
@@ -92,12 +83,10 @@
 }
 
 /**
- * Platform specific protocol that describes an item in the native Clipboard. This object should
- * not contain any actual piece of data.
+ * Platform specific protocol that describes an item in the native Clipboard. This object should not
+ * contain any actual piece of data.
  */
 expect class ClipMetadata
 
-/**
- * Native Clipboard specific to each platform.
- */
+/** Native Clipboard specific to each platform. */
 expect class NativeClipboard
diff --git a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/platform/CompositionLocals.kt b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/platform/CompositionLocals.kt
index e57bc42..cf81520 100644
--- a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/platform/CompositionLocals.kt
+++ b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/platform/CompositionLocals.kt
@@ -42,14 +42,12 @@
 import androidx.compose.ui.unit.Density
 import androidx.compose.ui.unit.LayoutDirection
 
-/**
- * The CompositionLocal to provide communication with platform accessibility service.
- */
+/** The CompositionLocal to provide communication with platform accessibility service. */
 val LocalAccessibilityManager = staticCompositionLocalOf<AccessibilityManager?> { null }
 
 /**
- * The CompositionLocal that can be used to trigger autofill actions.
- * Eg. [Autofill.requestAutofillForNode].
+ * The CompositionLocal that can be used to trigger autofill actions. Eg.
+ * [Autofill.requestAutofillForNode].
  */
 @Suppress("OPT_IN_MARKER_ON_WRONG_TARGET")
 @get:ExperimentalComposeUiApi
@@ -57,24 +55,19 @@
 val LocalAutofill = staticCompositionLocalOf<Autofill?> { null }
 
 /**
- * The CompositionLocal that can be used to add
- * [AutofillNode][import androidx.compose.ui.autofill.AutofillNode]s to the autofill tree. The
- * [AutofillTree] is a temporary data structure that will be replaced by Autofill Semantics
- * (b/138604305).
+ * The CompositionLocal that can be used to add [AutofillNode][import
+ * androidx.compose.ui.autofill.AutofillNode]s to the autofill tree. The [AutofillTree] is a
+ * temporary data structure that will be replaced by Autofill Semantics (b/138604305).
  */
 @Suppress("OPT_IN_MARKER_ON_WRONG_TARGET")
 @get:ExperimentalComposeUiApi
 @ExperimentalComposeUiApi
-val LocalAutofillTree = staticCompositionLocalOf<AutofillTree> {
-    noLocalProvidedFor("LocalAutofillTree")
-}
+val LocalAutofillTree =
+    staticCompositionLocalOf<AutofillTree> { noLocalProvidedFor("LocalAutofillTree") }
 
-/**
- * The CompositionLocal to provide communication with platform clipboard service.
- */
-val LocalClipboardManager = staticCompositionLocalOf<ClipboardManager> {
-    noLocalProvidedFor("LocalClipboardManager")
-}
+/** The CompositionLocal to provide communication with platform clipboard service. */
+val LocalClipboardManager =
+    staticCompositionLocalOf<ClipboardManager> { noLocalProvidedFor("LocalClipboardManager") }
 
 /**
  * The CompositionLocal to provide access to a [GraphicsContext] instance for creation of
@@ -86,73 +79,52 @@
  * It is recommended that consumers invoke [rememberGraphicsLayer] instead to ensure that a
  * [GraphicsLayer] is released when the corresponding composable is disposed.
  */
-val LocalGraphicsContext = staticCompositionLocalOf<GraphicsContext> {
-    noLocalProvidedFor("LocalGraphicsContext")
-}
+val LocalGraphicsContext =
+    staticCompositionLocalOf<GraphicsContext> { noLocalProvidedFor("LocalGraphicsContext") }
 
 /**
- * Provides the [Density] to be used to transform between [density-independent pixel
- * units (DP)][androidx.compose.ui.unit.Dp] and pixel units or
- * [scale-independent pixel units (SP)][androidx.compose.ui.unit.TextUnit] and
- * pixel units. This is typically used when a
- * [DP][androidx.compose.ui.unit.Dp] is provided and it must be converted in the body of
- * [Layout] or [DrawModifier].
+ * Provides the [Density] to be used to transform between
+ * [density-independent pixel units (DP)][androidx.compose.ui.unit.Dp] and pixel units or
+ * [scale-independent pixel units (SP)][androidx.compose.ui.unit.TextUnit] and pixel units. This is
+ * typically used when a [DP][androidx.compose.ui.unit.Dp] is provided and it must be converted in
+ * the body of [Layout] or [DrawModifier].
  */
-val LocalDensity = staticCompositionLocalOf<Density> {
-    noLocalProvidedFor("LocalDensity")
-}
+val LocalDensity = staticCompositionLocalOf<Density> { noLocalProvidedFor("LocalDensity") }
 
-/**
- * The CompositionLocal that can be used to control focus within Compose.
- */
-val LocalFocusManager = staticCompositionLocalOf<FocusManager> {
-    noLocalProvidedFor("LocalFocusManager")
-}
+/** The CompositionLocal that can be used to control focus within Compose. */
+val LocalFocusManager =
+    staticCompositionLocalOf<FocusManager> { noLocalProvidedFor("LocalFocusManager") }
 
-/**
- * The CompositionLocal to provide platform font loading methods.
- */
+/** The CompositionLocal to provide platform font loading methods. */
 @Suppress("DEPRECATION")
-@Deprecated("LocalFontLoader is replaced with LocalFontFamilyResolver",
+@Deprecated(
+    "LocalFontLoader is replaced with LocalFontFamilyResolver",
     replaceWith = ReplaceWith("LocalFontFamilyResolver")
 )
 @get:RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
-val LocalFontLoader = staticCompositionLocalOf<Font.ResourceLoader> {
-    noLocalProvidedFor("LocalFontLoader")
-}
+val LocalFontLoader =
+    staticCompositionLocalOf<Font.ResourceLoader> { noLocalProvidedFor("LocalFontLoader") }
+
+/** The CompositionLocal for compose font resolution from FontFamily. */
+val LocalFontFamilyResolver =
+    staticCompositionLocalOf<FontFamily.Resolver> { noLocalProvidedFor("LocalFontFamilyResolver") }
+
+/** The CompositionLocal to provide haptic feedback to the user. */
+val LocalHapticFeedback =
+    staticCompositionLocalOf<HapticFeedback> { noLocalProvidedFor("LocalHapticFeedback") }
 
 /**
- * The CompositionLocal for compose font resolution from FontFamily.
+ * The CompositionLocal to provide an instance of InputModeManager which controls the current input
+ * mode.
  */
-val LocalFontFamilyResolver = staticCompositionLocalOf<FontFamily.Resolver> {
-    noLocalProvidedFor("LocalFontFamilyResolver")
-}
+val LocalInputModeManager =
+    staticCompositionLocalOf<InputModeManager> { noLocalProvidedFor("LocalInputManager") }
 
-/**
- * The CompositionLocal to provide haptic feedback to the user.
- */
-val LocalHapticFeedback = staticCompositionLocalOf<HapticFeedback> {
-    noLocalProvidedFor("LocalHapticFeedback")
-}
+/** The CompositionLocal to provide the layout direction. */
+val LocalLayoutDirection =
+    staticCompositionLocalOf<LayoutDirection> { noLocalProvidedFor("LocalLayoutDirection") }
 
-/**
- * The CompositionLocal to provide an instance of InputModeManager which controls the current
- * input mode.
- */
-val LocalInputModeManager = staticCompositionLocalOf<InputModeManager> {
-    noLocalProvidedFor("LocalInputManager")
-}
-
-/**
- * The CompositionLocal to provide the layout direction.
- */
-val LocalLayoutDirection = staticCompositionLocalOf<LayoutDirection> {
-    noLocalProvidedFor("LocalLayoutDirection")
-}
-
-/**
- * The CompositionLocal to provide communication with platform text input service.
- */
+/** The CompositionLocal to provide communication with platform text input service. */
 @Deprecated("Use PlatformTextInputModifierNode instead.")
 val LocalTextInputService = staticCompositionLocalOf<TextInputService?> { null }
 
@@ -164,37 +136,23 @@
  */
 val LocalSoftwareKeyboardController = staticCompositionLocalOf<SoftwareKeyboardController?> { null }
 
-/**
- * The CompositionLocal to provide text-related toolbar.
- */
-val LocalTextToolbar = staticCompositionLocalOf<TextToolbar> {
-    noLocalProvidedFor("LocalTextToolbar")
-}
+/** The CompositionLocal to provide text-related toolbar. */
+val LocalTextToolbar =
+    staticCompositionLocalOf<TextToolbar> { noLocalProvidedFor("LocalTextToolbar") }
 
-/**
- * The CompositionLocal to provide functionality related to URL, e.g. open URI.
- */
-val LocalUriHandler = staticCompositionLocalOf<UriHandler> {
-    noLocalProvidedFor("LocalUriHandler")
-}
+/** The CompositionLocal to provide functionality related to URL, e.g. open URI. */
+val LocalUriHandler = staticCompositionLocalOf<UriHandler> { noLocalProvidedFor("LocalUriHandler") }
 
-/**
- * The CompositionLocal that provides the ViewConfiguration.
- */
-val LocalViewConfiguration = staticCompositionLocalOf<ViewConfiguration> {
-    noLocalProvidedFor("LocalViewConfiguration")
-}
+/** The CompositionLocal that provides the ViewConfiguration. */
+val LocalViewConfiguration =
+    staticCompositionLocalOf<ViewConfiguration> { noLocalProvidedFor("LocalViewConfiguration") }
 
 /**
  * The CompositionLocal that provides information about the window that hosts the current [Owner].
  */
-val LocalWindowInfo = staticCompositionLocalOf<WindowInfo> {
-    noLocalProvidedFor("LocalWindowInfo")
-}
+val LocalWindowInfo = staticCompositionLocalOf<WindowInfo> { noLocalProvidedFor("LocalWindowInfo") }
 
-internal val LocalPointerIconService = staticCompositionLocalOf<PointerIconService?> {
-    null
-}
+internal val LocalPointerIconService = staticCompositionLocalOf<PointerIconService?> { null }
 
 /** @see LocalScrollCaptureInProgress */
 internal val LocalProvidableScrollCaptureInProgress = compositionLocalOf { false }
@@ -220,8 +178,8 @@
         LocalClipboardManager provides owner.clipboardManager,
         LocalDensity provides owner.density,
         LocalFocusManager provides owner.focusOwner,
-        @Suppress("DEPRECATION") LocalFontLoader
-            providesDefault @Suppress("DEPRECATION") owner.fontLoader,
+        @Suppress("DEPRECATION") LocalFontLoader providesDefault
+            @Suppress("DEPRECATION") owner.fontLoader,
         LocalFontFamilyResolver providesDefault owner.fontFamilyResolver,
         LocalHapticFeedback provides owner.hapticFeedBack,
         LocalInputModeManager provides owner.inputModeManager,
diff --git a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/platform/InfiniteAnimationPolicy.kt b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/platform/InfiniteAnimationPolicy.kt
index e497bd2..92ba360 100644
--- a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/platform/InfiniteAnimationPolicy.kt
+++ b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/platform/InfiniteAnimationPolicy.kt
@@ -36,16 +36,17 @@
 interface InfiniteAnimationPolicy : CoroutineContext.Element {
     /**
      * Call this to apply the policy on the given suspending [block]. Execution of the block is
-     * determined by the policy implementation. For example, a test policy could decide not to
-     * run the block, or trace its execution.
+     * determined by the policy implementation. For example, a test policy could decide not to run
+     * the block, or trace its execution.
      *
      * The block is intended to be part of and will therefore be treated as an infinite animation,
-     * one that after returning from [onInfiniteOperation] will call it again. If the block is
-     * not part of an infinite animation, the policy will still be applied.
+     * one that after returning from [onInfiniteOperation] will call it again. If the block is not
+     * part of an infinite animation, the policy will still be applied.
      */
     suspend fun <R> onInfiniteOperation(block: suspend () -> R): R
 
-    override val key: CoroutineContext.Key<*> get() = Key
+    override val key: CoroutineContext.Key<*>
+        get() = Key
 
     companion object Key : CoroutineContext.Key<InfiniteAnimationPolicy>
 }
diff --git a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/platform/InspectableValue.kt b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/platform/InspectableValue.kt
index 970de2b..b9c8b47 100644
--- a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/platform/InspectableValue.kt
+++ b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/platform/InspectableValue.kt
@@ -19,88 +19,63 @@
 import androidx.compose.ui.Modifier
 import androidx.compose.ui.internal.JvmDefaultWithCompatibility
 
-/**
- * An empty [InspectorInfo] DSL.
- */
+/** An empty [InspectorInfo] DSL. */
 val NoInspectorInfo: InspectorInfo.() -> Unit = {}
 
-/**
- * Turn on inspector debug information. Used internally during inspection.
- */
+/** Turn on inspector debug information. Used internally during inspection. */
 var isDebugInspectorInfoEnabled = false
 
-/**
- * A compose value that is inspectable by tools. It gives access to private parts of a value.
- */
+/** A compose value that is inspectable by tools. It gives access to private parts of a value. */
 @JvmDefaultWithCompatibility
 interface InspectableValue {
 
-    /**
-     * The elements of a compose value.
-     */
+    /** The elements of a compose value. */
     val inspectableElements: Sequence<ValueElement>
         get() = emptySequence()
 
     /**
      * Use this name as the reference name shown in tools of this value if there is no explicit
-     * reference name given to the value.
-     * Example: a modifier in a modifier list.
+     * reference name given to the value. Example: a modifier in a modifier list.
      */
     val nameFallback: String?
         get() = null
 
-    /**
-     * Use this value as a readable representation of the value.
-     */
+    /** Use this value as a readable representation of the value. */
     val valueOverride: Any?
         get() = null
 }
 
 /**
- * A [ValueElement] describes an element of a compose value instance.
- * The [name] typically refers to a (possibly private) property name with its corresponding [value].
+ * A [ValueElement] describes an element of a compose value instance. The [name] typically refers to
+ * a (possibly private) property name with its corresponding [value].
  */
 data class ValueElement(val name: String, val value: Any?)
 
-/**
- * A builder for an [InspectableValue].
- */
+/** A builder for an [InspectableValue]. */
 class InspectorInfo {
-    /**
-     * Provides a [InspectableValue.nameFallback].
-     */
+    /** Provides a [InspectableValue.nameFallback]. */
     var name: String? = null
 
-    /**
-     * Provides a [InspectableValue.valueOverride].
-     */
+    /** Provides a [InspectableValue.valueOverride]. */
     var value: Any? = null
 
-    /**
-     * Provides a [InspectableValue.inspectableElements].
-     */
+    /** Provides a [InspectableValue.inspectableElements]. */
     val properties = ValueElementSequence()
 }
 
-/**
- * A builder for a sequence of [ValueElement].
- */
+/** A builder for a sequence of [ValueElement]. */
 class ValueElementSequence : Sequence<ValueElement> {
     private val elements = mutableListOf<ValueElement>()
 
     override fun iterator(): Iterator<ValueElement> = elements.iterator()
 
-    /**
-     * Specify a sub element with name and value.
-     */
+    /** Specify a sub element with name and value. */
     operator fun set(name: String, value: Any?) {
         elements.add(ValueElement(name, value))
     }
 }
 
-/**
- * Implementation of [InspectableValue] based on a builder [InspectorInfo] DSL.
- */
+/** Implementation of [InspectableValue] based on a builder [InspectorInfo] DSL. */
 abstract class InspectorValueInfo(private val info: InspectorInfo.() -> Unit) : InspectableValue {
     private var _values: InspectorInfo? = null
 
@@ -124,8 +99,8 @@
 /**
  * Use this to specify modifier information for compose tooling.
  *
- * This factory method allows the specified information to be stripped out by ProGuard in
- * release builds.
+ * This factory method allows the specified information to be stripped out by ProGuard in release
+ * builds.
  *
  * @sample androidx.compose.ui.samples.InspectableModifierSample
  */
@@ -153,9 +128,7 @@
     factory: Modifier.() -> Modifier
 ): Modifier = inspectableWrapper(inspectorInfo, factory(Modifier))
 
-/**
- * Do not use this explicitly. Instead use [Modifier.inspectable].
- */
+/** Do not use this explicitly. Instead use [Modifier.inspectable]. */
 @PublishedApi
 internal fun Modifier.inspectableWrapper(
     inspectorInfo: InspectorInfo.() -> Unit,
@@ -165,12 +138,9 @@
     return then(begin).then(wrapped).then(begin.end)
 }
 
-/**
- * Annotates a range of modifiers in a chain with inspector metadata.
- */
-class InspectableModifier(
-    inspectorInfo: InspectorInfo.() -> Unit
-) : Modifier.Element, InspectorValueInfo(inspectorInfo) {
+/** Annotates a range of modifiers in a chain with inspector metadata. */
+class InspectableModifier(inspectorInfo: InspectorInfo.() -> Unit) :
+    Modifier.Element, InspectorValueInfo(inspectorInfo) {
     inner class End : Modifier.Element
 
     val end = End()
diff --git a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/platform/InvertMatrix.kt b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/platform/InvertMatrix.kt
index 8f0153c..b2e44e7 100644
--- a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/platform/InvertMatrix.kt
+++ b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/platform/InvertMatrix.kt
@@ -19,8 +19,8 @@
 import androidx.compose.ui.graphics.Matrix
 
 /**
- * Sets [other] to be the inverse of this. Returns `true` if the inverse worked or `false`
- * if it failed.
+ * Sets [other] to be the inverse of this. Returns `true` if the inverse worked or `false` if it
+ * failed.
  */
 internal fun Matrix.invertTo(other: Matrix): Boolean {
     val a00 = this[0, 0]
@@ -51,8 +51,7 @@
     val b09 = a21 * a32 - a22 * a31
     val b10 = a21 * a33 - a23 * a31
     val b11 = a22 * a33 - a23 * a32
-    val det =
-        (b00 * b11 - b01 * b10 + b02 * b09 + b03 * b08 - b04 * b07 + b05 * b06)
+    val det = (b00 * b11 - b01 * b10 + b02 * b09 + b03 * b08 - b04 * b07 + b05 * b06)
     if (det == 0.0f) {
         return false
     }
diff --git a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/platform/PlatformTextInputModifierNode.kt b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/platform/PlatformTextInputModifierNode.kt
index 0b34c12..840b5e4 100644
--- a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/platform/PlatformTextInputModifierNode.kt
+++ b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/platform/PlatformTextInputModifierNode.kt
@@ -44,9 +44,7 @@
  */
 interface PlatformTextInputModifierNode : DelegatableNode
 
-/**
- * Receiver type for [establishTextInputSession].
- */
+/** Receiver type for [establishTextInputSession]. */
 expect interface PlatformTextInputSession {
     /**
      * Starts the text input session and suspends until it is closed.
@@ -58,7 +56,7 @@
      * different [establishTextInputSession]s, will restart the session each time.
      *
      * @param request The platform-specific [PlatformTextInputMethodRequest] that will be used to
-     * initiate the session.
+     *   initiate the session.
      */
     suspend fun startInputMethod(request: PlatformTextInputMethodRequest): Nothing
 }
@@ -72,9 +70,7 @@
  */
 interface PlatformTextInputSessionScope : PlatformTextInputSession, CoroutineScope
 
-/**
- * Single-function interface passed to [InterceptPlatformTextInput].
- */
+/** Single-function interface passed to [InterceptPlatformTextInput]. */
 @ExperimentalComposeUiApi
 fun interface PlatformTextInputInterceptor {
 
@@ -113,11 +109,11 @@
  * cancellation tasks (e.g. `finally` blocks) before running the new [block] function.
  *
  * The session will be closed when:
- *  - The session function throws an exception.
- *  - The requesting coroutine is cancelled.
- *  - Another session is started via this method, either from the same modifier or a different one.
- *  - The system closes the connection (currently only supported on Android, and there only
- *    depending on OS version).
+ * - The session function throws an exception.
+ * - The requesting coroutine is cancelled.
+ * - Another session is started via this method, either from the same modifier or a different one.
+ * - The system closes the connection (currently only supported on Android, and there only depending
+ *   on OS version).
  *
  * This function should only be called from the modifier node's
  * [coroutineScope][Modifier.Node.coroutineScope]. If it is not, the session will _not_
@@ -126,16 +122,15 @@
  * @sample androidx.compose.ui.samples.platformTextInputModifierNodeSample
  *
  * @param block A suspend function that will be called when the session is started and that must
- * call [PlatformTextInputSession.startInputMethod] to actually show and initiate the connection
- * with the input method.
+ *   call [PlatformTextInputSession.startInputMethod] to actually show and initiate the connection
+ *   with the input method.
  */
 suspend fun PlatformTextInputModifierNode.establishTextInputSession(
     block: suspend PlatformTextInputSessionScope.() -> Nothing
 ): Nothing {
     require(node.isAttached) { "establishTextInputSession called from an unattached node" }
     val owner = requireOwner()
-    val handler =
-        requireLayoutNode().compositionLocalMap[LocalChainedPlatformTextInputInterceptor]
+    val handler = requireLayoutNode().compositionLocalMap[LocalChainedPlatformTextInputInterceptor]
     owner.interceptedTextInputSession(handler, block)
 }
 
@@ -143,12 +138,13 @@
  * Intercept all calls to [PlatformTextInputSession.startInputMethod] from below where this
  * composition local is provided with the given [PlatformTextInputInterceptor].
  *
- * If a different interceptor instance is passed between compositions while a text input session
- * is active, the upstream session will be torn down and restarted with the new interceptor. The
+ * If a different interceptor instance is passed between compositions while a text input session is
+ * active, the upstream session will be torn down and restarted with the new interceptor. The
  * downstream session (i.e. the call to [PlatformTextInputSession.startInputMethod]) will _not_ be
  * cancelled and the request will be re-used to pass to the new interceptor.
  *
  * @sample androidx.compose.ui.samples.InterceptPlatformTextInputSample
+ *
  * @sample androidx.compose.ui.samples.disableSoftKeyboardSample
  */
 @ExperimentalComposeUiApi
@@ -162,9 +158,8 @@
     // The only way the parent can change is if the entire subtree of the composition is moved,
     // which means the PlatformTextInputModifierNode would be detached/reattached, and the node
     // should cancel its input session when it's detached.
-    val chainedInterceptor = remember(parent) {
-        ChainedPlatformTextInputInterceptor(interceptor, parent)
-    }
+    val chainedInterceptor =
+        remember(parent) { ChainedPlatformTextInputInterceptor(interceptor, parent) }
 
     // If the interceptor changes while an input session is active, the upstream session will be
     // restarted and the downstream one will not be cancelled.
@@ -179,9 +174,7 @@
 private val LocalChainedPlatformTextInputInterceptor =
     staticCompositionLocalOf<ChainedPlatformTextInputInterceptor?> { null }
 
-/**
- * Establishes a new text input session, optionally intercepted by [chainedInterceptor].
- */
+/** Establishes a new text input session, optionally intercepted by [chainedInterceptor]. */
 private suspend fun Owner.interceptedTextInputSession(
     chainedInterceptor: ChainedPlatformTextInputInterceptor?,
     session: suspend PlatformTextInputSessionScope.() -> Nothing
@@ -227,24 +220,30 @@
             val inputMethodMutex = SessionMutex<Unit>()
 
             // Impl by delegation for platform-specific stuff.
-            val scope = object : PlatformTextInputSessionScope by parentSession {
-                override suspend fun startInputMethod(
-                    request: PlatformTextInputMethodRequest
-                ): Nothing {
-                    // Explicitly synchronize between calls to our startInputMethod.
-                    inputMethodMutex.withSessionCancellingPrevious<Nothing>(
-                        sessionInitializer = {},
-                        session = {
-                            // Restart the upstream session if the interceptor is changed while the
-                            // session is active.
-                            snapshotFlow { interceptor }.collectLatest { interceptor ->
-                                interceptor.interceptStartInputMethod(request, parentSession)
+            val scope =
+                object : PlatformTextInputSessionScope by parentSession {
+                    override suspend fun startInputMethod(
+                        request: PlatformTextInputMethodRequest
+                    ): Nothing {
+                        // Explicitly synchronize between calls to our startInputMethod.
+                        inputMethodMutex.withSessionCancellingPrevious<Nothing>(
+                            sessionInitializer = {},
+                            session = {
+                                // Restart the upstream session if the interceptor is changed while
+                                // the
+                                // session is active.
+                                snapshotFlow { interceptor }
+                                    .collectLatest { interceptor ->
+                                        interceptor.interceptStartInputMethod(
+                                            request,
+                                            parentSession
+                                        )
+                                    }
+                                error("Interceptors flow should never terminate.")
                             }
-                            error("Interceptors flow should never terminate.")
-                        }
-                    )
+                        )
+                    }
                 }
-            }
             session.invoke(scope)
         }
     }
diff --git a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/platform/ShapeContainingUtil.kt b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/platform/ShapeContainingUtil.kt
index eebf652..368d561 100644
--- a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/platform/ShapeContainingUtil.kt
+++ b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/platform/ShapeContainingUtil.kt
@@ -26,8 +26,8 @@
 /**
  * Returns `true` if ([x], [y]) is within [outline]. For some outlines that don't require a [Path],
  * the exact point is used to calculate whether the point is inside [outline]. When a [Path] is
- * required, a 0.01 x 0.01 box around ([x], [y]) is used to intersect with the path to determine
- * the result.
+ * required, a 0.01 x 0.01 box around ([x], [y]) is used to intersect with the path to determine the
+ * result.
  *
  * The [tmpTouchPointPath] and [tmpOpPath] are temporary Paths that are cleared after use and will
  * be used in the calculation of the intersection. These must be empty when passed as parameters or
@@ -39,18 +39,17 @@
     y: Float,
     tmpTouchPointPath: Path? = null,
     tmpOpPath: Path? = null
-): Boolean = when (outline) {
-    is Outline.Rectangle -> isInRectangle(outline.rect, x, y)
-    is Outline.Rounded -> isInRoundedRect(outline, x, y, tmpTouchPointPath, tmpOpPath)
-    is Outline.Generic -> isInPath(outline.path, x, y, tmpTouchPointPath, tmpOpPath)
-}
+): Boolean =
+    when (outline) {
+        is Outline.Rectangle -> isInRectangle(outline.rect, x, y)
+        is Outline.Rounded -> isInRoundedRect(outline, x, y, tmpTouchPointPath, tmpOpPath)
+        is Outline.Generic -> isInPath(outline.path, x, y, tmpTouchPointPath, tmpOpPath)
+    }
 
 private fun isInRectangle(rect: Rect, x: Float, y: Float) =
     rect.left <= x && x < rect.right && rect.top <= y && y < rect.bottom
 
-/**
- * Returns `true` if ([x], [y]) is within [outline].
- */
+/** Returns `true` if ([x], [y]) is within [outline]. */
 private fun isInRoundedRect(
     outline: Outline.Rounded,
     x: Float,
@@ -104,13 +103,14 @@
 }
 
 /**
- * Returns `true` if the rounded rectangle has rounded corners that fit within the sides or
- * `false` if the rounded sides add up to a greater size that a side.
+ * Returns `true` if the rounded rectangle has rounded corners that fit within the sides or `false`
+ * if the rounded sides add up to a greater size that a side.
  */
-private fun RoundRect.cornersFit() = topLeftCornerRadius.x + topRightCornerRadius.x <= width &&
-    bottomLeftCornerRadius.x + bottomRightCornerRadius.x <= width &&
-    topLeftCornerRadius.y + bottomLeftCornerRadius.y <= height &&
-    topRightCornerRadius.y + bottomRightCornerRadius.y <= height
+private fun RoundRect.cornersFit() =
+    topLeftCornerRadius.x + topRightCornerRadius.x <= width &&
+        bottomLeftCornerRadius.x + bottomRightCornerRadius.x <= width &&
+        topLeftCornerRadius.y + bottomLeftCornerRadius.y <= height &&
+        topRightCornerRadius.y + bottomRightCornerRadius.y <= height
 
 /**
  * Used to determine whether a point is within a rounded corner, this returns `true` if the point
@@ -147,9 +147,7 @@
 ): Boolean {
     val rect = Rect(x - 0.005f, y - 0.005f, x + 0.005f, y + 0.005f)
     val touchPointPath = tmpTouchPointPath ?: Path()
-    touchPointPath.addRect(
-        rect
-    )
+    touchPointPath.addRect(rect)
 
     val opPath = tmpOpPath ?: Path()
     opPath.op(path, touchPointPath, PathOperation.Intersect)
diff --git a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/platform/SoftwareKeyboardController.kt b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/platform/SoftwareKeyboardController.kt
index 41787f0..3066180 100644
--- a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/platform/SoftwareKeyboardController.kt
+++ b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/platform/SoftwareKeyboardController.kt
@@ -21,25 +21,23 @@
 import androidx.compose.runtime.Stable
 import androidx.compose.ui.text.input.TextInputService
 
-/**
- * Provide software keyboard control.
- */
+/** Provide software keyboard control. */
 @Stable
 interface SoftwareKeyboardController {
     /**
      * Request that the system show a software keyboard.
      *
-     * This request is best effort. If the system can currently show a software keyboard, it
-     * will be shown. However, there is no guarantee that the system will be able to show a
-     * software keyboard. If the system cannot show a software keyboard currently,
-     * this call will be silently ignored.
+     * This request is best effort. If the system can currently show a software keyboard, it will be
+     * shown. However, there is no guarantee that the system will be able to show a software
+     * keyboard. If the system cannot show a software keyboard currently, this call will be silently
+     * ignored.
      *
      * The software keyboard will never show if there is no composable that will accept text input,
      * such as a [TextField][androidx.compose.foundation.text.BasicTextField] when it is focused.
      * You may find it useful to ensure focus when calling this function.
      *
-     * You do not need to call this function unless you also call [hide], as the
-     * keyboard is automatically shown and hidden by focus events in the BasicTextField.
+     * You do not need to call this function unless you also call [hide], as the keyboard is
+     * automatically shown and hidden by focus events in the BasicTextField.
      *
      * Calling this function is considered a side-effect and should not be called directly from
      * recomposition.
@@ -51,8 +49,8 @@
     /**
      * Hide the software keyboard.
      *
-     * This request is best effort, if the system cannot hide the software keyboard this call
-     * will silently be ignored.
+     * This request is best effort, if the system cannot hide the software keyboard this call will
+     * silently be ignored.
      *
      * Calling this function is considered a side-effect and should not be called directly from
      * recomposition.
@@ -62,16 +60,13 @@
     fun hide()
 }
 
-internal class DelegatingSoftwareKeyboardController(
-    val textInputService: TextInputService
-) : SoftwareKeyboardController {
+internal class DelegatingSoftwareKeyboardController(val textInputService: TextInputService) :
+    SoftwareKeyboardController {
     override fun show() {
-        @Suppress("DEPRECATION")
-        textInputService.showSoftwareKeyboard()
+        @Suppress("DEPRECATION") textInputService.showSoftwareKeyboard()
     }
 
     override fun hide() {
-        @Suppress("DEPRECATION")
-        textInputService.hideSoftwareKeyboard()
+        @Suppress("DEPRECATION") textInputService.hideSoftwareKeyboard()
     }
 }
diff --git a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/platform/Synchronization.kt b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/platform/Synchronization.kt
index 90b4cd0..11891c4 100644
--- a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/platform/Synchronization.kt
+++ b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/platform/Synchronization.kt
@@ -16,5 +16,4 @@
 
 package androidx.compose.ui.platform
 
-@PublishedApi
-internal expect inline fun <R> synchronized(lock: Any, block: () -> R): R
+@PublishedApi internal expect inline fun <R> synchronized(lock: Any, block: () -> R): R
diff --git a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/platform/TestTag.kt b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/platform/TestTag.kt
index 247d109..db3a161 100644
--- a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/platform/TestTag.kt
+++ b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/platform/TestTag.kt
@@ -29,11 +29,9 @@
  *
  * This is a convenience method for a [semantics] that sets [SemanticsPropertyReceiver.testTag].
  */
-@Stable
-fun Modifier.testTag(tag: String) = this then TestTagElement(tag)
+@Stable fun Modifier.testTag(tag: String) = this then TestTagElement(tag)
 
-private class TestTagElement(private val tag: String) :
-    ModifierNodeElement<TestTagNode>() {
+private class TestTagElement(private val tag: String) : ModifierNodeElement<TestTagNode>() {
 
     override fun create(): TestTagNode {
         return TestTagNode(tag)
diff --git a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/platform/TextToolbar.kt b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/platform/TextToolbar.kt
index 44591ac..e28ade88 100644
--- a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/platform/TextToolbar.kt
+++ b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/platform/TextToolbar.kt
@@ -19,16 +19,15 @@
 import androidx.compose.ui.geometry.Rect
 import androidx.compose.ui.internal.JvmDefaultWithCompatibility
 
-/**
- * Interface for text-related toolbar.
- */
+/** Interface for text-related toolbar. */
 @JvmDefaultWithCompatibility
 interface TextToolbar {
     /**
      * Show the floating toolbar(post-M) or primary toolbar(pre-M) for copying, cutting and pasting
      * text.
-     * @param rect region of interest. The selected region around which the floating toolbar
-     * should show. This rect is in global coordinates system.
+     *
+     * @param rect region of interest. The selected region around which the floating toolbar should
+     *   show. This rect is in global coordinates system.
      * @param onCopyRequested callback to copy text into ClipBoardManager.
      * @param onPasteRequested callback to get text from ClipBoardManager and paste it.
      * @param onCutRequested callback to cut text and copy the text into ClipBoardManager.
@@ -41,9 +40,7 @@
         onSelectAllRequested: (() -> Unit)? = null
     )
 
-    /**
-     * Hide the floating toolbar(post-M) or primary toolbar(pre-M).
-     */
+    /** Hide the floating toolbar(post-M) or primary toolbar(pre-M). */
     fun hide()
 
     /**
diff --git a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/platform/TextToolbarStatus.kt b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/platform/TextToolbarStatus.kt
index d814abc..10b8c86 100644
--- a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/platform/TextToolbarStatus.kt
+++ b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/platform/TextToolbarStatus.kt
@@ -16,16 +16,10 @@
 
 package androidx.compose.ui.platform
 
-/**
- * Status of the [TextToolbar].
- */
+/** Status of the [TextToolbar]. */
 enum class TextToolbarStatus {
-    /**
-     * The [TextToolbar] is shown.
-     */
+    /** The [TextToolbar] is shown. */
     Shown,
-    /**
-     * The [TextToolbar] is hidden.
-     */
+    /** The [TextToolbar] is hidden. */
     Hidden
 }
diff --git a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/platform/UriHandler.kt b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/platform/UriHandler.kt
index 5f5047d..7383808 100644
--- a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/platform/UriHandler.kt
+++ b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/platform/UriHandler.kt
@@ -16,15 +16,13 @@
 
 package androidx.compose.ui.platform
 
-/**
- * An interface of providing platform specific URL handling.
- */
+/** An interface of providing platform specific URL handling. */
 interface UriHandler {
     /**
      * Open given URL in browser
      *
      * @throws IllegalArgumentException when given [uri] is invalid and/or can't be handled by the
-     * system
+     *   system
      */
     fun openUri(uri: String)
 }
diff --git a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/platform/ViewConfiguration.kt b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/platform/ViewConfiguration.kt
index 7ada466..737ebc7 100644
--- a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/platform/ViewConfiguration.kt
+++ b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/platform/ViewConfiguration.kt
@@ -20,43 +20,35 @@
 import androidx.compose.ui.unit.DpSize
 import androidx.compose.ui.unit.dp
 
-/**
- * Contains methods to standard constants used in the UI for timeouts, sizes, and distances.
- */
+/** Contains methods to standard constants used in the UI for timeouts, sizes, and distances. */
 @JvmDefaultWithCompatibility
 interface ViewConfiguration {
-    /**
-     * The duration before a press turns into a long press.
-     */
+    /** The duration before a press turns into a long press. */
     val longPressTimeoutMillis: Long
 
     /**
-     * The duration between the first tap's up event and the second tap's down
-     * event for an interaction to be considered a double-tap.
+     * The duration between the first tap's up event and the second tap's down event for an
+     * interaction to be considered a double-tap.
      */
     val doubleTapTimeoutMillis: Long
 
     /**
-     * The minimum duration between the first tap's up event and the second tap's down event for
-     * an interaction to be considered a double-tap.
+     * The minimum duration between the first tap's up event and the second tap's down event for an
+     * interaction to be considered a double-tap.
      */
     val doubleTapMinTimeMillis: Long
 
-    /**
-     * Distance in pixels a touch can wander before we think the user is scrolling.
-     */
+    /** Distance in pixels a touch can wander before we think the user is scrolling. */
     val touchSlop: Float
 
-    /**
-     * Distance in pixels a stylus touch can wander before we think the user is handwriting.
-     */
+    /** Distance in pixels a stylus touch can wander before we think the user is handwriting. */
     val handwritingSlop: Float
         get() = 2f
 
     /**
-     * The minimum touch target size. If layout has reduced the pointer input bounds below this,
-     * the touch target will be expanded evenly around the layout to ensure that it is at least
-     * this big.
+     * The minimum touch target size. If layout has reduced the pointer input bounds below this, the
+     * touch target will be expanded evenly around the layout to ensure that it is at least this
+     * big.
      */
     val minimumTouchTargetSize: DpSize
         get() = DpSize(48.dp, 48.dp)
@@ -64,7 +56,8 @@
     /**
      * The maximum velocity a fling have at any given time. This value should be in pixels/second.
      */
-    val maximumFlingVelocity: Float get() = Float.MAX_VALUE
+    val maximumFlingVelocity: Float
+        get() = Float.MAX_VALUE
 
     /**
      * Margin in pixels around text line bounds where stylus handwriting gestures should be
diff --git a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/platform/WindowInfo.kt b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/platform/WindowInfo.kt
index b7a0aa9..5c97608 100644
--- a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/platform/WindowInfo.kt
+++ b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/platform/WindowInfo.kt
@@ -26,23 +26,19 @@
 import androidx.compose.ui.input.pointer.EmptyPointerKeyboardModifiers
 import androidx.compose.ui.input.pointer.PointerKeyboardModifiers
 
-/**
- * Provides information about the Window that is hosting this compose hierarchy.
- */
+/** Provides information about the Window that is hosting this compose hierarchy. */
 @Stable
 interface WindowInfo {
     /**
      * Indicates whether the window hosting this compose hierarchy is in focus.
      *
-     * When there are multiple windows visible, either in a multi-window environment or if a
-     * popup or dialog is visible, this property can be used to determine if the current window
-     * is in focus.
+     * When there are multiple windows visible, either in a multi-window environment or if a popup
+     * or dialog is visible, this property can be used to determine if the current window is in
+     * focus.
      */
     val isWindowFocused: Boolean
 
-    /**
-     * Indicates the state of keyboard modifiers (pressed or not).
-     */
+    /** Indicates the state of keyboard modifiers (pressed or not). */
     @Suppress("OPT_IN_MARKER_ON_WRONG_TARGET")
     @get:ExperimentalComposeUiApi
     val keyboardModifiers: PointerKeyboardModifiers
@@ -62,14 +58,18 @@
     private val _isWindowFocused = mutableStateOf(false)
 
     override var isWindowFocused: Boolean
-        set(value) { _isWindowFocused.value = value }
+        set(value) {
+            _isWindowFocused.value = value
+        }
         get() = _isWindowFocused.value
 
     @Suppress("OPT_IN_MARKER_ON_WRONG_TARGET")
     @get:ExperimentalComposeUiApi
     override var keyboardModifiers: PointerKeyboardModifiers
         get() = GlobalKeyboardModifiers.value
-        set(value) { GlobalKeyboardModifiers.value = value }
+        set(value) {
+            GlobalKeyboardModifiers.value = value
+        }
 
     companion object {
         // One instance across all windows makes sense, since the state of KeyboardModifiers is
diff --git a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/semantics/SemanticsConfiguration.kt b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/semantics/SemanticsConfiguration.kt
index 000dd66..362e2e8 100644
--- a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/semantics/SemanticsConfiguration.kt
+++ b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/semantics/SemanticsConfiguration.kt
@@ -21,18 +21,16 @@
 /**
  * Describes the semantic information associated with the owning component
  *
- * The information provided in the configuration is used to to generate the
- * semantics tree.
+ * The information provided in the configuration is used to to generate the semantics tree.
  */
 class SemanticsConfiguration :
-    SemanticsPropertyReceiver,
-    Iterable<Map.Entry<SemanticsPropertyKey<*>, Any?>> {
+    SemanticsPropertyReceiver, Iterable<Map.Entry<SemanticsPropertyKey<*>, Any?>> {
 
     private val props: MutableMap<SemanticsPropertyKey<*>, Any?> = mutableMapOf()
 
     /**
-     * Retrieves the value for the given property, if one has been set.
-     * If a value has not been set, throws [IllegalStateException]
+     * Retrieves the value for the given property, if one has been set. If a value has not been set,
+     * throws [IllegalStateException]
      */
     // Unavoidable, guaranteed by [set]
     @Suppress("UNCHECKED_CAST")
@@ -61,10 +59,7 @@
     override fun <T> set(key: SemanticsPropertyKey<T>, value: T) {
         if (value is AccessibilityAction<*> && contains(key)) {
             val prev = props[key] as AccessibilityAction<*>
-            props[key] = AccessibilityAction(
-                value.label ?: prev.label,
-                value.action ?: prev.action
-            )
+            props[key] = AccessibilityAction(value.label ?: prev.label, value.action ?: prev.action)
         } else {
             props[key] = value
         }
@@ -78,12 +73,11 @@
         props.keys.any { it.isImportantForAccessibility }
 
     /**
-     * Whether the semantic information provided by the owning component and
-     * all of its descendants should be treated as one logical entity.
+     * Whether the semantic information provided by the owning component and all of its descendants
+     * should be treated as one logical entity.
      *
-     * If set to true, the descendants of the owning component's
-     * [SemanticsNode] will merge their semantic information into the
-     * [SemanticsNode] representing the owning component.
+     * If set to true, the descendants of the owning component's [SemanticsNode] will merge their
+     * semantic information into the [SemanticsNode] representing the owning component.
      */
     var isMergingSemanticsOfDescendants: Boolean = false
     var isClearingSemantics: Boolean = false
@@ -93,9 +87,8 @@
     /**
      * Absorb the semantic information from a child SemanticsNode into this configuration.
      *
-     * This merges the child's semantic configuration using the `merge()` method defined
-     * on the key.  This is used when mergeDescendants is specified (for accessibility focusable
-     * nodes).
+     * This merges the child's semantic configuration using the `merge()` method defined on the key.
+     * This is used when mergeDescendants is specified (for accessibility focusable nodes).
      */
     @Suppress("UNCHECKED_CAST")
     internal fun mergeChild(child: SemanticsConfiguration) {
@@ -111,8 +104,8 @@
     /**
      * Absorb the semantic information from a peer modifier into this configuration.
      *
-     * This is repeatedly called for each semantics {} modifier on one LayoutNode to collapse
-     * them into one SemanticsConfiguration. If a key is already seen and the value is
+     * This is repeatedly called for each semantics {} modifier on one LayoutNode to collapse them
+     * into one SemanticsConfiguration. If a key is already seen and the value is
      * AccessibilityAction, the resulting AccessibilityAction's label/action will be the
      * label/action of the outermost modifier with this key and nonnull label/action, or null if no
      * nonnull label/action is found. If the value is not AccessibilityAction, values with a key
@@ -131,10 +124,11 @@
                 props[key] = nextValue
             } else if (nextValue is AccessibilityAction<*>) {
                 val value = props[key] as AccessibilityAction<*>
-                props[key] = AccessibilityAction(
-                    value.label ?: nextValue.label,
-                    value.action ?: nextValue.action
-                )
+                props[key] =
+                    AccessibilityAction(
+                        value.label ?: nextValue.label,
+                        value.action ?: nextValue.action
+                    )
             }
         }
     }
diff --git a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/semantics/SemanticsModifier.kt b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/semantics/SemanticsModifier.kt
index 40bf53c..92c0875 100644
--- a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/semantics/SemanticsModifier.kt
+++ b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/semantics/SemanticsModifier.kt
@@ -24,24 +24,27 @@
 import androidx.compose.ui.platform.InspectorInfo
 
 private var lastIdentifier = AtomicInt(0)
+
 internal fun generateSemanticsId() = lastIdentifier.addAndGet(1)
 
 /**
- * A [Modifier.Element] that adds semantics key/value for use in testing,
- * accessibility, and similar use cases.
+ * A [Modifier.Element] that adds semantics key/value for use in testing, accessibility, and similar
+ * use cases.
  */
 @JvmDefaultWithCompatibility
 interface SemanticsModifier : Modifier.Element {
     @Deprecated(
-        message = "SemanticsModifier.id is now unused and has been set to a fixed value. " +
-            "Retrieve the id from LayoutInfo instead.",
+        message =
+            "SemanticsModifier.id is now unused and has been set to a fixed value. " +
+                "Retrieve the id from LayoutInfo instead.",
         replaceWith = ReplaceWith("")
     )
-    val id: Int get() = -1
+    val id: Int
+        get() = -1
 
     /**
-     * The SemanticsConfiguration holds substantive data, especially a list of key/value pairs
-     * such as (label -> "buttonName").
+     * The SemanticsConfiguration holds substantive data, especially a list of key/value pairs such
+     * as (label -> "buttonName").
      */
     val semanticsConfiguration: SemanticsConfiguration
 }
@@ -57,6 +60,7 @@
     }
 
     override fun hashCode(): Int = System.identityHashCode(this)
+
     override fun equals(other: Any?) = (other === this)
 }
 
@@ -67,8 +71,10 @@
 ) : Modifier.Node(), SemanticsModifierNode {
     override val shouldClearDescendantSemantics: Boolean
         get() = isClearingSemantics
+
     override val shouldMergeDescendantSemantics: Boolean
         get() = mergeDescendants
+
     override fun SemanticsPropertyReceiver.applySemantics() {
         properties()
     }
@@ -82,39 +88,36 @@
  * Add semantics key/value pairs to the layout node, for use in testing, accessibility, etc.
  *
  * The provided lambda receiver scope provides "key = value"-style setters for any
- * [SemanticsPropertyKey]. Additionally, chaining multiple semantics modifiers is
- * also a supported style.
+ * [SemanticsPropertyKey]. Additionally, chaining multiple semantics modifiers is also a supported
+ * style.
  *
  * The resulting semantics produce two [SemanticsNode] trees:
  *
- * The "unmerged tree" rooted at [SemanticsOwner.unmergedRootSemanticsNode] has one
- * [SemanticsNode] per layout node which has any [SemanticsModifier] on it.  This [SemanticsNode]
- * contains all the properties set in all the [SemanticsModifier]s on that node.
+ * The "unmerged tree" rooted at [SemanticsOwner.unmergedRootSemanticsNode] has one [SemanticsNode]
+ * per layout node which has any [SemanticsModifier] on it. This [SemanticsNode] contains all the
+ * properties set in all the [SemanticsModifier]s on that node.
  *
  * The "merged tree" rooted at [SemanticsOwner.rootSemanticsNode] has equal-or-fewer nodes: it
- * simplifies the structure based on [mergeDescendants] and [clearAndSetSemantics].  For most
- * purposes (especially accessibility, or the testing of accessibility), the merged semantics
- * tree should be used.
+ * simplifies the structure based on [mergeDescendants] and [clearAndSetSemantics]. For most
+ * purposes (especially accessibility, or the testing of accessibility), the merged semantics tree
+ * should be used.
  *
- * @param mergeDescendants Whether the semantic information provided by the owning component and
- * its descendants should be treated as one logical entity.
- * Most commonly set on screen-reader-focusable items such as buttons or form fields.
- * In the merged semantics tree, all descendant nodes (except those themselves marked
- * [mergeDescendants]) will disappear from the tree, and their properties will get merged
- * into the parent's configuration (using a merging algorithm that varies based on the type
- * of property -- for example, text properties will get concatenated, separated by commas).
- * In the unmerged semantics tree, the node is simply marked with
- * [SemanticsConfiguration.isMergingSemanticsOfDescendants].
+ * @param mergeDescendants Whether the semantic information provided by the owning component and its
+ *   descendants should be treated as one logical entity. Most commonly set on
+ *   screen-reader-focusable items such as buttons or form fields. In the merged semantics tree, all
+ *   descendant nodes (except those themselves marked [mergeDescendants]) will disappear from the
+ *   tree, and their properties will get merged into the parent's configuration (using a merging
+ *   algorithm that varies based on the type of property -- for example, text properties will get
+ *   concatenated, separated by commas). In the unmerged semantics tree, the node is simply marked
+ *   with [SemanticsConfiguration.isMergingSemanticsOfDescendants].
  * @param properties properties to add to the semantics. [SemanticsPropertyReceiver] will be
- * provided in the scope to allow access for common properties and its values.
+ *   provided in the scope to allow access for common properties and its values.
  */
 fun Modifier.semantics(
     mergeDescendants: Boolean = false,
     properties: (SemanticsPropertyReceiver.() -> Unit)
-): Modifier = this then AppendedSemanticsElement(
-    mergeDescendants = mergeDescendants,
-    properties = properties
-)
+): Modifier =
+    this then AppendedSemanticsElement(mergeDescendants = mergeDescendants, properties = properties)
 
 // Implement SemanticsModifier to allow tooling to inspect the semantics configuration
 internal data class AppendedSemanticsElement(
@@ -124,10 +127,11 @@
 
     // This should only ever be called by layout inspector
     override val semanticsConfiguration: SemanticsConfiguration
-        get() = SemanticsConfiguration().apply {
-            isMergingSemanticsOfDescendants = mergeDescendants
-            properties()
-        }
+        get() =
+            SemanticsConfiguration().apply {
+                isMergingSemanticsOfDescendants = mergeDescendants
+                properties()
+            }
 
     override fun create(): CoreSemanticsModifierNode {
         return CoreSemanticsModifierNode(
@@ -152,21 +156,20 @@
 /**
  * Clears the semantics of all the descendant nodes and sets new semantics.
  *
- * In the merged semantics tree, this clears the semantic information provided
- * by the node's descendants (but not those of the layout node itself, if any) and sets
- * the provided semantics.  (In the unmerged tree, the semantics node is marked with
+ * In the merged semantics tree, this clears the semantic information provided by the node's
+ * descendants (but not those of the layout node itself, if any) and sets the provided semantics.
+ * (In the unmerged tree, the semantics node is marked with
  * "[SemanticsConfiguration.isClearingSemantics]", but nothing is actually cleared.)
  *
- * Compose's default semantics provide baseline usability for screen-readers, but this can be
- * used to provide a more polished screen-reader experience: for example, clearing the
- * semantics of a group of tiny buttons, and setting equivalent actions on the card containing them.
+ * Compose's default semantics provide baseline usability for screen-readers, but this can be used
+ * to provide a more polished screen-reader experience: for example, clearing the semantics of a
+ * group of tiny buttons, and setting equivalent actions on the card containing them.
  *
  * @param properties properties to add to the semantics. [SemanticsPropertyReceiver] will be
- * provided in the scope to allow access for common properties and its values.
+ *   provided in the scope to allow access for common properties and its values.
  */
-fun Modifier.clearAndSetSemantics(
-    properties: (SemanticsPropertyReceiver.() -> Unit)
-): Modifier = this then ClearAndSetSemanticsElement(properties)
+fun Modifier.clearAndSetSemantics(properties: (SemanticsPropertyReceiver.() -> Unit)): Modifier =
+    this then ClearAndSetSemanticsElement(properties)
 
 // Implement SemanticsModifier to allow tooling to inspect the semantics configuration
 internal data class ClearAndSetSemanticsElement(
@@ -175,11 +178,12 @@
 
     // This should only ever be called by layout inspector
     override val semanticsConfiguration: SemanticsConfiguration
-        get() = SemanticsConfiguration().apply {
-            isMergingSemanticsOfDescendants = false
-            isClearingSemantics = true
-            properties()
-        }
+        get() =
+            SemanticsConfiguration().apply {
+                isMergingSemanticsOfDescendants = false
+                isClearingSemantics = true
+                properties()
+            }
 
     override fun create(): CoreSemanticsModifierNode {
         return CoreSemanticsModifierNode(
@@ -202,7 +206,6 @@
 private fun InspectorInfo.addSemanticsPropertiesFrom(
     semanticsConfiguration: SemanticsConfiguration
 ) {
-    properties["properties"] = semanticsConfiguration.associate { (key, value) ->
-        key.name to value
-    }
+    properties["properties"] =
+        semanticsConfiguration.associate { (key, value) -> key.name to value }
 }
diff --git a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/semantics/SemanticsNode.kt b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/semantics/SemanticsNode.kt
index 951d348..ecfc7fd 100644
--- a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/semantics/SemanticsNode.kt
+++ b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/semantics/SemanticsNode.kt
@@ -39,15 +39,13 @@
 import androidx.compose.ui.unit.IntSize
 import androidx.compose.ui.util.fastForEach
 
-internal fun SemanticsNode(
-    layoutNode: LayoutNode,
-    mergingEnabled: Boolean
-) = SemanticsNode(
-    layoutNode.nodes.head(Nodes.Semantics)!!.node,
-    mergingEnabled,
-    layoutNode,
-    layoutNode.collapsedSemantics!!
-)
+internal fun SemanticsNode(layoutNode: LayoutNode, mergingEnabled: Boolean) =
+    SemanticsNode(
+        layoutNode.nodes.head(Nodes.Semantics)!!.node,
+        mergingEnabled,
+        layoutNode,
+        layoutNode.collapsedSemantics!!
+    )
 
 internal fun SemanticsNode(
     /*
@@ -57,34 +55,33 @@
     /**
      * mergingEnabled specifies whether mergeDescendants config has any effect.
      *
-     * If true, then mergeDescendants nodes will merge up all properties from child
-     * semantics nodes and remove those children from "children", with the exception
-     * of nodes that themselves have mergeDescendants.  If false, then mergeDescendants
-     * has no effect.
+     * If true, then mergeDescendants nodes will merge up all properties from child semantics nodes
+     * and remove those children from "children", with the exception of nodes that themselves have
+     * mergeDescendants. If false, then mergeDescendants has no effect.
      *
      * mergingEnabled is typically true or false consistently on every node of a SemanticsNode tree.
      */
     mergingEnabled: Boolean,
-    /**
-     * The [LayoutNode] that this is associated with.
-     */
+    /** The [LayoutNode] that this is associated with. */
     layoutNode: LayoutNode = outerSemanticsNode.requireLayoutNode()
-) = SemanticsNode(
-    outerSemanticsNode.node,
-    mergingEnabled,
-    layoutNode,
-    layoutNode.collapsedSemantics ?: SemanticsConfiguration()
-)
+) =
+    SemanticsNode(
+        outerSemanticsNode.node,
+        mergingEnabled,
+        layoutNode,
+        layoutNode.collapsedSemantics ?: SemanticsConfiguration()
+    )
 
 /**
  * A list of key/value pairs associated with a layout node or its subtree.
  *
- * Each SemanticsNode takes its id and initial key/value list from the
- * outermost modifier on one layout node.  It also contains the "collapsed" configuration
- * of any other semantics modifiers on the same layout node, and if "mergeDescendants" is
- * specified and enabled, also the "merged" configuration of its subtree.
+ * Each SemanticsNode takes its id and initial key/value list from the outermost modifier on one
+ * layout node. It also contains the "collapsed" configuration of any other semantics modifiers on
+ * the same layout node, and if "mergeDescendants" is specified and enabled, also the "merged"
+ * configuration of its subtree.
  */
-class SemanticsNode internal constructor(
+class SemanticsNode
+internal constructor(
     internal val outerSemanticsNode: Modifier.Node,
     val mergingEnabled: Boolean,
     internal val layoutNode: LayoutNode,
@@ -96,21 +93,21 @@
     internal var isFake = false
     private var fakeNodeParent: SemanticsNode? = null
 
-    internal val isUnmergedLeafNode get() =
-        !isFake && replacedChildren.isEmpty() && layoutNode.findClosestParentNode {
-            it.collapsedSemantics
-                ?.isMergingSemanticsOfDescendants == true
-        } == null
+    internal val isUnmergedLeafNode
+        get() =
+            !isFake &&
+                replacedChildren.isEmpty() &&
+                layoutNode.findClosestParentNode {
+                    it.collapsedSemantics?.isMergingSemanticsOfDescendants == true
+                } == null
 
-    /**
-     * The [LayoutInfo] that this is associated with.
-     */
-    val layoutInfo: LayoutInfo get() = layoutNode
+    /** The [LayoutInfo] that this is associated with. */
+    val layoutInfo: LayoutInfo
+        get() = layoutNode
 
-    /**
-     * The [root][RootForTest] this node is attached to.
-     */
-    val root: RootForTest? get() = layoutNode.owner?.rootForTest
+    /** The [root][RootForTest] this node is attached to. */
+    val root: RootForTest?
+        get() = layoutNode.owner?.rootForTest
 
     /**
      * For newer AccessibilityNodeInfo-based integration test frameworks, it can be matched in the
@@ -123,64 +120,59 @@
     /**
      * The rectangle of the touchable area.
      *
-     * If this is a clickable region, this is the rectangle that accepts touch input. This can
-     * be larger than [size] when the layout is less than
-     * [ViewConfiguration.minimumTouchTargetSize]
+     * If this is a clickable region, this is the rectangle that accepts touch input. This can be
+     * larger than [size] when the layout is less than [ViewConfiguration.minimumTouchTargetSize]
      */
     val touchBoundsInRoot: Rect
         get() {
-            val entity = if (unmergedConfig.isMergingSemanticsOfDescendants) {
-                (layoutNode.outerMergingSemantics ?: outerSemanticsNode)
-            } else {
-                outerSemanticsNode
-            }
+            val entity =
+                if (unmergedConfig.isMergingSemanticsOfDescendants) {
+                    (layoutNode.outerMergingSemantics ?: outerSemanticsNode)
+                } else {
+                    outerSemanticsNode
+                }
             return entity.node.touchBoundsInRoot(unmergedConfig.useMinimumTouchTarget)
         }
 
-    /**
-     * The size of the bounding box for this node, with no clipping applied
-     */
+    /** The size of the bounding box for this node, with no clipping applied */
     val size: IntSize
         get() = findCoordinatorToGetBounds()?.size ?: IntSize.Zero
 
     /**
-     * The bounding box for this node relative to the root of this Compose hierarchy, with
-     * clipping applied. To get the bounds with no clipping applied, use
-     * Rect([positionInRoot], [size].toSize())
+     * The bounding box for this node relative to the root of this Compose hierarchy, with clipping
+     * applied. To get the bounds with no clipping applied, use Rect([positionInRoot],
+     * [size].toSize())
      */
     val boundsInRoot: Rect
-        get() = findCoordinatorToGetBounds()?.takeIf { it.isAttached }?.boundsInRoot()
-            ?: Rect.Zero
+        get() = findCoordinatorToGetBounds()?.takeIf { it.isAttached }?.boundsInRoot() ?: Rect.Zero
 
     /**
      * The position of this node relative to the root of this Compose hierarchy, with no clipping
      * applied
      */
     val positionInRoot: Offset
-        get() = findCoordinatorToGetBounds()?.takeIf { it.isAttached }?.positionInRoot()
-            ?: Offset.Zero
+        get() =
+            findCoordinatorToGetBounds()?.takeIf { it.isAttached }?.positionInRoot() ?: Offset.Zero
 
     /**
      * The bounding box for this node relative to the window, with clipping applied. To get the
      * bounds with no clipping applied, use PxBounds([positionInWindow], [size].toSize())
      */
     val boundsInWindow: Rect
-        get() = findCoordinatorToGetBounds()?.takeIf { it.isAttached }?.boundsInWindow()
-            ?: Rect.Zero
+        get() =
+            findCoordinatorToGetBounds()?.takeIf { it.isAttached }?.boundsInWindow() ?: Rect.Zero
 
-    /**
-     * The position of this node relative to the window, with no clipping applied
-     */
+    /** The position of this node relative to the window, with no clipping applied */
     val positionInWindow: Offset
-        get() = findCoordinatorToGetBounds()?.takeIf { it.isAttached }?.positionInWindow()
-            ?: Offset.Zero
+        get() =
+            findCoordinatorToGetBounds()?.takeIf { it.isAttached }?.positionInWindow()
+                ?: Offset.Zero
 
-    /**
-     * The position of this node relative to the screen, with no clipping applied
-     */
+    /** The position of this node relative to the screen, with no clipping applied */
     val positionOnScreen: Offset
-        get() = findCoordinatorToGetBounds()?.takeIf { it.isAttached }?.positionOnScreen()
-            ?: Offset.Zero
+        get() =
+            findCoordinatorToGetBounds()?.takeIf { it.isAttached }?.positionOnScreen()
+                ?: Offset.Zero
 
     /**
      * The bounding box for this node relative to the parent semantics node, with clipping applied.
@@ -188,21 +180,21 @@
     internal val boundsInParent: Rect
         get() {
             val parent = this.parent ?: return Rect.Zero
-            val currentCoordinates = findCoordinatorToGetBounds()?.takeIf { it.isAttached }
-                ?.coordinates ?: return Rect.Zero
-            return parent.outerSemanticsNode.requireCoordinator(Nodes.Semantics)
+            val currentCoordinates =
+                findCoordinatorToGetBounds()?.takeIf { it.isAttached }?.coordinates
+                    ?: return Rect.Zero
+            return parent.outerSemanticsNode
+                .requireCoordinator(Nodes.Semantics)
                 .localBoundingBoxOf(currentCoordinates)
         }
 
-    /**
-     * Whether this node is transparent.
-     */
+    /** Whether this node is transparent. */
     internal val isTransparent: Boolean
         get() = findCoordinatorToGetBounds()?.isTransparent() ?: false
 
     /**
-     * Returns the position of an [alignment line][AlignmentLine], or [AlignmentLine.Unspecified]
-     * if the line is not provided.
+     * Returns the position of an [alignment line][AlignmentLine], or [AlignmentLine.Unspecified] if
+     * the line is not provided.
      */
     fun getAlignmentLinePosition(alignmentLine: AlignmentLine): Int {
         return findCoordinatorToGetBounds()?.get(alignmentLine) ?: AlignmentLine.Unspecified
@@ -213,9 +205,9 @@
     /**
      * The list of semantics properties of this node.
      *
-     * This includes all properties attached as modifiers to the current layout node.
-     * In addition, if mergeDescendants and mergingEnabled are both true, then it
-     * also includes the semantics properties of descendant nodes.
+     * This includes all properties attached as modifiers to the current layout node. In addition,
+     * if mergeDescendants and mergingEnabled are both true, then it also includes the semantics
+     * properties of descendant nodes.
      */
     // TODO(b/184376083): This is too expensive for a val (full subtree recreation every call);
     //               optimize this when the merging algorithm is improved.
@@ -286,8 +278,8 @@
     /**
      * Contains the children in inverse hit test order (i.e. paint order).
      *
-     * Note that if mergingEnabled and mergeDescendants are both true, then there
-     * are no children (except those that are themselves mergeDescendants).
+     * Note that if mergingEnabled and mergeDescendants are both true, then there are no children
+     * (except those that are themselves mergeDescendants).
      */
     // TODO(b/184376083): This is too expensive for a val (full subtree recreation every call);
     //               optimize this when the merging algorithm is improved.
@@ -297,27 +289,24 @@
     /**
      * Contains the children in inverse hit test order (i.e. paint order).
      *
-     * Unlike [children] property that includes replaced semantics nodes in unmerged tree, here
-     * node marked as [clearAndSetSemantics] will not have children.
-     * This property is primarily used in Accessibility delegate.
+     * Unlike [children] property that includes replaced semantics nodes in unmerged tree, here node
+     * marked as [clearAndSetSemantics] will not have children. This property is primarily used in
+     * Accessibility delegate.
      */
     internal val replacedChildren: List<SemanticsNode>
-        get() = getChildren(
-            includeReplacedSemantics = false,
-            includeFakeNodes = true
-        )
+        get() = getChildren(includeReplacedSemantics = false, includeFakeNodes = true)
 
     /**
-     * @param includeReplacedSemantics if true, the result will contain children of nodes marked
-     * as [clearAndSetSemantics]. For accessibility we always use false, but in testing and
-     * debugging we should be able to investigate both
-     * @param includeFakeNodes if true, the tree will include fake nodes. For accessibility we
-     * set to true, but for testing purposes we don't want to expose the fake nodes and therefore
-     * set to false. When Talkback can properly handle unmerged tree, fake nodes will be removed
-     * and so will be this parameter.
+     * @param includeReplacedSemantics if true, the result will contain children of nodes marked as
+     *   [clearAndSetSemantics]. For accessibility we always use false, but in testing and debugging
+     *   we should be able to investigate both
+     * @param includeFakeNodes if true, the tree will include fake nodes. For accessibility we set
+     *   to true, but for testing purposes we don't want to expose the fake nodes and therefore set
+     *   to false. When Talkback can properly handle unmerged tree, fake nodes will be removed and
+     *   so will be this parameter.
      * @param includeDeactivatedNodes set to true if you want to collect the nodes which are
-     * deactivated. For example, the children of [androidx.compose.ui.layout.SubcomposeLayout]
-     * which are retained to be reused in future are considered deactivated.
+     *   deactivated. For example, the children of [androidx.compose.ui.layout.SubcomposeLayout]
+     *   which are retained to be reused in future are considered deactivated.
      */
     internal fun getChildren(
         includeReplacedSemantics: Boolean = !mergingEnabled,
@@ -338,9 +327,7 @@
         return unmergedChildren(includeFakeNodes, includeDeactivatedNodes)
     }
 
-    /**
-     * Whether this SemanticNode is the root of a tree or not
-     */
+    /** Whether this SemanticNode is the root of a tree or not */
     val isRoot: Boolean
         get() = parent == null
 
@@ -350,17 +337,17 @@
             if (fakeNodeParent != null) return fakeNodeParent
             var node: LayoutNode? = null
             if (mergingEnabled) {
-                node = this.layoutNode.findClosestParentNode {
-                    it.collapsedSemantics?.isMergingSemanticsOfDescendants == true
-                }
+                node =
+                    this.layoutNode.findClosestParentNode {
+                        it.collapsedSemantics?.isMergingSemanticsOfDescendants == true
+                    }
             }
 
             if (node == null) {
                 node = this.layoutNode.findClosestParentNode { it.nodes.has(Nodes.Semantics) }
             }
 
-            if (node == null)
-                return null
+            if (node == null) return null
 
             return SemanticsNode(node, mergingEnabled)
         }
@@ -382,9 +369,9 @@
 
     /**
      * If the node is merging the descendants, we'll use the outermost semantics modifier that has
-     * mergeDescendants == true to report the bounds, size and position of the node. For majority
-     * of use cases it means that accessibility bounds will be equal to the clickable area.
-     * Otherwise the outermost semantics will be used to report bounds, size and position.
+     * mergeDescendants == true to report the bounds, size and position of the node. For majority of
+     * use cases it means that accessibility bounds will be equal to the clickable area. Otherwise
+     * the outermost semantics will be used to report bounds, size and position.
      */
     internal fun findCoordinatorToGetBounds(): NodeCoordinator? {
         if (isFake) return parent?.findCoordinatorToGetBounds()
@@ -395,25 +382,26 @@
     // Fake nodes
     private fun emitFakeNodes(unmergedChildren: MutableList<SemanticsNode>) {
         val nodeRole = this.role
-        if (nodeRole != null && unmergedConfig.isMergingSemanticsOfDescendants &&
-            unmergedChildren.isNotEmpty()
+        if (
+            nodeRole != null &&
+                unmergedConfig.isMergingSemanticsOfDescendants &&
+                unmergedChildren.isNotEmpty()
         ) {
-            val fakeNode = fakeSemanticsNode(nodeRole) {
-                this.role = nodeRole
-            }
+            val fakeNode = fakeSemanticsNode(nodeRole) { this.role = nodeRole }
             unmergedChildren.add(fakeNode)
         }
 
         // Fake node for contentDescription clobbering issue
-        if (unmergedConfig.contains(SemanticsProperties.ContentDescription) &&
-            unmergedChildren.isNotEmpty() && unmergedConfig.isMergingSemanticsOfDescendants
+        if (
+            unmergedConfig.contains(SemanticsProperties.ContentDescription) &&
+                unmergedChildren.isNotEmpty() &&
+                unmergedConfig.isMergingSemanticsOfDescendants
         ) {
             val contentDescription =
                 this.unmergedConfig.getOrNull(SemanticsProperties.ContentDescription)?.firstOrNull()
             if (contentDescription != null) {
-                val fakeNode = fakeSemanticsNode(null) {
-                    this.contentDescription = contentDescription
-                }
+                val fakeNode =
+                    fakeSemanticsNode(null) { this.contentDescription = contentDescription }
                 unmergedChildren.add(0, fakeNode)
             }
         }
@@ -423,49 +411,45 @@
         role: Role?,
         properties: SemanticsPropertyReceiver.() -> Unit
     ): SemanticsNode {
-        val configuration = SemanticsConfiguration().also {
-            it.isMergingSemanticsOfDescendants = false
-            it.isClearingSemantics = false
-            it.properties()
-        }
-        val fakeNode = SemanticsNode(
-            outerSemanticsNode = object : SemanticsModifierNode, Modifier.Node() {
-                override fun SemanticsPropertyReceiver.applySemantics() {
-                    properties()
-                }
-            },
-            mergingEnabled = false,
-            layoutNode = LayoutNode(
-                    isVirtual = true,
-                    semanticsId =
-                        if (role != null) roleFakeNodeId() else contentDescriptionFakeNodeId()
-                ),
-            unmergedConfig = configuration
-        )
+        val configuration =
+            SemanticsConfiguration().also {
+                it.isMergingSemanticsOfDescendants = false
+                it.isClearingSemantics = false
+                it.properties()
+            }
+        val fakeNode =
+            SemanticsNode(
+                outerSemanticsNode =
+                    object : SemanticsModifierNode, Modifier.Node() {
+                        override fun SemanticsPropertyReceiver.applySemantics() {
+                            properties()
+                        }
+                    },
+                mergingEnabled = false,
+                layoutNode =
+                    LayoutNode(
+                        isVirtual = true,
+                        semanticsId =
+                            if (role != null) roleFakeNodeId() else contentDescriptionFakeNodeId()
+                    ),
+                unmergedConfig = configuration
+            )
         fakeNode.isFake = true
         fakeNode.fakeNodeParent = this
         return fakeNode
     }
 
     internal fun copyWithMergingEnabled(): SemanticsNode {
-        return SemanticsNode(
-            outerSemanticsNode,
-            true,
-            layoutNode,
-            unmergedConfig
-        )
+        return SemanticsNode(outerSemanticsNode, true, layoutNode, unmergedConfig)
     }
 }
 
 internal val LayoutNode.outerMergingSemantics: SemanticsModifierNode?
-    get() = nodes.firstFromHead(Nodes.Semantics) {
-        it.shouldMergeDescendantSemantics
-    }
+    get() = nodes.firstFromHead(Nodes.Semantics) { it.shouldMergeDescendantSemantics }
 
 /**
- * Executes [selector] on every parent of this [LayoutNode] and returns the closest
- * [LayoutNode] to return `true` from [selector] or null if [selector] returns false
- * for all ancestors.
+ * Executes [selector] on every parent of this [LayoutNode] and returns the closest [LayoutNode] to
+ * return `true` from [selector] or null if [selector] returns false for all ancestors.
  */
 internal fun LayoutNode.findClosestParentNode(selector: (LayoutNode) -> Boolean): LayoutNode? {
     var currentParent = this.parent
@@ -480,6 +464,9 @@
     return null
 }
 
-private val SemanticsNode.role get() = this.unmergedConfig.getOrNull(SemanticsProperties.Role)
+private val SemanticsNode.role
+    get() = this.unmergedConfig.getOrNull(SemanticsProperties.Role)
+
 private fun SemanticsNode.contentDescriptionFakeNodeId() = this.id + 2_000_000_000
+
 private fun SemanticsNode.roleFakeNodeId() = this.id + 1_000_000_000
diff --git a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/semantics/SemanticsOwner.kt b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/semantics/SemanticsOwner.kt
index b1e955a..773c324 100644
--- a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/semantics/SemanticsOwner.kt
+++ b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/semantics/SemanticsOwner.kt
@@ -20,18 +20,16 @@
 import androidx.compose.ui.node.LayoutNode
 import androidx.compose.ui.util.fastForEach
 
-/**
- * Owns [SemanticsNode] objects and notifies listeners of changes to the
- * semantics tree
- */
+/** Owns [SemanticsNode] objects and notifies listeners of changes to the semantics tree */
 @OptIn(ExperimentalComposeUiApi::class)
-class SemanticsOwner internal constructor(
+class SemanticsOwner
+internal constructor(
     private val rootNode: LayoutNode,
     private val outerSemanticsNode: EmptySemanticsModifier
 ) {
     /**
-     * The root node of the semantics tree.  Does not contain any unmerged data.
-     * May contain merged data.
+     * The root node of the semantics tree. Does not contain any unmerged data. May contain merged
+     * data.
      */
     val rootSemanticsNode: SemanticsNode
         get() {
@@ -59,17 +57,19 @@
  *
  * @param mergingEnabled set to true if you want the data to be merged.
  * @param skipDeactivatedNodes set to false if you want to collect the nodes which are deactivated.
- * For example, the children of [androidx.compose.ui.layout.SubcomposeLayout] which are retained
- * to be reused in future are considered deactivated.
+ *   For example, the children of [androidx.compose.ui.layout.SubcomposeLayout] which are retained
+ *   to be reused in future are considered deactivated.
  */
 fun SemanticsOwner.getAllSemanticsNodes(
     mergingEnabled: Boolean,
     skipDeactivatedNodes: Boolean = true
 ): List<SemanticsNode> {
     return getAllSemanticsNodesToMap(
-        useUnmergedTree = !mergingEnabled,
-        skipDeactivatedNodes = skipDeactivatedNodes
-    ).values.toList()
+            useUnmergedTree = !mergingEnabled,
+            skipDeactivatedNodes = skipDeactivatedNodes
+        )
+        .values
+        .toList()
 }
 
 @Deprecated(message = "Use a new overload instead", level = DeprecationLevel.HIDDEN)
@@ -88,11 +88,10 @@
 
     fun findAllSemanticNodesRecursive(currentNode: SemanticsNode) {
         nodes[currentNode.id] = currentNode
-        currentNode
-            .getChildren(includeDeactivatedNodes = !skipDeactivatedNodes)
-            .fastForEach { child ->
-                findAllSemanticNodesRecursive(child)
-            }
+        currentNode.getChildren(includeDeactivatedNodes = !skipDeactivatedNodes).fastForEach { child
+            ->
+            findAllSemanticNodesRecursive(child)
+        }
     }
 
     val root = if (useUnmergedTree) unmergedRootSemanticsNode else rootSemanticsNode
diff --git a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/semantics/SemanticsProperties.kt b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/semantics/SemanticsProperties.kt
index 9e477932..0f57306 100644
--- a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/semantics/SemanticsProperties.kt
+++ b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/semantics/SemanticsProperties.kt
@@ -31,43 +31,36 @@
 /**
  * General semantics properties, mainly used for accessibility and testing.
  *
- * Each of these is intended to be set by the respective SemanticsPropertyReceiver extension
- * instead of used directly.
+ * Each of these is intended to be set by the respective SemanticsPropertyReceiver extension instead
+ * of used directly.
  */
 /*@VisibleForTesting*/
 object SemanticsProperties {
-    /**
-     * @see SemanticsPropertyReceiver.contentDescription
-     */
-    val ContentDescription = AccessibilityKey<List<String>>(
-        name = "ContentDescription",
-        mergePolicy = { parentValue, childValue ->
-            parentValue?.toMutableList()?.also { it.addAll(childValue) } ?: childValue
-        }
-    )
+    /** @see SemanticsPropertyReceiver.contentDescription */
+    val ContentDescription =
+        AccessibilityKey<List<String>>(
+            name = "ContentDescription",
+            mergePolicy = { parentValue, childValue ->
+                parentValue?.toMutableList()?.also { it.addAll(childValue) } ?: childValue
+            }
+        )
 
-    /**
-     * @see SemanticsPropertyReceiver.stateDescription
-     */
+    /** @see SemanticsPropertyReceiver.stateDescription */
     val StateDescription = AccessibilityKey<String>("StateDescription")
 
-    /**
-     * @see SemanticsPropertyReceiver.progressBarRangeInfo
-     */
-    val ProgressBarRangeInfo =
-        AccessibilityKey<ProgressBarRangeInfo>("ProgressBarRangeInfo")
+    /** @see SemanticsPropertyReceiver.progressBarRangeInfo */
+    val ProgressBarRangeInfo = AccessibilityKey<ProgressBarRangeInfo>("ProgressBarRangeInfo")
 
-    /**
-     * @see SemanticsPropertyReceiver.paneTitle
-     */
-    val PaneTitle = AccessibilityKey<String>(
-        name = "PaneTitle",
-        mergePolicy = { _, _ ->
-            throw IllegalStateException(
-                "merge function called on unmergeable property PaneTitle."
-            )
-        }
-    )
+    /** @see SemanticsPropertyReceiver.paneTitle */
+    val PaneTitle =
+        AccessibilityKey<String>(
+            name = "PaneTitle",
+            mergePolicy = { _, _ ->
+                throw IllegalStateException(
+                    "merge function called on unmergeable property PaneTitle."
+                )
+            }
+        )
 
     /** @see SemanticsPropertyReceiver.selectableGroup */
     val SelectableGroup = AccessibilityKey<Unit>("SelectableGroup")
@@ -78,29 +71,19 @@
     /** @see SemanticsPropertyReceiver.collectionItemInfo */
     val CollectionItemInfo = AccessibilityKey<CollectionItemInfo>("CollectionItemInfo")
 
-    /**
-     * @see SemanticsPropertyReceiver.heading
-     */
+    /** @see SemanticsPropertyReceiver.heading */
     val Heading = AccessibilityKey<Unit>("Heading")
 
-    /**
-     * @see SemanticsPropertyReceiver.disabled
-     */
+    /** @see SemanticsPropertyReceiver.disabled */
     val Disabled = AccessibilityKey<Unit>("Disabled")
 
-    /**
-     * @see SemanticsPropertyReceiver.liveRegion
-     */
+    /** @see SemanticsPropertyReceiver.liveRegion */
     val LiveRegion = AccessibilityKey<LiveRegionMode>("LiveRegion")
 
-    /**
-     * @see SemanticsPropertyReceiver.focused
-     */
+    /** @see SemanticsPropertyReceiver.focused */
     val Focused = AccessibilityKey<Boolean>("Focused")
 
-    /**
-     * @see SemanticsPropertyReceiver.isContainer
-     */
+    /** @see SemanticsPropertyReceiver.isContainer */
     @Deprecated(
         "Use `isTraversalGroup` instead.",
         replaceWith = ReplaceWith("IsTraversalGroup"),
@@ -108,94 +91,78 @@
     val IsContainer: SemanticsPropertyKey<Boolean>
         get() = IsTraversalGroup
 
-    /**
-     * @see SemanticsPropertyReceiver.isTraversalGroup
-     */
+    /** @see SemanticsPropertyReceiver.isTraversalGroup */
     val IsTraversalGroup = AccessibilityKey<Boolean>("IsTraversalGroup")
 
-    /**
-     * @see SemanticsPropertyReceiver.invisibleToUser
-     */
+    /** @see SemanticsPropertyReceiver.invisibleToUser */
     @ExperimentalComposeUiApi
-    val InvisibleToUser = SemanticsPropertyKey<Unit>(
-        name = "InvisibleToUser",
-        mergePolicy = { parentValue, _ ->
-            parentValue
-        }
-    )
+    val InvisibleToUser =
+        SemanticsPropertyKey<Unit>(
+            name = "InvisibleToUser",
+            mergePolicy = { parentValue, _ -> parentValue }
+        )
 
-    /**
-     * @see SemanticsPropertyReceiver.contentType
-     */
+    /** @see SemanticsPropertyReceiver.contentType */
     // TODO(b/333102566): make these semantics properties public when Autofill is ready to go live
-    internal val ContentType = SemanticsPropertyKey<ContentType>(
-        name = "ContentType",
-        mergePolicy = { parentValue, _ ->
-            // Never merge autofill types
-            parentValue
-        }
-    )
+    internal val ContentType =
+        SemanticsPropertyKey<ContentType>(
+            name = "ContentType",
+            mergePolicy = { parentValue, _ ->
+                // Never merge autofill types
+                parentValue
+            }
+        )
 
-    /**
-     * @see SemanticsPropertyReceiver.contentDataType
-     */
+    /** @see SemanticsPropertyReceiver.contentDataType */
     // TODO(b/333102566): make these semantics properties public when Autofill is ready to go live
-    internal val ContentDataType = SemanticsPropertyKey<ContentDataType>(
-        name = "ContentDataType",
-        mergePolicy = { parentValue, _ ->
-            // Never merge autofill data types
-            parentValue
-        }
-    )
+    internal val ContentDataType =
+        SemanticsPropertyKey<ContentDataType>(
+            name = "ContentDataType",
+            mergePolicy = { parentValue, _ ->
+                // Never merge autofill data types
+                parentValue
+            }
+        )
 
-    /**
-     * @see SemanticsPropertyReceiver.traversalIndex
-     */
-    val TraversalIndex = AccessibilityKey<Float>(
-        name = "TraversalIndex",
-        mergePolicy = { parentValue, _ ->
-            // Never merge traversal indices
-            parentValue
-        }
-    )
+    /** @see SemanticsPropertyReceiver.traversalIndex */
+    val TraversalIndex =
+        AccessibilityKey<Float>(
+            name = "TraversalIndex",
+            mergePolicy = { parentValue, _ ->
+                // Never merge traversal indices
+                parentValue
+            }
+        )
 
-    /**
-     * @see SemanticsPropertyReceiver.horizontalScrollAxisRange
-     */
-    val HorizontalScrollAxisRange =
-        AccessibilityKey<ScrollAxisRange>("HorizontalScrollAxisRange")
+    /** @see SemanticsPropertyReceiver.horizontalScrollAxisRange */
+    val HorizontalScrollAxisRange = AccessibilityKey<ScrollAxisRange>("HorizontalScrollAxisRange")
 
-    /**
-     * @see SemanticsPropertyReceiver.verticalScrollAxisRange
-     */
-    val VerticalScrollAxisRange =
-        AccessibilityKey<ScrollAxisRange>("VerticalScrollAxisRange")
+    /** @see SemanticsPropertyReceiver.verticalScrollAxisRange */
+    val VerticalScrollAxisRange = AccessibilityKey<ScrollAxisRange>("VerticalScrollAxisRange")
 
-    /**
-     * @see SemanticsPropertyReceiver.popup
-     */
-    val IsPopup = AccessibilityKey<Unit>(
-        name = "IsPopup",
-        mergePolicy = { _, _ ->
-            throw IllegalStateException(
-                "merge function called on unmergeable property IsPopup. " +
-                    "A popup should not be a child of a clickable/focusable node."
-            )
-        }
-    )
+    /** @see SemanticsPropertyReceiver.popup */
+    val IsPopup =
+        AccessibilityKey<Unit>(
+            name = "IsPopup",
+            mergePolicy = { _, _ ->
+                throw IllegalStateException(
+                    "merge function called on unmergeable property IsPopup. " +
+                        "A popup should not be a child of a clickable/focusable node."
+                )
+            }
+        )
 
-    /**
-     * @see SemanticsPropertyReceiver.dialog
-     */
-    val IsDialog = AccessibilityKey<Unit>(
-        name = "IsDialog",
-        mergePolicy = { _, _ ->
-            throw IllegalStateException(
-                "merge function called on unmergeable property IsDialog. " +
-                    "A dialog should not be a child of a clickable/focusable node."
-            )
-        }
-    )
+    /** @see SemanticsPropertyReceiver.dialog */
+    val IsDialog =
+        AccessibilityKey<Unit>(
+            name = "IsDialog",
+            mergePolicy = { _, _ ->
+                throw IllegalStateException(
+                    "merge function called on unmergeable property IsDialog. " +
+                        "A dialog should not be a child of a clickable/focusable node."
+                )
+            }
+        )
 
     /**
      * The type of user interface element. Accessibility services might use this to describe the
@@ -208,86 +175,60 @@
      */
     val Role = AccessibilityKey<Role>("Role") { parentValue, _ -> parentValue }
 
-    /**
-     * @see SemanticsPropertyReceiver.testTag
-     */
-    val TestTag = SemanticsPropertyKey<String>(
-        name = "TestTag",
-        isImportantForAccessibility = false,
-        mergePolicy = { parentValue, _ ->
-            // Never merge TestTags, to avoid leaking internal test tags to parents.
-            parentValue
-        }
-    )
+    /** @see SemanticsPropertyReceiver.testTag */
+    val TestTag =
+        SemanticsPropertyKey<String>(
+            name = "TestTag",
+            isImportantForAccessibility = false,
+            mergePolicy = { parentValue, _ ->
+                // Never merge TestTags, to avoid leaking internal test tags to parents.
+                parentValue
+            }
+        )
 
-    /**
-     * @see SemanticsPropertyReceiver.text
-     */
-    val Text = AccessibilityKey<List<AnnotatedString>>(
-        name = "Text",
-        mergePolicy = { parentValue, childValue ->
-            parentValue?.toMutableList()?.also { it.addAll(childValue) } ?: childValue
-        }
-    )
+    /** @see SemanticsPropertyReceiver.text */
+    val Text =
+        AccessibilityKey<List<AnnotatedString>>(
+            name = "Text",
+            mergePolicy = { parentValue, childValue ->
+                parentValue?.toMutableList()?.also { it.addAll(childValue) } ?: childValue
+            }
+        )
 
-    /**
-     * @see SemanticsPropertyReceiver.textSubstitution
-     */
+    /** @see SemanticsPropertyReceiver.textSubstitution */
     val TextSubstitution = SemanticsPropertyKey<AnnotatedString>(name = "TextSubstitution")
 
-    /**
-     * @see SemanticsPropertyReceiver.isShowingTextSubstitution
-     */
+    /** @see SemanticsPropertyReceiver.isShowingTextSubstitution */
     val IsShowingTextSubstitution = SemanticsPropertyKey<Boolean>("IsShowingTextSubstitution")
 
-    /**
-     * @see SemanticsPropertyReceiver.editableText
-     */
+    /** @see SemanticsPropertyReceiver.editableText */
     val EditableText = AccessibilityKey<AnnotatedString>(name = "EditableText")
 
-    /**
-     * @see SemanticsPropertyReceiver.textSelectionRange
-     */
+    /** @see SemanticsPropertyReceiver.textSelectionRange */
     val TextSelectionRange = AccessibilityKey<TextRange>("TextSelectionRange")
 
-    /**
-     * @see SemanticsPropertyReceiver.onImeAction
-     */
+    /** @see SemanticsPropertyReceiver.onImeAction */
     val ImeAction = AccessibilityKey<ImeAction>("ImeAction")
 
-    /**
-     * @see SemanticsPropertyReceiver.selected
-     */
+    /** @see SemanticsPropertyReceiver.selected */
     val Selected = AccessibilityKey<Boolean>("Selected")
 
-    /**
-     * @see SemanticsPropertyReceiver.toggleableState
-     */
+    /** @see SemanticsPropertyReceiver.toggleableState */
     val ToggleableState = AccessibilityKey<ToggleableState>("ToggleableState")
 
-    /**
-     * @see SemanticsPropertyReceiver.password
-     */
+    /** @see SemanticsPropertyReceiver.password */
     val Password = AccessibilityKey<Unit>("Password")
 
-    /**
-     * @see SemanticsPropertyReceiver.error
-     */
+    /** @see SemanticsPropertyReceiver.error */
     val Error = AccessibilityKey<String>("Error")
 
-    /**
-     * @see SemanticsPropertyReceiver.indexForKey
-     */
+    /** @see SemanticsPropertyReceiver.indexForKey */
     val IndexForKey = SemanticsPropertyKey<(Any) -> Int>("IndexForKey")
 
-    /**
-     * @see SemanticsPropertyReceiver.isEditable
-     */
+    /** @see SemanticsPropertyReceiver.isEditable */
     val IsEditable = SemanticsPropertyKey<Boolean>("IsEditable")
 
-    /**
-     * @see SemanticsPropertyReceiver.maxTextLength
-     */
+    /** @see SemanticsPropertyReceiver.maxTextLength */
     val MaxTextLength = SemanticsPropertyKey<Int>("MaxTextLength")
 }
 
@@ -295,177 +236,118 @@
  * Ths object defines keys of the actions which can be set in semantics and performed on the
  * semantics node.
  *
- * Each of these is intended to be set by the respective SemanticsPropertyReceiver extension
- * instead of used directly.
+ * Each of these is intended to be set by the respective SemanticsPropertyReceiver extension instead
+ * of used directly.
  */
 /*@VisibleForTesting*/
 object SemanticsActions {
-    /**
-     * @see SemanticsPropertyReceiver.getTextLayoutResult
-     */
+    /** @see SemanticsPropertyReceiver.getTextLayoutResult */
     val GetTextLayoutResult =
         ActionPropertyKey<(MutableList<TextLayoutResult>) -> Boolean>("GetTextLayoutResult")
 
-    /**
-     * @see SemanticsPropertyReceiver.onClick
-     */
+    /** @see SemanticsPropertyReceiver.onClick */
     val OnClick = ActionPropertyKey<() -> Boolean>("OnClick")
 
-    /**
-     * @see SemanticsPropertyReceiver.onLongClick
-     */
+    /** @see SemanticsPropertyReceiver.onLongClick */
     val OnLongClick = ActionPropertyKey<() -> Boolean>("OnLongClick")
 
-    /**
-     * @see SemanticsPropertyReceiver.scrollBy
-     */
+    /** @see SemanticsPropertyReceiver.scrollBy */
     val ScrollBy = ActionPropertyKey<(x: Float, y: Float) -> Boolean>("ScrollBy")
 
-    /**
-     * @see SemanticsPropertyReceiver.scrollByOffset
-     */
+    /** @see SemanticsPropertyReceiver.scrollByOffset */
     val ScrollByOffset = SemanticsPropertyKey<suspend (offset: Offset) -> Offset>("ScrollByOffset")
 
-    /**
-     * @see SemanticsPropertyReceiver.scrollToIndex
-     */
+    /** @see SemanticsPropertyReceiver.scrollToIndex */
     val ScrollToIndex = ActionPropertyKey<(Int) -> Boolean>("ScrollToIndex")
 
-    /**
-     * @see SemanticsPropertyReceiver.onAutofillText
-     */
+    /** @see SemanticsPropertyReceiver.onAutofillText */
     // TODO(b/333102566): make this action public when Autofill is ready to go live
-    internal val OnAutofillText =
-        ActionPropertyKey<(AnnotatedString) -> Boolean>("OnAutofillText")
+    internal val OnAutofillText = ActionPropertyKey<(AnnotatedString) -> Boolean>("OnAutofillText")
 
-    /**
-     * @see SemanticsPropertyReceiver.setProgress
-     */
+    /** @see SemanticsPropertyReceiver.setProgress */
     val SetProgress = ActionPropertyKey<(progress: Float) -> Boolean>("SetProgress")
 
-    /**
-     * @see SemanticsPropertyReceiver.setSelection
-     */
+    /** @see SemanticsPropertyReceiver.setSelection */
     val SetSelection = ActionPropertyKey<(Int, Int, Boolean) -> Boolean>("SetSelection")
 
-    /**
-     * @see SemanticsPropertyReceiver.setText
-     */
+    /** @see SemanticsPropertyReceiver.setText */
     val SetText = ActionPropertyKey<(AnnotatedString) -> Boolean>("SetText")
 
-    /**
-     * @see SemanticsPropertyReceiver.setTextSubstitution
-     */
+    /** @see SemanticsPropertyReceiver.setTextSubstitution */
     val SetTextSubstitution = ActionPropertyKey<(AnnotatedString) -> Boolean>("SetTextSubstitution")
 
-    /**
-     * @see SemanticsPropertyReceiver.showTextSubstitution
-     */
+    /** @see SemanticsPropertyReceiver.showTextSubstitution */
     val ShowTextSubstitution = ActionPropertyKey<(Boolean) -> Boolean>("ShowTextSubstitution")
 
-    /**
-     * @see SemanticsPropertyReceiver.clearTextSubstitution
-     */
+    /** @see SemanticsPropertyReceiver.clearTextSubstitution */
     val ClearTextSubstitution = ActionPropertyKey<() -> Boolean>("ClearTextSubstitution")
 
-    /**
-     * @see SemanticsPropertyReceiver.insertTextAtCursor
-     */
+    /** @see SemanticsPropertyReceiver.insertTextAtCursor */
     val InsertTextAtCursor = ActionPropertyKey<(AnnotatedString) -> Boolean>("InsertTextAtCursor")
 
-    /**
-     * @see SemanticsPropertyReceiver.onImeAction
-     */
+    /** @see SemanticsPropertyReceiver.onImeAction */
     val OnImeAction = ActionPropertyKey<() -> Boolean>("PerformImeAction")
 
     // b/322269946
     @Suppress("unused")
     @Deprecated(
         message = "Use `SemanticsActions.OnImeAction` instead.",
-        replaceWith = ReplaceWith(
-            "OnImeAction",
-            "androidx.compose.ui.semantics.SemanticsActions.OnImeAction",
-        ),
+        replaceWith =
+            ReplaceWith(
+                "OnImeAction",
+                "androidx.compose.ui.semantics.SemanticsActions.OnImeAction",
+            ),
         level = DeprecationLevel.ERROR,
     )
     val PerformImeAction = ActionPropertyKey<() -> Boolean>("PerformImeAction")
 
-    /**
-     * @see SemanticsPropertyReceiver.copyText
-     */
+    /** @see SemanticsPropertyReceiver.copyText */
     val CopyText = ActionPropertyKey<() -> Boolean>("CopyText")
 
-    /**
-     * @see SemanticsPropertyReceiver.cutText
-     */
+    /** @see SemanticsPropertyReceiver.cutText */
     val CutText = ActionPropertyKey<() -> Boolean>("CutText")
 
-    /**
-     * @see SemanticsPropertyReceiver.pasteText
-     */
+    /** @see SemanticsPropertyReceiver.pasteText */
     val PasteText = ActionPropertyKey<() -> Boolean>("PasteText")
 
-    /**
-     * @see SemanticsPropertyReceiver.expand
-     */
+    /** @see SemanticsPropertyReceiver.expand */
     val Expand = ActionPropertyKey<() -> Boolean>("Expand")
 
-    /**
-     * @see SemanticsPropertyReceiver.collapse
-     */
+    /** @see SemanticsPropertyReceiver.collapse */
     val Collapse = ActionPropertyKey<() -> Boolean>("Collapse")
 
-    /**
-     * @see SemanticsPropertyReceiver.dismiss
-     */
+    /** @see SemanticsPropertyReceiver.dismiss */
     val Dismiss = ActionPropertyKey<() -> Boolean>("Dismiss")
 
-    /**
-     * @see SemanticsPropertyReceiver.requestFocus
-     */
+    /** @see SemanticsPropertyReceiver.requestFocus */
     val RequestFocus = ActionPropertyKey<() -> Boolean>("RequestFocus")
 
-    /**
-     * @see SemanticsPropertyReceiver.customActions
-     */
-    val CustomActions =
-        AccessibilityKey<List<CustomAccessibilityAction>>("CustomActions")
+    /** @see SemanticsPropertyReceiver.customActions */
+    val CustomActions = AccessibilityKey<List<CustomAccessibilityAction>>("CustomActions")
 
-    /**
-     * @see SemanticsPropertyReceiver.pageUp
-     */
+    /** @see SemanticsPropertyReceiver.pageUp */
     val PageUp = ActionPropertyKey<() -> Boolean>("PageUp")
 
-    /**
-     * @see SemanticsPropertyReceiver.pageLeft
-     */
+    /** @see SemanticsPropertyReceiver.pageLeft */
     val PageLeft = ActionPropertyKey<() -> Boolean>("PageLeft")
 
-    /**
-     * @see SemanticsPropertyReceiver.pageDown
-     */
+    /** @see SemanticsPropertyReceiver.pageDown */
     val PageDown = ActionPropertyKey<() -> Boolean>("PageDown")
 
-    /**
-     * @see SemanticsPropertyReceiver.pageRight
-     */
+    /** @see SemanticsPropertyReceiver.pageRight */
     val PageRight = ActionPropertyKey<() -> Boolean>("PageRight")
 
-    /**
-     * @see SemanticsPropertyReceiver.getScrollViewportLength
-     */
+    /** @see SemanticsPropertyReceiver.getScrollViewportLength */
     val GetScrollViewportLength =
         ActionPropertyKey<(MutableList<Float>) -> Boolean>("GetScrollViewportLength")
 }
 
 /**
- * SemanticsPropertyKey is the infrastructure for setting key/value pairs inside semantics blocks
- * in a type-safe way.  Each key has one particular statically defined value type T.
+ * SemanticsPropertyKey is the infrastructure for setting key/value pairs inside semantics blocks in
+ * a type-safe way. Each key has one particular statically defined value type T.
  */
 class SemanticsPropertyKey<T>(
-    /**
-     * The name of the property.  Should be the same as the constant from which it is accessed.
-     */
+    /** The name of the property. Should be the same as the constant from which it is accessed. */
     val name: String,
     internal val mergePolicy: (T?, T) -> T? = { parentValue, childValue ->
         parentValue ?: childValue
@@ -474,18 +356,17 @@
     /**
      * Whether this type of property provides information relevant to accessibility services.
      *
-     * Most built-in semantics properties are relevant to accessibility, but a very common
-     * exception is testTag. Nodes with only a testTag still need to be included
-     * in the AccessibilityNodeInfo tree because UIAutomator tests rely on
-     * that, but we mark them `isImportantForAccessibility = false` on the AccessibilityNodeInfo
-     * to inform accessibility services that they are best ignored.
+     * Most built-in semantics properties are relevant to accessibility, but a very common exception
+     * is testTag. Nodes with only a testTag still need to be included in the AccessibilityNodeInfo
+     * tree because UIAutomator tests rely on that, but we mark them `isImportantForAccessibility =
+     * false` on the AccessibilityNodeInfo to inform accessibility services that they are best
+     * ignored.
      *
-     * The default value is false and it is not exposed as a public API. That's because
-     * it is impossible in the first place for `SemanticsPropertyKey`s
-     * defined outside the UI package to be relevant to accessibility, because
-     * for each accessibility-relevant SemanticsProperty type to get plumbed into the
-     * AccessibilityNodeInfo, the private `createNodeInfo` implementation must also have
-     * a line of code.
+     * The default value is false and it is not exposed as a public API. That's because it is
+     * impossible in the first place for `SemanticsPropertyKey`s defined outside the UI package to
+     * be relevant to accessibility, because for each accessibility-relevant SemanticsProperty type
+     * to get plumbed into the AccessibilityNodeInfo, the private `createNodeInfo` implementation
+     * must also have a line of code.
      */
     internal var isImportantForAccessibility = false
         private set
@@ -509,20 +390,18 @@
      * Method implementing the semantics merge policy of a particular key.
      *
      * When mergeDescendants is set on a semantics node, then this function will called for each
-     * descendant node of a given key in depth-first-search order.  The parent
-     * value accumulates the result of merging the values seen so far, similar to reduce().
+     * descendant node of a given key in depth-first-search order. The parent value accumulates the
+     * result of merging the values seen so far, similar to reduce().
      *
-     * The default implementation returns the parent value if one exists, otherwise uses the
-     * child element.  This means by default, a SemanticsNode with mergeDescendants = true
-     * winds up with the first value found for each key in its subtree in depth-first-search order.
+     * The default implementation returns the parent value if one exists, otherwise uses the child
+     * element. This means by default, a SemanticsNode with mergeDescendants = true winds up with
+     * the first value found for each key in its subtree in depth-first-search order.
      */
     fun merge(parentValue: T?, childValue: T): T? {
         return mergePolicy(parentValue, childValue)
     }
 
-    /**
-     * Throws [UnsupportedOperationException].  Should not be called.
-     */
+    /** Throws [UnsupportedOperationException]. Should not be called. */
     // TODO(KT-6519): Remove this getter
     // TODO(KT-32770): Cannot deprecate this either as the getter is considered called by "by"
     final operator fun getValue(thisRef: SemanticsPropertyReceiver, property: KProperty<*>): T {
@@ -549,18 +428,10 @@
     )
 }
 
-internal fun <T> AccessibilityKey(
-    name: String
-) =
-    SemanticsPropertyKey<T>(
-        name = name,
-        isImportantForAccessibility = true
-    )
+internal fun <T> AccessibilityKey(name: String) =
+    SemanticsPropertyKey<T>(name = name, isImportantForAccessibility = true)
 
-internal fun <T> AccessibilityKey(
-    name: String,
-    mergePolicy: (T?, T) -> T?
-) =
+internal fun <T> AccessibilityKey(name: String, mergePolicy: (T?, T) -> T?) =
     SemanticsPropertyKey<T>(
         name = name,
         isImportantForAccessibility = true,
@@ -571,12 +442,12 @@
  * Standard accessibility action.
  *
  * @param label The description of this action
- * @param action The function to invoke when this action is performed. The function should return
- * a boolean result indicating whether the action is successfully handled. For example, a scroll
- * forward action should return false if the widget is not enabled or has reached the end of the
- * list. If multiple semantics blocks with the same AccessibilityAction are provided, the
- * resulting AccessibilityAction's label/action will be the label/action of the outermost
- * modifier with this key and nonnull label/action, or null if no nonnull label/action is found.
+ * @param action The function to invoke when this action is performed. The function should return a
+ *   boolean result indicating whether the action is successfully handled. For example, a scroll
+ *   forward action should return false if the widget is not enabled or has reached the end of the
+ *   list. If multiple semantics blocks with the same AccessibilityAction are provided, the
+ *   resulting AccessibilityAction's label/action will be the label/action of the outermost modifier
+ *   with this key and nonnull label/action, or null if no nonnull label/action is found.
  */
 class AccessibilityAction<T : Function<Boolean>>(val label: String?, val action: T?) {
     override fun equals(other: Any?): Boolean {
@@ -602,9 +473,7 @@
 
 @Suppress("NOTHING_TO_INLINE")
 // inline to break static initialization cycle issue
-private inline fun <T : Function<Boolean>> ActionPropertyKey(
-    name: String
-) =
+private inline fun <T : Function<Boolean>> ActionPropertyKey(name: String) =
     AccessibilityKey<AccessibilityAction<T>>(
         name = name,
         mergePolicy = { parentValue, childValue ->
@@ -620,7 +489,7 @@
  *
  * @param label The description of this action
  * @param action The function to invoke when this action is performed. The function should have no
- * arguments and return a boolean result indicating whether the action is successfully handled.
+ *   arguments and return a boolean result indicating whether the action is successfully handled.
  */
 class CustomAccessibilityAction(val label: String, val action: () -> Boolean) {
     override fun equals(other: Any?): Boolean {
@@ -645,14 +514,14 @@
 }
 
 /**
- * Accessibility range information, to represent the status of a progress bar or
- * seekable progress bar.
+ * Accessibility range information, to represent the status of a progress bar or seekable progress
+ * bar.
  *
  * @param current current value in the range. Must not be NaN.
  * @param range range of this node
  * @param steps if greater than `0`, specifies the number of discrete values, evenly distributed
- * between across the whole value range. If `0`, any value from the range specified can be chosen.
- * Cannot be less than `0`.
+ *   between across the whole value range. If `0`, any value from the range specified can be chosen.
+ *   Cannot be less than `0`.
  */
 class ProgressBarRangeInfo(
     val current: Float,
@@ -665,9 +534,7 @@
     }
 
     companion object {
-        /**
-         * Accessibility range information to present indeterminate progress bar
-         */
+        /** Accessibility range information to present indeterminate progress bar */
         val Indeterminate = ProgressBarRangeInfo(0f, 0f..0f)
     }
 
@@ -697,10 +564,9 @@
 /**
  * Information about the collection.
  *
- * A collection of items has [rowCount] rows and [columnCount] columns.
- * For example, a vertical list is a collection with one column, as many rows as the list items
- * that are important for accessibility; A table is a collection with several rows and several
- * columns.
+ * A collection of items has [rowCount] rows and [columnCount] columns. For example, a vertical list
+ * is a collection with one column, as many rows as the list items that are important for
+ * accessibility; A table is a collection with several rows and several columns.
  *
  * @param rowCount the number of rows in the collection, or -1 if unknown
  * @param columnCount the number of columns in the collection, or -1 if unknown
@@ -710,10 +576,9 @@
 /**
  * Information about the item of a collection.
  *
- * A collection item is contained in a collection, it starts at a given [rowIndex] and
- * [columnIndex] in the collection, and spans one or more rows and columns. For example, a header
- * of two related table columns starts at the first row and the first column, spans one row and
- * two columns.
+ * A collection item is contained in a collection, it starts at a given [rowIndex] and [columnIndex]
+ * in the collection, and spans one or more rows and columns. For example, a header of two related
+ * table columns starts at the first row and the first column, spans one row and two columns.
  *
  * @param rowIndex the index of the row at which item is located
  * @param rowSpan the number of rows the item spans
@@ -733,8 +598,8 @@
  * @param value current 0-based scroll position value (either in pixels, or lazy-item count)
  * @param maxValue maximum bound for [value], or [Float.POSITIVE_INFINITY] if still unknown
  * @param reverseScrolling for horizontal scroll, when this is `true`, 0 [value] will mean right,
- * when`false`, 0 [value] will mean left. For vertical scroll, when this is `true`, 0 [value] will
- * mean bottom, when `false`, 0 [value] will mean top
+ *   when`false`, 0 [value] will mean left. For vertical scroll, when this is `true`, 0 [value] will
+ *   mean bottom, when `false`, 0 [value] will mean top
  */
 class ScrollAxisRange(
     val value: () -> Float,
@@ -747,11 +612,11 @@
 }
 
 /**
- * The type of user interface element. Accessibility services might use this to describe the
- * element or do customizations. Most roles can be automatically resolved by the semantics
- * properties of this element. But some elements with subtle differences need an exact role. If an
- * exact role is not listed, [SemanticsPropertyReceiver.role] should not be set and the framework
- * will automatically resolve it.
+ * The type of user interface element. Accessibility services might use this to describe the element
+ * or do customizations. Most roles can be automatically resolved by the semantics properties of
+ * this element. But some elements with subtle differences need an exact role. If an exact role is
+ * not listed, [SemanticsPropertyReceiver.role] should not be set and the framework will
+ * automatically resolve it.
  */
 @Immutable
 @kotlin.jvm.JvmInline
@@ -780,17 +645,18 @@
         val Switch = Role(2)
 
         /**
-         * This element is a RadioButton which is a component to represent two states, selected and not
-         * selected. Associated semantics properties for accessibility: [SemanticsProperties.Disabled],
-         * [SemanticsProperties.StateDescription], [SemanticsActions.OnClick]
+         * This element is a RadioButton which is a component to represent two states, selected and
+         * not selected. Associated semantics properties for accessibility:
+         * [SemanticsProperties.Disabled], [SemanticsProperties.StateDescription],
+         * [SemanticsActions.OnClick]
          */
         val RadioButton = Role(3)
 
         /**
          * This element is a Tab which represents a single page of content using a text label and/or
-         * icon. A Tab also has two states: selected and not selected. Associated semantics properties
-         * for accessibility: [SemanticsProperties.Disabled], [SemanticsProperties.StateDescription],
-         * [SemanticsActions.OnClick]
+         * icon. A Tab also has two states: selected and not selected. Associated semantics
+         * properties for accessibility: [SemanticsProperties.Disabled],
+         * [SemanticsProperties.StateDescription], [SemanticsActions.OnClick]
          */
         val Tab = Role(4)
 
@@ -801,57 +667,58 @@
         val Image = Role(5)
 
         /**
-         * This element is associated with a drop down menu.
-         * Associated semantics properties for accessibility:
-         * [SemanticsActions.OnClick]
+         * This element is associated with a drop down menu. Associated semantics properties for
+         * accessibility: [SemanticsActions.OnClick]
          */
         val DropdownList = Role(6)
     }
 
-    override fun toString() = when (this) {
-        Button -> "Button"
-        Checkbox -> "Checkbox"
-        Switch -> "Switch"
-        RadioButton -> "RadioButton"
-        Tab -> "Tab"
-        Image -> "Image"
-        DropdownList -> "DropdownList"
-        else -> "Unknown"
-    }
+    override fun toString() =
+        when (this) {
+            Button -> "Button"
+            Checkbox -> "Checkbox"
+            Switch -> "Switch"
+            RadioButton -> "RadioButton"
+            Tab -> "Tab"
+            Image -> "Image"
+            DropdownList -> "DropdownList"
+            else -> "Unknown"
+        }
 }
 
 /**
  * The mode of live region. Live region indicates to accessibility services they should
- * automatically notify the user about changes to the node's content description or text, or to
- * the content descriptions or text of the node's children (where applicable).
+ * automatically notify the user about changes to the node's content description or text, or to the
+ * content descriptions or text of the node's children (where applicable).
  */
 @Immutable
 @kotlin.jvm.JvmInline
 value class LiveRegionMode private constructor(@Suppress("unused") private val value: Int) {
     companion object {
         /**
-         * Live region mode specifying that accessibility services should announce
-         * changes to this node.
+         * Live region mode specifying that accessibility services should announce changes to this
+         * node.
          */
         val Polite = LiveRegionMode(0)
 
         /**
-         * Live region mode specifying that accessibility services should interrupt
-         * ongoing speech to immediately announce changes to this node.
+         * Live region mode specifying that accessibility services should interrupt ongoing speech
+         * to immediately announce changes to this node.
          */
         val Assertive = LiveRegionMode(1)
     }
 
-    override fun toString() = when (this) {
-        Polite -> "Polite"
-        Assertive -> "Assertive"
-        else -> "Unknown"
-    }
+    override fun toString() =
+        when (this) {
+            Polite -> "Polite"
+            Assertive -> "Assertive"
+            else -> "Unknown"
+        }
 }
 
 /**
- * SemanticsPropertyReceiver is the scope provided by semantics {} blocks, letting you set
- * key/value pairs primarily via extension functions.
+ * SemanticsPropertyReceiver is the scope provided by semantics {} blocks, letting you set key/value
+ * pairs primarily via extension functions.
  */
 interface SemanticsPropertyReceiver {
     operator fun <T> set(key: SemanticsPropertyKey<T>, value: T)
@@ -863,10 +730,10 @@
  * If this is not set, accessibility services will present the [text][SemanticsProperties.Text] of
  * this node as the content.
  *
- * This typically should not be set directly by applications, because some screen readers will
- * cease presenting other relevant information when this property is present. This is intended
- * to be used via Foundation components which are inherently intractable to automatically
- * describe, such as Image, Icon, and Canvas.
+ * This typically should not be set directly by applications, because some screen readers will cease
+ * presenting other relevant information when this property is present. This is intended to be used
+ * via Foundation components which are inherently intractable to automatically describe, such as
+ * Image, Icon, and Canvas.
  */
 var SemanticsPropertyReceiver.contentDescription: String
     get() = throwSemanticsGetNotSupported()
@@ -877,16 +744,15 @@
 /**
  * Developer-set state description of the semantics node.
  *
- * For example: on/off. If this not set, accessibility services will derive the state from
- * other semantics properties, like [ProgressBarRangeInfo], but it is not guaranteed and the format
- * will be decided by accessibility services.
+ * For example: on/off. If this not set, accessibility services will derive the state from other
+ * semantics properties, like [ProgressBarRangeInfo], but it is not guaranteed and the format will
+ * be decided by accessibility services.
  */
 var SemanticsPropertyReceiver.stateDescription by SemanticsProperties.StateDescription
 
 /**
- * The semantics represents a range of possible values with a current value.
- * For example, when used on a slider control, this will allow screen readers to communicate
- * the slider's state.
+ * The semantics represents a range of possible values with a current value. For example, when used
+ * on a slider control, this will allow screen readers to communicate the slider's state.
  */
 var SemanticsPropertyReceiver.progressBarRangeInfo by SemanticsProperties.ProgressBarRangeInfo
 
@@ -902,17 +768,17 @@
 /**
  * Accessibility-friendly title for a screen's pane. For accessibility purposes, a pane is a
  * visually distinct portion of a window, such as the contents of a open drawer. In order for
- * accessibility services to understand a pane's window-like behavior, you should give
- * descriptive titles to your app's panes. Accessibility services can then provide more granular
- * information to users when a pane's appearance or content changes.
+ * accessibility services to understand a pane's window-like behavior, you should give descriptive
+ * titles to your app's panes. Accessibility services can then provide more granular information to
+ * users when a pane's appearance or content changes.
  *
  * @see SemanticsProperties.PaneTitle
  */
 var SemanticsPropertyReceiver.paneTitle by SemanticsProperties.PaneTitle
 
 /**
- * Whether this semantics node is disabled. Note that proper [SemanticsActions] should still
- * be added when this property is set.
+ * Whether this semantics node is disabled. Note that proper [SemanticsActions] should still be
+ * added when this property is set.
  *
  * @see SemanticsProperties.Disabled
  */
@@ -923,10 +789,10 @@
 /**
  * This node is marked as live region for accessibility. This indicates to accessibility services
  * they should automatically notify the user about changes to the node's content description or
- * text, or to the content descriptions or text of the node's children (where applicable). It
- * should be used with caution, especially with assertive mode which immediately stops the
- * current audio and the user does not hear the rest of the content. An example of proper use is
- * a Snackbar which is marked as [LiveRegionMode.Polite].
+ * text, or to the content descriptions or text of the node's children (where applicable). It should
+ * be used with caution, especially with assertive mode which immediately stops the current audio
+ * and the user does not hear the rest of the content. An example of proper use is a Snackbar which
+ * is marked as [LiveRegionMode.Polite].
  *
  * @see SemanticsProperties.LiveRegion
  * @see LiveRegionMode
@@ -942,8 +808,8 @@
 var SemanticsPropertyReceiver.focused by SemanticsProperties.Focused
 
 /**
- * Whether this semantics node is a container. This is defined as a node whose function
- * is to serve as a boundary or border in organizing its children.
+ * Whether this semantics node is a container. This is defined as a node whose function is to serve
+ * as a boundary or border in organizing its children.
  *
  * @see SemanticsProperties.IsContainer
  */
@@ -954,8 +820,8 @@
 var SemanticsPropertyReceiver.isContainer by SemanticsProperties.IsTraversalGroup
 
 /**
- * Whether this semantics node is a traversal group. This is defined as a node whose function
- * is to serve as a boundary or border in organizing its children.
+ * Whether this semantics node is a traversal group. This is defined as a node whose function is to
+ * serve as a boundary or border in organizing its children.
  *
  * @see SemanticsProperties.IsTraversalGroup
  */
@@ -964,10 +830,10 @@
 /**
  * Whether this node is specially known to be invisible to the user.
  *
- * For example, if the node is currently occluded by a dark semitransparent
- * pane above it, then for all practical purposes the node is invisible to the user,
- * but the system cannot automatically determine that.  To make the screen reader linear
- * navigation skip over this type of invisible node, this property can be set.
+ * For example, if the node is currently occluded by a dark semitransparent pane above it, then for
+ * all practical purposes the node is invisible to the user, but the system cannot automatically
+ * determine that. To make the screen reader linear navigation skip over this type of invisible
+ * node, this property can be set.
  *
  * If looking for a way to hide semantics of small items from screen readers because they're
  * redundant with semantics of their parent, consider [SemanticsModifier.clearAndSetSemantics]
@@ -984,7 +850,7 @@
  * This API can be used to indicate to Autofill services what _kind of field_ is associated with
  * this node. Not to be confused with the _data type_ to be entered into the field.
  *
- *  @see SemanticsProperties.ContentType
+ * @see SemanticsProperties.ContentType
  */
 // TODO(b/333102566): make these semantics properties public when Autofill is ready to go live
 internal var SemanticsPropertyReceiver.contentType by SemanticsProperties.ContentType
@@ -995,7 +861,7 @@
  * This API can be used to indicate to Autofill services what _kind of data_ is meant to be
  * suggested for this field. Not to be confused with the _type_ of the field.
  *
- *  @see SemanticsProperties.ContentType
+ * @see SemanticsProperties.ContentType
  */
 // TODO(b/333102566): make these semantics properties public when Autofill is ready to go live
 internal var SemanticsPropertyReceiver.contentDataType by SemanticsProperties.ContentDataType
@@ -1010,29 +876,24 @@
  *
  * For example,` traversalIndex = -1f` can be used to force a top bar to be ordered earlier, and
  * `traversalIndex = 1f` to make a bottom bar ordered last, in the edge cases where this does not
- * happen by default.  As another example, if you need to reorder two Buttons within a Row, then
- * you can set `isTraversalGroup = true` on the Row, and set `traversalIndex` on one of the Buttons.
+ * happen by default. As another example, if you need to reorder two Buttons within a Row, then you
+ * can set `isTraversalGroup = true` on the Row, and set `traversalIndex` on one of the Buttons.
  *
  * Note that if `traversalIndex` seems to have no effect, be sure to set `isTraversalGroup = true`
  * as well.
  */
 var SemanticsPropertyReceiver.traversalIndex by SemanticsProperties.TraversalIndex
 
-/**
- * The horizontal scroll state of this node if this node is scrollable.
- */
-var SemanticsPropertyReceiver.horizontalScrollAxisRange
-    by SemanticsProperties.HorizontalScrollAxisRange
+/** The horizontal scroll state of this node if this node is scrollable. */
+var SemanticsPropertyReceiver.horizontalScrollAxisRange by
+    SemanticsProperties.HorizontalScrollAxisRange
+
+/** The vertical scroll state of this node if this node is scrollable. */
+var SemanticsPropertyReceiver.verticalScrollAxisRange by SemanticsProperties.VerticalScrollAxisRange
 
 /**
- * The vertical scroll state of this node if this node is scrollable.
- */
-var SemanticsPropertyReceiver.verticalScrollAxisRange
-    by SemanticsProperties.VerticalScrollAxisRange
-
-/**
- * Whether this semantics node represents a Popup. Not to be confused with if this node is
- * _part of_ a Popup.
+ * Whether this semantics node represents a Popup. Not to be confused with if this node is _part of_
+ * a Popup.
  */
 fun SemanticsPropertyReceiver.popup() {
     this[SemanticsProperties.IsPopup] = Unit
@@ -1046,11 +907,11 @@
 }
 
 /**
- * The type of user interface element. Accessibility services might use this to describe the
- * element or do customizations. Most roles can be automatically resolved by the semantics
- * properties of this element. But some elements with subtle differences need an exact role. If
- * an exact role is not listed in [Role], this property should not be set and the framework will
- * automatically resolve it.
+ * The type of user interface element. Accessibility services might use this to describe the element
+ * or do customizations. Most roles can be automatically resolved by the semantics properties of
+ * this element. But some elements with subtle differences need an exact role. If an exact role is
+ * not listed in [Role], this property should not be set and the framework will automatically
+ * resolve it.
  */
 var SemanticsPropertyReceiver.role by SemanticsProperties.Role
 
@@ -1059,11 +920,11 @@
  *
  * This can be used to find nodes in testing frameworks:
  * - In Compose's built-in unit test framework, use with
- * [onNodeWithTag][androidx.compose.ui.test.onNodeWithTag].
+ *   [onNodeWithTag][androidx.compose.ui.test.onNodeWithTag].
  * - For newer AccessibilityNodeInfo-based integration test frameworks, it can be matched in the
- * extras with key "androidx.compose.ui.semantics.testTag"
+ *   extras with key "androidx.compose.ui.semantics.testTag"
  * - For legacy AccessibilityNodeInfo-based integration tests, it's optionally exposed as the
- * resource id if [testTagsAsResourceId] is true (for matching with 'By.res' in UIAutomator).
+ *   resource id if [testTagsAsResourceId] is true (for matching with 'By.res' in UIAutomator).
  */
 var SemanticsPropertyReceiver.testTag by SemanticsProperties.TestTag
 
@@ -1088,8 +949,8 @@
  * Whether this element is showing the text substitution. This property is only available after
  * calling [SemanticsActions.SetTextSubstitution].
  */
-var SemanticsPropertyReceiver.isShowingTextSubstitution
-    by SemanticsProperties.IsShowingTextSubstitution
+var SemanticsPropertyReceiver.isShowingTextSubstitution by
+    SemanticsProperties.IsShowingTextSubstitution
 
 /**
  * Input text of the text field with visual transformation applied to it. It must be a real text
@@ -1098,9 +959,7 @@
  */
 var SemanticsPropertyReceiver.editableText by SemanticsProperties.EditableText
 
-/**
- * Text selection range for the text field.
- */
+/** Text selection range for the text field. */
 var SemanticsPropertyReceiver.textSelectionRange by SemanticsProperties.TextSelectionRange
 
 /**
@@ -1145,14 +1004,10 @@
  */
 var SemanticsPropertyReceiver.toggleableState by SemanticsProperties.ToggleableState
 
-/**
- * Whether this semantics node is editable, e.g. an editable text field.
- */
+/** Whether this semantics node is editable, e.g. an editable text field. */
 var SemanticsPropertyReceiver.isEditable by SemanticsProperties.IsEditable
 
-/**
- * The node is marked as a password.
- */
+/** The node is marked as a password. */
 fun SemanticsPropertyReceiver.password() {
     this[SemanticsProperties.Password] = Unit
 }
@@ -1167,8 +1022,8 @@
 }
 
 /**
- * The index of an item identified by a given key. The key is usually defined during the creation
- * of the container. If the key did not match any of the items' keys, the [mapping] must return -1.
+ * The index of an item identified by a given key. The key is usually defined during the creation of
+ * the container. If the key did not match any of the items' keys, the [mapping] must return -1.
  */
 fun SemanticsPropertyReceiver.indexForKey(mapping: (Any) -> Int) {
     this[SemanticsProperties.IndexForKey] = mapping
@@ -1183,10 +1038,10 @@
 /**
  * The node is marked as a collection of horizontally or vertically stacked selectable elements.
  *
- * Unlike [collectionInfo] which marks a collection of any elements and asks developer to
- * provide all the required information like number of elements etc., this semantics will
- * populate the number of selectable elements automatically. Note that if you use this semantics
- * with lazy collections, it won't get the number of elements in the collection.
+ * Unlike [collectionInfo] which marks a collection of any elements and asks developer to provide
+ * all the required information like number of elements etc., this semantics will populate the
+ * number of selectable elements automatically. Note that if you use this semantics with lazy
+ * collections, it won't get the number of elements in the collection.
  *
  * @see SemanticsPropertyReceiver.selected
  */
@@ -1194,14 +1049,12 @@
     this[SemanticsProperties.SelectableGroup] = Unit
 }
 
-/**
- * Custom actions which are defined by app developers.
- */
+/** Custom actions which are defined by app developers. */
 var SemanticsPropertyReceiver.customActions by SemanticsActions.CustomActions
 
 /**
- * Action to get a Text/TextField node's [TextLayoutResult]. The result is the first element
- * of layout (the argument of the AccessibilityAction).
+ * Action to get a Text/TextField node's [TextLayoutResult]. The result is the first element of
+ * layout (the argument of the AccessibilityAction).
  *
  * @param label Optional label for this action.
  * @param action Action to be performed when the [SemanticsActions.GetTextLayoutResult] is called.
@@ -1262,9 +1115,7 @@
  *
  * @param action Action to be performed when [SemanticsActions.ScrollByOffset] is called.
  */
-fun SemanticsPropertyReceiver.scrollByOffset(
-    action: suspend (offset: Offset) -> Offset
-) {
+fun SemanticsPropertyReceiver.scrollByOffset(action: suspend (offset: Offset) -> Offset) {
     this[SemanticsActions.ScrollByOffset] = action
 }
 
@@ -1273,10 +1124,7 @@
  *
  * The [action] should throw an [IllegalArgumentException] if the index is out of bounds.
  */
-fun SemanticsPropertyReceiver.scrollToIndex(
-    label: String? = null,
-    action: (Int) -> Boolean
-) {
+fun SemanticsPropertyReceiver.scrollToIndex(label: String? = null, action: (Int) -> Boolean) {
     this[SemanticsActions.ScrollToIndex] = AccessibilityAction(label, action)
 }
 
@@ -1398,7 +1246,6 @@
  * @param imeActionType The IME type, such as [ImeAction.Next] or [ImeAction.Search]
  * @param label Optional label for this action.
  * @param action Action to be performed when [SemanticsActions.OnImeAction] is called.
- *
  * @see SemanticsProperties.ImeAction
  * @see SemanticsActions.OnImeAction
  */
@@ -1415,30 +1262,27 @@
 @Suppress("unused")
 @Deprecated(
     message = "Use `SemanticsPropertyReceiver.onImeAction` instead.",
-    replaceWith = ReplaceWith(
-        "onImeAction(imeActionType = ImeAction.Default, label = label, action = action)",
-        "androidx.compose.ui.semantics.onImeAction",
-        "androidx.compose.ui.text.input.ImeAction",
-    ),
+    replaceWith =
+        ReplaceWith(
+            "onImeAction(imeActionType = ImeAction.Default, label = label, action = action)",
+            "androidx.compose.ui.semantics.onImeAction",
+            "androidx.compose.ui.text.input.ImeAction",
+        ),
     level = DeprecationLevel.ERROR,
 )
-fun SemanticsPropertyReceiver.performImeAction(
-    label: String? = null,
-    action: (() -> Boolean)?
-) {
+fun SemanticsPropertyReceiver.performImeAction(label: String? = null, action: (() -> Boolean)?) {
     this[SemanticsActions.OnImeAction] = AccessibilityAction(label, action)
 }
 
 /**
  * Action to set text selection by character index range.
  *
- * If this action is provided, the selection data must be provided
- * using [textSelectionRange].
+ * If this action is provided, the selection data must be provided using [textSelectionRange].
  *
  * @param label Optional label for this action.
  * @param action Action to be performed when the [SemanticsActions.SetSelection] is called. The
- * parameters to the action are: `startIndex`, `endIndex`, and whether the indices are relative
- * to the original text or the transformed text (when a `VisualTransformation` is applied).
+ *   parameters to the action are: `startIndex`, `endIndex`, and whether the indices are relative to
+ *   the original text or the transformed text (when a `VisualTransformation` is applied).
  */
 fun SemanticsPropertyReceiver.setSelection(
     label: String? = null,
@@ -1453,10 +1297,7 @@
  * @param label Optional label for this action.
  * @param action Action to be performed when the [SemanticsActions.CopyText] is called.
  */
-fun SemanticsPropertyReceiver.copyText(
-    label: String? = null,
-    action: (() -> Boolean)?
-) {
+fun SemanticsPropertyReceiver.copyText(label: String? = null, action: (() -> Boolean)?) {
     this[SemanticsActions.CopyText] = AccessibilityAction(label, action)
 }
 
@@ -1466,29 +1307,21 @@
  * @param label Optional label for this action.
  * @param action Action to be performed when the [SemanticsActions.CutText] is called.
  */
-fun SemanticsPropertyReceiver.cutText(
-    label: String? = null,
-    action: (() -> Boolean)?
-) {
+fun SemanticsPropertyReceiver.cutText(label: String? = null, action: (() -> Boolean)?) {
     this[SemanticsActions.CutText] = AccessibilityAction(label, action)
 }
 
 /**
- * This function adds the [SemanticsActions.PasteText] to the [SemanticsPropertyReceiver].
- * Use it to indicate that element is open for accepting paste data from the clipboard. There is
- * no need to check if the clipboard data available as this is done by the framework.
- * For this action to be triggered, the element must also have the [SemanticsProperties.Focused]
- * property set.
+ * This function adds the [SemanticsActions.PasteText] to the [SemanticsPropertyReceiver]. Use it to
+ * indicate that element is open for accepting paste data from the clipboard. There is no need to
+ * check if the clipboard data available as this is done by the framework. For this action to be
+ * triggered, the element must also have the [SemanticsProperties.Focused] property set.
  *
  * @param label Optional label for this action.
  * @param action Action to be performed when the [SemanticsActions.PasteText] is called.
- *
  * @see focused
  */
-fun SemanticsPropertyReceiver.pasteText(
-    label: String? = null,
-    action: (() -> Boolean)?
-) {
+fun SemanticsPropertyReceiver.pasteText(label: String? = null, action: (() -> Boolean)?) {
     this[SemanticsActions.PasteText] = AccessibilityAction(label, action)
 }
 
@@ -1498,10 +1331,7 @@
  * @param label Optional label for this action.
  * @param action Action to be performed when the [SemanticsActions.Expand] is called.
  */
-fun SemanticsPropertyReceiver.expand(
-    label: String? = null,
-    action: (() -> Boolean)?
-) {
+fun SemanticsPropertyReceiver.expand(label: String? = null, action: (() -> Boolean)?) {
     this[SemanticsActions.Expand] = AccessibilityAction(label, action)
 }
 
@@ -1511,10 +1341,7 @@
  * @param label Optional label for this action.
  * @param action Action to be performed when the [SemanticsActions.Collapse] is called.
  */
-fun SemanticsPropertyReceiver.collapse(
-    label: String? = null,
-    action: (() -> Boolean)?
-) {
+fun SemanticsPropertyReceiver.collapse(label: String? = null, action: (() -> Boolean)?) {
     this[SemanticsActions.Collapse] = AccessibilityAction(label, action)
 }
 
@@ -1524,10 +1351,7 @@
  * @param label Optional label for this action.
  * @param action Action to be performed when the [SemanticsActions.Dismiss] is called.
  */
-fun SemanticsPropertyReceiver.dismiss(
-    label: String? = null,
-    action: (() -> Boolean)?
-) {
+fun SemanticsPropertyReceiver.dismiss(label: String? = null, action: (() -> Boolean)?) {
     this[SemanticsActions.Dismiss] = AccessibilityAction(label, action)
 }
 
@@ -1547,10 +1371,7 @@
  * @param label Optional label for this action.
  * @param action Action to be performed when the [SemanticsActions.PageUp] is called.
  */
-fun SemanticsPropertyReceiver.pageUp(
-    label: String? = null,
-    action: (() -> Boolean)?
-) {
+fun SemanticsPropertyReceiver.pageUp(label: String? = null, action: (() -> Boolean)?) {
     this[SemanticsActions.PageUp] = AccessibilityAction(label, action)
 }
 
@@ -1560,10 +1381,7 @@
  * @param label Optional label for this action.
  * @param action Action to be performed when the [SemanticsActions.PageDown] is called.
  */
-fun SemanticsPropertyReceiver.pageDown(
-    label: String? = null,
-    action: (() -> Boolean)?
-) {
+fun SemanticsPropertyReceiver.pageDown(label: String? = null, action: (() -> Boolean)?) {
     this[SemanticsActions.PageDown] = AccessibilityAction(label, action)
 }
 
@@ -1573,10 +1391,7 @@
  * @param label Optional label for this action.
  * @param action Action to be performed when the [SemanticsActions.PageLeft] is called.
  */
-fun SemanticsPropertyReceiver.pageLeft(
-    label: String? = null,
-    action: (() -> Boolean)?
-) {
+fun SemanticsPropertyReceiver.pageLeft(label: String? = null, action: (() -> Boolean)?) {
     this[SemanticsActions.PageLeft] = AccessibilityAction(label, action)
 }
 
@@ -1586,10 +1401,7 @@
  * @param label Optional label for this action.
  * @param action Action to be performed when the [SemanticsActions.PageRight] is called.
  */
-fun SemanticsPropertyReceiver.pageRight(
-    label: String? = null,
-    action: (() -> Boolean)?
-) {
+fun SemanticsPropertyReceiver.pageRight(label: String? = null, action: (() -> Boolean)?) {
     this[SemanticsActions.PageRight] = AccessibilityAction(label, action)
 }
 
@@ -1598,19 +1410,20 @@
  *
  * @param label Optional label for this action.
  * @param action Action to be performed when the [SemanticsActions.GetScrollViewportLength] is
- * called.
+ *   called.
  */
 fun SemanticsPropertyReceiver.getScrollViewportLength(
     label: String? = null,
     action: (() -> Float?)
 ) {
-    this[SemanticsActions.GetScrollViewportLength] = AccessibilityAction(label) {
-        val viewport = action.invoke()
-        if (viewport == null) {
-            false
-        } else {
-            it.add(viewport)
-            true
+    this[SemanticsActions.GetScrollViewportLength] =
+        AccessibilityAction(label) {
+            val viewport = action.invoke()
+            if (viewport == null) {
+                false
+            } else {
+                it.add(viewport)
+                true
+            }
         }
-    }
 }
diff --git a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/semantics/SemanticsSort.kt b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/semantics/SemanticsSort.kt
index 62a5bdb..94e0a61 100644
--- a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/semantics/SemanticsSort.kt
+++ b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/semantics/SemanticsSort.kt
@@ -1,4 +1,5 @@
 @file:Suppress("ktlint")
+
 /*
  * Copyright 2023 The Android Open Source Project
  *
@@ -21,4 +22,4 @@
 
 internal fun LayoutNode.findOneLayerOfSemanticsWrappersSortedByBounds() {
     fun shimToPreserveFilenameAPI() {}
-}
\ No newline at end of file
+}
diff --git a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/state/ToggleableState.kt b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/state/ToggleableState.kt
index 7a03d3a..f08dff2 100644
--- a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/state/ToggleableState.kt
+++ b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/state/ToggleableState.kt
@@ -19,21 +19,13 @@
 import androidx.compose.ui.state.ToggleableState.Off
 import androidx.compose.ui.state.ToggleableState.On
 
-/**
- * Enum that represents possible toggleable states.
- */
+/** Enum that represents possible toggleable states. */
 enum class ToggleableState {
-    /**
-     * State that means a component is on
-     */
+    /** State that means a component is on */
     On,
-    /**
-     * State that means a component is off
-     */
+    /** State that means a component is off */
     Off,
-    /**
-     * State that means that on/off value of a component cannot be determined
-     */
+    /** State that means that on/off value of a component cannot be determined */
     Indeterminate
 }
 
diff --git a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/text/TextMeasurerHelper.kt b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/text/TextMeasurerHelper.kt
index 9c0a0a8..7ecf1b8 100644
--- a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/text/TextMeasurerHelper.kt
+++ b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/text/TextMeasurerHelper.kt
@@ -22,9 +22,7 @@
 import androidx.compose.ui.platform.LocalFontFamilyResolver
 import androidx.compose.ui.platform.LocalLayoutDirection
 
-/**
- * This value should reflect the default cache size for TextMeasurer.
- */
+/** This value should reflect the default cache size for TextMeasurer. */
 private val DefaultCacheSize: Int = 8
 
 /**
@@ -34,16 +32,14 @@
  * caching behavior.
  *
  * @param cacheSize Capacity of internal cache inside [TextMeasurer]. Size unit is the number of
- * unique text layout inputs that are measured. Value of this parameter highly depends on the
- * consumer use case. Provide a cache size that is in line with how many distinct text layouts are
- * going to be calculated by this measurer repeatedly. If you are animating font attributes, or any
- * other layout affecting input, cache can be skipped because most repeated measure calls would miss
- * the cache.
+ *   unique text layout inputs that are measured. Value of this parameter highly depends on the
+ *   consumer use case. Provide a cache size that is in line with how many distinct text layouts are
+ *   going to be calculated by this measurer repeatedly. If you are animating font attributes, or
+ *   any other layout affecting input, cache can be skipped because most repeated measure calls
+ *   would miss the cache.
  */
 @Composable
-fun rememberTextMeasurer(
-    cacheSize: Int = DefaultCacheSize
-): TextMeasurer {
+fun rememberTextMeasurer(cacheSize: Int = DefaultCacheSize): TextMeasurer {
     val fontFamilyResolver = LocalFontFamilyResolver.current
     val density = LocalDensity.current
     val layoutDirection = LocalLayoutDirection.current
diff --git a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/viewinterop/InteropView.kt b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/viewinterop/InteropView.kt
index 9bc1832..0f2da64 100644
--- a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/viewinterop/InteropView.kt
+++ b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/viewinterop/InteropView.kt
@@ -23,5 +23,4 @@
  * hierarchy to allow for interoperability. Not all platforms support interoperability in this way,
  * in which case the typealias will resolve to [Any].
  */
-@InternalComposeUiApi
-expect class InteropView
+@InternalComposeUiApi expect class InteropView
diff --git a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/viewinterop/InteropViewFactoryHolder.kt b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/viewinterop/InteropViewFactoryHolder.kt
index 5589414..139cd77 100644
--- a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/viewinterop/InteropViewFactoryHolder.kt
+++ b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/viewinterop/InteropViewFactoryHolder.kt
@@ -22,7 +22,10 @@
 @InternalComposeUiApi
 internal expect class InteropViewFactoryHolder : ComposeNodeLifecycleCallback {
     fun getInteropView(): InteropView?
+
     override fun onReuse()
+
     override fun onDeactivate()
+
     override fun onRelease()
 }
diff --git a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/window/Dialog.kt b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/window/Dialog.kt
index 2acc6da..87e634ea 100644
--- a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/window/Dialog.kt
+++ b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/window/Dialog.kt
@@ -23,13 +23,14 @@
  * Properties used to customize the behavior of a [Dialog].
  *
  * @property dismissOnBackPress whether the popup can be dismissed by pressing the back button
- *  * on Android or escape key on desktop.
- * If true, pressing the back button will call onDismissRequest.
+ *     * on Android or escape key on desktop. If true, pressing the back button will call
+ *       onDismissRequest.
+ *
  * @property dismissOnClickOutside whether the dialog can be dismissed by clicking outside the
- * dialog's bounds. If true, clicking outside the dialog will call onDismissRequest.
+ *   dialog's bounds. If true, clicking outside the dialog will call onDismissRequest.
  * @property usePlatformDefaultWidth Whether the width of the dialog's content should be limited to
- * the platform default, which is smaller than the screen width.
- * **Might be used only as named argument**.
+ *   the platform default, which is smaller than the screen width. **Might be used only as named
+ *   argument**.
  */
 @Immutable
 expect class DialogProperties(
@@ -45,13 +46,13 @@
 /**
  * Opens a dialog with the given content.
  *
- * A dialog is a small window that prompts the user to make a decision or enter
- * additional information. A dialog does not fill the screen and is normally used
- * for modal events that require users to take an action before they can proceed.
+ * A dialog is a small window that prompts the user to make a decision or enter additional
+ * information. A dialog does not fill the screen and is normally used for modal events that require
+ * users to take an action before they can proceed.
  *
- * The dialog is visible as long as it is part of the composition hierarchy.
- * In order to let the user dismiss the Dialog, the implementation of [onDismissRequest] should
- * contain a way to remove the dialog from the composition hierarchy.
+ * The dialog is visible as long as it is part of the composition hierarchy. In order to let the
+ * user dismiss the Dialog, the implementation of [onDismissRequest] should contain a way to remove
+ * the dialog from the composition hierarchy.
  *
  * Example usage:
  *
diff --git a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/window/Popup.kt b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/window/Popup.kt
index d1b0afe..de00d54 100644
--- a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/window/Popup.kt
+++ b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/window/Popup.kt
@@ -28,19 +28,17 @@
 /**
  * Properties used to customize the behavior of a [Popup].
  *
- * @property focusable Whether the popup is focusable. When true, the popup will receive IME
- * events and key presses, such as when the back button is pressed.
- * @property dismissOnBackPress Whether the popup can be dismissed by pressing the back button
- * on Android or escape key on desktop.
- * If true, pressing the back button will call onDismissRequest. Note that [focusable] must be
- * set to true in order to receive key events such as the back button - if the popup is not
- * focusable then this property does nothing.
+ * @property focusable Whether the popup is focusable. When true, the popup will receive IME events
+ *   and key presses, such as when the back button is pressed.
+ * @property dismissOnBackPress Whether the popup can be dismissed by pressing the back button on
+ *   Android or escape key on desktop. If true, pressing the back button will call onDismissRequest.
+ *   Note that [focusable] must be set to true in order to receive key events such as the back
+ *   button - if the popup is not focusable then this property does nothing.
  * @property dismissOnClickOutside Whether the popup can be dismissed by clicking outside the
- * popup's bounds. If true, clicking outside the popup will call onDismissRequest.
+ *   popup's bounds. If true, clicking outside the popup will call onDismissRequest.
  * @property clippingEnabled Whether to allow the popup window to extend beyond the bounds of the
- * screen. By default the window is clipped to the screen boundaries. Setting this to false will
- * allow windows to be accurately positioned.
- * The default value is true.
+ *   screen. By default the window is clipped to the screen boundaries. Setting this to false will
+ *   allow windows to be accurately positioned. The default value is true.
  */
 @Immutable
 expect class PopupProperties(
@@ -55,25 +53,21 @@
     val clippingEnabled: Boolean
 }
 
-/**
- * Calculates the position of a [Popup] on screen.
- */
+/** Calculates the position of a [Popup] on screen. */
 @Immutable
 interface PopupPositionProvider {
     /**
      * Calculates the position of a [Popup] on screen.
      *
      * The window size is useful in cases where the popup is meant to be positioned next to its
-     * anchor instead of inside of it. The size can be used to calculate available space
-     * around the parent to find a spot with enough clearance (e.g. when implementing a dropdown).
-     * Note that positioning the popup outside of the window bounds might prevent it from being
-     * visible.
+     * anchor instead of inside of it. The size can be used to calculate available space around the
+     * parent to find a spot with enough clearance (e.g. when implementing a dropdown). Note that
+     * positioning the popup outside of the window bounds might prevent it from being visible.
      *
      * @param anchorBounds The window relative bounds of the layout which this popup is anchored to.
      * @param windowSize The size of the window containing the anchor layout.
      * @param layoutDirection The layout direction of the anchor layout.
      * @param popupContentSize The size of the popup's content.
-     *
      * @return The window relative position where the popup should be positioned.
      */
     fun calculatePosition(
@@ -84,33 +78,22 @@
     ): IntOffset
 }
 
-internal class AlignmentOffsetPositionProvider(
-    val alignment: Alignment,
-    val offset: IntOffset
-) : PopupPositionProvider {
+internal class AlignmentOffsetPositionProvider(val alignment: Alignment, val offset: IntOffset) :
+    PopupPositionProvider {
     override fun calculatePosition(
         anchorBounds: IntRect,
         windowSize: IntSize,
         layoutDirection: LayoutDirection,
         popupContentSize: IntSize
     ): IntOffset {
-        // TODO: Decide which is the best way to round to result without reimplementing Alignment.align
+        // TODO: Decide which is the best way to round to result without reimplementing
+        // Alignment.align
 
-        val anchorAlignmentPoint = alignment.align(
-            IntSize.Zero,
-            anchorBounds.size,
-            layoutDirection
-        )
+        val anchorAlignmentPoint = alignment.align(IntSize.Zero, anchorBounds.size, layoutDirection)
         // Note the negative sign. Popup alignment point contributes negative offset.
-        val popupAlignmentPoint = -alignment.align(
-            IntSize.Zero,
-            popupContentSize,
-            layoutDirection
-        )
-        val resolvedUserOffset = IntOffset(
-            offset.x * (if (layoutDirection == LayoutDirection.Ltr) 1 else -1),
-            offset.y
-        )
+        val popupAlignmentPoint = -alignment.align(IntSize.Zero, popupContentSize, layoutDirection)
+        val resolvedUserOffset =
+            IntOffset(offset.x * (if (layoutDirection == LayoutDirection.Ltr) 1 else -1), offset.y)
 
         return anchorBounds.topLeft +
             anchorAlignmentPoint +
@@ -122,19 +105,19 @@
 /**
  * Opens a popup with the given content.
  *
- * A popup is a floating container that appears on top of the current activity.
- * It is especially useful for non-modal UI surfaces that remain hidden until they
- * are needed, for example floating menus like Cut/Copy/Paste.
+ * A popup is a floating container that appears on top of the current activity. It is especially
+ * useful for non-modal UI surfaces that remain hidden until they are needed, for example floating
+ * menus like Cut/Copy/Paste.
  *
- * The popup is positioned relative to its parent, using the [alignment] and [offset].
- * The popup is visible as long as it is part of the composition hierarchy.
+ * The popup is positioned relative to its parent, using the [alignment] and [offset]. The popup is
+ * visible as long as it is part of the composition hierarchy.
  *
  * @sample androidx.compose.ui.samples.PopupSample
  *
  * @param alignment The alignment relative to the parent.
  * @param offset An offset from the original aligned position of the popup. Offset respects the
- * Ltr/Rtl context, thus in Ltr it will be added to the original aligned position and in Rtl it
- * will be subtracted from it.
+ *   Ltr/Rtl context, thus in Ltr it will be added to the original aligned position and in Rtl it
+ *   will be subtracted from it.
  * @param onDismissRequest Executes when the user clicks outside of the popup.
  * @param properties [PopupProperties] for further customization of this popup's behavior.
  * @param content The content to be displayed inside the popup.
diff --git a/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/ComposeScene.desktop.kt b/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/ComposeScene.desktop.kt
index 6399dc1..1afc9ea 100644
--- a/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/ComposeScene.desktop.kt
+++ b/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/ComposeScene.desktop.kt
@@ -90,6 +90,7 @@
 @OptIn(ExperimentalComposeUiApi::class)
 internal actual val PrimaryPressedPointerButtons: PointerButtons =
     PointerButtons(isPrimaryPressed = true)
+
 internal actual fun makeAccessibilityController(
     skiaBasedOwner: SkiaBasedOwner,
     component: PlatformComponent
diff --git a/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/ConfigureSwingGlobalsForCompose.desktop.kt b/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/ConfigureSwingGlobalsForCompose.desktop.kt
index 540d5da..01532e3 100644
--- a/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/ConfigureSwingGlobalsForCompose.desktop.kt
+++ b/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/ConfigureSwingGlobalsForCompose.desktop.kt
@@ -23,16 +23,16 @@
  * This function is called implicitly if you use [awaitApplication] / [application] /
  * [launchApplication] and Compose for Desktop Gradle plugin tasks "run" or "package"
  *
- * If you integrate Compose into existing Swing application (like IDEA), don't call this function
- * as it affects the entire application.
+ * If you integrate Compose into existing Swing application (like IDEA), don't call this function as
+ * it affects the entire application.
  *
  * This function:
  * - sets system property `apple.laf.useScreenMenuBar` to true
  * - sets system property `sun.java2d.uiScale`/`sun.java2d.uiScale.enabled` automatically on Linux
  * - sets UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName())
  *
- * Should be called before using any class from `java.swing.*`
- * (even before SwingUtilities.invokeLater or Dispatchers.Swing)
+ * Should be called before using any class from `java.swing.*` (even before
+ * SwingUtilities.invokeLater or Dispatchers.Swing)
  */
 @ExperimentalComposeUiApi
 fun configureSwingGlobalsForCompose(
@@ -40,8 +40,7 @@
         System.getProperty("skiko.rendering.laf.global", "true") == "true",
     useScreenMenuBarOnMacOs: Boolean =
         System.getProperty("skiko.rendering.useScreenMenuBar", "true") == "true",
-    useAutoDpiOnLinux: Boolean =
-        System.getProperty("skiko.linux.autodpi", "true") == "true",
+    useAutoDpiOnLinux: Boolean = System.getProperty("skiko.linux.autodpi", "true") == "true",
 ) {
     System.setProperty("skiko.rendering.laf.global", overrideLookAndFeel.toString())
     System.setProperty("skiko.rendering.useScreenMenuBar", useScreenMenuBarOnMacOs.toString())
diff --git a/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/autofill/ContentDataType.desktop.kt b/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/autofill/ContentDataType.desktop.kt
index 26ec041..e9464156 100644
--- a/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/autofill/ContentDataType.desktop.kt
+++ b/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/autofill/ContentDataType.desktop.kt
@@ -22,9 +22,7 @@
 // actual typealias NativeContentDataType = String
 
 @JvmInline
-internal actual value class ContentDataType actual constructor(
-    val dataType: Int
-) {
+internal actual value class ContentDataType actual constructor(val dataType: Int) {
     internal actual companion object {
         private val UnsupportedContentType = ContentDataType(MIN_VALUE)
         actual val Text = UnsupportedContentType
diff --git a/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/autofill/ContentType.desktop.kt b/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/autofill/ContentType.desktop.kt
index 40069b5..f6a4033 100644
--- a/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/autofill/ContentType.desktop.kt
+++ b/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/autofill/ContentType.desktop.kt
@@ -20,8 +20,8 @@
  * Content type information.
  *
  * Autofill services use the [ContentType] to determine what value to use to autofill fields
- * associated with this type. If the [ContentType] is not specified, the autofill services have
- * to use heuristics to determine the right value to use while autofilling the corresponding field.
+ * associated with this type. If the [ContentType] is not specified, the autofill services have to
+ * use heuristics to determine the right value to use while autofilling the corresponding field.
  */
 internal actual class ContentType private actual constructor(contentHint: String) {
     internal actual companion object {
diff --git a/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/awt/ComposeDialog.desktop.kt b/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/awt/ComposeDialog.desktop.kt
index 373e218..e0ba740 100644
--- a/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/awt/ComposeDialog.desktop.kt
+++ b/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/awt/ComposeDialog.desktop.kt
@@ -28,13 +28,11 @@
 import org.jetbrains.skiko.GraphicsApi
 
 /**
- * ComposeDialog is a dialog for building UI using Compose for Desktop.
- * ComposeDialog inherits javax.swing.JDialog.
+ * ComposeDialog is a dialog for building UI using Compose for Desktop. ComposeDialog inherits
+ * javax.swing.JDialog.
  */
-class ComposeDialog(
-    owner: Window? = null,
-    modalityType: ModalityType = ModalityType.MODELESS
-) : JDialog(owner, modalityType) {
+class ComposeDialog(owner: Window? = null, modalityType: ModalityType = ModalityType.MODELESS) :
+    JDialog(owner, modalityType) {
     private val delegate = ComposeWindowDelegate(this, ::isUndecorated)
 
     init {
@@ -51,25 +49,20 @@
      * @param content Composable content of the ComposeDialog.
      */
     @OptIn(ExperimentalComposeUiApi::class)
-    fun setContent(
-        content: @Composable DialogWindowScope.() -> Unit
-    ) = setContent(
-        onPreviewKeyEvent = { false },
-        onKeyEvent = { false },
-        content = content
-    )
+    fun setContent(content: @Composable DialogWindowScope.() -> Unit) =
+        setContent(onPreviewKeyEvent = { false }, onKeyEvent = { false }, content = content)
 
     /**
      * Composes the given composable into the ComposeDialog.
      *
      * @param onPreviewKeyEvent This callback is invoked when the user interacts with the hardware
-     * keyboard. It gives ancestors of a focused component the chance to intercept a [KeyEvent].
-     * Return true to stop propagation of this event. If you return false, the key event will be
-     * sent to this [onPreviewKeyEvent]'s child. If none of the children consume the event,
-     * it will be sent back up to the root using the onKeyEvent callback.
+     *   keyboard. It gives ancestors of a focused component the chance to intercept a [KeyEvent].
+     *   Return true to stop propagation of this event. If you return false, the key event will be
+     *   sent to this [onPreviewKeyEvent]'s child. If none of the children consume the event, it
+     *   will be sent back up to the root using the onKeyEvent callback.
      * @param onKeyEvent This callback is invoked when the user interacts with the hardware
-     * keyboard. While implementing this callback, return true to stop propagation of this event.
-     * If you return false, the key event will be sent to this [onKeyEvent]'s parent.
+     *   keyboard. While implementing this callback, return true to stop propagation of this event.
+     *   If you return false, the key event will be sent to this [onKeyEvent]'s parent.
      * @param content Composable content of the ComposeWindow.
      */
     @ExperimentalComposeUiApi
@@ -78,9 +71,11 @@
         onKeyEvent: ((KeyEvent) -> Boolean) = { false },
         content: @Composable DialogWindowScope.() -> Unit
     ) {
-        val scope = object : DialogWindowScope {
-            override val window: ComposeDialog get() = this@ComposeDialog
-        }
+        val scope =
+            object : DialogWindowScope {
+                override val window: ComposeDialog
+                    get() = this@ComposeDialog
+            }
         delegate.setContent(
             onPreviewKeyEvent,
             onKeyEvent,
@@ -105,39 +100,38 @@
     }
 
     /**
-     * `true` if background of the window is transparent, `false` otherwise
-     * Transparency should be set only if window is not showing and `isUndecorated` is set to
-     * `true`, otherwise AWT will throw an exception.
+     * `true` if background of the window is transparent, `false` otherwise Transparency should be
+     * set only if window is not showing and `isUndecorated` is set to `true`, otherwise AWT will
+     * throw an exception.
      */
     var isTransparent: Boolean by delegate::isTransparent
 
-    /**
-     * Registers a task to run when the rendering API changes.
-     */
+    /** Registers a task to run when the rendering API changes. */
     fun onRenderApiChanged(action: () -> Unit) {
         delegate.onRenderApiChanged(action)
     }
 
     /**
      * Retrieve underlying platform-specific operating system handle for the root window where
-     * ComposeDialog is rendered. Currently returns HWND on Windows, Window on X11 and NSWindow
-     * on macOS.
+     * ComposeDialog is rendered. Currently returns HWND on Windows, Window on X11 and NSWindow on
+     * macOS.
      */
-    val windowHandle: Long get() = delegate.windowHandle
+    val windowHandle: Long
+        get() = delegate.windowHandle
 
     /**
      * Returns low-level rendering API used for rendering in this ComposeDialog. API is
      * automatically selected based on operating system, graphical hardware and `SKIKO_RENDER_API`
      * environment variable.
      */
-    val renderApi: GraphicsApi get() = delegate.renderApi
+    val renderApi: GraphicsApi
+        get() = delegate.renderApi
 
     // We need overridden listeners because we mix Swing and AWT components in the
     // org.jetbrains.skiko.SkiaLayer, they don't work well together.
     // TODO(demin): is it possible to fix that without overriding?
 
-    override fun addMouseListener(listener: MouseListener) =
-        delegate.addMouseListener(listener)
+    override fun addMouseListener(listener: MouseListener) = delegate.addMouseListener(listener)
 
     override fun removeMouseListener(listener: MouseListener) =
         delegate.removeMouseListener(listener)
diff --git a/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/awt/ComposeLayer.desktop.kt b/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/awt/ComposeLayer.desktop.kt
index b64360f..505ab66 100644
--- a/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/awt/ComposeLayer.desktop.kt
+++ b/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/awt/ComposeLayer.desktop.kt
@@ -66,41 +66,40 @@
     private var isDisposed = false
 
     private val _component = ComponentImpl()
-    val component: SkiaLayer get() = _component
+    val component: SkiaLayer
+        get() = _component
 
-    private val scene = ComposeScene(
-        Dispatchers.Swing,
-        _component,
-        Density(1f),
-        _component::needRedraw
-    )
+    private val scene =
+        ComposeScene(Dispatchers.Swing, _component, Density(1f), _component::needRedraw)
 
-    private val density get() = _component.density.density
+    private val density
+        get() = _component.density.density
 
     /**
      * Keyboard modifiers state might be changed when window is not focused, so window doesn't
-     * receive any key events.
-     * This flag is set when window focus changes. Then we can rely on it when handling the
-     * first movementEvent to get the actual keyboard modifiers state from it.
-     * After window gains focus, the first motionEvent.metaState (after focus gained) is used
-     * to update windowInfo.keyboardModifiers.
+     * receive any key events. This flag is set when window focus changes. Then we can rely on it
+     * when handling the first movementEvent to get the actual keyboard modifiers state from it.
+     * After window gains focus, the first motionEvent.metaState (after focus gained) is used to
+     * update windowInfo.keyboardModifiers.
      *
-     * TODO: needs to be set `true` when focus changes:
-     * (Window focus change is implemented in JB fork, but not upstreamed yet).
+     * TODO: needs to be set `true` when focus changes: (Window focus change is implemented in JB
+     *   fork, but not upstreamed yet).
      */
     private var keyboardModifiersRequireUpdate = false
 
-    fun makeAccessible(component: Component) = object : Accessible {
-        override fun getAccessibleContext(): AccessibleContext? {
-            // TODO move System.getenv out of this method
-            if (System.getenv("COMPOSE_DISABLE_ACCESSIBILITY") != null) return null
-            val controller =
-                scene.mainOwner?.accessibilityController as? AccessibilityControllerImpl
-            val accessible = controller?.rootAccessible
-            accessible?.getAccessibleContext()?.accessibleParent = component.parent as Accessible
-            return accessible?.getAccessibleContext()
+    fun makeAccessible(component: Component) =
+        object : Accessible {
+            override fun getAccessibleContext(): AccessibleContext? {
+                // TODO move System.getenv out of this method
+                if (System.getenv("COMPOSE_DISABLE_ACCESSIBILITY") != null) return null
+                val controller =
+                    scene.mainOwner?.accessibilityController as? AccessibilityControllerImpl
+                val accessible = controller?.rootAccessible
+                accessible?.getAccessibleContext()?.accessibleParent =
+                    component.parent as Accessible
+                return accessible?.getAccessibleContext()
+            }
         }
-    }
 
     @OptIn(InternalComposeUiApi::class)
     private inner class ComponentImpl :
@@ -120,6 +119,7 @@
         }
 
         override fun getInputMethodRequests() = currentInputMethodRequests
+
         override var componentCursor: Cursor
             get() = super.getCursor()
             set(value) {
@@ -147,16 +147,17 @@
 
         override suspend fun textInputSession(
             session: suspend PlatformTextInputSessionScope.() -> Nothing
-        ): Nothing = textInputSessionMutex.withSessionCancellingPrevious(
-            sessionInitializer = {
-                DesktopTextInputSession(
-                    coroutineScope = it,
-                    inputComponent = this,
-                    component = _component
-                )
-            },
-            session = session
-        )
+        ): Nothing =
+            textInputSessionMutex.withSessionCancellingPrevious(
+                sessionInitializer = {
+                    DesktopTextInputSession(
+                        coroutineScope = it,
+                        inputComponent = this,
+                        component = _component
+                    )
+                },
+                session = session
+            )
 
         override fun doLayout() {
             super.doLayout()
@@ -164,17 +165,20 @@
         }
 
         private fun updateSceneSize() {
-            this@ComposeLayer.scene.constraints = Constraints(
-                maxWidth = (width * density.density).toInt().coerceAtLeast(0),
-                maxHeight = (height * density.density).toInt().coerceAtLeast(0)
-            )
+            this@ComposeLayer.scene.constraints =
+                Constraints(
+                    maxWidth = (width * density.density).toInt().coerceAtLeast(0),
+                    maxHeight = (height * density.density).toInt().coerceAtLeast(0)
+                )
         }
 
         override fun getPreferredSize(): Dimension {
-            return if (isPreferredSizeSet) super.getPreferredSize() else Dimension(
-                (this@ComposeLayer.scene.contentSize.width / density.density).toInt(),
-                (this@ComposeLayer.scene.contentSize.height / density.density).toInt()
-            )
+            return if (isPreferredSizeSet) super.getPreferredSize()
+            else
+                Dimension(
+                    (this@ComposeLayer.scene.contentSize.width / density.density).toInt(),
+                    (this@ComposeLayer.scene.contentSize.height / density.density).toInt()
+                )
         }
 
         override val locationOnScreen: Point
@@ -193,52 +197,66 @@
     }
 
     init {
-        _component.skikoView = object : SkikoView {
-            override fun onRender(canvas: Canvas, width: Int, height: Int, nanoTime: Long) {
-                try {
-                    scene.render(canvas, nanoTime)
-                } catch (e: Throwable) {
-                    if (System.getProperty("compose.desktop.render.ignore.errors") == null) {
-                        throw e
+        _component.skikoView =
+            object : SkikoView {
+                override fun onRender(canvas: Canvas, width: Int, height: Int, nanoTime: Long) {
+                    try {
+                        scene.render(canvas, nanoTime)
+                    } catch (e: Throwable) {
+                        if (System.getProperty("compose.desktop.render.ignore.errors") == null) {
+                            throw e
+                        }
                     }
                 }
             }
-        }
 
-        _component.addInputMethodListener(object : InputMethodListener {
-            override fun caretPositionChanged(event: InputMethodEvent?) {
-                if (isDisposed) return
-                if (event != null) {
+        _component.addInputMethodListener(
+            object : InputMethodListener {
+                override fun caretPositionChanged(event: InputMethodEvent?) {
+                    if (isDisposed) return
+                    if (event != null) {
+                        scene.onInputMethodEvent(event)
+                    }
+                }
+
+                override fun inputMethodTextChanged(event: InputMethodEvent) {
+                    if (isDisposed) return
                     scene.onInputMethodEvent(event)
                 }
             }
+        )
 
-            override fun inputMethodTextChanged(event: InputMethodEvent) {
-                if (isDisposed) return
-                scene.onInputMethodEvent(event)
+        _component.addMouseListener(
+            object : MouseAdapter() {
+                override fun mouseClicked(event: MouseEvent) = Unit
+
+                override fun mousePressed(event: MouseEvent) = onMouseEvent(event)
+
+                override fun mouseReleased(event: MouseEvent) = onMouseEvent(event)
+
+                override fun mouseEntered(event: MouseEvent) = onMouseEvent(event)
+
+                override fun mouseExited(event: MouseEvent) = onMouseEvent(event)
             }
-        })
+        )
+        _component.addMouseMotionListener(
+            object : MouseMotionAdapter() {
+                override fun mouseDragged(event: MouseEvent) = onMouseEvent(event)
 
-        _component.addMouseListener(object : MouseAdapter() {
-            override fun mouseClicked(event: MouseEvent) = Unit
-            override fun mousePressed(event: MouseEvent) = onMouseEvent(event)
-            override fun mouseReleased(event: MouseEvent) = onMouseEvent(event)
-            override fun mouseEntered(event: MouseEvent) = onMouseEvent(event)
-            override fun mouseExited(event: MouseEvent) = onMouseEvent(event)
-        })
-        _component.addMouseMotionListener(object : MouseMotionAdapter() {
-            override fun mouseDragged(event: MouseEvent) = onMouseEvent(event)
-            override fun mouseMoved(event: MouseEvent) = onMouseEvent(event)
-        })
-        _component.addMouseWheelListener { event ->
-            onMouseWheelEvent(event)
-        }
+                override fun mouseMoved(event: MouseEvent) = onMouseEvent(event)
+            }
+        )
+        _component.addMouseWheelListener { event -> onMouseWheelEvent(event) }
         _component.focusTraversalKeysEnabled = false
-        _component.addKeyListener(object : KeyAdapter() {
-            override fun keyPressed(event: KeyEvent) = onKeyEvent(event)
-            override fun keyReleased(event: KeyEvent) = onKeyEvent(event)
-            override fun keyTyped(event: KeyEvent) = onKeyEvent(event)
-        })
+        _component.addKeyListener(
+            object : KeyAdapter() {
+                override fun keyPressed(event: KeyEvent) = onKeyEvent(event)
+
+                override fun keyReleased(event: KeyEvent) = onKeyEvent(event)
+
+                override fun keyTyped(event: KeyEvent) = onKeyEvent(event)
+            }
+        )
     }
 
     private fun onMouseEvent(event: MouseEvent) {
@@ -264,18 +282,19 @@
         }
     }
 
-    private fun KeyEvent.toPointerKeyboardModifiers() = PointerKeyboardModifiers(
-        isCtrlPressed = this.isControlDown,
-        isMetaPressed = this.isMetaDown,
-        isAltPressed = this.isAltDown,
-        isShiftPressed = this.isShiftDown,
-        isAltGraphPressed = this.isAltGraphDown,
-        isSymPressed = false,
-        isFunctionPressed = false,
-        isCapsLockOn = getLockingKeyStateSafe(KeyEvent.VK_CAPS_LOCK),
-        isScrollLockOn = getLockingKeyStateSafe(KeyEvent.VK_SCROLL_LOCK),
-        isNumLockOn = getLockingKeyStateSafe(KeyEvent.VK_NUM_LOCK)
-    )
+    private fun KeyEvent.toPointerKeyboardModifiers() =
+        PointerKeyboardModifiers(
+            isCtrlPressed = this.isControlDown,
+            isMetaPressed = this.isMetaDown,
+            isAltPressed = this.isAltDown,
+            isShiftPressed = this.isShiftDown,
+            isAltGraphPressed = this.isAltGraphDown,
+            isSymPressed = false,
+            isFunctionPressed = false,
+            isCapsLockOn = getLockingKeyStateSafe(KeyEvent.VK_CAPS_LOCK),
+            isScrollLockOn = getLockingKeyStateSafe(KeyEvent.VK_SCROLL_LOCK),
+            isNumLockOn = getLockingKeyStateSafe(KeyEvent.VK_NUM_LOCK)
+        )
 
     fun dispose() {
         check(!isDisposed)
@@ -315,19 +334,17 @@
 
 @Suppress("ControlFlowWithEmptyBody")
 @OptIn(ExperimentalComposeUiApi::class)
-private fun ComposeScene.onMouseEvent(
-    density: Float,
-    event: MouseEvent
-) {
-    val eventType = when (event.id) {
-        MouseEvent.MOUSE_PRESSED -> PointerEventType.Press
-        MouseEvent.MOUSE_RELEASED -> PointerEventType.Release
-        MouseEvent.MOUSE_DRAGGED -> PointerEventType.Move
-        MouseEvent.MOUSE_MOVED -> PointerEventType.Move
-        MouseEvent.MOUSE_ENTERED -> PointerEventType.Enter
-        MouseEvent.MOUSE_EXITED -> PointerEventType.Exit
-        else -> PointerEventType.Unknown
-    }
+private fun ComposeScene.onMouseEvent(density: Float, event: MouseEvent) {
+    val eventType =
+        when (event.id) {
+            MouseEvent.MOUSE_PRESSED -> PointerEventType.Press
+            MouseEvent.MOUSE_RELEASED -> PointerEventType.Release
+            MouseEvent.MOUSE_DRAGGED -> PointerEventType.Move
+            MouseEvent.MOUSE_MOVED -> PointerEventType.Move
+            MouseEvent.MOUSE_ENTERED -> PointerEventType.Enter
+            MouseEvent.MOUSE_EXITED -> PointerEventType.Exit
+            else -> PointerEventType.Unknown
+        }
     sendPointerEvent(
         eventType = eventType,
         position = Offset(event.x.toFloat(), event.y.toFloat()) * density,
@@ -341,18 +358,16 @@
 
 @Suppress("ControlFlowWithEmptyBody")
 @OptIn(ExperimentalComposeUiApi::class)
-private fun ComposeScene.onMouseWheelEvent(
-    density: Float,
-    event: MouseWheelEvent
-) {
+private fun ComposeScene.onMouseWheelEvent(density: Float, event: MouseWheelEvent) {
     sendPointerEvent(
         eventType = PointerEventType.Scroll,
         position = Offset(event.x.toFloat(), event.y.toFloat()) * density,
-        scrollDelta = if (event.isShiftDown) {
-            Offset(event.preciseWheelRotation.toFloat(), 0f)
-        } else {
-            Offset(0f, event.preciseWheelRotation.toFloat())
-        },
+        scrollDelta =
+            if (event.isShiftDown) {
+                Offset(event.preciseWheelRotation.toFloat(), 0f)
+            } else {
+                Offset(0f, event.preciseWheelRotation.toFloat())
+            },
         timeMillis = event.`when`,
         type = PointerType.Mouse,
         buttons = event.buttons,
@@ -363,41 +378,42 @@
 
 @OptIn(ExperimentalComposeUiApi::class)
 private val MouseEvent.buttons
-    get() = PointerButtons(
-        isPrimaryPressed = (modifiersEx and MouseEvent.BUTTON1_DOWN_MASK) != 0 && !isMacOsCtrlClick,
-        isSecondaryPressed = (modifiersEx and MouseEvent.BUTTON3_DOWN_MASK) != 0 ||
-            isMacOsCtrlClick,
-        isTertiaryPressed = (modifiersEx and MouseEvent.BUTTON2_DOWN_MASK) != 0,
-        isBackPressed = (modifiersEx and MouseEvent.getMaskForButton(4)) != 0,
-        isForwardPressed = (modifiersEx and MouseEvent.getMaskForButton(5)) != 0,
-    )
+    get() =
+        PointerButtons(
+            isPrimaryPressed =
+                (modifiersEx and MouseEvent.BUTTON1_DOWN_MASK) != 0 && !isMacOsCtrlClick,
+            isSecondaryPressed =
+                (modifiersEx and MouseEvent.BUTTON3_DOWN_MASK) != 0 || isMacOsCtrlClick,
+            isTertiaryPressed = (modifiersEx and MouseEvent.BUTTON2_DOWN_MASK) != 0,
+            isBackPressed = (modifiersEx and MouseEvent.getMaskForButton(4)) != 0,
+            isForwardPressed = (modifiersEx and MouseEvent.getMaskForButton(5)) != 0,
+        )
 
 @OptIn(ExperimentalComposeUiApi::class)
 private val MouseEvent.keyboardModifiers
-    get() = PointerKeyboardModifiers(
-        isCtrlPressed = (modifiersEx and InputEvent.CTRL_DOWN_MASK) != 0,
-        isMetaPressed = (modifiersEx and InputEvent.META_DOWN_MASK) != 0,
-        isAltPressed = (modifiersEx and InputEvent.ALT_DOWN_MASK) != 0,
-        isShiftPressed = (modifiersEx and InputEvent.SHIFT_DOWN_MASK) != 0,
-        isAltGraphPressed = (modifiersEx and InputEvent.ALT_GRAPH_DOWN_MASK) != 0,
-        isSymPressed = false,
-        isFunctionPressed = false,
-        isCapsLockOn = getLockingKeyStateSafe(KeyEvent.VK_CAPS_LOCK),
-        isScrollLockOn = getLockingKeyStateSafe(KeyEvent.VK_SCROLL_LOCK),
-        isNumLockOn = getLockingKeyStateSafe(KeyEvent.VK_NUM_LOCK),
-    )
+    get() =
+        PointerKeyboardModifiers(
+            isCtrlPressed = (modifiersEx and InputEvent.CTRL_DOWN_MASK) != 0,
+            isMetaPressed = (modifiersEx and InputEvent.META_DOWN_MASK) != 0,
+            isAltPressed = (modifiersEx and InputEvent.ALT_DOWN_MASK) != 0,
+            isShiftPressed = (modifiersEx and InputEvent.SHIFT_DOWN_MASK) != 0,
+            isAltGraphPressed = (modifiersEx and InputEvent.ALT_GRAPH_DOWN_MASK) != 0,
+            isSymPressed = false,
+            isFunctionPressed = false,
+            isCapsLockOn = getLockingKeyStateSafe(KeyEvent.VK_CAPS_LOCK),
+            isScrollLockOn = getLockingKeyStateSafe(KeyEvent.VK_SCROLL_LOCK),
+            isNumLockOn = getLockingKeyStateSafe(KeyEvent.VK_NUM_LOCK),
+        )
 
-private fun getLockingKeyStateSafe(
-    mask: Int
-): Boolean = try {
-    Toolkit.getDefaultToolkit().getLockingKeyState(mask)
-} catch (_: Exception) {
-    false
-}
+private fun getLockingKeyStateSafe(mask: Int): Boolean =
+    try {
+        Toolkit.getDefaultToolkit().getLockingKeyState(mask)
+    } catch (_: Exception) {
+        false
+    }
 
 private val MouseEvent.isMacOsCtrlClick
-    get() = (
-        DesktopPlatform.Current == DesktopPlatform.MacOS &&
+    get() =
+        (DesktopPlatform.Current == DesktopPlatform.MacOS &&
             ((modifiersEx and InputEvent.BUTTON1_DOWN_MASK) != 0) &&
-            ((modifiersEx and InputEvent.CTRL_DOWN_MASK) != 0)
-        )
+            ((modifiersEx and InputEvent.CTRL_DOWN_MASK) != 0))
diff --git a/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/awt/ComposePanel.desktop.kt b/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/awt/ComposePanel.desktop.kt
index 18a78ff..7dc2763 100644
--- a/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/awt/ComposePanel.desktop.kt
+++ b/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/awt/ComposePanel.desktop.kt
@@ -25,9 +25,7 @@
 import org.jetbrains.skiko.ClipComponent
 import org.jetbrains.skiko.GraphicsApi
 
-/**
- * ComposePanel is a panel for building UI using Compose for Desktop.
- */
+/** ComposePanel is a panel for building UI using Compose for Desktop. */
 class ComposePanel : JLayeredPane() {
     init {
         check(isEventDispatchThread()) {
@@ -69,10 +67,7 @@
     private fun initContent() {
         if (layer != null && content != null) {
             layer!!.setContent {
-                CompositionLocalProvider(
-                    LocalLayerContainer provides this,
-                    content = content!!
-                )
+                CompositionLocalProvider(LocalLayerContainer provides this, content = content!!)
             }
         }
     }
@@ -98,9 +93,7 @@
 
         // After [super.addNotify] is called we can safely initialize the layer and composable
         // content.
-        layer = ComposeLayer().apply {
-            component.setSize(width, height)
-        }
+        layer = ComposeLayer().apply { component.setSize(width, height) }
         initContent()
         super.add(layer!!.component, Integer.valueOf(1))
     }
diff --git a/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/awt/ComposeWindow.desktop.kt b/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/awt/ComposeWindow.desktop.kt
index 95e8140..bc62fd6 100644
--- a/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/awt/ComposeWindow.desktop.kt
+++ b/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/awt/ComposeWindow.desktop.kt
@@ -29,15 +29,14 @@
 import org.jetbrains.skiko.GraphicsApi
 
 /**
- * ComposeWindow is a window for building UI using Compose for Desktop.
- * ComposeWindow inherits javax.swing.JFrame.
+ * ComposeWindow is a window for building UI using Compose for Desktop. ComposeWindow inherits
+ * javax.swing.JFrame.
  *
  * @param graphicsConfiguration the GraphicsConfiguration that is used to construct the new window.
- * If null, the system default GraphicsConfiguration is assumed.
+ *   If null, the system default GraphicsConfiguration is assumed.
  */
-class ComposeWindow(
-    graphicsConfiguration: GraphicsConfiguration? = null
-) : JFrame(graphicsConfiguration) {
+class ComposeWindow(graphicsConfiguration: GraphicsConfiguration? = null) :
+    JFrame(graphicsConfiguration) {
     private val delegate = ComposeWindowDelegate(this, ::isUndecorated)
 
     init {
@@ -54,25 +53,20 @@
      * @param content Composable content of the ComposeWindow.
      */
     @OptIn(ExperimentalComposeUiApi::class)
-    fun setContent(
-        content: @Composable FrameWindowScope.() -> Unit
-    ) = setContent(
-        onPreviewKeyEvent = { false },
-        onKeyEvent = { false },
-        content = content
-    )
+    fun setContent(content: @Composable FrameWindowScope.() -> Unit) =
+        setContent(onPreviewKeyEvent = { false }, onKeyEvent = { false }, content = content)
 
     /**
      * Composes the given composable into the ComposeWindow.
      *
      * @param onPreviewKeyEvent This callback is invoked when the user interacts with the hardware
-     * keyboard. It gives ancestors of a focused component the chance to intercept a [KeyEvent].
-     * Return true to stop propagation of this event. If you return false, the key event will be
-     * sent to this [onPreviewKeyEvent]'s child. If none of the children consume the event,
-     * it will be sent back up to the root using the onKeyEvent callback.
+     *   keyboard. It gives ancestors of a focused component the chance to intercept a [KeyEvent].
+     *   Return true to stop propagation of this event. If you return false, the key event will be
+     *   sent to this [onPreviewKeyEvent]'s child. If none of the children consume the event, it
+     *   will be sent back up to the root using the onKeyEvent callback.
      * @param onKeyEvent This callback is invoked when the user interacts with the hardware
-     * keyboard. While implementing this callback, return true to stop propagation of this event.
-     * If you return false, the key event will be sent to this [onKeyEvent]'s parent.
+     *   keyboard. While implementing this callback, return true to stop propagation of this event.
+     *   If you return false, the key event will be sent to this [onKeyEvent]'s parent.
      * @param content Composable content of the ComposeWindow.
      */
     @ExperimentalComposeUiApi
@@ -81,15 +75,12 @@
         onKeyEvent: (KeyEvent) -> Boolean = { false },
         content: @Composable FrameWindowScope.() -> Unit
     ) {
-        val scope = object : FrameWindowScope {
-            override val window: ComposeWindow get() = this@ComposeWindow
-        }
-        delegate.setContent(
-            onPreviewKeyEvent,
-            onKeyEvent
-        ) {
-            scope.content()
-        }
+        val scope =
+            object : FrameWindowScope {
+                override val window: ComposeWindow
+                    get() = this@ComposeWindow
+            }
+        delegate.setContent(onPreviewKeyEvent, onKeyEvent) { scope.content() }
     }
 
     override fun dispose() {
@@ -108,18 +99,19 @@
     }
 
     /**
-     * `true` if background of the window is transparent, `false` otherwise
-     * Transparency should be set only if window is not showing and `isUndecorated` is set to
-     * `true`, otherwise AWT will throw an exception.
+     * `true` if background of the window is transparent, `false` otherwise Transparency should be
+     * set only if window is not showing and `isUndecorated` is set to `true`, otherwise AWT will
+     * throw an exception.
      */
     var isTransparent: Boolean by delegate::isTransparent
 
     var placement: WindowPlacement
-        get() = when {
-            isFullscreen -> WindowPlacement.Fullscreen
-            isMaximized -> WindowPlacement.Maximized
-            else -> WindowPlacement.Floating
-        }
+        get() =
+            when {
+                isFullscreen -> WindowPlacement.Fullscreen
+                isMaximized -> WindowPlacement.Maximized
+                else -> WindowPlacement.Floating
+            }
         set(value) {
             when (value) {
                 WindowPlacement.Fullscreen -> {
@@ -135,64 +127,59 @@
             }
         }
 
-    /**
-     * `true` if the window is in fullscreen mode, `false` otherwise
-     */
+    /** `true` if the window is in fullscreen mode, `false` otherwise */
     private var isFullscreen: Boolean by delegate::fullscreen
 
-    /**
-     * `true` if the window is maximized to fill all available screen space, `false` otherwise
-     */
+    /** `true` if the window is maximized to fill all available screen space, `false` otherwise */
     private var isMaximized: Boolean
         get() = extendedState and MAXIMIZED_BOTH != 0
         set(value) {
-            extendedState = if (value) {
-                extendedState or MAXIMIZED_BOTH
-            } else {
-                extendedState and MAXIMIZED_BOTH.inv()
-            }
+            extendedState =
+                if (value) {
+                    extendedState or MAXIMIZED_BOTH
+                } else {
+                    extendedState and MAXIMIZED_BOTH.inv()
+                }
         }
 
-    /**
-     * `true` if the window is minimized to the taskbar, `false` otherwise
-     */
+    /** `true` if the window is minimized to the taskbar, `false` otherwise */
     var isMinimized: Boolean
         get() = extendedState and ICONIFIED != 0
         set(value) {
-            extendedState = if (value) {
-                extendedState or ICONIFIED
-            } else {
-                extendedState and ICONIFIED.inv()
-            }
+            extendedState =
+                if (value) {
+                    extendedState or ICONIFIED
+                } else {
+                    extendedState and ICONIFIED.inv()
+                }
         }
 
-    /**
-     * Registers a task to run when the rendering API changes.
-     */
+    /** Registers a task to run when the rendering API changes. */
     fun onRenderApiChanged(action: () -> Unit) {
         delegate.onRenderApiChanged(action)
     }
 
     /**
      * Retrieve underlying platform-specific operating system handle for the root window where
-     * ComposeWindow is rendered. Currently returns HWND on Windows, Window on X11 and NSWindow
-     * on macOS.
+     * ComposeWindow is rendered. Currently returns HWND on Windows, Window on X11 and NSWindow on
+     * macOS.
      */
-    val windowHandle: Long get() = delegate.windowHandle
+    val windowHandle: Long
+        get() = delegate.windowHandle
 
     /**
      * Returns low-level rendering API used for rendering in this ComposeWindow. API is
      * automatically selected based on operating system, graphical hardware and `SKIKO_RENDER_API`
      * environment variable.
      */
-    val renderApi: GraphicsApi get() = delegate.renderApi
+    val renderApi: GraphicsApi
+        get() = delegate.renderApi
 
     // We need overridden listeners because we mix Swing and AWT components in the
     // org.jetbrains.skiko.SkiaLayer, they don't work well together.
     // TODO(demin): is it possible to fix that without overriding?
 
-    override fun addMouseListener(listener: MouseListener) =
-        delegate.addMouseListener(listener)
+    override fun addMouseListener(listener: MouseListener) = delegate.addMouseListener(listener)
 
     override fun removeMouseListener(listener: MouseListener) =
         delegate.removeMouseListener(listener)
diff --git a/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/awt/ComposeWindowDelegate.desktop.kt b/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/awt/ComposeWindowDelegate.desktop.kt
index 349923f..8855e42 100644
--- a/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/awt/ComposeWindowDelegate.desktop.kt
+++ b/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/awt/ComposeWindowDelegate.desktop.kt
@@ -45,49 +45,51 @@
     // so we nullify layer on dispose, to prevent keeping
     // big objects in memory (like the whole LayoutNode tree of the window)
     private var _layer: ComposeLayer? = ComposeLayer()
-    private val layer get() = requireNotNull(_layer) {
-        "ComposeLayer is disposed"
-    }
+    private val layer
+        get() = requireNotNull(_layer) { "ComposeLayer is disposed" }
+
     val undecoratedWindowResizer = UndecoratedWindowResizer(window)
 
-    private val _pane = object : JLayeredPane() {
-        override fun setBounds(x: Int, y: Int, width: Int, height: Int) {
-            layer.component.setSize(width, height)
-            super.setBounds(x, y, width, height)
+    private val _pane =
+        object : JLayeredPane() {
+            override fun setBounds(x: Int, y: Int, width: Int, height: Int) {
+                layer.component.setSize(width, height)
+                super.setBounds(x, y, width, height)
+            }
+
+            override fun add(component: Component): Component {
+                val clipComponent = ClipComponent(component)
+                clipMap[component] = clipComponent
+                layer.component.clipComponents.add(clipComponent)
+                return add(component, Integer.valueOf(0))
+            }
+
+            override fun remove(component: Component) {
+                layer.component.clipComponents.remove(clipMap[component]!!)
+                clipMap.remove(component)
+                super.remove(component)
+            }
+
+            override fun addNotify() {
+                super.addNotify()
+                layer.component.requestFocus()
+            }
+
+            override fun getPreferredSize() =
+                if (isPreferredSizeSet) super.getPreferredSize() else layer.component.preferredSize
+
+            init {
+                layout = null
+                super.add(layer.component, 1)
+            }
+
+            fun dispose() {
+                super.remove(layer.component)
+            }
         }
 
-        override fun add(component: Component): Component {
-            val clipComponent = ClipComponent(component)
-            clipMap[component] = clipComponent
-            layer.component.clipComponents.add(clipComponent)
-            return add(component, Integer.valueOf(0))
-        }
-
-        override fun remove(component: Component) {
-            layer.component.clipComponents.remove(clipMap[component]!!)
-            clipMap.remove(component)
-            super.remove(component)
-        }
-
-        override fun addNotify() {
-            super.addNotify()
-            layer.component.requestFocus()
-        }
-
-        override fun getPreferredSize() =
-            if (isPreferredSizeSet) super.getPreferredSize() else layer.component.preferredSize
-
-        init {
-            layout = null
-            super.add(layer.component, 1)
-        }
-
-        fun dispose() {
-            super.remove(layer.component)
-        }
-    }
-
-    val pane get() = _pane
+    val pane
+        get() = _pane
 
     private val clipMap = mutableMapOf<Component, ClipComponent>()
 
@@ -138,9 +140,7 @@
     }
 
     fun onRenderApiChanged(action: () -> Unit) {
-        layer.component.onStateChanged(SkiaLayer.PropertyKind.Renderer) {
-            action()
-        }
+        layer.component.onStateChanged(SkiaLayer.PropertyKind.Renderer) { action() }
     }
 
     val windowHandle: Long
diff --git a/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/awt/LocalLayerContainer.desktop.kt b/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/awt/LocalLayerContainer.desktop.kt
index c0f9c25..5734a88 100644
--- a/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/awt/LocalLayerContainer.desktop.kt
+++ b/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/awt/LocalLayerContainer.desktop.kt
@@ -19,6 +19,5 @@
 import androidx.compose.runtime.compositionLocalOf
 import java.awt.Container
 
-internal val LocalLayerContainer = compositionLocalOf<Container> {
-    error("CompositionLocal LayerContainer not provided")
-}
+internal val LocalLayerContainer =
+    compositionLocalOf<Container> { error("CompositionLocal LayerContainer not provided") }
diff --git a/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/awt/SwingPanel.desktop.kt b/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/awt/SwingPanel.desktop.kt
index 6701a6d..a04f4a6 100644
--- a/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/awt/SwingPanel.desktop.kt
+++ b/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/awt/SwingPanel.desktop.kt
@@ -37,13 +37,12 @@
 val NoOpUpdate: Component.() -> Unit = {}
 
 /**
- * Composes an AWT/Swing component obtained from [factory]. The [factory]
- * block will be called to obtain the [Component] to be composed.
+ * Composes an AWT/Swing component obtained from [factory]. The [factory] block will be called to
+ * obtain the [Component] to be composed.
  *
- * The Swing component is placed on
- * top of the Compose layer (that means that Compose content can't overlap or clip it).
- * This can be changed in the future, when the better interop with Swing will be implemented. See related issues:
- * https://github.com/JetBrains/compose-jb/issues/1521
+ * The Swing component is placed on top of the Compose layer (that means that Compose content can't
+ * overlap or clip it). This can be changed in the future, when the better interop with Swing will
+ * be implemented. See related issues: https://github.com/JetBrains/compose-jb/issues/1521
  * https://github.com/JetBrains/compose-jb/issues/1202
  * https://github.com/JetBrains/compose-jb/issues/1449
  *
@@ -69,30 +68,30 @@
 
     Layout(
         content = {},
-        modifier = modifier.onGloballyPositioned { childCoordinates ->
-            val coordinates = childCoordinates.parentCoordinates!!
-            val location = coordinates.localToWindow(Offset.Zero).round()
-            val size = coordinates.size
-            componentInfo.layout.setBounds(
-                (location.x / density).toInt(),
-                (location.y / density).toInt(),
-                (size.width / density).toInt(),
-                (size.height / density).toInt()
-            )
-            componentInfo.layout.validate()
-            componentInfo.layout.repaint()
-        },
-        measurePolicy = { _, _ ->
-            layout(0, 0) {}
-        }
+        modifier =
+            modifier.onGloballyPositioned { childCoordinates ->
+                val coordinates = childCoordinates.parentCoordinates!!
+                val location = coordinates.localToWindow(Offset.Zero).round()
+                val size = coordinates.size
+                componentInfo.layout.setBounds(
+                    (location.x / density).toInt(),
+                    (location.y / density).toInt(),
+                    (size.width / density).toInt(),
+                    (size.height / density).toInt()
+                )
+                componentInfo.layout.validate()
+                componentInfo.layout.repaint()
+            },
+        measurePolicy = { _, _ -> layout(0, 0) {} }
     )
 
     DisposableEffect(factory) {
         componentInfo.factory = factory()
-        componentInfo.layout = JPanel().apply {
-            setLayout(BorderLayout(0, 0))
-            add(componentInfo.factory)
-        }
+        componentInfo.layout =
+            JPanel().apply {
+                setLayout(BorderLayout(0, 0))
+                add(componentInfo.factory)
+            }
         componentInfo.updater = Updater(componentInfo.factory, update)
         container.add(componentInfo.layout)
         onDispose {
@@ -122,15 +121,10 @@
     lateinit var updater: Updater<T>
 }
 
-private class Updater<T : Component>(
-    private val component: T,
-    update: (T) -> Unit
-) {
+private class Updater<T : Component>(private val component: T, update: (T) -> Unit) {
     private var isDisposed = false
     private val isUpdateScheduled = AtomicBoolean()
-    private val snapshotObserver = SnapshotStateObserver { command ->
-        command()
-    }
+    private val snapshotObserver = SnapshotStateObserver { command -> command() }
 
     private val scheduleUpdate = { _: T ->
         if (!isUpdateScheduled.getAndSet(true)) {
@@ -154,9 +148,7 @@
     private fun performUpdate() {
         // don't replace scheduleUpdate by lambda reference,
         // scheduleUpdate should always be the same instance
-        snapshotObserver.observeReads(component, scheduleUpdate) {
-            update(component)
-        }
+        snapshotObserver.observeReads(component, scheduleUpdate) { update(component) }
     }
 
     init {
diff --git a/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/draganddrop/DragAndDrop.desktop.kt b/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/draganddrop/DragAndDrop.desktop.kt
index f931f5e..aff3563 100644
--- a/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/draganddrop/DragAndDrop.desktop.kt
+++ b/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/draganddrop/DragAndDrop.desktop.kt
@@ -21,9 +21,7 @@
 
 actual class DragAndDropTransferData
 
-/**
- * AWT [DragAndDropEvent] which delegates to a [AwtDropTargetEvent]
- */
+/** AWT [DragAndDropEvent] which delegates to a [AwtDropTargetEvent] */
 actual class DragAndDropEvent(
     internal val dropTargetEvent: AwtDropTargetEvent,
 )
diff --git a/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/hapticfeedback/PlatformHapticFeedbackType.desktop.kt b/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/hapticfeedback/PlatformHapticFeedbackType.desktop.kt
index d689afa..4fe5357 100644
--- a/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/hapticfeedback/PlatformHapticFeedbackType.desktop.kt
+++ b/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/hapticfeedback/PlatformHapticFeedbackType.desktop.kt
@@ -16,9 +16,7 @@
 
 package androidx.compose.ui.hapticfeedback
 
-/**
- * Desktop implementation for [HapticFeedbackType]
- */
+/** Desktop implementation for [HapticFeedbackType] */
 internal actual object PlatformHapticFeedbackType {
     actual val LongPress: HapticFeedbackType = HapticFeedbackType(0)
     actual val TextHandleMove: HapticFeedbackType = HapticFeedbackType(9)
diff --git a/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/input/key/Key.desktop.kt b/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/input/key/Key.desktop.kt
index cfe17cd..5472cbb 100644
--- a/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/input/key/Key.desktop.kt
+++ b/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/input/key/Key.desktop.kt
@@ -30,7 +30,7 @@
  * Actual implementation of [Key] for Desktop.
  *
  * @param keyCode an integer code representing the key pressed. Note: This keycode can be used to
- * uniquely identify a hardware key. It is different from the native keycode.
+ *   uniquely identify a hardware key. It is different from the native keycode.
  */
 @JvmInline
 actual value class Key(val keyCode: Long) {
@@ -349,8 +349,8 @@
         /**
          * Num Lock key.
          *
-         * This is the Num Lock key; it is different from [Number].
-         * This key alters the behavior of other keys on the numeric keypad.
+         * This is the Num Lock key; it is different from [Number]. This key alters the behavior of
+         * other keys on the numeric keypad.
          */
         actual val NumLock = Key(KeyEvent.VK_NUM_LOCK, KEY_LOCATION_NUMPAD)
 
@@ -613,14 +613,10 @@
     return Key(keyCode or location)
 }
 
-/**
- * The native keycode corresponding to this [Key].
- */
+/** The native keycode corresponding to this [Key]. */
 val Key.nativeKeyCode: Int
     get() = unpackInt1(keyCode)
 
-/**
- * The native location corresponding to this [Key].
- */
+/** The native location corresponding to this [Key]. */
 val Key.nativeKeyLocation: Int
     get() = (keyCode and 0xFFFFFFFF).shr(29).toInt()
diff --git a/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/input/key/KeyEvent.desktop.kt b/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/input/key/KeyEvent.desktop.kt
index d52e212..6731c25 100644
--- a/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/input/key/KeyEvent.desktop.kt
+++ b/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/input/key/KeyEvent.desktop.kt
@@ -19,66 +19,53 @@
 import java.awt.event.KeyEvent.KEY_PRESSED
 import java.awt.event.KeyEvent.KEY_RELEASED
 
-/**
- * The native desktop [KeyEvent][KeyEventAwt].
- */
+/** The native desktop [KeyEvent][KeyEventAwt]. */
 actual typealias NativeKeyEvent = java.awt.event.KeyEvent
 
-/**
- * The key that was pressed.
- */
+/** The key that was pressed. */
 actual val KeyEvent.key: Key
     get() = Key(nativeKeyEvent.keyCode, nativeKeyEvent.keyLocation)
 
 /**
- * The UTF16 value corresponding to the key event that was pressed. The unicode character
- * takes into account any meta keys that are pressed (eg. Pressing shift results in capital
- * alphabets). The UTF16 value uses the
- * [U+n notation][http://www.unicode.org/reports/tr27/#notation] of the Unicode Standard.
+ * The UTF16 value corresponding to the key event that was pressed. The unicode character takes into
+ * account any meta keys that are pressed (eg. Pressing shift results in capital alphabets). The
+ * UTF16 value uses the [U+n notation][http://www.unicode.org/reports/tr27/#notation] of the Unicode
+ * Standard.
  *
- * An [Int] is used instead of a [Char] so that we can support supplementary characters. The
- * Unicode Standard allows for characters whose representation requires more than 16 bits.
- * The range of legal code points is U+0000 to U+10FFFF, known as Unicode scalar value.
+ * An [Int] is used instead of a [Char] so that we can support supplementary characters. The Unicode
+ * Standard allows for characters whose representation requires more than 16 bits. The range of
+ * legal code points is U+0000 to U+10FFFF, known as Unicode scalar value.
  *
- * The set of characters from U+0000 to U+FFFF is sometimes referred to as the Basic
- * Multilingual Plane (BMP). Characters whose code points are greater than U+FFFF are called
- * supplementary characters. In this representation, supplementary characters are represented
- * as a pair of char values, the first from the high-surrogates range, (\uD800-\uDBFF), the
- * second from the low-surrogates range (\uDC00-\uDFFF).
+ * The set of characters from U+0000 to U+FFFF is sometimes referred to as the Basic Multilingual
+ * Plane (BMP). Characters whose code points are greater than U+FFFF are called supplementary
+ * characters. In this representation, supplementary characters are represented as a pair of char
+ * values, the first from the high-surrogates range, (\uD800-\uDBFF), the second from the
+ * low-surrogates range (\uDC00-\uDFFF).
  */
 actual val KeyEvent.utf16CodePoint: Int
     get() = nativeKeyEvent.keyChar.code
 
-/**
- * The [type][KeyEventType] of key event.
- */
+/** The [type][KeyEventType] of key event. */
 actual val KeyEvent.type: KeyEventType
-    get() = when (nativeKeyEvent.id) {
-        KEY_PRESSED -> KeyEventType.KeyDown
-        KEY_RELEASED -> KeyEventType.KeyUp
-        else -> KeyEventType.Unknown
-    }
+    get() =
+        when (nativeKeyEvent.id) {
+            KEY_PRESSED -> KeyEventType.KeyDown
+            KEY_RELEASED -> KeyEventType.KeyUp
+            else -> KeyEventType.Unknown
+        }
 
-/**
- * Indicates whether the Alt key is pressed.
- */
+/** Indicates whether the Alt key is pressed. */
 actual val KeyEvent.isAltPressed: Boolean
     get() = nativeKeyEvent.isAltDown || nativeKeyEvent.isAltGraphDown
 
-/**
- * Indicates whether the Ctrl key is pressed.
- */
+/** Indicates whether the Ctrl key is pressed. */
 actual val KeyEvent.isCtrlPressed: Boolean
     get() = nativeKeyEvent.isControlDown
 
-/**
- * Indicates whether the Meta key is pressed.
- */
+/** Indicates whether the Meta key is pressed. */
 actual val KeyEvent.isMetaPressed: Boolean
     get() = nativeKeyEvent.isMetaDown
 
-/**
- * Indicates whether the Shift key is pressed.
- */
+/** Indicates whether the Shift key is pressed. */
 actual val KeyEvent.isShiftPressed: Boolean
     get() = nativeKeyEvent.isShiftDown
diff --git a/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/input/key/KeyShortcut.desktop.kt b/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/input/key/KeyShortcut.desktop.kt
index ad253e1..5eef6f8 100644
--- a/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/input/key/KeyShortcut.desktop.kt
+++ b/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/input/key/KeyShortcut.desktop.kt
@@ -20,34 +20,21 @@
 import javax.swing.KeyStroke
 
 // TODO(https://github.com/JetBrains/compose-jb/issues/914): support arbitrary shortcuts
-/**
- * Represents a key combination which should be pressed on a keyboard to trigger some action.
- */
+/** Represents a key combination which should be pressed on a keyboard to trigger some action. */
 class KeyShortcut(
-    /**
-     * Key that should be pressed to trigger an action
-     */
+    /** Key that should be pressed to trigger an action */
     internal val key: Key,
 
-    /**
-     * true if Ctrl modifier key should be pressed to trigger an action
-     */
+    /** true if Ctrl modifier key should be pressed to trigger an action */
     internal val ctrl: Boolean = false,
 
-    /**
-     * true if Meta modifier key should be pressed to trigger an action
-     * (it is Command on macOs)
-     */
+    /** true if Meta modifier key should be pressed to trigger an action (it is Command on macOs) */
     internal val meta: Boolean = false,
 
-    /**
-     * true if Alt modifier key should be pressed to trigger an action
-     */
+    /** true if Alt modifier key should be pressed to trigger an action */
     internal val alt: Boolean = false,
 
-    /**
-     * true if Shift modifier key should be pressed to trigger an action
-     */
+    /** true if Shift modifier key should be pressed to trigger an action */
     internal val shift: Boolean = false,
 ) {
     override fun equals(other: Any?): Boolean {
@@ -83,14 +70,15 @@
     }
 }
 
-internal fun KeyShortcut.toSwingKeyStroke(): KeyStroke = KeyStroke.getKeyStroke(
-    key.nativeKeyCode,
-    run {
-        var value = 0
-        if (ctrl) value = value or InputEvent.CTRL_DOWN_MASK
-        if (meta) value = value or InputEvent.META_DOWN_MASK
-        if (alt) value = value or InputEvent.ALT_DOWN_MASK
-        if (shift) value = value or InputEvent.SHIFT_DOWN_MASK
-        value
-    }
-)
+internal fun KeyShortcut.toSwingKeyStroke(): KeyStroke =
+    KeyStroke.getKeyStroke(
+        key.nativeKeyCode,
+        run {
+            var value = 0
+            if (ctrl) value = value or InputEvent.CTRL_DOWN_MASK
+            if (meta) value = value or InputEvent.META_DOWN_MASK
+            if (alt) value = value or InputEvent.ALT_DOWN_MASK
+            if (shift) value = value or InputEvent.SHIFT_DOWN_MASK
+            value
+        }
+    )
diff --git a/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/input/pointer/InternalPointerEvent.desktop.kt b/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/input/pointer/InternalPointerEvent.desktop.kt
index b1cca07..002b26a 100644
--- a/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/input/pointer/InternalPointerEvent.desktop.kt
+++ b/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/input/pointer/InternalPointerEvent.desktop.kt
@@ -21,7 +21,8 @@
 import java.awt.event.MouseEvent
 
 @OptIn(InternalCoreApi::class)
-internal actual class InternalPointerEvent constructor(
+internal actual class InternalPointerEvent
+constructor(
     val type: PointerEventType,
     actual val changes: LongSparseArray<PointerInputChange>,
     val buttons: PointerButtons,
diff --git a/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/input/pointer/PointerEvent.desktop.kt b/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/input/pointer/PointerEvent.desktop.kt
index 25d0582..b0701b2 100644
--- a/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/input/pointer/PointerEvent.desktop.kt
+++ b/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/input/pointer/PointerEvent.desktop.kt
@@ -19,11 +19,10 @@
 import java.awt.event.MouseEvent
 
 internal actual typealias NativePointerButtons = Int
+
 internal actual typealias NativePointerKeyboardModifiers = Int
 
-/**
- * Creates [PointerButtons] with the specified state of the pressed buttons.
- */
+/** Creates [PointerButtons] with the specified state of the pressed buttons. */
 fun PointerButtons(
     isPrimaryPressed: Boolean = false,
     isSecondaryPressed: Boolean = false,
@@ -71,31 +70,24 @@
 
 internal actual fun EmptyPointerKeyboardModifiers() = PointerKeyboardModifiers()
 
-/**
- * Describes a pointer input change event that has occurred at a particular point in time.
- */
-actual data class PointerEvent internal constructor(
-    /**
-     * The changes.
-     */
+/** Describes a pointer input change event that has occurred at a particular point in time. */
+actual data class PointerEvent
+internal constructor(
+    /** The changes. */
     actual val changes: List<PointerInputChange>,
 
-    /**
-     * The state of buttons (e.g. mouse or stylus buttons) during this event.
-     */
+    /** The state of buttons (e.g. mouse or stylus buttons) during this event. */
     actual val buttons: PointerButtons,
 
-    /**
-     * The state of modifier keys during this event.
-     */
+    /** The state of modifier keys during this event. */
     actual val keyboardModifiers: PointerKeyboardModifiers,
 
     /**
      * Original raw native event from AWT.
      *
-     * Note, that its type can be different from [type], which is sent by Compose.
-     * For example, Compose can send synthetic Move event on relayout,
-     * but [mouseEvent] will tell that it is Up event
+     * Note, that its type can be different from [type], which is sent by Compose. For example,
+     * Compose can send synthetic Move event on relayout, but [mouseEvent] will tell that it is Up
+     * event
      */
     val mouseEvent: MouseEvent?
 ) {
@@ -111,10 +103,10 @@
         this.type = internalPointerEvent?.type ?: PointerEventType.Unknown
     }
 
-    /**
-     * @param changes The changes.
-     */
-    actual constructor(changes: List<PointerInputChange>) : this(
+    /** @param changes The changes. */
+    actual constructor(
+        changes: List<PointerInputChange>
+    ) : this(
         changes,
         buttons = PointerButtons(0),
         keyboardModifiers = PointerKeyboardModifiers(0),
@@ -145,6 +137,7 @@
     const val ScrollLockOn = 1 shl 8
     const val NumLockOn = 1 shl 9
 }
+
 actual val PointerButtons.isPrimaryPressed
     get() = (packedValue and ButtonMasks.Primary) != 0
 
@@ -171,26 +164,32 @@
     }
 
 actual val PointerButtons.areAnyPressed: Boolean
-    get() = isPrimaryPressed || isSecondaryPressed || isTertiaryPressed ||
-        isBackPressed || isForwardPressed
+    get() =
+        isPrimaryPressed ||
+            isSecondaryPressed ||
+            isTertiaryPressed ||
+            isBackPressed ||
+            isForwardPressed
 
-actual fun PointerButtons.indexOfFirstPressed(): Int = when {
-    isPrimaryPressed -> 0
-    isSecondaryPressed -> 1
-    isTertiaryPressed -> 2
-    isBackPressed -> 3
-    isForwardPressed -> 4
-    else -> -1
-}
+actual fun PointerButtons.indexOfFirstPressed(): Int =
+    when {
+        isPrimaryPressed -> 0
+        isSecondaryPressed -> 1
+        isTertiaryPressed -> 2
+        isBackPressed -> 3
+        isForwardPressed -> 4
+        else -> -1
+    }
 
-actual fun PointerButtons.indexOfLastPressed(): Int = when {
-    isForwardPressed -> 4
-    isBackPressed -> 3
-    isTertiaryPressed -> 2
-    isSecondaryPressed -> 1
-    isPrimaryPressed -> 0
-    else -> -1
-}
+actual fun PointerButtons.indexOfLastPressed(): Int =
+    when {
+        isForwardPressed -> 4
+        isBackPressed -> 3
+        isTertiaryPressed -> 2
+        isSecondaryPressed -> 1
+        isPrimaryPressed -> 0
+        else -> -1
+    }
 
 actual val PointerKeyboardModifiers.isCtrlPressed: Boolean
     get() = (packedValue and KeyboardModifierMasks.CtrlPressed) != 0
diff --git a/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/input/pointer/PointerIcon.desktop.kt b/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/input/pointer/PointerIcon.desktop.kt
index e6e52fd..bf6fad1 100644
--- a/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/input/pointer/PointerIcon.desktop.kt
+++ b/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/input/pointer/PointerIcon.desktop.kt
@@ -39,9 +39,7 @@
     }
 }
 
-/**
- * Creates [PointerIcon] from [Cursor]
- */
+/** Creates [PointerIcon] from [Cursor] */
 fun PointerIcon(cursor: Cursor): PointerIcon = AwtCursor(cursor)
 
 internal actual val pointerIconDefault: PointerIcon = AwtCursor(Cursor(Cursor.DEFAULT_CURSOR))
diff --git a/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/input/pointer/PointerMoveFilter.desktop.kt b/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/input/pointer/PointerMoveFilter.desktop.kt
index d4b4e76..9b717f9 100644
--- a/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/input/pointer/PointerMoveFilter.desktop.kt
+++ b/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/input/pointer/PointerMoveFilter.desktop.kt
@@ -22,35 +22,38 @@
 
 /**
  * Modifier allowing to track pointer (i.e. mouse or trackpad) move events.
- *  @param onMove The callback invoked when pointer is moved inside a component,
- *  relative position inside a component is passed
- *  @param onEnter The callback invoked when pointer enters the component
- *  @param onExit The callback invoked when pointer leaves the component
+ *
+ * @param onMove The callback invoked when pointer is moved inside a component, relative position
+ *   inside a component is passed
+ * @param onEnter The callback invoked when pointer enters the component
+ * @param onExit The callback invoked when pointer leaves the component
  */
 @ExperimentalComposeUiApi
 fun Modifier.pointerMoveFilter(
     onMove: (position: Offset) -> Boolean = { false },
     onExit: () -> Boolean = { false },
     onEnter: () -> Boolean = { false },
-): Modifier = pointerInput(onMove, onExit, onEnter) {
-    awaitPointerEventScope {
-        while (true) {
-            val event = awaitPointerEvent()
-            val consumed = when (event.type) {
-                PointerEventType.Move -> {
-                    onMove(event.changes.first().position)
+): Modifier =
+    pointerInput(onMove, onExit, onEnter) {
+        awaitPointerEventScope {
+            while (true) {
+                val event = awaitPointerEvent()
+                val consumed =
+                    when (event.type) {
+                        PointerEventType.Move -> {
+                            onMove(event.changes.first().position)
+                        }
+                        PointerEventType.Enter -> {
+                            onEnter()
+                        }
+                        PointerEventType.Exit -> {
+                            onExit()
+                        }
+                        else -> false
+                    }
+                if (consumed) {
+                    event.changes.forEach { it.consume() }
                 }
-                PointerEventType.Enter -> {
-                    onEnter()
-                }
-                PointerEventType.Exit -> {
-                    onExit()
-                }
-                else -> false
-            }
-            if (consumed) {
-                event.changes.forEach { it.consume() }
             }
         }
     }
-}
diff --git a/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/input/rotary/RotaryScrollEvent.desktop.kt b/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/input/rotary/RotaryScrollEvent.desktop.kt
index 02ae758..5eaf640 100644
--- a/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/input/rotary/RotaryScrollEvent.desktop.kt
+++ b/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/input/rotary/RotaryScrollEvent.desktop.kt
@@ -19,19 +19,20 @@
 /**
  * This event represents a rotary input event.
  *
- * Some devices contain a physical rotating side button, or a rotating bezel. When the user
- * turns the button or rotates the bezel, a [RotaryScrollEvent] is sent to the item in focus.
+ * Some devices contain a physical rotating side button, or a rotating bezel. When the user turns
+ * the button or rotates the bezel, a [RotaryScrollEvent] is sent to the item in focus.
  */
-actual class RotaryScrollEvent internal constructor(
+actual class RotaryScrollEvent
+internal constructor(
     /**
-     * The amount to scroll (in pixels) in response to a [RotaryScrollEvent] in a container that
-     * can scroll vertically.
+     * The amount to scroll (in pixels) in response to a [RotaryScrollEvent] in a container that can
+     * scroll vertically.
      */
     actual val verticalScrollPixels: Float,
 
     /**
-     * The amount to scroll (in pixels) in response to a [RotaryScrollEvent] in a container that
-     * can scroll horizontally.
+     * The amount to scroll (in pixels) in response to a [RotaryScrollEvent] in a container that can
+     * scroll horizontally.
      */
     actual val horizontalScrollPixels: Float,
 
@@ -40,20 +41,21 @@
      * platform-dependent.
      */
     actual val uptimeMillis: Long,
-
 ) {
-    override fun equals(other: Any?): Boolean = other is RotaryScrollEvent &&
-        other.verticalScrollPixels == verticalScrollPixels &&
-        other.horizontalScrollPixels == horizontalScrollPixels &&
-        other.uptimeMillis == uptimeMillis
+    override fun equals(other: Any?): Boolean =
+        other is RotaryScrollEvent &&
+            other.verticalScrollPixels == verticalScrollPixels &&
+            other.horizontalScrollPixels == horizontalScrollPixels &&
+            other.uptimeMillis == uptimeMillis
 
-    override fun hashCode(): Int = 0
-        .let { verticalScrollPixels.hashCode() }
-        .let { 31 * it + horizontalScrollPixels.hashCode() }
-        .let { 31 * it + uptimeMillis.hashCode() }
+    override fun hashCode(): Int =
+        0.let { verticalScrollPixels.hashCode() }
+            .let { 31 * it + horizontalScrollPixels.hashCode() }
+            .let { 31 * it + uptimeMillis.hashCode() }
 
-    override fun toString(): String = "RotaryScrollEvent(" +
-        "verticalScrollPixels=$verticalScrollPixels," +
-        "horizontalScrollPixels=$horizontalScrollPixels," +
-        "uptimeMillis=$uptimeMillis)"
+    override fun toString(): String =
+        "RotaryScrollEvent(" +
+            "verticalScrollPixels=$verticalScrollPixels," +
+            "horizontalScrollPixels=$horizontalScrollPixels," +
+            "uptimeMillis=$uptimeMillis)"
 }
diff --git a/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/platform/Accessibility.desktop.kt b/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/platform/Accessibility.desktop.kt
index 5d43190d..bc35f16 100644
--- a/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/platform/Accessibility.desktop.kt
+++ b/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/platform/Accessibility.desktop.kt
@@ -44,11 +44,9 @@
             return _currentNodes
         }
 
-    @Suppress("UNUSED_PARAMETER")
-    fun fireNewNodeEvent(accessible: ComposeAccessible) {}
+    @Suppress("UNUSED_PARAMETER") fun fireNewNodeEvent(accessible: ComposeAccessible) {}
 
-    @Suppress("UNUSED_PARAMETER")
-    fun fireRemovedNodeEvent(accessible: ComposeAccessible) {}
+    @Suppress("UNUSED_PARAMETER") fun fireRemovedNodeEvent(accessible: ComposeAccessible) {}
 
     fun fireChangedNodeEvent(
         component: ComposeAccessible,
@@ -62,31 +60,36 @@
                     SemanticsProperties.Text -> {
                         component.accessibleContext.firePropertyChange(
                             ACCESSIBLE_TEXT_PROPERTY,
-                            prev, entry.value
+                            prev,
+                            entry.value
                         )
                     }
                     SemanticsProperties.EditableText -> {
                         component.accessibleContext.firePropertyChange(
                             ACCESSIBLE_TEXT_PROPERTY,
-                            prev, entry.value
+                            prev,
+                            entry.value
                         )
                     }
                     SemanticsProperties.TextSelectionRange -> {
                         component.accessibleContext.firePropertyChange(
                             ACCESSIBLE_CARET_PROPERTY,
-                            prev, (entry.value as TextRange).start
+                            prev,
+                            (entry.value as TextRange).start
                         )
                     }
                     SemanticsProperties.Focused ->
                         if (entry.value as Boolean) {
                             component.accessibleContext.firePropertyChange(
                                 ACCESSIBLE_STATE_PROPERTY,
-                                null, AccessibleState.FOCUSED
+                                null,
+                                AccessibleState.FOCUSED
                             )
                         } else {
                             component.accessibleContext.firePropertyChange(
                                 ACCESSIBLE_STATE_PROPERTY,
-                                AccessibleState.FOCUSED, null
+                                AccessibleState.FOCUSED,
+                                null
                             )
                         }
                     SemanticsProperties.ToggleableState -> {
@@ -94,12 +97,15 @@
                             ToggleableState.On ->
                                 component.accessibleContext.firePropertyChange(
                                     ACCESSIBLE_STATE_PROPERTY,
-                                    null, AccessibleState.CHECKED
+                                    null,
+                                    AccessibleState.CHECKED
                                 )
-                            ToggleableState.Off, ToggleableState.Indeterminate ->
+                            ToggleableState.Off,
+                            ToggleableState.Indeterminate ->
                                 component.accessibleContext.firePropertyChange(
                                     ACCESSIBLE_STATE_PROPERTY,
-                                    AccessibleState.CHECKED, null
+                                    AccessibleState.CHECKED,
+                                    null
                                 )
                         }
                     }
@@ -116,10 +122,7 @@
             get() = System.currentTimeMillis() - lastAccessTimeMillis < maxIdleTimeMillis
     }
 
-    /**
-     * When called wakes up the sync loop, which may be stopped after
-     * some period of inactivity
-     */
+    /** When called wakes up the sync loop, which may be stopped after some period of inactivity */
     fun notifyIsInUse() {
         SyncLoopState.lastAccessTimeMillis = System.currentTimeMillis()
     }
@@ -141,14 +144,13 @@
         val previous = _currentNodes
         val nodes = mutableMapOf<Int, ComposeAccessible>()
         fun findAllSemanticNodesRecursive(currentNode: SemanticsNode) {
-            nodes[currentNode.id] = previous[currentNode.id]?.let {
-                val prevSemanticsNode = it.semanticsNode
-                it.semanticsNode = currentNode
-                fireChangedNodeEvent(it, prevSemanticsNode, currentNode)
-                it
-            } ?: ComposeAccessible(currentNode, this).also {
-                fireNewNodeEvent(it)
-            }
+            nodes[currentNode.id] =
+                previous[currentNode.id]?.let {
+                    val prevSemanticsNode = it.semanticsNode
+                    it.semanticsNode = currentNode
+                    fireChangedNodeEvent(it, prevSemanticsNode, currentNode)
+                    it
+                } ?: ComposeAccessible(currentNode, this).also { fireNewNodeEvent(it) }
 
             // TODO fake nodes?
             // TODO find only visible nodes?
@@ -186,15 +188,14 @@
 
 internal fun Accessible.print(level: Int = 0) {
     val context = accessibleContext
-    val id = if (this is ComposeAccessible) {
-        this.semanticsNode.id.toString()
-    } else {
-        "unknown"
-    }
-    val str = buildString {
-        (1..level).forEach {
-            append('\t')
+    val id =
+        if (this is ComposeAccessible) {
+            this.semanticsNode.id.toString()
+        } else {
+            "unknown"
         }
+    val str = buildString {
+        (1..level).forEach { append('\t') }
         append(
             "ID: $id Name: ${context.accessibleName} " +
                 "Description: ${context.accessibleDescription} " +
diff --git a/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/platform/ComposeAccessible.desktop.kt b/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/platform/ComposeAccessible.desktop.kt
index efbf061..a532d57 100644
--- a/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/platform/ComposeAccessible.desktop.kt
+++ b/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/platform/ComposeAccessible.desktop.kt
@@ -70,36 +70,41 @@
 
 private typealias ActionKey = SemanticsPropertyKey<AccessibilityAction<() -> Boolean>>
 
-/**
- * An adapter for SemanticNode for AWT accessibility
- */
+/** An adapter for SemanticNode for AWT accessibility */
 internal class ComposeAccessible(
     var semanticsNode: SemanticsNode,
     val controller: AccessibilityControllerImpl? = null
 ) : Accessible {
     val accessibleContext: ComposeAccessibleComponent by lazy { ComposeAccessibleComponent() }
+
     override fun getAccessibleContext(): AccessibleContext = accessibleContext
 
     open inner class ComposeAccessibleComponent : AccessibleContext(), AccessibleComponent {
         val textSelectionRange
             get() = semanticsNode.config.getOrNull(SemanticsProperties.TextSelectionRange)
+
         val setText
             get() = semanticsNode.config.getOrNull(SemanticsActions.SetText)
+
         val setSelection
             get() = semanticsNode.config.getOrNull(SemanticsActions.SetSelection)
+
         val text
             // TODO should we concatenate the texts instead of getting only the first one
             // Concatenation seems to be reasonable eg, for button with two text nodes inside
             // but conflicts with setText action
-            get() = semanticsNode.config.getOrNull(SemanticsProperties.EditableText)
-                ?: semanticsNode.config.getFirstOrNull(SemanticsProperties.Text)
+            get() =
+                semanticsNode.config.getOrNull(SemanticsProperties.EditableText)
+                    ?: semanticsNode.config.getFirstOrNull(SemanticsProperties.Text)
 
         val textLayoutResult: TextLayoutResult?
             get() {
                 val textLayoutResults = mutableListOf<TextLayoutResult>()
-                val getLayoutResult = semanticsNode.config
-                    .getOrNull(SemanticsActions.GetTextLayoutResult)
-                    ?.action?.invoke(textLayoutResults)
+                val getLayoutResult =
+                    semanticsNode.config
+                        .getOrNull(SemanticsActions.GetTextLayoutResult)
+                        ?.action
+                        ?.invoke(textLayoutResults)
                 return if (getLayoutResult == true) {
                     textLayoutResults[0]
                 } else {
@@ -133,61 +138,51 @@
 
         val auxiliaryChildren
             get() = buildList {
-                horizontalScroll?.let {
-                    add(makeScrollbarChild(false))
-                }
-                verticalScroll?.let {
-                    add(makeScrollbarChild(true))
-                }
+                horizontalScroll?.let { add(makeScrollbarChild(false)) }
+                verticalScroll?.let { add(makeScrollbarChild(true)) }
             }
 
-        private fun makeScrollbarChild(
-            vertical: Boolean
-        ): Accessible {
+        private fun makeScrollbarChild(vertical: Boolean): Accessible {
             val bar = ScrollBarAccessible(vertical)
 
-            val controlledBy = AccessibleRelation(
-                AccessibleRelation.CONTROLLED_BY,
-                bar
-            )
-            val controllerFor = AccessibleRelation(
-                AccessibleRelation.CONTROLLER_FOR,
-                this@ComposeAccessible
-            )
+            val controlledBy = AccessibleRelation(AccessibleRelation.CONTROLLED_BY, bar)
+            val controllerFor =
+                AccessibleRelation(AccessibleRelation.CONTROLLER_FOR, this@ComposeAccessible)
             bar.context.accessibleRelationSet.add(controllerFor)
             accessibleRelationSet.add(controlledBy)
             return bar
         }
 
-        private fun Point.toComposeOffset() = with(density) {
-            Offset(x.dp.toPx(), y.dp.toPx())
-        }
+        private fun Point.toComposeOffset() = with(density) { Offset(x.dp.toPx(), y.dp.toPx()) }
 
         private fun Dp.toAwtPx() =
             if (value.isInfinite()) Constraints.Infinity else value.roundToInt()
 
-        private fun Rect.toAwtRectangle() = with(density) {
-            Rectangle(
-                left.toDp().toAwtPx(),
-                top.toDp().toAwtPx(),
-                width.toDp().toAwtPx(),
-                height.toDp().toAwtPx(),
-            )
-        }
+        private fun Rect.toAwtRectangle() =
+            with(density) {
+                Rectangle(
+                    left.toDp().toAwtPx(),
+                    top.toDp().toAwtPx(),
+                    width.toDp().toAwtPx(),
+                    height.toDp().toAwtPx(),
+                )
+            }
 
-        private fun Offset.toAwtPoint() = with(density) {
-            Point(
-                x.toDp().toAwtPx(),
-                y.toDp().toAwtPx(),
-            )
-        }
+        private fun Offset.toAwtPoint() =
+            with(density) {
+                Point(
+                    x.toDp().toAwtPx(),
+                    y.toDp().toAwtPx(),
+                )
+            }
 
-        private fun IntSize.toAwtDimension() = with(density) {
-            Dimension(
-                width.toDp().toAwtPx(),
-                height.toDp().toAwtPx(),
-            )
-        }
+        private fun IntSize.toAwtDimension() =
+            with(density) {
+                Dimension(
+                    width.toDp().toAwtPx(),
+                    height.toDp().toAwtPx(),
+                )
+            }
 
         override fun getAccessibleName(): String? {
             return text?.toString()
@@ -195,14 +190,12 @@
 
         override fun getAccessibleDescription(): String? {
             // TODO concatenate values?
-            return semanticsNode.config
-                .getFirstOrNull(SemanticsProperties.ContentDescription)
+            return semanticsNode.config.getFirstOrNull(SemanticsProperties.ContentDescription)
         }
 
         override fun getAccessibleParent(): Accessible? {
-            return semanticsNode.parent?.id?.let { id ->
-                controller?.let { it.currentNodes[id]!! }
-            } ?: accessibleParent
+            return semanticsNode.parent?.id?.let { id -> controller?.let { it.currentNodes[id]!! } }
+                ?: accessibleParent
         }
 
         override fun getAccessibleComponent(): AccessibleComponent? {
@@ -217,9 +210,7 @@
             val actions = mutableListOf<Pair<String?, ActionKey>>()
 
             fun addActionIfExist(key: SemanticsPropertyKey<AccessibilityAction<() -> Boolean>>) {
-                semanticsNode.config.getOrNull(key)?.let {
-                    actions.add(Pair(it.label, key))
-                }
+                semanticsNode.config.getOrNull(key)?.let { actions.add(Pair(it.label, key)) }
             }
             semanticsNode.config.getOrNull(SemanticsActions.OnClick)?.let {
                 // AWT expects "click" label for click actions, at least on macOS...
@@ -234,21 +225,22 @@
             if (actions.isEmpty()) {
                 return null
             }
-            _accessibleAction = object : AccessibleAction {
-                override fun getAccessibleActionCount(): Int = actions.size
+            _accessibleAction =
+                object : AccessibleAction {
+                    override fun getAccessibleActionCount(): Int = actions.size
 
-                override fun getAccessibleActionDescription(i: Int): String? {
-                    val (label, _) = actions[i]
-                    return label
-                }
+                    override fun getAccessibleActionDescription(i: Int): String? {
+                        val (label, _) = actions[i]
+                        return label
+                    }
 
-                override fun doAccessibleAction(i: Int): Boolean {
-                    val (_, actionKey) = actions[i]
-                    return semanticsNode.config.getOrNull(actionKey)?.let {
-                        it.action?.invoke()
-                    } ?: false
+                    override fun doAccessibleAction(i: Int): Boolean {
+                        val (_, actionKey) = actions[i]
+                        return semanticsNode.config.getOrNull(actionKey)?.let {
+                            it.action?.invoke()
+                        } ?: false
+                    }
                 }
-            }
             return _accessibleAction
         }
 
@@ -296,7 +288,7 @@
         override fun getLocale(): Locale = Locale.getDefault()
 
         override fun getLocationOnScreen(): Point {
-           return semanticsNode.positionOnScreen.toAwtPoint()
+            return semanticsNode.positionOnScreen.toAwtPoint()
         }
 
         override fun getLocation(): Point {
@@ -312,10 +304,11 @@
         }
 
         @OptIn(ExperimentalComposeUiApi::class)
-        override fun isVisible(): Boolean = with(semanticsNode) {
-            !config.contains(SemanticsProperties.InvisibleToUser) &&
-            !outerSemanticsNode.requireCoordinator(Nodes.Semantics).isTransparent()
-        }
+        override fun isVisible(): Boolean =
+            with(semanticsNode) {
+                !config.contains(SemanticsProperties.InvisibleToUser) &&
+                    !outerSemanticsNode.requireCoordinator(Nodes.Semantics).isTransparent()
+            }
 
         override fun isEnabled(): Boolean =
             semanticsNode.config.getOrNull(SemanticsProperties.Disabled) == null
@@ -347,8 +340,10 @@
 
         override fun requestFocus() {
             if (focused == false) {
-                semanticsNode.unmergedConfig.getOrNull(SemanticsActions.RequestFocus)
-                    ?.action?.invoke()
+                semanticsNode.unmergedConfig
+                    .getOrNull(SemanticsActions.RequestFocus)
+                    ?.action
+                    ?.invoke()
             }
         }
 
@@ -371,9 +366,9 @@
                 Role.Checkbox -> return AccessibleRole.CHECK_BOX
                 Role.RadioButton -> return AccessibleRole.RADIO_BUTTON
                 Role.Tab -> AccessibleRole.PAGE_TAB
-                // ?
-                //  Role.Switch ->
-                //  Role.Image ->
+            // ?
+            //  Role.Switch ->
+            //  Role.Image ->
             }
             if (isPassword) {
                 return AccessibleRole.PASSWORD_TEXT
@@ -396,51 +391,37 @@
                 // AccessibleState.SINGLE_LINE
                 // AccessibleState.MULTI_LINE
 
-                if (isEnabled)
-                    add(AccessibleState.ENABLED)
-                if (isShowing)
-                    add(AccessibleState.SHOWING)
-                if (isVisible)
-                    add(AccessibleState.VISIBLE)
-                if (isFocusTraversable)
-                    add(AccessibleState.FOCUSABLE)
-                if (focused == true)
-                    add(AccessibleState.FOCUSED)
+                if (isEnabled) add(AccessibleState.ENABLED)
+                if (isShowing) add(AccessibleState.SHOWING)
+                if (isVisible) add(AccessibleState.VISIBLE)
+                if (isFocusTraversable) add(AccessibleState.FOCUSABLE)
+                if (focused == true) add(AccessibleState.FOCUSED)
 
                 when (toggleableState) {
-                    ToggleableState.On ->
-                        add(AccessibleState.CHECKED)
-                    ToggleableState.Indeterminate ->
-                        add(AccessibleState.INDETERMINATE)
-                    ToggleableState.Off, null -> {
-                    }
+                    ToggleableState.On -> add(AccessibleState.CHECKED)
+                    ToggleableState.Indeterminate -> add(AccessibleState.INDETERMINATE)
+                    ToggleableState.Off,
+                    null -> {}
                 }
 
                 val canExpand = semanticsNode.config.getOrNull(SemanticsActions.Expand) != null
                 val canCollapse = semanticsNode.config.getOrNull(SemanticsActions.Collapse) != null
 
-                if (canExpand || canCollapse)
-                    add(AccessibleState.EXPANDABLE)
+                if (canExpand || canCollapse) add(AccessibleState.EXPANDABLE)
 
-                if (canExpand)
-                    add(AccessibleState.COLLAPSED)
+                if (canExpand) add(AccessibleState.COLLAPSED)
 
-                if (canCollapse)
-                    add(AccessibleState.EXPANDED)
+                if (canCollapse) add(AccessibleState.EXPANDED)
 
-                if (canCollapse)
-                    add(AccessibleState.EXPANDED)
+                if (canCollapse) add(AccessibleState.EXPANDED)
 
-                if (selected != null)
-                    add(AccessibleState.SELECTABLE)
+                if (selected != null) add(AccessibleState.SELECTABLE)
 
-                if (selected == true)
-                    add(AccessibleState.SELECTED)
+                if (selected == true) add(AccessibleState.SELECTED)
             }
         }
 
-        open inner class ComposeAccessibleText() : AccessibleText,
-            AccessibleExtendedText {
+        open inner class ComposeAccessibleText() : AccessibleText, AccessibleExtendedText {
             override fun getIndexAtPoint(p: Point): Int {
                 return textLayoutResult!!.getOffsetForPosition(p.toComposeOffset())
             }
@@ -466,12 +447,13 @@
             }
 
             private fun partToBreakIterator(part: Int): BreakIterator {
-                val iter = when (part) {
-                    AccessibleText.SENTENCE -> BreakIterator.makeSentenceInstance()
-                    AccessibleText.WORD -> BreakIterator.makeWordInstance()
-                    AccessibleText.CHARACTER -> BreakIterator.makeCharacterInstance()
-                    else -> throw IllegalArgumentException()
-                }
+                val iter =
+                    when (part) {
+                        AccessibleText.SENTENCE -> BreakIterator.makeSentenceInstance()
+                        AccessibleText.WORD -> BreakIterator.makeWordInstance()
+                        AccessibleText.CHARACTER -> BreakIterator.makeCharacterInstance()
+                        else -> throw IllegalArgumentException()
+                    }
                 iter.setText(text!!.toString())
                 return iter
             }
@@ -490,10 +472,11 @@
                     start = iterator.following(start)
                     if (start == BreakIterator.DONE) return ""
                 } while (text!![start] == ' ' || text!![start] == '\n')
-                val end = when (val end = iterator.next()) {
-                    BreakIterator.DONE -> iterator.last()
-                    else -> end
-                }
+                val end =
+                    when (val end = iterator.next()) {
+                        BreakIterator.DONE -> iterator.last()
+                        else -> end
+                    }
                 return text!!.subSequence(start, end).toString()
             }
 
@@ -549,63 +532,62 @@
             }
         }
 
-        inner class ScrollBarAccessible(
-            val vertical: Boolean
-        ) : Accessible {
-            val context: AccessibleContext = object : AccessibleContext(),
-                AccessibleValue {
-                private val range = if (vertical) {
-                    verticalScroll!!
-                } else {
-                    horizontalScroll!!
-                }
-
-                override fun getAccessibleValue(): AccessibleValue = this
-
-                override fun getAccessibleRole(): AccessibleRole =
-                    AccessibleRole.SCROLL_BAR
-
-                override fun getAccessibleStateSet(): AccessibleStateSet {
-                    return AccessibleStateSet().apply {
-                        add(AccessibleState.ENABLED)
+        inner class ScrollBarAccessible(val vertical: Boolean) : Accessible {
+            val context: AccessibleContext =
+                object : AccessibleContext(), AccessibleValue {
+                    private val range =
                         if (vertical) {
-                            add(AccessibleState.VERTICAL)
+                            verticalScroll!!
                         } else {
-                            add(AccessibleState.HORIZONTAL)
+                            horizontalScroll!!
+                        }
+
+                    override fun getAccessibleValue(): AccessibleValue = this
+
+                    override fun getAccessibleRole(): AccessibleRole = AccessibleRole.SCROLL_BAR
+
+                    override fun getAccessibleStateSet(): AccessibleStateSet {
+                        return AccessibleStateSet().apply {
+                            add(AccessibleState.ENABLED)
+                            if (vertical) {
+                                add(AccessibleState.VERTICAL)
+                            } else {
+                                add(AccessibleState.HORIZONTAL)
+                            }
                         }
                     }
-                }
 
-                override fun getAccessibleParent(): Accessible {
-                    return this@ComposeAccessible
-                }
-
-                override fun getAccessibleIndexInParent(): Int {
-                    return auxiliaryChildren.indexOf(this@ScrollBarAccessible)
-                }
-
-                override fun getAccessibleChildrenCount(): Int = 0
-
-                override fun getAccessibleChild(i: Int): Accessible? = null
-                override fun getLocale(): Locale {
-                    return Locale.getDefault()
-                }
-
-                override fun getCurrentAccessibleValue(): Number = range.value()
-
-                override fun setCurrentAccessibleValue(n: Number?): Boolean {
-                    return if (vertical) {
-                        scrollBy!!.action!!.invoke(0f, n!!.toFloat() - range.value())
-                    } else {
-                        scrollBy!!.action!!.invoke(n!!.toFloat() - range.value(), 0f)
+                    override fun getAccessibleParent(): Accessible {
+                        return this@ComposeAccessible
                     }
+
+                    override fun getAccessibleIndexInParent(): Int {
+                        return auxiliaryChildren.indexOf(this@ScrollBarAccessible)
+                    }
+
+                    override fun getAccessibleChildrenCount(): Int = 0
+
+                    override fun getAccessibleChild(i: Int): Accessible? = null
+
+                    override fun getLocale(): Locale {
+                        return Locale.getDefault()
+                    }
+
+                    override fun getCurrentAccessibleValue(): Number = range.value()
+
+                    override fun setCurrentAccessibleValue(n: Number?): Boolean {
+                        return if (vertical) {
+                            scrollBy!!.action!!.invoke(0f, n!!.toFloat() - range.value())
+                        } else {
+                            scrollBy!!.action!!.invoke(n!!.toFloat() - range.value(), 0f)
+                        }
+                    }
+
+                    override fun getMinimumAccessibleValue(): Number = 0
+
+                    override fun getMaximumAccessibleValue(): Number = range.maxValue()
                 }
 
-                override fun getMinimumAccessibleValue(): Number = 0
-
-                override fun getMaximumAccessibleValue(): Number = range.maxValue()
-            }
-
             override fun getAccessibleContext(): AccessibleContext = context
         }
 
@@ -635,13 +617,15 @@
 
             override fun insertTextAtIndex(index: Int, s: String) {
                 val text = text!!
-                setText!!.action!!.invoke(
-                    buildAnnotatedString {
-                        append(text.subSequence(0, index))
-                        append(s)
-                        append(text.subSequence(index, text.length - 1))
-                    }
-                )
+                setText!!
+                    .action!!
+                    .invoke(
+                        buildAnnotatedString {
+                            append(text.subSequence(0, index))
+                            append(s)
+                            append(text.subSequence(index, text.length - 1))
+                        }
+                    )
             }
 
             override fun getTextRange(startIndex: Int, endIndex: Int): String {
@@ -650,12 +634,14 @@
 
             override fun delete(startIndex: Int, endIndex: Int) {
                 val text = text!!
-                setText!!.action!!.invoke(
-                    buildAnnotatedString {
-                        append(text.subSequence(0, startIndex))
-                        append(text.subSequence(endIndex, text.length - 1))
-                    }
-                )
+                setText!!
+                    .action!!
+                    .invoke(
+                        buildAnnotatedString {
+                            append(text.subSequence(0, startIndex))
+                            append(text.subSequence(endIndex, text.length - 1))
+                        }
+                    )
             }
 
             override fun cut(startIndex: Int, endIndex: Int) {
@@ -668,13 +654,15 @@
 
             override fun replaceText(startIndex: Int, endIndex: Int, s: String) {
                 val text = text!!
-                setText!!.action!!.invoke(
-                    buildAnnotatedString {
-                        append(text.subSequence(0, startIndex))
-                        append(s)
-                        append(text.subSequence(endIndex, text.length - 1))
-                    }
-                )
+                setText!!
+                    .action!!
+                    .invoke(
+                        buildAnnotatedString {
+                            append(text.subSequence(0, startIndex))
+                            append(s)
+                            append(text.subSequence(endIndex, text.length - 1))
+                        }
+                    )
             }
 
             override fun selectText(startIndex: Int, endIndex: Int) {
diff --git a/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/platform/DesktopOwner.desktop.kt b/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/platform/DesktopOwner.desktop.kt
index 37f028c..35ddb03 100644
--- a/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/platform/DesktopOwner.desktop.kt
+++ b/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/platform/DesktopOwner.desktop.kt
@@ -32,8 +32,7 @@
     when {
         keyEvent.nativeKeyEvent.id == java.awt.event.KeyEvent.KEY_TYPED ->
             platformInputService.charKeyPressed = true
-        keyEvent.type == KeyEventType.KeyUp ->
-            platformInputService.charKeyPressed = false
+        keyEvent.type == KeyEventType.KeyUp -> platformInputService.charKeyPressed = false
     }
     return focusOwner.dispatchKeyEvent(keyEvent)
 }
@@ -46,8 +45,9 @@
 ) {
     when (icon) {
         is AwtCursor -> containerCursor?.componentCursor = icon.cursor
-        else -> if (containerCursor?.componentCursor != defaultCursor) {
-            containerCursor?.componentCursor = defaultCursor
-        }
+        else ->
+            if (containerCursor?.componentCursor != defaultCursor) {
+                containerCursor?.componentCursor = defaultCursor
+            }
     }
 }
diff --git a/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/platform/DesktopPlatform.desktop.kt b/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/platform/DesktopPlatform.desktop.kt
index 03ad58a..0b950c7 100644
--- a/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/platform/DesktopPlatform.desktop.kt
+++ b/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/platform/DesktopPlatform.desktop.kt
@@ -39,9 +39,7 @@
     Unknown;
 
     companion object {
-        /**
-         * Identify OS on which the application is currently running.
-         */
+        /** Identify OS on which the application is currently running. */
         val Current: DesktopPlatform by lazy {
             val name = System.getProperty("os.name")
             when {
diff --git a/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/platform/DesktopPlatformInput.desktop.kt b/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/platform/DesktopPlatformInput.desktop.kt
index 2535b33..0fb694a 100644
--- a/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/platform/DesktopPlatformInput.desktop.kt
+++ b/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/platform/DesktopPlatformInput.desktop.kt
@@ -46,13 +46,11 @@
 
     /**
      * @param inputMethodRequests Optional [InputMethodRequests]. If specified, the requests will
-     * only be cleared if still set to this value.
+     *   only be cleared if still set to this value.
      */
     fun disableInput(inputMethodRequests: InputMethodRequests? = null)
 
-    /**
-     * @see SkiaBasedOwner.textInputSession
-     */
+    /** @see SkiaBasedOwner.textInputSession */
     actual suspend fun textInputSession(
         session: suspend PlatformTextInputSessionScope.() -> Nothing
     ): Nothing
@@ -74,10 +72,13 @@
 
     var currentInput: CurrentInput? = null
 
-    // This is required to support input of accented characters using press-and-hold method (http://support.apple.com/kb/PH11264).
-    // JDK currently properly supports this functionality only for TextComponent/JTextComponent descendants.
+    // This is required to support input of accented characters using press-and-hold method
+    // (http://support.apple.com/kb/PH11264).
+    // JDK currently properly supports this functionality only for TextComponent/JTextComponent
+    // descendants.
     // For our editor component we need this workaround.
-    // After https://bugs.openjdk.java.net/browse/JDK-8074882 is fixed, this workaround should be replaced with a proper solution.
+    // After https://bugs.openjdk.java.net/browse/JDK-8074882 is fixed, this workaround should be
+    // replaced with a proper solution.
     var charKeyPressed: Boolean = false
     var needToDeletePreviousChar: Boolean = false
 
@@ -87,9 +88,7 @@
         onEditCommand: (List<EditCommand>) -> Unit,
         onImeActionPerformed: (ImeAction) -> Unit
     ) {
-        val input = CurrentInput(
-            value, onEditCommand, onImeActionPerformed, imeOptions.imeAction
-        )
+        val input = CurrentInput(value, onEditCommand, onImeActionPerformed, imeOptions.imeAction)
         currentInput = input
 
         component.enableInput(methodRequestsForInput(input))
@@ -100,23 +99,17 @@
         currentInput = null
     }
 
-    override fun showSoftwareKeyboard() {
-    }
+    override fun showSoftwareKeyboard() {}
 
-    override fun hideSoftwareKeyboard() {
-    }
+    override fun hideSoftwareKeyboard() {}
 
     override fun updateState(oldValue: TextFieldValue?, newValue: TextFieldValue) {
-        currentInput?.let { input ->
-            input.value = newValue
-        }
+        currentInput?.let { input -> input.value = newValue }
     }
 
     @Deprecated("This method should not be called, used BringIntoViewRequester instead.")
     override fun notifyFocusedRect(rect: Rect) {
-        currentInput?.let { input ->
-            input.focusedRect = rect
-        }
+        currentInput?.let { input -> input.focusedRect = rect }
     }
 
     internal fun inputMethodCaretPositionChanged(
@@ -140,7 +133,8 @@
                 ops.add(DeleteSurroundingTextInCodePointsCommand(1, 0))
             }
 
-            // newCursorPosition == 1 leads to effectively ignoring of this parameter in EditCommands
+            // newCursorPosition == 1 leads to effectively ignoring of this parameter in
+            // EditCommands
             // processing. the cursor will be set after the inserted text.
             if (committed.isNotEmpty()) {
                 ops.add(CommitTextCommand(committed, 1))
@@ -199,10 +193,11 @@
 
             override fun getTextLocation(offset: TextHitInfo): Rectangle? {
                 return input.focusedRect?.let {
-                    val x = (it.right / component.density.density).toInt() +
-                        component.locationOnScreen.x
-                    val y = (it.top / component.density.density).toInt() +
-                        component.locationOnScreen.y
+                    val x =
+                        (it.right / component.density.density).toInt() +
+                            component.locationOnScreen.x
+                    val y =
+                        (it.top / component.density.density).toInt() + component.locationOnScreen.y
                     Rectangle(x, y, it.width.toInt(), it.height.toInt())
                 }
             }
@@ -220,12 +215,13 @@
                     val res = text.substring(range)
                     return AttributedString(res).iterator
                 }
-                val committed = text.substring(
-                    TextRange(
-                        min(range.min, comp.min),
-                        max(range.max, comp.max).coerceAtMost(text.length)
+                val committed =
+                    text.substring(
+                        TextRange(
+                            min(range.min, comp.min),
+                            max(range.max, comp.max).coerceAtMost(text.length)
+                        )
                     )
-                )
                 return AttributedString(committed).iterator
             }
         }
@@ -255,5 +251,4 @@
     return String(strBuf)
 }
 
-private val isMac =
-    System.getProperty("os.name").lowercase(Locale.ENGLISH).startsWith("mac")
+private val isMac = System.getProperty("os.name").lowercase(Locale.ENGLISH).startsWith("mac")
diff --git a/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/platform/DesktopTextInputSession.desktop.kt b/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/platform/DesktopTextInputSession.desktop.kt
index 9b95882..57edcef 100644
--- a/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/platform/DesktopTextInputSession.desktop.kt
+++ b/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/platform/DesktopTextInputSession.desktop.kt
@@ -31,21 +31,20 @@
 
     private val innerSessionMutex = SessionMutex<Nothing?>()
 
-    override suspend fun startInputMethod(
-        request: PlatformTextInputMethodRequest
-    ): Nothing = innerSessionMutex.withSessionCancellingPrevious(
-        // This session has no data, just init/dispose tasks.
-        sessionInitializer = { null }
-    ) {
-        @Suppress("RemoveExplicitTypeArguments")
-        (suspendCancellableCoroutine<Nothing> { continuation ->
-            inputComponent.enableInput(request.inputMethodRequests)
-            component.addInputMethodListener(request.inputMethodListener)
+    override suspend fun startInputMethod(request: PlatformTextInputMethodRequest): Nothing =
+        innerSessionMutex.withSessionCancellingPrevious(
+            // This session has no data, just init/dispose tasks.
+            sessionInitializer = { null }
+        ) {
+            @Suppress("RemoveExplicitTypeArguments")
+            (suspendCancellableCoroutine<Nothing> { continuation ->
+                inputComponent.enableInput(request.inputMethodRequests)
+                component.addInputMethodListener(request.inputMethodListener)
 
-            continuation.invokeOnCancellation {
-                component.removeInputMethodListener(request.inputMethodListener)
-                inputComponent.disableInput(request.inputMethodRequests)
-            }
-        })
-    }
+                continuation.invokeOnCancellation {
+                    component.removeInputMethodListener(request.inputMethodListener)
+                    inputComponent.disableInput(request.inputMethodRequests)
+                }
+            })
+        }
 }
diff --git a/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/platform/GlobalSnapshotManager.desktop.kt b/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/platform/GlobalSnapshotManager.desktop.kt
index a478c6b..99ab740 100644
--- a/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/platform/GlobalSnapshotManager.desktop.kt
+++ b/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/platform/GlobalSnapshotManager.desktop.kt
@@ -27,15 +27,15 @@
 import kotlinx.coroutines.swing.Swing
 
 /**
- * Platform-specific mechanism for starting a monitor of global snapshot state writes
- * in order to schedule the periodic dispatch of snapshot apply notifications.
- * This process should remain platform-specific; it is tied to the threading and update model of
- * a particular platform and framework target.
+ * Platform-specific mechanism for starting a monitor of global snapshot state writes in order to
+ * schedule the periodic dispatch of snapshot apply notifications. This process should remain
+ * platform-specific; it is tied to the threading and update model of a particular platform and
+ * framework target.
  *
  * Composition bootstrapping mechanisms for a particular platform/framework should call
- * [ensureStarted] during setup to initialize periodic global snapshot notifications.
- * For desktop, these notifications are always sent on [Dispatchers.Swing]. Other platforms
- * may establish different policies for these notifications.
+ * [ensureStarted] during setup to initialize periodic global snapshot notifications. For desktop,
+ * these notifications are always sent on [Dispatchers.Swing]. Other platforms may establish
+ * different policies for these notifications.
  */
 internal actual object GlobalSnapshotManager {
     private val started = AtomicBoolean(false)
diff --git a/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/platform/PlatformClipboardManager.desktop.kt b/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/platform/PlatformClipboardManager.desktop.kt
index aa7e4fb..f353d5e 100644
--- a/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/platform/PlatformClipboardManager.desktop.kt
+++ b/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/platform/PlatformClipboardManager.desktop.kt
@@ -26,11 +26,12 @@
 import java.io.IOException
 
 internal actual class PlatformClipboardManager : ClipboardManager {
-    internal val systemClipboard = try {
-        Toolkit.getDefaultToolkit().getSystemClipboard()
-    } catch (e: java.awt.HeadlessException) {
-        null
-    }
+    internal val systemClipboard =
+        try {
+            Toolkit.getDefaultToolkit().getSystemClipboard()
+        } catch (e: java.awt.HeadlessException) {
+            null
+        }
 
     actual override fun getText(): AnnotatedString? {
         return systemClipboard?.let {
@@ -72,9 +73,7 @@
 
 // Defining this class not as a typealias but a wrapper gives us flexibility in the future to
 // add more functionality in it.
-actual class ClipEntry(
-    internal val transferable: Transferable
-) {
+actual class ClipEntry(internal val transferable: Transferable) {
     @Throws(UnsupportedFlavorException::class, IOException::class)
     fun getTransferData(flavor: DataFlavor): Any? {
         return transferable.getTransferData(flavor)
@@ -86,9 +85,7 @@
 
 // Defining this class not as a typealias but a wrapper gives us flexibility in the future to
 // add more functionality in it.
-actual class ClipMetadata(
-    internal val transferable: Transferable
-) {
+actual class ClipMetadata(internal val transferable: Transferable) {
     fun getTransferDataFlavors(): List<DataFlavor> {
         val dataFlavors = transferable.transferDataFlavors ?: return emptyList()
         return dataFlavors.filterNotNull()
diff --git a/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/platform/PlatformComponent.desktop.kt b/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/platform/PlatformComponent.desktop.kt
index c43feaa..b1e2d28 100644
--- a/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/platform/PlatformComponent.desktop.kt
+++ b/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/platform/PlatformComponent.desktop.kt
@@ -31,6 +31,7 @@
 internal actual object DummyPlatformComponent : PlatformComponent {
     override var componentCursor: Cursor = Cursor(Cursor.CROSSHAIR_CURSOR)
     var enabledInput: InputMethodRequests? = null
+
     override fun enableInput(inputMethodRequests: InputMethodRequests) {
         enabledInput = inputMethodRequests
     }
diff --git a/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/platform/PlatformLocalization.desktop.kt b/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/platform/PlatformLocalization.desktop.kt
index 0e985da..a80d8df 100644
--- a/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/platform/PlatformLocalization.desktop.kt
+++ b/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/platform/PlatformLocalization.desktop.kt
@@ -25,13 +25,12 @@
     val selectAll: String
 }
 
-internal val defaultPlatformLocalization = object : PlatformLocalization {
-    override val copy = "Copy"
-    override val cut = "Cut"
-    override val paste = "Paste"
-    override val selectAll = "Select All"
-}
+internal val defaultPlatformLocalization =
+    object : PlatformLocalization {
+        override val copy = "Copy"
+        override val cut = "Cut"
+        override val paste = "Paste"
+        override val selectAll = "Select All"
+    }
 
-val LocalLocalization = staticCompositionLocalOf {
-    defaultPlatformLocalization
-}
+val LocalLocalization = staticCompositionLocalOf { defaultPlatformLocalization }
diff --git a/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/platform/TestComposeWindow.desktop.kt b/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/platform/TestComposeWindow.desktop.kt
index 88dd5ae..0043ca3 100644
--- a/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/platform/TestComposeWindow.desktop.kt
+++ b/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/platform/TestComposeWindow.desktop.kt
@@ -46,9 +46,10 @@
 import org.jetbrains.skiko.FrameDispatcher
 
 @PublishedApi
-internal val EmptyDispatcher = object : CoroutineDispatcher() {
-    override fun dispatch(context: CoroutineContext, block: Runnable) = Unit
-}
+internal val EmptyDispatcher =
+    object : CoroutineDispatcher() {
+        override fun dispatch(context: CoroutineContext, block: Runnable) = Unit
+    }
 
 /**
  * A virtual window for testing purposes.
@@ -66,18 +67,14 @@
     private val nanoTime: () -> Long = System::nanoTime,
     coroutineContext: CoroutineContext = EmptyDispatcher
 ) {
-    /**
-     * Virtual surface on which the content will be drawn
-     */
+    /** Virtual surface on which the content will be drawn */
     val surface = Surface.makeRasterN32Premul(width, height)
 
     private val canvas = surface.canvas
 
     private val coroutineScope = CoroutineScope(coroutineContext + Job())
-    private val frameDispatcher: FrameDispatcher = FrameDispatcher(
-        onFrame = { onFrame() },
-        context = coroutineScope.coroutineContext
-    )
+    private val frameDispatcher: FrameDispatcher =
+        FrameDispatcher(onFrame = { onFrame() }, context = coroutineScope.coroutineContext)
 
     private fun onFrame() {
         canvas.clear(Color.Transparent.toArgb())
@@ -86,40 +83,33 @@
     }
 
     internal val component = DummyPlatformComponent
-    private val scene = ComposeScene(
-        coroutineScope.coroutineContext,
-        component,
-        density,
-        invalidate = frameDispatcher::scheduleFrame
-    ).apply {
-        constraints = Constraints(maxWidth = width, maxHeight = height)
-    }
+    private val scene =
+        ComposeScene(
+                coroutineScope.coroutineContext,
+                component,
+                density,
+                invalidate = frameDispatcher::scheduleFrame
+            )
+            .apply { constraints = Constraints(maxWidth = width, maxHeight = height) }
 
     val currentCursor
         get() = component.componentCursor
 
-    /**
-     * All currently registered [RootForTest]s
-     */
+    /** All currently registered [RootForTest]s */
     @OptIn(InternalComposeUiApi::class)
-    val roots: Set<RootForTest> get() = scene.roots
+    val roots: Set<RootForTest>
+        get() = scene.roots
 
-    /**
-     * Clear-up all acquired resources and stop all pending work
-     */
+    /** Clear-up all acquired resources and stop all pending work */
     fun dispose() {
         scene.close()
         coroutineScope.cancel()
     }
 
-    /**
-     * Returns true if there are pending work scheduled by this window
-     */
+    /** Returns true if there are pending work scheduled by this window */
     fun hasInvalidations(): Boolean = scene.hasInvalidations()
 
-    /**
-     * Compose [content] immediately and draw it on a [surface]
-     */
+    /** Compose [content] immediately and draw it on a [surface] */
     fun setContent(content: @Composable () -> Unit) {
         scene.constraints = Constraints(maxWidth = width, maxHeight = height)
         scene.setContent(content = content)
@@ -131,47 +121,46 @@
         scene.render(canvas, nanoTime = nanoTime())
     }
 
-    /**
-     * Process mouse scroll event
-     */
+    /** Process mouse scroll event */
     @OptIn(ExperimentalComposeUiApi::class)
     fun onMouseScroll(x: Int, y: Int, event: MouseScrollEvent) {
-        val delta = when (event.delta) {
-            is MouseScrollUnit.Line -> event.delta.value
-            is MouseScrollUnit.Page -> event.delta.value
-        }
+        val delta =
+            when (event.delta) {
+                is MouseScrollUnit.Line -> event.delta.value
+                is MouseScrollUnit.Page -> event.delta.value
+            }
         val wheelRotation = sign(delta)
         scene.sendPointerEvent(
             eventType = PointerEventType.Scroll,
             position = Offset(x.toFloat(), y.toFloat()),
-            scrollDelta = if (event.orientation == MouseScrollOrientation.Vertical) {
-                Offset(0f, wheelRotation)
-            } else {
-                Offset(wheelRotation, 0f)
-            },
-            nativeEvent = MouseWheelEvent(
-                EventComponent,
-                MouseWheelEvent.MOUSE_WHEEL,
-                0,
-                0,
-                0,
-                0,
-                0,
-                false,
-                if (event.delta is MouseScrollUnit.Line) {
-                    MouseWheelEvent.WHEEL_UNIT_SCROLL
+            scrollDelta =
+                if (event.orientation == MouseScrollOrientation.Vertical) {
+                    Offset(0f, wheelRotation)
                 } else {
-                    MouseWheelEvent.WHEEL_BLOCK_SCROLL
+                    Offset(wheelRotation, 0f)
                 },
-                abs(delta.roundToInt()),
-                wheelRotation.roundToInt()
-            )
+            nativeEvent =
+                MouseWheelEvent(
+                    EventComponent,
+                    MouseWheelEvent.MOUSE_WHEEL,
+                    0,
+                    0,
+                    0,
+                    0,
+                    0,
+                    false,
+                    if (event.delta is MouseScrollUnit.Line) {
+                        MouseWheelEvent.WHEEL_UNIT_SCROLL
+                    } else {
+                        MouseWheelEvent.WHEEL_BLOCK_SCROLL
+                    },
+                    abs(delta.roundToInt()),
+                    wheelRotation.roundToInt()
+                )
         )
     }
 
-    /**
-     * Process mouse move event
-     */
+    /** Process mouse move event */
     fun onMouseMoved(x: Int, y: Int) {
         scene.sendPointerEvent(
             eventType = PointerEventType.Move,
@@ -179,9 +168,7 @@
         )
     }
 
-    /**
-     * Process mouse enter event
-     */
+    /** Process mouse enter event */
     fun onMouseEntered(x: Int, y: Int) {
         scene.sendPointerEvent(
             eventType = PointerEventType.Enter,
@@ -189,14 +176,9 @@
         )
     }
 
-    /**
-     * Process mouse exit event
-     */
+    /** Process mouse exit event */
     fun onMouseExited() {
-        scene.sendPointerEvent(
-            eventType = PointerEventType.Exit,
-            position = Offset(-1f, -1f)
-        )
+        scene.sendPointerEvent(eventType = PointerEventType.Exit, position = Offset(-1f, -1f))
     }
 
     companion object {
diff --git a/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/res/DesktopSvgResources.desktop.kt b/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/res/DesktopSvgResources.desktop.kt
index 067c0d7..9ed97aa 100644
--- a/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/res/DesktopSvgResources.desktop.kt
+++ b/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/res/DesktopSvgResources.desktop.kt
@@ -44,23 +44,17 @@
  * In contrast to [svgResource] this function isn't [Composable]
  *
  * @param inputStream input stream to load an SVG resource. All bytes will be read from this stream,
- * but stream will not be closed after this method.
+ *   but stream will not be closed after this method.
  * @param density density that will be used to set the intrinsic size of the Painter. If the image
- * will be drawn with the specified size, density will have no effect.
+ *   will be drawn with the specified size, density will have no effect.
  * @return the decoded SVG image associated with the resource
  */
-fun loadSvgPainter(
-    inputStream: InputStream,
-    density: Density
-): Painter {
+fun loadSvgPainter(inputStream: InputStream, density: Density): Painter {
     val data = Data.makeFromBytes(inputStream.readAllBytes())
     return SVGPainter(SVGDOM(data), density)
 }
 
-private class SVGPainter(
-    private val dom: SVGDOM,
-    private val density: Density
-) : Painter() {
+private class SVGPainter(private val dom: SVGDOM, private val density: Density) : Painter() {
     private val root = dom.root
 
     private val defaultSizePx: Size = run {
@@ -79,13 +73,14 @@
         }
     }
 
-    override val intrinsicSize: Size get() {
-        return if (defaultSizePx.isSpecified) {
-            defaultSizePx * density.density
-        } else {
-            Size.Unspecified
+    override val intrinsicSize: Size
+        get() {
+            return if (defaultSizePx.isSpecified) {
+                defaultSizePx * density.density
+            } else {
+                Size.Unspecified
+            }
         }
-    }
 
     private var previousDrawSize: Size = Size.Unspecified
     private var alpha: Float = 1.0f
diff --git a/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/res/DesktopXmlVectorResources.desktop.kt b/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/res/DesktopXmlVectorResources.desktop.kt
index bfc4781..f28f010 100644
--- a/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/res/DesktopXmlVectorResources.desktop.kt
+++ b/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/res/DesktopXmlVectorResources.desktop.kt
@@ -28,22 +28,18 @@
  * XML Vector Image is came from Android world. See:
  * https://developer.android.com/guide/topics/graphics/vector-drawable-resources
  *
- * On desktop it is fully implemented except there is no resource linking
- * (for example, we can't reference to color defined in another file)
+ * On desktop it is fully implemented except there is no resource linking (for example, we can't
+ * reference to color defined in another file)
  *
  * @param inputSource input source to load xml vector image. Will be closed automatically.
  * @param density density that will be used to set the default size of the ImageVector. If the image
- * will be drawn with the specified size, density will have no effect.
+ *   will be drawn with the specified size, density will have no effect.
  * @return the decoded vector image associated with the image
  */
-fun loadXmlImageVector(
-    inputSource: InputSource,
-    density: Density
-): ImageVector = DocumentBuilderFactory
-    .newInstance().apply {
-        isNamespaceAware = true
-    }
-    .newDocumentBuilder()
-    .parse(inputSource)
-    .documentElement
-    .parseVectorRoot(density)
+fun loadXmlImageVector(inputSource: InputSource, density: Density): ImageVector =
+    DocumentBuilderFactory.newInstance()
+        .apply { isNamespaceAware = true }
+        .newDocumentBuilder()
+        .parse(inputSource)
+        .documentElement
+        .parseVectorRoot(density)
diff --git a/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/res/ImageResources.desktop.kt b/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/res/ImageResources.desktop.kt
index 9a8330a..4e4abba3 100644
--- a/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/res/ImageResources.desktop.kt
+++ b/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/res/ImageResources.desktop.kt
@@ -25,8 +25,8 @@
  * Load and decode [ImageBitmap] from the given [inputStream]. [inputStream] should contain encoded
  * raster image in a format supported by Skia (BMP, GIF, HEIF, ICO, JPEG, PNG, WBMP, WebP)
  *
- * @param inputStream input stream to load an rater image. All bytes will be read from this
- * stream, but stream will not be closed after this method.
+ * @param inputStream input stream to load an rater image. All bytes will be read from this stream,
+ *   but stream will not be closed after this method.
  * @return the decoded SVG image associated with the resource
  */
 fun loadImageBitmap(inputStream: InputStream): ImageBitmap =
diff --git a/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/res/PainterResources.desktop.kt b/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/res/PainterResources.desktop.kt
index a2e730d..3e4b8a6 100644
--- a/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/res/PainterResources.desktop.kt
+++ b/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/res/PainterResources.desktop.kt
@@ -26,58 +26,49 @@
 import org.xml.sax.InputSource
 
 /**
- * Load a [Painter] from an resource stored in resources for the application and decode
- * it based on the file extension.
+ * Load a [Painter] from an resource stored in resources for the application and decode it based on
+ * the file extension.
  *
  * Supported formats:
  * - SVG
- * - XML vector drawable
- *   (see https://developer.android.com/guide/topics/graphics/vector-drawable-resources)
+ * - XML vector drawable (see
+ *   https://developer.android.com/guide/topics/graphics/vector-drawable-resources)
  * - raster formats (BMP, GIF, HEIF, ICO, JPEG, PNG, WBMP, WebP)
  *
- * To load an image from other places (file storage, database, network), use these
- * functions inside [LaunchedEffect] or [remember]:
- * [loadImageBitmap]
- * [loadSvgPainter]
- * [loadXmlImageVector]
+ * To load an image from other places (file storage, database, network), use these functions inside
+ * [LaunchedEffect] or [remember]: [loadImageBitmap] [loadSvgPainter] [loadXmlImageVector]
  *
- * @param resourcePath  path to the file in the resources folder
+ * @param resourcePath path to the file in the resources folder
  * @return [Painter] used for drawing the loaded resource
  */
 @Composable
-fun painterResource(
-    resourcePath: String
-): Painter = when (resourcePath.substringAfterLast(".")) {
-    "svg" -> rememberSvgResource(resourcePath)
-    "xml" -> rememberVectorXmlResource(resourcePath)
-    else -> rememberBitmapResource(resourcePath)
-}
+fun painterResource(resourcePath: String): Painter =
+    when (resourcePath.substringAfterLast(".")) {
+        "svg" -> rememberSvgResource(resourcePath)
+        "xml" -> rememberVectorXmlResource(resourcePath)
+        else -> rememberBitmapResource(resourcePath)
+    }
 
 @Composable
 private fun rememberSvgResource(resourcePath: String): Painter {
     val density = LocalDensity.current
     return remember(resourcePath, density) {
-        useResource(resourcePath) {
-            loadSvgPainter(it, density)
-        }
+        useResource(resourcePath) { loadSvgPainter(it, density) }
     }
 }
 
 @Composable
 private fun rememberVectorXmlResource(resourcePath: String): Painter {
     val density = LocalDensity.current
-    val image = remember(resourcePath, density) {
-        useResource(resourcePath) {
-            loadXmlImageVector(InputSource(it), density)
+    val image =
+        remember(resourcePath, density) {
+            useResource(resourcePath) { loadXmlImageVector(InputSource(it), density) }
         }
-    }
     return rememberVectorPainter(image)
 }
 
 @Composable
 private fun rememberBitmapResource(resourcePath: String): Painter {
-    val image = remember(resourcePath) {
-        useResource(resourcePath, ::loadImageBitmap)
-    }
+    val image = remember(resourcePath) { useResource(resourcePath, ::loadImageBitmap) }
     return BitmapPainter(image)
 }
diff --git a/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/res/Resources.desktop.kt b/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/res/Resources.desktop.kt
index 60ff71a..35f8ddb 100644
--- a/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/res/Resources.desktop.kt
+++ b/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/res/Resources.desktop.kt
@@ -20,17 +20,13 @@
 
 /**
  * Open [InputStream] from a resource stored in resources for the application, calls the [block]
- * callback giving it a InputStream and closes stream once the processing is
- * complete.
+ * callback giving it a InputStream and closes stream once the processing is complete.
  *
  * @return object that was returned by [block]
- *
  * @throws IllegalArgumentException if there is no [resourcePath] in resources
  */
-inline fun <T> useResource(
-    resourcePath: String,
-    block: (InputStream) -> T
-): T = openResource(resourcePath).use(block)
+inline fun <T> useResource(resourcePath: String, block: (InputStream) -> T): T =
+    openResource(resourcePath).use(block)
 
 /**
  * Open [InputStream] from a resource stored in resources for the application.
diff --git a/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/res/vector/DesktopValueParsers.desktop.kt b/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/res/vector/DesktopValueParsers.desktop.kt
index 583e20d..66efd8e 100644
--- a/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/res/vector/DesktopValueParsers.desktop.kt
+++ b/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/res/vector/DesktopValueParsers.desktop.kt
@@ -67,38 +67,43 @@
     }
 }
 
-internal fun parseFillType(fillType: String): PathFillType = when (fillType) {
-    "nonZero" -> PathFillType.NonZero
-    "evenOdd" -> PathFillType.EvenOdd
-    else -> throw UnsupportedOperationException("unknown fillType: $fillType")
-}
-
-internal fun parseStrokeCap(strokeCap: String): StrokeCap = when (strokeCap) {
-    "butt" -> StrokeCap.Butt
-    "round" -> StrokeCap.Round
-    "square" -> StrokeCap.Square
-    else -> throw UnsupportedOperationException("unknown strokeCap: $strokeCap")
-}
-
-internal fun parseStrokeJoin(strokeJoin: String): StrokeJoin = when (strokeJoin) {
-    "miter" -> StrokeJoin.Miter
-    "round" -> StrokeJoin.Round
-    "bevel" -> StrokeJoin.Bevel
-    else -> throw UnsupportedOperationException("unknown strokeJoin: $strokeJoin")
-}
-
-internal fun parseTileMode(tileMode: String): TileMode = when (tileMode) {
-    "clamp" -> TileMode.Clamp
-    "repeated" -> TileMode.Repeated
-    "mirror" -> TileMode.Mirror
-    else -> throw throw UnsupportedOperationException("unknown tileMode: $tileMode")
-}
-
-internal fun String?.parseDp(density: Density): Dp = with(density) {
-    return when {
-        this@parseDp == null -> 0f.dp
-        endsWith("dp") -> removeSuffix("dp").toFloat().dp
-        endsWith("px") -> removeSuffix("px").toFloat().toDp()
-        else -> throw UnsupportedOperationException("value should ends with dp or px")
+internal fun parseFillType(fillType: String): PathFillType =
+    when (fillType) {
+        "nonZero" -> PathFillType.NonZero
+        "evenOdd" -> PathFillType.EvenOdd
+        else -> throw UnsupportedOperationException("unknown fillType: $fillType")
     }
-}
+
+internal fun parseStrokeCap(strokeCap: String): StrokeCap =
+    when (strokeCap) {
+        "butt" -> StrokeCap.Butt
+        "round" -> StrokeCap.Round
+        "square" -> StrokeCap.Square
+        else -> throw UnsupportedOperationException("unknown strokeCap: $strokeCap")
+    }
+
+internal fun parseStrokeJoin(strokeJoin: String): StrokeJoin =
+    when (strokeJoin) {
+        "miter" -> StrokeJoin.Miter
+        "round" -> StrokeJoin.Round
+        "bevel" -> StrokeJoin.Bevel
+        else -> throw UnsupportedOperationException("unknown strokeJoin: $strokeJoin")
+    }
+
+internal fun parseTileMode(tileMode: String): TileMode =
+    when (tileMode) {
+        "clamp" -> TileMode.Clamp
+        "repeated" -> TileMode.Repeated
+        "mirror" -> TileMode.Mirror
+        else -> throw throw UnsupportedOperationException("unknown tileMode: $tileMode")
+    }
+
+internal fun String?.parseDp(density: Density): Dp =
+    with(density) {
+        return when {
+            this@parseDp == null -> 0f.dp
+            endsWith("dp") -> removeSuffix("dp").toFloat().dp
+            endsWith("px") -> removeSuffix("px").toFloat().toDp()
+            else -> throw UnsupportedOperationException("value should ends with dp or px")
+        }
+    }
diff --git a/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/res/vector/DesktopXmlVectorParser.desktop.kt b/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/res/vector/DesktopXmlVectorParser.desktop.kt
index cb92895..c504224 100644
--- a/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/res/vector/DesktopXmlVectorParser.desktop.kt
+++ b/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/res/vector/DesktopXmlVectorParser.desktop.kt
@@ -41,7 +41,8 @@
 import org.w3c.dom.Node
 
 //  Parsing logic is the same as in Android implementation
-//  (compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/graphics/vector/compat/XmlVectorParser.kt)
+//
+// (compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/graphics/vector/compat/XmlVectorParser.kt)
 //
 //  Except there is no support for linking with external resources
 //  (for example, we can't reference to color defined in another file)
@@ -56,14 +57,12 @@
     val currentGroups = LinkedList<Group>()
 
     enum class Group {
-        /**
-         * Group that exists in xml file
-         */
+        /** Group that exists in xml file */
         Real,
 
         /**
-         * Group that doesn't exist in xml file. We add it manually when we see <clip-path> node.
-         * It will be automatically popped when the real group will be popped.
+         * Group that doesn't exist in xml file. We add it manually when we see <clip-path> node. It
+         * will be automatically popped when the real group will be popped.
          */
         Virtual
     }
@@ -71,22 +70,19 @@
 
 internal fun Element.parseVectorRoot(density: Density): ImageVector {
     val context = BuildContext()
-    val builder = ImageVector.Builder(
-        defaultWidth = attributeOrNull(ANDROID_NS, "width").parseDp(density),
-        defaultHeight = attributeOrNull(ANDROID_NS, "height").parseDp(density),
-        viewportWidth = attributeOrNull(ANDROID_NS, "viewportWidth")?.toFloat() ?: 0f,
-        viewportHeight = attributeOrNull(ANDROID_NS, "viewportHeight")?.toFloat() ?: 0f
-    )
+    val builder =
+        ImageVector.Builder(
+            defaultWidth = attributeOrNull(ANDROID_NS, "width").parseDp(density),
+            defaultHeight = attributeOrNull(ANDROID_NS, "height").parseDp(density),
+            viewportWidth = attributeOrNull(ANDROID_NS, "viewportWidth")?.toFloat() ?: 0f,
+            viewportHeight = attributeOrNull(ANDROID_NS, "viewportHeight")?.toFloat() ?: 0f
+        )
     parseVectorNodes(builder, context)
     return builder.build()
 }
 
 private fun Element.parseVectorNodes(builder: ImageVector.Builder, context: BuildContext) {
-    childrenSequence
-        .filterIsInstance<Element>()
-        .forEach {
-            it.parseVectorNode(builder, context)
-        }
+    childrenSequence.filterIsInstance<Element>().forEach { it.parseVectorNode(builder, context) }
 }
 
 private fun Element.parseVectorNode(builder: ImageVector.Builder, context: BuildContext) {
@@ -100,20 +96,23 @@
 private fun Element.parsePath(builder: ImageVector.Builder) {
     builder.addPath(
         pathData = addPathNodes(attributeOrNull(ANDROID_NS, "pathData")),
-        pathFillType = attributeOrNull(ANDROID_NS, "fillType")
-            ?.let(::parseFillType) ?: PathFillType.NonZero,
+        pathFillType =
+            attributeOrNull(ANDROID_NS, "fillType")?.let(::parseFillType) ?: PathFillType.NonZero,
         name = attributeOrNull(ANDROID_NS, "name") ?: "",
-        fill = attributeOrNull(ANDROID_NS, "fillColor")?.let(::parseStringBrush)
-            ?: apptAttr(ANDROID_NS, "fillColor")?.let(Element::parseElementBrush),
+        fill =
+            attributeOrNull(ANDROID_NS, "fillColor")?.let(::parseStringBrush)
+                ?: apptAttr(ANDROID_NS, "fillColor")?.let(Element::parseElementBrush),
         fillAlpha = attributeOrNull(ANDROID_NS, "fillAlpha")?.toFloat() ?: 1.0f,
-        stroke = attributeOrNull(ANDROID_NS, "strokeColor")?.let(::parseStringBrush)
-            ?: apptAttr(ANDROID_NS, "strokeColor")?.let(Element::parseElementBrush),
+        stroke =
+            attributeOrNull(ANDROID_NS, "strokeColor")?.let(::parseStringBrush)
+                ?: apptAttr(ANDROID_NS, "strokeColor")?.let(Element::parseElementBrush),
         strokeAlpha = attributeOrNull(ANDROID_NS, "strokeAlpha")?.toFloat() ?: 1.0f,
         strokeLineWidth = attributeOrNull(ANDROID_NS, "strokeWidth")?.toFloat() ?: 1.0f,
-        strokeLineCap = attributeOrNull(ANDROID_NS, "strokeLineCap")
-            ?.let(::parseStrokeCap) ?: StrokeCap.Butt,
-        strokeLineJoin = attributeOrNull(ANDROID_NS, "strokeLineJoin")
-            ?.let(::parseStrokeJoin) ?: StrokeJoin.Miter,
+        strokeLineCap =
+            attributeOrNull(ANDROID_NS, "strokeLineCap")?.let(::parseStrokeCap) ?: StrokeCap.Butt,
+        strokeLineJoin =
+            attributeOrNull(ANDROID_NS, "strokeLineJoin")?.let(::parseStrokeJoin)
+                ?: StrokeJoin.Miter,
         strokeLineMiter = attributeOrNull(ANDROID_NS, "strokeMiterLimit")?.toFloat() ?: 1.0f,
         trimPathStart = attributeOrNull(ANDROID_NS, "trimPathStart")?.toFloat() ?: 0.0f,
         trimPathEnd = attributeOrNull(ANDROID_NS, "trimPathEnd")?.toFloat() ?: 1.0f,
@@ -154,10 +153,7 @@
 private fun parseStringBrush(str: String) = SolidColor(Color(parseColorValue(str)))
 
 private fun Element.parseElementBrush(): Brush? =
-    childrenSequence
-        .filterIsInstance<Element>()
-        .find { it.nodeName == "gradient" }
-        ?.parseGradient()
+    childrenSequence.filterIsInstance<Element>().find { it.nodeName == "gradient" }?.parseGradient()
 
 private fun Element.parseGradient(): Brush? {
     return when (attributeOrNull(ANDROID_NS, "type")) {
@@ -169,48 +165,54 @@
 }
 
 @Suppress("CHANGING_ARGUMENTS_EXECUTION_ORDER_FOR_NAMED_VARARGS")
-private fun Element.parseLinearGradient() = Brush.linearGradient(
-    colorStops = parseColorStops(),
-    start = Offset(
-        attributeOrNull(ANDROID_NS, "startX")?.toFloat() ?: 0f,
-        attributeOrNull(ANDROID_NS, "startY")?.toFloat() ?: 0f
-    ),
-    end = Offset(
-        attributeOrNull(ANDROID_NS, "endX")?.toFloat() ?: 0f,
-        attributeOrNull(ANDROID_NS, "endY")?.toFloat() ?: 0f
-    ),
-    tileMode = attributeOrNull(ANDROID_NS, "tileMode")?.let(::parseTileMode) ?: TileMode.Clamp
-)
-
-@Suppress("CHANGING_ARGUMENTS_EXECUTION_ORDER_FOR_NAMED_VARARGS")
-private fun Element.parseRadialGradient() = Brush.radialGradient(
-    colorStops = parseColorStops(),
-    center = Offset(
-        attributeOrNull(ANDROID_NS, "centerX")?.toFloat() ?: 0f,
-        attributeOrNull(ANDROID_NS, "centerY")?.toFloat() ?: 0f
-    ),
-    radius = attributeOrNull(ANDROID_NS, "gradientRadius")?.toFloat() ?: 0f,
-    tileMode = attributeOrNull(ANDROID_NS, "tileMode")?.let(::parseTileMode) ?: TileMode.Clamp
-)
-
-@Suppress("CHANGING_ARGUMENTS_EXECUTION_ORDER_FOR_NAMED_VARARGS")
-private fun Element.parseSweepGradient() = Brush.sweepGradient(
-    colorStops = parseColorStops(),
-    center = Offset(
-        attributeOrNull(ANDROID_NS, "centerX")?.toFloat() ?: 0f,
-        attributeOrNull(ANDROID_NS, "centerY")?.toFloat() ?: 0f,
+private fun Element.parseLinearGradient() =
+    Brush.linearGradient(
+        colorStops = parseColorStops(),
+        start =
+            Offset(
+                attributeOrNull(ANDROID_NS, "startX")?.toFloat() ?: 0f,
+                attributeOrNull(ANDROID_NS, "startY")?.toFloat() ?: 0f
+            ),
+        end =
+            Offset(
+                attributeOrNull(ANDROID_NS, "endX")?.toFloat() ?: 0f,
+                attributeOrNull(ANDROID_NS, "endY")?.toFloat() ?: 0f
+            ),
+        tileMode = attributeOrNull(ANDROID_NS, "tileMode")?.let(::parseTileMode) ?: TileMode.Clamp
     )
-)
+
+@Suppress("CHANGING_ARGUMENTS_EXECUTION_ORDER_FOR_NAMED_VARARGS")
+private fun Element.parseRadialGradient() =
+    Brush.radialGradient(
+        colorStops = parseColorStops(),
+        center =
+            Offset(
+                attributeOrNull(ANDROID_NS, "centerX")?.toFloat() ?: 0f,
+                attributeOrNull(ANDROID_NS, "centerY")?.toFloat() ?: 0f
+            ),
+        radius = attributeOrNull(ANDROID_NS, "gradientRadius")?.toFloat() ?: 0f,
+        tileMode = attributeOrNull(ANDROID_NS, "tileMode")?.let(::parseTileMode) ?: TileMode.Clamp
+    )
+
+@Suppress("CHANGING_ARGUMENTS_EXECUTION_ORDER_FOR_NAMED_VARARGS")
+private fun Element.parseSweepGradient() =
+    Brush.sweepGradient(
+        colorStops = parseColorStops(),
+        center =
+            Offset(
+                attributeOrNull(ANDROID_NS, "centerX")?.toFloat() ?: 0f,
+                attributeOrNull(ANDROID_NS, "centerY")?.toFloat() ?: 0f,
+            )
+    )
 
 private fun Element.parseColorStops(): Array<Pair<Float, Color>> {
-    val items = childrenSequence
-        .filterIsInstance<Element>()
-        .filter { it.nodeName == "item" }
-        .toList()
+    val items =
+        childrenSequence.filterIsInstance<Element>().filter { it.nodeName == "item" }.toList()
 
-    val colorStops = items.mapIndexedNotNullTo(mutableListOf()) { index, item ->
-        item.parseColorStop(defaultOffset = index.toFloat() / items.lastIndex.coerceAtLeast(1))
-    }
+    val colorStops =
+        items.mapIndexedNotNullTo(mutableListOf()) { index, item ->
+            item.parseColorStop(defaultOffset = index.toFloat() / items.lastIndex.coerceAtLeast(1))
+        }
 
     if (colorStops.isEmpty()) {
         val startColor = attributeOrNull(ANDROID_NS, "startColor")?.let(::parseColorValue)
@@ -245,33 +247,26 @@
 /**
  * Attribute of an element can be represented as a separate child:
  *
- *  <path ...>
- *    <aapt:attr name="android:fillColor">
- *      <gradient ...
- *        ...
- *      </gradient>
- *    </aapt:attr>
- *  </path>
+ * <path ...> <aapt:attr name="android:fillColor"> <gradient ... ... </gradient> </aapt:attr>
+ * </path>
  *
  * instead of:
  *
- *  <path android:fillColor="red" ... />
+ * <path android:fillColor="red" ... />
  */
-private fun Element.apptAttr(
-    namespace: String,
-    name: String
-): Element? {
+private fun Element.apptAttr(namespace: String, name: String): Element? {
     val prefix = lookupPrefix(namespace) ?: return null
-    return childrenSequence
-        .filterIsInstance<Element>()
-        .find {
-            it.namespaceURI == AAPT_NS && it.localName == "attr" &&
-                it.getAttribute("name") == "$prefix:$name"
-        }
-}
-
-private val Element.childrenSequence get() = sequence<Node> {
-    for (i in 0 until childNodes.length) {
-        yield(childNodes.item(i))
+    return childrenSequence.filterIsInstance<Element>().find {
+        it.namespaceURI == AAPT_NS &&
+            it.localName == "attr" &&
+            it.getAttribute("name") == "$prefix:$name"
     }
 }
+
+private val Element.childrenSequence
+    get() =
+        sequence<Node> {
+            for (i in 0 until childNodes.length) {
+                yield(childNodes.item(i))
+            }
+        }
diff --git a/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/util/AddRemoveMutableList.desktop.kt b/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/util/AddRemoveMutableList.desktop.kt
index 3f9ecbd..f93b932 100644
--- a/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/util/AddRemoveMutableList.desktop.kt
+++ b/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/util/AddRemoveMutableList.desktop.kt
@@ -17,8 +17,8 @@
 package androidx.compose.ui.util
 
 /**
- * Helper for implementing a wrapper around some collections
- * that has only `add` and `removeAt` methods.
+ * Helper for implementing a wrapper around some collections that has only `add` and `removeAt`
+ * methods.
  */
 internal abstract class AddRemoveMutableList<T> : AbstractMutableList<T>() {
     override fun set(index: Int, element: T): T {
diff --git a/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/util/UpdateEffect.desktop.kt b/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/util/UpdateEffect.desktop.kt
index 83391a9..c449c66 100644
--- a/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/util/UpdateEffect.desktop.kt
+++ b/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/util/UpdateEffect.desktop.kt
@@ -26,8 +26,8 @@
 import kotlinx.coroutines.channels.Channel
 
 /**
- * When [UpdateEffect] enters the composition it will call [update] and will capture all state
- * which is used in this function.
+ * When [UpdateEffect] enters the composition it will call [update] and will capture all state which
+ * is used in this function.
  *
  * When any state is changed, [update] will be called again on the next recomposition.
  *
@@ -45,9 +45,7 @@
     }
 
     DisposableEffect(Unit) {
-        val snapshotObserver = SnapshotStateObserver { command ->
-            command()
-        }
+        val snapshotObserver = SnapshotStateObserver { command -> command() }
         snapshotObserver.start()
 
         fun performUpdate() {
diff --git a/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/util/Windows.desktop.kt b/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/util/Windows.desktop.kt
index eda022d..a694b21 100644
--- a/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/util/Windows.desktop.kt
+++ b/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/util/Windows.desktop.kt
@@ -37,8 +37,8 @@
 import kotlin.math.roundToInt
 
 /**
- * Ignore size updating if window is maximized or in fullscreen.
- * Otherwise we will reset maximized / fullscreen state.
+ * Ignore size updating if window is maximized or in fullscreen. Otherwise we will reset maximized /
+ * fullscreen state.
  */
 internal fun ComposeWindow.setSizeSafely(size: DpSize) {
     if (placement == WindowPlacement.Floating) {
@@ -47,37 +47,35 @@
 }
 
 /**
- * Ignore position updating if window is maximized or in fullscreen.
- * Otherwise we will reset maximized / fullscreen state.
+ * Ignore position updating if window is maximized or in fullscreen. Otherwise we will reset
+ * maximized / fullscreen state.
  */
-internal fun ComposeWindow.setPositionSafely(
-    position: WindowPosition
-) {
+internal fun ComposeWindow.setPositionSafely(position: WindowPosition) {
     if (placement == WindowPlacement.Floating) {
         (this as Window).setPositionSafely(position)
     }
 }
 
-/**
- * Limit the width and the height to a minimum of 0
- */
+/** Limit the width and the height to a minimum of 0 */
 internal fun Window.setSizeSafely(size: DpSize) {
     val screenBounds by lazy { graphicsConfiguration.bounds }
 
     val isWidthSpecified = size.isSpecified && size.width.isSpecified
     val isHeightSpecified = size.isSpecified && size.height.isSpecified
 
-    val width = if (isWidthSpecified) {
-        size.width.value.roundToInt().coerceAtLeast(0)
-    } else {
-        screenBounds.width
-    }
+    val width =
+        if (isWidthSpecified) {
+            size.width.value.roundToInt().coerceAtLeast(0)
+        } else {
+            screenBounds.width
+        }
 
-    val height = if (isHeightSpecified) {
-        size.height.value.roundToInt().coerceAtLeast(0)
-    } else {
-        screenBounds.height
-    }
+    val height =
+        if (isHeightSpecified) {
+            size.height.value.roundToInt().coerceAtLeast(0)
+        } else {
+            screenBounds.height
+        }
 
     if (!isWidthSpecified || !isHeightSpecified) {
         preferredSize = Dimension(width, height)
@@ -93,16 +91,13 @@
     )
 }
 
-internal fun Window.setPositionSafely(
-    position: WindowPosition
-) = when (position) {
-    WindowPosition.PlatformDefault -> setLocationByPlatformSafely(true)
-    is WindowPosition.Aligned -> align(position.alignment)
-    is WindowPosition.Absolute -> setLocation(
-        position.x.value.roundToInt(),
-        position.y.value.roundToInt()
-    )
-}
+internal fun Window.setPositionSafely(position: WindowPosition) =
+    when (position) {
+        WindowPosition.PlatformDefault -> setLocationByPlatformSafely(true)
+        is WindowPosition.Aligned -> align(position.alignment)
+        is WindowPosition.Absolute ->
+            setLocation(position.x.value.roundToInt(), position.y.value.roundToInt())
+    }
 
 internal fun Window.align(alignment: Alignment) {
     val screenInsets = Toolkit.getDefaultToolkit().getScreenInsets(graphicsConfiguration)
@@ -111,16 +106,12 @@
     val screenSize = IntSize(screenBounds.width, screenBounds.height)
     val location = alignment.align(size, screenSize, LayoutDirection.Ltr)
 
-    setLocation(
-        screenInsets.left + location.x,
-        screenInsets.top + location.y
-    )
+    setLocation(screenInsets.left + location.x, screenInsets.top + location.y)
 }
 
 /**
- * We cannot call [Frame.setLocation] if window is showing - AWT will throw an
- * exception.
- * But we can call [Frame.setLocationByPlatform] if isLocationByPlatform isn't changed.
+ * We cannot call [Frame.setLocation] if window is showing - AWT will throw an exception. But we can
+ * call [Frame.setLocationByPlatform] if isLocationByPlatform isn't changed.
  */
 internal fun Window.setLocationByPlatformSafely(isLocationByPlatform: Boolean) {
     if (this.isLocationByPlatform != isLocationByPlatform) {
@@ -129,8 +120,8 @@
 }
 
 /**
- * We cannot call [Frame.setUndecorated] if window is showing - AWT will throw an exception.
- * But we can call [Frame.setUndecoratedSafely] if isUndecorated isn't changed.
+ * We cannot call [Frame.setUndecorated] if window is showing - AWT will throw an exception. But we
+ * can call [Frame.setUndecoratedSafely] if isUndecorated isn't changed.
  */
 internal fun Frame.setUndecoratedSafely(value: Boolean) {
     if (this.isUndecorated != value) {
diff --git a/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/window/Application.desktop.kt b/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/window/Application.desktop.kt
index 5e556d8..a23d7e4 100644
--- a/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/window/Application.desktop.kt
+++ b/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/window/Application.desktop.kt
@@ -70,16 +70,12 @@
  *
  * @see [awaitApplication]
  */
-fun application(
-    content: @Composable ApplicationScope.() -> Unit
-) {
+fun application(content: @Composable ApplicationScope.() -> Unit) {
     if (System.getProperty("compose.application.configure.swing.globals") == "true") {
         configureSwingGlobalsForCompose()
     }
 
-    runBlocking {
-        awaitApplication(content = content)
-    }
+    runBlocking { awaitApplication(content = content) }
 }
 
 /**
@@ -95,30 +91,24 @@
  * ```
  *
  * Don't use `GlobalScope.launchApplication {}` to launch application inside `main()` function
- * without waiting it to end.
- * As it will not block the main thread, and application process will stop
- * (because global coroutines are daemon threads, daemon threads don't keep process alive:
+ * without waiting it to end. As it will not block the main thread, and application process will
+ * stop (because global coroutines are daemon threads, daemon threads don't keep process alive:
  * https://kotlinlang.org/docs/coroutines-basics.html#global-coroutines-are-like-daemon-threads)
  *
  * @see [awaitApplication]
  */
-fun CoroutineScope.launchApplication(
-    content: @Composable ApplicationScope.() -> Unit
-): Job {
+fun CoroutineScope.launchApplication(content: @Composable ApplicationScope.() -> Unit): Job {
     if (System.getProperty("compose.application.configure.swing.globals") == "true") {
         configureSwingGlobalsForCompose()
     }
-    return launch {
-        awaitApplication(content = content)
-    }
+    return launch { awaitApplication(content = content) }
 }
 
 /**
  * An entry point for the Compose application.
  *
- * Application can launch background tasks using [LaunchedEffect]
- * or create [Window], [Dialog], or [Tray] in a declarative Compose way:
- *
+ * Application can launch background tasks using [LaunchedEffect] or create [Window], [Dialog], or
+ * [Tray] in a declarative Compose way:
  * ```
  * fun main() = runBlocking {
  *     withApplication {
@@ -138,21 +128,18 @@
  * }
  * ```
  *
- * When there is no any active compositions, this function will end.
- * Active composition is a composition that have active coroutine (for example, launched in
- * [LaunchedEffect]) or that have child composition created inside [Window], [Dialog], or [Tray].
+ * When there is no any active compositions, this function will end. Active composition is a
+ * composition that have active coroutine (for example, launched in [LaunchedEffect]) or that have
+ * child composition created inside [Window], [Dialog], or [Tray].
  *
- * Don't use any animation in this function
- * (for example, [withFrameNanos] or [androidx.compose.animation.core.animateFloatAsState]),
- * because underlying [MonotonicFrameClock] hasn't synchronized with any display, and produces
- * frames as fast as possible.
+ * Don't use any animation in this function (for example, [withFrameNanos] or
+ * [androidx.compose.animation.core.animateFloatAsState]), because underlying [MonotonicFrameClock]
+ * hasn't synchronized with any display, and produces frames as fast as possible.
  *
- * All animation's should be created inside Composable content of the
- * [Window] / [Dialog] / [ComposePanel].
+ * All animation's should be created inside Composable content of the [Window] / [Dialog] /
+ * [ComposePanel].
  */
-suspend fun awaitApplication(
-    content: @Composable ApplicationScope.() -> Unit
-) {
+suspend fun awaitApplication(content: @Composable ApplicationScope.() -> Unit) {
     if (System.getProperty("compose.application.configure.swing.globals") == "true") {
         configureSwingGlobalsForCompose()
     }
@@ -163,15 +150,14 @@
             val recomposer = Recomposer(coroutineContext)
             var isOpen by mutableStateOf(true)
 
-            val applicationScope = object : ApplicationScope {
-                override fun exitApplication() {
-                    isOpen = false
+            val applicationScope =
+                object : ApplicationScope {
+                    override fun exitApplication() {
+                        isOpen = false
+                    }
                 }
-            }
 
-            launch {
-                recomposer.runRecomposeAndApplyChanges()
-            }
+            launch { recomposer.runRecomposeAndApplyChanges() }
 
             launch {
                 val applier = ApplicationApplier()
@@ -198,18 +184,14 @@
     }
 }
 
-/**
- * Scope used by [application], [awaitApplication], [launchApplication]
- */
+/** Scope used by [application], [awaitApplication], [launchApplication] */
 @Stable
 interface ApplicationScope {
     fun exitApplication()
 }
 
 private object YieldFrameClock : MonotonicFrameClock {
-    override suspend fun <R> withFrameNanos(
-        onFrame: (frameTimeNanos: Long) -> R
-    ): R {
+    override suspend fun <R> withFrameNanos(onFrame: (frameTimeNanos: Long) -> R): R {
         // We call `yield` to avoid blocking UI thread. If we don't call this then application
         // can be frozen for the user in some cases as it will not receive any input events.
         //
@@ -221,12 +203,20 @@
 
 private class ApplicationApplier : Applier<Unit> {
     override val current: Unit = Unit
+
     override fun down(node: Unit) = Unit
+
     override fun up() = Unit
+
     override fun insertTopDown(index: Int, instance: Unit) = Unit
+
     override fun insertBottomUp(index: Int, instance: Unit) = Unit
+
     override fun remove(index: Int, count: Int) = Unit
+
     override fun move(from: Int, to: Int, count: Int) = Unit
+
     override fun clear() = Unit
+
     override fun onEndChanges() = Unit
 }
diff --git a/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/window/AwtWindow.desktop.kt b/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/window/AwtWindow.desktop.kt
index 545576e..4f75bd5 100644
--- a/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/window/AwtWindow.desktop.kt
+++ b/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/window/AwtWindow.desktop.kt
@@ -34,28 +34,27 @@
 import kotlinx.coroutines.swing.Swing
 
 /**
- * Compose [Window] obtained from [create]. The [create] block will be called
- * exactly once to obtain the [Window] to be composed, and it is also guaranteed to be invoked on
- * the UI thread (Event Dispatch Thread).
+ * Compose [Window] obtained from [create]. The [create] block will be called exactly once to obtain
+ * the [Window] to be composed, and it is also guaranteed to be invoked on the UI thread (Event
+ * Dispatch Thread).
  *
- * Once [AwtWindow] leaves the composition, [dispose] will be called to free resources that
- * obtained by the [Window].
+ * Once [AwtWindow] leaves the composition, [dispose] will be called to free resources that obtained
+ * by the [Window].
  *
- * The [update] block can be run multiple times (on the UI thread as well) due to recomposition,
- * and it is the right place to set [Window] properties depending on state.
- * When state changes, the block will be reexecuted to set the new properties.
- * Note the block will also be ran once right after the [create] block completes.
+ * The [update] block can be run multiple times (on the UI thread as well) due to recomposition, and
+ * it is the right place to set [Window] properties depending on state. When state changes, the
+ * block will be reexecuted to set the new properties. Note the block will also be ran once right
+ * after the [create] block completes.
  *
- * [AwtWindow] is needed for creating window's / dialog's that still can't be created with
- * the default Compose functions [androidx.compose.ui.window.Window] or
+ * [AwtWindow] is needed for creating window's / dialog's that still can't be created with the
+ * default Compose functions [androidx.compose.ui.window.Window] or
  * [androidx.compose.ui.window.Dialog].
  *
- * @param visible Is [Window] visible to user.
- * Note that if we set `false` - native resources will not be released. They will be released
- * only when [Window] will leave the composition.
+ * @param visible Is [Window] visible to user. Note that if we set `false` - native resources will
+ *   not be released. They will be released only when [Window] will leave the composition.
  * @param create The block creating the [Window] to be composed.
  * @param dispose The block to dispose [Window] and free native resources. Usually it is simple
- * `Window::dispose`
+ *   `Window::dispose`
  * @param update The callback to be invoked after the layout is inflated.
  */
 @OptIn(DelicateCoroutinesApi::class)
@@ -74,9 +73,7 @@
 
     DisposableEffect(Unit) {
         windowRef.value = create()
-        onDispose {
-            dispose(window())
-        }
+        onDispose { dispose(window()) }
     }
 
     UpdateEffect {
@@ -117,9 +114,8 @@
         // So we will have a wrong active window (window1).
 
         showJob.value?.cancel()
-        showJob.value = GlobalScope.launch(Dispatchers.Swing) {
-            window().isVisible = currentVisible
-        }
+        showJob.value =
+            GlobalScope.launch(Dispatchers.Swing) { window().isVisible = currentVisible }
     }
 
     DisposableEffect(Unit) {
diff --git a/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/window/DesktopPopup.desktop.kt b/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/window/DesktopPopup.desktop.kt
index 697c44e..87a1251 100644
--- a/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/window/DesktopPopup.desktop.kt
+++ b/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/window/DesktopPopup.desktop.kt
@@ -65,20 +65,13 @@
     alignment: Alignment = Alignment.BottomEnd,
     windowMargin: Dp = 4.dp
 ): PopupPositionProvider {
-    val offsetPx = with(LocalDensity.current) {
-        Offset(offset.x.toPx(), offset.y.toPx())
-    }
-    val windowMarginPx = with(LocalDensity.current) {
-        windowMargin.roundToPx()
-    }
+    val offsetPx = with(LocalDensity.current) { Offset(offset.x.toPx(), offset.y.toPx()) }
+    val windowMarginPx = with(LocalDensity.current) { windowMargin.roundToPx() }
     val cursorPosition = rememberCursorPosition()
 
     if (cursorPosition == null) {
         // if cursor is outside the scene, show popup under the parent component
-        return rememberComponentRectPositionProvider(
-            alignment = alignment,
-            offset = offset
-        )
+        return rememberComponentRectPositionProvider(alignment = alignment, offset = offset)
     }
 
     return remember(cursorPosition, offsetPx, alignment, windowMarginPx) {
@@ -107,31 +100,32 @@
     offset: DpOffset = DpOffset.Zero,
     alignment: Alignment = Alignment.BottomEnd,
     windowMargin: Dp = 4.dp
-): PopupPositionProvider = with(LocalDensity.current) {
-    val offsetPx = Offset(offset.x.toPx(), offset.y.toPx())
-    val windowMarginPx = windowMargin.roundToPx()
+): PopupPositionProvider =
+    with(LocalDensity.current) {
+        val offsetPx = Offset(offset.x.toPx(), offset.y.toPx())
+        val windowMarginPx = windowMargin.roundToPx()
 
-    remember(positionPx, offsetPx, alignment, windowMarginPx) {
-        PopupPositionProviderAtPosition(
-            positionPx = positionPx,
-            isRelativeToAnchor = true,
-            offsetPx = offsetPx,
-            alignment = alignment,
-            windowMarginPx = windowMarginPx
-        )
+        remember(positionPx, offsetPx, alignment, windowMarginPx) {
+            PopupPositionProviderAtPosition(
+                positionPx = positionPx,
+                isRelativeToAnchor = true,
+                offsetPx = offsetPx,
+                alignment = alignment,
+                windowMarginPx = windowMarginPx
+            )
+        }
     }
-}
 
 /**
  * A [PopupPositionProvider] that positions the popup at the given offsets and alignment.
  *
  * @param positionPx The offset of the popup's location, in pixels.
  * @param isRelativeToAnchor Whether [positionPx] is relative to the anchor bounds passed to
- * [calculatePosition]. If `false`, it is relative to the window.
+ *   [calculatePosition]. If `false`, it is relative to the window.
  * @param offsetPx Extra offset to be added to the position of the popup, in pixels.
  * @param alignment The alignment of the popup relative to desired position.
  * @param windowMarginPx Defines the area within the window that limits the placement of the popup,
- * in pixels.
+ *   in pixels.
  */
 @ExperimentalComposeUiApi
 class PopupPositionProviderAtPosition(
@@ -147,20 +141,21 @@
         layoutDirection: LayoutDirection,
         popupContentSize: IntSize
     ): IntOffset {
-        val anchor = IntRect(
-            offset = positionPx.round() +
-                (if (isRelativeToAnchor) anchorBounds.topLeft else IntOffset.Zero),
-            size = IntSize.Zero)
-        val tooltipArea = IntRect(
-            IntOffset(
-                anchor.left - popupContentSize.width,
-                anchor.top - popupContentSize.height,
-            ),
-            IntSize(
-                popupContentSize.width * 2,
-                popupContentSize.height * 2
+        val anchor =
+            IntRect(
+                offset =
+                    positionPx.round() +
+                        (if (isRelativeToAnchor) anchorBounds.topLeft else IntOffset.Zero),
+                size = IntSize.Zero
             )
-        )
+        val tooltipArea =
+            IntRect(
+                IntOffset(
+                    anchor.left - popupContentSize.width,
+                    anchor.top - popupContentSize.height,
+                ),
+                IntSize(popupContentSize.width * 2, popupContentSize.height * 2)
+            )
         val position = alignment.align(popupContentSize, tooltipArea.size, layoutDirection)
         var x = tooltipArea.left + position.x + offsetPx.x
         var y = tooltipArea.top + position.y + offsetPx.y
@@ -190,9 +185,8 @@
     alignment: Alignment = Alignment.BottomCenter,
     offset: DpOffset = DpOffset.Zero
 ): PopupPositionProvider {
-    val offsetPx = with(LocalDensity.current) {
-        IntOffset(offset.x.roundToPx(), offset.y.roundToPx())
-    }
+    val offsetPx =
+        with(LocalDensity.current) { IntOffset(offset.x.roundToPx(), offset.y.roundToPx()) }
     return remember(anchor, alignment, offsetPx) {
         object : PopupPositionProvider {
             override fun calculatePosition(
@@ -202,16 +196,14 @@
                 popupContentSize: IntSize
             ): IntOffset {
                 val anchorPoint = anchor.align(IntSize.Zero, anchorBounds.size, layoutDirection)
-                val tooltipArea = IntRect(
-                    IntOffset(
-                        anchorBounds.left + anchorPoint.x - popupContentSize.width,
-                        anchorBounds.top + anchorPoint.y - popupContentSize.height,
-                    ),
-                    IntSize(
-                        popupContentSize.width * 2,
-                        popupContentSize.height * 2
+                val tooltipArea =
+                    IntRect(
+                        IntOffset(
+                            anchorBounds.left + anchorPoint.x - popupContentSize.width,
+                            anchorBounds.top + anchorPoint.y - popupContentSize.height,
+                        ),
+                        IntSize(popupContentSize.width * 2, popupContentSize.height * 2)
                     )
-                )
                 val position = alignment.align(popupContentSize, tooltipArea.size, layoutDirection)
                 return tooltipArea.topLeft + position + offsetPx
             }
diff --git a/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/window/Dialog.desktop.kt b/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/window/Dialog.desktop.kt
index f238d7d..f075c10 100644
--- a/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/window/Dialog.desktop.kt
+++ b/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/window/Dialog.desktop.kt
@@ -45,10 +45,13 @@
 
 @Deprecated(
     message = "Replaced by DialogWindow",
-    replaceWith = ReplaceWith("DialogWindow(" +
-        "onCloseRequest, state, visible, title, icon, undecorated, transparent, resizable, " +
-        "enabled, focusable, onPreviewKeyEvent, onKeyEvent, content" +
-        ")")
+    replaceWith =
+        ReplaceWith(
+            "DialogWindow(" +
+                "onCloseRequest, state, visible, title, icon, undecorated, transparent, resizable, " +
+                "enabled, focusable, onPreviewKeyEvent, onKeyEvent, content" +
+                ")"
+        )
 )
 @Composable
 fun Dialog(
@@ -65,22 +68,23 @@
     onPreviewKeyEvent: ((KeyEvent) -> Boolean) = { false },
     onKeyEvent: ((KeyEvent) -> Boolean) = { false },
     content: @Composable DialogWindowScope.() -> Unit
-) = DialogWindow(
-    onCloseRequest,
-    state,
-    visible,
-    title,
-    icon,
-    undecorated,
-    transparent,
-    resizable,
-    enabled,
-    focusable,
-    alwaysOnTop = false,
-    onPreviewKeyEvent,
-    onKeyEvent,
-    content
-)
+) =
+    DialogWindow(
+        onCloseRequest,
+        state,
+        visible,
+        title,
+        icon,
+        undecorated,
+        transparent,
+        resizable,
+        enabled,
+        focusable,
+        alwaysOnTop = false,
+        onPreviewKeyEvent,
+        onKeyEvent,
+        content
+    )
 
 @Deprecated(
     level = DeprecationLevel.HIDDEN,
@@ -121,12 +125,12 @@
 }
 
 /**
- * Composes platform dialog in the current composition. When Dialog enters the composition,
- * a new platform dialog will be created and receives the focus. When Dialog leaves the
- * composition, dialog will be disposed and closed.
+ * Composes platform dialog in the current composition. When Dialog enters the composition, a new
+ * platform dialog will be created and receives the focus. When Dialog leaves the composition,
+ * dialog will be disposed and closed.
  *
- * Dialog is a modal window. It means it blocks the parent [Window] / [DialogWindow] in which composition
- * context it was created.
+ * Dialog is a modal window. It means it blocks the parent [Window] / [DialogWindow] in which
+ * composition context it was created.
  *
  * Usage:
  * ```
@@ -138,44 +142,45 @@
  *     }
  * }
  * ```
- * @param onCloseRequest Callback that will be called when the user closes the dialog.
- * Usually in this callback we need to manually tell Compose what to do:
+ *
+ * @param onCloseRequest Callback that will be called when the user closes the dialog. Usually in
+ *   this callback we need to manually tell Compose what to do:
  * - change `isOpen` state of the dialog (which is manually defined)
  * - close the whole application (`onCloseRequest = ::exitApplication` in [ApplicationScope])
  * - don't close the dialog on close request (`onCloseRequest = {}`)
- * @param state The state object to be used to control or observe the dialog's state
- * When size/position is changed by the user, state will be updated.
- * When size/position of the dialog is changed by the application (changing state),
- * the native dialog will update its corresponding properties.
- * If [DialogState.position] is not [WindowPosition.isSpecified], then after the first show on the
- * screen [DialogState.position] will be set to the absolute values.
- * @param visible Is [DialogWindow] visible to user.
- * If `false`:
- * - internal state of [DialogWindow] is preserved and will be restored next time the dialog
- * will be visible;
- * - native resources will not be released. They will be released only when [DialogWindow]
- * will leave the composition.
+ *
+ * @param state The state object to be used to control or observe the dialog's state When
+ *   size/position is changed by the user, state will be updated. When size/position of the dialog
+ *   is changed by the application (changing state), the native dialog will update its corresponding
+ *   properties. If [DialogState.position] is not [WindowPosition.isSpecified], then after the first
+ *   show on the screen [DialogState.position] will be set to the absolute values.
+ * @param visible Is [DialogWindow] visible to user. If `false`:
+ * - internal state of [DialogWindow] is preserved and will be restored next time the dialog will be
+ *   visible;
+ * - native resources will not be released. They will be released only when [DialogWindow] will
+ *   leave the composition.
+ *
  * @param title Title in the titlebar of the dialog
- * @param icon Icon in the titlebar of the window (for platforms which support this).
- * On macOs individual windows can't have a separate icon. To change the icon in the Dock,
- * set it via `iconFile` in build.gradle
- * (https://github.com/JetBrains/compose-jb/tree/master/tutorials/Native_distributions_and_local_execution#platform-specific-options)
+ * @param icon Icon in the titlebar of the window (for platforms which support this). On macOs
+ *   individual windows can't have a separate icon. To change the icon in the Dock, set it via
+ *   `iconFile` in build.gradle
+ *   (https://github.com/JetBrains/compose-jb/tree/master/tutorials/Native_distributions_and_local_execution#platform-specific-options)
  * @param undecorated Disables or enables decorations for this window.
- * @param transparent Disables or enables window transparency. Transparency should be set
- * only if window is undecorated, otherwise an exception will be thrown.
+ * @param transparent Disables or enables window transparency. Transparency should be set only if
+ *   window is undecorated, otherwise an exception will be thrown.
  * @param resizable Can dialog be resized by the user (application still can resize the dialog
- * changing [state])
+ *   changing [state])
  * @param enabled Can dialog react to input events
  * @param focusable Can dialog receive focus
  * @param alwaysOnTop Should the dialog always be on top of another windows and dialogs
  * @param onPreviewKeyEvent This callback is invoked when the user interacts with the hardware
- * keyboard. It gives ancestors of a focused component the chance to intercept a [KeyEvent].
- * Return true to stop propagation of this event. If you return false, the key event will be
- * sent to this [onPreviewKeyEvent]'s child. If none of the children consume the event,
- * it will be sent back up to the root using the onKeyEvent callback.
- * @param onKeyEvent This callback is invoked when the user interacts with the hardware
- * keyboard. While implementing this callback, return true to stop propagation of this event.
- * If you return false, the key event will be sent to this [onKeyEvent]'s parent.
+ *   keyboard. It gives ancestors of a focused component the chance to intercept a [KeyEvent].
+ *   Return true to stop propagation of this event. If you return false, the key event will be sent
+ *   to this [onPreviewKeyEvent]'s child. If none of the children consume the event, it will be sent
+ *   back up to the root using the onKeyEvent callback.
+ * @param onKeyEvent This callback is invoked when the user interacts with the hardware keyboard.
+ *   While implementing this callback, return true to stop propagation of this event. If you return
+ *   false, the key event will be sent to this [onKeyEvent]'s parent.
  * @param content content of the dialog
  */
 @Composable
@@ -218,20 +223,24 @@
             ComposeDialog(owner, ModalityType.DOCUMENT_MODAL).apply {
                 // close state is controlled by DialogState.isOpen
                 defaultCloseOperation = JDialog.DO_NOTHING_ON_CLOSE
-                addWindowListener(object : WindowAdapter() {
-                    override fun windowClosing(e: WindowEvent?) {
-                        currentOnCloseRequest()
+                addWindowListener(
+                    object : WindowAdapter() {
+                        override fun windowClosing(e: WindowEvent?) {
+                            currentOnCloseRequest()
+                        }
                     }
-                })
-                addComponentListener(object : ComponentAdapter() {
-                    override fun componentResized(e: ComponentEvent) {
-                        currentState.size = DpSize(width.dp, height.dp)
-                    }
+                )
+                addComponentListener(
+                    object : ComponentAdapter() {
+                        override fun componentResized(e: ComponentEvent) {
+                            currentState.size = DpSize(width.dp, height.dp)
+                        }
 
-                    override fun componentMoved(e: ComponentEvent) {
-                        currentState.position = WindowPosition(x.dp, y.dp)
+                        override fun componentMoved(e: ComponentEvent) {
+                            currentState.position = WindowPosition(x.dp, y.dp)
+                        }
                     }
-                })
+                )
             }
         },
         dispose = ComposeDialog::dispose,
@@ -255,9 +264,12 @@
 
 @Deprecated(
     message = "Replaced by DialogWindow",
-    replaceWith = ReplaceWith("DialogWindow(" +
-        "visible, onPreviewKeyEvent, onKeyEvent, create, dispose, update, contents" +
-        ")")
+    replaceWith =
+        ReplaceWith(
+            "DialogWindow(" +
+                "visible, onPreviewKeyEvent, onKeyEvent, create, dispose, update, contents" +
+                ")"
+        )
 )
 @Composable
 fun Dialog(
@@ -268,55 +280,47 @@
     dispose: (ComposeDialog) -> Unit,
     update: (ComposeDialog) -> Unit = {},
     content: @Composable DialogWindowScope.() -> Unit
-) = DialogWindow(
-    visible,
-    onPreviewKeyEvent,
-    onKeyEvent,
-    create,
-    dispose,
-    update,
-    content
-)
+) = DialogWindow(visible, onPreviewKeyEvent, onKeyEvent, create, dispose, update, content)
 
 // TODO(demin): fix mouse hover after opening a dialog.
 //  When we open a modal dialog, ComposeLayer/mouseExited will
 //  never be called for the parent window. See ./gradlew run3
 /**
- * Compose [ComposeDialog] obtained from [create]. The [create] block will be called
- * exactly once to obtain the [ComposeDialog] to be composed, and it is also guaranteed to
- * be invoked on the UI thread (Event Dispatch Thread).
+ * Compose [ComposeDialog] obtained from [create]. The [create] block will be called exactly once to
+ * obtain the [ComposeDialog] to be composed, and it is also guaranteed to be invoked on the UI
+ * thread (Event Dispatch Thread).
  *
- * Once Dialog leaves the composition, [dispose] will be called to free resources that
- * obtained by the [ComposeDialog].
+ * Once Dialog leaves the composition, [dispose] will be called to free resources that obtained by
+ * the [ComposeDialog].
  *
- * Dialog is a modal window. It means it blocks the parent [Window] / [DialogWindow] in which composition
- * context it was created.
+ * Dialog is a modal window. It means it blocks the parent [Window] / [DialogWindow] in which
+ * composition context it was created.
  *
- * The [update] block can be run multiple times (on the UI thread as well) due to recomposition,
- * and it is the right place to set [ComposeDialog] properties depending on state.
- * When state changes, the block will be reexecuted to set the new properties.
- * Note the block will also be ran once right after the [create] block completes.
+ * The [update] block can be run multiple times (on the UI thread as well) due to recomposition, and
+ * it is the right place to set [ComposeDialog] properties depending on state. When state changes,
+ * the block will be reexecuted to set the new properties. Note the block will also be ran once
+ * right after the [create] block completes.
  *
- * Dialog is needed for creating dialog's that still can't be created with
- * the default Compose function [androidx.compose.ui.window.DialogWindow]
+ * Dialog is needed for creating dialog's that still can't be created with the default Compose
+ * function [androidx.compose.ui.window.DialogWindow]
  *
- * @param visible Is [ComposeDialog] visible to user.
- * If `false`:
- * - internal state of [ComposeDialog] is preserved and will be restored next time the dialog
- * will be visible;
- * - native resources will not be released. They will be released only when [DialogWindow]
- * will leave the composition.
+ * @param visible Is [ComposeDialog] visible to user. If `false`:
+ * - internal state of [ComposeDialog] is preserved and will be restored next time the dialog will
+ *   be visible;
+ * - native resources will not be released. They will be released only when [DialogWindow] will
+ *   leave the composition.
+ *
  * @param onPreviewKeyEvent This callback is invoked when the user interacts with the hardware
- * keyboard. It gives ancestors of a focused component the chance to intercept a [KeyEvent].
- * Return true to stop propagation of this event. If you return false, the key event will be
- * sent to this [onPreviewKeyEvent]'s child. If none of the children consume the event,
- * it will be sent back up to the root using the onKeyEvent callback.
- * @param onKeyEvent This callback is invoked when the user interacts with the hardware
- * keyboard. While implementing this callback, return true to stop propagation of this event.
- * If you return false, the key event will be sent to this [onKeyEvent]'s parent.
+ *   keyboard. It gives ancestors of a focused component the chance to intercept a [KeyEvent].
+ *   Return true to stop propagation of this event. If you return false, the key event will be sent
+ *   to this [onPreviewKeyEvent]'s child. If none of the children consume the event, it will be sent
+ *   back up to the root using the onKeyEvent callback.
+ * @param onKeyEvent This callback is invoked when the user interacts with the hardware keyboard.
+ *   While implementing this callback, return true to stop propagation of this event. If you return
+ *   false, the key event will be sent to this [onKeyEvent]'s parent.
  * @param create The block creating the [ComposeDialog] to be composed.
- * @param dispose The block to dispose [ComposeDialog] and free native resources.
- * Usually it is simple `ComposeDialog::dispose`
+ * @param dispose The block to dispose [ComposeDialog] and free native resources. Usually it is
+ *   simple `ComposeDialog::dispose`
  * @param update The callback to be invoked after the layout is inflated.
  * @param content Composable content of the creating dialog.
  */
@@ -338,9 +342,7 @@
         create = {
             create().apply {
                 setContent(onPreviewKeyEvent, onKeyEvent) {
-                    CompositionLocalProvider(currentLocals) {
-                        content()
-                    }
+                    CompositionLocalProvider(currentLocals) { content() }
                 }
             }
         },
@@ -356,13 +358,9 @@
     )
 }
 
-/**
- * Receiver scope which is used by [androidx.compose.ui.window.DialogWindow].
- */
+/** Receiver scope which is used by [androidx.compose.ui.window.DialogWindow]. */
 @Stable
 interface DialogWindowScope : WindowScope {
-    /**
-     * [ComposeDialog] that was created inside [androidx.compose.ui.window.DialogWindow].
-     */
+    /** [ComposeDialog] that was created inside [androidx.compose.ui.window.DialogWindow]. */
     override val window: ComposeDialog
 }
diff --git a/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/window/DialogState.desktop.kt b/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/window/DialogState.desktop.kt
index 9e73e2d..14ee5cf 100644
--- a/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/window/DialogState.desktop.kt
+++ b/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/window/DialogState.desktop.kt
@@ -41,16 +41,11 @@
 fun rememberDialogState(
     position: WindowPosition = WindowPosition(Alignment.Center),
     size: DpSize = DpSize(400.dp, 300.dp),
-): DialogState = rememberSaveable(saver = DialogStateImpl.Saver(position)) {
-    DialogStateImpl(
-        position,
-        size
-    )
-}
+): DialogState =
+    rememberSaveable(saver = DialogStateImpl.Saver(position)) { DialogStateImpl(position, size) }
 
 /**
- * A state object that can be hoisted to control and observe dialog attributes
- * (size/position).
+ * A state object that can be hoisted to control and observe dialog attributes (size/position).
  *
  * @param position the initial value for [DialogState.position]
  * @param size the initial value for [DialogState.size]
@@ -58,9 +53,8 @@
 fun DialogState(
     position: WindowPosition = WindowPosition(Alignment.Center),
     size: DpSize = DpSize(400.dp, 300.dp)
-): DialogState = DialogStateImpl(
-    position, size
-)
+): DialogState = DialogStateImpl(position, size)
+
 /**
  * Creates a [DialogState] that is remembered across compositions.
  *
@@ -76,16 +70,13 @@
 fun rememberDialogState(
     position: WindowPosition = WindowPosition(Alignment.Center),
     size: WindowSize,
-): DialogState = rememberSaveable(saver = DialogStateImpl.Saver(position)) {
-    DialogStateImpl(
-        position,
-        DpSize(size.width, size.height)
-    )
-}
+): DialogState =
+    rememberSaveable(saver = DialogStateImpl.Saver(position)) {
+        DialogStateImpl(position, DpSize(size.width, size.height))
+    }
 
 /**
- * A state object that can be hoisted to control and observe dialog attributes
- * (size/position).
+ * A state object that can be hoisted to control and observe dialog attributes (size/position).
  *
  * @param position the initial value for [DialogState.position]
  * @param size the initial value for [DialogState.size]
@@ -95,9 +86,7 @@
 fun DialogState(
     position: WindowPosition = WindowPosition(Alignment.Center),
     size: WindowSize
-): DialogState = DialogStateImpl(
-    position, DpSize(size.width, size.height)
-)
+): DialogState = DialogStateImpl(position, DpSize(size.width, size.height))
 
 /**
  * Creates a [DialogState] that is remembered across compositions.
@@ -107,86 +96,72 @@
  *
  * @param position the initial value for [DialogState.position]
  * @param width the initial value for width of [WindowState.size]
- * @param height the initial value for height of  [WindowState.size]
+ * @param height the initial value for height of [WindowState.size]
  */
 @Composable
 fun rememberDialogState(
     position: WindowPosition = WindowPosition(Alignment.Center),
     width: Dp = 400.dp,
     height: Dp = 300.dp,
-): DialogState = rememberSaveable(saver = DialogStateImpl.Saver(position)) {
-    DialogStateImpl(
-        position,
-        DpSize(width, height)
-    )
-}
+): DialogState =
+    rememberSaveable(saver = DialogStateImpl.Saver(position)) {
+        DialogStateImpl(position, DpSize(width, height))
+    }
 
 /**
- * A state object that can be hoisted to control and observe dialog attributes
- * (size/position).
+ * A state object that can be hoisted to control and observe dialog attributes (size/position).
  *
  * @param position the initial value for [DialogState.position]
  * @param width the initial value for width of [WindowState.size]
- * @param height the initial value for height of  [WindowState.size]
+ * @param height the initial value for height of [WindowState.size]
  */
 fun DialogState(
     position: WindowPosition = WindowPosition(Alignment.Center),
     width: Dp = 400.dp,
     height: Dp = 300.dp,
-): DialogState = DialogStateImpl(
-    position,
-    DpSize(width, height)
-)
+): DialogState = DialogStateImpl(position, DpSize(width, height))
 
-/**
- * A state object that can be hoisted to control and observe dialog attributes
- * (size/position).
- */
+/** A state object that can be hoisted to control and observe dialog attributes (size/position). */
 interface DialogState {
     /**
-     * Current position of the dialog. If position is not specified ([WindowPosition.isSpecified]
-     * is false) then once the dialog shows on the screen the position will be set to
-     * absolute values [WindowPosition.Absolute].
+     * Current position of the dialog. If position is not specified ([WindowPosition.isSpecified] is
+     * false) then once the dialog shows on the screen the position will be set to absolute values
+     * [WindowPosition.Absolute].
      */
     var position: WindowPosition
 
-    /**
-     * Current size of the dialog.
-     */
+    /** Current size of the dialog. */
     var size: DpSize
 }
 
-private class DialogStateImpl(
-    position: WindowPosition,
-    size: DpSize
-) : DialogState {
+private class DialogStateImpl(position: WindowPosition, size: DpSize) : DialogState {
     override var position by mutableStateOf(position)
     override var size by mutableStateOf(size)
 
     companion object {
-        /**
-         * The default [Saver] implementation for [DialogStateImpl].
-         */
-        fun Saver(unspecifiedPosition: WindowPosition) = listSaver<DialogState, Any>(
-            save = {
-                listOf(
-                    it.position.isSpecified,
-                    it.position.x.value,
-                    it.position.y.value,
-                    it.size.width.value,
-                    it.size.height.value,
-                )
-            },
-            restore = { state ->
-                DialogStateImpl(
-                    position = if (state[0] as Boolean) {
-                        WindowPosition((state[1] as Float).dp, (state[2] as Float).dp)
-                    } else {
-                        unspecifiedPosition
-                    },
-                    size = DpSize((state[3] as Float).dp, (state[4] as Float).dp),
-                )
-            }
-        )
+        /** The default [Saver] implementation for [DialogStateImpl]. */
+        fun Saver(unspecifiedPosition: WindowPosition) =
+            listSaver<DialogState, Any>(
+                save = {
+                    listOf(
+                        it.position.isSpecified,
+                        it.position.x.value,
+                        it.position.y.value,
+                        it.size.width.value,
+                        it.size.height.value,
+                    )
+                },
+                restore = { state ->
+                    DialogStateImpl(
+                        position =
+                            if (state[0] as Boolean) {
+                                WindowPosition((state[1] as Float).dp, (state[2] as Float).dp)
+                            } else {
+                                unspecifiedPosition
+                            },
+                        size = DpSize((state[3] as Float).dp, (state[4] as Float).dp),
+                    )
+                }
+            )
     }
 }
diff --git a/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/window/LayoutConfiguration.desktop.kt b/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/window/LayoutConfiguration.desktop.kt
index fee47de..b3954b9 100644
--- a/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/window/LayoutConfiguration.desktop.kt
+++ b/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/window/LayoutConfiguration.desktop.kt
@@ -31,19 +31,22 @@
 // TODO(demin) support RTL. see https://github.com/JetBrains/compose-jb/issues/872.
 //  also, don't forget to search all LayoutDirection.Ltr in desktopMain
 
-internal val GlobalDensity get() = GraphicsEnvironment.getLocalGraphicsEnvironment()
-    .defaultScreenDevice
-    .defaultConfiguration
-    .density
+internal val GlobalDensity
+    get() =
+        GraphicsEnvironment.getLocalGraphicsEnvironment()
+            .defaultScreenDevice
+            .defaultConfiguration
+            .density
 
-internal val Component.density: Density get() = graphicsConfiguration.density
+internal val Component.density: Density
+    get() = graphicsConfiguration.density
 
-private val GraphicsConfiguration.density: Density get() = Density(
-    defaultTransform.scaleX.toFloat(),
-    fontScale = 1f
-)
+private val GraphicsConfiguration.density: Density
+    get() = Density(defaultTransform.scaleX.toFloat(), fontScale = 1f)
 
-internal val GlobalLayoutDirection get() = LayoutDirection.Ltr
+internal val GlobalLayoutDirection
+    get() = LayoutDirection.Ltr
 
 @Suppress("unused")
-internal val Component.layoutDirection: LayoutDirection get() = LayoutDirection.Ltr
+internal val Component.layoutDirection: LayoutDirection
+    get() = LayoutDirection.Ltr
diff --git a/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/window/LocalWindow.desktop.kt b/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/window/LocalWindow.desktop.kt
index 9d202ea..5fa4675 100644
--- a/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/window/LocalWindow.desktop.kt
+++ b/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/window/LocalWindow.desktop.kt
@@ -23,7 +23,7 @@
 import java.awt.Window
 
 /**
- * Window-owner of the current composition (for example, [ComposeWindow] or [ComposeDialog]).
- * If the composition is not inside Window (for example, [ComposePanel]), then return null
+ * Window-owner of the current composition (for example, [ComposeWindow] or [ComposeDialog]). If the
+ * composition is not inside Window (for example, [ComposePanel]), then return null
  */
 internal val LocalWindow = compositionLocalOf<Window?> { null }
diff --git a/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/window/Menu.desktop.kt b/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/window/Menu.desktop.kt
index 52f1603..f352dc0 100644
--- a/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/window/Menu.desktop.kt
+++ b/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/window/Menu.desktop.kt
@@ -58,12 +58,11 @@
  * Composes the given composable into the MenuBar.
  *
  * The new composition can be logically "linked" to an existing one, by providing a
- * [parentComposition]. This will ensure that invalidations and CompositionLocals will flow
- * through the two compositions as if they were not separate.
+ * [parentComposition]. This will ensure that invalidations and CompositionLocals will flow through
+ * the two compositions as if they were not separate.
  *
- * @param parentComposition The parent composition reference to coordinate
- *        scheduling of composition updates.
- *        If null then default root composition will be used.
+ * @param parentComposition The parent composition reference to coordinate scheduling of composition
+ *   updates. If null then default root composition will be used.
  * @param content Composable content of the MenuBar.
  */
 fun JMenuBar.setContent(
@@ -73,9 +72,7 @@
     val applier = MutableListApplier(asMutableList())
     val composition = Composition(applier, parentComposition)
     val scope = MenuBarScope()
-    composition.setContent {
-        scope.content()
-    }
+    composition.setContent { scope.content() }
     return composition
 }
 
@@ -83,12 +80,11 @@
  * Composes the given composable into the Menu.
  *
  * The new composition can be logically "linked" to an existing one, by providing a
- * [parentComposition]. This will ensure that invalidations and CompositionLocals will flow
- * through the two compositions as if they were not separate.
+ * [parentComposition]. This will ensure that invalidations and CompositionLocals will flow through
+ * the two compositions as if they were not separate.
  *
- * @param parentComposition The parent composition reference to coordinate
- *        scheduling of composition updates.
- *        If null then default root composition will be used.
+ * @param parentComposition The parent composition reference to coordinate scheduling of composition
+ *   updates. If null then default root composition will be used.
  * @param content Composable content of the Menu.
  */
 fun Menu.setContent(
@@ -98,9 +94,7 @@
     val applier = MenuItemApplier(this)
     val composition = Composition(applier, parentComposition)
     val scope = MenuScope(AwtMenuScope())
-    composition.setContent {
-        scope.content()
-    }
+    composition.setContent { scope.content() }
     return composition
 }
 
@@ -108,12 +102,11 @@
  * Composes the given composable into the Menu.
  *
  * The new composition can be logically "linked" to an existing one, by providing a
- * [parentComposition]. This will ensure that invalidations and CompositionLocals will flow
- * through the two compositions as if they were not separate.
+ * [parentComposition]. This will ensure that invalidations and CompositionLocals will flow through
+ * the two compositions as if they were not separate.
  *
- * @param parentComposition The parent composition reference to coordinate
- *        scheduling of composition updates.
- *        If null then default root composition will be used.
+ * @param parentComposition The parent composition reference to coordinate scheduling of composition
+ *   updates. If null then default root composition will be used.
  * @param content Composable content of the Menu.
  */
 fun JMenu.setContent(
@@ -123,27 +116,22 @@
     val applier = JMenuItemApplier(this)
     val composition = Composition(applier, parentComposition)
     val scope = MenuScope(SwingMenuScope())
-    composition.setContent {
-        scope.content()
-    }
+    composition.setContent { scope.content() }
     return composition
 }
 
 // TODO(demin): consider making MenuBarScope/MenuScope as an interface
 //  after b/165812010 will be fixed
-/**
- * Receiver scope which is used by [JMenuBar.setContent] and [FrameWindowScope.MenuBar].
- */
+/** Receiver scope which is used by [JMenuBar.setContent] and [FrameWindowScope.MenuBar]. */
 class MenuBarScope internal constructor() {
     /**
      * Adds menu to the menu bar
      *
      * @param text text of the menu that will be shown on the menu bar
      * @param enabled is this menu item can be chosen
-     * @param mnemonic character that corresponds to some key on the keyboard.
-     * When this key and Alt modifier will be pressed - menu will be open.
-     * If the character is found within the item's text, the first occurrence
-     * of it will be underlined.
+     * @param mnemonic character that corresponds to some key on the keyboard. When this key and Alt
+     *   modifier will be pressed - menu will be open. If the character is found within the item's
+     *   text, the first occurrence of it will be underlined.
      * @param content content of the menu (sub menus, items, separators, etc)
      */
     @Composable
@@ -158,9 +146,7 @@
 
         DisposableEffect(Unit) {
             val composition = menu.setContent(compositionContext, content)
-            onDispose {
-                composition.dispose()
-            }
+            onDispose { composition.dispose() }
         }
 
         ComposeNode<JMenu, MutableListApplier<JComponent>>(
@@ -183,8 +169,7 @@
         content: @Composable MenuScope.() -> Unit
     )
 
-    @Composable
-    fun Separator()
+    @Composable fun Separator()
 
     @Composable
     fun Item(
@@ -282,13 +267,7 @@
         val currentOnClick by rememberUpdatedState(onClick)
 
         ComposeNode<MenuItem, MenuItemApplier>(
-            factory = {
-                MenuItem().apply {
-                    addActionListener {
-                        currentOnClick()
-                    }
-                }
-            },
+            factory = { MenuItem().apply { addActionListener { currentOnClick() } } },
             update = {
                 set(text, MenuItem::setLabel)
                 set(enabled, MenuItem::setEnabled)
@@ -318,17 +297,13 @@
 
         val currentOnCheckedChange by rememberUpdatedState(onCheckedChange)
 
-        val checkedState = rememberStateChanger(
-            CheckboxMenuItem::setState,
-            CheckboxMenuItem::getState
-        )
+        val checkedState =
+            rememberStateChanger(CheckboxMenuItem::setState, CheckboxMenuItem::getState)
 
         ComposeNode<CheckboxMenuItem, MenuItemApplier>(
             factory = {
                 CheckboxMenuItem().apply {
-                    addItemListener {
-                        checkedState.fireChange(this, currentOnCheckedChange)
-                    }
+                    addItemListener { checkedState.fireChange(this, currentOnCheckedChange) }
                 }
             },
             update = {
@@ -404,13 +379,7 @@
         val awtIcon = rememberAwtIcon(icon)
 
         ComposeNode<JMenuItem, JMenuItemApplier>(
-            factory = {
-                JMenuItem().apply {
-                    addActionListener {
-                        currentOnClick()
-                    }
-                }
-            },
+            factory = { JMenuItem().apply { addActionListener { currentOnClick() } } },
             update = {
                 set(text, JMenuItem::setText)
                 set(awtIcon, JMenuItem::setIcon)
@@ -434,17 +403,13 @@
         val currentOnCheckedChange by rememberUpdatedState(onCheckedChange)
         val awtIcon = rememberAwtIcon(icon)
 
-        val checkedState = rememberStateChanger(
-            JCheckBoxMenuItem::setState,
-            JCheckBoxMenuItem::getState
-        )
+        val checkedState =
+            rememberStateChanger(JCheckBoxMenuItem::setState, JCheckBoxMenuItem::getState)
 
         ComposeNode<JCheckBoxMenuItem, JMenuItemApplier>(
             factory = {
                 JCheckBoxMenuItem().apply {
-                    addItemListener {
-                        checkedState.fireChange(this, currentOnCheckedChange)
-                    }
+                    addItemListener { checkedState.fireChange(this, currentOnCheckedChange) }
                 }
             },
             update = {
@@ -471,17 +436,16 @@
         val currentOnClick by rememberUpdatedState(onClick)
         val awtIcon = rememberAwtIcon(icon)
 
-        val selectedState = rememberStateChanger(
-            JRadioButtonMenuItem::setSelected,
-            JRadioButtonMenuItem::isSelected
-        )
+        val selectedState =
+            rememberStateChanger(
+                JRadioButtonMenuItem::setSelected,
+                JRadioButtonMenuItem::isSelected
+            )
 
         ComposeNode<JRadioButtonMenuItem, JMenuItemApplier>(
             factory = {
                 JRadioButtonMenuItem().apply {
-                    addItemListener {
-                        selectedState.fireChange(this) { currentOnClick() }
-                    }
+                    addItemListener { selectedState.fireChange(this) { currentOnClick() } }
                 }
             },
             update = {
@@ -498,19 +462,16 @@
 
 // we use `class MenuScope` and `interface MenuScopeImpl` instead of just `interface MenuScope`
 // because of b/165812010
-/**
- * Receiver scope which is used by [Menu.setContent], [MenuBarScope.Menu], [Tray]
- */
+/** Receiver scope which is used by [Menu.setContent], [MenuBarScope.Menu], [Tray] */
 class MenuScope internal constructor(private val impl: MenuScopeImpl) {
     /**
      * Adds sub menu to the menu
      *
      * @param text text of the menu that will be shown in the menu
      * @param enabled is this menu item can be chosen
-     * @param mnemonic character that corresponds to some key on the keyboard.
-     * When this key will be pressed - menu will be open.
-     * If the character is found within the item's text, the first occurrence
-     * of it will be underlined.
+     * @param mnemonic character that corresponds to some key on the keyboard. When this key will be
+     *   pressed - menu will be open. If the character is found within the item's text, the first
+     *   occurrence of it will be underlined.
      * @param content content of the menu (sub menus, items, separators, etc)
      */
     @Composable
@@ -519,18 +480,10 @@
         enabled: Boolean = true,
         mnemonic: Char? = null,
         content: @Composable MenuScope.() -> Unit
-    ): Unit = impl.Menu(
-        text,
-        enabled,
-        mnemonic,
-        content
-    )
+    ): Unit = impl.Menu(text, enabled, mnemonic, content)
 
-    /**
-     * Adds separator to the menu
-     */
-    @Composable
-    fun Separator() = impl.Separator()
+    /** Adds separator to the menu */
+    @Composable fun Separator() = impl.Separator()
 
     /**
      * Adds item to the menu
@@ -538,12 +491,11 @@
      * @param text text of the item that will be shown in the menu
      * @param icon icon of the item
      * @param enabled is this item item can be chosen
-     * @param mnemonic character that corresponds to some key on the keyboard.
-     * When this key will be pressed - [onClick] will be triggered.
-     * If the character is found within the item's text, the first occurrence
-     * of it will be underlined.
-     * @param shortcut key combination which triggers [onClick] action without
-     * navigating the menu hierarchy.
+     * @param mnemonic character that corresponds to some key on the keyboard. When this key will be
+     *   pressed - [onClick] will be triggered. If the character is found within the item's text,
+     *   the first occurrence of it will be underlined.
+     * @param shortcut key combination which triggers [onClick] action without navigating the menu
+     *   hierarchy.
      * @param onClick action that should be performed when the user clicks on the item
      */
     @Composable
@@ -563,14 +515,13 @@
      * @param checked whether checkbox is checked or unchecked
      * @param icon icon of the item
      * @param enabled is this item item can be chosen
-     * @param mnemonic character that corresponds to some key on the keyboard.
-     * When this key will be pressed - [onCheckedChange] will be triggered.
-     * If the character is found within the item's text, the first occurrence
-     * of it will be underlined.
-     * @param shortcut key combination which triggers [onCheckedChange] action without
-     * navigating the menu hierarchy.
-     * @param onCheckedChange callback to be invoked when checkbox is being clicked,
-     * therefore the change of checked state in requested
+     * @param mnemonic character that corresponds to some key on the keyboard. When this key will be
+     *   pressed - [onCheckedChange] will be triggered. If the character is found within the item's
+     *   text, the first occurrence of it will be underlined.
+     * @param shortcut key combination which triggers [onCheckedChange] action without navigating
+     *   the menu hierarchy.
+     * @param onCheckedChange callback to be invoked when checkbox is being clicked, therefore the
+     *   change of checked state in requested
      */
     @Composable
     fun CheckboxItem(
@@ -581,9 +532,7 @@
         mnemonic: Char? = null,
         shortcut: KeyShortcut? = null,
         onCheckedChange: (Boolean) -> Unit
-    ): Unit = impl.CheckboxItem(
-        text, checked, icon, enabled, mnemonic, shortcut, onCheckedChange
-    )
+    ): Unit = impl.CheckboxItem(text, checked, icon, enabled, mnemonic, shortcut, onCheckedChange)
 
     /**
      * Adds item with radio button to the menu
@@ -592,12 +541,11 @@
      * @param selected boolean state for this button: either it is selected or not
      * @param icon icon of the item
      * @param enabled is this item item can be chosen
-     * @param mnemonic character that corresponds to some key on the keyboard.
-     * When this key will be pressed - [onClick] will be triggered.
-     * If the character is found within the item's text, the first occurrence
-     * of it will be underlined.
-     * @param shortcut key combination which triggers [onClick] action without
-     * navigating the menu hierarchy.
+     * @param mnemonic character that corresponds to some key on the keyboard. When this key will be
+     *   pressed - [onClick] will be triggered. If the character is found within the item's text,
+     *   the first occurrence of it will be underlined.
+     * @param shortcut key combination which triggers [onClick] action without navigating the menu
+     *   hierarchy.
      * @param onClick callback to be invoked when the radio button is being clicked
      */
     @Composable
@@ -609,14 +557,10 @@
         mnemonic: Char? = null,
         shortcut: KeyShortcut? = null,
         onClick: () -> Unit
-    ): Unit = impl.RadioButtonItem(
-        text, selected, icon, enabled, mnemonic, shortcut, onClick
-    )
+    ): Unit = impl.RadioButtonItem(text, selected, icon, enabled, mnemonic, shortcut, onClick)
 }
 
-private class MutableListApplier<T>(
-    private val list: MutableList<T>
-) : AbstractApplier<T?>(null) {
+private class MutableListApplier<T>(private val list: MutableList<T>) : AbstractApplier<T?>(null) {
     override fun insertTopDown(index: Int, instance: T?) {
         list.add(index, instance!!)
     }
@@ -684,7 +628,9 @@
         val current = current
 
         performMove(
-            from, to, count,
+            from,
+            to,
+            count,
             getItem = { current.getComponent(it) },
             removeItem = { current.remove(it) },
             insertItem = { item, idx -> current.add(item, idx) }
@@ -738,7 +684,9 @@
         val menu = current.asMenu()
 
         performMove(
-            from, to, count,
+            from,
+            to,
+            count,
             getItem = { menu.getItem(it) },
             removeItem = { menu.remove(it) },
             insertItem = { item, idx -> menu.insert(item, idx) }
@@ -762,7 +710,9 @@
 
 private fun JMenuBar.asMutableList(): MutableList<JComponent> {
     return object : AddRemoveMutableList<JComponent>() {
-        override val size: Int get() = this@asMutableList.menuCount
+        override val size: Int
+            get() = this@asMutableList.menuCount
+
         override fun get(index: Int) = this@asMutableList.getMenu(index)
 
         override fun performAdd(element: JComponent) {
@@ -789,26 +739,22 @@
     val layoutDirection = LocalLayoutDirection.current
 
     return remember(painter, density, layoutDirection) {
-        painter
-            ?.toAwtImage(density, layoutDirection, DefaultIconSize)
-            ?.let(::ImageIcon)
+        painter?.toAwtImage(density, layoutDirection, DefaultIconSize)?.let(::ImageIcon)
     }
 }
 
 @Composable
-private fun <R, V> rememberStateChanger(
-    set: R.(V) -> Unit,
-    get: R.() -> V
-): ComposeState<R, V> = remember {
-    ComposeState(set, get)
-}
+private fun <R, V> rememberStateChanger(set: R.(V) -> Unit, get: R.() -> V): ComposeState<R, V> =
+    remember {
+        ComposeState(set, get)
+    }
 
 /**
  * Helper class to change state without firing a listener, and fire a listener without state change
  *
- * The purpose is to make Swing's state behave as it was attribute in stateless Compose widget.
- * For example, ComposeState don't fire `onCheckedChange` if we change `checkbox.checked`,
- * and don't change `checkbox.checked` if user clicks on checkbox.
+ * The purpose is to make Swing's state behave as it was attribute in stateless Compose widget. For
+ * example, ComposeState don't fire `onCheckedChange` if we change `checkbox.checked`, and don't
+ * change `checkbox.checked` if user clicks on checkbox.
  */
 private class ComposeState<R, V>(
     private val set: R.(V) -> Unit,
diff --git a/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/window/Notification.desktop.kt b/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/window/Notification.desktop.kt
index bf0f254..41f3d46 100644
--- a/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/window/Notification.desktop.kt
+++ b/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/window/Notification.desktop.kt
@@ -24,46 +24,35 @@
  *
  * @param title Title of the notification
  * @param message The main text of the notification
- * @param type Type of the notification that defines how the notification will be represented to
- * the user (with which icon and which sound)
+ * @param type Type of the notification that defines how the notification will be represented to the
+ *   user (with which icon and which sound)
  */
 @Composable
 fun rememberNotification(
     title: String,
     message: String,
     type: Notification.Type = Notification.Type.None
-): Notification = remember {
-    Notification(
-        title, message, type
-    )
-}
+): Notification = remember { Notification(title, message, type) }
 
 /**
  * Notification, that can be sent to the platform and be shown to the user (in tray, notification
  * center, etc; depends on the platform).
  *
- * If notification creates inside Composable function it is better to use
- * [rememberNotification] to avoid creating a new object every recomposition.
+ * If notification creates inside Composable function it is better to use [rememberNotification] to
+ * avoid creating a new object every recomposition.
  *
  * @param title Title of the notification
  * @param message The main text of the notification
- * @param type Type of the notification that defines how the notification will be represented to
- * the user (with which icon and which sound)
+ * @param type Type of the notification that defines how the notification will be represented to the
+ *   user (with which icon and which sound)
  */
-class Notification(
-    val title: String,
-    val message: String,
-    val type: Type = Type.None
-) {
+class Notification(val title: String, val message: String, val type: Type = Type.None) {
     /**
-     * Returns a copy of this [Notification] instance optionally overriding the
-     * [title], [message], [type] parameter.
+     * Returns a copy of this [Notification] instance optionally overriding the [title], [message],
+     * [type] parameter.
      */
-    fun copy(
-        title: String = this.title,
-        message: String = this.message,
-        type: Type = this.type
-    ) = Notification(title, message, type)
+    fun copy(title: String = this.title, message: String = this.message, type: Type = this.type) =
+        Notification(title, message, type)
 
     override fun toString(): String {
         return "Notification(title=$title, message=$message, type=$type)"
@@ -90,29 +79,20 @@
     }
 
     /**
-     * Describes the type of the notification.
-     * Usually the platform shows a different icon and plays a different sound when notification
-     * will be shown to the user.
+     * Describes the type of the notification. Usually the platform shows a different icon and plays
+     * a different sound when notification will be shown to the user.
      */
     enum class Type {
-        /**
-         * Simple notification
-         */
+        /** Simple notification */
         None,
 
-        /**
-         * Info notification
-         */
+        /** Info notification */
         Info,
 
-        /**
-         * Warning notification
-         */
+        /** Warning notification */
         Warning,
 
-        /**
-         * Error notification
-         */
+        /** Error notification */
         Error,
     }
 }
diff --git a/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/window/Tray.desktop.kt b/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/window/Tray.desktop.kt
index f0987df..43df178 100644
--- a/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/window/Tray.desktop.kt
+++ b/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/window/Tray.desktop.kt
@@ -41,39 +41,39 @@
 // need, and not what we provide. It only affects macOs. This size will be scaled in asAwtImage to
 // support DPI=2.0
 // Unfortunately I hadn't enough time to find sources from the official docs
-private val iconSize = when (DesktopPlatform.Current) {
-    // https://doc.qt.io/qt-5/qtwidgets-desktop-systray-example.html (search 22x22)
-    DesktopPlatform.Linux -> Size(22f, 22f)
-    // https://doc.qt.io/qt-5/qtwidgets-desktop-systray-example.html (search 16x16)
-    DesktopPlatform.Windows -> Size(16f, 16f)
-    // https://medium.com/@acwrightdesign/creating-a-macos-menu-bar-application-using-swiftui-54572a5d5f87
-    DesktopPlatform.MacOS -> Size(22f, 22f)
-    DesktopPlatform.Unknown -> Size(32f, 32f)
-}
+private val iconSize =
+    when (DesktopPlatform.Current) {
+        // https://doc.qt.io/qt-5/qtwidgets-desktop-systray-example.html (search 22x22)
+        DesktopPlatform.Linux -> Size(22f, 22f)
+        // https://doc.qt.io/qt-5/qtwidgets-desktop-systray-example.html (search 16x16)
+        DesktopPlatform.Windows -> Size(16f, 16f)
+        // https://medium.com/@acwrightdesign/creating-a-macos-menu-bar-application-using-swiftui-54572a5d5f87
+        DesktopPlatform.MacOS -> Size(22f, 22f)
+        DesktopPlatform.Unknown -> Size(32f, 32f)
+    }
 
-/**
- * `true` if the platform supports tray icons in the taskbar
- */
-val isTraySupported: Boolean get() = SystemTray.isSupported()
+/** `true` if the platform supports tray icons in the taskbar */
+val isTraySupported: Boolean
+    get() = SystemTray.isSupported()
 
 // TODO(demin): add mouse click/double-click/right click listeners (can we use PointerInputEvent?)
 /**
  * Adds tray icon to the platform taskbar if it is supported.
  *
- * If tray icon isn't supported by the platform, in the "standard" error output stream
- * will be printed an error.
+ * If tray icon isn't supported by the platform, in the "standard" error output stream will be
+ * printed an error.
  *
- * See [isTraySupported] to know if tray icon is supported
- * (for example to show/hide an option in the application settings)
+ * See [isTraySupported] to know if tray icon is supported (for example to show/hide an option in
+ * the application settings)
  *
  * @param icon Icon of the tray
  * @param state State to control tray and show notifications
  * @param tooltip Hint/tooltip that will be shown to the user
  * @param menu Context menu of the tray that will be shown to the user on the mouse click (right
- * click on Windows, left click on macOs).
- * If it doesn't contain any items then context menu will not be shown.
+ *   click on Windows, left click on macOs). If it doesn't contain any items then context menu will
+ *   not be shown.
  * @param onAction Action performed when user clicks on the tray icon (double click on Windows,
- * right click on macOs)
+ *   right click on macOs)
  */
 @Suppress("unused")
 @Composable
@@ -103,23 +103,23 @@
 
     val currentOnAction by rememberUpdatedState(onAction)
 
-    val awtIcon = remember(icon) {
-        // We shouldn't use LocalDensity here because Tray's density doesn't equal it. It
-        // equals to the density of the screen on which it shows. Currently Swing doesn't
-        // provide us such information, it only requests an image with the desired width/height
-        // (see MultiResolutionImage.getResolutionVariant). Resources like svg/xml should look okay
-        // because they don't use absolute '.dp' values to draw, they use values which are
-        // relative to their viewport.
-        icon.toAwtImage(GlobalDensity, GlobalLayoutDirection, iconSize)
-    }
+    val awtIcon =
+        remember(icon) {
+            // We shouldn't use LocalDensity here because Tray's density doesn't equal it. It
+            // equals to the density of the screen on which it shows. Currently Swing doesn't
+            // provide us such information, it only requests an image with the desired width/height
+            // (see MultiResolutionImage.getResolutionVariant). Resources like svg/xml should look
+            // okay
+            // because they don't use absolute '.dp' values to draw, they use values which are
+            // relative to their viewport.
+            icon.toAwtImage(GlobalDensity, GlobalLayoutDirection, iconSize)
+        }
 
     val tray = remember {
         TrayIcon(awtIcon).apply {
             isImageAutoSize = true
 
-            addActionListener {
-                currentOnAction()
-            }
+            addActionListener { currentOnAction() }
         }
     }
     val popupMenu = remember { PopupMenu() }
@@ -136,15 +136,11 @@
     DisposableEffect(Unit) {
         tray.popupMenu = popupMenu
 
-        val menuComposition = popupMenu.setContent(composition) {
-            currentMenu()
-        }
+        val menuComposition = popupMenu.setContent(composition) { currentMenu() }
 
         SystemTray.getSystemTray().add(tray)
 
-        state.notificationFlow
-            .onEach(tray::displayMessage)
-            .launchIn(coroutineScope)
+        state.notificationFlow.onEach(tray::displayMessage).launchIn(coroutineScope)
 
         onDispose {
             menuComposition.dispose()
@@ -153,13 +149,8 @@
     }
 }
 
-/**
- * Creates a [WindowState] that is remembered across compositions.
- */
-@Composable
-fun rememberTrayState() = remember {
-    TrayState()
-}
+/** Creates a [WindowState] that is remembered across compositions. */
+@Composable fun rememberTrayState() = remember { TrayState() }
 
 /**
  * A state object that can be hoisted to control tray and show notifications.
@@ -170,9 +161,8 @@
     private val notificationChannel = Channel<Notification>(0)
 
     /**
-     * Flow of notifications sent by [sendNotification].
-     * This flow doesn't have a buffer, so all previously sent notifications will not appear in
-     * this flow.
+     * Flow of notifications sent by [sendNotification]. This flow doesn't have a buffer, so all
+     * previously sent notifications will not appear in this flow.
      */
     val notificationFlow: Flow<Notification>
         get() = notificationChannel.receiveAsFlow()
@@ -187,12 +177,13 @@
 }
 
 private fun TrayIcon.displayMessage(notification: Notification) {
-    val messageType = when (notification.type) {
-        Notification.Type.None -> TrayIcon.MessageType.NONE
-        Notification.Type.Info -> TrayIcon.MessageType.INFO
-        Notification.Type.Warning -> TrayIcon.MessageType.WARNING
-        Notification.Type.Error -> TrayIcon.MessageType.ERROR
-    }
+    val messageType =
+        when (notification.type) {
+            Notification.Type.None -> TrayIcon.MessageType.NONE
+            Notification.Type.Info -> TrayIcon.MessageType.INFO
+            Notification.Type.Warning -> TrayIcon.MessageType.WARNING
+            Notification.Type.Error -> TrayIcon.MessageType.ERROR
+        }
 
     displayMessage(notification.title, notification.message, messageType)
 }
diff --git a/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/window/UndecoratedWindowResizer.desktop.kt b/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/window/UndecoratedWindowResizer.desktop.kt
index 79c3b9d..6519a19 100644
--- a/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/window/UndecoratedWindowResizer.desktop.kt
+++ b/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/window/UndecoratedWindowResizer.desktop.kt
@@ -67,9 +67,8 @@
                 Modifier,
                 measurePolicy = { measurables, constraints ->
                     val b = borderThickness.roundToPx()
-                    fun Measurable.measureSide(width: Int, height: Int) = measure(
-                        Constraints.fixed(width.coerceAtLeast(0), height.coerceAtLeast(0))
-                    )
+                    fun Measurable.measureSide(width: Int, height: Int) =
+                        measure(Constraints.fixed(width.coerceAtLeast(0), height.coerceAtLeast(0)))
 
                     val left = measurables[0].measureSide(b, constraints.maxHeight - 2 * b)
                     val right = measurables[1].measureSide(b, constraints.maxHeight - 2 * b)
@@ -94,42 +93,44 @@
         }
     }
 
-    private fun Modifier.resizeOnDrag(sides: Int) = pointerInput(Unit) {
-        var isResizing = false
-        awaitPointerEventScope {
-            while (true) {
-                val event = awaitPointerEvent()
-                val change = event.changes.first()
-                val changedToPressed = !change.previousPressed && change.pressed
+    private fun Modifier.resizeOnDrag(sides: Int) =
+        pointerInput(Unit) {
+            var isResizing = false
+            awaitPointerEventScope {
+                while (true) {
+                    val event = awaitPointerEvent()
+                    val change = event.changes.first()
+                    val changedToPressed = !change.previousPressed && change.pressed
 
-                if (event.buttons.isPrimaryPressed && changedToPressed) {
-                    initialPointPos = MouseInfo.getPointerInfo().location
-                    initialWindowPos = Point(window.x, window.y)
-                    initialWindowSize = Dimension(window.width, window.height)
-                    isResizing = true
-                }
+                    if (event.buttons.isPrimaryPressed && changedToPressed) {
+                        initialPointPos = MouseInfo.getPointerInfo().location
+                        initialWindowPos = Point(window.x, window.y)
+                        initialWindowSize = Dimension(window.width, window.height)
+                        isResizing = true
+                    }
 
-                if (!event.buttons.isPrimaryPressed) {
-                    isResizing = false
-                }
+                    if (!event.buttons.isPrimaryPressed) {
+                        isResizing = false
+                    }
 
-                if (event.type == PointerEventType.Move) {
-                    if (isResizing) {
-                        resize(sides)
+                    if (event.type == PointerEventType.Move) {
+                        if (isResizing) {
+                            resize(sides)
+                        }
                     }
                 }
             }
         }
-    }
 
     @Composable
-    private fun Side(cursorId: Int, sides: Int) = Layout(
-        {},
-        Modifier.cursor(cursorId).resizeOnDrag(sides),
-        measurePolicy = { _, constraints ->
-            layout(constraints.maxWidth, constraints.maxHeight) {}
-        }
-    )
+    private fun Side(cursorId: Int, sides: Int) =
+        Layout(
+            {},
+            Modifier.cursor(cursorId).resizeOnDrag(sides),
+            measurePolicy = { _, constraints ->
+                layout(constraints.maxWidth, constraints.maxHeight) {}
+            }
+        )
 
     @OptIn(ExperimentalComposeUiApi::class)
     private fun Modifier.cursor(awtCursorId: Int) =
diff --git a/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/window/Window.desktop.kt b/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/window/Window.desktop.kt
index 0826e9a..4f3b04c 100644
--- a/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/window/Window.desktop.kt
+++ b/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/window/Window.desktop.kt
@@ -47,15 +47,15 @@
 
 // TODO(demin): support focus management
 /**
- * Composes platform window in the current composition. When Window enters the composition,
- * a new platform window will be created and receives the focus. When Window leaves the
- * composition, window will be disposed and closed.
+ * Composes platform window in the current composition. When Window enters the composition, a new
+ * platform window will be created and receives the focus. When Window leaves the composition,
+ * window will be disposed and closed.
  *
- * Initial size of the window is controlled by [WindowState.size].
- * Initial position of the window is controlled by [WindowState.position].
+ * Initial size of the window is controlled by [WindowState.size]. Initial position of the window is
+ * controlled by [WindowState.position].
  *
- * Usage in single-window application ([ApplicationScope.exitApplication] will close all the
- * windows and stop all effects defined in [application]):
+ * Usage in single-window application ([ApplicationScope.exitApplication] will close all the windows
+ * and stop all effects defined in [application]):
  * ```
  * fun main() = application {
  *     Window(onCloseRequest = ::exitApplication)
@@ -72,46 +72,46 @@
  * }
  * ```
  *
- * @param onCloseRequest Callback that will be called when the user closes the window.
- * Usually in this callback we need to manually tell Compose what to do:
+ * @param onCloseRequest Callback that will be called when the user closes the window. Usually in
+ *   this callback we need to manually tell Compose what to do:
  * - change `isOpen` state of the window (which is manually defined)
  * - close the whole application (`onCloseRequest = ::exitApplication` in [ApplicationScope])
  * - don't close the window on close request (`onCloseRequest = {}`)
- * @param state The state object to be used to control or observe the window's state
- * When size/position/status is changed by the user, state will be updated.
- * When size/position/status of the window is changed by the application (changing state),
- * the native window will update its corresponding properties.
- * If application changes, for example [WindowState.placement], then after the next
- * recomposition, [WindowState.size] will be changed to correspond the real size of the window.
- * If [WindowState.position] is not [WindowPosition.isSpecified], then after the first show on the
- * screen [WindowState.position] will be set to the absolute values.
- * @param visible Is [Window] visible to user.
- * If `false`:
- * - internal state of [Window] is preserved and will be restored next time the window
- * will be visible;
- * - native resources will not be released. They will be released only when [Window]
- * will leave the composition.
+ *
+ * @param state The state object to be used to control or observe the window's state When
+ *   size/position/status is changed by the user, state will be updated. When size/position/status
+ *   of the window is changed by the application (changing state), the native window will update its
+ *   corresponding properties. If application changes, for example [WindowState.placement], then
+ *   after the next recomposition, [WindowState.size] will be changed to correspond the real size of
+ *   the window. If [WindowState.position] is not [WindowPosition.isSpecified], then after the first
+ *   show on the screen [WindowState.position] will be set to the absolute values.
+ * @param visible Is [Window] visible to user. If `false`:
+ * - internal state of [Window] is preserved and will be restored next time the window will be
+ *   visible;
+ * - native resources will not be released. They will be released only when [Window] will leave the
+ *   composition.
+ *
  * @param title Title in the titlebar of the window
- * @param icon Icon in the titlebar of the window (for platforms which support this).
- * On macOs individual windows can't have a separate icon. To change the icon in the Dock,
- * set it via `iconFile` in build.gradle
- * (https://github.com/JetBrains/compose-jb/tree/master/tutorials/Native_distributions_and_local_execution#platform-specific-options)
+ * @param icon Icon in the titlebar of the window (for platforms which support this). On macOs
+ *   individual windows can't have a separate icon. To change the icon in the Dock, set it via
+ *   `iconFile` in build.gradle
+ *   (https://github.com/JetBrains/compose-jb/tree/master/tutorials/Native_distributions_and_local_execution#platform-specific-options)
  * @param undecorated Disables or enables decorations for this window.
- * @param transparent Disables or enables window transparency. Transparency should be set
- * only if window is undecorated, otherwise an exception will be thrown.
+ * @param transparent Disables or enables window transparency. Transparency should be set only if
+ *   window is undecorated, otherwise an exception will be thrown.
  * @param resizable Can window be resized by the user (application still can resize the window
- * changing [state])
+ *   changing [state])
  * @param enabled Can window react to input events
  * @param focusable Can window receive focus
  * @param alwaysOnTop Should window always be on top of another windows
  * @param onPreviewKeyEvent This callback is invoked when the user interacts with the hardware
- * keyboard. It gives ancestors of a focused component the chance to intercept a [KeyEvent].
- * Return true to stop propagation of this event. If you return false, the key event will be
- * sent to this [onPreviewKeyEvent]'s child. If none of the children consume the event,
- * it will be sent back up to the root using the onKeyEvent callback.
- * @param onKeyEvent This callback is invoked when the user interacts with the hardware
- * keyboard. While implementing this callback, return true to stop propagation of this event.
- * If you return false, the key event will be sent to this [onKeyEvent]'s parent.
+ *   keyboard. It gives ancestors of a focused component the chance to intercept a [KeyEvent].
+ *   Return true to stop propagation of this event. If you return false, the key event will be sent
+ *   to this [onPreviewKeyEvent]'s child. If none of the children consume the event, it will be sent
+ *   back up to the root using the onKeyEvent callback.
+ * @param onKeyEvent This callback is invoked when the user interacts with the hardware keyboard.
+ *   While implementing this callback, return true to stop propagation of this event. If you return
+ *   false, the key event will be sent to this [onKeyEvent]'s parent.
  * @param content Content of the window
  */
 @Composable
@@ -152,28 +152,32 @@
             ComposeWindow().apply {
                 // close state is controlled by WindowState.isOpen
                 defaultCloseOperation = JFrame.DO_NOTHING_ON_CLOSE
-                addWindowListener(object : WindowAdapter() {
-                    override fun windowClosing(e: WindowEvent) {
-                        currentOnCloseRequest()
+                addWindowListener(
+                    object : WindowAdapter() {
+                        override fun windowClosing(e: WindowEvent) {
+                            currentOnCloseRequest()
+                        }
                     }
-                })
+                )
                 addWindowStateListener {
                     currentState.placement = placement
                     currentState.isMinimized = isMinimized
                 }
-                addComponentListener(object : ComponentAdapter() {
-                    override fun componentResized(e: ComponentEvent) {
-                        // we check placement here and in windowStateChanged,
-                        // because fullscreen changing doesn't
-                        // fire windowStateChanged, only componentResized
-                        currentState.placement = placement
-                        currentState.size = DpSize(width.dp, height.dp)
-                    }
+                addComponentListener(
+                    object : ComponentAdapter() {
+                        override fun componentResized(e: ComponentEvent) {
+                            // we check placement here and in windowStateChanged,
+                            // because fullscreen changing doesn't
+                            // fire windowStateChanged, only componentResized
+                            currentState.placement = placement
+                            currentState.size = DpSize(width.dp, height.dp)
+                        }
 
-                    override fun componentMoved(e: ComponentEvent) {
-                        currentState.position = WindowPosition(x.dp, y.dp)
+                        override fun componentMoved(e: ComponentEvent) {
+                            currentState.position = WindowPosition(x.dp, y.dp)
+                        }
                     }
-                })
+                )
             }
         },
         dispose = ComposeWindow::dispose,
@@ -208,41 +212,40 @@
  * }
  * ```
  *
- * @param state The state object to be used to control or observe the window's state
- * When size/position/status is changed by the user, state will be updated.
- * When size/position/status of the window is changed by the application (changing state),
- * the native window will update its corresponding properties.
- * If application changes, for example [WindowState.placement], then after the next
- * recomposition, [WindowState.size] will be changed to correspond the real size of the window.
- * If [WindowState.position] is not [WindowPosition.isSpecified], then after the first show on the
- * screen [WindowState.position] will be set to the absolute values.
- * @param visible Is [Window] visible to user.
- * If `false`:
- * - internal state of [Window] is preserved and will be restored next time the window
- * will be visible;
- * - native resources will not be released. They will be released only when [Window]
- * will leave the composition.
+ * @param state The state object to be used to control or observe the window's state When
+ *   size/position/status is changed by the user, state will be updated. When size/position/status
+ *   of the window is changed by the application (changing state), the native window will update its
+ *   corresponding properties. If application changes, for example [WindowState.placement], then
+ *   after the next recomposition, [WindowState.size] will be changed to correspond the real size of
+ *   the window. If [WindowState.position] is not [WindowPosition.isSpecified], then after the first
+ *   show on the screen [WindowState.position] will be set to the absolute values.
+ * @param visible Is [Window] visible to user. If `false`:
+ * - internal state of [Window] is preserved and will be restored next time the window will be
+ *   visible;
+ * - native resources will not be released. They will be released only when [Window] will leave the
+ *   composition.
+ *
  * @param title Title in the titlebar of the window
- * @param icon Icon in the titlebar of the window (for platforms which support this).
- * On macOs individual windows can't have a separate icon. To change the icon in the Dock,
- * set it via `iconFile` in build.gradle
- * (https://github.com/JetBrains/compose-jb/tree/master/tutorials/Native_distributions_and_local_execution#platform-specific-options)
+ * @param icon Icon in the titlebar of the window (for platforms which support this). On macOs
+ *   individual windows can't have a separate icon. To change the icon in the Dock, set it via
+ *   `iconFile` in build.gradle
+ *   (https://github.com/JetBrains/compose-jb/tree/master/tutorials/Native_distributions_and_local_execution#platform-specific-options)
  * @param undecorated Disables or enables decorations for this window.
- * @param transparent Disables or enables window transparency. Transparency should be set
- * only if window is undecorated, otherwise an exception will be thrown.
+ * @param transparent Disables or enables window transparency. Transparency should be set only if
+ *   window is undecorated, otherwise an exception will be thrown.
  * @param resizable Can window be resized by the user (application still can resize the window
- * changing [state])
+ *   changing [state])
  * @param enabled Can window react to input events
  * @param focusable Can window receive focus
  * @param alwaysOnTop Should window always be on top of another windows
  * @param onPreviewKeyEvent This callback is invoked when the user interacts with the hardware
- * keyboard. It gives ancestors of a focused component the chance to intercept a [KeyEvent].
- * Return true to stop propagation of this event. If you return false, the key event will be
- * sent to this [onPreviewKeyEvent]'s child. If none of the children consume the event,
- * it will be sent back up to the root using the onKeyEvent callback.
- * @param onKeyEvent This callback is invoked when the user interacts with the hardware
- * keyboard. While implementing this callback, return true to stop propagation of this event.
- * If you return false, the key event will be sent to this [onKeyEvent]'s parent.
+ *   keyboard. It gives ancestors of a focused component the chance to intercept a [KeyEvent].
+ *   Return true to stop propagation of this event. If you return false, the key event will be sent
+ *   to this [onPreviewKeyEvent]'s child. If none of the children consume the event, it will be sent
+ *   back up to the root using the onKeyEvent callback.
+ * @param onKeyEvent This callback is invoked when the user interacts with the hardware keyboard.
+ *   While implementing this callback, return true to stop propagation of this event. If you return
+ *   false, the key event will be sent to this [onKeyEvent]'s parent.
  * @param content Content of the window
  */
 fun singleWindowApplication(
@@ -279,38 +282,38 @@
 }
 
 /**
- * Compose [ComposeWindow] obtained from [create]. The [create] block will be called
- * exactly once to obtain the [ComposeWindow] to be composed, and it is also guaranteed to
- * be invoked on the UI thread (Event Dispatch Thread).
+ * Compose [ComposeWindow] obtained from [create]. The [create] block will be called exactly once to
+ * obtain the [ComposeWindow] to be composed, and it is also guaranteed to be invoked on the UI
+ * thread (Event Dispatch Thread).
  *
- * Once Window leaves the composition, [dispose] will be called to free resources that
- * obtained by the [ComposeWindow].
+ * Once Window leaves the composition, [dispose] will be called to free resources that obtained by
+ * the [ComposeWindow].
  *
- * The [update] block can be run multiple times (on the UI thread as well) due to recomposition,
- * and it is the right place to set [ComposeWindow] properties depending on state.
- * When state changes, the block will be reexecuted to set the new properties.
- * Note the block will also be ran once right after the [create] block completes.
+ * The [update] block can be run multiple times (on the UI thread as well) due to recomposition, and
+ * it is the right place to set [ComposeWindow] properties depending on state. When state changes,
+ * the block will be reexecuted to set the new properties. Note the block will also be ran once
+ * right after the [create] block completes.
  *
- * Window is needed for creating window's that still can't be created with
- * the default Compose function [androidx.compose.ui.window.Window]
+ * Window is needed for creating window's that still can't be created with the default Compose
+ * function [androidx.compose.ui.window.Window]
  *
- * @param visible Is [ComposeWindow] visible to user.
- * If `false`:
- * - internal state of [ComposeWindow] is preserved and will be restored next time the window
- * will be visible;
- * - native resources will not be released. They will be released only when [Window]
- * will leave the composition.
+ * @param visible Is [ComposeWindow] visible to user. If `false`:
+ * - internal state of [ComposeWindow] is preserved and will be restored next time the window will
+ *   be visible;
+ * - native resources will not be released. They will be released only when [Window] will leave the
+ *   composition.
+ *
  * @param onPreviewKeyEvent This callback is invoked when the user interacts with the hardware
- * keyboard. It gives ancestors of a focused component the chance to intercept a [KeyEvent].
- * Return true to stop propagation of this event. If you return false, the key event will be
- * sent to this [onPreviewKeyEvent]'s child. If none of the children consume the event,
- * it will be sent back up to the root using the onKeyEvent callback.
- * @param onKeyEvent This callback is invoked when the user interacts with the hardware
- * keyboard. While implementing this callback, return true to stop propagation of this event.
- * If you return false, the key event will be sent to this [onKeyEvent]'s parent.
+ *   keyboard. It gives ancestors of a focused component the chance to intercept a [KeyEvent].
+ *   Return true to stop propagation of this event. If you return false, the key event will be sent
+ *   to this [onPreviewKeyEvent]'s child. If none of the children consume the event, it will be sent
+ *   back up to the root using the onKeyEvent callback.
+ * @param onKeyEvent This callback is invoked when the user interacts with the hardware keyboard.
+ *   While implementing this callback, return true to stop propagation of this event. If you return
+ *   false, the key event will be sent to this [onKeyEvent]'s parent.
  * @param create The block creating the [ComposeWindow] to be composed.
- * @param dispose The block to dispose [ComposeWindow] and free native resources.
- * Usually it is simple `ComposeWindow::dispose`
+ * @param dispose The block to dispose [ComposeWindow] and free native resources. Usually it is
+ *   simple `ComposeWindow::dispose`
  * @param update The callback to be invoked after the layout is inflated.
  * @param content Composable content of the creating window.
  */
@@ -332,9 +335,7 @@
         create = {
             create().apply {
                 setContent(onPreviewKeyEvent, onKeyEvent) {
-                    CompositionLocalProvider(currentLocals) {
-                        content()
-                    }
+                    CompositionLocalProvider(currentLocals) { content() }
                 }
             }
         },
@@ -350,14 +351,10 @@
     )
 }
 
-/**
- * Receiver scope which is used by [androidx.compose.ui.window.Window].
- */
+/** Receiver scope which is used by [androidx.compose.ui.window.Window]. */
 @Stable
 interface FrameWindowScope : WindowScope {
-    /**
-     * [ComposeWindow] that was created inside [androidx.compose.ui.window.Window].
-     */
+    /** [ComposeWindow] that was created inside [androidx.compose.ui.window.Window]. */
     override val window: ComposeWindow
 }
 
diff --git a/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/window/WindowPlacement.desktop.kt b/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/window/WindowPlacement.desktop.kt
index c97ea0b..96f656f 100644
--- a/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/window/WindowPlacement.desktop.kt
+++ b/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/window/WindowPlacement.desktop.kt
@@ -16,26 +16,21 @@
 
 package androidx.compose.ui.window
 
-/**
- * Describes how the window is placed on the screen.
- */
+/** Describes how the window is placed on the screen. */
 enum class WindowPlacement {
-    /**
-     * Window don't occupy the all available space and can be moved and resized by the user.
-     */
+    /** Window don't occupy the all available space and can be moved and resized by the user. */
     Floating,
 
     /**
-     * The window is maximized and occupies all available space on the screen excluding
-     * the space that is occupied by the screen insets (taskbar/dock and top-level application menu
-     * on macOs).
+     * The window is maximized and occupies all available space on the screen excluding the space
+     * that is occupied by the screen insets (taskbar/dock and top-level application menu on macOs).
      */
     Maximized,
 
     /**
-     * The window is in fullscreen mode and occupies all available space of the screen,
-     * including the space that is occupied by the screen insets (taskbar/dock and top-level
-     * application menu on macOs).
+     * The window is in fullscreen mode and occupies all available space of the screen, including
+     * the space that is occupied by the screen insets (taskbar/dock and top-level application menu
+     * on macOs).
      */
     Fullscreen
 }
diff --git a/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/window/WindowPosition.desktop.kt b/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/window/WindowPosition.desktop.kt
index 9815703..1d10934 100644
--- a/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/window/WindowPosition.desktop.kt
+++ b/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/window/WindowPosition.desktop.kt
@@ -21,76 +21,68 @@
 import androidx.compose.ui.Alignment
 import androidx.compose.ui.unit.Dp
 
-/**
- * Constructs an [WindowPosition.Absolute] from [x] and [y] [Dp] values.
- */
+/** Constructs an [WindowPosition.Absolute] from [x] and [y] [Dp] values. */
 fun WindowPosition(x: Dp, y: Dp) = WindowPosition.Absolute(x, y)
 
-/**
- * Constructs an [WindowPosition.Aligned] from [alignment] value.
- */
+/** Constructs an [WindowPosition.Aligned] from [alignment] value. */
 fun WindowPosition(alignment: Alignment) = WindowPosition.Aligned(alignment)
 
-/**
- * Position of the window or dialog on the screen in [Dp].
- */
+/** Position of the window or dialog on the screen in [Dp]. */
 @Immutable
 sealed class WindowPosition {
-    /**
-     * The horizontal position of the window in [Dp].
-     */
-    @Stable
-    abstract val x: Dp
+    /** The horizontal position of the window in [Dp]. */
+    @Stable abstract val x: Dp
 
-    /**
-     * The vertical position of the window in [Dp].
-     */
-    @Stable
-    abstract val y: Dp
+    /** The vertical position of the window in [Dp]. */
+    @Stable abstract val y: Dp
 
     /**
      * `true` if the window position has specific coordinates on the screen
      *
      * `false` if coordinates are not yet determined (position is [PlatformDefault] or [Aligned])
      */
-    @Stable
-    abstract val isSpecified: Boolean
+    @Stable abstract val isSpecified: Boolean
 
     /**
-     * Initial position of the window that depends on the platform.
-     * Usually every new window will be positioned in a cascade mode.
+     * Initial position of the window that depends on the platform. Usually every new window will be
+     * positioned in a cascade mode.
      *
-     * This value should be used only before window will be visible.
-     * After window will be visible, it cannot change its position to the PlatformDefault
+     * This value should be used only before window will be visible. After window will be visible,
+     * it cannot change its position to the PlatformDefault
      */
     object PlatformDefault : WindowPosition() {
-        override val x: Dp get() = Dp.Unspecified
-        override val y: Dp get() = Dp.Unspecified
-        override val isSpecified: Boolean get() = false
+        override val x: Dp
+            get() = Dp.Unspecified
 
-        @Stable
-        override fun toString() = "PlatformDefault"
+        override val y: Dp
+            get() = Dp.Unspecified
+
+        override val isSpecified: Boolean
+            get() = false
+
+        @Stable override fun toString() = "PlatformDefault"
     }
 
     /**
      * Window will be aligned when it will be shown on the screen. [alignment] defines how the
-     * window will be aligned (in the center, or in some of the corners). Window
-     * will be aligned in the area that is not occupied by the screen insets (taskbar, OS menubar)
+     * window will be aligned (in the center, or in some of the corners). Window will be aligned in
+     * the area that is not occupied by the screen insets (taskbar, OS menubar)
      */
     @Immutable
     class Aligned(val alignment: Alignment) : WindowPosition() {
-        override val x: Dp get() = Dp.Unspecified
-        override val y: Dp get() = Dp.Unspecified
-        override val isSpecified: Boolean get() = false
+        override val x: Dp
+            get() = Dp.Unspecified
 
-        /**
-         * Returns a copy of this [Aligned] instance optionally overriding the
-         * [alignment].
-         */
+        override val y: Dp
+            get() = Dp.Unspecified
+
+        override val isSpecified: Boolean
+            get() = false
+
+        /** Returns a copy of this [Aligned] instance optionally overriding the [alignment]. */
         fun copy(alignment: Alignment = this.alignment) = Aligned(alignment)
 
-        @Stable
-        override fun toString() = "Aligned($alignment)"
+        @Stable override fun toString() = "Aligned($alignment)"
 
         override fun equals(other: Any?): Boolean {
             if (this === other) return true
@@ -108,27 +100,23 @@
         }
     }
 
-    /**
-     * Absolute position of the window on the current window screen
-     */
+    /** Absolute position of the window on the current window screen */
     @Immutable
     class Absolute(override val x: Dp, override val y: Dp) : WindowPosition() {
-        override val isSpecified: Boolean get() = true
+        override val isSpecified: Boolean
+            get() = true
 
-        @Stable
-        operator fun component1(): Dp = x
+        @Stable operator fun component1(): Dp = x
 
-        @Stable
-        operator fun component2(): Dp = y
+        @Stable operator fun component2(): Dp = y
 
         /**
-         * Returns a copy of this [Absolute] instance optionally overriding the
-         * [x] or [y] parameter.
+         * Returns a copy of this [Absolute] instance optionally overriding the [x] or [y]
+         * parameter.
          */
         fun copy(x: Dp = this.x, y: Dp = this.y) = Absolute(x, y)
 
-        @Stable
-        override fun toString() = "Absolute($x, $y)"
+        @Stable override fun toString() = "Absolute($x, $y)"
 
         override fun equals(other: Any?): Boolean {
             if (this === other) return true
diff --git a/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/window/WindowScope.desktop.kt b/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/window/WindowScope.desktop.kt
index 6f24730..dfdf76d 100644
--- a/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/window/WindowScope.desktop.kt
+++ b/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/window/WindowScope.desktop.kt
@@ -26,8 +26,8 @@
 @Stable
 interface WindowScope {
     /**
-     * [Window] that was created inside [androidx.compose.ui.window.Window]
-     * or [androidx.compose.ui.window.Dialog]
+     * [Window] that was created inside [androidx.compose.ui.window.Window] or
+     * [androidx.compose.ui.window.Dialog]
      */
     val window: Window
 }
diff --git a/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/window/WindowSize.desktop.kt b/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/window/WindowSize.desktop.kt
index 9e17edc..6597044 100644
--- a/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/window/WindowSize.desktop.kt
+++ b/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/window/WindowSize.desktop.kt
@@ -25,9 +25,7 @@
 import androidx.compose.ui.util.unpackFloat1
 import androidx.compose.ui.util.unpackFloat2
 
-/**
- * Constructs an [WindowSize] from [width] and [height] [Dp] values.
- */
+/** Constructs an [WindowSize] from [width] and [height] [Dp] values. */
 @Suppress("DEPRECATION")
 @Deprecated(
     "Use DpSize",
@@ -35,8 +33,8 @@
 )
 fun WindowSize(
     /**
-     * The width of the window in [Dp]. If it is [Dp.Unspecified] then the width of the window
-     * will determined by the inner content.
+     * The width of the window in [Dp]. If it is [Dp.Unspecified] then the width of the window will
+     * determined by the inner content.
      */
     width: Dp,
 
@@ -47,9 +45,7 @@
     height: Dp
 ) = WindowSize(packFloats(width.value, height.value))
 
-/**
- * Size of the window or dialog in [Dp].
- */
+/** Size of the window or dialog in [Dp]. */
 @Suppress("INLINE_CLASS_DEPRECATED", "EXPERIMENTAL_FEATURE_WARNING")
 @Immutable
 @Deprecated("Use DpSize", replaceWith = ReplaceWith("DpSize", "androidx.compose.ui.unit.DpSize"))
@@ -59,11 +55,12 @@
      *
      * `false` if the window size are not yet determined ([width] or [height] are [Dp.Unspecified])
      */
-    val isSpecified: Boolean get() = width.isSpecified && height.isSpecified
+    val isSpecified: Boolean
+        get() = width.isSpecified && height.isSpecified
 
     /**
-     * The width of the window in [Dp]. If it is [Dp.Unspecified] then the width of the window
-     * will determined by the inner content.
+     * The width of the window in [Dp]. If it is [Dp.Unspecified] then the width of the window will
+     * determined by the inner content.
      */
     @Stable
     val width: Dp
@@ -77,22 +74,17 @@
     val height: Dp
         get() = unpackFloat2(packedValue).dp
 
-    @Stable
-    operator fun component1(): Dp = width
+    @Stable operator fun component1(): Dp = width
 
-    @Stable
-    operator fun component2(): Dp = height
+    @Stable operator fun component2(): Dp = height
 
     /**
-     * Returns a copy of this [WindowSize] instance optionally overriding the
-     * [width] or [height] parameter.
+     * Returns a copy of this [WindowSize] instance optionally overriding the [width] or [height]
+     * parameter.
      */
     @Suppress("DEPRECATION")
-    fun copy(
-        width: Dp = this.width,
-        height: Dp = this.height
-    ): WindowSize = WindowSize(width, height)
+    fun copy(width: Dp = this.width, height: Dp = this.height): WindowSize =
+        WindowSize(width, height)
 
-    @Stable
-    override fun toString() = "$width x $height"
+    @Stable override fun toString() = "$width x $height"
 }
diff --git a/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/window/WindowState.desktop.kt b/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/window/WindowState.desktop.kt
index 2ef1d2d..b79a294 100644
--- a/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/window/WindowState.desktop.kt
+++ b/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/window/WindowState.desktop.kt
@@ -44,14 +44,10 @@
     isMinimized: Boolean = false,
     position: WindowPosition = WindowPosition.PlatformDefault,
     size: DpSize = DpSize(800.dp, 600.dp),
-): WindowState = rememberSaveable(saver = WindowStateImpl.Saver(position)) {
-    WindowStateImpl(
-        placement,
-        isMinimized,
-        position,
-        size
-    )
-}
+): WindowState =
+    rememberSaveable(saver = WindowStateImpl.Saver(position)) {
+        WindowStateImpl(placement, isMinimized, position, size)
+    }
 
 /**
  * Creates a [WindowState] that is remembered across compositions.
@@ -72,14 +68,10 @@
     isMinimized: Boolean = false,
     position: WindowPosition = WindowPosition.PlatformDefault,
     size: WindowSize
-): WindowState = rememberSaveable(saver = WindowStateImpl.Saver(position)) {
-    WindowStateImpl(
-        placement,
-        isMinimized,
-        position,
-        DpSize(size.width, size.height)
-    )
-}
+): WindowState =
+    rememberSaveable(saver = WindowStateImpl.Saver(position)) {
+        WindowStateImpl(placement, isMinimized, position, DpSize(size.width, size.height))
+    }
 
 /**
  * Creates a [WindowState] that is remembered across compositions.
@@ -91,7 +83,7 @@
  * @param isMinimized the initial value for [WindowState.isMinimized]
  * @param position the initial value for [WindowState.position]
  * @param width the initial value for width of [WindowState.size]
- * @param height the initial value for height of  [WindowState.size]
+ * @param height the initial value for height of [WindowState.size]
  */
 @Composable
 fun rememberWindowState(
@@ -100,14 +92,10 @@
     position: WindowPosition = WindowPosition.PlatformDefault,
     width: Dp = 800.dp,
     height: Dp = 600.dp
-): WindowState = rememberSaveable(saver = WindowStateImpl.Saver(position)) {
-    WindowStateImpl(
-        placement,
-        isMinimized,
-        position,
-        DpSize(width, height)
-    )
-}
+): WindowState =
+    rememberSaveable(saver = WindowStateImpl.Saver(position)) {
+        WindowStateImpl(placement, isMinimized, position, DpSize(width, height))
+    }
 
 /**
  * A state object that can be hoisted to control and observe window attributes
@@ -123,9 +111,7 @@
     isMinimized: Boolean = false,
     position: WindowPosition = WindowPosition.PlatformDefault,
     size: DpSize = DpSize(800.dp, 600.dp)
-): WindowState = WindowStateImpl(
-    placement, isMinimized, position, size
-)
+): WindowState = WindowStateImpl(placement, isMinimized, position, size)
 
 /**
  * A state object that can be hoisted to control and observe window attributes
@@ -143,9 +129,7 @@
     isMinimized: Boolean = false,
     position: WindowPosition = WindowPosition.PlatformDefault,
     size: WindowSize
-): WindowState = WindowStateImpl(
-    placement, isMinimized, position, DpSize(size.width, size.height)
-)
+): WindowState = WindowStateImpl(placement, isMinimized, position, DpSize(size.width, size.height))
 
 /**
  * A state object that can be hoisted to control and observe window attributes
@@ -155,7 +139,7 @@
  * @param isMinimized the initial value for [WindowState.isMinimized]
  * @param position the initial value for [WindowState.position]
  * @param width the initial value for width of [WindowState.size]
- * @param height the initial value for height of  [WindowState.size]
+ * @param height the initial value for height of [WindowState.size]
  */
 fun WindowState(
     placement: WindowPlacement = WindowPlacement.Floating,
@@ -163,23 +147,17 @@
     position: WindowPosition = WindowPosition.PlatformDefault,
     width: Dp = 800.dp,
     height: Dp = 600.dp
-): WindowState = WindowStateImpl(
-    placement, isMinimized, position, DpSize(width, height)
-)
+): WindowState = WindowStateImpl(placement, isMinimized, position, DpSize(width, height))
 
 /**
  * A state object that can be hoisted to control and observe window attributes
  * (size/position/state).
  */
 interface WindowState {
-    /**
-     * Describes how the window is placed on the screen.
-     */
+    /** Describes how the window is placed on the screen. */
     var placement: WindowPlacement
 
-    /**
-     * `true` if the window is minimized.
-     */
+    /** `true` if the window is minimized. */
     var isMinimized: Boolean
 
     /**
@@ -192,14 +170,13 @@
     /**
      * The current size of the window.
      *
-     * If the size is not specified
-     * ([DpSize.width.isSpecified] or [DpSize.height.isSpecified] is false), the size will be set
-     * to absolute values
-     * ([Dp.isSpecified] is true) when the window appears on the screen.
+     * If the size is not specified ([DpSize.width.isSpecified] or [DpSize.height.isSpecified] is
+     * false), the size will be set to absolute values ([Dp.isSpecified] is true) when the window
+     * appears on the screen.
      *
      * Unspecified can be only width, only height, or both. If, for example, window contains some
-     * text and we use size=DpSize(300.dp, Dp.Unspecified) then the width will be exactly
-     * 300.dp, but the height will be such that all the text will fit.
+     * text and we use size=DpSize(300.dp, Dp.Unspecified) then the width will be exactly 300.dp,
+     * but the height will be such that all the text will fit.
      */
     var size: DpSize
 }
@@ -216,33 +193,33 @@
     override var size by mutableStateOf(size)
 
     companion object {
-        /**
-         * The default [Saver] implementation for [WindowStateImpl].
-         */
-        fun Saver(unspecifiedPosition: WindowPosition) = listSaver<WindowState, Any>(
-            save = {
-                listOf(
-                    it.placement.ordinal,
-                    it.isMinimized,
-                    it.position.isSpecified,
-                    it.position.x.value,
-                    it.position.y.value,
-                    it.size.width.value,
-                    it.size.height.value,
-                )
-            },
-            restore = { state ->
-                WindowStateImpl(
-                    placement = WindowPlacement.values()[state[0] as Int],
-                    isMinimized = state[1] as Boolean,
-                    position = if (state[2] as Boolean) {
-                        WindowPosition((state[3] as Float).dp, (state[4] as Float).dp)
-                    } else {
-                        unspecifiedPosition
-                    },
-                    size = DpSize((state[5] as Float).dp, (state[6] as Float).dp),
-                )
-            }
-        )
+        /** The default [Saver] implementation for [WindowStateImpl]. */
+        fun Saver(unspecifiedPosition: WindowPosition) =
+            listSaver<WindowState, Any>(
+                save = {
+                    listOf(
+                        it.placement.ordinal,
+                        it.isMinimized,
+                        it.position.isSpecified,
+                        it.position.x.value,
+                        it.position.y.value,
+                        it.size.width.value,
+                        it.size.height.value,
+                    )
+                },
+                restore = { state ->
+                    WindowStateImpl(
+                        placement = WindowPlacement.values()[state[0] as Int],
+                        isMinimized = state[1] as Boolean,
+                        position =
+                            if (state[2] as Boolean) {
+                                WindowPosition((state[3] as Float).dp, (state[4] as Float).dp)
+                            } else {
+                                unspecifiedPosition
+                            },
+                        size = DpSize((state[5] as Float).dp, (state[6] as Float).dp),
+                    )
+                }
+            )
     }
 }
diff --git a/compose/ui/ui/src/desktopTest/kotlin/androidx/compose/ui/ComposeSceneTest.kt b/compose/ui/ui/src/desktopTest/kotlin/androidx/compose/ui/ComposeSceneTest.kt
index 485c67e..2225cda 100644
--- a/compose/ui/ui/src/desktopTest/kotlin/androidx/compose/ui/ComposeSceneTest.kt
+++ b/compose/ui/ui/src/desktopTest/kotlin/androidx/compose/ui/ComposeSceneTest.kt
@@ -79,464 +79,422 @@
 
 @OptIn(InternalTestApi::class, ExperimentalComposeUiApi::class)
 class ComposeSceneTest {
-    @get:Rule
-    val screenshotRule = DesktopScreenshotTestRule("compose/ui/ui-desktop")
+    @get:Rule val screenshotRule = DesktopScreenshotTestRule("compose/ui/ui-desktop")
 
-    @get:Rule
-    val composeRule = createComposeRule()
+    @get:Rule val composeRule = createComposeRule()
 
     @Test(timeout = 5000)
-    fun `rendering of Box state change`() = renderingTest(width = 40, height = 40) {
-        var size by mutableStateOf(20.dp)
-        setContent {
-            Box(Modifier.size(size).background(Color.Blue))
-        }
-        awaitNextRender()
-        screenshotRule.snap(surface, "frame1_initial_size_20")
-        assertFalse(hasRenders())
+    fun `rendering of Box state change`() =
+        renderingTest(width = 40, height = 40) {
+            var size by mutableStateOf(20.dp)
+            setContent { Box(Modifier.size(size).background(Color.Blue)) }
+            awaitNextRender()
+            screenshotRule.snap(surface, "frame1_initial_size_20")
+            assertFalse(hasRenders())
 
-        size = 10.dp
-        awaitNextRender()
-        screenshotRule.snap(surface, "frame2_change_size_to_10")
-        assertFalse(hasRenders())
+            size = 10.dp
+            awaitNextRender()
+            screenshotRule.snap(surface, "frame2_change_size_to_10")
+            assertFalse(hasRenders())
 
-        size = 5.dp
-        awaitNextRender()
-        screenshotRule.snap(surface, "frame3_change_size_to_5")
-        assertFalse(hasRenders())
+            size = 5.dp
+            awaitNextRender()
+            screenshotRule.snap(surface, "frame3_change_size_to_5")
+            assertFalse(hasRenders())
 
-        size = 10.dp
-        size = 20.dp
-        awaitNextRender()
-        screenshotRule.snap(surface, "frame4_change_size_to_10_and_20")
-        assertFalse(hasRenders())
+            size = 10.dp
+            size = 20.dp
+            awaitNextRender()
+            screenshotRule.snap(surface, "frame4_change_size_to_10_and_20")
+            assertFalse(hasRenders())
 
-        size = 20.dp
-        assertFalse(hasRenders())
-    }
-
-    @Test(timeout = 5000)
-    fun `rendering of Canvas state change`() = renderingTest(width = 40, height = 40) {
-        var x by mutableStateOf(0f)
-        var clipToBounds by mutableStateOf(false)
-        setContent {
-            val modifier = if (clipToBounds) {
-                Modifier.size(20.dp).clipToBounds()
-            } else {
-                Modifier.size(20.dp)
-            }
-            Canvas(modifier) {
-                drawRect(
-                    color = Color.Red,
-                    topLeft = Offset(x, 0f),
-                    size = Size(10f, 10f)
-                )
-            }
+            size = 20.dp
+            assertFalse(hasRenders())
         }
 
-        awaitNextRender()
-        screenshotRule.snap(surface, "frame1_initial")
-        assertFalse(hasRenders())
-
-        x = 15f
-        awaitNextRender()
-        screenshotRule.snap(surface, "frame2_translate")
-        assertFalse(hasRenders())
-
-        clipToBounds = true
-        awaitNextRender()
-        screenshotRule.snap(surface, "frame3_clipToBounds")
-        assertFalse(hasRenders())
-    }
-
     @Test(timeout = 5000)
-    fun `rendering of Layout state change`() = renderingTest(width = 40, height = 40) {
-        var width by mutableStateOf(10)
-        var height by mutableStateOf(20)
-        var x by mutableStateOf(0)
-        setContent {
-            Row(Modifier.height(height.dp)) {
-                Layout({
-                    Box(Modifier.fillMaxSize().background(Color.Green))
-                }) { measureables, constraints ->
-                    val placeables = measureables.map { it.measure(constraints) }
-                    layout(width, constraints.maxHeight) {
-                        placeables.forEach { it.place(x, 0) }
+    fun `rendering of Canvas state change`() =
+        renderingTest(width = 40, height = 40) {
+            var x by mutableStateOf(0f)
+            var clipToBounds by mutableStateOf(false)
+            setContent {
+                val modifier =
+                    if (clipToBounds) {
+                        Modifier.size(20.dp).clipToBounds()
+                    } else {
+                        Modifier.size(20.dp)
                     }
+                Canvas(modifier) {
+                    drawRect(color = Color.Red, topLeft = Offset(x, 0f), size = Size(10f, 10f))
                 }
-
-                Box(Modifier.background(Color.Red).size(10.dp))
             }
+
+            awaitNextRender()
+            screenshotRule.snap(surface, "frame1_initial")
+            assertFalse(hasRenders())
+
+            x = 15f
+            awaitNextRender()
+            screenshotRule.snap(surface, "frame2_translate")
+            assertFalse(hasRenders())
+
+            clipToBounds = true
+            awaitNextRender()
+            screenshotRule.snap(surface, "frame3_clipToBounds")
+            assertFalse(hasRenders())
         }
 
-        awaitNextRender()
-        screenshotRule.snap(surface, "frame1_initial")
-        assertFalse(hasRenders())
-
-        width = 20
-        awaitNextRender()
-        screenshotRule.snap(surface, "frame2_change_width")
-        assertFalse(hasRenders())
-
-        x = 10
-        awaitNextRender()
-        screenshotRule.snap(surface, "frame3_change_x")
-        assertFalse(hasRenders())
-
-        height = 10
-        awaitNextRender()
-        screenshotRule.snap(surface, "frame4_change_height")
-        assertFalse(hasRenders())
-
-        width = 10
-        height = 20
-        x = 0
-        awaitNextRender()
-        screenshotRule.snap(surface, "frame5_change_all")
-        assertFalse(hasRenders())
-
-        width = 10
-        height = 20
-        x = 0
-        assertFalse(hasRenders())
-    }
-
     @Test(timeout = 5000)
-    fun `rendering of layer offset`() = renderingTest(width = 40, height = 40) {
-        var translationX by mutableStateOf(10f)
-        var offsetX by mutableStateOf(10.dp)
-        setContent {
-            Box(Modifier.offset(x = offsetX).graphicsLayer(translationX = translationX)) {
-                Box(Modifier.background(Color.Green).size(10.dp))
+    fun `rendering of Layout state change`() =
+        renderingTest(width = 40, height = 40) {
+            var width by mutableStateOf(10)
+            var height by mutableStateOf(20)
+            var x by mutableStateOf(0)
+            setContent {
+                Row(Modifier.height(height.dp)) {
+                    Layout({ Box(Modifier.fillMaxSize().background(Color.Green)) }) {
+                        measureables,
+                        constraints ->
+                        val placeables = measureables.map { it.measure(constraints) }
+                        layout(width, constraints.maxHeight) {
+                            placeables.forEach { it.place(x, 0) }
+                        }
+                    }
+
+                    Box(Modifier.background(Color.Red).size(10.dp))
+                }
             }
+
+            awaitNextRender()
+            screenshotRule.snap(surface, "frame1_initial")
+            assertFalse(hasRenders())
+
+            width = 20
+            awaitNextRender()
+            screenshotRule.snap(surface, "frame2_change_width")
+            assertFalse(hasRenders())
+
+            x = 10
+            awaitNextRender()
+            screenshotRule.snap(surface, "frame3_change_x")
+            assertFalse(hasRenders())
+
+            height = 10
+            awaitNextRender()
+            screenshotRule.snap(surface, "frame4_change_height")
+            assertFalse(hasRenders())
+
+            width = 10
+            height = 20
+            x = 0
+            awaitNextRender()
+            screenshotRule.snap(surface, "frame5_change_all")
+            assertFalse(hasRenders())
+
+            width = 10
+            height = 20
+            x = 0
+            assertFalse(hasRenders())
         }
 
-        awaitNextRender()
-        screenshotRule.snap(surface, "frame1_initial")
-        assertFalse(hasRenders())
-
-        offsetX -= 10.dp
-        awaitNextRender()
-        screenshotRule.snap(surface, "frame2_offset")
-        assertFalse(hasRenders())
-
-        translationX -= 10f
-        awaitNextRender()
-        screenshotRule.snap(surface, "frame3_translation")
-        assertFalse(hasRenders())
-
-        offsetX += 10.dp
-        translationX += 10f
-        awaitNextRender()
-        screenshotRule.snap(surface, "frame4_offset_and_translation")
-        assertFalse(hasRenders())
-    }
-
     @Test(timeout = 5000)
-    fun `rendering of transition`() = renderingTest(width = 40, height = 40) {
-        val startValue = 10f
-        var targetValue by mutableStateOf(startValue)
-        var lastComposedValue = Float.MIN_VALUE
+    fun `rendering of layer offset`() =
+        renderingTest(width = 40, height = 40) {
+            var translationX by mutableStateOf(10f)
+            var offsetX by mutableStateOf(10.dp)
+            setContent {
+                Box(Modifier.offset(x = offsetX).graphicsLayer(translationX = translationX)) {
+                    Box(Modifier.background(Color.Green).size(10.dp))
+                }
+            }
 
-        setContent {
-            val value by animateFloatAsState(
-                targetValue,
-                animationSpec = TweenSpec(durationMillis = 30, easing = LinearEasing)
-            )
-            Box(Modifier.size(value.dp).background(Color.Blue))
-            lastComposedValue = value
+            awaitNextRender()
+            screenshotRule.snap(surface, "frame1_initial")
+            assertFalse(hasRenders())
+
+            offsetX -= 10.dp
+            awaitNextRender()
+            screenshotRule.snap(surface, "frame2_offset")
+            assertFalse(hasRenders())
+
+            translationX -= 10f
+            awaitNextRender()
+            screenshotRule.snap(surface, "frame3_translation")
+            assertFalse(hasRenders())
+
+            offsetX += 10.dp
+            translationX += 10f
+            awaitNextRender()
+            screenshotRule.snap(surface, "frame4_offset_and_translation")
+            assertFalse(hasRenders())
         }
 
-        awaitNextRender()
-        screenshotRule.snap(surface, "frame1_initial")
+    @Test(timeout = 5000)
+    fun `rendering of transition`() =
+        renderingTest(width = 40, height = 40) {
+            val startValue = 10f
+            var targetValue by mutableStateOf(startValue)
+            var lastComposedValue = Float.MIN_VALUE
 
-        targetValue = 40f
-        awaitNextRender()
-        screenshotRule.snap(surface, "frame2_target40_0ms")
+            setContent {
+                val value by
+                    animateFloatAsState(
+                        targetValue,
+                        animationSpec = TweenSpec(durationMillis = 30, easing = LinearEasing)
+                    )
+                Box(Modifier.size(value.dp).background(Color.Blue))
+                lastComposedValue = value
+            }
 
-        // animation can start not immediately, but on the second/third frame
-        // so wait when the animation will change the animating value
-        while (lastComposedValue == startValue) {
+            awaitNextRender()
+            screenshotRule.snap(surface, "frame1_initial")
+
+            targetValue = 40f
+            awaitNextRender()
+            screenshotRule.snap(surface, "frame2_target40_0ms")
+
+            // animation can start not immediately, but on the second/third frame
+            // so wait when the animation will change the animating value
+            while (lastComposedValue == startValue) {
+                currentTimeMillis += 10
+                awaitNextRender()
+            }
+
+            screenshotRule.snap(surface, "frame3_target40_10ms")
+
             currentTimeMillis += 10
             awaitNextRender()
+            screenshotRule.snap(surface, "frame4_target40_20ms")
+
+            currentTimeMillis += 10
+            awaitNextRender()
+            screenshotRule.snap(surface, "frame5_target40_30ms")
+
+            assertFalse(hasRenders())
         }
 
-        screenshotRule.snap(surface, "frame3_target40_10ms")
-
-        currentTimeMillis += 10
-        awaitNextRender()
-        screenshotRule.snap(surface, "frame4_target40_20ms")
-
-        currentTimeMillis += 10
-        awaitNextRender()
-        screenshotRule.snap(surface, "frame5_target40_30ms")
-
-        assertFalse(hasRenders())
-    }
-
     @Test(timeout = 5000)
     @Ignore("b/271123970 Fails in AOSP. Will be fixed after upstreaming Compose for Desktop")
-    fun `rendering of clickable`() = renderingTest(width = 40, height = 40) {
-        setContent {
-            Box(Modifier.size(20.dp).background(Color.Blue).clickable {})
+    fun `rendering of clickable`() =
+        renderingTest(width = 40, height = 40) {
+            setContent { Box(Modifier.size(20.dp).background(Color.Blue).clickable {}) }
+            awaitNextRender()
+            screenshotRule.snap(surface, "frame1_initial")
+            assertFalse(hasRenders())
+
+            scene.sendPointerEvent(PointerEventType.Press, Offset(2f, 2f))
+            awaitNextRender()
+            screenshotRule.snap(surface, "frame2_onMousePressed")
+            assertFalse(hasRenders())
+
+            scene.sendPointerEvent(PointerEventType.Move, Offset(1f, 1f))
+            assertFalse(hasRenders())
+
+            scene.sendPointerEvent(PointerEventType.Release, Offset(1f, 1f))
+            awaitNextRender()
+            screenshotRule.snap(surface, "frame3_onMouseReleased")
+
+            scene.sendPointerEvent(PointerEventType.Move, Offset(1f, 1f))
+            scene.sendPointerEvent(PointerEventType.Press, Offset(3f, 3f))
+            awaitNextRender()
+            screenshotRule.snap(surface, "frame4_onMouseMoved_onMousePressed")
+            assertFalse(hasRenders())
         }
-        awaitNextRender()
-        screenshotRule.snap(surface, "frame1_initial")
-        assertFalse(hasRenders())
-
-        scene.sendPointerEvent(PointerEventType.Press, Offset(2f, 2f))
-        awaitNextRender()
-        screenshotRule.snap(surface, "frame2_onMousePressed")
-        assertFalse(hasRenders())
-
-        scene.sendPointerEvent(PointerEventType.Move, Offset(1f, 1f))
-        assertFalse(hasRenders())
-
-        scene.sendPointerEvent(PointerEventType.Release, Offset(1f, 1f))
-        awaitNextRender()
-        screenshotRule.snap(surface, "frame3_onMouseReleased")
-
-        scene.sendPointerEvent(PointerEventType.Move, Offset(1f, 1f))
-        scene.sendPointerEvent(PointerEventType.Press, Offset(3f, 3f))
-        awaitNextRender()
-        screenshotRule.snap(surface, "frame4_onMouseMoved_onMousePressed")
-        assertFalse(hasRenders())
-    }
 
     @Test(timeout = 5000)
     @Ignore("b/271123970 Fails in AOSP. Will be fixed after upstreaming Compose for Desktop")
-    fun `rendering of LazyColumn`() = renderingTest(
-        width = 40,
-        height = 40
-    ) {
-        var itemHeight by mutableStateOf(10.dp)
-        val padding = 10
-        val columnHeight = this.height - padding * 2
-        val state = LazyListState()
-        setContent {
-            Box(Modifier.padding(padding.dp)) {
-                LazyColumn(state = state) {
-                    items(
-                        listOf(Color.Red, Color.Green, Color.Blue, Color.Black, Color.Gray)
-                    ) { color ->
-                        Box(Modifier.size(width = 30.dp, height = itemHeight).background(color))
+    fun `rendering of LazyColumn`() =
+        renderingTest(width = 40, height = 40) {
+            var itemHeight by mutableStateOf(10.dp)
+            val padding = 10
+            val columnHeight = this.height - padding * 2
+            val state = LazyListState()
+            setContent {
+                Box(Modifier.padding(padding.dp)) {
+                    LazyColumn(state = state) {
+                        items(
+                            listOf(Color.Red, Color.Green, Color.Blue, Color.Black, Color.Gray)
+                        ) { color ->
+                            Box(Modifier.size(width = 30.dp, height = itemHeight).background(color))
+                        }
                     }
                 }
             }
+
+            awaitNextRender()
+            screenshotRule.snap(surface, "frame1_initial")
+            assertFalse(hasRenders())
+
+            state.scroll { scrollBy(columnHeight.toFloat()) }
+            awaitNextRender()
+            screenshotRule.snap(surface, "frame2_onMouseScroll")
+            assertFalse(hasRenders())
+
+            state.scroll { scrollBy(10 * columnHeight.toFloat()) }
+            awaitNextRender()
+            screenshotRule.snap(surface, "frame3_onMouseScroll")
+            assertFalse(hasRenders())
+
+            itemHeight = 5.dp
+            awaitNextRender()
+            screenshotRule.snap(surface, "frame4_change_height")
+            assertFalse(hasRenders())
         }
 
-        awaitNextRender()
-        screenshotRule.snap(surface, "frame1_initial")
-        assertFalse(hasRenders())
-
-        state.scroll {
-            scrollBy(columnHeight.toFloat())
-        }
-        awaitNextRender()
-        screenshotRule.snap(surface, "frame2_onMouseScroll")
-        assertFalse(hasRenders())
-
-        state.scroll {
-            scrollBy(10 * columnHeight.toFloat())
-        }
-        awaitNextRender()
-        screenshotRule.snap(surface, "frame3_onMouseScroll")
-        assertFalse(hasRenders())
-
-        itemHeight = 5.dp
-        awaitNextRender()
-        screenshotRule.snap(surface, "frame4_change_height")
-        assertFalse(hasRenders())
-    }
-
     @Test(timeout = 5000)
-    fun `rendering, change state before first onRender`() = renderingTest(
-        width = 40,
-        height = 40
-    ) {
-        var size by mutableStateOf(20.dp)
-        setContent {
-            Box(Modifier.size(size).background(Color.Blue))
+    fun `rendering, change state before first onRender`() =
+        renderingTest(width = 40, height = 40) {
+            var size by mutableStateOf(20.dp)
+            setContent { Box(Modifier.size(size).background(Color.Blue)) }
+
+            size = 10.dp
+            awaitNextRender()
+            screenshotRule.snap(surface, "frame1_initial")
+            assertFalse(hasRenders())
         }
 
-        size = 10.dp
-        awaitNextRender()
-        screenshotRule.snap(surface, "frame1_initial")
-        assertFalse(hasRenders())
-    }
+    @Test(timeout = 5000)
+    fun `launch effect`() =
+        renderingTest(width = 40, height = 40) {
+            var effectIsLaunched = false
+
+            setContent { LaunchedEffect(Unit) { effectIsLaunched = true } }
+
+            awaitNextRender()
+            assertThat(effectIsLaunched).isTrue()
+        }
 
     @Test(timeout = 5000)
-    fun `launch effect`() = renderingTest(width = 40, height = 40) {
-        var effectIsLaunched = false
-
-        setContent {
-            LaunchedEffect(Unit) {
-                effectIsLaunched = true
+    fun `change density`() =
+        renderingTest(width = 40, height = 40) {
+            @Composable
+            fun redRect() {
+                Box(Modifier.size(4.dp).background(Color.Red))
             }
-        }
 
-        awaitNextRender()
-        assertThat(effectIsLaunched).isTrue()
-    }
-
-    @Test(timeout = 5000)
-    fun `change density`() = renderingTest(width = 40, height = 40) {
-        @Composable
-        fun redRect() {
-            Box(Modifier.size(4.dp).background(Color.Red))
-        }
-
-        @Composable
-        fun greenRectOnCanvas() {
-            Canvas(Modifier.size(100.dp)) {
-                drawRect(
-                    Color.Green,
-                    topLeft = Offset(4f * density, 4f * density),
-                    size = Size(4f * density, 4f * density)
-                )
+            @Composable
+            fun greenRectOnCanvas() {
+                Canvas(Modifier.size(100.dp)) {
+                    drawRect(
+                        Color.Green,
+                        topLeft = Offset(4f * density, 4f * density),
+                        size = Size(4f * density, 4f * density)
+                    )
+                }
             }
-        }
 
-        @Composable
-        fun blueRectInRoundedLayer() {
-            Box(
-                Modifier
-                    .offset(8.dp, 8.dp)
-                    .graphicsLayer(shape = RoundedCornerShape(2.dp), clip = true)
-            ) {
+            @Composable
+            fun blueRectInRoundedLayer() {
                 Box(
-                    Modifier
-                        .size(4.dp)
-                        .background(Color.Blue)
+                    Modifier.offset(8.dp, 8.dp)
+                        .graphicsLayer(shape = RoundedCornerShape(2.dp), clip = true)
+                ) {
+                    Box(Modifier.size(4.dp).background(Color.Blue))
+                }
+            }
+
+            @Composable
+            fun elevation() {
+                Box(Modifier.offset(8.dp, 0.dp)) {
+                    Surface(modifier = Modifier.size(4.dp), elevation = 2.dp) {}
+                }
+            }
+
+            setContent {
+                redRect()
+                greenRectOnCanvas()
+                blueRectInRoundedLayer()
+                elevation()
+            }
+
+            density = 2f
+            awaitNextRender()
+            screenshotRule.snap(surface, "frame1_density2")
+
+            density = 3f
+            awaitNextRender()
+            screenshotRule.snap(surface, "frame2_density3")
+
+            assertFalse(hasRenders())
+        }
+
+    @Test(timeout = 5000)
+    fun `receive buttons`() =
+        renderingTest(width = 40, height = 40, context = Dispatchers.Unconfined) {
+            val receivedButtons = mutableListOf<PointerButtons>()
+
+            setContent {
+                Box(
+                    Modifier.size(40.dp).onPointerEvent(PointerEventType.Press) {
+                        receivedButtons.add(it.buttons)
+                    }
                 )
             }
+
+            var buttons = PointerButtons(isSecondaryPressed = true, isBackPressed = true)
+            scene.sendPointerEvent(PointerEventType.Press, Offset(0f, 0f), buttons = buttons)
+            assertThat(receivedButtons.size).isEqualTo(1)
+            assertThat(receivedButtons.last()).isEqualTo(buttons)
+
+            buttons =
+                PointerButtons(
+                    isPrimaryPressed = true,
+                    isTertiaryPressed = true,
+                    isForwardPressed = true
+                )
+            scene.sendPointerEvent(PointerEventType.Press, Offset(0f, 0f), buttons = buttons)
+            assertThat(receivedButtons.size).isEqualTo(2)
+            assertThat(receivedButtons.last()).isEqualTo(buttons)
         }
 
-        @Composable
-        fun elevation() {
-            Box(
-                Modifier
-                    .offset(8.dp, 0.dp)
-            ) {
-                Surface(
-                    modifier = Modifier.size(4.dp),
-                    elevation = 2.dp
-                ) {
-                }
+    @Test(timeout = 5000)
+    fun `receive modifiers`() =
+        renderingTest(width = 40, height = 40, context = Dispatchers.Unconfined) {
+            val receivedKeyboardModifiers = mutableListOf<PointerKeyboardModifiers>()
+
+            setContent {
+                Box(
+                    Modifier.size(40.dp).onPointerEvent(PointerEventType.Press) {
+                        receivedKeyboardModifiers.add(it.keyboardModifiers)
+                    }
+                )
             }
-        }
 
-        setContent {
-            redRect()
-            greenRectOnCanvas()
-            blueRectInRoundedLayer()
-            elevation()
-        }
-
-        density = 2f
-        awaitNextRender()
-        screenshotRule.snap(surface, "frame1_density2")
-
-        density = 3f
-        awaitNextRender()
-        screenshotRule.snap(surface, "frame2_density3")
-
-        assertFalse(hasRenders())
-    }
-
-    @Test(timeout = 5000)
-    fun `receive buttons`() = renderingTest(
-        width = 40,
-        height = 40,
-        context = Dispatchers.Unconfined
-    ) {
-        val receivedButtons = mutableListOf<PointerButtons>()
-
-        setContent {
-            Box(
-                Modifier.size(40.dp).onPointerEvent(PointerEventType.Press) {
-                    receivedButtons.add(it.buttons)
-                }
+            var keyboardModifiers = PointerKeyboardModifiers(isAltPressed = true)
+            scene.sendPointerEvent(
+                PointerEventType.Press,
+                Offset(0f, 0f),
+                keyboardModifiers = keyboardModifiers
             )
-        }
+            assertThat(receivedKeyboardModifiers.size).isEqualTo(1)
+            assertThat(receivedKeyboardModifiers.last()).isEqualTo(keyboardModifiers)
 
-        var buttons = PointerButtons(isSecondaryPressed = true, isBackPressed = true)
-        scene.sendPointerEvent(
-            PointerEventType.Press,
-            Offset(0f, 0f),
-            buttons = buttons
-        )
-        assertThat(receivedButtons.size).isEqualTo(1)
-        assertThat(receivedButtons.last()).isEqualTo(buttons)
-
-        buttons = PointerButtons(
-            isPrimaryPressed = true,
-            isTertiaryPressed = true,
-            isForwardPressed = true
-        )
-        scene.sendPointerEvent(
-            PointerEventType.Press,
-            Offset(0f, 0f),
-            buttons = buttons
-        )
-        assertThat(receivedButtons.size).isEqualTo(2)
-        assertThat(receivedButtons.last()).isEqualTo(buttons)
-    }
-
-    @Test(timeout = 5000)
-    fun `receive modifiers`() = renderingTest(
-        width = 40,
-        height = 40,
-        context = Dispatchers.Unconfined
-    ) {
-        val receivedKeyboardModifiers = mutableListOf<PointerKeyboardModifiers>()
-
-        setContent {
-            Box(
-                Modifier.size(40.dp).onPointerEvent(PointerEventType.Press) {
-                    receivedKeyboardModifiers.add(it.keyboardModifiers)
-                }
+            keyboardModifiers =
+                PointerKeyboardModifiers(
+                    isCtrlPressed = true,
+                    isMetaPressed = true,
+                    isAltPressed = false,
+                    isShiftPressed = true,
+                    isAltGraphPressed = true,
+                    isSymPressed = true,
+                    isFunctionPressed = true,
+                    isCapsLockOn = true,
+                    isScrollLockOn = true,
+                    isNumLockOn = true,
+                )
+            scene.sendPointerEvent(
+                PointerEventType.Press,
+                Offset(0f, 0f),
+                keyboardModifiers = keyboardModifiers
             )
+            assertThat(receivedKeyboardModifiers.size).isEqualTo(2)
+            assertThat(receivedKeyboardModifiers.last()).isEqualTo(keyboardModifiers)
         }
 
-        var keyboardModifiers = PointerKeyboardModifiers(isAltPressed = true)
-        scene.sendPointerEvent(
-            PointerEventType.Press,
-            Offset(0f, 0f),
-            keyboardModifiers = keyboardModifiers
-        )
-        assertThat(receivedKeyboardModifiers.size).isEqualTo(1)
-        assertThat(receivedKeyboardModifiers.last()).isEqualTo(keyboardModifiers)
-
-        keyboardModifiers = PointerKeyboardModifiers(
-            isCtrlPressed = true,
-            isMetaPressed = true,
-            isAltPressed = false,
-            isShiftPressed = true,
-            isAltGraphPressed = true,
-            isSymPressed = true,
-            isFunctionPressed = true,
-            isCapsLockOn = true,
-            isScrollLockOn = true,
-            isNumLockOn = true,
-        )
-        scene.sendPointerEvent(
-            PointerEventType.Press,
-            Offset(0f, 0f),
-            keyboardModifiers = keyboardModifiers
-        )
-        assertThat(receivedKeyboardModifiers.size).isEqualTo(2)
-        assertThat(receivedKeyboardModifiers.last()).isEqualTo(keyboardModifiers)
-    }
-
     @Test(expected = TestException::class)
     fun `catch exception in LaunchedEffect`() {
         runBlocking(Dispatchers.Main) {
-            composeRule.setContent {
-                LaunchedEffect(Unit) {
-                    throw TestException()
-                }
-            }
+            composeRule.setContent { LaunchedEffect(Unit) { throw TestException() } }
             composeRule.awaitIdle()
         }
     }
@@ -556,23 +514,19 @@
                     text,
                     onValueChange = { text = it },
                     maxLines = 1,
-                    modifier = Modifier
-                        .onFocusChanged { field1FocusState = it }
-                        .focusRequester(focusItem1)
-                        .focusProperties {
-                            next = focusItem2
-                        }
+                    modifier =
+                        Modifier.onFocusChanged { field1FocusState = it }
+                            .focusRequester(focusItem1)
+                            .focusProperties { next = focusItem2 }
                 )
                 TextField(
                     text,
                     onValueChange = { text = it },
                     maxLines = 1,
-                    modifier = Modifier
-                        .onFocusChanged { field2FocusState = it }
-                        .focusRequester(focusItem2)
-                        .focusProperties {
-                            previous = focusItem1
-                        }
+                    modifier =
+                        Modifier.onFocusChanged { field2FocusState = it }
+                            .focusRequester(focusItem2)
+                            .focusProperties { previous = focusItem1 }
                 )
             }
         }
@@ -590,9 +544,9 @@
             assertThat(field2FocusState!!.isFocused).isTrue()
         }
 
-        composeRule.onRoot().performKeyPress(
-            keyEvent(Key.Tab, KeyEventType.KeyDown, KeyEvent.SHIFT_DOWN_MASK)
-        )
+        composeRule
+            .onRoot()
+            .performKeyPress(keyEvent(Key.Tab, KeyEventType.KeyDown, KeyEvent.SHIFT_DOWN_MASK))
 
         composeRule.runOnIdle {
             assertThat(field1FocusState!!.isFocused).isTrue()
@@ -603,14 +557,15 @@
     private fun Modifier.onPointerEvent(
         eventType: PointerEventType,
         onEvent: AwaitPointerEventScope.(event: PointerEvent) -> Unit
-    ) = pointerInput(eventType, onEvent) {
-        awaitPointerEventScope {
-            while (true) {
-                val event = awaitPointerEvent()
-                if (event.type == eventType) {
-                    onEvent(event)
+    ) =
+        pointerInput(eventType, onEvent) {
+            awaitPointerEventScope {
+                while (true) {
+                    val event = awaitPointerEvent()
+                    if (event.type == eventType) {
+                        onEvent(event)
+                    }
                 }
             }
         }
-    }
 }
diff --git a/compose/ui/ui/src/desktopTest/kotlin/androidx/compose/ui/TestUtils.kt b/compose/ui/ui/src/desktopTest/kotlin/androidx/compose/ui/TestUtils.kt
index c7b3abd..183e4da 100644
--- a/compose/ui/ui/src/desktopTest/kotlin/androidx/compose/ui/TestUtils.kt
+++ b/compose/ui/ui/src/desktopTest/kotlin/androidx/compose/ui/TestUtils.kt
@@ -52,43 +52,27 @@
 internal val isWindows = os.startsWith("win")
 internal val isMacOs = os.startsWith("mac")
 
-fun Window.sendKeyEvent(
-    code: Int,
-    modifiers: Int = 0
-): Boolean {
-    val event = KeyEvent(
-        // if we would just use `focusOwner` then it will be null if the window is minimized
-        mostRecentFocusOwner,
-        KeyEvent.KEY_PRESSED,
-        0,
-        modifiers,
-        code,
-        code.toChar(),
-        KeyEvent.KEY_LOCATION_STANDARD
-    )
+fun Window.sendKeyEvent(code: Int, modifiers: Int = 0): Boolean {
+    val event =
+        KeyEvent(
+            // if we would just use `focusOwner` then it will be null if the window is minimized
+            mostRecentFocusOwner,
+            KeyEvent.KEY_PRESSED,
+            0,
+            modifiers,
+            code,
+            code.toChar(),
+            KeyEvent.KEY_LOCATION_STANDARD
+        )
     dispatchEvent(event)
     return event.isConsumed
 }
 
-fun JFrame.sendMouseEvent(
-    id: Int,
-    x: Int,
-    y: Int,
-    modifiers: Int = 0
-): Boolean {
+fun JFrame.sendMouseEvent(id: Int, x: Int, y: Int, modifiers: Int = 0): Boolean {
     // we use width and height instead of x and y because we can send (-1, -1), but still need
     // the component inside window
     val component = findComponentAt(width / 2, height / 2)
-    val event = MouseEvent(
-        component,
-        id,
-        0,
-        modifiers,
-        x,
-        y,
-        1,
-        false
-    )
+    val event = MouseEvent(component, id, 0, modifiers, x, y, 1, false)
     component.dispatchEvent(event)
     return event.isConsumed
 }
@@ -104,19 +88,8 @@
     // we use width and height instead of x and y because we can send (-1, -1), but still need
     // the component inside window
     val component = findComponentAt(width / 2, height / 2)
-    val event = MouseWheelEvent(
-        component,
-        id,
-        0,
-        modifiers,
-        x,
-        y,
-        1,
-        false,
-        scrollType,
-        1,
-        wheelRotation
-    )
+    val event =
+        MouseWheelEvent(component, id, 0, modifiers, x, y, 1, false, scrollType, 1, wheelRotation)
     component.dispatchEvent(event)
     return event.isConsumed
 }
diff --git a/compose/ui/ui/src/desktopTest/kotlin/androidx/compose/ui/awt/ComposePanelTest.kt b/compose/ui/ui/src/desktopTest/kotlin/androidx/compose/ui/awt/ComposePanelTest.kt
index 041db79..2f07f1e 100644
--- a/compose/ui/ui/src/desktopTest/kotlin/androidx/compose/ui/awt/ComposePanelTest.kt
+++ b/compose/ui/ui/src/desktopTest/kotlin/androidx/compose/ui/awt/ComposePanelTest.kt
@@ -65,9 +65,7 @@
 
         runBlocking(Dispatchers.Swing) {
             val composePanel = ComposePanel()
-            composePanel.setContent {
-                Box(Modifier.requiredSize(300.dp, 400.dp))
-            }
+            composePanel.setContent { Box(Modifier.requiredSize(300.dp, 400.dp)) }
 
             val frame = JFrame()
             try {
@@ -96,10 +94,12 @@
         runBlocking(Dispatchers.Swing) {
             val composePanel = ComposePanel()
             composePanel.setContent {
-                Box(Modifier.fillMaxSize().layout { _, constraints ->
-                    layoutPassConstraints.add(constraints)
-                    layout(0, 0) {}
-                })
+                Box(
+                    Modifier.fillMaxSize().layout { _, constraints ->
+                        layoutPassConstraints.add(constraints)
+                        layout(0, 0) {}
+                    }
+                )
             }
 
             val frame = JFrame()
@@ -110,14 +110,15 @@
                 frame.isVisible = true
                 frame.paint(frame.graphics)
 
-                assertThat(layoutPassConstraints).isEqualTo(
-                    listOf(
-                        Constraints.fixed(
-                            width = (300 * frame.density.density).toInt(),
-                            height = (400 * frame.density.density).toInt()
+                assertThat(layoutPassConstraints)
+                    .isEqualTo(
+                        listOf(
+                            Constraints.fixed(
+                                width = (300 * frame.density.density).toInt(),
+                                height = (400 * frame.density.density).toInt()
+                            )
                         )
                     )
-                )
             } finally {
                 frame.dispose()
             }
diff --git a/compose/ui/ui/src/desktopTest/kotlin/androidx/compose/ui/awt/ComposeWindowTest.kt b/compose/ui/ui/src/desktopTest/kotlin/androidx/compose/ui/awt/ComposeWindowTest.kt
index 41a3f6b..c0a859e 100644
--- a/compose/ui/ui/src/desktopTest/kotlin/androidx/compose/ui/awt/ComposeWindowTest.kt
+++ b/compose/ui/ui/src/desktopTest/kotlin/androidx/compose/ui/awt/ComposeWindowTest.kt
@@ -52,10 +52,13 @@
         window.isUndecorated = true
         window.size = Dimension(200, 200)
         window.setContent {
-            Box(modifier = Modifier.fillMaxSize().background(Color.Blue).clickable {
-                isClickHappened = true
-                window.dispose()
-            })
+            Box(
+                modifier =
+                    Modifier.fillMaxSize().background(Color.Blue).clickable {
+                        isClickHappened = true
+                        window.dispose()
+                    }
+            )
         }
 
         window.isVisible = true
@@ -93,9 +96,7 @@
         runBlocking(Dispatchers.Swing) {
             val window = ComposeWindow()
             try {
-                window.setContent {
-                    Box(Modifier.requiredSize(300.dp, 400.dp))
-                }
+                window.setContent { Box(Modifier.requiredSize(300.dp, 400.dp)) }
                 window.isUndecorated = true
 
                 window.pack()
@@ -122,23 +123,26 @@
             try {
                 window.size = Dimension(300, 400)
                 window.setContent {
-                    Box(Modifier.fillMaxSize().layout { _, constraints ->
-                        layoutPassConstraints.add(constraints)
-                        layout(0, 0) {}
-                    })
+                    Box(
+                        Modifier.fillMaxSize().layout { _, constraints ->
+                            layoutPassConstraints.add(constraints)
+                            layout(0, 0) {}
+                        }
+                    )
                 }
 
                 window.isUndecorated = true
                 window.isVisible = true
                 window.paint(window.graphics)
-                assertThat(layoutPassConstraints).isEqualTo(
-                    listOf(
-                        Constraints.fixed(
-                            width = (300 * window.density.density).toInt(),
-                            height = (400 * window.density.density).toInt(),
+                assertThat(layoutPassConstraints)
+                    .isEqualTo(
+                        listOf(
+                            Constraints.fixed(
+                                width = (300 * window.density.density).toInt(),
+                                height = (400 * window.density.density).toInt(),
+                            )
                         )
                     )
-                )
             } finally {
                 window.dispose()
             }
@@ -151,9 +155,10 @@
         try {
             window.size = Dimension(300, 400)
             window.setContent {
-                Box(modifier = Modifier.fillMaxSize().background(Color.Blue).clickable {
-                    window.dispose()
-                })
+                Box(
+                    modifier =
+                        Modifier.fillMaxSize().background(Color.Blue).clickable { window.dispose() }
+                )
             }
             window.isVisible = true
             window.sendMouseEvent(MOUSE_ENTERED, x = 100, y = 50)
diff --git a/compose/ui/ui/src/desktopTest/kotlin/androidx/compose/ui/draw/DesktopDrawingPrebuiltGraphicsLayerTest.kt b/compose/ui/ui/src/desktopTest/kotlin/androidx/compose/ui/draw/DesktopDrawingPrebuiltGraphicsLayerTest.kt
index daeb08a..69bf820 100644
--- a/compose/ui/ui/src/desktopTest/kotlin/androidx/compose/ui/draw/DesktopDrawingPrebuiltGraphicsLayerTest.kt
+++ b/compose/ui/ui/src/desktopTest/kotlin/androidx/compose/ui/draw/DesktopDrawingPrebuiltGraphicsLayerTest.kt
@@ -57,8 +57,7 @@
 @OptIn(InternalTestApi::class)
 class DesktopDrawingPrebuiltGraphicsLayerTest {
 
-    @get:Rule
-    val rule = DesktopComposeTestRule()
+    @get:Rule val rule = DesktopComposeTestRule()
 
     private val size = 2
     private val sizeDp = with(rule.density) { size.toDp() }
@@ -71,9 +70,7 @@
     @After
     fun releaseLayer() {
         rule.runOnUiThread {
-            layer?.let {
-                context!!.releaseGraphicsLayer(it)
-            }
+            layer?.let { context!!.releaseGraphicsLayer(it) }
             layer = null
         }
     }
@@ -88,24 +85,18 @@
             }
         }
 
-        rule.runOnIdle {
-            drawPrebuiltLayer = true
-        }
+        rule.runOnIdle { drawPrebuiltLayer = true }
 
-        rule.onNodeWithTag(LayerDrawingBoxTag)
-            .captureToImage()
-            .assertPixels(expectedSize) { Color.Red }
+        rule.onNodeWithTag(LayerDrawingBoxTag).captureToImage().assertPixels(expectedSize) {
+            Color.Red
+        }
     }
 
     @Test
     fun sizeIsCorrect() {
-        rule.setContent {
-            ColoredBox()
-        }
+        rule.setContent { ColoredBox() }
 
-        rule.runOnIdle {
-            Truth.assertThat(layer!!.size).isEqualTo(IntSize(size, size))
-        }
+        rule.runOnIdle { Truth.assertThat(layer!!.size).isEqualTo(IntSize(size, size)) }
     }
 
     @Test
@@ -123,9 +114,9 @@
             layer!!.alpha = 0.5f
         }
 
-        rule.onNodeWithTag(LayerDrawingBoxTag)
-            .captureToImage()
-            .assertPixels(expectedSize) { Color.Red.copy(alpha = 0.5f).compositeOver(Color.White) }
+        rule.onNodeWithTag(LayerDrawingBoxTag).captureToImage().assertPixels(expectedSize) {
+            Color.Red.copy(alpha = 0.5f).compositeOver(Color.White)
+        }
     }
 
     @Ignore("b/329262831")
@@ -142,27 +133,21 @@
             }
         }
 
-        rule.runOnIdle {
-            drawPrebuiltLayer = true
+        rule.runOnIdle { drawPrebuiltLayer = true }
+
+        rule.onNodeWithTag(ColoredBoxTag).captureToImage().assertPixels(expectedSize) { Color.Blue }
+        rule.onNodeWithTag(LayerDrawingBoxTag).captureToImage().assertPixels(expectedSize) {
+            Color.Blue
         }
 
-        rule.onNodeWithTag(ColoredBoxTag)
-            .captureToImage()
-            .assertPixels(expectedSize) { Color.Blue }
-        rule.onNodeWithTag(LayerDrawingBoxTag)
-            .captureToImage()
-            .assertPixels(expectedSize) { Color.Blue }
+        rule.runOnUiThread { color = Color.Green }
 
-        rule.runOnUiThread {
-            color = Color.Green
+        rule.onNodeWithTag(ColoredBoxTag).captureToImage().assertPixels(expectedSize) {
+            Color.Green
         }
-
-        rule.onNodeWithTag(ColoredBoxTag)
-            .captureToImage()
-            .assertPixels(expectedSize) { Color.Green }
-        rule.onNodeWithTag(LayerDrawingBoxTag)
-            .captureToImage()
-            .assertPixels(expectedSize) { Color.Green }
+        rule.onNodeWithTag(LayerDrawingBoxTag).captureToImage().assertPixels(expectedSize) {
+            Color.Green
+        }
     }
 
     @Test
@@ -170,11 +155,7 @@
         rule.setContent {
             if (!drawPrebuiltLayer) {
                 Box(Modifier.drawIntoLayer()) {
-                    Canvas(
-                        Modifier
-                            .size(sizeDp)
-                            .drawIntoLayer(rememberGraphicsLayer())
-                    ) {
+                    Canvas(Modifier.size(sizeDp).drawIntoLayer(rememberGraphicsLayer())) {
                         drawRect(Color.Red)
                     }
                 }
@@ -183,13 +164,11 @@
             }
         }
 
-        rule.runOnIdle {
-            drawPrebuiltLayer = true
-        }
+        rule.runOnIdle { drawPrebuiltLayer = true }
 
-        rule.onNodeWithTag(LayerDrawingBoxTag)
-            .captureToImage()
-            .assertPixels(expectedSize) { Color.Red }
+        rule.onNodeWithTag(LayerDrawingBoxTag).captureToImage().assertPixels(expectedSize) {
+            Color.Red
+        }
     }
 
     @Test
@@ -197,16 +176,8 @@
         rule.setContent {
             if (!drawPrebuiltLayer) {
                 Box(Modifier.drawIntoLayer()) {
-                    Box(
-                        Modifier.drawIntoLayer(
-                            rememberGraphicsLayer()
-                        )
-                    ) {
-                        Canvas(
-                            Modifier
-                                .size(sizeDp)
-                                .drawIntoLayer(rememberGraphicsLayer())
-                        ) {
+                    Box(Modifier.drawIntoLayer(rememberGraphicsLayer())) {
+                        Canvas(Modifier.size(sizeDp).drawIntoLayer(rememberGraphicsLayer())) {
                             drawRect(Color.Red)
                         }
                     }
@@ -216,13 +187,11 @@
             }
         }
 
-        rule.runOnIdle {
-            drawPrebuiltLayer = true
-        }
+        rule.runOnIdle { drawPrebuiltLayer = true }
 
-        rule.onNodeWithTag(LayerDrawingBoxTag)
-            .captureToImage()
-            .assertPixels(expectedSize) { Color.Red }
+        rule.onNodeWithTag(LayerDrawingBoxTag).captureToImage().assertPixels(expectedSize) {
+            Color.Red
+        }
     }
 
     @Ignore("remove annotation when Modifier.graphicsLayer() will use the same layer mechanism")
@@ -231,16 +200,8 @@
         rule.setContent {
             if (!drawPrebuiltLayer) {
                 Box(Modifier.drawIntoLayer()) {
-                    Box(
-                        Modifier.graphicsLayer()
-                    ) {
-                        Canvas(
-                            Modifier
-                                .size(sizeDp)
-                                .graphicsLayer()
-                        ) {
-                            drawRect(Color.Red)
-                        }
+                    Box(Modifier.graphicsLayer()) {
+                        Canvas(Modifier.size(sizeDp).graphicsLayer()) { drawRect(Color.Red) }
                     }
                 }
             } else {
@@ -248,13 +209,11 @@
             }
         }
 
-        rule.runOnIdle {
-            drawPrebuiltLayer = true
-        }
+        rule.runOnIdle { drawPrebuiltLayer = true }
 
-        rule.onNodeWithTag(LayerDrawingBoxTag)
-            .captureToImage()
-            .assertPixels(expectedSize) { Color.Red }
+        rule.onNodeWithTag(LayerDrawingBoxTag).captureToImage().assertPixels(expectedSize) {
+            Color.Red
+        }
     }
 
     @Test
@@ -262,10 +221,12 @@
         val counter = mutableStateOf(0)
         rule.setContent {
             if (!drawPrebuiltLayer) {
-                ColoredBox(color = {
-                    counter.value
-                    Color.Red
-                })
+                ColoredBox(
+                    color = {
+                        counter.value
+                        Color.Red
+                    }
+                )
             } else {
                 LayerDrawingBox()
             }
@@ -279,9 +240,9 @@
             counter.value++
         }
 
-        rule.onNodeWithTag(LayerDrawingBoxTag)
-            .captureToImage()
-            .assertPixels(expectedSize) { Color.Red }
+        rule.onNodeWithTag(LayerDrawingBoxTag).captureToImage().assertPixels(expectedSize) {
+            Color.Red
+        }
     }
 
     @Ignore("b/329417380")
@@ -300,25 +261,16 @@
             layer!!.alpha = 1f
         }
 
-        rule.runOnIdle {
-            layer!!.alpha = 0.5f
-        }
+        rule.runOnIdle { layer!!.alpha = 0.5f }
 
-        rule.onNodeWithTag(LayerDrawingBoxTag)
-            .captureToImage()
-            .assertPixels(expectedSize) { Color.Red.copy(alpha = 0.5f).compositeOver(Color.White) }
+        rule.onNodeWithTag(LayerDrawingBoxTag).captureToImage().assertPixels(expectedSize) {
+            Color.Red.copy(alpha = 0.5f).compositeOver(Color.White)
+        }
     }
 
     @Composable
     private fun ColoredBox(modifier: Modifier = Modifier, color: () -> Color = { Color.Red }) {
-        Canvas(
-            modifier
-                .size(sizeDp)
-                .testTag(ColoredBoxTag)
-                .drawIntoLayer()
-        ) {
-            drawRect(color())
-        }
+        Canvas(modifier.size(sizeDp).testTag(ColoredBoxTag).drawIntoLayer()) { drawRect(color()) }
     }
 
     @Composable
@@ -328,28 +280,18 @@
     }
 
     @Composable
-    private fun Modifier.drawIntoLayer(
-        layer: GraphicsLayer = obtainLayer()
-    ): Modifier {
+    private fun Modifier.drawIntoLayer(layer: GraphicsLayer = obtainLayer()): Modifier {
         return drawWithContent {
-            layer.record {
-                this@drawWithContent.drawContent()
-            }
+            layer.record { this@drawWithContent.drawContent() }
             drawLayer(layer)
         }
     }
 
     @Composable
     private fun LayerDrawingBox() {
-        Canvas(
-            Modifier
-                .size(sizeDp)
-                .testTag(LayerDrawingBoxTag)
-        ) {
+        Canvas(Modifier.size(sizeDp).testTag(LayerDrawingBoxTag)) {
             drawRect(Color.White)
-            layer?.let {
-                drawLayer(it)
-            }
+            layer?.let { drawLayer(it) }
         }
     }
 
@@ -360,14 +302,15 @@
         rule.scene.render(canvas, rule.mainClock.currentTime * 1_000_000)
 
         val bounds = getBoundsInRoot()
-        val rect = with(rule.density) {
-            IRect.makeLTRB(
-                bounds.left.roundToPx(),
-                bounds.top.roundToPx(),
-                bounds.right.roundToPx(),
-                bounds.bottom.roundToPx(),
-            )
-        }
+        val rect =
+            with(rule.density) {
+                IRect.makeLTRB(
+                    bounds.left.roundToPx(),
+                    bounds.top.roundToPx(),
+                    bounds.right.roundToPx(),
+                    bounds.bottom.roundToPx(),
+                )
+            }
         return surface.makeImageSnapshot(rect)!!.toComposeImageBitmap()
     }
 }
@@ -381,9 +324,8 @@
  * A helper function to run asserts on [ImageBitmap].
  *
  * @param expectedSize The expected size of the bitmap. Leave null to skip the check.
- * @param expectedColorProvider Returns the expected color for the provided pixel position.
- * The returned color is then asserted as the expected one on the given bitmap.
- *
+ * @param expectedColorProvider Returns the expected color for the provided pixel position. The
+ *   returned color is then asserted as the expected one on the given bitmap.
  * @throws AssertionError if size or colors don't match.
  */
 fun ImageBitmap.assertPixels(
@@ -393,8 +335,7 @@
     if (expectedSize != null) {
         if (width != expectedSize.width || height != expectedSize.height) {
             throw AssertionError(
-                "Bitmap size is wrong! Expected '$expectedSize' but got " +
-                    "'$width x $height'"
+                "Bitmap size is wrong! Expected '$expectedSize' but got " + "'$width x $height'"
             )
         }
     }
@@ -411,9 +352,7 @@
     }
 }
 
-/**
- * Asserts that the color at a specific pixel in the bitmap at ([x], [y]) is [expected].
- */
+/** Asserts that the color at a specific pixel in the bitmap at ([x], [y]) is [expected]. */
 fun PixelMap.assertPixelColor(
     expected: Color,
     x: Int,
diff --git a/compose/ui/ui/src/desktopTest/kotlin/androidx/compose/ui/input/key/KeyInputUtil.kt b/compose/ui/ui/src/desktopTest/kotlin/androidx/compose/ui/input/key/KeyInputUtil.kt
index 043b142..d84a980 100644
--- a/compose/ui/ui/src/desktopTest/kotlin/androidx/compose/ui/input/key/KeyInputUtil.kt
+++ b/compose/ui/ui/src/desktopTest/kotlin/androidx/compose/ui/input/key/KeyInputUtil.kt
@@ -24,16 +24,18 @@
 import java.awt.event.KeyEvent.VK_UNDEFINED
 
 private object DummyComponent : Component()
+
 /**
- * The [KeyEvent] is usually created by the system. This function creates an instance of
- * [KeyEvent] that can be used in tests.
+ * The [KeyEvent] is usually created by the system. This function creates an instance of [KeyEvent]
+ * that can be used in tests.
  */
 fun keyEvent(key: Key, keyEventType: KeyEventType, modifiers: Int = 0): KeyEvent {
-    val action = when (keyEventType) {
-        KeyEventType.KeyDown -> KEY_PRESSED
-        KeyEventType.KeyUp -> KEY_RELEASED
-        else -> error("Unknown key event type")
-    }
+    val action =
+        when (keyEventType) {
+            KeyEventType.KeyDown -> KEY_PRESSED
+            KeyEventType.KeyUp -> KEY_RELEASED
+            else -> error("Unknown key event type")
+        }
     return KeyEvent(
         KeyEventAwt(
             DummyComponent,
@@ -47,9 +49,7 @@
     )
 }
 
-/**
- * Creates [KeyEvent] of Unknown type. It wraps KEY_TYPED AWTs KeyEvent
- */
+/** Creates [KeyEvent] of Unknown type. It wraps KEY_TYPED AWTs KeyEvent */
 fun keyTypedEvent(key: Key): KeyEvent {
     return KeyEvent(
         KeyEventAwt(
diff --git a/compose/ui/ui/src/desktopTest/kotlin/androidx/compose/ui/input/key/KeyTest.kt b/compose/ui/ui/src/desktopTest/kotlin/androidx/compose/ui/input/key/KeyTest.kt
index 93af903..0fd80c6 100644
--- a/compose/ui/ui/src/desktopTest/kotlin/androidx/compose/ui/input/key/KeyTest.kt
+++ b/compose/ui/ui/src/desktopTest/kotlin/androidx/compose/ui/input/key/KeyTest.kt
@@ -30,8 +30,7 @@
 @OptIn(ExperimentalComposeUiApi::class)
 @RunWith(JUnit4::class)
 class KeyTest {
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
     @Test
     fun desktopKey_to_composeKey() {
diff --git a/compose/ui/ui/src/desktopTest/kotlin/androidx/compose/ui/input/mouse/MouseHoverFilterTest.kt b/compose/ui/ui/src/desktopTest/kotlin/androidx/compose/ui/input/mouse/MouseHoverFilterTest.kt
index fd01823..3a983ff 100644
--- a/compose/ui/ui/src/desktopTest/kotlin/androidx/compose/ui/input/mouse/MouseHoverFilterTest.kt
+++ b/compose/ui/ui/src/desktopTest/kotlin/androidx/compose/ui/input/mouse/MouseHoverFilterTest.kt
@@ -49,45 +49,27 @@
 
         window.setContent {
             Box(
-                modifier = Modifier
-                    .pointerMove(
-                        onMove = {
-                            moveCount++
-                        },
-                        onEnter = {
-                            enterCount++
-                        },
-                        onExit = {
-                            exitCount++
-                        }
-                    )
-                    .size(10.dp, 20.dp)
+                modifier =
+                    Modifier.pointerMove(
+                            onMove = { moveCount++ },
+                            onEnter = { enterCount++ },
+                            onExit = { exitCount++ }
+                        )
+                        .size(10.dp, 20.dp)
             )
         }
-        window.onMouseEntered(
-            x = 0,
-            y = 0
-        )
-        window.onMouseMoved(
-            x = 10,
-            y = 20
-        )
+        window.onMouseEntered(x = 0, y = 0)
+        window.onMouseMoved(x = 10, y = 20)
         assertThat(enterCount).isEqualTo(1)
         assertThat(exitCount).isEqualTo(0)
         assertThat(moveCount).isEqualTo(1)
 
-        window.onMouseMoved(
-            x = 10,
-            y = 15
-        )
+        window.onMouseMoved(x = 10, y = 15)
         assertThat(enterCount).isEqualTo(1)
         assertThat(exitCount).isEqualTo(0)
         assertThat(moveCount).isEqualTo(2)
 
-        window.onMouseMoved(
-            x = 30,
-            y = 30
-        )
+        window.onMouseMoved(x = 30, y = 30)
         assertThat(enterCount).isEqualTo(1)
         assertThat(exitCount).isEqualTo(1)
         assertThat(moveCount).isEqualTo(2)
@@ -101,26 +83,17 @@
 
         window.setContent {
             Box(
-                modifier = Modifier
-                    .pointerMove(
-                        onMove = {
-                            moveCount++
-                        },
-                        onEnter = {
-                            enterCount++
-                        },
-                        onExit = {
-                            exitCount++
-                        }
-                    )
-                    .size(10.dp, 20.dp)
+                modifier =
+                    Modifier.pointerMove(
+                            onMove = { moveCount++ },
+                            onEnter = { enterCount++ },
+                            onExit = { exitCount++ }
+                        )
+                        .size(10.dp, 20.dp)
             )
         }
 
-        window.onMouseEntered(
-            x = 10,
-            y = 20
-        )
+        window.onMouseEntered(x = 10, y = 20)
         assertThat(enterCount).isEqualTo(1)
         assertThat(exitCount).isEqualTo(0)
         assertThat(moveCount).isEqualTo(0)
@@ -140,24 +113,16 @@
         val exitCounts = Array(boxCount) { 0 }
 
         window.setContent {
-            Column(
-                Modifier
-                    .size(10.dp, 20.dp)
-                    .verticalScroll(rememberScrollState())
-            ) {
+            Column(Modifier.size(10.dp, 20.dp).verticalScroll(rememberScrollState())) {
                 repeat(boxCount) { index ->
                     Box(
-                        modifier = Modifier
-                            .pointerMove(
-                                onMove = {},
-                                onEnter = {
-                                    enterCounts[index] = enterCounts[index] + 1
-                                },
-                                onExit = {
-                                    exitCounts[index] = exitCounts[index] + 1
-                                }
-                            )
-                            .size(10.dp, 20.dp)
+                        modifier =
+                            Modifier.pointerMove(
+                                    onMove = {},
+                                    onEnter = { enterCounts[index] = enterCounts[index] + 1 },
+                                    onExit = { exitCounts[index] = exitCounts[index] + 1 }
+                                )
+                                .size(10.dp, 20.dp)
                     )
                 }
             }
@@ -193,15 +158,16 @@
     onMove: () -> Unit,
     onExit: () -> Unit,
     onEnter: () -> Unit,
-): Modifier = pointerInput(onMove, onExit, onEnter) {
-    awaitPointerEventScope {
-        while (true) {
-            val event = awaitPointerEvent()
-            when (event.type) {
-                PointerEventType.Move -> onMove()
-                PointerEventType.Enter -> onEnter()
-                PointerEventType.Exit -> onExit()
+): Modifier =
+    pointerInput(onMove, onExit, onEnter) {
+        awaitPointerEventScope {
+            while (true) {
+                val event = awaitPointerEvent()
+                when (event.type) {
+                    PointerEventType.Move -> onMove()
+                    PointerEventType.Enter -> onEnter()
+                    PointerEventType.Exit -> onExit()
+                }
             }
         }
     }
-}
diff --git a/compose/ui/ui/src/desktopTest/kotlin/androidx/compose/ui/input/mouse/MouseScrollFilterTest.kt b/compose/ui/ui/src/desktopTest/kotlin/androidx/compose/ui/input/mouse/MouseScrollFilterTest.kt
index 0bb7091..a05769b 100644
--- a/compose/ui/ui/src/desktopTest/kotlin/androidx/compose/ui/input/mouse/MouseScrollFilterTest.kt
+++ b/compose/ui/ui/src/desktopTest/kotlin/androidx/compose/ui/input/mouse/MouseScrollFilterTest.kt
@@ -34,7 +34,8 @@
 
 @OptIn(ExperimentalComposeUiApi::class)
 @RunWith(JUnit4::class)
-@Ignore // TODO(b/217238066) remove after migration to ImageComposeScene (it will be upstreamed from Compose MPP 1.0.0)
+@Ignore // TODO(b/217238066) remove after migration to ImageComposeScene (it will be upstreamed from
+// Compose MPP 1.0.0)
 class MouseScrollFilterTest {
     private val window = TestComposeWindow(width = 100, height = 100, density = Density(2f))
 
@@ -45,8 +46,7 @@
 
         window.setContent {
             Box(
-                Modifier
-                    .mouseScrollFilter { event, bounds ->
+                Modifier.mouseScrollFilter { event, bounds ->
                         actualEvent = event
                         actualBounds = bounds
                         true
@@ -73,8 +73,7 @@
 
         window.setContent {
             Box(
-                Modifier
-                    .mouseScrollFilter { event, bounds ->
+                Modifier.mouseScrollFilter { event, bounds ->
                         actualEvent = event
                         actualBounds = bounds
                         true
@@ -102,8 +101,7 @@
 
         window.setContent {
             Box(
-                Modifier
-                    .mouseScrollFilter { event, bounds ->
+                Modifier.mouseScrollFilter { event, bounds ->
                         actualEvent1 = event
                         actualBounds1 = bounds
                         true
@@ -111,8 +109,7 @@
                     .size(10.dp, 20.dp)
             )
             Box(
-                Modifier
-                    .mouseScrollFilter { event, bounds ->
+                Modifier.mouseScrollFilter { event, bounds ->
                         actualEvent2 = event
                         actualBounds2 = bounds
                         true
@@ -141,21 +138,14 @@
 
         window.setContent {
             Box(
-                Modifier
-                    .mouseScrollFilter { event, bounds ->
+                Modifier.mouseScrollFilter { event, bounds ->
                         actualEvent = event
                         actualBounds = bounds
                         true
                     }
                     .size(10.dp, 20.dp)
             )
-            Box(
-                Modifier
-                    .mouseScrollFilter { _, _ ->
-                        false
-                    }
-                    .size(5.dp, 10.dp)
-            )
+            Box(Modifier.mouseScrollFilter { _, _ -> false }.size(5.dp, 10.dp))
         }
 
         window.onMouseScroll(
@@ -175,18 +165,14 @@
 
         window.setContent {
             Box(
-                Modifier
-                    .mouseScrollFilter { event, bounds ->
+                Modifier.mouseScrollFilter { event, bounds ->
                         actualEvent = event
                         actualBounds = bounds
                         true
                     }
                     .size(10.dp, 20.dp)
             )
-            Box(
-                Modifier
-                    .size(5.dp, 10.dp)
-            )
+            Box(Modifier.size(5.dp, 10.dp))
         }
 
         window.onMouseScroll(
@@ -209,8 +195,7 @@
 
         window.setContent {
             Box(
-                Modifier
-                    .mouseScrollFilter { event, bounds ->
+                Modifier.mouseScrollFilter { event, bounds ->
                         actualEvent1 = event
                         actualBounds1 = bounds
                         true
@@ -218,8 +203,7 @@
                     .size(10.dp, 20.dp)
             ) {
                 Box(
-                    Modifier
-                        .mouseScrollFilter { event, bounds ->
+                    Modifier.mouseScrollFilter { event, bounds ->
                             actualEvent2 = event
                             actualBounds2 = bounds
                             true
@@ -249,21 +233,14 @@
 
         window.setContent {
             Box(
-                Modifier
-                    .mouseScrollFilter { event, bounds ->
+                Modifier.mouseScrollFilter { event, bounds ->
                         actualEvent = event
                         actualBounds = bounds
                         true
                     }
                     .size(10.dp, 20.dp)
             ) {
-                Box(
-                    Modifier
-                        .mouseScrollFilter { _, _ ->
-                            false
-                        }
-                        .size(5.dp, 10.dp)
-                )
+                Box(Modifier.mouseScrollFilter { _, _ -> false }.size(5.dp, 10.dp))
             }
         }
 
@@ -285,18 +262,14 @@
 
         window.setContent {
             Box(
-                Modifier
-                    .mouseScrollFilter { event, bounds ->
+                Modifier.mouseScrollFilter { event, bounds ->
                         actualEvent = event
                         actualBounds = bounds
                         true
                     }
                     .size(10.dp, 20.dp)
             ) {
-                Box(
-                    Modifier
-                        .size(5.dp, 10.dp)
-                )
+                Box(Modifier.size(5.dp, 10.dp))
             }
         }
 
diff --git a/compose/ui/ui/src/desktopTest/kotlin/androidx/compose/ui/input/pointer/PointerIconTest.kt b/compose/ui/ui/src/desktopTest/kotlin/androidx/compose/ui/input/pointer/PointerIconTest.kt
index cff629c..0390347 100644
--- a/compose/ui/ui/src/desktopTest/kotlin/androidx/compose/ui/input/pointer/PointerIconTest.kt
+++ b/compose/ui/ui/src/desktopTest/kotlin/androidx/compose/ui/input/pointer/PointerIconTest.kt
@@ -34,154 +34,91 @@
 class PointerIconTest {
     private val window = TestComposeWindow(width = 100, height = 100, density = Density(1f))
 
-    private val iconService = object : PointerIconService {
-        private var currentIcon: PointerIcon = PointerIcon.Default
-        override fun getIcon(): PointerIcon {
-            return currentIcon
-        }
+    private val iconService =
+        object : PointerIconService {
+            private var currentIcon: PointerIcon = PointerIcon.Default
 
-        override fun setIcon(value: PointerIcon?) {
-            currentIcon = value ?: PointerIcon.Default
+            override fun getIcon(): PointerIcon {
+                return currentIcon
+            }
+
+            override fun setIcon(value: PointerIcon?) {
+                currentIcon = value ?: PointerIcon.Default
+            }
         }
-    }
 
     @Test
     fun basicTest() {
         window.setContent {
-            CompositionLocalProvider(
-                LocalPointerIconService provides iconService
-            ) {
-                Box(
-                    modifier = Modifier
-                        .size(30.dp, 30.dp)
-                ) {
-                    Box(
-                        modifier = Modifier
-                            .pointerHoverIcon(PointerIcon.Text)
-                            .size(10.dp, 10.dp)
-                    )
+            CompositionLocalProvider(LocalPointerIconService provides iconService) {
+                Box(modifier = Modifier.size(30.dp, 30.dp)) {
+                    Box(modifier = Modifier.pointerHoverIcon(PointerIcon.Text).size(10.dp, 10.dp))
                 }
             }
         }
 
-        window.onMouseMoved(
-            x = 5,
-            y = 5
-        )
+        window.onMouseMoved(x = 5, y = 5)
         assertThat(iconService.getIcon()).isEqualTo(PointerIcon.Text)
     }
 
     @Test
     fun commitsToComponent() {
         window.setContent {
-            Box(
-                modifier = Modifier
-                    .size(30.dp, 30.dp)
-            ) {
-                Box(
-                    modifier = Modifier
-                        .pointerHoverIcon(PointerIcon.Text)
-                        .size(10.dp, 10.dp)
-                )
+            Box(modifier = Modifier.size(30.dp, 30.dp)) {
+                Box(modifier = Modifier.pointerHoverIcon(PointerIcon.Text).size(10.dp, 10.dp))
             }
         }
 
-        window.onMouseMoved(
-            x = 5,
-            y = 5
-        )
+        window.onMouseMoved(x = 5, y = 5)
         assertThat(window.currentCursor.type).isEqualTo(Cursor.TEXT_CURSOR)
     }
 
     @Test
     fun preservedIfSameEventDispatchedTwice() {
         window.setContent {
-            Box(
-                modifier = Modifier
-                    .size(30.dp, 30.dp)
-            ) {
-                Box(
-                    modifier = Modifier
-                        .pointerHoverIcon(PointerIcon.Text)
-                        .size(10.dp, 10.dp)
-                )
+            Box(modifier = Modifier.size(30.dp, 30.dp)) {
+                Box(modifier = Modifier.pointerHoverIcon(PointerIcon.Text).size(10.dp, 10.dp))
             }
         }
 
-        window.onMouseMoved(
-            x = 5,
-            y = 5
-        )
-        window.onMouseMoved(
-            x = 5,
-            y = 5
-        )
+        window.onMouseMoved(x = 5, y = 5)
+        window.onMouseMoved(x = 5, y = 5)
         assertThat(window.currentCursor.type).isEqualTo(Cursor.TEXT_CURSOR)
     }
 
     @Test
     fun parentWins() {
         window.setContent {
-            CompositionLocalProvider(
-                LocalPointerIconService provides iconService
-            ) {
+            CompositionLocalProvider(LocalPointerIconService provides iconService) {
                 Box(
-                    modifier = Modifier
-                        .pointerHoverIcon(PointerIcon.Hand, true)
-                        .size(30.dp, 30.dp)
+                    modifier = Modifier.pointerHoverIcon(PointerIcon.Hand, true).size(30.dp, 30.dp)
                 ) {
-                    Box(
-                        modifier = Modifier
-                            .pointerHoverIcon(PointerIcon.Text)
-                            .size(10.dp, 10.dp)
-                    )
+                    Box(modifier = Modifier.pointerHoverIcon(PointerIcon.Text).size(10.dp, 10.dp))
                 }
             }
         }
 
-        window.onMouseMoved(
-            x = 5,
-            y = 5
-        )
+        window.onMouseMoved(x = 5, y = 5)
         assertThat(iconService.getIcon()).isEqualTo(PointerIcon.Hand)
 
-        window.onMouseMoved(
-            x = 15,
-            y = 15
-        )
+        window.onMouseMoved(x = 15, y = 15)
         assertThat(iconService.getIcon()).isEqualTo(PointerIcon.Hand)
     }
 
     @Test
     fun childWins() {
         window.setContent {
-            CompositionLocalProvider(
-                LocalPointerIconService provides iconService
-            ) {
-                Box(
-                    modifier = Modifier
-                        .pointerHoverIcon(PointerIcon.Hand)
-                        .size(30.dp, 30.dp)
-                ) {
-                    Box(
-                        modifier = Modifier
-                            .pointerHoverIcon(PointerIcon.Text)
-                            .size(10.dp, 10.dp)
-                    )
+            CompositionLocalProvider(LocalPointerIconService provides iconService) {
+                Box(modifier = Modifier.pointerHoverIcon(PointerIcon.Hand).size(30.dp, 30.dp)) {
+                    Box(modifier = Modifier.pointerHoverIcon(PointerIcon.Text).size(10.dp, 10.dp))
                 }
             }
         }
 
-        window.onMouseMoved(
-            x = 5,
-            y = 5
-        )
+        window.onMouseMoved(x = 5, y = 5)
         assertThat(iconService.getIcon()).isEqualTo(PointerIcon.Text)
 
-        window.onMouseMoved(
-            x = 15,
-            y = 15
-        )
+        window.onMouseMoved(x = 15, y = 15)
         assertThat(iconService.getIcon()).isEqualTo(PointerIcon.Hand)
     }
 }
diff --git a/compose/ui/ui/src/desktopTest/kotlin/androidx/compose/ui/platform/AccessibilityTest.kt b/compose/ui/ui/src/desktopTest/kotlin/androidx/compose/ui/platform/AccessibilityTest.kt
index c8ea15d..655fa48 100644
--- a/compose/ui/ui/src/desktopTest/kotlin/androidx/compose/ui/platform/AccessibilityTest.kt
+++ b/compose/ui/ui/src/desktopTest/kotlin/androidx/compose/ui/platform/AccessibilityTest.kt
@@ -30,14 +30,11 @@
 @RunWith(JUnit4::class)
 class AccessibilityTest {
 
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
     @Test
     fun accessibleText() {
-        rule.setContent {
-            Text("Hello world. Hi world.", modifier = Modifier.testTag("text"))
-        }
+        rule.setContent { Text("Hello world. Hi world.", modifier = Modifier.testTag("text")) }
 
         val node = rule.onNodeWithTag("text").fetchSemanticsNode()
         val accessibleNode = ComposeAccessible(node)
diff --git a/compose/ui/ui/src/desktopTest/kotlin/androidx/compose/ui/platform/DesktopInputComponentTest.kt b/compose/ui/ui/src/desktopTest/kotlin/androidx/compose/ui/platform/DesktopInputComponentTest.kt
index 96c62da..f238d23 100644
--- a/compose/ui/ui/src/desktopTest/kotlin/androidx/compose/ui/platform/DesktopInputComponentTest.kt
+++ b/compose/ui/ui/src/desktopTest/kotlin/androidx/compose/ui/platform/DesktopInputComponentTest.kt
@@ -46,12 +46,8 @@
         val input = PlatformInput(DummyPlatformComponent)
         val inputService = TextInputService(input)
 
-        val session = inputService.startInput(
-            TextFieldValue(),
-            ImeOptions.Default,
-            processor::apply,
-            {}
-        )
+        val session =
+            inputService.startInput(TextFieldValue(), ImeOptions.Default, processor::apply, {})
 
         processor.reset(TextFieldValue("h"), session)
 
@@ -83,12 +79,8 @@
         val input = PlatformInput(component)
         val inputService = TextInputService(input)
 
-        val session = inputService.startInput(
-            TextFieldValue(),
-            ImeOptions.Default,
-            processor::apply,
-            {}
-        )
+        val session =
+            inputService.startInput(TextFieldValue(), ImeOptions.Default, processor::apply, {})
 
         input.charKeyPressed = true
         processor.reset(TextFieldValue("a", selection = TextRange(1)), session)
diff --git a/compose/ui/ui/src/desktopTest/kotlin/androidx/compose/ui/platform/DesktopTextInputSessionTest.kt b/compose/ui/ui/src/desktopTest/kotlin/androidx/compose/ui/platform/DesktopTextInputSessionTest.kt
index 15808b9..9d14d77 100644
--- a/compose/ui/ui/src/desktopTest/kotlin/androidx/compose/ui/platform/DesktopTextInputSessionTest.kt
+++ b/compose/ui/ui/src/desktopTest/kotlin/androidx/compose/ui/platform/DesktopTextInputSessionTest.kt
@@ -45,16 +45,15 @@
     fun startInputMethod_setsAndClearsRequestsAndListeners() = runTest {
         val inputComponent = TestInputComponent()
         val component = Frame()
-        val session = DesktopTextInputSession(
-            coroutineScope = this,
-            inputComponent = inputComponent,
-            component = component
-        )
+        val session =
+            DesktopTextInputSession(
+                coroutineScope = this,
+                inputComponent = inputComponent,
+                component = component
+            )
         val request = TestInputMethodRequest()
 
-        val sessionJob = launch {
-            session.startInputMethod(request)
-        }
+        val sessionJob = launch { session.startInputMethod(request) }
         advanceUntilIdle()
 
         assertThat(inputComponent.inputMethodRequests).isSameInstanceAs(request)
@@ -85,15 +84,17 @@
 
         override val locationOnScreen: Point
             get() = throw AssertionError("not supported")
+
         override val density: Density
             get() = throw AssertionError("not supported")
     }
 
-    private class TestInputMethodRequest : PlatformTextInputMethodRequest, InputMethodListener,
-        InputMethodRequests {
+    private class TestInputMethodRequest :
+        PlatformTextInputMethodRequest, InputMethodListener, InputMethodRequests {
 
         override val inputMethodListener: InputMethodListener
             get() = this
+
         override val inputMethodRequests: InputMethodRequests
             get() = this
 
diff --git a/compose/ui/ui/src/desktopTest/kotlin/androidx/compose/ui/platform/FlushCoroutineDispatcherTest.kt b/compose/ui/ui/src/desktopTest/kotlin/androidx/compose/ui/platform/FlushCoroutineDispatcherTest.kt
index f4d29ff..abfc35a 100644
--- a/compose/ui/ui/src/desktopTest/kotlin/androidx/compose/ui/platform/FlushCoroutineDispatcherTest.kt
+++ b/compose/ui/ui/src/desktopTest/kotlin/androidx/compose/ui/platform/FlushCoroutineDispatcherTest.kt
@@ -86,14 +86,13 @@
         runBlocking(Dispatchers.Default) {
             dispatcher = FlushCoroutineDispatcher(this)
 
-            val addJob = launch(dispatcher) {
-                repeat(10000) {
-                    actualNumbers.add(it)
-                    repeat(random.nextInt(5)) {
-                        yield()
+            val addJob =
+                launch(dispatcher) {
+                    repeat(10000) {
+                        actualNumbers.add(it)
+                        repeat(random.nextInt(5)) { yield() }
                     }
                 }
-            }
 
             launch {
                 while (addJob.isActive) {
diff --git a/compose/ui/ui/src/desktopTest/kotlin/androidx/compose/ui/platform/GraphicsLayerTest.kt b/compose/ui/ui/src/desktopTest/kotlin/androidx/compose/ui/platform/GraphicsLayerTest.kt
index 6c0688e..874703d 100644
--- a/compose/ui/ui/src/desktopTest/kotlin/androidx/compose/ui/platform/GraphicsLayerTest.kt
+++ b/compose/ui/ui/src/desktopTest/kotlin/androidx/compose/ui/platform/GraphicsLayerTest.kt
@@ -36,31 +36,30 @@
 @RunWith(JUnit4::class)
 @OptIn(InternalTestApi::class)
 class GraphicsLayerTest {
-    @get:Rule
-    val screenshotRule = DesktopScreenshotTestRule("compose/ui/ui-desktop/platform")
+    @get:Rule val screenshotRule = DesktopScreenshotTestRule("compose/ui/ui-desktop/platform")
 
     @Test
     fun scale() {
         val window = TestComposeWindow(width = 40, height = 40)
         window.setContent {
             Box(
-                Modifier
-                    .graphicsLayer(
+                Modifier.graphicsLayer(
                         scaleX = 2f,
                         scaleY = 0.5f,
                         transformOrigin = TransformOrigin(0f, 0f)
                     )
-                    .requiredSize(10f.dp, 10f.dp).background(Color.Red)
+                    .requiredSize(10f.dp, 10f.dp)
+                    .background(Color.Red)
             )
             Box(
-                Modifier
-                    .graphicsLayer(
+                Modifier.graphicsLayer(
                         translationX = 10f,
                         translationY = 20f,
                         scaleX = 2f,
                         scaleY = 0.5f
                     )
-                    .requiredSize(10f.dp, 10f.dp).background(Color.Blue)
+                    .requiredSize(10f.dp, 10f.dp)
+                    .background(Color.Blue)
             )
         }
         screenshotRule.snap(window.surface)
@@ -71,24 +70,20 @@
         val window = TestComposeWindow(width = 40, height = 40)
         window.setContent {
             Box(
-                Modifier
-                    .graphicsLayer(
+                Modifier.graphicsLayer(
                         translationX = 10f,
                         rotationZ = 90f,
                         scaleX = 2f,
                         scaleY = 0.5f,
                         transformOrigin = TransformOrigin(0f, 0f)
                     )
-                    .requiredSize(10f.dp, 10f.dp).background(Color.Red)
+                    .requiredSize(10f.dp, 10f.dp)
+                    .background(Color.Red)
             )
             Box(
-                Modifier
-                    .graphicsLayer(
-                        translationX = 10f,
-                        translationY = 20f,
-                        rotationZ = 45f
-                    )
-                    .requiredSize(10f.dp, 10f.dp).background(Color.Blue)
+                Modifier.graphicsLayer(translationX = 10f, translationY = 20f, rotationZ = 45f)
+                    .requiredSize(10f.dp, 10f.dp)
+                    .background(Color.Blue)
             )
         }
         screenshotRule.snap(window.surface)
@@ -100,18 +95,18 @@
 
         window.setContent {
             Box(
-                Modifier
-                    .graphicsLayer(rotationX = 45f)
-                    .requiredSize(10f.dp, 10f.dp).background(Color.Blue)
+                Modifier.graphicsLayer(rotationX = 45f)
+                    .requiredSize(10f.dp, 10f.dp)
+                    .background(Color.Blue)
             )
             Box(
-                Modifier
-                    .graphicsLayer(
+                Modifier.graphicsLayer(
                         translationX = 20f,
                         transformOrigin = TransformOrigin(0f, 0f),
                         rotationX = 45f
                     )
-                    .requiredSize(10f.dp, 10f.dp).background(Color.Blue)
+                    .requiredSize(10f.dp, 10f.dp)
+                    .background(Color.Blue)
             )
         }
         screenshotRule.snap(window.surface)
@@ -122,18 +117,18 @@
         val window = TestComposeWindow(width = 40, height = 40)
         window.setContent {
             Box(
-                Modifier
-                    .graphicsLayer(rotationY = 45f)
-                    .requiredSize(10f.dp, 10f.dp).background(Color.Blue)
+                Modifier.graphicsLayer(rotationY = 45f)
+                    .requiredSize(10f.dp, 10f.dp)
+                    .background(Color.Blue)
             )
             Box(
-                Modifier
-                    .graphicsLayer(
+                Modifier.graphicsLayer(
                         translationX = 20f,
                         transformOrigin = TransformOrigin(0f, 0f),
                         rotationY = 45f
                     )
-                    .requiredSize(10f.dp, 10f.dp).background(Color.Blue)
+                    .requiredSize(10f.dp, 10f.dp)
+                    .background(Color.Blue)
             )
         }
         screenshotRule.snap(window.surface)
@@ -144,14 +139,14 @@
         val window = TestComposeWindow(width = 40, height = 40)
         window.setContent {
             Box(
-                Modifier
-                    .graphicsLayer(rotationZ = 45f, translationX = 10f)
-                    .requiredSize(20f.dp, 20f.dp).background(Color.Green)
+                Modifier.graphicsLayer(rotationZ = 45f, translationX = 10f)
+                    .requiredSize(20f.dp, 20f.dp)
+                    .background(Color.Green)
             ) {
                 Box(
-                    Modifier
-                        .graphicsLayer(rotationZ = 45f)
-                        .requiredSize(20f.dp, 20f.dp).background(Color.Blue)
+                    Modifier.graphicsLayer(rotationZ = 45f)
+                        .requiredSize(20f.dp, 20f.dp)
+                        .background(Color.Blue)
                 )
             }
         }
@@ -163,64 +158,52 @@
         val window = TestComposeWindow(width = 40, height = 40)
         window.setContent {
             Box(
-                Modifier
-                    .graphicsLayer(
+                Modifier.graphicsLayer(
                         translationX = 10f,
                         translationY = 10f,
                         transformOrigin = TransformOrigin(0f, 0f),
                         clip = false
                     )
-                    .requiredSize(10f.dp, 10f.dp).background(Color.Red)
+                    .requiredSize(10f.dp, 10f.dp)
+                    .background(Color.Red)
             ) {
                 Box(
-                    Modifier
-                        .graphicsLayer(
-                            transformOrigin = TransformOrigin(0f, 0f),
-                            clip = false
-                        )
+                    Modifier.graphicsLayer(transformOrigin = TransformOrigin(0f, 0f), clip = false)
                         .requiredSize(20f.dp, 2f.dp)
                         .background(Color.Blue)
                 )
             }
 
             Box(
-                Modifier
-                    .graphicsLayer(
+                Modifier.graphicsLayer(
                         translationX = 10f,
                         translationY = 30f,
                         transformOrigin = TransformOrigin(0f, 0f),
                         clip = true
                     )
-                    .requiredSize(10f.dp, 10f.dp).background(Color.Red)
+                    .requiredSize(10f.dp, 10f.dp)
+                    .background(Color.Red)
             ) {
                 Box(
-                    Modifier
-                        .graphicsLayer(
-                            transformOrigin = TransformOrigin(0f, 0f),
-                            clip = false
-                        )
+                    Modifier.graphicsLayer(transformOrigin = TransformOrigin(0f, 0f), clip = false)
                         .requiredSize(20f.dp, 2f.dp)
                         .background(Color.Blue)
                 )
             }
 
             Box(
-                Modifier
-                    .graphicsLayer(
+                Modifier.graphicsLayer(
                         translationX = 30f,
                         translationY = 10f,
                         transformOrigin = TransformOrigin(0f, 0f),
                         clip = true,
                         shape = RoundedCornerShape(5.dp)
                     )
-                    .requiredSize(10f.dp, 10f.dp).background(Color.Red)
+                    .requiredSize(10f.dp, 10f.dp)
+                    .background(Color.Red)
             ) {
                 Box(
-                    Modifier
-                        .graphicsLayer(
-                            transformOrigin = TransformOrigin(0f, 0f),
-                            clip = false
-                        )
+                    Modifier.graphicsLayer(transformOrigin = TransformOrigin(0f, 0f), clip = false)
                         .requiredSize(20f.dp, 2f.dp)
                         .background(Color.Blue)
                 )
@@ -234,8 +217,7 @@
         val window = TestComposeWindow(width = 40, height = 40)
         window.setContent {
             Box(
-                Modifier
-                    .padding(start = 5.dp)
+                Modifier.padding(start = 5.dp)
                     .graphicsLayer(
                         translationX = -5f,
                         translationY = 5f,
@@ -247,33 +229,24 @@
             ) {
                 // This box will be clipped (because if we use alpha, we draw into
                 // intermediate buffer)
-                Box(
-                    Modifier
-                        .requiredSize(30f.dp, 30f.dp)
-                        .background(Color.Blue)
-                )
+                Box(Modifier.requiredSize(30f.dp, 30f.dp).background(Color.Blue))
             }
 
             Box(
-                Modifier
-                    .padding(start = 15.dp)
+                Modifier.padding(start = 15.dp)
                     .graphicsLayer(alpha = 0.5f)
                     .requiredSize(15f.dp, 15f.dp)
                     .background(Color.Red)
             ) {
                 Box(
-                    Modifier
-                        .graphicsLayer(alpha = 0.5f)
+                    Modifier.graphicsLayer(alpha = 0.5f)
                         .requiredSize(10f.dp, 10f.dp)
                         .background(Color.Blue)
                 )
             }
 
             Box(
-                Modifier
-                    .graphicsLayer(
-                        alpha = 0f
-                    )
+                Modifier.graphicsLayer(alpha = 0f)
                     .requiredSize(10f.dp, 10f.dp)
                     .background(Color.Blue)
             )
@@ -285,36 +258,21 @@
     fun elevation() {
         val window = TestComposeWindow(width = 40, height = 40)
         window.setContent {
+            Box(Modifier.graphicsLayer(shadowElevation = 5f).requiredSize(20f.dp, 20f.dp))
             Box(
-                Modifier
-                    .graphicsLayer(shadowElevation = 5f)
-                    .requiredSize(20f.dp, 20f.dp)
-            )
-            Box(
-                Modifier
-                    .graphicsLayer(translationX = 20f, shadowElevation = 5f)
+                Modifier.graphicsLayer(translationX = 20f, shadowElevation = 5f)
                     .requiredSize(20f.dp, 20f.dp)
             ) {
-                Box(
-                    Modifier
-                        .requiredSize(20f.dp, 20f.dp)
-                        .background(Color.Blue)
-                )
+                Box(Modifier.requiredSize(20f.dp, 20f.dp).background(Color.Blue))
             }
             Box(
-                Modifier
-                    .graphicsLayer(translationY = 20f, alpha = 0.8f, shadowElevation = 5f)
+                Modifier.graphicsLayer(translationY = 20f, alpha = 0.8f, shadowElevation = 5f)
                     .requiredSize(20f.dp, 20f.dp)
             ) {
-                Box(
-                    Modifier
-                        .requiredSize(20f.dp, 20f.dp)
-                        .background(Color.Red)
-                )
+                Box(Modifier.requiredSize(20f.dp, 20f.dp).background(Color.Red))
             }
             Box(
-                Modifier
-                    .graphicsLayer(
+                Modifier.graphicsLayer(
                         translationX = 20f,
                         translationY = 20f,
                         shadowElevation = 5f,
diff --git a/compose/ui/ui/src/desktopTest/kotlin/androidx/compose/ui/platform/RenderingTestScope.kt b/compose/ui/ui/src/desktopTest/kotlin/androidx/compose/ui/platform/RenderingTestScope.kt
index 4de7ff75..a705836 100644
--- a/compose/ui/ui/src/desktopTest/kotlin/androidx/compose/ui/platform/RenderingTestScope.kt
+++ b/compose/ui/ui/src/desktopTest/kotlin/androidx/compose/ui/platform/RenderingTestScope.kt
@@ -38,14 +38,15 @@
     height: Int,
     context: CoroutineContext = Dispatchers.Swing,
     block: suspend RenderingTestScope.() -> Unit
-) = runBlocking(Dispatchers.Swing) {
-    val scope = RenderingTestScope(width, height, context)
-    try {
-        scope.block()
-    } finally {
-        scope.dispose()
+) =
+    runBlocking(Dispatchers.Swing) {
+        val scope = RenderingTestScope(width, height, context)
+        try {
+            scope.block()
+        } finally {
+            scope.dispose()
+        }
     }
-}
 
 @OptIn(ExperimentalComposeUiApi::class)
 internal class RenderingTestScope(
@@ -55,18 +56,17 @@
 ) {
     var currentTimeMillis = 0L
 
-    private val frameDispatcher = FrameDispatcher(coroutineContext) {
-        onRender(currentTimeMillis * 1_000_000)
-    }
+    private val frameDispatcher =
+        FrameDispatcher(coroutineContext) { onRender(currentTimeMillis * 1_000_000) }
 
     val surface: Surface = Surface.makeRasterN32Premul(width, height)
     val canvas: Canvas = surface.canvas
-    val scene = ComposeScene(
-        coroutineContext = coroutineContext,
-        invalidate = frameDispatcher::scheduleFrame
-    ).apply {
-        constraints = Constraints(maxWidth = width, maxHeight = height)
-    }
+    val scene =
+        ComposeScene(
+                coroutineContext = coroutineContext,
+                invalidate = frameDispatcher::scheduleFrame
+            )
+            .apply { constraints = Constraints(maxWidth = width, maxHeight = height) }
 
     var density: Float
         get() = scene.density.density
@@ -82,9 +82,7 @@
     private var onRender = CompletableDeferred<Unit>()
 
     fun setContent(content: @Composable () -> Unit) {
-        scene.setContent {
-            content()
-        }
+        scene.setContent { content() }
     }
 
     private fun onRender(timeNanos: Long) {
@@ -101,9 +99,7 @@
     suspend fun hasRenders(): Boolean {
         onRender = CompletableDeferred()
         // repeat multiple times because rendering can be dispatched on the next frames
-        repeat(10) {
-            yield()
-        }
+        repeat(10) { yield() }
         return onRender.isCompleted
     }
 }
diff --git a/compose/ui/ui/src/desktopTest/kotlin/androidx/compose/ui/platform/SkiaLayerTest.kt b/compose/ui/ui/src/desktopTest/kotlin/androidx/compose/ui/platform/SkiaLayerTest.kt
index adc95cf..71958b9 100644
--- a/compose/ui/ui/src/desktopTest/kotlin/androidx/compose/ui/platform/SkiaLayerTest.kt
+++ b/compose/ui/ui/src/desktopTest/kotlin/androidx/compose/ui/platform/SkiaLayerTest.kt
@@ -43,8 +43,7 @@
 import org.junit.Test
 
 class SkiaLayerTest {
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
     private val layer = TestSkiaLayer()
     private val cos45 = cos(PI / 4)
@@ -116,11 +115,7 @@
     @Test
     fun `scale, left-top origin`() {
         layer.resize(IntSize(100, 10))
-        layer.updateProperties(
-            scaleX = 2f,
-            scaleY = 4f,
-            transformOrigin = TransformOrigin(0f, 0f)
-        )
+        layer.updateProperties(scaleX = 2f, scaleY = 4f, transformOrigin = TransformOrigin(0f, 0f))
         val matrix = layer.matrix
 
         assertEquals(IntOffset(0, 0), matrix.map(Offset(0f, 0f)).round())
@@ -130,11 +125,7 @@
     @Test
     fun `scale, bottom-right origin`() {
         layer.resize(IntSize(100, 10))
-        layer.updateProperties(
-            scaleX = 2f,
-            scaleY = 4f,
-            transformOrigin = TransformOrigin(1f, 1f)
-        )
+        layer.updateProperties(scaleX = 2f, scaleY = 4f, transformOrigin = TransformOrigin(1f, 1f))
         val matrix = layer.matrix
 
         assertEquals(IntOffset(-100, -30), matrix.map(Offset(0f, 0f)).round())
@@ -144,10 +135,7 @@
     @Test
     fun `rotationX, left-top origin`() {
         layer.resize(IntSize(100, 10))
-        layer.updateProperties(
-            rotationX = 45f,
-            transformOrigin = TransformOrigin(0f, 0f)
-        )
+        layer.updateProperties(rotationX = 45f, transformOrigin = TransformOrigin(0f, 0f))
         val matrix = layer.matrix
 
         val y = (10 * cos45).roundToInt()
@@ -158,10 +146,7 @@
     @Test
     fun `rotationX, bottom-right origin`() {
         layer.resize(IntSize(100, 10))
-        layer.updateProperties(
-            rotationX = 45f,
-            transformOrigin = TransformOrigin(1f, 1f)
-        )
+        layer.updateProperties(rotationX = 45f, transformOrigin = TransformOrigin(1f, 1f))
         val matrix = layer.matrix
 
         val y = 10 * (1 - cos45.toFloat())
@@ -172,10 +157,7 @@
     @Test
     fun `rotationY, left-top origin`() {
         layer.resize(IntSize(100, 10))
-        layer.updateProperties(
-            rotationY = 45f,
-            transformOrigin = TransformOrigin(0f, 0f)
-        )
+        layer.updateProperties(rotationY = 45f, transformOrigin = TransformOrigin(0f, 0f))
         val matrix = layer.matrix
 
         val x = (100 * cos45).roundToInt()
@@ -186,10 +168,7 @@
     @Test
     fun `rotationY, bottom-right origin`() {
         layer.resize(IntSize(100, 10))
-        layer.updateProperties(
-            rotationY = 45f,
-            transformOrigin = TransformOrigin(1f, 1f)
-        )
+        layer.updateProperties(rotationY = 45f, transformOrigin = TransformOrigin(1f, 1f))
         val matrix = layer.matrix
 
         val x = (100 * (1 - cos45)).roundToInt()
@@ -200,10 +179,7 @@
     @Test
     fun `rotationZ, left-top origin`() {
         layer.resize(IntSize(100, 10))
-        layer.updateProperties(
-            rotationZ = 90f,
-            transformOrigin = TransformOrigin(0f, 0f)
-        )
+        layer.updateProperties(rotationZ = 90f, transformOrigin = TransformOrigin(0f, 0f))
         val matrix = layer.matrix
 
         assertEquals(IntOffset(0, 0), matrix.map(Offset(0f, 0f)).round())
@@ -213,10 +189,7 @@
     @Test
     fun `rotationZ, bottom-right origin`() {
         layer.resize(IntSize(100, 10))
-        layer.updateProperties(
-            rotationZ = 90f,
-            transformOrigin = TransformOrigin(1f, 1f)
-        )
+        layer.updateProperties(rotationZ = 90f, transformOrigin = TransformOrigin(1f, 1f))
         val matrix = layer.matrix
 
         assertEquals(IntOffset(110, -90), matrix.map(Offset(0f, 0f)).round())
@@ -323,38 +296,28 @@
     @Test
     fun `is in layer`() {
         layer.resize(IntSize(0, 0))
-        layer.updateProperties(
-            clip = false
-        )
+        layer.updateProperties(clip = false)
 
         assertTrue(layer.isInLayer(Offset(-1f, -1f)))
         assertTrue(layer.isInLayer(Offset(0f, 0f)))
         assertTrue(layer.isInLayer(Offset(1f, 1f)))
 
         layer.resize(IntSize(0, 0))
-        layer.updateProperties(
-            clip = true
-        )
+        layer.updateProperties(clip = true)
 
         assertFalse(layer.isInLayer(Offset(-1f, -1f)))
         assertFalse(layer.isInLayer(Offset(0f, 0f)))
         assertFalse(layer.isInLayer(Offset(1f, 1f)))
 
         layer.resize(IntSize(0, 0))
-        layer.updateProperties(
-            clip = true,
-            shape = CircleShape
-        )
+        layer.updateProperties(clip = true, shape = CircleShape)
 
         assertFalse(layer.isInLayer(Offset(-1f, -1f)))
         assertFalse(layer.isInLayer(Offset(0f, 0f)))
         assertFalse(layer.isInLayer(Offset(1f, 1f)))
 
         layer.resize(IntSize(1, 2))
-        layer.updateProperties(
-            clip = true,
-            size = Size(1f, 2f)
-        )
+        layer.updateProperties(clip = true, size = Size(1f, 2f))
 
         assertFalse(layer.isInLayer(Offset(-1f, -1f)))
         assertTrue(layer.isInLayer(Offset(0f, 0f)))
@@ -363,22 +326,15 @@
         assertFalse(layer.isInLayer(Offset(1f, 0f)))
 
         layer.resize(IntSize(100, 200))
-        layer.updateProperties(
-            clip = true,
-            shape = CircleShape,
-            size = Size(100f, 200f)
-        )
+        layer.updateProperties(clip = true, shape = CircleShape, size = Size(100f, 200f))
 
         assertFalse(layer.isInLayer(Offset(5f, 5f)))
         assertFalse(layer.isInLayer(Offset(95f, 195f)))
         assertTrue(layer.isInLayer(Offset(50f, 100f)))
     }
 
-    private fun TestSkiaLayer() = SkiaLayer(
-        Density(1f, 1f),
-        invalidateParentLayer = {},
-        drawBlock = { _, _ -> }
-    )
+    private fun TestSkiaLayer() =
+        SkiaLayer(Density(1f, 1f), invalidateParentLayer = {}, drawBlock = { _, _ -> })
 
     private fun SkiaLayer.updateProperties(
         scaleX: Float = 1f,
diff --git a/compose/ui/ui/src/desktopTest/kotlin/androidx/compose/ui/res/DesktopSvgResourcesTest.kt b/compose/ui/ui/src/desktopTest/kotlin/androidx/compose/ui/res/DesktopSvgResourcesTest.kt
index 6351f8c..e5de1db 100644
--- a/compose/ui/ui/src/desktopTest/kotlin/androidx/compose/ui/res/DesktopSvgResourcesTest.kt
+++ b/compose/ui/ui/src/desktopTest/kotlin/androidx/compose/ui/res/DesktopSvgResourcesTest.kt
@@ -33,8 +33,7 @@
 
 @OptIn(InternalTestApi::class)
 class DesktopSvgResourcesTest {
-    @get:Rule
-    val screenshotRule = DesktopScreenshotTestRule("compose/ui/ui-desktop/res")
+    @get:Rule val screenshotRule = DesktopScreenshotTestRule("compose/ui/ui-desktop/res")
 
     @Test
     fun `load SVG with specified size`() {
diff --git a/compose/ui/ui/src/desktopTest/kotlin/androidx/compose/ui/util/AddRemoveMutableListTest.kt b/compose/ui/ui/src/desktopTest/kotlin/androidx/compose/ui/util/AddRemoveMutableListTest.kt
index 95a0d9e..b3845a3 100644
--- a/compose/ui/ui/src/desktopTest/kotlin/androidx/compose/ui/util/AddRemoveMutableListTest.kt
+++ b/compose/ui/ui/src/desktopTest/kotlin/androidx/compose/ui/util/AddRemoveMutableListTest.kt
@@ -61,12 +61,12 @@
 // TODO(demin): why there is a compilation error when we use AddRemoveMutableList<Int>() ?
 
 @Suppress("UNCHECKED_CAST")
-private class TestList(
-    vararg items: Int
-) : AddRemoveMutableList<Any>() {
+private class TestList(vararg items: Int) : AddRemoveMutableList<Any>() {
     private val list: MutableList<Any> = items.toMutableList() as MutableList<Any>
 
-    override val size: Int get() = list.size
+    override val size: Int
+        get() = list.size
+
     override fun get(index: Int): Any = list[index]
 
     override fun performAdd(element: Any) {
diff --git a/compose/ui/ui/src/desktopTest/kotlin/androidx/compose/ui/util/UpdateEffectTest.kt b/compose/ui/ui/src/desktopTest/kotlin/androidx/compose/ui/util/UpdateEffectTest.kt
index 93bb454..b54d9eb 100644
--- a/compose/ui/ui/src/desktopTest/kotlin/androidx/compose/ui/util/UpdateEffectTest.kt
+++ b/compose/ui/ui/src/desktopTest/kotlin/androidx/compose/ui/util/UpdateEffectTest.kt
@@ -27,8 +27,7 @@
 
 @Ignore("b/271123970 Fails in AOSP. Will be fixed after upstreaming Compose for Desktop")
 internal class UpdateEffectTest {
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
     @Test
     fun `call update when any mutableStateOf is changed`() {
@@ -70,11 +69,7 @@
         var state = 0
         var updatedState = -1
 
-        rule.setContent {
-            UpdateEffect {
-                updatedState = state
-            }
-        }
+        rule.setContent { UpdateEffect { updatedState = state } }
 
         rule.waitForIdle()
         assertThat(updatedState).isEqualTo(state)
diff --git a/compose/ui/ui/src/desktopTest/kotlin/androidx/compose/ui/window/ApplicationTest.kt b/compose/ui/ui/src/desktopTest/kotlin/androidx/compose/ui/window/ApplicationTest.kt
index a842511..a82fe2d 100644
--- a/compose/ui/ui/src/desktopTest/kotlin/androidx/compose/ui/window/ApplicationTest.kt
+++ b/compose/ui/ui/src/desktopTest/kotlin/androidx/compose/ui/window/ApplicationTest.kt
@@ -47,9 +47,7 @@
         val appJob = launchApplication {
             DisposableEffect(Unit) {
                 isInit = true
-                onDispose {
-                    isDisposed = true
-                }
+                onDispose { isDisposed = true }
             }
         }
 
@@ -87,9 +85,10 @@
             if (isOpen1) {
                 Window(
                     onCloseRequest = {},
-                    state = rememberWindowState(
-                        size = DpSize(600.dp, 600.dp),
-                    )
+                    state =
+                        rememberWindowState(
+                            size = DpSize(600.dp, 600.dp),
+                        )
                 ) {
                     window1 = this.window
                     Box(Modifier.size(32.dp).background(Color.Red))
@@ -101,9 +100,10 @@
             if (isOpen2) {
                 Window(
                     onCloseRequest = {},
-                    state = rememberWindowState(
-                        size = DpSize(300.dp, 300.dp),
-                    )
+                    state =
+                        rememberWindowState(
+                            size = DpSize(300.dp, 300.dp),
+                        )
                 ) {
                     window2 = this.window
                     Box(Modifier.size(32.dp).background(Color.Blue))
@@ -133,16 +133,10 @@
         lateinit var windowClock: MonotonicFrameClock
 
         launchApplication {
-            LaunchedEffect(Unit) {
-                appClock = coroutineContext.monotonicFrameClock
-            }
+            LaunchedEffect(Unit) { appClock = coroutineContext.monotonicFrameClock }
 
-            Window(
-                onCloseRequest = {}
-            ) {
-                LaunchedEffect(Unit) {
-                    windowClock = coroutineContext.monotonicFrameClock
-                }
+            Window(onCloseRequest = {}) {
+                LaunchedEffect(Unit) { windowClock = coroutineContext.monotonicFrameClock }
             }
         }
 
diff --git a/compose/ui/ui/src/desktopTest/kotlin/androidx/compose/ui/window/DesktopPopupTest.kt b/compose/ui/ui/src/desktopTest/kotlin/androidx/compose/ui/window/DesktopPopupTest.kt
index c47fe8d..f524624 100644
--- a/compose/ui/ui/src/desktopTest/kotlin/androidx/compose/ui/window/DesktopPopupTest.kt
+++ b/compose/ui/ui/src/desktopTest/kotlin/androidx/compose/ui/window/DesktopPopupTest.kt
@@ -42,22 +42,17 @@
 import org.junit.Test
 
 class DesktopPopupTest {
-    @get:Rule
-    val rule = createComposeRule()
+    @get:Rule val rule = createComposeRule()
 
     @Test
     fun `pass composition locals to popup`() {
-        val compositionLocal = staticCompositionLocalOf<Int> {
-            error("not set")
-        }
+        val compositionLocal = staticCompositionLocalOf<Int> { error("not set") }
 
         var actualLocalValue = 0
 
         rule.setContent {
             CompositionLocalProvider(compositionLocal provides 3) {
-                Popup {
-                    actualLocalValue = compositionLocal.current
-                }
+                Popup { actualLocalValue = compositionLocal.current }
             }
         }
 
@@ -71,13 +66,7 @@
 
         rule.setContent {
             if (isPopupShowing) {
-                Popup {
-                    DisposableEffect(Unit) {
-                        onDispose {
-                            isDisposed = true
-                        }
-                    }
-                }
+                Popup { DisposableEffect(Unit) { onDispose { isDisposed = true } } }
             }
         }
 
@@ -94,9 +83,7 @@
 
         rule.setContent {
             CompositionLocalProvider(LocalDensity provides density) {
-                Popup {
-                    densityInsidePopup = LocalDensity.current.density
-                }
+                Popup { densityInsidePopup = LocalDensity.current.density }
             }
         }
 
@@ -114,14 +101,10 @@
         rule.setContent {
             val isPressed = derivedStateOf { false }
 
-            Canvas(Modifier.size(100.dp)) {
-                isPressed.value
-            }
+            Canvas(Modifier.size(100.dp)) { isPressed.value }
 
             if (showPopup) {
-                Popup {
-                    Box(Modifier)
-                }
+                Popup { Box(Modifier) }
             }
         }
 
@@ -144,9 +127,7 @@
             }
 
             if (showPopup) {
-                Popup {
-                    Box(Modifier)
-                }
+                Popup { Box(Modifier) }
             }
         }
 
@@ -165,9 +146,7 @@
         var lastCompositionState = 0
 
         rule.setContent {
-            Canvas(Modifier.size(100.dp)) {
-                lastCompositionState = state
-            }
+            Canvas(Modifier.size(100.dp)) { lastCompositionState = state }
 
             if (showPopup) {
                 Popup {
@@ -203,18 +182,10 @@
     fun `(Bug) use Popup inside LazyColumn`() {
         rule.setContent {
             var count by remember { mutableStateOf(0) }
-            LazyColumn {
-                items(count) {
-                    Popup { }
-                }
-            }
+            LazyColumn { items(count) { Popup {} } }
             LaunchedEffect(Unit) {
-                withFrameNanos {
-                    count++
-                }
-                withFrameNanos {
-                    count++
-                }
+                withFrameNanos { count++ }
+                withFrameNanos { count++ }
             }
         }
 
diff --git a/compose/ui/ui/src/desktopTest/kotlin/androidx/compose/ui/window/MenuBarTest.kt b/compose/ui/ui/src/desktopTest/kotlin/androidx/compose/ui/window/MenuBarTest.kt
index 1ec49f3..613f2cc 100644
--- a/compose/ui/ui/src/desktopTest/kotlin/androidx/compose/ui/window/MenuBarTest.kt
+++ b/compose/ui/ui/src/desktopTest/kotlin/androidx/compose/ui/window/MenuBarTest.kt
@@ -70,9 +70,7 @@
                 assertThat(getMenuComponent(1)).isInstanceOf(JSeparator::class.java)
             }
 
-            getMenu(1).apply {
-                assertThat(itemCount).isEqualTo(0)
-            }
+            getMenu(1).apply { assertThat(itemCount).isEqualTo(0) }
         }
 
         isMenubarShowing = false
@@ -268,11 +266,7 @@
             Window(onCloseRequest = {}) {
                 window = this.window
 
-                MenuBar {
-                    Menu("Menu") {
-                        Item("Item", icon = icon, onClick = {})
-                    }
-                }
+                MenuBar { Menu("Menu") { Item("Item", icon = icon, onClick = {}) } }
             }
         }
 
@@ -303,9 +297,7 @@
                 window = this.window
 
                 MenuBar {
-                    Menu("Menu") {
-                        Item("Item", icon = redIcon, enabled = false, onClick = {})
-                    }
+                    Menu("Menu") { Item("Item", icon = redIcon, enabled = false, onClick = {}) }
                 }
             }
         }
@@ -363,9 +355,7 @@
                 window = this.window
 
                 MenuBar {
-                    Menu("Menu") {
-                        CheckboxItem("Item", checked = checked, onCheckedChange = { })
-                    }
+                    Menu("Menu") { CheckboxItem("Item", checked = checked, onCheckedChange = {}) }
                 }
             }
         }
@@ -400,10 +390,14 @@
                 MenuBar {
                     Menu("Menu") {
                         RadioButtonItem(
-                            "Item0", selected = selected == 0, onClick = { selected = 0 }
+                            "Item0",
+                            selected = selected == 0,
+                            onClick = { selected = 0 }
                         )
                         RadioButtonItem(
-                            "Item1", selected = selected == 1, onClick = { selected = 1 }
+                            "Item1",
+                            selected = selected == 1,
+                            onClick = { selected = 1 }
                         )
                     }
                 }
@@ -443,12 +437,8 @@
 
                 MenuBar {
                     Menu("Menu") {
-                        RadioButtonItem(
-                            "Item0", selected = selected == 0, onClick = { }
-                        )
-                        RadioButtonItem(
-                            "Item1", selected = selected == 1, onClick = { }
-                        )
+                        RadioButtonItem("Item0", selected = selected == 0, onClick = {})
+                        RadioButtonItem("Item1", selected = selected == 1, onClick = {})
                     }
                 }
             }
diff --git a/compose/ui/ui/src/desktopTest/kotlin/androidx/compose/ui/window/TestUtils.kt b/compose/ui/ui/src/desktopTest/kotlin/androidx/compose/ui/window/TestUtils.kt
index c6b4f02..f4316c4 100644
--- a/compose/ui/ui/src/desktopTest/kotlin/androidx/compose/ui/window/TestUtils.kt
+++ b/compose/ui/ui/src/desktopTest/kotlin/androidx/compose/ui/window/TestUtils.kt
@@ -44,8 +44,8 @@
      * Set this property only if you sure that you can't easily make the test deterministic
      * (non-flaky).
      *
-     * We have to use `useDelay` in some Linux Tests, because Linux can behave in
-     * non-deterministic way when we change position/size very fast (see the snippet below)
+     * We have to use `useDelay` in some Linux Tests, because Linux can behave in non-deterministic
+     * way when we change position/size very fast (see the snippet below)
      */
     useDelay: Boolean = false,
     body: suspend WindowTestScope.() -> Unit
@@ -107,10 +107,8 @@
 }
 */
 
-internal class WindowTestScope(
-    private val scope: CoroutineScope,
-    private val useDelay: Boolean
-) : CoroutineScope by CoroutineScope(scope.coroutineContext + Job()) {
+internal class WindowTestScope(private val scope: CoroutineScope, private val useDelay: Boolean) :
+    CoroutineScope by CoroutineScope(scope.coroutineContext + Job()) {
     var isOpen by mutableStateOf(true)
     private val initialRecomposers = Recomposer.runningRecomposers.value
 
@@ -129,9 +127,7 @@
         //  because there are Swing/system events that we don't control).
         // Most of the work usually is done after the first yield(), almost all of the work -
         // after fourth yield()
-        repeat(100) {
-            yield()
-        }
+        repeat(100) { yield() }
 
         Snapshot.sendApplyNotifications()
         for (recomposerInfo in Recomposer.runningRecomposers.value - initialRecomposers) {
diff --git a/compose/ui/ui/src/desktopTest/kotlin/androidx/compose/ui/window/dialog/DialogTest.kt b/compose/ui/ui/src/desktopTest/kotlin/androidx/compose/ui/window/dialog/DialogTest.kt
index 1a2d84f..d37a3e6 100644
--- a/compose/ui/ui/src/desktopTest/kotlin/androidx/compose/ui/window/dialog/DialogTest.kt
+++ b/compose/ui/ui/src/desktopTest/kotlin/androidx/compose/ui/window/dialog/DialogTest.kt
@@ -63,21 +63,21 @@
         launchApplication {
             var isOpen by remember { mutableStateOf(true) }
 
-            fun createWindow() = ComposeDialog().apply {
-                size = Dimension(300, 200)
+            fun createWindow() =
+                ComposeDialog().apply {
+                    size = Dimension(300, 200)
 
-                addWindowListener(object : WindowAdapter() {
-                    override fun windowClosing(e: WindowEvent) {
-                        isOpen = false
-                    }
-                })
-            }
+                    addWindowListener(
+                        object : WindowAdapter() {
+                            override fun windowClosing(e: WindowEvent) {
+                                isOpen = false
+                            }
+                        }
+                    )
+                }
 
             if (isOpen) {
-                DialogWindow(
-                    create = ::createWindow,
-                    dispose = ComposeDialog::dispose
-                ) {
+                DialogWindow(create = ::createWindow, dispose = ComposeDialog::dispose) {
                     window = this.window
                     Box(Modifier.size(32.dp).background(Color.Red))
                 }
@@ -98,15 +98,18 @@
         var title by mutableStateOf("Title1")
 
         launchApplication {
-            fun createWindow() = ComposeDialog().apply {
-                size = Dimension(300, 200)
+            fun createWindow() =
+                ComposeDialog().apply {
+                    size = Dimension(300, 200)
 
-                addWindowListener(object : WindowAdapter() {
-                    override fun windowClosing(e: WindowEvent) {
-                        isOpen = false
-                    }
-                })
-            }
+                    addWindowListener(
+                        object : WindowAdapter() {
+                            override fun windowClosing(e: WindowEvent) {
+                                isOpen = false
+                            }
+                        }
+                    )
+                }
 
             if (isOpen) {
                 DialogWindow(
@@ -156,11 +159,7 @@
 
         launchApplication {
             if (isOpen) {
-                DialogWindow(
-                    onCloseRequest = {
-                        isCloseCalled = true
-                    }
-                ) {
+                DialogWindow(onCloseRequest = { isCloseCalled = true }) {
                     window = this.window
                     Box(Modifier.size(32.dp).background(Color.Red))
                 }
@@ -261,9 +260,10 @@
             if (isOpen) {
                 DialogWindow(
                     onCloseRequest = {},
-                    state = rememberDialogState(
-                        size = DpSize(600.dp, 600.dp),
-                    )
+                    state =
+                        rememberDialogState(
+                            size = DpSize(600.dp, 600.dp),
+                        )
                 ) {
                     window1 = this.window
                     Box(Modifier.size(32.dp).background(Color.Red))
@@ -271,9 +271,10 @@
                     if (isNestedOpen) {
                         DialogWindow(
                             onCloseRequest = {},
-                            state = rememberDialogState(
-                                size = DpSize(300.dp, 300.dp),
-                            )
+                            state =
+                                rememberDialogState(
+                                    size = DpSize(300.dp, 300.dp),
+                                )
                         ) {
                             window2 = this.window
                             Box(Modifier.size(32.dp).background(Color.Blue))
@@ -317,18 +318,20 @@
                 CompositionLocalProvider(localTestValue provides testValue) {
                     DialogWindow(
                         onCloseRequest = {},
-                        state = rememberDialogState(
-                            size = DpSize(600.dp, 600.dp),
-                        )
+                        state =
+                            rememberDialogState(
+                                size = DpSize(600.dp, 600.dp),
+                            )
                     ) {
                         actualValue1 = localTestValue.current
                         Box(Modifier.size(32.dp).background(Color.Red))
 
                         DialogWindow(
                             onCloseRequest = {},
-                            state = rememberDialogState(
-                                size = DpSize(300.dp, 300.dp),
-                            )
+                            state =
+                                rememberDialogState(
+                                    size = DpSize(300.dp, 300.dp),
+                                )
                         ) {
                             actualValue2 = localTestValue.current
                             Box(Modifier.size(32.dp).background(Color.Blue))
@@ -362,9 +365,7 @@
                 DialogWindow(onCloseRequest = {}) {
                     DisposableEffect(Unit) {
                         initCount++
-                        onDispose {
-                            disposeCount++
-                        }
+                        onDispose { disposeCount++ }
                     }
                 }
             }
@@ -459,13 +460,10 @@
                 window = this.window
 
                 val focusRequester = remember(::FocusRequester)
-                LaunchedEffect(Unit) {
-                    focusRequester.requestFocus()
-                }
+                LaunchedEffect(Unit) { focusRequester.requestFocus() }
 
                 Box(
-                    Modifier
-                        .focusRequester(focusRequester)
+                    Modifier.focusRequester(focusRequester)
                         .focusTarget()
                         .onPreviewKeyEvent {
                             onNodePreviewKeyEventKeys.add(it.key)
diff --git a/compose/ui/ui/src/desktopTest/kotlin/androidx/compose/ui/window/window/WindowInputEventTest.kt b/compose/ui/ui/src/desktopTest/kotlin/androidx/compose/ui/window/window/WindowInputEventTest.kt
index 3eba371..78393d4 100644
--- a/compose/ui/ui/src/desktopTest/kotlin/androidx/compose/ui/window/window/WindowInputEventTest.kt
+++ b/compose/ui/ui/src/desktopTest/kotlin/androidx/compose/ui/window/window/WindowInputEventTest.kt
@@ -136,13 +136,10 @@
                 window = this.window
 
                 val focusRequester = remember(::FocusRequester)
-                LaunchedEffect(Unit) {
-                    focusRequester.requestFocus()
-                }
+                LaunchedEffect(Unit) { focusRequester.requestFocus() }
 
                 Box(
-                    Modifier
-                        .focusRequester(focusRequester)
+                    Modifier.focusRequester(focusRequester)
                         .focusTarget()
                         .onPreviewKeyEvent {
                             onNodePreviewKeyEventKeys.add(it.key)
@@ -216,9 +213,7 @@
                 Box(
                     Modifier.fillMaxSize().pointerInput(events) {
                         while (true) {
-                            awaitPointerEventScope {
-                                events += awaitPointerEvent()
-                            }
+                            awaitPointerEventScope { events += awaitPointerEvent() }
                         }
                     }
                 )
@@ -266,8 +261,7 @@
                 window = this.window
 
                 Box(
-                    Modifier
-                        .fillMaxSize()
+                    Modifier.fillMaxSize()
                         .onPointerEvent(PointerEventType.Move) {
                             onMoves.add(it.changes.first().position)
                         }
@@ -306,11 +300,11 @@
         assertThat(onExits).isEqualTo(0)
 
         // TODO(https://github.com/JetBrains/compose-jb/issues/1176) fix catching exit event
-//        window.sendMouseEvent(MouseEvent.MOUSE_EXITED, x = 900, y = 500)
-//        awaitIdle()
-//        assertThat(onMoves.size).isEqualTo(2)
-//        assertThat(onEnters).isEqualTo(1)
-//        assertThat(onExits).isEqualTo(1)
+        //        window.sendMouseEvent(MouseEvent.MOUSE_EXITED, x = 900, y = 500)
+        //        awaitIdle()
+        //        assertThat(onMoves.size).isEqualTo(2)
+        //        assertThat(onEnters).isEqualTo(1)
+        //        assertThat(onExits).isEqualTo(1)
 
         exitApplication()
     }
@@ -329,11 +323,9 @@
                 window = this.window
 
                 Box(
-                    Modifier
-                        .fillMaxSize()
-                        .onPointerEvent(PointerEventType.Scroll) {
-                            deltas.add(it.changes.first().scrollDelta)
-                        }
+                    Modifier.fillMaxSize().onPointerEvent(PointerEventType.Scroll) {
+                        deltas.add(it.changes.first().scrollDelta)
+                    }
                 )
             }
         }
@@ -380,11 +372,9 @@
                 window = this.window
 
                 Box(
-                    Modifier
-                        .fillMaxSize()
-                        .onPointerEvent(PointerEventType.Scroll) {
-                            deltas.add(it.changes.first().scrollDelta)
-                        }
+                    Modifier.fillMaxSize().onPointerEvent(PointerEventType.Scroll) {
+                        deltas.add(it.changes.first().scrollDelta)
+                    }
                 )
             }
         }
@@ -424,11 +414,9 @@
                 window = this.window
 
                 Box(
-                    Modifier
-                        .fillMaxSize()
-                        .onFirstPointerEvent(PointerEventType.Scroll) {
-                            deltas.add(it.changes.first().scrollDelta)
-                        }
+                    Modifier.fillMaxSize().onFirstPointerEvent(PointerEventType.Scroll) {
+                        deltas.add(it.changes.first().scrollDelta)
+                    }
                 )
             }
         }
@@ -469,8 +457,7 @@
                 window = this.window
 
                 Box(
-                    Modifier
-                        .fillMaxSize()
+                    Modifier.fillMaxSize()
                         .onPointerEvent(PointerEventType.Press) {
                             receivedButtons.add(it.buttons)
                             receivedKeyboardModifiers.add(it.keyboardModifiers)
@@ -489,28 +476,33 @@
             MouseEvent.MOUSE_PRESSED,
             x = 100,
             y = 50,
-            modifiers = MouseEvent.SHIFT_DOWN_MASK or MouseEvent.CTRL_DOWN_MASK or
-                MouseEvent.BUTTON1_DOWN_MASK or MouseEvent.BUTTON3_DOWN_MASK
+            modifiers =
+                MouseEvent.SHIFT_DOWN_MASK or
+                    MouseEvent.CTRL_DOWN_MASK or
+                    MouseEvent.BUTTON1_DOWN_MASK or
+                    MouseEvent.BUTTON3_DOWN_MASK
         )
 
         awaitIdle()
         assertThat(receivedButtons.size).isEqualTo(1)
-        assertThat(receivedButtons.last()).isEqualTo(
-            PointerButtons(
-                isPrimaryPressed = true,
-                isSecondaryPressed = true,
+        assertThat(receivedButtons.last())
+            .isEqualTo(
+                PointerButtons(
+                    isPrimaryPressed = true,
+                    isSecondaryPressed = true,
+                )
             )
-        )
         assertThat(receivedKeyboardModifiers.size).isEqualTo(1)
-        assertThat(receivedKeyboardModifiers.last()).isEqualTo(
-            PointerKeyboardModifiers(
-                isCtrlPressed = true,
-                isShiftPressed = true,
-                isCapsLockOn = getLockingKeyStateSafe(KeyEvent.VK_CAPS_LOCK),
-                isScrollLockOn = getLockingKeyStateSafe(KeyEvent.VK_SCROLL_LOCK),
-                isNumLockOn = getLockingKeyStateSafe(KeyEvent.VK_NUM_LOCK),
+        assertThat(receivedKeyboardModifiers.last())
+            .isEqualTo(
+                PointerKeyboardModifiers(
+                    isCtrlPressed = true,
+                    isShiftPressed = true,
+                    isCapsLockOn = getLockingKeyStateSafe(KeyEvent.VK_CAPS_LOCK),
+                    isScrollLockOn = getLockingKeyStateSafe(KeyEvent.VK_SCROLL_LOCK),
+                    isNumLockOn = getLockingKeyStateSafe(KeyEvent.VK_NUM_LOCK),
+                )
             )
-        )
 
         window.sendMouseWheelEvent(
             MouseEvent.MOUSE_WHEEL,
@@ -518,69 +510,75 @@
             y = 50,
             scrollType = MouseWheelEvent.WHEEL_UNIT_SCROLL,
             wheelRotation = 1,
-            modifiers = MouseEvent.SHIFT_DOWN_MASK or MouseEvent.CTRL_DOWN_MASK or
-                MouseEvent.BUTTON1_DOWN_MASK or MouseEvent.BUTTON3_DOWN_MASK
+            modifiers =
+                MouseEvent.SHIFT_DOWN_MASK or
+                    MouseEvent.CTRL_DOWN_MASK or
+                    MouseEvent.BUTTON1_DOWN_MASK or
+                    MouseEvent.BUTTON3_DOWN_MASK
         )
 
         awaitIdle()
         assertThat(receivedButtons.size).isEqualTo(2)
-        assertThat(receivedButtons.last()).isEqualTo(
-            PointerButtons(
-                isPrimaryPressed = true,
-                isSecondaryPressed = true,
+        assertThat(receivedButtons.last())
+            .isEqualTo(
+                PointerButtons(
+                    isPrimaryPressed = true,
+                    isSecondaryPressed = true,
+                )
             )
-        )
         assertThat(receivedKeyboardModifiers.size).isEqualTo(2)
-        assertThat(receivedKeyboardModifiers.last()).isEqualTo(
-            PointerKeyboardModifiers(
-                isCtrlPressed = true,
-                isShiftPressed = true,
-                isCapsLockOn = getLockingKeyStateSafe(KeyEvent.VK_CAPS_LOCK),
-                isScrollLockOn = getLockingKeyStateSafe(KeyEvent.VK_SCROLL_LOCK),
-                isNumLockOn = getLockingKeyStateSafe(KeyEvent.VK_NUM_LOCK),
+        assertThat(receivedKeyboardModifiers.last())
+            .isEqualTo(
+                PointerKeyboardModifiers(
+                    isCtrlPressed = true,
+                    isShiftPressed = true,
+                    isCapsLockOn = getLockingKeyStateSafe(KeyEvent.VK_CAPS_LOCK),
+                    isScrollLockOn = getLockingKeyStateSafe(KeyEvent.VK_SCROLL_LOCK),
+                    isNumLockOn = getLockingKeyStateSafe(KeyEvent.VK_NUM_LOCK),
+                )
             )
-        )
 
         exitApplication()
     }
 
-    private fun getLockingKeyStateSafe(
-        mask: Int
-    ): Boolean = try {
-        Toolkit.getDefaultToolkit().getLockingKeyState(mask)
-    } catch (_: Exception) {
-        false
-    }
+    private fun getLockingKeyStateSafe(mask: Int): Boolean =
+        try {
+            Toolkit.getDefaultToolkit().getLockingKeyState(mask)
+        } catch (_: Exception) {
+            false
+        }
 
     private fun Modifier.onPointerEvent(
         eventType: PointerEventType,
         onEvent: AwaitPointerEventScope.(event: PointerEvent) -> Unit
-    ) = pointerInput(eventType, onEvent) {
-        awaitPointerEventScope {
-            while (true) {
-                val event = awaitPointerEvent()
-                if (event.type == eventType) {
-                    onEvent(event)
+    ) =
+        pointerInput(eventType, onEvent) {
+            awaitPointerEventScope {
+                while (true) {
+                    val event = awaitPointerEvent()
+                    if (event.type == eventType) {
+                        onEvent(event)
+                    }
                 }
             }
         }
-    }
 
     /**
-     * Handle only the first received event and drop all the others that are received
-     * in a single frame
+     * Handle only the first received event and drop all the others that are received in a single
+     * frame
      */
     private fun Modifier.onFirstPointerEvent(
         eventType: PointerEventType,
         onEvent: AwaitPointerEventScope.(event: PointerEvent) -> Unit
-    ) = pointerInput(eventType, onEvent) {
-        while (true) {
-            awaitPointerEventScope {
-                val event = awaitEvent(eventType)
-                onEvent(event)
+    ) =
+        pointerInput(eventType, onEvent) {
+            while (true) {
+                awaitPointerEventScope {
+                    val event = awaitEvent(eventType)
+                    onEvent(event)
+                }
             }
         }
-    }
 
     private suspend fun AwaitPointerEventScope.awaitEvent(
         eventType: PointerEventType
@@ -588,12 +586,13 @@
         var event: PointerEvent
         do {
             event = awaitPointerEvent()
-        } while (
-            event.type != eventType
-        )
+        } while (event.type != eventType)
         return event
     }
 
-    private val PointerEvent.pressed get() = changes.first().pressed
-    private val PointerEvent.position get() = changes.first().position
+    private val PointerEvent.pressed
+        get() = changes.first().pressed
+
+    private val PointerEvent.position
+        get() = changes.first().position
 }
diff --git a/compose/ui/ui/src/desktopTest/kotlin/androidx/compose/ui/window/window/WindowStateTest.kt b/compose/ui/ui/src/desktopTest/kotlin/androidx/compose/ui/window/window/WindowStateTest.kt
index e50d1a8..fd41c2f 100644
--- a/compose/ui/ui/src/desktopTest/kotlin/androidx/compose/ui/window/window/WindowStateTest.kt
+++ b/compose/ui/ui/src/desktopTest/kotlin/androidx/compose/ui/window/window/WindowStateTest.kt
@@ -70,9 +70,7 @@
 
         launchApplication {
             if (isOpen) {
-                Window(onCloseRequest = { isOpen = false }) {
-                    window = this.window
-                }
+                Window(onCloseRequest = { isOpen = false }) { window = this.window }
             }
         }
 
@@ -91,9 +89,7 @@
 
         launchApplication {
             if (isOpen) {
-                Window(onCloseRequest = { isOpen = false }) {
-                    window = this.window
-                }
+                Window(onCloseRequest = { isOpen = false }) { window = this.window }
             }
         }
 
@@ -118,9 +114,7 @@
                     parentWindow = this.window
 
                     if (isChildOpen) {
-                        Window(onCloseRequest = {}) {
-                            childWindow = this.window
-                        }
+                        Window(onCloseRequest = {}) { childWindow = this.window }
                     }
                 }
             }
@@ -145,73 +139,67 @@
     }
 
     @Test
-    fun `set size and position before show`() = runApplicationTest(useDelay = isLinux) {
-        val state = WindowState(
-            size = DpSize(200.dp, 200.dp),
-            position = WindowPosition(242.dp, 242.dp)
-        )
+    fun `set size and position before show`() =
+        runApplicationTest(useDelay = isLinux) {
+            val state =
+                WindowState(
+                    size = DpSize(200.dp, 200.dp),
+                    position = WindowPosition(242.dp, 242.dp)
+                )
 
-        var window: ComposeWindow? = null
+            var window: ComposeWindow? = null
 
-        launchApplication {
-            Window(onCloseRequest = {}, state) {
-                window = this.window
-            }
+            launchApplication { Window(onCloseRequest = {}, state) { window = this.window } }
+
+            awaitIdle()
+            assertThat(window?.size).isEqualTo(Dimension(200, 200))
+            assertThat(window?.location).isEqualTo(Point(242, 242))
+
+            exitApplication()
         }
 
-        awaitIdle()
-        assertThat(window?.size).isEqualTo(Dimension(200, 200))
-        assertThat(window?.location).isEqualTo(Point(242, 242))
-
-        exitApplication()
-    }
-
     @Test
-    fun `change position after show`() = runApplicationTest(useDelay = isLinux) {
-        val state = WindowState(
-            size = DpSize(200.dp, 200.dp),
-            position = WindowPosition(200.dp, 200.dp)
-        )
-        var window: ComposeWindow? = null
+    fun `change position after show`() =
+        runApplicationTest(useDelay = isLinux) {
+            val state =
+                WindowState(
+                    size = DpSize(200.dp, 200.dp),
+                    position = WindowPosition(200.dp, 200.dp)
+                )
+            var window: ComposeWindow? = null
 
-        launchApplication {
-            Window(onCloseRequest = {}, state) {
-                window = this.window
-            }
+            launchApplication { Window(onCloseRequest = {}, state) { window = this.window } }
+
+            awaitIdle()
+
+            state.position = WindowPosition(242.dp, (242).dp)
+            awaitIdle()
+            assertThat(window?.location).isEqualTo(Point(242, 242))
+
+            exitApplication()
         }
 
-        awaitIdle()
-
-        state.position = WindowPosition(242.dp, (242).dp)
-        awaitIdle()
-        assertThat(window?.location).isEqualTo(Point(242, 242))
-
-        exitApplication()
-    }
-
     @Test
-    fun `change size after show`() = runApplicationTest(useDelay = isLinux) {
-        val state = WindowState(
-            size = DpSize(200.dp, 200.dp),
-            position = WindowPosition(200.dp, 200.dp)
-        )
-        var window: ComposeWindow? = null
+    fun `change size after show`() =
+        runApplicationTest(useDelay = isLinux) {
+            val state =
+                WindowState(
+                    size = DpSize(200.dp, 200.dp),
+                    position = WindowPosition(200.dp, 200.dp)
+                )
+            var window: ComposeWindow? = null
 
-        launchApplication {
-            Window(onCloseRequest = {}, state) {
-                window = this.window
-            }
+            launchApplication { Window(onCloseRequest = {}, state) { window = this.window } }
+
+            awaitIdle()
+
+            state.size = DpSize(250.dp, 200.dp)
+            awaitIdle()
+            assertThat(window?.size).isEqualTo(Dimension(250, 200))
+
+            exitApplication()
         }
 
-        awaitIdle()
-
-        state.size = DpSize(250.dp, 200.dp)
-        awaitIdle()
-        assertThat(window?.size).isEqualTo(Dimension(250, 200))
-
-        exitApplication()
-    }
-
     @Test
     fun `center window`() = runApplicationTest {
         fun Rectangle.center() = Point(x + width / 2, y + height / 2)
@@ -219,17 +207,11 @@
         fun JFrame.screenCenter() = graphicsConfiguration.bounds.center()
         infix fun Point.maxDistance(other: Point) = max(abs(x - other.x), abs(y - other.y))
 
-        val state = WindowState(
-            size = DpSize(200.dp, 200.dp),
-            position = WindowPosition(Alignment.Center)
-        )
+        val state =
+            WindowState(size = DpSize(200.dp, 200.dp), position = WindowPosition(Alignment.Center))
         var window: ComposeWindow? = null
 
-        launchApplication {
-            Window(onCloseRequest = {}, state) {
-                window = this.window
-            }
-        }
+        launchApplication { Window(onCloseRequest = {}, state) { window = this.window } }
 
         awaitIdle()
         assertThat(window!!.center() maxDistance window!!.screenCenter() < 250)
@@ -238,45 +220,39 @@
     }
 
     @Test
-    fun `remember position after reattach`() = runApplicationTest(useDelay = isLinux) {
-        val state = WindowState(size = DpSize(200.dp, 200.dp))
-        var window1: ComposeWindow? = null
-        var window2: ComposeWindow? = null
-        var isWindow1 by mutableStateOf(true)
+    fun `remember position after reattach`() =
+        runApplicationTest(useDelay = isLinux) {
+            val state = WindowState(size = DpSize(200.dp, 200.dp))
+            var window1: ComposeWindow? = null
+            var window2: ComposeWindow? = null
+            var isWindow1 by mutableStateOf(true)
 
-        launchApplication {
-            if (isWindow1) {
-                Window(onCloseRequest = {}, state) {
-                    window1 = this.window
-                }
-            } else {
-                Window(onCloseRequest = {}, state) {
-                    window2 = this.window
+            launchApplication {
+                if (isWindow1) {
+                    Window(onCloseRequest = {}, state) { window1 = this.window }
+                } else {
+                    Window(onCloseRequest = {}, state) { window2 = this.window }
                 }
             }
+
+            awaitIdle()
+
+            state.position = WindowPosition(242.dp, 242.dp)
+            awaitIdle()
+            assertThat(window1?.location == Point(242, 242))
+
+            isWindow1 = false
+            awaitIdle()
+            assertThat(window2?.location == Point(242, 242))
+
+            exitApplication()
         }
 
-        awaitIdle()
-
-        state.position = WindowPosition(242.dp, 242.dp)
-        awaitIdle()
-        assertThat(window1?.location == Point(242, 242))
-
-        isWindow1 = false
-        awaitIdle()
-        assertThat(window2?.location == Point(242, 242))
-
-        exitApplication()
-    }
-
     @Test
     fun `state position should be specified after attach`() = runApplicationTest {
         val state = WindowState(size = DpSize(200.dp, 200.dp))
 
-        launchApplication {
-            Window(onCloseRequest = {}, state) {
-            }
-        }
+        launchApplication { Window(onCloseRequest = {}, state) {} }
 
         assertThat(state.position.isSpecified).isFalse()
 
@@ -287,67 +263,58 @@
     }
 
     @Test
-    fun `enter fullscreen`() = runApplicationTest(useDelay = isLinux) {
-        // TODO(demin): fix macOs. We disabled it because it is not deterministic.
-        //  If we set in skiko SkiaLayer.setFullscreen(true) then isFullscreen still returns false
-        assumeTrue(isWindows || isLinux)
+    fun `enter fullscreen`() =
+        runApplicationTest(useDelay = isLinux) {
+            // TODO(demin): fix macOs. We disabled it because it is not deterministic.
+            //  If we set in skiko SkiaLayer.setFullscreen(true) then isFullscreen still returns
+            // false
+            assumeTrue(isWindows || isLinux)
 
-        val state = WindowState(size = DpSize(200.dp, 200.dp))
-        var window: ComposeWindow? = null
+            val state = WindowState(size = DpSize(200.dp, 200.dp))
+            var window: ComposeWindow? = null
 
-        launchApplication {
-            Window(onCloseRequest = {}, state) {
-                window = this.window
-            }
+            launchApplication { Window(onCloseRequest = {}, state) { window = this.window } }
+
+            awaitIdle()
+
+            state.placement = WindowPlacement.Fullscreen
+            awaitIdle()
+            assertThat(window?.placement).isEqualTo(WindowPlacement.Fullscreen)
+
+            state.placement = WindowPlacement.Floating
+            awaitIdle()
+            assertThat(window?.placement).isEqualTo(WindowPlacement.Floating)
+
+            exitApplication()
         }
 
-        awaitIdle()
-
-        state.placement = WindowPlacement.Fullscreen
-        awaitIdle()
-        assertThat(window?.placement).isEqualTo(WindowPlacement.Fullscreen)
-
-        state.placement = WindowPlacement.Floating
-        awaitIdle()
-        assertThat(window?.placement).isEqualTo(WindowPlacement.Floating)
-
-        exitApplication()
-    }
-
     @Test
-    fun maximize() = runApplicationTest(useDelay = isLinux) {
-        val state = WindowState(size = DpSize(200.dp, 200.dp))
-        var window: ComposeWindow? = null
+    fun maximize() =
+        runApplicationTest(useDelay = isLinux) {
+            val state = WindowState(size = DpSize(200.dp, 200.dp))
+            var window: ComposeWindow? = null
 
-        launchApplication {
-            Window(onCloseRequest = {}, state) {
-                window = this.window
-            }
+            launchApplication { Window(onCloseRequest = {}, state) { window = this.window } }
+
+            awaitIdle()
+
+            state.placement = WindowPlacement.Maximized
+            awaitIdle()
+            assertThat(window?.placement).isEqualTo(WindowPlacement.Maximized)
+
+            state.placement = WindowPlacement.Floating
+            awaitIdle()
+            assertThat(window?.placement).isEqualTo(WindowPlacement.Floating)
+
+            exitApplication()
         }
 
-        awaitIdle()
-
-        state.placement = WindowPlacement.Maximized
-        awaitIdle()
-        assertThat(window?.placement).isEqualTo(WindowPlacement.Maximized)
-
-        state.placement = WindowPlacement.Floating
-        awaitIdle()
-        assertThat(window?.placement).isEqualTo(WindowPlacement.Floating)
-
-        exitApplication()
-    }
-
     @Test
     fun minimize() = runApplicationTest {
         val state = WindowState(size = DpSize(200.dp, 200.dp))
         var window: ComposeWindow? = null
 
-        launchApplication {
-            Window(onCloseRequest = {}, state) {
-                window = this.window
-            }
-        }
+        launchApplication { Window(onCloseRequest = {}, state) { window = this.window } }
 
         awaitIdle()
 
@@ -370,11 +337,7 @@
         val state = WindowState(size = DpSize(200.dp, 200.dp))
         var window: ComposeWindow? = null
 
-        launchApplication {
-            Window(onCloseRequest = {}, state) {
-                window = this.window
-            }
-        }
+        launchApplication { Window(onCloseRequest = {}, state) { window = this.window } }
 
         awaitIdle()
 
@@ -390,30 +353,25 @@
     @Test
     fun `restore size and position after maximize`() = runApplicationTest {
         // Swing/macOs can't re-change isMaximized in a deterministic way:
-//        fun main() = runBlocking(Dispatchers.Swing) {
-//            val window = ComposeWindow()
-//            window.size = Dimension(200, 200)
-//            window.isVisible = true
-//            window.isMaximized = true
-//            delay(100)
-//            window.isMaximized = false  // we cannot do that on macOs (window is still animating)
-//            delay(1000)
-//            println(window.isMaximized) // prints true
-//        }
-//        Swing/Linux has animations and sometimes adds an offset to the size/position
+        //        fun main() = runBlocking(Dispatchers.Swing) {
+        //            val window = ComposeWindow()
+        //            window.size = Dimension(200, 200)
+        //            window.isVisible = true
+        //            window.isMaximized = true
+        //            delay(100)
+        //            window.isMaximized = false  // we cannot do that on macOs (window is still
+        // animating)
+        //            delay(1000)
+        //            println(window.isMaximized) // prints true
+        //        }
+        //        Swing/Linux has animations and sometimes adds an offset to the size/position
         assumeTrue(isWindows)
 
-        val state = WindowState(
-            size = DpSize(201.dp, 203.dp),
-            position = WindowPosition(196.dp, 257.dp)
-        )
+        val state =
+            WindowState(size = DpSize(201.dp, 203.dp), position = WindowPosition(196.dp, 257.dp))
         var window: ComposeWindow? = null
 
-        launchApplication {
-            Window(onCloseRequest = {}, state) {
-                window = this.window
-            }
-        }
+        launchApplication { Window(onCloseRequest = {}, state) { window = this.window } }
 
         awaitIdle()
         assertThat(window?.size).isEqualTo(Dimension(201, 203))
@@ -436,20 +394,14 @@
 
     @Test
     fun `restore size and position after fullscreen`() = runApplicationTest {
-//        Swing/Linux has animations and sometimes adds an offset to the size/position
+        //        Swing/Linux has animations and sometimes adds an offset to the size/position
         assumeTrue(isWindows)
 
-        val state = WindowState(
-            size = DpSize(201.dp, 203.dp),
-            position = WindowPosition(196.dp, 257.dp)
-        )
+        val state =
+            WindowState(size = DpSize(201.dp, 203.dp), position = WindowPosition(196.dp, 257.dp))
         var window: ComposeWindow? = null
 
-        launchApplication {
-            Window(onCloseRequest = {}, state) {
-                window = this.window
-            }
-        }
+        launchApplication { Window(onCloseRequest = {}, state) { window = this.window } }
 
         awaitIdle()
         assertThat(window?.size).isEqualTo(Dimension(201, 203))
@@ -471,52 +423,47 @@
     }
 
     @Test
-    fun `maximize window before show`() = runApplicationTest(useDelay = isLinux) {
-        val state = WindowState(
-            size = DpSize(200.dp, 200.dp),
-            position = WindowPosition(Alignment.Center),
-            placement = WindowPlacement.Maximized,
-        )
-        var window: ComposeWindow? = null
+    fun `maximize window before show`() =
+        runApplicationTest(useDelay = isLinux) {
+            val state =
+                WindowState(
+                    size = DpSize(200.dp, 200.dp),
+                    position = WindowPosition(Alignment.Center),
+                    placement = WindowPlacement.Maximized,
+                )
+            var window: ComposeWindow? = null
 
-        launchApplication {
-            Window(onCloseRequest = {}, state) {
-                window = this.window
-            }
+            launchApplication { Window(onCloseRequest = {}, state) { window = this.window } }
+
+            awaitIdle()
+            assertThat(window?.placement).isEqualTo(WindowPlacement.Maximized)
+
+            exitApplication()
         }
 
-        awaitIdle()
-        assertThat(window?.placement).isEqualTo(WindowPlacement.Maximized)
-
-        exitApplication()
-    }
-
     @Test
     fun `minimize window before show`() = runApplicationTest {
         // Linux/macos doesn't support this:
-//        fun main() = runBlocking(Dispatchers.Swing) {
-//            val window = ComposeWindow()
-//            window.size = Dimension(200, 200)
-//            window.isMinimized = true
-//            window.isVisible = true
-//            delay(2000)
-//            println(window.isMinimized) // prints false
-//        }
+        //        fun main() = runBlocking(Dispatchers.Swing) {
+        //            val window = ComposeWindow()
+        //            window.size = Dimension(200, 200)
+        //            window.isMinimized = true
+        //            window.isVisible = true
+        //            delay(2000)
+        //            println(window.isMinimized) // prints false
+        //        }
         // TODO(demin): can we minimize after window.isVisible?
         assumeTrue(isWindows)
 
-        val state = WindowState(
-            size = DpSize(200.dp, 200.dp),
-            position = WindowPosition(Alignment.Center),
-            isMinimized = true
-        )
+        val state =
+            WindowState(
+                size = DpSize(200.dp, 200.dp),
+                position = WindowPosition(Alignment.Center),
+                isMinimized = true
+            )
         var window: ComposeWindow? = null
 
-        launchApplication {
-            Window(onCloseRequest = {}, state) {
-                window = this.window
-            }
-        }
+        launchApplication { Window(onCloseRequest = {}, state) { window = this.window } }
 
         awaitIdle()
         assertThat(window?.isMinimized).isTrue()
@@ -530,18 +477,15 @@
         //  showing the window)
         assumeTrue(isLinux || isWindows)
 
-        val state = WindowState(
-            size = DpSize(200.dp, 200.dp),
-            position = WindowPosition(Alignment.Center),
-            placement = WindowPlacement.Fullscreen,
-        )
+        val state =
+            WindowState(
+                size = DpSize(200.dp, 200.dp),
+                position = WindowPosition(Alignment.Center),
+                placement = WindowPlacement.Fullscreen,
+            )
         var window: ComposeWindow? = null
 
-        launchApplication {
-            Window(onCloseRequest = {}, state) {
-                window = this.window
-            }
-        }
+        launchApplication { Window(onCloseRequest = {}, state) { window = this.window } }
 
         awaitIdle()
         assertThat(window?.placement).isEqualTo(WindowPlacement.Fullscreen)
@@ -552,12 +496,13 @@
     @Test
     fun `save state`() = runApplicationTest {
         val initialState = WindowState()
-        val newState = WindowState(
-            placement = WindowPlacement.Maximized,
-            size = DpSize(42.dp, 42.dp),
-            position = WindowPosition(3.dp, 3.dp),
-            isMinimized = true,
-        )
+        val newState =
+            WindowState(
+                placement = WindowPlacement.Maximized,
+                size = DpSize(42.dp, 42.dp),
+                position = WindowPosition(3.dp, 3.dp),
+                isMinimized = true,
+            )
 
         var isOpen by mutableStateOf(true)
         var index by mutableStateOf(0)
@@ -606,120 +551,94 @@
     }
 
     @Test
-    fun `set window height by its content`() = runApplicationTest(useDelay = isLinux) {
-        lateinit var window: ComposeWindow
-        val state = WindowState(size = DpSize(300.dp, Dp.Unspecified))
+    fun `set window height by its content`() =
+        runApplicationTest(useDelay = isLinux) {
+            lateinit var window: ComposeWindow
+            val state = WindowState(size = DpSize(300.dp, Dp.Unspecified))
 
-        launchApplication {
-            Window(
-                onCloseRequest = ::exitApplication,
-                state = state
-            ) {
-                window = this.window
+            launchApplication {
+                Window(onCloseRequest = ::exitApplication, state = state) {
+                    window = this.window
 
-                Box(
-                    Modifier
-                        .width(400.dp)
-                        .height(200.dp)
-                )
+                    Box(Modifier.width(400.dp).height(200.dp))
+                }
             }
+
+            awaitIdle()
+            assertThat(window.width).isEqualTo(300)
+            assertThat(window.contentSize.height).isEqualTo(200)
+            assertThat(state.size).isEqualTo(DpSize(window.size.width.dp, window.size.height.dp))
+
+            exitApplication()
         }
 
-        awaitIdle()
-        assertThat(window.width).isEqualTo(300)
-        assertThat(window.contentSize.height).isEqualTo(200)
-        assertThat(state.size).isEqualTo(DpSize(window.size.width.dp, window.size.height.dp))
-
-        exitApplication()
-    }
-
     @Test
-    fun `set window width by its content`() = runApplicationTest(useDelay = isLinux) {
-        lateinit var window: ComposeWindow
-        val state = WindowState(size = DpSize(Dp.Unspecified, 300.dp))
+    fun `set window width by its content`() =
+        runApplicationTest(useDelay = isLinux) {
+            lateinit var window: ComposeWindow
+            val state = WindowState(size = DpSize(Dp.Unspecified, 300.dp))
 
-        launchApplication {
-            Window(
-                onCloseRequest = ::exitApplication,
-                state = state
-            ) {
-                window = this.window
+            launchApplication {
+                Window(onCloseRequest = ::exitApplication, state = state) {
+                    window = this.window
 
-                Box(
-                    Modifier
-                        .width(400.dp)
-                        .height(200.dp)
-                )
+                    Box(Modifier.width(400.dp).height(200.dp))
+                }
             }
+
+            awaitIdle()
+            assertThat(window.height).isEqualTo(300)
+            assertThat(window.contentSize.width).isEqualTo(400)
+            assertThat(state.size).isEqualTo(DpSize(window.size.width.dp, window.size.height.dp))
+
+            exitApplication()
         }
 
-        awaitIdle()
-        assertThat(window.height).isEqualTo(300)
-        assertThat(window.contentSize.width).isEqualTo(400)
-        assertThat(state.size).isEqualTo(DpSize(window.size.width.dp, window.size.height.dp))
-
-        exitApplication()
-    }
-
     @Test
-    fun `set window size by its content`() = runApplicationTest(useDelay = isLinux) {
-        lateinit var window: ComposeWindow
-        val state = WindowState(size = DpSize(Dp.Unspecified, Dp.Unspecified))
+    fun `set window size by its content`() =
+        runApplicationTest(useDelay = isLinux) {
+            lateinit var window: ComposeWindow
+            val state = WindowState(size = DpSize(Dp.Unspecified, Dp.Unspecified))
 
-        launchApplication {
-            Window(
-                onCloseRequest = ::exitApplication,
-                state = state
-            ) {
-                window = this.window
+            launchApplication {
+                Window(onCloseRequest = ::exitApplication, state = state) {
+                    window = this.window
 
-                Box(
-                    Modifier
-                        .width(400.dp)
-                        .height(200.dp)
-                )
+                    Box(Modifier.width(400.dp).height(200.dp))
+                }
             }
+
+            awaitIdle()
+            assertThat(window.contentSize).isEqualTo(Dimension(400, 200))
+            assertThat(state.size).isEqualTo(DpSize(window.size.width.dp, window.size.height.dp))
+
+            exitApplication()
         }
 
-        awaitIdle()
-        assertThat(window.contentSize).isEqualTo(Dimension(400, 200))
-        assertThat(state.size).isEqualTo(DpSize(window.size.width.dp, window.size.height.dp))
-
-        exitApplication()
-    }
-
     @Test
-    fun `set window size by its content when window is on the screen`() = runApplicationTest(
-        useDelay = isLinux
-    ) {
-        lateinit var window: ComposeWindow
-        val state = WindowState(size = DpSize(100.dp, 100.dp))
+    fun `set window size by its content when window is on the screen`() =
+        runApplicationTest(useDelay = isLinux) {
+            lateinit var window: ComposeWindow
+            val state = WindowState(size = DpSize(100.dp, 100.dp))
 
-        launchApplication {
-            Window(
-                onCloseRequest = ::exitApplication,
-                state = state
-            ) {
-                window = this.window
+            launchApplication {
+                Window(onCloseRequest = ::exitApplication, state = state) {
+                    window = this.window
 
-                Box(
-                    Modifier
-                        .width(400.dp)
-                        .height(200.dp)
-                )
+                    Box(Modifier.width(400.dp).height(200.dp))
+                }
             }
+
+            awaitIdle()
+
+            state.size = DpSize(Dp.Unspecified, Dp.Unspecified)
+            awaitIdle()
+            assertThat(window.contentSize).isEqualTo(Dimension(400, 200))
+            assertThat(state.size).isEqualTo(DpSize(window.size.width.dp, window.size.height.dp))
+
+            exitApplication()
         }
 
-        awaitIdle()
-
-        state.size = DpSize(Dp.Unspecified, Dp.Unspecified)
-        awaitIdle()
-        assertThat(window.contentSize).isEqualTo(Dimension(400, 200))
-        assertThat(state.size).isEqualTo(DpSize(window.size.width.dp, window.size.height.dp))
-
-        exitApplication()
-    }
-
     @Test
     fun `change visible`() = runApplicationTest {
         lateinit var window: ComposeWindow
@@ -727,9 +646,7 @@
         var visible by mutableStateOf(false)
 
         launchApplication {
-            Window(onCloseRequest = ::exitApplication, visible = visible) {
-                window = this.window
-            }
+            Window(onCloseRequest = ::exitApplication, visible = visible) { window = this.window }
         }
 
         awaitIdle()
@@ -750,11 +667,7 @@
 
         launchApplication {
             Window(onCloseRequest = ::exitApplication, visible = false) {
-                LaunchedEffect(Unit) {
-                    sendChannel.consumeEach {
-                        receivedNumbers.add(it)
-                    }
-                }
+                LaunchedEffect(Unit) { sendChannel.consumeEach { receivedNumbers.add(it) } }
             }
         }
 
@@ -777,11 +690,7 @@
 
         launchApplication {
             Window(onCloseRequest = ::exitApplication, visible = false, undecorated = true) {
-                LaunchedEffect(Unit) {
-                    sendChannel.consumeEach {
-                        receivedNumbers.add(it)
-                    }
-                }
+                LaunchedEffect(Unit) { sendChannel.consumeEach { receivedNumbers.add(it) } }
             }
         }
 
@@ -797,8 +706,9 @@
     }
 
     private val Window.contentSize
-        get() = Dimension(
-            size.width - insets.left - insets.right,
-            size.height - insets.top - insets.bottom,
-        )
+        get() =
+            Dimension(
+                size.width - insets.left - insets.right,
+                size.height - insets.top - insets.bottom,
+            )
 }
diff --git a/compose/ui/ui/src/desktopTest/kotlin/androidx/compose/ui/window/window/WindowTest.kt b/compose/ui/ui/src/desktopTest/kotlin/androidx/compose/ui/window/window/WindowTest.kt
index 1bc68ce..9ab99d6 100644
--- a/compose/ui/ui/src/desktopTest/kotlin/androidx/compose/ui/window/window/WindowTest.kt
+++ b/compose/ui/ui/src/desktopTest/kotlin/androidx/compose/ui/window/window/WindowTest.kt
@@ -63,21 +63,21 @@
         launchApplication {
             var isOpen by remember { mutableStateOf(true) }
 
-            fun createWindow() = ComposeWindow().apply {
-                size = Dimension(300, 200)
+            fun createWindow() =
+                ComposeWindow().apply {
+                    size = Dimension(300, 200)
 
-                addWindowListener(object : WindowAdapter() {
-                    override fun windowClosing(e: WindowEvent) {
-                        isOpen = false
-                    }
-                })
-            }
+                    addWindowListener(
+                        object : WindowAdapter() {
+                            override fun windowClosing(e: WindowEvent) {
+                                isOpen = false
+                            }
+                        }
+                    )
+                }
 
             if (isOpen) {
-                Window(
-                    create = ::createWindow,
-                    dispose = ComposeWindow::dispose
-                ) {
+                Window(create = ::createWindow, dispose = ComposeWindow::dispose) {
                     window = this.window
                     Box(Modifier.size(32.dp).background(Color.Red))
                 }
@@ -98,15 +98,18 @@
         var title by mutableStateOf("Title1")
 
         launchApplication {
-            fun createWindow() = ComposeWindow().apply {
-                size = Dimension(300, 200)
+            fun createWindow() =
+                ComposeWindow().apply {
+                    size = Dimension(300, 200)
 
-                addWindowListener(object : WindowAdapter() {
-                    override fun windowClosing(e: WindowEvent) {
-                        isOpen = false
-                    }
-                })
-            }
+                    addWindowListener(
+                        object : WindowAdapter() {
+                            override fun windowClosing(e: WindowEvent) {
+                                isOpen = false
+                            }
+                        }
+                    )
+                }
 
             if (isOpen) {
                 Window(
@@ -156,11 +159,7 @@
 
         launchApplication {
             if (isOpen) {
-                Window(
-                    onCloseRequest = {
-                        isCloseCalled = true
-                    }
-                ) {
+                Window(onCloseRequest = { isCloseCalled = true }) {
                     window = this.window
                     Box(Modifier.size(32.dp).background(Color.Red))
                 }
@@ -261,9 +260,10 @@
             if (isOpen) {
                 Window(
                     onCloseRequest = {},
-                    state = rememberWindowState(
-                        size = DpSize(600.dp, 600.dp),
-                    )
+                    state =
+                        rememberWindowState(
+                            size = DpSize(600.dp, 600.dp),
+                        )
                 ) {
                     window1 = this.window
                     Box(Modifier.size(32.dp).background(Color.Red))
@@ -271,9 +271,10 @@
                     if (isNestedOpen) {
                         Window(
                             onCloseRequest = {},
-                            state = rememberWindowState(
-                                size = DpSize(300.dp, 300.dp),
-                            )
+                            state =
+                                rememberWindowState(
+                                    size = DpSize(300.dp, 300.dp),
+                                )
                         ) {
                             window2 = this.window
                             Box(Modifier.size(32.dp).background(Color.Blue))
@@ -319,9 +320,10 @@
                 CompositionLocalProvider(*locals) {
                     Window(
                         onCloseRequest = {},
-                        state = rememberWindowState(
-                            size = DpSize(600.dp, 600.dp),
-                        )
+                        state =
+                            rememberWindowState(
+                                size = DpSize(600.dp, 600.dp),
+                            )
                     ) {
                         actualValue1 = local1TestValue.current
                         actualValue2 = local2TestValue.current
@@ -329,9 +331,10 @@
 
                         Window(
                             onCloseRequest = {},
-                            state = rememberWindowState(
-                                size = DpSize(300.dp, 300.dp),
-                            )
+                            state =
+                                rememberWindowState(
+                                    size = DpSize(300.dp, 300.dp),
+                                )
                         ) {
                             actualValue3 = local1TestValue.current
                             Box(Modifier.size(32.dp).background(Color.Blue))
@@ -385,9 +388,7 @@
                 Window(onCloseRequest = {}) {
                     DisposableEffect(Unit) {
                         initCount++
-                        onDispose {
-                            disposeCount++
-                        }
+                        onDispose { disposeCount++ }
                     }
                 }
             }
diff --git a/compose/ui/ui/src/jvmMain/kotlin/androidx/compose/ui/Actual.jvm.kt b/compose/ui/ui/src/jvmMain/kotlin/androidx/compose/ui/Actual.jvm.kt
index f85672e..d011e07 100644
--- a/compose/ui/ui/src/jvmMain/kotlin/androidx/compose/ui/Actual.jvm.kt
+++ b/compose/ui/ui/src/jvmMain/kotlin/androidx/compose/ui/Actual.jvm.kt
@@ -30,9 +30,7 @@
 
 // TODO: For non-JVM platforms, you can revive the kotlin-reflect implementation from
 //  https://android-review.googlesource.com/c/platform/frameworks/support/+/2441379
-internal actual fun InspectorInfo.tryPopulateReflectively(
-    element: ModifierNodeElement<*>
-) {
+internal actual fun InspectorInfo.tryPopulateReflectively(element: ModifierNodeElement<*>) {
     element.javaClass.declaredFields
         // Sort by the field name to make the result more well-defined
         .sortedBy { it.name }
diff --git a/compose/ui/ui/src/jvmMain/kotlin/androidx/compose/ui/platform/JvmActuals.jvm.kt b/compose/ui/ui/src/jvmMain/kotlin/androidx/compose/ui/platform/JvmActuals.jvm.kt
index 33bccf6..8966e6e 100644
--- a/compose/ui/ui/src/jvmMain/kotlin/androidx/compose/ui/platform/JvmActuals.jvm.kt
+++ b/compose/ui/ui/src/jvmMain/kotlin/androidx/compose/ui/platform/JvmActuals.jvm.kt
@@ -20,11 +20,13 @@
 internal actual typealias AtomicInt = java.util.concurrent.atomic.AtomicInteger
 
 internal actual fun simpleIdentityToString(obj: Any, name: String?): String {
-    val className = name ?: if (obj::class.java.isAnonymousClass) {
-        obj::class.java.name
-    } else {
-        obj::class.java.simpleName
-    }
+    val className =
+        name
+            ?: if (obj::class.java.isAnonymousClass) {
+                obj::class.java.name
+            } else {
+                obj::class.java.simpleName
+            }
 
     return className + "@" + String.format("%07x", System.identityHashCode(obj))
 }
diff --git a/compose/ui/ui/src/skikoMain/kotlin/androidx/compose/ui/ComposeScene.skiko.kt b/compose/ui/ui/src/skikoMain/kotlin/androidx/compose/ui/ComposeScene.skiko.kt
index 2f16c79..6d0611b 100644
--- a/compose/ui/ui/src/skikoMain/kotlin/androidx/compose/ui/ComposeScene.skiko.kt
+++ b/compose/ui/ui/src/skikoMain/kotlin/androidx/compose/ui/ComposeScene.skiko.kt
@@ -56,9 +56,10 @@
 import kotlinx.coroutines.launch
 import org.jetbrains.skia.Canvas
 
-internal val LocalComposeScene = staticCompositionLocalOf<ComposeScene> {
-    error("CompositionLocal LocalComposeScene not provided")
-}
+internal val LocalComposeScene =
+    staticCompositionLocalOf<ComposeScene> {
+        error("CompositionLocal LocalComposeScene not provided")
+    }
 
 /**
  * A virtual container that encapsulates Compose UI content. UI content can be constructed via
@@ -68,10 +69,11 @@
  *
  * To specify available size for the content, you should use [constraints].
  *
- * After [ComposeScene] will no longer needed, you should call [close] method, so all resources
- * and subscriptions will be properly closed. Otherwise there can be a memory leak.
+ * After [ComposeScene] will no longer needed, you should call [close] method, so all resources and
+ * subscriptions will be properly closed. Otherwise there can be a memory leak.
  */
-class ComposeScene internal constructor(
+class ComposeScene
+internal constructor(
     coroutineContext: CoroutineContext = Dispatchers.Unconfined,
     internal val component: PlatformComponent,
     density: Density = Density(1f),
@@ -81,34 +83,30 @@
      * Constructs [ComposeScene]
      *
      * @param coroutineContext Context which will be used to launch effects ([LaunchedEffect],
-     * [rememberCoroutineScope]) and run recompositions.
+     *   [rememberCoroutineScope]) and run recompositions.
      * @param density Initial density of the content which will be used to convert [dp] units.
      * @param invalidate Callback which will be called when the content need to be recomposed or
-     * rerendered. If you draw your content using [render] method, in this callback you should
-     * schedule the next [render] in your rendering loop.
+     *   rerendered. If you draw your content using [render] method, in this callback you should
+     *   schedule the next [render] in your rendering loop.
      */
     constructor(
         coroutineContext: CoroutineContext = Dispatchers.Unconfined,
         density: Density = Density(1f),
         invalidate: () -> Unit = {}
-    ) : this(
-        coroutineContext,
-        DummyPlatformComponent,
-        density,
-        invalidate
-    )
+    ) : this(coroutineContext, DummyPlatformComponent, density, invalidate)
 
     private var isInvalidationDisabled = false
 
-    @Volatile
-    private var hasPendingDraws = true
+    @Volatile private var hasPendingDraws = true
+
     private inline fun <T> postponeInvalidation(block: () -> T): T {
         isInvalidationDisabled = true
-        val result = try {
-            block()
-        } finally {
-            isInvalidationDisabled = false
-        }
+        val result =
+            try {
+                block()
+            } finally {
+                isInvalidationDisabled = false
+            }
         invalidateIfNeeded()
         return result
     }
@@ -130,11 +128,12 @@
     }
 
     /**
-     * All currently registered [RootForTest]s. After calling [setContent] the first root
-     * will be added. If there is an any [Popup] is present in the content, it will be added as
-     * another [RootForTest]
+     * All currently registered [RootForTest]s. After calling [setContent] the first root will be
+     * added. If there is an any [Popup] is present in the content, it will be added as another
+     * [RootForTest]
      */
-    val roots: Set<RootForTest> get() = list
+    val roots: Set<RootForTest>
+        get() = list
 
     private val defaultPointerStateTracker = DefaultPointerStateTracker()
 
@@ -156,9 +155,7 @@
     internal var mainOwner: SkiaBasedOwner? = null
     private var composition: Composition? = null
 
-    /**
-     * Density of the content which will be used to convert [dp] units.
-     */
+    /** Density of the content which will be used to convert [dp] units. */
     var density: Density = density
         set(value) {
             check(!isClosed) { "ComposeScene is closed" }
@@ -182,8 +179,8 @@
      * Close all resources and subscriptions. Not calling this method when [ComposeScene] is no
      * longer needed will cause a memory leak.
      *
-     * All effects launched via [LaunchedEffect] or [rememberCoroutineScope] will be cancelled
-     * (but not immediately).
+     * All effects launched via [LaunchedEffect] or [rememberCoroutineScope] will be cancelled (but
+     * not immediately).
      *
      * After calling this method, you cannot call any other method of this [ComposeScene].
      */
@@ -196,19 +193,18 @@
     }
 
     private fun dispatchCommand(command: () -> Unit) {
-        coroutineScope.launch {
-            command()
-        }
+        coroutineScope.launch { command() }
     }
 
     /**
-     * Returns true if there are pending recompositions, renders or dispatched tasks.
-     * Can be called from any thread.
+     * Returns true if there are pending recompositions, renders or dispatched tasks. Can be called
+     * from any thread.
      */
-    fun hasInvalidations() = hasPendingDraws ||
-        recomposer.hasPendingWork ||
-        effectDispatcher.hasTasks() ||
-        recomposeDispatcher.hasTasks()
+    fun hasInvalidations() =
+        hasPendingDraws ||
+            recomposer.hasPendingWork ||
+            effectDispatcher.hasTasks() ||
+            recomposeDispatcher.hasTasks()
 
     internal fun attach(owner: SkiaBasedOwner) {
         check(!isClosed) { "ComposeScene is closed" }
@@ -216,10 +212,7 @@
         owner.onNeedRender = ::invalidateIfNeeded
         owner.onDispatchCommand = ::dispatchCommand
         owner.constraints = constraints
-        owner.accessibilityController = makeAccessibilityController(
-            owner,
-            component
-        )
+        owner.accessibilityController = makeAccessibilityController(owner, component)
         invalidateIfNeeded()
         if (owner.isFocusable) {
             focusedOwner = owner
@@ -238,20 +231,16 @@
     }
 
     /**
-     * Update the composition with the content described by the [content] composable. After this
-     * has been called the changes to produce the initial composition has been calculated and
-     * applied to the composition.
+     * Update the composition with the content described by the [content] composable. After this has
+     * been called the changes to produce the initial composition has been calculated and applied to
+     * the composition.
      *
      * Will throw an [IllegalStateException] if the composition has been disposed.
      *
      * @param content Content of the [ComposeScene]
      */
-    fun setContent(
-        content: @Composable () -> Unit
-    ) = setContent(
-        parentComposition = null,
-        content = content
-    )
+    fun setContent(content: @Composable () -> Unit) =
+        setContent(parentComposition = null, content = content)
 
     // TODO(demin): We should configure routing of key events if there
     //  are any popups/root present:
@@ -275,41 +264,34 @@
         check(!isClosed) { "ComposeScene is closed" }
         composition?.dispose()
         mainOwner?.dispose()
-        val mainOwner = SkiaBasedOwner(
-            platformInputService = platformInputService,
-            component = component,
-            density = density,
-            coroutineContext = recomposer.effectCoroutineContext,
-            onPreviewKeyEvent = onPreviewKeyEvent,
-            onKeyEvent = onKeyEvent
-        )
-        attach(mainOwner)
-        composition = mainOwner.setContent(parentComposition ?: recomposer) {
-            CompositionLocalProvider(
-                LocalComposeScene provides this,
-                content = content
+        val mainOwner =
+            SkiaBasedOwner(
+                platformInputService = platformInputService,
+                component = component,
+                density = density,
+                coroutineContext = recomposer.effectCoroutineContext,
+                onPreviewKeyEvent = onPreviewKeyEvent,
+                onKeyEvent = onKeyEvent
             )
-        }
+        attach(mainOwner)
+        composition =
+            mainOwner.setContent(parentComposition ?: recomposer) {
+                CompositionLocalProvider(LocalComposeScene provides this, content = content)
+            }
         this.mainOwner = mainOwner
 
         // to perform all pending work synchronously. to start LaunchedEffect for example
         recomposeDispatcher.flush()
     }
 
-    /**
-     * Set constraints, which will be used to measure and layout content.
-     */
+    /** Set constraints, which will be used to measure and layout content. */
     var constraints: Constraints = Constraints()
         set(value) {
             field = value
-            forEachOwner {
-                it.constraints = constraints
-            }
+            forEachOwner { it.constraints = constraints }
         }
 
-    /**
-     * Returns the current content size
-     */
+    /** Returns the current content size */
     val contentSize: IntSize
         get() {
             check(!isClosed) { "ComposeScene is closed" }
@@ -330,9 +312,7 @@
             recomposeDispatcher.flush()
             frameClock.sendFrame(nanoTime)
 
-            forEachOwner {
-                it.render(canvas)
-            }
+            forEachOwner { it.render(canvas) }
         }
     }
 
@@ -345,9 +325,8 @@
     private val hoveredOwner: SkiaBasedOwner?
         get() = list.lastOrNull { it.isHovered(pointLocation) } ?: list.lastOrNull()
 
-    private fun SkiaBasedOwner?.isAbove(
-        targetOwner: SkiaBasedOwner?
-    ) = list.indexOf(this) > list.indexOf(targetOwner)
+    private fun SkiaBasedOwner?.isAbove(targetOwner: SkiaBasedOwner?) =
+        list.indexOf(this) > list.indexOf(targetOwner)
 
     // TODO(demin): return Boolean (when it is consumed).
     //  see ComposeLayer todo about AWTDebounceEventQueue
@@ -357,13 +336,13 @@
      * @param eventType Indicates the primary reason that the event was sent.
      * @param position The [Offset] of the current pointer event, relative to the content.
      * @param scrollDelta scroll delta for the PointerEventType.Scroll event
-     * @param timeMillis The time of the current pointer event, in milliseconds. The start (`0`) time
-     * is platform-dependent.
-     * @param type The device type that produced the event, such as [mouse][PointerType.Mouse],
-     * or [touch][PointerType.Touch].
+     * @param timeMillis The time of the current pointer event, in milliseconds. The start (`0`)
+     *   time is platform-dependent.
+     * @param type The device type that produced the event, such as [mouse][PointerType.Mouse], or
+     *   [touch][PointerType.Touch].
      * @param buttons Contains the state of pointer buttons (e.g. mouse and stylus buttons).
-     * @param keyboardModifiers Contains the state of modifier keys, such as Shift, Control,
-     * and Alt, as well as the state of the lock keys, such as Caps Lock and Num Lock.
+     * @param keyboardModifiers Contains the state of modifier keys, such as Shift, Control, and
+     *   Alt, as well as the state of the lock keys, such as Caps Lock and Num Lock.
      * @param nativeEvent The original native event.
      */
     @OptIn(ExperimentalComposeUiApi::class)
@@ -388,18 +367,19 @@
             PointerEventType.Press -> isMousePressed = true
             PointerEventType.Release -> isMousePressed = false
         }
-        val event = pointerInputEvent(
-            eventType,
-            position,
-            timeMillis,
-            nativeEvent,
-            type,
-            isMousePressed,
-            pointerId,
-            scrollDelta,
-            actualButtons,
-            actualKeyboardModifiers
-        )
+        val event =
+            pointerInputEvent(
+                eventType,
+                position,
+                timeMillis,
+                nativeEvent,
+                type,
+                isMousePressed,
+                pointerId,
+                scrollDelta,
+                actualButtons,
+                actualKeyboardModifiers
+            )
         when (eventType) {
             PointerEventType.Press -> onMousePressed(event)
             PointerEventType.Release -> onMouseReleased(event)
@@ -436,6 +416,7 @@
 
     /**
      * Send [KeyEvent] to the content.
+     *
      * @return true if the event was consumed by the content
      */
     fun sendKeyEvent(event: ComposeKeyEvent): Boolean = postponeInvalidation {
diff --git a/compose/ui/ui/src/skikoMain/kotlin/androidx/compose/ui/input/mouse/MouseScrollFilter.skiko.kt b/compose/ui/ui/src/skikoMain/kotlin/androidx/compose/ui/input/mouse/MouseScrollFilter.skiko.kt
index 04371f1..49a7340 100644
--- a/compose/ui/ui/src/skikoMain/kotlin/androidx/compose/ui/input/mouse/MouseScrollFilter.skiko.kt
+++ b/compose/ui/ui/src/skikoMain/kotlin/androidx/compose/ui/input/mouse/MouseScrollFilter.skiko.kt
@@ -30,12 +30,9 @@
 import androidx.compose.ui.unit.IntSize
 import java.awt.event.MouseWheelEvent
 
-/**
- * Indicates distance by which we should scroll some container.
- */
+/** Indicates distance by which we should scroll some container. */
 @Deprecated(
-    "Use Modifier.pointerInput + PointerEventType.Scroll." +
-        "See the comment to mouseScrollFilter"
+    "Use Modifier.pointerInput + PointerEventType.Scroll." + "See the comment to mouseScrollFilter"
 )
 sealed class MouseScrollUnit {
     /**
@@ -44,8 +41,8 @@
      * On different platforms one tick of wheel rotation may cause different [value].
      *
      * Scrolling by one line usually means that we should scroll by some fixed offset, or by offset
-     * dependent on the container's bounds (in which scroll event occurs),
-     * or by one real text line in some document.
+     * dependent on the container's bounds (in which scroll event occurs), or by one real text line
+     * in some document.
      */
     @Deprecated(
         "Use Modifier.pointerInput + PointerEventType.Scroll." +
@@ -58,8 +55,8 @@
      *
      * Some platforms don't emit scrolling events by Page units.
      *
-     * Scrolling by one page usually means that we should scroll by one container's height
-     * (in which scroll event occurs), or by one real page in some document.
+     * Scrolling by one page usually means that we should scroll by one container's height (in which
+     * scroll event occurs), or by one real page in some document.
      */
     @Deprecated(
         "Use Modifier.pointerInput + PointerEventType.Scroll." +
@@ -68,12 +65,9 @@
     data class Page(val value: Float) : MouseScrollUnit()
 }
 
-/**
- * Mouse wheel or touchpad event.
- */
+/** Mouse wheel or touchpad event. */
 @Deprecated(
-    "Use Modifier.pointerInput + PointerEventType.Scroll." +
-    "See the comment to mouseScrollFilter"
+    "Use Modifier.pointerInput + PointerEventType.Scroll." + "See the comment to mouseScrollFilter"
 )
 class MouseScrollEvent(
     /**
@@ -86,8 +80,8 @@
     /**
      * Orientation in which scrolling event occurs.
      *
-     * Up/down wheel scrolling causes events in vertical orientation.
-     * Left/right wheel scrolling causes events in horizontal orientation.
+     * Up/down wheel scrolling causes events in vertical orientation. Left/right wheel scrolling
+     * causes events in horizontal orientation.
      */
     val orientation: MouseScrollOrientation
 )
@@ -97,65 +91,63 @@
 //  or Modifier.pointerInput(Unit) { scroll { delta: Offset ->  } }
 //  ?
 /**
- * Adding this [modifier][Modifier] to the [modifier][Modifier] parameter of a component will
- * allow it to intercept scroll events from mouse wheel and touchpad.
+ * Adding this [modifier][Modifier] to the [modifier][Modifier] parameter of a component will allow
+ * it to intercept scroll events from mouse wheel and touchpad.
  *
  * @param onMouseScroll This callback is invoked when the user interacts with the mouse wheel or
- * touchpad.
- * While implementing this callback, return true to stop propagation of this event. If you return
- * false, the scroll event will be sent to this [mouseScrollFilter]'s parent.
+ *   touchpad. While implementing this callback, return true to stop propagation of this event. If
+ *   you return false, the scroll event will be sent to this [mouseScrollFilter]'s parent.
  */
 @Deprecated(
     "Use Modifier.pointerInput + PointerEventType.Scroll",
-    replaceWith = ReplaceWith(
-        "pointerInput(Unit) { \n" +
-        "     awaitPointerEventScope {\n" +
-        "         while (true) {\n" +
-        "             val event = awaitPointerEvent()\n" +
-        "             if (event.type == PointerEventType.Scroll) {\n" +
-        "                 val scrollDelta = event.changes.first().scrollDelta\n" +
-        "                 val bounds = this.size\n" +
-        "                 if (onMouseScroll(scrollDelta, bounds)) {\n" +
-        "                      event.changes.first().consume()\n" +
-        "                 }\n" +
-        "             }\n" +
-        "         }\n" +
-        "     }\n" +
-        "}",
-        "androidx.compose.ui.input.pointer.pointerInput"
-    )
+    replaceWith =
+        ReplaceWith(
+            "pointerInput(Unit) { \n" +
+                "     awaitPointerEventScope {\n" +
+                "         while (true) {\n" +
+                "             val event = awaitPointerEvent()\n" +
+                "             if (event.type == PointerEventType.Scroll) {\n" +
+                "                 val scrollDelta = event.changes.first().scrollDelta\n" +
+                "                 val bounds = this.size\n" +
+                "                 if (onMouseScroll(scrollDelta, bounds)) {\n" +
+                "                      event.changes.first().consume()\n" +
+                "                 }\n" +
+                "             }\n" +
+                "         }\n" +
+                "     }\n" +
+                "}",
+            "androidx.compose.ui.input.pointer.pointerInput"
+        )
 )
 fun Modifier.mouseScrollFilter(
-    onMouseScroll: (
-        /**
-         * Mouse wheel or touchpad event.
-         */
-        event: MouseScrollEvent,
+    onMouseScroll:
+        (
+            /** Mouse wheel or touchpad event. */
+            event: MouseScrollEvent,
 
-        /**
-         * Bounds of the container in which scroll event occurs.
-         */
-        bounds: IntSize
-    ) -> Boolean
-): Modifier = pointerInput(onMouseScroll) {
-    // we don't wrap entire loop into awaitPointerEventScope, because we want to skip
-    // scroll events, which were send after the first scroll event in the current frame
-    // (so there will be no more than one scroll event per frame)
+            /** Bounds of the container in which scroll event occurs. */
+            bounds: IntSize
+        ) -> Boolean
+): Modifier =
+    pointerInput(onMouseScroll) {
+        // we don't wrap entire loop into awaitPointerEventScope, because we want to skip
+        // scroll events, which were send after the first scroll event in the current frame
+        // (so there will be no more than one scroll event per frame)
 
-    // TODO(https://github.com/JetBrains/compose-jb/issues/1345):
-    //  the more proper behaviour would be to batch multiple scroll events into the single one
-    while (true) {
-        val event = awaitScrollEvent()
-        val mouseEvent = event.mouseEvent as? MouseWheelEvent
-        val mouseChange = event.changes.find { it.type == PointerType.Mouse }
-        if (mouseChange != null && !mouseChange.isConsumed) {
-            val legacyEvent = mouseEvent.toLegacyEvent(mouseChange.scrollDelta)
-            if (onMouseScroll(legacyEvent, size)) {
-                mouseChange.consume()
+        // TODO(https://github.com/JetBrains/compose-jb/issues/1345):
+        //  the more proper behaviour would be to batch multiple scroll events into the single one
+        while (true) {
+            val event = awaitScrollEvent()
+            val mouseEvent = event.mouseEvent as? MouseWheelEvent
+            val mouseChange = event.changes.find { it.type == PointerType.Mouse }
+            if (mouseChange != null && !mouseChange.isConsumed) {
+                val legacyEvent = mouseEvent.toLegacyEvent(mouseChange.scrollDelta)
+                if (onMouseScroll(legacyEvent, size)) {
+                    mouseChange.consume()
+                }
             }
         }
     }
-}
 
 private suspend fun PointerInputScope.awaitScrollEvent() = awaitPointerEventScope {
     var event: PointerEvent
@@ -170,23 +162,25 @@
     val scrollType = this?.scrollType ?: MouseWheelEvent.WHEEL_UNIT_SCROLL
     val scrollAmount = this?.scrollAmount ?: 1
     return MouseScrollEvent(
-        delta = if (scrollType == MouseWheelEvent.WHEEL_BLOCK_SCROLL) {
-            MouseScrollUnit.Page(value * scrollAmount)
-        } else {
-            MouseScrollUnit.Line(value * scrollAmount)
-        },
-        orientation = if (scrollDelta.x != 0f) {
-            MouseScrollOrientation.Horizontal
-        } else {
-            MouseScrollOrientation.Vertical
-        }
+        delta =
+            if (scrollType == MouseWheelEvent.WHEEL_BLOCK_SCROLL) {
+                MouseScrollUnit.Page(value * scrollAmount)
+            } else {
+                MouseScrollUnit.Line(value * scrollAmount)
+            },
+        orientation =
+            if (scrollDelta.x != 0f) {
+                MouseScrollOrientation.Horizontal
+            } else {
+                MouseScrollOrientation.Vertical
+            }
     )
 }
 
 @Deprecated(
-    "Use Modifier.pointerInput + PointerEventType.Scroll." +
-        "See the comment to mouseScrollFilter"
+    "Use Modifier.pointerInput + PointerEventType.Scroll." + "See the comment to mouseScrollFilter"
 )
 enum class MouseScrollOrientation {
-    Vertical, Horizontal
+    Vertical,
+    Horizontal
 }
diff --git a/compose/ui/ui/src/skikoMain/kotlin/androidx/compose/ui/input/pointer/TestPointerInputEventData.skiko.kt b/compose/ui/ui/src/skikoMain/kotlin/androidx/compose/ui/input/pointer/TestPointerInputEventData.skiko.kt
index 92eac76..612a651 100644
--- a/compose/ui/ui/src/skikoMain/kotlin/androidx/compose/ui/input/pointer/TestPointerInputEventData.skiko.kt
+++ b/compose/ui/ui/src/skikoMain/kotlin/androidx/compose/ui/input/pointer/TestPointerInputEventData.skiko.kt
@@ -20,9 +20,7 @@
 import androidx.compose.ui.InternalComposeUiApi
 import androidx.compose.ui.geometry.Offset
 
-/**
- * This exposes PointerInputEventData for testing purposes.
- */
+/** This exposes PointerInputEventData for testing purposes. */
 @InternalComposeUiApi
 class TestPointerInputEventData(
     val id: PointerId,
diff --git a/compose/ui/ui/src/skikoMain/kotlin/androidx/compose/ui/platform/AccessibilityController.skiko.kt b/compose/ui/ui/src/skikoMain/kotlin/androidx/compose/ui/platform/AccessibilityController.skiko.kt
index 14792b0..2ba28b7 100644
--- a/compose/ui/ui/src/skikoMain/kotlin/androidx/compose/ui/platform/AccessibilityController.skiko.kt
+++ b/compose/ui/ui/src/skikoMain/kotlin/androidx/compose/ui/platform/AccessibilityController.skiko.kt
@@ -27,16 +27,13 @@
     fun onSemanticsChange()
 
     /**
-     * Action to trigger when the position and/or size of the
-     * [layoutNode] was changed to update semantic tree.
+     * Action to trigger when the position and/or size of the [layoutNode] was changed to update
+     * semantic tree.
      *
      * @see androidx.compose.ui.node.Owner.onLayoutChange
      */
     fun onLayoutChange(layoutNode: LayoutNode)
 
-    /**
-     * Start a background job to sync semantic nodes with their
-     * platform-specific counterparts.
-     */
+    /** Start a background job to sync semantic nodes with their platform-specific counterparts. */
     suspend fun syncLoop()
 }
diff --git a/compose/ui/ui/src/skikoMain/kotlin/androidx/compose/ui/platform/DefaultHapticFeedback.skiko.kt b/compose/ui/ui/src/skikoMain/kotlin/androidx/compose/ui/platform/DefaultHapticFeedback.skiko.kt
index 83652f7..0ad9f7f 100644
--- a/compose/ui/ui/src/skikoMain/kotlin/androidx/compose/ui/platform/DefaultHapticFeedback.skiko.kt
+++ b/compose/ui/ui/src/skikoMain/kotlin/androidx/compose/ui/platform/DefaultHapticFeedback.skiko.kt
@@ -21,6 +21,5 @@
 
 // TODO(demin): implement HapticFeedback
 internal class DefaultHapticFeedback : HapticFeedback {
-    override fun performHapticFeedback(hapticFeedbackType: HapticFeedbackType) {
-    }
+    override fun performHapticFeedback(hapticFeedbackType: HapticFeedbackType) {}
 }
diff --git a/compose/ui/ui/src/skikoMain/kotlin/androidx/compose/ui/platform/DefaultTextToolbar.skiko.kt b/compose/ui/ui/src/skikoMain/kotlin/androidx/compose/ui/platform/DefaultTextToolbar.skiko.kt
index 05b98f3..07ed7c0 100644
--- a/compose/ui/ui/src/skikoMain/kotlin/androidx/compose/ui/platform/DefaultTextToolbar.skiko.kt
+++ b/compose/ui/ui/src/skikoMain/kotlin/androidx/compose/ui/platform/DefaultTextToolbar.skiko.kt
@@ -23,8 +23,7 @@
     override val status: TextToolbarStatus
         get() = TextToolbarStatus.Hidden
 
-    override fun hide() {
-    }
+    override fun hide() {}
 
     override fun showMenu(
         rect: Rect,
@@ -32,6 +31,5 @@
         onPasteRequested: (() -> Unit)?,
         onCutRequested: (() -> Unit)?,
         onSelectAllRequested: (() -> Unit)?
-    ) {
-    }
+    ) {}
 }
diff --git a/compose/ui/ui/src/skikoMain/kotlin/androidx/compose/ui/platform/DefaultUiApplier.skiko.kt b/compose/ui/ui/src/skikoMain/kotlin/androidx/compose/ui/platform/DefaultUiApplier.skiko.kt
index 579f42e..08fc06a 100644
--- a/compose/ui/ui/src/skikoMain/kotlin/androidx/compose/ui/platform/DefaultUiApplier.skiko.kt
+++ b/compose/ui/ui/src/skikoMain/kotlin/androidx/compose/ui/platform/DefaultUiApplier.skiko.kt
@@ -19,9 +19,7 @@
 import androidx.compose.runtime.AbstractApplier
 import androidx.compose.ui.node.LayoutNode
 
-internal class DefaultUiApplier(
-    root: LayoutNode
-) : AbstractApplier<LayoutNode>(root) {
+internal class DefaultUiApplier(root: LayoutNode) : AbstractApplier<LayoutNode>(root) {
     override fun insertTopDown(index: Int, instance: LayoutNode) {
         // ignored. Building tree bottom-up
     }
diff --git a/compose/ui/ui/src/skikoMain/kotlin/androidx/compose/ui/platform/FlushCoroutineDispatcher.skiko.kt b/compose/ui/ui/src/skikoMain/kotlin/androidx/compose/ui/platform/FlushCoroutineDispatcher.skiko.kt
index e058161..e5207d0 100644
--- a/compose/ui/ui/src/skikoMain/kotlin/androidx/compose/ui/platform/FlushCoroutineDispatcher.skiko.kt
+++ b/compose/ui/ui/src/skikoMain/kotlin/androidx/compose/ui/platform/FlushCoroutineDispatcher.skiko.kt
@@ -25,46 +25,37 @@
 import kotlinx.coroutines.launch
 
 /**
- * Dispatcher with the ability to immediately perform (flush) all pending tasks.
- * Without a flush all tasks are dispatched in the dispatcher provided by [scope]
+ * Dispatcher with the ability to immediately perform (flush) all pending tasks. Without a flush all
+ * tasks are dispatched in the dispatcher provided by [scope]
  */
-internal class FlushCoroutineDispatcher(
-    scope: CoroutineScope
-) : CoroutineDispatcher() {
+internal class FlushCoroutineDispatcher(scope: CoroutineScope) : CoroutineDispatcher() {
     // Dispatcher should always be alive, even if Job is cancelled. Otherwise coroutines which
     // use this dispatcher won't be properly cancelled.
     // TODO replace it by scope.coroutineContext[Dispatcher] when it will be no longer experimental
     private val scope = CoroutineScope(scope.coroutineContext.minusKey(Job))
     private val tasks = mutableSetOf<Runnable>()
     private val tasksCopy = mutableSetOf<Runnable>()
-    @Volatile
-    private var isPerformingRun = false
+    @Volatile private var isPerformingRun = false
     private val runLock = Any()
+
     override fun dispatch(context: CoroutineContext, block: Runnable) {
-        synchronized(tasks) {
-            tasks.add(block)
-        }
+        synchronized(tasks) { tasks.add(block) }
         scope.launch {
             performRun {
-                val isTaskAlive = synchronized(tasks) {
-                    tasks.remove(block)
-                }
+                val isTaskAlive = synchronized(tasks) { tasks.remove(block) }
                 if (isTaskAlive) {
                     block.run()
                 }
             }
         }
     }
-    /**
-     * Does the dispatcher have any tasks scheduled or currently in progress
-     */
-    fun hasTasks() = synchronized(tasks) {
-        tasks.isNotEmpty()
-    } && !isPerformingRun
+
+    /** Does the dispatcher have any tasks scheduled or currently in progress */
+    fun hasTasks() = synchronized(tasks) { tasks.isNotEmpty() } && !isPerformingRun
 
     /**
-     * Perform all scheduled tasks and wait for the tasks which are already
-     * performing in the [scope]
+     * Perform all scheduled tasks and wait for the tasks which are already performing in the
+     * [scope]
      */
     fun flush() = performRun {
         synchronized(tasks) {
@@ -76,12 +67,13 @@
     }
 
     // the lock is needed to be certain that all tasks will be completed after `flush` method
-    private fun performRun(body: () -> Unit) = synchronized(runLock) {
-        try {
-            isPerformingRun = true
-            body()
-        } finally {
-            isPerformingRun = false
+    private fun performRun(body: () -> Unit) =
+        synchronized(runLock) {
+            try {
+                isPerformingRun = true
+                body()
+            } finally {
+                isPerformingRun = false
+            }
         }
-    }
 }
diff --git a/compose/ui/ui/src/skikoMain/kotlin/androidx/compose/ui/platform/GlobalSnapshotManager.skiko.kt b/compose/ui/ui/src/skikoMain/kotlin/androidx/compose/ui/platform/GlobalSnapshotManager.skiko.kt
index d011e09..b408b88 100644
--- a/compose/ui/ui/src/skikoMain/kotlin/androidx/compose/ui/platform/GlobalSnapshotManager.skiko.kt
+++ b/compose/ui/ui/src/skikoMain/kotlin/androidx/compose/ui/platform/GlobalSnapshotManager.skiko.kt
@@ -17,15 +17,15 @@
 package androidx.compose.ui.platform
 
 /**
- * Platform-specific mechanism for starting a monitor of global snapshot state writes
- * in order to schedule the periodic dispatch of snapshot apply notifications.
- * This process should remain platform-specific; it is tied to the threading and update model of
- * a particular platform and framework target.
+ * Platform-specific mechanism for starting a monitor of global snapshot state writes in order to
+ * schedule the periodic dispatch of snapshot apply notifications. This process should remain
+ * platform-specific; it is tied to the threading and update model of a particular platform and
+ * framework target.
  *
  * Composition bootstrapping mechanisms for a particular platform/framework should call
- * [ensureStarted] during setup to initialize periodic global snapshot notifications.
- * For desktop, these notifications are always sent on [Dispatchers.Swing]. Other platforms
- * may establish different policies for these notifications.
+ * [ensureStarted] during setup to initialize periodic global snapshot notifications. For desktop,
+ * these notifications are always sent on [Dispatchers.Swing]. Other platforms may establish
+ * different policies for these notifications.
  */
 internal expect object GlobalSnapshotManager {
     fun ensureStarted()
diff --git a/compose/ui/ui/src/skikoMain/kotlin/androidx/compose/ui/platform/PlatformClipboardManager.skiko.kt b/compose/ui/ui/src/skikoMain/kotlin/androidx/compose/ui/platform/PlatformClipboardManager.skiko.kt
index 6ec70a51..7804d18 100644
--- a/compose/ui/ui/src/skikoMain/kotlin/androidx/compose/ui/platform/PlatformClipboardManager.skiko.kt
+++ b/compose/ui/ui/src/skikoMain/kotlin/androidx/compose/ui/platform/PlatformClipboardManager.skiko.kt
@@ -20,5 +20,6 @@
 
 internal expect class PlatformClipboardManager() : ClipboardManager {
     override fun getText(): AnnotatedString?
+
     override fun setText(annotatedString: AnnotatedString)
 }
diff --git a/compose/ui/ui/src/skikoMain/kotlin/androidx/compose/ui/platform/PlatformInput.skiko.kt b/compose/ui/ui/src/skikoMain/kotlin/androidx/compose/ui/platform/PlatformInput.skiko.kt
index c8b35ba..c627e0a 100644
--- a/compose/ui/ui/src/skikoMain/kotlin/androidx/compose/ui/platform/PlatformInput.skiko.kt
+++ b/compose/ui/ui/src/skikoMain/kotlin/androidx/compose/ui/platform/PlatformInput.skiko.kt
@@ -26,5 +26,4 @@
     ): Nothing
 }
 
-internal expect class PlatformInput(component: PlatformComponent) :
-    PlatformTextInputService
+internal expect class PlatformInput(component: PlatformComponent) : PlatformTextInputService
diff --git a/compose/ui/ui/src/skikoMain/kotlin/androidx/compose/ui/platform/SkiaBasedOwner.skiko.kt b/compose/ui/ui/src/skikoMain/kotlin/androidx/compose/ui/platform/SkiaBasedOwner.skiko.kt
index 8fd5dc0..16c72f3 100644
--- a/compose/ui/ui/src/skikoMain/kotlin/androidx/compose/ui/platform/SkiaBasedOwner.skiko.kt
+++ b/compose/ui/ui/src/skikoMain/kotlin/androidx/compose/ui/platform/SkiaBasedOwner.skiko.kt
@@ -94,11 +94,7 @@
 
 private typealias Command = () -> Unit
 
-@OptIn(
-    ExperimentalComposeUiApi::class,
-    InternalCoreApi::class,
-    InternalComposeUiApi::class
-)
+@OptIn(ExperimentalComposeUiApi::class, InternalCoreApi::class, InternalComposeUiApi::class)
 internal class SkiaBasedOwner(
     private val platformInputService: PlatformInput,
     private val component: PlatformComponent,
@@ -130,24 +126,26 @@
     private val rootSemanticsNode = EmptySemanticsModifier()
     private val semanticsModifier = EmptySemanticsElement(rootSemanticsNode)
 
-    override val focusOwner: FocusOwner = FocusOwnerImpl(
-        onRequestApplyChangesListener = ::registerOnEndApplyChangesListener,
-        onRequestFocusForOwner = { _, _ -> true }, // TODO request focus from framework.
-        onMoveFocusInterop = { _ -> true },
-        onClearFocusForOwner = {}, // TODO clear focus from framework.
-        onFocusRectInterop = { null },
-        onLayoutDirection = { layoutDirection } // TODO(demin): RTL [onRtlPropertiesChanged].
-    )
+    override val focusOwner: FocusOwner =
+        FocusOwnerImpl(
+            onRequestApplyChangesListener = ::registerOnEndApplyChangesListener,
+            onRequestFocusForOwner = { _, _ -> true }, // TODO request focus from framework.
+            onMoveFocusInterop = { _ -> true },
+            onClearFocusForOwner = {}, // TODO clear focus from framework.
+            onFocusRectInterop = { null },
+            onLayoutDirection = { layoutDirection } // TODO(demin): RTL [onRtlPropertiesChanged].
+        )
 
     // TODO: Set the input mode. For now we don't support touch mode, (always in Key mode).
-    private val _inputModeManager = InputModeManagerImpl(
-        initialInputMode = Keyboard,
-        onRequestInputModeChange = {
-            // TODO: Change the input mode programmatically. For now we just return true if the
-            //  requested input mode is Keyboard mode.
-            it == Keyboard
-        }
-    )
+    private val _inputModeManager =
+        InputModeManagerImpl(
+            initialInputMode = Keyboard,
+            onRequestInputModeChange = {
+                // TODO: Change the input mode programmatically. For now we just return true if the
+                //  requested input mode is Keyboard mode.
+                it == Keyboard
+            }
+        )
     override val inputModeManager: InputModeManager
         get() = _inputModeManager
 
@@ -160,13 +158,14 @@
 
     // TODO(b/177931787) : Consider creating a KeyInputManager like we have for FocusManager so
     //  that this common logic can be used by all owners.
-    private val keyInputModifier = Modifier.onKeyEvent {
-        val focusDirection = getFocusDirection(it)
-        if (focusDirection == null || it.type != KeyDown) return@onKeyEvent false
+    private val keyInputModifier =
+        Modifier.onKeyEvent {
+            val focusDirection = getFocusDirection(it)
+            if (focusDirection == null || it.type != KeyDown) return@onKeyEvent false
 
-        // Consume the key event if we moved focus.
-        focusOwner.moveFocus(focusDirection)
-    }
+            // Consume the key event if we moved focus.
+            focusOwner.moveFocus(focusDirection)
+        }
 
     @Suppress("unused") // to be used in JB fork (not all prerequisite changes added yet)
     internal fun setCurrentKeyboardModifiers(modifiers: PointerKeyboardModifiers) {
@@ -178,21 +177,24 @@
             field = value
 
             if (!isPopup) {
-                this.bounds = IntRect(
-                    IntOffset(bounds.left, bounds.top),
-                    IntSize(constraints.maxWidth, constraints.maxHeight)
-                )
+                this.bounds =
+                    IntRect(
+                        IntOffset(bounds.left, bounds.top),
+                        IntSize(constraints.maxWidth, constraints.maxHeight)
+                    )
             }
         }
 
-    override val root = LayoutNode().also {
-        it.measurePolicy = RootMeasurePolicy
-        it.modifier = semanticsModifier
-            .then(focusOwner.modifier)
-            .then(keyInputModifier)
-            .onPreviewKeyEvent(onPreviewKeyEvent)
-            .onKeyEvent(onKeyEvent)
-    }
+    override val root =
+        LayoutNode().also {
+            it.measurePolicy = RootMeasurePolicy
+            it.modifier =
+                semanticsModifier
+                    .then(focusOwner.modifier)
+                    .then(keyInputModifier)
+                    .onPreviewKeyEvent(onPreviewKeyEvent)
+                    .onKeyEvent(onKeyEvent)
+        }
 
     override val rootForTest = this
 
@@ -240,13 +242,16 @@
 
     override val semanticsOwner: SemanticsOwner = SemanticsOwner(root, rootSemanticsNode)
 
-    override val dragAndDropManager: DragAndDropManager get() = TODO("Not yet implemented")
+    override val dragAndDropManager: DragAndDropManager
+        get() = TODO("Not yet implemented")
 
     override val autofillTree = AutofillTree()
 
-    override val autofill: Autofill? get() = null
+    override val autofill: Autofill?
+        get() = null
 
-    override val semanticAutofill: SemanticAutofill? get() = null
+    override val semanticAutofill: SemanticAutofill?
+        get() = null
 
     override val viewConfiguration: ViewConfiguration = DefaultViewConfiguration(density)
 
@@ -265,12 +270,15 @@
         needClearObservations = true
     }
 
-    override val measureIteration: Long get() = measureAndLayoutDelegate.measureIteration
+    override val measureIteration: Long
+        get() = measureAndLayoutDelegate.measureIteration
 
     private var needLayout = true
     private var needDraw = true
 
-    val needRender get() = needLayout || needDraw || needSendSyntheticEvents
+    val needRender
+        get() = needLayout || needDraw || needSendSyntheticEvents
+
     var onNeedRender: (() -> Unit)? = null
     var onDispatchCommand: ((Command) -> Unit)? = null
 
@@ -320,10 +328,11 @@
         measureAndLayoutDelegate.dispatchOnPositionedCallbacks()
 
         // Don't use mainOwner.root.width here, as it strictly coerced by [constraints]
-        contentSize = IntSize(
-            root.children.maxOfOrNull { it.outerCoordinator.measuredWidth } ?: 0,
-            root.children.maxOfOrNull { it.outerCoordinator.measuredHeight } ?: 0,
-        )
+        contentSize =
+            IntSize(
+                root.children.maxOfOrNull { it.outerCoordinator.measuredWidth } ?: 0,
+                root.children.maxOfOrNull { it.outerCoordinator.measuredHeight } ?: 0,
+            )
     }
 
     override fun measureAndLayout(layoutNode: LayoutNode, constraints: Constraints) {
@@ -342,13 +351,15 @@
         scheduleMeasureAndLayout: Boolean
     ) {
         if (affectsLookahead) {
-            if (measureAndLayoutDelegate.requestLookaheadRemeasure(layoutNode, forceRequest) &&
-                scheduleMeasureAndLayout
+            if (
+                measureAndLayoutDelegate.requestLookaheadRemeasure(layoutNode, forceRequest) &&
+                    scheduleMeasureAndLayout
             ) {
                 requestLayout()
             }
-        } else if (measureAndLayoutDelegate.requestRemeasure(layoutNode, forceRequest) &&
-            scheduleMeasureAndLayout
+        } else if (
+            measureAndLayoutDelegate.requestRemeasure(layoutNode, forceRequest) &&
+                scheduleMeasureAndLayout
         ) {
             requestLayout()
         }
@@ -377,15 +388,16 @@
         drawBlock: (Canvas, GraphicsLayer?) -> Unit,
         invalidateParentLayer: () -> Unit,
         explicitLayer: GraphicsLayer?
-    ) = SkiaLayer(
-        density,
-        invalidateParentLayer = {
-            invalidateParentLayer()
-            requestDraw()
-        },
-        drawBlock = drawBlock,
-        onDestroy = { needClearObservations = true }
-    )
+    ) =
+        SkiaLayer(
+            density,
+            invalidateParentLayer = {
+                invalidateParentLayer()
+                requestDraw()
+            },
+            drawBlock = drawBlock,
+            onDestroy = { needClearObservations = true }
+        )
 
     override fun onSemanticsChange() {
         accessibilityController?.onSemanticsChange()
@@ -465,18 +477,21 @@
     }
 
     private fun doProcessPointerInput(event: PointerInputEvent): ProcessResult {
-        return pointerInputEventProcessor.process(
-            event,
-            this,
-            isInBounds = event.pointers.all {
-                it.position.x in 0f..root.width.toFloat() &&
-                    it.position.y in 0f..root.height.toFloat()
+        return pointerInputEventProcessor
+            .process(
+                event,
+                this,
+                isInBounds =
+                    event.pointers.all {
+                        it.position.x in 0f..root.width.toFloat() &&
+                            it.position.y in 0f..root.height.toFloat()
+                    }
+            )
+            .also {
+                if (it.dispatchedToAPointerInputModifier) {
+                    setPointerIcon(component, desiredPointerIcon)
+                }
             }
-        ).also {
-            if (it.dispatchedToAPointerInputModifier) {
-                setPointerIcon(component, desiredPointerIcon)
-            }
-        }
     }
 
     override fun processPointerInput(timeMillis: Long, pointers: List<TestPointerInputEventData>) {
diff --git a/compose/ui/ui/src/skikoMain/kotlin/androidx/compose/ui/platform/SkiaLayer.skiko.kt b/compose/ui/ui/src/skikoMain/kotlin/androidx/compose/ui/platform/SkiaLayer.skiko.kt
index b39d3ea..71cebf0 100644
--- a/compose/ui/ui/src/skikoMain/kotlin/androidx/compose/ui/platform/SkiaLayer.skiko.kt
+++ b/compose/ui/ui/src/skikoMain/kotlin/androidx/compose/ui/platform/SkiaLayer.skiko.kt
@@ -145,6 +145,7 @@
             matrix
         }
     }
+
     private var mutatedFields: Int = 0
 
     override fun updateLayerProperties(scope: ReusableGraphicsLayerScope) {
@@ -182,19 +183,16 @@
         val pivotY = transformOrigin.pivotFractionY * size.height
 
         matrix.reset()
-        matrix *= Matrix().apply {
-            translate(x = -pivotX, y = -pivotY)
-        }
-        matrix *= Matrix().apply {
-            translate(translationX, translationY)
-            rotateX(rotationX)
-            rotateY(rotationY)
-            rotateZ(rotationZ)
-            scale(scaleX, scaleY)
-        }
-        matrix *= Matrix().apply {
-            translate(x = pivotX, y = pivotY)
-        }
+        matrix *= Matrix().apply { translate(x = -pivotX, y = -pivotY) }
+        matrix *=
+            Matrix().apply {
+                translate(translationX, translationY)
+                rotateX(rotationX)
+                rotateY(rotationY)
+                rotateZ(rotationZ)
+                scale(scaleX, scaleY)
+            }
+        matrix *= Matrix().apply { translate(x = pivotX, y = pivotY) }
     }
 
     override fun invalidate() {
@@ -235,23 +233,24 @@
             }
 
             val outline = outline
-            val isClipping = if (clip && outline != null) {
-                canvas.save()
-                when (outline) {
-                    is Outline.Rectangle -> canvas.clipRect(outline.rect)
-                    is Outline.Rounded -> canvas.clipRoundRect(outline.roundRect)
-                    is Outline.Generic -> canvas.clipPath(outline.path)
+            val isClipping =
+                if (clip && outline != null) {
+                    canvas.save()
+                    when (outline) {
+                        is Outline.Rectangle -> canvas.clipRect(outline.rect)
+                        is Outline.Rounded -> canvas.clipRoundRect(outline.roundRect)
+                        is Outline.Generic -> canvas.clipPath(outline.path)
+                    }
+                    true
+                } else {
+                    false
                 }
-                true
-            } else {
-                false
-            }
 
             val currentRenderEffect = renderEffect
             val requiresLayer =
                 (alpha < 1 && compositingStrategy != CompositingStrategy.ModulateAlpha) ||
-                currentRenderEffect != null ||
-                compositingStrategy == CompositingStrategy.Offscreen
+                    currentRenderEffect != null ||
+                    compositingStrategy == CompositingStrategy.Offscreen
             if (requiresLayer) {
                 canvas.saveLayer(
                     bounds,
@@ -283,39 +282,47 @@
         nativeCanvas.clipRRect(rect.toSkiaRRect(), clipOp.toSkia(), antiAlias)
     }
 
-    private fun ClipOp.toSkia() = when (this) {
-        ClipOp.Difference -> ClipMode.DIFFERENCE
-        ClipOp.Intersect -> ClipMode.INTERSECT
-        else -> ClipMode.INTERSECT
-    }
+    private fun ClipOp.toSkia() =
+        when (this) {
+            ClipOp.Difference -> ClipMode.DIFFERENCE
+            ClipOp.Intersect -> ClipMode.INTERSECT
+            else -> ClipMode.INTERSECT
+        }
 
     override fun updateDisplayList() = Unit
 
-    fun drawShadow(canvas: Canvas) = with(density) {
-        val path = when (val outline = outline) {
-            is Outline.Rectangle -> Path().apply { addRect(outline.rect) }
-            is Outline.Rounded -> Path().apply { addRoundRect(outline.roundRect) }
-            is Outline.Generic -> outline.path
-            else -> return
+    fun drawShadow(canvas: Canvas) =
+        with(density) {
+            val path =
+                when (val outline = outline) {
+                    is Outline.Rectangle -> Path().apply { addRect(outline.rect) }
+                    is Outline.Rounded -> Path().apply { addRoundRect(outline.roundRect) }
+                    is Outline.Generic -> outline.path
+                    else -> return
+                }
+
+            // TODO: perspective?
+            val zParams = Point3(0f, 0f, shadowElevation)
+
+            // TODO: configurable?
+            val lightPos = Point3(0f, -300.dp.toPx(), 600.dp.toPx())
+            val lightRad = 800.dp.toPx()
+
+            val ambientAlpha = 0.039f * alpha
+            val spotAlpha = 0.19f * alpha
+            val ambientColor = ambientShadowColor.copy(alpha = ambientAlpha)
+            val spotColor = spotShadowColor.copy(alpha = spotAlpha)
+
+            ShadowUtils.drawShadow(
+                canvas.nativeCanvas,
+                path.asSkiaPath(),
+                zParams,
+                lightPos,
+                lightRad,
+                ambientColor.toArgb(),
+                spotColor.toArgb(),
+                alpha < 1f,
+                false
+            )
         }
-
-        // TODO: perspective?
-        val zParams = Point3(0f, 0f, shadowElevation)
-
-        // TODO: configurable?
-        val lightPos = Point3(0f, -300.dp.toPx(), 600.dp.toPx())
-        val lightRad = 800.dp.toPx()
-
-        val ambientAlpha = 0.039f * alpha
-        val spotAlpha = 0.19f * alpha
-        val ambientColor = ambientShadowColor.copy(alpha = ambientAlpha)
-        val spotColor = spotShadowColor.copy(alpha = spotAlpha)
-
-        ShadowUtils.drawShadow(
-            canvas.nativeCanvas, path.asSkiaPath(), zParams, lightPos,
-            lightRad,
-            ambientColor.toArgb(),
-            spotColor.toArgb(), alpha < 1f, false
-        )
-    }
 }
diff --git a/compose/ui/ui/src/skikoMain/kotlin/androidx/compose/ui/platform/SkiaRootForTest.skiko.kt b/compose/ui/ui/src/skikoMain/kotlin/androidx/compose/ui/platform/SkiaRootForTest.skiko.kt
index dc6f7f03..c2483e5 100644
--- a/compose/ui/ui/src/skikoMain/kotlin/androidx/compose/ui/platform/SkiaRootForTest.skiko.kt
+++ b/compose/ui/ui/src/skikoMain/kotlin/androidx/compose/ui/platform/SkiaRootForTest.skiko.kt
@@ -21,16 +21,15 @@
 import androidx.compose.ui.node.RootForTest
 
 /**
- * The marker interface to be implemented by the desktop root backing the composition.
- * To be used in tests.
+ * The marker interface to be implemented by the desktop root backing the composition. To be used in
+ * tests.
  */
 @InternalComposeUiApi
 interface SkiaRootForTest : RootForTest {
     /**
      * Process pointer event
      *
-     * [timeMillis] time when the pointer event occurred
-     * [pointers] state of all pointers
+     * [timeMillis] time when the pointer event occurred [pointers] state of all pointers
      */
     fun processPointerInput(timeMillis: Long, pointers: List<TestPointerInputEventData>)
 }
diff --git a/compose/ui/ui/src/skikoMain/kotlin/androidx/compose/ui/platform/Wrapper.skiko.kt b/compose/ui/ui/src/skikoMain/kotlin/androidx/compose/ui/platform/Wrapper.skiko.kt
index b7a724c..c20546a 100644
--- a/compose/ui/ui/src/skikoMain/kotlin/androidx/compose/ui/platform/Wrapper.skiko.kt
+++ b/compose/ui/ui/src/skikoMain/kotlin/androidx/compose/ui/platform/Wrapper.skiko.kt
@@ -26,8 +26,8 @@
 /**
  * Composes the given composable into [SkiaBasedOwner]
  *
- * @param parent The parent composition reference to coordinate scheduling of composition updates
- *        If null then default root composition will be used.
+ * @param parent The parent composition reference to coordinate scheduling of composition updates If
+ *   null then default root composition will be used.
  * @param content A `@Composable` function declaring the UI contents
  */
 @OptIn(ExperimentalComposeUiApi::class)
@@ -53,7 +53,4 @@
 internal actual fun createSubcomposition(
     container: LayoutNode,
     parent: CompositionContext
-): ReusableComposition = ReusableComposition(
-    DefaultUiApplier(container),
-    parent
-)
+): ReusableComposition = ReusableComposition(DefaultUiApplier(container), parent)
diff --git a/compose/ui/ui/src/skikoMain/kotlin/androidx/compose/ui/viewinterop/InteropViewFactoryHolder.skiko.kt b/compose/ui/ui/src/skikoMain/kotlin/androidx/compose/ui/viewinterop/InteropViewFactoryHolder.skiko.kt
index f7d278a..fcb8959 100644
--- a/compose/ui/ui/src/skikoMain/kotlin/androidx/compose/ui/viewinterop/InteropViewFactoryHolder.skiko.kt
+++ b/compose/ui/ui/src/skikoMain/kotlin/androidx/compose/ui/viewinterop/InteropViewFactoryHolder.skiko.kt
@@ -22,7 +22,8 @@
 // Skiko doesn't have an intrinsic interop view type, so satisfy the expect declaration with a
 // no-op and unusable type.
 @InternalComposeUiApi
-internal actual class InteropViewFactoryHolder private constructor(
+internal actual class InteropViewFactoryHolder
+private constructor(
     // No instances allowed.
 ) : ComposeNodeLifecycleCallback {
     init {
@@ -43,8 +44,9 @@
         throwUnsupportedError()
     }
 
-    private fun throwUnsupportedError(): Nothing = throw UnsupportedOperationException(
-        "InteropViewFactoryHolder cannot be used because " +
-            "interoperability views are not supported on this platform."
-    )
+    private fun throwUnsupportedError(): Nothing =
+        throw UnsupportedOperationException(
+            "InteropViewFactoryHolder cannot be used because " +
+                "interoperability views are not supported on this platform."
+        )
 }
diff --git a/compose/ui/ui/src/skikoMain/kotlin/androidx/compose/ui/window/Dialog.skiko.kt b/compose/ui/ui/src/skikoMain/kotlin/androidx/compose/ui/window/Dialog.skiko.kt
index 9bc95d4..a1954d1 100644
--- a/compose/ui/ui/src/skikoMain/kotlin/androidx/compose/ui/window/Dialog.skiko.kt
+++ b/compose/ui/ui/src/skikoMain/kotlin/androidx/compose/ui/window/Dialog.skiko.kt
@@ -39,9 +39,7 @@
 import androidx.compose.ui.unit.IntRect
 import androidx.compose.ui.unit.IntSize
 
-/**
- * The default scrim opacity.
- */
+/** The default scrim opacity. */
 private const val DefaultScrimOpacity = 0.6f
 private val DefaultScrimColor = Color.Black.copy(alpha = DefaultScrimOpacity)
 
@@ -49,20 +47,23 @@
  * Properties used to customize the behavior of a [Dialog].
  *
  * @property dismissOnBackPress whether the popup can be dismissed by pressing the back button
- *  * on Android or escape key on desktop.
- * If true, pressing the back button will call onDismissRequest.
+ *     * on Android or escape key on desktop. If true, pressing the back button will call
+ *       onDismissRequest.
+ *
  * @property dismissOnClickOutside whether the dialog can be dismissed by clicking outside the
- * dialog's bounds. If true, clicking outside the dialog will call onDismissRequest.
+ *   dialog's bounds. If true, clicking outside the dialog will call onDismissRequest.
  * @property usePlatformDefaultWidth Whether the width of the dialog's content should be limited to
- * the platform default, which is smaller than the screen width.
+ *   the platform default, which is smaller than the screen width.
  * @property usePlatformInsets Whether the size of the dialog's content should be limited by
- * platform insets.
+ *   platform insets.
  * @property useSoftwareKeyboardInset Whether the size of the dialog's content should be limited by
- * software keyboard inset.
+ *   software keyboard inset.
  * @property scrimColor Color of background fill.
  */
 @Immutable
-actual class DialogProperties @ExperimentalComposeUiApi constructor(
+actual class DialogProperties
+@ExperimentalComposeUiApi
+constructor(
     actual val dismissOnBackPress: Boolean = true,
     actual val dismissOnClickOutside: Boolean = true,
     actual val usePlatformDefaultWidth: Boolean = true,
@@ -118,9 +119,7 @@
 ) {
     DialogLayout(
         if (properties.dismissOnClickOutside) onDismissRequest else null,
-        modifier = Modifier.drawBehind {
-            drawRect(properties.scrimColor)
-        },
+        modifier = Modifier.drawBehind { drawRect(properties.scrimColor) },
         onPreviewKeyEvent = { false },
         onKeyEvent = {
             if (properties.dismissOnBackPress && it.isDismissRequest()) {
@@ -147,47 +146,52 @@
     val density = LocalDensity.current
 
     val parentComposition = rememberCompositionContext()
-    val (owner, composition) = remember {
-        val owner = SkiaBasedOwner(
-            platformInputService = scene.platformInputService,
-            component = scene.component,
-            density = density,
-            coroutineContext = parentComposition.effectCoroutineContext,
-            isPopup = true,
-            isFocusable = true,
-            onDismissRequest = onDismissRequest,
-            onPreviewKeyEvent = onPreviewKeyEvent ?: { false },
-            onKeyEvent = onKeyEvent ?: { false }
-        )
-        scene.attach(owner)
-        val composition = owner.setContent(parent = parentComposition) {
-            Layout(
-                content = content,
-                modifier = modifier,
-                measurePolicy = { measurables, constraints ->
-                    val width = constraints.maxWidth
-                    val height = constraints.maxHeight
+    val (owner, composition) =
+        remember {
+            val owner =
+                SkiaBasedOwner(
+                    platformInputService = scene.platformInputService,
+                    component = scene.component,
+                    density = density,
+                    coroutineContext = parentComposition.effectCoroutineContext,
+                    isPopup = true,
+                    isFocusable = true,
+                    onDismissRequest = onDismissRequest,
+                    onPreviewKeyEvent = onPreviewKeyEvent ?: { false },
+                    onKeyEvent = onKeyEvent ?: { false }
+                )
+            scene.attach(owner)
+            val composition =
+                owner.setContent(parent = parentComposition) {
+                    Layout(
+                        content = content,
+                        modifier = modifier,
+                        measurePolicy = { measurables, constraints ->
+                            val width = constraints.maxWidth
+                            val height = constraints.maxHeight
 
-                    layout(constraints.maxWidth, constraints.maxHeight) {
-                        measurables.forEach {
-                            val placeable = it.measure(constraints)
-                            val position = Alignment.Center.align(
-                                size = IntSize(placeable.width, placeable.height),
-                                space = IntSize(width, height),
-                                layoutDirection = layoutDirection
-                            )
-                            owner.bounds = IntRect(
-                                position,
-                                IntSize(placeable.width, placeable.height)
-                            )
-                            placeable.place(position.x, position.y)
+                            layout(constraints.maxWidth, constraints.maxHeight) {
+                                measurables.forEach {
+                                    val placeable = it.measure(constraints)
+                                    val position =
+                                        Alignment.Center.align(
+                                            size = IntSize(placeable.width, placeable.height),
+                                            space = IntSize(width, height),
+                                            layoutDirection = layoutDirection
+                                        )
+                                    owner.bounds =
+                                        IntRect(
+                                            position,
+                                            IntSize(placeable.width, placeable.height)
+                                        )
+                                    placeable.place(position.x, position.y)
+                                }
+                            }
                         }
-                    }
+                    )
                 }
-            )
+            owner to composition
         }
-        owner to composition
-    }
     owner.density = density
     DisposableEffect(Unit) {
         onDispose {
@@ -198,5 +202,4 @@
     }
 }
 
-private fun KeyEvent.isDismissRequest() =
-    type == KeyEventType.KeyDown && key == Key.Escape
+private fun KeyEvent.isDismissRequest() = type == KeyEventType.KeyDown && key == Key.Escape
diff --git a/compose/ui/ui/src/skikoMain/kotlin/androidx/compose/ui/window/Popup.skiko.kt b/compose/ui/ui/src/skikoMain/kotlin/androidx/compose/ui/window/Popup.skiko.kt
index 15b2c62..f87bd38 100644
--- a/compose/ui/ui/src/skikoMain/kotlin/androidx/compose/ui/window/Popup.skiko.kt
+++ b/compose/ui/ui/src/skikoMain/kotlin/androidx/compose/ui/window/Popup.skiko.kt
@@ -50,26 +50,26 @@
 /**
  * Properties used to customize the behavior of a [Popup].
  *
- * @property focusable Whether the popup is focusable. When true, the popup will receive IME
- * events and key presses, such as when the back button is pressed.
- * @property dismissOnBackPress Whether the popup can be dismissed by pressing the back button
- * on Android or escape key on desktop.
- * If true, pressing the back button will call onDismissRequest. Note that [focusable] must be
- * set to true in order to receive key events such as the back button - if the popup is not
- * focusable then this property does nothing.
+ * @property focusable Whether the popup is focusable. When true, the popup will receive IME events
+ *   and key presses, such as when the back button is pressed.
+ * @property dismissOnBackPress Whether the popup can be dismissed by pressing the back button on
+ *   Android or escape key on desktop. If true, pressing the back button will call onDismissRequest.
+ *   Note that [focusable] must be set to true in order to receive key events such as the back
+ *   button - if the popup is not focusable then this property does nothing.
  * @property dismissOnClickOutside Whether the popup can be dismissed by clicking outside the
- * popup's bounds. If true, clicking outside the popup will call onDismissRequest.
+ *   popup's bounds. If true, clicking outside the popup will call onDismissRequest.
  * @property clippingEnabled Whether to allow the popup window to extend beyond the bounds of the
- * screen. By default, the window is clipped to the screen boundaries. Setting this to false will
- * allow windows to be accurately positioned.
- * The default value is true.
+ *   screen. By default, the window is clipped to the screen boundaries. Setting this to false will
+ *   allow windows to be accurately positioned. The default value is true.
  * @property usePlatformDefaultWidth Whether the width of the popup's content should be limited to
- * the platform default, which is smaller than the screen width.
+ *   the platform default, which is smaller than the screen width.
  * @property usePlatformInsets Whether the width of the popup's content should be limited by
- * platform insets.
+ *   platform insets.
  */
 @Immutable
-actual class PopupProperties @ExperimentalComposeUiApi constructor(
+actual class PopupProperties
+@ExperimentalComposeUiApi
+constructor(
     actual val focusable: Boolean = false,
     actual val dismissOnBackPress: Boolean = true,
     actual val dismissOnClickOutside: Boolean = true,
@@ -121,32 +121,34 @@
 /**
  * Opens a popup with the given content.
  *
- * The popup is positioned relative to its parent, using the [alignment] and [offset].
- * The popup is visible as long as it is part of the composition hierarchy.
+ * The popup is positioned relative to its parent, using the [alignment] and [offset]. The popup is
+ * visible as long as it is part of the composition hierarchy.
  *
  * @sample androidx.compose.ui.samples.PopupSample
  *
  * @param alignment The alignment relative to the parent.
  * @param offset An offset from the original aligned position of the popup. Offset respects the
- * Ltr/Rtl context, thus in Ltr it will be added to the original aligned position and in Rtl it
- * will be subtracted from it.
+ *   Ltr/Rtl context, thus in Ltr it will be added to the original aligned position and in Rtl it
+ *   will be subtracted from it.
  * @param focusable Indicates if the popup can grab the focus.
  * @param onDismissRequest Executes when the user clicks outside of the popup.
  * @param onPreviewKeyEvent This callback is invoked when the user interacts with the hardware
- * keyboard. It gives ancestors of a focused component the chance to intercept a [KeyEvent].
- * Return true to stop propagation of this event. If you return false, the key event will be
- * sent to this [onPreviewKeyEvent]'s child. If none of the children consume the event,
- * it will be sent back up to the root using the onKeyEvent callback.
- * @param onKeyEvent This callback is invoked when the user interacts with the hardware
- * keyboard. While implementing this callback, return true to stop propagation of this event.
- * If you return false, the key event will be sent to this [onKeyEvent]'s parent.
+ *   keyboard. It gives ancestors of a focused component the chance to intercept a [KeyEvent].
+ *   Return true to stop propagation of this event. If you return false, the key event will be sent
+ *   to this [onPreviewKeyEvent]'s child. If none of the children consume the event, it will be sent
+ *   back up to the root using the onKeyEvent callback.
+ * @param onKeyEvent This callback is invoked when the user interacts with the hardware keyboard.
+ *   While implementing this callback, return true to stop propagation of this event. If you return
+ *   false, the key event will be sent to this [onKeyEvent]'s parent.
  * @param content The content to be displayed inside the popup.
  */
 @Deprecated(
     "Replaced by Popup with properties parameter",
-    ReplaceWith("Popup(alignment, offset, onDismissRequest, " +
-        "androidx.compose.ui.window.PopupProperties(focusable = focusable), " +
-        "onPreviewKeyEvent, onKeyEvent, content)")
+    ReplaceWith(
+        "Popup(alignment, offset, onDismissRequest, " +
+            "androidx.compose.ui.window.PopupProperties(focusable = focusable), " +
+            "onPreviewKeyEvent, onKeyEvent, content)"
+    )
 )
 @Composable
 fun Popup(
@@ -157,20 +159,21 @@
     onPreviewKeyEvent: ((KeyEvent) -> Boolean) = { false },
     onKeyEvent: ((KeyEvent) -> Boolean) = { false },
     content: @Composable () -> Unit
-) = Popup(
-    alignment = alignment,
-    offset = offset,
-    onDismissRequest = onDismissRequest,
-    properties = PopupProperties(
-        focusable = focusable,
-        dismissOnBackPress = true,
-        dismissOnClickOutside = focusable
-
-    ),
-    onPreviewKeyEvent = onPreviewKeyEvent,
-    onKeyEvent = onKeyEvent,
-    content = content
-)
+) =
+    Popup(
+        alignment = alignment,
+        offset = offset,
+        onDismissRequest = onDismissRequest,
+        properties =
+            PopupProperties(
+                focusable = focusable,
+                dismissOnBackPress = true,
+                dismissOnClickOutside = focusable
+            ),
+        onPreviewKeyEvent = onPreviewKeyEvent,
+        onKeyEvent = onKeyEvent,
+        content = content
+    )
 
 /**
  * Opens a popup with the given content.
@@ -183,20 +186,22 @@
  * @param onDismissRequest Executes when the user clicks outside of the popup.
  * @param focusable Indicates if the popup can grab the focus.
  * @param onPreviewKeyEvent This callback is invoked when the user interacts with the hardware
- * keyboard. It gives ancestors of a focused component the chance to intercept a [KeyEvent].
- * Return true to stop propagation of this event. If you return false, the key event will be
- * sent to this [onPreviewKeyEvent]'s child. If none of the children consume the event,
- * it will be sent back up to the root using the onKeyEvent callback.
- * @param onKeyEvent This callback is invoked when the user interacts with the hardware
- * keyboard. While implementing this callback, return true to stop propagation of this event.
- * If you return false, the key event will be sent to this [onKeyEvent]'s parent.
+ *   keyboard. It gives ancestors of a focused component the chance to intercept a [KeyEvent].
+ *   Return true to stop propagation of this event. If you return false, the key event will be sent
+ *   to this [onPreviewKeyEvent]'s child. If none of the children consume the event, it will be sent
+ *   back up to the root using the onKeyEvent callback.
+ * @param onKeyEvent This callback is invoked when the user interacts with the hardware keyboard.
+ *   While implementing this callback, return true to stop propagation of this event. If you return
+ *   false, the key event will be sent to this [onKeyEvent]'s parent.
  * @param content The content to be displayed inside the popup.
  */
 @Deprecated(
     "Replaced by Popup with properties parameter",
-    ReplaceWith("Popup(popupPositionProvider, onDismissRequest, " +
-        "androidx.compose.ui.window.PopupProperties(focusable = focusable), " +
-        "onPreviewKeyEvent, onKeyEvent, content)")
+    ReplaceWith(
+        "Popup(popupPositionProvider, onDismissRequest, " +
+            "androidx.compose.ui.window.PopupProperties(focusable = focusable), " +
+            "onPreviewKeyEvent, onKeyEvent, content)"
+    )
 )
 @Composable
 fun Popup(
@@ -206,36 +211,37 @@
     onKeyEvent: ((KeyEvent) -> Boolean) = { false },
     focusable: Boolean = false,
     content: @Composable () -> Unit
-) = Popup(
-    popupPositionProvider = popupPositionProvider,
-    onDismissRequest = onDismissRequest,
-    properties = PopupProperties(
-        focusable = focusable,
-        dismissOnBackPress = true,
-        dismissOnClickOutside = focusable
-
-    ),
-    onPreviewKeyEvent = onPreviewKeyEvent,
-    onKeyEvent = onKeyEvent,
-    content = content
-)
+) =
+    Popup(
+        popupPositionProvider = popupPositionProvider,
+        onDismissRequest = onDismissRequest,
+        properties =
+            PopupProperties(
+                focusable = focusable,
+                dismissOnBackPress = true,
+                dismissOnClickOutside = focusable
+            ),
+        onPreviewKeyEvent = onPreviewKeyEvent,
+        onKeyEvent = onKeyEvent,
+        content = content
+    )
 
 /**
  * Opens a popup with the given content.
  *
- * A popup is a floating container that appears on top of the current activity.
- * It is especially useful for non-modal UI surfaces that remain hidden until they
- * are needed, for example floating menus like Cut/Copy/Paste.
+ * A popup is a floating container that appears on top of the current activity. It is especially
+ * useful for non-modal UI surfaces that remain hidden until they are needed, for example floating
+ * menus like Cut/Copy/Paste.
  *
- * The popup is positioned relative to its parent, using the [alignment] and [offset].
- * The popup is visible as long as it is part of the composition hierarchy.
+ * The popup is positioned relative to its parent, using the [alignment] and [offset]. The popup is
+ * visible as long as it is part of the composition hierarchy.
  *
  * @sample androidx.compose.ui.samples.PopupSample
  *
  * @param alignment The alignment relative to the parent.
  * @param offset An offset from the original aligned position of the popup. Offset respects the
- * Ltr/Rtl context, thus in Ltr it will be added to the original aligned position and in Rtl it
- * will be subtracted from it.
+ *   Ltr/Rtl context, thus in Ltr it will be added to the original aligned position and in Rtl it
+ *   will be subtracted from it.
  * @param onDismissRequest Executes when the user clicks outside of the popup.
  * @param properties [PopupProperties] for further customization of this popup's behavior.
  * @param content The content to be displayed inside the popup.
@@ -247,15 +253,16 @@
     onDismissRequest: (() -> Unit)?,
     properties: PopupProperties,
     content: @Composable () -> Unit
-): Unit = Popup(
-    alignment = alignment,
-    offset = offset,
-    onDismissRequest = onDismissRequest,
-    properties = properties,
-    onPreviewKeyEvent = null,
-    onKeyEvent = null,
-    content = content
-)
+): Unit =
+    Popup(
+        alignment = alignment,
+        offset = offset,
+        onDismissRequest = onDismissRequest,
+        properties = properties,
+        onPreviewKeyEvent = null,
+        onKeyEvent = null,
+        content = content
+    )
 
 /**
  * Opens a popup with the given content.
@@ -275,41 +282,42 @@
     onDismissRequest: (() -> Unit)?,
     properties: PopupProperties,
     content: @Composable () -> Unit
-): Unit = Popup(
-    popupPositionProvider = popupPositionProvider,
-    onDismissRequest = onDismissRequest,
-    properties = properties,
-    onPreviewKeyEvent = null,
-    onKeyEvent = null,
-    content = content
-)
+): Unit =
+    Popup(
+        popupPositionProvider = popupPositionProvider,
+        onDismissRequest = onDismissRequest,
+        properties = properties,
+        onPreviewKeyEvent = null,
+        onKeyEvent = null,
+        content = content
+    )
 
 /**
  * Opens a popup with the given content.
  *
- * A popup is a floating container that appears on top of the current activity.
- * It is especially useful for non-modal UI surfaces that remain hidden until they
- * are needed, for example floating menus like Cut/Copy/Paste.
+ * A popup is a floating container that appears on top of the current activity. It is especially
+ * useful for non-modal UI surfaces that remain hidden until they are needed, for example floating
+ * menus like Cut/Copy/Paste.
  *
- * The popup is positioned relative to its parent, using the [alignment] and [offset].
- * The popup is visible as long as it is part of the composition hierarchy.
+ * The popup is positioned relative to its parent, using the [alignment] and [offset]. The popup is
+ * visible as long as it is part of the composition hierarchy.
  *
  * @sample androidx.compose.ui.samples.PopupSample
  *
  * @param alignment The alignment relative to the parent.
  * @param offset An offset from the original aligned position of the popup. Offset respects the
- * Ltr/Rtl context, thus in Ltr it will be added to the original aligned position and in Rtl it
- * will be subtracted from it.
+ *   Ltr/Rtl context, thus in Ltr it will be added to the original aligned position and in Rtl it
+ *   will be subtracted from it.
  * @param onDismissRequest Executes when the user clicks outside of the popup.
  * @param properties [PopupProperties] for further customization of this popup's behavior.
  * @param onPreviewKeyEvent This callback is invoked when the user interacts with the hardware
- * keyboard. It gives ancestors of a focused component the chance to intercept a [KeyEvent].
- * Return true to stop propagation of this event. If you return false, the key event will be
- * sent to this [onPreviewKeyEvent]'s child. If none of the children consume the event,
- * it will be sent back up to the root using the onKeyEvent callback.
- * @param onKeyEvent This callback is invoked when the user interacts with the hardware
- * keyboard. While implementing this callback, return true to stop propagation of this event.
- * If you return false, the key event will be sent to this [onKeyEvent]'s parent.
+ *   keyboard. It gives ancestors of a focused component the chance to intercept a [KeyEvent].
+ *   Return true to stop propagation of this event. If you return false, the key event will be sent
+ *   to this [onPreviewKeyEvent]'s child. If none of the children consume the event, it will be sent
+ *   back up to the root using the onKeyEvent callback.
+ * @param onKeyEvent This callback is invoked when the user interacts with the hardware keyboard.
+ *   While implementing this callback, return true to stop propagation of this event. If you return
+ *   false, the key event will be sent to this [onKeyEvent]'s parent.
  * @param content The content to be displayed inside the popup.
  */
 @Composable
@@ -322,9 +330,8 @@
     onKeyEvent: ((KeyEvent) -> Boolean)? = null,
     content: @Composable () -> Unit
 ) {
-    val popupPositioner = remember(alignment, offset) {
-        AlignmentOffsetPositionProvider(alignment, offset)
-    }
+    val popupPositioner =
+        remember(alignment, offset) { AlignmentOffsetPositionProvider(alignment, offset) }
     Popup(
         popupPositionProvider = popupPositioner,
         onDismissRequest = onDismissRequest,
@@ -346,13 +353,13 @@
  * @param onDismissRequest Executes when the user clicks outside of the popup.
  * @param properties [PopupProperties] for further customization of this popup's behavior.
  * @param onPreviewKeyEvent This callback is invoked when the user interacts with the hardware
- * keyboard. It gives ancestors of a focused component the chance to intercept a [KeyEvent].
- * Return true to stop propagation of this event. If you return false, the key event will be
- * sent to this [onPreviewKeyEvent]'s child. If none of the children consume the event,
- * it will be sent back up to the root using the onKeyEvent callback.
- * @param onKeyEvent This callback is invoked when the user interacts with the hardware
- * keyboard. While implementing this callback, return true to stop propagation of this event.
- * If you return false, the key event will be sent to this [onKeyEvent]'s parent.
+ *   keyboard. It gives ancestors of a focused component the chance to intercept a [KeyEvent].
+ *   Return true to stop propagation of this event. If you return false, the key event will be sent
+ *   to this [onPreviewKeyEvent]'s child. If none of the children consume the event, it will be sent
+ *   back up to the root using the onKeyEvent callback.
+ * @param onKeyEvent This callback is invoked when the user interacts with the hardware keyboard.
+ *   While implementing this callback, return true to stop propagation of this event. If you return
+ *   false, the key event will be sent to this [onKeyEvent]'s parent.
  * @param content The content to be displayed inside the popup.
  */
 @Composable
@@ -367,20 +374,21 @@
     val currentOnDismissRequest by rememberUpdatedState(onDismissRequest)
     val currentOnKeyEvent by rememberUpdatedState(onKeyEvent)
 
-    val overriddenOnKeyEvent = if (properties.dismissOnBackPress && onDismissRequest != null) {
-        // No need to remember this lambda, as it doesn't capture any values that can change.
-        { event: KeyEvent ->
-            val consumed = currentOnKeyEvent?.invoke(event) ?: false
-            if (!consumed && event.isDismissRequest()) {
-                currentOnDismissRequest?.invoke()
-                true
-            } else {
-                consumed
+    val overriddenOnKeyEvent =
+        if (properties.dismissOnBackPress && onDismissRequest != null) {
+            // No need to remember this lambda, as it doesn't capture any values that can change.
+            { event: KeyEvent ->
+                val consumed = currentOnKeyEvent?.invoke(event) ?: false
+                if (!consumed && event.isDismissRequest()) {
+                    currentOnDismissRequest?.invoke()
+                    true
+                } else {
+                    consumed
+                }
             }
+        } else {
+            onKeyEvent
         }
-    } else {
-        onKeyEvent
-    }
     PopupLayout(
         popupPositionProvider = popupPositionProvider,
         focusable = properties.focusable,
@@ -412,63 +420,66 @@
     // getting parent bounds
     Layout(
         content = {},
-        modifier = Modifier.onGloballyPositioned { childCoordinates ->
-            val coordinates = childCoordinates.parentCoordinates!!
-            parentBounds = IntRect(
-                coordinates.localToWindow(Offset.Zero).round(),
-                coordinates.size
-            )
-        },
-        measurePolicy = { _, _ ->
-            layout(0, 0) {}
-        }
+        modifier =
+            Modifier.onGloballyPositioned { childCoordinates ->
+                val coordinates = childCoordinates.parentCoordinates!!
+                parentBounds =
+                    IntRect(coordinates.localToWindow(Offset.Zero).round(), coordinates.size)
+            },
+        measurePolicy = { _, _ -> layout(0, 0) {} }
     )
 
     val parentComposition = rememberCompositionContext()
-    val (owner, composition) = remember {
-        val owner = SkiaBasedOwner(
-            platformInputService = scene.platformInputService,
-            component = scene.component,
-            density = density,
-            coroutineContext = parentComposition.effectCoroutineContext,
-            isPopup = true,
-            isFocusable = focusable,
-            onDismissRequest = onDismissRequest,
-            onPreviewKeyEvent = onPreviewKeyEvent ?: { false },
-            onKeyEvent = onKeyEvent ?: { false }
-        )
-        scene.attach(owner)
-        val composition = owner.setContent(parent = parentComposition) {
-            Layout(
-                content = content,
-                modifier = modifier,
-                measurePolicy = { measurables, constraints ->
-                    val width = constraints.maxWidth
-                    val height = constraints.maxHeight
+    val (owner, composition) =
+        remember {
+            val owner =
+                SkiaBasedOwner(
+                    platformInputService = scene.platformInputService,
+                    component = scene.component,
+                    density = density,
+                    coroutineContext = parentComposition.effectCoroutineContext,
+                    isPopup = true,
+                    isFocusable = focusable,
+                    onDismissRequest = onDismissRequest,
+                    onPreviewKeyEvent = onPreviewKeyEvent ?: { false },
+                    onKeyEvent = onKeyEvent ?: { false }
+                )
+            scene.attach(owner)
+            val composition =
+                owner.setContent(parent = parentComposition) {
+                    Layout(
+                        content = content,
+                        modifier = modifier,
+                        measurePolicy = { measurables, constraints ->
+                            val width = constraints.maxWidth
+                            val height = constraints.maxHeight
 
-                    layout(constraints.maxWidth, constraints.maxHeight) {
-                        measurables.forEach {
-                            val placeable = it.measure(constraints)
-                            val position = popupPositionProvider.calculatePosition(
-                                anchorBounds = parentBounds,
-                                windowSize = IntSize(width, height),
-                                layoutDirection = layoutDirection,
-                                popupContentSize = IntSize(placeable.width, placeable.height)
-                            )
+                            layout(constraints.maxWidth, constraints.maxHeight) {
+                                measurables.forEach {
+                                    val placeable = it.measure(constraints)
+                                    val position =
+                                        popupPositionProvider.calculatePosition(
+                                            anchorBounds = parentBounds,
+                                            windowSize = IntSize(width, height),
+                                            layoutDirection = layoutDirection,
+                                            popupContentSize =
+                                                IntSize(placeable.width, placeable.height)
+                                        )
 
-                            popupBounds = IntRect(
-                                position,
-                                IntSize(placeable.width, placeable.height)
-                            )
-                            owner.bounds = popupBounds
-                            placeable.place(position.x, position.y)
+                                    popupBounds =
+                                        IntRect(
+                                            position,
+                                            IntSize(placeable.width, placeable.height)
+                                        )
+                                    owner.bounds = popupBounds
+                                    placeable.place(position.x, position.y)
+                                }
+                            }
                         }
-                    }
+                    )
                 }
-            )
+            owner to composition
         }
-        owner to composition
-    }
     owner.density = density
     DisposableEffect(Unit) {
         onDispose {
@@ -479,5 +490,4 @@
     }
 }
 
-private fun KeyEvent.isDismissRequest() =
-    type == KeyEventType.KeyDown && key == Key.Escape
+private fun KeyEvent.isDismissRequest() = type == KeyEventType.KeyDown && key == Key.Escape
diff --git a/gradle.properties b/gradle.properties
index 2f33e08..92d30ba 100644
--- a/gradle.properties
+++ b/gradle.properties
@@ -48,7 +48,7 @@
 androidx.unpinComposeCompiler=false
 
 # Prefix of projects that are opted-in to use ktfmt
-androidx.ktfmt.optin=:a,:b,:ca,:col,:con,:cor,:cu,:d,:e,:f,:g,:h,:i,:j,:k,:l,:n,:p,:s,:t,:v,:we,:wo,:res,:ro
+androidx.ktfmt.optin=:a,:b,:ca,:co,:cu,:d,:e,:f,:g,:h,:i,:j,:k,:l,:n,:p,:s,:t,:v,:we,:wo,:res,:ro
 # Disable features we do not use
 android.defaults.buildfeatures.aidl=false
 android.defaults.buildfeatures.buildconfig=false
